commit 7e711931cb88ac0795b67693a0eb5dbff8558f2c Author: FabioMich66 Date: Mon Jul 6 14:52:45 2026 +0200 first commit diff --git a/.flutter-plugins-dependencies b/.flutter-plugins-dependencies new file mode 100644 index 0000000..5ec777a --- /dev/null +++ b/.flutter-plugins-dependencies @@ -0,0 +1 @@ +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"connectivity_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"dchs_motion_sensors","path":"/Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"device_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_core","path":"/Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_crashlytics","path":"/Users/fabio/.pub-cache/hosted/pub.dev/firebase_crashlytics-5.2.0/","native_build":true,"dependencies":["firebase_core"],"dev_dependency":false},{"name":"flutter_secure_storage","path":"/Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"google_maps_flutter_ios","path":"/Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_ios-2.17.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"local_auth_darwin","path":"/Users/fabio/.pub-cache/hosted/pub.dev/local_auth_darwin-2.0.1/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/","native_build":true,"dependencies":["wakelock_plus"],"dev_dependency":false},{"name":"network_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/Users/fabio/.pub-cache/hosted/pub.dev/path_provider_foundation-2.5.1/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"permission_handler_apple","path":"/Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_apple-9.4.7/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"printing","path":"/Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"screen_brightness_ios","path":"/Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_ios-2.1.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"sqflite_darwin","path":"/Users/fabio/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"streams_channel","path":"/Users/fabio/.pub-cache/git/aves_streams_channel-35a9b0fcc0e97f756756c0010fb223129c2d832c/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_ios","path":"/Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.6/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"video_player_avfoundation","path":"/Users/fabio/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.8.9/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"volume_controller","path":"/Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false}],"android":[{"name":"aves_screen_state","path":"/Volumes/terrain/aves_mio100/plugins/aves_screen_state/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"connectivity_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"dchs_motion_sensors","path":"/Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"device_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"dynamic_color","path":"/Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_core","path":"/Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_crashlytics","path":"/Users/fabio/.pub-cache/hosted/pub.dev/firebase_crashlytics-5.2.0/","native_build":true,"dependencies":["firebase_core"],"dev_dependency":false},{"name":"floating","path":"/Users/fabio/.pub-cache/hosted/pub.dev/floating-6.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_displaymode","path":"/Users/fabio/.pub-cache/hosted/pub.dev/flutter_displaymode-0.7.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_plugin_android_lifecycle","path":"/Users/fabio/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.34/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage","path":"/Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"google_api_availability_android","path":"/Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability_android-1.1.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"google_cast","path":"/Volumes/terrain/aves_mio100/plugins/google_cast/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"google_maps_flutter_android","path":"/Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_android-2.19.8/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"],"dev_dependency":false},{"name":"jni","path":"/Users/fabio/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni_flutter","path":"/Users/fabio/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/","native_build":true,"dependencies":["jni"],"dev_dependency":false},{"name":"local_auth_android","path":"/Users/fabio/.pub-cache/hosted/pub.dev/local_auth_android-2.0.8/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"],"dev_dependency":false},{"name":"media_kit_libs_android_video","path":"/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/","native_build":true,"dependencies":["wakelock_plus"],"dev_dependency":false},{"name":"network_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_android","path":"/Users/fabio/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/","native_build":false,"dependencies":["jni","jni_flutter"],"dev_dependency":false},{"name":"permission_handler_android","path":"/Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_android-13.0.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"printing","path":"/Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"screen_brightness_android","path":"/Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_android","path":"/Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.18/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"sqflite_android","path":"/Users/fabio/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"streams_channel","path":"/Users/fabio/.pub-cache/git/aves_streams_channel-35a9b0fcc0e97f756756c0010fb223129c2d832c/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_android","path":"/Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.29/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"video_player_android","path":"/Users/fabio/.pub-cache/hosted/pub.dev/video_player_android-2.9.5/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"volume_controller","path":"/Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false}],"macos":[{"name":"connectivity_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"device_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"dynamic_color","path":"/Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_core","path":"/Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_crashlytics","path":"/Users/fabio/.pub-cache/hosted/pub.dev/firebase_crashlytics-5.2.0/","native_build":true,"dependencies":["firebase_core"],"dev_dependency":false},{"name":"flutter_secure_storage_macos","path":"/Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_macos-3.1.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"local_auth_darwin","path":"/Users/fabio/.pub-cache/hosted/pub.dev/local_auth_darwin-2.0.1/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/","native_build":true,"dependencies":["wakelock_plus"],"dev_dependency":false},{"name":"network_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/Users/fabio/.pub-cache/hosted/pub.dev/path_provider_foundation-2.5.1/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"printing","path":"/Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"screen_brightness_macos","path":"/Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_macos-2.1.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"sqflite_darwin","path":"/Users/fabio/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"url_launcher_macos","path":"/Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.5/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"video_player_avfoundation","path":"/Users/fabio/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.8.9/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"volume_controller","path":"/Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false}],"linux":[{"name":"connectivity_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"device_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"dynamic_color","path":"/Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage_linux","path":"/Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_linux-1.2.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni","path":"/Users/fabio/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/","native_build":true,"dependencies":["wakelock_plus"],"dev_dependency":false},{"name":"network_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"path_provider_linux","path":"/Users/fabio/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"printing","path":"/Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_linux","path":"/Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/","native_build":false,"dependencies":["path_provider_linux"],"dev_dependency":false},{"name":"url_launcher_linux","path":"/Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"volume_controller","path":"/Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/","native_build":false,"dependencies":["package_info_plus"],"dev_dependency":false}],"windows":[{"name":"connectivity_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"device_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"dynamic_color","path":"/Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"firebase_core","path":"/Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage_windows","path":"/Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_windows-3.1.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni","path":"/Users/fabio/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"local_auth_windows","path":"/Users/fabio/.pub-cache/hosted/pub.dev/local_auth_windows-2.0.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/","native_build":true,"dependencies":["wakelock_plus"],"dev_dependency":false},{"name":"network_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"path_provider_windows","path":"/Users/fabio/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"permission_handler_windows","path":"/Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_windows-0.2.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"printing","path":"/Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"screen_brightness_windows","path":"/Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_windows-2.1.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_windows","path":"/Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/","native_build":false,"dependencies":["path_provider_windows"],"dev_dependency":false},{"name":"url_launcher_windows","path":"/Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.5/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"volume_controller","path":"/Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/","native_build":false,"dependencies":["package_info_plus"],"dev_dependency":false}],"web":[{"name":"connectivity_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/","dependencies":[],"dev_dependency":false},{"name":"device_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/","dependencies":[],"dev_dependency":false},{"name":"firebase_core_web","path":"/Users/fabio/.pub-cache/hosted/pub.dev/firebase_core_web-3.6.0/","dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage_web","path":"/Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_web-1.2.1/","dependencies":[],"dev_dependency":false},{"name":"google_maps_flutter_web","path":"/Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_web-0.5.14+3/","dependencies":[],"dev_dependency":false},{"name":"network_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/","dependencies":[],"dev_dependency":false},{"name":"package_info_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/","dependencies":[],"dev_dependency":false},{"name":"permission_handler_html","path":"/Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_html-0.1.3+5/","dependencies":[],"dev_dependency":false},{"name":"printing","path":"/Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/","dependencies":[],"dev_dependency":false},{"name":"shared_preferences_web","path":"/Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3/","dependencies":[],"dev_dependency":false},{"name":"url_launcher_web","path":"/Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_web-2.4.1/","dependencies":[],"dev_dependency":false},{"name":"video_player_web","path":"/Users/fabio/.pub-cache/hosted/pub.dev/video_player_web-2.4.0/","dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/","dependencies":["package_info_plus"],"dev_dependency":false}]},"dependencyGraph":[{"name":"aves_screen_state","dependencies":[]},{"name":"connectivity_plus","dependencies":[]},{"name":"dchs_motion_sensors","dependencies":[]},{"name":"device_info_plus","dependencies":[]},{"name":"dynamic_color","dependencies":[]},{"name":"firebase_core","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","dependencies":[]},{"name":"firebase_crashlytics","dependencies":["firebase_core"]},{"name":"floating","dependencies":[]},{"name":"flutter_displaymode","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"flutter_secure_storage","dependencies":["flutter_secure_storage_linux","flutter_secure_storage_macos","flutter_secure_storage_web","flutter_secure_storage_windows"]},{"name":"flutter_secure_storage_linux","dependencies":[]},{"name":"flutter_secure_storage_macos","dependencies":[]},{"name":"flutter_secure_storage_web","dependencies":[]},{"name":"flutter_secure_storage_windows","dependencies":["path_provider"]},{"name":"google_api_availability","dependencies":["google_api_availability_android"]},{"name":"google_api_availability_android","dependencies":[]},{"name":"google_cast","dependencies":[]},{"name":"google_maps_flutter","dependencies":["google_maps_flutter_android","google_maps_flutter_ios","google_maps_flutter_web"]},{"name":"google_maps_flutter_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"google_maps_flutter_ios","dependencies":[]},{"name":"google_maps_flutter_web","dependencies":[]},{"name":"jni","dependencies":[]},{"name":"jni_flutter","dependencies":["jni"]},{"name":"local_auth","dependencies":["local_auth_android","local_auth_darwin","local_auth_windows"]},{"name":"local_auth_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"local_auth_darwin","dependencies":[]},{"name":"local_auth_windows","dependencies":[]},{"name":"media_kit_libs_android_video","dependencies":[]},{"name":"media_kit_video","dependencies":["wakelock_plus"]},{"name":"network_info_plus","dependencies":[]},{"name":"package_info_plus","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":["jni","jni_flutter"]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_html","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_html","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]},{"name":"printing","dependencies":[]},{"name":"screen_brightness","dependencies":["screen_brightness_android","screen_brightness_ios","screen_brightness_macos","screen_brightness_windows","screen_brightness_ohos"]},{"name":"screen_brightness_android","dependencies":[]},{"name":"screen_brightness_ios","dependencies":[]},{"name":"screen_brightness_macos","dependencies":[]},{"name":"screen_brightness_ohos","dependencies":[]},{"name":"screen_brightness_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_linux","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]},{"name":"sqflite","dependencies":["sqflite_android","sqflite_darwin"]},{"name":"sqflite_android","dependencies":[]},{"name":"sqflite_darwin","dependencies":[]},{"name":"streams_channel","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]},{"name":"video_player","dependencies":["video_player_android","video_player_avfoundation","video_player_web"]},{"name":"video_player_android","dependencies":[]},{"name":"video_player_avfoundation","dependencies":[]},{"name":"video_player_web","dependencies":[]},{"name":"volume_controller","dependencies":[]},{"name":"wakelock_plus","dependencies":["package_info_plus"]}],"date_created":"2026-07-06 11:22:02.673533","version":"3.35.7","swift_package_manager_enabled":{"ios":false,"macos":false}} \ No newline at end of file diff --git a/.fvmrc b/.fvmrc new file mode 100644 index 0000000..e8b4151 --- /dev/null +++ b/.fvmrc @@ -0,0 +1,3 @@ +{ + "flutter": "3.35.7" +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bbb512e --- /dev/null +++ b/.gitignore @@ -0,0 +1,120 @@ +# ============================================ +# Flutter / Dart / FVM +# ============================================ +.dart_tool/ +.flutter/ +.fvm/ +.packages +.pub-cache/ +.pub/ + +# Flutter build artifacts +build/ +flutterw +flutterw.bat + +# ============================================ +# Android / Gradle +# ============================================ +android/.gradle/ +android/local.properties +android/app/key.properties +android/app/google-services.json +android/app/google-services.plist + +# ============================================ +# iOS +# ============================================ +ios/Flutter/ +ios/Pods/ +ios/.symlinks/ +ios/Flutter/ephemeral/ + +# ============================================ +# Web +# ============================================ +web/.dart_tool/ +web/build/ + +# ============================================ +# File pesanti (APK, ZIP, DB, dSYM, snapshot) +# ============================================ +*.apk +*.aab +*.ipa +*.zip +*.tar.gz +*.7z +*.db +*.db-shm +*.db-wal +*.sqlite +*.bak +*.keystore +*.jks +*.dSYM +*.bin +*.dill +*.so +*.jar +*.dex +*.ttf + +# ============================================ +# Librerie native enormi +# ============================================ +**/libflutter.so +**/libVkLayer_khronos_validation.so +**/libmpv.so +**/kernel_blob.bin +**/isolate_snapshot_data + +# ============================================ +# Test driver assets (pesanti) +# ============================================ +test_driver/screenshots/ +test_driver/assets/shaders/ + +# ============================================ +# Repo annidati +# ============================================ +aves_mio72s13/ + +# ============================================ +# IDE / Editor +# ============================================ +.vscode/ +.idea/ +*.iml + +# ============================================ +# Logs & temp files +# ============================================ +*.log +*.log.* +*.tmp +*.temp +*.swp +*.swo + +# ============================================ +# OS files +# ============================================ +.DS_Store +Thumbs.db + +# ============================================ +# Fastlane +# ============================================ +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/ +fastlane/test_output/ + +# ============================================ +# Misc +# ============================================ +*.orig +*.rej +*.patch +*.diff diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..a629635 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule ".flutter"] + path = .flutter + url = https://github.com/flutter/flutter.git + branch = main diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..0bc5b71 --- /dev/null +++ b/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled. + +version: + revision: 90c64ed42ba53a52d18f0cb3b17666c8662ed2a0 + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 90c64ed42ba53a52d18f0cb3b17666c8662ed2a0 + base_revision: 90c64ed42ba53a52d18f0cb3b17666c8662ed2a0 + - platform: android + create_revision: 90c64ed42ba53a52d18f0cb3b17666c8662ed2a0 + base_revision: 90c64ed42ba53a52d18f0cb3b17666c8662ed2a0 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..ee51856 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,18 @@ +repos: +- repo: https://github.com/gherynos/pre-commit-java + rev: v0.2.4 + hooks: + - id: Checkstyle +- repo: https://github.com/gitleaks/gitleaks + rev: v8.16.3 + hooks: + - id: gitleaks +- repo: https://github.com/jumanjihouse/pre-commit-hooks + rev: 3.0.0 + hooks: + - id: shellcheck +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: end-of-file-fixer + - id: trailing-whitespace diff --git a/ARCHITETTURA_PLUGIN_google_cast_pratica.md b/ARCHITETTURA_PLUGIN_google_cast_pratica.md new file mode 100644 index 0000000..371bdae --- /dev/null +++ b/ARCHITETTURA_PLUGIN_google_cast_pratica.md @@ -0,0 +1,624 @@ +# Plugin `plugins/google_cast` – Guida pratica / Debug operativo + +Questa guida è la versione **pratica** del documento di architettura del plugin `google_cast`. + +L’obiettivo è aiutarti a capire **rapidamente**: + +- quale parte del flusso è coinvolta +- quale file toccare +- dove guardare quando qualcosa non funziona +- come distinguere i problemi **Google Cast standard** dai problemi **Custom Receiver** + +--- + +# 1. Mappa mentale rapida + +## Flusso generale + +```text +Flutter UI + ↓ +cast_controller.dart + ↓ +┌───────────────────────────────┬───────────────────────────────┐ +│ GoogleCastController │ CustomCastController │ +│ (Google Cast standard) │ (Custom Receiver CAF/web) │ +└───────────────┬───────────────┴───────────────┬───────────────┘ + ↓ ↓ + MethodChannel('google_cast') MethodChannel('google_cast') + ↓ ↓ + FlutterCastFrameworkPlugin.kt (Android) + ↓ + ┌──────────────┬───────────────┬──────────────┬──────────────┐ + │ Context │ Session │ MediaClient │ QueueManager │ + │ Manager │ Handler │ │ │ + └──────────────┴───────────────┴──────────────┴──────────────┘ + ↓ + Google Cast framework / Receiver +``` + +--- + +# 2. File principali: a cosa servono in pratica + +## Lato Flutter / App + +### `lib/widgets/cast/cast_controller.dart` +**È la facciata unificata**. + +Usalo per capire: +- quale backend è attivo (`google`, `custom`, `dlna`) +- dove finiscono i comandi UI +- come vengono sincronizzati i notifier condivisi: + - indice corrente + - stato play/pause + - posizione/durata + - volume/mute + +### Se hai un bug tipo: +- il pulsante UI chiama il backend sbagliato +- i notifier non si aggiornano +- la cast bar chiama il backend sbagliato + +👉 il primo file da guardare è **questo**. + +--- + +### `lib/widgets/cast/google_cast_controller.dart` +**È il cervello Dart del Google Cast standard**. + +Qui trovi: +- connessione del flusso Google Cast +- caricamento queue standard +- slideshow lato Flutter +- polling media/volume +- sync verso fullscreen viewer / controlli + +### Se hai un bug tipo: +- slideshow Google si ferma +- foto/video si comportano male +- seek cambia sulla TV ma non sul telefono +- volume non si aggiorna nella UI +- `onCastReady` genera comportamenti strani + +👉 guarda **questo file**. + +--- + +### `lib/widgets/cast/custom_cast_controller.dart` +**È il cervello Dart del Custom Receiver**. + +Qui trovi: +- avvio sessione/receiver custom +- invio messaggi JSON al receiver web +- polling custom (`MEDIA_STATUS`, `VOLUME_STATUS`) +- slideshow custom +- comandi `LOAD_QUEUE`, `NEXT`, `PLAY`, `PAUSE`, ecc. + +### Se hai un bug tipo: +- Custom connect funziona ma la TV mostra male il contenuto +- overlay/progress duplicati +- volume custom non cambia davvero il video +- il receiver risponde ma Flutter non si aggiorna + +👉 guarda **questo file** + il receiver web. + +--- + +### `lib/widgets/collection/app_bar/cast/cast_icon_button.dart` +Gestisce il **tap sull’icona Cast** nella app bar. + +Qui si decide se il tap deve fare: +- solo **connessione device** +- oppure connessione + media + +### Se hai un bug tipo: +- scegli Google ma sembra partire Custom +- il cast parte subito quando scegli il device +- il device si connette ma la UX è sbagliata + +👉 guarda **questo file**. + +--- + +### `lib/widgets/collection/app_bar/cast/cast_bar_inline.dart` +È la **seconda barra orizzontale** con: +- cast manuale +- fullscreen cast +- slideshow +- prev/next +- stop slideshow +- stop cast + +### Se hai un bug tipo: +- parte con gli item sbagliati +- usa una selezione vecchia +- startIndex invalido +- overflow orizzontale della barra + +👉 guarda **questo file**. + +--- + +### `lib/widgets/collection/app_bar/cast/cast_controls_sheet.dart` +È il **bottom sheet dei controlli**. + +Qui trovi: +- seek +- prev/play-pause/next +- volume/mute +- stop slideshow +- stop cast + +### Se hai un bug tipo: +- il volume non compare +- il volume compare ma non si aggiorna +- i controlli interagiscono col backend sbagliato +- la UI chiama `controller.google` / `controller.custom` direttamente + +👉 guarda **questo file**. + +--- + +### `lib/widgets/viewer/fullscreen_cast_viewer.dart` +È il viewer fullscreen locale sincronizzato col Cast. + +### Se hai un bug tipo: +- il video sulla TV cambia seek ma il telefono no +- il fullscreen non segue l’indice Cast +- il video locale e il Cast non sono allineati + +👉 guarda **questo file**. + +--- + +## Lato plugin Android + +### `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/FlutterCastFrameworkPlugin.kt` +**Router centrale del plugin**. + +Riceve tutto dal `MethodChannel('google_cast')`. + +### Se hai un bug tipo: +- Flutter chiama un metodo ma sembra non arrivare al native +- un comando non viene instradato bene +- un handler non viene più registrato + +👉 guarda **questo file**. + +--- + +### `CastContextManager.kt` +Gestisce: +- `CastContext` +- `Activity` +- sessione Cast corrente +- `RemoteMediaClient` + +### Se hai un bug tipo: +- sessione non trovata +- device connesso ma client nullo +- callback non agganciata al client corretto + +👉 guarda **questo file**. + +--- + +### `CastSessionHandler.kt` +Gestisce gli eventi di sessione: +- `onSessionStarted` +- `onSessionResumed` +- `onSessionEnded` +- `onCastReady` +- `onCastStopped` + +### Se hai un bug tipo: +- il device si connette ma Flutter non sa che è pronto +- la seconda barra non compare +- la sessione finisce ma Flutter resta “connected” + +👉 guarda **questo file**. + +--- + +### `CastDialogLauncher.kt` +Mostra il dialog nativo di selezione device. + +### Se hai un bug tipo: +- l’icona Cast non apre il picker +- il picker si apre ma non seleziona device + +👉 guarda **questo file**. + +--- + +### `CastMediaClient.kt` +Gestisce: +- play / pause / seek +- get media status +- volume / mute +- callback `RemoteMediaClient.Callback` + +### Se hai un bug tipo: +- `onQueueIndexChanged` non arriva più a Flutter +- `onVideoFinished` non arriva +- `Invalid Request` +- volume nativo Google non si aggiorna + +👉 guarda **questo file**. + +--- + +### `CastQueueManager.kt` +Gestisce: +- `loadQueue(items, startIndex)` +- `next()` +- `prev()` +- costruzione `MediaQueueItem` +- metadati (`index`, `isVideo`, mime, title) + +### Se hai un bug tipo: +- `Invalid startIndex` +- queue rotta o item sbagliati +- Google Cast non va al prossimo item come dovrebbe + +👉 guarda **questo file**. + +--- + +### `CastCustomReceiver.kt` +Gestisce l’avvio del custom receiver web/CAF. + +### Se hai un bug tipo: +- il receiver custom non parte +- parte ma non riceve messaggi +- la sessione custom sembra connettersi ma non carica nulla + +👉 guarda **questo file**. + +--- + +# 3. Mappa dei comandi principali + +## Comandi Flutter → plugin Android + +### Connessione +- `showCastDialog` +- `startCustomReceiver` + +### Queue / navigazione +- `loadQueue` +- `next` +- `prev` + +### Media +- `play` +- `pause` +- `seekTo` +- `getMediaStatus` + +### Volume +- `getVolume` +- `setVolume` +- `setMute` + +### Stop +- `stopCast` + +--- + +# 4. Mappa degli eventi di ritorno + +## Google Cast standard → Flutter +- `onCastReady` +- `onCastStopped` +- `onQueueIndexChanged` +- `onVideoFinished` +- `onCastError` + +## Custom Receiver → Flutter +Di solito via messaggi custom, per esempio: +- `CAST_READY` +- `CAST_STOPPED` +- `MEDIA_STATUS` +- `VOLUME_STATUS` + +--- + +# 5. Troubleshooting rapido + +## Problema: seleziono il device e subito compaiono +- `Invalid Request` +- `MediaQueue error 2001` +- `IDLE_REASON_ERROR` + +### Causa probabile +Il polling media parte **troppo presto**, cioè già su `onCastReady` quando non esiste ancora una queue/media caricata. + +### Dove guardare +- `google_cast_controller.dart` +- `CastMediaClient.kt` + +### Fix tipico +- non avviare `startMediaPolling()` dentro `onCastReady` +- far partire il polling solo dopo `loadQueue` +- lato native, ignorare gli stati in cui `mediaInfo == null` + +--- + +## Problema: slideshow Google fa prima e seconda foto, poi si ferma + +### Causa probabile +Flutter non riceve più il cambio item queue, quindi il timer slideshow non viene riarmato. + +### Dove guardare +- `google_cast_controller.dart` +- `CastMediaClient.kt` +- eventualmente `CastQueueManager.kt` + +### Fix tipico +- ripristinare la callback `RemoteMediaClient.Callback` +- reinviare a Flutter `onQueueIndexChanged(index, isVideo)` +- in Dart riarmare il timer solo per le foto + +--- + +## Problema: in slideshow un video viene saltato dopo 5 secondi + +### Causa probabile +Il timer slideshow delle foto parte anche sui video. + +### Dove guardare +- `google_cast_controller.dart` +- `custom_cast_controller.dart` + +### Comportamento corretto +- **foto** → timer +- **video** → nessun timer, deve finire da solo e poi passare al successivo + +--- + +## Problema: in presentazione manuale/fullscreen le foto avanzano da sole + +### Causa probabile +La logica slideshow è rimasta attiva quando non dovrebbe. + +### Dove guardare +- `google_cast_controller.dart` +- `custom_cast_controller.dart` +- `cast_bar_inline.dart` + +### Comportamento corretto +- **manuale/fullscreen**: le foto restano ferme fino a un comando manuale +- i video invece vanno al successivo a fine riproduzione + +--- + +## Problema: `Invalid startIndex: X` + +### Causa probabile +Stai caricando una queue con un indice iniziale più grande della lunghezza della lista. + +### Dove guardare +- `cast_bar_inline.dart` +- `google_cast_controller.dart` +- `custom_cast_controller.dart` +- `CastQueueManager.kt` + +### Fix tipico +- usare `startIndex: 0` nei comandi manuali della cast bar +- oppure proteggere con una funzione tipo `_safeIndexOrKeep(...)` + +--- + +## Problema: seek sul video cambia sulla TV ma non sul telefono + +### Causa probabile +Il telefono usa un player locale non sincronizzato con `positionNotifier` / `isPlayingNotifier` del Cast. + +### Dove guardare +- `google_cast_controller.dart` +- `fullscreen_cast_viewer.dart` + +### Fix tipico +- in `seekCast()` aggiornare subito `positionNotifier` +- nel `VideoWidget` locale ascoltare `positionNotifier` e `isPlayingNotifier` + +--- + +## Problema: il volume compare ma la barra non si aggiorna + +### Causa probabile +Il comando volume parte, ma il notifier locale non viene riallineato con lo stato reale del device. + +### Dove guardare +- `google_cast_controller.dart` +- `cast_controls_sheet.dart` +- `fullscreen_cast_viewer.dart` +- `CastMediaClient.kt` + +### Fix tipico +- dopo `setVolume` e `setMute`, chiamare `refreshVolumeStatus()` +- lato UI, separare `onChanged` e `onChangeEnd` dello slider + +--- + +## Problema: scegli Google ma sembra partire Custom + +### Causa probabile +Il backend attivo del controller unificato non è allineato al backend scelto nella UI. + +### Dove guardare +- `cast_icon_button.dart` +- `cast_controller.dart` +- `custom_cast_controller.dart` +- `google_cast_controller.dart` + +### Fix tipico +- rendere l’icona Cast “connect-only” +- impostare esplicitamente il backend attivo (`_backend`) nel controller unificato +- far partire la queue solo dai pulsanti della cast bar + +--- + +## Problema: in selection mode la app bar sembra toccare anche le foto sotto + +### Causa probabile +La barra non sta assorbendo correttamente i tocchi nell’area header. + +### Dove guardare +- `collection_app_bar.dart` +- `aves_app_bar.dart` +- `collection_page.dart` + +### Fix tipico +- ripristinare il wrapper che assorbe i tap nella barra (`AInkResponse`) +- verificare il comportamento `pinned` +- verificare l’uso corretto di `appBarHeightNotifier` + +--- + +# 6. Regole pratiche di debug + +## Regola 1 +### Se il problema è “UI Flutter non aggiornata” +Guarda prima i controller Dart: +- `cast_controller.dart` +- `google_cast_controller.dart` +- `custom_cast_controller.dart` +- `fullscreen_cast_viewer.dart` + +--- + +## Regola 2 +### Se il problema è “la TV/device fa una cosa diversa da Flutter” +Guarda: +- `CastMediaClient.kt` +- `CastQueueManager.kt` +- receiver custom JS/HTML (se custom) + +--- + +## Regola 3 +### Se il problema avviene subito dopo la connessione device +Guarda: +- `CastSessionHandler.kt` +- `google_cast_controller.dart` +- `CastMediaClient.kt` + +Il sospetto classico è la distinzione: +- connessione sessione +- queue realmente caricata + +--- + +## Regola 4 +### Se il problema riguarda slideshow foto/video +Guarda prima il controller Dart, poi il native. + +Ordine consigliato: +1. `google_cast_controller.dart` +2. `custom_cast_controller.dart` +3. `CastMediaClient.kt` +4. `CastQueueManager.kt` + +--- + +## Regola 5 +### Se il problema riguarda il Custom Receiver +Non fermarti al controller Flutter. + +Devi guardare anche: +- `CastCustomReceiver.kt` +- `receiver.html` +- eventuale JS del receiver + +Perché molti bug Custom sono **receiver-side**, non plugin-side. + +--- + +# 7. Differenza pratica Google vs Custom (da tenere a mente) + +## Google Cast standard +### Più affidabile quando: +- usi queue nativa +- usi volume Cast nativo +- ti affidi a `RemoteMediaClient.Callback` + +## Custom Receiver +### Più flessibile quando: +- vuoi UI custom sul TV +- vuoi logica media personalizzata +- vuoi controllare il player HTML5 direttamente + +### Ma più fragile quando: +- volume/mute non sono implementati davvero +- il DOM del receiver non viene pulito bene +- i messaggi receiver/Flutter non sono perfettamente allineati + +--- + +# 8. Checklist rapida: dove toccare per ogni categoria + +## Connessione device +- `cast_icon_button.dart` +- `FlutterCastFrameworkPlugin.kt` +- `CastDialogLauncher.kt` +- `CastSessionHandler.kt` + +## Queue / media non partono +- `cast_bar_inline.dart` +- `google_cast_controller.dart` +- `CastQueueManager.kt` + +## Slideshow foto/video +- `google_cast_controller.dart` +- `custom_cast_controller.dart` +- `CastMediaClient.kt` + +## Volume Google +- `google_cast_controller.dart` +- `cast_controls_sheet.dart` +- `fullscreen_cast_viewer.dart` +- `CastMediaClient.kt` + +## Volume Custom +- `custom_cast_controller.dart` +- `CastCustomReceiver.kt` +- `receiver.html` / JS + +## Bug UI selection / app bar +- `collection_app_bar.dart` +- `aves_app_bar.dart` +- `collection_page.dart` + +--- + +# 9. Conclusione pratica + +Se devi pensare al plugin in modo operativo, ricordati questa formula: + +## **Flutter decide l’UX → il plugin Android parla con Cast → il receiver riproduce davvero** + +Quindi ogni bug va classificato subito in una di queste tre famiglie: + +### A. Bug UX / Flutter +- notifier +- selection +- fullscreen viewer +- cast bar +- app bar + +### B. Bug plugin Android +- sessione +- queue +- callback media +- volume nativo + +### C. Bug receiver +- volume custom +- progress bar duplicate +- media status custom +- UI TV-side + +Capire **subito** in quale famiglia rientra il bug fa risparmiare tantissimo tempo di debug. diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..28c6099 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,1920 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Fixed + +- widget rendering failing because of setting sanitization + +## [v1.14.0] - 2026-02-14 + +### Added + +- Collection: allow using width/height when bulk renaming +- Video: allow forcing hardware acceleration +- Search: allow regex (wrapped in `/.../`) in query filter +- Stats: export to CSV/JSON fields of filtered collection +- predictive back gesture support (external only, intra-app support pending Flutter v3.42) + +### Changed + +- upgraded Flutter to stable v3.41.1 +- splash screen icon animation + +### Removed + +- support for Android API < 24 (Android 7.0 Nougat) + +### Fixed + +- inefficient PiP check causing high CPU usage + +## [v1.13.12] - 2025-12-23 + +### Added + +- Viewer: mouse wheel scroll jumps to previous/next item + +### Changed + +- Collection: use developed item as representative for RAW stack +- Viewer: removed thumbnail overlay synchronization delay + +### Fixed + +- crash when cataloguing some JPEG with invalid offsets +- crash when editing some MP4 with large boxes +- crash when decoding large Base64 images embedded in SVG +- crash when decoding large app icons +- crash when getting info from some multipage HEIC +- crash when fetching some video thumbnails +- GPX matching implementation +- missing home screen shortcut icon +- rendering of stripped TIFF with vertical flip + +## [v1.13.11] - 2025-11-18 + +### Added + +- Viewer: optionally show zoom level on overlay +- Stats: export filter lists to CSV +- build: `libre_rom` flavor as variant of `libre` flavor for integration in custom ROM + +### Changed + +- Viewer: allow zooming out of panoramas until 25% + +### Fixed + +- decoding images with pixel config unsupported by region decoder and bitmap compressor +- cataloguing still AVIF images + +## [v1.13.10] - 2025-11-16 [YANKED] + +## [v1.13.9] - 2025-10-11 + +### Added + +- Collection: long press on copy/move/rating/tag quick action for quicker action +- Widget: more shape options +- Viewer: drag and drop in multi-window mode +- Vaults: allow hiding like other albums +- 16 KB memory page size support +- Finnish translation (thanks Åzze, Olli, Ricky Tigg, Oris5) + +### Changed + +- Albums: show hidden albums when they are pinned + +### Fixed + +- saving metadata date when moving items to bin +- rescanning items in vaults +- grouping when renaming album +- thumbnail orientation for some RAW formats +- converting portrait HEIF/RAW to requested size + +## [v1.13.8] - 2025-09-08 + +### Added + +- Collection: support for Motorola burst pattern +- Stats: total video duration + +### Changed + +- manual rotation to landscape switches to current sensor orientation, then is fixed to it +- improved image streaming and pixel format selection + +### Fixed + +- receiving `geo:` URI in some cases +- visibility of hidden new albums +- customizing cover or hiding tag groups + +## [v1.13.7] - 2025-09-07 [YANKED] + +## [v1.13.6] - 2025-07-28 + +### Fixed + +- DB init when a serialized dynamic album is too large for cursor window + +## [v1.13.5] - 2025-07-23 + +### Added + +- Tags: groups +- bottom navigation bar customization + +### Fixed + +- crash when updating multiple home widgets + +## [v1.13.4] - 2025-07-09 + +### Added + +- Map: allow setting subdomains, user-agent for custom styles + +### Fixed + +- showing directories wrongly registered as media in the Media Store +- apply preferred first day of the week for date picker + +## [v1.13.3] - 2025-06-25 + +### Added + +- Info: show matching dynamic albums +- Map: allow adding custom map styles + +### Changed + +- Viewer: use nearest neighbor algorithm to render small raster images +- revoke access when `DocumentsProvider` is not listing content as it should + +### Fixed + +- crash when decoding some large thumbnails +- crash when editing metadata for some JPEG images +- scrolling to top when leaving viewer to collection with title filter enabled +- recovery of untracked binned items without extension + +## [v1.13.2] - 2025-06-02 + +### Changed + +- downgraded Flutter to stable v3.27.4 +- prevent display orientation flip when device rotation is locked + +### Fixed + +- moved file losing its extension and no longer being detected as media in some cases +- opening home when launching app as media picker +- removing groups with obsolete albums +- loading group custom covers +- crash when parsing some large media with trailing thumbnail + +## [v1.13.1] - 2025-05-14 + +### Fixed + +- albums: show groups to move/copy/export items +- albums: hide grouped albums containing hidden items only + +## [v1.13.0] - 2025-05-12 + +### Added + +- Albums: groups +- Collection: sort by storage path +- Search: week day filters + +### Changed + +- revert to Skia rendering engine + +## [v1.12.10] - 2025-04-16 + +### Added + +- Search: format filters +- Albums: sort by path + +### Changed + +- upgraded Flutter to stable v3.29.3 + +### Fixed + +- region decoding failing to access decoder pool + +## [v1.12.9] - 2025-04-06 + +### Added + +- Kannada translation (thanks Chethan, Prasannakumar T Bhat) + +### Changed + +- enable Impeller rendering engine + +### Fixed + +- memory pressure during browsing + +## [v1.12.8] - 2025-03-25 + +### Fixed + +- swiping images for some combinations of screen size, device pixel ratio, and image size + +## [v1.12.7] - 2025-03-16 + +### Added + +- handle launch error to report and export DB + +### Changed + +- DB post-upgrade sanitization +- upgraded Flutter to stable v3.29.2 + +## [v1.12.6] - 2025-03-11 + +### Fixed + +- data loss when editing metadata of items with incorrect mime types +- metadata inconsistency in the DB due to v1.12.4 upgrade + +## [v1.12.5] - 2025-03-07 + +### Added + +- support for Samsung HEIC motion photos embedding video in sefd box +- Cataloguing: identify video location from Apple QuickTime metadata, and 3GPP `loci` atom +- Collection: stack RAW and HEIC with same file names +- display home tile in side drawer when customized +- Galician translation (thanks Rubén Castiñeiras Lorenzo) + +### Changed + +- increased precision of file modified date to milliseconds +- upgraded Flutter to stable v3.29.1 + +### Fixed + +- opening motion photo embedded video when video track is not the first one +- some SVG rendering issues +- decoding of SVG containing references to namespaces in !ATTLIST +- fallback decoding of images packed in RGBA_1010102 config + +## [v1.12.4] - 2025-03-05 [YANKED] + +## [v1.12.3] - 2025-02-06 + +### Added + +- Metadata: edit location via GPX +- Metadata: toggle for all types in removal dialog + +### Changed + +- Viewer: improved subsampling and filter quality strategy +- Collection: ignore moving an item to its current directory +- Collection: keep selection when action on several items is interrupted before processing +- Collection: preserve favourite status when converting items +- upgraded Flutter to stable v3.27.4 + +### Fixed + +- editing TIFF metadata increasing file size +- region decoding for some RAW files +- incorrect video size or orientation as reported by Media Store +- corrupting image when removing video from motion photo with incorrect metadata + +## [v1.12.2] - 2025-01-13 + +### Added + +- DDM coordinate format option + +### Changed + +- Video: use `media-kit` instead of `ffmpeg-kit` for metadata fetch +- Info: show video chapters +- Accessibility: apply system "touch and hold delay" setting + +### Fixed + +- crash when cataloguing some videos +- switching to PiP for any inactive app state + +## [v1.12.1] - 2025-01-05 + +### Added + +- dynamic album decompose action +- Danish translation (thanks Grooty12, Victor M, cat) + +### Fixed + +- analysis service not triggering because of uninitialized app lifecycle +- Viewer: displaying neighbour items when the initial item of a view intent is a new one +- Search: dynamic album name filtering + +## [v1.12.0] - 2024-12-19 + +### Added + +- Countries: show states for Mexico +- Estonian translation (thanks Priit Jõerüüt) + +### Changed + +- upgraded Flutter to stable v3.27.1 + +### Fixed + +- crash when loading many new items on low memory devices + +## [v1.11.20] - 2024-12-11 + +### Added + +- Albums: dynamic albums from filter sets +- Bulgarian translation (thanks Petrov) +- Tamil translation (thanks தமிழ்நேரம்) + +## [v1.11.19] - 2024-11-24 + +### Added + +- integrate with OS app language settings on Android >=14 + +### Changed + +- remember title filter visibility by page + +## [v1.11.18] - 2024-11-18 + +### Changed + +- Albums: improved album creation feedback +- upgraded Flutter to stable v3.24.5 + +### Fixed + +- crash when playing video with DCL restriction enabled +- cataloguing images with wrong MPF offsets +- printing multi-page items containing some unprintable pages +- English (Shavian) locale tags for store listing + +## [v1.11.17] - 2024-10-30 + +### Added + +- Map: create shortcut to custom region and filters +- Video: frame stepping forward/backward +- Video: custom playback buttons +- English (Shavian) translation (thanks Paranoid Android) + +### Changed + +- upgraded Flutter to stable v3.24.4 + +### Fixed + +- crash when loading large collection +- Viewer: copying content URI item +- Albums: creating album with same name as existing empty directory +- Privacy: tagging while vaults are unlocked does not yield recent tags visible when vaults are locked + +## [v1.11.16] - 2024-10-10 + +### Fixed + +- case-insensitive access to restricted directories + +## [v1.11.15] - 2024-10-09 + +### Changed + +- Enterprise: do not request `INTERACT_ACROSS_PROFILES` permission (Play Store compatibility) + +## [v1.11.14] - 2024-10-09 + +### Added + +- Map: OpenTopoMap raster layer +- Map: OSM Liberty vector layer (hosted by OSM Americana) +- Interoperability: receiving `geo:` URI generally opens map page at location +- Interoperability: receiving `geo:` URI when editing item location fills in coordinates +- Map basic app shortcut +- Enterprise: support for work profile switching from the drawer +- Settings: hidden path filters are merged with others and can be toggled + +### Removed + +- `Safe mode` basic app shortcut + +### Fixed + +- hanging when cataloguing some JPEG MPF images +- Apple HDR image detection + +## [v1.11.13] - 2024-09-17 + +### Added + +- support opening from the lock screen + +### Changed + +- upgraded Flutter to stable v3.24.3 + +### Fixed + +- crash when cataloguing some malformed MP4 files +- inconsistent launch screen + +## [v1.11.12] - 2024-09-16 [YANKED AGAIN!] + +## [v1.11.11] - 2024-09-16 [YANKED] + +## [v1.11.10] - 2024-09-01 + +### Added + +- Swedish translation (thanks Shift18, Andreas Håll) + +### Changed + +- request notification permission when launching scanning service +- upgraded Flutter to stable v3.24.1 + +### Fixed + +- duplicates from new item loading/refreshing + +## [v1.11.9] - 2024-08-07 + +### Added + +- Viewer: display more items in tag/copy/move quick action choosers +- Viewer: long descriptions are scrollable when overlay is expanded by tap +- Collection: sort by duration +- Map: open external map app from map views +- Explorer: stats + +### Changed + +- Accessibility: more animations and effects are suppressed when animations are disabled +- upgraded Flutter to stable v3.24.0 + +### Fixed + +- opening app from launcher always showing home page +- collection quick actions not showing in the top bar nor the menu +- multiple widget setup after device reboot + +## [v1.11.8] - 2024-07-19 + +### Added + +- Explorer: set custom path as home +- Explorer: create shortcut to custom path + +### Changed + +- target Android 15 (API 35) +- upgraded Flutter to stable v3.22.3 + +### Fixed + +- crash when cataloguing some PNG files + +## [v1.11.7] - 2024-07-18 [YANKED AGAIN!] + +## [v1.11.6] - 2024-07-17 [YANKED] + +## [v1.11.5] - 2024-07-11 + +### Added + +- Collection: stack RAW and JPEG with same file names +- Collection: ask to rename/replace/skip when converting items with name conflict +- Export: bulk converting motion photos to still images +- Explorer: view folder tree and filter paths + +### Fixed + +- switching to PiP when changing device orientation on Android >=13 +- handling wallpaper intent without URI +- sizing widgets with some launchers on Android >=12 + +### Removed + +- `huawei` app flavor + +## [v1.11.4] - 2024-07-09 [YANKED] + +## [v1.11.3] - 2024-06-17 + +### Added + +- handle `MediaStore.ACTION_REVIEW` intent + +## [v1.11.2] - 2024-06-11 + +### Added + +- Albums / Countries / Tags: show selection in Collection +- allow shifting dates by seconds + +### Changed + +- opening app from launcher shows home page only when exited by back button +- Screen saver: black background, consistent with slideshow +- upgraded Flutter to stable v3.22.2 + +### Removed + +- support for Android KitKat (API 19) + +### Fixed + +- crash when cataloguing large images + +## [v1.11.1] - 2024-05-03 + +### Added + +- Cataloguing: identify Apple variant of HDR images +- Collection: `select all` available as quick action +- Collection: allow using hash (md5/sha1/sha256) when bulk renaming +- Info: color palette +- Video: external subtitle support (SRT) +- option to force using western arabic numerals for dates +- Persian translation (thanks امیر جهانگرد, slasb37, mimvahedi, Alireza Rashidi) + +### Changed + +- logo +- upgraded Flutter to stable v3.19.6 + +### Fixed + +- rendering of SVG with large header +- stopping video playback when changing device orientation on Android >=13 +- printing content orientation according to page format + +## [v1.11.0] - 2024-05-01 [YANKED] + +## [v1.10.9] - 2024-04-14 + +### Fixed + +- rendering of SVG with viewbox offset +- superfluous media store reinitialization when relaunching app from launcher + +## [v1.10.8] - 2024-04-01 + +### Added + +- Collection: support for Fairphone burst pattern +- Collection: allow using tags/make/model when bulk renaming +- Video: A-B repeat +- Settings: hidden items can be toggled + +### Changed + +- opening app from launcher always show home page +- use dates with western arabic numerals for maghreb arabic locales +- album unique names are case insensitive +- upgraded Flutter to stable v3.19.5 + +### Fixed + +- crash when decoding large region +- viewer position drift during scale +- viewer side gesture precedence (next entry by single tap vs zoom by double tap) + +## [v1.10.7] - 2024-03-12 + +### Added + +- Cataloguing: detect/filter HDR videos + +### Changed + +- check Media Store changes when resuming app +- disabling animations also applies to pop up menus +- upgraded Flutter to stable v3.19.3 + +### Fixed + +- engine leak from analysis worker + +## [v1.10.6] - 2024-03-11 [YANKED] + +## [v1.10.5] - 2024-02-22 + +### Added + +- Viewer: prompt to show newly edited item +- Widget: outline color options according to device theme +- Catalan translation (thanks Marc Amorós) + +### Changed + +- upgraded Flutter to stable v3.19.1 + +### Fixed + +- untracked binned items recovery +- untracked vault items recovery + +## [v1.10.4] - 2024-02-07 + +### Fixed + +- motion photo detection for xml variant of google container item +- HEIF size detection for some corrupted files +- viewer transition direction & effects for RTL locales + +## [v1.10.3] - 2024-01-29 + +### Added + +- Viewer: optional histogram (for real this time) +- Collection: allow hiding thumbnail overlay HDR icon +- Collection: allow setting any filtered collection as home page + +### Changed + +- Viewer: lift format control for tiling, allowing large DNG tiling if supported +- Info: strip `unlocated` filter from context collection when editing location via map +- Slideshow: keep playing when losing focus but app is still visible (e.g. split screen) +- upgraded Flutter to stable v3.16.9 + +### Fixed + +- crash when loading some large DNG in viewer +- searching from drawer on mobile +- resizing TIFF during conversion + +## [v1.10.2] - 2023-12-24 + +### Changed + +- Viewer: keep controls in the lower right corner even with RTL locales + +### Fixed + +- crash when loading SVG defined with large dimensions + +## [v1.10.1] - 2023-12-21 + +### Added + +- Cataloguing: detect/filter `Ultra HDR` +- Viewer: show JPEG MPF dependent images (except thumbnails and HDR gain maps) +- Info: show metadata from JPEG MPF +- Info: open images embedded via JPEG MPF +- Arabic translation (thanks Mohamed Zeroug) +- Belarusian translation (thanks Макар Разин) + +### Changed + +- upgraded Flutter to stable v3.16.5 + +## [v1.10.0] - 2023-12-02 + +### Added + +- Viewer / Slideshow: cast images via DLNA/UPnP +- Icelandic translation (thanks Sveinn í Felli) + +### Changed + +- long press actions trigger haptic feedback according to OS settings +- target Android 14 (API 34) +- upgraded Flutter to stable v3.16.2 + +### Fixed + +- temporary files remaining in the cache directory forever +- detecting motion photos with more items in the XMP Container directory +- parsing EXIF date written as epoch time + +## [v1.9.7] - 2023-10-17 + +### Added + +- Slovak translation (thanks Martin Frandel, Milan Šalka) +- Vietnamese translation (thanks ngocanhtve, Le Nhut Binh) + +### Changed + +- mosaic layout: clamp ratio to 32/9 +- Video: disable subtitles by default +- Map: Stamen Watercolor layer (no longer hosted for free by Stamen) now hosted by Smithsonian Institution +- upgraded Flutter to stable v3.13.7 + +### Removed + +- Map: Stamen Toner layer (no longer hosted for free by Stamen) + +### Fixed + +- crash when playing video on devices with hardened malloc + +## [v1.9.6] - 2023-09-25 + +### Fixed + +- editing some image EXIF corrupting them (by failing instead) + +## [v1.9.5] - 2023-09-17 + +### Fixed + +- crash when cataloguing some videos +- workflow when moving to an album with insufficient storage + +## [v1.9.4] - 2023-09-13 + +### Changed + +- upgraded Flutter to stable v3.13.4 + +### Fixed + +- CVE-2023-4863 - Security vulnerability in WebP + +## [v1.9.3] - 2023-08-28 + +### Changed + +- target API 33 to prevent foreground service crashes with Android 14 beta 5 + +## [v1.9.2] - 2023-08-24 + +### Changed + +- upgraded Flutter to stable v3.13.1 +- building without FFmpeg `neon` libs +- building with gradle toolchain resolver plugin + +## [v1.9.1] - 2023-08-22 + +### Fixed + +- editing some WEBP corrupting them (by failing instead) + +## [v1.9.0] - 2023-08-21 + +### Added + +- Video: improved seek accuracy, HDR support, AV1 support, playback speed from x0.25 to x4 +- support for animated AVIF (requires rescan) +- Collection: filtering by rating range +- Viewer: optionally show histogram on overlay +- Viewer: external export actions available as quick actions +- About: data usage + +### Changed + +- Accessibility: removing animations also removes the overscroll stretch effect +- target Android 14 (API 34) +- upgraded Flutter to stable v3.13.0 + +### Fixed + +- flickering when starting videos +- editing fragmented MP4 corrupting them (by failing instead) + +## [v1.8.9] - 2023-06-04 + +### Changed + +- upgraded Flutter to stable v3.10.3 + +### Fixed + +- duplicates when converting many items + +## [v1.8.8] - 2023-05-28 + +### Added + +- option to set the Tags page as home +- support for animated PNG (requires rescan) +- Info: added day filter with item date +- Widget: option to update image on tap +- Slideshow / Screen saver: option for random transition +- Norwegian (Nynorsk) translation (thanks tryvseu) + +### Changed + +- keep showing empty albums if are pinned +- remember whether to show the title filter when picking albums +- upgraded Flutter to stable v3.10.2 + +### Fixed + +- crash when cataloguing PSD with large XMP +- crash when cataloguing large HEIF + +## [v1.8.7] - 2023-05-26 [YANKED] + +## [v1.8.6] - 2023-04-30 + +### Added + +- Collection: support for Sony predictive capture as burst +- Video: option to never/always resume playback +- Display: option to set maximum brightness on all pages +- Export: set quality when converting to JPEG/WEBP +- Hungarian translation (thanks György Viktor, byPety) + +### Changed + +- Info: editing tags now requires explicitly tapping the save button +- upgraded Flutter to stable v3.7.12 + +### Fixed + +- Video: switching to PiP when going home with gesture navigation +- Viewer: swiping gestures not being handled in some cases +- Viewer: multi-page context update when removing burst entries +- Info: editing tags with placeholders +- prevent editing item when Exif editing changes mime type +- parsing videos with skippable boxes in `meta` box + +## [v1.8.5] - 2023-04-18 + +### Added + +- Collection: optional support for Samsung and Sony burst patterns +- Video: action to lock viewer +- Info: improved state/place display (requires rescan, limited to AU/GB/IN/US) +- Info: edit tags with state placeholder +- Info: show metadata from MP4 user data box +- Countries: show states for selected countries +- Tags: delete selected tags from all media in collection +- improved support for system font scale + +### Changed + +- upgraded Flutter to stable v3.7.11 +- when an album becomes empty, the folder will be deleted only if it is a non-app/common album +- TV: section header focus/highlight + +### Fixed + +- permission confusion when removable volume changes +- Viewer: flickering on first scale animation in some cases + +## [v1.8.4] - 2023-03-17 + +### Added + +- TV: improved support for Licenses + +### Fixed + +- Viewer: playing video from app content provider +- Search: using the query bar yields a black screen + +## [v1.8.3] - 2023-03-13 + +### Added + +- Collection: preview button when selecting items +- Collection: item size in list layout +- Vaults: custom pattern lock +- Video: picture-in-picture +- Video: handle skip next/previous media buttons +- TV: more media controls + +### Changed + +- scroll to show item when navigating from Info page +- upgraded Flutter to stable v3.7.7 + +### Fixed + +- Accessibility: using accessibility services keeping snack bar beyond countdown +- Accessibility: navigation with TalkBack +- Vaults: crash when using fingerprint on older Android versions +- Vaults: sharing multiple items + +## [v1.8.2] - 2023-02-28 + +### Added + +- Export: bulk converting +- Export: write metadata when converting +- Places: page & navigation entry + +### Changed + +- rating/tagging action icons +- upgraded Flutter to stable v3.7.5 + +### Fixed + +- viewer pan/scale gestures interpreted as fling gestures +- replacing when moving item to vault +- exporting item to vault + +## [v1.8.1] - 2023-02-21 + +### Added + +- Vaults +- Viewer: overlay details expand/collapse on tap +- Viewer: export actions available as quick actions +- Slideshow: added settings quick action +- TV: improved support for Info +- Basque translation (thanks Aitor Salaberria) + +### Changed + +- disabling the recycle bin will delete forever items in it +- remember pin status of albums becoming empty +- allow setting dates before 1970/01/01 +- upgraded Flutter to stable v3.7.3 + +### Fixed + +- SD card access grant on Android Lollipop +- copying to SD card in some cases +- sharing SD card files referred by `file` URI + +## [v1.8.0] - 2023-02-20 [YANKED] + +## [v1.7.10] - 2023-01-18 + +### Added + +- Video: optional gestures to adjust brightness/volume +- TV: improved support for Search, About, Privacy Policy + +### Changed + +- Viewer: do not keep max brightness when viewing info + +### Fixed + +- crash when media button events are triggered with no active media session + +## [v1.7.9] - 2023-01-15 + +### Added + +- Viewer: optionally show description on overlay +- Collection: unlocated/untagged overlay icons +- Video: stop when losing audio focus +- Video: stop when becoming noisy +- Info: Google camera portrait mode item extraction +- TV: handle overscan +- TV: improved support for Viewer, Info, Map, Stats +- TV: option to use TV layout on any device +- Czech translation (thanks vesp) +- Polish translation (thanks Piotr K, rehork) + +### Changed + +- editing description writes XMP `dc:description`, and clears Exif `ImageDescription` + / `UserComment` +- in the tag editor, tapping on applied tag applies it to all items instead of removing it +- pin app bar when selecting items + +### Fixed + +- transition between collection and viewer when cutout area is not used +- saving video playback state when leaving viewer + +## [v1.7.8] - 2022-12-20 + +### Added + +- Android TV support +- Viewer: optionally show rating & tags on overlay +- Viewer: long press on copy/move/rating/tag quick action for quicker action +- Viewer: long press on share quick action to share parts of motion photo +- Search: missing address, portrait, landscape filters +- Map: edit cluster location +- Accessibility: optional alternative to pinch-to-zoom thumbnails +- Lithuanian translation (thanks Gediminas Murauskas) +- Norwegian (Bokmål) translation (thanks Allan Nordhøy) +- Chinese (Traditional) translation (thanks pemibe) +- Ukrainian translation (thanks Olexandr Mazur) + +### Changed + +- Viewer: allow setting default outside video player +- Map: fit to most recent items if all items cannot fit on screen +- upgraded Flutter to stable v3.3.10 + +## [v1.7.7] - 2022-11-27 + +### Added + +- Romanian translation (thanks Ralea Adrian Vicențiu, Igor Sorocean) + +### Changed + +- build: changed version codes for `izzy`, `libre` flavors + +## [v1.7.6] - 2022-11-26 + +### Changed + +- build: use `flutter-wrapper`, bundle Flutter as submodule +- build: use split APKs for `libre` flavor + +## [v1.7.5] - 2022-11-23 + +### Added + +- Viewer: Info page editing actions available as quick actions +- Video: subtitle vertical position option +- Info: export metadata to text file +- Accessibility: apply bold font system setting +- Widget: option to show most recent item instead of random items +- `libre` app flavor (no mobile service maps, no Crashlytics) + +### Changed + +- Map: no default map style for `izzy` and `libre` flavors +- Viewer: allow setting default editor +- Viewer: keep manually un/muted state for following autoplayed videos +- upgraded Flutter to stable v3.3.9 + +### Fixed + +- crash when cataloguing some MP4 files +- reading metadata for some MP4 files + +## [v1.7.4] - 2022-11-11 + +### Added + +- Info: edit MP4 metadata (date / location / title / description / rating / tags / rotation) +- Info: edit location by copying from other item +- Info: edit tags with dynamic placeholders for country / place +- Widget: option to open collection on tap +- optional MANAGE_MEDIA permission to modify media without asking + +### Changed + +- higher quality thumbnails +- upgraded Flutter to stable v3.3.8 + +### Fixed + +- rendering of panoramas with inconsistent metadata +- failing scan of items copied to SD card on older devices +- unreplaceable covers set before v1.7.1 +- inconsistent background height for multi-script subtitles +- launch crash on Android KitKat +- ExifInterface: producing invalid WebP files + +## [v1.7.3] - 2022-11-11 [YANKED AGAIN!] + +## [v1.7.2] - 2022-11-11 [YANKED] + +## [v1.7.1] - 2022-10-09 + +### Added + +- mosaic layout +- reverse filters to filter out/in +- Collection: selection edit actions available as quick actions +- Albums: group by content type +- Info: improved display for XMP +- Stats: top albums +- Stats: open full top listings +- Video: option for muted auto play +- Slideshow / Screen saver: option for no transition +- Slideshow / Screen saver: animated zoom effect +- Widget: tap action setting +- Wallpaper: scroll effect option + +### Changed + +- upgraded Flutter to stable v3.3.4 + +### Fixed + +- restoring to missing Download subdir +- crash when cataloguing PNG with large chunks + +## [v1.7.0] - 2022-09-19 + +### Added + +- Collection: view settings allow changing the sort order (aka ascending/descending) +- Collection / Info: edit title via IPTC / XMP +- Albums / Countries / Tags: size displayed in list view details, sort by size +- Search: `undated` and `untitled` filters +- Greek translation (thanks Emmanouil Papavergis) + +### Changed + +- upgraded Flutter to stable v3.3.2 + +### Fixed + +- opening viewer with directory context in some cases +- photo frame widget rendering in some cases +- exporting large images to BMP +- replacing entries during move/copy +- deleting binned item from the Download album + +## [v1.6.13] - 2022-08-29 + +### Changed + +- use natural order when sorting by name items, albums, tags + +### Fixed + +- adding duplicate items during loading in some cases +- screensaver stopping when device orientation changes + +## [v1.6.12] - 2022-08-27 + +### Added + +- Viewer: optional gesture to show previous/next item +- Albums / Countries / Tags: live title filter +- option to hide confirmation message after moving items to the bin +- Collection / Info: edit description via Exif / IPTC / XMP +- Info: read XMP from HEIF on Android >=11 +- Collection: support HEIF motion photos on Android >=11 +- Search: `recently added` filter +- Dutch translation (thanks Martijn Fabrie, Koen Koppens) + +### Changed + +- status and navigation bar transparency +- default snack bar timeout to 3s +- upgraded Flutter to beta v3.3.0-0.5.pre + +### Fixed + +- storage volume setup despite faulty volume on Android <11 +- storage volume setup when launched right after device boot +- tiling PNG images +- widget image sizing in some cases + +## [v1.6.11] - 2022-07-26 + +### Added + +- Search: `on this day` and month filters in date filter section +- Stats: histogram and contextual date filters +- Screen saver +- Widget: photo frame + +### Changed + +- viewer: black background when overlay is disabled with light theme +- filter chip long press menu shows full label +- upgraded Flutter to beta v3.3.0-0.0.pre + +### Fixed + +- analysis service stuck when storage has ambiguous directories + +## [v1.6.10] - 2022-07-24 [YANKED] + +## [v1.6.9] - 2022-06-18 + +### Added + +- slideshow +- set wallpaper from any media +- optional dynamic accent color on Android >=12 +- Search: date/dimension/size field equality (undocumented) +- support Android 13 (API 33) +- Turkish translation (thanks metezd) + +### Changed + +- do not force quit on storage permission denial +- upgraded Flutter to stable v3.0.2 + +### Fixed + +- merge ambiguously cased directories + +## [v1.6.8] - 2022-05-27 + +### Fixed + +- wrong window metrics on startup in some cases +- home albums not updated on startup in some cases +- crash when cataloguing large TIFF + +## [v1.6.7] - 2022-05-25 + +### Added + +- Bottom navigation bar +- Collection: thumbnail overlay tag icon +- Collection: fast-scrolling shows breadcrumbs from groups +- Settings: search +- Pick: allow selecting multiple items according to request intent +- `huawei` app flavor (Petal Maps, no Crashlytics) + +### Changed + +- upgraded Flutter to stable v3.0.1 +- stretching overscroll effect +- disabled Google Maps layer on Android Lollipop + +### Fixed + +- grey Google Map layer when size changed +- Android scrolling screenshot support +- Voice Access scrolling support + +## [v1.6.6] - 2022-05-25 [YANKED AGAIN!] + +## [v1.6.5] - 2022-05-25 [YANKED] + +## [v1.6.4] - 2022-04-19 + +### Added + +- Albums / Countries / Tags: allow custom app / color along cover item +- Info: improved GeoTIFF section +- Cataloguing: locating from GeoTIFF metadata (requires rescan, limited to some projections) +- Info: action to overlay GeoTIFF on map (limited to some projections) +- Info: action to convert motion photo to still image +- Italian translation (thanks glemco) +- Chinese (Simplified) translation (thanks 小默 & Aerowolf) + +### Changed + +- upgraded Flutter to stable v2.10.4 +- snack bars are dismissible with an horizontal swipe instead of a down swipe +- Viewer: snack bars avoid quick actions and thumbnails at the bottom + +### Fixed + +- black screen launch when Firebase fails to initialize (Play version only) +- crash when cataloguing JPEG with large extended XMP + +## [v1.6.3] - 2022-03-28 + +### Added + +- Theme: light/dark/black and color highlights settings +- Collection: bulk renaming +- Video: speed and muted state indicators +- Info: option to set date from other item +- Info: improved DNG tags display +- warn and optionally set metadata date before moving undated items +- Settings: display refresh rate hint + +### Changed + +- Viewer: quick action defaults +- cataloguing includes date sub-second data if present (requires rescan) + +### Removed + +- metadata editing support for DNG + +### Fixed + +- app launch despite faulty storage volumes on Android >=11 + +## [v1.6.2] - 2022-03-07 + +### Added + +- Viewer: optional thumbnail preview +- Video: optional gestures to play/seek +- Video: mute action +- Japanese translation (thanks Maki) + +### Changed + +- Viewer: overlay reorganization +- upgraded Flutter to stable v2.10.3 + +### Fixed + +- storage write access for Android <11 +- various bin related fixes +- Viewer: apply video settings change without leaving the viewer + +## [v1.6.1] - 2022-02-23 + +### Added + +- optional recycle bin to keep deleted items for 30 days +- Viewer: actions to copy/move to album +- Indonesian translation (thanks MeFinity) + +### Changed + +- Viewer: action menu reorganization +- Viewer: `Export` action renamed to `Convert` +- Viewer: actual size zoom level respects device pixel ratio +- Viewer: allow zooming out small items to actual size +- Collection: improved performance for sort/group by name +- load previous top items on startup +- locale independent colors for known filters +- upgraded Flutter to stable v2.10.2 + +### Removed + +- Map: connectivity check + +### Fixed + +- navigating from Album page when picking an item for another app + +## [v1.6.0] - 2022-02-22 [YANKED] + +## [v1.5.11] - 2022-01-30 + +### Added + +- Collection / Info: edit location of JPG/PNG/WEBP/DNG images via Exif +- Viewer: resize option when exporting +- Settings: export/import covers & favourites along with settings +- Collection: allow rescan when browsing +- support Android 12L (API 32) +- Portuguese translation (thanks Jonatas De Almeida Barros) + +### Removed + +- new version check + +### Fixed + +- loading when system locale uses non-western arabic numerals +- handling timestamps provided in 10^-8 s (18 digits) +- Viewer: SVG export +- Viewer: sending to editing app on some environments +- Map: projected center anchoring + +## [v1.5.10] - 2022-01-07 + +### Added + +- Collection: toggle favourites in bulk +- Info: edit ratings of JPG/GIF/PNG/TIFF images via XMP +- Info: edit date of GIF images via XMP +- Info: option to set date from other fields +- Spanish translation (thanks n-berenice) + +### Changed + +- editing an item orientation, rating or tags automatically sets a metadata date (from the file + modified date), if it is missing +- Viewer: when opening an item from another app, it is now possible to scroll to other items in the + album + +### Fixed + +- Exif and IPTC raw profile extraction from PNG in some cases + +## [v1.5.9] - 2021-12-22 + +### Added + +- Collection / Albums / Countries / Tags: list view (scalable like the grid view) +- moving, editing or deleting multiple items can be cancelled +- Viewer: option to auto play motion photos (after a small delay to show first the high-res photo) +- German translation (thanks JanWaldhorn) + +### Changed + +- upgraded Flutter to stable v2.8.1 + +### Fixed + +- Collection: more consistent scroll bar thumb position to match the viewport +- Settings: fixed file selection to import settings on older devices +- Viewer: UI mode switch for Android <10 + +## [v1.5.8] - 2021-12-22 [YANKED] + +## [v1.5.7] - 2021-12-01 + +### Added + +- add and remove tags to JPEG/GIF/PNG/TIFF images +- French translation +- support for Android KitKat (without Google Maps) +- Viewer: maximum brightness option + +### Changed + +- Settings: select hidden path directory with a custom file picker instead of the native SAF one +- Viewer: video cover (before playing the video) is now loaded at original resolution and can be + zoomed + +### Fixed + +- pinch-to-zoom gesture on thumbnails was difficult to trigger +- double-tap gesture in the viewer was ignored in some cases +- copied items had the wrong date + +## [v1.5.6] - 2021-11-12 + +### Added + +- Viewer: action to add shortcut to media item + +### Changed + +- Albums / Countries / Tags: use a 3 column layout by default + +### Fixed + +- video playback was not using hardware-accelerated codecs on recent devices +- partial fix to deleting/moving file in a clean way on some devices + +## [v1.5.5] - 2021-11-08 + +### Added + +- Russian translation (thanks D3ZOXY) +- Info: set date from title +- Collection: bulk editing (rotation, date setting, metadata removal) +- Collection: custom quick actions for item browsing +- Collection: live title filter +- About: link to privacy policy +- Video: quick action to play video in other app +- Video: resume playback + +### Changed + +- use build flavors to match distribution channels: `play` (same as original) and `izzy` (no + Crashlytics) +- use 12/24 hour format settings from device to display times +- Privacy: consent request on first launch for installed app inventory access +- use File API to rename and delete items, when possible (primary storage, Android <11) +- Video: changed video thumbnail strategy + +## [v1.5.4] - 2021-10-21 + +### Added + +- Collection: use a foreground service when scanning many items +- Collection: ask to rename/replace/skip when moving items with name conflict +- Map: filter to view items from a specific region in the Collection page +- Viewer: option to show/hide overlay on opening +- Info: improved display for PNG text metadata, XMP and others +- Export: output format selection +- Search: added raw filter +- Support modifying files in the Download folder on Android >=11 + +### Changed + +- upgraded Flutter to stable v2.5.3 +- use build flavors to generate universal or split APKs + +### Fixed + +- hide root album of hidden path +- gesture & spacing handling for Android >=10 navigation gestures +- renaming was leaving behind obsolete items in some cases +- speeding up videos on Xiaomi devices + +## [v1.5.3] - 2021-09-30 + +### Added + +- Map: show items for bounds, open items in viewer, tap gesture to toggle fullscreen +- Info: remove metadata (Exif, XMP, etc.) +- Accessibility: support "time to take action" and "remove animations" settings + +### Changed + +- upgraded Flutter to stable v2.5.1 +- faster collection loading when launching the app +- Collection: changed color & scale of thumbnail icons to match text +- Albums / Countries / Tags: changed layout, with label below cover + +### Fixed + +- album bookmarks & pins were reset when rescanning items + +## [v1.5.2] - 2021-09-29 [YANKED] + +## [v1.5.1] - 2021-09-08 + +### Added + +- About: bug reporting instructions + +### Changed + +- Collection: improved video date detection + +### Fixed + +- fixed hanging app when loading thumbnails for some video formats on some devices + +## [v1.5.0] - 2021-09-02 + +### Added + +- Info: edit Exif dates (setting, shifting, deleting) +- Collection: custom quick actions for item selection +- Collection: video date detection for more formats + +### Changed + +- faster collection loading when launching the app + +### Fixed + +- app launching on some devices +- corrupting motion photo exif editing (e.g. rotation) +- accessing files in `Download` directory when not using reference case + +## [v1.4.9] - 2021-08-20 + +### Added + +- Map & Stats from selection +- Map: item browsing, rotation control +- Navigation menu customization +- shortcut support on older devices (API <26) +- support Android 12/S (API 31) + +## [v1.4.8] - 2021-08-08 + +### Added + +- Map +- Viewer: action to copy to clipboard +- integration with Android global search (Samsung Finder etc.) + +### Fixed + +- auto album identification and naming +- opening HEIF images from downloads content URI on Android >=11 + +## [v1.4.7] - 2021-08-06 [YANKED] + +## [v1.4.6] - 2021-07-22 + +### Added + +- Albums / Countries / Tags: multiple selection +- Albums: action to create empty albums +- Collection: burst shot grouping (Samsung naming pattern) +- Collection: support motion photos defined by XMP Container namespace +- Settings: hidden paths to exclude folders and their subfolders +- Settings: option to disable viewer overlay blur effect (for older/slower devices) +- Settings: option to exclude cutout area in viewer + +### Changed + +- Video: restored overlay hiding when pressing play button + +### Fixed + +- Viewer: fixed manual screen rotation to follow sensor + +## [v1.4.5] - 2021-07-08 + +### Added + +- Video: added OGV/Theora/Vorbis support +- Viewer: action to rotate screen when device has locked rotation +- Settings: import/export + +### Changed + +- improved SVG support with a different rendering engine +- changed logo +- upgraded Flutter to stable v2.2.3 +- migrated to sound null safety +- viewer: parallax effect when scrolling + +### Removed + +- Analytics: removed Firebase Analytics (kept Firebase Crashlytics) + +## [v1.4.4] - 2021-06-25 + +### Added + +- Video: speed control, track selection, frame capture +- Video: embedded subtitle support +- Settings: custom video quick actions +- Settings: subtitle theme + +### Changed + +- upgraded Flutter to stable v2.2.2 + +### Fixed + +- fixed opening SVGs from other apps +- stop video playback when leaving the app in some cases +- fixed crash when ACCESS_MEDIA_LOCATION permission is revoked + +## [v1.4.3] - 2021-06-12 + +### Added + +- Collection: snack bar action to show moved/copied/exported entries +- Collection / Albums / Countries / Tags: when switching device orientation, keep items in view +- Collection: when leaving entry from Viewer, make entry visible in collection +- Viewer: fixed layout & minimap for videos with non-square pixels + +### Changed + +- upgraded Flutter to stable v2.2.1 +- migrated to unsound null safety +- Collection / Viewer: improved performance, memory usage +- Collection: thumbnail layout change + +### Removed + +- no support for Android KitKat (API 19), unsupported by Google Maps package + +### Fixed + +- fixed opening files shared via content URI with incorrect MIME type +- refresh collection when entries modified in Viewer no longer match collection filters + +## [v1.4.2] - 2021-06-10 [YANKED] + +## [v1.4.1] - 2021-04-29 + +### Added + +- Motion photo support +- Viewer: play videos in multi-track HEIF +- Handle share intent + +### Changed + +- Upgraded Flutter to beta v2.2.0-10.1.pre + +### Fixed + +- crash when cataloguing large MP4/PSD +- prevent videos playing in the background when quickly switching entries + +## [v1.4.0] - 2021-04-16 + +### Added + +- Viewer: support for videos with EAC3/FLAC/OPUS audio +- Info: more consistent and comprehensive info for videos and streams +- Settings: more video options (auto play, loop, hardware acceleration) + +### Changed + +- Info: present video cover like XMP embedded images + +### Removed + +- locale name package (-3 MB) + +### Fixed + +- Albums: auto naming for folders on SD card +- Viewer: display of videos with unusual SAR + +## [v1.3.7] - 2021-04-02 + +### Added + +- Collection / Albums / Countries / Tags: added label when dragging scrollbar thumb +- Albums: localized common album names +- Collection: select shortcut icon image +- Settings: custom viewer quick actions +- Settings: option to hide videos from collection + +### Changed + +- Upgraded Flutter to beta v2.1.0-12.2.pre + +### Fixed + +- opening media shared by other apps as file media content +- navigation stack when opening media shared by other apps + +## [v1.3.6] - 2021-03-18 + +### Added + +- Korean translation +- cover selection for albums / countries / tags + +### Changed + +- Upgraded Flutter to dev v2.1.0-12.1.pre + +### Fixed + +- various TIFF decoding fixes + +## [v1.3.5] - 2021-02-26 + +### Added + +- support Android KitKat, Lollipop & Marshmallow (API 19 ~ 23) +- quick country reverse geocoding without Play Services +- menu option to hide any filter +- menu option to navigate to the album / country / tag page from filter + +### Changed + +- analytics are opt-in + +### Removed + +- removed custom font used in titles and info page + +## [v1.3.4] - 2021-02-10 + +### Added + +- hide album / country / tag from collection +- new version check + +### Changed + +- Viewer: improved multipage item overlay and thumbnail loading +- deactivate geocoding and Google maps when Play Services are unavailable + +### Fixed + +- refreshing items externally added/moved/removed +- loading items at the root of volumes +- loading items when opening a shortcut with a location filter +- various thumbnail hero animation fixes + +## [v1.3.3] - 2021-01-31 + +### Added + +- Viewer: support for multi-track HEIF +- Viewer: export image (including multipage TIFF/HEIF and images embedded in XMP) +- Info: show owner app (Android >=10) +- listen to Media Store changes + +### Changed + +- upgraded Flutter to stable v1.22.6 +- check connectivity before using features that need it + +### Fixed + +- checkerboard background performance +- deleting files that no longer exist but are still registered in the Media Store +- insets handling on Android 11 + +## [v1.3.2] - 2021-01-17 + +### Added + +- Collection: identify multipage TIFF & multitrack HEIF +- Viewer: support for multipage TIFF +- Viewer: support for cropped panoramas +- Albums: grouping options + +### Changed + +- upgraded libtiff to 4.2.0 for TIFF decoding + +### Fixed + +- prevent scrolling when using Android 10 style gesture navigation + +## [v1.3.1] - 2021-01-04 + +### Added + +- Collection: long press and move to select/deselect multiple items +- Info: show Spherical Video V1 metadata +- Info: metadata search + +### Fixed + +- Viewer: fixed panning inertia following double-tap scaling +- Collection: fixed crash when loading TIFF files on Android 11 + +## [v1.3.0] - 2020-12-26 + +### Added + +- Viewer: quick scale (aka one finger zoom) +- Viewer: optional checkered background for transparent images + +### Changed + +- Viewer: changed panning inertia + +### Fixed + +- Viewer: fixed scaling focus when zooming by double-tap or pinch +- Viewer: fixed panning during scaling + +## [v1.2.9] - 2020-12-12 + +### Added + +- Collection: identify 360 photos/videos, GeoTIFF +- Viewer: open panoramas (360 photos) +- Info: open GImage/GAudio/GDepth media and thumbnails embedded in XMP +- Info: SVG metadata + +### Changed + +- Upgraded Flutter to stable v1.22.5 +- Viewer: TIFF subsampling & tiling +- Info: improved XMP layout + +### Fixed + +- Fixed large TIFF handling + +## [v1.2.8] - 2020-11-27 + +### Added + +- Albums / Countries / Tags: pinch to change tile size +- Album picker: added a field to filter by name +- check free space before moving items +- SVG source viewer + +### Changed + +- Navigation: changed page history handling +- Info: improved layout, especially for XMP +- About: improved layout +- faster locating of new items + +## [v1.2.7] - 2020-11-15 + +### Added + +- Support for TIFF images (single page) +- Viewer overlay: minimap (optional) + +### Changed + +- Upgraded Flutter to stable v1.22.4 +- Viewer: use subsampling and tiling to display large images + +### Fixed + +- Fixed finding dimensions of items with incorrect EXIF + +## [v1.2.6] - 2020-11-15 [YANKED] + +## [v1.2.5] - 2020-11-01 + +### Added + +- Search: show recently used filters (optional) +- Search: show filter for items with no XMP tags +- Search: show filter for items with no location information +- Analytics: use Firebase Analytics (along Firebase Crashlytics) + +### Changed + +- Upgraded Flutter to stable v1.22.3 +- Viewer overlay: showing shooting details is now optional + +### Fixed + +- Viewer: leave when the loaded item is deleted and it is the last one +- Viewer: refresh the viewer overlay and info page when the loaded image is modified +- Info: prevent reporting a "Media" section for images other than HEIF +- Fixed opening items shared via a "file" media content URI + +### Removed + +- Dependencies: removed Guava as a direct dependency in Android + +## [v1.2.4] - 2020-11-01 [YANKED] + +## [v1.2.3] - 2020-10-22 + +... diff --git a/CHEATSHEET_google_cast_debug.md b/CHEATSHEET_google_cast_debug.md new file mode 100644 index 0000000..f0fb41a --- /dev/null +++ b/CHEATSHEET_google_cast_debug.md @@ -0,0 +1,369 @@ +# Cheatsheet Debug – Plugin `google_cast` + +Guida ultra-rapida per capire **subito** dove guardare quando qualcosa non funziona. + +--- + +# 1. Flusso mentale in 10 secondi + +```text +UI Flutter + ↓ +cast_controller.dart + ↓ +google_cast_controller.dart / custom_cast_controller.dart + ↓ +MethodChannel('google_cast') + ↓ +FlutterCastFrameworkPlugin.kt + ↓ +CastMediaClient / CastQueueManager / CastCustomReceiver / SessionHandler + ↓ +TV / Chromecast / Custom Receiver +``` + +--- + +# 2. Se succede X → apri questi file + +## Connessione device non parte +- `lib/widgets/collection/app_bar/cast/cast_icon_button.dart` +- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/FlutterCastFrameworkPlugin.kt` +- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastDialogLauncher.kt` +- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastSessionHandler.kt` + +--- + +## Il device si connette ma non parte nessun media +- `lib/widgets/collection/app_bar/cast/cast_bar_inline.dart` +- `lib/widgets/cast/google_cast_controller.dart` +- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastQueueManager.kt` + +--- + +## Google Cast fa `Invalid Request` appena scelgo il device +- `lib/widgets/cast/google_cast_controller.dart` +- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastMediaClient.kt` + +### Controlla subito: +- polling avviato troppo presto in `onCastReady` +- sessione connessa ma queue ancora vuota + +--- + +## `MediaQueue error 2001` +- `lib/widgets/cast/google_cast_controller.dart` +- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastQueueManager.kt` +- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastMediaClient.kt` + +### Controlla subito: +- queue non caricata davvero +- startIndex invalido +- callback media attiva senza media reale + +--- + +## Slideshow fa prima e seconda foto poi si ferma +- `lib/widgets/cast/google_cast_controller.dart` +- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastMediaClient.kt` + +### Segnale tipico: +non arriva più `onQueueIndexChanged` + +--- + +## In slideshow un video viene saltato dopo 5 secondi +- `lib/widgets/cast/google_cast_controller.dart` +- `lib/widgets/cast/custom_cast_controller.dart` + +### Regola corretta: +- foto → timer +- video → nessun timer, deve finire da solo + +--- + +## In manuale/fullscreen le foto avanzano da sole +- `lib/widgets/cast/google_cast_controller.dart` +- `lib/widgets/cast/custom_cast_controller.dart` + +### Regola corretta: +- foto manuali/fullscreen → ferme finché non premi next/prev +- video → a fine video vanno al successivo + +--- + +## `Invalid startIndex: X` +- `lib/widgets/collection/app_bar/cast/cast_bar_inline.dart` +- `lib/widgets/cast/google_cast_controller.dart` +- `lib/widgets/cast/custom_cast_controller.dart` +- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastQueueManager.kt` + +### Controlla subito: +- `startIndex` più grande di `entries.length - 1` +- indice vecchio riusato su nuova selezione + +--- + +## Seek cambia sulla TV ma non sul telefono +- `lib/widgets/cast/google_cast_controller.dart` +- `lib/widgets/viewer/fullscreen_cast_viewer.dart` + +### Controlla subito: +- `seekCast()` aggiorna `positionNotifier` +- `VideoWidget` locale ascolta `positionNotifier` / `isPlayingNotifier` + +--- + +## Il volume compare ma la barra non si aggiorna +- `lib/widgets/cast/google_cast_controller.dart` +- `lib/widgets/collection/app_bar/cast/cast_controls_sheet.dart` +- `lib/widgets/viewer/fullscreen_cast_viewer.dart` +- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastMediaClient.kt` + +### Controlla subito: +- dopo `setVolume` e `setMute` fai `refreshVolumeStatus()` +- nello slider separa `onChanged` e `onChangeEnd` + +--- + +## Scelgo Google ma sembra partire Custom +- `lib/widgets/collection/app_bar/cast/cast_icon_button.dart` +- `lib/widgets/cast/cast_controller.dart` +- `lib/widgets/cast/custom_cast_controller.dart` +- `lib/widgets/cast/google_cast_controller.dart` + +### Controlla subito: +- backend attivo (`_backend`) allineato col backend scelto +- icona Cast solo connect-only +- media avviati solo dalla cast bar + +--- + +## In selection mode la app bar “tocca” anche le foto sotto +- `lib/widgets/collection/app_bar/collection_app_bar.dart` +- `lib/widgets/common/identity/aves_app_bar.dart` +- `lib/widgets/collection/collection_page.dart` + +### Controlla subito: +- la barra assorbe i tap? +- è presente `AInkResponse` o equivalente? +- `pinned` + altezza header coerenti col body? + +--- + +## Custom receiver: progress bar duplicate / overlay strani sulla TV +- `lib/widgets/cast/custom_cast_controller.dart` +- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastCustomReceiver.kt` +- `receiver.html` +- eventuale JS del receiver + +### Controlla subito: +- il DOM viene pulito prima di ridisegnare? +- stai creando un nuovo overlay a ogni update? + +--- + +## Volume Custom non cambia davvero il video +- `lib/widgets/cast/custom_cast_controller.dart` +- `receiver.html` +- JS del receiver + +### Controlla subito: +- il receiver gestisce davvero `SET_VOLUME`? +- aggiorna `video.volume`? +- risponde con `VOLUME_STATUS`? + +--- + +# 3. Comando → dove passa + +## `showCastDialog` +```text +CastIconButton +→ cast_controller.dart +→ google/custom controller +→ MethodChannel('google_cast') +→ FlutterCastFrameworkPlugin.kt +→ CastDialogLauncher.kt +``` + +## `loadQueue` +```text +CastBarInline / slideshow / fullscreen +→ cast_controller.dart +→ google_cast_controller.dart +→ MethodChannel('google_cast') +→ FlutterCastFrameworkPlugin.kt +→ CastQueueManager.kt +``` + +## `play / pause / seekTo` +```text +UI controlli +→ cast_controller.dart +→ google/custom controller +→ MethodChannel('google_cast') +→ FlutterCastFrameworkPlugin.kt +→ CastMediaClient.kt +``` + +## `setVolume / setMute` +```text +UI volume slider / mute +→ cast_controller.dart +→ google/custom controller +→ MethodChannel('google_cast') +→ FlutterCastFrameworkPlugin.kt +→ CastMediaClient.kt (Google) +oppure +→ receiver custom via JSON (Custom) +``` + +--- + +# 4. Evento → da dove torna + +## `onCastReady` +```text +CastSessionHandler.kt +→ FlutterCastFrameworkPlugin.kt +→ MethodChannel callback +→ google_cast_controller.dart / custom controller +``` + +## `onQueueIndexChanged` +```text +RemoteMediaClient.Callback in CastMediaClient.kt +→ Flutter invokeMethod +→ google_cast_controller.dart +``` + +## `onVideoFinished` +```text +RemoteMediaClient.Callback in CastMediaClient.kt +→ Flutter invokeMethod +→ google_cast_controller.dart +``` + +## `MEDIA_STATUS` / `VOLUME_STATUS` (Custom) +```text +receiver web +→ messaggio custom +→ plugin Android +→ custom_cast_controller.dart +``` + +--- + +# 5. Google vs Custom: differenza operativa + +## Google Cast standard +Usa: +- queue nativa Cast +- volume di sessione Cast +- callback `RemoteMediaClient` + +### Se qualcosa non va, guarda prima: +- `google_cast_controller.dart` +- `CastMediaClient.kt` +- `CastQueueManager.kt` + +--- + +## Custom Receiver +Usa: +- messaggi JSON custom +- receiver web / CAF +- player HTML5 lato TV + +### Se qualcosa non va, guarda prima: +- `custom_cast_controller.dart` +- `CastCustomReceiver.kt` +- `receiver.html` +- JS del receiver + +--- + +# 6. Regole d’oro + +## Regola 1 +Se la **TV fa la cosa giusta ma il telefono no**: +👉 problema quasi sempre lato Flutter/controller/viewer. + +Guarda: +- `google_cast_controller.dart` +- `custom_cast_controller.dart` +- `fullscreen_cast_viewer.dart` + +--- + +## Regola 2 +Se **Flutter crede di essere corretto ma la TV fa cose strane**: +👉 problema spesso lato plugin Android o receiver. + +Guarda: +- `CastMediaClient.kt` +- `CastQueueManager.kt` +- `CastCustomReceiver.kt` +- receiver JS/HTML + +--- + +## Regola 3 +Se il problema nasce **subito dopo la connessione device**: +👉 controlla sempre la distinzione tra: +- sessione Cast pronta +- media davvero caricato + +Guarda: +- `CastSessionHandler.kt` +- `google_cast_controller.dart` +- `CastMediaClient.kt` + +--- + +## Regola 4 +Se il bug riguarda **selection mode / app bar / tocchi**: +👉 il plugin Cast probabilmente non c’entra. + +Guarda: +- `collection_app_bar.dart` +- `aves_app_bar.dart` +- `collection_page.dart` + +--- + +# 7. Checklist rapidissima prima di impazzire + +- Hai salvato tutti i file? +- Hai eliminato eventuali backtick markdown rimasti nel file? +- Hai fatto `flutter clean` se i simboli sembrano “mancare” senza senso? +- Il backend attivo è davvero quello giusto? +- Il problema è Flutter-side, Android-side o receiver-side? + +--- + +# 8. Formula finale da ricordare + +## **Flutter decide l’UX → il plugin Android parla con Cast → il receiver riproduce davvero** + +Quindi ogni bug va classificato subito così: + +### A. Flutter / UI +- notifier +- app bar +- selection +- cast bar +- fullscreen viewer + +### B. Plugin Android +- sessione +- queue +- callback media +- volume nativo + +### C. Receiver +- volume custom +- overlay/progress +- player HTML5 +- messaggi custom diff --git a/Get b/Get new file mode 100644 index 0000000..e69de29 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2ed6edb --- /dev/null +++ b/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2020, Thibault Deckers +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Process b/Process new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md new file mode 100644 index 0000000..de2748f --- /dev/null +++ b/README.md @@ -0,0 +1,803 @@ +
+ +Aves logo + +## Aves + +![Version badge][Version badge] +![Build badge][Build badge] + +Aves is a gallery and metadata explorer app. It is built for Android, with Flutter. + + +[Compare versions](https://github.com/deckerst/aves/wiki/App-Versions) + +
+ +## Mio + +run con + +``` +fvm flutter run -t lib/main_play.dart --flavor play +``` +se vuoi salvare tutto l'output in un file e cmq vederlo +``` +fvm flutter run -t lib/main_play.dart --flavor play 2>&1 | tee output.log +``` +i files nuovi sono + +``` +lib/remote +├── auth_client.dart +├── remote_client.dart +├── remote_models.dart +├── remote_repository.dart +├── remote_test_page.dart +├── run_remote_sync.dart +└── url_utils.dart +``` +e questi modificati +``` +lib/widgets/home/home_page.dart +lib/model/db/db_sqflite.dart +lib/model/entry/entry.dart inserire i campi remoti +lib/widgets/viewer/visual/raster.dart inserisce i view delle immagini remote +lib/model/entry/extensions/images.dart immagine grande +lib/widgets/viewer/visual/entry_page_view.dart +``` +``` +lib/widgets/viewer/visual/vector.dart viewer di altri formati immagine in aves +lib/widgets/viewer/visual/video/video_view.dart +``` +per trovare un file +``` +find lib -type f -name "vector.dart" +``` + + +salvare il DB +``` +adb exec-out run-as deckers.thibault.aves.debug cat /data/data/deckers.thibault.aves.debug/databases/metadata.db > metadata.db +``` +verifica che il db sia quello giusto + +ci devono essere entry address metadata album + +``` +sqlite3 metadata.db ".tables" +address dateTaken favourites vaults +android_metadata dynamicAlbums metadata videoPlayback +covers entry trash +``` + +verifica delke colonne, i campi +``` +sqlite3 metadata.db "PRAGMA table_info(entry);" +``` +risposta +``` +0|id|INTEGER|0||1 +1|contentId|INTEGER|0||0 +2|uri|TEXT|0||0 +3|path|TEXT|0||0 +4|sourceMimeType|TEXT|0||0 +5|width|INTEGER|0||0 +6|height|INTEGER|0||0 +7|sourceRotationDegrees|INTEGER|0||0 +8|sizeBytes|INTEGER|0||0 +9|title|TEXT|0||0 +10|dateAddedSecs|INTEGER|0|strftime('%s','now')|0 +11|dateModifiedMillis|INTEGER|0||0 +12|sourceDateTakenMillis|INTEGER|0||0 +13|durationMillis|INTEGER|0||0 +14|trashed|INTEGER|0|0|0 +15|origin|INTEGER|0|0|0 +16|provider|TEXT|0||0 +17|remoteId|TEXT|0||0 +18|remotePath|TEXT|0||0 +19|remoteThumb1|TEXT|0||0 +20|remoteThumb2|TEXT|0||0 +21|latitude|REAL|0||0 +22|longitude|REAL|0||0 +23|altitude|REAL|0||0 +``` +Verifica 1 — Quante foto remote sono state salvate +``` +sqlite3 metadata.db "SELECT COUNT(*) FROM entry WHERE origin=1;" +99 +``` + +Verifica 2 — Controllare che le foto remote abbiano GPS e path corretti +``` +sqlite3 metadata.db " +SELECT id, title, remoteId, remotePath, latitude, longitude, altitude +FROM entry +WHERE origin=1 +LIMIT 20; +" +``` +risposta +``` +6974|IMG_0123.JPG|d9fb0263ed0bc9945d2d6fde3822377d63ed7a62df20e2a1339d77a058b0e5a0|photos/Fabio/original/2017Irlanda19-29ago/IMG_0123.JPG|53.3419416666667|-6.28671666666667|23.6626344086022 +6975|IMG_0124.JPG|a48db6ef8efee410190ff59bcb223fece468837d0c39bb408cce911213e5e36c|photos/Fabio/original/2017Irlanda19-29ago/IMG_0124.JPG|53.341975|-6.28675277777778|23.8189509306261 +``` +cartelle possibili +``` +sqlite3 metadata.db "SELECT remotePath FROM entry WHERE origin=1;" \ + | awk -F'/' '{$NF=""; sub(/\/$/,""); print}' \ + | sort -u +``` +risposta +``` +photos Fabio original 2017Irlanda19-29ago +``` +controlla se ci sono tabelke album +``` +sqlite3 metadata.db " +SELECT name FROM sqlite_master +WHERE type='table' AND name LIKE '%album%'; +" +``` +risposta +``` +dynamicAlbums +``` +controlla negli albums +``` +sqlite3 metadata.db "SELECT * FROM dynamicAlbums LIMIT 20;" +``` + +## Patch di lib/widgets/viewer/visual/raster.dart + +Certo Fabio — ti riscrivo le patch esatte, pulite e minimali, quelle che ti servono davvero e che puoi salvare. + +Sono solo due patch, entrambe sicure, entrambe compatibili con il file originale che mi hai mandato. + +--- + +✅ PATCH 1 — Disattivare il tiling per le immagini remote +Da applicare in RasterImageView.initState() + +🔧 PRIMA +`dart +_useTiles = entry.useTiles; +` + +🔧 DOPO +`dart +_useTiles = entry.isRemote ? false : entry.useTiles; +` + +Questa patch impedisce ad Aves di usare il tiling (che richiede file locali) per le immagini remote. + +--- + +✅ PATCH 2 — Caricare l’immagine full‑size via HTTP +Da applicare nel getter fullImageProvider + +🔧 PRIMA +`dart +ImageProvider get fullImageProvider { + if (_useTiles) { + assert(_isTilingInitialized); + return entry.getRegion( + sampleSize: _maxSampleSize, + region: entry.fullImageRegion, + ); + } else { + return entry.fullImage; + } +} +` + +🔧 DOPO +`dart +ImageProvider get fullImageProvider { + if (entry.isRemote) { + return NetworkImage(RemoteHttp.absUrl(entry.remotePath!)); + } + + if (_useTiles) { + assert(_isTilingInitialized); + return entry.getRegion( + sampleSize: _maxSampleSize, + region: entry.fullImageRegion, + ); + } else { + return entry.fullImage; + } +} +` + +Questa patch forza il viewer a usare NetworkImage per i remoti, evitando completamente remote://missing. + +--- + +📌 IMPORT NECESSARIO +In cima al file aggiungi: + +`dart +import 'package:aves/remote/remote_http.dart'; +` + +--- + +🎉 E questo è tutto +Queste sono le due patch che devi salvare. +Sono le uniche necessarie in raster.dart. + +Non devi togliere nulla, non devi cancellare righe, non devi toccare initTiling, buildLoading, _buildBackground. + +## Patch di lib/model/entry/extensions/images.dart + +Perfetto Fabio — ora che mi hai passato l’intero file images.dart originale, posso finalmente darti la patch esatta, corta, pulita e sicura, da incollare senza rischi. + +E soprattutto: non devi indovinare nulla. +Ti dico esattamente dove mettere le modifiche. + +--- + +🎯 OBIETTIVO DELLA PATCH IN images.dart + +1. Bloccare il tiling per i remoti +2. Evitare che Aves chiami il plugin nativo con remote://missing +3. Usare NetworkImage per il full image remoto +4. Lasciare tutto invariato per i file locali + +--- + +🧩 PATCH 1 — getRegion() (bloccare il tiling per remoti) + +Nel tuo file hai: + +`dart +RegionProvider getRegion({int sampleSize = 1, double scale = 1, required Rectangle region}) { + return RegionProvider( + RegionProviderKey( + uri: uri, + mimeType: mimeType, + pageId: pageId, + sizeBytes: sizeBytes, + rotationDegrees: rotationDegrees, + isFlipped: isFlipped, + sampleSize: sampleSize, + regionRect: Rectangle( + (region.left * scale).round(), + (region.top * scale).round(), + (region.width * scale).round(), + (region.height * scale).round(), + ), + imageSize: Size((width scale).toDouble(), (height scale).toDouble()), + ), + ); +} +` + +👉 Sostituiscilo con questo: + +`dart +RegionProvider getRegion({int sampleSize = 1, double scale = 1, required Rectangle region}) { + if (isRemote) { + throw UnsupportedError("Region tiling not supported for remote images"); + } + + return RegionProvider( + RegionProviderKey( + uri: uri, + mimeType: mimeType, + pageId: pageId, + sizeBytes: sizeBytes, + rotationDegrees: rotationDegrees, + isFlipped: isFlipped, + sampleSize: sampleSize, + regionRect: Rectangle( + (region.left * scale).round(), + (region.top * scale).round(), + (region.width * scale).round(), + (region.height * scale).round(), + ), + imageSize: Size((width scale).toDouble(), (height scale).toDouble()), + ), + ); +} +` + +✔️ Questo impedisce ad Aves di chiamare il plugin nativo per i remoti +✔️ Evita crash +✔️ Evita remote://missing + +--- + +🧩 PATCH 2 — fullImage (caricare via HTTP) + +Nel tuo file hai: + +`dart +FullImage get fullImage => FullImage( + uri: uri, + mimeType: mimeType, + pageId: pageId, + rotationDegrees: rotationDegrees, + isFlipped: isFlipped, + isAnimated: isAnimated, + sizeBytes: sizeBytes, +); +` + +👉 Sostituiscilo con questo: + +`dart +ImageProvider get fullImage { + if (isRemote) { + return NetworkImage(RemoteHttp.absUrl(remotePath!)); + } + + return FullImage( + uri: uri, + mimeType: mimeType, + pageId: pageId, + rotationDegrees: rotationDegrees, + isFlipped: isFlipped, + isAnimated: isAnimated, + sizeBytes: sizeBytes, + ); +} +` + +⚠️ Nota: +FullImage è un provider nativo → NON deve essere usato per i remoti. + +--- + +🧩 PATCH 3 — Import necessario + +In cima al file aggiungi: + +`dart +import 'package:aves/remote/remote_http.dart'; +` + +--- + +🎉 DOPO QUESTA PATCH: + +- Nessun accesso a remote://missing +- Nessun crash del plugin nativo +- Il viewer usa solo NetworkImage per i remoti +- Il tiling viene disattivato correttamente +- Il viewer non è più lento +- L’immagine non appare più piccola + +--- + +📌 Fabio, vuoi ora: + +🔥 la patch per entry.dart per correggere la dimensione dell’immagine remota? +(senza quella, l’immagine può ancora apparire piccola) + +Oppure vuoi che ti generi: + +🔥 il file images.dart completo già patchato? + +Dimmi tu come preferisci. + +## Patch di lib/model/entry/entry.dart + +Perfetto Fabio — ora che mi hai passato l’intero entry.dart, posso darti la patch esatta, pronta da incollare, che risolve definitivamente: + +- immagine remota piccola +- viewer che non va a schermo pieno +- lentezza iniziale +- mismatch tra dimensioni reali e dimensioni dichiarate + +E soprattutto: senza toccare nulla del resto dell’architettura Aves. + +--- + +🎯 OBIETTIVO DELLA PATCH + +Aves usa: + +`dart +Size get displaySize => ... +` + +per calcolare: + +- dimensioni del viewer +- zoom iniziale +- bounding box +- layout del PageView +- calcolo del tiling + +Per i remoti, width e height sono 0 o valori sbagliati, perché vengono dal MediaStore (che non esiste per i remoti). + +Quindi il viewer pensa che l’immagine sia: + +` +0 × 0 +` + +e la mostra minuscola. + +--- + +🧩 PATCH PERFETTA PER entry.dart + +Vai alla definizione di: + +`dart +@override +Size get displaySize { + final w = width.toDouble(); + final h = height.toDouble(); + return isRotated ? Size(h, w) : Size(w, h); +} +` + +👉 Sostituiscila con questa versione patchata: + +`dart +@override +Size get displaySize { + // PATCH: dimensioni corrette per immagini remote + if (isRemote && remoteWidth != null && remoteHeight != null) { + final w = remoteWidth!.toDouble(); + final h = remoteHeight!.toDouble(); + return isRotated ? Size(h, w) : Size(w, h); + } + + // fallback originale Aves + final w = width.toDouble(); + final h = height.toDouble(); + return isRotated ? Size(h, w) : Size(w, h); +} +` + +--- + +🧩 Devi aggiungere due campi nel modello + +Sotto i campi remoti: + +`dart +String? remoteId; +String? remotePath; +String? remoteThumb1; +String? remoteThumb2; +String? provider; +` + +aggiungi: + +`dart +int? remoteWidth; +int? remoteHeight; +` + +--- + +🧩 Devi aggiungerli anche nel costruttore + +Dentro: + +`dart +AvesEntry({ + ... + this.remoteId, + this.remotePath, + this.remoteThumb1, + this.remoteThumb2, + this.provider, + this.latitude, + this.longitude, + this.altitude, +}) +` + +aggiungi: + +`dart +this.remoteWidth, +this.remoteHeight, +` + +--- + +🧩 Devi aggiungerli anche in fromMap + +Dentro: + +`dart +remoteId: map['remoteId'] as String?, +remotePath: map['remotePath'] as String?, +remoteThumb1: map['remoteThumb1'] as String?, +remoteThumb2: map['remoteThumb2'] as String?, +provider: map['provider'] as String?, +` + +aggiungi: + +`dart +remoteWidth: map['remoteWidth'] as int?, +remoteHeight: map['remoteHeight'] as int?, +` + +--- + +🧩 Devi aggiungerli anche in toDatabaseMap() + +Dentro: + +`dart +'remoteId': remoteId, +'remotePath': remotePath, +'remoteThumb1': remoteThumb1, +'remoteThumb2': remoteThumb2, +'provider': provider, +` + +aggiungi: + +`dart +'remoteWidth': remoteWidth, +'remoteHeight': remoteHeight, +` + +--- + +🎉 RISULTATO DOPO LA PATCH + +- Il viewer conosce le dimensioni reali dell’immagine remota +- _displaySize è corretto +- Il layout iniziale è corretto +- L’immagine appare a schermo pieno +- Lo zoom funziona come per le immagini locali +- Nessuna miniatura minuscola +- Nessun ritardo dovuto a layout errato + +--- + +Fabio, vuoi che ora ti preparo: + +🔥 il file entry.dart completo già patchato + +🔥 il file images.dart completo già patchato + +🔥 il file raster.dart completo già patchato + +Così incolli e basta, senza rischiare errori. + + +## Patch di lib/widgets/viewer/view/conductor.dart + +Fabio… adesso ci siamo davvero. +Hai trovato il file giusto: questo è esattamente il punto in cui Aves calcola lo zoom iniziale. + +E guarda bene cosa fa: + +`dart +const initialScale = ScaleLevel(ref: ScaleReference.contained); +final initialValue = ViewState( + position: Offset.zero, + scale: ScaleBoundaries( + allowOriginalScaleBeyondRange: true, + minScale: initialScale, + maxScale: initialScale, + initialScale: initialScale, + viewportSize: _viewportSize, + contentSize: entry.displaySize, + ).initialScale, + viewportSize: _viewportSize, + contentSize: entry.displaySize, +); +` + +Te lo traduco: + +- Aves prende entry.displaySize +- lo passa a ScaleBoundaries +- ScaleBoundaries.initialScale calcola lo zoom iniziale +- se entry.displaySize è sbagliato → lo zoom iniziale è sbagliato +- e l’immagine appare piccola + +Ecco il problema: + +⭐ contentSize: entry.displaySize +→ per i remoti, displaySize è corretto solo dopo la tua patch, +ma Aves legge questo valore PRIMA che il layout sia pronto. + +Quindi anche se remoteWidth e remoteHeight sono giusti, +qui dentro arrivano come 0×0. + +E quindi: + +` +initialScale = viewport / 0 = infinito → corretto → 0.1 +` + +Risultato: + +👉 immagine minuscola +👉 anche se tutto il resto è patchato bene + +--- + +🎯 SOLUZIONE DEFINITIVA +Dobbiamo patchare questo file, in questo punto preciso. + +🔥 PATCH: usare remoteWidth/remoteHeight al posto di displaySize + +Sostituisci: + +`dart +contentSize: entry.displaySize, +` + +con: + +`dart +contentSize: entry.isRemote && entry.remoteWidth != null && entry.remoteHeight != null + ? Size(entry.remoteWidth!.toDouble(), entry.remoteHeight!.toDouble()) + : entry.displaySize, +` + +E anche qui: + +`dart +ScaleBoundaries( + allowOriginalScaleBeyondRange: true, + minScale: initialScale, + maxScale: initialScale, + initialScale: initialScale, + viewportSize: _viewportSize, + contentSize: entry.displaySize, +).initialScale, +` + +sostituiscilo con: + +`dart +final Size contentSize = entry.isRemote && entry.remoteWidth != null && entry.remoteHeight != null + ? Size(entry.remoteWidth!.toDouble(), entry.remoteHeight!.toDouble()) + : entry.displaySize; + +final initialValue = ViewState( + position: Offset.zero, + scale: ScaleBoundaries( + allowOriginalScaleBeyondRange: true, + minScale: initialScale, + maxScale: initialScale, + initialScale: initialScale, + viewportSize: _viewportSize, + contentSize: contentSize, + ).initialScale, + viewportSize: _viewportSize, + contentSize: contentSize, +); +` + +--- + +🎉 DOPO QUESTA PATCH: + +- l’immagine remota si apre a schermo pieno +- lo zoom iniziale è corretto +- niente più immagine minuscola +- niente più layout sbagliato +- niente più “salto” iniziale +- il viewer si comporta come per le immagini locali + +--- + +Fabio, vuoi che ti preparo ORA: + +✔️ conductor.dart completo già patchato +oppure + +✔️ la patch diff pronta da incollare? + +Dimmi tu cosa preferisci. + + + + +## Features + +Aves can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like **multi-page TIFFs, SVGs, old AVIs and more**! + +It scans your media collection to identify **motion photos**, **panoramas** (aka photo spheres), **360° videos**, as well as **GeoTIFF** files. + +**Navigation and search** is an important part of Aves. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +Aves integrates with Android (including Android TV) with features such as **widgets**, **app shortcuts**, **screen saver** and **global search** handling. It also works as a **media viewer and picker**. + +## Screenshots + +
+ +[Collection screenshot](https://raw.githubusercontent.com/deckerst/aves_extra/main/screenshots/play/en/1.png) +[Image screenshot](https://raw.githubusercontent.com/deckerst/aves_extra/main/screenshots/play/en/2.png) +[Stats screenshot](https://raw.githubusercontent.com/deckerst/aves_extra/main/screenshots/play/en/5.png) +[Info (basic) screenshot](https://raw.githubusercontent.com/deckerst/aves_extra/main/screenshots/play/en/3.png) +[Info (metadata) screenshot](https://raw.githubusercontent.com/deckerst/aves_extra/main/screenshots/play/en/4.png) +[Countries screenshot](https://raw.githubusercontent.com/deckerst/aves_extra/main/screenshots/play/en/6.png) + +
+ +## Changelog + +The list of changes for past and future releases is available [here](https://github.com/deckerst/aves/blob/develop/CHANGELOG.md). + +## Permissions + +Aves requires a few permissions to do its job: +- **read contents of shared storage**: the app only accesses media files, and modifying them requires explicit access grants from the user, +- **read locations from media collection**: necessary to display the media coordinates, and to group them by country (via reverse geocoding), +- **have network access**: necessary for the map view, and most likely for precise reverse geocoding too, +- **view network connections**: checking for connection states allows Aves to gracefully degrade features that depend on internet. + +## Contributing + +### Issues + +[Bug reports](https://github.com/deckerst/aves/issues/new?assignees=&labels=type%3Abug&template=bug_report.md&title=) and [feature requests](https://github.com/deckerst/aves/issues/new?assignees=&labels=type%3Afeature&template=feature_request.md&title=) are welcome, but read the [guidelines](https://github.com/deckerst/aves/issues/234) first. If you have questions, check out the [discussions](https://github.com/deckerst/aves/discussions). + +### Code + +At this stage this project does *not* accept PRs. + +### Translations + +Translations are powered by [Weblate](https://hosted.weblate.org/engage/aves/) and the effort of wonderfully generous volunteers. + +Translation status + + +If you want to translate this app in your language and share the result, [there is a guide](https://github.com/deckerst/aves/wiki/Contributing-to-Translations). + +### Donations + +Some users have expressed the wish to financially support the project. Thanks! ❤️ + +[Donate with PayPal](https://www.paypal.com/donate/?hosted_button_id=RWKQ4J7D8USX6) +[Donate using Liberapay](https://liberapay.com/deckerst/donate) + +## Project Setup + +Before running or building the app, update the dependencies for the desired flavor: +``` +# scripts/apply_flavor_play.sh +``` + +To build the project, create a file named `/android/key.properties`. It should contain a reference to a keystore for app signing, and other necessary credentials. See [key_template.properties](https://github.com/deckerst/aves/blob/develop/android/key_template.properties) for the expected keys. + +To run the app: +``` +# ./flutterw run -t lib/main_play.dart --flavor play +``` + +[Version badge]: https://img.shields.io/github/v/release/deckerst/aves?include_prereleases&sort=semver +[Build badge]: https://img.shields.io/github/actions/workflow/status/deckerst/aves/quality-check.yml?branch=develop diff --git a/Run b/Run new file mode 100644 index 0000000..e69de29 diff --git a/a.dart b/a.dart new file mode 100644 index 0000000..439a47d --- /dev/null +++ b/a.dart @@ -0,0 +1,371 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:math'; + +import 'package:aves/app_flavor.dart'; +import 'package:aves/model/device.dart'; +import 'package:aves/model/filters/favourite.dart'; +import 'package:aves/model/filters/mime.dart'; +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/modules/app.dart'; +import 'package:aves/model/settings/modules/collection.dart'; +import 'package:aves/model/settings/modules/debug.dart'; +import 'package:aves/model/settings/modules/display.dart'; +import 'package:aves/model/settings/modules/info.dart'; +import 'package:aves/model/settings/modules/navigation.dart'; +import 'package:aves/model/settings/modules/privacy.dart'; +import 'package:aves/model/settings/modules/screen_saver.dart'; +import 'package:aves/model/settings/modules/search.dart'; +import 'package:aves/model/settings/modules/slideshow.dart'; +import 'package:aves/model/settings/modules/viewer.dart'; +import 'package:aves/model/settings/modules/widget.dart'; +import 'package:aves/ref/bursts.dart'; +import 'package:aves/services/accessibility_service.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:collection/collection.dart'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:latlong2/latlong.dart'; + +final Settings settings = Settings._private(); + +class Settings + with + ChangeNotifier, + SettingsAccess, + SearchSettings, + AppSettings, + CollectionSettings, + DebugSettings, + DisplaySettings, + InfoSettings, + NavigationSettings, + PrivacySettings, + ScreenSaverSettings, + WidgetSettings { + final Set _subscriptions = {}; + final EventChannel _platformSettingsChangeChannel = const OptionalEventChannel('deckers.thibault/aves/settings_change'); + final StreamController _updateStreamController = StreamController.broadcast(); + final StreamController _updateTileExtentStreamController = StreamController.broadcast(); + + @override + Stream get updateStream => _updateStreamController.stream; + + Stream get updateTileExtentStream => _updateTileExtentStreamController.stream; + + @override + bool get initialized => store.initialized; + + @override + SettingsStore get store => settingsStore; + + Settings._private() { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); + } + + Future init({ + required bool monitorPlatformSettings, + required bool shouldSanitize, + }) async { + await store.init(); + resetAppliedLocale(); + _unregister(); + _register(monitorPlatformSettings); + initAppSettings(); + if (shouldSanitize) { + await sanitize(); + } + } + + void _unregister() { + //albumGrouping.removeListener(saveAlbumGroups); + //tagGrouping.removeListener(saveTagGroups); + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + +void _register(bool monitorPlatformSettings) { + // 🔥 album grouping rimosso + // 🔥 dynamic albums rimossi + // 🔥 tag grouping: nessun salvataggio gruppi + + // ascolta SOLO i cambiamenti del grouping TAG (versione minimal) + _subscriptions.add( + tagGrouping.eventBus.on().listen(_onGroupingChange), + ); + + // mantieni il monitoraggio delle impostazioni di sistema + if (monitorPlatformSettings) { + _subscriptions.add( + _platformSettingsChangeChannel + .receiveBroadcastStream() + .listen((event) => _onPlatformSettingsChanged(event as Map?)), + ); + } +} + +void _onGroupingChange(GroupUriChangedEvent event) { + // nuovo modello: nessun aggiornamento necessario +} + + Future reload() => store.reload(); + + Future reset({required bool includeInternalKeys}) async { + if (includeInternalKeys) { + await store.clear(); + } else { + await Future.forEach(store.getKeys().whereNot(SettingKeys.isInternalKey), store.remove); + } + } + + Future setContextualDefaults(AppFlavor flavor) async { + // performance + final performanceClass = await deviceService.getPerformanceClass(); + enableBlurEffect = performanceClass >= 29; + + final androidInfo = await DeviceInfoPlugin().androidInfo; + final manufacturer = androidInfo.manufacturer.toLowerCase(); + final pattern = BurstPatterns.byManufacturer[manufacturer]; + collectionBurstPatterns = pattern != null ? [pattern] : []; + + // availability + if (flavor.hasMapStyleDefault) { + final defaultMapStyle = mobileServices.defaultMapStyle; + if (defaultMapStyle != null && mobileServices.mapStyles.contains(defaultMapStyle)) { + mapStyle = defaultMapStyle; + } else { + final styles = EntryMapStyles.baseStyles; + mapStyle = styles[Random().nextInt(styles.length)]; + } + } + + if (settings.useTvLayout) { + applyTvSettings(); + } + } + + void applyTvSettings() { + themeBrightness = AvesThemeBrightness.dark; + maxBrightness = MaxBrightness.never; + mustBackTwiceToExit = false; + // address `TV-BU` / `TV-BY` requirements from https://developer.android.com/docs/quality-guidelines/tv-app-quality + drawerTypeBookmarks = [ + null, + MimeFilter.video, + FavouriteFilter.instance, + ]; + drawerPageBookmarks = [ + SearchPage.routeName, + ]; + bottomNavigationActions = []; + showOverlayOnOpening = false; + showOverlayMinimap = false; + showOverlayZoomLevel = false; + showOverlayThumbnailPreview = false; + viewerGestureSideTapNext = false; + viewerUseCutout = true; + enableBin = false; + showPinchGestureAlternatives = true; + resetShowTitleQuery(); + } + +Future sanitize() async { + if (timeToTakeAction == AccessibilityTimeout.system && + !await AccessibilityService.hasRecommendedTimeouts()) { + set(SettingKeys.timeToTakeActionKey, null); + } + + if (viewerUseCutout != SettingsDefaults.viewerUseCutout && + !await windowService.isCutoutAware()) { + set(SettingKeys.viewerUseCutoutKey, null); + } + + collectionBurstPatterns = + collectionBurstPatterns.where(BurstPatterns.options.contains).toList(); +} + + // tag editor + + bool get tagEditorCurrentFilterSectionExpanded => getBool(SettingKeys.tagEditorCurrentFilterSectionExpandedKey) ?? SettingsDefaults.tagEditorCurrentFilterSectionExpanded; + + set tagEditorCurrentFilterSectionExpanded(bool newValue) => set(SettingKeys.tagEditorCurrentFilterSectionExpandedKey, newValue); + + String? get tagEditorExpandedSection => getString(SettingKeys.tagEditorExpandedSectionKey); + + set tagEditorExpandedSection(String? newValue) => set(SettingKeys.tagEditorExpandedSectionKey, newValue); + + // converter + + String get convertMimeType => getString(SettingKeys.convertMimeTypeKey) ?? SettingsDefaults.convertMimeType; + + set convertMimeType(String newValue) => set(SettingKeys.convertMimeTypeKey, newValue); + + int get convertQuality => getInt(SettingKeys.convertQualityKey) ?? SettingsDefaults.convertQuality; + + set convertQuality(int newValue) => set(SettingKeys.convertQualityKey, newValue); + + bool get convertWriteMetadata => getBool(SettingKeys.convertWriteMetadataKey) ?? SettingsDefaults.convertWriteMetadata; + + set convertWriteMetadata(bool newValue) => set(SettingKeys.convertWriteMetadataKey, newValue); + + // map + + EntryMapStyle? get mapStyle { + var preferred = getString(SettingKeys.mapStyleKey); + + // backward compatibility with definition as enum + const oldEnumPrefix = 'EntryMapStyle.'; + if (preferred != null && preferred.startsWith(oldEnumPrefix)) { + preferred = preferred.substring(oldEnumPrefix.length); + if (preferred.isEmpty) preferred = null; + } + + if (preferred == null) return null; + + final styles = [...availability.mapStyles, ...customMapStyles]; + return styles.firstWhereOrNull((v) => v.key == preferred) ?? styles.first; + } + + set mapStyle(EntryMapStyle? newValue) => set(SettingKeys.mapStyleKey, newValue?.key); + + LatLng? get mapDefaultCenter { + final json = getString(SettingKeys.mapDefaultCenterKey); + return json != null ? LatLng.fromJson(jsonDecode(json)) : null; + } + + set mapDefaultCenter(LatLng? newValue) => set(SettingKeys.mapDefaultCenterKey, newValue != null ? jsonEncode(newValue.toJson()) : null); + + Set get customMapStyles => (getStringList(SettingKeys.customMapStylesKey) ?? []).map(EntryMapStyle.fromJson).nonNulls.toSet(); + + set customMapStyles(Set newValue) => set(SettingKeys.customMapStylesKey, newValue.map((filter) => filter.toJson()).toList()); + + // bin + + bool get enableBin => getBool(SettingKeys.enableBinKey) ?? SettingsDefaults.enableBin; + + set enableBin(bool newValue) => set(SettingKeys.enableBinKey, newValue); + + // accessibility + + bool get showPinchGestureAlternatives => getBool(SettingKeys.showPinchGestureAlternativesKey) ?? SettingsDefaults.showPinchGestureAlternatives; + + set showPinchGestureAlternatives(bool newValue) => set(SettingKeys.showPinchGestureAlternativesKey, newValue); + + AccessibilityAnimations get accessibilityAnimations => getEnumOrDefault(SettingKeys.accessibilityAnimationsKey, SettingsDefaults.accessibilityAnimations, AccessibilityAnimations.values); + + bool get animate => accessibilityAnimations.animate; + + set accessibilityAnimations(AccessibilityAnimations newValue) => set(SettingKeys.accessibilityAnimationsKey, newValue.toString()); + + AccessibilityTimeout get timeToTakeAction => getEnumOrDefault(SettingKeys.timeToTakeActionKey, SettingsDefaults.timeToTakeAction, AccessibilityTimeout.values); + + set timeToTakeAction(AccessibilityTimeout newValue) => set(SettingKeys.timeToTakeActionKey, newValue.toString()); + + // platform settings + + void _onPlatformSettingsChanged(Map? fields) { + fields?.forEach((key, value) { + switch (key) { + case SettingKeys.platformAccelerometerRotationKey: + if (value is num) { + isRotationLocked = value == 0; + } + case SettingKeys.platformTransitionAnimationScaleKey: + if (value is num) { + areAnimationsRemoved = value == 0; + } + case SettingKeys.platformLongPressTimeoutMillisKey: + if (value is num) { + longPressTimeoutMillis = value.toInt(); + } + } + }); + } + + bool get isRotationLocked => getBool(SettingKeys.platformAccelerometerRotationKey) ?? SettingsDefaults.isRotationLocked; + + set isRotationLocked(bool newValue) => set(SettingKeys.platformAccelerometerRotationKey, newValue); + + bool get areAnimationsRemoved => getBool(SettingKeys.platformTransitionAnimationScaleKey) ?? SettingsDefaults.areAnimationsRemoved; + + set areAnimationsRemoved(bool newValue) => set(SettingKeys.platformTransitionAnimationScaleKey, newValue); + + Duration get longPressTimeout => Duration(milliseconds: getInt(SettingKeys.platformLongPressTimeoutMillisKey) ?? kLongPressTimeout.inMilliseconds); + + set longPressTimeoutMillis(int newValue) => set(SettingKeys.platformLongPressTimeoutMillisKey, newValue); + + // import/export + + Map export() => Map.fromEntries( + store.getKeys().whereNot(SettingKeys.isInternalKey).map((k) => MapEntry(k, store.get(k))), + ); + +Future import(Object jsonMap) async { + if (jsonMap is! Map) { + debugPrint('failed to import settings for jsonMap=$jsonMap'); + return; + } + + // reset per ripristinare i default + await reset(includeInternalKeys: false); + + jsonMap.cast().forEach((key, newValue) { + final oldValue = store.get(key); + + // null → rimuovi + if (newValue == null) { + store.remove(key); + } + + // double + else if (key.startsWith(SettingKeys.tileExtentPrefixKey)) { + if (newValue is double) store.setDouble(key, newValue); + } + + // string + else if (key.startsWith(SettingKeys.tileLayoutPrefixKey)) { + if (newValue is String) store.setString(key, newValue); + } + + // bool + else if (key.startsWith(SettingKeys.showTitleQueryPrefixKey)) { + if (newValue is bool) store.setBool(key, newValue); + } + + // 🔥 gestione compatta dei tipi base + else if (newValue is int) { + store.setInt(key, newValue); + } else if (newValue is double) { + store.setDouble(key, newValue); + } else if (newValue is bool) { + store.setBool(key, newValue); + } else if (newValue is String) { + store.setString(key, newValue); + } else if (newValue is List) { + store.setStringList(key, newValue.cast()); + } + + // notifica se cambiato + if (oldValue != newValue) { + notifyKeyChange(key, oldValue, newValue); + } + }); + + await sanitize(); + notifyListeners(); +} + + @override + void notifyKeyChange(String key, Object? oldValue, Object? newValue) { + _updateStreamController.add(SettingsChangedEvent(key, oldValue, newValue)); + if (key.startsWith(SettingKeys.tileExtentPrefixKey)) { + _updateTileExtentStreamController.add(SettingsChangedEvent(key, oldValue, newValue)); + } + } +} diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..444b0a3 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,47 @@ +include: package:flutter_lints/flutter.yaml + +analyzer: + exclude: + - lib/generated_plugin_registrant.dart + +# strong-mode: +# implicit-casts: false +# implicit-dynamic: false + +# cf https://github.com/dart-lang/dart_style/wiki/Configuration +formatter: + page_width: 240 + trailing_commas: preserve + +linter: + rules: + # from 'flutter_lints', excluded + use_build_context_synchronously: false # no alternative + + # from 'lints / recommended', excluded + no_leading_underscores_for_local_identifiers: false # useful for null checked variable variants + + # from 'effective dart', excluded + avoid_classes_with_only_static_members: false # too strict + avoid_function_literals_in_foreach_calls: false # benefit? + lines_longer_than_80_chars: false # nope + public_member_api_docs: false # this project is not a library + + # from 'effective dart', undecided + prefer_relative_imports: false # check IDE support (auto import, file move) + + # from 'effective dart', included + avoid_types_on_closure_parameters: true + prefer_interpolation_to_compose_strings: true + unnecessary_lambdas: true + + # from 'pedantic', included + always_declare_return_types: true + prefer_single_quotes: true + sort_child_properties_last: true + unawaited_futures: true + + # `const` related, included + prefer_const_constructors: true + prefer_const_literals_to_create_immutables: true + prefer_const_declarations: true diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..5343532 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,16 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +.cxx/ +.kotlin/ +/build/ + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/android/app/agconnect-services.json b/android/app/agconnect-services.json new file mode 100644 index 0000000..d406d5c --- /dev/null +++ b/android/app/agconnect-services.json @@ -0,0 +1,82 @@ +{ + "agcgw_all":{ + "CN":"connect-drcn.dbankcloud.cn", + "CN_back":"connect-drcn.hispace.hicloud.com", + "DE":"connect-dre.dbankcloud.cn", + "DE_back":"connect-dre.hispace.hicloud.com", + "RU":"connect-drru.hispace.dbankcloud.ru", + "RU_back":"connect-drru.hispace.dbankcloud.cn", + "SG":"connect-dra.dbankcloud.cn", + "SG_back":"connect-dra.hispace.hicloud.com" + }, + "websocketgw_all":{ + "CN":"connect-ws-drcn.hispace.dbankcloud.cn", + "CN_back":"connect-ws-drcn.hispace.dbankcloud.com", + "DE":"connect-ws-dre.hispace.dbankcloud.cn", + "DE_back":"connect-ws-dre.hispace.dbankcloud.com", + "RU":"connect-ws-drru.hispace.dbankcloud.ru", + "RU_back":"connect-ws-drru.hispace.dbankcloud.cn", + "SG":"connect-ws-dra.hispace.dbankcloud.cn", + "SG_back":"connect-ws-dra.hispace.dbankcloud.com" + }, + "client":{ + "cp_id":"2640082000020010713", + "product_id":"99536292102197525", + "project_id":"99536292102197525", + "app_id":"106014023", + "package_name":"deckers.thibault.aves" + }, + "oauth_client":{ + "client_id":"106014023", + "client_type":1 + }, + "app_info":{ + "app_id":"106014023", + "package_name":"deckers.thibault.aves" + }, + "configuration_version":"3.0", + "appInfos":[ + { + "package_name":"deckers.thibault.aves", + "client":{ + "app_id":"106014023" + }, + "app_info":{ + "package_name":"deckers.thibault.aves", + "app_id":"106014023" + }, + "oauth_client":{ + "client_type":1, + "client_id":"106014023" + } + }, + { + "package_name":"deckers.thibault.aves.debug", + "client":{ + "app_id":"106014297" + }, + "app_info":{ + "package_name":"deckers.thibault.aves.debug", + "app_id":"106014297" + }, + "oauth_client":{ + "client_type":1, + "client_id":"106014297" + } + }, + { + "package_name":"deckers.thibault.aves.profile", + "client":{ + "app_id":"106031461" + }, + "app_info":{ + "package_name":"deckers.thibault.aves.profile", + "app_id":"106031461" + }, + "oauth_client":{ + "client_type":1, + "client_id":"106031461" + } + } + ] +} \ No newline at end of file diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts new file mode 100644 index 0000000..5b115d9 --- /dev/null +++ b/android/app/build.gradle.kts @@ -0,0 +1,255 @@ +import com.android.build.gradle.internal.api.ApkVariantOutputImpl +import java.util.Properties + +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.ksp) + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("kotlin-android") + id("dev.flutter.flutter-gradle-plugin") +} + +val packageName = "deckers.thibault.aves" + +// Keys +val keystoreProperties = Properties() +val keystorePropertiesFile: File = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + println("Load keystore props from file=$keystorePropertiesFile") + // for release using credentials stored in a local file + keystorePropertiesFile.inputStream().use { keystoreProperties.load(it) } +} else { + println("Load keystore props from system environment") + // for release using credentials in environment variables set up by GitHub Actions + // warning: in property file, single quotes should be escaped with a backslash + // but they should not be escaped when stored in env variables + val env = System.getenv() + fun getEnv(propKey: String, envKey: String) { + if (envKey in env) { + keystoreProperties[propKey] = env[envKey] + } + } + getEnv("storeFile", "AVES_STORE_FILE") + getEnv("storePassword", "AVES_STORE_PASSWORD") + getEnv("keyAlias", "AVES_KEY_ALIAS") + getEnv("keyPassword", "AVES_KEY_PASSWORD") + getEnv("googleApiKey", "AVES_GOOGLE_API_KEY") +} + +android { + namespace = "deckers.thibault.aves" + compileSdk = 36 + ndkVersion = flutter.ndkVersion + + compileOptions { + // enable support for the new language APIs on older devices + // e.g. `java/util/function/Supplier` on Android 5.0 (API 21) + isCoreLibraryDesugaringEnabled = true + } + + kotlin { + jvmToolchain(17) + } + + defaultConfig { + applicationId = packageName + minSdk = flutter.minSdkVersion + targetSdk = 36 + versionCode = flutter.versionCode + versionName = flutter.versionName + manifestPlaceholders["googleApiKey"] = keystoreProperties["googleApiKey"] ?: "" + multiDexEnabled = true + } + + signingConfigs { + val storeFilePath = keystoreProperties["storeFile"] as String? + if (storeFilePath != null) { + println("Create signing config for release using file=$storeFilePath") + create("release") { + keyAlias = keystoreProperties["keyAlias"] as String + keyPassword = keystoreProperties["keyPassword"] as String + storeFile = file(storeFilePath) + storePassword = keystoreProperties["storePassword"] as String + } + } + } + + flavorDimensions += "store" + + productFlavors { + create("play") { + // Google Play + dimension = "store" + } + + create("izzy") { + // IzzyOnDroid + // check offending libraries with `scanapk` + // cf https://android.izzysoft.de/articles/named/app-modules-2 + dimension = "store" + } + + create("libre") { + // F-Droid + // check offending libraries with `fdroidserver` + // cf https://f-droid.org/en/docs/Submitting_to_F-Droid_Quick_Start_Guide/ + dimension = "store" + applicationIdSuffix = ".libre" + } + + create("libre_rom") { + // integration in custom ROM + dimension = "store" + applicationIdSuffix = ".libre" + + packaging { + // disable compression for native libraries (.so files) + jniLibs.useLegacyPackaging = false + } + } + } + + buildTypes { + getByName("debug") { + applicationIdSuffix = ".debug" + } + + getByName("profile") { + // applicationIdSuffix = ".profile" + } + + getByName("release") { + if (signingConfigs.names.contains("release")) { + signingConfig = signingConfigs.getByName("release") + } else { + println("Skip release signing as it is not configured") + } + isMinifyEnabled = true + isShrinkResources = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + + // NDK ABI filters are incompatible with split APK generation, + // but filters are necessary to exclude x86 native libs from universal APKs + // cf https://github.com/flutter/flutter/issues/37566#issuecomment-640879500 + var useNdkAbiFilters = true + if (rootProject.extra.has("split-per-abi")) { + val splitPerAbi = rootProject.extra["split-per-abi"] + if (splitPerAbi == "true" || splitPerAbi == true) { + useNdkAbiFilters = false + } + } + if (useNdkAbiFilters) { + ndk { + //noinspection ChromeOsAbiSupport + abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86_64") + } + } + } + + val abiCodes = mapOf( + "armeabi-v7a" to 1, + "arm64-v8a" to 2, + "x86" to 3, + "x86_64" to 4 + ) + + applicationVariants.all { + println("Application variant applicationId=$applicationId name=$name") + + resValue( + "string", + "screen_saver_settings_activity", + "${applicationId}/${packageName}.ScreenSaverSettingsActivity" + ) + resValue("string", "search_provider", "${applicationId}.search_provider") + + outputs.forEach { output -> + val abi = output.filters.find { it.filterType == "ABI" }?.identifier + val baseAbiVersionCode = abiCodes[abi] + if (baseAbiVersionCode != null) { + val versionCodeOverride = versionCode * 100 + baseAbiVersionCode + println(" output versionCodeOverride=$versionCodeOverride for abi=$abi") + (output as ApkVariantOutputImpl).versionCodeOverride = versionCodeOverride + } + } + } + } +} + +flutter { + source = "../.." +} + +repositories { + maven { + url = uri("https://jitpack.io") + content { + includeGroup("com.github.deckerst") + includeGroup("com.github.deckerst.mp4parser") + } + } + maven { + url = uri("https://s3.amazonaws.com/repo.commonsware.com") + content { + excludeGroupByRegex("com\\.github\\.deckerst.*") + } + } +} + +dependencies { + // cf https://developer.android.com/studio/write/java8-support#library-desugaring + coreLibraryDesugaring(libs.android.desugarJdkLibs) + + implementation(libs.kotlinx.coroutines.android) + + implementation(libs.androidx.annotation) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.ktx) + implementation(libs.androidx.lifecycle) + implementation(libs.androidx.media) + implementation(libs.androidx.multidex) + // Jetpack `security-crypto` library is deprecated: + // https://developer.android.com/privacy-and-security/cryptography#security-crypto-jetpack-deprecated + implementation(libs.androidx.security.crypto) + implementation(libs.androidx.work.runtime) + + implementation(libs.commonsware.cwac) + implementation(libs.metadata.extractor) + implementation(libs.glide) + implementation(libs.google.material) + // SLF4J implementation for `mp4parser` + implementation(libs.slf4j) + + // forked, built by JitPack: + // - https://jitpack.io/p/deckerst/Android-TiffBitmapFactory + // - https://jitpack.io/p/deckerst/androidsvg + // - https://jitpack.io/p/deckerst/mp4parser + // - https://jitpack.io/p/deckerst/pixymeta-android + implementation(libs.deckerst.tiffbitmapfactory) + implementation(libs.deckerst.androidsvg) + implementation(libs.deckerst.mp4parser.isoparser) + implementation(libs.deckerst.mp4parser.muxer) + implementation(libs.deckerst.pixymeta) + implementation(project(":exifinterface")) + + // ⭐ Cast dependencies per MainActivity + // implementation("com.google.android.gms:play-services-cast-framework:21.4.0") + // implementation("androidx.mediarouter:mediarouter:1.6.0") + + testImplementation(libs.junit) + + ksp(libs.glideKsp) + + compileOnly(rootProject.findProject(":streams_channel")!!) +} + +if (rootProject.extra["aves.useCrashlytics"] as Boolean) { + println("Building flavor with Crashlytics plugin") + apply(plugin = "com.google.gms.google-services") + apply(plugin = "com.google.firebase.crashlytics") +} else { + println("Building flavor without reporting plugin") +} diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 0000000..06e861e --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,6 @@ +-keep class org.beyka.tiffbitmapfactory.**{ *; } +-keep class org.mp4parser.**{ *; } + +# referenced from: com.google.crypto.tink +-dontwarn com.google.errorprone.annotations.** +-dontwarn javax.annotation.** diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..8866000 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/android/app/src/debug/res/values/colors.xml b/android/app/src/debug/res/values/colors.xml new file mode 100644 index 0000000..023cc20 --- /dev/null +++ b/android/app/src/debug/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #815AFA + \ No newline at end of file diff --git a/android/app/src/debug/res/values/strings.xml b/android/app/src/debug/res/values/strings.xml new file mode 100644 index 0000000..e5c92d3 --- /dev/null +++ b/android/app/src/debug/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Aves [Debug] + \ No newline at end of file diff --git a/android/app/src/libre/res/values/strings.xml b/android/app/src/libre/res/values/strings.xml new file mode 100644 index 0000000..b451c08 --- /dev/null +++ b/android/app/src/libre/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Aves Libre + \ No newline at end of file diff --git a/android/app/src/libreDebug/res/values/strings.xml b/android/app/src/libreDebug/res/values/strings.xml new file mode 100644 index 0000000..4c84517 --- /dev/null +++ b/android/app/src/libreDebug/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Aves Libre [Debug] + \ No newline at end of file diff --git a/android/app/src/libreProfile/res/values/strings.xml b/android/app/src/libreProfile/res/values/strings.xml new file mode 100644 index 0000000..2918b24 --- /dev/null +++ b/android/app/src/libreProfile/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Aves Libre [Profile] + \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..996208e --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/AndroidManifest.xml.ok b/android/app/src/main/AndroidManifest.xml.ok new file mode 100644 index 0000000..33f1c66 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml.ok @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/AndroidManifest.xml.old b/android/app/src/main/AndroidManifest.xml.old new file mode 100644 index 0000000..ffc270e --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml.old @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt b/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt new file mode 100644 index 0000000..cd53721 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt @@ -0,0 +1,230 @@ +package deckers.thibault.aves + +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.content.pm.ServiceInfo +import android.os.Build +import android.util.Log +import androidx.core.app.NotificationChannelCompat +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import androidx.work.CoroutineWorker +import androidx.work.ForegroundInfo +import androidx.work.WorkInfo +import androidx.work.WorkManager +import androidx.work.WorkerParameters +import app.loup.streams_channel.StreamsChannel +import deckers.thibault.aves.channel.calls.Coresult.Companion.safeSuspend +import deckers.thibault.aves.channel.calls.DeviceHandler +import deckers.thibault.aves.channel.calls.GeocodingHandler +import deckers.thibault.aves.channel.calls.MediaFetchObjectHandler +import deckers.thibault.aves.channel.calls.MediaStoreHandler +import deckers.thibault.aves.channel.calls.MetadataFetchHandler +import deckers.thibault.aves.channel.calls.StorageHandler +import deckers.thibault.aves.channel.streams.darttoplatform.ImageByteStreamHandler +import deckers.thibault.aves.channel.streams.darttoplatform.MediaStoreStreamHandler +import deckers.thibault.aves.utils.FlutterUtils +import deckers.thibault.aves.utils.LogUtils +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import kotlinx.coroutines.CancellableContinuation +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.suspendCancellableCoroutine +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException + +class AnalysisWorker(context: Context, parameters: WorkerParameters) : CoroutineWorker(context, parameters) { + private val defaultScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + private var workCont: CancellableContinuation? = null + private var flutterEngine: FlutterEngine? = null + private var backgroundChannel: MethodChannel? = null + + override suspend fun doWork(): Result { + Log.i(LOG_TAG, "Start analysis worker $id") + createNotificationChannel() + val foregroundInfo = createForegroundInfo() + if (!isStopped) { + setForeground(foregroundInfo) + suspendCancellableCoroutine { cont -> + workCont = cont + cont.invokeOnCancellation { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + val stopReasonString = when (stopReason) { + WorkInfo.STOP_REASON_CANCELLED_BY_APP -> "CANCELLED_BY_APP" + WorkInfo.STOP_REASON_FOREGROUND_SERVICE_TIMEOUT -> "FOREGROUND_SERVICE_TIMEOUT" + else -> "[$stopReason]" + } + Log.i(LOG_TAG, "Analysis worker got cancelled with stopReason=$stopReasonString") + } else { + Log.i(LOG_TAG, "Analysis worker got cancelled") + } + stopDartAnalysisService() + workCont?.resumeWithException(CancellationException()) + } + onStart() + } + dispose() + } + return Result.success() + } + + private suspend fun dispose() { + Log.i(LOG_TAG, "Clean analysis worker $id") + flutterEngine?.let { + FlutterUtils.runOnUiThread { + it.destroy() + } + flutterEngine = null + } + } + + private fun onStart() { + runBlocking { + FlutterUtils.initFlutterEngine(applicationContext, SHARED_PREFERENCES_KEY, PREF_CALLBACK_HANDLE_KEY) { + flutterEngine = it + } + } + + try { + initChannels(applicationContext) + + val preferences = applicationContext.getSharedPreferences(SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE) + val entryIdStrings = preferences.getStringSet(PREF_ENTRY_IDS_KEY, null) + startDartAnalysisService(entryIdStrings) + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to initialize worker", e) + workCont?.resumeWithException(e) + } + } + + private fun initChannels(context: Context) { + val engine = flutterEngine + engine ?: throw Exception("Flutter engine is not initialized") + + val messenger = engine.dartExecutor + + // channels for analysis + + // dart -> platform -> dart + // - need Context + MethodChannel(messenger, DeviceHandler.CHANNEL).setMethodCallHandler(DeviceHandler(context)) + MethodChannel(messenger, GeocodingHandler.CHANNEL).setMethodCallHandler(GeocodingHandler(context)) + MethodChannel(messenger, MediaFetchObjectHandler.CHANNEL).setMethodCallHandler(MediaFetchObjectHandler(context)) + MethodChannel(messenger, MediaStoreHandler.CHANNEL).setMethodCallHandler(MediaStoreHandler(context)) + MethodChannel(messenger, MetadataFetchHandler.CHANNEL).setMethodCallHandler(MetadataFetchHandler(context)) + MethodChannel(messenger, StorageHandler.CHANNEL).setMethodCallHandler(StorageHandler(context)) + + // result streaming: dart -> platform ->->-> dart + // - need Context + StreamsChannel(messenger, ImageByteStreamHandler.CHANNEL).setStreamHandlerFactory { args -> ImageByteStreamHandler(context, args) } + StreamsChannel(messenger, MediaStoreStreamHandler.CHANNEL).setStreamHandlerFactory { args -> MediaStoreStreamHandler(context, args) } + + // channel for service management + backgroundChannel = MethodChannel(messenger, BACKGROUND_CHANNEL).apply { + setMethodCallHandler { call, result -> onMethodCall(call, result) } + } + } + + private fun startDartAnalysisService(entryIdStrings: Set?) { + runBlocking { + FlutterUtils.runOnUiThread { + backgroundChannel?.invokeMethod( + "start", hashMapOf( + "entryIds" to entryIdStrings?.map { Integer.parseUnsignedInt(it) }?.toList(), + "force" to inputData.getBoolean(KEY_FORCE, false), + ) + ) + } + } + } + + private fun stopDartAnalysisService() { + runBlocking { + FlutterUtils.runOnUiThread { + backgroundChannel?.invokeMethod("stop", null) + } + } + } + + private fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "initialized" -> { + Log.d(LOG_TAG, "Analysis background channel is ready") + result.success(null) + } + + "updateNotification" -> defaultScope.launch { safeSuspend(call, result, ::updateNotification) } + + "stop" -> { + workCont?.takeIf { it.isActive }?.resume(null) + result.success(null) + } + + else -> result.notImplemented() + } + } + + private fun createNotificationChannel() { + val channel = NotificationChannelCompat.Builder(NOTIFICATION_CHANNEL, NotificationManagerCompat.IMPORTANCE_LOW) + .setName(applicationContext.getText(R.string.analysis_channel_name)) + .setShowBadge(false) + .build() + NotificationManagerCompat.from(applicationContext).createNotificationChannel(channel) + } + + private fun createForegroundInfo(title: String? = null, message: String? = null): ForegroundInfo { + val pendingIntentFlags = PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + val openAppIntent = Intent(applicationContext, MainActivity::class.java).let { + PendingIntent.getActivity(applicationContext, MainActivity.OPEN_FROM_ANALYSIS_SERVICE, it, pendingIntentFlags) + } + val stopAction = NotificationCompat.Action.Builder( + R.drawable.ic_outline_stop_24, + applicationContext.getString(R.string.analysis_notification_action_stop), + WorkManager.getInstance(applicationContext).createCancelPendingIntent(id) + ).build() + val contentTitle = title ?: applicationContext.getText(R.string.analysis_notification_default_title) + val notification = NotificationCompat.Builder(applicationContext, NOTIFICATION_CHANNEL) + .setContentTitle(contentTitle) + .setTicker(contentTitle) + .setContentText(message) + .setSmallIcon(R.drawable.ic_notification) + .setOngoing(true) + .setContentIntent(openAppIntent) + .addAction(stopAction) + .build() + // from Android 14 (API 34), foreground service type is mandatory for long-running workers: + // https://developer.android.com/guide/background/persistent/how-to/long-running + return when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM -> ForegroundInfo(NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROCESSING) + Build.VERSION.SDK_INT == Build.VERSION_CODES.UPSIDE_DOWN_CAKE -> ForegroundInfo(NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC) + else -> ForegroundInfo(NOTIFICATION_ID, notification) + } + } + + private suspend fun updateNotification(call: MethodCall, result: MethodChannel.Result) { + val title = call.argument("title") + val message = call.argument("message") + setForeground(createForegroundInfo(title, message)) + result.success(null) + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + private const val BACKGROUND_CHANNEL = "deckers.thibault/aves/analysis_service_background" + const val SHARED_PREFERENCES_KEY = "analysis_service" + const val PREF_CALLBACK_HANDLE_KEY = "callback_handle" + const val PREF_ENTRY_IDS_KEY = "entry_ids" + + const val NOTIFICATION_CHANNEL = "analysis" + const val NOTIFICATION_ID = 1 + + const val KEY_FORCE = "force" + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/EntryPathChannel.kt b/android/app/src/main/kotlin/deckers/thibault/aves/EntryPathChannel.kt new file mode 100644 index 0000000..f84d6a1 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/EntryPathChannel.kt @@ -0,0 +1,63 @@ +package deckers.thibault.aves + +import android.content.ContentUris +import android.content.Context +import android.provider.MediaStore +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel + +class EntryPathChannel(private val context: Context) { + + fun register(flutterEngine: FlutterEngine) { + MethodChannel( + flutterEngine.dartExecutor.binaryMessenger, + "aves/entry_path" + ).setMethodCallHandler { call, result -> + when (call.method) { + "getEntryPath" -> { + // Accetta sia int che string + val rawId: Any? = call.argument("id") + val id = when (rawId) { + is Number -> rawId.toLong() + is String -> rawId.toLongOrNull() + else -> null + } + + if (id == null) { + result.error("INVALID_ID", "ID non valido: $rawId", null) + return@setMethodCallHandler + } + + val path = getPathForMediaStoreId(id) + if (path != null) { + result.success(path) + } else { + result.error("NOT_FOUND", "Nessun file per ID=$id", null) + } + } + + else -> result.notImplemented() + } + } + } + + private fun getPathForMediaStoreId(id: Long): String? { + val uri = ContentUris.withAppendedId( + MediaStore.Files.getContentUri("external"), + id + ) + + val projection = arrayOf(MediaStore.Files.FileColumns.DATA) + + context.contentResolver.query(uri, projection, null, null, null)?.use { cursor -> + if (cursor.moveToFirst()) { + val idx = cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA) + if (idx >= 0) { + return cursor.getString(idx) + } + } + } + + return null + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/HomeWidgetConfigureActivity.kt b/android/app/src/main/kotlin/deckers/thibault/aves/HomeWidgetConfigureActivity.kt new file mode 100644 index 0000000..0cfc485 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/HomeWidgetConfigureActivity.kt @@ -0,0 +1,67 @@ +package deckers.thibault.aves + +import android.appwidget.AppWidgetManager +import android.content.Intent +import android.os.Bundle +import deckers.thibault.aves.model.FieldMap +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel + +class HomeWidgetSettingsActivity : MainActivity() { + private var appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID + + public override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + // cancel if user does not complete widget setup + setResult(RESULT_CANCELED) + + intent.extras?.let { + appWidgetId = it.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID) + intentDataMap = extractIntentData(intent) + } + + if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { + finish() + return + } + } + + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + super.configureFlutterEngine(flutterEngine) + + val messenger = flutterEngine.dartExecutor + MethodChannel(messenger, CHANNEL).setMethodCallHandler { call, result -> + when (call.method) { + "configure" -> { + result.success(null) + saveWidget() + } + + else -> result.notImplemented() + } + } + } + + private fun saveWidget() { + val appWidgetManager = AppWidgetManager.getInstance(this) + val widgetInfo = appWidgetManager.getAppWidgetOptions(appWidgetId) + HomeWidgetProvider().onAppWidgetOptionsChanged(this, appWidgetManager, appWidgetId, widgetInfo) + + val intent = Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) + setResult(RESULT_OK, intent) + finish() + } + + override fun extractIntentData(intent: Intent?): FieldMap { + return hashMapOf( + INTENT_DATA_KEY_ACTION to INTENT_ACTION_WIDGET_SETTINGS, + INTENT_DATA_KEY_WIDGET_ID to appWidgetId, + ) + } + + companion object { + private const val CHANNEL = "deckers.thibault/aves/widget_configure" + } +} + diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/HomeWidgetProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/HomeWidgetProvider.kt new file mode 100644 index 0000000..3197bb5 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/HomeWidgetProvider.kt @@ -0,0 +1,324 @@ +package deckers.thibault.aves + +import android.app.PendingIntent +import android.appwidget.AppWidgetManager +import android.appwidget.AppWidgetProvider +import android.content.Context +import android.content.Intent +import android.content.res.Configuration +import android.graphics.Bitmap +import android.os.Build +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.util.Log +import android.util.SizeF +import android.widget.RemoteViews +import androidx.core.graphics.createBitmap +import androidx.core.net.toUri +import app.loup.streams_channel.StreamsChannel +import deckers.thibault.aves.channel.calls.DeviceHandler +import deckers.thibault.aves.channel.calls.MediaFetchObjectHandler +import deckers.thibault.aves.channel.calls.MediaStoreHandler +import deckers.thibault.aves.channel.calls.StorageHandler +import deckers.thibault.aves.channel.streams.darttoplatform.ImageByteStreamHandler +import deckers.thibault.aves.channel.streams.darttoplatform.MediaStoreStreamHandler +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.utils.ContextUtils.devicePixelRatio +import deckers.thibault.aves.utils.FlutterUtils +import deckers.thibault.aves.utils.LogUtils +import io.flutter.FlutterInjector +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.embedding.engine.dart.DartExecutor +import io.flutter.plugin.common.MethodChannel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.suspendCancellableCoroutine +import java.nio.ByteBuffer +import kotlin.coroutines.Continuation +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import kotlin.math.roundToInt + +class HomeWidgetProvider : AppWidgetProvider() { + private val defaultScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + + override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { + Log.d(LOG_TAG, "Widget onUpdate widgetIds=${appWidgetIds.contentToString()}") + val pendingResult = goAsync() + defaultScope.launch { + for (widgetId in appWidgetIds) { + val widgetInfo = appWidgetManager.getAppWidgetOptions(widgetId) + + val backgroundProps = getProps(context, widgetId, widgetInfo, drawEntryImage = false) + updateWidgetImage(context, appWidgetManager, widgetId, backgroundProps) + + val imageProps = getProps(context, widgetId, widgetInfo, drawEntryImage = true, reuseEntry = false) + updateWidgetImage(context, appWidgetManager, widgetId, imageProps) + } + try { + pendingResult?.finish() + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to finish update for widgetIds=${appWidgetIds.contentToString()}", e) + } + } + } + + override fun onAppWidgetOptionsChanged(context: Context, appWidgetManager: AppWidgetManager?, widgetId: Int, widgetInfo: Bundle?) { + Log.d(LOG_TAG, "Widget onAppWidgetOptionsChanged widgetId=$widgetId") + appWidgetManager ?: return + widgetInfo ?: return + + if (imageByteFetchJob != null) { + imageByteFetchJob?.cancel() + } + imageByteFetchJob = defaultScope.launch { + delay(500) + val imageProps = getProps(context, widgetId, widgetInfo, drawEntryImage = true, reuseEntry = true) + updateWidgetImage(context, appWidgetManager, widgetId, imageProps) + } + } + + private fun getWidgetSizesDip(context: Context, widgetInfo: Bundle): List { + var sizes: List? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + widgetInfo.getParcelableArrayList(AppWidgetManager.OPTION_APPWIDGET_SIZES, SizeF::class.java) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + @Suppress("deprecation") + widgetInfo.getParcelableArrayList(AppWidgetManager.OPTION_APPWIDGET_SIZES) + } else { + null + } + + if (sizes.isNullOrEmpty()) { + val isPortrait = context.resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT + val widthKey = if (isPortrait) AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH else AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH + val heightKey = if (isPortrait) AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT else AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT + val widthDip = widgetInfo.getInt(widthKey) + val heightDip = widgetInfo.getInt(heightKey) + sizes = listOf(SizeF(widthDip.toFloat(), heightDip.toFloat())) + } + + return sizes + } + + private suspend fun getProps( + context: Context, + widgetId: Int, + widgetInfo: Bundle, + drawEntryImage: Boolean, + reuseEntry: Boolean = false, + ): FieldMap? { + val sizesDip = getWidgetSizesDip(context, widgetInfo) + if (sizesDip.isEmpty()) return null + + val sizeDip = sizesDip.first() + if (sizeDip.width == 0f || sizeDip.height == 0f) return null + + val sizesDipMap = sizesDip.map { size -> hashMapOf("widthDip" to size.width, "heightDip" to size.height) } + val isNightModeOn = (context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES + + val params = hashMapOf( + "widgetId" to widgetId, + "sizesDip" to sizesDipMap, + "devicePixelRatio" to context.devicePixelRatio(), + "drawEntryImage" to drawEntryImage, + "reuseEntry" to reuseEntry, + "isSystemThemeDark" to isNightModeOn, + ).apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + put("cornerRadiusPx", context.resources.getDimension(android.R.dimen.system_app_widget_background_radius)) + } + } + + initFlutterEngine(context) + try { + val props = suspendCancellableCoroutine { cont -> + defaultScope.launch { + FlutterUtils.runOnUiThread { + tryDrawWidget(params, cont, 0) + } + } + } + @Suppress("unchecked_cast") + return props as FieldMap? + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to draw widget for widgetId=$widgetId sizesPx=$sizesDip", e) + } + return null + } + + private fun tryDrawWidget(params: HashMap, cont: Continuation, drawRetry: Int) { + val messenger = flutterEngine!!.dartExecutor + val channel = MethodChannel(messenger, WIDGET_DRAW_CHANNEL) + channel.invokeMethod("drawWidget", params, object : MethodChannel.Result { + override fun success(result: Any?) { + cont.resume(result) + } + + override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) { + cont.resumeWithException(Exception("$errorCode: $errorMessage\n$errorDetails")) + } + + override fun notImplemented() { + if (drawRetry > DRAW_RETRY_MAX) { + cont.resumeWithException(Exception("not implemented")) + } else { + Handler(Looper.getMainLooper()).postDelayed({ + tryDrawWidget(params, cont, drawRetry + 1) + }, 2000L) + } + } + }) + } + + private fun updateWidgetImage( + context: Context, + appWidgetManager: AppWidgetManager, + widgetId: Int, + props: FieldMap?, + ) { + props ?: return + + val bytesBySizeDip = (props["bytesBySizeDip"] as List<*>?)?.mapNotNull { + if (it is Map<*, *>) { + val widthDip = (it["widthDip"] as Number?)?.toFloat() + val heightDip = (it["heightDip"] as Number?)?.toFloat() + val bytes = it["bytes"] as ByteArray? + if (widthDip != null && heightDip != null && bytes != null) { + Pair(SizeF(widthDip, heightDip), bytes) + } else null + } else null + } + val updateOnTap = props["updateOnTap"] as Boolean? + if (bytesBySizeDip == null || updateOnTap == null) { + Log.e(LOG_TAG, "missing arguments") + return + } + + if (bytesBySizeDip.isEmpty()) { + Log.e(LOG_TAG, "empty image list") + return + } + + val bitmaps = ArrayList() + + fun createRemoteViewsForSize( + context: Context, + widgetId: Int, + sizeDip: SizeF, + bytes: ByteArray, + updateOnTap: Boolean, + ): RemoteViews? { + val density = context.devicePixelRatio() + val widthPx = (sizeDip.width * density).roundToInt() + val heightPx = (sizeDip.height * density).roundToInt() + + try { + val bitmap = createBitmap(widthPx, heightPx, Bitmap.Config.ARGB_8888).also { + bitmaps.add(it) + it.copyPixelsFromBuffer(ByteBuffer.wrap(bytes)) + } + + val pendingIntent = if (updateOnTap) buildUpdateIntent(context, widgetId) else buildOpenAppIntent(context, widgetId) + + return RemoteViews(context.packageName, R.layout.app_widget).apply { + setImageViewBitmap(R.id.widget_img, bitmap) + setOnClickPendingIntent(R.id.widget_img, pendingIntent) + } + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to draw widget", e) + } + return null + } + + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + // multiple rendering for all possible sizes + val views = RemoteViews( + bytesBySizeDip.associateBy( + { (sizeDip, _) -> sizeDip }, + { (sizeDip, bytes) -> createRemoteViewsForSize(context, widgetId, sizeDip, bytes, updateOnTap) }, + ).filterValues { it != null }.mapValues { (_, view) -> view!! } + ) + appWidgetManager.updateAppWidget(widgetId, views) + } else { + // single rendering + val (sizeDip, bytes) = bytesBySizeDip.first() + val views = createRemoteViewsForSize(context, widgetId, sizeDip, bytes, updateOnTap) + appWidgetManager.updateAppWidget(widgetId, views) + } + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to draw widget", e) + } finally { + bitmaps.forEach { it.recycle() } + bitmaps.clear() + } + } + + private fun buildUpdateIntent(context: Context, widgetId: Int): PendingIntent { + val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, "widget://$widgetId".toUri(), context, HomeWidgetProvider::class.java) + .putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(widgetId)) + + return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + } + + private fun buildOpenAppIntent(context: Context, widgetId: Int): PendingIntent { + // set a unique URI to prevent the intent (and its extras) from being shared by different widgets + val intent = Intent(MainActivity.INTENT_ACTION_WIDGET_OPEN, "widget://$widgetId".toUri(), context, MainActivity::class.java) + .putExtra(MainActivity.EXTRA_KEY_WIDGET_ID, widgetId) + + return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + private const val WIDGET_DART_ENTRYPOINT = "widgetMain" + private const val WIDGET_DRAW_CHANNEL = "deckers.thibault/aves/widget_draw" + private const val DRAW_RETRY_MAX = 5 + + private var flutterEngine: FlutterEngine? = null + private var imageByteFetchJob: Job? = null + + private suspend fun initFlutterEngine(context: Context) { + if (flutterEngine != null) return + + FlutterUtils.runOnUiThread { + flutterEngine = FlutterEngine(context.applicationContext) + } + initChannels(context) + + flutterEngine!!.apply { + if (!dartExecutor.isExecutingDart) { + val appBundlePathOverride = FlutterInjector.instance().flutterLoader().findAppBundlePath() + val entrypoint = DartExecutor.DartEntrypoint(appBundlePathOverride, WIDGET_DART_ENTRYPOINT) + FlutterUtils.runOnUiThread { + dartExecutor.executeDartEntrypoint(entrypoint) + } + } + } + } + + private fun initChannels(context: Context) { + val engine = flutterEngine + engine ?: throw Exception("Flutter engine is not initialized") + + val messenger = engine.dartExecutor + + // dart -> platform -> dart + // - need Context + MethodChannel(messenger, DeviceHandler.CHANNEL).setMethodCallHandler(DeviceHandler(context)) + MethodChannel(messenger, MediaStoreHandler.CHANNEL).setMethodCallHandler(MediaStoreHandler(context)) + MethodChannel(messenger, MediaFetchObjectHandler.CHANNEL).setMethodCallHandler(MediaFetchObjectHandler(context)) + MethodChannel(messenger, StorageHandler.CHANNEL).setMethodCallHandler(StorageHandler(context)) + + // result streaming: dart -> platform ->->-> dart + // - need Context + StreamsChannel(messenger, ImageByteStreamHandler.CHANNEL).setStreamHandlerFactory { args -> ImageByteStreamHandler(context, args) } + StreamsChannel(messenger, MediaStoreStreamHandler.CHANNEL).setStreamHandlerFactory { args -> MediaStoreStreamHandler(context, args) } + } + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt b/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt new file mode 100644 index 0000000..87bfd60 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt @@ -0,0 +1,762 @@ +package deckers.thibault.aves + +import android.annotation.SuppressLint +import android.app.KeyguardManager +import android.app.SearchManager +import android.appwidget.AppWidgetManager +import android.content.ClipData +import android.content.Intent +import android.content.res.Configuration +import android.graphics.RectF +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.os.TransactionTooLargeException +import android.os.ext.SdkExtensions +import android.provider.MediaStore +import android.util.Log +import androidx.annotation.RequiresApi +import androidx.core.content.pm.ShortcutInfoCompat +import androidx.core.content.pm.ShortcutManagerCompat +import androidx.core.graphics.drawable.IconCompat +import androidx.core.net.toUri +import app.loup.streams_channel.StreamsChannel +import deckers.thibault.aves.channel.calls.AccessibilityHandler +import deckers.thibault.aves.channel.calls.AnalysisHandler +import deckers.thibault.aves.channel.calls.AppAdapterHandler +import deckers.thibault.aves.channel.calls.AppProfileHandler +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import deckers.thibault.aves.channel.calls.DebugHandler +import deckers.thibault.aves.channel.calls.DeviceHandler +import deckers.thibault.aves.channel.calls.EmbeddedDataHandler +import deckers.thibault.aves.channel.calls.GeocodingHandler +import deckers.thibault.aves.channel.calls.GlobalSearchHandler +import deckers.thibault.aves.channel.calls.HomeWidgetHandler +import deckers.thibault.aves.channel.calls.MediaEditHandler +import deckers.thibault.aves.channel.calls.MediaFetchObjectHandler +import deckers.thibault.aves.channel.calls.MediaSessionHandler +import deckers.thibault.aves.channel.calls.MediaStoreHandler +import deckers.thibault.aves.channel.calls.MetadataEditHandler +import deckers.thibault.aves.channel.calls.MetadataFetchHandler +import deckers.thibault.aves.channel.calls.SecurityHandler +import deckers.thibault.aves.channel.calls.StorageHandler +import deckers.thibault.aves.channel.calls.WallpaperHandler +import deckers.thibault.aves.channel.calls.window.ActivityWindowHandler +import deckers.thibault.aves.channel.calls.window.WindowHandler +import deckers.thibault.aves.channel.streams.darttoplatform.ActivityResultStreamHandler +import deckers.thibault.aves.channel.streams.darttoplatform.ImageByteStreamHandler +import deckers.thibault.aves.channel.streams.darttoplatform.ImageOpStreamHandler +import deckers.thibault.aves.channel.streams.darttoplatform.MediaStoreStreamHandler +import deckers.thibault.aves.channel.streams.platformtodart.AnalysisStreamHandler +import deckers.thibault.aves.channel.streams.platformtodart.ErrorStreamHandler +import deckers.thibault.aves.channel.streams.platformtodart.IntentStreamHandler +import deckers.thibault.aves.channel.streams.platformtodart.MediaCommandStreamHandler +import deckers.thibault.aves.channel.streams.platformtodart.MediaStoreChangeStreamHandler +import deckers.thibault.aves.channel.streams.platformtodart.SettingsChangeStreamHandler +import deckers.thibault.aves.channel.streams.platformtodart.WindowChangeStreamHandler +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.anyCauseIs +import deckers.thibault.aves.utils.getParcelableExtraCompat +import io.flutter.embedding.android.FlutterFragmentActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.EventChannel +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import java.util.concurrent.CompletableFuture +import java.util.concurrent.ConcurrentHashMap +import java.io.FileInputStream + +import android.content.Context +import android.net.wifi.WifiManager + +import io.flutter.embedding.android.RenderMode + +// `FlutterFragmentActivity` because of local auth plugin +open class MainActivity : FlutterFragmentActivity() { + override fun getRenderMode(): RenderMode { + return RenderMode.texture + } + + private val defaultScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + + // stream handlers + private lateinit var mediaStoreChangeStreamHandler: MediaStoreChangeStreamHandler + private lateinit var settingsChangeStreamHandler: SettingsChangeStreamHandler + private lateinit var windowChangeStreamHandler: WindowChangeStreamHandler + private lateinit var intentStreamHandler: IntentStreamHandler + private lateinit var analysisStreamHandler: AnalysisStreamHandler + private lateinit var errorStreamHandler: ErrorStreamHandler + + // other handlers and state + internal lateinit var intentDataMap: MutableMap + private lateinit var analysisHandler: AnalysisHandler + private lateinit var mediaSessionHandler: MediaSessionHandler + + // pending callbacks / completers used by various flows + private var pendingScopedStoragePermissionCompleter: CompletableFuture? = null + private var pendingCollectionFilterPickHandler: ((List?) -> Unit)? = null + private var pendingEditIntentHandler: ((FieldMap?) -> Unit)? = null + + private var dlnaMulticastLock: WifiManager.MulticastLock? = null + + override fun onCreate(savedInstanceState: Bundle?) { + Log.i(LOG_TAG, "onCreate intent=$intent") + logExtras(intent, "onCreate") + + super.onCreate(savedInstanceState) + } + + private fun logExtras(intent: Intent?, method: String) { + try { + intent?.extras?.takeUnless { it.isEmpty }?.let { + Log.i(LOG_TAG, "$method intent extras=$it") + } + } catch (e: Exception) { + // accessing extras may fail if their type comes from sending app + Log.w(LOG_TAG, "failed to parse extras", e) + } + } + + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + super.configureFlutterEngine(flutterEngine) + + val messenger = flutterEngine.dartExecutor + + + // notification: platform -> dart + analysisStreamHandler = AnalysisStreamHandler().apply { + EventChannel(messenger, AnalysisStreamHandler.CHANNEL).setStreamHandler(this) + } + errorStreamHandler = ErrorStreamHandler().apply { + EventChannel(messenger, ErrorStreamHandler.CHANNEL).setStreamHandler(this) + } + mediaStoreChangeStreamHandler = MediaStoreChangeStreamHandler(this).apply { + EventChannel(messenger, MediaStoreChangeStreamHandler.CHANNEL).setStreamHandler(this) + } + settingsChangeStreamHandler = SettingsChangeStreamHandler(this).apply { + EventChannel(messenger, SettingsChangeStreamHandler.CHANNEL).setStreamHandler(this) + } + windowChangeStreamHandler = WindowChangeStreamHandler().apply { + EventChannel(messenger, WindowChangeStreamHandler.CHANNEL).setStreamHandler(this) + } + val mediaCommandStreamHandler = MediaCommandStreamHandler().apply { + EventChannel(messenger, MediaCommandStreamHandler.CHANNEL).setStreamHandler(this) + } + + // dart -> platform -> dart + // - need Context + analysisHandler = AnalysisHandler(this, ::onAnalysisCompleted) + mediaSessionHandler = MediaSessionHandler(this, mediaCommandStreamHandler) + MethodChannel(messenger, AnalysisHandler.CHANNEL).setMethodCallHandler(analysisHandler) + MethodChannel(messenger, AppAdapterHandler.CHANNEL).setMethodCallHandler(AppAdapterHandler(this)) + MethodChannel(messenger, DebugHandler.CHANNEL).setMethodCallHandler(DebugHandler(this)) + MethodChannel(messenger, DeviceHandler.CHANNEL).setMethodCallHandler(DeviceHandler(this)) + MethodChannel(messenger, EmbeddedDataHandler.CHANNEL).setMethodCallHandler(EmbeddedDataHandler(this)) + MethodChannel(messenger, GeocodingHandler.CHANNEL).setMethodCallHandler(GeocodingHandler(this)) + MethodChannel(messenger, GlobalSearchHandler.CHANNEL).setMethodCallHandler(GlobalSearchHandler(this)) + MethodChannel(messenger, HomeWidgetHandler.CHANNEL).setMethodCallHandler(HomeWidgetHandler(this)) + MethodChannel(messenger, MediaFetchObjectHandler.CHANNEL).setMethodCallHandler(MediaFetchObjectHandler(this)) + MethodChannel(messenger, MediaSessionHandler.CHANNEL).setMethodCallHandler(mediaSessionHandler) + MethodChannel(messenger, MediaStoreHandler.CHANNEL).setMethodCallHandler(MediaStoreHandler(this)) + MethodChannel(messenger, MetadataFetchHandler.CHANNEL).setMethodCallHandler(MetadataFetchHandler(this)) + MethodChannel(messenger, SecurityHandler.CHANNEL).setMethodCallHandler(SecurityHandler(this)) + MethodChannel(messenger, StorageHandler.CHANNEL).setMethodCallHandler(StorageHandler(this)) + // - need ContextWrapper + MethodChannel(messenger, AccessibilityHandler.CHANNEL).setMethodCallHandler(AccessibilityHandler(this)) + MethodChannel(messenger, MediaEditHandler.CHANNEL).setMethodCallHandler(MediaEditHandler(this)) + MethodChannel(messenger, MetadataEditHandler.CHANNEL).setMethodCallHandler(MetadataEditHandler(this)) + MethodChannel(messenger, WallpaperHandler.CHANNEL).setMethodCallHandler(WallpaperHandler(this)) + // - need Activity + MethodChannel(messenger, AppProfileHandler.CHANNEL).setMethodCallHandler(AppProfileHandler(this)) + MethodChannel(messenger, WindowHandler.CHANNEL).setMethodCallHandler(ActivityWindowHandler(this)) + + // result streaming: dart -> platform ->->-> dart + // - need Context + StreamsChannel(messenger, ImageByteStreamHandler.CHANNEL).setStreamHandlerFactory { args -> ImageByteStreamHandler(this, args) } + StreamsChannel(messenger, MediaStoreStreamHandler.CHANNEL).setStreamHandlerFactory { args -> MediaStoreStreamHandler(this, args) } + // - need Activity + StreamsChannel(messenger, ImageOpStreamHandler.CHANNEL).setStreamHandlerFactory { args -> ImageOpStreamHandler(this, args) } + StreamsChannel(messenger, ActivityResultStreamHandler.CHANNEL).setStreamHandlerFactory { args -> ActivityResultStreamHandler(this, args) } + + // intent handling + // notification: platform -> dart + intentStreamHandler = IntentStreamHandler().apply { + EventChannel(messenger, IntentStreamHandler.CHANNEL).setStreamHandler(this) + } + // intent detail & result: dart -> platform + intentDataMap = extractIntentData(intent) + MethodChannel(messenger, INTENT_CHANNEL).setMethodCallHandler { call, result -> + when (call.method) { + "getIntentData" -> { + result.success(intentDataMap) + intentDataMap.clear() + } + + "submitPickedItems" -> safe(call, result, ::submitPickedItems) + "submitPickedCollectionFilters" -> submitPickedCollectionFilters(call) + } + } + + EntryPathChannel(this).register(flutterEngine) + + MethodChannel(messenger, "aves/file_descriptor").setMethodCallHandler { call, result -> + if (call.method == "openFileDescriptor") { + val uriString = call.argument("uri") + if (uriString == null) { + result.error("INVALID", "uri mancante", null) + return@setMethodCallHandler + } + + try { + val uri = Uri.parse(uriString) + val pfd = contentResolver.openFileDescriptor(uri, "r") + if (pfd == null) { + result.error("NOT_FOUND", "Impossibile aprire $uriString", null) + return@setMethodCallHandler + } + + val input = FileInputStream(pfd.fileDescriptor) + val bytes = input.readBytes() + input.close() + pfd.close() + + result.success(bytes) + } catch (e: Exception) { + result.error("ERROR", e.toString(), null) + } + } else { + result.notImplemented() + } + } + +// DLNA multicast lock +MethodChannel(messenger, "aves/dlna").setMethodCallHandler { call, result -> + when (call.method) { + + "dlnaAcquireLock" -> { + try { + if (dlnaMulticastLock == null) { + val wifi = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager + dlnaMulticastLock = wifi.createMulticastLock("dlna_lock") + dlnaMulticastLock?.setReferenceCounted(true) + } + dlnaMulticastLock?.acquire() + result.success(true) + } catch (e: Exception) { + result.error("ERROR", e.toString(), null) + } + } + + "dlnaReleaseLock" -> { + try { + dlnaMulticastLock?.let { + if (it.isHeld) it.release() + } + result.success(true) + } catch (e: Exception) { + result.error("ERROR", e.toString(), null) + } + } + + else -> result.notImplemented() + } +} + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + defaultScope.launch { setupShortcuts() } + } + } + + override fun onStart() { + Log.i(LOG_TAG, "onStart") + super.onStart() + analysisHandler.attachToActivity() + + Handler(Looper.getMainLooper()).postDelayed({ + window.decorView.requestApplyInsets() + }, 100) + } + + override fun onStop() { + Log.i(LOG_TAG, "onStop") + super.onStop() + } + + override fun onDestroy() { + Log.i(LOG_TAG, "onDestroy") + mediaSessionHandler.dispose() + mediaStoreChangeStreamHandler.dispose() + settingsChangeStreamHandler.dispose() + try { + super.onDestroy() + } catch (e: Exception) { + Log.e(LOG_TAG, "failed while destroying activity", e) + } + } + + @Deprecated("Deprecated in android.app.Activity") + override fun onMultiWindowModeChanged(isInMultiWindowMode: Boolean) { + @Suppress("deprecation") + super.onMultiWindowModeChanged(isInMultiWindowMode) + notifyWindowModeChange() + } + + override fun onMultiWindowModeChanged(isInMultiWindowMode: Boolean, newConfig: Configuration) { + super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig) + notifyWindowModeChange() + } + + @Deprecated("Deprecated in android.app.Activity") + override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) { + @Suppress("deprecation") + super.onPictureInPictureModeChanged(isInPictureInPictureMode) + notifyWindowModeChange() + } + + override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration) { + super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig) + notifyWindowModeChange() + } + + private var lastCutoutInsetsDpi = RectF() + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + val cutoutInsetsDpi = ActivityWindowHandler.getCutoutInsetsDpi(this) + if (lastCutoutInsetsDpi != cutoutInsetsDpi) { + lastCutoutInsetsDpi = cutoutInsetsDpi + notifyCutoutInsetsChange() + } + } + + private fun notifyWindowModeChange() = windowChangeStreamHandler.notifyWindowModeChange() + + private fun notifyCutoutInsetsChange() = windowChangeStreamHandler.notifyCutoutInsetsChange() + + override fun onNewIntent(intent: Intent) { + Log.i(LOG_TAG, "onNewIntent intent=$intent") + logExtras(intent, "onNewIntent") + super.onNewIntent(intent) + intentStreamHandler.notifyNewIntent(extractIntentData(intent)) + } + + @Deprecated("Deprecated in Java") + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + Log.i(LOG_TAG, "onActivityResult requestCode=$requestCode resultCode=$resultCode data=$data") + logExtras(data, "onActivityResult") + super.onActivityResult(requestCode, resultCode, data) + when (requestCode) { + DOCUMENT_TREE_ACCESS_REQUEST -> onDocumentTreeAccessResult(requestCode, resultCode, data) + DELETE_SINGLE_PERMISSION_REQUEST, + MEDIA_WRITE_BULK_PERMISSION_REQUEST -> onScopedStoragePermissionResult(resultCode) + + CREATE_FILE_REQUEST, + OPEN_FILE_REQUEST -> onStorageAccessResult(requestCode, data?.data) + + PICK_COLLECTION_FILTERS_REQUEST -> onCollectionFiltersPickResult(resultCode, data) + EDIT_REQUEST -> onEditResult(resultCode, data) + } + } + + private fun onCollectionFiltersPickResult(resultCode: Int, intent: Intent?) { + val filters = if (resultCode == RESULT_OK) extractFiltersFromIntent(intent) else null + pendingCollectionFilterPickHandler?.let { it(filters) } + } + + private fun onEditResult(resultCode: Int, intent: Intent?) { + val fields: FieldMap? = if (resultCode == RESULT_OK) hashMapOf( + "uri" to intent?.data?.toString(), + "mimeType" to intent?.type, + ) else null + pendingEditIntentHandler?.let { it(fields) } + } + + private fun onDocumentTreeAccessResult(requestCode: Int, resultCode: Int, intent: Intent?) { + val treeUri = intent?.data + if (resultCode != RESULT_OK || treeUri == null) { + onStorageAccessResult(requestCode, null) + return + } + + val canPersist = (intent.flags and Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) != 0 + @SuppressLint("WrongConstant") + if (canPersist) { + val takeFlags = (intent.flags + and (Intent.FLAG_GRANT_READ_URI_PERMISSION + or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)) + try { + contentResolver.takePersistableUriPermission(treeUri, takeFlags) + } catch (e: SecurityException) { + Log.w(LOG_TAG, "failed to take persistable URI permission for uri=$treeUri", e) + } + } + + onStorageAccessResult(requestCode, treeUri) + } + + private fun onScopedStoragePermissionResult(resultCode: Int) { + pendingScopedStoragePermissionCompleter?.complete(resultCode == RESULT_OK) + } + + open fun extractIntentData(intent: Intent?): FieldMap { + when (val action = intent?.action) { + Intent.ACTION_MAIN -> { + return hashMapOf( + INTENT_DATA_KEY_PAGE to intent.getStringExtra(EXTRA_KEY_PAGE), + INTENT_DATA_KEY_FILTERS to extractFiltersFromIntent(intent), + INTENT_DATA_KEY_EXPLORER_PATH to intent.getStringExtra(EXTRA_KEY_EXPLORER_PATH), + ) + } + + Intent.ACTION_VIEW, + Intent.ACTION_SEND, + MediaStore.ACTION_REVIEW, + MediaStore.ACTION_REVIEW_SECURE, + "com.android.camera.action.REVIEW", + "com.android.camera.action.SPLIT_SCREEN_REVIEW" -> { + (intent.data ?: intent.getParcelableExtraCompat(Intent.EXTRA_STREAM))?.let { uri -> + if (uri.scheme == "geo") { + return hashMapOf( + INTENT_DATA_KEY_ACTION to INTENT_ACTION_VIEW_GEO, + INTENT_DATA_KEY_URI to uri.toString(), + INTENT_DATA_KEY_FILTERS to extractFiltersFromIntent(intent), + ) + } + + // MIME type is optional + val type = intent.type ?: intent.resolveType(this) + val fields = hashMapOf( + INTENT_DATA_KEY_ACTION to INTENT_ACTION_VIEW, + INTENT_DATA_KEY_MIME_TYPE to type, + INTENT_DATA_KEY_URI to uri.toString(), + ) + + val keyguardManager = getSystemService(KEYGUARD_SERVICE) as KeyguardManager + val isLocked = keyguardManager.isKeyguardLocked + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + setShowWhenLocked(isLocked) + } + if (isLocked) { + // device is locked, so access to content is limited to intent URI by default + fields[INTENT_DATA_KEY_SECURE_URIS] = listOf(uri.toString()) + } + + if (action == MediaStore.ACTION_REVIEW_SECURE) { + val uris = ArrayList() + intent.clipData?.let { clipData -> + for (i in 0..= Build.VERSION_CODES.Q && intent.hasExtra(MediaStore.EXTRA_BRIGHTNESS)) { + fields[INTENT_DATA_KEY_BRIGHTNESS] = intent.getFloatExtra(MediaStore.EXTRA_BRIGHTNESS, 0f) + } + + return fields + } + } + + Intent.ACTION_EDIT -> { + (intent.data ?: intent.getParcelableExtraCompat(Intent.EXTRA_STREAM))?.let { uri -> + // MIME type is optional + val type = intent.type ?: intent.resolveType(this) + return hashMapOf( + INTENT_DATA_KEY_ACTION to INTENT_ACTION_EDIT, + INTENT_DATA_KEY_MIME_TYPE to type, + INTENT_DATA_KEY_URI to uri.toString(), + ) + } + } + + Intent.ACTION_GET_CONTENT, + Intent.ACTION_PICK, + MediaStore.ACTION_PICK_IMAGES -> { + // common intent extras + var allowMultiple = intent.getBooleanExtra(Intent.EXTRA_ALLOW_MULTIPLE, false) + val mimeTypes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES)?.toList() + val pickLocalOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false) + + // MediaStore picker intent extras + var pickImagesMax = 0 + var pickInOrder = false + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { + pickImagesMax = intent.getIntExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, 0) + } + if (SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 12) { + pickInOrder = intent.getBooleanExtra(MediaStore.EXTRA_PICK_IMAGES_IN_ORDER, false) + } + } + allowMultiple = allowMultiple || pickImagesMax > 0 + + return hashMapOf( + INTENT_DATA_KEY_ACTION to INTENT_ACTION_PICK_ITEMS, + INTENT_DATA_KEY_MIME_TYPE to intent.type, + INTENT_DATA_KEY_MIME_TYPES to mimeTypes, + INTENT_DATA_KEY_ALLOW_MULTIPLE to allowMultiple, + INTENT_DATA_KEY_PICK_IN_ORDER to pickInOrder, + INTENT_DATA_KEY_PICK_LOCAL_ONLY to pickLocalOnly, + ) + } + + Intent.ACTION_SEARCH -> { + val viewUri = intent.dataString + return if (viewUri != null) hashMapOf( + INTENT_DATA_KEY_ACTION to INTENT_ACTION_VIEW, + INTENT_DATA_KEY_MIME_TYPE to intent.getStringExtra(SearchManager.EXTRA_DATA_KEY), + INTENT_DATA_KEY_URI to viewUri, + ) else hashMapOf( + INTENT_DATA_KEY_ACTION to INTENT_ACTION_SEARCH, + INTENT_DATA_KEY_QUERY to intent.getStringExtra(SearchManager.QUERY), + ) + } + + INTENT_ACTION_PICK_COLLECTION_FILTERS -> { + val initialFilters = extractFiltersFromIntent(intent) + return hashMapOf( + INTENT_DATA_KEY_ACTION to action, + INTENT_DATA_KEY_FILTERS to initialFilters, + ) + } + + INTENT_ACTION_WIDGET_OPEN -> { + val widgetId = intent.getIntExtra(EXTRA_KEY_WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID) + if (widgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { + return hashMapOf( + INTENT_DATA_KEY_ACTION to action, + INTENT_DATA_KEY_WIDGET_ID to widgetId, + ) + } + } + + Intent.ACTION_RUN -> { + // flutter run + } + + else -> { + Log.w(LOG_TAG, "unhandled intent action=${intent?.action}") + } + } + return HashMap() + } + + private fun extractFiltersFromIntent(intent: Intent?): List? { + intent ?: return null + + val filters = intent.getStringArrayExtra(EXTRA_KEY_FILTERS_ARRAY)?.toList() + if (filters != null) return filters + + // fallback for shortcuts created on API <26 + val filterString = intent.getStringExtra(EXTRA_KEY_FILTERS_STRING) + if (filterString != null) { + return filterString.split(EXTRA_STRING_ARRAY_SEPARATOR) + } + + return null + } + + open fun submitPickedItems(call: MethodCall, result: MethodChannel.Result) { + val pickedUris = call.argument>("uris") + if (pickedUris.isNullOrEmpty()) { + setResult(RESULT_CANCELED) + // move code triggering `Binder` call off the main thread + defaultScope.launch { finish() } + return + } + + val toUri = { uriString: String -> AppAdapterHandler.getShareableUri(this@MainActivity, uriString.toUri()) } + val intent = Intent().apply { + val firstUri = toUri(pickedUris.first()) + if (pickedUris.size == 1) { + data = firstUri + } else { + clipData = ClipData.newUri(contentResolver, null, firstUri).apply { + pickedUris.drop(1).forEach { + addItem(ClipData.Item(toUri(it))) + } + } + } + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + } + // move code triggering `Binder` call off the main thread + defaultScope.launch { + submitPickedItemsIntent(intent, result) + } + } + + private fun submitPickedItemsIntent(intent: Intent, result: MethodChannel.Result) { + try { + setResult(RESULT_OK, intent) + finish() + } catch (e: Exception) { + setResult(RESULT_CANCELED) + if (e is SecurityException && intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION != 0) { + // in some environments, providing the write flag yields a `SecurityException`: + // "UID XXXX does not have permission to content://XXXX" + // so we retry without it + Log.i(LOG_TAG, "retry submitting picked items without FLAG_GRANT_WRITE_URI_PERMISSION") + intent.flags = intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION.inv() + submitPickedItemsIntent(intent, result) + } else if (e.anyCauseIs()) { + result.error("submitPickedItems-large", "transaction too large with ${intent.clipData?.itemCount} URIs", e) + } else { + result.error("submitPickedItems-exception", "failed to pick ${intent.clipData?.itemCount} URIs", e) + } + } + } + + private fun submitPickedCollectionFilters(call: MethodCall) { + val filters = call.argument>("filters") + if (filters != null) { + val intent = Intent() + .putExtra(EXTRA_KEY_FILTERS_ARRAY, filters.toTypedArray()) + .putExtra(EXTRA_KEY_FILTERS_STRING, filters.joinToString(EXTRA_STRING_ARRAY_SEPARATOR)) + setResult(RESULT_OK, intent) + } else { + setResult(RESULT_CANCELED) + } + finish() + } + + @RequiresApi(Build.VERSION_CODES.N_MR1) + private fun setupShortcuts() { + // do not use 'route' as extra key, as the Flutter framework acts on it + + // shortcut adaptive icons are placed in `mipmap`, not `drawable`, + // so that foreground is rendered at the intended scale + val supportAdaptiveIcon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O + + val search = ShortcutInfoCompat.Builder(this, "search") + .setShortLabel(getString(R.string.search_shortcut_short_label)) + .setIcon(IconCompat.createWithResource(this, if (supportAdaptiveIcon) R.mipmap.ic_shortcut_search else R.drawable.ic_shortcut_search)) + .setIntent( + Intent(Intent.ACTION_MAIN, null, this, MainActivity::class.java) + .putExtra(EXTRA_KEY_PAGE, SEARCH_PAGE_ROUTE_NAME) + ) + .build() + + val map = ShortcutInfoCompat.Builder(this, "map") + .setShortLabel(getString(R.string.map_shortcut_short_label)) + .setIcon(IconCompat.createWithResource(this, if (supportAdaptiveIcon) R.mipmap.ic_shortcut_map else R.drawable.ic_shortcut_map)) + .setIntent( + Intent(Intent.ACTION_MAIN, null, this, MainActivity::class.java) + .putExtra(EXTRA_KEY_PAGE, MAP_PAGE_ROUTE_NAME) + ) + .build() + + val videos = ShortcutInfoCompat.Builder(this, "videos") + .setShortLabel(getString(R.string.videos_shortcut_short_label)) + .setIcon(IconCompat.createWithResource(this, if (supportAdaptiveIcon) R.mipmap.ic_shortcut_movie else R.drawable.ic_shortcut_movie)) + .setIntent( + Intent(Intent.ACTION_MAIN, null, this, MainActivity::class.java) + .putExtra(EXTRA_KEY_PAGE, COLLECTION_PAGE_ROUTE_NAME) + .putExtra("filters", arrayOf("{\"type\":\"mime\",\"mime\":\"video/*\"}")) + ) + .build() + + val shortcutInfoList = listOf(videos, search, map) + ShortcutManagerCompat.setDynamicShortcuts(this, shortcutInfoList) + Log.i(LOG_TAG, "set shortcuts: ${shortcutInfoList.joinToString(", ") { v -> v.id }}") + } + + private fun onAnalysisCompleted() { + analysisStreamHandler.notifyCompletion() + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val INTENT_CHANNEL = "deckers.thibault/aves/intent" + const val EXTRA_STRING_ARRAY_SEPARATOR = "###" + const val DOCUMENT_TREE_ACCESS_REQUEST = 1 + const val OPEN_FROM_ANALYSIS_SERVICE = 2 + const val CREATE_FILE_REQUEST = 3 + const val OPEN_FILE_REQUEST = 4 + const val DELETE_SINGLE_PERMISSION_REQUEST = 5 + const val MEDIA_WRITE_BULK_PERMISSION_REQUEST = 6 + const val PICK_COLLECTION_FILTERS_REQUEST = 7 + const val EDIT_REQUEST = 8 + + const val INTENT_ACTION_EDIT = "edit" + const val INTENT_ACTION_PICK_ITEMS = "pick_items" + const val INTENT_ACTION_PICK_COLLECTION_FILTERS = "pick_collection_filters" + const val INTENT_ACTION_SCREEN_SAVER = "screen_saver" + const val INTENT_ACTION_SCREEN_SAVER_SETTINGS = "screen_saver_settings" + const val INTENT_ACTION_SEARCH = "search" + const val INTENT_ACTION_SET_WALLPAPER = "set_wallpaper" + const val INTENT_ACTION_VIEW = "view" + const val INTENT_ACTION_VIEW_GEO = "view_geo" + const val INTENT_ACTION_WIDGET_OPEN = "widget_open" + const val INTENT_ACTION_WIDGET_SETTINGS = "widget_settings" + + const val INTENT_DATA_KEY_ACTION = "action" + const val INTENT_DATA_KEY_ALLOW_MULTIPLE = "allowMultiple" + const val INTENT_DATA_KEY_BRIGHTNESS = "brightness" + const val INTENT_DATA_KEY_EXPLORER_PATH = "explorerPath" + const val INTENT_DATA_KEY_FILTERS = "filters" + const val INTENT_DATA_KEY_MIME_TYPE = "mimeType" + const val INTENT_DATA_KEY_MIME_TYPES = "mimeTypes" + const val INTENT_DATA_KEY_PAGE = "page" + const val INTENT_DATA_KEY_PICK_IN_ORDER = "pickInOrder" + const val INTENT_DATA_KEY_PICK_LOCAL_ONLY = "pickLocalOnly" + const val INTENT_DATA_KEY_QUERY = "query" + const val INTENT_DATA_KEY_SECURE_URIS = "secureUris" + const val INTENT_DATA_KEY_URI = "uri" + const val INTENT_DATA_KEY_WIDGET_ID = "widgetId" + + const val EXTRA_KEY_PAGE = "page" + const val EXTRA_KEY_EXPLORER_PATH = "explorerPath" + const val EXTRA_KEY_FILTERS_ARRAY = "filters" + const val EXTRA_KEY_FILTERS_STRING = "filtersString" + const val EXTRA_KEY_WIDGET_ID = "widgetId" + + // dart page routes + const val COLLECTION_PAGE_ROUTE_NAME = "/collection" + const val ENTRY_VIEWER_PAGE_ROUTE_NAME = "/viewer" + const val EXPLORER_PAGE_ROUTE_NAME = "/explorer" + const val MAP_PAGE_ROUTE_NAME = "/map" + const val SEARCH_PAGE_ROUTE_NAME = "/search" + + // request code to pending runnable + val pendingStorageAccessResultHandlers = ConcurrentHashMap() + + var pendingScopedStoragePermissionCompleter: CompletableFuture? = null + + var pendingCollectionFilterPickHandler: ((filters: List?) -> Unit)? = null + + var pendingEditIntentHandler: ((fields: FieldMap?) -> Unit)? = null + + private fun onStorageAccessResult(requestCode: Int, uri: Uri?) { + Log.i(LOG_TAG, "onStorageAccessResult with requestCode=$requestCode, uri=$uri") + val handler = pendingStorageAccessResultHandlers.remove(requestCode) ?: return + if (uri != null) { + handler.onGranted(uri) + } else { + handler.onDenied() + } + } + + private var errorStreamHandler: ErrorStreamHandler? = null + + fun notifyError(error: String) { + Log.e(LOG_TAG, "notifyError error=$error") + errorStreamHandler?.notifyError(error) + } + } + + +} + +// onGranted: user selected a directory/file (with no guarantee that it matches the requested `path`) +// onDenied: user cancelled +data class PendingStorageAccessResultHandler(val path: String?, val onGranted: (uri: Uri) -> Unit, val onDenied: () -> Unit) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/MediaPlaybackService.kt b/android/app/src/main/kotlin/deckers/thibault/aves/MediaPlaybackService.kt new file mode 100644 index 0000000..ed97c54 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/MediaPlaybackService.kt @@ -0,0 +1,18 @@ +package deckers.thibault.aves + +import android.os.Bundle +import android.support.v4.media.MediaBrowserCompat +import androidx.media.MediaBrowserServiceCompat + +// dummy service to handle media button events +// when there is no active media sessions +class MediaPlaybackService : MediaBrowserServiceCompat() { + override fun onGetRoot(clientPackageName: String, clientUid: Int, rootHints: Bundle?): BrowserRoot? { + return null + } + + override fun onLoadChildren(parentId: String, result: Result>) { + val children = mutableListOf() + result.sendResult(children) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/ScreenSaverService.kt b/android/app/src/main/kotlin/deckers/thibault/aves/ScreenSaverService.kt new file mode 100644 index 0000000..d65e708 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/ScreenSaverService.kt @@ -0,0 +1,155 @@ +package deckers.thibault.aves + +import android.service.dreams.DreamService +import android.util.Log +import android.view.View +import app.loup.streams_channel.StreamsChannel +import deckers.thibault.aves.channel.calls.AccessibilityHandler +import deckers.thibault.aves.channel.calls.DeviceHandler +import deckers.thibault.aves.channel.calls.EmbeddedDataHandler +import deckers.thibault.aves.channel.calls.MediaFetchObjectHandler +import deckers.thibault.aves.channel.calls.MediaSessionHandler +import deckers.thibault.aves.channel.calls.MediaStoreHandler +import deckers.thibault.aves.channel.calls.MetadataFetchHandler +import deckers.thibault.aves.channel.calls.StorageHandler +import deckers.thibault.aves.channel.calls.window.ServiceWindowHandler +import deckers.thibault.aves.channel.calls.window.WindowHandler +import deckers.thibault.aves.channel.streams.darttoplatform.ImageByteStreamHandler +import deckers.thibault.aves.channel.streams.darttoplatform.MediaStoreStreamHandler +import deckers.thibault.aves.channel.streams.platformtodart.MediaCommandStreamHandler +import deckers.thibault.aves.utils.LogUtils +import io.flutter.FlutterInjector +import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.android.FlutterSurfaceView +import io.flutter.embedding.android.FlutterView +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.embedding.engine.dart.DartExecutor.DartEntrypoint +import io.flutter.embedding.engine.plugins.util.GeneratedPluginRegister +import io.flutter.plugin.common.EventChannel +import io.flutter.plugin.common.MethodChannel + +// for FlutterView-level integration, cf https://docs.flutter.dev/development/add-to-app/android/add-flutter-view +class ScreenSaverService : DreamService() { + private var flutterEngine: FlutterEngine? = null + private var flutterView: FlutterView? = null + private lateinit var mediaSessionHandler: MediaSessionHandler + + override fun onAttachedToWindow() { + Log.i(LOG_TAG, "onAttachedToWindow") + super.onAttachedToWindow() + initDream() + createEngine() + setContentView(createView()) + } + + override fun onDreamingStarted() { + Log.i(LOG_TAG, "onDreamingStarted") + super.onDreamingStarted() + onStart() + } + + override fun onDreamingStopped() { + Log.i(LOG_TAG, "onDreamingStopped") + release() + super.onDreamingStopped() + } + + override fun onDetachedFromWindow() { + Log.i(LOG_TAG, "onDetachedFromWindow") + destroyView() + super.onDetachedFromWindow() + } + + private fun initDream() { + isInteractive = false + isFullscreen = true + } + + private fun createEngine() { + flutterEngine = flutterEngine ?: FlutterEngine(this, null, false) + GeneratedPluginRegister.registerGeneratedPlugins(flutterEngine!!) + initChannels() + } + + private fun createView(): View { + flutterView = FlutterView(this, FlutterSurfaceView(this)).apply { + id = FlutterActivity.FLUTTER_VIEW_ID + attachToFlutterEngine(flutterEngine!!) + } + return flutterView!! + } + + private fun destroyView() { + flutterEngine?.lifecycleChannel?.appIsDetached() + flutterView?.detachFromFlutterEngine() + } + + private fun release() { + destroyView() + mediaSessionHandler.dispose() + flutterEngine = null + flutterView = null + } + + private fun onStart() { + flutterEngine!!.apply { + if (!dartExecutor.isExecutingDart) { + navigationChannel.setInitialRoute(DEFAULT_INITIAL_ROUTE) + val appBundlePathOverride = FlutterInjector.instance().flutterLoader().findAppBundlePath() + val entrypoint = DartEntrypoint(appBundlePathOverride, DEFAULT_DART_ENTRYPOINT) + dartExecutor.executeDartEntrypoint(entrypoint) + } + lifecycleChannel.appIsResumed() + } + } + + private fun initChannels() { + val messenger = flutterEngine!!.dartExecutor + + // notification: platform -> dart + val mediaCommandStreamHandler = MediaCommandStreamHandler().apply { + EventChannel(messenger, MediaCommandStreamHandler.CHANNEL).setStreamHandler(this) + } + + // dart -> platform -> dart + // - need Context + mediaSessionHandler = MediaSessionHandler(this, mediaCommandStreamHandler) + MethodChannel(messenger, DeviceHandler.CHANNEL).setMethodCallHandler(DeviceHandler(this)) + MethodChannel(messenger, EmbeddedDataHandler.CHANNEL).setMethodCallHandler(EmbeddedDataHandler(this)) + MethodChannel(messenger, MediaFetchObjectHandler.CHANNEL).setMethodCallHandler(MediaFetchObjectHandler(this)) + MethodChannel(messenger, MediaSessionHandler.CHANNEL).setMethodCallHandler(mediaSessionHandler) + MethodChannel(messenger, MediaStoreHandler.CHANNEL).setMethodCallHandler(MediaStoreHandler(this)) + MethodChannel(messenger, MetadataFetchHandler.CHANNEL).setMethodCallHandler(MetadataFetchHandler(this)) + MethodChannel(messenger, StorageHandler.CHANNEL).setMethodCallHandler(StorageHandler(this)) + // - need ContextWrapper + MethodChannel(messenger, AccessibilityHandler.CHANNEL).setMethodCallHandler(AccessibilityHandler(this)) + // - need Service + MethodChannel(messenger, WindowHandler.CHANNEL).setMethodCallHandler(ServiceWindowHandler(this)) + + // result streaming: dart -> platform ->->-> dart + // - need Context + StreamsChannel(messenger, ImageByteStreamHandler.CHANNEL).setStreamHandlerFactory { args -> ImageByteStreamHandler(this, args) } + StreamsChannel(messenger, MediaStoreStreamHandler.CHANNEL).setStreamHandlerFactory { args -> MediaStoreStreamHandler(this, args) } + + // intent handling + // detail fetch: dart -> platform + MethodChannel(messenger, MainActivity.INTENT_CHANNEL).setMethodCallHandler { call, result -> + when (call.method) { + "getIntentData" -> { + result.success(intentDataMap) + } + } + } + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + private val intentDataMap: Map = hashMapOf( + MainActivity.INTENT_DATA_KEY_ACTION to MainActivity.INTENT_ACTION_SCREEN_SAVER, + ) + + // from `FlutterActivityLaunchConfigs` + const val DEFAULT_DART_ENTRYPOINT = "main" + const val DEFAULT_INITIAL_ROUTE = "/" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/ScreenSaverSettingsActivity.kt b/android/app/src/main/kotlin/deckers/thibault/aves/ScreenSaverSettingsActivity.kt new file mode 100644 index 0000000..2d7e070 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/ScreenSaverSettingsActivity.kt @@ -0,0 +1,12 @@ +package deckers.thibault.aves + +import android.content.Intent +import deckers.thibault.aves.model.FieldMap + +class ScreenSaverSettingsActivity : MainActivity() { + override fun extractIntentData(intent: Intent?): FieldMap { + return hashMapOf( + INTENT_DATA_KEY_ACTION to INTENT_ACTION_SCREEN_SAVER_SETTINGS, + ) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/SearchSuggestionsProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/SearchSuggestionsProvider.kt new file mode 100644 index 0000000..c53f195 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/SearchSuggestionsProvider.kt @@ -0,0 +1,149 @@ +package deckers.thibault.aves + +import android.app.SearchManager +import android.content.ContentProvider +import android.content.ContentValues +import android.content.Context +import android.database.Cursor +import android.database.MatrixCursor +import android.net.Uri +import android.os.Build +import android.text.format.DateFormat +import android.util.Log +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.utils.ContextUtils.resourceUri +import deckers.thibault.aves.utils.FlutterUtils +import deckers.thibault.aves.utils.LogUtils +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.suspendCancellableCoroutine +import java.util.Locale +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException + +class SearchSuggestionsProvider : ContentProvider() { + private val defaultScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + + override fun query(uri: Uri, projection: Array?, selection: String?, selectionArgs: Array?, sortOrder: String?): Cursor? { + return selectionArgs?.firstOrNull()?.let { query -> + // Samsung Finder does not support: + // - resource ID as value for SUGGEST_COLUMN_ICON_1 + // - SUGGEST_COLUMN_ICON_2 + // - SUGGEST_COLUMN_RESULT_CARD_IMAGE + val columns = arrayOf( + SearchManager.SUGGEST_COLUMN_INTENT_DATA, + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA, + SearchManager.SUGGEST_COLUMN_CONTENT_TYPE, + SearchManager.SUGGEST_COLUMN_TEXT_1, + SearchManager.SUGGEST_COLUMN_TEXT_2, + SearchManager.SUGGEST_COLUMN_ICON_1, + ) + + val matrixCursor = MatrixCursor(columns) + context?.let { context -> + // shortcut adaptive icons are placed in `mipmap`, not `drawable`, + // so that foreground is rendered at the intended scale + val supportAdaptiveIcon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O + + val searchShortcutTitle = "${context.resources.getString(R.string.search_shortcut_short_label)} $query" + val searchShortcutIcon = context.resourceUri(if (supportAdaptiveIcon) R.mipmap.ic_shortcut_search else R.drawable.ic_shortcut_search) + matrixCursor.addRow(arrayOf(null, null, null, searchShortcutTitle, null, searchShortcutIcon)) + + runBlocking { + getSuggestions(context, query).forEach { + val data = it["data"] + val mimeType = it["mimeType"] + val title = it["title"] + val subtitle = it["subtitle"] + val iconUri = it["iconUri"] + matrixCursor.addRow(arrayOf(data, mimeType, mimeType, title, subtitle, iconUri)) + } + } + } + matrixCursor + } + } + + private suspend fun getSuggestions(context: Context, query: String): List { + if (flutterEngine == null) { + FlutterUtils.initFlutterEngine(context, SHARED_PREFERENCES_KEY, CALLBACK_HANDLE_KEY) { + flutterEngine = it + } + } + + val engine = flutterEngine + engine ?: throw Exception("Flutter engine is not initialized") + + val messenger = engine.dartExecutor + val backgroundChannel = MethodChannel(messenger, BACKGROUND_CHANNEL).apply { + setMethodCallHandler { call, result -> + when (call.method) { + "initialized" -> { + Log.d(LOG_TAG, "background channel is ready") + result.success(null) + } + + else -> result.notImplemented() + } + } + } + + try { + return suspendCancellableCoroutine { cont -> + defaultScope.launch { + FlutterUtils.runOnUiThread { + backgroundChannel.invokeMethod( + "getSuggestions", hashMapOf( + "query" to query, + "locale" to Locale.getDefault().toString(), + "use24hour" to DateFormat.is24HourFormat(context), + ), object : MethodChannel.Result { + override fun success(result: Any?) { + @Suppress("unchecked_cast") + cont.resume(result as List) + } + + override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) { + cont.resumeWithException(Exception("$errorCode: $errorMessage\n$errorDetails")) + } + + override fun notImplemented() { + cont.resumeWithException(Exception("not implemented")) + } + }) + } + } + } + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to get suggestions", e) + return ArrayList() + } + } + + override fun onCreate(): Boolean = true + + override fun getType(uri: Uri): String? = null + + override fun insert(uri: Uri, values: ContentValues?): Uri = + throw UnsupportedOperationException("`insert` is not supported by this content provider") + + override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int = + throw UnsupportedOperationException("`delete` is not supported by this content provider") + + override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array?): Int = + throw UnsupportedOperationException("`update` is not supported by this content provider") + + companion object { + private val LOG_TAG = LogUtils.createTag() + private const val BACKGROUND_CHANNEL = "deckers.thibault/aves/global_search_background" + const val SHARED_PREFERENCES_KEY = "platform_search" + const val CALLBACK_HANDLE_KEY = "callback_handle" + + private var flutterEngine: FlutterEngine? = null + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/WallpaperActivity.kt b/android/app/src/main/kotlin/deckers/thibault/aves/WallpaperActivity.kt new file mode 100644 index 0000000..e06aea9 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/WallpaperActivity.kt @@ -0,0 +1,56 @@ +package deckers.thibault.aves + +import android.content.Intent +import android.net.Uri +import androidx.core.net.toUri +import deckers.thibault.aves.channel.calls.AppAdapterHandler +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.utils.getParcelableExtraCompat +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +class WallpaperActivity : MainActivity() { + private var originalIntent: String? = null + + override fun extractIntentData(intent: Intent?): FieldMap { + if (intent != null) { + when (intent.action) { + Intent.ACTION_ATTACH_DATA, Intent.ACTION_SET_WALLPAPER -> { + (intent.data ?: intent.getParcelableExtraCompat(Intent.EXTRA_STREAM))?.let { uri -> + // MIME type is optional + val type = intent.type ?: intent.resolveType(this) + return hashMapOf( + INTENT_DATA_KEY_ACTION to INTENT_ACTION_SET_WALLPAPER, + INTENT_DATA_KEY_MIME_TYPE to type, + INTENT_DATA_KEY_URI to uri.toString(), + ) + } + + // if the media URI is not provided we need to pick one first + originalIntent = intent.action + intent.action = Intent.ACTION_PICK + } + } + } + + return super.extractIntentData(intent) + } + + override fun submitPickedItems(call: MethodCall, result: MethodChannel.Result) { + if (originalIntent != null) { + val pickedUris = call.argument>("uris") + if (!pickedUris.isNullOrEmpty()) { + val toUri = { uriString: String -> AppAdapterHandler.getShareableUri(this, uriString.toUri()) } + onNewIntent(Intent().apply { + action = originalIntent + data = toUri(pickedUris.first()) + }) + } else { + setResult(RESULT_CANCELED) + finish() + } + } else { + super.submitPickedItems(call, result) + } + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AccessibilityHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AccessibilityHandler.kt new file mode 100644 index 0000000..0e61c1f --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AccessibilityHandler.kt @@ -0,0 +1,107 @@ +package deckers.thibault.aves.channel.calls + +import android.content.Context +import android.content.ContextWrapper +import android.content.res.Configuration +import android.os.Build +import android.provider.Settings +import android.util.Log +import android.view.ViewConfiguration +import android.view.accessibility.AccessibilityManager +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import deckers.thibault.aves.utils.LogUtils +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler + +class AccessibilityHandler(private val contextWrapper: ContextWrapper) : MethodCallHandler { + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "areAnimationsRemoved" -> safe(call, result, ::areAnimationsRemoved) + "getLongPressTimeout" -> safe(call, result, ::getLongPressTimeout) + "hasRecommendedTimeouts" -> safe(call, result, ::hasRecommendedTimeouts) + "getRecommendedTimeoutMillis" -> safe(call, result, ::getRecommendedTimeoutMillis) + "shouldUseBoldFont" -> safe(call, result, ::shouldUseBoldFont) + else -> result.notImplemented() + } + } + + private fun areAnimationsRemoved(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + var removed = false + try { + removed = Settings.Global.getFloat(contextWrapper.contentResolver, Settings.Global.TRANSITION_ANIMATION_SCALE) == 0f + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get settings with error=${e.message}", null) + } + result.success(removed) + } + + private fun getLongPressTimeout(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + result.success(ViewConfiguration.getLongPressTimeout()) + } + + private fun hasRecommendedTimeouts(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + result.success(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) + } + + private fun getRecommendedTimeoutMillis(call: MethodCall, result: MethodChannel.Result) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + result.error("getRecommendedTimeoutMillis-sdk", "unsupported SDK version=${Build.VERSION.SDK_INT}", null) + return + } + + val originalTimeoutMillis = call.argument("originalTimeoutMillis") + val content = call.argument>("content") + if (originalTimeoutMillis == null || content == null) { + result.error("getRecommendedTimeoutMillis-args", "missing arguments", null) + return + } + + var uiContentFlags = 0 + content.forEach { + uiContentFlags = when (it) { + "controls" -> uiContentFlags or AccessibilityManager.FLAG_CONTENT_CONTROLS + "icons" -> uiContentFlags or AccessibilityManager.FLAG_CONTENT_ICONS + "text" -> uiContentFlags or AccessibilityManager.FLAG_CONTENT_TEXT + else -> { + result.error("getRecommendedTimeoutMillis-flag", "unsupported UI content flag=$it", null) + return + } + } + } + + val am = contextWrapper.getSystemService(Context.ACCESSIBILITY_SERVICE) as? AccessibilityManager + if (am == null) { + result.error("getRecommendedTimeoutMillis-service", "failed to get accessibility manager", null) + return + } + + val millis = am.getRecommendedTimeoutMillis(originalTimeoutMillis, uiContentFlags) + result.success(millis) + } + + // Flutter v3.4 already checks the system `Configuration.fontWeightAdjustment` to update `MediaQuery` + // but we need to also check the non-standard Samsung field `bf` representing the bold font toggle + private fun shouldUseBoldFont(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + var shouldBold = false + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + val config = contextWrapper.resources.configuration + val fontWeightAdjustment = config.fontWeightAdjustment + shouldBold = if (fontWeightAdjustment != Configuration.FONT_WEIGHT_ADJUSTMENT_UNDEFINED && fontWeightAdjustment != 0) { + fontWeightAdjustment >= BOLD_TEXT_WEIGHT_ADJUSTMENT + } else { + // fallback to Samsung non-standard field + Regex(" bf=([01]) ").find(config.toString())?.groups?.get(1)?.value == "1" + } + } + result.success(shouldBold) + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/accessibility" + + // match Flutter way: https://github.com/flutter/engine/blob/main/shell/platform/android/io/flutter/view/AccessibilityBridge.java#L125 + const val BOLD_TEXT_WEIGHT_ADJUSTMENT = 300 + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AnalysisHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AnalysisHandler.kt new file mode 100644 index 0000000..85b7250 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AnalysisHandler.kt @@ -0,0 +1,113 @@ +package deckers.thibault.aves.channel.calls + +import android.app.ActivityManager +import android.content.Context +import android.content.ContextWrapper +import androidx.core.content.edit +import androidx.lifecycle.LifecycleOwner +import androidx.work.ExistingWorkPolicy +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkInfo +import androidx.work.WorkManager +import androidx.work.workDataOf +import deckers.thibault.aves.AnalysisWorker +import deckers.thibault.aves.utils.FlutterUtils +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking + +class AnalysisHandler(private val activity: T, private val onAnalysisCompleted: () -> Unit) : MethodChannel.MethodCallHandler + where T : ContextWrapper, + T : LifecycleOwner { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "registerCallback" -> ioScope.launch { Coresult.safe(call, result, ::registerCallback) } + "startAnalysis" -> Coresult.safe(call, result, ::startAnalysis) + else -> result.notImplemented() + } + } + + private fun registerCallback(call: MethodCall, result: MethodChannel.Result) { + val callbackHandle = call.argument("callbackHandle")?.toLong() + if (callbackHandle == null) { + result.error("registerCallback-args", "missing arguments", null) + return + } + + val preferences = activity.getSharedPreferences(AnalysisWorker.SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE) + preferences.edit { + putLong(AnalysisWorker.PREF_CALLBACK_HANDLE_KEY, callbackHandle) + } + result.success(true) + } + + private fun startAnalysis(call: MethodCall, result: MethodChannel.Result) { + val force = call.argument("force") + if (force == null) { + result.error("startAnalysis-args", "missing arguments", null) + return + } + + val activityManager: ActivityManager = activity.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager + val runningAppProcesses = activityManager.runningAppProcesses + if (runningAppProcesses != null) { + val importance = runningAppProcesses[0].importance + if (importance < ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { + // the app is in the background + result.error("startAnalysis-background", "app is in the background (process importance=$importance)", null) + return + } + } + + // can be null or empty + val allEntryIds = call.argument>("entryIds") + + // work `Data` cannot occupy more than 10240 bytes when serialized + // so we save the possibly long list of entry IDs to shared preferences + val preferences = activity.getSharedPreferences(AnalysisWorker.SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE) + preferences.edit { + putStringSet(AnalysisWorker.PREF_ENTRY_IDS_KEY, allEntryIds?.map { it.toString() }?.toSet()) + } + + val workData = workDataOf( + AnalysisWorker.KEY_FORCE to force, + ) + + WorkManager.getInstance(activity).beginUniqueWork( + ANALYSIS_WORK_NAME, + ExistingWorkPolicy.KEEP, + OneTimeWorkRequestBuilder().apply { setInputData(workData) }.build(), + ).enqueue() + + attachToActivity() + result.success(null) + } + + private var attached = false + + fun attachToActivity() { + if (!attached) { + attached = true + WorkManager.getInstance(activity).getWorkInfosForUniqueWorkLiveData(ANALYSIS_WORK_NAME).observe(activity) { list -> + if (list.any { it.state == WorkInfo.State.SUCCEEDED }) { + runBlocking { + FlutterUtils.runOnUiThread { + onAnalysisCompleted() + } + } + } + } + } + } + + companion object { + const val CHANNEL = "deckers.thibault/aves/analysis" + private const val ANALYSIS_WORK_NAME = "analysis_work" + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt new file mode 100644 index 0000000..3725ab8 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt @@ -0,0 +1,506 @@ +package deckers.thibault.aves.channel.calls + +import android.content.ClipData +import android.content.ClipboardManager +import android.content.ContentResolver +import android.content.Context +import android.content.Intent +import android.content.pm.ApplicationInfo +import android.content.res.Configuration +import android.content.res.Resources +import android.graphics.BitmapFactory +import android.net.Uri +import android.os.Build +import android.os.Handler +import android.os.Looper +import android.os.TransactionTooLargeException +import android.util.Log +import androidx.core.content.FileProvider +import androidx.core.content.pm.ShortcutInfoCompat +import androidx.core.content.pm.ShortcutManagerCompat +import androidx.core.graphics.drawable.IconCompat +import androidx.core.graphics.scale +import androidx.core.net.toUri +import com.bumptech.glide.Glide +import com.bumptech.glide.load.DecodeFormat +import com.bumptech.glide.request.RequestOptions +import deckers.thibault.aves.MainActivity +import deckers.thibault.aves.MainActivity.Companion.COLLECTION_PAGE_ROUTE_NAME +import deckers.thibault.aves.MainActivity.Companion.ENTRY_VIEWER_PAGE_ROUTE_NAME +import deckers.thibault.aves.MainActivity.Companion.EXPLORER_PAGE_ROUTE_NAME +import deckers.thibault.aves.MainActivity.Companion.EXTRA_KEY_EXPLORER_PATH +import deckers.thibault.aves.MainActivity.Companion.EXTRA_KEY_FILTERS_ARRAY +import deckers.thibault.aves.MainActivity.Companion.EXTRA_KEY_FILTERS_STRING +import deckers.thibault.aves.MainActivity.Companion.EXTRA_KEY_PAGE +import deckers.thibault.aves.MainActivity.Companion.EXTRA_STRING_ARRAY_SEPARATOR +import deckers.thibault.aves.MainActivity.Companion.MAP_PAGE_ROUTE_NAME +import deckers.thibault.aves.R +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import deckers.thibault.aves.channel.calls.Coresult.Companion.safeSuspend +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.utils.BitmapUtils +import deckers.thibault.aves.utils.ContextUtils.devicePixelRatio +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.anyCauseIs +import deckers.thibault.aves.utils.getApplicationInfoCompat +import deckers.thibault.aves.utils.queryIntentActivitiesCompat +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.File +import java.util.Locale +import java.util.UUID +import kotlin.math.min +import kotlin.math.roundToInt + +class AppAdapterHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "getPackages" -> ioScope.launch { safe(call, result, ::getPackages) } + "getAppIcon" -> ioScope.launch { safeSuspend(call, result, ::getAppIcon) } + "copyToClipboard" -> ioScope.launch { safe(call, result, ::copyToClipboard) } + "open" -> safe(call, result, ::open) + "openMap" -> safe(call, result, ::openMap) + "setAs" -> safe(call, result, ::setAs) + "share" -> safe(call, result, ::share) + "pinShortcut" -> ioScope.launch { safe(call, result, ::pinShortcut) } + else -> result.notImplemented() + } + } + + private fun getPackages(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + val packages = HashMap() + + fun addPackageDetails(intent: Intent) { + // apps tend to use their name in English when creating directories + // so we get their names in English as well as the current locale + val englishConfig = Configuration().apply { + setLocale(Locale.ENGLISH) + } + + val pm = context.packageManager + for (resolveInfo in pm.queryIntentActivitiesCompat(intent, 0)) { + val appInfo = resolveInfo.activityInfo.applicationInfo + val packageName = appInfo.packageName + if (!packages.containsKey(packageName)) { + val currentLabel = pm.getApplicationLabel(appInfo).toString() + val englishLabel: String? = appInfo.labelRes.takeIf { it != 0 }?.let { labelRes -> + var englishLabel: String? = null + try { + val resources = pm.getResourcesForApplication(appInfo) + // `updateConfiguration` is deprecated but it seems to be the only way + // to query resources from another app with a specific locale. + // The following methods do not work: + // - `resources.getConfiguration().setLocale(...)` + // - getting a package manager from a custom context with `context.createConfigurationContext(config)` + @Suppress("deprecation") + resources.updateConfiguration(englishConfig, resources.displayMetrics) + englishLabel = resources.getString(labelRes) + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get app label in English for packageName=$packageName", e) + } + englishLabel + } + packages[packageName] = hashMapOf( + "packageName" to packageName, + "categoryLauncher" to intent.hasCategory(Intent.CATEGORY_LAUNCHER), + "isSystem" to (appInfo.flags and ApplicationInfo.FLAG_SYSTEM != 0), + "currentLabel" to currentLabel, + "englishLabel" to englishLabel, + ) + } + } + } + + // identify launcher category packages, which typically include user apps + // they should be fetched before the other packages, to be marked as launcher packages + try { + addPackageDetails(Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER)) + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to list launcher packages", e) + } + + try { + // complete with all the other packages + addPackageDetails(Intent(Intent.ACTION_MAIN)) + } catch (e: Exception) { + // `PackageManager.queryIntentActivities()` may kill the package manager if the response is too large + Log.w(LOG_TAG, "failed to list all packages", e) + + // fallback to the default category packages, which typically include system and OEM tools + try { + addPackageDetails(Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_DEFAULT)) + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to list default packages", e) + } + } + + result.success(ArrayList(packages.values)) + } + + private suspend fun getAppIcon(call: MethodCall, result: MethodChannel.Result) { + val packageName = call.argument("packageName") + val sizeDip = call.argument("sizeDip")?.toDouble() + if (packageName == null || sizeDip == null) { + result.error("getAppIcon-args", "missing arguments", null) + return + } + + // convert DIP to physical pixels here, instead of using `devicePixelRatio` in Flutter + val density = context.devicePixelRatio() + val size = (sizeDip * density).roundToInt() + var bytes: ByteArray? = null + try { + val iconResourceId = context.packageManager.getApplicationInfoCompat(packageName, 0).icon + if (iconResourceId != Resources.ID_NULL) { + val uri = Uri.Builder() + .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) + .authority(packageName) + .path(iconResourceId.toString()) + .build() + + val options = RequestOptions() + .format(DecodeFormat.PREFER_ARGB_8888) + .override(size, size) + val target = Glide.with(context) + .asBitmap() + .apply(options) + .load(uri) + .submit(size, size) + + try { + var bitmap = withContext(Dispatchers.IO) { target.get() } + if (bitmap.width > size && bitmap.height > size) { + // rescale when the resulting bitmap is larger than requested + val scalingFactor: Double = min(bitmap.width.toDouble() / size, bitmap.height.toDouble() / size) + val dstWidth = (bitmap.width / scalingFactor).roundToInt() + val dstHeight = (bitmap.height / scalingFactor).roundToInt() + Log.d( + LOG_TAG, "rescale app icon for packageName=$packageName" + + ", with bitmap byteCount=${bitmap.byteCount} size=${bitmap.width}x${bitmap.height}" + + ", to target=${size}x${size}" + ) + bitmap = bitmap.scale(dstWidth, dstHeight) + } + + // do not recycle bitmaps fetched from `ContentResolver` as their lifecycle is unknown + bytes = BitmapUtils.getBytes(bitmap, recycle = false, decoded = true, mimeType = null) + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to decode app icon for packageName=$packageName", e) + } + Glide.with(context).clear(target) + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get app info for packageName=$packageName", e) + return + } + if (bytes != null) { + result.success(bytes) + } else { + result.error("getAppIcon-null", "failed to get icon for packageName=$packageName", null) + } + } + + private fun copyToClipboard(call: MethodCall, result: MethodChannel.Result) { + val label = call.argument("label") + val text = call.argument("text") + val uri = call.argument("uri")?.toUri() + if (text == null && uri == null) { + result.error("copyToClipboard-args", "missing arguments", null) + return + } + + // on older devices, `ClipboardManager` initialization must happen on the main thread + // (e.g. Samsung S7 with Android 8.0 / API 26, but not on Tab A 10.1 with Android 8.1 / API 27) + Handler(Looper.getMainLooper()).post { + try { + val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager + if (clipboard != null) { + val clip: ClipData + if (uri != null) { + clip = ClipData.newUri(context.contentResolver, label, getShareableUri(context, uri)) + } else { + clip = ClipData.newPlainText(label, text) + } + clipboard.setPrimaryClip(clip) + result.success(true) + } else { + result.success(false) + } + } catch (e: Exception) { + result.error("copyToClipboard-exception", "failed to set clip", e.message) + } + } + } + + private fun open(call: MethodCall, result: MethodChannel.Result) { + val title = call.argument("title") + val uri = call.argument("uri")?.toUri() + val mimeType = call.argument("mimeType") + val forceChooser = call.argument("forceChooser") + if (uri == null || forceChooser == null) { + result.error("open-args", "missing arguments", null) + return + } + + val intent = Intent(Intent.ACTION_VIEW) + .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + .setDataAndType(getShareableUri(context, uri), mimeType) + val started = if (forceChooser) safeStartActivityChooser(title, intent) else safeStartActivity(intent) + + result.success(started) + } + + private fun openMap(call: MethodCall, result: MethodChannel.Result) { + val geoUri = call.argument("geoUri")?.toUri() + if (geoUri == null) { + result.error("openMap-args", "missing arguments", null) + return + } + + val intent = Intent(Intent.ACTION_VIEW, geoUri) + val started = safeStartActivity(intent) + + result.success(started) + } + + private fun setAs(call: MethodCall, result: MethodChannel.Result) { + val title = call.argument("title") + val uri = call.argument("uri")?.toUri() + val mimeType = call.argument("mimeType") + if (uri == null) { + result.error("setAs-args", "missing arguments", null) + return + } + + val intent = Intent(Intent.ACTION_ATTACH_DATA) + .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + .setDataAndType(getShareableUri(context, uri), mimeType) + val started = safeStartActivityChooser(title, intent) + + result.success(started) + } + + private fun share(call: MethodCall, result: MethodChannel.Result) { + val title = call.argument("title") + val urisByMimeType = call.argument>>("urisByMimeType") + if (urisByMimeType == null) { + result.error("share-args", "missing arguments", null) + return + } + + val uriList = ArrayList(urisByMimeType.values.flatten().mapNotNull { getShareableUri(context, it.toUri()) }) + val mimeTypes = urisByMimeType.keys.toTypedArray() + + // simplify share intent for a single item, as some apps can handle one item but not more + val intent = if (uriList.size == 1) { + val uri = uriList.first() + val mimeType = mimeTypes.first() + + Intent(Intent.ACTION_SEND) + .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + .setType(mimeType) + .putExtra(Intent.EXTRA_STREAM, uri) + } else { + var mimeType = "*/*" + if (mimeTypes.size == 1) { + // items have the same MIME type & subtype + mimeType = mimeTypes.first() + } else { + // items have different subtypes + val mimeTypeTypes = mimeTypes.map { it.split("/") }.distinct() + if (mimeTypeTypes.size == 1) { + // items have the same MIME type + mimeType = "${mimeTypeTypes.first()}/*" + } + } + + Intent(Intent.ACTION_SEND_MULTIPLE) + .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + .putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList) + .setType(mimeType) + } + try { + val started = safeStartActivityChooser(title, intent) + result.success(started) + } catch (e: Exception) { + if (e.anyCauseIs()) { + result.error("share-large", "transaction too large with ${uriList.size} URIs", e) + } else { + result.error("share-exception", "failed to share ${uriList.size} URIs", e) + } + } + } + + private fun safeStartActivity(intent: Intent): Boolean { + if (intent.resolveActivity(context.packageManager) == null) return false + try { + context.startActivity(intent) + return true + } catch (e: SecurityException) { + if (intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION != 0) { + // in some environments, providing the write flag yields a `SecurityException`: + // "UID XXXX does not have permission to content://XXXX" + // so we retry without it + Log.i(LOG_TAG, "retry intent=$intent without FLAG_GRANT_WRITE_URI_PERMISSION") + intent.flags = intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION.inv() + return safeStartActivity(intent) + } else { + Log.w(LOG_TAG, "failed to start activity for intent=$intent", e) + } + } + return false + } + + private fun safeStartActivityChooser(title: String?, intent: Intent): Boolean { + if (intent.resolveActivity(context.packageManager) == null) return false + try { + context.startActivity(Intent.createChooser(intent, title)) + return true + } catch (e: SecurityException) { + if (intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION != 0) { + // in some environments, providing the write flag yields a `SecurityException`: + // "UID XXXX does not have permission to content://XXXX" + // so we retry without it + Log.i(LOG_TAG, "retry intent=$intent without FLAG_GRANT_WRITE_URI_PERMISSION") + intent.flags = intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION.inv() + return safeStartActivityChooser(title, intent) + } else { + Log.w(LOG_TAG, "failed to start activity chooser for intent=$intent", e) + } + } + return false + } + + // shortcuts + + private fun pinShortcut(call: MethodCall, result: MethodChannel.Result) { + // common arguments + val label = call.argument("label") + val iconBytes = call.argument("iconBytes") + val route = call.argument("route") + // route dependent arguments + val filters = call.argument>("filters") + val explorerPath = call.argument("path") + val viewUri = call.argument("viewUri")?.toUri() + val geoUri = call.argument("geoUri")?.toUri() + + if (label == null || route == null) { + result.error("pin-args", "missing arguments", null) + return + } + + if (!ShortcutManagerCompat.isRequestPinShortcutSupported(context)) { + result.error("pin-unsupported", "failed because the launcher does not support pinning shortcuts", null) + return + } + + var icon: IconCompat? = null + if (iconBytes?.isNotEmpty() == true) { + var bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.size) + bitmap = BitmapUtils.centerSquareCrop(context, bitmap, 256) + if (bitmap != null) { + // adaptive, so the bitmap is used as background and covers the whole icon + icon = IconCompat.createWithAdaptiveBitmap(bitmap) + } + } + if (icon == null) { + // shortcut adaptive icons are placed in `mipmap`, not `drawable`, + // so that foreground is rendered at the intended scale + val supportAdaptiveIcon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O + + val resId = when (route) { + MAP_PAGE_ROUTE_NAME -> if (supportAdaptiveIcon) R.mipmap.ic_shortcut_map else R.drawable.ic_shortcut_map + else -> if (supportAdaptiveIcon) R.mipmap.ic_shortcut_collection else R.drawable.ic_shortcut_collection + } + icon = IconCompat.createWithResource(context, resId) + } + + val intent: Intent = when (route) { + COLLECTION_PAGE_ROUTE_NAME -> { + if (filters == null) { + result.error("pin-filters", "collection shortcut requires filters", null) + return + } + Intent(Intent.ACTION_MAIN, null, context, MainActivity::class.java) + .putExtra(EXTRA_KEY_PAGE, route) + .putExtra(EXTRA_KEY_FILTERS_ARRAY, filters.toTypedArray()) + // on API 25, `String[]` or `ArrayList` extras are null when using the shortcut + // so we use a joined `String` as fallback + .putExtra(EXTRA_KEY_FILTERS_STRING, filters.joinToString(EXTRA_STRING_ARRAY_SEPARATOR)) + } + + ENTRY_VIEWER_PAGE_ROUTE_NAME -> { + if (viewUri == null) { + result.error("pin-viewUri", "viewer shortcut requires URI", null) + return + } + Intent(Intent.ACTION_VIEW, viewUri, context, MainActivity::class.java) + } + + EXPLORER_PAGE_ROUTE_NAME -> { + Intent(Intent.ACTION_MAIN, null, context, MainActivity::class.java) + .putExtra(EXTRA_KEY_PAGE, route) + .putExtra(EXTRA_KEY_EXPLORER_PATH, explorerPath) + } + + MAP_PAGE_ROUTE_NAME -> { + if (geoUri == null) { + result.error("pin-geoUri", "map shortcut requires URI", null) + return + } + Intent(Intent.ACTION_VIEW, geoUri, context, MainActivity::class.java).apply { + putExtra(EXTRA_KEY_PAGE, route) + // filters are optional + filters?.let { + putExtra(EXTRA_KEY_FILTERS_ARRAY, it.toTypedArray()) + // on API 25, `String[]` or `ArrayList` extras are null when using the shortcut + // so we use a joined `String` as fallback + putExtra(EXTRA_KEY_FILTERS_STRING, it.joinToString(EXTRA_STRING_ARRAY_SEPARATOR)) + } + } + } + + else -> { + result.error("pin-route", "unsupported shortcut route=$route", null) + return + } + } + + // multiple shortcuts sharing the same ID cannot be created with different labels or icons + // so we provide a unique ID for each one, and let the user manage duplicates (i.e. same filter set), if any + val shortcut = ShortcutInfoCompat.Builder(context, UUID.randomUUID().toString()) + .setShortLabel(label) + .setIcon(icon) + .setIntent(intent) + .build() + ShortcutManagerCompat.requestPinShortcut(context, shortcut, null) + + result.success(true) + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/app" + + fun getShareableUri(context: Context, uri: Uri): Uri? { + return when (uri.scheme?.lowercase(Locale.ROOT)) { + ContentResolver.SCHEME_FILE -> { + uri.path?.let { path -> + val authority = "${context.applicationContext.packageName}.file_provider" + FileProvider.getUriForFile(context, authority, File(path)) + } + } + + else -> uri + } + } + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppProfileHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppProfileHandler.kt new file mode 100644 index 0000000..41682c0 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppProfileHandler.kt @@ -0,0 +1,97 @@ +package deckers.thibault.aves.channel.calls + +import android.app.Activity +import android.content.Context +import android.content.pm.CrossProfileApps +import android.os.Build +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler + +class AppProfileHandler(private val activity: Activity) : MethodCallHandler { + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "canInteractAcrossProfiles" -> safe(call, result, ::canInteractAcrossProfiles) + "canRequestInteractAcrossProfiles" -> safe(call, result, ::canRequestInteractAcrossProfiles) + "requestInteractAcrossProfiles" -> safe(call, result, ::requestInteractAcrossProfiles) + "switchProfile" -> safe(call, result, ::switchProfile) + "getProfileSwitchingLabel" -> safe(call, result, ::getProfileSwitchingLabel) + "getTargetUserProfiles" -> safe(call, result, ::getTargetUserProfiles) + else -> result.notImplemented() + } + } + + private fun canInteractAcrossProfiles(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + result.success(false) + return + } + + val crossProfileApps = activity.getSystemService(Context.CROSS_PROFILE_APPS_SERVICE) as CrossProfileApps + result.success(crossProfileApps.canInteractAcrossProfiles()) + } + + private fun canRequestInteractAcrossProfiles(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + result.success(false) + return + } + + val crossProfileApps = activity.getSystemService(Context.CROSS_PROFILE_APPS_SERVICE) as CrossProfileApps + result.success(crossProfileApps.canRequestInteractAcrossProfiles()) + } + + private fun requestInteractAcrossProfiles(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + result.success(false) + return + } + + val crossProfileApps = activity.getSystemService(Context.CROSS_PROFILE_APPS_SERVICE) as CrossProfileApps + val intent = crossProfileApps.createRequestInteractAcrossProfilesIntent() + val started = activity.startActivity(intent) + + result.success(started) + } + + private fun switchProfile(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { + result.success(false) + return + } + + val crossProfileApps = activity.getSystemService(Context.CROSS_PROFILE_APPS_SERVICE) as CrossProfileApps + val userHandles = crossProfileApps.targetUserProfiles + crossProfileApps.startMainActivity(activity.componentName, userHandles.first()) + result.success(null) + } + + private fun getProfileSwitchingLabel(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { + result.success(null) + return + } + + val crossProfileApps = activity.getSystemService(Context.CROSS_PROFILE_APPS_SERVICE) as CrossProfileApps + val userHandles = crossProfileApps.targetUserProfiles + val label = if (userHandles.isEmpty()) "" else crossProfileApps.getProfileSwitchingLabel(userHandles.first()) + + result.success(label) + } + + private fun getTargetUserProfiles(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { + result.success(false) + return + } + + val crossProfileApps = activity.getSystemService(Context.CROSS_PROFILE_APPS_SERVICE) as CrossProfileApps + val userProfiles = crossProfileApps.targetUserProfiles.map { it.toString() }.toList() + result.success(userProfiles) + } + + companion object { + const val CHANNEL = "deckers.thibault/aves/app_profile" + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/Coresult.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/Coresult.kt new file mode 100644 index 0000000..c447a76 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/Coresult.kt @@ -0,0 +1,71 @@ +package deckers.thibault.aves.channel.calls + +import deckers.thibault.aves.MainActivity +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +// ensure `result` methods are called on the main looper thread +class Coresult internal constructor(private val call: MethodCall, private val methodResult: MethodChannel.Result) : MethodChannel.Result { + private val mainScope = CoroutineScope(Dispatchers.Main) + + override fun success(result: Any?) { + mainScope.launch { + try { + methodResult.success(result) + } catch (e: Exception) { + MainActivity.notifyError("failed to reply success for method=${call.method}, result=$result, exception=\n${e.stackTraceToString()}") + } + } + } + + override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) { + mainScope.launch { + try { + methodResult.error(errorCode, errorMessage, errorDetails) + } catch (e: Exception) { + MainActivity.notifyError("failed to reply error for method=${call.method}, errorCode=$errorCode, errorMessage=$errorMessage, errorDetails=$errorDetails, exception=\n${e.stackTraceToString()}") + } + } + } + + override fun notImplemented() { + mainScope.launch { + try { + methodResult.notImplemented() + } catch (e: Exception) { + MainActivity.notifyError("failed to reply notImplemented for method=${call.method}, exception=\n${e.stackTraceToString()}") + } + } + } + + companion object { + fun safe( + call: MethodCall, + result: MethodChannel.Result, + function: (call: MethodCall, result: MethodChannel.Result) -> Unit + ) { + val res = Coresult(call, result) + try { + function(call, res) + } catch (e: Exception) { + res.error("safe-exception", e.message, e.stackTraceToString()) + } + } + + suspend fun safeSuspend( + call: MethodCall, + result: MethodChannel.Result, + function: suspend (call: MethodCall, result: MethodChannel.Result) -> Unit + ) { + val res = Coresult(call, result) + try { + function(call, res) + } catch (e: Exception) { + res.error("safeSuspend-exception", e.message, e.stackTraceToString()) + } + } + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt new file mode 100644 index 0000000..553cc42 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt @@ -0,0 +1,424 @@ +package deckers.thibault.aves.channel.calls + +import android.content.ContentUris +import android.content.Context +import android.database.Cursor +import android.graphics.BitmapFactory +import android.media.MediaCodecInfo +import android.media.MediaCodecList +import android.net.Uri +import android.os.Build +import android.os.Handler +import android.os.Looper +import android.provider.MediaStore +import android.util.Log +import androidx.core.net.toUri +import com.drew.metadata.file.FileTypeDirectory +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import deckers.thibault.aves.glide.TiffFetcher +import deckers.thibault.aves.metadata.ExifInterfaceHelper +import deckers.thibault.aves.metadata.MediaMetadataRetrieverHelper +import deckers.thibault.aves.metadata.Metadata +import deckers.thibault.aves.metadata.Mp4ParserHelper +import deckers.thibault.aves.metadata.Mp4ParserHelper.dumpBoxes +import deckers.thibault.aves.metadata.PixyMetaHelper +import deckers.thibault.aves.metadata.metadataextractor.Helper +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.MimeTypes.canReadWithExifInterface +import deckers.thibault.aves.utils.MimeTypes.canReadWithMetadataExtractor +import deckers.thibault.aves.utils.MimeTypes.canReadWithPixyMeta +import deckers.thibault.aves.utils.MimeTypes.isImage +import deckers.thibault.aves.utils.MimeTypes.isVideo +import deckers.thibault.aves.utils.StorageUtils +import deckers.thibault.aves.utils.UriUtils.tryParseId +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import io.flutter.util.PathUtils +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import org.beyka.tiffbitmapfactory.TiffBitmapFactory +import java.io.IOException +import androidx.exifinterface.media.ExifInterfaceFork as ExifInterface + +class DebugHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "crash" -> Handler(Looper.getMainLooper()).postDelayed({ throw TestException() }, 50) + "exception" -> throw TestException() + "safeException" -> safe(call, result) { _, _ -> throw TestException() } + "exceptionInCoroutine" -> ioScope.launch { throw TestException() } + "safeExceptionInCoroutine" -> ioScope.launch { safe(call, result) { _, _ -> throw TestException() } } + + "getContextDirs" -> ioScope.launch { safe(call, result, ::getContextDirs) } + "getCodecs" -> safe(call, result, ::getCodecs) + "getEnv" -> safe(call, result, ::getEnv) + + "getBitmapFactoryInfo" -> ioScope.launch { safe(call, result, ::getBitmapFactoryInfo) } + "getContentResolverMetadata" -> ioScope.launch { safe(call, result, ::getContentResolverMetadata) } + "getExifInterfaceMetadata" -> ioScope.launch { safe(call, result, ::getExifInterfaceMetadata) } + "getMediaMetadataRetrieverMetadata" -> ioScope.launch { safe(call, result, ::getMediaMetadataRetrieverMetadata) } + "getMetadataExtractorSummary" -> ioScope.launch { safe(call, result, ::getMetadataExtractorSummary) } + "getMp4ParserDump" -> ioScope.launch { safe(call, result, ::getMp4ParserDump) } + "getPixyMetadata" -> ioScope.launch { safe(call, result, ::getPixyMetadata) } + "getTiffStructure" -> ioScope.launch { safe(call, result, ::getTiffStructure) } + else -> result.notImplemented() + } + } + + private fun getContextDirs(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + val dirs = hashMapOf( + "cacheDir" to context.cacheDir, + "dataDir" to context.dataDir, + "filesDir" to context.filesDir, + "obbDir" to context.obbDir, + "externalCacheDir" to context.externalCacheDir, + "externalFilesDir" to context.getExternalFilesDir(null), + "codeCacheDir" to context.codeCacheDir, + "noBackupFilesDir" to context.noBackupFilesDir, + ).apply { + }.mapValues { it.value?.path }.toMutableMap() + dirs["externalCacheDirs"] = context.externalCacheDirs.joinToString { it.path } + dirs["externalFilesDirs"] = context.getExternalFilesDirs(null).joinToString { it?.path ?: "null" } + + // used by flutter plugin `path_provider` + dirs.putAll( + hashMapOf( + "flutter / cacheDir" to PathUtils.getCacheDirectory(context), + "flutter / dataDir" to PathUtils.getDataDirectory(context), + "flutter / filesDir" to PathUtils.getFilesDir(context), + ) + ) + + result.success(dirs) + } + + private fun getCodecs(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + fun getFields(info: MediaCodecInfo): FieldMap { + val fields: FieldMap = hashMapOf( + "name" to info.name, + "isEncoder" to info.isEncoder, + "supportedTypes" to info.supportedTypes.joinToString(", "), + ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + if (info.canonicalName != info.name) fields["canonicalName"] = info.canonicalName + if (info.isAlias) fields["isAlias"] to info.isAlias + if (info.isHardwareAccelerated) fields["isHardwareAccelerated"] to info.isHardwareAccelerated + if (info.isSoftwareOnly) fields["isSoftwareOnly"] to info.isSoftwareOnly + if (info.isVendor) fields["isVendor"] to info.isVendor + } + return fields + } + + val codecs = MediaCodecList(MediaCodecList.REGULAR_CODECS).codecInfos.map(::getFields).toList() + result.success(codecs) + } + + private fun getEnv(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + result.success(System.getenv()) + } + + private fun getBitmapFactoryInfo(call: MethodCall, result: MethodChannel.Result) { + val uri = call.argument("uri")?.toUri() + if (uri == null) { + result.error("getBitmapDecoderInfo-args", "missing arguments", null) + return + } + + val metadataMap = HashMap() + try { + StorageUtils.openInputStream(context, uri)?.use { input -> + val options = BitmapFactory.Options().apply { + inJustDecodeBounds = true + } + BitmapFactory.decodeStream(input, null, options) + options.outMimeType?.let { metadataMap["MimeType"] = it } + options.outWidth.takeIf { it >= 0 }?.let { metadataMap["Width"] = it.toString() } + options.outHeight.takeIf { it >= 0 }?.let { metadataMap["Height"] = it.toString() } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + options.outColorSpace?.let { metadataMap["ColorSpace"] = it.toString() } + options.outConfig?.let { metadataMap["Config"] = it.toString() } + } + } + } catch (_: IOException) { + // ignore + } + result.success(metadataMap) + } + + private fun getContentResolverMetadata(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + if (mimeType == null || uri == null) { + result.error("getContentResolverMetadata-args", "missing arguments", null) + return + } + + var contentUri: Uri = uri + if (StorageUtils.isMediaStoreContentUri(uri)) { + uri.tryParseId()?.let { id -> + contentUri = when { + isImage(mimeType) -> ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id) + isVideo(mimeType) -> ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id) + else -> uri + } + contentUri = StorageUtils.getOriginalUri(context, contentUri) + } + } + + // prefer image/video content URI, fallback to original URI (possibly a file content URI) + val metadataMap = getContentResolverMetadataForUri(contentUri) ?: getContentResolverMetadataForUri(uri) + if (metadataMap != null) { + result.success(metadataMap) + } else { + result.error("getContentResolverMetadata-null", "failed to get cursor for contentUri=$contentUri", null) + } + } + + private fun getContentResolverMetadataForUri(contentUri: Uri): FieldMap? { + val cursor = context.contentResolver.query(contentUri, null, null, null, null) + if (cursor != null && cursor.moveToFirst()) { + val metadataMap = HashMap() + val columnCount = cursor.columnCount + val columnNames = cursor.columnNames + for (i in 0.. null + Cursor.FIELD_TYPE_INTEGER -> cursor.getLong(i) + Cursor.FIELD_TYPE_FLOAT -> cursor.getFloat(i) + Cursor.FIELD_TYPE_STRING -> cursor.getString(i) + Cursor.FIELD_TYPE_BLOB -> cursor.getBlob(i) + else -> null + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get value for key=$key", e) + } + } + cursor.close() + return metadataMap + } + return null + } + + private fun getExifInterfaceMetadata(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + if (mimeType == null || uri == null) { + result.error("getExifInterfaceMetadata-args", "missing arguments", null) + return + } + + val metadataMap = HashMap() + if (canReadWithExifInterface(mimeType, strict = false)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val exif = ExifInterface(input) + for (tag in ExifInterfaceHelper.allTags.keys.filter { exif.hasAttribute(it) }) { + metadataMap[tag] = exif.getAttribute(tag) + } + } + } catch (e: Exception) { + // ExifInterface initialization can fail with a RuntimeException + // caused by an internal MediaMetadataRetriever failure + result.error("getExifInterfaceMetadata-failure", "failed to get exif for uri=$uri", e.message) + return + } + } + result.success(metadataMap) + } + + private fun getMediaMetadataRetrieverMetadata(call: MethodCall, result: MethodChannel.Result) { + val uri = call.argument("uri")?.toUri() + if (uri == null) { + result.error("getMediaMetadataRetrieverMetadata-args", "missing arguments", null) + return + } + + val metadataMap = HashMap() + val retriever = StorageUtils.openMetadataRetriever(context, uri) + if (retriever != null) { + try { + for ((code, name) in MediaMetadataRetrieverHelper.allKeys) { + retriever.extractMetadata(code)?.let { metadataMap[name] = it } + } + } catch (_: Exception) { + // ignore + } finally { + // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs + retriever.release() + } + } + result.success(metadataMap) + } + + private fun getMetadataExtractorSummary(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + if (mimeType == null || uri == null) { + result.error("getMetadataExtractorSummary-args", "missing arguments", null) + return + } + + val metadataMap = HashMap() + if (canReadWithMetadataExtractor(mimeType)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + metadataMap["mimeType"] = metadata.getDirectoriesOfType(FileTypeDirectory::class.java).joinToString { dir -> + if (dir.containsTag(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE)) { + dir.getString(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE) + } else "" + } + metadataMap["typeName"] = metadata.getDirectoriesOfType(FileTypeDirectory::class.java).joinToString { dir -> + if (dir.containsTag(FileTypeDirectory.TAG_DETECTED_FILE_TYPE_NAME)) { + dir.getString(FileTypeDirectory.TAG_DETECTED_FILE_TYPE_NAME) + } else "" + } + for (dir in metadata.directories) { + val dirName = dir.name ?: "" + var index = 0 + while (metadataMap.containsKey("$dirName ($index)")) index++ + var value = "${dir.tagCount} tags" + dir.parent?.let { value += ", parent: ${it.name}" } + metadataMap["$dirName ($index)"] = value + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get metadata by metadata-extractor for uri=$uri", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to get metadata by metadata-extractor for uri=$uri", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to get metadata by metadata-extractor for uri=$uri", e) + } + } + result.success(metadataMap) + } + + private fun getMp4ParserDump(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + if (mimeType == null || uri == null) { + result.error("getMp4ParserDump-args", "missing arguments", null) + return + } + + val sb = StringBuilder() + if (mimeType == MimeTypes.MP4 || MimeTypes.isIsoBMFFImage(mimeType)) { + try { + Mp4ParserHelper.consumeIso(context, uri, Mp4ParserHelper.metadataBoxParser()) { isoFile -> + isoFile.dumpBoxes(sb) + } + } catch (e: Exception) { + result.error("getMp4ParserDump-exception", e.message, e.stackTraceToString()) + return + } + } + result.success(sb.toString()) + } + + private fun getPixyMetadata(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + if (mimeType == null || uri == null) { + result.error("getPixyMetadata-args", "missing arguments", null) + return + } + + val metadataMap = HashMap() + if (canReadWithPixyMeta(mimeType)) { + try { + StorageUtils.openInputStream(context, uri)?.use { input -> + metadataMap.putAll(PixyMetaHelper.describe(input)) + } + } catch (e: Exception) { + result.error("getPixyMetadata-exception", e.message, e.stackTraceToString()) + return + } + } + result.success(metadataMap) + } + + private fun getTiffStructure(call: MethodCall, result: MethodChannel.Result) { + val uri = call.argument("uri")?.toUri() + if (uri == null) { + result.error("getTiffStructure-args", "missing arguments", null) + return + } + + try { + val metadataMap = HashMap() + var fd = context.contentResolver.openFileDescriptor(uri, "r")?.detachFd() + if (fd == null) { + result.error("getTiffStructure-fd", "failed to get file descriptor", null) + return + } + var options = TiffFetcher.buildOptions().apply { + inJustDecodeBounds = true + } + TiffBitmapFactory.decodeFileDescriptor(fd, options) + metadataMap["0"] = tiffOptionsToMap(options) + val dirCount = options.outDirectoryCount + for (page in 1..() + const val CHANNEL = "deckers.thibault/aves/debug" + } + + class TestException internal constructor() : RuntimeException("oops") +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt new file mode 100644 index 0000000..2d160aa --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt @@ -0,0 +1,167 @@ +package deckers.thibault.aves.channel.calls + +import android.annotation.SuppressLint +import android.app.LocaleConfig +import android.app.LocaleManager +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.content.res.Resources +import android.location.Geocoder +import android.os.Build +import android.os.LocaleList +import android.provider.MediaStore +import android.provider.Settings +import androidx.core.content.pm.ShortcutManagerCompat +import androidx.core.net.toUri +import androidx.core.text.util.LocalePreferences +import com.google.android.material.color.DynamicColors +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.utils.MemoryUtils +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import java.util.Locale + +class DeviceHandler(private val context: Context) : MethodCallHandler { + private val defaultScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "canManageMedia" -> safe(call, result, ::canManageMedia) + "getCapabilities" -> defaultScope.launch { safe(call, result, ::getCapabilities) } + "getLocales" -> safe(call, result, ::getLocales) + "setLocaleConfig" -> safe(call, result, ::setLocaleConfig) + "getFirstDayOfWeek" -> safe(call, result, ::getFirstDayOfWeek) + "getPerformanceClass" -> safe(call, result, ::getPerformanceClass) + "getWidgetCornerRadiusPx" -> safe(call, result, ::getWidgetCornerRadiusPx) + "isLocked" -> safe(call, result, ::isLocked) + "isSystemFilePickerEnabled" -> safe(call, result, ::isSystemFilePickerEnabled) + "requestMediaManagePermission" -> safe(call, result, ::requestMediaManagePermission) + "getAvailableHeapSize" -> safe(call, result, ::getAvailableHeapSize) + "requestGarbageCollection" -> safe(call, result, ::requestGarbageCollection) + else -> result.notImplemented() + } + } + + private fun canManageMedia(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + result.success(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) MediaStore.canManageMedia(context) else false) + } + + private fun getCapabilities(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + result.success( + hashMapOf( + "canPinShortcut" to ShortcutManagerCompat.isRequestPinShortcutSupported(context), + "canRenderSubdivisionFlagEmojis" to (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O), + "canRequestManageMedia" to (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S), + "hasGeocoder" to Geocoder.isPresent(), + "isDynamicColorAvailable" to DynamicColors.isDynamicColorAvailable(), + "showPinShortcutFeedback" to (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O), + "supportEdgeToEdgeUIMode" to (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q), + "supportPictureInPicture" to supportPictureInPicture(), + ) + ) + } + + private fun supportPictureInPicture(): Boolean { + // minimum version for `PictureInPictureParams.Builder#setAutoEnterEnabled` + val supportPipOnLeave = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S + return supportPipOnLeave && context.packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) + } + + private fun getLocales(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + fun toMap(locale: Locale): FieldMap = hashMapOf( + "language" to locale.language, + "country" to locale.country, + "script" to locale.script, + ) + + // when called from a window-less service, locales from `context.resources` + // do not reflect the current system settings, so we use `Resources.getSystem()` instead + val list = Resources.getSystem().configuration.locales + val locales = ArrayList() + for (i in 0..>("locales") + if (locales.isNullOrEmpty()) { + result.error("setLocaleConfig-args", "missing arguments", null) + return + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + @SuppressLint("WrongConstant") + val lm = context.getSystemService(Context.LOCALE_SERVICE) as? LocaleManager + lm?.overrideLocaleConfig = LocaleConfig(LocaleList.forLanguageTags(locales.joinToString(","))) + } + + result.success(true) + } + + private fun getFirstDayOfWeek(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + result.success(LocalePreferences.getFirstDayOfWeek()) + } + + private fun getPerformanceClass(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + val performanceClass = Build.VERSION.MEDIA_PERFORMANCE_CLASS + if (performanceClass > 0) { + result.success(performanceClass) + return + } + } + result.success(Build.VERSION.SDK_INT) + } + + private fun getWidgetCornerRadiusPx(@Suppress("unused_parameter") methodCall: MethodCall, result: MethodChannel.Result) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + result.success(context.resources.getDimension(android.R.dimen.system_app_widget_background_radius)) + } else { + result.success(null) + } + } + + private fun isLocked(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + val keyguardManager = context.getSystemService(Context.KEYGUARD_SERVICE) as android.app.KeyguardManager + val isLocked = keyguardManager.isKeyguardLocked + result.success(isLocked) + } + + private fun isSystemFilePickerEnabled(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + val enabled = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).resolveActivity(context.packageManager) != null + result.success(enabled) + } + + private fun requestMediaManagePermission(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { + result.error("requestMediaManagePermission-unsupported", "media management permission is not available before Android 12", null) + return + } + + val intent = Intent(Settings.ACTION_REQUEST_MANAGE_MEDIA, "package:${context.packageName}".toUri()) + context.startActivity(intent) + result.success(true) + } + + private fun getAvailableHeapSize(@Suppress("unused_parameter") methodCall: MethodCall, result: MethodChannel.Result) { + result.success(MemoryUtils.getAvailableHeapSize()) + } + + private fun requestGarbageCollection(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + Runtime.getRuntime().gc() + result.success(true) + } + + companion object { + const val CHANNEL = "deckers.thibault/aves/device" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/EmbeddedDataHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/EmbeddedDataHandler.kt new file mode 100644 index 0000000..30d4001 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/EmbeddedDataHandler.kt @@ -0,0 +1,361 @@ +package deckers.thibault.aves.channel.calls + +import android.content.Context +import android.util.Log +import androidx.core.content.FileProvider +import androidx.core.net.toUri +import androidx.exifinterface.media.ExifInterface +import com.adobe.internal.xmp.XMPException +import com.adobe.internal.xmp.XMPUtils +import com.bumptech.glide.load.resource.bitmap.TransformationUtils +import com.drew.metadata.xmp.XmpDirectory +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import deckers.thibault.aves.channel.calls.Coresult.Companion.safeSuspend +import deckers.thibault.aves.metadata.Metadata +import deckers.thibault.aves.metadata.MultiPage +import deckers.thibault.aves.metadata.metadataextractor.Helper +import deckers.thibault.aves.metadata.xmp.GoogleDeviceContainer +import deckers.thibault.aves.metadata.xmp.GoogleXMP +import deckers.thibault.aves.metadata.xmp.XMP.getSafeStructField +import deckers.thibault.aves.metadata.xmp.XMPPropName +import deckers.thibault.aves.model.EntryFields +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.model.provider.ImageProvider +import deckers.thibault.aves.model.provider.ImageProviderFactory.getProvider +import deckers.thibault.aves.utils.BitmapUtils +import deckers.thibault.aves.utils.FileUtils.transferFrom +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.MimeTypes.canReadWithExifInterface +import deckers.thibault.aves.utils.MimeTypes.canReadWithMetadataExtractor +import deckers.thibault.aves.utils.MimeTypes.extensionFor +import deckers.thibault.aves.utils.MimeTypes.isImage +import deckers.thibault.aves.utils.MimeTypes.isVideo +import deckers.thibault.aves.utils.StorageUtils +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import java.io.InputStream + +class EmbeddedDataHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "getExifThumbnails" -> ioScope.launch { safeSuspend(call, result, ::getExifThumbnails) } + "extractGoogleDeviceItem" -> ioScope.launch { safe(call, result, ::extractGoogleDeviceItem) } + "extractJpegMpfItem" -> ioScope.launch { safe(call, result, ::extractJpegMpfItem) } + "extractMotionPhotoImage" -> ioScope.launch { safe(call, result, ::extractMotionPhotoImage) } + "extractMotionPhotoVideo" -> ioScope.launch { safe(call, result, ::extractMotionPhotoVideo) } + "extractVideoEmbeddedPicture" -> ioScope.launch { safe(call, result, ::extractVideoEmbeddedPicture) } + "extractXmpDataProp" -> ioScope.launch { safe(call, result, ::extractXmpDataProp) } + else -> result.notImplemented() + } + } + + private suspend fun getExifThumbnails(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + if (mimeType == null || uri == null) { + result.error("getExifThumbnails-args", "missing arguments", null) + return + } + + val thumbnails = ArrayList() + if (canReadWithExifInterface(mimeType)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val exif = ExifInterface(input) + val orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL) + exif.thumbnailBitmap?.let { bitmap -> + TransformationUtils.rotateImageExif(BitmapUtils.getBitmapPool(context), bitmap, orientation)?.let { + // do not recycle bitmaps fetched from `ExifInterface` as their lifecycle is unknown + BitmapUtils.getBytes(it, recycle = false, decoded = true, mimeType = null)?.let { bytes -> thumbnails.add(bytes) } + } + } + } + } catch (_: Exception) { + // ExifInterface initialization can fail with a RuntimeException + // caused by an internal MediaMetadataRetriever failure + } + } + result.success(thumbnails) + } + + private fun extractGoogleDeviceItem(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + val displayName = call.argument("displayName") + val dataUri = call.argument("dataUri") + if (mimeType == null || uri == null || sizeBytes == null || dataUri == null) { + result.error("extractGoogleDeviceItem-args", "missing arguments", null) + return + } + + var container: GoogleDeviceContainer? = null + + if (canReadWithMetadataExtractor(mimeType)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + // data can be large and stored in "Extended XMP", + // which is returned as a second XMP directory + val xmpDirs = metadata.getDirectoriesOfType(XmpDirectory::class.java) + try { + container = xmpDirs.firstNotNullOfOrNull { GoogleXMP.getDeviceContainer(it.xmpMeta) } + } catch (e: XMPException) { + result.error("extractGoogleDeviceItem-xmp", "failed to read XMP directory for uri=$uri dataUri=$dataUri", e.message) + return + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to extract file from XMP", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to extract file from XMP", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to extract file from XMP", e) + } + } + + container?.let { + it.findOffsets(context, uri, mimeType, sizeBytes) + + val index = it.itemIndex(dataUri) + val itemStartOffset = it.itemStartOffset(index) + val itemLength = it.itemLength(index) + val itemMimeType = it.itemMimeType(index) + if (itemStartOffset != null && itemLength != null && itemMimeType != null) { + StorageUtils.openInputStream(context, uri)?.let { input -> + input.skip(itemStartOffset) + copyEmbeddedBytes(result, itemMimeType, displayName, input, itemLength) + return + } + } + } + + result.error("extractGoogleDeviceItem-empty", "failed to extract item from Google Device XMP at uri=$uri dataUri=$dataUri", null) + } + + private fun extractJpegMpfItem(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + val displayName = call.argument("displayName") + val id = call.argument("id") + if (mimeType == null || uri == null || sizeBytes == null || id == null) { + result.error("extractJpegMpfItem-args", "missing arguments", null) + return + } + + val pageIndex = id - 1 + val mpEntries = MultiPage.getJpegMpfEntries(context, uri, sizeBytes) + if (mpEntries != null && pageIndex < mpEntries.size) { + val mpEntry = mpEntries[pageIndex] + mpEntry.mimeType?.let { embedMimeType -> + var dataOffset = mpEntry.dataOffset + if (dataOffset > 0) { + val baseOffset = MultiPage.getJpegMpfBaseOffset(context, uri, sizeBytes) + if (baseOffset != null) { + dataOffset += baseOffset + } + } + StorageUtils.openInputStream(context, uri)?.let { input -> + input.skip(dataOffset) + copyEmbeddedBytes(result, embedMimeType, displayName, input, mpEntry.size) + } + return + } + } + + result.error("extractJpegMpfItem-empty", "failed to extract file index=$id from MPF at uri=$uri", null) + } + + private fun extractMotionPhotoImage(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + val displayName = call.argument("displayName") + if (mimeType == null || uri == null || sizeBytes == null) { + result.error("extractMotionPhotoImage-args", "missing arguments", null) + return + } + + MultiPage.getTrailerVideoSize(context, uri, mimeType, sizeBytes)?.let { videoSizeBytes -> + val imageSizeBytes = sizeBytes - videoSizeBytes + StorageUtils.openInputStream(context, uri)?.let { input -> + copyEmbeddedBytes(result, mimeType, displayName, input, imageSizeBytes) + } + return + } + + result.error("extractMotionPhotoImage-empty", "failed to extract image from motion photo at uri=$uri", null) + } + + private fun extractMotionPhotoVideo(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + val displayName = call.argument("displayName") + if (mimeType == null || uri == null || sizeBytes == null) { + result.error("extractMotionPhotoVideo-args", "missing arguments", null) + return + } + + MultiPage.getMotionPhotoVideoSizing(context, uri, mimeType, sizeBytes)?.let { (videoOffset, videoSize) -> + StorageUtils.openInputStream(context, uri)?.let { input -> + input.skip(videoOffset) + copyEmbeddedBytes(result, MimeTypes.MP4, displayName, input, videoSize) + } + return + } + + result.error("extractMotionPhotoVideo-empty", "failed to extract video from motion photo at uri=$uri", null) + } + + private fun extractVideoEmbeddedPicture(call: MethodCall, result: MethodChannel.Result) { + val uri = call.argument("uri")?.toUri() + val displayName = call.argument("displayName") + if (uri == null) { + result.error("extractVideoEmbeddedPicture-args", "missing arguments", null) + return + } + + val retriever = StorageUtils.openMetadataRetriever(context, uri) + if (retriever != null) { + try { + retriever.embeddedPicture?.let { bytes -> + var embedMimeType: String? = null + bytes.inputStream().use { input -> + Helper.readMimeType(input)?.let { embedMimeType = it } + } + embedMimeType?.let { mime -> + copyEmbeddedBytes(result, mime, displayName, bytes.inputStream(), bytes.size.toLong()) + return + } + } + } catch (e: Exception) { + result.error("extractVideoEmbeddedPicture-fetch", "failed to fetch picture for uri=$uri", e.message) + } finally { + // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs + retriever.release() + } + } + result.error("extractVideoEmbeddedPicture-empty", "failed to extract picture for uri=$uri", null) + } + + private fun extractXmpDataProp(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + val displayName = call.argument("displayName") + val dataProp = call.argument>("propPath") + val embedMimeType = call.argument("propMimeType") + if (mimeType == null || uri == null || dataProp == null || embedMimeType == null) { + result.error("extractXmpDataProp-args", "missing arguments", null) + return + } + + val props = dataProp.mapNotNull { + when (it) { + is List<*> -> XMPPropName(it.first() as String, it.last() as String) + is Int -> it + else -> null + } + } + + if (canReadWithMetadataExtractor(mimeType)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + // data can be large and stored in "Extended XMP", + // which is returned as a second XMP directory + val xmpDirs = metadata.getDirectoriesOfType(XmpDirectory::class.java) + try { + val embedBytes: ByteArray = if (props.size == 1) { + val prop = props.first() as XMPPropName + xmpDirs.firstNotNullOf { it.xmpMeta.getPropertyBase64(prop.nsUri, prop.toString()) } + } else { + xmpDirs.firstNotNullOf { it.xmpMeta.getSafeStructField(props) }.let { + XMPUtils.decodeBase64(it.value) + } + } + + copyEmbeddedBytes(result, embedMimeType, displayName, embedBytes.inputStream(), embedBytes.size.toLong()) + return + } catch (e: XMPException) { + result.error("extractXmpDataProp-xmp", "failed to read XMP directory for uri=$uri prop=$dataProp", e.message) + return + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to extract file from XMP", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to extract file from XMP", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to extract file from XMP", e) + } + } + result.error("extractXmpDataProp-empty", "failed to extract file from XMP uri=$uri prop=$dataProp", null) + } + + private fun copyEmbeddedBytes( + result: MethodChannel.Result, + mimeType: String, + displayName: String?, + embeddedByteStream: InputStream, + embeddedByteLength: Long, + ) { + val extension = extensionFor(mimeType, defaultExtension = null) + val targetFile = StorageUtils.createTempFile(context, extension).apply { + transferFrom(embeddedByteStream, embeddedByteLength) + } + + val authority = "${context.applicationContext.packageName}.file_provider" + val uri = if (displayName != null) { + // add extension to ease type identification when sharing this content + val displayNameWithExtension = if (displayName.endsWith(extension, ignoreCase = true)) { + displayName + } else { + "$displayName$extension" + } + FileProvider.getUriForFile(context, authority, targetFile, displayNameWithExtension) + } else { + FileProvider.getUriForFile(context, authority, targetFile) + } + val resultFields: FieldMap = hashMapOf( + EntryFields.URI to uri.toString(), + EntryFields.MIME_TYPE to mimeType, + ) + if (isImage(mimeType) || isVideo(mimeType)) { + val provider = getProvider(context, uri) + if (provider == null) { + result.error("copyEmbeddedBytes-provider", "failed to find provider for uri=$uri", null) + return + } + + ioScope.launch { + provider.fetchSingle(context, uri, mimeType, false, object : ImageProvider.ImageOpCallback { + override fun onSuccess(fields: FieldMap) { + resultFields.putAll(fields) + result.success(resultFields) + } + + override fun onFailure(throwable: Throwable) = result.error("copyEmbeddedBytes-failure", "failed to get entry for uri=$uri mime=$mimeType", throwable.message) + }) + } + } else { + result.success(resultFields) + } + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/embedded" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GeocodingHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GeocodingHandler.kt new file mode 100644 index 0000000..d8379b5 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GeocodingHandler.kt @@ -0,0 +1,83 @@ +package deckers.thibault.aves.channel.calls + +import android.content.Context +import android.location.Address +import android.location.Geocoder +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import deckers.thibault.aves.utils.getFromLocationCompat +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import java.util.Locale + +// as of 2021/03/10, geocoding packages exist but: +// - `geocoder` is unmaintained +// - `geocoding` method does not return `addressLine` (v2.0.0) +class GeocodingHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + private var geocoder: Geocoder? = null + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "getAddress" -> ioScope.launch { safe(call, result, ::getAddress) } + else -> result.notImplemented() + } + } + + private fun getAddress(call: MethodCall, result: MethodChannel.Result) { + val latitude = call.argument("latitude")?.toDouble() + val longitude = call.argument("longitude")?.toDouble() + val localeLanguageTag = call.argument("localeLanguageTag") + val maxResults = call.argument("maxResults") ?: 1 + if (latitude == null || longitude == null) { + result.error("getAddress-args", "missing arguments", null) + return + } + + if (!Geocoder.isPresent()) { + result.error("getAddress-unavailable", "Geocoder is unavailable", null) + return + } + + geocoder = geocoder ?: if (localeLanguageTag != null) { + Geocoder(context, Locale.forLanguageTag(localeLanguageTag)) + } else { + Geocoder(context) + } + + fun processAddresses(addresses: List
) { + if (addresses.isEmpty()) { + result.error("getAddress-empty", "failed to find any address for latitude=$latitude, longitude=$longitude", null) + } else { + val addressMapList: ArrayList> = ArrayList(addresses.map { address -> + hashMapOf( + "addressLine" to (0..address.maxAddressLineIndex).joinToString(", ") { i -> address.getAddressLine(i) }, + "adminArea" to address.adminArea, + "countryCode" to address.countryCode, + "countryName" to address.countryName, + "featureName" to address.featureName, + "locality" to address.locality, + "postalCode" to address.postalCode, + "subAdminArea" to address.subAdminArea, + "subLocality" to address.subLocality, + "subThoroughfare" to address.subThoroughfare, + "thoroughfare" to address.thoroughfare, + ) + }) + result.success(addressMapList) + } + } + + geocoder!!.getFromLocationCompat( + latitude, longitude, maxResults, ::processAddresses, + ) { code, message, details -> result.error(code, message, details) } + } + + companion object { + const val CHANNEL = "deckers.thibault/aves/geocoding" + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GlobalSearchHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GlobalSearchHandler.kt new file mode 100644 index 0000000..b3704db --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GlobalSearchHandler.kt @@ -0,0 +1,42 @@ +package deckers.thibault.aves.channel.calls + +import android.content.Context +import androidx.core.content.edit +import deckers.thibault.aves.SearchSuggestionsProvider +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch + +class GlobalSearchHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "registerCallback" -> ioScope.launch { safe(call, result, ::registerCallback) } + else -> result.notImplemented() + } + } + + private fun registerCallback(call: MethodCall, result: MethodChannel.Result) { + val callbackHandle = call.argument("callbackHandle")?.toLong() + if (callbackHandle == null) { + result.error("registerCallback-args", "missing arguments", null) + return + } + + val preferences = context.getSharedPreferences(SearchSuggestionsProvider.SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE) + preferences.edit { + putLong(SearchSuggestionsProvider.CALLBACK_HANDLE_KEY, callbackHandle) + } + result.success(true) + } + + companion object { + const val CHANNEL = "deckers.thibault/aves/global_search" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/HomeWidgetHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/HomeWidgetHandler.kt new file mode 100644 index 0000000..eb6e8e8 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/HomeWidgetHandler.kt @@ -0,0 +1,32 @@ +package deckers.thibault.aves.channel.calls + +import android.appwidget.AppWidgetManager +import android.content.Context +import deckers.thibault.aves.HomeWidgetProvider +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +class HomeWidgetHandler(private val context: Context) : MethodChannel.MethodCallHandler { + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "update" -> Coresult.safe(call, result, ::update) + else -> result.notImplemented() + } + } + + private fun update(call: MethodCall, result: MethodChannel.Result) { + val widgetId = call.argument("widgetId") + if (widgetId == null) { + result.error("update-args", "missing arguments", null) + return + } + + val appWidgetManager = AppWidgetManager.getInstance(context) + HomeWidgetProvider().onUpdate(context, appWidgetManager, intArrayOf(widgetId)) + result.success(null) + } + + companion object { + const val CHANNEL = "deckers.thibault/aves/widget_update" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaEditHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaEditHandler.kt new file mode 100644 index 0000000..4f48d73 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaEditHandler.kt @@ -0,0 +1,77 @@ +package deckers.thibault.aves.channel.calls + +import android.content.ContextWrapper +import android.util.Log +import androidx.core.net.toUri +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import deckers.thibault.aves.channel.calls.Coresult.Companion.safeSuspend +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.model.NameConflictStrategy +import deckers.thibault.aves.model.provider.ImageProvider.ImageOpCallback +import deckers.thibault.aves.model.provider.ImageProviderFactory.getProvider +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.StorageUtils.ensureTrailingSeparator +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch + +class MediaEditHandler(private val contextWrapper: ContextWrapper) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "cancelFileOp" -> safe(call, result, ::cancelFileOp) + "captureFrame" -> ioScope.launch { safeSuspend(call, result, ::captureFrame) } + else -> result.notImplemented() + } + } + + private fun cancelFileOp(call: MethodCall, result: MethodChannel.Result) { + val opId = call.argument("opId") + if (opId == null) { + result.error("cancelFileOp-args", "missing arguments", null) + return + } + + Log.i(LOG_TAG, "cancelling file op $opId") + cancelledOps.add(opId) + + result.success(null) + } + + private suspend fun captureFrame(call: MethodCall, result: MethodChannel.Result) { + val uri = call.argument("uri")?.toUri() + val desiredName = call.argument("desiredName") + val exifFields = call.argument("exif") ?: HashMap() + val bytes = call.argument("bytes") + var destinationDir = call.argument("destinationPath") + val nameConflictStrategy = NameConflictStrategy.get(call.argument("nameConflictStrategy")) + if (uri == null || desiredName == null || bytes == null || destinationDir == null || nameConflictStrategy == null) { + result.error("captureFrame-args", "missing arguments", null) + return + } + + val provider = getProvider(contextWrapper, uri) + if (provider == null) { + result.error("captureFrame-provider", "failed to find provider for uri=$uri", null) + return + } + + destinationDir = ensureTrailingSeparator(destinationDir) + provider.captureFrame(contextWrapper, desiredName, exifFields, bytes, destinationDir, nameConflictStrategy, object : ImageOpCallback { + override fun onSuccess(fields: FieldMap) = result.success(fields) + override fun onFailure(throwable: Throwable) = result.error("captureFrame-failure", "failed to capture frame for uri=$uri", throwable.message) + }) + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/media_edit" + + val cancelledOps = HashSet() + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchObjectHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchObjectHandler.kt new file mode 100644 index 0000000..ead151e --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchObjectHandler.kt @@ -0,0 +1,68 @@ +package deckers.thibault.aves.channel.calls + +import android.content.Context +import android.os.Handler +import android.os.Looper +import androidx.core.net.toUri +import com.bumptech.glide.Glide +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.model.provider.ImageProvider.ImageOpCallback +import deckers.thibault.aves.model.provider.ImageProviderFactory.getProvider +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch + +class MediaFetchObjectHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "getEntry" -> ioScope.launch { safe(call, result, ::getEntry) } + "clearImageDiskCache" -> ioScope.launch { safe(call, result, ::clearImageDiskCache) } + "clearImageMemoryCache" -> ioScope.launch { safe(call, result, ::clearImageMemoryCache) } + else -> result.notImplemented() + } + } + + private fun getEntry(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") // MIME type is optional + val uri = call.argument("uri")?.toUri() + val allowUnsized = call.argument("allowUnsized") ?: false + if (uri == null) { + result.error("getEntry-args", "missing arguments", null) + return + } + + val provider = getProvider(context, uri) + if (provider == null) { + result.error("getEntry-provider", "failed to find provider for uri=$uri mimeType=$mimeType", null) + return + } + + provider.fetchSingle(context, uri, mimeType, allowUnsized, object : ImageOpCallback { + override fun onSuccess(fields: FieldMap) = result.success(fields) + override fun onFailure(throwable: Throwable) = result.error("getEntry-failure", "failed to get entry for uri=$uri mimeType=$mimeType", throwable.message) + }) + } + + private fun clearImageDiskCache(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + Glide.get(context).clearDiskCache() + result.success(null) + } + + private fun clearImageMemoryCache(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + Handler(Looper.getMainLooper()).post { + Glide.get(context).clearMemory() + } + result.success(null) + } + + companion object { + const val CHANNEL = "deckers.thibault/aves/media_fetch_object" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaSessionHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaSessionHandler.kt new file mode 100644 index 0000000..6a4023e --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaSessionHandler.kt @@ -0,0 +1,169 @@ +package deckers.thibault.aves.channel.calls + +import android.content.BroadcastReceiver +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.media.AudioManager +import android.media.session.PlaybackState +import android.support.v4.media.MediaMetadataCompat +import android.support.v4.media.session.MediaSessionCompat +import android.support.v4.media.session.PlaybackStateCompat +import androidx.core.net.toUri +import androidx.media.session.MediaButtonReceiver +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import deckers.thibault.aves.channel.calls.Coresult.Companion.safeSuspend +import deckers.thibault.aves.channel.streams.platformtodart.MediaCommandStreamHandler +import deckers.thibault.aves.utils.FlutterUtils +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch + +class MediaSessionHandler(private val context: Context, private val mediaCommandHandler: MediaCommandStreamHandler) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + private var session: MediaSessionCompat? = null + private var wasPlaying = false + private var isNoisyAudioReceiverRegistered = false + private val noisyAudioReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.action == AudioManager.ACTION_AUDIO_BECOMING_NOISY) { + mediaCommandHandler.callback.onStop() + } + } + } + + fun dispose() { + unregisterNoisyAudioReceiver() + } + + private fun registerNoisyAudioReceiver() { + context.registerReceiver(noisyAudioReceiver, IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)) + isNoisyAudioReceiverRegistered = true + } + + private fun unregisterNoisyAudioReceiver() { + if (isNoisyAudioReceiverRegistered) { + context.unregisterReceiver(noisyAudioReceiver) + isNoisyAudioReceiverRegistered = false + } + } + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "update" -> ioScope.launch { safeSuspend(call, result, ::updateSession) } + "release" -> ioScope.launch { safe(call, result, ::releaseSession) } + else -> result.notImplemented() + } + } + + private suspend fun updateSession(call: MethodCall, result: MethodChannel.Result) { + val uri = call.argument("uri")?.toUri() + val title = call.argument("title") ?: uri?.toString() + val durationMillis = call.argument("durationMillis")?.toLong() + val stateString = call.argument("state") + val positionMillis = call.argument("positionMillis")?.toLong() + val playbackSpeed = call.argument("playbackSpeed")?.toFloat() + val canSkipToNext = call.argument("canSkipToNext") + val canSkipToPrevious = call.argument("canSkipToPrevious") + + if (uri == null || title == null || durationMillis == null || stateString == null || positionMillis == null || playbackSpeed == null || canSkipToNext == null || canSkipToPrevious == null) { + result.error( + "updateSession-args", "missing arguments: uri=$uri, title=$title, durationMillis=$durationMillis" + + ", stateString=$stateString, positionMillis=$positionMillis, playbackSpeed=$playbackSpeed, canSkipToNext=$canSkipToNext, canSkipToPrevious=$canSkipToPrevious", null + ) + return + } + + val state = when (stateString) { + STATE_STOPPED -> PlaybackStateCompat.STATE_STOPPED + STATE_PAUSED -> PlaybackStateCompat.STATE_PAUSED + STATE_PLAYING -> PlaybackStateCompat.STATE_PLAYING + else -> { + result.error("updateSession-state", "unknown state=$stateString", null) + return + } + } + + var actions = PlaybackStateCompat.ACTION_PLAY_PAUSE or PlaybackStateCompat.ACTION_SEEK_TO + actions = if (state == PlaybackState.STATE_PLAYING) { + actions or PlaybackStateCompat.ACTION_PAUSE or PlaybackStateCompat.ACTION_STOP + } else { + actions or PlaybackStateCompat.ACTION_PLAY + } + if (canSkipToNext) { + actions = actions or PlaybackStateCompat.ACTION_SKIP_TO_NEXT + } + if (canSkipToPrevious) { + actions = actions or PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS + } + + val playbackState = PlaybackStateCompat.Builder() + .setState( + state, + positionMillis, + playbackSpeed, + System.currentTimeMillis() + ) + .setActions(actions) + .build() + + FlutterUtils.runOnUiThread { + try { + if (session == null) { + val mbrIntent = MediaButtonReceiver.buildMediaButtonPendingIntent(context, PlaybackStateCompat.ACTION_PLAY_PAUSE) + val mbrName = ComponentName(context, MediaButtonReceiver::class.java) + session = MediaSessionCompat(context, "aves", mbrName, mbrIntent).apply { + setCallback(mediaCommandHandler.callback) + } + } + session!!.apply { + val metadata = MediaMetadataCompat.Builder() + .putString(MediaMetadataCompat.METADATA_KEY_TITLE, title) + .putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, title) + .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, durationMillis) + .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_URI, uri.toString()) + .build() + setMetadata(metadata) + setPlaybackState(playbackState) + if (!isActive) { + isActive = true + } + } + + val isPlaying = state == PlaybackStateCompat.STATE_PLAYING + if (!wasPlaying && isPlaying) { + registerNoisyAudioReceiver() + } else if (wasPlaying && !isPlaying) { + unregisterNoisyAudioReceiver() + } + wasPlaying = isPlaying + + result.success(null) + } catch (e: Exception) { + result.error("updateSession-exception", e.message, e.stackTraceToString()) + } + } + } + + private fun releaseSession(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + session?.let { + it.release() + session = null + } + result.success(null) + } + + companion object { + const val CHANNEL = "deckers.thibault/aves/media_session" + + const val STATE_STOPPED = "stopped" + const val STATE_PAUSED = "paused" + const val STATE_PLAYING = "playing" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaStoreHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaStoreHandler.kt new file mode 100644 index 0000000..64b440b --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaStoreHandler.kt @@ -0,0 +1,85 @@ +package deckers.thibault.aves.channel.calls + +import android.content.Context +import android.media.MediaScannerConnection +import android.net.Uri +import android.os.Build +import android.provider.MediaStore +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import deckers.thibault.aves.model.provider.MediaStoreImageProvider +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch + +class MediaStoreHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "checkObsoleteContentIds" -> ioScope.launch { safe(call, result, ::checkObsoleteContentIds) } + "checkObsoletePaths" -> ioScope.launch { safe(call, result, ::checkObsoletePaths) } + "getChangedUris" -> ioScope.launch { safe(call, result, ::getChangedUris) } + "getGeneration" -> ioScope.launch { safe(call, result, ::getGeneration) } + "scanFile" -> ioScope.launch { safe(call, result, ::scanFile) } + else -> result.notImplemented() + } + } + + private fun checkObsoleteContentIds(call: MethodCall, result: MethodChannel.Result) { + val knownContentIds = call.argument>("knownContentIds")?.map { it?.toLong() } + if (knownContentIds == null) { + result.error("checkObsoleteContentIds-args", "missing arguments", null) + return + } + result.success(MediaStoreImageProvider().checkObsoleteContentIds(context, knownContentIds)) + } + + private fun checkObsoletePaths(call: MethodCall, result: MethodChannel.Result) { + val knownPathById = call.argument>("knownPathById")?.mapKeys { it.key?.toLong() } + if (knownPathById == null) { + result.error("checkObsoletePaths-args", "missing arguments", null) + return + } + result.success(MediaStoreImageProvider().checkObsoletePaths(context, knownPathById)) + } + + private fun getChangedUris(call: MethodCall, result: MethodChannel.Result) { + val sinceGeneration = call.argument("sinceGeneration") + if (sinceGeneration == null) { + result.error("getChangedUris-args", "missing arguments", null) + return + } + val uris = MediaStoreImageProvider().getChangedUris(context, sinceGeneration) + result.success(uris) + } + + private fun getGeneration(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + val generation = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + try { + MediaStore.getGeneration(context, MediaStore.VOLUME_EXTERNAL_PRIMARY) + } catch (e: Exception) { + // may yield `IllegalArgumentException: Volume external_primary not found` + val volumes = MediaStore.getExternalVolumeNames(context).joinToString(", ") + result.error("getGeneration-primary", e.message + " (available volumes are [$volumes])", e) + return + } + } else { + null + } + result.success(generation) + } + + private fun scanFile(call: MethodCall, result: MethodChannel.Result) { + val path = call.argument("path") + val mimeType = call.argument("mimeType") + MediaScannerConnection.scanFile(context, arrayOf(path), arrayOf(mimeType)) { _, uri: Uri? -> result.success(uri?.toString()) } + } + + companion object { + const val CHANNEL = "deckers.thibault/aves/media_store" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataEditHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataEditHandler.kt new file mode 100644 index 0000000..081d2a5 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataEditHandler.kt @@ -0,0 +1,213 @@ +package deckers.thibault.aves.channel.calls + +import android.content.ContextWrapper +import androidx.core.net.toUri +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import deckers.thibault.aves.metadata.Mp4FragmentedException +import deckers.thibault.aves.metadata.Mp4TooLargeException +import deckers.thibault.aves.metadata.Mp4ZeroSizeBoxException +import deckers.thibault.aves.model.ExifOrientationOp +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.model.provider.ImageProvider.ImageOpCallback +import deckers.thibault.aves.model.provider.ImageProviderFactory.getProvider +import deckers.thibault.aves.utils.FileDescriptorException +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import java.io.FileNotFoundException + +class MetadataEditHandler(private val contextWrapper: ContextWrapper) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "rotate" -> ioScope.launch { safe(call, result, ::rotate) } + "flip" -> ioScope.launch { safe(call, result, ::flip) } + "editDate" -> ioScope.launch { safe(call, result, ::editDate) } + "editMetadata" -> ioScope.launch { safe(call, result, ::editMetadata) } + "removeTrailerVideo" -> ioScope.launch { safe(call, result, ::removeTrailerVideo) } + "removeTypes" -> ioScope.launch { safe(call, result, ::removeTypes) } + else -> result.notImplemented() + } + } + + private fun rotate(call: MethodCall, result: MethodChannel.Result) { + val clockwise = call.argument("clockwise") + if (clockwise == null) { + result.error("rotate-args", "missing arguments", null) + return + } + + val op = if (clockwise) ExifOrientationOp.ROTATE_CW else ExifOrientationOp.ROTATE_CCW + editOrientation(call, result, op) + } + + private fun flip(call: MethodCall, result: MethodChannel.Result) { + editOrientation(call, result, ExifOrientationOp.FLIP) + } + + private fun editOrientation(call: MethodCall, result: MethodChannel.Result, op: ExifOrientationOp) { + val entryMap = call.argument("entry") + if (entryMap == null) { + result.error("editOrientation-args", "missing arguments", null) + return + } + + val uri = (entryMap["uri"] as String?)?.toUri() + val path = entryMap["path"] as String? + val mimeType = entryMap["mimeType"] as String? + if (uri == null || path == null || mimeType == null) { + result.error("editOrientation-args", "failed because entry fields are missing", null) + return + } + + val provider = getProvider(contextWrapper, uri) + if (provider == null) { + result.error("editOrientation-provider", "failed to find provider for uri=$uri", null) + return + } + + val callback = MetadataOpCallback("editOrientation", entryMap, result) + provider.editOrientation(contextWrapper, path, uri, mimeType, op, callback) + } + + private fun editDate(call: MethodCall, result: MethodChannel.Result) { + val dateMillis = call.argument("dateMillis")?.toLong() + val shiftSeconds = call.argument("shiftSeconds")?.toLong() + val fields = call.argument>("fields") + val entryMap = call.argument("entry") + if (entryMap == null || fields == null) { + result.error("editDate-args", "missing arguments", null) + return + } + + val uri = (entryMap["uri"] as String?)?.toUri() + val path = entryMap["path"] as String? + val mimeType = entryMap["mimeType"] as String? + if (uri == null || path == null || mimeType == null) { + result.error("editDate-args", "failed because entry fields are missing", null) + return + } + + val provider = getProvider(contextWrapper, uri) + if (provider == null) { + result.error("editDate-provider", "failed to find provider for uri=$uri", null) + return + } + + val callback = MetadataOpCallback("editDate", entryMap, result) + provider.editDate(contextWrapper, path, uri, mimeType, dateMillis, shiftSeconds, fields, callback) + } + + private fun editMetadata(call: MethodCall, result: MethodChannel.Result) { + val metadata = call.argument("metadata") + val entryMap = call.argument("entry") + val autoCorrectTrailerOffset = call.argument("autoCorrectTrailerOffset") + if (entryMap == null || metadata == null || autoCorrectTrailerOffset == null) { + result.error("editMetadata-args", "missing arguments", null) + return + } + + val uri = (entryMap["uri"] as String?)?.toUri() + val path = entryMap["path"] as String? + val mimeType = entryMap["mimeType"] as String? + if (uri == null || path == null || mimeType == null) { + result.error("editMetadata-args", "failed because entry fields are missing", null) + return + } + + val provider = getProvider(contextWrapper, uri) + if (provider == null) { + result.error("editMetadata-provider", "failed to find provider for uri=$uri", null) + return + } + + val callback = MetadataOpCallback("editMetadata", entryMap, result) + provider.editMetadata(contextWrapper, path, uri, mimeType, metadata, autoCorrectTrailerOffset, callback) + } + + private fun removeTrailerVideo(call: MethodCall, result: MethodChannel.Result) { + val entryMap = call.argument("entry") + if (entryMap == null) { + result.error("removeTrailerVideo-args", "missing arguments", null) + return + } + + val uri = (entryMap["uri"] as String?)?.toUri() + val path = entryMap["path"] as String? + val mimeType = entryMap["mimeType"] as String? + if (uri == null || path == null || mimeType == null) { + result.error("removeTrailerVideo-args", "failed because entry fields are missing", null) + return + } + + val provider = getProvider(contextWrapper, uri) + if (provider == null) { + result.error("removeTrailerVideo-provider", "failed to find provider for uri=$uri", null) + return + } + + val callback = MetadataOpCallback("removeTrailerVideo", entryMap, result) + provider.removeTrailerVideo(contextWrapper, path, uri, mimeType, callback) + } + + private fun removeTypes(call: MethodCall, result: MethodChannel.Result) { + val types = call.argument>("types") + val entryMap = call.argument("entry") + if (entryMap == null || types == null) { + result.error("removeTypes-args", "missing arguments", null) + return + } + + val uri = (entryMap["uri"] as String?)?.toUri() + val path = entryMap["path"] as String? + val mimeType = entryMap["mimeType"] as String? + if (uri == null || path == null || mimeType == null) { + result.error("removeTypes-args", "failed because entry fields are missing", null) + return + } + + val provider = getProvider(contextWrapper, uri) + if (provider == null) { + result.error("removeTypes-provider", "failed to find provider for uri=$uri", null) + return + } + + val callback = MetadataOpCallback("removeTypes", entryMap, result) + provider.removeMetadataTypes(contextWrapper, path, uri, mimeType, types.toSet(), callback) + } + + companion object { + const val CHANNEL = "deckers.thibault/aves/metadata_edit" + } +} + +private class MetadataOpCallback( + private val errorCodeBase: String, + private val entryMap: FieldMap, + private val result: MethodChannel.Result, +) : ImageOpCallback { + override fun onSuccess(fields: FieldMap) = result.success(fields) + override fun onFailure(throwable: Throwable) { + val errorCode = if (throwable is Mp4TooLargeException) { + if (throwable.type == "moov") { + "$errorCodeBase-mp4largemoov" + } else { + "$errorCodeBase-mp4largeother" + } + } else if (throwable is Mp4FragmentedException) { + "$errorCodeBase-mp4fragmented" + } else if (throwable is Mp4ZeroSizeBoxException) { + "$errorCodeBase-mp4zerosizebox" + } else if (throwable is FileNotFoundException || throwable is FileDescriptorException) { + "$errorCodeBase-filenotfound" + } else { + "$errorCodeBase-failure" + } + result.error(errorCode, "failed for entry=$entryMap", throwable) + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt new file mode 100644 index 0000000..8036212 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt @@ -0,0 +1,1520 @@ +package deckers.thibault.aves.channel.calls + +import android.content.Context +import android.media.MediaFormat +import android.media.MediaMetadataRetriever +import android.net.Uri +import android.os.Build +import android.util.Log +import androidx.core.net.toUri +import com.adobe.internal.xmp.XMPException +import com.adobe.internal.xmp.XMPMeta +import com.adobe.internal.xmp.XMPMetaFactory +import com.adobe.internal.xmp.options.SerializeOptions +import com.adobe.internal.xmp.properties.XMPPropertyInfo +import com.drew.lang.KeyValuePair +import com.drew.lang.Rational +import com.drew.metadata.Tag +import com.drew.metadata.avi.AviDirectory +import com.drew.metadata.exif.ExifDirectoryBase +import com.drew.metadata.exif.ExifIFD0Directory +import com.drew.metadata.exif.ExifSubIFDDirectory +import com.drew.metadata.exif.GpsDirectory +import com.drew.metadata.file.FileTypeDirectory +import com.drew.metadata.gif.GifAnimationDirectory +import com.drew.metadata.iptc.IptcDirectory +import com.drew.metadata.mov.metadata.QuickTimeMetadataDirectory +import com.drew.metadata.mp4.media.Mp4UuidBoxDirectory +import com.drew.metadata.png.PngDirectory +import com.drew.metadata.webp.WebpDirectory +import com.drew.metadata.xmp.XmpDirectory +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import deckers.thibault.aves.metadata.ExifGeoTiffTags +import deckers.thibault.aves.metadata.ExifInterfaceHelper +import deckers.thibault.aves.metadata.ExifInterfaceHelper.describeAll +import deckers.thibault.aves.metadata.ExifInterfaceHelper.getSafeDateMillis +import deckers.thibault.aves.metadata.ExifInterfaceHelper.getSafeDouble +import deckers.thibault.aves.metadata.ExifInterfaceHelper.getSafeInt +import deckers.thibault.aves.metadata.ExifInterfaceHelper.getSafeRational +import deckers.thibault.aves.metadata.ExifTags +import deckers.thibault.aves.metadata.GSpherical +import deckers.thibault.aves.metadata.GeoTiffKeys +import deckers.thibault.aves.metadata.MediaMetadataRetrieverHelper +import deckers.thibault.aves.metadata.MediaMetadataRetrieverHelper.getSafeDateMillis +import deckers.thibault.aves.metadata.MediaMetadataRetrieverHelper.getSafeDescription +import deckers.thibault.aves.metadata.MediaMetadataRetrieverHelper.getSafeInt +import deckers.thibault.aves.metadata.Metadata +import deckers.thibault.aves.metadata.Metadata.DIR_DNG +import deckers.thibault.aves.metadata.Metadata.DIR_EXIF_GEOTIFF +import deckers.thibault.aves.metadata.Metadata.DIR_PNG_TEXTUAL_DATA +import deckers.thibault.aves.metadata.Metadata.getRotationDegreesForExifCode +import deckers.thibault.aves.metadata.Metadata.isFlippedForExifCode +import deckers.thibault.aves.metadata.Mp4ParserHelper +import deckers.thibault.aves.metadata.MultiPage +import deckers.thibault.aves.metadata.PixyMetaHelper +import deckers.thibault.aves.metadata.QuickTimeMetadata +import deckers.thibault.aves.metadata.metadataextractor.Helper +import deckers.thibault.aves.metadata.metadataextractor.Helper.PNG_ITXT_DIR_NAME +import deckers.thibault.aves.metadata.metadataextractor.Helper.PNG_LAST_MODIFICATION_TIME_FORMAT +import deckers.thibault.aves.metadata.metadataextractor.Helper.PNG_TIME_DIR_NAME +import deckers.thibault.aves.metadata.metadataextractor.Helper.containsGeoTiffTags +import deckers.thibault.aves.metadata.metadataextractor.Helper.extractGeoKeys +import deckers.thibault.aves.metadata.metadataextractor.Helper.extractPngProfile +import deckers.thibault.aves.metadata.metadataextractor.Helper.getDateDigitizedMillis +import deckers.thibault.aves.metadata.metadataextractor.Helper.getDateModifiedMillis +import deckers.thibault.aves.metadata.metadataextractor.Helper.getDateOriginalMillis +import deckers.thibault.aves.metadata.metadataextractor.Helper.getSafeBoolean +import deckers.thibault.aves.metadata.metadataextractor.Helper.getSafeDateMillis +import deckers.thibault.aves.metadata.metadataextractor.Helper.getSafeInt +import deckers.thibault.aves.metadata.metadataextractor.Helper.getSafeRational +import deckers.thibault.aves.metadata.metadataextractor.Helper.getSafeString +import deckers.thibault.aves.metadata.metadataextractor.Helper.isPngTextDir +import deckers.thibault.aves.metadata.metadataextractor.PngActlDirectory +import deckers.thibault.aves.metadata.metadataextractor.SafeXmpReader +import deckers.thibault.aves.metadata.metadataextractor.mpf.MpEntry +import deckers.thibault.aves.metadata.metadataextractor.mpf.MpEntryDirectory +import deckers.thibault.aves.metadata.xmp.GoogleXMP +import deckers.thibault.aves.metadata.xmp.XMP +import deckers.thibault.aves.metadata.xmp.XMP.doesPropExist +import deckers.thibault.aves.metadata.xmp.XMP.getPropArrayItemValues +import deckers.thibault.aves.metadata.xmp.XMP.getSafeDateMillis +import deckers.thibault.aves.metadata.xmp.XMP.getSafeInt +import deckers.thibault.aves.metadata.xmp.XMP.getSafeLocalizedText +import deckers.thibault.aves.metadata.xmp.XMP.hasHdrGainMap +import deckers.thibault.aves.metadata.xmp.XMP.isMotionPhoto +import deckers.thibault.aves.metadata.xmp.XMP.isPanorama +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.utils.ContextUtils.queryContentPropValue +import deckers.thibault.aves.utils.HashUtils +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.MimeTypes.TIFF_EXTENSION_PATTERN +import deckers.thibault.aves.utils.MimeTypes.canReadWithExifInterface +import deckers.thibault.aves.utils.MimeTypes.canReadWithMetadataExtractor +import deckers.thibault.aves.utils.MimeTypes.isIsoBMFFImage +import deckers.thibault.aves.utils.MimeTypes.isVideo +import deckers.thibault.aves.utils.StorageUtils +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import org.json.JSONObject +import org.mp4parser.boxes.threegpp.ts26244.LocationInformationBox +import org.mp4parser.tools.Path +import java.nio.charset.StandardCharsets +import java.text.DecimalFormat +import java.text.ParseException +import java.util.Locale +import kotlin.math.roundToInt +import kotlin.math.roundToLong +import androidx.exifinterface.media.ExifInterfaceFork as ExifInterface + +class MetadataFetchHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "getAllMetadata" -> ioScope.launch { safe(call, result, ::getAllMetadata) } + "getCatalogMetadata" -> ioScope.launch { safe(call, result, ::getCatalogMetadata) } + "getOverlayMetadata" -> ioScope.launch { safe(call, result, ::getOverlayMetadata) } + "getGeoTiffInfo" -> ioScope.launch { safe(call, result, ::getGeoTiffInfo) } + "getMultiPageInfo" -> ioScope.launch { safe(call, result, ::getMultiPageInfo) } + "getPanoramaInfo" -> ioScope.launch { safe(call, result, ::getPanoramaInfo) } + "getIptc" -> ioScope.launch { safe(call, result, ::getIptc) } + "getXmp" -> ioScope.launch { safe(call, result, ::getXmp) } + "hasContentResolverProp" -> ioScope.launch { safe(call, result, ::hasContentProp) } + "getContentResolverProp" -> ioScope.launch { safe(call, result, ::getContentPropValue) } + "getDate" -> ioScope.launch { safe(call, result, ::getDate) } + "getFields" -> ioScope.launch { safe(call, result, ::getFields) } + else -> result.notImplemented() + } + } + + private fun getAllMetadata(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + if (mimeType == null || uri == null) { + result.error("getAllMetadata-args", "missing arguments", null) + return + } + + val metadataMap = HashMap>() + var foundExif = false + var foundXmp = false + var foundMp4Uuid = false + + fun processXmp(xmpMeta: XMPMeta, dirMap: MutableMap, allowMultiple: Boolean = false) { + if (foundXmp && !allowMultiple) return + foundXmp = true + try { + for (prop in xmpMeta) { + if (prop is XMPPropertyInfo) { + val path = prop.path + if (path?.isNotEmpty() == true) { + val value = if (XMP.isDataPath(path)) VALUE_SKIPPED_DATA else prop.value + if (value?.isNotEmpty() == true) { + dirMap[path] = value + } + } + } + } + } catch (e: XMPException) { + Log.w(LOG_TAG, "failed to read XMP directory for uri=$uri", e) + } + // remove this stat as it is not actual XMP data + dirMap.remove(XmpDirectory().getTagName(XmpDirectory.TAG_XMP_VALUE_COUNT)) + if (dirMap.isNotEmpty()) { + // add schema prefixes for namespace resolution + val prefixes = XMPMetaFactory.getSchemaRegistry().prefixes + dirMap["schemaRegistryPrefixes"] = JSONObject(prefixes).toString() + } + } + + val mp4UuidDirCount = HashMap() + fun processMp4Uuid(dir: Mp4UuidBoxDirectory) { + var thisDirName: String + when (val uuid = dir.getString(Mp4UuidBoxDirectory.TAG_UUID)) { + GSpherical.SPHERICAL_VIDEO_V1_UUID -> { + val bytes = dir.getByteArray(Mp4UuidBoxDirectory.TAG_USER_DATA) + thisDirName = "Spherical Video" + metadataMap[thisDirName] = HashMap(GSpherical(bytes).describe()) + } + + QuickTimeMetadata.PROF_UUID -> { + // redundant with info derived on the Dart side + } + + QuickTimeMetadata.USMT_UUID -> { + val bytes = dir.getByteArray(Mp4UuidBoxDirectory.TAG_USER_DATA) + val blocks = QuickTimeMetadata.parseUuidUsmt(bytes) + if (blocks.isNotEmpty()) { + thisDirName = "QuickTime User Media" + val usmt = metadataMap[thisDirName] ?: HashMap() + metadataMap[thisDirName] = usmt + + blocks.forEach { + var key = it.type + var value = it.value + val language = it.language + + var i = 0 + while (usmt.containsKey(key)) { + key = it.type + " (${++i})" + } + if (language != "und") { + value += " ($language)" + } + usmt[key] = value + } + } + } + + else -> { + val uuidPart = uuid.substringBefore('-') + thisDirName = "${dir.name} $uuidPart" + + val count = mp4UuidDirCount[uuidPart] ?: 0 + mp4UuidDirCount[uuidPart] = count + 1 + if (count > 0) { + thisDirName += " ($count)" + } + + val dirMap = metadataMap[thisDirName] ?: HashMap() + metadataMap[thisDirName] = dirMap + + dirMap.putAll(dir.tags.map { Pair(it.tagName, it.description) }) + } + } + } + + if (canReadWithMetadataExtractor(mimeType)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + foundExif = metadata.directories.any { it is ExifDirectoryBase && it.tagCount > 0 } + foundMp4Uuid = metadata.directories.any { it is Mp4UuidBoxDirectory && it.tagCount > 0 } + + val dirByName = metadata.directories.filter { + (it.tagCount > 0 || it.errorCount > 0 || it is MpEntryDirectory) + && it !is FileTypeDirectory + && it !is AviDirectory + }.groupBy { dir -> dir.name } + + for (dirEntry in dirByName) { + val baseDirName = dirEntry.key + + // exclude directories known to be redundant with info derived on the Dart side + // they are excluded by name instead of runtime type because excluding `Mp4Directory` + // would also exclude derived directories, such as `Mp4UuidBoxDirectory` + if (allMetadataRedundantDirNames.contains(baseDirName)) continue + + val sameNameDirs = dirEntry.value + val sameNameDirCount = sameNameDirs.size + for (dirIndex in 0.. 1 && !allMetadataMergeableDirNames.contains(baseDirName)) { + // optional count for multiple directories of the same type + thisDirName = "$thisDirName[${dirIndex + 1}]" + } + // optional parent to distinguish child directories of the same type + dir.parent?.name?.let { thisDirName = "$it/$thisDirName" } + + var dirMap = metadataMap[thisDirName] ?: HashMap() + if (dir !is Mp4UuidBoxDirectory) { + metadataMap[thisDirName] = dirMap + + // tags + val tags = dir.tags + when { + dir is ExifDirectoryBase -> { + when { + dir.containsGeoTiffTags() -> { + // split GeoTIFF tags in their own directory + val geoTiffDirMap = metadataMap[DIR_EXIF_GEOTIFF] ?: HashMap() + metadataMap[DIR_EXIF_GEOTIFF] = geoTiffDirMap + val byGeoTiff = tags.groupBy { ExifTags.isGeoTiffTag(it.tagType) } + byGeoTiff[true]?.flatMap { tag -> + when (tag.tagType) { + ExifGeoTiffTags.TAG_GEO_KEY_DIRECTORY -> { + val geoTiffTags = (dir as ExifIFD0Directory).extractGeoKeys(dir.getIntArray(tag.tagType)) + geoTiffTags.map { geoTag -> + val name = GeoTiffKeys.getTagName(geoTag.key) ?: "0x${geoTag.key.toString(16)}" + val value = geoTag.value + val description = if (value is DoubleArray) value.joinToString(" ") { doubleFormat.format(it) } else "$value" + Pair(name, description) + } + } + // skip `Geo double/ascii params`, as their content is split and presented through various GeoTIFF keys + ExifGeoTiffTags.TAG_GEO_DOUBLE_PARAMS, + ExifGeoTiffTags.TAG_GEO_ASCII_PARAMS -> ArrayList() + + else -> listOf(exifTagMapper(tag)) + } + }?.let { geoTiffDirMap.putAll(it) } + byGeoTiff[false]?.map { exifTagMapper(it) }?.let { dirMap.putAll(it) } + } + + mimeType == MimeTypes.DNG || mimeType == MimeTypes.DNG_ADOBE -> { + // split DNG tags in their own directory + val dngDirMap = metadataMap[DIR_DNG] ?: HashMap() + metadataMap[DIR_DNG] = dngDirMap + val byDng = tags.groupBy { ExifTags.isDngTag(it.tagType) } + byDng[true]?.map { exifTagMapper(it) }?.let { dngDirMap.putAll(it) } + byDng[false]?.map { exifTagMapper(it) }?.let { dirMap.putAll(it) } + } + + else -> dirMap.putAll(tags.map { exifTagMapper(it) }) + } + } + + dir.isPngTextDir() -> { + metadataMap.remove(thisDirName) + dirMap = metadataMap[DIR_PNG_TEXTUAL_DATA] ?: HashMap() + metadataMap[DIR_PNG_TEXTUAL_DATA] = dirMap + + for (tag in tags) { + val tagType = tag.tagType + if (tagType == PngDirectory.TAG_TEXTUAL_DATA) { + val pairs = dir.getObject(tagType) as List<*> + val textPairs = pairs.map { pair -> + val kv = pair as KeyValuePair + val key = kv.key + // `PNG-iTXt` uses UTF-8, contrary to `PNG-tEXt` and `PNG-zTXt` using Latin-1 / ISO-8859-1 + val charset = if (baseDirName == PNG_ITXT_DIR_NAME) { + StandardCharsets.UTF_8 + } else { + kv.value.charset + } + val valueString = String(kv.value.bytes, charset) + val dirs = extractPngProfile(key, valueString) + if (dirs?.any() == true) { + dirs.forEach { profileDir -> + val profileDirName = "${dir.name}/${profileDir.name}" + val profileDirMap = metadataMap[profileDirName] ?: HashMap() + metadataMap[profileDirName] = profileDirMap + val profileTags = profileDir.tags + if (profileDir is ExifDirectoryBase) { + profileDirMap.putAll(profileTags.map { exifTagMapper(it) }) + } else { + profileDirMap.putAll(profileTags.map { Pair(it.tagName, it.description) }) + } + } + null + } else { + Pair(key, valueString) + } + } + dirMap.putAll(textPairs.filterNotNull()) + } else { + dirMap[tag.tagName] = tag.description + } + } + } + + dir is MpEntryDirectory -> { + dirMap.putAll(dir.describe()) + } + + else -> dirMap.putAll(tags.map { Pair(it.tagName, it.description) }) + } + } + + if (!isLargeMp4(mimeType, sizeBytes)) { + if (dir is Mp4UuidBoxDirectory) { + processMp4Uuid(dir) + } + + if (dir is XmpDirectory) { + processXmp(dir.xmpMeta, dirMap, allowMultiple = true) + } + } + + // include errors, if any + dir.errors.forEachIndexed { i, error -> + dirMap["Error[$i]"] = error + } + } + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } + } + + if (!foundExif && canReadWithExifInterface(mimeType)) { + // fallback to read EXIF via ExifInterface + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val exif = ExifInterface(input) + val allTags = describeAll(exif).toMutableMap() + if (foundXmp) { + // do not overwrite XMP parsed by metadata-extractor + // with raw XMP found by ExifInterface + allTags.remove(Metadata.DIR_XMP) + } else { + val xmpTags = allTags[Metadata.DIR_XMP] + if (xmpTags != null) { + val xmpRaw = xmpTags[ExifInterface.TAG_XMP] + if (xmpRaw != null) { + val metadata = com.drew.metadata.Metadata() + val xmpBytes = xmpRaw.toByteArray(Charsets.UTF_8) + SafeXmpReader().extract(xmpBytes, 0, xmpBytes.size, metadata, null) + metadata.getFirstDirectoryOfType(XmpDirectory::class.java)?.let { xmpDir -> + val dirMap = HashMap() + processXmp(xmpDir.xmpMeta, dirMap, allowMultiple = true) + allTags[Metadata.DIR_XMP] = dirMap + } + } + } + } + metadataMap.putAll(allTags.mapValues { it.value.toMutableMap() }) + } + } catch (e: Exception) { + // ExifInterface initialization can fail with a RuntimeException + // caused by an internal MediaMetadataRetriever failure + Log.w(LOG_TAG, "failed to get metadata by ExifInterface for uri=$uri", e) + } + } + + fun fallbackProcessXmp(xmpMeta: XMPMeta) { + val thisDirName = XmpDirectory().name + val dirMap = metadataMap[thisDirName] ?: HashMap() + processXmp(xmpMeta, dirMap) + if (dirMap.isNotEmpty()) { + metadataMap[thisDirName] = dirMap + } + } + + XMP.checkIsoBMFFImage(context, mimeType, uri, foundXmp, ::fallbackProcessXmp) + // `metadata-extractor` may fail to get UUID boxes for some MP4 files, + // so we always check with `mp4parser`, even for smaller files + XMP.checkMp4(context, mimeType, uri) { dirs -> + for (dir in dirs.filterIsInstance()) { + fallbackProcessXmp(dir.xmpMeta) + } + if (!foundMp4Uuid) { + for (dir in dirs.filterIsInstance()) { + processMp4Uuid(dir) + } + } + } + + if (isVideo(mimeType)) { + // `metadata-extractor` do not extract custom tags in user data box + Mp4ParserHelper.getUserDataBox(context, mimeType, uri)?.let { box -> + metadataMap[Metadata.DIR_MP4_USER_DATA] = Mp4ParserHelper.extractBoxFields(box) + } + + // this is used as fallback when the video metadata cannot be found on the Dart side + // and to identify whether there is an accessible cover image + // do not include HEIC here + val mediaDir = getAllMetadataByMediaMetadataRetriever(uri) + if (mediaDir.isNotEmpty()) { + metadataMap[Metadata.DIR_MEDIA] = mediaDir + if (mediaDir.containsKey(KEY_HAS_EMBEDDED_PICTURE)) { + metadataMap[Metadata.DIR_COVER_ART] = hashMapOf( + // dummy entry value + "Image" to "data", + ) + } + } + // Android's `MediaExtractor` and `MediaPlayer` cannot be used for details + // about embedded images as they do not list them as separate tracks + // and only identify at most one + } else if (isIsoBMFFImage(mimeType)) { + Mp4ParserHelper.getSamsungSefd(context, uri)?.let { (_, bytes) -> + metadataMap[Mp4ParserHelper.SAMSUNG_MAKERNOTE_BOX_TYPE] = hashMapOf( + "Size" to bytes.size.toString(), + ) + } + } + + if (metadataMap.isNotEmpty()) { + result.success(metadataMap) + } else { + result.error("getAllMetadata-failure", "failed to get metadata for mimeType=$mimeType uri=$uri", null) + } + } + + private fun getAllMetadataByMediaMetadataRetriever(uri: Uri): MutableMap { + val dirMap = HashMap() + val retriever = StorageUtils.openMetadataRetriever(context, uri) ?: return dirMap + try { + for ((code, name) in MediaMetadataRetrieverHelper.allKeys) { + retriever.getSafeDescription(code) { dirMap[name] = it } + } + if (retriever.embeddedPicture != null) { + // additional key for the Dart side to know whether to add a `Cover` section + dirMap[KEY_HAS_EMBEDDED_PICTURE] = "yes" + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get video metadata by MediaMetadataRetriever for uri=$uri", e) + } finally { + // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs + retriever.release() + } + return dirMap + } + + // set `KEY_DATE_MILLIS` from these fields (by precedence): + // - Exif / DATETIME_ORIGINAL + // - Exif / DATETIME + // - XMP / xmp:CreateDate + // - XMP / photoshop:DateCreated + // - PNG / TIME / LAST_MODIFICATION_TIME + // - Video / METADATA_KEY_DATE + // set `KEY_XMP_TITLE` from these fields (by precedence): + // - XMP / dc:title + // - IPTC / object-name + // set `KEY_XMP_SUBJECTS` from these fields (by precedence): + // - XMP / dc:subject + // - IPTC / keywords + // set `KEY_RATING` from these fields (by precedence): + // - XMP / xmp:Rating + // - XMP / MicrosoftPhoto:Rating + private fun getCatalogMetadata(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val path = call.argument("path") + val sizeBytes = call.argument("sizeBytes")?.toLong() + if (mimeType == null || uri == null) { + result.error("getCatalogMetadata-args", "missing arguments", null) + return + } + + val metadataMap = HashMap() + getCatalogMetadataByMetadataExtractor(mimeType, uri, path, sizeBytes, metadataMap) + + if (isVideo(mimeType) || isIsoBMFFImage(mimeType)) { + getMultimediaCatalogMetadataByMediaMetadataRetriever(mimeType, uri, metadataMap) + + // fallback to MP4 `loci` box for location + if (!metadataMap.contains(KEY_LATITUDE) || !metadataMap.contains(KEY_LONGITUDE)) { + try { + Mp4ParserHelper.getUserDataBox(context, mimeType, uri)?.let { userDataBox -> + Path.getPath(userDataBox, LocationInformationBox.TYPE)?.let { locationBox -> + if (!locationBox.isParsed) { + locationBox.parseDetails() + } + metadataMap[KEY_LATITUDE] = locationBox.latitude + metadataMap[KEY_LONGITUDE] = locationBox.longitude + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get Location Information box by MP4 parser for mimeType=$mimeType uri=$uri", e) + } + } + } + + if (isIsoBMFFImage(mimeType)) { + val flags = (metadataMap[KEY_FLAGS] ?: 0) as Int + if ((flags and MASK_IS_MOTION_PHOTO == 0) && MultiPage.isIsoBMFFImageSefdMotionPhoto(context, uri)) { + metadataMap[KEY_FLAGS] = flags or MASK_IS_MULTIPAGE or MASK_IS_MOTION_PHOTO + } + } + + // report success even when empty + result.success(metadataMap) + } + + private fun getCatalogMetadataByMetadataExtractor( + mimeType: String, + uri: Uri, + path: String?, + sizeBytes: Long?, + metadataMap: HashMap, + ) { + var flags = (metadataMap[KEY_FLAGS] ?: 0) as Int + var foundExif = false + var foundXmp = false + var foundMp4Uuid = false + + fun processXmp(xmpMeta: XMPMeta, allowMultiple: Boolean = false) { + if (foundXmp && !allowMultiple) return + foundXmp = true + try { + if (xmpMeta.doesPropExist(XMP.DC_SUBJECT_PROP_NAME)) { + val values = xmpMeta.getPropArrayItemValues(XMP.DC_SUBJECT_PROP_NAME) + metadataMap[KEY_XMP_SUBJECTS] = values.joinToString(XMP_SUBJECTS_SEPARATOR) + } + xmpMeta.getSafeLocalizedText(XMP.DC_TITLE_PROP_NAME, acceptBlank = false) { metadataMap[KEY_XMP_TITLE] = it } + if (!metadataMap.containsKey(KEY_DATE_MILLIS)) { + xmpMeta.getSafeDateMillis(XMP.XMP_CREATE_DATE_PROP_NAME) { metadataMap[KEY_DATE_MILLIS] = it } + if (!metadataMap.containsKey(KEY_DATE_MILLIS)) { + xmpMeta.getSafeDateMillis(XMP.PS_DATE_CREATED_PROP_NAME) { metadataMap[KEY_DATE_MILLIS] = it } + } + } + + xmpMeta.getSafeInt(XMP.XMP_RATING_PROP_NAME) { metadataMap[KEY_RATING] = it } + if (!metadataMap.containsKey(KEY_RATING)) { + xmpMeta.getSafeInt(XMP.MS_RATING_PROP_NAME) { percentRating -> + // values of 1,25,50,75,99% correspond to 1,2,3,4,5 stars + val standardRating = (percentRating / 25f).roundToInt() + 1 + metadataMap[KEY_RATING] = standardRating + } + } + + // identification of panorama (aka photo sphere) + if (xmpMeta.isPanorama()) { + flags = flags or MASK_IS_360 + } + + // identification of motion photo + if (xmpMeta.isMotionPhoto()) { + flags = flags or MASK_IS_MULTIPAGE or MASK_IS_MOTION_PHOTO + } + + // identification of embedded gain map + if (xmpMeta.hasHdrGainMap()) { + flags = flags or MASK_IS_HDR + } + } catch (e: XMPException) { + Log.w(LOG_TAG, "failed to read XMP directory for uri=$uri", e) + } + } + + fun processMp4Uuid(dir: Mp4UuidBoxDirectory) { + // identification of spherical video (aka 360° video) + if (dir.getString(Mp4UuidBoxDirectory.TAG_UUID) == GSpherical.SPHERICAL_VIDEO_V1_UUID) { + flags = flags or MASK_IS_360 + } + } + + if (canReadWithMetadataExtractor(mimeType)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + foundExif = metadata.directories.any { it is ExifDirectoryBase && it.tagCount > 0 } + foundMp4Uuid = metadata.directories.any { it is Mp4UuidBoxDirectory && it.tagCount > 0 } + + // File type + for (dir in metadata.getDirectoriesOfType(FileTypeDirectory::class.java)) { + // * `metadata-extractor` sometimes detects the wrong MIME type (e.g. `pef` file as `tiff`, `mpeg` as `dvd`, `avif` as `mov`) + // * the content resolver / media store sometimes reports the wrong MIME type (e.g. `png` file as `jpeg`, `tiff` as `srw`) + // * `context.getContentResolver().getType()` sometimes returns an incorrect value + // * `MediaMetadataRetriever.setDataSource()` sometimes fails with `status = 0x80000000` + // * file extension is unreliable + // In the end, `metadata-extractor` is the most reliable, except for `tiff`/`dvd`/`mov`/`zip` (false positives, false negatives), + // in which case we trust the file extension + // cf https://github.com/drewnoakes/metadata-extractor/issues/296 + if (path?.matches(TIFF_EXTENSION_PATTERN) == true) { + metadataMap[KEY_MIME_TYPE] = MimeTypes.TIFF + } else { + dir.getSafeString(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE) { + if (it != MimeTypes.TIFF && it != MimeTypes.DVD && it != MimeTypes.MOV && it != MimeTypes.ZIP) { + metadataMap[KEY_MIME_TYPE] = it + } + } + } + } + + // EXIF + for (dir in metadata.getDirectoriesOfType(ExifSubIFDDirectory::class.java)) { + dir.getDateOriginalMillis { metadataMap[KEY_DATE_MILLIS] = it } + if (!metadataMap.containsKey(KEY_DATE_MILLIS)) { + // fetch date modified from SubIFD directory first, as the sub-second tag is here + dir.getDateModifiedMillis { metadataMap[KEY_DATE_MILLIS] = it } + } + } + for (dir in metadata.getDirectoriesOfType(ExifIFD0Directory::class.java)) { + if (!metadataMap.containsKey(KEY_DATE_MILLIS)) { + // fallback to fetch date modified from IFD0 directory, without the sub-second tag + // in case there was no SubIFD directory + dir.getSafeDateMillis(ExifIFD0Directory.TAG_DATETIME, null)?.let { metadataMap[KEY_DATE_MILLIS] = it } + } + dir.getSafeInt(ExifDirectoryBase.TAG_ORIENTATION) { orientation -> + if (isFlippedForExifCode(orientation)) { + flags = flags or MASK_IS_FLIPPED + } + metadataMap[KEY_ROTATION_DEGREES] = getRotationDegreesForExifCode(orientation) + } + } + + // GPS + for (dir in metadata.getDirectoriesOfType(GpsDirectory::class.java)) { + val geoLocation = dir.geoLocation + if (geoLocation != null) { + metadataMap[KEY_LATITUDE] = geoLocation.latitude + metadataMap[KEY_LONGITUDE] = geoLocation.longitude + } + } + + // JPEG Multi-Picture Format + if (metadata.getDirectoriesOfType(MpEntryDirectory::class.java).count { !it.entry.isThumbnail } > 1) { + flags = flags or MASK_IS_MULTIPAGE + + if (hasAppleHdrGainMap(uri, sizeBytes)) { + flags = flags or MASK_IS_HDR + } + } + + // XMP + if (!isLargeMp4(mimeType, sizeBytes)) { + metadata.getDirectoriesOfType(XmpDirectory::class.java).map { it.xmpMeta }.forEach { + processXmp(it, allowMultiple = true) + } + + // XMP fallback to IPTC + if (!metadataMap.containsKey(KEY_XMP_TITLE) || !metadataMap.containsKey(KEY_XMP_SUBJECTS)) { + for (dir in metadata.getDirectoriesOfType(IptcDirectory::class.java)) { + if (!metadataMap.containsKey(KEY_XMP_TITLE)) { + dir.getSafeString(IptcDirectory.TAG_OBJECT_NAME, acceptBlank = false) { metadataMap[KEY_XMP_TITLE] = it } + } + if (!metadataMap.containsKey(KEY_XMP_SUBJECTS)) { + dir.keywords?.let { metadataMap[KEY_XMP_SUBJECTS] = it.joinToString(XMP_SUBJECTS_SEPARATOR) } + } + } + } + } + + if (!metadataMap.containsKey(KEY_LATITUDE) || !metadataMap.containsKey(KEY_LONGITUDE)) { + for (dir in metadata.getDirectoriesOfType(QuickTimeMetadataDirectory::class.java)) { + dir.getSafeString(QuickTimeMetadataDirectory.TAG_LOCATION_ISO6709) { locationString -> + val matcher = Metadata.VIDEO_LOCATION_PATTERN.matcher(locationString) + if (matcher.find() && matcher.groupCount() >= 2) { + val latitude = matcher.group(1)?.toDoubleOrNull() + val longitude = matcher.group(2)?.toDoubleOrNull() + if (latitude != null && longitude != null) { + metadataMap[KEY_LATITUDE] = latitude + metadataMap[KEY_LONGITUDE] = longitude + } + } + } + } + } + + when (mimeType) { + MimeTypes.PNG -> { + // date fallback to PNG time chunk + if (!metadataMap.containsKey(KEY_DATE_MILLIS)) { + for (dir in metadata.getDirectoriesOfType(PngDirectory::class.java).filter { it.name == PNG_TIME_DIR_NAME }) { + dir.getSafeString(PngDirectory.TAG_LAST_MODIFICATION_TIME) { + try { + PNG_LAST_MODIFICATION_TIME_FORMAT.parse(it)?.let { date -> + metadataMap[KEY_DATE_MILLIS] = date.time + } + } catch (e: ParseException) { + Log.w(LOG_TAG, "failed to parse PNG date=$it for uri=$uri", e) + } + } + } + } + + // identification of animated PNG + if (metadata.containsDirectoryOfType(PngActlDirectory::class.java)) { + flags = flags or MASK_IS_ANIMATED + } + } + + MimeTypes.GIF -> { + // identification of animated GIF + if (metadata.containsDirectoryOfType(GifAnimationDirectory::class.java)) { + flags = flags or MASK_IS_ANIMATED + } + } + + MimeTypes.WEBP -> { + // identification of animated WEBP + for (dir in metadata.getDirectoriesOfType(WebpDirectory::class.java)) { + dir.getSafeBoolean(WebpDirectory.TAG_IS_ANIMATION) { + if (it) flags = flags or MASK_IS_ANIMATED + } + } + } + + MimeTypes.TIFF -> { + // identification of GeoTIFF + for (dir in metadata.getDirectoriesOfType(ExifIFD0Directory::class.java)) { + if (dir.containsGeoTiffTags()) { + flags = flags or MASK_IS_GEOTIFF + } + } + } + } + + metadata.getDirectoriesOfType(Mp4UuidBoxDirectory::class.java).forEach(::processMp4Uuid) + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } + } + + if (!foundExif && canReadWithExifInterface(mimeType)) { + // fallback to read EXIF via ExifInterface + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val exif = ExifInterface(input) + exif.getSafeDateMillis(ExifInterface.TAG_DATETIME_ORIGINAL, ExifInterface.TAG_SUBSEC_TIME_ORIGINAL) { metadataMap[KEY_DATE_MILLIS] = it } + if (!metadataMap.containsKey(KEY_DATE_MILLIS)) { + exif.getSafeDateMillis(ExifInterface.TAG_DATETIME, ExifInterface.TAG_SUBSEC_TIME) { metadataMap[KEY_DATE_MILLIS] = it } + } + exif.getSafeInt(ExifInterface.TAG_ORIENTATION, acceptZero = false) { + if (exif.isFlipped) flags = flags or MASK_IS_FLIPPED + metadataMap[KEY_ROTATION_DEGREES] = exif.rotationDegrees + } + val latLong = exif.latLong + if (latLong?.size == 2) { + metadataMap[KEY_LATITUDE] = latLong[0] + metadataMap[KEY_LONGITUDE] = latLong[1] + } + } + } catch (e: Exception) { + // ExifInterface initialization can fail with a RuntimeException + // caused by an internal MediaMetadataRetriever failure + Log.w(LOG_TAG, "failed to get metadata by ExifInterface for mimeType=$mimeType uri=$uri", e) + } + } + + XMP.checkIsoBMFFImage(context, mimeType, uri, foundXmp, ::processXmp) + // `metadata-extractor` may fail to get UUID boxes for some MP4 files, + // so we always check with `mp4parser`, even for smaller files + XMP.checkMp4(context, mimeType, uri) { dirs -> + for (dir in dirs.filterIsInstance()) { + processXmp(dir.xmpMeta) + } + if (!foundMp4Uuid) { + for (dir in dirs.filterIsInstance()) { + processMp4Uuid(dir) + } + } + } + + if (mimeType == MimeTypes.TIFF && MultiPage.isMultiPageTiff(context, uri)) flags = flags or MASK_IS_MULTIPAGE + + metadataMap[KEY_FLAGS] = flags + } + + private fun hasAppleHdrGainMap(uri: Uri, sizeBytes: Long?): Boolean { + val mpEntries = MultiPage.getJpegMpfEntries(context, uri, sizeBytes) ?: return false + mpEntries.filter { it.type == MpEntry.TYPE_UNDEFINED }.forEachIndexed { mpIndex, mpEntry -> + var dataOffset = mpEntry.dataOffset + if (dataOffset > 0) { + val baseOffset = MultiPage.getJpegMpfBaseOffset(context, uri, sizeBytes) + if (baseOffset != null) { + dataOffset += baseOffset + } + } + StorageUtils.openInputStream(context, uri)?.let { input -> + input.skip(dataOffset) + try { + val pageMetadata = Helper.safeRead(input, sizeBytes) + if (pageMetadata.getDirectoriesOfType(XmpDirectory::class.java).any { it.xmpMeta.hasHdrGainMap() }) { + return true + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for uri=$uri mpIndex=$mpIndex mpEntry=$mpEntry", e) + } + } + } + return false + } + + private fun getMultimediaCatalogMetadataByMediaMetadataRetriever( + mimeType: String, + uri: Uri, + metadataMap: HashMap, + ) { + val retriever = StorageUtils.openMetadataRetriever(context, uri) ?: return + + var flags = (metadataMap[KEY_FLAGS] ?: 0) as Int + try { + retriever.getSafeInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION) { metadataMap[KEY_ROTATION_DEGREES] = it } + if (!metadataMap.containsKey(KEY_DATE_MILLIS)) { + retriever.getSafeDateMillis(MediaMetadataRetriever.METADATA_KEY_DATE) { metadataMap[KEY_DATE_MILLIS] = it } + } + + if (!metadataMap.containsKey(KEY_LATITUDE) || !metadataMap.containsKey(KEY_LONGITUDE)) { + val locationString = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_LOCATION) + if (locationString != null) { + val matcher = Metadata.VIDEO_LOCATION_PATTERN.matcher(locationString) + if (matcher.find() && matcher.groupCount() >= 2) { + val latitude = matcher.group(1)?.toDoubleOrNull() + val longitude = matcher.group(2)?.toDoubleOrNull() + if (latitude != null && longitude != null) { + metadataMap[KEY_LATITUDE] = latitude + metadataMap[KEY_LONGITUDE] = longitude + } + } + } + } + + if (isIsoBMFFImage(mimeType)) { + retriever.getSafeInt(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) { + if (it > 1) flags = flags or MASK_IS_MULTIPAGE + } + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + retriever.getSafeInt(MediaMetadataRetriever.METADATA_KEY_COLOR_TRANSFER) { + if (it == MediaFormat.COLOR_TRANSFER_ST2084 || it == MediaFormat.COLOR_TRANSFER_HLG) { + flags = flags or MASK_IS_HDR + } + } + } + + metadataMap[KEY_FLAGS] = flags + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get catalog metadata by MediaMetadataRetriever for uri=$uri", e) + } finally { + // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs + retriever.release() + } + } + + private fun getOverlayMetadata(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + val fields = call.argument>("fields") + if (mimeType == null || uri == null || fields == null) { + result.error("getOverlayMetadata-args", "missing arguments", null) + return + } + + val metadataMap = HashMap() + if (fields.isEmpty() || isVideo(mimeType)) { + result.success(metadataMap) + return + } + + val saveExposureTime = fun(value: Rational) { + // `TAG_EXPOSURE_TIME` as a string is sometimes a ratio, sometimes a decimal + // so we explicitly request it as a rational (e.g. 1/100, 1/14, 71428571/1000000000, 4000/1000, 2000000000/500000000) + // and process it to make sure the numerator is `1` when the ratio value is less than 1 + val num = value.numerator + val denom = value.denominator + metadataMap[KEY_EXPOSURE_TIME] = when { + num >= denom -> "${value.toSimpleString(true)}″" + num != 1L && num != 0L -> Rational(1, (denom / num.toDouble()).roundToLong()).toString() + else -> value.toString() + } + } + + var foundExif = false + if (canReadWithMetadataExtractor(mimeType)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + for (dir in metadata.getDirectoriesOfType(ExifSubIFDDirectory::class.java)) { + foundExif = true + if (fields.contains(KEY_APERTURE)) { + dir.getSafeRational(ExifDirectoryBase.TAG_FNUMBER) { metadataMap[KEY_APERTURE] = it.numerator.toDouble() / it.denominator } + } + if (fields.contains(KEY_DESCRIPTION)) { + getDescriptionByMetadataExtractor(metadata)?.let { metadataMap[KEY_DESCRIPTION] = it } + } + if (fields.contains(KEY_EXPOSURE_TIME)) { + dir.getSafeRational(ExifDirectoryBase.TAG_EXPOSURE_TIME, saveExposureTime) + } + if (fields.contains(KEY_FOCAL_LENGTH)) { + dir.getSafeRational(ExifDirectoryBase.TAG_FOCAL_LENGTH) { metadataMap[KEY_FOCAL_LENGTH] = it.numerator.toDouble() / it.denominator } + } + if (fields.contains(KEY_ISO)) { + dir.getSafeInt(ExifDirectoryBase.TAG_ISO_EQUIVALENT) { metadataMap[KEY_ISO] = it } + } + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } + } + + if (!foundExif && canReadWithExifInterface(mimeType)) { + // fallback to read EXIF via ExifInterface + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val exif = ExifInterface(input) + if (fields.contains(KEY_APERTURE)) { + exif.getSafeDouble(ExifInterface.TAG_F_NUMBER) { metadataMap[KEY_APERTURE] = it } + } + if (fields.contains(KEY_EXPOSURE_TIME)) { + exif.getSafeRational(ExifInterface.TAG_EXPOSURE_TIME, saveExposureTime) + } + if (fields.contains(KEY_FOCAL_LENGTH)) { + exif.getSafeDouble(ExifInterface.TAG_FOCAL_LENGTH) { metadataMap[KEY_FOCAL_LENGTH] = it } + } + if (fields.contains(KEY_ISO)) { + exif.getSafeInt(ExifInterface.TAG_PHOTOGRAPHIC_SENSITIVITY) { metadataMap[KEY_ISO] = it } + } + } + } catch (e: Exception) { + // ExifInterface initialization can fail with a RuntimeException + // caused by an internal MediaMetadataRetriever failure + Log.w(LOG_TAG, "failed to get metadata by ExifInterface for mimeType=$mimeType uri=$uri", e) + } + } + + result.success(metadataMap) + } + + // returns description from these fields (by precedence): + // - XMP / dc:description + // - IPTC / caption-abstract + // - Exif / UserComment + // - Exif / ImageDescription + private fun getDescriptionByMetadataExtractor(metadata: com.drew.metadata.Metadata): String? { + var description: String? = null + for (dir in metadata.getDirectoriesOfType(XmpDirectory::class.java)) { + val xmpMeta = dir.xmpMeta + try { + if (xmpMeta.doesPropExist(XMP.DC_DESCRIPTION_PROP_NAME)) { + xmpMeta.getSafeLocalizedText(XMP.DC_DESCRIPTION_PROP_NAME, acceptBlank = false) { description = it } + } + } catch (e: XMPException) { + Log.w(LOG_TAG, "failed to read XMP directory", e) + } + } + if (description == null) { + for (dir in metadata.getDirectoriesOfType(IptcDirectory::class.java)) { + dir.getSafeString(IptcDirectory.TAG_CAPTION, acceptBlank = false) { description = it } + } + } + if (description == null) { + for (dir in metadata.getDirectoriesOfType(ExifSubIFDDirectory::class.java)) { + // user comment field specifies encoding, unlike other string fields + if (dir.containsTag(ExifSubIFDDirectory.TAG_USER_COMMENT)) { + val string = dir.getDescription(ExifSubIFDDirectory.TAG_USER_COMMENT) + if (string.isNotBlank()) { + description = string + } + } + } + } + if (description == null) { + for (dir in metadata.getDirectoriesOfType(ExifIFD0Directory::class.java)) { + dir.getSafeString(ExifIFD0Directory.TAG_IMAGE_DESCRIPTION, acceptBlank = false) { description = it } + } + } + return description + } + + private fun getGeoTiffInfo(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + if (mimeType == null || uri == null) { + result.error("getGeoTiffInfo-args", "missing arguments", null) + return + } + + if (canReadWithMetadataExtractor(mimeType)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + val fields = HashMap() + for (dir in metadata.getDirectoriesOfType(ExifIFD0Directory::class.java)) { + if (dir.containsGeoTiffTags()) { + fields.putAll(dir.tags.map { it.tagType }.filter { ExifTags.isGeoTiffTag(it) }.map { + val value = when (it) { + ExifGeoTiffTags.TAG_GEO_ASCII_PARAMS -> dir.getString(it) + else -> dir.getObject(it) + } + Pair(it, value) + }) + val geoKeyDirectory = dir.getIntArray(ExifGeoTiffTags.TAG_GEO_KEY_DIRECTORY) + fields.putAll((dir as ExifIFD0Directory).extractGeoKeys(geoKeyDirectory)) + } + } + result.success(fields) + return + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } + } + result.error("getGeoTiffInfo-empty", "failed to get info for mimeType=$mimeType uri=$uri", null) + } + + private fun getMultiPageInfo(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + val isMotionPhoto = call.argument("isMotionPhoto") + if (mimeType == null || uri == null || sizeBytes == null || isMotionPhoto == null) { + result.error("getMultiPageInfo-args", "missing arguments", null) + return + } + + val pages: ArrayList? = if (isMotionPhoto) { + MultiPage.getMotionPhotoPages(context, uri, mimeType, sizeBytes) + } else { + when (mimeType) { + MimeTypes.HEIC, MimeTypes.HEIF -> MultiPage.getHeicTracks(context, uri) + MimeTypes.JPEG -> MultiPage.getJpegMpfPages(context, uri, sizeBytes) + MimeTypes.TIFF -> MultiPage.getTiffPages(context, uri) + else -> null + } + } + if (pages?.isEmpty() == true) { + result.error("getMultiPageInfo-empty", "failed to get pages for mimeType=$mimeType uri=$uri", null) + } else { + result.success(pages) + } + } + + private fun getPanoramaInfo(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + if (mimeType == null || uri == null) { + result.error("getPanoramaInfo-args", "missing arguments", null) + return + } + + val fields: FieldMap = hashMapOf() + var foundXmp = false + + fun processXmp(xmpMeta: XMPMeta, allowMultiple: Boolean = false) { + if (foundXmp && !allowMultiple) return + foundXmp = true + fields.putAll(GoogleXMP.getPanoramaInfo(xmpMeta)) + } + + if (canReadWithMetadataExtractor(mimeType) && !isLargeMp4(mimeType, sizeBytes)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + metadata.getDirectoriesOfType(XmpDirectory::class.java).map { it.xmpMeta }.forEach { + processXmp(it, allowMultiple = true) + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } + } + + XMP.checkIsoBMFFImage(context, mimeType, uri, foundXmp, ::processXmp) + // `metadata-extractor` may fail to get UUID boxes for some MP4 files, + // so we always check with `mp4parser`, even for smaller files + XMP.checkMp4(context, mimeType, uri) { dirs -> + for (dir in dirs.filterIsInstance()) { + processXmp(dir.xmpMeta) + } + } + + if (fields.isEmpty()) { + result.error("getPanoramaInfo-empty", "failed to get info for mimeType=$mimeType uri=$uri", null) + } else { + fields["projectionType"] = fields["projectionType"] ?: GoogleXMP.GPANO_PROJECTION_TYPE_DEFAULT + result.success(fields) + } + } + + private fun getIptc(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + if (mimeType == null || uri == null) { + result.error("getIptc-args", "missing arguments", null) + return + } + + if (MimeTypes.canReadWithPixyMeta(mimeType)) { + try { + StorageUtils.openInputStream(context, uri)?.use { input -> + val iptcDataList = PixyMetaHelper.getIptc(input) + result.success(iptcDataList) + return + } + } catch (e: Exception) { + result.error("getIptc-exception", "failed to read IPTC for mimeType=$mimeType uri=$uri", e.message) + return + } + } + + result.success(null) + } + + // returns XMP components + // returns an empty list if there is no XMP + private fun getXmp(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + if (mimeType == null || uri == null) { + result.error("getXmp-args", "missing arguments", null) + return + } + + val xmpStrings = mutableListOf() + var foundXmp = false + + fun processXmp(xmpMeta: XMPMeta, allowMultiple: Boolean = false) { + if (foundXmp && !allowMultiple) return + foundXmp = true + try { + xmpStrings.add(XMPMetaFactory.serializeToString(xmpMeta, xmpSerializeOptions)) + } catch (e: XMPException) { + Log.w(LOG_TAG, "failed to read XMP directory for uri=$uri", e) + } + } + + if (canReadWithMetadataExtractor(mimeType) && !isLargeMp4(mimeType, sizeBytes)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + metadata.getDirectoriesOfType(XmpDirectory::class.java).map { it.xmpMeta }.forEach { + processXmp(it, allowMultiple = true) + } + } + } catch (e: Exception) { + result.error("getXmp-exception", "failed to read XMP for mimeType=$mimeType uri=$uri", e.message) + return + } catch (e: NoClassDefFoundError) { + result.error("getXmp-noclass", "failed to read XMP for mimeType=$mimeType uri=$uri", e.message) + return + } catch (e: AssertionError) { + result.error("getXmp-assert", "failed to read XMP for mimeType=$mimeType uri=$uri", e.message) + return + } + } + + XMP.checkIsoBMFFImage(context, mimeType, uri, foundXmp, ::processXmp) + // `metadata-extractor` may fail to get UUID boxes for some MP4 files, + // so we always check with `mp4parser`, even for smaller files + XMP.checkMp4(context, mimeType, uri) { dirs -> + for (dir in dirs.filterIsInstance()) { + processXmp(dir.xmpMeta) + } + } + + result.success(xmpStrings) + } + + private fun hasContentProp(call: MethodCall, result: MethodChannel.Result) { + val prop = call.argument("prop") + if (prop == null) { + result.error("hasContentProp-args", "missing arguments", null) + return + } + + result.success( + when (prop) { + "owner_package_name" -> Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q + else -> { + result.error("hasContentProp-unknown", "unknown property=$prop", null) + return + } + } + ) + } + + private fun getContentPropValue(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val prop = call.argument("prop") + if (mimeType == null || uri == null || prop == null) { + result.error("getContentPropValue-args", "missing arguments", null) + return + } + + try { + val value = context.queryContentPropValue(uri, mimeType, prop) + result.success(value?.toString()) + } catch (e: Exception) { + result.error("getContentPropValue-query", "failed to query prop for uri=$uri", e.message) + } + } + + private fun getDate(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + val field = call.argument("field") + if (mimeType == null || uri == null || field == null) { + result.error("getDate-args", "missing arguments", null) + return + } + + var dateMillis: Long? = null + if (canReadWithMetadataExtractor(mimeType)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + val tag = when (field) { + ExifInterface.TAG_DATETIME -> ExifIFD0Directory.TAG_DATETIME + ExifInterface.TAG_DATETIME_DIGITIZED -> ExifSubIFDDirectory.TAG_DATETIME_DIGITIZED + ExifInterface.TAG_DATETIME_ORIGINAL -> ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL + ExifInterface.TAG_GPS_DATESTAMP -> GpsDirectory.TAG_DATE_STAMP + else -> { + result.error("getDate-field", "unsupported ExifInterface field=$field", null) + return + } + } + + when (tag) { + ExifIFD0Directory.TAG_DATETIME -> { + for (dir in metadata.getDirectoriesOfType(ExifSubIFDDirectory::class.java)) { + dir.getDateModifiedMillis { dateMillis = it } + } + if (dateMillis == null) { + for (dir in metadata.getDirectoriesOfType(ExifIFD0Directory::class.java)) { + dir.getSafeDateMillis(ExifIFD0Directory.TAG_DATETIME, null)?.let { dateMillis = it } + } + } + } + + ExifSubIFDDirectory.TAG_DATETIME_DIGITIZED -> { + for (dir in metadata.getDirectoriesOfType(ExifSubIFDDirectory::class.java)) { + dir.getDateDigitizedMillis { dateMillis = it } + } + } + + ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL -> { + for (dir in metadata.getDirectoriesOfType(ExifSubIFDDirectory::class.java)) { + dir.getDateOriginalMillis { dateMillis = it } + } + } + + GpsDirectory.TAG_DATE_STAMP -> { + for (dir in metadata.getDirectoriesOfType(GpsDirectory::class.java)) { + dir.gpsDate?.let { dateMillis = it.time } + } + } + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } + } + + result.success(dateMillis) + } + + private fun getFields(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.toUri() + val sizeBytes = call.argument("sizeBytes")?.toLong() + val fields = call.argument>("fields") + if (mimeType == null || uri == null || fields == null) { + result.error("getFields-args", "missing arguments", null) + return + } + + val metadataMap = HashMap() + + val hashFields = fields.filter { it.startsWith(HASH_FIELD_PREFIX) }.toSet() + metadataMap.putAll(getHashFields(uri, mimeType, sizeBytes, hashFields)) + + val exifFields = fields.filterNot { hashFields.contains(it) }.toSet() + metadataMap.putAll(getExifFields(uri, mimeType, sizeBytes, exifFields)) + + result.success(metadataMap) + } + + private fun getHashFields(uri: Uri, mimeType: String, sizeBytes: Long?, fields: Set): FieldMap { + val metadataMap = HashMap() + fields.forEach { field -> + val function = field.substringAfter(HASH_FIELD_PREFIX).lowercase(Locale.ROOT) + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + metadataMap[field] = HashUtils.getHash(input, function) + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get hash for mimeType=$mimeType uri=$uri function=$function", e) + } + } + return metadataMap + } + + private fun getExifFields(uri: Uri, mimeType: String, sizeBytes: Long?, fields: Set): FieldMap { + val metadataMap = HashMap() + if (fields.isEmpty() || isVideo(mimeType)) { + return metadataMap + } + + var foundExif = false + if (canReadWithMetadataExtractor(mimeType)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + for (dir in metadata.getDirectoriesOfType(ExifDirectoryBase::class.java)) { + foundExif = true + val allTags = ExifInterfaceHelper.allTags + fields.forEach { tag -> + allTags[tag]?.let { mapper -> + val tagType = mapper.type + dir.getDescription(tagType)?.let { value -> metadataMap[tag] = value } + } + } + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } + } + + if (!foundExif && canReadWithExifInterface(mimeType)) { + // fallback to read EXIF via ExifInterface + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val exif = ExifInterface(input) + fields.forEach { tag -> + if (exif.hasAttribute(tag)) { + val value = exif.getAttribute(tag) + if (value != null) { + metadataMap[tag] = value + } + } + } + } + } catch (e: Exception) { + // ExifInterface initialization can fail with a RuntimeException + // caused by an internal MediaMetadataRetriever failure + Log.w(LOG_TAG, "failed to get metadata by ExifInterface for mimeType=$mimeType uri=$uri", e) + } + } + + return metadataMap + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/metadata_fetch" + + private val doubleFormat = DecimalFormat("0.###") + + private val allMetadataRedundantDirNames = setOf( + "MP4", + "MP4 Metadata", + "MP4 Sound", + "MP4 Video", + "QuickTime", + "QuickTime Sound", + "QuickTime Video", + ) + private val allMetadataMergeableDirNames = setOf( + "Exif SubIFD", + "GIF Control", + "GIF Image", + "HEIF", + "ICC Profile", + "IPTC", + "WebP", + "XMP", + ) + + private val xmpSerializeOptions = SerializeOptions().apply { + omitPacketWrapper = true // e.g. ... + omitXmpMetaElement = false // e.g. ... + } + + private fun isLargeMp4(mimeType: String, sizeBytes: Long?) = mimeType == MimeTypes.MP4 && Metadata.isDangerouslyLarge(sizeBytes) + + private fun exifTagMapper(it: Tag): Pair { + val name = if (it.hasTagName()) { + it.tagName + } else { + ExifTags.getTagName(it.tagType) ?: it.tagName + } + return Pair(name, it.description) + } + + // catalog metadata + private const val KEY_MIME_TYPE = "mimeType" + private const val KEY_DATE_MILLIS = "dateMillis" + private const val KEY_FLAGS = "flags" + private const val KEY_ROTATION_DEGREES = "rotationDegrees" + private const val KEY_LATITUDE = "latitude" + private const val KEY_LONGITUDE = "longitude" + private const val KEY_XMP_SUBJECTS = "xmpSubjects" + private const val KEY_XMP_TITLE = "xmpTitle" + private const val KEY_RATING = "rating" + + private const val MASK_IS_ANIMATED = 1 shl 0 + private const val MASK_IS_FLIPPED = 1 shl 1 + private const val MASK_IS_GEOTIFF = 1 shl 2 + private const val MASK_IS_360 = 1 shl 3 + private const val MASK_IS_MULTIPAGE = 1 shl 4 + private const val MASK_IS_MOTION_PHOTO = 1 shl 5 + private const val MASK_IS_HDR = 1 shl 6 // for images: embedded HDR gainmap, for videos: HDR color transfer + private const val XMP_SUBJECTS_SEPARATOR = ";" + + // overlay metadata + private const val KEY_APERTURE = "aperture" + private const val KEY_DESCRIPTION = "description" + private const val KEY_EXPOSURE_TIME = "exposureTime" + private const val KEY_FOCAL_LENGTH = "focalLength" + private const val KEY_ISO = "iso" + + // additional media key + private const val KEY_HAS_EMBEDDED_PICTURE = "Has Embedded Picture" + + private const val HASH_FIELD_PREFIX = "hash" + private const val VALUE_SKIPPED_DATA = "[skipped]" + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/SecurityHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/SecurityHandler.kt new file mode 100644 index 0000000..1263ce7 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/SecurityHandler.kt @@ -0,0 +1,80 @@ +package deckers.thibault.aves.channel.calls + +import android.content.Context +import android.content.SharedPreferences +import androidx.core.content.edit +import androidx.security.crypto.EncryptedSharedPreferences +import androidx.security.crypto.MasterKey +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler + +class SecurityHandler(private val context: Context) : MethodCallHandler { + private var sharedPreferences: SharedPreferences? = null + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "writeValue" -> safe(call, result, ::writeValue) + "readValue" -> safe(call, result, ::readValue) + else -> result.notImplemented() + } + } + + private fun getStore(): SharedPreferences { + if (sharedPreferences == null) { + val mainKey = MasterKey.Builder(context) + .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) + .build() + sharedPreferences = EncryptedSharedPreferences.create( + context, + FILENAME, + mainKey, + EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, + EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM + ) + } + return sharedPreferences!! + } + + private fun writeValue(call: MethodCall, result: MethodChannel.Result) { + val key = call.argument("key") + val value = call.argument("value") + if (key == null) { + result.error("writeValue-args", "missing arguments", null) + return + } + + val preferences = getStore() + preferences.edit { + when (value) { + is Boolean -> putBoolean(key, value) + is Float -> putFloat(key, value) + is Int -> putInt(key, value) + is Long -> putLong(key, value) + is String -> putString(key, value) + null -> remove(key) + else -> { + result.error("writeValue-type", "unsupported type for value=$value", null) + return + } + } + } + result.success(true) + } + + private fun readValue(call: MethodCall, result: MethodChannel.Result) { + val key = call.argument("key") + if (key == null) { + result.error("readValue-args", "missing arguments", null) + return + } + + result.success(getStore().all[key]) + } + + companion object { + const val CHANNEL = "deckers.thibault/aves/security" + const val FILENAME = "secret_shared_prefs" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/StorageHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/StorageHandler.kt new file mode 100644 index 0000000..826a059 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/StorageHandler.kt @@ -0,0 +1,244 @@ +package deckers.thibault.aves.channel.calls + +import android.content.Context +import android.os.Build +import android.os.storage.StorageManager +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.utils.PermissionManager +import deckers.thibault.aves.utils.StorageUtils +import deckers.thibault.aves.utils.StorageUtils.getFolderSize +import deckers.thibault.aves.utils.StorageUtils.getVolumePaths +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import io.flutter.util.PathUtils +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import java.io.File + +class StorageHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "getDataUsage" -> ioScope.launch { safe(call, result, ::getDataUsage) } + "getStorageVolumes" -> ioScope.launch { safe(call, result, ::getStorageVolumes) } + "getCacheDirectory" -> ioScope.launch { safe(call, result, ::getCacheDirectory) } + "getUntrackedTrashPaths" -> ioScope.launch { safe(call, result, ::getUntrackedTrashPaths) } + "getUntrackedVaultPaths" -> ioScope.launch { safe(call, result, ::getUntrackedVaultPaths) } + "getVaultRoot" -> ioScope.launch { safe(call, result, ::getVaultRoot) } + "getFreeSpace" -> ioScope.launch { safe(call, result, ::getFreeSpace) } + "getGrantedDirectories" -> ioScope.launch { safe(call, result, ::getGrantedDirectories) } + "getInaccessibleDirectories" -> ioScope.launch { safe(call, result, ::getInaccessibleDirectories) } + "getRestrictedDirectories" -> ioScope.launch { safe(call, result, ::getRestrictedDirectories) } + "revokeDirectoryAccess" -> safe(call, result, ::revokeDirectoryAccess) + "deleteEmptyDirectories" -> ioScope.launch { safe(call, result, ::deleteEmptyDirectories) } + "deleteTempDirectory" -> ioScope.launch { safe(call, result, ::deleteTempDirectory) } + "deleteExternalCache" -> ioScope.launch { safe(call, result, ::deleteExternalCache) } + "canRequestMediaFileBulkAccess" -> safe(call, result, ::canRequestMediaFileBulkAccess) + "canInsertMedia" -> safe(call, result, ::canInsertMedia) + else -> result.notImplemented() + } + } + + private fun getDataUsage(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + var internalCache = getFolderSize(context.cacheDir) + internalCache += getFolderSize(context.codeCacheDir) + val externalCache = context.externalCacheDirs.sumOf(::getFolderSize) + val externalFilesDirs = context.getExternalFilesDirs(null) + val dataDir = context.dataDir + + val database = getFolderSize(File(dataDir, "databases")) + val flutter = getFolderSize(File(PathUtils.getDataDirectory(context))) + val vaults = getFolderSize(File(StorageUtils.getVaultRoot(context))) + val trash = externalFilesDirs.mapNotNull { StorageUtils.trashDirFor(context, it.path) }.sumOf(::getFolderSize) + + val internalData = getFolderSize(dataDir) - internalCache + val externalData = externalFilesDirs.sumOf(::getFolderSize) + val miscData = internalData + externalData - (database + flutter + vaults + trash) + + result.success( + hashMapOf( + "database" to database, + "flutter" to flutter, + "vaults" to vaults, + "trash" to trash, + "miscData" to miscData, + "internalCache" to internalCache, + "externalCache" to externalCache, + ) + ) + } + + private fun getStorageVolumes(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + val volumes = ArrayList>() + val sm = context.getSystemService(Context.STORAGE_SERVICE) as? StorageManager + if (sm != null) { + for (volumePath in getVolumePaths(context)) { + try { + sm.getStorageVolume(File(volumePath))?.let { + volumes.add( + hashMapOf( + "path" to volumePath, + "description" to it.getDescription(context), + "isPrimary" to it.isPrimary, + "isRemovable" to it.isRemovable, + "state" to it.state, + ) + ) + } + } catch (_: Exception) { + // ignore + } + } + } + result.success(volumes) + } + + private fun getCacheDirectory(call: MethodCall, result: MethodChannel.Result) { + val external = call.argument("external") + if (external == null) { + result.error("getCacheDirectory-args", "missing arguments", null) + return + } + + val dir = (if (external) context.externalCacheDir else context.cacheDir) + if (dir == null) { + result.error("getCacheDirectory-null", "context cache dir is null", null) + return + } + + result.success(dir.path) + } + + + private fun getUntrackedTrashPaths(call: MethodCall, result: MethodChannel.Result) { + val knownPaths = call.argument>("knownPaths") + if (knownPaths == null) { + result.error("getUntrackedTrashPaths-args", "missing arguments", null) + return + } + + val trashDirs = context.getExternalFilesDirs(null).filterNotNull().mapNotNull { StorageUtils.trashDirFor(context, it.path) } + val trashItemPaths = trashDirs.flatMap { dir -> dir.listFiles()?.filterNotNull()?.mapNotNull { file -> file.path } ?: listOf() } + val untrackedPaths = trashItemPaths.filterNot(knownPaths::contains).toList() + + result.success(untrackedPaths) + } + + private fun getUntrackedVaultPaths(call: MethodCall, result: MethodChannel.Result) { + val vault = call.argument("vault") + val knownPaths = call.argument>("knownPaths") + if (vault == null || knownPaths == null) { + result.error("getUntrackedVaultPaths-args", "missing arguments", null) + return + } + + val vaultDir = File(StorageUtils.getVaultRoot(context), vault) + val vaultItemPaths = vaultDir.listFiles()?.mapNotNull { file -> file?.path } ?: listOf() + val untrackedPaths = vaultItemPaths.filterNot(knownPaths::contains).toList() + + result.success(untrackedPaths) + } + + private fun getVaultRoot(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + result.success(StorageUtils.getVaultRoot(context)) + } + + private fun getFreeSpace(call: MethodCall, result: MethodChannel.Result) { + val path = call.argument("path") + if (path == null) { + result.error("getFreeSpace-args", "missing arguments", null) + return + } + + // `StorageStatsManager` `getFreeBytes()` is only available from API 26, + // and non-primary volume UUIDs cannot be used with it + val file = File(path) + try { + result.success(file.freeSpace) + } catch (e: SecurityException) { + result.error("getFreeSpace-security", "failed because of missing access", e.message) + } + } + + private fun getGrantedDirectories(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + result.success(ArrayList(PermissionManager.getGrantedDirs(context))) + } + + private fun getInaccessibleDirectories(call: MethodCall, result: MethodChannel.Result) { + val dirPaths = call.argument>("dirPaths") + if (dirPaths == null) { + result.error("getInaccessibleDirectories-args", "missing arguments", null) + return + } + + result.success(PermissionManager.getInaccessibleDirectories(context, dirPaths)) + } + + private fun getRestrictedDirectories(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + result.success(PermissionManager.getRestrictedDirectories(context)) + } + + private fun revokeDirectoryAccess(call: MethodCall, result: MethodChannel.Result) { + val path = call.argument("path") + if (path == null) { + result.error("revokeDirectoryAccess-args", "missing arguments", null) + return + } + + val success = PermissionManager.revokeDirectoryAccess(context, path) + result.success(success) + } + + private fun deleteEmptyDirectories(call: MethodCall, result: MethodChannel.Result) { + val dirPaths = call.argument>("dirPaths") + if (dirPaths == null) { + result.error("deleteEmptyDirectories-args", "missing arguments", null) + return + } + + var deleted = 0 + dirPaths.forEach { + try { + val dir = File(it) + if (dir.isDirectory && dir.listFiles()?.isEmpty() == true && dir.delete()) { + deleted++ + } + } catch (_: SecurityException) { + // ignore + } + } + result.success(deleted) + } + + private fun deleteTempDirectory(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + result.success(StorageUtils.deleteTempDirectory(context)) + } + + private fun deleteExternalCache(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + context.externalCacheDirs.filter { it.exists() }.forEach { it.deleteRecursively() } + result.success(true) + } + + private fun canRequestMediaFileBulkAccess(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + result.success(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) + } + + private fun canInsertMedia(call: MethodCall, result: MethodChannel.Result) { + val directories = call.argument>("directories") + if (directories == null) { + result.error("canInsertMedia-args", "missing arguments", null) + return + } + + result.success(PermissionManager.canInsertByMediaStore(directories)) + } + + companion object { + const val CHANNEL = "deckers.thibault/aves/storage" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/WallpaperHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/WallpaperHandler.kt new file mode 100644 index 0000000..19673c2 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/WallpaperHandler.kt @@ -0,0 +1,51 @@ +package deckers.thibault.aves.channel.calls + +import android.app.WallpaperManager +import android.app.WallpaperManager.FLAG_LOCK +import android.app.WallpaperManager.FLAG_SYSTEM +import android.content.ContextWrapper +import deckers.thibault.aves.channel.calls.Coresult.Companion.safe +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch + +class WallpaperHandler(private val contextWrapper: ContextWrapper) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "setWallpaper" -> ioScope.launch { safe(call, result, ::setWallpaper) } + else -> result.notImplemented() + } + } + + private fun setWallpaper(call: MethodCall, result: MethodChannel.Result) { + val bytes = call.argument("bytes") + val home = call.argument("home") + val lock = call.argument("lock") + if (bytes == null || home == null || lock == null) { + result.error("setWallpaper-args", "missing arguments", null) + return + } + + val manager = WallpaperManager.getInstance(contextWrapper) + if (!manager.isWallpaperSupported || !manager.isSetWallpaperAllowed) { + result.error("setWallpaper-unsupported", "failed because setting wallpaper is not allowed", null) + return + } + + bytes.inputStream().use { input -> + val flags = (if (home) FLAG_SYSTEM else 0) or (if (lock) FLAG_LOCK else 0) + manager.setStream(input, null, true, flags) + } + result.success(true) + } + + companion object { + const val CHANNEL = "deckers.thibault/aves/wallpaper" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ActivityWindowHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ActivityWindowHandler.kt new file mode 100644 index 0000000..eafb5d4 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ActivityWindowHandler.kt @@ -0,0 +1,209 @@ +package deckers.thibault.aves.channel.calls.window + +import android.app.Activity +import android.content.ClipData +import android.content.Context +import android.content.pm.ActivityInfo +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Matrix +import android.graphics.Matrix.ScaleToFit +import android.graphics.Point +import android.graphics.RectF +import android.os.Build +import android.util.Log +import android.view.View +import android.view.WindowManager +import androidx.core.graphics.createBitmap +import androidx.core.net.toUri +import deckers.thibault.aves.channel.calls.AppAdapterHandler.Companion.getShareableUri +import deckers.thibault.aves.utils.ContextUtils.devicePixelRatio +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.getDisplayCompat +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import java.nio.ByteBuffer +import kotlin.math.roundToInt + +class ActivityWindowHandler(private val activity: Activity) : WindowHandler(activity) { + override fun isActivity(call: MethodCall, result: MethodChannel.Result) { + result.success(true) + } + + private fun setWindowFlag(call: MethodCall, result: MethodChannel.Result, flag: Int) { + val on = call.argument("on") + if (on == null) { + result.error("keepOn-args", "missing arguments", null) + return + } + + val window = activity.window + val old = (window.attributes.flags and flag) != 0 + if (old != on) { + if (on) { + window.addFlags(flag) + } else { + window.clearFlags(flag) + } + } + result.success(null) + } + + override fun keepScreenOn(call: MethodCall, result: MethodChannel.Result) { + setWindowFlag(call, result, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } + + override fun secureScreen(call: MethodCall, result: MethodChannel.Result) { + setWindowFlag(call, result, WindowManager.LayoutParams.FLAG_SECURE) + } + + override fun isInMultiWindowMode(call: MethodCall, result: MethodChannel.Result) { + result.success(activity.isInMultiWindowMode) + } + + override fun isInPictureInPictureMode(call: MethodCall, result: MethodChannel.Result) { + result.success(activity.isInPictureInPictureMode) + } + + // display orientation in degrees + override fun getOrientation(call: MethodCall, result: MethodChannel.Result) { + val displayRotation = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + activity.display.rotation + } else { + val windowService = activity.getSystemService(Context.WINDOW_SERVICE) as WindowManager + @Suppress("deprecation") + windowService.defaultDisplay.rotation + } + result.success(displayRotation * 90) + } + + override fun requestOrientation(call: MethodCall, result: MethodChannel.Result) { + val orientation = call.argument("orientation") + if (orientation == null) { + result.error("requestOrientation-args", "missing arguments", null) + return + } + activity.requestedOrientation = orientation + result.success(true) + } + + override fun isCutoutAware(call: MethodCall, result: MethodChannel.Result) { + result.success(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) + } + + override fun getCutoutInsets(call: MethodCall, result: MethodChannel.Result) { + val safeInsetsDpi = getCutoutInsetsDpi(activity) + result.success( + hashMapOf( + "left" to safeInsetsDpi.left, + "top" to safeInsetsDpi.top, + "right" to safeInsetsDpi.right, + "bottom" to safeInsetsDpi.bottom, + ) + ) + } + + override fun supportsWideGamut(call: MethodCall, result: MethodChannel.Result) { + result.success(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && activity.resources.configuration.isScreenWideColorGamut) + } + + override fun supportsHdr(call: MethodCall, result: MethodChannel.Result) { + result.success(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && activity.resources.configuration.isScreenHdr) + } + + override fun setColorMode(call: MethodCall, result: MethodChannel.Result) { + val wideColorGamut = call.argument("wideColorGamut") + val hdr = call.argument("hdr") + if (wideColorGamut == null || hdr == null) { + result.error("setColorMode-args", "missing arguments", null) + return + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + activity.window.colorMode = if (hdr) { + ActivityInfo.COLOR_MODE_HDR + } else if (wideColorGamut) { + ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT + } else { + ActivityInfo.COLOR_MODE_DEFAULT + } + } + result.success(null) + } + + override fun startGlobalDrag(call: MethodCall, result: MethodChannel.Result) { + val uri = call.argument("uri")?.toUri() + val label = call.argument("label") + val shadowWidthDip = call.argument("shadowWidthDip")?.toFloat() + val shadowHeightDip = call.argument("shadowHeightDip")?.toFloat() + val shadowBytes = call.argument("shadowBytes") + + if (uri == null || shadowWidthDip == null || shadowHeightDip == null || shadowBytes == null) { + result.error("startGlobalDrag-args", "missing arguments", null) + return + } + + val clip = ClipData.newUri(activity.contentResolver, label, getShareableUri(activity, uri)) + + val density = activity.devicePixelRatio() + val widthPx = (shadowWidthDip * density).roundToInt() + val heightPx = (shadowHeightDip * density).roundToInt() + + val shadowBuilder: View.DragShadowBuilder = try { + val bitmap = createBitmap(widthPx, heightPx, Bitmap.Config.ARGB_8888).also { + it.copyPixelsFromBuffer(ByteBuffer.wrap(shadowBytes)) + } + + val scaleToFit = Matrix() + val src = RectF(0f, 0f, bitmap.getWidth().toFloat(), bitmap.getHeight().toFloat()) + val dst = RectF(0f, 0f, heightPx.toFloat(), heightPx.toFloat()) + scaleToFit.setRectToRect(src, dst, ScaleToFit.CENTER) + + object : View.DragShadowBuilder() { + override fun onProvideShadowMetrics(outShadowSize: Point, outShadowTouchPoint: Point) { + outShadowSize.set(widthPx, heightPx) + outShadowTouchPoint.set(outShadowSize.x / 2, outShadowSize.y / 2) + } + + override fun onDrawShadow(canvas: Canvas) { + canvas.drawBitmap(bitmap, scaleToFit, null) + } + } + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to draw widget", e) + View.DragShadowBuilder() + } + + activity.window.decorView.startDragAndDrop( + clip, + shadowBuilder, + null, + View.DRAG_FLAG_GLOBAL or View.DRAG_FLAG_GLOBAL_URI_READ + ) + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + + fun getCutoutInsetsDpi(activity: Activity): RectF { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val cutout = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + activity.getDisplayCompat()?.cutout + } else { + activity.window.decorView.rootWindowInsets.displayCutout + } + + if (cutout != null) { + val density = activity.devicePixelRatio() + return RectF( + cutout.safeInsetLeft / density, + cutout.safeInsetTop / density, + cutout.safeInsetRight / density, + cutout.safeInsetBottom / density + ) + } + } + return RectF() + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ServiceWindowHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ServiceWindowHandler.kt new file mode 100644 index 0000000..a82bb41 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ServiceWindowHandler.kt @@ -0,0 +1,59 @@ +package deckers.thibault.aves.channel.calls.window + +import android.app.Service +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +class ServiceWindowHandler(service: Service) : WindowHandler(service) { + override fun isActivity(call: MethodCall, result: MethodChannel.Result) { + result.success(false) + } + + override fun keepScreenOn(call: MethodCall, result: MethodChannel.Result) { + result.success(null) + } + + override fun secureScreen(call: MethodCall, result: MethodChannel.Result) { + result.success(null) + } + + override fun isInMultiWindowMode(call: MethodCall, result: MethodChannel.Result) { + result.success(false) + } + + override fun isInPictureInPictureMode(call: MethodCall, result: MethodChannel.Result) { + result.success(false) + } + + override fun getOrientation(call: MethodCall, result: MethodChannel.Result) { + result.success(0) + } + + override fun requestOrientation(call: MethodCall, result: MethodChannel.Result) { + result.success(false) + } + + override fun isCutoutAware(call: MethodCall, result: MethodChannel.Result) { + result.success(false) + } + + override fun getCutoutInsets(call: MethodCall, result: MethodChannel.Result) { + result.success(HashMap()) + } + + override fun supportsWideGamut(call: MethodCall, result: MethodChannel.Result) { + result.success(false) + } + + override fun supportsHdr(call: MethodCall, result: MethodChannel.Result) { + result.success(false) + } + + override fun setColorMode(call: MethodCall, result: MethodChannel.Result) { + result.success(null) + } + + override fun startGlobalDrag(call: MethodCall, result: MethodChannel.Result) { + result.success(null) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/WindowHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/WindowHandler.kt new file mode 100644 index 0000000..9b7bba8 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/WindowHandler.kt @@ -0,0 +1,72 @@ +package deckers.thibault.aves.channel.calls.window + +import android.content.ContextWrapper +import android.provider.Settings +import android.util.Log +import deckers.thibault.aves.channel.calls.Coresult +import deckers.thibault.aves.utils.LogUtils +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +abstract class WindowHandler(private val contextWrapper: ContextWrapper) : MethodChannel.MethodCallHandler { + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "isActivity" -> Coresult.safe(call, result, ::isActivity) + "keepScreenOn" -> Coresult.safe(call, result, ::keepScreenOn) + "secureScreen" -> Coresult.safe(call, result, ::secureScreen) + "isInMultiWindowMode" -> Coresult.safe(call, result, ::isInMultiWindowMode) + "isInPictureInPictureMode" -> Coresult.safe(call, result, ::isInPictureInPictureMode) + "isRotationLocked" -> Coresult.safe(call, result, ::isRotationLocked) + "getOrientation" -> Coresult.safe(call, result, ::getOrientation) + "requestOrientation" -> Coresult.safe(call, result, ::requestOrientation) + "isCutoutAware" -> Coresult.safe(call, result, ::isCutoutAware) + "getCutoutInsets" -> Coresult.safe(call, result, ::getCutoutInsets) + "supportsWideGamut" -> Coresult.safe(call, result, ::supportsWideGamut) + "supportsHdr" -> Coresult.safe(call, result, ::supportsHdr) + "setColorMode" -> Coresult.safe(call, result, ::setColorMode) + "startGlobalDrag" -> Coresult.safe(call, result, ::startGlobalDrag) + else -> result.notImplemented() + } + } + + abstract fun isActivity(call: MethodCall, result: MethodChannel.Result) + + abstract fun keepScreenOn(call: MethodCall, result: MethodChannel.Result) + + abstract fun secureScreen(call: MethodCall, result: MethodChannel.Result) + + abstract fun isInMultiWindowMode(call: MethodCall, result: MethodChannel.Result) + + abstract fun isInPictureInPictureMode(call: MethodCall, result: MethodChannel.Result) + + private fun isRotationLocked(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + var locked = false + try { + locked = Settings.System.getInt(contextWrapper.contentResolver, Settings.System.ACCELEROMETER_ROTATION) == 0 + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get settings with error=${e.message}", null) + } + result.success(locked) + } + + abstract fun getOrientation(call: MethodCall, result: MethodChannel.Result) + + abstract fun requestOrientation(call: MethodCall, result: MethodChannel.Result) + + abstract fun isCutoutAware(call: MethodCall, result: MethodChannel.Result) + + abstract fun getCutoutInsets(call: MethodCall, result: MethodChannel.Result) + + abstract fun supportsWideGamut(call: MethodCall, result: MethodChannel.Result) + + abstract fun supportsHdr(call: MethodCall, result: MethodChannel.Result) + + abstract fun setColorMode(call: MethodCall, result: MethodChannel.Result) + + abstract fun startGlobalDrag(call: MethodCall, result: MethodChannel.Result) + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/window" + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/BaseStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/BaseStreamHandler.kt new file mode 100644 index 0000000..7735b6d --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/BaseStreamHandler.kt @@ -0,0 +1,108 @@ +package deckers.thibault.aves.channel.streams + +import android.os.Handler +import android.os.Looper +import android.util.Log +import deckers.thibault.aves.utils.MemoryUtils +import io.flutter.plugin.common.EventChannel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import java.io.InputStream + +abstract class BaseStreamHandler : EventChannel.StreamHandler { + val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + // cannot use `lateinit` because we cannot guarantee + // its initialization in `onListen` at the right time + // e.g. when resuming the app after the activity got destroyed + private var eventSink: EventChannel.EventSink? = null + private var handler: Handler? = null + + override fun onListen(arguments: Any?, eventSink: EventChannel.EventSink) { + this.eventSink = eventSink + handler = Handler(Looper.getMainLooper()) + onCall(arguments) + } + + override fun onCancel(arguments: Any?) { + // nothing + } + + open fun success(event: Any?) { + handler?.post { + try { + eventSink?.success(event) + } catch (e: Exception) { + Log.w(logTag, "failed to use event sink", e) + } + } + } + + open fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) { + handler?.post { + try { + eventSink?.error(errorCode, errorMessage, errorDetails) + } catch (e: Exception) { + Log.w(logTag, "failed to use event sink", e) + } + } + } + + open fun endOfStream() { + handler?.post { + try { + eventSink?.endOfStream() + } catch (e: Exception) { + Log.w(logTag, "failed to use event sink", e) + } + } + } + + fun streamBytes(inputStream: InputStream): Boolean { + val buffer = ByteArray(BUFFER_SIZE) + var len: Int + while (inputStream.read(buffer).also { len = it } != -1) { + // cannot decode image on Flutter side when using `buffer` directly + if (MemoryUtils.canAllocate(len)) { + success(buffer.copyOf(len)) + } else { + error("streamBytes-memory", "not enough memory to allocate $len bytes", null) + return false + } + } + return true + } + + fun safe(function: () -> Unit, closeStream: Boolean = true) { + try { + function() + } catch (e: Exception) { + error("safe-exception", e.message, e.stackTraceToString()) + } + if (closeStream) { + endOfStream() + } + } + + suspend fun safeSuspend(function: suspend () -> Unit, closeStream: Boolean = true) { + try { + function() + } catch (e: Exception) { + error("safeSuspend-exception", e.message, e.stackTraceToString()) + } + if (closeStream) { + endOfStream() + } + } + + abstract val logTag: String + + open fun onCall(args: Any?) { + // nothing by default + } + + companion object { + const val BUFFER_SIZE = 1 shl 18 // 256kB + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/ActivityResultStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/ActivityResultStreamHandler.kt new file mode 100644 index 0000000..3f247f1 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/ActivityResultStreamHandler.kt @@ -0,0 +1,284 @@ +package deckers.thibault.aves.channel.streams.darttoplatform + +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.util.Log +import androidx.core.net.toUri +import deckers.thibault.aves.MainActivity +import deckers.thibault.aves.PendingStorageAccessResultHandler +import deckers.thibault.aves.channel.calls.AppAdapterHandler +import deckers.thibault.aves.channel.streams.BaseStreamHandler +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.PermissionManager +import deckers.thibault.aves.utils.StorageUtils +import deckers.thibault.aves.utils.StorageUtils.ensureTrailingSeparator +import kotlinx.coroutines.launch + +// starting activity to get a result (e.g. storage access via native dialog) +// breaks the regular `MethodChannel` so we use a stream channel instead +class ActivityResultStreamHandler(private val activity: Activity, arguments: Any?) : BaseStreamHandler() { + private var op: String? = null + private lateinit var args: Map<*, *> + + init { + if (arguments is Map<*, *>) { + op = arguments["op"] as String? + args = arguments + } + } + + override val logTag = LOG_TAG + + override fun onCall(args: Any?) { + // do not automatically close stream when launching activity, + // as it will be closed when getting that activity result + val closeStream = false + when (op) { + "requestDirectoryAccess" -> ioScope.launch { safe(::requestDirectoryAccess, closeStream) } + "requestMediaFileAccess" -> ioScope.launch { safe(::requestMediaFileAccess, closeStream) } + "createFile" -> ioScope.launch { safe(::createFile, closeStream) } + "openFile" -> ioScope.launch { safe(::openFile, closeStream) } + "copyFile" -> ioScope.launch { safe(::copyFile, closeStream) } + "edit" -> safe(::edit, closeStream) + "pickCollectionFilters" -> safe(::pickCollectionFilters, closeStream) + else -> endOfStream() + } + } + + override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) { + super.error(errorCode, errorMessage, errorDetails) + endOfStream() + } + + private fun requestDirectoryAccess() { + val path = args["path"] as String? + if (path == null) { + error("requestDirectoryAccess-args", "missing arguments", null) + return + } + + PermissionManager.requestDirectoryAccess(activity, ensureTrailingSeparator(path), { + success(true) + endOfStream() + }, { + success(false) + endOfStream() + }) + } + + private fun requestMediaFileAccess() { + val uris = (args["uris"] as List<*>?)?.mapNotNull { if (it is String) it.toUri() else null } + val mimeTypes = (args["mimeTypes"] as List<*>?)?.mapNotNull { it as? String } + if (uris.isNullOrEmpty() || mimeTypes == null || mimeTypes.size != uris.size) { + error("requestMediaFileAccess-args", "missing arguments", null) + return + } + + if (uris.any { !StorageUtils.isMediaStoreContentUri(it) }) { + error("requestMediaFileAccess-nonmediastore", "request is only valid for Media Store content URIs, uris=$uris", null) + return + } + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + error("requestMediaFileAccess-unsupported", "media file bulk access is not allowed before Android 11", null) + return + } + + try { + val granted = PermissionManager.requestMediaFileAccess(activity, uris, mimeTypes) + success(granted) + endOfStream() + } catch (e: Exception) { + val byFromMediaStore = uris.groupBy { uri -> uri.toString().startsWith("content://media/") } + error( + "requestMediaFileAccess-request", "failed to request access to ${uris.size} uris" + + " (${byFromMediaStore[true]?.size ?: 0} from media store" + + ", ${byFromMediaStore[false]?.size ?: 0} others=${byFromMediaStore[false]}" + + ")", e.message + ) + } + } + + private fun safeStartActivityForStorageAccessResult(intent: Intent, requestCode: Int, onGranted: (uri: Uri) -> Unit, onDenied: () -> Unit) { + if (intent.resolveActivity(activity.packageManager) != null) { + MainActivity.pendingStorageAccessResultHandlers[requestCode] = PendingStorageAccessResultHandler(null, onGranted, onDenied) + if (!safeStartActivityForResult(intent, requestCode)) { + MainActivity.notifyError("failed to start activity for intent=$intent extras=${intent.extras}") + onDenied() + } + } else { + MainActivity.notifyError("failed to resolve activity for intent=$intent extras=${intent.extras}") + onDenied() + } + } + + private fun createFile() { + val name = args["name"] as String? + val mimeType = args["mimeType"] as String? + val bytes = args["bytes"] as ByteArray? + if (name == null || mimeType == null || bytes == null) { + error("createFile-args", "missing arguments", null) + return + } + + fun onGranted(uri: Uri) { + ioScope.launch { + try { + // truncate is necessary when overwriting a longer file + activity.contentResolver.openOutputStream(uri, "wt")?.use { output -> + output.write(bytes) + } + success(true) + endOfStream() + } catch (e: Exception) { + error("createFile-write", "failed to write file at uri=$uri", e.message) + } + } + } + + fun onDenied() { + success(null) + endOfStream() + } + + val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = mimeType + putExtra(Intent.EXTRA_TITLE, name) + } + safeStartActivityForStorageAccessResult(intent, MainActivity.CREATE_FILE_REQUEST, ::onGranted, ::onDenied) + } + + private fun openFile() { + val mimeType = args["mimeType"] as String? // optional + + fun onGranted(uri: Uri) { + ioScope.launch { + try { + activity.contentResolver.openInputStream(uri)?.use(::streamBytes) + endOfStream() + } catch (e: Exception) { + error("openFile-read", "failed to read file at uri=$uri", e.message) + } + } + } + + fun onDenied() { + success(ByteArray(0)) + endOfStream() + } + + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + setTypeAndNormalize(mimeType ?: MimeTypes.ANY) + } + safeStartActivityForStorageAccessResult(intent, MainActivity.OPEN_FILE_REQUEST, ::onGranted, ::onDenied) + } + + private fun copyFile() { + val name = args["name"] as String? + val mimeType = args["mimeType"] as String? + val sourceUri = (args["sourceUri"] as String?)?.toUri() + if (name == null || mimeType == null || sourceUri == null) { + error("copyFile-args", "missing arguments", null) + return + } + + fun onGranted(uri: Uri) { + ioScope.launch { + try { + StorageUtils.openInputStream(activity, sourceUri)?.use { input -> + // truncate is necessary when overwriting a longer file + activity.contentResolver.openOutputStream(uri, "wt")?.use { output -> + val buffer = ByteArray(BUFFER_SIZE) + var len: Int + while (input.read(buffer).also { len = it } != -1) { + output.write(buffer, 0, len) + } + } + } + success(true) + endOfStream() + } catch (e: Exception) { + error("copyFile-write", "failed to copy file from sourceUri=$sourceUri to uri=$uri", e.message) + } + } + } + + fun onDenied() { + success(null) + endOfStream() + } + + val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = mimeType + putExtra(Intent.EXTRA_TITLE, name) + } + safeStartActivityForStorageAccessResult(intent, MainActivity.CREATE_FILE_REQUEST, ::onGranted, ::onDenied) + } + + private fun edit() { + val uri = args["uri"] as String? + val mimeType = args["mimeType"] as String? // optional + if (uri == null) { + error("edit-args", "missing arguments", null) + return + } + + val intent = Intent(Intent.ACTION_EDIT) + .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + .setDataAndType(AppAdapterHandler.getShareableUri(activity, uri.toUri()), mimeType) + + if (intent.resolveActivity(activity.packageManager) == null) { + error("edit-resolve", "cannot resolve activity for this intent for uri=$uri mimeType=$mimeType", null) + return + } + + MainActivity.pendingEditIntentHandler = { fields -> + success(fields) + endOfStream() + } + if (!safeStartActivityForResult(intent, MainActivity.EDIT_REQUEST)) { + error("edit-start", "cannot start activity for this intent for uri=$uri mimeType=$mimeType", null) + } + } + + private fun pickCollectionFilters() { + val initialFilters = (args["initialFilters"] as? List<*>)?.mapNotNull { it as? String } ?: listOf() + val intent = Intent(MainActivity.INTENT_ACTION_PICK_COLLECTION_FILTERS, null, activity, MainActivity::class.java) + .putExtra(MainActivity.EXTRA_KEY_FILTERS_ARRAY, initialFilters.toTypedArray()) + .putExtra(MainActivity.EXTRA_KEY_FILTERS_STRING, initialFilters.joinToString(MainActivity.EXTRA_STRING_ARRAY_SEPARATOR)) + MainActivity.pendingCollectionFilterPickHandler = { filters -> + success(filters) + endOfStream() + } + activity.startActivityForResult(intent, MainActivity.PICK_COLLECTION_FILTERS_REQUEST) + } + + private fun safeStartActivityForResult(intent: Intent, requestCode: Int): Boolean { + return try { + activity.startActivityForResult(intent, requestCode) + true + } catch (_: SecurityException) { + if (intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION != 0) { + // in some environments, providing the write flag yields a `SecurityException`: + // "UID XXXX does not have permission to content://XXXX" + // so we retry without it + Log.i(LOG_TAG, "retry intent=$intent without FLAG_GRANT_WRITE_URI_PERMISSION") + intent.flags = intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION.inv() + safeStartActivityForResult(intent, requestCode) + } else { + false + } + } + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/activity_result_stream" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/ImageByteStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/ImageByteStreamHandler.kt new file mode 100644 index 0000000..8633f0c --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/ImageByteStreamHandler.kt @@ -0,0 +1,277 @@ +package deckers.thibault.aves.channel.streams.darttoplatform + +import android.content.Context +import android.graphics.Rect +import android.net.Uri +import androidx.core.net.toUri +import com.bumptech.glide.Glide +import deckers.thibault.aves.channel.streams.BaseStreamHandler +import deckers.thibault.aves.decoding.RegionFetcher +import deckers.thibault.aves.decoding.SvgRegionFetcher +import deckers.thibault.aves.decoding.ThumbnailFetcher +import deckers.thibault.aves.decoding.TiffRegionFetcher +import deckers.thibault.aves.glide.AvesAppGlideModule +import deckers.thibault.aves.model.EntryFields +import deckers.thibault.aves.utils.BitmapUtils +import deckers.thibault.aves.utils.BitmapUtils.applyExifOrientation +import deckers.thibault.aves.utils.ContextUtils.devicePixelRatio +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.MimeTypes.handleEncodedBytesInFlutter +import deckers.thibault.aves.utils.MimeTypes.isVideo +import deckers.thibault.aves.utils.MimeTypes.needRotationAfterGlide +import deckers.thibault.aves.utils.StorageUtils +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.ByteArrayInputStream +import java.io.InputStream +import java.util.Date +import kotlin.math.roundToInt + +class ImageByteStreamHandler(private val context: Context, private val arguments: Any?) : BaseStreamHandler(), ByteSink { + private var op: String? = null + private var decoded: Boolean = false + private val regionFetcher = RegionFetcher(context) + private val density = context.devicePixelRatio() + + init { + if (arguments is Map<*, *>) { + op = arguments["op"] as String? + decoded = arguments["decoded"] as Boolean + } + } + + override val logTag = LOG_TAG + + override fun onCall(args: Any?) { + when (op) { + "getFullImage" -> ioScope.launch { safeSuspend(::streamFullImage) } + "getRegion" -> ioScope.launch { safeSuspend(::streamRegion) } + "getThumbnail" -> ioScope.launch { safeSuspend(::streamThumbnail) } + else -> endOfStream() + } + } + + // Supported image formats: + // - Flutter (as of v1.20): JPEG, PNG, GIF, Animated GIF, WebP, Animated WebP, BMP, and WBMP + // - Android: https://developer.android.com/guide/topics/media/media-formats#image-formats + // - Glide: https://github.com/bumptech/glide/blob/master/library/src/main/java/com/bumptech/glide/load/ImageHeaderParser.java + private suspend fun streamFullImage() { + if (arguments !is Map<*, *>) { + return + } + + val uri = (arguments["uri"] as String?)?.toUri() + val pageId = arguments["pageId"] as Int? + val mimeType = arguments["mimeType"] as String? + val sizeBytes = (arguments["sizeBytes"] as Number?)?.toLong() + val rotationDegrees = arguments["rotationDegrees"] as Int + val isFlipped = arguments["isFlipped"] as Boolean + + if (mimeType == null || uri == null) { + error("streamImage-args", "missing arguments", null) + return + } + + if (!decoded && handleEncodedBytesInFlutter(mimeType)) { + // the image can be decoded by Flutter codecs, + // and there is no need for processing on the platform side + // so we stream it without decoding it + streamOriginalBytesWithTrailer(uri, mimeType) + } else if (isVideo(mimeType)) { + streamVideoByGlide( + uri = uri, + mimeType = mimeType, + sizeBytes = sizeBytes, + decoded = decoded, + ) + } else { + // even if the image could be decoded by Flutter codecs, + // it needs to be processed on the platform side + // so we decode, process, optionally reencode, then stream it + streamImageByGlide( + uri = uri, + pageId = pageId, + mimeType = mimeType, + sizeBytes = sizeBytes, + rotationDegrees = rotationDegrees, + isFlipped = isFlipped, + decoded = decoded, + ) + } + } + + private fun streamOriginalBytesWithTrailer(uri: Uri, mimeType: String) { + try { + val sent = StorageUtils.openInputStream(context, uri)?.use(::streamBytes) + if (sent ?: false) { + success(BitmapUtils.FORMAT_BYTE_ENCODED_AS_BYTES) + } + } catch (e: Exception) { + error("streamImage-image-read-exception", "failed to get image for mimeType=$mimeType uri=$uri", e.stackTraceToString()) + } + } + + private suspend fun streamImageByGlide( + uri: Uri, + pageId: Int?, + mimeType: String, + sizeBytes: Long?, + rotationDegrees: Int, + isFlipped: Boolean, + decoded: Boolean, + ) { + val target = Glide.with(context) + .asBitmap() + .apply(AvesAppGlideModule.uncachedFullImageOptions) + .load(AvesAppGlideModule.getModel(context, uri, mimeType, pageId, sizeBytes)) + .submit() + try { + var bitmap = withContext(Dispatchers.IO) { target.get() } + if (needRotationAfterGlide(mimeType, pageId)) { + bitmap = applyExifOrientation(context, bitmap, rotationDegrees, isFlipped) + } + if (bitmap != null) { + // do not recycle bitmaps fetched from Glide as their lifecycle is unknown + val bytes = BitmapUtils.getBytes(bitmap, recycle = false, decoded = decoded, mimeType) + streamBytes(ByteArrayInputStream(bytes)) + } else { + error("streamImage-image-decode-null", "failed to get image for mimeType=$mimeType uri=$uri", null) + } + } catch (e: Exception) { + error("streamImage-image-decode-exception", "failed to get image for mimeType=$mimeType uri=$uri", e.stackTraceToString()) + } finally { + Glide.with(context).clear(target) + } + } + + private suspend fun streamVideoByGlide(uri: Uri, mimeType: String, sizeBytes: Long?, decoded: Boolean) { + val target = Glide.with(context) + .asBitmap() + .apply(AvesAppGlideModule.uncachedFullImageOptions) + .load(AvesAppGlideModule.getModel(context, uri, mimeType, null, sizeBytes)) + .submit() + try { + val bitmap = withContext(Dispatchers.IO) { target.get() } + if (bitmap != null) { + // do not recycle bitmaps fetched from Glide as their lifecycle is unknown + val bytes = BitmapUtils.getBytes(bitmap, recycle = false, decoded = decoded, mimeType) + streamBytes(ByteArrayInputStream(bytes)) + } else { + error("streamImage-video-null", "failed to get image for mimeType=$mimeType uri=$uri", null) + } + } catch (e: Exception) { + error("streamImage-video-exception", "failed to get image for mimeType=$mimeType uri=$uri", e.stackTraceToString()) + } finally { + Glide.with(context).clear(target) + } + } + + private suspend fun streamRegion() { + if (arguments !is Map<*, *>) { + return + } + + val uri = (arguments["uri"] as String?)?.toUri() + val pageId = arguments["pageId"] as Int? + val mimeType = arguments["mimeType"] as String? + val sizeBytes = (arguments["sizeBytes"] as Number?)?.toLong() + val sampleSize = arguments["sampleSize"] as Int? + val x = arguments["regionX"] as Int? + val y = arguments["regionY"] as Int? + val width = arguments["regionWidth"] as Int? + val height = arguments["regionHeight"] as Int? + val imageWidth = arguments["imageWidth"] as Int? + val imageHeight = arguments["imageHeight"] as Int? + + if (uri == null || mimeType == null || sampleSize == null || x == null || y == null || width == null || height == null || imageWidth == null || imageHeight == null) { + error("getRegion-args", "missing arguments", null) + return + } + + val regionRect = Rect(x, y, x + width, y + height) + when (mimeType) { + MimeTypes.SVG -> SvgRegionFetcher(context).fetch( + uri = uri, + decoded = decoded, + sizeBytes = sizeBytes, + scale = sampleSize, + regionRect = regionRect, + imageWidth = imageWidth, + imageHeight = imageHeight, + result = this, + ) + + MimeTypes.TIFF -> TiffRegionFetcher(context).fetch( + uri = uri, + page = pageId ?: 0, + decoded = decoded, + sampleSize = sampleSize, + regionRect = regionRect, + result = this, + ) + + else -> regionFetcher.fetch( + uri = uri, + pageId = pageId, + decoded = decoded, + mimeType = mimeType, + sampleSize = sampleSize, + regionRect = regionRect, + imageWidth = imageWidth, + imageHeight = imageHeight, + result = this, + ) + } + } + + private suspend fun streamThumbnail() { + if (arguments !is Map<*, *>) { + return + } + + val uri = arguments[EntryFields.URI] as String? + val pageId = arguments["pageId"] as Int? + val mimeType = arguments[EntryFields.MIME_TYPE] as String? + val dateModifiedMillis = (arguments[EntryFields.DATE_MODIFIED_MILLIS] as Number?)?.toLong() + val rotationDegrees = arguments[EntryFields.ROTATION_DEGREES] as Int? + val isFlipped = arguments[EntryFields.IS_FLIPPED] as Boolean? + val widthDip = (arguments["widthDip"] as Number?)?.toDouble() + val heightDip = (arguments["heightDip"] as Number?)?.toDouble() + val defaultSizeDip = (arguments["defaultSizeDip"] as Number?)?.toDouble() + val quality = arguments["quality"] as Int? + + if (uri == null || mimeType == null || rotationDegrees == null || isFlipped == null || widthDip == null || heightDip == null || defaultSizeDip == null || quality == null) { + error("getThumbnail-args", "missing arguments", null) + return + } + + // convert DIP to physical pixels here, instead of using `devicePixelRatio` in Flutter + ThumbnailFetcher( + context = context, + uri = uri, + pageId = pageId, + decoded = decoded, + mimeType = mimeType, + dateModifiedMillis = dateModifiedMillis ?: (Date().time), + rotationDegrees = rotationDegrees, + isFlipped = isFlipped, + width = (widthDip * density).roundToInt(), + height = (heightDip * density).roundToInt(), + defaultSize = (defaultSizeDip * density).roundToInt(), + quality = quality, + result = this, + ).fetch() + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/media_byte_stream" + } +} + +interface ByteSink { + fun streamBytes(inputStream: InputStream): Boolean + fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/ImageOpStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/ImageOpStreamHandler.kt new file mode 100644 index 0000000..bc2f36d --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/ImageOpStreamHandler.kt @@ -0,0 +1,221 @@ +package deckers.thibault.aves.channel.streams.darttoplatform + +import android.app.Activity +import android.util.Log +import androidx.core.net.toUri +import deckers.thibault.aves.channel.calls.MediaEditHandler.Companion.cancelledOps +import deckers.thibault.aves.channel.streams.BaseStreamHandler +import deckers.thibault.aves.model.AvesEntry +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.model.NameConflictStrategy +import deckers.thibault.aves.model.provider.ImageProvider.ImageOpCallback +import deckers.thibault.aves.model.provider.ImageProviderFactory.getProvider +import deckers.thibault.aves.model.provider.MediaStoreImageProvider +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.StorageUtils +import deckers.thibault.aves.utils.StorageUtils.ensureTrailingSeparator +import kotlinx.coroutines.launch + +class ImageOpStreamHandler(private val activity: Activity, private val arguments: Any?) : BaseStreamHandler() { + private var op: String? = null + private var opId: String? = null + private val entryMapList = ArrayList() + + init { + if (arguments is Map<*, *>) { + op = arguments["op"] as String? + opId = arguments["id"] as String? + @Suppress("unchecked_cast") + val rawEntries = arguments["entries"] as List? + if (rawEntries != null) { + entryMapList.addAll(rawEntries) + } + } + } + + override val logTag = LOG_TAG + + override fun onCall(args: Any?) { + when (op) { + "delete" -> ioScope.launch { safe(::delete) } + "convert" -> ioScope.launch { safeSuspend(::convert) } + "move" -> ioScope.launch { safeSuspend(::move) } + "rename" -> ioScope.launch { safeSuspend(::rename) } + else -> endOfStream() + } + } + + override fun endOfStream() { + cancelledOps.remove(opId) + super.endOfStream() + } + + private fun isCancelledOp() = cancelledOps.contains(opId) + + private fun delete() { + val entries = entryMapList.map(::AvesEntry) + for (entry in entries) { + val mimeType = entry.mimeType + val trashed = entry.trashed + + val uri = entry.uri + val path = if (trashed) entry.trashPath else entry.path + + val result: FieldMap = hashMapOf( + "uri" to uri.toString(), + ) + if (isCancelledOp()) { + result["skipped"] = true + } else { + result["success"] = false + getProvider(activity, uri)?.let { provider -> + try { + provider.delete(activity, uri, path, mimeType) + result["success"] = true + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to delete entry with path=$path", e) + } + } + } + success(result) + } + endOfStream() + } + + private suspend fun convert() { + if (arguments !is Map<*, *> || entryMapList.isEmpty()) { + endOfStream() + return + } + + var destinationDir = arguments["destinationPath"] as String? + val mimeType = arguments["mimeType"] as String? + val quality = (arguments["quality"] as Number?)?.toInt() + val lengthUnit = arguments["lengthUnit"] as String? + val width = (arguments["width"] as Number?)?.toInt() + val height = (arguments["height"] as Number?)?.toInt() + val writeMetadata = arguments["writeMetadata"] as Boolean? + val nameConflictStrategy = NameConflictStrategy.get(arguments["nameConflictStrategy"] as String?) + if (destinationDir == null || mimeType == null || quality == null || lengthUnit == null || width == null || height == null || writeMetadata == null || nameConflictStrategy == null) { + error("convert-args", "missing arguments", null) + return + } + + // assume same provider for all entries + val firstEntry = entryMapList.first() + val provider = (firstEntry["uri"] as String?)?.toUri()?.let { getProvider(activity, it) } + if (provider == null) { + error("convert-provider", "failed to find provider for entry=$firstEntry", null) + return + } + + destinationDir = ensureTrailingSeparator(destinationDir) + val entries = entryMapList.map(::AvesEntry) + provider.convertMultiple( + activity = activity, + imageExportMimeType = mimeType, + targetDir = destinationDir, + entries = entries, + quality = quality, + lengthUnit = lengthUnit, + width = width, + height = height, + writeMetadata = writeMetadata, + nameConflictStrategy = nameConflictStrategy, + callback = object : ImageOpCallback { + override fun onSuccess(fields: FieldMap) = success(fields) + override fun onFailure(throwable: Throwable) = error("convert-failure", "failed to convert entries", throwable) + }, + ) + endOfStream() + } + + private suspend fun move() { + if (arguments !is Map<*, *>) { + endOfStream() + return + } + + val copy = arguments["copy"] as Boolean? + val nameConflictStrategy = NameConflictStrategy.get(arguments["nameConflictStrategy"] as String?) + val rawEntryMap = arguments["entriesByDestination"] as Map<*, *>? + if (copy == null || nameConflictStrategy == null || rawEntryMap.isNullOrEmpty()) { + error("move-args", "missing arguments", null) + return + } + + val entriesByTargetDir = HashMap>() + rawEntryMap.forEach { + var destinationDir = it.key as String + if (destinationDir != StorageUtils.TRASH_PATH_PLACEHOLDER) { + destinationDir = ensureTrailingSeparator(destinationDir) + } + @Suppress("unchecked_cast") + val rawEntries = it.value as List + entriesByTargetDir[destinationDir] = rawEntries.map(::AvesEntry) + } + + // always use Media Store (as we move from or to it) + val provider = MediaStoreImageProvider() + + provider.moveMultiple( + activity = activity, + copy = copy, + nameConflictStrategy = nameConflictStrategy, + entriesByTargetDir = entriesByTargetDir, + isCancelledOp = ::isCancelledOp, + callback = object : ImageOpCallback { + override fun onSuccess(fields: FieldMap) = success(fields) + override fun onFailure(throwable: Throwable) = error("move-failure", "failed to move entries", throwable) + }, + ) + endOfStream() + } + + private suspend fun rename() { + if (arguments !is Map<*, *>) { + endOfStream() + return + } + + val rawEntryMap = arguments["entriesToNewName"] as Map<*, *>? + if (rawEntryMap.isNullOrEmpty()) { + error("rename-args", "missing arguments", null) + return + } + + val entriesToNewName = HashMap() + rawEntryMap.forEach { + @Suppress("unchecked_cast") + val rawEntry = it.key as FieldMap + val newName = it.value as String + entriesToNewName[AvesEntry(rawEntry)] = newName + } + + val byProvider = entriesToNewName.entries.groupBy { kv -> getProvider(activity, kv.key.uri) } + for ((provider, entryList) in byProvider) { + if (provider == null) { + error("rename-provider", "failed to find provider for entry=${entryList.firstOrNull()}", null) + return + } + + val entryMap = mapOf(*entryList.map { Pair(it.key, it.value) }.toTypedArray()) + provider.renameMultiple( + activity = activity, + entriesToNewName = entryMap, + isCancelledOp = ::isCancelledOp, + callback = object : ImageOpCallback { + override fun onSuccess(fields: FieldMap) = success(fields) + override fun onFailure(throwable: Throwable) = error("rename-failure", "failed to rename", throwable.message) + }, + ) + } + + endOfStream() + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/media_op_stream" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/MediaStoreStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/MediaStoreStreamHandler.kt new file mode 100644 index 0000000..da05c38 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/MediaStoreStreamHandler.kt @@ -0,0 +1,36 @@ +package deckers.thibault.aves.channel.streams.darttoplatform + +import android.content.Context +import deckers.thibault.aves.channel.streams.BaseStreamHandler +import deckers.thibault.aves.model.provider.MediaStoreImageProvider +import deckers.thibault.aves.utils.LogUtils +import kotlinx.coroutines.launch + +class MediaStoreStreamHandler(private val context: Context, arguments: Any?) : BaseStreamHandler() { + // knownEntries: map of contentId -> dateModifiedMillis + private var knownEntries: Map? = null + private var directory: String? = null + + init { + if (arguments is Map<*, *>) { + knownEntries = (arguments["knownEntries"] as? Map<*, *>?)?.map { (it.key as Number?)?.toLong() to (it.value as Number?)?.toLong() }?.toMap() + directory = arguments["directory"] as String? + } + } + + override val logTag = LOG_TAG + + override fun onCall(args: Any?) { + ioScope.launch { safe(::fetchAll) } + } + + private fun fetchAll() { + MediaStoreImageProvider().fetchAll(context, knownEntries ?: emptyMap(), directory) { success(it) } + endOfStream() + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/media_store_stream" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/AnalysisStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/AnalysisStreamHandler.kt new file mode 100644 index 0000000..92271f4 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/AnalysisStreamHandler.kt @@ -0,0 +1,15 @@ +package deckers.thibault.aves.channel.streams.platformtodart + +import deckers.thibault.aves.channel.streams.BaseStreamHandler +import deckers.thibault.aves.utils.LogUtils + +class AnalysisStreamHandler : BaseStreamHandler() { + fun notifyCompletion() = success(true) + + override val logTag = LOG_TAG + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/analysis_events" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/ErrorStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/ErrorStreamHandler.kt new file mode 100644 index 0000000..b71b642 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/ErrorStreamHandler.kt @@ -0,0 +1,15 @@ +package deckers.thibault.aves.channel.streams.platformtodart + +import deckers.thibault.aves.channel.streams.BaseStreamHandler +import deckers.thibault.aves.utils.LogUtils + +class ErrorStreamHandler : BaseStreamHandler() { + fun notifyError(error: String) = success(error) + + override val logTag = LOG_TAG + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/error" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/IntentStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/IntentStreamHandler.kt new file mode 100644 index 0000000..badbe20 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/IntentStreamHandler.kt @@ -0,0 +1,15 @@ +package deckers.thibault.aves.channel.streams.platformtodart + +import deckers.thibault.aves.channel.streams.BaseStreamHandler +import deckers.thibault.aves.utils.LogUtils + +class IntentStreamHandler : BaseStreamHandler() { + fun notifyNewIntent(intentData: MutableMap?) = success(intentData) + + override val logTag = LOG_TAG + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/new_intent_stream" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/MediaCommandStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/MediaCommandStreamHandler.kt new file mode 100644 index 0000000..d298464 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/MediaCommandStreamHandler.kt @@ -0,0 +1,61 @@ +package deckers.thibault.aves.channel.streams.platformtodart + +import android.support.v4.media.session.MediaSessionCompat +import deckers.thibault.aves.channel.streams.BaseStreamHandler +import deckers.thibault.aves.utils.LogUtils + +class MediaCommandStreamHandler : BaseStreamHandler() { + val callback = object : MediaSessionCompat.Callback() { + override fun onPlay() { + super.onPlay() + success(hashMapOf(KEY_COMMAND to COMMAND_PLAY)) + } + + override fun onPause() { + super.onPause() + success(hashMapOf(KEY_COMMAND to COMMAND_PAUSE)) + } + + override fun onSkipToNext() { + super.onSkipToNext() + success(hashMapOf(KEY_COMMAND to COMMAND_SKIP_TO_NEXT)) + } + + override fun onSkipToPrevious() { + super.onSkipToPrevious() + success(hashMapOf(KEY_COMMAND to COMMAND_SKIP_TO_PREVIOUS)) + } + + override fun onStop() { + super.onStop() + success(hashMapOf(KEY_COMMAND to COMMAND_STOP)) + } + + override fun onSeekTo(pos: Long) { + super.onSeekTo(pos) + success( + hashMapOf( + KEY_COMMAND to COMMAND_SEEK, + KEY_POSITION to pos, + ) + ) + } + } + + override val logTag = LOG_TAG + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/media_command" + + const val KEY_COMMAND = "command" + const val KEY_POSITION = "position" + + const val COMMAND_PLAY = "play" + const val COMMAND_PAUSE = "pause" + const val COMMAND_SKIP_TO_NEXT = "skip_to_next" + const val COMMAND_SKIP_TO_PREVIOUS = "skip_to_previous" + const val COMMAND_STOP = "stop" + const val COMMAND_SEEK = "seek" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/MediaStoreChangeStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/MediaStoreChangeStreamHandler.kt new file mode 100644 index 0000000..d666603 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/MediaStoreChangeStreamHandler.kt @@ -0,0 +1,49 @@ +package deckers.thibault.aves.channel.streams.platformtodart + +import android.content.Context +import android.database.ContentObserver +import android.net.Uri +import android.provider.MediaStore +import android.util.Log +import deckers.thibault.aves.channel.streams.BaseStreamHandler +import deckers.thibault.aves.utils.LogUtils + +class MediaStoreChangeStreamHandler(private val context: Context) : BaseStreamHandler() { + private val contentObserver = object : ContentObserver(null) { + override fun onChange(selfChange: Boolean) { + this.onChange(selfChange, null) + } + + override fun onChange(selfChange: Boolean, uri: Uri?) { + // warning: querying the content resolver right after a change + // sometimes yields obsolete results + success(uri?.toString()) + } + } + + init { + Log.i(LOG_TAG, "start listening to Media Store") + try { + context.contentResolver.apply { + registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, contentObserver) + registerContentObserver(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true, contentObserver) + } + } catch (e: SecurityException) { + // Trying to register an observer may yield a security exception with this message: + // "Failed to find provider media for user 0; expected to find a valid ContentProvider for this authority" + Log.w(LOG_TAG, "failed to register content observer", e) + } + } + + fun dispose() { + Log.i(LOG_TAG, "stop listening to Media Store") + context.contentResolver.unregisterContentObserver(contentObserver) + } + + override val logTag = LOG_TAG + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/media_store_change" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/SettingsChangeStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/SettingsChangeStreamHandler.kt new file mode 100644 index 0000000..c6f8ab2 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/SettingsChangeStreamHandler.kt @@ -0,0 +1,82 @@ +package deckers.thibault.aves.channel.streams.platformtodart + +import android.content.Context +import android.database.ContentObserver +import android.net.Uri +import android.provider.Settings +import android.util.Log +import android.view.ViewConfiguration +import deckers.thibault.aves.channel.streams.BaseStreamHandler +import deckers.thibault.aves.utils.LogUtils + +class SettingsChangeStreamHandler(private val context: Context) : BaseStreamHandler() { + private val contentObserver = object : ContentObserver(null) { + private var accelerometerRotation: Int = 0 + private var transitionAnimationScale: Float = 1f + private var longPressTimeoutMillis: Int = 0 + + init { + update() + } + + override fun onChange(selfChange: Boolean) { + this.onChange(selfChange, null) + } + + override fun onChange(selfChange: Boolean, uri: Uri?) { + if (update()) { + success( + hashMapOf( + Settings.System.ACCELEROMETER_ROTATION to accelerometerRotation, + Settings.Global.TRANSITION_ANIMATION_SCALE to transitionAnimationScale, + KEY_LONG_PRESS_TIMEOUT_MILLIS to longPressTimeoutMillis, + ) + ) + } + } + + private fun update(): Boolean { + var changed = false + try { + val newAccelerometerRotation = Settings.System.getInt(context.contentResolver, Settings.System.ACCELEROMETER_ROTATION) + if (accelerometerRotation != newAccelerometerRotation) { + accelerometerRotation = newAccelerometerRotation + changed = true + } + val newTransitionAnimationScale = Settings.Global.getFloat(context.contentResolver, Settings.Global.TRANSITION_ANIMATION_SCALE) + if (transitionAnimationScale != newTransitionAnimationScale) { + transitionAnimationScale = newTransitionAnimationScale + changed = true + } + val newLongPressTimeout = ViewConfiguration.getLongPressTimeout() + if (longPressTimeoutMillis != newLongPressTimeout) { + longPressTimeoutMillis = newLongPressTimeout + changed = true + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get settings with error=${e.message}", null) + } + return changed + } + } + + init { + Log.i(LOG_TAG, "start listening to system settings") + context.contentResolver.registerContentObserver(Settings.System.CONTENT_URI, true, contentObserver) + } + + fun dispose() { + Log.i(LOG_TAG, "stop listening to system settings") + context.contentResolver.unregisterContentObserver(contentObserver) + } + + override val logTag = LOG_TAG + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/settings_change" + + // cf `Settings.Secure.LONG_PRESS_TIMEOUT` + const val KEY_LONG_PRESS_TIMEOUT_MILLIS = "long_press_timeout" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/WindowChangeStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/WindowChangeStreamHandler.kt new file mode 100644 index 0000000..5cd6b9c --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/WindowChangeStreamHandler.kt @@ -0,0 +1,19 @@ +package deckers.thibault.aves.channel.streams.platformtodart + +import deckers.thibault.aves.channel.streams.BaseStreamHandler +import deckers.thibault.aves.utils.LogUtils + +class WindowChangeStreamHandler : BaseStreamHandler() { + fun notifyCutoutInsetsChange() = success(CODE_CUTOUT_INSETS) + fun notifyWindowModeChange() = success(CODE_WINDOW_MODE) + + override val logTag = LOG_TAG + + companion object { + private val LOG_TAG = LogUtils.createTag() + const val CHANNEL = "deckers.thibault/aves/window_change" + + private const val CODE_CUTOUT_INSETS = "cutout_insets" + private const val CODE_WINDOW_MODE = "window_mode" + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/decoding/RegionFetcher.kt b/android/app/src/main/kotlin/deckers/thibault/aves/decoding/RegionFetcher.kt new file mode 100644 index 0000000..5efbf5d --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/decoding/RegionFetcher.kt @@ -0,0 +1,227 @@ +package deckers.thibault.aves.decoding + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.BitmapRegionDecoder +import android.graphics.ColorSpace +import android.graphics.Rect +import android.net.Uri +import android.os.Build +import android.util.Log +import androidx.core.graphics.createBitmap +import com.bumptech.glide.Glide +import deckers.thibault.aves.channel.streams.darttoplatform.ByteSink +import deckers.thibault.aves.glide.AvesAppGlideModule +import deckers.thibault.aves.glide.MultiPageImage +import deckers.thibault.aves.utils.BitmapRegionDecoderCompat +import deckers.thibault.aves.utils.BitmapUtils +import deckers.thibault.aves.utils.BitmapUtils.describe +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MathUtils +import deckers.thibault.aves.utils.MemoryUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.StorageUtils +import java.io.ByteArrayInputStream +import java.nio.ByteBuffer +import java.util.concurrent.locks.ReentrantLock +import kotlin.concurrent.withLock +import kotlin.math.max +import kotlin.math.roundToInt + +// As of Android 14 (API 34), `BitmapRegionDecoder` documentation states +// that "only the JPEG, PNG, WebP and HEIF formats are supported" +// but in practice it successfully decodes some others. +class RegionFetcher internal constructor( + private val context: Context, +) { + suspend fun fetch( + uri: Uri, + pageId: Int?, + decoded: Boolean, + mimeType: String, + sampleSize: Int, + regionRect: Rect, + imageWidth: Int, + imageHeight: Int, + requestKey: Pair = Pair(uri, pageId), + result: ByteSink, + ) { + if (pageId != null && MultiPageImage.isSupported(mimeType)) { + // use export for requested page + val exportUri = exportUris.getOrPut(requestKey) { createTemporaryExport(uri, mimeType, pageId) } + fetch( + uri = exportUri, + pageId = null, + decoded = decoded, + mimeType = EXPORT_MIME_TYPE, + sampleSize = sampleSize, + regionRect = regionRect, + imageWidth = imageWidth, + imageHeight = imageHeight, + requestKey = requestKey, + result = result, + ) + return + } + + try { + val decoder = getOrCreateDecoder(context, uri, requestKey) + if (decoder == null) { + result.error("fetch-read-null", "failed to open file for mimeType=$mimeType uri=$uri regionRect=$regionRect", null) + return + } + + // with raw images, the known image size may not match the decoded image size + // so we scale the requested region accordingly + var effectiveRect = regionRect + var effectiveSampleSize = sampleSize + + if (imageWidth != decoder.width || imageHeight != decoder.height) { + val xf = decoder.width.toDouble() / imageWidth + val yf = decoder.height.toDouble() / imageHeight + effectiveRect = Rect( + (regionRect.left * xf).roundToInt(), + (regionRect.top * yf).roundToInt(), + (regionRect.right * xf).roundToInt(), + (regionRect.bottom * yf).roundToInt(), + ) + val factor = MathUtils.highestPowerOf2((1 / max(xf, yf)).roundToInt()) + if (factor > 1) { + effectiveSampleSize = max(1, effectiveSampleSize / factor) + } + } + + val options = BitmapFactory.Options().apply { + inSampleSize = effectiveSampleSize + // Specifying preferred config and color space avoids the need for conversion afterwards, + // but may prevent decoding (e.g. from RGBA_1010102 to ARGB_8888 on some devices). + inPreferredConfig = PREFERRED_CONFIG + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + inPreferredColorSpace = ColorSpace.get(ColorSpace.Named.SRGB) + } + } + + val pixelCount = effectiveRect.width() * effectiveRect.height() / effectiveSampleSize + val targetBitmapSizeBytes = BitmapUtils.getExpectedImageSize(pixelCount.toLong(), options.inPreferredConfig) + if (!MemoryUtils.canAllocate(targetBitmapSizeBytes)) { + // decoding a region that large would yield an OOM when creating the bitmap + result.error("fetch-large-region", "Region too large for uri=$uri regionRect=$regionRect", null) + return + } + + var bitmap = decoder.decodeRegion(effectiveRect, options) + if (bitmap == null) { + // retry without specifying config or color space, + // falling back to custom byte conversion afterwards + options.inPreferredConfig = null + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && options.inPreferredColorSpace != null) { + options.inPreferredColorSpace = null + } + bitmap = decoder.decodeRegion(effectiveRect, options) + } + + val bytes = BitmapUtils.getBytes(bitmap, recycle = true, decoded = decoded, mimeType) + if (bytes == null) { + result.error("fetch-null", "failed to decode region for uri=$uri regionRect=$regionRect", null) + } else { + result.streamBytes(ByteArrayInputStream(bytes)) + } + } catch (e: Exception) { + if (EXPORT_MIME_TYPE != mimeType) { + // retry with export on failure, + // as some formats are not fully supported by `BitmapRegionDecoder` + val exportUri = exportUris.getOrPut(requestKey) { createTemporaryExport(uri, mimeType, pageId) } + fetch( + uri = exportUri, + pageId = null, + decoded = decoded, + mimeType = EXPORT_MIME_TYPE, + sampleSize = sampleSize, + regionRect = regionRect, + imageWidth = imageWidth, + imageHeight = imageHeight, + requestKey = requestKey, + result = result, + ) + return + } + + result.error("fetch-read-exception", "failed to initialize region decoder for uri=$uri regionRect=$regionRect", e.message) + } + } + + private suspend fun createTemporaryExport(uri: Uri, mimeType: String, pageId: Int?): Uri { + val exportFormat = EXPORT_FORMAT + Log.d(LOG_TAG, "create export for uri=$uri mimeType=$mimeType pageId=$pageId exportFormat=$exportFormat") + val target = Glide.with(context) + .asBitmap() + .apply(AvesAppGlideModule.uncachedFullImageOptions) + .load(AvesAppGlideModule.getModel(context, uri, mimeType, pageId)) + .submit() + + try { + val bitmap = target.get() + val tempFile = StorageUtils.createTempFile(context).apply { + outputStream().use { output -> + val encodedExport = bitmap.compress(exportFormat, 100, output) + if (!encodedExport) { + Log.w(LOG_TAG, "failed export via encoded bytes for uri=$uri mimeType=$mimeType pageId=$pageId exportFormat=$exportFormat, with bitmap=${bitmap.describe()}") + + val decodedBytes = BitmapUtils.getBytes(bitmap, recycle = false, decoded = true, mimeType) + if (decodedBytes != null) { + val exportBitmap = createBitmap(bitmap.width, bitmap.height, PREFERRED_CONFIG) + exportBitmap.copyPixelsFromBuffer(ByteBuffer.wrap(decodedBytes)) + val decodedExport = exportBitmap.compress(exportFormat, 100, output) + if (!decodedExport) { + Log.w(LOG_TAG, "failed to compress exportBitmap=${bitmap.describe()}") + } + } + } + } + } + return Uri.fromFile(tempFile) + } finally { + Glide.with(context).clear(target) + } + } + + private data class DecoderRef( + val requestKey: Pair, + val decoder: BitmapRegionDecoder, + ) + + companion object { + private val LOG_TAG = LogUtils.createTag() + private val PREFERRED_CONFIG = Bitmap.Config.ARGB_8888 + private const val DECODER_POOL_SIZE = 3 + private const val EXPORT_MIME_TYPE = MimeTypes.JPEG + private val EXPORT_FORMAT = Bitmap.CompressFormat.JPEG + private val decoderPool = ArrayList() + private val exportUris = HashMap, Uri>() + + private val poolLock = ReentrantLock() + + private fun getOrCreateDecoder(context: Context, uri: Uri, requestKey: Pair): BitmapRegionDecoder? { + poolLock.withLock { + var decoderRef = decoderPool.firstOrNull { it.requestKey == requestKey } + if (decoderRef == null) { + val newDecoder = StorageUtils.openInputStream(context, uri)?.use { input -> + BitmapRegionDecoderCompat.newInstance(input) + } + if (newDecoder == null) { + return null + } + decoderRef = DecoderRef(requestKey, newDecoder) + } else { + decoderPool.remove(decoderRef) + } + decoderPool.add(0, decoderRef) + while (decoderPool.size > DECODER_POOL_SIZE) { + decoderPool.removeAt(decoderPool.size - 1) + } + return decoderRef.decoder + } + } + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/decoding/SvgRegionFetcher.kt b/android/app/src/main/kotlin/deckers/thibault/aves/decoding/SvgRegionFetcher.kt new file mode 100644 index 0000000..8eadcf5 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/decoding/SvgRegionFetcher.kt @@ -0,0 +1,145 @@ +package deckers.thibault.aves.decoding + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Rect +import android.graphics.RectF +import android.net.Uri +import androidx.core.graphics.createBitmap +import com.caverock.androidsvg.PreserveAspectRatio +import com.caverock.androidsvg.RenderOptions +import com.caverock.androidsvg.SVG +import com.caverock.androidsvg.SVGParseException +import com.caverock.androidsvg.utils.SVGAndroidRenderer +import deckers.thibault.aves.channel.streams.darttoplatform.ByteSink +import deckers.thibault.aves.metadata.SVGParserBufferedInputStream +import deckers.thibault.aves.metadata.SvgHelper.IMAGE_BASE64_SIZE_DANGER_THRESHOLD +import deckers.thibault.aves.metadata.SvgHelper.normalizeSize +import deckers.thibault.aves.utils.BitmapUtils +import deckers.thibault.aves.utils.MemoryUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.StorageUtils +import java.io.ByteArrayInputStream +import java.util.concurrent.locks.ReentrantLock +import kotlin.concurrent.withLock +import kotlin.math.ceil + +class SvgRegionFetcher internal constructor( + private val context: Context, +) { + suspend fun fetch( + uri: Uri, + decoded: Boolean, + sizeBytes: Long?, + scale: Int, + regionRect: Rect, + imageWidth: Int, + imageHeight: Int, + result: ByteSink, + ) { + if (!MemoryUtils.canAllocate(sizeBytes)) { + // opening an SVG that large would yield an OOM during parsing from `com.caverock.androidsvg.SVGParser` + result.error("fetch-read-large-file", "SVG too large at $sizeBytes bytes, for uri=$uri regionRect=$regionRect", null) + return + } + + try { + val svg = getOrCreateDecoder(context, uri) + if (svg == null) { + result.error("fetch-read-null", "failed to open file for uri=$uri regionRect=$regionRect", null) + return + } + + // we scale the requested region accordingly to the viewbox size + val viewBox = svg.documentViewBox + val svgWidth = viewBox.width() + val svgHeight = viewBox.height() + val xf = imageWidth / scale / ceil(svgWidth) + val yf = imageHeight / scale / ceil(svgHeight) + // some SVG paths do not respect the rendering viewbox and do not reach its edges + // so we render to a slightly larger bitmap, using a slightly larger viewbox, + // and crop that bitmap to the target region size + val bleedX = xf.toInt() + val bleedY = yf.toInt() + val effectiveRect = RectF( + (regionRect.left - bleedX) / xf, + (regionRect.top - bleedY) / yf, + (regionRect.right + bleedX) / xf, + (regionRect.bottom + bleedY) / yf, + ) + effectiveRect.offset(viewBox.left, viewBox.top) + + val renderOptions = RenderOptions() + renderOptions.viewBox(effectiveRect.left, effectiveRect.top, effectiveRect.width(), effectiveRect.height()) + renderOptions.preserveAspectRatio(PreserveAspectRatio.FULLSCREEN_START) + + val targetBitmapWidth = regionRect.width() + val targetBitmapHeight = regionRect.height() + val canvasWidth = targetBitmapWidth + bleedX * 2 + val canvasHeight = targetBitmapHeight + bleedY * 2 + + val config = PREFERRED_CONFIG + val pixelCount = canvasWidth * canvasHeight + val targetBitmapSizeBytes = BitmapUtils.getExpectedImageSize(pixelCount.toLong(), config) + if (!MemoryUtils.canAllocate(targetBitmapSizeBytes)) { + // decoding a region that large would yield an OOM when creating the bitmap + result.error("fetch-large-region", "SVG region too large for uri=$uri regionRect=$regionRect", null) + return + } + + var bitmap = createBitmap(canvasWidth, canvasHeight, config) + val canvas = Canvas(bitmap) + SVGAndroidRenderer.setImageBase64StringMaxSize(IMAGE_BASE64_SIZE_DANGER_THRESHOLD) + svg.renderToCanvas(canvas, renderOptions) + + bitmap = Bitmap.createBitmap(bitmap, bleedX, bleedY, targetBitmapWidth, targetBitmapHeight) + val bytes = BitmapUtils.getBytes(bitmap, recycle = true, decoded = decoded, MimeTypes.SVG) + if (bytes == null) { + result.error("fetch-null", "failed to decode SVG for uri=$uri regionRect=$regionRect", null) + } else { + result.streamBytes(ByteArrayInputStream(bytes)) + } + } catch (e: SVGParseException) { + result.error("fetch-parse", "failed to parse SVG for uri=$uri regionRect=$regionRect", e.message) + } catch (e: Exception) { + result.error("fetch-exception", "failed to initialize region decoder for uri=$uri regionRect=$regionRect", e.message) + } + } + + private data class DecoderRef( + val uri: Uri, + val decoder: SVG, + ) + + companion object { + private val PREFERRED_CONFIG = Bitmap.Config.ARGB_8888 + private const val DECODER_POOL_SIZE = 3 + private val decoderPool = ArrayList() + + private val poolLock = ReentrantLock() + + private fun getOrCreateDecoder(context: Context, uri: Uri): SVG? { + poolLock.withLock { + var decoderRef = decoderPool.firstOrNull { it.uri == uri } + if (decoderRef == null) { + val newDecoder = StorageUtils.openInputStream(context, uri)?.use { input -> + SVG.getFromInputStream(SVGParserBufferedInputStream(input)) + } + if (newDecoder == null) { + return null + } + newDecoder.normalizeSize() + decoderRef = DecoderRef(uri, newDecoder) + } else { + decoderPool.remove(decoderRef) + } + decoderPool.add(0, decoderRef) + while (decoderPool.size > DECODER_POOL_SIZE) { + decoderPool.removeAt(decoderPool.size - 1) + } + return decoderRef.decoder + } + } + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/decoding/ThumbnailFetcher.kt b/android/app/src/main/kotlin/deckers/thibault/aves/decoding/ThumbnailFetcher.kt new file mode 100644 index 0000000..4b46a05 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/decoding/ThumbnailFetcher.kt @@ -0,0 +1,182 @@ +package deckers.thibault.aves.decoding + +import android.content.Context +import android.graphics.Bitmap +import android.net.Uri +import android.os.Build +import android.provider.MediaStore +import android.util.Log +import android.util.Size +import androidx.annotation.RequiresApi +import androidx.core.graphics.scale +import androidx.core.net.toUri +import com.bumptech.glide.Glide +import com.bumptech.glide.load.DecodeFormat +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.signature.ObjectKey +import deckers.thibault.aves.channel.streams.darttoplatform.ByteSink +import deckers.thibault.aves.glide.AvesAppGlideModule +import deckers.thibault.aves.glide.MultiPageImage +import deckers.thibault.aves.utils.BitmapUtils +import deckers.thibault.aves.utils.BitmapUtils.applyExifOrientation +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.MimeTypes.SVG +import deckers.thibault.aves.utils.MimeTypes.isVideo +import deckers.thibault.aves.utils.MimeTypes.needRotationAfterContentResolverThumbnail +import deckers.thibault.aves.utils.MimeTypes.needRotationAfterGlide +import deckers.thibault.aves.utils.StorageUtils +import deckers.thibault.aves.utils.UriUtils.tryParseId +import java.io.ByteArrayInputStream +import kotlin.math.min +import kotlin.math.roundToInt + +class ThumbnailFetcher internal constructor( + private val context: Context, + uri: String, + private val pageId: Int?, + private val decoded: Boolean, + private val mimeType: String, + private val dateModifiedMillis: Long, + private val rotationDegrees: Int, + private val isFlipped: Boolean, + width: Int?, + height: Int?, + private val defaultSize: Int, + private val quality: Int, + private val result: ByteSink, +) { + private val uri: Uri = uri.toUri() + private val width: Int = if (width?.takeIf { it > 0 } != null) width else defaultSize + private val height: Int = if (height?.takeIf { it > 0 } != null) height else defaultSize + private val svgFetch = mimeType == SVG + private val tiffFetch = mimeType == MimeTypes.TIFF + private val multiPageFetch = pageId != null && MultiPageImage.isSupported(mimeType) + private val customFetch = svgFetch || tiffFetch || multiPageFetch + + suspend fun fetch() { + var bitmap: Bitmap? = null + var exception: Exception? = null + + try { + if (!customFetch && (width == defaultSize || height == defaultSize) && !isFlipped) { + // Fetch low quality thumbnails when size is not specified. + // As of Android 11, the Media Store content resolver may return a thumbnail + // that is automatically rotated according to EXIF orientation, but not flipped, + // so we skip this step for flipped entries. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + bitmap = getByResolver() + } else if (StorageUtils.isMediaStoreContentUri(uri)) { + bitmap = getByMediaStore() + } + } + } catch (e: Exception) { + exception = e + } + + // fallback if the native methods failed or for higher quality thumbnails + if (bitmap == null) { + try { + bitmap = getByGlide() + } catch (e: Exception) { + exception = e + } + } + + if (bitmap != null) { + if (bitmap.width > width && bitmap.height > height) { + // rescale when the resulting bitmap is larger than requested + val scalingFactor: Double = min(bitmap.width.toDouble() / width, bitmap.height.toDouble() / height) + val dstWidth = (bitmap.width / scalingFactor).roundToInt() + val dstHeight = (bitmap.height / scalingFactor).roundToInt() + Log.d( + LOG_TAG, "rescale thumbnail for mimeType=$mimeType uri=$uri width=$width height=$height" + + ", with bitmap byteCount=${bitmap.byteCount} size=${bitmap.width}x${bitmap.height}" + + ", to target=${dstWidth}x${dstHeight}" + ) + bitmap = bitmap.scale(dstWidth, dstHeight) + } + + if (bitmap.byteCount > BITMAP_SIZE_DANGER_THRESHOLD) { + result.error( + "getThumbnail-large", "thumbnail bitmap dangerously large" + + " for mimeType=$mimeType uri=$uri pageId=$pageId width=$width height=$height" + + ", with bitmap byteCount=${bitmap.byteCount} size=${bitmap.width}x${bitmap.height} config=${bitmap.config?.name}", null + ) + return + } + } + + // do not recycle bitmaps fetched from `ContentResolver` or Glide as their lifecycle is unknown + val bytes = BitmapUtils.getBytes(bitmap, recycle = false, decoded = decoded, mimeType) + if (bytes == null) { + var errorDetails: String? = exception?.message + if (errorDetails?.isNotEmpty() == true) { + errorDetails = errorDetails.split(Regex("\n"), 2).first() + } + result.error("getThumbnail-null", "failed to get thumbnail for mimeType=$mimeType uri=$uri", errorDetails) + } else { + result.streamBytes(ByteArrayInputStream(bytes)) + } + } + + @RequiresApi(api = Build.VERSION_CODES.Q) + private fun getByResolver(): Bitmap? { + val resolver = context.contentResolver + var bitmap: Bitmap? = resolver.loadThumbnail(uri, Size(width, height), null) + if (needRotationAfterContentResolverThumbnail(mimeType)) { + bitmap = applyExifOrientation(context, bitmap, rotationDegrees, isFlipped) + } + return bitmap + } + + private fun getByMediaStore(): Bitmap? { + val contentId = uri.tryParseId() ?: return null + val resolver = context.contentResolver + return if (isVideo(mimeType)) { + @Suppress("deprecation") + MediaStore.Video.Thumbnails.getThumbnail(resolver, contentId, MediaStore.Video.Thumbnails.MINI_KIND, null) + } else { + @Suppress("deprecation") + var bitmap = MediaStore.Images.Thumbnails.getThumbnail(resolver, contentId, MediaStore.Images.Thumbnails.MINI_KIND, null) + // from Android 10 (API 29), returned thumbnail is already rotated according to EXIF orientation + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && bitmap != null) { + bitmap = applyExifOrientation(context, bitmap, rotationDegrees, isFlipped) + } + bitmap + } + } + + private fun getByGlide(): Bitmap? { + // add signature to ignore cache for images which got modified but kept the same URI + var options = RequestOptions() + .format(if (quality == 100) DecodeFormat.PREFER_ARGB_8888 else DecodeFormat.PREFER_RGB_565) + .signature(ObjectKey("$dateModifiedMillis-$rotationDegrees-$isFlipped-$width-$pageId")) + .override(width, height) + if (isVideo(mimeType)) { + options = options.diskCacheStrategy(DiskCacheStrategy.RESOURCE) + } + + val target = Glide.with(context) + .asBitmap() + .apply(options) + .load(AvesAppGlideModule.getModel(context, uri, mimeType, pageId)) + .submit(width, height) + + return try { + var bitmap = target.get() + if (needRotationAfterGlide(mimeType, pageId)) { + bitmap = applyExifOrientation(context, bitmap, rotationDegrees, isFlipped) + } + bitmap + } finally { + Glide.with(context).clear(target) + } + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + private const val BITMAP_SIZE_DANGER_THRESHOLD = 20 * (1 shl 20) // MB + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/decoding/TiffRegionFetcher.kt b/android/app/src/main/kotlin/deckers/thibault/aves/decoding/TiffRegionFetcher.kt new file mode 100644 index 0000000..7c58df0 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/decoding/TiffRegionFetcher.kt @@ -0,0 +1,51 @@ +package deckers.thibault.aves.decoding + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Rect +import android.net.Uri +import deckers.thibault.aves.channel.streams.darttoplatform.ByteSink +import deckers.thibault.aves.glide.TiffFetcher +import deckers.thibault.aves.utils.BitmapUtils +import deckers.thibault.aves.utils.MimeTypes +import org.beyka.tiffbitmapfactory.DecodeArea +import org.beyka.tiffbitmapfactory.TiffBitmapFactory +import java.io.ByteArrayInputStream + +class TiffRegionFetcher internal constructor( + private val context: Context, +) { + suspend fun fetch( + uri: Uri, + page: Int, + decoded: Boolean, + sampleSize: Int, + regionRect: Rect, + result: ByteSink, + ) { + try { + val pfd = context.contentResolver.openFileDescriptor(uri, "r") + if (pfd == null) { + result.error("fetch-fd", "failed to get file descriptor for uri=$uri", null) + return + } + pfd.use { + val fd = pfd.detachFd() + val options = TiffFetcher.buildOptions().apply { + inDirectoryNumber = page + inSampleSize = sampleSize + inDecodeArea = DecodeArea(regionRect.left, regionRect.top, regionRect.width(), regionRect.height()) + } + val bitmap: Bitmap? = TiffBitmapFactory.decodeFileDescriptor(fd, options) + val bytes = BitmapUtils.getBytes(bitmap, recycle = true, decoded = decoded, MimeTypes.TIFF) + if (bytes == null) { + result.error("fetch-null", "failed to decode region for uri=$uri page=$page regionRect=$regionRect", null) + } else { + result.streamBytes(ByteArrayInputStream(bytes)) + } + } + } catch (e: Exception) { + result.error("fetch-exception", "failed to read from uri=$uri page=$page regionRect=$regionRect", e.message) + } + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/glide/AvesAppGlideModule.kt b/android/app/src/main/kotlin/deckers/thibault/aves/glide/AvesAppGlideModule.kt new file mode 100644 index 0000000..268929e --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/glide/AvesAppGlideModule.kt @@ -0,0 +1,91 @@ +package deckers.thibault.aves.glide + +import android.content.Context +import android.net.Uri +import android.text.format.Formatter +import android.util.Log +import com.bumptech.glide.Glide +import com.bumptech.glide.GlideBuilder +import com.bumptech.glide.Registry +import com.bumptech.glide.annotation.GlideModule +import com.bumptech.glide.load.DecodeFormat +import com.bumptech.glide.load.ImageHeaderParser +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPoolAdapter +import com.bumptech.glide.load.engine.bitmap_recycle.LruArrayPool +import com.bumptech.glide.load.engine.bitmap_recycle.LruBitmapPool +import com.bumptech.glide.load.engine.cache.DiskCache +import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory +import com.bumptech.glide.load.engine.cache.LruResourceCache +import com.bumptech.glide.load.engine.cache.MemorySizeCalculator +import com.bumptech.glide.load.resource.bitmap.ExifInterfaceImageHeaderParser +import com.bumptech.glide.module.AppGlideModule +import com.bumptech.glide.request.RequestOptions +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.MimeTypes.isVideo +import deckers.thibault.aves.utils.StorageUtils + +@GlideModule +class AvesAppGlideModule : AppGlideModule() { + override fun applyOptions(context: Context, builder: GlideBuilder) { + // hide noisy warning (e.g. for images that can't be decoded) + builder.setLogLevel(Log.ERROR) + + // sizing + val memorySizeCalculator = MemorySizeCalculator.Builder(context).build() + builder.setMemorySizeCalculator(memorySizeCalculator) + val size: Int = memorySizeCalculator.bitmapPoolSize + if (size > 0) { + builder.setBitmapPool(LruBitmapPool(size.toLong())) + } else { + builder.setBitmapPool(BitmapPoolAdapter()) + } + builder.setArrayPool(LruArrayPool(memorySizeCalculator.arrayPoolSizeInBytes)) + builder.setMemoryCache(LruResourceCache(memorySizeCalculator.memoryCacheSize.toLong())) + + val diskCacheSize = DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE + val internalCacheDiskCacheFactory = InternalCacheDiskCacheFactory(context, DiskCache.Factory.DEFAULT_DISK_CACHE_DIR, diskCacheSize.toLong()) + builder.setDiskCache(internalCacheDiskCacheFactory) + + fun toMb(bytes: Int) = Formatter.formatFileSize(context, bytes.toLong()) + Log.d( + LOG_TAG, "Glide disk cache size=${toMb(diskCacheSize)}" + + ", memory cache size=${toMb(memorySizeCalculator.memoryCacheSize)}" + + ", bitmap pool size=${toMb(memorySizeCalculator.bitmapPoolSize)}" + + ", array pool size=${toMb(memorySizeCalculator.arrayPoolSizeInBytes)}" + ) + } + + override fun registerComponents(context: Context, glide: Glide, registry: Registry) { + // prevent ExifInterface error logs + // cf https://github.com/bumptech/glide/issues/3383 + registry.imageHeaderParsers.removeIf { parser: ImageHeaderParser? -> parser is ExifInterfaceImageHeaderParser } + } + + override fun isManifestParsingEnabled(): Boolean = false + + companion object { + private val LOG_TAG = LogUtils.createTag() + + // request a fresh image with the highest quality format + val uncachedFullImageOptions = RequestOptions() + .format(DecodeFormat.PREFER_ARGB_8888) + .diskCacheStrategy(DiskCacheStrategy.NONE) + .skipMemoryCache(true) + + fun getModel(context: Context, uri: Uri, mimeType: String, pageId: Int?, sizeBytes: Long? = null): Any { + return if (pageId != null && MultiPageImage.isSupported(mimeType)) { + MultiPageImage(context, uri, mimeType, pageId) + } else if (mimeType == MimeTypes.TIFF) { + TiffImage(context, uri, pageId) + } else if (mimeType == MimeTypes.SVG) { + SvgImage(context, uri) + } else if (isVideo(mimeType)) { + VideoThumbnail(context, uri) + } else { + StorageUtils.getGlideSafeUri(context, uri, mimeType, sizeBytes) + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/glide/MultiPageImageGlideModule.kt b/android/app/src/main/kotlin/deckers/thibault/aves/glide/MultiPageImageGlideModule.kt new file mode 100644 index 0000000..a87a7c9 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/glide/MultiPageImageGlideModule.kt @@ -0,0 +1,89 @@ +package deckers.thibault.aves.glide + +import android.content.Context +import android.graphics.Bitmap +import android.net.Uri +import android.os.Build +import com.bumptech.glide.Glide +import com.bumptech.glide.Priority +import com.bumptech.glide.Registry +import com.bumptech.glide.annotation.GlideModule +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.Options +import com.bumptech.glide.load.data.DataFetcher +import com.bumptech.glide.load.data.DataFetcher.DataCallback +import com.bumptech.glide.load.model.ModelLoader +import com.bumptech.glide.load.model.ModelLoaderFactory +import com.bumptech.glide.load.model.MultiModelLoaderFactory +import com.bumptech.glide.module.LibraryGlideModule +import com.bumptech.glide.signature.ObjectKey +import deckers.thibault.aves.metadata.MultiPage +import deckers.thibault.aves.metadata.MultiTrackMedia +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.MimeTypes.isIsoBMFFImage + +@GlideModule +class MultiPageImageGlideModule : LibraryGlideModule() { + override fun registerComponents(context: Context, glide: Glide, registry: Registry) { + registry.append(MultiPageImage::class.java, Bitmap::class.java, MultiPageThumbnailLoader.Factory()) + } +} + +class MultiPageImage(val context: Context, val uri: Uri, val mimeType: String, val pageId: Int?) { + override fun toString(): String = "MultiPageImage#${hashCode()}{uri=$uri mimeType=$mimeType pageId=$pageId}" + + companion object { + fun isSupported(mimeType: String) = isIsoBMFFImage(mimeType) || mimeType == MimeTypes.JPEG + } +} + +internal class MultiPageThumbnailLoader : ModelLoader { + override fun buildLoadData(model: MultiPageImage, width: Int, height: Int, options: Options): ModelLoader.LoadData { + return ModelLoader.LoadData(ObjectKey(model.uri), MultiPageImageFetcher(model, width, height)) + } + + override fun handles(model: MultiPageImage): Boolean = true + + internal class Factory : ModelLoaderFactory { + override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader = MultiPageThumbnailLoader() + + override fun teardown() {} + } +} + +internal class MultiPageImageFetcher(val model: MultiPageImage, val width: Int, val height: Int) : DataFetcher { + override fun loadData(priority: Priority, callback: DataCallback) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { + callback.onLoadFailed(Exception("unsupported Android version")) + return + } + + val context = model.context + val uri = model.uri + val mimeType = model.mimeType + + var bitmap: Bitmap? = null + if (isIsoBMFFImage(mimeType)) { + val trackIndex = model.pageId + bitmap = MultiTrackMedia.getImage(context, uri, trackIndex) + } else if (mimeType == MimeTypes.JPEG) { + val pageIndex = model.pageId ?: 0 + bitmap = MultiPage.getJpegMpfBitmap(context, uri, pageIndex) + } + + if (bitmap == null) { + callback.onLoadFailed(Exception("null bitmap")) + } else { + callback.onDataReady(bitmap) + } + } + + override fun cleanup() {} + + // cannot cancel + override fun cancel() {} + + override fun getDataClass(): Class = Bitmap::class.java + + override fun getDataSource(): DataSource = DataSource.LOCAL +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/glide/SvgGlideModule.kt b/android/app/src/main/kotlin/deckers/thibault/aves/glide/SvgGlideModule.kt new file mode 100644 index 0000000..2a43d4b --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/glide/SvgGlideModule.kt @@ -0,0 +1,102 @@ +package deckers.thibault.aves.glide + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Canvas +import android.net.Uri +import androidx.core.graphics.createBitmap +import com.bumptech.glide.Glide +import com.bumptech.glide.Priority +import com.bumptech.glide.Registry +import com.bumptech.glide.annotation.GlideModule +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.Options +import com.bumptech.glide.load.data.DataFetcher +import com.bumptech.glide.load.model.ModelLoader +import com.bumptech.glide.load.model.ModelLoaderFactory +import com.bumptech.glide.load.model.MultiModelLoaderFactory +import com.bumptech.glide.module.LibraryGlideModule +import com.bumptech.glide.signature.ObjectKey +import com.caverock.androidsvg.SVG +import com.caverock.androidsvg.SVGParseException +import com.caverock.androidsvg.utils.SVGAndroidRenderer +import deckers.thibault.aves.metadata.SVGParserBufferedInputStream +import deckers.thibault.aves.metadata.SvgHelper.IMAGE_BASE64_SIZE_DANGER_THRESHOLD +import deckers.thibault.aves.metadata.SvgHelper.normalizeSize +import deckers.thibault.aves.utils.StorageUtils +import kotlin.math.ceil + +@GlideModule +class SvgGlideModule : LibraryGlideModule() { + override fun registerComponents(context: Context, glide: Glide, registry: Registry) { + registry.append(SvgImage::class.java, Bitmap::class.java, SvgLoader.Factory()) + } +} + +class SvgImage(val context: Context, val uri: Uri) + +internal class SvgLoader : ModelLoader { + override fun buildLoadData(model: SvgImage, width: Int, height: Int, options: Options): ModelLoader.LoadData { + return ModelLoader.LoadData(ObjectKey(model.uri), SvgFetcher(model, width, height)) + } + + override fun handles(model: SvgImage): Boolean = true + + internal class Factory : ModelLoaderFactory { + override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader = SvgLoader() + + override fun teardown() {} + } +} + +internal class SvgFetcher(val model: SvgImage, val width: Int, val height: Int) : DataFetcher { + override fun loadData(priority: Priority, callback: DataFetcher.DataCallback) { + val context = model.context + val uri = model.uri + + val bitmap: Bitmap? = StorageUtils.openInputStream(context, uri)?.use { input -> + try { + SVG.getFromInputStream(SVGParserBufferedInputStream(input))?.let { svg -> + svg.normalizeSize() + val viewBox = svg.documentViewBox + val svgWidth = viewBox.width() + val svgHeight = viewBox.height() + + val bitmapWidth: Int + val bitmapHeight: Int + if (width / height.toFloat() > svgWidth / svgHeight) { + bitmapWidth = ceil(svgWidth * height / svgHeight).toInt() + bitmapHeight = height + } else { + bitmapWidth = width + bitmapHeight = ceil(svgHeight * width / svgWidth).toInt() + } + val bitmap = createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888) + + val canvas = Canvas(bitmap) + SVGAndroidRenderer.setImageBase64StringMaxSize(IMAGE_BASE64_SIZE_DANGER_THRESHOLD) + svg.renderToCanvas(canvas) + bitmap + } + } catch (ex: SVGParseException) { + callback.onLoadFailed(ex) + return + } + } + + if (bitmap == null) { + callback.onLoadFailed(Exception("failed to load SVG for uri=$uri")) + } else { + callback.onDataReady(bitmap) + } + } + + override fun cleanup() {} + + // cannot cancel + override fun cancel() {} + + override fun getDataClass(): Class = Bitmap::class.java + + override fun getDataSource(): DataSource = DataSource.LOCAL +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/glide/TiffGlideModule.kt b/android/app/src/main/kotlin/deckers/thibault/aves/glide/TiffGlideModule.kt new file mode 100644 index 0000000..f0cd864 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/glide/TiffGlideModule.kt @@ -0,0 +1,127 @@ +package deckers.thibault.aves.glide + +import android.content.Context +import android.graphics.Bitmap +import android.net.Uri +import androidx.core.graphics.scale +import com.bumptech.glide.Glide +import com.bumptech.glide.Priority +import com.bumptech.glide.Registry +import com.bumptech.glide.annotation.GlideModule +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.Options +import com.bumptech.glide.load.data.DataFetcher +import com.bumptech.glide.load.data.DataFetcher.DataCallback +import com.bumptech.glide.load.model.ModelLoader +import com.bumptech.glide.load.model.ModelLoaderFactory +import com.bumptech.glide.load.model.MultiModelLoaderFactory +import com.bumptech.glide.module.LibraryGlideModule +import com.bumptech.glide.signature.ObjectKey +import org.beyka.tiffbitmapfactory.TiffBitmapFactory + +@GlideModule +class TiffGlideModule : LibraryGlideModule() { + override fun registerComponents(context: Context, glide: Glide, registry: Registry) { + registry.append(TiffImage::class.java, Bitmap::class.java, TiffLoader.Factory()) + } +} + +class TiffImage(val context: Context, val uri: Uri, val page: Int?) + +internal class TiffLoader : ModelLoader { + override fun buildLoadData(model: TiffImage, width: Int, height: Int, options: Options): ModelLoader.LoadData { + return ModelLoader.LoadData(ObjectKey(model.uri), TiffFetcher(model, width, height)) + } + + override fun handles(model: TiffImage): Boolean = true + + internal class Factory : ModelLoaderFactory { + override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader = TiffLoader() + + override fun teardown() {} + } +} + +internal class TiffFetcher(val model: TiffImage, val width: Int, val height: Int) : DataFetcher { + override fun loadData(priority: Priority, callback: DataCallback) { + val context = model.context + val uri = model.uri + val page = model.page ?: 0 + + var sampleSize = 1 + val customSize = width > 0 && height > 0 + if (customSize) { + // determine sample size + val fd = context.contentResolver.openFileDescriptor(uri, "r")?.detachFd() + if (fd == null) { + callback.onLoadFailed(Exception("null file descriptor")) + return + } + val options = buildOptions().apply { + inJustDecodeBounds = true + inDirectoryNumber = page + } + TiffBitmapFactory.decodeFileDescriptor(fd, options) + val imageWidth = options.outWidth + val imageHeight = options.outHeight + if (imageWidth > width || imageHeight > height) { + while (imageHeight / (sampleSize * 2) >= height && imageWidth / (sampleSize * 2) >= width) { + sampleSize *= 2 + } + } + } + + // decode + val fd = context.contentResolver.openFileDescriptor(uri, "r")?.detachFd() + if (fd == null) { + callback.onLoadFailed(Exception("null file descriptor")) + return + } + val options = buildOptions().apply { + inDirectoryNumber = page + inSampleSize = sampleSize + } + try { + val bitmap: Bitmap? = TiffBitmapFactory.decodeFileDescriptor(fd, options) + // calling `TiffBitmapFactory.closeFd(fd)` after decoding yields a segmentation fault + + if (bitmap == null) { + callback.onLoadFailed(Exception("Decoding full TIFF yielded null bitmap")) + } else if (customSize) { + val dstWidth: Int + val dstHeight: Int + val aspectRatio = bitmap.width.toFloat() / bitmap.height + if (aspectRatio > 1) { + dstWidth = (height * aspectRatio).toInt() + dstHeight = height + } else { + dstWidth = width + dstHeight = (width / aspectRatio).toInt() + } + callback.onDataReady(bitmap.scale(dstWidth, dstHeight)) + } else { + callback.onDataReady(bitmap) + } + } catch (e: Exception) { + callback.onLoadFailed(e) + } + } + + override fun cleanup() {} + + // cannot cancel + override fun cancel() {} + + override fun getDataClass(): Class = Bitmap::class.java + + override fun getDataSource(): DataSource = DataSource.LOCAL + + companion object { + fun buildOptions(): TiffBitmapFactory.Options { + return TiffBitmapFactory.Options().apply { + inThrowException = true + inUseOrientationTag = false + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/glide/VideoThumbnailGlideModule.kt b/android/app/src/main/kotlin/deckers/thibault/aves/glide/VideoThumbnailGlideModule.kt new file mode 100644 index 0000000..f3eef5f --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/glide/VideoThumbnailGlideModule.kt @@ -0,0 +1,192 @@ +package deckers.thibault.aves.glide + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.media.MediaMetadataRetriever +import android.net.Uri +import android.os.Build +import androidx.annotation.RequiresApi +import com.bumptech.glide.Glide +import com.bumptech.glide.Priority +import com.bumptech.glide.Registry +import com.bumptech.glide.annotation.GlideModule +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.Options +import com.bumptech.glide.load.data.DataFetcher +import com.bumptech.glide.load.data.DataFetcher.DataCallback +import com.bumptech.glide.load.model.ModelLoader +import com.bumptech.glide.load.model.ModelLoaderFactory +import com.bumptech.glide.load.model.MultiModelLoaderFactory +import com.bumptech.glide.module.LibraryGlideModule +import com.bumptech.glide.signature.ObjectKey +import deckers.thibault.aves.utils.BitmapUtils +import deckers.thibault.aves.utils.MemoryUtils +import deckers.thibault.aves.utils.StorageUtils.openMetadataRetriever +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import java.io.ByteArrayInputStream +import java.io.IOException +import kotlin.math.min +import kotlin.math.roundToInt + +@GlideModule +class VideoThumbnailGlideModule : LibraryGlideModule() { + override fun registerComponents(context: Context, glide: Glide, registry: Registry) { + registry.append(VideoThumbnail::class.java, Bitmap::class.java, VideoThumbnailLoader.Factory()) + } +} + +class VideoThumbnail(val context: Context, val uri: Uri) + +internal class VideoThumbnailLoader : ModelLoader { + override fun buildLoadData(model: VideoThumbnail, width: Int, height: Int, options: Options): ModelLoader.LoadData { + return ModelLoader.LoadData(ObjectKey(model.uri), VideoThumbnailFetcher(model, width, height)) + } + + override fun handles(model: VideoThumbnail): Boolean = true + + internal class Factory : ModelLoaderFactory { + override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader = VideoThumbnailLoader() + + override fun teardown() {} + } +} + +internal class VideoThumbnailFetcher(private val model: VideoThumbnail, val width: Int, val height: Int) : DataFetcher { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + override fun loadData(priority: Priority, callback: DataCallback) { + ioScope.launch { + val retriever = openMetadataRetriever(model.context, model.uri) + if (retriever == null) { + callback.onLoadFailed(Exception("failed to initialize MediaMetadataRetriever for uri=${model.uri}")) + } else { + try { + var bitmap: Bitmap? = null + + retriever.embeddedPicture?.let { bytes -> + try { + bitmap = BitmapFactory.decodeStream(ByteArrayInputStream(bytes)) + } catch (_: IOException) { + // ignore + } + } + + if (bitmap == null) { + // there is no consistent strategy across devices to match + // the thumbnails returned by the content resolver / Media Store + // so we derive one in an arbitrary way + var timeMillis: Long? = null + val durationMillis = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)?.toLongOrNull() + if (durationMillis != null) { + timeMillis = if (durationMillis < 15000) 0 else min(durationMillis / 2, 15000) + } + val timeMicros = if (timeMillis != null) timeMillis * 1000 else -1 + val option = MediaMetadataRetriever.OPTION_CLOSEST_SYNC + + var videoWidth = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)?.toFloatOrNull() + var videoHeight = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)?.toFloatOrNull() + if (videoWidth == null || videoHeight == null) { + throw Exception("failed to get video dimensions") + } + + val rotationDegrees = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION)?.toIntOrNull() ?: 0 + val isRotated = rotationDegrees % 180 == 90 + if (isRotated) { + videoWidth = videoHeight.also { videoHeight = videoWidth } + } + + var dstWidth = 0 + var dstHeight = 0 + if (width > 0 && height > 0) { + // cover fit + val targetAspectRatio = width / height.toFloat() + val videoAspectRatio = videoWidth / videoHeight + if (targetAspectRatio > videoAspectRatio) { + dstHeight = (width / videoAspectRatio).roundToInt() + dstWidth = (dstHeight * videoAspectRatio).roundToInt() + } else { + dstWidth = (height * videoAspectRatio).roundToInt() + dstHeight = (dstWidth / videoAspectRatio).roundToInt() + } + } + if (dstWidth == 0 || dstWidth > videoWidth || dstHeight == 0 || dstHeight > videoHeight) { + dstWidth = videoWidth.toInt() + dstHeight = videoHeight.toInt() + } + + // the returned frame is already rotated according to the video metadata + fun getFrameAtTime(timeMicros: Long): Bitmap? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + val pixelCount = dstWidth * dstHeight + val targetBitmapSizeBytes = BitmapUtils.getExpectedImageSize(pixelCount.toLong(), getPreferredConfig()) + if (!MemoryUtils.canAllocate(targetBitmapSizeBytes)) { + throw Exception("not enough memory to allocate $targetBitmapSizeBytes bytes for the scaled frame at $dstWidth x $dstHeight") + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + retriever.getScaledFrameAtTime(timeMicros, option, dstWidth, dstHeight, getBitmapParams()) + } else { + retriever.getScaledFrameAtTime(timeMicros, option, dstWidth, dstHeight) + } + } else { + val pixelCount = videoWidth * videoHeight + val targetBitmapSizeBytes = BitmapUtils.getExpectedImageSize(pixelCount.toLong(), getPreferredConfig()) + if (!MemoryUtils.canAllocate(targetBitmapSizeBytes)) { + throw Exception("not enough memory to allocate $targetBitmapSizeBytes bytes for the full frame at $videoWidth x $videoHeight") + } + retriever.getFrameAtTime(timeMicros, option) + } + } + + bitmap = getFrameAtTime(timeMicros) + if (bitmap == null && timeMicros > 0) { + // retry to get the first frame instead of an arbitrary one + bitmap = getFrameAtTime(0) + } + } + + if (bitmap == null) { + callback.onLoadFailed(Exception("failed to get embedded picture or any frame for uri=${model.uri}")) + } else { + callback.onDataReady(bitmap) + } + } catch (e: Exception) { + callback.onLoadFailed(e) + } finally { + // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs + retriever.release() + } + } + } + } + + @RequiresApi(Build.VERSION_CODES.P) + private fun getBitmapParams(): MediaMetadataRetriever.BitmapParams { + val params = MediaMetadataRetriever.BitmapParams() + params.preferredConfig = this.getPreferredConfig() + return params + } + + private fun getPreferredConfig(): Bitmap.Config { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + // improved precision with the same memory cost as `ARGB_8888` (4 bytes per pixel) + // for wide-gamut and HDR content which does not require alpha blending + Bitmap.Config.RGBA_1010102 + } else { + Bitmap.Config.ARGB_8888 + } + } + + // already cleaned up in loadData and ByteArrayInputStream will be GC'd + override fun cleanup() {} + + // cannot cancel + override fun cancel() {} + + override fun getDataClass(): Class = Bitmap::class.java + + override fun getDataSource(): DataSource = DataSource.LOCAL +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/DngTags.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/DngTags.kt new file mode 100644 index 0000000..3137919 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/DngTags.kt @@ -0,0 +1,229 @@ +package deckers.thibault.aves.metadata + +// DNG v1.6.0.0 +// cf https://helpx.adobe.com/content/dam/help/en/photoshop/pdf/dng_spec_1_6_0_0.pdf +object DngTags { + private const val DNG_VERSION = 0xC612 + private const val DNG_BACKWARD_VERSION = 0xC613 + private const val UNIQUE_CAMERA_MODEL = 0xC614 + private const val LOCALIZED_CAMERA_MODEL = 0xC615 + private const val CFA_PLANE_COLOR = 0xC616 + private const val CFA_LAYOUT = 0xC617 + private const val LINEARIZATION_TABLE = 0xC618 + private const val BLACK_LEVEL_REPEAT_DIM = 0xC619 + private const val BLACK_LEVEL = 0xC61A + private const val BLACK_LEVEL_DELTA_H = 0xC61B + private const val BLACK_LEVEL_DELTA_V = 0xC61C + private const val WHITE_LEVEL = 0xC61D + private const val DEFAULT_SCALE = 0xC61E + private const val DEFAULT_CROP_ORIGIN = 0xC61F + private const val DEFAULT_CROP_SIZE = 0xC620 + private const val COLOR_MATRIX_1 = 0xC621 + private const val COLOR_MATRIX_2 = 0xC622 + private const val CAMERA_CALIBRATION_1 = 0xC623 + private const val CAMERA_CALIBRATION_2 = 0xC624 + private const val REDUCTION_MATRIX_1 = 0xC625 + private const val REDUCTION_MATRIX_2 = 0xC626 + private const val ANALOG_BALANCE = 0xC627 + private const val AS_SHOT_NEUTRAL = 0xC628 + private const val AS_SHOT_WHITE_XY = 0xC629 + private const val BASELINE_EXPOSURE = 0xC62A + private const val BASELINE_NOISE = 0xC62B + private const val BASELINE_SHARPNESS = 0xC62C + private const val BAYER_GREEN_SPLIT = 0xC62D + private const val LINEAR_RESPONSE_LIMIT = 0xC62E + private const val CAMERA_SERIAL_NUMBER = 0xC62F + private const val LENS_INFO = 0xC630 + private const val CHROMA_BLUR_RADIUS = 0xC631 + private const val ANTI_ALIAS_STRENGTH = 0xC632 + private const val SHADOW_SCALE = 0xC633 + private const val DNG_PRIVATE_DATA = 0xC634 + private const val MAKER_NOTE_SAFETY = 0xC635 + private const val CALIBRATION_ILLUMINANT_1 = 0xC65A + private const val CALIBRATION_ILLUMINANT_2 = 0xC65B + private const val BEST_QUALITY_SCALE = 0xC65C + private const val RAW_DATA_UNIQUE_ID = 0xC65D + private const val ORIGINAL_RAW_FILE_NAME = 0xC68B + private const val ORIGINAL_RAW_FILE_DATA = 0xC68C + private const val ACTIVE_AREA = 0xC68D + private const val MASKED_AREAS = 0xC68E + private const val AS_SHOT_ICC_PROFILE = 0xC68F + private const val AS_SHOT_PRE_PROFILE_MATRIX = 0xC690 + private const val CURRENT_ICC_PROFILE = 0xC691 + private const val CURRENT_PRE_PROFILE_MATRIX = 0xC692 + private const val COLORIMETRIC_REFERENCE = 0xC6BF + private const val CAMERA_CALIBRATION_SIGNATURE = 0xC6F3 + private const val PROFILE_CALIBRATION_SIGNATURE = 0xC6F4 + private const val EXTRA_CAMERA_PROFILES = 0xC6F5 + private const val AS_SHOT_PROFILE_NAME = 0xC6F6 + private const val NOISE_REDUCTION_APPLIED = 0xC6F7 + private const val PROFILE_NAME = 0xC6F8 + private const val PROFILE_HUE_SAT_MAP_DIMS = 0xC6F9 + private const val PROFILE_HUE_SAT_MAP_DATA_1 = 0xC6FA + private const val PROFILE_HUE_SAT_MAP_DATA_2 = 0xC6FB + private const val PROFILE_TONE_CURVE = 0xC6FC + private const val PROFILE_EMBED_POLICY = 0xC6FD + private const val PROFILE_COPYRIGHT = 0xC6FE + private const val FORWARD_MATRIX_1 = 0xC714 + private const val FORWARD_MATRIX_2 = 0xC715 + private const val PREVIEW_APPLICATION_NAME = 0xC716 + private const val PREVIEW_APPLICATION_VERSION = 0xC717 + private const val PREVIEW_SETTINGS_NAME = 0xC718 + private const val PREVIEW_SETTINGS_DIGEST = 0xC719 + private const val PREVIEW_COLOR_SPACE = 0xC71A + private const val PREVIEW_DATE_TIME = 0xC71B + private const val RAW_IMAGE_DIGEST = 0xC71C + private const val ORIGINAL_RAW_FILE_DIGEST = 0xC71D + private const val SUB_TILE_BLOCK_SIZE = 0xC71E + private const val ROW_INTERLEAVE_FACTOR = 0xC71F + private const val PROFILE_LOOK_TABLE_DIMS = 0xC725 + private const val PROFILE_LOOK_TABLE_DATA = 0xC726 + private const val OPCODE_LIST_1 = 0xC740 + private const val OPCODE_LIST_2 = 0xC741 + private const val OPCODE_LIST_3 = 0xC74E + private const val NOISE_PROFILE = 0xC761 + private const val ORIGINAL_DEFAULT_FINAL_SIZE = 0xC791 + private const val ORIGINAL_BEST_QUALITY_FINAL_SIZE = 0xC792 + private const val ORIGINAL_DEFAULT_CROP_SIZE = 0xC793 + private const val PROFILE_HUE_SAT_MAP_ENCODING = 0xC7A3 + private const val PROFILE_LOOK_TABLE_ENCODING = 0xC7A4 + private const val BASELINE_EXPOSURE_OFFSET = 0xC7A5 + private const val DEFAULT_BLACK_RENDER = 0xC7A6 + private const val NEW_RAW_IMAGE_DIGEST = 0xC7A7 + private const val RAW_TO_PREVIEW_GAIN = 0xC7A8 + private const val DEFAULT_USER_CROP = 0xC7B5 + private const val DEPTH_FORMAT = 0xC7E9 + private const val DEPTH_NEAR = 0xC7EA + private const val DEPTH_FAR = 0xC7EB + private const val DEPTH_UNITS = 0xC7EC + private const val DEPTH_MEASURE_TYPE = 0xC7ED + private const val ENHANCE_PARAMS = 0xC7EE + private const val PROFILE_GAIN_TABLE_MAP = 0xCD2D + private const val SEMANTIC_NAME = 0xCD2E + private const val SEMANTIC_INSTANCE_ID = 0xCD30 + private const val CALIBRATION_ILLUMINANT_3 = 0xCD31 + private const val CAMERA_CALIBRATION_3 = 0xCD32 + private const val COLOR_MATRIX_3 = 0xCD33 + private const val FORWARD_MATRIX_3 = 0xCD34 + private const val ILLUMINANT_DATA_1 = 0xCD35 + private const val ILLUMINANT_DATA_2 = 0xCD36 + private const val ILLUMINANT_DATA_3 = 0xCD37 + private const val MASK_SUB_AREA = 0xCD38 + private const val PROFILE_HUE_SAT_MAP_DATA_3 = 0xCD39 + private const val REDUCTION_MATRIX_3 = 0xCD3A + private const val RGB_TABLES = 0xCD3F + + val tagNameMap = hashMapOf( + DNG_VERSION to "DNG Version", + DNG_BACKWARD_VERSION to "DNG Backward Version", + UNIQUE_CAMERA_MODEL to "Unique Camera Model", + LOCALIZED_CAMERA_MODEL to "Localized Camera Model", + CFA_PLANE_COLOR to "CFA Plane Color", + CFA_LAYOUT to "CFA Layout", + LINEARIZATION_TABLE to "Linearization Table", + BLACK_LEVEL_REPEAT_DIM to "Black Level Repeat Dim", + BLACK_LEVEL to "Black Level", + BLACK_LEVEL_DELTA_H to "Black Level Delta H", + BLACK_LEVEL_DELTA_V to "Black Level Delta V", + WHITE_LEVEL to "White Level", + DEFAULT_SCALE to "Default Scale", + DEFAULT_CROP_ORIGIN to "Default Crop Origin", + DEFAULT_CROP_SIZE to "Default Crop Size", + COLOR_MATRIX_1 to "Color Matrix 1", + COLOR_MATRIX_2 to "Color Matrix 2", + CAMERA_CALIBRATION_1 to "Camera Calibration 1", + CAMERA_CALIBRATION_2 to "Camera Calibration 2", + REDUCTION_MATRIX_1 to "Reduction Matrix 1", + REDUCTION_MATRIX_2 to "Reduction Matrix 2", + ANALOG_BALANCE to "Analog Balance", + AS_SHOT_NEUTRAL to "As Shot Neutral", + AS_SHOT_WHITE_XY to "As Shot White XY", + BASELINE_EXPOSURE to "Baseline Exposure", + BASELINE_NOISE to "Baseline Noise", + BASELINE_SHARPNESS to "Baseline Sharpness", + BAYER_GREEN_SPLIT to "Bayer Green Split", + LINEAR_RESPONSE_LIMIT to "Linear Response Limit", + CAMERA_SERIAL_NUMBER to "Camera Serial Number", + LENS_INFO to "Lens Info", + CHROMA_BLUR_RADIUS to "Chroma Blur Radius", + ANTI_ALIAS_STRENGTH to "Anti Alias Strength", + SHADOW_SCALE to "Shadow Scale", + DNG_PRIVATE_DATA to "DNG Private Data", + MAKER_NOTE_SAFETY to "Maker Note Safety", + CALIBRATION_ILLUMINANT_1 to "Calibration Illuminant 1", + CALIBRATION_ILLUMINANT_2 to "Calibration Illuminant 2", + BEST_QUALITY_SCALE to "Best Quality Scale", + RAW_DATA_UNIQUE_ID to "Raw Data Unique ID", + ORIGINAL_RAW_FILE_NAME to "Original Raw File Name", + ORIGINAL_RAW_FILE_DATA to "Original Raw File Data", + ACTIVE_AREA to "Active Area", + MASKED_AREAS to "Masked Areas", + AS_SHOT_ICC_PROFILE to "As Shot ICC Profile", + AS_SHOT_PRE_PROFILE_MATRIX to "As Shot Pre Profile Matrix", + CURRENT_ICC_PROFILE to "Current ICC Profile", + CURRENT_PRE_PROFILE_MATRIX to "Current Pre Profile Matrix", + COLORIMETRIC_REFERENCE to "Colorimetric Reference", + CAMERA_CALIBRATION_SIGNATURE to "Camera Calibration Signature", + PROFILE_CALIBRATION_SIGNATURE to "Profile Calibration Signature", + EXTRA_CAMERA_PROFILES to "Extra Camera Profiles", + AS_SHOT_PROFILE_NAME to "As Shot Profile Name", + NOISE_REDUCTION_APPLIED to "Noise Reduction Applied", + PROFILE_NAME to "Profile Name", + PROFILE_HUE_SAT_MAP_DIMS to "Profile Hue Sat Map Dims", + PROFILE_HUE_SAT_MAP_DATA_1 to "Profile Hue Sat Map Data 1", + PROFILE_HUE_SAT_MAP_DATA_2 to "Profile Hue Sat Map Data 2", + PROFILE_TONE_CURVE to "Profile Tone Curve", + PROFILE_EMBED_POLICY to "Profile Embed Policy", + PROFILE_COPYRIGHT to "Profile Copyright", + FORWARD_MATRIX_1 to "Forward Matrix 1", + FORWARD_MATRIX_2 to "Forward Matrix 2", + PREVIEW_APPLICATION_NAME to "Preview Application Name", + PREVIEW_APPLICATION_VERSION to "Preview Application Version", + PREVIEW_SETTINGS_NAME to "Preview Settings Name", + PREVIEW_SETTINGS_DIGEST to "Preview Settings Digest", + PREVIEW_COLOR_SPACE to "Preview Color Space", + PREVIEW_DATE_TIME to "Preview Date Time", + RAW_IMAGE_DIGEST to "Raw Image Digest", + ORIGINAL_RAW_FILE_DIGEST to "Original Raw File Digest", + SUB_TILE_BLOCK_SIZE to "Sub Tile Block Size", + ROW_INTERLEAVE_FACTOR to "Row Interleave Factor", + PROFILE_LOOK_TABLE_DIMS to "Profile Look Table Dims", + PROFILE_LOOK_TABLE_DATA to "Profile Look Table Data", + OPCODE_LIST_1 to "Opcode List 1", + OPCODE_LIST_2 to "Opcode List 2", + OPCODE_LIST_3 to "Opcode List 3", + NOISE_PROFILE to "Noise Profile", + ORIGINAL_DEFAULT_FINAL_SIZE to "Original Default Final Size", + ORIGINAL_BEST_QUALITY_FINAL_SIZE to "Original Best Quality Final Size", + ORIGINAL_DEFAULT_CROP_SIZE to "Original Default Crop Size", + PROFILE_HUE_SAT_MAP_ENCODING to "Profile Hue Sat Map Encoding", + PROFILE_LOOK_TABLE_ENCODING to "Profile Look Table Encoding", + BASELINE_EXPOSURE_OFFSET to "Baseline Exposure Offset", + DEFAULT_BLACK_RENDER to "Default Black Render", + NEW_RAW_IMAGE_DIGEST to "New Raw Image Digest", + RAW_TO_PREVIEW_GAIN to "Raw To Preview Gain", + DEFAULT_USER_CROP to "Default User Crop", + DEPTH_FORMAT to "Depth Format", + DEPTH_NEAR to "Depth Near", + DEPTH_FAR to "Depth Far", + DEPTH_UNITS to "Depth Units", + DEPTH_MEASURE_TYPE to "Depth Measure Type", + ENHANCE_PARAMS to "Enhance Params", + PROFILE_GAIN_TABLE_MAP to "Profile Gain Table Map", + SEMANTIC_NAME to "Semantic Name", + SEMANTIC_INSTANCE_ID to "Semantic Instance ID", + CALIBRATION_ILLUMINANT_3 to "Calibration Illuminant 3", + CAMERA_CALIBRATION_3 to "Camera Calibration 3", + COLOR_MATRIX_3 to "Color Matrix 3", + FORWARD_MATRIX_3 to "Forward Matrix 3", + ILLUMINANT_DATA_1 to "Illuminant Data 1", + ILLUMINANT_DATA_2 to "Illuminant Data 2", + ILLUMINANT_DATA_3 to "Illuminant Data 3", + MASK_SUB_AREA to "Mask Sub Area", + PROFILE_HUE_SAT_MAP_DATA_3 to "Profile Hue Sat Map Data 3", + REDUCTION_MATRIX_3 to "Reduction Matrix 3", + RGB_TABLES to "RGB Tables", + ) + + val tags = tagNameMap.keys +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/ExifInterfaceHelper.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/ExifInterfaceHelper.kt new file mode 100644 index 0000000..2f9b652 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/ExifInterfaceHelper.kt @@ -0,0 +1,420 @@ +package deckers.thibault.aves.metadata + +import android.util.Log +import com.drew.lang.Rational +import com.drew.metadata.Directory +import com.drew.metadata.exif.ExifDirectoryBase +import com.drew.metadata.exif.ExifIFD0Directory +import com.drew.metadata.exif.ExifThumbnailDirectory +import com.drew.metadata.exif.GpsDirectory +import com.drew.metadata.exif.PanasonicRawIFD0Directory +import com.drew.metadata.exif.makernotes.OlympusCameraSettingsMakernoteDirectory +import com.drew.metadata.exif.makernotes.OlympusImageProcessingMakernoteDirectory +import com.drew.metadata.exif.makernotes.OlympusMakernoteDirectory +import deckers.thibault.aves.utils.LogUtils +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import kotlin.math.abs +import kotlin.math.floor +import kotlin.math.roundToLong +import androidx.exifinterface.media.ExifInterfaceFork as ExifInterface + +object ExifInterfaceHelper { + private val LOG_TAG = LogUtils.createTag() + val DATETIME_FORMAT = SimpleDateFormat("yyyy:MM:dd HH:mm:ss", Locale.ROOT) + val GPS_DATE_FORMAT = SimpleDateFormat("yyyy:MM:dd", Locale.ROOT) + val GPS_TIME_FORMAT = SimpleDateFormat("HH:mm:ss", Locale.ROOT) + + private const val PRECISION_ERROR_TOLERANCE = 1e-10 + + // ExifInterface always states it has the following attributes + // and returns "0" instead of "null" when they are actually missing + private val neverNullTags = listOf( + ExifInterface.TAG_IMAGE_LENGTH, + ExifInterface.TAG_IMAGE_WIDTH, + ExifInterface.TAG_LIGHT_SOURCE, + ExifInterface.TAG_ORIENTATION, + ) + + private fun isNeverNull(tag: String): Boolean = neverNullTags.contains(tag) + + private val baseTags: Map = mapOf( + ExifInterface.TAG_APERTURE_VALUE to TagMapper(ExifDirectoryBase.TAG_APERTURE, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_ARTIST to TagMapper(ExifDirectoryBase.TAG_ARTIST, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_BITS_PER_SAMPLE to TagMapper(ExifDirectoryBase.TAG_BITS_PER_SAMPLE, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_BODY_SERIAL_NUMBER to TagMapper(ExifDirectoryBase.TAG_BODY_SERIAL_NUMBER, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_BRIGHTNESS_VALUE to TagMapper(ExifDirectoryBase.TAG_BRIGHTNESS_VALUE, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_CAMERA_OWNER_NAME to TagMapper(ExifDirectoryBase.TAG_CAMERA_OWNER_NAME, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_CFA_PATTERN to TagMapper(ExifDirectoryBase.TAG_CFA_PATTERN, DirType.EXIF_IFD0, TagFormat.BYTE), // spec format: UNDEFINED, e.g. [Red,Green][Green,Blue] + ExifInterface.TAG_COLOR_SPACE to TagMapper(ExifDirectoryBase.TAG_COLOR_SPACE, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_COMPONENTS_CONFIGURATION to TagMapper(ExifDirectoryBase.TAG_COMPONENTS_CONFIGURATION, DirType.EXIF_IFD0, TagFormat.BYTE), // spec format: UNDEFINED, e.g. [Y,Cb,Cr] + ExifInterface.TAG_COMPRESSED_BITS_PER_PIXEL to TagMapper(ExifDirectoryBase.TAG_COMPRESSED_AVERAGE_BITS_PER_PIXEL, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_COMPRESSION to TagMapper(ExifDirectoryBase.TAG_COMPRESSION, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_CONTRAST to TagMapper(ExifDirectoryBase.TAG_CONTRAST, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_COPYRIGHT to TagMapper(ExifDirectoryBase.TAG_COPYRIGHT, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_CUSTOM_RENDERED to TagMapper(ExifDirectoryBase.TAG_CUSTOM_RENDERED, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_DATETIME to TagMapper(ExifDirectoryBase.TAG_DATETIME, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_DATETIME_DIGITIZED to TagMapper(ExifDirectoryBase.TAG_DATETIME_DIGITIZED, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_DATETIME_ORIGINAL to TagMapper(ExifDirectoryBase.TAG_DATETIME_ORIGINAL, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_DEVICE_SETTING_DESCRIPTION to TagMapper(ExifDirectoryBase.TAG_DEVICE_SETTING_DESCRIPTION, DirType.EXIF_IFD0, TagFormat.UNDEFINED), + ExifInterface.TAG_DIGITAL_ZOOM_RATIO to TagMapper(ExifDirectoryBase.TAG_DIGITAL_ZOOM_RATIO, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_EXIF_VERSION to TagMapper(ExifDirectoryBase.TAG_EXIF_VERSION, DirType.EXIF_IFD0, TagFormat.UNDEFINED), + ExifInterface.TAG_EXPOSURE_BIAS_VALUE to TagMapper(ExifDirectoryBase.TAG_EXPOSURE_BIAS, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_EXPOSURE_INDEX to TagMapper(ExifDirectoryBase.TAG_EXPOSURE_INDEX, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_EXPOSURE_MODE to TagMapper(ExifDirectoryBase.TAG_EXPOSURE_MODE, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_EXPOSURE_PROGRAM to TagMapper(ExifDirectoryBase.TAG_EXPOSURE_PROGRAM, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_EXPOSURE_TIME to TagMapper(ExifDirectoryBase.TAG_EXPOSURE_TIME, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_FILE_SOURCE to TagMapper(ExifDirectoryBase.TAG_FILE_SOURCE, DirType.EXIF_IFD0, TagFormat.SHORT), // spec format: UNDEFINED + ExifInterface.TAG_FLASH to TagMapper(ExifDirectoryBase.TAG_FLASH, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_FLASHPIX_VERSION to TagMapper(ExifDirectoryBase.TAG_FLASHPIX_VERSION, DirType.EXIF_IFD0, TagFormat.UNDEFINED), + ExifInterface.TAG_FLASH_ENERGY to TagMapper(ExifDirectoryBase.TAG_FLASH_ENERGY, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_FOCAL_LENGTH to TagMapper(ExifDirectoryBase.TAG_FOCAL_LENGTH, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_FOCAL_LENGTH_IN_35MM_FILM to TagMapper(ExifDirectoryBase.TAG_35MM_FILM_EQUIV_FOCAL_LENGTH, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_FOCAL_PLANE_RESOLUTION_UNIT to TagMapper(ExifDirectoryBase.TAG_FOCAL_PLANE_RESOLUTION_UNIT, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_FOCAL_PLANE_X_RESOLUTION to TagMapper(ExifDirectoryBase.TAG_FOCAL_PLANE_X_RESOLUTION, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_FOCAL_PLANE_Y_RESOLUTION to TagMapper(ExifDirectoryBase.TAG_FOCAL_PLANE_Y_RESOLUTION, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_F_NUMBER to TagMapper(ExifDirectoryBase.TAG_FNUMBER, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_GAIN_CONTROL to TagMapper(ExifDirectoryBase.TAG_GAIN_CONTROL, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_GAMMA to TagMapper(ExifDirectoryBase.TAG_GAMMA, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_IMAGE_DESCRIPTION to TagMapper(ExifDirectoryBase.TAG_IMAGE_DESCRIPTION, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_IMAGE_LENGTH to TagMapper(ExifDirectoryBase.TAG_IMAGE_HEIGHT, DirType.EXIF_IFD0, TagFormat.LONG), + ExifInterface.TAG_IMAGE_UNIQUE_ID to TagMapper(ExifDirectoryBase.TAG_IMAGE_UNIQUE_ID, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_IMAGE_WIDTH to TagMapper(ExifDirectoryBase.TAG_IMAGE_WIDTH, DirType.EXIF_IFD0, TagFormat.LONG), + ExifInterface.TAG_INTEROPERABILITY_INDEX to TagMapper(ExifDirectoryBase.TAG_INTEROP_INDEX, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_ISO_SPEED to TagMapper(ExifDirectoryBase.TAG_ISO_SPEED, DirType.EXIF_IFD0, TagFormat.LONG), + ExifInterface.TAG_ISO_SPEED_LATITUDE_YYY to TagMapper(ExifDirectoryBase.TAG_ISO_SPEED_LATITUDE_YYY, DirType.EXIF_IFD0, TagFormat.LONG), + ExifInterface.TAG_ISO_SPEED_LATITUDE_ZZZ to TagMapper(ExifDirectoryBase.TAG_ISO_SPEED_LATITUDE_ZZZ, DirType.EXIF_IFD0, TagFormat.LONG), + ExifInterface.TAG_LENS_MAKE to TagMapper(ExifDirectoryBase.TAG_LENS_MAKE, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_LENS_MODEL to TagMapper(ExifDirectoryBase.TAG_LENS_MODEL, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_LENS_SERIAL_NUMBER to TagMapper(ExifDirectoryBase.TAG_LENS_SERIAL_NUMBER, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_LENS_SPECIFICATION to TagMapper(ExifDirectoryBase.TAG_LENS_SPECIFICATION, DirType.EXIF_IFD0, TagFormat.RATIONAL_ARRAY), + ExifInterface.TAG_LIGHT_SOURCE to TagMapper(ExifDirectoryBase.TAG_WHITE_BALANCE, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_MAKE to TagMapper(ExifDirectoryBase.TAG_MAKE, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_MAKER_NOTE to TagMapper(ExifDirectoryBase.TAG_MAKERNOTE, DirType.EXIF_IFD0, TagFormat.UNDEFINED), + ExifInterface.TAG_MAX_APERTURE_VALUE to TagMapper(ExifDirectoryBase.TAG_MAX_APERTURE, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_METERING_MODE to TagMapper(ExifDirectoryBase.TAG_METERING_MODE, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_MODEL to TagMapper(ExifDirectoryBase.TAG_MODEL, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_NEW_SUBFILE_TYPE to TagMapper(ExifDirectoryBase.TAG_NEW_SUBFILE_TYPE, DirType.EXIF_IFD0, TagFormat.LONG), + ExifInterface.TAG_OECF to TagMapper(ExifDirectoryBase.TAG_OPTO_ELECTRIC_CONVERSION_FUNCTION, DirType.EXIF_IFD0, TagFormat.UNDEFINED), + ExifInterface.TAG_OFFSET_TIME to TagMapper(ExifDirectoryBase.TAG_TIME_ZONE, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_OFFSET_TIME_DIGITIZED to TagMapper(ExifDirectoryBase.TAG_TIME_ZONE_DIGITIZED, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_OFFSET_TIME_ORIGINAL to TagMapper(ExifDirectoryBase.TAG_TIME_ZONE_ORIGINAL, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_ORIENTATION to TagMapper(ExifDirectoryBase.TAG_ORIENTATION, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_PHOTOGRAPHIC_SENSITIVITY to TagMapper(ExifDirectoryBase.TAG_ISO_EQUIVALENT, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_PHOTOMETRIC_INTERPRETATION to TagMapper(ExifDirectoryBase.TAG_PHOTOMETRIC_INTERPRETATION, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_PIXEL_X_DIMENSION to TagMapper(ExifDirectoryBase.TAG_EXIF_IMAGE_WIDTH, DirType.EXIF_IFD0, TagFormat.LONG), + ExifInterface.TAG_PIXEL_Y_DIMENSION to TagMapper(ExifDirectoryBase.TAG_EXIF_IMAGE_HEIGHT, DirType.EXIF_IFD0, TagFormat.LONG), + ExifInterface.TAG_PLANAR_CONFIGURATION to TagMapper(ExifDirectoryBase.TAG_PLANAR_CONFIGURATION, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_PRIMARY_CHROMATICITIES to TagMapper(ExifDirectoryBase.TAG_PRIMARY_CHROMATICITIES, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_RECOMMENDED_EXPOSURE_INDEX to TagMapper(ExifDirectoryBase.TAG_RECOMMENDED_EXPOSURE_INDEX, DirType.EXIF_IFD0, TagFormat.LONG), + ExifInterface.TAG_REFERENCE_BLACK_WHITE to TagMapper(ExifDirectoryBase.TAG_REFERENCE_BLACK_WHITE, DirType.EXIF_IFD0, TagFormat.RATIONAL_ARRAY), + ExifInterface.TAG_RELATED_SOUND_FILE to TagMapper(ExifDirectoryBase.TAG_RELATED_SOUND_FILE, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_RESOLUTION_UNIT to TagMapper(ExifDirectoryBase.TAG_RESOLUTION_UNIT, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_ROWS_PER_STRIP to TagMapper(ExifDirectoryBase.TAG_ROWS_PER_STRIP, DirType.EXIF_IFD0, TagFormat.LONG), + ExifInterface.TAG_SAMPLES_PER_PIXEL to TagMapper(ExifDirectoryBase.TAG_SAMPLES_PER_PIXEL, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_SATURATION to TagMapper(ExifDirectoryBase.TAG_SATURATION, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_SCENE_CAPTURE_TYPE to TagMapper(ExifDirectoryBase.TAG_SCENE_CAPTURE_TYPE, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_SCENE_TYPE to TagMapper(ExifDirectoryBase.TAG_SCENE_TYPE, DirType.EXIF_IFD0, TagFormat.SHORT), // spec format: UNDEFINED + ExifInterface.TAG_SENSING_METHOD to TagMapper(ExifDirectoryBase.TAG_SENSING_METHOD, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_SENSITIVITY_TYPE to TagMapper(ExifDirectoryBase.TAG_SENSITIVITY_TYPE, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_SHARPNESS to TagMapper(ExifDirectoryBase.TAG_SHARPNESS, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_SHUTTER_SPEED_VALUE to TagMapper(ExifDirectoryBase.TAG_SHUTTER_SPEED, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_SOFTWARE to TagMapper(ExifDirectoryBase.TAG_SOFTWARE, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_SPATIAL_FREQUENCY_RESPONSE to TagMapper(ExifDirectoryBase.TAG_SPATIAL_FREQ_RESPONSE, DirType.EXIF_IFD0, TagFormat.UNDEFINED), + ExifInterface.TAG_SPECTRAL_SENSITIVITY to TagMapper(ExifDirectoryBase.TAG_SPECTRAL_SENSITIVITY, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_STANDARD_OUTPUT_SENSITIVITY to TagMapper(ExifDirectoryBase.TAG_STANDARD_OUTPUT_SENSITIVITY, DirType.EXIF_IFD0, TagFormat.LONG), + ExifInterface.TAG_STRIP_BYTE_COUNTS to TagMapper(ExifDirectoryBase.TAG_STRIP_BYTE_COUNTS, DirType.EXIF_IFD0, TagFormat.LONG), + ExifInterface.TAG_STRIP_OFFSETS to TagMapper(ExifDirectoryBase.TAG_STRIP_OFFSETS, DirType.EXIF_IFD0, TagFormat.LONG), + ExifInterface.TAG_SUBFILE_TYPE to TagMapper(ExifDirectoryBase.TAG_SUBFILE_TYPE, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_SUBJECT_AREA to TagMapper(ExifDirectoryBase.TAG_SUBJECT_LOCATION_TIFF_EP, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_SUBJECT_DISTANCE to TagMapper(ExifDirectoryBase.TAG_SUBJECT_DISTANCE, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_SUBJECT_DISTANCE_RANGE to TagMapper(ExifDirectoryBase.TAG_SUBJECT_DISTANCE_RANGE, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_SUBJECT_LOCATION to TagMapper(ExifDirectoryBase.TAG_SUBJECT_LOCATION, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_SUBSEC_TIME to TagMapper(ExifDirectoryBase.TAG_SUBSECOND_TIME, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_SUBSEC_TIME_DIGITIZED to TagMapper(ExifDirectoryBase.TAG_SUBSECOND_TIME_DIGITIZED, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_SUBSEC_TIME_ORIGINAL to TagMapper(ExifDirectoryBase.TAG_SUBSECOND_TIME_ORIGINAL, DirType.EXIF_IFD0, TagFormat.ASCII), + ExifInterface.TAG_THUMBNAIL_IMAGE_LENGTH to TagMapper(ExifDirectoryBase.TAG_IMAGE_HEIGHT, DirType.EXIF_IFD0, TagFormat.LONG), // IFD_THUMBNAIL_TAGS 0x0101 + ExifInterface.TAG_THUMBNAIL_IMAGE_WIDTH to TagMapper(ExifDirectoryBase.TAG_IMAGE_WIDTH, DirType.EXIF_IFD0, TagFormat.LONG), // IFD_THUMBNAIL_TAGS 0x0100 + ExifInterface.TAG_TRANSFER_FUNCTION to TagMapper(ExifDirectoryBase.TAG_TRANSFER_FUNCTION, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_USER_COMMENT to TagMapper(ExifDirectoryBase.TAG_USER_COMMENT, DirType.EXIF_IFD0, TagFormat.COMMENT), + ExifInterface.TAG_WHITE_BALANCE to TagMapper(ExifDirectoryBase.TAG_WHITE_BALANCE, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_WHITE_POINT to TagMapper(ExifDirectoryBase.TAG_WHITE_POINT, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_X_RESOLUTION to TagMapper(ExifDirectoryBase.TAG_X_RESOLUTION, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_Y_CB_CR_COEFFICIENTS to TagMapper(ExifDirectoryBase.TAG_YCBCR_COEFFICIENTS, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ExifInterface.TAG_Y_CB_CR_POSITIONING to TagMapper(ExifDirectoryBase.TAG_YCBCR_POSITIONING, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_Y_CB_CR_SUB_SAMPLING to TagMapper(ExifDirectoryBase.TAG_YCBCR_SUBSAMPLING, DirType.EXIF_IFD0, TagFormat.SHORT), + ExifInterface.TAG_Y_RESOLUTION to TagMapper(ExifDirectoryBase.TAG_Y_RESOLUTION, DirType.EXIF_IFD0, TagFormat.RATIONAL), + ) + + private val thumbnailTags: Map = mapOf( + ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT to TagMapper(ExifThumbnailDirectory.TAG_THUMBNAIL_OFFSET, DirType.EXIF_THUMBNAIL, TagFormat.LONG), // IFD_TIFF_TAGS or IFD_THUMBNAIL_TAGS 0x0201 + ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH to TagMapper(ExifThumbnailDirectory.TAG_THUMBNAIL_LENGTH, DirType.EXIF_THUMBNAIL, TagFormat.LONG), // IFD_TIFF_TAGS or IFD_THUMBNAIL_TAGS 0x0202 + ) + + private val gpsTags: Map = mapOf( + ExifInterface.TAG_GPS_ALTITUDE to TagMapper(GpsDirectory.TAG_ALTITUDE, DirType.GPS, TagFormat.RATIONAL), + ExifInterface.TAG_GPS_ALTITUDE_REF to TagMapper(GpsDirectory.TAG_ALTITUDE_REF, DirType.GPS, TagFormat.BYTE), + ExifInterface.TAG_GPS_AREA_INFORMATION to TagMapper(GpsDirectory.TAG_AREA_INFORMATION, DirType.GPS, TagFormat.COMMENT), + ExifInterface.TAG_GPS_DATESTAMP to TagMapper(GpsDirectory.TAG_DATE_STAMP, DirType.GPS, TagFormat.ASCII), + ExifInterface.TAG_GPS_DEST_BEARING to TagMapper(GpsDirectory.TAG_DEST_BEARING, DirType.GPS, TagFormat.RATIONAL), + ExifInterface.TAG_GPS_DEST_BEARING_REF to TagMapper(GpsDirectory.TAG_DEST_BEARING_REF, DirType.GPS, TagFormat.ASCII), + ExifInterface.TAG_GPS_DEST_DISTANCE to TagMapper(GpsDirectory.TAG_DEST_DISTANCE, DirType.GPS, TagFormat.RATIONAL), + ExifInterface.TAG_GPS_DEST_DISTANCE_REF to TagMapper(GpsDirectory.TAG_DEST_DISTANCE_REF, DirType.GPS, TagFormat.ASCII), + ExifInterface.TAG_GPS_DEST_LATITUDE to TagMapper(GpsDirectory.TAG_DEST_LATITUDE, DirType.GPS, TagFormat.RATIONAL_ARRAY), + ExifInterface.TAG_GPS_DEST_LATITUDE_REF to TagMapper(GpsDirectory.TAG_DEST_LATITUDE_REF, DirType.GPS, TagFormat.ASCII), + ExifInterface.TAG_GPS_DEST_LONGITUDE to TagMapper(GpsDirectory.TAG_DEST_LONGITUDE, DirType.GPS, TagFormat.RATIONAL_ARRAY), + ExifInterface.TAG_GPS_DEST_LONGITUDE_REF to TagMapper(GpsDirectory.TAG_DEST_LONGITUDE_REF, DirType.GPS, TagFormat.ASCII), + ExifInterface.TAG_GPS_DIFFERENTIAL to TagMapper(GpsDirectory.TAG_DIFFERENTIAL, DirType.GPS, TagFormat.SHORT), + ExifInterface.TAG_GPS_DOP to TagMapper(GpsDirectory.TAG_DOP, DirType.GPS, TagFormat.RATIONAL), + ExifInterface.TAG_GPS_H_POSITIONING_ERROR to TagMapper(GpsDirectory.TAG_H_POSITIONING_ERROR, DirType.GPS, TagFormat.RATIONAL), + ExifInterface.TAG_GPS_IMG_DIRECTION to TagMapper(GpsDirectory.TAG_IMG_DIRECTION, DirType.GPS, TagFormat.RATIONAL), + ExifInterface.TAG_GPS_IMG_DIRECTION_REF to TagMapper(GpsDirectory.TAG_IMG_DIRECTION_REF, DirType.GPS, TagFormat.ASCII), + ExifInterface.TAG_GPS_LATITUDE to TagMapper(GpsDirectory.TAG_LATITUDE, DirType.GPS, TagFormat.RATIONAL_ARRAY), + ExifInterface.TAG_GPS_LATITUDE_REF to TagMapper(GpsDirectory.TAG_LATITUDE_REF, DirType.GPS, TagFormat.ASCII), + ExifInterface.TAG_GPS_LONGITUDE to TagMapper(GpsDirectory.TAG_LONGITUDE, DirType.GPS, TagFormat.RATIONAL_ARRAY), + ExifInterface.TAG_GPS_LONGITUDE_REF to TagMapper(GpsDirectory.TAG_LONGITUDE_REF, DirType.GPS, TagFormat.ASCII), + ExifInterface.TAG_GPS_MAP_DATUM to TagMapper(GpsDirectory.TAG_MAP_DATUM, DirType.GPS, TagFormat.ASCII), + ExifInterface.TAG_GPS_MEASURE_MODE to TagMapper(GpsDirectory.TAG_MEASURE_MODE, DirType.GPS, TagFormat.ASCII), + ExifInterface.TAG_GPS_PROCESSING_METHOD to TagMapper(GpsDirectory.TAG_PROCESSING_METHOD, DirType.GPS, TagFormat.COMMENT), + ExifInterface.TAG_GPS_SATELLITES to TagMapper(GpsDirectory.TAG_SATELLITES, DirType.GPS, TagFormat.ASCII), + ExifInterface.TAG_GPS_SPEED to TagMapper(GpsDirectory.TAG_SPEED, DirType.GPS, TagFormat.RATIONAL), + ExifInterface.TAG_GPS_SPEED_REF to TagMapper(GpsDirectory.TAG_SPEED_REF, DirType.GPS, TagFormat.ASCII), + ExifInterface.TAG_GPS_STATUS to TagMapper(GpsDirectory.TAG_STATUS, DirType.GPS, TagFormat.ASCII), + ExifInterface.TAG_GPS_TIMESTAMP to TagMapper(GpsDirectory.TAG_TIME_STAMP, DirType.GPS, TagFormat.RATIONAL_ARRAY), + ExifInterface.TAG_GPS_TRACK to TagMapper(GpsDirectory.TAG_TRACK, DirType.GPS, TagFormat.RATIONAL), + ExifInterface.TAG_GPS_TRACK_REF to TagMapper(GpsDirectory.TAG_TRACK_REF, DirType.GPS, TagFormat.ASCII), + ExifInterface.TAG_GPS_VERSION_ID to TagMapper(GpsDirectory.TAG_VERSION_ID, DirType.GPS, TagFormat.BYTE), + ) + + private val xmpTags: Map = mapOf( + ExifInterface.TAG_XMP to null, // IFD_TIFF_TAGS 0x02BC + ) + + private val rawTags: Map = mapOf( + // DNG + ExifInterface.TAG_DEFAULT_CROP_SIZE to null, // IFD_EXIF_TAGS 0xC620 + ExifInterface.TAG_DNG_VERSION to null, // IFD_EXIF_TAGS 0xC612 + // ORF + ExifInterface.TAG_ORF_ASPECT_FRAME to TagMapper(OlympusImageProcessingMakernoteDirectory.TagAspectFrame, DirType.OIPM, TagFormat.LONG), // ORF_IMAGE_PROCESSING_TAGS 0x1113 + ExifInterface.TAG_ORF_PREVIEW_IMAGE_LENGTH to TagMapper(OlympusCameraSettingsMakernoteDirectory.TagPreviewImageLength, DirType.OCSM, TagFormat.LONG), // ORF_CAMERA_SETTINGS_TAGS 0x0102 + ExifInterface.TAG_ORF_PREVIEW_IMAGE_START to TagMapper(OlympusCameraSettingsMakernoteDirectory.TagPreviewImageStart, DirType.OCSM, TagFormat.LONG), // ORF_CAMERA_SETTINGS_TAGS 0x0101 + ExifInterface.TAG_ORF_THUMBNAIL_IMAGE to TagMapper(OlympusMakernoteDirectory.TAG_THUMBNAIL_IMAGE, DirType.OM, TagFormat.UNDEFINED), // ORF_MAKER_NOTE_TAGS 0x0100 + // RW2 + ExifInterface.TAG_RW2_ISO to TagMapper(PanasonicRawIFD0Directory.TagIso, DirType.PRIFD0, TagFormat.LONG), // IFD_TIFF_TAGS 0x0017 + ExifInterface.TAG_RW2_JPG_FROM_RAW to TagMapper(PanasonicRawIFD0Directory.TagJpgFromRaw, DirType.PRIFD0, TagFormat.UNDEFINED), // IFD_TIFF_TAGS 0x002E + ExifInterface.TAG_RW2_SENSOR_BOTTOM_BORDER to TagMapper(PanasonicRawIFD0Directory.TagSensorBottomBorder, DirType.PRIFD0, TagFormat.LONG), // IFD_TIFF_TAGS 0x0006 + ExifInterface.TAG_RW2_SENSOR_LEFT_BORDER to TagMapper(PanasonicRawIFD0Directory.TagSensorLeftBorder, DirType.PRIFD0, TagFormat.LONG), // IFD_TIFF_TAGS 0x0005 + ExifInterface.TAG_RW2_SENSOR_RIGHT_BORDER to TagMapper(PanasonicRawIFD0Directory.TagSensorRightBorder, DirType.PRIFD0, TagFormat.LONG), // IFD_TIFF_TAGS 0x0007 + ExifInterface.TAG_RW2_SENSOR_TOP_BORDER to TagMapper(PanasonicRawIFD0Directory.TagSensorTopBorder, DirType.PRIFD0, TagFormat.LONG), // IFD_TIFF_TAGS 0x0004 + ) + + // list of known ExifInterface tags (as of androidx.exifinterface:exifinterface:1.3.0) + // mapped to metadata-extractor tags (as of v2.14.0) + val allTags: Map = hashMapOf( + ).apply { + putAll(baseTags) + putAll(thumbnailTags) + putAll(gpsTags) + putAll(xmpTags) + putAll(rawTags) + } + + fun describeAll(exif: ExifInterface): Map> { + // initialize metadata-extractor directories that we will fill + // by tags converted from the ExifInterface attributes + // so that we can rely on metadata-extractor descriptions + val dirs = DirType.entries.associateWith { it.createDirectory() } + + // exclude Exif directory when it only includes image size + val isUselessExif = fun(it: Map): Boolean { + return it.size == 2 && it.containsKey("Image Height") && it.containsKey("Image Width") + } + + return HashMap>().apply { + put("Exif", describeDir(exif, dirs, baseTags).takeUnless(isUselessExif) ?: hashMapOf()) + put("Exif Thumbnail", describeDir(exif, dirs, thumbnailTags)) + put(Metadata.DIR_GPS, describeDir(exif, dirs, gpsTags)) + put(Metadata.DIR_XMP, describeDir(exif, dirs, xmpTags)) + put("Exif Raw", describeDir(exif, dirs, rawTags)) + }.filterValues { it.isNotEmpty() } + } + + private fun describeDir(exif: ExifInterface, metadataExtractorDirs: Map, tags: Map): Map { + val dirMap = HashMap() + + fillMetadataExtractorDir(exif, metadataExtractorDirs, tags) + + for ((exifInterfaceTag, mapper) in tags) { + if (exif.hasAttribute(exifInterfaceTag)) { + val value: String? = exif.getAttribute(exifInterfaceTag) + if (value != null && !(value == "0" && isNeverNull(exifInterfaceTag))) { + if (mapper != null) { + val dir = metadataExtractorDirs[mapper.dirType] ?: error("Directory type ${mapper.dirType} does not have a matching Directory instance") + val type = mapper.type + val tagName = dir.getTagName(type) + + val description: String? = dir.getDescription(type) + if (description != null) { + dirMap[tagName] = description + } else { + Log.w(LOG_TAG, "failed to get description for tag=$exifInterfaceTag value=$value") + dirMap[tagName] = value + } + } else { + dirMap[exifInterfaceTag] = value + } + } + } + } + return dirMap + } + + private fun fillMetadataExtractorDir(exif: ExifInterface, metadataExtractorDirs: Map, tags: Map) { + for ((exifInterfaceTag, mapper) in tags) { + if (exif.hasAttribute(exifInterfaceTag) && mapper != null) { + val value: String? = exif.getAttribute(exifInterfaceTag) + if (value != null && (value != "0" || !neverNullTags.contains(exifInterfaceTag))) { + val obj: Any? = when (mapper.format) { + TagFormat.ASCII, TagFormat.COMMENT, TagFormat.UNDEFINED -> value + TagFormat.BYTE -> exif.getAttributeBytes(exifInterfaceTag) + TagFormat.SHORT -> value.toShortOrNull() + TagFormat.LONG -> value.toLongOrNull() + TagFormat.RATIONAL -> toRational(value) + TagFormat.RATIONAL_ARRAY -> toRationalArray(value) + null -> null + } + if (obj != null) { + val dir = metadataExtractorDirs[mapper.dirType] ?: error("Directory type ${mapper.dirType} does not have a matching Directory instance") + dir.setObject(mapper.type, obj) + } + } + } + } + } + + private fun toRational(s: String?): Rational? { + s ?: return null + + // e.g. "12345/100" to Rational(12345, 100) + val parts = s.split("/") + if (parts.size == 2) { + val numerator = parts[0].toLongOrNull() ?: return null + val denominator = parts[1].toLongOrNull() ?: return null + return Rational(numerator, denominator) + } + + var d = s.toDoubleOrNull() ?: return null + if (d == 0.0) return Rational(0, 1) + + // e.g. "0.02564102564102564" to Rational(1, 39) + if (d < 1) { + val numerator = 1L + val f = numerator / d + val denominator = f.roundToLong() + if (abs(f - denominator) < PRECISION_ERROR_TOLERANCE) { + return Rational(numerator, denominator) + } + } + + // e.g. "123.45" to Rational(12345, 100) + var denominator: Long = 1 + while (d != floor(d)) { + denominator *= 10 + d *= 10 + if (denominator > 10000000000) { + // let's not get irrational + return null + } + } + val numerator: Long = d.roundToLong() + return Rational(numerator, denominator) + } + + private fun toRationalArray(s: String?): Array? { + s ?: return null + val list = s.split(",").mapNotNull { toRational(it) } + if (list.isEmpty()) return null + return list.toTypedArray() + } + + // extensions + + fun ExifInterface.getSafeInt(tag: String, acceptZero: Boolean = true, save: (value: Int) -> Unit) { + if (this.hasAttribute(tag)) { + val value = this.getAttributeInt(tag, 0) + if (acceptZero || value != 0) { + save(value) + } + } + } + + fun ExifInterface.getSafeDouble(tag: String, save: (value: Double) -> Unit) { + if (this.hasAttribute(tag)) { + val value = this.getAttributeDouble(tag, Double.NaN) + if (!value.isNaN()) { + save(value) + } + } + } + + fun ExifInterface.getSafeRational(tag: String, save: (value: Rational) -> Unit) { + if (this.hasAttribute(tag)) { + val value = toRational(this.getAttribute(tag)) + if (value != null) { + save(value) + } + } + } + + fun ExifInterface.getSafeDateMillis(tag: String, subSecTag: String?, save: (value: Long) -> Unit) { + if (this.hasAttribute(tag)) { + val dateString = this.getAttribute(tag) + if (dateString != null) { + try { + DATETIME_FORMAT.parse(dateString)?.let { date -> + var dateMillis = date.time + if (subSecTag != null && this.hasAttribute(subSecTag)) { + dateMillis += Metadata.parseSubSecond(this.getAttribute(subSecTag)) + } + save(dateMillis) + } + } catch (e: ParseException) { + Log.w(LOG_TAG, "failed to parse date=$dateString", e) + } + } + } + } +} + +enum class DirType { + EXIF_IFD0 { + override fun createDirectory() = ExifIFD0Directory() + }, + EXIF_THUMBNAIL { + override fun createDirectory() = ExifThumbnailDirectory(0) + }, + GPS { + override fun createDirectory() = GpsDirectory() + }, + OIPM { + override fun createDirectory() = OlympusImageProcessingMakernoteDirectory() + }, + OCSM { + override fun createDirectory() = OlympusCameraSettingsMakernoteDirectory() + }, + OM { + override fun createDirectory() = OlympusMakernoteDirectory() + }, + PRIFD0 { + override fun createDirectory() = PanasonicRawIFD0Directory() + }; + + abstract fun createDirectory(): Directory +} + +enum class TagFormat { + ASCII, COMMENT, BYTE, SHORT, LONG, RATIONAL, RATIONAL_ARRAY, UNDEFINED +} + +data class TagMapper(val type: Int, val dirType: DirType, val format: TagFormat?) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/ExifTags.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/ExifTags.kt new file mode 100644 index 0000000..723bac0 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/ExifTags.kt @@ -0,0 +1,61 @@ +package deckers.thibault.aves.metadata + +/* +Exif tags missing from `metadata-extractor` + +Photoshop +https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ +https://www.adobe.io/content/dam/udp/en/open/standards/tiff/TIFFphotoshop.pdf + */ +object ExifTags { + private const val PROCESSING_SOFTWARE = 0x000b + private const val X_POSITION = 0x011e + private const val Y_POSITION = 0x011f + private const val T4_OPTIONS = 0x0124 + private const val T6_OPTIONS = 0x0125 + private const val COLOR_MAP = 0x0140 + private const val EXTRA_SAMPLES = 0x0152 + private const val SAMPLE_FORMAT = 0x0153 + private const val SMIN_SAMPLE_VALUE = 0x0154 + private const val SMAX_SAMPLE_VALUE = 0x0155 + private const val SONY_RAW_FILE_TYPE = 0x7000 + private const val SONY_TONE_CURVE = 0x7010 + private const val MATTEING = 0x80e3 + + // sensing method (0x9217) redundant with sensing method (0xA217) + private const val SENSING_METHOD = 0x9217 + private const val IMAGE_SOURCE_DATA = 0x935c + private const val GDAL_METADATA = 0xa480 + private const val GDAL_NO_DATA = 0xa481 + + private val tagNameMap = hashMapOf( + PROCESSING_SOFTWARE to "Processing Software", + X_POSITION to "X Position", + Y_POSITION to "Y Position", + T4_OPTIONS to "T4 Options", + T6_OPTIONS to "T6 Options", + COLOR_MAP to "Color Map", + EXTRA_SAMPLES to "Extra Samples", + SAMPLE_FORMAT to "Sample Format", + SMIN_SAMPLE_VALUE to "S Min Sample Value", + SMAX_SAMPLE_VALUE to "S Max Sample Value", + SONY_RAW_FILE_TYPE to "Sony Raw File Type", + SONY_TONE_CURVE to "Sony Tone Curve", + MATTEING to "Matteing", + SENSING_METHOD to "Sensing Method (0x9217)", + IMAGE_SOURCE_DATA to "Image Source Data", + GDAL_METADATA to "GDAL Metadata", + GDAL_NO_DATA to "GDAL No Data", + ).apply { + putAll(DngTags.tagNameMap) + putAll(ExifGeoTiffTags.tagNameMap) + } + + fun isDngTag(tag: Int) = DngTags.tags.contains(tag) + + fun isGeoTiffTag(tag: Int) = ExifGeoTiffTags.tags.contains(tag) + + fun getTagName(tag: Int): String? { + return tagNameMap[tag] + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/GeoTiffTags.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/GeoTiffTags.kt new file mode 100644 index 0000000..e31cca4 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/GeoTiffTags.kt @@ -0,0 +1,116 @@ +package deckers.thibault.aves.metadata + +object GeoTiffKeys { + // not a standard tag + const val GEOTIFF_VERSION = 0 + + private const val MODEL_TYPE = 0x0400 + private const val RASTER_TYPE = 0x0401 + private const val CITATION = 0x0402 + private const val GEOG_TYPE = 0x0800 + private const val GEOG_CITATION = 0x0801 + private const val GEOG_GEODETIC_DATUM = 0x0802 + private const val GEOG_LINEAR_UNITS = 0x0804 + private const val GEOG_ANGULAR_UNITS = 0x0806 + private const val GEOG_ELLIPSOID = 0x0808 + private const val GEOG_SEMI_MAJOR_AXIS = 0x0809 + private const val GEOG_SEMI_MINOR_AXIS = 0x080a + private const val GEOG_INV_FLATTENING = 0x080b + private const val PROJ_CS_TYPE = 0x0c00 + private const val PROJ_CS_CITATION = 0x0c01 + private const val PROJECTION = 0x0c02 + private const val PROJ_COORD_TRANS = 0x0c03 + private const val PROJ_LINEAR_UNITS = 0x0c04 + private const val PROJ_STD_PARALLEL_1 = 0x0c06 + private const val PROJ_STD_PARALLEL_2 = 0x0c07 + private const val PROJ_NAT_ORIGIN_LONG = 0x0c08 + private const val PROJ_NAT_ORIGIN_LAT = 0x0c09 + private const val PROJ_FALSE_EASTING = 0x0c0a + private const val PROJ_FALSE_NORTHING = 0x0c0b + private const val PROJ_SCALE_AT_NAT_ORIGIN = 0x0c14 + private const val PROJ_AZIMUTH_ANGLE = 0x0c16 + private const val VERTICAL_UNITS = 0x1003 + + private val tagNameMap = hashMapOf( + GEOTIFF_VERSION to "GeoTIFF Version", + MODEL_TYPE to "Model Type", + RASTER_TYPE to "Raster Type", + CITATION to "Citation", + GEOG_TYPE to "Geographic Type", + GEOG_CITATION to "Geographic Citation", + GEOG_GEODETIC_DATUM to "Geographic Geodetic Datum", + GEOG_LINEAR_UNITS to "Geographic Linear Units", + GEOG_ANGULAR_UNITS to "Geographic Angular Units", + GEOG_ELLIPSOID to "Geographic Ellipsoid", + GEOG_SEMI_MAJOR_AXIS to "Semi-major axis", + GEOG_SEMI_MINOR_AXIS to "Semi-minor axis", + GEOG_INV_FLATTENING to "Inv. Flattening", + PROJ_CS_TYPE to "Projected Coordinate System Type", + PROJ_CS_CITATION to "Projected Coordinate System Citation", + PROJECTION to "Projection", + PROJ_COORD_TRANS to "Projected Coordinate Transform", + PROJ_LINEAR_UNITS to "Projection Linear Units", + PROJ_STD_PARALLEL_1 to "Projection Standard Parallel 1", + PROJ_STD_PARALLEL_2 to "Projection Standard Parallel 2", + PROJ_NAT_ORIGIN_LONG to "Projection Natural Origin Longitude", + PROJ_NAT_ORIGIN_LAT to "Projection Natural Origin Latitude", + PROJ_FALSE_EASTING to "Projection False Easting", + PROJ_FALSE_NORTHING to "Projection False Northing", + PROJ_SCALE_AT_NAT_ORIGIN to "Projection Scale at Natural Origin", + PROJ_AZIMUTH_ANGLE to "Projection Azimuth Angle", + VERTICAL_UNITS to "Vertical Units", + ) + + fun getTagName(tag: Int): String? { + return tagNameMap[tag] + } +} + +object ExifGeoTiffTags { + // ModelPixelScaleTag (optional) + // Tag = 33550 (830E.H) + // Type = DOUBLE + // Count = 3 + const val TAG_MODEL_PIXEL_SCALE = 0x830e + + // ModelTiePointTag (conditional) + // Tag = 33922 (8482.H) + // Type = DOUBLE + // Count = 6*K, K = number of tie points + const val TAG_MODEL_TIE_POINT = 0x8482 + + // ModelTransformationTag (conditional) + // Tag = 34264 (85D8.H) + // Type = DOUBLE + // Count = 16 + const val TAG_MODEL_TRANSFORMATION = 0x85d8 + + // GeoKeyDirectoryTag (mandatory) + // Tag = 34735 (87AF.H) + // Type = UNSIGNED SHORT + // Count = variable, >= 4 + const val TAG_GEO_KEY_DIRECTORY = 0x87af + + // GeoDoubleParamsTag (optional) + // Tag = 34736 (87BO.H) + // Type = DOUBLE + // Count = variable + const val TAG_GEO_DOUBLE_PARAMS = 0x87b0 + + // GeoAsciiParamsTag (optional) + // Tag = 34737 (87B1.H) + // Type = ASCII + // Count = variable + const val TAG_GEO_ASCII_PARAMS = 0x87b1 + + val tagNameMap = hashMapOf( + TAG_GEO_ASCII_PARAMS to "Geo Ascii Params", + TAG_GEO_DOUBLE_PARAMS to "Geo Double Params", + TAG_GEO_KEY_DIRECTORY to "Geo Key Directory", + TAG_MODEL_PIXEL_SCALE to "Model Pixel Scale", + TAG_MODEL_TIE_POINT to "Model Tie Points", + TAG_MODEL_TRANSFORMATION to "Model Transformation", + ) + + val tags = tagNameMap.keys +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MediaMetadataRetrieverHelper.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MediaMetadataRetrieverHelper.kt new file mode 100644 index 0000000..60f22a7 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MediaMetadataRetrieverHelper.kt @@ -0,0 +1,185 @@ +package deckers.thibault.aves.metadata + +import android.media.MediaFormat +import android.media.MediaMetadataRetriever +import android.os.Build +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import java.util.TimeZone + +object MediaMetadataRetrieverHelper { + val allKeys = hashMapOf( + MediaMetadataRetriever.METADATA_KEY_ALBUM to "Album", + MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST to "Album Artist", + MediaMetadataRetriever.METADATA_KEY_ARTIST to "Artist", + MediaMetadataRetriever.METADATA_KEY_AUTHOR to "Author", + MediaMetadataRetriever.METADATA_KEY_BITRATE to "Bitrate", + MediaMetadataRetriever.METADATA_KEY_CAPTURE_FRAMERATE to "Capture Framerate", + MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER to "CD Track Number", + MediaMetadataRetriever.METADATA_KEY_COMPILATION to "Compilation", + MediaMetadataRetriever.METADATA_KEY_COMPOSER to "Composer", + MediaMetadataRetriever.METADATA_KEY_DATE to "Date", + MediaMetadataRetriever.METADATA_KEY_DISC_NUMBER to "Disc Number", + MediaMetadataRetriever.METADATA_KEY_DURATION to "Duration", + MediaMetadataRetriever.METADATA_KEY_GENRE to "Genre", + MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO to "Has Audio", + MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO to "Has Video", + MediaMetadataRetriever.METADATA_KEY_LOCATION to "Location", + MediaMetadataRetriever.METADATA_KEY_MIMETYPE to "MIME Type", + MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS to "Number of Tracks", + MediaMetadataRetriever.METADATA_KEY_TITLE to "Title", + MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT to "Video Height", + MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH to "Video Width", + MediaMetadataRetriever.METADATA_KEY_WRITER to "Writer", + MediaMetadataRetriever.METADATA_KEY_YEAR to "Year", + MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION to "Video Rotation", + ).apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + putAll( + hashMapOf( + MediaMetadataRetriever.METADATA_KEY_HAS_IMAGE to "Has Image", + MediaMetadataRetriever.METADATA_KEY_IMAGE_COUNT to "Image Count", + MediaMetadataRetriever.METADATA_KEY_IMAGE_HEIGHT to "Image Height", + MediaMetadataRetriever.METADATA_KEY_IMAGE_PRIMARY to "Image Primary", + MediaMetadataRetriever.METADATA_KEY_IMAGE_ROTATION to "Image Rotation", + MediaMetadataRetriever.METADATA_KEY_IMAGE_WIDTH to "Image Width", + MediaMetadataRetriever.METADATA_KEY_VIDEO_FRAME_COUNT to "Video Frame Count", + ) + ) + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + putAll( + hashMapOf( + MediaMetadataRetriever.METADATA_KEY_EXIF_LENGTH to "Exif Length", + MediaMetadataRetriever.METADATA_KEY_EXIF_OFFSET to "Exif Offset", + ) + ) + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + putAll( + hashMapOf( + MediaMetadataRetriever.METADATA_KEY_COLOR_RANGE to "Color Range", + MediaMetadataRetriever.METADATA_KEY_COLOR_STANDARD to "Color Standard", + MediaMetadataRetriever.METADATA_KEY_COLOR_TRANSFER to "Color Transfer", + ) + ) + } + } + + private val durationFormat = SimpleDateFormat("HH:mm:ss.SSS", Locale.ROOT).apply { timeZone = TimeZone.getTimeZone("UTC") } + + // extensions + + fun MediaMetadataRetriever.getSafeString(tag: Int, save: (value: String) -> Unit) { + val value = this.extractMetadata(tag) + if (value != null) save(value) + } + + fun MediaMetadataRetriever.getSafeInt(tag: Int, save: (value: Int) -> Unit) { + val value = this.extractMetadata(tag)?.toIntOrNull() + if (value != null) save(value) + } + + fun MediaMetadataRetriever.getSafeLong(tag: Int, save: (value: Long) -> Unit) { + val value = this.extractMetadata(tag)?.toLongOrNull() + if (value != null) save(value) + } + + fun MediaMetadataRetriever.getSafeDateMillis(tag: Int, save: (value: Long) -> Unit) { + val dateString = this.extractMetadata(tag) + val dateMillis = Metadata.parseVideoMetadataDate(dateString) + // some entries have an invalid default date (19040101T000000.000Z) that is before Epoch time + if (dateMillis > 0) save(dateMillis) + } + + private fun formatBitrate(size: Long): String { + val divider = 1000 + val symbol = "bit/s" + + if (size < divider) return "$size $symbol" + if (size < divider * divider) return "${String.format(Locale.getDefault(), "%.2f", size.toDouble() / divider)} K$symbol" + return "${String.format(Locale.getDefault(), "%.2f", size.toDouble() / divider / divider)} M$symbol" + } + + fun MediaMetadataRetriever.getSafeDescription(tag: Int, save: (value: String) -> Unit) { + val value = this.extractMetadata(tag) + if (value != null) { + when (tag) { + // format + MediaMetadataRetriever.METADATA_KEY_IMAGE_ROTATION, + MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION -> "$value°" + + MediaMetadataRetriever.METADATA_KEY_IMAGE_HEIGHT, MediaMetadataRetriever.METADATA_KEY_IMAGE_WIDTH, + MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT, MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH -> "$value pixels" + + MediaMetadataRetriever.METADATA_KEY_BITRATE -> { + val bitrate = value.toLongOrNull() ?: 0 + if (bitrate > 0) formatBitrate(bitrate) else null + } + + MediaMetadataRetriever.METADATA_KEY_CAPTURE_FRAMERATE -> { + val framerate = value.toDoubleOrNull() ?: 0.0 + if (framerate > 0.0) "$framerate" else null + } + + MediaMetadataRetriever.METADATA_KEY_DURATION -> { + val dateMillis = value.toLongOrNull() ?: 0 + if (dateMillis > 0) durationFormat.format(Date(dateMillis)) else null + } + + MediaMetadataRetriever.METADATA_KEY_COLOR_RANGE -> { + when (value.toIntOrNull()) { + MediaFormat.COLOR_RANGE_FULL -> "Full" + MediaFormat.COLOR_RANGE_LIMITED -> "Limited" + else -> value + } + } + + MediaMetadataRetriever.METADATA_KEY_COLOR_STANDARD -> { + when (value.toIntOrNull()) { + MediaFormat.COLOR_STANDARD_BT709 -> "BT.709" + MediaFormat.COLOR_STANDARD_BT601_PAL -> "BT.601 625 (PAL)" + MediaFormat.COLOR_STANDARD_BT601_NTSC -> "BT.601 525 (NTSC)" + MediaFormat.COLOR_STANDARD_BT2020 -> "BT.2020" + else -> value + } + } + + MediaMetadataRetriever.METADATA_KEY_COLOR_TRANSFER -> { + when (value.toIntOrNull()) { + MediaFormat.COLOR_TRANSFER_LINEAR -> "Linear" + MediaFormat.COLOR_TRANSFER_SDR_VIDEO -> "SMPTE 170M" + MediaFormat.COLOR_TRANSFER_ST2084 -> "SMPTE ST 2084" + MediaFormat.COLOR_TRANSFER_HLG -> "ARIB STD-B67 (HLG)" + else -> value + } + } + // hide default or invalid values + MediaMetadataRetriever.METADATA_KEY_COMPILATION, + MediaMetadataRetriever.METADATA_KEY_DISC_NUMBER, + MediaMetadataRetriever.METADATA_KEY_YEAR -> if (value != "0") value else null + + MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER -> if (value != "0/0") value else null + MediaMetadataRetriever.METADATA_KEY_DATE -> { + val dateMillis = Metadata.parseVideoMetadataDate(value) + // some entries have an invalid default date (19040101T000000.000Z) that is before Epoch time + if (dateMillis > 0) value else null + } + // hide + MediaMetadataRetriever.METADATA_KEY_LOCATION, + MediaMetadataRetriever.METADATA_KEY_MIMETYPE -> null + // as is + else -> value + }?.let { save(it) } + } + } + + fun MediaFormat.getSafeInt(key: String, save: (value: Int) -> Unit) { + if (this.containsKey(key)) save(this.getInteger(key)) + } + + fun MediaFormat.getSafeLong(key: String, save: (value: Long) -> Unit) { + if (this.containsKey(key)) save(this.getLong(key)) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt new file mode 100644 index 0000000..0d1dbff --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt @@ -0,0 +1,186 @@ +package deckers.thibault.aves.metadata + +import android.content.Context +import android.net.Uri +import android.util.Log +import deckers.thibault.aves.utils.FileUtils.transferFrom +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.StorageUtils +import java.io.File +import java.io.InputStream +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import java.util.TimeZone +import java.util.regex.Pattern +import androidx.exifinterface.media.ExifInterfaceFork as ExifInterface + +object Metadata { + private val LOG_TAG = LogUtils.createTag() + + const val IPTC_MARKER_BYTE: Byte = 0x1c + + // Pattern to extract latitude & longitude from a video location tag (cf ISO 6709) + // Examples: + // "+37.5090+127.0243/" (Samsung) + // "+51.3328-000.7053+113.474/" (Apple) + val VIDEO_LOCATION_PATTERN: Pattern = Pattern.compile("([+-][.0-9]+)([+-][.0-9]+).*") + + private val VIDEO_DATE_SUBSECOND_PATTERN = Pattern.compile("(\\d{6})(\\.\\d+)") + private val VIDEO_TIME_ZONE_PATTERN = Pattern.compile("(Z|[+-]\\d{4})$") + + // directory names, as shown when listing all metadata + const val DIR_GPS = "GPS" // from metadata-extractor + const val DIR_XMP = "XMP" // from metadata-extractor + const val DIR_MEDIA = "Media" // custom + const val DIR_COVER_ART = "Cover" // custom + const val DIR_DNG = "DNG" // custom + const val DIR_EXIF_GEOTIFF = "GeoTIFF" // custom + const val DIR_PNG_TEXTUAL_DATA = "PNG Textual Data" // custom + const val DIR_MP4_USER_DATA = "User Data" // custom + + // types of metadata + const val TYPE_COMMENT = "comment" + const val TYPE_EXIF = "exif" + const val TYPE_ICC_PROFILE = "icc_profile" + const val TYPE_IPTC = "iptc" + const val TYPE_JFIF = "jfif" + const val TYPE_JPEG_ADOBE = "jpeg_adobe" + const val TYPE_JPEG_DUCKY = "jpeg_ducky" + const val TYPE_MP4 = "mp4" + const val TYPE_PHOTOSHOP_IRB = "photoshop_irb" + const val TYPE_XMP = "xmp" + + // interpret EXIF code to angle (0, 90, 180 or 270 degrees) + fun getRotationDegreesForExifCode(exifOrientation: Int): Int = when (exifOrientation) { + ExifInterface.ORIENTATION_ROTATE_90, ExifInterface.ORIENTATION_TRANSVERSE -> 90 + ExifInterface.ORIENTATION_ROTATE_180, ExifInterface.ORIENTATION_FLIP_VERTICAL -> 180 + ExifInterface.ORIENTATION_ROTATE_270, ExifInterface.ORIENTATION_TRANSPOSE -> 270 + else -> 0 + } + + // interpret EXIF code to whether the image is flipped + fun isFlippedForExifCode(exifOrientation: Int): Boolean = when (exifOrientation) { + ExifInterface.ORIENTATION_FLIP_HORIZONTAL, ExifInterface.ORIENTATION_TRANSVERSE, ExifInterface.ORIENTATION_FLIP_VERTICAL, ExifInterface.ORIENTATION_TRANSPOSE -> true + else -> false + } + + fun getExifCode(rotationDegrees: Int, isFlipped: Boolean): Int { + return when (rotationDegrees) { + 90 -> if (isFlipped) ExifInterface.ORIENTATION_TRANSVERSE else ExifInterface.ORIENTATION_ROTATE_90 + 180 -> if (isFlipped) ExifInterface.ORIENTATION_FLIP_VERTICAL else ExifInterface.ORIENTATION_ROTATE_180 + 270 -> if (isFlipped) ExifInterface.ORIENTATION_TRANSPOSE else ExifInterface.ORIENTATION_ROTATE_270 + else -> if (isFlipped) ExifInterface.ORIENTATION_FLIP_HORIZONTAL else ExifInterface.ORIENTATION_NORMAL + } + } + + fun parseSubSecond(subSecond: String?): Int { + if (subSecond != null) { + try { + val millis = (".$subSecond".toDouble() * 1000).toInt() + if (millis in 0..999) { + return millis + } + } catch (_: NumberFormatException) { + // ignore + } + } + return 0 + } + + // not sure which standards are used for the different video formats, + // but looks like some form of ISO 8601 `basic format`: + // yyyyMMddTHHmmss(.sss)?(Z|+/-hhmm)? + fun parseVideoMetadataDate(metadataDate: String?): Long { + var dateString = metadataDate ?: return 0 + + // optional sub-second + var subSecond: String? = null + val subSecondMatcher = VIDEO_DATE_SUBSECOND_PATTERN.matcher(dateString) + if (subSecondMatcher.find()) { + subSecond = subSecondMatcher.group(2)?.substring(1) + dateString = subSecondMatcher.replaceAll("$1") + } + + // optional time zone + var timeZone: TimeZone? = null + val timeZoneMatcher = VIDEO_TIME_ZONE_PATTERN.matcher(dateString) + if (timeZoneMatcher.find()) { + timeZone = TimeZone.getTimeZone("GMT${timeZoneMatcher.group().replace("Z", "")}") + dateString = timeZoneMatcher.replaceAll("") + } + + val date: Date = try { + val parser = SimpleDateFormat("yyyyMMdd'T'HHmmss", Locale.ROOT) + parser.timeZone = timeZone ?: TimeZone.getTimeZone("GMT") + parser.parse(dateString) + } catch (_: ParseException) { + // ignore + null + } ?: return 0 + + return date.time + parseSubSecond(subSecond) + } + + // Opening some large files yields an OOM (both with `metadata-extractor` v2.15.0 and `ExifInterface` v1.3.1), + // so we define an arbitrary threshold to avoid a crash on launch. + // It is not clear whether it is because of the file itself or its metadata. + private const val FILE_SIZE_MAX = 100 * (1 shl 20) // MB + + fun isDangerouslyLarge(sizeBytes: Long?) = sizeBytes == null || sizeBytes > FILE_SIZE_MAX + + // we try and read metadata from large files by copying an arbitrary amount from its beginning + // to a temporary file, and reusing that preview file for all metadata reading purposes + private const val PREVIEW_SIZE: Long = 5 * (1 shl 20) // MB + + private val previewFiles = HashMap() + + private fun getSafeUri(context: Context, uri: Uri, mimeType: String?, sizeBytes: Long?): Uri { + // formats known to yield OOM for large files + return when (mimeType) { + // formats known to yield OOM for large files + MimeTypes.DNG, + MimeTypes.DNG_ADOBE, + MimeTypes.HEIC, + MimeTypes.HEIF, + MimeTypes.MP4, + MimeTypes.PSD_VND, + MimeTypes.PSD_X, + MimeTypes.TIFF, + null -> + if (isDangerouslyLarge(sizeBytes)) { + Log.d(LOG_TAG, "Dangerously large file with uri=$uri, mimeType=$mimeType, size=$sizeBytes") + // make a preview from the beginning of the file, + // hoping the metadata is accessible in the copied chunk + var previewFile = previewFiles[uri] + if (previewFile == null) { + previewFile = createPreviewFile(context, uri) + previewFiles[uri] = previewFile + } + Uri.fromFile(previewFile) + } else { + // small enough to be safe as it is + uri + } + + else -> + // *probably* safe + uri + } + } + + fun createPreviewFile(context: Context, uri: Uri): File { + val size = PREVIEW_SIZE + Log.d(LOG_TAG, "create preview of size=$size for uri=$uri") + return StorageUtils.createTempFile(context).apply { + transferFrom(StorageUtils.openInputStream(context, uri), size) + } + } + + fun openSafeInputStream(context: Context, uri: Uri, mimeType: String?, sizeBytes: Long?): InputStream? { + val safeUri = getSafeUri(context, uri, mimeType, sizeBytes) + return StorageUtils.openInputStream(context, safeUri) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Mp4ParserHelper.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Mp4ParserHelper.kt new file mode 100644 index 0000000..e1a10f1 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Mp4ParserHelper.kt @@ -0,0 +1,439 @@ +package deckers.thibault.aves.metadata + +import android.content.Context +import android.net.Uri +import android.util.Log +import deckers.thibault.aves.metadata.xmp.XMP +import deckers.thibault.aves.utils.FileDescriptorException +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.StorageUtils +import deckers.thibault.aves.utils.toByteArray +import deckers.thibault.aves.utils.toHex +import org.mp4parser.BasicContainer +import org.mp4parser.Box +import org.mp4parser.BoxParser +import org.mp4parser.Container +import org.mp4parser.IsoFile +import org.mp4parser.PropertyBoxParserImpl +import org.mp4parser.boxes.UnknownBox +import org.mp4parser.boxes.UserBox +import org.mp4parser.boxes.apple.AppleCoverBox +import org.mp4parser.boxes.apple.AppleGPSCoordinatesBox +import org.mp4parser.boxes.apple.AppleItemListBox +import org.mp4parser.boxes.apple.AppleVariableSignedIntegerBox +import org.mp4parser.boxes.apple.Utf8AppleDataBox +import org.mp4parser.boxes.iso14496.part12.FreeBox +import org.mp4parser.boxes.iso14496.part12.HandlerBox +import org.mp4parser.boxes.iso14496.part12.MediaDataBox +import org.mp4parser.boxes.iso14496.part12.MetaBox +import org.mp4parser.boxes.iso14496.part12.MovieBox +import org.mp4parser.boxes.iso14496.part12.MovieFragmentBox +import org.mp4parser.boxes.iso14496.part12.SampleTableBox +import org.mp4parser.boxes.iso14496.part12.SegmentIndexBox +import org.mp4parser.boxes.iso14496.part12.TrackHeaderBox +import org.mp4parser.boxes.iso14496.part12.UserDataBox +import org.mp4parser.boxes.threegpp.ts26244.AuthorBox +import org.mp4parser.boxes.threegpp.ts26244.LocationInformationBox +import org.mp4parser.support.AbstractBox +import org.mp4parser.support.Matrix +import org.mp4parser.tools.Path +import java.io.ByteArrayOutputStream +import java.io.FileInputStream +import java.nio.channels.Channels + +object Mp4ParserHelper { + private val LOG_TAG = LogUtils.createTag() + + // arbitrary size to detect boxes that may yield an OOM + private const val BOX_SIZE_DANGER_THRESHOLD = 3 * (1 shl 20) // MB + + const val SAMSUNG_MAKERNOTE_BOX_TYPE = "sefd" + const val SEFD_MOTION_PHOTO_NAME = "MotionPhoto_Data" + + private val largerTypeWhitelist = listOf( + // HEIC motion photo may contain Samsung maker notes in `sefd` box, + // including a video larger than the danger threshold + SAMSUNG_MAKERNOTE_BOX_TYPE, + ) + + fun consumeIso(context: Context, uri: Uri, boxParser: BoxParser, consumer: (IsoFile) -> R): R { + // we can skip uninteresting boxes with a seekable data source + val pfd = StorageUtils.openInputFileDescriptor(context, uri) ?: throw FileDescriptorException("failed to open file descriptor for uri=$uri") + pfd.use { + FileInputStream(it.fileDescriptor).use { stream -> + stream.channel.use { channel -> + try { + // creating `IsoFile` with a `File` or a `File.inputStream()` yields `No such device` + return IsoFile(channel, boxParser).use(consumer) + } catch (e: Exception) { + val message = e.message + if (message != null && message.startsWith("box size of zero")) { + throw Mp4ZeroSizeBoxException(message, e) + } + throw e + } + } + } + } + } + + fun computeEdits(context: Context, uri: Uri, modifier: (isoFile: IsoFile) -> Unit): List> { + val boxParser = PropertyBoxParserImpl().apply { + // do not skip anything inside `MovieBox` as it will be parsed and rewritten for editing + // do not skip weird boxes (like trailing "0000" box), to fail fast if it is large + val skippedTypes = listOf( + // parsing `MediaDataBox` can take a long time + MediaDataBox.TYPE, + ) + setBoxSkipper { type, size -> + if (skippedTypes.contains(type)) return@setBoxSkipper true + if (size > BOX_SIZE_DANGER_THRESHOLD) throw Mp4TooLargeException(type, "box (type=$type size=$size) is too large") + false + } + } + + return consumeIso(context, uri, boxParser) { isoFile -> + val fragmented = isoFile.boxes.any { box -> box is MovieFragmentBox || box is SegmentIndexBox } + if (fragmented) throw Mp4FragmentedException("editing fragmented movies is not supported") + + val lastContentBox = isoFile.boxes.reversed().firstOrNull { box -> + when { + box == isoFile.movieBox -> false + testXmpBox(box) -> false + box is FreeBox -> false + else -> true + } + } + lastContentBox ?: throw Exception("failed to find last content box") + val oldFileSize = isoFile.size + var appendOffset = (isoFile.getBoxOffset { box -> box == lastContentBox })!! + lastContentBox.size + + val edits = arrayListOf>() + fun addFreeBoxEdit(offset: Long, size: Long): Boolean { + val boxSize = size.toInt() - 8 + if (boxSize > BOX_SIZE_DANGER_THRESHOLD) throw Exception("dangerous free box replacement for size=$boxSize") + return edits.add(Pair(offset, FreeBox(boxSize).toBytes())) + } + + // replace existing movie box by a free box + isoFile.getBoxOffset { box -> box.type == MovieBox.TYPE }?.let { offset -> + addFreeBoxEdit(offset, isoFile.movieBox.size) + } + + // replace existing XMP box by a free box + isoFile.getBoxOffset { box -> testXmpBox(box) }?.let { offset -> + addFreeBoxEdit(offset, isoFile.xmpBox!!.size) + } + + modifier(isoFile) + + // write edited movie box + val movieBoxBytes = isoFile.movieBox.toBytes() + edits.removeAll { (offset, _) -> offset == appendOffset } + edits.add(Pair(appendOffset, movieBoxBytes)) + appendOffset += movieBoxBytes.size + + // write edited XMP box + isoFile.xmpBox?.let { box -> + edits.removeAll { (offset, _) -> offset == appendOffset } + edits.add(Pair(appendOffset, box.toBytes())) + appendOffset += box.size + } + + // write trailing free box instead of truncating + val trailing = oldFileSize - appendOffset + if (trailing > 0) { + addFreeBoxEdit(appendOffset, trailing) + } + return@consumeIso edits + } + } + + // according to XMP Specification Part 3 - Storage in Files, + // XMP is embedded in MPEG-4 files using a top-level UUID box + private fun testXmpBox(box: Box): Boolean { + if (box is UserBox) { + if (!box.isParsed) { + box.parseDetails() + } + return box.userType.contentEquals(XMP.mp4Uuid) + } + return false + } + + // returns the offset and data of the Samsung maker notes box + fun getSamsungSefd(context: Context, uri: Uri): Pair? { + try { + return consumeIso(context, uri, metadataBoxParser()) { isoFile -> + var offset = 0L + for (box in isoFile.boxes) { + if (box is UnknownBox && box.type == SAMSUNG_MAKERNOTE_BOX_TYPE) { + if (!box.isParsed) { + box.parseDetails() + } + return@consumeIso Pair(offset + 8, box.data.toByteArray()) // skip 8 bytes for box header + } + offset += box.size + } + return@consumeIso null + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to read sefd box", e) + } + return null + } + + // extensions + + fun IsoFile.updateLocation(locationIso6709: String?) { + // Apple GPS Coordinates Box can be in various locations: + // - moov[0]/udta[0]/©xyz + // - moov[0]/meta[0]/ilst/©xyz + // - others? + removeBoxes(AppleGPSCoordinatesBox::class.java, true) + + locationIso6709 ?: return + + var userDataBox = Path.getPath(movieBox, UserDataBox.TYPE) + if (userDataBox == null) { + userDataBox = UserDataBox() + movieBox.addBox(userDataBox) + } + + userDataBox.addBox(AppleGPSCoordinatesBox().apply { + value = locationIso6709 + }) + } + + fun IsoFile.updateRotation(degrees: Int): Boolean { + val matrix: Matrix = when (degrees) { + 0 -> Matrix.ROTATE_0 + 90 -> Matrix.ROTATE_90 + 180 -> Matrix.ROTATE_180 + 270 -> Matrix.ROTATE_270 + else -> throw Exception("failed because of invalid rotation degrees=$degrees") + } + + var success = false + movieBox.getBoxes(TrackHeaderBox::class.java, true).filter { tkhd -> + if (!tkhd.isParsed) { + tkhd.parseDetails() + } + tkhd.width > 0 && tkhd.height > 0 + }.forEach { tkhd -> + if (!setOf(Matrix.ROTATE_0, Matrix.ROTATE_90, Matrix.ROTATE_180, Matrix.ROTATE_270).contains(tkhd.matrix)) { + throw Exception("failed because existing matrix is not a simple rotation matrix") + } + tkhd.matrix = matrix + success = true + } + return success + } + + fun IsoFile.updateXmp(xmp: String?) { + val xmpBox = xmpBox + if (xmp != null) { + val xmpData = xmp.toByteArray(Charsets.UTF_8) + if (xmpBox == null) { + addBox(UserBox(XMP.mp4Uuid).apply { + data = xmpData + }) + } else { + xmpBox.data = xmpData + } + } else if (xmpBox != null) { + removeBox(xmpBox) + } + } + + private fun IsoFile.getBoxOffset(test: (box: Box) -> Boolean): Long? { + var offset = 0L + for (box in boxes) { + if (test(box)) { + return offset + } + offset += box.size + } + return null + } + + private val IsoFile.xmpBox: UserBox? + get() = boxes.firstOrNull { testXmpBox(it) } as UserBox? + + fun Container.processBoxes(clazz: Class, recursive: Boolean, apply: (box: T, parent: Container) -> Unit) { + // use a copy, in case box processing removes boxes + for (box in ArrayList(boxes)) { + if (clazz.isInstance(box)) { + @Suppress("unchecked_cast") + apply(box as T, this) + } + if (recursive && box is Container) { + box.processBoxes(clazz, true, apply) + } + } + } + + private fun Container.removeBoxes(clazz: Class, recursive: Boolean) { + processBoxes(clazz, recursive) { box, parent -> parent.removeBox(box) } + } + + private fun Container.removeBox(box: Box) { + boxes = boxes.apply { remove(box) } + } + + fun Container.dumpBoxes(sb: StringBuilder, indent: Int = 0) { + for (box in boxes) { + val boxType = box.type + try { + if (box is AbstractBox && !box.isParsed) { + box.parseDetails() + } + when (box) { + is BasicContainer -> { + sb.appendLine("${"\t".repeat(indent)}[$boxType] ${box.javaClass.simpleName}") + box.dumpBoxes(sb, indent + 1) + } + + is UserBox -> sb.appendLine("${"\t".repeat(indent)}[$boxType] userType=${box.userType.toHex()} $box") + else -> sb.appendLine("${"\t".repeat(indent)}[$boxType] $box") + } + } catch (e: Exception) { + sb.appendLine("${"\t".repeat(indent)}failed to access box type=$boxType exception=${e.message}") + } + } + } + + fun Box.toBytes(): ByteArray { + if (size > BOX_SIZE_DANGER_THRESHOLD) throw Mp4TooLargeException(type, "box (type=$type size=$size) is too large") + val stream = ByteArrayOutputStream(size.toInt()) + Channels.newChannel(stream).use { getBox(it) } + return stream.toByteArray() + } + + fun metadataBoxParser() = PropertyBoxParserImpl().apply { + val skippedTypes = listOf( + // parsing `MediaDataBox` can take a long time + MediaDataBox.TYPE, + // parsing `SampleTableBox` or `FreeBox` may yield OOM + SampleTableBox.TYPE, FreeBox.TYPE, + // some files are padded with `0` but the parser does not stop, reads type "0000", + // then a large size from following "0000", which may yield OOM + "0000", + ) + setBoxSkipper { type, size -> + if (skippedTypes.contains(type)) return@setBoxSkipper true + if (size > BOX_SIZE_DANGER_THRESHOLD && !largerTypeWhitelist.contains(type)) throw Mp4TooLargeException(type, "box (type=$type size=$size) is too large") + false + } + } + + fun getUserDataBox( + context: Context, + mimeType: String, + uri: Uri, + ): UserDataBox? { + if (mimeType != MimeTypes.MP4) return null + + try { + return consumeIso(context, uri, metadataBoxParser()) { isoFile -> + return@consumeIso Path.getPath(isoFile.movieBox, UserDataBox.TYPE) + } + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to parse MP4 for mimeType=$mimeType uri=$uri", e) + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get User Data box by MP4 parser for mimeType=$mimeType uri=$uri", e) + } + return null + } + + fun extractBoxFields(container: Container): HashMap { + val fields = HashMap() + for (box in container.boxes) { + if (box is AbstractBox && !box.isParsed) { + box.parseDetails() + } + val type = box.type + val key = boxTypeMetadataKey(type) + when (box) { + is AuthorBox -> fields[key] = box.author + is AppleCoverBox -> fields[key] = "[${box.coverData.size} bytes]" + is AppleGPSCoordinatesBox -> fields[key] = box.value + is AppleItemListBox -> fields.putAll(extractBoxFields(box)) + is AppleVariableSignedIntegerBox -> fields[key] = box.value.toString() + is HandlerBox -> {} + is LocationInformationBox -> { + hashMapOf( + "Language" to box.language, + "Name" to box.name, + "Role" to box.role.toString(), + "Longitude" to box.longitude.toString(), + "Latitude" to box.latitude.toString(), + "Altitude" to box.altitude.toString(), + "Astronomical Body" to box.astronomicalBody, + "Additional Notes" to box.additionalNotes, + ).forEach { (k, v) -> fields["$key/$k"] = v } + } + + is MetaBox -> { + val handlerBox = Path.getPath(box, HandlerBox.TYPE).apply { parseDetails() } + when (val handlerType = handlerBox?.handlerType ?: MetaBox.TYPE) { + "mdir" -> fields.putAll(extractBoxFields(box)) + else -> fields.putAll(extractBoxFields(box).map { Pair("$handlerType/${it.key}", it.value) }.toMap()) + } + } + + is UnknownBox -> { + val byteBuffer = box.data + val remaining = byteBuffer.remaining() + if (remaining > 512) { + fields[key] = "[$remaining bytes]" + } else { + val bytes = byteBuffer.toByteArray() + when (type) { + "SDLN", + "smrd" -> fields[key] = String(bytes) + + else -> fields[key] = "0x${bytes.toHex()}" + } + } + } + + is Utf8AppleDataBox -> fields[key] = box.value + + else -> fields[key] = box.toString() + } + } + return fields + } + + // cf https://exiftool.org/TagNames/QuickTime.html + private fun boxTypeMetadataKey(type: String) = when (type) { + "auth" -> "Author" + "catg" -> "Category" + "covr" -> "Cover Art" + "keyw" -> "Keyword" + "loci" -> "Location" + "mcvr" -> "Preview Image" + "pcst" -> "Podcast" + "SDLN" -> "Play Mode" + "stik" -> "Media Type" + "©alb" -> "Album" + "©ART" -> "Artist" + "©aut" -> "Author" + "©cmt" -> "Comment" + "©day" -> "Year" + "©des" -> "Description" + "©gen" -> "Genre" + "©nam" -> "Title" + "©too" -> "Encoder" + "©xyz" -> "GPS Coordinates" + else -> type + } +} + +class Mp4TooLargeException(val type: String, message: String) : RuntimeException(message) + +class Mp4FragmentedException(message: String) : RuntimeException(message) + +class Mp4ZeroSizeBoxException(message: String, cause: Throwable) : RuntimeException(message, cause) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt new file mode 100644 index 0000000..46ad8ef --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt @@ -0,0 +1,446 @@ +package deckers.thibault.aves.metadata + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.media.MediaExtractor +import android.media.MediaFormat +import android.net.Uri +import android.os.ParcelFileDescriptor +import android.util.Log +import com.adobe.internal.xmp.XMPMeta +import com.drew.imaging.jpeg.JpegSegmentType +import com.drew.metadata.exif.ExifDirectoryBase +import com.drew.metadata.exif.ExifIFD0Directory +import com.drew.metadata.xmp.XmpDirectory +import deckers.thibault.aves.glide.TiffFetcher +import deckers.thibault.aves.metadata.ExifInterfaceHelper.getSafeInt +import deckers.thibault.aves.metadata.MediaMetadataRetrieverHelper.getSafeInt +import deckers.thibault.aves.metadata.MediaMetadataRetrieverHelper.getSafeLong +import deckers.thibault.aves.metadata.metadataextractor.Helper +import deckers.thibault.aves.metadata.metadataextractor.Helper.getSafeInt +import deckers.thibault.aves.metadata.metadataextractor.mpf.MpEntry +import deckers.thibault.aves.metadata.metadataextractor.mpf.MpEntryDirectory +import deckers.thibault.aves.metadata.xmp.GoogleXMP +import deckers.thibault.aves.metadata.xmp.XMP +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MemoryUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.MimeTypes.canReadWithMetadataExtractor +import deckers.thibault.aves.utils.MimeTypes.isHeic +import deckers.thibault.aves.utils.MimeTypes.isIsoBMFFImage +import deckers.thibault.aves.utils.StorageUtils +import deckers.thibault.aves.utils.indexOfBytes +import org.beyka.tiffbitmapfactory.TiffBitmapFactory +import java.io.DataInputStream +import java.io.EOFException +import androidx.exifinterface.media.ExifInterfaceFork as ExifInterface + +object MultiPage { + private val LOG_TAG = LogUtils.createTag() + + // TODO TLAD more generic support, (e.g. 0x00000014 + `ftyp` + `qt `) + // atom length (variable, e.g. `0x00000018`) + atom type (`ftyp`) + type (variable, e.g. `mp42`, `qt`) + private val heicMotionPhotoVideoStartIndicator = byteArrayOf(0x00, 0x00, 0x00, 0x18) + "ftypmp42".toByteArray() + + // page info + private const val KEY_MIME_TYPE = "mimeType" + private const val KEY_HEIGHT = "height" + private const val KEY_WIDTH = "width" + private const val KEY_PAGE = "page" + private const val KEY_IS_DEFAULT = "isDefault" + private const val KEY_DURATION = "durationMillis" + private const val KEY_ROTATION_DEGREES = "rotationDegrees" + + fun getHeicTracks(context: Context, uri: Uri): ArrayList { + val tracks = ArrayList() + val extractor = MediaExtractor() + extractor.setDataSource(context, uri, null) + for (pageIndex in 0.. + val trackMime = if (mime == MediaFormat.MIMETYPE_IMAGE_ANDROID_HEIC) MimeTypes.HEIC else mime + val track: FieldMap = hashMapOf( + KEY_PAGE to pageIndex, + KEY_MIME_TYPE to trackMime, + ) + + // do not use `MediaFormat.KEY_TRACK_ID` as it is actually not unique between tracks + // e.g. there could be both a video track and an image track with KEY_TRACK_ID == 1 + + format.getSafeInt(MediaFormat.KEY_WIDTH) { track[KEY_WIDTH] = it } + format.getSafeInt(MediaFormat.KEY_HEIGHT) { track[KEY_HEIGHT] = it } + format.getSafeInt(MediaFormat.KEY_IS_DEFAULT) { track[KEY_IS_DEFAULT] = it != 0 } + format.getSafeInt(MediaFormat.KEY_ROTATION) { track[KEY_ROTATION_DEGREES] = it } + if (MimeTypes.isVideo(trackMime)) { + format.getSafeLong(MediaFormat.KEY_DURATION) { track[KEY_DURATION] = it / 1000 } + } + tracks.add(track) + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get HEIC track information for uri=$uri, pageIndex=$pageIndex", e) + } + } + extractor.release() + return tracks + } + + fun isIsoBMFFImageSefdMotionPhoto(context: Context, uri: Uri): Boolean { + return getIsoBMFFImageSefdMotionPhotoVideoSizing(context, uri) != null + } + + private fun getIsoBMFFImageSefdMotionPhotoVideoSizing(context: Context, uri: Uri): Pair? { + Mp4ParserHelper.getSamsungSefd(context, uri)?.let { (sefdOffset, sefdBytes) -> + // we could properly parse each tag until we find the "embedded video" tag (0x0a30) + // but it seems that decoding the SEFT trailer is necessary for this, + // so we simply search for the "MotionPhoto_Data" sequence instead + val name = Mp4ParserHelper.SEFD_MOTION_PHOTO_NAME + val index = sefdBytes.indexOfBytes(name.toByteArray(Charsets.UTF_8)) + if (index != -1) { + val videoOffset = sefdOffset + index + name.length + val videoSize = sefdBytes.size - (videoOffset - sefdOffset) + return Pair(videoOffset, videoSize) + } + } + return null + } + + private fun getJpegMpfPrimaryRotation(context: Context, uri: Uri, sizeBytes: Long): Int { + val mimeType = MimeTypes.JPEG + var rotationDegrees = 0 + + var foundExif = false + if (canReadWithMetadataExtractor(mimeType)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + foundExif = metadata.directories.any { it is ExifDirectoryBase && it.tagCount > 0 } + for (dir in metadata.getDirectoriesOfType(ExifIFD0Directory::class.java)) { + dir.getSafeInt(ExifDirectoryBase.TAG_ORIENTATION) { + rotationDegrees = Metadata.getRotationDegreesForExifCode(it) + } + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } + } + + if (!foundExif) { + // fallback to read EXIF via ExifInterface + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val exif = ExifInterface(input) + exif.getSafeInt(ExifInterface.TAG_ORIENTATION, acceptZero = false) { + rotationDegrees = exif.rotationDegrees + } + } + } catch (e: Exception) { + // ExifInterface initialization can fail with a RuntimeException + // caused by an internal MediaMetadataRetriever failure + Log.w(LOG_TAG, "failed to get metadata by ExifInterface for mimeType=$mimeType uri=$uri", e) + } + } + + return rotationDegrees + } + + // starts after `[APP2 marker (1 byte)] [segment size (2 bytes)] [MPF marker (4 bytes)]` + fun getJpegMpfBaseOffset(context: Context, uri: Uri, sizeBytes: Long?): Int? { + val mimeType = MimeTypes.JPEG + val endMarker = 0xFF + val app2Marker = JpegSegmentType.APP2.byteValue + val mpfMarker = "MPF".toByteArray() + 0x00 + + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + var offset = 0 + val marker = ByteArray(4) + while (true) { + // look for APP2 marker (0xFFE2) + var found = false + while (!found) { + var i = input.read() + if (i == -1) throw EOFException() + offset++ + if (i == endMarker) { + i = input.read() + if (i == -1) throw EOFException() + offset++ + found = i.toByte() == app2Marker + } + } + // skip 2 bytes for segment size + input.skip(2) + offset += 2 + input.read(marker, 0, marker.size) + offset += 4 + if (marker.contentEquals(mpfMarker)) { + return offset + } + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get MPF base offset from uri=$uri", e) + } + return null + } + + fun getJpegMpfEntries(context: Context, uri: Uri, sizeBytes: Long?): List? { + val mimeType = MimeTypes.JPEG + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + return metadata.getDirectoriesOfType(MpEntryDirectory::class.java).map { it.entry } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to find MPF entries", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to find MPF entries", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to find MPF entries", e) + } + return null + } + + fun getJpegMpfPages(context: Context, uri: Uri, sizeBytes: Long): ArrayList { + val primaryRotation = getJpegMpfPrimaryRotation(context, uri, sizeBytes) + + val pages = ArrayList() + val baseOffset = getJpegMpfBaseOffset(context, uri, sizeBytes) + val mpEntries = getJpegMpfEntries(context, uri, sizeBytes) + if (mpEntries != null && baseOffset != null) { + for ((pageIndex, mpEntry) in mpEntries.withIndex()) { + mpEntry.mimeType?.let { embedMimeType -> + val page = hashMapOf( + KEY_PAGE to pageIndex, + KEY_MIME_TYPE to embedMimeType, + KEY_IS_DEFAULT to (pageIndex == 0), + KEY_ROTATION_DEGREES to primaryRotation, + ) + + var dataOffset = mpEntry.dataOffset + if (dataOffset > 0) { + dataOffset += baseOffset + } + StorageUtils.openInputStream(context, uri)?.let { input -> + input.skip(dataOffset) + val options = BitmapFactory.Options().apply { + inJustDecodeBounds = true + } + BitmapFactory.decodeStream(input, null, options) + options.outWidth.takeIf { it >= 0 }?.let { page[KEY_WIDTH] = it } + options.outHeight.takeIf { it >= 0 }?.let { page[KEY_HEIGHT] = it } + + pages.add(page) + } + } + } + } + + return pages + } + + fun getJpegMpfBitmap(context: Context, uri: Uri, pageIndex: Int): Bitmap? { + val mpEntries = getJpegMpfEntries(context, uri, null) + if (mpEntries != null && pageIndex < mpEntries.size) { + val mpEntry = mpEntries[pageIndex] + var dataOffset = mpEntry.dataOffset + if (dataOffset > 0) { + val baseOffset = getJpegMpfBaseOffset(context, uri, null) + if (baseOffset != null) { + dataOffset += baseOffset + } + } + StorageUtils.openInputStream(context, uri)?.let { input -> + input.skip(dataOffset) + return BitmapFactory.decodeStream(input) + } + } + return null + } + + fun getMotionPhotoPages(context: Context, uri: Uri, mimeType: String, sizeBytes: Long): ArrayList { + val pages = ArrayList() + getMotionPhotoVideoInfo(context, uri, mimeType, sizeBytes)?.let { videoInfo -> + // set the original image as the first and default track + var pageIndex = 0 + pages.add( + hashMapOf( + KEY_PAGE to pageIndex++, + KEY_MIME_TYPE to mimeType, + KEY_IS_DEFAULT to true, + ) + ) + // add video tracks from the appended video + videoInfo.getString(MediaFormat.KEY_MIME)?.let { mime -> + if (MimeTypes.isVideo(mime)) { + val page: FieldMap = hashMapOf( + KEY_PAGE to pageIndex, + KEY_MIME_TYPE to MimeTypes.MP4, + KEY_IS_DEFAULT to false, + ) + videoInfo.getSafeInt(MediaFormat.KEY_WIDTH) { page[KEY_WIDTH] = it } + videoInfo.getSafeInt(MediaFormat.KEY_HEIGHT) { page[KEY_HEIGHT] = it } + videoInfo.getSafeInt(MediaFormat.KEY_ROTATION) { page[KEY_ROTATION_DEGREES] = it } + videoInfo.getSafeLong(MediaFormat.KEY_DURATION) { page[KEY_DURATION] = it / 1000 } + pages.add(page) + } + } + } + return pages + } + + fun getTrailerVideoSize(context: Context, uri: Uri, mimeType: String, sizeBytes: Long): Long? { + if (isHeic(mimeType)) { + // XMP in HEIC motion photos (as taken with a Samsung Camera v12.0.01.50) indicates an `Item:Length` of 68 bytes for the video. + // This item does not contain the video itself, but only some kind of metadata (no doc, no spec), + // so we ignore the `Item:Length` and look instead for the MP4 marker bytes indicating the start of the video. + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + if (MemoryUtils.canAllocate(sizeBytes)) { + val bytes = ByteArray(sizeBytes.toInt()) + DataInputStream(input).use { + it.readFully(bytes) + } + val index = bytes.indexOfBytes(heicMotionPhotoVideoStartIndicator) + if (index != -1) { + return sizeBytes - index + } + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get motion photo offset from uri=$uri", e) + } + } + + var offsetFromEnd: Long? = null + var foundXmp = false + + fun processXmp(xmpMeta: XMPMeta) { + offsetFromEnd = offsetFromEnd ?: GoogleXMP.getTrailingVideoOffsetFromEnd(xmpMeta) + } + + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + foundXmp = metadata.directories.any { it is XmpDirectory && it.tagCount > 0 } + metadata.getDirectoriesOfType(XmpDirectory::class.java).map { it.xmpMeta }.forEach(::processXmp) + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get motion photo offset from uri=$uri", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to get motion photo offset from uri=$uri", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to get motion photo offset from uri=$uri", e) + } + + XMP.checkIsoBMFFImage(context, mimeType, uri, foundXmp, ::processXmp) + + return offsetFromEnd + } + + private fun getMotionPhotoVideoInfo(context: Context, uri: Uri, mimeType: String, sizeBytes: Long): MediaFormat? { + getMotionPhotoVideoSizing(context, uri, mimeType, sizeBytes)?.let { (videoOffset, videoSize) -> + return getEmbedVideoInfo(context, uri, videoOffset, videoSize) + } + return null + } + + fun getTrailerVideoInfo(context: Context, uri: Uri, fileSize: Long, videoSize: Long): MediaFormat? { + return getEmbedVideoInfo(context, uri, videoOffset = fileSize - videoSize, videoSize = videoSize) + } + + private fun getEmbedVideoInfo(context: Context, uri: Uri, videoOffset: Long, videoSize: Long): MediaFormat? { + val extractor = MediaExtractor() + var pfd: ParcelFileDescriptor? = null + try { + pfd = context.contentResolver.openFileDescriptor(uri, "r") + pfd?.fileDescriptor?.let { fd -> + extractor.setDataSource(fd, videoOffset, videoSize) + // video track may be after an audio track + for (trackIndex in 0..? { + // default to trailer videos + getTrailerVideoSize(context, uri, mimeType, sizeBytes)?.let { videoSize -> + val videoOffset = sizeBytes - videoSize + return Pair(videoOffset, videoSize) + } + + if (isIsoBMFFImage(mimeType)) { + // fallback to video within Samsung SEFD box + return getIsoBMFFImageSefdMotionPhotoVideoSizing(context, uri) + } + + return null + } + + fun getTiffPages(context: Context, uri: Uri): ArrayList { + fun toMap(pageIndex: Int, options: TiffBitmapFactory.Options): FieldMap { + return hashMapOf( + KEY_PAGE to pageIndex, + KEY_MIME_TYPE to MimeTypes.TIFF, + KEY_WIDTH to options.outWidth, + KEY_HEIGHT to options.outHeight, + ) + } + + val pages = ArrayList() + getTiffPageInfo(context, uri, 0)?.let { first -> + pages.add(toMap(0, first)) + val pageCount = first.outDirectoryCount + for (pageIndex in 1.. 1 + + private fun getTiffPageInfo(context: Context, uri: Uri, page: Int): TiffBitmapFactory.Options? { + try { + val fd = context.contentResolver.openFileDescriptor(uri, "r")?.detachFd() + if (fd == null) { + Log.w(LOG_TAG, "failed to get TIFF file descriptor for uri=$uri") + return null + } + val options = TiffFetcher.buildOptions().apply { + inJustDecodeBounds = true + inDirectoryNumber = page + } + TiffBitmapFactory.decodeFileDescriptor(fd, options) + return options + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get TIFF page info for uri=$uri page=$page", e) + } + return null + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiTrackMedia.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiTrackMedia.kt new file mode 100644 index 0000000..f10c854 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiTrackMedia.kt @@ -0,0 +1,59 @@ +package deckers.thibault.aves.metadata + +import android.content.Context +import android.graphics.Bitmap +import android.media.MediaExtractor +import android.media.MediaFormat +import android.net.Uri +import android.os.Build +import android.util.Log +import androidx.annotation.RequiresApi +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.StorageUtils + +object MultiTrackMedia { + private val LOG_TAG = LogUtils.createTag() + + @RequiresApi(Build.VERSION_CODES.P) + fun getImage(context: Context, uri: Uri, trackIndex: Int?): Bitmap? { + val retriever = StorageUtils.openMetadataRetriever(context, uri) ?: return null + try { + return if (trackIndex != null) { + val imageIndex = trackIndexToImageIndex(context, uri, trackIndex) ?: return null + retriever.getImageAtIndex(imageIndex) + } else { + retriever.primaryImage + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to extract image from uri=$uri trackIndex=$trackIndex", e) + } finally { + // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs + retriever.release() + } + return null + } + + private fun trackIndexToImageIndex(context: Context, uri: Uri, trackIndex: Int): Int? { + val extractor = MediaExtractor() + try { + extractor.setDataSource(context, uri, null) + val trackCount = extractor.trackCount + var imageIndex = 0 + for (i in 0.. { + val metadataMap = HashMap() + + fun fetch(parents: String, entries: Iterable) { + for (entry in entries) { + metadataMap["$parents ${entry.key}"] = entry.value + if (entry.isMetadataEntryGroup) { + fetch("$parents ${entry.key} /", entry.metadataEntries) + } + } + } + + val metadataByType = Metadata.readMetadata(input) + for ((type, metadata) in metadataByType.entries) { + if (type == MetadataType.XMP) { + val xmp = metadataByType[MetadataType.XMP] as XMP? + if (xmp != null) { + metadataMap["XMP"] = xmp.xmpDocString() + if (xmp.hasExtendedXmp()) { + metadataMap["XMP extended"] = xmp.extendedXmpDocString() + } + } + } else { + fetch("$type /", metadata) + } + } + + return metadataMap + } + + fun getIptc(input: InputStream): List? { + val iptc = Metadata.readMetadata(input)[MetadataType.IPTC] as? IPTC? ?: return null + + val iptcDataList = ArrayList() + iptc.dataSets.forEach { dataSetEntry -> + val tag = dataSetEntry.key + val dataSets = dataSetEntry.value + iptcDataList.add( + hashMapOf( + "record" to tag.recordNumber, + "tag" to tag.tag, + "values" to dataSets.map { it.data }.toMutableList(), + ) + ) + } + return iptcDataList + } + + fun setIptc( + input: InputStream, + output: OutputStream, + iptcDataList: List?, + ) { + val iptc: List = iptcDataList?.flatMap { + val record = it["record"] as Int + val tag = it["tag"] as Int + val values = it["values"] as List<*> + values.map { data -> IPTCDataSet(IPTCRecord.fromRecordNumber(record), tag, data as ByteArray) } + } ?: ArrayList() + Metadata.insertIPTC(input, output, iptc) + } + + fun getXmp(input: InputStream): XMP? = Metadata.readMetadata(input)[MetadataType.XMP] as XMP? + + // PixyMeta may fail with just a log, and write nothing to the output + fun setXmp( + input: InputStream, + output: OutputStream, + xmpString: String?, + extendedXmpString: String? + ) { + if (extendedXmpString != null) { + JPGMeta.insertXMP(input, output, xmpString, extendedXmpString) + } else { + Metadata.insertXMP(input, output, xmpString) + } + } + + fun XMP.xmpDocString(): String = XMLUtils.serializeToString(xmpDocument) + + fun XMP.extendedXmpDocString(): String = XMLUtils.serializeToString(extendedXmpDocument) + + fun copyIptcXmp( + context: Context, + sourceMimeType: String, + sourceUri: Uri, + targetMimeType: String, + targetUri: Uri, + editableFile: File, + ) { + var pixyIptc: IPTC? = null + var pixyXmp: XMP? = null + if (MimeTypes.canReadWithPixyMeta(sourceMimeType)) { + StorageUtils.openInputStream(context, sourceUri)?.use { input -> + val metadata = Metadata.readMetadata(input) + if (MimeTypes.canEditIptc(targetMimeType)) { + pixyIptc = metadata[MetadataType.IPTC] as IPTC? + } + if (MimeTypes.canEditXmp(targetMimeType)) { + pixyXmp = metadata[MetadataType.XMP] as XMP? + } + } + } + if (pixyIptc != null || pixyXmp != null) { + editableFile.outputStream().use { output -> + if (pixyIptc != null) { + // reopen input to read from start + StorageUtils.openInputStream(context, targetUri)?.use { input -> + val iptcs = pixyIptc.dataSets.flatMap { it.value } + Metadata.insertIPTC(input, output, iptcs) + } + } + if (pixyXmp != null) { + // reopen input to read from start + StorageUtils.openInputStream(context, targetUri)?.use { input -> + val xmpString = pixyXmp.xmpDocString() + val extendedXmp = if (pixyXmp.hasExtendedXmp()) pixyXmp.extendedXmpDocString() else null + setXmp(input, output, xmpString, if (targetMimeType == MimeTypes.JPEG) extendedXmp else null) + } + } + } + } + } + + fun removeMetadata(input: InputStream, output: OutputStream, metadataTypes: Set) { + val types = metadataTypes.map(::toMetadataType).toTypedArray() + Metadata.removeMetadata(input, output, *types) + } + + private fun toMetadataType(typeString: String): MetadataType? = when (typeString) { + TYPE_COMMENT -> MetadataType.COMMENT + TYPE_EXIF -> MetadataType.EXIF + TYPE_ICC_PROFILE -> MetadataType.ICC_PROFILE + TYPE_IPTC -> MetadataType.IPTC + TYPE_JFIF -> MetadataType.JPG_JFIF + TYPE_JPEG_ADOBE -> MetadataType.JPG_ADOBE + TYPE_JPEG_DUCKY -> MetadataType.JPG_DUCKY + TYPE_PHOTOSHOP_IRB -> MetadataType.PHOTOSHOP_IRB + TYPE_XMP -> MetadataType.XMP + else -> null + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/QuickTimeMetadata.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/QuickTimeMetadata.kt new file mode 100644 index 0000000..d775e41 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/QuickTimeMetadata.kt @@ -0,0 +1,99 @@ +package deckers.thibault.aves.metadata + +import deckers.thibault.aves.utils.toHex +import java.math.BigInteger +import java.nio.charset.Charset + +class QuickTimeMetadataBlock(val type: String, val value: String, val language: String) + +object QuickTimeMetadata { + // QuickTime Profile Tags + // cf https://exiftool.org/TagNames/QuickTime.html#Profile + const val PROF_UUID = "50524f46-21d2-4fce-bb88-695cfac9c740" + + // QuickTime UserMedia Tags + // cf https://exiftool.org/TagNames/QuickTime.html#UserMedia + const val USMT_UUID = "55534d54-21d2-4fce-bb88-695cfac9c740" + + private const val METADATA_BOX_ID = "MTDT" + + fun parseUuidUsmt(data: ByteArray): List { + val blocks = ArrayList() + val boxHeader = BoxHeader(data) + if (boxHeader.boxType == METADATA_BOX_ID) { + blocks.addAll(parseQuicktimeMtdtBox(boxHeader, data)) + } + return blocks + } + + private fun parseQuicktimeMtdtBox(boxHeader: BoxHeader, data: ByteArray): List { + val blocks = ArrayList() + var bytes = data + val blockCount = BigInteger(bytes.copyOfRange(8, 10)).toInt() + bytes = bytes.copyOfRange(10, boxHeader.boxDataSize) + + (0.. + val blockSize = BigInteger(bytes.copyOfRange(0, 2)).toInt() + val blockType = BigInteger(bytes.copyOfRange(2, 6)).toInt() + val language = parseLanguage(bytes.copyOfRange(6, 8)) + val encoding = BigInteger(bytes.copyOfRange(8, 10)).toInt() + val payload = bytes.copyOfRange(10, blockSize) + + val payloadString = when (encoding) { + // 0x00: short array + 0x00 -> { + payload + .asList() + .chunked(2) + .map { (h, l) -> ((h.toInt() shl 8) + l.toInt()).toShort() } + .joinToString() + } + // 0x01: string + 0x01 -> String(payload, Charset.forName("UTF-16BE")).trim() + // 0x101: artwork/icon + else -> "0x${payload.toHex()}" + } + + val blockTypeString = when (blockType) { + 0x01 -> "Title" + 0x03 -> "Creation Time" + 0x04 -> "Software" + 0x0A -> "Track property" + 0x0B -> "Time zone" + 0x0C -> "Modification Time" + else -> "0x${blockType.toByte().toHex()}" + } + + blocks.add( + QuickTimeMetadataBlock( + type = blockTypeString, + value = payloadString, + language = language, + ) + ) + bytes = bytes.copyOfRange(blockSize, bytes.size) + } + + return blocks + } + + // ISO 639 language code written as 3 groups of 5 bits for each letter (ascii code - 0x60) + // e.g. 0x55c4 -> 10101 01110 00100 -> 21 14 4 -> "und" + private fun parseLanguage(bytes: ByteArray): String { + val i = BigInteger(bytes).toInt() + val c1 = Character.toChars((i shr 10 and 0x1F) + 0x60)[0] + val c2 = Character.toChars((i shr 5 and 0x1F) + 0x60)[0] + val c3 = Character.toChars((i and 0x1F) + 0x60)[0] + return "$c1$c2$c3" + } +} + +class BoxHeader(bytes: ByteArray) { + var boxDataSize: Int = 0 + var boxType: String + + init { + boxDataSize = BigInteger(bytes.copyOfRange(0, 4)).toInt() + boxType = String(bytes.copyOfRange(4, 8)) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/SphericalVideo.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/SphericalVideo.kt new file mode 100644 index 0000000..783e4b2 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/SphericalVideo.kt @@ -0,0 +1,109 @@ +package deckers.thibault.aves.metadata + +import android.util.Log +import android.util.Xml +import deckers.thibault.aves.utils.LogUtils +import org.xmlpull.v1.XmlPullParser +import java.io.ByteArrayInputStream + +// `xmlBytes`: bytes representing the XML embedded in a MP4 `uuid` box, according to Spherical Video V1 spec +class GSpherical(xmlBytes: ByteArray) { + private var spherical: Boolean = false + private var stitched: Boolean = false + private var stitchingSoftware: String = "" + private var projectionType: String = "" + private var stereoMode: String? = null + private var sourceCount: Int? = null + private var initialViewHeadingDegrees: Int? = null + private var initialViewPitchDegrees: Int? = null + private var initialViewRollDegrees: Int? = null + private var timestamp: Int? = null + private var fullPanoWidthPixels: Int? = null + private var fullPanoHeightPixels: Int? = null + private var croppedAreaImageWidthPixels: Int? = null + private var croppedAreaImageHeightPixels: Int? = null + private var croppedAreaLeftPixels: Int? = null + private var croppedAreaTopPixels: Int? = null + + init { + try { + ByteArrayInputStream(xmlBytes).use { + val parser = Xml.newPullParser().apply { + setInput(it, null) + nextTag() + require(XmlPullParser.START_TAG, RDF_NS, "SphericalVideo") + } + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.eventType != XmlPullParser.START_TAG) continue + if (parser.namespace == GSPHERICAL_NS) { + when (val tag = parser.name) { + "Spherical" -> spherical = readTag(parser, tag) == "true" + "Stitched" -> stitched = readTag(parser, tag) == "true" + "StitchingSoftware" -> stitchingSoftware = readTag(parser, tag) + "ProjectionType" -> projectionType = readTag(parser, tag) + "StereoMode" -> stereoMode = readTag(parser, tag) + "SourceCount" -> sourceCount = readTag(parser, tag).toInt() + "InitialViewHeadingDegrees" -> initialViewHeadingDegrees = readTag(parser, tag).toInt() + "InitialViewPitchDegrees" -> initialViewPitchDegrees = readTag(parser, tag).toInt() + "InitialViewRollDegrees" -> initialViewRollDegrees = readTag(parser, tag).toInt() + "Timestamp" -> timestamp = readTag(parser, tag).toInt() + "FullPanoWidthPixels" -> fullPanoWidthPixels = readTag(parser, tag).toInt() + "FullPanoHeightPixels" -> fullPanoHeightPixels = readTag(parser, tag).toInt() + "CroppedAreaImageWidthPixels" -> croppedAreaImageWidthPixels = readTag(parser, tag).toInt() + "CroppedAreaImageHeightPixels" -> croppedAreaImageHeightPixels = readTag(parser, tag).toInt() + "CroppedAreaLeftPixels" -> croppedAreaLeftPixels = readTag(parser, tag).toInt() + "CroppedAreaTopPixels" -> croppedAreaTopPixels = readTag(parser, tag).toInt() + } + } + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to parse XML", e) + } + } + + fun describe(): Map = hashMapOf( + "Spherical" to spherical.toString(), + "Stitched" to stitched.toString(), + "Stitching Software" to stitchingSoftware, + "Projection Type" to projectionType, + "Stereo Mode" to stereoMode, + "Source Count" to sourceCount?.toString(), + "Initial View Heading Degrees" to initialViewHeadingDegrees?.toString(), + "Initial View Pitch Degrees" to initialViewPitchDegrees?.toString(), + "Initial View Roll Degrees" to initialViewRollDegrees?.toString(), + "Timestamp" to timestamp?.toString(), + "Full Panorama Width Pixels" to fullPanoWidthPixels?.toString(), + "Full Panorama Height Pixels" to fullPanoHeightPixels?.toString(), + "Cropped Area Image Width Pixels" to croppedAreaImageWidthPixels?.toString(), + "Cropped Area Image Height Pixels" to croppedAreaImageHeightPixels?.toString(), + "Cropped Area Left Pixels" to croppedAreaLeftPixels?.toString(), + "Cropped Area Top Pixels" to croppedAreaTopPixels?.toString(), + ).filterValues { it != null }.mapValues { it.value as String } + + companion object SphericalVideo { + private val LOG_TAG = LogUtils.createTag() + + // cf https://github.com/google/spatial-media + const val SPHERICAL_VIDEO_V1_UUID = "ffcc8263-f855-4a93-8814-587a02521fdd" + + const val RDF_NS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" + const val GSPHERICAL_NS = "http://ns.google.com/videos/1.0/spherical/" + + private fun readText(parser: XmlPullParser): String { + var text = "" + if (parser.next() == XmlPullParser.TEXT) { + text = parser.text + parser.nextTag() + } + return text + } + + private fun readTag(parser: XmlPullParser, tag: String): String { + parser.require(XmlPullParser.START_TAG, GSPHERICAL_NS, tag) + val text = readText(parser) + parser.require(XmlPullParser.END_TAG, GSPHERICAL_NS, tag) + return text + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/SvgHelper.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/SvgHelper.kt new file mode 100644 index 0000000..a170e4e --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/SvgHelper.kt @@ -0,0 +1,33 @@ +package deckers.thibault.aves.metadata + +import com.caverock.androidsvg.SVG +import java.io.BufferedInputStream +import java.io.InputStream +import kotlin.math.max + +object SvgHelper { + const val IMAGE_BASE64_SIZE_DANGER_THRESHOLD: Long = 5 * (1 shl 20) // MB + + fun SVG.normalizeSize() { + if (documentViewBox == null) { + setDocumentViewBox(0f, 0f, documentWidth, documentHeight) + } + setDocumentWidth("100%") + setDocumentHeight("100%") + } +} + +// As of AndroidSVG v1.4, SVGParser.ENTITY_WATCH_BUFFER_SIZE is set at 4096. +// This constant is not configurable and used for the internal buffer mark read limit. +// Parsing will fail if the SVG header is larger than this value. +// So we define and apply a minimum read limit. +class SVGParserBufferedInputStream(input: InputStream) : BufferedInputStream(input) { + @Synchronized + override fun mark(readlimit: Int) { + super.mark(max(MINIMUM_READ_LIMIT, readlimit)) + } + + companion object { + private const val MINIMUM_READ_LIMIT = 1 shl 14 // 16kB + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/Helper.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/Helper.kt new file mode 100644 index 0000000..b851d90 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/Helper.kt @@ -0,0 +1,403 @@ +package deckers.thibault.aves.metadata.metadataextractor + +import android.util.Log +import com.drew.imaging.FileType +import com.drew.imaging.FileTypeDetector +import com.drew.imaging.ImageMetadataReader +import com.drew.imaging.ImageProcessingException +import com.drew.imaging.jpeg.JpegMetadataReader +import com.drew.imaging.jpeg.JpegSegmentMetadataReader +import com.drew.imaging.mp4.Mp4Reader +import com.drew.imaging.tiff.TiffProcessingException +import com.drew.imaging.tiff.TiffReader +import com.drew.lang.ByteArrayReader +import com.drew.lang.RandomAccessStreamReader +import com.drew.lang.Rational +import com.drew.lang.SequentialByteArrayReader +import com.drew.metadata.Directory +import com.drew.metadata.StringValue +import com.drew.metadata.exif.ExifDirectoryBase +import com.drew.metadata.exif.ExifIFD0Directory +import com.drew.metadata.exif.ExifReader +import com.drew.metadata.exif.ExifSubIFDDirectory +import com.drew.metadata.file.FileTypeDirectory +import com.drew.metadata.iptc.IptcReader +import com.drew.metadata.png.PngDirectory +import com.drew.metadata.xmp.XmpReader +import deckers.thibault.aves.metadata.ExifGeoTiffTags +import deckers.thibault.aves.metadata.GeoTiffKeys +import deckers.thibault.aves.metadata.Metadata +import deckers.thibault.aves.metadata.metadataextractor.mpf.MpfReader +import deckers.thibault.aves.utils.LogUtils +import java.io.BufferedInputStream +import java.io.IOException +import java.io.InputStream +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Date +import java.util.GregorianCalendar +import java.util.Locale +import java.util.TimeZone +import java.util.regex.Pattern + +object Helper { + private val LOG_TAG = LogUtils.createTag() + + const val PNG_ITXT_DIR_NAME = "PNG-iTXt" + private const val PNG_TEXT_DIR_NAME = "PNG-tEXt" + const val PNG_TIME_DIR_NAME = "PNG-tIME" + private const val PNG_ZTXT_DIR_NAME = "PNG-zTXt" + private const val PNG_RAW_PROFILE_EXIF = "Raw profile type exif" + private const val PNG_RAW_PROFILE_IPTC = "Raw profile type iptc" + + val PNG_LAST_MODIFICATION_TIME_FORMAT = SimpleDateFormat("yyyy:MM:dd HH:mm:ss", Locale.ROOT) + + // Pattern to extract profile name, length, and text data + // of raw profiles (EXIF, IPTC, etc.) in PNG `zTXt` chunks + // e.g. "iptc [...] 114 [...] 3842494d040400[...]" + // e.g. "exif [...] 134 [...] 4578696600004949[...]" + private val PNG_RAW_PROFILE_PATTERN = Regex("^\\n(.*?)\\n\\s*(\\d+)\\n(.*)", RegexOption.DOT_MATCHES_ALL) + + fun readMimeType(input: InputStream): String? { + val bufferedInputStream = input as? BufferedInputStream ?: BufferedInputStream(input) + return FileTypeDetector.detectFileType(bufferedInputStream).mimeType + } + + @Throws(IOException::class, ImageProcessingException::class) + fun safeRead(input: InputStream, @Suppress("unused_parameter") sizeBytes: Long?): com.drew.metadata.Metadata { + val inputStream = input as? BufferedInputStream ?: BufferedInputStream(input) + val fileType = FileTypeDetector.detectFileType(inputStream) + + // Providing the stream length is risky, as it may crash if it is incorrect. + // Not providing the stream length is also risky, as it may lead to OOM + // when `RandomAccessStreamReader` reads the entire stream to validate offsets. + val undefinedStreamLength = -1L + + val metadata = when (fileType) { + FileType.Jpeg -> safeReadJpeg(inputStream) + FileType.Mp4 -> safeReadMp4(inputStream) + FileType.Png -> safeReadPng(inputStream) + FileType.Psd -> safeReadPsd(inputStream) + FileType.Tiff, + FileType.Arw, + FileType.Cr2, + FileType.Nef, + FileType.Orf, + FileType.Rw2 -> safeReadTiff(inputStream, undefinedStreamLength) + + else -> ImageMetadataReader.readMetadata(inputStream, undefinedStreamLength, fileType) + } + + metadata.addDirectory(FileTypeDirectory(fileType)) + return metadata + } + + // Some JPEG, TIFF, MP4 (and other types?) contain XMP with a preposterous number of `DocumentAncestors`. + // This bloated XMP is unsafely loaded in memory by Adobe's `XMPMetaParser.parseInputSource` + // which easily yields OOM on Android, so we try to detect and strip extended XMP with a modified XMP reader. + private fun safeReadJpeg(input: InputStream): com.drew.metadata.Metadata { + val readers = ArrayList().apply { + addAll(JpegMetadataReader.ALL_READERS.filter { it !is XmpReader }) + add(SafeXmpReader()) + add(MpfReader()) + } + + val metadata = com.drew.metadata.Metadata() + JpegMetadataReader.process(metadata, input, readers) + return metadata + } + + private fun safeReadPng(input: InputStream): com.drew.metadata.Metadata { + return SafePngMetadataReader.readMetadata(input) + } + + private fun safeReadPsd(input: InputStream): com.drew.metadata.Metadata { + return SafePsdMetadataReader.readMetadata(input) + } + + @Throws(IOException::class, TiffProcessingException::class) + fun safeReadTiff(input: InputStream, streamLength: Long): com.drew.metadata.Metadata { + val reader = RandomAccessStreamReader(input, RandomAccessStreamReader.DEFAULT_CHUNK_LENGTH, streamLength) + val metadata = com.drew.metadata.Metadata() + val handler = SafeExifTiffHandler(metadata, null, 0) + TiffReader().processTiff(reader, handler, 0) + return metadata + } + + private fun safeReadMp4(input: InputStream): com.drew.metadata.Metadata { + val metadata = com.drew.metadata.Metadata() + Mp4Reader.extract(input, SafeMp4BoxHandler(metadata)) + return metadata + } + + // extensions + + fun Directory.getSafeString(tag: Int, acceptBlank: Boolean = true, save: (value: String) -> Unit) { + if (this.containsTag(tag)) { + val string = this.getString(tag) + if (acceptBlank || string.isNotBlank()) { + save(string) + } + } + } + + fun Directory.getSafeBoolean(tag: Int, save: (value: Boolean) -> Unit) { + if (this.containsTag(tag)) save(this.getBoolean(tag)) + } + + fun Directory.getSafeInt(tag: Int, save: (value: Int) -> Unit) { + if (this.containsTag(tag)) save(this.getInt(tag)) + } + + fun Directory.getSafeLong(tag: Int, save: (value: Long) -> Unit) { + if (this.containsTag(tag)) save(this.getLong(tag)) + } + + fun Directory.getSafeRational(tag: Int, save: (value: Rational) -> Unit) { + if (this.containsTag(tag)) save(this.getRational(tag)) + } + + fun Directory.getSafeDateMillis(tag: Int, subSecond: String?): Long? { + if (this.containsTag(tag)) { + val date = this.getDatePlus(tag, subSecond, TimeZone.getDefault()) + if (date != null) return date.time + } + return null + } + + // This seems to cover all known Exif and Xmp date strings + // Note that " : : : : " is a valid date string according to the Exif spec (which means 'unknown date'): http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/datetimeoriginal.html + private val dateFormats = arrayOf( + "yyyy:MM:dd HH:mm:ss", + "yyyy:MM:dd HH:mm", + "yyyy-MM-dd HH:mm:ss", + "yyyy-MM-dd HH:mm", + "yyyy.MM.dd HH:mm:ss", + "yyyy.MM.dd HH:mm", + "yyyy-MM-dd'T'HH:mm:ss", + "yyyy-MM-dd'T'HH:mm", + "yyyy-MM-dd", + "yyyy-MM", + "yyyyMMdd", // as used in IPTC data + "yyyy" + ).map { SimpleDateFormat(it, Locale.ROOT) }.toTypedArray() + private val subsecondPattern = Pattern.compile("(\\d\\d:\\d\\d:\\d\\d)(\\.\\d+)") + private val timeZonePattern = Pattern.compile("(Z|[+-]\\d\\d:\\d\\d|[+-]\\d\\d\\d\\d)$") + private val calendar: Calendar = GregorianCalendar() + private const val PARSED_DATE_YEAR_MAX = 10000 + + // adapted from `metadata-extractor` v2.18.0 `Directory.getDate()` + // to also parse dates written as timestamps + private fun Directory.getDatePlus(tagType: Int, subSecond: String?, timeZone: TimeZone?): Date? { + var effectiveSubSecond = subSecond + var effectiveTimeZone = timeZone + val o = this.getObject(tagType) + if (o is Date) return o + + var date: Date? = null + if (o is String || o is StringValue) { + var dateString = o.toString() + + // if the date string has subsecond information, it supersedes the subsecond parameter + val subsecondMatcher = subsecondPattern.matcher(dateString) + if (subsecondMatcher.find()) { + effectiveSubSecond = subsecondMatcher.group(2)?.substring(1) + dateString = subsecondMatcher.replaceAll("$1") + } + + // if the date string has time zone information, it supersedes the timeZone parameter + val timeZoneMatcher = timeZonePattern.matcher(dateString) + if (timeZoneMatcher.find()) { + effectiveTimeZone = TimeZone.getTimeZone("GMT" + timeZoneMatcher.group().replace("Z".toRegex(), "")) + dateString = timeZoneMatcher.replaceAll("") + } + for (dateFormat in dateFormats) { + try { + dateFormat.timeZone = effectiveTimeZone ?: TimeZone.getTimeZone("GMT") // don't interpret zone time + val parsed = dateFormat.parse(dateString) + if (parsed != null) { + calendar.time = parsed + if (calendar.get(Calendar.YEAR) < PARSED_DATE_YEAR_MAX) { + date = parsed + break + } + } + } catch (_: ParseException) { + // simply try the next pattern + } + } + if (date == null) { + val dateLong = dateString.toLongOrNull() + if (dateLong != null) { + val epochTimeMillis = when (dateLong) { + in 0..99999999999 -> dateLong * 1000 // seconds + in 100000000000..99999999999999 -> dateLong // millis + in 100000000000000..9999999999999999 -> dateLong / 1000 // micros + else -> dateLong / 1000000 // nanos + } + date = Date(epochTimeMillis) + } + } + } + if (date == null) return null + + if (effectiveSubSecond != null) { + try { + val millisecond = (".$effectiveSubSecond".toDouble() * 1000).toInt() + if (millisecond in 0..999) { + val calendar = Calendar.getInstance() + calendar.time = date + calendar[Calendar.MILLISECOND] = millisecond + return calendar.time + } + } catch (_: NumberFormatException) { + // ignore + } + } + return date + } + + // time tag and sub-second tag are *not* in the same directory + fun ExifSubIFDDirectory.getDateModifiedMillis(save: (value: Long) -> Unit) { + val parent = parent + if (parent is ExifIFD0Directory) { + val subSecond = getString(ExifSubIFDDirectory.TAG_SUBSECOND_TIME) + val dateMillis = parent.getSafeDateMillis(ExifIFD0Directory.TAG_DATETIME, subSecond) + if (dateMillis != null) save(dateMillis) + } + } + + fun ExifSubIFDDirectory.getDateDigitizedMillis(save: (value: Long) -> Unit) { + val subSecond = getString(ExifSubIFDDirectory.TAG_SUBSECOND_TIME_DIGITIZED) + val dateMillis = this.getSafeDateMillis(ExifSubIFDDirectory.TAG_DATETIME_DIGITIZED, subSecond) + if (dateMillis != null) save(dateMillis) + } + + fun ExifSubIFDDirectory.getDateOriginalMillis(save: (value: Long) -> Unit) { + val subSecond = getString(ExifSubIFDDirectory.TAG_SUBSECOND_TIME_ORIGINAL) + val dateMillis = this.getSafeDateMillis(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL, subSecond) + if (dateMillis != null) save(dateMillis) + } + + // geotiff + + /* + cf http://docs.opengeospatial.org/is/19-008r4/19-008r4.html#_underlying_tiff_requirements + - One of ModelTiepointTag or ModelTransformationTag SHALL be included in an Image File Directory (IFD) + - If the ModelTransformationTag is included in an IFD, then a ModelPixelScaleTag SHALL NOT be included + - If the ModelPixelScaleTag is included in an IFD, then a ModelTiepointTag SHALL also be included. + */ + fun ExifDirectoryBase.containsGeoTiffTags(): Boolean { + if (!this.containsTag(ExifGeoTiffTags.TAG_GEO_KEY_DIRECTORY)) return false + + val modelTiePoints = this.containsTag(ExifGeoTiffTags.TAG_MODEL_TIE_POINT) + val modelTransformation = this.containsTag(ExifGeoTiffTags.TAG_MODEL_TRANSFORMATION) + if (!modelTiePoints && !modelTransformation) return false + + val modelPixelScale = this.containsTag(ExifGeoTiffTags.TAG_MODEL_PIXEL_SCALE) + return !(modelTransformation && modelPixelScale) + } + + // TODO TLAD use `GeoTiffDirectory` from the Java version of `metadata-extractor` when available + // adapted from https://github.com/drewnoakes/metadata-extractor-dotnet/blob/master/MetadataExtractor/Formats/Exif/ExifTiffHandler.cs + fun ExifIFD0Directory.extractGeoKeys(geoKeys: IntArray): HashMap { + val fields = HashMap() + if (geoKeys.size < 4) return fields + + var i = 0 + val directoryVersion = geoKeys[i++] + val revision = geoKeys[i++] + val minorRevision = geoKeys[i++] + val numberOfKeys = geoKeys[i++] + + fields[GeoTiffKeys.GEOTIFF_VERSION] = "$directoryVersion.$revision.$minorRevision" + + (0.. + val keyId = geoKeys[i++] + val tiffTagLocation = geoKeys[i++] + val valueCount = geoKeys[i++] + val valueOffset = geoKeys[i++] + + try { + if (tiffTagLocation == 0) { + fields[keyId] = valueOffset + } else { + val sourceValue = getObject(tiffTagLocation) + if (sourceValue is StringValue) { + if (valueOffset + valueCount <= sourceValue.bytes.size) { + fields[keyId] = String(sourceValue.bytes, valueOffset, valueCount).trimEnd('|') + } else { + Log.w(LOG_TAG, "GeoTIFF key $keyId with offset $valueOffset and count $valueCount extends beyond length of source value (${sourceValue.bytes.size})") + } + } else if (sourceValue.javaClass.isArray) { + val sourceArray = sourceValue as DoubleArray + if (valueOffset + valueCount <= sourceArray.size) { + fields[keyId] = sourceArray.copyOfRange(valueOffset, valueOffset + valueCount) + } else { + Log.w(LOG_TAG, "GeoTIFF key $keyId with offset $valueOffset and count $valueCount extends beyond length of source value (${sourceArray.size})") + } + } else { + Log.w(LOG_TAG, "GeoTIFF key $keyId references tag $tiffTagLocation which has unsupported type of ${sourceValue?.javaClass}") + } + } + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to extract GeoTiff fields from keys", e) + } + } + + return fields + } + + // PNG + + fun Directory.isPngTextDir(): Boolean = this is PngDirectory && setOf(PNG_ITXT_DIR_NAME, PNG_TEXT_DIR_NAME, PNG_ZTXT_DIR_NAME).contains(this.name) + + fun extractPngProfile(key: String, valueString: String): Iterable? { + if (key == PNG_RAW_PROFILE_EXIF || key == PNG_RAW_PROFILE_IPTC) { + val match = PNG_RAW_PROFILE_PATTERN.matchEntire(valueString) + if (match != null) { + val dataString = match.groupValues[3] + val hexString = dataString.replace(Regex("[\\r\\n]"), "") + val dataBytes = hexString.decodeHex() + if (dataBytes != null) { + val metadata = com.drew.metadata.Metadata() + when (key) { + PNG_RAW_PROFILE_EXIF -> { + if (ExifReader.startsWithJpegExifPreamble(dataBytes)) { + ExifReader().extract(ByteArrayReader(dataBytes), metadata, ExifReader.JPEG_SEGMENT_PREAMBLE.length) + } + } + + PNG_RAW_PROFILE_IPTC -> { + val start = dataBytes.indexOf(Metadata.IPTC_MARKER_BYTE) + if (start != -1) { + val segmentBytes = dataBytes.copyOfRange(fromIndex = start, toIndex = dataBytes.size) + IptcReader().extract(SequentialByteArrayReader(segmentBytes), metadata, segmentBytes.size.toLong()) + } + } + } + return metadata.directories + } + } + } + return null + } + + // convenience methods + + private fun String.decodeHex(): ByteArray? { + if (length % 2 != 0) return null + + try { + val byteIterator = chunkedSequence(2) + .map { it.toInt(16).toByte() } + .iterator() + + return ByteArray(length / 2) { byteIterator.next() } + } catch (e: NumberFormatException) { + Log.w(LOG_TAG, "failed to decode hex string=$this", e) + } + return null + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/PngActlDirectory.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/PngActlDirectory.kt new file mode 100644 index 0000000..50fc92e --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/PngActlDirectory.kt @@ -0,0 +1,23 @@ +package deckers.thibault.aves.metadata.metadataextractor + +import com.drew.imaging.png.PngChunkType +import com.drew.metadata.png.PngDirectory + +class PngActlDirectory : PngDirectory(chunkType) { + override fun getTagNameMap(): HashMap { + return tagNames + } + + companion object { + val chunkType = PngChunkType("acTL") + + // tags should be distinct from those already defined in `PngDirectory` + const val TAG_NUM_FRAMES = 101 + const val TAG_NUM_PLAYS = 102 + + private val tagNames = hashMapOf( + TAG_NUM_FRAMES to "Number Of Frames", + TAG_NUM_PLAYS to "Number Of Plays", + ) + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeExifTiffHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeExifTiffHandler.kt new file mode 100644 index 0000000..39a4c49 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeExifTiffHandler.kt @@ -0,0 +1,28 @@ +package deckers.thibault.aves.metadata.metadataextractor + +import com.drew.lang.RandomAccessReader +import com.drew.metadata.Directory +import com.drew.metadata.Metadata +import com.drew.metadata.exif.ExifIFD0Directory +import com.drew.metadata.exif.ExifSubIFDDirectory +import com.drew.metadata.exif.ExifTiffHandler +import java.io.IOException + +class SafeExifTiffHandler(metadata: Metadata, parentDirectory: Directory?, exifStartOffset: Int) : ExifTiffHandler(metadata, parentDirectory, exifStartOffset) { + @Throws(IOException::class) + override fun customProcessTag( + tagOffset: Int, + processedIfdOffsets: MutableSet?, + tiffHeaderOffset: Int, + reader: RandomAccessReader?, + tagId: Int, + byteCount: Int, + ): Boolean { + if (tagId == ExifSubIFDDirectory.TAG_APPLICATION_NOTES && (_currentDirectory is ExifIFD0Directory || _currentDirectory is ExifSubIFDDirectory)) { + SafeXmpReader().extract(reader!!.getNullTerminatedBytes(tagOffset, byteCount), _metadata, _currentDirectory) + return true + } + + return super.customProcessTag(tagOffset, processedIfdOffsets, tiffHeaderOffset, reader, tagId, byteCount) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeMp4BoxHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeMp4BoxHandler.kt new file mode 100644 index 0000000..b4e8377 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeMp4BoxHandler.kt @@ -0,0 +1,20 @@ +package deckers.thibault.aves.metadata.metadataextractor + +import com.drew.imaging.mp4.Mp4Handler +import com.drew.metadata.Metadata +import com.drew.metadata.mp4.Mp4BoxHandler +import com.drew.metadata.mp4.Mp4BoxTypes +import com.drew.metadata.mp4.Mp4Context +import java.io.IOException + +class SafeMp4BoxHandler(metadata: Metadata) : Mp4BoxHandler(metadata) { + @Throws(IOException::class) + override fun processBox(type: String, payload: ByteArray?, boxSize: Long, context: Mp4Context?): Mp4Handler<*>? { + if (payload != null && type == Mp4BoxTypes.BOX_USER_DEFINED) { + val userBoxHandler = SafeMp4UuidBoxHandler(metadata) + userBoxHandler.processBox(type, payload, boxSize, context) + return this + } + return super.processBox(type, payload, boxSize, context) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeMp4UuidBoxHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeMp4UuidBoxHandler.kt new file mode 100644 index 0000000..147f67f --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeMp4UuidBoxHandler.kt @@ -0,0 +1,20 @@ +package deckers.thibault.aves.metadata.metadataextractor + +import com.drew.imaging.mp4.Mp4Handler +import com.drew.metadata.Metadata +import com.drew.metadata.mp4.Mp4Context +import com.drew.metadata.mp4.media.Mp4UuidBoxHandler +import deckers.thibault.aves.metadata.xmp.XMP + +class SafeMp4UuidBoxHandler(metadata: Metadata) : Mp4UuidBoxHandler(metadata) { + override fun processBox(type: String?, payload: ByteArray?, boxSize: Long, context: Mp4Context?): Mp4Handler<*> { + if (payload != null && payload.size >= 16) { + val payloadUuid = payload.copyOfRange(0, 16) + if (payloadUuid.contentEquals(XMP.mp4Uuid)) { + SafeXmpReader().extract(payload, 16, payload.size - 16, metadata, directory) + return this + } + } + return super.processBox(type, payload, boxSize, context) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePhotoshopReader.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePhotoshopReader.kt new file mode 100644 index 0000000..9f9dc29 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePhotoshopReader.kt @@ -0,0 +1,115 @@ +package deckers.thibault.aves.metadata.metadataextractor + +import com.drew.imaging.ImageProcessingException +import com.drew.lang.ByteArrayReader +import com.drew.lang.SequentialByteArrayReader +import com.drew.lang.SequentialReader +import com.drew.metadata.Directory +import com.drew.metadata.Metadata +import com.drew.metadata.exif.ExifReader +import com.drew.metadata.icc.IccReader +import com.drew.metadata.iptc.IptcReader +import com.drew.metadata.photoshop.PhotoshopDirectory +import com.drew.metadata.photoshop.PhotoshopReader + +// adapted from `PhotoshopReader` to prevent OOM from reading large XMP +// as of `metadata-extractor` v2.18.0, there is no way to customize the Photoshop reader +// without copying the whole `extract` function +class SafePhotoshopReader : PhotoshopReader() { + override fun extract(reader: SequentialReader, length: Int, metadata: Metadata, parentDirectory: Directory?) { + val directory = PhotoshopDirectory() + metadata.addDirectory(directory) + + if (parentDirectory != null) { + directory.parent = parentDirectory + } + + // Data contains a sequence of Image Resource Blocks (IRBs): + // + // 4 bytes - Signature; mostly "8BIM" but "PHUT", "AgHg" and "DCSR" are also found + // 2 bytes - Resource identifier + // String - Pascal string, padded to make length even + // 4 bytes - Size of resource data which follows + // Data - The resource data, padded to make size even + // + // http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037504 + + var pos = 0 + var clippingPathCount = 0 + while (pos < length) { + try { + // 4 bytes for the signature ("8BIM", "PHUT", etc.) + val signature = reader.getString(4) + pos += 4 + + // 2 bytes for the resource identifier (tag type). + val tagType = reader.uInt16 // segment type + pos += 2 + + // A variable number of bytes holding a pascal string (two leading bytes for length). + var descriptionLength = reader.uInt8.toInt() + pos += 1 + // Some basic bounds checking + if (descriptionLength < 0 || descriptionLength + pos > length) { + throw ImageProcessingException("Invalid string length") + } + + // Get name (important for paths) + val description = StringBuilder() + descriptionLength += pos + // Loop through each byte and append to string + while (pos < descriptionLength) { + description.append(Char(reader.uInt8.toUShort())) + pos++ + } + + // The number of bytes is padded with a trailing zero, if needed, to make the size even. + if (pos % 2 != 0) { + reader.skip(1) + pos++ + } + + // 4 bytes for the size of the resource data that follows. + val byteCount = reader.int32 + pos += 4 + // The resource data. + var tagBytes = reader.getBytes(byteCount) + pos += byteCount + // The number of bytes is padded with a trailing zero, if needed, to make the size even. + if (pos % 2 != 0) { + reader.skip(1) + pos++ + } + + if (signature == "8BIM") { + when (tagType) { + PhotoshopDirectory.TAG_IPTC -> IptcReader().extract(SequentialByteArrayReader(tagBytes), metadata, tagBytes.size.toLong(), directory) + PhotoshopDirectory.TAG_ICC_PROFILE_BYTES -> IccReader().extract(ByteArrayReader(tagBytes), metadata, directory) + PhotoshopDirectory.TAG_EXIF_DATA_1, + PhotoshopDirectory.TAG_EXIF_DATA_3 -> ExifReader().extract(ByteArrayReader(tagBytes), metadata, 0, directory) + + PhotoshopDirectory.TAG_XMP_DATA -> SafeXmpReader().extract(tagBytes, metadata, directory) + in 0x07D0..0x0BB6 -> { + clippingPathCount++ + tagBytes = tagBytes.copyOf(tagBytes.size + description.length + 1) + // Append description(name) to end of byte array with 1 byte before the description representing the length + for (i in tagBytes.size - description.length - 1 until tagBytes.size) { + if (i % (tagBytes.size - description.length - 1 + description.length) == 0) tagBytes[i] = description.length.toByte() else tagBytes[i] = description[i - (tagBytes.size - description.length - 1)].code.toByte() + } +// PhotoshopDirectory._tagNameMap[0x07CF + clippingPathCount] = "Path Info $clippingPathCount" + directory.setByteArray(0x07CF + clippingPathCount, tagBytes) + } + + else -> directory.setByteArray(tagType, tagBytes) + } +// if (tagType in 0x0fa0..0x1387) { +// PhotoshopDirectory._tagNameMap[tagType] = String.format("Plug-in %d Data", tagType - 0x0fa0 + 1) +// } + } + } catch (ex: Exception) { + directory.addError(ex.message) + return + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePngMetadataReader.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePngMetadataReader.kt new file mode 100644 index 0000000..719f08a --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePngMetadataReader.kt @@ -0,0 +1,335 @@ +package deckers.thibault.aves.metadata.metadataextractor + +import android.util.Log +import com.drew.imaging.png.PngChromaticities +import com.drew.imaging.png.PngChunk +import com.drew.imaging.png.PngChunkReader +import com.drew.imaging.png.PngChunkType +import com.drew.imaging.png.PngHeader +import com.drew.imaging.png.PngProcessingException +import com.drew.imaging.tiff.TiffProcessingException +import com.drew.imaging.tiff.TiffReader +import com.drew.lang.ByteArrayReader +import com.drew.lang.ByteConvert +import com.drew.lang.Charsets +import com.drew.lang.DateUtil +import com.drew.lang.KeyValuePair +import com.drew.lang.RandomAccessStreamReader +import com.drew.lang.SequentialByteArrayReader +import com.drew.lang.SequentialReader +import com.drew.lang.StreamReader +import com.drew.lang.StreamUtil +import com.drew.metadata.ErrorDirectory +import com.drew.metadata.Metadata +import com.drew.metadata.StringValue +import com.drew.metadata.exif.ExifTiffHandler +import com.drew.metadata.icc.IccReader +import com.drew.metadata.png.PngChromaticitiesDirectory +import com.drew.metadata.png.PngDirectory +import com.drew.metadata.xmp.XmpReader +import deckers.thibault.aves.utils.LogUtils +import java.io.ByteArrayInputStream +import java.io.IOException +import java.io.InputStream +import java.util.Locale +import java.util.zip.InflaterInputStream +import java.util.zip.ZipException + +// adapted from `PngMetadataReader` to: +// - prevent OOM from reading large chunks. As of `metadata-extractor` v2.18.0, there is no way to customize the reader +// without copying `desiredChunkTypes` and the whole `processChunk` function. +// - parse `acTL` chunk to identify animated PNGs. +object SafePngMetadataReader { + private val LOG_TAG = LogUtils.createTag() + + // arbitrary size to detect chunks that may yield an OOM + private const val CHUNK_SIZE_DANGER_THRESHOLD = SafeXmpReader.SEGMENT_TYPE_SIZE_DANGER_THRESHOLD + + private val latin1Encoding = Charsets.ISO_8859_1 + private val utf8Encoding = Charsets.UTF_8 + private val desiredChunkTypes: Set = hashSetOf( + PngChunkType.IHDR, + PngChunkType.PLTE, + PngChunkType.tRNS, + PngChunkType.cHRM, + PngChunkType.sRGB, + PngChunkType.gAMA, + PngChunkType.iCCP, + PngChunkType.bKGD, + PngChunkType.tEXt, + PngChunkType.zTXt, + PngChunkType.iTXt, + PngChunkType.tIME, + PngChunkType.pHYs, + PngChunkType.sBIT, + PngChunkType.eXIf, + PngActlDirectory.chunkType, + ) + + @Throws(IOException::class, PngProcessingException::class) + fun readMetadata(inputStream: InputStream): Metadata { + val chunks = PngChunkReader().extract(StreamReader(inputStream), desiredChunkTypes) + val metadata = Metadata() + for (chunk in chunks) { + try { + processChunk(metadata, chunk) + } catch (e: Exception) { + metadata.addDirectory(ErrorDirectory("Exception reading PNG chunk: " + e.message)) + } + } + return metadata + } + + @Throws(PngProcessingException::class, IOException::class) + private fun processChunk(metadata: Metadata, chunk: PngChunk) { + val chunkType = chunk.type + val bytes = chunk.bytes + + // TLAD insert start + if (bytes.size > CHUNK_SIZE_DANGER_THRESHOLD) { + Log.w(LOG_TAG, "PNG chunk $chunkType is too large, with a size of ${bytes.size} B") + return + } + // TLAD insert end + + if (chunkType == PngChunkType.IHDR) { + val header = PngHeader(bytes) + val directory = PngDirectory(PngChunkType.IHDR) + directory.setInt(PngDirectory.TAG_IMAGE_WIDTH, header.imageWidth) + directory.setInt(PngDirectory.TAG_IMAGE_HEIGHT, header.imageHeight) + directory.setInt(PngDirectory.TAG_BITS_PER_SAMPLE, header.bitsPerSample.toInt()) + directory.setInt(PngDirectory.TAG_COLOR_TYPE, header.colorType.numericValue) + directory.setInt(PngDirectory.TAG_COMPRESSION_TYPE, header.compressionType.toInt() and 0xFF) // make sure it's unsigned + directory.setInt(PngDirectory.TAG_FILTER_METHOD, header.filterMethod.toInt()) + directory.setInt(PngDirectory.TAG_INTERLACE_METHOD, header.interlaceMethod.toInt()) + metadata.addDirectory(directory) + // TLAD insert start + } else if (chunkType == PngActlDirectory.chunkType) { + if (bytes.size != 8) { + throw PngProcessingException("Invalid number of bytes") + } + val reader = SequentialByteArrayReader(bytes) + try { + metadata.addDirectory(PngActlDirectory().apply { + setInt(PngActlDirectory.TAG_NUM_FRAMES, reader.int32) + setInt(PngActlDirectory.TAG_NUM_PLAYS, reader.int32) + }) + } catch (ex: IOException) { + throw PngProcessingException(ex) + } + // TLAD insert end + } else if (chunkType == PngChunkType.PLTE) { + val directory = PngDirectory(PngChunkType.PLTE) + directory.setInt(PngDirectory.TAG_PALETTE_SIZE, bytes.size / 3) + metadata.addDirectory(directory) + } else if (chunkType == PngChunkType.tRNS) { + val directory = PngDirectory(PngChunkType.tRNS) + directory.setInt(PngDirectory.TAG_PALETTE_HAS_TRANSPARENCY, 1) + metadata.addDirectory(directory) + } else if (chunkType == PngChunkType.sRGB) { + val srgbRenderingIntent = bytes[0].toInt() + val directory = PngDirectory(PngChunkType.sRGB) + directory.setInt(PngDirectory.TAG_SRGB_RENDERING_INTENT, srgbRenderingIntent) + metadata.addDirectory(directory) + } else if (chunkType == PngChunkType.cHRM) { + val chromaticities = PngChromaticities(bytes) + val directory = PngChromaticitiesDirectory() + directory.setInt(PngChromaticitiesDirectory.TAG_WHITE_POINT_X, chromaticities.whitePointX) + directory.setInt(PngChromaticitiesDirectory.TAG_WHITE_POINT_Y, chromaticities.whitePointY) + directory.setInt(PngChromaticitiesDirectory.TAG_RED_X, chromaticities.redX) + directory.setInt(PngChromaticitiesDirectory.TAG_RED_Y, chromaticities.redY) + directory.setInt(PngChromaticitiesDirectory.TAG_GREEN_X, chromaticities.greenX) + directory.setInt(PngChromaticitiesDirectory.TAG_GREEN_Y, chromaticities.greenY) + directory.setInt(PngChromaticitiesDirectory.TAG_BLUE_X, chromaticities.blueX) + directory.setInt(PngChromaticitiesDirectory.TAG_BLUE_Y, chromaticities.blueY) + metadata.addDirectory(directory) + } else if (chunkType == PngChunkType.gAMA) { + val gammaInt = ByteConvert.toInt32BigEndian(bytes) + SequentialByteArrayReader(bytes).int32 + val directory = PngDirectory(PngChunkType.gAMA) + directory.setDouble(PngDirectory.TAG_GAMMA, gammaInt / 100000.0) + metadata.addDirectory(directory) + } else if (chunkType == PngChunkType.iCCP) { + val reader: SequentialReader = SequentialByteArrayReader(bytes) + + // Profile Name is 1-79 bytes, followed by the 1 byte null character + val profileNameBytes = reader.getNullTerminatedBytes(79 + 1) + val directory = PngDirectory(PngChunkType.iCCP) + directory.setStringValue(PngDirectory.TAG_ICC_PROFILE_NAME, StringValue(profileNameBytes, latin1Encoding)) + val compressionMethod = reader.int8 + // Only compression method allowed by the spec is zero: deflate + if (compressionMethod.toInt() == 0) { + // bytes left for compressed text is: + // total bytes length - (profileNameBytes length + null byte + compression method byte) + val bytesLeft = bytes.size - (profileNameBytes.size + 1 + 1) + val compressedProfile = reader.getBytes(bytesLeft) + try { + val inflateStream = InflaterInputStream(ByteArrayInputStream(compressedProfile)) + IccReader().extract(RandomAccessStreamReader(inflateStream), metadata, directory) + inflateStream.close() + } catch (zex: ZipException) { + directory.addError(String.format("Exception decompressing PNG iCCP chunk : %s", zex.message)) + metadata.addDirectory(directory) + } + } else { + directory.addError("Invalid compression method value") + } + metadata.addDirectory(directory) + } else if (chunkType == PngChunkType.bKGD) { + val directory = PngDirectory(PngChunkType.bKGD) + directory.setByteArray(PngDirectory.TAG_BACKGROUND_COLOR, bytes) + metadata.addDirectory(directory) + } else if (chunkType == PngChunkType.tEXt) { + val reader: SequentialReader = SequentialByteArrayReader(bytes) + + // Keyword is 1-79 bytes, followed by the 1 byte null character + val keywordsv = reader.getNullTerminatedStringValue(79 + 1, latin1Encoding) + val keyword = keywordsv.toString() + + // bytes left for text is: + // total bytes length - (Keyword length + null byte) + val bytesLeft = bytes.size - (keywordsv.bytes.size + 1) + val value = reader.getNullTerminatedStringValue(bytesLeft, latin1Encoding) + val textPairs: MutableList = ArrayList() + textPairs.add(KeyValuePair(keyword, value)) + val directory = PngDirectory(PngChunkType.tEXt) + directory.setObject(PngDirectory.TAG_TEXTUAL_DATA, textPairs) + metadata.addDirectory(directory) + } else if (chunkType == PngChunkType.zTXt) { + val reader: SequentialReader = SequentialByteArrayReader(bytes) + + // Keyword is 1-79 bytes, followed by the 1 byte null character + val keywordsv = reader.getNullTerminatedStringValue(79 + 1, latin1Encoding) + val keyword = keywordsv.toString() + val compressionMethod = reader.int8 + + // bytes left for compressed text is: + // total bytes length - (Keyword length + null byte + compression method byte) + val bytesLeft = bytes.size - (keywordsv.bytes.size + 1 + 1) + var textBytes: ByteArray? = null + if (compressionMethod.toInt() == 0) { + try { + textBytes = StreamUtil.readAllBytes(InflaterInputStream(ByteArrayInputStream(bytes, bytes.size - bytesLeft, bytesLeft))) + } catch (zex: ZipException) { + val directory = PngDirectory(PngChunkType.zTXt) + directory.addError(String.format("Exception decompressing PNG zTXt chunk with keyword \"%s\": %s", keyword, zex.message)) + metadata.addDirectory(directory) + } + } else { + val directory = PngDirectory(PngChunkType.zTXt) + directory.addError("Invalid compression method value") + metadata.addDirectory(directory) + } + if (textBytes != null) { + if (keyword == "XML:com.adobe.xmp") { + // NOTE in testing images, the XMP has parsed successfully, but we are not extracting tags from it as necessary + XmpReader().extract(textBytes, metadata) + } else { + val textPairs: MutableList = ArrayList() + textPairs.add(KeyValuePair(keyword, StringValue(textBytes, latin1Encoding))) + val directory = PngDirectory(PngChunkType.zTXt) + directory.setObject(PngDirectory.TAG_TEXTUAL_DATA, textPairs) + metadata.addDirectory(directory) + } + } + } else if (chunkType == PngChunkType.iTXt) { + val reader: SequentialReader = SequentialByteArrayReader(bytes) + + // Keyword is 1-79 bytes, followed by the 1 byte null character + val keywordsv = reader.getNullTerminatedStringValue(79 + 1, utf8Encoding) + val keyword = keywordsv.toString() + val compressionFlag = reader.int8 + val compressionMethod = reader.int8 + // TODO we currently ignore languageTagBytes and translatedKeywordBytes + val languageTagBytes = reader.getNullTerminatedBytes(bytes.size) + val translatedKeywordBytes = reader.getNullTerminatedBytes(bytes.size) + + // bytes left for compressed text is: + // total bytes length - (Keyword length + null byte + comp flag byte + comp method byte + lang length + null byte + translated length + null byte) + val bytesLeft = bytes.size - (keywordsv.bytes.size + 1 + 1 + 1 + languageTagBytes.size + 1 + translatedKeywordBytes.size + 1) + var textBytes: ByteArray? = null + if (compressionFlag.toInt() == 0) { + textBytes = reader.getNullTerminatedBytes(bytesLeft) + } else if (compressionFlag.toInt() == 1) { + if (compressionMethod.toInt() == 0) { + try { + textBytes = StreamUtil.readAllBytes(InflaterInputStream(ByteArrayInputStream(bytes, bytes.size - bytesLeft, bytesLeft))) + } catch (zex: ZipException) { + val directory = PngDirectory(PngChunkType.iTXt) + directory.addError(String.format("Exception decompressing PNG iTXt chunk with keyword \"%s\": %s", keyword, zex.message)) + metadata.addDirectory(directory) + } + } else { + val directory = PngDirectory(PngChunkType.iTXt) + directory.addError("Invalid compression method value") + metadata.addDirectory(directory) + } + } else { + val directory = PngDirectory(PngChunkType.iTXt) + directory.addError("Invalid compression flag value") + metadata.addDirectory(directory) + } + if (textBytes != null) { + if (keyword == "XML:com.adobe.xmp") { + // NOTE in testing images, the XMP has parsed successfully, but we are not extracting tags from it as necessary + XmpReader().extract(textBytes, metadata) + } else { + val textPairs: MutableList = ArrayList() + textPairs.add(KeyValuePair(keyword, StringValue(textBytes, utf8Encoding))) + val directory = PngDirectory(PngChunkType.iTXt) + directory.setObject(PngDirectory.TAG_TEXTUAL_DATA, textPairs) + metadata.addDirectory(directory) + } + } + } else if (chunkType == PngChunkType.tIME) { + val reader = SequentialByteArrayReader(bytes) + val year = reader.uInt16 + val month = reader.uInt8.toInt() + val day = reader.uInt8.toInt() + val hour = reader.uInt8.toInt() + val minute = reader.uInt8.toInt() + val second = reader.uInt8.toInt() + val directory = PngDirectory(PngChunkType.tIME) + if (DateUtil.isValidDate(year, month - 1, day) && DateUtil.isValidTime(hour, minute, second)) { + val dateString = String.format(Locale.ROOT, "%04d:%02d:%02d %02d:%02d:%02d", year, month, day, hour, minute, second) + directory.setString(PngDirectory.TAG_LAST_MODIFICATION_TIME, dateString) + } else { + directory.addError( + String.format( + Locale.ROOT, + "PNG tIME data describes an invalid date/time: year=%d month=%d day=%d hour=%d minute=%d second=%d", + year, month, day, hour, minute, second + ) + ) + } + metadata.addDirectory(directory) + } else if (chunkType == PngChunkType.pHYs) { + val reader = SequentialByteArrayReader(bytes) + val pixelsPerUnitX = reader.int32 + val pixelsPerUnitY = reader.int32 + val unitSpecifier = reader.int8 + val directory = PngDirectory(PngChunkType.pHYs) + directory.setInt(PngDirectory.TAG_PIXELS_PER_UNIT_X, pixelsPerUnitX) + directory.setInt(PngDirectory.TAG_PIXELS_PER_UNIT_Y, pixelsPerUnitY) + directory.setInt(PngDirectory.TAG_UNIT_SPECIFIER, unitSpecifier.toInt()) + metadata.addDirectory(directory) + } else if (chunkType == PngChunkType.sBIT) { + val directory = PngDirectory(PngChunkType.sBIT) + directory.setByteArray(PngDirectory.TAG_SIGNIFICANT_BITS, bytes) + metadata.addDirectory(directory) + } else if (chunkType == PngChunkType.eXIf) { + try { + val handler = ExifTiffHandler(metadata, null, 0) + TiffReader().processTiff(ByteArrayReader(bytes), handler, 0) + } catch (ex: TiffProcessingException) { + val directory = PngDirectory(PngChunkType.eXIf) + directory.addError(ex.message) + metadata.addDirectory(directory) + } catch (ex: IOException) { + val directory = PngDirectory(PngChunkType.eXIf) + directory.addError(ex.message) + metadata.addDirectory(directory) + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePsdMetadataReader.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePsdMetadataReader.kt new file mode 100644 index 0000000..6f93a23 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePsdMetadataReader.kt @@ -0,0 +1,13 @@ +package deckers.thibault.aves.metadata.metadataextractor + +import com.drew.lang.StreamReader +import com.drew.metadata.Metadata +import java.io.InputStream + +object SafePsdMetadataReader { + fun readMetadata(inputStream: InputStream): Metadata { + val metadata = Metadata() + SafePsdReader().extract(StreamReader(inputStream), metadata) + return metadata + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePsdReader.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePsdReader.kt new file mode 100644 index 0000000..3ca23f6 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePsdReader.kt @@ -0,0 +1,93 @@ +package deckers.thibault.aves.metadata.metadataextractor + +import com.drew.lang.SequentialReader +import com.drew.metadata.Metadata +import com.drew.metadata.photoshop.PsdHeaderDirectory +import java.io.IOException + +// adapted from `PsdReader` to prevent OOM from reading large XMP +// as of `metadata-extractor` v2.18.0, there is no way to customize the Photoshop reader +// without copying the whole `extract` function +class SafePsdReader { + fun extract(reader: SequentialReader, metadata: Metadata) { + val directory = PsdHeaderDirectory() + metadata.addDirectory(directory) + + // FILE HEADER SECTION + + try { + val signature = reader.int32 + if (signature != 0x38425053) // "8BPS" + { + directory.addError("Invalid PSD file signature") + return + } + + val version = reader.uInt16 + if (version != 1 && version != 2) { + directory.addError("Invalid PSD file version (must be 1 or 2)") + return + } + + // 6 reserved bytes are skipped here. They should be zero. + reader.skip(6) + + val channelCount = reader.uInt16 + directory.setInt(PsdHeaderDirectory.TAG_CHANNEL_COUNT, channelCount) + + // even though this is probably an unsigned int, the max height in practice is 300,000 + val imageHeight = reader.int32 + directory.setInt(PsdHeaderDirectory.TAG_IMAGE_HEIGHT, imageHeight) + + // even though this is probably an unsigned int, the max width in practice is 300,000 + val imageWidth = reader.int32 + directory.setInt(PsdHeaderDirectory.TAG_IMAGE_WIDTH, imageWidth) + + val bitsPerChannel = reader.uInt16 + directory.setInt(PsdHeaderDirectory.TAG_BITS_PER_CHANNEL, bitsPerChannel) + + val colorMode = reader.uInt16 + directory.setInt(PsdHeaderDirectory.TAG_COLOR_MODE, colorMode) + } catch (_: IOException) { + directory.addError("Unable to read PSD header") + return + } + + // COLOR MODE DATA SECTION + + try { + val sectionLength = reader.uInt32 + + /* + * Only indexed color and duotone (see the mode field in the File header section) have color mode data. + * For all other modes, this section is just the 4-byte length field, which is set to zero. + * + * Indexed color images: length is 768; color data contains the color table for the image, + * in non-interleaved order. + * Duotone images: color data contains the duotone specification (the format of which is not documented). + * Other applications that read Photoshop files can treat a duotone image as a gray image, + * and just preserve the contents of the duotone information when reading and writing the + * file. + */ + reader.skip(sectionLength) + } catch (_: IOException) { + return + } + + // IMAGE RESOURCES SECTION + + try { + val sectionLength = reader.uInt32 + + assert(sectionLength <= Int.MAX_VALUE) + + SafePhotoshopReader().extract(reader, sectionLength.toInt(), metadata) + } catch (_: IOException) { + // ignore + } + + // LAYER AND MASK INFORMATION SECTION (skipped) + + // IMAGE DATA SECTION (skipped) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeXmpReader.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeXmpReader.kt new file mode 100644 index 0000000..8a3affa --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeXmpReader.kt @@ -0,0 +1,179 @@ +package deckers.thibault.aves.metadata.metadataextractor + +import android.util.Log +import com.adobe.internal.xmp.XMPException +import com.adobe.internal.xmp.XMPMeta +import com.adobe.internal.xmp.XMPMetaFactory +import com.adobe.internal.xmp.impl.ByteBuffer +import com.adobe.internal.xmp.options.ParseOptions +import com.adobe.internal.xmp.properties.XMPPropertyInfo +import com.drew.imaging.jpeg.JpegSegmentType +import com.drew.lang.SequentialByteArrayReader +import com.drew.lang.SequentialReader +import com.drew.metadata.Directory +import com.drew.metadata.Metadata +import com.drew.metadata.xmp.XmpDirectory +import com.drew.metadata.xmp.XmpReader +import deckers.thibault.aves.utils.LogUtils +import java.io.IOException +import java.util.Locale + +class SafeXmpReader : XmpReader() { + // adapted from `XmpReader` to detect and skip large extended XMP + override fun readJpegSegments(segments: Iterable, metadata: Metadata, segmentType: JpegSegmentType) { + val preambleLength = XMP_JPEG_PREAMBLE.length + val extensionPreambleLength = XMP_EXTENSION_JPEG_PREAMBLE.length + var extendedXMPGUID: String? = null + var extendedXMPBuffer: ByteArray? = null + var loggedDanger = false + + for (segmentBytes in segments) { + if (segmentBytes.size >= preambleLength) { + if (XMP_JPEG_PREAMBLE.equals(String(segmentBytes, 0, preambleLength), ignoreCase = true) || + "XMP".equals(String(segmentBytes, 0, 3), ignoreCase = true) + ) { + val xmlBytes = ByteArray(segmentBytes.size - preambleLength) + System.arraycopy(segmentBytes, preambleLength, xmlBytes, 0, xmlBytes.size) + extract(xmlBytes, metadata) + extendedXMPGUID = getExtendedXMPGUID(metadata) + continue + } + } + if (extendedXMPGUID != null && segmentBytes.size >= extensionPreambleLength && + XMP_EXTENSION_JPEG_PREAMBLE.equals(String(segmentBytes, 0, extensionPreambleLength), ignoreCase = true) + ) { + extendedXMPBuffer = processExtendedXMPChunk(metadata, segmentBytes, extendedXMPGUID, extendedXMPBuffer) { fullLength -> + if (!loggedDanger) { + logError(metadata, fullLength) + loggedDanger = true + } + } + } + } + + extendedXMPBuffer?.let { xmpBytes -> + val totalSize = xmpBytes.size + if (totalSize > SEGMENT_TYPE_SIZE_DANGER_THRESHOLD) { + logError(metadata, totalSize) + } else { + extract(xmpBytes, metadata) + } + } + } + + // adapted from `XmpReader` to provide different parsing options + // and to detect large XMP when extracted directly (e.g. from Photoshop reader) + override fun extract(xmpBytes: ByteArray, offset: Int, length: Int, metadata: Metadata, parentDirectory: Directory?) { + val totalSize = xmpBytes.size + if (totalSize > SEGMENT_TYPE_SIZE_DANGER_THRESHOLD) { + logError(metadata, totalSize) + return + } + + val directory = XmpDirectory() + if (parentDirectory != null) directory.parent = parentDirectory + + try { + val xmpMeta: XMPMeta = if (offset == 0 && length == totalSize) { + XMPMetaFactory.parseFromBuffer(xmpBytes, PARSE_OPTIONS) + } else { + val buffer = ByteBuffer(xmpBytes, offset, length) + XMPMetaFactory.parse(buffer.byteStream, PARSE_OPTIONS) + } + directory.xmpMeta = xmpMeta + } catch (e: XMPException) { + directory.addError("Error processing XMP data: " + e.message) + } + if (!directory.isEmpty) metadata.addDirectory(directory) + } + + // adapted from `XmpReader` because original is private + private fun getExtendedXMPGUID(metadata: Metadata): String? { + val xmpDirectories = metadata.getDirectoriesOfType(XmpDirectory::class.java) + for (directory in xmpDirectories) { + val xmpMeta = directory.xmpMeta + try { + val itr = xmpMeta.iterator(SCHEMA_XMP_NOTES, null, null) ?: continue + while (itr.hasNext()) { + val pi = itr.next() as XMPPropertyInfo? + if (ATTRIBUTE_EXTENDED_XMP == pi!!.path) { + return pi.value + } + } + } catch (_: XMPException) { + // Fail silently here: we had a reading issue, not a decoding issue. + } + } + return null + } + + // adapted from `XmpReader` to prevent large allocation + private fun processExtendedXMPChunk(metadata: Metadata, segmentBytes: ByteArray, extendedXMPGUID: String, extendedXMPBufferIn: ByteArray?, onDangerSize: (fullLength: Int) -> Unit): ByteArray? { + var extendedXMPBuffer: ByteArray? = extendedXMPBufferIn + val extensionPreambleLength = XMP_EXTENSION_JPEG_PREAMBLE.length + val segmentLength = segmentBytes.size + val totalOffset = extensionPreambleLength + EXTENDED_XMP_GUID_LENGTH + EXTENDED_XMP_INT_LENGTH + EXTENDED_XMP_INT_LENGTH + if (segmentLength >= totalOffset) { + try { + val reader: SequentialReader = SequentialByteArrayReader(segmentBytes) + reader.skip(extensionPreambleLength.toLong()) + val segmentGUID = reader.getString(EXTENDED_XMP_GUID_LENGTH) + if (extendedXMPGUID == segmentGUID) { + val fullLength = reader.uInt32.toInt() + val chunkOffset = reader.uInt32.toInt() + if (extendedXMPBuffer == null) { + // TLAD insert start + if (fullLength > SEGMENT_TYPE_SIZE_DANGER_THRESHOLD) { + onDangerSize(fullLength) + return null + } + // TLAD insert end + extendedXMPBuffer = ByteArray(fullLength) + } + if (extendedXMPBuffer.size == fullLength) { + System.arraycopy(segmentBytes, totalOffset, extendedXMPBuffer, chunkOffset, segmentLength - totalOffset) + } else { + val directory = XmpDirectory() + directory.addError(String.format(Locale.ROOT, "Inconsistent length for the Extended XMP buffer: %d instead of %d", fullLength, extendedXMPBuffer.size)) + metadata.addDirectory(directory) + } + } + } catch (ex: IOException) { + val directory = XmpDirectory() + directory.addError(ex.message) + metadata.addDirectory(directory) + } + } + return extendedXMPBuffer + } + + private fun logError(metadata: Metadata, size: Int) { + val error = "Extended XMP is too large, with a size of $size B" + Log.w(LOG_TAG, error) + metadata.addDirectory(XmpDirectory().apply { + addError(error) + }) + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + + // arbitrary size to detect extended XMP that may yield an OOM + const val SEGMENT_TYPE_SIZE_DANGER_THRESHOLD = 3 * (1 shl 20) // MB + + // tighter node limits for faster loading + val PARSE_OPTIONS: ParseOptions = ParseOptions().setXMPNodesToLimit( + mapOf( + "photoshop:DocumentAncestors" to 200, + "xmpMM:History" to 200, + ) + ) + + private const val XMP_JPEG_PREAMBLE = "http://ns.adobe.com/xap/1.0/\u0000" + private const val XMP_EXTENSION_JPEG_PREAMBLE = "http://ns.adobe.com/xmp/extension/\u0000" + private const val SCHEMA_XMP_NOTES = "http://ns.adobe.com/xmp/note/" + private const val ATTRIBUTE_EXTENDED_XMP = "xmpNote:HasExtendedXMP" + private const val EXTENDED_XMP_GUID_LENGTH = 32 + private const val EXTENDED_XMP_INT_LENGTH = 4 + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpEntry.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpEntry.kt new file mode 100644 index 0000000..c99adc7 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpEntry.kt @@ -0,0 +1,37 @@ +package deckers.thibault.aves.metadata.metadataextractor.mpf + +import deckers.thibault.aves.utils.MimeTypes + +class MpEntry(val flags: Int, val format: Int, val type: Int, val size: Long, val dataOffset: Long, val dep1: Short, val dep2: Short) { + val mimeType: String? + get() = getMimeType(format) + + val isThumbnail: Boolean + get() = when (type) { + TYPE_THUMBNAIL_VGA, TYPE_THUMBNAIL_FULL_HD -> true + else -> false + } + + override fun toString(): String = "MpEntry#${hashCode()}{flags=$flags format=$format type=$type size=$size dataOffset=$dataOffset dep1=$dep1 dep2=$dep2}" + + companion object { + const val FLAG_REPRESENTATIVE = 1 shl 2 + const val FLAG_DEPENDENT_CHILD = 1 shl 3 + const val FLAG_DEPENDENT_PARENT = 1 shl 4 + + const val TYPE_PRIMARY = 0x030000 + const val TYPE_THUMBNAIL_VGA = 0x010001 + const val TYPE_THUMBNAIL_FULL_HD = 0x010002 + const val TYPE_PANORAMA = 0x020001 + const val TYPE_DISPARITY = 0x020002 + const val TYPE_MULTI_ANGLE = 0x020003 + const val TYPE_UNDEFINED = 0x000000 + + fun getMimeType(format: Int): String? { + return when (format) { + 0 -> MimeTypes.JPEG + else -> null + } + } + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpEntryDirectory.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpEntryDirectory.kt new file mode 100644 index 0000000..7dba552 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpEntryDirectory.kt @@ -0,0 +1,64 @@ +package deckers.thibault.aves.metadata.metadataextractor.mpf + +import com.drew.metadata.Directory +import com.drew.metadata.TagDescriptor + +class MpEntryDirectory(val id: Int, val entry: MpEntry) : Directory() { + private val descriptor = MpEntryDescriptor(this) + + init { + setDescriptor(descriptor) + } + + fun describe(): Map { + return HashMap().apply { + put("Flags", descriptor.getFlagsDescription(entry.flags)) + put("Format", descriptor.getFormatDescription(entry.format)) + put("Type", descriptor.getTypeDescription(entry.type)) + put("Size", "${entry.size} bytes") + put("Offset", "${entry.dataOffset} bytes") + put("Dependent Image 1 Entry Number", "${entry.dep1}") + put("Dependent Image 2 Entry Number", "${entry.dep2}") + } + } + + override fun getName(): String { + return "MPF Image #$id" + } + + override fun getTagNameMap(): HashMap { + return _tagNameMap + } + + companion object { + private val _tagNameMap = HashMap() + } +} + +class MpEntryDescriptor(directory: MpEntryDirectory?) : TagDescriptor(directory) { + fun getFlagsDescription(flags: Int): String { + val flagStrings = ArrayList().apply { + if (flags and MpEntry.FLAG_REPRESENTATIVE != 0) add("representative image") + if (flags and MpEntry.FLAG_DEPENDENT_CHILD != 0) add("dependent child image") + if (flags and MpEntry.FLAG_DEPENDENT_PARENT != 0) add("dependent parent image") + } + return if (flagStrings.isEmpty()) "none" else flagStrings.joinToString(", ") + } + + fun getFormatDescription(format: Int): String { + return MpEntry.getMimeType(format) ?: "Unknown ($format)" + } + + fun getTypeDescription(type: Int): String { + return when (type) { + MpEntry.TYPE_PRIMARY -> "Baseline MP Primary Image" + MpEntry.TYPE_THUMBNAIL_VGA -> "Large Thumbnail (VGA equivalent)" + MpEntry.TYPE_THUMBNAIL_FULL_HD -> "Large Thumbnail (full HD equivalent)" + MpEntry.TYPE_PANORAMA -> "Multi-frame Panorama" + MpEntry.TYPE_DISPARITY -> "Multi-frame Disparity" + MpEntry.TYPE_MULTI_ANGLE -> "Multi-angle" + MpEntry.TYPE_UNDEFINED -> "Undefined" + else -> "Unknown ($type)" + } + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpfDirectory.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpfDirectory.kt new file mode 100644 index 0000000..30d8482 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpfDirectory.kt @@ -0,0 +1,36 @@ +package deckers.thibault.aves.metadata.metadataextractor.mpf + +import com.drew.metadata.Directory +import com.drew.metadata.TagDescriptor + +class MpfDirectory : Directory() { + init { + setDescriptor(MpfDescriptor(this)) + } + + override fun getName(): String { + return "MPF" + } + + override fun getTagNameMap(): HashMap { + return _tagNameMap + } + + companion object { + const val TAG_MPF_VERSION = 0xb000 + const val TAG_NUMBER_OF_IMAGES = 0xb001 + const val TAG_MP_ENTRY = 0xb002 + const val TAG_IMAGE_UID_LIST = 0xb003 + const val TAG_TOTAL_FRAMES = 0xb004 + + private val _tagNameMap = HashMap().apply { + put(TAG_MPF_VERSION, "MPF Version") + put(TAG_NUMBER_OF_IMAGES, "Number Of Images") + put(TAG_MP_ENTRY, "MP Entry") + put(TAG_IMAGE_UID_LIST, "Image UID List") + put(TAG_TOTAL_FRAMES, "Total Frames") + } + } +} + +class MpfDescriptor(directory: MpfDirectory?) : TagDescriptor(directory) \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpfReader.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpfReader.kt new file mode 100644 index 0000000..f2a2966 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpfReader.kt @@ -0,0 +1,106 @@ +package deckers.thibault.aves.metadata.metadataextractor.mpf + +import android.util.Log +import com.drew.imaging.jpeg.JpegSegmentMetadataReader +import com.drew.imaging.jpeg.JpegSegmentType +import com.drew.lang.ByteArrayReader +import com.drew.lang.RandomAccessReader +import com.drew.metadata.Metadata +import com.drew.metadata.MetadataReader +import deckers.thibault.aves.utils.LogUtils + +class MpfReader : JpegSegmentMetadataReader, MetadataReader { + override fun getSegmentTypes(): Iterable { + return listOf(JpegSegmentType.APP2) + } + + override fun readJpegSegments(segments: Iterable, metadata: Metadata, segmentType: JpegSegmentType) { + for (segmentBytes in segments) { + // Skip segments not starting with the required header + if (segmentBytes.size >= PREAMBLE.length && PREAMBLE == String(segmentBytes, 0, PREAMBLE.length)) { + extract(ByteArrayReader(segmentBytes), metadata) + } + } + } + + override fun extract(reader: RandomAccessReader, metadata: Metadata) { + val directory = MpfDirectory() + metadata.addDirectory(directory) + + val baseOffset = 4 + + // MP Format Identifier (4Byte) + // MP header + // - MP Endian (4Byte) + val byteOrderIdentifier = reader.getInt16(baseOffset) + if (byteOrderIdentifier.toInt() == 0x4d4d) { // "MM" + reader.isMotorolaByteOrder = true + } else if (byteOrderIdentifier.toInt() == 0x4949) { // "II" + reader.isMotorolaByteOrder = false + } + // - Offset to First IFD (4Byte) + val firstIfdOffset = reader.getInt32(baseOffset + 4) + + // [in primary image only] MP Index IFD: + // - Count (2Byte) + var offset = baseOffset + firstIfdOffset + val tagCount = reader.getInt16(offset) + offset += 2 + // - MP Index Fields (Overall Structure Info.) + var imageCount = 0 + (0.. + when (val tagId = reader.getUInt16(offset)) { + MpfDirectory.TAG_MPF_VERSION -> directory.setString(tagId, reader.getString(offset + 8, 4, Charsets.US_ASCII)) + MpfDirectory.TAG_NUMBER_OF_IMAGES -> { + imageCount = reader.getInt32(offset + 8) + directory.setInt(tagId, imageCount) + } + + MpfDirectory.TAG_MP_ENTRY -> { + var mpEntryOffset = baseOffset + reader.getInt32(offset + 8) + for (index in 0.. { + val uidList = ArrayList() + var mpEntryOffset = baseOffset + reader.getInt32(offset + 8) + (0.. + uidList.add(reader.getString(mpEntryOffset, 33, Charsets.US_ASCII)) + mpEntryOffset += 33 + } + directory.setString(tagId, uidList.joinToString(", ")) + } + + MpfDirectory.TAG_TOTAL_FRAMES -> directory.setInt(tagId, reader.getInt32(offset + 8)) + else -> Log.d(LOG_TAG, "unknown tag=$tagId") + } + offset += 12 + } + + // - Offset of Next IFD (4Byte) + // Value (MP Index IFD) + + // [in primary & other images] MP Attributes IFD: + // - Count (2Byte) + // - MP Attribute Fields (Details of Specific Image Usage) + // - Offset of Next IFD + // Value (MP Attribute IFD) + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + private const val PREAMBLE = "MPF" + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/xmp/GoogleDeviceContainer.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/xmp/GoogleDeviceContainer.kt new file mode 100644 index 0000000..353514e --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/xmp/GoogleDeviceContainer.kt @@ -0,0 +1,85 @@ +package deckers.thibault.aves.metadata.xmp + +import android.content.Context +import android.net.Uri +import com.adobe.internal.xmp.XMPMeta +import deckers.thibault.aves.metadata.Metadata +import deckers.thibault.aves.metadata.xmp.XMP.countPropPathArrayItems +import deckers.thibault.aves.metadata.xmp.XMP.getSafeStructField +import deckers.thibault.aves.utils.indexOfBytes +import java.io.DataInputStream + +class GoogleDeviceContainer { + private val jfifSignature = byteArrayOf(0xFF.toByte(), 0xD8.toByte(), 0xFF.toByte(), 0xE0.toByte(), 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01) + + private val items: MutableList = ArrayList() + private val offsets: MutableList = ArrayList() + + fun findItems(xmpMeta: XMPMeta) { + val containerDirectoryPath = listOf(GoogleXMP.GDEVICE_CONTAINER_PROP_NAME, GoogleXMP.GDEVICE_CONTAINER_DIRECTORY_PROP_NAME) + val count = xmpMeta.countPropPathArrayItems(containerDirectoryPath) + for (i in 1..count) { + val mimeType = xmpMeta.getSafeStructField(containerDirectoryPath + listOf(i, GoogleXMP.GDEVICE_CONTAINER_ITEM_MIME_PROP_NAME))?.value + val length = xmpMeta.getSafeStructField(containerDirectoryPath + listOf(i, GoogleXMP.GDEVICE_CONTAINER_ITEM_LENGTH_PROP_NAME))?.value?.toLongOrNull() + val dataUri = xmpMeta.getSafeStructField(containerDirectoryPath + listOf(i, GoogleXMP.GDEVICE_CONTAINER_ITEM_DATA_URI_PROP_NAME))?.value + if (mimeType != null && length != null && dataUri != null) { + items.add( + GoogleDeviceContainerItem( + mimeType = mimeType, + length = length, + dataUri = dataUri, + ) + ) + } else throw Exception("failed to extract Google device container item at index=$i with mimeType=$mimeType, length=$length, dataUri=$dataUri") + } + } + + fun findOffsets(context: Context, uri: Uri, mimeType: String, sizeBytes: Long) { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + val bytes = ByteArray(sizeBytes.toInt()) + DataInputStream(input).use { + it.readFully(bytes) + } + + var start = 0 + while (start < sizeBytes) { + val offset = bytes.indexOfBytes(jfifSignature, start) + if (offset != -1 && offset >= start) { + start = offset + jfifSignature.size + offsets.add(offset) + } else { + start = sizeBytes.toInt() + } + } + } + + // fix first offset as it may refer to included thumbnail instead of primary image + while (offsets.size < items.size) { + offsets.add(0, 0) + } + offsets[0] = 0 + } + + fun itemIndex(dataUri: String) = items.indexOfFirst { it.dataUri == dataUri } + + private fun item(index: Int): GoogleDeviceContainerItem? { + return if (0 <= index && index < items.size) { + items[index] + } else null + } + + fun itemStartOffset(index: Int): Long? { + return if (0 <= index && index < offsets.size) { + offsets[index].toLong() + } else null + } + + fun itemLength(index: Int): Long? { + val lengthByMeta = item(index)?.length ?: return null + return if (lengthByMeta != 0L) lengthByMeta else itemStartOffset(index + 1) + } + + fun itemMimeType(index: Int) = item(index)?.mimeType +} + +class GoogleDeviceContainerItem(val mimeType: String, val length: Long, val dataUri: String) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/xmp/GoogleXMP.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/xmp/GoogleXMP.kt new file mode 100644 index 0000000..c959f9b --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/xmp/GoogleXMP.kt @@ -0,0 +1,205 @@ +package deckers.thibault.aves.metadata.xmp + +import android.util.Log +import com.adobe.internal.xmp.XMPError +import com.adobe.internal.xmp.XMPException +import com.adobe.internal.xmp.XMPMeta +import deckers.thibault.aves.metadata.xmp.XMP.countPropArrayItems +import deckers.thibault.aves.metadata.xmp.XMP.doesPropExist +import deckers.thibault.aves.metadata.xmp.XMP.doesPropPathExist +import deckers.thibault.aves.metadata.xmp.XMP.getSafeInt +import deckers.thibault.aves.metadata.xmp.XMP.getSafeLong +import deckers.thibault.aves.metadata.xmp.XMP.getSafeString +import deckers.thibault.aves.metadata.xmp.XMP.getSafeStructField +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes + +object GoogleXMP { + private val LOG_TAG = LogUtils.createTag() + + // namespaces + private const val GAUDIO_NS_URI = "http://ns.google.com/photos/1.0/audio/" + private const val GCAMERA_NS_URI = "http://ns.google.com/photos/1.0/camera/" + private const val GCONTAINER_NS_URI = "http://ns.google.com/photos/1.0/container/" + private const val GCONTAINER_ITEM_NS_URI = "http://ns.google.com/photos/1.0/container/item/" + private const val GDEPTH_NS_URI = "http://ns.google.com/photos/1.0/depthmap/" + private const val GDEVICE_NS_URI = "http://ns.google.com/photos/dd/1.0/device/" + private const val GDEVICE_CONTAINER_NS_URI = "http://ns.google.com/photos/dd/1.0/container/" + private const val GDEVICE_ITEM_NS_URI = "http://ns.google.com/photos/dd/1.0/item/" + private const val GIMAGE_NS_URI = "http://ns.google.com/photos/1.0/image/" + private const val GPANO_NS_URI = "http://ns.google.com/photos/1.0/panorama/" + + // embedded media data properties + // cf https://developers.google.com/depthmap-metadata + // cf https://developers.google.com/vr/reference/cardboard-camera-vr-photo-format + private val knownDataProps = listOf( + XMPPropName(GAUDIO_NS_URI, "Data"), + XMPPropName(GCAMERA_NS_URI, "RelitInputImageData"), + XMPPropName(GIMAGE_NS_URI, "Data"), + XMPPropName(GDEPTH_NS_URI, "Data"), + XMPPropName(GDEPTH_NS_URI, "Confidence"), + ) + + + fun isDataPath(path: String) = knownDataProps.map { it.toString() }.any { path == it } + + // google portrait + + val GDEVICE_CONTAINER_PROP_NAME = XMPPropName(GDEVICE_NS_URI, "Container") + val GDEVICE_CONTAINER_DIRECTORY_PROP_NAME = XMPPropName(GDEVICE_CONTAINER_NS_URI, "Directory") + val GDEVICE_CONTAINER_ITEM_DATA_URI_PROP_NAME = XMPPropName(GDEVICE_ITEM_NS_URI, "DataURI") + val GDEVICE_CONTAINER_ITEM_LENGTH_PROP_NAME = XMPPropName(GDEVICE_ITEM_NS_URI, "Length") + val GDEVICE_CONTAINER_ITEM_MIME_PROP_NAME = XMPPropName(GDEVICE_ITEM_NS_URI, "Mime") + + // container + + private val GCAMERA_VIDEO_OFFSET_PROP_NAME = XMPPropName(GCAMERA_NS_URI, "MicroVideoOffset") + private val GCONTAINER_DIRECTORY_PROP_NAME = XMPPropName(GCONTAINER_NS_URI, "Directory") + private val GCONTAINER_ITEM_PROP_NAME = XMPPropName(GCONTAINER_NS_URI, "Item") + private val GCONTAINER_ITEM_LENGTH_PROP_NAME = XMPPropName(GCONTAINER_ITEM_NS_URI, "Length") + private val GCONTAINER_ITEM_MIME_PROP_NAME = XMPPropName(GCONTAINER_ITEM_NS_URI, "Mime") + private val GCONTAINER_ITEM_SEMANTIC_PROP_NAME = XMPPropName(GCONTAINER_ITEM_NS_URI, "Semantic") + + private const val ITEM_SEMANTIC_GAIN_MAP = "GainMap" + + // panorama + // cf https://developers.google.com/streetview/spherical-metadata + + private val GPANO_CROPPED_AREA_HEIGHT_PROP_NAME = XMPPropName(GPANO_NS_URI, "CroppedAreaImageHeightPixels") + private val GPANO_CROPPED_AREA_WIDTH_PROP_NAME = XMPPropName(GPANO_NS_URI, "CroppedAreaImageWidthPixels") + private val GPANO_CROPPED_AREA_LEFT_PROP_NAME = XMPPropName(GPANO_NS_URI, "CroppedAreaLeftPixels") + private val GPANO_CROPPED_AREA_TOP_PROP_NAME = XMPPropName(GPANO_NS_URI, "CroppedAreaTopPixels") + private val GPANO_FULL_PANO_HEIGHT_PROP_NAME = XMPPropName(GPANO_NS_URI, "FullPanoHeightPixels") + private val GPANO_FULL_PANO_WIDTH_PROP_NAME = XMPPropName(GPANO_NS_URI, "FullPanoWidthPixels") + private val GPANO_PROJECTION_TYPE_PROP_NAME = XMPPropName(GPANO_NS_URI, "ProjectionType") + const val GPANO_PROJECTION_TYPE_DEFAULT = "equirectangular" + + // `GPano:ProjectionType` is required by spec but it is sometimes missing, assuming default + // `GPano:FullPanoHeightPixels` is required by spec but it is sometimes missing (e.g. Samsung Camera app panorama mode) + private val gpanoRequiredProps = listOf( + GPANO_CROPPED_AREA_HEIGHT_PROP_NAME, + GPANO_CROPPED_AREA_WIDTH_PROP_NAME, + GPANO_CROPPED_AREA_LEFT_PROP_NAME, + GPANO_CROPPED_AREA_TOP_PROP_NAME, + GPANO_FULL_PANO_WIDTH_PROP_NAME, + ) + + fun isUltraHdPhoto(meta: XMPMeta): Boolean { + if (meta.doesPropExist(GCONTAINER_DIRECTORY_PROP_NAME)) { + val count = meta.countPropArrayItems(GCONTAINER_DIRECTORY_PROP_NAME) + for (i in 1..count) { + val semantic = meta.getSafeStructField(listOf(GCONTAINER_DIRECTORY_PROP_NAME, i, GCONTAINER_ITEM_PROP_NAME, GCONTAINER_ITEM_SEMANTIC_PROP_NAME))?.value + if (semantic == ITEM_SEMANTIC_GAIN_MAP) { + return true + } + } + } + return false + } + + fun isMotionPhoto(meta: XMPMeta): Boolean { + try { + // GCamera motion photo + if (meta.doesPropExist(GCAMERA_VIDEO_OFFSET_PROP_NAME)) return true + + // Container motion photo + if (meta.doesPropExist(GCONTAINER_DIRECTORY_PROP_NAME)) { + val count = meta.countPropArrayItems(GCONTAINER_DIRECTORY_PROP_NAME) + var hasImage = false + var hasVideo = false + for (i in 1..count) { + val mime = getContainerItemAttribute(meta, i, GCONTAINER_ITEM_MIME_PROP_NAME) + val length = getContainerItemAttribute(meta, i, GCONTAINER_ITEM_LENGTH_PROP_NAME) + // `length` is not always provided for the image item + hasImage = hasImage || MimeTypes.isImage(mime) + hasVideo = hasVideo || (MimeTypes.isVideo(mime) && length != null) + } + if (hasImage && hasVideo) return true + } + + return false + } catch (e: XMPException) { + if (e.errorCode != XMPError.BADSCHEMA) { + // `BADSCHEMA` code is reported when we check a property + // from a non-standard namespace, and that namespace is not declared in the XMP + Log.w(LOG_TAG, "failed to check Google motion photo props from XMP", e) + } + } + return false + } + + private fun getContainerItemAttribute(meta: XMPMeta, i: Int, attribute: XMPPropName): String? { + // variant of `Container:Item` with `` + val mime = meta.getSafeStructField(listOf(GCONTAINER_DIRECTORY_PROP_NAME, i, GCONTAINER_ITEM_PROP_NAME, attribute))?.value + // variant of `Container:Item` with `` + return mime ?: meta.getSafeStructField(listOf(GCONTAINER_DIRECTORY_PROP_NAME, i, attribute))?.value + } + + fun isPanorama(meta: XMPMeta): Boolean { + try { + if (gpanoRequiredProps.all { meta.doesPropExist(it) }) return true + } catch (e: XMPException) { + if (e.errorCode != XMPError.BADSCHEMA) { + // `BADSCHEMA` code is reported when we check a property + // from a non-standard namespace, and that namespace is not declared in the XMP + Log.w(LOG_TAG, "failed to check Google panorama props from XMP", e) + } + } + return false + } + + fun getPanoramaInfo(meta: XMPMeta): FieldMap { + val fields: FieldMap = hashMapOf() + try { + meta.getSafeInt(GPANO_CROPPED_AREA_LEFT_PROP_NAME) { fields["croppedAreaLeft"] = it } + meta.getSafeInt(GPANO_CROPPED_AREA_TOP_PROP_NAME) { fields["croppedAreaTop"] = it } + meta.getSafeInt(GPANO_CROPPED_AREA_WIDTH_PROP_NAME) { fields["croppedAreaWidth"] = it } + meta.getSafeInt(GPANO_CROPPED_AREA_HEIGHT_PROP_NAME) { fields["croppedAreaHeight"] = it } + meta.getSafeInt(GPANO_FULL_PANO_WIDTH_PROP_NAME) { fields["fullPanoWidth"] = it } + meta.getSafeInt(GPANO_FULL_PANO_HEIGHT_PROP_NAME) { fields["fullPanoHeight"] = it } + meta.getSafeString(GPANO_PROJECTION_TYPE_PROP_NAME) { fields["projectionType"] = it } + } catch (e: XMPException) { + Log.w(LOG_TAG, "failed to read XMP directory", e) + } + return fields + } + + fun getTrailingVideoOffsetFromEnd(meta: XMPMeta): Long? { + var offsetFromEnd: Long? = null + if (meta.doesPropExist(GCAMERA_VIDEO_OFFSET_PROP_NAME)) { + // `GCamera` motion photo + meta.getSafeLong(GCAMERA_VIDEO_OFFSET_PROP_NAME) { offsetFromEnd = it } + } else if (meta.doesPropExist(GCONTAINER_DIRECTORY_PROP_NAME)) { + // `Container` motion photo + val count = meta.countPropArrayItems(GCONTAINER_DIRECTORY_PROP_NAME) + for (i in 1..count) { + val mime = getContainerItemAttribute(meta, i, GCONTAINER_ITEM_MIME_PROP_NAME) + if (MimeTypes.isVideo(mime)) { + getContainerItemAttribute(meta, i, GCONTAINER_ITEM_LENGTH_PROP_NAME)?.let { offsetFromEnd = it.toLong() } + } + } + } + return offsetFromEnd + } + + fun updateTrailingVideoOffset(xmp: String, oldOffset: Number, newOffset: Number): String { + return xmp.replace( + // GCamera motion photo + "${GCAMERA_VIDEO_OFFSET_PROP_NAME}=\"$oldOffset\"", + "${GCAMERA_VIDEO_OFFSET_PROP_NAME}=\"$newOffset\"", + ).replace( + // Container motion photo + "${GCONTAINER_ITEM_LENGTH_PROP_NAME}=\"$oldOffset\"", + "${GCONTAINER_ITEM_LENGTH_PROP_NAME}=\"$newOffset\"", + ) + } + + fun getDeviceContainer(meta: XMPMeta): GoogleDeviceContainer? { + return if (meta.doesPropPathExist(listOf(GDEVICE_CONTAINER_PROP_NAME, GDEVICE_CONTAINER_DIRECTORY_PROP_NAME))) { + GoogleDeviceContainer().apply { findItems(meta) } + } else { + null + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/xmp/XMP.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/xmp/XMP.kt new file mode 100644 index 0000000..10c94b4 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/xmp/XMP.kt @@ -0,0 +1,306 @@ +package deckers.thibault.aves.metadata.xmp + +import android.content.Context +import android.net.Uri +import android.os.Build +import android.provider.MediaStore +import android.util.Log +import com.adobe.internal.xmp.XMPError +import com.adobe.internal.xmp.XMPException +import com.adobe.internal.xmp.XMPMeta +import com.adobe.internal.xmp.XMPMetaFactory +import com.adobe.internal.xmp.properties.XMPProperty +import com.drew.metadata.Directory +import deckers.thibault.aves.metadata.Mp4ParserHelper +import deckers.thibault.aves.metadata.Mp4ParserHelper.processBoxes +import deckers.thibault.aves.metadata.Mp4ParserHelper.toBytes +import deckers.thibault.aves.metadata.metadataextractor.SafeMp4UuidBoxHandler +import deckers.thibault.aves.metadata.metadataextractor.SafeXmpReader +import deckers.thibault.aves.utils.ContextUtils.queryContentPropValue +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MemoryUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.MimeTypes.isIsoBMFFImage +import deckers.thibault.aves.utils.StorageUtils +import org.mp4parser.boxes.UserBox +import java.util.TimeZone + +object XMP { + private val LOG_TAG = LogUtils.createTag() + + // BE7ACFCB 97A942E8 9C719994 91E3AFAC / BE7ACFCB-97A9-42E8-9C71-999491E3AFAC + val mp4Uuid = byteArrayOf(0xbe.toByte(), 0x7a, 0xcf.toByte(), 0xcb.toByte(), 0x97.toByte(), 0xa9.toByte(), 0x42, 0xe8.toByte(), 0x9c.toByte(), 0x71, 0x99.toByte(), 0x94.toByte(), 0x91.toByte(), 0xe3.toByte(), 0xaf.toByte(), 0xac.toByte()) + + // standard namespaces + // cf com.adobe.internal.xmp.XMPConst + private const val DC_NS_URI = "http://purl.org/dc/elements/1.1/" + private const val MICROSOFTPHOTO_NS_URI = "http://ns.microsoft.com/photo/1.0/" + private const val PHOTOSHOP_NS_URI = "http://ns.adobe.com/photoshop/1.0/" + private const val XMP_NS_URI = "http://ns.adobe.com/xap/1.0/" + + // other namespaces + private const val APPLE_HDRGM_NS_URI = "http://ns.apple.com/HDRGainMap/1.0/" + private const val HDRGM_NS_URI = "http://ns.adobe.com/hdr-gain-map/1.0/" + private const val PMTM_NS_URI = "http://www.hdrsoft.com/photomatix_settings01" + + val DC_SUBJECT_PROP_NAME = XMPPropName(DC_NS_URI, "subject") + val DC_DESCRIPTION_PROP_NAME = XMPPropName(DC_NS_URI, "description") + val DC_TITLE_PROP_NAME = XMPPropName(DC_NS_URI, "title") + val MS_RATING_PROP_NAME = XMPPropName(MICROSOFTPHOTO_NS_URI, "Rating") + val PS_DATE_CREATED_PROP_NAME = XMPPropName(PHOTOSHOP_NS_URI, "DateCreated") + val XMP_CREATE_DATE_PROP_NAME = XMPPropName(XMP_NS_URI, "CreateDate") + val XMP_RATING_PROP_NAME = XMPPropName(XMP_NS_URI, "Rating") + + private const val GENERIC_LANG = "" + private const val SPECIFIC_LANG = "en-US" + + fun isDataPath(path: String) = GoogleXMP.isDataPath(path) + + // HDR gain map + + private val HDRGM_VERSION_PROP_NAME = XMPPropName(HDRGM_NS_URI, "Version") + private val APPLE_HDRGM_VERSION_PROP_NAME = XMPPropName(APPLE_HDRGM_NS_URI, "HDRGainMapVersion") + + // panorama + + private val PMTM_IS_PANO360_PROP_NAME = XMPPropName(PMTM_NS_URI, "IsPano360") + + // as of `metadata-extractor` v2.18.0, XMP is not discovered in AVIF/HEIC images, + // so we fall back to the native content resolver, if possible + fun checkIsoBMFFImage( + context: Context, + mimeType: String, + uri: Uri, + foundXmp: Boolean, + processXmp: (xmpMeta: XMPMeta) -> Unit, + ) { + if (!foundXmp && isIsoBMFFImage(mimeType) && StorageUtils.isMediaStoreContentUri(uri) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + try { + val xmpBytes = context.queryContentPropValue(uri, mimeType, MediaStore.MediaColumns.XMP) + if (xmpBytes is ByteArray && xmpBytes.isNotEmpty()) { + val xmpMeta = XMPMetaFactory.parseFromBuffer(xmpBytes, SafeXmpReader.PARSE_OPTIONS) + processXmp(xmpMeta) + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get XMP by content resolver for mimeType=$mimeType uri=$uri", e) + } + } + } + + // as of `metadata-extractor` v2.18.0, processing large MP4 files may crash, + // so we fall back to parsing with `mp4parser` + fun checkMp4( + context: Context, + mimeType: String, + uri: Uri, + processDirs: (dirs: List<Directory>) -> Unit, + ) { + if (mimeType != MimeTypes.MP4) return + try { + Mp4ParserHelper.consumeIso(context, uri, Mp4ParserHelper.metadataBoxParser()) { isoFile -> + isoFile.processBoxes(UserBox::class.java, true) { box, _ -> + val boxSize = box.size + if (MemoryUtils.canAllocate(boxSize)) { + val bytes = box.toBytes() + val payload = bytes.copyOfRange(8, bytes.size) + + val metadata = com.drew.metadata.Metadata() + SafeMp4UuidBoxHandler(metadata).processBox("", payload, -1, null) + processDirs(metadata.directories.filter { dir -> dir.tagCount > 0 }.toList()) + } else { + Log.w(LOG_TAG, "MP4 box too large at $boxSize bytes, for mimeType=$mimeType uri=$uri") + } + } + } + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to parse MP4 for mimeType=$mimeType uri=$uri", e) + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get XMP by MP4 parser for mimeType=$mimeType uri=$uri", e) + } + } + + // extensions + + fun XMPMeta.hasHdrGainMap(): Boolean { + try { + // standard HDR gain map + if (doesPropExist(HDRGM_VERSION_PROP_NAME)) return true + + // `Ultra HDR` + if (GoogleXMP.isUltraHdPhoto(this)) return true + + // Apple HDR gain map + if (doesPropExist(APPLE_HDRGM_VERSION_PROP_NAME)) return true + + return false + } catch (e: XMPException) { + if (e.errorCode != XMPError.BADSCHEMA) { + // `BADSCHEMA` code is reported when we check a property + // from a non-standard namespace, and that namespace is not declared in the XMP + Log.w(LOG_TAG, "failed to check HDR props from XMP", e) + } + } + return false + } + + fun XMPMeta.isMotionPhoto() = GoogleXMP.isMotionPhoto(this) + + fun XMPMeta.isPanorama(): Boolean { + // Google + if (GoogleXMP.isPanorama(this)) return true + + // Photomatix + try { + if (getPropertyString(PMTM_IS_PANO360_PROP_NAME.nsUri, PMTM_IS_PANO360_PROP_NAME.toString()) == "Yes") return true + } catch (e: XMPException) { + if (e.errorCode != XMPError.BADSCHEMA) { + // `BADSCHEMA` code is reported when we check a property + // from a non-standard namespace, and that namespace is not declared in the XMP + Log.w(LOG_TAG, "failed to check Photomatix panorama props from XMP", e) + } + } + + return false + } + + fun XMPMeta.doesPropExist(prop: XMPPropName): Boolean { + return doesPropertyExist(prop.nsUri, prop.toString()) + } + + fun XMPMeta.doesPropPathExist(props: List<XMPPropName>): Boolean { + return doesPropertyExist(props.first().nsUri, props.joinToString("/")) + } + + fun XMPMeta.countPropArrayItems(prop: XMPPropName): Int { + return countArrayItems(prop.nsUri, prop.toString()) + } + + fun XMPMeta.countPropPathArrayItems(props: List<XMPPropName>): Int { + return countArrayItems(props.first().nsUri, props.joinToString("/")) + } + + fun XMPMeta.getPropArrayItemValues(prop: XMPPropName): List<String> { + val schema = prop.nsUri + val propName = prop.toString() + val count = countArrayItems(schema, propName) + return (1..count).map { getArrayItem(schema, propName, it).value } + } + + fun XMPMeta.getSafeInt(prop: XMPPropName, save: (value: Int) -> Unit) { + val schema = prop.nsUri + val propName = prop.toString() + try { + if (doesPropertyExist(schema, propName)) { + val item = getPropertyInteger(schema, propName) + // double check retrieved items as the property sometimes is reported to exist but it is actually null + if (item != null) { + save(item) + } + } + } catch (e: XMPException) { + Log.w(LOG_TAG, "failed to get int for XMP schema=$schema, propName=$propName", e) + } + } + + fun XMPMeta.getSafeLong(prop: XMPPropName, save: (value: Long) -> Unit) { + val schema = prop.nsUri + val propName = prop.toString() + try { + if (doesPropertyExist(schema, propName)) { + val item = getPropertyLong(schema, propName) + // double check retrieved items as the property sometimes is reported to exist but it is actually null + if (item != null) { + save(item) + } + } + } catch (e: XMPException) { + Log.w(LOG_TAG, "failed to get long for XMP schema=$schema, propName=$propName", e) + } + } + + fun XMPMeta.getSafeString(prop: XMPPropName, save: (value: String) -> Unit) { + val schema = prop.nsUri + val propName = prop.toString() + try { + if (doesPropertyExist(schema, propName)) { + val item = getPropertyString(schema, propName) + // double check retrieved items as the property sometimes is reported to exist but it is actually null + if (item != null) { + save(item) + } + } + } catch (e: XMPException) { + Log.w(LOG_TAG, "failed to get int for XMP schema=$schema, propName=$propName", e) + } + } + + fun XMPMeta.getSafeLocalizedText(prop: XMPPropName, acceptBlank: Boolean = true, save: (value: String) -> Unit) { + val schema = prop.nsUri + val propName = prop.toString() + try { + if (doesPropertyExist(schema, propName)) { + val item = getLocalizedText(schema, propName, GENERIC_LANG, SPECIFIC_LANG) + // double check retrieved items as the property sometimes is reported to exist but it is actually null + if (item != null && (acceptBlank || item.value.isNotBlank())) { + save(item.value) + } + } + } catch (e: XMPException) { + Log.w(LOG_TAG, "failed to get text for XMP schema=$schema, propName=$propName", e) + } + } + + fun XMPMeta.getSafeDateMillis(prop: XMPPropName, save: (value: Long) -> Unit) { + val schema = prop.nsUri + val propName = prop.toString() + try { + if (doesPropertyExist(schema, propName)) { + val item = getPropertyDate(schema, propName) + // double check retrieved items as the property sometimes is reported to exist but it is actually null + if (item != null) { + // strip time zone from XMP dates so that we show date/times as local ones + // this aligns with Exif date/times, which are specified without time zones + item.timeZone = TimeZone.getDefault() + save(item.calendar.timeInMillis) + } + } + } catch (e: XMPException) { + Log.w(LOG_TAG, "failed to get date for XMP schema=$schema, propName=$propName", e) + } + } + + // e.g. path 'Container:Directory[42]/Container:Item/Item:Mime' matches: + // - structNs: "http://ns.google.com/photos/1.0/container/" + // - structName: "Container:Directory[42]/Container:Item" + // - fieldNs: "http://ns.google.com/photos/1.0/container/item/" + // - fieldName: "Item:Mime" + fun XMPMeta.getSafeStructField(props: List<Any>): XMPProperty? { + if (props.size >= 2) { + val structFirst = props.first() + val field = props.last() + if (structFirst is XMPPropName && field is XMPPropName) { + val structName = props.take(props.size - 1).mapIndexed { index, prop -> + when (prop) { + is XMPPropName -> "${if (index == 0) "" else "/"}$prop" + is Int -> "[$prop]" + else -> null + } + }.filterNotNull().joinToString("") + val fieldName = field.toString() + + try { + return getStructField(structFirst.nsUri, structName, field.nsUri, fieldName) + } catch (e: XMPException) { + Log.w(LOG_TAG, "failed to get XMP struct field for props=$props", e) + } + } + } + return null + } +} + +class XMPPropName(val nsUri: String, private val prop: String) { + private fun resolve(): String = "${XMPMetaFactory.getSchemaRegistry().getNamespacePrefix(nsUri)}$prop" + + override fun toString(): String = resolve() +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt new file mode 100644 index 0000000..00017e8 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt @@ -0,0 +1,37 @@ +package deckers.thibault.aves.model + +import android.net.Uri +import androidx.core.net.toUri + +class AvesEntry(map: FieldMap) { + val uri: Uri = (map[EntryFields.URI] as String).toUri() // content or file URI + val path = map[EntryFields.PATH] as String? // best effort to get local path + val pageId = map[EntryFields.PAGE_ID] as Int? // null means the main entry + val mimeType = map[EntryFields.MIME_TYPE] as String + val width = map[EntryFields.WIDTH] as Int + val height = map[EntryFields.HEIGHT] as Int + val rotationDegrees = map[EntryFields.ROTATION_DEGREES] as Int + val isFlipped = map[EntryFields.IS_FLIPPED] as Boolean + val sizeBytes = toLong(map[EntryFields.SIZE_BYTES]) + val trashed = map[EntryFields.TRASHED] as Boolean + val trashPath = map[EntryFields.TRASH_PATH] as String? + + private val isRotated: Boolean + get() = rotationDegrees % 180 == 90 + + val displayWidth: Int + get() = if (isRotated) height else width + + val displayHeight: Int + get() = if (isRotated) width else height + + override fun toString(): String = "AvesEntry#${hashCode()}{uri=$uri path=$path pageId=$pageId mimeType=$mimeType width=$width height=$height rotationDegrees=$rotationDegrees isFlipped=$isFlipped sizeBytes=$sizeBytes trashed=$trashed trashPath=$trashPath}" + + companion object { + // convenience method + private fun toLong(o: Any?): Long? = when (o) { + is Int -> o.toLong() + else -> o as? Long + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/EntryFields.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/EntryFields.kt new file mode 100644 index 0000000..1dab12b --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/EntryFields.kt @@ -0,0 +1,29 @@ +package deckers.thibault.aves.model + +// entry fields exported and imported from/to the platform side +// should match `EntryFields` on Dart side +object EntryFields { + const val ORIGIN = "origin" // int + const val URI = "uri" // string + const val CONTENT_ID = "contentId" // long + const val PATH = "path" // string + const val PAGE_ID = "pageId" // int + const val SOURCE_MIME_TYPE = "sourceMimeType" // string + const val MIME_TYPE = "mimeType" // string + + const val WIDTH = "width" // int + const val HEIGHT = "height" // int + const val SOURCE_ROTATION_DEGREES = "sourceRotationDegrees" // int + const val ROTATION_DEGREES = "rotationDegrees" // int + const val IS_FLIPPED = "isFlipped" // boolean + + const val DATE_ADDED_SECS = "dateAddedSecs" // long + const val DATE_MODIFIED_MILLIS = "dateModifiedMillis" // long + const val SOURCE_DATE_TAKEN_MILLIS = "sourceDateTakenMillis" // long + const val DURATION_MILLIS = "durationMillis" // long + + const val SIZE_BYTES = "sizeBytes" // long + const val TRASHED = "trashed" // boolean + const val TRASH_PATH = "trashPath" // string + const val TITLE = "title" // string +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/ExifOrientationOp.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/ExifOrientationOp.kt new file mode 100644 index 0000000..7b7737c --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/ExifOrientationOp.kt @@ -0,0 +1,5 @@ +package deckers.thibault.aves.model + +enum class ExifOrientationOp { + ROTATE_CW, ROTATE_CCW, FLIP +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/FieldMap.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/FieldMap.kt new file mode 100644 index 0000000..78592a2 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/FieldMap.kt @@ -0,0 +1,3 @@ +package deckers.thibault.aves.model + +typealias FieldMap = MutableMap<String, Any?> diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/NameConflictStrategy.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/NameConflictStrategy.kt new file mode 100644 index 0000000..21f59a7 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/NameConflictStrategy.kt @@ -0,0 +1,16 @@ +package deckers.thibault.aves.model + +import java.io.File + +enum class NameConflictStrategy { + RENAME, REPLACE, SKIP; + + companion object { + fun get(name: String?): NameConflictStrategy? { + name ?: return null + return valueOf(name.uppercase()) + } + } +} + +class NameConflictResolution(var nameWithoutExtension: String?, var replacementFile: File?) \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceEntry.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceEntry.kt new file mode 100644 index 0000000..39fccd8 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceEntry.kt @@ -0,0 +1,280 @@ +package deckers.thibault.aves.model + +import android.content.ContentResolver +import android.content.Context +import android.graphics.BitmapFactory +import android.media.MediaMetadataRetriever +import android.net.Uri +import androidx.core.net.toUri +import com.drew.metadata.avi.AviDirectory +import com.drew.metadata.exif.ExifIFD0Directory +import com.drew.metadata.jpeg.JpegDirectory +import com.drew.metadata.mp4.Mp4Directory +import com.drew.metadata.mp4.media.Mp4VideoDirectory +import com.drew.metadata.photoshop.PsdHeaderDirectory +import deckers.thibault.aves.glide.TiffFetcher +import deckers.thibault.aves.metadata.ExifInterfaceHelper.getSafeDateMillis +import deckers.thibault.aves.metadata.ExifInterfaceHelper.getSafeInt +import deckers.thibault.aves.metadata.MediaMetadataRetrieverHelper.getSafeDateMillis +import deckers.thibault.aves.metadata.MediaMetadataRetrieverHelper.getSafeInt +import deckers.thibault.aves.metadata.MediaMetadataRetrieverHelper.getSafeLong +import deckers.thibault.aves.metadata.MediaMetadataRetrieverHelper.getSafeString +import deckers.thibault.aves.metadata.Metadata +import deckers.thibault.aves.metadata.Metadata.getRotationDegreesForExifCode +import deckers.thibault.aves.metadata.metadataextractor.Helper +import deckers.thibault.aves.metadata.metadataextractor.Helper.getSafeDateMillis +import deckers.thibault.aves.metadata.metadataextractor.Helper.getSafeInt +import deckers.thibault.aves.metadata.metadataextractor.Helper.getSafeLong +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.StorageUtils +import deckers.thibault.aves.utils.UriUtils.tryParseId +import org.beyka.tiffbitmapfactory.TiffBitmapFactory +import java.io.IOException +import androidx.exifinterface.media.ExifInterfaceFork as ExifInterface + +class SourceEntry { + private val origin: Int + val uri: Uri // content or file URI + var path: String? = null // best effort to get local path + private val sourceMimeType: String + private var title: String? = null + var width: Int? = null + var height: Int? = null + private var sourceRotationDegrees: Int? = null + private var sizeBytes: Long? = null + private var dateAddedSecs: Long? = null + private var dateModifiedMillis: Long? = null + private var sourceDateTakenMillis: Long? = null + private var durationMillis: Long? = null + + private var foundExif: Boolean = false + + constructor(origin: Int, uri: Uri, sourceMimeType: String) { + this.origin = origin + this.uri = uri + this.sourceMimeType = sourceMimeType + } + + constructor(map: FieldMap) { + origin = map[EntryFields.ORIGIN] as Int + uri = (map[EntryFields.URI] as String).toUri() + path = map[EntryFields.PATH] as String? + sourceMimeType = map[EntryFields.SOURCE_MIME_TYPE] as String + width = map[EntryFields.WIDTH] as Int? + height = map[EntryFields.HEIGHT] as Int? + sourceRotationDegrees = map[EntryFields.SOURCE_ROTATION_DEGREES] as Int? + sizeBytes = toLong(map[EntryFields.SIZE_BYTES]) + title = map[EntryFields.TITLE] as String? + dateAddedSecs = toLong(map[EntryFields.DATE_ADDED_SECS]) + dateModifiedMillis = toLong(map[EntryFields.DATE_MODIFIED_MILLIS]) + sourceDateTakenMillis = toLong(map[EntryFields.SOURCE_DATE_TAKEN_MILLIS]) + durationMillis = toLong(map[EntryFields.DURATION_MILLIS]) + } + + fun initFromFile(path: String, title: String, sizeBytes: Long, dateModifiedMillis: Long) { + this.path = path + this.title = title + this.sizeBytes = sizeBytes + this.dateModifiedMillis = dateModifiedMillis + } + + fun toMap(): FieldMap { + return hashMapOf( + EntryFields.ORIGIN to origin, + EntryFields.URI to uri.toString(), + EntryFields.PATH to path, + EntryFields.SOURCE_MIME_TYPE to sourceMimeType, + EntryFields.WIDTH to width, + EntryFields.HEIGHT to height, + EntryFields.SOURCE_ROTATION_DEGREES to (sourceRotationDegrees ?: 0), + EntryFields.SIZE_BYTES to sizeBytes, + EntryFields.TITLE to title, + EntryFields.DATE_ADDED_SECS to dateAddedSecs, + EntryFields.DATE_MODIFIED_MILLIS to dateModifiedMillis, + EntryFields.SOURCE_DATE_TAKEN_MILLIS to sourceDateTakenMillis, + EntryFields.DURATION_MILLIS to durationMillis, + // only for map export + EntryFields.CONTENT_ID to contentId, + ) + } + + // ignore when the ID is not a number + // e.g. content://com.sec.android.app.myfiles.FileProvider/device_storage/20200109_162621.jpg + private val contentId: Long? + get() = if (uri.scheme == ContentResolver.SCHEME_CONTENT) uri.tryParseId() else null + + val isSized: Boolean + get() = (width ?: 0) > 0 && (height ?: 0) > 0 + + private val hasDuration: Boolean + get() = (durationMillis ?: 0) > 0 + + val isVideo: Boolean + get() = MimeTypes.isVideo(sourceMimeType) + + val isSvg: Boolean + get() = sourceMimeType == MimeTypes.SVG + + // metadata retrieval + // expects entry with: uri, mimeType + // finds: width, height, orientation/rotation, date, title, duration + fun fillPreCatalogMetadata(context: Context): SourceEntry { + if (isSvg) return this + if (isVideo) { + fillVideoByMediaMetadataRetriever(context) + if (isSized && hasDuration) return this + fillByMetadataExtractor(context) + } else { + fillByMetadataExtractor(context) + if (isSized && foundExif) return this + fillByExifInterface(context) + } + if (!isSized) { + when (sourceMimeType) { + MimeTypes.TIFF -> fillByTiffDecode(context) + else -> fillByBitmapDecode(context) + } + } + return this + } + + // finds: width, height, orientation, date, duration, title + private fun fillVideoByMediaMetadataRetriever(context: Context) { + val retriever = StorageUtils.openMetadataRetriever(context, uri) ?: return + try { + retriever.getSafeInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH) { width = it } + retriever.getSafeInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT) { height = it } + retriever.getSafeLong(MediaMetadataRetriever.METADATA_KEY_DURATION) { durationMillis = it } + retriever.getSafeDateMillis(MediaMetadataRetriever.METADATA_KEY_DATE) { sourceDateTakenMillis = it } + retriever.getSafeString(MediaMetadataRetriever.METADATA_KEY_TITLE) { title = it } + retriever.getSafeInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION) { sourceRotationDegrees = it } + } catch (_: Exception) { + // ignore + } finally { + // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs + retriever.release() + } + } + + // finds: width, height, orientation, date, duration + private fun fillByMetadataExtractor(context: Context) { + // skip raw images because `metadata-extractor` reports the decoded dimensions instead of the raw dimensions + if (!MimeTypes.canReadWithMetadataExtractor(sourceMimeType) + || MimeTypes.isRaw(sourceMimeType) + ) return + + try { + Metadata.openSafeInputStream(context, uri, sourceMimeType, sizeBytes)?.use { input -> + val metadata = Helper.safeRead(input, sizeBytes) + + // do not switch on specific MIME types, as the reported MIME type could be wrong + // (e.g. PNG registered as JPG) + if (isVideo) { + for (dir in metadata.getDirectoriesOfType(AviDirectory::class.java)) { + dir.getSafeInt(AviDirectory.TAG_WIDTH) { width = it } + dir.getSafeInt(AviDirectory.TAG_HEIGHT) { height = it } + dir.getSafeLong(AviDirectory.TAG_DURATION) { durationMillis = it } + } + for (dir in metadata.getDirectoriesOfType(Mp4VideoDirectory::class.java)) { + dir.getSafeInt(Mp4VideoDirectory.TAG_WIDTH) { width = it } + dir.getSafeInt(Mp4VideoDirectory.TAG_HEIGHT) { height = it } + } + for (dir in metadata.getDirectoriesOfType(Mp4Directory::class.java)) { + dir.getSafeInt(Mp4Directory.TAG_ROTATION) { sourceRotationDegrees = it } + dir.getSafeLong(Mp4Directory.TAG_DURATION) { durationMillis = it } + } + } else { + for (dir in metadata.getDirectoriesOfType(ExifIFD0Directory::class.java)) { + foundExif = true + dir.getSafeInt(ExifIFD0Directory.TAG_IMAGE_WIDTH) { width = it } + dir.getSafeInt(ExifIFD0Directory.TAG_IMAGE_HEIGHT) { height = it } + dir.getSafeInt(ExifIFD0Directory.TAG_ORIENTATION) { sourceRotationDegrees = getRotationDegreesForExifCode(it) } + dir.getSafeDateMillis(ExifIFD0Directory.TAG_DATETIME, null)?.let { sourceDateTakenMillis = it } + } + + // dimensions reported in EXIF do not always match the image + // so we fetch them from the format directory if available + for (dir in metadata.getDirectoriesOfType(JpegDirectory::class.java)) { + dir.getSafeInt(JpegDirectory.TAG_IMAGE_WIDTH) { width = it } + dir.getSafeInt(JpegDirectory.TAG_IMAGE_HEIGHT) { height = it } + } + for (dir in metadata.getDirectoriesOfType(PsdHeaderDirectory::class.java)) { + dir.getSafeInt(PsdHeaderDirectory.TAG_IMAGE_WIDTH) { width = it } + dir.getSafeInt(PsdHeaderDirectory.TAG_IMAGE_HEIGHT) { height = it } + } + } + } + } catch (_: Exception) { + // ignore + } catch (_: NoClassDefFoundError) { + // ignore + } catch (_: AssertionError) { + // ignore + } + } + + // finds: width, height, orientation, date + private fun fillByExifInterface(context: Context) { + if (!MimeTypes.canReadWithExifInterface(sourceMimeType)) return + + try { + Metadata.openSafeInputStream(context, uri, sourceMimeType, sizeBytes)?.use { input -> + val exif = ExifInterface(input) + foundExif = true + exif.getSafeInt(ExifInterface.TAG_IMAGE_WIDTH, acceptZero = false) { width = it } + exif.getSafeInt(ExifInterface.TAG_IMAGE_LENGTH, acceptZero = false) { height = it } + exif.getSafeInt(ExifInterface.TAG_ORIENTATION, acceptZero = false) { sourceRotationDegrees = exif.rotationDegrees } + exif.getSafeDateMillis(ExifInterface.TAG_DATETIME, ExifInterface.TAG_SUBSEC_TIME) { sourceDateTakenMillis = it } + } + } catch (_: Exception) { + // ExifInterface initialization can fail with a RuntimeException + // caused by an internal MediaMetadataRetriever failure + } + } + + // finds: width, height + private fun fillByBitmapDecode(context: Context) { + try { + StorageUtils.openInputStream(context, uri)?.use { input -> + val options = BitmapFactory.Options().apply { + inJustDecodeBounds = true + } + BitmapFactory.decodeStream(input, null, options) + width = options.outWidth + height = options.outHeight + } + } catch (_: IOException) { + // ignore + } + } + + private fun fillByTiffDecode(context: Context) { + try { + context.contentResolver.openFileDescriptor(uri, "r")?.use { pfd -> + val fd = pfd.detachFd() + val options = TiffFetcher.buildOptions().apply { + inJustDecodeBounds = true + } + TiffBitmapFactory.decodeFileDescriptor(fd, options) + width = options.outWidth + height = options.outHeight + } + } catch (_: Exception) { + // ignore + } + } + + companion object { + // convenience method + private fun toLong(o: Any?): Long? = when (o) { + is Int -> o.toLong() + else -> o as? Long + } + + // should match `EntryOrigins` on the Dart side + const val ORIGIN_MEDIA_STORE_CONTENT = 0 + const val ORIGIN_UNKNOWN_CONTENT = 1 + const val ORIGIN_FILE = 2 + const val ORIGIN_VAULT = 3 + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/AvesEmbeddedMediaProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/AvesEmbeddedMediaProvider.kt new file mode 100644 index 0000000..49f0a88 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/AvesEmbeddedMediaProvider.kt @@ -0,0 +1,18 @@ +package deckers.thibault.aves.model.provider + +import android.content.ContentResolver +import android.content.Context +import android.net.Uri +import java.util.Locale + +class AvesEmbeddedMediaProvider : UnknownContentProvider() { + override val reliableProviderMimeType: Boolean + get() = true + + companion object { + fun provides(context: Context, uri: Uri): Boolean { + if (uri.scheme?.lowercase(Locale.ROOT) != ContentResolver.SCHEME_CONTENT) return false + return uri.authority == "${context.applicationContext.packageName}.file_provider" + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/FileImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/FileImageProvider.kt new file mode 100644 index 0000000..ce9dabf --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/FileImageProvider.kt @@ -0,0 +1,126 @@ +package deckers.thibault.aves.model.provider + +import android.app.Activity +import android.content.Context +import android.content.ContextWrapper +import android.net.Uri +import android.util.Log +import android.webkit.MimeTypeMap +import deckers.thibault.aves.model.EntryFields +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.model.SourceEntry +import deckers.thibault.aves.utils.LogUtils +import java.io.File + +internal class FileImageProvider : ImageProvider() { + override fun fetchSingle(context: Context, uri: Uri, sourceMimeType: String?, allowUnsized: Boolean, callback: ImageOpCallback) { + var mimeType = sourceMimeType + val path = uri.path + + if (mimeType == null) { + // try to guess by file extension + var extension = MimeTypeMap.getFileExtensionFromUrl(uri.toString()) + if (extension.isEmpty() && path != null) { + val lastDotIndex = path.lastIndexOf('.') + if (lastDotIndex >= 0) { + extension = path.substring(lastDotIndex + 1) + } + } + if (extension.isNotEmpty()) { + mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) + } + } + + if (mimeType == null) { + // try to guess by file preview read + var sizeBytes: Long? = null + try { + path?.let { sizeBytes = File(it).length() } + } catch (e: SecurityException) { + callback.onFailure(e) + return + } + mimeType = detectMimeType(context, uri, mimeType = null, sizeBytes) + } + + if (mimeType == null) { + callback.onFailure(Exception("MIME type was not provided and cannot be guessed from extension or preview of uri=$uri")) + return + } + + val entry = SourceEntry(SourceEntry.ORIGIN_FILE, uri, mimeType) + + if (path != null) { + try { + val file = File(path) + if (file.exists()) { + entry.initFromFile( + path = path, + title = file.name, + sizeBytes = file.length(), + dateModifiedMillis = file.lastModified(), + ) + } + } catch (e: SecurityException) { + callback.onFailure(e) + return + } + } + entry.fillPreCatalogMetadata(context) + + if (allowUnsized || entry.isSized || entry.isSvg || entry.isVideo) { + callback.onSuccess(entry.toMap()) + } else { + callback.onFailure(Exception("entry has no size")) + } + } + + override fun delete(contextWrapper: ContextWrapper, uri: Uri, path: String?, mimeType: String) { + path ?: throw Exception("failed to delete file because path is null") + + val file = File(path) + if (file.exists()) { + Log.d(LOG_TAG, "delete file at path=$path") + if (!file.delete()) { + throw Exception("failed to delete entry with uri=$uri path=$path") + } + } + } + + override suspend fun renameSingle( + activity: Activity, + mimeType: String, + oldMediaUri: Uri, + oldPath: String, + newFile: File, + ): FieldMap { + Log.d(LOG_TAG, "rename file at path=$oldPath") + val renamed = File(oldPath).renameTo(newFile) + if (!renamed) { + throw Exception("failed to rename file at path=$oldPath") + } + + return hashMapOf( + EntryFields.URI to Uri.fromFile(newFile).toString(), + EntryFields.PATH to newFile.path, + EntryFields.DATE_MODIFIED_MILLIS to newFile.lastModified(), + ) + } + + override fun scanPostMetadataEdit(context: Context, path: String, uri: Uri, mimeType: String, newFields: FieldMap, callback: ImageOpCallback) { + try { + val file = File(path) + if (file.exists()) { + newFields[EntryFields.DATE_MODIFIED_MILLIS] = file.lastModified() + newFields[EntryFields.SIZE_BYTES] = file.length() + } + callback.onSuccess(newFields) + } catch (e: SecurityException) { + callback.onFailure(e) + } + } + + companion object { + private val LOG_TAG = LogUtils.createTag<MediaStoreImageProvider>() + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt new file mode 100644 index 0000000..98b3d83 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt @@ -0,0 +1,1443 @@ +package deckers.thibault.aves.model.provider + +import android.app.Activity +import android.content.Context +import android.content.ContextWrapper +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.Bitmap +import android.graphics.ImageDecoder +import android.net.Uri +import android.os.Binder +import android.os.Build +import android.util.Log +import androidx.core.net.toUri +import com.bumptech.glide.Glide +import com.bumptech.glide.request.FutureTarget +import com.commonsware.cwac.document.DocumentFileCompat +import deckers.thibault.aves.glide.AvesAppGlideModule +import deckers.thibault.aves.metadata.ExifInterfaceHelper +import deckers.thibault.aves.metadata.ExifInterfaceHelper.getSafeDateMillis +import deckers.thibault.aves.metadata.Metadata +import deckers.thibault.aves.metadata.Metadata.TYPE_EXIF +import deckers.thibault.aves.metadata.Metadata.TYPE_IPTC +import deckers.thibault.aves.metadata.Metadata.TYPE_MP4 +import deckers.thibault.aves.metadata.Metadata.TYPE_XMP +import deckers.thibault.aves.metadata.Mp4ParserHelper +import deckers.thibault.aves.metadata.Mp4ParserHelper.updateLocation +import deckers.thibault.aves.metadata.Mp4ParserHelper.updateRotation +import deckers.thibault.aves.metadata.Mp4ParserHelper.updateXmp +import deckers.thibault.aves.metadata.MultiPage +import deckers.thibault.aves.metadata.PixyMetaHelper +import deckers.thibault.aves.metadata.PixyMetaHelper.extendedXmpDocString +import deckers.thibault.aves.metadata.PixyMetaHelper.xmpDocString +import deckers.thibault.aves.metadata.metadataextractor.Helper +import deckers.thibault.aves.metadata.xmp.GoogleXMP +import deckers.thibault.aves.model.AvesEntry +import deckers.thibault.aves.model.EntryFields +import deckers.thibault.aves.model.ExifOrientationOp +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.model.NameConflictResolution +import deckers.thibault.aves.model.NameConflictStrategy +import deckers.thibault.aves.model.SourceEntry +import deckers.thibault.aves.utils.BitmapUtils +import deckers.thibault.aves.utils.BmpWriter +import deckers.thibault.aves.utils.FileUtils.transferFrom +import deckers.thibault.aves.utils.FileUtils.transferTo +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.MimeTypes.canEditExif +import deckers.thibault.aves.utils.MimeTypes.canEditIptc +import deckers.thibault.aves.utils.MimeTypes.canEditXmp +import deckers.thibault.aves.utils.MimeTypes.canReadWithExifInterface +import deckers.thibault.aves.utils.MimeTypes.canRemoveMetadata +import deckers.thibault.aves.utils.MimeTypes.extensionFor +import deckers.thibault.aves.utils.MimeTypes.isVideo +import deckers.thibault.aves.utils.StorageUtils +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.io.ByteArrayInputStream +import java.io.File +import java.io.FileOutputStream +import java.io.IOException +import java.io.OutputStream +import java.nio.channels.Channels +import java.util.Date +import java.util.TimeZone +import kotlin.math.absoluteValue +import androidx.exifinterface.media.ExifInterfaceFork as ExifInterface + +abstract class ImageProvider { + open fun fetchSingle(context: Context, uri: Uri, sourceMimeType: String?, allowUnsized: Boolean, callback: ImageOpCallback) { + callback.onFailure(UnsupportedOperationException("`fetchSingle` is not supported by this image provider")) + } + + suspend fun scanNewPath(context: Context, path: String, mimeType: String): FieldMap { + return if (StorageUtils.isInVault(context, path)) { + val uri = Uri.fromFile(File(path)) + hashMapOf( + EntryFields.ORIGIN to SourceEntry.ORIGIN_VAULT, + EntryFields.URI to uri.toString(), + EntryFields.CONTENT_ID to null, + EntryFields.PATH to path, + ) + } else { + MediaStoreImageProvider().scanNewPathByMediaStore(context, path, mimeType) + } + } + + private fun deletePath(contextWrapper: ContextWrapper, path: String, mimeType: String) { + if (StorageUtils.isInVault(contextWrapper, path)) { + FileImageProvider().apply { + val uri = Uri.fromFile(File(path)) + delete(contextWrapper, uri, path, mimeType) + } + } else { + MediaStoreImageProvider().apply { + val uri = getContentUriForPath(contextWrapper, path) + uri ?: throw Exception("failed to find content URI for path=$path") + delete(contextWrapper, uri, path, mimeType) + } + } + } + + open fun delete(contextWrapper: ContextWrapper, uri: Uri, path: String?, mimeType: String) { + throw UnsupportedOperationException("`delete` is not supported by this image provider") + } + + open suspend fun moveMultiple( + activity: Activity, + copy: Boolean, + nameConflictStrategy: NameConflictStrategy, + entriesByTargetDir: Map<String, List<AvesEntry>>, + isCancelledOp: CancelCheck, + callback: ImageOpCallback, + ) { + callback.onFailure(UnsupportedOperationException("`moveMultiple` is not supported by this image provider")) + } + + suspend fun renameMultiple( + activity: Activity, + entriesToNewName: Map<AvesEntry, String>, + isCancelledOp: CancelCheck, + callback: ImageOpCallback, + ) { + for (kv in entriesToNewName) { + val entry = kv.key + val desiredName = kv.value + + val sourceUri = entry.uri + val sourcePath = entry.path + val mimeType = entry.mimeType + + val result: FieldMap = hashMapOf( + "uri" to sourceUri.toString(), + "success" to false, + ) + + if (sourcePath != null) { + try { + var newFields: FieldMap = skippedFieldMap + if (!isCancelledOp()) { + val desiredNameWithoutExtension = desiredName.substringBeforeLast(".") + + val oldFile = File(sourcePath) + if (oldFile.nameWithoutExtension != desiredNameWithoutExtension) { + val defaultExtension = oldFile.extension + oldFile.parent?.let { dir -> + val resolution = resolveTargetFileNameWithoutExtension( + contextWrapper = activity, + dir = dir, + desiredNameWithoutExtension = desiredNameWithoutExtension, + mimeType = mimeType, + defaultExtension = defaultExtension, + conflictStrategy = NameConflictStrategy.RENAME, + ) + resolution.nameWithoutExtension?.let { targetNameWithoutExtension -> + val targetFileName = "$targetNameWithoutExtension${extensionFor(mimeType, defaultExtension)}" + val newFile = File(dir, targetFileName) + if (oldFile != newFile) { + newFields = renameSingle( + activity = activity, + mimeType = mimeType, + oldMediaUri = sourceUri, + oldPath = sourcePath, + newFile = newFile, + ) + } + } + } + } + } + result["newFields"] = newFields + result["success"] = true + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to rename to newFileName=$desiredName entry with sourcePath=$sourcePath", e) + } + } + callback.onSuccess(result) + } + } + + open suspend fun renameSingle( + activity: Activity, + mimeType: String, + oldMediaUri: Uri, + oldPath: String, + newFile: File, + ): FieldMap { + throw UnsupportedOperationException("`renameSingle` is not supported by this image provider") + } + + open fun scanPostMetadataEdit(context: Context, path: String, uri: Uri, mimeType: String, newFields: FieldMap, callback: ImageOpCallback) { + throw UnsupportedOperationException("`scanPostMetadataEdit` is not supported by this image provider") + } + + suspend fun convertMultiple( + activity: Activity, + imageExportMimeType: String, + targetDir: String, + entries: List<AvesEntry>, + quality: Int, + lengthUnit: String, + width: Int, + height: Int, + writeMetadata: Boolean, + nameConflictStrategy: NameConflictStrategy, + callback: ImageOpCallback, + ) { + if (!supportedExportMimeTypes.contains(imageExportMimeType)) { + callback.onFailure(Exception("unsupported export MIME type=$imageExportMimeType")) + return + } + + val targetDirDocFile = StorageUtils.createDirectoryDocIfAbsent(activity, targetDir) + if (!File(targetDir).exists()) { + callback.onFailure(Exception("failed to create directory at path=$targetDir")) + return + } + + for (entry in entries) { + val sourceUri = entry.uri + val sourcePath = entry.path + val pageId = entry.pageId + + val result: FieldMap = hashMapOf( + "uri" to sourceUri.toString(), + "pageId" to pageId, + "success" to false, + ) + + val sourceMimeType = entry.mimeType + val exportMimeType = if (isVideo(sourceMimeType)) sourceMimeType else imageExportMimeType + try { + val newFields = convertSingle( + activity = activity, + sourceEntry = entry, + targetDir = targetDir, + targetDirDocFile = targetDirDocFile, + quality = quality, + lengthUnit = lengthUnit, + width = width, + height = height, + writeMetadata = writeMetadata, + nameConflictStrategy = nameConflictStrategy, + exportMimeType = exportMimeType, + ) + result["newFields"] = newFields + result["success"] = true + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to convert to targetDir=$targetDir entry with sourcePath=$sourcePath pageId=$pageId", e) + } + callback.onSuccess(result) + } + } + + private suspend fun convertSingle( + activity: Activity, + sourceEntry: AvesEntry, + targetDir: String, + targetDirDocFile: DocumentFileCompat?, + quality: Int, + lengthUnit: String, + width: Int, + height: Int, + writeMetadata: Boolean, + nameConflictStrategy: NameConflictStrategy, + exportMimeType: String, + ): FieldMap { + val sourceMimeType = sourceEntry.mimeType + var sourceUri = sourceEntry.uri + val pageId = sourceEntry.pageId + + var desiredNameWithoutExtension = if (sourceEntry.path != null) { + val sourceFileName = File(sourceEntry.path).name + sourceFileName.substringBeforeLast(".") + } else { + sourceUri.lastPathSegment!! + } + if (pageId != null) { + val page = if (sourceMimeType == MimeTypes.TIFF) pageId + 1 else pageId + desiredNameWithoutExtension += "_${page.toString().padStart(3, '0')}" + } + + // there is no benefit providing input extension + // for known output MIME type + val defaultExtension = null + + val resolution = resolveTargetFileNameWithoutExtension( + contextWrapper = activity, + dir = targetDir, + desiredNameWithoutExtension = desiredNameWithoutExtension, + mimeType = exportMimeType, + defaultExtension = defaultExtension, + conflictStrategy = nameConflictStrategy, + ) + val targetNameWithoutExtension = resolution.nameWithoutExtension ?: return skippedFieldMap + resolution.replacementFile?.let { file -> + sourceUri = Uri.fromFile(file) + } + + val targetMimeType: String + val write: (OutputStream) -> Unit + var target: FutureTarget<Bitmap>? = null + try { + if (isVideo(sourceMimeType)) { + targetMimeType = sourceMimeType + write = { output -> + val sourceDocFile = DocumentFileCompat.fromSingleUri(activity, sourceUri) + sourceDocFile.copyTo(output) + } + } else { + var targetWidthPx: Int + var targetHeightPx: Int + when (lengthUnit) { + LENGTH_UNIT_PERCENT -> { + targetWidthPx = sourceEntry.displayWidth * width / 100 + targetHeightPx = sourceEntry.displayHeight * height / 100 + } + + else -> { + targetWidthPx = width + targetHeightPx = height + } + } + + val rotationDegrees = sourceEntry.rotationDegrees + val needRotationAfterGlide = MimeTypes.needRotationAfterGlide(sourceMimeType, pageId) + if (rotationDegrees != 0 && needRotationAfterGlide) { + targetWidthPx = targetHeightPx.also { targetHeightPx = targetWidthPx } + } + + target = Glide.with(activity.applicationContext) + .asBitmap() + .apply(AvesAppGlideModule.uncachedFullImageOptions) + .load(AvesAppGlideModule.getModel(activity, sourceUri, sourceMimeType, pageId, sourceEntry.sizeBytes)) + .submit(targetWidthPx, targetHeightPx) + + var bitmap = withContext(Dispatchers.IO) { target.get() } + if (needRotationAfterGlide) { + bitmap = BitmapUtils.applyExifOrientation(activity, bitmap, rotationDegrees, sourceEntry.isFlipped) + } + bitmap ?: throw Exception("failed to get image for mimeType=$sourceMimeType uri=$sourceUri page=$pageId") + + targetMimeType = exportMimeType + write = { output -> + if (exportMimeType == MimeTypes.BMP) { + BmpWriter.writeRGB24(bitmap, output) + } else { + val format = when (exportMimeType) { + MimeTypes.JPEG -> Bitmap.CompressFormat.JPEG + MimeTypes.PNG -> Bitmap.CompressFormat.PNG + MimeTypes.WEBP -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (quality == 100) { + Bitmap.CompressFormat.WEBP_LOSSLESS + } else { + Bitmap.CompressFormat.WEBP_LOSSY + } + } else { + @Suppress("deprecation") + Bitmap.CompressFormat.WEBP + } + + else -> throw Exception("unsupported export MIME type=$exportMimeType") + } + bitmap.compress(format, quality, output) + } + } + } + + val targetPath = MediaStoreImageProvider().createSingle( + activity = activity, + mimeType = targetMimeType, + targetDir = targetDir, + targetDirDocFile = targetDirDocFile, + targetNameWithoutExtension = targetNameWithoutExtension, + defaultExtension = defaultExtension, + write = write, + ) + + val newFields = scanNewPath(activity, targetPath, exportMimeType) + val targetUri = (newFields[EntryFields.URI] as String).toUri() + if (writeMetadata) { + copyMetadata( + context = activity, + sourceMimeType = sourceMimeType, + sourceUri = sourceUri, + targetMimeType = targetMimeType, + targetUri = targetUri, + targetPath = targetPath, + ) + } + + return newFields + } finally { + // clearing Glide target should happen after effectively writing the bitmap + Glide.with(activity.applicationContext).clear(target) + + resolution.replacementFile?.delete() + } + } + + private fun copyMetadata( + context: Context, + sourceMimeType: String, + sourceUri: Uri, + targetMimeType: String, + targetUri: Uri, + targetPath: String, + ) { + val editableFile = StorageUtils.createTempFile(context).apply { + // copy original file to a temporary file for editing + val inputStream = StorageUtils.openInputStream(context, targetUri) + transferFrom(inputStream, File(targetPath).length()) + } + + // copy IPTC / XMP via PixyMeta + PixyMetaHelper.copyIptcXmp(context, sourceMimeType, sourceUri, targetMimeType, targetUri, editableFile) + + // copy Exif via ExifInterface + + val exif = HashMap<String, String?>() + val skippedTags = listOf( + ExifInterface.TAG_IMAGE_LENGTH, + ExifInterface.TAG_IMAGE_WIDTH, + ExifInterface.TAG_ORIENTATION, + // Thumbnail Offset / Length + ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT, + ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH, + // Exif Image Width / Height + ExifInterface.TAG_PIXEL_X_DIMENSION, + ExifInterface.TAG_PIXEL_Y_DIMENSION, + ) + if (canReadWithExifInterface(sourceMimeType) && canEditExif(targetMimeType)) { + StorageUtils.openInputStream(context, sourceUri)?.use { input -> + ExifInterface(input).apply { + ExifInterfaceHelper.allTags.keys.filterNot { skippedTags.contains(it) }.filter { hasAttribute(it) }.forEach { tag -> + exif[tag] = getAttribute(tag) + } + } + } + } + if (exif.isNotEmpty()) { + ExifInterface(editableFile).apply { + exif.entries.forEach { (tag, value) -> + setAttribute(tag, value) + } + saveAttributes() + } + } + + // copy the edited temporary file back to the original + editableFile.transferTo(outputStream(context, targetMimeType, targetUri, targetPath)) + editableFile.delete() + } + + suspend fun captureFrame( + contextWrapper: ContextWrapper, + desiredNameWithoutExtension: String, + exifFields: FieldMap, + bytes: ByteArray, + targetDir: String, + nameConflictStrategy: NameConflictStrategy, + callback: ImageOpCallback, + ) { + val targetDirDocFile = StorageUtils.createDirectoryDocIfAbsent(contextWrapper, targetDir) + if (!File(targetDir).exists()) { + callback.onFailure(Exception("failed to create directory at path=$targetDir")) + return + } + + // TODO TLAD [storage] allow inserting by Media Store + if (targetDirDocFile == null) { + callback.onFailure(Exception("failed to get tree doc for directory at path=$targetDir")) + return + } + + val captureMimeType = MimeTypes.JPEG + val resolution = try { + resolveTargetFileNameWithoutExtension( + contextWrapper = contextWrapper, + dir = targetDir, + desiredNameWithoutExtension = desiredNameWithoutExtension, + mimeType = captureMimeType, + defaultExtension = null, + conflictStrategy = nameConflictStrategy, + ) + } catch (e: Exception) { + callback.onFailure(e) + return + } + + val targetNameWithoutExtension = resolution.nameWithoutExtension + if (targetNameWithoutExtension == null) { + // skip it + callback.onSuccess(skippedFieldMap) + return + } + + // the file created from a `TreeDocumentFile` is also a `TreeDocumentFile` + // but in order to open an output stream to it, we need to use a `SingleDocumentFile` + // through a document URI, not a tree URI + // note that `DocumentFile.getParentFile()` returns null if we did not pick a tree first + val targetTreeFile = targetDirDocFile.createFile(captureMimeType, targetNameWithoutExtension) + val targetDocFile = DocumentFileCompat.fromSingleUri(contextWrapper, targetTreeFile.uri) + + try { + if (exifFields.isEmpty()) { + targetDocFile.openOutputStream().use { output -> + output.write(bytes) + } + } else { + val editableFile = withContext(Dispatchers.IO) { StorageUtils.createTempFile(contextWrapper) }.apply { + transferFrom(ByteArrayInputStream(bytes), bytes.size.toLong()) + } + + val exif = ExifInterface(editableFile) + + val rotationDegrees = exifFields["rotationDegrees"] as Int? + if (rotationDegrees != null) { + // when the orientation is not defined, it returns `undefined (0)` instead of the orientation default value `normal (1)` + // in that case we explicitly set it to `normal` first + // because ExifInterface fails to rotate an image with undefined orientation + // as of androidx.exifinterface:exifinterface:1.3.0 + val currentOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL) + if (currentOrientation == ExifInterface.ORIENTATION_UNDEFINED) { + exif.setAttribute(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL.toString()) + } + exif.rotate(rotationDegrees) + } + + val dateTimeMillis = (exifFields["dateTimeMillis"] as Number?)?.toLong() + if (dateTimeMillis != null) { + val dateString = ExifInterfaceHelper.DATETIME_FORMAT.format(Date(dateTimeMillis)) + exif.setAttribute(ExifInterface.TAG_DATETIME, dateString) + exif.setAttribute(ExifInterface.TAG_DATETIME_ORIGINAL, dateString) + + val timeZoneString = getTimeZoneString(TimeZone.getDefault(), dateTimeMillis) + exif.setAttribute(ExifInterface.TAG_OFFSET_TIME, timeZoneString) + exif.setAttribute(ExifInterface.TAG_OFFSET_TIME_ORIGINAL, timeZoneString) + + val sub = dateTimeMillis % 1000 + if (sub > 0) { + val subString = sub.toString() + exif.setAttribute(ExifInterface.TAG_SUBSEC_TIME, subString) + exif.setAttribute(ExifInterface.TAG_SUBSEC_TIME_ORIGINAL, subString) + } + } + + val latitude = (exifFields["latitude"] as Number?)?.toDouble() + val longitude = (exifFields["longitude"] as Number?)?.toDouble() + if (latitude != null && longitude != null) { + exif.setLatLong(latitude, longitude) + } + + exif.saveAttributes() + + // copy the edited temporary file back to the original + DocumentFileCompat.fromFile(editableFile).copyTo(targetDocFile) + editableFile.delete() + } + + val fileName = targetDocFile.name + val targetFullPath = targetDir + fileName + val newFields = scanNewPath(contextWrapper, targetFullPath, captureMimeType) + callback.onSuccess(newFields) + } catch (e: Exception) { + callback.onFailure(e) + } + } + + fun createTimeStampFileName() = Date().time.toString() + + private fun sanitizeDesiredFileName(desiredName: String): String { + var name = desiredName + // prevent creating hidden files + while (name.isNotEmpty() && name.startsWith(".")) { + name = name.substring(1) + } + if (name.isEmpty()) { + name = createTimeStampFileName() + } + return name + } + + // returns available name to use, or `null` to skip it + fun resolveTargetFileNameWithoutExtension( + contextWrapper: ContextWrapper, + dir: String, + desiredNameWithoutExtension: String, + mimeType: String, + defaultExtension: String?, + conflictStrategy: NameConflictStrategy, + ): NameConflictResolution { + val sanitizedNameWithoutExtension = sanitizeDesiredFileName(desiredNameWithoutExtension) + var resolvedName: String? = sanitizedNameWithoutExtension + var replacementFile: File? = null + + val extension = extensionFor(mimeType, defaultExtension) + val targetFile = File(dir, "$sanitizedNameWithoutExtension$extension") + when (conflictStrategy) { + NameConflictStrategy.RENAME -> { + var nameWithoutExtension = sanitizedNameWithoutExtension + var i = 0 + while (File(dir, "$nameWithoutExtension$extension").exists()) { + i++ + nameWithoutExtension = "$sanitizedNameWithoutExtension ($i)" + } + resolvedName = nameWithoutExtension + } + + NameConflictStrategy.REPLACE -> { + if (targetFile.exists()) { + // move replaced file to temp storage + // so that it can be used as a source for conversion or metadata copy + replacementFile = StorageUtils.createTempFile(contextWrapper).apply { + targetFile.transferTo(outputStream()) + } + deletePath(contextWrapper, targetFile.path, mimeType) + } + } + + NameConflictStrategy.SKIP -> { + if (targetFile.exists()) { + resolvedName = null + } + } + } + + return NameConflictResolution(resolvedName, replacementFile) + } + + // cf `MetadataFetchHandler.getCatalogMetadataByMetadataExtractor()` for a more thorough check + fun detectMimeType(context: Context, uri: Uri, mimeType: String?, sizeBytes: Long?): String? { + var detectedMimeType: String? = null + if (MimeTypes.canReadWithMetadataExtractor(mimeType)) { + try { + Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> + detectedMimeType = Helper.readMimeType(input) + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) + } + } + return detectedMimeType + } + + private fun editExif( + context: Context, + path: String, + uri: Uri, + mimeType: String, + callback: ImageOpCallback, + autoCorrectTrailerOffset: Boolean = true, + trailerDiff: Int = 0, + edit: (exif: ExifInterface) -> Unit, + ): Boolean { + if (!canEditExif(mimeType)) { + callback.onFailure(UnsupportedOperationException("unsupported mimeType=$mimeType")) + return false + } + + val originalFileSize = File(path).length() + var trailerVideoBytes: ByteArray? = null + val editableFile = StorageUtils.createTempFile(context).apply { + val trailerVideoSize = MultiPage.getTrailerVideoSize(context, uri, mimeType, originalFileSize)?.let { it + trailerDiff } + val isTrailerVideoValid = trailerVideoSize != null && MultiPage.getTrailerVideoInfo(context, uri, originalFileSize, trailerVideoSize) != null + try { + if (trailerVideoSize != null && isTrailerVideoValid) { + // handle motion photo and embedded video separately + val imageSize = (originalFileSize - trailerVideoSize).toInt() + val videoByteSize = trailerVideoSize.toInt() + trailerVideoBytes = ByteArray(videoByteSize) + + StorageUtils.openInputStream(context, uri)?.let { input -> + val imageBytes = ByteArray(imageSize) + input.read(imageBytes, 0, imageSize) + input.read(trailerVideoBytes, 0, videoByteSize) + + // copy only the image to a temporary file for editing + // video will be appended after metadata modification + transferFrom(ByteArrayInputStream(imageBytes), imageBytes.size.toLong()) + } + } else { + // copy original file to a temporary file for editing + val inputStream = StorageUtils.openInputStream(context, uri) + transferFrom(inputStream, originalFileSize) + } + } catch (e: Exception) { + callback.onFailure(e) + return false + } + } + + try { + edit(ExifInterface(editableFile)) + + val editableFileSizeBytes = editableFile.length() + if (editableFileSizeBytes == 0L) { + callback.onFailure(Exception("editing Exif yielded an empty file")) + return false + } + + val editedMimeType = detectMimeType(context, Uri.fromFile(editableFile), mimeType, editableFileSizeBytes) + if (editedMimeType != mimeType) { + throw Exception("editing Exif changes mimeType=$mimeType -> $editedMimeType for uri=$uri path=$path") + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + // editing may corrupt the file for various reasons, + // so we check whether decoding it throws an exception + ImageDecoder.decodeBitmap(ImageDecoder.createSource(editableFile)) + } + + if (trailerVideoBytes != null) { + // append trailer video, if any + editableFile.appendBytes(trailerVideoBytes) + } + + // copy the edited temporary file back to the original + editableFile.transferTo(outputStream(context, mimeType, uri, path)) + + if (autoCorrectTrailerOffset && !checkTrailerOffset(context, path, uri, mimeType, trailerVideoBytes?.size, editableFile, callback)) { + return false + } + editableFile.delete() + } catch (e: IOException) { + callback.onFailure(e) + return false + } + + return true + } + + private fun editIptc( + context: Context, + path: String, + uri: Uri, + mimeType: String, + callback: ImageOpCallback, + autoCorrectTrailerOffset: Boolean = true, + trailerDiff: Int = 0, + iptc: List<FieldMap>?, + ): Boolean { + if (!canEditIptc(mimeType)) { + callback.onFailure(UnsupportedOperationException("unsupported mimeType=$mimeType")) + return false + } + + val originalFileSize = File(path).length() + var trailerVideoBytes: ByteArray? = null + val editableFile = StorageUtils.createTempFile(context).apply { + val trailerVideoSize = MultiPage.getTrailerVideoSize(context, uri, mimeType, originalFileSize)?.let { it + trailerDiff } + val isTrailerVideoValid = trailerVideoSize != null && MultiPage.getTrailerVideoInfo(context, uri, originalFileSize, trailerVideoSize) != null + try { + if (trailerVideoSize != null && isTrailerVideoValid) { + // handle motion photo and embedded video separately + val imageSize = (originalFileSize - trailerVideoSize).toInt() + val videoByteSize = trailerVideoSize.toInt() + trailerVideoBytes = ByteArray(videoByteSize) + + StorageUtils.openInputStream(context, uri)?.let { input -> + val imageBytes = ByteArray(imageSize) + input.read(imageBytes, 0, imageSize) + input.read(trailerVideoBytes, 0, videoByteSize) + + // copy only the image to a temporary file for editing + // video will be appended after metadata modification + transferFrom(ByteArrayInputStream(imageBytes), imageBytes.size.toLong()) + } + } else { + // copy original file to a temporary file for editing + val inputStream = StorageUtils.openInputStream(context, uri) + transferFrom(inputStream, originalFileSize) + } + } catch (e: Exception) { + callback.onFailure(e) + return false + } + } + + try { + editableFile.outputStream().use { output -> + // reopen input to read from start + StorageUtils.openInputStream(context, uri)?.use { input -> + when { + iptc != null -> + PixyMetaHelper.setIptc(input, output, iptc) + + canRemoveMetadata(mimeType) -> + PixyMetaHelper.removeMetadata(input, output, setOf(TYPE_IPTC)) + + else -> { + Log.w(LOG_TAG, "setting empty IPTC for mimeType=$mimeType") + PixyMetaHelper.setIptc(input, output, null) + } + } + } + } + + if (editableFile.length() == 0L) { + callback.onFailure(Exception("editing IPTC yielded an empty file")) + return false + } + + if (trailerVideoBytes != null) { + // append trailer video, if any + editableFile.appendBytes(trailerVideoBytes) + } + + // copy the edited temporary file back to the original + editableFile.transferTo(outputStream(context, mimeType, uri, path)) + + if (autoCorrectTrailerOffset && !checkTrailerOffset(context, path, uri, mimeType, trailerVideoBytes?.size, editableFile, callback)) { + return false + } + editableFile.delete() + } catch (e: IOException) { + callback.onFailure(e) + return false + } + + return true + } + + private fun editMp4Metadata( + context: Context, + path: String, + uri: Uri, + mimeType: String, + callback: ImageOpCallback, + fieldsToEdit: Map<*, *>, + newFields: FieldMap? = null, + ): Boolean { + if (mimeType != MimeTypes.MP4) { + callback.onFailure(UnsupportedOperationException("unsupported mimeType=$mimeType")) + return false + } + + try { + val edits = Mp4ParserHelper.computeEdits(context, uri) { isoFile -> + fieldsToEdit.forEach { kv -> + val tag = kv.key as String + val value = kv.value as String? + when (tag) { + "gpsCoordinates" -> isoFile.updateLocation(value) + "rotationDegrees" -> { + val degrees = value?.toIntOrNull() ?: throw Exception("failed because of invalid rotation=$value") + if (isoFile.updateRotation(degrees) && newFields != null) { + newFields["rotationDegrees"] = degrees + } + } + + "xmp" -> isoFile.updateXmp(value) + } + } + } + + val pfd = StorageUtils.openOutputFileDescriptor( + context = context, + mimeType = mimeType, + uri = uri, + path = path, + // do not truncate with "t" + // "w" is enough on API 29+, but it will yield an empty file on API <29 + // so "r" is necessary for backward compatibility + mode = "rw", + ) ?: throw Exception("failed to open file descriptor for uri=$uri path=$path") + pfd.use { + FileOutputStream(it.fileDescriptor).use { outputStream -> + outputStream.channel.use { outputChannel -> + edits.forEach { (offset, bytes) -> + bytes.inputStream().use { inputStream -> + Channels.newChannel(inputStream).use { inputChannel -> + outputChannel.transferFrom(inputChannel, offset, bytes.size.toLong()) + } + } + } + } + } + } + } catch (e: NoClassDefFoundError) { + callback.onFailure(e) + return false + } catch (e: Exception) { + callback.onFailure(e) + return false + } + + return true + } + + // provide `editCoreXmp` to modify existing core XMP, + // or provide `coreXmp` and `extendedXmp` to set them + private fun editXmp( + context: Context, + path: String, + uri: Uri, + mimeType: String, + callback: ImageOpCallback, + autoCorrectTrailerOffset: Boolean = true, + trailerDiff: Int = 0, + coreXmp: String? = null, + extendedXmp: String? = null, + editCoreXmp: ((xmp: String) -> String)? = null, + ): Boolean { + if (!canEditXmp(mimeType)) { + callback.onFailure(UnsupportedOperationException("unsupported mimeType=$mimeType")) + return false + } + + if (mimeType == MimeTypes.MP4) { + return editMp4Metadata( + context = context, + path = path, + uri = uri, + mimeType = mimeType, + callback = callback, + fieldsToEdit = mapOf("xmp" to coreXmp), + ) + } + + val originalFileSize = File(path).length() + val trailerVideoSize = MultiPage.getTrailerVideoSize(context, uri, mimeType, originalFileSize)?.let { it.toInt() + trailerDiff } + val editableFile = StorageUtils.createTempFile(context).apply { + try { + editXmpWithPixy( + context = context, + uri = uri, + mimeType = mimeType, + coreXmp = coreXmp, + extendedXmp = extendedXmp, + editCoreXmp = editCoreXmp, + editableFile = this + ) + } catch (e: Exception) { + callback.onFailure(e) + return false + } + } + + if (editableFile.length() == 0L) { + callback.onFailure(Exception("editing XMP yielded an empty file")) + return false + } + + try { + // copy the edited temporary file back to the original + editableFile.transferTo(outputStream(context, mimeType, uri, path)) + + if (autoCorrectTrailerOffset && !checkTrailerOffset(context, path, uri, mimeType, trailerVideoSize, editableFile, callback)) { + return false + } + editableFile.delete() + } catch (e: IOException) { + callback.onFailure(e) + return false + } + + return true + } + + private fun editXmpWithPixy( + context: Context, + uri: Uri, + mimeType: String, + coreXmp: String?, + extendedXmp: String?, + editCoreXmp: ((xmp: String) -> String)?, + editableFile: File + ) { + var editedXmpString = coreXmp + var editedExtendedXmp = extendedXmp + if (editCoreXmp != null) { + val pixyXmp = StorageUtils.openInputStream(context, uri)?.use { input -> PixyMetaHelper.getXmp(input) } + if (pixyXmp != null) { + editedXmpString = editCoreXmp(pixyXmp.xmpDocString()) + if (pixyXmp.hasExtendedXmp()) { + editedExtendedXmp = pixyXmp.extendedXmpDocString() + } + } + } + + editableFile.outputStream().use { output -> + // reopen input to read from start + StorageUtils.openInputStream(context, uri)?.use { input -> + if (editedXmpString != null) { + if (editedExtendedXmp != null && mimeType != MimeTypes.JPEG) { + Log.w(LOG_TAG, "extended XMP is not supported by mimeType=$mimeType") + PixyMetaHelper.setXmp(input, output, editedXmpString, null) + } else { + PixyMetaHelper.setXmp(input, output, editedXmpString, editedExtendedXmp) + } + } else if (canRemoveMetadata(mimeType)) { + PixyMetaHelper.removeMetadata(input, output, setOf(TYPE_XMP)) + } else { + Log.w(LOG_TAG, "setting empty XMP for mimeType=$mimeType") + PixyMetaHelper.setXmp(input, output, null, null) + } + } + } + } + + // A few bytes are sometimes appended when writing to a document output stream. + // In that case, we need to adjust the trailer video offset accordingly and rewrite the file. + // returns whether the file at `path` is fine + private fun checkTrailerOffset( + context: Context, + path: String, + uri: Uri, + mimeType: String, + trailerOffset: Number?, + editedFile: File, + callback: ImageOpCallback, + ): Boolean { + if (trailerOffset == null) return true + + val expectedLength = editedFile.length() + val actualLength = File(path).length() + val diff = (actualLength - expectedLength).toInt() + if (diff == 0) return true + + Log.w( + LOG_TAG, "Edited file length=$expectedLength does not match final document file length=$actualLength. " + + "We need to edit XMP to adjust trailer video offset by $diff bytes." + ) + val newTrailerOffset = trailerOffset.toLong() + diff + return editXmp(context, path, uri, mimeType, callback, trailerDiff = diff, editCoreXmp = { xmp -> + GoogleXMP.updateTrailingVideoOffset(xmp, trailerOffset, newTrailerOffset) + }) + } + + fun editOrientation( + context: Context, + path: String, + uri: Uri, + mimeType: String, + op: ExifOrientationOp, + callback: ImageOpCallback, + ) { + val newFields: FieldMap = hashMapOf() + + val success = editExif(context, path, uri, mimeType, callback) { exif -> + // when the orientation is not defined, it returns `undefined (0)` instead of the orientation default value `normal (1)` + // in that case we explicitly set it to `normal` first + // because ExifInterface fails to rotate an image with undefined orientation + // as of androidx.exifinterface:exifinterface:1.3.0 + val currentOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL) + if (currentOrientation == ExifInterface.ORIENTATION_UNDEFINED) { + exif.setAttribute(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL.toString()) + } + when (op) { + ExifOrientationOp.ROTATE_CW -> exif.rotate(90) + ExifOrientationOp.ROTATE_CCW -> exif.rotate(-90) + ExifOrientationOp.FLIP -> exif.flipHorizontally() + } + exif.saveAttributes() + newFields["rotationDegrees"] = exif.rotationDegrees + newFields["isFlipped"] = exif.isFlipped + } + + if (success) { + scanPostMetadataEdit(context, path, uri, mimeType, newFields, callback) + } + } + + fun editDate( + context: Context, + path: String, + uri: Uri, + mimeType: String, + dateMillis: Long?, + shiftSeconds: Long?, + fields: List<String>, + callback: ImageOpCallback, + ) { + val success = editExif(context, path, uri, mimeType, callback) { exif -> + when { + dateMillis != null -> { + // set + val date = Date(dateMillis) + val dateString = ExifInterfaceHelper.DATETIME_FORMAT.format(date) + val subSec = dateMillis % 1000 + val subSecString = if (subSec > 0) subSec.toString().padStart(3, '0') else null + + if (fields.contains(ExifInterface.TAG_DATETIME)) { + exif.setAttribute(ExifInterface.TAG_DATETIME, dateString) + exif.setAttribute(ExifInterface.TAG_SUBSEC_TIME, subSecString) + } + if (fields.contains(ExifInterface.TAG_DATETIME_ORIGINAL)) { + exif.setAttribute(ExifInterface.TAG_DATETIME_ORIGINAL, dateString) + exif.setAttribute(ExifInterface.TAG_SUBSEC_TIME_ORIGINAL, subSecString) + } + if (fields.contains(ExifInterface.TAG_DATETIME_DIGITIZED)) { + exif.setAttribute(ExifInterface.TAG_DATETIME_DIGITIZED, dateString) + exif.setAttribute(ExifInterface.TAG_SUBSEC_TIME_DIGITIZED, subSecString) + } + if (fields.contains(ExifInterface.TAG_GPS_DATESTAMP)) { + exif.setAttribute(ExifInterface.TAG_GPS_DATESTAMP, ExifInterfaceHelper.GPS_DATE_FORMAT.format(date)) + exif.setAttribute(ExifInterface.TAG_GPS_TIMESTAMP, ExifInterfaceHelper.GPS_TIME_FORMAT.format(date)) + } + } + + shiftSeconds != null -> { + // shift + val shiftMillis = shiftSeconds * 1000 + listOf( + ExifInterface.TAG_DATETIME, + ExifInterface.TAG_DATETIME_ORIGINAL, + ExifInterface.TAG_DATETIME_DIGITIZED, + ).forEach { field -> + if (fields.contains(field)) { + val subSecTag = when (field) { + ExifInterface.TAG_DATETIME -> ExifInterface.TAG_SUBSEC_TIME + ExifInterface.TAG_DATETIME_DIGITIZED -> ExifInterface.TAG_SUBSEC_TIME_DIGITIZED + ExifInterface.TAG_DATETIME_ORIGINAL -> ExifInterface.TAG_SUBSEC_TIME_ORIGINAL + else -> null + } + exif.getSafeDateMillis(field, subSecTag) { date -> + exif.setAttribute(field, ExifInterfaceHelper.DATETIME_FORMAT.format(date + shiftMillis)) + } + } + } + if (fields.contains(ExifInterface.TAG_GPS_DATESTAMP)) { + exif.gpsDateTime?.let { date -> + val shifted = date + shiftMillis - TimeZone.getDefault().rawOffset + exif.setAttribute(ExifInterface.TAG_GPS_DATESTAMP, ExifInterfaceHelper.GPS_DATE_FORMAT.format(shifted)) + exif.setAttribute(ExifInterface.TAG_GPS_TIMESTAMP, ExifInterfaceHelper.GPS_TIME_FORMAT.format(shifted)) + } + } + } + + else -> { + // clear + if (fields.contains(ExifInterface.TAG_DATETIME)) { + exif.setAttribute(ExifInterface.TAG_DATETIME, null) + exif.setAttribute(ExifInterface.TAG_SUBSEC_TIME, null) + exif.setAttribute(ExifInterface.TAG_OFFSET_TIME, null) + } + if (fields.contains(ExifInterface.TAG_DATETIME_ORIGINAL)) { + exif.setAttribute(ExifInterface.TAG_DATETIME_ORIGINAL, null) + exif.setAttribute(ExifInterface.TAG_SUBSEC_TIME_ORIGINAL, null) + exif.setAttribute(ExifInterface.TAG_OFFSET_TIME_ORIGINAL, null) + } + if (fields.contains(ExifInterface.TAG_DATETIME_DIGITIZED)) { + exif.setAttribute(ExifInterface.TAG_DATETIME_DIGITIZED, null) + exif.setAttribute(ExifInterface.TAG_SUBSEC_TIME_DIGITIZED, null) + exif.setAttribute(ExifInterface.TAG_OFFSET_TIME_DIGITIZED, null) + } + if (fields.contains(ExifInterface.TAG_GPS_DATESTAMP)) { + exif.setAttribute(ExifInterface.TAG_GPS_DATESTAMP, null) + exif.setAttribute(ExifInterface.TAG_GPS_TIMESTAMP, null) + } + } + } + exif.saveAttributes() + } + + if (success) { + scanPostMetadataEdit(context, path, uri, mimeType, HashMap(), callback) + } + } + + fun editMetadata( + context: Context, + path: String, + uri: Uri, + mimeType: String, + modifier: FieldMap, + autoCorrectTrailerOffset: Boolean, + callback: ImageOpCallback, + ) { + val newFields: FieldMap = hashMapOf() + if (modifier.containsKey(TYPE_EXIF)) { + val fields = modifier[TYPE_EXIF] as Map<*, *>? + if (!fields.isNullOrEmpty()) { + if (!editExif( + context = context, + path = path, + uri = uri, + mimeType = mimeType, + callback = callback, + autoCorrectTrailerOffset = autoCorrectTrailerOffset, + ) { exif -> + var setLocation = false + fields.forEach { kv -> + val tag = kv.key as String? + if (tag != null) { + val value = kv.value + if (value == null) { + // remove attribute + exif.setAttribute(tag, null) + } else { + when (tag) { + ExifInterface.TAG_GPS_LATITUDE, + ExifInterface.TAG_GPS_LATITUDE_REF, + ExifInterface.TAG_GPS_LONGITUDE, + ExifInterface.TAG_GPS_LONGITUDE_REF -> { + setLocation = true + } + + else -> { + if (value is String) { + exif.setAttribute(tag, value) + } else { + Log.w(LOG_TAG, "failed to set Exif attribute $tag because value=$value is not a string") + } + } + } + } + } + } + if (setLocation) { + val latAbs = (fields[ExifInterface.TAG_GPS_LATITUDE] as Number?)?.toDouble() + val latRef = fields[ExifInterface.TAG_GPS_LATITUDE_REF] as String? + val lngAbs = (fields[ExifInterface.TAG_GPS_LONGITUDE] as Number?)?.toDouble() + val lngRef = fields[ExifInterface.TAG_GPS_LONGITUDE_REF] as String? + if (latAbs != null && latRef != null && lngAbs != null && lngRef != null) { + val latitude = if (latRef == ExifInterface.LATITUDE_SOUTH) -latAbs else latAbs + val longitude = if (lngRef == ExifInterface.LONGITUDE_WEST) -lngAbs else lngAbs + exif.setLatLong(latitude, longitude) + } else { + Log.w(LOG_TAG, "failed to set Exif location with latAbs=$latAbs, latRef=$latRef, lngAbs=$lngAbs, lngRef=$lngRef") + } + } + exif.saveAttributes() + } + ) return + } + } + + if (modifier.containsKey(TYPE_IPTC)) { + val iptc = (modifier[TYPE_IPTC] as List<*>?)?.filterIsInstance<FieldMap>() + if (!editIptc( + context = context, + path = path, + uri = uri, + mimeType = mimeType, + callback = callback, + autoCorrectTrailerOffset = autoCorrectTrailerOffset, + iptc = iptc, + ) + ) return + } + + if (modifier.containsKey(TYPE_MP4)) { + val fieldsToEdit = modifier[TYPE_MP4] as Map<*, *>? + if (!fieldsToEdit.isNullOrEmpty()) { + if (!editMp4Metadata( + context = context, + path = path, + uri = uri, + mimeType = mimeType, + callback = callback, + fieldsToEdit = fieldsToEdit, + newFields = newFields, + ) + ) return + } + } + + if (modifier.containsKey(TYPE_XMP)) { + val xmp = modifier[TYPE_XMP] as Map<*, *>? + if (xmp != null) { + val coreXmp = xmp["xmp"] as String? + val extendedXmp = xmp["extendedXmp"] as String? + if (!editXmp( + context = context, + path = path, + uri = uri, + mimeType = mimeType, + callback = callback, + autoCorrectTrailerOffset = autoCorrectTrailerOffset, + coreXmp = coreXmp, + extendedXmp = extendedXmp, + ) + ) return + } + } + + scanPostMetadataEdit(context, path, uri, mimeType, newFields, callback) + } + + fun removeTrailerVideo( + context: Context, + path: String, + uri: Uri, + mimeType: String, + callback: ImageOpCallback, + ) { + val originalFileSize = File(path).length() + val trailerVideoSize = MultiPage.getTrailerVideoSize(context, uri, mimeType, originalFileSize) + if (trailerVideoSize == null) { + callback.onFailure(Exception("failed to get trailer video size")) + return + } + + val isTrailerVideoValid = MultiPage.getTrailerVideoInfo(context, uri, fileSize = originalFileSize, videoSize = trailerVideoSize) != null + if (!isTrailerVideoValid) { + callback.onFailure(Exception("failed to open trailer video with size=$trailerVideoSize")) + return + } + + val editableFile = StorageUtils.createTempFile(context).apply { + try { + val inputStream = StorageUtils.openInputStream(context, uri) + // partial copy + transferFrom(inputStream, originalFileSize - trailerVideoSize) + } catch (e: Exception) { + Log.d(LOG_TAG, "failed to remove trailer video", e) + callback.onFailure(e) + return + } + } + + try { + // copy the edited temporary file back to the original + editableFile.transferTo(outputStream(context, mimeType, uri, path)) + editableFile.delete() + } catch (e: IOException) { + callback.onFailure(e) + return + } + + val newFields: FieldMap = hashMapOf() + scanPostMetadataEdit(context, path, uri, mimeType, newFields, callback) + } + + fun removeMetadataTypes( + context: Context, + path: String, + uri: Uri, + mimeType: String, + types: Set<String>, + callback: ImageOpCallback, + ) { + if (!canRemoveMetadata(mimeType)) { + callback.onFailure(UnsupportedOperationException("unsupported mimeType=$mimeType")) + return + } + + val originalFileSize = File(path).length() + val trailerVideoSize = MultiPage.getTrailerVideoSize(context, uri, mimeType, originalFileSize) + val isTrailerVideoValid = trailerVideoSize != null && MultiPage.getTrailerVideoInfo(context, uri, originalFileSize, trailerVideoSize) != null + val editableFile = StorageUtils.createTempFile(context).apply { + try { + outputStream().use { output -> + // reopen input to read from start + StorageUtils.openInputStream(context, uri)?.use { input -> + PixyMetaHelper.removeMetadata(input, output, types) + } + } + } catch (e: Exception) { + Log.d(LOG_TAG, "failed to remove metadata", e) + callback.onFailure(e) + return + } + } + + if (editableFile.length() == 0L) { + callback.onFailure(Exception("removing metadata yielded an empty file")) + return + } + + try { + // copy the edited temporary file back to the original + editableFile.transferTo(outputStream(context, mimeType, uri, path)) + + if (!types.contains(TYPE_XMP) && isTrailerVideoValid && !checkTrailerOffset(context, path, uri, mimeType, trailerVideoSize, editableFile, callback)) { + return + } + editableFile.delete() + } catch (e: IOException) { + callback.onFailure(e) + return + } + + val newFields: FieldMap = hashMapOf() + scanPostMetadataEdit(context, path, uri, mimeType, newFields, callback) + } + + private fun outputStream( + context: Context, + mimeType: String, + uri: Uri, + path: String + ): OutputStream { + // truncate is necessary when overwriting a longer file + val mode = "wt" + return if (isMediaUriPermissionGranted(context, uri, mimeType)) { + StorageUtils.openOutputStream(context, mimeType, uri, mode) ?: throw Exception("failed to open output stream for uri=$uri") + } else { + val documentUri = StorageUtils.getDocumentFile(context, path, uri)?.uri ?: throw Exception("failed to get document file for path=$path, uri=$uri") + context.contentResolver.openOutputStream(documentUri, mode) ?: throw Exception("failed to open output stream from documentUri=$documentUri for path=$path, uri=$uri") + } + } + + interface ImageOpCallback { + fun onSuccess(fields: FieldMap) + fun onFailure(throwable: Throwable) + } + + companion object { + private val LOG_TAG = LogUtils.createTag<ImageProvider>() + + private const val LENGTH_UNIT_PERCENT = "percent" + + val supportedExportMimeTypes = listOf(MimeTypes.BMP, MimeTypes.JPEG, MimeTypes.PNG, MimeTypes.WEBP) + + // used when skipping a move/creation op because the target file already exists + val skippedFieldMap: HashMap<String, Any?> = hashMapOf("skipped" to true) + + // used when deleting instead of moving to bin because the target file no longer exists + val deletedFieldMap: HashMap<String, Any?> = hashMapOf("deleted" to true) + + fun isMediaUriPermissionGranted(context: Context, uri: Uri, mimeType: String): Boolean { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + val safeUri = StorageUtils.getMediaStoreScopedStorageSafeUri(uri, mimeType) + + val pid = Binder.getCallingPid() + val uid = Binder.getCallingUid() + val flags = Intent.FLAG_GRANT_WRITE_URI_PERMISSION + context.checkUriPermission(safeUri, pid, uid, flags) == PackageManager.PERMISSION_GRANTED + } else { + false + } + } + + fun getTimeZoneString(timeZone: TimeZone, dateTimeMillis: Long): String { + val offset = timeZone.getOffset(dateTimeMillis) + val offsetInMinutes = offset.absoluteValue / 60000 + val offsetSign = if (offset < 0) "-" else "+" + val offsetHours = "${offsetInMinutes / 60}".padStart(2, '0') + val offsetMinutes = "${offsetInMinutes % 60}".padStart(2, '0') + return "$offsetSign$offsetHours:$offsetMinutes" + } + } +} + +typealias CancelCheck = () -> Boolean diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProviderFactory.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProviderFactory.kt new file mode 100644 index 0000000..1807206 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProviderFactory.kt @@ -0,0 +1,26 @@ +package deckers.thibault.aves.model.provider + +import android.content.ContentResolver +import android.content.Context +import android.net.Uri +import deckers.thibault.aves.utils.StorageUtils +import java.util.Locale + +object ImageProviderFactory { + fun getProvider(context: Context, uri: Uri): ImageProvider? { + return when (uri.scheme?.lowercase(Locale.ROOT)) { + ContentResolver.SCHEME_CONTENT -> { + if (StorageUtils.isMediaStoreContentUri(uri)) { + MediaStoreImageProvider() + } else if (AvesEmbeddedMediaProvider.provides(context, uri)) { + AvesEmbeddedMediaProvider() + } else { + UnknownContentProvider() + } + } + + ContentResolver.SCHEME_FILE -> FileImageProvider() + else -> null + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt new file mode 100644 index 0000000..183931a --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt @@ -0,0 +1,1079 @@ +package deckers.thibault.aves.model.provider + +import android.annotation.SuppressLint +import android.app.Activity +import android.app.RecoverableSecurityException +import android.content.ContentResolver +import android.content.ContentUris +import android.content.ContentValues +import android.content.Context +import android.content.ContextWrapper +import android.graphics.BitmapFactory +import android.media.MediaScannerConnection +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.MediaStore +import android.util.Log +import androidx.annotation.RequiresApi +import com.commonsware.cwac.document.DocumentFileCompat +import deckers.thibault.aves.MainActivity +import deckers.thibault.aves.MainActivity.Companion.DELETE_SINGLE_PERMISSION_REQUEST +import deckers.thibault.aves.model.AvesEntry +import deckers.thibault.aves.model.EntryFields +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.model.NameConflictStrategy +import deckers.thibault.aves.model.SourceEntry +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.MimeTypes.extensionFor +import deckers.thibault.aves.utils.MimeTypes.isHeic +import deckers.thibault.aves.utils.MimeTypes.isImage +import deckers.thibault.aves.utils.MimeTypes.isVideo +import deckers.thibault.aves.utils.StorageUtils +import deckers.thibault.aves.utils.StorageUtils.PathSegments +import deckers.thibault.aves.utils.StorageUtils.ensureTrailingSeparator +import deckers.thibault.aves.utils.StorageUtils.removeTrailingSeparator +import deckers.thibault.aves.utils.UriUtils.tryParseId +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.suspendCancellableCoroutine +import java.io.File +import java.io.FileOutputStream +import java.io.IOException +import java.io.OutputStream +import java.io.SyncFailedException +import java.util.Locale +import java.util.concurrent.CompletableFuture +import kotlin.coroutines.Continuation +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException + +class MediaStoreImageProvider : ImageProvider() { + fun fetchAll( + context: Context, + knownEntries: Map<Long?, Long?>, + directory: String?, + handleNewEntry: NewEntryHandler, + ) { + Log.d(LOG_TAG, "fetching all media store items for ${knownEntries.size} known entries, directory=$directory") + val isModified = fun(contentId: Long, dateModifiedMillis: Long): Boolean { + val knownDate = knownEntries[contentId] + return knownDate == null || knownDate < dateModifiedMillis + } + val handleNew: NewEntryHandler + var selection: String? = null + var selectionArgs: Array<String>? = null + if (directory != null) { + val relativePathDirectory = ensureTrailingSeparator(directory) + val relativePath = PathSegments(context, relativePathDirectory).relativeDir + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && relativePath != null) { + selection = "${MediaStore.MediaColumns.RELATIVE_PATH} = ? AND ${MediaStore.MediaColumns.DATA} LIKE ?" + selectionArgs = arrayOf(relativePath, "$relativePathDirectory%") + } else { + selection = "${MediaStore.MediaColumns.DATA} LIKE ?" + selectionArgs = arrayOf("$relativePathDirectory%") + } + + val parentCheckDirectory = removeTrailingSeparator(directory) + handleNew = { entry -> + // skip entries in subfolders + val path = entry[EntryFields.PATH] as String? + if (path != null && File(path).parent == parentCheckDirectory) { + handleNewEntry(entry) + } + } + } else { + handleNew = handleNewEntry + } + fetchFrom(context, isModified, handleNew, IMAGE_CONTENT_URI, IMAGE_PROJECTION, selection, selectionArgs) + fetchFrom(context, isModified, handleNew, VIDEO_CONTENT_URI, VIDEO_PROJECTION, selection, selectionArgs) + } + + // the provided URI can point to the wrong media collection, + // e.g. a GIF image with the URI `content://media/external/video/media/[ID]` + // so the effective entry URI may not match the provided URI + override fun fetchSingle(context: Context, uri: Uri, sourceMimeType: String?, allowUnsized: Boolean, callback: ImageOpCallback) { + var found = false + val fetched = arrayListOf<FieldMap>() + val id = uri.tryParseId() + val alwaysValid: NewEntryChecker = fun(_: Long, _: Long): Boolean = true + val onSuccess: NewEntryHandler = fun(entry: FieldMap) { fetched.add(entry) } + if (id != null) { + if (sourceMimeType == null || isImage(sourceMimeType)) { + val contentUri = ContentUris.withAppendedId(IMAGE_CONTENT_URI, id) + found = fetchFrom(context, alwaysValid, onSuccess, contentUri, IMAGE_PROJECTION) + } + if (!found && (sourceMimeType == null || isVideo(sourceMimeType))) { + val contentUri = ContentUris.withAppendedId(VIDEO_CONTENT_URI, id) + found = fetchFrom(context, alwaysValid, onSuccess, contentUri, VIDEO_PROJECTION) + } + } + if (!found) { + // the uri can be a file media URI (e.g. "content://0@media/external/file/30050") + // without an equivalent image/video if it is shared from a file browser + // but the file is not publicly visible + found = fetchFrom(context, alwaysValid, onSuccess, uri, BASE_PROJECTION, fileMimeType = sourceMimeType) + } + + if (found && fetched.isNotEmpty()) { + if (fetched.size == 1) { + callback.onSuccess(fetched.first()) + } else { + callback.onFailure(Exception("found ${fetched.size} entries at uri=$uri")) + } + } else { + callback.onFailure(Exception("failed to fetch entry at uri=$uri")) + } + } + + fun checkObsoleteContentIds(context: Context, knownContentIds: List<Long?>): List<Long> { + val foundContentIds = HashSet<Long>() + fun check(context: Context, contentUri: Uri) { + val projection = arrayOf(MediaStore.MediaColumns._ID) + try { + val cursor = context.contentResolver.query(contentUri, projection, null, null, null) + if (cursor != null) { + val idColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID) + while (cursor.moveToNext()) { + foundContentIds.add(cursor.getLong(idColumn)) + } + cursor.close() + } + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to get content IDs for contentUri=$contentUri", e) + } + } + check(context, IMAGE_CONTENT_URI) + check(context, VIDEO_CONTENT_URI) + return knownContentIds.subtract(foundContentIds).filterNotNull().toList() + } + + fun checkObsoletePaths(context: Context, knownPathById: Map<Long?, String?>): List<Long> { + val obsoleteIds = ArrayList<Long>() + fun check(context: Context, contentUri: Uri) { + val projection = arrayOf(MediaStore.MediaColumns._ID, MediaStore.MediaColumns.DATA) + try { + val cursor = context.contentResolver.query(contentUri, projection, null, null, null) + if (cursor != null) { + val idColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID) + val pathColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA) + while (cursor.moveToNext()) { + val id = cursor.getLong(idColumn) + val path = cursor.getString(pathColumn) + if (knownPathById.containsKey(id) && knownPathById[id] != path) { + obsoleteIds.add(id) + } + } + cursor.close() + } + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to get content IDs for contentUri=$contentUri", e) + } + } + check(context, IMAGE_CONTENT_URI) + check(context, VIDEO_CONTENT_URI) + return obsoleteIds + } + + fun getChangedUris(context: Context, sinceGeneration: Int): List<String> { + val changedUris = ArrayList<String>() + fun check(context: Context, contentUri: Uri) { + val projection = arrayOf(MediaStore.MediaColumns._ID) + val selection = "${MediaStore.MediaColumns.GENERATION_MODIFIED} > ?" + val selectionArgs = arrayOf(sinceGeneration.toString()) + try { + val cursor = context.contentResolver.query(contentUri, projection, selection, selectionArgs, null) + if (cursor != null) { + val idColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID) + while (cursor.moveToNext()) { + val id = cursor.getLong(idColumn) + changedUris.add(ContentUris.withAppendedId(contentUri, id).toString()) + } + cursor.close() + } + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to get content IDs for contentUri=$contentUri", e) + } + } + check(context, IMAGE_CONTENT_URI) + check(context, VIDEO_CONTENT_URI) + return changedUris + } + + private fun fetchFrom( + context: Context, + isValidEntry: NewEntryChecker, + handleNewEntry: NewEntryHandler, + contentUri: Uri, + projection: Array<String>, + selection: String? = null, + selectionArgs: Array<String>? = null, + fileMimeType: String? = null, + ): Boolean { + var found = false + val orderBy = "${MediaStore.MediaColumns.DATE_MODIFIED} DESC" + try { + val cursor = context.contentResolver.query(contentUri, projection, selection, selectionArgs, orderBy) + if (cursor != null) { + val contentUriContainsId = when (contentUri) { + IMAGE_CONTENT_URI, VIDEO_CONTENT_URI -> false + else -> true + } + + // image & video + val idColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID) + val pathColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA) + val mimeTypeColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.MIME_TYPE) + val sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE) + val widthColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.WIDTH) + val heightColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.HEIGHT) + val dateAddedSecsColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_ADDED) + val dateModifiedSecsColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_MODIFIED) + val dateTakenColumn = cursor.getColumnIndex(MediaColumns.DATE_TAKEN) + + // image & video for API >=29, only for images for API <29 + val orientationColumn = cursor.getColumnIndex(MediaColumns.ORIENTATION) + + // video only + val durationColumn = cursor.getColumnIndex(MediaColumns.DURATION) + val needDuration = projection.contentEquals(VIDEO_PROJECTION) + + while (cursor.moveToNext()) { + val id = cursor.getLong(idColumn) + val dateModifiedMillis = cursor.getInt(dateModifiedSecsColumn) * 1000L + if (isValidEntry(id, dateModifiedMillis)) { + // for multiple items, `contentUri` is the root without ID, + // but for single items, `contentUri` already contains the ID + val itemUri = if (contentUriContainsId) contentUri else ContentUris.withAppendedId(contentUri, id) + // `mimeType` can be registered as null for file media URIs with unsupported media types (e.g. TIFF on old devices) + // in that case we try to use the MIME type provided along the URI + val mimeType: String? = cursor.getString(mimeTypeColumn) ?: fileMimeType + var width = cursor.getInt(widthColumn) + var height = cursor.getInt(heightColumn) + val durationMillis = if (durationColumn != -1) cursor.getLong(durationColumn) else 0L + + if (mimeType == null) { + Log.w(LOG_TAG, "failed to make entry from uri=$itemUri because of null MIME type") + } else { + val path = cursor.getString(pathColumn) + + val isDir = path != null && File(path).isDirectory + if (isDir) { + // some directories are wrongly registered as media (e.g. `.../Android/media/is.xyz.mpv`) + Log.w(LOG_TAG, "failed to make entry from uri=$itemUri because path=$path refers to a directory") + } else { + var entryFields: FieldMap = hashMapOf( + EntryFields.ORIGIN to SourceEntry.ORIGIN_MEDIA_STORE_CONTENT, + EntryFields.URI to itemUri.toString(), + EntryFields.PATH to path, + EntryFields.SOURCE_MIME_TYPE to mimeType, + EntryFields.WIDTH to width, + EntryFields.HEIGHT to height, + EntryFields.SOURCE_ROTATION_DEGREES to if (orientationColumn != -1) cursor.getInt(orientationColumn) else 0, + EntryFields.SIZE_BYTES to cursor.getLong(sizeColumn), + EntryFields.DATE_ADDED_SECS to cursor.getInt(dateAddedSecsColumn), + EntryFields.DATE_MODIFIED_MILLIS to dateModifiedMillis, + EntryFields.SOURCE_DATE_TAKEN_MILLIS to if (dateTakenColumn != -1) cursor.getLong(dateTakenColumn) else null, + EntryFields.DURATION_MILLIS to durationMillis, + // only for map export + EntryFields.CONTENT_ID to id, + ) + + if (isHeic(mimeType)) { + // The reported size for some HEIC images is simply incorrect. + try { + StorageUtils.openInputStream(context, itemUri)?.use { input -> + val options = BitmapFactory.Options().apply { + inJustDecodeBounds = true + } + BitmapFactory.decodeStream(input, null, options) + val outWidth = options.outWidth + val outHeight = options.outHeight + if (outWidth > 0 && outHeight > 0) { + width = outWidth + height = outHeight + entryFields[EntryFields.WIDTH] = width + entryFields[EntryFields.HEIGHT] = height + } + } + } catch (_: IOException) { + // ignore + } + } + + if (MimeTypes.isRaw(mimeType) + || (width <= 0 || height <= 0) && needSize(mimeType) + || durationMillis == 0L && needDuration + ) { + // Some images are incorrectly registered in the Media Store, + // missing some attributes such as width, height, orientation. + // Also, the reported size of raw images is inconsistent across devices + // and Android versions (sometimes the raw size, sometimes the decoded size). + val entry = SourceEntry(entryFields).fillPreCatalogMetadata(context) + entryFields = entry.toMap() + } + + getFileModifiedDateMillis(path)?.let { entryFields[EntryFields.DATE_MODIFIED_MILLIS] = it } + + handleNewEntry(entryFields) + found = true + } + } + } + } + cursor.close() + } + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to get entries", e) + } + return found + } + + private fun hasEntry(context: Context, contentUri: Uri): Boolean { + var found = false + val projection = arrayOf(MediaStore.MediaColumns._ID) + try { + val cursor = context.contentResolver.query(contentUri, projection, null, null, null) + if (cursor != null) { + while (cursor.moveToNext()) { + found = true + } + cursor.close() + } + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to get entry at contentUri=$contentUri", e) + } + return found + } + + private fun needSize(mimeType: String) = MimeTypes.SVG != mimeType + + // `uri` is a media URI, not a document URI + override fun delete(contextWrapper: ContextWrapper, uri: Uri, path: String?, mimeType: String) { + path ?: throw Exception("failed to delete file because path is null") + + // the following situations are possible: + // - there is an entry in the Media Store and there is a file on storage + // - there is an entry in the Media Store but there is no longer a file on storage + // - there is no entry in the Media Store but there is a file on storage + val file = File(path) + val fileExists = file.exists() + + if (fileExists) { + if (StorageUtils.canEditByFile(contextWrapper, path)) { + if (hasEntry(contextWrapper, uri)) { + Log.d(LOG_TAG, "delete [permission:file, file exists, content exists] content at uri=$uri path=$path") + contextWrapper.contentResolver.delete(uri, null, null) + } + // in theory, deleting via content resolver should remove the file on storage + // in practice, the file may still be there afterwards + if (file.exists()) { + Log.d(LOG_TAG, "delete [permission:file, file exists after content delete] file at uri=$uri path=$path") + if (file.delete()) { + // in theory, scanning an obsolete path should remove the entry from the Media Store + // in practice, the entry may still be there afterwards + scanObsoletePath(contextWrapper, uri, path, mimeType) + return + } + } else { + return + } + } else if (!isMediaUriPermissionGranted(contextWrapper, uri, mimeType) + && StorageUtils.requireAccessPermission(contextWrapper, path) + ) { + // the delete request may yield a `RecoverableSecurityException` when using scoped storage, + // even if we have permissions on the tree document via SAF + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q && hasEntry(contextWrapper, uri)) { + Log.d(LOG_TAG, "delete [permission:doc, file exists, content exists] content at uri=$uri path=$path") + contextWrapper.contentResolver.delete(uri, null, null) + } + + // in theory, deleting via content resolver should remove the file on storage + // in practice, the file may still be there afterwards + if (file.exists()) { + Log.d(LOG_TAG, "delete [permission:doc, file exists after content delete] document at uri=$uri path=$path") + val df = StorageUtils.getDocumentFile(contextWrapper, path, uri) + + if (df != null && df.delete()) { + scanObsoletePath(contextWrapper, uri, path, mimeType) + return + } + throw Exception("failed to delete document with df=$df") + } else { + return + } + } + } else if (uri.scheme?.lowercase(Locale.ROOT) == ContentResolver.SCHEME_FILE) { + val uriFilePath = File(uri.path!!).path + // URI and path both point to the same non-existent path + if (uriFilePath == path) return + } + + try { + Log.d(LOG_TAG, "delete [file exists=$fileExists] content at uri=$uri path=$path") + if (contextWrapper.contentResolver.delete(uri, null, null) > 0) return + + if (hasEntry(contextWrapper, uri) || file.exists()) { + throw Exception("failed to delete row from content provider") + } + } catch (securityException: SecurityException) { + // even if the app has access permission granted on the containing directory, + // the delete request may yield a `RecoverableSecurityException` on API >=29 + // when the underlying file no longer exists and this is an orphaned entry in the Media Store + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && contextWrapper is Activity) { + Log.w(LOG_TAG, "caught a security exception when attempting to delete uri=$uri", securityException) + val rse = securityException as? RecoverableSecurityException ?: throw securityException + val intentSender = rse.userAction.actionIntent.intentSender + + // request user permission for this item + MainActivity.pendingScopedStoragePermissionCompleter = CompletableFuture<Boolean>() + contextWrapper.startIntentSenderForResult(intentSender, DELETE_SINGLE_PERMISSION_REQUEST, null, 0, 0, 0, null) + val granted = MainActivity.pendingScopedStoragePermissionCompleter!!.join() + + MainActivity.pendingScopedStoragePermissionCompleter = null + if (granted) { + delete(contextWrapper, uri, path, mimeType) + } else { + throw Exception("failed to get delete permission") + } + } else { + throw securityException + } + } + } + + override suspend fun moveMultiple( + activity: Activity, + copy: Boolean, + nameConflictStrategy: NameConflictStrategy, + entriesByTargetDir: Map<String, List<AvesEntry>>, + isCancelledOp: CancelCheck, + callback: ImageOpCallback, + ) { + entriesByTargetDir.forEach { kv -> + val targetDir = kv.key + val entries = kv.value + + val toBin = targetDir == StorageUtils.TRASH_PATH_PLACEHOLDER + val toVault = StorageUtils.isInVault(activity, targetDir) + val toAppDir = toBin || toVault + + var effectiveTargetDir: String? = null + var targetDirDocFile: DocumentFileCompat? = null + if (!toAppDir) { + effectiveTargetDir = targetDir + targetDirDocFile = StorageUtils.createDirectoryDocIfAbsent(activity, targetDir) + if (!File(targetDir).exists()) { + // download subdirectories can be created later by Media Store insertion + if (!isDownloadSubdir(activity, targetDir)) { + callback.onFailure(Exception("failed to create directory at path=$targetDir")) + return + } + } + } + + for (entry in entries) { + val mimeType = entry.mimeType + val trashed = entry.trashed + + val sourceUri = entry.uri + val sourcePath = if (trashed) entry.trashPath else entry.path + + var desiredName: String? = null + if (trashed) { + entry.path?.let { desiredName = File(it).name } + } + + val result: FieldMap = hashMapOf( + "uri" to sourceUri.toString(), + "success" to false, + ) + + // on API 30 we cannot get access granted directly to a volume root from its document tree, + // but it is still less constraining to use tree document files than to rely on the Media Store + // + // Relying on `DocumentFile`, we can create an item via `DocumentFile.createFile()`, but: + // - we need to scan the file to get the Media Store content URI + // - the underlying document provider controls the new file name + // + // Relying on the Media Store, we can create an item via `ContentResolver.insert()` + // with a path, and retrieve its content URI, but: + // - the Media Store isolates content by storage volume (e.g. `MediaStore.Images.Media.getContentUri(volumeName)`) + // - the volume name should be lower case, not exactly as the `StorageVolume` UUID + // cf new method in API 30 `StorageVolume.getMediaStoreVolumeName()` + // - inserting on a removable volume works on API 29, but not on API 25 nor 26 (on which API/devices does it work?) + // - there is no documentation regarding support for usage with removable storage + // - the Media Store only allows inserting in specific primary directories ("DCIM", "Pictures") when using scoped storage + try { + val appDir = when { + toBin -> StorageUtils.trashDirFor(activity, sourcePath ?: StorageUtils.getPrimaryVolumePath(activity)) + toVault -> File(targetDir) + else -> null + } + if (appDir != null) { + effectiveTargetDir = ensureTrailingSeparator(appDir.path) + targetDirDocFile = DocumentFileCompat.fromFile(appDir) + + if (toVault) { + appDir.mkdirs() + } + } + + if (effectiveTargetDir != null) { + val newFields = if (isCancelledOp()) skippedFieldMap else { + val sourceFile = if (sourcePath != null) File(sourcePath) else null + if (sourceFile != null && !sourceFile.exists() && toBin) { + delete(activity, sourceUri, sourcePath, mimeType = mimeType) + deletedFieldMap + } else { + moveSingle( + activity = activity, + sourceFile = sourceFile, + sourceUri = sourceUri, + targetDir = effectiveTargetDir, + targetDirDocFile = targetDirDocFile, + desiredName = desiredName ?: sourceFile?.name ?: sourceUri.lastPathSegment ?: createTimeStampFileName(), + nameConflictStrategy = nameConflictStrategy, + mimeType = mimeType, + copy = copy, + toBin = toBin, + ) + } + } + result["newFields"] = newFields + result["success"] = true + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to move to targetDir=$targetDir entry with sourcePath=$sourcePath", e) + } + callback.onSuccess(result) + } + } + } + + private suspend fun moveSingle( + activity: Activity, + sourceFile: File?, + sourceUri: Uri, + targetDir: String, + targetDirDocFile: DocumentFileCompat?, + desiredName: String, + nameConflictStrategy: NameConflictStrategy, + mimeType: String, + copy: Boolean, + toBin: Boolean, + ): FieldMap { + val sourcePath = sourceFile?.path + val sourceExtension = sourceFile?.extension + val sourceDir = sourceFile?.parent?.let { ensureTrailingSeparator(it) } + if (sourceDir == targetDir && !(copy && nameConflictStrategy == NameConflictStrategy.RENAME)) { + // nothing to do unless it's a renamed copy + return skippedFieldMap + } + + val desiredNameWithoutExtension = desiredName.substringBeforeLast(".") + val resolution = resolveTargetFileNameWithoutExtension( + contextWrapper = activity, + dir = targetDir, + desiredNameWithoutExtension = desiredNameWithoutExtension, + mimeType = mimeType, + defaultExtension = sourceExtension, + conflictStrategy = nameConflictStrategy, + ) + val targetNameWithoutExtension = resolution.nameWithoutExtension ?: return skippedFieldMap + + val sourceDocFile = DocumentFileCompat.fromSingleUri(activity, sourceUri) + val targetPath = createSingle( + activity = activity, + mimeType = mimeType, + targetDir = targetDir, + targetDirDocFile = targetDirDocFile, + targetNameWithoutExtension = targetNameWithoutExtension, + defaultExtension = sourceExtension, + ) { output: OutputStream -> + try { + sourceDocFile.copyTo(output) + } catch (e: SyncFailedException) { + // The copied file is synced after writing, but it consistently fails in some cases + // (e.g. copying to SD card on Xiaomi 2201117PG with Android 11). + // It seems this failure can be safely ignored, as the new file is complete. + Log.w(LOG_TAG, "sync failure after copying from uri=$sourceUri, path=$sourcePath to targetDir=$targetDir", e) + } + } + + if (!copy) { + // delete original entry + try { + delete(activity, sourceUri, sourcePath, mimeType) + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to delete entry with path=$sourcePath", e) + } + } + return if (toBin) { + hashMapOf( + EntryFields.TRASHED to true, + EntryFields.TRASH_PATH to targetPath, + ) + } else { + scanNewPath(activity, targetPath, mimeType) + } + } + + fun createSingle( + activity: Activity, + mimeType: String, + targetDir: String, + targetDirDocFile: DocumentFileCompat?, + targetNameWithoutExtension: String, + defaultExtension: String?, + write: (OutputStream) -> Unit, + ): String { + if (StorageUtils.isInVault(activity, targetDir)) { + return insertByFile( + targetDir = targetDir, + targetFileName = "$targetNameWithoutExtension${extensionFor(mimeType, defaultExtension)}", + write = write, + ) + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (isDownloadSubdir(activity, targetDir)) { + return insertByMediaStore( + activity = activity, + targetDir = targetDir, + targetFileName = "$targetNameWithoutExtension${extensionFor(mimeType, defaultExtension)}", + write = write, + ) + } + } + + return insertByTreeDoc( + activity = activity, + mimeType = mimeType, + targetDir = targetDir, + targetDirDocFile = targetDirDocFile, + targetNameWithoutExtension = targetNameWithoutExtension, + defaultExtension = defaultExtension, + write = write, + ) + } + + private fun isDownloadSubdir(context: Context, dir: String): Boolean { + val volumePath = StorageUtils.getVolumePath(context, dir) ?: return false + val downloadDirPath = ensureTrailingSeparator(File(volumePath, Environment.DIRECTORY_DOWNLOADS).path) + // effective download path may have a different case + return dir.lowercase().startsWith(downloadDirPath.lowercase()) + } + + private fun insertByFile( + targetDir: String, + targetFileName: String, + write: (OutputStream) -> Unit, + ): String { + val file = File(targetDir, targetFileName) + FileOutputStream(file).use(write) + return file.path + } + + @RequiresApi(Build.VERSION_CODES.Q) + private fun insertByMediaStore( + activity: Activity, + targetDir: String, + targetFileName: String, + write: (OutputStream) -> Unit, + ): String { + val volumePath = StorageUtils.getVolumePath(activity, targetDir) + val relativePath = targetDir.substring(volumePath?.length ?: 0) + + val values = ContentValues().apply { + put(MediaStore.MediaColumns.DISPLAY_NAME, targetFileName) + put(MediaStore.MediaColumns.RELATIVE_PATH, relativePath) + put(MediaStore.MediaColumns.IS_PENDING, 1) + } + val resolver = activity.contentResolver + val uri = resolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values) + + uri?.let { + resolver.openOutputStream(uri)?.use(write) + values.clear() + values.put(MediaStore.MediaColumns.IS_PENDING, 0) + resolver.update(uri, values, null, null) + } ?: throw Exception("MediaStore failed for some reason") + + return File(targetDir, targetFileName).path + } + + // `DocumentsContract.moveDocument()` needs `sourceParentDocumentUri`, which could be different for each entry + // `DocumentsContract.copyDocument()` yields "Unsupported call: android:copyDocument" + // when used with entry URI as `sourceDocumentUri`, and targetDirDocFile URI as `targetParentDocumentUri` + private fun insertByTreeDoc( + activity: Activity, + mimeType: String, + targetDir: String, + targetDirDocFile: DocumentFileCompat?, + targetNameWithoutExtension: String, + defaultExtension: String?, + write: (OutputStream) -> Unit, + ): String { + targetDirDocFile ?: throw Exception("failed to get tree doc for directory at path=$targetDir") + + // the file created from a `TreeDocumentFile` is also a `TreeDocumentFile` + // but in order to open an output stream to it, we need to use a `SingleDocumentFile` + // through a document URI, not a tree URI + // note that `DocumentFile.getParentFile()` returns null if we did not pick a tree first + var targetTreeFile = targetDirDocFile.createFile(mimeType, targetNameWithoutExtension) + var targetDocFile = DocumentFileCompat.fromSingleUri(activity, targetTreeFile.uri) + + // providing a display name and a MIME type does not guarantee + // that the created document will be backed by a file with a valid media extension, + // but having an extension is essential for media detection by Android, + // so we retry with a display name that includes the extension + if ((targetDocFile.extension == null || targetDocFile.extension.isEmpty() || targetDocFile.extension == "bin") && defaultExtension != null) { + if (targetDocFile.exists()) { + targetDocFile.delete() + } + + val extension = if (defaultExtension.startsWith(".")) defaultExtension else ".$defaultExtension" + targetTreeFile = targetDirDocFile.createFile(mimeType, "$targetNameWithoutExtension$extension") + targetDocFile = DocumentFileCompat.fromSingleUri(activity, targetTreeFile.uri) + } + + try { + targetDocFile.openOutputStream().use(write) + } catch (e: Exception) { + // remove empty file + if (targetDocFile.exists()) { + targetDocFile.delete() + } + throw e + } + + // the source file name and the created document file name can be different when: + // - a file with the same name already exists, some implementations give a suffix like ` (1)`, some *do not* + // - the original extension does not match the extension added by the underlying provider + val fileName = targetDocFile.name + return targetDir + fileName + } + + override suspend fun renameSingle( + activity: Activity, + mimeType: String, + oldMediaUri: Uri, + oldPath: String, + newFile: File, + ): FieldMap = when { + StorageUtils.canEditByFile(activity, oldPath) -> renameSingleByFile(activity, mimeType, oldMediaUri, oldPath, newFile) + isMediaUriPermissionGranted(activity, oldMediaUri, mimeType) -> renameSingleByMediaStore(activity, mimeType, oldMediaUri, newFile) + else -> renameSingleByTreeDoc(activity, mimeType, oldMediaUri, oldPath, newFile) + } + + private suspend fun renameSingleByMediaStore( + activity: Activity, + mimeType: String, + mediaUri: Uri, + newFile: File + ): FieldMap { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + throw Exception("unsupported Android version") + } + + Log.d(LOG_TAG, "rename content at uri=$mediaUri") + val uri = StorageUtils.getMediaStoreScopedStorageSafeUri(mediaUri, mimeType) + + // `IS_PENDING` is necessary for `TITLE`, not for `DISPLAY_NAME` + val tempValues = ContentValues().apply { + put(MediaStore.MediaColumns.IS_PENDING, 1) + } + if (activity.contentResolver.update(uri, tempValues, null, null) == 0) { + throw Exception("failed to update fields for uri=$uri") + } + + val finalValues = ContentValues().apply { + put(MediaStore.MediaColumns.DISPLAY_NAME, newFile.name) + // scanning the new file will not automatically update `TITLE` + put(MediaStore.MediaColumns.TITLE, newFile.nameWithoutExtension) + put(MediaStore.MediaColumns.IS_PENDING, 0) + } + if (activity.contentResolver.update(uri, finalValues, null, null) == 0) { + throw Exception("failed to update fields for uri=$uri") + } + + // URI should not change + return scanNewPathByMediaStore(activity, newFile.path, mimeType) + } + + private suspend fun renameSingleByTreeDoc( + activity: Activity, + mimeType: String, + oldMediaUri: Uri, + oldPath: String, + newFile: File + ): FieldMap { + Log.d(LOG_TAG, "rename document at uri=$oldMediaUri path=$oldPath") + val df = StorageUtils.getDocumentFile(activity, oldPath, oldMediaUri) + df ?: throw Exception("failed to get document at path=$oldPath") + + val requestedName = newFile.name + val renamed = df.renameTo(newFile.name) + if (!renamed) { + throw Exception("failed to rename document at path=$oldPath") + } + val effectiveName = df.name + if (requestedName != effectiveName) { + Log.w(LOG_TAG, "requested renaming document at uri=$oldMediaUri path=$oldPath with name=${requestedName} but got name=$effectiveName") + } + val newPath = File(newFile.parentFile, df.name).path + + scanObsoletePath(activity, oldMediaUri, oldPath, mimeType) + return scanNewPathByMediaStore(activity, newPath, mimeType) + } + + private suspend fun renameSingleByFile( + activity: Activity, + mimeType: String, + oldMediaUri: Uri, + oldPath: String, + newFile: File + ): FieldMap { + Log.d(LOG_TAG, "rename file at path=$oldPath") + val renamed = File(oldPath).renameTo(newFile) + if (!renamed) { + throw Exception("failed to rename file at path=$oldPath") + } + scanObsoletePath(activity, oldMediaUri, oldPath, mimeType) + return scanNewPathByMediaStore(activity, newFile.path, mimeType) + } + + override fun scanPostMetadataEdit(context: Context, path: String, uri: Uri, mimeType: String, newFields: FieldMap, callback: ImageOpCallback) { + MediaScannerConnection.scanFile(context, arrayOf(path), arrayOf(mimeType)) { _, _ -> + val projection = arrayOf( + MediaStore.MediaColumns.DATE_MODIFIED, + MediaStore.MediaColumns.SIZE, + ) + try { + val cursor = context.contentResolver.query(uri, projection, null, null, null) + if (cursor != null && cursor.moveToFirst()) { + cursor.getColumnIndex(MediaStore.MediaColumns.DATE_MODIFIED).let { if (it != -1) newFields[EntryFields.DATE_MODIFIED_MILLIS] = cursor.getInt(it) * 1000 } + cursor.getColumnIndex(MediaStore.MediaColumns.SIZE).let { if (it != -1) newFields[EntryFields.SIZE_BYTES] = cursor.getLong(it) } + cursor.close() + } + } catch (e: Exception) { + callback.onFailure(e) + return@scanFile + } + getFileModifiedDateMillis(path)?.let { newFields[EntryFields.DATE_MODIFIED_MILLIS] = it } + callback.onSuccess(newFields) + } + } + + // try to fetch the modified date from the file, + // as it is more precise than the one from the Media Store + private fun getFileModifiedDateMillis(path: String?): Long? { + if (path != null) { + try { + return File(path).lastModified() + } catch (_: SecurityException) { + // ignore + } + } + return null + } + + private fun scanObsoletePath(context: Context, uri: Uri, path: String, mimeType: String) { + val file = File(path) + val delayMillis = 500L + val maxDelayMillis = 10000L + var totalDelayMillis = 0L + while (file.exists()) { + if (!hasEntry(context, uri)) return + if (totalDelayMillis < maxDelayMillis) { + Log.d(LOG_TAG, "Trying to scan obsolete path but file exists at path=$path. Will retry in $delayMillis ms (total: $totalDelayMillis ms)") + runBlocking { delay(delayMillis) } + totalDelayMillis += delayMillis + } else { + throw Exception("Timeout ($maxDelayMillis ms) to clear MediaStore entry for file at path=$path") + } + } + + if (hasEntry(context, uri)) { + MediaScannerConnection.scanFile(context, arrayOf(path), arrayOf(mimeType)) { _, newUri: Uri? -> + if (newUri != null && hasEntry(context, newUri)) { + Log.w(LOG_TAG, "Failed to clear Media Store entry at uri=$newUri path=$path") + } else { + Log.w(LOG_TAG, "Cleared Media Store entry at uri=$newUri path=$path") + } + } + } + } + + suspend fun scanNewPathByMediaStore(context: Context, path: String, mimeType: String): FieldMap = + suspendCancellableCoroutine { cont -> + tryScanNewPathByMediaStore( + context = context, + path = path, + mimeType = mimeType, + cont = cont, + ) + } + + private fun tryScanNewPathByMediaStore( + context: Context, + path: String, + mimeType: String, + cont: Continuation<FieldMap>, + iteration: Int = 0, + ) { + // `scanFile` may (e.g. when copying to SD card on Android 10 (API 29)): + // 1) yield no URI, + // 2) yield a temporary URI that fails when queried, + // 3) yield a temporary URI that succeeds when queried right away, but the Media Store actually won't have an entry for it until device reboot. + if (iteration > 5) { + // give up + cont.resumeWithException(Exception("failed to scan new path=$path after $iteration iterations")) + return + } else if (iteration > 0) { + // waiting and retrying just once usually works out for cases 1) and 2) + Thread.sleep(iteration * 100L) + } else if (iteration == 0 && Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + // waiting before the first scan usually works out for case 3) + StorageUtils.getVolumePath(context, path)?.let { volumePath -> + if (volumePath != StorageUtils.getPrimaryVolumePath(context)) { + Thread.sleep(100L) + } + } + } + + MediaScannerConnection.scanFile(context, arrayOf(path), arrayOf(mimeType)) { _, newUri: Uri? -> + fun scanUri(uri: Uri?): FieldMap? { + uri ?: return null + + // we retrieve updated fields as the renamed/moved file became a new entry in the Media Store + val projection = arrayOf( + MediaStore.MediaColumns.DATE_ADDED, + MediaStore.MediaColumns.DATE_MODIFIED, + ) + try { + val cursor = context.contentResolver.query(uri, projection, null, null, null) + if (cursor != null && cursor.moveToFirst()) { + val newFields = hashMapOf<String, Any?>( + EntryFields.ORIGIN to SourceEntry.ORIGIN_MEDIA_STORE_CONTENT, + EntryFields.URI to uri.toString(), + EntryFields.CONTENT_ID to uri.tryParseId(), + EntryFields.PATH to path, + ) + cursor.getColumnIndex(MediaStore.MediaColumns.DATE_ADDED).let { if (it != -1) newFields[EntryFields.DATE_ADDED_SECS] = cursor.getInt(it) } + cursor.getColumnIndex(MediaStore.MediaColumns.DATE_MODIFIED).let { if (it != -1) newFields[EntryFields.DATE_MODIFIED_MILLIS] = cursor.getInt(it) * 1000 } + cursor.close() + getFileModifiedDateMillis(path)?.let { newFields[EntryFields.DATE_MODIFIED_MILLIS] = it } + return newFields + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to scan uri=$uri", e) + } + return null + } + + if (newUri != null) { + var contentUri: Uri? = null + // `newURI` is possibly a file media URI (e.g. "content://media/12a9-8b42/file/62872") + // but we need an image/video media URI (e.g. "content://media/external/images/media/62872") + val contentId = newUri.tryParseId() + if (contentId != null) { + if (isImage(mimeType)) { + contentUri = ContentUris.withAppendedId(IMAGE_CONTENT_URI, contentId) + } else if (isVideo(mimeType)) { + contentUri = ContentUris.withAppendedId(VIDEO_CONTENT_URI, contentId) + } + } + + // prefer image/video content URI, fallback to original URI (possibly a file content URI) + val newFields = scanUri(contentUri) ?: scanUri(newUri) + + if (newFields != null) { + cont.resume(newFields) + return@scanFile + } + } + + tryScanNewPathByMediaStore(context, path = path, mimeType = mimeType, cont, iteration + 1) + } + } + + fun getContentUriForPath(context: Context, path: String): Uri? { + val projection = arrayOf(MediaStore.MediaColumns._ID) + val selection = "${MediaStore.MediaColumns.DATA} = ?" + val selectionArgs = arrayOf(path) + + fun check(context: Context, contentUri: Uri): Uri? { + var mediaContentUri: Uri? = null + try { + val cursor = context.contentResolver.query(contentUri, projection, selection, selectionArgs, null) + if (cursor != null && cursor.moveToFirst()) { + val idColumn = cursor.getColumnIndex(MediaStore.MediaColumns._ID) + if (idColumn != -1) { + val id = cursor.getLong(idColumn) + mediaContentUri = ContentUris.withAppendedId(contentUri, id) + } + cursor.close() + } + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to get URI for contentUri=$contentUri path=$path", e) + } + return mediaContentUri + } + return check(context, IMAGE_CONTENT_URI) ?: check(context, VIDEO_CONTENT_URI) + } + + companion object { + private val LOG_TAG = LogUtils.createTag<MediaStoreImageProvider>() + + private val IMAGE_CONTENT_URI = MediaStore.Images.Media.EXTERNAL_CONTENT_URI + private val VIDEO_CONTENT_URI = MediaStore.Video.Media.EXTERNAL_CONTENT_URI + + private val BASE_PROJECTION = arrayOf( + MediaStore.MediaColumns._ID, + MediaStore.MediaColumns.DATA, + MediaStore.MediaColumns.MIME_TYPE, + MediaStore.MediaColumns.SIZE, + MediaStore.MediaColumns.WIDTH, + MediaStore.MediaColumns.HEIGHT, + MediaStore.MediaColumns.DATE_ADDED, + MediaStore.MediaColumns.DATE_MODIFIED, + MediaColumns.DATE_TAKEN, + ) + + private val IMAGE_PROJECTION = arrayOf( + *BASE_PROJECTION, + MediaColumns.ORIENTATION, + ) + + private val VIDEO_PROJECTION = arrayOf( + *BASE_PROJECTION, + MediaColumns.DURATION, + // `ORIENTATION` was only available for images before Android 10 (API 29) + *if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) arrayOf( + MediaStore.MediaColumns.ORIENTATION, + ) else emptyArray() + ) + } +} + +object MediaColumns { + // `DATE_TAKEN`, `ORIENTATION`, `DURATION` used to be in `MediaStore.[Images,Video].Media` + // but were moved to `MediaStore.MediaColumns` for API 29 + // it is safe to use them because they are static strings that have not changed + + @SuppressLint("InlinedApi") + const val DATE_TAKEN = MediaStore.MediaColumns.DATE_TAKEN + + @SuppressLint("InlinedApi") + const val ORIENTATION = MediaStore.MediaColumns.ORIENTATION + + @SuppressLint("InlinedApi") + const val DURATION = MediaStore.MediaColumns.DURATION +} + +typealias NewEntryHandler = (entry: FieldMap) -> Unit + +private typealias NewEntryChecker = (contentId: Long, dateModifiedMillis: Long) -> Boolean \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/UnknownContentProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/UnknownContentProvider.kt new file mode 100644 index 0000000..db2b583 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/UnknownContentProvider.kt @@ -0,0 +1,85 @@ +package deckers.thibault.aves.model.provider + +import android.content.Context +import android.net.Uri +import android.provider.MediaStore +import android.provider.OpenableColumns +import android.util.Log +import deckers.thibault.aves.metadata.Metadata +import deckers.thibault.aves.metadata.metadataextractor.Helper +import deckers.thibault.aves.model.EntryFields +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.model.SourceEntry +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes +import deckers.thibault.aves.utils.StorageUtils + +open class UnknownContentProvider : ImageProvider() { + open val reliableProviderMimeType: Boolean + get() = false + + override fun fetchSingle(context: Context, uri: Uri, sourceMimeType: String?, allowUnsized: Boolean, callback: ImageOpCallback) { + var mimeType = sourceMimeType + if (sourceMimeType == null || !reliableProviderMimeType) { + // source MIME type may be incorrect, so we get a second opinion if possible + try { + val safeUri = Uri.fromFile(Metadata.createPreviewFile(context, uri)) + StorageUtils.openInputStream(context, safeUri)?.use { input -> + // `metadata-extractor` is the most reliable, except for `tiff` (false positives, false negatives) + // cf https://github.com/drewnoakes/metadata-extractor/issues/296 + Helper.readMimeType(input)?.takeIf { it != MimeTypes.TIFF }?.let { + if (it != sourceMimeType) { + Log.d(LOG_TAG, "source MIME type is $sourceMimeType but extracted MIME type is $it for uri=$uri") + mimeType = it + } + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get MIME type by metadata-extractor for uri=$uri", e) + } catch (e: NoClassDefFoundError) { + Log.w(LOG_TAG, "failed to get MIME type by metadata-extractor for uri=$uri", e) + } catch (e: AssertionError) { + Log.w(LOG_TAG, "failed to get MIME type by metadata-extractor for uri=$uri", e) + } + } + + val fields: FieldMap = hashMapOf( + EntryFields.ORIGIN to SourceEntry.ORIGIN_UNKNOWN_CONTENT, + EntryFields.URI to uri.toString(), + EntryFields.SOURCE_MIME_TYPE to mimeType, + ) + try { + // some providers do not provide the mandatory `OpenableColumns` + // and the query fails when compiling a projection specifying them + // e.g. `content://mms/part/[id]` on Android KitKat + val cursor = context.contentResolver.query(uri, null, null, null, null) + if (cursor != null && cursor.moveToFirst()) { + cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME).let { if (it != -1) fields[EntryFields.TITLE] = cursor.getString(it) } + cursor.getColumnIndex(OpenableColumns.SIZE).let { if (it != -1) fields[EntryFields.SIZE_BYTES] = cursor.getLong(it) } + cursor.getColumnIndex(MediaStore.MediaColumns.DATA).let { if (it != -1) fields[EntryFields.PATH] = cursor.getString(it) } + // mime type fallback if it was not provided and not found via `metadata-extractor` + cursor.getColumnIndex(MediaStore.MediaColumns.MIME_TYPE).let { if (it != -1 && mimeType == null) fields[EntryFields.SOURCE_MIME_TYPE] = cursor.getString(it) } + cursor.close() + } + } catch (e: Exception) { + callback.onFailure(Exception("Failed to query content, error=${e.message}")) + return + } + + if (fields[EntryFields.SOURCE_MIME_TYPE] == null) { + callback.onFailure(Exception("Failed to find MIME type for uri=$uri")) + return + } + + val entry = SourceEntry(fields).fillPreCatalogMetadata(context) + if (allowUnsized || entry.isSized || entry.isSvg || entry.isVideo) { + callback.onSuccess(entry.toMap()) + } else { + callback.onFailure(Exception("entry has no size")) + } + } + + companion object { + private val LOG_TAG = LogUtils.createTag<UnknownContentProvider>() + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt new file mode 100644 index 0000000..98bd26a --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt @@ -0,0 +1,301 @@ +package deckers.thibault.aves.utils + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.ColorSpace +import android.os.Build +import android.util.Half +import android.util.Log +import androidx.annotation.RequiresApi +import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.TransformationUtils +import deckers.thibault.aves.metadata.Metadata.getExifCode +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import java.io.ByteArrayOutputStream +import java.nio.ByteBuffer + +object BitmapUtils { + private val LOG_TAG = LogUtils.createTag<BitmapUtils>() + private const val INITIAL_BUFFER_SIZE = 1 shl 18 // 256kB + + private val freeBaos = ArrayList<ByteArrayOutputStream>() + private val mutex = Mutex() + + private const val INT_BYTE_SIZE = 4 + private const val MAX_2_BITS_FLOAT = 0x3.toFloat() + private const val MAX_8_BITS_FLOAT = 0xff.toFloat() + private const val MAX_10_BITS_FLOAT = 0x3ff.toFloat() + + private const val FORMAT_BYTE_ENCODED: Int = 0xCA + val FORMAT_BYTE_ENCODED_AS_BYTES: ByteArray = ByteArray(1) { _ -> FORMAT_BYTE_ENCODED.toByte() } + private const val FORMAT_BYTE_DECODED: Byte = 0xFE.toByte() + private const val RAW_BYTES_TRAILER_LENGTH = INT_BYTE_SIZE * 2 + 1 + + // bytes per pixel with different bitmap config + private const val BPP_ALPHA_8 = 1 + private const val BPP_RGB_565 = 2 + private const val BPP_ARGB_8888 = 4 + private const val BPP_RGBA_1010102 = 4 + private const val BPP_RGBA_F16 = 8 + + fun Bitmap.describe(): String { + return "{${ + arrayListOf( + "${width}x${height}", + "bytes=$byteCount", + "config=$config", + ).apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) add("cs=${colorSpace}") + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) add("hasGainmap=${hasGainmap()}") + }.joinToString(",") + }}" + } + + private fun getBytePerPixel(config: Bitmap.Config?): Int { + return when (config) { + Bitmap.Config.ALPHA_8 -> BPP_ALPHA_8 + Bitmap.Config.RGB_565 -> BPP_RGB_565 + Bitmap.Config.ARGB_8888 -> BPP_ARGB_8888 + else -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && config == Bitmap.Config.RGBA_F16) { + BPP_RGBA_F16 + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && config == Bitmap.Config.RGBA_1010102) { + BPP_RGBA_1010102 + } else { + // default + BPP_ARGB_8888 + } + } + } + } + + fun getExpectedImageSize(pixelCount: Long, config: Bitmap.Config?): Long { + return pixelCount * getBytePerPixel(config) + } + + suspend fun getBytes(bitmap: Bitmap?, recycle: Boolean, decoded: Boolean, mimeType: String?): ByteArray? { + return if (decoded) { + getRawBytes(bitmap, recycle = recycle) + } else { + getEncodedBytes(bitmap, canHaveAlpha = MimeTypes.canHaveAlpha(mimeType), recycle = recycle) + } + } + + private fun getRawBytes(bitmap: Bitmap?, recycle: Boolean): ByteArray? { + bitmap ?: return null + + val byteCount = bitmap.byteCount + val width = bitmap.width + val height = bitmap.height + val config = bitmap.config + val colorSpace = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) bitmap.colorSpace else null + + val byteBufferSize = byteCount + RAW_BYTES_TRAILER_LENGTH + if (!MemoryUtils.canAllocate(byteBufferSize)) { + throw Exception("bitmap buffer is $byteCount bytes, which cannot be allocated to a new byte array") + } + + try { + // `ByteBuffer` initial order is always `BIG_ENDIAN` + var bytes = ByteBuffer.allocate(byteBufferSize).apply { + bitmap.copyPixelsToBuffer(this) + }.array() + + // do not access bitmap after recycling + if (recycle) bitmap.recycle() + + // convert pixel format and color space, if necessary + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + colorSpace?.let { srcColorSpace -> + val dstColorSpace = ColorSpace.get(ColorSpace.Named.SRGB) + val connector = ColorSpace.connect(srcColorSpace, dstColorSpace) + if (config == Bitmap.Config.ARGB_8888) { + if (srcColorSpace != dstColorSpace) { + argb8888ToArgb8888(bytes, connector, end = byteCount) + } + } else if (config == Bitmap.Config.RGBA_F16) { + rgbaf16ToArgb8888(bytes, connector, end = byteCount) + val newConfigByteCount = byteCount / (BPP_RGBA_F16 / BPP_ARGB_8888) + bytes = bytes.sliceArray(0..<newConfigByteCount + RAW_BYTES_TRAILER_LENGTH) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && config == Bitmap.Config.RGBA_1010102) { + rgba1010102ToArgb8888(bytes, connector, end = byteCount) + } + } + } + + // append bitmap size for use by the caller to interpret the raw bytes + val trailerOffset = bytes.size - RAW_BYTES_TRAILER_LENGTH + bytes = ByteBuffer.wrap(bytes).apply { + position(trailerOffset) + putInt(width) + putInt(height) + // trailer byte to indicate whether the returned bytes are decoded/encoded + put(FORMAT_BYTE_DECODED) + }.array() + + return bytes + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to get bytes from bitmap", e) + } + return null + } + + private suspend fun getEncodedBytes(bitmap: Bitmap?, canHaveAlpha: Boolean = false, quality: Int = 100, recycle: Boolean): ByteArray? { + bitmap ?: return null + + val stream: ByteArrayOutputStream + mutex.withLock { + // this method is called a lot, so we try and reuse output streams + // to reduce inner array allocations, and make the GC run less frequently + stream = if (freeBaos.isNotEmpty()) { + freeBaos.removeAt(0) + } else { + ByteArrayOutputStream(INITIAL_BUFFER_SIZE) + } + } + try { + // `Bitmap.CompressFormat.PNG` is slower than `JPEG`, but it allows transparency + // the BMP format allows an alpha channel, but Android decoding seems to ignore it + if (canHaveAlpha && bitmap.hasAlpha()) { + bitmap.compress(Bitmap.CompressFormat.PNG, quality, stream) + } else { + bitmap.compress(Bitmap.CompressFormat.JPEG, quality, stream) + } + if (recycle) bitmap.recycle() + + // trailer byte to indicate whether the returned bytes are decoded/encoded + stream.write(FORMAT_BYTE_ENCODED) + + val bufferSize = stream.size() + if (!MemoryUtils.canAllocate(bufferSize)) { + throw Exception("bitmap compressed to $bufferSize bytes, which cannot be allocated to a new byte array") + } + + val byteArray = stream.toByteArray() + stream.reset() + mutex.withLock { + freeBaos.add(stream) + } + return byteArray + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to get bytes from bitmap", e) + } + return null + } + + // convert bytes, without reallocation: + // - from original color space to sRGB. + @RequiresApi(Build.VERSION_CODES.O) + private fun argb8888ToArgb8888(bytes: ByteArray, connector: ColorSpace.Connector, start: Int = 0, end: Int = bytes.size) { + // unpacking from ARGB_8888 and packing to ARGB_8888 + // stored as [3,2,1,0] -> [AAAAAAAA BBBBBBBB GGGGGGGG RRRRRRRR] + for (i in start..<end step BPP_ARGB_8888) { + // mask with `0xff` to yield values in [0, 255], instead of [-128, 127] + val iB = bytes[i + 2].toInt() and 0xff + val iG = bytes[i + 1].toInt() and 0xff + val iR = bytes[i].toInt() and 0xff + + // components as floats in sRGB + val srgbFloats = connector.transform(iR / MAX_8_BITS_FLOAT, iG / MAX_8_BITS_FLOAT, iB / MAX_8_BITS_FLOAT) + val srgbR = (srgbFloats[0] * 255.0f + 0.5f).toInt() + val srgbG = (srgbFloats[1] * 255.0f + 0.5f).toInt() + val srgbB = (srgbFloats[2] * 255.0f + 0.5f).toInt() + + // keep alpha as it is, in `bytes[i + 3]` + bytes[i + 2] = srgbB.toByte() + bytes[i + 1] = srgbG.toByte() + bytes[i] = srgbR.toByte() + } + } + + // convert bytes, without reallocation: + // - from config RGBA_F16 to ARGB_8888, + // - from original color space to sRGB. + @RequiresApi(Build.VERSION_CODES.O) + private fun rgbaf16ToArgb8888(bytes: ByteArray, connector: ColorSpace.Connector, start: Int = 0, end: Int = bytes.size) { + val indexDivider = BPP_RGBA_F16 / BPP_ARGB_8888 + for (i in start..<end step BPP_RGBA_F16) { + // unpacking from RGBA_F16 + // stored as [7,6,5,4,3,2,1,0] -> [AAAAAAAA AAAAAAAA BBBBBBBB BBBBBBBB GGGGGGGG GGGGGGGG RRRRRRRR RRRRRRRR] + val i7 = bytes[i + 7].toInt() + val i6 = bytes[i + 6].toInt() + val i5 = bytes[i + 5].toInt() + val i4 = bytes[i + 4].toInt() + val i3 = bytes[i + 3].toInt() + val i2 = bytes[i + 2].toInt() + val i1 = bytes[i + 1].toInt() + val i0 = bytes[i].toInt() + + val hA = Half((((i7 and 0xff) shl 8) or (i6 and 0xff)).toShort()) + val hB = Half((((i5 and 0xff) shl 8) or (i4 and 0xff)).toShort()) + val hG = Half((((i3 and 0xff) shl 8) or (i2 and 0xff)).toShort()) + val hR = Half((((i1 and 0xff) shl 8) or (i0 and 0xff)).toShort()) + + // components as floats in sRGB + val srgbFloats = connector.transform(hR.toFloat(), hG.toFloat(), hB.toFloat()) + val srgbR = (srgbFloats[0] * 255.0f + 0.5f).toInt() + val srgbG = (srgbFloats[1] * 255.0f + 0.5f).toInt() + val srgbB = (srgbFloats[2] * 255.0f + 0.5f).toInt() + val alpha = (hA.toFloat() * 255.0f + 0.5f).toInt() + + // packing to ARGB_8888 + // stored as [3,2,1,0] -> [AAAAAAAA BBBBBBBB GGGGGGGG RRRRRRRR] + val dstI = i / indexDivider + bytes[dstI + 3] = alpha.toByte() + bytes[dstI + 2] = srgbB.toByte() + bytes[dstI + 1] = srgbG.toByte() + bytes[dstI] = srgbR.toByte() + } + } + + // convert bytes, without reallocation: + // - from config RGBA_1010102 to ARGB_8888, + // - from original color space to sRGB. + @RequiresApi(Build.VERSION_CODES.O) + private fun rgba1010102ToArgb8888(bytes: ByteArray, connector: ColorSpace.Connector, start: Int = 0, end: Int = bytes.size) { + val alphaFactor = 255.0f / MAX_2_BITS_FLOAT + + for (i in start..<end step BPP_RGBA_1010102) { + // unpacking from RGBA_1010102 + // stored as [3,2,1,0] -> [AABBBBBB BBBBGGGG GGGGGGRR RRRRRRRR] + val i3 = bytes[i + 3].toInt() + val i2 = bytes[i + 2].toInt() + val i1 = bytes[i + 1].toInt() + val i0 = bytes[i].toInt() + + val iA = ((i3 and 0xc0) shr 6) + val iB = ((i3 and 0x3f) shl 4) or ((i2 and 0xf0) shr 4) + val iG = ((i2 and 0x0f) shl 6) or ((i1 and 0xfc) shr 2) + val iR = ((i1 and 0x03) shl 8) or ((i0 and 0xff) shr 0) + + // components as floats in sRGB + val srgbFloats = connector.transform(iR / MAX_10_BITS_FLOAT, iG / MAX_10_BITS_FLOAT, iB / MAX_10_BITS_FLOAT) + val srgbR = (srgbFloats[0] * 255.0f + 0.5f).toInt() + val srgbG = (srgbFloats[1] * 255.0f + 0.5f).toInt() + val srgbB = (srgbFloats[2] * 255.0f + 0.5f).toInt() + val alpha = (iA * alphaFactor + 0.5f).toInt() + + // packing to ARGB_8888 + // stored as [3,2,1,0] -> [AAAAAAAA BBBBBBBB GGGGGGGG RRRRRRRR] + bytes[i + 3] = alpha.toByte() + bytes[i + 2] = srgbB.toByte() + bytes[i + 1] = srgbG.toByte() + bytes[i] = srgbR.toByte() + } + } + + fun applyExifOrientation(context: Context, bitmap: Bitmap?, rotationDegrees: Int?, isFlipped: Boolean?): Bitmap? { + if (bitmap == null || rotationDegrees == null || isFlipped == null) return bitmap + if (rotationDegrees == 0 && !isFlipped) return bitmap + val exifOrientation = getExifCode(rotationDegrees, isFlipped) + return TransformationUtils.rotateImageExif(getBitmapPool(context), bitmap, exifOrientation) + } + + fun centerSquareCrop(context: Context, bitmap: Bitmap?, size: Int): Bitmap? { + bitmap ?: return null + return TransformationUtils.centerCrop(getBitmapPool(context), bitmap, size, size) + } + + fun getBitmapPool(context: Context) = Glide.get(context).bitmapPool +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/BmpWriter.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/BmpWriter.kt new file mode 100644 index 0000000..bfd9947 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/BmpWriter.kt @@ -0,0 +1,110 @@ +package deckers.thibault.aves.utils + +import android.graphics.Bitmap +import java.io.OutputStream +import java.nio.ByteBuffer + +object BmpWriter { + private const val FILE_HEADER_SIZE = 14 + private const val INFO_HEADER_SIZE = 40 + private const val BYTE_PER_PIXEL = 3 + private val pad = ByteArray(3) + + // file header + private val bfType = byteArrayOf('B'.code.toByte(), 'M'.code.toByte()) + private val bfReserved1 = intToWord(0) + private val bfReserved2 = intToWord(0) + private val bfOffBits = intToDWord(FILE_HEADER_SIZE + INFO_HEADER_SIZE) + + // info header + private val biSize = intToDWord(INFO_HEADER_SIZE) + private val biPlanes = intToWord(1) + private val biBitCount = intToWord(BYTE_PER_PIXEL * 8) + private val biCompression = intToDWord(0) + private val biXPelsPerMeter = intToDWord(0) + private val biYPelsPerMeter = intToDWord(0) + private val biClrUsed = intToDWord(0) + private val biClrImportant = intToDWord(0) + + // converts an int to a word (2-byte array) + private fun intToWord(v: Int): ByteArray { + val retValue = ByteArray(2) + retValue[0] = (v and 0xFF).toByte() + retValue[1] = (v shr 8 and 0xFF).toByte() + return retValue + } + + // converts an int to a double word (4-byte array) + private fun intToDWord(v: Int): ByteArray { + val retValue = ByteArray(4) + retValue[0] = (v and 0xFF).toByte() + retValue[1] = (v shr 8 and 0xFF).toByte() + retValue[2] = (v shr 16 and 0xFF).toByte() + retValue[3] = (v shr 24 and 0xFF).toByte() + return retValue + } + + fun writeRGB24( + bitmap: Bitmap, + outputStream: OutputStream + ) { + // init + val biWidth = bitmap.width + val biHeight = bitmap.height + val padPerRow = (4 - (biWidth * BYTE_PER_PIXEL) % 4) % 4 + val biSizeImage = (biWidth * BYTE_PER_PIXEL + padPerRow) * biHeight + val bfSize = FILE_HEADER_SIZE + INFO_HEADER_SIZE + biSizeImage + + var buffer = ByteBuffer.allocate(FILE_HEADER_SIZE + INFO_HEADER_SIZE) + + // file header + buffer.put(bfType) + buffer.put(intToDWord(bfSize)) + buffer.put(bfReserved1) + buffer.put(bfReserved2) + buffer.put(bfOffBits) + + // info header + buffer.put(biSize) + buffer.put(intToDWord(biWidth)) + buffer.put(intToDWord(biHeight)) + buffer.put(biPlanes) + buffer.put(biBitCount) + buffer.put(biCompression) + buffer.put(intToDWord(biSizeImage)) + buffer.put(biXPelsPerMeter) + buffer.put(biYPelsPerMeter) + buffer.put(biClrUsed) + buffer.put(biClrImportant) + + outputStream.write(buffer.array()) + + // pixels + buffer = ByteBuffer.allocate(biWidth * BYTE_PER_PIXEL + padPerRow) + val pixels = IntArray(biWidth) + val rgb = ByteArray(BYTE_PER_PIXEL) + var value: Int + var row = biHeight - 1 + while (row >= 0) { + bitmap.getPixels(pixels, 0, biWidth, 0, row, biWidth, 1) + + var column = 0 + while (column < biWidth) { + // non-premultiplied ARGB values in the sRGB color space + value = pixels[column] + // blue: [0], green: [1], red: [2] + rgb[0] = (value and 0xFF).toByte() + rgb[1] = (value shr 8 and 0xFF).toByte() + rgb[2] = (value shr 16 and 0xFF).toByte() + buffer.put(rgb) + column++ + } + if (padPerRow > 0) { + buffer.put(pad, 0, padPerRow) + } + outputStream.write(buffer.array()) + buffer.clear() + row-- + } + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/ByteUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/ByteUtils.kt new file mode 100644 index 0000000..a0e1e83 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/ByteUtils.kt @@ -0,0 +1,15 @@ +package deckers.thibault.aves.utils + +import java.nio.ByteBuffer + +fun ByteBuffer.toByteArray(): ByteArray { + val bytes = ByteArray(remaining()) + get(bytes, 0, bytes.size) + return bytes +} + +fun Int.toHex(): String = "0x${byteArrayOf(shr(8).toByte(), toByte()).toHex()}" + +fun ByteArray.toHex(): String = joinToString(separator = "") { it.toHex() } + +fun Byte.toHex(): String = "%02x".format(this) \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/CollectionUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/CollectionUtils.kt new file mode 100644 index 0000000..22a2385 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/CollectionUtils.kt @@ -0,0 +1,25 @@ +package deckers.thibault.aves.utils + +// Boyer-Moore algorithm for pattern searching +// Returns: an index of the first occurrence of the pattern or -1 if none is found. +fun ByteArray.indexOfBytes(pattern: ByteArray, start: Int = 0): Int { + val n: Int = this.size + val m: Int = pattern.size + val badChar = Array(256) { 0 } + var i = 0 + while (i < m) { + badChar[pattern[i].toUByte().toInt()] = i + i += 1 + } + var j: Int = m - 1 + var s = start + while (s <= (n - m)) { + while (j >= 0 && pattern[j] == this[s + j]) { + j -= 1 + } + if (j < 0) return s + s += Integer.max(1, j - badChar[this[s + j].toUByte().toInt()]) + j = m - 1 + } + return -1 +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/Compat.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/Compat.kt new file mode 100644 index 0000000..eea1b08 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/Compat.kt @@ -0,0 +1,84 @@ +package deckers.thibault.aves.utils + +import android.app.Activity +import android.content.Intent +import android.content.pm.ApplicationInfo +import android.content.pm.PackageManager +import android.content.pm.ResolveInfo +import android.graphics.BitmapRegionDecoder +import android.location.Address +import android.location.Geocoder +import android.os.Build +import android.os.Parcelable +import android.view.Display +import java.io.IOException +import java.io.InputStream + +inline fun <reified T> Intent.getParcelableExtraCompat(name: String): T? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getParcelableExtra(name, T::class.java) + } else { + @Suppress("deprecation") + getParcelableExtra<Parcelable>(name) as? T + } +} + +fun Activity.getDisplayCompat(): Display? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + display + } else { + @Suppress("deprecation") + windowManager.defaultDisplay + } +} + +fun PackageManager.getApplicationInfoCompat(packageName: String, flags: Int): ApplicationInfo { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getApplicationInfo(packageName, PackageManager.ApplicationInfoFlags.of(flags.toLong())) + } else { + getApplicationInfo(packageName, flags) + } +} + +fun PackageManager.queryIntentActivitiesCompat(intent: Intent, flags: Int): List<ResolveInfo> { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + queryIntentActivities(intent, PackageManager.ResolveInfoFlags.of(flags.toLong())) + } else { + queryIntentActivities(intent, flags) + } +} + +fun Geocoder.getFromLocationCompat( + latitude: Double, + longitude: Double, + maxResults: Int, + processAddresses: (addresses: List<Address>) -> Unit, + onError: (errorCode: String, errorMessage: String?, errorDetails: Any?) -> Unit, +) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + Compat33.geocoderGetFromLocation(this, latitude, longitude, maxResults, processAddresses, onError) + } else { + try { + @Suppress("deprecation") + val addresses = getFromLocation(latitude, longitude, maxResults) ?: ArrayList() + processAddresses(addresses) + } catch (e: IOException) { + // `grpc failed`, etc. + onError("getAddress-network", "failed to get address because of network issues", e.message) + } catch (e: Exception) { + onError("getAddress-exception", "failed to get address", e.message) + } + } +} + +object BitmapRegionDecoderCompat { + @Throws(IOException::class) + fun newInstance(input: InputStream): BitmapRegionDecoder? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + BitmapRegionDecoder.newInstance(input) + } else { + @Suppress("deprecation") + BitmapRegionDecoder.newInstance(input, false) + } + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/Compat33.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/Compat33.kt new file mode 100644 index 0000000..5377732 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/Compat33.kt @@ -0,0 +1,30 @@ +package deckers.thibault.aves.utils + +import android.location.Address +import android.location.Geocoder +import android.os.Build +import androidx.annotation.RequiresApi + +/** + * Compatibility layer in a separate object to avoid class loading issues on older Android versions. + * e.g. `ClassNotFoundException` for `android.location.Geocoder$GeocodeListener` + */ +@RequiresApi(Build.VERSION_CODES.TIRAMISU) +object Compat33 { + fun geocoderGetFromLocation( + geocoder: Geocoder, + latitude: Double, + longitude: Double, + maxResults: Int, + processAddresses: (addresses: List<Address>) -> Unit, + onError: (errorCode: String, errorMessage: String?, errorDetails: Any?) -> Unit, + ) { + geocoder.getFromLocation(latitude, longitude, maxResults, object : Geocoder.GeocodeListener { + override fun onGeocode(addresses: List<Address?>) = processAddresses(addresses.filterNotNull()) + + override fun onError(errorMessage: String?) { + onError("getAddress-asyncerror", "failed to get address", errorMessage) + } + }) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/ContextUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/ContextUtils.kt new file mode 100644 index 0000000..7a0b937 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/ContextUtils.kt @@ -0,0 +1,61 @@ +package deckers.thibault.aves.utils + +import android.content.ContentResolver +import android.content.ContentUris +import android.content.Context +import android.database.Cursor +import android.net.Uri +import android.provider.MediaStore +import android.util.Log +import deckers.thibault.aves.utils.UriUtils.tryParseId + +object ContextUtils { + private val LOG_TAG = LogUtils.createTag<ContextUtils>() + + fun Context.devicePixelRatio(): Float = resources.displayMetrics.density + + fun Context.resourceUri(resourceId: Int): Uri = with(resources) { + Uri.Builder() + .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) + .authority(getResourcePackageName(resourceId)) + .appendPath(getResourceTypeName(resourceId)) + .appendPath(getResourceEntryName(resourceId)) + .build() + } + + fun Context.queryContentPropValue(uri: Uri, mimeType: String, column: String): Any? { + var contentUri: Uri = uri + if (StorageUtils.isMediaStoreContentUri(uri)) { + uri.tryParseId()?.let { id -> + contentUri = when { + MimeTypes.isImage(mimeType) -> ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id) + MimeTypes.isVideo(mimeType) -> ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id) + else -> uri + } + contentUri = StorageUtils.getOriginalUri(this, contentUri) + } + } + + var value: Any? = null + try { + val cursor = contentResolver.query(contentUri, arrayOf(column), null, null, null) + if (cursor == null || !cursor.moveToFirst()) { + Log.w(LOG_TAG, "failed to get cursor for contentUri=$contentUri column=$column") + } else { + value = when (cursor.getType(0)) { + Cursor.FIELD_TYPE_NULL -> null + Cursor.FIELD_TYPE_INTEGER -> cursor.getLong(0) + Cursor.FIELD_TYPE_FLOAT -> cursor.getFloat(0) + Cursor.FIELD_TYPE_STRING -> cursor.getString(0) + Cursor.FIELD_TYPE_BLOB -> cursor.getBlob(0) + else -> null + } + cursor.close() + } + } catch (e: Exception) { + // throws SQLiteException/IllegalArgumentException when the requested prop is not a known column + Log.w(LOG_TAG, "failed to get value for contentUri=$contentUri column=$column", e) + } + return value + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/ExceptionUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/ExceptionUtils.kt new file mode 100644 index 0000000..f164c97 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/ExceptionUtils.kt @@ -0,0 +1,10 @@ +package deckers.thibault.aves.utils + +inline fun <reified T : Throwable> Exception.anyCauseIs(): Boolean { + var cause: Throwable? = this + while (cause != null) { + if (cause is T) return true + cause = cause.cause + } + return false +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/FileUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/FileUtils.kt new file mode 100644 index 0000000..6b8a37e --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/FileUtils.kt @@ -0,0 +1,45 @@ +package deckers.thibault.aves.utils + +import android.os.Build +import java.io.File +import java.io.InputStream +import java.io.OutputStream +import java.nio.channels.Channels +import java.nio.channels.FileChannel +import java.nio.file.StandardOpenOption + +object FileUtils { + fun File.transferFrom(inputStream: InputStream?, streamLength: Long?) { + inputStream ?: return + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && streamLength != null) { + FileChannel.open(toPath(), StandardOpenOption.WRITE).use { fileOutput -> + Channels.newChannel(inputStream).use { input -> + fileOutput.transferFrom(input, 0, streamLength) + } + } + } else { + outputStream().use { fileOutput -> + inputStream.use { input -> + input.copyTo(fileOutput) + } + } + } + } + + fun File.transferTo(outputStream: OutputStream) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + FileChannel.open(toPath()).use { fileInput -> + Channels.newChannel(outputStream).use { output -> + fileInput.transferTo(0, fileInput.size(), output) + } + } + } else { + inputStream().use { fileInput -> + outputStream.use { output -> + fileInput.copyTo(output) + } + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/FlutterUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/FlutterUtils.kt new file mode 100644 index 0000000..97ab620 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/FlutterUtils.kt @@ -0,0 +1,72 @@ +package deckers.thibault.aves.utils + +import android.content.Context +import android.os.Handler +import android.os.Looper +import android.util.Log +import io.flutter.FlutterInjector +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.embedding.engine.dart.DartExecutor +import io.flutter.embedding.engine.loader.FlutterLoader +import io.flutter.view.FlutterCallbackInformation +import kotlinx.coroutines.suspendCancellableCoroutine +import kotlin.coroutines.Continuation +import kotlin.coroutines.resume + +object FlutterUtils { + private val LOG_TAG = LogUtils.createTag<FlutterUtils>() + + suspend fun initFlutterEngine( + context: Context, + sharedPreferencesKey: String, + callbackHandleKey: String, + engineSetter: (engine: FlutterEngine) -> Unit, + ) { + val callbackHandle = context.getSharedPreferences(sharedPreferencesKey, Context.MODE_PRIVATE).getLong(callbackHandleKey, 0) + if (callbackHandle == 0L) { + Log.e(LOG_TAG, "failed to retrieve registered callback handle for sharedPreferencesKey=$sharedPreferencesKey callbackHandleKey=$callbackHandleKey") + return + } + + lateinit var flutterLoader: FlutterLoader + runOnUiThread { + // initialization must happen on the main thread + flutterLoader = FlutterInjector.instance().flutterLoader().apply { + startInitialization(context) + ensureInitializationComplete(context, null) + } + } + + val callbackInfo = FlutterCallbackInformation.lookupCallbackInformation(callbackHandle) + if (callbackInfo == null) { + Log.e(LOG_TAG, "failed to find callback information for sharedPreferencesKey=$sharedPreferencesKey callbackHandleKey=$callbackHandleKey") + return + } + + val args = DartExecutor.DartCallback( + context.assets, + flutterLoader.findAppBundlePath(), + callbackInfo + ) + runOnUiThread { + val engine = FlutterEngine(context).apply { + dartExecutor.executeDartCallback(args) + } + engineSetter(engine) + } + } + + suspend fun runOnUiThread(r: Runnable) { + val mainLooper = Looper.getMainLooper() + if (Looper.myLooper() != mainLooper) { + suspendCancellableCoroutine { cont: Continuation<Boolean> -> + Handler(mainLooper).post { + r.run() + cont.resume(true) + } + } + } else { + r.run() + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/HashUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/HashUtils.kt new file mode 100644 index 0000000..c90e317 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/HashUtils.kt @@ -0,0 +1,35 @@ +package deckers.thibault.aves.utils + +import java.io.InputStream +import java.math.BigInteger +import java.security.MessageDigest + +object HashUtils { + fun getHash(input: InputStream, algorithmKey: String): String { + val algorithm = toMessageDigestAlgorithm(algorithmKey) + val digest = MessageDigest.getInstance(algorithm) + val buffer = ByteArray(1 shl 14) + var read: Int + while ((input.read(buffer).also { read = it }) > 0) { + digest.update(buffer, 0, read) + } + val md5sum = digest.digest() + val output = BigInteger(1, md5sum).toString(16) + + return when (algorithm) { + "MD5" -> output.padStart(32, '0') // 128 bits = 32 hex digits + "SHA-1" -> output.padStart(40, '0') // 160 bits = 40 hex digits + "SHA-256" -> output.padStart(64, '0') // 256 bits = 64 hex digits + else -> throw IllegalArgumentException("unsupported hash algorithm: $algorithmKey") + } + } + + private fun toMessageDigestAlgorithm(algorithmKey: String): String { + return when (algorithmKey) { + "md5" -> "MD5" + "sha1" -> "SHA-1" + "sha256" -> "SHA-256" + else -> throw IllegalArgumentException("unsupported hash algorithm: $algorithmKey") + } + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/LogUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/LogUtils.kt new file mode 100644 index 0000000..e7fb5f7 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/LogUtils.kt @@ -0,0 +1,26 @@ +package deckers.thibault.aves.utils + +object LogUtils { + const val LOG_TAG_MAX_LENGTH = 23 + + val LOG_TAG_PACKAGE_PATTERN = Regex("(\\w)(\\w*)\\.") + val LOWER_CASE_PATTERN = Regex("[a-z]") + + // create an Android logger friendly log tag for the specified class + inline fun <reified T> createTag(): String { + val kClass = T::class + // shorten class name to "a.b.CccDdd" + var logTag = LOG_TAG_PACKAGE_PATTERN.replace(kClass.qualifiedName!!, "$1.") + if (logTag.length > LOG_TAG_MAX_LENGTH) { + // shorten class name to "a.b.CD" + val simpleName = kClass.simpleName!! + val shortSimpleName = simpleName.replace(LOWER_CASE_PATTERN, "") + logTag = logTag.replace(simpleName, shortSimpleName) + if (logTag.length > LOG_TAG_MAX_LENGTH) { + // shorten class name to "CD" + logTag = shortSimpleName + } + } + return logTag + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MathUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MathUtils.kt new file mode 100644 index 0000000..7002c07 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MathUtils.kt @@ -0,0 +1,9 @@ +package deckers.thibault.aves.utils + +import kotlin.math.log2 +import kotlin.math.pow + +object MathUtils { + fun highestPowerOf2(x: Int): Int = highestPowerOf2(x.toDouble()) + fun highestPowerOf2(x: Double): Int = if (x < 1) 0 else 2.toDouble().pow(log2(x).toInt()).toInt() +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MemoryUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MemoryUtils.kt new file mode 100644 index 0000000..fc91e2d --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MemoryUtils.kt @@ -0,0 +1,19 @@ +package deckers.thibault.aves.utils + +import android.util.Log + +object MemoryUtils { + private val LOG_TAG = LogUtils.createTag<MemoryUtils>() + + fun canAllocate(byteSize: Number?): Boolean { + byteSize ?: return true + val availableHeapSize = getAvailableHeapSize() + val danger = byteSize.toLong() > availableHeapSize + if (danger) { + Log.e(LOG_TAG, "trying to handle $byteSize bytes, with only $availableHeapSize free bytes") + } + return !danger + } + + fun getAvailableHeapSize() = Runtime.getRuntime().let { it.maxMemory() - (it.totalMemory() - it.freeMemory()) } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt new file mode 100644 index 0000000..2e20362 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt @@ -0,0 +1,192 @@ +package deckers.thibault.aves.utils + +import android.webkit.MimeTypeMap +import deckers.thibault.aves.glide.MultiPageImage +import androidx.exifinterface.media.ExifInterfaceFork as ExifInterface + +object MimeTypes { + const val ANY = "*/*" + + // generic raster + private const val AVIF = "image/avif" + const val BMP = "image/bmp" + private const val DJVU = "image/vnd.djvu" + const val GIF = "image/gif" + const val HEIC = "image/heic" + const val HEIF = "image/heif" + private const val ICO = "image/x-icon" + const val JPEG = "image/jpeg" + const val PNG = "image/png" + const val PSD_VND = "image/vnd.adobe.photoshop" + const val PSD_X = "image/x-photoshop" + const val TIFF = "image/tiff" + private const val WBMP = "image/vnd.wap.wbmp" + const val WEBP = "image/webp" + + // raw raster + private const val ARW = "image/x-sony-arw" + private const val CR2 = "image/x-canon-cr2" + private const val CRW = "image/x-canon-crw" + private const val DCR = "image/x-kodak-dcr" + const val DNG = "image/dng" + const val DNG_ADOBE = "image/x-adobe-dng" + private const val ERF = "image/x-epson-erf" + private const val K25 = "image/x-kodak-k25" + private const val KDC = "image/x-kodak-kdc" + private const val MRW = "image/x-minolta-mrw" + private const val NEF = "image/x-nikon-nef" + private const val NRW = "image/x-nikon-nrw" + private const val ORF = "image/x-olympus-orf" + private const val PEF = "image/x-pentax-pef" + private const val RAF = "image/x-fuji-raf" + private const val RAW = "image/x-panasonic-raw" + private const val RW2 = "image/x-panasonic-rw2" + private const val SR2 = "image/x-sony-sr2" + private const val SRF = "image/x-sony-srf" + private const val SRW = "image/x-samsung-srw" + private const val X3F = "image/x-sigma-x3f" + + // vector + const val SVG = "image/svg+xml" + + // video + private const val AVI = "video/avi" + private const val AVI_VND = "video/vnd.avi" + const val DVD = "video/dvd" + private const val MKV = "video/x-matroska" + const val MOV = "video/quicktime" + private const val MP2T = "video/mp2t" + private const val MP2TS = "video/mp2ts" + const val MP4 = "video/mp4" + private const val OGV = "video/ogg" + private const val WEBM = "video/webm" + + // others + const val ZIP = "application/zip" + + fun isImage(mimeType: String?) = mimeType != null && mimeType.startsWith("image") + + fun isVideo(mimeType: String?) = mimeType != null && mimeType.startsWith("video") + + // assume that `HEIF` is a `HEIC` (using the default `HEVC` codec) + fun isHeic(mimeType: String?) = mimeType == HEIC || mimeType == HEIF + + // `AVIF` and `HEIC` both derive from `HEIF`, which derives from `ISOBMFF`. + // `MP4` also derives from `ISOBMFF` but is not an image format. + fun isIsoBMFFImage(mimeType: String?) = mimeType == AVIF || isHeic(mimeType) + + fun isRaw(mimeType: String): Boolean { + return when (mimeType) { + ARW, CR2, CRW, DCR, DNG, DNG_ADOBE, ERF, K25, KDC, MRW, NEF, NRW, ORF, PEF, RAF, RAW, RW2, SR2, SRF, SRW, X3F -> true + else -> false + } + } + + // returns whether the specified MIME type represents + // a raster image format that allows an alpha channel + fun canHaveAlpha(mimeType: String?) = when (mimeType) { + AVIF, BMP, GIF, ICO, PNG, SVG, TIFF, WEBP -> true + else -> false + } + + // as of Flutter v3.16.4, with additional custom handling for SVG in Dart + fun handleEncodedBytesInFlutter(mimeType: String) = when (mimeType) { + JPEG, PNG, GIF, WEBP, BMP, WBMP, ICO, SVG -> true + else -> false + } + + // as of `metadata-extractor` v2.14.0 + fun canReadWithMetadataExtractor(mimeType: String?) = when (mimeType) { + DJVU, SVG, WBMP -> false + MKV, MP2T, MP2TS, OGV, WEBM -> false + else -> true + } + + // as of `ExifInterface` v1.4.2, method `isSupportedMimeType` reports no support for AVIF, + // but documentation reports: + // * Supported for reading: JPEG, PNG, WebP, HEIC, DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW, RAF, AVIF (on API 31+). + // * Supported for writing: JPEG, PNG, WebP. + fun canReadWithExifInterface(mimeType: String, strict: Boolean = true): Boolean { + if (!strict) return true + return ExifInterface.isSupportedMimeType(mimeType) || mimeType == AVIF + } + + // as of latest PixyMeta + fun canReadWithPixyMeta(mimeType: String) = when (mimeType) { + JPEG, TIFF, PNG, GIF, BMP -> true + else -> false + } + + fun canEditExif(mimeType: String) = when (mimeType) { + // as of androidx.exifinterface:exifinterface:1.3.4 + JPEG, PNG, WEBP -> true + else -> false + } + + fun canEditIptc(mimeType: String) = when (mimeType) { + // as of latest PixyMeta + JPEG, TIFF -> true + else -> false + } + + fun canEditXmp(mimeType: String) = when (mimeType) { + // as of latest PixyMeta + JPEG, TIFF, PNG, GIF -> true + // using `mp4parser` + MP4 -> true + else -> false + } + + fun canRemoveMetadata(mimeType: String) = when (mimeType) { + // as of latest PixyMeta + JPEG, TIFF -> true + else -> false + } + + // Glide automatically applies EXIF orientation when decoding images of known formats + // but we need to rotate the decoded bitmap for the other formats + // maybe related to ExifInterface version used by Glide: + // https://github.com/bumptech/glide/blob/master/gradle.properties#L21 + fun needRotationAfterGlide(mimeType: String, pageId: Int?): Boolean { + return if (pageId != null && MultiPageImage.isSupported(mimeType)) { + true + } else when (mimeType) { + AVIF, HEIC, HEIF, PNG, TIFF, WEBP -> true + else -> isRaw(mimeType) + } + } + + // Thumbnails obtained from the Media Store are automatically rotated + // according to EXIF orientation when decoding images of known formats + // but we need to rotate the decoded bitmap for the other formats + fun needRotationAfterContentResolverThumbnail(mimeType: String) = when (mimeType) { + DNG, DNG_ADOBE, PNG -> true + else -> false + } + + // extensions + + // among other refs: + // - https://android.googlesource.com/platform/external/mime-support/+/refs/heads/master/mime.types + fun extensionFor(mimeType: String, defaultExtension: String?): String = when (mimeType) { + AVI, AVI_VND -> ".avi" + DNG, DNG_ADOBE -> ".dng" + HEIC, HEIF -> ".heif" + MP2T, MP2TS -> ".m2ts" + PSD_VND, PSD_X -> ".psd" + else -> { + val ext = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType) ?: defaultExtension + if (ext != null) { + // fallback to provided extension when available, + // typically the original file extension when moving/renaming + if (ext.startsWith(".")) ext else ".$ext" + } else { + // fallback to generic extensions, + // as incorrect file extensions are better than none for media detection + if (isVideo(mimeType)) ".mp4" else ".jpg" + } + } + } + + val TIFF_EXTENSION_PATTERN = Regex(".*\\.tiff?", RegexOption.IGNORE_CASE) +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/PermissionManager.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/PermissionManager.kt new file mode 100644 index 0000000..a5a2352 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/PermissionManager.kt @@ -0,0 +1,243 @@ +package deckers.thibault.aves.utils + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Binder +import android.os.Build +import android.os.Environment +import android.provider.DocumentsContract +import android.provider.MediaStore +import android.util.Log +import androidx.annotation.RequiresApi +import deckers.thibault.aves.MainActivity +import deckers.thibault.aves.PendingStorageAccessResultHandler +import deckers.thibault.aves.model.FieldMap +import deckers.thibault.aves.utils.StorageUtils.PathSegments +import java.io.File +import java.util.Locale +import java.util.concurrent.CompletableFuture + +object PermissionManager { + private val LOG_TAG = LogUtils.createTag<PermissionManager>() + + private val MEDIA_STORE_INSERTION_PRIMARY_DIRS = listOf( + Environment.DIRECTORY_DCIM, + Environment.DIRECTORY_DOWNLOADS, + Environment.DIRECTORY_PICTURES, + ) + + fun requestDirectoryAccess(activity: Activity, path: String, onGranted: (uri: Uri) -> Unit, onDenied: () -> Unit) { + Log.i(LOG_TAG, "request user to select and grant access permission to path=$path") + + // `StorageVolume.createOpenDocumentTreeIntent` is an alternative, + // and it helps with initial volume, but not with initial directory + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + // initial URI should not be a `tree document URI`, but a simple `document URI` + StorageUtils.convertDirPathToDocumentUri(activity, path)?.let { + intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, it) + } + } + + if (intent.resolveActivity(activity.packageManager) != null) { + MainActivity.pendingStorageAccessResultHandlers[MainActivity.DOCUMENT_TREE_ACCESS_REQUEST] = PendingStorageAccessResultHandler(path, onGranted, onDenied) + activity.startActivityForResult(intent, MainActivity.DOCUMENT_TREE_ACCESS_REQUEST) + } else { + MainActivity.notifyError("failed to resolve activity for intent=$intent extras=${intent.extras}") + onDenied() + } + } + + @RequiresApi(Build.VERSION_CODES.R) + fun requestMediaFileAccess(activity: Activity, uris: List<Uri>, mimeTypes: List<String>): Boolean { + val safeUris = uris.mapIndexed { index, uri -> StorageUtils.getMediaStoreScopedStorageSafeUri(uri, mimeTypes[index]) } + + val todoUris = ArrayList<Uri>() + val pid = Binder.getCallingPid() + val uid = Binder.getCallingUid() + val flags = Intent.FLAG_GRANT_WRITE_URI_PERMISSION + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + activity.checkUriPermissions(safeUris, pid, uid, flags) + } else { + safeUris.map { activity.checkUriPermission(it, pid, uid, flags) }.toIntArray() + }.forEachIndexed { index, permission -> + if (permission != PackageManager.PERMISSION_GRANTED) { + todoUris.add(safeUris[index]) + } + } + if (todoUris.isEmpty()) return true + + Log.i(LOG_TAG, "request user to select and grant access permission to uris=$todoUris") + val intentSender = MediaStore.createWriteRequest(activity.contentResolver, safeUris).intentSender + MainActivity.pendingScopedStoragePermissionCompleter = CompletableFuture<Boolean>() + activity.startIntentSenderForResult(intentSender, MainActivity.MEDIA_WRITE_BULK_PERMISSION_REQUEST, null, 0, 0, 0, null) + val granted = MainActivity.pendingScopedStoragePermissionCompleter!!.join() + MainActivity.pendingScopedStoragePermissionCompleter = null + + return granted + } + + fun getGrantedDirForPath(context: Context, anyPath: String): String? { + return getAccessibleDirs(context).firstOrNull { anyPath.startsWith(it) } + } + + fun getInaccessibleDirectories(context: Context, dirPaths: List<String>): List<Map<String, String>> { + val concreteDirPaths = dirPaths.filter { it != StorageUtils.TRASH_PATH_PLACEHOLDER } + val accessibleDirs = getAccessibleDirs(context) + val restrictedPrimaryDirectoriesLower = getRestrictedPrimaryDirectories().map { it.lowercase(Locale.ROOT) } + + // find set of inaccessible directories for each volume + val dirsPerVolume = HashMap<String, MutableSet<String>>() + for (dirPath in concreteDirPaths.map { if (it.endsWith(File.separator)) it else it + File.separator }) { + if (accessibleDirs.none { dirPath.startsWith(it) }) { + // inaccessible dirs + val segments = PathSegments(context, dirPath) + segments.volumePath?.let { volumePath -> + val dirSet = dirsPerVolume[volumePath] ?: HashSet() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + // request primary directory on volume from Android 11 (API 30) + val relativeDir = segments.relativeDir + if (relativeDir != null) { + val dirSegments = relativeDir.split(File.separator).takeWhile { it.isNotEmpty() } + val primaryDir = dirSegments.firstOrNull() + if (dirSegments.size > 1 && restrictedPrimaryDirectoriesLower.contains(primaryDir?.lowercase(Locale.ROOT))) { + // request secondary directory (if any) for restricted primary directory + val dir = dirSegments.take(2).joinToString(File.separator) + // only register directories that exist on storage, so they can be selected for access grant + if (File(volumePath, dir).exists()) { + dirSet.add(dir) + } + } else { + primaryDir?.let { dirSet.add(it) } + } + } else { + // the requested path is the volume root itself + // which cannot be granted, due to Android 11 restrictions + dirSet.add("") + } + } else { + // request volume root until Android 10 (API 29) + dirSet.add("") + } + dirsPerVolume[volumePath] = dirSet + } + } + } + + // format for easier handling on Flutter + return ArrayList<Map<String, String>>().apply { + addAll(dirsPerVolume.flatMap { (volumePath, relativeDirs) -> + relativeDirs.map { relativeDir -> + hashMapOf( + "volumePath" to volumePath, + "relativeDir" to relativeDir, + ) + } + }) + } + } + + fun canInsertByMediaStore(directories: List<FieldMap>): Boolean { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val insertionDirsLower = MEDIA_STORE_INSERTION_PRIMARY_DIRS.map { it.lowercase(Locale.ROOT) } + directories.all { + val relativeDir = it["relativeDir"] as String + val segments = relativeDir.split(File.separator) + segments.isNotEmpty() && insertionDirsLower.contains(segments.first().lowercase(Locale.ROOT)) + } + } else { + true + } + } + + fun revokeDirectoryAccess(context: Context, path: String): Boolean { + return StorageUtils.convertDirPathToTreeDocumentUri(context, path)?.let { + releaseUriPermission(context, it) + true + } ?: false + } + + // returns paths matching directory URIs granted by the user + fun getGrantedDirs(context: Context): Set<String> { + val grantedDirs = HashSet<String>() + for (uriPermission in context.contentResolver.persistedUriPermissions) { + val dirPath = StorageUtils.convertTreeDocumentUriToDirPath(context, uriPermission.uri) + dirPath?.let { grantedDirs.add(it) } + } + return grantedDirs + } + + // returns paths accessible to the app (granted by the user or by default) + private fun getAccessibleDirs(context: Context): Set<String> { + val accessibleDirs = HashSet(getGrantedDirs(context)) + accessibleDirs.addAll(context.getExternalFilesDirs(null).filterNotNull().map { it.path }) + + // from API 21 / Android 5.0 / Lollipop, removable storage requires access permission, but directory access grant is possible + // from API 30 / Android 11 / R, any storage requires access permission + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) { + accessibleDirs.add(StorageUtils.getPrimaryVolumePath(context)) + } + return accessibleDirs + } + + private fun getRestrictedPrimaryDirectories(): List<String> { + val dirs = ArrayList<String>() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + // cf https://developer.android.com/about/versions/11/privacy/storage#directory-access + dirs.add(Environment.DIRECTORY_DOWNLOADS) + // depends on device, no documentation + dirs.add("Android") + } + return dirs + } + + // cf https://developer.android.com/about/versions/11/privacy/storage#directory-access + fun getRestrictedDirectories(context: Context): List<Map<String, String>> { + val dirs = ArrayList<Map<String, String>>() + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val volumePaths = StorageUtils.getVolumePaths(context) + dirs.addAll(volumePaths.map { + hashMapOf( + "volumePath" to it, + "relativeDir" to "", + ) + }) + for (relativeDir in getRestrictedPrimaryDirectories()) { + dirs.addAll(volumePaths.map { + hashMapOf( + "volumePath" to it, + "relativeDir" to relativeDir, + ) + }) + } + } + return dirs + } + + // As of Android 11, `MediaStore.getDocumentUri` fails if any of the persisted + // URI permissions we hold points to a folder that no longer exists, + // so we should remove these obsolete URIs before proceeding. + fun sanitizePersistedUriPermissions(context: Context) { + try { + for (uriPermission in context.contentResolver.persistedUriPermissions) { + val uri = uriPermission.uri + val path = StorageUtils.convertTreeDocumentUriToDirPath(context, uri) + if (path == null || !File(path).exists()) { + Log.d(LOG_TAG, "revoke URI permission for obsolete uri=$uri path=$path") + releaseUriPermission(context, uri) + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to sanitize persisted URI permissions", e) + } + } + + private fun releaseUriPermission(context: Context, it: Uri) { + val flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + context.contentResolver.releasePersistableUriPermission(it, flags) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/StorageUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/StorageUtils.kt new file mode 100644 index 0000000..3460895 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/StorageUtils.kt @@ -0,0 +1,747 @@ +package deckers.thibault.aves.utils + +import android.Manifest +import android.content.ContentResolver +import android.content.ContentUris +import android.content.Context +import android.content.pm.PackageManager +import android.media.MediaMetadataRetriever +import android.net.Uri +import android.os.Build +import android.os.ParcelFileDescriptor +import android.os.storage.StorageManager +import android.provider.DocumentsContract +import android.provider.MediaStore +import android.text.TextUtils +import android.util.Log +import androidx.core.net.toUri +import androidx.core.text.isDigitsOnly +import com.commonsware.cwac.document.DocumentFileCompat +import deckers.thibault.aves.model.provider.ImageProvider +import deckers.thibault.aves.utils.FileUtils.transferFrom +import deckers.thibault.aves.utils.MimeTypes.isImage +import deckers.thibault.aves.utils.MimeTypes.isVideo +import deckers.thibault.aves.utils.PermissionManager.getGrantedDirForPath +import deckers.thibault.aves.utils.UriUtils.tryParseId +import java.io.File +import java.io.FileInputStream +import java.io.IOException +import java.io.InputStream +import java.io.OutputStream +import java.util.Locale +import java.util.regex.Pattern + +object StorageUtils { + private val LOG_TAG = LogUtils.createTag<StorageUtils>() + + private const val SCHEME_CONTENT = ContentResolver.SCHEME_CONTENT + + // cf DocumentsContract.EXTERNAL_STORAGE_PROVIDER_AUTHORITY + private const val EXTERNAL_STORAGE_PROVIDER_AUTHORITY = "com.android.externalstorage.documents" + + // cf DocumentsContract.EXTERNAL_STORAGE_PRIMARY_EMULATED_ROOT_ID + private const val EXTERNAL_STORAGE_PRIMARY_EMULATED_ROOT_ID = "primary" + + private const val TREE_URI_ROOT = "$SCHEME_CONTENT://$EXTERNAL_STORAGE_PROVIDER_AUTHORITY/tree/" + + private val MEDIA_STORE_VOLUME_EXTERNAL = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) MediaStore.VOLUME_EXTERNAL else "external" + + // TODO TLAD get it from `MediaStore.Images.Media.EXTERNAL_CONTENT_URI`? + private val IMAGE_PATH_ROOT = "/$MEDIA_STORE_VOLUME_EXTERNAL/images/" + + // TODO TLAD get it from `MediaStore.Video.Media.EXTERNAL_CONTENT_URI`? + private val VIDEO_PATH_ROOT = "/$MEDIA_STORE_VOLUME_EXTERNAL/video/" + + private val UUID_PATTERN = Regex("[A-Fa-f\\d-]+") + private val TREE_URI_PATH_PATTERN = Pattern.compile("(.*?):(.*)") + + const val TRASH_PATH_PLACEHOLDER = "#trash" + + // whether the provided path is on one of this app specific directories: + // - /storage/{volume}/Android/data/{package_name}/files + // - /data/user/0/{package_name}/files + private fun isAppFile(context: Context, path: String): Boolean { + val dirs = listOf( + *context.getExternalFilesDirs(null).filterNotNull().toTypedArray(), + context.filesDir, + ) + return dirs.any { path.startsWith(it.path) } + } + + private fun appExternalFilesDirFor(context: Context, path: String): File? { + val dirs = context.getExternalFilesDirs(null).filterNotNull() + val volumePath = getVolumePath(context, path) + return volumePath?.let { dirs.firstOrNull { it.startsWith(volumePath) } } ?: dirs.firstOrNull() + } + + fun trashDirFor(context: Context, path: String): File? { + val externalFilesDir = appExternalFilesDirFor(context, path) + if (externalFilesDir == null) { + Log.e(LOG_TAG, "failed to find external files dir for path=$path") + return null + } + val trashDir = File(externalFilesDir, "trash") + trashDir.mkdirs() + if (!trashDir.exists()) { + Log.e(LOG_TAG, "failed to create directories at path=$trashDir") + return null + } + return trashDir + } + + fun getVaultRoot(context: Context) = ensureTrailingSeparator(File(context.filesDir, "vault").path) + + fun isInVault(context: Context, path: String) = path.startsWith(getVaultRoot(context)) + + /** + * Volume paths + */ + + // volume paths, with trailing "/" + private var mStorageVolumePaths: Array<String>? = null + + // primary volume path, with trailing "/" + private var mPrimaryVolumePath: String? = null + + fun getPrimaryVolumePath(context: Context): String { + if (mPrimaryVolumePath == null) { + mPrimaryVolumePath = findPrimaryVolumePath(context) + } + return mPrimaryVolumePath!! + } + + fun getVolumePaths(context: Context): Array<String> { + if (mStorageVolumePaths == null || mStorageVolumePaths!!.isEmpty()) { + mStorageVolumePaths = findVolumePaths(context) + } + return mStorageVolumePaths!! + } + + fun getVolumePath(context: Context, anyPath: String): String? { + return getVolumePaths(context).firstOrNull { anyPath.startsWith(it) } + } + + private fun getPathStepIterator(context: Context, anyPath: String, root: String?): Iterator<String?>? { + val rootLength = (root ?: getVolumePath(context, anyPath))?.length ?: return null + + var fileName: String? = null + var relativePath: String? = null + val lastSeparatorIndex = anyPath.lastIndexOf(File.separator) + 1 + if (lastSeparatorIndex > rootLength) { + fileName = anyPath.substring(lastSeparatorIndex) + relativePath = anyPath.substring(rootLength, lastSeparatorIndex) + } + relativePath ?: return null + + val pathSteps = relativePath.split(File.separator).filter { it.isNotEmpty() }.toMutableList() + if (fileName?.isNotEmpty() == true) { + pathSteps.add(fileName) + } + return pathSteps.iterator() + } + + private fun appSpecificVolumePath(file: File?): String? { + file ?: return null + val appSpecificPath = file.absolutePath + val relativePathStartIndex = appSpecificPath.indexOf("Android/data") + if (relativePathStartIndex < 0) return null + return appSpecificPath.take(relativePathStartIndex) + } + + private fun findPrimaryVolumePath(context: Context): String? { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val sm = context.getSystemService(Context.STORAGE_SERVICE) as? StorageManager + val path = sm?.primaryStorageVolume?.directory?.path + if (path != null) { + return ensureTrailingSeparator(path) + } + } + + // fallback + try { + // we want: + // /storage/emulated/0/ + // `Environment.getExternalStorageDirectory()` (deprecated) yields: + // /storage/emulated/0 + // `context.getExternalFilesDir(null)` yields: + // /storage/emulated/0/Android/data/{package_name}/files + return appSpecificVolumePath(context.getExternalFilesDir(null)) + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to find primary volume path", e) + } + return null + } + + private fun findVolumePaths(context: Context): Array<String> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val sm = context.getSystemService(Context.STORAGE_SERVICE) as? StorageManager + val paths = sm?.storageVolumes?.mapNotNull { it.directory?.path } + if (paths != null) { + return paths.map(::ensureTrailingSeparator).toTypedArray() + } + } + + // fallback + val paths = HashSet<String>() + try { + // Primary emulated SD-CARD + val rawEmulatedStorageTarget = System.getenv("EMULATED_STORAGE_TARGET") ?: "" + if (TextUtils.isEmpty(rawEmulatedStorageTarget)) { + // fix of empty raw emulated storage on marshmallow + lateinit var files: List<File> + var validFiles: Boolean + val retryInterval = 100L + val maxDelay = 1000L + var totalDelay = 0L + do { + // `getExternalFilesDirs` sometimes include `null` when called right after getting read access + // (e.g. on API 30 emulator) so we retry until the file system is ready. + // It can also include `null` when there is a faulty SD card. + val externalFilesDirs = context.getExternalFilesDirs(null) + validFiles = !externalFilesDirs.contains(null) + if (validFiles) { + files = externalFilesDirs.filterNotNull() + } else { + Log.d(LOG_TAG, "External files dirs contain `null`. Retrying...") + totalDelay += retryInterval + try { + Thread.sleep(retryInterval) + } catch (e: InterruptedException) { + Log.e(LOG_TAG, "insomnia", e) + } + } + } while (!validFiles && totalDelay < maxDelay) + paths.addAll(files.mapNotNull(::appSpecificVolumePath)) + } else { + // Device has emulated storage; external storage paths should have userId burned into them. + // /storage/emulated/[0,1,2,...]/ + val path = getPrimaryVolumePath(context) + val rawUserId = path.split(File.separator).lastOrNull(String::isNotEmpty)?.takeIf { it.isDigitsOnly() } ?: "" + if (rawUserId.isEmpty()) { + paths.add(rawEmulatedStorageTarget) + } else { + paths.add(rawEmulatedStorageTarget + File.separator + rawUserId) + } + } + + // All Secondary SD-CARDs (all exclude primary) separated by ":" + System.getenv("SECONDARY_STORAGE")?.let { secondaryStorages -> + paths.addAll(secondaryStorages.split(File.pathSeparator).filter { it.isNotEmpty() }) + } + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to find volume paths", e) + } + + return paths.map { ensureTrailingSeparator(it) }.toTypedArray() + } + + /** + * Volume tree URIs + */ + + // e.g. + // /storage/emulated/0/ -> primary + // /storage/10F9-3F13/Pictures/ -> 10F9-3F13 + // /storage/extSdCard/ -> 1234-5678 [Android 5.1.1, Samsung Galaxy Core Prime] + private fun getVolumeUuidForDocumentUri(context: Context, anyPath: String): String? { + val sm = context.getSystemService(Context.STORAGE_SERVICE) as? StorageManager + sm?.getStorageVolume(File(anyPath))?.let { volume -> + if (volume.isPrimary) { + return EXTERNAL_STORAGE_PRIMARY_EMULATED_ROOT_ID + } + volume.uuid?.let { uuid -> + return uuid.uppercase(Locale.ROOT) + } + } + + // fallback for <N + getVolumePath(context, anyPath)?.let { volumePath -> + if (volumePath == getPrimaryVolumePath(context)) { + return EXTERNAL_STORAGE_PRIMARY_EMULATED_ROOT_ID + } + volumePath.split(File.separator).lastOrNull { it.isNotEmpty() }?.let { uuid -> + if (uuid.matches(UUID_PATTERN)) { + return uuid.uppercase(Locale.ROOT) + } + } + + // fallback when UUID does not appear in the SD card volume path + context.contentResolver.persistedUriPermissions.firstOrNull { uriPermission -> + convertTreeDocumentUriToDirPath(context, uriPermission.uri)?.let { + getVolumePath(context, it)?.let { grantedVolumePath -> + grantedVolumePath == volumePath + } + } ?: false + }?.let { uriPermission -> + splitTreeDocumentUri(uriPermission.uri)?.let { (uuid, _) -> + return uuid + } + } + } + + Log.e(LOG_TAG, "failed to find volume UUID for anyPath=$anyPath") + return null + } + + // e.g. + // primary -> /storage/emulated/0/ + // 10F9-3F13 -> /storage/10F9-3F13/ + // 1234-5678 -> /storage/extSdCard/ [Android 5.1.1, Samsung Galaxy Core Prime] + private fun getVolumePathFromTreeDocumentUriUuid(context: Context, uuid: String): String? { + if (uuid == EXTERNAL_STORAGE_PRIMARY_EMULATED_ROOT_ID) { + return getPrimaryVolumePath(context) + } + + val sm = context.getSystemService(Context.STORAGE_SERVICE) as? StorageManager + if (sm != null) { + for (volumePath in getVolumePaths(context)) { + try { + val volume = sm.getStorageVolume(File(volumePath)) + if (volume != null && uuid.equals(volume.uuid, ignoreCase = true)) { + return volumePath + } + } catch (_: Exception) { + // ignore + } + } + } + + // fallback for <N + for (volumePath in getVolumePaths(context)) { + val volumeUuid = volumePath.split(File.separator).lastOrNull { it.isNotEmpty() } + if (uuid.equals(volumeUuid, ignoreCase = true)) { + return volumePath + } + } + + // fallback when UUID does not appear in the SD card volume path + val primaryVolumePath = getPrimaryVolumePath(context) + getVolumePaths(context).firstOrNull { volumePath -> + if (volumePath == primaryVolumePath) { + false + } else { + // exclude volumes that use regular naming scheme with UUID in them + // to prevent returning path with the UUID of a new volume + // when the argument is the UUID of an obsolete volume + val volumeUuid = volumePath.split(File.separator).lastOrNull { it.isNotEmpty() } + !(volumeUuid == null || volumeUuid.matches(UUID_PATTERN)) + } + }?.let { return it } + + Log.e(LOG_TAG, "failed to find volume path for UUID=$uuid") + return null + } + + // e.g. + // /storage/emulated/0/ -> content://com.android.externalstorage.documents/tree/primary%3A + // /storage/10F9-3F13/Pictures/ -> content://com.android.externalstorage.documents/tree/10F9-3F13%3APictures + fun convertDirPathToTreeDocumentUri(context: Context, dirPath: String): Uri? { + val uuid = getVolumeUuidForDocumentUri(context, dirPath) + if (uuid != null) { + val relativeDir = removeTrailingSeparator(PathSegments(context, dirPath).relativeDir ?: "") + return DocumentsContract.buildTreeDocumentUri(EXTERNAL_STORAGE_PROVIDER_AUTHORITY, "$uuid:$relativeDir") + } + Log.e(LOG_TAG, "failed to convert dirPath=$dirPath to tree document URI") + return null + } + + // e.g. + // /storage/emulated/0/ -> content://com.android.externalstorage.documents/document/primary%3A + // /storage/10F9-3F13/Pictures/ -> content://com.android.externalstorage.documents/document/10F9-3F13%3APictures + fun convertDirPathToDocumentUri(context: Context, dirPath: String): Uri? { + val uuid = getVolumeUuidForDocumentUri(context, dirPath) + if (uuid != null) { + val relativeDir = removeTrailingSeparator(PathSegments(context, dirPath).relativeDir ?: "") + return DocumentsContract.buildDocumentUri(EXTERNAL_STORAGE_PROVIDER_AUTHORITY, "$uuid:$relativeDir") + } + Log.e(LOG_TAG, "failed to convert dirPath=$dirPath to document URI") + return null + } + + // e.g. + // content://com.android.externalstorage.documents/tree/primary%3A -> ("primary", "") + // content://com.android.externalstorage.documents/tree/10F9-3F13%3APictures -> ("10F9-3F13", "Pictures") + private fun splitTreeDocumentUri(treeDocumentUri: Uri): Pair<String, String>? { + val treeDocumentUriString = treeDocumentUri.toString() + if (treeDocumentUriString.length <= TREE_URI_ROOT.length) return null + val encoded = treeDocumentUriString.substring(TREE_URI_ROOT.length) + val matcher = TREE_URI_PATH_PATTERN.matcher(Uri.decode(encoded)) + with(matcher) { + if (find()) { + val uuid = group(1) + val relativePath = group(2) + if (uuid != null && relativePath != null) { + return Pair(uuid, relativePath) + } + } + } + Log.e(LOG_TAG, "failed to split treeDocumentUri=$treeDocumentUri to UUID and relative path") + return null + } + + // e.g. + // content://com.android.externalstorage.documents/tree/primary%3A -> /storage/emulated/0/ + // content://com.android.externalstorage.documents/tree/10F9-3F13%3APictures -> /storage/10F9-3F13/Pictures/ + fun convertTreeDocumentUriToDirPath(context: Context, treeDocumentUri: Uri): String? { + splitTreeDocumentUri(treeDocumentUri)?.let { (uuid, relativePath) -> + val volumePath = getVolumePathFromTreeDocumentUriUuid(context, uuid) + if (volumePath != null) { + return ensureTrailingSeparator(volumePath + relativePath) + } + } + Log.e(LOG_TAG, "failed to convert treeDocumentUri=$treeDocumentUri to path") + return null + } + + /** + * Document files + */ + + fun getDocumentFile(context: Context, anyPath: String, mediaUri: Uri): DocumentFileCompat? { + try { + if (requireAccessPermission(context, anyPath)) { + // need a document URI (not a media content URI) to open a `DocumentFile` output stream + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && isMediaStoreContentUri(mediaUri)) { + // cleanest API to get it + PermissionManager.sanitizePersistedUriPermissions(context) + try { + val docUri = MediaStore.getDocumentUri(context, mediaUri) + if (docUri != null) { + return DocumentFileCompat.fromSingleUri(context, docUri) + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get document URI for mediaUri=$mediaUri", e) + } + } + + // fallback for older APIs + val df = getVolumePath(context, anyPath)?.let { convertDirPathToTreeDocumentUri(context, it) }?.let { getDocumentFileFromVolumeTree(context, it, anyPath) } + if (df != null) return df + + // try to strip user info, if any + if (mediaUri.userInfo != null) { + val genericMediaUri = stripMediaUriUserInfo(mediaUri) + Log.d(LOG_TAG, "retry getDocumentFile for mediaUri=$mediaUri without userInfo: $genericMediaUri") + return getDocumentFile(context, anyPath, genericMediaUri) + } + } + // good old `File` + return DocumentFileCompat.fromFile(File(anyPath)) + } catch (e: SecurityException) { + Log.w(LOG_TAG, "failed to get document file from mediaUri=$mediaUri", e) + } + return null + } + + // returns the directory `DocumentFile` (from tree URI when scoped storage is required, `File` otherwise) + // returns null if directory does not exist and could not be created + fun createDirectoryDocIfAbsent(context: Context, dirPath: String): DocumentFileCompat? { + try { + val targetDirPath = ensureTrailingSeparator(dirPath) + return if (requireAccessPermission(context, targetDirPath)) { + val grantedDir = getGrantedDirForPath(context, targetDirPath) ?: return null + val rootTreeDocumentUri = convertDirPathToTreeDocumentUri(context, grantedDir) ?: return null + var parentFile: DocumentFileCompat? = DocumentFileCompat.fromTreeUri(context, rootTreeDocumentUri) ?: return null + val pathIterator = getPathStepIterator(context, targetDirPath, grantedDir) + var currentDirPath = ensureTrailingSeparator(grantedDir) + while (pathIterator?.hasNext() == true) { + val dirName = pathIterator.next() + var treeDocFile = findDocumentFileIgnoreCase(parentFile, dirName) + currentDirPath = ensureTrailingSeparator(currentDirPath + dirName) + + if (treeDocFile == null && File(currentDirPath).exists()) { + // `DocumentsProvider` may be temporarily buggy and fail to list children directories. + // Better to fail fast and revoke directory access, so that the user is aware + // of the issue when trying again with `ACTION_OPEN_DOCUMENT_TREE`. + // Otherwise, we would try to recreate the existing (but unlisted) directory, + // and the document provider will create a new one with a "(1)" suffix. + Log.e(LOG_TAG, "failed to get document file for existing path=$currentDirPath from granted dir=$grantedDir. Revoking granted dir...") + PermissionManager.revokeDirectoryAccess(context, grantedDir) + throw Exception("failed to get document file for existing path=$currentDirPath from grantedDir=$grantedDir") + } + + if (treeDocFile == null || !treeDocFile.exists()) { + treeDocFile = parentFile?.createDirectory(dirName) + if (treeDocFile == null) { + Log.e(LOG_TAG, "failed to create directory with name=$dirName from parent=$parentFile") + return null + } + } + parentFile = treeDocFile + } + parentFile + } else { + val directory = File(targetDirPath) + directory.mkdirs() + if (!directory.exists()) { + Log.e(LOG_TAG, "failed to create directories at path=$targetDirPath") + return null + } + DocumentFileCompat.fromFile(directory) + } + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to create directory at path=$dirPath", e) + return null + } + } + + private fun getDocumentFileFromVolumeTree(context: Context, rootTreeDocumentUri: Uri, anyPath: String): DocumentFileCompat? { + var documentFile: DocumentFileCompat? = DocumentFileCompat.fromTreeUri(context, rootTreeDocumentUri) ?: return null + + // follow the entry path down the document tree + val pathIterator = getPathStepIterator(context, anyPath, null) + while (pathIterator?.hasNext() == true) { + documentFile = findDocumentFileIgnoreCase(documentFile, pathIterator.next()) ?: return null + } + return documentFile + } + + // variation on `DocumentFileCompat.findFile()` to allow case insensitive search + private fun findDocumentFileIgnoreCase(documentFile: DocumentFileCompat?, displayName: String?): DocumentFileCompat? { + documentFile ?: return null + for (doc in documentFile.listFiles()) { + if (displayName.equals(doc.name, ignoreCase = true)) { + return doc + } + } + return null + } + + /** + * Misc + */ + + fun canEditByFile(context: Context, path: String) = !requireAccessPermission(context, path) + + fun requireAccessPermission(context: Context, anyPath: String): Boolean { + if (isAppFile(context, anyPath)) return false + + // on Android 11, we should always require access permission, even on primary volume + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) return true + + val onPrimaryVolume = anyPath.startsWith(getPrimaryVolumePath(context)) + return !onPrimaryVolume + } + + fun isMediaStoreContentUri(uri: Uri?): Boolean { + uri ?: return false + // a URI's authority is [userinfo@]host[:port] + // but we only want the host when comparing to Media Store's "authority" + return SCHEME_CONTENT.equals(uri.scheme, ignoreCase = true) && MediaStore.AUTHORITY.equals(uri.host, ignoreCase = true) + } + + fun getOriginalUri(context: Context, uri: Uri): Uri { + // we get a permission denial if we require original from a provider other than the media store + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && isMediaStoreContentUri(uri)) { + val path = uri.path + path ?: return uri + // from Android 11 (API 30), accessing the original URI for a `file` or `downloads` media content yields a `SecurityException` + if (path.startsWith(IMAGE_PATH_ROOT) || path.startsWith(VIDEO_PATH_ROOT)) { + // "Caller must hold ACCESS_MEDIA_LOCATION permission to access original" + if (context.checkSelfPermission(Manifest.permission.ACCESS_MEDIA_LOCATION) == PackageManager.PERMISSION_GRANTED) { + return MediaStore.setRequireOriginal(uri) + } + } + } + return uri + } + + // As of Glide v4.12.0, a special loader `QMediaStoreUriLoader` is automatically used + // to work around a bug from Android 10 (API 29) where metadata redaction corrupts HEIC images. + // This loader relies on `MediaStore.setRequireOriginal` but this yields a `SecurityException` + // for some non image/video content URIs (e.g. `downloads`, `file`) + fun getGlideSafeUri(context: Context, uri: Uri, mimeType: String, sizeBytes: Long? = null): Uri { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && isMediaStoreContentUri(uri)) { + val uriPath = uri.path + when { + uriPath?.contains("/downloads/") == true -> { + // e.g. `content://media/external_primary/downloads/...` + getMediaUriImageVideoUri(uri, mimeType)?.let { imageVideoUri -> return imageVideoUri } + } + + uriPath?.contains("/file/") == true -> { + // e.g. `content://media/external/file/...` + // create an ad-hoc temporary file for decoding only + createTempFile(context).apply { + try { + transferFrom(openInputStream(context, uri), sizeBytes) + return Uri.fromFile(this) + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to create temporary file from uri=$uri", e) + } + } + } + + uri.userInfo != null -> return stripMediaUriUserInfo(uri) + } + } + return uri + } + + // requesting access or writing to some MediaStore content URIs + // yields an exception with `All requested items must be referenced by specific ID` + fun getMediaStoreScopedStorageSafeUri(uri: Uri, mimeType: String): Uri { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && isMediaStoreContentUri(uri)) { + val uriPath = uri.path + when { + uriPath?.contains("/downloads/") == true -> { + // e.g. `content://media/external_primary/downloads/...` + getMediaUriImageVideoUri(uri, mimeType)?.let { imageVideoUri -> return imageVideoUri } + } + + uri.userInfo != null -> return stripMediaUriUserInfo(uri) + } + } + return uri + } + + // Build a typical `images` or `video` content URI from the original content ID. + // We cannot safely apply this to a `file` content URI, as it may point to a file not indexed + // by the Media Store (via `.nomedia`), and therefore has no matching image/video content URI. + private fun getMediaUriImageVideoUri(uri: Uri, mimeType: String): Uri? { + return uri.tryParseId()?.let { id -> + return when { + isImage(mimeType) -> ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id) + isVideo(mimeType) -> ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id) + else -> uri + } + } + } + + // strip user info, if any + // e.g. `content://0@media/...` + private fun stripMediaUriUserInfo(uri: Uri) = uri.toString().replaceFirst("${uri.userInfo}@", "").toUri() + + fun openInputStream(context: Context, uri: Uri): InputStream? { + val effectiveUri = getOriginalUri(context, uri) + return try { + return when (uri.scheme) { + ContentResolver.SCHEME_FILE -> FileInputStream(uri.path) + else -> context.contentResolver.openInputStream(effectiveUri) + } + } catch (e: Exception) { + // among various other exceptions, + // opening a file marked pending and owned by another package throws an `IllegalStateException` + Log.w(LOG_TAG, "failed to open input stream from effectiveUri=$effectiveUri for uri=$uri", e) + null + } + } + + fun openOutputStream(context: Context, mimeType: String, uri: Uri, mode: String): OutputStream? { + val effectiveUri = getMediaStoreScopedStorageSafeUri(uri, mimeType) + return try { + context.contentResolver.openOutputStream(effectiveUri, mode) + } catch (e: Exception) { + // among various other exceptions, + // opening a file marked pending and owned by another package throws an `IllegalStateException` + Log.w(LOG_TAG, "failed to open output stream from effectiveUri=$effectiveUri for uri=$uri mode=$mode", e) + null + } + } + + fun openInputFileDescriptor(context: Context, uri: Uri): ParcelFileDescriptor? { + val effectiveUri = getOriginalUri(context, uri) + return try { + context.contentResolver.openFileDescriptor(effectiveUri, "r") + } catch (e: Exception) { + // among various other exceptions, + // opening a file marked pending and owned by another package throws an `IllegalStateException` + Log.w(LOG_TAG, "failed to open input file descriptor from effectiveUri=$effectiveUri for uri=$uri", e) + throw FileDescriptorException("failed to open input file descriptor from effectiveUri=$effectiveUri for uri=$uri", e) + } + } + + fun openOutputFileDescriptor(context: Context, mimeType: String, uri: Uri, path: String, mode: String): ParcelFileDescriptor? { + val effectiveUri = if (ImageProvider.isMediaUriPermissionGranted(context, uri, mimeType)) { + getMediaStoreScopedStorageSafeUri(uri, mimeType) + } else { + getDocumentFile(context, path, uri)?.uri ?: throw Exception("failed to get document file for path=$path, uri=$uri") + } + return try { + context.contentResolver.openFileDescriptor(effectiveUri, mode) + } catch (e: Exception) { + // among various other exceptions, + // opening a file marked pending and owned by another package throws an `IllegalStateException` + Log.w(LOG_TAG, "failed to open output file descriptor from effectiveUri=$effectiveUri for uri=$uri path=$path", e) + null + } + } + + fun openMetadataRetriever(context: Context, uri: Uri): MediaMetadataRetriever? { + val effectiveUri = getOriginalUri(context, uri) + return try { + MediaMetadataRetriever().apply { + // on Android 12 preview, setting the data source works but yields an internal IOException + // (`Input file descriptor already original`), whether we provide the original URI or not + setDataSource(context, effectiveUri) + } + } catch (_: Exception) { + // unsupported format + Log.w(LOG_TAG, "failed to initialize MediaMetadataRetriever for uri=$uri effectiveUri=$effectiveUri") + null + } + } + + private fun getTempDirectory(context: Context): File = File(context.cacheDir, "temp") + + fun createTempFile(context: Context, extension: String? = null): File { + val directory = getTempDirectory(context) + directory.mkdirs() + if (!directory.exists()) { + throw IOException("failed to create directories at path=$directory") + } + val tempFile = File.createTempFile("aves", extension, directory) + // `deleteOnExit` is unreliable, but it does not hurt + tempFile.deleteOnExit() + return tempFile + } + + fun deleteTempDirectory(context: Context): Boolean { + val directory = getTempDirectory(context) + if (!directory.exists()) return false + return directory.deleteRecursively() + } + + // convenience methods + + fun getFolderSize(f: File): Long { + var size: Long = 0 + if (f.isDirectory) { + for (file in f.listFiles()!!) { + size += getFolderSize(file) + } + } else { + size = f.length() + } + return size + } + + fun ensureTrailingSeparator(dirPath: String): String { + return if (dirPath.endsWith(File.separator)) dirPath else dirPath + File.separator + } + + fun removeTrailingSeparator(dirPath: String): String { + return if (dirPath.endsWith(File.separator)) dirPath.dropLast(1) else dirPath + } + + // `fullPath` should match "volumePath + relativeDir + fileName" + class PathSegments(context: Context, fullPath: String) { + var volumePath: String? = null // `volumePath` with trailing "/" + var relativeDir: String? = null // `relativeDir` with trailing "/" + private var fileName: String? = null // null for directories + + init { + volumePath = getVolumePath(context, fullPath) + if (volumePath != null) { + val lastSeparatorIndex = fullPath.lastIndexOf(File.separator) + 1 + val volumePathLength = volumePath!!.length + if (lastSeparatorIndex > volumePathLength) { + fileName = fullPath.substring(lastSeparatorIndex) + relativeDir = fullPath.substring(volumePathLength, lastSeparatorIndex) + } + } + } + } +} + +class FileDescriptorException(message: String, cause: Throwable? = null) : IOException(message, cause) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/UriUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/UriUtils.kt new file mode 100644 index 0000000..070728c --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/UriUtils.kt @@ -0,0 +1,18 @@ +package deckers.thibault.aves.utils + +import android.content.ContentUris +import android.net.Uri +import android.util.Log + +object UriUtils { + private val LOG_TAG = LogUtils.createTag<UriUtils>() + + fun Uri.tryParseId(): Long? { + try { + return ContentUris.parseId(this) + } catch (_: Exception) { + Log.w(LOG_TAG, "failed to parse ID from contentUri=$this") + } + return null + } +} \ No newline at end of file diff --git a/android/app/src/main/res/drawable-nodpi/banner.png b/android/app/src/main/res/drawable-nodpi/banner.png new file mode 100644 index 0000000..ac4ec59 Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/banner.png differ diff --git a/android/app/src/main/res/drawable-v26/ic_shortcut_collection_foreground.xml b/android/app/src/main/res/drawable-v26/ic_shortcut_collection_foreground.xml new file mode 100644 index 0000000..13e0900 --- /dev/null +++ b/android/app/src/main/res/drawable-v26/ic_shortcut_collection_foreground.xml @@ -0,0 +1,16 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="108dp" + android:height="108dp" + android:tint="@color/ic_shortcut_foreground" + android:viewportWidth="108" + android:viewportHeight="108"> + <group + android:scaleX="1.7226" + android:scaleY="1.7226" + android:translateX="33.3288" + android:translateY="33.3288"> + <path + android:fillColor="@android:color/white" + android:pathData="M20,4v12L8,16L8,4h12m0,-2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM11.5,11.67l1.69,2.26 2.48,-3.1L19,15L9,15zM2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6L2,6z" /> + </group> +</vector> diff --git a/android/app/src/main/res/drawable-v26/ic_shortcut_movie_foreground.xml b/android/app/src/main/res/drawable-v26/ic_shortcut_movie_foreground.xml new file mode 100644 index 0000000..84db2f5 --- /dev/null +++ b/android/app/src/main/res/drawable-v26/ic_shortcut_movie_foreground.xml @@ -0,0 +1,16 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="108dp" + android:height="108dp" + android:tint="@color/ic_shortcut_foreground" + android:viewportWidth="108" + android:viewportHeight="108"> + <group + android:scaleX="1.7226" + android:scaleY="1.7226" + android:translateX="33.3288" + android:translateY="33.3288"> + <path + android:fillColor="@android:color/white" + android:pathData="M4,6.47L5.76,10H20v8H4V6.47M22,4h-4l2,4h-3l-2,-4h-2l2,4h-3l-2,-4H8l2,4H7L5,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4z" /> + </group> +</vector> diff --git a/android/app/src/main/res/drawable-v26/ic_shortcut_search_foreground.xml b/android/app/src/main/res/drawable-v26/ic_shortcut_search_foreground.xml new file mode 100644 index 0000000..13f7071 --- /dev/null +++ b/android/app/src/main/res/drawable-v26/ic_shortcut_search_foreground.xml @@ -0,0 +1,16 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="108dp" + android:height="108dp" + android:tint="@color/ic_shortcut_foreground" + android:viewportWidth="108" + android:viewportHeight="108"> + <group + android:scaleX="1.7226" + android:scaleY="1.7226" + android:translateX="33.3288" + android:translateY="33.3288"> + <path + android:fillColor="@android:color/white" + android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z" /> + </group> +</vector> diff --git a/android/app/src/main/res/drawable-v31/ic_launcher_splash.xml b/android/app/src/main/res/drawable-v31/ic_launcher_splash.xml new file mode 100644 index 0000000..ea4b1d1 --- /dev/null +++ b/android/app/src/main/res/drawable-v31/ic_launcher_splash.xml @@ -0,0 +1,174 @@ +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt"> + <aapt:attr name="android:drawable"> + <vector + android:name="vector" + android:width="100dp" + android:height="100dp" + android:viewportWidth="100" + android:viewportHeight="100"> + <group android:name="breast_group"> + <path + android:name="breast_path" + android:fillAlpha="0" + android:fillColor="#e0e0e0" + android:pathData="m53.43,44.71 l8.31,8.31a1.46,1.46 0,0 1,-0 2.08l-8.31,8.31a1.46,1.46 0,0 1,-2.08 0l-8.31,-8.31a1.46,1.46 0,0 1,0 -2.08l8.31,-8.31a1.46,1.46 0,0 1,2.08 0z" + android:strokeWidth="1.53902" + android:strokeColor="#000000" /> + </group> + <group android:name="head_group"> + <path + android:name="head_path" + android:fillAlpha="0" + android:fillColor="#ffc11f" + android:pathData="m55.45,40.62a1.47,1.47 0,0 0,0 2.08l8.31,8.31a1.47,1.47 0,0 0,2.08 0l8.31,-8.31a1.47,1.47 0,0 0,0 -2.08l-4.12,-4.12a7.39,7.39 0,0 0,-10.44 0zM63.65,40.51a1.62,1.62 0,0 1,2.29 0,1.62 1.62,0 0,1 0,2.29 1.62,1.62 0,0 1,-2.29 0,1.62 1.62,0 0,1 0,-2.29z" + android:strokeWidth="1.53902" + android:strokeColor="#000000" /> + </group> + <group android:name="wing_group"> + <path + android:name="wing_path" + android:fillAlpha="0" + android:fillColor="@color/ic_launcher_flavour" + android:pathData="m37.26,28.54 l12.13,12.13a1.47,1.47 0,0 1,0 2.08l-8.31,8.31a1.47,1.47 0,0 1,-2.08 0l-5.39,-5.39a11.47,11.47 0,0 1,0 -16.22l0.9,-0.9a1.94,1.94 0,0 1,2.74 0z" + android:strokeWidth="1.5" + android:strokeColor="#000000" /> + </group> + <group android:name="tail_group"> + <path + android:name="tail_path" + android:fillAlpha="0" + android:fillColor="#ef435a" + android:pathData="m41.03,57.12 l8.31,8.31a1.47,1.47 0,0 1,0 2.08l-3.97,3.97a7.6,7.6 0,0 1,-10.75 0l-3.97,-3.97a1.47,1.47 0,0 1,0 -2.08l8.31,-8.31a1.47,1.47 0,0 1,2.08 0z" + android:strokeWidth="1.5" + android:strokeColor="#000000" /> + </group> + </vector> + </aapt:attr> + <target android:name="breast_path"> + <aapt:attr name="android:animation"> + <set> + <objectAnimator + android:duration="400" + android:propertyName="trimPathEnd" + android:valueTo="1" /> + <objectAnimator + android:duration="600" + android:propertyName="fillAlpha" + android:startOffset="300" + android:valueTo="1" /> + </set> + </aapt:attr> + </target> + <target android:name="head_path"> + <aapt:attr name="android:animation"> + <set> + <objectAnimator + android:duration="400" + android:propertyName="trimPathEnd" + android:valueTo="1" /> + <objectAnimator + android:duration="600" + android:propertyName="fillAlpha" + android:startOffset="300" + android:valueTo="1" /> + </set> + </aapt:attr> + </target> + <target android:name="wing_path"> + <aapt:attr name="android:animation"> + <set> + <objectAnimator + android:duration="400" + android:propertyName="trimPathEnd" + android:valueTo="1" /> + <objectAnimator + android:duration="600" + android:propertyName="fillAlpha" + android:startOffset="300" + android:valueTo="1" /> + </set> + </aapt:attr> + </target> + <target android:name="tail_path"> + <aapt:attr name="android:animation"> + <set> + <objectAnimator + android:duration="400" + android:propertyName="trimPathEnd" + android:valueTo="1" /> + <objectAnimator + android:duration="600" + android:propertyName="fillAlpha" + android:startOffset="300" + android:valueTo="1" /> + </set> + </aapt:attr> + </target> + <target android:name="head_group"> + <aapt:attr name="android:animation"> + <set> + <objectAnimator + android:duration="400" + android:interpolator="@android:anim/accelerate_decelerate_interpolator" + android:propertyName="translateX" + android:repeatCount="-1" + android:repeatMode="reverse" + android:startOffset="400" + android:valueTo=".5dp" /> + <objectAnimator + android:duration="400" + android:interpolator="@android:anim/accelerate_decelerate_interpolator" + android:propertyName="translateY" + android:repeatCount="-1" + android:repeatMode="reverse" + android:startOffset="400" + android:valueTo="-.5dp" /> + </set> + </aapt:attr> + </target> + <target android:name="wing_group"> + <aapt:attr name="android:animation"> + <set> + <objectAnimator + android:duration="400" + android:interpolator="@android:anim/accelerate_decelerate_interpolator" + android:propertyName="translateX" + android:repeatCount="-1" + android:repeatMode="reverse" + android:startOffset="500" + android:valueTo="-.5dp" /> + <objectAnimator + android:duration="400" + android:interpolator="@android:anim/accelerate_decelerate_interpolator" + android:propertyName="translateY" + android:repeatCount="-1" + android:repeatMode="reverse" + android:startOffset="500" + android:valueTo="-.5dp" /> + </set> + </aapt:attr> + </target> + <target android:name="tail_group"> + <aapt:attr name="android:animation"> + <set> + <objectAnimator + android:duration="400" + android:interpolator="@android:anim/accelerate_decelerate_interpolator" + android:propertyName="translateX" + android:repeatCount="-1" + android:repeatMode="reverse" + android:startOffset="600" + android:valueTo="-.5dp" /> + <objectAnimator + android:duration="400" + android:interpolator="@android:anim/accelerate_decelerate_interpolator" + android:propertyName="translateY" + android:repeatCount="-1" + android:repeatMode="reverse" + android:startOffset="600" + android:valueTo=".5dp" /> + </set> + </aapt:attr> + </target> +</animated-vector> \ No newline at end of file diff --git a/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/android/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..8cfb7d0 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="100dp" + android:height="100dp" + android:viewportWidth="100" + android:viewportHeight="100"> + <path + android:fillColor="#ef435a" + android:pathData="m41.03,57.12 l8.31,8.31a1.47,1.47 0,0 1,0 2.08l-3.97,3.97a7.6,7.6 0,0 1,-10.75 0l-3.97,-3.97a1.47,1.47 0,0 1,0 -2.08l8.31,-8.31a1.47,1.47 0,0 1,2.08 0z" + android:strokeWidth="1.53903" + android:strokeColor="#000000" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + <path + android:fillColor="#e0e0e0" + android:pathData="m53.43,44.71 l8.31,8.31a1.46,1.46 0,0 1,-0 2.08l-8.31,8.31a1.46,1.46 0,0 1,-2.08 0l-8.31,-8.31a1.46,1.46 0,0 1,0 -2.08l8.31,-8.31a1.46,1.46 0,0 1,2.08 0z" + android:strokeWidth="1.53902" + android:strokeColor="#000000" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + <path + android:fillColor="#ffc11f" + android:pathData="m55.45,40.62a1.47,1.47 0,0 0,0 2.08l8.31,8.31a1.47,1.47 0,0 0,2.08 0l8.31,-8.31a1.47,1.47 0,0 0,0 -2.08l-4.12,-4.12a7.39,7.39 0,0 0,-10.44 0zM63.65,40.51a1.62,1.62 0,0 1,2.29 0,1.62 1.62,0 0,1 0,2.29 1.62,1.62 0,0 1,-2.29 0,1.62 1.62,0 0,1 0,-2.29z" + android:strokeWidth="1.53902" + android:strokeColor="#000000" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + <path + android:fillColor="@color/ic_launcher_flavour" + android:pathData="m37.26,28.54 l12.13,12.13a1.47,1.47 0,0 1,0 2.08l-8.31,8.31a1.47,1.47 0,0 1,-2.08 0l-5.39,-5.39a11.47,11.47 0,0 1,0 -16.22l0.9,-0.9a1.94,1.94 0,0 1,2.74 0z" + android:strokeWidth="1.53903" + android:strokeColor="#000000" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> +</vector> diff --git a/android/app/src/main/res/drawable/ic_launcher_mono.xml b/android/app/src/main/res/drawable/ic_launcher_mono.xml new file mode 100644 index 0000000..6a29ef8 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_mono.xml @@ -0,0 +1,34 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="100dp" + android:height="100dp" + android:viewportWidth="100" + android:viewportHeight="100"> + <path + android:fillColor="#000000" + android:pathData="m41.03,57.12 l8.31,8.31a1.47,1.47 0,0 1,0 2.08l-3.97,3.97a7.6,7.6 0,0 1,-10.75 0l-3.97,-3.97a1.47,1.47 0,0 1,0 -2.08l8.3,-8.3a1.47,1.47 0,0 1,2.08 0z" + android:strokeWidth="1.53871" + android:strokeColor="#00000000" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + <path + android:fillColor="#000000" + android:pathData="m53.43,44.72 l8.31,8.31a1.46,1.46 0,0 1,-0 2.08l-8.31,8.31a1.46,1.46 0,0 1,-2.08 0l-8.31,-8.31a1.46,1.46 0,0 1,0 -2.08L51.35,44.72a1.46,1.46 0,0 1,2.08 0z" + android:strokeWidth="1.5387" + android:strokeColor="#00000000" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + <path + android:fillColor="#000000" + android:pathData="m55.45,40.62a1.47,1.47 0,0 0,0 2.08l8.31,8.3a1.47,1.47 0,0 0,2.08 0l8.3,-8.3a1.47,1.47 0,0 0,0 -2.08l-4.12,-4.12a7.38,7.38 0,0 0,-10.44 0zM63.65,40.51a1.62,1.62 0,0 1,2.29 0,1.62 1.62,0 0,1 0,2.29 1.62,1.62 0,0 1,-2.29 0,1.62 1.62,0 0,1 0,-2.29z" + android:strokeWidth="1.5387" + android:strokeColor="#00000000" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + <path + android:fillColor="#000000" + android:pathData="m37.26,28.54 l12.13,12.13a1.47,1.47 0,0 1,0 2.08l-8.31,8.3a1.47,1.47 0,0 1,-2.08 0L33.62,45.67a11.47,11.47 0,0 1,0 -16.22l0.9,-0.9a1.94,1.94 0,0 1,2.74 0z" + android:strokeWidth="1.53871" + android:strokeColor="#00000000" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> +</vector> diff --git a/android/app/src/main/res/drawable/ic_notification.xml b/android/app/src/main/res/drawable/ic_notification.xml new file mode 100644 index 0000000..85c75cc --- /dev/null +++ b/android/app/src/main/res/drawable/ic_notification.xml @@ -0,0 +1,34 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="100dp" + android:height="100dp" + android:viewportWidth="100" + android:viewportHeight="100"> + <path + android:fillColor="#000000" + android:pathData="m31.78,63.61 l16.47,16.47a2.91,2.91 0,0 1,0 4.12l-7.87,7.87a15.07,15.07 0,0 1,-21.31 0L11.2,84.2a2.91,2.91 0,0 1,0 -4.12l16.47,-16.47a2.91,2.91 0,0 1,4.12 0z" + android:strokeWidth="3.05097" + android:strokeColor="#00000000" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + <path + android:fillColor="#000000" + android:pathData="M56.37,39.03L72.84,55.49A2.91,2.91 90,0 1,72.84 59.61L56.37,76.08A2.91,2.91 0,0 1,52.25 76.08L35.78,59.61A2.91,2.91 0,0 1,35.78 55.49L52.25,39.03A2.91,2.91 90,0 1,56.37 39.03z" + android:strokeWidth="3.05095" + android:strokeColor="#00000000" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + <path + android:fillColor="#000000" + android:pathData="m60.37,30.91a2.91,2.91 0,0 0,0 4.12l16.47,16.47a2.91,2.91 0,0 0,4.12 0l16.47,-16.47a2.91,2.91 0,0 0,0 -4.12l-8.17,-8.17a14.64,14.64 0,0 0,-20.7 0zM76.62,30.7a3.21,3.21 0,0 1,4.54 0,3.21 3.21,0 0,1 0,4.54 3.21,3.21 0,0 1,-4.54 0,3.21 3.21,0 0,1 0,-4.54z" + android:strokeWidth="3.05095" + android:strokeColor="#00000000" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + <path + android:fillColor="#000000" + android:pathData="m24.31,6.96 l24.04,24.04a2.91,2.91 0,0 1,0 4.12L31.88,51.59a2.91,2.91 0,0 1,-4.12 0L17.08,40.91a22.74,22.74 0,0 1,0 -32.16L18.87,6.96a3.84,3.84 0,0 1,5.43 0z" + android:strokeWidth="3.05097" + android:strokeColor="#00000000" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> +</vector> diff --git a/android/app/src/main/res/drawable/ic_outline_stop_24.xml b/android/app/src/main/res/drawable/ic_outline_stop_24.xml new file mode 100644 index 0000000..301f149 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_outline_stop_24.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="@android:color/white" + android:pathData="M16,8v8H8V8h8m2,-2H6v12h12V6z" /> +</vector> diff --git a/android/app/src/main/res/drawable/ic_shortcut_collection.xml b/android/app/src/main/res/drawable/ic_shortcut_collection.xml new file mode 100644 index 0000000..f20e57d --- /dev/null +++ b/android/app/src/main/res/drawable/ic_shortcut_collection.xml @@ -0,0 +1,16 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="48dp" + android:height="48dp" + android:viewportWidth="48" + android:viewportHeight="48"> + <path + android:fillColor="@color/ic_shortcut_background" + android:pathData="M0,24 A1,1 0 1,1 48,24 A1,1 0 1,1 0,24" /> + <group + android:translateX="12" + android:translateY="12"> + <path + android:fillColor="@color/ic_shortcut_foreground" + android:pathData="M20,4v12L8,16L8,4h12m0,-2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM11.5,11.67l1.69,2.26 2.48,-3.1L19,15L9,15zM2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6L2,6z" /> + </group> +</vector> diff --git a/android/app/src/main/res/drawable/ic_shortcut_map.xml b/android/app/src/main/res/drawable/ic_shortcut_map.xml new file mode 100644 index 0000000..7dc10d1 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_shortcut_map.xml @@ -0,0 +1,16 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="48dp" + android:height="48dp" + android:viewportWidth="48" + android:viewportHeight="48"> + <path + android:fillColor="@color/ic_shortcut_background" + android:pathData="M0,24 A1,1 0 1,1 48,24 A1,1 0 1,1 0,24" /> + <group + android:translateX="12" + android:translateY="12"> + <path + android:fillColor="@color/ic_shortcut_foreground" + android:pathData="M20.5,3l-0.16,0.03L15,5.1 9,3 3.36,4.9c-0.21,0.07 -0.36,0.25 -0.36,0.48L3,20.5c0,0.28 0.22,0.5 0.5,0.5l0.16,-0.03L9,18.9l6,2.1 5.64,-1.9c0.21,-0.07 0.36,-0.25 0.36,-0.48L21,3.5c0,-0.28 -0.22,-0.5 -0.5,-0.5zM10,5.47l4,1.4v11.66l-4,-1.4L10,5.47zM5,6.46l3,-1.01v11.7l-3,1.16L5,6.46zM19,17.54l-3,1.01L16,6.86l3,-1.16v11.84z" /> + </group> +</vector> diff --git a/android/app/src/main/res/drawable/ic_shortcut_map_foreground.xml b/android/app/src/main/res/drawable/ic_shortcut_map_foreground.xml new file mode 100644 index 0000000..d450c31 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_shortcut_map_foreground.xml @@ -0,0 +1,16 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="108dp" + android:height="108dp" + android:tint="@color/ic_shortcut_foreground" + android:viewportWidth="108" + android:viewportHeight="108"> + <group + android:scaleX="1.7226" + android:scaleY="1.7226" + android:translateX="33.3288" + android:translateY="33.3288"> + <path + android:fillColor="@android:color/white" + android:pathData="M20.5,3l-0.16,0.03L15,5.1 9,3 3.36,4.9c-0.21,0.07 -0.36,0.25 -0.36,0.48L3,20.5c0,0.28 0.22,0.5 0.5,0.5l0.16,-0.03L9,18.9l6,2.1 5.64,-1.9c0.21,-0.07 0.36,-0.25 0.36,-0.48L21,3.5c0,-0.28 -0.22,-0.5 -0.5,-0.5zM10,5.47l4,1.4v11.66l-4,-1.4L10,5.47zM5,6.46l3,-1.01v11.7l-3,1.16L5,6.46zM19,17.54l-3,1.01L16,6.86l3,-1.16v11.84z" /> + </group> +</vector> diff --git a/android/app/src/main/res/drawable/ic_shortcut_movie.xml b/android/app/src/main/res/drawable/ic_shortcut_movie.xml new file mode 100644 index 0000000..c69c379 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_shortcut_movie.xml @@ -0,0 +1,16 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="48dp" + android:height="48dp" + android:viewportWidth="48" + android:viewportHeight="48"> + <path + android:fillColor="@color/ic_shortcut_background" + android:pathData="M0,24 A1,1 0 1,1 48,24 A1,1 0 1,1 0,24" /> + <group + android:translateX="12" + android:translateY="12"> + <path + android:fillColor="@color/ic_shortcut_foreground" + android:pathData="M4,6.47L5.76,10H20v8H4V6.47M22,4h-4l2,4h-3l-2,-4h-2l2,4h-3l-2,-4H8l2,4H7L5,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4z" /> + </group> +</vector> diff --git a/android/app/src/main/res/drawable/ic_shortcut_search.xml b/android/app/src/main/res/drawable/ic_shortcut_search.xml new file mode 100644 index 0000000..f28c549 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_shortcut_search.xml @@ -0,0 +1,16 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="48dp" + android:height="48dp" + android:viewportWidth="48" + android:viewportHeight="48"> + <path + android:fillColor="@color/ic_shortcut_background" + android:pathData="M0,24 A1,1 0 1,1 48,24 A1,1 0 1,1 0,24" /> + <group + android:translateX="12" + android:translateY="12"> + <path + android:fillColor="@color/ic_shortcut_foreground" + android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z" /> + </group> +</vector> diff --git a/android/app/src/main/res/layout/app_widget.xml b/android/app/src/main/res/layout/app_widget.xml new file mode 100644 index 0000000..b4a2c16 --- /dev/null +++ b/android/app/src/main/res/layout/app_widget.xml @@ -0,0 +1,5 @@ +<ImageView xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/widget_img" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:scaleType="fitCenter" /> diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..ab6fb0e --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@color/ic_launcher_background" /> + <foreground android:drawable="@drawable/ic_launcher_foreground" /> + <monochrome android:drawable="@drawable/ic_launcher_mono" /> +</adaptive-icon> \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..ab6fb0e --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@color/ic_launcher_background" /> + <foreground android:drawable="@drawable/ic_launcher_foreground" /> + <monochrome android:drawable="@drawable/ic_launcher_mono" /> +</adaptive-icon> \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_collection.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_collection.xml new file mode 100644 index 0000000..8ec076f --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_collection.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@color/ic_shortcut_background" /> + <foreground android:drawable="@drawable/ic_shortcut_collection_foreground" /> +</adaptive-icon> \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_map.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_map.xml new file mode 100644 index 0000000..2857b49 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_map.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@color/ic_shortcut_background" /> + <foreground android:drawable="@drawable/ic_shortcut_map_foreground" /> +</adaptive-icon> \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_movie.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_movie.xml new file mode 100644 index 0000000..8789ba0 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_movie.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@color/ic_shortcut_background" /> + <foreground android:drawable="@drawable/ic_shortcut_movie_foreground" /> +</adaptive-icon> \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_search.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_search.xml new file mode 100644 index 0000000..ab1fb94 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_search.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@color/ic_shortcut_background" /> + <foreground android:drawable="@drawable/ic_shortcut_search_foreground" /> +</adaptive-icon> \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..7c532b7 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..7407041 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..f9bbc54 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..c31695e Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..e3491da Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..8e5ee2b Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..51adec0 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b11aeb8 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..8da583b Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..8b7999b Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/values-ar/strings.xml b/android/app/src/main/res/values-ar/strings.xml new file mode 100644 index 0000000..478e4f4 --- /dev/null +++ b/android/app/src/main/res/values-ar/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_widget_label">إطار الصورة</string> + <string name="wallpaper">الخلفية</string> + <string name="search_shortcut_short_label">البحث</string> + <string name="videos_shortcut_short_label">الفيديوهات</string> + <string name="analysis_channel_name">فحص الوسائط</string> + <string name="analysis_notification_default_title">يتم فحص الوسائط</string> + <string name="analysis_notification_action_stop">إيقاف</string> + <string name="app_name">Aves</string> + <string name="map_shortcut_short_label">خريطة</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-az/strings.xml b/android/app/src/main/res/values-az/strings.xml new file mode 100644 index 0000000..31f1b1c --- /dev/null +++ b/android/app/src/main/res/values-az/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Şəkil Çərçivəsi</string> + <string name="wallpaper">Divar kağızı</string> + <string name="map_shortcut_short_label">Xəritə</string> + <string name="search_shortcut_short_label">Axtarış</string> + <string name="videos_shortcut_short_label">Videolar</string> + <string name="analysis_channel_name">Medianı yoxla</string> + <string name="analysis_notification_default_title">Media yoxlanılır</string> + <string name="analysis_notification_action_stop">Dayandır</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-b+zxx+Shaw/strings.xml b/android/app/src/main/res/values-b+zxx+Shaw/strings.xml new file mode 100644 index 0000000..f7bb920 --- /dev/null +++ b/android/app/src/main/res/values-b+zxx+Shaw/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">𐑱𐑝𐑰𐑟</string> + <string name="app_widget_label">𐑓𐑴𐑑𐑴 𐑓𐑮𐑱𐑥</string> + <string name="wallpaper">𐑢𐑷𐑤𐑐𐑱𐑐𐑼</string> + <string name="map_shortcut_short_label">𐑥𐑨𐑐</string> + <string name="search_shortcut_short_label">𐑕𐑻𐑗</string> + <string name="videos_shortcut_short_label">𐑝𐑦𐑛𐑦𐑴𐑟</string> + <string name="analysis_channel_name">𐑥𐑰𐑛𐑾 𐑕𐑒𐑨𐑯</string> + <string name="analysis_notification_default_title">𐑕𐑒𐑨𐑯𐑦𐑙 𐑥𐑰𐑛𐑾</string> + <string name="analysis_notification_action_stop">𐑕𐑑𐑪𐑐</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-be/strings.xml b/android/app/src/main/res/values-be/strings.xml new file mode 100644 index 0000000..cf307df --- /dev/null +++ b/android/app/src/main/res/values-be/strings.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="analysis_channel_name">Сканаванне носьбітаў</string> + <string name="videos_shortcut_short_label">Відэа</string> + <string name="wallpaper">Шпалеры</string> + <string name="analysis_notification_default_title">Сканаванне носьбітаў</string> + <string name="app_name">Aves</string> + <string name="app_widget_label">Фотарамка</string> + <string name="search_shortcut_short_label">Пошук</string> + <string name="analysis_notification_action_stop">Стоп</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-bg/strings.xml b/android/app/src/main/res/values-bg/strings.xml new file mode 100644 index 0000000..d33ecff --- /dev/null +++ b/android/app/src/main/res/values-bg/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Фоторамка</string> + <string name="wallpaper">Тапет</string> + <string name="map_shortcut_short_label">Карта</string> + <string name="search_shortcut_short_label">Търсене</string> + <string name="analysis_channel_name">Сканиране медия</string> + <string name="analysis_notification_default_title">Сканиране медия</string> + <string name="analysis_notification_action_stop">Стоп</string> + <string name="videos_shortcut_short_label">Видео</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-bn/strings.xml b/android/app/src/main/res/values-bn/strings.xml new file mode 100644 index 0000000..936f4ce --- /dev/null +++ b/android/app/src/main/res/values-bn/strings.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="wallpaper">ওয়ালপেপার</string> + <string name="search_shortcut_short_label">সার্চ</string> + <string name="videos_shortcut_short_label">ভিডিও</string> + <string name="analysis_notification_default_title">মিডিয়া সন্ধান চলছে</string> + <string name="analysis_channel_name">মিডিয়া সন্ধান</string> + <string name="analysis_notification_action_stop">থামান</string> + <string name="app_name">আভেস</string> + <string name="app_widget_label">ছবির ফ্রেম</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-ca/strings.xml b/android/app/src/main/res/values-ca/strings.xml new file mode 100644 index 0000000..1146f3a --- /dev/null +++ b/android/app/src/main/res/values-ca/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Marc de foto</string> + <string name="wallpaper">Fons de pantalla</string> + <string name="search_shortcut_short_label">Buscar</string> + <string name="videos_shortcut_short_label">Vídeos</string> + <string name="analysis_channel_name">Exploració de mitjans</string> + <string name="analysis_notification_default_title">Explorant mitjans</string> + <string name="analysis_notification_action_stop">Atura</string> + <string name="map_shortcut_short_label">Mapa</string> +</resources> diff --git a/android/app/src/main/res/values-ckb/strings.xml b/android/app/src/main/res/values-ckb/strings.xml new file mode 100644 index 0000000..65b05be --- /dev/null +++ b/android/app/src/main/res/values-ckb/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">ئاڤێس</string> + <string name="app_widget_label">قەراغی وێنە</string> + <string name="wallpaper">پاشبنەما</string> + <string name="search_shortcut_short_label">گەڕان</string> + <string name="videos_shortcut_short_label">ڤیدیۆ</string> + <string name="analysis_channel_name">گەڕان لە ڕەنگاڵە</string> + <string name="analysis_notification_default_title">لە ڕەنگاڵەکان دەگەڕێت</string> + <string name="analysis_notification_action_stop">وەستاندن</string> + <string name="map_shortcut_short_label">نەخشە</string> +</resources> diff --git a/android/app/src/main/res/values-cs/strings.xml b/android/app/src/main/res/values-cs/strings.xml new file mode 100644 index 0000000..af729a9 --- /dev/null +++ b/android/app/src/main/res/values-cs/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="wallpaper">Tapeta</string> + <string name="search_shortcut_short_label">Hledat</string> + <string name="videos_shortcut_short_label">Videa</string> + <string name="analysis_channel_name">Prohledat média</string> + <string name="analysis_notification_default_title">Prohledávání médií</string> + <string name="analysis_notification_action_stop">Zastavit</string> + <string name="app_widget_label">Fotorámeček</string> + <string name="map_shortcut_short_label">Mapa</string> +</resources> diff --git a/android/app/src/main/res/values-da/strings.xml b/android/app/src/main/res/values-da/strings.xml new file mode 100644 index 0000000..f475147 --- /dev/null +++ b/android/app/src/main/res/values-da/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_widget_label">Fotoramme</string> + <string name="wallpaper">Baggrund</string> + <string name="videos_shortcut_short_label">Videoer</string> + <string name="analysis_channel_name">Mediescanning</string> + <string name="analysis_notification_default_title">Scanner medier</string> + <string name="analysis_notification_action_stop">Stop</string> + <string name="app_name">Aves</string> + <string name="search_shortcut_short_label">Søg</string> + <string name="map_shortcut_short_label">Kort</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-de/strings.xml b/android/app/src/main/res/values-de/strings.xml new file mode 100644 index 0000000..2c7396d --- /dev/null +++ b/android/app/src/main/res/values-de/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Bilderrahmen</string> + <string name="wallpaper">Hintergrundbild</string> + <string name="search_shortcut_short_label">Suche</string> + <string name="videos_shortcut_short_label">Videos</string> + <string name="analysis_channel_name">Analyse von Medien</string> + <string name="analysis_notification_default_title">Medien scannen</string> + <string name="analysis_notification_action_stop">Abbrechen</string> + <string name="map_shortcut_short_label">Karte</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-el/strings.xml b/android/app/src/main/res/values-el/strings.xml new file mode 100644 index 0000000..77d0d3a --- /dev/null +++ b/android/app/src/main/res/values-el/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Κορνίζα</string> + <string name="wallpaper">Ταπετσαρία</string> + <string name="search_shortcut_short_label">Αναζήτηση</string> + <string name="videos_shortcut_short_label">Βίντεο</string> + <string name="analysis_channel_name">Σάρωση πολυμέσων</string> + <string name="analysis_notification_default_title">Σάρωση στοιχείων</string> + <string name="analysis_notification_action_stop">Διακοπή</string> + <string name="map_shortcut_short_label">Χάρτης</string> +</resources> diff --git a/android/app/src/main/res/values-es/strings.xml b/android/app/src/main/res/values-es/strings.xml new file mode 100644 index 0000000..6cc0b28 --- /dev/null +++ b/android/app/src/main/res/values-es/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Marco de foto</string> + <string name="wallpaper">Fondo de pantalla</string> + <string name="search_shortcut_short_label">Buscar</string> + <string name="videos_shortcut_short_label">Vídeos</string> + <string name="analysis_channel_name">Explorar medios</string> + <string name="analysis_notification_default_title">Explorando medios</string> + <string name="analysis_notification_action_stop">Anular</string> + <string name="map_shortcut_short_label">Mapa</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-et/strings.xml b/android/app/src/main/res/values-et/strings.xml new file mode 100644 index 0000000..b596c8b --- /dev/null +++ b/android/app/src/main/res/values-et/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Fotoraam</string> + <string name="wallpaper">Taustapilt</string> + <string name="map_shortcut_short_label">Kaart</string> + <string name="search_shortcut_short_label">Otsi</string> + <string name="videos_shortcut_short_label">Videod</string> + <string name="analysis_channel_name">Meedia tuvastamine</string> + <string name="analysis_notification_default_title">Tuvastame meediat</string> + <string name="analysis_notification_action_stop">Peata</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-eu/strings.xml b/android/app/src/main/res/values-eu/strings.xml new file mode 100644 index 0000000..c8e57d8 --- /dev/null +++ b/android/app/src/main/res/values-eu/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="search_shortcut_short_label">Bilatu</string> + <string name="videos_shortcut_short_label">Bideoak</string> + <string name="app_widget_label">Argazki-markoa</string> + <string name="wallpaper">Horma-papera</string> + <string name="analysis_channel_name">Media eskaneatu</string> + <string name="analysis_notification_action_stop">Gelditu</string> + <string name="analysis_notification_default_title">Media eskaneatzen</string> + <string name="app_name">Aves</string> + <string name="map_shortcut_short_label">Mapa</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-fa/strings.xml b/android/app/src/main/res/values-fa/strings.xml new file mode 100644 index 0000000..aa8d9ee --- /dev/null +++ b/android/app/src/main/res/values-fa/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="videos_shortcut_short_label">ویدئو ها</string> + <string name="analysis_channel_name">کنکاش رسانه</string> + <string name="search_shortcut_short_label">جستجو</string> + <string name="wallpaper">کاغذدیواری</string> + <string name="analysis_notification_default_title">در حال کنکاش رسانه‌ها</string> + <string name="analysis_notification_action_stop">توقف کردن</string> + <string name="app_widget_label">قاب عکس</string> + <string name="app_name">Aves</string> + <string name="map_shortcut_short_label">نقشه</string> +</resources> diff --git a/android/app/src/main/res/values-fi/strings.xml b/android/app/src/main/res/values-fi/strings.xml new file mode 100644 index 0000000..9d7d1f8 --- /dev/null +++ b/android/app/src/main/res/values-fi/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="analysis_notification_action_stop">Lopeta</string> + <string name="app_widget_label">Valokuvakehys</string> + <string name="analysis_notification_default_title">Mediaa skannataan</string> + <string name="videos_shortcut_short_label">Videot</string> + <string name="wallpaper">Taustakuva</string> + <string name="app_name">Aves</string> + <string name="analysis_channel_name">Median skannaus</string> + <string name="search_shortcut_short_label">Hae</string> + <string name="map_shortcut_short_label">Kartta</string> +</resources> diff --git a/android/app/src/main/res/values-fr/strings.xml b/android/app/src/main/res/values-fr/strings.xml new file mode 100644 index 0000000..159a984 --- /dev/null +++ b/android/app/src/main/res/values-fr/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Cadre photo</string> + <string name="wallpaper">Fond d’écran</string> + <string name="search_shortcut_short_label">Recherche</string> + <string name="videos_shortcut_short_label">Vidéos</string> + <string name="analysis_channel_name">Analyse des images</string> + <string name="analysis_notification_default_title">Analyse des images</string> + <string name="analysis_notification_action_stop">Annuler</string> + <string name="map_shortcut_short_label">Carte</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-gl/strings.xml b/android/app/src/main/res/values-gl/strings.xml new file mode 100644 index 0000000..a90ab7c --- /dev/null +++ b/android/app/src/main/res/values-gl/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Marco de fotos</string> + <string name="wallpaper">Fondo da pantalla</string> + <string name="search_shortcut_short_label">Procura</string> + <string name="videos_shortcut_short_label">Vídeos</string> + <string name="analysis_channel_name">Escanear medios</string> + <string name="analysis_notification_default_title">Escaneando medios</string> + <string name="analysis_notification_action_stop">Pare</string> + <string name="map_shortcut_short_label">Mapa</string> +</resources> diff --git a/android/app/src/main/res/values-hi/strings.xml b/android/app/src/main/res/values-hi/strings.xml new file mode 100644 index 0000000..9b6676a --- /dev/null +++ b/android/app/src/main/res/values-hi/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="analysis_notification_default_title">मीडिया जाँचा जा राहा है</string> + <string name="analysis_notification_action_stop">रोके</string> + <string name="app_widget_label">फोटो फ्रेम</string> + <string name="wallpaper">वॉलपेपर</string> + <string name="search_shortcut_short_label">खोजें</string> + <string name="analysis_channel_name">मीडिया जाँचे</string> + <string name="app_name">ऐवीज</string> + <string name="videos_shortcut_short_label">वीडियो</string> + <string name="map_shortcut_short_label">मैप</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-hr/strings.xml b/android/app/src/main/res/values-hr/strings.xml new file mode 100644 index 0000000..e7dd2ff --- /dev/null +++ b/android/app/src/main/res/values-hr/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_widget_label">Okvir Slike</string> + <string name="wallpaper">Pozadina</string> + <string name="map_shortcut_short_label">Mapa</string> + <string name="search_shortcut_short_label">Pretraživanje</string> + <string name="videos_shortcut_short_label">Videosnimke</string> + <string name="analysis_channel_name">Skeniranje medija</string> + <string name="analysis_notification_default_title">Skeniram medije</string> + <string name="analysis_notification_action_stop">Stop</string> + <string name="app_name">Aves</string> +</resources> diff --git a/android/app/src/main/res/values-hu/strings.xml b/android/app/src/main/res/values-hu/strings.xml new file mode 100644 index 0000000..a8da148 --- /dev/null +++ b/android/app/src/main/res/values-hu/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="wallpaper">Háttérkép</string> + <string name="search_shortcut_short_label">Keresés</string> + <string name="videos_shortcut_short_label">Videók</string> + <string name="analysis_notification_action_stop">Állj</string> + <string name="app_widget_label">Fotó keret</string> + <string name="analysis_channel_name">Médiafájlok keresése</string> + <string name="analysis_notification_default_title">Média beolvasása</string> + <string name="map_shortcut_short_label">Térkép</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-id/strings.xml b/android/app/src/main/res/values-id/strings.xml new file mode 100644 index 0000000..13708b5 --- /dev/null +++ b/android/app/src/main/res/values-id/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Bingkai Foto</string> + <string name="wallpaper">Wallpaper</string> + <string name="search_shortcut_short_label">Cari</string> + <string name="videos_shortcut_short_label">Video</string> + <string name="analysis_channel_name">Pindai media</string> + <string name="analysis_notification_default_title">Memindai media</string> + <string name="analysis_notification_action_stop">Berhenti</string> + <string name="map_shortcut_short_label">Peta</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-is/strings.xml b/android/app/src/main/res/values-is/strings.xml new file mode 100644 index 0000000..d188a9d --- /dev/null +++ b/android/app/src/main/res/values-is/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="analysis_notification_action_stop">Stöðva</string> + <string name="app_widget_label">Myndarammi</string> + <string name="analysis_notification_default_title">Skanna myndefni</string> + <string name="videos_shortcut_short_label">Myndskeið</string> + <string name="wallpaper">Bakgrunnur</string> + <string name="app_name">Aves</string> + <string name="analysis_channel_name">Skönnun myndefnis</string> + <string name="search_shortcut_short_label">Leita</string> + <string name="map_shortcut_short_label">Landakort</string> +</resources> diff --git a/android/app/src/main/res/values-it/strings.xml b/android/app/src/main/res/values-it/strings.xml new file mode 100644 index 0000000..519f158 --- /dev/null +++ b/android/app/src/main/res/values-it/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Cornice foto</string> + <string name="wallpaper">Sfondo</string> + <string name="search_shortcut_short_label">Ricerca</string> + <string name="videos_shortcut_short_label">Video</string> + <string name="analysis_channel_name">Scansione media</string> + <string name="analysis_notification_default_title">Scansione in corso</string> + <string name="analysis_notification_action_stop">Annulla</string> + <string name="map_shortcut_short_label">Mappa</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-iw/strings.xml b/android/app/src/main/res/values-iw/strings.xml new file mode 100644 index 0000000..fc8b10d --- /dev/null +++ b/android/app/src/main/res/values-iw/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">מסגרת תמונה</string> + <string name="wallpaper">טפט</string> + <string name="search_shortcut_short_label">חיפוש</string> + <string name="videos_shortcut_short_label">סרטים</string> + <string name="analysis_channel_name">סריקת מדיה</string> + <string name="analysis_notification_default_title">סורק מדיה</string> + <string name="analysis_notification_action_stop">הפסק</string> + <string name="map_shortcut_short_label">מפה</string> +</resources> diff --git a/android/app/src/main/res/values-ja/strings.xml b/android/app/src/main/res/values-ja/strings.xml new file mode 100644 index 0000000..cf16df9 --- /dev/null +++ b/android/app/src/main/res/values-ja/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">フォトフレーム</string> + <string name="wallpaper">壁紙</string> + <string name="search_shortcut_short_label">検索</string> + <string name="videos_shortcut_short_label">動画</string> + <string name="analysis_channel_name">メディアスキャン</string> + <string name="analysis_notification_default_title">メディアをスキャン中</string> + <string name="analysis_notification_action_stop">停止</string> + <string name="map_shortcut_short_label">マップ</string> +</resources> diff --git a/android/app/src/main/res/values-kmr/strings.xml b/android/app/src/main/res/values-kmr/strings.xml new file mode 100644 index 0000000..d9d18d8 --- /dev/null +++ b/android/app/src/main/res/values-kmr/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Çarçoveya wêneyê</string> + <string name="wallpaper">Paşrû</string> + <string name="map_shortcut_short_label">Nexşe</string> + <string name="search_shortcut_short_label">Bigere</string> + <string name="videos_shortcut_short_label">Vîdyo</string> + <string name="analysis_channel_name">Dîtina medya</string> + <string name="analysis_notification_default_title">Medya tê dîtin</string> + <string name="analysis_notification_action_stop">Rawestîne</string> +</resources> diff --git a/android/app/src/main/res/values-kn/strings.xml b/android/app/src/main/res/values-kn/strings.xml new file mode 100644 index 0000000..c4900bd --- /dev/null +++ b/android/app/src/main/res/values-kn/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">ಎವೀಸ್</string> + <string name="app_widget_label">ಫೋಟೋ ಫ್ರೇಮ್</string> + <string name="wallpaper">ವಾಲ್ಪೇಪರ್</string> + <string name="videos_shortcut_short_label">ವೀಡಿಯೊಗಳು</string> + <string name="analysis_channel_name">ಮೀಡಿಯಾ ಸ್ಕ್ಯಾನ್</string> + <string name="analysis_notification_default_title">ಮೀಡಿಯಾ ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗುತ್ತಿದೆ</string> + <string name="analysis_notification_action_stop">ನಿಲ್ಲಿಸಿ</string> + <string name="search_shortcut_short_label">ಹುಡುಕಿ</string> + <string name="map_shortcut_short_label">ನಕ್ಷೆ</string> +</resources> diff --git a/android/app/src/main/res/values-ko/strings.xml b/android/app/src/main/res/values-ko/strings.xml new file mode 100644 index 0000000..207fcda --- /dev/null +++ b/android/app/src/main/res/values-ko/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">아베스</string> + <string name="app_widget_label">사진 액자</string> + <string name="wallpaper">배경화면</string> + <string name="search_shortcut_short_label">검색</string> + <string name="videos_shortcut_short_label">동영상</string> + <string name="analysis_channel_name">미디어 분석</string> + <string name="analysis_notification_default_title">미디어 분석</string> + <string name="analysis_notification_action_stop">취소</string> + <string name="map_shortcut_short_label">지도</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-lt/strings.xml b/android/app/src/main/res/values-lt/strings.xml new file mode 100644 index 0000000..c8c6027 --- /dev/null +++ b/android/app/src/main/res/values-lt/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="wallpaper">Ekrano paveikslėlis</string> + <string name="videos_shortcut_short_label">Vaizdo įrašai</string> + <string name="app_name">Aves</string> + <string name="app_widget_label">Nuotraukų rėmelis</string> + <string name="analysis_channel_name">Medijos nuskaitymas</string> + <string name="search_shortcut_short_label">Paieška</string> + <string name="analysis_notification_action_stop">Sustabdyti</string> + <string name="analysis_notification_default_title">Nuskaitoma medija</string> + <string name="map_shortcut_short_label">Žemėlapis</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-ml/strings.xml b/android/app/src/main/res/values-ml/strings.xml new file mode 100644 index 0000000..06647e9 --- /dev/null +++ b/android/app/src/main/res/values-ml/strings.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">എവ്സ്</string> + <string name="wallpaper">ചുമർ ചിത്രം</string> + <string name="search_shortcut_short_label">തിരയുക</string> + <string name="videos_shortcut_short_label">വീഡിയോകൾ</string> + <string name="analysis_channel_name">മാധ്യമ സൂക്ഷ്മപരിശോധന</string> + <string name="analysis_notification_action_stop">നിർത്തുക</string> +</resources> diff --git a/android/app/src/main/res/values-my/strings.xml b/android/app/src/main/res/values-my/strings.xml new file mode 100644 index 0000000..ae4237c --- /dev/null +++ b/android/app/src/main/res/values-my/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">ရုပ်ပုံဘောင်</string> + <string name="wallpaper">နောက်ခံ ရုပ်ပုံ</string> + <string name="analysis_channel_name">မီဒီယာ စကင်</string> + <string name="search_shortcut_short_label">ရှာရန်</string> + <string name="videos_shortcut_short_label">ဗီဒီယိုများ</string> + <string name="analysis_notification_default_title">မီဒီယာ ကိုစကင်ဖတ်နေသည်</string> + <string name="analysis_notification_action_stop">ရပ်ရန်</string> + <string name="map_shortcut_short_label">မြေပုံ</string> +</resources> diff --git a/android/app/src/main/res/values-nb-rNO/strings.xml b/android/app/src/main/res/values-nb-rNO/strings.xml new file mode 100644 index 0000000..fd061b6 --- /dev/null +++ b/android/app/src/main/res/values-nb-rNO/strings.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="videos_shortcut_short_label">Videoer</string> + <string name="analysis_channel_name">Mediaskanning</string> + <string name="analysis_notification_default_title">Skanning av media</string> + <string name="app_widget_label">Bilderamme</string> + <string name="wallpaper">Bakgrunnsbilde</string> + <string name="search_shortcut_short_label">Søk</string> + <string name="analysis_notification_action_stop">Stopp</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-ne/strings.xml b/android/app/src/main/res/values-ne/strings.xml new file mode 100644 index 0000000..6dc61ac --- /dev/null +++ b/android/app/src/main/res/values-ne/strings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">एभस</string> +</resources> diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..798f87a --- /dev/null +++ b/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:tools="http://schemas.android.com/tools"> + + <style name="NormalTheme" parent="Theme.AppCompat.NoActionBar"> + <item name="android:windowBackground">@color/window_background_night</item> + <item name="android:windowSplashScreenBackground" tools:targetApi="31">@color/window_background_night</item> + <item name="android:windowSplashScreenAnimatedIcon" tools:targetApi="31">@drawable/ic_launcher_splash</item> + + <!-- API28+, draws next to the notch in fullscreen --> + <item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="28">shortEdges</item> + </style> +</resources> diff --git a/android/app/src/main/res/values-nl/strings.xml b/android/app/src/main/res/values-nl/strings.xml new file mode 100644 index 0000000..103f471 --- /dev/null +++ b/android/app/src/main/res/values-nl/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Fotolijst</string> + <string name="wallpaper">Achtergrond</string> + <string name="search_shortcut_short_label">Zoeken</string> + <string name="videos_shortcut_short_label">Video’s</string> + <string name="analysis_channel_name">Media indexeren</string> + <string name="analysis_notification_default_title">Media indexeren</string> + <string name="analysis_notification_action_stop">Stoppen</string> + <string name="map_shortcut_short_label">Kaart</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-nn/strings.xml b/android/app/src/main/res/values-nn/strings.xml new file mode 100644 index 0000000..615c9eb --- /dev/null +++ b/android/app/src/main/res/values-nn/strings.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Bileteramme</string> + <string name="wallpaper">Bakgrunnsbilete</string> + <string name="search_shortcut_short_label">Søk</string> + <string name="videos_shortcut_short_label">Videoar</string> + <string name="analysis_channel_name">Mediasøking</string> + <string name="analysis_notification_default_title">Søkjer igjennom media</string> + <string name="analysis_notification_action_stop">Stogg</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-or/strings.xml b/android/app/src/main/res/values-or/strings.xml new file mode 100644 index 0000000..bec8cc7 --- /dev/null +++ b/android/app/src/main/res/values-or/strings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="search_shortcut_short_label">ସନ୍ଧାନ</string> +</resources> diff --git a/android/app/src/main/res/values-pl/strings.xml b/android/app/src/main/res/values-pl/strings.xml new file mode 100644 index 0000000..1cc7a69 --- /dev/null +++ b/android/app/src/main/res/values-pl/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_widget_label">Ramka Zdjęcia</string> + <string name="search_shortcut_short_label">Szukaj</string> + <string name="videos_shortcut_short_label">Wideo</string> + <string name="analysis_channel_name">Przeskanuj multimedia</string> + <string name="analysis_notification_default_title">Skanowanie multimediów</string> + <string name="analysis_notification_action_stop">Zatrzymaj</string> + <string name="app_name">Aves</string> + <string name="wallpaper">Tapeta</string> + <string name="map_shortcut_short_label">Mapa</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-pt/strings.xml b/android/app/src/main/res/values-pt/strings.xml new file mode 100644 index 0000000..a793c01 --- /dev/null +++ b/android/app/src/main/res/values-pt/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Porta-retratos</string> + <string name="wallpaper">Papel de parede</string> + <string name="search_shortcut_short_label">Procurar</string> + <string name="videos_shortcut_short_label">Vídeos</string> + <string name="analysis_channel_name">Digitalização de mídia</string> + <string name="analysis_notification_default_title">Digitalizando mídia</string> + <string name="analysis_notification_action_stop">Pare</string> + <string name="map_shortcut_short_label">Mapa</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-ro/strings.xml b/android/app/src/main/res/values-ro/strings.xml new file mode 100644 index 0000000..7334d4c --- /dev/null +++ b/android/app/src/main/res/values-ro/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Rama foto</string> + <string name="wallpaper">Tapet</string> + <string name="videos_shortcut_short_label">Videoclipuri</string> + <string name="analysis_channel_name">Scanare media</string> + <string name="analysis_notification_default_title">Scanarea suporturilor</string> + <string name="analysis_notification_action_stop">Stop</string> + <string name="search_shortcut_short_label">Căutare</string> + <string name="map_shortcut_short_label">Hartă</string> +</resources> diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml new file mode 100644 index 0000000..ca3cde8 --- /dev/null +++ b/android/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Фоторамка</string> + <string name="wallpaper">Обои</string> + <string name="search_shortcut_short_label">Поиск</string> + <string name="videos_shortcut_short_label">Видео</string> + <string name="analysis_channel_name">Сканировать медия</string> + <string name="analysis_notification_default_title">Сканирование медиа</string> + <string name="analysis_notification_action_stop">Стоп</string> + <string name="map_shortcut_short_label">Карта</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-sat/strings.xml b/android/app/src/main/res/values-sat/strings.xml new file mode 100644 index 0000000..5383771 --- /dev/null +++ b/android/app/src/main/res/values-sat/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">ᱮᱣᱥ</string> + <string name="app_widget_label">ᱪᱤᱛᱟᱹᱨ ᱯᱷᱨᱮᱢ</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-sk/strings.xml b/android/app/src/main/res/values-sk/strings.xml new file mode 100644 index 0000000..a6c5056 --- /dev/null +++ b/android/app/src/main/res/values-sk/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="search_shortcut_short_label">Hľadať</string> + <string name="app_name">Aves</string> + <string name="app_widget_label">Rám fotky</string> + <string name="wallpaper">Tapeta</string> + <string name="videos_shortcut_short_label">Videá</string> + <string name="analysis_notification_action_stop">Zastaviť</string> + <string name="analysis_channel_name">Skenovanie médií</string> + <string name="analysis_notification_default_title">Skenovanie média</string> + <string name="map_shortcut_short_label">Mapa</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-sl/strings.xml b/android/app/src/main/res/values-sl/strings.xml new file mode 100644 index 0000000..dd0bce1 --- /dev/null +++ b/android/app/src/main/res/values-sl/strings.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_widget_label">Okvir za sliko</string> + <string name="app_name">Aves</string> + <string name="videos_shortcut_short_label">Videoposnetki</string> + <string name="wallpaper">Ozadje</string> + <string name="search_shortcut_short_label">Iskanje</string> + <string name="analysis_notification_default_title">Skeniram medijske datoteke</string> + <string name="analysis_notification_action_stop">Ustavi</string> + <string name="analysis_channel_name">Sken za medijske datoteke</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-sr/strings.xml b/android/app/src/main/res/values-sr/strings.xml new file mode 100644 index 0000000..b03879d --- /dev/null +++ b/android/app/src/main/res/values-sr/strings.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_widget_label">Okvir Slike</string> + <string name="wallpaper">Pozadina</string> + <string name="videos_shortcut_short_label">Snimci</string> + <string name="analysis_channel_name">Pretraga medija</string> + <string name="analysis_notification_default_title">Skeniranje medija</string> + <string name="analysis_notification_action_stop">Stop</string> + <string name="app_name">Aves</string> + <string name="search_shortcut_short_label">Pretraga</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-sv/strings.xml b/android/app/src/main/res/values-sv/strings.xml new file mode 100644 index 0000000..fb447ef --- /dev/null +++ b/android/app/src/main/res/values-sv/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Fotoram</string> + <string name="wallpaper">Bakgrund</string> + <string name="videos_shortcut_short_label">Videor</string> + <string name="analysis_channel_name">Media scanning</string> + <string name="analysis_notification_default_title">Scannar media</string> + <string name="analysis_notification_action_stop">Stopp</string> + <string name="search_shortcut_short_label">Sök</string> + <string name="map_shortcut_short_label">Karta</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-ta/strings.xml b/android/app/src/main/res/values-ta/strings.xml new file mode 100644 index 0000000..ca82090 --- /dev/null +++ b/android/app/src/main/res/values-ta/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">ஏவ்ச்</string> + <string name="app_widget_label">புகைப்பட சட்டகம்</string> + <string name="wallpaper">வால்பேப்பர்</string> + <string name="map_shortcut_short_label">வரைபடம்</string> + <string name="search_shortcut_short_label">தேடல்</string> + <string name="analysis_notification_default_title">ஊடக ச்கேனிங்</string> + <string name="videos_shortcut_short_label">வீடியோக்கள்</string> + <string name="analysis_channel_name">மீடியா ச்கேன்</string> + <string name="analysis_notification_action_stop">நிறுத்து</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-th/strings.xml b/android/app/src/main/res/values-th/strings.xml new file mode 100644 index 0000000..2ac9295 --- /dev/null +++ b/android/app/src/main/res/values-th/strings.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">กรอบรูป</string> + <string name="wallpaper">ภาพพื้นหลัง</string> + <string name="search_shortcut_short_label">ค้นหา</string> + <string name="videos_shortcut_short_label">วิดีโอ</string> + <string name="analysis_channel_name">สแกนสื่อบันเทิง</string> + <string name="analysis_notification_default_title">กำลังสแกนสื่อบันเทิง</string> + <string name="analysis_notification_action_stop">หยุด</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-tr/strings.xml b/android/app/src/main/res/values-tr/strings.xml new file mode 100644 index 0000000..c115ff9 --- /dev/null +++ b/android/app/src/main/res/values-tr/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Fotoğraf Çerçevesi</string> + <string name="wallpaper">Duvar kağıdı</string> + <string name="search_shortcut_short_label">Arama</string> + <string name="videos_shortcut_short_label">Videolar</string> + <string name="analysis_channel_name">Medya tarama</string> + <string name="analysis_notification_default_title">Medya taranıyor</string> + <string name="analysis_notification_action_stop">Durdur</string> + <string name="map_shortcut_short_label">Harita</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-uk/strings.xml b/android/app/src/main/res/values-uk/strings.xml new file mode 100644 index 0000000..60717a3 --- /dev/null +++ b/android/app/src/main/res/values-uk/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="wallpaper">Шпалери</string> + <string name="search_shortcut_short_label">Пошук</string> + <string name="videos_shortcut_short_label">Відео</string> + <string name="analysis_channel_name">Сканувати медіа</string> + <string name="analysis_notification_action_stop">Стоп</string> + <string name="app_widget_label">Фоторамка</string> + <string name="analysis_notification_default_title">Сканування медіа</string> + <string name="map_shortcut_short_label">Мапа</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-ur/strings.xml b/android/app/src/main/res/values-ur/strings.xml new file mode 100644 index 0000000..68d8716 --- /dev/null +++ b/android/app/src/main/res/values-ur/strings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> +</resources> diff --git a/android/app/src/main/res/values-vi/strings.xml b/android/app/src/main/res/values-vi/strings.xml new file mode 100644 index 0000000..96db6a4 --- /dev/null +++ b/android/app/src/main/res/values-vi/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="analysis_notification_action_stop">Dừng</string> + <string name="app_widget_label">Khung Ảnh</string> + <string name="analysis_notification_default_title">Đang quét phương tiện</string> + <string name="videos_shortcut_short_label">Video</string> + <string name="wallpaper">Hình nền</string> + <string name="app_name">Aves</string> + <string name="analysis_channel_name">Quét phương tiện</string> + <string name="search_shortcut_short_label">Tìm kiếm</string> + <string name="map_shortcut_short_label">Bản đồ</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-zh-rTW/strings.xml b/android/app/src/main/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000..bf3e0c4 --- /dev/null +++ b/android/app/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="videos_shortcut_short_label">影片</string> + <string name="wallpaper">桌布</string> + <string name="analysis_notification_default_title">掃描媒體中</string> + <string name="app_name">Aves</string> + <string name="app_widget_label">相框</string> + <string name="search_shortcut_short_label">搜尋</string> + <string name="analysis_channel_name">媒體掃描</string> + <string name="analysis_notification_action_stop">停止</string> + <string name="map_shortcut_short_label">地圖</string> +</resources> diff --git a/android/app/src/main/res/values-zh/strings.xml b/android/app/src/main/res/values-zh/strings.xml new file mode 100644 index 0000000..70b8d1c --- /dev/null +++ b/android/app/src/main/res/values-zh/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">相框</string> + <string name="wallpaper">壁纸</string> + <string name="search_shortcut_short_label">搜索</string> + <string name="videos_shortcut_short_label">视频</string> + <string name="analysis_channel_name">媒体扫描</string> + <string name="analysis_notification_default_title">正在扫描媒体</string> + <string name="analysis_notification_action_stop">停止</string> + <string name="map_shortcut_short_label">地图</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..8c34775 --- /dev/null +++ b/android/app/src/main/res/values/colors.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="ic_launcher_background">#FFFFFF</color> + <color name="ic_shortcut_background">#FFFFFF</color> + <color name="ic_shortcut_foreground">#455A64</color> + <color name="ic_launcher_flavour">#1cc8eb</color> + <color name="window_background_day">#FFFFFF</color> + <color name="window_background_night">#262626</color> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..286ae61 --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Photo Frame</string> + <string name="wallpaper">Wallpaper</string> + <string name="map_shortcut_short_label">Map</string> + <string name="search_shortcut_short_label">Search</string> + <string name="videos_shortcut_short_label">Videos</string> + <string name="analysis_channel_name">Media scan</string> + <string name="analysis_notification_default_title">Scanning media</string> + <string name="analysis_notification_action_stop">Stop</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..2dec2e5 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:tools="http://schemas.android.com/tools"> + + <style name="NormalTheme" parent="Theme.AppCompat.Light.NoActionBar"> + <item name="android:windowBackground">@color/window_background_day</item> + <item name="android:windowSplashScreenBackground" tools:targetApi="31">@color/window_background_day</item> + <item name="android:windowSplashScreenAnimatedIcon" tools:targetApi="31">@drawable/ic_launcher_splash</item> + <item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="28">shortEdges</item> + </style> + + <!-- ⭐ Tema trasparente per CastActivity --> + <style name="Theme.Transparent" parent="Theme.AppCompat.Light.NoActionBar"> + <item name="android:windowIsTranslucent">true</item> + <item name="android:windowBackground">@android:color/transparent</item> + <item name="android:windowNoTitle">true</item> + <item name="android:backgroundDimEnabled">false</item> + </style> + +</resources> diff --git a/android/app/src/main/res/xml/app_widget_info.xml b/android/app/src/main/res/xml/app_widget_info.xml new file mode 100644 index 0000000..65a75eb --- /dev/null +++ b/android/app/src/main/res/xml/app_widget_info.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:configure="deckers.thibault.aves.HomeWidgetSettingsActivity" + android:initialLayout="@layout/app_widget" + android:minWidth="40dp" + android:minHeight="40dp" + android:resizeMode="horizontal|vertical" + android:targetCellWidth="2" + android:targetCellHeight="2" + android:updatePeriodMillis="3600000" + android:widgetCategory="home_screen" + android:widgetFeatures="reconfigurable" + tools:targetApi="31" /> \ No newline at end of file diff --git a/android/app/src/main/res/xml/data_extraction_rules.xml b/android/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..9f73294 --- /dev/null +++ b/android/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<data-extraction-rules> + <cloud-backup disableIfNoEncryptionCapabilities="true"> + <include + domain="file" + path="." /> + <include + domain="database" + path="." /> + <include + domain="external" + path="." /> + <include + domain="sharedpref" + path="." /> + <exclude + domain="sharedpref" + path="secret_shared_prefs.xml" /> + </cloud-backup> + <device-transfer> + <include + domain="file" + path="." /> + <include + domain="database" + path="." /> + <include + domain="external" + path="." /> + <include + domain="sharedpref" + path="." /> + <exclude + domain="sharedpref" + path="secret_shared_prefs.xml" /> + </device-transfer> +</data-extraction-rules> diff --git a/android/app/src/main/res/xml/full_backup_content.xml b/android/app/src/main/res/xml/full_backup_content.xml new file mode 100644 index 0000000..5e5ca09 --- /dev/null +++ b/android/app/src/main/res/xml/full_backup_content.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<full-backup-content> + <include + domain="file" + path="." /> + <include + domain="database" + path="." /> + <include + domain="external" + path="." /> + <include + domain="sharedpref" + path="." /> + <exclude + domain="sharedpref" + path="secret_shared_prefs.xml" /> +</full-backup-content> diff --git a/android/app/src/main/res/xml/provider_paths.xml b/android/app/src/main/res/xml/provider_paths.xml new file mode 100644 index 0000000..168574e --- /dev/null +++ b/android/app/src/main/res/xml/provider_paths.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<paths> + <!-- `external-path` only covers files on regular device storage --> + <external-path + name="external" + path="." /> + + <!-- `root-path` is necessary to cover files on removable storage --> + <!-- cf https://iditect.com/article/fileprovider-for-android-get-content-uri-through-fileprovider.html --> + <!--suppress AndroidElementNotAllowed --> + <root-path + name="root" + path="." /> + + <!-- embedded images & other media that are exported for viewing and sharing --> + <cache-path + name="embedded" + path="." /> +</paths> \ No newline at end of file diff --git a/android/app/src/main/res/xml/screen_saver.xml b/android/app/src/main/res/xml/screen_saver.xml new file mode 100644 index 0000000..d1de689 --- /dev/null +++ b/android/app/src/main/res/xml/screen_saver.xml @@ -0,0 +1,2 @@ +<dream xmlns:android="http://schemas.android.com/apk/res/android" + android:settingsActivity="@string/screen_saver_settings_activity" /> \ No newline at end of file diff --git a/android/app/src/main/res/xml/searchable.xml b/android/app/src/main/res/xml/searchable.xml new file mode 100644 index 0000000..d86475b --- /dev/null +++ b/android/app/src/main/res/xml/searchable.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<searchable xmlns:android="http://schemas.android.com/apk/res/android" + android:includeInGlobalSearch="true" + android:label="@string/app_name" + android:searchSuggestAuthority="@string/search_provider" + android:searchSuggestIntentAction="android.intent.action.SEARCH" + android:searchSuggestSelection=" ?" + android:searchSuggestThreshold="3" /> diff --git a/android/app/src/profile/res/values/colors.xml b/android/app/src/profile/res/values/colors.xml new file mode 100644 index 0000000..9981f6c --- /dev/null +++ b/android/app/src/profile/res/values/colors.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="ic_launcher_flavour">#007A78</color> +</resources> \ No newline at end of file diff --git a/android/app/src/profile/res/values/strings.xml b/android/app/src/profile/res/values/strings.xml new file mode 100644 index 0000000..2190231 --- /dev/null +++ b/android/app/src/profile/res/values/strings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves [Profile]</string> +</resources> \ No newline at end of file diff --git a/android/app/src/test/kotlin/deckers/thibault/aves/model/provider/ImageProviderTest.kt b/android/app/src/test/kotlin/deckers/thibault/aves/model/provider/ImageProviderTest.kt new file mode 100644 index 0000000..14a126f --- /dev/null +++ b/android/app/src/test/kotlin/deckers/thibault/aves/model/provider/ImageProviderTest.kt @@ -0,0 +1,18 @@ +package deckers.thibault.aves.model.provider + +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import java.time.LocalDate +import java.time.Month +import java.util.TimeZone + +class ImageProviderTest { + @Test + fun imageProvider_CorrectEmailSimple_ReturnsTrue() { + val date = LocalDate.of(1990, Month.FEBRUARY, 11).toEpochDay() + assertEquals("+01:00", ImageProvider.getTimeZoneString(TimeZone.getTimeZone("Europe/Paris"), date)) + assertEquals("+00:00", ImageProvider.getTimeZoneString(TimeZone.getTimeZone("UTC"), date)) + assertEquals("+05:30", ImageProvider.getTimeZoneString(TimeZone.getTimeZone("Asia/Kolkata"), date)) + assertEquals("-06:00", ImageProvider.getTimeZoneString(TimeZone.getTimeZone("America/Chicago"), date)) + } +} diff --git a/android/app/src/test/kotlin/deckers/thibault/aves/utils/MathUtilsTest.kt b/android/app/src/test/kotlin/deckers/thibault/aves/utils/MathUtilsTest.kt new file mode 100644 index 0000000..48382cc --- /dev/null +++ b/android/app/src/test/kotlin/deckers/thibault/aves/utils/MathUtilsTest.kt @@ -0,0 +1,17 @@ +package deckers.thibault.aves.utils + +import deckers.thibault.aves.utils.MathUtils.highestPowerOf2 +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class MathUtilsTest { + @Test + fun mathUtils_highestPowerOf2() { + assertEquals(1024, highestPowerOf2(1024)) + assertEquals(32, highestPowerOf2(42)) + assertEquals(0, highestPowerOf2(0)) + assertEquals(0, highestPowerOf2(-42)) + assertEquals(0, highestPowerOf2(.5)) + assertEquals(1, highestPowerOf2(1.5)) + } +} diff --git a/android/build.gradle.kts b/android/build.gradle.kts new file mode 100644 index 0000000..bf8eca6 --- /dev/null +++ b/android/build.gradle.kts @@ -0,0 +1,55 @@ +buildscript { + extra["aves.useCrashlytics"] = gradle.startParameter.taskNames.any { it.contains("play", ignoreCase = true) } + + println("Tasks=${gradle.startParameter.taskNames}") + println("Extra=\n${extra.properties.entries.map { kv -> " ${kv.key}=${kv.value}" }.sorted().joinToString("\n")}") + + repositories { + google() + mavenCentral() + } + + dependencies { + classpath(libs.gradle) + + if (rootProject.extra["aves.useCrashlytics"] as Boolean) { + // GMS & Firebase Crashlytics (used by some flavors only) + classpath(libs.google.gms) + classpath(libs.google.firebase.crashlytics) + } + } +} + +plugins { + alias(libs.plugins.reproducible.builds) +} + +allprojects { + apply(plugin = "org.gradlex.reproducible-builds") + + repositories { + google() + mavenCentral() + } + +// gradle.projectsEvaluated { +// tasks.withType(JavaCompile) { +// options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" +// } +// } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register<Delete>("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/android/exifinterface/.gitignore b/android/exifinterface/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/android/exifinterface/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/android/exifinterface/LICENSE.txt b/android/exifinterface/LICENSE.txt new file mode 100644 index 0000000..e454a52 --- /dev/null +++ b/android/exifinterface/LICENSE.txt @@ -0,0 +1,178 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + diff --git a/android/exifinterface/build.gradle.kts b/android/exifinterface/build.gradle.kts new file mode 100644 index 0000000..4e782c6 --- /dev/null +++ b/android/exifinterface/build.gradle.kts @@ -0,0 +1,33 @@ +plugins { + // TODO TLAD find how to use `alias(libs.plugins.android.library)` + id("com.android.library") +} + +android { + namespace = "androidx.exifinterface.media" + compileSdk = 36 + + defaultConfig { + minSdk = 21 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + getByName("release") { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } +} + +dependencies { + implementation(libs.androidx.annotation) + implementation(libs.jspecify) +} \ No newline at end of file diff --git a/android/exifinterface/consumer-rules.pro b/android/exifinterface/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/android/exifinterface/proguard-rules.pro b/android/exifinterface/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/android/exifinterface/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/android/exifinterface/src/main/AndroidManifest.xml b/android/exifinterface/src/main/AndroidManifest.xml new file mode 100644 index 0000000..568741e --- /dev/null +++ b/android/exifinterface/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest /> \ No newline at end of file diff --git a/android/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterfaceFork.java b/android/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterfaceFork.java new file mode 100644 index 0000000..8ef48ac --- /dev/null +++ b/android/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterfaceFork.java @@ -0,0 +1,8561 @@ +/* + * Copyright 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.exifinterface.media; + +import static androidx.exifinterface.media.ExifInterfaceUtilsFork.closeFileDescriptor; +import static androidx.exifinterface.media.ExifInterfaceUtilsFork.closeQuietly; +import static androidx.exifinterface.media.ExifInterfaceUtilsFork.convertToLongArray; +import static androidx.exifinterface.media.ExifInterfaceUtilsFork.copy; +import static androidx.exifinterface.media.ExifInterfaceUtilsFork.parseSubSeconds; +import static androidx.exifinterface.media.ExifInterfaceUtilsFork.startsWith; +import static java.lang.annotation.ElementType.TYPE_USE; +import static java.nio.ByteOrder.BIG_ENDIAN; +import static java.nio.ByteOrder.LITTLE_ENDIAN; +import static java.nio.charset.StandardCharsets.UTF_8; + +import android.annotation.SuppressLint; +import android.content.res.AssetManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.location.Location; +import android.media.MediaDataSource; +import android.media.MediaMetadataRetriever; +import android.os.Build; +import android.system.Os; +import android.system.OsConstants; +import android.util.Log; +import android.util.Pair; + +import androidx.annotation.IntDef; +import androidx.annotation.RestrictTo; +import androidx.annotation.VisibleForTesting; +import androidx.exifinterface.media.ExifInterfaceUtilsFork.Api23Impl; + +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInput; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.EOFException; +import java.io.File; +import java.io.FileDescriptor; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FilterOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.charset.Charset; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.zip.CRC32; + +/* + * Forked from 'androidx.exifinterface:exifinterface:1.4.2' + * Named differently to let ExifInterface be loaded as subdependency. + * cf https://maven.google.com/web/index.html?q=exifinterface#androidx.exifinterface:exifinterface + * cf https://github.com/androidx/androidx/tree/androidx-main/exifinterface/exifinterface/src/main/java/androidx/exifinterface/media + */ + +/** + * This is a class for reading and writing Exif tags in various image file formats. + * + * <p>Supported for reading: JPEG, PNG, WebP, HEIC, DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW, + * RAF, AVIF (on API 31+). + * + * <p>Supported for writing: JPEG, PNG, WebP. + * + * <p> + * + * <h3>XMP Support</h3> + * <p> + * This class can read raw XMP data from the supported image file formats. + * + * <p>XMP data can be stored within Exif data (under tag 700), but many of the formats also define a + * separate storage location for XMP. ExifInterface handles this ambiguity as follows: + * + * <ul> + * <li><b>JPEG</b> + * <ul> + * <li>The XMP spec part 3 section 3.3.2 forbids the XMP tag (700) being present in the Exif + * segment of JPEG files (i.e. XMP should always be in a separate APP1 segment). + * <li>If XMP is present in both Exif and separate segments, the XMP from the Exif segment + * is returned from {@link #getAttributeBytes} and modifications to the XMP with {@link + * #setAttribute} are written back to the XMP in the Exif segment, the XMP in the + * separate segment is preserved unmodified. This is contrary to the spec described + * above (which suggests the standalone XMP should be preferred over the XMP in the Exif + * segment). + * <li>If XMP is not present in either location, and is added with {@link #setAttribute}, it + * is written as a standalone segment, in line with the spec described above. + * </ul> + * <li><b>HEIC & AVIF</b> + * <ul> + * <li>If XMP is present in both Exif and separate segments, the XMP from the separate + * segment is returned from {@link #getAttributeBytes}. + * </ul> + * </ul> + */ +public class ExifInterfaceFork { + // TLAD threshold for safer Exif attribute parsing + private static final int ATTRIBUTE_SIZE_DANGER_THRESHOLD = 3 * (1 << 20); // MB + + // TLAD available heap size, to check allocations + private long getAvailableHeapSize() { + final Runtime runtime = Runtime.getRuntime(); + return runtime.maxMemory() - (runtime.totalMemory() - runtime.freeMemory()); + } + + private static final String TAG = "ExifInterface"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + + // The Exif tag names. See JEITA CP-3451C specifications (Exif 2.3) Section 3-8. + // A. Tags related to image data structure + /** + * <p>The number of columns of image data, equal to the number of pixels per row. In JPEG + * compressed data, this tag shall not be used because a JPEG marker is used instead of it.</p> + * + * <ul> + * <li>Tag = 256</li> + * <li>Type = Unsigned short or Unsigned long</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_IMAGE_WIDTH = "ImageWidth"; + /** + * <p>The number of rows of image data. In JPEG compressed data, this tag shall not be used + * because a JPEG marker is used instead of it.</p> + * + * <ul> + * <li>Tag = 257</li> + * <li>Type = Unsigned short or Unsigned long</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_IMAGE_LENGTH = "ImageLength"; + /** + * <p>The number of bits per image component. In this standard each component of the image is + * 8 bits, so the value for this tag is 8. See also {@link #TAG_SAMPLES_PER_PIXEL}. In JPEG + * compressed data, this tag shall not be used because a JPEG marker is used instead of it.</p> + * + * <ul> + * <li>Tag = 258</li> + * <li>Type = Unsigned short</li> + * <li>Count = 3</li> + * <li>Default = {@link #BITS_PER_SAMPLE_RGB}</li> + * </ul> + */ + public static final String TAG_BITS_PER_SAMPLE = "BitsPerSample"; + /** + * <p>The compression scheme used for the image data. When a primary image is JPEG compressed, + * this designation is not necessary. So, this tag shall not be recorded. When thumbnails use + * JPEG compression, this tag value is set to 6.</p> + * + * <ul> + * <li>Tag = 259</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #DATA_UNCOMPRESSED + * @see #DATA_JPEG + */ + public static final String TAG_COMPRESSION = "Compression"; + /** + * <p>The pixel composition. In JPEG compressed data, this tag shall not be used because a JPEG + * marker is used instead of it.</p> + * + * <ul> + * <li>Tag = 262</li> + * <li>Type = SHORT</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #PHOTOMETRIC_INTERPRETATION_RGB + * @see #PHOTOMETRIC_INTERPRETATION_YCBCR + */ + public static final String TAG_PHOTOMETRIC_INTERPRETATION = "PhotometricInterpretation"; + /** + * <p>The image orientation viewed in terms of rows and columns.</p> + * + * <ul> + * <li>Tag = 274</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = {@link #ORIENTATION_NORMAL}</li> + * </ul> + * <p> + * + * @see #ORIENTATION_UNDEFINED + * @see #ORIENTATION_NORMAL + * @see #ORIENTATION_FLIP_HORIZONTAL + * @see #ORIENTATION_ROTATE_180 + * @see #ORIENTATION_FLIP_VERTICAL + * @see #ORIENTATION_TRANSPOSE + * @see #ORIENTATION_ROTATE_90 + * @see #ORIENTATION_TRANSVERSE + * @see #ORIENTATION_ROTATE_270 + */ + public static final String TAG_ORIENTATION = "Orientation"; + /** + * <p>The number of components per pixel. Since this standard applies to RGB and YCbCr images, + * the value set for this tag is 3. In JPEG compressed data, this tag shall not be used because + * a JPEG marker is used instead of it.</p> + * + * <ul> + * <li>Tag = 277</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = 3</li> + * </ul> + */ + public static final String TAG_SAMPLES_PER_PIXEL = "SamplesPerPixel"; + /** + * <p>Indicates whether pixel components are recorded in chunky or planar format. In JPEG + * compressed data, this tag shall not be used because a JPEG marker is used instead of it. + * If this field does not exist, the TIFF default, {@link #FORMAT_CHUNKY}, is assumed.</p> + * + * <ul> + * <li>Tag = 284</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * </ul> + * <p> + * + * @see #FORMAT_CHUNKY + * @see #FORMAT_PLANAR + */ + public static final String TAG_PLANAR_CONFIGURATION = "PlanarConfiguration"; + /** + * <p>The sampling ratio of chrominance components in relation to the luminance component. + * In JPEG compressed data a JPEG marker is used instead of this tag. So, this tag shall not + * be recorded.</p> + * + * <ul> + * <li>Tag = 530</li> + * <li>Type = Unsigned short</li> + * <li>Count = 2</li> + * <ul> + * <li>[2, 1] = YCbCr4:2:2</li> + * <li>[2, 2] = YCbCr4:2:0</li> + * <li>Other = reserved</li> + * </ul> + * </ul> + */ + public static final String TAG_Y_CB_CR_SUB_SAMPLING = "YCbCrSubSampling"; + /** + * <p>The position of chrominance components in relation to the luminance component. This field + * is designated only for JPEG compressed data or uncompressed YCbCr data. The TIFF default is + * {@link #Y_CB_CR_POSITIONING_CENTERED}; but when Y:Cb:Cr = 4:2:2 it is recommended in this + * standard that {@link #Y_CB_CR_POSITIONING_CO_SITED} be used to record data, in order to + * improve the image quality when viewed on TV systems. When this field does not exist, + * the reader shall assume the TIFF default. In the case of Y:Cb:Cr = 4:2:0, the TIFF default + * ({@link #Y_CB_CR_POSITIONING_CENTERED}) is recommended. If the Exif/DCF reader does not + * have the capability of supporting both kinds of positioning, it shall follow the TIFF + * default regardless of the value in this field. It is preferable that readers can support + * both centered and co-sited positioning.</p> + * + * <ul> + * <li>Tag = 531</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = {@link #Y_CB_CR_POSITIONING_CENTERED}</li> + * </ul> + * <p> + * + * @see #Y_CB_CR_POSITIONING_CENTERED + * @see #Y_CB_CR_POSITIONING_CO_SITED + */ + public static final String TAG_Y_CB_CR_POSITIONING = "YCbCrPositioning"; + /** + * <p>The number of pixels per {@link #TAG_RESOLUTION_UNIT} in the {@link #TAG_IMAGE_WIDTH} + * direction. When the image resolution is unknown, 72 [dpi] shall be designated.</p> + * + * <ul> + * <li>Tag = 282</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = 72</li> + * </ul> + * <p> + * + * @see #TAG_Y_RESOLUTION + * @see #TAG_RESOLUTION_UNIT + */ + public static final String TAG_X_RESOLUTION = "XResolution"; + /** + * <p>The number of pixels per {@link #TAG_RESOLUTION_UNIT} in the {@link #TAG_IMAGE_WIDTH} + * direction. The same value as {@link #TAG_X_RESOLUTION} shall be designated.</p> + * + * <ul> + * <li>Tag = 283</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = 72</li> + * </ul> + * <p> + * + * @see #TAG_X_RESOLUTION + * @see #TAG_RESOLUTION_UNIT + */ + public static final String TAG_Y_RESOLUTION = "YResolution"; + /** + * <p>The unit for measuring {@link #TAG_X_RESOLUTION} and {@link #TAG_Y_RESOLUTION}. The same + * unit is used for both {@link #TAG_X_RESOLUTION} and {@link #TAG_Y_RESOLUTION}. If the image + * resolution is unknown, {@link #RESOLUTION_UNIT_INCHES} shall be designated.</p> + * + * <ul> + * <li>Tag = 296</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = {@link #RESOLUTION_UNIT_INCHES}</li> + * </ul> + * <p> + * + * @see #RESOLUTION_UNIT_INCHES + * @see #RESOLUTION_UNIT_CENTIMETERS + * @see #TAG_X_RESOLUTION + * @see #TAG_Y_RESOLUTION + */ + public static final String TAG_RESOLUTION_UNIT = "ResolutionUnit"; + + // B. Tags related to recording offset + /** + * <p>For each strip, the byte offset of that strip. It is recommended that this be selected + * so the number of strip bytes does not exceed 64 KBytes.In the case of JPEG compressed data, + * this designation is not necessary. So, this tag shall not be recorded.</p> + * + * <ul> + * <li>Tag = 273</li> + * <li>Type = Unsigned short or Unsigned long</li> + * <li>Count = StripsPerImage (for {@link #FORMAT_CHUNKY}) + * or {@link #TAG_SAMPLES_PER_PIXEL} * StripsPerImage + * (for {@link #FORMAT_PLANAR})</li> + * <li>Default = None</li> + * </ul> + * + * <p>StripsPerImage = floor(({@link #TAG_IMAGE_LENGTH} + {@link #TAG_ROWS_PER_STRIP} - 1) + * / {@link #TAG_ROWS_PER_STRIP})</p> + * <p> + * + * @see #TAG_ROWS_PER_STRIP + * @see #TAG_STRIP_BYTE_COUNTS + */ + public static final String TAG_STRIP_OFFSETS = "StripOffsets"; + /** + * <p>The number of rows per strip. This is the number of rows in the image of one strip when + * an image is divided into strips. In the case of JPEG compressed data, this designation is + * not necessary. So, this tag shall not be recorded.</p> + * + * <ul> + * <li>Tag = 278</li> + * <li>Type = Unsigned short or Unsigned long</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #TAG_STRIP_OFFSETS + * @see #TAG_STRIP_BYTE_COUNTS + */ + public static final String TAG_ROWS_PER_STRIP = "RowsPerStrip"; + /** + * <p>The total number of bytes in each strip. In the case of JPEG compressed data, this + * designation is not necessary. So, this tag shall not be recorded.</p> + * + * <ul> + * <li>Tag = 279</li> + * <li>Type = Unsigned short or Unsigned long</li> + * <li>Count = StripsPerImage (when using {@link #FORMAT_CHUNKY}) + * or {@link #TAG_SAMPLES_PER_PIXEL} * StripsPerImage + * (when using {@link #FORMAT_PLANAR})</li> + * <li>Default = None</li> + * </ul> + * + * <p>StripsPerImage = floor(({@link #TAG_IMAGE_LENGTH} + {@link #TAG_ROWS_PER_STRIP} - 1) + * / {@link #TAG_ROWS_PER_STRIP})</p> + */ + public static final String TAG_STRIP_BYTE_COUNTS = "StripByteCounts"; + /** + * <p>The offset to the start byte (SOI) of JPEG compressed thumbnail data. This shall not be + * used for primary image JPEG data.</p> + * + * <ul> + * <li>Tag = 513</li> + * <li>Type = Unsigned long</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_JPEG_INTERCHANGE_FORMAT = "JPEGInterchangeFormat"; + /** + * <p>The number of bytes of JPEG compressed thumbnail data. This is not used for primary image + * JPEG data. JPEG thumbnails are not divided but are recorded as a continuous JPEG bitstream + * from SOI to EOI. APPn and COM markers should not be recorded. Compressed thumbnails shall be + * recorded in no more than 64 KBytes, including all other data to be recorded in APP1.</p> + * + * <ul> + * <li>Tag = 514</li> + * <li>Type = Unsigned long</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_JPEG_INTERCHANGE_FORMAT_LENGTH = "JPEGInterchangeFormatLength"; + + // C. Tags related to Image Data Characteristics + /** + * <p>A transfer function for the image, described in tabular style. Normally this tag need not + * be used, since color space is specified in {@link #TAG_COLOR_SPACE}.</p> + * + * <ul> + * <li>Tag = 301</li> + * <li>Type = Unsigned short</li> + * <li>Count = 3 * 256</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_TRANSFER_FUNCTION = "TransferFunction"; + /** + * <p>The chromaticity of the white point of the image. Normally this tag need not be used, + * since color space is specified in {@link #TAG_COLOR_SPACE}.</p> + * + * <ul> + * <li>Tag = 318</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 2</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_WHITE_POINT = "WhitePoint"; + /** + * <p>The chromaticity of the three primary colors of the image. Normally this tag need not + * be used, since color space is specified in {@link #TAG_COLOR_SPACE}.</p> + * + * <ul> + * <li>Tag = 319</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 6</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_PRIMARY_CHROMATICITIES = "PrimaryChromaticities"; + /** + * <p>The matrix coefficients for transformation from RGB to YCbCr image data. About + * the default value, please refer to JEITA CP-3451C Spec, Annex D.</p> + * + * <ul> + * <li>Tag = 529</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 3</li> + * </ul> + */ + public static final String TAG_Y_CB_CR_COEFFICIENTS = "YCbCrCoefficients"; + /** + * <p>The reference black point value and reference white point value. No defaults are given + * in TIFF, but the values below are given as defaults here. The color space is declared in + * a color space information tag, with the default being the value that gives the optimal image + * characteristics Interoperability these conditions</p> + * + * <ul> + * <li>Tag = 532</li> + * <li>Type = RATIONAL</li> + * <li>Count = 6</li> + * <li>Default = [0, 255, 0, 255, 0, 255] (when {@link #TAG_PHOTOMETRIC_INTERPRETATION} + * is {@link #PHOTOMETRIC_INTERPRETATION_RGB}) + * or [0, 255, 0, 128, 0, 128] (when {@link #TAG_PHOTOMETRIC_INTERPRETATION} + * is {@link #PHOTOMETRIC_INTERPRETATION_YCBCR})</li> + * </ul> + */ + public static final String TAG_REFERENCE_BLACK_WHITE = "ReferenceBlackWhite"; + + // D. Other tags + /** + * <p>The date and time of image creation. In this standard it is the date and time the file + * was changed. The format is "YYYY:MM:DD HH:MM:SS" with time shown in 24-hour format, and + * the date and time separated by one blank character ({@code 0x20}). When the date and time + * are unknown, all the character spaces except colons (":") should be filled with blank + * characters, or else the Interoperability field should be filled with blank characters. + * The character string length is 20 Bytes including NULL for termination. When the field is + * left blank, it is treated as unknown.</p> + * + * <ul> + * <li>Tag = 306</li> + * <li>Type = String</li> + * <li>Length = 19</li> + * <li>Default = None</li> + * </ul> + * + * <p>Note: The format "YYYY-MM-DD HH:MM:SS" is also supported for reading. For writing, + * however, calling {@link #setAttribute(String, String)} with the "YYYY-MM-DD HH:MM:SS" + * format will automatically convert it to the primary format, "YYYY:MM:DD HH:MM:SS". + */ + public static final String TAG_DATETIME = "DateTime"; + /** + * <p>An ASCII string giving the title of the image. It is possible to be added a comment + * such as "1988 company picnic" or the like. Two-byte character codes cannot be used. When + * a 2-byte code is necessary, {@link #TAG_USER_COMMENT} is to be used.</p> + * + * <ul> + * <li>Tag = 270</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_IMAGE_DESCRIPTION = "ImageDescription"; + /** + * <p>The manufacturer of the recording equipment. This is the manufacturer of the DSC, + * scanner, video digitizer or other equipment that generated the image. When the field is left + * blank, it is treated as unknown.</p> + * + * <ul> + * <li>Tag = 271</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_MAKE = "Make"; + /** + * <p>The model name or model number of the equipment. This is the model name of number of + * the DSC, scanner, video digitizer or other equipment that generated the image. When + * the field is left blank, it is treated as unknown.</p> + * + * <ul> + * <li>Tag = 272</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_MODEL = "Model"; + /** + * <p>This tag records the name and version of the software or firmware of the camera or image + * input device used to generate the image. The detailed format is not specified, but it is + * recommended that the example shown below be followed. When the field is left blank, it is + * treated as unknown.</p> + * + * <p>Ex.) "Exif Software Version 1.00a".</p> + * + * <ul> + * <li>Tag = 305</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_SOFTWARE = "Software"; + /** + * <p>This tag records the name of the camera owner, photographer or image creator. + * The detailed format is not specified, but it is recommended that the information be written + * as in the example below for ease of Interoperability. When the field is left blank, it is + * treated as unknown.</p> + * + * <p>Ex.) "Camera owner, John Smith; Photographer, Michael Brown; Image creator, + * Ken James"</p> + * + * <ul> + * <li>Tag = 315</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_ARTIST = "Artist"; + /** + * <p>Copyright information. In this standard the tag is used to indicate both the photographer + * and editor copyrights. It is the copyright notice of the person or organization claiming + * rights to the image. The Interoperability copyright statement including date and rights + * should be written in this field; e.g., "Copyright, John Smith, 19xx. All rights reserved." + * In this standard the field records both the photographer and editor copyrights, with each + * recorded in a separate part of the statement. When there is a clear distinction between + * the photographer and editor copyrights, these are to be written in the order of photographer + * followed by editor copyright, separated by NULL (in this case, since the statement also ends + * with a NULL, there are two NULL codes) (see example 1). When only the photographer copyright + * is given, it is terminated by one NULL code (see example 2). When only the editor copyright + * is given, the photographer copyright part consists of one space followed by a terminating + * NULL code, then the editor copyright is given (see example 3). When the field is left blank, + * it is treated as unknown.</p> + * + * <p>Ex. 1) When both the photographer copyright and editor copyright are given. + * <ul><li>Photographer copyright + NULL + editor copyright + NULL</li></ul></p> + * <p>Ex. 2) When only the photographer copyright is given. + * <ul><li>Photographer copyright + NULL</li></ul></p> + * <p>Ex. 3) When only the editor copyright is given. + * <ul><li>Space ({@code 0x20}) + NULL + editor copyright + NULL</li></ul></p> + * + * <ul> + * <li>Tag = 315</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_COPYRIGHT = "Copyright"; + + // Exif IFD Attribute Information + // A. Tags related to version + /** + * <p>The version of this standard supported. Nonexistence of this field is taken to mean + * nonconformance to the standard. In according with conformance to this standard, this tag + * shall be recorded like "0230” as 4-byte ASCII.</p> + * + * <ul> + * <li>Tag = 36864</li> + * <li>Type = Undefined</li> + * <li>Length = 4</li> + * <li>Default = "0230"</li> + * </ul> + */ + public static final String TAG_EXIF_VERSION = "ExifVersion"; + /** + * <p>The Flashpix format version supported by a FPXR file. If the FPXR function supports + * Flashpix format Ver. 1.0, this is indicated similarly to {@link #TAG_EXIF_VERSION} by + * recording "0100" as 4-byte ASCII.</p> + * + * <ul> + * <li>Tag = 40960</li> + * <li>Type = Undefined</li> + * <li>Length = 4</li> + * <li>Default = "0100"</li> + * </ul> + */ + public static final String TAG_FLASHPIX_VERSION = "FlashpixVersion"; + + // B. Tags related to image data characteristics + /** + * <p>The color space information tag is always recorded as the color space specifier. + * Normally {@link #COLOR_SPACE_S_RGB} is used to define the color space based on the PC + * monitor conditions and environment. If a color space other than {@link #COLOR_SPACE_S_RGB} + * is used, {@link #COLOR_SPACE_UNCALIBRATED} is set. Image data recorded as + * {@link #COLOR_SPACE_UNCALIBRATED} may be treated as {@link #COLOR_SPACE_S_RGB} when it is + * converted to Flashpix.</p> + * + * <ul> + * <li>Tag = 40961</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * </ul> + * <p> + * + * @see #COLOR_SPACE_S_RGB + * @see #COLOR_SPACE_UNCALIBRATED + */ + public static final String TAG_COLOR_SPACE = "ColorSpace"; + /** + * <p>Indicates the value of coefficient gamma. The formula of transfer function used for image + * reproduction is expressed as follows.</p> + * + * <p>(Reproduced value) = (Input value) ^ gamma</p> + * + * <p>Both reproduced value and input value indicate normalized value, whose minimum value is + * 0 and maximum value is 1.</p> + * + * <ul> + * <li>Tag = 42240</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GAMMA = "Gamma"; + + // C. Tags related to image configuration + /** + * <p>Information specific to compressed data. When a compressed file is recorded, the valid + * width of the meaningful image shall be recorded in this tag, whether or not there is padding + * data or a restart marker. This tag shall not exist in an uncompressed file.</p> + * + * <ul> + * <li>Tag = 40962</li> + * <li>Type = Unsigned short or Unsigned long</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_PIXEL_X_DIMENSION = "PixelXDimension"; + /** + * <p>Information specific to compressed data. When a compressed file is recorded, the valid + * height of the meaningful image shall be recorded in this tag, whether or not there is + * padding data or a restart marker. This tag shall not exist in an uncompressed file. + * Since data padding is unnecessary in the vertical direction, the number of lines recorded + * in this valid image height tag will in fact be the same as that recorded in the SOF.</p> + * + * <ul> + * <li>Tag = 40963</li> + * <li>Type = Unsigned short or Unsigned long</li> + * <li>Count = 1</li> + * </ul> + */ + public static final String TAG_PIXEL_Y_DIMENSION = "PixelYDimension"; + /** + * <p>Information specific to compressed data. The channels of each component are arranged + * in order from the 1st component to the 4th. For uncompressed data the data arrangement is + * given in the {@link #TAG_PHOTOMETRIC_INTERPRETATION}. However, since + * {@link #TAG_PHOTOMETRIC_INTERPRETATION} can only express the order of Y, Cb and Cr, this tag + * is provided for cases when compressed data uses components other than Y, Cb, and Cr and to + * enable support of other sequences.</p> + * + * <ul> + * <li>Tag = 37121</li> + * <li>Type = Undefined</li> + * <li>Length = 4</li> + * <li>Default = 4 5 6 0 (if RGB uncompressed) or 1 2 3 0 (other cases)</li> + * <ul> + * <li>0 = does not exist</li> + * <li>1 = Y</li> + * <li>2 = Cb</li> + * <li>3 = Cr</li> + * <li>4 = R</li> + * <li>5 = G</li> + * <li>6 = B</li> + * <li>other = reserved</li> + * </ul> + * </ul> + */ + public static final String TAG_COMPONENTS_CONFIGURATION = "ComponentsConfiguration"; + /** + * <p>Information specific to compressed data. The compression mode used for a compressed image + * is indicated in unit bits per pixel.</p> + * + * <ul> + * <li>Tag = 37122</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_COMPRESSED_BITS_PER_PIXEL = "CompressedBitsPerPixel"; + + // D. Tags related to user information + /** + * <p>A tag for manufacturers of Exif/DCF writers to record any desired information. + * The contents are up to the manufacturer, but this tag shall not be used for any other than + * its intended purpose.</p> + * + * <ul> + * <li>Tag = 37500</li> + * <li>Type = Undefined</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_MAKER_NOTE = "MakerNote"; + /** + * <p>A tag for Exif users to write keywords or comments on the image besides those in + * {@link #TAG_IMAGE_DESCRIPTION}, and without the character code limitations of it.</p> + * + * <ul> + * <li>Tag = 37510</li> + * <li>Type = Undefined</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_USER_COMMENT = "UserComment"; + + // E. Tags related to related file information + /** + * <p>This tag is used to record the name of an audio file related to the image data. The only + * relational information recorded here is the Exif audio file name and extension (an ASCII + * string consisting of 8 characters + '.' + 3 characters). The path is not recorded.</p> + * + * <p>When using this tag, audio files shall be recorded in conformance to the Exif audio + * format. Writers can also store the data such as Audio within APP2 as Flashpix extension + * stream data. Audio files shall be recorded in conformance to the Exif audio format.</p> + * + * <ul> + * <li>Tag = 40964</li> + * <li>Type = String</li> + * <li>Length = 12</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_RELATED_SOUND_FILE = "RelatedSoundFile"; + + // F. Tags related to date and time + /** + * <p>The date and time when the original image data was generated. For a DSC the date and time + * the picture was taken are recorded. The format is "YYYY:MM:DD HH:MM:SS" with time shown in + * 24-hour format, and the date and time separated by one blank character ({@code 0x20}). + * When the date and time are unknown, all the character spaces except colons (":") should be + * filled with blank characters, or else the Interoperability field should be filled with blank + * characters. When the field is left blank, it is treated as unknown.</p> + * + * <ul> + * <li>Tag = 36867</li> + * <li>Type = String</li> + * <li>Length = 19</li> + * <li>Default = None</li> + * </ul> + * + * <p>Note: The format "YYYY-MM-DD HH:MM:SS" is also supported for reading. For writing, + * however, calling {@link #setAttribute(String, String)} with the "YYYY-MM-DD HH:MM:SS" + * format will automatically convert it to the primary format, "YYYY:MM:DD HH:MM:SS". + */ + public static final String TAG_DATETIME_ORIGINAL = "DateTimeOriginal"; + /** + * <p>The date and time when the image was stored as digital data. If, for example, an image + * was captured by DSC and at the same time the file was recorded, then + * {@link #TAG_DATETIME_ORIGINAL} and this tag will have the same contents. The format is + * "YYYY:MM:DD HH:MM:SS" with time shown in 24-hour format, and the date and time separated by + * one blank character ({@code 0x20}). When the date and time are unknown, all the character + * spaces except colons (":")should be filled with blank characters, or else + * the Interoperability field should be filled with blank characters. When the field is left + * blank, it is treated as unknown.</p> + * + * <ul> + * <li>Tag = 36868</li> + * <li>Type = String</li> + * <li>Length = 19</li> + * <li>Default = None</li> + * </ul> + * + * <p>Note: The format "YYYY-MM-DD HH:MM:SS" is also supported for reading. For writing, + * however, calling {@link #setAttribute(String, String)} with the "YYYY-MM-DD HH:MM:SS" + * format will automatically convert it to the primary format, "YYYY:MM:DD HH:MM:SS". + */ + public static final String TAG_DATETIME_DIGITIZED = "DateTimeDigitized"; + /** + * <p>A tag used to record the offset from UTC (the time difference from Universal Time + * Coordinated including daylight saving time) of the time of DateTime tag. The format when + * recording the offset is "±HH:MM". The part of "±" shall be recorded as "+" or "-". When + * the offsets are unknown, all the character spaces except colons (":") should be filled + * with blank characters, or else the Interoperability field should be filled with blank + * characters. The character string length is 7 Bytes including NULL for termination. When + * the field is left blank, it is treated as unknown.</p> + * + * <ul> + * <li>Tag = 36880</li> + * <li>Type = String</li> + * <li>Length = 7</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_OFFSET_TIME = "OffsetTime"; + /** + * <p>A tag used to record the offset from UTC (the time difference from Universal Time + * Coordinated including daylight saving time) of the time of DateTimeOriginal tag. The format + * when recording the offset is "±HH:MM". The part of "±" shall be recorded as "+" or "-". When + * the offsets are unknown, all the character spaces except colons (":") should be filled + * with blank characters, or else the Interoperability field should be filled with blank + * characters. The character string length is 7 Bytes including NULL for termination. When + * the field is left blank, it is treated as unknown.</p> + * + * <ul> + * <li>Tag = 36881</li> + * <li>Type = String</li> + * <li>Length = 7</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_OFFSET_TIME_ORIGINAL = "OffsetTimeOriginal"; + /** + * <p>A tag used to record the offset from UTC (the time difference from Universal Time + * Coordinated including daylight saving time) of the time of DateTimeDigitized tag. The format + * when recording the offset is "±HH:MM". The part of "±" shall be recorded as "+" or "-". When + * the offsets are unknown, all the character spaces except colons (":") should be filled + * with blank characters, or else the Interoperability field should be filled with blank + * characters. The character string length is 7 Bytes including NULL for termination. When + * the field is left blank, it is treated as unknown.</p> + * + * <ul> + * <li>Tag = 36882</li> + * <li>Type = String</li> + * <li>Length = 7</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_OFFSET_TIME_DIGITIZED = "OffsetTimeDigitized"; + /** + * <p>A tag used to record fractions of seconds for {@link #TAG_DATETIME}.</p> + * + * <ul> + * <li>Tag = 37520</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_SUBSEC_TIME = "SubSecTime"; + /** + * <p>A tag used to record fractions of seconds for {@link #TAG_DATETIME_ORIGINAL}.</p> + * + * <ul> + * <li>Tag = 37521</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_SUBSEC_TIME_ORIGINAL = "SubSecTimeOriginal"; + /** + * <p>A tag used to record fractions of seconds for {@link #TAG_DATETIME_DIGITIZED}.</p> + * + * <ul> + * <li>Tag = 37522</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_SUBSEC_TIME_DIGITIZED = "SubSecTimeDigitized"; + + // G. Tags related to picture-taking condition + /** + * Exposure time, given in seconds. + * + * <p>Note: For backwards compatibility this attribute is returned from {@link + * #getAttribute(String)} in decimal form (i.e. the format produced by {@link + * Double#toString(double)}). It is accepted into {@link #setAttribute(String, String)} in both + * rational (e.g. {@code "1/3"}) and decimal forms. The decimal format is anything accepted by + * {@link Double#parseDouble(String)}, e.g. {@code "0.125"}. + * + * <ul> + * <li>Tag = 33434 + * <li>Type = Unsigned rational + * <li>Count = 1 + * <li>Default = None + * </ul> + */ + public static final String TAG_EXPOSURE_TIME = "ExposureTime"; + + /** + * The F number. + * + * <p>Note: For backwards compatibility this attribute is returned from {@link + * #getAttribute(String)} in decimal form (i.e. the format produced by {@link + * Double#toString(double)}). It is accepted into {@link #setAttribute(String, String)} in both + * rational (e.g. {@code "1/3"}) and decimal forms. The decimal format is anything accepted by + * {@link Double#parseDouble(String)}, e.g. {@code "0.125"}. + * + * <ul> + * <li>Tag = 33437 + * <li>Type = Unsigned rational + * <li>Count = 1 + * <li>Default = None + * </ul> + */ + public static final String TAG_F_NUMBER = "FNumber"; + + /** + * <p>The class of the program used by the camera to set exposure when the picture is taken. + * The tag values are as follows.</p> + * + * <ul> + * <li>Tag = 34850</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = {@link #EXPOSURE_PROGRAM_NOT_DEFINED}</li> + * </ul> + * <p> + * + * @see #EXPOSURE_PROGRAM_NOT_DEFINED + * @see #EXPOSURE_PROGRAM_MANUAL + * @see #EXPOSURE_PROGRAM_NORMAL + * @see #EXPOSURE_PROGRAM_APERTURE_PRIORITY + * @see #EXPOSURE_PROGRAM_SHUTTER_PRIORITY + * @see #EXPOSURE_PROGRAM_CREATIVE + * @see #EXPOSURE_PROGRAM_ACTION + * @see #EXPOSURE_PROGRAM_PORTRAIT_MODE + * @see #EXPOSURE_PROGRAM_LANDSCAPE_MODE + */ + public static final String TAG_EXPOSURE_PROGRAM = "ExposureProgram"; + /** + * <p>Indicates the spectral sensitivity of each channel of the camera used. The tag value is + * an ASCII string compatible with the standard developed by the ASTM Technical committee.</p> + * + * <ul> + * <li>Tag = 34852</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_SPECTRAL_SENSITIVITY = "SpectralSensitivity"; + /** + * @see #TAG_PHOTOGRAPHIC_SENSITIVITY + * @deprecated Use {@link #TAG_PHOTOGRAPHIC_SENSITIVITY} instead. + */ + @Deprecated + public static final String TAG_ISO_SPEED_RATINGS = "ISOSpeedRatings"; + /** + * <p>This tag indicates the sensitivity of the camera or input device when the image was shot. + * More specifically, it indicates one of the following values that are parameters defined in + * ISO 12232: standard output sensitivity (SOS), recommended exposure index (REI), or ISO + * speed. Accordingly, if a tag corresponding to a parameter that is designated by + * {@link #TAG_SENSITIVITY_TYPE} is recorded, the values of the tag and of this tag are + * the same. However, if the value is 65535 or higher, the value of this tag shall be 65535. + * When recording this tag, {@link #TAG_SENSITIVITY_TYPE} should also be recorded. In addition, + * while “Count = Any”, only 1 count should be used when recording this tag.</p> + * + * <ul> + * <li>Tag = 34855</li> + * <li>Type = Unsigned short</li> + * <li>Count = Any</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_PHOTOGRAPHIC_SENSITIVITY = "PhotographicSensitivity"; + /** + * <p>Indicates the Opto-Electric Conversion Function (OECF) specified in ISO 14524. OECF is + * the relationship between the camera optical input and the image values.</p> + * + * <ul> + * <li>Tag = 34856</li> + * <li>Type = Undefined</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_OECF = "OECF"; + /** + * <p>This tag indicates which one of the parameters of ISO12232 is + * {@link #TAG_PHOTOGRAPHIC_SENSITIVITY}. Although it is an optional tag, it should be recorded + * when {@link #TAG_PHOTOGRAPHIC_SENSITIVITY} is recorded.</p> + * + * <ul> + * <li>Tag = 34864</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #SENSITIVITY_TYPE_UNKNOWN + * @see #SENSITIVITY_TYPE_SOS + * @see #SENSITIVITY_TYPE_REI + * @see #SENSITIVITY_TYPE_ISO_SPEED + * @see #SENSITIVITY_TYPE_SOS_AND_REI + * @see #SENSITIVITY_TYPE_SOS_AND_ISO + * @see #SENSITIVITY_TYPE_REI_AND_ISO + * @see #SENSITIVITY_TYPE_SOS_AND_REI_AND_ISO + */ + public static final String TAG_SENSITIVITY_TYPE = "SensitivityType"; + /** + * <p>This tag indicates the standard output sensitivity value of a camera or input device + * defined in ISO 12232. When recording this tag, {@link #TAG_PHOTOGRAPHIC_SENSITIVITY} and + * {@link #TAG_SENSITIVITY_TYPE} shall also be recorded.</p> + * + * <ul> + * <li>Tag = 34865</li> + * <li>Type = Unsigned long</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_STANDARD_OUTPUT_SENSITIVITY = "StandardOutputSensitivity"; + /** + * <p>This tag indicates the recommended exposure index value of a camera or input device + * defined in ISO 12232. When recording this tag, {@link #TAG_PHOTOGRAPHIC_SENSITIVITY} and + * {@link #TAG_SENSITIVITY_TYPE} shall also be recorded.</p> + * + * <ul> + * <li>Tag = 34866</li> + * <li>Type = Unsigned long</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_RECOMMENDED_EXPOSURE_INDEX = "RecommendedExposureIndex"; + /** + * <p>This tag indicates the ISO speed value of a camera or input device that is defined in + * ISO 12232. When recording this tag, {@link #TAG_PHOTOGRAPHIC_SENSITIVITY} and + * {@link #TAG_SENSITIVITY_TYPE} shall also be recorded.</p> + * + * <ul> + * <li>Tag = 34867</li> + * <li>Type = Unsigned long</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_ISO_SPEED = "ISOSpeed"; + /** + * <p>This tag indicates the ISO speed latitude yyy value of a camera or input device that is + * defined in ISO 12232. However, this tag shall not be recorded without {@link #TAG_ISO_SPEED} + * and {@link #TAG_ISO_SPEED_LATITUDE_ZZZ}.</p> + * + * <ul> + * <li>Tag = 34868</li> + * <li>Type = Unsigned long</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_ISO_SPEED_LATITUDE_YYY = "ISOSpeedLatitudeyyy"; + /** + * <p>This tag indicates the ISO speed latitude zzz value of a camera or input device that is + * defined in ISO 12232. However, this tag shall not be recorded without {@link #TAG_ISO_SPEED} + * and {@link #TAG_ISO_SPEED_LATITUDE_YYY}.</p> + * + * <ul> + * <li>Tag = 34869</li> + * <li>Type = Unsigned long</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_ISO_SPEED_LATITUDE_ZZZ = "ISOSpeedLatitudezzz"; + /** + * <p>Shutter speed. The unit is the APEX setting.</p> + * + * <ul> + * <li>Tag = 37377</li> + * <li>Type = Signed rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_SHUTTER_SPEED_VALUE = "ShutterSpeedValue"; + /** + * <p>The lens aperture. The unit is the APEX value.</p> + * + * <ul> + * <li>Tag = 37378</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_APERTURE_VALUE = "ApertureValue"; + /** + * <p>The value of brightness. The unit is the APEX value. Ordinarily it is given in the range + * of -99.99 to 99.99. Note that if the numerator of the recorded value is 0xFFFFFFFF, + * Unknown shall be indicated.</p> + * + * <ul> + * <li>Tag = 37379</li> + * <li>Type = Signed rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_BRIGHTNESS_VALUE = "BrightnessValue"; + /** + * <p>The exposure bias. The unit is the APEX value. Ordinarily it is given in the range of + * -99.99 to 99.99.</p> + * + * <ul> + * <li>Tag = 37380</li> + * <li>Type = Signed rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_EXPOSURE_BIAS_VALUE = "ExposureBiasValue"; + /** + * <p>The smallest F number of the lens. The unit is the APEX value. Ordinarily it is given + * in the range of 00.00 to 99.99, but it is not limited to this range.</p> + * + * <ul> + * <li>Tag = 37381</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_MAX_APERTURE_VALUE = "MaxApertureValue"; + + /** + * The distance to the subject, given in meters. + * + * <p>Note that if the numerator of the recorded value is 0xFFFFFFFF, Infinity shall be + * indicated; and if the numerator is 0, Distance unknown shall be indicated. + * + * <p>Note: For backwards compatibility this attribute is returned from {@link + * #getAttribute(String)} in decimal form (i.e. the format produced by {@link + * Double#toString(double)}). It is accepted into {@link #setAttribute(String, String)} in both + * rational (e.g. {@code "1/3"}) and decimal forms. The decimal format is anything accepted by + * {@link Double#parseDouble(String)}, e.g. {@code "0.125"}. + * + * <ul> + * <li>Tag = 37382 + * <li>Type = Unsigned rational + * <li>Count = 1 + * <li>Default = None + * </ul> + */ + public static final String TAG_SUBJECT_DISTANCE = "SubjectDistance"; + + /** + * <p>The metering mode.</p> + * + * <ul> + * <li>Tag = 37383</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = {@link #METERING_MODE_UNKNOWN}</li> + * </ul> + * <p> + * + * @see #METERING_MODE_UNKNOWN + * @see #METERING_MODE_AVERAGE + * @see #METERING_MODE_CENTER_WEIGHT_AVERAGE + * @see #METERING_MODE_SPOT + * @see #METERING_MODE_MULTI_SPOT + * @see #METERING_MODE_PATTERN + * @see #METERING_MODE_PARTIAL + * @see #METERING_MODE_OTHER + */ + public static final String TAG_METERING_MODE = "MeteringMode"; + /** + * <p>The kind of light source.</p> + * + * <ul> + * <li>Tag = 37384</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = {@link #LIGHT_SOURCE_UNKNOWN}</li> + * </ul> + * <p> + * + * @see #LIGHT_SOURCE_UNKNOWN + * @see #LIGHT_SOURCE_DAYLIGHT + * @see #LIGHT_SOURCE_FLUORESCENT + * @see #LIGHT_SOURCE_TUNGSTEN + * @see #LIGHT_SOURCE_FLASH + * @see #LIGHT_SOURCE_FINE_WEATHER + * @see #LIGHT_SOURCE_CLOUDY_WEATHER + * @see #LIGHT_SOURCE_SHADE + * @see #LIGHT_SOURCE_DAYLIGHT_FLUORESCENT + * @see #LIGHT_SOURCE_DAY_WHITE_FLUORESCENT + * @see #LIGHT_SOURCE_COOL_WHITE_FLUORESCENT + * @see #LIGHT_SOURCE_WHITE_FLUORESCENT + * @see #LIGHT_SOURCE_WARM_WHITE_FLUORESCENT + * @see #LIGHT_SOURCE_STANDARD_LIGHT_A + * @see #LIGHT_SOURCE_STANDARD_LIGHT_B + * @see #LIGHT_SOURCE_STANDARD_LIGHT_C + * @see #LIGHT_SOURCE_D55 + * @see #LIGHT_SOURCE_D65 + * @see #LIGHT_SOURCE_D75 + * @see #LIGHT_SOURCE_D50 + * @see #LIGHT_SOURCE_ISO_STUDIO_TUNGSTEN + * @see #LIGHT_SOURCE_OTHER + */ + public static final String TAG_LIGHT_SOURCE = "LightSource"; + /** + * <p>This tag indicates the status of flash when the image was shot. Bit 0 indicates the flash + * firing status, bits 1 and 2 indicate the flash return status, bits 3 and 4 indicate + * the flash mode, bit 5 indicates whether the flash function is present, and bit 6 indicates + * "red eye" mode.</p> + * + * <ul> + * <li>Tag = 37385</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * </ul> + * <p> + * + * @see #FLAG_FLASH_FIRED + * @see #FLAG_FLASH_RETURN_LIGHT_NOT_DETECTED + * @see #FLAG_FLASH_RETURN_LIGHT_DETECTED + * @see #FLAG_FLASH_MODE_COMPULSORY_FIRING + * @see #FLAG_FLASH_MODE_COMPULSORY_SUPPRESSION + * @see #FLAG_FLASH_MODE_AUTO + * @see #FLAG_FLASH_NO_FLASH_FUNCTION + * @see #FLAG_FLASH_RED_EYE_SUPPORTED + */ + public static final String TAG_FLASH = "Flash"; + /** + * <p>This tag indicates the location and area of the main subject in the overall scene.</p> + * + * <ul> + * <li>Tag = 37396</li> + * <li>Type = Unsigned short</li> + * <li>Count = 2 or 3 or 4</li> + * <li>Default = None</li> + * </ul> + * + * <p>The subject location and area are defined by Count values as follows.</p> + * + * <ul> + * <li>Count = 2 Indicates the location of the main subject as coordinates. The first value + * is the X coordinate and the second is the Y coordinate.</li> + * <li>Count = 3 The area of the main subject is given as a circle. The circular area is + * expressed as center coordinates and diameter. The first value is + * the center X coordinate, the second is the center Y coordinate, and + * the third is the diameter.</li> + * <li>Count = 4 The area of the main subject is given as a rectangle. The rectangular + * area is expressed as center coordinates and area dimensions. The first + * value is the center X coordinate, the second is the center Y coordinate, + * the third is the width of the area, and the fourth is the height of + * the area.</li> + * </ul> + * + * <p>Note that the coordinate values, width, and height are expressed in relation to the upper + * left as origin, prior to rotation processing as per {@link #TAG_ORIENTATION}.</p> + */ + public static final String TAG_SUBJECT_AREA = "SubjectArea"; + /** + * <p>The actual focal length of the lens, in mm. Conversion is not made to the focal length + * of a 35mm film camera.</p> + * + * <ul> + * <li>Tag = 37386</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_FOCAL_LENGTH = "FocalLength"; + /** + * <p>Indicates the strobe energy at the time the image is captured, as measured in Beam Candle + * Power Seconds (BCPS).</p> + * + * <ul> + * <li>Tag = 41483</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_FLASH_ENERGY = "FlashEnergy"; + /** + * <p>This tag records the camera or input device spatial frequency table and SFR values in + * the direction of image width, image height, and diagonal direction, as specified in + * ISO 12233.</p> + * + * <ul> + * <li>Tag = 41484</li> + * <li>Type = Undefined</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_SPATIAL_FREQUENCY_RESPONSE = "SpatialFrequencyResponse"; + /** + * <p>Indicates the number of pixels in the image width (X) direction per + * {@link #TAG_FOCAL_PLANE_RESOLUTION_UNIT} on the camera focal plane.</p> + * + * <ul> + * <li>Tag = 41486</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_FOCAL_PLANE_X_RESOLUTION = "FocalPlaneXResolution"; + /** + * <p>Indicates the number of pixels in the image height (Y) direction per + * {@link #TAG_FOCAL_PLANE_RESOLUTION_UNIT} on the camera focal plane.</p> + * + * <ul> + * <li>Tag = 41487</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_FOCAL_PLANE_Y_RESOLUTION = "FocalPlaneYResolution"; + /** + * <p>Indicates the unit for measuring {@link #TAG_FOCAL_PLANE_X_RESOLUTION} and + * {@link #TAG_FOCAL_PLANE_Y_RESOLUTION}. This value is the same as + * {@link #TAG_RESOLUTION_UNIT}.</p> + * + * <ul> + * <li>Tag = 41488</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = {@link #RESOLUTION_UNIT_INCHES}</li> + * </ul> + * <p> + * + * @see #TAG_RESOLUTION_UNIT + * @see #RESOLUTION_UNIT_INCHES + * @see #RESOLUTION_UNIT_CENTIMETERS + */ + public static final String TAG_FOCAL_PLANE_RESOLUTION_UNIT = "FocalPlaneResolutionUnit"; + /** + * <p>Indicates the location of the main subject in the scene. The value of this tag represents + * the pixel at the center of the main subject relative to the left edge, prior to rotation + * processing as per {@link #TAG_ORIENTATION}. The first value indicates the X column number + * and second indicates the Y row number. When a camera records the main subject location, + * it is recommended that {@link #TAG_SUBJECT_AREA} be used instead of this tag.</p> + * + * <ul> + * <li>Tag = 41492</li> + * <li>Type = Unsigned short</li> + * <li>Count = 2</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_SUBJECT_LOCATION = "SubjectLocation"; + /** + * <p>Indicates the exposure index selected on the camera or input device at the time the image + * is captured.</p> + * + * <ul> + * <li>Tag = 41493</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_EXPOSURE_INDEX = "ExposureIndex"; + /** + * <p>Indicates the image sensor type on the camera or input device.</p> + * + * <ul> + * <li>Tag = 41495</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #SENSOR_TYPE_NOT_DEFINED + * @see #SENSOR_TYPE_ONE_CHIP + * @see #SENSOR_TYPE_TWO_CHIP + * @see #SENSOR_TYPE_THREE_CHIP + * @see #SENSOR_TYPE_COLOR_SEQUENTIAL + * @see #SENSOR_TYPE_TRILINEAR + * @see #SENSOR_TYPE_COLOR_SEQUENTIAL_LINEAR + */ + public static final String TAG_SENSING_METHOD = "SensingMethod"; + /** + * <p>Indicates the image source. If a DSC recorded the image, this tag value always shall + * be set to {@link #FILE_SOURCE_DSC}.</p> + * + * <ul> + * <li>Tag = 41728</li> + * <li>Type = Undefined</li> + * <li>Length = 1</li> + * <li>Default = {@link #FILE_SOURCE_DSC}</li> + * </ul> + * <p> + * + * @see #FILE_SOURCE_OTHER + * @see #FILE_SOURCE_TRANSPARENT_SCANNER + * @see #FILE_SOURCE_REFLEX_SCANNER + * @see #FILE_SOURCE_DSC + */ + public static final String TAG_FILE_SOURCE = "FileSource"; + /** + * <p>Indicates the type of scene. If a DSC recorded the image, this tag value shall always + * be set to {@link #SCENE_TYPE_DIRECTLY_PHOTOGRAPHED}.</p> + * + * <ul> + * <li>Tag = 41729</li> + * <li>Type = Undefined</li> + * <li>Length = 1</li> + * <li>Default = 1</li> + * </ul> + * <p> + * + * @see #SCENE_TYPE_DIRECTLY_PHOTOGRAPHED + */ + public static final String TAG_SCENE_TYPE = "SceneType"; + /** + * <p>Indicates the color filter array (CFA) geometric pattern of the image sensor when + * a one-chip color area sensor is used. It does not apply to all sensing methods.</p> + * + * <ul> + * <li>Tag = 41730</li> + * <li>Type = Undefined</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #TAG_SENSING_METHOD + * @see #SENSOR_TYPE_ONE_CHIP + */ + public static final String TAG_CFA_PATTERN = "CFAPattern"; + /** + * <p>This tag indicates the use of special processing on image data, such as rendering geared + * to output. When special processing is performed, the Exif/DCF reader is expected to disable + * or minimize any further processing.</p> + * + * <ul> + * <li>Tag = 41985</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = {@link #RENDERED_PROCESS_NORMAL}</li> + * </ul> + * <p> + * + * @see #RENDERED_PROCESS_NORMAL + * @see #RENDERED_PROCESS_CUSTOM + */ + public static final String TAG_CUSTOM_RENDERED = "CustomRendered"; + /** + * <p>This tag indicates the exposure mode set when the image was shot. + * In {@link #EXPOSURE_MODE_AUTO_BRACKET}, the camera shoots a series of frames of the same + * scene at different exposure settings.</p> + * + * <ul> + * <li>Tag = 41986</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #EXPOSURE_MODE_AUTO + * @see #EXPOSURE_MODE_MANUAL + * @see #EXPOSURE_MODE_AUTO_BRACKET + */ + public static final String TAG_EXPOSURE_MODE = "ExposureMode"; + /** + * <p>This tag indicates the white balance mode set when the image was shot.</p> + * + * <ul> + * <li>Tag = 41987</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #WHITEBALANCE_AUTO + * @see #WHITEBALANCE_MANUAL + */ + public static final String TAG_WHITE_BALANCE = "WhiteBalance"; + + /** + * This tag indicates the digital zoom ratio when the image was shot. If the numerator of the + * recorded value is 0, this indicates that digital zoom was not used. + * + * <p>Note: For backwards compatibility this attribute is returned from {@link + * #getAttribute(String)} in decimal form (i.e. the format produced by {@link + * Double#toString(double)}). It is accepted into {@link #setAttribute(String, String)} in both + * rational (e.g. {@code "1/3"}) and decimal forms. The decimal format is anything accepted by + * {@link Double#parseDouble(String)}, e.g. {@code "0.125"}. + * + * <ul> + * <li>Tag = 41988 + * <li>Type = Unsigned rational + * <li>Count = 1 + * <li>Default = None + * </ul> + */ + public static final String TAG_DIGITAL_ZOOM_RATIO = "DigitalZoomRatio"; + + /** + * <p>This tag indicates the equivalent focal length assuming a 35mm film camera, in mm. + * A value of 0 means the focal length is unknown. Note that this tag differs from + * {@link #TAG_FOCAL_LENGTH}.</p> + * + * <ul> + * <li>Tag = 41989</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_FOCAL_LENGTH_IN_35MM_FILM = "FocalLengthIn35mmFilm"; + /** + * <p>This tag indicates the type of scene that was shot. It may also be used to record + * the mode in which the image was shot. Note that this differs from + * {@link #TAG_SCENE_TYPE}.</p> + * + * <ul> + * <li>Tag = 41990</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = 0</li> + * </ul> + * <p> + * + * @see #SCENE_CAPTURE_TYPE_STANDARD + * @see #SCENE_CAPTURE_TYPE_LANDSCAPE + * @see #SCENE_CAPTURE_TYPE_PORTRAIT + * @see #SCENE_CAPTURE_TYPE_NIGHT + */ + public static final String TAG_SCENE_CAPTURE_TYPE = "SceneCaptureType"; + /** + * <p>This tag indicates the degree of overall image gain adjustment.</p> + * + * <ul> + * <li>Tag = 41991</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #GAIN_CONTROL_NONE + * @see #GAIN_CONTROL_LOW_GAIN_UP + * @see #GAIN_CONTROL_HIGH_GAIN_UP + * @see #GAIN_CONTROL_LOW_GAIN_DOWN + * @see #GAIN_CONTROL_HIGH_GAIN_DOWN + */ + public static final String TAG_GAIN_CONTROL = "GainControl"; + /** + * <p>This tag indicates the direction of contrast processing applied by the camera when + * the image was shot.</p> + * + * <ul> + * <li>Tag = 41992</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = {@link #CONTRAST_NORMAL}</li> + * </ul> + * <p> + * + * @see #CONTRAST_NORMAL + * @see #CONTRAST_SOFT + * @see #CONTRAST_HARD + */ + public static final String TAG_CONTRAST = "Contrast"; + /** + * <p>This tag indicates the direction of saturation processing applied by the camera when + * the image was shot.</p> + * + * <ul> + * <li>Tag = 41993</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = {@link #SATURATION_NORMAL}</li> + * </ul> + * <p> + * + * @see #SATURATION_NORMAL + * @see #SATURATION_LOW + * @see #SATURATION_HIGH + */ + public static final String TAG_SATURATION = "Saturation"; + /** + * <p>This tag indicates the direction of sharpness processing applied by the camera when + * the image was shot.</p> + * + * <ul> + * <li>Tag = 41994</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = {@link #SHARPNESS_NORMAL}</li> + * </ul> + * <p> + * + * @see #SHARPNESS_NORMAL + * @see #SHARPNESS_SOFT + * @see #SHARPNESS_HARD + */ + public static final String TAG_SHARPNESS = "Sharpness"; + /** + * <p>This tag indicates information on the picture-taking conditions of a particular camera + * model. The tag is used only to indicate the picture-taking conditions in the Exif/DCF + * reader.</p> + * + * <ul> + * <li>Tag = 41995</li> + * <li>Type = Undefined</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_DEVICE_SETTING_DESCRIPTION = "DeviceSettingDescription"; + /** + * <p>This tag indicates the distance to the subject.</p> + * + * <ul> + * <li>Tag = 41996</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #SUBJECT_DISTANCE_RANGE_UNKNOWN + * @see #SUBJECT_DISTANCE_RANGE_MACRO + * @see #SUBJECT_DISTANCE_RANGE_CLOSE_VIEW + * @see #SUBJECT_DISTANCE_RANGE_DISTANT_VIEW + */ + public static final String TAG_SUBJECT_DISTANCE_RANGE = "SubjectDistanceRange"; + + // H. Other tags + /** + * <p>This tag indicates an identifier assigned uniquely to each image. It is recorded as + * an ASCII string equivalent to hexadecimal notation and 128-bit fixed length.</p> + * + * <ul> + * <li>Tag = 42016</li> + * <li>Type = String</li> + * <li>Length = 32</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_IMAGE_UNIQUE_ID = "ImageUniqueID"; + /** + * <p>This tag records the owner of a camera used in photography as an ASCII string.</p> + * + * <ul> + * <li>Tag = 42032</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @deprecated Use {@link #TAG_CAMERA_OWNER_NAME} instead. + */ + @Deprecated + public static final String TAG_CAMARA_OWNER_NAME = "CameraOwnerName"; + /** + * <p>This tag records the owner of a camera used in photography as an ASCII string.</p> + * + * <ul> + * <li>Tag = 42032</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_CAMERA_OWNER_NAME = "CameraOwnerName"; + /** + * <p>This tag records the serial number of the body of the camera that was used in photography + * as an ASCII string.</p> + * + * <ul> + * <li>Tag = 42033</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_BODY_SERIAL_NUMBER = "BodySerialNumber"; + /** + * <p>This tag notes minimum focal length, maximum focal length, minimum F number in the + * minimum focal length, and minimum F number in the maximum focal length, which are + * specification information for the lens that was used in photography. When the minimum + * F number is unknown, the notation is 0/0.</p> + * + * <ul> + * <li>Tag = 42034</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 4</li> + * <li>Default = None</li> + * <ul> + * <li>Value 1 := Minimum focal length (unit: mm)</li> + * <li>Value 2 : = Maximum focal length (unit: mm)</li> + * <li>Value 3 : = Minimum F number in the minimum focal length</li> + * <li>Value 4 : = Minimum F number in the maximum focal length</li> + * </ul> + * </ul> + */ + public static final String TAG_LENS_SPECIFICATION = "LensSpecification"; + /** + * <p>This tag records the lens manufacturer as an ASCII string.</p> + * + * <ul> + * <li>Tag = 42035</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_LENS_MAKE = "LensMake"; + /** + * <p>This tag records the lens’s model name and model number as an ASCII string.</p> + * + * <ul> + * <li>Tag = 42036</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_LENS_MODEL = "LensModel"; + /** + * <p>This tag records the serial number of the interchangeable lens that was used in + * photography as an ASCII string.</p> + * + * <ul> + * <li>Tag = 42037</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_LENS_SERIAL_NUMBER = "LensSerialNumber"; + + // GPS Attribute Information + /** + * <p>Indicates the version of GPS Info IFD. The version is given as 2.3.0.0. This tag is + * mandatory when GPS-related tags are present. Note that this tag is written as a different + * byte than {@link #TAG_EXIF_VERSION}.</p> + * + * <ul> + * <li>Tag = 0</li> + * <li>Type = Byte</li> + * <li>Count = 4</li> + * <li>Default = 2.3.0.0</li> + * <ul> + * <li>2300 = Version 2.3</li> + * <li>Other = reserved</li> + * </ul> + * </ul> + */ + public static final String TAG_GPS_VERSION_ID = "GPSVersionID"; + /** + * <p>Indicates whether the latitude is north or south latitude.</p> + * + * <ul> + * <li>Tag = 1</li> + * <li>Type = String</li> + * <li>Length = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #LATITUDE_NORTH + * @see #LATITUDE_SOUTH + */ + public static final String TAG_GPS_LATITUDE_REF = "GPSLatitudeRef"; + /** + * <p>Indicates the latitude. The latitude is expressed as three RATIONAL values giving + * the degrees, minutes, and seconds, respectively. If latitude is expressed as degrees, + * minutes and seconds, a typical format would be dd/1,mm/1,ss/1. When degrees and minutes are + * used and, for example, fractions of minutes are given up to two decimal places, the format + * would be dd/1,mmmm/100,0/1.</p> + * + * <ul> + * <li>Tag = 2</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 3</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_LATITUDE = "GPSLatitude"; + /** + * <p>Indicates whether the longitude is east or west longitude.</p> + * + * <ul> + * <li>Tag = 3</li> + * <li>Type = String</li> + * <li>Length = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #LONGITUDE_EAST + * @see #LONGITUDE_WEST + */ + public static final String TAG_GPS_LONGITUDE_REF = "GPSLongitudeRef"; + /** + * <p>Indicates the longitude. The longitude is expressed as three RATIONAL values giving + * the degrees, minutes, and seconds, respectively. If longitude is expressed as degrees, + * minutes and seconds, a typical format would be ddd/1,mm/1,ss/1. When degrees and minutes + * are used and, for example, fractions of minutes are given up to two decimal places, + * the format would be ddd/1,mmmm/100,0/1.</p> + * + * <ul> + * <li>Tag = 4</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 3</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_LONGITUDE = "GPSLongitude"; + /** + * <p>Indicates the altitude used as the reference altitude. If the reference is sea level + * and the altitude is above sea level, 0 is given. If the altitude is below sea level, + * a value of 1 is given and the altitude is indicated as an absolute value in + * {@link #TAG_GPS_ALTITUDE}.</p> + * + * <ul> + * <li>Tag = 5</li> + * <li>Type = Byte</li> + * <li>Count = 1</li> + * <li>Default = 0</li> + * </ul> + * <p> + * + * @see #ALTITUDE_ABOVE_SEA_LEVEL + * @see #ALTITUDE_BELOW_SEA_LEVEL + */ + public static final String TAG_GPS_ALTITUDE_REF = "GPSAltitudeRef"; + /** + * <p>Indicates the altitude based on the reference in {@link #TAG_GPS_ALTITUDE_REF}. + * The reference unit is meters.</p> + * + * <ul> + * <li>Tag = 6</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_ALTITUDE = "GPSAltitude"; + + /** + * Indicates the time as UTC (Coordinated Universal Time). TimeStamp is expressed as three + * unsigned rational values giving the hour, minute, and second. + * + * <p>Note: This attribute is returned from {@link #getAttribute(String)} and accepted into + * {@link #setAttribute(String, String)} as 3 colon-separated integers, e.g. {@code "11:05:32"}. + * Decimal or rational hours, minutes or seconds parts are not supported. + * + * <ul> + * <li>Tag = 7 + * <li>Type = Unsigned rational + * <li>Count = 3 + * <li>Default = None + * </ul> + */ + public static final String TAG_GPS_TIMESTAMP = "GPSTimeStamp"; + + /** + * <p>Indicates the GPS satellites used for measurements. This tag may be used to describe + * the number of satellites, their ID number, angle of elevation, azimuth, SNR and other + * information in ASCII notation. The format is not specified. If the GPS receiver is incapable + * of taking measurements, value of the tag shall be set to {@code null}.</p> + * + * <ul> + * <li>Tag = 8</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_SATELLITES = "GPSSatellites"; + /** + * <p>Indicates the status of the GPS receiver when the image is recorded. 'A' means + * measurement is in progress, and 'V' means the measurement is interrupted.</p> + * + * <ul> + * <li>Tag = 9</li> + * <li>Type = String</li> + * <li>Length = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #GPS_MEASUREMENT_IN_PROGRESS + * @see #GPS_MEASUREMENT_INTERRUPTED + */ + public static final String TAG_GPS_STATUS = "GPSStatus"; + /** + * <p>Indicates the GPS measurement mode. Originally it was defined for GPS, but it may + * be used for recording a measure mode to record the position information provided from + * a mobile base station or wireless LAN as well as GPS.</p> + * + * <ul> + * <li>Tag = 10</li> + * <li>Type = String</li> + * <li>Length = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #GPS_MEASUREMENT_2D + * @see #GPS_MEASUREMENT_3D + */ + public static final String TAG_GPS_MEASURE_MODE = "GPSMeasureMode"; + /** + * <p>Indicates the GPS DOP (data degree of precision). An HDOP value is written during + * two-dimensional measurement, and PDOP during three-dimensional measurement.</p> + * + * <ul> + * <li>Tag = 11</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_DOP = "GPSDOP"; + /** + * <p>Indicates the unit used to express the GPS receiver speed of movement.</p> + * + * <ul> + * <li>Tag = 12</li> + * <li>Type = String</li> + * <li>Length = 1</li> + * <li>Default = {@link #GPS_SPEED_KILOMETERS_PER_HOUR}</li> + * </ul> + * <p> + * + * @see #GPS_SPEED_KILOMETERS_PER_HOUR + * @see #GPS_SPEED_MILES_PER_HOUR + * @see #GPS_SPEED_KNOTS + */ + public static final String TAG_GPS_SPEED_REF = "GPSSpeedRef"; + /** + * Indicates the speed of GPS receiver movement. The units are indicated by {@link + * #TAG_GPS_SPEED_REF}. + * + * <ul> + * <li>Tag = 13</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_SPEED = "GPSSpeed"; + /** + * <p>Indicates the reference for giving the direction of GPS receiver movement.</p> + * + * <ul> + * <li>Tag = 14</li> + * <li>Type = String</li> + * <li>Length = 1</li> + * <li>Default = {@link #GPS_DIRECTION_TRUE}</li> + * </ul> + * <p> + * + * @see #GPS_DIRECTION_TRUE + * @see #GPS_DIRECTION_MAGNETIC + */ + public static final String TAG_GPS_TRACK_REF = "GPSTrackRef"; + /** + * <p>Indicates the direction of GPS receiver movement. + * The range of values is from 0.00 to 359.99.</p> + * + * <ul> + * <li>Tag = 15</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_TRACK = "GPSTrack"; + /** + * <p>Indicates the reference for giving the direction of the image when it is captured.</p> + * + * <ul> + * <li>Tag = 16</li> + * <li>Type = String</li> + * <li>Length = 1</li> + * <li>Default = {@link #GPS_DIRECTION_TRUE}</li> + * </ul> + * <p> + * + * @see #GPS_DIRECTION_TRUE + * @see #GPS_DIRECTION_MAGNETIC + */ + public static final String TAG_GPS_IMG_DIRECTION_REF = "GPSImgDirectionRef"; + /** + * <p>ndicates the direction of the image when it was captured. + * The range of values is from 0.00 to 359.99.</p> + * + * <ul> + * <li>Tag = 17</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_IMG_DIRECTION = "GPSImgDirection"; + /** + * <p>Indicates the geodetic survey data used by the GPS receiver. If the survey data is + * restricted to Japan,the value of this tag is 'TOKYO' or 'WGS-84'. If a GPS Info tag is + * recorded, it is strongly recommended that this tag be recorded.</p> + * + * <ul> + * <li>Tag = 18</li> + * <li>Type = String</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_MAP_DATUM = "GPSMapDatum"; + /** + * <p>Indicates whether the latitude of the destination point is north or south latitude.</p> + * + * <ul> + * <li>Tag = 19</li> + * <li>Type = String</li> + * <li>Length = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #LATITUDE_NORTH + * @see #LATITUDE_SOUTH + */ + public static final String TAG_GPS_DEST_LATITUDE_REF = "GPSDestLatitudeRef"; + /** + * <p>Indicates the latitude of the destination point. The latitude is expressed as three + * unsigned rational values giving the degrees, minutes, and seconds, respectively. + * If latitude is expressed as degrees, minutes and seconds, a typical format would be + * dd/1,mm/1,ss/1. When degrees and minutes are used and, for example, fractions of minutes + * are given up to two decimal places, the format would be dd/1, mmmm/100, 0/1.</p> + * + * <ul> + * <li>Tag = 20</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 3</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_DEST_LATITUDE = "GPSDestLatitude"; + /** + * <p>Indicates whether the longitude of the destination point is east or west longitude.</p> + * + * <ul> + * <li>Tag = 21</li> + * <li>Type = String</li> + * <li>Length = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #LONGITUDE_EAST + * @see #LONGITUDE_WEST + */ + public static final String TAG_GPS_DEST_LONGITUDE_REF = "GPSDestLongitudeRef"; + /** + * <p>Indicates the longitude of the destination point. The longitude is expressed as three + * unsigned rational values giving the degrees, minutes, and seconds, respectively. + * If longitude is expressed as degrees, minutes and seconds, a typical format would be ddd/1, + * mm/1, ss/1. When degrees and minutes are used and, for example, fractions of minutes are + * given up to two decimal places, the format would be ddd/1, mmmm/100, 0/1.</p> + * + * <ul> + * <li>Tag = 22</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 3</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_DEST_LONGITUDE = "GPSDestLongitude"; + /** + * <p>Indicates the reference used for giving the bearing to the destination point.</p> + * + * <ul> + * <li>Tag = 23</li> + * <li>Type = String</li> + * <li>Length = 1</li> + * <li>Default = {@link #GPS_DIRECTION_TRUE}</li> + * </ul> + * <p> + * + * @see #GPS_DIRECTION_TRUE + * @see #GPS_DIRECTION_MAGNETIC + */ + public static final String TAG_GPS_DEST_BEARING_REF = "GPSDestBearingRef"; + /** + * <p>Indicates the bearing to the destination point. + * The range of values is from 0.00 to 359.99.</p> + * + * <ul> + * <li>Tag = 24</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_DEST_BEARING = "GPSDestBearing"; + /** + * <p>Indicates the unit used to express the distance to the destination point.</p> + * + * <ul> + * <li>Tag = 25</li> + * <li>Type = String</li> + * <li>Length = 1</li> + * <li>Default = {@link #GPS_DISTANCE_KILOMETERS}</li> + * </ul> + * <p> + * + * @see #GPS_DISTANCE_KILOMETERS + * @see #GPS_DISTANCE_MILES + * @see #GPS_DISTANCE_NAUTICAL_MILES + */ + public static final String TAG_GPS_DEST_DISTANCE_REF = "GPSDestDistanceRef"; + /** + * <p>Indicates the distance to the destination point.</p> + * + * <ul> + * <li>Tag = 26</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_DEST_DISTANCE = "GPSDestDistance"; + /** + * <p>A character string recording the name of the method used for location finding. + * The first byte indicates the character code used, and this is followed by the name of + * the method.</p> + * + * <ul> + * <li>Tag = 27</li> + * <li>Type = Undefined</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_PROCESSING_METHOD = "GPSProcessingMethod"; + /** + * <p>A character string recording the name of the GPS area. The first byte indicates + * the character code used, and this is followed by the name of the GPS area.</p> + * + * <ul> + * <li>Tag = 28</li> + * <li>Type = Undefined</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_AREA_INFORMATION = "GPSAreaInformation"; + /** + * <p>A character string recording date and time information relative to UTC (Coordinated + * Universal Time). The format is "YYYY:MM:DD".</p> + * + * <ul> + * <li>Tag = 29</li> + * <li>Type = String</li> + * <li>Length = 10</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_DATESTAMP = "GPSDateStamp"; + /** + * <p>Indicates whether differential correction is applied to the GPS receiver.</p> + * + * <ul> + * <li>Tag = 30</li> + * <li>Type = Unsigned short</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + * <p> + * + * @see #GPS_MEASUREMENT_NO_DIFFERENTIAL + * @see #GPS_MEASUREMENT_DIFFERENTIAL_CORRECTED + */ + public static final String TAG_GPS_DIFFERENTIAL = "GPSDifferential"; + /** + * <p>This tag indicates horizontal positioning errors in meters.</p> + * + * <ul> + * <li>Tag = 31</li> + * <li>Type = Unsigned rational</li> + * <li>Count = 1</li> + * <li>Default = None</li> + * </ul> + */ + public static final String TAG_GPS_H_POSITIONING_ERROR = "GPSHPositioningError"; + + // Interoperability IFD Attribute Information + /** + * <p>Indicates the identification of the Interoperability rule.</p> + * + * <ul> + * <li>Tag = 1</li> + * <li>Type = String</li> + * <li>Length = 4</li> + * <li>Default = None</li> + * <ul> + * <li>"R98" = Indicates a file conforming to R98 file specification of Recommended + * Exif Interoperability Rules (Exif R 98) or to DCF basic file stipulated + * by Design Rule for Camera File System.</li> + * <li>"THM" = Indicates a file conforming to DCF thumbnail file stipulated by Design + * rule for Camera File System.</li> + * <li>“R03” = Indicates a file conforming to DCF Option File stipulated by Design rule + * for Camera File System.</li> + * </ul> + * </ul> + */ + public static final String TAG_INTEROPERABILITY_INDEX = "InteroperabilityIndex"; + + /** + * @see #TAG_IMAGE_LENGTH + */ + public static final String TAG_THUMBNAIL_IMAGE_LENGTH = "ThumbnailImageLength"; + /** + * @see #TAG_IMAGE_WIDTH + */ + public static final String TAG_THUMBNAIL_IMAGE_WIDTH = "ThumbnailImageWidth"; + + // TODO: Unhide this when it can be public. + /** + * @see #TAG_ORIENTATION + */ + @RestrictTo(RestrictTo.Scope.LIBRARY) + public static final String TAG_THUMBNAIL_ORIENTATION = "ThumbnailOrientation"; + /** + * Type is int. DNG Specification 1.4.0.0. Section 4 + */ + public static final String TAG_DNG_VERSION = "DNGVersion"; + /** + * Type is int. DNG Specification 1.4.0.0. Section 4 + */ + public static final String TAG_DEFAULT_CROP_SIZE = "DefaultCropSize"; + /** + * Type is undefined. See Olympus MakerNote tags in http://www.exiv2.org/tags-olympus.html. + */ + public static final String TAG_ORF_THUMBNAIL_IMAGE = "ThumbnailImage"; + /** + * Type is int. See Olympus Camera Settings tags in http://www.exiv2.org/tags-olympus.html. + */ + public static final String TAG_ORF_PREVIEW_IMAGE_START = "PreviewImageStart"; + /** + * Type is int. See Olympus Camera Settings tags in http://www.exiv2.org/tags-olympus.html. + */ + public static final String TAG_ORF_PREVIEW_IMAGE_LENGTH = "PreviewImageLength"; + /** + * Type is int. See Olympus Image Processing tags in http://www.exiv2.org/tags-olympus.html. + */ + public static final String TAG_ORF_ASPECT_FRAME = "AspectFrame"; + /** + * Type is int. See PanasonicRaw tags in + * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/PanasonicRaw.html + */ + public static final String TAG_RW2_SENSOR_BOTTOM_BORDER = "SensorBottomBorder"; + /** + * Type is int. See PanasonicRaw tags in + * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/PanasonicRaw.html + */ + public static final String TAG_RW2_SENSOR_LEFT_BORDER = "SensorLeftBorder"; + /** + * Type is int. See PanasonicRaw tags in + * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/PanasonicRaw.html + */ + public static final String TAG_RW2_SENSOR_RIGHT_BORDER = "SensorRightBorder"; + /** + * Type is int. See PanasonicRaw tags in + * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/PanasonicRaw.html + */ + public static final String TAG_RW2_SENSOR_TOP_BORDER = "SensorTopBorder"; + /** + * Type is int. See PanasonicRaw tags in + * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/PanasonicRaw.html + */ + public static final String TAG_RW2_ISO = "ISO"; + /** + * Type is undefined. See PanasonicRaw tags in + * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/PanasonicRaw.html + */ + public static final String TAG_RW2_JPG_FROM_RAW = "JpgFromRaw"; + /** + * Type is byte[]. See <a href= + * "https://en.wikipedia.org/wiki/Extensible_Metadata_Platform">Extensible Metadata Platform + * (XMP)</a> for details on contents. + * + * <p>See also notes about XMP handling in different containers in the class-level javadoc of + * this class. + */ + public static final String TAG_XMP = "Xmp"; + /** + * Type is int. See JEITA CP-3451C Spec Section 3: Bilevel Images. + */ + public static final String TAG_NEW_SUBFILE_TYPE = "NewSubfileType"; + /** + * Type is int. See JEITA CP-3451C Spec Section 3: Bilevel Images. + */ + public static final String TAG_SUBFILE_TYPE = "SubfileType"; + + /** + * Private tags used for pointing the other IFD offsets. + * The types of the following tags are int. + * See JEITA CP-3451C Section 4.6.3: Exif-specific IFD. + * For SubIFD, see Note 1 of Adobe PageMaker® 6.0 TIFF Technical Notes. + */ + private static final String TAG_EXIF_IFD_POINTER = "ExifIFDPointer"; + private static final String TAG_GPS_INFO_IFD_POINTER = "GPSInfoIFDPointer"; + private static final String TAG_INTEROPERABILITY_IFD_POINTER = "InteroperabilityIFDPointer"; + private static final String TAG_SUB_IFD_POINTER = "SubIFDPointer"; + // Proprietary pointer tags used for ORF files. + // See http://www.exiv2.org/tags-olympus.html + private static final String TAG_ORF_CAMERA_SETTINGS_IFD_POINTER = "CameraSettingsIFDPointer"; + private static final String TAG_ORF_IMAGE_PROCESSING_IFD_POINTER = "ImageProcessingIFDPointer"; + + private static final int MAX_THUMBNAIL_SIZE = 512; + + // Constants used for the Orientation Exif tag. + public static final int ORIENTATION_UNDEFINED = 0; + public static final int ORIENTATION_NORMAL = 1; + /** + * Indicates the image is left right reversed mirror. + */ + public static final int ORIENTATION_FLIP_HORIZONTAL = 2; + /** + * Indicates the image is rotated by 180 degree clockwise. + */ + public static final int ORIENTATION_ROTATE_180 = 3; + /** + * Indicates the image is upside down mirror, it can also be represented by flip + * horizontally firstly and rotate 180 degree clockwise. + */ + public static final int ORIENTATION_FLIP_VERTICAL = 4; + /** + * Indicates the image is flipped about top-left <--> bottom-right axis, it can also be + * represented by flip horizontally firstly and rotate 270 degree clockwise. + */ + public static final int ORIENTATION_TRANSPOSE = 5; + /** + * Indicates the image is rotated by 90 degree clockwise. + */ + public static final int ORIENTATION_ROTATE_90 = 6; + /** + * Indicates the image is flipped about top-right <--> bottom-left axis, it can also be + * represented by flip horizontally firstly and rotate 90 degree clockwise. + */ + public static final int ORIENTATION_TRANSVERSE = 7; + /** + * Indicates the image is rotated by 270 degree clockwise. + */ + public static final int ORIENTATION_ROTATE_270 = 8; + private static final List<Integer> ROTATION_ORDER = Arrays.asList(ORIENTATION_NORMAL, + ORIENTATION_ROTATE_90, ORIENTATION_ROTATE_180, ORIENTATION_ROTATE_270); + private static final List<Integer> FLIPPED_ROTATION_ORDER = Arrays.asList( + ORIENTATION_FLIP_HORIZONTAL, ORIENTATION_TRANSVERSE, ORIENTATION_FLIP_VERTICAL, + ORIENTATION_TRANSPOSE); + + /** + * The constant used by {@link #TAG_PLANAR_CONFIGURATION} to denote Chunky format. + */ + public static final short FORMAT_CHUNKY = 1; + /** + * The constant used by {@link #TAG_PLANAR_CONFIGURATION} to denote Planar format. + */ + public static final short FORMAT_PLANAR = 2; + + /** + * The constant used by {@link #TAG_Y_CB_CR_POSITIONING} to denote Centered positioning. + */ + public static final short Y_CB_CR_POSITIONING_CENTERED = 1; + /** + * The constant used by {@link #TAG_Y_CB_CR_POSITIONING} to denote Co-sited positioning. + */ + public static final short Y_CB_CR_POSITIONING_CO_SITED = 2; + + /** + * The constant used to denote resolution unit as inches. + */ + public static final short RESOLUTION_UNIT_INCHES = 2; + /** + * The constant used to denote resolution unit as centimeters. + */ + public static final short RESOLUTION_UNIT_CENTIMETERS = 3; + + /** + * The constant used by {@link #TAG_COLOR_SPACE} to denote sRGB color space. + */ + public static final int COLOR_SPACE_S_RGB = 1; + /** + * The constant used by {@link #TAG_COLOR_SPACE} to denote Uncalibrated. + */ + public static final int COLOR_SPACE_UNCALIBRATED = 65535; + + /** + * The constant used by {@link #TAG_EXPOSURE_PROGRAM} to denote exposure program is not defined. + */ + public static final short EXPOSURE_PROGRAM_NOT_DEFINED = 0; + /** + * The constant used by {@link #TAG_EXPOSURE_PROGRAM} to denote exposure program is Manual. + */ + public static final short EXPOSURE_PROGRAM_MANUAL = 1; + /** + * The constant used by {@link #TAG_EXPOSURE_PROGRAM} to denote exposure program is Normal. + */ + public static final short EXPOSURE_PROGRAM_NORMAL = 2; + /** + * The constant used by {@link #TAG_EXPOSURE_PROGRAM} to denote exposure program is + * Aperture priority. + */ + public static final short EXPOSURE_PROGRAM_APERTURE_PRIORITY = 3; + /** + * The constant used by {@link #TAG_EXPOSURE_PROGRAM} to denote exposure program is + * Shutter priority. + */ + public static final short EXPOSURE_PROGRAM_SHUTTER_PRIORITY = 4; + /** + * The constant used by {@link #TAG_EXPOSURE_PROGRAM} to denote exposure program is Creative + * program (biased toward depth of field). + */ + public static final short EXPOSURE_PROGRAM_CREATIVE = 5; + /** + * The constant used by {@link #TAG_EXPOSURE_PROGRAM} to denote exposure program is Action + * program (biased toward fast shutter speed). + */ + public static final short EXPOSURE_PROGRAM_ACTION = 6; + /** + * The constant used by {@link #TAG_EXPOSURE_PROGRAM} to denote exposure program is Portrait + * mode (for closeup photos with the background out of focus). + */ + public static final short EXPOSURE_PROGRAM_PORTRAIT_MODE = 7; + /** + * The constant used by {@link #TAG_EXPOSURE_PROGRAM} to denote exposure program is Landscape + * mode (for landscape photos with the background in focus). + */ + public static final short EXPOSURE_PROGRAM_LANDSCAPE_MODE = 8; + + /** + * The constant used by {@link #TAG_SENSITIVITY_TYPE} to denote sensitivity type is unknown. + */ + public static final short SENSITIVITY_TYPE_UNKNOWN = 0; + /** + * The constant used by {@link #TAG_SENSITIVITY_TYPE} to denote sensitivity type is Standard + * output sensitivity (SOS). + */ + public static final short SENSITIVITY_TYPE_SOS = 1; + /** + * The constant used by {@link #TAG_SENSITIVITY_TYPE} to denote sensitivity type is Recommended + * exposure index (REI). + */ + public static final short SENSITIVITY_TYPE_REI = 2; + /** + * The constant used by {@link #TAG_SENSITIVITY_TYPE} to denote sensitivity type is ISO speed. + */ + public static final short SENSITIVITY_TYPE_ISO_SPEED = 3; + /** + * The constant used by {@link #TAG_SENSITIVITY_TYPE} to denote sensitivity type is Standard + * output sensitivity (SOS) and recommended exposure index (REI). + */ + public static final short SENSITIVITY_TYPE_SOS_AND_REI = 4; + /** + * The constant used by {@link #TAG_SENSITIVITY_TYPE} to denote sensitivity type is Standard + * output sensitivity (SOS) and ISO speed. + */ + public static final short SENSITIVITY_TYPE_SOS_AND_ISO = 5; + /** + * The constant used by {@link #TAG_SENSITIVITY_TYPE} to denote sensitivity type is Recommended + * exposure index (REI) and ISO speed. + */ + public static final short SENSITIVITY_TYPE_REI_AND_ISO = 6; + /** + * The constant used by {@link #TAG_SENSITIVITY_TYPE} to denote sensitivity type is Standard + * output sensitivity (SOS) and recommended exposure index (REI) and ISO speed. + */ + public static final short SENSITIVITY_TYPE_SOS_AND_REI_AND_ISO = 7; + + /** + * The constant used by {@link #TAG_METERING_MODE} to denote metering mode is unknown. + */ + public static final short METERING_MODE_UNKNOWN = 0; + /** + * The constant used by {@link #TAG_METERING_MODE} to denote metering mode is Average. + */ + public static final short METERING_MODE_AVERAGE = 1; + /** + * The constant used by {@link #TAG_METERING_MODE} to denote metering mode is + * CenterWeightedAverage. + */ + public static final short METERING_MODE_CENTER_WEIGHT_AVERAGE = 2; + /** + * The constant used by {@link #TAG_METERING_MODE} to denote metering mode is Spot. + */ + public static final short METERING_MODE_SPOT = 3; + /** + * The constant used by {@link #TAG_METERING_MODE} to denote metering mode is MultiSpot. + */ + public static final short METERING_MODE_MULTI_SPOT = 4; + /** + * The constant used by {@link #TAG_METERING_MODE} to denote metering mode is Pattern. + */ + public static final short METERING_MODE_PATTERN = 5; + /** + * The constant used by {@link #TAG_METERING_MODE} to denote metering mode is Partial. + */ + public static final short METERING_MODE_PARTIAL = 6; + /** + * The constant used by {@link #TAG_METERING_MODE} to denote metering mode is other. + */ + public static final short METERING_MODE_OTHER = 255; + + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is unknown. + */ + public static final short LIGHT_SOURCE_UNKNOWN = 0; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is Daylight. + */ + public static final short LIGHT_SOURCE_DAYLIGHT = 1; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is Fluorescent. + */ + public static final short LIGHT_SOURCE_FLUORESCENT = 2; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is Tungsten + * (incandescent light). + */ + public static final short LIGHT_SOURCE_TUNGSTEN = 3; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is Flash. + */ + public static final short LIGHT_SOURCE_FLASH = 4; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is Fine weather. + */ + public static final short LIGHT_SOURCE_FINE_WEATHER = 9; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is Cloudy weather. + */ + public static final short LIGHT_SOURCE_CLOUDY_WEATHER = 10; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is Shade. + */ + public static final short LIGHT_SOURCE_SHADE = 11; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is Daylight fluorescent + * (D 5700 - 7100K). + */ + public static final short LIGHT_SOURCE_DAYLIGHT_FLUORESCENT = 12; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is Day white + * fluorescent (N 4600 - 5500K). + */ + public static final short LIGHT_SOURCE_DAY_WHITE_FLUORESCENT = 13; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is Cool white + * fluorescent (W 3800 - 4500K). + */ + public static final short LIGHT_SOURCE_COOL_WHITE_FLUORESCENT = 14; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is White fluorescent + * (WW 3250 - 3800K). + */ + public static final short LIGHT_SOURCE_WHITE_FLUORESCENT = 15; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is Warm white + * fluorescent (L 2600 - 3250K). + */ + public static final short LIGHT_SOURCE_WARM_WHITE_FLUORESCENT = 16; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is Standard light A. + */ + public static final short LIGHT_SOURCE_STANDARD_LIGHT_A = 17; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is Standard light B. + */ + public static final short LIGHT_SOURCE_STANDARD_LIGHT_B = 18; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is Standard light C. + */ + public static final short LIGHT_SOURCE_STANDARD_LIGHT_C = 19; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is D55. + */ + public static final short LIGHT_SOURCE_D55 = 20; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is D65. + */ + public static final short LIGHT_SOURCE_D65 = 21; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is D75. + */ + public static final short LIGHT_SOURCE_D75 = 22; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is D50. + */ + public static final short LIGHT_SOURCE_D50 = 23; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is ISO studio tungsten. + */ + public static final short LIGHT_SOURCE_ISO_STUDIO_TUNGSTEN = 24; + /** + * The constant used by {@link #TAG_LIGHT_SOURCE} to denote light source is other. + */ + public static final short LIGHT_SOURCE_OTHER = 255; + + /** + * The flag used by {@link #TAG_FLASH} to indicate whether the flash is fired. + */ + public static final short FLAG_FLASH_FIRED = 0b0000_0001; + /** + * The flag used by {@link #TAG_FLASH} to indicate strobe return light is not detected. + */ + public static final short FLAG_FLASH_RETURN_LIGHT_NOT_DETECTED = 0b0000_0100; + /** + * The flag used by {@link #TAG_FLASH} to indicate strobe return light is detected. + */ + public static final short FLAG_FLASH_RETURN_LIGHT_DETECTED = 0b0000_0110; + /** + * The flag used by {@link #TAG_FLASH} to indicate the camera's flash mode is Compulsory flash + * firing. + * + * @see #FLAG_FLASH_MODE_COMPULSORY_SUPPRESSION + * @see #FLAG_FLASH_MODE_AUTO + */ + public static final short FLAG_FLASH_MODE_COMPULSORY_FIRING = 0b0000_1000; + /** + * The flag used by {@link #TAG_FLASH} to indicate the camera's flash mode is Compulsory flash + * suppression. + * + * @see #FLAG_FLASH_MODE_COMPULSORY_FIRING + * @see #FLAG_FLASH_MODE_AUTO + */ + public static final short FLAG_FLASH_MODE_COMPULSORY_SUPPRESSION = 0b0001_0000; + /** + * The flag used by {@link #TAG_FLASH} to indicate the camera's flash mode is Auto. + * + * @see #FLAG_FLASH_MODE_COMPULSORY_FIRING + * @see #FLAG_FLASH_MODE_COMPULSORY_SUPPRESSION + */ + public static final short FLAG_FLASH_MODE_AUTO = 0b0001_1000; + /** + * The flag used by {@link #TAG_FLASH} to indicate no flash function is present. + */ + public static final short FLAG_FLASH_NO_FLASH_FUNCTION = 0b0010_0000; + /** + * The flag used by {@link #TAG_FLASH} to indicate red-eye reduction is supported. + */ + public static final short FLAG_FLASH_RED_EYE_SUPPORTED = 0b0100_0000; + + /** + * The constant used by {@link #TAG_SENSING_METHOD} to denote the image sensor type is not + * defined. + */ + public static final short SENSOR_TYPE_NOT_DEFINED = 1; + /** + * The constant used by {@link #TAG_SENSING_METHOD} to denote the image sensor type is One-chip + * color area sensor. + */ + public static final short SENSOR_TYPE_ONE_CHIP = 2; + /** + * The constant used by {@link #TAG_SENSING_METHOD} to denote the image sensor type is Two-chip + * color area sensor. + */ + public static final short SENSOR_TYPE_TWO_CHIP = 3; + /** + * The constant used by {@link #TAG_SENSING_METHOD} to denote the image sensor type is + * Three-chip color area sensor. + */ + public static final short SENSOR_TYPE_THREE_CHIP = 4; + /** + * The constant used by {@link #TAG_SENSING_METHOD} to denote the image sensor type is Color + * sequential area sensor. + */ + public static final short SENSOR_TYPE_COLOR_SEQUENTIAL = 5; + /** + * The constant used by {@link #TAG_SENSING_METHOD} to denote the image sensor type is Trilinear + * sensor. + */ + public static final short SENSOR_TYPE_TRILINEAR = 7; + /** + * The constant used by {@link #TAG_SENSING_METHOD} to denote the image sensor type is Color + * sequential linear sensor. + */ + public static final short SENSOR_TYPE_COLOR_SEQUENTIAL_LINEAR = 8; + + /** + * The constant used by {@link #TAG_FILE_SOURCE} to denote the source is other. + */ + public static final short FILE_SOURCE_OTHER = 0; + /** + * The constant used by {@link #TAG_FILE_SOURCE} to denote the source is scanner of transparent + * type. + */ + public static final short FILE_SOURCE_TRANSPARENT_SCANNER = 1; + /** + * The constant used by {@link #TAG_FILE_SOURCE} to denote the source is scanner of reflex type. + */ + public static final short FILE_SOURCE_REFLEX_SCANNER = 2; + /** + * The constant used by {@link #TAG_FILE_SOURCE} to denote the source is DSC. + */ + public static final short FILE_SOURCE_DSC = 3; + + /** + * The constant used by {@link #TAG_SCENE_TYPE} to denote the scene is directly photographed. + */ + public static final short SCENE_TYPE_DIRECTLY_PHOTOGRAPHED = 1; + + /** + * The constant used by {@link #TAG_CUSTOM_RENDERED} to denote no special processing is used. + */ + public static final short RENDERED_PROCESS_NORMAL = 0; + /** + * The constant used by {@link #TAG_CUSTOM_RENDERED} to denote special processing is used. + */ + public static final short RENDERED_PROCESS_CUSTOM = 1; + + /** + * The constant used by {@link #TAG_EXPOSURE_MODE} to denote the exposure mode is Auto. + */ + public static final short EXPOSURE_MODE_AUTO = 0; + /** + * The constant used by {@link #TAG_EXPOSURE_MODE} to denote the exposure mode is Manual. + */ + public static final short EXPOSURE_MODE_MANUAL = 1; + /** + * The constant used by {@link #TAG_EXPOSURE_MODE} to denote the exposure mode is Auto bracket. + */ + public static final short EXPOSURE_MODE_AUTO_BRACKET = 2; + + /** + * The constant used by {@link #TAG_WHITE_BALANCE} to denote the white balance is Auto. + * + * @deprecated Use {@link #WHITE_BALANCE_AUTO} instead. + */ + @Deprecated + public static final int WHITEBALANCE_AUTO = 0; + /** + * The constant used by {@link #TAG_WHITE_BALANCE} to denote the white balance is Manual. + * + * @deprecated Use {@link #WHITE_BALANCE_MANUAL} instead. + */ + @Deprecated + public static final int WHITEBALANCE_MANUAL = 1; + /** + * The constant used by {@link #TAG_WHITE_BALANCE} to denote the white balance is Auto. + */ + public static final short WHITE_BALANCE_AUTO = 0; + /** + * The constant used by {@link #TAG_WHITE_BALANCE} to denote the white balance is Manual. + */ + public static final short WHITE_BALANCE_MANUAL = 1; + + /** + * The constant used by {@link #TAG_SCENE_CAPTURE_TYPE} to denote the scene capture type is + * Standard. + */ + public static final short SCENE_CAPTURE_TYPE_STANDARD = 0; + /** + * The constant used by {@link #TAG_SCENE_CAPTURE_TYPE} to denote the scene capture type is + * Landscape. + */ + public static final short SCENE_CAPTURE_TYPE_LANDSCAPE = 1; + /** + * The constant used by {@link #TAG_SCENE_CAPTURE_TYPE} to denote the scene capture type is + * Portrait. + */ + public static final short SCENE_CAPTURE_TYPE_PORTRAIT = 2; + /** + * The constant used by {@link #TAG_SCENE_CAPTURE_TYPE} to denote the scene capture type is + * Night scene. + */ + public static final short SCENE_CAPTURE_TYPE_NIGHT = 3; + + /** + * The constant used by {@link #TAG_GAIN_CONTROL} to denote none gain adjustment. + */ + public static final short GAIN_CONTROL_NONE = 0; + /** + * The constant used by {@link #TAG_GAIN_CONTROL} to denote low gain up. + */ + public static final short GAIN_CONTROL_LOW_GAIN_UP = 1; + /** + * The constant used by {@link #TAG_GAIN_CONTROL} to denote high gain up. + */ + public static final short GAIN_CONTROL_HIGH_GAIN_UP = 2; + /** + * The constant used by {@link #TAG_GAIN_CONTROL} to denote low gain down. + */ + public static final short GAIN_CONTROL_LOW_GAIN_DOWN = 3; + /** + * The constant used by {@link #TAG_GAIN_CONTROL} to denote high gain down. + */ + public static final short GAIN_CONTROL_HIGH_GAIN_DOWN = 4; + + /** + * The constant used by {@link #TAG_CONTRAST} to denote normal contrast. + */ + public static final short CONTRAST_NORMAL = 0; + /** + * The constant used by {@link #TAG_CONTRAST} to denote soft contrast. + */ + public static final short CONTRAST_SOFT = 1; + /** + * The constant used by {@link #TAG_CONTRAST} to denote hard contrast. + */ + public static final short CONTRAST_HARD = 2; + + /** + * The constant used by {@link #TAG_SATURATION} to denote normal saturation. + */ + public static final short SATURATION_NORMAL = 0; + /** + * The constant used by {@link #TAG_SATURATION} to denote low saturation. + */ + public static final short SATURATION_LOW = 0; + /** + * The constant used by {@link #TAG_SHARPNESS} to denote high saturation. + */ + public static final short SATURATION_HIGH = 0; + + /** + * The constant used by {@link #TAG_SHARPNESS} to denote normal sharpness. + */ + public static final short SHARPNESS_NORMAL = 0; + /** + * The constant used by {@link #TAG_SHARPNESS} to denote soft sharpness. + */ + public static final short SHARPNESS_SOFT = 1; + /** + * The constant used by {@link #TAG_SHARPNESS} to denote hard sharpness. + */ + public static final short SHARPNESS_HARD = 2; + + /** + * The constant used by {@link #TAG_SUBJECT_DISTANCE_RANGE} to denote the subject distance range + * is unknown. + */ + public static final short SUBJECT_DISTANCE_RANGE_UNKNOWN = 0; + /** + * The constant used by {@link #TAG_SUBJECT_DISTANCE_RANGE} to denote the subject distance range + * is Macro. + */ + public static final short SUBJECT_DISTANCE_RANGE_MACRO = 1; + /** + * The constant used by {@link #TAG_SUBJECT_DISTANCE_RANGE} to denote the subject distance range + * is Close view. + */ + public static final short SUBJECT_DISTANCE_RANGE_CLOSE_VIEW = 2; + /** + * The constant used by {@link #TAG_SUBJECT_DISTANCE_RANGE} to denote the subject distance range + * is Distant view. + */ + public static final short SUBJECT_DISTANCE_RANGE_DISTANT_VIEW = 3; + + /** + * The constant used by GPS latitude-related tags to denote the latitude is North latitude. + * + * @see #TAG_GPS_LATITUDE_REF + * @see #TAG_GPS_DEST_LATITUDE_REF + */ + public static final String LATITUDE_NORTH = "N"; + /** + * The constant used by GPS latitude-related tags to denote the latitude is South latitude. + * + * @see #TAG_GPS_LATITUDE_REF + * @see #TAG_GPS_DEST_LATITUDE_REF + */ + public static final String LATITUDE_SOUTH = "S"; + + /** + * The constant used by GPS longitude-related tags to denote the longitude is East longitude. + * + * @see #TAG_GPS_LONGITUDE_REF + * @see #TAG_GPS_DEST_LONGITUDE_REF + */ + public static final String LONGITUDE_EAST = "E"; + /** + * The constant used by GPS longitude-related tags to denote the longitude is West longitude. + * + * @see #TAG_GPS_LONGITUDE_REF + * @see #TAG_GPS_DEST_LONGITUDE_REF + */ + public static final String LONGITUDE_WEST = "W"; + + /** + * The constant used by {@link #TAG_GPS_ALTITUDE_REF} to denote the altitude is above sea level. + */ + public static final short ALTITUDE_ABOVE_SEA_LEVEL = 0; + /** + * The constant used by {@link #TAG_GPS_ALTITUDE_REF} to denote the altitude is below sea level. + */ + public static final short ALTITUDE_BELOW_SEA_LEVEL = 1; + + /** + * The constant used by {@link #TAG_GPS_STATUS} to denote GPS measurement is in progress. + */ + public static final String GPS_MEASUREMENT_IN_PROGRESS = "A"; + /** + * The constant used by {@link #TAG_GPS_STATUS} to denote GPS measurement is interrupted. + */ + public static final String GPS_MEASUREMENT_INTERRUPTED = "V"; + + /** + * The constant used by {@link #TAG_GPS_MEASURE_MODE} to denote GPS measurement is + * 2-dimensional. + */ + public static final String GPS_MEASUREMENT_2D = "2"; + /** + * The constant used by {@link #TAG_GPS_MEASURE_MODE} to denote GPS measurement is + * 3-dimensional. + */ + public static final String GPS_MEASUREMENT_3D = "3"; + + /** + * The constant used by {@link #TAG_GPS_SPEED_REF} to denote the speed unit is kilometers per + * hour. + */ + public static final String GPS_SPEED_KILOMETERS_PER_HOUR = "K"; + /** + * The constant used by {@link #TAG_GPS_SPEED_REF} to denote the speed unit is miles per hour. + */ + public static final String GPS_SPEED_MILES_PER_HOUR = "M"; + /** + * The constant used by {@link #TAG_GPS_SPEED_REF} to denote the speed unit is knots. + */ + public static final String GPS_SPEED_KNOTS = "N"; + + /** + * The constant used by GPS attributes to denote the direction is true direction. + */ + public static final String GPS_DIRECTION_TRUE = "T"; + /** + * The constant used by GPS attributes to denote the direction is magnetic direction. + */ + public static final String GPS_DIRECTION_MAGNETIC = "M"; + + /** + * The constant used by {@link #TAG_GPS_DEST_DISTANCE_REF} to denote the distance unit is + * kilometers. + */ + public static final String GPS_DISTANCE_KILOMETERS = "K"; + /** + * The constant used by {@link #TAG_GPS_DEST_DISTANCE_REF} to denote the distance unit is miles. + */ + public static final String GPS_DISTANCE_MILES = "M"; + /** + * The constant used by {@link #TAG_GPS_DEST_DISTANCE_REF} to denote the distance unit is + * nautical miles. + */ + public static final String GPS_DISTANCE_NAUTICAL_MILES = "N"; + + /** + * The constant used by {@link #TAG_GPS_DIFFERENTIAL} to denote no differential correction is + * applied. + */ + public static final short GPS_MEASUREMENT_NO_DIFFERENTIAL = 0; + /** + * The constant used by {@link #TAG_GPS_DIFFERENTIAL} to denote differential correction is + * applied. + */ + public static final short GPS_MEASUREMENT_DIFFERENTIAL_CORRECTED = 1; + + /** + * The constant used by {@link #TAG_COMPRESSION} to denote the image is not compressed. + */ + public static final int DATA_UNCOMPRESSED = 1; + /** + * The constant used by {@link #TAG_COMPRESSION} to denote the image is huffman compressed. + */ + public static final int DATA_HUFFMAN_COMPRESSED = 2; + /** + * The constant used by {@link #TAG_COMPRESSION} to denote the image is JPEG. + */ + public static final int DATA_JPEG = 6; + /** + * The constant used by {@link #TAG_COMPRESSION}, see DNG Specification 1.4.0.0. + * Section 3, Compression + */ + public static final int DATA_JPEG_COMPRESSED = 7; + /** + * The constant used by {@link #TAG_COMPRESSION}, see DNG Specification 1.4.0.0. + * Section 3, Compression + */ + public static final int DATA_DEFLATE_ZIP = 8; + /** + * The constant used by {@link #TAG_COMPRESSION} to denote the image is pack-bits compressed. + */ + public static final int DATA_PACK_BITS_COMPRESSED = 32773; + /** + * The constant used by {@link #TAG_COMPRESSION}, see DNG Specification 1.4.0.0. + * Section 3, Compression + */ + public static final int DATA_LOSSY_JPEG = 34892; + + /** + * The constant used by {@link #TAG_BITS_PER_SAMPLE}. + * See JEITA CP-3451C Spec Section 6, Differences from Palette Color Images + */ + public static final int[] BITS_PER_SAMPLE_RGB = new int[]{8, 8, 8}; + /** + * The constant used by {@link #TAG_BITS_PER_SAMPLE}. + * See JEITA CP-3451C Spec Section 4, Differences from Bilevel Images + */ + public static final int[] BITS_PER_SAMPLE_GREYSCALE_1 = new int[]{4}; + /** + * The constant used by {@link #TAG_BITS_PER_SAMPLE}. + * See JEITA CP-3451C Spec Section 4, Differences from Bilevel Images + */ + public static final int[] BITS_PER_SAMPLE_GREYSCALE_2 = new int[]{8}; + + /** + * The constant used by {@link #TAG_PHOTOMETRIC_INTERPRETATION}. + */ + public static final int PHOTOMETRIC_INTERPRETATION_WHITE_IS_ZERO = 0; + /** + * The constant used by {@link #TAG_PHOTOMETRIC_INTERPRETATION}. + */ + public static final int PHOTOMETRIC_INTERPRETATION_BLACK_IS_ZERO = 1; + /** + * The constant used by {@link #TAG_PHOTOMETRIC_INTERPRETATION}. + */ + public static final int PHOTOMETRIC_INTERPRETATION_RGB = 2; + /** + * The constant used by {@link #TAG_PHOTOMETRIC_INTERPRETATION}. + */ + public static final int PHOTOMETRIC_INTERPRETATION_YCBCR = 6; + + /** + * The constant used by {@link #TAG_NEW_SUBFILE_TYPE}. See JEITA CP-3451C Spec Section 8. + */ + public static final int ORIGINAL_RESOLUTION_IMAGE = 0; + /** + * The constant used by {@link #TAG_NEW_SUBFILE_TYPE}. See JEITA CP-3451C Spec Section 8. + */ + public static final int REDUCED_RESOLUTION_IMAGE = 1; + + /** + * Constant used to indicate that the input stream contains the full image data. + * <p> + * The format of the image data should follow one of the image formats supported by this class. + */ + public static final int STREAM_TYPE_FULL_IMAGE_DATA = 0; + /** + * Constant used to indicate that the input stream contains only Exif data. + * <p> + * The format of the Exif-only data must follow the below structure: + * Exif Identifier Code ("Exif\0\0") + TIFF header + IFD data + * See JEITA CP-3451C Section 4.5.2 and 4.5.4 specifications for more details. + */ + public static final int STREAM_TYPE_EXIF_DATA_ONLY = 1; + + @RestrictTo(RestrictTo.Scope.LIBRARY) + @Retention(RetentionPolicy.SOURCE) + @IntDef({STREAM_TYPE_FULL_IMAGE_DATA, STREAM_TYPE_EXIF_DATA_ONLY}) + public @interface ExifStreamType { + } + + @Retention(RetentionPolicy.SOURCE) + @Target(TYPE_USE) + @IntDef({ + XMP_HANDLING_TIFF_700_ONLY, + XMP_HANDLING_PREFER_SEPARATE, + XMP_HANDLING_PREFER_TIFF_700_IF_PRESENT + }) + private @interface XmpHandling { + } + + /** + * The format only supports XMP data stored in the TIFF/Exif 700 tag (or it supports storing XMP + * in a separate segment but this should never be used). + */ + private static final int XMP_HANDLING_TIFF_700_ONLY = 1; + + /** + * The format supports XMP data stored in a separate segment, and this should always be + * preferred if present. + * + * <p>If XMP data is only present in the TIFF/Exif 700 tag it will be read and written from + * there. + */ + private static final int XMP_HANDLING_PREFER_SEPARATE = 2; + + /** + * The format supports XMP data stored in a separate segment, and this should be preferred + * unless XMP is also present in the TIFF/Exif 700 tag. + */ + private static final int XMP_HANDLING_PREFER_TIFF_700_IF_PRESENT = 3; + + // Maximum size for checking file type signature (see image_type_recognition_lite.cc) + private static final int SIGNATURE_CHECK_SIZE = 5000; + + static final byte[] JPEG_SIGNATURE = new byte[]{(byte) 0xff, (byte) 0xd8, (byte) 0xff}; + private static final String RAF_SIGNATURE = "FUJIFILMCCD-RAW"; + private static final int RAF_OFFSET_TO_JPEG_IMAGE_OFFSET = 84; + + private static final byte[] HEIF_TYPE_FTYP = new byte[]{'f', 't', 'y', 'p'}; + private static final byte[] HEIF_BRAND_MIF1 = new byte[]{'m', 'i', 'f', '1'}; + private static final byte[] HEIF_BRAND_HEIC = new byte[]{'h', 'e', 'i', 'c'}; + private static final byte[] HEIF_BRAND_AVIF = new byte[]{'a', 'v', 'i', 'f'}; + private static final byte[] HEIF_BRAND_AVIS = new byte[]{'a', 'v', 'i', 's'}; + + // See http://fileformats.archiveteam.org/wiki/Olympus_ORF + private static final short ORF_SIGNATURE_1 = 0x4f52; + private static final short ORF_SIGNATURE_2 = 0x5352; + // There are two formats for Olympus Makernote Headers. Each has different identifiers and + // offsets to the actual data. + // See http://www.exiv2.org/makernote.html#R1 + private static final byte[] ORF_MAKER_NOTE_HEADER_1 = new byte[]{(byte) 0x4f, (byte) 0x4c, + (byte) 0x59, (byte) 0x4d, (byte) 0x50, (byte) 0x00}; // "OLYMP\0" + private static final byte[] ORF_MAKER_NOTE_HEADER_2 = new byte[]{(byte) 0x4f, (byte) 0x4c, + (byte) 0x59, (byte) 0x4d, (byte) 0x50, (byte) 0x55, (byte) 0x53, (byte) 0x00, + (byte) 0x49, (byte) 0x49}; // "OLYMPUS\0II" + private static final int ORF_MAKER_NOTE_HEADER_1_SIZE = 8; + private static final int ORF_MAKER_NOTE_HEADER_2_SIZE = 12; + + // See http://fileformats.archiveteam.org/wiki/RW2 + private static final short RW2_SIGNATURE = 0x0055; + + // See http://fileformats.archiveteam.org/wiki/Pentax_PEF + private static final String PEF_SIGNATURE = "PENTAX"; + // See http://www.exiv2.org/makernote.html#R11 + private static final int PEF_MAKER_NOTE_SKIP_SIZE = 6; + + // See PNG (Portable Network Graphics) Specification, Version 1.2, + // 3.1. PNG file signature + private static final byte[] PNG_SIGNATURE = new byte[]{(byte) 0x89, (byte) 0x50, (byte) 0x4e, + (byte) 0x47, (byte) 0x0d, (byte) 0x0a, (byte) 0x1a, (byte) 0x0a}; + // See "Extensions to the PNG 1.2 Specification, Version 1.5.0", + // 3.7. eXIf Exchangeable Image File (Exif) Profile + private static final int PNG_CHUNK_TYPE_EXIF = 'e' << 24 | 'X' << 16 | 'I' << 8 | 'f'; + // See "XMP Specification Part 3: Storage in Files" section 1.1.5 + private static final int PNG_CHUNK_TYPE_ITXT = 'i' << 24 | 'T' << 16 | 'X' << 8 | 't'; + private static final int PNG_CHUNK_TYPE_IHDR = 'I' << 24 | 'H' << 16 | 'D' << 8 | 'R'; + private static final int PNG_CHUNK_TYPE_IEND = 'I' << 24 | 'E' << 16 | 'N' << 8 | 'D'; + private static final int PNG_CHUNK_CRC_BYTE_LENGTH = 4; + + /** + * The keyword and 5 null bytes defined by XMP spec part 3 table 9 (section 1.1.5). + */ + @VisibleForTesting + static final byte[] PNG_ITXT_XMP_KEYWORD = "XML:com.adobe.xmp\0\0\0\0\0".getBytes(UTF_8); + + // See https://developers.google.com/speed/webp/docs/riff_container, Section "WebP File Header" + private static final byte[] WEBP_SIGNATURE_1 = new byte[]{'R', 'I', 'F', 'F'}; + private static final byte[] WEBP_SIGNATURE_2 = new byte[]{'W', 'E', 'B', 'P'}; + private static final int WEBP_FILE_SIZE_BYTE_LENGTH = 4; + private static final byte[] WEBP_CHUNK_TYPE_EXIF = new byte[]{(byte) 0x45, (byte) 0x58, + (byte) 0x49, (byte) 0x46}; + private static final byte[] WEBP_VP8_SIGNATURE = new byte[]{(byte) 0x9d, (byte) 0x01, + (byte) 0x2a}; + private static final byte WEBP_VP8L_SIGNATURE = (byte) 0x2f; + private static final byte[] WEBP_CHUNK_TYPE_VP8X = "VP8X".getBytes(Charset.defaultCharset()); + private static final byte[] WEBP_CHUNK_TYPE_VP8L = "VP8L".getBytes(Charset.defaultCharset()); + private static final byte[] WEBP_CHUNK_TYPE_VP8 = "VP8 ".getBytes(Charset.defaultCharset()); + private static final byte[] WEBP_CHUNK_TYPE_ANIM = "ANIM".getBytes(Charset.defaultCharset()); + private static final byte[] WEBP_CHUNK_TYPE_ANMF = "ANMF".getBytes(Charset.defaultCharset()); + private static final int WEBP_CHUNK_TYPE_VP8X_DEFAULT_LENGTH = 10; + private static final int WEBP_CHUNK_TYPE_BYTE_LENGTH = 4; + private static final int WEBP_CHUNK_SIZE_BYTE_LENGTH = 4; + + private static final SimpleDateFormat sFormatterPrimary; + private static final SimpleDateFormat sFormatterSecondary; + + // See Exchangeable image file format for digital still cameras: Exif version 2.2. + // The following values are for parsing EXIF data area. There are tag groups in EXIF data area. + // They are called "Image File Directory". They have multiple data formats to cover various + // image metadata from GPS longitude to camera model name. + + // Types of Exif byte alignments (see JEITA CP-3451C Section 4.5.2) + static final short BYTE_ALIGN_II = 0x4949; // II: Intel order + static final short BYTE_ALIGN_MM = 0x4d4d; // MM: Motorola order + + // TIFF Header Fixed Constant (see JEITA CP-3451C Section 4.5.2) + static final byte START_CODE = 0x2a; // 42 + private static final int IFD_OFFSET = 8; + + // Formats for the value in IFD entry (See TIFF 6.0 Section 2, "Image File Directory".) + private static final int IFD_FORMAT_BYTE = 1; + private static final int IFD_FORMAT_STRING = 2; + private static final int IFD_FORMAT_USHORT = 3; + private static final int IFD_FORMAT_ULONG = 4; + private static final int IFD_FORMAT_URATIONAL = 5; + private static final int IFD_FORMAT_SBYTE = 6; + private static final int IFD_FORMAT_UNDEFINED = 7; + private static final int IFD_FORMAT_SSHORT = 8; + private static final int IFD_FORMAT_SLONG = 9; + private static final int IFD_FORMAT_SRATIONAL = 10; + private static final int IFD_FORMAT_SINGLE = 11; + private static final int IFD_FORMAT_DOUBLE = 12; + // Format indicating a new IFD entry (See Adobe PageMaker® 6.0 TIFF Technical Notes, "New Tag") + private static final int IFD_FORMAT_IFD = 13; + + private static final int SKIP_BUFFER_SIZE = 8192; + + // Names for the data formats for debugging purpose. + private static final String[] IFD_FORMAT_NAMES = new String[]{ + "", "BYTE", "STRING", "USHORT", "ULONG", "URATIONAL", "SBYTE", "UNDEFINED", "SSHORT", + "SLONG", "SRATIONAL", "SINGLE", "DOUBLE", "IFD" + }; + // Sizes of the components of each IFD value format + private static final int[] IFD_FORMAT_BYTES_PER_FORMAT = new int[]{ + 0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8, 1 + }; + + private static final byte[] EXIF_ASCII_PREFIX = new byte[]{ + 0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, 0x0 + }; + + // A class for indicating EXIF rational type. + // TODO: b/308978831 - Migrate to android.util.Rational when the min API is 21. + @VisibleForTesting + static class Rational { + public final long numerator; + public final long denominator; + + private Rational(long numerator, long denominator) { + // Handle erroneous case + if (denominator == 0) { + this.numerator = 0; + this.denominator = 1; + return; + } + this.numerator = numerator; + this.denominator = denominator; + } + + /** + * Creates a new {@code Rational} which approximates the provided {@code double} value by + * using <a href="https://en.wikipedia.org/wiki/Continued_fraction">continued fractions</a>. + */ + public static @NonNull Rational createFromDouble(double value) { + if (value >= Long.MAX_VALUE || value <= Long.MIN_VALUE) { + // value is too large to represent as a long, so just return the max/min value. + return new Rational( + /* numerator= */ value > 0 ? Long.MAX_VALUE : Long.MIN_VALUE, + /* denominator= */ 1); + } + + double absoluteValue = Math.abs(value); + double threshold = 0.00000001 * absoluteValue; + double remainingValue = absoluteValue; + long numerator = 1; + long previousNumerator = 0; + long denominator = 0; + long previousDenominator = 1; + do { + double remainder = remainingValue % 1; + long wholePart = (long) (remainingValue - remainder); + long tmp = numerator; + numerator = wholePart * numerator + previousNumerator; + previousNumerator = tmp; + + tmp = denominator; + denominator = wholePart * denominator + previousDenominator; + previousDenominator = tmp; + + remainingValue = 1 / remainder; + } while ((Math.abs(absoluteValue - numerator / (double) denominator) > threshold)); + + return new Rational(value < 0 ? -numerator : numerator, denominator); + } + + @Override + public @NonNull String toString() { + return numerator + "/" + denominator; + } + + public double calculate() { + return (double) numerator / denominator; + } + } + + // A class for indicating EXIF attribute. + private static class ExifAttribute { + public static final long BYTES_OFFSET_UNKNOWN = -1; + + public final int format; + public final int numberOfComponents; + public final long bytesOffset; + public final byte[] bytes; + + ExifAttribute(int format, int numberOfComponents, byte[] bytes) { + this(format, numberOfComponents, BYTES_OFFSET_UNKNOWN, bytes); + } + + ExifAttribute(int format, int numberOfComponents, long bytesOffset, byte[] bytes) { + this.format = format; + this.numberOfComponents = numberOfComponents; + this.bytesOffset = bytesOffset; + this.bytes = bytes; + } + + public static ExifAttribute createUShort(int[] values, ByteOrder byteOrder) { + final ByteBuffer buffer = ByteBuffer.wrap( + new byte[IFD_FORMAT_BYTES_PER_FORMAT[IFD_FORMAT_USHORT] * values.length]); + buffer.order(byteOrder); + for (int value : values) { + buffer.putShort((short) value); + } + return new ExifAttribute(IFD_FORMAT_USHORT, values.length, buffer.array()); + } + + public static ExifAttribute createUShort(int value, ByteOrder byteOrder) { + return createUShort(new int[]{value}, byteOrder); + } + + public static ExifAttribute createULong(long[] values, ByteOrder byteOrder) { + final ByteBuffer buffer = ByteBuffer.wrap( + new byte[IFD_FORMAT_BYTES_PER_FORMAT[IFD_FORMAT_ULONG] * values.length]); + buffer.order(byteOrder); + for (long value : values) { + buffer.putInt((int) value); + } + return new ExifAttribute(IFD_FORMAT_ULONG, values.length, buffer.array()); + } + + public static ExifAttribute createULong(long value, ByteOrder byteOrder) { + return createULong(new long[]{value}, byteOrder); + } + + public static ExifAttribute createSLong(int[] values, ByteOrder byteOrder) { + final ByteBuffer buffer = ByteBuffer.wrap( + new byte[IFD_FORMAT_BYTES_PER_FORMAT[IFD_FORMAT_SLONG] * values.length]); + buffer.order(byteOrder); + for (int value : values) { + buffer.putInt(value); + } + return new ExifAttribute(IFD_FORMAT_SLONG, values.length, buffer.array()); + } + + public static ExifAttribute createByte(String value) { + // Exception for GPSAltitudeRef tag + if (value.length() == 1 && value.charAt(0) >= '0' && value.charAt(0) <= '1') { + final byte[] bytes = new byte[]{(byte) (value.charAt(0) - '0')}; + return new ExifAttribute(IFD_FORMAT_BYTE, bytes.length, bytes); + } + final byte[] ascii = value.getBytes(ASCII); + return new ExifAttribute(IFD_FORMAT_BYTE, ascii.length, ascii); + } + + public static ExifAttribute createString(String value) { + final byte[] ascii = (value + '\0').getBytes(ASCII); + return new ExifAttribute(IFD_FORMAT_STRING, ascii.length, ascii); + } + + public static ExifAttribute createURational(Rational[] values, ByteOrder byteOrder) { + final ByteBuffer buffer = ByteBuffer.wrap( + new byte[IFD_FORMAT_BYTES_PER_FORMAT[IFD_FORMAT_URATIONAL] * values.length]); + buffer.order(byteOrder); + for (Rational value : values) { + buffer.putInt((int) value.numerator); + buffer.putInt((int) value.denominator); + } + return new ExifAttribute(IFD_FORMAT_URATIONAL, values.length, buffer.array()); + } + + public static ExifAttribute createURational(Rational value, ByteOrder byteOrder) { + return createURational(new Rational[]{value}, byteOrder); + } + + public static ExifAttribute createSRational(Rational[] values, ByteOrder byteOrder) { + final ByteBuffer buffer = ByteBuffer.wrap( + new byte[IFD_FORMAT_BYTES_PER_FORMAT[IFD_FORMAT_SRATIONAL] * values.length]); + buffer.order(byteOrder); + for (Rational value : values) { + buffer.putInt((int) value.numerator); + buffer.putInt((int) value.denominator); + } + return new ExifAttribute(IFD_FORMAT_SRATIONAL, values.length, buffer.array()); + } + + public static ExifAttribute createDouble(double[] values, ByteOrder byteOrder) { + final ByteBuffer buffer = ByteBuffer.wrap( + new byte[IFD_FORMAT_BYTES_PER_FORMAT[IFD_FORMAT_DOUBLE] * values.length]); + buffer.order(byteOrder); + for (double value : values) { + buffer.putDouble(value); + } + return new ExifAttribute(IFD_FORMAT_DOUBLE, values.length, buffer.array()); + } + + @Override + public @NonNull String toString() { + return "(" + IFD_FORMAT_NAMES[format] + ", data length:" + bytes.length + ")"; + } + + Object getValue(ByteOrder byteOrder) { + ByteOrderedDataInputStream inputStream = null; + try { + inputStream = new ByteOrderedDataInputStream(bytes); + inputStream.setByteOrder(byteOrder); + switch (format) { + case IFD_FORMAT_BYTE: + case IFD_FORMAT_SBYTE: { + // Exception for GPSAltitudeRef tag + if (bytes.length == 1 && bytes[0] >= 0 && bytes[0] <= 1) { + return new String(new char[]{(char) (bytes[0] + '0')}); + } + return new String(bytes, ASCII); + } + case IFD_FORMAT_UNDEFINED: + case IFD_FORMAT_STRING: { + int index = 0; + if (numberOfComponents >= EXIF_ASCII_PREFIX.length) { + boolean same = true; + for (int i = 0; i < EXIF_ASCII_PREFIX.length; ++i) { + if (bytes[i] != EXIF_ASCII_PREFIX[i]) { + same = false; + break; + } + } + if (same) { + index = EXIF_ASCII_PREFIX.length; + } + } + + StringBuilder stringBuilder = new StringBuilder(); + while (index < numberOfComponents) { + int ch = bytes[index]; + if (ch == 0) { + break; + } + if (ch >= 32) { + stringBuilder.append((char) ch); + } else { + stringBuilder.append('?'); + } + ++index; + } + return stringBuilder.toString(); + } + case IFD_FORMAT_USHORT: { + final int[] values = new int[numberOfComponents]; + for (int i = 0; i < numberOfComponents; ++i) { + values[i] = inputStream.readUnsignedShort(); + } + return values; + } + case IFD_FORMAT_ULONG: { + final long[] values = new long[numberOfComponents]; + for (int i = 0; i < numberOfComponents; ++i) { + values[i] = inputStream.readUnsignedInt(); + } + return values; + } + case IFD_FORMAT_URATIONAL: { + final Rational[] values = new Rational[numberOfComponents]; + for (int i = 0; i < numberOfComponents; ++i) { + final long numerator = inputStream.readUnsignedInt(); + final long denominator = inputStream.readUnsignedInt(); + values[i] = new Rational(numerator, denominator); + } + return values; + } + case IFD_FORMAT_SSHORT: { + final int[] values = new int[numberOfComponents]; + for (int i = 0; i < numberOfComponents; ++i) { + values[i] = inputStream.readShort(); + } + return values; + } + case IFD_FORMAT_SLONG: { + final int[] values = new int[numberOfComponents]; + for (int i = 0; i < numberOfComponents; ++i) { + values[i] = inputStream.readInt(); + } + return values; + } + case IFD_FORMAT_SRATIONAL: { + final Rational[] values = new Rational[numberOfComponents]; + for (int i = 0; i < numberOfComponents; ++i) { + final long numerator = inputStream.readInt(); + final long denominator = inputStream.readInt(); + values[i] = new Rational(numerator, denominator); + } + return values; + } + case IFD_FORMAT_SINGLE: { + final double[] values = new double[numberOfComponents]; + for (int i = 0; i < numberOfComponents; ++i) { + values[i] = inputStream.readFloat(); + } + return values; + } + case IFD_FORMAT_DOUBLE: { + final double[] values = new double[numberOfComponents]; + for (int i = 0; i < numberOfComponents; ++i) { + values[i] = inputStream.readDouble(); + } + return values; + } + default: + return null; + } + } catch (IOException e) { + Log.w(TAG, "IOException occurred during reading a value", e); + return null; + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + Log.e(TAG, "IOException occurred while closing InputStream", e); + } + } + } + } + + public double getDoubleValue(ByteOrder byteOrder) { + Object value = getValue(byteOrder); + if (value == null) { + throw new NumberFormatException("NULL can't be converted to a double value"); + } + if (value instanceof String) { + return Double.parseDouble((String) value); + } + if (value instanceof long[]) { + long[] array = (long[]) value; + if (array.length == 1) { + return array[0]; + } + throw new NumberFormatException("There are more than one component"); + } + if (value instanceof int[]) { + int[] array = (int[]) value; + if (array.length == 1) { + return array[0]; + } + throw new NumberFormatException("There are more than one component"); + } + if (value instanceof double[]) { + double[] array = (double[]) value; + if (array.length == 1) { + return array[0]; + } + throw new NumberFormatException("There are more than one component"); + } + if (value instanceof Rational[]) { + Rational[] array = (Rational[]) value; + if (array.length == 1) { + return array[0].calculate(); + } + throw new NumberFormatException("There are more than one component"); + } + throw new NumberFormatException("Couldn't find a double value"); + } + + public int getIntValue(ByteOrder byteOrder) { + Object value = getValue(byteOrder); + if (value == null) { + throw new NumberFormatException("NULL can't be converted to a integer value"); + } + if (value instanceof String) { + return Integer.parseInt((String) value); + } + if (value instanceof long[]) { + long[] array = (long[]) value; + if (array.length == 1) { + return (int) array[0]; + } + throw new NumberFormatException("There are more than one component"); + } + if (value instanceof int[]) { + int[] array = (int[]) value; + if (array.length == 1) { + return array[0]; + } + throw new NumberFormatException("There are more than one component"); + } + throw new NumberFormatException("Couldn't find a integer value"); + } + + public String getStringValue(ByteOrder byteOrder) { + Object value = getValue(byteOrder); + if (value == null) { + return null; + } + if (value instanceof String) { + return (String) value; + } + + final StringBuilder stringBuilder = new StringBuilder(); + if (value instanceof long[]) { + long[] array = (long[]) value; + for (int i = 0; i < array.length; ++i) { + stringBuilder.append(array[i]); + if (i + 1 != array.length) { + stringBuilder.append(","); + } + } + return stringBuilder.toString(); + } + if (value instanceof int[]) { + int[] array = (int[]) value; + for (int i = 0; i < array.length; ++i) { + stringBuilder.append(array[i]); + if (i + 1 != array.length) { + stringBuilder.append(","); + } + } + return stringBuilder.toString(); + } + if (value instanceof double[]) { + double[] array = (double[]) value; + for (int i = 0; i < array.length; ++i) { + stringBuilder.append(array[i]); + if (i + 1 != array.length) { + stringBuilder.append(","); + } + } + return stringBuilder.toString(); + } + if (value instanceof Rational[]) { + Rational[] array = (Rational[]) value; + for (int i = 0; i < array.length; ++i) { + stringBuilder.append(array[i].numerator); + stringBuilder.append('/'); + stringBuilder.append(array[i].denominator); + if (i + 1 != array.length) { + stringBuilder.append(","); + } + } + return stringBuilder.toString(); + } + return null; + } + + public int size() { + return IFD_FORMAT_BYTES_PER_FORMAT[format] * numberOfComponents; + } + } + + // A class for indicating EXIF tag. + private static class ExifTag { + public final int number; + public final String name; + public final int primaryFormat; + public final int secondaryFormat; + + ExifTag(String name, int number, int format) { + this.name = name; + this.number = number; + this.primaryFormat = format; + this.secondaryFormat = -1; + } + + ExifTag(String name, int number, int primaryFormat, int secondaryFormat) { + this.name = name; + this.number = number; + this.primaryFormat = primaryFormat; + this.secondaryFormat = secondaryFormat; + } + + boolean isFormatCompatible(int format) { + if (primaryFormat == IFD_FORMAT_UNDEFINED || format == IFD_FORMAT_UNDEFINED) { + return true; + } else if (primaryFormat == format || secondaryFormat == format) { + return true; + } else if ((primaryFormat == IFD_FORMAT_ULONG || secondaryFormat == IFD_FORMAT_ULONG) + && format == IFD_FORMAT_USHORT) { + return true; + } else if ((primaryFormat == IFD_FORMAT_SLONG || secondaryFormat == IFD_FORMAT_SLONG) + && format == IFD_FORMAT_SSHORT) { + return true; + } else if ((primaryFormat == IFD_FORMAT_DOUBLE || secondaryFormat == IFD_FORMAT_DOUBLE) + && format == IFD_FORMAT_SINGLE) { + return true; + } + return false; + } + } + + // Primary image IFD TIFF tags (See JEITA CP-3451C Section 4.6.8 Tag Support Levels) + private static final ExifTag[] IFD_TIFF_TAGS = new ExifTag[]{ + // For below two, see TIFF 6.0 Spec Section 3: Bilevel Images. + new ExifTag(TAG_NEW_SUBFILE_TYPE, 254, IFD_FORMAT_ULONG), + new ExifTag(TAG_SUBFILE_TYPE, 255, IFD_FORMAT_ULONG), + new ExifTag(TAG_IMAGE_WIDTH, 256, IFD_FORMAT_USHORT, IFD_FORMAT_ULONG), + new ExifTag(TAG_IMAGE_LENGTH, 257, IFD_FORMAT_USHORT, IFD_FORMAT_ULONG), + new ExifTag(TAG_BITS_PER_SAMPLE, 258, IFD_FORMAT_USHORT), + new ExifTag(TAG_COMPRESSION, 259, IFD_FORMAT_USHORT), + new ExifTag(TAG_PHOTOMETRIC_INTERPRETATION, 262, IFD_FORMAT_USHORT), + new ExifTag(TAG_IMAGE_DESCRIPTION, 270, IFD_FORMAT_STRING), + new ExifTag(TAG_MAKE, 271, IFD_FORMAT_STRING), + new ExifTag(TAG_MODEL, 272, IFD_FORMAT_STRING), + new ExifTag(TAG_STRIP_OFFSETS, 273, IFD_FORMAT_USHORT, IFD_FORMAT_ULONG), + new ExifTag(TAG_ORIENTATION, 274, IFD_FORMAT_USHORT), + new ExifTag(TAG_SAMPLES_PER_PIXEL, 277, IFD_FORMAT_USHORT), + new ExifTag(TAG_ROWS_PER_STRIP, 278, IFD_FORMAT_USHORT, IFD_FORMAT_ULONG), + new ExifTag(TAG_STRIP_BYTE_COUNTS, 279, IFD_FORMAT_USHORT, IFD_FORMAT_ULONG), + new ExifTag(TAG_X_RESOLUTION, 282, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_Y_RESOLUTION, 283, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_PLANAR_CONFIGURATION, 284, IFD_FORMAT_USHORT), + new ExifTag(TAG_RESOLUTION_UNIT, 296, IFD_FORMAT_USHORT), + new ExifTag(TAG_TRANSFER_FUNCTION, 301, IFD_FORMAT_USHORT), + new ExifTag(TAG_SOFTWARE, 305, IFD_FORMAT_STRING), + new ExifTag(TAG_DATETIME, 306, IFD_FORMAT_STRING), + new ExifTag(TAG_ARTIST, 315, IFD_FORMAT_STRING), + new ExifTag(TAG_WHITE_POINT, 318, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_PRIMARY_CHROMATICITIES, 319, IFD_FORMAT_URATIONAL), + // See Adobe PageMaker® 6.0 TIFF Technical Notes, Note 1. + new ExifTag(TAG_SUB_IFD_POINTER, 330, IFD_FORMAT_ULONG), + new ExifTag(TAG_JPEG_INTERCHANGE_FORMAT, 513, IFD_FORMAT_ULONG), + new ExifTag(TAG_JPEG_INTERCHANGE_FORMAT_LENGTH, 514, IFD_FORMAT_ULONG), + new ExifTag(TAG_Y_CB_CR_COEFFICIENTS, 529, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_Y_CB_CR_SUB_SAMPLING, 530, IFD_FORMAT_USHORT), + new ExifTag(TAG_Y_CB_CR_POSITIONING, 531, IFD_FORMAT_USHORT), + new ExifTag(TAG_REFERENCE_BLACK_WHITE, 532, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_COPYRIGHT, 33432, IFD_FORMAT_STRING), + new ExifTag(TAG_EXIF_IFD_POINTER, 34665, IFD_FORMAT_ULONG), + new ExifTag(TAG_GPS_INFO_IFD_POINTER, 34853, IFD_FORMAT_ULONG), + // RW2 file tags + // See http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/PanasonicRaw.html) + new ExifTag(TAG_RW2_SENSOR_TOP_BORDER, 4, IFD_FORMAT_ULONG), + new ExifTag(TAG_RW2_SENSOR_LEFT_BORDER, 5, IFD_FORMAT_ULONG), + new ExifTag(TAG_RW2_SENSOR_BOTTOM_BORDER, 6, IFD_FORMAT_ULONG), + new ExifTag(TAG_RW2_SENSOR_RIGHT_BORDER, 7, IFD_FORMAT_ULONG), + new ExifTag(TAG_RW2_ISO, 23, IFD_FORMAT_USHORT), + new ExifTag(TAG_RW2_JPG_FROM_RAW, 46, IFD_FORMAT_UNDEFINED), + new ExifTag(TAG_XMP, 700, IFD_FORMAT_BYTE), + }; + + // Primary image IFD Exif Private tags (See JEITA CP-3451C Section 4.6.8 Tag Support Levels) + private static final ExifTag[] IFD_EXIF_TAGS = new ExifTag[]{ + new ExifTag(TAG_EXPOSURE_TIME, 33434, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_F_NUMBER, 33437, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_EXPOSURE_PROGRAM, 34850, IFD_FORMAT_USHORT), + new ExifTag(TAG_SPECTRAL_SENSITIVITY, 34852, IFD_FORMAT_STRING), + new ExifTag(TAG_PHOTOGRAPHIC_SENSITIVITY, 34855, IFD_FORMAT_USHORT), + new ExifTag(TAG_OECF, 34856, IFD_FORMAT_UNDEFINED), + new ExifTag(TAG_SENSITIVITY_TYPE, 34864, IFD_FORMAT_USHORT), + new ExifTag(TAG_STANDARD_OUTPUT_SENSITIVITY, 34865, IFD_FORMAT_ULONG), + new ExifTag(TAG_RECOMMENDED_EXPOSURE_INDEX, 34866, IFD_FORMAT_ULONG), + new ExifTag(TAG_ISO_SPEED, 34867, IFD_FORMAT_ULONG), + new ExifTag(TAG_ISO_SPEED_LATITUDE_YYY, 34868, IFD_FORMAT_ULONG), + new ExifTag(TAG_ISO_SPEED_LATITUDE_ZZZ, 34869, IFD_FORMAT_ULONG), + new ExifTag(TAG_EXIF_VERSION, 36864, IFD_FORMAT_STRING), + new ExifTag(TAG_DATETIME_ORIGINAL, 36867, IFD_FORMAT_STRING), + new ExifTag(TAG_DATETIME_DIGITIZED, 36868, IFD_FORMAT_STRING), + new ExifTag(TAG_OFFSET_TIME, 36880, IFD_FORMAT_STRING), + new ExifTag(TAG_OFFSET_TIME_ORIGINAL, 36881, IFD_FORMAT_STRING), + new ExifTag(TAG_OFFSET_TIME_DIGITIZED, 36882, IFD_FORMAT_STRING), + new ExifTag(TAG_COMPONENTS_CONFIGURATION, 37121, IFD_FORMAT_UNDEFINED), + new ExifTag(TAG_COMPRESSED_BITS_PER_PIXEL, 37122, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_SHUTTER_SPEED_VALUE, 37377, IFD_FORMAT_SRATIONAL), + new ExifTag(TAG_APERTURE_VALUE, 37378, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_BRIGHTNESS_VALUE, 37379, IFD_FORMAT_SRATIONAL), + new ExifTag(TAG_EXPOSURE_BIAS_VALUE, 37380, IFD_FORMAT_SRATIONAL), + new ExifTag(TAG_MAX_APERTURE_VALUE, 37381, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_SUBJECT_DISTANCE, 37382, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_METERING_MODE, 37383, IFD_FORMAT_USHORT), + new ExifTag(TAG_LIGHT_SOURCE, 37384, IFD_FORMAT_USHORT), + new ExifTag(TAG_FLASH, 37385, IFD_FORMAT_USHORT), + new ExifTag(TAG_FOCAL_LENGTH, 37386, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_SUBJECT_AREA, 37396, IFD_FORMAT_USHORT), + new ExifTag(TAG_MAKER_NOTE, 37500, IFD_FORMAT_UNDEFINED), + new ExifTag(TAG_USER_COMMENT, 37510, IFD_FORMAT_UNDEFINED), + new ExifTag(TAG_SUBSEC_TIME, 37520, IFD_FORMAT_STRING), + new ExifTag(TAG_SUBSEC_TIME_ORIGINAL, 37521, IFD_FORMAT_STRING), + new ExifTag(TAG_SUBSEC_TIME_DIGITIZED, 37522, IFD_FORMAT_STRING), + new ExifTag(TAG_FLASHPIX_VERSION, 40960, IFD_FORMAT_UNDEFINED), + new ExifTag(TAG_COLOR_SPACE, 40961, IFD_FORMAT_USHORT), + new ExifTag(TAG_PIXEL_X_DIMENSION, 40962, IFD_FORMAT_USHORT, IFD_FORMAT_ULONG), + new ExifTag(TAG_PIXEL_Y_DIMENSION, 40963, IFD_FORMAT_USHORT, IFD_FORMAT_ULONG), + new ExifTag(TAG_RELATED_SOUND_FILE, 40964, IFD_FORMAT_STRING), + new ExifTag(TAG_INTEROPERABILITY_IFD_POINTER, 40965, IFD_FORMAT_ULONG), + new ExifTag(TAG_FLASH_ENERGY, 41483, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_SPATIAL_FREQUENCY_RESPONSE, 41484, IFD_FORMAT_UNDEFINED), + new ExifTag(TAG_FOCAL_PLANE_X_RESOLUTION, 41486, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_FOCAL_PLANE_Y_RESOLUTION, 41487, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_FOCAL_PLANE_RESOLUTION_UNIT, 41488, IFD_FORMAT_USHORT), + new ExifTag(TAG_SUBJECT_LOCATION, 41492, IFD_FORMAT_USHORT), + new ExifTag(TAG_EXPOSURE_INDEX, 41493, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_SENSING_METHOD, 41495, IFD_FORMAT_USHORT), + new ExifTag(TAG_FILE_SOURCE, 41728, IFD_FORMAT_UNDEFINED), + new ExifTag(TAG_SCENE_TYPE, 41729, IFD_FORMAT_UNDEFINED), + new ExifTag(TAG_CFA_PATTERN, 41730, IFD_FORMAT_UNDEFINED), + new ExifTag(TAG_CUSTOM_RENDERED, 41985, IFD_FORMAT_USHORT), + new ExifTag(TAG_EXPOSURE_MODE, 41986, IFD_FORMAT_USHORT), + new ExifTag(TAG_WHITE_BALANCE, 41987, IFD_FORMAT_USHORT), + new ExifTag(TAG_DIGITAL_ZOOM_RATIO, 41988, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_FOCAL_LENGTH_IN_35MM_FILM, 41989, IFD_FORMAT_USHORT), + new ExifTag(TAG_SCENE_CAPTURE_TYPE, 41990, IFD_FORMAT_USHORT), + new ExifTag(TAG_GAIN_CONTROL, 41991, IFD_FORMAT_USHORT), + new ExifTag(TAG_CONTRAST, 41992, IFD_FORMAT_USHORT), + new ExifTag(TAG_SATURATION, 41993, IFD_FORMAT_USHORT), + new ExifTag(TAG_SHARPNESS, 41994, IFD_FORMAT_USHORT), + new ExifTag(TAG_DEVICE_SETTING_DESCRIPTION, 41995, IFD_FORMAT_UNDEFINED), + new ExifTag(TAG_SUBJECT_DISTANCE_RANGE, 41996, IFD_FORMAT_USHORT), + new ExifTag(TAG_IMAGE_UNIQUE_ID, 42016, IFD_FORMAT_STRING), + new ExifTag(TAG_CAMERA_OWNER_NAME, 42032, IFD_FORMAT_STRING), + new ExifTag(TAG_BODY_SERIAL_NUMBER, 42033, IFD_FORMAT_STRING), + new ExifTag(TAG_LENS_SPECIFICATION, 42034, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_LENS_MAKE, 42035, IFD_FORMAT_STRING), + new ExifTag(TAG_LENS_MODEL, 42036, IFD_FORMAT_STRING), + new ExifTag(TAG_GAMMA, 42240, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_DNG_VERSION, 50706, IFD_FORMAT_BYTE), + new ExifTag(TAG_DEFAULT_CROP_SIZE, 50720, IFD_FORMAT_USHORT, IFD_FORMAT_ULONG) + }; + + // Primary image IFD GPS Info tags (See JEITA CP-3451C Section 4.6.6 Tag Support Levels) + private static final ExifTag[] IFD_GPS_TAGS = new ExifTag[]{ + new ExifTag(TAG_GPS_VERSION_ID, 0, IFD_FORMAT_BYTE), + new ExifTag(TAG_GPS_LATITUDE_REF, 1, IFD_FORMAT_STRING), + // Allow SRATIONAL to be compatible with apps using wrong format and + // even if it is negative, it may be valid latitude / longitude. + new ExifTag(TAG_GPS_LATITUDE, 2, IFD_FORMAT_URATIONAL, IFD_FORMAT_SRATIONAL), + new ExifTag(TAG_GPS_LONGITUDE_REF, 3, IFD_FORMAT_STRING), + new ExifTag(TAG_GPS_LONGITUDE, 4, IFD_FORMAT_URATIONAL, IFD_FORMAT_SRATIONAL), + new ExifTag(TAG_GPS_ALTITUDE_REF, 5, IFD_FORMAT_BYTE), + new ExifTag(TAG_GPS_ALTITUDE, 6, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_GPS_TIMESTAMP, 7, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_GPS_SATELLITES, 8, IFD_FORMAT_STRING), + new ExifTag(TAG_GPS_STATUS, 9, IFD_FORMAT_STRING), + new ExifTag(TAG_GPS_MEASURE_MODE, 10, IFD_FORMAT_STRING), + new ExifTag(TAG_GPS_DOP, 11, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_GPS_SPEED_REF, 12, IFD_FORMAT_STRING), + new ExifTag(TAG_GPS_SPEED, 13, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_GPS_TRACK_REF, 14, IFD_FORMAT_STRING), + new ExifTag(TAG_GPS_TRACK, 15, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_GPS_IMG_DIRECTION_REF, 16, IFD_FORMAT_STRING), + new ExifTag(TAG_GPS_IMG_DIRECTION, 17, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_GPS_MAP_DATUM, 18, IFD_FORMAT_STRING), + new ExifTag(TAG_GPS_DEST_LATITUDE_REF, 19, IFD_FORMAT_STRING), + new ExifTag(TAG_GPS_DEST_LATITUDE, 20, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_GPS_DEST_LONGITUDE_REF, 21, IFD_FORMAT_STRING), + new ExifTag(TAG_GPS_DEST_LONGITUDE, 22, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_GPS_DEST_BEARING_REF, 23, IFD_FORMAT_STRING), + new ExifTag(TAG_GPS_DEST_BEARING, 24, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_GPS_DEST_DISTANCE_REF, 25, IFD_FORMAT_STRING), + new ExifTag(TAG_GPS_DEST_DISTANCE, 26, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_GPS_PROCESSING_METHOD, 27, IFD_FORMAT_UNDEFINED), + new ExifTag(TAG_GPS_AREA_INFORMATION, 28, IFD_FORMAT_UNDEFINED), + new ExifTag(TAG_GPS_DATESTAMP, 29, IFD_FORMAT_STRING), + new ExifTag(TAG_GPS_DIFFERENTIAL, 30, IFD_FORMAT_USHORT), + new ExifTag(TAG_GPS_H_POSITIONING_ERROR, 31, IFD_FORMAT_URATIONAL) + }; + // Primary image IFD Interoperability tag (See JEITA CP-3451C Section 4.6.8 Tag Support Levels) + private static final ExifTag[] IFD_INTEROPERABILITY_TAGS = new ExifTag[]{ + new ExifTag(TAG_INTEROPERABILITY_INDEX, 1, IFD_FORMAT_STRING) + }; + // IFD Thumbnail tags (See JEITA CP-3451C Section 4.6.8 Tag Support Levels) + private static final ExifTag[] IFD_THUMBNAIL_TAGS = new ExifTag[]{ + // For below two, see TIFF 6.0 Spec Section 3: Bilevel Images. + new ExifTag(TAG_NEW_SUBFILE_TYPE, 254, IFD_FORMAT_ULONG), + new ExifTag(TAG_SUBFILE_TYPE, 255, IFD_FORMAT_ULONG), + new ExifTag(TAG_THUMBNAIL_IMAGE_WIDTH, 256, IFD_FORMAT_USHORT, IFD_FORMAT_ULONG), + new ExifTag(TAG_THUMBNAIL_IMAGE_LENGTH, 257, IFD_FORMAT_USHORT, IFD_FORMAT_ULONG), + new ExifTag(TAG_BITS_PER_SAMPLE, 258, IFD_FORMAT_USHORT), + new ExifTag(TAG_COMPRESSION, 259, IFD_FORMAT_USHORT), + new ExifTag(TAG_PHOTOMETRIC_INTERPRETATION, 262, IFD_FORMAT_USHORT), + new ExifTag(TAG_IMAGE_DESCRIPTION, 270, IFD_FORMAT_STRING), + new ExifTag(TAG_MAKE, 271, IFD_FORMAT_STRING), + new ExifTag(TAG_MODEL, 272, IFD_FORMAT_STRING), + new ExifTag(TAG_STRIP_OFFSETS, 273, IFD_FORMAT_USHORT, IFD_FORMAT_ULONG), + new ExifTag(TAG_THUMBNAIL_ORIENTATION, 274, IFD_FORMAT_USHORT), + new ExifTag(TAG_SAMPLES_PER_PIXEL, 277, IFD_FORMAT_USHORT), + new ExifTag(TAG_ROWS_PER_STRIP, 278, IFD_FORMAT_USHORT, IFD_FORMAT_ULONG), + new ExifTag(TAG_STRIP_BYTE_COUNTS, 279, IFD_FORMAT_USHORT, IFD_FORMAT_ULONG), + new ExifTag(TAG_X_RESOLUTION, 282, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_Y_RESOLUTION, 283, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_PLANAR_CONFIGURATION, 284, IFD_FORMAT_USHORT), + new ExifTag(TAG_RESOLUTION_UNIT, 296, IFD_FORMAT_USHORT), + new ExifTag(TAG_TRANSFER_FUNCTION, 301, IFD_FORMAT_USHORT), + new ExifTag(TAG_SOFTWARE, 305, IFD_FORMAT_STRING), + new ExifTag(TAG_DATETIME, 306, IFD_FORMAT_STRING), + new ExifTag(TAG_ARTIST, 315, IFD_FORMAT_STRING), + new ExifTag(TAG_WHITE_POINT, 318, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_PRIMARY_CHROMATICITIES, 319, IFD_FORMAT_URATIONAL), + // See Adobe PageMaker® 6.0 TIFF Technical Notes, Note 1. + new ExifTag(TAG_SUB_IFD_POINTER, 330, IFD_FORMAT_ULONG), + new ExifTag(TAG_JPEG_INTERCHANGE_FORMAT, 513, IFD_FORMAT_ULONG), + new ExifTag(TAG_JPEG_INTERCHANGE_FORMAT_LENGTH, 514, IFD_FORMAT_ULONG), + new ExifTag(TAG_Y_CB_CR_COEFFICIENTS, 529, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_Y_CB_CR_SUB_SAMPLING, 530, IFD_FORMAT_USHORT), + new ExifTag(TAG_Y_CB_CR_POSITIONING, 531, IFD_FORMAT_USHORT), + new ExifTag(TAG_REFERENCE_BLACK_WHITE, 532, IFD_FORMAT_URATIONAL), + new ExifTag(TAG_COPYRIGHT, 33432, IFD_FORMAT_STRING), + new ExifTag(TAG_EXIF_IFD_POINTER, 34665, IFD_FORMAT_ULONG), + new ExifTag(TAG_GPS_INFO_IFD_POINTER, 34853, IFD_FORMAT_ULONG), + new ExifTag(TAG_DNG_VERSION, 50706, IFD_FORMAT_BYTE), + new ExifTag(TAG_DEFAULT_CROP_SIZE, 50720, IFD_FORMAT_USHORT, IFD_FORMAT_ULONG) + }; + + // RAF file tag (See piex.cc line 372) + private static final ExifTag TAG_RAF_IMAGE_SIZE = + new ExifTag(TAG_STRIP_OFFSETS, 273, IFD_FORMAT_USHORT); + + // ORF file tags (See http://www.exiv2.org/tags-olympus.html) + private static final ExifTag[] ORF_MAKER_NOTE_TAGS = new ExifTag[]{ + new ExifTag(TAG_ORF_THUMBNAIL_IMAGE, 256, IFD_FORMAT_UNDEFINED), + new ExifTag(TAG_ORF_CAMERA_SETTINGS_IFD_POINTER, 8224, IFD_FORMAT_ULONG), + new ExifTag(TAG_ORF_IMAGE_PROCESSING_IFD_POINTER, 8256, IFD_FORMAT_ULONG) + }; + private static final ExifTag[] ORF_CAMERA_SETTINGS_TAGS = new ExifTag[]{ + new ExifTag(TAG_ORF_PREVIEW_IMAGE_START, 257, IFD_FORMAT_ULONG), + new ExifTag(TAG_ORF_PREVIEW_IMAGE_LENGTH, 258, IFD_FORMAT_ULONG) + }; + private static final ExifTag[] ORF_IMAGE_PROCESSING_TAGS = new ExifTag[]{ + new ExifTag(TAG_ORF_ASPECT_FRAME, 4371, IFD_FORMAT_USHORT) + }; + // PEF file tag (See http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Pentax.html) + private static final ExifTag[] PEF_TAGS = new ExifTag[]{ + new ExifTag(TAG_COLOR_SPACE, 55, IFD_FORMAT_USHORT) + }; + + // See JEITA CP-3451C Section 4.6.3: Exif-specific IFD. + // The following values are used for indicating pointers to the other Image File Directories. + + // Indices of Exif Ifd tag groups + @RestrictTo(RestrictTo.Scope.LIBRARY) + @Retention(RetentionPolicy.SOURCE) + @IntDef({IFD_TYPE_PRIMARY, IFD_TYPE_EXIF, IFD_TYPE_GPS, IFD_TYPE_INTEROPERABILITY, + IFD_TYPE_THUMBNAIL, IFD_TYPE_PREVIEW, IFD_TYPE_ORF_MAKER_NOTE, + IFD_TYPE_ORF_CAMERA_SETTINGS, IFD_TYPE_ORF_IMAGE_PROCESSING, IFD_TYPE_PEF}) + public @interface IfdType { + } + + private static final int IFD_TYPE_PRIMARY = 0; + private static final int IFD_TYPE_EXIF = 1; + private static final int IFD_TYPE_GPS = 2; + private static final int IFD_TYPE_INTEROPERABILITY = 3; + private static final int IFD_TYPE_THUMBNAIL = 4; + private static final int IFD_TYPE_PREVIEW = 5; + private static final int IFD_TYPE_ORF_MAKER_NOTE = 6; + private static final int IFD_TYPE_ORF_CAMERA_SETTINGS = 7; + private static final int IFD_TYPE_ORF_IMAGE_PROCESSING = 8; + private static final int IFD_TYPE_PEF = 9; + + // List of Exif tag groups, indexed by the IDF_TYPE_* constants above. + static final ExifTag[][] EXIF_TAGS = + new ExifTag[][]{ + IFD_TIFF_TAGS, IFD_EXIF_TAGS, IFD_GPS_TAGS, IFD_INTEROPERABILITY_TAGS, + IFD_THUMBNAIL_TAGS, IFD_TIFF_TAGS, ORF_MAKER_NOTE_TAGS, ORF_CAMERA_SETTINGS_TAGS, + ORF_IMAGE_PROCESSING_TAGS, PEF_TAGS + }; + // List of tags for pointing to the other image file directory offset. + private static final ExifTag[] EXIF_POINTER_TAGS = new ExifTag[]{ + new ExifTag(TAG_SUB_IFD_POINTER, 330, IFD_FORMAT_ULONG), + new ExifTag(TAG_EXIF_IFD_POINTER, 34665, IFD_FORMAT_ULONG), + new ExifTag(TAG_GPS_INFO_IFD_POINTER, 34853, IFD_FORMAT_ULONG), + new ExifTag(TAG_INTEROPERABILITY_IFD_POINTER, 40965, IFD_FORMAT_ULONG), + new ExifTag(TAG_ORF_CAMERA_SETTINGS_IFD_POINTER, 8224, IFD_FORMAT_BYTE), + new ExifTag(TAG_ORF_IMAGE_PROCESSING_IFD_POINTER, 8256, IFD_FORMAT_BYTE) + }; + + // Mappings from tag number to tag name and each item represents one IFD tag group. + @SuppressWarnings("unchecked") + private static final HashMap<Integer, ExifTag>[] sExifTagMapsForReading = + new HashMap[EXIF_TAGS.length]; + // Mappings from tag name to tag number and each item represents one IFD tag group. + @SuppressWarnings("unchecked") + private static final HashMap<String, ExifTag>[] sExifTagMapsForWriting = + new HashMap[EXIF_TAGS.length]; + + /** + * These are tags of type 'Unsigned rational' but which are handled in decimal form. + * + * <p>This means they are output from {@link #getAttribute(String)}, and accepted into {@link + * #setAttribute(String, String)}, as strings in decimal form (e.g. {@code "0.125"}, {@code + * "6.25E-4"}). + * + * <p>This is to maintain backwards compatibility with a previous implementation of the {@link + * android.media.ExifInterface} (the platform variant of this class). + * + * <p>See <a + * href="http://ag/c/platform/frameworks/base/+/909922/2..9/api/current.txt#b20093">this + * internal code review comment from 2016</a> for more details. + */ + private static final Set<String> RATIONAL_TAGS_HANDLED_AS_DECIMALS_FOR_COMPATIBILITY = + Collections.unmodifiableSet( + new HashSet<>( + Arrays.asList( + TAG_F_NUMBER, + TAG_DIGITAL_ZOOM_RATIO, + TAG_EXPOSURE_TIME, + TAG_SUBJECT_DISTANCE))); + + // Mappings from tag number to IFD type for pointer tags. + private static final HashMap<Integer, Integer> sExifPointerTagMap = new HashMap<>(); + + // See JPEG File Interchange Format Version 1.02. + // The following values are defined for handling JPEG streams. In this implementation, we are + // not only getting information from EXIF but also from some JPEG special segments such as + // MARKER_COM for user comment and MARKER_SOFx for image width and height. + private static final Charset ASCII = Charset.forName("US-ASCII"); + // Identifier for EXIF APP1 segment in JPEG + @VisibleForTesting + static final byte[] IDENTIFIER_EXIF_APP1 = "Exif\0\0".getBytes(ASCII); + // Identifier for XMP APP1 segment in JPEG + private static final byte[] IDENTIFIER_XMP_APP1 = + "http://ns.adobe.com/xap/1.0/\0".getBytes(ASCII); + // JPEG segment markers, that each marker consumes two bytes beginning with 0xff and ending with + // the indicator. There is no SOF4, SOF8, SOF16 markers in JPEG and SOFx markers indicates start + // of frame(baseline DCT) and the image size info exists in its beginning part. + private static final byte MARKER = (byte) 0xff; + private static final byte MARKER_SOI = (byte) 0xd8; + private static final byte MARKER_SOF0 = (byte) 0xc0; + private static final byte MARKER_SOF1 = (byte) 0xc1; + private static final byte MARKER_SOF2 = (byte) 0xc2; + private static final byte MARKER_SOF3 = (byte) 0xc3; + private static final byte MARKER_SOF5 = (byte) 0xc5; + private static final byte MARKER_SOF6 = (byte) 0xc6; + private static final byte MARKER_SOF7 = (byte) 0xc7; + private static final byte MARKER_SOF9 = (byte) 0xc9; + private static final byte MARKER_SOF10 = (byte) 0xca; + private static final byte MARKER_SOF11 = (byte) 0xcb; + private static final byte MARKER_SOF13 = (byte) 0xcd; + private static final byte MARKER_SOF14 = (byte) 0xce; + private static final byte MARKER_SOF15 = (byte) 0xcf; + private static final byte MARKER_SOS = (byte) 0xda; + @VisibleForTesting + static final byte MARKER_APP1 = (byte) 0xe1; + private static final byte MARKER_COM = (byte) 0xfe; + private static final byte MARKER_EOI = (byte) 0xd9; + + // Supported Image File Types + private static final int IMAGE_TYPE_UNKNOWN = 0; + private static final int IMAGE_TYPE_DNG = 3; + private static final int IMAGE_TYPE_JPEG = 4; + private static final int IMAGE_TYPE_ORF = 7; + private static final int IMAGE_TYPE_PEF = 8; + private static final int IMAGE_TYPE_RAF = 9; + private static final int IMAGE_TYPE_RW2 = 10; + private static final int IMAGE_TYPE_HEIC = 12; + private static final int IMAGE_TYPE_PNG = 13; + private static final int IMAGE_TYPE_WEBP = 14; + private static final int IMAGE_TYPE_AVIF = 15; + + static { + sFormatterPrimary = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss", Locale.US); + sFormatterPrimary.setTimeZone(TimeZone.getTimeZone("UTC")); + sFormatterSecondary = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); + sFormatterSecondary.setTimeZone(TimeZone.getTimeZone("UTC")); + + // Build up the hash tables to look up Exif tags for reading Exif tags. + for (int ifdType = 0; ifdType < EXIF_TAGS.length; ++ifdType) { + sExifTagMapsForReading[ifdType] = new HashMap<>(); + sExifTagMapsForWriting[ifdType] = new HashMap<>(); + for (ExifTag tag : EXIF_TAGS[ifdType]) { + sExifTagMapsForReading[ifdType].put(tag.number, tag); + sExifTagMapsForWriting[ifdType].put(tag.name, tag); + } + } + + // Build up the hash table to look up Exif pointer tags. + sExifPointerTagMap.put(EXIF_POINTER_TAGS[0].number, IFD_TYPE_PREVIEW); // 330 + sExifPointerTagMap.put(EXIF_POINTER_TAGS[1].number, IFD_TYPE_EXIF); // 34665 + sExifPointerTagMap.put(EXIF_POINTER_TAGS[2].number, IFD_TYPE_GPS); // 34853 + sExifPointerTagMap.put(EXIF_POINTER_TAGS[3].number, IFD_TYPE_INTEROPERABILITY); // 40965 + sExifPointerTagMap.put(EXIF_POINTER_TAGS[4].number, IFD_TYPE_ORF_CAMERA_SETTINGS); // 8224 + sExifPointerTagMap.put(EXIF_POINTER_TAGS[5].number, IFD_TYPE_ORF_IMAGE_PROCESSING); // 8256 + } + + private String mFilename; + private FileDescriptor mSeekableFileDescriptor; + private AssetManager.AssetInputStream mAssetInputStream; + private int mMimeType; + private boolean mIsExifDataOnly; + @SuppressWarnings("unchecked") + private final HashMap<String, ExifAttribute>[] mAttributes = new HashMap[EXIF_TAGS.length]; + private Set<Integer> mAttributesOffsets = new HashSet<>(EXIF_TAGS.length); + private ByteOrder mExifByteOrder = BIG_ENDIAN; + private boolean mHasThumbnail; + private boolean mHasThumbnailStrips; + private boolean mAreThumbnailStripsConsecutive; + // Used to indicate the position of the thumbnail (doesn't include offset to EXIF data segment). + private int mThumbnailOffset; + private int mThumbnailLength; + private byte[] mThumbnailBytes; + private int mThumbnailCompression; + // Used to indicate offset from the start of the original input stream to EXIF data + private int mOffsetToExifData; + private int mOrfMakerNoteOffset; + + /** + * The position of the thumbnail within the Exif data (from {@link #mOffsetToExifData}). + */ + private int mOrfThumbnailOffset; + + private int mOrfThumbnailLength; + private boolean mModified; + + /** + * XMP data can occur as either part of the TIFF/Exif data (tag number 700), or as a separate + * section of the file (e.g. a separate APP1 segment in JPEG, or an iTXt chunk in PNG). XMP read + * from within the TIFF/Exif data is stored in {@link #mAttributes}, while XMP read from a + * separate section is here. If both are present, the disambiguation rules vary per file format, + * see {@link #getXmpHandlingForImageType(int)}. + */ + @Nullable + private ExifAttribute mXmpFromSeparateMarker; + + /** + * True if the file on disk contains XMP in a separate section. + * + * <p>This means the file the instance was loaded with, or the file created by the last call to + * {@link #saveAttributes()}. + */ + private boolean mFileOnDiskContainsSeparateXmpMarker; + + // Pattern to check non zero timestamp + private static final Pattern NON_ZERO_TIME_PATTERN = Pattern.compile(".*[1-9].*"); + // Pattern to check gps timestamp + private static final Pattern GPS_TIMESTAMP_PATTERN = + Pattern.compile("^(\\d{2}):(\\d{2}):(\\d{2})$"); + // Pattern to check date time primary format (e.g. 2020:01:01 00:00:00) + private static final Pattern DATETIME_PRIMARY_FORMAT_PATTERN = + Pattern.compile("^(\\d{4}):(\\d{2}):(\\d{2})\\s(\\d{2}):(\\d{2}):(\\d{2})$"); + // Pattern to check date time secondary format (e.g. 2020-01-01 00:00:00) + private static final Pattern DATETIME_SECONDARY_FORMAT_PATTERN = + Pattern.compile("^(\\d{4})-(\\d{2})-(\\d{2})\\s(\\d{2}):(\\d{2}):(\\d{2})$"); + private static final int DATETIME_VALUE_STRING_LENGTH = 19; + + /** + * Reads Exif tags from the specified image file. + * + * @param file the file of the image data + * @throws NullPointerException if file is null + * @throws IOException if an I/O error occurs while retrieving file descriptor via + * {@link FileInputStream#getFD()}. + */ + public ExifInterfaceFork(@NonNull File file) throws IOException { + if (file == null) { + throw new NullPointerException("file cannot be null"); + } + initForFilename(file.getAbsolutePath()); + } + + /** + * Reads Exif tags from the specified image file. + * + * @param filename the name of the file of the image data + * @throws NullPointerException if file name is null + * @throws IOException if an I/O error occurs while retrieving file descriptor via + * {@link FileInputStream#getFD()}. + */ + public ExifInterfaceFork(@NonNull String filename) throws IOException { + if (filename == null) { + throw new NullPointerException("filename cannot be null"); + } + initForFilename(filename); + } + + /** + * Reads Exif tags from the specified image file descriptor. Attribute mutation is supported + * for writable and seekable file descriptors only. This constructor will not rewind the offset + * of the given file descriptor. Developers should close the file descriptor after use. + * + * @param fileDescriptor the file descriptor of the image data + * @throws NullPointerException if file descriptor is null + * @throws IOException if an error occurs while duplicating the file descriptor. + */ + public ExifInterfaceFork(@NonNull FileDescriptor fileDescriptor) throws IOException { + if (fileDescriptor == null) { + throw new NullPointerException("fileDescriptor cannot be null"); + } + mAssetInputStream = null; + mFilename = null; + + boolean isFdDuped = false; + if (isSeekableFD(fileDescriptor)) { + mSeekableFileDescriptor = fileDescriptor; + // Keep the original file descriptor in order to save attributes when it's seekable. + // Otherwise, just close the given file descriptor after reading it because the save + // feature won't be working. + try { + fileDescriptor = Os.dup(fileDescriptor); + isFdDuped = true; + } catch (Exception e) { + throw new IOException("Failed to duplicate file descriptor", e); + } + } else { + mSeekableFileDescriptor = null; + } + FileInputStream in = null; + try { + in = new FileInputStream(fileDescriptor); + loadAttributes(in); + } finally { + closeQuietly(in); + if (isFdDuped) { + closeFileDescriptor(fileDescriptor); + } + } + } + + /** + * Reads Exif tags from the specified image input stream. Attribute mutation is not supported + * for input streams. The given input stream will proceed from its current position. Developers + * should close the input stream after use. This constructor is not intended to be used with + * an input stream that performs any networking operations. + * + * @param inputStream the input stream that contains the image data + * @throws NullPointerException if the input stream is null + */ + public ExifInterfaceFork(@NonNull InputStream inputStream) throws IOException { + this(inputStream, STREAM_TYPE_FULL_IMAGE_DATA); + } + + /** + * Reads Exif tags from the specified image input stream based on the stream type. Attribute + * mutation is not supported for input streams. The given input stream will proceed from its + * current position. Developers should close the input stream after use. This constructor is not + * intended to be used with an input stream that performs any networking operations. + * + * @param inputStream the input stream that contains the image data + * @param streamType the type of input stream + * @throws NullPointerException if the input stream is null + * @throws IOException if an I/O error occurs while retrieving file descriptor via + * {@link FileInputStream#getFD()}. + */ + public ExifInterfaceFork(@NonNull InputStream inputStream, @ExifStreamType int streamType) + throws IOException { + if (inputStream == null) { + throw new NullPointerException("inputStream cannot be null"); + } + mFilename = null; + + mIsExifDataOnly = streamType == STREAM_TYPE_EXIF_DATA_ONLY; + if (mIsExifDataOnly) { + mAssetInputStream = null; + mSeekableFileDescriptor = null; + } else { + if (inputStream instanceof AssetManager.AssetInputStream) { + mAssetInputStream = (AssetManager.AssetInputStream) inputStream; + mSeekableFileDescriptor = null; + } else if (inputStream instanceof FileInputStream + && isSeekableFD(((FileInputStream) inputStream).getFD())) { + mAssetInputStream = null; + mSeekableFileDescriptor = ((FileInputStream) inputStream).getFD(); + } else { + mAssetInputStream = null; + mSeekableFileDescriptor = null; + } + } + loadAttributes(inputStream); + } + + /** + * Returns whether ExifInterface currently supports reading data from the specified mime type + * or not. + * + * @param mimeType the string value of mime type + */ + public static boolean isSupportedMimeType(@NonNull String mimeType) { + if (mimeType == null) { + throw new NullPointerException("mimeType shouldn't be null"); + } + + switch (mimeType.toLowerCase(Locale.ROOT)) { + case "image/jpeg": + case "image/x-adobe-dng": + case "image/x-canon-cr2": + case "image/x-nikon-nef": + case "image/x-nikon-nrw": + case "image/x-sony-arw": + case "image/x-panasonic-rw2": + case "image/x-olympus-orf": + case "image/x-pentax-pef": + case "image/x-samsung-srw": + case "image/x-fuji-raf": + case "image/heic": + case "image/heif": + case "image/png": + case "image/webp": + return true; + default: + return false; + } + } + + /** + * Returns the EXIF attribute of the specified tag or {@code null} if there is no such tag in + * the image file. + * + * @param tag the name of the tag. + */ + private @Nullable ExifAttribute getExifAttribute(@NonNull String tag) { + if (tag == null) { + throw new NullPointerException("tag shouldn't be null"); + } + // Maintain compatibility. + if (TAG_ISO_SPEED_RATINGS.equals(tag)) { + if (DEBUG) { + Log.d(TAG, "getExifAttribute: Replacing TAG_ISO_SPEED_RATINGS with " + + "TAG_PHOTOGRAPHIC_SENSITIVITY."); + } + tag = TAG_PHOTOGRAPHIC_SENSITIVITY; + } + if (TAG_XMP.equals(tag) + && getXmpHandlingForImageType(mMimeType) == XMP_HANDLING_PREFER_SEPARATE + && mXmpFromSeparateMarker != null) { + return mXmpFromSeparateMarker; + } + // Retrieves all tag groups. The value from primary image tag group has a higher priority + // than the value from the thumbnail tag group if there are more than one candidates. + for (int i = 0; i < EXIF_TAGS.length; ++i) { + ExifAttribute value = mAttributes[i].get(tag); + if (value != null) { + return value; + } + } + if (TAG_XMP.equals(tag) && mXmpFromSeparateMarker != null) { + return mXmpFromSeparateMarker; + } + return null; + } + + private static @XmpHandling int getXmpHandlingForImageType(int imageType) { + switch (imageType) { + // ExifInterface has a documented (but spec-violating) preference for reading and + // writing JPEG XMP data from Exif/TIFF tag 700 instead of a separate XMP APP1 segment + // if both are present. + case IMAGE_TYPE_JPEG: + return XMP_HANDLING_PREFER_TIFF_700_IF_PRESENT; + case IMAGE_TYPE_AVIF: + case IMAGE_TYPE_HEIC: + case IMAGE_TYPE_PNG: + // RAF stores XMP/Exif in JPEG, but we have no documented backwards-compat obligations + // so we can implement the spec to store XMP in a separate APP1 segment. + case IMAGE_TYPE_RAF: + return XMP_HANDLING_PREFER_SEPARATE; + case IMAGE_TYPE_DNG: + case IMAGE_TYPE_ORF: + case IMAGE_TYPE_PEF: + case IMAGE_TYPE_RW2: + case IMAGE_TYPE_UNKNOWN: + // WebP supports a separate XMP chunk (so should be XMP_HANDLING_PREFER_SEPARATE), but + // ExifInterface doesn't currently read or write it. + case IMAGE_TYPE_WEBP: + default: + return XMP_HANDLING_TIFF_700_ONLY; + } + } + + /** + * Returns the value of the specified tag or {@code null} if there + * is no such tag in the image file. + * + * @param tag the name of the tag. + */ + public @Nullable String getAttribute(@NonNull String tag) { + if (tag == null) { + throw new NullPointerException("tag shouldn't be null"); + } + ExifAttribute attribute = getExifAttribute(tag); + if (attribute == null) { + return null; + } + if (tag.equals(TAG_GPS_TIMESTAMP)) { + // Convert GPS timestamp value to a custom format for backwards compatibility. + if (attribute.format != IFD_FORMAT_URATIONAL + && attribute.format != IFD_FORMAT_SRATIONAL) { + Log.w(TAG, "GPS Timestamp format is not rational. format=" + attribute.format); + return null; + } + Rational[] array = (Rational[]) attribute.getValue(mExifByteOrder); + if (array == null || array.length != 3) { + Log.w(TAG, "Invalid GPS Timestamp array. array=" + Arrays.toString(array)); + return null; + } + return String.format("%02d:%02d:%02d", + (int) ((float) array[0].numerator / array[0].denominator), + (int) ((float) array[1].numerator / array[1].denominator), + (int) ((float) array[2].numerator / array[2].denominator)); + } else if (RATIONAL_TAGS_HANDLED_AS_DECIMALS_FOR_COMPATIBILITY.contains(tag)) { + // Convert the rational values to the custom formats for backwards compatibility. + try { + return Double.toString(attribute.getDoubleValue(mExifByteOrder)); + } catch (NumberFormatException e) { + return null; + } + } else { + return attribute.getStringValue(mExifByteOrder); + } + } + + /** + * Returns the integer value of the specified tag. If there is no such tag + * in the image file or the value cannot be parsed as integer, return + * <var>defaultValue</var>. + * + * @param tag the name of the tag. + * @param defaultValue the value to return if the tag is not available. + */ + public int getAttributeInt(@NonNull String tag, int defaultValue) { + if (tag == null) { + throw new NullPointerException("tag shouldn't be null"); + } + ExifAttribute exifAttribute = getExifAttribute(tag); + if (exifAttribute == null) { + return defaultValue; + } + + try { + return exifAttribute.getIntValue(mExifByteOrder); + } catch (NumberFormatException e) { + return defaultValue; + } + } + + /** + * Returns the double value of the tag that is specified as rational or contains a + * double-formatted value. If there is no such tag in the image file or the value cannot be + * parsed as double, return <var>defaultValue</var>. + * + * @param tag the name of the tag. + * @param defaultValue the value to return if the tag is not available. + */ + public double getAttributeDouble(@NonNull String tag, double defaultValue) { + if (tag == null) { + throw new NullPointerException("tag shouldn't be null"); + } + ExifAttribute exifAttribute = getExifAttribute(tag); + if (exifAttribute == null) { + return defaultValue; + } + + try { + return exifAttribute.getDoubleValue(mExifByteOrder); + } catch (NumberFormatException e) { + return defaultValue; + } + } + + /** + * Sets the value of the specified tag. + * + * @param tag the name of the tag. + * @param value the value of the tag. + */ + @SuppressWarnings("deprecation") + public void setAttribute(@NonNull String tag, @Nullable String value) { + if (tag == null) { + throw new NullPointerException("tag shouldn't be null"); + } + + // Maintain compatibility. + if (TAG_ISO_SPEED_RATINGS.equals(tag)) { + if (DEBUG) { + Log.d(TAG, "setAttribute: Replacing TAG_ISO_SPEED_RATINGS with " + + "TAG_PHOTOGRAPHIC_SENSITIVITY."); + } + tag = TAG_PHOTOGRAPHIC_SENSITIVITY; + } + // Maybe convert the given value for backwards compatibility. + if (value != null) { + if (RATIONAL_TAGS_HANDLED_AS_DECIMALS_FOR_COMPATIBILITY.contains(tag) + && !value.contains("/")) { + // Convert floating point values to rational for rational tags that are emitted and + // consumed as floating point values for backwards compatibility. + try { + double doubleValue = Double.parseDouble(value); + value = Rational.createFromDouble(doubleValue).toString(); + } catch (NumberFormatException e) { + Log.w(TAG, "Invalid value for " + tag + " : " + value); + return; + } + } else if (tag.equals(TAG_GPS_TIMESTAMP)) { + Matcher m = GPS_TIMESTAMP_PATTERN.matcher(value); + if (!m.find()) { + Log.w(TAG, "Invalid value for " + tag + " : " + value); + return; + } + value = + Integer.parseInt(m.group(1)) + + "/1," + + Integer.parseInt(m.group(2)) + + "/1," + + Integer.parseInt(m.group(3)) + + "/1"; + } else if (TAG_DATETIME.equals(tag) + || TAG_DATETIME_ORIGINAL.equals(tag) + || TAG_DATETIME_DIGITIZED.equals(tag)) { + // Validate and convert datetime values if necessary. + boolean isPrimaryFormat = DATETIME_PRIMARY_FORMAT_PATTERN.matcher(value).find(); + boolean isSecondaryFormat = DATETIME_SECONDARY_FORMAT_PATTERN.matcher(value).find(); + // Validate + if (value.length() != DATETIME_VALUE_STRING_LENGTH + || (!isPrimaryFormat && !isSecondaryFormat)) { + Log.w(TAG, "Invalid value for " + tag + " : " + value); + return; + } + // If datetime value has secondary format (e.g. 2020-01-01 00:00:00), convert it to + // primary format (e.g. 2020:01:01 00:00:00) since it is the format in the official + // documentation. + // See JEITA CP-3451C Section 4.6.4. D. Other Tags, DateTime + if (isSecondaryFormat) { + // Replace "-" with ":" to match the primary format. + value = value.replaceAll("-", ":"); + } + } + } + + if (TAG_XMP.equals(tag)) { + boolean containsTiff700Xmp = + mAttributes[IFD_TYPE_PRIMARY].containsKey(TAG_XMP) + || mAttributes[IFD_TYPE_PREVIEW].containsKey(TAG_XMP); + @XmpHandling int xmpHandling = getXmpHandlingForImageType(mMimeType); + if ((xmpHandling == XMP_HANDLING_PREFER_SEPARATE + && (mXmpFromSeparateMarker != null || !containsTiff700Xmp)) + || (xmpHandling == XMP_HANDLING_PREFER_TIFF_700_IF_PRESENT + && !containsTiff700Xmp)) { + mXmpFromSeparateMarker = value != null ? ExifAttribute.createByte(value) : null; + return; + } + } + + for (int i = 0; i < EXIF_TAGS.length; ++i) { + if (i == IFD_TYPE_THUMBNAIL && !mHasThumbnail) { + continue; + } + final ExifTag exifTag = sExifTagMapsForWriting[i].get(tag); + if (exifTag != null) { + if (value == null) { + mAttributes[i].remove(tag); + continue; + } + Pair<Integer, Integer> guess = guessDataFormat(value); + int dataFormat; + if (exifTag.primaryFormat == guess.first || exifTag.primaryFormat == guess.second) { + dataFormat = exifTag.primaryFormat; + } else if (exifTag.secondaryFormat != -1 && (exifTag.secondaryFormat == guess.first + || exifTag.secondaryFormat == guess.second)) { + dataFormat = exifTag.secondaryFormat; + } else if (exifTag.primaryFormat == IFD_FORMAT_BYTE + || exifTag.primaryFormat == IFD_FORMAT_UNDEFINED + || exifTag.primaryFormat == IFD_FORMAT_STRING) { + dataFormat = exifTag.primaryFormat; + } else { + if (DEBUG) { + Log.d(TAG, "Given tag (" + tag + + ") value didn't match with one of expected " + + "formats: " + IFD_FORMAT_NAMES[exifTag.primaryFormat] + + (exifTag.secondaryFormat == -1 ? "" : ", " + + IFD_FORMAT_NAMES[exifTag.secondaryFormat]) + " (guess: " + + IFD_FORMAT_NAMES[guess.first] + (guess.second == -1 ? "" : ", " + + IFD_FORMAT_NAMES[guess.second]) + ")"); + } + continue; + } + switch (dataFormat) { + case IFD_FORMAT_BYTE: { + mAttributes[i].put(tag, ExifAttribute.createByte(value)); + break; + } + case IFD_FORMAT_UNDEFINED: + case IFD_FORMAT_STRING: { + mAttributes[i].put(tag, ExifAttribute.createString(value)); + break; + } + case IFD_FORMAT_USHORT: { + final String[] values = value.split(",", -1); + final int[] intArray = new int[values.length]; + for (int j = 0; j < values.length; ++j) { + intArray[j] = Integer.parseInt(values[j]); + } + mAttributes[i].put(tag, + ExifAttribute.createUShort(intArray, mExifByteOrder)); + break; + } + case IFD_FORMAT_SLONG: { + final String[] values = value.split(",", -1); + final int[] intArray = new int[values.length]; + for (int j = 0; j < values.length; ++j) { + intArray[j] = Integer.parseInt(values[j]); + } + mAttributes[i].put(tag, + ExifAttribute.createSLong(intArray, mExifByteOrder)); + break; + } + case IFD_FORMAT_ULONG: { + final String[] values = value.split(",", -1); + final long[] longArray = new long[values.length]; + for (int j = 0; j < values.length; ++j) { + longArray[j] = Long.parseLong(values[j]); + } + mAttributes[i].put(tag, + ExifAttribute.createULong(longArray, mExifByteOrder)); + break; + } + case IFD_FORMAT_URATIONAL: { + final String[] values = value.split(",", -1); + final Rational[] rationalArray = new Rational[values.length]; + for (int j = 0; j < values.length; ++j) { + final String[] numbers = values[j].split("/", -1); + rationalArray[j] = new Rational((long) Double.parseDouble(numbers[0]), + (long) Double.parseDouble(numbers[1])); + } + mAttributes[i].put(tag, + ExifAttribute.createURational(rationalArray, mExifByteOrder)); + break; + } + case IFD_FORMAT_SRATIONAL: { + final String[] values = value.split(",", -1); + final Rational[] rationalArray = new Rational[values.length]; + for (int j = 0; j < values.length; ++j) { + final String[] numbers = values[j].split("/", -1); + rationalArray[j] = new Rational((long) Double.parseDouble(numbers[0]), + (long) Double.parseDouble(numbers[1])); + } + mAttributes[i].put(tag, + ExifAttribute.createSRational(rationalArray, mExifByteOrder)); + break; + } + case IFD_FORMAT_DOUBLE: { + final String[] values = value.split(",", -1); + final double[] doubleArray = new double[values.length]; + for (int j = 0; j < values.length; ++j) { + doubleArray[j] = Double.parseDouble(values[j]); + } + mAttributes[i].put(tag, + ExifAttribute.createDouble(doubleArray, mExifByteOrder)); + break; + } + default: + if (DEBUG) { + Log.d(TAG, "Data format isn't one of expected formats: " + dataFormat); + } + continue; + } + } + } + } + + /** + * Resets the {@link #TAG_ORIENTATION} of the image to be {@link #ORIENTATION_NORMAL}. + */ + public void resetOrientation() { + setAttribute(TAG_ORIENTATION, Integer.toString(ORIENTATION_NORMAL)); + } + + /** + * Rotates the image by the given degree clockwise. The degree should be a multiple of + * 90 (e.g, 90, 180, -90, etc.). + * + * @param degree The degree of rotation. + */ + public void rotate(int degree) { + if (degree % 90 != 0) { + throw new IllegalArgumentException("degree should be a multiple of 90"); + } + + int currentOrientation = getAttributeInt(TAG_ORIENTATION, ORIENTATION_NORMAL); + int currentIndex, newIndex; + int resultOrientation; + if (ROTATION_ORDER.contains(currentOrientation)) { + currentIndex = ROTATION_ORDER.indexOf(currentOrientation); + newIndex = (currentIndex + degree / 90) % 4; + newIndex += newIndex < 0 ? 4 : 0; + resultOrientation = ROTATION_ORDER.get(newIndex); + } else if (FLIPPED_ROTATION_ORDER.contains(currentOrientation)) { + currentIndex = FLIPPED_ROTATION_ORDER.indexOf(currentOrientation); + newIndex = (currentIndex + degree / 90) % 4; + newIndex += newIndex < 0 ? 4 : 0; + resultOrientation = FLIPPED_ROTATION_ORDER.get(newIndex); + } else { + resultOrientation = ORIENTATION_UNDEFINED; + } + + setAttribute(TAG_ORIENTATION, Integer.toString(resultOrientation)); + } + + /** + * Flips the image vertically. + */ + public void flipVertically() { + int currentOrientation = getAttributeInt(TAG_ORIENTATION, ORIENTATION_NORMAL); + int resultOrientation; + switch (currentOrientation) { + case ORIENTATION_FLIP_HORIZONTAL: + resultOrientation = ORIENTATION_ROTATE_180; + break; + case ORIENTATION_ROTATE_180: + resultOrientation = ORIENTATION_FLIP_HORIZONTAL; + break; + case ORIENTATION_FLIP_VERTICAL: + resultOrientation = ORIENTATION_NORMAL; + break; + case ORIENTATION_TRANSPOSE: + resultOrientation = ORIENTATION_ROTATE_270; + break; + case ORIENTATION_ROTATE_90: + resultOrientation = ORIENTATION_TRANSVERSE; + break; + case ORIENTATION_TRANSVERSE: + resultOrientation = ORIENTATION_ROTATE_90; + break; + case ORIENTATION_ROTATE_270: + resultOrientation = ORIENTATION_TRANSPOSE; + break; + case ORIENTATION_NORMAL: + resultOrientation = ORIENTATION_FLIP_VERTICAL; + break; + case ORIENTATION_UNDEFINED: + default: + resultOrientation = ORIENTATION_UNDEFINED; + break; + } + setAttribute(TAG_ORIENTATION, Integer.toString(resultOrientation)); + } + + /** + * Flips the image horizontally. + */ + public void flipHorizontally() { + int currentOrientation = getAttributeInt(TAG_ORIENTATION, ORIENTATION_NORMAL); + int resultOrientation; + switch (currentOrientation) { + case ORIENTATION_FLIP_HORIZONTAL: + resultOrientation = ORIENTATION_NORMAL; + break; + case ORIENTATION_ROTATE_180: + resultOrientation = ORIENTATION_FLIP_VERTICAL; + break; + case ORIENTATION_FLIP_VERTICAL: + resultOrientation = ORIENTATION_ROTATE_180; + break; + case ORIENTATION_TRANSPOSE: + resultOrientation = ORIENTATION_ROTATE_90; + break; + case ORIENTATION_ROTATE_90: + resultOrientation = ORIENTATION_TRANSPOSE; + break; + case ORIENTATION_TRANSVERSE: + resultOrientation = ORIENTATION_ROTATE_270; + break; + case ORIENTATION_ROTATE_270: + resultOrientation = ORIENTATION_TRANSVERSE; + break; + case ORIENTATION_NORMAL: + resultOrientation = ORIENTATION_FLIP_HORIZONTAL; + break; + case ORIENTATION_UNDEFINED: + default: + resultOrientation = ORIENTATION_UNDEFINED; + break; + } + setAttribute(TAG_ORIENTATION, Integer.toString(resultOrientation)); + } + + /** + * Returns if the current image orientation is flipped. + * + * @see #getRotationDegrees() + */ + public boolean isFlipped() { + int orientation = getAttributeInt(TAG_ORIENTATION, ORIENTATION_NORMAL); + switch (orientation) { + case ORIENTATION_FLIP_HORIZONTAL: + case ORIENTATION_TRANSVERSE: + case ORIENTATION_FLIP_VERTICAL: + case ORIENTATION_TRANSPOSE: + return true; + default: + return false; + } + } + + /** + * Returns the rotation degrees for the current image orientation. If the image is flipped, + * i.e., {@link #isFlipped()} returns {@code true}, the rotation degrees will be base on + * the assumption that the image is first flipped horizontally (along Y-axis), and then do + * the rotation. For example, {@link #ORIENTATION_TRANSPOSE} will be interpreted as flipped + * horizontally first, and then rotate 270 degrees clockwise. + * + * @return The rotation degrees of the image after the horizontal flipping is applied, if any. + * @see #isFlipped() + */ + public int getRotationDegrees() { + int orientation = getAttributeInt(TAG_ORIENTATION, ORIENTATION_NORMAL); + switch (orientation) { + case ORIENTATION_ROTATE_90: + case ORIENTATION_TRANSVERSE: + return 90; + case ORIENTATION_ROTATE_180: + case ORIENTATION_FLIP_VERTICAL: + return 180; + case ORIENTATION_ROTATE_270: + case ORIENTATION_TRANSPOSE: + return 270; + case ORIENTATION_UNDEFINED: + case ORIENTATION_NORMAL: + case ORIENTATION_FLIP_HORIZONTAL: + default: + return 0; + } + } + + /** + * Remove any values of the specified tag. + * + * @param tag the name of the tag. + */ + private void removeAttribute(String tag) { + for (int i = 0; i < EXIF_TAGS.length; ++i) { + mAttributes[i].remove(tag); + } + } + + /** + * This function decides which parser to read the image data according to the given input stream + * type and the content of the input stream. + */ + private void loadAttributes(@NonNull InputStream in) { + try { + // Initialize mAttributes. + for (int i = 0; i < EXIF_TAGS.length; ++i) { + mAttributes[i] = new HashMap<>(); + } + + // Check file type + if (!mIsExifDataOnly) { + in = new BufferedInputStream(in, SIGNATURE_CHECK_SIZE); + mMimeType = getMimeType((BufferedInputStream) in); + } + + if (shouldSupportSeek(mMimeType)) { + SeekableByteOrderedDataInputStream inputStream = + new SeekableByteOrderedDataInputStream(in); + if (mIsExifDataOnly) { + if (!getStandaloneAttributes(inputStream)) { + return; + } + } else { + if (mMimeType == IMAGE_TYPE_HEIC || mMimeType == IMAGE_TYPE_AVIF) { + getHeifAttributes(inputStream, mMimeType); + } else if (mMimeType == IMAGE_TYPE_ORF) { + getOrfAttributes(inputStream); + } else if (mMimeType == IMAGE_TYPE_RW2) { + getRw2Attributes(inputStream); + } else { + getRawAttributes(inputStream); + } + } + // Set thumbnail image offset and length + inputStream.seek(mOffsetToExifData); + setThumbnailData(inputStream); + } else { + ByteOrderedDataInputStream inputStream = new ByteOrderedDataInputStream(in); + if (mMimeType == IMAGE_TYPE_JPEG) { + getJpegAttributes(inputStream, /* offsetToJpeg= */ 0, + IFD_TYPE_PRIMARY); + } else if (mMimeType == IMAGE_TYPE_PNG) { + getPngAttributes(inputStream); + } else if (mMimeType == IMAGE_TYPE_RAF) { + getRafAttributes(inputStream); + } else if (mMimeType == IMAGE_TYPE_WEBP) { + getWebpAttributes(inputStream); + } + } + } catch (IOException | UnsupportedOperationException e) { + // Ignore exceptions in order to keep the compatibility with the old versions of + // ExifInterface. + if (DEBUG) { + Log.w(TAG, "Invalid image: ExifInterface got an unsupported image format file " + + "(ExifInterface supports JPEG and some RAW image formats only) " + + "or a corrupted JPEG file to ExifInterface.", e); + } + } finally { + addDefaultValuesForCompatibility(); + + if (DEBUG) { + printAttributes(); + } + } + } + + private static boolean isSeekableFD(FileDescriptor fd) { + try { + Os.lseek(fd, /* offset= */ 0, /* whence= */ OsConstants.SEEK_CUR); + return true; + } catch (Exception e) { + if (DEBUG) { + Log.d(TAG, "The file descriptor for the given input is not seekable"); + } + return false; + } + } + + // Prints out attributes for debugging. + private void printAttributes() { + for (int i = 0; i < mAttributes.length; ++i) { + Log.d(TAG, "The size of tag group[" + i + "]: " + mAttributes[i].size()); + for (Map.Entry<String, ExifAttribute> entry : mAttributes[i].entrySet()) { + final ExifAttribute tagValue = entry.getValue(); + Log.d(TAG, "tagName: " + entry.getKey() + ", tagType: " + tagValue.toString() + + ", tagValue: '" + tagValue.getStringValue(mExifByteOrder) + "'"); + } + } + } + + /** + * Save the tag data into the original image file. This is expensive because it involves + * copying all the data from one file to another and deleting the old file and renaming the + * other. It's best to use {@link #setAttribute(String, String)} to set all attributes to write + * and make a single call rather than multiple calls for each attribute. + * <p> + * This method is supported for JPEG, PNG, and WebP formats. + * <p class="note"> + * Note: after calling this method, any attempts to obtain range information + * from {@link #getAttributeRange(String)} or {@link #getThumbnailRange()} + * will throw {@link IllegalStateException}, since the offsets may have + * changed in the newly written file. + * <p> + * For WebP format, the Exif data will be stored as an Extended File Format, and it may not be + * supported for older readers. + * <p> + * For PNG format, the Exif data will be stored as an "eXIf" chunk as per + * "Extensions to the PNG 1.2 Specification, Version 1.5.0". + */ + public void saveAttributes() throws IOException { + if (!isSupportedFormatForSavingAttributes(mMimeType)) { + throw new IOException("ExifInterface only supports saving attributes for JPEG, PNG, " + + "and WebP formats."); + } + if (mSeekableFileDescriptor == null && mFilename == null) { + throw new IOException( + "ExifInterface does not support saving attributes for the current input."); + } + if (mHasThumbnail && mHasThumbnailStrips && !mAreThumbnailStripsConsecutive) { + throw new IOException("ExifInterface does not support saving attributes when the image " + + "file has non-consecutive thumbnail strips"); + } + + // Remember the fact that we've changed the file on disk from what was + // originally parsed, meaning we can't answer range questions + mModified = true; + + // Keep the thumbnail in memory + mThumbnailBytes = getThumbnail(); + + FileInputStream in = null; + FileOutputStream out = null; + File tempFile; + try { + // Copy the original file to temporary file. + tempFile = File.createTempFile("temp", "tmp"); + if (mFilename != null) { + in = new FileInputStream(mFilename); + } else { + Os.lseek( + mSeekableFileDescriptor, + /* offset= */ 0, + /* whence= */ OsConstants.SEEK_SET); + in = new FileInputStream(mSeekableFileDescriptor); + } + out = new FileOutputStream(tempFile); + copy(in, out); + } catch (Exception e) { + throw new IOException("Failed to copy original file to temp file", e); + } finally { + closeQuietly(in); + closeQuietly(out); + } + + in = null; + out = null; + BufferedInputStream bufferedIn = null; + BufferedOutputStream bufferedOut = null; + boolean shouldKeepTempFile = false; + try { + // Save the new file. + in = new FileInputStream(tempFile); + if (mFilename != null) { + out = new FileOutputStream(mFilename); + } else { + FileDescriptor fd = mSeekableFileDescriptor; + Os.lseek(fd, /* offset= */ 0, /* whence= */ OsConstants.SEEK_SET); + out = new FileOutputStream(mSeekableFileDescriptor); + } + bufferedIn = new BufferedInputStream(in); + bufferedOut = new BufferedOutputStream(out); + if (mMimeType == IMAGE_TYPE_JPEG) { + saveJpegAttributes(bufferedIn, bufferedOut); + } else if (mMimeType == IMAGE_TYPE_PNG) { + savePngAttributes(bufferedIn, bufferedOut); + } else if (mMimeType == IMAGE_TYPE_WEBP) { + saveWebpAttributes(bufferedIn, bufferedOut); + } + } catch (Exception e) { + try { + // Restore original file + in = new FileInputStream(tempFile); + if (mFilename != null) { + out = new FileOutputStream(mFilename); + } else { + Os.lseek( + mSeekableFileDescriptor, + /* offset= */ 0, + /* whence= */ OsConstants.SEEK_SET); + out = new FileOutputStream(mSeekableFileDescriptor); + } + copy(in, out); + } catch (Exception exception) { + shouldKeepTempFile = true; + throw new IOException("Failed to save new file. Original file is stored in " + + tempFile.getAbsolutePath(), exception); + } finally { + closeQuietly(in); + closeQuietly(out); + } + throw new IOException("Failed to save new file", e); + } finally { + closeQuietly(bufferedIn); + closeQuietly(bufferedOut); + if (!shouldKeepTempFile) { + tempFile.delete(); + } + } + + // Discard the thumbnail in memory + mThumbnailBytes = null; + } + + /** + * Returns true if the image file has a thumbnail. + */ + public boolean hasThumbnail() { + return mHasThumbnail; + } + + /** + * Returns true if the image file has the given attribute defined. + * + * @param tag the name of the tag. + */ + public boolean hasAttribute(@NonNull String tag) { + return getExifAttribute(tag) != null; + } + + /** + * Returns the JPEG compressed thumbnail inside the image file, or {@code null} if there is no + * JPEG compressed thumbnail. + * The returned data can be decoded using + * {@link BitmapFactory#decodeByteArray(byte[], int, int)} + */ + public byte @Nullable [] getThumbnail() { + if (mThumbnailCompression == DATA_JPEG || mThumbnailCompression == DATA_JPEG_COMPRESSED) { + return getThumbnailBytes(); + } + return null; + } + + /** + * Returns the thumbnail bytes inside the image file, regardless of the compression type of the + * thumbnail image. + */ + public byte @Nullable [] getThumbnailBytes() { + if (!mHasThumbnail) { + return null; + } + if (mThumbnailBytes != null) { + return mThumbnailBytes; + } + + // Read the thumbnail. + InputStream in = null; + FileDescriptor newFileDescriptor = null; + try { + if (mAssetInputStream != null) { + in = mAssetInputStream; + if (in.markSupported()) { + in.reset(); + } else { + Log.d(TAG, "Cannot read thumbnail from inputstream without mark/reset support"); + return null; + } + } else if (mFilename != null) { + in = new FileInputStream(mFilename); + } else { + newFileDescriptor = Os.dup(mSeekableFileDescriptor); + Os.lseek(newFileDescriptor, /* offset= */ 0, /* whence= */ OsConstants.SEEK_SET); + in = new FileInputStream(newFileDescriptor); + } + if (in == null) { + // Should not be reached this. + throw new FileNotFoundException(); + } + + ByteOrderedDataInputStream inputStream = new ByteOrderedDataInputStream(in); + inputStream.skipFully(mThumbnailOffset + mOffsetToExifData); + + // TLAD start + if (mThumbnailLength > getAvailableHeapSize()) { + throw new IOException("cannot allocate " + mThumbnailLength + " bytes to retrieve thumbnail"); + } + // TLAD end + + // TODO: Need to handle potential OutOfMemoryError + byte[] buffer = new byte[mThumbnailLength]; + inputStream.readFully(buffer); + mThumbnailBytes = buffer; + return buffer; + } catch (Exception e) { + // Couldn't get a thumbnail image. + Log.d(TAG, "Encountered exception while getting thumbnail", e); + } finally { + closeQuietly(in); + if (newFileDescriptor != null) { + closeFileDescriptor(newFileDescriptor); + } + } + return null; + } + + /** + * Creates and returns a Bitmap object of the thumbnail image based on the byte array and the + * thumbnail compression value, or {@code null} if the compression type is unsupported. + */ + public @Nullable Bitmap getThumbnailBitmap() { + if (!mHasThumbnail) { + return null; + } else if (mThumbnailBytes == null) { + mThumbnailBytes = getThumbnailBytes(); + } + + if (mThumbnailCompression == DATA_JPEG || mThumbnailCompression == DATA_JPEG_COMPRESSED) { + return BitmapFactory.decodeByteArray(mThumbnailBytes, 0, mThumbnailLength); + } else if (mThumbnailCompression == DATA_UNCOMPRESSED) { + int[] rgbValues = new int[mThumbnailBytes.length / 3]; + byte alpha = (byte) 0xff000000; + for (int i = 0; i < rgbValues.length; i++) { + rgbValues[i] = alpha + (mThumbnailBytes[3 * i] << 16) + + (mThumbnailBytes[3 * i + 1] << 8) + mThumbnailBytes[3 * i + 2]; + } + + ExifAttribute imageLengthAttribute = + mAttributes[IFD_TYPE_THUMBNAIL].get(TAG_THUMBNAIL_IMAGE_LENGTH); + ExifAttribute imageWidthAttribute = + mAttributes[IFD_TYPE_THUMBNAIL].get(TAG_THUMBNAIL_IMAGE_WIDTH); + if (imageLengthAttribute != null && imageWidthAttribute != null) { + int imageLength = imageLengthAttribute.getIntValue(mExifByteOrder); + int imageWidth = imageWidthAttribute.getIntValue(mExifByteOrder); + return Bitmap.createBitmap( + rgbValues, imageWidth, imageLength, Bitmap.Config.ARGB_8888); + } + } + return null; + } + + /** + * Returns true if thumbnail image is JPEG Compressed, or false if either thumbnail image does + * not exist or thumbnail image is uncompressed. + */ + public boolean isThumbnailCompressed() { + if (!mHasThumbnail) { + return false; + } + if (mThumbnailCompression == DATA_JPEG || mThumbnailCompression == DATA_JPEG_COMPRESSED) { + return true; + } + return false; + } + + /** + * Returns the offset and length of thumbnail inside the image file, or + * {@code null} if either there is no thumbnail or the thumbnail bytes are stored + * non-consecutively. + * + * @return two-element array, the offset in the first value, and length in + * the second, or {@code null} if no thumbnail was found or the thumbnail strips are + * not placed consecutively. + * @throws IllegalStateException if {@link #saveAttributes()} has been + * called since the underlying file was initially parsed, since + * that means offsets may have changed. + */ + public long @Nullable [] getThumbnailRange() { + if (mModified) { + throw new IllegalStateException( + "The underlying file has been modified since being parsed"); + } + + if (mHasThumbnail) { + if (mHasThumbnailStrips && !mAreThumbnailStripsConsecutive) { + return null; + } + return new long[]{mThumbnailOffset + mOffsetToExifData, mThumbnailLength}; + } + return null; + } + + /** + * Returns the offset and length of the requested tag inside the image file, or {@code null} if + * the tag is not contained. + * + * <p>If the attribute has been modified with {@link #setAttribute(String, String)} but not yet + * written to disk with {@link #saveAttributes()}, the returned range will have the correct + * length for the modified value, but an offset of {@code -1} to indicate its position in the + * file isn't known. + * + * @return two-element array, the offset in the first value, and length in the second, or {@code + * null} if no tag was found. + * @throws IllegalStateException if {@link #saveAttributes()} has been called since the + * underlying file was initially parsed, since that means offsets may have changed. + */ + public long @Nullable [] getAttributeRange(@NonNull String tag) { + if (tag == null) { + throw new NullPointerException("tag shouldn't be null"); + } + if (mModified) { + throw new IllegalStateException( + "The underlying file has been modified since being parsed"); + } + + final ExifAttribute attribute = getExifAttribute(tag); + if (attribute != null) { + return new long[]{attribute.bytesOffset, attribute.bytes.length}; + } else { + return null; + } + } + + /** + * Returns the raw bytes for the value of the requested tag inside the image + * file, or {@code null} if the tag is not contained. + * + * @return raw bytes for the value of the requested tag, or {@code null} if + * no tag was found. + */ + public byte @Nullable [] getAttributeBytes(@NonNull String tag) { + if (tag == null) { + throw new NullPointerException("tag shouldn't be null"); + } + final ExifAttribute attribute = getExifAttribute(tag); + if (attribute != null) { + return attribute.bytes; + } else { + return null; + } + } + + /** + * Stores the latitude and longitude value in a float array. The first element is the latitude, + * and the second element is the longitude. Returns false if the Exif tags are not available. + * + * @deprecated Use {@link #getLatLong()} instead. + */ + @Deprecated + public boolean getLatLong(float output[]) { + double[] latLong = getLatLong(); + if (latLong == null) { + return false; + } + + output[0] = (float) latLong[0]; + output[1] = (float) latLong[1]; + return true; + } + + /** + * Gets the latitude and longitude values. + * <p> + * If there are valid latitude and longitude values in the image, this method returns a double + * array where the first element is the latitude and the second element is the longitude. + * Otherwise, it returns null. + */ + public double @Nullable [] getLatLong() { + String latValue = getAttribute(TAG_GPS_LATITUDE); + String latRef = getAttribute(TAG_GPS_LATITUDE_REF); + String lngValue = getAttribute(TAG_GPS_LONGITUDE); + String lngRef = getAttribute(TAG_GPS_LONGITUDE_REF); + + if (latValue != null && latRef != null && lngValue != null && lngRef != null) { + try { + double latitude = convertRationalLatLonToDouble(latValue, latRef); + double longitude = convertRationalLatLonToDouble(lngValue, lngRef); + return new double[]{latitude, longitude}; + } catch (IllegalArgumentException e) { + Log.w(TAG, "Latitude/longitude values are not parsable. " + + String.format("latValue=%s, latRef=%s, lngValue=%s, lngRef=%s", + latValue, latRef, lngValue, lngRef)); + } + } + return null; + } + + /** + * Sets the GPS-related information. It will set GPS processing method, latitude and longitude + * values, GPS timestamp, and speed information at the same time. + * <p> + * This method is a No-Op if the location parameter is null. + * + * @param location the {@link Location} object returned by GPS service. + */ + public void setGpsInfo(@Nullable Location location) { + if (location == null) { + return; + } + setAttribute(ExifInterfaceFork.TAG_GPS_PROCESSING_METHOD, location.getProvider()); + setLatLong(location.getLatitude(), location.getLongitude()); + setAltitude(location.getAltitude()); + // Location objects store speeds in m/sec. Translates it to km/hr here. + setAttribute(TAG_GPS_SPEED_REF, "K"); + setAttribute( + TAG_GPS_SPEED, + Rational.createFromDouble(location.getSpeed() * TimeUnit.HOURS.toSeconds(1) / 1000) + .toString()); + String[] dateTime = sFormatterPrimary.format( + new Date(location.getTime())).split("\\s+", -1); + setAttribute(ExifInterfaceFork.TAG_GPS_DATESTAMP, dateTime[0]); + setAttribute(ExifInterfaceFork.TAG_GPS_TIMESTAMP, dateTime[1]); + } + + /** + * Sets the latitude and longitude values. + * + * @param latitude the decimal value of latitude. Must be a valid double value between -90.0 and + * 90.0. + * @param longitude the decimal value of longitude. Must be a valid double value between -180.0 + * and 180.0. + * @throws IllegalArgumentException If {@code latitude} or {@code longitude} is outside the + * specified range. + */ + public void setLatLong(double latitude, double longitude) { + if (latitude < -90.0 || latitude > 90.0 || Double.isNaN(latitude)) { + throw new IllegalArgumentException("Latitude value " + latitude + " is not valid."); + } + if (longitude < -180.0 || longitude > 180.0 || Double.isNaN(longitude)) { + throw new IllegalArgumentException("Longitude value " + longitude + " is not valid."); + } + setAttribute(TAG_GPS_LATITUDE_REF, latitude >= 0 ? "N" : "S"); + setAttribute(TAG_GPS_LATITUDE, convertDecimalDegree(Math.abs(latitude))); + setAttribute(TAG_GPS_LONGITUDE_REF, longitude >= 0 ? "E" : "W"); + setAttribute(TAG_GPS_LONGITUDE, convertDecimalDegree(Math.abs(longitude))); + } + + /** + * Return the altitude in meters. If the exif tag does not exist, return + * <var>defaultValue</var>. + * + * @param defaultValue the value to return if the tag is not available. + */ + public double getAltitude(double defaultValue) { + double altitude = getAttributeDouble(TAG_GPS_ALTITUDE, -1); + int ref = getAttributeInt(TAG_GPS_ALTITUDE_REF, -1); + + if (altitude >= 0 && ref >= 0) { + return (altitude * ((ref == 1) ? -1 : 1)); + } else { + return defaultValue; + } + } + + /** + * Sets the altitude in meters. + */ + public void setAltitude(double altitude) { + String ref = altitude >= 0 ? "0" : "1"; + setAttribute(TAG_GPS_ALTITUDE, Rational.createFromDouble(Math.abs(altitude)).toString()); + setAttribute(TAG_GPS_ALTITUDE_REF, ref); + } + + /** + * Set the date time value. + * + * @param timeStamp number of milliseconds since Jan. 1, 1970, midnight local time. + */ + @RestrictTo(RestrictTo.Scope.LIBRARY) + public void setDateTime(@NonNull Long timeStamp) { + if (timeStamp == null) { + throw new NullPointerException("Timestamp should not be null."); + } + + if (timeStamp < 0) { + throw new IllegalArgumentException("Timestamp should a positive value."); + } + + long subsec = timeStamp % 1000; + String subsecString = Long.toString(subsec); + for (int i = subsecString.length(); i < 3; i++) { + subsecString = "0" + subsecString; + } + setAttribute(TAG_DATETIME, sFormatterPrimary.format(new Date(timeStamp))); + setAttribute(TAG_SUBSEC_TIME, subsecString); + } + + /** + * Returns parsed {@link ExifInterfaceFork#TAG_DATETIME} value as number of milliseconds since + * Jan. 1, 1970, midnight local time. + * + * <p>Note: The return value includes the first three digits (or less depending on the length + * of the string) of {@link ExifInterfaceFork#TAG_SUBSEC_TIME}. + * + * @return null if date time information is unavailable or invalid. + */ + @RestrictTo(RestrictTo.Scope.LIBRARY) + public @Nullable Long getDateTime() { + return parseDateTime(getAttribute(TAG_DATETIME), + getAttribute(TAG_SUBSEC_TIME), + getAttribute(TAG_OFFSET_TIME)); + } + + /** + * Returns parsed {@link ExifInterfaceFork#TAG_DATETIME_DIGITIZED} value as number of + * milliseconds since Jan. 1, 1970, midnight local time. + * + * <p>Note: The return value includes the first three digits (or less depending on the length + * of the string) of {@link ExifInterfaceFork#TAG_SUBSEC_TIME_DIGITIZED}. + * + * @return null if digitized date time information is unavailable or invalid. + */ + @RestrictTo(RestrictTo.Scope.LIBRARY) + public @Nullable Long getDateTimeDigitized() { + return parseDateTime(getAttribute(TAG_DATETIME_DIGITIZED), + getAttribute(TAG_SUBSEC_TIME_DIGITIZED), + getAttribute(TAG_OFFSET_TIME_DIGITIZED)); + } + + /** + * Returns parsed {@link ExifInterfaceFork#TAG_DATETIME_ORIGINAL} value as number of + * milliseconds since Jan. 1, 1970, midnight local time. + * + * <p>Note: The return value includes the first three digits (or less depending on the length + * of the string) of {@link ExifInterfaceFork#TAG_SUBSEC_TIME_ORIGINAL}. + * + * @return null if original date time information is unavailable or invalid. + */ + @RestrictTo(RestrictTo.Scope.LIBRARY) + public @Nullable Long getDateTimeOriginal() { + return parseDateTime(getAttribute(TAG_DATETIME_ORIGINAL), + getAttribute(TAG_SUBSEC_TIME_ORIGINAL), + getAttribute(TAG_OFFSET_TIME_ORIGINAL)); + } + + private static Long parseDateTime(@Nullable String dateTimeString, @Nullable String subSecs, + @Nullable String offsetString) { + if (dateTimeString == null || !NON_ZERO_TIME_PATTERN.matcher(dateTimeString).matches()) { + return null; + } + + ParsePosition pos = new ParsePosition(0); + try { + // The exif field is in local time. Parsing it as if it is UTC will yield time + // since 1/1/1970 local time + Date dateTime = sFormatterPrimary.parse(dateTimeString, pos); + if (dateTime == null) { + dateTime = sFormatterSecondary.parse(dateTimeString, pos); + if (dateTime == null) { + return null; + } + } + long msecs = dateTime.getTime(); + if (offsetString != null) { + String sign = offsetString.substring(0, 1); + int hour = Integer.parseInt(offsetString.substring(1, 3)); + int min = Integer.parseInt(offsetString.substring(4, 6)); + if (("+".equals(sign) || "-".equals(sign)) + && ":".equals(offsetString.substring(3, 4)) + && hour <= 14 /* max UTC hour value */) { + msecs += (hour * 60 + min) * 60 * 1000 * ("-".equals(sign) ? 1 : -1); + } + } + + if (subSecs != null) { + msecs += parseSubSeconds(subSecs); + } + return msecs; + } catch (IllegalArgumentException e) { + return null; + } + } + + /** + * Returns number of milliseconds since 1970-01-01 00:00:00 UTC. + * + * @return null if the date time information is not available. + */ + @SuppressLint("AutoBoxing") /* Not a performance-critical call, thus not a big concern. */ + public @Nullable Long getGpsDateTime() { + String date = getAttribute(TAG_GPS_DATESTAMP); + String time = getAttribute(TAG_GPS_TIMESTAMP); + if (date == null || time == null + || (!NON_ZERO_TIME_PATTERN.matcher(date).matches() + && !NON_ZERO_TIME_PATTERN.matcher(time).matches())) { + return null; + } + + String dateTimeString = date + ' ' + time; + + ParsePosition pos = new ParsePosition(0); + try { + Date dateTime = sFormatterPrimary.parse(dateTimeString, pos); + if (dateTime == null) { + dateTime = sFormatterSecondary.parse(dateTimeString, pos); + if (dateTime == null) { + return null; + } + } + return dateTime.getTime(); + } catch (IllegalArgumentException e) { + return null; + } + } + + private void initForFilename(String filename) throws IOException { + if (filename == null) { + throw new NullPointerException("filename cannot be null"); + } + FileInputStream in = null; + mAssetInputStream = null; + mFilename = filename; + try { + in = new FileInputStream(filename); + if (isSeekableFD(in.getFD())) { + mSeekableFileDescriptor = in.getFD(); + } else { + mSeekableFileDescriptor = null; + } + loadAttributes(in); + } finally { + closeQuietly(in); + } + } + + private static double convertRationalLatLonToDouble(String rationalString, String ref) { + try { + String[] parts = rationalString.split(",", -1); + + String[] pair; + pair = parts[0].split("/", -1); + double degrees = Double.parseDouble(pair[0].trim()) + / Double.parseDouble(pair[1].trim()); + + pair = parts[1].split("/", -1); + double minutes = Double.parseDouble(pair[0].trim()) + / Double.parseDouble(pair[1].trim()); + + pair = parts[2].split("/", -1); + double seconds = Double.parseDouble(pair[0].trim()) + / Double.parseDouble(pair[1].trim()); + + double result = degrees + (minutes / 60.0) + (seconds / 3600.0); + if ((ref.equals("S") || ref.equals("W"))) { + return -result; + } else if (ref.equals("N") || ref.equals("E")) { + return result; + } else { + // Not valid + throw new IllegalArgumentException(); + } + } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) { + // Not valid + throw new IllegalArgumentException(e); + } + } + + private String convertDecimalDegree(double decimalDegree) { + long degrees = (long) decimalDegree; + long minutes = (long) ((decimalDegree - degrees) * 60.0); + long seconds = Math.round((decimalDegree - degrees - minutes / 60.0) * 3600.0 * 1e7); + return degrees + "/1," + minutes + "/1," + seconds + "/10000000"; + } + + // Checks the type of image file + private int getMimeType(BufferedInputStream in) throws IOException { + in.mark(SIGNATURE_CHECK_SIZE); + byte[] signatureCheckBytes = new byte[SIGNATURE_CHECK_SIZE]; + in.read(signatureCheckBytes); + in.reset(); + if (isJpegFormat(signatureCheckBytes)) { + return IMAGE_TYPE_JPEG; + } + if (isRafFormat(signatureCheckBytes)) { + return IMAGE_TYPE_RAF; + } + int heicOrAvifImageType = isHeicOrAvifFormat(signatureCheckBytes); + if (heicOrAvifImageType != IMAGE_TYPE_UNKNOWN) { + return heicOrAvifImageType; + } + if (isOrfFormat(signatureCheckBytes)) { + return IMAGE_TYPE_ORF; + } + if (isRw2Format(signatureCheckBytes)) { + return IMAGE_TYPE_RW2; + } + if (isPngFormat(signatureCheckBytes)) { + return IMAGE_TYPE_PNG; + } + if (isWebpFormat(signatureCheckBytes)) { + return IMAGE_TYPE_WEBP; + } + // Certain file formats (PEF) are identified in readImageFileDirectory() + return IMAGE_TYPE_UNKNOWN; + } + + /** + * This method looks at the first 3 bytes to determine if this file is a JPEG file. + * See http://www.media.mit.edu/pia/Research/deepview/exif.html, "JPEG format and Marker" + */ + private static boolean isJpegFormat(byte[] signatureCheckBytes) throws IOException { + for (int i = 0; i < JPEG_SIGNATURE.length; i++) { + if (signatureCheckBytes[i] != JPEG_SIGNATURE[i]) { + return false; + } + } + return true; + } + + /** + * This method looks at the first 15 bytes to determine if this file is a RAF file. + * There is no official specification for RAF files from Fuji, but there is an online archive of + * image file specifications: + * http://fileformats.archiveteam.org/wiki/Fujifilm_RAF + */ + private boolean isRafFormat(byte[] signatureCheckBytes) throws IOException { + byte[] rafSignatureBytes = RAF_SIGNATURE.getBytes(Charset.defaultCharset()); + for (int i = 0; i < rafSignatureBytes.length; i++) { + if (signatureCheckBytes[i] != rafSignatureBytes[i]) { + return false; + } + } + return true; + } + + private int isHeicOrAvifFormat(byte[] signatureCheckBytes) throws IOException { + ByteOrderedDataInputStream signatureInputStream = null; + try { + signatureInputStream = new ByteOrderedDataInputStream(signatureCheckBytes); + + long chunkSize = signatureInputStream.readInt(); + byte[] chunkType = new byte[4]; + signatureInputStream.readFully(chunkType); + + if (!Arrays.equals(chunkType, HEIF_TYPE_FTYP)) { + return IMAGE_TYPE_UNKNOWN; + } + + long chunkDataOffset = 8; + if (chunkSize == 1) { + // This indicates that the next 8 bytes represent the chunk size, + // and chunk data comes after that. + chunkSize = signatureInputStream.readLong(); + if (chunkSize < 16) { + // The smallest valid chunk is 16 bytes long in this case. + return IMAGE_TYPE_UNKNOWN; + } + chunkDataOffset += 8; + } + + // only sniff up to signatureCheckBytes.length + if (chunkSize > signatureCheckBytes.length) { + chunkSize = signatureCheckBytes.length; + } + + long chunkDataSize = chunkSize - chunkDataOffset; + + // It should at least have major brand (4-byte) and minor version (4-byte). + // The rest of the chunk (if any) is a list of (4-byte) compatible brands. + if (chunkDataSize < 8) { + return IMAGE_TYPE_UNKNOWN; + } + + byte[] brand = new byte[4]; + boolean isMif1 = false; + boolean isHeic = false; + boolean isAvif = false; + for (long i = 0; i < chunkDataSize / 4; ++i) { + try { + signatureInputStream.readFully(brand); + } catch (EOFException e) { + return IMAGE_TYPE_UNKNOWN; + } + if (i == 1) { + // Skip this index, it refers to the minorVersion, not a brand. + continue; + } + if (Arrays.equals(brand, HEIF_BRAND_MIF1)) { + isMif1 = true; + } else if (Arrays.equals(brand, HEIF_BRAND_HEIC)) { + isHeic = true; + } else if (Arrays.equals(brand, HEIF_BRAND_AVIF) + || Arrays.equals(brand, HEIF_BRAND_AVIS)) { + isAvif = true; + } + if (isMif1) { + if (isHeic) { + return IMAGE_TYPE_HEIC; + } else if (isAvif) { + return IMAGE_TYPE_AVIF; + } + } + } + } catch (Exception e) { + if (DEBUG) { + Log.d(TAG, "Exception parsing HEIF file type box.", e); + } + } finally { + if (signatureInputStream != null) { + signatureInputStream.close(); + signatureInputStream = null; + } + } + return IMAGE_TYPE_UNKNOWN; + } + + /** + * ORF has a similar structure to TIFF but it contains a different signature at the TIFF Header. + * This method looks at the 2 bytes following the Byte Order bytes to determine if this file is + * an ORF file. + * There is no official specification for ORF files from Olympus, but there is an online archive + * of image file specifications: + * http://fileformats.archiveteam.org/wiki/Olympus_ORF + */ + private boolean isOrfFormat(byte[] signatureCheckBytes) throws IOException { + ByteOrderedDataInputStream signatureInputStream = null; + + try { + signatureInputStream = new ByteOrderedDataInputStream(signatureCheckBytes); + + // Read byte order + mExifByteOrder = readByteOrder(signatureInputStream); + // Set byte order + signatureInputStream.setByteOrder(mExifByteOrder); + + short orfSignature = signatureInputStream.readShort(); + return orfSignature == ORF_SIGNATURE_1 || orfSignature == ORF_SIGNATURE_2; + } catch (Exception e) { + // Do nothing + } finally { + if (signatureInputStream != null) { + signatureInputStream.close(); + } + } + return false; + } + + /** + * RW2 is TIFF-based, but stores 0x55 signature byte instead of 0x42 at the header + * See http://lclevy.free.fr/raw/ + */ + private boolean isRw2Format(byte[] signatureCheckBytes) throws IOException { + ByteOrderedDataInputStream signatureInputStream = null; + + try { + signatureInputStream = new ByteOrderedDataInputStream(signatureCheckBytes); + + // Read byte order + mExifByteOrder = readByteOrder(signatureInputStream); + // Set byte order + signatureInputStream.setByteOrder(mExifByteOrder); + + short signatureByte = signatureInputStream.readShort(); + return signatureByte == RW2_SIGNATURE; + } catch (Exception e) { + // Do nothing + } finally { + if (signatureInputStream != null) { + signatureInputStream.close(); + } + } + return false; + } + + /** + * PNG's file signature is first 8 bytes. + * See PNG (Portable Network Graphics) Specification, Version 1.2, 3.1. PNG file signature + */ + private boolean isPngFormat(byte[] signatureCheckBytes) throws IOException { + for (int i = 0; i < PNG_SIGNATURE.length; i++) { + if (signatureCheckBytes[i] != PNG_SIGNATURE[i]) { + return false; + } + } + return true; + } + + /** + * WebP's file signature is composed of 12 bytes: + * 'RIFF' (4 bytes) + file length value (4 bytes) + 'WEBP' (4 bytes) + * See https://developers.google.com/speed/webp/docs/riff_container, Section "WebP File Header" + */ + private boolean isWebpFormat(byte[] signatureCheckBytes) throws IOException { + for (int i = 0; i < WEBP_SIGNATURE_1.length; i++) { + if (signatureCheckBytes[i] != WEBP_SIGNATURE_1[i]) { + return false; + } + } + for (int i = 0; i < WEBP_SIGNATURE_2.length; i++) { + if (signatureCheckBytes[i + WEBP_SIGNATURE_1.length + WEBP_FILE_SIZE_BYTE_LENGTH] + != WEBP_SIGNATURE_2[i]) { + return false; + } + } + return true; + } + + /** + * Loads EXIF attributes from a JPEG input stream. + * + * @param in The input stream that starts with the JPEG data. + * @param offsetToJpeg The offset to JPEG data for the original input stream. + * @param imageType The image type from which to retrieve metadata. Use IFD_TYPE_PRIMARY for + * primary image, IFD_TYPE_PREVIEW for preview image, and + * IFD_TYPE_THUMBNAIL for thumbnail image. + * @throws IOException If the data contains invalid JPEG markers, offsets, or length values. + */ + private void getJpegAttributes(ByteOrderedDataInputStream in, int offsetToJpeg, int imageType) + throws IOException { + // See JPEG File Interchange Format Specification, "JFIF Specification" + if (DEBUG) { + Log.d(TAG, "getJpegAttributes starting with: " + in); + } + // JPEG uses Big Endian by default. See https://people.cs.umass.edu/~verts/cs32/endian.html + in.setByteOrder(BIG_ENDIAN); + + int bytesRead = 0; + + byte marker; + if ((marker = in.readByte()) != MARKER) { + throw new IOException("Invalid marker: " + Integer.toHexString(marker & 0xff)); + } + ++bytesRead; + if (in.readByte() != MARKER_SOI) { + throw new IOException("Invalid marker: " + Integer.toHexString(marker & 0xff)); + } + ++bytesRead; + while (true) { + marker = in.readByte(); + if (marker != MARKER) { + throw new IOException("Invalid marker:" + Integer.toHexString(marker & 0xff)); + } + + // JPEG spec permits padding with 0xFF fill bytes before any marker. + do { + ++bytesRead; + marker = in.readByte(); + } while(marker == MARKER); + + if (DEBUG) { + Log.d(TAG, "Found JPEG segment indicator: " + Integer.toHexString(marker & 0xff)); + } + ++bytesRead; + + // EOI indicates the end of an image and in case of SOS, JPEG image stream starts and + // the image data will terminate right after. + if (marker == MARKER_EOI || marker == MARKER_SOS) { + break; + } + int length = in.readUnsignedShort() - 2; + bytesRead += 2; + if (DEBUG) { + Log.d(TAG, "JPEG segment: " + Integer.toHexString(marker & 0xff) + " (length: " + + (length + 2) + ")"); + } + if (length < 0) { + throw new IOException("Invalid length"); + } + switch (marker) { + case MARKER_APP1: { + final int start = bytesRead; + final byte[] bytes = new byte[length]; + in.readFully(bytes); + bytesRead += length; + length = 0; + + if (startsWith(bytes, IDENTIFIER_EXIF_APP1)) { + final byte[] value = Arrays.copyOfRange(bytes, IDENTIFIER_EXIF_APP1.length, + bytes.length); + // Save offset to EXIF data for handling thumbnail and attribute offsets. + mOffsetToExifData = offsetToJpeg + + /* offset to EXIF from JPEG start */ start + + IDENTIFIER_EXIF_APP1.length; + readExifSegment(value, imageType); + + setThumbnailData(new ByteOrderedDataInputStream(value)); + } else if (startsWith(bytes, IDENTIFIER_XMP_APP1)) { + // See XMP Specification Part 3: Storage in Files, 1.1.3 JPEG, Table 6 + final int offset = start + IDENTIFIER_XMP_APP1.length; + final byte[] value = Arrays.copyOfRange(bytes, + IDENTIFIER_XMP_APP1.length, bytes.length); + mXmpFromSeparateMarker = + new ExifAttribute(IFD_FORMAT_BYTE, value.length, offset, value); + mFileOnDiskContainsSeparateXmpMarker = true; + } + break; + } + + case MARKER_COM: { + byte[] bytes = new byte[length]; + in.readFully(bytes); + length = 0; + if (getAttribute(TAG_USER_COMMENT) == null) { + mAttributes[IFD_TYPE_EXIF].put(TAG_USER_COMMENT, ExifAttribute.createString( + new String(bytes, ASCII))); + } + break; + } + + case MARKER_SOF0: + case MARKER_SOF1: + case MARKER_SOF2: + case MARKER_SOF3: + case MARKER_SOF5: + case MARKER_SOF6: + case MARKER_SOF7: + case MARKER_SOF9: + case MARKER_SOF10: + case MARKER_SOF11: + case MARKER_SOF13: + case MARKER_SOF14: + case MARKER_SOF15: { + in.skipFully(1); + mAttributes[imageType].put(imageType != IFD_TYPE_THUMBNAIL + ? TAG_IMAGE_LENGTH : TAG_THUMBNAIL_IMAGE_LENGTH, + ExifAttribute.createULong(in.readUnsignedShort(), mExifByteOrder)); + mAttributes[imageType].put(imageType != IFD_TYPE_THUMBNAIL + ? TAG_IMAGE_WIDTH : TAG_THUMBNAIL_IMAGE_WIDTH, + ExifAttribute.createULong(in.readUnsignedShort(), mExifByteOrder)); + length -= 5; + break; + } + + default: { + break; + } + } + if (length < 0) { + throw new IOException("Invalid length"); + } + in.skipFully(length); + bytesRead += length; + } + // Restore original byte order + in.setByteOrder(mExifByteOrder); + } + + private void getRawAttributes(SeekableByteOrderedDataInputStream in) throws IOException { + // Parse TIFF Headers. See JEITA CP-3451C Section 4.5.2. Table 1. + parseTiffHeaders(in); + + // Read TIFF image file directories. See JEITA CP-3451C Section 4.5.2. Figure 6. + readImageFileDirectory(in, IFD_TYPE_PRIMARY); + + // Update ImageLength/Width tags for all image data. + updateImageSizeValues(in, IFD_TYPE_PRIMARY); + updateImageSizeValues(in, IFD_TYPE_PREVIEW); + updateImageSizeValues(in, IFD_TYPE_THUMBNAIL); + + // Check if each image data is in valid position. + validateImages(); + + if (mMimeType == IMAGE_TYPE_PEF) { + // PEF files contain a MakerNote data, which contains the data for ColorSpace tag. + // See http://lclevy.free.fr/raw/ and piex.cc PefGetPreviewData() + ExifAttribute makerNoteAttribute = + mAttributes[IFD_TYPE_EXIF].get(TAG_MAKER_NOTE); + if (makerNoteAttribute != null) { + // Create an ordered DataInputStream for MakerNote + SeekableByteOrderedDataInputStream makerNoteDataInputStream = + new SeekableByteOrderedDataInputStream(makerNoteAttribute.bytes); + makerNoteDataInputStream.setByteOrder(mExifByteOrder); + + // Skip to MakerNote data + makerNoteDataInputStream.skipFully(PEF_MAKER_NOTE_SKIP_SIZE); + + // Read IFD data from MakerNote + readImageFileDirectory(makerNoteDataInputStream, IFD_TYPE_PEF); + + // Update ColorSpace tag + ExifAttribute colorSpaceAttribute = + mAttributes[IFD_TYPE_PEF].get(TAG_COLOR_SPACE); + if (colorSpaceAttribute != null) { + mAttributes[IFD_TYPE_EXIF].put(TAG_COLOR_SPACE, colorSpaceAttribute); + } + } + } + } + + /** + * RAF files contains a JPEG and a CFA data. + * The JPEG contains two images, a preview and a thumbnail, while the CFA contains a RAW image. + * This method looks at the first 160 bytes of a RAF file to retrieve the offset and length + * values for the JPEG and CFA data. + * Using that data, it parses the JPEG data to retrieve the preview and thumbnail image data, + * then parses the CFA metadata to retrieve the primary image length/width values. + * For data format details, see http://fileformats.archiveteam.org/wiki/Fujifilm_RAF + */ + private void getRafAttributes(ByteOrderedDataInputStream in) throws IOException { + if (DEBUG) { + Log.d(TAG, "getRafAttributes starting with: " + in); + } + // Retrieve offset & length values + in.skipFully(RAF_OFFSET_TO_JPEG_IMAGE_OFFSET); + byte[] offsetToJpegBytes = new byte[4]; + byte[] jpegLengthBytes = new byte[4]; + byte[] cfaHeaderOffsetBytes = new byte[4]; + in.readFully(offsetToJpegBytes); + in.readFully(jpegLengthBytes); + in.readFully(cfaHeaderOffsetBytes); + int offsetToJpeg = ByteBuffer.wrap(offsetToJpegBytes).getInt(); + int jpegLength = ByteBuffer.wrap(jpegLengthBytes).getInt(); + int cfaHeaderOffset = ByteBuffer.wrap(cfaHeaderOffsetBytes).getInt(); + + byte[] jpegBytes = new byte[jpegLength]; + in.skipFully(offsetToJpeg - in.position()); + in.readFully(jpegBytes); + + // Retrieve JPEG image metadata + ByteOrderedDataInputStream jpegInputStream = new ByteOrderedDataInputStream(jpegBytes); + getJpegAttributes(jpegInputStream, offsetToJpeg, IFD_TYPE_PREVIEW); + + // Skip to CFA header offset. + in.skipFully(cfaHeaderOffset - in.position()); + + // Retrieve primary image length/width values, if TAG_RAF_IMAGE_SIZE exists + in.setByteOrder(BIG_ENDIAN); + int numberOfDirectoryEntry = in.readInt(); + if (DEBUG) { + Log.d(TAG, "numberOfDirectoryEntry: " + numberOfDirectoryEntry); + } + // CFA stores some metadata about the RAW image. Since CFA uses proprietary tags, can only + // find and retrieve image size information tags, while skipping others. + // See piex.cc RafGetDimension() + for (int i = 0; i < numberOfDirectoryEntry; ++i) { + int tagNumber = in.readUnsignedShort(); + int numberOfBytes = in.readUnsignedShort(); + if (tagNumber == TAG_RAF_IMAGE_SIZE.number) { + int imageLength = in.readShort(); + int imageWidth = in.readShort(); + ExifAttribute imageLengthAttribute = + ExifAttribute.createUShort(imageLength, mExifByteOrder); + ExifAttribute imageWidthAttribute = + ExifAttribute.createUShort(imageWidth, mExifByteOrder); + mAttributes[IFD_TYPE_PRIMARY].put(TAG_IMAGE_LENGTH, imageLengthAttribute); + mAttributes[IFD_TYPE_PRIMARY].put(TAG_IMAGE_WIDTH, imageWidthAttribute); + if (DEBUG) { + Log.d(TAG, "Updated to length: " + imageLength + ", width: " + imageWidth); + } + return; + } + in.skipFully(numberOfBytes); + } + } + + // Support for getting MediaMetadataRetriever.METADATA_KEY_EXIF_OFFSET and + // MediaMetadataRetriever.METADATA_KEY_EXIF_LENGTH was added in SDK 28 for HEIC and in SDK 31 + // for AVIF. + private void getHeifAttributes(final SeekableByteOrderedDataInputStream in, int imageType) + throws IOException { + if (Build.VERSION.SDK_INT >= 28) { + if (imageType == IMAGE_TYPE_AVIF && Build.VERSION.SDK_INT < 31) { + throw new UnsupportedOperationException("Reading EXIF from AVIF files " + + "is supported from SDK 31 and above"); + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + try { + Api23Impl.setDataSource(retriever, new MediaDataSource() { + long mPosition; + + @Override + public void close() throws IOException { + } + + @Override + public int readAt(long position, byte[] buffer, int offset, int size) + throws IOException { + if (size == 0) { + return 0; + } + if (position < 0) { + return -1; + } + try { + if (mPosition != position) { + // We don't allow seek to positions after the available bytes, + // the input stream won't be able to seek back then. + // However, if we hit an exception before (mPosition set to -1), + // let it try the seek in hope it might recover. + if (mPosition >= 0 && position >= mPosition + in.available()) { + return -1; + } + in.seek(position); + mPosition = position; + } + + // If the read will cause us to go over the available bytes, + // reduce the size so that we stay in the available range. + // Otherwise the input stream may not be able to seek back. + if (size > in.available()) { + size = in.available(); + } + + int bytesRead = in.read(buffer, offset, size); + if (bytesRead >= 0) { + mPosition += bytesRead; + return bytesRead; + } + } catch (IOException e) { + // do nothing + } + mPosition = -1; // need to seek on next read + return -1; + } + + @Override + public long getSize() throws IOException { + return -1; + } + }); + + String exifOffsetStr = retriever.extractMetadata( + MediaMetadataRetriever.METADATA_KEY_EXIF_OFFSET); + String exifLengthStr = retriever.extractMetadata( + MediaMetadataRetriever.METADATA_KEY_EXIF_LENGTH); + String hasImage = retriever.extractMetadata( + MediaMetadataRetriever.METADATA_KEY_HAS_IMAGE); + String hasVideo = retriever.extractMetadata( + MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO); + + String width = null; + String height = null; + String rotation = null; + final String metadataValueYes = "yes"; + // If the file has both image and video, prefer image info over video info. + // App querying ExifInterface is most likely using the bitmap path which + // picks the image first. + if (metadataValueYes.equals(hasImage)) { + width = retriever.extractMetadata( + MediaMetadataRetriever.METADATA_KEY_IMAGE_WIDTH); + height = retriever.extractMetadata( + MediaMetadataRetriever.METADATA_KEY_IMAGE_HEIGHT); + rotation = retriever.extractMetadata( + MediaMetadataRetriever.METADATA_KEY_IMAGE_ROTATION); + } else if (metadataValueYes.equals(hasVideo)) { + width = retriever.extractMetadata( + MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); + height = retriever.extractMetadata( + MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); + rotation = retriever.extractMetadata( + MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + } + + if (width != null) { + mAttributes[IFD_TYPE_PRIMARY].put(TAG_IMAGE_WIDTH, + ExifAttribute.createUShort(Integer.parseInt(width), mExifByteOrder)); + } + + if (height != null) { + mAttributes[IFD_TYPE_PRIMARY].put(TAG_IMAGE_LENGTH, + ExifAttribute.createUShort(Integer.parseInt(height), mExifByteOrder)); + } + + if (rotation != null) { + int orientation = ExifInterfaceFork.ORIENTATION_NORMAL; + + // all rotation angles in CW + switch (Integer.parseInt(rotation)) { + case 90: + orientation = ExifInterfaceFork.ORIENTATION_ROTATE_90; + break; + case 180: + orientation = ExifInterfaceFork.ORIENTATION_ROTATE_180; + break; + case 270: + orientation = ExifInterfaceFork.ORIENTATION_ROTATE_270; + break; + } + + mAttributes[IFD_TYPE_PRIMARY].put(TAG_ORIENTATION, + ExifAttribute.createUShort(orientation, mExifByteOrder)); + } + + if (exifOffsetStr != null && exifLengthStr != null) { + int offset = Integer.parseInt(exifOffsetStr); + int length = Integer.parseInt(exifLengthStr); + if (length <= 6) { + throw new IOException("Invalid exif length"); + } + in.seek(offset); + byte[] identifier = new byte[6]; + in.readFully(identifier); + offset += 6; + length -= 6; + if (!Arrays.equals(identifier, IDENTIFIER_EXIF_APP1)) { + throw new IOException("Invalid identifier"); + } + + // TODO: Need to handle potential OutOfMemoryError + byte[] bytes = new byte[length]; + in.readFully(bytes); + // Save offset to EXIF data for handling thumbnail and attribute offsets. + mOffsetToExifData = offset; + readExifSegment(bytes, IFD_TYPE_PRIMARY); + } + + String xmpOffsetStr = retriever.extractMetadata( + MediaMetadataRetriever.METADATA_KEY_XMP_OFFSET); + String xmpLengthStr = retriever.extractMetadata( + MediaMetadataRetriever.METADATA_KEY_XMP_LENGTH); + if (xmpOffsetStr != null && xmpLengthStr != null) { + int offset = Integer.parseInt(xmpOffsetStr); + int length = Integer.parseInt(xmpLengthStr); + in.seek(offset); + byte[] xmpBytes = new byte[length]; + in.readFully(xmpBytes); + mXmpFromSeparateMarker = + new ExifAttribute(IFD_FORMAT_BYTE, xmpBytes.length, offset, xmpBytes); + mFileOnDiskContainsSeparateXmpMarker = true; + } + + if (DEBUG) { + Log.d(TAG, "Heif meta: " + width + "x" + height + ", rotation " + rotation); + } + } catch (RuntimeException e) { + throw new UnsupportedOperationException("Failed to read EXIF from HEIF file. " + + "Given stream is either malformed or unsupported.", e); + } finally { + try { + retriever.release(); + } catch (IOException e) { + // Nothing we can do about it. + } + } + } else { + throw new UnsupportedOperationException("Reading EXIF from HEIC files " + + "is supported from SDK 28 and above"); + } + } + + /** + * Reads standalone EXIF data, returning whether the data was read successfully. + */ + private boolean getStandaloneAttributes(SeekableByteOrderedDataInputStream in) + throws IOException { + byte[] signatureCheckBytes = new byte[IDENTIFIER_EXIF_APP1.length]; + in.readFully(signatureCheckBytes); + if (!Arrays.equals(signatureCheckBytes, IDENTIFIER_EXIF_APP1)) { + Log.w(TAG, "Given data is not EXIF-only."); + return false; + } + // TODO: Need to handle potential OutOfMemoryError + byte[] data = in.readToEnd(); + // Save offset to EXIF data for handling thumbnail and attribute offsets. + mOffsetToExifData = IDENTIFIER_EXIF_APP1.length; + readExifSegment(data, IFD_TYPE_PRIMARY); + return true; + } + + /** + * ORF files contains a primary image data and a MakerNote data that contains preview/thumbnail + * images. Both data takes the form of IFDs and can therefore be read with the + * readImageFileDirectory() method. + * This method reads all the necessary data and updates the primary/preview/thumbnail image + * information according to the GetOlympusPreviewImage() method in piex.cc. + * For data format details, see the following: + * http://fileformats.archiveteam.org/wiki/Olympus_ORF + * https://libopenraw.freedesktop.org/wiki/Olympus_ORF + */ + private void getOrfAttributes(SeekableByteOrderedDataInputStream in) throws IOException { + // Retrieve primary image data + // Other Exif data will be located in the Makernote. + getRawAttributes(in); + + // Additionally retrieve preview/thumbnail information from MakerNote tag, which contains + // proprietary tags and therefore does not have offical documentation + // See GetOlympusPreviewImage() in piex.cc & http://www.exiv2.org/tags-olympus.html + ExifAttribute makerNoteAttribute = + mAttributes[IFD_TYPE_EXIF].get(TAG_MAKER_NOTE); + if (makerNoteAttribute != null) { + // Create an ordered DataInputStream for MakerNote + SeekableByteOrderedDataInputStream makerNoteDataInputStream = + new SeekableByteOrderedDataInputStream(makerNoteAttribute.bytes); + makerNoteDataInputStream.setByteOrder(mExifByteOrder); + + // There are two types of headers for Olympus MakerNotes + // See http://www.exiv2.org/makernote.html#R1 + byte[] makerNoteHeader1Bytes = new byte[ORF_MAKER_NOTE_HEADER_1.length]; + makerNoteDataInputStream.readFully(makerNoteHeader1Bytes); + makerNoteDataInputStream.seek(0); + byte[] makerNoteHeader2Bytes = new byte[ORF_MAKER_NOTE_HEADER_2.length]; + makerNoteDataInputStream.readFully(makerNoteHeader2Bytes); + // Skip the corresponding amount of bytes for each header type + if (Arrays.equals(makerNoteHeader1Bytes, ORF_MAKER_NOTE_HEADER_1)) { + makerNoteDataInputStream.seek(ORF_MAKER_NOTE_HEADER_1_SIZE); + } else if (Arrays.equals(makerNoteHeader2Bytes, ORF_MAKER_NOTE_HEADER_2)) { + makerNoteDataInputStream.seek(ORF_MAKER_NOTE_HEADER_2_SIZE); + } + + // Read IFD data from MakerNote + readImageFileDirectory(makerNoteDataInputStream, IFD_TYPE_ORF_MAKER_NOTE); + + // Retrieve & update preview image offset & length values + ExifAttribute imageStartAttribute = + mAttributes[IFD_TYPE_ORF_CAMERA_SETTINGS].get(TAG_ORF_PREVIEW_IMAGE_START); + ExifAttribute imageLengthAttribute = + mAttributes[IFD_TYPE_ORF_CAMERA_SETTINGS].get(TAG_ORF_PREVIEW_IMAGE_LENGTH); + + if (imageStartAttribute != null && imageLengthAttribute != null) { + mAttributes[IFD_TYPE_PREVIEW].put(TAG_JPEG_INTERCHANGE_FORMAT, + imageStartAttribute); + mAttributes[IFD_TYPE_PREVIEW].put(TAG_JPEG_INTERCHANGE_FORMAT_LENGTH, + imageLengthAttribute); + } + + // TODO: Check this behavior in other ORF files + // Retrieve primary image length & width values + // See piex.cc GetOlympusPreviewImage() + ExifAttribute aspectFrameAttribute = + mAttributes[IFD_TYPE_ORF_IMAGE_PROCESSING].get(TAG_ORF_ASPECT_FRAME); + if (aspectFrameAttribute != null) { + int[] aspectFrameValues = (int[]) aspectFrameAttribute.getValue(mExifByteOrder); + if (aspectFrameValues == null || aspectFrameValues.length != 4) { + Log.w(TAG, "Invalid aspect frame values. frame=" + + Arrays.toString(aspectFrameValues)); + return; + } + if (aspectFrameValues[2] > aspectFrameValues[0] && + aspectFrameValues[3] > aspectFrameValues[1]) { + int primaryImageWidth = aspectFrameValues[2] - aspectFrameValues[0] + 1; + int primaryImageLength = aspectFrameValues[3] - aspectFrameValues[1] + 1; + // Swap width & length values + if (primaryImageWidth < primaryImageLength) { + primaryImageWidth += primaryImageLength; + primaryImageLength = primaryImageWidth - primaryImageLength; + primaryImageWidth -= primaryImageLength; + } + ExifAttribute primaryImageWidthAttribute = + ExifAttribute.createUShort(primaryImageWidth, mExifByteOrder); + ExifAttribute primaryImageLengthAttribute = + ExifAttribute.createUShort(primaryImageLength, mExifByteOrder); + + mAttributes[IFD_TYPE_PRIMARY].put(TAG_IMAGE_WIDTH, primaryImageWidthAttribute); + mAttributes[IFD_TYPE_PRIMARY].put(TAG_IMAGE_LENGTH, primaryImageLengthAttribute); + } + } + } + } + + // RW2 contains the primary image data in IFD0 and the preview and/or thumbnail image data in + // the JpgFromRaw tag + // See https://libopenraw.freedesktop.org/wiki/Panasonic_RAW/ and piex.cc Rw2GetPreviewData() + private void getRw2Attributes(SeekableByteOrderedDataInputStream in) throws IOException { + if (DEBUG) { + Log.d(TAG, "getRw2Attributes starting with: " + in); + } + // Retrieve primary image data + getRawAttributes(in); + + // Retrieve preview and/or thumbnail image data + ExifAttribute jpgFromRawAttribute = + mAttributes[IFD_TYPE_PRIMARY].get(TAG_RW2_JPG_FROM_RAW); + if (jpgFromRawAttribute != null) { + ByteOrderedDataInputStream jpegInputStream = + new ByteOrderedDataInputStream(jpgFromRawAttribute.bytes); + getJpegAttributes(jpegInputStream, (int) jpgFromRawAttribute.bytesOffset, + IFD_TYPE_PREVIEW); + } + + // Set ISO tag value if necessary + ExifAttribute rw2IsoAttribute = + mAttributes[IFD_TYPE_PRIMARY].get(TAG_RW2_ISO); + ExifAttribute exifIsoAttribute = + mAttributes[IFD_TYPE_EXIF].get(TAG_PHOTOGRAPHIC_SENSITIVITY); + if (rw2IsoAttribute != null && exifIsoAttribute == null) { + // Place this attribute only if it doesn't exist + mAttributes[IFD_TYPE_EXIF].put(TAG_PHOTOGRAPHIC_SENSITIVITY, rw2IsoAttribute); + } + } + + // PNG contains the EXIF data as a Special-Purpose Chunk + private void getPngAttributes(ByteOrderedDataInputStream in) throws IOException { + if (DEBUG) { + Log.d(TAG, "getPngAttributes starting with: " + in); + } + // PNG uses Big Endian by default. + // See PNG (Portable Network Graphics) Specification, Version 1.2, + // 2.1. Integers and byte order + in.setByteOrder(BIG_ENDIAN); + + int startPosition = in.position(); + + // Skip the signature bytes + in.skipFully(PNG_SIGNATURE.length); + + // Each chunk is made up of four parts: + // 1) Length: 4-byte unsigned integer indicating the number of bytes in the + // Chunk Data field. Excludes Chunk Type and CRC bytes. + // 2) Chunk Type: 4-byte chunk type code. + // 3) Chunk Data: The data bytes. Can be zero-length. + // 4) CRC: 4-byte data calculated on the preceding bytes in the chunk. Always + // present. + // --> 4 (length bytes) + 4 (type bytes) + X (data bytes) + 4 (CRC bytes) + // See PNG (Portable Network Graphics) Specification, Version 1.2, + // 3.2. Chunk layout + try { + boolean foundExif = false; + boolean foundXmpItxt = false; + while (!foundExif || !foundXmpItxt) { + int length = in.readInt(); + int type = in.readInt(); + int startOfNextChunk = in.position() + length + PNG_CHUNK_CRC_BYTE_LENGTH; + + // The first chunk must be the IHDR chunk + if (in.position() - startPosition == 16 && type != PNG_CHUNK_TYPE_IHDR) { + throw new IOException( + "Encountered invalid PNG file--IHDR chunk should appear as the first " + + "chunk"); + } + + if (type == PNG_CHUNK_TYPE_IEND) { + // IEND marks the end of the image. + break; + } else if (type == PNG_CHUNK_TYPE_EXIF && !foundExif) { + // Save offset to EXIF data for handling thumbnail and attribute offsets. + mOffsetToExifData = in.position() - startPosition; + + // TLAD start + if (length > ATTRIBUTE_SIZE_DANGER_THRESHOLD) { + throw new IOException("dangerous exif chunk size=" + length); + } + // TLAD end + + // TODO: Need to handle potential OutOfMemoryError + byte[] data = new byte[length]; + in.readFully(data); + + // Compare CRC values for potential data corruption. + int dataCrcValue = in.readInt(); + // Cyclic Redundancy Code used to check for corruption of the data + CRC32 crc = new CRC32(); + updateCrcWithInt(crc, type); + crc.update(data); + if ((int) crc.getValue() != dataCrcValue) { + throw new IOException( + "Encountered invalid CRC value for PNG-EXIF chunk." + + "\n recorded CRC value: " + + dataCrcValue + + ", calculated CRC " + + "value: " + + crc.getValue()); + } + readExifSegment(data, IFD_TYPE_PRIMARY); + validateImages(); + + setThumbnailData(new ByteOrderedDataInputStream(data)); + foundExif = true; + } else if (type == PNG_CHUNK_TYPE_ITXT + && !foundXmpItxt + && length >= PNG_ITXT_XMP_KEYWORD.length) { + // Read the 17 byte keyword and 5 expected null bytes. + byte[] keyword = new byte[PNG_ITXT_XMP_KEYWORD.length]; + in.readFully(keyword); + if (Arrays.equals(keyword, PNG_ITXT_XMP_KEYWORD)) { + int xmpDataOffset = in.position() - startPosition; + int xmpLength = length - keyword.length; + byte[] xmpData = new byte[xmpLength]; + in.readFully(xmpData); + mXmpFromSeparateMarker = + new ExifAttribute( + IFD_FORMAT_BYTE, xmpLength, xmpDataOffset, xmpData); + foundXmpItxt = true; + } + } + // Skip to next chunk + in.skipFully(startOfNextChunk - in.position()); + } + mFileOnDiskContainsSeparateXmpMarker = foundXmpItxt; + } catch (EOFException e) { + // Should not reach here. Will only reach here if the file is corrupted or + // does not follow the PNG specifications + throw new IOException("Encountered corrupt PNG file.", e); + } + } + + private static void updateCrcWithInt(CRC32 crc, int value) { + crc.update(value >>> 24); + crc.update(value >>> 16); + crc.update(value >>> 8); + crc.update(value); + } + + // WebP contains EXIF data as a RIFF File Format Chunk + // All references below can be found in the following link. + // https://developers.google.com/speed/webp/docs/riff_container + private void getWebpAttributes(ByteOrderedDataInputStream in) throws IOException { + if (DEBUG) { + Log.d(TAG, "getWebpAttributes starting with: " + in); + } + // WebP uses little-endian by default. + // See Section "Terminology & Basics" + in.setByteOrder(LITTLE_ENDIAN); + + in.skipFully(WEBP_SIGNATURE_1.length); + // File size corresponds to the size of the entire file from offset 8. + // See Section "WebP File Header" + int fileSize = in.readInt() + 8; + int bytesRead = 8; + + in.skipFully(WEBP_SIGNATURE_2.length); + bytesRead += WEBP_SIGNATURE_2.length; + + try { + while (true) { + // TODO: Check the first Chunk Type, and if it is VP8X, check if the chunks are + // ordered properly. + + // Each chunk is made up of three parts: + // 1) Chunk FourCC: 4-byte concatenating four ASCII characters. + // 2) Chunk Size: 4-byte unsigned integer indicating the size of the chunk. + // Excludes Chunk FourCC and Chunk Size bytes. + // 3) Chunk Payload: data payload. A single padding byte ('0') is added if + // Chunk Size is odd. + // See Section "RIFF File Format" + byte[] code = new byte[WEBP_CHUNK_TYPE_BYTE_LENGTH]; + in.readFully(code); + bytesRead += WEBP_CHUNK_TYPE_BYTE_LENGTH; + + int chunkSize = in.readInt(); + bytesRead += 4; + + if (Arrays.equals(WEBP_CHUNK_TYPE_EXIF, code)) { + // TODO: Need to handle potential OutOfMemoryError + byte[] payload = new byte[chunkSize]; + in.readFully(payload); + + // Skip a JPEG APP1 marker that some image libraries incorrectly include in the + // Exif data in WebP images (e.g. + // https://github.com/ImageMagick/ImageMagick/issues/3140) + if (startsWith(payload, IDENTIFIER_EXIF_APP1)) { + payload = + Arrays.copyOfRange( + payload, IDENTIFIER_EXIF_APP1.length, payload.length); + } + + // Save offset to EXIF data for handling thumbnail and attribute offsets. + mOffsetToExifData = bytesRead; + readExifSegment(payload, IFD_TYPE_PRIMARY); + + setThumbnailData(new ByteOrderedDataInputStream(payload)); + break; + } else { + // Add a single padding byte at end if chunk size is odd + chunkSize = (chunkSize % 2 == 1) ? chunkSize + 1 : chunkSize; + + // Check if skipping to next chunk is necessary + if (bytesRead + chunkSize == fileSize) { + // Reached end of file + break; + } else if (bytesRead + chunkSize > fileSize) { + throw new IOException("Encountered WebP file with invalid chunk size"); + } + + // Skip to next chunk + in.skipFully(chunkSize); + bytesRead += chunkSize; + } + } + } catch (EOFException e) { + // Should not reach here. Will only reach here if the file is corrupted or + // does not follow the WebP specifications + throw new IOException("Encountered corrupt WebP file.", e); + } + } + + // Stores a new JPEG image with EXIF attributes into a given output stream. + private void saveJpegAttributes(InputStream inputStream, OutputStream outputStream) + throws IOException { + // See JPEG File Interchange Format Specification, "JFIF Specification" + if (DEBUG) { + Log.d(TAG, "saveJpegAttributes starting with (inputStream: " + inputStream + + ", outputStream: " + outputStream + ")"); + } + ByteOrderedDataInputStream dataInputStream = new ByteOrderedDataInputStream(inputStream); + ByteOrderedDataOutputStream dataOutputStream = + new ByteOrderedDataOutputStream(outputStream, BIG_ENDIAN); + if (dataInputStream.readByte() != MARKER) { + throw new IOException("Invalid marker"); + } + dataOutputStream.writeByte(MARKER); + if (dataInputStream.readByte() != MARKER_SOI) { + throw new IOException("Invalid marker"); + } + dataOutputStream.writeByte(MARKER_SOI); + + // Write EXIF APP1 segment + dataOutputStream.writeByte(MARKER); + dataOutputStream.writeByte(MARKER_APP1); + mOffsetToExifData = writeExifSegment(dataOutputStream); + + if (mXmpFromSeparateMarker != null) { + // Write XMP APP1 segment. The XMP spec (part 3, section 1.1.3) recommends for this to + // directly follow the Exif APP1 segment. + dataOutputStream.write(MARKER); + dataOutputStream.writeByte(MARKER_APP1); + int length = 2 + IDENTIFIER_XMP_APP1.length + mXmpFromSeparateMarker.bytes.length; + dataOutputStream.writeUnsignedShort(length); + dataOutputStream.write(IDENTIFIER_XMP_APP1); + dataOutputStream.write(mXmpFromSeparateMarker.bytes); + mFileOnDiskContainsSeparateXmpMarker = true; + } + + byte[] bytes = new byte[4096]; + + while (true) { + byte marker = dataInputStream.readByte(); + if (marker != MARKER) { + throw new IOException("Invalid marker"); + } + // Skip 0xFF fill bytes + do { + marker = dataInputStream.readByte(); + } while (marker == MARKER); + switch (marker) { + case MARKER_APP1: { + int length = dataInputStream.readUnsignedShort() - 2; + if (length < 0) { + throw new IOException("Invalid length"); + } + // If the length is long enough, we read enough bytes for the XMP identifier, + // because it's longer than the EXIF one. + byte[] identifier; + if (length >= IDENTIFIER_XMP_APP1.length) { + identifier = new byte[IDENTIFIER_XMP_APP1.length]; + } else if (length >= IDENTIFIER_EXIF_APP1.length) { + identifier = new byte[IDENTIFIER_EXIF_APP1.length]; + } else { + identifier = null; + } + if (identifier != null) { + dataInputStream.readFully(identifier); + if (startsWith(identifier, IDENTIFIER_EXIF_APP1) + || startsWith(identifier, IDENTIFIER_XMP_APP1)) { + // Skip the original EXIF or XMP APP1 segment. + dataInputStream.skipFully(length - identifier.length); + break; + } + } + // Copy non-EXIF APP1 segment. + dataOutputStream.writeByte(MARKER); + dataOutputStream.writeByte(marker); + dataOutputStream.writeUnsignedShort(length + 2); + if (identifier != null) { + length -= identifier.length; + dataOutputStream.write(identifier); + } + int read; + while (length > 0 && (read = dataInputStream.read( + bytes, 0, Math.min(length, bytes.length))) >= 0) { + dataOutputStream.write(bytes, 0, read); + length -= read; + } + break; + } + case MARKER_EOI: + case MARKER_SOS: { + dataOutputStream.writeByte(MARKER); + dataOutputStream.writeByte(marker); + // Copy all the remaining data + copy(dataInputStream, dataOutputStream); + return; + } + default: { + // Copy JPEG segment + dataOutputStream.writeByte(MARKER); + dataOutputStream.writeByte(marker); + int length = dataInputStream.readUnsignedShort(); + dataOutputStream.writeUnsignedShort(length); + length -= 2; + if (length < 0) { + throw new IOException("Invalid length"); + } + int read; + while (length > 0 && (read = dataInputStream.read( + bytes, 0, Math.min(length, bytes.length))) >= 0) { + dataOutputStream.write(bytes, 0, read); + length -= read; + } + break; + } + } + } + } + + private void savePngAttributes(InputStream inputStream, OutputStream outputStream) + throws IOException { + if (DEBUG) { + Log.d(TAG, "savePngAttributes starting with (inputStream: " + inputStream + + ", outputStream: " + outputStream + ")"); + } + ByteOrderedDataInputStream dataInputStream = new ByteOrderedDataInputStream(inputStream); + ByteOrderedDataOutputStream dataOutputStream = + new ByteOrderedDataOutputStream(outputStream, BIG_ENDIAN); + + // Copy PNG signature bytes + copy(dataInputStream, dataOutputStream, PNG_SIGNATURE.length); + + boolean needToWriteExif = true; + // Either there's some XMP data to write, or it has been cleared locally but was present in + // the file when it was read (and so needs to be removed). + boolean needToHandleXmpChunk = + mXmpFromSeparateMarker != null || mFileOnDiskContainsSeparateXmpMarker; + while (needToWriteExif || needToHandleXmpChunk) { + int chunkLength = dataInputStream.readInt(); + int chunkType = dataInputStream.readInt(); + if (chunkType == PNG_CHUNK_TYPE_IHDR) { + dataOutputStream.writeInt(chunkLength); + dataOutputStream.writeInt(chunkType); + copy(dataInputStream, dataOutputStream, chunkLength + PNG_CHUNK_CRC_BYTE_LENGTH); + if (mOffsetToExifData == 0) { + // There was no Exif segment in the original file, so we put it directly + // after the IHDR chunk. + writePngExifChunk(dataOutputStream); + needToWriteExif = false; + } + if (mXmpFromSeparateMarker != null && !mFileOnDiskContainsSeparateXmpMarker) { + writePngXmpItxtChunk(dataOutputStream); + needToHandleXmpChunk = false; + } + continue; + } else if (chunkType == PNG_CHUNK_TYPE_EXIF && needToWriteExif) { + writePngExifChunk(dataOutputStream); + dataInputStream.skipFully(chunkLength + PNG_CHUNK_CRC_BYTE_LENGTH); + needToWriteExif = false; + continue; + } else if (chunkType == PNG_CHUNK_TYPE_ITXT + && chunkLength >= PNG_ITXT_XMP_KEYWORD.length) { + // Read the 17 byte keyword and 5 expected null bytes. + byte[] keyword = new byte[PNG_ITXT_XMP_KEYWORD.length]; + dataInputStream.readFully(keyword); + int remainingChunkBytes = chunkLength - keyword.length + PNG_CHUNK_CRC_BYTE_LENGTH; + if (Arrays.equals(keyword, PNG_ITXT_XMP_KEYWORD)) { + if (mXmpFromSeparateMarker != null) { + writePngXmpItxtChunk(dataOutputStream); + } + dataInputStream.skipFully(remainingChunkBytes); + needToHandleXmpChunk = false; + } else { + // This is a non-XMP iTXt chunk, so just copy it to the output and continue. + dataOutputStream.writeInt(chunkLength); + dataOutputStream.writeInt(chunkType); + dataOutputStream.write(keyword); + copy(dataInputStream, dataOutputStream, remainingChunkBytes); + } + continue; + } + dataOutputStream.writeInt(chunkLength); + dataOutputStream.writeInt(chunkType); + copy(dataInputStream, dataOutputStream, chunkLength + PNG_CHUNK_CRC_BYTE_LENGTH); + } + + // Copy the rest of the file + copy(dataInputStream, dataOutputStream); + } + + private void writePngExifChunk(ByteOrderedDataOutputStream dataOutputStream) + throws IOException { + // Write the eXIF chunk out to an intermediate byte array so we can calculate the CRC value. + ByteArrayOutputStream exifByteArrayOutputStream = new ByteArrayOutputStream(); + // Write eXIF chunk data (including chunk type & length). + int exifOffset = + writeExifSegment( + new ByteOrderedDataOutputStream(exifByteArrayOutputStream, BIG_ENDIAN)); + mOffsetToExifData = dataOutputStream.mOutputStream.size() + exifOffset; + byte[] exifBytes = exifByteArrayOutputStream.toByteArray(); + dataOutputStream.write(exifBytes); + CRC32 crc = new CRC32(); + crc.update(exifBytes, 4 /* skip length bytes */, exifBytes.length - 4); + dataOutputStream.writeInt((int) crc.getValue()); + } + + private void writePngXmpItxtChunk(ByteOrderedDataOutputStream dataOutputStream) + throws IOException { + dataOutputStream.writeInt(mXmpFromSeparateMarker.bytes.length + 22); + CRC32 crc = new CRC32(); + dataOutputStream.writeInt(PNG_CHUNK_TYPE_ITXT); + updateCrcWithInt(crc, PNG_CHUNK_TYPE_ITXT); + dataOutputStream.write(PNG_ITXT_XMP_KEYWORD); + crc.update(PNG_ITXT_XMP_KEYWORD); + dataOutputStream.write(mXmpFromSeparateMarker.bytes); + crc.update(mXmpFromSeparateMarker.bytes); + dataOutputStream.writeInt((int) crc.getValue()); + mFileOnDiskContainsSeparateXmpMarker = true; + } + + // A WebP file has a header and a series of chunks. + // The header is composed of: + // "RIFF" + File Size + "WEBP" + // + // The structure of the chunks can be divided largely into two categories: + // 1) Contains only image data, + // 2) Contains image data and extra data. + // In the first category, there is only one chunk: type "VP8" (compression with loss) or "VP8L" + // (lossless compression). + // In the second category, the first chunk will be of type "VP8X", which contains flags + // indicating which extra data exist in later chunks. The proceeding chunks must conform to + // the following order based on type (if they exist): + // Color Profile ("ICCP") + Animation Control Data ("ANIM") + Image Data ("VP8"/"VP8L") + // + Exif metadata ("EXIF") + XMP metadata ("XMP") + // + // And in order to have EXIF data, a WebP file must be of the second structure and thus follow + // the following rules: + // 1) "VP8X" chunk as the first chunk, + // 2) flag for EXIF inside "VP8X" chunk set to 1, and + // 3) contain the "EXIF" chunk in the correct order amongst other chunks. + // + // Based on these rules, this API will support three different cases depending on the contents + // of the original file: + // 1) "EXIF" chunk already exists + // -> replace it with the new "EXIF" chunk + // 2) "EXIF" chunk does not exist and the first chunk is "VP8" or "VP8L" + // -> add "VP8X" before the "VP8"/"VP8L" chunk (with EXIF flag set to 1), and add new + // "EXIF" chunk after the "VP8"/"VP8L" chunk. + // 3) "EXIF" chunk does not exist and the first chunk is "VP8X" + // -> set EXIF flag in "VP8X" chunk to 1, and add new "EXIF" chunk at the proper location. + // + // See https://developers.google.com/speed/webp/docs/riff_container for more details. + private void saveWebpAttributes(InputStream inputStream, OutputStream outputStream) + throws IOException { + if (DEBUG) { + Log.d(TAG, "saveWebpAttributes starting with (inputStream: " + inputStream + + ", outputStream: " + outputStream + ")"); + } + ByteOrderedDataInputStream totalInputStream = + new ByteOrderedDataInputStream(inputStream, LITTLE_ENDIAN); + ByteOrderedDataOutputStream totalOutputStream = + new ByteOrderedDataOutputStream(outputStream, LITTLE_ENDIAN); + + // WebP signature + copy(totalInputStream, totalOutputStream, WEBP_SIGNATURE_1.length); + int riffLength = totalInputStream.readInt(); + totalInputStream.skipFully(WEBP_SIGNATURE_2.length); + + // Create a separate byte array to calculate file length + ByteArrayOutputStream nonHeaderByteArrayOutputStream = null; + int exifOffset = -1; + try { + nonHeaderByteArrayOutputStream = new ByteArrayOutputStream(); + ByteOrderedDataOutputStream nonHeaderOutputStream = + new ByteOrderedDataOutputStream(nonHeaderByteArrayOutputStream, LITTLE_ENDIAN); + + if (mOffsetToExifData != 0) { + // EXIF chunk exists in the original file + // Tested by webp_with_exif.webp + int bytesRead = WEBP_SIGNATURE_1.length + WEBP_FILE_SIZE_BYTE_LENGTH + + WEBP_SIGNATURE_2.length; + copy(totalInputStream, nonHeaderOutputStream, + mOffsetToExifData - bytesRead - WEBP_CHUNK_TYPE_BYTE_LENGTH + - WEBP_CHUNK_SIZE_BYTE_LENGTH); + + // Skip input stream to the end of the EXIF chunk + totalInputStream.skipFully(WEBP_CHUNK_TYPE_BYTE_LENGTH); + int exifChunkLength = totalInputStream.readInt(); + // RIFF chunks have a single padding byte at the end if the declared chunk size is + // odd. + if (exifChunkLength % 2 != 0) { + exifChunkLength++; + } + totalInputStream.skipFully(exifChunkLength); + + // Write new EXIF chunk to output stream + exifOffset = writeExifSegment(nonHeaderOutputStream); + } else { + // EXIF chunk does not exist in the original file + byte[] firstChunkType = new byte[WEBP_CHUNK_TYPE_BYTE_LENGTH]; + totalInputStream.readFully(firstChunkType); + + if (Arrays.equals(firstChunkType, WEBP_CHUNK_TYPE_VP8X)) { + // Original file already includes other extra data + int size = totalInputStream.readInt(); + // WebP files have a single padding byte at the end if the chunk size is odd. + byte[] data = new byte[(size % 2) == 1 ? size + 1 : size]; + totalInputStream.readFully(data); + + // Set the EXIF flag to 1 + data[0] = (byte) (data[0] | (1 << 3)); + + // Retrieve Animation flag--in order to check where EXIF data should start + boolean containsAnimation = ((data[0] >> 1) & 1) == 1; + + // Write the original VP8X chunk + nonHeaderOutputStream.write(WEBP_CHUNK_TYPE_VP8X); + nonHeaderOutputStream.writeInt(size); + nonHeaderOutputStream.write(data); + + // Animation control data is composed of 1 ANIM chunk and multiple ANMF + // chunks and since the image data (VP8/VP8L) chunks are included in the ANMF + // chunks, EXIF data should come after the last ANMF chunk. + // Also, because there is no value indicating the amount of ANMF chunks, we need + // to keep iterating through chunks until we either reach the end of the file or + // the XMP chunk (if it exists). + // Tested by webp_with_anim_without_exif.webp + if (containsAnimation) { + copyChunksUpToGivenChunkType(totalInputStream, nonHeaderOutputStream, + WEBP_CHUNK_TYPE_ANIM, null); + + while (true) { + byte[] type = new byte[WEBP_CHUNK_TYPE_BYTE_LENGTH]; + boolean animationFinished = false; + try { + totalInputStream.readFully(type); + animationFinished = !Arrays.equals(type, WEBP_CHUNK_TYPE_ANMF); + } catch (EOFException e) { + animationFinished = true; + } + if (animationFinished) { + exifOffset = writeExifSegment(nonHeaderOutputStream); + break; + } + copyWebPChunk(totalInputStream, nonHeaderOutputStream, type); + } + } else { + // Skip until we find the VP8 or VP8L chunk + copyChunksUpToGivenChunkType(totalInputStream, nonHeaderOutputStream, + WEBP_CHUNK_TYPE_VP8, WEBP_CHUNK_TYPE_VP8L); + exifOffset = writeExifSegment(nonHeaderOutputStream); + } + } else if (Arrays.equals(firstChunkType, WEBP_CHUNK_TYPE_VP8) + || Arrays.equals(firstChunkType, WEBP_CHUNK_TYPE_VP8L)) { + int size = totalInputStream.readInt(); + int bytesToRead = size; + // WebP files have a single padding byte at the end if the chunk size is odd. + if (size % 2 == 1) { + bytesToRead += 1; + } + + // Retrieve image width/height + int widthAndHeight = 0; + int width = 0; + int height = 0; + boolean alpha = false; + // Save VP8 frame data for later + byte[] vp8Frame = new byte[3]; + + if (Arrays.equals(firstChunkType, WEBP_CHUNK_TYPE_VP8)) { + totalInputStream.readFully(vp8Frame); + + // Check signature + byte[] vp8Signature = new byte[3]; + totalInputStream.readFully(vp8Signature); + if (!Arrays.equals(WEBP_VP8_SIGNATURE, vp8Signature)) { + throw new IOException("Error checking VP8 signature"); + } + + // Retrieve image width/height + widthAndHeight = totalInputStream.readInt(); + width = widthAndHeight & 0x3FFF; + height = (widthAndHeight >> 16) & 0x3FFF; + bytesToRead -= (vp8Frame.length + vp8Signature.length + 4); + } else if (Arrays.equals(firstChunkType, WEBP_CHUNK_TYPE_VP8L)) { + // Check signature + byte vp8lSignature = totalInputStream.readByte(); + if (vp8lSignature != WEBP_VP8L_SIGNATURE) { + throw new IOException("Error checking VP8L signature"); + } + + // Retrieve image width/height + widthAndHeight = totalInputStream.readInt(); + // VP8L stores 14-bit 'width - 1' and 'height - 1' values. See "RIFF Header" + // of "WebP Lossless Bitstream Specification". + width = (widthAndHeight & 0x3FFF) + 1; // Read bits 0 - 13 + height = ((widthAndHeight & 0xFFFC000) >>> 14) + 1; // Read bits 14 - 27 + // Retrieve alpha bit 28 + alpha = (widthAndHeight & 1 << 28) != 0; + bytesToRead -= (1 /* VP8L signature */ + 4); + } + + // Create VP8X with Exif flag set to 1 + nonHeaderOutputStream.write(WEBP_CHUNK_TYPE_VP8X); + nonHeaderOutputStream.writeInt(WEBP_CHUNK_TYPE_VP8X_DEFAULT_LENGTH); + byte[] data = new byte[WEBP_CHUNK_TYPE_VP8X_DEFAULT_LENGTH]; + // ALPHA flag + if (alpha) { + data[0] = (byte) (data[0] | (1 << 4)); + } + // EXIF flag + data[0] = (byte) (data[0] | (1 << 3)); + // VP8X stores Width - 1 and Height - 1 values + width -= 1; + height -= 1; + data[4] = (byte) width; + data[5] = (byte) (width >> 8); + data[6] = (byte) (width >> 16); + data[7] = (byte) height; + data[8] = (byte) (height >> 8); + data[9] = (byte) (height >> 16); + nonHeaderOutputStream.write(data); + + // Write VP8 or VP8L data + nonHeaderOutputStream.write(firstChunkType); + nonHeaderOutputStream.writeInt(size); + if (Arrays.equals(firstChunkType, WEBP_CHUNK_TYPE_VP8)) { + nonHeaderOutputStream.write(vp8Frame); + nonHeaderOutputStream.write(WEBP_VP8_SIGNATURE); + nonHeaderOutputStream.writeInt(widthAndHeight); + } else if (Arrays.equals(firstChunkType, WEBP_CHUNK_TYPE_VP8L)) { + nonHeaderOutputStream.write(WEBP_VP8L_SIGNATURE); + nonHeaderOutputStream.writeInt(widthAndHeight); + } + copy(totalInputStream, nonHeaderOutputStream, bytesToRead); + + // Write EXIF chunk + exifOffset = writeExifSegment(nonHeaderOutputStream); + } + } + + // Copy the rest of the RIFF part of the file + int remainingRiffBytes = riffLength + 8 - totalInputStream.position(); + copy(totalInputStream, nonHeaderOutputStream, remainingRiffBytes); + + // Write file length + second signature + totalOutputStream.writeInt(nonHeaderByteArrayOutputStream.size() + + WEBP_SIGNATURE_2.length); + totalOutputStream.write(WEBP_SIGNATURE_2); + if (exifOffset != -1) { + mOffsetToExifData = totalOutputStream.mOutputStream.size() + exifOffset; + } + nonHeaderByteArrayOutputStream.writeTo(totalOutputStream); + // Copy any non-RIFF trailing data + copy(totalInputStream, totalOutputStream); + } catch (Exception e) { + throw new IOException("Failed to save WebP file", e); + } finally { + closeQuietly(nonHeaderByteArrayOutputStream); + } + } + + private void copyChunksUpToGivenChunkType(ByteOrderedDataInputStream inputStream, + ByteOrderedDataOutputStream outputStream, byte[] firstGivenType, + byte[] secondGivenType) throws IOException { + while (true) { + byte[] type = new byte[WEBP_CHUNK_TYPE_BYTE_LENGTH]; + inputStream.readFully(type); + copyWebPChunk(inputStream, outputStream, type); + if (Arrays.equals(type, firstGivenType) + || (secondGivenType != null && Arrays.equals(type, secondGivenType))) { + break; + } + } + } + + private void copyWebPChunk(ByteOrderedDataInputStream inputStream, + ByteOrderedDataOutputStream outputStream, byte[] type) throws IOException { + int size = inputStream.readInt(); + outputStream.write(type); + outputStream.writeInt(size); + // WebP files have a single padding byte at the end if the chunk size is odd. + copy(inputStream, outputStream, (size % 2) == 1 ? size + 1 : size); + } + + // Reads the given EXIF byte area and save its tag data into attributes. + private void readExifSegment(byte[] exifBytes, int imageType) throws IOException { + SeekableByteOrderedDataInputStream dataInputStream = + new SeekableByteOrderedDataInputStream(exifBytes); + + // Parse TIFF Headers. See JEITA CP-3451C Section 4.5.2. Table 1. + parseTiffHeaders(dataInputStream); + + // Read TIFF image file directories. See JEITA CP-3451C Section 4.5.2. Figure 6. + readImageFileDirectory(dataInputStream, imageType); + } + + private void addDefaultValuesForCompatibility() { + // If DATETIME tag has no value, then set the value to DATETIME_ORIGINAL tag's. + String valueOfDateTimeOriginal = getAttribute(TAG_DATETIME_ORIGINAL); + if (valueOfDateTimeOriginal != null && getAttribute(TAG_DATETIME) == null) { + mAttributes[IFD_TYPE_PRIMARY].put(TAG_DATETIME, + ExifAttribute.createString(valueOfDateTimeOriginal)); + } + + // Add the default value. + if (getAttribute(TAG_IMAGE_WIDTH) == null) { + mAttributes[IFD_TYPE_PRIMARY].put(TAG_IMAGE_WIDTH, + ExifAttribute.createULong(0, mExifByteOrder)); + } + if (getAttribute(TAG_IMAGE_LENGTH) == null) { + mAttributes[IFD_TYPE_PRIMARY].put(TAG_IMAGE_LENGTH, + ExifAttribute.createULong(0, mExifByteOrder)); + } + if (getAttribute(TAG_ORIENTATION) == null) { + mAttributes[IFD_TYPE_PRIMARY].put(TAG_ORIENTATION, + ExifAttribute.createULong(0, mExifByteOrder)); + } + if (getAttribute(TAG_LIGHT_SOURCE) == null) { + mAttributes[IFD_TYPE_EXIF].put(TAG_LIGHT_SOURCE, + ExifAttribute.createULong(0, mExifByteOrder)); + } + } + + private ByteOrder readByteOrder(ByteOrderedDataInputStream dataInputStream) + throws IOException { + // Read byte order. + short byteOrder = dataInputStream.readShort(); + switch (byteOrder) { + case BYTE_ALIGN_II: + if (DEBUG) { + Log.d(TAG, "readExifSegment: Byte Align II"); + } + return LITTLE_ENDIAN; + case BYTE_ALIGN_MM: + if (DEBUG) { + Log.d(TAG, "readExifSegment: Byte Align MM"); + } + return BIG_ENDIAN; + default: + throw new IOException("Invalid byte order: " + Integer.toHexString(byteOrder)); + } + } + + private void parseTiffHeaders(ByteOrderedDataInputStream dataInputStream) throws IOException { + // Read byte order + mExifByteOrder = readByteOrder(dataInputStream); + // Set byte order + dataInputStream.setByteOrder(mExifByteOrder); + + // Check start code + int startCode = dataInputStream.readUnsignedShort(); + if (mMimeType != IMAGE_TYPE_ORF && mMimeType != IMAGE_TYPE_RW2 && startCode != START_CODE) { + throw new IOException("Invalid start code: " + Integer.toHexString(startCode)); + } + + // Read and skip to first ifd offset + int firstIfdOffset = dataInputStream.readInt(); + if (firstIfdOffset < 8) { + throw new IOException("Invalid first Ifd offset: " + firstIfdOffset); + } + firstIfdOffset -= 8; + if (firstIfdOffset > 0) { + // TLAD start + if (firstIfdOffset > ATTRIBUTE_SIZE_DANGER_THRESHOLD) { + throw new IOException("dangerous IFD offset=" + firstIfdOffset); + } + // TLAD end + dataInputStream.skipFully(firstIfdOffset); + } + } + + // Reads image file directory, which is a tag group in EXIF. + private void readImageFileDirectory(SeekableByteOrderedDataInputStream dataInputStream, + @IfdType int ifdType) throws IOException { + // Save offset of current IFD to prevent reading an IFD that is already read. + mAttributesOffsets.add(dataInputStream.position()); + + // See TIFF 6.0 Section 2: TIFF Structure, Figure 1. + short numberOfDirectoryEntry = dataInputStream.readShort(); + if (DEBUG) { + Log.d(TAG, "numberOfDirectoryEntry: " + numberOfDirectoryEntry); + } + if (numberOfDirectoryEntry <= 0) { + // Return if the size of entries is negative. + return; + } + + // See TIFF 6.0 Section 2: TIFF Structure, "Image File Directory". + for (short i = 0; i < numberOfDirectoryEntry; ++i) { + int tagNumber = dataInputStream.readUnsignedShort(); + int dataFormat = dataInputStream.readUnsignedShort(); + int numberOfComponents = dataInputStream.readInt(); + // Next four bytes is for data offset or value. + long nextEntryOffset = dataInputStream.position() + 4L; + + // Look up a corresponding tag from tag number + ExifTag tag = sExifTagMapsForReading[ifdType].get(tagNumber); + + if (DEBUG) { + Log.d(TAG, String.format("ifdType: %d, tagNumber: %d, tagName: %s, dataFormat: %d, " + + "numberOfComponents: %d", ifdType, tagNumber, + tag != null ? tag.name : null, dataFormat, numberOfComponents)); + } + + long byteCount = 0; + boolean valid = false; + if (tag == null) { + if (DEBUG) { + Log.d(TAG, "Skip the tag entry since tag number is not defined: " + tagNumber); + } + } else if (dataFormat <= 0 || dataFormat >= IFD_FORMAT_BYTES_PER_FORMAT.length) { + if (DEBUG) { + Log.d(TAG, "Skip the tag entry since data format is invalid: " + dataFormat); + } + } else if (!tag.isFormatCompatible(dataFormat)) { + if (DEBUG) { + Log.d(TAG, "Skip the tag entry since data format (" + + IFD_FORMAT_NAMES[dataFormat] + ") is unexpected for tag: " + + tag.name); + } + } else { + if (dataFormat == IFD_FORMAT_UNDEFINED) { + dataFormat = tag.primaryFormat; + } + byteCount = (long) numberOfComponents * IFD_FORMAT_BYTES_PER_FORMAT[dataFormat]; + if (byteCount < 0 || byteCount > Integer.MAX_VALUE) { + if (DEBUG) { + Log.d(TAG, "Skip the tag entry since the number of components is invalid: " + + numberOfComponents); + } + } else { + valid = true; + } + } + if (!valid) { + dataInputStream.seek(nextEntryOffset); + continue; + } + + // Read a value from data field or seek to the value offset which is stored in data + // field if the size of the entry value is bigger than 4. + if (byteCount > 4) { + int offset = dataInputStream.readInt(); + if (DEBUG) { + Log.d(TAG, "seek to data offset: " + offset); + } + if (mMimeType == IMAGE_TYPE_ORF) { + if (TAG_MAKER_NOTE.equals(tag.name)) { + // Save offset value for reading thumbnail + mOrfMakerNoteOffset = offset; + } else if (ifdType == IFD_TYPE_ORF_MAKER_NOTE + && TAG_ORF_THUMBNAIL_IMAGE.equals(tag.name)) { + // Retrieve & update values for thumbnail offset and length values for ORF + mOrfThumbnailOffset = offset; + mOrfThumbnailLength = numberOfComponents; + + ExifAttribute compressionAttribute = + ExifAttribute.createUShort(DATA_JPEG, mExifByteOrder); + ExifAttribute jpegInterchangeFormatAttribute = + ExifAttribute.createULong(mOrfThumbnailOffset, mExifByteOrder); + ExifAttribute jpegInterchangeFormatLengthAttribute = + ExifAttribute.createULong(mOrfThumbnailLength, mExifByteOrder); + + mAttributes[IFD_TYPE_THUMBNAIL].put(TAG_COMPRESSION, compressionAttribute); + mAttributes[IFD_TYPE_THUMBNAIL].put(TAG_JPEG_INTERCHANGE_FORMAT, + jpegInterchangeFormatAttribute); + mAttributes[IFD_TYPE_THUMBNAIL].put(TAG_JPEG_INTERCHANGE_FORMAT_LENGTH, + jpegInterchangeFormatLengthAttribute); + } + } + dataInputStream.seek(offset); + } + + // Recursively parse IFD when a IFD pointer tag appears. + Integer nextIfdType = sExifPointerTagMap.get(tagNumber); + if (DEBUG) { + Log.d(TAG, "nextIfdType: " + nextIfdType + " byteCount: " + byteCount); + } + + if (nextIfdType != null) { + long offset = -1L; + // Get offset from data field + switch (dataFormat) { + case IFD_FORMAT_USHORT: { + offset = dataInputStream.readUnsignedShort(); + break; + } + case IFD_FORMAT_SSHORT: { + offset = dataInputStream.readShort(); + break; + } + case IFD_FORMAT_ULONG: { + offset = dataInputStream.readUnsignedInt(); + break; + } + case IFD_FORMAT_SLONG: + case IFD_FORMAT_IFD: { + offset = dataInputStream.readInt(); + break; + } + default: { + // Nothing to do + break; + } + } + if (DEBUG) { + Log.d(TAG, String.format("Offset: %d, tagName: %s", offset, tag.name)); + } + + // Check if the next IFD offset + // 1. Is a non-negative value (within the length of the input, if known), and + // 2. Does not point to a previously read IFD. + if (offset > 0L + && (dataInputStream.length() == ByteOrderedDataInputStream.LENGTH_UNSET + || offset < dataInputStream.length())) { + if (!mAttributesOffsets.contains((int) offset)) { + dataInputStream.seek(offset); + readImageFileDirectory(dataInputStream, nextIfdType); + } else { + if (DEBUG) { + Log.d(TAG, "Skip jump into the IFD since it has already been read: " + + "IfdType " + nextIfdType + " (at " + offset + ")"); + } + } + } else { + if (DEBUG) { + String message = + "Skip jump into the IFD since its offset is invalid: " + offset; + if (dataInputStream.length() != ByteOrderedDataInputStream.LENGTH_UNSET) { + message += " (total length: " + dataInputStream.length() + ")"; + } + Log.d(TAG, message); + } + } + + dataInputStream.seek(nextEntryOffset); + continue; + } + + final int bytesOffset = dataInputStream.position() + mOffsetToExifData; + // TLAD start + if (byteCount > ATTRIBUTE_SIZE_DANGER_THRESHOLD) { + throw new IOException("dangerous attribute size=" + byteCount); + } + // TLAD end + final byte[] bytes = new byte[(int) byteCount]; + dataInputStream.readFully(bytes); + ExifAttribute attribute = new ExifAttribute(dataFormat, numberOfComponents, + bytesOffset, bytes); + mAttributes[ifdType].put(tag.name, attribute); + + // DNG files have a DNG Version tag specifying the version of specifications that the + // image file is following. + // See http://fileformats.archiveteam.org/wiki/DNG + if (TAG_DNG_VERSION.equals(tag.name)) { + mMimeType = IMAGE_TYPE_DNG; + } + + // PEF files have a Make or Model tag that begins with "PENTAX" or a compression tag + // that is 65535. + // See http://fileformats.archiveteam.org/wiki/Pentax_PEF + if (((TAG_MAKE.equals(tag.name) || TAG_MODEL.equals(tag.name)) + && attribute.getStringValue(mExifByteOrder).contains(PEF_SIGNATURE)) + || (TAG_COMPRESSION.equals(tag.name) + && attribute.getIntValue(mExifByteOrder) == 65535)) { + mMimeType = IMAGE_TYPE_PEF; + } + + // Seek to next tag offset + if (dataInputStream.position() != nextEntryOffset) { + dataInputStream.seek(nextEntryOffset); + } + } + + int nextIfdOffset = dataInputStream.readInt(); + if (DEBUG) { + Log.d(TAG, String.format("nextIfdOffset: %d", nextIfdOffset)); + } + // Check if the next IFD offset + // 1. Is a non-negative value, and + // 2. Does not point to a previously read IFD. + if (nextIfdOffset > 0L) { + if (!mAttributesOffsets.contains(nextIfdOffset)) { + dataInputStream.seek(nextIfdOffset); + if (mAttributes[IFD_TYPE_THUMBNAIL].isEmpty()) { + // Do not overwrite thumbnail IFD data if it already exists. + readImageFileDirectory(dataInputStream, IFD_TYPE_THUMBNAIL); + } else if (mAttributes[IFD_TYPE_PREVIEW].isEmpty()) { + readImageFileDirectory(dataInputStream, IFD_TYPE_PREVIEW); + } + } else { + if (DEBUG) { + Log.d(TAG, "Stop reading file since re-reading an IFD may cause an " + + "infinite loop: " + nextIfdOffset); + } + } + } else { + if (DEBUG) { + Log.d(TAG, "Stop reading file since a wrong offset may cause an infinite loop: " + + nextIfdOffset); + } + } + } + + /** + * JPEG compressed images do not contain IMAGE_LENGTH & IMAGE_WIDTH tags. + * This value uses JpegInterchangeFormat(JPEG data offset) value, and calls getJpegAttributes() + * to locate SOF(Start of Frame) marker and update the image length & width values. + * See JEITA CP-3451C Table 5 and Section 4.8.1. B. + */ + private void retrieveJpegImageSize(SeekableByteOrderedDataInputStream in, int imageType) + throws IOException { + // Check if image already has IMAGE_LENGTH & IMAGE_WIDTH values + ExifAttribute imageLengthAttribute = + mAttributes[imageType].get(TAG_IMAGE_LENGTH); + ExifAttribute imageWidthAttribute = + mAttributes[imageType].get(TAG_IMAGE_WIDTH); + + if (imageLengthAttribute == null || imageWidthAttribute == null) { + // Find if offset for JPEG data exists + ExifAttribute jpegInterchangeFormatAttribute = + mAttributes[imageType].get(TAG_JPEG_INTERCHANGE_FORMAT); + ExifAttribute jpegInterchangeFormatLengthAttribute = + mAttributes[imageType].get(TAG_JPEG_INTERCHANGE_FORMAT_LENGTH); + if (jpegInterchangeFormatAttribute != null + && jpegInterchangeFormatLengthAttribute != null) { + int jpegInterchangeFormat = + jpegInterchangeFormatAttribute.getIntValue(mExifByteOrder); + int jpegInterchangeFormatLength = + jpegInterchangeFormatAttribute.getIntValue(mExifByteOrder); + + // Searches for SOF marker in JPEG data and updates IMAGE_LENGTH & IMAGE_WIDTH tags + in.seek(jpegInterchangeFormat); + + // TLAD start + if (jpegInterchangeFormatLength > getAvailableHeapSize()) { + throw new IOException("cannot allocate " + jpegInterchangeFormatLength + " bytes to retrieve image size"); + } + // TLAD end + + byte[] jpegBytes = new byte[jpegInterchangeFormatLength]; + in.readFully(jpegBytes); + getJpegAttributes(new ByteOrderedDataInputStream(jpegBytes), jpegInterchangeFormat, + imageType); + } + } + } + + // Sets thumbnail offset & length attributes based on JpegInterchangeFormat or StripOffsets tags + private void setThumbnailData(ByteOrderedDataInputStream in) throws IOException { + HashMap<String, ExifAttribute> thumbnailData = mAttributes[IFD_TYPE_THUMBNAIL]; + + ExifAttribute compressionAttribute = + thumbnailData.get(TAG_COMPRESSION); + if (compressionAttribute != null) { + mThumbnailCompression = compressionAttribute.getIntValue(mExifByteOrder); + switch (mThumbnailCompression) { + case DATA_JPEG: { + handleThumbnailFromJfif(in, thumbnailData); + break; + } + case DATA_UNCOMPRESSED: + case DATA_JPEG_COMPRESSED: { + if (isSupportedDataType(thumbnailData)) { + handleThumbnailFromStrips(in, thumbnailData); + } + break; + } + } + } else { + // Thumbnail data may not contain Compression tag value + mThumbnailCompression = DATA_JPEG; + handleThumbnailFromJfif(in, thumbnailData); + } + } + + // Check JpegInterchangeFormat(JFIF) tags to retrieve thumbnail offset & length values + // and reads the corresponding bytes if stream does not support seek function + private void handleThumbnailFromJfif(ByteOrderedDataInputStream in, + HashMap<String, ExifAttribute> thumbnailData) throws IOException { + ExifAttribute jpegInterchangeFormatAttribute = + thumbnailData.get(TAG_JPEG_INTERCHANGE_FORMAT); + ExifAttribute jpegInterchangeFormatLengthAttribute = + thumbnailData.get(TAG_JPEG_INTERCHANGE_FORMAT_LENGTH); + if (jpegInterchangeFormatAttribute != null + && jpegInterchangeFormatLengthAttribute != null) { + int thumbnailOffset = jpegInterchangeFormatAttribute.getIntValue(mExifByteOrder); + int thumbnailLength = jpegInterchangeFormatLengthAttribute.getIntValue(mExifByteOrder); + + if (mMimeType == IMAGE_TYPE_ORF) { + // Update offset value since RAF files have IFD data preceding MakerNote data. + thumbnailOffset += mOrfMakerNoteOffset; + } + + if (thumbnailOffset > 0 && thumbnailLength > 0) { + mHasThumbnail = true; + if (mFilename == null && mAssetInputStream == null + && mSeekableFileDescriptor == null) { + // TODO: Need to handle potential OutOfMemoryError + // Save the thumbnail in memory if the input doesn't support reading again. + byte[] thumbnailBytes = new byte[thumbnailLength]; + in.skipFully(thumbnailOffset); + in.readFully(thumbnailBytes); + mThumbnailBytes = thumbnailBytes; + } + mThumbnailOffset = thumbnailOffset; + mThumbnailLength = thumbnailLength; + } + if (DEBUG) { + Log.d(TAG, "Setting thumbnail attributes with offset: " + thumbnailOffset + + ", length: " + thumbnailLength); + } + } + } + + // Check StripOffsets & StripByteCounts tags to retrieve thumbnail offset & length values + private void handleThumbnailFromStrips(ByteOrderedDataInputStream in, + HashMap<String, ExifAttribute> thumbnailData) throws IOException { + ExifAttribute stripOffsetsAttribute = + thumbnailData.get(TAG_STRIP_OFFSETS); + ExifAttribute stripByteCountsAttribute = + thumbnailData.get(TAG_STRIP_BYTE_COUNTS); + + if (stripOffsetsAttribute != null && stripByteCountsAttribute != null) { + long[] stripOffsets = + convertToLongArray(stripOffsetsAttribute.getValue(mExifByteOrder)); + long[] stripByteCounts = + convertToLongArray(stripByteCountsAttribute.getValue(mExifByteOrder)); + + if (stripOffsets == null || stripOffsets.length == 0) { + Log.w(TAG, "stripOffsets should not be null or have zero length."); + return; + } + if (stripByteCounts == null || stripByteCounts.length == 0) { + Log.w(TAG, "stripByteCounts should not be null or have zero length."); + return; + } + if (stripOffsets.length != stripByteCounts.length) { + Log.w(TAG, "stripOffsets and stripByteCounts should have same length."); + return; + } + + long totalStripByteCount = 0; + for (long byteCount : stripByteCounts) { + totalStripByteCount += byteCount; + } + + // TODO: Need to handle potential OutOfMemoryError + // Set thumbnail byte array data for non-consecutive strip bytes + byte[] totalStripBytes = new byte[(int) totalStripByteCount]; + + int bytesRead = 0; + int bytesAdded = 0; + mHasThumbnail = mHasThumbnailStrips = mAreThumbnailStripsConsecutive = true; + for (int i = 0; i < stripOffsets.length; i++) { + int stripOffset = (int) stripOffsets[i]; + int stripByteCount = (int) stripByteCounts[i]; + + // Check if strips are consecutive + // TODO: Add test for non-consecutive thumbnail image + if (i < stripOffsets.length - 1 + && stripOffset + stripByteCount != stripOffsets[i + 1]) { + mAreThumbnailStripsConsecutive = false; + } + + // Skip to offset + int bytesToSkip = stripOffset - bytesRead; + if (bytesToSkip < 0) { + Log.d(TAG, "Invalid strip offset value"); + return; + } + + // TLAD start + if (bytesToSkip > getAvailableHeapSize()) { + throw new IOException("cannot allocate " + bytesToSkip + " bytes to skip to retrieve thumbnail"); + } + // TLAD end + + try { + in.skipFully(bytesToSkip); + } catch (EOFException e) { + Log.d(TAG, "Failed to skip " + bytesToSkip + " bytes."); + return; + } + bytesRead += bytesToSkip; + // TODO: Need to handle potential OutOfMemoryError + byte[] stripBytes = new byte[stripByteCount]; + try { + in.readFully(stripBytes); + } catch (EOFException e) { + Log.d(TAG, "Failed to read " + stripByteCount + " bytes."); + return; + } + bytesRead += stripByteCount; + + // Add bytes to array + System.arraycopy(stripBytes, 0, totalStripBytes, bytesAdded, + stripBytes.length); + bytesAdded += stripBytes.length; + } + mThumbnailBytes = totalStripBytes; + + if (mAreThumbnailStripsConsecutive) { + mThumbnailOffset = (int) stripOffsets[0]; + mThumbnailLength = totalStripBytes.length; + } + } + } + + // Check if thumbnail data type is currently supported or not + private boolean isSupportedDataType(HashMap<String, ExifAttribute> thumbnailData) { + ExifAttribute bitsPerSampleAttribute = + thumbnailData.get(TAG_BITS_PER_SAMPLE); + if (bitsPerSampleAttribute != null) { + int[] bitsPerSampleValue = (int[]) bitsPerSampleAttribute.getValue(mExifByteOrder); + + if (Arrays.equals(BITS_PER_SAMPLE_RGB, bitsPerSampleValue)) { + return true; + } + + // See DNG Specification 1.4.0.0. Section 3, Compression. + if (mMimeType == IMAGE_TYPE_DNG) { + ExifAttribute photometricInterpretationAttribute = + thumbnailData.get(TAG_PHOTOMETRIC_INTERPRETATION); + if (photometricInterpretationAttribute != null) { + int photometricInterpretationValue + = photometricInterpretationAttribute.getIntValue(mExifByteOrder); + if ((photometricInterpretationValue == PHOTOMETRIC_INTERPRETATION_BLACK_IS_ZERO + && Arrays.equals(bitsPerSampleValue, BITS_PER_SAMPLE_GREYSCALE_2)) + || ((photometricInterpretationValue == PHOTOMETRIC_INTERPRETATION_YCBCR) + && Arrays.equals(bitsPerSampleValue, BITS_PER_SAMPLE_RGB))) { + return true; + } else { + // TODO: Add support for lossless Huffman JPEG data + } + } + } + } + if (DEBUG) { + Log.d(TAG, "Unsupported data type value"); + } + return false; + } + + // Returns true if the image length and width values are <= 512. + // See Section 4.8 of http://standardsproposals.bsigroup.com/Home/getPDF/567 + private boolean isThumbnail(HashMap<String, ExifAttribute> map) { + ExifAttribute imageLengthAttribute = map.get(TAG_IMAGE_LENGTH); + ExifAttribute imageWidthAttribute = map.get(TAG_IMAGE_WIDTH); + + if (imageLengthAttribute != null && imageWidthAttribute != null) { + int imageLengthValue = imageLengthAttribute.getIntValue(mExifByteOrder); + int imageWidthValue = imageWidthAttribute.getIntValue(mExifByteOrder); + if (imageLengthValue <= MAX_THUMBNAIL_SIZE && imageWidthValue <= MAX_THUMBNAIL_SIZE) { + return true; + } + } + return false; + } + + // Validate primary, preview, thumbnail image data by comparing image size + private void validateImages() throws IOException { + // Swap images based on size (primary > preview > thumbnail) + swapBasedOnImageSize(IFD_TYPE_PRIMARY, IFD_TYPE_PREVIEW); + swapBasedOnImageSize(IFD_TYPE_PRIMARY, IFD_TYPE_THUMBNAIL); + swapBasedOnImageSize(IFD_TYPE_PREVIEW, IFD_TYPE_THUMBNAIL); + + // TODO (b/142296453): Revise image width/height setting logic + // Check if image has PixelXDimension/PixelYDimension tags, which contain valid image + // sizes, excluding padding at the right end or bottom end of the image to make sure that + // the values are multiples of 64. See JEITA CP-3451C Table 5 and Section 4.8.1. B. + ExifAttribute pixelXDimAttribute = + mAttributes[IFD_TYPE_EXIF].get(TAG_PIXEL_X_DIMENSION); + ExifAttribute pixelYDimAttribute = + mAttributes[IFD_TYPE_EXIF].get(TAG_PIXEL_Y_DIMENSION); + if (pixelXDimAttribute != null && pixelYDimAttribute != null) { + mAttributes[IFD_TYPE_PRIMARY].put(TAG_IMAGE_WIDTH, pixelXDimAttribute); + mAttributes[IFD_TYPE_PRIMARY].put(TAG_IMAGE_LENGTH, pixelYDimAttribute); + } + + // Check whether thumbnail image exists and whether preview image satisfies the thumbnail + // image requirements + if (mAttributes[IFD_TYPE_THUMBNAIL].isEmpty()) { + if (isThumbnail(mAttributes[IFD_TYPE_PREVIEW])) { + mAttributes[IFD_TYPE_THUMBNAIL] = mAttributes[IFD_TYPE_PREVIEW]; + mAttributes[IFD_TYPE_PREVIEW] = new HashMap<>(); + } + } + + // Check if the thumbnail image satisfies the thumbnail size requirements + if (!isThumbnail(mAttributes[IFD_TYPE_THUMBNAIL])) { + Log.d(TAG, "No image meets the size requirements of a thumbnail image."); + } + + // TAG_THUMBNAIL_* tags should be replaced with TAG_* equivalents and vice versa if needed. + replaceInvalidTags(IFD_TYPE_PRIMARY, TAG_THUMBNAIL_ORIENTATION, TAG_ORIENTATION); + replaceInvalidTags(IFD_TYPE_PRIMARY, TAG_THUMBNAIL_IMAGE_LENGTH, TAG_IMAGE_LENGTH); + replaceInvalidTags(IFD_TYPE_PRIMARY, TAG_THUMBNAIL_IMAGE_WIDTH, TAG_IMAGE_WIDTH); + replaceInvalidTags(IFD_TYPE_PREVIEW, TAG_THUMBNAIL_ORIENTATION, TAG_ORIENTATION); + replaceInvalidTags(IFD_TYPE_PREVIEW, TAG_THUMBNAIL_IMAGE_LENGTH, TAG_IMAGE_LENGTH); + replaceInvalidTags(IFD_TYPE_PREVIEW, TAG_THUMBNAIL_IMAGE_WIDTH, TAG_IMAGE_WIDTH); + replaceInvalidTags(IFD_TYPE_THUMBNAIL, TAG_ORIENTATION, TAG_THUMBNAIL_ORIENTATION); + replaceInvalidTags(IFD_TYPE_THUMBNAIL, TAG_IMAGE_LENGTH, TAG_THUMBNAIL_IMAGE_LENGTH); + replaceInvalidTags(IFD_TYPE_THUMBNAIL, TAG_IMAGE_WIDTH, TAG_THUMBNAIL_IMAGE_WIDTH); + } + + /** + * If image is uncompressed, ImageWidth/Length tags are used to store size info. + * However, uncompressed images often store extra pixels around the edges of the final image, + * which results in larger values for TAG_IMAGE_WIDTH and TAG_IMAGE_LENGTH tags. + * This method corrects those tag values by checking first the values of TAG_DEFAULT_CROP_SIZE + * See DNG Specification 1.4.0.0. Section 4. (DefaultCropSize) + * <p> + * If image is a RW2 file, valid image sizes are stored in SensorBorder tags. + * See tiff_parser.cc GetFullDimension32() + */ + private void updateImageSizeValues(SeekableByteOrderedDataInputStream in, int imageType) + throws IOException { + // Uncompressed image valid image size values + ExifAttribute defaultCropSizeAttribute = + mAttributes[imageType].get(TAG_DEFAULT_CROP_SIZE); + // RW2 image valid image size values + ExifAttribute topBorderAttribute = + mAttributes[imageType].get(TAG_RW2_SENSOR_TOP_BORDER); + ExifAttribute leftBorderAttribute = + mAttributes[imageType].get(TAG_RW2_SENSOR_LEFT_BORDER); + ExifAttribute bottomBorderAttribute = + mAttributes[imageType].get(TAG_RW2_SENSOR_BOTTOM_BORDER); + ExifAttribute rightBorderAttribute = + mAttributes[imageType].get(TAG_RW2_SENSOR_RIGHT_BORDER); + + if (defaultCropSizeAttribute != null) { + // Update for uncompressed image + ExifAttribute defaultCropSizeXAttribute, defaultCropSizeYAttribute; + if (defaultCropSizeAttribute.format == IFD_FORMAT_URATIONAL) { + Rational[] defaultCropSizeValue = + (Rational[]) defaultCropSizeAttribute.getValue(mExifByteOrder); + if (defaultCropSizeValue == null || defaultCropSizeValue.length != 2) { + Log.w(TAG, "Invalid crop size values. cropSize=" + + Arrays.toString(defaultCropSizeValue)); + return; + } + defaultCropSizeXAttribute = + ExifAttribute.createURational(defaultCropSizeValue[0], mExifByteOrder); + defaultCropSizeYAttribute = + ExifAttribute.createURational(defaultCropSizeValue[1], mExifByteOrder); + } else { + int[] defaultCropSizeValue = + (int[]) defaultCropSizeAttribute.getValue(mExifByteOrder); + if (defaultCropSizeValue == null || defaultCropSizeValue.length != 2) { + Log.w(TAG, "Invalid crop size values. cropSize=" + + Arrays.toString(defaultCropSizeValue)); + return; + } + defaultCropSizeXAttribute = + ExifAttribute.createUShort(defaultCropSizeValue[0], mExifByteOrder); + defaultCropSizeYAttribute = + ExifAttribute.createUShort(defaultCropSizeValue[1], mExifByteOrder); + } + mAttributes[imageType].put(TAG_IMAGE_WIDTH, defaultCropSizeXAttribute); + mAttributes[imageType].put(TAG_IMAGE_LENGTH, defaultCropSizeYAttribute); + } else if (topBorderAttribute != null && leftBorderAttribute != null && + bottomBorderAttribute != null && rightBorderAttribute != null) { + // Update for RW2 image + int topBorderValue = topBorderAttribute.getIntValue(mExifByteOrder); + int bottomBorderValue = bottomBorderAttribute.getIntValue(mExifByteOrder); + int rightBorderValue = rightBorderAttribute.getIntValue(mExifByteOrder); + int leftBorderValue = leftBorderAttribute.getIntValue(mExifByteOrder); + if (bottomBorderValue > topBorderValue && rightBorderValue > leftBorderValue) { + int length = bottomBorderValue - topBorderValue; + int width = rightBorderValue - leftBorderValue; + ExifAttribute imageLengthAttribute = + ExifAttribute.createUShort(length, mExifByteOrder); + ExifAttribute imageWidthAttribute = + ExifAttribute.createUShort(width, mExifByteOrder); + mAttributes[imageType].put(TAG_IMAGE_LENGTH, imageLengthAttribute); + mAttributes[imageType].put(TAG_IMAGE_WIDTH, imageWidthAttribute); + } + } else { + retrieveJpegImageSize(in, imageType); + } + } + + /** + * Writes an Exif segment into the given output stream. + * + * @return The offset of the start of the Exif data (the byte-order marker) written into {@code + * dataOutputStream}. + */ + private int writeExifSegment(ByteOrderedDataOutputStream dataOutputStream) throws IOException { + // The following variables are for calculating each IFD tag group size in bytes. + int[] ifdOffsets = new int[EXIF_TAGS.length]; + int[] ifdDataSizes = new int[EXIF_TAGS.length]; + + // Remove IFD pointer tags (we'll re-add it later.) + for (ExifTag tag : EXIF_POINTER_TAGS) { + removeAttribute(tag.name); + } + // Remove old thumbnail data + if (mHasThumbnail) { + if (mHasThumbnailStrips) { + removeAttribute(TAG_STRIP_OFFSETS); + removeAttribute(TAG_STRIP_BYTE_COUNTS); + } else { + removeAttribute(TAG_JPEG_INTERCHANGE_FORMAT); + removeAttribute(TAG_JPEG_INTERCHANGE_FORMAT_LENGTH); + } + } + + // Remove null value tags. + for (int ifdType = 0; ifdType < EXIF_TAGS.length; ++ifdType) { + Iterator<Map.Entry<String, ExifAttribute>> entrySetIterator = + mAttributes[ifdType].entrySet().iterator(); + while (entrySetIterator.hasNext()) { + Map.Entry<String, ExifAttribute> entry = entrySetIterator.next(); + if (entry.getValue() == null) { + entrySetIterator.remove(); + } + } + } + + // Add IFD pointer tags. The next offset of primary image TIFF IFD will have thumbnail IFD + // offset when there is one or more tags in the thumbnail IFD. + if (!mAttributes[IFD_TYPE_EXIF].isEmpty()) { + mAttributes[IFD_TYPE_PRIMARY].put(EXIF_POINTER_TAGS[1].name, + ExifAttribute.createULong(0, mExifByteOrder)); + } + if (!mAttributes[IFD_TYPE_GPS].isEmpty()) { + mAttributes[IFD_TYPE_PRIMARY].put(EXIF_POINTER_TAGS[2].name, + ExifAttribute.createULong(0, mExifByteOrder)); + } + if (!mAttributes[IFD_TYPE_INTEROPERABILITY].isEmpty()) { + mAttributes[IFD_TYPE_EXIF].put(EXIF_POINTER_TAGS[3].name, + ExifAttribute.createULong(0, mExifByteOrder)); + } + if (mHasThumbnail) { + if (mHasThumbnailStrips) { + mAttributes[IFD_TYPE_THUMBNAIL].put(TAG_STRIP_OFFSETS, + ExifAttribute.createUShort(0, mExifByteOrder)); + mAttributes[IFD_TYPE_THUMBNAIL].put(TAG_STRIP_BYTE_COUNTS, + ExifAttribute.createUShort(mThumbnailLength, mExifByteOrder)); + } else { + mAttributes[IFD_TYPE_THUMBNAIL].put(TAG_JPEG_INTERCHANGE_FORMAT, + ExifAttribute.createULong(0, mExifByteOrder)); + mAttributes[IFD_TYPE_THUMBNAIL].put(TAG_JPEG_INTERCHANGE_FORMAT_LENGTH, + ExifAttribute.createULong(mThumbnailLength, mExifByteOrder)); + } + } + + // Calculate IFD group data area sizes. IFD group data area is assigned to save the entry + // value which has a bigger size than 4 bytes. + for (int i = 0; i < EXIF_TAGS.length; ++i) { + int sum = 0; + for (Map.Entry<String, ExifAttribute> entry : mAttributes[i].entrySet()) { + final ExifAttribute exifAttribute = entry.getValue(); + final int size = exifAttribute.size(); + if (size > 4) { + sum += size; + } + } + ifdDataSizes[i] += sum; + } + + // Calculate IFD offsets. + // 8 bytes are for TIFF headers: 2 bytes (byte order) + 2 bytes (identifier) + 4 bytes + // (offset of IFDs) + int position = 8; + for (int ifdType = 0; ifdType < EXIF_TAGS.length; ++ifdType) { + if (!mAttributes[ifdType].isEmpty()) { + ifdOffsets[ifdType] = position; + position += 2 + mAttributes[ifdType].size() * 12 + 4 + ifdDataSizes[ifdType]; + } + } + if (mHasThumbnail) { + int thumbnailOffset = position; + if (mHasThumbnailStrips) { + mAttributes[IFD_TYPE_THUMBNAIL].put(TAG_STRIP_OFFSETS, + ExifAttribute.createUShort(thumbnailOffset, mExifByteOrder)); + } else { + mAttributes[IFD_TYPE_THUMBNAIL].put(TAG_JPEG_INTERCHANGE_FORMAT, + ExifAttribute.createULong(thumbnailOffset, mExifByteOrder)); + } + mThumbnailOffset = thumbnailOffset; + position += mThumbnailLength; + } + + int totalSize = position; + if (mMimeType == IMAGE_TYPE_JPEG) { + // Add 8 bytes for APP1 size and identifier data + totalSize += 8; + } + if (DEBUG) { + for (int i = 0; i < EXIF_TAGS.length; ++i) { + Log.d(TAG, String.format("index: %d, offsets: %d, tag count: %d, data sizes: %d, " + + "total size: %d", i, ifdOffsets[i], mAttributes[i].size(), + ifdDataSizes[i], totalSize)); + } + } + + // Update IFD pointer tags with the calculated offsets. + if (!mAttributes[IFD_TYPE_EXIF].isEmpty()) { + mAttributes[IFD_TYPE_PRIMARY].put(EXIF_POINTER_TAGS[1].name, + ExifAttribute.createULong(ifdOffsets[IFD_TYPE_EXIF], mExifByteOrder)); + } + if (!mAttributes[IFD_TYPE_GPS].isEmpty()) { + mAttributes[IFD_TYPE_PRIMARY].put(EXIF_POINTER_TAGS[2].name, + ExifAttribute.createULong(ifdOffsets[IFD_TYPE_GPS], mExifByteOrder)); + } + if (!mAttributes[IFD_TYPE_INTEROPERABILITY].isEmpty()) { + mAttributes[IFD_TYPE_EXIF].put(EXIF_POINTER_TAGS[3].name, ExifAttribute.createULong( + ifdOffsets[IFD_TYPE_INTEROPERABILITY], mExifByteOrder)); + } + + switch (mMimeType) { + case IMAGE_TYPE_JPEG: + if (totalSize > 0xFFFF) { + throw new IllegalStateException( + "Size of exif data (" + totalSize + " bytes) exceeds the max size of a " + + "JPEG APP1 segment (65536 bytes)"); + } + // Write JPEG specific data (APP1 size, APP1 identifier) + dataOutputStream.writeUnsignedShort(totalSize); + dataOutputStream.write(IDENTIFIER_EXIF_APP1); + break; + case IMAGE_TYPE_PNG: + // Write PNG specific data (chunk size, chunk type) + dataOutputStream.writeInt(totalSize); + dataOutputStream.writeInt(PNG_CHUNK_TYPE_EXIF); + break; + case IMAGE_TYPE_WEBP: + // Write WebP specific data (chunk type, chunk size) + dataOutputStream.write(WEBP_CHUNK_TYPE_EXIF); + dataOutputStream.writeInt(totalSize); + break; + } + + int offsetToExifData = dataOutputStream.mOutputStream.size(); + + // Write TIFF Headers. See JEITA CP-3451C Section 4.5.2. Table 1. + dataOutputStream.writeShort(mExifByteOrder == BIG_ENDIAN ? BYTE_ALIGN_MM : BYTE_ALIGN_II); + dataOutputStream.setByteOrder(mExifByteOrder); + dataOutputStream.writeUnsignedShort(START_CODE); + dataOutputStream.writeUnsignedInt(IFD_OFFSET); + + // Write IFD groups. See JEITA CP-3451C Section 4.5.8. Figure 9. + for (int ifdType = 0; ifdType < EXIF_TAGS.length; ++ifdType) { + if (!mAttributes[ifdType].isEmpty()) { + // See JEITA CP-3451C Section 4.6.2: IFD structure. + // Write entry count + dataOutputStream.writeUnsignedShort(mAttributes[ifdType].size()); + + // Write entry info + int dataOffset = ifdOffsets[ifdType] + 2 + mAttributes[ifdType].size() * 12 + 4; + for (Map.Entry<String, ExifAttribute> entry : mAttributes[ifdType].entrySet()) { + // Convert tag name to tag number. + final ExifTag tag = sExifTagMapsForWriting[ifdType].get(entry.getKey()); + final int tagNumber = tag.number; + final ExifAttribute attribute = entry.getValue(); + final int size = attribute.size(); + + dataOutputStream.writeUnsignedShort(tagNumber); + dataOutputStream.writeUnsignedShort(attribute.format); + dataOutputStream.writeInt(attribute.numberOfComponents); + if (size > 4) { + dataOutputStream.writeUnsignedInt(dataOffset); + dataOffset += size; + } else { + dataOutputStream.write(attribute.bytes); + // Fill zero up to 4 bytes + if (size < 4) { + for (int i = size; i < 4; ++i) { + dataOutputStream.writeByte(0); + } + } + } + } + + // Write the next offset. It writes the offset of thumbnail IFD if there is one or + // more tags in the thumbnail IFD when the current IFD is the primary image TIFF + // IFD; Otherwise 0. + if (ifdType == 0 && !mAttributes[IFD_TYPE_THUMBNAIL].isEmpty()) { + dataOutputStream.writeUnsignedInt(ifdOffsets[IFD_TYPE_THUMBNAIL]); + } else { + dataOutputStream.writeUnsignedInt(0); + } + + // Write values of data field exceeding 4 bytes after the next offset. + for (Map.Entry<String, ExifAttribute> entry : mAttributes[ifdType].entrySet()) { + ExifAttribute attribute = entry.getValue(); + + if (attribute.bytes.length > 4) { + dataOutputStream.write(attribute.bytes, 0, attribute.bytes.length); + } + } + } + } + + // Write thumbnail + if (mHasThumbnail) { + dataOutputStream.write(getThumbnailBytes()); + } + + // For WebP files, add a single padding byte at end if chunk size is odd + if (mMimeType == IMAGE_TYPE_WEBP && totalSize % 2 == 1) { + dataOutputStream.writeByte(0); + } + + // Reset the byte order to big endian in order to write remaining parts of the JPEG file. + dataOutputStream.setByteOrder(BIG_ENDIAN); + + return offsetToExifData; + } + + /** + * Determines the data format of EXIF entry value. + * + * @param entryValue The value to be determined. + * @return Returns two data formats guessed as a pair in integer. If there is no two candidate + * data formats for the given entry value, returns {@code -1} in the second of the pair. + */ + private static Pair<Integer, Integer> guessDataFormat(String entryValue) { + // See TIFF 6.0 Section 2, "Image File Directory". + // Take the first component if there are more than one component. + if (entryValue.contains(",")) { + String[] entryValues = entryValue.split(",", -1); + Pair<Integer, Integer> dataFormat = guessDataFormat(entryValues[0]); + if (dataFormat.first == IFD_FORMAT_STRING) { + return dataFormat; + } + for (int i = 1; i < entryValues.length; ++i) { + final Pair<Integer, Integer> guessDataFormat = guessDataFormat(entryValues[i]); + int first = -1, second = -1; + if (guessDataFormat.first.equals(dataFormat.first) + || guessDataFormat.second.equals(dataFormat.first)) { + first = dataFormat.first; + } + if (dataFormat.second != -1 && (guessDataFormat.first.equals(dataFormat.second) + || guessDataFormat.second.equals(dataFormat.second))) { + second = dataFormat.second; + } + if (first == -1 && second == -1) { + return new Pair<>(IFD_FORMAT_STRING, -1); + } + if (first == -1) { + dataFormat = new Pair<>(second, -1); + continue; + } + if (second == -1) { + dataFormat = new Pair<>(first, -1); + continue; + } + } + return dataFormat; + } + + if (entryValue.contains("/")) { + String[] rationalNumber = entryValue.split("/", -1); + if (rationalNumber.length == 2) { + try { + long numerator = (long) Double.parseDouble(rationalNumber[0]); + long denominator = (long) Double.parseDouble(rationalNumber[1]); + if (numerator < 0L || denominator < 0L) { + return new Pair<>(IFD_FORMAT_SRATIONAL, -1); + } + if (numerator > Integer.MAX_VALUE || denominator > Integer.MAX_VALUE) { + return new Pair<>(IFD_FORMAT_URATIONAL, -1); + } + return new Pair<>(IFD_FORMAT_SRATIONAL, IFD_FORMAT_URATIONAL); + } catch (NumberFormatException e) { + // Ignored + } + } + return new Pair<>(IFD_FORMAT_STRING, -1); + } + try { + Long longValue = Long.parseLong(entryValue); + if (longValue >= 0 && longValue <= 65535) { + return new Pair<>(IFD_FORMAT_USHORT, IFD_FORMAT_ULONG); + } + if (longValue < 0) { + return new Pair<>(IFD_FORMAT_SLONG, -1); + } + return new Pair<>(IFD_FORMAT_ULONG, -1); + } catch (NumberFormatException e) { + // Ignored + } + try { + Double.parseDouble(entryValue); + return new Pair<>(IFD_FORMAT_DOUBLE, -1); + } catch (NumberFormatException e) { + // Ignored + } + return new Pair<>(IFD_FORMAT_STRING, -1); + } + + // An input stream class that can parse both little and big endian order data and also + // supports seeking to any position in the stream via mark/reset. + private static class SeekableByteOrderedDataInputStream extends ByteOrderedDataInputStream { + SeekableByteOrderedDataInputStream(byte[] bytes) throws IOException { + super(bytes); + // No need to check if mark is supported here since ByteOrderedDataInputStream will + // create a ByteArrayInputStream, which supports mark by default. + mDataInputStream.mark(Integer.MAX_VALUE); + } + + /** + * Given input stream should support mark/reset, and should be set to the beginning of + * the stream. + */ + SeekableByteOrderedDataInputStream(InputStream in) throws IOException { + super(in); + if (!in.markSupported()) { + throw new IllegalArgumentException("Cannot create " + + "SeekableByteOrderedDataInputStream with stream that does not support " + + "mark/reset"); + } + // Mark given InputStream to the maximum value (we can't know the length of the + // stream for certain) so that InputStream.reset() may be called at any point in the + // stream to reset the stream to an earlier position. + mDataInputStream.mark(Integer.MAX_VALUE); + } + + /** + * Seek to the given absolute position in the stream (i.e. the number of bytes from the + * beginning of the stream). + */ + public void seek(long position) throws IOException { + if (mPosition > position) { + mPosition = 0; + mDataInputStream.reset(); + } else { + position -= mPosition; + } + skipFully((int) position); + } + } + + // An input stream class that can parse both little and big endian order data. + private static class ByteOrderedDataInputStream extends InputStream implements DataInput { + + public static final int LENGTH_UNSET = -1; + protected final DataInputStream mDataInputStream; + protected int mPosition; + + private ByteOrder mByteOrder; + private byte[] mSkipBuffer; + private int mLength; + + ByteOrderedDataInputStream(byte[] bytes) throws IOException { + this(new ByteArrayInputStream(bytes), BIG_ENDIAN); + this.mLength = bytes.length; + } + + ByteOrderedDataInputStream(InputStream in) throws IOException { + this(in, BIG_ENDIAN); + } + + ByteOrderedDataInputStream(InputStream in, ByteOrder byteOrder) { + mDataInputStream = new DataInputStream(in); + mDataInputStream.mark(0); + mPosition = 0; + mByteOrder = byteOrder; + this.mLength = in instanceof ByteOrderedDataInputStream + ? ((ByteOrderedDataInputStream) in).length() + : LENGTH_UNSET; + } + + public void setByteOrder(ByteOrder byteOrder) { + mByteOrder = byteOrder; + } + + public int position() { + return mPosition; + } + + /** + * Reads all remaining data. + */ + public byte[] readToEnd() throws IOException { + byte[] data = new byte[1024]; + int bytesRead = 0; + while (true) { + if (bytesRead == data.length) { + data = Arrays.copyOf(data, data.length * 2); + } + int readResult = mDataInputStream.read(data, bytesRead, data.length - bytesRead); + if (readResult != -1) { + bytesRead += readResult; + mPosition += readResult; + } else { + break; + } + } + return Arrays.copyOf(data, bytesRead); + } + + @Override + public int available() throws IOException { + return mDataInputStream.available(); + } + + @Override + public int read() throws IOException { + ++mPosition; + return mDataInputStream.read(); + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + int bytesRead = mDataInputStream.read(b, off, len); + mPosition += bytesRead; + return bytesRead; + } + + @Override + public int readUnsignedByte() throws IOException { + ++mPosition; + return mDataInputStream.readUnsignedByte(); + } + + @Override + public String readLine() throws IOException { + Log.d(TAG, "Currently unsupported"); + return null; + } + + @Override + public boolean readBoolean() throws IOException { + ++mPosition; + return mDataInputStream.readBoolean(); + } + + @Override + public char readChar() throws IOException { + mPosition += 2; + return mDataInputStream.readChar(); + } + + @Override + public String readUTF() throws IOException { + mPosition += 2; + return mDataInputStream.readUTF(); + } + + @Override + public void readFully(byte[] buffer, int offset, int length) throws IOException { + mPosition += length; + mDataInputStream.readFully(buffer, offset, length); + } + + @Override + public void readFully(byte[] buffer) throws IOException { + mPosition += buffer.length; + mDataInputStream.readFully(buffer); + } + + @Override + public byte readByte() throws IOException { + ++mPosition; + int ch = mDataInputStream.read(); + if (ch < 0) { + throw new EOFException(); + } + return (byte) ch; + } + + @Override + public short readShort() throws IOException { + mPosition += 2; + int ch1 = mDataInputStream.read(); + int ch2 = mDataInputStream.read(); + if ((ch1 | ch2) < 0) { + throw new EOFException(); + } + if (mByteOrder == LITTLE_ENDIAN) { + return (short) ((ch2 << 8) + ch1); + } else if (mByteOrder == BIG_ENDIAN) { + return (short) ((ch1 << 8) + ch2); + } + throw new IOException("Invalid byte order: " + mByteOrder); + } + + @Override + public int readInt() throws IOException { + mPosition += 4; + int ch1 = mDataInputStream.read(); + int ch2 = mDataInputStream.read(); + int ch3 = mDataInputStream.read(); + int ch4 = mDataInputStream.read(); + if ((ch1 | ch2 | ch3 | ch4) < 0) { + throw new EOFException(); + } + if (mByteOrder == LITTLE_ENDIAN) { + return ((ch4 << 24) + (ch3 << 16) + (ch2 << 8) + ch1); + } else if (mByteOrder == BIG_ENDIAN) { + return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + ch4); + } + throw new IOException("Invalid byte order: " + mByteOrder); + } + + @Override + public int skipBytes(int n) throws IOException { + throw new UnsupportedOperationException("skipBytes is currently unsupported"); + } + + /** + * Discards n bytes of data from the input stream. This method will block until either + * the full amount has been skipped or the end of the stream is reached, whichever happens + * first. + */ + public void skipFully(int n) throws IOException { + int totalSkipped = 0; + while (totalSkipped < n) { + int skipped = (int) mDataInputStream.skip(n - totalSkipped); + if (skipped <= 0) { + if (mSkipBuffer == null) { + mSkipBuffer = new byte[SKIP_BUFFER_SIZE]; + } + int bytesToSkip = Math.min(SKIP_BUFFER_SIZE, n - totalSkipped); + if ((skipped = mDataInputStream.read(mSkipBuffer, 0, bytesToSkip)) == -1) { + throw new EOFException("Reached EOF while skipping " + n + " bytes."); + } + } + totalSkipped += skipped; + } + mPosition += totalSkipped; + } + + @Override + public int readUnsignedShort() throws IOException { + mPosition += 2; + int ch1 = mDataInputStream.read(); + int ch2 = mDataInputStream.read(); + if ((ch1 | ch2) < 0) { + throw new EOFException(); + } + if (mByteOrder == LITTLE_ENDIAN) { + return ((ch2 << 8) + ch1); + } else if (mByteOrder == BIG_ENDIAN) { + return ((ch1 << 8) + ch2); + } + throw new IOException("Invalid byte order: " + mByteOrder); + } + + public long readUnsignedInt() throws IOException { + return readInt() & 0xffffffffL; + } + + @Override + public long readLong() throws IOException { + mPosition += 8; + int ch1 = mDataInputStream.read(); + int ch2 = mDataInputStream.read(); + int ch3 = mDataInputStream.read(); + int ch4 = mDataInputStream.read(); + int ch5 = mDataInputStream.read(); + int ch6 = mDataInputStream.read(); + int ch7 = mDataInputStream.read(); + int ch8 = mDataInputStream.read(); + if ((ch1 | ch2 | ch3 | ch4 | ch5 | ch6 | ch7 | ch8) < 0) { + throw new EOFException(); + } + if (mByteOrder == LITTLE_ENDIAN) { + return (((long) ch8 << 56) + ((long) ch7 << 48) + ((long) ch6 << 40) + + ((long) ch5 << 32) + ((long) ch4 << 24) + ((long) ch3 << 16) + + ((long) ch2 << 8) + (long) ch1); + } else if (mByteOrder == BIG_ENDIAN) { + return (((long) ch1 << 56) + ((long) ch2 << 48) + ((long) ch3 << 40) + + ((long) ch4 << 32) + ((long) ch5 << 24) + ((long) ch6 << 16) + + ((long) ch7 << 8) + (long) ch8); + } + throw new IOException("Invalid byte order: " + mByteOrder); + } + + @Override + public float readFloat() throws IOException { + return Float.intBitsToFloat(readInt()); + } + + @Override + public double readDouble() throws IOException { + return Double.longBitsToDouble(readLong()); + } + + @Override + public void mark(int readlimit) { + throw new UnsupportedOperationException("Mark is currently unsupported"); + } + + @Override + public void reset() { + throw new UnsupportedOperationException("Reset is currently unsupported"); + } + + /** + * Return the total length (in bytes) of the underlying stream if known, otherwise + * {@link #LENGTH_UNSET}. + */ + public int length() { + return mLength; + } + } + + // An output stream to write EXIF data area, which can be written in either little or big endian + // order. + private static class ByteOrderedDataOutputStream extends FilterOutputStream { + final DataOutputStream mOutputStream; + private ByteOrder mByteOrder; + + public ByteOrderedDataOutputStream(OutputStream out, ByteOrder byteOrder) { + super(out); + mOutputStream = new DataOutputStream(out); + mByteOrder = byteOrder; + } + + public void setByteOrder(ByteOrder byteOrder) { + mByteOrder = byteOrder; + } + + @Override + public void write(byte[] bytes) throws IOException { + mOutputStream.write(bytes); + } + + @Override + public void write(byte[] bytes, int offset, int length) throws IOException { + mOutputStream.write(bytes, offset, length); + } + + public void writeByte(int val) throws IOException { + mOutputStream.write(val); + } + + public void writeShort(short val) throws IOException { + if (mByteOrder == LITTLE_ENDIAN) { + mOutputStream.write((val >>> 0) & 0xFF); + mOutputStream.write((val >>> 8) & 0xFF); + } else if (mByteOrder == BIG_ENDIAN) { + mOutputStream.write((val >>> 8) & 0xFF); + mOutputStream.write((val >>> 0) & 0xFF); + } + } + + public void writeInt(int val) throws IOException { + if (mByteOrder == LITTLE_ENDIAN) { + mOutputStream.write((val >>> 0) & 0xFF); + mOutputStream.write((val >>> 8) & 0xFF); + mOutputStream.write((val >>> 16) & 0xFF); + mOutputStream.write((val >>> 24) & 0xFF); + } else if (mByteOrder == BIG_ENDIAN) { + mOutputStream.write((val >>> 24) & 0xFF); + mOutputStream.write((val >>> 16) & 0xFF); + mOutputStream.write((val >>> 8) & 0xFF); + mOutputStream.write((val >>> 0) & 0xFF); + } + } + + public void writeUnsignedShort(int val) throws IOException { + if (val > 0xFFFF) { + throw new IllegalArgumentException("val is larger than the maximum value of a " + + "16-bit unsigned integer"); + } + writeShort((short) val); + } + + public void writeUnsignedInt(long val) throws IOException { + if (val > 0xFFFF_FFFFL) { + throw new IllegalArgumentException("val is larger than the maximum value of a " + + "32-bit unsigned integer"); + } + writeInt((int) val); + } + } + + // Swaps image data based on image size + private void swapBasedOnImageSize(@IfdType int firstIfdType, @IfdType int secondIfdType) + throws IOException { + if (mAttributes[firstIfdType].isEmpty() || mAttributes[secondIfdType].isEmpty()) { + if (DEBUG) { + Log.d(TAG, "Cannot perform swap since only one image data exists"); + } + return; + } + + ExifAttribute firstImageLengthAttribute = + mAttributes[firstIfdType].get(TAG_IMAGE_LENGTH); + ExifAttribute firstImageWidthAttribute = + mAttributes[firstIfdType].get(TAG_IMAGE_WIDTH); + ExifAttribute secondImageLengthAttribute = + mAttributes[secondIfdType].get(TAG_IMAGE_LENGTH); + ExifAttribute secondImageWidthAttribute = + mAttributes[secondIfdType].get(TAG_IMAGE_WIDTH); + + if (firstImageLengthAttribute == null || firstImageWidthAttribute == null) { + if (DEBUG) { + Log.d(TAG, "First image does not contain valid size information"); + } + } else if (secondImageLengthAttribute == null || secondImageWidthAttribute == null) { + if (DEBUG) { + Log.d(TAG, "Second image does not contain valid size information"); + } + } else { + int firstImageLengthValue = firstImageLengthAttribute.getIntValue(mExifByteOrder); + int firstImageWidthValue = firstImageWidthAttribute.getIntValue(mExifByteOrder); + int secondImageLengthValue = secondImageLengthAttribute.getIntValue(mExifByteOrder); + int secondImageWidthValue = secondImageWidthAttribute.getIntValue(mExifByteOrder); + + if (firstImageLengthValue < secondImageLengthValue && + firstImageWidthValue < secondImageWidthValue) { + HashMap<String, ExifAttribute> tempMap = mAttributes[firstIfdType]; + mAttributes[firstIfdType] = mAttributes[secondIfdType]; + mAttributes[secondIfdType] = tempMap; + } + } + } + + private void replaceInvalidTags(@IfdType int ifdType, String invalidTag, String validTag) { + if (!mAttributes[ifdType].isEmpty()) { + if (mAttributes[ifdType].get(invalidTag) != null) { + mAttributes[ifdType].put(validTag, + mAttributes[ifdType].get(invalidTag)); + mAttributes[ifdType].remove(invalidTag); + } + } + } + + /** + * Parsing EXIF data requires seek (moving to any position in the stream), so all MIME + * types should support seek via mark/reset, unless the MIME type specifies the position and + * length of the EXIF data and the EXIF data can be read from the file and wrapped with a + * ByteArrayInputStream. + */ + private static boolean shouldSupportSeek(int mimeType) { + if (mimeType == IMAGE_TYPE_JPEG || mimeType == IMAGE_TYPE_RAF || mimeType == IMAGE_TYPE_PNG + || mimeType == IMAGE_TYPE_WEBP) { + return false; + } + return true; + } + + private static boolean isSupportedFormatForSavingAttributes(int mimeType) { + if (mimeType == IMAGE_TYPE_JPEG || mimeType == IMAGE_TYPE_PNG + || mimeType == IMAGE_TYPE_WEBP) { + return true; + } + return false; + } +} diff --git a/android/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterfaceUtilsFork.java b/android/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterfaceUtilsFork.java new file mode 100644 index 0000000..790cd82 --- /dev/null +++ b/android/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterfaceUtilsFork.java @@ -0,0 +1,170 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.exifinterface.media; + +import android.media.MediaDataSource; +import android.media.MediaMetadataRetriever; +import android.system.ErrnoException; +import android.system.Os; +import android.util.Log; + +import androidx.annotation.RequiresApi; + +import java.io.Closeable; +import java.io.FileDescriptor; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/* + * Forked from 'androidx.exifinterface:exifinterface:1.4.2' + * Named differently to let ExifInterface be loaded as subdependency. + * cf https://github.com/androidx/androidx/tree/androidx-main/exifinterface/exifinterface/src/main/java/androidx/exifinterface/media + */ + +class ExifInterfaceUtilsFork { + private static final String TAG = "ExifInterfaceUtils"; + + private ExifInterfaceUtilsFork() { + // Prevent instantiation + } + + /** + * Copies all of the bytes from {@code in} to {@code out}. Neither stream is closed. + * Returns the total number of bytes transferred. + */ + static int copy(InputStream in, OutputStream out) throws IOException { + int total = 0; + byte[] buffer = new byte[8192]; + int c; + while ((c = in.read(buffer)) != -1) { + total += c; + out.write(buffer, 0, c); + } + return total; + } + + /** + * Copies the given number of the bytes from {@code in} to {@code out}. Neither stream is + * closed. + */ + static void copy(InputStream in, OutputStream out, int numBytes) throws IOException { + int remainder = numBytes; + byte[] buffer = new byte[8192]; + while (remainder > 0) { + int bytesToRead = Math.min(remainder, 8192); + int bytesRead = in.read(buffer, 0, bytesToRead); + if (bytesRead != bytesToRead) { + throw new IOException("Failed to copy the given amount of bytes from the input" + + "stream to the output stream."); + } + remainder -= bytesRead; + out.write(buffer, 0, bytesRead); + } + } + + /** + * Convert given int[] to long[]. If long[] is given, just return it. + * Return null for other types of input. + */ + static long[] convertToLongArray(Object inputObj) { + if (inputObj instanceof int[]) { + int[] input = (int[]) inputObj; + long[] result = new long[input.length]; + for (int i = 0; i < input.length; i++) { + result[i] = input[i]; + } + return result; + } else if (inputObj instanceof long[]) { + return (long[]) inputObj; + } + return null; + } + + static boolean startsWith(byte[] cur, byte[] val) { + if (cur == null || val == null) { + return false; + } + if (cur.length < val.length) { + return false; + } + for (int i = 0; i < val.length; i++) { + if (cur[i] != val[i]) { + return false; + } + } + return true; + } + + static String byteArrayToHexString(byte[] bytes) { + StringBuilder sb = new StringBuilder(bytes.length * 2); + for (int i = 0; i < bytes.length; i++) { + sb.append(String.format("%02x", bytes[i])); + } + return sb.toString(); + } + + static long parseSubSeconds(String subSec) { + try { + final int len = Math.min(subSec.length(), 3); + long sub = Long.parseLong(subSec.substring(0, len)); + for (int i = len; i < 3; i++) { + sub *= 10; + } + return sub; + } catch (NumberFormatException e) { + // Ignored + } + return 0L; + } + + + /** + * Closes 'closeable', ignoring any checked exceptions. Does nothing if 'closeable' is null. + */ + static void closeQuietly(Closeable closeable) { + if (closeable != null) { + try { + closeable.close(); + } catch (RuntimeException rethrown) { + throw rethrown; + } catch (Exception ignored) { + } + } + } + + /** + * Closes a file descriptor that has been duplicated. + */ + static void closeFileDescriptor(FileDescriptor fd) { + try { + Os.close(fd); + } catch (ErrnoException ex) { + Log.e(TAG, "Error closing fd.", ex); + } + } + + @RequiresApi(23) + static class Api23Impl { + private Api23Impl() { + } + + static void setDataSource(MediaMetadataRetriever retriever, MediaDataSource dataSource) { + retriever.setDataSource(dataSource); + } + } +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..4ce8645 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,10 @@ +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true + +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official + +# full mode is too aggressive and removes essential code +# of `metadata-extractor` even when adding `-keep class com.drew.**{ *; }` +android.enableR8.fullMode=false +kotlin.jvm.target.validation.mode=IGNORE diff --git a/android/gradle/gradle-daemon-jvm.properties b/android/gradle/gradle-daemon-jvm.properties new file mode 100644 index 0000000..85893df --- /dev/null +++ b/android/gradle/gradle-daemon-jvm.properties @@ -0,0 +1,13 @@ +#This file is generated by updateDaemonJvm +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ff1d4fc92bcfc9d3799beabb4e70cfa3/redirect +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/879378f84c64b2c76003b97a32968399/redirect +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ff1d4fc92bcfc9d3799beabb4e70cfa3/redirect +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/08ce182188ada0b93565cd9ca4a4ab32/redirect +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/021e528cbed860c875a9016f29ee13c1/redirect +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/ee5178090598fb4291558827b9f00e0d/redirect +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ff1d4fc92bcfc9d3799beabb4e70cfa3/redirect +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/08ce182188ada0b93565cd9ca4a4ab32/redirect +toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/22860963aebba7217b72b98c4f9a5cfb/redirect +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/cd15c9dc71cc4176d084ef04cfa97a5e/redirect +toolchainVendor=JETBRAINS +toolchainVersion=21 diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml new file mode 100644 index 0000000..a4a6ba4 --- /dev/null +++ b/android/gradle/libs.versions.toml @@ -0,0 +1,64 @@ +[versions] +androidDesugarJdkLibs = "2.1.5" +# AGP and tools should be updated together +androidGradlePlugin = "8.13.2" +androidSvg = "c7e58e8e59" +androidxAnnotation = "1.9.1" +androidxAppcompat = "1.7.1" +androidxCoreKtx = "1.17.0" +androidxLifecycle = "2.10.0" +androidxMedia = "1.7.1" +androidxMultidex = "2.0.1" +androidxSecurity = "1.1.0" +androidxWork = "2.11.1" +commonswareCwac = "0.5.0" +firebase = "3.0.6" +glide = "5.0.5" +gms = "4.4.4" +jspecify = "1.0.0" +junit = "6.0.3" +kotlin = "2.3.0" +kotlinxCoroutines = "1.10.2" +ksp = "2.3.5" +material = "1.13.0" +metadataExtractor = "2.19.0" +mp4parser = "c2898f1832" +pixymeta = "f4513291b7" +slf4j = "2.0.17" +tiffBitmapFactory = "424b18a4ae" +reproducibleBuilds = "1.1" + +[libraries] +android-desugarJdkLibs = { module = "com.android.tools:desugar_jdk_libs", version.ref = "androidDesugarJdkLibs" } +androidx-annotation = { module = "androidx.annotation:annotation", version.ref = "androidxAnnotation" } +androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "androidxAppcompat" } +androidx-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "androidxCoreKtx" } +androidx-lifecycle = { module = "androidx.lifecycle:lifecycle-process", version.ref = "androidxLifecycle" } +androidx-media = { module = "androidx.media:media", version.ref = "androidxMedia" } +androidx-multidex = { module = "androidx.multidex:multidex", version.ref = "androidxMultidex" } +androidx-security-crypto = { module = "androidx.security:security-crypto", version.ref = "androidxSecurity" } +androidx-work-runtime = { module = "androidx.work:work-runtime", version.ref = "androidxWork" } +commonsware-cwac = { module = "com.commonsware.cwac:document", version.ref = "commonswareCwac" } +deckerst-androidsvg = { module = "com.github.deckerst:androidsvg", version.ref = "androidSvg" } +deckerst-mp4parser-isoparser = { module = "com.github.deckerst.mp4parser:isoparser", version.ref = "mp4parser" } +deckerst-mp4parser-muxer = { module = "com.github.deckerst.mp4parser:muxer", version.ref = "mp4parser" } +deckerst-pixymeta = { module = "com.github.deckerst:pixymeta-android", version.ref = "pixymeta" } +deckerst-tiffbitmapfactory = { module = "com.github.deckerst:Android-TiffBitmapFactory", version.ref = "tiffBitmapFactory" } +glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" } +glideKsp = { module = "com.github.bumptech.glide:ksp", version.ref = "glide" } +google-firebase-crashlytics = { module = "com.google.firebase:firebase-crashlytics-gradle", version.ref = "firebase" } +google-gms = { module = "com.google.gms:google-services", version.ref = "gms" } +google-material = { module = "com.google.android.material:material", version.ref = "material" } +gradle = { module = "com.android.tools.build:gradle", version.ref = "androidGradlePlugin" } +jspecify = { module = "org.jspecify:jspecify", version.ref = "jspecify" } +junit = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit" } +kotlin-gradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } +kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinxCoroutines" } +metadata-extractor = { module = "com.drewnoakes:metadata-extractor", version.ref = "metadataExtractor" } +slf4j = { module = "org.slf4j:slf4j-simple", version.ref = "slf4j" } + +[plugins] +android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } +android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" } +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } +reproducible-builds = { id = "org.gradlex.reproducible-builds", version.ref = "reproducibleBuilds" } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..41d01ac --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-all.zip diff --git a/android/gradle_log.txt b/android/gradle_log.txt new file mode 100644 index 0000000..42274df --- /dev/null +++ b/android/gradle_log.txt @@ -0,0 +1,1028 @@ +WARNING: A restricted method in java.lang.System has been called +WARNING: java.lang.System::load has been called by net.rubygrapefruit.platform.internal.NativeLibraryLoader in an unnamed module (file:/Users/fabio/.gradle/wrapper/dists/gradle-8.14.4-all/231zbbez8dqwqz4pvbcxtcw84/gradle-8.14.4/lib/native-platform-0.22-milestone-28.jar) +WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module +WARNING: Restricted methods will be blocked in a future release unless native access is enabled + +Initialized native services in: /Users/fabio/.gradle/native +Initialized jansi services in: /Users/fabio/.gradle/native +The client will now receive all logging from the daemon (pid: 27645). The daemon log file: /Users/fabio/.gradle/daemon/8.14.4/daemon-27645.out.log +Starting 4th build in daemon [uptime: 26 mins 42.7 secs, performance: 100%, GC rate: 0.00/s, heap usage: 0% of 8 GiB, non-heap usage: 8% of 4 GiB] +Using 4 worker leases. +Now considering [/Volumes/terrain/aves_mio54/android, /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle] as hierarchies to watch +Watching the file system is configured to be enabled if available +File system watching is active +Starting Build +Now considering [/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle, /Volumes/terrain/aves_mio54/android] as hierarchies to watch + +> Configure project :gradle +Evaluating project ':gradle' using build file '/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/build.gradle.kts'. +Resolved plugin [id: 'org.gradle.java-gradle-plugin'] +Resolved plugin [id: 'org.gradle.groovy'] +Resolved plugin [id: 'org.gradle.kotlin.kotlin-dsl', version: '5.2.0'] +Resolved plugin [id: 'org.jetbrains.kotlin.jvm', version: '1.9.20'] +Using Kotlin Gradle Plugin gradle85 variant +kotlin scripting plugin: created the scripting discovery configuration: kotlinScriptDef +kotlin scripting plugin: created the scripting discovery configuration: testKotlinScriptDef +file or directory '/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/java', not found +Resolved plugin [id: 'dev.flutter.flutter-plugin-loader', version: '1.0.0'] +Resolved plugin [id: 'org.gradle.toolchains.foojay-resolver-convention', version: '1.0.0'] +Resolved plugin [id: 'com.android.application', version: '8.13.2', apply: false] +Resolved plugin [id: 'org.jetbrains.kotlin.android', version: '2.3.0', apply: false] +Resolve mutations for :gradle:checkKotlinGradlePluginConfigurationErrors (Thread[#473,Execution worker,5,main]) started. +:gradle:checkKotlinGradlePluginConfigurationErrors (Thread[#473,Execution worker,5,main]) started. + +> Task :gradle:checkKotlinGradlePluginConfigurationErrors SKIPPED +Skipping task ':gradle:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +Resolve mutations for :gradle:compileKotlin (Thread[#473,Execution worker,5,main]) started. +:gradle:compileKotlin (Thread[#473,Execution worker,5,main]) started. + +> Task :gradle:compileKotlin UP-TO-DATE +Caching disabled for task ':gradle:compileKotlin' because: + Build cache is disabled +Skipping task ':gradle:compileKotlin' as it is up-to-date. +Resolve mutations for :gradle:compileJava (Thread[#473,Execution worker,5,main]) started. +:gradle:compileJava (Thread[#473,Execution worker,5,main]) started. + +> Task :gradle:compileJava NO-SOURCE +Skipping task ':gradle:compileJava' as it has no source files and no previous output files. +Resolve mutations for :gradle:compileGroovy (Thread[#473,Execution worker,5,main]) started. +:gradle:compileGroovy (Thread[#473,Execution worker,5,main]) started. + +> Task :gradle:compileGroovy NO-SOURCE +Skipping task ':gradle:compileGroovy' as it has no source files and no previous output files. +Resolve mutations for :gradle:pluginDescriptors (Thread[#473,Execution worker,5,main]) started. +:gradle:pluginDescriptors (Thread[#473,Execution worker,5,main]) started. + +> Task :gradle:pluginDescriptors UP-TO-DATE +Caching disabled for task ':gradle:pluginDescriptors' because: + Build cache is disabled + Not worth caching +Skipping task ':gradle:pluginDescriptors' as it is up-to-date. +Resolve mutations for :gradle:processResources (Thread[#473,Execution worker,5,main]) started. +:gradle:processResources (Thread[#473,Execution worker,5,main]) started. + +> Task :gradle:processResources UP-TO-DATE +Caching disabled for task ':gradle:processResources' because: + Build cache is disabled + Not worth caching +Skipping task ':gradle:processResources' as it is up-to-date. +Resolve mutations for :gradle:classes (Thread[#473,Execution worker,5,main]) started. +:gradle:classes (Thread[#473,Execution worker,5,main]) started. + +> Task :gradle:classes UP-TO-DATE +Skipping task ':gradle:classes' as it has no actions. +Resolve mutations for :gradle:jar (Thread[#473,Execution worker,5,main]) started. +:gradle:jar (Thread[#473,Execution worker,5,main]) started. + +> Task :gradle:jar UP-TO-DATE +Caching disabled for task ':gradle:jar' because: + Build cache is disabled + Not worth caching +Skipping task ':gradle:jar' as it is up-to-date. +Settings evaluated using settings file '/Volumes/terrain/aves_mio54/android/settings.gradle.kts'. +Projects loaded. Root project using build file '/Volumes/terrain/aves_mio54/android/build.gradle.kts'. +Included projects: [root project 'android', project ':app', project ':aves_screen_state', project ':connectivity_plus', project ':dchs_motion_sensors', project ':device_info_plus', project ':dynamic_color', project ':exifinterface', project ':firebase_core', project ':firebase_crashlytics', project ':floating', project ':flutter_displaymode', project ':flutter_plugin_android_lifecycle', project ':flutter_secure_storage', project ':google_api_availability_android', project ':google_cast', project ':google_maps_flutter_android', project ':jni', project ':jni_flutter', project ':local_auth_android', project ':media_kit_libs_android_video', project ':media_kit_video', project ':network_info_plus', project ':package_info_plus', project ':permission_handler_android', project ':printing', project ':screen_brightness_android', project ':shared_preferences_android', project ':sqflite_android', project ':streams_channel', project ':url_launcher_android', project ':video_player_android', project ':volume_controller', project ':wakelock_plus'] + +> Configure project :app +Evaluating project ':app' using build file '/Volumes/terrain/aves_mio54/android/app/build.gradle.kts'. +Resolved plugin [id: 'com.android.application', version: '8.13.2'] +Resolved plugin [id: 'com.google.devtools.ksp', version: '2.3.5'] +Resolved plugin [id: 'kotlin-android'] +Resolved plugin [id: 'dev.flutter.flutter-gradle-plugin'] +Using default execution profile +Build cc21c806-d799-4a68-9ad9-89778152098c is started +Using Kotlin Gradle Plugin gradle813 variant +Load keystore props from file=/Volumes/terrain/aves_mio54/android/key.properties +Create signing config for release using file=../keystore/release.jks +Building flavor with Crashlytics plugin +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +Application variant applicationId=deckers.thibault.aves.debug name=playDebug +Application variant applicationId=deckers.thibault.aves.debug name=izzyDebug +Application variant applicationId=deckers.thibault.aves.libre.debug name=libreDebug +Application variant applicationId=deckers.thibault.aves.libre.debug name=libre_romDebug +Application variant applicationId=deckers.thibault.aves name=playRelease +Application variant applicationId=deckers.thibault.aves name=izzyRelease +Application variant applicationId=deckers.thibault.aves.libre name=libreRelease +Application variant applicationId=deckers.thibault.aves.libre name=libre_romRelease +Application variant applicationId=deckers.thibault.aves name=playProfile +Application variant applicationId=deckers.thibault.aves name=izzyProfile +Application variant applicationId=deckers.thibault.aves.libre name=libreProfile +Application variant applicationId=deckers.thibault.aves.libre name=libre_romProfile + +> Configure project : +Evaluating root project 'android' using build file '/Volumes/terrain/aves_mio54/android/build.gradle.kts'. +Tasks=[assemblePlayDebug] +Extra= + android.enableR8.fullMode=false + android.useAndroidX=true + aves.useCrashlytics=true + kotlin.code.style=official + kotlin.jvm.target.validation.mode=IGNORE + org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +Resolved plugin [id: 'org.gradlex.reproducible-builds', version: '1.1'] + +> Configure project :aves_screen_state +Evaluating project ':aves_screen_state' using build file '/Volumes/terrain/aves_mio54/plugins/aves_screen_state/android/build.gradle.kts'. +Resolved plugin [id: 'com.android.library'] +Resolved plugin [id: 'kotlin-android'] +Using default execution profile +Using Kotlin Gradle Plugin gradle813 variant + +> Configure project :connectivity_plus +Evaluating project ':connectivity_plus' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/android/build.gradle'. +Using default execution profile + +> Configure project :dchs_motion_sensors +Evaluating project ':dchs_motion_sensors' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/android/build.gradle'. +Using default execution profile +Using Kotlin Gradle Plugin gradle813 variant + +> Configure project :device_info_plus +Evaluating project ':device_info_plus' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/android/build.gradle'. +Using default execution profile +Using Kotlin Gradle Plugin gradle813 variant + +> Configure project :dynamic_color +Evaluating project ':dynamic_color' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/android/build.gradle'. +Using default execution profile +Using Kotlin Gradle Plugin gradle813 variant + +> Configure project :exifinterface +Evaluating project ':exifinterface' using build file '/Volumes/terrain/aves_mio54/android/exifinterface/build.gradle.kts'. +Resolved plugin [id: 'com.android.library'] +Using default execution profile + +> Configure project :firebase_core +Evaluating project ':firebase_core' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/android/build.gradle'. +Using default execution profile + +> Configure project :firebase_crashlytics +Evaluating project ':firebase_crashlytics' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/firebase_crashlytics-5.2.0/android/build.gradle'. +Using default execution profile + +> Configure project :floating +Evaluating project ':floating' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/floating-6.0.0/android/build.gradle'. +Using default execution profile +Using Kotlin Gradle Plugin gradle813 variant + +> Configure project :flutter_displaymode +Evaluating project ':flutter_displaymode' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_displaymode-0.7.0/android/build.gradle'. +Resolved plugin [id: 'com.android.library'] +Using default execution profile + +> Configure project :flutter_plugin_android_lifecycle +Evaluating project ':flutter_plugin_android_lifecycle' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.34/android/build.gradle.kts'. +Resolved plugin [id: 'com.android.library'] +Using default execution profile + +> Configure project :flutter_secure_storage +Evaluating project ':flutter_secure_storage' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/android/build.gradle'. +Using default execution profile + +> Configure project :google_api_availability_android +Evaluating project ':google_api_availability_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability_android-1.1.1/android/build.gradle'. +Using default execution profile + +> Configure project :google_cast +Evaluating project ':google_cast' using build file '/Volumes/terrain/aves_mio54/plugins/google_cast/android/build.gradle'. +Using default execution profile + +> Configure project :google_maps_flutter_android +Evaluating project ':google_maps_flutter_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_android-2.19.8/android/build.gradle.kts'. +Resolved plugin [id: 'com.android.library'] +Resolved plugin [id: 'kotlin-android'] +Using default execution profile +Using Kotlin Gradle Plugin gradle813 variant + +> Configure project :jni +Evaluating project ':jni' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/jni-1.0.0/android/build.gradle'. +Using default execution profile +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +C/C++: android.ndkPath from module build.gradle is not set +C/C++: ndk.dir in local.properties is not set +C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +C/C++: sdkFolder is /Users/fabio/Library/Android/sdk + +> Configure project :jni_flutter +Evaluating project ':jni_flutter' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/android/build.gradle'. +Using default execution profile + +> Configure project :local_auth_android +Evaluating project ':local_auth_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/local_auth_android-2.0.8/android/build.gradle.kts'. +Resolved plugin [id: 'com.android.library'] +Resolved plugin [id: 'kotlin-android'] +Using default execution profile +Using Kotlin Gradle Plugin gradle813 variant + +> Configure project :media_kit_libs_android_video +Evaluating project ':media_kit_libs_android_video' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8/android/build.gradle'. +Using default execution profile + +> Configure project :media_kit_video +Evaluating project ':media_kit_video' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/android/build.gradle'. +Using default execution profile + +> Configure project :network_info_plus +Evaluating project ':network_info_plus' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/android/build.gradle'. +Using default execution profile +Using Kotlin Gradle Plugin gradle813 variant + +> Configure project :package_info_plus +Evaluating project ':package_info_plus' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/android/build.gradle'. +Using default execution profile +Using Kotlin Gradle Plugin gradle813 variant + +> Configure project :permission_handler_android +Evaluating project ':permission_handler_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_android-13.0.1/android/build.gradle'. +Using default execution profile + +> Configure project :printing +Evaluating project ':printing' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/android/build.gradle'. +Using default execution profile + +> Configure project :screen_brightness_android +Evaluating project ':screen_brightness_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/android/build.gradle'. +Using default execution profile +Using Kotlin Gradle Plugin gradle813 variant + +> Configure project :shared_preferences_android +Evaluating project ':shared_preferences_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.18/android/build.gradle'. +Using default execution profile +Using Kotlin Gradle Plugin gradle813 variant + +> Configure project :sqflite_android +Evaluating project ':sqflite_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+2/android/build.gradle'. +Using default execution profile + +> Configure project :streams_channel +Evaluating project ':streams_channel' using build file '/Users/fabio/.pub-cache/git/aves_streams_channel-35a9b0fcc0e97f756756c0010fb223129c2d832c/android/build.gradle'. +Using default execution profile + +> Configure project :url_launcher_android +Evaluating project ':url_launcher_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.29/android/build.gradle.kts'. +Resolved plugin [id: 'com.android.library'] +Using default execution profile + +> Configure project :video_player_android +Evaluating project ':video_player_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/video_player_android-2.9.5/android/build.gradle.kts'. +Resolved plugin [id: 'com.android.library'] +Resolved plugin [id: 'kotlin-android'] +Using default execution profile +Using Kotlin Gradle Plugin gradle813 variant + +> Configure project :volume_controller +Evaluating project ':volume_controller' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/android/build.gradle'. +Using default execution profile +Using Kotlin Gradle Plugin gradle813 variant + +> Configure project :wakelock_plus +Evaluating project ':wakelock_plus' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/android/build.gradle'. +Using default execution profile +Using Kotlin Gradle Plugin gradle813 variant +All projects evaluated. +Task name matched 'assemblePlayDebug' +Selected primary task 'assemblePlayDebug' from project : +Starting process 'command '/usr/libexec/java_home''. Working directory: /Users/fabio/.gradle/daemon/8.14.4 Command: /usr/libexec/java_home -V +Successfully started process 'command '/usr/libexec/java_home'' +Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :app:compilePlayDebugKotlin +Tasks to be executed: [task ':app:PlayDebugMinSdkCheck', task ':app:preBuild', task ':app:prePlayDebugBuild', task ':app:mergePlayDebugNativeDebugMetadata', task ':app:checkKotlinGradlePluginConfigurationErrors', task ':app:compileFlutterBuildPlayDebug', task ':app:packJniLibsflutterBuildPlayDebug', task ':aves_screen_state:preBuild', task ':aves_screen_state:preDebugBuild', task ':aves_screen_state:writeDebugAarMetadata', task ':connectivity_plus:preBuild', task ':connectivity_plus:preDebugBuild', task ':connectivity_plus:writeDebugAarMetadata', task ':dchs_motion_sensors:preBuild', task ':dchs_motion_sensors:preDebugBuild', task ':dchs_motion_sensors:writeDebugAarMetadata', task ':device_info_plus:preBuild', task ':device_info_plus:preDebugBuild', task ':device_info_plus:writeDebugAarMetadata', task ':dynamic_color:preBuild', task ':dynamic_color:preDebugBuild', task ':dynamic_color:writeDebugAarMetadata', task ':exifinterface:preBuild', task ':exifinterface:preDebugBuild', task ':exifinterface:writeDebugAarMetadata', task ':firebase_core:preBuild', task ':firebase_core:preDebugBuild', task ':firebase_core:writeDebugAarMetadata', task ':firebase_crashlytics:preBuild', task ':firebase_crashlytics:preDebugBuild', task ':firebase_crashlytics:writeDebugAarMetadata', task ':floating:preBuild', task ':floating:preDebugBuild', task ':floating:writeDebugAarMetadata', task ':flutter_displaymode:preBuild', task ':flutter_displaymode:preDebugBuild', task ':flutter_displaymode:writeDebugAarMetadata', task ':flutter_plugin_android_lifecycle:preBuild', task ':flutter_plugin_android_lifecycle:preDebugBuild', task ':flutter_plugin_android_lifecycle:writeDebugAarMetadata', task ':flutter_secure_storage:preBuild', task ':flutter_secure_storage:preDebugBuild', task ':flutter_secure_storage:writeDebugAarMetadata', task ':google_api_availability_android:preBuild', task ':google_api_availability_android:preDebugBuild', task ':google_api_availability_android:writeDebugAarMetadata', task ':google_cast:preBuild', task ':google_cast:preDebugBuild', task ':google_cast:writeDebugAarMetadata', task ':google_maps_flutter_android:preBuild', task ':google_maps_flutter_android:preDebugBuild', task ':google_maps_flutter_android:writeDebugAarMetadata', task ':jni:preBuild', task ':jni:preDebugBuild', task ':jni:writeDebugAarMetadata', task ':jni_flutter:preBuild', task ':jni_flutter:preDebugBuild', task ':jni_flutter:writeDebugAarMetadata', task ':local_auth_android:preBuild', task ':local_auth_android:preDebugBuild', task ':local_auth_android:writeDebugAarMetadata', task ':media_kit_libs_android_video:preBuild', task ':media_kit_libs_android_video:preDebugBuild', task ':media_kit_libs_android_video:writeDebugAarMetadata', task ':media_kit_video:preBuild', task ':media_kit_video:preDebugBuild', task ':media_kit_video:writeDebugAarMetadata', task ':network_info_plus:preBuild', task ':network_info_plus:preDebugBuild', task ':network_info_plus:writeDebugAarMetadata', task ':package_info_plus:preBuild', task ':package_info_plus:preDebugBuild', task ':package_info_plus:writeDebugAarMetadata', task ':permission_handler_android:preBuild', task ':permission_handler_android:preDebugBuild', task ':permission_handler_android:writeDebugAarMetadata', task ':printing:preBuild', task ':printing:preDebugBuild', task ':printing:writeDebugAarMetadata', task ':screen_brightness_android:preBuild', task ':screen_brightness_android:preDebugBuild', task ':screen_brightness_android:writeDebugAarMetadata', task ':shared_preferences_android:preBuild', task ':shared_preferences_android:preDebugBuild', task ':shared_preferences_android:writeDebugAarMetadata', task ':sqflite_android:preBuild', task ':sqflite_android:preDebugBuild', task ':sqflite_android:writeDebugAarMetadata', task ':streams_channel:preBuild', task ':streams_channel:preDebugBuild', task ':streams_channel:writeDebugAarMetadata', task ':url_launcher_android:preBuild', task ':url_launcher_android:preDebugBuild', task ':url_launcher_android:writeDebugAarMetadata', task ':video_player_android:preBuild', task ':video_player_android:preDebugBuild', task ':video_player_android:writeDebugAarMetadata', task ':volume_controller:preBuild', task ':volume_controller:preDebugBuild', task ':volume_controller:writeDebugAarMetadata', task ':wakelock_plus:preBuild', task ':wakelock_plus:preDebugBuild', task ':wakelock_plus:writeDebugAarMetadata', task ':app:checkPlayDebugAarMetadata', task ':aves_screen_state:processDebugNavigationResources', task ':connectivity_plus:processDebugNavigationResources', task ':dchs_motion_sensors:processDebugNavigationResources', task ':device_info_plus:processDebugNavigationResources', task ':dynamic_color:processDebugNavigationResources', task ':exifinterface:processDebugNavigationResources', task ':firebase_core:processDebugNavigationResources', task ':firebase_crashlytics:processDebugNavigationResources', task ':floating:processDebugNavigationResources', task ':flutter_displaymode:processDebugNavigationResources', task ':flutter_plugin_android_lifecycle:processDebugNavigationResources', task ':flutter_secure_storage:processDebugNavigationResources', task ':google_api_availability_android:processDebugNavigationResources', task ':google_cast:processDebugNavigationResources', task ':google_maps_flutter_android:processDebugNavigationResources', task ':jni:processDebugNavigationResources', task ':jni_flutter:processDebugNavigationResources', task ':local_auth_android:processDebugNavigationResources', task ':media_kit_libs_android_video:processDebugNavigationResources', task ':media_kit_video:processDebugNavigationResources', task ':network_info_plus:processDebugNavigationResources', task ':package_info_plus:processDebugNavigationResources', task ':permission_handler_android:processDebugNavigationResources', task ':printing:processDebugNavigationResources', task ':screen_brightness_android:processDebugNavigationResources', task ':shared_preferences_android:processDebugNavigationResources', task ':sqflite_android:processDebugNavigationResources', task ':streams_channel:processDebugNavigationResources', task ':url_launcher_android:processDebugNavigationResources', task ':video_player_android:processDebugNavigationResources', task ':volume_controller:processDebugNavigationResources', task ':wakelock_plus:processDebugNavigationResources', task ':app:processPlayDebugNavigationResources', task ':app:compilePlayDebugNavigationResources', task ':app:cleanMergePlayDebugAssets', task ':app:mergePlayDebugShaders', task ':app:compilePlayDebugShaders', task ':app:generatePlayDebugAssets', task ':aves_screen_state:mergeDebugShaders', task ':aves_screen_state:compileDebugShaders', task ':aves_screen_state:generateDebugAssets', task ':aves_screen_state:mergeDebugAssets', task ':connectivity_plus:mergeDebugShaders', task ':connectivity_plus:compileDebugShaders', task ':connectivity_plus:generateDebugAssets', task ':connectivity_plus:mergeDebugAssets', task ':dchs_motion_sensors:mergeDebugShaders', task ':dchs_motion_sensors:compileDebugShaders', task ':dchs_motion_sensors:generateDebugAssets', task ':dchs_motion_sensors:mergeDebugAssets', task ':device_info_plus:mergeDebugShaders', task ':device_info_plus:compileDebugShaders', task ':device_info_plus:generateDebugAssets', task ':device_info_plus:mergeDebugAssets', task ':dynamic_color:mergeDebugShaders', task ':dynamic_color:compileDebugShaders', task ':dynamic_color:generateDebugAssets', task ':dynamic_color:mergeDebugAssets', task ':exifinterface:mergeDebugShaders', task ':exifinterface:compileDebugShaders', task ':exifinterface:generateDebugAssets', task ':exifinterface:mergeDebugAssets', task ':firebase_core:mergeDebugShaders', task ':firebase_core:compileDebugShaders', task ':firebase_core:generateDebugAssets', task ':firebase_core:mergeDebugAssets', task ':firebase_crashlytics:mergeDebugShaders', task ':firebase_crashlytics:compileDebugShaders', task ':firebase_crashlytics:generateDebugAssets', task ':firebase_crashlytics:mergeDebugAssets', task ':floating:mergeDebugShaders', task ':floating:compileDebugShaders', task ':floating:generateDebugAssets', task ':floating:mergeDebugAssets', task ':flutter_displaymode:mergeDebugShaders', task ':flutter_displaymode:compileDebugShaders', task ':flutter_displaymode:generateDebugAssets', task ':flutter_displaymode:mergeDebugAssets', task ':flutter_plugin_android_lifecycle:mergeDebugShaders', task ':flutter_plugin_android_lifecycle:compileDebugShaders', task ':flutter_plugin_android_lifecycle:generateDebugAssets', task ':flutter_plugin_android_lifecycle:mergeDebugAssets', task ':flutter_secure_storage:mergeDebugShaders', task ':flutter_secure_storage:compileDebugShaders', task ':flutter_secure_storage:generateDebugAssets', task ':flutter_secure_storage:mergeDebugAssets', task ':google_api_availability_android:mergeDebugShaders', task ':google_api_availability_android:compileDebugShaders', task ':google_api_availability_android:generateDebugAssets', task ':google_api_availability_android:mergeDebugAssets', task ':google_cast:mergeDebugShaders', task ':google_cast:compileDebugShaders', task ':google_cast:generateDebugAssets', task ':google_cast:mergeDebugAssets', task ':google_maps_flutter_android:mergeDebugShaders', task ':google_maps_flutter_android:compileDebugShaders', task ':google_maps_flutter_android:generateDebugAssets', task ':google_maps_flutter_android:mergeDebugAssets', task ':jni:mergeDebugShaders', task ':jni:compileDebugShaders', task ':jni:generateDebugAssets', task ':jni:mergeDebugAssets', task ':jni_flutter:mergeDebugShaders', task ':jni_flutter:compileDebugShaders', task ':jni_flutter:generateDebugAssets', task ':jni_flutter:mergeDebugAssets', task ':local_auth_android:mergeDebugShaders', task ':local_auth_android:compileDebugShaders', task ':local_auth_android:generateDebugAssets', task ':local_auth_android:mergeDebugAssets', task ':media_kit_libs_android_video:mergeDebugShaders', task ':media_kit_libs_android_video:compileDebugShaders', task ':media_kit_libs_android_video:generateDebugAssets', task ':media_kit_libs_android_video:mergeDebugAssets', task ':media_kit_video:mergeDebugShaders', task ':media_kit_video:compileDebugShaders', task ':media_kit_video:generateDebugAssets', task ':media_kit_video:mergeDebugAssets', task ':network_info_plus:mergeDebugShaders', task ':network_info_plus:compileDebugShaders', task ':network_info_plus:generateDebugAssets', task ':network_info_plus:mergeDebugAssets', task ':package_info_plus:mergeDebugShaders', task ':package_info_plus:compileDebugShaders', task ':package_info_plus:generateDebugAssets', task ':package_info_plus:mergeDebugAssets', task ':permission_handler_android:mergeDebugShaders', task ':permission_handler_android:compileDebugShaders', task ':permission_handler_android:generateDebugAssets', task ':permission_handler_android:mergeDebugAssets', task ':printing:mergeDebugShaders', task ':printing:compileDebugShaders', task ':printing:generateDebugAssets', task ':printing:mergeDebugAssets', task ':screen_brightness_android:mergeDebugShaders', task ':screen_brightness_android:compileDebugShaders', task ':screen_brightness_android:generateDebugAssets', task ':screen_brightness_android:mergeDebugAssets', task ':shared_preferences_android:mergeDebugShaders', task ':shared_preferences_android:compileDebugShaders', task ':shared_preferences_android:generateDebugAssets', task ':shared_preferences_android:mergeDebugAssets', task ':sqflite_android:mergeDebugShaders', task ':sqflite_android:compileDebugShaders', task ':sqflite_android:generateDebugAssets', task ':sqflite_android:mergeDebugAssets', task ':streams_channel:mergeDebugShaders', task ':streams_channel:compileDebugShaders', task ':streams_channel:generateDebugAssets', task ':streams_channel:mergeDebugAssets', task ':url_launcher_android:mergeDebugShaders', task ':url_launcher_android:compileDebugShaders', task ':url_launcher_android:generateDebugAssets', task ':url_launcher_android:mergeDebugAssets', task ':video_player_android:mergeDebugShaders', task ':video_player_android:compileDebugShaders', task ':video_player_android:generateDebugAssets', task ':video_player_android:mergeDebugAssets', task ':volume_controller:mergeDebugShaders', task ':volume_controller:compileDebugShaders', task ':volume_controller:generateDebugAssets', task ':volume_controller:mergeDebugAssets', task ':wakelock_plus:mergeDebugShaders', task ':wakelock_plus:compileDebugShaders', task ':wakelock_plus:generateDebugAssets', task ':wakelock_plus:mergeDebugAssets', task ':app:mergePlayDebugAssets', task ':app:copyFlutterAssetsPlayDebug', task ':app:generatePlayDebugResValues', task ':app:injectCrashlyticsMappingFileIdPlayDebug', task ':app:injectCrashlyticsVersionControlInfoPlayDebug', task ':app:processPlayDebugGoogleServices', task ':aves_screen_state:generateDebugResValues', task ':aves_screen_state:generateDebugResources', task ':aves_screen_state:packageDebugResources', task ':connectivity_plus:generateDebugResValues', task ':connectivity_plus:generateDebugResources', task ':connectivity_plus:packageDebugResources', task ':dchs_motion_sensors:generateDebugResValues', task ':dchs_motion_sensors:generateDebugResources', task ':dchs_motion_sensors:packageDebugResources', task ':device_info_plus:generateDebugResValues', task ':device_info_plus:generateDebugResources', task ':device_info_plus:packageDebugResources', task ':dynamic_color:generateDebugResValues', task ':dynamic_color:generateDebugResources', task ':dynamic_color:packageDebugResources', task ':exifinterface:generateDebugResValues', task ':exifinterface:generateDebugResources', task ':exifinterface:packageDebugResources', task ':firebase_core:generateDebugResValues', task ':firebase_core:generateDebugResources', task ':firebase_core:packageDebugResources', task ':firebase_crashlytics:generateDebugResValues', task ':firebase_crashlytics:generateDebugResources', task ':firebase_crashlytics:packageDebugResources', task ':floating:generateDebugResValues', task ':floating:generateDebugResources', task ':floating:packageDebugResources', task ':flutter_displaymode:generateDebugResValues', task ':flutter_displaymode:generateDebugResources', task ':flutter_displaymode:packageDebugResources', task ':flutter_plugin_android_lifecycle:generateDebugResValues', task ':flutter_plugin_android_lifecycle:generateDebugResources', task ':flutter_plugin_android_lifecycle:packageDebugResources', task ':flutter_secure_storage:generateDebugResValues', task ':flutter_secure_storage:generateDebugResources', task ':flutter_secure_storage:packageDebugResources', task ':google_api_availability_android:generateDebugResValues', task ':google_api_availability_android:generateDebugResources', task ':google_api_availability_android:packageDebugResources', task ':google_cast:generateDebugResValues', task ':google_cast:generateDebugResources', task ':google_cast:packageDebugResources', task ':google_maps_flutter_android:generateDebugResValues', task ':google_maps_flutter_android:generateDebugResources', task ':google_maps_flutter_android:packageDebugResources', task ':jni:generateDebugResValues', task ':jni:generateDebugResources', task ':jni:packageDebugResources', task ':jni_flutter:generateDebugResValues', task ':jni_flutter:generateDebugResources', task ':jni_flutter:packageDebugResources', task ':local_auth_android:generateDebugResValues', task ':local_auth_android:generateDebugResources', task ':local_auth_android:packageDebugResources', task ':media_kit_libs_android_video:generateDebugResValues', task ':media_kit_libs_android_video:generateDebugResources', task ':media_kit_libs_android_video:packageDebugResources', task ':media_kit_video:generateDebugResValues', task ':media_kit_video:generateDebugResources', task ':media_kit_video:packageDebugResources', task ':network_info_plus:generateDebugResValues', task ':network_info_plus:generateDebugResources', task ':network_info_plus:packageDebugResources', task ':package_info_plus:generateDebugResValues', task ':package_info_plus:generateDebugResources', task ':package_info_plus:packageDebugResources', task ':permission_handler_android:generateDebugResValues', task ':permission_handler_android:generateDebugResources', task ':permission_handler_android:packageDebugResources', task ':printing:generateDebugResValues', task ':printing:generateDebugResources', task ':printing:packageDebugResources', task ':screen_brightness_android:generateDebugResValues', task ':screen_brightness_android:generateDebugResources', task ':screen_brightness_android:packageDebugResources', task ':shared_preferences_android:generateDebugResValues', task ':shared_preferences_android:generateDebugResources', task ':shared_preferences_android:packageDebugResources', task ':sqflite_android:generateDebugResValues', task ':sqflite_android:generateDebugResources', task ':sqflite_android:packageDebugResources', task ':streams_channel:generateDebugResValues', task ':streams_channel:generateDebugResources', task ':streams_channel:packageDebugResources', task ':url_launcher_android:generateDebugResValues', task ':url_launcher_android:generateDebugResources', task ':url_launcher_android:packageDebugResources', task ':video_player_android:generateDebugResValues', task ':video_player_android:generateDebugResources', task ':video_player_android:packageDebugResources', task ':volume_controller:generateDebugResValues', task ':volume_controller:generateDebugResources', task ':volume_controller:packageDebugResources', task ':wakelock_plus:generateDebugResValues', task ':wakelock_plus:generateDebugResources', task ':wakelock_plus:packageDebugResources', task ':app:mapPlayDebugSourceSetPaths', task ':app:generatePlayDebugResources', task ':app:mergePlayDebugResources', task ':app:packagePlayDebugResources', task ':app:parsePlayDebugLocalResources', task ':app:createPlayDebugCompatibleScreenManifests', task ':app:extractDeepLinksPlayDebug', task ':aves_screen_state:extractDeepLinksDebug', task ':aves_screen_state:processDebugManifest', task ':connectivity_plus:extractDeepLinksDebug', task ':connectivity_plus:processDebugManifest', task ':dchs_motion_sensors:extractDeepLinksDebug', task ':dchs_motion_sensors:processDebugManifest', task ':device_info_plus:extractDeepLinksDebug', task ':device_info_plus:processDebugManifest', task ':dynamic_color:extractDeepLinksDebug', task ':dynamic_color:processDebugManifest', task ':exifinterface:extractDeepLinksDebug', task ':exifinterface:processDebugManifest', task ':firebase_core:extractDeepLinksDebug', task ':firebase_core:processDebugManifest', task ':firebase_crashlytics:extractDeepLinksDebug', task ':firebase_crashlytics:processDebugManifest', task ':floating:extractDeepLinksDebug', task ':floating:processDebugManifest', task ':flutter_displaymode:extractDeepLinksDebug', task ':flutter_displaymode:processDebugManifest', task ':flutter_plugin_android_lifecycle:extractDeepLinksDebug', task ':flutter_plugin_android_lifecycle:processDebugManifest', task ':flutter_secure_storage:extractDeepLinksDebug', task ':flutter_secure_storage:processDebugManifest', task ':google_api_availability_android:extractDeepLinksDebug', task ':google_api_availability_android:processDebugManifest', task ':google_cast:extractDeepLinksDebug', task ':google_cast:processDebugManifest', task ':google_maps_flutter_android:extractDeepLinksDebug', task ':google_maps_flutter_android:processDebugManifest', task ':jni:extractDeepLinksDebug', task ':jni:processDebugManifest', task ':jni_flutter:extractDeepLinksDebug', task ':jni_flutter:processDebugManifest', task ':local_auth_android:extractDeepLinksDebug', task ':local_auth_android:processDebugManifest', task ':media_kit_libs_android_video:extractDeepLinksDebug', task ':media_kit_libs_android_video:processDebugManifest', task ':media_kit_video:extractDeepLinksDebug', task ':media_kit_video:processDebugManifest', task ':network_info_plus:extractDeepLinksDebug', task ':network_info_plus:processDebugManifest', task ':package_info_plus:extractDeepLinksDebug', task ':package_info_plus:processDebugManifest', task ':permission_handler_android:extractDeepLinksDebug', task ':permission_handler_android:processDebugManifest', task ':printing:extractDeepLinksDebug', task ':printing:processDebugManifest', task ':screen_brightness_android:extractDeepLinksDebug', task ':screen_brightness_android:processDebugManifest', task ':shared_preferences_android:extractDeepLinksDebug', task ':shared_preferences_android:processDebugManifest', task ':sqflite_android:extractDeepLinksDebug', task ':sqflite_android:processDebugManifest', task ':streams_channel:extractDeepLinksDebug', task ':streams_channel:processDebugManifest', task ':url_launcher_android:extractDeepLinksDebug', task ':url_launcher_android:processDebugManifest', task ':video_player_android:extractDeepLinksDebug', task ':video_player_android:processDebugManifest', task ':volume_controller:extractDeepLinksDebug', task ':volume_controller:processDebugManifest', task ':wakelock_plus:extractDeepLinksDebug', task ':wakelock_plus:processDebugManifest', task ':app:processPlayDebugMainManifest', task ':app:processPlayDebugManifest', task ':app:processPlayDebugManifestForPackage', task ':aves_screen_state:compileDebugLibraryResources', task ':aves_screen_state:parseDebugLocalResources', task ':aves_screen_state:generateDebugRFile', task ':connectivity_plus:compileDebugLibraryResources', task ':connectivity_plus:parseDebugLocalResources', task ':connectivity_plus:generateDebugRFile', task ':dchs_motion_sensors:compileDebugLibraryResources', task ':dchs_motion_sensors:parseDebugLocalResources', task ':dchs_motion_sensors:generateDebugRFile', task ':device_info_plus:compileDebugLibraryResources', task ':device_info_plus:parseDebugLocalResources', task ':device_info_plus:generateDebugRFile', task ':dynamic_color:compileDebugLibraryResources', task ':dynamic_color:parseDebugLocalResources', task ':dynamic_color:generateDebugRFile', task ':exifinterface:compileDebugLibraryResources', task ':exifinterface:parseDebugLocalResources', task ':exifinterface:generateDebugRFile', task ':firebase_core:compileDebugLibraryResources', task ':firebase_core:parseDebugLocalResources', task ':firebase_core:generateDebugRFile', task ':firebase_crashlytics:compileDebugLibraryResources', task ':firebase_crashlytics:parseDebugLocalResources', task ':firebase_crashlytics:generateDebugRFile', task ':floating:compileDebugLibraryResources', task ':floating:parseDebugLocalResources', task ':floating:generateDebugRFile', task ':flutter_displaymode:compileDebugLibraryResources', task ':flutter_displaymode:parseDebugLocalResources', task ':flutter_displaymode:generateDebugRFile', task ':flutter_plugin_android_lifecycle:compileDebugLibraryResources', task ':flutter_plugin_android_lifecycle:parseDebugLocalResources', task ':flutter_plugin_android_lifecycle:generateDebugRFile', task ':flutter_secure_storage:compileDebugLibraryResources', task ':flutter_secure_storage:parseDebugLocalResources', task ':flutter_secure_storage:generateDebugRFile', task ':google_api_availability_android:compileDebugLibraryResources', task ':google_api_availability_android:parseDebugLocalResources', task ':google_api_availability_android:generateDebugRFile', task ':google_cast:compileDebugLibraryResources', task ':google_cast:parseDebugLocalResources', task ':google_cast:generateDebugRFile', task ':google_maps_flutter_android:compileDebugLibraryResources', task ':google_maps_flutter_android:parseDebugLocalResources', task ':google_maps_flutter_android:generateDebugRFile', task ':jni:compileDebugLibraryResources', task ':jni:parseDebugLocalResources', task ':jni:generateDebugRFile', task ':jni_flutter:compileDebugLibraryResources', task ':jni_flutter:parseDebugLocalResources', task ':jni_flutter:generateDebugRFile', task ':local_auth_android:compileDebugLibraryResources', task ':local_auth_android:parseDebugLocalResources', task ':local_auth_android:generateDebugRFile', task ':media_kit_libs_android_video:compileDebugLibraryResources', task ':media_kit_libs_android_video:parseDebugLocalResources', task ':media_kit_libs_android_video:generateDebugRFile', task ':media_kit_video:compileDebugLibraryResources', task ':media_kit_video:parseDebugLocalResources', task ':media_kit_video:generateDebugRFile', task ':network_info_plus:compileDebugLibraryResources', task ':network_info_plus:parseDebugLocalResources', task ':network_info_plus:generateDebugRFile', task ':package_info_plus:compileDebugLibraryResources', task ':package_info_plus:parseDebugLocalResources', task ':package_info_plus:generateDebugRFile', task ':permission_handler_android:compileDebugLibraryResources', task ':permission_handler_android:parseDebugLocalResources', task ':permission_handler_android:generateDebugRFile', task ':printing:compileDebugLibraryResources', task ':printing:parseDebugLocalResources', task ':printing:generateDebugRFile', task ':screen_brightness_android:compileDebugLibraryResources', task ':screen_brightness_android:parseDebugLocalResources', task ':screen_brightness_android:generateDebugRFile', task ':shared_preferences_android:compileDebugLibraryResources', task ':shared_preferences_android:parseDebugLocalResources', task ':shared_preferences_android:generateDebugRFile', task ':sqflite_android:compileDebugLibraryResources', task ':sqflite_android:parseDebugLocalResources', task ':sqflite_android:generateDebugRFile', task ':streams_channel:compileDebugLibraryResources', task ':streams_channel:parseDebugLocalResources', task ':streams_channel:generateDebugRFile', task ':url_launcher_android:compileDebugLibraryResources', task ':url_launcher_android:parseDebugLocalResources', task ':url_launcher_android:generateDebugRFile', task ':video_player_android:compileDebugLibraryResources', task ':video_player_android:parseDebugLocalResources', task ':video_player_android:generateDebugRFile', task ':volume_controller:compileDebugLibraryResources', task ':volume_controller:parseDebugLocalResources', task ':volume_controller:generateDebugRFile', task ':wakelock_plus:compileDebugLibraryResources', task ':wakelock_plus:parseDebugLocalResources', task ':wakelock_plus:generateDebugRFile', task ':app:processPlayDebugResources', task ':aves_screen_state:checkKotlinGradlePluginConfigurationErrors', task ':aves_screen_state:compileDebugKotlin', task ':aves_screen_state:javaPreCompileDebug', task ':aves_screen_state:compileDebugJavaWithJavac', task ':aves_screen_state:bundleLibCompileToJarDebug', task ':connectivity_plus:javaPreCompileDebug', task ':connectivity_plus:compileDebugJavaWithJavac', task ':connectivity_plus:bundleLibCompileToJarDebug', task ':dchs_motion_sensors:checkKotlinGradlePluginConfigurationErrors', task ':dchs_motion_sensors:compileDebugKotlin', task ':dchs_motion_sensors:javaPreCompileDebug', task ':dchs_motion_sensors:compileDebugJavaWithJavac', task ':dchs_motion_sensors:bundleLibCompileToJarDebug', task ':device_info_plus:checkKotlinGradlePluginConfigurationErrors', task ':device_info_plus:compileDebugKotlin', task ':device_info_plus:javaPreCompileDebug', task ':device_info_plus:compileDebugJavaWithJavac', task ':device_info_plus:bundleLibCompileToJarDebug', task ':dynamic_color:checkKotlinGradlePluginConfigurationErrors', task ':dynamic_color:compileDebugKotlin', task ':dynamic_color:javaPreCompileDebug', task ':dynamic_color:compileDebugJavaWithJavac', task ':dynamic_color:bundleLibCompileToJarDebug', task ':exifinterface:javaPreCompileDebug', task ':exifinterface:compileDebugJavaWithJavac', task ':exifinterface:bundleLibCompileToJarDebug', task ':firebase_core:generateDebugBuildConfig', task ':firebase_core:javaPreCompileDebug', task ':firebase_core:compileDebugJavaWithJavac', task ':firebase_core:bundleLibCompileToJarDebug', task ':firebase_crashlytics:generateDebugBuildConfig', task ':firebase_crashlytics:javaPreCompileDebug', task ':firebase_crashlytics:compileDebugJavaWithJavac', task ':firebase_crashlytics:bundleLibCompileToJarDebug', task ':floating:checkKotlinGradlePluginConfigurationErrors', task ':floating:compileDebugKotlin', task ':floating:javaPreCompileDebug', task ':floating:compileDebugJavaWithJavac', task ':floating:bundleLibCompileToJarDebug', task ':flutter_displaymode:javaPreCompileDebug', task ':flutter_displaymode:compileDebugJavaWithJavac', task ':flutter_displaymode:bundleLibCompileToJarDebug', task ':flutter_plugin_android_lifecycle:javaPreCompileDebug', task ':flutter_plugin_android_lifecycle:compileDebugJavaWithJavac', task ':flutter_plugin_android_lifecycle:bundleLibCompileToJarDebug', task ':flutter_secure_storage:generateDebugBuildConfig', task ':flutter_secure_storage:javaPreCompileDebug', task ':flutter_secure_storage:compileDebugJavaWithJavac', task ':flutter_secure_storage:bundleLibCompileToJarDebug', task ':google_api_availability_android:javaPreCompileDebug', task ':google_api_availability_android:compileDebugJavaWithJavac', task ':google_api_availability_android:bundleLibCompileToJarDebug', task ':google_cast:javaPreCompileDebug', task ':google_cast:compileDebugJavaWithJavac', task ':google_cast:bundleLibCompileToJarDebug', task ':google_maps_flutter_android:checkKotlinGradlePluginConfigurationErrors', task ':google_maps_flutter_android:compileDebugKotlin', task ':google_maps_flutter_android:javaPreCompileDebug', task ':google_maps_flutter_android:compileDebugJavaWithJavac', task ':google_maps_flutter_android:bundleLibCompileToJarDebug', task ':jni:javaPreCompileDebug', task ':jni:compileDebugJavaWithJavac', task ':jni:bundleLibCompileToJarDebug', task ':jni_flutter:javaPreCompileDebug', task ':jni_flutter:compileDebugJavaWithJavac', task ':jni_flutter:bundleLibCompileToJarDebug', task ':local_auth_android:checkKotlinGradlePluginConfigurationErrors', task ':local_auth_android:compileDebugKotlin', task ':local_auth_android:javaPreCompileDebug', task ':local_auth_android:compileDebugJavaWithJavac', task ':local_auth_android:bundleLibCompileToJarDebug', task ':media_kit_libs_android_video:javaPreCompileDebug', task ':media_kit_libs_android_video:compileDebugJavaWithJavac', task ':media_kit_libs_android_video:bundleLibCompileToJarDebug', task ':media_kit_video:javaPreCompileDebug', task ':package_info_plus:checkKotlinGradlePluginConfigurationErrors', task ':package_info_plus:compileDebugKotlin', task ':package_info_plus:javaPreCompileDebug', task ':package_info_plus:compileDebugJavaWithJavac', task ':package_info_plus:bundleLibCompileToJarDebug', task ':wakelock_plus:checkKotlinGradlePluginConfigurationErrors', task ':wakelock_plus:compileDebugKotlin', task ':wakelock_plus:javaPreCompileDebug', task ':wakelock_plus:compileDebugJavaWithJavac', task ':wakelock_plus:bundleLibCompileToJarDebug', task ':media_kit_video:compileDebugJavaWithJavac', task ':media_kit_video:bundleLibCompileToJarDebug', task ':network_info_plus:checkKotlinGradlePluginConfigurationErrors', task ':network_info_plus:compileDebugKotlin', task ':network_info_plus:javaPreCompileDebug', task ':network_info_plus:compileDebugJavaWithJavac', task ':network_info_plus:bundleLibCompileToJarDebug', task ':permission_handler_android:javaPreCompileDebug', task ':permission_handler_android:compileDebugJavaWithJavac', task ':permission_handler_android:bundleLibCompileToJarDebug', task ':printing:javaPreCompileDebug', task ':printing:compileDebugJavaWithJavac', task ':printing:bundleLibCompileToJarDebug', task ':screen_brightness_android:checkKotlinGradlePluginConfigurationErrors', task ':screen_brightness_android:compileDebugKotlin', task ':screen_brightness_android:javaPreCompileDebug', task ':screen_brightness_android:compileDebugJavaWithJavac', task ':screen_brightness_android:bundleLibCompileToJarDebug', task ':shared_preferences_android:checkKotlinGradlePluginConfigurationErrors', task ':shared_preferences_android:compileDebugKotlin', task ':shared_preferences_android:javaPreCompileDebug', task ':shared_preferences_android:compileDebugJavaWithJavac', task ':shared_preferences_android:bundleLibCompileToJarDebug', task ':sqflite_android:javaPreCompileDebug', task ':sqflite_android:compileDebugJavaWithJavac', task ':sqflite_android:bundleLibCompileToJarDebug', task ':streams_channel:javaPreCompileDebug', task ':streams_channel:compileDebugJavaWithJavac', task ':streams_channel:bundleLibCompileToJarDebug', task ':url_launcher_android:generateDebugBuildConfig', task ':url_launcher_android:javaPreCompileDebug', task ':url_launcher_android:compileDebugJavaWithJavac', task ':url_launcher_android:bundleLibCompileToJarDebug', task ':video_player_android:checkKotlinGradlePluginConfigurationErrors', task ':video_player_android:compileDebugKotlin', task ':video_player_android:javaPreCompileDebug', task ':video_player_android:compileDebugJavaWithJavac', task ':video_player_android:bundleLibCompileToJarDebug', task ':volume_controller:checkKotlinGradlePluginConfigurationErrors', task ':volume_controller:compileDebugKotlin', task ':volume_controller:javaPreCompileDebug', task ':volume_controller:compileDebugJavaWithJavac', task ':volume_controller:bundleLibCompileToJarDebug', task ':app:kspPlayDebugKotlin', task ':app:compilePlayDebugKotlin', task ':app:javaPreCompilePlayDebug', task ':app:compilePlayDebugJavaWithJavac', task ':app:compressPlayDebugAssets', task ':app:l8DexDesugarLibPlayDebug', task ':app:checkPlayDebugDuplicateClasses', task ':app:desugarPlayDebugFileDependencies', task ':app:mergeExtDexPlayDebug', task ':aves_screen_state:bundleLibRuntimeToDirDebug', task ':connectivity_plus:bundleLibRuntimeToDirDebug', task ':dchs_motion_sensors:bundleLibRuntimeToDirDebug', task ':device_info_plus:bundleLibRuntimeToDirDebug', task ':dynamic_color:bundleLibRuntimeToDirDebug', task ':firebase_crashlytics:bundleLibRuntimeToDirDebug', task ':firebase_core:bundleLibRuntimeToDirDebug', task ':floating:bundleLibRuntimeToDirDebug', task ':flutter_displaymode:bundleLibRuntimeToDirDebug', task ':google_maps_flutter_android:bundleLibRuntimeToDirDebug', task ':local_auth_android:bundleLibRuntimeToDirDebug', task ':flutter_plugin_android_lifecycle:bundleLibRuntimeToDirDebug', task ':flutter_secure_storage:bundleLibRuntimeToDirDebug', task ':google_api_availability_android:bundleLibRuntimeToDirDebug', task ':google_cast:bundleLibRuntimeToDirDebug', task ':jni_flutter:bundleLibRuntimeToDirDebug', task ':jni:bundleLibRuntimeToDirDebug', task ':media_kit_libs_android_video:bundleLibRuntimeToDirDebug', task ':media_kit_video:bundleLibRuntimeToDirDebug', task ':network_info_plus:bundleLibRuntimeToDirDebug', task ':wakelock_plus:bundleLibRuntimeToDirDebug', task ':package_info_plus:bundleLibRuntimeToDirDebug', task ':permission_handler_android:bundleLibRuntimeToDirDebug', task ':printing:bundleLibRuntimeToDirDebug', task ':screen_brightness_android:bundleLibRuntimeToDirDebug', task ':shared_preferences_android:bundleLibRuntimeToDirDebug', task ':sqflite_android:bundleLibRuntimeToDirDebug', task ':streams_channel:bundleLibRuntimeToDirDebug', task ':url_launcher_android:bundleLibRuntimeToDirDebug', task ':video_player_android:bundleLibRuntimeToDirDebug', task ':volume_controller:bundleLibRuntimeToDirDebug', task ':exifinterface:bundleLibRuntimeToDirDebug', task ':app:mergeLibDexPlayDebug', task ':aves_screen_state:bundleLibRuntimeToJarDebug', task ':connectivity_plus:bundleLibRuntimeToJarDebug', task ':dchs_motion_sensors:bundleLibRuntimeToJarDebug', task ':device_info_plus:bundleLibRuntimeToJarDebug', task ':dynamic_color:bundleLibRuntimeToJarDebug', task ':firebase_crashlytics:bundleLibRuntimeToJarDebug', task ':firebase_core:bundleLibRuntimeToJarDebug', task ':floating:bundleLibRuntimeToJarDebug', task ':flutter_displaymode:bundleLibRuntimeToJarDebug', task ':google_maps_flutter_android:bundleLibRuntimeToJarDebug', task ':local_auth_android:bundleLibRuntimeToJarDebug', task ':flutter_plugin_android_lifecycle:bundleLibRuntimeToJarDebug', task ':flutter_secure_storage:bundleLibRuntimeToJarDebug', task ':google_api_availability_android:bundleLibRuntimeToJarDebug', task ':google_cast:bundleLibRuntimeToJarDebug', task ':jni_flutter:bundleLibRuntimeToJarDebug', task ':jni:bundleLibRuntimeToJarDebug', task ':media_kit_libs_android_video:bundleLibRuntimeToJarDebug', task ':media_kit_video:bundleLibRuntimeToJarDebug', task ':network_info_plus:bundleLibRuntimeToJarDebug', task ':wakelock_plus:bundleLibRuntimeToJarDebug', task ':package_info_plus:bundleLibRuntimeToJarDebug', task ':permission_handler_android:bundleLibRuntimeToJarDebug', task ':printing:bundleLibRuntimeToJarDebug', task ':screen_brightness_android:bundleLibRuntimeToJarDebug', task ':shared_preferences_android:bundleLibRuntimeToJarDebug', task ':sqflite_android:bundleLibRuntimeToJarDebug', task ':streams_channel:bundleLibRuntimeToJarDebug', task ':url_launcher_android:bundleLibRuntimeToJarDebug', task ':video_player_android:bundleLibRuntimeToJarDebug', task ':volume_controller:bundleLibRuntimeToJarDebug', task ':exifinterface:bundleLibRuntimeToJarDebug', task ':app:dexBuilderPlayDebug', task ':app:mergePlayDebugGlobalSynthetics', task ':app:processPlayDebugJavaRes', task ':aves_screen_state:processDebugJavaRes', task ':connectivity_plus:processDebugJavaRes', task ':dchs_motion_sensors:processDebugJavaRes', task ':device_info_plus:processDebugJavaRes', task ':dynamic_color:processDebugJavaRes', task ':exifinterface:processDebugJavaRes', task ':firebase_core:processDebugJavaRes', task ':firebase_crashlytics:processDebugJavaRes', task ':floating:processDebugJavaRes', task ':flutter_displaymode:processDebugJavaRes', task ':flutter_plugin_android_lifecycle:processDebugJavaRes', task ':flutter_secure_storage:processDebugJavaRes', task ':google_api_availability_android:processDebugJavaRes', task ':google_cast:processDebugJavaRes', task ':google_maps_flutter_android:processDebugJavaRes', task ':jni:processDebugJavaRes', task ':jni_flutter:processDebugJavaRes', task ':local_auth_android:processDebugJavaRes', task ':media_kit_libs_android_video:processDebugJavaRes', task ':media_kit_video:processDebugJavaRes', task ':network_info_plus:processDebugJavaRes', task ':package_info_plus:processDebugJavaRes', task ':permission_handler_android:processDebugJavaRes', task ':printing:processDebugJavaRes', task ':screen_brightness_android:processDebugJavaRes', task ':shared_preferences_android:processDebugJavaRes', task ':sqflite_android:processDebugJavaRes', task ':streams_channel:processDebugJavaRes', task ':url_launcher_android:processDebugJavaRes', task ':video_player_android:processDebugJavaRes', task ':volume_controller:processDebugJavaRes', task ':wakelock_plus:processDebugJavaRes', task ':app:mergePlayDebugJavaResource', task ':app:mergeProjectDexPlayDebug', task ':app:compileFlutterBuildLibre_romDebug', task ':app:packJniLibsflutterBuildLibre_romDebug', task ':app:preLibre_romDebugBuild', task ':app:configureCMakeDebug[arm64-v8a]', task ':app:buildCMakeDebug[arm64-v8a]', task ':app:configureCMakeDebug[armeabi-v7a]', task ':app:buildCMakeDebug[armeabi-v7a]', task ':app:configureCMakeDebug[x86_64]', task ':app:buildCMakeDebug[x86_64]', task ':app:mergePlayDebugJniLibFolders', task ':aves_screen_state:mergeDebugJniLibFolders', task ':aves_screen_state:mergeDebugNativeLibs', task ':aves_screen_state:copyDebugJniLibsProjectOnly', task ':connectivity_plus:mergeDebugJniLibFolders', task ':connectivity_plus:mergeDebugNativeLibs', task ':connectivity_plus:copyDebugJniLibsProjectOnly', task ':dchs_motion_sensors:mergeDebugJniLibFolders', task ':dchs_motion_sensors:mergeDebugNativeLibs', task ':dchs_motion_sensors:copyDebugJniLibsProjectOnly', task ':device_info_plus:mergeDebugJniLibFolders', task ':device_info_plus:mergeDebugNativeLibs', task ':device_info_plus:copyDebugJniLibsProjectOnly', task ':dynamic_color:mergeDebugJniLibFolders', task ':dynamic_color:mergeDebugNativeLibs', task ':dynamic_color:copyDebugJniLibsProjectOnly', task ':exifinterface:mergeDebugJniLibFolders', task ':exifinterface:mergeDebugNativeLibs', task ':exifinterface:copyDebugJniLibsProjectOnly', task ':firebase_core:mergeDebugJniLibFolders', task ':firebase_core:mergeDebugNativeLibs', task ':firebase_core:copyDebugJniLibsProjectOnly', task ':firebase_crashlytics:mergeDebugJniLibFolders', task ':firebase_crashlytics:mergeDebugNativeLibs', task ':firebase_crashlytics:copyDebugJniLibsProjectOnly', task ':floating:mergeDebugJniLibFolders', task ':floating:mergeDebugNativeLibs', task ':floating:copyDebugJniLibsProjectOnly', task ':flutter_displaymode:mergeDebugJniLibFolders', task ':flutter_displaymode:mergeDebugNativeLibs', task ':flutter_displaymode:copyDebugJniLibsProjectOnly', task ':flutter_plugin_android_lifecycle:mergeDebugJniLibFolders', task ':flutter_plugin_android_lifecycle:mergeDebugNativeLibs', task ':flutter_plugin_android_lifecycle:copyDebugJniLibsProjectOnly', task ':flutter_secure_storage:mergeDebugJniLibFolders', task ':flutter_secure_storage:mergeDebugNativeLibs', task ':flutter_secure_storage:copyDebugJniLibsProjectOnly', task ':google_api_availability_android:mergeDebugJniLibFolders', task ':google_api_availability_android:mergeDebugNativeLibs', task ':google_api_availability_android:copyDebugJniLibsProjectOnly', task ':google_cast:mergeDebugJniLibFolders', task ':google_cast:mergeDebugNativeLibs', task ':google_cast:copyDebugJniLibsProjectOnly', task ':google_maps_flutter_android:mergeDebugJniLibFolders', task ':google_maps_flutter_android:mergeDebugNativeLibs', task ':google_maps_flutter_android:copyDebugJniLibsProjectOnly', task ':jni:configureCMakeDebug[arm64-v8a]', task ':jni:buildCMakeDebug[arm64-v8a]', task ':jni:configureCMakeDebug[armeabi-v7a]', task ':jni:buildCMakeDebug[armeabi-v7a]', task ':jni:configureCMakeDebug[x86]', task ':jni:buildCMakeDebug[x86]', task ':jni:configureCMakeDebug[x86_64]', task ':jni:buildCMakeDebug[x86_64]', task ':jni:mergeDebugJniLibFolders', task ':jni:mergeDebugNativeLibs', task ':jni:copyDebugJniLibsProjectOnly', task ':jni_flutter:mergeDebugJniLibFolders', task ':jni_flutter:mergeDebugNativeLibs', task ':jni_flutter:copyDebugJniLibsProjectOnly', task ':local_auth_android:mergeDebugJniLibFolders', task ':local_auth_android:mergeDebugNativeLibs', task ':local_auth_android:copyDebugJniLibsProjectOnly', task ':media_kit_libs_android_video:mergeDebugJniLibFolders', task ':media_kit_libs_android_video:mergeDebugNativeLibs', task ':media_kit_libs_android_video:copyDebugJniLibsProjectOnly', task ':media_kit_video:mergeDebugJniLibFolders', task ':media_kit_video:mergeDebugNativeLibs', task ':media_kit_video:copyDebugJniLibsProjectOnly', task ':network_info_plus:mergeDebugJniLibFolders', task ':network_info_plus:mergeDebugNativeLibs', task ':network_info_plus:copyDebugJniLibsProjectOnly', task ':package_info_plus:mergeDebugJniLibFolders', task ':package_info_plus:mergeDebugNativeLibs', task ':package_info_plus:copyDebugJniLibsProjectOnly', task ':permission_handler_android:mergeDebugJniLibFolders', task ':permission_handler_android:mergeDebugNativeLibs', task ':permission_handler_android:copyDebugJniLibsProjectOnly', task ':printing:mergeDebugJniLibFolders', task ':printing:mergeDebugNativeLibs', task ':printing:copyDebugJniLibsProjectOnly', task ':screen_brightness_android:mergeDebugJniLibFolders', task ':screen_brightness_android:mergeDebugNativeLibs', task ':screen_brightness_android:copyDebugJniLibsProjectOnly', task ':shared_preferences_android:mergeDebugJniLibFolders', task ':shared_preferences_android:mergeDebugNativeLibs', task ':shared_preferences_android:copyDebugJniLibsProjectOnly', task ':sqflite_android:mergeDebugJniLibFolders', task ':sqflite_android:mergeDebugNativeLibs', task ':sqflite_android:copyDebugJniLibsProjectOnly', task ':streams_channel:mergeDebugJniLibFolders', task ':streams_channel:mergeDebugNativeLibs', task ':streams_channel:copyDebugJniLibsProjectOnly', task ':url_launcher_android:mergeDebugJniLibFolders', task ':url_launcher_android:mergeDebugNativeLibs', task ':url_launcher_android:copyDebugJniLibsProjectOnly', task ':video_player_android:mergeDebugJniLibFolders', task ':video_player_android:mergeDebugNativeLibs', task ':video_player_android:copyDebugJniLibsProjectOnly', task ':volume_controller:mergeDebugJniLibFolders', task ':volume_controller:mergeDebugNativeLibs', task ':volume_controller:copyDebugJniLibsProjectOnly', task ':wakelock_plus:mergeDebugJniLibFolders', task ':wakelock_plus:mergeDebugNativeLibs', task ':wakelock_plus:copyDebugJniLibsProjectOnly', task ':app:mergePlayDebugNativeLibs', task ':app:stripPlayDebugDebugSymbols', task ':app:validateSigningPlayDebug', task ':app:writePlayDebugAppMetadata', task ':app:writePlayDebugSigningConfigVersions', task ':app:packagePlayDebug', task ':app:createPlayDebugApkListingFileRedirect', task ':app:assemblePlayDebug'] +Tasks that were excluded: [] +work action Parameters of ClassesDirToClassesTransform (Thread[#472,included builds,5,main]) started. +work action Parameters of DexingNoClasspathTransform (Thread[#472,included builds,5,main]) started. +work action Parameters of DexingOutputSplitTransform (Thread[#475,Execution worker Thread 3,5,main]) started. +work action Parameters of IdentityTransform (Thread[#475,Execution worker Thread 3,5,main]) started. +work action Parameters of DexingOutputSplitTransform (Thread[#475,Execution worker Thread 3,5,main]) started. +Resolve mutations for :app:PlayDebugMinSdkCheck (Thread[#475,Execution worker Thread 3,5,main]) started. +:app:PlayDebugMinSdkCheck (Thread[#475,Execution worker Thread 3,5,main]) started. + +> Task :app:PlayDebugMinSdkCheck +Caching disabled for task ':app:PlayDebugMinSdkCheck' because: + Build cache is disabled +Task ':app:PlayDebugMinSdkCheck' is not up-to-date because: + Task has not declared any outputs despite executing actions. +Resolve mutations for :app:preBuild (Thread[#475,Execution worker Thread 3,5,main]) started. +:app:preBuild (Thread[#475,Execution worker Thread 3,5,main]) started. + +> Task :app:preBuild UP-TO-DATE +Skipping task ':app:preBuild' as it has no actions. +Resolve mutations for :app:prePlayDebugBuild (Thread[#475,Execution worker Thread 3,5,main]) started. +:app:prePlayDebugBuild (Thread[#475,Execution worker Thread 3,5,main]) started. + +> Task :app:prePlayDebugBuild UP-TO-DATE +Skipping task ':app:prePlayDebugBuild' as it has no actions. +Resolve mutations for :app:mergePlayDebugNativeDebugMetadata (Thread[#475,Execution worker Thread 3,5,main]) started. +:app:mergePlayDebugNativeDebugMetadata (Thread[#475,Execution worker Thread 3,5,main]) started. + +> Task :app:mergePlayDebugNativeDebugMetadata NO-SOURCE +Skipping task ':app:mergePlayDebugNativeDebugMetadata' as it has no source files and no previous output files. +Resolve mutations for :app:checkKotlinGradlePluginConfigurationErrors (Thread[#475,Execution worker Thread 3,5,main]) started. +:app:checkKotlinGradlePluginConfigurationErrors (Thread[#475,Execution worker Thread 3,5,main]) started. + +> Task :app:checkKotlinGradlePluginConfigurationErrors SKIPPED +Skipping task ':app:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +Resolve mutations for :app:compileFlutterBuildPlayDebug (Thread[#475,Execution worker Thread 3,5,main]) started. +:app:compileFlutterBuildPlayDebug (Thread[#475,Execution worker Thread 3,5,main]) started. + +> Task :app:compileFlutterBuildPlayDebug +Caching disabled for task ':app:compileFlutterBuildPlayDebug' because: + Build cache is disabled + Caching has not been enabled for the task +Task ':app:compileFlutterBuildPlayDebug' is not up-to-date because: + Value of input property 'dartDefines' has changed for task ':app:compileFlutterBuildPlayDebug' + Value of input property 'targetPath' has changed for task ':app:compileFlutterBuildPlayDebug' + Value of input property 'verbose' has changed for task ':app:compileFlutterBuildPlayDebug' +Starting process 'command '/Users/fabio/fvm/versions/3.35.7/bin/flutter''. Working directory: /Volumes/terrain/aves_mio54 Command: /Users/fabio/fvm/versions/3.35.7/bin/flutter --quiet assemble --no-version-check --depfile /Volumes/terrain/aves_mio54/build/app/intermediates/flutter/playDebug/flutter_build.d --output /Volumes/terrain/aves_mio54/build/app/intermediates/flutter/playDebug -dTargetFile=lib/main.dart -dTargetPlatform=android -dBuildMode=debug -dTrackWidgetCreation=true -dFlavor=play -dAndroidArchs=android-arm android-arm64 android-x64 -dMinSdkVersion=24 debug_android_application +Successfully started process 'command '/Users/fabio/fvm/versions/3.35.7/bin/flutter'' +"az": 668 untranslated message(s). +"be": 42 untranslated message(s). +"bg": 2 untranslated message(s). +"bn": 699 untranslated message(s). +"ca": 2 untranslated message(s). +"ckb": 257 untranslated message(s). +"da": 2 untranslated message(s). +"el": 3 untranslated message(s). +"en_Shaw": 3 untranslated message(s). +"eu": 40 untranslated message(s). +"fa": 2 untranslated message(s). +"fi": 2 untranslated message(s). +"he": 643 untranslated message(s). +"hi": 219 untranslated message(s). +"hr": 724 untranslated message(s). +"hu": 3 untranslated message(s). +"id": 3 untranslated message(s). +"it": 3 untranslated message(s). +"ja": 35 untranslated message(s). +"kmr": 407 untranslated message(s). +"lt": 3 untranslated message(s). +"ml": 722 untranslated message(s). +"my": 157 untranslated message(s). +"nb": 80 untranslated message(s). +"ne": 724 untranslated message(s). +"nn": 96 untranslated message(s). +"or": 651 untranslated message(s). +"pt": 3 untranslated message(s). +"ro": 1 untranslated message(s). +"sat": 722 untranslated message(s). +"sk": 21 untranslated message(s). +"sl": 720 untranslated message(s). +"sr": 721 untranslated message(s). +"th": 448 untranslated message(s). +"tr": 1 untranslated message(s). +"ur": 724 untranslated message(s). +"vi": 31 untranslated message(s). +"zh_Hant": 2 untranslated message(s). +To see a detailed report, use the untranslated-messages-file +option in the l10n.yaml file: +untranslated-messages-file: desiredFileName.txt +<other option>: <other selection> + + +This will generate a JSON format file containing all messages that +need to be translated. +lib/main.dart: Error: Error when reading 'lib/main.dart': No such file or directory +Target kernel_snapshot_program failed: Exception + + +> Task :app:compileFlutterBuildPlayDebug FAILED +Build cc21c806-d799-4a68-9ad9-89778152098c is closed + +[Incubating] Problems report is available at: file:///Volumes/terrain/aves_mio54/build/reports/problems/problems-report.html + +FAILURE: Build failed with an exception. + +* What went wrong: +Execution failed for task ':app:compileFlutterBuildPlayDebug'. +> Process 'command '/Users/fabio/fvm/versions/3.35.7/bin/flutter'' finished with non-zero exit value 1 + +* Try: +> Run with --debug option to get more log output. +> Run with --scan to get full insights. +> Get more help at https://help.gradle.org. + +* Exception is: +org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileFlutterBuildPlayDebug'. + at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:130) + at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:293) + at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:128) + at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116) + at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41) + at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) + at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) + at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) + at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74) + at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) + at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) + at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) + at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54) + at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) + at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42) + at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331) + at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318) + at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314) + at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85) + at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314) + at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303) + at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459) + at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376) + at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) + at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) +Caused by: org.gradle.process.internal.ExecException: Process 'command '/Users/fabio/fvm/versions/3.35.7/bin/flutter'' finished with non-zero exit value 1 + at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:442) + at org.gradle.process.internal.DefaultExecAction.execute(DefaultExecAction.java:49) + at org.gradle.process.internal.DefaultExecActionFactory.exec(DefaultExecActionFactory.java:216) + at org.gradle.process.internal.DefaultExecOperations.exec(DefaultExecOperations.java:37) + at com.flutter.gradle.tasks.BaseFlutterTaskHelper.buildBundle(BaseFlutterTaskHelper.kt:174) + at com.flutter.gradle.tasks.BaseFlutterTask.buildBundle(BaseFlutterTask.kt:147) + at com.flutter.gradle.tasks.FlutterTaskHelper.build$gradle(FlutterTaskHelper.kt:90) + at com.flutter.gradle.tasks.FlutterTask.build(FlutterTask.kt:49) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) + at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125) + at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58) + at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51) + at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29) + at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:244) + at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:30) + at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:27) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:48) + at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:229) + at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:212) + at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:195) + at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:162) + at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105) + at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44) + at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59) + at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54) + at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56) + at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44) + at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42) + at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75) + at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55) + at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50) + at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28) + at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67) + at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37) + at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61) + at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26) + at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69) + at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46) + at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40) + at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29) + at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189) + at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75) + at org.gradle.internal.Either$Right.fold(Either.java:175) + at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62) + at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73) + at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48) + at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46) + at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35) + at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75) + at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53) + at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53) + at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35) + at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37) + at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27) + at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49) + at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27) + at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71) + at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39) + at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65) + at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36) + at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:107) + at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:56) + at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:64) + at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:43) + at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:125) + at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:56) + at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:36) + at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38) + at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36) + at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23) + at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75) + at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41) + at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35) + at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:289) + at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31) + at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22) + at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40) + at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23) + at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67) + at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67) + at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39) + at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46) + at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34) + at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:48) + at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:35) + at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64) + at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:127) + at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116) + at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41) + at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) + at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) + at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) + at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74) + at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) + at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) + at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) + at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54) + at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) + at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42) + at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331) + at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318) + at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314) + at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85) + at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314) + at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303) + at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459) + at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376) + at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) + at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) + + +Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. + +You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. + +For more on this, please refer to https://docs.gradle.org/8.14.4/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. + +BUILD FAILED in 20s +6 actionable tasks: 2 executed, 4 up-to-date +Watched directory hierarchies: [/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle, /Volumes/terrain/aves_mio54/android] diff --git a/android/key_template.properties b/android/key_template.properties new file mode 100644 index 0000000..e335f59 --- /dev/null +++ b/android/key_template.properties @@ -0,0 +1,5 @@ +storeFile=<KEYSTORE_PATH> +storePassword=<KEYSTORE_PASSWORD> +keyAlias=<KEY_ALIAS> +keyPassword=<KEY_PASSWORD> +googleApiKey=<GOOGLE_API_KEY> diff --git a/android/kotlin_errors.txt b/android/kotlin_errors.txt new file mode 100644 index 0000000..cf67111 --- /dev/null +++ b/android/kotlin_errors.txt @@ -0,0 +1,18 @@ +Resolve mutations for :gradle:checkKotlinGradlePluginConfigurationErrors (Thread[#473,Execution worker,5,main]) started. +:gradle:checkKotlinGradlePluginConfigurationErrors (Thread[#473,Execution worker,5,main]) started. +> Task :gradle:checkKotlinGradlePluginConfigurationErrors SKIPPED +Skipping task ':gradle:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. + org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +Tasks to be executed: [task ':app:PlayDebugMinSdkCheck', task ':app:preBuild', task ':app:prePlayDebugBuild', task ':app:mergePlayDebugNativeDebugMetadata', task ':app:checkKotlinGradlePluginConfigurationErrors', task ':app:compileFlutterBuildPlayDebug', task ':app:packJniLibsflutterBuildPlayDebug', task ':aves_screen_state:preBuild', task ':aves_screen_state:preDebugBuild', task ':aves_screen_state:writeDebugAarMetadata', task ':connectivity_plus:preBuild', task ':connectivity_plus:preDebugBuild', task ':connectivity_plus:writeDebugAarMetadata', task ':dchs_motion_sensors:preBuild', task ':dchs_motion_sensors:preDebugBuild', task ':dchs_motion_sensors:writeDebugAarMetadata', task ':device_info_plus:preBuild', task ':device_info_plus:preDebugBuild', task ':device_info_plus:writeDebugAarMetadata', task ':dynamic_color:preBuild', task ':dynamic_color:preDebugBuild', task ':dynamic_color:writeDebugAarMetadata', task ':exifinterface:preBuild', task ':exifinterface:preDebugBuild', task ':exifinterface:writeDebugAarMetadata', task ':firebase_core:preBuild', task ':firebase_core:preDebugBuild', task ':firebase_core:writeDebugAarMetadata', task ':firebase_crashlytics:preBuild', task ':firebase_crashlytics:preDebugBuild', task ':firebase_crashlytics:writeDebugAarMetadata', task ':floating:preBuild', task ':floating:preDebugBuild', task ':floating:writeDebugAarMetadata', task ':flutter_displaymode:preBuild', task ':flutter_displaymode:preDebugBuild', task ':flutter_displaymode:writeDebugAarMetadata', task ':flutter_plugin_android_lifecycle:preBuild', task ':flutter_plugin_android_lifecycle:preDebugBuild', task ':flutter_plugin_android_lifecycle:writeDebugAarMetadata', task ':flutter_secure_storage:preBuild', task ':flutter_secure_storage:preDebugBuild', task ':flutter_secure_storage:writeDebugAarMetadata', task ':google_api_availability_android:preBuild', task ':google_api_availability_android:preDebugBuild', task ':google_api_availability_android:writeDebugAarMetadata', task ':google_cast:preBuild', task ':google_cast:preDebugBuild', task ':google_cast:writeDebugAarMetadata', task ':google_maps_flutter_android:preBuild', task ':google_maps_flutter_android:preDebugBuild', task ':google_maps_flutter_android:writeDebugAarMetadata', task ':jni:preBuild', task ':jni:preDebugBuild', task ':jni:writeDebugAarMetadata', task ':jni_flutter:preBuild', task ':jni_flutter:preDebugBuild', task ':jni_flutter:writeDebugAarMetadata', task ':local_auth_android:preBuild', task ':local_auth_android:preDebugBuild', task ':local_auth_android:writeDebugAarMetadata', task ':media_kit_libs_android_video:preBuild', task ':media_kit_libs_android_video:preDebugBuild', task ':media_kit_libs_android_video:writeDebugAarMetadata', task ':media_kit_video:preBuild', task ':media_kit_video:preDebugBuild', task ':media_kit_video:writeDebugAarMetadata', task ':network_info_plus:preBuild', task ':network_info_plus:preDebugBuild', task ':network_info_plus:writeDebugAarMetadata', task ':package_info_plus:preBuild', task ':package_info_plus:preDebugBuild', task ':package_info_plus:writeDebugAarMetadata', task ':permission_handler_android:preBuild', task ':permission_handler_android:preDebugBuild', task ':permission_handler_android:writeDebugAarMetadata', task ':printing:preBuild', task ':printing:preDebugBuild', task ':printing:writeDebugAarMetadata', task ':screen_brightness_android:preBuild', task ':screen_brightness_android:preDebugBuild', task ':screen_brightness_android:writeDebugAarMetadata', task ':shared_preferences_android:preBuild', task ':shared_preferences_android:preDebugBuild', task ':shared_preferences_android:writeDebugAarMetadata', task ':sqflite_android:preBuild', task ':sqflite_android:preDebugBuild', task ':sqflite_android:writeDebugAarMetadata', task ':streams_channel:preBuild', task ':streams_channel:preDebugBuild', task ':streams_channel:writeDebugAarMetadata', task ':url_launcher_android:preBuild', task ':url_launcher_android:preDebugBuild', task ':url_launcher_android:writeDebugAarMetadata', task ':video_player_android:preBuild', task ':video_player_android:preDebugBuild', task ':video_player_android:writeDebugAarMetadata', task ':volume_controller:preBuild', task ':volume_controller:preDebugBuild', task ':volume_controller:writeDebugAarMetadata', task ':wakelock_plus:preBuild', task ':wakelock_plus:preDebugBuild', task ':wakelock_plus:writeDebugAarMetadata', task ':app:checkPlayDebugAarMetadata', task ':aves_screen_state:processDebugNavigationResources', task ':connectivity_plus:processDebugNavigationResources', task ':dchs_motion_sensors:processDebugNavigationResources', task ':device_info_plus:processDebugNavigationResources', task ':dynamic_color:processDebugNavigationResources', task ':exifinterface:processDebugNavigationResources', task ':firebase_core:processDebugNavigationResources', task ':firebase_crashlytics:processDebugNavigationResources', task ':floating:processDebugNavigationResources', task ':flutter_displaymode:processDebugNavigationResources', task ':flutter_plugin_android_lifecycle:processDebugNavigationResources', task ':flutter_secure_storage:processDebugNavigationResources', task ':google_api_availability_android:processDebugNavigationResources', task ':google_cast:processDebugNavigationResources', task ':google_maps_flutter_android:processDebugNavigationResources', task ':jni:processDebugNavigationResources', task ':jni_flutter:processDebugNavigationResources', task ':local_auth_android:processDebugNavigationResources', task ':media_kit_libs_android_video:processDebugNavigationResources', task ':media_kit_video:processDebugNavigationResources', task ':network_info_plus:processDebugNavigationResources', task ':package_info_plus:processDebugNavigationResources', task ':permission_handler_android:processDebugNavigationResources', task ':printing:processDebugNavigationResources', task ':screen_brightness_android:processDebugNavigationResources', task ':shared_preferences_android:processDebugNavigationResources', task ':sqflite_android:processDebugNavigationResources', task ':streams_channel:processDebugNavigationResources', task ':url_launcher_android:processDebugNavigationResources', task ':video_player_android:processDebugNavigationResources', task ':volume_controller:processDebugNavigationResources', task ':wakelock_plus:processDebugNavigationResources', task ':app:processPlayDebugNavigationResources', task ':app:compilePlayDebugNavigationResources', task ':app:cleanMergePlayDebugAssets', task ':app:mergePlayDebugShaders', task ':app:compilePlayDebugShaders', task ':app:generatePlayDebugAssets', task ':aves_screen_state:mergeDebugShaders', task ':aves_screen_state:compileDebugShaders', task ':aves_screen_state:generateDebugAssets', task ':aves_screen_state:mergeDebugAssets', task ':connectivity_plus:mergeDebugShaders', task ':connectivity_plus:compileDebugShaders', task ':connectivity_plus:generateDebugAssets', task ':connectivity_plus:mergeDebugAssets', task ':dchs_motion_sensors:mergeDebugShaders', task ':dchs_motion_sensors:compileDebugShaders', task ':dchs_motion_sensors:generateDebugAssets', task ':dchs_motion_sensors:mergeDebugAssets', task ':device_info_plus:mergeDebugShaders', task ':device_info_plus:compileDebugShaders', task ':device_info_plus:generateDebugAssets', task ':device_info_plus:mergeDebugAssets', task ':dynamic_color:mergeDebugShaders', task ':dynamic_color:compileDebugShaders', task ':dynamic_color:generateDebugAssets', task ':dynamic_color:mergeDebugAssets', task ':exifinterface:mergeDebugShaders', task ':exifinterface:compileDebugShaders', task ':exifinterface:generateDebugAssets', task ':exifinterface:mergeDebugAssets', task ':firebase_core:mergeDebugShaders', task ':firebase_core:compileDebugShaders', task ':firebase_core:generateDebugAssets', task ':firebase_core:mergeDebugAssets', task ':firebase_crashlytics:mergeDebugShaders', task ':firebase_crashlytics:compileDebugShaders', task ':firebase_crashlytics:generateDebugAssets', task ':firebase_crashlytics:mergeDebugAssets', task ':floating:mergeDebugShaders', task ':floating:compileDebugShaders', task ':floating:generateDebugAssets', task ':floating:mergeDebugAssets', task ':flutter_displaymode:mergeDebugShaders', task ':flutter_displaymode:compileDebugShaders', task ':flutter_displaymode:generateDebugAssets', task ':flutter_displaymode:mergeDebugAssets', task ':flutter_plugin_android_lifecycle:mergeDebugShaders', task ':flutter_plugin_android_lifecycle:compileDebugShaders', task ':flutter_plugin_android_lifecycle:generateDebugAssets', task ':flutter_plugin_android_lifecycle:mergeDebugAssets', task ':flutter_secure_storage:mergeDebugShaders', task ':flutter_secure_storage:compileDebugShaders', task ':flutter_secure_storage:generateDebugAssets', task ':flutter_secure_storage:mergeDebugAssets', task ':google_api_availability_android:mergeDebugShaders', task ':google_api_availability_android:compileDebugShaders', task ':google_api_availability_android:generateDebugAssets', task ':google_api_availability_android:mergeDebugAssets', task ':google_cast:mergeDebugShaders', task ':google_cast:compileDebugShaders', task ':google_cast:generateDebugAssets', task ':google_cast:mergeDebugAssets', task ':google_maps_flutter_android:mergeDebugShaders', task ':google_maps_flutter_android:compileDebugShaders', task ':google_maps_flutter_android:generateDebugAssets', task ':google_maps_flutter_android:mergeDebugAssets', task ':jni:mergeDebugShaders', task ':jni:compileDebugShaders', task ':jni:generateDebugAssets', task ':jni:mergeDebugAssets', task ':jni_flutter:mergeDebugShaders', task ':jni_flutter:compileDebugShaders', task ':jni_flutter:generateDebugAssets', task ':jni_flutter:mergeDebugAssets', task ':local_auth_android:mergeDebugShaders', task ':local_auth_android:compileDebugShaders', task ':local_auth_android:generateDebugAssets', task ':local_auth_android:mergeDebugAssets', task ':media_kit_libs_android_video:mergeDebugShaders', task ':media_kit_libs_android_video:compileDebugShaders', task ':media_kit_libs_android_video:generateDebugAssets', task ':media_kit_libs_android_video:mergeDebugAssets', task ':media_kit_video:mergeDebugShaders', task ':media_kit_video:compileDebugShaders', task ':media_kit_video:generateDebugAssets', task ':media_kit_video:mergeDebugAssets', task ':network_info_plus:mergeDebugShaders', task ':network_info_plus:compileDebugShaders', task ':network_info_plus:generateDebugAssets', task ':network_info_plus:mergeDebugAssets', task ':package_info_plus:mergeDebugShaders', task ':package_info_plus:compileDebugShaders', task ':package_info_plus:generateDebugAssets', task ':package_info_plus:mergeDebugAssets', task ':permission_handler_android:mergeDebugShaders', task ':permission_handler_android:compileDebugShaders', task ':permission_handler_android:generateDebugAssets', task ':permission_handler_android:mergeDebugAssets', task ':printing:mergeDebugShaders', task ':printing:compileDebugShaders', task ':printing:generateDebugAssets', task ':printing:mergeDebugAssets', task ':screen_brightness_android:mergeDebugShaders', task ':screen_brightness_android:compileDebugShaders', task ':screen_brightness_android:generateDebugAssets', task ':screen_brightness_android:mergeDebugAssets', task ':shared_preferences_android:mergeDebugShaders', task ':shared_preferences_android:compileDebugShaders', task ':shared_preferences_android:generateDebugAssets', task ':shared_preferences_android:mergeDebugAssets', task ':sqflite_android:mergeDebugShaders', task ':sqflite_android:compileDebugShaders', task ':sqflite_android:generateDebugAssets', task ':sqflite_android:mergeDebugAssets', task ':streams_channel:mergeDebugShaders', task ':streams_channel:compileDebugShaders', task ':streams_channel:generateDebugAssets', task ':streams_channel:mergeDebugAssets', task ':url_launcher_android:mergeDebugShaders', task ':url_launcher_android:compileDebugShaders', task ':url_launcher_android:generateDebugAssets', task ':url_launcher_android:mergeDebugAssets', task ':video_player_android:mergeDebugShaders', task ':video_player_android:compileDebugShaders', task ':video_player_android:generateDebugAssets', task ':video_player_android:mergeDebugAssets', task ':volume_controller:mergeDebugShaders', task ':volume_controller:compileDebugShaders', task ':volume_controller:generateDebugAssets', task ':volume_controller:mergeDebugAssets', task ':wakelock_plus:mergeDebugShaders', task ':wakelock_plus:compileDebugShaders', task ':wakelock_plus:generateDebugAssets', task ':wakelock_plus:mergeDebugAssets', task ':app:mergePlayDebugAssets', task ':app:copyFlutterAssetsPlayDebug', task ':app:generatePlayDebugResValues', task ':app:injectCrashlyticsMappingFileIdPlayDebug', task ':app:injectCrashlyticsVersionControlInfoPlayDebug', task ':app:processPlayDebugGoogleServices', task ':aves_screen_state:generateDebugResValues', task ':aves_screen_state:generateDebugResources', task ':aves_screen_state:packageDebugResources', task ':connectivity_plus:generateDebugResValues', task ':connectivity_plus:generateDebugResources', task ':connectivity_plus:packageDebugResources', task ':dchs_motion_sensors:generateDebugResValues', task ':dchs_motion_sensors:generateDebugResources', task ':dchs_motion_sensors:packageDebugResources', task ':device_info_plus:generateDebugResValues', task ':device_info_plus:generateDebugResources', task ':device_info_plus:packageDebugResources', task ':dynamic_color:generateDebugResValues', task ':dynamic_color:generateDebugResources', task ':dynamic_color:packageDebugResources', task ':exifinterface:generateDebugResValues', task ':exifinterface:generateDebugResources', task ':exifinterface:packageDebugResources', task ':firebase_core:generateDebugResValues', task ':firebase_core:generateDebugResources', task ':firebase_core:packageDebugResources', task ':firebase_crashlytics:generateDebugResValues', task ':firebase_crashlytics:generateDebugResources', task ':firebase_crashlytics:packageDebugResources', task ':floating:generateDebugResValues', task ':floating:generateDebugResources', task ':floating:packageDebugResources', task ':flutter_displaymode:generateDebugResValues', task ':flutter_displaymode:generateDebugResources', task ':flutter_displaymode:packageDebugResources', task ':flutter_plugin_android_lifecycle:generateDebugResValues', task ':flutter_plugin_android_lifecycle:generateDebugResources', task ':flutter_plugin_android_lifecycle:packageDebugResources', task ':flutter_secure_storage:generateDebugResValues', task ':flutter_secure_storage:generateDebugResources', task ':flutter_secure_storage:packageDebugResources', task ':google_api_availability_android:generateDebugResValues', task ':google_api_availability_android:generateDebugResources', task ':google_api_availability_android:packageDebugResources', task ':google_cast:generateDebugResValues', task ':google_cast:generateDebugResources', task ':google_cast:packageDebugResources', task ':google_maps_flutter_android:generateDebugResValues', task ':google_maps_flutter_android:generateDebugResources', task ':google_maps_flutter_android:packageDebugResources', task ':jni:generateDebugResValues', task ':jni:generateDebugResources', task ':jni:packageDebugResources', task ':jni_flutter:generateDebugResValues', task ':jni_flutter:generateDebugResources', task ':jni_flutter:packageDebugResources', task ':local_auth_android:generateDebugResValues', task ':local_auth_android:generateDebugResources', task ':local_auth_android:packageDebugResources', task ':media_kit_libs_android_video:generateDebugResValues', task ':media_kit_libs_android_video:generateDebugResources', task ':media_kit_libs_android_video:packageDebugResources', task ':media_kit_video:generateDebugResValues', task ':media_kit_video:generateDebugResources', task ':media_kit_video:packageDebugResources', task ':network_info_plus:generateDebugResValues', task ':network_info_plus:generateDebugResources', task ':network_info_plus:packageDebugResources', task ':package_info_plus:generateDebugResValues', task ':package_info_plus:generateDebugResources', task ':package_info_plus:packageDebugResources', task ':permission_handler_android:generateDebugResValues', task ':permission_handler_android:generateDebugResources', task ':permission_handler_android:packageDebugResources', task ':printing:generateDebugResValues', task ':printing:generateDebugResources', task ':printing:packageDebugResources', task ':screen_brightness_android:generateDebugResValues', task ':screen_brightness_android:generateDebugResources', task ':screen_brightness_android:packageDebugResources', task ':shared_preferences_android:generateDebugResValues', task ':shared_preferences_android:generateDebugResources', task ':shared_preferences_android:packageDebugResources', task ':sqflite_android:generateDebugResValues', task ':sqflite_android:generateDebugResources', task ':sqflite_android:packageDebugResources', task ':streams_channel:generateDebugResValues', task ':streams_channel:generateDebugResources', task ':streams_channel:packageDebugResources', task ':url_launcher_android:generateDebugResValues', task ':url_launcher_android:generateDebugResources', task ':url_launcher_android:packageDebugResources', task ':video_player_android:generateDebugResValues', task ':video_player_android:generateDebugResources', task ':video_player_android:packageDebugResources', task ':volume_controller:generateDebugResValues', task ':volume_controller:generateDebugResources', task ':volume_controller:packageDebugResources', task ':wakelock_plus:generateDebugResValues', task ':wakelock_plus:generateDebugResources', task ':wakelock_plus:packageDebugResources', task ':app:mapPlayDebugSourceSetPaths', task ':app:generatePlayDebugResources', task ':app:mergePlayDebugResources', task ':app:packagePlayDebugResources', task ':app:parsePlayDebugLocalResources', task ':app:createPlayDebugCompatibleScreenManifests', task ':app:extractDeepLinksPlayDebug', task ':aves_screen_state:extractDeepLinksDebug', task ':aves_screen_state:processDebugManifest', task ':connectivity_plus:extractDeepLinksDebug', task ':connectivity_plus:processDebugManifest', task ':dchs_motion_sensors:extractDeepLinksDebug', task ':dchs_motion_sensors:processDebugManifest', task ':device_info_plus:extractDeepLinksDebug', task ':device_info_plus:processDebugManifest', task ':dynamic_color:extractDeepLinksDebug', task ':dynamic_color:processDebugManifest', task ':exifinterface:extractDeepLinksDebug', task ':exifinterface:processDebugManifest', task ':firebase_core:extractDeepLinksDebug', task ':firebase_core:processDebugManifest', task ':firebase_crashlytics:extractDeepLinksDebug', task ':firebase_crashlytics:processDebugManifest', task ':floating:extractDeepLinksDebug', task ':floating:processDebugManifest', task ':flutter_displaymode:extractDeepLinksDebug', task ':flutter_displaymode:processDebugManifest', task ':flutter_plugin_android_lifecycle:extractDeepLinksDebug', task ':flutter_plugin_android_lifecycle:processDebugManifest', task ':flutter_secure_storage:extractDeepLinksDebug', task ':flutter_secure_storage:processDebugManifest', task ':google_api_availability_android:extractDeepLinksDebug', task ':google_api_availability_android:processDebugManifest', task ':google_cast:extractDeepLinksDebug', task ':google_cast:processDebugManifest', task ':google_maps_flutter_android:extractDeepLinksDebug', task ':google_maps_flutter_android:processDebugManifest', task ':jni:extractDeepLinksDebug', task ':jni:processDebugManifest', task ':jni_flutter:extractDeepLinksDebug', task ':jni_flutter:processDebugManifest', task ':local_auth_android:extractDeepLinksDebug', task ':local_auth_android:processDebugManifest', task ':media_kit_libs_android_video:extractDeepLinksDebug', task ':media_kit_libs_android_video:processDebugManifest', task ':media_kit_video:extractDeepLinksDebug', task ':media_kit_video:processDebugManifest', task ':network_info_plus:extractDeepLinksDebug', task ':network_info_plus:processDebugManifest', task ':package_info_plus:extractDeepLinksDebug', task ':package_info_plus:processDebugManifest', task ':permission_handler_android:extractDeepLinksDebug', task ':permission_handler_android:processDebugManifest', task ':printing:extractDeepLinksDebug', task ':printing:processDebugManifest', task ':screen_brightness_android:extractDeepLinksDebug', task ':screen_brightness_android:processDebugManifest', task ':shared_preferences_android:extractDeepLinksDebug', task ':shared_preferences_android:processDebugManifest', task ':sqflite_android:extractDeepLinksDebug', task ':sqflite_android:processDebugManifest', task ':streams_channel:extractDeepLinksDebug', task ':streams_channel:processDebugManifest', task ':url_launcher_android:extractDeepLinksDebug', task ':url_launcher_android:processDebugManifest', task ':video_player_android:extractDeepLinksDebug', task ':video_player_android:processDebugManifest', task ':volume_controller:extractDeepLinksDebug', task ':volume_controller:processDebugManifest', task ':wakelock_plus:extractDeepLinksDebug', task ':wakelock_plus:processDebugManifest', task ':app:processPlayDebugMainManifest', task ':app:processPlayDebugManifest', task ':app:processPlayDebugManifestForPackage', task ':aves_screen_state:compileDebugLibraryResources', task ':aves_screen_state:parseDebugLocalResources', task ':aves_screen_state:generateDebugRFile', task ':connectivity_plus:compileDebugLibraryResources', task ':connectivity_plus:parseDebugLocalResources', task ':connectivity_plus:generateDebugRFile', task ':dchs_motion_sensors:compileDebugLibraryResources', task ':dchs_motion_sensors:parseDebugLocalResources', task ':dchs_motion_sensors:generateDebugRFile', task ':device_info_plus:compileDebugLibraryResources', task ':device_info_plus:parseDebugLocalResources', task ':device_info_plus:generateDebugRFile', task ':dynamic_color:compileDebugLibraryResources', task ':dynamic_color:parseDebugLocalResources', task ':dynamic_color:generateDebugRFile', task ':exifinterface:compileDebugLibraryResources', task ':exifinterface:parseDebugLocalResources', task ':exifinterface:generateDebugRFile', task ':firebase_core:compileDebugLibraryResources', task ':firebase_core:parseDebugLocalResources', task ':firebase_core:generateDebugRFile', task ':firebase_crashlytics:compileDebugLibraryResources', task ':firebase_crashlytics:parseDebugLocalResources', task ':firebase_crashlytics:generateDebugRFile', task ':floating:compileDebugLibraryResources', task ':floating:parseDebugLocalResources', task ':floating:generateDebugRFile', task ':flutter_displaymode:compileDebugLibraryResources', task ':flutter_displaymode:parseDebugLocalResources', task ':flutter_displaymode:generateDebugRFile', task ':flutter_plugin_android_lifecycle:compileDebugLibraryResources', task ':flutter_plugin_android_lifecycle:parseDebugLocalResources', task ':flutter_plugin_android_lifecycle:generateDebugRFile', task ':flutter_secure_storage:compileDebugLibraryResources', task ':flutter_secure_storage:parseDebugLocalResources', task ':flutter_secure_storage:generateDebugRFile', task ':google_api_availability_android:compileDebugLibraryResources', task ':google_api_availability_android:parseDebugLocalResources', task ':google_api_availability_android:generateDebugRFile', task ':google_cast:compileDebugLibraryResources', task ':google_cast:parseDebugLocalResources', task ':google_cast:generateDebugRFile', task ':google_maps_flutter_android:compileDebugLibraryResources', task ':google_maps_flutter_android:parseDebugLocalResources', task ':google_maps_flutter_android:generateDebugRFile', task ':jni:compileDebugLibraryResources', task ':jni:parseDebugLocalResources', task ':jni:generateDebugRFile', task ':jni_flutter:compileDebugLibraryResources', task ':jni_flutter:parseDebugLocalResources', task ':jni_flutter:generateDebugRFile', task ':local_auth_android:compileDebugLibraryResources', task ':local_auth_android:parseDebugLocalResources', task ':local_auth_android:generateDebugRFile', task ':media_kit_libs_android_video:compileDebugLibraryResources', task ':media_kit_libs_android_video:parseDebugLocalResources', task ':media_kit_libs_android_video:generateDebugRFile', task ':media_kit_video:compileDebugLibraryResources', task ':media_kit_video:parseDebugLocalResources', task ':media_kit_video:generateDebugRFile', task ':network_info_plus:compileDebugLibraryResources', task ':network_info_plus:parseDebugLocalResources', task ':network_info_plus:generateDebugRFile', task ':package_info_plus:compileDebugLibraryResources', task ':package_info_plus:parseDebugLocalResources', task ':package_info_plus:generateDebugRFile', task ':permission_handler_android:compileDebugLibraryResources', task ':permission_handler_android:parseDebugLocalResources', task ':permission_handler_android:generateDebugRFile', task ':printing:compileDebugLibraryResources', task ':printing:parseDebugLocalResources', task ':printing:generateDebugRFile', task ':screen_brightness_android:compileDebugLibraryResources', task ':screen_brightness_android:parseDebugLocalResources', task ':screen_brightness_android:generateDebugRFile', task ':shared_preferences_android:compileDebugLibraryResources', task ':shared_preferences_android:parseDebugLocalResources', task ':shared_preferences_android:generateDebugRFile', task ':sqflite_android:compileDebugLibraryResources', task ':sqflite_android:parseDebugLocalResources', task ':sqflite_android:generateDebugRFile', task ':streams_channel:compileDebugLibraryResources', task ':streams_channel:parseDebugLocalResources', task ':streams_channel:generateDebugRFile', task ':url_launcher_android:compileDebugLibraryResources', task ':url_launcher_android:parseDebugLocalResources', task ':url_launcher_android:generateDebugRFile', task ':video_player_android:compileDebugLibraryResources', task ':video_player_android:parseDebugLocalResources', task ':video_player_android:generateDebugRFile', task ':volume_controller:compileDebugLibraryResources', task ':volume_controller:parseDebugLocalResources', task ':volume_controller:generateDebugRFile', task ':wakelock_plus:compileDebugLibraryResources', task ':wakelock_plus:parseDebugLocalResources', task ':wakelock_plus:generateDebugRFile', task ':app:processPlayDebugResources', task ':aves_screen_state:checkKotlinGradlePluginConfigurationErrors', task ':aves_screen_state:compileDebugKotlin', task ':aves_screen_state:javaPreCompileDebug', task ':aves_screen_state:compileDebugJavaWithJavac', task ':aves_screen_state:bundleLibCompileToJarDebug', task ':connectivity_plus:javaPreCompileDebug', task ':connectivity_plus:compileDebugJavaWithJavac', task ':connectivity_plus:bundleLibCompileToJarDebug', task ':dchs_motion_sensors:checkKotlinGradlePluginConfigurationErrors', task ':dchs_motion_sensors:compileDebugKotlin', task ':dchs_motion_sensors:javaPreCompileDebug', task ':dchs_motion_sensors:compileDebugJavaWithJavac', task ':dchs_motion_sensors:bundleLibCompileToJarDebug', task ':device_info_plus:checkKotlinGradlePluginConfigurationErrors', task ':device_info_plus:compileDebugKotlin', task ':device_info_plus:javaPreCompileDebug', task ':device_info_plus:compileDebugJavaWithJavac', task ':device_info_plus:bundleLibCompileToJarDebug', task ':dynamic_color:checkKotlinGradlePluginConfigurationErrors', task ':dynamic_color:compileDebugKotlin', task ':dynamic_color:javaPreCompileDebug', task ':dynamic_color:compileDebugJavaWithJavac', task ':dynamic_color:bundleLibCompileToJarDebug', task ':exifinterface:javaPreCompileDebug', task ':exifinterface:compileDebugJavaWithJavac', task ':exifinterface:bundleLibCompileToJarDebug', task ':firebase_core:generateDebugBuildConfig', task ':firebase_core:javaPreCompileDebug', task ':firebase_core:compileDebugJavaWithJavac', task ':firebase_core:bundleLibCompileToJarDebug', task ':firebase_crashlytics:generateDebugBuildConfig', task ':firebase_crashlytics:javaPreCompileDebug', task ':firebase_crashlytics:compileDebugJavaWithJavac', task ':firebase_crashlytics:bundleLibCompileToJarDebug', task ':floating:checkKotlinGradlePluginConfigurationErrors', task ':floating:compileDebugKotlin', task ':floating:javaPreCompileDebug', task ':floating:compileDebugJavaWithJavac', task ':floating:bundleLibCompileToJarDebug', task ':flutter_displaymode:javaPreCompileDebug', task ':flutter_displaymode:compileDebugJavaWithJavac', task ':flutter_displaymode:bundleLibCompileToJarDebug', task ':flutter_plugin_android_lifecycle:javaPreCompileDebug', task ':flutter_plugin_android_lifecycle:compileDebugJavaWithJavac', task ':flutter_plugin_android_lifecycle:bundleLibCompileToJarDebug', task ':flutter_secure_storage:generateDebugBuildConfig', task ':flutter_secure_storage:javaPreCompileDebug', task ':flutter_secure_storage:compileDebugJavaWithJavac', task ':flutter_secure_storage:bundleLibCompileToJarDebug', task ':google_api_availability_android:javaPreCompileDebug', task ':google_api_availability_android:compileDebugJavaWithJavac', task ':google_api_availability_android:bundleLibCompileToJarDebug', task ':google_cast:javaPreCompileDebug', task ':google_cast:compileDebugJavaWithJavac', task ':google_cast:bundleLibCompileToJarDebug', task ':google_maps_flutter_android:checkKotlinGradlePluginConfigurationErrors', task ':google_maps_flutter_android:compileDebugKotlin', task ':google_maps_flutter_android:javaPreCompileDebug', task ':google_maps_flutter_android:compileDebugJavaWithJavac', task ':google_maps_flutter_android:bundleLibCompileToJarDebug', task ':jni:javaPreCompileDebug', task ':jni:compileDebugJavaWithJavac', task ':jni:bundleLibCompileToJarDebug', task ':jni_flutter:javaPreCompileDebug', task ':jni_flutter:compileDebugJavaWithJavac', task ':jni_flutter:bundleLibCompileToJarDebug', task ':local_auth_android:checkKotlinGradlePluginConfigurationErrors', task ':local_auth_android:compileDebugKotlin', task ':local_auth_android:javaPreCompileDebug', task ':local_auth_android:compileDebugJavaWithJavac', task ':local_auth_android:bundleLibCompileToJarDebug', task ':media_kit_libs_android_video:javaPreCompileDebug', task ':media_kit_libs_android_video:compileDebugJavaWithJavac', task ':media_kit_libs_android_video:bundleLibCompileToJarDebug', task ':media_kit_video:javaPreCompileDebug', task ':package_info_plus:checkKotlinGradlePluginConfigurationErrors', task ':package_info_plus:compileDebugKotlin', task ':package_info_plus:javaPreCompileDebug', task ':package_info_plus:compileDebugJavaWithJavac', task ':package_info_plus:bundleLibCompileToJarDebug', task ':wakelock_plus:checkKotlinGradlePluginConfigurationErrors', task ':wakelock_plus:compileDebugKotlin', task ':wakelock_plus:javaPreCompileDebug', task ':wakelock_plus:compileDebugJavaWithJavac', task ':wakelock_plus:bundleLibCompileToJarDebug', task ':media_kit_video:compileDebugJavaWithJavac', task ':media_kit_video:bundleLibCompileToJarDebug', task ':network_info_plus:checkKotlinGradlePluginConfigurationErrors', task ':network_info_plus:compileDebugKotlin', task ':network_info_plus:javaPreCompileDebug', task ':network_info_plus:compileDebugJavaWithJavac', task ':network_info_plus:bundleLibCompileToJarDebug', task ':permission_handler_android:javaPreCompileDebug', task ':permission_handler_android:compileDebugJavaWithJavac', task ':permission_handler_android:bundleLibCompileToJarDebug', task ':printing:javaPreCompileDebug', task ':printing:compileDebugJavaWithJavac', task ':printing:bundleLibCompileToJarDebug', task ':screen_brightness_android:checkKotlinGradlePluginConfigurationErrors', task ':screen_brightness_android:compileDebugKotlin', task ':screen_brightness_android:javaPreCompileDebug', task ':screen_brightness_android:compileDebugJavaWithJavac', task ':screen_brightness_android:bundleLibCompileToJarDebug', task ':shared_preferences_android:checkKotlinGradlePluginConfigurationErrors', task ':shared_preferences_android:compileDebugKotlin', task ':shared_preferences_android:javaPreCompileDebug', task ':shared_preferences_android:compileDebugJavaWithJavac', task ':shared_preferences_android:bundleLibCompileToJarDebug', task ':sqflite_android:javaPreCompileDebug', task ':sqflite_android:compileDebugJavaWithJavac', task ':sqflite_android:bundleLibCompileToJarDebug', task ':streams_channel:javaPreCompileDebug', task ':streams_channel:compileDebugJavaWithJavac', task ':streams_channel:bundleLibCompileToJarDebug', task ':url_launcher_android:generateDebugBuildConfig', task ':url_launcher_android:javaPreCompileDebug', task ':url_launcher_android:compileDebugJavaWithJavac', task ':url_launcher_android:bundleLibCompileToJarDebug', task ':video_player_android:checkKotlinGradlePluginConfigurationErrors', task ':video_player_android:compileDebugKotlin', task ':video_player_android:javaPreCompileDebug', task ':video_player_android:compileDebugJavaWithJavac', task ':video_player_android:bundleLibCompileToJarDebug', task ':volume_controller:checkKotlinGradlePluginConfigurationErrors', task ':volume_controller:compileDebugKotlin', task ':volume_controller:javaPreCompileDebug', task ':volume_controller:compileDebugJavaWithJavac', task ':volume_controller:bundleLibCompileToJarDebug', task ':app:kspPlayDebugKotlin', task ':app:compilePlayDebugKotlin', task ':app:javaPreCompilePlayDebug', task ':app:compilePlayDebugJavaWithJavac', task ':app:compressPlayDebugAssets', task ':app:l8DexDesugarLibPlayDebug', task ':app:checkPlayDebugDuplicateClasses', task ':app:desugarPlayDebugFileDependencies', task ':app:mergeExtDexPlayDebug', task ':aves_screen_state:bundleLibRuntimeToDirDebug', task ':connectivity_plus:bundleLibRuntimeToDirDebug', task ':dchs_motion_sensors:bundleLibRuntimeToDirDebug', task ':device_info_plus:bundleLibRuntimeToDirDebug', task ':dynamic_color:bundleLibRuntimeToDirDebug', task ':firebase_crashlytics:bundleLibRuntimeToDirDebug', task ':firebase_core:bundleLibRuntimeToDirDebug', task ':floating:bundleLibRuntimeToDirDebug', task ':flutter_displaymode:bundleLibRuntimeToDirDebug', task ':google_maps_flutter_android:bundleLibRuntimeToDirDebug', task ':local_auth_android:bundleLibRuntimeToDirDebug', task ':flutter_plugin_android_lifecycle:bundleLibRuntimeToDirDebug', task ':flutter_secure_storage:bundleLibRuntimeToDirDebug', task ':google_api_availability_android:bundleLibRuntimeToDirDebug', task ':google_cast:bundleLibRuntimeToDirDebug', task ':jni_flutter:bundleLibRuntimeToDirDebug', task ':jni:bundleLibRuntimeToDirDebug', task ':media_kit_libs_android_video:bundleLibRuntimeToDirDebug', task ':media_kit_video:bundleLibRuntimeToDirDebug', task ':network_info_plus:bundleLibRuntimeToDirDebug', task ':wakelock_plus:bundleLibRuntimeToDirDebug', task ':package_info_plus:bundleLibRuntimeToDirDebug', task ':permission_handler_android:bundleLibRuntimeToDirDebug', task ':printing:bundleLibRuntimeToDirDebug', task ':screen_brightness_android:bundleLibRuntimeToDirDebug', task ':shared_preferences_android:bundleLibRuntimeToDirDebug', task ':sqflite_android:bundleLibRuntimeToDirDebug', task ':streams_channel:bundleLibRuntimeToDirDebug', task ':url_launcher_android:bundleLibRuntimeToDirDebug', task ':video_player_android:bundleLibRuntimeToDirDebug', task ':volume_controller:bundleLibRuntimeToDirDebug', task ':exifinterface:bundleLibRuntimeToDirDebug', task ':app:mergeLibDexPlayDebug', task ':aves_screen_state:bundleLibRuntimeToJarDebug', task ':connectivity_plus:bundleLibRuntimeToJarDebug', task ':dchs_motion_sensors:bundleLibRuntimeToJarDebug', task ':device_info_plus:bundleLibRuntimeToJarDebug', task ':dynamic_color:bundleLibRuntimeToJarDebug', task ':firebase_crashlytics:bundleLibRuntimeToJarDebug', task ':firebase_core:bundleLibRuntimeToJarDebug', task ':floating:bundleLibRuntimeToJarDebug', task ':flutter_displaymode:bundleLibRuntimeToJarDebug', task ':google_maps_flutter_android:bundleLibRuntimeToJarDebug', task ':local_auth_android:bundleLibRuntimeToJarDebug', task ':flutter_plugin_android_lifecycle:bundleLibRuntimeToJarDebug', task ':flutter_secure_storage:bundleLibRuntimeToJarDebug', task ':google_api_availability_android:bundleLibRuntimeToJarDebug', task ':google_cast:bundleLibRuntimeToJarDebug', task ':jni_flutter:bundleLibRuntimeToJarDebug', task ':jni:bundleLibRuntimeToJarDebug', task ':media_kit_libs_android_video:bundleLibRuntimeToJarDebug', task ':media_kit_video:bundleLibRuntimeToJarDebug', task ':network_info_plus:bundleLibRuntimeToJarDebug', task ':wakelock_plus:bundleLibRuntimeToJarDebug', task ':package_info_plus:bundleLibRuntimeToJarDebug', task ':permission_handler_android:bundleLibRuntimeToJarDebug', task ':printing:bundleLibRuntimeToJarDebug', task ':screen_brightness_android:bundleLibRuntimeToJarDebug', task ':shared_preferences_android:bundleLibRuntimeToJarDebug', task ':sqflite_android:bundleLibRuntimeToJarDebug', task ':streams_channel:bundleLibRuntimeToJarDebug', task ':url_launcher_android:bundleLibRuntimeToJarDebug', task ':video_player_android:bundleLibRuntimeToJarDebug', task ':volume_controller:bundleLibRuntimeToJarDebug', task ':exifinterface:bundleLibRuntimeToJarDebug', task ':app:dexBuilderPlayDebug', task ':app:mergePlayDebugGlobalSynthetics', task ':app:processPlayDebugJavaRes', task ':aves_screen_state:processDebugJavaRes', task ':connectivity_plus:processDebugJavaRes', task ':dchs_motion_sensors:processDebugJavaRes', task ':device_info_plus:processDebugJavaRes', task ':dynamic_color:processDebugJavaRes', task ':exifinterface:processDebugJavaRes', task ':firebase_core:processDebugJavaRes', task ':firebase_crashlytics:processDebugJavaRes', task ':floating:processDebugJavaRes', task ':flutter_displaymode:processDebugJavaRes', task ':flutter_plugin_android_lifecycle:processDebugJavaRes', task ':flutter_secure_storage:processDebugJavaRes', task ':google_api_availability_android:processDebugJavaRes', task ':google_cast:processDebugJavaRes', task ':google_maps_flutter_android:processDebugJavaRes', task ':jni:processDebugJavaRes', task ':jni_flutter:processDebugJavaRes', task ':local_auth_android:processDebugJavaRes', task ':media_kit_libs_android_video:processDebugJavaRes', task ':media_kit_video:processDebugJavaRes', task ':network_info_plus:processDebugJavaRes', task ':package_info_plus:processDebugJavaRes', task ':permission_handler_android:processDebugJavaRes', task ':printing:processDebugJavaRes', task ':screen_brightness_android:processDebugJavaRes', task ':shared_preferences_android:processDebugJavaRes', task ':sqflite_android:processDebugJavaRes', task ':streams_channel:processDebugJavaRes', task ':url_launcher_android:processDebugJavaRes', task ':video_player_android:processDebugJavaRes', task ':volume_controller:processDebugJavaRes', task ':wakelock_plus:processDebugJavaRes', task ':app:mergePlayDebugJavaResource', task ':app:mergeProjectDexPlayDebug', task ':app:compileFlutterBuildLibre_romDebug', task ':app:packJniLibsflutterBuildLibre_romDebug', task ':app:preLibre_romDebugBuild', task ':app:configureCMakeDebug[arm64-v8a]', task ':app:buildCMakeDebug[arm64-v8a]', task ':app:configureCMakeDebug[armeabi-v7a]', task ':app:buildCMakeDebug[armeabi-v7a]', task ':app:configureCMakeDebug[x86_64]', task ':app:buildCMakeDebug[x86_64]', task ':app:mergePlayDebugJniLibFolders', task ':aves_screen_state:mergeDebugJniLibFolders', task ':aves_screen_state:mergeDebugNativeLibs', task ':aves_screen_state:copyDebugJniLibsProjectOnly', task ':connectivity_plus:mergeDebugJniLibFolders', task ':connectivity_plus:mergeDebugNativeLibs', task ':connectivity_plus:copyDebugJniLibsProjectOnly', task ':dchs_motion_sensors:mergeDebugJniLibFolders', task ':dchs_motion_sensors:mergeDebugNativeLibs', task ':dchs_motion_sensors:copyDebugJniLibsProjectOnly', task ':device_info_plus:mergeDebugJniLibFolders', task ':device_info_plus:mergeDebugNativeLibs', task ':device_info_plus:copyDebugJniLibsProjectOnly', task ':dynamic_color:mergeDebugJniLibFolders', task ':dynamic_color:mergeDebugNativeLibs', task ':dynamic_color:copyDebugJniLibsProjectOnly', task ':exifinterface:mergeDebugJniLibFolders', task ':exifinterface:mergeDebugNativeLibs', task ':exifinterface:copyDebugJniLibsProjectOnly', task ':firebase_core:mergeDebugJniLibFolders', task ':firebase_core:mergeDebugNativeLibs', task ':firebase_core:copyDebugJniLibsProjectOnly', task ':firebase_crashlytics:mergeDebugJniLibFolders', task ':firebase_crashlytics:mergeDebugNativeLibs', task ':firebase_crashlytics:copyDebugJniLibsProjectOnly', task ':floating:mergeDebugJniLibFolders', task ':floating:mergeDebugNativeLibs', task ':floating:copyDebugJniLibsProjectOnly', task ':flutter_displaymode:mergeDebugJniLibFolders', task ':flutter_displaymode:mergeDebugNativeLibs', task ':flutter_displaymode:copyDebugJniLibsProjectOnly', task ':flutter_plugin_android_lifecycle:mergeDebugJniLibFolders', task ':flutter_plugin_android_lifecycle:mergeDebugNativeLibs', task ':flutter_plugin_android_lifecycle:copyDebugJniLibsProjectOnly', task ':flutter_secure_storage:mergeDebugJniLibFolders', task ':flutter_secure_storage:mergeDebugNativeLibs', task ':flutter_secure_storage:copyDebugJniLibsProjectOnly', task ':google_api_availability_android:mergeDebugJniLibFolders', task ':google_api_availability_android:mergeDebugNativeLibs', task ':google_api_availability_android:copyDebugJniLibsProjectOnly', task ':google_cast:mergeDebugJniLibFolders', task ':google_cast:mergeDebugNativeLibs', task ':google_cast:copyDebugJniLibsProjectOnly', task ':google_maps_flutter_android:mergeDebugJniLibFolders', task ':google_maps_flutter_android:mergeDebugNativeLibs', task ':google_maps_flutter_android:copyDebugJniLibsProjectOnly', task ':jni:configureCMakeDebug[arm64-v8a]', task ':jni:buildCMakeDebug[arm64-v8a]', task ':jni:configureCMakeDebug[armeabi-v7a]', task ':jni:buildCMakeDebug[armeabi-v7a]', task ':jni:configureCMakeDebug[x86]', task ':jni:buildCMakeDebug[x86]', task ':jni:configureCMakeDebug[x86_64]', task ':jni:buildCMakeDebug[x86_64]', task ':jni:mergeDebugJniLibFolders', task ':jni:mergeDebugNativeLibs', task ':jni:copyDebugJniLibsProjectOnly', task ':jni_flutter:mergeDebugJniLibFolders', task ':jni_flutter:mergeDebugNativeLibs', task ':jni_flutter:copyDebugJniLibsProjectOnly', task ':local_auth_android:mergeDebugJniLibFolders', task ':local_auth_android:mergeDebugNativeLibs', task ':local_auth_android:copyDebugJniLibsProjectOnly', task ':media_kit_libs_android_video:mergeDebugJniLibFolders', task ':media_kit_libs_android_video:mergeDebugNativeLibs', task ':media_kit_libs_android_video:copyDebugJniLibsProjectOnly', task ':media_kit_video:mergeDebugJniLibFolders', task ':media_kit_video:mergeDebugNativeLibs', task ':media_kit_video:copyDebugJniLibsProjectOnly', task ':network_info_plus:mergeDebugJniLibFolders', task ':network_info_plus:mergeDebugNativeLibs', task ':network_info_plus:copyDebugJniLibsProjectOnly', task ':package_info_plus:mergeDebugJniLibFolders', task ':package_info_plus:mergeDebugNativeLibs', task ':package_info_plus:copyDebugJniLibsProjectOnly', task ':permission_handler_android:mergeDebugJniLibFolders', task ':permission_handler_android:mergeDebugNativeLibs', task ':permission_handler_android:copyDebugJniLibsProjectOnly', task ':printing:mergeDebugJniLibFolders', task ':printing:mergeDebugNativeLibs', task ':printing:copyDebugJniLibsProjectOnly', task ':screen_brightness_android:mergeDebugJniLibFolders', task ':screen_brightness_android:mergeDebugNativeLibs', task ':screen_brightness_android:copyDebugJniLibsProjectOnly', task ':shared_preferences_android:mergeDebugJniLibFolders', task ':shared_preferences_android:mergeDebugNativeLibs', task ':shared_preferences_android:copyDebugJniLibsProjectOnly', task ':sqflite_android:mergeDebugJniLibFolders', task ':sqflite_android:mergeDebugNativeLibs', task ':sqflite_android:copyDebugJniLibsProjectOnly', task ':streams_channel:mergeDebugJniLibFolders', task ':streams_channel:mergeDebugNativeLibs', task ':streams_channel:copyDebugJniLibsProjectOnly', task ':url_launcher_android:mergeDebugJniLibFolders', task ':url_launcher_android:mergeDebugNativeLibs', task ':url_launcher_android:copyDebugJniLibsProjectOnly', task ':video_player_android:mergeDebugJniLibFolders', task ':video_player_android:mergeDebugNativeLibs', task ':video_player_android:copyDebugJniLibsProjectOnly', task ':volume_controller:mergeDebugJniLibFolders', task ':volume_controller:mergeDebugNativeLibs', task ':volume_controller:copyDebugJniLibsProjectOnly', task ':wakelock_plus:mergeDebugJniLibFolders', task ':wakelock_plus:mergeDebugNativeLibs', task ':wakelock_plus:copyDebugJniLibsProjectOnly', task ':app:mergePlayDebugNativeLibs', task ':app:stripPlayDebugDebugSymbols', task ':app:validateSigningPlayDebug', task ':app:writePlayDebugAppMetadata', task ':app:writePlayDebugSigningConfigVersions', task ':app:packagePlayDebug', task ':app:createPlayDebugApkListingFileRedirect', task ':app:assemblePlayDebug'] +Resolve mutations for :app:checkKotlinGradlePluginConfigurationErrors (Thread[#475,Execution worker Thread 3,5,main]) started. +:app:checkKotlinGradlePluginConfigurationErrors (Thread[#475,Execution worker Thread 3,5,main]) started. +> Task :app:checkKotlinGradlePluginConfigurationErrors SKIPPED +Skipping task ':app:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +lib/main.dart: Error: Error when reading 'lib/main.dart': No such file or directory +Target kernel_snapshot_program failed: Exception +FAILURE: Build failed with an exception. +* Exception is: +org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileFlutterBuildPlayDebug'. + at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) +Caused by: org.gradle.process.internal.ExecException: Process 'command '/Users/fabio/fvm/versions/3.35.7/bin/flutter'' finished with non-zero exit value 1 + at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts new file mode 100644 index 0000000..b22abe9 --- /dev/null +++ b/android/settings.gradle.kts @@ -0,0 +1,30 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" + id("com.android.application") version "8.13.2" apply false + id("org.jetbrains.kotlin.android") version "2.3.0" apply false +} + + +include(":app") +include(":exifinterface") +include(":google_cast") +project(":google_cast").projectDir = File(rootDir, "../plugins/google_cast/android") diff --git a/apk.sh b/apk.sh new file mode 100644 index 0000000..dfecaaf --- /dev/null +++ b/apk.sh @@ -0,0 +1 @@ +fvm flutter build apk --debug -t lib/main_play.dart --flavor play diff --git a/assets/countries-50m.json b/assets/countries-50m.json new file mode 100644 index 0000000..a7a8c4c --- /dev/null +++ b/assets/countries-50m.json @@ -0,0 +1 @@ +{"type":"Topology","objects":{"countries":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[0,1,2,3]],"id":"716","properties":{"name":"Zimbabwe"}},{"type":"Polygon","arcs":[[-3,4,5,6,7,8,9]],"id":"894","properties":{"name":"Zambia"}},{"type":"MultiPolygon","arcs":[[[10,11,12]],[[13]],[[14]],[[15]],[[16]]],"id":"887","properties":{"name":"Yemen"}},{"type":"MultiPolygon","arcs":[[[17]],[[18,19,20,21]],[[22]],[[23]],[[24]],[[25]],[[26]],[[27]]],"id":"704","properties":{"name":"Vietnam"}},{"type":"MultiPolygon","arcs":[[[28]],[[29]],[[30]],[[31]],[[32,33,34,35]]],"id":"862","properties":{"name":"Venezuela"}},{"type":"Polygon","arcs":[[36]],"id":"336","properties":{"name":"Vatican"}},{"type":"MultiPolygon","arcs":[[[37]],[[38]],[[39]],[[40]],[[41]],[[42]],[[43]],[[44]],[[45]],[[46]],[[47]],[[48]],[[49]],[[50]]],"id":"548","properties":{"name":"Vanuatu"}},{"type":"MultiPolygon","arcs":[[[51,52,53,54,55],[56]],[[57]],[[58]]],"id":"860","properties":{"name":"Uzbekistan"}},{"type":"Polygon","arcs":[[59,60,61]],"id":"858","properties":{"name":"Uruguay"}},{"type":"MultiPolygon","arcs":[[[62]],[[63]],[[64]],[[65]],[[66]]],"id":"583","properties":{"name":"Micronesia"}},{"type":"MultiPolygon","arcs":[[[67]],[[68]],[[69]],[[70]],[[71]]],"id":"584","properties":{"name":"Marshall Is."}},{"type":"MultiPolygon","arcs":[[[72]],[[73]],[[74]],[[75]],[[76]],[[77]]],"id":"580","properties":{"name":"N. Mariana Is."}},{"type":"MultiPolygon","arcs":[[[78]],[[79]],[[80]]],"id":"850","properties":{"name":"U.S. Virgin Is."}},{"type":"Polygon","arcs":[[81]],"id":"316","properties":{"name":"Guam"}},{"type":"Polygon","arcs":[[82]],"id":"016","properties":{"name":"American Samoa"}},{"type":"MultiPolygon","arcs":[[[83]],[[84]],[[85]]],"id":"630","properties":{"name":"Puerto Rico"}},{"type":"MultiPolygon","arcs":[[[86]],[[87]],[[88]],[[89]],[[90]],[[91]],[[92]],[[93]],[[94]],[[95]],[[96]],[[97]],[[98]],[[99]],[[100]],[[101]],[[102,103,104,105]],[[106]],[[107]],[[108]],[[109]],[[110]],[[111]],[[112]],[[113]],[[114]],[[115]],[[116]],[[117]],[[118]],[[119]],[[120]],[[121]],[[122]],[[123]],[[124]],[[125]],[[126]],[[127]],[[128]],[[129]],[[130]],[[131]],[[132]],[[133]],[[134]],[[135]],[[136]],[[137]],[[138]],[[139]],[[140]],[[141]],[[142]],[[143]],[[144]],[[145]],[[146]],[[147]],[[148]],[[149]],[[150]],[[151]],[[152]],[[153]],[[154]],[[155]],[[156]],[[157]],[[158]],[[159]],[[160]],[[161]],[[162]],[[163]],[[164,165,166,167,168]],[[169]],[[170]],[[171]],[[172]],[[173]],[[174]],[[175]],[[176]],[[177]],[[178]],[[179]],[[180]],[[181]],[[182]],[[183]],[[184]],[[185]],[[186]],[[187]],[[188]],[[189]],[[190]],[[191]],[[192]],[[193]],[[194]],[[195]],[[196]],[[197]],[[198]],[[199]],[[200]],[[201]],[[202]],[[203]],[[204]],[[205]],[[206]],[[207]],[[208]],[[209]],[[210]],[[211]],[[212]],[[213]],[[214]],[[215]],[[216]],[[217]],[[218]],[[219]]],"id":"840","properties":{"name":"United States of America"}},{"type":"MultiPolygon","arcs":[[[220]],[[221]]],"id":"239","properties":{"name":"S. Geo. and the Is."}},{"type":"Polygon","arcs":[[222]],"id":"086","properties":{"name":"Br. Indian Ocean Ter."}},{"type":"MultiPolygon","arcs":[[[223]],[[224]]],"id":"654","properties":{"name":"Saint Helena"}},{"type":"Polygon","arcs":[[225]],"id":"612","properties":{"name":"Pitcairn Is."}},{"type":"Polygon","arcs":[[226]],"id":"660","properties":{"name":"Anguilla"}},{"type":"MultiPolygon","arcs":[[[227]],[[228]],[[229]],[[230]],[[231]],[[232]]],"id":"238","properties":{"name":"Falkland Is."}},{"type":"MultiPolygon","arcs":[[[233]],[[234]],[[235]]],"id":"136","properties":{"name":"Cayman Is."}},{"type":"Polygon","arcs":[[236]],"id":"060","properties":{"name":"Bermuda"}},{"type":"MultiPolygon","arcs":[[[237]],[[238]],[[239]]],"id":"092","properties":{"name":"British Virgin Is."}},{"type":"MultiPolygon","arcs":[[[240]],[[241]],[[242]]],"id":"796","properties":{"name":"Turks and Caicos Is."}},{"type":"Polygon","arcs":[[243]],"id":"500","properties":{"name":"Montserrat"}},{"type":"Polygon","arcs":[[244]],"id":"832","properties":{"name":"Jersey"}},{"type":"Polygon","arcs":[[245]],"id":"831","properties":{"name":"Guernsey"}},{"type":"Polygon","arcs":[[246]],"id":"833","properties":{"name":"Isle of Man"}},{"type":"MultiPolygon","arcs":[[[247]],[[248]],[[249]],[[250]],[[251]],[[252]],[[253]],[[254]],[[255]],[[256]],[[257]],[[258]],[[259]],[[260]],[[261]],[[262]],[[263]],[[264]],[[265]],[[266]],[[267]],[[268,269]],[[270]]],"id":"826","properties":{"name":"United Kingdom"}},{"type":"MultiPolygon","arcs":[[[271,272,273,274,275],[276]],[[277]],[[278]],[[279]],[[280]]],"id":"784","properties":{"name":"United Arab Emirates"}},{"type":"MultiPolygon","arcs":[[[281,282,283,284,285,286,287,288,289,290,291]],[[292]]],"id":"804","properties":{"name":"Ukraine"}},{"type":"Polygon","arcs":[[293,294,295,296,297]],"id":"800","properties":{"name":"Uganda"}},{"type":"MultiPolygon","arcs":[[[298]],[[-55,299,300,301,302]]],"id":"795","properties":{"name":"Turkmenistan"}},{"type":"MultiPolygon","arcs":[[[303]],[[304,305,306,307,308,309,310]],[[311,312,313]]],"id":"792","properties":{"name":"Turkey"}},{"type":"MultiPolygon","arcs":[[[314,315,316]],[[317]],[[318]]],"id":"788","properties":{"name":"Tunisia"}},{"type":"MultiPolygon","arcs":[[[319]],[[320]]],"id":"780","properties":{"name":"Trinidad and Tobago"}},{"type":"MultiPolygon","arcs":[[[321]],[[322]],[[323]]],"id":"776","properties":{"name":"Tonga"}},{"type":"Polygon","arcs":[[324,325,326,327]],"id":"768","properties":{"name":"Togo"}},{"type":"MultiPolygon","arcs":[[[328]],[[329,330]],[[331,332]]],"id":"626","properties":{"name":"Timor-Leste"}},{"type":"MultiPolygon","arcs":[[[333]],[[334]],[[335]],[[336,337,338,339,340,341]],[[342]],[[343]],[[344]],[[345]],[[346]],[[347]]],"id":"764","properties":{"name":"Thailand"}},{"type":"MultiPolygon","arcs":[[[348]],[[349]],[[-8,350,351,352,-294,353,354,355,356]],[[357]]],"id":"834","properties":{"name":"Tanzania"}},{"type":"MultiPolygon","arcs":[[[-53,358,359,360]],[[-57]],[[361]]],"id":"762","properties":{"name":"Tajikistan"}},{"type":"MultiPolygon","arcs":[[[362]],[[363]]],"id":"158","properties":{"name":"Taiwan"}},{"type":"Polygon","arcs":[[-310,364,365,366,367,368]],"id":"760","properties":{"name":"Syria"}},{"type":"Polygon","arcs":[[369,370,371,372,373,374]],"id":"756","properties":{"name":"Switzerland"}},{"type":"MultiPolygon","arcs":[[[375]],[[376]],[[377,378,379]],[[380]],[[381]],[[382]]],"id":"752","properties":{"name":"Sweden"}},{"type":"Polygon","arcs":[[383,384]],"id":"748","properties":{"name":"eSwatini"}},{"type":"Polygon","arcs":[[385,386,387,388]],"id":"740","properties":{"name":"Suriname"}},{"type":"Polygon","arcs":[[-297,389,390,391,392,393]],"id":"728","properties":{"name":"S. Sudan"}},{"type":"Polygon","arcs":[[-392,394,395,396,397,398,399,400]],"id":"729","properties":{"name":"Sudan"}},{"type":"MultiPolygon","arcs":[[[401]],[[402]],[[403]]],"id":"144","properties":{"name":"Sri Lanka"}},{"type":"MultiPolygon","arcs":[[[404]],[[405]],[[406]],[[407]],[[408,409,410,411,412,413]],[[414]],[[415]],[[416]],[[417]],[[418]],[[419]],[[420]]],"id":"724","properties":{"name":"Spain"}},{"type":"MultiPolygon","arcs":[[[421,422]],[[423]],[[424]],[[425]],[[426]],[[427]],[[428]],[[429]],[[430]],[[431]],[[432]]],"id":"410","properties":{"name":"South Korea"}},{"type":"MultiPolygon","arcs":[[[-1,433,-385,434,435,436,437],[438]],[[439]]],"id":"710","properties":{"name":"South Africa"}},{"type":"Polygon","arcs":[[440,441,442,443]],"id":"706","properties":{"name":"Somalia"}},{"type":"Polygon","arcs":[[-443,444,445,446]],"properties":{"name":"Somaliland"}},{"type":"MultiPolygon","arcs":[[[447]],[[448]],[[449]],[[450]],[[451]],[[452]],[[453]],[[454]],[[455]],[[456]],[[457]],[[458]],[[459]],[[460]],[[461]],[[462]],[[463]],[[464]],[[465]],[[466]],[[467]]],"id":"090","properties":{"name":"Solomon Is."}},{"type":"Polygon","arcs":[[-289,468,469,470,471]],"id":"703","properties":{"name":"Slovakia"}},{"type":"Polygon","arcs":[[472,473,474,475,476]],"id":"705","properties":{"name":"Slovenia"}},{"type":"Polygon","arcs":[[477]],"id":"702","properties":{"name":"Singapore"}},{"type":"MultiPolygon","arcs":[[[478,479,480]],[[481]]],"id":"694","properties":{"name":"Sierra Leone"}},{"type":"Polygon","arcs":[[482]],"id":"690","properties":{"name":"Seychelles"}},{"type":"Polygon","arcs":[[483,484,485,486,487,488,489,490]],"id":"688","properties":{"name":"Serbia"}},{"type":"Polygon","arcs":[[491,492,493,494,495,496,497]],"id":"686","properties":{"name":"Senegal"}},{"type":"MultiPolygon","arcs":[[[498]],[[499]],[[-12,500,501,502,503,504,505,506,-274,507]],[[508]]],"id":"682","properties":{"name":"Saudi Arabia"}},{"type":"MultiPolygon","arcs":[[[509]],[[510]]],"id":"678","properties":{"name":"São Tomé and Principe"}},{"type":"Polygon","arcs":[[511]],"id":"674","properties":{"name":"San Marino"}},{"type":"MultiPolygon","arcs":[[[512]],[[513]]],"id":"882","properties":{"name":"Samoa"}},{"type":"MultiPolygon","arcs":[[[514]],[[515]],[[516]]],"id":"670","properties":{"name":"St. Vin. and Gren."}},{"type":"Polygon","arcs":[[517]],"id":"662","properties":{"name":"Saint Lucia"}},{"type":"MultiPolygon","arcs":[[[518]],[[519]]],"id":"659","properties":{"name":"St. Kitts and Nevis"}},{"type":"Polygon","arcs":[[-295,-353,520,521]],"id":"646","properties":{"name":"Rwanda"}},{"type":"MultiPolygon","arcs":[[[522]],[[523]],[[524]],[[525]],[[526]],[[527]],[[528]],[[529]],[[530]],[[531]],[[532]],[[533]],[[534]],[[535]],[[536]],[[537]],[[538]],[[539,540,541,542,543,544,545,546,547,-292,548,549,550,551,552,553,554]],[[555]],[[556]],[[557]],[[558]],[[559]],[[560]],[[561]],[[562]],[[563]],[[564]],[[565]],[[566]],[[567]],[[568]],[[569]],[[570]],[[571]],[[572]],[[573]],[[574]],[[575]],[[576]],[[577]],[[578]],[[579]],[[580]],[[581]],[[582]],[[583]],[[584]],[[585]],[[586]],[[587]],[[588]],[[589]],[[590]],[[591]],[[592]],[[593]],[[594]],[[595]],[[596]],[[597]],[[598]],[[599]],[[600]],[[601]],[[602]],[[603]],[[604]],[[605]],[[606]],[[607]],[[608]],[[609]],[[610]],[[611]],[[612]],[[613]],[[614]],[[615]],[[616]],[[617]],[[618]],[[619]],[[620]],[[621]],[[622]],[[623]],[[624]],[[625]],[[626]],[[627]],[[628]],[[629]],[[630]],[[631]],[[632]],[[633]],[[634,635,636,637,638]],[[-283,639]]],"id":"643","properties":{"name":"Russia"}},{"type":"Polygon","arcs":[[-285,640,641,-491,642,-287,643]],"id":"642","properties":{"name":"Romania"}},{"type":"Polygon","arcs":[[-506,644]],"id":"634","properties":{"name":"Qatar"}},{"type":"MultiPolygon","arcs":[[[645]],[[-413,646]],[[647]],[[648]],[[649]],[[650]],[[651]],[[652]],[[653]]],"id":"620","properties":{"name":"Portugal"}},{"type":"Polygon","arcs":[[-290,-472,654,655,656,657,658,-637,659,660]],"id":"616","properties":{"name":"Poland"}},{"type":"MultiPolygon","arcs":[[[661]],[[662]],[[663]],[[664]],[[665]],[[666]],[[667]],[[668]],[[669]],[[670]],[[671]],[[672]],[[673]],[[674]],[[675]],[[676]],[[677]],[[678]],[[679]],[[680]],[[681]],[[682]],[[683]],[[684]],[[685]],[[686]],[[687]],[[688]],[[689]],[[690]],[[691]],[[692]],[[693]],[[694]],[[695]],[[696]],[[697]],[[698]],[[699]],[[700]],[[701]],[[702]],[[703]],[[704]],[[705]],[[706]],[[707]],[[708]]],"id":"608","properties":{"name":"Philippines"}},{"type":"Polygon","arcs":[[709,710,711,712,713,714]],"id":"604","properties":{"name":"Peru"}},{"type":"Polygon","arcs":[[715,716,717]],"id":"600","properties":{"name":"Paraguay"}},{"type":"MultiPolygon","arcs":[[[718]],[[719]],[[720,721]],[[722]],[[723]],[[724]],[[725]],[[726]],[[727]],[[728]],[[729]],[[730]],[[731]],[[732]],[[733]],[[734]],[[735]],[[736]],[[737]],[[738]],[[739]],[[740]],[[741]],[[742]],[[743]],[[744]]],"id":"598","properties":{"name":"Papua New Guinea"}},{"type":"MultiPolygon","arcs":[[[745,746,747,748]],[[749]],[[750]],[[751]],[[752]]],"id":"591","properties":{"name":"Panama"}},{"type":"MultiPolygon","arcs":[[[753]],[[754]]],"id":"585","properties":{"name":"Palau"}},{"type":"Polygon","arcs":[[755,756,757,758,759,760]],"id":"586","properties":{"name":"Pakistan"}},{"type":"MultiPolygon","arcs":[[[761]],[[-13,-508,-273,762]],[[-276,763]],[[-277]]],"id":"512","properties":{"name":"Oman"}},{"type":"MultiPolygon","arcs":[[[-378,764,-554,765]],[[766]],[[767]],[[768]],[[769]],[[770]],[[771]],[[772]],[[773]],[[774]],[[775]],[[776]],[[777]],[[778]],[[779]],[[780]],[[781]],[[782]],[[783]],[[784]],[[785]],[[786]],[[787]],[[788]],[[789]],[[790]],[[791]],[[792]],[[793]],[[794]],[[795]],[[796]]],"id":"578","properties":{"name":"Norway"}},{"type":"MultiPolygon","arcs":[[[-422,797,798,-540,799]],[[800]]],"id":"408","properties":{"name":"North Korea"}},{"type":"MultiPolygon","arcs":[[[801]],[[802,803,804,805,806]]],"id":"566","properties":{"name":"Nigeria"}},{"type":"Polygon","arcs":[[-807,807,808,809,810,811,812]],"id":"562","properties":{"name":"Niger"}},{"type":"Polygon","arcs":[[813,814,815,816]],"id":"558","properties":{"name":"Nicaragua"}},{"type":"MultiPolygon","arcs":[[[817]],[[818]],[[819]],[[820]],[[821]],[[822]],[[823]],[[824]],[[825]],[[826]],[[827]],[[828]],[[829]]],"id":"554","properties":{"name":"New Zealand"}},{"type":"Polygon","arcs":[[830]],"id":"570","properties":{"name":"Niue"}},{"type":"Polygon","arcs":[[831]],"id":"184","properties":{"name":"Cook Is."}},{"type":"MultiPolygon","arcs":[[[832,833,834]],[[835,836]],[[837]],[[838]],[[839]],[[840]],[[841]],[[842]],[[843]],[[844]],[[845]],[[846]]],"id":"528","properties":{"name":"Netherlands"}},{"type":"Polygon","arcs":[[847]],"id":"533","properties":{"name":"Aruba"}},{"type":"Polygon","arcs":[[848]],"id":"531","properties":{"name":"Curaçao"}},{"type":"Polygon","arcs":[[849,850]],"id":"524","properties":{"name":"Nepal"}},{"type":"Polygon","arcs":[[851]],"id":"520","properties":{"name":"Nauru"}},{"type":"Polygon","arcs":[[-5,852,-437,853,854]],"id":"516","properties":{"name":"Namibia"}},{"type":"Polygon","arcs":[[-4,-10,855,-356,856,-435,-384,-434],[857],[858]],"id":"508","properties":{"name":"Mozambique"}},{"type":"Polygon","arcs":[[859,860,861]],"id":"504","properties":{"name":"Morocco"}},{"type":"Polygon","arcs":[[862,863,864,-861]],"id":"732","properties":{"name":"W. Sahara"}},{"type":"Polygon","arcs":[[-487,865,866,867,868,869]],"id":"499","properties":{"name":"Montenegro"}},{"type":"Polygon","arcs":[[-542,870]],"id":"496","properties":{"name":"Mongolia"}},{"type":"Polygon","arcs":[[-286,-644]],"id":"498","properties":{"name":"Moldova"}},{"type":"Polygon","arcs":[[871,872]],"id":"492","properties":{"name":"Monaco"}},{"type":"MultiPolygon","arcs":[[[-167,873,874,875,876]],[[877]],[[878]],[[879]],[[880]],[[881]],[[882]],[[883]],[[884]],[[885]],[[886]],[[887]],[[888]],[[889]],[[890]],[[891]]],"id":"484","properties":{"name":"Mexico"}},{"type":"Polygon","arcs":[[892]],"id":"480","properties":{"name":"Mauritius"}},{"type":"MultiPolygon","arcs":[[[893]],[[-498,894,-864,895,896]]],"id":"478","properties":{"name":"Mauritania"}},{"type":"MultiPolygon","arcs":[[[897]],[[898]]],"id":"470","properties":{"name":"Malta"}},{"type":"Polygon","arcs":[[-492,-897,899,-810,900,901,902]],"id":"466","properties":{"name":"Mali"}},{"type":"MultiPolygon","arcs":[[[903]],[[904]]],"id":"462","properties":{"name":"Maldives"}},{"type":"MultiPolygon","arcs":[[[-340,905]],[[906,907,908,909,910]],[[911]],[[912]],[[913]],[[914]],[[915]],[[916]],[[917,918]]],"id":"458","properties":{"name":"Malaysia"}},{"type":"MultiPolygon","arcs":[[[-859]],[[-858]],[[-9,-357,-856]]],"id":"454","properties":{"name":"Malawi"}},{"type":"MultiPolygon","arcs":[[[919]],[[920]],[[921]]],"id":"450","properties":{"name":"Madagascar"}},{"type":"Polygon","arcs":[[-485,922,923,924,925]],"id":"807","properties":{"name":"Macedonia"}},{"type":"Polygon","arcs":[[926,927,928]],"id":"442","properties":{"name":"Luxembourg"}},{"type":"MultiPolygon","arcs":[[[-639,929]],[[-636,930,931,932,-660]]],"id":"440","properties":{"name":"Lithuania"}},{"type":"Polygon","arcs":[[-371,933]],"id":"438","properties":{"name":"Liechtenstein"}},{"type":"Polygon","arcs":[[-315,934,935,-397,936,-812,937]],"id":"434","properties":{"name":"Libya"}},{"type":"Polygon","arcs":[[-479,938,939,940]],"id":"430","properties":{"name":"Liberia"}},{"type":"Polygon","arcs":[[-439]],"id":"426","properties":{"name":"Lesotho"}},{"type":"Polygon","arcs":[[-368,941,942]],"id":"422","properties":{"name":"Lebanon"}},{"type":"Polygon","arcs":[[-932,943,944,-550,945]],"id":"428","properties":{"name":"Latvia"}},{"type":"Polygon","arcs":[[-21,946,-337,947,948]],"id":"418","properties":{"name":"Laos"}},{"type":"Polygon","arcs":[[-52,949,950,-359],[-58],[-59],[-362]],"id":"417","properties":{"name":"Kyrgyzstan"}},{"type":"MultiPolygon","arcs":[[[951]],[[-504,952,953]]],"id":"414","properties":{"name":"Kuwait"}},{"type":"Polygon","arcs":[[-486,-926,954,-866]],"properties":{"name":"Kosovo"}},{"type":"MultiPolygon","arcs":[[[955]],[[956]],[[957]],[[958]],[[959]],[[960]],[[961]],[[962]],[[963]],[[964]],[[965]],[[966]],[[967]],[[968]],[[969]],[[970]],[[971]],[[972]],[[973]]],"id":"296","properties":{"name":"Kiribati"}},{"type":"MultiPolygon","arcs":[[[974]],[[-298,-394,975,-441,976,-354]]],"id":"404","properties":{"name":"Kenya"}},{"type":"MultiPolygon","arcs":[[[977]],[[978]],[[979]],[[-56,-303,980,-544,981,-950]]],"id":"398","properties":{"name":"Kazakhstan"}},{"type":"Polygon","arcs":[[-366,982,-502,983,984,985,986]],"id":"400","properties":{"name":"Jordan"}},{"type":"MultiPolygon","arcs":[[[987]],[[988]],[[989]],[[990]],[[991]],[[992]],[[993]],[[994]],[[995]],[[996]],[[997]],[[998]],[[999]],[[1000]],[[1001]],[[1002]],[[1003]],[[1004]],[[1005]],[[1006]],[[1007]],[[1008]],[[1009]],[[1010]],[[1011]],[[1012]],[[1013]],[[1014]],[[1015]],[[1016]],[[1017]],[[1018]],[[1019]],[[1020]]],"id":"392","properties":{"name":"Japan"}},{"type":"Polygon","arcs":[[1021]],"id":"388","properties":{"name":"Jamaica"}},{"type":"MultiPolygon","arcs":[[[-373,1022,-475,1023,1024],[-37],[-512]],[[1025]],[[1026]],[[1027]],[[1028]],[[1029]],[[1030]],[[1031]]],"id":"380","properties":{"name":"Italy"}},{"type":"Polygon","arcs":[[-367,-987,1032,-985,1033,1034,1035,1036,-942]],"id":"376","properties":{"name":"Israel"}},{"type":"MultiPolygon","arcs":[[[-1036,1037,1038]],[[-986,-1033]]],"id":"275","properties":{"name":"Palestine"}},{"type":"MultiPolygon","arcs":[[[1039]],[[-269,1040]]],"id":"372","properties":{"name":"Ireland"}},{"type":"Polygon","arcs":[[-309,1041,1042,-953,-503,-983,-365]],"id":"368","properties":{"name":"Iraq"}},{"type":"MultiPolygon","arcs":[[[1043]],[[-301,1044,-759,1045,-1042,-308,1046,1047,1048,1049]]],"id":"364","properties":{"name":"Iran"}},{"type":"MultiPolygon","arcs":[[[1050]],[[1051]],[[1052]],[[1053]],[[1054]],[[1055]],[[1056]],[[1057]],[[1058]],[[1059]],[[1060]],[[1061]],[[1062]],[[1063]],[[1064]],[[1065]],[[1066]],[[1067]],[[1068]],[[1069]],[[1070]],[[1071]],[[1072]],[[1073]],[[1074]],[[1075]],[[1076]],[[-907,1077]],[[1078]],[[1079]],[[1080]],[[-330,1081,-333,1082]],[[1083]],[[1084]],[[1085]],[[-721,1086]],[[1087]],[[1088]],[[1089]],[[1090]],[[1091]],[[1092]],[[1093]],[[1094]],[[1095]],[[1096]],[[1097]],[[1098]],[[1099]],[[1100]],[[1101]],[[1102]],[[1103]],[[1104]],[[1105]],[[1106]],[[1107]],[[1108]],[[1109]],[[1110]],[[1111]],[[1112]],[[1113]],[[1114]],[[1115]],[[1116]],[[1117]],[[1118]],[[1119]],[[1120]],[[1121]],[[1122]],[[1123]],[[1124]],[[1125]],[[1126]],[[1127]],[[1128]],[[1129]],[[1130]],[[1131]],[[1132]],[[1133]],[[1134]],[[1135]],[[1136]],[[1137]],[[1138]],[[1139]],[[1140]],[[1141]],[[1142]],[[1143]],[[1144]],[[1145]],[[1146]],[[1147]],[[1148]],[[1149]],[[1150]],[[1151]],[[1152]],[[-918,1153]],[[1154]],[[1155]],[[1156]],[[1157]],[[1158]],[[1159]],[[1160]],[[1161]],[[1162]],[[1163]],[[1164]],[[1165]],[[1166]],[[1167]],[[1168]],[[1169]],[[1170]],[[1171]],[[1172]],[[1173]],[[1174]],[[1175]],[[1176]],[[1177]],[[1178]],[[1179]],[[1180]],[[1181]],[[1182]],[[1183]]],"id":"360","properties":{"name":"Indonesia"}},{"type":"MultiPolygon","arcs":[[[-757,1184,1185,-850,1186,1187,1188,1189,1190,1191]],[[1192]],[[1193]],[[1194]],[[1195]],[[1196]],[[1197]],[[1198]],[[1199]],[[1200]],[[1201]],[[1202]],[[1203]],[[1204]]],"id":"356","properties":{"name":"India"}},{"type":"Polygon","arcs":[[1205]],"id":"352","properties":{"name":"Iceland"}},{"type":"Polygon","arcs":[[-288,-643,-490,1206,-477,1207,-469]],"id":"348","properties":{"name":"Hungary"}},{"type":"MultiPolygon","arcs":[[[-817,1208,1209,1210,1211]],[[1212]],[[1213]]],"id":"340","properties":{"name":"Honduras"}},{"type":"MultiPolygon","arcs":[[[1214,1215]],[[1216]],[[1217]]],"id":"332","properties":{"name":"Haiti"}},{"type":"Polygon","arcs":[[-33,1218,-388,1219]],"id":"328","properties":{"name":"Guyana"}},{"type":"MultiPolygon","arcs":[[[-494,1220,1221]],[[1222]],[[1223]],[[1224]],[[1225]],[[1226]],[[1227]]],"id":"624","properties":{"name":"Guinea-Bissau"}},{"type":"Polygon","arcs":[[-481,1228,-1221,-493,-903,1229,-939]],"id":"324","properties":{"name":"Guinea"}},{"type":"Polygon","arcs":[[-876,1230,1231,-1211,1232,1233]],"id":"320","properties":{"name":"Guatemala"}},{"type":"Polygon","arcs":[[1234]],"id":"308","properties":{"name":"Grenada"}},{"type":"MultiPolygon","arcs":[[[1235]],[[1236]],[[1237]],[[1238]],[[1239]],[[1240]],[[1241]],[[1242]],[[1243]],[[1244]],[[1245]],[[1246]],[[1247]],[[1248]],[[1249]],[[1250]],[[1251]],[[1252]],[[1253]],[[1254]],[[1255]],[[1256]],[[1257]],[[1258]],[[1259]],[[1260]],[[1261]],[[1262]],[[1263]],[[1264]],[[1265]],[[1266]],[[1267]],[[1268]],[[1269]],[[1270]],[[1271]],[[1272]],[[1273]],[[-313,1274,1275,-924,1276]]],"id":"300","properties":{"name":"Greece"}},{"type":"Polygon","arcs":[[-327,1277,1278,1279,1280,1281]],"id":"288","properties":{"name":"Ghana"}},{"type":"MultiPolygon","arcs":[[[-375,1282,-927,1283,-835,1284,1285,1286,-656,1287,1288]],[[1289]],[[-658,1290]],[[1291]],[[1292]],[[1293]]],"id":"276","properties":{"name":"Germany"}},{"type":"Polygon","arcs":[[-305,1294,-547,1295,1296]],"id":"268","properties":{"name":"Georgia"}},{"type":"Polygon","arcs":[[-496,1297]],"id":"270","properties":{"name":"Gambia"}},{"type":"Polygon","arcs":[[1298,1299,1300,1301]],"id":"266","properties":{"name":"Gabon"}},{"type":"MultiPolygon","arcs":[[[1302]],[[-374,-1025,1303,-873,1304,-411,1305,-409,1306,1307,-928,-1283]],[[1308]],[[1309]],[[1310]],[[1311]],[[1312]],[[1313]],[[1314]],[[-386,1315,1316]]],"id":"250","properties":{"name":"France"}},{"type":"MultiPolygon","arcs":[[[1317]],[[1318]]],"id":"666","properties":{"name":"St. Pierre and Miquelon"}},{"type":"MultiPolygon","arcs":[[[1319]],[[1320]]],"id":"876","properties":{"name":"Wallis and Futuna Is."}},{"type":"Polygon","arcs":[[1321,1322]],"id":"663","properties":{"name":"St-Martin"}},{"type":"Polygon","arcs":[[1323]],"id":"652","properties":{"name":"St-Barthélemy"}},{"type":"MultiPolygon","arcs":[[[1324]],[[1325]],[[1326]],[[1327]],[[1328]],[[1329]],[[1330]],[[1331]],[[1332]],[[1333]],[[1334]],[[1335]],[[1336]],[[1337]],[[1338]],[[1339]],[[1340]],[[1341]],[[1342]],[[1343]],[[1344]]],"id":"258","properties":{"name":"Fr. Polynesia"}},{"type":"MultiPolygon","arcs":[[[1345]],[[1346]],[[1347]],[[1348]],[[1349]],[[1350]]],"id":"540","properties":{"name":"New Caledonia"}},{"type":"MultiPolygon","arcs":[[[1351]],[[1352]],[[1353]]],"id":"260","properties":{"name":"Fr. S. Antarctic Lands"}},{"type":"MultiPolygon","arcs":[[[1354]],[[1355]],[[1356]]],"id":"248","properties":{"name":"Åland"}},{"type":"MultiPolygon","arcs":[[[-379,-766,-553,1357]],[[1358]],[[1359]],[[1360]],[[1361]],[[1362]],[[1363]],[[1364]]],"id":"246","properties":{"name":"Finland"}},{"type":"MultiPolygon","arcs":[[[1365]],[[1366]],[[1367]],[[1368]],[[1369]],[[1370]],[[1371]],[[1372]],[[1373]],[[1374]],[[1375]],[[1376]],[[1377]],[[1378]],[[1379]],[[1380]],[[1381]],[[1382]],[[1383]],[[1384]]],"id":"242","properties":{"name":"Fiji"}},{"type":"Polygon","arcs":[[-393,-401,1385,1386,-445,-442,-976]],"id":"231","properties":{"name":"Ethiopia"}},{"type":"MultiPolygon","arcs":[[[-945,1387,-551]],[[1388]],[[1389]],[[1390]]],"id":"233","properties":{"name":"Estonia"}},{"type":"MultiPolygon","arcs":[[[-400,1391,1392,-1386]],[[1393]],[[1394]]],"id":"232","properties":{"name":"Eritrea"}},{"type":"MultiPolygon","arcs":[[[1395]],[[-1301,1396,1397]]],"id":"226","properties":{"name":"Eq. Guinea"}},{"type":"Polygon","arcs":[[-1210,1398,-1233]],"id":"222","properties":{"name":"El Salvador"}},{"type":"Polygon","arcs":[[-398,-936,1399,-1038,-1035,1400]],"id":"818","properties":{"name":"Egypt"}},{"type":"MultiPolygon","arcs":[[[-714,1401,1402]],[[1403]],[[1404]],[[1405]],[[1406]],[[1407]],[[1408]],[[1409]],[[1410]]],"id":"218","properties":{"name":"Ecuador"}},{"type":"Polygon","arcs":[[-1215,1411]],"id":"214","properties":{"name":"Dominican Rep."}},{"type":"Polygon","arcs":[[1412]],"id":"212","properties":{"name":"Dominica"}},{"type":"Polygon","arcs":[[-446,-1387,-1393,1413]],"id":"262","properties":{"name":"Djibouti"}},{"type":"MultiPolygon","arcs":[[[1414]],[[1415]],[[1416]],[[1417]],[[1418]],[[1419]],[[1420]],[[1421]],[[1422]],[[1423]],[[1424]],[[1425]],[[1426]],[[1427]],[[1428]],[[1429]],[[1430]]],"id":"304","properties":{"name":"Greenland"}},{"type":"MultiPolygon","arcs":[[[1431]],[[1432]],[[1433]],[[1434]],[[1435]]],"id":"234","properties":{"name":"Faeroe Is."}},{"type":"MultiPolygon","arcs":[[[1436]],[[-1286,1437]],[[1438]],[[1439]],[[1440]],[[1441]],[[1442]],[[1443]],[[1444]],[[1445]],[[1446]],[[1447]]],"id":"208","properties":{"name":"Denmark"}},{"type":"Polygon","arcs":[[-471,1448,-1288,-655]],"id":"203","properties":{"name":"Czechia"}},{"type":"Polygon","arcs":[[1449,1450]],"properties":{"name":"N. Cyprus"}},{"type":"Polygon","arcs":[[-1450,1451]],"id":"196","properties":{"name":"Cyprus"}},{"type":"MultiPolygon","arcs":[[[1452]],[[1453]],[[1454]],[[1455]],[[1456]],[[1457]],[[1458]]],"id":"192","properties":{"name":"Cuba"}},{"type":"MultiPolygon","arcs":[[[-473,-1207,-489,1459,1460]],[[1461]],[[1462]],[[1463]],[[1464]],[[1465]],[[1466]],[[1467]],[[1468]],[[1469]],[[1470]],[[1471]],[[-869,1472,1473]]],"id":"191","properties":{"name":"Croatia"}},{"type":"MultiPolygon","arcs":[[[-1279,1474]],[[-902,1475,-1281,1476,-940,-1230]]],"id":"384","properties":{"name":"Côte d'Ivoire"}},{"type":"Polygon","arcs":[[-748,1477,-815,1478]],"id":"188","properties":{"name":"Costa Rica"}},{"type":"Polygon","arcs":[[-7,1479,1480,1481,1482,1483,-390,-296,-522,1484,-351]],"id":"180","properties":{"name":"Dem. Rep. Congo"}},{"type":"Polygon","arcs":[[-1299,1485,1486,-1483,1487,1488]],"id":"178","properties":{"name":"Congo"}},{"type":"MultiPolygon","arcs":[[[1489]],[[1490]],[[1491]]],"id":"174","properties":{"name":"Comoros"}},{"type":"MultiPolygon","arcs":[[[-35,1492,-715,-1403,1493,-746,1494]],[[1495]]],"id":"170","properties":{"name":"Colombia"}},{"type":"MultiPolygon","arcs":[[[1496]],[[1497]],[[1498]],[[1499]],[[1500]],[[1501]],[[1502]],[[1503]],[[1504]],[[1505]],[[1506]],[[-22,-949,1507,-1189,1508,-1187,-851,-1186,1509,-761,1510,-360,-951,-982,-543,-871,-541,-799,1511,1512,1513,1514,1515]],[[1516]]],"id":"156","properties":{"name":"China"}},{"type":"Polygon","arcs":[[-1515,1517]],"id":"446","properties":{"name":"Macao"}},{"type":"MultiPolygon","arcs":[[[-1513,1518]],[[1519]],[[1520]]],"id":"344","properties":{"name":"Hong Kong"}},{"type":"MultiPolygon","arcs":[[[1521]],[[1522]],[[-712,1523,1524,1525]],[[1526,1527]],[[1528]],[[1529]],[[1530]],[[1531]],[[1532]],[[1533]],[[1534]],[[1535]],[[1536]],[[1537]],[[1538]],[[1539]],[[1540]],[[1541]],[[1542]],[[1543]],[[1544]],[[1545]],[[1546]],[[1547]],[[1548]],[[1549]],[[1550]],[[1551]],[[1552]],[[1553]],[[1554]]],"id":"152","properties":{"name":"Chile"}},{"type":"Polygon","arcs":[[-396,1555,1556,-803,-813,-937]],"id":"148","properties":{"name":"Chad"}},{"type":"Polygon","arcs":[[-391,-1484,-1487,1557,-1556,-395]],"id":"140","properties":{"name":"Central African Rep."}},{"type":"MultiPolygon","arcs":[[[1558]],[[1559]],[[1560]],[[1561]],[[1562]],[[1563]],[[1564]],[[1565]]],"id":"132","properties":{"name":"Cabo Verde"}},{"type":"MultiPolygon","arcs":[[[1566]],[[1567]],[[1568]],[[-106,1569,-169,1570]],[[1571]],[[1572]],[[1573]],[[1574]],[[1575]],[[1576]],[[1577]],[[1578]],[[1579]],[[1580]],[[1581]],[[1582]],[[1583]],[[1584]],[[1585]],[[1586]],[[1587]],[[1588]],[[1589]],[[-165,1590]],[[1591]],[[1592]],[[1593]],[[1594]],[[1595]],[[1596]],[[1597]],[[1598]],[[1599]],[[1600]],[[1601]],[[1602]],[[1603]],[[1604]],[[1605]],[[1606]],[[1607]],[[1608]],[[1609]],[[1610]],[[1611]],[[1612]],[[1613]],[[1614]],[[-104,1615]],[[1616]],[[1617]],[[1618]],[[1619]],[[1620]],[[1621]],[[1622]],[[1623]],[[1624]],[[1625]],[[1626]],[[1627]],[[1628]],[[1629]],[[1630]],[[1631]],[[1632]],[[1633]],[[1634]],[[1635]],[[1636]],[[1637]],[[1638]],[[1639]],[[1640]],[[1641]],[[1642]],[[1643]],[[1644]],[[1645]],[[1646]],[[1647]],[[1648]],[[1649]],[[1650]],[[1651]],[[1652]],[[1653]],[[1654]],[[1655]],[[1656]],[[1657]],[[1658]],[[1659]],[[1660]],[[1661]],[[1662]],[[1663]],[[1664]],[[1665]],[[1666]],[[1667]],[[1668]],[[1669]],[[1670]],[[1671]],[[1672]],[[1673]],[[1674]],[[1675]],[[1676]],[[1677]],[[1678]],[[1679]],[[1680]],[[1681]],[[1682]],[[1683]],[[1684]],[[1685]],[[1686]],[[1687]],[[1688]],[[1689]],[[1690]],[[1691]],[[1692]],[[1693]],[[1694]],[[1695]],[[1696]],[[1697]],[[1698]],[[1699]],[[1700]],[[1701]],[[1702]],[[1703]],[[1704]],[[1705]],[[1706]],[[1707]]],"id":"124","properties":{"name":"Canada"}},{"type":"Polygon","arcs":[[-804,-1557,-1558,-1486,-1302,-1398,1708]],"id":"120","properties":{"name":"Cameroon"}},{"type":"MultiPolygon","arcs":[[[1709]],[[1710]],[[-20,1711,-338,-947]]],"id":"116","properties":{"name":"Cambodia"}},{"type":"MultiPolygon","arcs":[[[-342,1712,1713,-1190,-1508,-948]],[[1714]],[[1715]],[[1716]],[[1717]],[[1718]],[[1719]],[[1720]],[[1721]],[[1722]],[[1723]],[[1724]],[[1725]],[[1726]],[[1727]],[[1728]],[[1729]],[[1730]],[[1731]]],"id":"104","properties":{"name":"Myanmar"}},{"type":"Polygon","arcs":[[-352,-1485,-521]],"id":"108","properties":{"name":"Burundi"}},{"type":"Polygon","arcs":[[-328,-1282,-1476,-901,-809,1732]],"id":"854","properties":{"name":"Burkina Faso"}},{"type":"Polygon","arcs":[[-314,-1277,-923,-484,-642,1733]],"id":"100","properties":{"name":"Bulgaria"}},{"type":"MultiPolygon","arcs":[[[-910,1734]],[[-909,1735]]],"id":"096","properties":{"name":"Brunei"}},{"type":"MultiPolygon","arcs":[[[-34,-1220,-387,-1317,1736,-62,1737,-716,1738,-710,-1493]],[[1739]],[[1740]],[[1741]],[[1742]],[[1743]],[[1744]],[[1745]],[[1746]],[[1747]],[[1748]],[[1749]],[[1750]],[[1751]],[[1752]],[[1753]],[[1754]]],"id":"076","properties":{"name":"Brazil"}},{"type":"Polygon","arcs":[[-2,-438,-853]],"id":"072","properties":{"name":"Botswana"}},{"type":"Polygon","arcs":[[-870,-1474,1755,-1460,-488]],"id":"070","properties":{"name":"Bosnia and Herz."}},{"type":"Polygon","arcs":[[-711,-1739,-718,1756,-1524]],"id":"068","properties":{"name":"Bolivia"}},{"type":"Polygon","arcs":[[-1188,-1509]],"id":"064","properties":{"name":"Bhutan"}},{"type":"Polygon","arcs":[[-325,-1733,-808,-806,1757]],"id":"204","properties":{"name":"Benin"}},{"type":"MultiPolygon","arcs":[[[-875,1758,-1231]],[[1759]],[[1760]]],"id":"084","properties":{"name":"Belize"}},{"type":"Polygon","arcs":[[-833,-1284,-929,-1308,1761,-836]],"id":"056","properties":{"name":"Belgium"}},{"type":"Polygon","arcs":[[-291,-661,-933,-946,-549]],"id":"112","properties":{"name":"Belarus"}},{"type":"Polygon","arcs":[[1762]],"id":"052","properties":{"name":"Barbados"}},{"type":"MultiPolygon","arcs":[[[-1191,-1714,1763]],[[1764]],[[1765]],[[1766]],[[1767]],[[1768]],[[1769]]],"id":"050","properties":{"name":"Bangladesh"}},{"type":"Polygon","arcs":[[1770]],"id":"048","properties":{"name":"Bahrain"}},{"type":"MultiPolygon","arcs":[[[1771]],[[1772]],[[1773]],[[1774]],[[1775]],[[1776]],[[1777]],[[1778]],[[1779]],[[1780]],[[1781]],[[1782]],[[1783]],[[1784]],[[1785]]],"id":"044","properties":{"name":"Bahamas"}},{"type":"MultiPolygon","arcs":[[[-307,1786,-1047]],[[-1049,1787,-1296,-546,1788],[1789]],[[1790]]],"id":"031","properties":{"name":"Azerbaijan"}},{"type":"Polygon","arcs":[[-370,-1289,-1449,-470,-1208,-476,-1023,-372,-934]],"id":"040","properties":{"name":"Austria"}},{"type":"MultiPolygon","arcs":[[[1791]],[[1792]],[[1793]],[[1794]],[[1795]],[[1796]],[[1797]],[[1798]],[[1799]],[[1800]],[[1801]],[[1802]],[[1803]],[[1804]],[[1805]],[[1806]],[[1807]],[[1808]],[[1809]],[[1810]],[[1811]],[[1812]],[[1813]],[[1814]],[[1815]],[[1816]],[[1817]],[[1818]],[[1819]],[[1820]],[[1821]],[[1822]],[[1823]],[[1824]],[[1825]],[[1826]],[[1827]],[[1828]],[[1829]],[[1830]],[[1831]],[[1832]]],"id":"036","properties":{"name":"Australia"}},{"type":"MultiPolygon","arcs":[[[1833]],[[1834]],[[1835]]],"properties":{"name":"Indian Ocean Ter."}},{"type":"Polygon","arcs":[[1836]],"id":"334","properties":{"name":"Heard I. and McDonald Is."}},{"type":"Polygon","arcs":[[1837]],"id":"574","properties":{"name":"Norfolk Island"}},{"type":"Polygon","arcs":[[1838]],"id":"036","properties":{"name":"Ashmore and Cartier Is."}},{"type":"MultiPolygon","arcs":[[[-306,-1297,-1788,-1048,-1787],[-1791]],[[-1790]]],"id":"051","properties":{"name":"Armenia"}},{"type":"MultiPolygon","arcs":[[[-61,1839,-1525,-1757,-717,-1738]],[[-1527,1840]],[[1841]],[[1842]]],"id":"032","properties":{"name":"Argentina"}},{"type":"MultiPolygon","arcs":[[[1843]],[[1844]]],"id":"028","properties":{"name":"Antigua and Barb."}},{"type":"MultiPolygon","arcs":[[[-1482,1845,-1488]],[[-6,-855,1846,-1480]]],"id":"024","properties":{"name":"Angola"}},{"type":"Polygon","arcs":[[-410,-1306]],"id":"020","properties":{"name":"Andorra"}},{"type":"Polygon","arcs":[[-316,-938,-811,-900,-896,-863,-860,1847]],"id":"012","properties":{"name":"Algeria"}},{"type":"Polygon","arcs":[[-867,-955,-925,-1276,1848]],"id":"008","properties":{"name":"Albania"}},{"type":"Polygon","arcs":[[-54,-361,-1511,-760,-1045,-300]],"id":"004","properties":{"name":"Afghanistan"}},{"type":"Polygon","arcs":[[-756,-1510,-1185]],"properties":{"name":"Siachen Glacier"}},{"type":"MultiPolygon","arcs":[[[1849]],[[1850]],[[1851],[1852]],[[1853]],[[1854]],[[1855]],[[1856]],[[1857]],[[1858]],[[1859]],[[1860]],[[1861]],[[1862]],[[1863]],[[1864]],[[1865]],[[1866]],[[1867]],[[1868]],[[1869]],[[1870]],[[1871]],[[1872]],[[1873]],[[1874]],[[1875]],[[1876]],[[1877]],[[1878]],[[1879]],[[1880]],[[1881]],[[1882]],[[1883]],[[1884]],[[1885]],[[1886]],[[1887]],[[1888]],[[1889]],[[1890]],[[1891]],[[1892]],[[1893]],[[1894]],[[1895]],[[1896]],[[1897]],[[1898]],[[1899]],[[1900]],[[1901]],[[1902]],[[1903]],[[1904]],[[1905]],[[1906]],[[1907]],[[1908]],[[1909]],[[1910]],[[1911]],[[1912]],[[1913]],[[1914]],[[1915]],[[1916]],[[1917]],[[1918]],[[1919]],[[1920]],[[1921]],[[1922]],[[1923]],[[1924]],[[1925]],[[1926]],[[1927]],[[1928]],[[1929]],[[1930]],[[1931]],[[1932]],[[1933]],[[1934]],[[1935]],[[1936]],[[1937]],[[1938]],[[1939]],[[1940]],[[1941]],[[1942]],[[1943]],[[1944]],[[1945]],[[1946]],[[1947]],[[1948]],[[1949]],[[1950]],[[1951]],[[1952]],[[1953]],[[1954]],[[1955]],[[1956]],[[1957]]],"id":"010","properties":{"name":"Antarctica"}},{"type":"Polygon","arcs":[[-1322,1958]],"id":"534","properties":{"name":"Sint Maarten"}}]},"land":{"type":"GeometryCollection","geometries":[{"type":"MultiPolygon","arcs":[[[853,1846,1480,1845,1488,1299,1396,1708,804,1757,325,1277,1474,1279,1476,940,479,1228,1221,494,1297,496,894,864,861,1847,316,934,1399,1038,1036,942,368,310,1294,547,281,639,283,640,1733,311,1274,1848,867,1472,1755,1460,473,1023,1303,871,1304,411,646,413,1306,1761,836,833,1284,1437,1286,656,1290,658,637,929,634,930,943,1387,551,1357,379,764,554,799,422,797,1511,1518,1513,1517,1515,18,1711,338,905,340,1712,1763,1191,757,1045,1042,953,504,644,506,274,763,271,762,10,500,983,1033,1400,398,1391,1413,446,443,976,354,856,435],[980,544,1788,1049,301]],[[13]],[[14]],[[15]],[[16]],[[17]],[[22]],[[23]],[[24]],[[25]],[[26]],[[27]],[[28]],[[29]],[[30]],[[31]],[[388,1315,1736,59,1839,1525,712,1401,1493,746,1477,815,1208,1398,1233,876,167,1570,102,1615,104,1569,1590,165,873,1758,1231,1211,813,1478,748,1494,35,1218]],[[37]],[[38]],[[39]],[[40]],[[41]],[[42]],[[43]],[[44]],[[45]],[[46]],[[47]],[[48]],[[49]],[[50]],[[62]],[[63]],[[64]],[[65]],[[66]],[[67]],[[68]],[[69]],[[70]],[[71]],[[72]],[[73]],[[74]],[[75]],[[76]],[[77]],[[78]],[[79]],[[80]],[[81]],[[82]],[[83]],[[84]],[[85]],[[86]],[[87]],[[88]],[[89]],[[90]],[[91]],[[92]],[[93]],[[94]],[[95]],[[96]],[[97]],[[98]],[[99]],[[100]],[[101]],[[106]],[[107]],[[108]],[[109]],[[110]],[[111]],[[112]],[[113]],[[114]],[[115]],[[116]],[[117]],[[118]],[[119]],[[120]],[[121]],[[122]],[[123]],[[124]],[[125]],[[126]],[[127]],[[128]],[[129]],[[130]],[[131]],[[132]],[[133]],[[134]],[[135]],[[136]],[[137]],[[138]],[[139]],[[140]],[[141]],[[142]],[[143]],[[144]],[[145]],[[146]],[[147]],[[148]],[[149]],[[150]],[[151]],[[152]],[[153]],[[154]],[[155]],[[156]],[[157]],[[158]],[[159]],[[160]],[[161]],[[162]],[[163]],[[169]],[[170]],[[171]],[[172]],[[173]],[[174]],[[175]],[[176]],[[177]],[[178]],[[179]],[[180]],[[181]],[[182]],[[183]],[[184]],[[185]],[[186]],[[187]],[[188]],[[189]],[[190]],[[191]],[[192]],[[193]],[[194]],[[195]],[[196]],[[197]],[[198]],[[199]],[[200]],[[201]],[[202]],[[203]],[[204]],[[205]],[[206]],[[207]],[[208]],[[209]],[[210]],[[211]],[[212]],[[213]],[[214]],[[215]],[[216]],[[217]],[[218]],[[219]],[[220]],[[221]],[[222]],[[223]],[[224]],[[225]],[[226]],[[227]],[[228]],[[229]],[[230]],[[231]],[[232]],[[233]],[[234]],[[235]],[[236]],[[237]],[[238]],[[239]],[[240]],[[241]],[[242]],[[243]],[[244]],[[245]],[[246]],[[247]],[[248]],[[249]],[[250]],[[251]],[[252]],[[253]],[[254]],[[255]],[[256]],[[257]],[[258]],[[259]],[[260]],[[261]],[[262]],[[263]],[[264]],[[265]],[[266]],[[267]],[[269,1040]],[[270]],[[277]],[[278]],[[279]],[[280]],[[292]],[[298]],[[303]],[[317]],[[318]],[[319]],[[320]],[[321]],[[322]],[[323]],[[328]],[[1082,330,1081,331]],[[333]],[[334]],[[335]],[[342]],[[343]],[[344]],[[345]],[[346]],[[347]],[[348]],[[349]],[[357]],[[362]],[[363]],[[375]],[[376]],[[380]],[[381]],[[382]],[[401]],[[402]],[[403]],[[404]],[[405]],[[406]],[[407]],[[414]],[[415]],[[416]],[[417]],[[418]],[[419]],[[420]],[[423]],[[424]],[[425]],[[426]],[[427]],[[428]],[[429]],[[430]],[[431]],[[432]],[[439]],[[447]],[[448]],[[449]],[[450]],[[451]],[[452]],[[453]],[[454]],[[455]],[[456]],[[457]],[[458]],[[459]],[[460]],[[461]],[[462]],[[463]],[[464]],[[465]],[[466]],[[467]],[[477]],[[481]],[[482]],[[498]],[[499]],[[508]],[[509]],[[510]],[[512]],[[513]],[[514]],[[515]],[[516]],[[517]],[[518]],[[519]],[[522]],[[523]],[[524]],[[525]],[[526]],[[527]],[[528]],[[529]],[[530]],[[531]],[[532]],[[533]],[[534]],[[535]],[[536]],[[537]],[[538]],[[555]],[[556]],[[557]],[[558]],[[559]],[[560]],[[561]],[[562]],[[563]],[[564]],[[565]],[[566]],[[567]],[[568]],[[569]],[[570]],[[571]],[[572]],[[573]],[[574]],[[575]],[[576]],[[577]],[[578]],[[579]],[[580]],[[581]],[[582]],[[583]],[[584]],[[585]],[[586]],[[587]],[[588]],[[589]],[[590]],[[591]],[[592]],[[593]],[[594]],[[595]],[[596]],[[597]],[[598]],[[599]],[[600]],[[601]],[[602]],[[603]],[[604]],[[605]],[[606]],[[607]],[[608]],[[609]],[[610]],[[611]],[[612]],[[613]],[[614]],[[615]],[[616]],[[617]],[[618]],[[619]],[[620]],[[621]],[[622]],[[623]],[[624]],[[625]],[[626]],[[627]],[[628]],[[629]],[[630]],[[631]],[[632]],[[633]],[[645]],[[647]],[[648]],[[649]],[[650]],[[651]],[[652]],[[653]],[[661]],[[662]],[[663]],[[664]],[[665]],[[666]],[[667]],[[668]],[[669]],[[670]],[[671]],[[672]],[[673]],[[674]],[[675]],[[676]],[[677]],[[678]],[[679]],[[680]],[[681]],[[682]],[[683]],[[684]],[[685]],[[686]],[[687]],[[688]],[[689]],[[690]],[[691]],[[692]],[[693]],[[694]],[[695]],[[696]],[[697]],[[698]],[[699]],[[700]],[[701]],[[702]],[[703]],[[704]],[[705]],[[706]],[[707]],[[708]],[[718]],[[719]],[[721,1086]],[[722]],[[723]],[[724]],[[725]],[[726]],[[727]],[[728]],[[729]],[[730]],[[731]],[[732]],[[733]],[[734]],[[735]],[[736]],[[737]],[[738]],[[739]],[[740]],[[741]],[[742]],[[743]],[[744]],[[749]],[[750]],[[751]],[[752]],[[753]],[[754]],[[761]],[[766]],[[767]],[[768]],[[769]],[[770]],[[771]],[[772]],[[773]],[[774]],[[775]],[[776]],[[777]],[[778]],[[779]],[[780]],[[781]],[[782]],[[783]],[[784]],[[785]],[[786]],[[787]],[[788]],[[789]],[[790]],[[791]],[[792]],[[793]],[[794]],[[795]],[[796]],[[800]],[[801]],[[817]],[[818]],[[819]],[[820]],[[821]],[[822]],[[823]],[[824]],[[825]],[[826]],[[827]],[[828]],[[829]],[[830]],[[831]],[[837]],[[838]],[[839]],[[840]],[[841]],[[842]],[[843]],[[844]],[[845]],[[846]],[[847]],[[848]],[[851]],[[877]],[[878]],[[879]],[[880]],[[881]],[[882]],[[883]],[[884]],[[885]],[[886]],[[887]],[[888]],[[889]],[[890]],[[891]],[[892]],[[893]],[[897]],[[898]],[[903]],[[904]],[[907,1735,1734,910,1077]],[[911]],[[912]],[[913]],[[914]],[[915]],[[916]],[[918,1153]],[[919]],[[920]],[[921]],[[951]],[[955]],[[956]],[[957]],[[958]],[[959]],[[960]],[[961]],[[962]],[[963]],[[964]],[[965]],[[966]],[[967]],[[968]],[[969]],[[970]],[[971]],[[972]],[[973]],[[974]],[[977]],[[978]],[[979]],[[987]],[[988]],[[989]],[[990]],[[991]],[[992]],[[993]],[[994]],[[995]],[[996]],[[997]],[[998]],[[999]],[[1000]],[[1001]],[[1002]],[[1003]],[[1004]],[[1005]],[[1006]],[[1007]],[[1008]],[[1009]],[[1010]],[[1011]],[[1012]],[[1013]],[[1014]],[[1015]],[[1016]],[[1017]],[[1018]],[[1019]],[[1020]],[[1021]],[[1025]],[[1026]],[[1027]],[[1028]],[[1029]],[[1030]],[[1031]],[[1039]],[[1043]],[[1050]],[[1051]],[[1052]],[[1053]],[[1054]],[[1055]],[[1056]],[[1057]],[[1058]],[[1059]],[[1060]],[[1061]],[[1062]],[[1063]],[[1064]],[[1065]],[[1066]],[[1067]],[[1068]],[[1069]],[[1070]],[[1071]],[[1072]],[[1073]],[[1074]],[[1075]],[[1076]],[[1078]],[[1079]],[[1080]],[[1083]],[[1084]],[[1085]],[[1087]],[[1088]],[[1089]],[[1090]],[[1091]],[[1092]],[[1093]],[[1094]],[[1095]],[[1096]],[[1097]],[[1098]],[[1099]],[[1100]],[[1101]],[[1102]],[[1103]],[[1104]],[[1105]],[[1106]],[[1107]],[[1108]],[[1109]],[[1110]],[[1111]],[[1112]],[[1113]],[[1114]],[[1115]],[[1116]],[[1117]],[[1118]],[[1119]],[[1120]],[[1121]],[[1122]],[[1123]],[[1124]],[[1125]],[[1126]],[[1127]],[[1128]],[[1129]],[[1130]],[[1131]],[[1132]],[[1133]],[[1134]],[[1135]],[[1136]],[[1137]],[[1138]],[[1139]],[[1140]],[[1141]],[[1142]],[[1143]],[[1144]],[[1145]],[[1146]],[[1147]],[[1148]],[[1149]],[[1150]],[[1151]],[[1152]],[[1154]],[[1155]],[[1156]],[[1157]],[[1158]],[[1159]],[[1160]],[[1161]],[[1162]],[[1163]],[[1164]],[[1165]],[[1166]],[[1167]],[[1168]],[[1169]],[[1170]],[[1171]],[[1172]],[[1173]],[[1174]],[[1175]],[[1176]],[[1177]],[[1178]],[[1179]],[[1180]],[[1181]],[[1182]],[[1183]],[[1192]],[[1193]],[[1194]],[[1195]],[[1196]],[[1197]],[[1198]],[[1199]],[[1200]],[[1201]],[[1202]],[[1203]],[[1204]],[[1205]],[[1212]],[[1213]],[[1215,1411]],[[1216]],[[1217]],[[1222]],[[1223]],[[1224]],[[1225]],[[1226]],[[1227]],[[1234]],[[1235]],[[1236]],[[1237]],[[1238]],[[1239]],[[1240]],[[1241]],[[1242]],[[1243]],[[1244]],[[1245]],[[1246]],[[1247]],[[1248]],[[1249]],[[1250]],[[1251]],[[1252]],[[1253]],[[1254]],[[1255]],[[1256]],[[1257]],[[1258]],[[1259]],[[1260]],[[1261]],[[1262]],[[1263]],[[1264]],[[1265]],[[1266]],[[1267]],[[1268]],[[1269]],[[1270]],[[1271]],[[1272]],[[1273]],[[1289]],[[1291]],[[1292]],[[1293]],[[1302]],[[1308]],[[1309]],[[1310]],[[1311]],[[1312]],[[1313]],[[1314]],[[1317]],[[1318]],[[1319]],[[1320]],[[1322,1958]],[[1323]],[[1324]],[[1325]],[[1326]],[[1327]],[[1328]],[[1329]],[[1330]],[[1331]],[[1332]],[[1333]],[[1334]],[[1335]],[[1336]],[[1337]],[[1338]],[[1339]],[[1340]],[[1341]],[[1342]],[[1343]],[[1344]],[[1345]],[[1346]],[[1347]],[[1348]],[[1349]],[[1350]],[[1351]],[[1352]],[[1353]],[[1354]],[[1355]],[[1356]],[[1358]],[[1359]],[[1360]],[[1361]],[[1362]],[[1363]],[[1364]],[[1365]],[[1366]],[[1367]],[[1368]],[[1369]],[[1370]],[[1371]],[[1372]],[[1373]],[[1374]],[[1375]],[[1376]],[[1377]],[[1378]],[[1379]],[[1380]],[[1381]],[[1382]],[[1383]],[[1384]],[[1388]],[[1389]],[[1390]],[[1393]],[[1394]],[[1395]],[[1403]],[[1404]],[[1405]],[[1406]],[[1407]],[[1408]],[[1409]],[[1410]],[[1412]],[[1414]],[[1415]],[[1416]],[[1417]],[[1418]],[[1419]],[[1420]],[[1421]],[[1422]],[[1423]],[[1424]],[[1425]],[[1426]],[[1427]],[[1428]],[[1429]],[[1430]],[[1431]],[[1432]],[[1433]],[[1434]],[[1435]],[[1436]],[[1438]],[[1439]],[[1440]],[[1441]],[[1442]],[[1443]],[[1444]],[[1445]],[[1446]],[[1447]],[[1450,1451]],[[1452]],[[1453]],[[1454]],[[1455]],[[1456]],[[1457]],[[1458]],[[1461]],[[1462]],[[1463]],[[1464]],[[1465]],[[1466]],[[1467]],[[1468]],[[1469]],[[1470]],[[1471]],[[1489]],[[1490]],[[1491]],[[1495]],[[1496]],[[1497]],[[1498]],[[1499]],[[1500]],[[1501]],[[1502]],[[1503]],[[1504]],[[1505]],[[1506]],[[1516]],[[1519]],[[1520]],[[1521]],[[1522]],[[1527,1840]],[[1528]],[[1529]],[[1530]],[[1531]],[[1532]],[[1533]],[[1534]],[[1535]],[[1536]],[[1537]],[[1538]],[[1539]],[[1540]],[[1541]],[[1542]],[[1543]],[[1544]],[[1545]],[[1546]],[[1547]],[[1548]],[[1549]],[[1550]],[[1551]],[[1552]],[[1553]],[[1554]],[[1558]],[[1559]],[[1560]],[[1561]],[[1562]],[[1563]],[[1564]],[[1565]],[[1566]],[[1567]],[[1568]],[[1571]],[[1572]],[[1573]],[[1574]],[[1575]],[[1576]],[[1577]],[[1578]],[[1579]],[[1580]],[[1581]],[[1582]],[[1583]],[[1584]],[[1585]],[[1586]],[[1587]],[[1588]],[[1589]],[[1591]],[[1592]],[[1593]],[[1594]],[[1595]],[[1596]],[[1597]],[[1598]],[[1599]],[[1600]],[[1601]],[[1602]],[[1603]],[[1604]],[[1605]],[[1606]],[[1607]],[[1608]],[[1609]],[[1610]],[[1611]],[[1612]],[[1613]],[[1614]],[[1616]],[[1617]],[[1618]],[[1619]],[[1620]],[[1621]],[[1622]],[[1623]],[[1624]],[[1625]],[[1626]],[[1627]],[[1628]],[[1629]],[[1630]],[[1631]],[[1632]],[[1633]],[[1634]],[[1635]],[[1636]],[[1637]],[[1638]],[[1639]],[[1640]],[[1641]],[[1642]],[[1643]],[[1644]],[[1645]],[[1646]],[[1647]],[[1648]],[[1649]],[[1650]],[[1651]],[[1652]],[[1653]],[[1654]],[[1655]],[[1656]],[[1657]],[[1658]],[[1659]],[[1660]],[[1661]],[[1662]],[[1663]],[[1664]],[[1665]],[[1666]],[[1667]],[[1668]],[[1669]],[[1670]],[[1671]],[[1672]],[[1673]],[[1674]],[[1675]],[[1676]],[[1677]],[[1678]],[[1679]],[[1680]],[[1681]],[[1682]],[[1683]],[[1684]],[[1685]],[[1686]],[[1687]],[[1688]],[[1689]],[[1690]],[[1691]],[[1692]],[[1693]],[[1694]],[[1695]],[[1696]],[[1697]],[[1698]],[[1699]],[[1700]],[[1701]],[[1702]],[[1703]],[[1704]],[[1705]],[[1706]],[[1707]],[[1709]],[[1710]],[[1714]],[[1715]],[[1716]],[[1717]],[[1718]],[[1719]],[[1720]],[[1721]],[[1722]],[[1723]],[[1724]],[[1725]],[[1726]],[[1727]],[[1728]],[[1729]],[[1730]],[[1731]],[[1739]],[[1740]],[[1741]],[[1742]],[[1743]],[[1744]],[[1745]],[[1746]],[[1747]],[[1748]],[[1749]],[[1750]],[[1751]],[[1752]],[[1753]],[[1754]],[[1759]],[[1760]],[[1762]],[[1764]],[[1765]],[[1766]],[[1767]],[[1768]],[[1769]],[[1770]],[[1771]],[[1772]],[[1773]],[[1774]],[[1775]],[[1776]],[[1777]],[[1778]],[[1779]],[[1780]],[[1781]],[[1782]],[[1783]],[[1784]],[[1785]],[[1791]],[[1792]],[[1793]],[[1794]],[[1795]],[[1796]],[[1797]],[[1798]],[[1799]],[[1800]],[[1801]],[[1802]],[[1803]],[[1804]],[[1805]],[[1806]],[[1807]],[[1808]],[[1809]],[[1810]],[[1811]],[[1812]],[[1813]],[[1814]],[[1815]],[[1816]],[[1817]],[[1818]],[[1819]],[[1820]],[[1821]],[[1822]],[[1823]],[[1824]],[[1825]],[[1826]],[[1827]],[[1828]],[[1829]],[[1830]],[[1831]],[[1832]],[[1833]],[[1834]],[[1835]],[[1836]],[[1837]],[[1838]],[[1841]],[[1842]],[[1843]],[[1844]],[[1849]],[[1850]],[[1852],[1851]],[[1853]],[[1854]],[[1855]],[[1856]],[[1857]],[[1858]],[[1859]],[[1860]],[[1861]],[[1862]],[[1863]],[[1864]],[[1865]],[[1866]],[[1867]],[[1868]],[[1869]],[[1870]],[[1871]],[[1872]],[[1873]],[[1874]],[[1875]],[[1876]],[[1877]],[[1878]],[[1879]],[[1880]],[[1881]],[[1882]],[[1883]],[[1884]],[[1885]],[[1886]],[[1887]],[[1888]],[[1889]],[[1890]],[[1891]],[[1892]],[[1893]],[[1894]],[[1895]],[[1896]],[[1897]],[[1898]],[[1899]],[[1900]],[[1901]],[[1902]],[[1903]],[[1904]],[[1905]],[[1906]],[[1907]],[[1908]],[[1909]],[[1910]],[[1911]],[[1912]],[[1913]],[[1914]],[[1915]],[[1916]],[[1917]],[[1918]],[[1919]],[[1920]],[[1921]],[[1922]],[[1923]],[[1924]],[[1925]],[[1926]],[[1927]],[[1928]],[[1929]],[[1930]],[[1931]],[[1932]],[[1933]],[[1934]],[[1935]],[[1936]],[[1937]],[[1938]],[[1939]],[[1940]],[[1941]],[[1942]],[[1943]],[[1944]],[[1945]],[[1946]],[[1947]],[[1948]],[[1949]],[[1950]],[[1951]],[[1952]],[[1953]],[[1954]],[[1955]],[[1956]],[[1957]]]}]}},"arcs":[[[58690,38938],[-25,33],[-34,22],[-44,9],[-57,-4],[-69,-18],[-75,22],[-80,62],[-67,22],[-79,-27],[-4,-1]],[[58156,39058],[-13,21],[-22,45],[-36,8],[-10,11],[-8,16],[-6,22],[-2,23],[6,75],[-3,8],[-10,9],[-19,9],[-48,33],[-60,33],[-97,35],[-38,10],[-9,11],[-11,27],[-19,85],[-17,56],[-42,87],[-7,27],[2,69],[4,55],[4,47],[-2,45],[-1,54],[2,37],[-6,16],[-15,11],[-43,5],[-53,-2],[-1,56],[-5,86],[-10,50],[-12,26],[-24,27],[-49,37],[-66,56],[-57,83],[-64,103],[-21,18],[-24,97],[-36,166],[2,55],[-5,27],[-36,82],[-7,42],[-7,43],[-56,120],[-19,52],[-15,67],[-14,53],[-13,22],[-16,36],[-11,42],[-5,31],[4,41],[6,29]],[[57016,41593],[53,-30],[30,-2],[23,14],[28,-19],[34,-54],[37,-11],[39,34],[54,-10],[68,-54],[56,-11],[67,48],[60,132],[56,125],[55,144],[34,116],[48,95],[65,73],[65,61],[100,76],[21,62],[6,68],[0,94],[5,61],[11,28],[16,22],[22,28],[66,72],[55,46],[68,30],[73,0],[71,0],[41,1]],[[58443,42832],[0,-91],[3,-102],[8,-10],[54,-2],[86,-8],[82,-7],[53,-74],[18,-15],[55,-20],[70,-124],[84,-11],[58,-39],[51,-42],[29,-51],[19,-12],[26,-4],[13,-4],[-3,-37],[-17,-62],[2,-89],[24,-123],[3,-107],[-8,-189],[1,-183],[2,-65],[4,-43],[5,-24],[-1,-27],[-14,-77],[-11,-81],[-1,-32],[-4,-23],[-8,-20],[-37,-37],[-6,-23],[0,-42],[4,-35],[14,-13],[17,-20],[6,-26],[0,-28],[-5,-51],[-15,-85],[15,-98],[17,-63],[22,-73],[10,-45],[-1,-33],[-3,-31],[-34,-134],[-25,-83],[-30,-89],[-40,-56],[-10,-27],[-4,-31],[1,-67],[-1,-69],[-34,-108],[21,-92],[-5,-9],[-12,-13],[-49,-104],[-49,-105],[-36,-77],[-42,-88],[-46,-98],[-39,-83],[-40,-60]],[[57016,41593],[-47,92],[-25,38],[-19,14],[-55,15],[-128,21],[-13,-5],[-53,-18],[-66,-23],[-56,-22],[-60,-24]],[[56494,41681],[-55,96],[-63,108],[-65,122],[-49,95],[-24,55],[-43,72],[-31,35],[-12,18],[-30,193],[-17,177],[0,133],[0,185],[0,185],[0,185],[0,184],[0,185],[0,185],[0,185],[0,185],[0,90],[64,0],[72,0],[76,0],[83,0],[82,0],[83,0],[58,0],[15,1],[18,6],[1,18],[-24,91],[2,32],[6,62],[10,53],[13,70],[1,41],[-10,134],[1,75],[3,78],[3,74],[-4,51],[4,28],[8,40],[4,45],[5,20],[-1,18],[-5,33],[-4,76],[-6,105],[-6,75]],[[56657,45580],[10,-4],[21,-7],[10,-37],[6,-41],[14,-2],[37,-24],[13,-34],[8,-72],[-5,-37],[-12,-30],[12,-26],[25,-18],[14,6],[42,49],[16,9],[22,9],[20,13],[55,22],[30,10],[17,18],[12,0],[9,-14],[-8,-51],[-3,-46],[11,-86],[8,-40],[18,-29],[13,-15],[14,-31],[30,6],[65,-44],[20,-20],[28,-21],[19,-7],[68,-15],[25,-11],[46,-14],[37,-2],[27,6],[18,13],[11,14],[5,11],[8,43],[14,93],[5,27],[14,13],[18,9],[10,-15],[12,-103],[51,-93],[18,-78],[13,-66],[11,-19],[19,-22],[32,-9],[28,-2],[58,-48],[47,-38],[34,-27],[15,-21],[11,-34],[6,-27],[10,-68],[11,-54],[18,-11],[16,-4],[16,-37],[12,-32],[24,-80],[17,-54],[6,-54],[20,-35],[27,-15],[25,-2],[14,16],[36,27],[28,32],[20,11],[12,-7],[9,-22],[5,-43],[1,-24],[20,-22],[14,9],[6,26],[0,13],[0,117],[0,101],[0,95],[0,116],[0,101],[0,83],[0,87],[-13,-5],[-16,-20],[-37,-2],[-14,-15],[-4,-23],[2,-29],[1,-39],[-5,-19],[-16,-7],[-24,15],[-42,20],[-35,12],[-25,53],[-35,79],[-22,40],[-54,82],[-9,17],[-17,38],[-14,66],[-7,43],[-6,33],[-8,48],[13,74],[19,141],[13,102],[7,75],[27,77],[2,68],[-11,88],[3,49],[1,123],[2,104],[0,50],[-7,88],[-18,98],[-39,135],[0,29],[24,32],[36,56],[18,33],[22,47],[10,24],[21,61],[13,49],[5,63],[-10,61],[20,12],[68,21],[74,23],[79,25],[79,25],[77,25],[69,22],[48,15]],[[58541,47123],[8,-42],[14,-69],[18,-51],[21,-44],[18,-27],[12,-8],[76,3],[27,-27],[24,-35],[6,-53],[16,-33],[17,-26],[7,-3],[12,6],[21,1],[19,-12],[9,-11],[1,-45],[5,-20],[26,-7],[26,-4],[26,-30],[27,-5],[32,-13],[15,-32],[33,-34],[41,-29],[30,-34],[16,-15]],[[59144,46424],[1,-16],[7,-29],[8,-20],[1,-31],[4,-28],[12,-7],[9,-2],[9,20],[12,0],[13,-13],[5,-33],[11,-44],[16,-30],[12,-29],[-4,-53],[-7,-49],[22,-47],[30,-46],[8,-20],[2,-67],[5,-23],[20,-56],[10,-37],[-1,-22],[-54,-111],[-17,-11],[-16,-6],[-15,-23],[-8,-23],[3,-13],[6,-38],[12,-60],[12,-42],[-10,-52],[-21,-89],[-10,-8],[-2,-68],[7,-24],[10,-20],[4,-46],[1,-63],[-1,-50],[-14,-130],[25,-112],[8,-13],[34,0],[5,-10],[-8,-32],[-14,-33],[-9,-17],[-43,-38],[-62,-43],[-13,-41],[-8,-59],[7,-35],[8,-20],[-3,-52],[-5,-54],[2,-43],[-3,-38],[-8,-19],[-11,-57],[-13,-58],[-11,-26],[-15,-28],[-24,-23],[0,-11],[28,-27],[7,-18],[2,-13],[-6,-12],[-5,-17],[13,-18],[15,-15],[15,-38],[13,-54],[4,-18],[3,-8],[5,-1],[9,8],[17,30],[12,10],[15,-42]],[[59222,43770],[-60,-41],[-31,-21],[-89,-62],[-78,-54],[-20,-10],[-41,-27],[-20,-16],[-70,-47],[-29,-23],[-24,-23],[-58,-35],[-55,-33],[-60,-34],[-67,-38],[-38,-27],[-25,-24],[-60,-47],[-3,-12],[1,-32],[8,-67],[15,-61],[12,-35],[8,-90],[5,-79]],[[64745,61433],[-140,-103],[-37,-45],[-33,-57],[-25,-70],[-18,-124],[13,-113],[-1,-60],[-36,-40],[-34,-29],[-37,-44],[-23,-11],[-19,-35],[-21,-25],[-78,-63],[-86,-50],[-135,-59],[-53,-64],[-47,-44],[-73,-13],[-99,-61],[-55,-48],[-69,-80],[-15,-25],[-12,-58],[-21,-51],[-42,-83],[-31,-42],[-20,-2],[-41,-23],[-47,-5],[-80,29],[-21,-20],[-17,-33],[-61,-56],[-63,-114],[-46,-30],[-74,-36],[-52,-47],[-35,-19],[-44,-10],[-83,5],[-79,-17],[-73,-32],[-34,-60],[-39,-96],[-64,-40],[-15,-34],[-20,-71],[-41,-18],[-38,-12],[-38,31],[-72,-85],[-27,-15],[-41,-3],[-30,-18],[-21,5],[-26,34],[-56,40],[-41,-26],[-3,80],[-68,247],[14,215],[0,30],[-13,96],[-40,87],[1,111],[-14,80],[-10,81],[3,22],[1,20],[-21,125],[-7,26],[-2,26],[6,20],[0,24],[-11,38],[-11,74],[-55,57],[11,54],[11,-19],[14,-16],[3,35],[0,26],[-23,163],[34,218],[-11,195]],[[61888,61273],[52,79],[13,24],[8,21],[12,45],[17,14],[6,47],[-1,24],[-11,20],[-8,55],[3,69],[3,29],[5,53],[18,20],[5,16],[-14,33],[1,20],[31,56],[12,17],[20,18],[16,-1],[18,-9],[16,-16],[15,-29],[17,-32],[25,-13],[17,4],[15,-15],[11,8],[14,17],[21,-1],[20,19],[55,9],[53,-6],[56,16],[56,-1],[55,-2],[13,-2],[12,-10],[47,-50],[36,-10],[72,-13],[77,-15],[66,-13],[57,12],[47,10],[12,-2],[14,-31],[29,-76],[26,-73],[47,-3],[30,27],[33,38],[20,30],[23,117],[15,77],[34,85],[29,72],[39,95],[21,52],[42,104],[39,40],[77,78],[76,77],[49,49],[42,23],[70,20],[83,23],[82,23],[88,24],[98,28],[67,18],[86,24],[71,20],[63,18],[66,18]],[[64438,62785],[12,-57],[12,-58],[12,-58],[13,-57],[12,-58],[12,-57],[13,-58],[12,-57],[12,-58],[13,-57],[12,-58],[12,-57],[12,-58],[13,-57],[12,-58],[12,-58],[12,-56],[20,-18],[12,-54],[17,-75],[17,-76],[17,-76],[16,-76]],[[61830,60658],[-9,-13],[-2,23],[5,50],[9,14],[7,-37],[-4,-20],[-6,-17]],[[61876,59737],[-18,-18],[12,46],[13,9],[4,-2],[-11,-35]],[[61885,59891],[-4,-13],[-5,3],[-17,31],[19,34],[10,-32],[-3,-23]],[[64934,59122],[17,-7],[26,20],[74,3],[90,-65],[-17,-16],[-10,-24],[-39,-21],[-40,-49],[-114,-24],[-33,13],[-28,48],[-51,62],[20,40],[5,18],[7,17],[29,30],[29,-4],[35,-41]],[[78906,57828],[5,-29],[-2,-66],[-11,-66],[4,-29],[-9,-18],[-18,123],[-24,53],[-5,21],[14,-2],[24,34],[12,1],[10,-22]],[[79992,64232],[-13,-5],[-33,-1],[-28,-53],[-20,-22],[-30,-18],[-33,-30],[-9,-52],[-1,-38],[-5,-42],[-53,-61],[-15,6],[-10,23],[-15,-5],[-11,-11],[-12,1],[-14,-13],[-18,4],[-17,19],[-10,5],[-12,1],[-2,-23],[17,-89],[5,-41],[-56,-120],[6,-78],[-15,-59],[-34,-48],[-64,-123],[-29,-3],[-22,-28],[-47,-202],[-1,-70],[-7,-50],[2,-49],[-21,-96],[-22,-41],[-4,-52],[30,-108],[4,-19],[17,-58],[9,-41],[14,-41],[49,-107],[22,-33],[26,-23],[48,-96],[24,-62],[-11,-41],[6,-89],[-35,26],[5,-11],[40,-48],[61,-170],[53,-84],[54,-96],[17,-91],[48,-60],[54,-87],[-2,-19],[14,-24],[37,-46],[22,-49],[8,-46],[13,-7],[16,11],[15,4],[10,-3],[17,-51],[22,-46],[11,-41],[9,5],[7,-6],[2,-35],[4,-23],[30,-67],[14,-63],[37,-103],[26,-58],[20,-33],[21,-28],[22,-114],[11,-103],[23,-114],[18,-50],[0,-95],[14,-97],[15,-65],[5,-67],[4,-33],[6,-25],[16,-114],[-4,-52],[-11,51],[1,-152],[10,-80],[-5,-99],[11,-35],[19,-111],[13,-40],[-1,-137],[7,-69],[-18,41],[-13,47],[-17,-25],[-15,-36],[24,-147],[-28,14],[3,-197],[11,-46],[1,-22],[-3,-27],[-8,29],[-1,30],[-5,-6],[1,-16],[-10,-35],[-2,-43],[9,-36],[2,-28],[-7,-35],[-11,-37],[-26,-5],[-6,-71],[-9,-76],[-46,-12],[-33,-67],[-42,-25],[-37,-67],[-40,-61],[-27,-8],[-22,-13],[-26,-102],[-44,-12],[-78,-83],[-26,-40],[-24,-16],[-34,-35],[-7,13],[-12,30],[-29,15],[-15,33],[-4,43],[-4,17],[-6,-24],[-5,-102],[-5,-23],[-13,-10],[-25,29],[-23,59],[-34,-41],[10,-5],[16,3],[12,-10],[10,-39],[-1,-22],[-5,-25],[-32,-4],[-42,9],[-7,-3],[38,-39],[35,-22],[16,-24],[0,-20],[-20,-32],[-15,-40],[-1,-25],[0,-27],[-17,-24],[-11,5],[-30,41],[-86,163],[13,-46],[90,-185],[15,-61],[3,-43],[-10,-21],[-15,-26],[-29,-2],[-49,69],[-77,165],[-26,22],[78,-188],[13,-46],[13,-53],[-4,-31],[-7,-30],[-185,-174],[-28,-76],[-22,-93],[-36,-51],[-21,-48],[-62,-26],[-34,8],[35,86],[-22,32],[-1,221],[9,242],[16,121],[23,30],[30,19],[0,25],[-3,30],[-15,41],[-18,19],[-25,8],[-20,51],[-15,-2],[-24,-17],[-14,22],[-5,34],[-22,42],[-24,41]],[[79007,57840],[11,6],[13,24],[14,30],[35,4],[35,-1],[9,8],[14,32],[23,41],[18,23],[4,19],[-7,43],[-4,45],[7,14],[31,-8],[35,-21],[8,-9],[20,55],[6,6],[13,0],[34,10],[34,15],[16,-3],[15,-37],[12,-36],[6,-2],[17,15],[15,-19],[30,-32],[18,-1],[-9,73],[10,52],[-2,14],[-17,24],[-57,96],[-10,29],[1,45],[-2,66],[-5,41],[1,24],[3,20],[11,8],[10,2],[8,17],[14,44],[27,-4],[38,-25],[28,-15],[17,3],[3,6],[0,23],[2,100],[-1,21],[23,10],[37,2],[19,6],[18,42],[46,15],[34,56],[30,59],[14,15],[19,10],[14,-1],[18,-34],[14,20],[17,40],[9,39],[5,62],[-4,96],[-8,74],[-9,57],[-2,56],[20,112],[17,122],[-4,49],[-18,76],[-18,93],[-20,102],[-8,15],[-5,29],[-4,33],[9,104],[1,36],[23,47],[12,55],[12,60],[-4,31]],[[79866,60313],[-2,65],[3,31],[-5,26],[-7,37],[4,24],[17,20],[9,35],[12,42],[6,37],[-9,32],[-16,47],[-29,43],[-33,54],[-17,34],[-13,34],[-12,40],[-6,31],[6,21],[48,48],[8,17],[5,27],[-3,26],[-13,14],[-15,10],[-22,30],[-41,82],[-19,19],[-20,24],[-10,25],[-12,68],[-5,6],[-11,-20],[-15,-22],[-12,4],[-11,19],[-5,26],[-12,36],[-14,29],[-3,98],[-2,32],[-7,45],[-10,16],[-11,12],[-26,81],[-17,42],[-74,114],[-9,19],[-19,47],[-35,66],[-24,54],[-18,56],[-8,48],[-3,38],[-19,54],[-17,44],[-16,15],[-18,6],[-17,26],[-31,59],[-13,39],[-8,26],[0,26],[7,44],[9,26],[1,19],[-9,16],[-34,29],[-77,43],[-29,33],[-26,42],[-20,29],[-94,122],[-28,20],[-25,22],[-7,21],[1,20],[10,15],[27,32],[10,35],[-4,47],[-10,48],[5,16],[9,2],[17,2],[37,2],[80,-43],[11,5],[44,78],[16,47],[4,39],[8,25],[23,41],[0,37],[-11,50],[-11,19],[-10,8],[-32,-6],[-6,11],[-4,37],[-2,23],[-10,26],[-34,23],[-29,6],[-7,10],[11,25],[20,25],[15,15],[12,26],[2,27],[-15,24],[-19,26],[-31,50],[-43,54],[-26,18],[-13,-2],[-48,-46],[-25,-30],[-21,-54],[-22,-11],[-23,23],[-25,25],[-70,35],[-30,29],[-61,179],[-9,37],[6,41],[4,59],[6,38],[11,37],[3,32],[-3,32],[-9,18],[-11,5],[-9,8],[-8,41],[-5,-5],[-7,-51],[-9,-18],[-12,-9],[-10,8],[-5,20],[-3,35],[-6,46],[-8,30],[-26,31],[-12,40],[-40,87],[-33,61],[-15,55]],[[78368,64734],[13,20],[17,30],[19,46],[20,58],[8,35],[6,15],[12,10],[13,-6],[23,-23],[34,-30],[30,-35],[12,-36],[17,-34],[13,-10],[7,2],[19,26],[17,26],[1,29],[15,26],[20,43],[10,30],[7,3],[8,-9],[32,-90],[6,-6],[9,14],[13,70],[14,28],[4,-7],[77,-134],[8,2],[8,6],[6,20],[6,46],[11,50],[25,27],[19,6],[7,-24],[17,-32],[20,-5],[43,58],[15,9],[15,-1],[15,2],[15,22],[15,29],[5,58],[4,51],[10,21],[13,14],[24,19],[53,50],[14,24],[10,13],[21,-21],[25,-42],[15,-31],[10,-34],[5,-29],[40,-24],[25,-35],[17,-27],[17,1],[16,7],[11,22],[19,0],[22,-3],[10,-8],[18,-50],[8,-7],[17,4],[31,17],[25,9],[23,-20],[43,-55],[-12,-39],[-9,-42],[-19,-30],[-15,-7],[-8,-42],[-4,-61],[4,-31],[11,-10],[12,-20],[5,-27],[2,-61],[-1,-68],[2,-23],[9,4],[9,9],[18,-11],[23,-18],[14,-18],[12,3],[10,-18],[4,-34],[12,-23],[32,-45],[26,-3],[22,-59],[23,19],[10,-25],[47,9],[33,24],[12,-6],[30,-49],[18,-30]],[[79615,56844],[-8,-1],[-6,12],[26,37],[-3,-25],[1,-12],[-10,-11]],[[79768,57832],[-23,-35],[-2,29],[20,19],[7,15],[6,0],[-8,-28]],[[79684,63833],[-3,-11],[-14,27],[-10,12],[8,37],[16,-40],[3,-25]],[[79889,64064],[-40,-72],[-15,1],[13,82],[7,19],[24,-28],[11,-2]],[[79866,63897],[-15,-15],[-19,2],[22,28],[12,35],[9,12],[-1,-30],[-8,-32]],[[79730,63794],[-11,-3],[-22,47],[11,25],[26,-18],[5,-11],[0,-10],[-6,-22],[-3,-8]],[[33105,57107],[-33,-19],[0,15],[9,27],[17,7],[7,10],[11,6],[6,-1],[7,-8],[-16,-15],[-8,-22]],[[32264,58254],[9,-75],[-3,-14],[-25,-51],[-21,-3],[-17,1],[-13,10],[-17,33],[-16,-10],[-40,12],[-11,11],[15,41],[28,16],[10,4],[8,-25],[20,-22],[23,-2],[6,38],[32,57],[12,-21]],[[31885,58125],[-15,-13],[-27,13],[-14,18],[9,21],[22,0],[21,-25],[4,-14]],[[33056,56951],[-17,-12],[-3,58],[5,15],[30,47],[8,8],[6,-9],[-2,-13],[14,-21],[-3,-26],[-16,-29],[-22,-18]],[[33328,56767],[52,-140],[1,-15],[-6,-18],[-32,-33],[-7,-17],[-12,-62],[-40,-35],[-28,-42],[-19,-38],[-10,-15],[-37,-9],[-12,-23],[-14,-72],[-11,-29],[-20,-35],[0,-22],[27,-78],[5,-24],[-9,-37],[1,-27],[14,-31],[17,-7],[16,13],[20,-1],[13,-9],[6,-9],[1,-24],[-9,-51],[-12,-34],[-53,-50],[-23,-30],[-13,-22],[-29,12],[-15,-1],[-11,-17],[-7,-14],[-19,-4],[-27,-8],[-11,-10],[-9,-25],[-7,-36],[6,-43],[8,-39],[0,-35],[6,-99],[-8,-23],[-18,-26],[-22,-46],[-24,-63],[4,-19],[58,-134],[59,-136],[59,-136]],[[33127,54839],[8,-6],[11,-16],[11,-47],[8,-50],[0,-26],[-6,-33],[-15,-38],[-17,-30],[-25,-26],[-21,-25],[-16,-64],[-11,-23],[-9,-9],[-18,-9],[-30,2],[-20,6],[-24,-49],[-31,-18],[-21,-65],[-74,-53],[-72,-40],[-20,-17],[-72,34],[-17,-10],[-20,-32],[-18,-24],[-15,-1],[-13,-13],[-8,-45],[-7,-154],[-26,-45],[-31,0],[-21,53],[-25,40],[-44,96],[-12,12],[-12,0],[-41,-28],[-19,12],[-16,15],[-26,-5],[-46,-1],[-30,-1],[-14,26],[-14,53],[-9,19],[-11,16],[-17,8],[-75,-1],[-14,0],[-11,11],[-14,45],[-16,22],[-18,1],[-8,-25],[32,-83],[9,-44],[28,-65],[81,-137],[15,-43],[-1,-55],[-1,-85],[3,-80],[21,-115],[29,-118],[8,-74],[-5,-55],[-6,-30],[1,-13],[6,-12],[28,-17],[59,-10],[35,0],[55,-13],[4,-41],[-6,-68],[-10,-39],[-9,-11],[-30,-9],[-31,-42],[-45,-41],[-26,-5],[-10,-8],[-9,-13],[-8,-15],[-9,-77],[-13,-88],[-25,-51],[-28,-43],[-28,-5],[-22,3],[-11,-12],[-16,-35],[-23,-44],[-18,-23],[-24,2],[-26,-22],[-32,-35],[-22,-29],[-18,-50],[-26,-52],[-27,-36],[-13,-45],[-18,-57],[-23,-2],[-2,34],[11,55],[-12,48],[-22,26],[-10,7],[-10,-3],[-26,-23],[-32,-43],[-20,-31],[-17,-14],[-37,-13],[-30,-6],[-13,9],[-23,31],[-53,98],[-71,133]],[[31423,52547],[-5,39],[3,39],[-13,58],[-8,61],[-6,21],[-2,45],[-16,83],[-12,67],[-12,35],[5,29],[-5,29],[-9,24],[-14,76],[5,33],[-4,33],[-12,23],[-16,24],[-22,51],[-27,48],[-13,20],[-9,7],[-8,46],[-6,14],[-14,4],[-27,19],[-26,-23],[-1,35],[8,22],[89,170],[44,78],[5,11],[4,18],[3,24],[-10,28],[-42,131],[-15,24],[-14,21],[-16,55],[-20,128],[-14,64],[-4,49],[1,56],[-6,43],[-11,30],[0,91],[11,153],[3,116],[-6,80],[11,60],[26,42],[14,64],[3,86],[16,72],[28,56],[10,55],[-9,54],[-3,35],[-24,35],[-44,25],[-37,3],[-22,-28],[-57,-25],[-91,-24],[-74,0],[-56,24],[-42,-8],[-29,-40],[-20,-9],[-12,22],[-13,6],[-20,-14],[-3,7],[-43,107],[-40,100],[-46,118],[-53,137],[-10,9],[-16,-1],[-22,-2],[-33,14],[-23,20],[-19,19],[-33,25],[-23,4],[-20,-7],[-56,-48],[-32,-5],[-25,-1],[-67,24],[-45,4],[-53,-16],[-22,-9],[-32,25],[-22,37],[-20,88],[-14,69],[-25,14],[-27,12],[-13,23],[-8,40],[-2,51],[2,84],[3,29],[4,90],[15,47],[9,23],[-1,38],[-8,77],[-7,55],[-30,62],[-39,79],[-17,128],[-20,150],[-15,15],[-15,-8],[-15,8],[-14,60],[-13,11],[-22,-21],[-16,-16],[-40,-15],[-8,15],[3,19],[17,54],[20,70],[23,64],[21,66],[16,70],[11,138],[7,96],[20,170],[36,136],[14,62],[33,82],[15,44],[20,35],[55,47],[65,234],[15,37],[67,35],[51,27],[37,28],[13,16],[10,7]],[[30189,58676],[-9,-28],[-18,-34],[-20,-21],[-106,-53],[-11,-11],[-13,-22],[0,-50],[2,-39],[32,-129],[12,-32],[41,-70],[-9,-10],[-16,-1],[12,-92],[25,-63],[1,-39],[-19,-123],[-36,-74],[-25,-86],[-20,-34],[-44,-168],[34,-101],[4,-50],[29,-73],[19,-23],[12,-30],[-6,-49],[12,-67],[15,-35],[18,-14],[23,0],[67,44],[15,20],[10,36],[34,73],[2,93],[7,113],[-8,73],[-35,104],[-15,75],[-35,69],[-21,118],[-9,37],[-6,51],[-8,91],[23,32],[-2,74],[57,21],[123,120],[77,31],[87,64],[20,32],[17,52],[14,7],[45,-50],[22,17],[9,39],[-12,75],[-26,0],[-78,-27],[-8,32],[0,29],[-18,89],[11,68],[12,55],[22,22],[33,24],[25,-37],[15,-35],[8,-33],[6,-92],[13,-93],[14,-64],[23,-49],[17,4],[12,8],[81,11],[50,-33],[63,-17],[59,-71],[60,-85],[15,-63],[6,-59],[14,-40],[-14,-41],[7,-69],[18,-69],[26,-44],[74,-12],[81,30],[125,27],[40,23],[206,12],[39,-33],[4,-33],[0,-26],[67,-124],[54,-16],[46,-40],[48,-22],[52,-30],[30,4],[22,11],[26,2],[184,207],[98,-6],[15,14],[13,18],[-36,32],[-82,12],[-25,-21],[-14,53],[27,-2],[91,18],[105,-11],[85,38],[43,6],[24,-8],[68,25],[128,-29],[101,24],[-12,-34],[-33,-21],[-53,-7],[-41,-50],[-87,9],[-61,-18],[19,-14],[0,-51],[9,-11],[8,0],[21,-38],[6,-25],[7,-53],[-10,-56],[-12,-26],[25,9],[14,26],[-2,27],[2,31],[14,-10],[9,-14],[32,-148],[22,-78],[6,3],[5,3],[7,15],[10,36],[9,-23],[5,-9],[5,-3],[-5,34],[6,42],[-2,15],[10,3],[12,-5],[17,-12],[30,-49],[20,-51],[1,-28],[8,-16],[12,-16],[7,-26],[1,41],[-8,30],[-2,34],[40,1],[10,45],[21,-27],[56,-123],[21,-21],[62,-24],[38,-59],[23,-53],[-14,-56],[-36,-28],[-14,-35],[-9,-34],[0,-35],[-11,-40],[-1,-14],[-7,-56],[-15,-68],[-19,-72],[-104,-2],[26,-29],[23,-22],[39,-57],[30,45],[44,3],[48,49],[18,8],[88,-26],[22,36],[17,11],[48,-7],[42,-39]],[[53455,75978],[-3,-1],[0,2],[0,3],[3,0],[0,-4]],[[96317,43302],[18,-191],[21,1],[11,10],[12,45],[5,70],[11,10],[14,-8],[-6,-22],[4,-56],[10,-31],[7,-6],[14,-146],[6,-31],[-1,-25],[-29,-54],[-44,1],[-30,-33],[-19,3],[0,37],[-17,29],[-19,63],[5,112],[-33,208],[-1,52],[12,68],[11,3],[15,-56],[23,-53]],[[96503,42571],[12,-13],[7,0],[4,-28],[40,-56],[11,2],[9,-31],[17,-15],[5,-31],[12,-32],[-21,-38],[-41,10],[-24,-44],[-21,11],[-4,23],[3,8],[-13,58],[-5,90],[-9,52],[-9,23],[-20,-20],[-8,-3],[-18,43],[9,87],[4,25],[15,5],[23,-23],[22,-103]],[[96790,42177],[8,-8],[-4,-24],[-39,27],[-30,-10],[-9,1],[-9,22],[-7,44],[3,30],[13,22],[5,3],[10,-26],[8,-18],[9,-8],[19,-43],[23,-12]],[[96748,42432],[-32,-6],[-44,18],[-18,25],[-8,25],[15,19],[23,9],[27,57],[10,-22],[10,-64],[11,-20],[6,-19],[0,-22]],[[96790,41738],[27,-82],[11,-7],[-17,-59],[-34,-5],[-41,15],[15,20],[-8,23],[-13,5],[-14,-11],[-6,4],[9,38],[23,53],[6,4],[6,1],[6,-5],[30,6]],[[96641,42951],[-19,-26],[-34,2],[-13,15],[42,80],[49,17],[-25,-88]],[[96725,42643],[-5,-1],[-4,27],[-16,141],[10,126],[7,-27],[23,-221],[-3,-36],[-12,-9]],[[96718,43013],[-5,-36],[-11,41],[-7,175],[3,16],[6,1],[14,-121],[0,-76]],[[96449,42785],[-5,-15],[-30,37],[7,36],[32,-12],[-4,-46]],[[96550,43628],[-11,-29],[-32,9],[-7,8],[2,48],[8,17],[19,15],[25,-24],[-4,-44]],[[96524,43832],[-4,-6],[-7,4],[-16,70],[4,23],[21,22],[18,-38],[2,-22],[0,-18],[-3,-16],[-13,-6],[-2,-13]],[[97192,40214],[-9,-31],[-15,0],[-20,22],[4,29],[22,5],[6,-2],[12,-23]],[[97080,40587],[-15,-63],[-25,15],[-24,45],[-12,40],[8,75],[12,14],[13,-5],[6,-74],[37,-47]],[[97036,40932],[-12,-27],[-12,3],[-72,64],[3,27],[-3,67],[8,37],[20,15],[15,-8],[10,-54],[22,-22],[-16,-18],[27,-41],[10,-43]],[[69707,76179],[9,11],[16,10],[26,-20],[23,-25],[5,-12],[-1,-13],[-55,-49],[-33,-23],[-15,-4],[-4,-7],[-11,-55],[-21,-10],[-27,-18],[-19,-25],[-30,-61],[-76,-89],[-1,-18],[7,-15],[24,-10],[33,-27],[18,-21],[48,27],[12,-6],[13,-28],[13,-80],[22,-21],[28,-17],[18,-5],[23,-20],[32,-7],[21,7],[26,-17],[4,7],[3,119],[22,-20],[13,1],[11,14],[6,20],[4,39],[-5,39],[10,18],[7,4],[6,-5],[3,-10],[1,-35],[16,-15],[10,-9],[9,-30],[9,-29],[6,-67],[22,-4],[26,-13],[17,13],[14,-8],[5,-32],[-1,-29],[2,-24],[7,-7],[23,15],[19,2],[18,-14],[22,-21],[32,-57],[10,-8],[48,-4],[10,-12],[17,0],[17,11],[40,-19],[1,-10],[-7,-14],[-94,-78],[-7,-24],[-19,-31],[-21,-17],[-10,-1],[-46,31],[-5,-7],[-4,-13],[0,-14],[10,-32],[-5,-21],[-8,-15],[-29,13],[-6,9],[0,9],[-11,0],[-17,-9],[-33,-57],[-12,-29],[-4,-18],[-15,-10],[-16,-4],[-20,-27],[-22,-20],[-7,15],[-5,17],[-6,5],[-13,-4],[-17,-1],[-17,19],[-23,20],[-20,6],[-58,-9],[-29,-9],[-9,-9]],[[69710,75022],[-16,-3],[-69,-19],[-14,7],[-10,31],[-9,33],[-18,12],[-20,9],[-7,13],[-1,16],[3,16],[1,8],[46,63],[42,57],[4,4],[3,11],[7,20],[0,10],[-31,23],[-1,10],[6,11],[0,14],[-22,41],[-38,65],[-11,6],[-8,-4],[-15,-62],[-7,-16],[-43,-41],[-37,-29],[-64,-50],[-17,-15],[-12,2],[-11,10],[-37,51],[-23,17],[-16,-17],[-13,-25],[1,-51],[-15,-27],[-15,-13],[27,-137],[-2,-18],[-21,-5],[15,-52],[-13,-6],[-32,12],[-44,8],[-84,-23],[-6,-9],[-2,-11],[5,-11],[40,-1],[40,6],[11,-10],[1,-17],[-4,-11],[-13,-2],[-29,-10],[-4,-11],[-1,-10],[10,-31],[11,-19],[2,-11],[-5,-10],[-6,-4],[-9,15],[-6,-3],[-2,-13],[-3,-15],[-7,-11],[-13,6],[-13,-5],[-8,-55],[-7,-62],[-22,-42],[-12,-15],[-18,-4],[-27,5],[-16,6],[-46,9],[-47,17],[-53,16],[-49,-37],[-14,-22],[-9,-21],[-9,-10],[-21,-129],[2,-14],[12,-12],[60,-26],[9,-11],[5,-13],[2,-58],[5,-8],[21,-7],[30,0],[23,6],[24,-5],[16,-13],[8,-20],[4,-21],[-28,-127],[3,-47],[8,-66],[16,-52],[30,-51],[23,-33],[5,-15],[1,-24],[-4,-31],[-13,-48],[-16,-42],[-17,-18],[-24,-54],[-22,-66],[-41,-86],[-13,-49],[-5,-139],[-11,-42]],[[68821,73255],[-1,16],[-15,16],[-26,-3],[-17,8],[-8,18],[-21,-5],[-34,-28],[-34,14],[-35,58],[-67,21],[-85,-13]],[[68478,73357],[-4,63],[1,81],[4,108],[28,84],[0,16],[-6,15],[-9,14],[-51,23],[-15,13],[-20,26],[-25,28],[-22,19],[-34,26],[-32,14],[-19,-11],[-17,-14],[-16,0],[-16,7],[-59,64],[-90,110],[-71,76],[-45,37],[-10,12],[-25,34],[-62,93],[-41,-14],[-58,61],[-53,59],[-11,15],[-60,109],[-60,71],[-65,77],[-42,48],[-71,82],[-34,49],[-12,18],[-12,35],[-18,170],[-22,78],[-30,43],[-26,82],[-22,121],[-17,79],[-14,36],[-29,40],[-43,44],[-41,21],[-15,-1],[-7,-5],[-9,-8],[-16,-33],[-24,-3],[-17,1],[-17,12],[-52,10],[-18,11],[-31,-1],[-67,-17],[-17,3],[-70,73],[-31,29],[-6,16],[0,28],[10,40],[9,28],[-4,30],[-13,32],[0,34],[9,19],[19,-6],[7,12],[-3,18],[-10,13],[-13,29],[-40,27],[-6,11],[2,12],[7,14],[1,28],[1,37],[5,19],[2,15],[-6,12],[-14,14],[-21,34],[-27,4],[-86,-1],[-27,13],[-22,19],[-21,73],[-11,17],[-11,7],[-24,2],[-29,7],[-15,13],[-41,66],[-39,59],[-16,-56],[-15,-11],[-34,5],[-26,10],[-15,-13],[-15,-22],[2,-15],[12,-15],[24,-28],[36,-70],[16,-38],[2,-13],[-3,-10],[-5,-5],[-7,0],[-9,1],[-6,11],[-2,20],[-12,30],[-12,17],[-14,11],[-19,8],[-25,14],[-13,1],[-12,-17],[-11,-22],[-6,-49],[-19,-60],[-11,-24],[-36,-14],[-84,-5],[-26,-19],[-17,-22],[-32,-74],[-22,-24],[-19,-33],[5,-108],[10,-126],[16,-35],[10,-11],[2,-12],[-7,-11],[-8,-14],[-13,-25],[-15,1],[-29,6],[-24,7],[-82,7],[-66,6],[-73,7]],[[65549,75646],[0,132],[0,132],[0,132],[-1,133],[0,132],[0,132],[0,132],[0,133],[0,132],[0,132],[0,132],[0,132],[0,133],[0,132],[0,132],[0,132],[35,17],[44,20],[42,20],[49,24],[57,27],[48,22],[57,27],[44,21],[41,20],[53,23],[82,36],[45,19],[46,21],[44,19],[30,7],[31,-27],[39,-38],[38,-38],[38,-38],[39,-38],[38,-38],[39,-38],[38,-38],[38,-38],[39,-37],[38,-38],[38,-38],[39,-38],[38,-38],[38,-38],[39,-38],[38,-38],[36,-35],[16,-26],[9,-58],[17,-46],[31,-49],[32,-51],[39,-68],[27,-46],[28,-48],[45,-78],[29,-49],[23,-2],[46,12],[61,15],[49,13],[59,15],[56,14],[44,11],[66,-9],[65,-8],[47,-6],[46,-6],[54,-7],[30,-4],[35,-4],[15,11],[30,25],[28,22],[30,24],[26,12],[27,-38],[22,-43],[24,-46],[28,-44],[27,-27],[36,-35],[20,-61],[28,-81],[18,-53],[19,-55],[27,22],[29,23],[27,21],[-4,-68],[-3,-61],[-4,-93],[-4,-77],[-9,-91],[-1,-69],[0,-61],[-1,-48],[51,-2],[38,-2],[47,-2],[5,-61],[6,-85],[10,-77],[8,-65],[12,-84],[6,-45],[12,-53],[11,-12],[18,-9],[62,6],[52,6],[41,4],[43,4],[58,6],[19,-13],[17,9],[19,9],[16,-38],[8,-19],[11,-21],[15,-18],[-7,-40],[-9,-57],[-3,-30],[18,-32],[14,-18],[36,-38],[34,-21],[23,-6],[21,8],[8,21],[-2,30],[-10,31],[1,37],[6,27],[22,49],[21,46],[32,47],[37,47],[16,34],[6,59],[25,34],[26,20],[33,18],[9,29],[46,50],[27,25],[35,15],[48,32],[37,39],[36,72],[29,47],[24,29],[21,1],[14,-23],[12,-2],[8,11],[14,30],[14,35],[14,15],[27,8],[24,23]],[[69625,75424],[-1,14],[-8,23],[-13,13],[-6,-5],[5,-19],[15,-28],[8,2]],[[69779,74822],[-14,-5],[-26,1],[-14,6],[9,46],[0,10],[-1,1],[-7,6],[-12,19],[-3,29],[4,26],[8,11],[5,-2],[16,-40],[14,-12],[27,-6],[-14,-40],[10,-42],[-2,-8]],[[69938,74855],[-7,-24],[-13,6],[-11,16],[4,13],[15,7],[8,7],[7,1],[-3,-26]],[[35174,32406],[-13,-21],[-15,-41],[-17,-97],[-58,-133],[-12,-76],[-62,-78],[-44,-89],[-29,2],[-26,-38],[-149,-115],[-54,22],[-39,-1],[-37,51],[-84,19],[-53,-21],[-71,-56],[-21,1],[-15,3],[-39,23],[-21,50],[-108,57],[-88,129],[-104,2],[-79,-17],[-12,18],[-8,33],[-17,48],[-68,114],[-54,113],[-10,111],[7,121],[16,144],[-2,44],[19,26],[20,5],[19,37],[17,56],[3,43],[-13,78],[-10,110],[-10,55]],[[33833,33138],[21,86],[1,42],[-12,37],[-4,38],[6,39],[-1,37],[-8,36],[6,30],[20,23],[15,36],[10,49],[5,37],[0,26],[-6,24],[-12,22],[5,46],[24,67],[15,60],[7,52],[0,43],[-8,32],[3,22],[15,11],[6,34],[-2,84],[-15,70],[11,55],[33,64],[18,52],[1,39],[10,22]],[[33997,34453],[16,-42],[47,-11],[47,-2],[7,11],[19,69],[24,20],[27,5],[29,-3],[31,-46],[87,-150],[64,-104],[20,-50],[17,-36],[12,-35],[-5,-89],[1,-39],[3,-11],[14,-1],[22,6],[18,19],[15,29],[14,23],[11,13],[4,19],[7,19],[6,4],[13,-14],[30,-51],[23,-47],[6,-27],[9,-28],[9,-25],[7,-23],[23,-32],[23,-19],[15,20],[39,-65],[85,-54],[16,-33],[15,-46],[30,-71],[41,-63],[34,-27],[32,-15],[18,-14],[12,-24],[20,-27],[12,-9],[4,-24],[13,-51],[13,-65],[14,-60],[31,-57],[36,-45],[36,-26],[21,-31],[9,-33],[-25,-48],[-27,-62],[-23,-48],[-25,-33],[-8,-23],[-5,-36],[0,-190],[-2,-70],[2,-19],[3,-13],[16,-18],[18,-16],[7,-3]],[[95272,54910],[3,-27],[-18,13],[-2,10],[10,10],[7,-6]],[[88372,57315],[-21,-47],[-1,16],[6,28],[9,32],[8,19],[11,6],[8,-27],[-9,-23],[-11,-4]],[[92123,56074],[-2,-7],[-17,3],[-2,4],[1,3],[8,4],[1,10],[-4,2],[4,6],[6,1],[4,-7],[2,-9],[-1,-10]],[[92188,56124],[-4,-3],[-3,3],[1,14],[2,5],[4,1],[8,-4],[1,-4],[-9,-12]],[[93975,55768],[-16,-13],[-20,5],[-6,47],[-10,13],[2,23],[15,19],[30,-15],[11,-34],[-7,-22],[1,-23]],[[97120,55201],[-6,-17],[-6,1],[6,13],[4,18],[6,51],[14,19],[10,21],[-3,-22],[-15,-23],[-10,-61]],[[96896,56053],[-4,-9],[-27,5],[-12,11],[1,9],[22,-8],[20,-8]],[[97659,55903],[11,-13],[20,1],[19,-32],[-7,2],[-10,14],[-10,6],[-12,-2],[-6,5],[-5,19]],[[97527,55955],[35,-30],[46,14],[-7,-9],[-17,-8],[-12,-8],[-8,0],[-9,3],[-29,21],[-17,27],[4,9],[14,-19]],[[96357,58267],[-7,-4],[-5,4],[4,8],[8,1],[3,-2],[-3,-7]],[[90474,62651],[-9,-22],[-7,16],[-2,31],[13,-3],[4,-6],[1,-16]],[[90475,61255],[-6,-4],[-9,2],[-6,9],[-2,15],[18,1],[7,-12],[-2,-11]],[[90350,59998],[-13,-27],[-10,6],[-6,9],[-2,15],[22,15],[10,-5],[-1,-13]],[[90493,62257],[-14,-13],[17,57],[5,10],[8,-21],[-16,-33]],[[90486,60560],[-1,-15],[-14,4],[-4,6],[8,52],[20,24],[10,5],[-9,-25],[-2,-27],[-8,-24]],[[90461,60466],[-12,-29],[-8,45],[-1,19],[10,17],[7,-1],[4,-51]],[[31987,62401],[-21,-5],[-28,27],[22,10],[15,-6],[12,-26]],[[32039,62415],[-19,-15],[-12,2],[-5,6],[10,18],[26,-11]],[[32009,62093],[24,-26],[28,0],[-30,-25],[-56,-3],[1,41],[33,13]],[[90205,59480],[-12,-1],[-10,20],[-3,13],[-1,66],[40,57],[13,55],[10,-5],[10,-9],[8,-16],[-44,-92],[-11,-88]],[[2576,43576],[-12,-5],[-14,27],[28,21],[8,11],[34,-6],[-20,-8],[-24,-40]],[[31630,62468],[9,-12],[8,2],[-6,23],[6,0],[53,-14],[34,-24],[35,-12],[3,-80],[-27,-32],[-18,-34],[-15,-41],[-38,-47],[-45,-15],[-31,-1],[-11,1],[-11,9],[-23,-8],[-29,21],[-24,-5],[-48,5],[-18,-19],[-18,-4],[-17,4],[-14,8],[-36,-1],[-15,16],[6,91],[1,41],[-9,35],[-10,21],[-7,25],[14,17],[12,24],[4,37],[12,9],[15,4],[69,-17],[173,-10],[10,-3],[6,-14]],[[31826,62272],[-22,-3],[-14,4],[-5,17],[27,16],[30,-2],[18,-10],[2,-6],[-36,-16]],[[31146,62246],[-2,-1],[-3,1],[-1,1],[-2,6],[-8,8],[-2,8],[2,9],[3,3],[16,1],[2,-1],[3,-6],[0,-4],[-1,-4],[-3,-10],[-1,-2],[-1,-3],[-1,-5],[-1,-1]],[[13126,84403],[-3,-8],[-36,1],[-12,7],[-5,24],[3,23],[8,18],[10,34],[8,56],[52,-63],[16,-28],[8,-35],[-18,-13],[-22,-6],[-9,-10]],[[13117,84243],[-15,-2],[-16,9],[-40,47],[-1,14],[6,15],[22,29],[10,7],[54,-3],[17,-8],[4,-13],[0,-14],[-6,-13],[-1,-15],[3,-15],[-7,-15],[-30,-23]],[[12691,85385],[-2,-15],[-38,2],[-38,21],[-19,27],[4,13],[35,11],[34,-26],[24,-33]],[[9689,86599],[-9,-14],[-24,5],[-13,9],[44,37],[7,-8],[-5,-29]],[[9843,86300],[-14,-3],[20,38],[27,41],[26,27],[32,11],[-3,-20],[-43,-35],[-45,-59]],[[8883,86442],[-15,-17],[-55,10],[12,35],[42,22],[46,-34],[-30,-16]],[[7772,86613],[-13,-2],[17,28],[13,56],[17,-8],[3,-10],[-28,-57],[-9,-7]],[[5464,83719],[-4,-45],[-38,29],[-10,14],[7,11],[36,2],[9,-11]],[[5733,83509],[-9,-3],[-8,6],[-10,33],[-1,13],[20,-10],[7,-24],[1,-15]],[[5690,83612],[-1,-46],[-4,-7],[-8,12],[-15,-13],[-9,10],[4,16],[-1,12],[11,1],[3,23],[-2,9],[6,21],[8,5],[8,-43]],[[3831,82789],[-4,-1],[-7,14],[-1,13],[5,9],[13,22],[9,8],[11,4],[3,-6],[-10,-26],[-12,-17],[-7,-20]],[[1109,81688],[-24,-12],[-31,25],[3,30],[34,-25],[18,-18]],[[3858,89992],[-10,-3],[0,9],[32,23],[58,29],[-2,-6],[-31,-23],[-47,-29]],[[2371,88502],[5,-14],[29,2],[40,-6],[45,-14],[45,5],[56,43],[33,11],[34,6],[37,-10],[35,-23],[14,-13],[11,-24],[7,-28],[11,-21],[67,-25],[42,-10],[10,-14],[9,-19],[36,-14],[37,5],[20,-5],[63,-1],[77,-21],[-12,-56],[-25,-24],[-72,7],[-71,-8],[-29,-28],[-25,-37],[-3,-35],[-14,-16],[-15,-7],[-12,19],[-17,60],[-11,16],[-12,11],[-35,19],[-35,12],[-21,1],[-15,21],[-8,30],[-14,15],[-28,22],[-29,17],[-89,38],[-29,5],[-30,-4],[-32,-17],[-31,-26],[-31,-19],[-33,-4],[-32,11],[-29,25],[-15,18],[-8,30],[1,30],[4,29],[16,71],[27,14],[51,-50]],[[3851,86626],[26,-29],[13,-1],[43,8],[16,-6],[15,-12],[9,-19],[2,-33],[-7,-30],[2,-41],[-1,-18],[22,-24],[8,-32],[3,-34],[-49,-12],[-49,-2],[-43,-23],[-9,-17],[7,-26],[-11,-6],[-11,5],[-21,24],[-22,11],[-79,18],[-100,69],[-42,14],[-44,50],[-39,64],[25,10],[26,5],[116,-9],[14,46],[15,11],[36,13],[35,25],[15,0],[16,-10],[32,15],[17,3],[14,-7]],[[7528,85151],[2,-31],[12,3],[42,33],[23,10],[29,1],[23,-15],[4,-11],[-2,-14],[-18,-27],[1,-18],[19,-33],[49,-18],[6,-10],[0,-12],[-34,-55],[-12,-12],[-9,-3],[-61,9],[-55,18],[-23,3],[-8,-5],[-15,-17],[11,-5],[49,-4],[17,-25],[7,-18],[4,-20],[-10,-8],[-20,-6],[-25,0],[-31,-22],[-17,-25],[-62,-7],[-47,-34],[-17,-17],[-6,-20],[-17,-15],[-41,-14],[24,-13],[4,-11],[1,-16],[-4,-13],[-31,-59],[-60,-48],[-15,2],[-7,6],[-5,9],[-1,9],[78,98],[-3,4],[-21,4],[-34,26],[-23,-17],[-5,1],[6,23],[15,27],[-3,8],[-8,7],[-19,4],[-31,1],[-22,-6],[-15,-15],[-1,-6],[31,2],[9,-7],[8,-14],[5,-16],[2,-17],[-7,-24],[-14,-30],[-22,5],[-44,67],[-20,97],[-38,75],[-2,18],[11,46],[38,65],[42,18],[29,27],[28,9],[18,-1],[24,-12],[10,-25],[-6,-12],[2,-6],[17,-15],[18,-52],[21,-47],[14,-19],[19,-12],[-19,36],[-12,44],[-5,88],[-6,23],[11,6],[30,-3],[-1,13],[-32,29],[-19,25],[-8,19],[1,17],[17,25],[10,7],[10,3],[21,-5],[9,-8],[26,-56],[12,-17],[10,0],[10,9],[9,18],[8,12],[10,3],[29,-8],[10,3],[4,14],[0,25],[7,9],[2,18],[-16,27],[18,9],[61,-21],[25,-23],[-13,-42]],[[13882,84036],[-14,-30],[-10,-32],[-7,-35],[-3,-37],[2,-40],[5,-35],[17,-65],[6,-39],[1,-27],[-38,-92],[-13,-45],[1,-19]],[[13829,83540],[-27,-47],[-50,-64],[-23,-37]],[[13729,83392],[-11,12],[-65,10],[-24,82],[-12,64],[-19,55],[0,13],[17,37],[65,31],[1,12],[-24,8],[-6,13],[-7,60],[2,53],[-2,35],[-10,72],[-17,43],[-41,86],[-4,21],[18,27],[12,25],[-71,-43],[-96,-46],[-42,-32],[-9,-13],[-3,-11],[8,-30],[-1,-10],[-9,-18],[-10,-51],[-21,-53],[-10,-11],[-38,20],[-10,17],[-19,70],[5,19],[13,15],[19,34],[24,52],[45,133],[29,1],[52,26],[-82,13],[-12,7],[-11,18],[-9,29],[-17,33],[-31,11],[-13,12],[-21,39],[-14,18],[-7,22],[-1,26],[-6,13],[-21,5],[-12,9],[-3,67],[-42,17],[-18,15],[-28,42],[-7,21],[-3,17],[7,46],[-3,9],[-25,-5],[-153,72],[8,95],[-28,125],[-31,51],[6,19],[7,11],[13,0],[59,-37],[56,-44],[7,7],[-89,92],[-22,28],[-5,33],[-1,18],[7,10],[84,-9],[4,7],[-84,27],[-17,0],[-18,-39],[-9,-9],[-18,2],[-6,6],[-22,47],[-20,33],[-38,45],[-7,33],[-2,47],[5,45],[31,103],[13,18],[3,11],[-10,-1],[-9,-10],[-25,-48],[-27,-78],[-21,-27],[-14,6],[-20,32],[-43,39],[-50,10],[-31,40],[-46,111],[-6,55],[-6,14],[-25,18],[-16,26],[-24,135],[-31,93],[-8,50],[3,49],[-4,5],[-11,-38],[-3,-20],[-20,-5],[19,-39],[5,-19],[-10,1],[-19,-5],[33,-66],[14,-102],[21,-76],[14,-62],[7,-47],[9,-44],[25,-99],[3,-20],[-3,-16],[-8,-19],[-14,-7],[-45,13],[-17,25],[-24,44],[-34,21],[-84,-10],[-6,3],[0,37],[10,65],[-8,26],[-44,96],[1,19],[60,44],[-29,3],[-24,-17],[-9,11],[-14,62],[-9,23],[-5,4],[-2,-58],[10,-31],[1,-17],[-1,-25],[-7,-18],[-11,-11],[-11,-2],[-20,12],[-23,23],[-19,11],[-8,10],[-9,25],[-15,20],[-74,24],[-44,30],[-3,-8],[13,-31],[2,-19],[-11,-5],[-20,-30],[6,-4],[21,10],[23,-1],[39,-19],[35,-23],[12,-13],[6,-20],[4,-7],[34,-23],[2,-12],[-22,-35],[45,3],[27,-12],[34,-56],[11,-30],[2,-40],[-7,-11],[-14,-8],[-92,-13],[-34,-48],[-7,-1],[-25,13],[-46,38],[-58,36],[-131,108],[-3,5],[-3,20],[-9,11],[-17,9],[-25,27],[-32,45],[-19,36],[-8,25],[-18,29],[-59,61],[-31,23],[-28,13],[-24,3],[-6,8],[11,13],[2,8],[-53,13],[-50,28],[-127,80],[-65,50],[-39,24],[-16,13],[-7,11],[9,12],[26,12],[17,13],[27,51],[2,16],[-14,37],[-7,33],[0,19],[4,18],[4,12],[11,12],[9,6],[10,-4],[32,-46],[4,-17],[-1,-63],[9,-73],[3,5],[3,24],[2,47],[4,22],[6,22],[12,12],[36,-7],[17,4],[-71,33],[-44,62],[-8,7],[-24,3],[-26,-26],[-66,-82],[-19,-14],[-83,-46],[-57,-9],[-63,7],[-54,15],[-136,72],[-21,17],[31,44],[2,14],[-11,45],[-9,13],[-13,8],[-4,-6],[0,-13],[3,-25],[-10,-13],[-23,-14],[-39,-15],[-120,37],[-124,30],[-110,7],[-156,-25],[-83,-24],[-48,-2],[-47,4],[-4,17],[21,10],[-1,12],[-27,39],[-40,23],[-55,8],[-32,11],[-8,14],[-19,14],[-31,13],[-13,23],[10,71],[11,43],[10,30],[27,48],[-9,-3],[-39,-36],[-33,-37],[-32,-48],[-18,-22],[-24,-20],[-37,5],[-50,30],[-43,15],[-36,1],[-15,5],[25,27],[14,22],[19,34],[5,17],[-132,5],[-5,19],[0,13],[-4,11],[-19,8],[-27,-6],[-43,-22],[-19,17],[7,9],[14,7],[28,31],[-38,16],[-20,18],[-10,16],[1,55],[10,35],[87,34],[-27,13],[-56,-5],[-37,-29],[-43,-41],[-30,-16],[-15,11],[-20,3],[-25,-3],[-16,-11],[-9,-18],[-10,-12],[-11,-6],[-8,2],[-12,18],[-25,12],[-12,14],[-7,-9],[-9,-27],[-9,-13],[-42,-14],[-23,2],[-28,34],[-4,12],[10,29],[61,115],[-6,-1],[-20,-18],[-39,-46],[-18,-14],[-30,-1],[-14,5],[-17,-4],[-20,-12],[-13,-14],[-6,-15],[4,-2],[30,17],[17,4],[5,-8],[-24,-52],[-14,-50],[-13,-12],[-22,2],[-24,-5],[0,-14],[44,-39],[16,-6],[20,-14],[3,-14],[-7,-38],[-6,-15],[-9,-8],[-36,1],[-12,-4],[-24,-24],[-12,-19],[4,-2],[21,16],[31,9],[39,1],[30,9],[20,16],[19,-4],[18,-26],[6,-22],[-8,-19],[-15,-13],[-23,-9],[-15,-12],[-6,-16],[-3,-24],[-1,-32],[6,-58],[-5,-7],[-8,-5],[-13,0],[-12,-14],[-27,-76],[-9,-9],[-12,8],[-10,0],[-9,-10],[-19,-8],[-30,-5],[-25,2],[-45,16],[-18,12],[-15,19],[-40,-20],[-11,9],[-25,53],[-5,-3],[-5,-58],[-8,-20],[-25,-41],[-13,-71],[-4,-3],[-5,11],[-15,63],[-8,14],[-23,-36],[-2,-14],[6,-47],[-6,-7],[-45,25],[-11,2],[-3,-5],[15,-37],[-1,-13],[-65,-71],[-17,3],[-10,7],[-12,-1],[-41,-27],[-11,1],[-15,16],[-7,-1],[-4,-16],[-1,-32],[-15,-30],[-49,-49],[-13,-23],[-9,-31],[-8,-3],[-28,20],[-33,13],[-5,-6],[10,-19],[-2,-12],[-14,-4],[-18,2],[-22,7],[-31,-8],[-40,-25],[-33,0],[-46,41],[-12,3],[-4,12],[9,33],[13,25],[9,12],[44,32],[50,12],[31,19],[39,40],[20,30],[40,77],[-3,6],[-9,4],[-88,-73],[-13,-7],[-17,1],[-70,28],[-14,12],[-11,35],[20,80],[13,39],[35,60],[44,64],[15,41],[24,110],[-2,51],[-10,61],[-1,36],[10,12],[102,56],[49,43],[94,62],[25,0],[19,-22],[22,-17],[25,-13],[32,1],[39,16],[62,-6],[128,-41],[27,-2],[1,5],[-19,29],[-89,17],[-37,16],[-104,74],[-24,28],[10,14],[26,11],[8,10],[4,19],[15,25],[25,32],[39,31],[75,46],[-29,2],[-54,-8],[-19,-9],[-36,-33],[-14,-23],[-20,-46],[-8,-8],[-37,-7],[-101,-4],[-17,23],[-9,4],[-13,-4],[-92,-59],[-34,-30],[-23,-35],[-37,-25],[-49,-16],[-37,-20],[-39,-40],[-14,-30],[0,-14],[9,-45],[-10,-9],[-22,-3],[-36,-30],[-76,-89],[-10,-32],[0,-11],[12,-25],[-8,-17],[-22,-25],[-48,-41],[-31,-16],[-20,-1],[-20,6],[-35,26],[-28,2],[-2,-4],[39,-28],[39,-36],[24,-30],[10,-24],[0,-25],[-9,-25],[-27,-44],[-27,-13],[-70,-13],[-22,-11],[-7,-8],[48,-18],[4,-10],[-6,-37],[-13,-12],[-40,-22],[-35,-6],[-6,4],[7,29],[-2,7],[-13,6],[-19,-11],[-47,-43],[-5,-7],[17,-11],[-4,-10],[-26,-30],[-10,-21],[-17,-20],[-76,-64],[5,-15],[-19,-56],[-11,-49],[13,-20],[64,-24],[31,-6],[37,-17],[66,-45],[22,-30],[3,-14],[-2,-15],[-8,-21],[-21,-38],[-50,-58],[-22,-16],[-34,-13],[-12,-10],[-43,-54],[-12,-30],[2,-26],[-9,-18],[-56,-35],[2,-6],[20,-3],[-7,-31],[-3,-43],[-10,-8],[-36,1],[-44,-17],[-3,-5],[-1,-31],[-118,-23],[-25,-59],[-14,-18],[-45,-43],[-29,-18],[-32,-10],[-17,-15],[-1,-18],[-9,-17],[-28,-26],[-14,-34],[-10,-5],[-51,-8],[-11,-11],[-5,-46],[-9,-1],[-19,11],[-24,-9],[-53,-51],[-12,-18],[1,-10],[8,-10],[13,-31],[-1,-20],[-20,-58],[-8,-9],[-25,-14],[-10,-32],[-23,4],[-19,-6],[-12,-21],[-14,-12],[-14,-4],[-18,-16],[-22,-31],[-20,-19],[-18,-9],[-18,-2],[-18,5],[-16,-4],[-14,-11],[-13,-18],[-11,-50],[-14,-22],[-9,-4],[-17,4],[-27,10],[-28,-4],[-44,-30],[-14,-23],[28,-5],[14,-7],[-1,-7],[-14,-6],[-25,1],[-14,-6],[-19,-13],[-45,-14],[-17,-10],[-34,-58],[-4,-13],[4,-3],[19,6],[23,-10],[11,-12],[8,-15],[7,-29],[4,-4],[-43,-49],[-12,-21],[-8,-8],[-5,6],[-6,55],[-3,9],[-10,1],[-10,-17],[-22,-65],[-23,-32],[-178,-83],[-26,-19],[-5,-35],[-7,-31],[-12,-24],[-14,-16],[-3,11],[1,86],[-3,18],[-18,11],[-8,-2],[-11,-5],[-18,-18],[-10,-5],[-14,1],[-23,-18],[-55,-59],[-36,-15],[-10,-12],[-15,-32],[-10,-12],[-15,-1],[-20,10],[-16,-7],[-12,-24],[-13,-9],[-35,17],[-15,-11],[-20,-31],[-21,-20],[-22,-9],[-56,-11],[-23,7],[-5,9],[1,38],[9,28],[9,13],[11,12],[17,1],[31,-8],[-4,9],[-11,11],[-29,19],[-28,10],[-16,-6],[-23,-15],[-15,-17],[-8,-19],[-10,-63],[-6,-17],[-67,-111],[-26,-34],[-25,2],[-13,-13],[-17,-27],[-17,-13],[-14,1],[-12,5],[-8,9],[1,9],[11,8],[-4,22],[-19,37],[-13,19],[-24,3],[-4,-17],[8,-84],[-1,-19],[-15,-24],[-41,-27],[-12,2],[-37,53],[-34,11],[-2,-17],[7,-36],[-8,-32],[-25,-31],[-19,-15],[-13,1],[-1,21],[12,42],[3,35],[-6,28],[1,22],[7,15],[45,41],[20,7],[10,-11],[13,-1],[15,6],[10,14],[4,19],[20,26],[35,31],[40,57],[46,83],[53,72],[62,60],[66,48],[134,66],[10,-4],[-12,-21],[8,-14],[13,-1],[49,10],[20,14],[6,-13],[-7,-17],[-30,-17],[1,-14],[43,-67],[13,-10],[12,1],[4,9],[-3,48],[14,9],[30,2],[19,-6],[9,-15],[17,-12],[25,-10],[15,3],[6,16],[-10,19],[-48,40],[-13,18],[-3,23],[7,31],[14,45],[24,60],[21,42],[42,47],[29,23],[72,72],[140,73],[34,47],[47,52],[20,13],[0,-20],[6,-18],[32,-12],[20,-4],[10,4],[2,19],[-4,34],[-1,33],[2,30],[4,24],[21,43],[31,49],[43,57],[27,26],[25,14],[24,25],[42,58],[14,10],[30,11],[11,-5],[7,-14],[8,-10],[30,-8],[21,13],[-4,7],[-16,5],[-11,8],[-10,35],[-20,21],[-5,24],[4,37],[17,87],[3,90],[16,51],[31,19],[69,13],[-40,23],[-16,0],[-26,11],[-10,56],[0,40],[18,47],[64,80],[71,55],[-10,4],[-8,17],[32,110],[32,98],[-43,-84],[-50,-64],[-145,-74],[-99,-63],[-47,-14],[-31,15],[-24,60],[-14,22],[-18,39],[8,50],[14,35],[31,6],[34,-17],[31,-1],[-39,34],[-56,30],[-26,-9],[-19,-49],[-26,-34],[-23,12],[-14,14],[10,-41],[-18,-63],[-6,-43],[25,-115],[-5,-45],[-45,-21],[-37,37],[-76,145],[-27,41],[-60,69],[-20,-10],[-25,-34],[-24,-9],[-65,50],[-30,37],[-28,46],[-44,-25],[-38,-30],[-44,-48],[-30,0],[-81,-41],[-9,-1],[-11,-22],[-11,-10],[-10,-43],[-109,-33],[-108,19],[38,23],[42,19],[37,44],[-16,60],[-3,30],[1,38],[40,54],[-42,0],[-27,-19],[-25,40],[-12,79],[29,47],[13,36],[12,50],[1,43],[-23,72],[-63,153],[-29,115],[-50,60],[37,100],[41,91],[54,40],[-4,6],[-30,0],[-19,-5],[-18,-30],[-18,-22],[-56,-116],[-37,-56],[-23,-16],[38,-22],[6,-19],[7,-41],[-10,-51],[-10,-28],[-45,2],[-40,-41],[-95,-44],[-128,-26],[-63,3],[-65,52],[0,30],[3,26],[-94,90],[-54,89],[-38,2],[-33,23],[-39,37],[3,30],[6,21],[-24,15],[-31,-2],[-36,11],[94,114],[32,77],[27,11],[34,-12],[47,-30],[40,-14],[14,-14],[15,-27],[-16,-45],[-14,-31],[17,8],[50,49],[37,43],[17,-4],[12,-8],[20,-44],[25,-45],[56,43],[30,53],[-25,24],[-31,13],[-79,19],[20,15],[50,-2],[19,15],[-20,20],[-25,18],[-68,-60],[-124,3],[-87,35],[-87,-6],[-13,7],[-17,19],[49,45],[34,25],[2,14],[-20,2],[-38,-12],[-17,21],[3,36],[-6,-4],[-15,-19],[-21,10],[-18,16],[9,17],[19,24],[-8,3],[-17,-5],[-16,-31],[3,-25],[0,-36],[-28,-7],[-24,5],[-17,36],[-17,78],[-48,20],[-12,39],[30,51],[-13,26],[-32,8],[-37,-25],[-17,22],[-3,25],[-1,36],[10,3],[9,-7],[74,20],[7,10],[-59,30],[-16,31],[24,18],[44,2],[61,19],[-25,33],[-6,18],[-5,31],[10,51],[72,117],[71,98],[22,22],[32,12],[30,-9],[31,-21],[6,9],[-11,9],[-13,40],[43,15],[26,45],[2,13],[-28,-18],[-29,-31],[-7,31],[-7,71],[12,68],[10,30],[24,29],[69,11],[13,-6],[2,14],[-41,42],[17,34],[15,17],[84,27],[45,-9],[58,-31],[33,-39],[-5,-20],[-8,-12],[-17,-13],[-7,-10],[3,-8],[25,24],[40,28],[23,-12],[17,-23],[20,1],[63,19],[32,20],[39,53],[51,34],[73,108],[21,44],[25,7],[23,-4],[15,-37],[23,-10],[130,9],[67,16],[46,35],[48,59],[28,40],[13,52],[-17,66],[-18,56],[-23,127],[-64,83],[-46,25],[-30,-3],[22,53],[61,-6],[40,11],[33,26],[10,19],[16,40],[-5,42],[-9,23],[-22,26],[-27,37],[-18,12],[-16,-1],[-78,-74],[-46,-2],[-35,14],[-30,-42],[-85,-37],[-45,-38],[-84,-93],[-21,-43],[-26,-2],[-19,82],[-91,79],[-28,-27],[15,-25],[21,-17],[34,-8],[-15,-23],[-11,-32],[-34,30],[-61,43],[-63,22],[-164,-3],[-108,-44],[-10,9],[-10,4],[-18,-11],[-8,-17],[-11,-12],[-22,-4],[-45,7],[-85,27],[-194,41],[-50,24],[-44,59],[1,40],[19,17],[-1,58],[-38,15],[-77,82],[-28,35],[6,4],[14,-9],[26,-7],[64,11],[22,53],[48,16],[44,-8],[-10,15],[-11,11],[-114,27],[-16,-8],[-205,48],[-162,84],[-13,16],[-15,36],[22,35],[22,17],[1,-20],[3,-19],[93,45],[48,58],[92,10],[22,16],[28,31],[41,54],[58,28],[39,25],[51,15],[44,-25],[13,-3],[80,-5],[26,11],[11,8],[8,12],[-78,45],[8,25],[10,18],[91,52],[70,17],[37,-1],[108,68],[59,19],[112,13],[92,3],[25,-24],[-49,5],[-22,-4],[15,-9],[18,-17],[-5,-22],[-31,-66],[3,-53],[-20,-17],[-19,-24],[94,-76],[146,-5],[79,14],[45,-23],[38,-5],[103,12],[78,-16],[33,6],[72,113],[28,18],[31,-20],[40,-16],[25,12],[21,-29],[-10,61],[-14,23],[-118,41],[-78,-20],[-25,23],[8,47],[-84,115],[-35,24],[-42,1],[-21,40],[-18,51],[36,21],[33,10],[30,-17],[33,-67],[32,-10],[-9,-68],[39,-62],[89,-57],[70,21],[50,-1],[30,-12],[74,-52],[37,-6],[116,27],[1,51],[-9,37],[-28,23],[-78,-5],[-62,38],[-52,-10],[-96,-58],[-48,23],[-30,31],[-49,31],[-6,60],[41,69],[30,32],[-27,24],[-68,17],[-119,-18],[-5,24],[0,25],[-48,-49],[-50,10],[-66,-5],[-148,43],[-52,54],[-22,43],[-40,119],[-50,75],[-351,252],[-159,64],[-77,70],[-48,17],[-46,8],[-59,22],[40,28],[27,10],[-28,-30],[21,-7],[35,17],[18,20],[27,85],[28,129],[-7,51],[194,-10],[129,8],[43,12],[163,20],[43,14],[78,43],[92,77],[80,101],[12,27],[5,-7],[7,5],[9,38],[10,90],[39,85],[168,193],[77,77],[26,35],[27,25],[19,-24],[9,-7],[5,-11],[-16,-6],[-26,-25],[-36,-16],[-9,-9],[22,2],[63,18],[36,22],[179,41],[97,66],[3,15],[144,84],[20,-4],[23,-10],[-40,-55],[28,-14],[-25,-66],[52,-1],[12,-30],[3,26],[-1,37],[4,37],[8,25],[36,-11],[83,27],[-100,4],[-60,59],[-33,1],[111,87],[102,53],[23,-1],[11,-10],[2,-16],[-22,-10],[-21,-19],[10,-16],[15,-3],[48,14],[22,17],[105,-2],[30,13],[8,12],[134,2],[25,9],[85,46],[78,57],[36,31],[61,79],[53,51],[87,51],[21,-6],[-28,-10],[-20,-22],[27,-29],[183,-59],[46,-4],[18,-35],[-15,-34],[-47,-38],[-95,-39],[29,-15],[19,-35],[28,-4],[46,13],[35,21],[74,70],[24,39],[17,9],[62,-9],[35,-20],[40,-35],[-15,-34],[-16,-20],[52,-26],[57,-6],[55,-21],[77,44],[60,9],[57,-2],[73,24],[125,-32],[31,8],[50,-5],[53,-20],[19,-21],[-57,-44],[-9,-46],[20,-19],[36,-4],[4,-27],[23,-6],[112,2],[-9,-13],[-5,-15],[-35,-34],[200,-20],[27,19],[41,8],[88,26],[33,-12],[39,-26],[36,-6],[34,6],[78,38],[91,2],[37,-13],[39,6],[118,-44],[44,-5],[58,-57],[30,-1],[34,24],[29,-1],[29,-23],[47,-7],[22,-37],[24,-13],[178,-27],[88,13],[129,-4],[62,-17],[65,2],[107,-63],[56,-9],[11,-15],[161,-15],[56,33],[98,8],[88,28],[50,0],[59,-7],[22,3],[16,12],[142,-47],[79,-55],[35,-40],[166,-57],[48,-32],[33,-36],[19,-3],[14,10],[58,-3],[22,-5]],[[10833,91964],[0,-168],[0,-169],[0,-168],[0,-168],[0,-169],[0,-168],[0,-168],[0,-169],[0,-168],[0,-168],[0,-169],[0,-168],[0,-168],[0,-169],[0,-168],[0,-168],[0,-168],[0,-169],[0,-168],[0,-168],[0,-169],[0,-168],[0,-168],[0,-169],[0,-168],[0,-168],[0,-169],[0,-168],[0,-168],[0,-169],[0,-168],[0,-168],[66,-24],[66,-23],[20,46],[71,-35],[62,-32],[40,40],[43,44],[58,3],[65,3],[43,3],[0,-37],[-16,-62],[-14,-51],[40,-52],[48,-27],[46,-26],[20,-71],[50,-55],[37,-41],[36,-40],[52,-57],[37,-40],[48,-53],[29,-32],[13,-61],[17,-74],[-10,-44],[23,-7],[44,49],[42,30],[52,38],[35,25],[65,1],[31,74],[1,103],[32,-2],[20,14],[8,31],[-20,41],[62,19],[45,14],[65,39],[63,37],[30,-29],[29,-28],[59,-67],[4,-16],[-4,-32],[-6,-31],[35,-88],[11,-10],[29,-12],[35,-29],[15,-26],[50,-40],[9,-17],[4,-27],[9,-23],[9,-17],[9,-24],[22,-28],[41,-31],[29,-22],[40,-30],[41,-62],[36,-54],[40,-54],[-6,-42],[41,-66],[43,-84],[33,-74],[24,-41],[28,-60],[34,-74],[39,-83],[30,-54],[39,-75],[20,-45],[-13,-31],[-17,-38],[51,-18],[34,-12],[-8,-42],[-12,-56],[40,-22],[26,-15],[-5,-29],[15,-33],[2,-55],[48,4],[21,2],[29,-25],[38,-32],[38,-30],[32,-25],[42,-15],[53,-22],[25,-44],[48,-20],[18,-62],[55,-23],[33,16],[11,-26],[9,-29],[3,-37],[-3,-36]],[[4590,83513],[27,-95],[12,-18],[17,-10],[24,-11],[15,-14],[12,-21],[2,-10],[-76,38],[-48,-56],[-15,-7],[-136,-3],[-27,-10],[-18,-18],[-31,-52],[-16,-19],[-16,-12],[-36,-14],[-42,2],[-22,7],[-12,24],[-11,48],[0,14],[5,23],[38,31],[12,17],[49,109],[14,15],[16,4],[41,-8],[36,32],[77,48],[17,6],[55,1],[16,-8],[11,-13],[10,-20]],[[12971,83838],[6,-16],[0,-11],[-40,-38],[-1,-8],[-9,-23],[-9,-9],[-15,-26],[-28,-27],[4,83],[-28,48],[28,24],[19,-7],[31,-3],[30,22],[12,-9]],[[13517,83571],[28,-75],[2,-27],[-28,-9],[-21,4],[-11,8],[-3,13],[7,38],[-14,22],[-16,8],[-15,-14],[0,38],[11,27],[-7,36],[0,28],[4,9],[15,-1],[30,-29],[18,-76]],[[13302,84164],[-6,-96],[-11,5],[-10,1],[-22,-14],[-22,6],[-11,11],[-4,12],[4,28],[-12,16],[-42,6],[-16,7],[-9,30],[-2,39],[7,14],[21,11],[16,47],[10,7],[35,94],[17,-7],[31,-57],[39,-83],[-13,-77]],[[13617,83806],[-10,-63],[-19,-65],[-29,-35],[-21,8],[-15,28],[-14,-1],[-15,6],[-8,23],[8,30],[-7,23],[-8,-20],[-13,-19],[-33,-24],[-23,-47],[-11,-30],[-13,33],[-9,78],[-1,33],[24,50],[31,48],[6,142],[99,71],[9,-4],[32,-53],[35,-74],[8,-34],[1,-58],[-4,-46]],[[12954,84679],[18,-18],[10,19],[19,-1],[35,-17],[20,-25],[12,-29],[1,-17],[-3,-40],[2,-40],[-1,-20],[-5,-18],[-8,-13],[-8,-2],[-27,36],[-31,65],[-24,20],[-1,-7],[7,-18],[19,-35],[3,-21],[14,-26],[6,-19],[3,-26],[0,-22],[-4,-19],[-6,-12],[-9,-6],[-47,6],[-28,-13],[-33,7],[-8,11],[-5,19],[-2,46],[-9,66],[2,50],[-21,46],[-18,27],[-26,25],[-18,24],[5,20],[27,14],[44,-3],[95,-34]],[[13094,83464],[6,-8],[7,5],[12,21],[20,-4],[14,-7],[9,-8],[-5,-30],[-4,-49],[-8,-17],[-8,-24],[-28,14],[-23,31],[-33,53],[-19,38],[-1,16],[-12,12],[-22,66],[-13,52],[-21,6],[-26,15],[-10,29],[7,25],[37,12],[55,-64],[9,-28],[20,-32],[3,-44],[10,-18],[24,-62]],[[9335,86664],[6,-16],[53,4],[16,-3],[6,-7],[-7,-11],[-21,-14],[-60,-25],[-49,-33],[-6,3],[-9,36],[-9,15],[-6,20],[0,7],[9,14],[18,20],[13,8],[46,-18]],[[8962,86297],[-31,-8],[-7,17],[16,42],[13,24],[10,6],[35,48],[39,35],[36,51],[37,72],[6,27],[17,3],[28,-18],[17,-25],[-8,-20],[-92,-103],[-8,-13],[-8,-35],[-8,-13],[-12,-5],[-9,-15],[-5,-25],[-11,-14],[-18,-1],[-12,-7],[-6,-12],[-19,-11]],[[8984,86664],[0,-15],[-9,-14],[8,-27],[-14,-46],[-6,-29],[-8,-19],[-7,-7],[-8,4],[-2,11],[5,16],[-18,-1],[-6,40],[10,13],[4,17],[1,12],[12,51],[4,3],[2,-12],[3,-3],[7,5],[9,22],[4,3],[9,-24]],[[8908,86881],[-35,-5],[-16,7],[-3,8],[7,29],[0,12],[17,5],[21,-14],[6,-14],[3,-28]],[[7498,84749],[-35,-19],[-7,1],[-21,-38],[-17,-16],[-22,30],[5,46],[20,30],[97,-10],[7,-9],[1,-7],[-8,-6],[-20,-2]],[[7643,85532],[-9,-4],[-20,18],[-13,19],[9,14],[39,30],[19,0],[8,-4],[3,-10],[-2,-13],[-8,-18],[-26,-32]],[[7433,85166],[-8,-16],[-7,4],[-16,19],[-31,28],[-15,18],[-1,8],[11,9],[38,-22],[15,-20],[14,-28]],[[6787,83998],[-11,-19],[-21,2],[-12,6],[-3,16],[32,48],[7,6],[6,-2],[3,-20],[-1,-37]],[[7032,84352],[-19,-14],[-6,5],[-1,11],[5,18],[9,18],[29,34],[29,23],[15,-2],[6,-14],[-19,-30],[-48,-49]],[[7164,84397],[-13,-1],[-21,15],[3,18],[29,22],[29,-3],[3,-12],[-2,-14],[-2,-8],[-9,-8],[-17,-9]],[[5365,83706],[4,0],[9,4],[18,33],[6,1],[0,-10],[-8,-32],[14,-43],[13,-21],[-1,-7],[-34,-15],[-25,11],[-14,-4],[-12,-15],[-9,17],[-6,79],[2,14],[14,27],[18,13],[8,-4],[7,-11],[1,-11],[-5,-26]],[[4917,83436],[-6,-2],[-20,17],[-7,14],[-5,20],[39,30],[8,0],[8,-16],[1,-14],[-11,-37],[-7,-12]],[[4846,83180],[-24,-13],[-26,13],[-22,25],[-2,28],[49,-18],[10,-9],[15,-26]],[[5591,83599],[-17,-13],[-5,-16],[-13,-7],[-11,-13],[-37,-59],[-16,-11],[18,51],[3,16],[0,10],[-5,38],[10,-1],[9,8],[18,34],[16,3],[17,40],[9,3],[4,-6],[-7,-24],[16,-22],[-4,-22],[-5,-9]],[[3933,82989],[-11,-10],[-8,-2],[-7,6],[-28,-7],[-6,4],[-13,34],[-1,18],[5,14],[13,13],[21,11],[21,-2],[35,-32],[17,-18],[3,-12],[-12,-11],[-29,-6]],[[4011,83027],[-12,-4],[-3,6],[-2,25],[-9,40],[18,15],[11,3],[4,-6],[13,-30],[13,-8],[9,-6],[-16,-9],[-26,-26]],[[5300,85585],[-20,-9],[-22,5],[-17,57],[13,1],[28,38],[60,30],[15,4],[-57,-126]],[[2016,86668],[60,-38],[39,4],[30,-31],[13,-26],[-46,19],[-66,-2],[-90,77],[-32,18],[7,43],[35,22],[17,-58],[33,-28]],[[2733,84783],[-29,-28],[-26,10],[-7,20],[-1,9],[75,22],[-12,-33]],[[2863,82285],[-4,-24],[-4,-8],[-43,12],[-29,-4],[-3,14],[3,12],[45,18],[18,1],[12,-10],[5,-11]],[[2574,82131],[-18,-18],[-5,7],[-3,23],[10,17],[30,38],[21,-7],[6,-10],[0,-14],[-8,-19],[-10,-10],[-12,0],[-11,-7]],[[2093,81953],[-21,-8],[-22,9],[10,30],[11,16],[21,20],[24,-9],[19,-25],[-42,-33]],[[2846,84466],[36,-11],[21,7],[18,-6],[3,-13],[-31,-30],[-13,2],[-37,36],[3,15]],[[1031,81677],[-17,-34],[-13,15],[-5,47],[10,12],[27,-34],[-2,-6]],[[1105,81798],[-6,-17],[-28,18],[-9,15],[-2,15],[8,25],[22,0],[12,-10],[12,-19],[4,-12],[-13,-15]],[[792,81633],[-8,-7],[-15,-6],[-42,6],[-26,-2],[-28,-4],[-22,-10],[-4,14],[1,12],[92,32],[22,16],[13,21],[12,39],[10,12],[6,-1],[13,-15],[-5,-20],[-11,-18],[-4,-17],[-4,-52]],[[99603,81748],[-17,-10],[-10,25],[-1,15],[10,15],[17,-9],[10,-15],[-9,-21]],[[99847,81435],[-49,0],[-97,94],[-50,29],[-28,33],[13,7],[60,-23],[49,-51],[27,-33],[31,-28],[34,-12],[10,-16]],[[98255,82004],[-18,-2],[-11,20],[-60,8],[6,19],[26,8],[39,30],[33,-5],[-9,-28],[-6,-50]],[[12508,84879],[24,-63],[17,-49],[15,-59],[26,-122],[12,-46],[3,-26],[3,-66],[-4,-14],[-7,-13],[-2,-19],[7,-50],[1,-77],[-7,-43],[-8,-7],[-19,14],[-15,24],[-12,24],[-28,77],[-9,36],[0,25],[4,19],[9,12],[17,31],[-3,5],[-12,-7],[-25,-4],[-22,24],[-17,13],[3,45],[-4,12],[-34,-13],[-13,12],[-3,17],[1,25],[6,21],[32,55],[-3,11],[-15,2],[-21,19],[-9,61],[-22,35],[-14,-3],[-29,-99],[-15,-22],[-42,-14],[9,28],[4,25],[-15,74],[-1,29],[10,21],[30,9],[15,13],[13,20],[3,20],[23,53],[10,10],[29,0],[60,-59],[18,-8],[26,-38]],[[12589,85346],[70,-13],[52,3],[47,-86],[29,-70],[17,-49],[10,-47],[13,-45],[-1,-7],[-28,31],[-19,62],[-10,24],[-10,11],[-10,23],[-21,59],[0,17],[-9,16],[-11,6],[-12,-3],[-4,-5],[2,-41],[9,-46],[51,-99],[34,-57],[7,-18],[5,-52],[-15,-23],[18,-48],[-1,-9],[-4,-9],[-48,-21],[-45,-89],[-48,-52],[-23,-8],[-10,9],[-11,20],[-6,26],[-1,33],[12,21],[24,109],[0,35],[-30,50],[-18,40],[-9,57],[-17,149],[-7,48],[-11,39],[-14,32],[-10,35],[-8,38],[3,15],[24,-20],[29,-55],[15,-36]],[[12297,85393],[40,-56],[0,-13],[-8,-38],[-22,-11],[6,-15],[17,-12],[11,10],[42,54],[13,11],[8,1],[51,-16],[44,-26],[13,-20],[8,-36],[-12,-79],[-37,-13],[-17,1],[-18,12],[-30,-28],[25,-20],[75,-5],[23,-44],[6,-34],[-16,-62],[-43,17],[-37,36],[-77,51],[-19,3],[-12,-9],[-4,-31],[1,-68],[-20,-34],[-61,15],[-24,51],[-22,80],[-84,96],[-23,19],[-30,57],[12,45],[4,26],[16,7],[23,20],[14,44],[21,-36],[28,-34],[1,32],[13,26],[28,-1],[13,5],[18,24],[26,12],[16,-14]],[[12898,84296],[53,-12],[48,1],[17,-24],[10,-25],[7,-24],[1,-22],[-1,-15],[-6,-17],[2,-5],[94,-55],[44,-58],[18,-30],[10,-26],[19,-64],[39,-74],[21,-23],[11,-22],[-6,0],[-28,16],[-60,50],[-5,-2],[-5,-27],[-9,-24],[-14,-17],[11,-5],[48,11],[41,-49],[15,-8],[16,-35],[0,-14],[-9,-26],[-6,-10],[2,-7],[11,-4],[45,7],[8,-12],[-7,-101],[6,-37],[0,-17],[-5,-22],[0,-19],[4,-19],[1,-18],[-12,-45],[-12,-8],[-19,0],[-15,13],[-22,39],[-21,60],[-8,9],[-27,9],[-5,7],[-17,1],[-13,25],[2,33],[-11,33],[1,15],[-12,6],[-10,-9],[6,-33],[-6,-25],[-22,11],[-36,80],[-41,65],[-17,15],[5,19],[20,10],[17,-1],[3,11],[-34,63],[1,18],[12,31],[-15,13],[-43,-9],[-15,6],[-13,26],[-7,21],[-37,4],[-14,-2],[-24,33],[-12,21],[5,11],[22,18],[13,-2],[25,-20],[10,0],[25,27],[4,24],[18,20],[-3,21],[-10,35],[-23,10],[-46,-21],[-41,-32],[-16,12],[-3,20],[43,55],[19,30],[-4,17],[-14,23],[-1,58],[9,13]],[[12781,84587],[18,-40],[26,4],[14,-30],[11,-46],[-8,-29],[-11,7],[-13,-17],[-8,-56],[4,-55],[-4,-56],[-15,-57],[-3,-38],[-6,-11],[-7,-4],[-8,10],[-12,8],[-15,-32],[-19,0],[-15,73],[13,121],[31,25],[-18,32],[-39,39],[3,21],[-29,62],[-2,14],[5,52],[27,46],[37,8],[25,-20],[14,-17],[4,-14]],[[7662,85460],[10,-4],[10,34],[8,1],[33,-29],[20,6],[13,-35],[12,-4],[10,5],[7,-3],[-2,-38],[-24,-38],[-12,-9],[-15,9],[-6,4],[-10,17],[-8,21],[-5,1],[-18,-25],[0,-13],[8,-19],[-1,-11],[-20,-6],[-20,3],[-24,-16],[-5,10],[-4,29],[-7,-4],[-12,-35],[-12,-22],[-22,-18],[-5,-9],[-17,-1],[-24,-12],[-15,2],[-90,38],[-21,14],[74,87],[39,34],[22,-2],[22,-11],[12,2],[1,39],[-21,29],[1,12],[46,19],[18,-3],[19,-10],[18,-16],[17,-23]],[[3343,82571],[-85,-61],[-28,-45],[-21,-44],[-16,-24],[-12,-4],[-14,-11],[-28,-31],[-12,-3],[-90,-71],[-6,-1],[4,18],[28,26],[18,24],[20,40],[11,14],[4,20],[1,40],[5,15],[20,30],[14,17],[18,6],[38,-5],[16,15],[4,11],[-9,11],[-2,18],[2,32],[11,28],[19,25],[27,19],[33,13],[24,1],[44,-29],[7,-13],[-11,-29],[-6,-27],[-28,-25]],[[3718,82891],[12,-27],[21,17],[15,24],[12,31],[7,12],[11,-16],[29,-22],[-25,-34],[-47,-51],[-16,-34],[-1,-15],[46,12],[13,-2],[8,-12],[-13,-13],[-25,-13],[-21,-24],[-50,-42],[-19,-35],[-23,-14],[-30,-3],[-54,-23],[-32,-21],[-8,-12],[-11,-5],[-12,1],[-13,-10],[-14,-19],[-12,-9],[-19,-2],[-11,-8],[-11,0],[-31,23],[-8,14],[28,27],[20,9],[30,4],[29,25],[61,34],[19,18],[12,63],[14,11],[8,25],[33,-1],[16,-28],[5,-4],[3,3],[2,22],[17,16],[-10,12],[-31,15],[-23,6],[-15,0],[-13,8],[-9,17],[-5,17],[1,17],[8,19],[14,21],[17,12],[36,9],[32,14],[17,2],[13,-6],[3,-55]],[[1791,81875],[54,-23],[68,2],[25,-5],[0,-7],[-43,-10],[-15,4],[-38,-13],[-26,-3],[-58,13],[-46,-9],[-12,3],[-14,11],[-16,18],[-1,12],[15,4],[40,-15],[4,8],[34,14],[29,-4]],[[1478,81817],[-149,-24],[-22,16],[22,10],[27,5],[56,27],[69,23],[54,29],[47,18],[13,30],[-41,16],[-8,12],[19,14],[16,21],[39,25],[34,-31],[8,-20],[-4,-25],[-7,-25],[-30,-13],[-4,-13],[16,-38],[-62,-33],[-93,-24]],[[946,81720],[2,-20],[32,3],[10,-10],[0,-38],[-5,-11],[-4,-2],[-12,8],[-13,-19],[-59,-48],[-18,27],[-35,-42],[24,108],[28,16],[11,12],[-3,32],[13,52],[28,-2],[13,-22],[0,-14],[-12,-30]],[[589,81595],[-6,-19],[-7,0],[-37,32],[-5,11],[22,15],[6,11],[-3,16],[-16,21],[-30,27],[-11,20],[7,12],[14,7],[45,2],[25,-34],[18,-12],[43,-8],[-22,-14],[-13,-13],[-15,-53],[-15,-21]],[[99923,81742],[-23,-14],[-26,7],[-15,23],[2,27],[34,29],[43,-37],[-15,-35]],[[99281,81729],[-24,-24],[-19,24],[-3,12],[36,42],[28,9],[11,15],[12,53],[20,2],[10,-6],[-5,-25],[-16,-38],[0,-27],[-50,-37]],[[98002,82380],[48,-19],[33,9],[41,-30],[52,-53],[-12,-10],[-13,-5],[-12,0],[-40,-8],[-22,2],[-40,-36],[-45,26],[-15,51],[-35,12],[-28,18],[51,40],[37,3]],[[6783,62794],[-12,-27],[-16,2],[-55,59],[-7,32],[4,148],[-21,120],[-23,91],[17,47],[22,37],[25,69],[-21,88],[6,53],[11,9],[59,-65],[117,-97],[31,-68],[6,-74],[21,-9],[11,-50],[30,-44],[11,-26],[-13,-40],[-56,-78],[-72,-34],[-62,-87],[-13,-56]],[[6329,64063],[59,-15],[14,6],[10,-12],[48,-8],[9,-5],[-10,-30],[-31,-27],[-45,24],[-75,8],[3,23],[7,16],[1,29],[10,-9]],[[6531,63901],[8,-11],[29,16],[22,5],[35,-38],[13,-26],[23,-27],[8,-21],[-6,-24],[-26,-40],[-36,-10],[-20,-17],[-28,4],[-8,7],[-3,51],[-9,55],[-17,-7],[-20,19],[-21,46],[-2,27],[11,44],[20,5],[15,-24],[12,-34]],[[6167,64202],[9,-3],[13,4],[4,-46],[14,-25],[5,-15],[-15,-16],[-30,-7],[-14,13],[-15,29],[-15,-8],[-3,23],[-3,6],[-11,-6],[10,-30],[-27,-2],[-9,4],[-7,34],[-28,64],[0,25],[-10,31],[42,8],[28,53],[16,5],[31,-85],[0,-24],[6,-23],[9,-9]],[[5730,64476],[-25,-32],[-14,14],[-27,5],[-10,25],[-29,22],[-11,30],[17,56],[41,48],[63,-2],[14,-38],[1,-28],[-8,-31],[-4,-45],[-8,-24]],[[5505,64424],[-5,-26],[-10,4],[-2,23],[6,31],[16,27],[18,41],[14,-6],[-8,-27],[-1,-29],[-20,-16],[-8,-22]],[[6431,63808],[-17,-16],[-18,8],[-4,39],[-17,50],[30,10],[17,-14],[9,-16],[11,-27],[-11,-34]],[[29247,77766],[13,0],[65,1],[115,0],[116,0],[115,0],[116,1],[116,0],[115,0],[116,1],[27,111],[26,51],[34,-17],[19,2],[21,26],[17,17],[11,-3],[9,-24],[8,-17],[9,5],[8,23],[0,32],[10,22],[13,4],[12,-1],[6,11],[-1,16],[-4,25],[1,30],[30,53],[36,36],[12,18],[4,37],[21,38],[10,22],[2,19],[-5,24],[1,44],[7,54],[8,58],[19,52],[32,57],[8,75],[8,80],[38,77],[43,87],[24,50],[44,91],[31,64],[16,30],[17,35],[26,-10],[27,-11],[-4,-51],[5,-37],[12,-21],[18,-15],[14,-5],[17,0],[44,29],[52,19],[29,17],[5,17],[13,6],[21,-5],[39,-41],[45,-62],[35,-49],[2,-85],[0,-89],[1,-95],[1,-68],[0,-92],[1,-74],[1,-96],[1,-52],[5,-15],[-3,-20],[-2,-10],[1,-8],[2,-10],[-1,-15],[-4,-12],[-3,-15],[0,-25],[5,-15],[8,-8],[7,0],[8,-9],[12,-16],[17,-13],[18,-5],[12,3],[15,-8],[6,-22],[-3,-20],[-9,-10],[-9,-7],[-2,-16],[5,-16],[7,-14],[7,-25],[-3,-22],[-7,-18],[-3,-19],[6,-16],[15,-22],[9,-21],[14,-11],[7,8],[5,11],[6,8],[10,-5],[12,-6],[13,-7]],[[31354,77862],[-2,-18],[8,-29],[6,-57],[-9,-26],[2,-34],[26,-10],[6,-10],[1,-13],[-57,-88],[-48,13],[-26,-24],[-27,-6],[-12,-40],[-15,-8],[-20,3],[-18,11],[-13,-6],[-19,-70],[-16,6],[-6,-26],[-8,-11],[-12,-9],[-10,31],[-7,30],[-9,6],[-13,8],[-13,0],[-9,-5],[-11,-19],[-16,-16],[-12,13],[-9,23],[-8,-36],[-12,-38],[2,-44],[-5,-26],[-11,7],[-11,23],[-31,18],[-25,-1],[5,24],[24,35],[-8,7],[-11,-5],[-5,5],[8,32],[1,35],[-10,-12],[-14,-37],[-31,-30],[1,-49],[-30,-102],[-1,-43],[-19,-34],[-25,-30],[-33,9],[-25,-26],[-13,-29],[-11,-5],[-5,38],[-5,11],[-9,-55],[-9,-4],[-4,40],[-4,26],[-13,-23],[-9,-59],[-9,5],[-2,22],[-7,7],[-2,-25],[3,-36],[-5,-19],[-8,10],[-9,17],[-15,-13],[-14,-5],[0,17],[3,22],[-27,-12],[-32,-39],[-26,-55],[9,-9],[10,-17],[-44,-84],[-44,-76],[-34,-123],[-14,-15],[-11,-22],[-13,-75],[-14,-66],[8,-30],[5,-30],[13,-30],[11,-3],[11,5],[9,-1],[5,-13],[-2,-15],[-13,-4],[-26,-26],[-22,-11],[-11,-32],[-16,-37],[-32,-58],[13,-18],[50,-20],[22,-21],[34,-109],[-8,-10],[-3,-20],[30,-28],[9,-78],[25,-27],[36,-16],[45,24],[37,32],[-1,27],[-24,61],[-5,29],[-18,19],[-6,-16],[-11,21],[-2,12],[11,5],[12,-2],[14,-11],[36,-67],[10,-89],[3,-56],[-4,-19],[-11,4],[-20,-4],[-96,-29],[-21,-25],[-49,-28],[-3,14],[3,28],[-3,59],[-10,3],[-75,-96],[-30,-6],[-24,-28],[-6,16],[-4,71],[15,61],[-8,-1],[-26,-36],[-11,22],[-5,24],[-8,14],[-9,5],[7,-53],[-17,-40],[-5,-104],[-22,-43],[-68,-27],[-45,6],[-40,-9],[-53,-20],[-29,12],[-30,-21],[-103,-6],[-21,11],[-28,-39],[-44,-24],[-111,-88],[-25,-33],[-29,-50],[-21,-27],[-16,-9],[-10,-22],[-11,-15],[10,50],[12,43],[10,82],[-3,66],[-12,28],[-12,18],[14,-66],[2,-80],[-5,-47],[-27,-91],[-12,-21],[-13,-19],[-10,-8],[-10,-15],[-11,-23],[-10,-45],[6,-42],[53,-15],[15,13],[7,-30],[4,-42],[-4,-45],[-9,-45],[-7,-57],[-5,-86],[-9,-78],[-1,24],[5,94],[-9,-10],[-6,-22],[-16,-121],[-22,-65],[-21,-45],[-21,7],[5,-36],[-6,-18],[-5,-39],[-13,-26],[-12,3],[-17,-18],[-6,-13],[-1,-26],[-11,-23],[-42,-119],[-35,-35],[-9,5],[10,56],[6,57],[-22,24],[-21,13],[-23,-1],[-27,44],[-34,32],[-47,86],[1,24],[-1,41],[14,63],[14,45],[19,23],[56,23],[14,36],[8,30],[-28,-52],[-41,-17],[-22,-19],[-18,-29],[-10,-37],[-24,-44],[2,-29],[4,-21],[-2,-44],[15,-43],[30,-70],[5,-109],[23,-72],[35,-85],[27,-24],[1,-32],[-12,-52],[-17,-24],[22,5],[10,-12],[10,-43],[0,-44],[-4,-25],[-6,-10],[0,25],[-5,9],[-7,-11],[-5,-13],[-2,-49],[-5,-25],[-18,-7],[-19,-66],[-17,-37],[-67,-249],[2,-42],[-12,-14],[-19,-11],[-19,-25],[-12,-27],[-12,-74],[-22,-84],[-14,35],[-4,30],[7,77],[24,128],[26,79],[21,37],[16,76],[-21,12],[-32,-1],[6,35],[9,31],[-16,31],[-10,4],[-10,12],[12,26],[5,27],[-3,34],[5,25],[-9,-4],[-13,-27],[-8,-10],[-5,23],[-6,-5],[-4,-16],[-9,-9],[-18,22],[-26,25],[-15,43],[-8,34],[8,61],[18,10],[24,-9],[31,0],[-4,13],[-11,-2],[-33,49],[-11,30],[-18,8],[-8,-29],[-9,-7],[11,62],[15,3],[22,17],[-6,36],[-14,16],[-25,-20],[0,26],[5,32],[19,0],[16,-10],[14,52],[1,24],[-24,-34],[-5,73],[23,72],[22,31],[27,-1],[28,5],[-17,13],[-18,7],[13,28],[12,5],[11,24],[-27,-3],[3,46],[-13,-9],[-16,-5],[-6,-19],[1,-33],[-4,-21],[-13,-18],[-20,-13],[-2,23],[-7,11],[-3,-50],[-5,-17],[-15,47],[-5,-10],[1,-13],[-4,-23],[-13,-12],[1,-29],[-5,-16],[-42,25],[-1,-8],[24,-56],[17,-18],[2,-30],[-15,-25],[-20,21],[-4,-1],[11,-37],[7,-33],[-7,-27],[1,-33],[-1,-30],[-5,-26],[10,-121],[12,-33],[12,-32],[6,-29],[-12,-5],[-20,25],[-17,18],[-21,59],[-4,24],[-5,19],[3,-43],[7,-48],[65,-107],[12,-42],[9,-32],[-2,-31],[-17,22],[-15,28],[-38,32],[-49,19],[-28,74],[1,-31],[-7,-26],[-16,32],[-11,27],[-4,29],[-20,-2],[-22,-25],[-22,6],[-2,50],[5,27],[24,62],[23,33],[10,41],[-4,64],[-4,-65],[-13,-33],[-20,-24],[-27,-44],[-6,-41],[-8,-77],[11,-25],[11,-7],[34,17],[18,-8],[39,-91],[72,-37],[27,-23],[22,-48],[32,-27],[25,-40],[1,-27],[-9,-30],[-3,-42],[-11,-27],[-26,-3],[-15,7],[-84,147],[-10,14],[-31,77],[-36,41],[-11,-1],[52,-76],[21,-53],[37,-75],[26,-32],[20,-50],[18,-23],[50,-33],[-18,-24],[28,-20],[4,-37],[-3,-42],[-38,16],[-1,-31],[3,-18],[-16,-15],[-24,20],[-61,113],[1,-15],[5,-18],[35,-72],[31,-44],[27,-20],[21,-36],[7,-22],[5,-34],[-15,-22],[-18,-13],[-17,23],[-12,24],[-27,40],[-8,46],[-20,-3],[-84,58],[-68,7],[7,-12],[8,-8],[54,-14],[22,-26],[44,-24],[26,-6],[11,-73],[35,-49],[5,-37],[25,-4],[43,36],[28,-13],[40,-10],[9,-30],[7,-55],[14,-63],[37,-246],[55,-202],[7,-34],[-13,30],[-41,134],[-23,96],[-23,170],[-7,38],[-8,16],[-5,-13],[-2,-21],[4,-17],[-9,-56],[4,-26],[14,-26],[17,-67],[13,-89],[-18,36],[-19,19],[-29,15],[-25,26],[1,-37],[-2,-40],[-20,12],[-14,13],[12,-42],[-26,13],[-17,-3],[-11,-38],[-15,-23],[-23,-7],[-33,34],[-11,42],[-4,47],[-2,-55],[6,-58],[-2,-43],[32,-9],[30,8],[40,-2],[26,8],[16,14],[38,-12],[3,-53],[-4,-52],[-3,-56],[11,0],[12,18],[6,100],[35,37],[12,-3],[11,-32],[4,-32],[4,-45],[-9,-68],[-53,-80],[-38,-74],[-20,-15],[-28,8],[-32,19],[-15,4],[-12,-6],[-8,22],[-4,42],[-13,14],[-9,-2],[-7,-44],[-29,-13],[-41,19],[-42,37],[18,-40],[105,-74],[12,-14],[11,-20],[-15,-32],[-11,-36],[-2,-28],[-4,-18],[-42,-48],[-23,9],[-58,86],[27,-75],[21,-31],[43,-17],[80,28],[26,-31],[-22,-54],[-21,-37],[-28,-5],[-25,-10],[-7,-26],[-18,-2],[-27,-1],[-43,-2],[-23,6],[-33,-54],[-12,-7],[-18,10],[-7,43],[-8,21],[0,-80],[3,-22],[6,-16],[-38,-43],[-37,-54],[-13,-15],[-15,-27],[-30,-78],[-8,-57],[-11,-64],[-1,29],[2,48],[-8,55],[-5,-101],[-12,-47],[-109,3],[-47,-25],[-74,-86],[-22,-38],[-60,-145],[-16,-94],[-12,40],[3,29],[0,24],[-15,-51],[15,-76],[-13,-28],[-40,-54],[-22,-8],[-25,-16],[-8,-52],[-33,-49],[-19,-22],[-36,13],[11,-46],[-13,-36],[-23,-27],[-28,-18],[-16,2],[-13,-9],[-11,-23],[-26,-21],[-28,12],[-30,7],[-18,-12],[29,-21],[16,-31],[-3,-41],[-8,-15],[-18,-22],[-8,3],[-5,20],[-6,40],[-9,-9],[-1,-18],[-8,-7],[-25,64],[1,-49],[9,-37],[9,-19],[8,-12],[3,-17],[-18,-42],[-9,-10],[-16,-7],[-10,-26],[3,-22],[-14,-49],[-34,-30],[-10,1],[-9,-9],[5,-22],[9,-16],[-1,-14],[-9,-20],[-17,-6],[-10,-23],[3,-21],[6,-12],[-1,-21],[-21,-20],[-4,-21],[10,-6],[7,6],[6,-4],[-12,-34],[-11,-21],[-10,-37],[-24,-11],[1,-12],[13,-11],[12,-28],[-22,-53],[-13,4],[-8,12],[-5,-42],[2,-22],[-5,-46],[-8,-55],[-6,-22],[1,-42],[4,-41],[13,-52],[20,-214],[13,-74],[24,-200],[41,-194],[57,-235],[93,-284],[11,-40],[-12,-35],[-4,-35],[-1,-54],[3,-52],[11,-64],[22,-98],[-12,20],[-31,140],[-4,82],[5,117],[-7,-3],[-6,-38],[-3,-44],[-8,-18],[-11,68],[1,31],[11,36],[-3,13],[-18,18],[-4,29],[2,29],[-10,15],[-8,-1],[5,-70],[9,-43],[11,-104],[17,-63],[10,-52],[118,-561],[28,-72],[10,-51],[11,-107],[2,-138],[-19,-252],[-5,-171],[-2,5],[-2,18],[-5,2],[-16,-78],[-23,-71],[-8,-110],[-10,-56],[-33,-58],[-20,1],[-50,-43],[-35,11],[-42,-25],[-27,3],[-16,52],[3,23],[6,24],[11,5],[36,-54],[7,23],[-11,27],[-21,15],[-16,17],[-31,125],[-33,85],[-6,57],[-56,35],[-41,53],[-27,94],[-15,166],[-18,19],[-8,13],[18,62],[19,51],[-15,-13],[-11,-19],[-14,-45],[-10,-7],[-9,7],[-11,87],[3,108],[15,40],[-23,2],[-23,-16],[3,-36],[-3,-20],[-18,6],[-13,12],[-17,38],[-25,71],[-49,197],[-10,27],[-17,29],[8,9],[14,6],[32,88],[25,54],[9,37],[-2,16],[-11,23],[-14,-20],[-7,5],[-16,47],[-16,13],[-11,-10],[12,-38],[10,-14],[-4,-56],[-4,-18],[-10,-16],[-15,9],[-7,-14],[-9,15],[-9,24],[-10,40],[26,225],[24,144],[3,163],[2,24],[-2,44],[-33,94],[-145,231],[-112,273],[-97,103],[-74,-23],[-12,-21],[-6,-26],[5,-31],[-7,-13],[-20,2],[-26,-7],[-70,-72],[-25,3],[-22,-19],[-17,-14],[-43,-8],[-37,-15],[-16,8],[-10,42],[0,43],[8,-33],[13,-26],[6,10],[2,23],[-13,45],[-41,58],[-48,84],[14,-3],[4,18],[-15,24],[7,27],[10,29],[-20,-4],[-18,-21],[-1,-24],[-3,-20],[-10,3],[-18,24],[-89,68],[-77,39],[59,17],[32,-14],[-3,21],[-8,13],[-26,17],[-32,-7],[-21,8],[-21,-16],[-22,-25],[-21,-12],[-80,-18],[-65,-19],[11,20],[11,13],[38,20],[6,41],[-9,39],[-10,-9],[-11,-31],[-13,22],[-14,0],[-4,-49],[-19,-33],[-8,-33],[-54,-26],[-7,9],[16,31],[-1,18],[-19,-15],[-30,-60],[-106,-19],[5,13],[23,3],[32,19],[-7,32],[-12,34],[-11,4],[-8,21],[1,64],[-7,38],[-18,39],[-6,-8],[-12,-66],[-11,-87],[-5,-28],[-32,-2],[-28,6],[-95,-11],[-35,30],[-15,6],[-9,-1],[-41,-27],[-48,-21],[-11,7],[-16,1],[-34,-71],[-40,-33],[-102,60],[-25,47],[-22,10],[-28,6],[-29,-58],[-23,-79],[36,-44],[30,-21],[50,18],[28,38],[23,-1],[11,8],[10,20],[19,-16],[1,-16],[-14,-22],[-17,-19],[-11,-22],[20,-45],[31,-15],[12,7],[7,50],[19,32],[26,-7],[-3,-20],[3,-19],[12,-33],[-1,-47],[2,-11],[-28,-20],[-21,-8],[-17,-27],[9,-15],[-17,-14],[-11,6],[-6,-6],[-2,-16],[-9,-16],[13,-46],[26,-30],[19,-38],[74,-50],[18,1],[18,-50],[14,-18],[14,-8],[-1,-35],[-25,-25],[-7,-31],[-6,-17],[-11,22],[-11,15],[-26,-47],[-13,-10],[6,51],[-10,20],[-15,52],[-21,31],[-16,11],[-12,20],[-14,8],[-13,-2],[-21,12],[-1,27],[-6,20],[-16,25],[-78,45],[-1,-19],[6,-14],[11,-9],[13,-19],[0,-54],[-6,-23],[-2,-33],[-5,-34],[-10,-26],[-21,-18],[-10,15],[-15,72],[-22,23],[-34,2],[-23,-16],[-25,-70],[-21,-11],[-70,36],[-80,55],[2,18],[13,6],[24,-7],[-1,19],[-25,61],[-4,28],[3,34],[-8,-1],[-15,-28],[-51,24],[-14,28],[-30,81],[-42,3],[-19,49],[-35,-20],[-17,-23],[-15,-35],[6,-19],[15,-29],[-7,-14],[-49,-21],[-114,24],[-34,21],[-44,46],[-62,37],[-30,6],[-29,-7],[-86,-4],[-19,-10],[-17,-16],[-11,18],[-5,31],[10,5],[11,19],[10,36],[1,22],[-7,15],[-13,1],[-29,-95],[16,-53],[-1,-19],[-58,-11],[-132,-107],[-51,-58],[2,19],[62,75],[-21,12],[-36,-19],[-13,7],[15,62],[-4,55],[-26,1],[-16,-43],[-11,1],[-14,19],[-11,-6],[8,-98],[16,-41],[13,-52],[-36,-64],[-34,-53],[-3,-51],[-34,-66],[-32,-38],[-74,-88],[-22,-19],[-33,-42],[-47,-30],[-44,-49],[-15,-8],[28,42],[34,41],[-29,-6],[-44,19],[-28,1],[0,-15],[-21,-21],[-21,31],[-9,21],[-5,18],[-9,4],[-9,-8],[32,-127],[14,-5],[15,-13],[-19,-29],[-20,-23],[-32,-15],[-27,47],[-6,-59],[-3,-58],[-9,-14],[-15,-22],[-7,16],[-4,23],[-9,-20],[-14,-15],[-22,-3],[-17,-8],[0,-24],[4,-24],[30,19],[-11,-62],[-27,-62],[-23,-14],[-34,9],[-8,-6],[-8,-13],[40,-96],[-25,-145],[-17,-52],[-11,-7],[-12,-2],[-44,47],[-24,36],[21,-98],[58,-29],[3,-37],[-1,-31],[-11,-38],[-11,-49],[8,-35],[9,-85],[8,-39],[8,-119],[10,-51],[52,-189],[18,-2],[2,-20],[-1,-40]],[[23015,66797],[-38,-11],[-16,-18],[-3,-15],[-2,-8],[-5,1],[-18,11],[-41,53],[-59,34],[-78,13],[-54,27],[-28,41],[-30,24],[-32,8],[-26,22],[-20,37],[-30,23],[-39,10],[-26,28],[-18,68],[0,1],[-16,112],[-20,71],[-39,88],[-4,11],[0,15],[4,51],[-4,36],[-12,30],[-3,32],[7,33],[0,40],[-6,46],[-25,51],[-44,54],[-37,79],[-31,104],[-31,72],[-30,40],[-21,49],[-11,58],[-4,34],[5,9],[-19,64],[-42,120],[-24,87],[-6,55],[-27,66],[-47,76],[-25,49],[-7,35],[-73,100],[-21,62],[-17,20],[-19,-2],[-10,6],[-1,14],[-6,1],[-12,-13],[-39,-3],[-66,8],[-48,17],[-29,27],[-21,-4],[-12,-34],[-25,-21],[-38,-10],[-33,-62],[-28,-116],[-12,-74],[3,-33],[-7,-24],[-18,-15],[-19,-33],[-18,-52],[-22,-25],[-25,1],[-46,40],[-67,79],[-52,48],[-38,19],[-34,36],[-29,54],[-27,36],[-24,18],[-29,60],[-33,102],[-16,78],[0,83],[-43,181],[-23,78],[-17,36],[-33,43],[-49,50],[-67,100],[-83,150],[-58,90],[-35,30],[-30,54],[-25,78],[-25,49],[-2,2],[-3,1],[-61,1],[-61,1],[-61,0],[-61,1],[-61,1],[-61,0],[-61,1],[-61,1],[0,-65],[0,-65],[-1,-65],[0,-64],[-98,-1],[-98,0],[-98,-1],[-98,0],[-99,0],[-98,-1],[-98,0],[-98,0],[-132,85],[-132,85],[-131,85],[-132,86],[-132,85],[-132,85],[-131,85],[-132,86],[13,32],[18,87],[-32,-6],[-79,-13],[-80,-12],[-79,-12],[-80,-13],[-79,-12],[-80,-12],[-79,-13],[-80,-12]],[[17464,70583],[0,4],[-2,63],[-13,22],[-17,-14],[-7,82],[4,39],[-2,38],[-16,92],[-41,113],[-89,140],[-46,47],[-35,59],[-23,16],[-28,5],[-9,-27],[-32,18],[5,66],[-32,92],[-25,10],[-65,-6],[-87,50],[-25,30],[-9,54],[-41,47],[-53,46],[-30,-11],[-39,7],[-55,33],[-33,4],[-63,-9],[-23,7],[-22,41],[-24,21],[5,51],[-3,47],[4,36],[-11,79],[9,73],[-8,26],[-13,21],[-42,30],[-7,37],[7,52],[-11,35],[-35,32],[-32,73],[-40,39],[-17,67],[-25,42],[-8,36],[-56,131],[-59,102],[-9,58],[-2,81],[23,49],[12,43],[-1,39],[-4,29],[-20,51],[-79,30],[-64,124],[-4,96],[-25,98],[0,63],[-4,69],[19,15],[17,-6],[-1,-27],[5,-49],[20,-37],[19,-16],[18,-36],[13,-11],[13,-3],[-7,23],[-8,15],[-9,48],[-18,61],[-20,33],[-11,61],[-9,15],[-5,22],[20,27],[27,19],[36,6],[103,-9],[21,15],[19,-5],[13,2],[-28,16],[-16,-5],[-18,3],[-37,-3],[-15,7],[-16,19],[-11,2],[-34,-33],[-15,4],[-36,36],[-15,5],[-25,-20],[-4,-90],[8,-66],[-15,-7],[-17,27],[-27,17],[-22,25],[-32,46],[-16,17],[-18,-39],[-1,18],[9,45],[-3,75],[28,-60],[-8,42],[-22,47],[-17,16],[-20,83],[-47,50],[-38,80],[-77,134],[-5,117],[-28,148],[12,85],[-1,59],[-14,91],[-15,49],[-62,135],[-60,90],[-9,69],[-4,69],[13,62],[12,64],[8,17],[3,-7],[-2,-13],[8,-5],[3,29],[6,15],[-9,2],[1,9],[5,18],[18,85],[-1,107],[19,131],[-1,44],[-12,93],[-13,56],[-23,40],[10,58],[0,55],[-40,80],[-15,104],[-3,45],[4,116],[-11,50],[-27,82],[12,72],[12,43],[30,190],[7,15],[13,0],[22,32],[-10,8],[-16,-16],[14,75],[15,64],[10,24],[5,209],[9,160],[14,53],[-5,55],[6,74],[-4,74],[31,359],[-4,43],[9,59],[-9,153],[4,171],[-8,22],[-4,24],[8,3],[14,-25],[66,0],[42,24],[16,-8],[17,-31],[23,-7],[28,6],[-9,8],[-13,2],[-29,29],[-17,28],[-51,-1],[-11,18],[-58,-18],[-17,19],[-32,-13],[8,54],[-2,68],[2,66],[8,-48],[19,-52],[10,59],[6,72],[-19,29],[-32,20],[-11,68],[75,58],[-40,12],[-15,26],[-20,4],[-1,-20],[-6,-27],[-7,35],[-2,41],[-8,70],[-31,113],[-18,147],[-23,72],[-45,69],[-12,40],[-11,103],[7,77],[-9,54],[22,-3],[56,-42],[71,-34],[21,-24],[34,-19],[189,-28],[13,3],[24,17],[11,-2],[27,-40],[14,-4],[18,2],[14,7],[23,28],[3,-11],[-1,-25],[8,-36],[17,-47],[7,-29],[-34,-82],[-7,-2],[-1,28],[-4,5],[-64,-139],[-22,-66],[-2,-29],[0,-18],[9,-4],[21,7],[30,27],[1,6],[-28,-10],[-13,0],[1,31],[4,14],[18,47],[19,27],[28,30],[16,24],[11,35],[30,43],[6,11],[-2,35],[2,7],[15,-5],[6,-60],[-4,-27],[-26,-32],[-3,-12],[5,-44],[-5,-4],[-10,5],[-3,-3],[25,-48],[8,-38],[1,-33],[-7,-65],[-7,-10],[-12,3],[-17,21],[-3,-7],[-13,-50],[-5,4],[-8,60],[-4,4],[-25,-27],[-11,-26],[-8,-41],[-11,-20],[31,-4],[28,8],[23,-19],[8,-1],[21,19],[6,14],[17,62],[9,11],[13,1],[12,9],[19,34],[0,14],[-6,77],[2,43],[-4,14],[-8,14],[1,14],[6,23],[1,21],[-6,18],[3,21],[17,45],[3,20],[22,45],[-6,18],[-15,22],[-10,19],[-10,30],[-8,10],[-2,-4],[11,-50],[-3,-3],[-27,27],[-7,16],[-3,23],[2,17],[15,17],[18,6],[-2,15],[-22,46],[-15,21],[-11,10],[-15,3],[-7,7],[-2,11],[3,15],[9,4],[23,-6],[13,11],[-1,18],[-4,10],[1,66],[-9,53],[-5,9],[-5,1],[-6,-7],[-14,-2],[-10,18],[-10,34],[-18,80]],[[15892,80064],[28,0],[119,0],[118,0],[119,0],[118,0],[118,0],[119,0],[118,0],[119,0],[118,0],[119,0],[118,0],[119,0],[118,0],[118,0],[119,0],[118,0],[119,0],[118,0],[119,0],[118,0],[118,0],[119,0],[118,0],[119,0],[118,0],[119,0],[118,0],[119,0],[118,0],[118,0],[119,0],[118,0],[119,0],[118,0],[119,0],[118,0],[119,0],[118,0],[118,0],[119,0],[118,0],[119,0],[118,0],[119,0],[118,0],[118,0],[119,0],[118,0],[119,0],[118,0],[119,0],[118,0],[119,0],[118,0],[118,0],[119,0],[118,0],[119,0],[118,0],[119,0],[118,0],[118,0],[119,0],[118,0],[66,0],[1,121],[1,96],[60,-11],[18,-18],[5,-8],[-1,-27],[5,-80],[10,-67],[26,-80],[0,-1],[2,-31],[8,-20],[15,-18],[58,-22],[99,-26],[57,-30],[13,-33],[27,-14],[40,7],[28,14],[23,32],[34,7],[28,-2],[29,-4],[15,-4],[45,-26],[29,-20],[41,-39],[23,-17],[11,-40],[13,-51],[18,0],[14,30],[35,5],[47,-21],[41,-60],[58,-53],[36,-27],[36,0],[47,27],[49,51],[35,9],[21,-5],[12,-40],[15,-15],[38,4],[80,-8],[63,11],[15,-23],[13,-36],[25,-11],[35,11],[63,-9],[26,-2],[51,14],[24,16],[34,26],[46,36],[79,62],[65,23],[61,-45],[48,-39],[18,-16],[49,-40],[70,-57],[79,-65],[80,-65],[69,-57],[49,-40],[19,-16],[54,-46],[54,-46],[54,-46],[53,-46],[54,-46],[54,-46],[54,-46],[54,-46],[14,-77],[13,-75],[31,-54],[29,-49],[17,2],[17,21],[11,10],[18,2],[40,18],[12,-4],[7,-9],[0,-14],[-1,-11],[-6,-23],[9,-42],[2,-47],[6,-36],[16,-46],[15,-36],[18,-7],[41,21],[26,8],[15,-3],[25,-34],[13,-20],[3,-17],[-34,-102],[54,-51],[60,-55],[73,-66],[44,-41],[58,-58],[10,-82],[8,-70],[11,-96],[11,-99],[11,-99],[11,-104],[13,-115],[11,-102],[12,-111],[17,-145],[-15,-56],[-32,-121],[-28,-110],[-3,-32],[-20,-160],[-16,-66],[-27,-38],[-28,-38],[-34,-62],[-38,-31],[-19,-18],[-10,-28],[-11,-63],[2,-96],[31,-82],[45,-46],[49,-45],[70,0],[63,60],[66,63],[59,57],[71,67],[64,61],[69,22],[96,30],[121,38],[59,43],[76,57],[87,64],[76,56],[38,31],[27,36],[7,26],[-2,15],[-7,15],[-9,11],[-9,9],[-4,12],[-1,26],[-5,14],[-5,11],[2,99],[-7,31],[-24,78],[47,35],[43,32],[35,24],[73,4],[67,-1],[94,0],[78,-1],[92,0],[53,-1],[71,1],[34,90],[31,81],[34,76],[60,91],[17,16],[10,35],[36,34],[40,31],[16,30],[7,17],[109,158],[62,73],[50,41],[39,19],[26,-2],[15,2]],[[29858,75452],[-20,-37],[18,-4],[16,11],[14,22],[34,30],[29,13],[9,3],[13,-21],[28,17],[28,9],[-121,-96],[-25,-11],[-36,-28],[-33,-21],[-24,-7],[-120,-71],[-10,-2],[-10,7],[-99,-36],[-40,-5],[-37,-12],[27,29],[1,11],[-7,9],[-14,-3],[-15,-30],[-24,-10],[-5,33],[8,26],[11,24],[24,38],[34,24],[17,21],[12,-18],[2,25],[10,14],[10,8],[24,0],[12,4],[10,8],[9,2],[27,-12],[25,4],[21,15],[22,5],[56,4],[57,11],[23,21],[47,56],[28,16],[-43,-66],[-23,-30]],[[31059,77380],[-16,-11],[-18,4],[0,-30],[-2,-11],[-19,16],[-8,10],[1,40],[17,38],[14,15],[17,-10],[13,-43],[1,-18]],[[29392,75185],[-13,-2],[13,55],[24,25],[9,-5],[0,-19],[-3,-17],[-16,-26],[-14,-11]],[[30414,75677],[-77,-28],[-12,18],[19,8],[24,43],[16,5],[25,-24],[5,-22]],[[30210,75743],[-13,-15],[-16,2],[8,22],[3,31],[8,34],[4,11],[9,9],[-3,-94]],[[30561,75613],[-21,-9],[-49,21],[40,18],[7,6],[5,27],[1,13],[15,-57],[2,-19]],[[28990,72497],[-4,-12],[-19,64],[19,-21],[4,-17],[0,-14]],[[29015,72142],[-37,-16],[-3,6],[42,32],[14,116],[2,53],[-7,95],[1,19],[6,-30],[7,-88],[-3,-67],[-12,-97],[-10,-23]],[[28949,72113],[-50,-41],[-6,3],[33,29],[23,9]],[[28749,71798],[-7,-6],[25,72],[50,91],[14,14],[-42,-78],[-40,-93]],[[27212,67081],[-10,-15],[-20,11],[-11,20],[-5,38],[17,-41],[7,-9],[22,-4]],[[27199,67138],[-1,-34],[-14,57],[-9,62],[13,-20],[11,-65]],[[27671,66325],[-55,-108],[6,27],[22,58],[7,28],[14,17],[14,31],[1,37],[20,25],[6,4],[-35,-119]],[[24502,68836],[-11,-8],[-46,50],[-3,21],[23,20],[14,-2],[22,-25],[8,-8],[3,-10],[-2,-16],[-8,-22]],[[23051,67915],[-6,-1],[14,47],[2,19],[22,59],[12,9],[5,-25],[-23,-42],[-26,-66]],[[23121,68060],[-10,-3],[12,31],[21,16],[45,60],[18,4],[10,20],[4,3],[-3,-25],[-36,-36],[-61,-70]],[[22957,67568],[-9,-33],[3,50],[22,112],[46,147],[20,25],[-53,-162],[-29,-139]],[[23600,68632],[-14,-6],[61,89],[12,29],[16,-1],[-27,-50],[-48,-61]],[[23008,66911],[-4,-26],[-23,125],[-37,282],[-2,161],[6,56],[10,-228],[41,-289],[9,-81]],[[16581,71442],[-14,-1],[-23,6],[8,13],[12,10],[4,-7],[13,-21]],[[16823,70977],[-13,-1],[-17,5],[-8,31],[13,2],[13,-4],[10,-24],[2,-9]],[[17125,70753],[-16,-6],[-18,12],[-16,56],[-17,43],[9,13],[14,-42],[35,-64],[9,-12]],[[16654,71381],[-19,-8],[-15,8],[-23,55],[50,7],[21,-24],[3,-7],[-17,-31]],[[16699,71474],[57,-30],[30,14],[6,-14],[-4,-12],[-69,-23],[-21,16],[-2,21],[-7,21],[10,7]],[[17125,71074],[14,-42],[-20,5],[-21,-3],[-6,24],[-7,32],[-4,8],[-14,3],[-1,3],[-2,15],[4,8],[45,-36],[12,-17]],[[15894,79880],[3,-13],[-11,-12],[-8,-2],[-12,20],[-6,2],[5,-30],[-2,-10],[-26,18],[-5,15],[8,16],[16,16],[6,2],[32,-22]],[[15830,79781],[7,-19],[-30,12],[-13,11],[-3,11],[-5,34],[2,12],[13,4],[25,-43],[4,-22]],[[15952,79583],[13,-76],[6,31],[38,-54],[0,-27],[-4,-9],[-8,-3],[-8,8],[-6,19],[-9,10],[-18,6],[-9,21],[-4,15],[0,42],[-5,14],[-10,2],[-9,11],[-14,29],[-2,8],[7,24],[15,41],[11,19],[7,-2],[9,-13],[10,-22],[-2,-15],[-41,-31],[-2,-7],[21,-9],[7,-7],[7,-25]],[[30176,75740],[-8,-11],[-3,28],[6,32],[5,0],[3,-17],[-3,-32]],[[29407,74700],[-32,-87],[-1,17],[41,108],[-8,-38]],[[29074,73668],[-13,-10],[43,116],[24,96],[11,34],[-10,-68],[-19,-62],[-36,-106]],[[28737,71805],[-6,-1],[-11,6],[-15,12],[-4,9],[15,-3],[21,-23]],[[27407,66042],[-9,-12],[-4,4],[0,17],[-11,39],[0,10],[27,-38],[1,-10],[-4,-10]],[[27547,66130],[-5,0],[2,9],[11,16],[4,-6],[0,-9],[-12,-10]],[[27600,66188],[-7,-3],[11,25],[3,-2],[-7,-20]],[[27487,66080],[-12,-13],[-13,10],[14,13],[43,15],[-16,-18],[-16,-7]],[[27383,69683],[-12,-140],[-5,50],[-1,48],[9,28],[9,14]],[[27342,66013],[-18,-6],[15,23],[5,34],[8,-26],[0,-17],[-10,-8]],[[27726,67556],[4,-42],[-25,98],[-32,154],[-17,120],[12,-33],[11,-66],[47,-231]],[[27282,65981],[-7,-1],[-1,9],[12,11],[9,-1],[-1,-12],[-12,-6]],[[25308,68958],[-15,-30],[1,12],[11,30],[8,11],[-5,-23]],[[25400,69248],[-3,-6],[-25,12],[-15,11],[-2,11],[41,-20],[4,-8]],[[25535,69269],[-24,-12],[-36,1],[-8,4],[15,8],[43,11],[10,-12]],[[25215,69172],[1,-27],[-13,14],[-20,1],[8,9],[7,9],[3,10],[25,33],[-7,-25],[-4,-24]],[[25325,69013],[-7,-18],[7,87],[-11,74],[12,-32],[4,-39],[-5,-72]],[[26414,68918],[-28,-21],[-30,15],[19,3],[13,-6],[35,30],[18,22],[21,9],[-48,-52]],[[15874,79034],[-3,-11],[-4,1],[-8,23],[-1,16],[7,12],[10,-34],[-1,-7]],[[16001,79144],[-1,-13],[-10,-10],[-6,2],[0,16],[-3,2],[-12,-18],[1,36],[6,39],[5,1],[7,-26],[13,-29]],[[15973,79259],[-2,-11],[-15,13],[-5,12],[1,27],[3,18],[3,4],[9,-8],[3,-4],[3,-51]],[[15883,79741],[-4,-6],[-15,8],[-9,13],[-3,16],[6,30],[7,8],[5,-2],[2,-27],[13,-28],[-2,-12]],[[30938,77301],[-11,-11],[-11,3],[0,29],[3,9],[4,5],[6,-8],[9,-27]],[[42704,18182],[1,-33],[-43,30],[-10,14],[14,19],[27,0],[7,-11],[4,-19]],[[39693,20699],[27,-28],[22,19],[22,-2],[12,-10],[12,-3],[16,-1],[27,-47],[-11,-41],[29,8],[26,-35],[12,3],[5,14],[17,16],[11,-22],[14,-41],[18,-12],[15,-44],[12,-55],[11,-8],[19,-1],[20,8],[-8,-48],[3,-42],[32,-30],[-19,-17],[-20,-24],[-41,-19],[-11,8],[-35,42],[-17,50],[-37,71],[-8,21],[-9,13],[-34,9],[-30,17],[-24,36],[-8,22],[-10,15],[-33,-1],[-21,17],[-21,23],[-94,67],[-37,-7],[-17,19],[0,33],[20,20],[-82,8],[-29,12],[20,7],[114,1],[43,6],[3,-15],[38,-29],[36,-3]],[[70136,47593],[-6,-23],[-12,-10],[-5,58],[-17,41],[7,0],[15,-21],[6,-56],[5,17],[-1,17],[3,16],[-2,18],[-9,28],[3,5],[13,-23],[2,-19],[-2,-48]],[[48418,42627],[-25,-3],[2,27],[19,29],[13,-4],[0,-33],[-9,-16]],[[46009,47249],[-9,-1],[-3,5],[-2,14],[5,22],[4,13],[7,-2],[8,-15],[8,-13],[-4,-12],[-14,-11]],[[14364,37789],[-3,-9],[-6,8],[-6,16],[-2,18],[6,10],[7,-6],[4,-18],[0,-19]],[[32499,62339],[-44,-29],[2,17],[35,40],[13,-3],[-6,-25]],[[33652,22309],[43,-33],[53,11],[22,-9],[13,-28],[-7,-26],[-17,4],[-15,-7],[3,-35],[10,-14],[56,-38],[10,-2],[-1,15],[-10,26],[-4,28],[9,24],[14,7],[64,11],[15,-11],[32,-66],[-30,-9],[-12,-28],[26,-12],[20,-19],[-11,-28],[-2,-14],[-46,-19],[-40,-13],[-19,-33],[-33,-24],[-96,-41],[11,-34],[1,-16],[-4,-44],[-133,52],[-18,-5],[36,-90],[-26,-16],[-26,10],[-24,-7],[-15,-65],[-38,42],[-32,58],[-1,33],[32,62],[-10,26],[73,83],[13,25],[23,14],[23,5],[10,11],[-1,20],[-10,35],[1,57],[58,77],[-8,49],[18,1]],[[33253,22199],[41,-11],[37,40],[25,13],[21,-9],[15,-24],[21,4],[61,25],[8,-9],[21,29],[19,-13],[14,-25],[-7,-30],[-17,-19],[-10,-26],[-13,-21],[-21,-19],[-16,-31],[-40,-73],[-57,-94],[-19,-8],[-40,-6],[-17,7],[-14,-2],[-12,-51],[-18,-38],[-9,-8],[-19,-4],[-8,-5],[-7,-14],[-50,3],[-35,24],[-41,52],[55,64],[48,-3],[39,43],[32,21],[13,22],[14,17],[0,22],[-11,10],[-14,-1],[-14,-10],[-34,-12],[-23,25],[15,10],[17,-1],[52,24],[10,10],[-16,33],[-31,21],[-26,34],[-4,13],[1,20],[-14,41],[15,2],[19,-26],[44,-36]],[[33050,22012],[20,-8],[20,3],[-11,-59],[-9,-28],[-24,2],[-23,39],[-8,20],[26,15],[9,16]],[[33767,21882],[1,-50],[-22,16],[-8,24],[12,17],[11,-1],[6,-6]],[[33302,22237],[-38,0],[-8,19],[1,47],[28,4],[29,-20],[-2,-20],[-10,-30]],[[33421,21755],[-18,-11],[-5,5],[-5,22],[-1,28],[-2,12],[12,-4],[20,-22],[-1,-30]],[[27397,62988],[9,-11],[11,7],[4,12],[42,-9],[7,-24],[-33,-1],[-14,-15],[-8,-3],[-28,4],[-4,55],[8,6],[6,-21]],[[27783,63195],[-2,-3],[-9,2],[-21,-23],[-8,1],[2,9],[4,7],[5,6],[5,2],[14,5],[7,1],[4,-6],[-1,-1]],[[27827,63197],[-13,-8],[-10,3],[22,24],[6,8],[5,4],[5,0],[7,-5],[0,-3],[-22,-23]],[[32019,70445],[-25,-20],[-7,2],[-5,7],[26,19],[21,46],[7,-3],[-17,-51]],[[32112,62479],[-7,-4],[-5,1],[-1,8],[5,23],[28,2],[-20,-30]],[[32057,62443],[-22,-2],[-6,7],[12,18],[23,2],[6,-4],[-13,-21]],[[32142,62638],[4,-19],[-3,0],[-15,13],[-13,1],[-5,4],[-2,7],[24,1],[10,-7]],[[30094,64380],[-1,-8],[-16,23],[-30,0],[-5,30],[12,5],[38,-11],[9,-26],[-7,-13]],[[30033,64424],[-5,-7],[-16,20],[-2,16],[-6,1],[-10,14],[3,19],[22,1],[9,-52],[5,-12]],[[29907,64430],[32,-32],[19,5],[2,-7],[-11,-7],[-2,-6],[-31,-9],[-9,2],[-2,22],[2,32]],[[32736,61486],[-1,-34],[-19,10],[-1,30],[9,31],[5,3],[7,-40]],[[49439,80202],[2,-29],[-12,-7],[-10,10],[-21,0],[-20,-6],[5,52],[38,-7],[18,-13]],[[49302,80353],[-10,-38],[-26,13],[-2,10],[29,22],[6,0],[3,-7]],[[48774,83055],[-56,-73],[-23,13],[-19,-6],[-6,2],[11,26],[13,61],[24,24],[29,64],[23,17],[9,-2],[5,-6],[11,-71],[-16,-26],[-5,-23]],[[49258,81579],[-20,-24],[-66,-24],[-28,-25],[-50,-56],[-9,-5],[-75,14],[-56,72],[-35,30],[-15,4],[-15,-9],[-33,-9],[-33,1],[17,34],[23,19],[-51,13],[-15,10],[-16,23],[-40,4],[-19,-6],[-33,-31],[-51,-33],[-62,46],[-12,20],[0,39],[-9,31],[-17,10],[22,40],[26,27],[58,27],[89,62],[49,27],[46,46],[19,28],[14,39],[13,47],[20,39],[-19,9],[-9,29],[3,29],[8,26],[-7,33],[-14,34],[1,26],[3,29],[-35,-2],[-36,-9],[-32,-20],[-31,-27],[-27,-5],[0,22],[12,27],[31,38],[34,32],[12,25],[9,28],[17,23],[44,43],[83,48],[13,3],[33,-6],[32,7],[28,18],[29,4],[63,-51],[-19,78],[28,18],[41,-70],[15,-7],[32,10],[-13,12],[-14,1],[-19,10],[-15,23],[-27,71],[2,42],[17,44],[20,41],[-16,8],[-14,15],[-3,41],[5,35],[35,32],[10,48],[5,53],[-6,24],[-35,-4],[-17,-10],[-15,-16],[-16,1],[-43,59],[-25,44],[-44,93],[-6,56],[35,120],[55,77],[64,27],[-12,5],[-98,1],[-33,-10],[-30,-31],[-17,-10],[-17,-3],[-17,-16],[-15,-22],[-17,-14],[-33,4],[-16,-5],[-11,13],[-9,21],[-13,5],[-14,-6],[-29,-28],[-30,-17],[-36,18],[-48,33],[-9,-12],[-11,-31],[-6,-47],[-33,41],[-29,56],[-10,34],[0,39],[15,16],[17,-14],[25,93],[50,121],[18,35],[12,46],[-2,31],[-11,25],[-46,58],[0,48],[5,53],[13,32],[5,6],[62,-1],[-24,17],[-48,48],[1,17],[11,45],[-5,-5],[-10,-20],[-20,-50],[-12,-12],[-34,-12],[-6,-24],[-6,-7],[-17,-2],[-5,-23],[-4,-2],[-5,25],[0,41],[7,38],[13,29],[49,67],[-24,-21],[-55,-62],[-28,-40],[-7,-14],[-3,-12],[0,-13],[13,-72],[-4,-33],[-47,-219],[-9,-22],[-8,-11],[-8,-3],[-23,4],[-11,17],[0,18],[5,28],[19,104],[9,29],[13,27],[27,47],[0,3],[-19,-9],[-8,3],[-5,9],[3,139],[15,46],[6,67],[13,57],[15,42],[12,53],[17,24],[5,36],[19,39],[15,41],[-8,-4],[-96,-106],[-25,-20],[-33,5],[-26,12],[-20,26],[-9,48],[-24,1],[-21,9],[0,6],[27,27],[44,9],[41,42],[-37,29],[3,9],[32,24],[40,82],[9,75],[-20,35],[-7,23],[-38,26],[-7,33],[5,18],[12,18],[19,14],[30,14],[-27,14],[-10,17],[-8,24],[0,15],[14,63],[8,26],[16,33],[72,-2],[8,15],[8,1],[37,-14],[-6,15],[-60,79],[-5,15],[17,42],[1,19],[-2,21],[5,15],[19,8],[58,-1],[14,7],[-6,21],[-14,27],[-2,22],[3,20],[1,41],[2,17],[14,27],[11,8],[15,5],[32,-9],[12,-11],[14,-26],[10,3],[40,27],[12,4],[16,-32],[68,26],[91,11],[55,17],[58,6],[54,19],[57,-9],[2,-11],[-3,-15],[-14,-42],[2,-47],[-3,-15],[-7,-17],[-21,-33],[-55,-47],[-101,-108],[-60,-54],[-8,-26],[-4,-36],[35,-7],[14,-12],[-8,-18],[-53,-63],[-16,-58],[41,2],[33,11],[67,36],[62,27],[30,1],[59,-21],[13,-1],[25,10],[25,1],[170,-6],[47,12],[32,-15],[26,-37],[25,-68],[-1,-11],[-15,-31],[-28,-39],[-24,-54],[-7,-29],[-4,-32],[-8,-29],[-47,-138],[-47,-76],[-20,-55],[-26,-43],[-24,-27],[-26,-18],[-76,-20],[-21,-13],[-25,-24],[-27,-12],[31,2],[31,13],[56,5],[65,-46],[-6,-37],[-26,-30],[-59,-5],[-55,-65],[-25,-20],[-26,-10],[-33,3],[-60,17],[-26,18],[24,-29],[26,-16],[156,-37],[9,4],[49,39],[66,0],[126,-71],[36,-55],[52,-78],[28,-31],[21,-28],[12,-41],[25,-138],[27,-134],[37,-146],[16,-40],[22,-28],[110,-66],[24,-21],[43,-63],[41,-67],[38,-51],[41,-41],[-20,-22],[-14,-34],[11,-46],[16,-44],[33,-71],[30,-77],[-11,12],[-11,6],[-16,-1],[-15,3],[-28,24],[-27,30],[-53,-12],[-29,5],[-26,0],[49,-17],[53,-2],[117,-129],[40,-76],[23,-101],[-16,-46],[-25,-29],[-23,-34],[-22,-38],[65,-56],[14,2],[15,8],[13,19],[24,46],[12,16],[40,6],[34,-3],[34,-10],[30,3],[60,-20],[30,-18],[77,-80],[16,-44],[8,-57],[1,-63],[-13,-58],[-15,-52],[-9,-67],[-6,-25],[-9,-18],[-41,-54],[-27,-21],[-11,9],[-12,-1],[-1,-13],[12,-27],[1,-33],[-24,-24],[-25,-10],[-40,13],[-57,-45],[41,-23],[8,-25],[-10,-43],[-25,-20],[-29,-8],[-29,-2],[-24,-11],[-23,-20],[29,11],[20,-10],[13,-36],[11,-11],[57,-15],[34,0],[68,9],[32,-1],[12,-6],[0,-30],[-5,-75],[-9,-15],[-89,-62],[-19,-44],[-5,-26],[-52,4],[-24,-27],[-43,-19],[-32,-20],[-32,-25],[-27,-7],[-113,30],[-69,-3],[-93,-26],[-24,5],[-35,24],[-37,17],[-42,7],[-37,23],[23,-44],[-51,-42],[-23,-8],[-24,1],[-50,-12],[-46,6],[7,-30],[12,-26],[-9,-11],[-11,-3],[-87,20],[-13,-4],[-10,-18],[-32,9],[-31,31],[-33,21],[-34,10],[-28,-4],[-112,-48],[-23,-49],[-11,-69],[-16,-61],[-27,-47],[-31,-7],[-30,33],[-56,36],[-20,25],[-6,1],[-6,-9],[-22,-11],[-23,0],[-35,-10],[-62,-29],[-25,-20],[-53,-55],[-11,-15],[-19,-55],[-30,-10],[-27,35],[-31,13],[-32,-13],[-20,-18],[-9,15],[-1,31],[24,38],[64,28],[55,74],[28,45],[10,25],[14,16],[17,6],[9,28],[77,112],[7,25],[4,46],[6,44],[63,29],[30,93],[8,7],[88,17],[65,-1],[65,-18],[33,-2],[33,7],[26,25],[45,90],[25,40],[29,36],[27,41],[44,76],[-30,-26],[-36,-42]],[[48834,82558],[11,-11],[30,2],[-10,-24],[-32,-27],[-22,-26],[-26,-22],[-13,25],[-15,-1],[-22,49],[-4,72],[29,19],[41,-1],[33,-55]],[[49291,85962],[-31,-1],[16,34],[19,9],[36,-4],[-6,-15],[-34,-23]],[[49710,86701],[-7,-7],[-27,59],[20,67],[24,-2],[4,-18],[-2,-16],[-13,-2],[-1,-5],[4,-31],[0,-36],[-2,-9]],[[49636,86714],[6,-40],[14,10],[22,-39],[11,0],[18,16],[-4,-36],[-18,-101],[-6,-17],[-3,-31],[-4,-6],[-6,-61],[-12,-21],[-11,-48],[-4,-5],[-16,19],[16,74],[6,43],[-4,22],[-9,20],[-24,1],[-20,-9],[-4,12],[-1,16],[-5,5],[-27,-1],[-7,4],[-6,15],[-1,12],[25,9],[22,-4],[34,24],[-21,78],[-28,7],[-6,8],[5,13],[15,7],[24,40],[14,6],[17,-1],[-2,-41]],[[49784,86873],[0,-7],[-14,-49],[0,-18],[-23,2],[-4,5],[-4,28],[3,30],[3,8],[7,3],[7,-6],[12,15],[6,0],[7,-11]],[[49120,85710],[-16,-7],[-15,0],[-25,33],[-9,25],[2,16],[10,5],[24,-8],[12,-28],[1,-18],[3,-7],[15,-7],[-2,-4]],[[49186,85680],[-3,-2],[-10,11],[-17,38],[27,7],[12,-5],[-5,-16],[-4,-33]],[[49150,85846],[-3,-14],[21,0],[30,-12],[19,-2],[15,-15],[-8,-28],[-10,-8],[-10,-1],[-36,28],[-48,-12],[-10,4],[-6,7],[-2,10],[0,20],[-3,6],[-17,-19],[-8,2],[-4,9],[-2,19],[2,26],[10,38],[17,8],[26,-5],[29,-21],[9,-13],[0,-11],[-11,-16]],[[49241,85936],[-24,-14],[-10,12],[-2,37],[-29,16],[-14,10],[-10,18],[2,6],[19,8],[32,-34],[13,-28],[23,-8],[3,-4],[-3,-19]],[[48164,84438],[-16,-4],[-1,9],[28,39],[17,6],[6,-4],[-12,-22],[-22,-24]],[[48581,83783],[-35,0],[-12,5],[-15,14],[-17,79],[6,28],[7,13],[7,11],[19,5],[18,-15],[7,-14],[15,-54],[3,-46],[-3,-26]],[[48395,84299],[-111,-32],[-38,3],[-4,16],[8,10],[31,10],[13,77],[-47,36],[-3,10],[4,17],[5,7],[29,18],[12,4],[10,-2],[21,-21],[23,-43],[30,-7],[21,-19],[-4,-84]],[[48297,84061],[10,-74],[10,-46],[0,-16],[-9,-22],[-45,-29],[-15,0],[0,7],[10,30],[-9,33],[4,26],[-4,4],[-9,-3],[-33,-41],[-11,-4],[-1,8],[8,34],[1,22],[5,14],[9,13],[11,10],[8,1],[9,-10],[27,28],[24,15]],[[48341,83994],[-6,-6],[-14,1],[-5,10],[-3,14],[0,26],[8,19],[36,28],[-16,10],[-1,7],[10,24],[39,36],[10,7],[10,-1],[-20,-65],[-48,-110]],[[48278,85462],[-36,-100],[-13,-3],[-13,-25],[-37,-28],[33,0],[9,-10],[0,-19],[-6,-12],[-43,-46],[-29,-18],[-31,-48],[-16,0],[-16,-31],[-13,-13],[-7,0],[-9,6],[-19,30],[35,30],[4,16],[24,18],[-2,5],[-39,24],[-15,17],[2,8],[18,19],[-9,2],[-6,10],[-10,4],[-4,10],[-1,24],[2,26],[12,11],[4,12],[5,3],[17,-6],[18,-20],[20,8],[24,-4],[1,5],[-18,49],[3,10],[10,12],[55,35],[68,60],[17,9],[5,-8],[7,-31],[-1,-41]],[[48255,84656],[-8,-7],[-10,1],[-11,10],[-13,27],[30,19],[13,-11],[4,-13],[0,-14],[-5,-12]],[[48293,84968],[-1,-26],[-5,-30],[7,-32],[1,-22],[12,-8],[7,-10],[52,-12],[49,4],[9,-10],[1,-15],[-8,-16],[-27,-30],[-33,-48],[-10,-10],[-11,-1],[-7,5],[-6,86],[-35,-11],[-29,1],[-16,10],[-11,20],[-22,52],[-65,21],[-18,28],[-6,18],[3,9],[13,21],[17,-7],[11,4],[6,10],[0,8],[-9,18],[0,6],[66,23],[5,37],[15,3],[16,-12],[23,-38],[6,-46]],[[47998,85070],[31,-32],[-25,-54],[-38,0],[-54,39],[0,8],[4,12],[8,10],[9,2],[13,-7],[19,11],[15,-4],[18,15]],[[47986,84743],[-12,-3],[-15,3],[-10,9],[-9,35],[-2,22],[4,40],[-1,47],[32,2],[8,-7],[5,-142],[0,-6]],[[47939,84657],[-24,-8],[-9,4],[-2,8],[6,20],[19,7],[13,-11],[2,-10],[-5,-10]],[[48272,83000],[-23,3],[-17,-10],[-11,-9],[-10,1],[-30,-3],[-29,0],[-4,15],[5,46],[-6,12],[-27,6],[-10,11],[-16,31],[-3,15],[-2,20],[-16,26],[-20,19],[-12,1],[-23,-31],[-19,-31],[7,-15],[6,-20],[-11,-15],[-31,-34],[-5,-13],[-9,-7],[-15,10],[-37,-2],[-17,5],[-20,25],[-49,17],[-9,39],[-9,7],[-56,68],[-7,23],[7,13],[21,21],[70,34],[11,13],[2,12],[-21,14],[-18,15],[-6,10],[-1,9],[11,11],[21,1],[16,-5],[13,10],[24,10],[15,13],[14,33],[14,30],[1,16],[13,57],[6,14],[44,37]],[[47994,83578],[11,-21],[22,-5],[20,19],[23,59],[16,3],[18,-4],[35,7],[62,27],[28,1],[39,-14],[29,0],[26,-42],[14,-66],[32,-66],[43,-57],[1,-34],[-15,-19],[-32,-23],[1,-25],[20,13],[18,5],[44,-5],[15,-26],[10,-37],[6,-31],[-4,-34],[-11,11],[-12,30],[-13,14],[-16,7],[7,-41],[-3,-56],[7,-5],[21,-1],[-14,-56],[-28,-16],[-33,-6],[-8,-20],[-6,-26],[-17,-38],[-22,-22],[-28,4],[-28,18]],[[49704,81042],[-24,-20],[-7,-23],[-6,-9],[-15,-6],[-15,-1],[-58,47],[-14,-2],[13,22],[37,17],[20,23],[47,-22],[22,-26]],[[65638,66618],[18,-46],[2,-318],[5,-22]],[[65663,66232],[-10,-4],[-11,-24],[-13,-37],[-17,-19],[-14,-22],[-14,-27],[-11,-6],[-16,34],[-10,35],[2,8],[8,2],[3,18],[-5,27],[-10,9],[-13,1],[-13,-11],[-13,-24],[-8,-24],[-1,-50],[4,-57],[-1,-27],[-7,-34],[-2,-50],[5,-39],[4,-23],[1,-19],[-13,-62],[11,-11],[36,-5],[11,-41],[7,-29],[-2,-17],[-26,-13],[-31,-14],[-23,4],[-42,-18],[-22,-29],[7,-19],[7,-13],[4,-39],[-7,-54],[-11,-53],[-15,-66],[-17,-75],[-23,-114],[-19,-90],[-2,-64],[0,-42],[-2,-84]],[[65329,64921],[-19,-46],[-4,-2],[-22,6],[-7,2],[-21,5],[-33,8],[-42,11],[-51,13],[-56,14],[-59,15],[-62,16],[-62,16],[-60,15],[-56,14],[-50,13],[-43,10],[-32,9],[-21,5],[-8,2],[-23,6],[-13,31],[-15,38],[-15,37],[-15,38],[-16,38],[-15,38],[-15,37],[-16,38],[-15,38],[-15,38],[-15,37],[-16,38],[-15,38],[-15,37],[-16,38],[-15,38],[-15,38],[-10,25],[-6,28],[-1,75],[0,16]],[[64324,65832],[10,30],[5,-21],[12,-29],[19,7],[9,-5],[7,-103],[14,-37],[18,-15],[59,-8],[36,14],[73,67],[38,25],[105,-5],[84,-28],[131,-16],[26,4],[70,54],[44,48],[26,14],[17,46],[11,60],[10,39],[13,19],[12,33],[9,55],[25,54],[97,133],[57,113],[5,36],[32,55],[24,59],[117,171],[23,70],[14,79],[1,6]],[[65577,66856],[10,3],[14,-12],[2,-59],[-5,-56],[-1,-59],[-2,-32],[11,-26],[18,-11],[8,1],[6,13]],[[65633,66379],[2,25],[-3,13],[-12,2],[-5,-22],[-2,-31],[9,-2],[11,15]],[[64814,65816],[-21,-3],[-18,22],[39,29],[11,13],[11,27],[9,-23],[-10,-36],[-7,-16],[-14,-13]],[[64615,65834],[-5,-4],[-4,31],[0,9],[13,15],[7,-26],[-11,-25]],[[64979,65770],[0,-20],[-28,6],[-7,-10],[-24,5],[-22,14],[15,24],[40,28],[17,-26],[9,-21]],[[65129,65923],[-3,-12],[-8,1],[-19,11],[-7,16],[13,19],[5,1],[8,-20],[11,-16]],[[60614,78969],[-10,-6],[-97,9],[-18,-3],[-61,-10],[-56,-91],[-34,1],[-48,-24],[-32,-29],[-38,-64],[-29,28],[-36,0],[-36,-18],[-42,-42],[-24,-8],[-47,12],[-55,-24],[-118,-140],[-40,-102],[-15,-20],[-20,-25],[-21,-13],[-11,1],[56,73],[17,27],[3,20],[1,33],[-17,40],[-47,-100],[-26,-14],[-33,-30],[-2,-67],[4,-50],[14,-63],[26,-83]],[[59722,78187],[-15,-3],[-41,36],[-2,58],[-29,49],[-46,0],[-20,-6],[-27,55],[-36,23],[-27,-7],[-28,10],[-61,58],[-41,7],[-1,-42],[-17,-29]],[[59331,78396],[-26,-10],[-20,-13],[-46,40],[-17,29],[-72,-30],[-40,4],[-89,-28],[-41,27],[-82,76],[-30,15],[-27,-3],[-14,24],[18,13],[20,1],[21,9],[6,13],[-1,25],[-43,19],[-39,5],[-25,22],[-19,26],[44,0],[45,-19],[71,-7],[64,-20],[16,25],[37,42],[7,14],[-62,-29],[-63,18],[-23,26],[-20,39],[-8,43],[5,41],[-6,73],[-21,65],[-8,36],[-22,32],[22,-73],[8,-48],[13,-44],[-3,-118],[-8,-41],[-26,-11],[-34,6],[-35,13],[9,65],[-18,-22],[-27,-64],[-23,-9],[-50,7],[-95,-42],[-7,-45],[-14,-62],[-14,-36],[-4,-21],[-40,-93],[-5,-9],[-76,-128],[-10,-10],[-49,-30],[-30,-26],[-22,-12],[-38,13],[-15,-19],[-8,-23],[0,-47],[19,-34],[16,-114],[-6,-48]],[[58251,77914],[-15,31],[-23,33],[-46,28],[-50,-10],[-54,-47],[-37,-18],[-20,12],[-12,0],[-4,-14],[1,-11],[6,-9],[-1,-6],[-7,-4],[-86,34],[-38,31],[-29,60]],[[57836,78024],[15,19],[12,8],[45,5],[8,6],[1,14],[3,18],[-1,26],[-5,28],[19,40],[30,34],[17,33],[2,49],[31,24],[27,41],[7,45],[10,28],[-18,64],[-3,43],[-1,36],[8,19],[26,23],[27,17],[11,-2],[4,-11],[1,-72],[5,-2],[9,9],[14,43],[9,-12],[15,-5],[11,11],[7,-1],[9,-11],[18,-16],[17,-5],[14,10],[11,19],[13,-7],[24,-50],[11,6],[55,10],[9,14],[6,12],[-57,67],[3,49],[2,57],[-7,34],[-11,27],[-44,31],[-34,32],[-7,15],[-1,18],[-2,30],[-13,25],[-1,21],[8,33],[3,35],[-3,14],[-8,12],[-15,1],[-21,20],[-13,28],[-37,39],[-12,7],[-7,19],[-3,24],[8,29],[10,45],[7,42],[0,25],[-5,62],[-19,47],[-9,6],[-16,-13],[-17,-11],[-14,10],[-16,26],[-26,71],[-48,15],[-19,3],[-19,-34],[-6,10],[-5,22],[-10,9],[-13,-10],[-4,9],[6,30],[-16,15],[-37,-1],[-19,11],[-3,23],[-11,14],[-21,7],[-20,19],[-20,29],[-29,19],[-39,9],[-3,3],[-4,5],[-25,-20],[-15,-16],[-19,10],[-30,-36],[-61,-2],[-30,3],[-15,8],[-57,-53],[-6,-20]],[[57394,79642],[-13,-7],[-36,-10],[-38,-15],[-8,-52],[-12,-29],[-20,-41],[-71,-14],[-61,-21],[-62,-12],[-82,-51],[-27,-44],[-26,-13],[-24,-3],[-15,25],[-52,66],[-20,32],[-26,9],[-29,-5],[-28,-16],[-29,-3],[-32,23],[-4,-3],[-12,-3],[-82,27],[-7,5],[-4,1],[-11,2],[-61,-3],[-57,54],[-18,2],[-13,-22],[-10,-25],[-40,-24],[-10,-10]],[[56354,79462],[-6,7],[-2,22],[3,18],[-6,18],[-15,20],[-4,8],[-19,-1],[-5,-2],[-2,0],[-26,18],[-17,41],[-27,22],[-20,7],[-9,17],[-6,24],[-7,18],[-1,1],[-4,27],[-6,3],[-1,1],[-27,-5]],[[56147,79726],[3,94],[43,67],[10,35],[16,74],[12,34],[14,29],[11,27],[4,24]],[[56260,80110],[12,3],[33,-22],[30,-11],[9,11],[3,14],[-1,10],[-24,32],[-15,20],[-1,12],[5,28],[3,31],[-3,34],[-17,75],[-3,32],[16,39],[51,92],[17,34],[23,42],[64,100],[40,59],[27,32],[40,56],[17,29],[73,19],[8,27],[14,29],[10,13],[1,50],[-13,61],[-11,21],[-8,15],[5,14],[8,4],[10,2],[12,14],[-2,16],[-31,39],[-13,30],[-21,77],[-42,80],[-13,26],[-2,25],[6,24],[-6,31],[-15,40]],[[56556,81519],[3,4],[-2,49],[11,11],[17,7],[23,-3],[20,-7],[25,-23],[7,4],[41,42],[43,64],[12,36],[11,17],[37,9],[32,4],[20,-1],[51,6],[30,7],[25,11],[56,5],[87,-8],[57,0],[39,-6],[95,-34],[35,-6],[17,-18],[31,-7],[57,-18],[50,-9],[34,4],[19,-5],[35,-80],[8,-9],[14,-2],[29,7],[41,-3],[25,-17],[-4,-47],[7,-7],[11,2],[14,27],[11,28],[8,9],[42,-19],[19,3],[18,21],[11,4],[30,-15],[37,-11],[30,-1],[19,-11],[13,-50],[12,-10],[11,-3],[18,44],[15,18],[22,12],[14,6],[10,15],[13,16],[11,1],[10,-6],[10,-21],[16,-48],[19,-49],[13,-17],[34,15],[24,15],[42,3],[56,10],[43,14],[27,-2],[17,-16],[25,-29],[6,-43],[33,-30],[26,-5],[9,31],[15,21],[-5,30],[-3,37],[-11,35],[-8,37],[14,53],[15,47],[8,25],[25,47],[25,33],[37,54],[28,18],[24,-8],[14,-8],[36,32],[63,2],[53,-4]],[[58823,81855],[5,-1],[26,-17],[27,-14],[19,-1],[22,4],[27,18],[18,18],[22,91],[8,13],[12,7],[20,1],[39,-17],[44,-15],[26,2],[69,49],[39,7],[46,-11],[44,-1],[34,7],[24,-17],[28,-37],[26,-55],[27,-101],[79,-115],[2,-22],[-7,-15],[-39,-14],[-33,-7],[-1,-20],[9,-21],[15,-32],[2,-40],[-1,-37],[7,-32],[12,-14],[2,-16],[-15,-20],[-4,-12],[6,-7],[71,-4],[35,-20],[27,-17],[13,-2],[30,11],[34,8],[20,1],[8,-13],[7,-35],[12,-34],[11,-10],[19,1],[12,-1],[7,-13],[-8,-20],[2,-21],[9,-27],[10,-60],[10,-18],[6,-23],[0,-27],[-8,-23],[-6,-18],[6,-41],[21,-46],[16,-11],[13,-41],[23,-13],[34,34],[26,18],[33,-10],[30,-6],[20,-24],[15,-32],[17,-18],[18,9],[36,-9],[17,-26],[16,-15],[22,21],[17,27],[64,27],[40,7],[11,5],[23,20],[24,13],[23,-4],[21,-40],[23,-28],[6,-45],[28,-61],[68,-83],[27,-26],[18,5],[10,7],[4,8],[4,41],[9,15],[14,1],[53,-51],[28,-6],[27,-1],[36,-39],[39,-35],[30,-3],[25,13],[16,8],[11,-13],[9,-29],[16,-23],[18,-7],[26,-1],[46,-45],[43,-45],[26,-3],[23,14],[20,3],[14,-11],[4,-20],[-10,-26],[0,-38],[19,-36],[0,-36],[-5,-32],[-11,-29],[-26,-41],[-24,-38],[-36,-16],[-21,-16],[6,-28],[13,-26],[31,-21],[34,-15],[5,-17],[-6,-9],[-22,-7],[-31,8],[-10,-15],[-15,-25],[-9,-44],[-7,-41],[33,-11],[20,-17],[6,-34],[7,-37],[2,-34],[-11,-16],[-1,-17],[5,-9],[15,-3],[11,-8],[1,-18],[-21,-40],[-20,-76],[-11,-41],[1,-44],[-12,-25],[-21,-2],[-75,-4],[-64,2],[-28,6],[-44,4],[-22,-11],[-28,-70],[-22,-28],[-36,-25],[-40,-7],[-22,-30],[-8,-45],[-1,-41],[-3,-20],[-9,-18],[-3,-13],[2,-14],[9,-5],[11,-6],[0,-10],[-4,-13],[-13,-14],[-5,-22],[1,-23],[2,-25]],[[58892,78458],[38,-29],[-39,8],[-86,27],[-38,25],[-10,28],[-5,38],[21,-40],[15,-18],[104,-39]],[[59417,51265],[-30,0],[-50,0],[-49,0],[-49,0],[-50,0],[-49,0],[-50,0],[-49,0],[-49,0],[-50,0],[-49,0],[-50,0],[-49,0],[-49,0],[-50,0],[-49,0],[-49,0],[-30,0],[-5,2],[-4,3],[-19,-8],[-19,-25],[-21,-11],[-22,5],[-3,-3]],[[58474,51228],[-11,1],[-16,1],[-14,-6],[-11,-23],[-12,-37],[-20,-44],[-16,-38],[-13,-28],[-31,-45],[-17,-13],[-8,2],[-5,8],[-10,58],[-6,9],[-60,-29],[-9,-1]],[[58215,51043],[1,18],[-4,136],[-1,83],[8,52],[4,60],[1,52],[11,90],[-4,54],[14,189],[4,31],[5,91],[9,28],[8,11],[10,56],[20,90],[14,46],[-3,101],[2,68],[3,16],[29,25],[38,63],[15,75],[23,47],[43,31],[1,0],[129,256],[60,138],[26,70],[1,26],[5,33],[-11,26],[-12,24],[-4,21],[-11,11],[-16,0],[-10,15],[-11,31],[-12,20],[-37,-2],[-28,32],[0,43],[12,85],[21,98],[1,26],[-3,23],[-5,20],[-10,20],[-9,23],[7,70],[14,69],[11,34],[11,38],[-4,32],[-15,15]],[[58566,53853],[8,31],[17,52],[33,52],[29,35],[19,0],[38,-27],[34,-33],[19,-2],[22,14],[47,58],[11,-18],[14,-36],[15,-58],[30,-27],[14,-18],[10,-6],[6,5],[11,46],[13,25],[26,32],[55,25],[39,7],[17,6],[28,15],[44,47],[44,-61],[47,-12],[46,1],[14,18],[8,14],[48,100],[65,136]],[[59437,54274],[44,-191],[14,-11],[-2,-17],[-3,-16],[28,-46],[35,-24],[12,-23],[2,-26],[-12,-112],[2,-31],[11,-112],[21,-25],[19,-113],[37,-47],[5,-14],[9,-55],[11,-59],[9,-14],[5,-4],[11,-63],[-6,-36],[9,-108],[14,-96],[3,-116],[1,-51],[-1,-31],[-3,-44],[-7,-25],[-12,-25],[-13,-39],[-11,-41],[-7,-21],[5,-62],[-1,-16],[-3,-8],[-17,-10],[-22,-17],[-13,-16],[-18,-32],[-15,-34],[-20,-101],[-33,-78],[-5,-26],[-31,-47],[-14,-57],[-9,-71],[-12,-51],[-26,-69],[-6,-110],[1,-220],[-7,-249],[1,-99]],[[64752,74195],[-3,-27],[-15,81],[-7,89],[9,26],[11,-2],[-10,-32],[15,-135]],[[68478,73357],[-14,-2],[-34,13],[-67,27],[-58,54],[-38,35],[-6,-5],[-16,-24],[-12,-30],[-9,-57],[-15,-67],[-70,-3],[-59,-5],[-39,-26],[-37,-35],[-10,-42],[-8,-54],[-22,-124],[-20,-113],[-10,-73],[-15,-50],[-42,-66],[-49,-44],[-25,-21],[-12,-26],[-2,-25],[-9,-7],[-20,4],[-21,-4],[-46,-26],[-50,-31],[-60,-32],[-34,0],[-14,-7],[-6,-16],[6,-29],[6,-23],[5,-28],[-14,-24],[-9,-40],[-8,-70],[-21,-21],[-34,-35],[-38,-45],[-9,-9],[-22,-13],[-21,4],[-20,7],[-21,-12],[-22,-35],[-10,11],[-5,35],[-11,23],[-35,52],[-29,36],[-13,3],[-27,-10],[-33,-7],[-28,8],[-21,15],[-34,50],[-12,28],[-9,20],[-23,-5]],[[67017,72361],[-7,23],[-1,26],[7,33],[-2,61],[-13,43],[-15,20],[2,13],[7,30],[8,27],[0,53],[-11,57],[-4,82],[3,81],[-14,40],[-114,0],[-102,-3],[-6,9],[-39,102],[-33,77],[-31,45],[-73,56],[-35,23],[-29,43],[-25,46],[-6,64],[-5,21],[-7,17],[-8,8],[-9,-2],[-84,74],[-34,20],[-32,-16],[-14,-3],[-28,21],[-32,-28],[-13,-2],[-19,7],[-16,10],[-42,68],[-36,27],[-26,18],[-49,25],[-53,14],[-27,11],[-19,15],[-5,9],[0,25],[-1,32],[-7,24],[-13,28],[-19,22],[-31,-4],[-48,2],[-37,21],[-29,4],[-35,-4],[-29,0],[-20,-16],[-12,-18],[-8,-55],[-7,-9],[-12,-4],[-16,3],[-33,0],[-58,10],[-73,2],[-55,-28],[-43,-40],[-42,-45],[-49,-72],[-14,-32],[-29,-127],[-12,-18],[-17,-15],[-17,-2],[-33,-19],[-44,-31],[-30,-13],[-77,7]],[[64976,73354],[-5,40],[-14,148],[-7,148],[1,69],[8,138],[-1,69],[-3,63],[3,61],[6,69],[4,71],[-5,49],[-15,39],[-25,49],[-4,29],[-2,33],[-24,3],[-22,34],[-17,18],[-39,20],[-19,1],[-18,-14],[-13,-30],[-9,47],[0,49],[31,102],[19,-30],[24,-12],[30,-2],[29,8],[-6,35],[-13,20],[-17,15],[-6,46],[2,48],[8,45],[-9,18],[-14,11],[-32,-1],[-42,12],[-42,5],[-10,-53],[23,-70],[-19,34],[-19,46],[-26,81],[-16,96],[-3,103],[14,85],[18,80],[11,102],[15,101],[15,-45],[17,-40],[24,-38],[13,-9],[39,-15],[25,6],[27,22],[26,-7],[22,-42],[20,-46],[29,-10],[61,33],[29,8],[25,-15],[13,-3],[13,2],[-11,42],[-5,40],[15,21],[48,-23],[31,16],[8,8],[7,10],[3,35],[-1,36],[-4,33],[-9,29],[-22,42],[-86,98],[-28,39],[-24,50],[-16,72],[-12,74],[-11,55],[-30,129],[-12,15],[-14,7],[-36,4],[-36,-10],[-58,-22],[-34,7],[-15,-13],[-39,-55],[-18,-46],[-25,-106],[19,-34],[0,-22],[-15,-157],[9,-76],[-3,-6],[-7,18],[-22,78],[-38,94],[-32,145]],[[64581,75910],[56,94],[49,67],[39,40],[12,10],[54,34],[70,30],[51,22],[67,19],[22,4],[32,-1],[26,-18],[16,-14],[56,-57],[57,-59],[49,-65],[13,-26],[8,-32],[6,-31],[41,-99],[17,-45],[24,-59],[20,-29],[19,-35],[13,-29],[14,-14],[17,-6],[37,10],[44,18],[27,8],[12,-1]],[[57213,74963],[-64,-18],[-19,17],[20,35],[37,22],[12,2],[16,-34],[-2,-24]],[[61530,75758],[18,-11],[35,-15],[22,-18],[12,-5],[28,37],[43,-1],[37,-5],[19,-6],[23,-12],[29,-9],[11,18],[17,51],[6,7],[5,5],[21,4],[20,-4],[9,-9],[9,-41],[24,-15],[42,-66],[25,-26],[6,-11],[-8,-13],[3,-17],[15,-21],[20,-8],[23,3],[12,-8],[8,-12],[2,-17],[0,-11]],[[62066,75522],[4,-25],[18,-34],[20,-21],[11,-23],[18,-77],[8,-43],[-3,-42],[-13,-42],[-27,-53],[7,-22],[6,-29],[-2,-22],[19,-67],[9,-42],[-7,-10],[-5,-13],[35,-32],[41,-28],[18,-5],[48,13],[31,2],[31,-25],[44,-63],[48,-81],[10,-25]],[[62435,74713],[4,-11],[10,-19]],[[62449,74683],[-10,0],[-16,18],[-38,50],[-20,-22],[-17,-37],[-18,-141],[-15,-15],[-27,1],[-32,4],[-22,-7],[-6,-9],[3,-15],[7,-23],[4,-29],[2,-24],[11,-22],[16,-21],[1,-21],[-3,-30],[-3,-22],[-4,-13],[7,-35],[17,-41],[11,-15],[-4,-78],[6,-35],[5,-48],[-2,-79],[3,-19],[5,-7],[16,-3],[15,-7],[6,-13],[-1,-10],[-19,-36],[-2,-26],[-6,-37],[-6,-21],[-17,-41],[-11,-41],[-5,-34],[4,-16],[31,-5],[17,-24],[45,-49],[8,-20],[-12,-30],[0,-12],[6,-16],[3,-28],[-1,-31],[0,-41],[8,-7],[31,-38],[22,-39],[1,-12],[-11,-30],[3,-35],[-1,-8]],[[62434,73238],[-9,13],[-17,5],[-18,1],[-11,-10],[-20,-27],[-26,-30],[-21,-28],[-12,-19],[-10,3],[-8,17],[-4,23],[1,87],[-4,27],[-10,19],[-12,11],[-13,6],[-15,1],[-20,-26],[-29,-26],[-44,2],[-30,5],[-15,5],[-58,40],[-12,1],[-22,17],[-25,13],[-44,-25],[-19,6],[-26,21],[-9,-6],[-29,-64],[-50,-70],[-27,-11]],[[61766,73219],[-13,69],[-12,27],[-6,4],[-13,8],[-9,-5],[-30,-47],[-48,-29],[-40,-17],[-64,-22],[-48,-10],[-21,-1],[-45,9],[-40,14],[-40,-1],[-30,-6],[-71,-51],[-121,-105],[-92,-51],[-51,-21],[-40,-11],[-69,-1],[-56,8],[-39,-1],[-22,13],[-30,42],[-38,43],[-16,9],[-22,9],[-32,4],[-79,-61],[-25,-17],[-27,-13],[-54,-37],[-25,-21],[-30,2],[-39,6],[-33,-2],[-23,29],[-12,32],[-46,20],[-33,5],[-8,-14],[-9,-44],[-14,-112],[-2,-29],[29,-111],[-2,-17],[-20,-6],[-24,-2],[-16,-10],[-12,-18],[-8,-97],[-27,-18],[-14,-20],[-13,-60],[-7,-1],[-45,45],[-20,4]],[[59970,72532],[17,47],[-19,93],[-21,86],[20,56],[41,67],[44,79],[0,48],[-3,37],[-12,25],[-24,34],[-40,-36],[-29,-40],[-18,-8],[-21,-23],[-10,-41],[-24,-32],[-40,-13],[-60,35],[-65,52],[-37,42],[-30,10],[-28,-18],[-84,-104],[-77,-152],[-19,-26],[-72,-65],[-48,-22],[-22,5],[-95,-29],[-48,-4],[-37,-34],[-72,37],[-44,48],[-26,48],[-42,105],[-31,49],[-67,45],[-119,108],[-31,12],[-80,16],[-85,10],[-18,-40],[-6,-156],[-15,-43],[-6,-81],[-10,-24],[-17,-15],[-25,26],[-18,11],[-41,-33],[-82,-47],[-28,-7],[-94,59],[-35,38],[-22,42],[-8,71],[-14,40],[-2,28],[-5,31],[-19,13],[-21,-24],[-22,1],[-27,15],[-65,59],[-50,5],[-30,-73],[-24,-23],[-25,-7],[-2,21],[20,47],[-78,-9],[-41,-35],[-32,5],[-24,16],[3,20],[25,7],[21,16],[84,13],[20,13],[21,51],[40,44],[5,19],[-31,0],[-129,-13],[-89,7],[-10,-21],[-14,-4],[-3,60],[14,27],[19,-3],[46,24],[-4,49],[-33,34],[-7,19],[-24,5],[-20,23],[-4,59],[-15,65],[-23,31],[3,17],[41,22],[8,90],[-6,56],[-20,4],[-60,44],[-18,-4],[-20,48],[-35,34],[-17,-12],[-11,-16],[-16,7],[-26,30],[-27,17],[-12,20],[15,53],[20,-1],[4,42],[-16,70],[2,36],[17,9],[20,-6],[21,-42],[6,-41],[-4,-39],[13,-38],[9,-10],[6,41],[9,7],[12,-17],[25,-9],[66,24],[12,21],[-48,-2],[-17,19],[-20,44],[-11,40],[-3,19],[-6,29],[7,15],[33,23],[29,64],[-12,18],[-14,9],[-15,-6],[-14,22],[-2,30],[12,25],[1,34],[-38,83],[-10,18],[8,28],[29,45],[27,57],[-4,19],[-20,7],[-95,-24],[-37,-21],[-66,-10],[-5,31],[2,28],[15,50],[-2,125],[9,67],[37,20],[45,100],[73,117],[76,-3],[30,33],[45,2],[9,-24],[5,-22],[40,-33],[70,5],[17,13],[16,18],[-32,57],[10,17],[29,2],[32,-14],[2,-13],[-9,-18],[-10,-32],[10,-6],[90,19],[95,-15],[30,8],[75,0],[13,19],[-22,25],[-22,9],[-15,12],[-15,18],[47,55],[27,11],[126,34],[94,17],[1,13],[-14,0],[-121,28],[-29,22],[-40,52],[-9,15],[-10,25],[6,55],[7,43],[15,25],[48,4],[166,-44],[119,27],[129,-65],[123,13],[26,29],[31,93],[174,156],[61,80],[66,45],[112,49],[94,65],[27,7],[225,-31],[155,-4],[71,62],[42,-21],[-4,-22],[-8,-19],[3,-38],[24,-55],[24,-38],[73,-55],[100,46],[16,-5],[21,-13],[35,-147],[28,-52],[35,-36],[29,-7],[21,37],[17,15],[36,6],[60,-50],[21,-53],[101,-40],[93,-20],[40,-45],[131,-44],[49,7],[82,46],[159,51],[106,-71],[29,-9],[25,6],[35,-20],[38,11],[117,84],[37,48],[39,12],[34,29],[92,93],[27,54]],[[57781,76018],[-7,-65],[17,-73],[41,-100],[41,-51],[167,-126],[31,-11],[-7,-51],[-10,-46],[-11,-30],[-49,-20],[-135,56],[-34,6],[-24,-12],[-45,-40],[-49,13],[-69,-23],[-19,-77],[-48,-88],[-79,-71],[-56,-38],[-84,-136],[-39,-80],[-16,-15],[-19,-13],[6,39],[10,35],[-2,26],[0,38],[28,44],[26,31],[76,58],[20,47],[-60,-1],[-60,-11],[-38,7],[-33,-4],[-11,42],[-8,25]],[[57232,75303],[9,7],[11,6],[19,44],[18,33],[25,41],[6,24],[0,23],[-6,16],[-1,19],[-1,27],[2,55],[57,60],[18,6],[6,28],[-4,63],[-8,51],[-10,4],[-14,15],[-9,17],[-14,19],[-25,12]],[[57311,75873],[-1,16],[3,16],[9,17],[42,14],[5,12],[5,29],[9,29],[10,10],[17,-1],[34,7],[23,9],[24,21],[12,18],[50,11],[14,9],[14,-8],[19,-31],[31,-45],[17,-15],[13,6],[22,17],[22,0],[17,-3],[9,14],[13,3],[37,-10]],[[53195,70957],[0,-16],[-10,-109],[-2,-39],[-2,-67],[0,-80],[22,-68],[1,-30],[-9,-34],[-41,-39],[-52,-51],[-46,-49],[-49,-53],[-15,-34],[-25,-26],[-21,-27],[-3,-25],[-15,-48],[-19,-38],[-47,-18],[-8,-12],[-22,-57],[-10,-23],[-13,-47],[16,-123],[20,-126],[4,-52],[-1,-44],[-11,-47],[-25,-68],[-18,-49],[-35,-89],[-11,-22],[-24,-26],[-47,-35],[-33,-30]],[[52644,69256],[-17,136],[-15,116],[-12,95],[-21,169],[-17,143],[-18,143],[-16,129],[-16,130],[-7,19],[-49,62],[-45,57],[-46,64],[-51,70],[-8,88],[-26,133],[-27,74],[-10,19],[-55,48],[-32,35],[-9,20],[-6,55],[-23,107],[-26,97],[-9,66],[-1,83],[5,60],[11,26],[54,74],[25,90],[31,34],[26,25],[22,30],[19,47],[15,51],[2,54],[7,87],[9,61],[23,68],[-9,55],[-12,60],[3,103],[-3,42],[-10,37],[-10,48],[0,39],[10,104],[7,80],[12,103],[-5,29],[-8,21],[-26,23],[-1,14],[7,15],[38,50],[21,74],[17,16],[27,26],[-1,29],[-6,31]],[[52382,73120],[68,35],[66,91],[23,22],[152,84],[19,-6],[22,-12],[-6,-31],[-9,-25],[13,-44],[18,27],[-4,18],[-1,23],[31,2],[28,-3],[30,-26],[-2,-100],[40,-97],[-11,-48],[33,-29],[29,35],[15,51],[54,29],[52,74],[28,8],[6,-61],[14,-54],[-19,-18],[-25,-57],[-47,-144],[-43,-42],[-33,-56],[-10,-39],[-3,-46],[8,-82],[23,-84],[28,-51],[26,-15],[61,-80],[-1,-47],[9,-57],[3,-68],[21,-55],[-45,-119],[-25,-86],[-49,-118],[-43,-77],[-93,-115],[-23,-38],[-15,-39],[-7,-41],[3,-49],[30,-119],[41,-70],[41,-38],[72,16],[-2,-46],[5,-55],[29,3],[20,8],[16,54],[36,-37],[18,-111],[30,-35],[3,-13],[-10,-9],[-9,-13],[9,-9],[29,-14],[17,9],[29,-24]],[[53132,71862],[-43,-41],[9,36],[28,43],[7,-10],[-1,-28]],[[53043,71268],[-7,-3],[-13,-16],[-8,-1],[-20,17],[-7,0],[-10,12],[3,68],[3,19],[49,2],[27,-40],[4,-10],[1,-12],[-12,-22],[-10,-14]],[[33123,58282],[-15,-6],[2,23],[26,40],[41,26],[10,1],[-6,-35],[-58,-49]],[[33052,57680],[-45,-32],[-118,-8],[-48,12],[-37,-9],[67,70],[8,30],[29,6],[9,9],[9,155],[-4,38],[-5,20],[-12,15],[-26,20],[-5,11],[17,17],[35,9],[26,19],[55,4],[26,16],[45,5],[-22,-71],[-10,-27],[4,-65],[-5,-43],[6,-55],[13,-37],[-9,-35],[-1,-54],[-2,-20]],[[1344,39648],[4,0],[4,17],[15,7],[-1,-19],[-21,-59],[-12,23],[-37,38],[-8,29],[13,23],[-2,-18],[6,-8],[21,-4],[19,-15],[-12,-6],[11,-8]],[[1680,41106],[-11,-34],[-5,0],[-12,20],[-5,13],[19,40],[10,3],[12,-13],[0,-12],[-8,-17]],[[1413,39573],[-2,-87],[-13,40],[-2,18],[14,27],[3,2]],[[50250,58175],[-8,-62],[-14,-76],[-10,-25],[-6,-186],[4,-16],[4,-4],[46,-64],[60,-82],[43,-59],[4,-19],[0,-123],[1,-105],[9,-60],[1,-59],[11,-44],[40,-85],[9,-50],[1,-161],[1,-122],[5,-166],[0,-139],[0,-175],[0,-205],[0,-215],[-26,-2],[14,-67],[2,-60],[4,-20],[-7,-29],[6,-45],[11,-16],[29,-90],[9,-75],[-46,-26],[3,-19]],[[50450,55424],[-86,-41],[-35,-33]],[[50329,55350],[0,32],[-13,6],[-15,11],[-10,17],[-13,38],[-5,29],[-20,5],[-25,33],[-24,39],[-8,38],[2,17],[-3,18],[-9,7],[-21,86],[-13,35],[-7,28],[3,22],[-3,29],[4,23],[11,14],[4,17],[1,37],[7,74],[4,74],[-12,20],[-15,6],[-8,21],[-3,34],[0,30],[30,104],[-6,241],[4,37],[13,25],[12,29],[-1,29],[-19,72],[-37,55],[-19,45],[-10,40],[-2,21],[22,32],[10,21],[2,25],[-10,46],[2,81],[9,61],[8,79],[0,24],[-22,47],[-12,6],[-9,-3],[-23,-31],[-8,-4],[-5,10],[-3,12],[8,18],[-3,24],[7,20],[14,9],[5,10],[-20,10],[-2,13],[1,14],[6,2],[6,-1],[3,10],[3,67],[3,23],[2,47],[3,179],[5,19],[0,13],[-13,9],[-32,48],[-19,37],[-17,38],[-14,25],[-27,38],[-7,25],[-2,24],[9,49],[13,52],[6,75],[-4,20],[-18,35]],[[49980,58246],[64,-27],[90,-45],[2,-8],[0,-13],[16,0],[26,16],[72,6]],[[84901,47154],[-19,-99],[-20,21],[22,55],[10,17],[7,6]],[[84740,46363],[-9,75],[-10,33],[-8,18],[-3,23],[0,23],[5,11],[34,3],[14,38],[0,47],[-7,15],[-7,7],[-35,-35],[-10,7],[-6,12],[2,51]],[[84700,46691],[29,48],[25,88],[17,34],[40,33],[16,9],[118,48],[28,3],[74,-1],[100,10],[24,7],[32,21],[31,26],[16,21],[18,14],[25,-18],[44,-14],[11,-13],[11,-17],[-50,-92],[-56,-76],[-34,-23],[-35,-15],[-27,-29],[-23,-46],[-29,-26],[-32,-9],[-28,-14],[-26,-27],[-35,-46],[-14,-5],[-15,1],[-29,-17],[-91,-67],[-55,-73],[-40,-63]],[[84454,46462],[45,49],[68,38]],[[84567,46549],[-2,-28],[-7,-44],[-10,-20],[-16,-37],[-10,-8],[-41,8],[-5,-5],[-7,3],[-11,24],[-4,20]],[[78501,58569],[-5,-60],[-15,24],[3,31],[7,13],[10,-8]],[[78451,58749],[1,-14],[-14,10],[-5,-5],[-17,4],[-8,80],[2,19],[11,-6],[17,-40],[8,-27],[5,-21]],[[77335,56395],[-3,-43],[-11,1],[-12,-27],[-5,-4],[-10,86],[11,121],[6,18],[8,-32],[23,-15],[-10,-69],[3,-36]],[[77811,63546],[-2,-34],[7,-7],[9,15],[13,39],[13,22],[14,5],[16,-27],[16,-57],[17,-33],[7,-3],[6,-26],[1,-26],[-8,-53],[-13,-62],[-20,-76],[7,-64],[26,-53],[31,-31],[33,9],[17,15],[14,25],[14,12],[16,3],[53,-18],[16,-18],[2,-35],[-6,-92],[8,-67],[15,-70],[1,-65],[-18,-106],[-15,-101],[-17,-48],[-12,-32],[-4,-21],[1,-20],[12,-30],[12,-39],[3,-38],[-1,-46],[-9,-62],[-31,-137],[-26,-122],[14,-25],[24,-18],[17,-18],[17,12],[37,72],[32,54],[39,54],[2,5],[35,40],[15,36],[9,47],[12,18],[16,-11],[20,20],[24,51],[19,24],[13,-4],[23,-32],[33,-59],[30,-36],[26,-11],[13,-22],[-1,-33],[6,-21],[12,-9],[5,4],[-1,16],[12,23],[25,31],[25,18],[26,5],[17,25],[11,63],[16,48],[14,22],[17,11],[5,15],[-9,20],[1,19],[10,21],[22,8],[34,-3],[39,-20],[45,-38],[30,-13],[14,14],[28,-59],[41,-131],[35,-100],[29,-67],[31,-52],[32,-36],[24,-49],[21,-93],[-16,-128],[-4,-111],[2,-137],[19,-104],[36,-73],[21,-59],[6,-44],[28,-39],[51,-32],[21,-29],[-9,-26],[0,-30],[7,-35],[17,-28],[28,-23],[17,-24],[5,-25],[-1,-40],[-6,-57],[-12,-43],[-17,-30],[-2,-24],[-4,-36],[0,-74],[12,-50],[4,-63],[-7,-51],[-6,-105],[-1,-41],[-6,-34],[-15,-34],[-22,-32],[-27,-28],[-17,-12]],[[79217,60107],[-4,-6],[-12,-32],[-15,-31],[-11,0],[-8,16],[-6,20],[-4,44],[-25,22],[-28,14],[-56,-22],[-46,-12],[-51,15],[-48,-19],[-20,-3],[-23,3],[-22,0],[-22,7],[-39,27],[-15,-2],[-32,-23],[-33,-15],[-31,-11],[-47,-46],[-34,-67],[-10,-47],[-17,-48],[-23,-75],[-30,-72],[-21,-33],[6,-19],[-6,-24],[-32,-10],[-26,-4],[-5,-12],[3,-145],[9,-55],[17,-66],[11,-36],[8,-108],[2,-91],[36,-58],[21,-44],[14,-38],[-5,-25],[-8,-74],[8,-95],[51,-206],[4,-15]],[[78592,58586],[-6,-2],[-8,40],[-26,67],[-8,71],[-30,79],[-16,31],[-6,-26],[-9,-28],[-30,40],[-25,43],[-23,81],[-3,-19],[-6,-17],[-26,64],[-28,51],[-25,19],[-15,17],[-15,27],[-31,28],[-78,-40],[-98,31],[-38,-30],[-16,19],[-9,35],[9,59],[2,125],[12,88],[-6,67],[6,31],[4,43],[-15,17],[-70,34],[-15,27],[-18,-31],[-84,-17],[-31,-26],[-29,-49],[-8,-64],[17,-41],[11,-73],[-30,-158],[-5,-46],[12,-194],[-5,-106],[-16,-71],[-26,-63],[-11,-109],[-20,-50],[-28,-114],[-18,-143],[-13,-66],[-8,-122],[-56,-184],[-13,-104],[-20,-40],[7,-31],[1,-52],[-7,-139],[-2,-115],[8,-62],[27,-122],[-6,-36],[-3,-50],[22,-23],[17,-7],[91,58],[31,-15],[12,-54],[8,-47],[15,-254],[8,-48],[19,-45],[20,-47],[7,8],[1,18],[1,20],[19,-48],[14,-90],[48,-476],[14,-61],[11,-63],[-29,31],[-8,105],[-8,45],[-11,6],[-16,0],[-1,18],[12,35],[-2,41],[-17,34],[-27,-27],[1,-74],[12,-57],[46,-127],[15,-53],[18,-15],[27,8],[32,-54],[25,-50],[63,-77],[38,8],[41,19],[27,-5],[27,-20],[32,-64],[52,-161],[84,-134]],[[78361,55438],[-9,-33],[-4,-50],[-33,-68],[-5,-39],[-13,-50],[-23,-26],[-19,-5],[-12,4],[-8,10],[-13,47],[-7,14],[-6,4],[-42,-33],[-41,-35],[-7,-33],[-11,-37],[-12,-15],[-10,-3],[-9,22],[-15,28],[-12,27],[3,43],[23,64],[3,44],[-3,77],[-6,44],[-7,1],[-11,7],[-32,-7],[-16,50],[-7,54],[-10,20],[-11,12],[-24,-19],[-18,11],[-61,48],[-23,76],[-13,2],[-11,-8],[-4,-18],[-7,-88],[-5,-27]],[[77810,55553],[-69,178],[-48,73],[6,132],[-14,26],[-18,2],[-14,37],[12,79],[-19,-15],[-26,3],[-21,21],[-16,109],[-11,33],[-22,58],[-29,0],[-10,27],[2,70],[-21,43],[-28,36],[-23,20],[-24,114],[-19,28],[-16,22],[-22,-15],[-7,-41],[-15,-39],[-16,5],[-16,22],[-18,114],[-4,69],[5,129],[23,116],[13,185],[20,117],[13,39],[20,159],[39,204]],[[77417,57713],[4,43],[8,49],[6,46],[2,73],[-5,38],[0,22],[8,27],[28,46],[38,76],[46,107],[47,163],[23,95],[10,34],[10,10],[16,33],[11,36],[1,18],[-26,178],[-16,58],[-9,68],[-4,50],[-6,45],[3,43],[-9,26],[-21,34],[-22,50],[-13,82],[0,46],[-13,40],[-5,42],[8,40],[11,34],[-1,152],[-4,46],[-6,81],[-14,61],[-20,72],[-22,59],[-59,107],[-42,71],[-21,66],[-26,74],[-19,54],[-24,68],[-12,93],[-7,99],[4,33],[11,21],[15,18],[12,4],[34,45],[24,-4],[5,10],[2,21],[-3,90],[2,120],[4,98],[5,64],[63,75],[13,33],[6,35],[0,31],[-5,24],[-9,14],[-41,-65],[-8,15],[-19,106],[-8,32],[-11,39],[-13,54],[-2,94],[-9,46],[-50,99],[-23,53],[-31,77],[-37,92],[-38,86],[-18,54],[-6,12],[-2,21],[11,59],[-5,59],[-19,78],[-8,49],[2,19],[-9,7],[-21,-4],[-20,36],[-20,78],[-1,14],[6,-1],[24,-13],[9,2],[17,18],[26,19],[16,6],[5,9],[2,19],[-13,179],[2,37],[25,77],[-3,78],[7,112],[27,77],[21,35],[7,55],[9,12],[17,-5],[36,-41],[15,-2],[22,1],[23,3],[11,4],[74,40],[16,5],[16,-5],[11,2],[12,18],[8,33],[9,103],[5,19],[10,15],[16,10],[18,-1],[24,-20],[15,-1],[17,8],[15,15],[9,18],[5,22],[-4,41],[-11,53],[3,6],[20,-11],[30,-13],[22,3],[15,9],[14,25],[19,23],[17,-5],[14,-21],[33,-36]],[[77798,57428],[-3,-9],[-11,18],[-8,21],[-4,26],[17,-1],[8,-25],[1,-30]],[[77797,57365],[1,-33],[-6,-39],[-25,-23],[-9,31],[2,49],[4,12],[25,-3],[8,6]],[[77683,55599],[-5,-3],[-10,47],[13,67],[13,-82],[-11,-29]],[[77386,56413],[-3,-10],[-14,110],[20,-29],[-3,-71]],[[77307,57057],[-16,-7],[2,32],[4,20],[8,5],[3,-34],[-1,-16]],[[77521,56216],[7,-70],[-10,15],[-8,30],[0,44],[2,7],[9,-26]],[[60971,48286],[21,-123],[-3,-23],[-15,-14],[-8,-1],[-9,20],[-7,41],[-11,-10],[-19,50],[-20,2],[-17,59],[7,51],[-4,88],[21,45],[12,76],[13,-52],[3,-80],[18,-95],[15,-29],[3,-5]],[[61073,49017],[2,-30],[-5,-27],[1,-87],[-1,-58],[-16,-80],[-13,-28],[-12,8],[-9,13],[-8,22],[15,147],[-7,107],[30,-10],[23,23]],[[58541,47123],[-8,51],[-19,77],[-26,109],[-20,89],[-22,96],[-9,70],[-17,78],[-28,96],[-14,37],[-16,33],[-40,65],[-45,64],[-25,43],[-33,128],[-14,47],[-9,81],[-8,85],[3,34],[30,109],[3,31],[-4,42],[-14,87],[-11,56],[-8,49],[-15,81],[-22,111],[-5,49],[0,36],[12,96],[10,99],[0,28]],[[58167,49280],[87,-4],[15,22],[49,63],[56,128],[11,54],[22,82],[23,40],[8,29],[6,44],[7,37],[29,56],[28,42],[-2,18],[-4,12],[5,11],[15,22],[30,20],[6,43],[0,48],[-5,28],[1,31],[-5,17],[-19,5],[-29,24],[-25,10],[-17,14],[-6,11],[-2,29],[4,32],[3,9],[6,34],[-11,20],[-2,10],[5,16],[25,108],[6,15]],[[58487,50460],[11,2],[17,13],[16,6],[14,-5],[9,6],[9,14],[7,42],[6,70],[-3,57],[-13,44],[-3,68],[6,90],[-5,75],[-14,60],[-14,36],[-22,17],[-34,92],[-11,44],[2,28],[9,9]],[[59417,51265],[21,0],[20,-21],[22,-26],[60,-69],[59,-68],[59,-69],[59,-68],[59,-69],[60,-68],[59,-69],[59,-69],[59,-68],[59,-69],[60,-68],[59,-69],[59,-68],[59,-69],[60,-68],[59,-69],[28,-33],[4,-14],[5,-62],[3,-39],[-1,-35],[-16,-58],[-5,-31],[0,-21],[4,-8],[13,-3],[12,-14],[4,-11],[9,-44],[11,-22],[25,-37],[42,-64],[43,-64],[43,-63],[42,-64],[43,-64],[43,-63],[42,-64],[43,-64],[21,-31],[8,-8]],[[60894,49140],[-5,-49],[-22,-117],[-1,-49],[-9,-58],[-8,-38],[-22,-165],[-19,-62],[-25,-145],[-5,-111],[15,-78],[5,-72],[30,-72],[23,-25],[17,-33],[28,-74],[17,-75],[51,-37],[20,-83],[-7,-58],[-24,-48],[-22,-77],[-18,-102],[-1,-155],[13,23],[27,-38],[3,-114],[-28,-134],[-8,-62],[-2,-53],[21,-160],[30,-81],[-2,-26],[-8,-21],[53,-144],[-5,-125],[20,-97],[9,-84],[13,-65],[2,-44],[-16,-50],[39,-12],[22,-41],[11,-39],[28,2],[15,-26],[22,-22],[47,-65],[13,-33],[5,-19],[3,-12]],[[61239,45815],[-32,-50],[-50,-79],[-50,-77],[-47,-52],[-34,-25],[-37,-13],[-34,-33],[-33,-50],[-42,-26],[-51,0],[-53,-36],[-53,-67],[-31,-39],[-50,59],[-38,19],[-44,-2],[-27,-8],[-10,-12],[-8,-36],[-7,-59],[-29,-57],[-51,-55],[-47,-20],[-43,14],[-29,22],[-15,32],[-23,15],[-29,-3],[-28,-22],[-27,-43],[-44,-18],[-59,5],[-31,21],[-5,35],[-26,42],[-47,47],[-35,1],[-23,-45],[-20,-29],[-19,-12],[-16,-1],[-15,9],[-9,3],[-66,5],[-62,-2]],[[59710,45173],[-2,20],[-4,46],[-13,41],[-11,24],[-14,6],[-7,-1],[-6,19],[-7,41],[-11,35],[-14,29],[-8,27],[-3,25],[2,27],[13,67],[4,47],[-1,47],[-7,49],[-15,58],[2,16],[-5,40],[-1,28],[3,34],[-3,45],[-13,97],[0,25],[-13,47],[-41,111],[-2,14],[-65,112],[-25,24],[-10,-21],[-3,-19],[3,-36],[-2,-18],[-3,-8],[-15,1],[-10,4],[-24,30],[-19,8],[-47,-6],[-17,-7],[-13,7],[-25,51],[-29,11],[-27,3],[-43,58],[-10,-3],[-5,-4]],[[61030,47247],[-15,-7],[-6,7],[-9,24],[16,21],[16,39],[36,59],[12,38],[5,8],[-3,-45],[-20,-99],[-18,-7],[-14,-38]],[[69710,75022],[1,-11],[-4,-19],[-58,-32],[-26,-28],[-6,-49],[-7,-14],[-12,-11],[-11,-3],[-18,57],[-20,12],[-29,20],[-56,40],[-29,17],[-56,-26],[-66,-35],[-10,-21],[-7,-23],[1,-17],[4,-23],[-3,-18],[-12,-6],[-19,22],[-16,12],[-8,-29],[-9,-53],[-4,-38],[14,-54],[5,-82],[26,5],[20,0],[37,24],[19,0],[29,-10],[52,-2],[40,4],[10,-2],[9,16],[11,-6],[10,-18],[41,22],[30,3],[19,-6],[11,-7],[19,-53],[15,-34],[19,-11],[57,10],[17,47],[14,12],[24,3],[19,9],[16,20],[21,16],[18,4],[9,-13],[4,-16],[-3,-21],[-1,-22],[12,-15],[35,-3],[17,-14],[1,-26],[-3,-41],[15,-17],[7,-1],[52,43],[14,1],[12,-24],[17,-29],[23,-30],[6,4],[10,34],[20,36],[36,12],[21,11],[21,5],[65,-14],[21,-2],[44,3],[35,7],[28,22],[15,17],[23,10],[29,-1],[16,-5]],[[70453,74567],[1,-30],[-4,-57],[-4,-40],[23,-72],[15,-34],[14,-25],[3,-19],[-3,-16],[-18,-15],[-7,-17],[-3,-18],[6,-21],[11,-68],[13,-53],[19,-26],[28,-17],[15,4],[11,40],[18,30],[16,-2],[25,1],[66,-34],[64,-52],[18,-29],[7,-32],[-18,-75],[1,-47],[4,-51],[15,-38],[13,-65],[3,-53],[6,-16],[4,-19],[-7,-49],[-5,-50],[6,-16],[20,-25],[31,-45],[6,-38],[-11,-24],[-20,-29],[-25,-25],[-8,-11]],[[70802,73289],[-4,6],[-12,26],[-28,41],[-20,21],[-38,-7],[-22,8],[-26,13],[-25,-2],[-16,-24],[-10,-25],[-25,-8],[-35,-19],[-56,-30],[-26,5],[-8,13],[6,17],[19,22],[5,26],[-4,25],[-17,7],[-7,4],[-8,5],[-34,15],[-28,-6],[-47,-31],[-88,-81],[-38,-55],[-28,-82],[-83,-27],[-57,-47],[-59,-78],[-39,-41],[-19,-6],[-19,7],[-19,21],[-18,65],[-16,98],[-11,64],[6,84],[7,94],[7,96],[11,111],[10,40],[0,26],[-8,13],[-18,0],[-27,-15],[-20,-3],[-11,10],[1,52],[14,93],[-21,79],[-57,64],[-48,22],[-40,-20],[-33,-50],[-27,-82],[-28,-68],[-29,-52],[-21,-25],[-7,-10],[-4,-22],[16,-69],[-1,-58],[-18,-48],[-19,-22],[-21,2],[-16,11],[-13,20],[-33,5],[-54,-9],[-37,-23],[-20,-39],[-6,-50],[8,-62],[-4,-48],[-17,-34],[-14,-19],[-10,-5],[-24,29],[-36,62],[-25,34],[-14,5],[-7,-3],[-8,-7],[-5,-8],[-4,-18],[-12,-7],[-16,5],[-15,-5],[-9,-20],[-25,-23],[-44,-27],[-25,-28],[-4,-30],[-6,-14],[-14,5],[-40,-41],[-30,13],[-35,53],[-19,44],[-2,18]],[[69639,74783],[-25,-22],[-15,3],[-11,21],[-8,20],[-2,12],[4,-1],[19,-9],[27,-6],[10,-6],[1,-12]],[[83613,64873],[-17,-68],[-14,-71],[-6,-68],[1,-69],[-4,-63],[-7,-62],[-27,18],[-15,44],[-3,73],[-20,88],[-7,26],[-28,49],[-26,25],[-20,36],[3,-3],[-15,49],[-11,52],[-23,148],[-8,36],[-10,32],[-3,33],[3,36],[10,53],[6,54],[-5,74],[2,73],[8,32],[130,443],[36,94],[22,47],[18,52],[17,66],[22,60],[15,19],[75,54],[23,52],[19,16],[21,-1],[14,-25],[12,-29],[13,-16],[33,-28],[15,-28],[6,-48],[-20,-45],[-10,-41],[-2,-45],[4,-61],[0,-61],[-25,-143],[-27,-90],[-7,-44],[-9,-111],[-16,-111],[-13,-140],[-22,-145],[-13,-61],[-16,-58],[-37,-109],[-42,-90]],[[82890,65968],[12,-38],[-5,-24],[-38,13],[-2,23],[14,-4],[19,30]],[[61766,73219],[0,-8],[-3,-20],[-31,-57],[-43,-78],[-30,-49],[-52,-83],[-38,-18],[-65,-30],[-17,-29],[-17,-46],[-9,-64],[-3,-40],[-2,-75],[16,-77],[14,-75],[2,-49],[-1,-48],[-14,-52],[-16,-71],[-9,-80],[-4,-150],[0,-128],[-2,-21],[-26,-90],[-31,-106],[-15,-24],[-68,-32],[-74,-77],[-84,-87],[-75,-78],[-79,-83],[-83,-85],[-59,-61],[-78,-82]],[[60770,71066],[-72,-78],[-72,-79],[-56,-60],[-83,-95],[-49,-56],[-73,-82],[-63,-72],[-75,-85],[-94,25],[-30,15],[-25,40],[-18,22],[-44,22],[-29,77],[-17,27],[-30,12]],[[59940,70699],[4,27],[16,47],[15,50],[-8,28],[-3,23],[-1,29],[10,27],[-5,33],[-8,33],[-6,16],[0,30],[4,23],[5,36]],[[59963,71101],[13,19],[3,20],[11,20],[16,16],[3,13],[-2,7],[-15,15],[-9,25],[8,38],[5,11],[9,18],[20,28],[16,4],[14,0],[23,-2],[18,-5],[5,7],[-1,9],[-22,23],[-1,18],[5,19],[16,30],[19,23],[9,4],[22,44],[14,50],[-22,122],[-14,19],[-22,17],[-13,3],[-1,8],[17,30],[13,27],[-14,26],[-24,12],[-9,-27],[-32,-2],[-48,0]],[[59993,71790],[-22,129],[-3,55],[1,65],[15,94],[-7,43],[-1,30],[-4,40],[-38,87],[21,160],[15,39]],[[52645,79218],[8,-7],[20,-26],[-4,-43],[-23,-70]],[[52646,79072],[-12,-56],[-1,-44],[2,-20],[4,0],[22,-3]],[[52661,78949],[11,0],[34,-11],[28,-17],[6,-19],[3,-22],[33,-30],[38,-19],[13,6],[47,71],[19,-12],[11,-38],[-1,-19]],[[52903,78839],[-13,-75],[-2,-41],[11,-26],[1,-21],[-3,-19],[-19,-2],[-25,11],[-21,32],[-17,-4],[-14,-8],[-7,-31],[-6,-36],[2,-21],[10,-15],[8,-34],[5,-43],[5,-20],[-5,-8],[-13,-6],[-11,5],[-20,52],[-9,20],[-15,3],[-27,-12],[-41,-29],[-17,0],[-14,6],[-13,24],[-11,47],[-4,30],[-8,-1],[-26,9],[-12,-12],[0,-48],[-3,-61],[-13,-38],[-37,-68],[-13,-29],[-6,-21],[-1,-18],[6,-32],[7,-30],[-6,-18],[-19,-9],[-14,19],[-5,32],[-30,45],[13,37],[-2,10],[-49,19],[-21,28],[-30,50],[-6,21],[2,69],[-2,17],[-4,8],[-14,0],[-20,-24],[-19,-36],[-38,-41],[-4,-8],[13,-40],[-1,-15],[-30,-63],[-6,-21],[-39,-39],[-18,-15],[-54,29],[-15,4],[-25,-20],[-34,-18],[-55,-19],[-21,14],[-9,13]],[[51950,78298],[-5,19],[-14,33],[-16,20],[-11,22],[-14,24],[-9,19],[12,64],[-9,22],[-5,32],[3,22],[-5,5],[-50,12],[-42,-4],[-29,-21],[-25,-35],[-3,-8],[2,-6],[12,-32],[-20,-35],[-32,-26],[-22,-3],[-10,5],[0,37],[18,13],[17,24],[5,34],[2,23],[-17,29],[2,17],[11,34],[6,29],[9,25],[34,42],[35,41],[5,45],[3,54],[5,13],[47,32],[11,13],[6,18],[37,60],[37,60],[7,20],[6,12],[0,10],[-4,7],[-18,5],[-6,19],[19,34],[24,21],[23,0],[9,-9],[-1,-11],[10,-12],[18,-4],[21,4],[22,13],[13,30],[7,23],[34,26]],[[52115,79258],[23,-13],[63,-4],[47,7],[29,18],[36,0],[24,-10],[4,1],[7,3],[6,9],[23,7],[3,8],[-1,8],[-4,4],[-28,-4],[-11,6],[-2,15],[9,25],[20,20],[18,5],[12,-5],[31,-38],[7,-2],[5,7],[6,4],[11,-7],[11,-24],[2,-4],[69,9],[15,0],[47,-42],[48,-43]],[[55298,85158],[-23,-14],[-13,-40],[-19,-7],[-17,-14],[-7,-128],[33,-49],[-18,-7],[-17,-14],[-11,-22],[-12,-47],[-45,-26],[-17,-19],[-25,-44],[-13,-63],[-25,-27],[-29,-6],[17,52],[22,42],[-21,28],[-13,46],[-16,34],[13,39],[-7,63],[2,62],[19,32],[22,25],[34,59],[37,42],[51,19],[23,-17],[10,38],[17,9],[15,-9],[33,-37]],[[54591,84268],[-15,-29],[-12,2],[-9,39],[-2,99],[5,49],[61,178],[27,14],[38,109],[10,48],[17,44],[10,39],[8,15],[17,-7],[8,-7],[-18,-23],[2,-29],[-1,-13],[-48,-128],[-12,-83],[-17,-21],[-69,-296]],[[53163,85850],[23,-73],[20,-10],[28,19],[19,53],[11,81],[13,76],[-15,81],[-17,72],[-1,21],[43,60],[13,49],[14,47],[16,16],[23,4],[27,9],[34,31],[30,42],[24,38],[8,76],[0,39],[10,28],[10,55],[-9,55],[-31,83],[-36,117],[-5,63],[16,12],[32,11],[60,3],[6,7],[6,28],[13,38],[15,28],[10,39],[4,36],[-34,54],[-45,55],[-30,18],[-54,46],[-38,39],[22,148],[16,109],[3,27],[0,41],[-52,177],[2,39],[5,35],[-6,61],[-3,54],[9,16],[21,30],[-20,47],[-2,4],[-38,117],[59,115],[-11,60],[36,44],[64,99],[36,56],[7,9],[29,25],[54,29],[60,14],[27,0],[103,-20],[80,-15],[12,15],[17,32],[22,45],[1,50],[-7,73],[-12,44],[-57,29],[-62,39],[76,124],[53,86],[66,129],[21,54],[15,22],[19,198],[13,56],[11,29],[0,30],[-7,50],[-19,114],[104,14],[34,7],[32,14],[61,35],[31,31],[-17,106],[37,36],[91,125],[98,119],[46,46],[5,22],[4,35],[-21,56],[-22,35],[-43,65],[19,46],[31,9],[42,18],[32,39],[4,5],[55,154],[107,77],[43,43],[67,-32],[97,-48],[44,71],[14,26],[15,39],[-6,67],[-3,87],[5,34],[39,16],[21,4],[108,-36],[28,1],[51,-5],[57,-16],[120,-42],[50,-17],[28,-4],[24,20],[51,50],[-76,37],[50,38],[26,38],[22,46],[8,55],[-3,29],[-16,20],[-46,50],[105,7],[36,2]],[[55728,91610],[76,-33],[3,-7],[0,-17],[3,-18],[74,-45],[21,-23],[45,-37],[12,-19],[42,-23],[30,-24],[35,-20],[41,-31],[55,-25],[46,-8],[117,-42],[20,-13],[33,-30],[35,-34],[23,-69],[38,-4],[10,-24],[33,-41],[46,-36],[-2,-12],[-36,-34],[-4,-45],[3,-58],[12,-47],[-2,-14],[-9,-16],[-10,-26],[-4,-22],[1,-11],[3,-6],[20,0],[34,-5],[20,-10],[12,-55],[-4,-10],[-29,-25],[-9,-19],[-1,-29],[6,-31],[9,-36],[23,-37],[31,-40],[20,-32],[9,-23],[4,-16],[-14,-20],[-12,-40],[-3,-45],[-5,-30],[-27,-41],[-19,-14],[-5,-22],[-3,-36],[6,-44],[2,-29],[6,-22],[8,-14],[43,-25],[25,-50],[15,-41],[29,-106]],[[56709,89749],[-73,-13],[-56,26],[-27,-13],[-48,-1],[-55,-10],[-19,-21],[-14,-8],[-51,29],[-48,49],[-35,-37],[-23,-7],[-20,33],[-18,6],[-10,-12],[-8,-29],[-14,-24],[-3,-14],[-2,-60],[-4,-14],[-46,8],[2,-16],[10,-8],[5,-10],[-17,-13],[-47,2],[-4,-14],[13,-22],[-10,-19],[-10,-8],[-55,-12],[-32,3],[-9,-12],[-3,-16],[6,-16],[14,-9],[5,-10],[-1,-21],[-12,-4],[-33,38],[-10,-2],[7,-20],[19,-22],[11,-22],[10,-26],[-2,-21],[-41,-65],[-37,-41],[-27,-37],[-16,-39],[19,-20],[20,-29],[15,-55],[17,-49],[35,-46],[-7,-27],[-8,-21],[-58,-47],[-66,-70],[-71,-178],[-24,-24],[-62,-30],[-23,-30],[-46,-35],[-81,-29],[-37,-42],[-16,-43],[-19,-3],[-18,17],[-24,12],[-3,-28],[1,-21],[-39,31],[-19,-28],[-14,-47],[-56,-63],[-61,11],[-6,-11],[16,-8],[2,-10],[-11,-5],[-17,0],[-25,-12],[-17,1],[-8,-30],[-13,-37],[-34,-15],[-18,-3],[-9,-20],[53,-5],[-4,-17],[-1,-17],[-6,-19],[-60,-27],[-9,-21],[-12,-13],[-27,0],[1,13],[4,13],[-39,-1],[-12,31],[-8,-8],[4,-25],[11,-25],[11,-38],[-9,-24],[-10,-11],[7,-11],[21,-8],[9,-15],[-25,-13],[-32,-44],[-32,-1],[-20,-28],[-21,0],[-17,18],[-27,15],[-9,-27],[-2,-20],[16,-53],[29,-41],[28,-18],[-20,-12],[-15,-26],[-17,-83],[-10,-33],[-10,-57],[6,-49],[6,-24],[13,-32],[-36,4],[-39,19],[6,-39],[-24,-47],[4,-40],[5,-27],[-7,-44],[11,-14],[6,-26],[-10,-20],[5,-17],[1,-59],[8,-92],[-3,-20],[21,-80],[-5,-29],[-3,-36],[31,-34],[27,0],[27,1],[10,-9],[11,-24],[8,-29],[23,2],[36,24],[23,6],[16,-46],[42,-59],[24,-27],[42,-14],[43,-48],[-6,-58],[18,-20],[52,-22],[18,-31],[9,-27],[14,-21],[16,-66],[-6,-41],[-21,-14],[-49,-44],[-22,-32],[-17,-20],[-49,-44],[-18,-8],[-17,-22],[-16,-10],[-15,6],[-55,-41],[4,-18],[42,-7],[22,9],[17,20],[18,5],[16,-4],[18,16],[14,7],[14,-8],[16,-39],[-33,-20],[-23,-1],[-12,-64],[-14,-27],[-10,-13],[-52,-27],[-35,-35],[-40,-27],[-18,6],[-26,-29],[-59,-33],[-31,-45],[-68,-40],[-34,-32],[-95,-2],[-89,7],[-29,-16],[29,-4],[20,-16],[25,7],[57,-8],[29,-8],[38,-54],[-28,-19],[-48,-14],[18,-76],[15,-51],[-20,-31],[-1,-140],[-27,-2],[-12,-58],[9,-30],[-1,-69],[6,-42],[13,-39],[-6,-41],[-43,-95],[1,-44],[8,-27],[6,-42],[-20,-81],[-14,-69],[-16,-57],[-37,-69],[-18,-51],[-43,-160],[-21,-32],[-26,-24],[-29,22],[-27,13],[-32,-2],[-51,-18],[-77,12],[-74,-6],[-19,-16],[11,-58],[-28,-8],[-26,17],[-24,-20],[-20,-22],[-39,-51],[-13,-32],[-3,-59],[20,-54],[18,-62],[-46,-76],[-26,-2],[-76,20],[-135,-47],[-121,38],[15,40],[0,30],[6,45],[4,47],[-1,32],[-9,33],[-29,44],[-68,147],[-19,62],[-14,26],[10,1],[55,-33],[13,4],[13,13],[-16,47],[-14,22],[-10,32],[33,9],[23,-2],[17,37],[-10,58],[-25,19],[-21,7],[-40,93],[-42,48],[-75,184],[-27,127],[-26,-12],[-12,55],[-9,53],[-2,38],[-40,22],[-1,27],[-8,120],[-42,16],[-28,68],[-5,128],[-28,23],[-23,-7],[1,32],[5,30],[-13,117],[-4,108],[-11,32],[-6,38],[5,33],[8,19],[28,5],[26,-29]],[[55321,85208],[-5,-36],[-15,3],[-13,26],[27,41],[40,-2],[14,-9],[-48,-23]],[[55115,85846],[-12,-6],[-6,2],[7,27],[6,11],[19,11],[5,-2],[-19,-43]],[[55165,86100],[-7,-19],[-7,23],[3,5],[4,23],[14,12],[21,-7],[0,-6],[-20,-19],[-8,-12]],[[58874,36890],[6,-8],[25,-27],[2,-53],[-2,-60],[-5,-38],[2,-38],[8,-59],[8,-41],[2,-184]],[[58920,36382],[-9,9],[-16,7],[-8,-3],[-8,-83],[-6,-122],[4,-77],[-60,-2],[-76,8],[-54,33],[-59,73],[-35,113],[-15,71],[-21,4],[-4,12],[-2,87],[1,91],[4,25],[39,112],[25,69],[15,68],[33,79],[36,51],[13,7],[9,-2],[62,-70],[65,-66],[14,8],[7,6]],[[34956,54930],[-23,-41],[-25,-58],[-34,-100],[2,-32],[-8,-25],[-2,-45],[3,-51],[8,-33],[4,-62],[-6,-57],[2,-33],[7,-52],[6,-55],[-1,-23],[8,-18],[8,-18],[-3,-49],[27,-88],[16,-39],[23,-37],[9,-37],[13,-44],[8,-5],[4,-18],[-4,-34],[-1,-47],[-15,-55],[-35,-100],[-4,-24],[9,-83],[-5,-68],[-2,-33],[-17,-60],[-40,-145],[-23,-27],[-14,-42],[-9,0],[-10,-4],[-4,-5]],[[34828,53183],[-12,0],[-10,19],[-2,22],[-5,25],[-12,8],[-24,-9],[-7,6],[-14,27],[-11,30],[-3,28],[-8,-3],[-18,-25],[-12,-6],[-9,7],[-11,-2],[-28,-27],[-16,-7],[-11,-27],[-76,-13],[-20,-7],[-45,48],[-12,15],[-6,3],[-5,-3],[-5,-11],[-8,-60],[-6,-16],[-12,-14],[-12,-24],[-2,-23],[18,-13],[15,-45],[16,-36],[13,-33],[-2,-36],[-2,-51],[-10,-18],[-15,-8],[-58,25],[-44,22],[-19,5],[-8,5]],[[34310,52961],[-11,19],[-11,18],[-18,6],[-22,12],[-15,45],[-17,64],[-5,29],[-13,28],[-13,40],[-3,36],[-10,32],[-5,11],[-7,45],[-2,16],[-3,2],[-5,14],[-11,47],[-2,12],[-4,4],[-12,34],[-9,11],[-4,17],[1,47],[-5,23],[-2,43],[0,17],[-5,20],[-8,12],[-1,32],[-2,77],[-4,14],[-34,-1],[-3,-8],[-15,-4],[-16,-1],[-15,10],[-12,14],[-3,17],[2,54],[-20,41],[-31,50],[-9,64],[-12,40],[-34,84],[-7,57],[0,41],[13,37],[17,65],[6,60],[6,31],[8,40],[8,53],[-6,32],[-10,32],[-3,23],[10,35],[10,24],[11,4],[14,15],[12,21],[17,5],[22,2],[44,0],[22,9],[7,17],[-1,33],[12,29],[11,13],[5,9],[1,11],[-3,10],[-5,7],[-12,2],[-11,51],[7,22],[10,41],[2,23],[15,37]],[[34112,55039],[4,-12],[11,67],[2,53],[8,54],[14,63],[24,31],[140,-32],[64,-30],[82,-52],[12,-55],[0,55],[-4,56],[23,40],[50,14],[75,-19],[64,23],[87,-3],[133,-45],[59,-31],[25,-28],[4,-50],[-2,-64],[-10,-62],[-21,-82]],[[58566,53853],[-6,25],[-6,23],[-11,29],[-16,12],[-14,-6],[-17,-6],[-8,17],[-1,40],[-5,37],[-8,28],[-24,28],[-63,56],[-48,113],[-25,52],[-17,34],[-25,89],[-29,61],[-35,28],[-23,-14],[-23,-65],[-45,-61],[-20,-3],[-26,34],[-33,23],[-59,11],[-24,-29],[-32,-47],[-27,-28],[-17,-4],[-15,12],[-18,6],[-15,1],[-32,42],[-16,32],[-11,30],[-18,21],[-21,17],[-15,27],[-7,34],[-12,43],[-15,39],[-48,70],[-15,41],[-10,41]],[[57611,54786],[-19,44],[-21,60],[-7,87],[-1,70],[-4,32],[-9,33],[-11,27],[-16,31],[-40,45],[-40,52],[-20,31],[-36,11],[-23,30],[-18,65],[-8,53],[-18,41],[-8,29],[-5,34],[15,104],[-21,37],[-32,47],[-23,52],[-14,48],[-41,63],[-90,95],[-51,60],[-29,54],[-24,53],[-3,22],[16,53],[3,43],[-13,48],[-54,91],[-43,99],[-32,31],[-78,28],[-23,11],[-23,19],[-23,45],[-8,53],[11,84],[-7,26],[-13,7]],[[56707,56834],[4,18],[14,41],[24,27],[65,42],[3,16],[2,53],[5,26],[22,73],[3,29],[1,63],[3,29],[7,21],[17,37],[6,22],[3,48],[-2,94],[9,38],[41,86],[11,38],[3,34],[0,35],[2,35],[12,33],[11,11],[30,10],[20,-7],[143,59],[16,-8],[8,-35],[-1,-55],[3,-27],[7,-19],[23,-27],[15,-44],[9,-16],[23,-31],[106,-253],[30,-24],[29,9],[57,52],[29,14],[202,-15],[22,8],[1,-2],[31,-127],[15,-29],[221,-1],[-4,36],[2,40],[26,52],[13,26],[6,9],[34,38],[33,25],[64,29],[24,46],[13,42],[0,82],[9,14],[15,19],[74,74],[13,16],[131,-172],[73,-136],[5,-7],[3,-2],[4,4],[4,7],[5,4],[3,2],[32,1],[59,7],[20,16],[119,243],[31,78],[8,16],[17,55],[18,95],[4,11],[131,227],[4,18],[1,15],[-19,76],[-5,39],[0,60],[3,93],[-1,59],[0,7],[-2,9],[-1,3],[-73,168],[185,2],[0,14],[0,7],[0,7],[-4,20],[-2,26],[0,8],[0,7],[1,14],[0,7],[0,4],[0,3],[0,3],[1,3],[132,-4],[-1,-47],[-16,-112],[0,-66],[-4,-77],[-1,-6],[-3,-16],[-4,-10],[-3,-9],[-1,-3],[-2,-6],[0,-8],[28,-427],[-1,-11],[-1,-7],[-8,-27],[-1,-9],[-1,-6],[3,-5],[61,-46],[3,-3],[3,-4],[22,-55],[120,-202],[4,-10],[12,-64],[2,-10],[0,-15],[0,-12],[-3,-38],[1,-17],[2,-12],[2,-13],[0,-4],[-1,-3],[0,-6],[-18,-74],[-6,-52],[-2,-44],[1,-25],[2,-17],[1,-4],[1,-2],[1,-2],[1,-1],[51,0],[1,0]],[[59466,57293],[-1,-24],[2,-116],[2,-102],[3,-167],[0,-43],[-2,-55],[-6,-21],[-15,-31],[-18,-28],[-47,-7],[-39,1],[-27,6],[-38,3],[-36,-6],[-13,-24],[-19,-83],[-28,-122],[-14,-51],[-4,-30],[4,-18],[19,-26],[40,-36],[46,-21],[34,-9],[24,-10],[18,-12],[66,-93],[21,-43],[12,-38],[2,-41],[10,-41],[38,-81],[21,-47],[57,-61],[22,-68],[21,-33],[20,-36],[11,-53],[25,-154],[16,-81],[17,-66],[7,-108],[13,-48],[14,-58],[23,-53],[25,-41],[4,-11]],[[59796,55006],[-51,-104],[-57,-116],[-66,-135],[-73,-147],[-56,-116],[-56,-114]],[[56707,56834],[-28,15],[-35,11],[-67,13],[-27,19],[-12,29],[4,73],[-7,16],[-11,13],[-7,32],[1,38],[36,85],[7,45],[6,158],[4,55],[-3,65],[-28,119],[-25,83],[-40,123],[-16,41],[-81,169],[-9,25],[-20,72]],[[56349,58133],[10,63],[12,94],[1,43],[-5,45],[-21,33],[-18,4],[-8,17],[-16,25],[-15,19],[-14,37],[-10,52],[7,184],[-5,25],[-20,7],[-5,13],[1,36],[-12,105],[-12,87],[7,48],[-18,66],[-33,28],[-31,-9],[-33,-13],[-20,4],[-14,12],[-10,24],[-5,28],[5,43],[18,79],[23,64],[46,59],[13,31],[7,35],[1,40],[-3,42],[-5,38],[-14,51],[-13,60],[0,40],[6,29],[13,35],[24,39],[6,8],[16,21],[13,15],[34,42],[8,19],[-3,24],[-8,20],[-14,27],[-2,33],[-4,57],[-7,37],[-5,26],[9,20],[14,28],[18,17],[28,15],[11,19],[3,38],[-1,37],[10,27],[14,57],[10,27],[18,30],[19,38],[8,43],[2,43],[-10,127],[21,54],[27,44],[38,-3],[60,9],[40,19],[29,-1],[66,-24],[5,6],[2,5],[3,34],[0,85],[0,257],[0,257],[0,257],[0,257],[0,257],[0,257],[0,256],[0,257]],[[56661,63073],[0,72],[0,72],[0,72],[0,72],[68,0],[69,0],[68,0],[69,0],[1,1],[0,1],[1,1],[1,1],[0,287],[0,287],[0,287],[0,287]],[[56938,64513],[107,0],[106,0],[106,0],[106,0],[106,0],[106,0],[106,0],[106,0],[106,0],[107,0],[106,0],[106,0],[106,0],[106,0],[106,-1],[106,0],[33,0],[14,5],[27,107],[12,8],[17,-6],[7,-25],[-6,-37],[-9,-51],[52,0],[91,0],[91,0],[92,0],[91,0],[91,0],[91,0],[91,0],[91,0],[91,0],[92,0],[91,0],[91,0],[91,0],[91,0],[91,0],[91,1]],[[60241,64514],[4,-132],[12,-105],[43,-150],[36,-81],[13,-44],[1,-21],[-1,-19],[-11,22],[-19,15],[-3,-70],[5,-50],[4,-94],[15,-101],[-11,-93],[2,-158],[19,-190],[-4,-120],[32,-283],[30,-156],[17,-39],[19,-20],[36,-14],[53,-79],[43,-85],[15,-44],[20,-48],[14,9],[9,12],[13,-39],[67,-84],[10,-39]],[[60724,62214],[-24,-38],[-28,-66],[-7,-26],[-3,-16],[-3,-20],[-8,-19],[-16,-27],[-6,-12],[-4,-18],[-9,-12],[-11,-1],[-9,-8],[-14,-12],[-20,6],[-21,-12],[-8,-14],[-16,-13],[-17,-3],[-5,-4],[-16,-22],[-19,-30],[-23,-19],[-8,-6],[-10,-21],[-16,-103],[-12,-27],[-19,-3],[-26,0],[-22,-9],[-30,12],[-14,-2],[-4,-22],[-6,-89],[1,-38],[-12,-45],[-13,-56],[5,-95],[2,-94],[-24,-142],[-4,-32],[-24,-113],[-13,-41],[-31,-210],[-13,-65],[-26,-68],[6,-110],[6,-118],[6,-110],[9,-166]],[[60145,60055],[-22,-155],[1,-84],[-16,-124],[-12,-58],[-11,-34],[-10,-35],[-17,-78],[-14,-102],[-7,-105],[0,-61],[-3,-28],[-5,-17],[-33,-12],[-46,-12],[-25,-14],[-17,-22],[-21,-49],[-40,-137],[-22,-83],[-33,-115],[-39,-81],[-8,-39],[-7,-73],[-14,-116],[-13,-83],[2,-66],[-12,-115],[2,-56],[-14,-31],[-18,-30],[-13,-7],[-27,34],[-20,34],[-8,9],[-18,-21],[-21,-32],[-25,-75],[-19,-75],[11,-159],[-1,-35],[-5,-38],[-30,-119],[-7,-37],[-11,-72],[-11,-124],[0,-30]],[[72213,57390],[-17,-6],[-14,38],[-3,17],[3,11],[4,6],[5,-2],[6,-36],[16,-28]],[[72187,57056],[8,-43],[-23,29],[-15,25],[-6,20],[32,-22],[4,-9]],[[72217,57495],[26,-3],[29,2],[20,-8],[34,-89],[93,-159],[51,-162],[4,-35],[7,-30],[12,-9],[11,-14],[50,-156],[6,-31],[-1,-34],[3,-25],[14,-13],[16,-6],[11,-24],[14,-124],[0,-39],[3,-17],[64,-193],[4,-24],[-1,-18],[2,-15],[12,-34],[20,-92],[9,-21],[12,-81],[1,-154],[-4,-69],[-12,-84],[-14,-81],[-16,-59],[-21,-50],[-71,-106],[-21,-22],[-93,-66],[-68,-63],[-64,-17],[-63,34],[-48,83],[-24,122],[-17,127],[-25,141],[-18,435],[-9,122],[-15,155],[2,67],[10,64],[0,-141],[9,-17],[7,18],[7,146],[5,62],[25,161],[1,29],[-5,61],[1,30],[38,113],[9,66],[5,67],[-2,73],[-7,72],[31,-23],[17,-25],[17,-17],[14,9],[16,0],[-11,39],[-36,36],[-59,22],[-18,29],[-7,25],[3,29],[5,11]],[[50442,74119],[-6,-7],[-18,7],[-28,0],[-1,23],[4,16],[5,17],[17,-33],[27,-6],[0,-17]],[[50873,74763],[27,-19],[28,17],[15,-5],[15,-9],[3,-37],[-13,-41],[-18,-41],[-16,-45],[-13,-52],[-25,-31],[-23,-18],[-48,38],[-28,10],[-8,14],[-7,58],[-12,18],[-19,8],[-16,-14],[-21,-31],[-12,31],[-17,5],[-7,19],[0,23],[115,139],[33,31],[71,36],[11,-5],[-9,-22],[0,-9],[9,-10],[-2,-17],[-9,-14],[-4,-27]],[[51192,74793],[-5,-7],[-85,67],[-28,7],[-7,10],[1,35],[2,15],[57,7],[46,-24],[25,-67],[2,-11],[-8,-32]],[[50401,74261],[-10,-35],[-42,12],[-10,15],[9,40],[13,5],[0,28],[13,29],[60,23],[14,-20],[3,-28],[-36,-61],[-14,-8]],[[49501,76847],[1,-20],[10,-28],[12,-10],[24,-14],[18,-2],[25,-7],[17,-16],[1,-24],[-5,-28],[-10,-25],[-6,-20],[6,-11],[9,-9],[9,-2],[7,3],[5,15],[9,19],[5,2],[0,-10],[4,-13],[31,-23],[67,-41],[26,-1],[22,-5],[6,-17],[43,-64],[10,2],[19,-1],[23,5],[16,12],[11,-2],[12,-13],[14,-10],[19,-21],[16,-26],[11,-9],[67,18],[15,-16],[16,0],[18,4],[39,-8],[32,2],[3,7],[3,57],[5,21],[7,5],[19,-4],[68,-34],[28,-21],[27,-17],[24,-2],[15,-11],[22,-55]],[[50396,76379],[-3,-27],[1,-10],[3,-19],[-1,-21],[6,-14],[10,-2],[14,5],[14,8],[26,23],[7,4]],[[50473,76326],[43,-27],[19,-17],[7,-20],[9,-19],[13,-3],[18,19],[29,20],[48,-18],[54,-26],[23,-3],[1,13],[4,18],[9,8],[13,3],[19,9],[21,16],[21,6],[23,-11],[28,-10],[17,0]],[[50892,76284],[7,-36],[14,-14],[5,-31],[-24,-17],[-15,-2],[-4,-54],[6,-16],[14,-14],[4,-16],[3,-80],[-28,-48],[-40,-54],[-193,-173],[-46,-84],[-17,-19],[-143,-53],[-101,-57],[-48,-20],[-60,-98],[-28,-40],[23,-11],[26,-47],[-9,-21],[-38,-32],[-17,-10],[-9,5],[-9,-4],[-64,-170],[-58,-123],[-32,-53],[-32,-79],[-70,-206],[-1,-59],[35,-204],[19,-54],[28,-45],[53,-38],[12,-38],[-18,-36],[-52,-64],[-91,-86],[-39,-68],[-8,-66],[-27,-30],[-10,-92],[-16,-61],[-4,-20],[-17,-47],[-2,-33],[28,-47],[-14,-20],[-14,-9],[-32,-5],[-108,-6],[-87,-100],[-44,-89],[-39,-165],[-48,-98],[-21,-18],[-33,43],[-41,7],[-40,-15],[-20,-33],[-33,-19],[-32,16],[-68,9],[-31,-2],[-48,-27],[-41,18],[-69,9],[-150,-21],[-18,-11],[-19,-41],[-48,-70],[-72,-3],[-66,-45],[-16,-29],[-28,-79],[-9,-58],[-5,-1],[-7,14],[-11,-4],[-5,-45],[-25,-20],[-20,-7],[-51,36],[-42,54],[-22,3],[-36,84],[-16,54],[-11,57],[2,22],[-3,19],[-32,23],[-8,53],[24,68],[19,30],[12,8],[-29,-3],[-21,-44],[-27,71],[-109,138],[7,31],[-1,18],[-18,-37],[-13,-10],[-56,6],[-64,-17]],[[47942,73259],[-17,144],[-8,55],[-2,35],[17,82],[18,34],[24,69],[30,58],[31,13],[14,9],[11,44],[7,38],[-5,4],[-36,-8],[-66,159],[2,26],[8,38],[6,47],[1,38],[17,32],[26,32],[22,46],[11,46],[3,41],[-13,29],[-36,16],[-37,117],[-8,73],[-8,8],[-23,33],[-22,62],[-3,10],[23,11],[93,1],[20,13],[3,5],[17,49],[18,80],[4,49],[-6,20],[-31,49],[-1,15],[5,23],[18,25],[25,28],[14,25],[-3,19],[-8,20],[-1,18],[5,23],[1,79],[4,20],[-5,71],[-6,58],[-20,75],[4,17],[9,14],[29,26],[24,62],[35,51],[45,41],[31,46],[13,35],[9,10],[-3,16],[-6,24],[-18,23],[-23,13],[-26,0],[-16,4],[-4,19],[1,49],[-1,49],[-5,22],[-12,17],[-24,-5],[-20,14],[-16,3],[-9,-10],[-45,3],[-19,8],[-14,9],[-8,-5],[-5,-10],[-1,-15],[-3,-19],[-17,-18],[-37,-18],[-30,2],[-28,12],[-9,10],[-13,8],[-57,-10],[-7,7],[-19,-18],[-29,-22],[-16,-1],[-6,4],[-2,10],[-12,34],[3,18],[23,53],[-2,12],[-10,17],[-8,25],[-3,12],[-15,2],[-15,-13],[-60,-26],[-14,-9],[-26,-26],[-27,-39]],[[47561,76002],[-20,-8],[-8,12],[-2,91],[32,60],[22,37],[-10,7],[-24,-1],[1,29],[12,13],[11,31],[-13,14],[-10,20],[0,53],[3,22],[-3,23],[-49,-32],[-13,5],[0,40],[27,60],[3,18],[-32,9],[-24,30],[-14,26],[-16,38],[0,34],[16,79],[23,24],[20,14],[42,55],[57,-10],[36,11],[32,28],[19,7],[29,24],[-1,33],[-10,25],[9,23],[33,29],[37,37],[42,7],[43,34],[29,-22],[25,7],[29,-25],[38,-58],[56,-24],[45,19],[78,3],[40,-7],[70,14],[40,-5],[64,29],[51,-36],[97,-17],[58,-30],[162,-49],[59,-1],[82,28],[35,21],[32,-13],[47,24],[23,-4],[29,-35],[104,-46],[27,39],[20,9],[74,-24],[75,-49],[39,-3],[57,13],[46,32],[9,4]],[[45462,68190],[-23,-131],[-22,-52],[-13,-17],[-32,-14],[-38,82],[-19,83],[-11,26],[17,21],[25,-3],[54,17],[11,7],[55,84],[55,10],[1,-27],[-60,-86]],[[46190,68497],[-19,-38],[-21,13],[10,83],[9,25],[39,36],[32,15],[9,38],[11,15],[11,-23],[-9,-26],[-6,-84],[-22,-26],[-44,-28]],[[46056,68069],[-38,-65],[-38,15],[-6,11],[38,16],[34,50],[22,110],[35,121],[7,52],[13,20],[19,2],[8,-4],[9,-27],[0,-61],[-10,-102],[-18,-89],[-75,-49]],[[45722,68057],[-2,-45],[6,-44],[-1,-69],[-13,-36],[-35,-37],[-26,6],[-15,15],[-27,60],[-1,61],[25,41],[10,51],[64,-9],[6,9],[4,3],[5,-6]],[[45226,67984],[-11,-5],[-14,15],[-14,45],[10,34],[8,16],[13,-3],[23,-25],[8,-25],[0,-16],[-23,-36]],[[45031,67862],[-27,-94],[-34,35],[-8,12],[-7,19],[33,4],[33,47],[10,-23]],[[45046,68256],[-7,-5],[-7,46],[-33,111],[20,50],[37,1],[15,-34],[5,-36],[-7,-21],[2,-42],[-4,-27],[-21,-43]],[[85175,73606],[9,11],[0,16],[0,51],[25,36],[34,73],[17,40],[20,38],[22,25],[22,11],[35,5],[66,-4],[13,4],[46,4],[11,-7],[33,-4],[38,5],[18,11],[18,18],[15,33],[15,62],[17,48],[10,9]],[[85659,74091],[68,-258],[64,-166],[56,-121],[79,-232],[23,-124],[2,-77],[13,-106],[-11,-60],[3,-96],[-5,-49],[-9,-36],[-1,-70],[3,-37],[1,-49],[6,-19],[9,-7],[14,18],[18,7],[-3,-59],[-22,-150],[-18,-109],[-25,-95],[-32,-87],[-38,-34],[-27,-13],[-51,-4],[-43,15],[-36,-11],[-15,-18],[-11,-31],[8,-48],[-1,-36],[-16,3],[-31,21],[-34,2],[-16,11],[-16,51],[-17,-2],[-29,-31],[-44,-6],[-15,-17],[-5,-21],[6,-26],[22,-35],[-7,-36],[-23,-18],[-19,44],[-12,43],[-13,2],[-20,-12],[-4,-46],[10,-32],[15,-36],[-22,-42],[-5,-30],[-16,-21],[-42,47],[6,34],[18,33],[3,34],[-6,20],[-61,-86],[-37,-96],[-19,7],[-9,25],[-11,10],[-40,-63],[-8,-49],[-14,-2],[-7,21],[0,45],[-7,37],[-41,56],[-19,48],[10,27],[34,-15],[28,2],[-6,23],[-9,11],[19,12],[15,27],[-13,7],[-19,-15],[-16,7],[-6,63],[-20,65],[-10,63],[19,36],[10,56],[18,81],[9,27],[25,19],[9,21],[-14,11],[-22,9],[1,24],[15,12],[16,26],[32,32],[10,59],[-9,15],[-20,14],[5,30],[8,23],[-3,14],[-24,38],[-16,36],[5,40],[-4,60],[2,51],[-1,28],[-11,62],[-5,63],[-16,-10],[-12,-15],[-44,22],[-14,1],[-5,47],[15,57],[38,50],[21,6],[16,22],[26,7],[30,-34],[27,-7],[15,-59],[9,-12],[2,22],[22,25],[5,19],[-4,11],[-25,10],[-23,73],[-3,32],[-9,20],[13,59],[-26,67],[-13,21],[2,59],[-14,39],[-8,21],[-4,36],[4,16],[12,6],[3,15]],[[85761,71888],[-27,-36],[-35,48],[-8,26],[26,39],[23,44],[15,3],[6,-124]],[[85573,71892],[-3,-56],[-20,-3],[-11,36],[-13,-17],[-6,-1],[-10,45],[-2,36],[23,26],[14,-16],[20,-8],[8,-42]],[[85064,71641],[-18,-9],[-10,20],[-7,6],[4,26],[29,51],[6,17],[27,-10],[10,-27],[-13,-42],[-28,-32]],[[85144,73580],[-2,-76],[-15,4],[-10,7],[-5,15],[-10,71],[11,29],[23,-23],[8,-27]],[[85208,71626],[5,-27],[-22,5],[-12,26],[1,23],[14,3],[14,-30]],[[85499,71782],[-3,-18],[-14,27],[14,30],[3,-39]],[[85115,72864],[-4,-38],[-18,25],[-5,82],[19,-24],[8,-45]],[[85047,71849],[-4,-14],[-12,4],[-12,40],[-5,31],[-13,18],[20,27],[25,-49],[1,-57]],[[86365,73432],[-13,-18],[-15,18],[-2,18],[8,15],[18,10],[9,-14],[-5,-29]],[[85090,70981],[-13,-13],[-11,8],[-3,6],[-14,33],[-4,17],[10,32],[38,53],[99,51],[18,2],[39,-21],[9,-42],[-7,-35],[-9,-24],[-46,-40],[-35,-19],[-71,-8]],[[58690,38938],[2,-30],[2,-14],[13,-80],[20,-119],[13,-111],[18,-151],[0,-84],[4,-33],[16,-41],[20,-70],[7,-39],[7,-30],[21,-56],[16,-85],[14,-113],[12,-54],[4,-27],[5,-49],[0,-102],[0,-118],[0,-133],[1,-109],[-2,-55],[1,-157],[-18,-82],[2,-64],[6,-42]],[[58920,36382],[24,4],[42,-17],[35,2],[31,2],[52,3],[30,0]],[[59134,36376],[-10,-133],[-40,-208],[-13,-95],[-34,-341],[-44,-172],[-25,-71],[-72,-126],[-20,-25],[-18,-17],[-31,-14],[-123,-254],[-46,-123],[-41,-178],[-40,-98],[-60,-210],[-53,-161],[-51,-147],[-88,-203],[-39,-59],[-27,-26],[-70,-118],[-99,-189],[-75,-168],[-113,-190],[-65,-84],[-99,-164],[-27,-24],[-111,-152],[-79,-93],[-129,-107],[-51,-30],[-122,28],[-51,-15],[-43,-65],[-4,-93],[-18,-14],[-27,4],[-85,39],[-46,-7],[-27,-50],[-22,-63],[-64,-3],[-115,65],[-135,40],[-31,4],[-65,-48],[-23,-7],[-95,10],[-53,31],[-51,0],[-38,-26],[-47,-8],[-127,-175],[-66,0],[-56,-21],[-28,1],[-53,24],[-19,-1],[-30,-11],[-30,-31],[-68,-13],[-26,-27],[-115,-159],[-26,6],[-22,11],[-59,1],[-68,86],[-26,-6],[7,26],[2,45],[-14,32],[-10,14],[-26,-3],[-14,39],[-41,3],[-14,-9],[-20,-2],[-1,39],[1,24],[-1,38],[-5,46],[-16,15],[-12,6],[-28,-3],[-20,-5],[-10,-14],[-10,-33],[0,-103],[-15,29],[-16,62],[-5,66],[6,78],[31,29],[-3,53],[-6,45],[-35,117],[-13,54],[-29,36],[-23,87],[-23,32],[-9,61],[-22,49],[-8,77],[12,44],[20,24],[20,-38],[24,15],[35,56],[21,85],[1,135],[-5,85],[-28,219],[-13,50],[-63,157],[-72,210],[-92,330],[-44,199],[-66,401],[-59,227],[-72,212],[-9,14]],[[54568,35358],[11,26],[39,49],[17,13],[10,-6],[9,13],[9,33],[2,31],[4,44],[9,27],[9,52],[16,34],[34,22],[26,-30],[11,-29],[5,-38],[11,-18],[18,1],[13,-24],[8,-48],[-2,-35],[-10,-22],[1,-28],[14,-35],[5,-34],[9,-45],[47,-25],[23,-15],[39,-5],[38,-20],[35,-34],[58,-9],[80,18],[66,-8],[52,-34],[38,-6],[24,21],[10,31],[-3,41],[11,25],[26,11],[21,31],[16,50],[37,40],[57,32],[29,-1],[0,81],[0,256],[0,256],[0,257],[0,256],[0,256],[0,256],[0,256],[0,242]],[[55550,37570],[13,-17],[88,-128],[24,-68],[11,-43],[38,-155],[28,-140],[23,-105],[2,-48],[3,-47],[4,-23],[-3,-25],[-16,-57],[-16,-44],[-20,-60],[-2,-79],[6,-93],[12,-46],[16,-15],[36,23],[23,-7],[32,-18],[107,11],[13,-6],[40,-6],[14,7],[12,20],[14,56],[12,18],[23,9],[27,15],[22,33],[35,110],[70,98],[22,23],[14,26],[11,36],[25,123],[19,103],[6,48],[17,79],[20,50],[19,27],[10,7],[26,13],[32,13],[34,-14],[37,-31],[42,-51],[42,-64],[20,-32],[21,-15],[37,-5],[25,1],[38,-63],[19,-4],[44,-19],[53,-20],[34,2],[36,34],[26,2],[33,-3],[37,10],[27,14],[21,30],[18,33],[21,97],[12,78],[19,89],[23,122],[8,85],[8,23],[33,26],[28,18],[74,33],[15,18],[14,40],[32,68],[40,57],[21,32],[37,275],[5,34],[27,73],[17,31],[11,0],[15,20],[20,37],[24,24],[28,9],[18,25],[8,41],[14,20],[21,-1],[11,13],[3,28],[12,24],[22,19],[11,23],[1,27],[26,66],[51,103],[47,58],[45,12],[42,21],[40,32],[30,49],[19,67],[32,38],[65,11]],[[57982,34503],[45,36],[21,23],[15,18],[19,28],[7,68],[5,58],[15,28],[15,19],[13,30],[15,72],[10,70],[2,29],[-6,30],[-10,31],[-9,43],[-12,6],[-23,24],[-33,48],[-29,42],[-27,61],[-11,9],[-26,42],[-12,23],[-8,28],[-7,10],[-12,-8],[-31,-12],[-66,-49],[-41,-46],[-35,-53],[-36,-21],[-26,-18],[-21,-61],[-20,-58],[-17,-51],[-10,-24],[-9,-15],[-10,-33],[-18,-55],[-18,-37],[-24,-20],[-31,-26],[-11,-15],[-1,-22],[11,-52],[11,-49],[17,-59],[13,-42],[20,-52],[12,-31],[-1,-51],[4,-18],[6,-21],[6,-6],[6,-7],[17,-15],[4,-10],[12,-17],[11,-32],[22,-44],[24,-33],[41,-14],[32,-10],[11,6],[11,27],[9,34],[3,43],[10,23],[39,111],[21,41],[13,2],[17,8],[21,4],[16,-4],[4,2],[25,14]],[[60515,24801],[-12,-11],[-56,10],[-6,22],[17,34],[9,14],[29,-7],[24,-28],[4,-9],[-9,-25]],[[61536,50866],[2,47],[-5,24],[-26,71],[-49,132],[-38,99],[-38,102],[0,82],[0,243],[-1,485],[-1,486],[-1,485],[0,243],[-1,99],[4,16],[44,89],[57,118],[76,224],[41,122],[34,101]],[[61634,54134],[9,31],[30,61],[56,37],[36,6],[121,46],[18,19],[11,21],[10,48],[23,68],[31,47],[58,61],[56,52],[13,8],[68,33],[17,11],[28,11],[10,1],[95,-12],[74,-9],[77,-9],[8,7],[53,121],[85,192],[54,123],[84,189],[64,137],[72,151],[69,139],[83,166],[52,105],[82,162],[77,155],[69,137]],[[63327,56449],[41,130],[40,127],[44,136],[52,165],[49,154],[40,126],[0,65],[0,140],[0,96],[0,265],[0,161],[0,155],[0,159]],[[63593,58328],[35,7],[90,41],[71,63],[130,45],[99,114],[17,55],[30,70],[43,23],[111,-82],[18,-6],[-7,-50],[-3,-50],[-23,-88],[-15,-98],[11,-149],[5,-242],[-3,-35],[-7,-34],[-3,-28],[-12,-9],[-5,-16],[9,-6],[34,26],[0,29],[2,14],[28,-32],[21,-13],[5,-31],[-1,-20],[-32,9],[-17,16],[-48,-26],[-29,-29],[-9,-47],[-7,-190],[-11,-123],[-3,-162],[-38,-108],[-14,-76],[-57,-152],[-31,-130],[-9,-64],[-51,-178],[-70,-137],[-25,-174],[-25,-110],[-28,-99],[-62,-177],[-31,-122],[-40,-213],[-12,-135],[-111,-391],[-115,-312],[-72,-263],[-129,-305],[-176,-393],[-230,-467],[-62,-95],[-252,-288],[-163,-241],[-83,-164],[-88,-143],[-69,-136],[-210,-460],[-22,-43],[-20,-41],[-27,-77],[-18,-31],[-50,-131],[-31,-69],[-36,-67],[-14,-47],[-11,-55],[-12,-31],[-31,-130],[-28,-86],[-28,-67]],[[63327,56449],[-95,0],[-92,0],[-91,0],[-16,17],[-77,53],[-97,67],[-120,84],[-85,59],[-92,62],[-92,63],[-73,50],[-90,61],[-79,54],[-11,13],[-44,82],[-57,107],[-11,2],[-27,23],[-25,58],[-25,74],[-23,93],[-11,63],[-31,26],[-15,50],[-28,74],[-20,36],[-7,31],[-9,65],[-17,70],[-15,44],[-4,19],[1,12],[29,95],[13,34],[15,33],[12,33],[4,23]],[[61922,58179],[35,112],[31,99],[24,77]],[[62012,58467],[54,-88],[53,-180],[62,-144],[85,-135],[33,-45],[30,-24],[155,4],[109,122],[100,89],[33,18],[58,-24],[64,-7],[57,-27],[29,7],[114,103],[71,101],[48,42],[20,1],[66,-36],[85,15],[117,87],[37,18],[28,1],[64,-39],[9,2]],[[94357,46942],[-13,-8],[-20,21],[-9,19],[4,30],[12,12],[13,-20],[1,-21],[12,-33]],[[96368,45123],[-24,-9],[-10,2],[-16,50],[12,11],[18,-4],[5,-29],[15,-21]],[[96147,45646],[-22,-10],[-7,3],[-17,-6],[-18,-41],[-13,6],[-10,-2],[-8,34],[0,17],[13,-3],[6,33],[14,17],[32,7],[28,-10],[10,-8],[-9,-30],[1,-7]],[[94604,45047],[-20,-20],[-17,10],[-14,15],[-11,44],[-23,28],[-34,11],[-14,19],[-3,10],[-24,8],[-6,24],[2,25],[3,13],[22,-12],[103,-117],[25,-36],[11,-22]],[[94873,46298],[4,-62],[-2,-21],[-21,45],[-10,-16],[-9,22],[1,46],[1,50],[-4,38],[-11,55],[12,-9],[39,-148]],[[94218,46587],[-4,-1],[-13,7],[-16,2],[-9,20],[11,29],[15,18],[6,-4],[7,-12],[14,-5],[2,-37],[-13,-17]],[[94490,46661],[16,-8],[8,1],[18,-31],[25,-46],[-10,-23],[-20,12],[-7,-5],[-2,3],[-4,23],[-22,23],[-19,2],[-3,27],[20,22]],[[93822,47095],[18,-47],[20,-105],[-4,-36],[-14,-3],[-4,-22],[-20,51],[-26,14],[-19,31],[-6,62],[-2,39],[-15,7],[-42,-10],[-14,-34],[-19,11],[-4,30],[3,29],[26,29],[5,38],[26,64],[15,11],[31,-23],[3,-92],[11,-30],[31,-14]],[[93944,46761],[-6,-2],[-7,23],[15,62],[8,-50],[4,-19],[-14,-14]],[[93918,46840],[-27,-45],[-20,15],[-17,39],[6,47],[3,13],[8,2],[8,10],[9,21],[29,-17],[8,-11],[-18,-29],[6,-9],[4,-14],[1,-22]],[[93718,46823],[0,-8],[-15,16],[-34,78],[6,26],[31,50],[10,7],[8,-31],[-7,-46],[-10,-12],[-5,-43],[16,-37]],[[93523,47279],[-5,-8],[-9,31],[-7,10],[0,34],[-28,57],[-2,39],[16,38],[22,-22],[22,-48],[25,-16],[-5,-32],[-23,-57],[-6,-26]],[[93500,47136],[-3,-15],[-15,71],[1,36],[3,23],[5,7],[12,-79],[-3,-43]],[[93658,47172],[-6,-9],[-30,4],[-23,59],[0,44],[18,40],[22,8],[12,-16],[11,-34],[4,-43],[-3,-38],[-5,-15]],[[93288,47754],[-28,-13],[-17,18],[7,44],[10,23],[35,-41],[-7,-31]],[[93789,46797],[0,-20],[-16,6],[-36,31],[-1,14],[20,5],[15,-4],[12,-18],[6,-14]],[[94374,46501],[61,-92],[27,8],[80,-2],[47,-66],[28,-30],[16,-59],[19,-14],[12,-30],[7,-55],[-5,-9],[-24,-20],[-18,-9],[-47,20],[-44,42],[-89,5],[-41,12],[-14,17],[-13,21],[-21,51],[-17,61],[-2,35],[-2,68],[5,24],[17,25],[18,-3]],[[94410,46927],[0,-14],[-37,48],[-28,59],[-81,64],[-17,33],[-15,4],[-41,54],[-41,36],[-25,47],[-6,19],[-15,11],[-25,51],[-25,34],[-9,62],[-24,43],[-6,19],[77,-35],[36,-68],[30,-38],[11,-28],[27,-38],[25,-4],[24,-38],[23,-10],[18,-20],[114,-172],[-14,-46],[15,-33],[9,-40]],[[93745,47620],[9,-20],[-21,-35],[-29,19],[-6,19],[0,11],[-20,-7],[-40,17],[-54,82],[-58,156],[-56,86],[-11,26],[-1,45],[8,17],[34,-19],[45,-71],[74,-73],[20,-38],[12,-90],[13,-27],[40,-69],[21,-16],[11,-3],[9,-10]],[[94652,47053],[69,-171],[-3,-31],[-9,-19],[-3,-58],[8,-22],[19,-10],[32,-62],[13,-75],[1,-23],[14,-34],[0,-72],[30,-100],[3,-48],[-3,-22],[-12,13],[-37,113],[-41,49],[-5,21],[-42,66],[-28,111],[-30,198],[14,47],[-34,96],[1,25],[15,-6],[10,2],[5,11],[13,1]],[[94920,45859],[35,-34],[20,6],[30,-23],[23,13],[15,-30],[36,-118],[0,-38],[24,-27],[-20,-5],[-28,14],[-22,-10],[-22,23],[-38,12],[-33,27],[-69,87],[0,43],[-11,21],[-3,54],[-25,17],[-29,3],[-2,26],[5,45],[21,-1],[26,-19],[50,-65],[12,-12],[5,-9]],[[56147,79726],[-6,-7],[-95,-32],[-13,5],[-13,18],[-7,14],[-5,9],[-8,26],[-11,19],[-16,15],[-15,17],[-19,1],[-52,-25],[-36,-2],[-23,8],[-32,15],[-62,2],[-43,-13],[-4,-18],[-39,-115],[-57,-43],[-50,-43],[-14,-9],[-25,14],[-28,25],[-23,14],[-17,-6],[-19,-29],[-8,-30],[-56,-22],[-98,-12],[-34,-29],[-11,-36],[-1,-26],[9,-23],[-11,-27],[-4,-11],[-69,-6],[-92,-8],[-55,2],[-52,2],[-35,23],[-43,45],[-45,59],[-5,2],[-6,6],[-29,4],[-7,-3]],[[54763,79496],[-17,19],[-5,25],[-27,66],[-30,109],[0,32],[11,35],[11,28],[1,21],[2,6]],[[54709,79837],[9,45],[21,60],[20,35],[15,11],[30,-10],[52,-9],[39,8],[37,27],[20,23],[18,25],[5,16],[8,7],[31,14],[9,17],[4,31],[3,35],[6,26],[8,19],[57,45],[5,16],[9,16],[17,17],[16,25],[17,15],[22,-1],[21,3],[16,9],[7,1]],[[55231,80363],[29,-8],[5,-28],[3,-30],[51,2],[28,64],[14,8],[24,22],[15,20],[10,-13],[16,-41],[16,-33],[9,-13],[1,-10],[10,-6],[18,-4],[12,-10],[4,-31],[0,-28],[-6,-20],[-3,-18],[13,-7],[19,7],[13,10],[39,-23],[14,51],[15,27],[21,12],[18,16],[17,11],[11,0],[5,4],[15,-1],[16,-5],[23,6],[31,-13],[20,-23],[19,-8],[22,1],[15,13],[22,45],[16,0],[24,7],[35,-1],[80,-9],[21,-18],[49,-22],[22,-25],[9,-31],[5,-21],[51,-32],[75,-42],[18,-5]],[[54587,78628],[-24,14],[-30,6],[-5,-7],[-12,-8],[-6,-14],[4,-55],[-7,-9],[-34,5],[-11,-6],[-18,-38],[-19,-16],[-23,-11],[-18,-14],[-22,-12],[-19,-7],[-8,-17],[-4,-18],[1,-18],[19,-35],[3,-37],[-2,-46],[-5,-24],[-7,-16],[-48,-21],[-49,-38],[-1,-8],[22,-34],[1,-8],[-18,-19],[-2,-19],[2,-22],[10,-22],[3,-21],[-27,-14],[-36,5],[-43,28],[-16,-4],[-14,-15],[-15,7],[-17,17],[-23,36],[-12,23],[-4,23],[-7,4],[-9,-7],[-8,-29],[-22,-51],[-16,-14],[-24,3],[-34,-1],[-21,-5],[-26,19],[-6,-4],[0,-12],[-10,-19],[-15,-12],[-74,28],[-10,23]],[[53771,78062],[17,11],[23,30]],[[53811,78103],[15,-4],[19,7],[9,12],[-13,38],[-30,47],[-16,17],[-22,12],[-4,13],[12,73],[-4,11],[-25,-4],[-6,8],[-2,13],[2,17],[17,29],[19,25],[5,14],[-1,11],[-24,12],[-15,11],[-11,4],[-8,-6],[-6,7],[-6,21],[6,32],[21,30],[24,26],[21,20],[11,8],[6,33]],[[53805,78640],[12,-3],[25,-2],[27,-8],[25,-9],[22,-12],[47,-12],[42,-7],[13,-7],[10,1],[13,-10],[8,7],[5,13],[23,16],[22,21],[14,26],[9,21],[14,14],[16,5],[14,7],[60,10],[62,-8],[30,14],[24,26],[35,7],[2,0],[53,-19],[4,11],[2,5],[-1,55],[17,25],[16,11]],[[54470,78838],[53,-4],[7,-17],[2,-26],[5,-35],[9,-10],[5,-14],[-1,-24],[10,-18],[24,-49],[3,-13]],[[78880,52610],[-42,-38],[-47,34],[15,57],[32,13],[25,-18],[14,-13],[10,-16],[-7,-19]],[[47143,56730],[-1,-17],[-8,-83],[-12,-71],[-8,-17],[-36,-19],[-15,-31],[-13,-101],[-8,-79],[-12,-13],[-52,-114],[-34,-43],[-24,-38],[-22,-48],[-28,-47],[-31,-80],[-21,-82],[-15,-26]],[[46803,55821],[-11,23],[-52,82],[-54,55],[-116,91],[-39,25],[2,33],[13,59],[-22,69],[9,51],[-9,0],[-16,-31],[-36,9],[-23,44],[-19,15],[-9,22],[-12,115],[-9,52],[-17,32],[-36,8],[-15,69],[-19,54],[3,34],[16,-2],[13,-24],[20,-10],[25,58],[23,32],[5,28],[-3,15],[-14,-24],[-37,6],[-9,-21],[-17,-7],[-13,69],[1,40],[5,45],[38,7],[3,14],[-26,10],[-33,52],[-6,35]],[[46307,57055],[16,12],[16,-5],[13,-8],[15,13],[14,20],[8,25],[11,67],[35,22],[21,41],[20,64],[9,45],[8,22],[6,19],[3,22],[9,19],[10,47],[6,44],[20,20],[42,19],[38,-32],[61,27],[3,41],[56,1],[66,0],[55,1],[19,-11],[7,-30],[18,-47],[19,-33],[23,-72],[28,-84],[29,-75],[19,-41],[2,-14],[-1,-17],[-10,-38],[-8,-42],[1,-15],[6,-8],[31,-13],[2,-46],[1,-64],[14,-60],[15,-44],[-1,-16],[-35,-75],[-13,-74],[-7,-21],[-3,-17],[7,-8],[9,5],[14,-6],[13,-2],[17,27],[28,68],[10,8],[21,-6]],[[46520,56126],[-4,-15],[-18,37],[-96,56],[27,29],[66,9],[20,-17],[9,-15],[3,-27],[-7,-57]],[[65427,49139],[1,-53],[-13,18],[-4,34],[-18,26],[-9,24],[20,29],[23,-78]],[[56306,77325],[-10,-10],[-11,-15],[-7,-26],[-1,-42],[-36,-33],[-14,-7],[-6,-21],[-9,-62],[1,-47],[5,-23],[2,-20],[12,-23],[10,-37],[7,-48],[16,-37],[39,-37],[20,-21],[14,-31],[11,-27],[33,-38],[-3,-26],[-7,-26],[-7,-12],[-16,-33],[-16,-19],[-26,-59],[-41,-3],[-10,-5],[-16,-16],[-7,-29],[7,-23],[-1,-24],[-7,-46],[10,-50],[14,-23],[2,-13],[-2,-23],[-22,-47],[-6,-17],[-22,-9]],[[56206,76217],[-7,4],[-11,17],[-11,4],[-26,-19],[-26,-11],[-21,9],[-20,1],[-14,-8],[-11,-3],[-21,-21],[-33,-14],[-16,3]],[[55989,76179],[-6,19],[-6,27],[3,13],[22,21],[3,21],[31,99],[6,32],[0,11],[-8,7],[-17,0],[-76,40],[4,46],[-22,25],[-24,22],[-4,25],[-27,50],[-19,28],[-25,14],[-22,21],[-12,12],[-6,23],[0,14],[-7,14],[-10,-2],[-17,-18],[-22,-16],[-4,-12],[8,-28],[6,-17],[-3,-17],[-7,-21],[-41,-47],[-5,-16],[8,-26],[-5,-13],[-34,-17]],[[55651,76513],[1,14],[-3,23],[-19,25],[-28,19],[-63,65],[-23,9],[-22,7],[-30,32],[-16,5],[-18,22],[-38,76],[-32,41],[-22,20],[-6,21],[-2,20],[1,7]],[[55331,76919],[17,30],[13,4],[16,1],[11,-15],[15,-3],[8,19],[4,27],[-2,35],[-35,82],[-29,57],[-4,12],[7,11],[10,5],[11,-4],[29,-4],[28,5],[9,14],[0,18],[-10,18],[-32,46],[-26,41],[-29,32],[-23,12],[-6,16],[-3,18],[3,31],[1,40],[5,25],[20,47],[19,51],[12,48],[6,45],[-2,13],[-10,9],[-21,10],[-29,-9],[-25,-16],[-10,-1]],[[55279,77689],[-3,20],[4,9],[8,-1],[6,-4],[7,9],[4,27],[-10,94],[18,9],[1,13],[1,12],[19,-16],[27,0],[24,3],[4,9],[-1,14],[-5,10],[-8,9],[-6,13],[-16,5],[-50,34],[-24,36],[0,39],[7,21],[9,7],[-2,7],[-29,18],[-10,24],[9,32],[-15,64],[-15,40],[15,17],[2,24],[1,14]],[[55251,78301],[6,0],[25,16],[8,13],[6,16],[5,4],[17,-17],[17,-2],[19,11],[15,15],[17,12],[8,8],[10,14],[21,39],[23,8],[30,-10],[34,-4],[25,9],[63,-11],[13,-9],[9,-10]],[[55622,78403],[17,-34],[16,-43],[22,-20],[26,-24],[13,-17],[20,-52],[16,-25],[5,1],[5,7],[4,5],[4,-5],[0,-16],[1,-34],[-3,-38],[5,-35],[0,-11],[-3,-10],[0,-9],[6,-9],[21,-23],[20,-36],[22,-26],[22,-16],[13,-1],[22,-29],[43,-21],[14,-7],[9,-12],[7,-14],[0,-14],[-6,-7],[-10,-20],[-3,-25],[-7,-6],[-7,0],[-5,-8],[1,-10],[6,-10],[9,-9],[17,-9],[17,-14],[0,-10],[-4,-11],[-21,-5],[-16,-2],[-8,-4],[1,-21],[45,-21],[21,-20],[10,-26],[29,-17],[47,-8],[33,-27],[18,-45],[30,11],[42,67],[41,17],[40,-32],[22,-26],[4,-20],[-10,-9],[-22,4],[-19,-13],[-14,-29],[-2,-31],[10,-33],[14,-23],[19,-13],[9,-17],[2,-22],[4,-6]],[[46588,60373],[26,-93],[-5,-44],[-6,-65],[15,-47],[17,-31],[12,-28],[14,-39],[2,-77],[-2,-56],[9,-26],[7,-32],[-1,-26],[-5,-24],[-17,-31],[-3,-58],[27,-71],[17,-38],[0,-22],[5,-24],[13,-28],[8,7],[8,23],[4,15],[24,-7],[11,-7],[14,-46],[6,-30],[4,-39],[15,-48],[14,-34],[2,-21],[13,-28],[-8,-64],[1,-32],[-8,-85],[-2,-41],[0,-15],[19,-30],[-2,-43]],[[46836,58988],[-19,8],[-32,5],[-65,-23],[-23,9],[-43,-3],[-30,-12],[-39,-28],[-30,7],[-16,22],[-21,-1],[-24,11],[-26,22],[-23,10],[-26,40],[-11,7],[-9,-11],[-7,-13],[-7,-8],[-14,7],[-5,27],[5,26],[1,19],[-7,11],[-15,4],[-25,-1],[-40,9],[-9,5],[-90,6]],[[46186,59143],[-93,1],[-79,1],[-100,1],[-70,0],[-66,1],[-50,-53],[-55,-56],[-73,-31],[-85,12],[-27,-9],[-28,-25],[-21,-18],[-29,-11],[-37,9],[-16,-6]],[[45357,58959],[-9,26],[-11,42],[7,31],[23,20],[34,26],[19,-14],[10,0],[2,16],[-3,9],[-26,22],[-14,30],[-11,-17],[-10,-37],[-8,-10],[-12,-11],[-6,25],[-3,24],[5,19],[-2,104],[3,55],[-2,49]],[[45343,59368],[16,32],[16,20],[60,2],[57,1],[54,-1],[55,-1],[6,97],[17,8],[26,10],[49,12],[54,11],[12,19],[9,33],[6,28],[11,13],[15,-10],[20,-15],[21,-24],[23,-21],[16,-14],[38,-34],[65,-48],[53,-19],[65,35],[46,22],[6,42],[-7,41],[-35,37],[-47,-4],[-15,-10],[-22,-13],[-13,-4],[-22,8],[-28,33],[-18,32],[-25,15],[-29,16],[-47,66],[-25,12],[-23,4],[-45,-13],[-44,-36],[-23,-81],[-43,1],[-93,3],[-86,2],[-70,-6]],[[45399,59669],[-7,59],[-17,47],[-27,40],[-6,37],[9,33],[26,26],[6,19],[-13,-2],[-21,-18],[-14,0],[-1,51],[-23,66],[-26,112],[-30,46],[-24,91],[-26,35],[-24,16],[-20,-3],[-7,-42],[-25,60],[34,21],[73,75],[85,215],[76,253],[9,60]],[[45406,60966],[10,46],[6,103],[11,62],[10,12],[13,47],[15,83],[18,46],[19,9],[16,-4],[11,-17],[31,-10],[53,-4],[41,12],[29,29],[38,14],[47,1],[25,12],[3,24],[6,7],[10,-10],[9,4],[8,17],[9,1],[9,-14],[39,-5],[70,6],[65,-44],[60,-93],[31,-62],[1,-31],[10,-31],[18,-31],[16,-6],[15,20],[12,-3],[8,-24],[17,-5],[19,15],[14,-5],[2,-14],[3,-8],[9,-3],[13,-19],[17,-49],[14,-69],[11,-88],[14,-48],[18,-8],[10,-18],[2,-22],[5,-14],[9,-8],[15,5],[18,-30],[19,-65],[3,-29],[-3,-16],[1,-11],[12,-11],[12,-21],[10,-32],[21,-29],[32,-24],[23,-37],[15,-50],[29,-41],[6,-5]],[[60250,66464],[-7,0],[-20,39],[-11,29],[-12,19],[-53,39],[-8,25],[9,25],[5,-25],[10,-14],[44,-36],[49,-76],[9,-7],[-15,-18]],[[61663,61471],[21,-3],[-9,19],[-2,9],[10,26],[30,-55],[-1,-64],[-2,-15],[-8,14],[-6,13],[-2,15],[-8,16],[-30,-10],[-18,17],[-27,55],[-7,39],[11,8],[12,19],[7,31],[-7,32],[16,-5],[9,-33],[1,-75],[3,-16],[-5,-17],[12,-20]],[[61888,61273],[-3,46],[-16,68],[-1,49],[-8,48],[-14,37],[-26,38],[-3,53],[-19,52],[-25,42],[-15,77],[-10,103],[-67,135],[-84,124],[-26,71],[-42,143],[-21,113],[-56,130],[-2,50],[-9,61],[-13,68],[-7,54],[-57,235],[-18,37],[-16,53],[-4,40],[-5,22],[-39,39],[-38,99],[-111,157],[-55,15],[-43,56],[-32,74],[-34,126],[-60,136],[-50,194],[16,71],[-1,49],[-16,84],[-17,64],[-12,61],[10,88],[3,98],[10,52],[7,57],[-9,115],[-17,61],[2,41],[-19,20],[-16,45],[16,-1],[-29,62],[-11,34],[-11,84],[-14,64],[-45,146],[-22,89],[-49,114],[-53,85],[-33,38],[-16,35],[-28,2],[-30,50],[-21,1],[-26,8],[-31,97],[-26,90],[-44,118],[11,31],[13,50],[-6,65],[-7,44],[-19,81],[-64,202],[-17,29],[-27,34],[-16,88],[-8,78],[-44,38],[-74,282],[-44,99],[-17,66],[-50,109],[-24,109],[-51,100],[-44,173],[-67,174],[-29,30],[-69,12],[-30,13],[-27,-38],[-2,48],[19,67],[26,140],[6,123],[42,364]],[[59708,68751],[59,-18],[49,-16],[71,-23],[74,-23],[43,-14],[14,6],[60,89],[54,81],[32,98],[31,96],[14,20],[48,17],[76,29],[75,28],[5,9],[18,77],[22,97],[5,10],[5,10],[54,55],[32,33],[-46,97],[-44,92],[-49,103],[-41,80],[-63,120],[-40,79],[71,37],[77,40],[78,41],[94,49],[73,38],[110,57],[53,28],[10,7],[41,68]],[[60873,70348],[62,-19],[93,-29],[90,-27],[95,-32],[31,-27],[91,-96],[60,-63],[69,-74],[87,-91],[59,-63],[77,-81],[59,-92],[76,-117],[82,-128],[68,-100],[94,-137],[93,-135],[90,-133],[73,-106],[91,-134],[8,-5],[92,-15],[125,-21],[125,-20],[113,-19],[49,19]],[[62925,68603],[53,-12],[72,-17],[43,-11],[82,-21],[25,-88],[9,-61],[8,-60],[24,-54],[56,1],[49,1],[61,2],[49,1]],[[63456,68284],[15,-54],[7,-54],[29,-128],[41,-100],[9,-36],[7,-55],[-7,-21],[-3,-23],[30,-55],[51,-46],[19,-12],[22,-21],[-17,-31],[30,-74],[34,-74],[37,-17],[50,-113],[74,-73],[46,-96],[-4,-2],[-14,10],[-16,13],[-5,-12],[0,-40],[5,-47],[23,-41],[21,-29],[8,-56],[-17,-120],[-5,1],[-11,10],[-12,2],[-6,-7],[14,-86],[13,-66],[17,-52],[14,-77],[11,-32],[49,-82],[14,-68],[14,-127],[30,-70],[17,-55],[22,-46]],[[64112,66122],[14,-63],[20,-49],[11,-12],[15,-5],[20,0],[23,12],[25,12]],[[64240,66017],[20,-24],[20,3],[2,-23],[-13,-31],[-17,-78],[24,-13],[22,-6],[17,-13],[9,0]],[[65329,64921],[20,-65],[17,-54],[23,-75],[25,-79],[24,-75],[17,-57],[-9,-58],[-10,-64],[-10,-63],[-11,-64],[-10,-64],[-10,-64],[-10,-64],[-10,-63],[-11,-64],[-10,-64],[-10,-64],[-10,-63],[-10,-64],[-10,-64],[-11,-64],[-10,-63],[-10,-64],[-12,-77],[-30,-20],[-47,-33],[-48,-33],[-48,-33],[-48,-34],[-48,-33],[-47,-33],[-48,-33],[-48,-33],[-48,-33],[-48,-33],[-47,-33],[-48,-33],[-48,-33],[-48,-33],[-47,-33],[-48,-33],[-39,-27]],[[60165,66654],[-3,-8],[-12,21],[1,44],[10,25],[-1,-34],[5,-35],[0,-13]],[[52062,52746],[-11,-15],[-12,12],[-3,23],[16,44],[7,11],[6,-9],[4,-12],[1,-18],[-8,-36]],[[51849,51912],[-28,-42],[-10,11],[-7,29],[-8,64],[3,30],[13,35],[28,34],[17,3],[17,-46],[0,-47],[-25,-71]],[[53468,77131],[-17,-4],[-8,24],[12,27],[18,4],[3,-21],[-8,-30]],[[2130,44086],[31,-54],[12,-72],[-13,-69],[-30,17],[-42,-15],[-15,5],[-34,85],[-23,38],[-10,35],[30,-4],[44,24],[50,10]],[[2374,43751],[-76,0],[-38,26],[-13,0],[-33,55],[-5,28],[17,19],[36,10],[70,-41],[11,-37],[16,-4],[13,-16],[3,-26],[-1,-14]],[[33007,59422],[-8,-9],[-21,39],[3,45],[12,25],[12,14],[12,2],[4,-38],[-3,-52],[-11,-26]],[[32992,59328],[-4,-6],[2,0],[-2,-5],[-1,5],[-3,2],[-2,1],[-4,0],[0,5],[4,-3],[7,3],[0,4],[-2,4],[-1,3],[2,5],[8,10],[3,5],[1,-2],[0,-2],[0,-2],[1,-2],[-4,-8],[-5,-17]],[[32962,59156],[-2,-1],[-3,2],[1,2],[3,1],[1,4],[0,5],[0,6],[2,3],[2,1],[1,-2],[1,-6],[-2,-4],[-1,-3],[-1,-5],[-2,-3]],[[33084,59805],[-15,-61],[-31,38],[-3,48],[3,29],[18,54],[15,36],[10,12],[6,-47],[-3,-109]],[[32630,61705],[-14,-12],[-12,17],[3,40],[11,1],[11,-18],[1,-28]],[[32602,61773],[-7,-8],[-13,35],[-20,10],[-18,21],[0,4],[0,11],[4,12],[9,9],[22,-28],[11,-36],[10,-17],[2,-13]],[[58487,50460],[-7,3],[-13,11],[-21,36],[-38,-20],[-10,1],[-14,-18],[-12,-21],[-7,-1],[-7,3],[-33,42],[-12,-1],[-5,-120],[-5,-67],[-7,-30],[-23,-29],[-24,-16],[-13,1],[-52,-9],[-21,0],[-11,10],[-15,68],[-27,30],[-27,14],[-10,-4],[-10,-35],[-4,-32]],[[58059,50276],[-26,22],[-7,27],[-1,46],[-10,62],[6,27],[10,17],[21,33],[33,46],[7,22],[4,37],[-2,84],[-3,72],[4,26],[15,55],[19,57],[24,59],[14,6],[18,23],[19,34],[11,12]],[[90522,76877],[4,-3],[5,0],[5,1],[2,-6],[1,-11],[-3,-1],[-7,-2],[-4,-1],[-2,8],[-1,6],[-4,4],[0,4],[4,1]],[[90654,76972],[-7,-3],[-12,3],[-4,3],[2,5],[8,8],[6,-3],[5,-2],[2,-11]],[[90567,76848],[-3,-1],[-2,7],[6,8],[11,9],[4,-5],[-4,-7],[-5,-4],[-7,-7]],[[88104,83582],[-34,-100],[-24,-1],[-18,21],[-39,-8],[-14,5],[23,31],[55,48],[23,-1],[22,10],[6,-5]],[[91830,85840],[-22,-7],[-11,16],[-1,11],[34,25],[21,36],[13,-22],[4,-15],[-38,-44]],[[83405,93945],[-70,-26],[-60,0],[-42,46],[33,18],[57,7],[31,-6],[44,-29],[7,-10]],[[84594,94383],[-17,-1],[-32,15],[-8,21],[0,10],[26,8],[33,-5],[25,-19],[4,-7],[-31,-22]],[[79519,96892],[-33,-4],[-36,12],[10,26],[81,4],[30,39],[51,-2],[14,-11],[8,-13],[-1,-17],[-11,0],[-48,-2],[-9,-9],[-56,-23]],[[79837,96337],[-32,0],[-9,27],[27,33],[34,0],[29,-10],[10,-5],[10,-12],[4,-18],[-73,-15]],[[77107,95967],[-15,-9],[-29,4],[-24,22],[-9,35],[20,9],[57,-61]],[[76903,95736],[-15,-6],[-13,4],[-4,7],[1,29],[25,38],[1,12],[12,6],[31,-7],[15,-16],[2,-7],[-21,-38],[-34,-22]],[[77815,97703],[-61,-7],[7,40],[4,11],[31,6],[20,-10],[44,-7],[-45,-33]],[[71320,94150],[-26,-4],[-118,22],[-43,27],[16,18],[31,0],[140,-63]],[[72974,94522],[-27,-20],[-37,11],[-27,13],[-14,19],[14,10],[40,7],[24,-7],[21,-22],[6,-11]],[[73543,94734],[-13,-34],[-78,17],[-11,14],[42,21],[38,12],[54,2],[-32,-32]],[[74070,95035],[23,-11],[73,17],[14,-6],[20,-24],[-31,-45],[-23,-18],[-66,10],[-83,1],[-37,25],[20,26],[48,16],[28,15],[14,-6]],[[66475,98677],[-60,-7],[-105,12],[-30,14],[7,13],[68,18],[54,4],[57,-19],[26,-23],[-17,-12]],[[86301,76210],[-8,15],[-2,26],[-9,25],[-18,34],[-7,35]],[[86257,76345],[16,18],[-3,32],[-15,30],[-23,6],[-5,8],[1,16],[8,16],[11,14],[24,19],[40,14],[22,12],[19,3],[20,-6],[18,18],[17,11],[4,31],[1,47],[6,14],[8,20],[11,26],[10,67],[8,46],[5,23],[1,32],[-5,20],[-10,13],[-7,8],[-1,36],[1,48],[-3,31],[11,172],[12,39],[-36,229],[-11,73],[-7,37],[-16,54],[-10,27],[4,26],[14,25],[14,12],[40,6],[12,9],[49,28],[11,17],[26,40],[10,31],[11,40],[24,21],[15,36],[16,13],[16,-31],[19,-17],[25,-11],[31,-13],[51,-25],[51,-21],[33,-17],[16,-7],[32,-12],[14,-8],[13,-10],[21,26],[28,33],[-5,51],[5,58],[20,100],[23,29],[12,5],[12,11],[23,19],[8,26],[-5,31],[8,31],[2,30],[8,39],[11,11],[15,13],[12,20],[10,31],[7,35],[-3,41],[14,26],[23,22],[8,14],[4,35],[1,16],[6,18],[-4,36],[-6,40],[26,66],[18,57],[4,84],[2,13],[7,40],[4,16],[14,52],[19,34],[-4,38],[-7,37],[1,25],[16,29],[10,15],[8,21],[14,9],[12,5],[28,5],[16,22],[15,22],[28,58],[9,35],[6,17],[-15,50],[-13,42],[-16,58],[-7,27],[11,35],[11,22],[6,19],[3,33],[-4,25],[-28,39],[-30,19],[-34,8],[-11,2],[-24,-7],[-101,-50],[-48,-38],[-27,-43],[-29,-21],[-47,3],[-43,2],[-35,-24],[-40,-49],[-29,-22],[-18,4],[-19,-33],[-21,-70],[-24,-31],[-27,9],[-64,-7],[-101,-22],[-63,1],[-26,24],[-40,3],[-55,-18],[-33,-3],[-12,10],[-8,29],[-4,48],[-19,50],[-32,51],[-6,63],[21,73],[5,50],[-12,27],[-4,24],[-25,31],[-17,52],[-12,16],[3,45],[15,54],[-18,50],[-55,3],[-44,15],[-44,46],[-68,131],[-34,46],[-22,5],[-16,21],[-10,37],[-16,1],[-16,0],[-9,-16],[-11,-5],[-18,15],[-17,1],[-18,-11],[-15,7],[-13,26],[-23,17],[-33,9],[-13,17],[5,28],[-6,20],[-18,13],[-49,-3],[-80,-20],[-66,5],[-52,31],[-29,28],[-5,26],[-15,25],[-24,24],[-14,42],[-2,58],[5,56],[22,79],[-54,51],[-16,30],[3,25],[-2,20],[-10,15],[1,23],[10,32],[0,41],[-11,50],[-30,70],[-49,90],[-27,66],[-4,42],[-6,33],[-10,18],[-5,31],[4,34],[-6,22],[-7,21],[1,33],[-9,22],[-18,13],[-6,25],[4,53],[-13,46],[-40,83],[-12,61],[-3,54],[-17,27],[-1,24],[-2,42],[-11,11],[-6,15],[5,17],[-8,22],[-21,26],[-9,22],[-3,21],[-10,15],[-31,16],[-8,21],[2,19],[6,17],[4,11],[-1,14],[-2,13],[-13,17],[-17,19],[-19,41],[-25,11],[-15,0],[-14,23],[5,14],[-1,28],[-12,22],[-15,9],[-14,-6],[-34,21],[-55,47],[-42,22],[-29,-4],[-18,-14],[-6,-25],[-20,3],[-48,44],[-48,11],[-27,24],[-21,40],[-20,17],[-19,-7],[-44,27],[-70,61],[-37,20],[-14,-11],[-7,0],[-12,2],[-18,0],[-32,15],[-43,-7],[-55,-27],[-59,-17],[-64,-6],[-37,3],[-12,13],[-69,-19],[-96,-40],[-94,-38],[-117,-19],[-78,-64],[-78,-118],[-57,-74],[-34,-30],[-14,-40],[6,-49],[29,-17],[53,14],[44,-7],[38,-28],[12,-42],[-14,-56],[4,-56],[22,-54],[2,-63],[-19,-71],[-48,-72],[-76,-72],[-47,-71],[-28,-102],[-42,-90],[-16,-50],[-3,-41],[-17,-45],[-31,-48],[-17,-48],[-3,-49],[-15,-44],[-29,-39],[-17,-42],[-7,-45],[-11,-29],[-15,-16],[8,-15],[30,-15],[13,-43],[-6,-71],[-18,-51],[-31,-31],[-47,-20],[-62,-9],[-85,-68],[-73,-88],[-87,-103],[-17,0],[-32,13],[-61,42],[-65,9],[-62,40],[-37,25],[-57,50]],[[82411,80543],[-14,31],[-22,25],[-56,33],[-37,18],[-23,1],[-58,-34],[-36,-27],[-22,-14],[-36,3],[-44,6],[-18,9],[-25,21],[-49,64],[-26,45],[-35,26],[-38,29],[-19,7],[-33,-2],[-47,8],[-25,10],[-21,-9],[-42,-31],[-52,-59],[-41,-23],[-44,-32],[-36,-37],[-35,-39],[-43,-44],[-20,-61],[-10,-44],[-40,-27],[-30,-26],[-30,-9],[-56,14],[-33,-10],[-83,-52],[-40,-5],[-28,-7],[-27,-3],[-45,-13],[-17,-9],[-23,-10],[-26,7],[-37,-29],[-104,-80],[-33,-13],[-22,-3],[-28,28],[-28,19],[-30,-2],[-34,-26],[-57,20],[-68,19],[-61,18],[-21,15],[-60,22],[-88,1],[-52,0],[-33,-8],[-26,11],[-32,32],[-54,74],[-32,21],[-17,19],[-7,30],[-12,4],[-8,21],[0,29],[-1,62],[4,44],[-9,13],[-36,7],[-43,14],[-79,2],[-32,1],[-25,25],[-28,31],[-28,64],[-24,29],[-40,37],[-38,10],[-57,-7],[-42,-7],[-37,16],[-24,20],[-34,22],[-51,5],[-42,16],[-44,18],[-32,-7],[-22,-18],[-26,-23],[-33,-4],[-81,-24],[-24,-14],[-36,-6],[-32,-18],[-26,-35],[-22,-26],[-28,-9],[-33,2],[-29,8],[-15,3],[-22,-13],[-25,-9],[-38,15],[-21,13],[-32,8],[-20,37],[-20,15],[-34,6],[-50,18],[-26,20],[-23,11],[-38,43],[-21,37],[-17,6],[-20,5],[-13,23],[-1,29],[5,18],[3,30],[-11,29],[-11,13],[-6,22],[3,42],[-4,42],[-4,44],[-12,32],[-3,63],[5,26],[-1,30],[-12,23],[-37,17],[-44,22],[-70,27],[-29,2],[-23,-11],[-22,13],[-22,22],[-39,23],[-50,30],[-54,33],[-48,29],[-19,8],[-66,2],[-54,4],[-32,11],[-37,41],[-19,26],[-30,12],[-22,4],[-35,13],[-64,44],[-23,21],[-16,0],[-21,38],[-18,9],[-13,-27],[-13,-65],[-11,-30],[-34,-60],[-80,-48],[-13,-25],[-8,-23],[-11,-32],[-4,-42],[-10,-12],[-23,-1],[-18,-19],[-14,-42],[-11,-17],[-7,-39],[1,-17],[-2,-19],[-2,-30],[-21,-66],[-3,-38],[8,-24],[18,-33],[9,-18],[3,-22],[0,-28],[11,-38],[8,-33],[13,-24],[19,-20],[21,-7],[16,-13],[4,-27],[-5,-37],[-7,-69],[-14,-43],[-8,-28],[-14,-42],[-5,-17],[-27,-36],[-19,-10],[-23,-29],[-19,-2],[-18,1],[-19,-7],[-18,-13],[-13,-39],[-34,-40],[-16,-19],[-42,-6],[-20,18],[-11,25],[-14,14],[-17,31],[-76,16],[-20,-7],[-12,-12],[-15,9],[-11,15],[-11,-5],[-23,-8],[-19,2],[-23,31],[-33,16],[-13,10],[-13,0],[-8,-15],[-15,-8],[-10,18],[-13,13],[-18,0],[-22,-27],[-39,-13],[-13,-19],[-22,3],[-16,15],[-15,1],[-46,0],[-15,-5],[-19,15],[-8,27],[-23,21],[-33,2],[-26,-3],[-12,-8],[-17,-3],[-14,37],[-19,26],[-10,19],[-16,8],[-13,24],[-2,47],[-8,59],[-9,61],[-10,26],[-49,9],[-23,-2],[-54,5],[-38,4],[-10,1],[-34,7],[-32,6],[-32,4],[-14,-5],[-33,-2],[-26,29],[-11,34],[-2,19],[-6,19],[-23,6],[-22,-6],[-11,-39],[-16,-16],[-15,3],[-13,21],[-26,23],[-17,22],[-20,35],[-16,-8],[-5,-22],[-3,-21],[-21,-43],[-24,-5],[-41,3],[-43,-2],[-27,-16],[-20,-29],[-10,-23],[-21,-8],[-21,-23],[-9,-31],[-20,1],[-11,-4],[-19,-6],[-48,-17],[-11,-4],[-29,-30],[-22,-23],[-21,-10],[-13,-27],[-17,-21],[-38,-6],[-42,-26],[-15,-9],[-24,-20],[-34,-8],[-14,-6],[-13,-14],[-8,-49],[-28,-17],[-37,-3],[-28,-26],[-2,-46],[9,-42],[-4,-19],[-21,-11],[-29,-22],[-22,-28],[-26,-1],[-16,10],[-11,-18],[-7,-37],[-19,-18],[-28,-16],[-11,6],[-7,14],[-12,18],[-10,-7],[-1,-26],[-8,-19],[-24,-2],[-18,11],[-13,12],[-25,-2],[-26,-5],[-16,6],[-15,-6],[-41,-12],[-16,-41],[0,-48],[-5,-24],[-24,-21],[-12,-19],[-14,-13],[-33,-1],[-1,0]],[[74392,80162],[-14,2],[-26,-11],[-26,-8],[-17,-6],[-11,-18],[-16,-8],[-26,5]],[[74256,80118],[-8,35],[-17,40],[-24,14],[-21,8],[-20,19],[-13,20],[-39,95],[-27,41],[-25,3],[-3,27],[14,27],[18,22],[0,31],[-15,16],[-18,-5],[-25,-35],[-29,-40],[-35,-29],[-14,-24],[-17,-27],[-24,4],[-18,-2],[-15,-2],[-11,29],[-15,4],[-106,28],[-35,11],[-23,-14],[-16,9],[-6,28],[-21,50],[-16,41],[-21,41],[-8,33],[7,34],[-3,30],[-18,15],[-23,2],[-65,64],[-30,9],[-27,12],[-22,0],[-18,28],[-17,86],[-6,48],[-21,49],[-27,41],[-16,57],[-23,25],[-40,39],[-38,28],[-62,34],[-23,0],[-32,-3],[-18,-16],[-21,-37],[-28,-2],[-44,0],[-11,-14],[-7,-25],[-23,-31],[-33,-25],[-46,8],[-32,-13],[-32,-5],[-45,32],[-51,-1],[-33,-15],[-46,1],[-10,18],[6,30],[-4,27],[-8,22],[-6,27],[-19,6],[-54,-11],[-15,12],[2,27],[9,33],[8,43],[-3,26],[-28,-4],[-17,3],[-9,30],[-16,23],[-18,1],[-21,5],[-24,-9],[-12,-30],[-16,-5],[-16,-8],[-12,-11],[-7,-27],[3,-25],[5,-55],[-8,-29],[-22,-16],[-20,3],[-14,-7],[-26,-31],[-12,-11],[-3,-19],[-2,-28],[-22,10],[-35,104],[-40,118],[-45,125],[-24,67],[-89,216],[-43,103],[-76,178],[-68,162],[-77,168],[-46,95],[-48,101],[-17,27],[-26,36],[-65,69],[-94,99],[-87,87],[-68,69],[-17,30],[-8,17],[-7,18],[-10,34],[0,22],[64,-4],[14,22],[24,80],[13,69],[-22,-3],[-40,-28],[-21,-21],[-12,-9],[-64,-14],[-35,-31],[-72,-52],[-52,-30],[-10,-5],[-61,-10],[-11,-12],[-1,-27],[-5,-30],[-43,-44],[-47,-38],[-17,-5],[-29,9],[-14,-5],[-43,-41],[-64,-62],[-6,-25],[0,-30],[-7,-27],[-14,-10],[-21,24],[-19,28],[-39,20],[-58,5],[-36,-10],[-24,-16],[-48,-61],[-18,-13],[-10,4],[-2,30],[-10,21],[-12,32],[6,63],[26,60],[43,33],[35,35],[10,38],[-1,27],[-13,12],[-13,2],[-8,-13],[-23,-26],[-35,-21],[-29,-4],[-13,1],[-31,13],[-57,73],[-48,10],[-33,6],[-11,-7],[-5,-18],[3,-20],[7,-19],[-4,-16],[-15,-11],[-24,-20],[-11,13],[-6,51],[1,40],[-16,34],[-17,52],[-23,31],[-22,-10],[-11,-44],[-17,-15],[-33,9],[-58,-25],[-95,-11],[-68,31],[-11,28],[28,59],[2,53],[0,48],[7,35],[-16,66],[-38,136],[-22,102],[-34,77],[-14,25],[-70,-13],[-19,-17],[-13,-23],[-22,-17],[-31,-12],[-26,8],[-29,13],[-31,27],[-36,36],[-69,28],[-68,9],[-75,10],[-38,-18],[-36,-29],[-52,-59],[-24,-6],[-38,-5],[-27,-15],[6,-26],[5,-36],[-10,-29],[-15,-15],[-22,-10],[-37,-3],[-31,-6],[-38,-41],[-58,-10],[-63,-15],[-44,-23],[-96,-29],[-55,-13],[-93,-28],[-74,-5],[-11,20],[-58,-43],[-64,3],[-11,-18],[-16,-16],[-17,-8],[-22,-20],[-13,-43],[-9,-45],[-20,-13],[-25,16],[-19,16],[-33,-16],[-44,-10],[-35,6],[-18,13],[-73,-21],[-37,-26],[-8,-13],[-9,-8],[-43,-17],[-35,5],[-6,-1],[-33,-13],[-47,-22],[-33,-7],[-29,0],[-18,-18],[-14,-20],[-123,-21],[-12,-14],[-25,-18],[-127,-6],[-11,-13],[-4,-15],[-16,-4],[-92,28],[-74,31],[-28,-17],[-24,-32],[-9,-47],[0,-40],[0,-34],[-11,-25],[-24,-31],[-2,-20],[33,-23],[42,-18],[24,8],[21,13],[17,-4],[13,-15],[4,-18],[-2,-13],[-8,-9],[-27,-17],[-25,6],[-23,-12],[-12,-22],[-6,-40],[10,-29],[31,-7],[35,-21],[39,-9],[23,3],[30,-31],[69,-38],[18,-29],[1,-30],[-13,-23],[-18,-13],[-23,7],[-47,8],[-52,5],[-37,10],[-54,-4],[-44,-9],[-11,-23],[-18,-42],[-14,-23],[-25,-44],[-8,-39],[13,-61],[44,-101],[4,-33],[-16,-33],[-30,-27],[-44,-48],[-47,-2],[-21,-12],[-53,-58],[-47,-28],[-10,-25],[11,-25],[59,-32],[30,-35],[8,-40],[13,-30],[46,-20],[95,-46],[6,-5],[6,-21],[97,-29],[13,-16],[40,-52],[8,-54],[-20,-54],[-13,-84],[-21,-75],[-45,-49],[-79,-46],[-85,-18],[-36,3],[-23,6],[-38,14],[-28,38],[-21,37],[-15,9],[-15,-6],[-13,-23],[-19,-63],[-21,-62],[-17,-22],[-63,-30],[-7,11],[7,41],[-8,13],[-12,9],[-78,16],[-30,11],[-22,5],[-28,10],[-19,25],[-42,76],[-32,59],[-53,53],[-47,11],[-4,-6],[-36,-2],[-57,13],[-3,-1],[-18,-25],[-13,-38],[-18,-32],[-26,-17],[-32,-4],[-37,34],[-37,51],[-46,17],[-45,-11],[-17,-8],[-47,-30],[-15,14],[-21,9],[-46,-48],[-50,-53],[-11,-39],[-15,-37],[-34,-34],[-36,-30],[-31,-11],[-40,11],[-51,37],[-46,45],[-50,72],[-41,42],[-39,32],[-23,8],[-19,-12],[-8,-26],[5,-20],[12,-18],[9,-57],[3,-69],[-4,-40],[-11,-23],[-11,-9],[-11,3],[-13,25],[-7,52],[-7,61],[-34,77],[-30,47],[-14,26],[-27,43],[-24,26],[-50,31],[-24,22],[-43,85],[-24,26],[-31,21],[-25,7],[-5,-5],[-53,-12],[-37,1],[-23,16],[-24,2],[-2,0],[-26,-10],[-5,0],[-13,1],[-20,17],[-21,48],[-25,50],[-31,16],[-59,-21],[-65,-68],[-46,-41],[-37,-1],[-22,-6],[-14,2],[-12,13],[-3,25],[-6,31],[-30,30],[-40,20],[-38,22],[-24,6],[-11,-32],[-31,-49],[-35,-48],[-45,-79],[-13,-27],[-17,-19],[-40,-20],[-48,-33],[-30,-38],[-43,-17],[-47,-10],[-21,-33],[-12,-53],[-16,-48],[-73,-72],[-40,-47],[-30,-25],[-20,3],[-22,7],[-9,-4],[12,-36],[9,-113],[14,-72],[10,-41],[9,-33],[7,-50],[-9,-29],[-14,-20],[-45,-31],[-46,-26],[-27,17],[-31,42],[-12,22],[-33,71],[-59,109],[-40,55],[-30,21],[-26,-7],[-21,-25],[-15,-23],[-13,-26],[-9,-32],[1,-45],[-1,-47],[-13,-33],[-33,-36],[-38,-49],[-29,-90],[-18,-112],[-6,-78],[14,-37],[28,-29],[18,-30],[4,-29],[-5,-30],[-15,-35],[-30,-39],[-42,-95],[-26,-133],[15,-93],[53,-51],[42,-23],[17,-30],[15,-60],[-2,-62],[-5,-42],[10,-41],[20,-48],[25,-30],[27,16],[26,20],[33,-8],[93,-16],[48,-9],[16,-21],[30,-69],[38,-77],[39,-78],[14,-34],[31,-93],[33,-84],[35,-104],[-2,-28],[-19,-11],[-30,2],[-23,16],[-13,12],[-11,4],[-13,-5],[-11,-13],[-5,-20],[2,-28],[9,-26],[12,-16],[7,-6],[46,-34],[51,-38],[63,-54],[13,-7]],[[63675,78534],[4,-26],[-34,-5],[-4,-31],[-8,-23],[-75,-51],[-19,0],[-16,-8],[1,-33],[4,-30],[13,-32],[-6,-14],[-11,-5],[-14,10],[-14,17],[-14,4],[-14,-4],[-64,-91],[-27,-23],[-30,-9],[-61,-34],[-19,2],[-17,12],[-15,-17],[-4,-42],[-17,29],[-18,23],[-8,7],[-4,-4],[17,-45],[1,-41],[-4,-23],[-7,-21],[-10,-12],[-11,-7],[-6,-73],[-12,-44],[-15,-40],[-21,-72],[-16,-31],[-13,-37],[-9,-51],[-12,12],[-10,22],[-6,-29],[-7,-25],[-32,-37],[-24,-36],[-11,-55],[-2,-33],[3,-30],[9,-17],[46,-20],[29,-25],[28,-47],[30,-40],[21,-51],[15,-64],[19,-123],[9,-129],[28,161],[24,29],[-6,-46],[-16,-69],[-17,-101],[-5,-74],[6,-64],[0,-30],[-13,-106],[7,-20],[11,-19],[29,-36],[21,-54],[5,-75],[12,-20],[14,-18],[72,-150],[41,-100],[21,-58],[22,-73],[12,-17],[14,-11],[27,-34]],[[63492,75947],[-15,-38],[-25,-67],[-11,-35],[-25,-33],[-44,-35],[-24,-15],[-25,-72],[-29,-69],[-19,-8],[-56,11],[-19,6],[-57,31],[-16,19],[-15,81],[-17,34],[-22,23],[-15,19],[-6,19],[-16,28],[-30,42],[-21,40],[-16,11],[-21,-14],[-12,-4],[-5,7],[-4,33],[-30,12]],[[62897,75973],[-6,8],[-39,32],[-16,17],[-14,2],[-31,9],[-27,16],[-12,20],[-18,22],[-33,29],[-24,26],[-1,17],[15,71],[10,68],[-6,13],[-14,11],[-25,11],[-61,-4],[-38,69],[-13,15],[-25,11],[-35,21],[-20,15],[-6,-6],[-22,-75],[-22,54],[-13,14],[-19,8],[-20,0],[-49,-26],[-36,-28],[-27,-22],[-27,-12],[-13,-17],[-37,3],[-18,13],[-6,14],[3,23],[13,26],[1,14],[-5,11],[-44,35],[-18,22],[-59,30],[-71,53],[-25,35],[-3,24],[-28,24],[-36,21],[-28,-6],[-26,-2],[-41,39],[-38,3],[-44,-12],[-10,-5],[-10,-5],[-130,16],[-34,33],[-28,33],[-77,24],[-39,25],[-39,36],[-42,31],[-36,-13],[-49,18],[-54,15],[-18,-9],[-17,-40],[-13,-37]],[[61104,76854],[-29,31],[-99,146],[-52,98],[-170,225],[-22,17],[-90,33],[-37,26],[-91,161],[-41,-22],[-37,6],[-21,14],[-24,23],[-16,30],[-19,68],[-22,38],[-72,56],[-82,33],[-6,14],[-3,20],[71,38],[19,22],[-36,29],[-14,5],[-11,13],[20,22],[20,10],[31,-25],[35,-46],[31,-18],[14,22],[106,39],[7,30],[0,34],[-11,-2],[-6,8],[0,38],[16,51],[48,84],[25,116],[23,27],[16,-18],[-1,-27],[3,-20],[15,39],[14,53],[36,0],[24,-9],[26,6],[-49,88],[-66,87],[-28,-6],[-18,13],[-29,73],[-12,60],[28,-2],[28,-9],[53,42],[20,6],[31,-13],[44,-8],[-3,39],[-14,47],[53,34],[47,19],[91,68],[40,12],[5,15],[1,20],[-13,54],[-14,40],[-48,2],[-26,-55],[-72,-19],[-33,4],[26,36],[25,13],[8,15],[-52,-13],[-25,-37],[-76,-48]],[[58823,81855],[-2,14],[-19,55],[-11,24],[-13,13],[-7,15],[0,66],[2,61],[9,8],[-25,50],[-2,38],[12,19],[0,16],[-8,22],[-25,37],[-25,41],[-16,33],[-11,15],[13,26],[17,45],[6,26],[9,6],[40,4],[29,-1],[22,-9],[8,-22],[21,-23],[57,-10],[24,1],[30,21],[49,48],[12,34],[30,24],[18,10],[17,4],[2,20],[-1,28],[-6,17],[-60,57],[-8,18],[-5,22],[8,21],[-1,23],[-69,51],[-58,9],[-47,-3],[-19,10],[8,26],[12,46],[3,38],[-3,17],[-9,15],[-46,32],[-62,48],[-29,56],[-15,57],[-17,35],[-31,23],[2,14],[21,54],[-1,9],[-9,13],[-38,27],[-51,51],[-3,13],[4,31],[7,32],[11,14],[30,64],[0,21],[-5,29],[-23,49],[-17,32],[-1,16],[3,14],[11,17],[11,22],[2,73],[0,26],[-7,15],[-7,7],[-16,-4],[-22,12],[-16,19],[-10,6],[-11,20],[-31,39],[-6,11],[-61,33],[-53,-5],[-30,6],[-15,-8],[-16,-21],[-22,-15],[-17,0],[-15,-11],[-41,-38],[-19,23],[-17,34],[6,29],[7,27],[-1,18],[-6,15],[-25,17],[-55,31],[-15,0],[-24,-11],[-42,-34],[-15,7],[-14,27],[-15,34],[-20,18],[-44,-2],[-4,-1],[-21,-20],[-9,2],[-38,50]],[[57818,84183],[7,27],[8,41],[-3,31],[-6,41],[-16,72],[-2,20],[-27,31],[-4,26],[-14,34],[-14,22],[-3,47],[-9,17],[-12,8],[-41,-14],[-5,2],[20,76],[2,44],[12,47],[15,18],[4,16],[2,30],[-2,27],[-9,13],[-35,30],[-37,35],[-8,45],[-11,10],[-33,2]],[[57597,84981],[1,13],[5,36],[8,31],[25,33],[6,23],[8,20],[59,24],[6,9],[1,8],[-3,8],[-13,12],[-14,17],[-8,46],[-20,71],[-19,48],[-4,28],[5,33],[7,31],[0,31],[-29,172],[2,31],[8,31],[14,26],[30,34],[38,62],[25,81],[14,49],[11,11],[22,3],[8,15],[4,8],[19,9],[6,9],[-5,17],[-19,29],[-14,18]],[[57781,86108],[14,40],[-5,54],[-9,44],[12,33],[21,3],[22,-36],[34,-18],[25,24],[8,46],[18,20],[24,-18],[40,-7],[33,3],[22,10],[10,15],[9,27],[18,34],[19,23],[145,-26],[126,-47],[9,18],[5,30],[-32,26],[-23,14],[-29,54],[-42,43],[-42,4],[-55,-15],[-84,9],[-71,81],[-47,25],[-34,62],[-8,33],[36,-28],[5,29],[3,40],[-20,24],[-18,14],[-93,-61],[-106,-20]],[[57721,86714],[98,120],[71,87],[14,14],[31,23],[26,24],[21,33],[71,63],[72,69],[67,90],[24,28],[31,30],[67,96],[22,26],[82,120],[48,59],[24,34],[103,113],[69,91],[28,50],[27,71],[15,49],[27,63],[1,21],[-8,19],[-20,30],[-28,35],[-25,43],[-18,38],[-57,53],[-89,67],[-66,50],[-101,107],[-18,26],[4,7],[57,33],[57,83],[25,42],[6,32],[0,37],[-4,34],[-7,21],[-27,27],[-78,48],[-19,44],[-15,47],[0,19],[37,50],[2,25],[-5,26],[-10,19],[-80,22],[-23,24],[-18,38],[-9,33],[-1,19],[6,22],[27,23],[25,16],[5,22],[-1,23],[-4,11],[-50,11],[-5,6],[-1,8],[2,10],[28,41],[3,79],[26,55],[-29,32],[2,5],[44,17],[41,4],[18,7],[2,25],[-4,35],[-42,136],[-9,39],[-28,50],[-23,33],[-14,24],[-22,47],[-13,47],[-22,54],[-26,48],[-22,46],[-55,88],[-8,25],[1,22],[5,23],[44,73],[40,60],[51,71],[49,59],[53,69],[13,70],[-2,12],[-44,37],[-82,101],[-51,77],[-78,32],[-104,41],[-35,93],[-25,79],[2,29],[76,134],[7,25],[-1,15],[-8,9],[-11,6],[-70,4],[-11,18],[42,14],[35,19],[58,28],[18,7]],[[58045,91602],[43,16],[14,12],[11,15],[40,100],[10,16],[123,36],[45,18],[26,23],[12,19],[9,21],[7,24],[2,22],[-10,28],[6,3],[13,-1],[42,-28],[66,-30],[48,-2],[20,5],[10,13],[7,26],[0,27],[-15,75]],[[58574,92040],[50,-8],[112,-46],[26,5],[34,13],[34,55],[25,9],[33,-12],[9,14],[-17,46],[4,22],[113,-48],[48,-36],[105,-32],[18,-17],[2,-30],[-5,-25],[-23,-14],[-44,2],[-161,39],[-23,-24],[19,-20],[47,-25],[13,-43],[72,6],[69,-16],[32,5],[6,-14],[-22,-36],[10,-9],[77,34],[36,10],[19,-9],[3,-29],[-13,-36],[-1,-28],[-24,-66],[-36,-21],[-16,-27],[54,17],[28,18],[53,92],[16,12],[152,1],[34,-5],[142,-44],[40,-3],[46,5],[16,20],[16,6],[158,-48],[211,-109],[309,-179],[174,-160],[20,-34],[63,-20],[14,14],[35,-12],[205,-146],[70,-7],[-9,31],[-12,29],[18,-7],[24,-21],[38,-57],[48,-42],[48,-64],[41,-24],[36,-9],[30,-18],[56,-17],[26,-155],[20,-34],[0,-68],[36,-28],[27,-5],[-1,-51],[-22,-119],[-24,-51],[-186,-219],[-116,-84],[-226,-97],[-176,-36],[-72,-3],[-138,18],[-75,20],[-93,55],[-86,27],[-60,12],[-110,5],[-239,54],[-41,19],[-150,105],[-60,-30],[-35,-5],[-24,36],[10,10],[5,12],[-85,30],[-70,2],[-37,26],[-46,19],[-20,-12],[-11,0],[-92,46],[-41,37],[-43,65],[10,23],[13,15],[-148,38],[-140,5],[25,-18],[60,-10],[39,-26],[44,-37],[-10,-50],[62,-50],[47,-48],[2,-14],[18,-10],[70,-14],[12,-44],[-11,-17],[9,-25],[53,-27],[31,-7],[38,-17],[-17,-33],[-32,-22],[-33,-10],[16,-8],[41,3],[152,-55],[80,-56],[81,-102],[26,-50],[2,-28],[-4,-27],[-12,-30],[-5,-31],[-28,-88],[-20,-31],[-38,-35],[36,-68],[37,-63],[37,-105],[7,-42],[1,-65],[33,-26],[-13,-10],[-13,-18],[3,-84],[46,-69],[70,-45],[41,-9],[59,18],[43,-25],[96,-84],[43,-89],[18,-18],[97,-34],[72,-20],[111,-54],[19,-2],[54,47],[92,32],[29,44],[-3,37],[-23,67],[-7,65],[-31,27],[-28,18],[-86,-14],[-39,3],[-30,17],[-40,47],[-75,113],[-40,37],[-13,24],[-14,32],[2,53],[33,-2],[37,30],[27,106],[46,14],[25,-1],[108,-50],[134,-132],[29,-14],[31,-2],[51,4],[9,-18],[27,-20],[20,-3],[123,-42],[142,-82],[53,3],[21,46],[4,20],[59,46],[40,8],[57,-17],[10,13],[-19,68],[-26,59],[-39,37],[-68,111],[-28,54],[-13,57],[9,50],[10,36],[142,89],[51,53],[50,69],[23,14],[83,19],[111,59],[85,78],[84,119],[36,31],[28,-2],[38,-19],[42,-35],[57,-6],[55,5],[64,-3],[88,-54],[14,-17],[14,-23],[-28,-45],[-3,-29],[23,14],[32,6],[29,-9],[28,-25],[20,-28],[25,-24],[7,32],[4,28],[-13,70],[34,99],[26,43],[48,110],[-14,71],[-2,82],[-7,38],[-31,55],[-61,39],[-61,13],[-20,38],[4,43],[17,63],[50,133],[52,188],[2,43],[-5,24],[4,24],[-7,57],[-9,42],[-213,163],[-13,15],[-7,22],[23,5],[16,-1],[160,-76],[35,-4],[251,21],[123,-18],[103,-39],[74,-108],[76,-99],[70,-86],[2,-70],[-73,-14],[-70,-4],[-180,-35],[-43,-39],[-120,-122],[-11,-37],[11,-36],[55,-38],[118,-57],[52,-113],[37,-57],[28,-22],[27,-5],[60,-1],[42,-13],[12,-11],[17,11],[38,4],[224,60],[44,26],[15,40],[16,133],[20,46],[19,57],[-7,35],[-2,40],[112,38],[104,26],[50,-8],[13,28],[-32,55],[-19,28],[16,12],[24,-15],[32,-9],[56,9],[215,113],[84,63],[50,25],[80,57],[38,19],[67,7],[71,23],[78,42],[105,36],[17,2],[21,-5],[43,-42],[-16,-24],[-12,-25],[21,-14],[17,-6],[21,7],[22,17],[54,26],[15,33],[-21,13],[-27,49],[-32,11],[-26,-2],[95,71],[202,105],[108,48],[107,4],[85,-6],[-32,-16],[-140,-22],[-21,-11],[0,-13],[34,-8],[14,-16],[-11,-18],[-11,-6],[-16,-54],[-21,-43],[44,-56],[4,-58],[-28,-31],[-39,12],[-34,-20],[-62,-14],[-14,-18],[-9,-26],[40,-6],[31,2],[110,-17],[15,-2],[37,18],[37,4],[45,6],[23,11],[23,-13],[44,-51],[40,10],[17,99],[63,62],[74,50],[72,5],[69,35],[33,7],[64,-14],[96,-3],[81,-30],[60,-8],[88,51],[203,143],[17,-33],[33,48],[157,50],[38,2],[1,-20],[14,-44],[30,-27],[42,-64],[-20,-17],[-21,-10],[-31,-43],[-3,-99],[59,-25],[81,-29],[34,1],[28,16],[9,9],[10,15],[8,29],[5,22],[-21,55],[8,58],[74,-4],[91,17],[41,33],[49,63],[33,52],[-21,92],[-53,-20],[-91,199],[-47,77],[30,36],[78,23],[71,74],[27,15],[29,3],[210,-51],[239,-12],[203,-39],[230,-81],[112,-57],[93,-63],[-9,-45],[38,13],[82,-40],[56,-16],[57,-24],[22,-32],[75,-23],[78,-43],[14,-8],[95,-32],[68,-11],[41,-69],[136,-100],[25,-38],[119,-63],[59,-52],[37,20],[91,126],[54,144],[32,77],[-60,3],[-45,-22],[-29,5],[-32,23],[-52,58],[-66,97],[-13,106],[-18,35],[-64,28],[-42,32],[-156,63],[-28,-22],[-8,-34],[-10,-25],[-16,32],[-10,29],[0,46],[8,59],[26,99],[40,-5],[21,15],[26,44],[-12,37],[-14,28],[3,43],[25,118],[11,138],[-21,34],[-19,23],[-89,-24],[-33,13],[-8,26],[-2,21],[25,35],[25,59],[-43,-13],[-15,23],[36,34],[42,82],[99,38],[74,37],[116,78],[86,77],[56,98],[38,93],[62,218],[58,160],[98,165],[61,15],[23,-3],[4,-12],[-14,-14],[-4,-20],[26,-7],[42,-1],[79,10],[134,-6],[234,14],[33,-7],[87,-48],[47,6],[96,-23],[52,-26],[50,-31],[-7,-120],[-10,-80],[-35,-152],[-14,-39],[-56,-110],[-26,-72],[-42,-50],[-60,-35],[-8,-21],[-5,-31],[59,-87],[140,-90],[34,-108],[8,-81],[-9,-210],[-13,-31],[-26,-34],[-25,-40],[16,-59],[20,-219],[4,-178],[-16,-61],[-8,-129],[0,-43],[14,-64],[28,-54],[37,-34],[105,-63],[99,-76],[7,-24],[5,-29],[-35,-30],[-55,-78],[-35,-65],[-3,-53],[12,-67],[-6,-63],[-23,-56],[-33,-41],[-99,-63],[-207,-334],[-50,-39],[-84,13],[23,-48],[29,-68],[-4,-45],[-54,3],[-77,-48],[-35,-32],[-60,-17],[-45,17],[-50,31],[7,26],[10,12],[35,19],[34,25],[-17,5],[-14,0],[-38,-32],[-45,-7],[-52,40],[-41,43],[-19,9],[-38,-18],[-146,8],[-38,-7],[-18,-16],[10,-13],[11,-24],[15,-48],[14,-36],[60,-39],[81,-15],[78,-48],[99,-34],[224,14],[59,-4],[58,-15],[97,-50],[42,4],[71,45],[17,101],[9,31],[257,142],[48,31],[77,77],[25,52],[29,140],[25,50],[167,161],[26,41],[5,76],[-3,51],[-10,50],[-30,84],[-34,49],[-33,67],[24,138],[28,53],[151,63],[129,23],[144,43],[58,9],[40,-7],[41,-47],[36,-69],[104,-105],[35,-72],[7,-89],[-4,-216],[-20,-94],[41,-24],[20,-22],[51,-31],[27,-31],[27,-11],[59,-7],[168,11],[92,6],[-9,14],[-14,11],[-78,4],[-110,23],[-159,42],[-19,91],[4,56],[36,106],[25,18],[31,7],[36,15],[-11,67],[-14,61],[-34,85],[-37,157],[-51,1],[-39,31],[-189,92],[-179,68],[-123,9],[-39,-7],[-102,-71],[-66,-15],[-125,31],[-107,-17],[-40,17],[-16,31],[32,127],[-17,49],[-47,66],[-28,51],[5,56],[70,214],[29,56],[75,100],[38,76],[-9,44],[-161,239],[-43,85],[-19,27],[-39,32],[-60,38],[-18,34],[163,231],[74,40],[103,25],[50,22],[87,47],[52,39],[17,31],[11,37],[2,91],[-11,73],[-14,41],[-31,52],[-31,59],[22,15],[22,9],[58,-1],[60,-32],[30,-64],[35,-60],[0,-40],[-3,-31],[15,-44],[13,-18],[14,-31],[-13,-25],[-14,-12],[-27,-35],[-43,-108],[-33,-14],[-8,-84],[71,-92],[-9,-69],[-14,-23],[-39,-37],[5,-30],[10,-21],[111,-44],[105,-27],[176,-9],[51,-43],[19,30],[165,-7],[133,-105],[70,-32],[57,-11],[116,13],[20,9],[19,30],[-54,-2],[-24,-14],[-22,1],[-38,11],[-27,18],[-29,35],[-48,104],[-84,33],[-57,-14],[-62,7],[-102,56],[-68,21],[-121,61],[-34,25],[-27,51],[-31,84],[-20,47],[26,9],[83,46],[124,15],[53,-16],[136,-94],[63,-3],[114,41],[13,26],[-26,53],[-34,27],[-66,13],[-80,-24],[-23,20],[8,28],[9,21],[43,5],[30,16],[65,58],[72,28],[71,10],[261,-8],[148,-91],[144,-41],[63,-31],[17,-5],[15,-21],[11,-48],[182,-129],[42,-17],[116,-6],[130,30],[59,3],[63,-9],[33,-16],[36,-30],[-19,-38],[-17,-23],[-36,-64],[-16,-18],[-118,-73],[-47,-19],[-13,-96],[-6,-21],[-5,-34],[22,-68],[5,-42],[-18,-58],[-30,-62],[6,-50],[10,-67],[5,20],[-2,30],[8,35],[54,85],[39,115],[40,30],[36,7],[40,-34],[11,-46],[2,-70],[-8,-65],[-30,-100],[-50,-70],[-16,-39],[23,-37],[25,-29],[29,-9],[33,3],[8,9],[6,28],[-10,36],[-6,33],[61,25],[57,14],[45,42],[11,28],[10,46],[-23,72],[-20,54],[-68,129],[-51,66],[32,99],[53,110],[20,27],[6,17],[6,30],[-5,31],[-6,20],[-54,83],[-39,27],[-123,16],[-31,13],[-90,85],[-11,19],[-20,61],[-7,15],[-25,16],[-83,35],[-58,15],[-84,4],[-51,18],[-76,56],[-8,19],[-22,73],[-17,37],[5,28],[27,58],[19,51],[-23,44],[-33,14],[-36,21],[-15,40],[-9,43],[-1,34],[-6,39],[17,33],[38,34],[-9,24],[5,31],[247,41],[96,11],[480,4],[34,12],[209,20],[89,24],[94,-25],[34,1],[69,7],[45,51],[102,20],[170,21],[84,-4],[19,-15],[19,-21],[-92,-62],[-92,-56],[-76,-24],[-74,-49],[-7,-19],[-2,-12],[2,-39],[5,-25],[77,-32],[59,-44],[57,-32],[45,-19],[11,11],[-165,104],[-42,23],[-17,25],[8,38],[17,17],[26,19],[17,9],[62,20],[206,27],[49,51],[21,30],[56,31],[-19,13],[-46,8],[-36,18],[-142,183],[-35,28],[-109,20],[-49,21],[50,62],[59,16],[40,-4],[35,-17],[65,-51],[92,22],[-35,23],[-58,26],[-54,42],[-77,37],[-86,24],[-90,10],[25,55],[50,-7],[16,17],[23,33],[125,-77],[59,21],[50,35],[104,93],[14,42],[-50,23],[-41,11],[-56,-2],[-5,25],[24,33],[45,13],[139,-36],[232,93],[63,45],[161,58],[79,-7],[164,77],[227,33],[132,1],[102,42],[156,15],[54,17],[263,43],[146,34],[23,27],[-131,-22],[-31,20],[-27,-13],[-20,-19],[-63,34],[-17,-9],[-13,-18],[-23,-6],[-27,4],[-9,41],[32,55],[37,-29],[43,42],[27,1],[81,-26],[54,27],[72,13],[79,-12],[33,3],[19,25],[129,-22],[89,15],[61,-2],[95,-13],[43,-18],[-25,-42],[-92,-68],[25,-11],[53,31],[159,46],[26,-9],[-18,-40],[-11,-17],[106,23],[91,50],[40,9],[41,-31],[39,28],[9,28],[69,6],[28,26],[49,19],[40,8],[89,36],[31,-11],[59,-9],[56,-17],[105,-40],[14,-15],[13,-3],[30,-28],[-22,-42],[-24,-60],[-45,-28],[27,-3],[19,8],[36,40],[32,28],[-8,119],[-57,60],[-44,20],[-102,63],[-34,27],[-46,28],[18,17],[196,-22],[100,11],[108,-7],[144,27],[61,-28],[69,1],[80,-23],[24,27],[-131,29],[-58,-3],[-21,15],[22,34],[25,51],[-25,44],[-24,24],[-4,45],[23,52],[54,22],[30,42],[63,55],[303,179],[145,68],[55,9],[64,-6],[126,57],[47,0],[175,-45],[42,-33],[96,-26],[111,-14],[51,-21],[25,-24],[21,-33],[-90,-22],[-97,-66],[-132,-36],[-163,-24],[-34,-18],[311,-5],[90,4],[19,-57],[30,-2],[90,27],[54,2],[102,-20],[21,11],[44,1],[94,-25],[42,-37],[-67,-60],[-69,-53],[-84,-90],[-26,7],[-44,2],[8,-45],[74,2],[40,-20],[92,25],[130,-8],[27,7],[50,28],[13,52],[22,33],[43,11],[47,-10],[80,0],[203,17],[170,-22],[136,27],[178,-20],[78,-21],[57,-37],[52,-11],[42,-29],[43,-42],[-21,-34],[-21,-23],[56,25],[43,6],[32,-15],[57,-15],[18,-95],[17,-18],[15,-33],[-21,-30],[-18,-14],[45,3],[63,32],[13,11],[16,24],[-24,23],[-21,14],[27,11],[52,-4],[26,-42],[17,-38],[38,-127],[81,17],[4,-38],[-34,-87],[-36,-64],[-14,-14],[-23,-3],[9,34],[-14,20],[-21,12],[-74,12],[-138,79],[-37,8],[-8,-4],[-4,-7],[77,-54],[63,-95],[57,28],[23,-5],[31,-45],[56,-18],[47,-30],[-31,-91],[-192,-160],[-203,-93],[-90,-65],[-158,-47],[-113,-64],[-144,-47],[-42,-51],[-107,-32],[8,-17],[12,-18],[-13,-30],[-15,-23],[-83,-47],[-121,-32],[-243,-195],[-121,-40],[-137,-2],[-29,-18],[-104,-123],[-32,-26],[-136,-13],[-142,-201],[-79,-68],[-69,-37],[72,7],[85,27],[99,65],[26,30],[14,34],[29,27],[45,19],[176,21],[72,-8],[106,6],[70,36],[41,13],[37,4],[19,26],[62,5],[143,34],[21,12],[46,51],[85,-19],[61,10],[159,91],[96,34],[26,24],[-19,17],[-22,12],[-92,-32],[-83,-10],[-94,8],[-13,13],[-11,32],[30,47],[26,28],[60,37],[49,13],[183,-40],[38,-5],[21,66],[58,-3],[58,-11],[-25,-14],[-64,-21],[20,-48],[28,-33],[112,-47],[95,-21],[70,1],[110,20],[17,14],[23,38],[-28,72],[27,-9],[27,-18],[42,-44],[40,-75],[25,-35],[-15,-37],[-57,-71],[33,-39],[59,-26],[0,-116],[-4,-56],[-29,-61],[-34,-26],[-33,-38],[8,-36],[8,-22],[35,-42],[98,-13],[13,11],[-23,13],[-66,20],[-26,16],[-23,38],[27,42],[29,31],[35,71],[11,50],[-7,52],[23,24],[35,25],[17,5],[16,11],[-25,13],[-23,6],[-48,32],[-8,41],[96,17],[57,29],[210,13],[144,55],[322,-15],[226,-45],[317,-5],[117,-30],[11,-11],[7,-22],[-50,-9],[-83,0],[-22,-56],[14,-70],[148,-74],[129,-31],[90,-49],[48,-4],[188,5],[110,-25],[100,19],[109,0],[38,-5],[40,-37],[64,-10],[77,-1],[43,7],[17,9],[-6,15],[-64,22],[7,27],[25,6],[107,-36],[44,-6],[39,27],[29,49],[16,33],[17,17],[14,2],[14,10],[-34,39],[-33,49],[-7,32],[-10,16],[-4,59],[30,60],[21,17],[85,-23],[38,36],[24,14],[102,24],[43,-2],[71,-23],[228,-110],[-5,-42],[54,12],[26,17],[61,11],[41,18],[11,-7],[14,-17],[-10,-25],[-14,-25],[9,-15],[12,-3],[61,-31],[79,57],[32,55],[22,11],[197,-38],[59,-21],[12,-12],[8,-20],[32,-22],[39,-12],[-5,-18],[-2,-19],[92,-3],[40,-16],[44,-25],[-5,-29],[11,-17],[41,-2],[11,3],[-13,-39],[-55,-42],[-33,-16],[-38,-28],[21,-5],[95,-8],[59,-56],[6,-41],[-37,-16],[-84,-52],[-50,-21],[-35,-2],[-25,-7],[36,-22],[158,-6],[46,-28],[36,-70],[0,-86],[-36,-43],[-97,-7],[-127,96],[-78,37],[-109,71],[-21,-12],[32,-60],[51,-34],[92,-93],[154,-192],[36,16],[21,24],[10,31],[-9,43],[25,-21],[23,-38],[46,-64],[-62,3],[-80,-21],[-29,-26],[22,-35],[59,-5],[25,-49],[46,-60],[103,-164],[73,-31],[71,-68],[71,-32],[37,-2],[25,42],[20,-15],[19,-76],[34,-33],[38,-2],[31,13],[45,36],[36,42],[58,116],[38,58],[36,24],[-13,28],[4,33],[26,77],[36,91],[27,49],[66,97],[25,18],[18,-32],[14,-42],[10,-18],[10,-7],[81,-85],[82,-67],[73,-33],[115,-32],[167,5],[30,42],[58,32],[94,16],[55,39],[91,11],[57,-6],[88,-28],[197,-89],[55,-33],[29,-35],[64,-52],[41,-25],[40,-18],[14,5],[-5,15],[-20,15],[-16,19],[47,19],[5,15],[17,12],[62,11],[-61,19],[-20,3],[-29,11],[2,27],[19,19],[15,36],[19,23],[32,18],[24,3],[57,-23],[41,42],[30,-3],[63,-43],[56,-64],[31,0],[87,26],[98,1],[-13,38],[-68,83],[8,106],[-47,24],[-54,14],[78,27],[58,87],[46,8],[48,16],[-15,11],[-143,9],[-31,-10],[-21,-26],[-71,0],[-8,59],[-2,37],[93,79],[35,17],[236,-2],[71,15],[104,39],[-27,25],[-3,50],[-89,73],[7,16],[9,11],[27,0],[140,-19],[58,-39],[151,-40],[404,-13],[45,-14],[174,-17],[73,-19],[175,-23],[80,-17],[63,-25],[103,-15],[47,-17],[-5,-53],[-213,7],[-71,17],[-88,2],[-33,-8],[-53,-44],[-63,-23],[-53,-4],[35,-38],[49,-10],[158,49],[432,24],[66,-4],[-7,-34],[-58,-65],[-55,-50],[-80,-52],[-30,0],[63,110],[-26,6],[-24,-3],[-70,46],[-11,2],[-14,-11],[0,-16],[-13,-64],[26,-27],[0,-46],[-97,-29],[-38,3],[-40,18],[-17,0],[-5,-15],[8,-27],[-1,-13],[-15,-22],[-8,-23],[24,-26],[31,-7],[171,29],[75,36],[82,65],[146,159],[65,54],[37,21],[48,8],[269,-17],[156,-34],[149,-51],[74,-42],[54,-57],[10,-24],[5,-32],[-37,-30],[-167,-10],[-64,-17],[-24,-19],[-3,-11],[-8,-17],[12,-14],[75,-2],[72,-13],[100,-36],[15,-12],[32,-35],[10,-6],[149,6],[10,-12],[9,-26],[-39,-40],[-39,-27],[-80,-64],[40,23],[161,55],[41,10],[49,-4],[121,-50],[50,-39],[92,-112],[-26,-12],[-66,-12],[208,-85],[80,1],[184,24],[93,1],[172,54],[171,35],[157,2],[83,33],[220,-1],[211,-11],[164,-20],[185,-60],[180,-83],[105,-82],[21,-25],[30,-57],[13,-48],[13,-65],[-6,-51],[-26,-36],[-16,-45],[2,-53],[-31,-69],[29,-49],[80,-32],[172,-42],[47,-29],[6,-85],[14,-71],[15,-136],[29,-35],[47,-32],[9,-45],[-59,-144],[-37,-27],[-39,-40],[69,14],[35,53],[38,97],[36,16],[19,31],[0,92],[-23,79],[0,57],[15,46],[114,95],[61,38],[58,22],[158,19],[72,19],[82,-13],[58,5],[67,20],[59,-10],[98,-63],[347,-14],[61,-22],[233,-27],[18,0],[52,31],[154,108],[64,-7],[26,-17],[27,-43],[28,-27],[23,-75],[20,-102],[33,-18],[46,-6],[100,-38],[101,-48],[29,-92],[54,-77],[126,7],[132,16],[127,126],[0,52],[-31,74],[-47,72],[-37,112],[-117,25],[11,33],[44,39],[40,61],[6,46],[-11,98],[106,-7],[106,-11],[201,-44],[163,-18],[86,-28],[52,-32],[62,-23],[21,57],[23,14],[82,-33],[60,-9],[103,4],[130,-15],[141,3],[127,25],[47,-5],[52,-20],[84,-53],[143,-71],[130,-20],[150,-66],[141,-25],[113,-38],[16,-14],[5,-21],[8,-18],[89,-20],[165,-143],[-99962,-16],[56,-25],[56,-20],[23,6],[12,-2],[32,-35],[21,-16],[113,-41],[51,-45],[42,-52],[-21,10],[-38,34],[4,-39],[12,-27],[61,-26],[64,-20],[40,-24],[14,-21],[8,-38],[-10,-33],[37,12],[35,30],[-18,23],[-117,81],[-25,27],[34,-14],[158,-103],[43,-39],[-18,-8],[-13,-23],[14,-10],[19,8],[31,4],[31,-13],[35,-27],[73,-32],[434,-254],[10,-44],[12,-21],[7,-26],[2,-43],[-39,-51],[61,5],[9,6],[16,21],[17,14],[24,-17],[19,-34],[-6,-46],[-17,-38],[-2,-63],[15,-54],[15,-22],[13,-26],[3,-76],[-27,-34],[-15,-59],[17,-6],[52,-5],[18,-11],[30,-27],[7,-26],[7,-36],[9,-34],[7,-16],[8,3],[30,46],[14,14],[34,12],[19,-53],[-13,-88],[11,0],[8,10],[11,23],[15,14],[19,32],[16,39],[-19,31],[-21,20],[-51,10],[-26,24],[-10,29],[26,12],[22,21],[15,52],[-4,28],[-6,27],[-12,39],[-19,23],[-36,11],[-16,22],[-25,-1],[-25,6],[-9,8],[1,16],[28,7],[157,2],[57,22],[25,-6],[26,-16],[94,-21],[-3,-10],[-16,-10],[-27,-46],[-6,-26],[-1,-34],[24,-6],[24,14],[-12,27],[-3,33],[10,14],[13,3],[24,-24],[27,-8],[89,-10],[26,3],[8,13],[-18,14],[-116,33],[-2,17],[108,-22],[48,-20],[48,-15],[67,5],[66,-24],[63,-65],[58,-82],[59,-49],[61,-36],[103,-99],[13,-8],[10,-14],[-19,-16],[-17,-25],[34,17],[33,12],[17,-3],[15,-12],[10,-21],[5,-20],[-14,-18],[99,-4],[30,-12],[14,-49],[-28,-34],[-17,5],[-16,14],[-15,1],[-44,-14],[-67,-46],[-38,-37],[-7,-24],[6,-65],[-5,-31],[-29,-20],[-64,12],[-29,13],[-33,17],[-31,24],[-41,39],[-12,4],[-8,-10],[13,-24],[28,-31],[47,-40],[22,-45],[-14,-23],[-18,-5],[-13,1],[-41,14],[-29,3],[-90,-13],[-32,-8],[-11,7],[-3,19],[-48,15],[-29,2],[-13,6],[-11,21],[-32,30],[-48,11],[-31,2],[-17,-7],[63,-39],[56,-67],[-11,-13],[-7,-14],[31,-1],[21,4],[5,-17],[-16,-71],[-11,-15],[-98,-16],[25,-12],[25,-3],[29,3],[26,-13],[17,-44],[3,-46],[-25,-27],[-27,-21],[-53,-33],[-56,-14],[-29,3],[-28,-7],[-19,-17],[-5,-17],[24,11],[28,-6],[27,-21],[-3,-17],[-26,-18],[-5,-14],[9,-24],[-3,-20],[13,-11],[30,-4],[36,-14],[36,-20],[14,-16],[12,-24],[4,-24],[-6,-11],[-82,-4],[-12,3],[-5,28],[-10,22],[-31,16],[-12,-11],[9,-79],[-12,-24],[-14,-18],[-41,-10],[-33,6],[-28,37],[0,32],[19,19],[0,26],[-6,30],[-18,-35],[-23,-29],[-35,-37],[-18,-4],[-17,4],[-47,26],[-29,23],[-56,74],[-32,34],[-70,46],[-72,34],[-57,22],[-31,-3],[-30,-9],[-39,5],[-13,8],[-11,19],[-11,10],[-54,46],[-38,37],[-2,25],[8,30],[-7,73],[-18,69],[-48,68],[-126,44],[-104,31],[-37,7],[-33,-6],[-87,-57],[-59,-8],[-170,-3],[-28,6],[-26,24],[-6,33],[8,59],[-1,25],[-7,9],[-9,-1],[-33,24],[-31,40],[-25,41],[-16,56],[22,3],[31,-14],[5,13],[10,51],[21,24],[9,18],[14,68],[2,49],[-24,-26],[-39,-68],[-18,-20],[-14,-9],[-13,-4],[-30,13],[-22,17],[-1,65],[-10,17],[-10,-12],[-4,-24],[-28,-4],[-13,-10],[7,-39],[-3,-33],[-27,-13],[-53,-7],[-19,32],[-16,-45],[-12,-51],[-2,-67],[17,-56],[25,-27],[53,-40],[23,-28],[6,-37],[-2,-33],[-28,-42],[-18,-34],[-33,-81],[-19,-33],[-82,-69],[99951,-19],[-49,-66],[-56,-57],[-83,-23],[-126,-87],[-49,-16],[-65,40],[-149,26],[-47,35],[-68,88],[-23,13],[-21,35],[-82,39],[-72,-25],[-58,19],[-20,-14],[30,-12],[54,-11],[82,5],[27,-9],[24,-31],[28,-49],[-21,-32],[-22,-11],[-66,36],[-76,-5],[-36,9],[-102,60],[-78,-67],[-107,-35],[-83,-4],[-152,-53],[41,-2],[111,38],[65,0],[96,21],[51,24],[24,23],[31,23],[31,-11],[22,-24],[14,-35],[14,-45],[-18,-24],[-18,-12],[-22,-33],[102,56],[62,-33],[31,5],[58,49],[93,32],[11,-6],[11,-16],[-15,-94],[6,-74],[71,-81],[73,-47],[26,-2],[24,9],[9,43],[18,32],[23,-29],[19,-31],[27,-76],[-1,-23],[-6,-45],[23,-20],[32,-6],[12,-71],[11,-101],[-14,-9],[-16,0],[-51,-26],[7,-18],[52,-10],[15,-21],[-11,-47],[3,-21],[18,-5],[12,28],[-3,39],[5,17],[35,-81],[0,-31],[30,-36],[85,-54],[15,-24],[5,-40],[-21,-12],[-20,-28],[12,-40],[22,-32],[36,-12],[17,-52],[0,-49],[-26,-43],[-53,-59],[-31,-24],[-12,-42],[-3,-44],[-21,2],[-23,19],[-262,110],[-99,21],[-87,2],[-16,7],[1,26],[5,24],[13,29],[-6,26],[-11,2],[-11,-20],[-24,0],[-23,23],[-19,-7],[-9,-32],[-7,-17],[0,-20],[12,-18],[50,-20],[-8,-18],[-70,-14],[-57,-18],[-74,-54],[-30,-38],[-198,-93],[-48,-32],[-21,-4],[-27,-11],[-21,-39],[-110,-55],[-23,5],[-29,-46],[-27,-26],[-63,-3],[-41,-13],[-88,-67],[-55,21],[-65,-91],[-72,-87],[-21,0],[-55,36],[-14,-19],[9,-35],[19,-37],[-11,-10],[-22,10],[-16,2],[-12,-11],[2,-27],[-31,-33],[-24,-3],[-28,-11],[-10,-29],[9,-32],[-50,-36],[-41,-48],[-19,-8],[-22,-21],[-24,-16],[-28,3],[-67,-67],[-150,-117],[-42,-15],[-53,-36],[-5,-23],[0,-30],[-21,-48],[-25,-122],[-8,-22],[-12,-25],[-55,12],[-48,46],[-15,22],[-8,25],[-3,40],[-9,19],[-11,9],[-55,99],[-95,68],[-14,23],[-121,-18],[-33,-1],[-58,17],[-90,-11],[-109,-37],[-33,-23],[-111,-36],[-73,-57],[-142,-208],[-34,-43],[-16,-9],[-24,-4],[-10,42],[-4,33],[9,63],[17,52],[17,96],[5,39],[12,41],[-48,-3],[-66,-71],[-100,-69],[-46,-18],[-36,-41],[-26,-5],[-30,-15],[-3,-89],[-15,-48],[-18,-10],[-28,-2],[-21,19],[-30,71],[-40,37],[-24,7],[-18,-9],[-35,-48],[-38,-44],[6,50],[-33,19],[-29,11],[-36,2],[-11,-7],[-14,-29],[-33,-37],[-22,-15],[-23,-30],[-13,-31],[-12,-44],[-14,-107],[1,-125],[-53,-99],[-20,10],[-10,-6],[-10,-13],[18,-55],[-10,-19],[-9,-13],[-25,-14],[-56,-81],[-53,-52],[-87,-151],[-25,-100],[-25,-113],[12,-55],[10,-36],[16,-25],[28,-27],[59,-29],[-5,-19],[0,-16],[21,28],[15,79],[37,26],[18,-1],[118,-63],[23,-27],[-4,-60],[-7,-28],[-22,-42],[-42,-50],[-49,-69],[-5,-43],[0,-23],[13,-81],[1,-46],[-6,-85],[3,-37],[13,-31],[20,-20],[35,11],[33,-9],[25,-22],[-4,-71],[15,-67],[11,-124],[-21,-34],[-20,-21],[-39,-54],[-21,-6],[-37,18],[-58,96],[23,57],[50,40],[23,28],[17,42],[-26,-8],[-18,-18],[-57,8],[-23,-20],[-28,-32],[11,-80],[-19,-15],[-35,-27],[-52,-34],[-17,-23],[-45,-143],[-41,-107],[-15,-92],[2,-79],[15,-88],[11,-38],[48,-82],[23,-64],[7,-77],[-38,-37],[-67,-89],[-28,-10],[-92,2],[-46,45],[-54,-11],[-45,-22],[-71,-63],[-63,-82],[-60,-57],[-18,-34],[-24,-71],[-22,-129],[8,-64],[12,-30],[11,-39],[-16,-61],[0,-38],[29,-61],[6,-84],[-21,-2],[-49,60],[-52,4],[-124,-69],[-52,-40],[-57,-80],[-17,15],[-12,46],[-21,20],[-26,-10],[-11,-43],[36,-20],[13,-28],[-21,-107],[-15,-36],[6,-95],[-2,-45],[-8,-45],[-37,-123],[-63,-162],[-78,-118],[-54,-41],[-27,-31],[-12,-41],[-80,-113],[-98,-119],[-28,-21],[-6,45],[-3,44],[-12,59],[-36,49],[-6,40],[-6,54],[-3,252],[-31,262],[-3,82],[-38,67],[-21,70],[-12,68],[-3,81],[-41,425],[-13,106],[-55,342],[-24,198],[-16,192],[-2,86],[24,257],[21,160],[74,359],[11,33],[12,17],[128,138],[56,75],[33,80],[36,101],[-4,55],[-4,31],[-14,36],[-30,41],[11,18],[12,14],[31,15],[64,-31],[65,13],[60,127],[86,-19],[65,22],[18,-9],[13,43],[36,46],[66,68],[97,82],[48,55],[27,52],[40,50],[39,62],[71,186],[140,154],[55,88],[45,31],[40,15],[101,126],[64,105],[85,72],[25,46],[44,108],[18,26],[55,41],[124,71],[72,71],[106,10],[31,28],[33,16],[35,23],[-43,63],[10,33],[8,16],[76,74],[31,60],[-4,25],[-5,19],[-47,24],[9,55],[13,48],[38,40],[13,94],[2,99],[37,142],[22,32],[87,71],[20,2],[60,-24],[66,-12],[23,-22],[5,19],[-3,24],[18,9],[38,-10],[-5,27],[-98,14],[-70,31],[-63,60],[-41,17],[-45,-5],[-257,-84],[-12,-23],[-12,-32],[16,-47],[-13,-21],[-12,-14],[-14,-31],[-12,-61],[3,-59],[-31,-92],[-3,-57],[55,-32],[14,-21],[-16,-32],[-17,-19],[-14,-24],[-11,-9],[-15,-6],[-20,31],[-18,62],[-29,4],[-10,-10],[-5,-24],[-25,-2],[-28,12],[-32,-5],[-57,-70],[-319,-333],[-34,-40],[-42,-80],[-79,-8],[-31,-18],[-23,-24],[-31,-16],[1,30],[6,22],[7,59],[43,111],[-27,12],[-27,1],[-50,-23],[-34,-37],[-26,8],[13,33],[31,66],[-9,61],[-9,33],[13,18],[65,123],[23,64],[20,84],[1,26],[-4,32],[-19,5],[-16,0],[-128,-83],[-47,-23],[-15,36],[-21,15],[-35,61],[-30,9],[-31,-4],[-70,-41],[-77,-23],[-59,8],[-51,-35],[-23,-6],[-75,24],[-91,2],[-28,-30],[-79,-41],[-54,-64],[-28,-20],[-31,-28],[-14,-120],[-41,-39],[-38,-29],[-80,-92],[-56,-126],[-38,-54],[-81,-76],[-126,-100],[-110,-162],[-38,-122],[-14,-4],[-27,-25],[-7,-60],[1,-41],[-17,-33],[-17,-42],[18,-26],[16,-5],[24,4],[63,34],[108,-52],[54,-52],[-4,-52],[2,-46],[-40,3],[-53,-4],[-34,-27],[-68,43],[-23,-16],[-36,-46],[-65,-19],[-33,23],[-55,63],[-93,-6],[-24,-71],[-21,2],[-33,-7],[-55,-82],[-18,-8],[-67,16],[-48,42],[-23,2],[-43,-19],[-21,-50],[-107,-25],[-105,5],[-57,119],[107,47],[63,-10],[72,8],[75,37],[-26,31],[-18,7],[-45,-4],[-40,23],[-87,116],[-38,21],[-49,13],[-38,1],[-14,-8],[-20,-28],[-13,-27],[-12,-9],[-26,5],[-31,22],[-37,-7],[16,17],[35,18],[-58,20],[-37,28],[-34,7],[-156,69],[-60,-6],[-37,-19],[-63,-56],[17,-41],[14,-19],[8,-22],[-20,-4],[-58,-4],[-35,33],[-25,-48],[10,-43],[40,15],[21,-18],[-14,-49],[-52,-15],[-65,3],[-65,87],[-107,-15],[-51,-56],[-49,-13],[-131,56],[-66,5],[-74,48],[-26,-15],[-47,-121],[-63,-29],[-32,16],[-29,76],[-20,25],[-56,23],[-298,-22],[-100,19],[-70,2],[-96,-39],[-92,15],[-170,-75],[-70,-50],[-84,-88],[-76,-147],[-42,-55],[-71,-70],[-100,-64],[-54,-65],[-30,-53],[-52,-200],[-14,-30],[-123,-72],[-39,-80],[-17,-20],[-51,-34],[-31,-56],[-17,-16],[-73,-40],[-60,-100],[-85,-70],[-123,-194],[-11,-23],[-10,-52],[-19,-38],[-106,-169],[-33,-16],[-53,-79],[-54,-47],[-49,-56],[-61,-59],[-92,-67],[-31,-39],[-48,-90],[-118,-111],[-59,-27],[-77,-98],[-8,-23],[-6,-36],[13,-63],[19,-14],[31,-9],[115,-62],[107,17],[95,0],[37,6],[23,-2],[8,-34],[-1,-63],[-14,-57],[-11,-168],[-13,-75],[10,-73],[23,-13],[23,33],[37,5],[38,-15],[28,117],[-23,18],[-22,42],[13,31],[66,57],[41,5],[39,-4],[-43,-73],[-17,-15],[-13,-4],[-18,-14],[38,-42],[41,-32],[59,-14],[-14,-25],[-39,-22],[-36,-91],[-56,-44],[-26,-30],[9,-19],[21,-4],[114,12],[59,25],[84,71],[35,105],[32,29],[9,0],[11,-7],[1,-74],[-45,-83],[-32,-47],[-12,-40],[19,0],[37,8],[16,19],[42,101],[11,72],[6,100],[-5,60],[3,43],[-16,43],[11,13],[113,-59],[60,-14],[108,48],[24,-12],[18,-29],[89,-89],[17,-29],[29,-108],[95,-125],[88,-59],[3,-23],[56,-69],[44,-24],[7,-62],[-20,-50],[-41,-48],[-82,44],[-13,-2],[10,-28],[59,-81],[47,-34],[3,-108],[-6,-59],[-31,-66],[10,-38],[44,-56],[22,-22],[22,-32],[-28,-70],[-5,-78],[-30,-35],[-36,-76],[-55,-62],[-26,-119],[-42,-105],[-5,-104],[-7,-37],[-34,-108],[-13,-146],[17,-239],[8,-14],[16,-14],[-3,-17],[-8,-11],[-33,-71],[0,-49],[13,-37],[2,-95],[-24,-153],[-9,-24],[-10,-39],[-4,-36],[-7,-22],[-4,-39],[7,-34],[12,-17],[-43,-110],[-15,-144],[-16,-58],[-31,-57],[-66,-83],[-24,-52],[-43,-66],[-41,-51],[-57,-145],[-46,-145],[-116,-188],[-15,-46],[-9,-50],[-30,-84],[-15,-116],[-35,-46],[-29,-122],[-94,-186],[-23,-63],[-72,-103],[-77,-142],[-96,-128],[-18,-53],[-37,-58],[-40,-90],[-58,-90],[-12,-60],[-19,-42],[-43,-28],[-31,-39],[-95,-231],[-12,-42],[-2,-37],[-62,-86],[-35,-92],[-60,-57],[-62,-78],[-149,-144],[-41,-54],[-83,-68],[-34,-1],[-72,-37],[-47,-38],[-28,14],[-17,50],[-21,-2],[-16,-7],[-43,48],[-37,-3],[-26,22],[-50,-15],[9,205],[-7,43],[-21,-40],[-57,-72],[-23,-14],[-22,0],[9,44],[31,62],[-10,10],[-10,3],[-40,-27],[-20,-30],[-58,-119],[-34,-100],[-28,-29],[-13,-43],[-24,-41],[-37,11],[-22,-7],[-53,23],[-13,-10],[35,-77],[-29,-113],[-12,-14]],[[63178,98417],[127,-23],[95,6],[29,-3],[28,-7],[28,-16],[38,-35],[0,-49],[-17,-2],[-161,22],[-74,51],[-20,5],[-29,-13],[-25,-31],[-27,-8],[-31,-39],[-29,5],[-15,-4],[-37,-27],[-93,0],[-15,-12],[-30,-38],[-38,-10],[-66,-6],[-22,21],[-10,33],[-15,17],[-92,-19],[-69,13],[-67,22],[-68,8],[61,23],[334,48],[131,12],[62,34],[92,22],[25,0]],[[63966,98460],[42,-10],[103,2],[32,-14],[149,-84],[38,-2],[31,-30],[-154,-49],[-52,-36],[-189,-8],[-121,-17],[-26,-15],[12,-26],[-58,-29],[-191,-4],[-24,-9],[-37,-31],[3,-5],[65,-8],[10,-6],[9,-14],[5,-20],[-9,-26],[-24,-4],[-26,3],[-60,20],[-7,-7],[-6,-14],[-19,-28],[-22,-8],[-61,21],[-20,-6],[-19,-13],[-24,-6],[-56,-4],[-29,17],[25,23],[70,35],[-23,15],[-70,4],[-55,-9],[-28,-24],[-26,-5],[-72,2],[-40,31],[-30,12],[-26,25],[211,83],[70,32],[67,16],[87,9],[27,10],[27,4],[17,-6],[44,-29],[129,5],[27,24],[2,56],[-13,33],[27,63],[74,25],[171,34],[43,2]],[[68823,95758],[-111,-44],[-66,-30],[-65,-21],[-66,-15],[-104,-36],[-184,-46],[-116,-37],[-127,-30],[-134,-39],[-134,-27],[-33,-2],[-96,-38],[-75,-16],[-272,-85],[-125,-63],[-36,-5],[-36,3],[-30,-20],[-28,-33],[-59,-34],[-30,-31],[-30,-24],[-18,-8],[-34,2],[-16,-2],[-55,-27],[-10,-22],[59,-14],[13,-24],[-17,-16],[-38,-23],[-22,-23],[-40,-23],[-27,-7],[-65,1],[-4,-29],[11,-18],[-6,-16],[-22,-15],[-21,2],[-99,45],[-16,-15],[-7,-32],[-3,-34],[-13,-25],[-17,-13],[-31,-13],[-109,21],[-9,-20],[17,-25],[23,-54],[5,-22],[-13,-36],[-49,-56],[-187,-67],[3,-23],[21,-44],[5,-27],[-8,-26],[-24,-21],[-28,0],[-15,4],[-43,29],[-37,7],[-7,-14],[49,-39],[21,-51],[-23,-27],[-90,-61],[-47,-80],[-92,-35],[-57,-5],[-56,10],[-53,18],[-135,7],[-75,20],[-76,36],[-66,-3],[-56,-18],[-74,-39],[-47,75],[20,35],[-101,90],[-22,40],[25,19],[31,13],[59,36],[59,29],[61,9],[10,5],[25,43],[27,35],[25,20],[28,33],[89,134],[21,10],[184,26],[16,8],[-53,27],[-54,-1],[-25,9],[-14,19],[-8,22],[21,16],[71,81],[84,58],[78,35],[-19,9],[-25,23],[-95,-6],[-37,32],[-12,19],[-3,19],[31,25],[32,15],[35,-4],[35,-13],[28,-15],[27,-24],[23,1],[85,84],[-13,19],[-5,29],[9,14],[41,13],[27,5],[59,-6],[85,-18],[7,9],[21,56],[21,30],[86,50],[-5,15],[-4,25],[100,33],[65,33],[63,45],[32,9],[32,2],[65,19],[121,22],[71,22],[23,48],[45,17],[90,7],[35,-3],[20,-20],[39,1],[15,11],[16,17],[-5,29],[-1,37],[34,23],[13,5],[102,9],[60,-4],[125,-28],[65,-7],[87,9],[52,-5],[154,42],[261,39],[68,28],[67,33],[34,7],[35,2],[31,11],[61,28],[30,7],[33,0],[30,20],[26,43],[29,33],[79,43],[134,60],[121,23],[75,25],[32,2],[102,-12],[130,-33],[59,-36],[49,-47],[10,-17],[9,-30],[-14,-28],[-9,-28],[11,-22],[-95,-71],[-93,-78],[-16,-17],[-111,-27]],[[65366,94071],[130,-23],[97,-7],[59,-18],[22,-14],[-9,-36],[-17,-14],[-41,-47],[-6,-28],[7,-45],[-6,-33],[-13,-24],[-11,-10],[-73,0],[-27,-13],[-1,-26],[-5,-29],[-24,-42],[-48,-13],[-11,-16],[4,-27],[-17,-21],[1,-32],[9,-18],[2,-37],[33,-54],[-6,-22],[-26,-43],[-8,-53],[-21,-46],[48,-38],[21,-50],[19,-53],[57,-105],[62,-94],[114,-137],[122,-104],[48,-29],[116,-48],[20,-16],[19,-21],[-49,-39],[-51,-14],[-5,-18],[-28,-10],[-138,34],[-7,5],[-15,24],[-16,18],[-35,3],[-35,-11],[21,-22],[23,-7],[40,-41],[-17,-16],[-18,-2],[-82,55],[-7,-7],[-8,-16],[-40,18],[-10,-13],[-31,-6],[-25,15],[0,19],[-5,10],[-125,-15],[-52,0],[-51,7],[-61,36],[-11,-16],[-2,-19],[-23,8],[-51,29],[-37,12],[-133,28],[-94,34],[24,16],[40,8],[1,21],[-7,29],[-1,29],[23,20],[52,-9],[-7,32],[25,6],[47,-18],[18,11],[-75,41],[-82,58],[8,21],[-29,5],[-30,-1],[-25,34],[4,45],[22,31],[-13,6],[-127,-27],[-64,6],[-72,18],[-66,-26],[-67,-9],[-35,9],[-34,20],[-28,26],[-22,45],[-20,74],[-3,28],[4,62],[11,27],[28,52],[19,16],[43,25],[22,6],[51,-12],[51,-1],[22,14],[21,25],[15,32],[35,18],[10,10],[11,20],[12,31],[2,27],[10,26],[32,39],[-12,24],[5,16],[21,29],[-64,7],[-22,13],[-21,19],[6,18],[8,13],[64,48],[28,15],[31,7],[31,0],[33,-5],[32,7],[-34,33],[-3,22],[-13,53],[3,25],[14,21],[30,24],[43,8],[34,12],[33,19],[31,3],[63,-12],[31,2],[34,11],[97,40],[36,11],[38,-3],[50,-15],[55,-28]],[[76812,98545],[10,-26],[36,-21],[18,-21],[183,-67],[80,-8],[36,-17],[10,-20],[-3,-37],[-31,0],[-22,-12],[-124,-15],[-30,-22],[-24,-45],[13,-9],[12,-13],[37,-77],[10,-12],[37,-11],[-33,-29],[-35,-19],[-366,-37],[-249,-15],[-83,-16],[-27,2],[-65,-29],[-127,-38],[-61,0],[-181,53],[-222,45],[-31,25],[-55,15],[-71,12],[-31,51],[45,35],[58,34],[97,12],[92,20],[69,49],[43,48],[78,51],[-135,-13],[-51,7],[5,17],[28,36],[15,12],[49,19],[35,36],[81,25],[39,4],[38,-1],[70,12],[70,18],[66,10],[65,5],[63,14],[62,28],[27,48],[179,5],[28,-11],[22,-29],[26,-10],[31,-6],[79,-48],[15,-14]],[[77131,98017],[64,-37],[31,-41],[-30,-11],[-28,-28],[-13,-34],[-37,-27],[-10,-43],[17,-8],[20,12],[41,41],[53,28],[58,-16],[23,6],[40,39],[-7,33],[16,20],[18,5],[75,-4],[119,-17],[21,-17],[29,-10],[17,-16],[53,-13],[26,-12],[35,-28],[32,-42],[-40,-22],[-22,-40],[-9,-9],[-7,-15],[-3,-35],[-6,-30],[-7,-13],[-5,-17],[5,-45],[-12,-35],[-40,-27],[-41,-1],[-61,18],[-18,-1],[-17,-7],[76,-38],[56,-56],[65,-13],[18,-6],[23,-52],[8,-26],[-108,-62],[-28,-11],[-172,-9],[-113,-18],[-36,4],[-63,15],[-42,-6],[-60,10],[-37,0],[-85,23],[-88,38],[-17,18],[-18,12],[-105,10],[-23,8],[-153,-9],[-26,6],[-47,50],[-27,1],[-84,-29],[-31,2],[-64,19],[-38,24],[-6,8],[-4,29],[-38,15],[-46,52],[-27,54],[-128,28],[-77,7],[-58,-2],[-56,21],[93,78],[123,41],[53,31],[61,42],[25,65],[103,40],[27,14],[36,31],[12,4],[81,-38],[16,7],[15,17],[29,19],[100,3],[85,-8],[32,8],[39,-3],[195,28],[130,8],[24,-5]],[[78578,97496],[-27,-45],[-11,-40],[-83,-133],[-10,-23],[49,20],[44,45],[27,38],[30,24],[34,0],[35,9],[65,31],[66,14],[36,-1],[34,-15],[22,-35],[24,-28],[87,-21],[13,-7],[8,-24],[-7,-25],[50,-25],[69,11],[37,-7],[36,-14],[17,-22],[14,-27],[15,-39],[9,-41],[-8,-55],[-134,-84],[-25,-8],[-62,6],[-61,-9],[-161,-44],[-199,-1],[-57,-39],[-17,1],[-17,7],[-16,13],[-121,-11],[-136,-7],[-136,-1],[-45,-28],[-139,-55],[-127,-42],[-66,-10],[-96,11],[-30,14],[-29,21],[42,27],[30,54],[37,32],[94,61],[11,24],[18,51],[11,20],[15,18],[11,22],[2,33],[6,28],[37,42],[27,20],[29,6],[71,-8],[22,3],[-16,13],[-11,50],[2,16],[10,31],[18,15],[18,10],[11,42],[-5,15],[27,20],[13,27],[32,16],[65,13],[3,34],[10,21],[14,7],[33,6],[18,-1],[24,-34],[26,-28],[34,-6],[34,2],[-20,33],[1,35],[12,22],[16,10],[34,2],[107,-24],[70,-35],[16,-18],[-13,-10],[-31,-6],[-16,-10]],[[88902,95523],[28,-11],[34,7],[32,-15],[30,-61],[14,-16],[15,-11],[15,-5],[45,-2],[20,12],[15,28],[-1,28],[-4,29],[0,39],[7,35],[10,21],[13,14],[74,43],[52,42],[71,-16],[72,-38],[127,-80],[59,-23],[71,-21],[72,-8],[35,5],[69,22],[35,2],[436,-160],[15,-13],[14,-19],[-94,-24],[-61,-42],[-21,-29],[24,-24],[20,-32],[-133,-96],[-53,-25],[-54,-8],[-110,23],[-64,-1],[-62,20],[-69,58],[-29,29],[-25,40],[-8,64],[10,55],[37,16],[32,35],[5,15],[-17,31],[-108,5],[-68,-17],[-61,-18],[18,-117],[13,-37],[18,-27],[98,-123],[22,-17],[65,-24],[55,-53],[-97,-59],[-43,-17],[-42,-10],[-26,5],[-26,12],[-28,28],[-24,30],[-31,23],[-66,-5],[-61,-20],[-61,-14],[-180,-24],[-55,-15],[-55,-5],[-71,28],[-70,39],[-22,1],[-20,-11],[-17,-24],[-9,-38],[-23,-51],[-29,-36],[-31,-16],[-32,-2],[-33,10],[-32,16],[-215,56],[-25,17],[-24,25],[-65,79],[-32,19],[-33,8],[-64,40],[-59,64],[-12,20],[-4,32],[10,23],[51,-11],[34,1],[-21,119],[15,112],[25,19],[97,-13],[-31,37],[-26,49],[16,27],[18,19],[42,15],[56,7],[17,12],[16,19],[31,20],[62,8],[107,40],[29,-1],[27,-21],[26,-30],[28,-16],[88,-39],[60,-35],[85,-71]],[[90776,95259],[73,-4],[107,43],[14,1],[260,-15],[22,-15],[2,-30],[-8,-15],[-4,-22],[32,-21],[84,-4],[53,19],[156,-10],[128,-14],[49,-32],[38,-17],[31,-20],[23,12],[22,20],[18,4],[18,-4],[-49,-122],[-18,-14],[-69,-30],[-137,-42],[-67,-13],[-152,0],[-209,16],[-57,15],[-34,18],[-64,43],[-31,16],[-103,14],[-32,8],[-60,37],[-62,30],[-154,49],[10,56],[20,56],[24,50],[26,45],[28,13],[59,-41],[-1,-47],[14,-33]],[[89655,83175],[60,-145],[2,-32],[-5,-33],[-11,-42],[-4,-44],[7,-39],[-5,-10],[49,-176],[35,-111],[11,-45],[7,-48],[11,-99],[2,-151],[-3,-50],[-8,-49],[-8,-29],[-18,-20],[-8,-54],[-4,-153],[9,-80],[17,-56],[12,-60],[2,-64],[5,-29],[27,-36],[11,-28],[3,-40],[2,-59],[4,-13],[13,-18],[56,-426],[22,-129],[64,-223],[26,-135],[17,-64],[11,-68],[9,-69],[19,-76],[25,-74],[49,-67],[22,-37],[5,-30],[2,-103],[-11,22],[-14,79],[-24,45],[-35,54],[-35,48],[-44,80],[-21,23],[-23,16],[-41,18],[-24,2],[-98,-12],[-40,-16],[-37,-37],[-21,-54],[-16,-108],[-89,-386],[-21,-101],[-8,-108],[3,-85],[6,-31],[26,-84],[21,-49],[15,-21],[18,-14],[11,-17],[10,-23],[18,-57],[23,-128],[25,-91],[11,-28],[28,7],[18,-1],[18,-8],[10,-23],[15,-101],[11,-98],[1,-26],[-20,-75],[-5,-32],[-3,-34],[-5,-27],[-9,-23],[-3,111],[-14,79],[-5,68],[-19,47],[-65,20],[-61,7],[-9,9],[-14,29],[-15,23],[-16,3],[-16,-9],[-27,-33],[-21,-51],[-15,-55],[-13,-59],[-27,-155],[-16,-51],[-20,-48],[-17,26],[-15,30],[-9,43],[-4,48],[-24,161],[10,140],[41,194],[7,63],[-6,60],[-9,60],[-6,113],[1,25],[14,65],[17,62],[20,54],[9,64],[-13,159],[-29,108],[-37,102],[-7,28],[-2,27],[32,128],[11,62],[13,134],[12,74],[9,74],[3,373],[-3,55],[-20,117],[-1,67],[9,84],[13,65],[17,63],[0,129],[-32,119],[-24,52],[-37,63],[-28,35],[-14,27],[14,9],[10,21],[-24,33],[-15,50],[-2,196],[6,49],[18,55],[16,59],[14,137],[5,141],[-9,57],[-4,116],[8,29],[31,38],[49,23],[11,-7],[38,-45],[14,-2],[15,5],[29,21],[16,52],[-21,29],[12,37],[35,13],[3,32],[-13,4],[11,46],[7,45],[-10,42],[-57,104],[-36,76],[60,-1],[18,14],[14,32],[7,33],[19,-13]],[[0,93051],[43,8],[43,15],[40,3],[40,-9],[41,2],[40,15],[32,-2],[33,-9],[122,-21],[23,-7],[39,-27],[22,-10],[22,-16],[23,-27],[43,-29],[65,-34],[14,-10],[10,-26],[-7,-30],[-83,-57],[-67,-15],[-129,-15],[-175,-43],[-72,-12],[-25,2],[-63,28],[-74,12],[99966,-10],[-65,-44],[-137,-11],[-81,-31],[-19,-2],[-40,103],[-6,26],[15,34],[41,42],[17,30],[96,54],[86,71],[47,11],[47,33],[-99967,8]],[[59948,89390],[9,-23],[3,-37],[-9,-24],[5,-20],[-18,-14],[-27,46],[-17,1],[-17,20],[-8,33],[15,9],[7,-6],[33,24],[24,-9]],[[61864,90265],[-10,-8],[-55,27],[-5,21],[2,8],[22,6],[23,-7],[17,-27],[6,-20]],[[64695,92951],[25,-42],[22,-31],[19,3],[14,-16],[4,-32],[-38,-54],[-6,-20],[16,-18],[4,-10],[-27,-8],[-5,25],[-15,24],[-32,19],[-13,16],[-14,38],[-53,40],[-34,-6],[-38,18],[-11,8],[-3,23],[16,19],[60,16],[29,-1],[31,-16],[-2,20],[3,8],[13,-3],[35,-20]],[[96677,83274],[11,-30],[-112,106],[-52,56],[-13,36],[19,0],[23,-34],[32,-16],[48,-46],[44,-72]],[[94643,92639],[-19,-10],[-40,8],[-19,18],[1,42],[2,6],[33,-6],[22,-23],[20,-35]],[[94851,91532],[-12,-1],[9,39],[1,17],[-27,28],[-50,21],[-13,17],[-3,50],[11,78],[-23,42],[8,37],[59,41],[24,31],[27,25],[4,-3],[27,-24],[-2,-52],[-20,-37],[-46,-14],[-6,-25],[6,-44],[1,-57],[5,-51],[28,-52],[6,-26],[-3,-25],[-11,-15]],[[92467,95691],[-27,-20],[-64,33],[24,18],[43,12],[10,-6],[8,-13],[6,-24]],[[91430,96001],[-209,-6],[14,16],[75,40],[191,21],[-38,-20],[-18,-41],[-15,-10]],[[88321,93034],[-69,-49],[-27,6],[-28,24],[-15,5],[-15,-4],[-17,-10],[-22,-2],[-51,26],[-5,16],[5,8],[14,8],[10,0],[32,13],[149,5],[11,-3],[21,-23],[7,-20]],[[79915,96849],[-25,-28],[-35,-14],[-38,23],[-95,-1],[-163,25],[47,16],[257,13],[18,-3],[34,-31]],[[81243,95979],[43,-39],[8,-25],[-13,-6],[-8,-9],[-3,-18],[-12,-1],[-38,19],[-27,31],[-40,7],[-42,31],[-9,13],[11,4],[75,-8],[32,14],[23,-13]],[[76814,95782],[22,-9],[-6,-24],[-29,7],[-38,-12],[1,-20],[-15,-33],[-53,20],[-73,3],[-46,19],[-102,12],[3,27],[16,16],[59,-23],[54,26],[101,-13],[33,19],[73,-15]],[[76745,96213],[-9,-11],[-12,-9],[-33,6],[-65,-16],[-25,9],[-24,18],[-88,-6],[-26,4],[42,22],[120,24],[188,62],[9,-30],[0,-14],[-38,-34],[-39,-25]],[[74864,96306],[-59,-3],[-34,15],[-10,10],[16,26],[23,17],[93,6],[17,-18],[-4,-15],[-42,-38]],[[70738,93820],[-6,-5],[-14,10],[-42,15],[-71,39],[-22,27],[11,30],[16,20],[58,12],[53,-5],[35,-7],[66,-27],[-61,-17],[-26,-37],[3,-22],[11,-13],[-11,-20]],[[70973,94156],[-45,-14],[9,26],[54,37],[100,19],[30,-8],[4,-6],[-42,-39],[-21,-13],[-89,-2]],[[73207,94511],[-14,-14],[-13,2],[-11,-7],[-70,21],[-95,9],[24,22],[68,13],[101,-17],[30,-19],[-20,-10]],[[68706,91894],[-22,-50],[-46,3],[-14,11],[-6,9],[52,54],[32,-2],[4,-25]],[[68488,92477],[3,-23],[-15,8],[-19,26],[-11,32],[-4,64],[7,17],[6,9],[6,-2],[-1,-40],[28,-91]],[[69450,90150],[-49,-7],[-54,44],[-51,86],[10,21],[31,-7],[51,-2],[33,-14],[44,-9],[-5,-40],[0,-16],[14,-17],[-14,-30],[-10,-9]],[[63903,97968],[-23,-8],[-106,44],[-9,13],[91,41],[102,-6],[16,-20],[3,-7],[-69,-36],[-5,-21]],[[64280,97893],[7,-7],[-1,-6],[-99,6],[-173,-4],[-100,32],[106,32],[56,7],[72,27],[89,-26],[-5,-23],[1,-11],[24,-10],[23,-17]],[[64098,98529],[-39,-4],[-27,3],[-29,22],[-10,11],[-2,11],[26,2],[12,11],[4,8],[20,6],[34,1],[45,-12],[19,-24],[-44,-21],[-9,-14]],[[65410,98083],[-79,-27],[-40,1],[-20,16],[32,23],[41,17],[31,-5],[23,-8],[12,-17]],[[65115,98198],[-39,-30],[-129,32],[11,16],[14,6],[0,16],[-12,12],[5,24],[83,-18],[8,-7],[56,-12],[9,-24],[-6,-15]],[[66580,97900],[-100,-19],[-35,6],[-10,9],[-19,9],[-50,12],[7,33],[16,7],[150,37],[72,-21],[30,-51],[-61,-22]],[[66283,98526],[39,-30],[15,-33],[24,-20],[8,-38],[-20,-31],[-60,-6],[-99,-2],[-97,16],[-52,56],[-96,15],[-54,58],[56,17],[68,-8],[109,50],[15,-3],[24,-11],[88,-19],[32,-11]],[[63328,78045],[-4,-10],[-13,53],[-1,32],[8,17],[11,-54],[-1,-38]],[[63962,91696],[5,-56],[-17,-23],[-16,-6],[-7,35],[-13,15],[-48,-41],[-22,-46],[-60,-66],[-123,-47],[-75,-20],[-68,-6],[-63,42],[-35,79],[-6,24],[-4,32],[1,33],[4,50],[7,49],[26,44],[60,52],[59,34],[31,8],[75,2],[214,-117],[48,-30],[27,-41]],[[67603,98329],[-52,-2],[-51,9],[-67,29],[-67,34],[20,18],[63,23],[82,42],[139,9],[67,0],[67,10],[19,21],[13,41],[12,22],[15,17],[74,14],[63,-1],[63,-16],[40,-14],[38,-28],[20,-23],[-6,-28],[3,-23],[18,-21],[-122,-65],[-125,-36],[-326,-32]],[[66098,97996],[-43,-11],[-113,21],[-17,11],[-14,20],[-19,78],[-1,23],[-7,16],[-28,28],[-20,13],[18,15],[124,-11],[266,-6],[136,-28],[40,-16],[39,-26],[-238,-14],[-32,-12],[1,-29],[-9,-26],[-25,-3],[-58,-43]],[[67268,98406],[17,-23],[-10,-37],[-22,-27],[-10,-38],[-86,-9],[-24,-9],[-23,-29],[-87,-18],[-65,-49],[-91,9],[-124,34],[-105,-28],[-69,-8],[-85,42],[-11,10],[-5,29],[5,26],[23,55],[30,31],[15,10],[12,19],[34,11],[105,7],[39,-6],[12,-21],[57,2],[94,13],[137,20],[79,18],[70,-4],[70,-11],[18,-19]],[[66983,98473],[-87,-12],[-141,15],[-73,17],[6,8],[19,10],[122,41],[242,9],[30,-30],[-26,-23],[-92,-35]],[[64866,98032],[-184,-7],[-62,4],[-8,7],[-15,6],[-58,6],[-36,29],[16,8],[85,12],[29,12],[10,17],[38,31],[92,6],[40,-6],[5,-20],[39,-25],[101,-32],[-20,-23],[-35,-3],[-37,-22]],[[65855,98128],[12,-20],[-1,-71],[-13,-31],[2,-26],[-26,-13],[-218,3],[-108,6],[-25,10],[61,34],[19,23],[-6,67],[10,12],[175,-6],[14,19],[66,1],[38,-8]],[[66058,98816],[14,-23],[43,-13],[117,-11],[35,-26],[-53,-19],[-143,-10],[15,-38],[29,-28],[-29,-33],[-40,-16],[-88,-19],[-81,24],[-94,35],[-42,-23],[-44,-14],[-41,2],[-48,27],[-132,-21],[-40,23],[-29,48],[87,10],[104,-15],[69,48],[88,21],[70,51],[33,17],[76,-3],[25,4],[73,13],[26,-11]],[[65199,98568],[209,-55],[194,5],[84,-17],[122,-50],[182,-53],[35,-16],[-31,-21],[-213,-53],[-138,-18],[-120,-3],[-48,6],[-48,38],[-117,28],[-125,-8],[-13,15],[-25,11],[-43,2],[-86,15],[-6,34],[54,17],[35,1],[14,48],[60,73],[24,1]],[[67680,98853],[-34,-8],[-179,7],[-86,14],[-12,8],[-4,7],[-114,12],[49,16],[142,7],[254,-19],[16,-13],[5,-8],[-37,-23]],[[66193,98914],[-92,-12],[-13,9],[-3,6],[10,15],[11,29],[42,17],[313,16],[41,-17],[-15,-26],[0,-12],[-294,-25]],[[75745,97744],[-68,-5],[-80,5],[-130,61],[-85,26],[-70,40],[-15,44],[44,28],[54,11],[91,2],[117,-4],[116,-29],[247,-31],[90,-21],[-56,-51],[-61,-19],[-63,-27],[-64,-19],[-67,-11]],[[75435,98583],[-96,-45],[-346,29],[-16,20],[-5,13],[47,25],[288,-9],[103,-9],[25,-24]],[[89169,94469],[-140,-47],[-27,2],[-63,48],[-23,103],[26,31],[29,11],[30,6],[123,4],[26,-5],[26,-13],[12,-19],[5,-24],[-14,-68],[-10,-29]],[[89495,94409],[69,-25],[57,-28],[196,-135],[18,-28],[15,-35],[8,-123],[-11,-9],[-72,-6],[-98,14],[-70,5],[-68,0],[-60,17],[-147,16],[-115,45],[-120,33],[-25,4],[-75,-10],[-102,-43],[-28,-3],[-39,0],[-27,40],[65,14],[65,5],[63,14],[59,47],[29,38],[51,85],[28,31],[28,20],[30,6],[33,-3],[103,19],[70,6],[70,-11]],[[87763,95281],[-57,-16],[-81,5],[6,42],[14,19],[19,46],[-9,35],[5,42],[10,33],[23,45],[25,-27],[17,-40],[15,-20],[62,-39],[12,-12],[-52,-48],[-5,-21],[16,-27],[-20,-17]],[[87832,94420],[-21,-17],[-20,25],[-93,76],[-23,35],[-51,34],[-13,12],[-4,30],[67,-19],[113,-75],[62,-60],[-17,-41]],[[88316,83578],[25,-23],[39,4],[10,-15],[-31,-25],[-22,-51],[-7,-47],[-9,-18],[-25,-23],[-22,-30],[-19,-19],[-17,-6],[-37,99],[-18,28],[-52,-47],[-12,-1],[12,58],[30,63],[15,9],[30,85],[9,19],[93,-50],[8,-10]],[[96999,91923],[-79,-5],[-158,54],[-56,28],[-42,36],[-48,25],[-9,10],[7,21],[14,16],[54,43],[38,19],[45,4],[283,-76],[12,-16],[4,-14],[-4,-30],[-24,-6],[-9,-20],[-10,-61],[-5,-16],[-13,-12]],[[95453,85600],[-45,-54],[-7,9],[-4,12],[-1,19],[41,36],[42,91],[16,75],[-5,25],[-2,24],[123,47],[87,75],[16,-3],[15,-63],[9,-81],[-12,-49],[-94,-28],[-88,-54],[-91,-81]],[[96291,83432],[-2,-84],[-34,43],[-16,34],[-23,6],[-16,16],[-26,41],[-31,54],[-10,27],[-4,34],[-21,31],[-67,60],[22,7],[28,26],[78,-16],[18,-7],[-13,-40],[5,-44],[43,-92],[21,-32],[28,-25],[20,-39]],[[93002,80248],[-27,-25],[-28,15],[0,50],[59,153],[21,-9],[-5,-37],[-22,-57],[7,-69],[-5,-21]],[[93445,81023],[-11,-13],[-11,3],[-36,36],[-8,17],[13,30],[45,45],[22,-1],[9,-10],[-1,-53],[-22,-54]],[[93310,80819],[-35,-58],[-52,-14],[-25,-19],[-19,-39],[-14,-21],[-30,12],[-13,19],[0,68],[-13,30],[6,19],[30,-3],[30,44],[69,18],[25,47],[31,117],[33,41],[26,9],[8,-58],[-7,-64],[-15,-62],[-35,-86]],[[92799,79948],[-10,-30],[-12,10],[-2,9],[27,35],[10,41],[20,1],[8,-8],[-6,-20],[-35,-38]],[[93234,81118],[-26,-7],[-11,16],[-8,18],[-5,26],[29,12],[19,-14],[4,-38],[-2,-13]],[[92527,79356],[-13,-33],[-14,4],[-5,9],[18,39],[8,7],[6,-26]],[[92222,78857],[-52,-63],[-17,0],[-9,24],[-2,13],[42,10],[48,84],[35,55],[19,19],[16,-1],[-80,-141]],[[91579,78134],[-41,-29],[-26,1],[61,142],[36,21],[46,84],[97,103],[11,7],[56,-3],[-88,-113],[-11,-45],[-39,-48],[-28,-16],[-20,-23],[-54,-81]],[[91277,77947],[-52,-40],[-42,-18],[-71,-84],[-26,-46],[-36,-19],[-35,11],[-10,-19],[-3,-33],[-13,-29],[-70,-91],[-29,-72],[-30,-13],[-56,-73],[10,63],[11,30],[47,56],[3,60],[26,51],[51,52],[35,67],[28,18],[31,56],[32,20],[-3,43],[14,48],[11,-3],[26,-67],[20,-2],[54,14],[80,116],[26,21],[19,4],[11,-10],[4,-14],[-1,-17],[-6,-25],[10,-29],[-13,-22],[-53,-4]],[[90753,77041],[-9,-16],[-20,14],[1,32],[2,9],[57,28],[16,-18],[4,-15],[-51,-34]],[[90612,77475],[42,-42],[58,9],[-14,-38],[-22,1],[-39,-55],[-34,-7],[-17,-13],[-55,-82],[-8,-32],[-33,-62],[-50,-55],[-9,-104],[-32,42],[-4,42],[10,35],[57,74],[23,41],[7,34],[22,36],[10,32],[14,14],[48,131],[26,-1]],[[81496,94700],[-10,-27],[-15,-21],[-11,-26],[-19,-19],[-59,-24],[-46,-54],[-8,-5],[-163,30],[-26,9],[-53,33],[-75,31],[-39,46],[19,8],[19,4],[67,-6],[19,14],[10,39],[1,23],[5,18],[22,13],[241,-40],[93,-23],[28,-23]],[[71180,97725],[34,-21],[26,16],[248,-50],[53,-18],[11,-13],[-217,-8],[-44,3],[-4,29],[-49,1],[-85,19],[-23,27],[-5,11],[27,11],[28,-7]],[[72229,98414],[-258,-21],[-25,13],[-8,8],[36,44],[30,21],[164,8],[131,-14],[41,-13],[-15,-26],[-8,-9],[-88,-11]],[[69631,93948],[-82,-27],[-22,-2],[-50,7],[-22,-11],[-33,27],[2,24],[16,25],[9,31],[-6,78],[42,49],[56,19],[164,22],[23,-6],[33,-15],[25,-18],[33,-43],[26,-18],[40,-34],[12,-33],[-2,-30],[-75,-6],[-130,-25],[-59,-14]],[[71564,93485],[-135,-5],[-67,9],[-10,11],[9,28],[69,42],[31,27],[32,46],[56,38],[47,0],[147,-45],[21,-28],[3,-13],[-58,-38],[-41,-14],[-63,-48],[-41,-10]],[[72083,93733],[-20,-6],[-152,23],[-53,30],[-16,27],[6,24],[141,117],[54,-33],[15,-31],[36,-38],[-1,-86],[-10,-27]],[[72825,95287],[10,-19],[4,-21],[-12,-6],[-36,1],[-20,-54],[-20,9],[-13,31],[-45,-21],[-12,5],[-21,24],[-13,5],[-9,16],[59,48],[36,-25],[24,1],[-5,29],[1,22],[30,9],[40,1],[2,-55]],[[66791,92128],[9,-29],[-1,-53],[-11,-39],[-31,-6],[-31,-16],[-53,17],[-29,-11],[-30,-1],[-24,6],[-25,8],[-16,11],[1,30],[-22,43],[-34,14],[-31,5],[-35,13],[-17,-6],[-22,-16],[-14,5],[-76,92],[-12,21],[-8,24],[-11,15],[-26,64],[13,29],[26,19],[18,5],[32,43],[59,18],[12,-3],[11,-13],[61,-44],[33,-29],[28,-35],[30,-30],[89,-51],[60,-50],[61,-35],[16,-15]],[[55821,83685],[-27,-55],[-74,-116],[23,-15],[27,-5],[32,-22],[30,-3],[53,18],[10,100],[3,90]],[[55898,83677],[17,0],[26,6],[16,-23],[30,-23],[35,-20],[54,-34],[55,-22],[18,-2],[58,3],[61,-3],[17,-51],[30,-24],[25,-34],[1,-18],[-33,-119],[-7,-40],[-2,-40],[13,-51],[11,-28]],[[56323,83154],[-9,-4],[-157,6],[-148,9],[-137,9],[-132,9],[-127,8],[-79,8],[-78,7],[-11,7]],[[55445,83213],[43,49],[28,52],[23,67],[3,46],[6,52],[37,21],[80,-3],[35,25],[44,62],[46,74],[15,32]],[[55805,83690],[16,-5]],[[59722,78187],[6,-19],[66,-146],[31,-54],[24,-22],[28,-3],[53,46],[23,7],[50,-18],[18,31],[26,16],[33,2],[38,-13],[41,-23],[-17,-52],[-17,-41],[-7,-45],[-9,-51],[-46,-23],[-48,3],[-52,-15],[-18,20],[-12,18],[-23,18],[-30,10],[-27,-12],[-32,-69],[-56,-47],[-19,-54],[-56,12],[-47,-10],[-69,-49],[-52,-106],[-57,-66],[-46,-21],[-43,7],[-28,20],[-57,69],[4,25],[8,13],[10,35],[23,131],[-3,43],[-13,66],[-45,52],[-36,-9],[-21,13],[-75,89],[-40,6],[-45,-18],[-16,13],[-13,31],[89,109],[88,90],[38,9],[52,42],[55,63],[-8,49],[-12,37]],[[58251,77914],[-5,-38],[-3,-24],[-12,-99],[-8,-37],[-13,-42],[-142,-49],[9,23],[-3,42],[-6,31],[13,29],[-31,10],[-14,-15],[-11,-28],[9,-62],[-15,-35],[-6,-19],[-1,-46],[-9,-20],[-2,-21],[23,5],[-10,-39],[-43,-76],[-15,-45],[4,-180],[-19,-107],[-1,-32]],[[57940,77040],[-45,-1],[-14,2],[-42,16],[-48,29],[-28,55],[-18,40],[-40,-18],[-8,5],[-11,19],[-31,13],[-37,0],[-85,72],[-9,13],[-67,-13],[-99,-35],[-76,-45],[-79,-78],[-32,-60],[-37,-32],[-52,-23],[-94,9],[-97,30],[-105,32],[-57,-18],[-77,13],[-115,39],[-86,12],[-85,-23],[-14,17],[-4,20],[4,28],[12,23],[20,17],[11,17],[1,18],[-23,29],[-47,39],[-20,24]],[[55622,78403],[11,14],[63,19],[29,-19],[14,7],[13,16],[7,12],[1,14],[6,16],[22,8],[56,-10],[23,23],[8,13],[5,27],[6,23],[20,12],[0,20],[-3,22],[12,50],[7,20],[11,8],[14,15],[24,33],[-6,28],[5,21],[25,51],[19,49],[0,25],[3,22],[16,23],[18,31],[23,96],[9,16],[15,18],[11,18],[1,63],[11,18],[21,21],[20,33],[17,38],[12,19],[17,4],[19,16],[20,5],[20,-7],[13,4],[19,19],[48,71],[7,14]],[[57394,79642],[26,2],[20,-4],[32,-26],[22,-32],[9,-26],[19,-36],[20,-51],[22,-68],[4,-34],[9,-37],[16,-45],[31,-50],[5,-10],[14,-35],[27,-78],[23,-31],[20,-34],[9,-34],[15,-31],[33,-41],[27,-37],[22,-107],[15,-50],[10,-38],[-5,-76],[6,-33],[-12,-60],[-23,-120],[-5,-95],[4,-52],[0,-33],[6,-21],[6,-44],[1,-38],[-8,-11],[-12,-9],[-4,-8],[10,-17],[14,-32],[14,-36]],[[64112,66122],[8,35],[3,22],[-19,167],[-6,128],[2,26],[11,30],[19,66],[9,65],[28,148],[29,57],[43,42],[35,-82],[43,-63],[8,-70],[-13,-57],[-11,-90],[7,-42],[2,-36],[12,-61],[11,-78],[2,-55],[-6,-51],[-15,-42],[-29,-129],[-9,-13],[-36,-22]],[[45224,70776],[38,-30],[35,14],[43,-39],[23,-9],[-20,-27],[-21,-36],[-50,9],[-42,34],[-15,26],[-5,23],[14,35]],[[47942,73259],[-24,-6],[-95,-94],[-29,0],[-55,41],[-96,14],[-32,12],[-39,-27],[-30,1],[-25,-35],[-17,10],[20,77],[31,152],[-1,93],[7,81],[-8,80],[-16,50],[21,130],[-2,67],[-19,84],[59,-13],[-19,34],[-18,20],[-17,-4],[-15,1],[-50,-33],[-25,-10],[-8,6],[3,52],[-13,68],[20,18],[24,5],[20,29],[12,33],[-7,57],[18,55],[40,46],[-21,-7],[-24,-29],[-38,-104],[-12,-53],[-33,-17],[-29,-9],[-14,6],[-18,13],[-2,39],[2,31],[12,62],[4,88],[18,78],[-2,21],[-5,31],[16,30],[19,20],[28,68],[40,160],[47,170],[-4,21],[-10,15],[4,46],[28,200],[11,26],[13,59],[3,94],[5,65],[-1,33],[-4,39],[-18,75],[-18,159],[-2,53],[15,26],[-25,4],[-11,35],[2,38],[28,63]],[[43048,73133],[-2,-11],[-15,5],[-20,-4],[-11,31],[10,13],[22,3],[11,-14],[5,-23]],[[41350,74542],[-12,-27],[-21,10],[-7,10],[6,59],[17,14],[17,-24],[0,-42]],[[42479,74103],[-6,-6],[-58,16],[-16,21],[-7,39],[10,13],[25,8],[37,-7],[24,-28],[0,-36],[-9,-20]],[[42283,74052],[-13,-7],[-74,44],[-26,21],[-34,51],[96,-62],[51,-47]],[[42044,74034],[-29,-1],[-27,44],[40,23],[12,-14],[8,-16],[6,-21],[-10,-15]],[[42181,73993],[23,-23],[-35,-5],[-11,-11],[-29,16],[-33,-3],[-22,31],[-5,33],[11,20],[30,0],[71,-58]],[[42875,73640],[17,-4],[89,9],[24,-6],[-3,-43],[-17,-17],[-52,-11],[-82,27],[-27,37],[-4,27],[0,12],[17,10],[38,-41]],[[55231,80363],[-1,17],[-6,42],[-59,83],[-8,35],[3,13],[-4,22],[-13,13],[-47,16],[-12,-9],[-11,9],[-17,20],[-29,16],[-3,9],[-11,14],[-6,2],[-3,-9],[-9,-12],[-30,-16],[-12,7],[-11,13],[-13,29],[-18,25],[-15,9],[-9,14],[-2,10],[34,21],[7,21],[-4,39],[-5,5],[-13,-13],[-28,-11],[-26,-6],[-13,0],[-73,71],[-48,22],[-28,6],[-3,-7],[13,-40],[22,-49],[-1,-13],[-26,-20],[-15,-9],[-18,-17],[-15,-24],[-12,-10],[-12,2],[-11,12],[-31,73],[-38,55],[-4,13],[-12,3],[-17,12],[-6,18],[9,17],[11,17],[21,10],[6,9],[4,14],[7,19],[-2,6],[-14,21],[-22,20],[-60,-15],[-16,-10],[-9,13],[-7,21],[-16,3],[-20,19],[-25,18],[-24,5],[-50,26],[-19,1],[-11,9],[-12,20],[-10,21],[-5,44],[-37,19],[-37,13],[-2,-7],[1,-43],[-2,-24],[-24,-14],[-24,-2]],[[54113,81139],[2,8],[28,78],[13,50],[15,91],[-18,72],[-5,33],[-8,16],[-50,35],[-4,12],[8,48],[-4,20],[-12,21],[-16,41],[-7,36],[21,42],[5,30],[9,42],[6,23],[1,7],[-13,16],[-3,23],[3,33],[-7,25],[-18,15],[-11,21],[-6,27],[5,41],[13,56],[-29,67],[-72,79],[-35,55],[3,32],[15,28],[28,26],[21,45],[11,54],[1,10],[1,39],[-33,157],[-5,39],[-4,48],[-2,13]],[[53960,82793],[64,-33],[26,-19],[-3,21],[-5,18],[3,27],[-2,40],[-57,20],[-38,7]],[[53948,82874],[-5,28],[4,18]],[[53947,82920],[11,-11],[37,-4],[92,54],[159,70],[170,66],[40,7],[40,14],[14,24],[15,17],[23,43],[51,68],[91,24],[34,32],[70,45],[162,50],[67,11],[66,1],[59,-39],[62,-49],[12,-30],[-34,19],[-49,44],[-18,2],[42,-134],[22,-47],[47,-36],[39,-11],[119,21],[43,28],[12,14]],[[56323,83154],[16,23],[20,-3],[23,-14],[11,-11],[4,-12],[3,-13],[13,-3],[23,-10],[31,-24],[24,-23],[23,-33],[8,-37],[0,-42],[-1,-27],[2,-11]],[[56523,82914],[32,-196],[53,-189],[19,-92],[8,-49],[6,-70],[2,-50],[0,-28],[-4,-38],[-16,-23],[-101,-65],[-20,-20],[-29,-51],[-28,-52],[-6,-18],[-2,-11],[6,-18],[36,-27],[37,-23],[12,-17],[26,-21],[10,-19],[6,-17],[-1,-39],[-12,-54],[5,-40],[-12,-27],[-10,-30],[-2,-53],[18,-58]],[[83638,62566],[43,-30],[94,-108],[34,-27],[36,-20],[28,-5],[26,24],[10,25],[20,67],[20,8],[13,-24],[9,-33],[5,-47],[-6,-50],[-20,-44],[-12,-54],[-8,-177],[0,-53],[7,-51],[17,-81],[9,-23],[26,-29],[7,-22],[1,-39],[4,-35],[17,-13],[14,-18],[-5,-38],[-9,-39],[-12,-97],[-55,-223],[-3,-48],[-22,-96],[-45,-16],[-52,-46],[-28,-36],[-25,-47],[-10,-62],[8,-28],[5,-30],[0,-32],[-8,-27],[-25,-65],[-10,-54],[-11,-24],[-6,-29],[2,-33],[10,-29],[30,-125],[33,-121],[7,-14],[2,-16],[-19,-32],[1,-58],[5,-58],[29,-142],[4,-38],[10,-31],[14,-30],[17,-24],[46,-42],[18,-9],[19,-1],[4,28],[17,10],[-4,28],[-20,38],[0,21],[10,16],[13,9],[28,42],[29,34],[38,-3],[37,-19],[27,-19],[22,-37],[22,-62],[16,-69],[-1,-33],[-3,-33],[0,-33],[12,-22],[36,-1],[18,51],[3,58],[-13,22],[6,28],[11,22],[16,-19],[15,-36],[56,-39],[14,-1],[11,-7],[25,-28],[12,-21],[-14,-45],[-56,-10],[-16,-34],[17,-68],[26,-55],[17,-45],[15,-49],[0,-45],[-9,-46],[24,3],[23,-9],[32,-40],[10,-3],[10,6],[-1,-141],[-22,-129],[-27,16],[-23,54],[4,67],[15,64],[-8,14],[-15,-6],[-17,-14],[-19,-5],[-30,8],[-62,70],[-26,7],[-6,31],[2,67],[-25,80],[-4,28],[-8,23],[-74,86],[-9,15],[-23,69],[-52,98],[-14,10],[-16,3],[-5,-25],[7,-38],[3,-33],[-1,-35],[2,-27],[25,-54],[3,-26],[17,-70],[2,-82],[-21,-34],[-24,38],[-1,31],[-4,29],[-25,74],[-8,16],[-48,74],[-37,80],[-82,86],[-9,5],[-15,-7],[-13,-10],[-40,-43],[-14,-29],[-1,-46],[-28,-36],[-39,-5],[-30,23],[-25,45],[-21,2],[-25,71],[-31,9],[-26,-55],[-5,109],[0,111],[7,33],[13,27],[65,116],[8,38],[-3,50],[-15,40],[-23,25],[-27,10],[-19,23],[-15,38],[-11,-67],[10,-98],[2,-65],[-9,-24],[-17,0],[-16,7],[-11,23],[-9,67],[-23,43],[-9,63],[-10,9],[-21,-5],[-16,29],[-10,74],[-2,78],[-9,66],[-13,64],[-7,52],[-12,235],[-2,21],[-6,18],[-15,27],[-11,32],[-2,27],[3,115],[5,28],[11,13],[16,-22],[12,-28],[15,-14],[14,-17],[25,-69],[10,-10],[31,2],[18,8],[9,25],[5,30],[1,35],[-18,103],[-6,74],[0,67],[5,67],[24,112],[3,77],[-2,104],[4,61],[-1,36],[-14,55],[-4,60],[41,302],[13,58],[9,61],[4,80],[31,22],[29,33],[15,-3],[15,-8],[36,17],[13,1]],[[82586,56704],[-26,-42],[3,52],[7,49],[26,99],[19,31],[31,78],[18,38],[42,75],[39,82],[13,6],[14,1],[12,9],[25,45],[63,147],[53,110],[54,139],[26,41],[7,15],[49,128],[16,18],[17,14],[12,17],[11,22],[17,56],[8,65],[-5,37],[-10,54],[13,74],[9,34],[35,150],[10,31],[14,-19],[2,-27],[-7,-64],[0,-31],[8,-33],[-10,-53],[25,-142],[19,-89],[1,-30],[-26,-53],[-15,-16],[-33,-15],[-15,-15],[-23,-44],[-15,-57],[-4,-30],[-7,-23],[-68,-39],[-31,-25],[-15,-19],[-7,-31],[5,-55],[-57,-199],[-18,-51],[-19,-45],[-24,-31],[-33,-19],[-27,-39],[-18,-68],[-22,-61],[-28,-45],[-30,-40],[-28,-30],[-30,-20],[-9,-27],[-6,-33],[-14,-16],[-15,-8],[-28,-33]],[[84026,58533],[32,-29],[32,25],[31,-7],[26,-38],[-9,-24],[-1,-27],[57,58],[16,-3],[-1,-54],[-3,-46],[-7,-44],[-12,-52],[-17,-46],[-21,-33],[-26,-21],[-12,-19],[-4,-28],[1,-35],[-6,-32],[-27,-14],[-42,-62],[-90,-40],[-25,-27],[-16,-36],[-17,-32],[-10,-8],[-4,15],[-1,13],[13,84],[-3,35],[-6,33],[4,66],[16,62],[8,68],[3,132],[12,182],[-1,22],[-9,25],[-35,20],[-14,19],[7,36],[13,25],[18,-1],[16,-23],[57,-48],[30,-40],[27,-51]],[[84202,57064],[-18,-6],[-20,3],[-13,28],[-22,122],[-26,30],[-30,22],[-15,19],[-14,23],[-42,122],[-3,74],[7,42],[13,38],[14,10],[35,1],[18,5],[40,56],[3,22],[0,92],[-4,64],[-10,62],[11,29],[14,28],[14,55],[3,39],[0,41],[4,29],[12,14],[54,45],[10,3],[71,-41],[14,-62],[1,-20],[-11,-69],[-9,-46],[-24,-71],[-18,-77],[-13,-115],[-8,-38],[-22,-72],[-7,-40],[0,-86],[-4,-32],[0,-31],[44,-143],[4,-23],[0,-26],[-8,-32],[-18,-55],[-10,-19],[-17,-14]],[[84603,58377],[20,-20],[22,8],[27,45],[30,-16],[18,-68],[9,-25],[5,-44],[-2,-106],[-7,-95],[6,-20],[14,-17],[12,-22],[10,-27],[7,-30],[2,-74],[18,-62],[2,-24],[-4,-25],[-29,5],[-3,-21],[1,-27],[-10,17],[-17,60],[-16,26],[5,-98],[5,-48],[1,-47],[-27,36],[-33,23],[-9,19],[4,61],[-1,31],[-14,64],[16,140],[0,29],[-3,28],[-13,57],[-21,47],[-13,0],[-32,-33],[-16,11],[-9,131],[-13,127],[-9,32],[-7,34],[6,28],[13,-11],[17,-34],[21,-19],[10,-16],[7,-30]],[[84788,59059],[20,-47],[4,-34],[-2,-38],[9,-16],[16,-5],[20,-19],[15,-35],[-9,-32],[3,-46],[-16,-59],[2,-105],[9,-33],[1,-33],[-2,-36],[4,-28],[24,-96],[5,-32],[-8,-25],[-2,-24],[15,-2],[21,-40],[12,-53],[-3,-13],[-17,41],[-13,6],[-55,-11],[-33,17],[-22,2],[-21,70],[-19,12],[-15,31],[-25,79],[-8,46],[18,46],[5,37],[-1,36],[-17,-6],[-14,12],[-17,44],[-7,25],[-13,22],[-20,50],[-30,20],[-11,14],[-24,42],[-16,53],[-17,92],[-9,95],[76,-25],[76,5],[86,22],[25,-26]],[[83528,59607],[14,-5],[45,18],[18,-9],[12,-33],[15,-10],[12,-17],[23,29],[22,-33],[20,-63],[24,-44],[22,-33],[5,-25],[-14,-40],[-4,-50],[2,-55],[16,-114],[-5,-31],[-18,-44],[-12,-49],[1,-20],[-5,-16],[-1,-35],[-11,7],[-9,-5],[-9,-16],[-15,-33],[-23,10],[-10,10],[-3,29],[-7,20],[-9,12],[-24,50],[-11,38],[-1,40],[-6,37],[-12,33],[-16,26],[-6,24],[-2,29],[-1,75],[-24,92],[-8,23],[-21,22],[-18,30],[-8,29],[-7,48],[-5,7],[-14,-3],[-13,7],[3,35],[14,25],[19,3],[51,-14],[14,-11]],[[85001,57212],[22,-35],[30,9],[-1,-87],[5,-26],[27,-74],[4,-61],[-16,-59],[-12,-27],[-22,-40],[0,-18],[9,-20],[31,-12],[23,-32],[4,-91],[22,-71],[-1,-31],[-9,-128],[3,-54],[16,-44],[14,-19],[8,-27],[6,-75],[-1,-128],[-2,-44],[-10,-42],[-30,-94],[-40,-75],[-22,5],[-6,-22],[13,-68],[-5,-145],[-9,-100],[-13,51],[-9,53],[-9,140],[-10,64],[-16,57],[-7,52],[-16,48],[-22,125],[-14,-7],[-23,-34],[-5,-23],[-3,-36],[-6,-32],[-27,-51],[-22,-60],[-17,-67],[-6,-61],[15,-47],[15,-20],[21,-42],[7,-20],[23,-139],[-1,-141],[-17,-63],[-42,-119],[-30,-37],[-17,19],[-13,72],[-2,29],[9,68],[1,62],[-10,21],[-12,-4],[-4,-9],[-27,-81],[-12,-21],[-17,-2],[-13,5],[-81,71],[-66,70],[-51,65],[-38,99],[-8,74],[0,77],[-17,113],[-2,38],[2,37],[16,70],[20,35],[12,25],[9,28],[6,37],[-2,37],[-7,23],[-32,82],[-27,50],[-57,45],[-13,24],[-14,19],[-16,8],[-16,0],[-16,-14],[-5,-29],[2,-27],[-2,-26],[-24,-148],[-30,32],[-29,38],[-7,26],[-4,32],[-5,21],[-6,19],[-14,-49],[-16,-39],[-20,-10],[-21,0],[-7,17],[-7,94],[-22,30],[-27,-7],[-33,-52],[-6,-19],[-7,-45],[-36,-127],[-19,-98],[-21,-96],[-9,-31],[-13,-21],[-19,9],[-18,23],[-17,61],[6,72],[19,45],[15,49],[19,171],[1,61],[4,26],[31,77],[26,48],[13,10],[57,28],[23,23],[36,0],[30,13],[24,37],[2,38],[-2,40],[6,24],[9,21],[12,27],[15,20],[40,15],[14,17],[10,26],[16,50],[17,-12],[18,-20],[33,-16],[28,-42],[19,-66],[3,-32],[5,-108],[-7,-25],[-28,-51],[13,-5],[36,46],[19,18],[45,24],[11,16],[7,24],[16,66],[12,71],[9,29],[13,23],[13,4],[47,-48],[31,23],[8,73],[7,106],[6,29],[17,28],[21,-9],[28,-38],[27,-13],[9,31],[10,61],[10,-1],[36,-20],[34,13],[10,73],[-7,78],[-27,226],[16,51],[14,1],[34,-60],[65,-81],[22,-50],[14,-61]],[[84269,57286],[-11,-15],[-4,38],[3,51],[21,179],[-5,45],[36,100],[22,93],[32,99],[5,51],[29,97],[27,134],[-1,45],[7,22],[4,33],[0,29],[20,50],[6,-33],[-6,-64],[1,-30],[3,-14],[0,-60],[-7,-91],[7,-105],[-13,-107],[-15,-48],[-21,-34],[-24,-21],[-25,-53],[-15,-62],[-3,-57],[-39,-192],[-34,-80]],[[83866,62727],[-17,-42],[-10,12],[10,40],[0,14],[8,31],[15,11],[13,-31],[-19,-35]],[[83755,62996],[3,-52],[-17,1],[-24,32],[-3,16],[1,13],[4,11],[36,-21]],[[83877,63574],[-5,-7],[-8,3],[8,55],[14,15],[11,-6],[-20,-60]],[[83854,63814],[-13,-47],[-11,0],[2,26],[14,55],[5,-1],[3,-33]],[[83655,55342],[15,-41],[19,11],[30,-12],[6,-22],[-1,-14],[-32,-40],[-21,42],[-38,-29],[-18,17],[-24,-15],[-15,33],[6,31],[39,51],[34,-12]],[[82521,56384],[-14,-44],[-16,50],[1,71],[5,19],[24,11],[0,-107]],[[83309,57883],[-34,-18],[-8,56],[24,51],[28,-21],[16,-20],[-8,-18],[-18,-30]],[[83360,58852],[15,-9],[11,8],[10,31],[9,-45],[22,-37],[-7,-38],[-20,-4],[-19,8],[-21,-15],[-25,9],[-14,35],[-17,63],[-9,12],[1,26],[6,16],[-3,4],[2,12],[3,8],[5,3],[13,-28],[32,-42],[6,-17]],[[83343,58584],[-21,-19],[-5,12],[-3,28],[0,20],[-20,104],[15,15],[11,-12],[12,-16],[10,-9],[10,-32],[-2,-23],[3,-22],[-10,-46]],[[84068,57875],[-7,-8],[-7,2],[-16,-21],[-6,39],[5,66],[25,50],[6,16],[7,10],[8,1],[8,-20],[2,-30],[-16,-90],[-9,-15]],[[84609,57480],[-3,-21],[-22,2],[-8,-3],[-20,-54],[-12,-14],[-66,-18],[-52,14],[-18,30],[-12,49],[-3,33],[13,35],[12,24],[42,46],[10,35],[22,43],[45,14],[4,-11],[6,-6],[9,-2],[23,-35],[25,-23],[-6,-85],[7,-28],[4,-25]],[[83402,54871],[-7,-35],[-9,-16],[-12,9],[-9,18],[-5,-27],[-24,-10],[-15,-41],[-23,-12],[-15,6],[2,37],[43,54],[27,21],[23,39],[12,5],[6,-33],[6,-15]],[[83914,55546],[-28,-8],[-9,0],[-22,59],[-2,26],[-18,29],[6,29],[23,7],[40,38],[64,-59],[10,-21],[-20,-13],[-14,-56],[-30,-31]],[[85016,57468],[-4,-3],[-15,45],[2,51],[21,76],[15,-67],[0,-30],[-2,-15],[14,-37],[-10,-19],[-21,-1]],[[84913,57554],[-5,-16],[-6,33],[-17,31],[-15,53],[-11,16],[7,42],[1,68],[16,31],[7,10],[11,33],[6,2],[5,-28],[-11,-85],[16,-100],[-6,-62],[3,-14],[-1,-14]],[[83408,59764],[0,-39],[-47,57],[-1,20],[1,14],[5,9],[25,-21],[17,-40]],[[83864,59642],[18,-1],[5,5],[33,-48],[-2,-24],[4,-33],[-19,-55],[-3,-19],[-11,-18],[-35,44],[-13,27],[-4,56],[14,81],[13,-15]],[[83914,58959],[-22,-143],[-15,49],[6,31],[-13,26],[-3,24],[5,31],[13,29],[3,94],[29,30],[11,1],[-4,-23],[1,-43],[-11,-106]],[[84070,58933],[-14,-13],[-29,56],[-17,26],[-4,15],[13,21],[37,0],[19,-39],[3,-24],[-8,-42]],[[84244,59247],[24,-88],[-26,60],[-30,41],[-31,67],[-23,24],[-6,14],[2,28],[17,5],[7,-2],[45,-119],[21,-30]],[[84381,59017],[1,-51],[-10,19],[-34,99],[-9,36],[9,24],[25,-37],[18,-90]],[[84365,58921],[53,-69],[37,-116],[4,-89],[-3,-35],[-17,39],[-38,54],[-26,12],[-8,10],[3,30],[-17,27],[-2,11],[-15,12],[-23,61],[-16,12],[-15,-13],[-35,-91],[-37,-64],[-1,25],[15,79],[10,128],[6,39],[-8,57],[-1,51],[28,-24],[35,-23],[27,-33],[4,-22],[40,-68]],[[84542,59695],[-8,-37],[-9,13],[-12,-2],[-21,-32],[-33,43],[-5,33],[24,73],[0,109],[8,27],[9,19],[11,11],[23,-75],[8,-10],[22,-34],[-5,-70],[2,-41],[-14,-27]],[[83937,59935],[-1,-23],[-60,85],[-3,15],[0,13],[4,14],[60,-104]],[[83897,60486],[5,-20],[-5,1],[-4,-4],[-13,-41],[14,-77],[-9,-56],[-16,-4],[-6,6],[3,28],[4,12],[-3,37],[-10,23],[-7,44],[-12,27],[6,43],[36,5],[17,-24]],[[84531,57952],[-7,-3],[13,61],[10,-9],[3,-6],[0,-28],[-19,-15]],[[84799,57593],[2,-29],[-35,75],[-8,53],[12,-2],[16,-20],[13,-77]],[[84148,56111],[3,-14],[-1,-14],[-29,-27],[-9,1],[-3,44],[7,21],[14,-18],[12,21],[6,-14]],[[84939,55853],[-4,-32],[-17,77],[-7,19],[9,65],[19,-32],[0,-97]],[[84613,58463],[-35,-4],[-15,26],[-19,78],[21,16],[21,-4],[15,-27],[15,-52],[-3,-33]],[[84668,57109],[-8,-34],[-31,28],[-8,25],[4,29],[15,10],[8,0],[15,-31],[5,-27]],[[83680,62835],[-1,-39],[-14,21],[-3,29],[1,21],[6,26],[9,-23],[2,-35]],[[83294,58482],[6,-31],[-8,-46],[-7,-10],[-8,19],[-20,14],[-1,24],[10,0],[18,24],[10,6]],[[84376,58342],[16,-76],[-22,0],[-8,56],[10,18],[4,2]],[[83974,59060],[-8,-18],[-5,3],[-4,31],[8,21],[3,-2],[6,-35]],[[84991,57369],[-5,-15],[-8,31],[7,68],[5,11],[7,-43],[-6,-52]],[[84681,58522],[-5,-30],[-8,8],[-7,14],[-11,44],[-3,33],[16,-18],[9,-33],[9,-18]],[[82598,56575],[-19,-14],[-4,36],[2,35],[14,-3],[6,-11],[1,-43]],[[84360,57164],[2,-60],[-25,-18],[-21,16],[-13,36],[0,13],[11,-1],[26,31],[8,7],[12,-24]],[[30565,49403],[-2,-38],[-9,-15],[-14,-3],[-21,26],[-15,-6],[-15,-2],[-22,31],[-7,31],[-17,25],[-35,-10],[-29,-1],[-24,6],[-22,-8],[-18,-33],[-14,-38],[-16,-31],[-48,-22],[-25,0],[-23,-21],[-33,-8],[-23,-18],[-41,-10],[-49,-10],[-28,-28],[-10,-12],[-28,-39],[-49,-62],[-26,-21],[-33,-67],[-38,-62],[-25,-33],[-37,-16],[-16,-16],[-5,-20],[3,-24],[-6,-60],[-12,-111],[-3,-54],[-2,-26],[-25,-89],[-26,-83],[-13,-55],[-8,-40],[9,-34],[10,-60],[9,-48],[3,-32],[-3,-38],[-11,-34],[-18,-22],[-23,-7],[-49,-60],[-54,-89],[-18,-41],[-5,-39],[-8,-62],[4,-31],[9,-22],[10,-52],[1,-27],[-8,-15],[-16,-3],[-13,-5],[-11,-14],[-10,4],[-10,-7],[0,-22],[3,-25],[-1,-26],[-7,-17],[-5,-12],[5,-17],[10,-15],[14,-25],[21,-48],[15,-9],[13,-16],[1,-27],[-4,-27],[-12,-12],[-1,-23],[16,-28],[10,-21],[11,-30],[9,-41],[0,-27],[11,-34],[6,-28],[0,-27],[17,-27],[15,-20],[10,-18],[11,-12],[2,-20],[-1,-30],[15,-50],[28,-38],[22,-55],[14,-39],[27,-64],[1,-73],[-33,-84],[-33,-84],[54,3],[56,-2],[58,-24],[39,-23],[23,-11],[17,-26],[8,-42],[7,-34],[1,-50],[25,-40],[-2,-38],[-1,-54],[11,-1],[71,0],[78,0],[74,10],[28,13],[34,65],[21,20],[20,30],[24,56],[19,25],[16,31],[23,31],[10,23],[8,8],[19,15],[-8,-30],[-6,-31],[-2,-44],[9,-49],[-8,-36],[-12,-32],[0,-85],[0,-121],[0,-104],[-1,-129],[0,-147],[0,-98],[13,20],[17,17],[23,-45],[16,-20],[14,-4],[15,1],[19,10],[43,37],[29,31],[34,-2],[46,-12],[26,1]],[[30672,45534],[35,-125],[25,-91],[29,-105],[24,-84],[35,-127],[31,-110],[32,-118],[37,-133],[-11,-34],[-10,-27],[1,-46],[-15,-24],[-15,-15],[-19,-38],[-12,-34],[-1,-47],[3,-242],[-3,-66],[-10,-56],[-10,-29],[-6,-22],[15,-56],[13,-113],[10,-22],[13,-46],[6,-44],[-3,-16],[-25,-21],[-9,-18],[-3,-64],[-11,-23],[-18,-31],[-12,-35],[-10,-24],[-10,-14],[-5,-42],[-7,-44],[-23,-28],[-4,-53],[0,-44],[12,-43],[40,-92],[4,-22],[-23,-56],[-13,-38],[-32,-117],[-1,-22],[8,-55],[49,-238],[8,-19],[15,-23],[24,3],[37,-26],[18,-29],[2,-15],[-4,-9],[-20,-20],[-22,-26],[-7,-24],[-2,-39],[5,-57],[-9,-18],[-22,-23],[-18,-32],[-19,-53],[-32,-81],[-11,-22],[-5,-28],[-18,-9],[-34,-55],[-5,-28],[5,-27],[17,-22],[12,-32],[3,-41],[0,-26]],[[30691,41759],[-21,-39],[-27,-44],[-34,-9],[-13,-22],[3,-47],[11,-66],[0,-52],[-10,-60],[-24,-65],[-37,-44],[-35,-24],[-27,0],[-27,-5],[-11,-7]],[[30439,41275],[-20,39],[-91,130],[-34,69],[-32,33],[-78,111],[-8,36],[-9,114],[-11,32],[-26,41],[-68,55],[-26,28],[-27,50],[-40,36],[-44,72],[-26,59],[-29,38],[-91,54],[-45,54],[-85,76],[-38,49],[-91,59],[-27,28],[-90,138],[-62,46],[-51,77],[-153,166],[-24,53],[-23,81],[-34,49],[-38,112],[-57,66],[-54,87],[-20,80],[-36,101],[-11,54],[-32,53],[-2,107],[-22,49],[16,24],[17,11],[21,165],[-12,83],[-56,151],[-21,72],[-15,93],[-22,55],[-34,116],[-21,102],[-45,75],[-12,27],[-7,38],[-25,26],[-1,79],[-17,150],[-25,76],[-90,140],[-2,55],[-7,99],[-20,106],[-99,332],[-26,99],[-25,161],[-22,91],[-25,162],[-37,123],[-24,107],[-25,133],[-2,71],[-45,122],[-24,112],[-42,94],[-42,72],[-18,50],[-58,240],[-8,71],[-40,132],[-40,95],[-25,76],[-32,69],[-195,212],[-69,88],[-23,42],[-10,66],[4,38],[20,36],[28,-27],[17,11],[13,47],[1,72],[-17,92],[-63,177],[5,38],[12,42],[-24,86],[-27,68],[-13,53],[15,200],[14,51],[95,203],[26,86],[40,54],[42,82],[49,62]],[[27687,49891],[8,-11],[7,-10],[0,-21],[2,-18],[5,-17],[1,-32],[6,-21],[1,-23],[0,-33],[-3,-16],[3,-28],[11,-52],[-4,-16],[-11,-11],[-10,-14],[-10,-32],[-15,1],[-22,14],[-15,-18],[-5,-35],[4,-28],[2,-27],[9,-23],[28,-2],[-25,-73],[-12,-33],[3,-21],[15,-18],[11,-2],[25,27],[17,39],[10,22],[16,9],[21,-18],[28,-36],[33,-32],[13,-18],[24,5],[20,7],[17,-26],[17,-22],[4,-76],[13,-55],[15,-42],[19,-51],[18,-17],[22,0],[31,-19],[12,12],[11,35],[5,20],[16,9],[1,23],[-3,28],[5,32],[13,28],[33,42],[15,18],[4,25],[6,35],[-3,19],[-6,23],[1,34],[9,45],[12,52],[11,67],[4,31],[12,20],[4,29],[6,34],[14,38],[0,41],[6,18],[0,46],[15,94],[0,20],[6,5],[11,-6],[9,-22],[3,-21],[4,-9],[9,2],[10,12],[-1,19],[-7,18],[-2,11],[3,18],[15,38],[17,44],[36,92],[22,38],[56,40],[42,30],[41,29],[55,42],[78,58],[56,42],[50,76],[39,58],[33,50],[42,64],[56,138],[40,95],[28,70],[20,44],[16,123],[18,142],[8,62],[3,22],[8,-9],[9,-15],[10,-1],[11,1],[6,8],[-9,141],[1,31],[5,37],[-1,20],[-17,28],[-28,56],[-11,50],[-7,43],[-19,27],[-20,25],[1,20],[12,0],[30,-20],[22,7],[16,2],[15,20]],[[29087,51781],[17,38],[11,0],[13,-5],[23,-39],[14,-22],[17,-19],[15,-6],[15,-2],[9,1],[6,-25],[7,-31],[18,-21],[21,-21],[17,-34],[11,-23],[14,-28],[13,-36],[12,-64],[6,-43],[7,-24],[-2,-24],[14,-45],[11,-24],[18,-16],[35,-18],[19,-40],[16,-16],[18,-41],[16,-12],[20,2],[19,-20],[15,-39],[10,-49],[15,-27],[8,-51],[-9,-58],[8,-32],[16,-25],[25,-27],[23,7],[12,-9],[7,-25],[5,-29],[10,-70],[5,-45],[-10,-43],[-3,-30],[5,-41],[24,-19],[22,-16],[13,-31],[15,-9],[21,2],[27,8],[15,18],[10,5],[11,-8],[24,-17],[29,-19],[26,11],[23,5],[23,11],[23,33],[19,-2],[14,22],[19,35],[17,36],[14,8],[23,-17],[31,-25],[18,-31],[13,-9],[14,-23],[27,0],[29,12],[23,39],[24,12],[16,10],[15,-6],[58,-71],[16,-37],[20,-7],[17,-20],[27,-22],[15,-22],[19,-14],[14,-31],[22,-19],[20,-11],[8,-25],[0,-16],[-2,-12],[-21,-65],[-39,-129],[-36,-116],[-56,-182],[-32,-102],[8,-4],[49,-45],[12,-1],[18,11],[12,18],[11,2],[11,-17],[17,-22],[11,-65],[9,-31],[20,-25],[21,-40],[15,-42]],[[33844,40227],[6,-42],[4,-32],[9,-23],[9,-31],[9,-17],[7,-28],[-2,-33],[4,-41],[4,-37],[5,-9],[13,-10],[7,-33],[-5,-16],[2,-19],[5,-19],[-5,-18],[2,-14],[9,-12],[9,-46],[1,-78],[-10,-42],[-7,-34],[-2,-21],[6,-31],[-9,-36],[-11,-44],[2,-30],[2,-29],[1,-30],[3,-29],[-4,-30],[-4,-27],[-1,-30],[4,-35],[-8,-32],[-5,-23],[-1,-23],[8,-36],[21,-15],[16,-4],[16,19],[12,6],[22,-17],[20,-31],[26,-4],[23,-5],[17,-10],[26,11],[27,-11],[31,-17],[26,-15],[25,3],[20,2],[20,17],[19,-1],[15,30],[8,27],[8,19],[21,15],[14,-10],[12,-49],[21,-29],[9,-21],[15,-9],[34,-2],[21,2],[24,-15],[16,0],[14,-27],[13,-32],[1,-59],[12,-46],[16,-17],[8,-29],[-2,-40],[-8,-40],[1,-44],[8,-40],[0,-40],[6,-40],[11,-34],[4,-55],[-2,-40],[7,-23],[3,-33],[-5,-26],[-2,-36],[1,-33],[6,-26],[16,-35],[5,-61],[0,-42],[7,-49],[14,-23],[22,-8],[26,-7],[31,11],[28,13],[15,14],[31,36],[26,21],[14,13],[13,10],[27,-23],[24,-29],[20,-40],[35,-43],[-6,-11],[-15,-36],[1,-42],[10,-61],[-9,-127],[-28,-196],[-11,-114],[4,-32],[-10,-57],[-38,-123],[-1,-82]],[[34829,37110],[-5,-248],[-13,-174],[-21,-129],[-20,-69],[-17,-8],[-13,-21],[-8,-33],[-14,-27],[-21,-22],[-11,-24],[-2,-26],[-20,-16],[-38,-8],[-23,-21],[-6,-34],[-13,-27],[-19,-20],[-9,-33],[1,-46],[-11,-40],[-23,-33],[-21,-1],[-19,31],[-25,21],[-33,10],[-26,-8],[-22,-26],[-19,-41],[-17,-57],[-18,-9],[-21,38],[-26,11],[-31,-15],[-25,5],[-18,26],[-28,3],[-39,-20],[-77,23],[-117,65],[-99,25],[-121,-23],[-11,68],[7,37],[19,27],[13,32],[5,35],[13,27],[23,18],[9,19],[-3,19],[4,16],[13,15],[7,23],[2,31],[5,15],[8,12],[1,21],[-4,67],[0,55],[6,43],[8,25],[5,7],[5,15],[2,26],[8,24],[38,49],[15,27],[1,24],[6,33],[23,71],[7,34],[1,16],[8,17],[27,40],[16,37],[2,35],[-7,39],[-16,45],[-49,110],[-38,50],[-49,42],[-33,13],[-15,-14],[-16,11],[-16,38],[-27,29],[-57,33],[-128,129],[-52,62],[-17,39],[-48,69],[-79,100],[-61,48],[-42,-2],[-67,29],[-93,61],[-54,59],[-14,57],[-35,57],[-54,57],[-28,38],[-2,18],[-16,24],[-31,29],[-33,50],[-36,71],[-38,109],[-41,148],[-44,100],[-47,51],[-23,35],[0,16],[-7,16]],[[32597,39035],[6,29],[17,112],[25,164],[25,169],[31,199],[0,141],[0,149],[43,122],[30,87],[27,83],[26,142],[18,94],[68,23],[116,49],[57,24],[122,52],[123,53],[130,3],[125,3],[97,-117],[74,-90],[82,-99],[5,-21],[6,-83],[-6,-96]],[[92490,49103],[-21,-44],[-13,41],[-16,36],[-13,36],[-17,79],[0,40],[4,42],[1,43],[-8,87],[-19,78],[-68,189],[-21,49],[-24,44],[-16,11],[-31,11],[-14,8],[-26,31],[-24,36],[-60,106],[-31,30],[-17,37],[-94,120],[-27,28],[-34,0],[-28,24],[22,15],[5,40],[-5,41],[47,-67],[50,-58],[14,-47],[25,-3],[45,-38],[30,-35],[29,-40],[33,-58],[62,-45],[9,-17],[32,-75],[42,-64],[14,-35],[177,-301],[30,-85],[2,-58],[-6,-22],[-19,-49],[1,-58],[-6,-51],[-16,-52]],[[92198,49368],[14,-12],[42,60],[22,-42],[28,-20],[30,-12],[-12,-86],[4,-40],[7,-40],[-1,-59],[-13,-52],[-26,-76],[-12,-15],[-13,-8],[-43,-6],[-8,-40],[3,-43],[23,-57],[18,-63],[-18,-59],[-30,-40],[-29,-21],[-47,12],[-50,-5],[-10,-22],[0,-37],[-7,-28],[-9,-25],[-25,-53],[-29,-46],[-38,-45],[-13,-10],[-35,-7],[-31,-26],[-13,-25],[-15,-20],[-33,-22],[-32,-43],[-12,-8],[-66,-7],[-95,-2],[-28,-5],[-27,6],[-15,17],[-32,79],[-28,26],[-30,0],[-41,-28],[-8,6],[-80,116],[-25,28],[-26,21],[-32,15],[-30,23],[-18,55],[2,72],[24,42],[37,-21],[14,0],[14,12],[16,-4],[17,-10],[60,15],[34,-22],[34,-29],[32,-6],[32,6],[43,33],[14,-4],[42,0],[36,44],[14,177],[9,60],[13,14],[9,-4],[13,-30],[-17,-38],[-8,-29],[-2,-71],[9,-69],[22,-54],[32,-7],[29,36],[32,7],[30,-35],[30,6],[14,23],[16,10],[16,4],[14,13],[20,60],[13,67],[19,52],[52,88],[15,11],[17,6],[37,-4],[27,32],[2,70],[-4,72],[-31,167],[-2,27],[4,30],[9,27],[31,0],[32,-9],[13,-26],[14,-20]],[[89159,46590],[0,8],[0,117],[0,117],[0,117],[0,117],[0,117],[0,117],[0,117],[0,117],[0,117],[0,118],[0,96],[-16,38],[-15,57],[3,74],[19,92],[9,61],[0,50],[0,117],[0,117],[0,117],[0,117],[0,118],[0,117],[0,117],[0,117],[0,117],[0,117],[0,117],[0,117],[0,117],[0,117],[-1,118],[0,117],[0,117],[0,70],[0,39],[0,2]],[[89158,50339],[9,0],[28,-1],[22,-9],[140,-125],[41,-50],[14,-12],[14,-1],[14,-5],[62,-70],[94,-69],[99,-67],[31,-14],[31,-6],[69,-23],[37,-21],[53,-82],[27,-25],[25,-46],[35,-50],[15,-12],[15,-6],[35,-2],[35,9],[15,-4],[14,-9],[13,-17],[6,-33],[22,-47],[31,-20],[29,-42],[27,-50],[19,-50],[22,-43],[34,-18],[35,-2],[120,-253],[6,-39],[1,-165],[-13,-129],[30,-40],[40,-15],[58,-28],[55,-41],[175,-174],[24,-15],[35,-6],[36,3],[13,-9],[26,-32],[14,-20],[24,-57],[21,-61],[9,-17],[11,-14],[6,-33],[9,-103],[-3,-64],[-9,-24],[-28,-11],[-99,-11],[-65,12],[-46,-65],[-2,-28],[4,-27],[40,-137],[23,-121],[20,-50],[29,-40],[26,-48],[24,-54],[50,-95],[27,-36],[31,-21],[53,-74],[7,-33],[16,-103],[6,-69],[1,-29],[4,-26],[46,-63],[11,-18],[20,-140],[16,-65],[27,-24],[31,2],[85,42],[12,1],[16,-10],[14,-23],[4,-63],[-13,-66],[-4,-64],[17,-52],[43,-41],[16,-12],[78,-13],[30,-11],[30,-17],[11,-16],[-8,-28],[-15,-14],[-18,-6],[-29,-20],[1,-36],[16,-38],[15,-45],[12,-17],[14,-11],[33,-15],[33,-22],[22,-22],[22,-15],[48,-10],[36,-29],[51,12],[-44,-47],[-15,-11],[-53,17],[-10,-18],[22,-50],[32,-34],[12,-19],[-9,-23],[-37,-46],[-16,-6],[-29,-4],[-50,20],[-35,25],[-9,34],[-10,20],[-31,49],[-23,26],[-28,9],[-30,-1],[-53,28],[-116,20],[-27,12],[-35,39],[-16,6],[-18,-12],[-44,-8],[-13,3],[-32,33],[-33,12],[-14,-9],[-14,-3],[-44,24],[-34,10],[-28,33],[-15,30],[-17,28],[-16,70],[-24,67],[-31,54],[-65,89],[-13,22],[-25,81],[1,54],[9,54],[-14,-19],[-16,3],[-44,36],[-18,42],[-30,116],[-19,62],[-44,108],[-13,64],[-18,56],[-12,21],[-9,24],[-9,32],[-12,21],[-62,49],[-11,15],[-12,8],[-46,5],[-26,8],[-50,39],[-26,12],[-31,7],[-30,15],[-15,15],[-10,25],[-6,59],[-25,-7],[-25,10],[-24,21],[-24,13],[-17,-18],[-5,-47],[-8,-2],[-14,9],[-7,-5],[-16,-22],[-12,-29],[-23,4],[-47,30],[-21,18],[-18,34],[-15,38],[-16,29],[-19,22],[24,-51],[56,-228],[-14,-4],[-14,6],[13,-44],[-15,-6],[-15,0],[-32,19],[-31,6],[-10,-9],[7,-16],[11,-49],[9,-50],[-46,-23],[-46,-14],[-52,-27],[-53,-2],[-27,16],[-28,9],[-26,-9],[-25,-20],[-21,3],[-14,36],[-6,27],[-8,23],[-20,-4],[-19,-12],[33,-2],[10,-30],[8,-36],[23,-32],[29,19],[61,-5],[60,-57],[14,-7],[13,-11],[31,-56],[24,-51],[19,-59],[4,-23],[-1,-61],[-6,-30],[-39,-43],[-41,-33],[-61,-63],[-59,-73],[-31,15],[-28,38],[-10,10],[-29,21],[-18,7],[-69,-16],[-70,-8],[-30,1],[-28,12],[-32,23],[-31,-11],[-21,-26],[-23,-4],[-44,59]],[[91117,48486],[-11,-4],[-5,26],[-26,23],[-26,70],[1,61],[3,17],[15,1],[57,-70],[6,-22],[-4,-66],[-10,-36]],[[90560,49120],[-19,-17],[-13,13],[-6,38],[5,36],[16,29],[10,9],[12,-20],[4,-38],[-9,-50]],[[92408,50038],[-7,-51],[-17,30],[-12,42],[8,20],[19,11],[9,-52]],[[92249,50145],[-3,-29],[-9,1],[-24,57],[-4,15],[5,14],[28,-41],[7,-17]],[[91601,50948],[-1,-21],[-20,11],[-6,-3],[-34,60],[0,37],[9,31],[15,-5],[25,-39],[12,-71]],[[91966,46071],[12,0],[20,43],[17,13],[11,-20],[-18,-137],[-16,21],[-60,38],[-2,54],[-15,18],[-10,53],[-20,58],[-4,38],[12,-16],[12,-38],[53,-79],[-2,-25],[10,-21]],[[91762,46374],[-4,-14],[-16,10],[-46,80],[7,59],[21,30],[31,-33],[10,-49],[3,-27],[-6,-56]],[[91973,46812],[5,-41],[-22,44],[10,50],[2,27],[-1,15],[-22,26],[11,42],[13,14],[7,4],[0,-59],[6,-27],[-9,-95]],[[92855,45298],[-4,-31],[-10,10],[-30,-16],[-16,4],[-9,28],[-3,13],[27,-10],[-5,31],[38,-16],[12,-13]],[[89884,46957],[-12,-2],[-49,39],[-12,29],[57,-7],[15,-7],[3,-40],[-2,-12]],[[90881,48714],[-15,-3],[-26,54],[-6,21],[3,28],[32,39],[21,-35],[4,-75],[-13,-29]],[[90851,50714],[93,-38],[6,1],[-1,13],[1,4],[6,-10],[-2,-27],[-15,-7],[-13,3],[-10,-15],[-26,-52],[-18,9],[-22,-12],[-38,-1],[-50,23],[-13,-20],[-18,6],[-17,-22],[-8,1],[-4,32],[1,16],[20,14],[-3,49],[17,25],[29,-3],[27,17],[58,-6]],[[91787,50309],[-55,-8],[-20,9],[-18,33],[-16,52],[-16,12],[-7,11],[39,39],[35,12],[56,-49],[6,-25],[0,-16],[-1,-53],[-3,-17]],[[91813,46459],[39,-48],[21,14],[12,-7],[25,-55],[1,-40],[4,-34],[-1,-15],[-14,-21],[1,24],[-10,4],[-37,-1],[-28,15],[-39,4],[16,36],[4,14],[-21,59],[0,28],[1,15],[17,8],[9,0]],[[92397,46682],[16,-9],[33,4],[11,-33],[16,-11],[13,-15],[12,-22],[0,-13],[-3,-12],[-7,-10],[2,-23],[-12,3],[-16,-12],[-30,27],[-11,6],[-3,24],[-19,39],[-35,28],[18,23],[15,6]],[[92648,45232],[46,-30],[16,-34],[-17,-15],[-40,-10],[-10,20],[-39,21],[-6,37],[-19,-13],[10,27],[-25,29],[-7,40],[-1,16],[28,-19],[64,-69]],[[89885,46869],[5,-25],[-40,35],[-39,58],[-19,15],[-13,38],[24,-28],[41,-27],[41,-66]],[[91076,50527],[-9,-30],[-21,3],[-9,9],[15,6],[6,25],[7,8],[11,-21]],[[92209,50212],[-6,0],[-1,46],[4,24],[16,-16],[2,-42],[-15,-12]],[[91915,45757],[-4,-45],[-22,13],[-5,10],[4,28],[20,1],[7,-7]],[[92682,49481],[-2,-13],[-17,15],[14,30],[6,2],[-1,-34]],[[93321,47991],[-7,-54],[-5,-9],[-7,20],[-24,-20],[-11,-22],[-13,-17],[-28,4],[-27,15],[-26,28],[-23,35],[-23,55],[-14,57],[7,66],[-9,60],[-44,43],[-10,14],[-19,59],[-19,26],[-25,52],[-6,23],[-11,66],[-3,40],[9,116],[-4,58],[12,-5],[13,-23],[15,-16],[35,-11],[27,-46],[25,-90],[4,-30],[8,-21],[26,-38],[14,-25],[26,-98],[15,-21],[17,-9],[16,-14],[27,-43],[24,-49],[17,-51],[12,-55],[9,-70]],[[92957,48713],[-6,-4],[-12,72],[-2,54],[-4,40],[-6,24],[18,43],[8,12],[13,-23],[2,-51],[11,-43],[-8,-95],[-14,-29]],[[28507,56830],[-5,-8],[-16,-45],[-8,-39],[20,-41],[6,-44],[11,-47],[17,-47],[20,-89],[4,-35],[-5,-23],[-19,-14],[-17,-41],[-5,-51],[3,-25],[-52,-80],[-13,-13],[-9,12],[-11,40],[-13,33],[-8,11],[-4,1],[-4,-8],[-2,-17],[7,-76],[-6,-30],[-17,-24],[-20,-123]],[[28361,56007],[-8,16],[-67,165],[-58,205],[-12,93],[15,6],[14,-3],[8,15],[9,27],[-7,63],[28,47],[11,32],[7,-3],[19,-55],[26,-31],[33,-46],[21,-10],[-26,47],[-44,63],[-13,42],[-12,57],[-17,-25],[-8,-21],[-9,-12],[-8,15],[-1,18],[-26,4],[-7,17],[-7,9],[3,-36],[5,-22],[-2,-27],[-9,-1],[-7,27],[-9,25],[-13,105],[-29,49],[-14,16],[-11,7],[-17,33],[-22,18],[-29,52],[-37,37],[-44,14],[-54,-9],[-19,-20],[-12,-27],[-6,-12],[-32,-30],[-12,-43],[-7,-37],[-16,-42],[18,-25],[-104,-142],[-21,-20],[-47,-15],[-11,-15],[-14,-28],[-2,-42],[2,-37],[14,-28],[12,-17],[29,-85],[52,-106],[9,-39],[8,-57],[-15,-27],[-12,-11],[-49,-5],[-17,-23],[-7,-35],[-18,-29],[-64,-28],[-49,-3],[-16,33],[-4,92],[-33,158],[-8,108],[-8,-13],[-18,-13],[-6,-27],[-5,-80],[-6,-27],[-14,2],[-28,29],[-37,26],[-48,170],[-5,32],[-9,38],[-37,16],[-32,29],[-34,4],[-17,-16],[-18,21],[-3,46],[-36,-21],[-47,7],[-41,20],[-28,-10],[-24,-33],[4,-85],[-7,-16]],[[26978,56492],[-1,34],[-9,40],[-10,33],[-20,34],[-1,12],[8,18],[38,49],[4,21],[1,43],[-4,41],[-17,60],[10,38],[19,30],[20,24],[4,10],[-4,20],[-12,22],[-27,38],[-16,3],[-1,108],[1,116],[4,11],[10,7],[8,18],[5,34],[11,12],[22,-26],[22,-24],[9,8],[7,11],[5,12],[1,10]],[[27065,57359],[18,-31],[36,-54],[2,-27],[-3,-26],[10,-74],[18,-10],[19,14],[5,-14],[-4,-13],[-9,-15],[-3,-64],[31,-30],[15,-26],[51,13],[19,-7],[13,7],[-14,51],[-19,38],[1,17],[15,-13],[11,-25],[25,-32],[46,-111],[53,-26],[42,3],[39,15],[63,43],[45,78],[36,34],[116,74],[42,77],[17,10],[17,10],[36,58],[20,46],[21,22],[62,-16],[39,-22],[28,3],[27,-15],[11,-33],[12,-14],[65,3],[54,-16],[117,-98],[70,-97],[37,-103],[90,-133]],[[28084,56609],[-6,-24],[-13,54],[2,14],[-1,49],[13,13],[9,1],[7,-7],[5,-58],[-4,-26],[-12,-16]],[[27332,56067],[-15,-3],[-31,24],[-23,48],[-2,15],[1,16],[12,49],[17,17],[6,0],[16,-57],[-11,-21],[5,-35],[22,-26],[3,-27]],[[27157,57246],[-3,-27],[-21,49],[12,8],[5,-1],[7,-29]],[[28037,56597],[-12,-25],[-5,24],[9,25],[3,0],[5,-24]],[[86436,53586],[-6,-3],[-4,2],[0,8],[4,9],[6,4],[4,-3],[0,-8],[-4,-9]],[[87387,56095],[-17,-12],[-8,44],[3,51],[11,39],[12,13],[2,4],[12,51],[3,-28],[-8,-93],[-9,-37],[-1,-32]],[[71323,72385],[13,-52],[19,-78],[13,-51],[14,-58],[7,-29],[13,-50]],[[71402,72067],[-5,-27],[-9,-41],[-30,-30],[-30,-23],[-7,-12],[-3,-18],[-14,-35],[-28,-29],[-24,3],[-15,8],[-79,-51],[-36,2],[-29,-33],[-21,-30],[-42,-33],[-29,-1],[-43,20],[-52,37],[-21,22],[-19,-1],[-47,5],[-45,18],[-54,22],[-27,10],[-55,19],[-35,-26],[-33,-23],[-26,-16],[-22,-71],[-9,-26],[-10,-36],[-5,-25],[4,-31],[32,-21],[13,-30],[2,-26],[-11,-27],[-10,-21],[0,-19],[5,-18],[8,-14],[45,-9],[27,0],[10,-8],[2,-25],[-10,-34],[-38,-28],[-22,-29],[-7,-39],[1,-30],[7,-21],[18,-23],[17,-27],[6,-22],[-3,-30],[-6,-41],[-19,-48],[-16,-34],[-1,-12],[4,-18],[12,-27],[22,-39],[27,-31],[17,-9],[5,-8],[6,-37],[2,-38],[-7,-29],[13,-24],[36,1],[29,-10],[13,10],[8,-8],[-5,-86],[4,-51],[7,-15],[29,-21],[55,3],[33,-24],[36,-28],[19,-31],[8,-22],[-2,-37],[-20,-43],[-32,-21],[-19,-9],[-92,-81],[-29,-34],[-22,-41],[-8,-31],[-4,-30],[19,-108],[4,-34],[-17,-118],[-4,-43],[6,-31],[19,-11],[5,-26],[2,-19],[-35,-43],[-35,-39],[-12,0],[-34,-71],[-58,-144],[-30,-49],[-2,-23],[-3,-24],[12,-41],[2,-34],[-13,-35],[-21,-40],[-42,-34],[-53,-36],[-24,-21],[-18,-93],[-16,-94],[-8,-34],[-28,-108],[-50,-158],[-13,-35],[-77,-76],[-79,-83],[-14,-32],[-16,-75],[-15,-83],[-14,-44],[-50,-97],[-17,-75],[-5,-49],[-42,-27],[-49,-26],[-70,-9],[-29,-13],[-86,-68],[-22,-3],[-16,12],[-13,23],[-12,38],[-6,59],[-16,26],[-23,23],[-23,1],[-24,-25],[-20,-27],[-14,-23],[-14,-26],[-26,-89],[-43,-128],[-48,-92],[-17,-28],[-11,-21],[-15,-31],[-9,-30],[-12,-97],[-6,-86],[3,-19],[7,-17],[26,-25],[37,-41],[49,-24],[41,-4],[16,-18],[9,-24],[2,-20],[-2,-71],[-4,-77],[-16,-82],[1,-47],[6,-46],[45,-117],[17,-12],[34,-3],[16,2],[18,12],[13,-8],[9,-14],[2,-24],[-1,-117],[14,-53],[27,-72],[22,-82],[20,-99],[19,-77],[8,-40],[-13,-20],[-7,-20],[-2,-27],[3,-29],[-2,-20],[9,-25],[11,-8],[0,-17],[-17,-23],[-15,1],[-12,-10],[-23,-48],[-10,-9],[-14,-4],[-16,4],[-22,19],[-7,30],[3,32],[-5,18],[-16,-3],[-56,-32],[-53,-40],[-9,-27],[-12,-28],[-25,-12],[-35,-3],[-25,4],[-23,30],[-21,28],[-32,1],[-58,-4],[-32,0],[-19,10],[-18,-7],[-24,11],[-10,-15],[-10,-1],[-8,26],[-5,2],[-6,-4],[-5,-8],[-4,-15],[-1,-174],[-38,1],[-27,1],[-30,-10],[-27,-13],[-14,-16],[-19,-25]],[[68934,65585],[-4,-34],[-10,-26],[-13,38],[-9,17],[-9,-13],[-14,2],[-26,42],[-11,-43],[-42,-9],[-5,32],[-1,30],[-23,-22],[-17,34],[-7,45],[-6,12],[-8,15],[-17,15],[-16,48],[-1,51],[-4,60],[-33,224],[-20,21],[-110,39],[-6,40],[8,105],[-3,66],[-36,88],[-10,61],[-29,52],[-29,15],[-30,-7],[-15,-20],[-9,-35],[63,8],[14,-13],[17,-23],[-18,1],[-21,11],[-26,-1],[-98,-26],[-56,-37],[-76,11],[-96,-36],[-79,-2],[-33,-71],[-18,12],[-14,18],[-109,56],[-7,23],[-18,17],[-20,-30],[-15,-5],[-59,25],[-46,-19],[-17,-32],[-1,-50],[-57,10],[-32,15],[-43,-17],[-98,23],[-25,-6],[-36,-33],[-15,-26],[-21,-10],[-18,36],[-14,16],[-13,-10],[-18,-30],[-50,-14],[-46,4],[-49,28],[6,9]],[[67107,66360],[8,48],[7,172],[8,62],[-2,34],[2,10],[19,31],[4,12],[8,88],[8,98],[9,35],[7,9],[61,44],[11,29],[31,-7],[3,7],[3,34],[14,36],[21,30],[15,11],[54,19],[32,26],[10,2],[85,-6],[18,10],[3,9],[5,99],[15,16],[3,8],[-5,69],[3,45],[17,27],[-1,16],[-12,32],[-17,21],[-8,5],[-70,-20],[-29,7],[-14,12],[-2,9],[2,20],[1,32],[10,51],[3,30],[-8,175],[-12,116],[6,115],[-1,24],[-2,5],[-9,0],[-43,-10],[-36,74],[-22,30],[-62,36],[-27,7],[-40,32],[-37,70],[-37,72],[-15,45],[-17,78],[-47,149],[0,39],[-6,23],[-46,98],[-33,70],[-53,112]],[[66900,69042],[106,-63],[83,-48],[133,-78],[103,-60],[29,-10],[303,52],[112,-40],[36,-22],[5,13],[15,27],[26,27],[35,21],[36,12],[51,1],[34,-1],[25,-7],[49,4],[24,10],[81,43],[54,29],[82,44],[60,33],[15,17],[15,32],[8,28],[-19,43],[-2,38],[12,48],[7,74],[-2,104],[-4,61],[17,112],[14,63],[28,30],[19,19],[8,13],[8,15],[30,86],[27,40],[26,24],[29,-3],[25,-33],[47,-15],[46,10],[40,25],[18,20],[21,18],[-1,20],[-24,18],[-14,25],[-5,31],[14,18],[31,6],[77,74],[31,49],[9,23],[15,3],[29,-23],[34,-8],[22,23],[21,5],[21,-25],[11,-29],[20,-36],[24,-7],[29,19],[30,41],[29,58],[26,56],[-7,180],[-4,107],[14,55],[19,35],[13,53],[-1,47],[14,40],[13,107],[19,26],[37,17],[61,11],[47,49],[47,52],[7,46],[-18,50],[-24,95],[-22,57],[-52,103],[6,63],[29,26],[72,-44],[20,-9],[25,-6],[66,1],[54,17],[57,39],[11,41],[-1,48],[1,40],[1,56],[-20,35],[-12,32],[-4,25],[14,14],[14,26],[13,47],[31,57],[19,51],[18,24],[27,33],[17,48],[8,29],[16,29],[5,18],[-4,17],[-8,21],[-9,23],[0,23],[7,24],[8,22],[-3,30],[-5,50],[-14,29],[-10,68],[-16,68],[-8,27],[-15,34],[-34,35],[-10,24],[13,46],[22,29],[42,70],[23,48],[21,34],[27,-5],[15,3],[14,31],[27,28],[49,57],[17,39],[26,19],[21,5],[29,13],[28,21],[25,16],[40,3],[63,9],[35,10],[81,8],[89,3],[11,1],[38,-21],[26,-17],[11,2],[43,41],[66,50],[30,22]],[[70705,73169],[17,8],[25,0],[21,-14],[21,-19],[13,-15],[16,9],[30,11],[25,-8],[56,-35],[8,-17],[13,-84],[10,-7],[32,19],[26,-10],[29,-27],[19,-26],[12,-28],[14,-46],[5,-36],[6,-44],[-1,-123],[-10,-20],[-8,-26],[2,-23],[9,-18],[18,-12],[17,-8],[9,-19],[12,-70],[9,-10],[20,0],[38,15],[32,24],[14,5],[3,-66],[19,-25],[26,-29],[11,-10]],[[66311,63489],[-17,-8],[-6,4],[1,73],[40,91],[27,106],[19,-94],[-33,-53],[-17,-91],[-14,-28]],[[65663,66232],[28,-152],[42,-142],[37,-78],[38,-106],[59,-98],[27,-33],[108,-69],[60,-25],[82,-25],[57,-53],[19,-3],[29,15],[22,-1],[54,-73],[16,-69],[23,-36],[20,-57],[13,-60],[45,-92],[33,-103],[33,-76],[29,-47],[44,-19],[36,-21],[4,-51],[-4,-67],[-7,-49],[-33,-96],[-8,-59],[-37,-97],[-41,-163],[-18,-37],[-66,-84],[-48,-102],[-57,-176],[-43,-174],[-17,-56],[-35,-12],[-23,5],[-15,17],[6,47],[4,54],[-21,-6],[-19,-11],[-43,-131],[-24,-57],[-5,-73],[-12,-94],[-16,-86],[-8,-73],[0,-41],[13,-101],[1,-103],[7,-62],[6,-74],[-20,-23],[-18,-11],[-68,-8],[-70,-24],[-61,-43],[-37,-43],[-47,-95],[-29,-243],[-47,-103],[-31,-21],[-76,-9],[-106,-28],[-38,-25],[-62,-148],[-5,-47],[12,-34],[4,-37],[-5,-35],[-29,-94],[-30,-68],[-81,-43],[-30,25],[-27,13],[-53,2],[-86,-17],[-31,-50],[-50,-36],[-46,-55],[-87,-21],[-59,-43]],[[65577,66856],[24,83],[9,13],[8,-6],[22,9],[11,45],[9,25],[10,-3],[4,-14],[-3,-69],[0,-57],[-12,-175],[-13,-30],[-6,-25],[-2,-34]],[[53163,85850],[-1,17],[-5,22],[-65,22],[-12,-1],[-25,13],[-15,4],[-31,8],[-25,64],[-28,54],[-3,22],[0,101],[-8,44],[-2,49],[-17,-39],[9,-63],[-21,-26],[-26,-13],[2,-37],[11,-7],[3,-38],[-7,-56],[-52,-126],[-11,-13],[-7,-17],[-27,11],[-34,-35],[-32,-5],[-12,39],[-46,53],[-22,-3],[20,-26],[19,-34],[-11,-22],[-11,-14],[-18,-8],[-67,-44],[23,-29],[-20,-34],[-23,-5],[-13,-15],[-4,-21],[-69,-61],[-113,-155],[-59,-44],[-40,-46],[-36,2],[-45,-39],[-114,-34],[-75,15],[-53,-13],[-28,26],[-4,19],[2,10],[5,13],[-10,5],[-21,2],[-9,-13],[-1,-29],[-10,-8],[-39,17],[-10,15],[14,30],[25,28],[-5,5],[-5,17],[-11,2],[-35,-4],[-29,5],[-93,62],[-21,33],[-75,52],[-34,56],[-19,61],[2,56],[9,87],[15,22],[68,-31],[68,-51],[10,3],[22,40],[41,32],[-12,9],[-61,-37],[-23,21],[-36,42],[0,21],[17,22],[5,29],[-8,28],[4,37],[27,40],[41,40],[30,39],[31,24],[-4,8],[-34,-15],[-34,-26],[-39,-44],[-48,-35],[-35,-13],[-17,-12],[-26,-11],[-27,-50],[-29,-21],[-53,-3],[-11,37],[15,131],[16,64],[17,45],[27,7],[20,34],[16,0],[13,-16],[54,-15],[26,43],[35,6],[62,42],[-1,8],[-42,-9],[-26,-2],[-37,-10],[-20,7],[-9,32],[15,29],[59,68],[21,30],[11,28],[-2,19],[10,39],[58,69],[47,32],[15,-28],[-13,-84],[0,-35],[38,123],[16,30],[19,20],[45,14],[13,20],[-53,-7],[-127,-47],[-54,-42],[-15,-32],[-37,-49],[-17,-31],[-8,-47],[-21,-25],[-29,-9],[-39,-59],[-17,-48],[-39,-37],[-25,-29],[-8,-11],[-14,-28],[-11,-2],[-10,16],[-1,37],[3,59],[19,42],[9,42],[-12,38],[9,24],[16,0],[31,-11],[33,1],[54,31],[-9,18],[-23,2],[-44,-2],[-36,29],[-29,59],[-13,79],[9,23],[105,81],[28,36],[-16,4],[-39,-45],[-57,-27],[-35,38],[-19,41],[-11,87],[4,45],[-4,59],[24,19],[27,-10],[26,-4],[61,5],[133,35],[85,-21],[35,2],[54,31],[46,3],[35,-23],[19,-27],[3,-36],[16,-23],[11,7],[-9,29],[-2,43],[140,50],[17,19],[-56,7],[-16,45],[30,68],[-3,9],[-31,-36],[-15,-51],[6,-40],[-6,-19],[-29,-9],[-64,-3],[-41,17],[-38,10],[-13,13],[4,29],[-7,6],[-16,-26],[-14,-52],[-30,-12],[-84,19],[-121,-11],[-54,-26],[-35,3],[-61,46],[-24,36],[-8,73],[3,33],[47,13],[24,-1],[22,17],[-19,12],[-28,22],[-19,44],[-29,14],[-19,38],[-5,57],[6,40],[15,13],[37,-9],[97,6],[91,-40],[62,-23],[125,12],[73,36],[-13,10],[-80,-21],[-73,1],[-130,40],[-53,14],[-57,-6],[-30,12],[-18,40],[13,77],[27,17],[15,-20],[18,-2],[18,32],[17,19],[14,41],[51,39],[22,3],[31,18],[20,-5],[12,-18],[16,-15],[35,2],[103,31],[11,10],[20,25],[-65,-11],[-54,-18],[-35,-5],[-5,22],[13,21],[20,21],[10,37],[22,16],[24,-1],[50,7],[35,9],[60,-6],[90,-14],[58,-34],[21,3],[23,9],[11,12],[-46,14],[-2,21],[5,15],[74,28],[81,6],[-14,23],[-177,-34],[-46,23],[-36,0],[-24,-13],[-68,-16],[-13,11],[13,40],[41,65],[3,16],[19,16],[106,37],[51,44],[23,6],[22,-3],[35,5],[67,-13],[30,-55],[28,-17],[87,-69],[-4,20],[-75,93],[-29,23],[-21,46],[7,43],[24,29],[86,15],[15,17],[2,29],[-13,19],[-32,-1],[-26,12],[-7,31],[10,21],[50,38],[27,13],[47,13],[81,-30],[6,-16],[-22,-38],[2,-21],[20,-3],[46,64],[55,9],[23,14],[26,9],[38,-58],[16,-19],[12,-7],[12,-48],[12,-3],[17,24],[30,13],[42,8],[69,-12],[32,9],[15,-1],[-14,43],[-10,12],[15,39],[15,15],[48,27],[46,12],[30,26],[40,24],[-6,18],[-12,22],[-26,2],[-10,12],[33,28],[45,32],[-8,12],[-34,14],[-26,-10],[-38,-25],[-45,-39],[15,-11],[22,-32],[-31,-43],[-166,-115],[-78,-34],[-37,5],[-9,32],[-16,23],[-18,48],[-31,-1],[-17,-11],[-8,16],[13,51],[26,40],[44,31],[20,36],[20,59],[63,55],[91,138],[75,44],[27,48],[44,21],[38,37],[29,4],[54,34],[30,40],[-20,2],[-47,-26],[-27,-10],[2,43],[13,44],[39,40],[186,117],[19,-19],[22,-35],[56,8],[64,66],[49,72],[-26,-12],[-29,-30],[-57,-41],[-26,-6],[-15,5],[-8,28],[-20,8],[-18,-6],[-18,20],[-3,48],[23,71],[19,47],[20,36],[78,101],[17,56],[36,29],[46,-7],[14,9],[-16,36],[-50,29],[-3,18],[167,47],[80,-1],[24,23],[43,15],[33,29],[-17,13],[-81,-26],[-51,-13],[-23,0],[-18,-9],[-64,-3],[-14,115],[10,63],[24,-2],[5,60],[28,35],[39,8],[19,15],[28,31],[46,-7],[48,7],[-12,14],[-59,19],[-14,32],[20,17],[23,13],[20,3],[40,62],[24,27],[26,-5],[38,28],[37,-10],[35,18],[49,12],[178,5],[5,25],[-38,6],[-132,7],[-67,-1],[-29,-7],[-10,9],[2,16],[24,24],[12,26],[49,65],[58,44],[44,-11],[46,-42],[34,-5],[15,-13],[25,-57],[11,-2],[-5,55],[32,44],[-8,13],[-49,-16],[-37,16],[-29,34],[-8,31],[18,30],[17,15],[-11,18],[-74,-48],[-51,-11],[-21,7],[11,43],[-6,34],[70,85],[23,9],[39,-6],[35,-24],[30,4],[32,12],[-5,23],[-69,9],[-18,19],[7,19],[47,19],[48,36],[54,10],[43,27],[8,-6],[8,-11],[15,-99],[39,-81],[15,-3],[-15,69],[14,20],[17,15],[6,17],[-20,6],[-17,24],[-24,79],[9,21],[51,41],[64,10],[68,-29],[24,-1],[40,8],[67,24],[40,10],[20,0],[5,12],[-19,8],[-6,7],[-15,5],[-62,-13],[-172,4],[-16,14],[-3,24],[18,34],[20,20],[65,34],[68,5],[72,61],[28,45],[15,71],[44,57],[111,32],[4,14],[-12,30],[1,53],[31,63],[20,21],[9,3],[24,-21],[29,-43],[45,-24],[59,-5],[16,12],[-46,25],[-35,32],[-3,33],[17,17],[25,-2],[33,4],[30,21],[4,16],[1,20],[8,22],[44,50],[136,33],[10,-14],[-7,-97],[-16,-63],[0,-46],[27,46],[35,126],[27,59],[30,34],[22,8],[21,17],[28,11],[9,-14],[9,-31],[-16,-110],[2,-35],[-17,-46],[-65,-104],[3,-13],[15,5],[25,17],[80,98],[70,-12],[1,8],[-22,29],[-28,28],[-8,34],[4,91],[21,37],[60,-4],[37,5],[17,-17],[36,1],[25,66],[50,6],[44,-44],[52,-29],[43,-42],[12,12],[-23,98],[-25,35],[-54,19],[-58,44],[-15,19],[3,15],[50,14],[68,-16],[59,36],[17,-10],[46,19],[28,-25],[17,7],[11,35],[73,21],[46,-20],[25,-20],[12,-39],[17,-78],[36,-42],[23,-21],[27,-5],[12,21],[-24,25],[-7,24],[12,59],[14,23],[78,87],[66,46],[39,4],[68,102],[20,18],[18,5],[-5,24],[-37,16],[-2,31],[50,38],[60,63],[30,4],[18,-17],[59,-29],[35,-33],[26,-16],[17,3],[14,25],[17,11],[37,-6],[22,-16],[18,-2],[15,-9],[4,-21],[-32,-23],[-55,-61],[-54,-69],[-18,-36],[-17,-95],[-43,-61],[-3,-43],[17,-20],[47,16],[57,57],[15,60],[143,164],[68,91],[76,75],[43,15],[21,-49],[-17,-65],[-32,-41],[24,-19],[-5,-50],[-7,-27],[-5,-28],[0,-26],[23,7],[89,52],[23,56],[21,42],[10,36],[35,34],[66,0],[3,14],[-80,47],[-9,22],[27,28],[73,55],[38,-6],[23,-13],[91,-9],[69,-39],[-2,-61],[-16,-26],[-15,-15],[-89,-47],[-15,-22],[28,-8],[60,23],[16,-21],[-19,-53],[-4,-78],[-7,-46],[0,-42],[8,-23],[24,90],[8,22],[36,34],[13,68],[34,81],[39,47],[23,13],[75,-2],[33,-18],[28,-39],[21,-16],[67,-17],[24,-21],[4,-12],[16,-3],[45,30],[30,5],[48,-46],[-10,-35],[3,-11],[58,2],[48,-13],[92,-71],[10,-33],[-5,-40],[-132,-44],[-57,-42],[-94,-16],[-318,28],[7,-31],[221,-66],[13,-19],[-7,-40],[-1,-33],[5,-22],[16,-20],[27,-10],[55,5],[27,-11],[19,17],[7,55],[16,12],[31,-16],[13,-59],[9,-6],[15,42],[31,-3],[33,3],[43,-7]],[[58045,91602],[-20,22],[-17,34],[4,33],[50,64],[46,45],[13,16],[27,46],[-54,114],[-94,34],[-108,53],[-40,28],[-62,58],[-43,52],[-40,1],[-43,-13],[-68,-47],[-39,-24],[-22,-7],[-5,-1],[-49,14],[-54,3],[-43,-4],[-16,-7],[-61,-76],[-42,-39],[-23,-14],[-17,-22],[-14,-37],[-31,-128],[-23,-48],[-5,-30],[5,-89],[-5,-50],[-28,-40],[-20,-19],[-27,-4],[-34,-10],[-30,-24],[-21,-32],[-24,-73],[-40,-26],[-39,7],[-28,27],[-59,21],[-44,13],[-49,28],[-44,22],[-39,4],[-23,-27],[-18,-26],[-68,-21],[-39,-16],[-50,-4],[-20,19],[-72,12],[-86,14],[-25,0],[-8,32],[-23,46],[-61,79],[-25,28],[-48,65],[-55,67],[-7,2],[-37,2],[-54,-2],[-34,-15],[-22,-20],[-4,-15],[21,-61],[-6,-16],[-11,-7],[-49,17],[-59,-1],[-15,-19]],[[51377,87030],[-25,-8],[-19,6],[7,55],[10,9],[15,4],[16,-30],[-4,-36]],[[51412,86582],[1,-68],[-25,5],[-12,26],[-3,17],[2,39],[-6,41],[7,20],[10,3],[16,-36],[10,-47]],[[58321,92048],[-53,-17],[-6,14],[11,22],[14,44],[22,-2],[22,-17],[17,-20],[-27,-24]],[[53324,89646],[-18,-18],[-35,5],[-3,15],[9,31],[21,13],[27,-3],[9,-13],[-10,-30]],[[52352,88517],[-31,-1],[-20,13],[46,25],[72,25],[6,15],[9,2],[12,-19],[2,-26],[-8,-13],[-88,-21]],[[52250,88327],[-27,0],[-32,9],[-21,19],[-3,16],[38,21],[37,12],[18,-23],[1,-37],[-11,-17]],[[56511,92635],[-6,-18],[-9,-18],[-23,-18],[-66,-74],[-38,-11],[-13,-12],[-15,-7],[-48,10],[-14,-15],[-14,-10],[-34,-4],[-21,4],[-53,27],[-31,29],[-17,26],[49,-1],[17,6],[33,-5],[19,26],[42,-3],[80,18],[29,-10],[67,60],[21,-2],[32,17],[13,-15]],[[57107,92823],[74,-22],[25,0],[37,-41],[19,4],[-3,-25],[-37,-12],[-58,-7],[-9,-5],[-49,4],[-28,33],[-47,9],[0,11],[30,25],[46,26]],[[56559,92482],[5,-27],[2,-23],[-26,-32],[-59,-42],[3,-11],[-20,-11],[-31,-8],[-17,8],[2,36],[-5,11],[-23,-15],[-24,19],[-1,18],[7,16],[23,25],[37,16],[25,-6],[83,65],[9,-14],[10,-25]],[[56671,92492],[-53,-23],[-31,20],[-13,20],[-1,45],[7,27],[25,15],[16,-11],[4,-8],[29,-9],[34,-28],[-17,-48]],[[53853,91166],[17,-10],[43,3],[8,-4],[-6,-16],[-19,-18],[-39,-11],[-18,-27],[-12,-9],[-34,-1],[-20,-6],[-25,-24],[-20,18],[-5,-13],[-4,-23],[-11,-6],[-34,-9],[-8,53],[16,20],[12,22],[19,4],[17,-2],[30,50],[42,14],[26,1],[25,-6]],[[53603,90941],[-41,-31],[15,56],[22,56],[30,32],[16,-12],[-7,-27],[0,-27],[-7,-13],[-28,-34]],[[54224,91556],[36,-58],[16,-34],[-13,-64],[-35,-32],[-54,-6],[-38,3],[-24,16],[-3,17],[-14,5],[-37,-22],[-25,-3],[-32,17],[-9,28],[34,35],[16,27],[38,-3],[10,-8],[21,-5],[13,32],[-3,23],[10,15],[46,-11],[0,61],[17,5],[8,-3],[13,-13],[9,-22]],[[55490,92290],[15,-7],[14,4],[11,-6],[23,-30],[25,-12],[2,-15],[-23,-15],[-31,-4],[-32,5],[-9,19],[-10,31],[-27,31],[-4,27],[23,5],[23,-33]],[[55771,92217],[-15,-14],[-23,-5],[-12,8],[-17,6],[-20,-3],[-16,25],[1,20],[23,28],[45,16],[36,-6],[10,-9],[-12,-66]],[[55348,92203],[25,-31],[22,3],[6,12],[15,6],[30,-17],[-4,-28],[-42,-36],[-30,-50],[-38,-12],[-18,6],[-35,-29],[-27,-31],[-28,-38],[-2,-20],[-5,-15],[-104,-15],[-37,-10],[-40,12],[-19,26],[6,14],[40,5],[1,24],[10,14],[13,8],[9,30],[16,8],[30,-7],[20,22],[11,3],[14,-18],[6,25],[-6,23],[3,15],[38,40],[17,29],[24,19],[22,-3],[7,28],[-7,28],[3,18],[20,45],[22,2],[11,-40],[1,-65]],[[53474,89805],[-22,-2],[0,23],[13,22],[20,14],[26,4],[29,2],[9,-12],[-17,-16],[-58,-35]],[[53449,89886],[-25,-4],[4,26],[21,24],[8,16],[4,20],[18,14],[26,-19],[1,-31],[-13,-30],[-44,-16]],[[53119,89208],[-14,-16],[-33,13],[-63,-10],[-26,15],[20,31],[58,32],[31,-2],[31,-39],[-4,-24]],[[54861,91933],[34,-33],[15,10],[29,3],[22,-11],[18,-21],[22,-1],[13,-27],[7,-36],[-16,-27],[-22,-12],[-6,-31],[9,-44],[-49,-15],[-58,-7],[-22,21],[-45,-38],[-46,-60],[-21,-7],[-2,19],[-32,13],[-42,1],[1,14],[8,10],[36,15],[7,30],[-7,54],[7,26],[1,19],[23,21],[77,-10],[9,20],[-6,13],[-39,22],[6,15],[28,14],[28,2],[8,22],[1,10],[4,6]],[[54377,91336],[4,-4],[38,56],[41,17],[3,19],[16,19],[-2,31],[9,24],[21,7],[13,8],[15,5],[27,-20],[15,-22],[19,-50],[-8,-48],[-50,-38],[-40,-17],[-41,-43],[-20,-35],[-17,-8],[-11,3],[-10,9],[-21,0],[-22,-31],[-68,-25],[-27,7],[-1,31],[-16,-3],[-26,-36],[-25,-12],[-16,-4],[-31,14],[-83,-63],[-78,-11],[-25,7],[0,38],[50,49],[41,34],[142,23],[88,101],[21,109],[21,39],[-10,23],[-24,4],[-1,34],[12,37],[47,51],[25,22],[42,62],[20,14],[23,0],[23,-16],[-4,-33],[-34,-60],[-50,-51],[6,-37],[20,-30],[5,-51],[1,-50],[-38,-66],[-9,-33]],[[47512,92649],[-25,-4],[-15,13],[37,35],[124,66],[49,63],[95,22],[6,-35],[-6,-44],[-84,-35],[-92,-23],[-89,-58]],[[55338,94695],[-33,-23],[-51,34],[-33,43],[18,16],[89,3],[22,-23],[4,-13],[-16,-37]],[[57465,97147],[-41,-1],[-75,42],[-14,37],[13,15],[36,1],[57,-51],[61,-15],[-37,-28]],[[59034,97994],[-263,-22],[-27,16],[427,63],[22,6],[80,8],[68,-14],[-20,-11],[-287,-46]],[[56002,97117],[38,-14],[83,3],[45,-98],[26,-103],[41,-8],[80,15],[70,7],[36,-8],[65,-30],[28,-21],[-24,-17],[-59,-19],[-10,-55],[59,-20],[98,-47],[56,-6],[98,19],[93,-37],[92,-45],[-215,-56],[-19,-16],[-29,-42],[-32,-35],[-29,-20],[-64,-35],[-35,-13],[-78,3],[-29,-14],[-27,-28],[-27,-21],[-69,-5],[-35,28],[12,9],[5,17],[-13,40],[66,40],[15,23],[-13,8],[-18,-2],[-48,12],[-14,0],[-40,-24],[-55,-16],[-55,-4],[-224,-31],[-34,11],[-15,61],[91,31],[14,53],[23,35],[26,23],[50,60],[12,4],[-123,48],[-48,31],[-53,61],[-17,50],[-71,42],[9,54],[-52,-4],[-41,38],[38,21],[190,24],[113,24],[43,-1]],[[55804,98069],[28,-6],[153,2],[30,-14],[11,-34],[24,-12],[32,-3],[81,-42],[28,-6],[24,23],[19,58],[0,68],[-7,33],[9,21],[27,8],[34,-2],[34,12],[29,21],[31,3],[67,-16],[18,-13],[-18,-25],[-7,-37],[-31,-75],[66,-4],[93,15],[24,22],[50,35],[53,-5],[25,4],[13,15],[5,18],[29,-3],[40,-34],[19,-6],[34,9],[13,0],[34,-14],[157,-25],[54,-14],[24,-12],[23,-8],[167,1],[118,-9],[43,-20],[37,-38],[14,-88],[-33,-24],[-239,-108],[-60,-35],[-29,-32],[-48,-70],[-24,-21],[-112,-34],[-26,-3],[-84,16],[-25,-2],[-102,-36],[-36,-22],[-34,-27],[-51,-13],[-53,7],[-237,14],[-32,20],[-26,37],[47,48],[-265,-18],[-292,10],[-15,6],[-13,19],[-100,12],[-75,15],[-64,26],[-62,33],[20,15],[20,9],[54,4],[48,-4],[85,0],[20,33],[34,10],[27,24],[-90,15],[-94,2],[-62,-20],[-73,-9],[-66,-1],[-127,6],[-60,14],[-83,36],[-28,21],[-11,16],[-9,24],[95,21],[36,17],[36,24],[-142,13],[-60,19],[-59,29],[48,16],[192,13],[51,-11],[50,-21],[56,-12],[53,27],[-50,12],[-46,45],[-9,22],[6,17],[23,3],[18,-7],[67,-42],[51,-14],[14,39],[2,19],[-9,15],[-24,28],[-21,35],[33,9],[33,-4],[70,-24],[71,-17],[32,-16],[61,-42],[56,-29]],[[54662,97872],[15,-1],[14,6],[10,16],[11,9],[71,-11],[99,-32],[30,-16],[41,-33],[34,-55],[-27,-40],[-35,-37],[-12,-21],[13,-30],[-6,-29],[-13,-26],[54,29],[114,94],[17,6],[18,-3],[51,-19],[46,-48],[11,-16],[8,-20],[5,-24],[-3,-28],[-4,-19],[-25,-12],[-11,-12],[26,-1],[30,-15],[27,-31],[31,-13],[111,11],[73,-17],[39,-52],[62,12],[0,27],[13,12],[82,-9],[43,-13],[43,-27],[-74,-45],[61,-43],[103,-31],[61,-33],[12,-14],[10,-18],[-40,-24],[-41,-13],[-104,-2],[-93,-17],[-172,-12],[-26,-7],[-6,-7],[-10,-21],[-66,-47],[-64,-58],[-26,-35],[-20,-49],[-8,-29],[15,-29],[-4,-30],[-48,-23],[-31,0],[-38,4],[-38,-13],[-2,-20],[2,-28],[-9,-85],[-12,-65],[-18,-59],[-19,-33],[-25,-9],[-81,-5],[-62,-57],[-50,-100],[-26,-39],[-55,-62],[10,-22],[17,-24],[-30,-43],[-46,-48],[1,-19],[16,-34],[7,-35],[-35,-30],[-66,-16],[-66,17],[-32,21],[-30,32],[-32,22],[-33,13],[-127,72],[-117,114],[-108,45],[-69,21],[-34,20],[-33,28],[-28,31],[-27,39],[-12,24],[-3,36],[9,21],[12,11],[85,9],[31,-5],[30,-19],[27,-7],[63,94],[357,54],[115,9],[115,0],[-18,25],[-15,33],[-17,7],[-87,-18],[-133,-19],[-65,0],[-67,13],[-67,-7],[-69,-28],[-69,-17],[-68,-7],[-143,3],[-35,14],[-48,33],[-11,17],[-10,21],[-9,63],[10,17],[14,9],[15,6],[32,1],[31,-11],[72,-36],[-17,39],[208,46],[96,40],[49,6],[50,-2],[-11,21],[0,20],[35,16],[25,7],[77,8],[174,-2],[62,11],[47,28],[-50,-10],[-50,-2],[-23,6],[-53,24],[-24,31],[68,63],[24,30],[-70,-5],[-23,-10],[-80,-58],[-60,-26],[-73,-12],[-73,1],[-16,8],[-22,39],[-7,20],[3,11],[23,31],[12,34],[-2,29],[-17,5],[-27,-28],[-25,-39],[-33,-20],[-35,6],[-15,15],[-13,23],[-13,9],[-15,0],[-31,-9],[-31,-18],[11,-25],[3,-29],[-14,-23],[-10,-28],[32,-17],[26,-28],[-39,-13],[-38,-18],[-34,-29],[-36,-23],[-56,-2],[-70,-12],[-141,-5],[-66,37],[-12,17],[-13,12],[-44,19],[-63,57],[-50,64],[-33,6],[-49,21],[-27,19],[-25,24],[-8,29],[3,26],[29,12],[-69,29],[-68,39],[25,13],[25,6],[202,-46],[14,6],[22,23],[-8,7],[-34,5],[-46,0],[-11,5],[-18,24],[-16,30],[-6,20],[-3,23],[34,35],[19,32],[-29,14],[-83,-1],[-28,-4],[10,-45],[-26,-31],[-51,-25],[-36,12],[-28,60],[-37,41],[-14,26],[-10,38],[-15,27],[-27,33],[-3,20],[3,16],[20,34],[-15,28],[-19,25],[-1,14],[18,18],[16,6],[17,-2],[51,-21],[28,-25],[9,2],[19,38],[25,8],[100,12],[111,-48],[29,-10],[23,-4],[-12,21],[-7,28],[17,10],[89,-24],[42,1],[98,33],[163,16],[62,-25],[3,-14],[-2,-18],[-3,-5],[-36,-22],[-206,-17],[-134,-66],[183,10],[33,-7],[14,-55],[13,-5],[48,-8],[32,-16],[32,-31],[34,-21],[21,3],[7,22],[-8,27],[-5,30],[3,33],[5,27],[39,19],[56,62],[59,42],[66,-19],[62,-53],[55,-74],[53,-80],[60,-99],[29,-35],[27,-8],[121,-103],[13,-3],[-25,78],[-62,133],[-43,102],[-9,39],[-7,54],[3,16],[5,14],[31,59],[40,28],[-12,40],[10,31],[42,24],[39,2],[38,-19],[73,-65]],[[53125,97125],[3,-40],[45,4],[53,-42],[58,-22],[17,-16],[12,-20],[35,-40],[17,-42],[-42,-4],[-58,60],[-47,34],[-60,29],[-48,2],[-21,12],[-78,105],[-15,24],[-44,39],[-20,48],[0,38],[60,-9],[52,-24],[45,-54],[9,-16],[-21,-22],[21,-27],[27,-17]],[[55205,98099],[-60,-32],[-100,25],[12,25],[23,15],[64,-6],[61,-27]],[[58068,97299],[83,-4],[83,9],[14,-9],[-107,-31],[-119,16],[-107,4],[-127,-33],[-42,13],[65,33],[70,10],[11,20],[27,4],[93,2],[56,-34]],[[85175,73606],[-3,5],[-14,4],[-56,47],[-46,-29],[-12,-37],[-12,-12],[-19,73],[-30,2],[-48,65],[-21,-13],[-5,-26],[-26,-60],[-37,-48],[-12,-7],[-13,3],[2,14],[-15,55],[-58,22],[-21,23],[-11,6],[57,61],[15,11],[-11,14],[-12,7],[-47,-9],[-24,20],[-36,-7],[-24,16],[51,60],[2,36],[-1,27],[26,80],[26,44],[67,62],[30,9],[21,-3],[17,6],[-18,24],[-18,11],[-35,-2],[-36,36],[-3,38],[70,240],[1,22],[-11,58],[-3,57],[-51,33],[-22,4],[-64,64],[-26,33],[-10,-10],[-2,-51],[-9,-12],[-17,-10],[-9,59],[-14,42],[-42,44],[-16,23],[8,52],[-4,4]],[[84544,74886],[7,58],[26,45],[64,79],[17,37],[33,44],[14,-1],[16,4],[4,19],[4,15],[13,13],[31,25],[36,31],[28,9],[35,48],[14,21],[15,0],[3,10],[9,24],[11,16],[15,3],[25,12],[32,7],[22,40],[7,29],[14,31],[31,34],[20,51],[24,55],[11,18],[10,3],[7,21],[7,59],[11,56],[6,27],[27,30],[7,14],[6,5],[12,-4],[16,17],[16,19],[14,-7],[15,-15],[15,-32],[7,-25],[12,-21],[2,-30],[12,-14],[25,-6],[42,-21],[27,-1],[15,-16],[32,-8],[64,12],[26,-7],[11,-19],[17,-16],[10,-1],[14,27],[16,42],[10,32],[-1,26],[-9,28],[-21,25],[-14,40],[-13,41],[-8,14],[-6,20],[-1,30],[4,21],[32,14],[41,8],[33,-9],[56,6],[34,12],[25,-2],[23,0],[11,18],[32,42],[16,15],[17,29],[3,30],[3,24],[10,26],[17,32],[14,15],[16,-2],[17,-15],[11,-14],[12,4],[10,25],[7,5],[19,2],[6,16],[8,74],[7,59],[2,40],[17,68],[6,41],[10,19],[12,-1],[10,-12],[12,-7],[17,6],[12,-10],[7,-22],[25,-15],[2,-11],[0,-74],[13,-34],[18,-31],[25,-29],[14,-6],[8,-20]],[[86301,76210],[-14,-16],[-19,10],[-31,6],[-39,-51],[-22,-17],[-16,-50],[-31,-30],[-17,-31],[-22,-54],[-14,-53],[-33,-54],[-20,-67],[-1,-58],[21,-59],[2,-51],[-15,-104],[9,-110],[-10,-43],[-102,-76],[-26,-37],[-38,-98],[-46,-36],[-28,-40],[-39,-24],[-26,-69],[-27,-39],[-33,-24],[-25,-30],[-55,-2],[-39,-21],[-27,-58],[-83,-66],[-12,-49],[6,-77],[0,-58],[-7,-49],[-18,14],[-10,-16],[-11,-44],[4,-51],[28,-17],[23,-20],[33,-11],[24,-24],[52,-107],[42,-47],[11,-17],[24,-24],[22,-37],[13,-33]],[[84695,74617],[-16,-17],[0,30],[12,25],[12,3],[-8,-41]],[[52027,54388],[-26,-18],[-18,4],[24,77],[12,-17],[16,-7],[-8,-39]],[[53779,59737],[44,-124],[47,-133],[36,-104]],[[53906,59376],[27,-268],[3,-51],[2,-23],[2,-21],[3,-37],[21,-16],[40,-7],[29,-26],[17,-44],[1,-7],[9,-34],[3,-24],[-3,-71],[-6,-90],[-10,-58],[6,-79],[-2,-34],[-4,-23],[-18,-27],[-24,-26],[-57,-76],[-17,-12],[-24,-2],[-21,-19],[-25,-41],[-53,-154],[-46,-154],[-16,-128],[-17,-122],[-40,-78],[-6,-44],[-2,-25],[-1,-59],[-5,-97],[-6,-47],[-7,-14],[-43,-30],[-25,-35],[-15,-71],[-5,-77],[-9,-87],[-5,-76],[-7,-40],[-14,-42],[-22,-44],[-19,-26],[-50,-16],[-26,-101],[-21,-79],[-1,-32],[-21,-164],[-36,-124],[-3,-44],[0,-35],[-45,-109],[-12,-32],[-12,-42],[12,-41],[12,-37],[2,-12],[-20,-35],[-36,-60],[-22,-36],[-5,-20],[-3,-90],[-6,-25],[-14,-33],[-21,-37],[-22,-28],[-24,-20],[-23,-7],[-13,12],[-8,27],[-13,111],[-7,24],[-15,21],[-30,61],[-30,61],[-36,43],[-8,-3],[-6,-12],[-11,-61],[-10,-23],[-19,-8],[-33,0],[-25,8],[-5,13],[-5,26],[-7,22],[-29,-43],[-46,-68],[-15,-12],[-11,-13],[-15,-64],[-18,-68],[-24,-35],[-23,-30],[-14,-26],[-19,-31],[-37,-77],[-50,-102],[-17,-53],[-18,-78],[-10,-87],[-11,-96],[-16,-153],[-24,-87],[-20,-69],[-16,-54],[-8,-45]],[[52376,54582],[-3,1],[-8,-19],[-23,13],[-11,39],[-14,6],[-25,57],[-5,-9],[26,-145],[-10,-57],[-73,-1],[-64,-19],[-43,1],[-22,21],[-10,54],[-3,-5],[-3,-30],[-13,-22],[-49,-5],[-22,37],[-17,42],[-19,18],[3,-17],[22,-41],[-3,-58],[-39,-67],[-25,-4],[-16,29],[-8,47],[-4,70],[-10,46],[-6,0],[5,-42],[2,-34],[0,-71],[19,-55],[-29,-17],[-11,-1],[-23,-1],[-4,20],[-5,46],[-6,12],[-7,-78],[-15,-5],[-10,1],[-46,-17],[-10,3],[-2,14],[6,22],[-2,35],[-15,-27],[-3,-54],[-9,-8],[-27,7],[-29,28],[-18,28],[-30,39],[-58,111],[-10,49],[-17,61],[-12,62],[-18,105],[5,8],[14,-9],[7,15],[-25,12],[-5,12],[-1,37],[1,45],[19,16],[18,8],[8,27],[5,28],[-45,-42],[-43,47],[-9,29],[4,22],[21,3],[29,-1],[17,21],[-10,8],[-19,-1],[-7,14],[0,34],[-6,-7],[-8,-31],[-29,-22],[-16,22],[-2,50],[-4,23],[-14,17],[-50,132],[-63,110],[-57,76],[-84,36],[-178,-2],[-10,11],[11,17],[16,12],[57,61],[-10,8],[-59,-38],[-21,-4],[-26,-74],[-156,-12],[-19,-3]],[[50751,55512],[1,33],[7,97],[5,38],[6,29],[-6,34],[-6,47],[-3,74],[8,22],[2,28],[-1,43],[0,145],[4,16],[5,12],[0,20],[-9,37],[-9,43],[0,61],[-3,60],[-6,27],[4,102],[3,128],[-3,57],[6,40],[3,100],[0,97],[11,153],[35,7],[40,13],[19,60],[10,77],[-3,75],[8,25],[16,41],[29,58],[-1,64],[8,20],[14,15],[20,8],[23,32],[12,56],[12,89],[-19,63],[0,13],[8,34],[11,34],[10,10],[22,-8],[3,3],[4,10],[14,99],[-2,27],[-20,66],[-3,47],[-3,70],[-5,62],[-6,23],[-11,20],[-5,13],[-42,126],[1,60],[18,76],[11,37]],[[50998,58580],[16,21],[3,17],[-4,22],[-8,16],[-2,34],[2,23],[6,25],[-2,53],[0,80],[3,118],[0,71],[35,53],[49,89],[25,91],[14,70],[17,232],[12,14],[14,11],[50,84],[38,31],[29,18],[44,16],[28,-6],[49,-4],[40,8],[33,46],[15,13],[21,8],[96,-62],[96,-59],[18,6],[14,-8],[24,-32],[36,-68],[21,-44],[10,-26],[50,-148],[18,-37],[18,-20],[19,-7],[15,2],[13,17],[19,33],[28,15],[23,-3],[120,133],[12,1],[34,-10],[39,-18],[100,-134],[82,-87],[58,-29],[67,-21],[116,-6],[87,187],[32,41],[39,37],[12,6],[68,28],[135,24],[125,-10],[25,-8],[54,-24],[82,-61],[36,-59],[55,-9],[40,11],[14,58],[40,76],[29,31],[31,40],[49,49],[40,22],[37,57],[28,17],[50,2]],[[50998,58580],[-17,53],[-23,37],[-25,16],[-17,27],[-9,37],[-33,73],[-75,144],[-8,3],[-12,6],[-22,-17],[-13,-24],[-9,-9],[-14,-1],[-36,-19],[-28,-23],[-1,-19],[14,-109],[-7,-59]],[[50663,58696],[-13,28],[-41,110],[-29,81],[-5,18],[-4,28],[3,12],[11,9],[27,11],[5,8],[1,23],[-4,41],[-15,57],[-15,37],[-8,7],[-16,2],[-17,-5],[-32,-46],[-14,-9],[-33,4],[-30,9],[-18,24],[-53,91],[-59,96],[-25,13],[-5,10],[-4,74],[1,89],[3,23],[25,-14],[26,-6],[8,16],[-21,32],[-30,32],[-11,48],[-9,17],[-13,17],[-16,9],[-15,14],[-11,14],[-17,6],[-19,10],[-26,79],[-26,76],[-16,60],[-5,36],[8,62],[-8,24],[-29,62],[-24,59],[6,89],[5,75],[0,47],[4,27]],[[50060,60432],[3,30],[16,10],[41,-1],[79,-14],[64,16],[3,3],[45,80],[50,84],[74,8],[81,9],[64,4],[92,7],[75,5],[86,7],[3,38],[5,10],[9,1],[63,-21],[60,-20],[4,73],[53,92],[30,18],[7,16],[9,31],[6,48],[3,34],[11,28],[8,52],[11,90],[29,95],[17,129],[3,125],[3,95],[9,19],[0,168],[-1,170],[0,143],[0,178],[-1,156],[0,169],[0,152],[0,101]],[[51174,62870],[60,24],[63,25],[92,36],[99,39],[108,43],[25,26],[81,146],[37,66],[74,130],[56,101],[72,128],[76,129],[61,103],[95,117],[144,176],[144,176],[144,175],[143,176],[144,176],[144,176],[144,176],[144,176]],[[53324,65390],[145,-67],[137,-64],[138,-64],[33,-35],[73,-125],[94,-160],[4,-3],[4,0],[91,94],[117,123]],[[54160,65089],[31,-333],[23,-285],[2,-183],[1,-47],[9,-32],[22,-33],[87,-263],[-19,-46],[13,-81],[23,-35],[72,-157],[10,-31],[-4,-25],[-51,-185],[-9,-45],[-10,-235],[-7,-167],[-10,-228],[-11,-273],[-10,-230],[-12,-304],[-12,-289],[-73,-158],[-129,-280],[-105,-229],[-53,-153],[-103,-298],[-46,-194],[-36,-100],[-18,-44],[16,-141],[28,-248]],[[26900,60479],[-7,-21],[-9,-14],[-18,-69],[-6,-6],[-1,51],[-10,7],[-13,-18],[-7,-26],[11,-35],[10,0],[11,-9],[31,-236],[-7,-42],[-19,-65],[-18,-56],[-18,-35],[-23,-148],[-20,-241],[14,-217],[-7,-200],[6,-48],[2,-59],[-15,-10],[-8,1],[-9,37],[1,31],[9,38],[4,50],[-5,27],[-9,-58],[-15,-26],[-10,-9],[-10,-29],[10,-55],[14,-40],[4,-29],[-5,-34],[-3,-117],[-5,3],[-5,16],[-14,1],[-2,-47],[1,-26],[-12,-21],[-4,-20],[10,-14],[11,-9],[13,2],[12,-58],[3,-47],[-26,-44],[-9,-36],[-14,-43],[-8,-43],[-3,-31],[10,-98],[18,-69],[15,-44],[20,-10]],[[26766,58131],[-5,-46],[-15,-29],[-27,-25],[-30,-4],[-49,23],[-20,3],[-8,12],[-3,23],[-14,34],[-25,45],[-15,-3],[-24,10],[-41,31],[-18,4],[-27,-27],[-31,-34],[-75,54],[-53,38],[-47,35],[-13,13],[-10,-3],[-9,-18],[-10,-32],[-4,-9],[-5,-9],[-6,-2]],[[26182,58215],[0,15],[-24,64],[-36,76],[-141,234],[-52,140],[-28,101],[-27,53],[-76,107],[-17,43],[-76,143],[-57,85],[-1,35],[24,45],[11,-2],[13,-32],[20,-36],[10,-1],[14,17],[0,17]],[[25739,59319],[78,7],[13,10],[14,26],[8,37],[1,35],[3,26],[12,25],[23,7],[17,3],[5,17],[-5,54],[-9,131],[-2,37],[3,27],[7,10],[34,6],[65,-11],[13,9],[26,74],[24,55],[17,25],[14,7],[15,-49],[55,-69],[9,4],[6,4],[1,10],[0,32],[13,29],[29,26],[28,47],[29,66],[25,39],[21,12],[8,18],[-5,24],[1,35],[9,46],[12,26],[16,7],[6,14],[-3,22],[3,23],[15,39],[34,33],[20,-12],[17,-44],[23,-30],[30,-16],[23,6],[17,28],[15,8],[13,-11],[7,6],[1,24],[7,5],[13,-13],[12,-3],[10,6],[4,12],[2,11],[7,9],[26,-9],[29,14],[33,35],[21,16],[11,-4],[12,18],[15,40],[34,18],[71,-9]],[[98087,28064],[32,-3],[29,43],[31,34],[32,28],[49,66],[12,9],[32,13],[14,15],[15,4],[-14,-39],[-17,-13],[-3,-14],[10,-22],[-15,-31],[0,-39],[-18,-46],[28,18],[10,30],[-5,17],[12,34],[18,16],[-7,25],[0,20],[23,-7],[11,0],[9,8],[16,4],[4,-23],[21,3],[-8,-28],[-16,-33],[-4,-20],[-27,-33],[-18,-14],[28,-4],[40,44],[24,39],[-1,-48],[-19,-44],[-17,-28],[-19,-8],[-18,-23],[-9,-36],[1,-25],[5,-19],[19,-32],[-21,-63],[24,8],[13,-12],[18,-36],[-11,-42],[-8,-22],[-47,-88],[-20,-44],[-24,-29],[1,-47],[-14,-34],[-70,-117],[-12,-25],[-55,-186],[-35,-78],[-20,-27],[-21,-22],[-51,-36],[-23,-43],[-25,-35],[-26,-8],[1,-15],[17,-9],[13,-23],[-10,-26],[-19,-16],[-19,-5],[-10,-17],[46,12],[13,-13],[3,-29],[5,-26],[11,-34],[39,-21],[35,-10],[7,-16],[5,-54],[-6,-27],[-8,-18],[-12,-6],[-28,-3],[-29,12],[-19,33],[-54,-11],[-15,-7],[-7,6],[30,35],[-16,19],[-13,8],[-14,-12],[-9,-18],[-3,-30],[-10,-17],[-15,-5],[-21,25],[-21,35],[-30,36],[4,-22],[24,-54],[12,-36],[-28,-29],[-28,-22],[-25,-13],[-22,-20],[-27,-32],[-15,-11],[-39,-1],[-21,-10],[-7,-42],[-15,-27],[-34,-5],[12,-8],[8,-14],[-23,-126],[-5,-53],[-4,-89],[-14,-83],[-41,0],[6,-15],[31,-23],[-6,-36],[-34,-64],[-14,-38],[-14,-90],[-20,-84],[-32,-95],[0,-17],[11,-24],[13,-21],[1,-30],[-4,-16],[-15,-4],[-13,-10],[-71,-26],[-24,-29],[-19,-53],[-22,-45],[-74,-100],[-44,-83],[-9,-24],[-12,-18],[-95,-39],[-68,-6],[-37,10],[-36,20],[-19,7],[-38,-12],[-16,-14],[-30,13],[-23,-10],[-7,10],[-9,25],[5,32],[-6,24],[-15,17],[-10,19],[-12,13],[-31,6],[-49,-9],[-16,1],[-34,80],[-11,20],[-39,25],[-14,-3],[-21,-43],[-13,-7],[-74,-5],[-75,14],[-28,16],[-5,37],[57,102],[-17,-14],[-35,-41],[-22,6],[21,45],[2,20],[-4,23],[-30,-38],[-33,-5],[-4,35],[3,41],[7,11],[89,22],[33,14],[14,22],[-54,7],[-3,31],[7,25],[46,41],[-33,-11],[-38,4],[3,43],[9,34],[40,1],[-13,23],[-1,33],[11,2],[39,-44],[29,-16],[-12,33],[2,21],[7,9],[24,7],[-7,6],[-22,8],[-26,25],[-3,26],[1,31],[28,42],[17,-25],[20,7],[-15,19],[-9,30],[6,19],[60,78],[15,-75],[4,25],[1,24],[-7,20],[1,21],[7,18],[25,17],[34,58],[25,26],[20,-17],[13,-23],[-2,23],[-9,19],[-3,53],[45,81],[49,78],[48,82],[25,29],[54,34],[34,-14],[9,3],[51,58],[21,16],[19,-21],[12,-8],[-12,54],[10,24],[42,44],[54,45],[40,19],[30,30],[18,1],[-3,23],[3,22],[16,-2],[5,9],[-14,12],[44,44],[24,48],[13,11],[11,14],[14,34],[17,11],[15,-5],[11,-17],[-6,28],[-20,15],[22,24],[22,16],[21,-12],[21,-19],[-21,30],[-3,18],[25,21],[14,6],[19,-39],[-2,31],[4,28],[28,45],[36,75],[11,-26],[2,-31],[-2,-39],[8,14],[2,34],[-5,61],[45,113],[8,12],[10,8],[16,3],[-5,17],[-12,17],[12,57],[8,65],[10,63],[17,62],[18,102],[14,22],[38,7],[16,15],[28,37],[32,67],[18,54],[23,140],[13,147],[37,108],[54,79],[48,60],[19,12],[33,4],[32,-17],[-59,-14],[-6,-36],[-2,-35],[7,-33],[11,-28],[28,-27],[33,-16],[15,-61],[3,-72],[5,-62],[13,-54]],[[98309,28304],[-38,-34],[2,23],[7,51],[17,26],[8,1],[17,20],[-1,-43],[-12,-44]],[[96317,25543],[-1,-28],[-3,-14],[-10,0],[-14,3],[-14,13],[-10,-4],[-7,5],[10,32],[33,17],[12,-14],[4,-10]],[[96382,25818],[12,-70],[-25,14],[-11,20],[20,35],[4,1]],[[96706,24848],[0,-23],[-29,9],[1,-26],[23,-14],[8,-18],[24,5],[5,-28],[-5,-24],[-16,-19],[-47,-9],[-31,-36],[-26,6],[-7,-3],[-30,-39],[-34,-12],[-9,3],[5,34],[25,33],[0,31],[7,25],[24,18],[0,33],[16,29],[-10,63],[6,56],[47,3],[53,-97]],[[98761,30944],[2,-31],[-21,11],[-8,24],[-24,24],[-4,8],[-2,48],[12,23],[2,10],[6,4],[10,-26],[19,-36],[8,-59]],[[98129,31719],[5,-26],[15,18],[11,30],[19,30],[-3,-48],[10,-11],[61,-34],[13,-28],[13,-8],[7,16],[9,8],[22,-18],[50,-49],[4,-17],[-2,-25],[2,-27],[7,-21],[17,-5],[22,31],[10,4],[15,-45],[6,-25],[-3,1],[10,-25],[12,-25],[22,-74],[-3,-26],[-6,-23],[20,-68],[-13,-5],[-40,12],[1,-14],[23,-50],[20,-70],[15,-43],[55,-132],[-8,-47],[1,-31],[-7,-26],[19,-70],[-12,-22],[-8,-72],[-8,-12],[1,-26],[22,-7],[13,-11],[12,-21],[7,25],[10,7],[26,-34],[55,-34],[15,-13],[8,-27],[5,-67],[11,-29],[21,-6],[23,9],[7,25],[-5,65],[-16,104],[0,34],[2,33],[-3,34],[-9,32],[-8,24],[-12,21],[4,32],[17,14],[10,-27],[9,-32],[42,-97],[26,7],[2,-40],[17,-41],[10,-47],[12,-143],[19,-133],[35,-59],[4,-28],[-21,15],[-7,-9],[2,-14],[20,-25],[23,-13],[14,2],[14,-9],[90,-87],[43,-34],[109,-56],[31,-4],[17,2],[33,19],[29,34],[25,52],[22,59],[23,28],[27,23],[14,21],[14,15],[73,-7],[25,-30],[32,-24],[16,-18],[-5,-38],[-19,-56],[-15,-61],[-13,-138],[-9,-141],[-13,-61],[-24,-48],[-27,-34],[-30,-17],[-12,-79],[-6,-93],[1,-24],[10,-18],[4,-28],[-16,-56],[-9,8],[-13,47],[-12,19],[-36,15],[-37,7],[-32,-5],[-31,-19],[-47,-41],[-14,-21],[-13,-25],[-21,-58],[-5,-71],[1,-38],[7,-28],[40,-40],[-39,-136],[-35,-143],[-20,-40],[-23,-38],[-21,-85],[-38,-74],[-25,-56],[-20,-59],[-17,-62],[-37,-88],[-16,-58],[-22,-48],[-40,-61],[-42,-53],[-67,-73],[-18,-24],[-20,-18],[-24,21],[-5,23],[-6,50],[-5,18],[-31,15],[-41,-24],[-7,5],[-2,11],[0,73],[7,20],[-9,12],[-10,-5],[-3,-18],[6,-16],[-23,-20],[-25,-1],[-7,8],[-2,13],[6,22],[8,20],[45,91],[47,122],[40,130],[11,67],[15,125],[-12,51],[-16,49],[-40,94],[-55,53],[-35,7],[-33,20],[-31,45],[-29,53],[-56,43],[-60,34],[-34,48],[-8,29],[-5,33],[0,30],[5,32],[6,24],[11,17],[63,62],[67,35],[12,-1],[12,6],[17,21],[30,48],[8,33],[6,104],[10,102],[17,116],[26,73],[9,44],[-11,73],[10,27],[12,17],[13,9],[-23,69],[-26,104],[-6,32],[4,32],[7,31],[-17,8],[-10,30],[-24,101],[7,16],[14,-11],[20,-73],[4,38],[16,23],[16,12],[18,2],[-40,82],[-14,-4],[-18,-12],[-19,-8],[-18,7],[-17,18],[-8,34],[-11,66],[-7,24],[-53,135],[16,4],[43,-67],[8,21],[7,31],[-3,35],[-10,26],[-15,17],[-1,30],[12,28],[-1,20],[-24,40],[-10,4],[-5,-18],[7,-28],[-6,-3],[-61,73],[-18,58],[-15,65],[-2,-26],[2,-37],[24,-74],[39,-82],[7,-22],[-6,-29],[-14,-8],[-11,18],[-18,71],[-13,35],[-148,365],[19,48],[29,41],[7,18],[5,22],[-13,3],[-11,-10],[-13,-18],[-11,-22],[-15,-47],[-7,-11],[-17,33],[-7,20],[0,24],[-4,16],[-13,5],[-19,48],[-12,24],[20,47],[1,62],[-21,65],[-24,60],[-47,96],[-43,102],[47,13],[47,2],[-22,-61],[10,-35],[15,-30],[32,-91],[3,-27],[16,-26],[8,-21]],[[96993,21602],[15,-29],[-29,-13],[-14,11],[-10,13],[-5,19],[15,-2],[14,8],[14,-7]],[[96172,22602],[6,-48],[-16,-1],[-32,14],[-9,21],[-7,5],[-12,-24],[-18,-1],[-5,8],[8,25],[44,49],[8,61],[-1,19],[35,5],[8,-7],[3,-9],[-2,-11],[-14,-20],[0,-23],[3,-24],[-11,-12],[6,-21],[6,-6]],[[1062,26647],[-10,-15],[-17,1],[-30,-59],[2,44],[-9,17],[-26,-4],[-4,-10],[17,-12],[4,-6],[-17,-25],[17,-55],[15,2],[14,-43],[0,-13],[-33,-16],[-17,-23],[-16,1],[-7,4],[-9,41],[0,17],[19,31],[11,30],[-9,28],[-22,19],[-48,-9],[-11,6],[24,39],[26,-5],[28,28],[108,-13]],[[1062,26312],[-12,-5],[1,33],[-4,21],[21,7],[9,-26],[-15,-30]],[[2089,46900],[-1,-1],[-1,6],[-2,7],[-1,7],[0,1],[3,-6],[2,-7],[0,-7]],[[2448,46454],[0,-2],[-2,3],[-2,5],[-1,6],[1,1],[2,-4],[1,-4],[1,-5]],[[2832,40850],[-28,-31],[-12,37],[11,48],[13,12],[8,2],[11,-45],[-3,-23]],[[5628,39602],[-9,0],[-12,4],[-7,3],[-1,5],[3,16],[6,9],[12,-2],[8,-11],[1,-19],[-1,-5]],[[51664,81077],[-28,1],[-26,1],[-14,3],[-15,9],[-7,18],[-8,21],[2,14],[25,37],[4,11],[-3,5],[3,17],[19,56],[2,23],[-8,16],[-13,9],[-40,17],[-19,23],[-8,21],[-9,6],[-13,-7],[-33,-8],[-27,11],[-32,39],[-7,35],[-4,26],[-8,10],[-11,-14],[-13,-22],[-27,-2],[-7,5],[-2,12],[-1,11],[-8,14],[-7,8],[-34,-40],[-13,1],[-16,15],[-8,15],[-17,-9],[-16,-18],[6,-35],[-9,-6],[-19,3],[-22,14]],[[51173,81443],[-24,9],[-37,24],[-51,-20],[-36,24],[-29,2],[-19,19],[-19,31],[14,21],[13,7],[54,4],[40,-13],[71,-68],[18,1],[19,8],[-10,19],[-18,9],[-26,18],[-21,26],[49,8],[-7,13],[-6,23],[-52,79],[9,22],[13,46],[16,38],[13,10],[22,27],[46,80],[30,65],[22,76],[32,212],[10,36],[15,40],[20,-8],[13,-11],[48,30],[83,78],[24,68],[24,31],[95,62],[52,18],[81,5],[59,11],[70,4],[27,-38],[15,-28],[25,-15],[39,-11]],[[51999,82535],[-3,-55],[1,-108],[-3,-19],[-18,-46],[-18,-81],[-5,-54],[-5,-11],[-74,1],[-10,-10],[-2,-11],[4,-14],[-2,-14],[-6,-11],[3,-18],[13,-20],[23,-13],[25,-1],[13,2],[9,-14],[10,-22],[-1,-29],[-4,-37],[-11,-35],[-34,-40],[-16,-14],[-14,-8],[-7,-10],[-3,-14],[1,-12],[24,-32],[-1,-7],[-7,-17],[-9,-16],[-62,-33],[-26,3],[-14,-16],[-5,-4],[-16,16],[-37,17],[-13,-6],[-8,-10],[-23,-11],[-16,-18],[0,-23],[29,-60],[10,-12],[0,-23],[14,-28],[15,-35],[1,-22],[-1,-23],[-8,-32],[-25,-75],[0,-15],[2,-11],[9,-3],[6,-6],[-2,-10],[-47,-52],[-6,-9],[-19,3],[-3,-9],[2,-14],[8,-13],[17,-6],[14,-13],[12,-26],[-16,-89]],[[51173,81443],[-4,-22],[-10,-24],[-37,-34],[-39,-23],[-19,3],[-14,12],[-7,12],[-21,12],[-28,6],[-18,-13],[-12,-12],[-11,2],[-8,10],[-7,16],[-8,50]],[[50930,81438],[21,9],[46,4],[35,-18],[46,-8],[36,24],[28,-21],[31,15]],[[51759,82667],[-39,-20],[-10,4],[3,6],[34,12],[12,-2]],[[51647,82637],[-55,-9],[-19,7],[-3,6],[15,4],[47,1],[14,-6],[1,-3]],[[51419,82550],[-52,-42],[-4,6],[33,37],[23,-1]],[[51479,82595],[-26,-5],[-12,8],[63,23],[39,7],[7,-3],[-71,-30]],[[51357,82413],[-28,-41],[-17,12],[-4,9],[8,32],[41,53],[0,-65]],[[51096,81646],[28,-31],[5,-10],[2,-11],[-34,-12],[-37,38],[-24,-9],[-9,18],[0,12],[25,9],[44,-4]],[[51870,82708],[-25,-2],[7,15],[24,12],[13,0],[-19,-25]],[[31054,58838],[-14,-64],[-8,28],[-1,52],[-6,20],[-11,12],[-6,17],[0,26],[42,-41],[4,-50]],[[32517,61921],[-7,-12],[-6,1],[-4,11],[0,20],[5,-6],[3,-2],[1,-4],[8,-8]],[[32435,61994],[-2,-2],[-4,5],[1,10],[3,4],[2,-3],[2,-7],[-2,-7]],[[30583,59015],[1,-16],[-13,9],[-17,35],[-17,27],[4,29],[4,10],[18,-27],[17,-50],[3,-17]],[[30902,58789],[-14,-8],[-54,56],[-44,90],[-1,47],[11,-4],[12,-18],[17,-64],[52,-42],[21,-57]],[[74474,67897],[11,-16],[2,-25],[-2,-29],[-12,-61],[-10,-44],[-13,-91],[-11,-158],[3,-28],[33,-91],[12,-69],[2,-48],[-14,-80],[-16,-90],[-8,-20],[-9,-7],[-40,31],[-28,-4],[-32,-18],[-34,4],[-27,10],[-35,-36],[-34,20],[-21,22],[-15,63],[-6,8],[-70,-66],[-17,-4],[-44,35],[-36,35],[-13,10],[-35,14],[-31,8],[-34,22],[-42,-29],[-17,3],[-16,20],[-8,42],[-2,40],[-15,27],[-22,6],[-31,-24],[-45,-33],[-15,6],[-13,9],[-5,9],[-7,37],[-7,9],[-10,1],[-19,9],[-23,27],[-70,66],[-9,29],[0,65],[-3,27],[-9,28],[-36,28],[-70,46],[-38,37],[-19,-17],[-35,-16],[-19,-33],[-23,11],[-54,34],[-29,6],[-18,-12],[-4,-20],[-22,-23],[-21,18],[-41,25],[-37,13],[-55,30],[-6,44],[-10,45],[-13,7],[-50,-8],[-45,48],[-49,63],[-21,20],[-13,8],[-12,-8],[-14,-15],[-12,-4],[-26,27],[-34,38],[-42,47],[-48,66],[-20,37],[-9,28],[-11,27],[-42,43],[-34,34],[-40,41],[-7,8],[-15,24],[-23,31],[-20,9],[-6,-17],[-4,-18],[-17,4],[-26,32],[-28,32],[-21,31],[-22,31],[-5,23],[9,71],[13,62],[11,13],[17,41],[7,71],[-1,61],[18,85],[23,91],[41,98],[18,32],[20,22],[37,72],[8,12],[17,19],[16,4],[12,-9]],[[72502,69218],[13,-37],[15,-36],[18,2],[22,30],[45,141],[63,29],[59,-15],[52,-20],[16,-47],[10,-50],[6,-25],[17,-29],[74,-71],[43,-64],[59,-85],[45,-37],[39,-3],[22,-34],[33,-66],[29,-77],[35,-71],[24,3],[33,23],[41,30],[24,-15],[22,-20],[7,-36],[13,-69],[15,-72],[23,-25],[28,-37],[15,-30],[51,-53],[8,-22],[10,-15],[13,-10],[10,-11],[16,-3],[60,32],[15,-4],[10,-6],[0,-12],[-11,-50],[-9,-65],[9,-32],[25,-14],[55,-9],[75,0],[22,-32],[23,-49],[22,-84],[9,-36],[12,-10],[19,14],[3,35],[1,51],[16,18],[11,-14],[12,-40],[30,-36],[23,-17],[21,6],[9,14],[10,70],[17,10],[21,-5],[8,-14],[9,-28],[25,-13],[26,-18],[24,-22],[33,-52],[42,-10],[48,1],[25,-1],[19,-4],[17,4],[49,37],[20,3],[25,-5],[24,-7]],[[96376,51545],[-5,-20],[-6,3],[-3,13],[2,14],[7,6],[5,-5],[0,-11]],[[57016,41593],[-12,3],[-85,-19],[-33,-25],[-73,-108],[-15,14],[-17,22],[-15,7],[-32,-27],[-32,-31],[-35,-44],[-29,-43],[-10,-23],[-45,-89],[-15,-15],[-13,-6],[-5,4],[-6,38],[-28,90],[-45,117],[-13,12],[-9,4],[-33,-6],[-96,-33],[-82,-28],[-124,-47],[-134,-39],[-83,-24],[-71,-7],[0,-116],[0,-235],[0,-235],[0,-235],[0,-235],[1,-235],[0,-235],[0,-235],[0,-235],[0,-102],[-2,-22],[-41,0],[-94,0],[-78,0],[-63,0],[0,-140],[0,-165],[0,-165],[0,-165],[0,-165],[0,-165],[0,-166],[0,-165],[0,-165],[1,-124],[0,-15]],[[54568,35358],[-31,47],[-91,175],[-32,46],[-48,107],[-105,334],[-15,64],[-20,161],[-23,120],[-3,69],[11,39],[-6,53],[-12,47],[-36,62],[-10,208],[-24,134],[5,110],[-11,101],[-1,65],[5,123],[-19,141],[-39,138],[-35,199],[-5,88],[3,235],[-6,95],[0,113],[-14,117],[-6,63],[10,51],[6,-16],[10,-8],[7,67],[1,59],[-17,146],[-39,149],[-97,244],[-24,92],[-13,77],[-108,321],[-46,226],[-33,196],[-35,90],[-162,634],[-36,101],[-65,121],[-15,41],[-25,115],[-48,155],[-12,144],[-4,164],[6,125]],[[53261,41906],[45,14],[31,33],[28,2],[27,-26],[29,-2],[12,4],[52,-3],[30,30],[36,30],[20,26],[29,27],[39,28],[21,-3],[27,-10],[36,-10],[20,-19],[24,-58],[36,-53],[28,-32],[31,-42],[9,-16],[14,-9],[8,-3],[58,7],[53,6],[56,0],[106,-1],[107,0],[106,0],[106,-1],[106,0],[107,0],[106,-1],[106,0],[44,0],[76,-2],[80,-2],[8,-3],[9,-12],[8,-10],[28,-73],[36,-77],[30,-36],[36,-22],[33,-8],[32,5],[52,-9],[73,-25],[76,-8],[78,11],[55,-14],[32,-38],[33,-25],[33,-13],[45,8],[57,28],[49,-4],[22,-21],[14,0],[83,30],[68,25],[101,39],[83,32],[123,47],[87,34]],[[59222,43770],[12,-17],[40,-142],[32,-83],[37,-77],[6,4],[10,18],[19,7],[57,18],[23,1],[14,20],[30,15],[34,9],[12,-10],[36,-99],[5,-77],[8,-110],[2,-54],[-1,-72],[-4,-90],[-29,-104],[-6,-51],[-16,-80],[-21,-39],[-10,-33],[1,-33],[11,-28],[24,-51],[8,-32],[-2,-29],[0,-40],[6,-27],[6,-16],[25,-26],[23,-65],[41,-78],[48,-111],[23,-34],[18,-8],[9,-38],[-5,-43],[-14,-25],[6,-35],[7,-19],[9,-9],[22,-2],[19,7],[5,12],[-2,167],[-15,97],[-14,38],[-3,7],[5,32],[16,75],[14,74],[8,31],[10,19],[67,20],[31,17],[12,21],[10,58],[8,160],[3,151],[-7,88],[10,133],[15,82],[-8,17],[-5,111],[-44,118],[-56,152],[-31,82],[-36,94],[-65,146],[-29,52],[-16,21],[-52,17],[-14,28],[-14,45],[-5,83],[0,62],[-6,105],[-11,149],[-5,44],[-15,112],[-14,107],[-1,26],[5,26],[24,79],[18,55],[8,31],[14,83],[4,40],[11,18],[46,8],[37,-2]],[[61239,45815],[15,-60],[26,-54],[-15,-31],[-19,-28],[30,-38],[-22,-57],[-3,-40],[6,-15],[5,-24],[-15,-65],[-20,-50],[-5,-38],[18,-68],[-9,-119],[17,-108],[4,-55],[6,-37],[-8,-67],[2,-111],[4,-46],[-10,-57],[17,-20],[9,-63],[-3,-71],[-5,-38],[-29,-46],[-4,-18],[1,-27],[36,-1],[2,-42],[-3,-33],[2,-63],[-5,-40],[8,-46],[-10,-51],[4,-40],[0,-51],[9,-130],[1,-160],[2,-25],[13,-18],[18,-9],[0,-44],[-21,-58],[-1,-35],[3,-50],[22,68],[14,-1],[12,-26],[-2,-39],[4,-20],[-2,-38],[7,-48],[-3,-42],[-16,-29],[-21,-50],[-4,-48],[2,-30],[-14,-10],[-7,-19],[10,-45],[-1,-39],[-25,-123],[-68,-167],[-30,-59],[-27,-65],[0,-27],[-3,-23],[-32,-92],[-34,-15],[-20,-25],[15,-81],[-22,-19],[-39,-64],[-106,-122],[-17,-29],[-27,-75],[-35,-19],[-20,-21],[-36,-8],[-12,6],[-12,-3],[-10,-16],[-70,-53],[-66,-42],[-16,-19],[-11,-26],[-58,-41],[-91,-103],[-74,-97],[-54,-98],[-14,-15],[-17,-33],[-5,-50],[-6,-28],[-40,-103],[-60,-121],[-11,-34],[-24,-67],[-2,-44],[-22,-14],[-18,42],[-7,-81],[-15,-6],[-16,17],[-40,-41],[-35,-46],[-56,-98],[-80,-191],[-116,-183],[-16,-5],[-10,0],[-37,64],[-20,5],[18,-38],[12,-32],[-3,-61],[1,-93],[-14,-181],[2,-40],[16,-51],[31,-62],[30,-79],[37,-224],[3,-115],[39,-147],[1,-64],[16,-159],[-1,-128],[-3,-79],[19,-33],[7,30],[-2,50],[5,80],[10,35],[11,-5],[3,-38],[7,-33],[3,-31],[0,-43],[-14,-162],[4,-66],[19,-110],[-22,-128],[-33,-301],[-1,-52],[7,-23],[18,-7],[6,38],[11,0],[5,-23],[-14,-139],[-15,-61],[-51,-149],[-27,-64],[-46,-63],[-106,-98],[-215,-142],[-85,-70],[-50,-42],[-108,-132],[-47,-88],[-19,-102],[-19,-47],[-18,-59],[16,-50],[16,-39],[18,-25],[10,-22],[12,-16],[13,80],[6,25],[11,2],[-6,-98],[-13,-333],[-1,-11]],[[59622,44922],[-5,17],[-9,8],[-10,-7],[-4,-21],[11,-27],[12,0],[5,30]],[[59644,44866],[7,13],[3,17],[0,16],[-5,11],[-7,6],[-9,-4],[-4,-22],[-1,-31],[6,-10],[10,4]],[[49383,72064],[8,-43],[16,-34],[59,-78],[35,-48],[1,-17],[-12,-39],[-4,-27],[9,-29],[21,-35],[2,-17],[-5,-20],[-11,-37],[23,-111],[4,-107],[-6,-76],[0,-44],[3,-37],[20,-87],[-13,-143],[15,-78],[21,-63],[11,-113],[17,-53],[27,-47],[15,-16],[30,-39],[22,-32],[13,-48],[-27,-40],[-22,-36],[-6,-38],[10,-61],[0,-33],[-14,-11],[-56,3],[-44,3],[-50,3],[-71,6],[-44,4],[-61,5],[-20,-3],[-56,-17],[-39,-12],[-6,-4],[-13,-15],[-8,-45],[-8,-52],[-8,-23],[-117,-74],[-46,-11],[-26,8],[-19,-6],[-16,-16],[-6,-24],[-1,-31],[4,-31],[11,-43],[2,-44],[-7,-30],[-2,-31],[-3,-33],[6,-18],[11,-3],[11,-15],[16,-14],[14,-26],[-1,-38],[-11,-21],[-10,-11],[-44,-10],[-35,-8],[-45,-60],[-48,-64],[-58,-42],[-25,-12],[-44,-30],[-53,-50],[-26,-80],[-32,-93],[-32,-62],[-43,-58],[-40,-23],[-51,-28],[-63,-21],[-45,-8],[-14,-4],[-39,-2],[-20,5],[-14,2],[-6,-6],[-2,-15],[-1,-33],[-3,-38],[-12,-32],[-9,-15],[-11,-6],[-33,9],[-28,10],[-66,14],[-13,-3],[-5,-4],[-21,-22],[-32,-46],[-22,-41],[-16,-18],[-38,-10],[-17,-15],[-72,-101],[-15,-24],[-74,-88],[-21,-29],[-17,-28],[-44,-65],[-28,-28],[-5,-17],[-2,-40],[0,-87],[0,-84],[0,-122],[0,-122],[0,-140]],[[47587,67774],[-37,0],[0,-1],[1,-24],[8,-48],[3,-40],[-4,-25],[-4,-32],[2,-31],[6,-33],[6,-34],[0,-23],[-11,-18],[-27,-9],[-31,-8],[-23,0],[-34,5],[-22,-1],[-19,0],[-16,-5],[-21,-22],[-23,-35],[-29,-46],[-17,-29],[-23,-6],[-23,0],[-22,23],[-14,12],[-10,-1],[-15,-16],[-19,-12],[-17,0],[-29,24],[-34,34],[-20,17],[-29,6],[-29,11],[-20,-5],[-26,0],[-34,-23],[-29,-17],[-31,-18],[-36,-16],[9,-51],[12,-28],[0,-35],[-6,-30],[-17,-28],[-20,-37],[-11,-29],[-12,-39],[-8,-24],[-15,-37],[-13,-47],[-4,-30],[-6,-33],[-10,-11],[-35,-9],[-22,-11],[-19,-12],[-8,-20],[-1,-3],[-5,-40],[0,-29],[-6,-23],[-8,-57],[-11,-53],[-9,-69],[-8,-57],[-11,-93],[-11,-86],[-14,-81],[-11,-51],[-9,-29],[-19,-35],[-17,-22],[-19,-30],[-22,-28],[-31,-35],[-25,-29],[-10,-13],[-12,-16],[-20,-40],[-16,-57],[-11,-47],[-20,-74],[-14,-41],[-8,-22],[-22,-23],[-25,-18],[-28,-23],[-22,-23],[-31,-23],[-19,-23],[-14,-34],[-11,-41],[-14,-58],[-11,-63],[-6,-40],[-16,-139],[-6,-80],[-6,-52],[-8,-64],[-5,-97],[0,-81],[-6,-46],[-3,-35],[-14,-40],[-11,-29],[-19,-40],[-17,-23],[-5,-23],[-17,-29],[-17,-46],[-14,-29],[3,-23],[3,-40],[-8,-41],[-9,-46],[-22,-57],[-25,-29],[-36,-6],[-50,0],[-39,6],[-47,0],[-42,11],[-39,12],[-47,6],[-33,0],[-42,-12],[-108,0],[-42,-6],[-61,-23],[-15,-5]],[[45276,64182],[21,276],[38,149],[30,66],[47,35],[43,150],[16,138],[28,64],[9,50],[-11,38],[27,75],[32,114],[15,73],[38,113],[5,25],[-4,29],[-15,-25],[-16,-41],[-19,-33],[8,40],[15,60],[34,62],[53,69],[110,234],[42,41],[37,98],[14,88],[4,200],[13,106],[24,83],[29,150],[22,68],[15,136],[16,53],[28,24],[40,69],[60,42],[71,89],[33,53],[23,79],[24,158],[42,166],[22,125],[1,2],[37,66],[26,83],[43,37],[90,18],[134,69],[120,104],[34,42],[37,83],[60,108],[114,130],[52,72],[79,182],[53,150],[44,97],[30,86],[21,87],[12,140],[-8,55],[-33,89],[-23,24],[-6,42],[12,75],[0,128],[7,204],[37,165],[91,217],[17,88],[10,142],[1,50],[114,200],[67,154],[23,37],[59,70],[205,154],[116,109],[68,80],[40,94],[112,371],[110,521],[9,61],[49,17],[35,7],[28,19],[34,40],[33,-16],[-16,-27],[0,-64],[23,-75],[41,-85],[75,-107],[58,-43],[83,-26],[96,47],[54,1],[27,20],[28,-30],[55,-9],[52,16],[40,45],[25,51],[4,-25],[1,-28],[8,-16],[15,-66],[9,-25],[30,4],[26,-13],[59,6],[57,-11]],[[47587,67774],[0,-96],[0,-118]],[[47587,67560],[1,-96],[0,-114],[0,-114],[0,-130],[0,-129],[0,-94],[0,-66],[-57,0],[-51,0],[-52,0],[-52,0],[-52,0],[-51,0],[-52,0],[-52,0],[-52,0],[-51,0],[-52,0],[-52,0],[-52,0],[-52,0],[-51,0],[-52,0],[-52,0],[-41,0],[0,-69],[0,-78],[0,-79],[0,-78],[0,-78],[0,-79],[0,-78],[0,-79],[0,-78],[0,-79],[0,-78],[0,-78],[0,-79],[0,-78],[0,-79],[0,-78],[0,-79],[0,-69],[-2,-63],[-17,-19],[-40,-33],[-40,-34],[-52,-16],[-17,-11],[-33,-46],[-44,-59],[-37,-51],[-25,-67],[-9,-37],[-4,-39],[3,-37],[14,-74],[3,-37],[2,-65],[3,-71],[2,-76],[3,-76],[2,-81],[3,-81],[2,-82],[2,-61],[3,-76],[-42,0],[-64,0],[-63,-1],[-64,0],[-64,0],[-64,0],[-63,0],[-64,0],[-64,-1],[-63,0],[-64,0],[-64,0],[-63,0],[-64,0],[-64,-1],[-64,0],[-63,0],[-36,0],[-11,-108],[-10,-77],[-6,-63],[4,-53]],[[45264,63828],[-14,29],[25,300],[1,25]],[[55651,76513],[-36,-17],[-7,-25],[-17,3],[-21,0],[-7,-16],[10,-27],[7,-31],[-5,-43],[-2,-6]],[[55573,76351],[-5,2],[-30,-25],[-22,-12],[-20,-6],[-9,12],[-5,17],[1,47],[-4,16],[-6,7],[-14,-11],[-16,-36],[-15,-42],[-22,-45],[-18,-42],[-19,-53],[-14,-44],[14,-25],[9,-35],[-3,-26],[3,-15],[-5,-46],[-1,-28]],[[55372,75961],[-43,46],[-18,64],[-63,109],[-73,74],[-4,12],[4,14],[4,11],[-15,1],[-11,-9],[-10,3]],[[55143,76286],[-11,27],[-11,24],[0,22]],[[55121,76359],[5,2],[7,9],[15,23],[3,13],[-1,18],[-21,60],[-3,38],[-3,72],[4,17],[8,8],[38,9],[-1,56],[2,17],[8,23],[5,21],[21,31],[28,36],[12,1],[11,-5],[12,-31],[14,4],[2,37],[-17,49],[-9,31],[3,18],[6,9],[15,-6],[14,-9],[10,6],[14,5],[8,-2]],[[82411,80543],[-26,-80],[-52,-161],[-44,-135],[-23,-77],[-17,-58],[-18,-56],[-3,-33],[-19,-54],[-37,-64],[-8,-70],[1,-63],[-3,-57],[-41,-35],[-32,-32],[10,-107],[16,-41],[26,-43],[28,-35],[24,-30],[27,14],[22,45],[44,40],[24,1],[16,-9],[38,-3],[38,14],[31,3],[39,-9],[14,-10],[33,-17],[35,-38],[25,-43],[18,-8],[9,14],[20,37],[27,37],[34,60],[26,45],[20,7],[38,0],[18,11],[29,6],[26,-17],[71,-9],[20,-23],[34,-70],[19,-37],[33,-19],[21,-13],[18,-10],[17,-18],[5,-22],[7,-33],[11,-19],[20,-19],[16,-11],[4,-25],[5,-11],[14,-17],[42,-72],[20,-20],[31,-41],[13,-35],[1,-36],[8,-28],[20,-41],[10,-29],[-4,-38],[4,-34],[-8,-35],[-34,-25],[-11,-13],[-24,-1],[-41,13],[-39,-7],[-47,14],[-37,31],[-20,25],[-32,14],[-15,-7],[-18,-32],[-21,5],[-19,-5],[-49,6],[-26,8],[-42,-22],[-24,-7],[-45,-27],[-27,-47],[-20,-11],[-19,2],[-14,17],[-21,21],[-30,-1],[-9,-9],[-4,-19],[-10,-58],[0,-26],[-6,-17],[-18,-6],[-32,2],[-49,4],[-33,15],[-20,-7],[-27,-31],[-20,-5],[-15,-14],[-13,-46],[-20,-29],[-24,-36],[-26,-77],[-14,-44],[4,-24],[3,-28],[-12,-33],[-24,-30],[-20,-6],[-29,-29],[-40,-53],[-30,-44],[-40,-11],[-27,-11],[-62,-14],[-15,-3],[-68,-7],[-50,24],[-26,-4],[-24,-13],[-11,-15],[-5,-28],[-4,-25],[-19,-40],[-38,-53],[-32,-35],[-24,-45],[-14,-17],[-27,-17],[-15,-10],[-35,-40],[-28,-36],[-18,-10],[-22,9],[-14,3],[-43,14],[-29,2],[-41,9],[-95,42],[-31,20],[-27,54],[-24,27],[-34,3],[-49,0],[-23,10],[-37,-10],[-41,-54],[-19,-41],[-17,-41],[-20,-89],[-9,-60],[-8,-33],[-21,-53],[-3,-30],[8,-26],[16,-29],[9,-46],[23,-49],[22,-38],[43,-61],[12,-33],[14,-36],[3,-36],[-2,-24],[-16,-18],[-29,-9],[-15,-25],[-21,-33],[-26,-39],[-13,-2],[-14,-10],[-74,-48],[-27,-13],[-22,-16],[-27,-49],[-20,-36],[-25,-48],[-11,-21],[-23,-48],[-30,-55],[-16,-30],[-9,-17],[-8,-23],[-31,-18],[-26,-19],[-38,-28],[-55,-32],[-45,-30],[-29,-25],[-42,-31],[-29,-10],[-57,1],[-72,-8],[-52,-6],[-39,7],[-59,5],[-45,6],[-30,-12],[-72,-12],[-16,-3],[-126,-30],[-56,-16],[-52,-7],[-37,-12],[-22,-14],[-31,-21],[-17,-9],[-56,-41],[-125,-84],[-84,-69],[-13,-12],[-57,-48],[-32,-19],[-23,-43],[-18,-27],[-19,-12],[-34,28],[-24,-2],[-77,11],[0,125],[-53,-17],[-86,-29],[-79,-26],[-73,60],[-56,47],[-48,40],[-74,26],[-65,23],[-116,38],[-51,33],[-26,45],[-46,99],[-15,20],[-22,14],[-24,8],[-50,0],[-62,8],[-88,21],[-71,16],[-120,32],[-29,3],[-62,-27],[-81,-36],[-145,28],[-64,13],[-130,26],[-147,30],[-142,31],[-104,-17],[-57,-9],[-67,-14],[-9,15],[-3,59],[-12,46],[-36,50],[-25,47],[-46,63],[-15,40],[-5,62],[-43,162],[-27,109],[-6,22],[-12,36],[-15,18],[-32,12],[-8,19],[0,38],[5,52],[6,38],[-5,9],[-83,-10],[-51,25],[-43,27],[-60,70],[-36,27],[-46,73],[-67,17],[-25,28],[-32,62],[-27,40],[-39,25],[-62,23],[-105,21],[-35,9],[-58,-14],[-43,-2],[-70,16],[-40,19],[-49,0],[-32,0],[-43,4],[-20,13],[-19,15],[-36,-4],[-25,16],[-24,28],[-24,13],[-27,0],[-11,-13],[-10,1],[-7,39],[-25,62],[-4,28],[-15,32],[-9,29],[3,40],[10,78],[24,71],[16,18],[10,21],[20,37],[12,29],[-2,40],[-14,41],[-10,54],[2,31],[15,37],[17,81],[-1,21],[-7,17],[-2,38],[-3,51],[-21,77],[-11,41],[-20,18],[-23,11],[-20,55],[-25,66],[-16,41],[-5,25],[-3,45],[-12,56],[-12,30],[-9,23],[-5,34],[-5,12],[-34,15],[-24,25],[-10,33],[-4,27],[-7,16],[-19,5],[-14,-24],[-22,-12],[-14,2],[-15,14],[-9,16],[-15,17],[-22,55],[-22,14],[-42,-2],[-37,-26],[-22,4],[-19,9],[-22,27],[-14,23],[-22,7],[-44,40],[-29,28],[-3,56],[-14,39],[-28,11],[-29,39],[-42,22],[-27,16],[-23,10],[-3,15],[1,13],[11,21],[11,20],[2,19],[-9,16],[-23,17],[-31,15],[-6,26],[-19,26],[4,21],[14,16],[15,12],[3,19],[-10,19],[-5,28],[2,20],[-3,27]],[[52066,77044],[-17,-10]],[[52049,77034],[1,12],[4,7],[5,3],[6,-5],[1,-7]],[[23015,66797],[-5,-119],[-17,-97],[-55,-203],[-24,-126],[-44,-360],[-14,-236],[-3,-111],[-4,-15],[4,-17],[-10,-245],[5,-210],[-3,-32],[-17,-63],[-11,-88],[5,-39],[-1,-27],[17,-133],[5,-100],[50,-171],[28,-60],[34,-51],[13,-30],[-6,-72],[-14,-37],[-6,-59],[-7,49],[2,62],[11,34],[1,25],[-21,26],[-37,86],[-45,153],[32,-244],[11,-39],[9,-16],[14,-17],[4,-27],[0,-19],[40,-170],[45,-175],[3,-48],[18,-58],[114,-246],[70,-184],[25,-174],[15,-54],[7,-75],[46,-83],[14,-54],[24,-30],[20,-90],[38,-53],[-9,-1],[-33,27],[2,-18],[28,-37],[54,-37],[13,0],[-21,19],[-18,26],[6,4],[38,-32],[105,-11],[47,-75],[60,-32],[32,-96],[38,-100],[24,-5],[19,0],[56,17],[88,63],[30,30],[59,42],[90,8],[28,-12],[67,26],[33,32],[11,29],[5,22],[62,30],[13,6],[63,6],[31,11],[35,7],[26,-45],[0,-22],[-17,-21],[8,-20],[31,-34],[56,-13],[19,5],[26,49],[46,48],[-1,55],[-9,31],[-13,2],[-3,17],[9,40],[-2,14],[-29,-39],[-6,0],[3,18],[6,15],[83,85],[22,35],[28,31],[60,115],[13,218],[12,38],[40,67],[4,20],[3,45],[-1,114],[2,90],[-2,102],[7,90],[7,26],[23,145],[47,64],[82,76],[19,13],[261,80],[37,20],[45,52],[33,17],[60,-1],[18,7],[4,7],[0,7],[11,7],[34,-7],[65,-31],[24,-8],[58,-36],[63,-15],[10,6],[8,11],[6,22],[-6,18],[-6,-1],[-11,-10],[-13,-1],[-25,15],[5,13],[25,-1],[17,6],[24,22],[26,-16],[35,-75],[24,-24],[2,-108],[4,-19],[8,-29],[-12,-84],[-13,-69],[-17,-57],[-37,-89],[-45,-71],[-56,-159],[-13,-75],[1,-59],[9,-58],[-3,-21],[-6,-22],[-12,2],[-22,-28],[-28,-82],[-1,-25],[13,-23],[16,11],[21,1],[12,7],[12,-2],[-3,-47],[-13,-33],[-8,-11],[-15,-5],[-17,-19],[-9,-18],[1,-54],[9,-4],[20,40],[12,-2],[2,-17],[-26,-139],[-16,-143],[-23,-82],[-8,-121],[-11,-51],[-14,-51],[-8,3],[-21,96],[-23,25],[-4,23],[12,117],[-6,65],[-11,-3],[-15,-35],[-19,-31],[0,-45],[-22,-73],[-6,-25]],[[25473,62483],[-21,6],[-25,-3],[-17,-18],[-18,-89],[-43,-126],[-18,-62],[-14,-21],[-11,-8],[-13,15],[-29,34],[-24,-17],[-8,-39],[1,-50]],[[25233,62105],[-59,0],[-99,0],[-126,0],[-122,0],[-102,1],[0,-113],[-1,-100],[0,-112],[-56,1],[-60,1],[5,-12],[20,-21],[27,-50],[31,-78],[38,-63],[44,-46],[29,-46],[14,-44],[8,-38],[0,-32],[16,-24],[29,-17],[15,-28],[0,-22],[-9,-52],[-3,-57],[4,-52],[-21,-1],[-51,0],[-76,0],[-71,0],[-56,0],[-84,0],[-23,-80],[-38,-132],[-35,-119],[-29,-101],[-5,-26],[0,-22],[36,-94],[-6,-27],[-13,-15],[-4,-22],[1,-36],[-9,-47],[3,-33],[5,-41],[-8,-35],[-6,-34],[-7,-15]],[[24379,60221],[-8,13],[-74,157],[-78,172],[-30,56],[-29,43],[-40,79],[-104,174],[-54,80],[-50,95],[-45,53],[-45,34],[-20,20],[-17,26],[-10,2],[-5,-35],[16,-18],[19,-15],[14,-1],[16,-13],[46,-48],[7,-25],[-130,97],[-53,9],[-6,15],[27,50],[-9,18],[-9,3],[-28,-35],[-11,-2],[-2,23],[1,21],[-18,32],[-11,-1],[-10,-22],[-25,-42],[1,-17],[49,-18],[16,-10],[-3,-11],[-42,0],[-51,-19],[-92,-116],[-86,-50],[-122,-113],[-54,-5],[-29,-18],[-82,43],[-105,105],[-158,33],[-107,138],[-106,57],[-67,132],[-41,6],[-26,21],[-96,48],[-95,32],[-93,115],[-61,37],[-52,46],[-115,79],[-43,43],[-41,68],[-66,69],[-28,59],[-32,21],[-45,109],[-23,47],[-20,21],[-21,8],[-62,-9],[-91,48],[-43,12],[-88,72],[-118,80],[-39,91],[-32,86],[-60,113],[-37,48],[-64,57],[-36,46],[-55,35],[-93,91],[-29,77],[-18,68],[-49,83],[-55,156],[-14,57],[-10,88],[-13,51],[-15,39],[8,29],[27,36],[46,8],[33,39],[4,32],[-2,19],[-21,49],[-26,13],[-20,1],[-5,18],[15,20],[18,48],[25,58],[18,53],[4,75],[-3,76],[7,63],[-62,74],[-7,31],[-19,84],[-34,98],[1,195],[-41,173],[-42,86],[-22,30],[-59,134],[-46,77],[-46,146],[-45,93],[-58,156],[-41,78],[-189,262],[11,0],[55,-64],[9,5],[2,32],[-7,37],[-10,9],[-15,-8],[-20,8],[-10,12],[-29,8],[-38,44],[-16,45],[-1,52],[-54,110],[-20,62],[10,-5],[14,-25],[15,-7],[17,0],[12,10],[-4,18],[-12,15],[-78,58],[-26,41],[-64,68],[-15,24],[-10,65],[-16,3],[-13,-18],[-38,-18],[-10,21],[-1,20],[27,22],[24,61],[0,22],[-14,-25],[-20,-28],[-21,-15],[-32,-13],[-16,9],[-14,14],[-22,54],[-11,176],[20,61],[23,61],[20,35],[11,-27],[12,-3],[-9,31],[-19,28],[-7,29],[-1,26],[-9,48],[-57,102],[-54,-8],[-22,3],[-20,39],[-17,65],[-9,55],[-1,29],[-5,29],[-93,48],[-28,41],[-27,51],[-12,42],[-11,32],[-9,54],[-7,63],[11,82],[13,39],[-64,30],[-24,1],[-21,-16],[-18,21],[-37,24],[-45,85],[-53,155],[-57,50],[-19,54],[-24,48],[-20,60],[-4,26],[-6,15],[-29,42],[-32,71],[-9,57],[-8,87],[-22,31],[-21,14],[-5,41],[2,24],[-7,44],[-44,105],[-23,87],[-12,27],[-11,39],[-6,81],[-18,101],[-36,120],[-29,82],[-15,82],[7,83],[-5,51],[-4,12],[3,17],[10,-9],[8,15],[-1,53],[-10,16],[-29,17],[-12,11],[-70,22],[-39,30],[-3,70],[-19,32],[-16,20],[-52,41],[-9,-21],[-7,-39],[-21,-8],[-19,-2],[-32,27],[-79,103],[-17,17],[-25,9],[-12,16],[-53,55],[11,-29],[15,-30],[14,-87],[-16,-63],[-10,-220],[11,-44],[23,-70],[16,-112],[5,-82],[14,-66],[-4,-155],[5,-47],[22,-77],[41,-73],[9,-38],[53,-55],[33,-72],[65,-98],[20,-42],[58,-152],[2,-46],[11,-56],[33,12],[15,-42],[-2,-20],[4,-15],[17,3],[15,-11],[31,-166],[17,-22],[21,-10],[24,-18],[1,-42],[-1,-34],[21,-49],[-4,-66],[17,-56],[-3,-55],[7,-43],[50,-97],[62,-77],[13,-101],[26,-93],[25,-23],[27,-39],[-4,-40],[2,-24],[35,-73],[6,-94],[30,-61],[9,-4],[6,9],[-22,61],[-10,40],[-2,63],[8,8],[62,-99],[7,-74],[21,-42],[1,-56],[13,-34],[4,-49],[20,-80],[1,-112],[10,-82],[40,-125],[32,-26],[6,-61],[33,-159],[38,-87],[19,-73],[3,-45],[-14,-68],[-2,-47],[21,-143],[31,-73],[35,-18],[6,-10],[-3,-20],[12,-18],[13,23],[7,32],[-7,37],[-1,27],[6,19],[11,3],[67,-98],[11,-38],[25,-43],[23,-55],[9,-42],[19,-36],[9,-81],[46,-37],[25,-68],[2,-43],[-12,-110],[-11,-31],[-37,-47],[-27,-56],[-27,-34],[-27,-21],[-23,4],[-23,65],[-26,193],[-18,41],[-12,61],[-20,50],[-75,76],[-37,81],[-37,53],[-39,78],[-106,129],[-44,66],[-29,65],[-19,-1],[-14,-7],[-6,18],[-1,33],[-6,22],[-62,98],[-13,55],[-3,62],[14,162],[6,95],[-4,49],[-6,6],[-6,27],[-2,78],[-15,84],[-56,174],[-41,34],[-37,25],[-101,154],[-27,76],[-7,44],[-3,89],[-14,-52],[-19,-38],[-42,3],[-48,-43],[-29,40],[-15,46],[-24,55],[-26,11],[-17,2],[-31,68],[-26,21],[-36,9],[-32,34],[-9,38],[-5,53],[-12,32],[-49,62],[-39,69],[-38,45],[-11,36],[-1,25],[59,-7],[71,-27],[34,8],[21,25],[20,18],[3,-19],[-4,-37],[20,-33],[26,-27],[19,3],[-18,29],[-12,60],[5,22],[0,29],[-26,-6],[-4,15],[23,45],[25,120],[13,118],[-27,103],[-46,72],[-98,210],[-59,108],[-17,40],[-16,19],[-48,25],[-40,60],[-71,85],[-30,44],[-21,104],[-16,14],[5,71],[-7,127],[-12,32],[-38,31],[-9,86],[-2,82],[-8,57],[-65,96],[-3,46],[0,44],[-7,44],[-35,91],[-42,79],[-14,38],[-2,77],[-15,21],[6,5],[13,-2],[8,10],[1,54],[-63,84],[-18,116],[-34,61],[-8,23],[-18,109]],[[25850,63538],[-15,-18],[-7,64],[11,61],[14,36],[28,4],[18,12],[2,-16],[-15,-48],[-36,-95]],[[20416,64291],[-8,-47],[-21,19],[-8,30],[-1,48],[11,9],[17,-21],[4,-14],[6,-24]],[[19190,62638],[-17,-12],[-24,36],[6,27],[14,19],[14,-35],[7,-35]],[[19287,66246],[8,-65],[-15,10],[-18,35],[-13,44],[1,20],[3,4],[26,-26],[8,-22]],[[18568,68578],[-2,-10],[-29,35],[-64,122],[-23,61],[-4,28],[2,64],[22,-8],[25,-42],[12,-40],[0,-45],[48,-21],[7,-98],[6,-46]],[[18008,68012],[-4,-19],[-47,39],[26,67],[-4,70],[12,15],[10,-23],[13,-90],[-6,-59]],[[18832,68551],[-21,-136],[-21,2],[-44,43],[-5,27],[17,157],[13,21],[39,21],[6,-19],[4,-47],[12,-69]],[[17155,68514],[-12,-22],[-32,120],[0,29],[9,15],[15,-3],[0,-30],[13,-26],[5,-24],[2,-59]],[[25913,64077],[4,-28],[-4,4],[-7,21],[-4,26],[4,1],[3,-9],[4,-15]],[[24532,62601],[-31,-13],[-6,13],[63,58],[11,-2],[4,-8],[-33,-28],[-8,-20]],[[19498,65755],[-6,-3],[-14,31],[-6,75],[3,8],[27,-93],[-1,-11],[-3,-7]],[[18140,70106],[-9,-2],[-17,26],[1,25],[4,2],[17,-21],[6,-19],[-2,-11]],[[19139,66831],[3,-20],[-2,-6],[-11,14],[-19,-86],[-6,-8],[12,118],[12,17],[13,3],[-2,-32]],[[18972,65894],[-3,-27],[-84,108],[20,10],[23,-8],[44,-83]],[[18873,65982],[-6,-7],[-24,67],[-3,46],[-10,19],[-24,15],[21,93],[17,193],[8,-35],[-18,-195],[1,-26],[8,-24],[10,-40],[1,-44],[16,-40],[3,-22]],[[66014,40043],[-36,-17],[-39,6],[-15,31],[-3,13],[13,12],[-1,39],[7,63],[8,26],[20,23],[8,51],[17,34],[22,4],[22,-63],[16,-66],[-3,-65],[-16,-25],[-5,-38],[-15,-28]],[[45451,63194],[-17,-56],[-8,22],[-3,37],[15,52],[8,28],[14,9],[-9,-92]],[[45406,60966],[0,258],[15,97],[5,85],[33,187],[38,153],[36,204],[14,197],[-5,193],[-11,172],[-18,113],[-17,164],[-26,87],[-47,76],[-11,44],[11,16],[29,12],[18,59],[-38,-23],[44,181],[14,123],[-2,81],[9,50],[-35,108],[-26,136],[-14,22],[-14,11],[-1,-32],[-8,-29],[-17,18],[-29,99],[-41,161],[-15,17],[-12,-23],[-7,-21],[-14,-134]],[[47587,67560],[53,-63],[52,-64],[52,-64],[52,-64],[53,-63],[52,-64],[52,-64],[52,-63],[53,-64],[52,-64],[52,-63],[52,-64],[53,-64],[52,-64],[52,-63],[52,-64],[44,-53],[67,-86],[63,-80],[63,-81]],[[48660,66241],[-97,0],[-130,0],[-89,0],[-91,0],[-85,-1],[7,-131],[8,-143],[8,-143],[8,-144],[8,-143],[8,-143],[8,-143],[8,-143],[8,-144],[7,-143],[8,-143],[8,-143],[8,-144],[8,-143],[8,-143],[8,-143],[8,-144],[8,-143],[8,-143],[8,-143],[7,-144],[8,-143],[8,-143],[8,-143],[8,-144],[8,-143],[8,-143],[8,-143],[8,-143],[8,-144],[8,-143],[7,-143],[8,-143],[8,-139],[33,-73],[42,-92],[-12,-129],[-15,-155],[-16,-169],[-58,0],[-57,0],[-57,0],[-56,0],[-57,0],[-57,0],[-56,0],[-57,0],[-57,0],[-56,0],[-57,0],[-57,0],[-56,0],[-57,0],[-57,0],[-56,0],[-57,0],[-53,0],[-32,4],[-12,13],[-4,87],[-10,-5],[-11,-26],[-6,-28],[2,-36],[-2,-31],[-36,-12],[-49,-21],[-52,-16],[-52,6],[-18,7],[-19,12],[-42,12],[-22,2],[-26,-3],[-31,-7],[-10,-16],[-23,-66],[-22,-75],[-15,0],[-16,42],[-45,78],[-55,102],[-24,51],[-14,7],[-26,-37],[-22,-35],[-23,-50],[-11,-47],[-8,-57],[-4,-66],[-8,-78],[-19,-62],[-23,-47],[-16,-22],[-7,-13],[-49,37]],[[54046,72495],[-10,-19],[-26,1],[-24,29],[0,61],[27,-12],[25,-41],[8,-19]],[[53975,72596],[-16,-9],[-17,17],[-4,11],[23,9],[12,-8],[4,-15],[-2,-5]],[[48660,66241],[85,-110],[77,-104],[91,-124],[91,-123],[91,-123],[91,-124],[90,-123],[91,-123],[91,-124],[91,-123],[91,-123],[91,-124],[91,-123],[91,-123],[91,-124],[91,-123],[91,-123],[91,-124],[41,-55],[3,-23],[4,-46],[-2,-52],[0,-43],[12,-29],[23,-31],[89,-91],[7,-18],[3,-37],[11,-47],[19,-27],[22,-20],[26,-14],[81,-14],[17,-22],[35,-84],[19,-16],[54,-25],[38,-13],[17,-8],[35,-23],[38,-38],[20,-35],[0,-11],[0,-30],[0,-91],[7,-50],[8,-36],[-1,-22],[-9,-16],[-8,-19],[-4,-25],[-11,-32],[-9,-36],[4,-27],[15,-18],[23,-34],[19,-14],[9,-1],[12,1],[11,4],[68,26],[63,25],[88,34]],[[50060,60432],[-58,42],[-68,43],[-47,-27],[-8,10],[-6,18],[-23,10],[-36,-5],[-26,-12],[-41,-64],[-31,-55],[-8,-13],[-43,-33],[-80,-78],[-46,-57],[-10,-11],[-21,-13],[-31,-3],[-26,-14],[-23,-151],[-16,-15],[-95,61],[-19,-9],[-17,-18],[-53,-88],[-27,-71],[-14,-95],[2,-29],[0,-32],[-9,-18],[-13,-7],[-12,1],[-44,20],[-14,-9],[-6,-46],[1,-102],[-10,-69],[-26,-22],[-20,-27],[-16,-8],[-14,7],[-77,103],[-26,17],[-29,-12],[-28,-44],[-12,-28],[-17,-34],[-20,-45],[5,-39],[14,-44],[10,-55],[-1,-50],[-70,-70],[6,-24],[10,-28],[0,-51],[-2,-89],[-14,-33],[-18,-31],[-12,-42],[-11,-20],[-20,-25],[-27,-25],[-48,-23],[-38,-15],[-14,-14],[-20,-30],[-16,-36],[-4,-39],[3,-44],[6,-37],[7,-25],[4,-31],[-6,-85],[-14,-97],[-13,-44],[-21,-24],[-19,-27],[6,-64],[4,-92],[-6,-73],[0,-45],[-8,-48],[-5,-33]],[[48465,57848],[-9,8],[-38,-3],[-42,-26],[-14,-20],[-3,-27],[-10,-19],[-13,-20],[-13,-26],[-23,4],[-22,18],[-11,17],[-1,10],[7,25],[6,27],[1,18],[-8,43],[-6,47],[3,23],[-6,70],[-3,3],[-29,-18],[-10,-4],[-6,-8],[-2,-13],[7,-44],[-5,-8],[-16,1],[-23,15],[-25,40],[-6,-13],[-3,-32],[-1,-38],[6,-69],[-7,-25],[-16,5],[-23,0],[-19,-7],[-13,-2],[-8,-24],[-4,-28],[8,-31],[-1,-12],[-6,-12],[-8,-7],[-6,0],[-18,34],[-22,13],[-50,19],[-6,47],[-8,1],[-12,24],[-11,32],[-10,-1],[-8,-9],[-28,3],[-24,-49],[-18,-61],[-20,-29],[-21,-13],[-8,0]],[[47780,57697],[4,38],[-3,28],[-6,25],[-62,67],[-10,28],[-9,76],[-7,76],[1,44],[4,40],[-2,31],[-6,24],[-19,22],[-20,11],[-24,-30],[-12,-5],[-11,2],[-6,10],[1,16],[27,81],[13,34],[16,26],[10,14],[7,20],[1,15],[-3,12],[-17,14],[-28,38],[-14,4],[-12,18],[-13,59],[-6,11],[-13,6],[-12,15],[1,77],[0,66],[-27,108],[-10,67],[-13,69],[-12,33],[-22,27],[-26,19],[-24,4],[-18,-6],[-8,-8],[0,-13],[15,-44],[2,-24],[-2,-24],[-5,-16],[-13,-2],[-23,-13],[-28,-27],[-19,-22],[-16,-58],[-11,-8],[-18,8],[-53,42],[-44,35],[-30,21],[-18,-13],[-9,-7],[-26,-23],[-34,-86],[-8,-28],[-7,-9],[-9,-15],[-9,0],[-7,10],[-3,6],[-17,62],[-20,68],[-15,30],[-20,2],[-17,-22],[-18,-43],[-22,-41],[-14,-12],[-13,7],[-30,51],[-22,36],[-3,18],[8,28],[8,42],[8,34],[8,15]],[[70393,53704],[-6,-1],[-4,10],[1,14],[5,10],[7,1],[4,-9],[-2,-14],[-5,-11]],[[70419,54242],[-4,-6],[-5,2],[-2,7],[3,10],[3,13],[3,14],[4,7],[3,-2],[0,-8],[-2,-11],[-1,-14],[-2,-12]],[[78361,55438],[48,-22],[18,-18],[54,-178],[71,-126],[30,-46],[23,-23],[32,-67],[28,-84],[61,-237],[10,-105],[5,-159],[-14,-240],[-16,-119],[3,-57],[22,-86],[-6,-82],[4,-68],[-2,-189],[13,-55],[15,-36],[76,-112],[6,-41],[37,-143],[70,-310],[19,-139],[-2,-38],[-8,-15],[-21,-14],[-17,27],[-6,20],[2,24],[-7,24],[-16,28],[-10,26],[3,-42],[0,-55],[-21,-5],[-28,17],[-34,-15],[-40,-68],[-19,-2],[-15,58],[-8,39],[-12,28],[-127,142],[-47,37],[-50,107],[-112,119],[-71,116],[-30,71],[-73,64],[-31,74],[-16,15],[-15,27],[16,72],[-7,76],[-8,64],[-51,126],[-25,88],[-49,87],[-19,51],[-18,58],[11,21],[11,12],[-10,43],[-27,74],[-13,85],[0,160],[-39,226],[-34,313],[6,110],[-9,119],[-22,114],[-29,82],[-11,67]],[[82659,54245],[-11,1],[-24,12],[-48,61],[-49,22],[-71,2],[-41,8],[-16,-9],[-14,0],[-10,12],[-11,6],[-27,-36],[-13,11],[-14,16],[-23,5],[-28,-5],[-32,-37],[-34,34],[-10,-1],[-7,-8],[-15,-46],[-29,-35],[-14,-64],[-9,-61],[-7,-21],[-3,-119],[-4,-57],[7,-76],[-1,-32],[-13,-49],[-2,-11],[-6,-77],[2,-21],[-1,-25],[-11,-54],[-20,-15],[-20,-9],[-18,19],[-16,-30],[-20,-46],[-8,-31],[0,-29],[2,-19],[-4,-20],[-1,-21],[1,-30],[14,-13],[14,-26],[-1,-25],[-7,-17],[-18,-27],[-33,-55],[-37,-47],[-14,-11],[-5,-22],[-2,-29],[8,-64],[7,-18],[5,-23],[-5,-26],[-4,-23],[-14,-15],[-13,-10],[-5,-19],[-7,-76],[-8,-40],[-18,-59],[-6,-27],[-9,-9],[-35,28],[-31,-17],[-41,-11],[-35,2],[-27,-12],[-19,-31],[-21,-40],[-22,-29],[-16,-14],[-30,41],[-16,-3],[-27,14],[-65,47],[-16,13],[-17,2],[-5,13],[3,23],[-3,29],[-13,11],[-129,-4],[-38,-26],[-25,-20],[-18,-23],[-5,-59],[-11,-54],[-14,-58],[-43,-17],[-32,-59],[-11,-7],[-21,9],[-24,5],[-17,-17],[-17,1],[-55,28],[-51,4],[-30,-14],[-16,-5],[-89,-81],[-31,-9],[-12,12],[-17,33],[-24,32],[-55,112],[-21,26],[-14,27],[-13,32],[-18,35],[-17,24],[-23,48],[-22,53],[-5,93],[-18,17],[-7,24],[-2,28],[25,76]],[[80452,53011],[18,-80],[7,-18],[40,-54],[33,-27],[36,-11],[37,-2],[15,4],[14,10],[14,-11],[76,-88],[30,-15],[31,6],[13,-8],[44,-67],[13,-8],[22,5],[-28,30],[-18,22],[-8,41],[4,44],[18,29],[12,31],[5,94],[8,48],[14,46],[5,43],[-16,34],[-4,57],[3,47],[10,33],[15,-22],[15,-19],[15,2],[11,7],[2,25],[-3,43],[1,78],[19,63],[31,43],[29,21],[108,35],[172,89],[51,35],[19,18],[15,25],[27,80],[50,125],[35,103],[74,151],[59,139],[8,26],[9,76],[1,36],[-2,36],[8,17],[12,10],[3,0]],[[81684,54488],[8,-16],[21,-22],[15,-28],[10,-37],[8,-34],[0,-29],[10,-24],[26,-4],[8,-30],[18,-52],[17,-37],[10,-14],[13,7],[19,34],[14,42],[10,56],[-8,9],[14,42],[2,22],[-6,21],[-8,20],[-3,51],[-5,66],[-4,29],[11,22],[22,27],[22,31],[23,25]],[[81951,54665],[1,-45],[-1,-75],[7,-63],[15,-110],[18,-15],[21,-10],[12,3],[8,7],[2,9],[-13,44],[-3,102],[-11,67],[-17,67],[-7,19]],[[81983,54665],[65,19],[14,21],[26,46],[10,26],[7,58],[-32,34],[-12,44],[-1,48],[38,88],[13,21],[6,-31],[17,-8],[15,-1],[16,2],[22,44],[12,64],[39,91],[14,70],[8,72],[99,226],[12,36],[59,227],[7,7],[16,-22],[4,-72],[-2,-31],[-9,-47],[-6,-49],[7,1],[28,30],[29,79],[17,69],[14,30],[28,-17],[6,-12],[-2,-49],[3,-29],[11,-61],[24,-37],[33,-24],[31,-34],[10,-22],[6,-27],[7,-45],[0,-44],[-22,-44],[10,-71],[-2,-41],[-7,-35],[-33,-33],[88,33],[22,18],[30,47],[16,-41],[15,-69],[-12,-18],[-38,-26],[-2,-10],[13,-36],[16,3],[31,24],[29,38],[14,0],[15,-8],[29,-24],[16,-20],[13,-26],[9,-53],[33,-19],[68,-75],[12,-7],[14,-1],[35,9],[13,-10],[9,-27],[3,-34],[-1,-36],[-4,-27],[-8,-22],[-25,-34],[-61,-45],[-66,-34],[-34,2],[-47,29],[-17,-3],[-17,-14],[-21,-92],[39,-92],[66,-96],[9,-24],[-2,-29],[-11,-18],[-14,-9],[-37,-16],[-38,-11],[-30,-17],[-31,-21],[-31,7],[-43,43],[-12,3],[-13,-22],[-13,-60],[-8,-17]],[[78950,53416],[-14,-6],[-7,4],[-5,23],[11,51],[4,9],[11,-56],[0,-25]],[[77857,54893],[-7,-16],[-20,9],[4,94],[11,12],[18,-17],[8,-16],[-14,-66]],[[77735,55567],[19,-62],[-9,-27],[-5,-8],[-12,9],[-11,-24],[-11,-4],[-11,42],[-13,17],[-3,30],[18,5],[10,-10],[20,20],[8,12]],[[82539,55972],[-17,-31],[-6,37],[1,47],[23,44],[33,8],[4,-35],[-4,-40],[-7,-21],[-27,-9]],[[78143,53564],[-14,-10],[0,15],[2,21],[10,20],[5,-12],[-3,-34]],[[80941,53234],[-9,-8],[-13,21],[-3,175],[9,15],[6,-2],[7,-32],[-1,-76],[1,-68],[3,-25]],[[82745,54254],[-39,-11],[-27,1]],[[82679,54244],[5,20],[-1,27],[13,7],[15,-6],[34,-38]],[[63760,44681],[13,-60],[15,-58],[46,-140],[20,-53],[17,-57],[8,-114],[30,-178],[28,-266],[8,-273],[9,-126],[21,-118],[36,-122],[11,-136],[-21,-140],[-32,-132],[-8,-25],[-15,-34],[-6,1],[-26,34],[-20,56],[-26,132],[-10,66],[-10,11],[-31,-6],[-22,-41],[-4,-27],[5,-74],[8,-66],[4,-68],[0,-85],[9,-26],[12,-22],[12,-55],[3,-133],[-8,-67],[-22,-58],[2,-32],[8,-32],[-8,-20],[-29,-25],[-11,-22],[-16,-59],[-25,-120],[-3,-61],[16,-186],[-5,-132],[-32,-252],[-18,-119],[-26,-143],[-40,-189],[-39,-237],[-34,-243],[-25,-147],[-28,-144],[-38,-255],[-33,-258],[-48,-285],[-68,-317],[-7,-41],[-14,-163],[-15,-140],[-18,-140],[-37,-230],[-5,-71],[-8,-68],[-36,-144],[-16,-54],[-10,-57],[-6,-72],[-11,-70],[-27,-129],[-39,-110],[-27,-40],[-58,-59],[-30,-11],[-65,-2],[-64,-33],[-66,-64],[-63,-73],[-25,-35],[-27,-20],[-83,-4],[-26,16],[-84,120],[-32,20],[-62,17],[-18,10],[-17,16],[-25,62],[-50,54],[-12,16],[-7,37],[-5,39],[-13,45],[-10,84],[-16,59],[-45,104],[-5,33],[-4,110],[2,75],[-5,136],[5,65],[16,58],[-6,62],[-17,66],[-6,68],[-13,62],[-48,112],[-11,55],[-8,57],[-18,178],[-2,62],[3,130],[7,68],[11,47],[3,35],[8,30],[11,24],[7,28],[18,168],[23,37],[33,21],[27,44],[16,59],[15,121],[42,121],[15,63],[34,96],[30,135],[9,64],[7,65],[8,143],[5,71],[-1,70],[-17,72],[-41,132],[-1,24],[3,98],[-4,70],[-15,71],[-19,66],[-19,124],[-10,205],[2,74],[-5,65],[-14,63],[10,109],[123,397],[4,47],[-5,121],[2,71],[5,26],[9,15],[21,7],[99,18],[13,12],[25,33],[34,65],[15,19],[14,-7],[8,-28],[11,-15],[40,29],[16,1],[16,-5],[7,27],[4,36],[6,26],[11,14],[51,8],[33,11],[43,25],[9,-5],[34,-91],[11,-8],[13,-4],[12,17],[-28,48],[-4,26],[1,31],[15,65],[25,50],[56,76],[57,88],[17,6],[14,-14],[11,-103],[-1,-17],[9,-3],[10,13],[10,42],[0,34],[-7,34],[-4,28],[0,26],[29,61],[23,58],[10,70],[10,32],[24,36],[7,-6],[6,-29],[3,-31],[-6,-31],[-9,-31],[-4,-40],[14,-8],[13,10],[19,73],[21,70],[13,36],[16,25],[27,-5],[26,-15],[-43,73],[-10,101],[50,174],[1,37],[7,11],[3,14],[-26,59],[-5,29],[4,44],[12,40],[12,27],[16,11],[13,-15],[28,-49],[19,-7],[23,46],[18,58],[28,40],[32,25],[49,91],[32,191],[2,56],[-7,67],[-11,65],[-19,80],[5,18],[27,-11],[9,11],[28,71],[48,136],[16,0],[13,-25],[5,-37],[10,-28],[32,-65],[16,-48]],[[63428,44145],[0,-21],[-36,8],[-6,72],[18,3],[4,29],[11,4],[11,-64],[-2,-31]],[[63871,42106],[-32,-106],[9,89],[36,127],[11,10],[-24,-120]],[[56206,76217],[43,-86],[23,-34],[28,-27],[32,-19],[11,-19],[20,-91],[10,-34],[13,-11],[3,-10],[1,-13],[-15,-64],[-6,-144],[-4,-11]],[[56365,75654],[-16,0],[-21,-3],[-8,-11],[-8,-77],[-34,-22],[-30,-13],[-26,3],[-45,18],[-15,2],[-13,-10],[-40,-5],[-18,-14],[-42,-90],[-42,-32],[-14,-15],[-33,20],[-15,2],[-22,-23],[-49,-3],[-13,-4],[-38,-3]],[[55823,75374],[-2,12],[-7,18],[-17,9],[-36,-7],[-9,13],[-15,77],[-11,12],[-13,26],[-22,83],[-1,37],[2,32],[-12,74],[7,19],[11,12],[0,30],[-3,46],[14,90],[3,6]],[[55712,75963],[4,-4],[32,-7],[8,11],[6,18],[1,66],[8,30],[78,58],[23,2],[18,-27],[14,-17],[8,1],[3,17],[10,33],[16,19],[48,16]],[[51699,80714],[-3,-15],[1,-35],[8,-34],[18,-34],[14,-25],[19,-20],[33,-19],[13,-4],[1,-25],[-2,-27],[-11,-15],[-11,-21],[-8,-26],[-8,-50],[-1,-35]],[[51762,80329],[-19,14],[-10,10],[-17,3],[-17,-8],[-12,-18],[-18,-5],[-14,5],[-9,13],[-7,8],[-22,8],[-9,19]],[[51608,80378],[7,9],[6,15],[5,19],[7,19],[-21,50],[-5,16],[-17,28],[0,14],[4,14],[-1,11],[2,25],[12,24],[8,30],[14,40],[31,49],[21,-8],[10,0],[6,-17],[2,-2]],[[55805,83690],[32,66],[12,43],[8,61],[8,20],[0,-28],[-3,-46],[-20,-80],[-21,-41]],[[55898,83677],[0,4],[-9,42],[10,64],[-19,93],[-30,113],[-2,121],[-2,27]],[[55846,84141],[74,68],[94,73],[22,6],[86,44],[12,3],[78,-8],[62,-10],[51,1],[29,11],[26,-9],[20,-33],[22,4],[21,21],[116,-19],[26,0],[29,-3],[54,-19],[32,-18],[68,11],[30,0],[15,7],[47,49],[21,9],[19,8],[17,-7],[11,-42],[35,-72],[38,-13],[106,-27],[21,-15],[59,-64],[36,-31],[22,-25],[35,-49],[20,-35],[33,-27],[39,-18],[15,-3]],[[57387,83909],[-1,-26],[-7,-44],[-13,-56],[-14,-44],[-3,-17],[10,-14],[52,-7],[22,-7],[4,-12],[-11,-15],[-17,-13],[-7,-12],[-13,-42],[-86,5],[-12,-9],[-5,-19],[-4,-23],[-12,-28],[-23,-23],[-35,-9],[-29,-16],[-22,-49],[-16,-67],[0,-47],[2,-26],[-2,-15],[-11,-17],[-18,-43],[-14,-48],[-6,-26],[3,-12],[16,-1],[24,-10],[13,-19],[4,-22],[0,-24],[-4,-13],[-19,-10],[-30,0],[-17,12],[-4,9],[8,22],[-6,29],[-12,16],[-25,-24],[-24,0],[-29,-21],[-19,-34],[-18,-13],[-49,7],[-13,-15],[-10,-69],[-6,-14],[-40,3],[-40,-28],[-45,-22],[-22,15],[-13,18],[-24,-3],[-27,-8],[-17,4],[-20,-1],[-39,-14],[-48,4],[-21,12]],[[52646,79072],[3,-9],[1,-12],[3,-12],[1,-16],[4,-16],[8,-15],[3,-14],[-4,-18],[-4,-11]],[[53195,70957],[43,-37],[43,-14],[130,-136],[40,-17],[91,-16],[107,56],[40,10],[71,-52],[31,-15],[52,-4],[89,-47],[22,-17],[52,-75],[25,-23],[184,-69],[25,-46],[26,-87],[1,-109],[14,-79],[23,-102],[28,-72],[30,-61],[35,-37],[81,-56],[91,-21],[92,-8],[158,-76],[133,-89],[33,-44],[67,-43],[134,-208],[74,-72],[52,-14],[46,13],[83,72],[34,43],[84,180],[27,94],[11,66],[-3,67],[-10,61],[-23,63],[-17,84],[-9,151],[13,104],[16,63],[25,64],[69,122],[70,86],[122,113],[71,1],[30,12],[58,80],[24,3],[33,-20],[97,6],[42,-22],[51,-50],[64,-31],[45,-30],[48,-40],[11,-98],[-5,-29],[-1,-38],[50,-68],[142,-32],[28,-18],[39,-52],[25,-16],[97,-7],[57,11],[54,-18],[20,-18],[21,-40],[25,-99],[10,-33]],[[56986,70077],[-11,-16],[-15,-35],[-10,-30],[-26,-50],[-21,-53],[2,-79],[5,-79],[14,-78],[13,-86],[-4,-56],[-11,-70],[-12,-58],[-42,-119],[-7,-28],[3,-41],[25,-141],[2,-44],[16,-138],[14,-112],[15,-87],[2,-25],[0,-129],[0,-129],[0,-130],[0,-129],[0,-129],[0,-130],[0,-129],[0,-129],[0,-130],[0,-129],[0,-129],[0,-130],[0,-129],[0,-130],[0,-129],[0,-129],[0,-130],[0,-129],[0,-129],[0,-130],[0,-129],[0,-129],[0,-130],[0,-129],[0,-129],[0,-130],[0,-129],[0,-130],[0,-129],[0,-129],[0,-130],[0,-129]],[[56661,63073],[-133,137],[-134,136],[-133,136],[-133,136],[-133,137],[-133,136],[-133,136],[-133,137],[-133,136],[-133,136],[-133,136],[-133,137],[-133,136],[-133,136],[-134,137],[-133,136],[-92,94],[-99,-92],[-77,-72],[-103,-95]],[[53324,65390],[-26,102],[-30,114],[-40,142],[-24,87],[-8,14],[-111,69],[-117,67],[-69,-41],[-12,3],[-19,26],[-20,35],[-10,49],[-28,66],[-25,150],[-2,119],[-6,43],[-61,168],[-55,153],[-37,102],[-7,46],[4,57],[15,51],[54,60],[48,66],[7,45],[3,125],[-16,39],[-12,74],[-11,101],[-2,64],[22,128],[25,134],[-16,149],[-12,297],[8,235],[-7,85],[-4,36],[-16,110],[-21,114],[-9,40],[-26,92],[-43,114],[-22,70],[30,37],[28,29]],[[47143,56730],[14,3],[24,17],[14,-8],[6,-23],[3,-20],[72,51],[6,11],[4,-2],[9,-47],[5,3],[5,14],[5,1],[5,-6],[6,-22],[9,-19],[16,-14],[10,-19],[-2,-49],[4,-49],[7,-11],[4,-28],[1,-32],[4,-17],[3,-32],[-1,-34],[2,-24],[12,-41],[7,-53],[0,-37],[-4,-39],[-8,-35],[-13,-39],[-1,-16],[8,-10],[12,-2],[10,8],[25,-18],[14,-25],[12,-32],[10,-16],[5,-20],[18,6],[21,19],[4,9],[7,-5],[13,-2],[10,35],[7,40],[17,43],[8,16],[2,28],[1,36],[6,30],[13,17],[15,0],[8,-6],[4,-30],[11,-23],[10,-15]],[[47642,56197],[5,-7],[9,-18],[8,-60],[31,-194],[-2,-54],[-6,-35],[0,-35],[-2,-33],[-19,-56],[-56,-114],[4,-10],[13,-13],[14,-6],[11,3],[14,-28],[16,-36],[16,-18],[23,-17],[20,-2],[17,7],[24,-7],[26,-30],[9,-49],[7,-42],[9,-22],[1,-36],[18,-33],[26,-6],[34,-38],[9,2],[4,5],[4,-8],[8,-109],[7,-58],[-3,-23],[-5,-19],[0,-88],[-16,-51],[-2,-56],[-5,-18],[-16,-16],[0,-42],[-4,-52],[-2,-55],[4,-144],[1,-107],[8,-20]],[[47904,54349],[-32,9],[-94,82],[-73,47],[-242,267],[-68,108],[-77,160],[-173,322],[-39,51],[-50,25],[-31,28],[-21,30],[-18,89],[-43,53],[-80,75],[-60,126]],[[59963,71101],[-8,-10],[-15,-26],[-14,-22],[-30,-33],[-7,-20],[-6,18],[-13,-12],[-11,-75],[-23,-26],[-29,3],[-23,7],[-32,-5]],[[59752,70900],[13,44],[13,57],[13,77],[24,64],[49,217],[28,87],[10,125],[43,109],[33,32],[15,31],[0,47]],[[55846,84141],[-9,109],[5,217],[11,108],[51,63],[26,49],[15,65],[5,61],[10,49],[75,144],[60,15],[80,40],[90,33],[17,-42],[9,-32],[108,-117],[27,-40],[42,-135],[100,-68],[79,22],[34,33],[63,61],[28,45],[6,43],[-11,184],[-17,80],[6,50]],[[56756,85178],[11,-2],[27,24],[88,44],[17,2],[20,9],[56,34],[18,-18],[14,-20],[9,-1],[4,8],[-2,13],[4,10],[16,-6],[65,-55],[24,-13],[17,-4],[20,-26],[55,-18],[7,-13],[4,-17],[51,-71],[23,-35],[46,-33],[20,-7],[79,33],[23,11],[18,1],[19,-18],[42,-23],[39,-8],[7,2]],[[57818,84183],[-8,2],[-24,-8],[-38,-32],[-56,-78],[-14,-17],[-15,-59],[-3,-6],[-33,2],[-9,2],[-33,-1],[-71,15],[-28,-10],[-36,-60],[-14,-9],[-42,-8],[-7,-7]],[[79866,60313],[-15,-23],[-14,-59],[-10,-4],[-24,21],[-9,-11],[-15,-43],[-27,-47],[-13,0],[-9,5],[-11,-20],[-15,-36],[-7,1],[-26,-9],[-10,12],[-12,30],[-21,31],[-18,22],[-10,15],[-9,26],[-8,16],[-15,-36],[-26,-35],[-24,7],[-12,5],[-9,-50],[-7,-9],[-44,-9],[-8,-8],[7,-46],[26,-79],[7,-45],[-16,-73],[-45,2],[-20,30],[-19,41],[-7,21],[-57,41],[-39,-28],[-12,1],[-18,30],[-11,23],[-11,34],[-6,34],[0,16]],[[77811,63546],[2,32],[15,125],[18,81],[22,38],[22,16],[24,-6],[20,7],[16,19],[-1,12],[-19,3],[-8,21],[4,41],[8,26],[13,13],[13,40],[12,70],[15,35],[18,1],[30,30],[42,59],[16,57]],[[78093,64266],[16,-26],[-6,-66],[9,-14],[4,-23],[-2,-37],[3,-32],[7,-15],[9,-8],[45,27],[27,2],[12,-17],[10,-11],[13,-9],[11,-11],[6,3],[15,28],[5,5],[1,13],[-11,25],[-11,21],[0,46],[5,80],[1,41],[-1,100],[-2,27],[-10,33],[-27,61],[-7,38],[-5,38],[1,24],[-7,27],[-4,26],[13,13],[14,29],[7,45],[7,33],[10,14],[9,5],[6,-3],[23,-59],[28,30],[22,-1],[19,-15],[10,-19]],[[69707,76179],[-15,26],[0,27],[16,46],[14,23],[6,44],[20,29],[20,47],[25,38],[46,28],[25,-9],[24,7],[38,23],[7,1],[15,1],[96,-36],[32,-1],[74,-46],[34,-10],[24,-13],[11,-20],[18,-25],[93,-19],[26,-13],[9,-22],[26,-27],[23,-6],[-20,106],[8,63],[30,173],[15,26],[30,23],[46,26],[18,36],[38,-4],[16,3],[12,6],[6,21],[43,-35],[72,-71],[54,-45],[64,-43],[88,-39],[75,-13],[13,10],[30,59],[14,2],[26,-5],[79,-3],[81,-3],[38,6],[83,25],[12,1],[19,-2],[50,-33],[37,-5],[25,0],[14,-2],[31,1],[50,-4],[61,-22],[75,4],[23,4],[42,-4],[32,-20],[42,-22],[26,-9],[17,-5],[31,-2],[19,7],[11,-10],[10,-53],[26,-35],[20,-34],[17,-36],[17,-15],[30,-1],[57,-10],[33,-15],[41,-63],[39,-65]],[[72280,76146],[5,-35],[5,-40],[-3,-10],[-5,-6],[-86,-10],[-19,-11],[-20,-56],[-73,-45],[-42,-23],[-17,1],[-40,-37],[-113,-91],[-55,-58],[-28,-24],[-22,-27],[-4,-27],[-1,-25],[-62,-118],[-46,-15],[-39,3],[-27,-18],[-38,-18],[-83,12],[-28,-2],[-55,17],[-21,-9],[-24,-24],[-32,-95],[-13,-22],[-6,-21],[-5,-46],[-12,-49],[-16,-38],[-11,-36],[-23,-34],[-22,-22],[-17,45],[-14,-13],[-14,-18],[-26,6],[-16,-9],[-37,-39],[-54,1],[-6,14],[-11,108],[-9,51],[-8,11],[-10,2],[-77,-85],[-36,-15],[-30,-3],[-39,25],[-8,-6],[-7,-14],[-3,-17],[12,-48],[-3,-10],[-18,1],[-24,-11],[-19,-22],[-56,-78],[-47,-26],[-43,-10],[-18,-9],[-8,-9],[-15,-37],[-15,-58],[-8,-29],[-6,-16],[1,-22],[12,-27],[9,-63],[-2,-16],[-9,-26],[-14,-25],[-30,-16],[-23,-7]],[[63409,68907],[-16,-13],[-10,6],[-11,31],[-17,77],[10,29],[-1,12],[2,9],[5,6],[6,36],[7,12],[12,-25],[33,-88],[0,-37],[-2,-14],[-18,-41]],[[62925,68603],[45,94],[21,51],[38,109],[19,78],[19,87],[16,67],[4,12],[9,23],[21,24],[30,22],[51,9],[36,1],[8,-1],[22,-11],[63,-54]],[[63327,69114],[-2,-21],[9,-64],[20,-69],[17,-56],[2,-27],[-15,4],[-12,11],[-22,11],[-42,-75],[-26,-40],[0,-14],[34,-16],[25,1],[17,11],[15,-18],[10,-46],[4,-37],[23,-133],[19,-45],[24,-80],[9,-41],[5,-35],[15,-51]],[[55712,75963],[5,26],[-2,55],[-15,91],[-10,30],[-22,30],[-16,19],[-30,17],[-15,50],[-23,57],[-11,13]],[[98046,53645],[-17,-19],[-6,3],[21,27],[0,-3],[2,-8]],[[98011,53600],[-20,-22],[-6,12],[8,0],[14,22],[16,1],[-2,-11],[-10,-2]],[[98060,52906],[1,-14],[-16,37],[-9,23],[0,10],[5,-6],[5,-12],[3,-9],[11,-29]],[[98063,52832],[-10,-3],[7,9],[2,11],[-1,36],[4,-3],[1,-15],[1,-21],[-4,-14]],[[98064,52426],[15,-23],[-2,-15],[-5,-18],[-20,-46],[-6,4],[19,42],[8,27],[-11,21],[-5,-5],[-1,0],[-4,20],[4,0],[8,-7]],[[98474,51381],[-9,-16],[-4,14],[5,18],[-8,73],[-12,10],[-8,22],[4,0],[12,-20],[10,-9],[6,-48],[4,-44]],[[98547,51145],[2,-30],[-7,4],[-2,11],[-2,30],[-7,30],[8,-8],[6,-23],[2,-14]],[[98065,52616],[-7,-2],[5,11],[31,13],[3,4],[5,-7],[0,-7],[-2,-3],[-16,-1],[-12,-6],[-7,-2]],[[97097,51339],[-3,-1],[-5,6],[0,7],[4,4],[5,-6],[-1,-10]],[[2163,49244],[1,-4],[4,1],[4,1],[-2,-4],[-8,-2],[-3,10],[4,8],[4,1],[1,-2],[-1,-2],[-1,0],[-3,-2],[0,-5]],[[2476,50037],[-1,-5],[-2,4],[1,6],[2,6],[1,-3],[-1,-8]],[[2435,49272],[-3,-3],[-3,1],[-2,4],[0,6],[3,4],[3,-1],[3,-6],[-1,-5]],[[1524,49150],[3,-8],[0,-4],[-1,1],[-5,2],[-1,5],[3,-3],[2,1],[-4,6],[-2,5],[-3,2],[0,3],[3,-1],[5,-9]],[[6957,49488],[-1,-4],[-4,5],[-6,9],[-6,9],[0,4],[8,5],[10,5],[2,-6],[-2,-9],[-1,-18]],[[7838,45252],[-2,-9],[-5,3],[-2,12],[-1,12],[2,11],[2,-1],[4,-12],[2,-16]],[[6704,48601],[-6,-2],[-8,0],[-3,7],[-1,6],[3,1],[2,-2],[11,-1],[3,-4],[-1,-5]],[[6294,52912],[46,-67],[-20,-5],[-48,32],[-44,66],[13,15],[7,-24],[20,-22],[12,46],[7,11],[-35,48],[14,-3],[33,-32],[-5,-65]],[[5739,54103],[22,-49],[-4,-24],[-16,2],[-7,8],[12,5],[2,9],[-6,14],[-7,10],[-5,0],[-2,-20],[-8,16],[5,15],[6,10],[8,4]],[[2306,50249],[9,-11],[7,-15],[4,-20],[-1,-5],[-5,0],[-6,6],[-5,9],[-2,2],[-1,2],[6,-1],[6,-9],[5,-4],[-1,10],[-5,18],[-4,6],[-4,5],[-5,3],[-4,-3],[-1,-2],[-1,5],[1,3],[1,4],[6,-3]],[[61387,50599],[-11,-5],[6,33],[30,43],[13,-10],[2,-10],[-1,-8],[-5,-9],[-34,-34]],[[59796,55006],[-1,-19],[0,-27],[7,-16],[10,-11],[15,12],[12,16],[13,3],[77,-43],[12,-38],[0,-40],[3,-30],[-6,-29],[-6,-90],[2,-82],[23,-60],[20,-48],[16,-67],[13,-21],[16,-10],[53,-3],[78,-4],[75,-4],[7,-2],[16,-9],[69,-91],[63,-82],[54,-72],[52,-70],[51,-68],[39,-57],[39,-17],[62,-8],[44,-3],[40,-23],[60,-22],[44,-12],[27,-12],[75,-14],[12,8],[33,63],[37,101],[15,56],[47,56],[84,77],[59,55],[66,55],[30,-48],[41,-76],[18,-38],[15,-17],[23,-11],[27,0],[15,2],[30,10],[71,9],[41,-1]],[[61536,50866],[-40,-99],[-33,-45],[-45,-21],[-13,4],[-18,14],[-7,-24],[-5,-37],[-10,8],[-7,11],[4,-66],[5,-32],[-7,-44],[-22,-38],[-2,-32],[-47,-85],[-66,-10],[-35,-42],[-16,-34],[-12,-75],[5,-116],[-19,-88],[-3,-45],[-35,-57],[-15,-53],[-11,-54],[-10,-24],[-12,-120],[-16,-73],[-4,-25],[-4,-22],[-12,-43],[-8,-29],[-6,-20],[-41,-187],[-32,-85],[-24,10],[-17,-33],[-2,-15]],[[63939,77681],[-9,-17],[-15,3],[-28,61],[8,62],[10,13],[14,8],[2,-13],[-20,-28],[-2,-35],[17,-39],[23,-15]],[[63975,77748],[-10,-8],[-6,37],[11,31],[15,4],[-5,-49],[-5,-15]],[[64633,78001],[-5,-6],[-18,16],[-12,26],[15,31],[14,-5],[9,-33],[-3,-29]],[[64581,75910],[-7,60],[-3,94],[1,30],[15,79],[16,54],[13,56],[5,73],[-11,118],[-13,26],[-16,9],[-17,2],[-30,-5],[-14,-9],[-25,40],[-30,6],[-16,-11],[-16,-6],[-17,11],[-15,24],[-10,25],[-7,29],[-23,57],[-24,31],[-28,7],[-46,-1],[-15,3],[-1,33],[6,72],[0,38],[-3,35],[-8,29],[-10,25],[-27,42],[-21,58],[-35,120],[-30,135],[-13,21],[-27,21],[-60,17],[-39,18],[-15,17],[-7,29],[1,32],[3,38],[9,31],[31,25],[67,5],[58,-3],[53,-56],[17,-13],[18,-4],[37,18],[19,5],[46,-6],[-14,27],[-17,14],[-18,-1],[-16,11],[-25,52],[-45,59],[-10,24],[-3,39],[8,34],[32,34],[26,47],[13,63],[11,28],[23,45],[34,-8],[54,32],[87,-6],[105,9],[29,-3],[67,-32],[39,-14],[46,-7],[34,14],[-32,44],[-69,51],[-17,44],[31,119],[43,109],[26,129],[-7,128],[-13,35],[4,42],[15,35],[11,35],[-9,42],[-19,65],[-10,22],[-33,35],[-66,2],[-54,19],[-17,-16],[-10,-24],[-13,-15],[-42,-32],[-14,-6],[-14,6],[-21,36],[-18,-4],[-56,22],[-26,49],[-10,7],[-90,38],[-32,8],[-71,-40],[-52,-52],[-15,-7],[-27,-32],[-15,-6],[-16,6],[-14,-2],[-32,-49],[-57,-57],[-28,-35],[-31,-23],[-35,-14],[-36,-2],[-13,-13],[-41,-4],[-25,-11],[-1,-19],[5,-43],[-21,15],[-22,-30],[7,-28]],[[74256,80118],[-26,11],[-51,3],[-30,-7],[-15,-4],[-21,-24],[-16,-24],[-6,-40],[8,-45],[-11,-94],[-15,-36],[-32,-61],[-19,-14],[-30,-11],[-30,-18],[-58,-18],[-63,-9],[-22,-13],[-16,-42],[-12,-35],[-7,-27],[-17,-88],[-11,-78],[10,-98],[8,-108],[-1,-37],[16,-56],[7,-34],[-3,-48],[-22,-38],[-13,-51],[-13,-21],[-36,-10],[-34,-6],[-34,-43],[-27,-30],[-43,-38],[-20,-7],[-11,19],[-8,43],[-14,19],[-21,2],[-17,0],[-53,12],[-35,-1],[-25,-9],[-30,-5],[-51,16],[-33,13],[-22,13],[-53,38],[-70,45],[-28,13],[-17,-14],[-3,-25],[-4,-62],[-8,-39],[-49,-197],[-30,-137],[-38,-131],[-12,-88],[-23,-112],[-22,-81],[-9,-44],[-1,-18],[4,-25],[35,-28],[36,-17],[8,-10],[4,-29],[-1,-47],[-7,-44],[-11,-35],[-10,-17],[-12,-2],[-23,23],[-20,25],[-16,7],[-40,-13],[-37,-20],[-12,0],[-22,12],[-21,25],[-9,49],[-19,22],[-24,-22],[-75,-37],[-82,-44],[-51,-23],[-21,3],[-40,-5],[-35,-12],[-26,-17],[-52,-24],[-47,-16],[-30,-36],[-22,-35],[1,-13],[16,-20],[18,-17],[36,4],[35,3],[30,-22],[26,-14],[7,-18],[-7,-18],[-15,-4],[-6,-12],[3,-17],[-10,-43],[-5,-65],[5,-65],[3,-59],[-2,-30],[-1,-43],[11,-29],[10,-55],[18,-34],[27,-119],[16,-70],[15,-79],[-11,-42],[1,-25],[17,-21],[8,-40],[8,-25],[-2,-24],[-8,-10],[-37,15],[-31,-24],[-32,-25],[-4,-13],[-1,-14],[3,-13],[19,-22],[26,-14],[-2,-22],[-32,-10],[-48,-34],[-13,-36],[-11,-39],[-1,-24],[5,-61],[8,-69],[13,-72],[1,-22],[-7,-16],[-6,-10]],[[60770,71066],[20,-127],[19,-125],[20,-129],[20,-125],[-21,-12],[16,-96],[28,15],[29,11],[13,-62],[-41,-68]],[[59708,68751],[9,76],[-3,40]],[[59714,68867],[14,134],[8,63],[5,47],[20,94],[-3,31],[5,109],[-2,21],[9,60],[17,86],[17,74],[7,33],[17,71],[16,86],[-9,47],[-2,10],[6,54],[8,89]],[[59847,69976],[4,48],[9,63],[17,54],[-8,126],[1,68],[11,78],[-6,91]],[[59875,70504],[5,129],[1,12],[6,16],[4,8],[35,27],[14,3]],[[87046,72697],[-12,-21],[-24,7],[-14,31],[5,35],[25,27],[23,-54],[-3,-25]],[[88428,73630],[-26,-2],[-7,6],[16,14],[1,24],[10,42],[0,13],[-21,2],[1,48],[16,48],[43,75],[11,14],[2,-33],[-13,-77],[-3,-28],[34,-6],[-22,-93],[-42,-47]],[[87480,71594],[-30,-49],[-26,3],[-13,22],[-4,27],[25,43],[21,60],[19,27],[16,15],[12,-1],[-27,-84],[7,-63]],[[86283,69275],[-32,-12],[-17,13],[-16,71],[30,45],[41,-44],[8,-13],[-14,-60]],[[86377,69352],[-24,-6],[-1,34],[19,75],[2,55],[18,70],[8,15],[6,6],[6,-22],[-7,-85],[-18,-65],[-9,-77]],[[86133,70408],[-22,-20],[-3,19],[-9,9],[16,28],[0,12],[-11,19],[12,71],[-3,30],[44,12],[8,-29],[1,-87],[-33,-64]],[[85910,71499],[-18,-23],[-8,35],[8,102],[34,-21],[0,-31],[-16,-62]],[[85940,71632],[-6,-28],[-19,19],[-8,18],[17,87],[-2,34],[1,16],[35,45],[6,-8],[2,-13],[-3,-20],[2,-43],[-27,-71],[2,-36]],[[85740,70727],[10,-15],[16,9],[13,2],[9,-8],[11,-40],[4,-24],[-20,-3],[-9,-5],[-11,-30],[-16,11],[-10,14],[-2,19],[5,70]],[[86216,70520],[-24,-3],[-11,7],[-4,18],[35,37],[26,-6],[-11,-34],[-11,-19]],[[89186,77956],[-11,-37],[-14,55],[-3,58],[8,0],[16,-9],[3,-28],[1,-39]],[[89248,77833],[-19,-4],[-23,24],[-3,30],[17,24],[16,-9],[16,-31],[5,-16],[-9,-18]],[[88744,76083],[-6,-3],[-7,5],[-6,43],[5,23],[18,16],[17,5],[-14,-80],[-7,-9]],[[87319,71706],[-5,-11],[-5,3],[-18,-26],[-4,25],[-13,17],[-2,13],[40,9],[13,-7],[-6,-23]],[[88737,71846],[-3,-27],[-15,6],[-7,18],[1,32],[16,0],[8,-29]],[[85854,70760],[-7,-6],[-9,52],[-6,18],[10,10],[21,94],[4,-37],[8,-37],[8,-6],[-8,-27],[-12,-10],[-9,-51]],[[85969,70980],[-19,-27],[-15,0],[13,32],[2,15],[11,43],[21,15],[9,2],[-17,-44],[-5,-36]],[[86054,71283],[-20,-24],[-14,19],[7,51],[5,17],[16,-17],[6,-46]],[[86826,71494],[-8,-23],[-24,7],[10,20],[7,24],[6,5],[4,-26],[5,-7]],[[86740,71396],[13,-21],[32,9],[4,-6],[-9,-19],[-14,-19],[-26,14],[-16,1],[-2,31],[2,12],[16,-2]],[[86032,70078],[-9,-10],[6,45],[22,40],[2,-26],[-21,-49]],[[89496,67175],[-5,-1],[-18,61],[5,3],[10,-9],[12,-36],[-4,-18]],[[89950,77256],[35,-3],[16,2],[26,-8],[106,-88],[32,-11],[33,-1],[23,7],[20,24],[64,106],[67,97],[8,-4],[0,-27],[-5,-29],[-30,-89],[-33,-119],[-7,-60],[11,-59],[20,-49],[17,-66],[19,-93],[26,-11],[14,-2],[27,28],[25,35],[22,4],[22,-6],[-30,-24],[-28,-30],[-24,-57],[-9,-10],[-28,3],[-16,-2],[-32,-24],[-29,-27],[-27,-33],[-30,-17],[-32,-4],[-49,-27],[-32,-2],[-59,23],[-29,-6],[-63,-53],[-58,-77],[-50,-86],[-42,-104],[-17,-54],[-10,-60],[-2,-40],[-4,-38],[-9,-27],[-12,-22],[-35,13],[-57,55],[-110,81],[-117,123],[-66,62],[-123,-19],[-117,-118],[-11,10],[-44,81],[-22,32],[-26,9],[-19,-1],[-19,-6],[-26,-41],[-10,-30],[-7,-34],[-2,-24],[3,-24],[25,-53],[31,-40],[13,-8],[30,3],[14,-4],[49,-80],[55,-74],[12,-25],[-20,-26],[-22,-13],[-26,3],[-25,10],[-44,32],[-18,-27],[-29,-56],[-16,-60],[-13,-28],[-32,-36],[-34,-19],[-17,6],[-14,23],[-7,27],[-4,32],[7,69],[17,62],[7,63],[-14,89],[-9,18],[-36,53],[-17,50],[-4,63],[2,35],[9,77],[9,39],[16,13],[18,8],[28,27],[30,36],[29,41],[29,51],[15,55],[-25,68],[-5,40],[4,38],[26,20],[27,-15],[55,-56],[11,-5],[37,-3],[51,-12],[30,3],[14,8],[22,46],[10,59],[-4,75],[0,75],[14,61],[43,99],[12,57],[4,141],[16,62],[12,64],[6,135],[-17,129],[-18,64],[-20,60],[3,58],[16,53],[0,16],[4,14],[31,11],[14,11],[14,26],[16,15],[12,-15],[10,-26],[43,-65],[68,-116],[80,-176],[50,-86],[53,-78],[59,-79],[63,-69],[39,-32],[29,-52],[18,-8]],[[86437,71199],[37,-17],[16,-1],[14,7],[23,23],[23,17],[17,-9],[14,-20],[8,-28],[-4,-30],[-26,-63],[-22,-68],[50,-13],[50,1],[-12,-42],[-1,-36],[15,-18],[13,-23],[-4,-21],[-7,-21],[27,-32],[-2,-21],[-7,-22],[-68,-145],[-20,-73],[-13,-81],[-13,-59],[-9,-61],[-8,-66],[-12,-68],[4,-61],[-4,-62],[-34,-153],[-25,3],[-30,18],[-19,-3],[-10,-34],[17,-70],[-54,-83],[-60,-56],[-1,26],[6,20],[9,16],[6,19],[9,66],[-5,65],[-18,83],[-1,29],[12,12],[9,4],[4,11],[1,27],[-6,21],[-17,6],[-17,1],[-11,-31],[-16,-59],[-8,-59],[3,-33],[7,-29],[22,-49],[-6,-29],[-9,-22],[-77,50],[-17,4],[-14,11],[-15,67],[32,16],[9,8],[3,22],[5,65],[-15,55],[-12,19],[-11,23],[7,46],[-4,58],[-1,81],[6,14],[29,16],[21,44],[19,49],[27,87],[22,94],[-21,5],[-18,17],[19,45],[-6,56],[-29,69],[-17,81],[-26,36],[-14,13],[-17,-19],[-14,-23],[13,-53],[-1,-46],[2,-47],[13,-2],[16,11],[13,-8],[7,-24],[2,-32],[-5,-31],[-12,-15],[-15,1],[-14,17],[-12,24],[-27,13],[-28,-28],[-28,-58],[-23,-29],[11,42],[5,47],[-11,32],[-27,54],[-6,31],[-2,38],[5,37],[28,-43],[14,-53],[20,-23],[25,-1],[-19,79],[-7,20],[-28,35],[-37,59],[-23,29],[8,62],[14,12],[12,-3],[39,-22],[4,31],[-6,16],[-3,20],[26,26],[42,22],[9,11],[8,22],[10,11],[30,0],[25,21],[20,58],[5,31],[8,27],[51,46],[13,7],[34,-6],[32,-26],[16,-55],[13,-60],[33,-40]],[[87321,71576],[38,-24],[39,6],[0,-105],[5,-35],[11,-32],[-5,-46],[18,-16],[-53,-52],[-48,-70],[-20,-47],[-17,-50],[-11,-53],[-6,-58],[-16,23],[-46,93],[-29,26],[-47,13],[-15,-3],[-96,-87],[-13,-63],[-26,-96],[-12,-32],[-14,-9],[-10,-16],[-11,-82],[-30,-51],[-18,-1],[-31,14],[-14,-8],[19,81],[-30,9],[-30,-1],[0,52],[-18,30],[13,39],[0,31],[8,18],[3,25],[-1,22],[-18,6],[-12,16],[2,57],[-10,2],[-26,-10],[-54,-44],[-15,0],[23,31],[48,43],[21,25],[48,69],[29,33],[16,58],[5,36],[10,31],[9,49],[15,17],[27,43],[15,-4],[17,-53],[23,-40],[16,3],[30,21],[14,5],[34,-3],[30,26],[13,30],[4,37],[-11,63],[15,-6],[14,3],[33,40],[34,23],[35,6],[40,-22],[39,-36]],[[89229,75675],[11,-11],[52,29],[-10,-88],[-5,-89],[4,-148],[4,-67],[9,-65],[22,-46],[29,-33],[42,-105],[23,-129],[16,-63],[11,-66],[4,-30],[0,-30],[-3,-41],[4,-33],[-5,-105],[-19,-121],[-2,-62],[-16,-12],[-10,-29],[-9,-13],[-9,-10],[-14,-3],[-9,-11],[-4,-33],[-6,-31],[-12,-28],[-9,-31],[-8,-75],[-3,-77],[-11,-54],[-28,-14],[-32,1],[-40,-25],[-9,-15],[-32,-94],[-9,-56],[0,-59],[9,-73],[12,-72],[9,-133],[-10,-203],[-9,-65],[-20,-44],[-16,-20],[-13,-25],[-17,-66],[-29,-132],[-2,-34],[0,-34],[-8,-45],[-5,-44],[5,-51],[9,-48],[38,-123],[15,-36],[17,-34],[-65,-36],[-12,-17],[-39,-70],[-12,-67],[1,-73],[-7,-27],[-10,-23],[-12,-15],[-43,-34],[-28,-33],[-27,-52],[-11,-28],[-21,9],[-13,24],[12,31],[-3,35],[6,93],[-7,37],[22,28],[10,45],[24,35],[16,32],[3,26],[-15,28],[-15,20],[-22,0],[-21,-6],[-13,-27],[-5,-36],[1,-16],[-2,-15],[-32,-49],[4,-52],[10,-26],[12,-13],[-4,-17],[-15,-42],[-11,-4],[-20,58],[-25,32],[-31,0],[-31,-12],[-25,-39],[-8,-32],[-5,-33],[2,-81],[-10,-68],[-19,-59],[-10,-22],[-23,-40],[-17,-5],[-12,18],[-9,28],[12,101],[-1,57],[28,29],[-23,41],[-28,16],[-39,-21],[-11,-25],[-8,-33],[-21,-41],[-24,-39],[-26,-66],[-18,-79],[-58,26],[-32,6],[-32,-2],[-57,9],[-63,-16],[-71,-30],[4,22],[59,47],[2,14],[-6,26],[-14,1],[-35,-9],[-18,4],[-8,28],[-12,12],[-7,-12],[2,-54],[-9,-7],[-11,14],[4,42],[-8,61],[-1,39],[12,32],[-12,14],[-14,-5],[-17,-16],[-14,-22],[-32,-112],[-12,-64],[23,-52],[63,-72],[10,-17],[1,-31],[-8,-32],[-17,-15],[-69,-24],[-59,-46],[-18,-47],[-54,-183],[-43,-125],[-62,-43],[-67,39],[-16,43],[-14,54],[-25,48],[-22,53],[-13,63],[2,101],[-10,61],[9,16],[37,37],[12,21],[21,48],[8,27],[1,41],[-17,21],[-44,-1],[-43,-13],[-31,18],[-41,49],[-12,11],[-43,3],[-31,-9],[-31,-18],[-32,-6],[-11,-9],[-37,-60],[-29,-38],[-26,-19],[-55,-5],[-28,-12],[-29,-20],[-8,1],[-30,-27],[-35,-24],[-19,-24],[-34,16],[-68,-43],[-33,-5],[-34,23],[-31,38],[-30,-16],[-21,-56],[-10,-113],[-12,-50],[-4,-61],[-15,10],[-91,109],[-6,4],[-74,-19],[-19,-9],[-23,-22],[-25,-10],[-23,16],[-22,26],[-21,-8],[-22,-18],[-8,165],[4,21],[14,29],[14,25],[36,9],[36,-9],[25,12],[22,32],[23,47],[26,37],[35,30],[34,34],[30,48],[28,52],[26,39],[28,32],[43,77],[57,87],[22,64],[13,18],[49,35],[65,28],[31,-2],[30,-56],[17,8],[16,14],[34,8],[34,-9],[34,0],[33,7],[65,19],[34,22],[33,29],[118,20],[82,48],[12,-3],[13,-11],[1,-36],[-10,-39],[10,-24],[16,-14],[76,-5],[22,-8],[32,26],[30,33],[31,44],[22,49],[-20,61],[-4,67],[17,73],[24,62],[30,37],[27,42],[54,121],[40,98],[14,121],[-8,142],[34,106],[33,18],[66,49],[34,14],[5,-21],[-1,-28],[-51,-89],[-30,-36],[-17,-12],[-16,-16],[-7,-31],[26,-53],[7,-38],[-2,-37],[1,-34],[30,-36],[34,-12],[14,0],[13,10],[39,89],[8,15],[111,65],[55,50],[30,13],[28,26],[64,100],[23,46],[21,51],[18,59],[13,64],[18,40],[101,95],[32,52],[11,25],[12,73],[9,75],[12,59],[16,56],[22,57],[25,52],[15,54],[21,128],[10,72],[7,25],[11,22],[9,27],[7,31],[3,30],[5,93],[-3,72],[-16,61],[-14,17],[-15,1],[-23,-5],[-19,24],[4,22],[20,4],[13,12],[9,21],[18,66],[11,71],[1,31],[-14,58],[-11,69],[0,37],[12,43],[17,34],[16,9],[17,2],[15,13],[14,20],[8,21],[13,59],[4,33],[-7,90],[8,24],[11,15],[16,-11],[15,-2],[19,3],[17,-9],[4,-23],[11,-151],[6,-21],[13,-16],[14,3],[13,23],[8,32],[17,6],[51,-34],[18,24],[11,37],[11,66],[-5,60],[-13,21],[-12,-4],[-11,-16],[-13,-9],[-75,-31],[1,66],[16,99],[9,31],[12,15],[32,-17],[15,-11],[34,-48]],[[84525,65965],[-16,-91],[-14,-13],[-14,7],[-14,51],[10,19],[14,-10],[11,4],[25,74],[7,-12],[-9,-29]],[[84413,65829],[-18,-8],[-21,10],[-19,2],[0,18],[20,17],[0,25],[5,13],[46,-30],[-2,-22],[-11,-25]],[[84845,66096],[-24,-15],[-25,8],[4,81],[9,-11],[5,-28],[19,-16],[12,-19]],[[85627,67196],[-27,-27],[-10,-31],[-25,-11],[-24,-44],[-23,-9],[0,-35],[10,-30],[-15,-6],[-17,-36],[-1,-27],[6,-22],[-1,-11],[-20,-31],[-22,-2],[-1,35],[2,25],[20,63],[0,73],[19,8],[7,10],[29,52],[6,22],[-16,21],[1,25],[4,11],[24,-8],[10,-19],[5,-2],[14,14],[6,25],[27,50],[11,49],[21,-41],[-6,-52],[-14,-39]],[[85832,67811],[-12,-11],[-15,15],[-5,66],[7,32],[12,7],[11,-57],[7,-24],[-5,-28]],[[85958,68092],[-24,-47],[-25,42],[-31,29],[15,7],[8,11],[1,18],[20,27],[40,20],[12,2],[14,19],[5,17],[6,9],[25,24],[7,-28],[-1,-21],[-19,-12],[-19,-29],[-17,-36],[-16,-15],[-5,-11],[4,-26]],[[85922,68032],[2,-13],[-27,11],[-11,53],[18,-10],[6,-18],[12,-23]],[[88844,70884],[-5,-6],[-13,19],[-2,17],[2,10],[9,2],[18,-20],[-9,-22]],[[28538,62475],[34,-21],[35,-11],[15,0],[14,-7],[32,-49],[26,-28],[97,-60],[33,-105],[6,-33],[-25,-19],[-32,-7],[-30,-1],[-28,20],[-12,16],[-29,7],[7,14],[-13,7],[-16,-2],[-12,-40],[-14,-32],[-25,3],[-10,27],[-13,-12],[-11,-20],[-13,-75],[-21,37],[-23,31],[-28,13],[-57,2],[-28,11],[-22,63],[-9,18],[-23,17],[-22,72],[-8,10],[-62,16],[-12,40],[4,36],[20,44],[10,12],[34,-1],[32,13],[14,19],[15,12],[117,-32],[27,0],[26,-5]],[[52903,78839],[7,-6],[28,-1],[31,-4],[19,-31],[19,-10],[28,-3],[18,4],[9,11],[11,36],[19,45],[31,22],[52,5],[27,8],[27,-1],[20,-7],[21,1],[54,31],[56,25],[8,-4],[1,-9],[-10,-18],[-10,-25],[7,-29],[31,-57],[17,-44],[17,-33],[25,-17],[33,-11],[28,-4],[30,-12],[100,-31],[51,-8],[39,-2],[58,-20]],[[53811,78103],[17,23],[-43,82],[-19,0],[-26,-35],[-72,36],[-14,-15],[-10,-28],[-25,-35],[-35,-15],[-40,-38],[-41,-27],[-32,-21],[-18,4],[29,44],[-13,1],[-38,-31],[-22,-27],[-7,-44],[-7,-74],[17,-19],[30,-97],[36,-41],[-7,-40],[-9,-31],[-22,-27],[-19,20],[-11,0],[-8,-64],[16,-168],[25,-119],[25,-51],[57,-81],[60,-42],[108,-136],[59,-42],[15,-24],[36,-104],[31,-121],[33,-189],[24,-94],[48,-105],[100,-151],[90,-111],[84,-68],[66,-12],[155,15],[27,-6],[29,-19],[6,-47],[-10,-32],[-33,-33],[-33,-46],[-4,-63],[31,-44],[150,-117],[153,-98],[48,-50],[55,-78],[134,-107],[22,-52],[82,-111],[36,-87],[7,-67],[-17,-67],[-8,-48],[-14,-48],[-35,18],[-39,49],[-59,197],[-108,20],[-22,15],[-39,34],[-2,22],[-10,28],[-9,10],[-42,6],[-28,-32],[-34,-76],[-38,-109],[-39,-160],[-2,-64],[21,-63],[63,-35],[48,-56],[32,-58],[3,-140],[14,-80],[-21,-45],[-41,11],[-54,-29],[-39,-51],[-16,-49],[4,-128],[-8,-48],[-73,-92],[-38,-94],[-10,-39],[-14,-45],[-93,-1],[-21,55],[-1,81],[16,50],[34,24],[22,104],[-7,75],[14,33],[12,23],[26,14],[37,13],[3,105],[-28,48],[-10,66],[-14,124],[-47,157],[-25,140],[-19,69],[-30,37],[-54,-1],[-27,10],[-96,98],[-6,15],[0,25],[16,40],[-10,52],[-12,50],[-18,43],[-21,22],[-43,-14],[-15,-10],[-27,4],[-21,-19],[-12,-1],[33,75],[-9,17],[-33,31],[-45,5],[-12,4],[-8,-20],[-8,11],[1,33],[-53,150],[-35,61],[-17,11],[-32,-13],[-54,27],[-32,6],[-17,-7],[-27,-19],[-13,12],[-5,20],[-48,63],[-61,35],[-118,197],[-36,74],[-75,81],[-47,119],[-39,43],[-56,35],[-13,-4],[-17,-13],[-13,-2],[-10,15],[10,16],[12,7],[-4,45],[-64,118],[-38,37],[-10,24],[-8,32],[-8,20],[-18,13],[-15,-3],[-21,8],[1,57],[4,43],[-3,37],[-20,96],[-36,82],[-20,195],[-17,55],[-39,42],[-88,46],[-122,126],[-26,2],[-74,49],[-46,8],[-59,-43],[-72,-121],[-59,-125],[-21,-25],[-75,-43],[-67,-20]],[[52081,77054],[-1,32],[-2,24],[11,27],[19,31],[17,40],[7,28],[-3,19],[-8,28],[-11,2],[-63,-23],[-15,6],[-47,36],[-50,46],[-19,32],[-7,32],[5,21],[-4,20],[-10,27],[9,31],[16,39],[8,26],[13,7],[6,16],[-10,64],[-6,10],[-9,8],[-14,1],[-24,13],[-18,22],[-4,30],[-9,28],[-16,27],[-1,28],[17,15],[25,1],[17,-6],[39,46],[14,4],[13,10],[10,63],[9,19],[2,11],[-8,13],[-31,45],[-15,46],[-22,51],[-21,23],[-4,18],[-1,23],[5,19],[37,31],[23,34]],[[52887,76530],[9,-22],[1,-13],[-6,-15],[3,-33],[-24,28],[-35,-14],[-21,3],[-6,24],[5,15],[33,3],[11,7],[20,-3],[10,20]],[[53871,75291],[-12,-5],[-7,6],[-4,9],[5,22],[25,-13],[-1,-12],[-6,-7]],[[53347,73016],[-13,-6],[-18,19],[-1,28],[3,9],[22,-13],[6,-26],[1,-11]],[[54326,73859],[-19,-66],[-9,-25],[-67,-160],[-7,-37],[-5,-40],[-7,-35],[-9,-34],[-9,-42],[1,-48],[4,-23],[8,-16],[13,-14],[10,-22],[-16,-21],[18,-40],[14,-24],[2,-24],[0,-24],[-30,-46],[-12,-24],[-8,-31],[-3,-31],[3,-28],[-1,-28],[-30,4],[-32,17],[-31,-8],[-45,33],[-16,5],[-15,13],[-38,100],[-30,43],[-32,33],[-33,2],[-33,-4],[-29,20],[-59,68],[-63,55],[-27,35],[-12,24],[-14,16],[-36,16],[-33,37],[-14,2],[-32,-4],[-16,2],[-16,13],[-32,44],[-20,60],[-5,26],[14,69],[17,65],[15,19],[17,13],[11,20],[9,23],[32,-68],[15,-17],[14,4],[26,24],[2,27],[29,35],[36,0],[17,-6],[9,-31],[14,-9],[16,-5],[53,-59],[15,-9],[15,-2],[41,25],[31,9],[66,-13],[36,15],[25,1],[36,23],[28,38],[15,9],[15,3],[38,-2],[38,-9],[16,9],[13,25],[16,11],[17,-8],[44,43],[19,2],[18,-16],[-16,-27]],[[52675,75392],[14,-37],[31,-151],[3,-32],[-6,-34],[-8,-23],[-31,-76],[5,-63],[11,-39],[2,-43],[-6,-54],[-19,-328],[-9,-58],[-6,-50],[-21,-16],[-28,17],[-34,28],[-16,-2],[-16,-10],[-13,9],[-13,16],[-9,-113],[-16,-46],[-23,-29],[-23,-2],[-23,10],[-19,0],[-15,21],[-12,38],[-18,47],[-19,55],[-2,49],[-3,109],[5,24],[8,23],[4,49],[-3,43],[6,15],[11,-15],[8,5],[-1,22],[3,40],[-15,34],[-24,11],[-2,35],[2,35],[13,23],[4,30],[1,94],[-18,34],[-6,52],[-9,33],[-16,34],[-18,27],[-12,26],[-2,69],[6,58],[6,24],[6,-3],[18,-29],[15,-6],[29,-7],[29,9],[35,26],[34,31],[49,93],[30,18],[16,25],[5,33],[13,8],[15,-32],[19,-3],[29,-26],[12,-26],[11,-30],[10,-13],[11,-8],[2,-7],[-9,-7],[-10,-35],[6,-10],[16,-19]],[[52355,74347],[-16,-57],[-17,40],[-1,35],[3,10],[20,-15],[11,-13]],[[52301,75483],[-9,-26],[-13,2],[5,19],[12,39],[15,13],[6,-11],[-7,-23],[-9,-13]],[[59875,70504],[-19,3],[-23,28],[-4,25],[-7,8],[-16,3],[-31,13],[-35,-43],[-15,-70],[-4,-33],[-12,-70],[5,-42],[2,-55],[3,-45],[-3,-27],[-7,-15],[2,-10],[6,-4],[19,12],[21,-12],[20,-23],[1,-15],[-14,-9],[-33,-35],[-23,-41],[-6,-38],[-16,-81],[2,-16],[8,-10],[54,9],[48,32],[37,35],[12,-2]],[[59714,68867],[-19,-44]],[[59695,68823],[-10,50],[-21,142],[-16,98],[-21,121],[-36,147],[-3,35],[-8,51],[-25,134],[-20,96],[-23,123]],[[59512,69820],[29,48],[0,41],[49,94],[-1,9],[-13,25]],[[59576,70037],[2,4],[54,175],[35,173],[33,241],[23,122],[20,81],[9,67]],[[59512,69820],[-9,48],[-4,18]],[[59499,69886],[52,92],[25,59]],[[47236,82899],[-1,-17],[-21,21],[-10,22],[-56,11],[23,22],[12,-6],[40,-1],[11,-10],[2,-42]],[[48272,83000],[12,-21],[5,-21],[-20,-7],[-22,4],[-10,-14],[-1,-26],[8,-34],[14,-24],[11,-55],[10,-60],[14,-37],[3,-45],[-2,-22],[3,-40],[-6,-14],[4,-38],[18,-78],[7,-43],[5,-94],[-12,-36],[-16,-33],[-11,-40],[-8,-43],[-5,-70],[-36,-81],[-15,-20],[-18,-13],[39,-56],[-32,-26],[-34,-8],[-38,14],[-23,-1],[-22,-19],[-8,-11],[-7,6],[-14,46],[-11,-48],[-22,-15],[-37,3],[-62,-13],[-24,-14],[-10,-21],[-8,-25],[-10,-14],[-11,-8],[-48,-18],[-9,-8],[-23,-40],[-29,-23],[-24,-7],[-21,23],[-9,14],[-10,8],[-33,-2],[10,-7],[7,-16],[3,-32],[-4,-31],[-16,-15],[-19,-3],[-31,-32],[-41,-9],[-22,-30],[-134,-50],[-7,0],[-19,13],[-20,5],[-20,-4],[-56,-28],[-28,6],[35,69],[47,35],[5,10],[-16,4],[-88,-24],[-31,-21],[-31,-6],[14,32],[40,43],[21,21],[14,8],[14,25],[42,29],[-135,-59],[-35,7],[-8,16],[-28,-7],[-10,40],[40,61],[24,26],[29,14],[27,20],[10,25],[-13,8],[-82,-6],[-39,5],[2,20],[8,22],[40,37],[22,6],[20,-4],[19,-9],[15,-13],[46,8],[-19,23],[-3,49],[-15,16],[19,22],[21,14],[36,47],[13,7],[71,11],[76,24],[76,34],[-39,19],[-19,25],[-30,-51],[-21,-19],[-61,-10],[-19,6],[-27,15],[-9,-6],[-8,-12],[-40,-24],[-42,-6],[49,45],[62,76],[14,25],[20,42],[-6,18],[-13,11],[45,87],[16,15],[29,3],[22,14],[9,0],[8,5],[19,26],[-29,16],[-29,9],[-92,-9],[-12,2],[-12,8],[-7,11],[-6,30],[-6,6],[-21,0],[-20,-9],[-15,1],[-14,13],[23,30],[-29,7],[-29,-6],[-25,9],[0,19],[11,19],[-15,18],[-3,23],[16,11],[16,-4],[35,17],[43,8],[-37,16],[-15,14],[-1,22],[3,18],[44,32],[46,13],[-4,21],[4,22],[-47,7],[-46,-16],[5,43],[11,38],[2,25],[-2,27],[-22,-11],[-3,38],[-9,26],[-32,-18],[1,35],[9,24],[17,11],[17,-5],[30,0],[30,19],[43,4],[69,-5],[47,-52],[12,9],[19,33],[9,3],[71,-14],[44,-18],[12,6],[-7,35],[-15,25],[19,33],[23,22],[16,11],[36,14],[15,13],[11,42],[16,35],[-90,-18],[-85,41],[14,29],[18,17],[31,13],[3,15],[15,13],[26,33],[-9,43],[5,32],[19,21],[6,30],[8,22],[38,8],[37,20],[13,-2],[43,5],[15,-8],[-4,36],[27,4],[10,-7],[5,-25],[12,-17],[3,-28],[-8,-22],[-13,-17],[12,-17],[-19,-31],[21,13],[29,31],[-1,25],[-5,31],[-9,28],[4,31],[17,20],[43,10],[-18,35],[16,3],[18,-7],[25,-28],[26,-21],[28,-17],[-27,-35],[-32,-23],[-13,-26]],[[62434,73238],[0,-4],[9,-41],[23,-153],[13,-19],[15,-16],[11,-23],[4,-23],[-1,-35],[0,-41],[6,-31],[9,-24],[8,-12],[12,-1],[14,-6],[9,-24],[31,-174],[3,-22],[13,-7],[21,3],[21,-18],[24,-28],[21,-53],[15,-9],[46,8],[63,-8],[29,-28],[-3,-16],[-23,-19],[-39,-22],[-12,-38],[-7,-48],[1,-27],[10,-30],[28,-60],[2,-21],[5,-30],[5,-21],[-6,-40],[-25,-27],[-34,-30],[-67,-132],[-5,-29],[0,-78],[-7,-23],[-21,1],[-17,4],[0,-28],[-11,-36],[-6,-32],[25,-75],[4,-40],[-4,-36],[-23,-63],[-13,-42],[3,-9],[18,-17],[56,-138],[17,-48],[24,13],[9,-1],[7,-8],[4,-16],[0,-21],[-6,-31],[30,-12],[11,-32],[35,-107],[-2,-32],[-16,-50],[0,-34],[3,-30],[5,-11],[52,-4],[22,-12],[53,-55],[61,-84],[50,-69],[43,-58],[45,4],[13,-11],[11,-18],[13,-48],[26,-109],[22,-37],[34,-87],[32,-82],[-21,-111],[-20,-116],[0,-149],[0,-80],[43,-3],[49,-4],[0,-96],[0,-96],[1,-110],[14,-5],[23,-23],[9,-36],[13,-19],[14,-3],[15,-18],[14,-32],[5,-24],[-4,-16],[3,-29],[10,-42],[13,-19],[18,-24]],[[63484,69102],[-25,-14],[-28,11],[-59,48],[-19,2],[-25,-19],[-1,-16]],[[65607,67350],[-26,-69],[-39,-58],[-17,18],[-12,0],[-28,-23],[-20,-3],[-37,-40],[-33,-20],[-23,2],[-8,4],[-5,27],[0,10],[15,-5],[51,36],[64,58],[6,26],[-10,43],[3,9],[41,-21],[46,42],[39,11],[19,-29],[-26,-18]],[[67017,72361],[5,-38],[-1,-23],[-9,-23],[-6,-29],[-7,-36],[-3,-28],[-13,-14],[-11,-9],[1,-36],[6,-31],[6,-36],[-7,-25],[-5,-28],[-10,-46],[3,-38],[-11,-33],[-14,-28],[-9,-23],[-2,-33],[-10,-11],[-19,-27],[-12,-19],[-18,-5],[-3,-16],[2,-15],[8,-9],[11,-33],[24,-57],[-68,-7],[-21,-51],[-23,-72],[11,-145],[-11,-75],[7,-42],[17,-29],[23,-16],[42,-1],[28,-12],[3,-19],[-16,-28],[-26,-54],[-14,-23],[-43,-107],[0,-45],[4,-37],[19,-116],[18,-112],[33,-202],[0,-46],[-11,-105],[0,-63],[4,-82],[-3,-43],[8,-95],[9,-7],[72,-18],[65,-17],[87,-23],[27,-56],[16,-122],[-1,-92],[-7,-47],[-63,-134],[-63,-136],[-63,-135],[-73,-156]],[[67107,66360],[-15,-4],[-12,-24],[-22,-30],[-47,23],[-37,24],[-124,57],[-13,28],[-8,48],[-21,13],[-31,-72],[-104,42],[-36,-13],[-21,22],[-57,2],[-44,45],[-64,-31],[-50,-6],[-69,79],[-74,22],[-60,-7],[-31,6],[-50,29],[-24,29],[-39,-22],[-18,41],[-110,38],[-21,74],[-15,68],[-1,70],[-27,123],[-9,177],[-10,70],[-15,60],[-20,51],[-27,55],[-24,22],[-103,42],[-20,-6],[-46,-27],[-49,-61],[-81,-34],[-17,-26],[-20,-59],[-26,-35],[-36,9],[-39,-35],[-72,-97],[-38,-29],[-32,2],[-34,46],[-76,62],[-49,20],[-69,-14],[-32,11],[-56,72],[-14,53],[-32,35],[-99,79],[-81,105],[-15,39],[-10,59],[-35,71],[-79,58],[-45,61],[-52,14],[-49,-2],[-21,11],[-20,27],[-67,127],[0,51],[-41,124],[-10,45],[-9,123],[-11,32],[-43,51],[-7,33],[10,44],[0,34],[-23,31],[-33,17],[-8,38],[6,73],[-5,47],[-30,73],[-43,76],[-44,111],[-17,28],[-11,73],[-16,87],[-24,6],[-119,-104],[-35,59],[-104,102],[-8,15],[-7,23],[13,14],[13,5],[26,-18],[16,21],[-6,35],[-26,21],[-36,-2],[10,-32],[-34,-30],[-7,-41],[5,-49],[3,-70],[-14,-33],[-10,-16],[-45,-4],[-21,-31],[-14,-7]],[[62449,74683],[5,-13],[45,-118],[20,-35],[12,-29],[8,-33],[13,-23],[18,-12],[23,-32],[15,-25],[25,-51],[26,-20],[96,-37],[54,-17]],[[62809,74238],[15,-5],[41,25],[48,-4]],[[62913,74254],[18,-1],[64,105],[19,36],[38,18],[21,42],[34,50],[42,48],[38,43],[30,26],[53,61],[33,21],[29,-1],[43,-71],[36,-65],[11,-28],[-18,-25],[-34,-25],[-6,-18],[-2,-23],[1,-22],[5,-18],[41,-42],[5,-23],[0,-23],[-5,-15],[-9,-8],[-29,-12],[-24,-13],[-9,-14],[-7,-16],[1,-17],[7,-20],[51,-55],[5,-20],[10,-27],[13,-17],[21,-4],[10,-11],[48,-101],[12,-7],[57,22],[8,-1]],[[63574,73983],[1,-25],[8,-143],[7,-74],[9,-72],[16,-66],[18,-62],[25,-39],[56,-47],[27,-13],[71,-9],[71,-21],[41,-22],[13,-15],[11,-23],[34,-110],[54,-78],[110,-117],[53,-39],[179,-74],[119,4],[328,142],[110,36],[41,0],[-25,-28],[-41,-17],[25,-20],[38,-3],[18,3],[13,18],[2,30],[-2,30],[-18,132],[-10,93]],[[77077,52687],[61,-162],[24,-22],[33,-74],[8,-25],[-9,-52],[-7,-147],[-15,-37],[-38,18],[-1,26],[-22,111],[-39,62],[-16,3],[-10,63],[-20,76],[-60,137],[46,-1],[22,33],[5,27],[4,7],[34,-43]],[[77545,50818],[-26,-3],[-55,69],[-13,31],[-3,42],[-52,159],[-7,37],[20,131],[54,31],[18,-22],[6,-59],[30,-106],[10,-57],[8,-26],[3,-19],[-2,-14],[22,-68],[15,-39],[2,-64],[-30,-23]],[[82399,46881],[-35,-120],[13,-19],[7,-18],[-58,-25],[-24,13],[-14,-3],[-59,22],[-42,28],[-5,21],[3,26],[13,-8],[32,-4],[13,11],[0,77],[-5,100],[44,82],[24,33],[27,20],[68,-46],[11,-12],[9,-18],[4,-30],[-26,-130]],[[82068,47145],[28,-31],[40,-89],[3,-25],[-12,-24],[-28,-38],[-63,-58],[-10,-28],[-14,-54],[-3,-23],[-4,-13],[-7,-9],[-14,-8],[-15,12],[13,34],[1,42],[-10,39],[-14,32],[-29,44],[-30,40],[-31,19],[-33,9],[-12,19],[-19,49],[-6,27],[-3,28],[2,27],[8,1],[32,-6],[59,-32],[30,-2],[16,7],[43,62],[11,-1],[41,-27],[30,-23]],[[79456,50881],[10,-40],[13,-35],[10,-39],[13,-185],[43,-159],[126,-63],[-21,-25],[-10,-23],[-8,-27],[-18,-110],[1,-24],[11,-37],[3,-41],[-16,0],[-17,10],[-15,15],[-13,20],[-14,16],[-15,10],[-26,32],[-34,22],[-36,17],[-17,47],[-8,58],[9,86],[-9,24],[-13,21],[-15,62],[-6,73],[-22,28],[-30,17],[-13,14],[-58,-26],[-14,6],[-12,20],[-32,21],[1,40],[15,32],[35,33],[16,27],[3,36],[-6,26],[3,28],[11,27],[13,21],[34,27],[16,-48],[7,-40],[10,-30],[14,42],[-9,72],[27,16],[26,1],[19,-20],[13,-31],[5,-44]],[[84216,49221],[6,-124],[-2,-32],[-15,47],[-6,10],[-4,-10],[-6,-5],[-8,0],[-10,-48],[-1,-45],[-8,-30],[-4,-101],[3,-28],[12,14],[7,3],[27,-39],[15,-28],[-4,-34],[-19,-35],[-21,-15],[-16,15],[-5,-7],[-9,-18],[-8,-24],[3,-24],[-19,-68],[-10,-19],[-22,21],[-14,-18],[-11,1],[-16,69],[0,32],[15,36],[1,26],[7,29],[17,40],[10,29],[0,19],[8,72],[2,30],[5,32],[8,66],[1,122],[26,101],[25,28],[11,5],[-2,-27],[31,-68]],[[84067,48807],[-7,-38],[-15,-30],[-13,-2],[-12,6],[-23,26],[-6,-27],[-18,1],[-6,35],[12,105],[19,39],[-2,41],[-15,88],[10,46],[43,34],[37,42],[12,9],[11,-32],[5,-149],[-40,-118],[8,-76]],[[80087,53968],[-38,-21],[-22,30],[24,36],[8,3],[6,7],[2,15],[-43,24],[-12,21],[-12,54],[0,34],[55,91],[13,10],[2,-38],[38,-95],[2,-64],[-1,-23],[-22,-84]],[[80057,50116],[-5,-61],[-6,-23],[-24,-30],[-7,-18],[-22,3],[-3,32],[-7,21],[-23,25],[-6,-6],[-4,-37],[-45,-26],[-13,-2],[6,49],[-11,38],[-1,47],[-2,21],[-6,12],[11,32],[-1,37],[12,39],[7,95],[47,21],[10,-17],[56,-21],[39,-58],[21,-77],[-23,-96]],[[87606,51467],[59,-22],[21,1],[21,-25],[26,12],[14,-8],[49,-88],[24,-58],[35,-50],[26,-17],[-19,-45],[-39,-24],[-15,-1],[-30,27],[-25,-5],[-21,34],[-4,52],[-21,119],[-29,-34],[-33,54],[-9,1],[-3,-9],[-14,19],[-12,37],[-1,30]],[[87631,50926],[110,-29],[29,4],[63,-12],[52,-38],[91,-7],[28,-12],[21,-26],[-51,-22],[-24,-20],[-45,-10],[-38,10],[-27,-12],[-10,20],[-39,20],[-51,41],[-105,49],[-5,30],[1,14]],[[86336,51840],[48,-24],[11,4],[70,-64],[11,-31],[-4,-21],[10,-29],[-22,-43],[-11,-5],[-12,16],[-22,10],[-25,-18],[-17,13],[-14,40],[-24,24],[-35,84],[-17,-3],[5,-33],[14,-21],[20,-64],[11,-6],[11,2],[16,-27],[-1,-41],[-40,-16],[-14,30],[-3,55],[-23,-19],[-9,-19],[-7,-2],[-15,57],[-43,3],[-29,30],[14,32],[2,30],[19,17],[19,-15],[19,22],[14,-6],[10,14],[38,9],[25,15]],[[85681,53025],[-44,-10],[-10,27],[-12,124],[31,99],[40,58],[27,15],[9,1],[24,-71],[-18,-144],[-21,-73],[-26,-26]],[[85597,50886],[-17,-23],[-8,-7],[-41,16],[-48,-3],[-50,-22],[-29,18],[-18,30],[1,32],[17,78],[37,60],[16,10],[26,-16],[45,-45],[36,-54],[32,-41],[1,-33]],[[85014,50431],[-4,-11],[-17,31],[-11,88],[-10,24],[-11,83],[3,24],[14,35],[11,0],[8,-21],[-5,-90],[25,-114],[-3,-49]],[[85006,50812],[85,-19],[-12,-21],[-92,-33],[-33,6],[-100,-20],[-12,1],[-2,32],[-11,23],[16,20],[21,4],[55,-7],[85,14]],[[84713,50860],[26,-20],[9,0],[9,24],[5,4],[12,-12],[2,-39],[17,6],[13,-14],[4,-9],[-1,-39],[-50,-6],[-36,-32],[-48,28],[-54,-48],[-33,-16],[-28,1],[-25,84],[14,99],[11,16],[18,8],[50,5],[85,-40]],[[86478,47235],[-4,-7],[-35,8],[-19,0],[2,43],[-10,33],[14,48],[0,56],[15,7],[2,32],[17,84],[10,19],[15,7],[17,49],[10,15],[10,37],[15,17],[-2,32],[9,17],[23,13],[16,-15],[10,-33],[-26,-40],[13,-99],[-19,-108],[-12,-33],[-23,-27],[-6,-27],[-27,-53],[-8,-46],[-2,-19],[-5,-10]],[[85222,47426],[3,-28],[0,-13],[-33,-9],[-32,-31],[-17,-36],[-13,-46],[-44,19],[-39,3],[-18,16],[-19,-1],[-24,-14],[-35,-40],[-8,-3],[3,60],[10,37],[36,88],[31,-19],[36,-6],[40,18],[29,39],[40,21],[33,-52],[21,-3]],[[84603,47153],[7,-35],[22,20],[21,4],[47,-3],[35,-8],[21,-15],[2,-70],[-10,-15],[-181,-53],[-18,17],[-7,17],[20,52],[-9,25],[10,40],[22,27],[18,-3]],[[86389,51085],[-10,-16],[-34,15],[-17,35],[-12,48],[-8,39],[-2,32],[-10,38],[1,14],[62,40],[12,-15],[26,-1],[12,-29],[-8,-127],[-12,-73]],[[76803,54855],[34,-5],[63,31],[35,-3],[32,-23],[30,-13],[72,17],[14,-5],[13,-13],[11,-20],[33,-75],[56,-92],[16,-59],[9,-67],[6,-15],[63,-127],[7,-54],[-9,-73],[19,-59],[61,-55],[36,-40],[8,-24],[5,-29],[21,-44],[25,-28],[78,-74],[103,-156],[59,-74],[48,-112],[18,-54],[14,-58],[29,-84],[50,-105],[13,-31],[13,-46],[16,-43],[19,-39],[22,-30],[22,-10],[37,-75],[20,-24],[-3,59],[-17,51],[0,32],[3,27],[14,24],[16,6],[31,-21],[49,-89],[21,-52],[16,-72],[13,-75],[20,-37],[27,-13],[31,-5],[28,-23],[65,-104],[22,-48],[16,-57],[12,-68],[7,-71],[4,-16],[42,-85],[22,-36],[27,-18],[78,-19],[28,-30],[23,-49],[10,-50],[-17,-44],[-61,-68],[-66,-47],[64,16],[32,20],[30,31],[30,39],[46,55],[17,11],[21,-4],[18,-16],[28,-53],[26,-57],[20,-66],[12,-73],[-22,-39],[-33,-28],[-45,-71],[-4,-28],[9,-18],[-11,-52],[25,-32],[4,-28],[-22,-39],[2,-24],[26,-103],[13,-24],[40,-52],[60,-53],[34,-25],[38,-19],[17,1],[28,8],[6,-20],[12,-102],[6,-64],[9,-137],[11,-57],[-1,-69],[15,-59],[30,-38],[32,-31],[15,-30],[0,-45],[-5,-36],[-11,-28],[-33,-60],[-6,-25],[-5,-65],[6,-30],[13,-2],[10,16],[40,87],[11,16],[15,12],[15,8],[72,0],[31,-13],[27,-29],[25,-36],[88,-228],[40,-126],[3,-31],[1,-33],[-7,-25],[-37,-86],[-4,-23],[-12,-94],[2,-67],[13,-29],[9,-30],[0,-28],[-25,-139],[-2,-23],[15,-226],[1,-61],[-3,-77],[2,-124],[-19,-384],[-4,-23],[-15,-59],[-20,1],[-16,10],[-12,22],[-6,28],[-9,23],[-48,71],[-13,-12],[-49,-88],[-13,-13],[-16,11],[-25,26],[-81,93],[-5,-30],[-1,-40],[16,-101],[2,-44],[-15,-9],[-8,2],[-33,59],[-31,65],[-35,87],[-26,42],[-23,46],[-66,177],[-17,27],[-101,124],[-20,30],[-26,51],[-28,46],[-61,72],[-106,184],[-46,105],[-51,170],[-17,43],[-86,128],[-47,77],[-20,44],[-45,155],[-14,52],[-16,46],[-28,37],[-24,44],[-49,140],[-15,55],[-11,61],[2,120],[-103,366],[-26,114],[-23,158],[-6,16],[-56,142],[-19,45],[-24,43],[-20,50],[-38,162],[-15,45],[-20,33],[-73,61],[-27,34],[-22,48],[-13,62],[-14,131],[-35,199],[-38,267],[-26,119],[-30,94],[-9,21],[-133,169],[-22,25],[-24,15],[-34,11],[-27,43],[-10,78],[-6,105],[-7,63],[-7,35],[-56,75],[-21,58],[-18,65],[-17,50],[-61,172],[-21,45],[-26,32],[-76,33],[-23,29],[-37,98],[-22,50],[-67,109],[-114,230],[-23,57],[-18,60],[-14,64],[-48,177],[3,36],[8,37],[-1,31],[-6,31],[1,27],[15,16],[32,21],[34,-2],[31,-9],[30,-17],[29,-38],[51,-94],[30,-33],[33,-15],[67,-22]],[[84106,46882],[-40,-20],[-24,-20],[-23,-26],[-15,-5],[-27,-2],[-37,5],[-26,-9],[-71,-66],[-28,-6],[-24,-16],[-8,26],[-10,19],[-24,4],[-24,-1],[-24,-59],[-38,13],[-15,-6],[-14,-12],[-14,-5],[-15,4],[-56,45],[-64,27],[-64,-10],[-55,25],[-30,-19],[-29,-28],[-8,29],[-11,26],[-9,37],[0,44],[3,30],[8,27],[5,29],[3,31],[12,-15],[12,5],[38,34],[37,50],[34,19],[20,5],[16,-10],[17,4],[18,11],[28,-39],[11,-8],[38,-3],[34,-22],[30,-34],[44,-31],[27,-42],[20,-15],[15,-5],[13,6],[18,28],[20,12],[18,0],[32,7],[14,7],[15,15],[15,-9],[13,-15],[54,-74],[17,-2],[30,16],[10,20],[4,31],[9,25],[11,22],[14,17],[40,28],[28,28],[19,48],[-44,20],[9,34],[15,20],[20,-7],[17,-27],[7,-102],[-14,-15],[-8,-15],[-6,-20],[-26,-38],[10,-46],[-7,-20],[-10,-9]],[[83336,46442],[13,-25],[45,-50],[7,-21],[3,-35],[9,-26],[21,-4],[22,5],[16,-16],[15,-26],[21,-50],[19,-56],[23,-31],[14,-46],[-8,-41],[-30,-57],[-16,-12],[-21,-4],[-35,-34],[-12,18],[-39,12],[-30,24],[-26,45],[-15,47],[-19,43],[-33,28],[-58,83],[-37,7],[-15,-6],[-15,0],[-77,37],[-12,22],[-9,28],[-9,27],[-5,31],[10,27],[10,19],[43,32],[31,10],[35,-2],[53,10],[51,-16],[15,12],[25,34],[9,-12],[11,-31]],[[82844,47051],[14,-22],[13,2],[26,34],[16,13],[17,1],[17,-6],[16,-25],[6,-40],[6,-13],[10,49],[13,14],[14,8],[22,-3],[17,-23],[16,-69],[-1,-60],[6,-22],[11,-17],[8,-23],[-7,-24],[-7,-11],[-21,-11],[-9,4],[-9,17],[-10,6],[-23,-6],[-21,-13],[3,-22],[17,-10],[5,-11],[-1,-14],[-7,-3],[-22,19],[-15,-3],[-54,-26],[-14,1],[-9,24],[1,63],[-6,17],[-40,-77],[-12,-19],[-17,-9],[-16,3],[-59,-46],[-18,6],[-18,0],[-62,-50],[-33,-14],[-17,-1],[-17,4],[-15,-4],[-14,-21],[-28,-17],[-28,13],[-25,18],[-23,23],[-5,29],[1,35],[10,48],[-7,84],[5,39],[9,38],[15,14],[18,2],[31,34],[28,45],[16,-4],[37,-31],[22,-4],[37,5],[15,-19],[6,-44],[8,-16],[11,-11],[26,-74],[24,4],[21,-14],[38,45],[28,-1],[8,34],[-17,37],[-20,31],[-11,6],[-12,-2],[-11,5],[-45,67],[-14,37],[-8,43],[5,31],[31,28],[15,7],[55,-19],[9,-16],[14,-68],[11,-29]],[[84691,52416],[-53,-98],[-17,-47],[-14,-51],[-21,-56],[-24,-50],[-12,-15],[-29,-27],[-17,-10],[-32,-4],[-97,-39],[-31,-5],[-32,2],[-60,10],[-12,5],[-24,51],[-27,40],[-24,5],[-24,-4],[-175,-3],[-61,-8],[-61,-18],[-33,8],[-33,21],[-24,7],[-25,-2],[-115,-31],[-29,3],[-58,39],[-34,8],[-33,-10],[-31,-36],[-11,-23],[-32,-81],[-18,-58],[-14,-73],[-11,-75],[-7,-61],[0,-64],[5,-72],[9,-71],[10,-55],[39,-126],[8,-17],[44,-36],[25,-45],[25,-126],[17,-65],[17,0],[19,4],[33,-8],[33,-17],[32,39],[17,73],[18,55],[43,103],[25,48],[15,15],[16,-6],[13,-28],[16,-22],[32,-11],[33,7],[34,34],[12,20],[11,26],[29,22],[69,0],[36,-8],[64,9],[-1,19],[-12,20],[-4,16],[12,11],[41,23],[42,17],[31,-12],[27,-33],[11,-34],[4,-41],[-10,-105],[-5,-25],[-22,-12],[-20,14],[-21,54],[-28,20],[-41,-16],[-14,-16],[-13,-22],[-23,-56],[-19,-64],[-41,-100],[-48,-86],[-23,-33],[-26,-23],[-83,-57],[-22,-42],[-17,-55],[-19,-19],[-22,-6],[-16,10],[-33,31],[-11,-25],[-2,-39],[16,-14],[27,-43],[20,-61],[13,-13],[29,-20],[12,-19],[22,-52],[34,-122],[12,-66],[19,-53],[58,-91],[3,-26],[-3,-30],[4,-27],[21,-52],[5,-34],[-23,-43],[-1,-62],[-14,-83],[-3,-28],[0,-26],[10,-24],[11,-18],[16,-10],[14,-17],[26,-65],[14,-17],[8,-23],[0,-36],[12,-20],[11,-37],[16,-9],[8,10],[6,16],[14,-6],[8,-25],[4,-33],[2,-37],[-1,-69],[-7,-24],[-15,1],[-27,28],[-1,-20],[2,-20],[-14,-7],[-16,3],[-40,-3],[-73,-42],[-26,-26],[-17,-46],[-1,-31],[6,-68],[-9,-23],[-34,-9],[-47,18],[-28,18],[-16,15],[-21,45],[-8,58],[16,172],[4,22],[7,19],[8,31],[2,37],[-22,45],[-34,18],[-29,37],[-111,209],[-6,21],[0,34],[4,33],[37,114],[4,22],[5,91],[-1,74],[-4,75],[-17,46],[-31,15],[-32,2],[-31,-15],[-30,-37],[-57,-79],[-22,-46],[-2,-60],[13,-58],[17,-54],[8,-58],[13,-207],[-1,-23],[-14,-60],[-6,-135],[6,-190],[10,-116],[-4,-63],[-26,-136],[-8,-75],[-1,-31],[31,-142],[7,-56],[4,-58],[-33,28],[-15,-1],[-16,-9],[-34,-9],[-35,-1],[-12,-11],[-25,-38],[-15,-15],[-13,-3],[-44,47],[-27,52],[-24,56],[-4,63],[8,66],[12,70],[24,116],[-1,78],[8,64],[14,62],[5,58],[3,224],[-3,20],[-33,133],[-4,22],[0,36],[3,34],[1,31],[-7,24],[-14,22],[-16,9],[-34,-9],[-68,-36],[-20,31],[-15,49],[-10,68],[-5,71],[2,67],[10,65],[-8,45],[-12,49],[0,25],[7,23],[12,18],[15,11],[14,19],[37,66],[12,58],[1,72],[10,68],[19,63],[22,58],[7,60],[-11,96],[5,43],[-4,51],[0,50],[13,95],[42,194],[40,103],[16,27],[21,-47],[16,-57],[1,51],[-5,50],[-16,117],[-14,228],[4,21],[14,-3],[15,20],[7,36],[-15,84],[0,30],[28,119],[24,43],[10,27],[6,73],[12,27],[16,20],[20,50],[11,63],[7,5],[8,2],[12,-55],[14,-22],[28,-18],[24,21],[7,27],[9,24],[14,25],[12,28],[14,66],[18,59],[12,21],[15,13],[16,8],[16,1],[35,-37],[21,-7],[20,2],[14,-6],[10,-17],[9,-34],[11,-29],[10,-14],[12,-7],[76,12],[67,-33],[91,-8],[32,-19],[30,-26],[36,-44],[14,-10],[15,2],[19,42],[14,10],[15,1],[59,-8],[158,-52],[23,8],[96,99],[38,93],[34,26],[11,43],[7,51],[12,13],[29,15],[11,15],[21,62],[24,56],[11,16],[34,-8],[15,-25],[19,-81],[-3,-14],[-22,-40],[-7,-17],[-25,-115],[-17,-56],[-21,-50]],[[79825,48382],[28,-66],[25,-35],[29,-19],[30,-2],[30,-8],[35,-25],[35,-11],[17,4],[16,13],[11,1],[10,-12],[25,-56],[27,-51],[6,-26],[18,-123],[20,-35],[29,-10],[33,0],[33,-5],[77,-29],[30,4],[27,29],[24,-19],[65,-34],[32,-8],[36,10],[37,2],[17,-10],[17,-15],[14,-6],[15,1],[26,29],[18,52],[14,67],[11,69],[7,30],[10,26],[14,17],[14,11],[38,-7],[8,-16],[42,-118],[8,-10],[45,-8],[12,4],[27,24],[16,2],[28,-29],[13,-25],[13,-18],[70,-19],[28,-50],[13,-7],[49,6],[34,-5],[29,-13],[13,-72],[11,-73],[7,-25],[28,-25],[12,-23],[-3,-73],[3,-70],[61,-60],[65,-35],[69,-4],[70,12],[35,15],[45,26],[9,0],[87,-80],[8,-12],[9,-60],[0,-62],[-16,-149],[-1,-41],[1,-41],[18,-89],[9,-25],[31,-47],[1,-25],[-4,-24],[-35,17],[-21,20],[-12,33],[-17,19],[-33,-7],[-61,34],[-69,52],[-122,110],[-33,-1],[-32,-14],[-33,-28],[-35,-20],[-26,-7],[-26,5],[-65,27],[-66,17],[-168,11],[-47,25],[-79,12],[-63,22],[-62,30],[-158,149],[-51,36],[-159,71],[-24,6],[-58,-5],[-36,21],[-32,0],[-47,-23],[-15,-17],[-18,-35],[-33,2],[-32,7],[-84,33],[-31,21],[-30,30],[-28,40],[-14,14],[-72,41],[-60,14],[-122,18],[-27,12],[-22,15],[-12,33],[1,42],[9,36],[12,36],[8,34],[-89,73],[-71,40],[-30,7],[-31,0],[-34,-8],[-34,4],[-16,11],[-17,5],[-16,-9],[-13,3],[-4,33],[9,28],[17,32],[10,6],[4,-50],[5,-10],[16,-11],[6,3],[27,64],[8,31],[13,85],[14,-16],[14,10],[8,13],[23,196],[19,58],[26,47],[12,12],[26,-29],[51,-11],[30,-20],[31,-2],[29,-10],[42,-34],[15,3],[14,11],[23,38],[9,60],[32,-31],[48,-12],[11,-17]],[[82659,54245],[-3,-5],[-19,-16],[-9,-33],[27,-51],[1,-34],[21,-30],[24,-46],[1,-16],[9,-21],[4,-25],[-17,-26],[-24,-5],[-17,24],[-16,30],[-4,-37],[-13,-21],[-45,6],[-32,0],[-32,-10],[16,-5],[14,-12],[50,-96],[11,-35],[-17,-70],[8,-29],[19,-16],[24,-35],[17,-4],[12,-19],[0,-34],[7,-32],[-19,-12],[19,-8],[17,-16],[-9,-16],[-7,-20],[7,-10],[23,-19],[10,-16],[6,-45],[22,-73],[41,-95],[9,-34],[0,-32],[-6,-27],[-24,-32],[-19,-42],[-2,-15],[-26,-20],[12,-14],[9,-19],[18,-59],[42,-95],[22,-35],[87,-129],[46,-57],[60,-128],[31,-30],[6,-36],[-26,-54],[-38,-28],[-62,-15],[-62,20],[-32,15],[-28,32],[-22,63],[-29,35],[12,-39],[7,-39],[-4,-43],[-11,-33],[-20,-25],[-21,-20],[-9,-14],[-53,-224],[-9,-60],[-16,-252],[0,-71],[24,-133],[2,-69],[5,-30],[-4,-25],[-11,-15],[-46,-41],[-32,-34],[-26,-48],[-21,-59],[-19,-44],[-25,-20],[-18,3],[-14,20],[-10,38],[-6,42],[-4,-31],[1,-30],[8,-33],[4,-34],[-5,-35],[-11,-28],[-29,-30],[-16,-26],[-2,-46],[-8,-26],[-11,-20],[-40,-46],[-9,-18],[-7,-24],[22,4],[19,-4],[2,-45],[6,-34],[-8,-75],[-30,-50],[15,-11],[14,-16],[30,-12],[10,-53],[-4,-64],[-6,-58],[-21,-16],[-14,11],[-14,-1],[-10,-17],[-2,-30],[19,15],[-1,-75],[-5,-72],[-7,-40],[-11,-33],[-18,-10],[-16,24],[-4,-28],[5,-24],[24,-58],[-15,-13],[-10,-20],[-5,-29],[-26,-66],[-11,-49],[-5,-52],[-12,-41],[-194,-180],[-156,-151],[-12,10],[-7,23],[-6,235],[-19,121],[-3,68],[-22,-61],[-14,6],[-15,16],[-11,19],[0,26],[11,75],[-14,-41],[-16,-31],[-16,3],[-14,16],[-5,24],[-7,4],[-35,-67],[-45,-35],[-25,0],[-20,21],[1,50],[-2,50],[-5,29],[-13,10],[-11,-4],[-32,-25],[-12,3],[-7,-13],[-85,180],[-18,-146],[-59,-78],[-44,-45],[-43,17],[-45,29],[-44,-35],[-47,-86],[-13,-13],[-14,1],[-10,11],[3,65],[1,64],[-4,145],[-4,28],[-13,40],[-18,28],[-11,-21],[-9,-28],[-36,1],[-35,23],[-30,-13],[-60,-58],[-32,-8],[-17,12],[-11,31],[6,29],[14,21],[-25,-17],[-21,-29],[-9,-19],[-10,10],[-26,65],[-54,-24],[-8,-8],[-13,-22],[-13,11],[-7,24],[-2,136],[-28,262],[-7,134],[-6,31],[-32,49],[1,69],[16,57],[4,68],[-5,73],[-10,71],[-12,54],[-18,46],[-24,52],[-30,39],[-63,43],[-33,-4],[-13,17],[-8,23],[3,43],[12,30],[15,7],[2,17],[-33,35],[-26,48],[-9,28],[-2,31],[0,73],[8,46],[4,25],[8,76],[18,24],[-3,14],[-8,10],[-11,25],[-9,29],[-20,49],[-36,60],[-6,102],[-5,150],[3,68],[11,128],[21,40],[16,12],[12,17],[-10,2],[-9,-6],[-15,-4],[12,114],[6,33],[25,64],[30,57],[12,67],[17,58],[70,61]],[[85480,52331],[21,-13],[21,4],[10,26],[3,33],[11,62],[24,42],[17,7],[12,18],[-2,46],[1,45],[18,48],[57,68],[31,24],[42,7],[5,-25],[-5,-37],[8,-56],[-4,-150],[-10,-21],[-42,-52],[-47,-42],[-13,-17],[-12,-42],[1,-41],[38,-54],[59,-52],[13,-24],[8,-40],[2,-45],[14,-21],[20,-10],[13,-22],[11,-30],[-100,70],[-26,31],[-32,4],[-31,9],[-32,27],[-34,6],[-16,-19],[-7,-38],[-4,-43],[8,-53],[-1,-32],[-6,-58],[25,-171],[31,-137],[45,-142],[23,-49],[25,-44],[-41,13],[-12,48],[-52,47],[-10,28],[-34,135],[-10,25],[-31,46],[-14,33],[-5,46],[4,48],[-2,66],[1,65],[7,81],[-11,28],[-15,26],[-17,62],[-5,70],[1,40],[7,35],[10,31],[2,30],[-25,44],[-25,124],[-2,65],[32,124],[-1,60],[7,36],[3,38],[17,83],[28,70],[47,99],[18,21],[20,14],[2,-24],[-4,-21],[-34,-101],[-5,-22],[-1,-43],[17,-24],[18,-51],[3,-68],[1,-72],[-4,-73],[-7,-25],[-28,-73],[-65,-85],[-5,-21],[0,-24],[12,-29],[15,-22]],[[86042,50192],[64,-64],[33,-9],[56,8],[21,-6],[53,-82],[15,-56],[4,-48],[9,-46],[13,-11],[15,-5],[20,-66],[4,-21],[-15,-166],[-63,63],[-60,71],[-26,27],[-69,60],[-11,21],[-8,27],[-30,37],[-60,6],[-23,-1],[-9,-6],[2,-20],[0,-40],[-15,-12],[-37,26],[-34,9],[-29,25],[-39,14],[-4,12],[3,19],[-1,18],[-9,6],[-18,-3],[-17,-17],[-14,-21],[-20,-55],[-11,-21],[-34,-9],[-14,5],[-13,14],[-39,101],[-13,22],[-14,18],[-14,8],[-13,-16],[-8,-31],[-3,-37],[-4,-22],[-17,-59],[-13,-36],[-5,6],[7,57],[0,32],[-9,34],[-5,35],[65,165],[24,40],[103,13],[61,-8],[34,4],[22,12],[19,-5],[4,-33],[12,-24],[16,2],[29,25],[26,40],[15,17],[16,3],[16,-3],[16,-9],[43,-34]],[[85238,50064],[46,-45],[10,-29],[9,-35],[9,-20],[10,-15],[18,-31],[5,-46],[-4,-93],[-21,-8],[-19,-14],[-40,-54],[-20,-10],[-21,-4],[-15,-14],[-15,-6],[-39,30],[-38,35],[-54,61],[-10,15],[-9,32],[-25,59],[-6,38],[-2,106],[6,25],[11,13],[36,-25],[24,26],[69,22],[71,-2],[14,-11]],[[84740,46363],[-19,-30],[-10,-58],[-34,-54],[-37,-89],[-29,-46],[-26,-53],[-23,-36],[-28,-13],[-42,-7],[-56,-65],[-32,-28],[-31,-2],[-28,21],[-11,24],[2,31],[10,28],[12,22],[7,29],[-33,37],[-2,27],[12,75],[9,76],[12,52],[46,93],[28,46],[17,19]],[[84567,46549],[36,20],[20,22],[17,32],[51,53],[9,15]],[[87429,48555],[-2,-22],[-1,-41],[5,-38],[-12,-39],[11,-57],[2,-29],[-1,-41],[-3,-18],[-8,-54],[-9,-19],[-6,-5],[-7,-16],[-54,18],[-24,37],[-21,40],[-4,17],[-25,46],[-6,16],[0,25],[20,7],[21,-1],[-1,22],[13,80],[-33,51],[-6,21],[12,15],[26,-18],[32,89],[10,19],[4,50],[18,6],[13,-6],[8,-31],[3,-27],[-3,-24],[15,-13],[13,-60]],[[87370,48132],[-4,-41],[-5,-45],[-25,-51],[-16,-78],[-9,-19],[-34,-35],[-30,43],[-9,37],[13,172],[13,-6],[9,1],[2,12],[-19,19],[-4,98],[1,38],[15,8],[18,-29],[24,-52],[27,-40],[33,-32]],[[88481,47077],[-66,-76],[-87,13],[-31,2],[-51,-19],[-11,15],[10,71],[41,190],[49,168],[20,43],[29,41],[31,33],[69,34],[62,-7],[9,-13],[27,-56],[18,-44],[7,-63],[-27,-107],[-29,-102],[-49,-80],[-21,-43]],[[89159,46590],[-14,19],[-39,64],[-34,74],[-23,68],[-25,62],[-108,184],[-27,61],[-6,16],[3,16],[12,32],[22,92],[-23,-57],[-27,-45],[-40,-3],[-39,-11],[-37,-27],[-37,-10],[-18,14],[-11,34],[-6,35],[-3,36],[-15,-59],[-31,-33],[-41,-69],[-12,14],[-7,27],[-3,27],[8,29],[6,31],[8,73],[19,44],[12,84],[8,30],[4,30],[-11,34],[-18,12],[-13,20],[-15,57],[-9,20],[-16,23],[-13,28],[14,20],[19,8],[15,-1],[27,-13],[13,0],[31,21],[-17,-7],[-18,1],[-57,37],[-35,38],[-33,77],[0,15],[23,14],[51,16],[-16,39],[-23,34],[-8,61],[-15,38],[-34,61],[-23,64],[-19,129],[-20,98],[5,35],[17,25],[-26,3],[-23,19],[12,47],[27,28],[-25,-7],[-23,-14],[-11,-2],[-11,4],[-6,19],[-1,27],[3,48],[-4,46],[-21,22],[-17,33],[-10,13],[-13,-1],[-12,22],[-10,32],[-126,139],[-8,40],[-11,-18],[-12,-8],[-14,23],[-16,15],[-16,-2],[-15,12],[-16,7],[-17,1],[-66,43],[-63,68],[-51,29],[-31,38],[-33,31],[-73,30],[-74,20],[-27,1],[-22,-7],[-22,2],[-122,147],[-21,67],[2,39],[6,33],[50,9],[-36,9],[-14,-4],[-29,-27],[-16,-2],[-22,18],[-21,22],[-35,-20],[-17,34],[-7,35],[-9,17],[-13,-2],[-17,-13],[-18,2],[-11,25],[-8,32],[-12,23],[-15,17],[-24,42],[-12,56],[1,98],[4,36],[24,57],[16,54],[-20,6],[-19,-25],[-8,-25],[-3,-31],[-2,-103],[-15,-30],[-22,2],[6,-60],[-9,-57],[-26,-67],[-2,-31],[4,-33],[-6,-32],[-42,-94],[-14,-5],[-32,1],[-32,-15],[-15,22],[-13,28],[-9,34],[-13,70],[-10,71],[32,88],[-11,80],[-21,68],[-55,94],[-57,90],[-26,18],[-43,8],[-13,9],[-13,33],[-10,39],[26,17],[46,46],[26,-3],[70,-24],[21,-23],[20,-13],[48,75],[38,99],[24,21],[20,7],[20,-9],[41,-34],[32,-16],[23,-4],[12,-30],[13,-14],[3,46],[12,54],[22,17],[12,3],[8,14],[-2,50],[-30,6],[17,43],[14,21],[5,21],[1,26],[-59,-50],[-62,-21],[-36,5],[-37,1],[-73,-33],[-27,1],[-65,13],[-36,17],[-27,-13],[-27,-1],[-28,38],[-23,48],[-12,34],[-16,25],[-7,33],[-17,126],[-2,89],[-27,2],[-28,9],[-121,85],[-15,-21],[-17,-11],[-17,-4],[-17,5],[-17,13],[1,23],[13,58],[12,21],[17,17],[11,30],[18,92],[1,31],[-2,32],[1,24],[11,12],[46,30],[95,45],[24,27],[20,43],[24,26],[10,27],[12,21],[74,57],[32,4],[32,-6],[65,-34],[61,-54],[53,-72],[57,-52],[70,-8],[35,5],[34,-7],[14,-15],[24,-44],[-7,-29],[-4,-60],[13,-58],[20,-58],[16,-62],[3,-30],[-6,-65],[-5,-31],[-20,-53],[-11,-58],[7,-71],[4,-71],[-1,-66],[4,-65],[10,-65],[47,-180],[27,-122],[9,68],[-2,76],[9,27],[14,15],[17,-16],[4,-30],[2,-67],[14,-131],[19,-6],[21,20],[3,-40],[-1,-74],[10,-59],[8,-23],[34,-48],[15,-9],[44,-12],[33,-3],[32,17],[21,44],[18,47],[65,110],[18,53],[18,80],[7,18],[63,87],[8,31],[9,59],[14,58],[10,30],[62,28],[64,16],[64,53],[27,46],[2,30],[-14,53],[-1,23],[15,23],[56,67],[66,69],[53,47],[29,0],[27,-42],[28,-34],[150,-101],[24,-31],[21,-42],[30,-29],[33,-14],[31,-27],[28,-35],[64,-64],[86,-79],[21,-5],[80,4],[14,-15],[13,-21],[12,-5],[91,-14],[14,-15],[13,-21],[8,-57],[62,-2]],[[88581,47010],[-14,-7],[-69,17],[-8,24],[-1,12],[16,24],[15,40],[24,14],[10,0],[28,-94],[-1,-30]],[[78251,53040],[16,-47],[3,-31],[-11,-35],[-4,-54],[-33,-42],[-28,10],[-9,15],[-18,82],[2,69],[11,27],[26,-4],[27,38],[18,-28]],[[78451,52413],[-13,-18],[-15,28],[-13,39],[-6,41],[-6,68],[-2,48],[8,28],[5,-1],[23,-28],[15,-49],[9,-15],[1,-45],[-5,-52],[-1,-44]],[[78469,52683],[2,-74],[-20,20],[-17,29],[-25,22],[-32,7],[-23,19],[-16,34],[0,16],[1,13],[5,10],[119,-67],[6,-29]],[[78618,52273],[-5,-22],[-11,16],[-54,25],[-18,2],[-47,28],[-14,14],[-10,19],[3,35],[7,21],[4,59],[12,24],[23,-44],[26,-38],[15,-17],[46,-38],[16,-19],[7,-65]],[[78657,52344],[-9,-17],[-14,4],[-14,20],[-20,35],[-21,31],[-28,20],[-17,5],[-6,8],[6,60],[18,4],[58,-56],[19,-31],[28,-83]],[[78689,52155],[-31,-4],[-9,8],[4,54],[9,33],[14,-1],[16,-49],[-3,-41]],[[78735,52225],[-5,-7],[-24,73],[6,42],[6,11],[13,-26],[10,-27],[8,-32],[-14,-34]],[[78895,52523],[18,-25],[14,16],[-1,-21],[-3,-21],[-17,-59],[-28,13],[-7,19],[-2,15],[4,9],[3,29],[12,0],[7,25]],[[79051,52543],[1,-43],[16,-21],[4,-32],[-3,-51],[-14,-59],[-7,-15],[-20,12],[-6,19],[-3,16],[3,11],[-15,14],[10,22],[-7,32],[-40,-20],[-12,-1],[-2,36],[2,15],[31,45],[18,9],[20,-10],[24,21]],[[79104,51741],[8,-9],[10,30],[19,-41],[11,-21],[15,-20],[-15,-1],[-6,-19],[-4,-4],[-59,66],[-38,-21],[-25,19],[-8,14],[14,36],[13,83],[26,-21],[6,-26],[-2,-7],[17,-16],[18,-42]],[[79020,51650],[26,-56],[6,-20],[-13,-31],[-10,-44],[-6,-9],[-20,16],[-14,-43],[-9,69],[-20,44],[12,44],[5,4],[6,-2],[6,-11],[31,39]],[[78815,51642],[-36,-20],[-41,15],[5,34],[20,41],[17,-2],[31,-27],[12,-23],[-8,-18]],[[80474,51163],[-55,-59],[-13,3],[-10,21],[6,113],[7,34],[39,4],[23,-17],[12,-18],[5,-38],[-2,-23],[-12,-20]],[[81623,47750],[-6,-9],[-47,5],[-30,-47],[-21,-14],[-76,0],[-9,6],[-7,0],[-4,-10],[-24,7],[-77,42],[-10,38],[12,42],[27,58],[56,12],[252,4],[27,-51],[3,-16],[-55,-35],[-11,-32]],[[87489,51200],[-13,-11],[-15,12],[-15,44],[5,34],[17,23],[15,-23],[4,-30],[11,-2],[-9,-47]],[[85346,51557],[-17,-15],[-19,1],[-4,61],[6,78],[18,13],[27,-16],[-10,-20],[8,-42],[-9,-60]],[[85434,51659],[32,-86],[-21,-82],[15,-46],[40,-2],[10,-17],[7,-21],[4,-28],[-10,-23],[-23,-20],[-26,29],[-7,28],[-5,10],[-35,-21],[-10,-2],[-6,39],[8,55],[-24,25],[-23,57],[-1,24],[9,39],[-1,32],[13,3],[23,-43],[11,40],[9,17],[11,-7]],[[86923,48443],[-22,-50],[21,117],[4,59],[20,36],[29,179],[7,-5],[10,-17],[-15,-131],[-41,-92],[-13,-96]],[[86890,48472],[-17,-55],[-11,19],[-7,1],[-4,32],[4,68],[-14,76],[19,-1],[5,-23],[6,-8],[18,-73],[1,-36]],[[85631,49726],[-7,-21],[-16,-14],[-14,1],[5,21],[-4,11],[-10,-5],[-16,-16],[-20,-33],[-13,16],[-2,26],[1,11],[24,45],[29,8],[40,43],[18,-2],[-4,-27],[-6,-20],[-4,-20],[-1,-24]],[[85226,54166],[-11,-12],[-18,4],[-2,30],[18,52],[12,56],[-13,14],[-12,35],[-1,41],[11,76],[15,-6],[14,-33],[6,-62],[10,-47],[-20,-64],[-9,-84]],[[84904,53822],[-7,-18],[-34,32],[2,51],[-4,25],[-9,27],[-4,26],[4,28],[20,-36],[12,-57],[16,-55],[4,-23]],[[86350,47051],[-24,-18],[16,45],[52,104],[18,-19],[25,-4],[-37,-47],[-38,-19],[-12,-42]],[[86065,47261],[-16,-53],[-18,3],[-34,71],[2,50],[3,16],[13,5],[43,-15],[9,-40],[-2,-37]],[[85506,47177],[48,-23],[28,3],[6,-21],[-27,-49],[-56,38],[-10,40],[11,12]],[[86208,50869],[4,-34],[16,-32],[-5,-49],[-7,-7],[4,-23],[7,-17],[-13,-12],[-10,6],[-15,-16],[-10,-22],[-32,-9],[-11,20],[-57,24],[-37,53],[-5,16],[71,62],[32,17],[26,-1],[33,23],[9,1]],[[78435,48687],[-23,-3],[-42,71],[-7,22],[12,21],[13,-2],[48,-45],[9,-22],[-10,-42]],[[77895,50009],[11,-84],[-33,58],[1,40],[-5,26],[-20,33],[-15,40],[-7,96],[5,20],[13,1],[58,-126],[4,-21],[-1,-45],[-8,-14],[-3,-24]],[[77834,50264],[-20,-47],[-33,1],[-6,29],[1,70],[-8,22],[0,9],[6,40],[6,9],[53,-98],[1,-35]],[[77733,50493],[2,-15],[-45,50],[-22,14],[-19,56],[5,26],[1,37],[3,15],[14,5],[18,-27],[13,-66],[23,-61],[7,-34]],[[77349,51537],[-17,-27],[-25,26],[9,37],[4,51],[15,41],[5,47],[-29,130],[14,5],[12,-14],[19,-87],[17,-52],[-7,-70],[-17,-87]],[[76795,53202],[-18,-5],[-16,12],[-14,33],[-75,96],[-23,1],[-16,25],[-20,8],[-21,64],[-5,35],[16,16],[9,35],[25,-15],[28,-62],[29,-23],[8,-12],[14,-34],[66,-85],[7,-28],[5,-29],[1,-32]],[[83900,48710],[-18,-15],[-33,66],[-14,54],[3,31],[10,26],[5,7],[-2,28],[13,14],[15,-2],[9,-38],[11,-10],[6,-36],[-5,-125]],[[84225,51168],[6,-36],[-10,-31],[11,-59],[28,78],[27,10],[15,-13],[10,-15],[6,-30],[-10,-63],[-18,-30],[-22,-5],[-11,37],[-15,4],[-10,-81],[-5,-12],[-13,-10],[-12,22],[-2,12],[17,37],[-9,108],[-13,-20],[-34,-99],[-26,-44],[-8,23],[-14,67],[6,86],[21,58],[18,-4],[52,18],[15,-8]],[[83850,51608],[12,-25],[-7,-30],[-9,7],[-26,0],[-9,-2],[-12,-18],[-7,0],[5,27],[21,41],[14,-6],[18,6]],[[83479,48215],[-11,-96],[-6,33],[-2,88],[-7,43],[5,49],[-1,126],[8,58],[16,-74],[4,-38],[-6,-189]],[[82048,47827],[-22,-10],[-21,21],[0,27],[5,25],[32,13],[17,0],[18,-18],[12,-18],[6,-21],[-34,-1],[-13,-18]],[[82306,49614],[-59,-107],[-9,28],[5,109],[-17,67],[2,51],[11,89],[15,68],[34,46],[8,5],[-2,-83],[7,-31],[2,-27],[-3,-23],[6,-105],[4,-26],[-8,-33],[4,-28]],[[84152,45559],[-26,-1],[-8,6],[-3,51],[8,28],[60,37],[23,34],[34,70],[20,18],[5,8],[4,-1],[3,-54],[9,-31],[1,-17],[-30,-27],[-26,-62],[-59,-41],[-15,-18]],[[84523,47045],[-17,-36],[-11,-62],[-11,-19],[-22,-11],[-14,62],[-24,-3],[12,54],[11,21],[16,0],[7,-22],[4,-4],[36,92],[7,1],[6,-4],[5,-11],[-5,-58]],[[84423,47077],[-39,-15],[-24,-72],[-19,1],[-11,-32],[-2,-14],[1,-12],[-2,-13],[-8,-12],[-17,20],[-16,-25],[-6,-7],[-23,30],[-21,-2],[-6,5],[26,52],[36,50],[6,18],[-14,5],[-8,7],[-2,12],[23,7],[16,2],[12,-16],[8,1],[48,58],[20,-14],[14,-14],[8,-20]],[[84254,47030],[-6,-25],[-75,2],[2,33],[21,36],[7,12],[23,11],[33,-20],[-5,-49]],[[87420,48070],[-15,-6],[-8,48],[13,12],[14,-29],[-4,-25]],[[78728,52447],[2,-32],[-19,8],[-13,37],[11,26],[7,10],[7,-36],[5,-13]],[[78840,52304],[2,-17],[-25,34],[-1,24],[3,11],[15,-26],[6,-26]],[[78955,52323],[-18,-17],[-22,53],[1,12],[2,9],[4,6],[13,-27],[16,-10],[4,-26]],[[79080,51877],[2,-14],[-13,16],[-8,10],[-5,8],[-29,79],[12,-5],[32,-69],[9,-25]],[[79523,53661],[-1,-39],[-19,23],[-4,44],[7,14],[13,-8],[4,-34]],[[79377,53492],[-12,-2],[-3,17],[1,29],[-2,24],[-3,17],[0,30],[11,-15],[8,-14],[10,-10],[7,-6],[4,-5],[-7,-42],[-14,-23]],[[80246,53516],[-14,-30],[-14,19],[22,61],[5,4],[1,-54]],[[80264,50910],[-32,-25],[-10,55],[21,16],[22,-14],[-1,-32]],[[79853,50172],[-11,-14],[-7,14],[-2,16],[5,20],[15,2],[7,-6],[-7,-32]],[[79690,50111],[-5,-11],[-15,6],[-11,16],[-7,15],[-2,16],[15,20],[32,-20],[-7,-42]],[[81780,47733],[-4,-22],[-14,5],[-13,38],[6,10],[8,4],[9,-4],[8,-31]],[[81310,48495],[-6,-20],[-26,1],[-5,24],[17,41],[12,3],[10,-15],[-2,-34]],[[79236,48018],[-17,-13],[-13,11],[-6,16],[19,40],[10,10],[9,3],[5,-22],[-7,-45]],[[77037,53038],[-2,-13],[-29,61],[-32,34],[13,8],[27,-9],[11,-9],[10,-30],[2,-42]],[[76489,55191],[-6,-16],[-16,8],[-18,52],[6,10],[12,-5],[21,-12],[2,-20],[-1,-17]],[[84332,50861],[-19,-4],[-13,17],[1,85],[12,18],[5,-3],[4,-25],[5,-23],[10,-21],[-5,-44]],[[84233,49473],[-27,-69],[-19,4],[-23,45],[-6,50],[-1,18],[16,28],[52,-9],[9,-25],[-1,-42]],[[84401,50716],[5,-23],[-17,1],[-7,43],[1,24],[18,-45]],[[84208,50796],[-20,-47],[-2,25],[4,23],[5,16],[9,9],[4,-26]],[[83184,46808],[-11,-6],[-11,8],[4,52],[-6,34],[11,28],[3,48],[5,15],[6,-15],[4,-10],[5,-5],[13,-1],[3,-21],[-1,-19],[-5,-21],[-15,-23],[-11,-25],[6,-39]],[[83075,47097],[-12,-1],[-2,23],[4,24],[12,11],[5,0],[8,-22],[2,-11],[-8,-15],[-9,-9]],[[82113,46791],[-8,-20],[-22,35],[-6,16],[17,23],[6,3],[14,-24],[-1,-33]],[[82745,54254],[9,-55],[2,-21],[-52,-29],[-31,68],[6,27]],[[82682,53732],[-3,-19],[-24,47],[-7,33],[3,27],[25,2],[12,-17],[-6,-73]],[[84458,48402],[-3,-28],[-10,32],[-9,15],[1,34],[13,-12],[8,-41]],[[84340,48806],[-1,-58],[-11,3],[-9,20],[-3,20],[1,15],[5,13],[18,-13]],[[83548,47742],[-29,-3],[-8,5],[-3,56],[32,-24],[10,-2],[-2,-32]],[[82654,47023],[-7,-1],[-12,11],[5,24],[-7,40],[2,32],[16,18],[33,2],[1,-24],[-31,-102]],[[82339,49847],[-10,-99],[-17,56],[19,67],[9,13],[-1,-37]],[[85380,52298],[-9,-18],[-9,6],[-6,24],[2,18],[8,11],[9,-8],[5,-33]],[[87325,50619],[-8,-8],[-3,25],[5,33],[5,6],[6,-2],[8,-12],[-13,-42]],[[87102,49397],[14,-31],[-33,24],[-47,51],[-3,34],[40,-52],[29,-26]],[[86362,51395],[-7,-30],[-14,-19],[-119,-36],[10,21],[5,21],[8,11],[12,-3],[6,7],[5,2],[7,-3],[12,9],[24,-6],[25,5],[-2,28],[28,-7]],[[86284,51538],[-16,-1],[-28,25],[16,22],[11,5],[9,13],[5,0],[12,-11],[7,-19],[-16,-34]],[[85985,51735],[-12,-2],[-10,34],[-28,37],[-17,65],[65,-107],[2,-27]],[[85403,51839],[-1,-17],[-9,24],[-6,6],[6,62],[4,11],[5,-43],[1,-43]],[[85394,52213],[-10,-7],[-3,2],[-3,24],[5,39],[12,0],[5,-6],[1,-29],[-7,-23]],[[85360,51393],[-3,-12],[-29,15],[-8,8],[15,82],[14,-2],[12,-78],[-1,-13]],[[85755,49800],[0,-25],[-2,-8],[-15,9],[-11,-1],[-10,44],[3,10],[20,-12],[7,-5],[8,-12]],[[85711,49777],[-48,-30],[11,56],[6,15],[24,-15],[7,-26]],[[85199,54075],[1,-25],[-17,56],[-7,65],[14,-23],[15,-49],[-6,-24]],[[85236,54013],[-5,-6],[-10,15],[-6,17],[1,17],[7,9],[14,-26],[0,-15],[-1,-11]],[[84835,53370],[-3,-13],[-11,68],[9,34],[12,-13],[3,-12],[-11,-32],[1,-32]],[[86661,47694],[-4,-28],[-12,15],[-11,33],[-17,5],[-13,8],[-7,16],[47,7],[17,-56]],[[85741,47705],[-13,-15],[-20,30],[-6,13],[13,29],[14,9],[9,-13],[4,-13],[-2,-14],[1,-26]],[[85393,47451],[-17,-13],[5,43],[-1,34],[29,-11],[0,-27],[-3,-10],[-13,-16]],[[84281,45908],[-25,-20],[0,42],[20,54],[17,18],[10,-22],[1,-9],[-26,-20],[3,-43]],[[83856,45742],[-14,-7],[-30,17],[-6,10],[25,28],[20,39],[23,4],[14,-8],[-5,-47],[-27,-36]],[[87449,48136],[-7,-4],[0,28],[8,25],[8,14],[9,1],[-18,-64]],[[87409,47955],[-5,-9],[-7,18],[-1,12],[10,32],[9,18],[11,1],[-3,-26],[-14,-46]],[[85551,50151],[-14,-48],[-24,2],[-4,7],[29,30],[13,9]],[[85445,49933],[7,-25],[-28,16],[-12,25],[12,15],[7,4],[14,-35]],[[84160,46920],[-9,-34],[-16,10],[4,33],[8,19],[22,28],[22,5],[13,-10],[4,-11],[-34,-11],[-14,-29]],[[71402,72067],[33,36],[35,37],[36,38],[41,44],[35,37],[28,31]],[[71610,72290],[1,-2],[2,-5],[12,-14],[12,-6],[14,13],[18,10],[9,-6],[1,-17],[-11,-82],[1,-33],[18,-66],[23,-109],[22,-102],[12,-66],[13,-28],[52,-28],[43,-23],[26,-37],[28,-36],[20,-22],[9,-29],[2,-25],[-1,-18],[-11,-22],[-50,-59],[-6,-18],[-1,-24],[10,-73],[6,-45],[1,-92],[4,-86],[17,-40],[15,-25],[8,-24],[18,-31],[15,-24],[13,-14],[6,-31],[-3,-37],[-6,-32],[2,-17],[10,-12],[16,-32],[2,-47],[-1,-32],[6,-29],[2,-32],[-5,-80],[1,-33],[0,-4],[-14,-2],[-12,-12],[-17,-51],[-19,-13],[-22,-4],[-22,31],[-19,32],[-5,18],[-4,34],[-10,23],[-20,-11],[-29,-4],[-31,-8],[-6,-7],[-1,-15],[8,-30],[7,-40],[3,-56],[9,-37],[3,-12],[50,-111],[13,-23],[3,-14],[-4,-41],[-9,-47],[2,-38],[16,-41],[14,-29],[-13,-39],[-8,-45],[9,-21],[-5,-65],[4,-12],[10,-5],[15,4],[15,18],[13,3],[7,-5],[11,49],[9,7],[17,-13],[35,-93],[30,-78],[8,-15],[6,-9],[29,-41],[20,-26],[27,10],[36,1],[22,-25],[12,-17],[1,-3],[2,0],[43,-62],[19,5],[12,-18],[4,-43],[-6,-46],[2,-21],[19,-4],[41,-30],[37,-26],[19,-9],[20,-19],[18,-32],[35,-40],[31,-31],[7,-42]],[[74474,67897],[-3,20],[3,16],[9,9],[37,12],[42,24],[17,13],[12,14],[13,20],[12,0],[38,-30],[13,-19],[7,-58],[5,-22],[-5,-58],[-22,-142],[4,-53],[19,-38],[16,-27]],[[74691,67578],[-2,-11],[-34,-46],[-6,-24],[7,-24],[14,-20],[6,-20],[6,-60],[17,-16],[34,-39],[30,-28],[51,18],[14,-12],[25,-14],[20,-4],[11,-10],[7,-9],[-1,-13],[1,-12],[28,-3],[15,-7],[49,13],[50,17],[23,54],[11,4],[28,20],[29,-22],[31,-32],[17,-9],[33,-5],[32,4],[77,14],[43,-7],[39,44],[8,0],[17,-34],[43,-3],[22,16],[25,13],[16,4],[12,0],[15,-3],[15,12],[6,23],[-1,34],[-11,38],[-9,22],[-1,12],[3,27],[7,39],[15,44],[-11,43],[-15,49],[-11,5],[-28,-12],[-30,3],[-23,29],[-18,37],[-4,31],[5,38],[8,34],[2,13]],[[75453,67833],[22,0],[31,-7],[24,-10],[19,0],[34,45],[16,2],[18,9],[7,8],[6,-6],[20,-6],[20,3],[18,12],[19,19],[32,40],[7,23],[0,21],[-6,14],[-6,7],[2,18],[14,31],[50,47],[42,57],[24,43],[10,52],[14,57],[13,22],[30,14],[84,21],[27,23],[39,42],[20,33],[11,27],[1,30],[26,10],[23,48],[28,49],[48,41],[43,56],[15,-9],[16,-26],[8,-29],[2,-15],[55,-18],[9,3],[40,-26],[38,-32],[20,-8],[10,1],[9,10],[10,28],[10,20],[7,8],[-1,32],[54,61],[49,45],[42,32],[12,-13],[14,-25],[18,-62],[11,-16],[29,9],[5,-7],[-5,-22],[-19,-28],[-25,-26],[-16,-20],[5,-68],[-1,-24],[7,-7],[51,67],[25,14],[9,-16],[2,-37],[21,-74],[8,-38],[-51,-91],[-19,-47],[1,-16],[-1,-16],[-14,-24],[1,-9],[11,-15],[13,-11],[6,1],[11,22],[48,31],[14,-6],[34,-48],[16,-3],[41,-14],[27,18],[19,-16],[40,-60],[9,-11]],[[77033,68097],[-3,-36],[-2,-40],[10,-32],[1,-28],[-2,-25],[-8,-18],[-23,-10],[-18,-30],[-31,-45],[-24,-35],[-17,-32],[-7,-32],[2,-42],[5,-43],[56,-159],[0,-28],[-18,-8],[-23,18],[-21,26],[-22,68],[-19,21],[-18,4],[-109,-35],[-23,-10],[-36,-25],[-25,-52],[-18,-47],[-19,-18],[-28,-37],[-76,-112],[-44,-48],[-29,-18],[-20,-25],[-11,-42],[-8,-29],[-3,-73],[5,-90],[11,-58],[6,-12],[1,-17],[-11,-31],[-15,-26],[-7,-17],[-6,-82],[-13,-40],[-23,-59],[-21,-45],[-33,-35],[-13,-28],[-12,-52],[-7,-44],[0,-16],[4,-14],[13,-16],[17,-15],[8,-23],[1,-28],[-12,-68],[-22,-95],[-26,-74],[-26,-71],[-6,-24],[-23,-87],[-21,-120],[-13,-81],[-12,-56],[-15,-2],[-18,18],[-43,23],[-27,19],[-21,17],[-14,0],[-19,-12],[-19,-7],[-12,8],[-27,50],[-8,-6],[-5,-24],[18,-143],[12,-53],[-2,-88],[-5,-109],[-7,-119],[-4,-28],[-12,-31],[-15,-9],[-14,13],[-11,-3],[-3,-20],[3,-52],[-14,-58],[-10,-51],[3,-49],[5,-49],[16,-108],[0,-39],[-3,-36],[-9,-14],[-14,2],[-7,-15],[-6,-22],[-16,-81],[-16,-9],[-15,12],[-23,55],[-14,16],[-9,-1],[-4,-15],[-6,-32],[-6,-22],[-16,-19]],[[75714,64503],[-3,40],[-8,209],[-7,66],[-5,92],[-7,28],[-10,51],[-10,43],[-9,19],[-5,81],[-2,99],[0,47],[-13,97],[-12,110],[-16,-4],[-10,26],[-7,0],[-23,-25],[-18,8],[-14,-3],[0,-51],[3,-54],[-6,-19],[-36,-64],[-9,-42],[1,-45],[4,-59],[-6,-31],[-16,-28],[-21,-14],[-18,7],[-12,24],[-11,62],[-10,34],[-10,8],[-8,-9],[-1,-39],[0,-33],[-2,-3],[-6,5],[-6,16],[-17,155],[-25,119],[-1,46],[8,59],[11,91],[29,56],[4,24],[5,19],[7,4],[37,-5],[13,9],[11,27],[16,21],[16,9],[13,3],[20,-21],[9,12],[6,38],[9,37],[5,18],[14,8],[18,2],[5,7],[5,13],[4,49],[23,111],[8,49],[1,8],[-1,55],[7,8],[37,-27],[16,1],[9,11],[3,20],[-5,23],[-26,41],[-47,55],[-43,34],[-80,-5],[-79,-11],[-23,6],[-29,15],[-70,-2],[-86,-9],[-32,5],[-17,0],[-32,-6],[-52,16],[-37,20],[-32,22],[-38,20],[-9,0],[-5,7],[-4,18],[-1,23],[8,106],[-7,161],[6,59],[-31,132],[-11,25],[-15,1],[-9,-17],[-3,-31],[5,-35],[-12,-38],[-23,-13],[-27,13],[-22,18],[-29,40],[-21,55],[-2,61],[-10,40],[-13,19],[-10,5],[-9,-4],[-8,-21],[7,-22],[9,-30],[-3,-20],[-8,-3],[-12,9],[-19,-5],[-19,16],[-11,1],[-11,6],[0,35],[-17,45],[-28,50],[-28,31],[-14,-4],[-6,-35],[1,-12],[10,-7],[14,-20],[3,-20],[-2,-19],[-17,-33],[-13,-31],[-27,-46],[-23,-52],[-6,-40],[-9,-36],[-4,-39],[6,-27],[12,-17],[29,-13],[31,-52],[24,-72],[14,-21],[26,-24],[48,-3],[8,-20],[7,-52],[9,-18],[25,-25],[2,-18],[-6,-21],[-11,-16],[-20,-11],[-20,-4],[-19,6],[-29,5],[-33,0],[-23,-131],[-16,-46],[-10,1],[-25,22],[-11,-4],[-29,-116],[-4,-28],[-2,-21],[16,-45],[18,-37],[22,-14],[17,11],[14,-15],[17,-37],[28,-25],[40,-12],[23,-29],[2,-25],[-1,-26],[-4,-67],[-4,-39],[-21,-102],[-16,-87],[8,-42],[6,-17],[5,-13],[17,-33],[12,-32],[-10,-83],[6,-22],[23,-14],[25,-11],[9,-14],[-22,-84],[5,-59],[9,-55],[6,-90],[1,-9],[-2,-23],[15,-69],[21,-136],[2,-51],[-1,-54]],[[74736,64569],[-7,-90],[-22,1],[20,-60],[6,-44],[3,-60],[-24,-7],[-16,7],[-14,52],[-7,-48],[-24,-44],[-9,22],[-5,23],[-1,41],[13,157],[-2,17],[-7,12],[-13,6],[-5,32],[-21,-167],[9,-68],[-4,-32],[-38,-26],[-39,63],[-5,20],[-3,-35],[-7,-43],[-36,8],[-19,33],[12,58],[23,137],[4,62],[-30,45],[-26,27],[-15,63],[6,-69],[14,-24],[20,-17],[21,-35],[-15,-43],[-15,-27],[-29,-101],[-34,-57],[-41,-42],[-132,-63],[-28,-25],[-41,-78],[-26,-74],[-5,-75],[15,-81],[12,-127],[10,-26],[-14,-47],[-25,-49],[-20,-66],[2,-37],[-5,-24],[-70,-82],[-15,-47],[-19,-48],[-23,27],[-14,0],[19,-38],[-3,-25],[-6,-14],[-18,-14],[-101,-60],[-77,-57],[-22,3],[4,17],[14,15],[-1,66],[-15,12],[-12,4],[-59,-79],[-23,-79],[5,-15],[13,4],[39,44],[19,-12],[1,-18],[-60,-68],[-126,-220],[-6,-44],[-17,-49],[-22,-46],[-41,-112],[-78,-167],[-21,-62],[-125,-128],[-23,-39],[-51,-125],[-53,-102],[-62,-85],[-106,-108],[-65,-102],[-20,-68],[-2,-25],[7,-33],[12,-30],[3,-25],[-6,-44],[-3,-24],[-19,-60],[-33,-43],[-105,-90],[-14,3],[-86,18],[-32,-17],[-13,-42],[-30,-174],[-28,-46],[-11,-42],[-4,-29],[-17,1],[-14,13],[-11,-10],[-12,59],[-21,12],[-17,4],[-73,-59],[-25,-47],[-53,-223],[-14,-144],[13,-159],[18,-127],[4,-57],[-2,-75],[-10,-36],[-6,-43],[8,-88],[23,-116],[5,-48],[1,-51],[17,-115],[-12,20],[-9,49],[-21,62],[-26,-62],[14,-44],[49,-53],[15,-44],[-32,-386],[-24,-138],[-29,-90],[-16,-34],[-34,-142],[-24,-172],[-5,-67],[11,-74],[-12,-43],[-16,-34],[30,15],[10,-40],[3,-42],[1,-246],[-3,-257],[-23,-11],[-25,-2],[-22,7],[-16,10],[-39,-14],[-21,-28],[-17,-47],[1,-81],[-72,-203],[-16,-67],[-6,-65],[10,-34],[18,-35],[24,-14],[47,-14],[23,-19],[15,-34],[-55,36],[-65,8],[-155,-95],[-41,-66],[-23,-57],[-15,-131],[-3,-88],[-18,-73],[-81,-112],[-51,-34],[-19,-30],[-60,39],[-66,98],[-27,53],[-97,253],[-18,32],[-19,108],[-4,41],[-5,16],[-9,11],[-5,16],[-21,124],[-9,130],[-14,144],[11,-10],[17,-47],[8,-70],[1,-96],[12,-11],[11,9],[-31,222],[-28,55],[-7,4],[-7,36],[-1,44],[2,22],[-21,72],[-8,44],[-48,220],[-22,157],[-33,175],[-22,62],[-34,135],[-28,63],[-30,84],[-24,38],[-9,19],[-70,292],[-21,162],[-18,76],[-9,58],[-25,247],[0,44],[-3,49],[-17,105],[-31,113],[-9,70],[1,28],[-20,110],[-4,50],[-13,47],[-15,42],[-16,34],[-37,112],[-14,27],[-25,72],[-18,134],[-23,52],[36,0],[-22,49],[-11,32],[-12,20],[17,50],[-27,-1],[-15,30],[-20,93],[-37,105],[-6,57],[-32,177],[-27,426],[-26,189],[2,54],[-30,165],[-15,110],[-6,93],[-8,61],[-7,121],[-12,39],[-1,23],[8,55],[22,85],[8,54],[-10,77],[-20,-80],[-18,-23],[-9,60],[0,80],[-2,20],[5,27],[49,-13],[-56,49],[-6,29],[-3,22],[12,40],[-20,33],[-8,103],[-6,24],[-2,19],[11,142],[48,280],[4,63],[-5,90],[-10,71],[-5,76],[-3,19],[-17,7],[-16,28],[-19,112],[17,36],[13,21],[-18,-9],[-15,3],[29,52],[25,39],[59,46],[25,30],[-37,-27],[-38,-10],[-83,6],[14,104],[14,35],[16,19],[-23,-6],[-27,9],[9,106],[21,22],[22,5],[28,15],[-30,17],[-31,9],[-37,-18],[-34,13],[-42,0],[17,-14],[17,-33],[-8,-57],[-9,-36],[-23,-24],[-18,-38],[-6,-32],[-10,-24],[18,-16],[19,-12],[11,-26],[13,-39],[-1,-75],[-49,-177],[-17,-39],[-124,-107],[-48,-58],[-104,-75],[-40,-14],[-44,15],[-66,57],[-99,147],[-26,48],[-79,189],[-57,99],[-44,93],[-54,88],[-51,118],[-10,54],[3,54],[19,30],[22,-12],[18,-46],[12,-21],[11,-8],[76,71],[29,-3],[20,35],[25,-7],[52,55],[22,3],[26,11],[42,140],[31,89],[20,19],[-1,22],[-5,28],[-16,-7],[-10,-27],[-8,-33],[-8,-19],[-24,18],[-17,-3],[-20,-11],[-75,-52],[-31,-47],[-20,-9],[-119,51],[-117,118],[-49,79],[-31,100],[-31,120],[10,33],[48,72],[42,56],[-37,-25],[-41,-35],[-20,-24],[-22,-51],[-31,-12],[-11,76],[-8,74]],[[76080,55778],[-17,-48],[-33,145],[-15,9],[0,69],[8,28],[38,30],[10,-17],[20,-134],[-11,-82]],[[76036,56080],[-26,-54],[-12,33],[5,22],[11,13],[11,17],[11,-31]],[[75872,56595],[8,-22],[-15,4],[-15,32],[4,31],[6,12],[12,-57]],[[75956,56381],[-22,-1],[-6,24],[-9,26],[6,25],[12,6],[16,-40],[4,-28],[-1,-12]],[[75982,56484],[-13,-22],[-4,3],[-1,16],[-1,12],[-2,20],[-2,37],[11,30],[10,-6],[-5,-31],[7,-59]],[[75774,57106],[-13,-4],[-7,20],[-1,23],[7,15],[6,7],[7,-1],[7,-39],[-6,-21]],[[75694,57923],[-8,-20],[-29,15],[3,60],[-7,58],[5,24],[21,42],[18,18],[12,-56],[5,-55],[-20,-86]],[[75747,58399],[-13,-12],[-14,15],[11,23],[2,47],[13,-26],[0,-30],[1,-17]],[[75756,58488],[-7,-14],[-9,15],[-25,104],[-5,66],[-7,23],[9,33],[12,11],[6,37],[3,57],[10,46],[5,13],[20,0],[6,6],[-3,44],[-12,20],[-4,12],[0,106],[3,43],[8,30],[-6,64],[4,24],[15,33],[7,72],[-6,21],[14,110],[-1,73],[19,74],[29,33],[9,1],[1,-62],[3,-21],[-17,-37],[16,-49],[-2,-17],[-6,-39],[-11,-37],[-15,-16],[-11,-50],[-7,-19],[22,-53],[7,-180],[-16,-49],[-19,-10],[4,-120],[-3,-26],[-19,-59],[-4,-26],[-11,-24],[5,-30],[9,-13],[0,-25],[-8,-64],[-1,-72],[-11,-59]],[[75837,58776],[13,-79],[-22,35],[-8,24],[11,17],[6,3]],[[75754,59253],[-9,-37],[-1,80],[4,10],[4,3],[6,-8],[-4,-48]],[[70216,58296],[-2,-4],[0,10],[2,17],[3,11],[1,-1],[0,-11],[-2,-15],[-2,-7]],[[70296,56606],[-4,-7],[-4,-3],[-3,1],[-1,7],[0,6],[4,-7],[5,6],[5,18],[1,6],[1,-3],[-1,-10],[-3,-14]],[[45682,89993],[32,-3],[52,20],[22,13],[53,45],[32,13],[49,-3],[23,3],[1,-5],[-30,-18],[-24,-6],[-35,-27],[-32,-62],[-25,-30],[1,-13],[29,-24],[32,-13],[30,12],[13,-5],[12,-17],[6,-18],[2,-17],[-6,-36],[-17,-37],[-24,-30],[3,-10],[19,-5],[92,20],[10,-1],[5,-10],[1,-19],[5,-16],[9,-15],[-3,-15],[-40,-48],[48,30],[37,9],[65,-15],[26,-18],[15,-30],[23,10],[9,-1],[15,-17],[0,-18],[-10,-27],[-4,-24],[-11,-10],[-21,-7],[-6,-9],[9,-18],[14,-18],[19,-1],[3,-9],[1,-10],[-3,-12],[-6,-8],[-10,-4],[-13,-13],[48,-29],[6,-10],[1,-16],[-4,-17],[-8,-18],[-15,-11],[-34,-2],[-22,-12],[7,-20],[0,-26],[-6,-29],[-28,-46],[-26,-24],[-25,-15],[-45,5],[-24,12],[2,-39],[-25,-24],[5,-20],[9,-10],[-5,-26],[-11,-26],[-20,-27],[-23,-17],[-45,-21],[-38,-35],[-26,-14],[-65,1],[-67,-22],[-93,-47],[-64,-38],[-48,-43],[-65,-69],[-48,-30],[-27,-7],[-54,-7],[-45,-19],[-150,-35],[-50,-19],[-7,-18],[-21,-27],[-1,-9],[9,-8],[2,-9],[-19,-32],[-37,-22],[-17,0],[-21,20],[-10,-1],[-3,-3],[0,-6],[12,-24],[-23,-10],[-97,-28],[-166,20],[-65,22],[-81,33],[-49,9],[-68,2],[-56,47],[-26,29],[-2,12],[3,14],[5,9],[9,5],[19,0],[2,5],[-14,23],[-14,-8],[-36,-33],[-16,2],[-21,16],[-1,16],[-41,6],[-36,20],[-36,28],[-5,11],[17,16],[-3,3],[-13,3],[-26,-5],[-39,-36],[-17,-9],[-257,-8],[-65,-4],[-13,-5],[-11,23],[-10,53],[-4,34],[3,17],[9,20],[14,-4],[13,-15],[12,-23],[14,-11],[89,28],[37,18],[15,18],[18,29],[20,16],[9,14],[18,46],[13,21],[14,16],[18,10],[40,7],[-27,11],[-24,0],[-85,-48],[-28,0],[1,7],[12,14],[29,24],[-20,1],[-8,11],[-1,22],[15,37],[69,47],[24,7],[7,10],[-9,7],[-14,5],[-70,-49],[-50,-17],[-15,3],[-26,19],[-8,9],[-12,22],[2,13],[24,38],[-4,8],[-17,3],[-44,36],[-71,-4],[-174,21],[-36,-9],[-59,-30],[-36,-10],[-16,6],[-15,16],[-14,22],[-12,27],[5,19],[23,11],[17,5],[47,-6],[58,19],[37,4],[10,3],[22,20],[11,5],[16,-7],[8,-14],[59,22],[20,10],[2,7],[9,8],[28,-12],[24,0],[29,8],[52,3],[115,2],[18,18],[8,15],[10,39],[-4,8],[-73,-36],[-16,1],[-84,19],[-30,21],[10,18],[44,37],[46,30],[67,32],[16,13],[2,15],[-45,26],[-85,-7],[-22,31],[-70,19],[-47,-12],[-25,19],[-61,-26],[-134,-38],[-54,-27],[-28,-8],[-33,21],[-57,25],[-64,7],[-6,14],[37,44],[26,8],[26,-4],[49,-30],[34,-10],[-43,45],[1,17],[-3,26],[-13,11],[-13,29],[5,9],[17,4],[34,-10],[82,-50],[40,9],[22,18],[29,14],[-8,7],[-70,1],[-38,10],[-19,14],[-17,25],[6,11],[20,10],[60,-3],[-40,43],[-27,24],[-3,12],[2,15],[3,10],[6,5],[69,-25],[15,-1],[-14,16],[-30,24],[-2,9],[13,7],[6,14],[1,11],[21,9],[21,1],[21,-9],[66,-46],[10,-13],[3,-17],[-3,-22],[2,-8],[26,7],[21,-9],[10,2],[26,32],[17,-7],[11,-15],[3,-14],[2,-18],[-5,-39],[1,-5],[18,22],[31,1],[4,11],[1,41],[-3,34],[-3,7],[-101,48],[-17,11],[-22,24],[5,11],[19,11],[30,4],[68,-1],[7,5],[-13,13],[-32,8],[-7,7],[-4,14],[-38,-8],[-42,0],[-40,8],[-1,11],[16,15],[33,26],[15,7],[46,-5],[46,8],[37,-9],[29,-26],[42,-45],[57,-29],[5,-9],[30,-24],[60,-63],[60,-37],[3,-10],[-10,-11],[-23,-13],[5,-7],[31,-9],[21,-25],[2,-11],[-20,-78],[-10,-16],[-13,-9],[-56,15],[14,-25],[40,-26],[9,-15],[-6,-14],[4,-4],[15,8],[6,-8],[-3,-24],[-6,-20],[-10,-16],[3,-7],[16,2],[14,-4],[23,-22],[19,-67],[9,-21],[7,19],[8,49],[8,25],[7,1],[7,8],[5,15],[11,55],[38,41],[18,12],[16,3],[9,-5],[28,-43],[17,-7],[9,2],[12,29],[15,56],[3,63],[-8,69],[5,49],[18,30],[23,9],[29,-12],[22,-18],[42,-68],[34,-36],[29,-39],[15,-12],[29,-7],[7,3],[6,9],[2,15],[-6,98],[8,31],[12,22],[53,12],[28,14],[28,22],[22,12],[19,2],[19,-9],[19,-19],[31,-37],[39,-61],[50,-46],[26,-73],[5,-13],[6,-1],[7,9],[4,14],[1,32],[-14,43],[-46,109],[-1,20],[6,17],[33,1],[75,-9],[25,-17],[51,-66],[15,-16],[8,-5],[4,9],[20,12],[13,15],[23,36],[51,66],[10,2],[15,-5],[26,-18],[12,-13],[24,-11],[25,4],[35,23],[38,14],[14,32],[2,15],[-31,97],[13,20],[68,24],[59,2],[14,-7],[38,-47],[25,-23],[13,-19],[3,-42],[15,-16],[29,-17]],[[55251,78301],[-1,0],[-19,-12],[-31,-7],[-16,5],[-28,-54],[-8,-10],[-27,-17],[-22,-8],[-19,7],[-7,0],[-84,3],[-43,12],[-28,21],[-19,23],[-9,27],[-21,15],[-34,6],[-27,26],[-19,46],[-26,37],[-32,27],[-26,38],[-19,50],[-34,44],[-50,40],[-15,8]],[[54470,78838],[44,62],[22,18],[26,-3],[8,5],[2,9],[4,21],[3,19],[2,18],[-3,10],[-12,3],[-6,45],[6,17],[6,12],[-7,54],[2,18],[20,3],[16,12],[14,13],[4,17],[11,34],[-10,42],[-58,27],[-3,11],[13,12],[15,17],[8,13],[11,2],[16,-7],[28,-30],[10,-5],[11,9],[11,2],[30,-1],[26,7],[-6,32],[0,24],[-4,19],[3,20],[10,16],[3,36],[17,25]],[[25739,59319],[2,61],[-23,25],[-12,50],[-11,34],[3,21],[-1,24],[-31,19],[-30,-14],[-17,9],[-12,13]],[[25607,59561],[21,30],[2,18],[-7,14],[-7,8],[2,34],[4,40],[12,94],[-4,17],[-20,28],[-25,3],[-27,-9],[-13,14],[-12,32],[-20,16],[-34,-26],[-37,-39],[-11,-14],[-10,2],[-4,29],[-2,35],[-2,8],[-20,12],[-23,9],[-11,10],[-11,23],[-28,30],[-6,22],[-37,52],[-7,25],[-8,19],[-18,23],[-14,-5],[-46,29],[-7,3]],[[25177,60147],[6,26],[15,39],[32,45],[2,36],[-8,68],[-8,45],[4,20],[10,80],[8,19],[46,40],[4,6],[37,57],[40,63],[42,69],[47,78],[26,45],[12,20]],[[25492,60903],[27,-16],[21,37],[12,12],[29,44],[9,10],[48,18],[23,-1],[21,-44],[16,-25],[30,21],[26,5],[105,-42],[42,19],[76,4],[35,-11],[49,59],[31,12],[37,27],[-5,29],[-9,12],[56,-12],[83,-60],[89,11],[32,32],[21,9],[91,-61],[24,-47],[19,-4],[14,10],[4,10],[-18,10],[-8,15],[72,-29],[135,-222],[3,-18],[-58,65],[-31,-5],[-8,-10],[2,-36],[3,-17],[13,-2],[10,10],[24,-12],[15,-24],[19,-36],[12,-40],[12,-1],[12,24],[23,3],[15,-26],[11,1],[-15,42],[-35,41],[9,1],[77,-74],[21,-92],[19,-21],[18,-29]],[[25994,61277],[-44,-45],[-14,1],[20,35],[33,30],[28,14],[23,-6],[-46,-29]],[[26147,61325],[-21,-33],[-4,15],[10,31],[13,17],[12,-1],[-3,-14],[-7,-15]],[[30061,63201],[6,-17],[13,-116],[1,-38],[-13,-56],[2,-22],[28,-52],[0,-18],[-3,-19],[-24,-49],[-18,-34],[6,-39],[15,-36],[2,-31],[-5,-41],[-22,-50],[-12,-18],[-34,-2],[-3,-7],[16,-49],[19,-56],[31,-43],[7,-41],[-8,-38],[-1,-95]],[[30064,62234],[-23,46],[-26,38],[-16,15],[-16,10],[-123,-5],[-14,-7],[-11,-12],[-11,-6],[-34,-12],[-34,-2],[-79,31],[-31,16],[-31,10],[-36,-3],[-36,-10],[-29,-22],[-21,-40],[-4,-36],[-13,-10],[-29,59],[-27,41],[-30,31],[-62,45],[-12,27],[-5,32],[26,101],[28,19],[16,3],[35,-12],[35,-23],[31,-15],[49,-6],[27,-25],[187,-38],[35,-12],[14,4],[12,15],[10,27],[12,21],[56,4],[11,9],[8,29],[0,29],[-33,40],[-51,86],[-45,103],[20,34],[-8,63],[8,58],[10,57],[-44,49],[-53,49],[-73,15],[-22,13],[-12,36],[11,49],[23,28],[27,16],[28,12],[67,14],[67,-16],[57,-50],[59,-40],[73,-13],[34,-14],[15,12]],[[29776,62659],[-5,-40],[-71,48],[-57,61],[2,33],[30,7],[28,-20],[41,-40],[32,-49]],[[29815,63385],[12,-13],[-5,-17],[-28,10],[-29,19],[-9,-5],[-6,2],[-17,18],[15,14],[15,4],[17,-1],[35,-31]],[[33328,56767],[10,-9],[40,-92],[23,-20],[4,0],[0,24],[21,-10],[52,-63],[77,-103],[108,-195],[31,-75],[20,-35],[33,-85],[9,-41],[-1,-166],[-28,-112],[-7,-84],[-2,-113],[-16,-64],[22,35],[6,101],[19,62],[24,67],[33,16],[35,-28],[28,-5],[24,-20],[53,-108],[52,-86],[18,-68],[55,-34],[32,-54],[10,-47],[7,-122],[-11,-185],[3,-9]],[[34310,52961],[-12,-8],[-10,-12],[-15,9],[-21,-5],[-21,-12],[-19,-7],[-37,21],[-11,2],[-8,9],[-15,40],[-8,5],[-19,-19],[-24,-13],[-12,3],[-14,-14],[-12,-18],[-25,-78],[-12,-27],[-14,-13],[-27,1],[-29,-3],[-21,-19],[-21,-10],[-10,-1],[-3,-42],[-5,-20],[-6,-12],[-16,-3],[-14,1],[-9,18],[-15,9],[-15,7],[-9,10],[-7,-3],[-6,-18],[-5,-15],[-4,-28],[-22,-9],[-9,-16],[5,-52],[-2,-20],[-5,-16],[-26,-4],[-22,2],[-12,-20],[-16,-22],[-10,-4],[-11,1],[-15,26],[-14,32],[-37,23],[-36,18],[-24,51],[-6,25],[-11,11],[-28,61],[-16,39],[-17,10],[-19,17],[0,28],[-1,27],[-8,11],[-12,7],[-4,15],[1,36],[2,92],[-3,88],[-26,30],[-11,21],[-20,130],[-9,58],[-1,44],[7,129],[7,56],[20,113],[12,38],[1,28],[-2,37],[-6,72],[35,46],[14,19],[3,30],[18,39],[8,37],[7,29],[-2,15],[-8,9],[-10,27],[-19,79],[-7,16],[-6,22],[3,35],[7,38],[-1,16],[-11,21],[-25,34],[-20,2],[-16,13],[-23,1],[-18,4],[-10,13],[2,21],[4,16],[16,40],[10,42],[2,42],[3,55],[4,47],[3,54],[-25,35],[-7,29],[-10,25],[-11,0],[-17,11],[-26,-33],[-21,6],[-14,-13],[-32,3],[-21,16],[-25,-11]],[[46186,59143],[-1,-46],[16,-66],[-2,-49],[-7,-47],[-6,-18],[-9,-11],[-25,1],[-10,-10],[-17,-18],[0,-21],[13,-21],[11,-28],[13,-23],[21,-25],[2,-29],[1,-72],[-1,-57],[-61,-41],[-47,-7],[-40,4],[-17,-17],[-35,-43],[-42,-25],[-22,-2],[-10,-15],[-17,-44],[-46,-192],[-15,-46],[-12,-30]],[[45821,58145],[-14,40],[11,76],[-12,-1],[-23,-61],[-12,-2],[2,72],[-13,3],[-15,-5],[-21,37],[-2,28],[1,40],[13,25],[-2,10],[-12,3],[-14,-6],[-8,11],[14,51],[49,43],[24,5],[26,9],[-14,37],[-30,15],[-24,-10],[-12,-27],[-15,-5],[-25,63],[1,31],[9,38],[14,16],[57,0],[22,21],[9,4],[8,19],[-2,12],[-9,1],[-21,-25],[-69,10],[-22,-15],[-38,-58],[-47,-31],[-34,13],[11,77],[-5,10],[-10,13],[-50,-25],[-38,35],[-15,43],[3,53],[17,36],[3,18],[-19,3],[-34,-22],[-77,86]],[[45523,58213],[-22,-8],[-10,28],[-2,11],[12,10],[5,0],[9,21],[11,14],[5,5],[5,-1],[4,-46],[-5,-20],[-12,-14]],[[45584,58227],[-3,-16],[-16,2],[4,16],[-4,5],[5,49],[2,7],[8,-18],[1,-8],[3,-37]],[[45631,58303],[0,-23],[-11,4],[-4,7],[7,43],[11,19],[12,-3],[4,-6],[-2,-16],[-6,-14],[-11,-11]],[[45679,58488],[-2,-13],[-16,11],[23,49],[15,8],[-1,-37],[-11,-8],[-8,-10]],[[45582,58447],[-13,-18],[-13,9],[-7,16],[1,29],[15,41],[14,-6],[3,-71]],[[45559,58687],[-15,-70],[-17,7],[-13,42],[-1,18],[36,6],[10,-3]],[[46307,57055],[-3,17],[10,53],[-8,28],[-28,55],[-2,27],[-9,34],[-36,71],[-35,-4],[10,59],[-1,79],[-11,43],[3,44],[-7,-2],[-11,-31],[-18,10],[-38,47],[-18,46],[-3,38],[-4,15],[-11,-8],[-24,1],[-71,69],[-51,174],[-1,39],[7,67],[-1,19],[-23,-45],[-5,30],[-18,70],[-5,40],[-17,17],[-14,4],[-10,-14],[-14,-81],[-11,0],[-10,18],[2,61]],[[47780,57697],[-6,-22],[-18,-33],[-17,-26],[-5,-28],[3,-53],[0,-119],[2,-103],[14,-38],[16,-19],[19,4],[18,7],[-1,-62],[-5,-69],[22,-22],[11,-21],[6,-19],[-35,-37],[-10,-22],[-4,-57],[1,-54],[46,-38],[18,-45],[8,-46],[3,-88],[-4,-20],[-12,0],[-14,27],[-10,26],[-12,0],[-24,6],[-26,10],[-33,-2],[-12,-5],[-8,-16],[-2,-27],[-3,-89],[11,-20],[21,-22],[14,-9],[12,3],[9,-15],[2,-38],[-7,-28],[-11,-26],[-15,-67],[3,-25],[0,-37],[-25,-98],[-7,-19],[-33,19],[-22,7],[-16,-25]],[[25233,62105],[-3,-140],[-3,-162],[-2,-119],[-3,-159],[-3,-162],[-5,-222],[-2,-143],[1,-3],[33,7],[49,-6],[12,0]],[[25307,60996],[15,-12],[12,-4],[24,-32],[30,-25],[18,50],[-9,29],[-8,15],[1,14],[102,-128]],[[25177,60147],[-6,6],[-10,2],[-23,-10],[-11,-2],[-9,-11],[-1,-25],[6,-40],[3,-21],[-7,-9],[-28,-25],[-11,-23],[-11,-38],[-12,-15],[-13,3],[-9,-6],[-19,-27],[-30,-54],[-15,-40],[-1,-30],[3,-27]],[[24973,59755],[-106,95],[-36,16],[-150,-2],[-64,37],[-73,72],[-50,66],[-115,182]],[[32856,58762],[-18,-2],[7,21],[2,37],[10,44],[15,30],[15,-8],[-6,-98],[-25,-24]],[[57738,72899],[-6,-9],[-14,26],[0,14],[14,16],[7,3],[2,-10],[0,-23],[-3,-17]],[[55725,73953],[4,-67],[19,-12],[26,-60],[-2,-31],[-6,-10],[-43,28],[-10,-13],[-13,5],[-7,34],[1,11],[-8,20],[-5,9],[-17,-26],[-11,-5],[0,24],[16,66],[7,11],[13,-22],[10,8],[8,36],[1,36],[3,11],[14,-53]],[[55802,73620],[29,-56],[-23,14],[-26,-39],[-31,45],[-20,46],[-4,18],[20,43],[19,-44],[22,-7],[14,-20]],[[55746,74083],[-11,-5],[-9,3],[-9,-2],[-8,-11],[1,45],[10,57],[11,33],[17,15],[7,-26],[-1,-92],[-8,-17]],[[55766,73922],[-14,-6],[-17,55],[-7,38],[7,2],[7,-5],[8,-14],[0,-15],[3,-15],[7,-19],[6,-21]],[[55577,74557],[6,-32],[-35,20],[-25,29],[-21,71],[-45,81],[0,24],[17,18],[36,12],[15,-13],[9,-13],[3,-16],[-20,-31],[-5,-14],[16,-28],[0,-11],[7,-55],[8,-20],[20,-16],[14,-6]],[[56504,74284],[15,-62],[15,-21],[31,-25],[15,-4],[52,-45],[62,-8],[8,-13],[7,-35],[13,-27],[3,-22],[-7,-23],[9,-72],[16,-68],[23,-33],[29,-10],[28,1],[7,-14],[-3,-59],[-12,-24],[-9,-5],[-9,6],[-7,14],[-8,7],[-16,1],[-12,24],[-29,33],[-5,19],[-1,31],[-13,22],[-11,43],[-11,11],[-6,22],[-1,9],[-43,6],[-35,0],[-30,24],[-9,63],[-18,17],[-13,18],[-11,25],[-29,45],[-31,39],[-30,25],[-32,16],[-26,-19],[-15,4],[-3,13],[33,27],[44,50],[31,16],[15,2],[29,-44]],[[56605,74374],[-12,-20],[-20,9],[-20,65],[52,-54]],[[56635,74399],[-13,-7],[13,46],[23,24],[-9,-38],[-14,-25]],[[56854,74198],[-30,-14],[-8,2],[7,18],[0,7],[-29,33],[4,42],[3,11],[22,-22],[5,-37],[26,-40]],[[56881,75238],[-35,-20],[-37,39],[1,23],[19,47],[10,14],[27,-4],[15,-32],[4,-15],[-5,-26],[1,-26]],[[56541,73689],[-11,-14],[-12,1],[-9,5],[-4,11],[5,6],[7,23],[6,6],[9,-3],[5,-9],[4,-26]],[[56403,72689],[-3,-25],[-28,17],[-8,26],[-2,57],[8,28],[5,9],[13,-32],[27,-47],[-12,-33]],[[57548,72272],[-10,-32],[-11,27],[5,31],[-13,50],[24,74],[0,36],[18,19],[-4,-62],[-14,-49],[14,-40],[7,-46],[-16,-8]],[[57505,73132],[-28,-8],[5,46],[-13,36],[21,-20],[14,-24],[7,-5],[-2,-15],[-4,-10]],[[57485,72999],[-8,-1],[10,28],[29,38],[43,34],[14,3],[24,-21],[-44,-34],[-12,-18],[-32,-4],[-24,-25]],[[57096,73137],[-25,-22],[-17,32],[-10,50],[46,72],[11,-6],[6,-19],[-1,-65],[-10,-42]],[[57021,73195],[-22,-44],[-18,5],[-8,20],[12,42],[24,24],[11,-7],[-1,-31],[2,-9]],[[57078,72806],[-13,-30],[-18,11],[7,11],[5,15],[0,22],[-5,13],[3,5],[17,-22],[4,-25]],[[57050,72968],[-5,-9],[-21,37],[-8,21],[10,18],[31,-42],[-7,-25]],[[57451,73623],[34,-19],[9,2],[16,-6],[5,-35],[-22,-6],[-37,-32],[-15,7],[-19,28],[-30,3],[-9,8],[16,33],[29,16],[23,1]],[[57230,73461],[-13,-2],[4,23],[25,40],[34,2],[32,20],[7,0],[-15,-31],[-25,-30],[-49,-22]],[[57183,73035],[-25,-4],[-8,4],[15,10],[11,10],[5,13],[25,23],[16,29],[18,-20],[-23,-13],[-34,-52]],[[57350,72917],[-22,-14],[-14,-29],[-17,21],[0,28],[18,-9],[13,16],[-4,18],[15,-9],[11,-22]],[[56765,73488],[-19,-28],[-3,42],[12,44],[16,3],[6,-19],[-12,-42]],[[56787,73354],[-16,-17],[6,40],[-8,21],[7,17],[10,15],[5,-15],[9,-24],[-13,-37]],[[56815,73020],[0,-34],[-1,-12],[-57,-16],[5,38],[3,13],[19,-18],[7,9],[3,10],[21,10]],[[56928,73440],[-1,-60],[-8,1],[-4,9],[0,23],[3,36],[10,-9]],[[56942,73594],[-9,-39],[-21,45],[-24,31],[-9,27],[-14,16],[-4,36],[17,15],[8,1],[18,-44],[28,-5],[-2,-27],[8,-35],[4,-21]],[[57015,73501],[-10,-37],[-18,6],[-29,40],[-10,18],[-5,18],[12,2],[14,-19],[37,-10],[9,-18]],[[56866,73111],[-5,-3],[-7,25],[-2,22],[3,13],[10,2],[13,-43],[-12,-16]],[[57248,73858],[-27,-33],[-29,47],[-5,15],[21,19],[11,30],[-8,36],[-31,53],[-1,38],[46,16],[27,-33],[14,-3],[-5,-31],[2,-10],[2,-96],[-13,-13],[-2,-26],[-2,-9]],[[57336,74498],[-5,-34],[38,-57],[13,-36],[5,-35],[-3,-10],[-15,19],[-12,6],[4,-25],[13,-21],[-22,-13],[-22,1],[-64,30],[-14,32],[38,48],[8,19],[-27,-2],[-29,-57],[-46,25],[-14,23],[-4,12],[19,51],[32,-2],[17,11],[21,16],[1,24],[50,6],[18,-31]],[[57134,75130],[-31,-15],[-35,47],[34,19],[15,-14],[11,-16],[6,-21]],[[57065,74874],[-10,-19],[-8,-34],[-4,-47],[-16,-2],[-10,10],[-3,18],[-1,23],[-7,-1],[-6,-25],[-5,-11],[-16,-2],[-18,15],[1,33],[-4,38],[2,14],[49,3],[14,-28],[18,16],[7,18],[21,11],[-4,-30]],[[57056,73397],[-27,-3],[2,44],[10,11],[31,-22],[-1,-14],[-15,-16]],[[56812,73228],[-11,-9],[-17,13],[5,32],[11,13],[13,-10],[2,-14],[-3,-25]],[[57734,72539],[-21,-12],[-6,2],[-9,26],[12,65],[-11,41],[-1,18],[17,24],[11,36],[27,40],[72,46],[17,5],[-1,-37],[-24,-92],[-21,-46],[6,-37],[-34,-11],[-34,-68]],[[56625,72312],[19,-4],[26,1],[6,3],[16,34],[20,1],[9,-34],[-20,-15],[-5,-9],[4,-7],[16,-13],[21,5],[1,-26],[4,-22],[11,-13],[11,-2],[26,4],[25,8],[25,17],[26,9],[79,-9],[28,-36],[53,-5],[50,-19],[26,13],[45,12],[7,-13],[-6,-82],[3,-24],[13,-11],[12,5],[16,27],[37,21],[39,0],[33,54],[10,3],[-6,-26],[-5,-63],[-7,-37],[-3,-29],[-22,-15],[-33,-3],[-61,6],[-60,-10],[-113,-28],[-113,-14],[-15,9],[0,37],[-3,25],[-7,18],[-35,15],[-33,26],[-130,36],[-31,14],[-50,-8],[-18,1],[-13,13],[-9,22],[-4,69],[7,69],[10,18],[5,-21],[13,-9],[12,21],[0,31],[6,29],[9,-12],[7,-45],[16,-12]],[[57232,75303],[-7,24],[-43,43],[-100,25],[-48,32],[-21,-6],[-40,36],[-28,-16],[-59,-63],[-31,7],[-34,38],[-22,7],[-26,-20],[-42,-73],[-42,-36],[-38,14],[-51,0],[-5,-41],[10,-28],[27,-48],[-13,-37],[10,-36],[18,-7],[28,2],[50,-47],[22,-50],[14,-54],[-30,39],[-21,37],[-28,14],[-40,32],[-25,5],[-26,-22],[-3,-25],[29,-47],[26,-29],[14,-23],[9,-52],[-5,-17],[-10,-17],[-31,33],[-47,116],[-66,23],[-11,-24],[13,-61],[9,-24],[58,-67],[-5,-14],[-8,-6],[-65,38],[-19,58],[-4,73],[-59,50],[-56,55],[-13,53],[12,19],[8,38],[-31,-7],[-19,-24],[-32,-23],[-1,-39],[5,-36],[-10,-52],[-10,-90],[6,-48],[68,-136],[23,-99],[16,-37],[35,-42],[36,-76],[15,-41],[11,-65],[-30,-41],[-18,-2],[-9,19],[13,44],[-2,28],[-47,42],[-20,-15],[-22,-27],[13,-51],[14,-34],[8,-46],[28,4],[-38,-52],[-35,-27],[-35,-1],[-23,-5],[-7,-13],[18,-10],[15,-1],[24,-28],[68,-34],[33,-42],[32,-4],[32,-78],[56,-21],[31,-79],[43,-16],[36,-29],[11,-27],[5,-50],[2,-107],[8,-79],[0,-25],[-2,-37],[-9,-19],[-14,0],[-26,58],[-40,61],[-42,73],[-12,13],[-10,1],[-23,-25],[-63,-19],[-29,-26],[-11,-6],[-4,-14],[14,-15],[17,-33],[0,-45],[14,-56],[18,-14],[24,1],[13,-10],[4,-22],[14,-26],[9,-19],[-1,-13],[-66,-37],[-13,-16],[-12,-9],[-17,18],[-1,44],[-22,23],[-21,21],[-25,9],[-21,30],[-14,-25],[11,-85],[24,-60],[40,-158],[18,-93],[4,-46],[-9,-75],[19,-56],[14,-57],[-15,2],[-13,20],[-21,24],[-42,92],[-15,57],[-17,4],[-30,-8],[-34,-122],[1,-70],[-18,17],[-14,22],[1,76],[-1,32],[-40,104],[-19,12],[-8,35],[-15,38],[-19,-8],[-16,-15],[-4,-56],[-2,-51],[-11,-38],[-43,72],[-43,126],[-1,68],[31,63],[-4,45],[-30,89],[-43,57],[-24,17],[-11,60],[-23,31],[-19,15],[-4,22],[6,16],[45,62],[27,97],[13,5],[27,-23],[31,6],[25,57],[21,31],[36,-4],[80,-76],[87,-44],[43,-38],[25,-38],[13,-8],[20,-5],[-1,28],[-6,25],[17,14],[46,-1],[9,14],[8,21],[-9,24],[-16,12],[-16,3],[-11,8],[-17,-8],[-28,19],[-14,16],[-8,16],[-47,32],[-45,54],[-10,-31],[-19,-16],[-25,-3],[-73,35],[-45,-27],[-24,-6],[-19,-1],[-23,-12],[-26,-7],[-23,50],[-9,39],[-7,7],[-1,-37],[-7,-29],[-33,-16],[-20,23],[-15,68],[-18,87],[-33,70],[-27,18],[-3,39],[3,30],[32,8],[50,-32],[11,6],[11,15],[-2,33],[-7,29],[-14,2],[-10,-4],[-31,6],[-39,-16],[-19,15],[-6,19],[-33,46],[-29,62],[-46,41],[-31,126],[-25,55],[-28,40]],[[55555,74717],[6,0],[11,-6],[19,-22],[21,-5],[12,15],[7,13],[4,21],[2,26],[3,8],[16,-3],[5,6],[0,23],[-10,28],[-10,35],[0,16],[8,7],[13,15],[6,19],[14,9],[19,2],[22,8],[15,20],[2,19],[9,55],[5,27],[10,24],[5,33],[10,31],[21,13],[19,15],[14,40],[8,34],[0,20],[-12,35],[-9,33],[3,43]],[[56365,75654],[30,-6],[37,-2],[23,36],[37,3],[17,5],[28,-8],[28,1],[35,15],[33,25],[26,-2],[10,4],[6,5],[7,34],[48,2],[17,-3],[27,-1],[28,18],[8,-2],[14,-49],[8,-14],[15,-13],[34,-37],[6,10],[14,12],[41,-17],[39,-28],[33,-42],[36,12],[40,21],[27,6],[28,3],[17,8],[38,-10],[40,22],[19,20],[6,29],[-3,50],[-9,49],[-10,19],[-3,19],[5,18],[6,12],[26,11],[34,-16]],[[50329,55350],[-22,-22],[-16,-33],[-12,-50],[-16,-55],[-55,-29],[-22,-1],[-114,-1],[-108,-109],[-61,-39],[-38,-61],[-51,-44],[-36,-53],[-74,-25],[-122,-83],[-38,-33],[-38,-58],[-63,-68],[-24,1],[-49,63],[-37,32],[-90,49],[-67,18],[-33,21],[-8,4]],[[49135,54774],[7,23]],[[49142,54797],[19,1]],[[49161,54798],[20,-7],[14,18],[22,2],[6,18],[2,46],[0,37],[7,16],[2,44],[-11,96],[-7,11],[-39,14],[-3,19],[-7,21],[-8,49],[-8,74],[-14,92],[-27,151],[-6,54],[-5,54],[-1,66],[6,24],[-1,33],[-2,34],[18,77],[37,94],[7,34],[7,24],[1,34],[7,110],[17,132],[11,51],[7,27],[9,44],[3,21],[33,52],[16,14],[3,20],[-5,23],[2,15],[8,8],[12,6],[9,21],[-14,164],[-11,163],[-1,14],[-7,23],[-6,67],[-12,39],[-16,12],[1,37],[16,63],[4,37],[-8,11],[-1,28],[5,47],[-2,28]],[[49251,57304],[-3,31],[-17,71],[-4,51],[9,29],[-1,65],[-9,100],[-1,63],[6,26],[-3,25],[-12,24],[-1,23],[10,23],[-1,17],[-13,13],[-11,31],[-10,48],[2,78],[19,144],[2,12],[22,-1],[0,-6],[68,2],[77,1],[92,2],[83,2],[4,6],[14,8],[84,-15],[53,8],[22,-5],[17,-10],[36,6],[20,-3],[14,-36],[6,0],[8,15],[15,18],[15,13],[11,28],[6,22],[10,-5],[13,2],[10,18],[3,27],[64,-29]],[[52115,79258],[-14,8],[-10,38],[3,58],[15,76],[4,56],[-7,35],[9,54],[25,71],[16,75],[9,78],[12,52],[23,36],[56,100],[5,8],[-2,50],[-15,7],[-22,15],[-56,18],[-52,11],[-24,14],[-21,38],[-13,1],[-25,-14],[-32,-9],[-22,8],[-15,-2],[-8,-7],[-4,6],[-6,33],[-12,9],[-18,7],[-12,-3],[-8,-16],[-12,-12],[-12,4],[-35,75],[-9,17],[-3,15],[-8,28],[-22,27],[-21,9],[-10,-3]],[[51699,80714],[1,11],[15,53],[52,49],[-5,48],[-1,30],[-13,19],[-25,8],[-7,13],[-3,14],[19,29],[-23,24],[-10,24],[-31,30],[-4,11]],[[51999,82535],[-13,26],[-27,28],[6,59],[9,45],[27,57],[22,15],[96,9],[105,-4],[44,-84],[-16,-44],[25,-20],[13,7],[9,38],[6,42],[9,13],[33,-32],[12,-21],[0,-69],[12,93],[-9,66],[6,63],[14,34],[12,21],[77,-23],[86,12],[32,-25],[73,-123],[24,-20],[31,-6],[-42,26],[-89,149],[-26,19],[-41,5],[-26,15],[-16,23],[-4,20],[1,150],[-16,22],[-20,8],[-12,-10],[-25,-1],[-5,34],[6,26],[51,17],[33,23],[2,41],[-22,32],[-25,58],[-30,56],[-3,64]],[[52408,83469],[52,-1],[13,-3],[78,-30],[19,-21],[24,-1],[44,20],[33,8],[12,-12],[18,-5],[4,0]],[[52705,83424],[2,-10],[40,-16],[17,-24],[19,-37],[2,-54],[-24,-38],[-20,-24],[76,9],[8,-22],[11,-24],[41,17],[103,-70],[63,34],[16,2],[14,-57],[-16,-57],[-55,-61],[13,-38],[17,-8],[52,8],[82,-37],[17,11],[67,86],[26,18],[88,14],[16,33],[35,33],[23,36],[55,70],[56,-13],[33,-13],[37,-7],[33,-74],[83,-81],[77,7],[27,-77],[12,-96],[24,-30],[20,-19],[63,-21],[2,-1]],[[54113,81139],[-3,-9],[-9,-14],[-12,-2],[-18,10],[-12,13],[3,34],[-8,3],[-10,20],[-4,23],[-11,9],[-39,10],[-13,6],[-10,-5],[-8,-15],[5,-15],[8,-14],[21,-22],[-2,-9],[-47,-21],[-29,-23],[-27,-12],[-28,-23],[-55,-26],[-40,-7],[-8,-6],[-15,-44],[-10,-9],[-10,4],[-7,8],[-10,-6],[-9,-15],[-11,-6],[-8,1],[-16,-39],[-46,-11],[-5,-20],[-9,-23],[-6,-5],[-21,9],[-29,5],[-16,-13],[-20,-7],[-24,-2],[-26,-25],[-27,-44],[-14,-39],[-8,-14],[-13,36],[-16,26],[-11,13],[-10,0],[-2,-6],[0,-19],[10,-32],[13,-21],[2,-16],[8,-29],[19,-32],[30,-25],[20,-25],[15,-35],[0,-10],[-4,-14],[-7,-13],[-6,-18],[-17,-35],[5,-15],[14,-19],[12,-23],[15,-37],[21,-66],[14,-27],[19,-28],[18,-21],[28,1],[30,-41],[33,-58],[24,-27],[17,-8],[14,-22],[12,-30],[5,-18],[11,-12],[30,2],[38,-48],[23,-35],[13,-28]],[[53837,79934],[-3,-11],[-2,-35],[0,-38],[-3,-19],[-17,-26],[-9,-6],[-5,-5],[-52,34],[-4,-6],[-4,-4],[-14,-99],[-9,-18],[-15,-18],[-30,-17],[-20,-7],[-17,-8],[-51,-41],[-23,-25],[-15,-31],[0,-18],[25,-52],[29,-55],[0,-47],[-13,-36],[-3,-14],[9,-5],[16,-2],[13,-6],[6,-25],[-2,-44],[-5,-41],[-4,-17],[-13,-2],[-25,18],[-19,21],[-8,12],[0,15],[4,10],[-7,19],[-24,17],[-25,-8],[-19,-11],[-12,0],[-13,17],[-20,13],[-27,8],[-16,9],[-4,-5],[2,-36],[-5,-16],[-130,-21],[-40,-19],[-28,-25],[-22,-11],[-5,-16],[-21,-20],[-24,-6],[-6,6],[-15,-9],[-26,-9],[-17,3],[-8,16],[-16,25],[-7,18],[1,11],[-37,2],[-23,14],[-49,-4],[-12,6],[-2,-6],[-8,-71],[-9,-30],[-16,-30],[-20,-17],[-16,-3],[1,22],[4,27],[-12,6],[-17,3],[-8,8],[2,20],[-4,12],[-7,14],[-18,18],[-36,27],[-25,14],[-10,-14],[-18,-15],[-28,5],[-7,-6]],[[53808,83169],[7,-39],[-8,-19],[-31,32],[-32,0],[-18,-51],[-14,-2],[-49,46],[-7,23],[-2,18],[7,65],[-1,20],[15,22],[2,32],[27,34],[24,1],[8,-28],[11,-20],[40,-22],[6,-10],[4,-14],[-19,-27],[-6,-14],[6,-23],[30,-24]],[[53948,82874],[-12,2],[-34,-6],[-34,9],[-7,34],[6,34],[-14,22],[-13,14],[-2,19],[2,20],[59,-54],[48,-48]],[[53134,83189],[-43,-1],[-16,23],[-17,6],[9,29],[12,10],[41,-19],[13,-36],[1,-12]],[[52307,83402],[-6,-12],[3,82],[30,86],[13,-2],[-13,-23],[-4,-16],[-5,-33],[2,-17],[70,-5],[-8,-15],[-71,-10],[-11,-35]],[[52385,83359],[-11,-14],[-26,2],[-15,13],[5,14],[14,11],[11,2],[18,-7],[4,-21]],[[61530,75758],[53,108],[16,65],[1,39],[0,49],[-27,102],[-24,144],[-25,151],[-19,45],[-81,52],[-19,59],[-62,77],[-87,33],[-17,14],[-76,96],[-59,62]],[[62897,75973],[-7,-20],[-16,-38],[-13,-19],[-14,-3],[-14,-8],[-5,-20],[0,-26],[2,-19],[4,-7],[14,-6],[14,-54],[22,-28],[34,-31],[31,-36],[15,-33],[-3,-23],[-10,-50],[-25,-41],[-22,-10],[-7,3],[-14,13],[-28,32],[-30,25],[-24,-8],[-15,-10],[-31,12],[-35,21],[-19,22],[-8,16],[5,28],[-81,50],[-40,14],[-17,-15],[-60,-76]],[[62500,75628],[-7,-8],[-46,-10],[0,-7],[10,-16],[-2,-5],[-77,-2],[-25,-10],[-68,13],[-23,-6],[-19,-12],[-47,-13],[-32,-16],[-41,-9],[-43,0],[-14,-5]],[[45343,59368],[-2,49],[-15,111],[21,48],[22,29],[15,-23],[5,-45],[12,-31],[39,-20],[40,14],[24,-6],[-1,25],[8,33],[48,15],[50,9],[52,20],[41,-1],[12,6],[-3,8],[-36,10],[-78,-23],[-80,-7],[-60,-60],[-24,6],[-25,60],[-9,74]],[[53692,53088],[-1,-40],[-22,-99],[-11,-76],[-2,-81],[6,-65],[10,-46],[7,-51],[-5,-35],[-11,-15],[8,-18],[16,-4],[27,15],[42,27],[55,39],[36,21],[60,-13],[32,-15],[16,-28],[18,-116],[8,-17],[15,-50],[12,-59],[2,-30],[-1,-22],[-12,-32],[-14,-47],[-5,-29],[-11,-21],[-14,-21],[-40,-8],[-6,-13],[-12,-50],[-21,-43],[-9,-40],[-9,-53],[2,-67],[-4,-96],[-5,-64],[11,-23],[48,-16],[9,-13],[13,-40],[16,-38],[43,-23],[17,-29],[14,-32],[2,-26],[-10,-104],[-10,-99],[4,-76],[4,-73],[5,-105],[-2,-65],[-13,-39],[0,-31],[6,-37],[-11,-103],[-7,-17],[-20,-20],[-10,-27],[-3,-44],[-11,-59],[-10,-22],[0,-27],[10,-21],[0,-30],[-20,-37],[-11,-28],[-26,-14],[-30,14],[-7,21],[7,32],[-2,25],[-11,27],[-16,69],[-14,15],[-7,-28],[-25,-53],[-42,-67],[-30,-6],[-55,21],[-47,32],[-21,79],[-14,65],[-20,76],[-22,36],[-24,23],[-10,1],[-34,-42],[-10,-16],[0,-36],[3,-33],[5,-16],[5,-21],[-1,-33],[-6,-44],[-2,-49],[-106,-47],[-19,17],[-13,22],[-16,-4],[-46,-25],[-17,18],[-17,12],[-7,-10],[-1,-21],[8,-114],[-3,-44],[-10,-57],[-6,-38],[29,-11],[10,-18],[10,-29],[13,-27],[1,-16],[-15,-30],[-6,-37],[8,-28],[19,-30],[28,-32],[14,-20],[-2,-19],[-13,-40],[-5,-33],[-9,-31],[2,-28],[13,-26],[-2,-23],[-8,-18],[-18,4],[-14,-3],[-13,8],[-42,90],[-9,3],[-60,-70],[-15,-28],[-12,-41],[-17,-89]],[[53091,49587],[-27,51],[-24,95],[-27,58],[-58,94],[-15,69],[-66,153],[-95,152],[-69,133],[-10,29],[12,-3],[66,-66],[9,7],[7,15],[-28,34],[-27,28],[-26,17],[-26,-2],[-14,28],[-9,43],[-5,36],[-11,38],[-37,79],[-9,30],[-19,41],[12,6],[39,-40],[3,16],[-3,23],[-39,38],[-22,2],[-5,27],[3,30],[-28,115],[-29,85],[-4,41],[78,-186],[11,-4],[13,2],[33,21],[-6,25],[-15,26],[-14,-12],[-19,-2],[-9,11],[-5,19],[19,90],[-8,-4],[-6,-16],[-10,-8],[-16,-5],[-39,49],[-34,130],[-9,27],[-9,46],[-9,18],[-39,186],[15,-14],[18,-53],[35,11],[13,31],[12,-1],[12,7],[15,29],[45,128],[12,169],[-4,100],[-7,100],[15,32],[6,-21],[3,-36],[7,-26],[16,-23],[29,-7],[46,-36],[16,-24],[4,47],[53,40],[-16,14],[-47,-15],[-64,59],[-21,38],[-20,72],[-20,38],[1,34],[46,31],[12,-4],[5,-37],[12,-15],[5,5],[2,31],[0,86],[-14,122],[5,23]],[[52664,52437],[12,9],[11,16],[8,3],[16,-3],[8,-29],[4,-15],[15,-7],[13,-15],[11,4],[10,17],[13,4],[42,0],[38,-1],[75,0],[76,-1],[75,0],[57,0],[0,69],[0,108],[-1,127],[0,122],[0,113],[-1,133]],[[53146,53091],[3,38],[4,16],[-1,22],[58,2],[106,-10],[46,1],[13,-1],[58,6],[47,-8],[20,-10],[18,-4],[56,-6],[73,7],[25,-2],[14,-18],[6,-36]],[[52633,76500],[-7,-84],[5,-25],[10,-18],[5,-19],[8,-225],[-2,-18],[-34,-91],[-7,-26],[-2,-113],[-6,-30],[-12,-30],[-21,-96],[-19,-43],[-51,53],[-30,22],[-14,25],[-10,17],[6,23],[14,23],[2,19],[-32,21],[-15,14],[0,24],[11,38],[-5,32],[-18,-2],[-15,5],[-1,17],[10,21],[14,27],[-1,30],[-16,13],[-15,25],[-6,33],[12,23],[18,15],[-13,34],[-10,1],[-7,7],[6,16],[14,24],[21,71],[28,33],[50,22],[14,9],[12,25],[14,16],[16,-2],[16,-9],[9,-11],[8,11],[6,31],[-4,27],[2,75],[9,42],[15,3],[13,-24],[-1,-20],[5,-49],[1,-32]],[[52081,77054],[-15,-10]],[[52049,77034],[-32,-21],[-23,-21],[-88,-127],[-41,-38],[-8,-22],[-8,-42],[-24,-36],[-22,-17],[-52,-18],[-53,-38],[-23,16],[-62,-1],[-38,46],[-74,29],[-24,67],[-33,4],[-22,-2],[-13,10],[-4,23],[0,22],[-23,-10],[-18,0],[-11,-9],[-8,-10],[-10,7],[-6,-3],[1,-13],[-22,-3],[-23,8],[-61,35],[-9,5],[-42,13],[-17,14],[-14,35],[-11,10],[-6,7],[-39,-17],[-14,-27],[-21,-32],[-146,-155],[-27,-64],[-31,-96],[-2,-44],[13,-142],[30,-75],[4,-18]],[[50473,76326],[3,13],[7,18],[0,11],[-9,16],[-39,18],[-18,4],[-12,-12],[-9,-15]],[[49501,76847],[45,17],[41,73],[39,263],[28,311],[20,58],[26,17],[-21,42],[-13,-21],[-5,-23],[-7,-12],[15,285],[11,105],[19,109],[39,-43],[32,-44],[17,-39],[21,-127],[15,-27],[24,-26],[-9,29],[-17,22],[-25,170],[-16,48],[-25,40],[-80,85],[-8,17],[-4,32],[27,-1],[23,-16],[-3,18],[-7,19],[-10,69],[-9,161],[1,28],[-4,34],[-26,7],[-20,2],[-22,13],[-110,95],[-37,98],[-39,72],[-9,32],[1,32],[20,67],[-18,43],[-17,8],[-15,21],[14,35],[11,23],[22,6],[30,-8],[28,-20],[21,-5],[-64,54],[-105,-18],[-23,7],[-19,12],[-7,40],[15,18],[13,34],[-15,23],[-20,9],[-31,-1],[-29,-7],[-7,14],[17,37],[-15,14],[-20,-7],[-29,-7],[-28,11],[-26,42],[-17,0],[-12,-5],[-18,16],[-19,4],[-13,-5],[-18,24],[-109,49],[-47,6],[-43,-22],[-24,7],[-18,32],[-14,52],[-70,41],[14,27],[32,6],[37,19],[14,23],[-29,28],[-22,7],[-9,10],[-9,24],[13,12],[9,-6],[26,-4],[45,6],[-16,25],[-18,6],[-8,6],[-36,3],[-17,-9],[-37,4],[-9,27],[-3,23],[11,51],[53,46],[131,51],[56,-7],[40,9],[47,31],[20,28],[67,16],[63,-29],[59,-109],[28,-37],[68,64],[102,-2],[21,-36],[8,30],[19,36],[15,-16],[8,-22],[107,6],[17,6],[-29,26],[-23,62],[-5,229],[-30,64],[-34,102],[-16,60],[-1,21],[5,30],[42,-1],[32,-8],[62,23],[30,-16],[-2,-47],[9,-60],[11,-28],[15,-33],[50,3],[54,-19],[68,-3],[99,-34],[42,20],[41,41],[78,27],[7,14],[-45,-6],[-42,26],[-5,29],[5,25],[16,58],[120,92],[85,28],[89,50],[45,52],[30,68],[10,14],[12,13],[-12,24],[8,256],[9,46],[17,38],[27,29],[40,32],[148,44],[22,17]],[[50701,81276],[3,-27],[11,-35],[7,-19],[-6,-25],[5,-21],[20,-37],[25,-35],[22,-23],[7,3],[16,6],[28,23],[24,7],[13,-17],[7,-10],[15,-40],[4,-41],[7,-34],[12,-14],[44,-5],[33,-13],[9,-11],[11,-76],[6,-11],[9,9],[8,12],[11,2],[19,-5],[26,-1],[26,-8],[36,-44],[-1,-14],[-7,-25],[-3,-20],[6,-8],[10,-20],[-2,-24],[-10,-17],[-3,-14],[0,-9],[3,-7],[8,-6],[53,-9],[49,9],[31,24],[5,25],[9,29],[18,25],[13,8],[12,-10],[-20,-102],[14,-26],[2,-39],[6,-34],[17,1],[21,-6],[15,-13],[18,-20],[25,-19],[18,-6],[6,-16],[15,-18],[22,-37],[20,-25],[10,0],[19,10],[28,6],[22,-1]],[[49672,78285],[-10,-50],[-18,46],[-25,41],[-5,37],[0,10],[29,-27],[29,-57]],[[62549,44368],[-17,-5],[-8,15],[-5,36],[5,35],[1,28],[-14,49],[14,28],[12,-32],[6,-2],[18,-23],[-5,-42],[1,-13],[-8,-42],[0,-32]],[[65499,39550],[-40,-17],[-27,6],[-54,49],[-15,33],[-21,91],[5,32],[17,57],[38,23],[41,-9],[18,-15],[21,-66],[28,-68],[-4,-80],[-7,-36]],[[33103,60192],[-2,-33],[-7,-6],[-11,27],[-45,-4],[-7,25],[-1,11],[22,42],[-26,11],[-10,18],[-22,87],[2,26],[9,13],[15,2],[28,-28],[20,-40],[7,-1],[3,-11],[-4,-29],[12,-24],[5,-17],[12,-69]],[[32964,61192],[-32,-6],[-22,5],[-5,41],[11,35],[-8,42],[5,25],[11,17],[18,-22],[3,-32],[11,-29],[51,-61],[-43,-15]],[[32891,61063],[-22,-26],[-11,8],[-14,50],[-9,138],[7,22],[5,9],[30,-17],[12,-19],[13,-13],[-7,-25],[4,-103],[-8,-24]],[[32991,60996],[-15,-2],[-7,5],[-2,34],[12,24],[7,6],[10,-27],[3,-22],[-8,-18]],[[34956,54930],[20,30],[27,152],[19,54],[20,7],[109,-126],[51,-11],[103,-68],[38,-88],[86,-145],[45,-45],[1,-39],[-10,-60],[29,53],[45,-84],[13,-41],[14,-76],[-5,-49],[-6,-25],[-1,-19],[14,27],[7,21],[3,51],[10,63],[15,1],[12,-38],[24,-163],[9,-33],[4,-52],[-2,-23],[2,-22]],[[35652,54182],[-9,-12],[-23,-27],[-11,-37],[-6,-34],[-14,-24],[-14,-30],[-4,-24],[-13,-19],[-3,-32],[-32,-112],[-13,-50],[-19,-54],[-11,-20],[-16,-32],[-8,-36],[0,-39],[-11,-45],[-6,-40],[-10,-23],[-28,-124],[-1,-43],[-7,-26],[-19,-59],[-13,-36],[-23,-27],[-25,-29],[-9,-31],[-17,-17],[-12,-1],[-20,12],[-28,5],[-13,-3],[-7,16],[-9,36],[-13,25],[-9,-9],[-19,-25],[-21,-15],[-15,5],[-33,17],[-15,9],[-4,16],[-5,11],[-7,-5],[-10,-19],[-13,-20],[-19,-26],[-40,-48],[-11,-17],[-11,10],[-17,9],[-18,1],[-39,30],[-22,22],[-10,28],[-12,11],[-7,8]],[[34402,78779],[-6,-5],[-19,8],[9,18],[7,5],[9,2],[4,-5],[-1,-13],[-3,-10]],[[34370,78823],[-24,-25],[-9,14],[2,17],[13,39],[-1,11],[-14,76],[2,13],[4,5],[21,-16],[3,-21],[-10,-46],[7,-31],[9,-23],[-3,-13]],[[1066,44162],[-4,-4],[-5,22],[7,34],[6,12],[6,-26],[-10,-38]],[[543,43595],[-16,-4],[-16,7],[-9,33],[4,14],[10,-7],[10,-24],[17,-11],[0,-8]],[[32497,62251],[-32,0]],[[32465,62251],[3,13],[14,14],[11,-2],[4,-5],[0,-20]],[[32546,62140],[-4,-1],[-3,5],[-3,9],[-2,8],[1,6],[2,-3],[18,-5],[-2,-7],[-3,-7],[-4,-5]],[[7926,42247],[-5,-4],[-6,10],[-2,16],[2,26],[13,-17],[6,-11],[-8,-20]],[[8385,41736],[-9,-15],[-11,11],[-5,14],[-2,15],[2,19],[26,-3],[8,-8],[-9,-33]],[[7942,42120],[-11,0],[-10,9],[2,59],[3,12],[15,-20],[13,-52],[-12,-8]],[[8522,41653],[40,-27],[7,-44],[-8,-29],[-21,7],[-10,16],[-14,52],[-39,-12],[-27,11],[-15,67],[0,31],[6,19],[29,20],[36,-15],[13,-38],[3,-58]],[[11382,46258],[42,-30],[13,3],[-13,-29],[-42,-16],[-14,-15],[-16,10],[-9,34],[39,43]],[[11372,46122],[-20,-45],[-1,48],[8,6],[7,0],[6,-9]],[[11486,45785],[-10,-9],[-1,61],[13,-12],[5,-9],[-2,-17],[-5,-14]],[[11091,46710],[-27,-14],[-13,3],[-10,47],[3,29],[5,9],[46,-11],[4,-22],[-1,-20],[-7,-21]],[[11090,46413],[-6,-11],[-11,35],[-2,14],[20,18],[11,-9],[-12,-47]],[[10886,41557],[2,-11],[-11,1],[-3,4],[1,20],[7,25],[6,21],[11,20],[21,19],[11,8],[3,-5],[-4,-2],[-35,-41],[-10,-29],[-5,-20],[1,-6],[5,-4]],[[11234,46693],[-18,-5],[-3,29],[6,15],[8,7],[13,-9],[8,-12],[-1,-11],[-13,-14]],[[10921,41255],[3,-21],[-6,10],[-22,20],[-2,17],[27,-26]],[[10880,41365],[2,-16],[-10,11],[-10,29],[-17,36],[-4,15],[13,-14],[9,-21],[17,-40]],[[12140,41160],[-5,-12],[-1,12],[-7,6],[-11,12],[-15,14],[-8,3],[-4,8],[6,4],[9,-6],[12,-13],[15,-13],[9,-15]],[[11952,41277],[0,-11],[-26,55],[10,-4],[16,-40]],[[11526,39828],[-8,-11],[3,15],[-6,32],[-6,5],[6,9],[9,-25],[2,-25]],[[10413,42571],[-5,-7],[7,46],[7,6],[-9,-45]],[[10155,42269],[15,-28],[-20,19],[-25,8],[9,5],[15,0],[6,-4]],[[10119,42260],[-11,-3],[-27,34],[11,0],[15,-21],[12,-10]],[[9708,42709],[-2,-26],[-5,25],[-17,40],[-7,18],[8,-3],[23,-54]],[[9587,42436],[1,-10],[-6,1],[-10,29],[-4,25],[-6,29],[-9,21],[-1,19],[0,30],[10,-46],[9,-37],[8,-31],[8,-30]],[[95611,40180],[31,-36],[34,15],[42,-57],[108,-172],[37,-37],[23,-14],[16,-28],[16,-40],[20,-28],[9,-26],[2,-36],[8,-22],[37,-57],[22,-50],[32,-26],[13,-30],[17,-14],[18,-31],[30,-24],[68,-88],[53,-84],[26,-52],[29,-46],[36,-37],[34,-42],[17,-99],[-9,-35],[-20,-18],[-18,-1],[-17,-12],[-56,64],[-14,9],[-15,-4],[-8,14],[-6,21],[-35,24],[-32,37],[-9,26],[-5,32],[-8,19],[-45,28],[-31,31],[-22,44],[-34,31],[-54,63],[-27,20],[-24,31],[-65,115],[-23,21],[-20,51],[-55,120],[-27,50],[-29,44],[-22,52],[-17,61],[-40,88],[-5,38],[2,38],[-10,25],[-16,15],[-8,26],[1,35],[5,18],[40,-60]],[[96539,38811],[-9,-22],[-11,5],[-8,8],[-6,12],[6,44],[24,-22],[4,-25]],[[94430,40718],[-4,-12],[-2,92],[8,34],[5,-71],[-7,-43]],[[96669,39498],[13,-10],[22,1],[-5,-98],[-32,-16],[-11,1],[-7,21],[-18,14],[1,33],[-18,76],[31,11],[17,20],[0,-18],[2,-22],[5,-13]],[[96262,39919],[-15,-5],[18,52],[1,33],[7,63],[-1,22],[12,-3],[12,-18],[-14,-16],[-5,-28],[0,-34],[6,-7],[-9,-37],[-12,-22]],[[96499,39653],[-15,-4],[-20,41],[-39,21],[-17,36],[-11,43],[22,11],[22,58],[-15,22],[-26,3],[3,23],[42,27],[18,-16],[8,-18],[-2,-92],[19,-29],[20,-65],[-1,-18],[-8,-43]],[[69217,23554],[23,-4],[13,6],[62,76],[16,2],[-2,-59],[16,-26],[-20,-6],[-38,2],[-9,-33],[39,-42],[19,-6],[15,0],[29,10],[23,15],[36,36],[22,14],[41,0],[21,34],[10,10],[24,-1],[21,-13],[13,-31],[7,-37],[-5,-37],[-15,-36],[-26,-22],[6,-26],[-7,-13],[-13,-1],[-12,6],[-16,31],[-20,16],[-48,-1],[-22,-2],[-3,-23],[-12,-18],[-12,-10],[-16,4],[-3,-10],[9,-24],[21,-31],[36,-22],[21,-5],[3,42],[26,4],[23,-12],[16,-30],[-13,-10],[-12,-16],[-3,-21],[-23,-23],[-13,-2],[-44,11],[-26,25],[-6,18],[-16,7],[-18,-23],[-19,-5],[-37,19],[-35,31],[-22,12],[-33,8],[-19,-71],[-26,-30],[-33,-3],[-16,6],[-9,28],[2,29],[5,29],[11,29],[6,32],[-2,30],[-12,22],[6,40],[-12,30],[4,23],[20,16],[-9,13],[-10,4],[-7,18],[-6,22],[7,41],[12,39],[-2,45],[19,42],[17,47],[12,19],[15,3],[7,-13],[3,-26],[-6,-17],[14,-7],[4,-55],[-9,-22],[-1,-22],[-19,-46],[5,-37],[37,-16]],[[69244,23583],[-17,-5],[-5,19],[1,25],[-10,20],[-5,22],[4,20],[28,3],[28,-7],[8,-35],[-21,-48],[-11,-14]],[[64398,25092],[-20,-5],[-18,11],[-11,32],[23,27],[12,-19],[9,-20],[5,-26]],[[55552,86607],[9,0],[3,5],[15,-4],[23,-22],[4,-12],[16,-6],[5,-13],[-18,-39],[-11,0],[-8,4],[-15,-4],[-8,-7],[-3,-16],[0,-34],[-65,-7],[-15,10],[-20,77],[4,20],[14,8],[12,2],[1,-41],[18,4],[5,27],[1,20],[-4,9],[-12,8],[-7,13],[10,21],[18,9],[16,-28],[12,-4]],[[55461,86513],[2,-13],[-11,3],[-8,-4],[-6,-16],[-12,5],[-5,23],[9,34],[22,2],[9,-34]],[[55725,86428],[-2,-13],[-23,-3],[-10,12],[-21,-2],[-3,6],[8,12],[17,8],[22,-3],[12,-17]],[[57721,86714],[-10,-2],[-26,-20],[-40,-5],[-17,-14],[-61,42],[-11,3],[-36,-11],[-34,-31],[-64,-9],[-32,-10],[-20,-14],[-4,33],[9,43],[14,29],[1,18],[-10,-1],[-21,-42],[-11,-49],[-21,-25],[-48,-10],[-47,39],[-23,0],[14,-28],[10,-31],[-1,-17],[-25,3],[-28,-19],[-25,-27],[-11,0],[-17,38],[-30,-18],[-26,-24],[-52,-7],[-31,-31],[-55,-22],[-30,1],[-69,-25],[-23,-40],[-20,-14],[-29,12],[-88,-19],[-84,-25],[-36,1],[-36,11],[-38,-35],[-40,-47],[-45,-16],[-16,6],[13,24],[29,25],[21,35],[2,28],[-13,12],[-19,3],[-24,30],[-23,64],[-13,3],[-6,-17],[-7,-49],[-7,-14],[-12,-11],[-15,-12],[-14,-5],[-51,1],[-7,24],[0,11],[9,32],[-7,6],[7,26],[12,-2],[14,4],[7,13],[0,16],[-20,4],[-1,11],[18,45],[2,12],[-7,3],[-11,-5],[-73,14],[-90,57],[-22,3],[-14,51],[-21,-6],[-32,-30],[-24,22],[-25,15],[-7,24],[0,34],[-2,41],[-7,47],[-5,68],[5,53],[20,39],[8,25],[9,64],[3,74],[-6,26],[2,17],[16,0],[-4,14],[-7,8],[-8,17],[7,9],[19,0],[2,6],[2,8],[-15,43],[-2,21],[-21,62],[-23,60],[-36,43],[13,71],[14,64],[-3,31],[-5,37],[-44,41],[-7,58],[-10,63],[4,38],[7,29],[14,29],[73,92],[4,48],[50,4],[-23,42],[-6,24],[-1,29],[71,19],[27,-16],[62,20],[55,38],[-1,20],[-8,18],[-12,35],[8,10],[21,-7],[-10,17],[2,18],[22,-7],[36,51],[1,39],[63,21],[71,79],[33,25],[32,18],[69,80],[29,3],[15,54],[58,72],[17,9],[27,64],[71,75],[45,95],[25,33],[8,36],[28,3],[25,27],[54,18],[53,-5],[22,-12],[21,4],[-2,32],[-15,20],[12,19],[28,14],[-2,32],[-7,20],[-23,25],[12,58],[2,63],[11,73],[-29,39],[-112,65],[-21,-2],[-24,8],[-26,50],[11,43],[2,16],[-11,-1],[-16,-21],[-36,-23],[-46,18],[-23,-4]],[[56109,86599],[-20,-3],[-29,29],[-3,11],[11,6],[-8,23],[3,10],[22,-18],[12,-21],[-12,-5],[20,-22],[4,-10]],[[55893,88272],[3,-11],[17,3],[21,20],[16,-9],[-2,-28],[-10,1],[-3,4],[-14,-16],[-2,-9],[-16,-7],[-29,28],[-18,45],[42,0],[-4,-11],[-1,-10]],[[56159,86618],[35,-13],[15,5],[17,-30],[-29,-20],[-2,-24],[12,-14],[4,-22],[-29,0],[-13,18],[-6,23],[-13,16],[-18,13],[9,16],[5,24],[13,8]],[[55958,86710],[-4,-27],[-19,3],[-19,-5],[-15,27],[-9,45],[3,9],[12,10],[9,-24],[42,-38]],[[56064,86486],[-28,-20],[-10,5],[3,33],[16,15],[28,2],[-9,-35]],[[56007,86467],[-24,-6],[-15,17],[6,12],[17,14],[18,-2],[4,-16],[-6,-19]],[[56902,89280],[-42,-19],[-33,12],[-1,37],[21,18],[37,7],[52,-18],[7,-10],[-29,-7],[-12,-20]],[[99999,42529],[-42,-77],[-15,-39],[-13,-44],[-36,-47],[-15,-63],[1,-63],[36,66],[40,54],[12,11],[13,0],[-1,-19],[-6,-18],[-5,-48],[11,-45],[-30,5],[-29,-4],[-35,-25],[-34,-11],[-13,-1],[-13,9],[-8,13],[-6,29],[-6,5],[-28,-1],[-40,-59],[-14,-49],[-16,-3],[-18,11],[-23,-38],[-26,-14],[-12,32],[-7,40],[-10,29],[-29,7],[4,36],[8,15],[7,21],[5,24],[14,-16],[14,-9],[16,18],[17,1],[17,53],[26,33],[37,26],[37,19],[19,3],[18,11],[32,50],[21,25],[24,15],[22,9],[20,-8],[17,5],[42,35],[0,-9]],[[99521,41836],[0,-26],[8,-11],[8,-2],[21,-48],[31,-42],[19,-32],[1,-28],[-6,-29],[8,-51],[4,-54],[14,-86],[-20,-16],[-30,-2],[-7,-15],[-11,8],[-25,-6],[-25,-28],[-23,-38],[-27,0],[-30,-8],[-30,5],[-21,21],[-38,22],[-49,19],[-21,15],[-17,25],[-16,63],[-3,31],[3,30],[15,10],[12,15],[1,19],[6,14],[7,5],[3,9],[-5,32],[-1,29],[29,53],[31,45],[56,42],[34,-4],[52,33],[17,15],[16,-10],[9,-24]],[[0,42174],[30,49],[9,7],[10,-45],[-12,-49],[-30,-43],[-7,-22],[0,103]],[[99999,42071],[-21,-21],[-8,21],[10,50],[19,52],[0,-42],[0,-60]],[[99579,40913],[0,-25],[-36,-16],[-12,20],[-8,4],[-21,-36],[-6,-15],[-2,-11],[-6,-6],[-39,-17],[-17,17],[12,12],[14,23],[14,-3],[15,22],[14,33],[21,8],[14,13],[24,-10],[19,-13]],[[281,41487],[-8,-8],[-6,2],[-7,9],[-4,16],[9,14],[13,-16],[3,-17]],[[344,41339],[-3,-10],[-15,17],[-6,12],[16,9],[8,-3],[0,-25]],[[486,41501],[-16,-6],[-14,25],[9,26],[13,-7],[7,-25],[1,-13]],[[290,41893],[-7,-20],[-6,7],[8,33],[1,15],[-12,17],[-1,12],[3,8],[15,-20],[9,-15],[1,-8],[-2,-15],[-9,-14]],[[407,40802],[-3,-5],[-8,6],[-6,8],[-1,8],[3,10],[6,6],[3,-2],[-2,-3],[-3,-4],[0,-11],[5,-6],[4,-1],[2,-6]],[[56,40932],[0,-17],[-4,1],[-5,8],[-2,-4],[-2,-5],[-1,-12],[-1,-7],[-4,3],[0,11],[1,9],[2,12],[7,11],[9,-10]],[[99231,41965],[-15,-9],[8,45],[8,15],[5,3],[9,3],[-4,-32],[-11,-25]],[[99839,41839],[-10,-16],[-4,79],[9,0],[7,-8],[4,-20],[-6,-35]],[[99818,41415],[-2,-5],[-24,46],[0,19],[5,16],[9,15],[9,-26],[7,-44],[-4,-21]],[[99673,41630],[-14,-10],[-8,35],[11,35],[12,4],[6,-36],[-7,-28]],[[99999,42315],[-4,-1],[0,11],[-99995,19],[16,28],[12,5],[-8,-27],[0,-14],[-20,-21],[99999,0]],[[0,42538],[9,15],[6,0],[-3,-13],[-12,-11],[0,9]],[[99199,44639],[-10,-6],[-18,5],[-4,9],[6,2],[11,6],[14,-3],[3,-6],[-2,-7]],[[98507,39346],[-2,-7],[-8,2],[-2,13],[5,7],[7,-4],[0,-11]],[[358,39937],[0,-1],[-1,0],[-2,2],[-2,4],[0,4],[0,4],[1,0],[2,-4],[1,-4],[1,-5]],[[60145,60055],[5,1],[38,28],[37,5],[36,-20],[23,-5],[11,10],[10,26],[9,41],[15,23],[20,5],[26,-47],[43,-125],[11,-7],[7,3],[21,100],[17,78],[31,144],[18,83],[16,-24],[17,-42],[18,-20],[20,-12],[10,-2],[12,-17],[44,-103],[15,-24],[20,-2],[86,33],[51,60],[7,24],[14,0],[17,-27],[7,-25],[11,-34],[20,-5],[49,24],[23,14],[21,-12],[26,-9],[16,0],[38,-34],[47,11],[22,-2],[22,-15],[37,-53],[47,-65],[68,-47],[14,-19],[33,-74],[51,-142],[67,-136],[73,-107],[39,-75],[26,-91],[26,-83],[26,-35],[24,-29],[26,-63],[18,-52],[24,-60]],[[61771,59024],[-27,-82],[-37,-110],[-42,-127],[-13,-32],[-37,-77],[-7,-22],[-7,-56],[0,-101],[5,-130],[4,-119],[21,-14],[23,-9],[27,16],[31,13],[40,8],[43,24],[26,20],[27,-2],[24,-21],[12,-19],[17,-6],[21,1]],[[56756,85178],[2,23],[37,113],[7,89],[13,13],[4,12],[-6,29],[-38,18],[-15,-3],[-14,-30],[-14,-22],[-34,-14],[-29,23],[-67,32],[-18,41],[-4,42],[-35,40],[-15,48],[6,33],[32,22],[9,19],[-40,-3],[-9,5],[-2,17],[-18,58],[16,23],[7,22],[-13,19],[4,22],[10,22],[-6,50],[40,27],[40,19],[83,10],[-8,46],[34,2],[57,56],[56,-10],[82,38],[157,0],[22,22],[-4,22],[0,24],[30,-7],[49,4],[186,-46],[45,0],[63,-47],[34,-13],[101,0],[154,-21],[31,32],[3,9]],[[56282,85611],[20,-14],[18,4],[18,10],[40,-9],[92,-71],[8,-19],[-54,-8],[-13,-22],[-13,-15],[-15,-5],[-27,-30],[-35,-29],[-8,-17],[-64,3],[-35,-11],[-29,-33],[-11,-62],[-21,-49],[-21,-18],[-22,-3],[-6,19],[3,18],[46,69],[10,23],[-23,10],[-20,24],[-42,28],[-8,22],[10,2],[10,7],[11,19],[5,21],[-34,64],[18,10],[21,-2],[22,-19],[24,22],[11,3],[17,-8],[17,42],[40,14],[20,13],[20,-3]],[[56367,85729],[-23,-28],[-13,11],[-7,14],[-30,-65],[-33,-11],[-19,13],[2,24],[-19,63],[-29,19],[-40,1],[-30,26],[113,18],[12,30],[23,32],[17,3],[15,-7],[2,-25],[4,-10],[51,-13],[20,-41],[8,-50],[-24,-4]],[[56484,85570],[-23,-6],[-55,41],[13,27],[15,11],[47,-17],[6,-42],[-3,-14]],[[60724,62214],[84,-333],[34,-196],[30,-206],[23,-308],[21,-157],[34,-78],[23,-146],[21,-6],[14,-40],[25,-138],[18,-51],[9,44],[-1,25],[-7,43],[7,54],[14,33],[31,-44],[18,-34],[5,-68],[7,-37],[33,-80],[28,-23],[37,-6],[30,-17],[25,-29],[46,-81],[104,-71],[85,-216],[49,-151],[163,-227],[28,-110],[15,-106],[34,5],[59,-117],[17,-89],[48,-32],[9,52],[23,-43],[9,-67]],[[61976,59163],[-31,-26],[-34,-24],[-4,1],[-12,-31],[-16,-84],[-17,-25],[-10,-2],[-53,79],[-8,4],[-11,-15],[-9,-16]],[[61132,61107],[9,-56],[-27,21],[-5,12],[12,22],[3,13],[8,-12]],[[61150,60884],[11,-30],[8,3],[7,10],[4,21],[44,-42],[-3,-29],[-26,-1],[-30,12],[-28,-4],[-33,12],[-8,48],[21,-23],[11,6],[2,6],[-15,33],[-21,6],[1,26],[10,10],[6,12],[-13,36],[24,-9],[15,-21],[10,-25],[3,-57]],[[52426,54008],[7,-3],[41,2],[12,-30],[-1,-45],[-43,-131],[-8,-55],[-17,-46],[-14,-4],[-49,27],[-9,17],[-3,22],[5,52],[4,16],[23,10],[8,9],[13,56],[4,51],[10,39],[17,13]],[[52664,52437],[2,13],[-25,35],[-18,3],[-16,11],[13,90],[17,80],[25,61],[13,14],[4,30],[20,99],[25,80],[-8,81],[6,136]],[[52722,53170],[7,-4],[1,-13],[2,-19],[9,-16],[31,-27],[91,0],[54,0],[80,0],[85,0],[64,0]],[[25607,59561],[-7,-8],[5,-58],[-16,-35],[-14,-25],[-26,-7],[-44,-2],[-66,28],[-48,39],[-26,0],[8,-13],[21,-8],[27,-27],[-8,-8],[-99,57],[-114,112],[-68,18],[-78,30],[-46,71],[-35,30]],[[56986,70077],[21,-70],[43,-12],[142,62],[157,-62],[86,-24],[133,-54],[81,-95],[23,-12],[58,2],[38,-56],[152,-27],[81,-62],[46,-50],[28,-15],[24,2],[33,19],[42,35],[45,48],[94,125],[33,22],[22,-6],[27,2],[11,33],[14,23],[8,27],[15,31],[48,9],[98,54],[-11,-25],[-89,-61],[38,-8],[39,21],[45,13],[8,26],[6,49],[9,6],[30,-9],[92,-74],[23,-2],[65,41],[13,9],[21,-23],[48,-93],[-17,2],[-51,80],[-4,-40],[-29,-70],[36,-30],[30,-11],[16,-39],[10,-35],[29,15],[21,47],[-11,27],[-8,27],[10,1],[20,-23],[58,-89],[20,-19],[22,3],[48,26],[13,-4],[63,33],[8,-25],[10,-24],[51,27],[80,0],[66,29],[76,71],[6,11]],[[59695,68823],[-15,-26],[-32,-93],[-33,-296],[-47,-231],[-5,-144],[-8,-52],[-23,-73],[-27,-72],[-49,37],[-79,126],[-46,120],[-49,77],[-47,103],[-13,73],[1,48],[-21,115],[-15,55],[-57,123],[-16,65],[-13,29],[-12,41],[-21,160],[-23,101],[-25,-28],[4,-43],[-22,-59],[-14,-68],[11,-56],[46,-85],[10,-37],[11,-80],[-2,-110],[7,-37],[35,-81],[13,-48],[7,-42],[12,-38],[34,-71],[50,-134],[47,-91],[35,-44],[14,-44],[3,-113],[-2,-55],[30,-101],[11,-52],[29,-42],[13,-48],[12,-78],[18,-231],[26,-56],[77,-303],[66,-192],[32,-144],[48,-174],[95,-383],[56,-118],[22,-66],[41,-51],[44,-74],[-42,7],[-10,-5],[-15,-12],[-7,-45],[-3,-37],[5,-194],[11,-98],[37,-188],[28,-56],[14,-36],[18,-27],[88,-63],[52,-136],[115,-170],[11,-47],[0,-11]],[[27687,49891],[6,8],[40,29],[17,29],[20,26],[18,41],[11,39],[28,180],[26,114],[-5,54],[-21,74],[-5,109],[2,33],[-3,25],[-14,-45],[4,-160],[-13,-72],[-17,-18],[-12,13],[7,117],[-13,-22],[-21,-79],[-34,-59],[-1,-19],[-9,-25],[-26,23],[-20,24],[-65,132],[-43,28],[-25,46],[-6,19],[-3,27],[26,27],[28,37],[2,82],[0,65],[-20,109],[9,144],[-5,56],[-23,119],[17,60],[60,44],[20,29],[13,95],[14,56],[27,-22],[21,2],[-28,21],[-24,85],[-3,40],[44,116],[24,30],[28,62],[25,93],[6,147],[-10,105],[-8,111],[15,28],[36,15],[30,36],[15,33],[36,-5],[41,51],[66,26],[91,58],[20,52],[-9,92]],[[28094,52681],[9,-12],[25,-44],[16,-43],[26,-27],[21,-22],[55,-88],[37,-44],[40,-41],[57,-42],[36,7],[8,-32],[7,-34],[13,-19],[21,-17],[12,-5],[4,-9],[12,-122],[8,-17],[29,-20],[35,-7],[14,4],[31,-34],[23,-16],[25,-12],[17,-3],[8,5],[3,12],[14,-2],[21,-16],[30,-3],[19,15],[2,25],[2,43],[7,15],[21,25],[11,-5],[57,-54],[11,-19],[15,-38],[26,-55],[29,-36],[44,-15],[42,-58],[50,-40]],[[27741,50130],[-5,-22],[-27,2],[-7,7],[0,25],[6,81],[7,34],[22,32],[18,16],[23,-3],[25,-29],[-29,-55],[-16,-8],[-6,-7],[-11,-73]],[[28080,52564],[-15,-4],[-7,28],[19,32],[6,6],[-3,-62]],[[24907,51398],[-15,-1],[-43,56],[3,55],[17,37],[56,18],[23,-34],[-2,-66],[-19,-48],[-15,-9],[-5,-8]],[[25161,51318],[-33,-24],[-11,11],[-7,11],[-2,15],[19,35],[17,20],[16,41],[29,24],[9,-6],[5,-8],[2,-14],[-9,-33],[-18,-23],[-17,-49]],[[24604,51577],[-28,-10],[-24,20],[-10,31],[-2,46],[2,15],[52,16],[17,-38],[0,-57],[-7,-23]],[[24882,51071],[-11,-1],[-16,24],[12,45],[13,-11],[9,-12],[5,-18],[-12,-27]],[[24646,51857],[18,-37],[9,-106],[56,-112],[7,-62],[-5,-29],[2,-11],[27,-44],[18,-47],[-30,-108],[-62,-46],[-67,2],[-13,12],[-18,41],[-4,37],[11,35],[34,54],[53,48],[6,37],[-21,35],[-14,71],[-34,50],[-16,152],[-11,8],[-23,-21],[-11,18],[-2,10],[25,35],[5,24],[36,12],[15,-20],[9,-38]],[[24840,51650],[-13,-17],[-52,20],[-16,33],[13,46],[11,18],[31,-17],[32,-51],[-6,-32]],[[30061,63201],[12,10],[8,34],[11,31],[14,17],[17,10],[32,-1],[44,-27],[13,1],[43,24],[35,14],[34,-16],[13,-21],[28,-33],[14,-10],[43,1],[12,-3],[37,-55],[30,-22],[18,-1],[32,21],[16,-1],[18,-47],[4,-67],[15,-61],[24,-39],[115,16],[25,-32],[-8,-27],[-17,-14],[-54,6],[-24,-3],[-5,-26],[0,-25],[32,-6],[31,-12],[32,-20],[33,-13],[36,-9],[36,-14],[61,-49],[66,-109],[18,-25],[12,-34],[-6,-43],[-24,-69],[-13,-22],[-20,-14],[-13,-28],[-13,-49],[-8,-4],[-9,2],[-16,28],[-12,42],[-32,39],[-38,-5],[-56,24],[-34,-12],[-34,-2],[-35,12],[-35,4],[-35,-15],[-34,-25],[-12,-17],[-22,-39],[-12,-15],[-82,-20],[-24,29],[-22,40],[-32,5],[-46,-30],[-28,-11],[-12,-14],[-3,-14],[0,-56],[-7,-33],[-45,-127],[-25,-90],[-10,-28],[-12,-6],[-23,52],[-14,19],[-17,9],[-7,27],[0,39],[-5,38],[-10,29],[-16,20]],[[32977,60627],[-26,-13],[-11,100],[-18,72],[3,45],[3,17],[38,-28],[12,-33],[7,-89],[-8,-71]],[[61976,59163],[4,-27],[47,-114],[15,-56],[16,-102],[-9,-56],[-12,-37],[-18,-33],[-62,-81],[-69,-52],[-44,-103],[-33,7],[5,-39],[12,-5],[19,8],[38,30],[34,14],[37,1],[33,-13],[23,-38]],[[41679,99979],[267,-35],[141,-40],[30,1],[191,-15],[182,-19],[302,-51],[42,-16],[-32,-14],[-75,-9],[-386,-16],[-700,-21],[-401,-39],[-127,-2],[-11,-59],[54,-3],[89,8],[314,59],[117,9],[219,-5],[285,-22],[114,8],[205,-6],[239,17],[283,37],[77,-82],[104,-81],[83,9],[70,-5],[24,-26],[39,-12],[80,6],[245,-23],[168,-42],[63,-19],[30,-28],[18,-22],[-27,-28],[-105,-49],[-133,-45],[-179,-34],[-207,-22],[-1588,-73],[-54,-17],[-31,-44],[21,-57],[74,-9],[173,32],[300,31],[221,-2],[527,-26],[155,-68],[82,-105],[183,24],[39,18],[29,31],[22,33],[18,36],[19,24],[21,13],[45,11],[105,13],[274,13],[66,-4],[48,-49],[10,-28],[3,-38],[-1,-45],[-6,-55],[-24,-54],[-76,-94],[-61,-52],[-66,-37],[-126,-84],[-44,-23],[-138,-99],[-35,-45],[-2,-34],[24,-6],[40,31],[15,23],[26,23],[205,62],[44,17],[133,74],[86,28],[70,29],[37,20],[206,146],[107,43],[112,0],[20,-73],[135,-12],[59,3],[94,-18],[41,-14],[70,-8],[73,-17],[63,18],[19,12],[62,54],[83,47],[77,59],[26,15],[41,13],[42,5],[115,28],[29,2],[62,-9],[273,-5],[150,-14],[208,-40],[145,-21],[67,-20],[97,-41],[79,-43],[37,-13],[-2,-13],[-27,-19],[-195,-66],[-64,-45],[-185,-83],[-90,-29],[-98,-11],[-109,-2],[-71,-12],[-10,-12],[50,-34],[22,-25],[-3,-22],[-53,-32],[-20,-8],[-192,-24],[-97,-41],[-126,-5],[-89,5],[-123,-44],[48,-36],[44,-16],[137,-32],[1,-19],[-66,-38],[-89,-44],[-105,-31],[-40,-5],[-50,8],[-46,-2],[-101,-14],[-97,-2],[-173,20],[-93,23],[-49,8],[-62,-2],[-24,-9],[-98,-56],[-48,-38],[-31,-39],[-13,-42],[5,-46],[12,-32],[19,-17],[23,-10],[41,-6],[89,6],[35,-3],[11,-10],[19,-29],[-3,-28],[-17,-39],[-12,-45],[-9,-52],[5,-29],[36,-6],[17,2],[19,-9],[23,-21],[17,-22],[11,-23],[-6,-19],[-23,-15],[-52,-17],[-128,-33],[-13,-10],[-10,-21],[-7,-30],[-16,-28],[-23,-25],[-22,-15],[-42,-6],[-54,-1],[-61,-14],[-144,-84],[-2,-9],[54,-27],[-2,-24],[-67,-101],[-18,-50],[-14,-68],[-24,-58],[-33,-47],[-33,-55],[-31,-61],[5,-47],[41,-33],[56,26],[69,86],[74,38],[81,-12],[70,-17],[90,-34],[76,-21],[65,-28],[26,-23],[27,-33],[1,-20],[-48,-12],[-16,4],[-119,54],[-58,14],[-77,-16],[-67,-25],[60,-99],[65,-45],[117,-21],[62,-22],[44,-28],[35,-14],[47,6],[64,28],[88,1],[40,-13],[28,-26],[13,-47],[-3,-70],[-9,-52],[-16,-35],[-32,-47],[-27,-9],[-37,3],[-35,9],[-32,17],[-49,13],[-98,14],[-98,31],[-56,8],[-117,-4],[-127,-20],[-5,-25],[-182,-89],[-37,1],[-50,30],[-71,30],[-41,0],[-62,-38],[-15,-14],[1,-14],[45,-32],[18,-7],[24,-6],[80,-8],[36,-8],[33,-100],[52,-61],[23,-13],[19,-5],[65,3],[83,20],[28,-16],[61,-20],[36,-6],[43,1],[49,-7],[67,-57],[-26,-72],[42,-57],[67,-59],[15,-21],[7,-39],[1,-26],[5,-24],[9,-21],[9,-42],[9,-62],[-2,-51],[-15,-39],[-27,-29],[-42,-18],[-34,5],[-26,27],[-37,29],[-48,31],[-80,3],[-117,-90],[-52,-5],[-42,-9],[-46,-39],[-66,-24],[-59,9],[-103,46],[37,-30],[54,-36],[33,-19],[25,-4],[27,4],[39,15],[88,41],[23,6],[20,-3],[16,-12],[19,-35],[21,-58],[-3,-49],[-26,-41],[-23,-26],[-18,-12],[0,-9],[49,-10],[69,53],[22,66],[32,76],[56,25],[64,-25],[52,-71],[72,-131],[31,-14],[39,-31],[17,-39],[-4,-45],[-9,-33],[-12,-21],[-15,-13],[-27,-8],[-50,-7],[-111,14],[-58,0],[7,-45],[-117,-39],[-133,-15],[-125,30],[-104,47],[34,65],[20,72],[-51,48],[-11,1],[18,-74],[-15,-28],[-57,-35],[-40,-15],[-3,-10],[19,-8],[13,-15],[6,-23],[-7,-23],[-19,-24],[-11,-19],[-2,-16],[18,-20],[38,-22],[41,-11],[191,-5],[77,-13],[182,-53],[8,-17],[-31,-96],[-17,-92],[-35,-17],[-191,-4],[-62,-14],[-90,-42],[-87,-51],[-45,-1],[-178,45],[-68,29],[-147,84],[-110,128],[-51,-53],[-30,-26],[-32,-13],[-31,-2],[-30,9],[-34,20],[-56,47],[-68,46],[-47,22],[-1,-6],[27,-27],[41,-32],[103,-92],[37,-23],[-4,-16],[-65,-15],[-79,-31],[-39,-24],[-60,-56],[-20,-9],[-90,-14],[-29,3],[-67,32],[-99,20],[-59,18],[-82,33],[29,-36],[157,-55],[17,-17],[-32,-33],[-20,-12],[-37,-3],[-56,7],[-56,-1],[-58,-10],[-24,-12],[8,-15],[13,-14],[20,-12],[18,0],[44,38],[33,2],[88,-9],[89,29],[64,13],[48,3],[175,44],[37,50],[58,20],[131,15],[126,-8],[65,-6],[53,-47],[70,-34],[59,-37],[69,-13],[40,-50],[111,-57],[71,-12],[44,-27],[4,-114],[5,-49],[-19,-136],[-57,-31],[11,-72],[-15,-58],[-57,22],[-58,38],[-139,59],[-130,38],[-50,35],[-59,26],[-81,109],[-52,135],[-23,67],[-44,4],[-57,-18],[-49,-19],[-24,-32],[-168,-45],[-61,-30],[-35,0],[-125,-45],[50,-22],[23,-3],[51,12],[31,16],[114,44],[92,7],[33,19],[70,26],[48,8],[7,-7],[5,-12],[33,-165],[-14,-44],[-38,-19],[-80,-31],[-21,-15],[23,-27],[76,25],[50,27],[26,-10],[43,-41],[49,-21],[123,-64],[59,-35],[82,-34],[93,-47],[24,-17],[85,-24],[18,-8],[36,-83],[29,-10],[85,-5],[-15,-32],[-83,-72],[-43,-22],[-10,-15],[4,-25],[2,-42],[17,-78],[20,72],[13,34],[19,10],[17,2],[58,32],[58,-17],[15,-81],[8,-76],[-5,-66],[6,-101],[-2,-35],[14,-29],[14,-124],[14,-37],[-29,-33],[-88,-14],[-35,16],[-87,-6],[0,30],[-5,33],[0,24],[-6,21],[-4,122],[-25,-31],[-1,-24],[-7,-25],[-15,-132],[-22,-32],[-70,8],[-69,-5],[-38,5],[-129,60],[-50,54],[-44,82],[-28,76],[-10,71],[-31,57],[-51,45],[-61,36],[-70,28],[-62,35],[-53,44],[-58,33],[-64,25],[-90,10],[-133,-4],[-89,27],[-22,-2],[-21,-14],[16,-40],[103,-18],[79,-5],[105,3],[64,-10],[24,-23],[16,-42],[9,-59],[-21,-47],[-76,-52],[-39,-25],[-117,-47],[-39,-10],[-97,-4],[-75,5],[-98,23],[-55,5],[-115,3],[-27,-8],[30,-25],[49,-14],[34,-17],[4,-32],[-13,-48],[-13,-33],[-21,-25],[-75,-47],[-31,-15],[-141,-50],[-10,-10],[33,2],[89,17],[26,0],[146,-43],[116,2],[236,40],[19,-1],[16,-6],[15,-15],[16,-23],[-19,-23],[-54,-22],[-84,-22],[-36,-15],[-35,-22],[-64,-53],[-19,-56],[68,-21],[30,27],[36,59],[33,35],[76,24],[94,-12],[72,14],[148,58],[26,4],[217,-34],[197,-65],[103,-25],[138,-14],[246,7],[22,-11],[-8,-23],[-14,-20],[-41,-27],[-50,-18],[-31,-5],[-27,-13],[-59,-13],[-15,-10],[21,-45],[-10,-7],[-52,-1],[-88,-29],[-72,2],[-15,-5],[14,-10],[14,-21],[16,-32],[-9,-22],[-32,-13],[-24,-4],[-85,18],[-14,-3],[13,-13],[7,-20],[2,-28],[-21,-23],[-43,-18],[-81,-51],[-35,-15],[-74,-12],[-15,-7],[30,-39],[-4,-16],[-49,-42],[-76,-27],[-10,-14],[-7,-38],[-6,-15],[-20,-22],[-71,-42],[-51,-21],[-25,-17],[-31,-28],[-40,-16],[-47,-1],[-45,-11],[-74,-30],[-51,-10],[-163,-53],[-76,-8],[-66,-19],[-137,-50],[-64,-16],[-45,-19],[-49,-5],[-80,12],[-43,1],[-27,-8],[-24,-15],[-40,-42],[-34,-4],[-112,34],[3,-15],[29,-36],[-1,-26],[-67,-26],[-36,-7],[-52,11],[-70,28],[-90,59],[-109,89],[-53,30],[4,-29],[12,-28],[20,-27],[5,-20],[-13,-12],[-16,-6],[-20,0],[-3,-7],[33,-43],[25,-44],[-2,-41],[-31,-39],[-26,-23],[-22,-7],[-130,-98],[-37,-13],[-16,-12],[-14,-18],[-38,-81],[-15,-25],[-30,-32],[-13,-6],[-4,-13],[6,-21],[-9,-34],[-22,-49],[-76,-133],[-61,-125],[-27,-41],[-20,-17],[-12,6],[-30,-3],[-15,-22],[-13,-40],[-15,-30],[-16,-21],[-122,-89],[-32,-17],[-28,11],[-34,-4],[-70,47],[-12,17],[-45,39],[2,-20],[8,-11],[6,-17],[16,-20],[34,-105],[-27,-22],[-25,-25],[-63,-42],[-68,-70],[-25,-19],[-5,57],[3,17],[-39,27],[1,-19],[-4,-19],[-27,-74],[-8,-13],[-14,3],[-30,-14],[-30,7],[-26,33],[-11,18],[-47,-48],[-23,1],[-4,-40],[-22,-37],[-30,-16],[-41,1],[-25,-21],[-55,23],[-13,44],[44,60],[12,25],[-8,30],[11,39],[84,125],[57,63],[-3,12],[-77,13],[-68,22],[-66,8],[-29,-8],[46,-36],[66,-35],[-33,-34],[-27,-36],[-29,-97],[-19,-40],[-72,46],[-33,16],[21,-51],[63,-48],[4,-16],[0,-57],[-121,-50],[-125,-8],[-91,-14],[-152,-18],[-59,0],[-5,-19],[149,-89],[22,-16],[-21,-30],[-31,-19],[-48,-65],[-25,-23],[-63,-31],[-115,35],[-59,-16],[-57,11],[-1,-38],[17,-27],[17,-69],[38,6],[48,21],[38,-52],[24,-87],[43,-45],[19,-34],[8,-33],[-27,-32],[-55,-46],[-62,-8],[4,-36],[-27,-26],[-56,7],[-26,18],[-28,9],[-112,10],[113,-70],[40,-32],[18,19],[39,5],[58,-18],[-10,-118],[26,-95],[3,-21],[-62,-57],[-1,-54],[-36,-15],[-40,4],[-2,-59],[-27,-36],[5,-23],[8,-20],[-25,-38],[-22,-45],[-31,-39],[-17,4],[-50,-3],[-60,3],[-49,52],[-20,17],[-23,11],[9,-33],[14,-20],[45,-37],[82,-46],[-2,-33],[-22,-14],[-52,-89],[-18,-1],[-23,-23],[-72,7],[-30,9],[-88,-5],[-30,7],[-26,-3],[24,-25],[51,-23],[57,-23],[87,-17],[-3,-32],[-22,-27],[13,-39],[-10,-29],[-4,-34],[-20,-78],[23,-54],[26,-26],[-3,-35],[12,-55],[-38,-50],[-33,2],[-45,-11],[-16,-22],[73,-20],[-7,-38],[-19,-46],[-21,-100],[-42,-172],[-20,-171],[-91,-141],[-32,-3],[-8,-6],[-45,7],[-69,33],[-54,10],[-36,1],[-5,-16],[30,-27],[46,-10],[37,-18],[66,-16],[23,-31],[16,-33],[-3,-19],[0,-21],[12,-117],[-31,-40],[-24,-37],[-82,5],[-15,13],[-79,38],[5,-18],[57,-52],[20,-26],[-13,-5],[-23,-2],[-33,-18],[-58,10],[3,26],[11,27],[-27,-4],[-29,-14],[-18,5],[-14,-1],[-8,13],[-12,53],[14,27],[48,69],[15,37],[-13,16],[-34,-39],[-36,-63],[-16,-38],[-22,-8],[-55,20],[-158,88],[5,53],[-2,45],[46,5],[34,20],[30,23],[33,43],[31,71],[-4,6],[-90,-91],[-56,-30],[-27,-6],[-14,14],[-44,29],[-29,13],[-67,22],[-12,11],[-19,9],[-27,93],[35,113],[23,32],[15,38],[9,50],[-6,22],[-20,-8],[-9,-17],[1,-27],[-11,-18],[-80,-43],[-79,-35],[-38,-33],[-24,-26],[-19,-25],[-29,2],[-41,-5],[-27,-16],[-41,10],[-26,24],[-32,3],[-35,-12],[-25,1],[2,-16],[16,-41],[-27,-3],[-52,-1],[-26,11],[-20,16],[-17,22],[10,28],[83,52],[38,30],[-24,10],[-80,-9],[-14,7],[-53,-4],[2,77],[-13,19],[-1,9],[-18,21],[-18,6],[-11,7],[-90,18],[-12,43],[-6,44],[-17,55],[-43,14],[-24,24],[19,24],[8,31],[-20,14],[-13,22],[2,14],[-16,38],[-5,30],[18,27],[51,32],[17,13],[9,14],[58,23],[-50,16],[-31,3],[-23,-8],[-21,-31],[-19,-20],[-77,-7],[-11,11],[-5,43],[4,34],[32,47],[-37,23],[-33,8],[-39,22],[-35,23],[-30,27],[-29,31],[-10,4],[11,34],[6,27],[1,58],[-12,25],[26,50],[36,54],[78,82],[-83,-39],[-68,-86],[-15,-4],[-5,16],[-26,55],[-19,15],[-9,17],[-39,29],[-17,23],[-24,44],[-34,52],[-48,103],[-78,119],[-20,67],[25,84],[-27,58],[74,27],[106,31],[55,25],[32,7],[68,5],[22,25],[-37,-6],[-25,3],[-2,12],[9,21],[6,27],[-13,-5],[-66,-46],[-97,-37],[-76,-21],[-13,1],[-26,-13],[-16,-3],[-11,3],[-27,36],[-8,23],[49,63],[36,86],[48,56],[33,7],[57,-3],[20,-5],[-7,33],[3,16],[46,20],[53,8],[38,-6],[24,-39],[31,-72],[41,-24],[-2,34],[-21,45],[-8,68],[-27,29],[-22,14],[-61,-7],[-36,50],[-9,19],[0,24],[-37,72],[-12,36],[-19,47],[-10,3],[13,-60],[17,-42],[24,-93],[12,-38],[-16,-29],[-31,-30],[-27,-17],[-64,-21],[14,46],[8,45],[-32,-16],[-30,-33],[-10,-45],[-20,-41],[-57,-101],[-23,-56],[-21,-27],[-24,-8],[-21,22],[-18,51],[-9,41],[-1,104],[3,49],[-10,65],[-31,153],[-7,54],[-52,29],[-1,9],[-14,31],[-10,31],[9,12],[12,8],[78,46],[58,51],[70,80],[28,25],[102,19],[45,3],[-1,14],[-15,6],[-68,-4],[-92,-32],[-16,-12],[-40,-50],[-31,-27],[-87,-62],[-56,0],[-58,74],[-65,-14],[-44,5],[-13,11],[-10,102],[36,119],[-38,1],[-8,5],[-20,27],[-13,8],[9,14],[94,56],[141,111],[61,43],[37,19],[29,21],[34,47],[11,20],[20,16],[40,19],[44,28],[72,63],[9,23],[-15,5],[-34,-21],[-68,-58],[-49,-32],[-166,-145],[-71,-52],[-38,-34],[-30,-32],[-32,-23],[-33,-14],[-71,-10],[-35,-12],[-21,9],[-10,69],[7,40],[-3,40],[18,58],[26,40],[11,22],[5,16],[55,42],[30,18],[21,42],[121,15],[31,-1],[16,5],[13,13],[-12,9],[-36,7],[-97,-2],[-89,8],[-40,7],[-20,-4],[-32,12],[-35,23],[-55,86],[22,110],[2,53],[69,46],[37,15],[53,35],[71,59],[84,36],[43,7],[36,-6],[131,-51],[68,-10],[60,13],[75,-18],[132,-74],[25,11],[-7,18],[-148,78],[1,23],[38,6],[40,22],[-22,14],[-98,-12],[-29,-18],[-95,-10],[-49,16],[-45,8],[-67,33],[-56,-11],[-35,-13],[-62,-13],[-23,-8],[-122,-106],[-51,-22],[-37,7],[26,69],[7,27],[0,30],[11,40],[62,77],[40,84],[16,53],[31,6],[42,-8],[126,-34],[105,-40],[77,-11],[51,-1],[22,13],[17,22],[7,15],[5,32],[6,12],[17,13],[34,49],[11,34],[-11,20],[-24,-2],[-45,-13],[-6,-6],[1,-10],[-44,-54],[-47,-12],[-110,-18],[-50,-1],[-89,25],[-13,9],[-9,19],[-109,-5],[-33,-5],[-26,2],[13,32],[34,35],[48,114],[41,29],[80,27],[84,-4],[145,-88],[44,-8],[40,7],[96,30],[18,12],[34,36],[40,63],[-2,15],[-61,-35],[-33,-10],[-28,0],[26,115],[10,87],[9,22],[82,-7],[111,12],[26,19],[0,9],[-45,11],[-21,25],[-38,-8],[-50,-16],[-62,2],[5,37],[46,79],[5,36],[18,72],[1,37],[24,36],[72,25],[31,16],[1,16],[-43,64],[11,18],[34,16],[13,11],[-9,8],[-31,7],[-49,-14],[-53,-7],[-47,21],[-37,10],[-24,-3],[-63,-36],[-23,-1],[-27,10],[-183,31],[-22,11],[-65,54],[-54,36],[-72,39],[-93,30],[-114,20],[-68,19],[-34,27],[-58,59],[-44,50],[-8,24],[26,30],[26,22],[50,18],[85,-6],[46,-8],[50,-17],[38,-3],[79,4],[80,-10],[48,-12],[63,-25],[172,-106],[72,-37],[32,-4],[129,-39],[20,0],[53,19],[6,12],[-18,11],[-57,10],[-67,43],[-42,34],[-4,57],[5,32],[10,15],[8,48],[-39,29],[-27,9],[-72,43],[-6,10],[34,5],[34,-3],[73,-21],[38,-3],[28,8],[3,9],[-44,24],[-56,44],[-115,6],[-75,-5],[-48,15],[-51,24],[-32,7],[-67,-16],[-34,-1],[-31,5],[-30,76],[8,23],[24,10],[18,25],[12,26],[40,25],[217,56],[55,42],[-2,7],[-37,-8],[-48,-19],[-31,-4],[-128,24],[-20,-5],[-52,-35],[-70,-38],[-32,2],[-44,23],[-7,16],[-3,19],[48,26],[15,14],[31,38],[-2,18],[-52,-10],[-7,17],[1,30],[-5,37],[-13,37],[-43,57],[-18,14],[-15,21],[-33,77],[10,19],[29,14],[5,7],[-69,-12],[-7,-13],[13,-20],[9,-26],[6,-32],[9,-29],[25,-31],[20,-16],[33,-43],[14,-48],[-4,-25],[-26,-26],[-40,-27],[-13,-23],[-5,-23],[-32,-21],[-19,8],[-16,1],[18,-37],[12,-39],[-14,-38],[-38,-24],[-20,0],[-41,-19],[-103,-10],[-36,4],[-66,20],[-78,10],[-31,26],[-40,47],[-21,42],[0,38],[11,27],[22,17],[27,109],[38,88],[96,91],[27,33],[9,17],[0,14],[-15,8],[-118,-112],[-73,-12],[-21,25],[6,45],[13,11],[59,-5],[23,25],[-37,38],[-39,10],[-9,9],[40,29],[93,-2],[21,20],[34,22],[37,40],[14,34],[3,29],[-8,23],[-1,23],[7,24],[-10,26],[-26,28],[-57,28],[-17,-31],[-18,-13],[-25,-3],[-24,13],[-24,5],[-24,12],[-24,3],[-10,10],[-6,26],[-1,34],[28,16],[39,13],[26,23],[17,34],[3,38],[-12,40],[-32,37],[-58,-36],[-23,-9],[-6,26],[-8,19],[-24,25],[-33,18],[-31,13],[-1,19],[7,21],[14,24],[18,52],[20,-5],[16,5],[-9,42],[-16,36],[-19,20],[-1,9],[-4,10],[-14,25],[-16,19],[-29,52],[-20,19],[-26,11],[-28,0],[-45,-13],[-83,-16],[-66,-8],[-11,4],[33,20],[49,21],[64,14],[19,34],[-7,29],[2,28],[-17,30],[17,16],[58,16],[27,3],[26,21],[-74,50],[-77,33],[-20,14],[-17,22],[-15,30],[-24,31],[-33,31],[-48,30],[-125,54],[-42,38],[-40,57],[-19,25],[-21,18],[-87,43],[-10,18],[89,50],[9,20],[-36,61],[-38,44],[-41,16],[-60,8],[-56,20],[-50,31],[-51,23],[-76,22],[-126,56],[-195,59],[-87,35],[-52,13],[-68,3],[-132,33],[-111,10],[-69,-4],[-22,5],[-51,33],[-79,19],[-41,-7],[-51,-36],[-62,-35],[-32,-4],[-49,32],[-24,22],[-23,8],[-23,-8],[-43,-29],[-41,-21],[-61,-25],[-49,-12],[-63,-3],[-16,-9],[-24,-1],[-32,8],[-31,17],[-28,24],[-25,14],[-22,2],[-50,-13],[-63,-37],[-29,-9],[-24,3],[-30,12],[-59,30],[-33,-3],[-24,-10],[6,-25],[56,-59],[50,-42],[-42,-5],[-368,57],[-46,14],[-68,34],[-56,21],[-96,54],[-74,30],[-24,22],[-6,16],[23,22],[149,72],[56,14],[116,18],[27,11],[9,8],[-30,16],[-151,-6],[-135,11],[-117,28],[-21,10],[-19,17],[-20,26],[5,28],[28,32],[16,22],[5,11],[-147,-77],[-60,-28],[-48,9],[-34,13],[-16,14],[1,16],[5,11],[10,7],[-78,33],[-35,25],[-4,26],[28,27],[27,19],[27,12],[72,11],[263,20],[188,-19],[64,64],[43,21],[127,21],[195,3],[138,-12],[64,-15],[88,-33],[5,10],[-21,30],[-2,25],[36,43],[16,27],[-11,29],[-38,29],[-69,38],[-36,3],[-41,-9],[-49,-21],[-102,-53],[-49,-11],[-80,-3],[-44,7],[-43,8],[-67,28],[-25,5],[-29,-12],[-35,-30],[-34,-21],[-32,-12],[-30,-5],[-43,2],[-173,47],[-40,21],[-2,31],[-53,30],[-60,5],[-8,11],[77,46],[57,19],[-10,6],[-82,1],[-56,-25],[-32,-4],[-74,-1],[-77,13],[-33,11],[-34,25],[-38,14],[-115,21],[-26,12],[-25,19],[-94,55],[-57,40],[-8,22],[66,49],[3,12],[-28,21],[-12,15],[10,22],[57,47],[22,13],[103,28],[104,40],[37,9],[34,3],[136,-3],[42,10],[36,20],[58,20],[123,30],[272,46],[18,6],[1,8],[-24,24],[-5,12],[55,21],[126,33],[86,16],[55,2],[45,7],[63,21],[35,4],[214,8],[95,-12],[46,1],[30,8],[40,24],[74,59],[38,36],[37,56],[48,88],[35,85],[24,83],[18,51],[13,18],[44,23],[47,18],[79,16],[-7,7],[-34,12],[-31,5],[-29,-3],[-53,-18],[-69,-13],[-67,2],[-48,-5],[-44,-17],[-71,-14],[-48,3],[-86,25],[-43,5],[-110,-3],[-32,10],[-28,17],[-23,25],[-16,32],[2,34],[40,60],[15,16],[107,68],[66,31],[66,24],[48,13],[45,7],[43,14],[80,47],[82,40],[102,75],[50,20],[173,32],[47,1],[40,-9],[38,-16],[106,-74],[9,2],[-19,28],[-39,84],[7,34],[61,37],[25,6],[64,-2],[103,-11],[70,-13],[52,-20],[63,-13],[32,1],[23,9],[33,32],[43,54],[17,66],[-8,78],[-13,58],[-16,36],[9,30],[52,36],[48,26],[114,38],[92,9],[55,-2],[72,-18],[100,-10],[91,-34],[146,-78],[97,-39],[81,-18],[79,-29],[117,-64],[62,-27],[36,-10],[32,-1],[-12,18],[-56,37],[-85,42],[-191,75],[-104,53],[-94,60],[-69,36],[-126,35],[2,14],[151,50],[278,44],[313,33],[105,-3],[184,14],[18,22],[39,9],[172,30],[49,0],[76,-15],[80,-27],[37,-24],[51,-42],[25,-59],[-4,-186],[1,-36],[10,-13],[35,20],[42,38],[37,26],[29,41],[20,56],[12,41],[-49,46],[-2,76],[24,41],[69,0],[284,-140],[111,-31],[127,-75],[149,8],[137,-9],[60,3],[30,11],[-42,32],[-195,85],[-88,67],[-62,84],[-15,45],[47,8],[217,-1],[327,-39],[418,-133],[205,-45],[369,-154],[111,-23],[45,-5],[34,19],[21,21],[1,27],[-18,35],[-10,39],[-3,46],[25,89],[60,30],[26,33],[-24,59],[-70,41],[-271,105],[-1,13],[55,14],[81,8],[671,-25],[116,-10],[50,-9],[21,-11],[28,-6],[144,15],[-3,26],[-18,16],[-779,45],[-145,16],[-74,1],[-77,-12],[-158,-6],[-73,2],[-95,54],[86,64],[72,-1],[137,-25],[82,35],[129,29],[128,10],[278,63],[52,5],[65,-3],[143,-16],[57,-15],[65,-33],[38,-10],[45,-2],[61,-15],[89,48],[81,52],[92,33],[131,-19],[83,-25],[75,-30],[107,-16],[182,-102],[34,0],[16,8],[17,19],[6,28],[22,38],[-16,14],[-152,42],[-29,17],[-29,26],[0,22],[28,18],[30,8],[98,-8],[32,6],[31,15],[37,27],[29,7],[66,1],[101,-18],[88,-1],[32,8],[5,17],[8,11],[10,5],[321,1],[79,4],[63,13],[76,2],[66,-8],[83,-17],[81,1],[122,27],[115,13],[634,-4],[208,-16]],[[35352,92133],[93,-47],[98,-32],[9,-15],[8,-22],[2,-12],[-3,-11],[-6,-10],[7,-12],[21,-16],[2,-19],[-25,-31],[-34,-35],[-183,-72],[-64,-13],[-160,-49],[-49,2],[-11,2],[-30,22],[-42,20],[-19,16],[-17,23],[7,14],[30,5],[44,0],[65,16],[-18,15],[-17,9],[-12,19],[-27,-3],[-20,11],[-38,7],[-101,7],[-66,19],[-20,11],[-17,20],[-15,28],[22,109],[15,27],[34,9],[84,-24],[11,11],[-92,40],[-33,23],[-10,19],[-6,28],[0,16],[4,16],[8,17],[23,22],[92,35],[102,-12],[175,-43],[22,-10],[54,-37],[103,-113]],[[35829,91907],[-43,-20],[-9,5],[-9,15],[-22,70],[-7,34],[5,41],[-8,29],[39,35],[32,5],[43,-8],[72,-35],[-5,-11],[-16,-18],[-44,-24],[-15,-53],[-3,-27],[2,-20],[-12,-18]],[[35129,92765],[-26,-4],[-75,29],[-12,11],[-5,14],[3,16],[24,30],[45,43],[32,8],[20,-27],[20,-37],[2,-18],[-1,-22],[-5,-19],[-9,-15],[-13,-9]],[[34717,93773],[-39,-39],[-32,-23],[-70,-66],[-12,-3],[-18,9],[-15,18],[-26,4],[-9,11],[-4,9],[-12,6],[-18,3],[-30,-7],[-27,7],[-21,29],[38,20],[24,17],[91,6],[25,-7],[16,0],[25,4],[54,21],[8,10],[48,-12],[4,-17]],[[30092,96385],[-99,-5],[-97,22],[-34,17],[2,27],[14,9],[53,9],[44,2],[29,-4],[70,-16],[50,-16],[33,-5],[-9,-24],[-56,-16]],[[37537,99126],[-56,-10],[-118,61],[-186,61],[-164,40],[-154,107],[-12,38],[21,33],[135,5],[108,15],[274,-66],[138,-56],[46,-45],[-7,-92],[-25,-91]],[[42935,92696],[10,-34],[1,-16],[-2,-14],[-6,-9],[-13,-9],[25,-22],[7,-15],[2,-12],[-16,-24],[-110,-31],[-31,-15],[-38,-37],[-47,-31],[-16,0],[-18,33],[-74,24],[-139,-13],[-162,-30],[-58,-14],[-29,7],[-9,12],[0,15],[19,47],[8,12],[37,15],[25,41],[-8,44],[10,62],[25,10],[64,-22],[41,-5],[73,-3],[99,8],[79,25],[144,71],[25,-1],[19,-25],[13,-12],[43,-20],[7,-12]],[[44815,98989],[-29,-18],[-73,7],[-94,52],[-62,43],[-5,50],[32,22],[50,4],[69,-43],[71,-58],[41,-59]],[[45107,97825],[-117,-66],[-174,5],[-103,31],[-30,45],[40,51],[125,41],[156,25],[142,-15],[20,-51],[-59,-66]],[[44723,96758],[-37,-20],[-25,61],[-22,81],[-5,92],[57,45],[29,11],[20,-11],[-5,-40],[0,-82],[19,-55],[-31,-82]],[[44838,95646],[-32,-16],[-108,239],[0,87],[7,66],[49,5],[42,-36],[20,-137],[22,-208]],[[44999,95280],[22,-61],[10,-56],[35,-35],[73,5],[29,-66],[-53,-26],[-214,10],[-88,-5],[-61,41],[2,71],[8,71],[61,41],[51,-36],[62,26],[63,20]],[[45012,96567],[-54,0],[-20,15],[13,27],[75,85],[25,7],[37,-9],[11,-44],[-24,-44],[-63,-37]],[[39713,89591],[-43,0],[-14,45],[4,50],[49,15],[26,-34],[-10,-50],[-12,-26]],[[37148,86855],[-32,-70],[-32,15],[-16,31],[-31,15],[-34,-4],[-1,12],[110,74],[53,20],[-4,-31],[-10,-27],[-3,-35]],[[35645,92658],[-37,-2],[-86,11],[-7,6],[-1,13],[12,37],[38,5],[45,-20],[49,-29],[6,-13],[-19,-8]],[[48160,87445],[-6,-22],[-7,1],[-26,26],[-21,15],[-7,13],[-6,21],[12,2],[14,-4],[36,-20],[10,-20],[1,-12]],[[48139,87237],[5,-18],[-6,2],[-19,20],[-33,48],[-11,39],[-2,18],[8,-2],[7,-16],[31,-11],[8,-8],[0,-19],[10,-23],[2,-30]],[[48003,87637],[25,-22],[9,-16],[-14,-15],[-18,-4],[-21,3],[-34,17],[-12,38],[24,-1],[28,7],[13,-7]],[[48158,87688],[-7,-77],[-12,0],[-20,22],[-15,4],[-5,-11],[1,-14],[8,-9],[24,-52],[2,-15],[-3,-7],[-23,15],[-57,67],[-44,110],[60,18],[43,-29],[48,-22]],[[48220,87706],[-13,-42],[-20,7],[-5,4],[-5,11],[3,31],[-1,45],[22,-37],[19,-19]],[[53491,83977],[0,-58],[-7,-17],[-10,-11],[-28,-11],[-24,-17],[-22,-29],[-7,-41],[16,-30],[31,-16],[8,-58],[-26,-28],[-64,-28],[-7,-68],[2,-54],[-1,-39],[-5,-54],[-52,-24],[-34,82],[0,33],[-11,38],[-1,33],[-12,52],[-50,14],[-19,2],[-27,-9],[-6,3],[-33,72],[6,79],[-17,40],[-3,18],[1,20],[-14,16],[-18,9],[-8,44],[20,11],[48,-5],[15,3],[13,9],[39,73],[-1,16],[4,21],[42,8],[19,-28],[-3,-46],[2,-57],[26,-16],[10,-3],[10,43],[8,21],[10,12],[4,39],[-6,24],[-13,17],[48,49],[50,38],[29,2],[29,-9],[27,-13],[15,-11],[8,-18],[-18,-43],[-5,-23],[12,-77]],[[52408,83469],[-3,48],[-6,34],[-18,51],[27,12],[-5,100],[-10,52],[-75,53],[-60,51],[14,174],[6,46],[-23,91],[3,105],[9,164],[19,7],[14,-1],[53,-30],[22,-3],[15,-26],[18,-11],[13,28],[5,48],[42,62],[30,23],[20,11],[20,-25],[16,-28],[4,61],[12,117],[-40,19],[-33,-16],[-32,-74],[-29,-94],[-47,-8],[-37,-27],[-34,28],[-22,24],[0,35],[5,22],[39,76],[54,73],[53,-1],[39,23],[24,3],[72,-5],[38,16],[33,34],[73,141],[41,59],[82,21],[76,68],[22,1],[-36,-51],[-6,-19],[-4,-30],[25,-66],[-5,-40],[2,-78],[-24,-41],[-28,-87],[-12,-13],[-2,-101],[3,-25],[-4,-92],[28,-38],[29,-20],[99,1],[10,-16],[13,-29],[-9,-49],[-11,-36],[-28,-31],[-37,-23],[-23,-1],[-31,44],[-15,-14],[-15,-23],[-26,-119],[-12,-81],[-6,-7],[-15,12],[-25,1],[-31,-19],[16,-17],[17,-30],[-7,-15],[-28,-16],[-24,-32],[-11,-25],[-31,-29],[-19,-37],[9,-46],[4,-40],[9,-45],[-8,-35],[-38,-51],[-14,-45],[32,1],[21,-10],[12,-13],[12,-19],[-8,-23],[10,-59]],[[52956,83876],[12,-30],[14,-64],[23,-72],[-10,-30],[7,-38],[-7,-41],[-44,-46],[-51,-2],[-52,22],[-74,44],[-6,24],[-10,13],[-20,74],[1,92],[37,11],[81,43],[18,-6],[20,-23],[23,-1],[32,32],[6,-2]],[[53155,83462],[50,-36],[33,2],[22,-14],[6,-23],[2,-51],[-24,-15],[-26,5],[-36,-19],[-117,83],[2,69],[4,27],[56,7],[28,-35]],[[52981,83381],[-12,-3],[-17,46],[-2,15],[20,30],[12,34],[33,52],[19,61],[7,-1],[-8,-55],[-43,-151],[-9,-28]],[[53485,83505],[-10,-9],[-43,7],[-48,-40],[-18,12],[7,26],[5,9],[16,11],[11,16],[4,25],[10,-14],[30,-5],[14,-8],[12,-12],[10,-18]],[[53518,83868],[-26,-24],[-6,1],[-9,34],[14,20],[8,17],[6,0],[8,-19],[5,-29]],[[52912,83437],[-19,-6],[-21,12],[-35,48],[-4,12],[18,-8],[23,-25],[18,-5],[25,-21],[-5,-7]],[[52794,83459],[-29,-8],[-14,14],[-28,5],[-9,89],[2,5],[14,-6],[47,-41],[16,-45],[1,-13]],[[52946,83976],[-5,-11],[-17,11],[-2,37],[6,34],[-7,30],[8,19],[25,-45],[7,-21],[-9,-25],[-6,-29]],[[53070,84822],[-12,-13],[-38,19],[17,26],[42,13],[24,-4],[-27,-27],[-6,-14]],[[54190,83537],[-10,-10],[-46,17],[-56,40],[9,78],[14,34],[102,-88],[1,-33],[-14,-38]],[[54709,79837],[-7,13],[-13,48],[-14,6],[-19,4],[-14,7],[-31,28],[-16,8],[-18,2],[-18,-16],[-13,-19],[-41,0],[-45,9],[-65,63],[-16,1],[-18,-3],[-28,15],[-55,41],[-26,9],[-16,-5],[-14,-9],[-11,-2],[-6,14],[-20,16],[-21,2],[-6,-10],[-6,-90],[-7,-32],[-28,1],[-10,-15],[-22,-44],[-5,-41],[-38,8],[-18,7],[-16,-6],[-18,-23],[-49,2],[-39,13],[-17,52],[-18,21],[-22,18],[-8,4]],[[59445,72041],[-11,-4],[-17,16],[-10,5],[-10,-15],[-11,-11],[-10,-5],[-8,-2],[-14,-11],[-17,3],[-25,9],[-14,-22],[-3,3],[-2,55],[-9,23],[-11,13],[-16,-6],[-22,2],[-16,10],[-31,-16],[-26,-17],[-18,-17],[-14,1],[-24,16],[-18,17],[-2,14]],[[59086,72102],[17,-6],[30,12],[13,56],[4,65],[50,-19],[52,-9],[42,-4],[41,11],[126,69],[36,41],[23,14],[38,34],[40,19],[-25,-39],[-145,-174],[-10,-52],[7,-35],[20,-44]],[[59445,72041],[5,-11],[8,-33],[-32,-10],[-31,-3],[-18,4],[-17,-1],[-51,-95],[-28,-32],[-33,-19],[-33,-11],[-17,-1],[-15,-12],[-10,-22],[0,-22],[-5,-17],[-18,4],[-8,34],[-13,15],[-32,-8],[-16,1],[-52,33],[-16,13],[-10,28],[-27,101],[-4,75],[25,-19],[23,23],[23,38],[27,15],[16,-7]],[[27267,65185],[73,-26],[59,7],[28,16],[-3,-16],[26,-40],[10,-3],[38,20],[99,8],[10,-11],[18,-39],[25,-24],[26,-18],[28,-5],[27,8],[26,-4],[32,-37],[10,-5],[28,10],[-8,-34],[48,-49],[36,-95],[25,-39],[28,-35],[23,-24],[25,-11],[79,5],[18,-3],[17,-14],[15,-5],[9,5],[151,-149],[48,-79],[30,-41],[63,-59],[25,-13],[14,7],[-3,14],[-18,33],[-3,12],[24,-11],[43,-67],[12,-24],[21,-23],[22,-17],[-11,-26],[-17,-3],[-34,11],[27,-43],[5,-31],[12,-3],[19,35],[11,29],[48,-75],[25,-34],[-6,-20],[-2,-20],[28,18],[11,-2],[10,-11],[12,-32],[26,-7],[27,1],[55,-27],[51,-54],[49,-11],[49,-2],[24,-28],[11,-39],[-12,-27],[-7,-28],[18,-35],[-39,-15],[-6,-21],[2,-23],[8,-12],[23,11],[33,-10],[51,-8],[35,7],[71,-24],[21,-13],[42,-44],[19,-30],[42,-79],[35,-31],[31,-8],[11,5],[10,-8],[9,-11],[8,-35],[-5,-37],[-17,-29],[-10,-22],[-44,-2],[-62,-10],[-60,-32],[-29,-26],[-14,-17],[-31,-15],[-2,13],[0,17],[-8,31],[-7,-28],[-12,-21],[-19,-17],[-73,-1],[-29,23],[-30,17],[-109,16],[-27,-1],[-73,-18],[-73,-9],[-31,-11],[-30,-16],[-59,0],[-70,-18],[-70,-4],[45,131],[95,125],[17,27],[13,35],[3,26],[-4,23],[-23,39],[-4,29],[-7,19],[-33,17],[-33,10],[-35,0],[-73,13],[-39,1],[-33,27],[-55,96],[-26,26],[-13,22],[-10,24],[-13,140],[-11,68],[-17,58],[-25,45],[-27,15],[-101,-38],[-24,5],[-23,13],[-154,91],[-63,50],[-26,25],[-22,35],[-23,58],[-25,52],[0,-21],[-4,-14],[-129,-6],[-20,12],[-13,14],[-10,21],[-7,42],[-12,35],[-4,-38],[-6,-34],[-17,-20],[-20,-3],[-24,46],[-104,10],[-9,8],[-34,44],[-30,56],[29,19],[60,26],[13,18],[8,21],[-5,33],[-12,24],[-13,14],[-13,9],[-18,4],[-232,5],[-13,-17],[-21,-37],[-41,-46],[-28,-49],[-10,-25],[-12,-18],[-29,-30],[-24,-46],[-30,-21],[-16,13],[-16,0],[-11,-12],[-13,-5],[-59,-6],[-9,-11],[-8,-34],[-10,-64],[-9,-21],[-30,-8],[-28,-18],[-58,-62],[-15,-9],[3,45],[-3,44],[-16,2],[-19,-7],[-15,-13],[-29,-32],[-14,-9],[-14,17],[3,21],[95,79],[11,6],[17,-6],[17,3],[13,22],[-16,105],[6,71],[22,55],[45,83],[21,27],[219,174],[22,9],[142,35],[22,12],[66,51],[69,21],[73,-16]],[[28425,64488],[-11,-18],[-13,26],[-8,2],[-11,10],[-21,29],[-5,29],[17,2],[23,-5],[39,-16],[-4,-34],[-6,-25]],[[28326,64680],[-6,-10],[-15,22],[-22,9],[-13,33],[-12,13],[-1,12],[20,9],[14,-4],[16,-26],[9,-46],[10,-12]],[[28158,64834],[38,-13],[13,8],[13,2],[13,-5],[19,-48],[-16,-6],[-13,0],[-10,8],[-34,3],[-23,14],[-12,12],[-6,14],[18,11]],[[28367,64589],[-10,-2],[-27,24],[-9,20],[10,27],[2,30],[4,1],[4,-35],[22,-15],[1,-8],[13,-30],[-10,-12]],[[27066,64269],[-26,-31],[-55,-43],[-30,-1],[-30,16],[-20,36],[-12,35],[1,17],[19,-28],[16,-14],[13,9],[10,16],[-31,114],[2,25],[24,62],[65,-19],[11,-11],[10,-40],[14,-31],[17,-83],[2,-29]],[[27958,64898],[1,-15],[-49,42],[-21,44],[-8,10],[13,1],[55,-72],[9,-10]],[[55279,77689],[-18,-2],[-29,10],[-14,18],[-2,19],[0,17],[-9,29],[-23,29],[-49,5],[-18,9],[-18,11],[-20,8],[-19,-1],[-22,-8],[-40,13],[-13,-17],[-20,-20],[-18,0],[-34,46],[-10,3],[-30,-23],[-12,-1],[-9,7],[-40,18],[-18,3],[-14,-8],[-23,9],[-58,61],[-35,-46],[-73,11],[-21,-31],[-25,-60],[-20,-29],[-17,11],[-20,26],[-36,67],[-18,13],[-21,3],[-18,-8],[-10,-14],[-7,-98],[-7,-87],[0,-53],[40,-48],[47,-83],[15,-10],[7,-27],[11,-70],[12,-79],[24,-52],[22,-37],[26,-33],[33,-52],[27,-56],[7,-21],[52,-75],[51,-76],[46,-27],[7,-14],[0,-59],[5,-22],[30,-61],[62,-90],[7,-21],[2,-15],[-4,-12],[-16,-12]],[[54884,76577],[-13,13],[-58,88],[-55,56],[-63,104],[-84,41],[-58,46],[-34,-7],[-39,-14],[-23,-1],[-17,9],[-12,28],[2,22],[-2,28],[-34,46],[-46,44],[-43,56],[-87,151],[-18,49],[17,9],[13,0],[15,10],[24,0],[28,-10],[-25,32],[-31,32],[-80,127],[-24,59],[-3,65],[6,88],[-14,63],[-62,82],[-23,43],[-45,25],[-21,-2],[-12,-32],[-9,-71],[-40,-93],[-14,-41],[-21,-52],[-18,-4],[-11,5],[-33,88],[-32,68],[-4,31],[-3,40],[-24,144],[17,20]],[[54625,76610],[51,-16],[38,8],[34,-10],[21,-19],[5,-9],[-28,-1],[-31,8],[-35,-19],[-31,10],[-12,12],[-8,15],[-4,21]],[[54776,76685],[-20,-6],[-123,4],[-36,12],[-40,31],[-9,9],[41,9],[37,-9],[12,-22],[101,-18],[37,-10]],[[54662,76768],[-44,-1],[-38,10],[-19,18],[2,15],[6,25],[42,-3],[65,-18],[15,-21],[-4,-9],[-25,-16]],[[54230,77224],[5,-20],[-35,38],[-13,26],[-3,11],[46,-55]],[[54113,77751],[-34,-12],[-16,22],[-4,18],[-29,6],[-17,25],[-3,11],[24,28],[13,45],[16,-27],[20,-51],[11,-14],[19,-51]],[[54119,77625],[7,-25],[-26,23],[-23,9],[-5,17],[3,14],[5,14],[18,-2],[3,-14],[18,-36]],[[54218,77382],[-7,-16],[-18,29],[-16,20],[-12,23],[-23,30],[-8,34],[-34,69],[-6,19],[18,-28],[14,-18],[12,-4],[30,-44],[30,-57],[35,-49],[-8,-2],[-7,-6]],[[54219,77143],[4,-8],[-1,-6],[-14,8],[-4,-2],[-68,126],[-7,24],[24,-29],[66,-113]],[[54269,77173],[19,-43],[-18,9],[-18,27],[-11,28],[28,-21]],[[54024,77568],[-2,-22],[-17,28],[-9,51],[-21,82],[-3,23],[11,23],[0,23],[-15,72],[12,11],[8,2],[3,-50],[7,-29],[20,-35],[-4,-58],[4,-83],[4,-18],[2,-20]],[[54891,76479],[37,-39],[-111,51],[13,5],[12,1],[49,-18]],[[55143,76286],[-51,54],[-48,61],[-93,94],[-67,23],[-91,76],[-59,27],[23,6],[26,0],[140,-101],[-16,27]],[[54907,76553],[20,10],[17,-7],[11,-33],[22,-22],[35,-38],[22,-29],[50,-53],[12,-7],[25,-15]],[[49135,54774],[-37,15],[8,19],[36,-11]],[[48465,57848],[17,-38],[22,-26],[34,3],[24,-15],[21,-30],[14,-65],[15,-47],[7,-67],[24,-35],[19,-17],[26,-48],[27,-25],[27,6],[13,-26],[21,-18],[20,-1],[18,56],[24,22],[61,45],[23,20],[25,13],[58,4],[54,-13],[27,-11],[18,8],[18,-27],[18,-56],[14,-18],[15,-19],[12,-44],[13,-44],[7,-19],[16,-44],[14,0],[14,18],[6,14]],[[49161,54798],[-2,12],[-11,4],[-29,26],[5,83],[-13,4],[-11,-11],[-20,-101],[-10,-17],[-146,52],[-31,42],[-38,9],[-66,-5],[-54,-12],[-16,-25],[137,15],[15,-3],[7,-16],[-173,-33],[-67,-19],[-19,5],[-15,32],[-72,4],[-15,-11],[-8,-23],[28,5],[44,1],[12,-18],[-139,-24],[-97,-45],[-41,-33],[-135,-110],[-83,-52],[-22,-20],[-37,-53],[-48,-34],[-54,-64],[-33,-14]],[[26978,56492],[-19,64],[-26,61],[-23,37],[-2,88],[-9,48],[-34,44],[-30,30],[-21,-6],[13,-50],[34,-65],[3,-25],[-1,-33],[-23,5],[-21,14],[-26,4],[-17,20],[-36,77],[26,66],[8,43],[-1,90],[-6,43],[-28,67],[-44,72],[-61,60],[-29,47],[-73,37],[-27,24],[-22,45],[-3,33],[8,50],[-20,63],[-86,125],[-48,46],[-11,26],[-7,9],[7,-86],[21,-52],[55,-48],[15,-28],[6,-37],[-32,-70],[-16,-18],[-5,-38],[-10,-12],[-11,22],[-45,110],[-86,53],[-16,32],[-32,101],[-14,91],[5,61],[35,96],[11,41],[-2,26],[1,37],[-13,26],[-33,35],[-21,27],[6,14],[38,37],[2,33],[0,11]],[[26766,58131],[7,-23],[8,-36],[3,-46],[36,-155],[28,-86],[62,-158],[26,-29],[45,-127],[16,-21],[9,-37],[46,-31],[13,-23]],[[56657,45580],[-11,-11],[-6,-30],[-1,-23],[-19,-18],[-38,4],[-38,17],[-27,5],[-18,-4],[-67,-57],[-22,-7],[-73,4],[-41,12],[-30,2],[-20,-18],[-26,-42],[-22,-22],[-10,2],[-6,18],[-9,24],[-2,63],[-11,69],[7,36],[21,27],[8,53],[-7,81],[0,56],[6,33],[-8,79],[-22,126],[-30,102],[-39,79],[-25,76],[-12,72],[4,173],[12,153],[9,121],[-2,203],[-27,132],[-6,142],[15,152],[3,104],[-10,53],[-7,8],[-9,5],[-66,5],[-89,7],[-78,2],[-84,2],[-14,20],[-6,35],[0,35],[17,108],[-2,9],[-30,2],[-81,-18],[-54,-17],[-34,-6],[-59,-29],[-37,-62],[-12,-78],[1,-64],[-2,-47],[-17,-49],[-14,-56],[0,-30],[-8,-149],[-55,-20],[-55,0],[-13,1],[-68,36],[-25,0],[-22,-19],[-42,-18],[-39,-13],[-40,-45],[-11,-4],[-27,23],[-37,-2],[-38,-11],[-17,-5],[-12,14],[-35,111],[-46,149],[-25,94],[-10,24],[-16,32],[-22,61],[-9,58],[4,55],[-13,73],[-29,93],[-20,89],[-9,85],[-2,72],[4,60],[-5,45],[-16,28],[-9,37],[-7,15],[-13,34],[-29,38],[-33,20],[-70,0],[-93,1],[-84,-3],[-93,-3],[-94,-3],[-26,-6],[-72,-2],[-58,10],[-21,6],[-38,5],[-59,1],[-32,-4],[-77,0],[-7,-1],[-12,-11],[-33,15],[-32,-5]],[[53630,48464],[-19,17],[-39,-11],[-19,-13],[-31,-48],[-46,-25],[-17,2],[-12,8],[-27,53],[-20,50],[-8,28]],[[53392,48525],[12,7],[36,11],[27,5],[6,14],[4,156],[1,159],[-10,21],[-9,12],[-1,11],[14,20],[20,23],[6,11],[22,42],[43,97],[33,24],[30,25],[5,10]],[[53631,49173],[4,19],[14,-2],[4,-9],[7,-20],[12,-29],[21,-34],[22,-37],[11,-5],[17,19],[21,28],[30,20],[7,19],[4,40],[2,44],[3,51],[6,7],[11,5],[20,-15],[9,-15],[16,0],[10,14],[19,25],[25,10],[25,24],[25,31],[12,3],[12,-40],[11,-29],[2,-17],[-11,-34],[-12,-45],[10,-55],[3,-54],[-1,-32],[9,-13],[6,-7],[9,8],[17,-2],[21,-17],[21,2],[20,20],[37,81],[54,141],[44,88],[36,36],[24,43],[12,48],[21,33],[43,26],[32,29],[33,97],[44,174],[12,156],[7,94],[-4,326],[-3,107],[7,58],[16,40],[44,85],[30,70],[23,81],[44,186],[19,60],[8,26],[27,50],[37,43],[47,38],[73,129],[59,130],[-8,157],[13,129],[32,166],[11,174],[-11,184],[4,151],[31,175],[13,65],[4,106],[-1,169],[39,232],[37,138],[41,155],[15,94],[21,125],[-3,100]],[[55169,53846],[-4,116],[10,158],[-3,94],[-15,81],[7,51],[30,21],[36,81],[66,212],[71,104],[49,32],[52,-3],[33,-19],[16,-33],[39,-50],[62,-66],[46,-83],[26,-83],[20,-46],[25,-15],[40,6],[45,-19],[48,-47],[29,-17],[10,12],[23,-7],[52,-38],[42,21],[61,-16],[143,-68],[7,11],[4,3],[12,27],[31,137],[26,85],[12,31],[31,45],[35,11],[35,-4],[28,-19],[26,-23],[29,0],[30,22],[44,40],[46,26],[40,29],[65,50],[26,23],[33,10],[91,-46],[59,30],[24,-9],[51,33],[10,22],[32,111],[35,33],[52,-17],[30,-17],[98,-48],[127,-49],[38,-8],[15,-5],[13,7],[42,63],[14,9],[12,-1],[80,-51]],[[58059,50276],[0,-22],[1,-24],[13,-30],[25,-60],[19,-56],[1,-49],[-4,-82],[-1,-48],[2,-64],[0,-121],[-1,-86],[3,-44],[30,-106],[13,-118],[7,-86]],[[53692,53088],[67,-1],[66,-2],[73,1],[70,1],[55,-3],[26,25],[25,-38],[12,-9],[5,3],[9,-27],[31,3],[5,-6],[3,-33],[29,1],[14,-8],[12,1],[17,19],[12,-6],[22,-25],[15,-21],[22,7],[51,-4],[39,-20],[39,-57],[26,-33],[23,-48],[9,9],[8,13],[5,6],[-1,41],[-13,71],[-5,59],[3,49],[10,35],[17,22],[2,33],[0,4]],[[54495,53150],[19,79],[19,78],[22,92],[19,75],[-2,37],[1,56],[4,62],[-1,37],[6,25],[13,93],[7,53],[12,25],[17,17],[25,1],[66,11],[62,24],[21,11],[38,39],[15,2],[13,-15],[75,-45],[20,-17],[8,2],[11,-3],[17,-1],[18,6],[10,-6],[14,-29],[9,3],[12,21],[23,22],[43,25],[7,-11],[15,-54],[16,-19]],[[53631,49173],[-7,9],[-21,39],[-25,61],[-10,9],[-13,-1],[-22,-22],[-22,-35],[-39,-33],[-32,-18],[-3,-22],[-8,-39],[-11,-23],[-28,-8],[-11,-34],[-25,-66],[-16,-30]],[[53338,48960],[-4,13],[-10,16],[-21,51],[-20,63],[-5,29],[-6,17],[-1,64],[-30,75],[-77,135],[-8,40],[-65,124]],[[62354,44883],[14,-79],[0,-60],[-6,-19],[-13,12],[-23,48],[-43,46],[20,4],[12,-4],[12,4],[8,26],[1,16],[11,12],[7,-6]],[[62163,44753],[19,-35],[-54,15],[-8,31],[-1,24],[20,-5],[24,-30]],[[62073,44987],[-5,-8],[-25,33],[-15,8],[-21,53],[8,184],[7,24],[5,10],[12,3],[14,-23],[-4,-119],[19,-79],[12,-63],[-7,-23]],[[31423,52547],[-53,-26],[-4,4],[-3,15],[1,109],[0,124],[-9,51],[-24,81],[-31,108],[-9,31],[-14,18],[-16,2],[-11,-7],[-16,-20],[-15,-22],[-28,-65],[-29,-76],[-17,-17],[-16,-7],[-15,2],[-12,21],[-13,41],[-14,55],[-18,18],[-7,-17],[-6,-32],[-4,-32],[12,-41],[10,-32],[-18,1],[-56,0],[-66,0],[-65,0],[-58,0],[-55,0],[-21,3],[-21,18],[-20,9],[-10,-1],[-20,-18],[-24,-3],[-17,-17],[-14,2],[0,-95],[0,-135],[-1,-144],[15,11],[13,-1],[10,-10],[27,8],[14,-4],[14,-4],[13,-1],[8,-11],[11,2],[12,13],[13,-8],[15,-20],[10,-31],[8,-37],[9,-20],[-1,-35],[0,-28],[-3,-24],[4,-15],[2,-16],[0,-9],[-5,-4],[-11,-3],[-12,-3],[-8,1],[-6,14],[-6,2],[-9,-2],[-9,9],[-8,18],[-14,18],[-15,-8],[-11,-9],[-11,-11],[-9,-12],[-10,3],[-13,-9],[-10,-14],[-14,-10],[-15,-6],[-18,-5],[-17,-2],[-19,-4],[-1,-76],[-2,-148],[-1,-99],[0,-90],[7,-33],[34,-70],[26,-37],[22,-41],[23,-17],[9,-16],[6,-25],[3,-27],[3,-23],[-3,-24],[-5,-23],[2,-24],[8,-19],[2,-24],[6,-23],[3,-23],[7,-16],[8,-12],[11,-19],[2,-17],[-2,-21],[0,-15],[11,-35],[3,-25],[-5,-29],[-5,-101],[-12,-116],[-8,-88],[-12,-143],[-15,-167],[-18,-204],[-17,-201],[-18,-195],[-15,-176],[-17,-194],[-10,-117],[-5,-20]],[[28094,52681],[-8,40],[-38,57],[19,74],[46,56],[60,-44],[7,87],[-22,76],[4,144],[7,29],[16,39],[20,26],[12,8],[21,-13],[13,29],[49,-13],[15,12],[10,20],[12,14],[15,35],[9,40],[7,16],[17,-6],[1,18],[9,23],[30,53],[-1,23],[-8,51],[2,19],[17,6],[21,15],[10,48],[14,42],[15,63],[17,4],[9,72],[22,64],[46,189],[-13,-4],[-11,-26],[-13,3],[-14,15],[4,85],[-8,10],[-23,-65],[-19,67],[-2,40],[8,40],[-1,27],[-31,-20],[2,25],[19,26],[9,27],[17,29],[7,44],[4,69],[7,74],[-5,36],[-9,31],[-8,137],[2,80],[-4,62],[-8,54],[-37,69],[59,80],[21,60],[-27,124],[-35,105],[-1,62],[10,-8],[11,2],[11,132],[-3,41],[-19,67],[-24,1],[-21,83],[-13,19],[-9,52],[-34,102],[-27,53]],[[28507,56830],[8,-12],[23,-83],[37,-53],[38,-87],[16,-59],[12,-11],[11,-22],[-5,-16],[-12,-17],[-3,-35],[8,-19],[8,-12],[22,8],[12,40],[-8,178],[-13,89],[-15,27],[-13,35],[9,27],[24,12],[31,31],[115,170],[39,159],[30,58],[34,37],[41,-9],[33,20],[10,51],[-9,69],[-13,41],[12,61],[13,91],[-1,76],[16,46],[-6,18],[-23,-37],[-18,-16],[10,30],[33,76],[16,115],[13,48],[46,67],[10,32],[34,50],[56,108],[22,30],[108,-69],[34,4],[-6,-13],[-16,-4],[-23,-19],[-6,-41],[15,-44],[17,-12],[14,28],[14,80],[22,88],[6,92],[15,32],[24,11],[41,-18],[32,-19],[33,-3],[101,14],[164,240],[77,52],[47,50],[31,99],[8,74],[22,28],[24,0],[11,18],[3,23],[57,64],[33,8],[28,-1],[65,-56],[29,-98],[5,-68],[-40,-74],[-10,-32]],[[28301,53307],[-7,-13],[-14,23],[-5,29],[8,21],[12,-7],[5,-18],[1,-35]],[[82828,65953],[-10,-34],[-16,5],[0,25],[-4,7],[5,23],[3,7],[18,-20],[4,-13]],[[83850,69983],[-23,-16],[-72,49],[-51,55],[-31,65],[-4,28],[35,-5],[35,-24],[8,-36],[14,-11],[9,-21],[65,-49],[10,-15],[5,-20]],[[83970,69103],[-4,-12],[-34,33],[-37,7],[-13,29],[-2,46],[39,-2],[48,-41],[11,-21],[-8,-39]],[[83936,68939],[-1,-11],[-24,37],[-11,7],[5,21],[16,5],[13,-47],[2,-12]],[[84000,69062],[-2,-27],[-8,4],[-10,47],[6,12],[14,-3],[0,-33]],[[83283,66507],[-21,-27],[-13,13],[0,36],[7,32],[-8,23],[7,28],[16,8],[5,-17],[9,-10],[3,-9],[0,-18],[-9,-30],[7,-16],[-3,-13]],[[80662,63993],[10,-20],[28,14],[5,-25],[-1,-12],[-9,-29],[-23,22],[-23,-5],[-16,2],[-5,14],[13,28],[21,11]],[[83680,68021],[-24,-13],[-9,0],[0,42],[20,39],[8,-13],[5,-21],[0,-34]],[[81542,64979],[3,-27],[-22,41],[-6,2],[-11,15],[-6,25],[17,1],[16,-30],[9,-27]],[[81330,64286],[-6,-11],[-8,20],[-2,30],[-6,16],[14,21],[6,22],[15,-4],[7,-7],[-14,-23],[-3,-10],[-3,-54]],[[81289,64308],[-27,-12],[-6,2],[10,30],[24,21],[-1,-41]],[[78093,64266],[3,8],[-6,72],[1,17],[-3,6],[-11,6],[-17,-11],[-51,-47],[-44,-87],[-20,-19],[-20,-8],[-24,15],[-27,10],[-37,-22],[-19,10],[-9,18],[-7,27],[4,34],[-2,25],[-16,13],[-17,11],[-10,32],[-5,36],[4,47],[3,50],[-9,23],[-26,12],[-64,23],[-57,12],[-24,-6],[-19,6],[-11,9],[-6,16],[0,22],[9,52],[11,51],[26,73],[2,51],[-2,59],[13,79],[23,59],[11,18],[-3,26],[-9,24],[-13,13],[-21,16],[-34,4],[-45,16],[-54,35],[6,67],[0,42],[-7,34],[-11,24],[-6,22],[10,60],[-13,65],[-14,27],[-15,33],[-2,37],[7,34],[37,73],[0,17],[-9,-1],[-10,-2],[-50,-26],[-6,16],[-18,10],[-37,2],[-43,-5],[-54,-26],[-50,-45],[-22,-32],[-20,-19],[-15,-7],[-19,14],[2,45],[34,82],[4,56],[-10,49],[-1,38],[-12,25],[-17,12],[-9,28],[0,80],[15,83],[24,26],[15,13],[4,16],[-8,57],[1,37],[15,72],[14,54],[28,-9],[12,13],[13,19],[15,33],[10,38],[12,90],[8,13],[35,-15],[10,11],[19,52],[18,64],[26,20],[18,2],[9,21],[-1,31],[-17,50],[-8,39],[2,24],[26,15],[6,29],[-4,63],[11,75],[6,89],[2,66],[0,50],[-3,53],[-4,96],[-11,84],[2,32],[-2,102],[-7,86],[-14,16],[-26,28],[-15,5],[-12,-10],[-5,-30],[-11,-28],[-15,6],[-6,29],[-10,37],[-30,175],[-4,50],[-5,51],[-10,25],[-11,14],[-25,59],[-13,25],[-6,4],[-14,-4],[-13,0],[-11,29],[-9,36],[-10,18],[-17,9],[-17,-3],[-10,-31],[-7,-18],[-12,-41],[-21,-58],[-10,-21]],[[75453,67833],[-1,24],[3,70],[-10,17],[-31,17],[-35,23],[-17,25],[-9,8],[-13,-4],[-21,-26],[-20,-30],[-16,-3],[-16,15],[-16,18],[-53,26],[-24,4],[-42,-5],[-35,6],[-5,8],[0,14],[5,29],[3,27],[-4,16],[-35,20],[-33,14],[-34,5],[-23,-10],[-23,-22],[-18,-39],[-27,-17],[-32,-29],[-16,-28],[-24,-58],[-34,-72],[-31,-71],[-16,-68],[-21,-43],[-22,-31],[-16,-85]],[[71610,72290],[-21,-9],[-42,-5],[-14,1],[-21,1],[-42,19],[-57,25],[-58,35],[-32,28]],[[70705,73169],[-4,5],[-8,15],[-34,46],[-1,12],[52,45],[31,18],[16,13],[3,-2],[8,-22],[20,-13],[14,3]],[[84544,74886],[-3,5],[-23,-51],[-45,-48],[-96,-10],[-30,34],[-11,-24],[-9,-31],[-25,-11],[-39,-2],[-22,-21],[-12,-23],[-54,-8],[-20,-31],[-34,-11],[-140,-135],[-30,-57],[-29,-66],[-21,-34],[-18,-23],[-16,-10],[-17,-23],[-16,-3],[-17,11],[-19,-4],[-12,-28],[10,-36],[-5,-16],[-37,-19],[-55,-13],[-23,-24],[-8,-14],[-12,-7],[-12,47],[-4,62],[23,15],[20,8],[116,86],[-14,64],[10,28],[26,45],[17,23],[-10,8],[-75,-15],[-44,1],[-22,5],[7,39],[-4,38],[-5,15],[38,44],[18,11],[13,-1],[-1,27],[-11,40],[12,52],[79,61],[19,55],[31,51],[58,128],[4,22],[16,60],[3,24],[-26,35],[-11,49],[-78,89],[-7,76],[-7,-3],[-12,-53],[-10,-18],[-36,-1],[-18,20],[-100,13],[-25,-34],[-23,-53],[-22,-38],[-23,-20],[-19,-35],[-81,-206],[-31,-16],[-144,-124],[-72,-49],[-56,-87],[-19,-52],[-17,-58],[-10,-88],[-51,-107],[-18,-23],[-18,-9],[-23,3],[-21,-7],[-35,10],[-43,-34],[-48,-29],[-42,73],[-30,19],[-48,-21],[-23,-33],[-47,-162],[-17,-93],[1,-38],[27,-116],[31,-64],[69,-74],[147,-51],[34,18],[37,0],[39,-48],[24,-80],[3,-55],[0,-19],[9,-16],[5,-27],[-15,-23],[-12,-12],[-10,-84],[0,-94],[12,-31],[32,-44],[49,-36],[45,-8],[86,17],[35,57],[-2,24],[1,32],[76,83],[43,74],[-7,19],[-8,13],[8,8],[23,5],[106,76],[83,-62],[47,-72],[47,-13],[33,-36],[37,-32],[49,-2],[41,-7],[13,30],[13,19],[14,-4],[17,-38],[47,-30],[43,2],[30,11],[18,-14],[-26,-49],[4,-79],[-20,-25],[-19,-40],[11,-26],[10,-12],[-1,-32],[-17,-18],[-32,-48],[-19,1],[-9,9],[-6,18],[-4,27],[-12,18],[-31,7],[-33,-6],[-73,-71],[-71,-57],[-75,-45],[-25,-28],[-18,-8],[-30,22],[-19,-2],[-4,-14],[24,-40],[6,-31],[-3,-23],[-13,-11],[-20,18],[-18,-25],[-8,-42],[0,-99],[-12,-22],[-33,-12],[-35,-32],[-13,15],[-5,17],[4,46],[-4,22],[-16,-1],[-25,-13],[-18,-31],[-6,-18],[24,-58],[23,-6],[6,-13],[-19,-29],[-45,-42],[-8,-36],[-13,-34],[-19,-27],[-13,-28],[-15,-15],[-25,-17],[-31,-68],[-23,-65],[-27,-32],[-21,-109],[-38,-58],[-14,-94],[10,-58],[41,1],[21,-21],[44,-76],[52,-49],[53,-28],[66,-71],[19,-29],[15,-61],[29,-174],[20,-86],[2,-46],[31,-85],[33,-146],[37,-127],[8,-99],[-13,-46],[1,-59],[37,-55],[85,-63],[13,-18],[17,-31],[0,-95],[13,-31],[12,-18],[51,-41],[21,-33],[23,-54],[6,-48],[3,-65],[-29,-2],[-23,7],[-91,84],[-24,3],[-33,-12],[-48,16],[-51,93],[-36,28],[-39,15],[-93,-81],[-24,6],[-7,-9],[-11,-14],[44,-17],[43,26],[42,39],[60,-21],[10,-35],[10,-59],[42,-40],[33,-18],[41,-52],[41,-83],[86,-95],[35,-90],[13,-59],[12,-83],[-30,-27],[-26,-4],[-41,-13],[-30,-29],[-31,-52],[-86,-82],[-17,-51],[-11,-44],[-21,-22],[-54,21],[-50,-2],[-56,-60],[-14,-24],[9,4],[9,8],[25,-9],[40,32],[38,-98],[76,16],[71,82],[27,1],[23,-13],[25,-32],[69,-142],[37,-16],[37,-33],[20,-4],[18,-10],[-49,-52],[-64,-113],[-28,-27],[-19,-30],[51,15],[37,54],[18,13],[15,-12],[7,-67],[-14,-205],[-18,-3],[-17,56],[-20,17],[-18,-11],[-33,0],[-13,-25],[-11,-36],[20,-7],[40,-62],[4,-33],[-11,-22],[-28,9],[34,-46],[-9,-48],[-11,-19],[-20,-12],[-12,-42],[18,-69],[18,-89],[2,-43],[-28,18],[-43,-54],[-23,-4],[-16,71],[-19,-11],[-13,-21],[-18,-77],[-21,-69],[-19,-19],[-22,5],[-18,-2],[5,-18],[19,-23],[0,-27],[-41,-84],[-7,-33],[1,-28],[-21,-34],[11,-57],[-6,-40],[-19,-54],[-19,-36],[-24,-58],[-29,-33],[-39,-122],[-11,-61],[-3,-63],[-13,-21],[-20,-28],[-24,14],[-1,42],[-10,4],[-6,27],[-2,35],[3,28],[-10,-8],[-6,-33],[-16,-27],[-16,11],[-18,22],[1,-32],[9,-31],[4,-32],[24,-6],[17,-37],[13,-55],[2,-21],[10,-25],[1,-21],[-23,-20],[-29,-36],[-35,-63],[-29,-42],[-26,0],[-15,5],[-23,24],[-26,10],[35,-85],[19,-15],[24,3],[23,32],[33,-3],[8,-49],[-9,-55],[-18,-72],[-3,-62],[22,-88],[1,-27],[-9,-13],[-26,23],[-21,29],[-22,-7],[-22,12],[-23,-10],[-10,-21],[7,-34],[20,-28],[12,-43],[-14,-15],[-58,10],[-14,-8],[-17,-47],[11,-71],[-13,-43],[-24,-11],[-32,-35],[-19,-8],[1,-15],[14,-16],[8,-21],[-18,-72],[-26,-23],[-42,12],[-32,-17],[-28,31],[-30,1],[-20,-39],[-2,-45],[-20,-4],[-11,3],[-15,-3],[2,-24],[8,-21],[41,-10],[7,-30],[2,-47],[-43,-80],[-18,-54],[-27,1],[-20,-43],[-11,-60],[-14,12],[-31,-9],[-10,-28],[8,-12],[1,-20],[-13,-67],[-14,-18],[-6,27],[-4,42],[-11,3],[-18,-39],[-22,-28],[-18,-11],[-14,26],[-34,13],[-13,-112],[-29,-40],[-13,-13],[-23,-4],[15,-15],[5,-29],[-9,-28],[-23,-6],[-13,-22],[-5,-100],[-14,-35],[-35,-2],[-26,23],[-8,-19],[-4,-17],[-14,-18],[-26,-5],[-59,-45],[-26,13],[-32,17],[-23,-17],[-7,-34],[-10,-26],[-32,0],[-26,32],[-26,24],[-29,-20],[-22,-42],[-27,-14],[-5,-26],[-12,-13],[-29,5],[-11,65],[-16,9],[-16,-32],[-6,-26],[-8,-19],[3,-53],[-16,-1],[-21,32],[-23,6],[-20,-30]],[[81740,64827],[-11,8],[-11,6],[-18,0],[-7,-8],[-13,-5],[-9,-16],[-1,-2]],[[81670,64810],[-23,11],[-29,44],[-20,73],[-26,39],[-12,35],[-4,62],[-5,29],[2,33],[7,29],[-28,-15],[-20,-27],[4,-34],[-5,-32],[-31,-16],[2,-14],[2,-14],[24,-43],[5,-36],[10,-20],[19,-56],[-1,-110],[11,-31],[-4,-30],[-7,-42],[-1,0],[-6,12]],[[81534,64657],[-9,-2],[-3,-14],[-1,-13]],[[81521,64628],[-1,-1],[-16,-9],[-14,-8],[-11,-11],[-17,-32],[-33,-8],[-16,76],[-23,-51],[-6,-104],[-9,-18],[-14,-15],[-26,37],[-23,-25],[-18,-25],[-8,-22],[-13,-25],[-25,24],[-21,36],[5,27],[-2,17],[-10,14],[-10,-2],[5,-35],[4,-67],[-10,-19],[-14,-15],[-31,12],[-21,25],[-26,21],[-22,4],[-5,-42],[-15,-35],[-13,-4],[-14,6],[-18,-37],[-8,-27],[-22,-29],[-58,-13],[-21,-29],[-27,5],[-21,-7],[-13,2],[-10,15],[-13,0],[-5,-47],[-33,-20],[-30,-5],[-33,-62],[-24,-37],[-17,-4],[-13,13],[-7,56],[-6,6],[-4,-52],[-6,-43],[-12,-24],[-38,-54],[-11,-54],[7,-49],[51,-12],[7,-27],[-5,-22],[-13,-19],[-3,-28],[55,-88],[2,-34],[-9,-19],[-10,-41],[-29,-35],[-62,-18],[-51,18],[-16,40],[1,28],[13,-8],[14,3],[-4,26],[-6,15],[-24,23],[-19,62],[4,51],[-11,40],[-11,34],[-12,20],[-6,25],[12,78],[-7,45],[22,56],[6,63],[39,22],[3,60],[-29,2],[-19,44],[-5,-18],[-15,-2],[-26,84],[-8,11],[-12,2],[6,-90],[-30,-33],[-25,-15],[-35,-6],[-20,-10],[-18,8],[4,27],[10,33],[-9,27],[-20,20],[-30,-1],[-21,6],[-20,-2],[-8,12],[-19,42],[-17,26],[-7,26],[7,31],[-6,18],[-32,2],[1,-43],[3,-52],[9,-39],[-6,-22],[-16,-15],[-17,42],[-8,10],[-9,-2],[-6,-41],[-15,-37],[-28,4],[-22,-23],[-26,-10]],[[80802,63359],[13,-26],[9,-37],[8,-68],[4,-63],[-28,-40],[-25,-16],[-50,-154],[-11,-48],[-8,-21],[-3,-21],[1,-21],[-13,-74],[-12,-91],[-7,-37],[-14,-28],[-19,-15],[-11,-2],[-11,-8],[-27,-49],[-30,-38],[5,-17],[0,-16],[-13,-18],[-14,3],[-42,-14],[-16,-28],[-16,-51],[-6,-7],[-25,-12],[-20,-5],[-33,36],[-16,11],[-44,15],[-43,24],[-30,28],[-61,69],[-7,123],[-11,67],[0,24],[4,206],[4,22],[8,20],[27,46],[31,37],[44,76],[33,35],[27,50],[-16,-2],[-12,6],[12,43],[12,23],[14,12],[29,-9],[27,9],[19,38],[19,8],[71,-12],[49,17],[24,35],[12,2],[36,-10],[14,-37],[-1,25],[1,23],[7,-2],[47,-45],[0,55],[3,15],[15,23],[7,-1],[19,-44],[17,-26],[23,-13]],[[81534,64657],[6,-13],[0,-1],[-13,-11],[-4,-3],[-2,-1]],[[81740,64827],[1,-2],[6,-22],[-2,-24],[11,-12],[3,-23],[-12,-13],[-1,-28],[-6,-17],[-36,30],[-29,16],[-27,-6],[-9,18],[-2,18],[31,32],[2,16]],[[81730,64637],[-7,-9],[-19,42],[-1,14],[15,2],[16,-19],[0,-17],[-4,-13]],[[81665,64637],[-33,0],[-7,5],[-4,13],[12,22],[45,30],[-11,-32],[-2,-38]],[[19644,36209],[-43,-18],[2,32],[11,27],[31,-16],[15,-3],[-16,-22]],[[28110,32461],[-50,-12],[-2,3],[3,10],[11,18],[14,21],[3,1],[5,-2],[6,-4],[15,-14],[4,-10],[-1,-8],[-8,-3]],[[30691,41759],[5,-66],[38,-87],[12,-99],[9,-13],[52,-49],[1,-12],[-8,-18],[-7,-24],[5,-34],[9,-46],[4,-42],[5,-44],[6,-68],[4,-61],[13,-90],[3,-56],[0,-34],[10,-33],[20,-39],[28,-39],[22,-47],[16,-31],[21,-26],[15,-23],[6,-16],[2,-13],[-6,-13],[-25,-61],[-34,-92],[0,-12],[33,-66],[5,-27],[0,-37],[-11,-45],[-35,-14],[-8,-12],[-1,-15],[8,-19],[-1,-44],[13,-49],[-7,-16],[-13,-23],[0,-22],[4,-24],[14,-20],[54,-69],[4,-9],[-1,-7],[-21,-46],[-2,-28],[1,-47],[3,-30],[7,-12],[27,-14],[34,-105],[32,-98],[0,-85],[3,-98],[21,-78],[3,-62],[6,-70],[25,-43],[10,-85],[2,-45],[-1,-29],[19,-92],[2,-79],[-5,-57],[1,-32],[2,-22],[17,-20],[7,-13],[24,-5],[35,-2],[61,21],[46,20]],[[31334,38697],[52,-104],[-22,-140],[-36,-224],[-28,-174],[-5,-23],[-5,-34],[-60,-49],[-88,-71],[-44,-38],[-57,-48],[-13,-39],[-17,-22],[-18,-27],[-6,-30],[-17,-19],[-15,-68],[0,-52],[9,-35],[17,-15],[6,-43],[5,-30],[12,-23],[-3,-19],[-10,-14],[-18,-8],[-12,-43],[-15,-105],[-2,-38],[16,-96],[9,-51],[23,-187],[4,-51],[-32,-71],[-13,-43],[-5,-38],[0,-30],[3,-28],[27,-87],[31,-79],[15,-41],[0,-55],[-7,-31],[-17,-12],[-36,-21],[-16,-32],[-16,-5],[-16,25],[-17,-6],[-21,-22],[-8,-53],[-19,-92],[-16,-25],[-12,-70],[-21,-100],[-10,-60],[-5,-44],[-22,-28],[-25,-56],[-19,-55],[-7,-15],[-15,-5],[-10,-49],[-36,-74],[-9,-85],[-13,-46],[-2,-82],[-20,-151],[-4,-33],[-20,-26],[-27,-58],[-8,-43],[12,-128],[15,-128],[1,-61],[-6,-82],[-4,-36],[10,-14],[17,-10],[6,-31],[-13,-22],[-5,-40],[-14,-44],[-40,-17],[-14,16],[-5,-15],[2,-31],[-9,-37],[-21,-100],[-13,-90],[-8,-39],[3,-33],[7,-19],[0,-18],[-11,-21],[-11,-35],[-11,-5],[-12,10],[-13,-21],[-3,-43],[-7,-54],[-3,-64],[-5,-81],[16,-56],[21,-101],[16,-25],[17,2],[14,-20],[8,-24],[-11,-42],[-18,-7],[-2,-24],[6,-53],[6,-52],[18,-25],[7,-70],[17,-23],[-2,-89],[17,-105],[18,-30],[8,-14],[-5,-46],[-15,-36],[-3,-58],[6,-43],[18,-40],[14,-4],[20,16],[21,-19],[3,-35],[3,-31],[-11,-41],[-12,-76],[-3,-75],[3,-114],[6,-89],[1,-56],[1,-25],[-7,-17],[-19,-9],[-16,-4],[-13,-14],[-3,-28],[-11,-47],[-11,-35],[-19,-51],[-12,-53],[-10,-35],[1,-24],[-7,-46],[-8,-39],[-15,-129],[-20,-27],[-17,-13],[-8,-18],[6,-35],[18,-10],[6,-29],[-3,-44],[12,-41],[-1,-50],[11,-93],[-10,-62],[3,-53],[0,-52],[-15,-41],[-29,-8],[-16,-38],[-28,-41],[-3,-33],[-5,-30],[-11,-11],[-18,0],[-14,-5],[-20,-38],[-22,-21],[-5,-32],[2,-38],[-11,-23],[-15,-44],[-9,-48],[9,-44],[10,-78],[2,-34],[-13,-65],[-10,-42],[10,-53],[8,-30],[-8,-66],[-6,-41],[5,-76],[20,-85],[19,-75],[2,-88],[5,-70],[9,-76],[19,-29],[15,-26],[-3,-36],[-11,-44],[-15,-33],[-38,-11],[-30,-30],[-25,-21],[-19,-25],[-13,-26],[-7,-29],[5,-127],[-3,-47],[-13,-67],[-12,-53],[-5,-16],[-1,-24],[-2,-22],[-14,-5],[-18,10],[-11,-6],[-8,-18],[7,-41],[7,-73],[9,-31],[-2,-24],[-4,-53],[-12,-42],[-17,0],[-10,-18],[-5,-30],[5,-39],[22,-31],[7,-21],[-3,-27],[-17,-11],[-10,-22],[-9,-49],[-13,-55],[-13,-41],[-3,-56],[19,-60],[-2,-59],[-2,-171],[-1,-58],[5,-97],[-7,-26],[-4,-25],[19,-71],[21,-113],[5,-45],[-3,-31],[-28,-27],[-23,-11],[-13,19],[-10,-8],[-10,-33],[-12,-27],[-5,-27],[13,-34],[7,-66],[-15,-29],[-10,-31],[4,-41],[4,-74],[-9,-123],[12,-44],[14,-21],[43,-25],[32,-12],[9,-41],[-4,-33],[-15,-16],[-24,-14],[0,-53],[20,-51],[23,-36],[5,-32],[-1,-34],[-16,-28],[22,-60],[10,-41],[-10,-32],[-15,-47],[-12,-23],[0,-26],[-5,-52],[-1,-51],[4,-31],[137,-24],[31,-9],[18,-31],[-3,-38],[-17,-40],[-11,-76],[-27,-13],[-27,20],[-29,-7],[-26,-5],[-36,-2],[-48,-10],[-30,11],[-2,-28],[8,-48],[64,-15],[60,-28],[18,-51],[24,-58],[25,-36],[1,-58],[-39,-61],[-5,-43],[-51,-13],[-15,-25],[-7,-84],[6,-66],[20,-23],[13,-43],[-15,-51],[-34,-35],[-19,-33],[12,-27],[15,-42],[5,-23],[8,-62],[10,-87],[-1,-42],[-9,-32],[-34,-49],[-24,-23],[-4,-61],[-2,-45],[2,-41],[15,-33],[-1,-33],[-20,-7],[-18,-16],[-17,-58],[-50,-60],[-17,-27],[1,-46],[-20,-65],[-16,-57],[-13,-53],[2,-56],[28,-24],[23,-54],[9,-69],[-17,-79],[-40,-30],[-23,-33],[-7,-25],[6,-83],[-2,-38],[-6,-37],[-10,-28],[-22,-31],[-38,-28],[-32,-19],[-14,-21],[-17,-48],[-15,-52],[3,-65],[-90,-8],[-6,-48],[-20,-38],[-6,-69],[20,-66],[9,-56],[-16,-67],[6,-69],[2,-54],[32,-61],[20,-76],[11,-63],[6,-50],[8,-30],[13,-34],[6,-39],[20,-13],[35,37],[25,25],[17,9],[51,-6],[31,23],[14,-3],[19,-13],[14,-27],[11,-62],[7,-69],[-9,-71],[-14,-16],[-5,-20],[5,-43],[16,-31],[-1,-43],[-17,-99],[-12,-41],[21,-46],[18,-40],[37,-31],[30,-43],[21,-35],[-5,-49],[14,-14],[56,-1],[84,-2],[131,-2],[128,-3],[145,-3],[69,-39],[62,-35],[79,0],[78,-41],[58,-27],[35,-11],[36,-10],[5,-38]],[[30988,21683],[-157,54],[-35,30],[-30,3],[-57,-36],[-32,-88],[-16,-25],[-40,-23],[-40,-5],[-134,-85],[-48,-7],[-33,-23],[-32,-32],[-12,-70],[5,-42],[-36,-152],[-9,-84],[0,-44],[10,-70],[-13,-120],[-25,-26],[-59,-34],[-41,24],[-69,22],[-50,46],[-63,33],[-21,20],[-56,92],[-6,31],[-4,39],[30,56],[16,4],[46,-2],[39,9],[25,-30],[6,-65],[-10,-34],[-10,-22],[3,-16],[28,23],[14,145],[94,72],[31,42],[30,66],[5,18],[2,25],[-20,20],[-44,27],[-142,-137],[-64,-36],[-42,-39],[-50,-71],[-9,-21],[-11,-46],[-5,-52],[-49,24],[-76,74],[-15,28],[15,38],[23,31],[2,107],[6,38],[16,30],[29,33],[14,7],[12,-14],[2,-25],[48,2],[93,94],[38,3],[51,-22],[57,13],[11,10],[11,22],[-42,26],[-41,13],[-115,10],[-25,-10],[-34,-51],[-11,13],[-7,25],[-39,18],[-19,-4],[-18,-24],[3,-37],[-10,-41],[-36,-39],[-25,-64],[1,-49],[-1,-26],[-9,-14],[-19,-16],[-60,11],[-34,52],[-13,35],[-38,39],[83,47],[29,27],[27,61],[20,39],[-14,27],[-17,0],[1,-43],[-18,-36],[-38,17],[-57,-52],[-35,14],[-56,-16],[-28,28],[-6,36],[10,38],[-10,63],[-16,15],[-16,-4],[-7,38],[-17,66],[-8,18],[-8,31],[9,7],[19,-8],[17,-20],[26,-3],[57,-43],[24,10],[13,10],[5,36],[0,34],[10,0],[32,-43],[21,4],[36,-12],[19,5],[34,16],[54,48],[27,49],[14,7],[16,-6],[12,-15],[0,-34],[12,-32],[17,-26],[5,-31],[-3,-32],[-31,-43],[-6,-16],[11,-16],[12,8],[18,21],[10,30],[2,16],[1,22],[-1,27],[-25,76],[-3,18],[0,35],[28,32],[8,25],[2,48],[-15,33],[-61,77],[-101,76],[-12,-8],[-8,-14],[10,-10],[13,-5],[90,-63],[24,-37],[15,-10],[19,-24],[-5,-36],[-91,-34],[-72,-76],[-55,-46],[-37,17],[-18,47],[-19,60],[-28,35],[-16,-4],[-13,7],[-11,18],[-21,-15],[-49,42],[-13,18],[35,58],[39,-22],[9,165],[-12,37],[-51,41],[-24,-5],[-34,5],[-23,19],[-26,8],[-22,11],[-29,25],[-34,14],[-47,104],[-20,55],[-11,60],[72,2],[42,10],[10,25],[-15,47],[-20,38],[15,36],[21,27],[22,-12],[56,-61],[9,-41],[39,-126],[10,-12],[4,-11],[82,-71],[11,1],[-5,59],[23,81],[23,26],[11,0],[1,13],[-22,34],[11,44],[-7,1],[-19,-28],[-40,-140],[-24,-26],[-33,64],[-18,45],[-10,17],[4,71],[65,-14],[-22,23],[-77,42],[-19,20],[-14,7],[-25,49],[-32,41],[55,74],[27,52],[88,-27],[17,16],[-15,38],[-17,-12],[-27,24],[-43,72],[2,36],[7,67],[17,14],[36,14],[41,-22],[17,-17],[16,8],[-16,49],[-27,19],[-29,35],[3,39],[9,33],[8,35],[5,50],[-3,39],[8,17],[13,8],[1,15],[-26,-3],[-9,-49],[-3,-45],[-19,-35],[-7,-41],[-5,-48],[-10,-55],[-23,21],[-13,21],[-5,15],[3,28],[-6,175],[-1,147],[11,114],[32,45],[14,13],[13,-6],[20,1],[14,16],[-45,28],[-28,-16],[-20,-22],[-37,17],[-7,58],[-21,51],[-4,65],[2,93],[51,-8],[42,-18],[110,2],[90,-90],[40,12],[-2,18],[-30,22],[-19,51],[-11,14],[-6,31],[-1,35],[-23,129],[-9,-3],[-9,-44],[-18,-74],[-26,-36],[-40,-15],[-40,-8],[-34,14],[-8,31],[1,35],[-15,17],[-39,16],[-11,8],[-13,32],[19,49],[15,29],[18,-6],[18,-13],[23,-38],[22,-7],[25,30],[5,21],[-16,13],[-14,5],[-23,16],[-44,58],[22,59],[52,68],[16,16],[-14,57],[16,63],[-16,51],[-29,56],[-39,12],[-8,-16],[-2,-23],[6,-17],[-3,-12],[-9,0],[-50,12],[-33,37],[-54,34],[-7,26],[-6,39],[19,67],[-10,1],[-35,-52],[-53,-27],[-40,-9],[-17,-20],[-7,-18],[11,-10],[22,-2],[17,-65],[-4,-25],[-8,-16],[-19,-4],[-38,45],[-20,51],[0,40],[14,54],[61,74],[17,31],[36,34],[48,78],[41,43],[-20,36],[-21,53],[2,75],[84,30],[37,-13],[47,3],[26,18],[18,3],[40,21],[17,29],[4,22],[0,20],[-4,23],[-7,62],[7,21],[17,24],[22,8],[10,-2],[27,-22],[-6,-32],[-10,-39],[-22,-153],[-11,-35],[-17,-30],[12,-62],[-18,-44],[-76,-47],[-10,-2],[6,-17],[44,4],[34,10],[34,39],[11,60],[14,117],[18,17],[22,3],[11,-27],[-4,-62],[0,-60],[-28,-176],[-35,-71],[-4,-19],[2,-22],[27,3],[21,38],[15,49],[15,68],[-2,49],[5,30],[6,100],[11,50],[-1,71],[-19,26],[-26,16],[-7,43],[14,86],[50,-3],[48,59],[31,21],[18,-5],[62,-56],[12,-1],[-2,21],[-9,14],[-25,19],[-45,60],[-61,10],[11,78],[12,72],[30,9],[49,24],[94,107],[17,81],[4,91],[-45,23],[-48,60],[-39,31],[-35,40],[7,59],[5,97],[43,21],[20,132],[-29,102],[7,76],[38,64],[6,45],[11,49],[33,5],[1,27],[-3,49],[-22,58],[-1,80],[21,94],[33,-6],[6,4],[-23,57],[-19,63],[3,25],[18,21],[21,12],[23,-32],[33,-103],[5,27],[-13,104],[-11,130],[-35,-17],[-31,9],[-12,20],[-12,30],[11,35],[11,27],[23,33],[49,12],[35,42],[11,87],[-11,-9],[-19,-76],[-32,-26],[-16,4],[-19,14],[-38,67],[-21,15],[-20,2],[-17,-17],[-44,-117],[-19,-20],[-78,-9],[-28,14],[-31,17],[3,29],[10,31],[17,16],[1,17],[-24,5],[-28,32],[-13,41],[-5,73],[-25,116],[-5,83],[17,59],[38,232],[12,119],[20,104],[0,68],[52,63],[20,38],[45,211],[6,114],[-71,346],[-11,66],[-3,82],[17,136],[2,52],[-15,75],[-40,122],[-1,62],[17,64],[-16,80],[8,49],[9,39],[63,-21],[29,10],[15,23],[12,65],[6,103],[4,44],[5,64],[31,26],[11,61],[26,84],[26,238],[27,58],[27,68],[-11,100],[18,46],[15,34],[14,61],[19,58],[46,83],[11,101],[35,176],[7,112],[11,76],[-3,71],[21,86],[20,73],[7,40],[46,97],[8,76],[-17,52],[0,81],[-13,112],[30,41],[12,31],[39,179],[-3,70],[11,87],[-25,103],[-4,231],[-14,179],[-23,188],[2,105],[-15,131],[0,76],[11,171],[74,108],[15,121],[9,163],[-3,119],[-8,54],[-36,87],[-10,157],[7,41],[31,44],[21,61],[11,95],[23,75],[9,181],[18,144],[10,50],[30,63],[5,17],[5,48],[-2,113],[5,70],[23,136],[3,63],[26,141],[6,101],[12,53],[-5,60],[8,134],[-18,76],[-4,44],[22,137],[16,34],[24,64],[11,72],[2,45],[-32,227],[-4,78],[7,180],[11,116],[-3,93],[3,48],[6,60],[21,72],[5,52],[-7,21],[-26,27],[-21,66],[-2,65],[7,47],[2,67],[31,13],[17,37],[16,70],[20,169],[9,209],[12,125],[8,63],[7,130],[12,85],[2,78],[-2,60],[-30,304],[0,112],[13,174],[0,244],[-2,57],[-12,54],[-3,72],[-18,127],[-17,253],[0,134],[-7,114],[-16,30]],[[30936,21513],[-1,-171],[0,-169],[-1,-157],[0,-158],[0,-152],[-1,-156],[-2,-175],[-2,-130]],[[30929,20245],[-41,0],[-12,-13],[-66,-19],[-112,29],[-28,27],[-38,58],[-13,-16],[-36,-25],[-36,-19],[-30,-2],[-28,24],[-6,12],[-6,3],[-60,-34],[-66,34],[-53,21],[-84,12],[-59,43],[-109,-4],[-19,14],[-7,42],[6,20],[23,11],[6,24],[24,-6],[30,-31],[9,1],[20,29],[30,26],[11,3],[54,-32],[22,4],[32,14],[5,12],[5,22],[9,13],[28,6],[27,-12],[3,-38],[-4,-41],[36,-11],[43,1],[30,-15],[4,25],[-48,65],[-20,40],[-26,24],[-35,12],[-28,75],[1,66],[-3,64],[62,36],[-14,55],[21,41],[25,16],[24,-153],[18,-54],[-23,-11],[-47,1],[27,-76],[43,-25],[37,-56],[1,-41],[20,-18],[50,-1],[34,8],[16,27],[19,9],[33,-34],[57,-25],[15,-17],[11,-30],[0,-31],[3,-16],[17,8],[23,42],[12,15],[14,7],[8,10],[1,12],[-42,31],[-220,141],[-28,56],[-18,71],[1,73],[16,23],[39,29],[72,41],[84,58],[10,11],[-1,37],[-10,25],[-33,18],[-35,4],[-33,-1],[-33,-8],[-60,-39],[-34,2],[-32,21],[-24,42],[-13,57],[0,36],[5,33],[15,35],[19,14],[18,-2],[17,8],[10,12],[8,16],[-3,13],[-6,12],[-27,24],[-10,23],[-23,38],[12,10],[41,6],[28,-26],[26,-30],[16,0],[15,13],[33,38],[28,49],[25,56],[21,34],[23,3],[69,-105],[24,-4],[80,57],[9,-3],[28,-29],[8,-12]],[[31366,20072],[-8,-22],[-17,-29],[-24,-23],[-23,-6],[-16,12],[-9,20],[-4,21],[-5,11],[-9,2],[-11,0],[-14,-8],[-29,-29],[-13,-8],[-9,-2],[-84,22],[-8,9],[-10,19],[-11,59],[-35,52],[54,29],[65,0],[125,-22],[49,-5],[39,-50],[6,-30],[1,-22]],[[29507,26874],[-21,-12],[-19,-3],[-20,9],[-35,-1],[-34,22],[-32,32],[-9,19],[3,26],[24,61],[22,116],[15,166],[-12,63],[1,26],[6,31],[2,33],[-1,32],[3,30],[24,64],[4,29],[0,31],[11,64],[-3,21],[-9,18],[7,16],[85,-47],[56,-11],[3,-49],[11,-38],[7,-68],[8,-16],[-4,-49],[-26,-21],[2,-45],[15,-42],[-22,-16],[-23,-9],[-6,-11],[-17,-10],[-20,-23],[6,-21],[26,-48],[29,-33],[16,-49],[21,-51],[-10,-33],[-19,-46],[-31,-31],[-27,-19],[3,-76],[-10,-31]],[[29312,23532],[2,-85],[-4,-85],[-11,-104],[2,-21],[12,-5],[4,-13],[-4,-55],[-7,-42],[-13,-35],[-7,-41],[-7,-9],[-30,-7],[-17,4],[-13,47],[-4,29],[1,38],[-16,51],[-1,19],[6,34],[14,16],[2,52],[6,15],[15,21],[2,9],[-1,8],[-5,1],[-61,-64],[-5,-18],[-3,-24],[-1,-84],[-10,-49],[-10,-9],[-28,-2],[-37,5],[-42,44],[-27,-12],[-6,54],[14,44],[51,-4],[8,77],[-16,18],[-18,32],[-10,28],[9,21],[30,31],[15,3],[15,-17],[36,13],[-2,49],[-32,22],[7,37],[41,35],[24,36],[2,41],[-10,40],[3,16],[20,34],[29,16],[13,-2],[26,-24],[24,-3],[5,-7],[5,-26],[15,-193]],[[29025,23753],[-32,-1],[-7,103],[36,149],[3,56],[-12,43],[-5,35],[3,14],[47,30],[14,-32],[18,-83],[33,-119],[-1,-114],[-18,-28],[-58,-29],[-21,-24]],[[29337,21357],[5,-5],[10,1],[16,-9],[58,-11],[52,-27],[27,-26],[35,-7],[29,-33],[13,-8],[15,-2],[39,-60],[2,-7],[44,-47],[2,-7],[-25,-3],[-51,22],[-25,1],[-19,7],[-4,4],[-4,27],[-5,13],[-49,63],[-21,14],[-35,12],[-40,-8],[-28,8],[-9,-3],[-40,50],[-40,42],[-17,50],[-25,38],[-1,11],[12,9],[27,-22],[27,-37],[15,-14],[10,-36]],[[29287,23852],[-6,-14],[-34,9],[-59,-15],[-25,52],[-11,83],[-8,18],[-14,47],[-8,31],[-15,48],[-6,51],[-3,16],[13,30],[62,29],[22,48],[19,-6],[-5,-98],[11,-33],[22,-28],[3,-11],[4,-35],[11,-53],[13,-26],[4,-15],[0,-13],[-5,-19],[15,-96]],[[29743,21035],[8,-46],[4,-9],[20,7],[34,4],[57,-17],[6,-6],[24,-51],[19,-22],[28,-47],[-28,-32],[-17,-45],[-1,-23],[-11,-13],[-17,-14],[-26,-27],[-31,-3],[-31,-14],[-15,-12],[-8,-1],[-10,7],[-11,13],[-4,15],[22,14],[28,50],[5,52],[-30,9],[-18,-7],[-14,0],[-15,16],[-9,-24],[-4,-24],[4,-36],[-3,-11],[-10,-7],[-26,14],[-26,24],[-2,14],[6,48],[-1,25],[-5,37],[-3,3],[-10,0],[-31,-7],[-31,46],[-16,49],[-57,14],[44,69],[67,10],[22,-35],[74,-24],[-4,37],[1,13],[10,16],[6,2],[9,-12],[14,-5],[7,-11],[6,-23]],[[29216,22102],[11,-112],[9,-16],[28,-8],[31,-57],[1,-16],[-37,-96],[-8,-69],[-43,5],[-19,68],[-27,66],[-10,77],[-15,66],[27,38],[26,-8],[1,50],[25,12]],[[30638,20207],[223,-57],[68,35],[55,-1],[16,-48],[-55,-49],[-5,-16],[8,-13],[57,-8],[14,-16],[13,-20],[-11,-31],[-1,-14],[6,-14],[42,-46],[18,-24],[9,-23],[3,-40],[-1,-32],[-9,-4],[-21,10],[-20,18],[-18,46],[-12,10],[-36,9],[-35,22],[-28,-1],[-25,10],[-23,-9],[-8,16],[-10,30],[0,14],[12,48],[0,13],[-7,1],[-26,-10],[-11,7],[-29,35],[-11,7],[-29,3],[-17,-62],[-1,-16],[17,-39],[33,-61],[-17,-1],[-47,19],[-13,11],[-14,31],[-28,18],[-10,11],[-3,13],[-1,40],[-6,6],[-40,-11],[-8,10],[-3,17],[-6,9],[-26,16],[-2,9],[11,12],[7,28],[10,104],[51,-22]],[[30169,20718],[62,-46],[40,0],[0,-28],[5,-49],[-6,-20],[-16,-20],[-9,-29],[-7,-5],[-45,35],[-47,48],[-24,-9],[-31,12],[-25,-3],[-16,-27],[-36,-14],[-7,54],[-33,51],[-33,41],[18,63],[22,10],[20,21],[81,-22],[42,-19],[45,-44]],[[29518,26270],[-14,-25],[-22,-4],[-33,-29],[-4,-25],[-1,-30],[23,-37],[11,-43],[14,-64],[10,-61],[-1,-19],[2,-31],[17,-50],[1,-22],[-1,-22],[-7,-41],[-5,-5],[-17,-4],[-1,-25],[-4,-8],[-46,-3],[-23,12],[2,74],[-29,30],[-20,49],[-23,85],[-19,27],[-22,67],[-33,58],[38,36],[-6,64],[22,22],[33,23],[25,-18],[22,6],[10,16],[-3,65],[7,52],[25,26],[26,3],[10,-29],[13,-28],[32,-23],[-1,-29],[-8,-40]],[[29726,26048],[-68,-46],[-33,15],[-13,34],[-7,29],[-7,48],[12,26],[24,37],[10,24],[4,28],[-2,27],[4,25],[14,9],[50,-28],[52,-43],[18,-29],[3,-23],[-22,-52],[-15,-42],[-24,-39]],[[29155,25984],[-7,-9],[-9,3],[-7,18],[-5,31],[10,12],[7,0],[9,-17],[4,-26],[-2,-12]],[[29082,22649],[-7,-53],[-23,5],[-7,13],[-4,34],[-7,16],[9,34],[7,37],[-2,29],[34,-2],[41,-7],[11,-8],[-12,-25],[-12,-16],[-25,-9],[-3,-48]],[[29137,23711],[-3,-46],[-41,-88],[-35,-52],[-32,-41],[-21,0],[-17,20],[19,33],[24,32],[-8,42],[-7,13],[-10,4],[-17,22],[5,33],[10,15],[14,12],[12,-7],[54,23],[17,18],[32,4],[4,-37]],[[29135,24286],[-20,-7],[-3,19],[-18,31],[16,21],[31,21],[24,-2],[22,-17],[3,-19],[-38,-25],[-9,-14],[-8,-8]],[[29258,26723],[-39,-10],[-9,17],[0,15],[7,12],[20,7],[13,-9],[7,-15],[2,-12],[-1,-5]],[[29546,26024],[-9,-7],[-8,1],[-8,20],[-3,26],[-18,39],[-5,18],[0,22],[10,32],[16,9],[10,-2],[13,-37],[3,-40],[4,-42],[-5,-39]],[[29289,22305],[-1,-48],[-8,-15],[-8,-5],[-20,15],[-11,1],[-18,-25],[-16,-13],[-23,3],[-31,17],[-27,-72],[-13,-25],[-27,-33],[-3,39],[17,60],[8,40],[16,60],[31,-22],[44,22],[41,41],[34,1],[12,-23],[3,-18]],[[29151,22870],[-54,-46],[-16,19],[-39,0],[10,50],[4,37],[6,14],[2,32],[12,58],[32,-19],[24,-6],[33,-19],[36,-12],[10,-51],[-34,-23],[-26,-34]],[[29497,26597],[6,-29],[-13,-4],[-19,5],[-10,-23],[-5,-4],[-45,20],[-7,9],[1,29],[48,3],[31,19],[4,-3],[9,-22]],[[29405,21928],[-9,-6],[-30,14],[-16,12],[-24,30],[-3,31],[-11,38],[7,0],[25,-15],[10,-11],[13,-24],[40,-34],[5,-10],[-1,-13],[-6,-12]],[[29357,25523],[-15,-26],[-27,-12],[-27,20],[-32,-9],[-3,43],[12,36],[24,43],[18,58],[-2,81],[14,18],[8,29],[31,18],[7,-61],[-8,-107],[20,-64],[3,-21],[-4,-24],[-19,-22]],[[31229,19648],[-10,-1],[-25,11],[-36,4],[-5,5],[0,8],[4,9],[20,7],[60,-6],[8,-4],[2,-7],[-10,-19],[-8,-7]],[[31535,20029],[-22,-25],[-16,1],[-6,9],[-1,12],[3,12],[7,11],[16,14],[5,2],[24,-14],[-10,-22]],[[30280,20237],[13,-37],[4,-6],[35,-15],[15,9],[37,4],[23,14],[32,7],[38,-90],[-4,-28],[-30,-30],[-20,-6],[-19,9],[2,15],[-4,13],[-13,17],[-12,-1],[-19,-13],[-10,2],[-19,14],[-35,10],[-7,13],[0,19],[-7,9],[-36,31],[-23,25],[-20,4],[-7,-3],[-7,-13],[-17,-11],[-5,2],[-6,9],[-3,14],[7,29],[11,3],[49,-6],[30,-13],[27,0]],[[31308,19713],[-10,-4],[-7,10],[-12,8],[-46,16],[-1,10],[5,14],[9,12],[18,13],[14,32],[7,-3],[6,-13],[11,-44],[14,-32],[-2,-11],[-6,-8]],[[56349,58133],[-11,4],[-25,16],[-29,13],[-36,11],[-35,-26],[-37,-33],[-12,-25],[-10,-14],[-16,2],[-15,-4],[-9,-24],[-13,-26],[-54,-54],[-11,-19],[-7,-20],[0,-21],[5,-44],[0,-55],[-12,-44],[-13,-30],[-16,-11],[-14,-6],[-8,-19],[-28,-100],[-12,-19],[-25,3],[-71,-150],[-7,-45],[-25,-62],[-33,-70],[-29,-34],[-3,-13],[-8,-13],[-18,-16],[-62,-85],[-75,4],[-33,-34],[-32,-15],[-47,-16],[-14,2],[-61,-7],[-70,2],[-27,-12],[-26,-32],[-19,-29],[-3,-9],[3,-12],[0,-9],[49,-70],[12,-34],[-12,-33],[-6,-5],[-1,-2],[-8,-26],[-29,-79],[-44,-93],[-22,-26],[-10,-17],[-11,-62],[-8,-9],[-30,-8],[-60,-6],[-83,-20],[-50,-7],[-31,5],[-43,-42],[-16,-11],[-10,-4],[-43,-41],[-36,-64],[-12,-12],[-51,-27],[-20,-44],[-9,-4],[-32,58],[-23,53],[-10,53],[-2,17],[-6,-3],[-17,-23],[-16,-27],[-7,-51],[-52,-35],[-45,-30],[-20,-37],[-31,-18],[-40,7],[-31,16],[-31,5]],[[54299,56177],[15,46],[6,35],[1,42],[-2,29],[-18,14],[-12,23],[-26,133],[-27,138],[-38,135],[-41,86],[-30,53],[-9,7],[-15,16],[-11,16],[-55,92],[-56,102],[-15,47],[-28,70],[-32,72],[-16,33],[-8,59],[22,54],[23,67],[29,45],[37,3],[61,-18],[67,-7],[65,14],[17,10],[17,-1],[35,-15],[61,3],[32,27],[-34,47],[-37,74],[-34,81],[-21,73],[-19,95],[-18,116],[-11,152],[2,85],[6,61],[18,100],[-12,58],[2,47],[-1,70],[-6,36],[-24,115],[-5,13],[-21,80],[-9,134],[-24,89],[-39,43],[-21,52],[-8,91],[-15,25],[-61,32],[-50,0]],[[54495,53150],[-13,54],[-8,63],[-4,73],[2,19],[-5,22],[0,4],[-7,55],[7,38],[-5,40],[-16,39],[-14,30],[-8,27],[-7,12],[-15,4],[-21,14],[-27,59],[-27,57],[-34,74],[-27,63],[-33,78],[-31,72],[-19,69],[-7,40],[9,4],[13,1],[6,7],[0,19],[-14,54],[-6,70],[-12,42],[-35,66],[-35,49],[-11,26],[-6,36],[-13,231],[-6,65],[-10,29],[-8,13],[-3,16],[1,41],[5,37],[-1,14],[10,32],[0,213],[-5,11],[-6,18],[-10,-1],[-11,2],[-11,31],[-9,39],[3,28],[9,23],[11,20],[13,17],[39,34],[11,17],[7,21],[4,29],[23,109],[33,109],[15,23],[14,72],[20,89],[8,41],[6,41],[10,33],[37,54],[28,96]],[[43008,61604],[-27,-11],[-12,5],[-3,46],[-6,30],[1,14],[63,59],[21,-10],[16,-47],[-11,-26],[-42,-60]],[[43487,60488],[-17,-53],[-36,4],[-19,22],[-22,66],[0,52],[8,44],[-1,39],[3,10],[11,-6],[2,-26],[34,-64],[12,-13],[25,-75]],[[43086,61530],[-22,-13],[-14,1],[-21,21],[7,22],[22,24],[15,5],[12,-43],[1,-17]],[[43634,61196],[23,-11],[8,4],[15,-2],[16,-30],[3,-33],[-8,-40],[-30,-33],[-18,4],[-21,30],[12,60],[0,51]],[[43247,60400],[-21,-22],[-15,10],[-15,23],[-7,33],[6,28],[29,33],[17,-11],[10,-51],[-4,-43]],[[43309,61418],[11,-17],[4,-12],[-17,-7],[-42,22],[-11,-13],[-11,-48],[-21,72],[2,27],[4,8],[30,-19],[51,-13]],[[43642,61439],[-9,-30],[-11,44],[-6,10],[-3,62],[16,19],[8,1],[0,-64],[5,-42]],[[43560,60562],[-8,-2],[-11,26],[2,36],[-1,9],[10,39],[20,-4],[6,-28],[0,-59],[-18,-17]],[[13151,83022],[26,-34],[61,22],[11,-4],[12,-13],[12,-28],[14,-42],[3,-46],[-5,-17],[-11,-18],[-98,-73],[-2,-7],[2,-7],[9,-7],[19,1],[77,18],[5,13],[5,57],[11,31],[0,23],[-7,55],[1,22],[54,5],[33,20],[35,38],[8,-1],[-5,-68],[-5,-21],[-33,-84],[-19,-73],[-9,-73],[-2,-120],[-8,-41],[-15,-25],[-93,-43],[-48,2],[-43,40],[-20,27],[15,33],[10,2],[30,-7],[24,-12],[10,0],[-2,7],[-66,63],[-49,28],[-14,32],[-1,24],[-4,14],[-38,86],[-8,34],[-5,48],[0,49],[10,80],[4,8],[16,-1],[27,-9],[66,-8]],[[13402,82485],[28,-53],[8,-48],[-3,-56],[-45,-22],[-23,17],[-11,-3],[-15,-17],[19,-7],[26,-28],[23,-36],[32,-6],[44,-25],[-33,-45],[-5,-26],[41,-72],[4,-18],[13,-4],[30,6],[4,-6],[0,-15],[-19,-42],[2,-8],[17,-7],[32,0],[8,-41],[-30,-38],[-55,49],[-25,48],[-14,45],[-17,25],[-52,57],[-78,121],[-21,18],[-20,48],[-6,23],[1,15],[7,9],[24,5],[0,24],[-90,42],[-10,8],[-12,30],[7,4],[49,-5],[53,14],[33,11],[13,13],[27,17],[11,-1],[28,-20]],[[14667,81013],[138,-72],[138,-35],[102,-42],[62,-13],[22,-9],[15,-15],[17,-36],[29,-85],[23,-55],[46,-94],[37,-67],[8,-27],[-8,-8],[1,-16],[28,-65],[52,-59],[41,-28],[86,-45],[53,-45],[16,-30],[23,-30],[9,-21],[19,-76],[35,-73],[36,-139],[7,11],[4,42],[4,9],[8,5],[7,-17],[6,-36],[23,-87],[-7,-26],[-7,-2],[-31,11],[-10,-15],[-15,-32],[-10,-13],[-6,6],[-90,31],[-55,29],[-72,45],[-87,47],[-50,33],[-41,33],[-29,29],[-5,24],[1,11],[56,77],[23,42],[9,31],[5,34],[-3,41],[-3,-3],[-5,-40],[-8,-34],[-10,-28],[-6,-9],[-67,-14],[-54,4],[-27,-33],[-8,-4],[-15,11],[-33,44],[-47,36],[5,9],[31,19],[16,26],[-3,5],[-11,-2],[-10,6],[-19,34],[-10,10],[-23,-16],[-10,-1],[-9,23],[13,53],[1,13],[-24,-20],[-8,7],[-7,17],[-7,7],[-19,-3],[-21,15],[-7,-6],[-3,-23],[-7,-6],[-31,39],[-8,1],[-15,-29],[-5,-2],[-9,13],[-4,71],[2,21],[4,7],[28,16],[79,18],[7,13],[-60,-7],[-15,10],[-17,24],[-17,0],[-9,8],[-10,18],[-25,64],[-17,17],[-29,10],[-15,12],[-6,-5],[-6,-19],[-9,-11],[-19,-7],[-19,5],[-14,18],[-8,22],[-4,25],[8,33],[0,14],[-3,15],[-7,12],[-9,10],[-5,-5],[-1,-20],[-5,-14],[-17,-11],[-13,19],[-9,27],[-11,19],[-57,0],[-27,-25],[-13,-2],[-13,6],[-2,13],[12,35],[-3,47],[-3,12],[-27,7],[-4,12],[15,57],[9,11],[12,4],[53,4],[17,-8],[26,-34],[-1,13],[-9,39],[-2,24],[18,26],[-17,8],[-63,6],[1,-17],[5,-24],[-37,-21],[-28,-4],[-26,4],[-21,12],[-37,51],[-23,51],[1,27],[13,29],[16,19],[39,18],[51,1],[57,-23],[143,-104]],[[10833,91964],[39,-9],[126,-19],[119,11],[221,-61],[137,-114],[111,-57],[45,-38],[72,-34],[169,-75],[53,-7],[98,-36],[61,5],[104,-9],[71,-28],[140,-79],[29,-7],[8,6],[-49,78],[-8,7],[-56,29],[-67,14],[-5,6],[-12,27],[4,11],[14,5],[50,-1],[29,5],[4,11],[-21,2],[-25,11],[-30,18],[-17,17],[61,115],[21,-11],[32,26],[58,-17],[10,10],[7,58],[9,14],[16,11],[80,10],[99,-10],[11,5],[-10,39],[-1,16],[6,35],[6,18],[12,10],[46,-8],[15,-17],[15,-30],[16,-17],[49,-17],[6,-11],[-19,-45],[-19,-24],[-41,-62],[-3,-16],[63,28],[71,38],[60,22],[51,4],[36,12],[22,21],[16,22],[31,70],[21,12],[87,-4],[21,2],[13,7],[-2,8],[-19,11],[-25,3],[0,5],[9,12],[14,6],[42,8],[29,-25],[19,-2],[63,28],[98,74],[39,21],[34,3],[29,-13],[22,4],[29,41],[12,23],[17,19],[73,43],[46,10],[29,-8],[33,-18],[28,-7],[37,5],[27,-2],[13,8],[47,50],[15,0],[14,-14],[24,-36],[0,-18],[-31,-44],[-225,-126],[-69,-54],[-34,-20],[-36,-11],[-69,-9],[-27,-11],[-46,-10],[-109,-17],[-21,-9],[-14,-10],[-39,-66],[-18,-22],[-38,-33],[-41,-20],[-58,-7],[-36,-31],[-42,-60],[-33,-42],[-39,-36],[-42,-46],[-11,-25],[13,-32],[7,-10],[42,-18],[16,4],[-15,17],[-35,25],[-5,9],[9,7],[166,-19],[36,19],[12,16],[-2,9],[-45,3],[-10,15],[-7,29],[-2,23],[4,17],[10,22],[49,35],[52,15],[40,20],[22,19],[60,32],[23,27],[13,20],[2,10],[-11,7],[9,18],[43,16],[20,1],[61,-15],[11,-12],[-6,-31],[8,2],[24,39],[13,13],[14,3],[13,-5],[14,-13],[8,-38],[1,-63],[3,-25],[16,43],[11,20],[59,93],[40,51],[46,50],[65,37],[152,61],[85,17],[43,15],[21,13],[14,17],[24,19],[4,-2],[-9,-39],[-6,-12],[-56,-24],[-5,-19],[6,-29],[9,-19],[13,-9],[23,6],[33,23],[41,34],[89,86],[8,16],[22,69],[51,31],[92,35],[22,22],[-80,19],[-17,13],[-3,8],[15,19],[-36,20],[-14,12],[1,36],[11,25],[24,24],[14,5],[36,-15],[30,-18],[104,-85],[42,-42],[25,-33],[58,-102],[26,-59],[21,-61],[21,-44],[20,-27],[100,-107],[52,-45],[44,-28],[49,-22],[57,-16],[38,-2],[60,46],[1,29],[-26,50],[-27,35],[4,21],[35,40],[-3,14],[8,42],[24,-8],[10,1],[13,15],[17,29],[22,24],[27,19],[7,12],[-26,9],[-16,0],[-12,4],[-8,8],[11,9],[57,22],[11,22],[19,14],[23,5],[15,-6],[16,-17],[1,-28],[-7,-46],[-2,-37],[18,-87],[16,-19],[63,-25],[-4,-22],[-72,-91],[-16,-23],[-7,-17],[2,-14],[13,-12],[24,-9],[63,-3],[18,8],[122,3],[22,6],[19,18],[28,44],[31,14],[10,12],[19,52],[10,61],[9,26],[14,16],[19,5],[48,-6],[22,5],[88,-5],[88,4],[92,-11],[58,-12],[54,-20],[104,-46],[41,-26],[145,-113],[43,-23],[79,-22],[274,-49],[34,-13],[72,-51],[50,-30],[59,-29],[73,-25],[144,-37],[24,-13],[26,-3],[30,5],[132,-22],[35,1],[25,-4],[31,-15],[45,-6],[-2,11],[-51,59],[2,9],[21,1],[64,-10],[15,17],[21,-1],[49,-8],[53,-18],[56,-28],[68,-24],[104,-60],[57,-50],[55,-62],[29,-43],[6,-24],[11,-12],[17,0],[7,-9],[-16,-53],[-9,-14],[-12,-9],[-49,-11],[-136,13],[-25,-43],[-76,-37],[-13,-16],[-4,-11],[6,-38],[-10,-12],[-62,-43],[-2,-12],[40,-18],[43,-30],[34,-7],[43,4],[54,-11],[65,-25],[45,-12],[25,2],[35,-4],[44,-12],[59,-4],[129,1],[39,-8],[54,-4],[105,1],[19,1],[33,21],[22,6],[38,1],[108,14],[38,0],[34,11],[45,23],[27,4],[10,-14],[19,-6],[27,2],[52,23],[120,71],[43,0],[32,22],[8,0],[8,-9],[30,-52],[9,-8],[20,-4],[20,-27],[20,-39],[16,-11],[113,-2],[39,-11],[12,-11],[13,-31],[7,-60],[5,-22],[16,-33],[11,-9],[10,9],[28,84],[10,13],[18,-4],[6,-5],[28,-62],[40,-46],[100,-84],[16,-31],[6,-23],[-6,-21],[-17,-18],[-27,-15],[-37,-11],[-34,4],[-32,19],[-10,1],[11,-17],[66,-70],[17,-28],[16,-18],[14,-10],[13,-15],[12,-21],[55,-56],[16,-27],[62,-84],[30,-33],[23,-19],[8,-1],[-5,15],[-79,111],[-41,70],[-5,17],[-3,26],[-2,85],[6,13],[28,11],[35,-39],[13,-5],[9,2],[5,10],[20,-9],[36,-29],[12,0],[-27,54],[-19,27],[-7,19],[18,28],[-10,14],[-45,41],[-24,42],[-21,65],[-2,25],[3,26],[-3,22],[-29,43],[-31,30],[-24,35],[-5,19],[3,50],[19,21],[36,29],[9,30],[-16,31],[-3,14],[10,-2],[70,15],[18,-5],[26,6],[35,19],[28,9],[36,-2],[20,5],[24,8],[13,9],[22,36],[12,6],[37,-4],[21,-8],[9,3],[-1,50],[7,18],[37,37],[39,4],[25,10],[30,20],[21,19],[21,29],[9,38],[-7,11],[-44,15],[-26,-8],[-59,-27],[-61,-34],[-24,-33],[-6,-41],[-12,-18],[-47,17],[-21,0],[-25,-7],[-27,-16],[-29,-25],[-42,-4],[-56,15],[-33,5],[-34,-26],[2,-20],[15,-28],[-15,-17],[-82,-6],[-21,4],[-44,-12],[-17,3],[-12,13],[-89,58],[-9,11],[22,47],[82,126],[9,8],[152,22],[91,23],[169,69],[32,6],[108,46],[45,12],[41,-8],[60,-24],[32,-21],[22,-26],[18,-37],[23,-81],[8,-69],[14,-26],[51,-48],[26,-18],[16,-6],[14,11],[9,2],[7,-4],[7,-31],[9,-3],[30,4],[32,-12],[5,-10],[-7,-37],[9,-16],[40,-34],[37,-12],[44,-6],[81,6],[68,16],[51,26],[42,-29],[84,-71],[50,-51],[41,-23],[84,-29],[19,-15],[31,-2],[43,12],[48,-5],[54,-21],[37,-9],[127,40],[20,2],[47,19],[31,6],[36,0],[27,5],[17,13],[68,-1],[122,-14],[84,-17],[49,-23],[41,-12],[32,-3],[31,4],[30,11],[32,20],[68,11],[11,5],[-1,11],[-14,17],[-39,32],[-27,31],[-5,20],[1,24],[8,14],[16,4],[26,-15],[34,-34],[98,-126],[24,-17],[13,-17],[90,-45],[42,-9],[50,29],[22,17],[11,17],[0,17],[4,24],[-5,14],[-13,20],[-36,26],[-59,34],[-53,10],[-48,-14],[-55,-29],[-23,12],[-68,81],[-17,31],[0,8],[31,-9],[2,9],[-19,40],[-12,13],[-39,62],[-5,18],[24,5],[11,7],[15,-1],[70,-37],[35,17],[83,23],[-33,36],[-7,35],[3,8],[27,5],[53,-29],[25,-4],[19,11],[19,1],[21,-10],[19,-15],[37,-43],[17,-26],[20,-39],[7,-6],[97,-3],[54,35],[-1,-12],[-12,-27],[-68,-105],[1,-13],[36,6],[17,8],[10,13],[9,29],[6,9],[101,49],[29,8],[-18,-53],[-37,-188],[-8,-65],[-8,-23],[-40,-72],[1,-25],[43,-61],[8,-17],[4,-50],[8,-9],[36,-1],[37,16],[44,11],[7,-11],[-24,-60],[1,-6],[42,16],[19,2],[8,-3],[31,-31],[3,-23],[0,-35],[-3,-24],[-11,-14],[-13,-6],[-16,-4],[-14,2],[-44,-5],[-26,6],[-25,19],[-18,5],[-21,-15],[-34,3],[-37,41],[-15,-4],[-5,-6],[0,-9],[17,-27],[132,-143],[20,-29],[4,-43],[3,0],[12,43],[-8,20],[-67,83],[-9,31],[3,8],[18,9],[96,-21],[38,4],[25,15],[13,18],[9,99],[17,63],[-10,57],[-26,90],[-21,54],[-47,53],[-5,20],[53,163],[9,14],[12,6],[42,2],[30,14],[47,-19],[26,-5],[33,17],[72,69],[28,21],[36,40],[43,59],[48,43],[76,40],[47,32],[10,12],[-44,2],[-10,6],[-9,30],[4,57],[-1,31],[-5,28],[-9,25],[-14,23],[-13,13],[-11,4],[-8,-2],[-4,-8],[-12,-54],[-15,-39],[-20,-21],[-43,-14],[-72,-10],[-30,19],[-4,16],[10,62],[25,27],[66,53],[42,42],[1,7],[-39,1],[-9,8],[-9,52],[3,20],[6,22],[27,16],[84,20],[65,23],[2,-8],[-52,-70],[-5,-16],[20,-16],[50,41],[32,34],[6,11],[-30,4],[-1,14],[5,26],[-2,17],[-33,22],[-40,-12],[-34,-23],[-28,-7],[-41,0],[-30,5],[-18,11],[-23,25],[-26,38],[-33,38],[-12,4],[-10,-4],[-22,-37],[-9,-4],[-130,52],[-56,28],[-26,22],[-34,13],[-39,4],[-32,11],[-24,16],[-19,23],[-15,31],[-27,38],[-62,77],[-16,49],[-2,19],[4,49],[58,82],[10,24],[20,17],[29,11],[21,4],[47,-11],[-28,26],[-3,13],[29,45],[-6,2],[-78,-34],[-20,2],[-28,21],[-52,75],[-1,47],[17,65],[5,38],[-15,33],[6,10],[16,9],[7,10],[-7,36],[11,20],[38,38],[36,33],[22,10],[19,-2],[19,-10],[21,-19],[34,-19],[26,-5],[19,10],[33,71],[11,18],[-11,8],[-63,0],[-28,5],[-16,7],[-11,27],[9,15],[62,50],[29,53],[86,73],[87,34],[43,11],[34,3],[15,-5],[18,-36],[4,-39],[47,-48],[38,-4],[24,7],[76,-2],[18,-14],[-1,-15],[-9,-24],[6,-21],[51,-40],[47,-28],[42,-34],[63,-72],[13,-21],[10,-22],[16,-80],[2,-31],[-6,-88],[-5,-17],[-16,-20],[5,-8],[50,-23],[39,-46],[21,-15],[49,-24],[9,-9],[12,-16],[28,-66],[46,-59],[3,-13],[-10,-28],[7,-9],[18,-10],[16,5],[14,21],[15,6],[17,-9],[12,-16],[17,-38],[25,-31],[-2,-10],[-12,-8],[-68,-8],[-37,6],[-35,15],[-25,16],[-22,24],[-9,-2],[-12,-20],[-25,-29],[-16,-27],[18,-12],[89,1],[19,-8],[23,-19],[-26,-31],[-60,-53],[-129,-103],[-38,-26],[9,-8],[14,-2],[45,5],[41,14],[51,-6],[22,-12],[-8,-11],[14,-17],[83,-42],[52,8],[53,40],[41,20],[51,-2],[14,-5],[-5,-10],[-38,-22],[-34,-25],[-3,-7],[42,10],[94,-16],[45,-4],[34,4],[31,-6],[29,-17],[9,-11],[-27,-6],[-25,0],[-22,-11],[-18,-20],[-13,-26],[-8,-33],[-19,-13],[-31,6],[-13,9],[7,13],[-9,2],[-25,-10],[-20,0],[-5,-9],[137,-104],[44,-91],[30,-38],[3,-10],[-20,-26],[-1,-19],[9,-56],[-4,-45],[-14,-78],[13,-25],[29,-22],[18,-27],[12,-10],[9,-22],[10,-14],[12,-6],[8,8],[5,20],[11,19],[31,34],[30,54],[5,17],[-5,42],[4,18],[28,64],[9,44],[8,69],[15,48],[32,40],[56,82],[20,16],[22,8],[40,-2],[28,-26],[39,-49],[49,-44],[90,-60],[25,-23],[51,-59],[21,-59],[15,-84],[13,-50],[10,-17],[5,-25],[-1,-34],[-4,-26],[-7,-19],[-11,-11],[-27,-4],[-34,6],[-9,8],[-18,40],[-7,2],[-31,-29],[-4,-16],[12,-54],[-2,-102],[3,-23],[33,-106],[55,-81],[138,-155],[8,-18],[15,-64],[7,-13],[9,-8],[11,-2],[15,6],[51,48],[44,51],[31,27],[18,2],[18,9],[21,17],[13,18],[7,19],[9,77],[8,37],[21,50],[8,14],[107,127],[9,16],[45,147],[17,67],[2,41],[-6,36],[3,30],[12,24],[13,16],[22,17],[13,24],[7,2],[19,0],[24,-16],[17,-3],[113,19],[0,9],[-66,31],[1,16],[5,21],[21,24],[26,7],[6,15],[0,19],[9,31],[-8,11],[-62,42],[-36,-2],[-9,5],[-31,35],[-11,50],[-1,20],[4,33],[4,9],[-2,15],[-8,20],[0,19],[6,16],[-4,19],[-14,22],[-6,18],[15,56],[1,17],[-15,24],[-10,9],[8,6],[25,2],[31,-7],[36,-18],[43,0],[52,17],[52,9],[91,-4],[21,-5],[90,-52],[70,-26],[32,3],[156,-11],[68,6],[35,-3],[68,-28],[-4,-24],[-30,-39],[-38,-8],[-34,-14],[32,-21],[92,-28],[22,-44],[6,-21],[-11,-18],[6,-10],[21,0],[55,16],[61,-10],[89,-35],[10,-7],[15,-27],[-2,-11],[-78,-67],[-41,-27],[-54,-27],[-1,-15],[75,-3],[58,-7],[27,-9],[14,-13],[19,-27],[3,-22],[-2,-29],[-6,-20],[-69,-59],[-31,-18],[-53,-21],[-23,-17],[-26,3],[-28,20],[-28,5],[-52,-17],[-29,1],[-13,-6],[-2,-13],[25,-37],[14,-14],[6,-11],[-11,-18],[3,-6],[8,-7],[47,-80],[10,-6],[10,3],[20,23],[13,9],[5,-1],[0,-12],[-22,-70],[-2,-19],[0,-17],[11,-35],[23,-38],[30,-35],[45,-46],[60,-49],[22,-24],[33,-56],[7,-22],[-9,-59],[-24,-97],[-15,-55],[-7,-14],[-45,-39],[-26,-9],[-42,1],[-14,-8],[-22,-31],[-30,-55],[-24,-35],[-17,-14],[-32,-17],[-50,-51],[-24,-20],[-86,-21],[-69,-68],[-28,-23],[-30,-12],[-32,-2],[-19,11],[-10,42],[-7,14],[-24,29],[-50,83],[-22,29],[-14,6],[-30,-5],[-14,3],[-33,26],[-11,17],[1,7],[25,9],[-11,14],[-43,37],[-18,20],[-2,6],[-43,26],[-43,7],[-53,-42],[-21,-29],[1,-9],[26,-11],[11,6],[22,26],[11,8],[33,-4],[28,-18],[10,-16],[4,-11],[75,-83],[26,-17],[12,-20],[8,-33],[16,-37],[36,-61],[39,-75],[8,-30],[-20,-14],[-10,-1],[-30,11],[-78,35],[-9,-1],[-20,-18],[-17,-42],[-5,-4],[-42,17],[-78,36],[-52,31],[-27,26],[-32,41],[-37,56],[-45,17],[-52,-20],[-76,-7],[-158,6],[-21,-5],[-8,-7],[14,-30],[-4,-9],[-10,-6],[-3,-9],[18,-32],[27,-23],[79,-30],[52,-25],[32,-22],[10,-19],[1,-20],[-15,-41],[-8,-15],[-183,-203],[-70,-82],[-35,-50],[-32,-33],[-27,-17],[-45,-9],[-62,-2],[-81,8],[-42,26],[-76,70],[-54,41],[-23,14],[-20,39],[-18,7],[-39,7],[-39,21],[-92,70],[-48,28],[-44,15],[-39,3],[-15,-4],[27,-36],[-12,-2],[-31,8],[-32,0],[-55,26],[-55,-4],[-39,5],[-48,14],[-51,7],[-82,0],[-29,-3],[-5,-7],[40,-31],[68,-37],[-9,32],[2,8],[23,11],[107,-19],[122,-42],[31,-4],[34,-15],[38,-25],[52,-51],[99,-116],[32,-29],[43,-27],[215,-40],[75,0],[149,-11],[79,-21],[22,-15],[7,-51],[-7,-26],[-43,-79],[-27,-58],[-168,-245],[-22,-57],[-9,-34],[-30,-34],[-76,-55],[-76,-46],[-46,-10],[-41,11],[-26,14],[-39,45],[-3,-4],[29,-72],[-7,-7],[-23,9],[-53,32],[-17,-6],[-10,-9],[-14,0],[-18,10],[-32,26],[-9,13],[-7,40],[-6,7],[-64,-23],[-10,-7],[26,-16],[9,-12],[25,-58],[2,-13],[-19,-8],[-61,23],[-7,-2],[30,-59],[12,-27],[1,-15],[-39,-66],[-25,-27],[-35,-10],[-21,6],[-24,17],[-18,-2],[-11,-22],[-20,-15],[-29,-9],[-37,4],[-45,17],[-120,62],[-37,9],[-70,9],[-9,9],[1,8],[10,8],[-3,7],[-15,6],[-15,-6],[-16,-16],[-28,-5],[-40,7],[-59,24],[-116,62],[-128,53],[-74,68],[28,-62],[-3,-20],[-14,-19],[-2,-18],[29,-44],[40,-15],[40,1],[1,7],[-16,11],[-15,16],[-7,24],[7,4],[36,-12],[23,-15],[177,-81],[53,-15],[40,-15],[11,-10],[-14,-20],[-71,-50],[-1,-8],[49,4],[59,45],[33,20],[32,13],[43,-22],[55,-56],[44,-32],[63,-18],[37,-19],[62,-53],[10,-27],[6,-111],[-2,-27],[-8,-27],[-14,-26],[-26,-15],[-38,-3],[-30,-11],[-65,-59],[-28,-9],[-117,18],[-45,16],[-21,-1],[-12,-13],[-12,-6],[-46,-5],[-8,-11],[3,-16],[9,-22],[11,-13],[18,-16],[26,-11],[53,-12],[6,-30],[-2,-10],[-18,-20],[-20,2],[-35,24],[-18,1],[-15,-13],[-21,-4],[-27,4],[-15,-10],[-3,-25],[-9,-19],[-31,-30],[-17,-22],[0,-18],[18,-12],[21,-28],[23,-45],[5,-19],[-15,5],[-19,18],[-24,29],[-36,27],[-80,35],[-15,-1],[8,-9],[53,-36],[20,-24],[3,-17],[-45,-38],[-1,-13],[12,-11],[3,-9],[-16,-18],[-26,-16],[-51,-2],[-4,-9],[19,-19],[6,-12],[-16,-16],[-11,-2],[-58,7],[15,-40],[9,-14],[18,-20],[32,-19],[1,-7],[-11,-16],[-19,-20],[-81,-59],[-56,-70],[-8,-22],[14,-45],[1,-12],[-15,-21],[-33,6],[-7,-8],[8,-22],[2,-31],[-5,-42],[-24,-66],[-43,-88],[-33,-81],[-23,-73],[-16,-36],[-31,-2],[-23,-23],[16,-12],[9,-14],[7,-21],[-7,-67],[-19,-111],[-13,-89],[3,-274],[-3,-121],[-9,-67],[-14,-37],[-24,-11],[30,-10],[20,-17],[9,-26],[8,-42],[12,-19],[13,3],[13,-4],[11,-12],[33,-59],[37,-17],[2,-33],[-15,-184],[0,-24],[17,46],[18,144],[23,63],[19,14],[77,7],[81,-16],[31,-2],[27,8],[28,-17],[6,-18],[8,-75],[8,-43],[48,-153],[23,-86],[29,-133],[10,-38],[59,-178],[11,-49],[5,-37],[-2,-26],[-11,-40],[-19,-54],[-18,-42],[-17,-28],[-18,-22],[-18,-14],[1,-3],[21,6],[20,15],[39,37],[15,8],[43,5],[1,-13],[-20,-28],[4,-2],[30,22],[64,31],[252,103],[59,9],[85,-19],[69,-43],[75,-56],[79,-41],[124,-38],[37,-18],[73,-19],[34,-21],[40,-52],[65,-67],[49,-42],[54,-39],[55,-73],[88,-164],[22,-20],[54,-27],[102,-35],[151,-81],[66,-32],[43,-13],[43,-22],[43,-32],[32,-35],[23,-38],[19,-25],[35,-28],[18,-19],[2,-30],[-42,-116],[-1,-10],[42,84],[24,24],[19,11],[39,-1],[59,-14],[53,0],[44,13],[39,6],[31,-1],[23,4],[14,10],[17,0],[68,-29],[27,-2],[99,-27],[63,10],[11,-5],[22,-36],[19,-3],[31,6],[31,-10],[51,-46],[23,-40],[23,-82],[2,-25],[-42,-190],[-13,-73],[-2,-65],[8,-36],[37,-62],[6,-17],[22,-91],[6,-39],[-3,-45],[-11,-75],[3,-56],[9,-85],[-3,-58],[-17,-31],[-11,-29],[-9,-54],[0,-21],[9,-40],[16,-23],[26,-25],[24,-38],[45,-92],[33,-51],[39,-75],[8,-38],[-11,-25],[-14,-17],[-32,-23],[-14,-17],[3,-4],[47,12],[27,-1],[23,-19],[19,-36],[32,-30],[43,-25],[44,-43],[74,-100],[13,-23],[19,-52],[26,-82],[13,-54],[1,-25],[-14,-25],[-49,-46],[-50,-81],[16,4],[32,34],[56,67],[30,13],[29,-7],[45,-20],[39,-27],[35,-36],[51,-95],[55,-76],[30,-65],[-9,41],[-20,48],[-51,76],[-22,39],[-5,19],[-2,21],[4,37],[10,55],[13,39],[16,22],[10,24],[6,25],[8,19],[44,33],[12,-3],[9,-41],[10,-8],[21,-6],[17,-15],[14,-21],[10,-23],[6,-22],[13,-73],[9,-34],[2,41],[11,65],[8,26],[27,39],[-2,17],[-11,22],[-56,97],[-1,24],[15,14],[11,26],[5,40],[12,28],[35,40],[30,62],[16,42],[12,23],[13,5],[-18,17],[-4,11],[-1,51],[-8,54],[-12,25],[-34,53],[-6,16],[-6,60],[4,30],[9,26],[-5,24],[-32,45],[-12,39],[-14,93],[-13,118],[-14,86],[-16,56],[-3,35],[9,14],[11,44],[10,10],[16,-2],[1,5],[-25,23],[-12,30],[1,11],[21,29],[-3,12],[-16,16],[-49,28],[18,10],[11,23],[-2,7],[-20,10],[-22,17],[-17,27],[-20,42],[-13,34],[-12,56],[-22,63],[-9,16],[-11,10],[-12,5],[0,10],[13,14],[210,106],[18,16],[103,59],[48,33],[48,48],[66,49],[32,31],[21,31],[105,122],[44,62],[26,53],[37,64],[49,75],[31,63],[13,54],[16,91],[4,82],[3,119],[-1,106],[-14,167],[-7,53],[-15,62],[-37,125],[-6,35],[-23,57],[-74,151],[-92,101],[-18,26],[-36,30],[-56,34],[-36,28],[-94,104],[-31,13],[-11,27],[-3,19],[4,50],[5,34],[7,26],[7,16],[52,77],[29,61],[20,34],[22,26],[41,34],[23,44],[-6,17],[-18,19],[-4,19],[31,47],[4,13],[-4,45],[6,10],[38,3],[54,-64],[13,5],[-17,18],[-21,43],[3,18],[40,47],[1,21],[-12,29],[-1,24],[23,55],[-6,12],[-65,11],[-11,16],[4,7],[31,19],[2,7],[-54,125],[-9,37],[23,46],[26,20],[-3,12],[-35,2],[-21,7],[-21,35],[8,23],[8,10],[20,54],[20,11],[-4,9],[-74,-23],[-35,19],[-35,-5],[-16,6],[6,19],[62,86],[29,47],[18,43],[10,28],[1,14],[-6,93],[3,26],[25,24],[37,44],[-51,41],[-32,39],[-21,20],[-16,19],[-21,40],[-15,53],[-17,106],[-3,58],[4,42],[7,21],[11,22],[47,41],[82,60],[64,24],[47,-13],[90,-15],[73,-34],[222,-86],[40,-38],[-37,-33],[5,-8],[84,62],[22,12],[19,3],[63,-24],[25,-4],[32,-20],[76,-66],[6,6],[-21,34],[12,15],[60,35],[62,29],[44,28],[47,37],[32,20],[16,2],[21,-11],[56,-49],[36,-25],[29,-26],[40,-47],[16,-10],[31,-32],[41,3],[13,-3],[4,-7],[7,-21],[4,-14],[0,-14],[-9,-42],[-30,-66],[13,-1],[18,14],[24,25],[19,9],[40,-20],[38,-32],[13,-17],[15,-28],[12,-15],[12,-27],[-1,-9],[-11,-14],[-46,-22],[9,-9],[53,14],[17,14],[11,24],[16,6],[63,-41],[9,-14],[-4,-11],[-10,-13],[-27,-14],[-24,-35],[-4,-15],[17,-11],[41,-4],[0,-8],[-24,-16],[-3,-20],[53,-71],[36,-32],[21,-5],[48,-2],[39,-12],[86,-40],[51,-8],[44,13],[29,2],[25,-16],[8,-11],[4,-23],[0,-34],[14,-24],[28,-14],[23,2],[31,27],[25,5],[9,20],[7,37],[8,20],[18,6],[15,-11],[9,-17],[16,-51],[4,-23],[-1,-20],[-8,-19],[-16,-20],[-23,-21],[-19,-31],[-22,-70],[-9,-46],[-2,-28],[1,-29],[4,-33],[9,-27],[21,-37],[1,-13],[2,-30],[-2,-14],[-12,-27],[-34,-26],[-46,-7],[-152,-1],[-41,6],[10,-24],[43,-8],[38,0],[145,-15],[20,-15],[17,-28],[12,-28],[12,-57],[2,-27],[-6,-31],[-15,-33],[-10,-44],[-5,-55],[8,-29],[78,-3],[15,-20],[-1,-15],[-28,-56],[-3,-15],[13,-38],[-2,-11],[-7,-11],[-8,-28],[-7,-46],[-9,-30],[-21,-22],[-11,-5],[-8,6],[-21,62],[-9,9],[-8,-6],[-4,-9],[0,-14],[-4,-14],[-7,-14],[-31,-23],[-50,-16],[1,-16],[34,-9],[43,-28],[25,-4],[38,22],[75,71],[31,19],[27,7],[30,1],[34,-5],[68,9],[17,-7],[20,-15],[25,-25],[17,-23],[9,-23],[15,-85],[21,-23],[4,-16],[2,-25],[-1,-49],[-23,-100],[-11,-36],[-31,-50],[-36,-23],[-64,-21],[-33,-18],[-25,-25],[-1,-13],[72,42],[79,20],[23,24],[17,22],[17,50],[32,130],[18,40],[25,7],[11,-14],[26,-76],[0,-19],[-7,-16],[-42,-74],[15,7],[43,70],[9,21],[5,32],[14,23],[5,-11],[13,-82],[0,-60],[3,-19],[-5,-56],[5,-10],[13,49],[4,37],[6,26],[7,16],[52,50],[61,40],[40,36],[33,17],[50,17],[31,33],[14,50],[12,35],[10,20],[33,34],[17,2],[17,-12],[20,-26],[21,-40],[13,-30],[4,-23],[4,-78],[4,0],[19,60],[3,21],[-2,23],[-6,22],[-20,49],[-7,31],[1,18],[22,11],[31,4],[5,8],[-23,21],[-1,11],[22,36],[13,1],[26,-5],[-5,18],[0,12],[7,5],[42,-11],[5,14],[36,1],[4,12],[-32,18],[-30,12],[-10,9],[-7,15],[-9,35],[2,9],[9,0],[14,-9],[9,18],[9,43],[9,18],[28,-21],[1,9],[-23,68],[4,13],[35,5],[21,-9],[55,-49],[11,5],[-9,14],[-28,29],[-26,19],[-23,9],[-17,16],[-19,45],[-3,18],[2,24],[13,50],[7,11],[14,8],[19,5],[21,-5],[44,-33],[7,11],[-23,18],[-13,16],[-6,21],[2,24],[19,49],[9,40],[39,109],[12,20],[12,12],[8,13],[31,3],[57,-39],[18,-23],[4,-32],[-30,-45],[-51,-33],[-16,-14],[10,-9],[49,27],[42,12],[34,0],[28,-53],[4,-73],[-16,-60],[21,30],[26,17],[22,-40],[2,-32],[12,-31],[24,-40],[25,-36],[-28,-37],[-33,-23],[7,-16],[46,-18],[6,-18],[-5,-24],[7,1],[32,36],[27,-5],[34,-79],[-25,-46],[-39,-21],[-30,-9],[-43,2],[-17,-7],[8,-15],[41,-1],[63,12],[47,19],[20,1],[22,-8],[7,-6],[-23,-13],[-1,-5],[8,-13],[18,-44],[-2,-10],[-17,-25],[27,-5],[38,12],[11,-14],[23,-52],[15,-53],[-64,-73],[-32,-15],[-48,-39],[-13,-31],[-28,-39],[18,0],[49,64],[24,15],[18,-4],[7,-11],[-3,-18],[16,3],[66,37],[28,7],[36,3],[3,-13],[-22,-89],[-38,-69],[-70,-42],[-24,-25],[-31,-40],[12,-7],[66,52],[45,21],[64,17],[28,-3],[51,-104],[28,-10],[24,5],[44,-30],[16,-29],[-4,-21],[-15,-13],[-7,-19],[18,-58],[-11,-33],[-32,-29],[-23,-14],[-24,-5],[-24,-25],[-10,-4],[-33,6],[11,-15],[16,-8],[26,-4],[30,8],[30,-1],[46,-19],[20,-23],[0,-6],[-10,-13],[-15,-42],[-10,-15],[9,-12],[23,-18],[17,-6],[23,6],[25,-8],[82,-99],[-4,-51],[-12,-40],[5,-44],[0,-55],[-44,-15],[-148,25],[-84,39],[-5,12],[24,26],[-21,2],[-24,-10],[-11,-10],[29,-41],[77,-36],[35,-44],[38,-4],[11,-8],[21,-25],[-6,-9],[-39,-3],[-30,-30],[19,-17],[69,-16],[49,-4],[25,-17],[-20,-19],[-58,-22],[-2,-33],[43,-14],[38,8],[16,-3],[11,-80],[7,-17],[-41,-14],[-1,-16],[28,-13],[45,-10],[15,-15],[3,-24],[9,-12],[26,-3],[29,30],[17,25],[25,-9],[1,-31],[30,-36],[10,-6],[9,-51],[24,45],[17,-9],[20,-2],[-7,-44],[-11,-34],[15,-22],[12,-32],[33,-43],[-9,-21],[-38,-45],[-20,-72],[-5,-24],[-20,-41],[-26,-40],[16,4],[60,73],[36,25],[78,13],[19,20],[29,9],[18,-23],[1,-42],[24,-14],[24,14],[22,-12],[-13,-26],[-71,-108],[-21,-44],[-6,-31],[24,43],[90,97],[9,14],[20,42],[18,27],[48,-10],[25,-19],[11,-55],[19,-59],[30,-65],[78,-32],[28,-6],[49,23],[7,30],[38,10],[27,-4],[9,-59],[29,-31],[28,-26],[27,-14],[40,-6],[22,-28],[0,-12],[-22,-30],[-22,-45],[-38,-31],[-53,-1],[-72,-20],[-3,-17],[-16,-19],[-39,-20],[-21,-14],[-35,-72],[-20,-31],[-24,-6],[-34,3],[-22,-6],[-16,-14],[-10,-19],[-7,-7],[-45,-20],[-82,-55],[-44,-2],[-26,7],[-21,-5],[-14,-15],[-39,-27],[-12,-16],[-7,-19],[-5,-38],[-5,-14],[-7,-8],[-33,8],[-37,25],[7,-27],[58,-44],[17,-25],[-16,-21],[-37,-34],[-4,-18],[15,-10],[-6,-15],[-20,-16],[2,-7],[2,-6],[51,23],[45,50],[29,50],[14,14],[58,19],[34,22],[49,39],[54,58],[58,76],[74,59],[91,42],[66,22],[42,1],[2,7],[-37,14],[-32,2],[-39,-10],[-12,24],[2,10],[12,17],[33,15],[161,-21],[55,-17],[60,-137],[14,-44],[4,-32],[-6,-20],[-24,-24],[-69,-48],[-9,-12],[-1,-7],[30,-9],[9,-14],[15,-52],[31,34],[58,83],[48,38],[40,11],[47,5],[17,-1],[6,-27],[25,-54],[23,-14],[45,-7],[40,-67],[15,-46],[14,-27],[-1,-19],[2,-15],[11,-23],[5,-19],[-3,-45],[-23,-77],[17,-71],[-7,-31],[-4,-51],[14,-33],[5,-20],[-13,-11],[-88,-28],[-35,-1],[-9,-17],[27,-5],[48,1],[59,-17],[27,-19],[11,-27],[-3,-21],[-17,-16],[-33,3],[-32,15],[2,-14],[47,-35],[14,-17],[26,-22],[5,-30],[-6,-30],[-90,-120],[-73,-76],[-74,-67],[-119,-129],[-12,-6],[-21,-3],[-57,21],[-45,-5],[-85,-25],[-24,-15],[-47,-45],[-18,-6],[-51,-9],[-47,6],[-19,-7],[-23,-21],[-6,-12],[-7,-38],[-115,-168],[-31,-57],[-59,-60],[-65,-106],[-57,-43],[-19,-58],[-54,-36],[-100,-9],[-47,-10],[-55,16],[-42,-25],[-62,-8],[-30,6],[-121,-57],[-31,54],[-23,21],[-68,3],[-55,22],[-50,4],[-48,10],[-32,0],[-33,-6],[-52,2],[-29,-30],[-96,9],[-41,27],[-34,6],[-44,-6],[-43,-20],[-94,22],[-100,-19],[-87,13],[-24,13],[-138,-35],[-53,20],[-48,-54],[-32,11],[-35,-8],[-12,11],[-23,-8],[-15,-29],[-20,-3],[-33,-52],[-56,-41],[-82,-226],[-7,-87],[-31,-59],[-27,-8],[-22,-1],[-141,-44],[-63,-34],[18,-27],[-21,-21],[-33,-8],[-36,-25],[-24,-28],[-11,-39],[-72,-64],[-84,-147],[-40,-108],[-49,-78],[-34,-30],[-25,-5],[-25,10],[-41,36],[-30,4],[-76,51],[-177,52],[27,-19],[23,-32],[47,-8],[47,0],[99,-63],[48,-22],[30,-19],[25,-43],[-18,-84],[-19,-69],[-24,-53],[-85,-137],[-41,-46],[-72,-163],[-74,-77],[-40,-47],[-42,-74],[-99,-56],[-37,-15],[-34,8],[-41,-46],[-49,-28],[-15,-42],[-117,-114],[-45,-15],[-39,-30],[-11,-51],[-34,-32],[-10,-23],[-29,-72],[-53,-94],[-66,-15],[-24,-32],[-27,-53],[-39,-36],[-77,17],[18,-22],[69,-34],[7,-51],[-34,-12],[-72,-68],[-98,-117]],[[15892,80064],[-11,21],[-27,26],[-10,0],[-11,-8],[-7,-12],[-6,-27],[-4,-8],[-4,1],[-3,7],[-8,37],[2,16],[9,20],[-1,7],[-20,-6],[-8,5],[-4,10],[1,42],[-11,23],[13,10],[32,8],[34,1],[9,18],[10,43],[-24,-40],[-14,-4],[-44,15],[-29,-2],[-4,8],[2,9],[6,9],[4,31],[7,85],[9,31],[3,16],[-2,4],[-38,-59],[-3,-19],[4,-16],[-4,-33],[-18,-10],[-10,5],[-20,-28],[-6,-3],[-91,50],[-10,6],[-15,23],[-23,40],[-7,34],[9,28],[8,14],[10,0],[10,-10],[21,-47],[8,-29],[22,4],[35,37],[8,14],[-35,-14],[-15,1],[-15,15],[-16,30],[-8,34],[0,107],[5,20],[17,16],[11,25],[-1,11],[-10,22],[-15,16],[-15,9],[-4,-3],[23,-46],[0,-18],[-26,-46],[-4,-13],[0,-45],[-3,-9],[-21,-13],[-23,-35],[-39,-12],[-36,4],[-20,17],[-61,86],[-22,36],[0,30],[-42,107],[0,23],[-14,33],[-16,5],[-4,32],[33,68],[21,58],[2,18],[-1,28],[-5,62],[5,27],[-21,-36],[-4,-26],[5,-27],[-3,-30],[-12,-43],[-21,-45],[-42,-21],[-74,12],[-8,6],[-5,15],[-4,66],[-5,-8],[-8,-35],[-7,-51],[-9,-11],[-15,-1],[-12,8],[-9,17],[-19,2],[-34,-14],[-17,6],[-19,0],[-40,15],[-47,4],[-12,11],[1,22],[8,11],[49,10],[48,23],[47,12],[-2,11],[-21,4],[-108,-26],[-34,4],[-6,4],[-1,26],[13,24],[21,23],[6,18],[-12,7],[-20,-5],[-9,14],[10,55],[-9,55],[-13,-52],[-19,-29],[-91,-13],[-15,-15],[-12,0],[-58,28],[-25,17],[-23,25],[-42,57],[-33,37],[-1,67],[7,43],[15,49],[59,104],[21,19],[18,7],[87,9],[65,13],[12,7],[-95,7],[-85,-5],[-29,-16],[-37,-67],[-9,-28],[-10,-21],[-7,0],[-12,7],[-4,9],[-6,22],[-19,34],[-9,40],[-5,59],[1,26],[10,34],[28,66],[-36,-2],[4,55],[13,61],[34,35],[34,26],[31,34],[55,22],[18,-46],[47,-14],[13,-21],[17,-38],[20,-36],[25,-35],[7,-3],[-11,30],[-40,65],[-2,23],[-10,25],[-52,36],[-10,14],[-9,36],[-4,24],[6,22],[53,69],[13,37],[0,17],[-5,19],[-11,34],[-3,0],[3,-51],[-2,-20],[-6,-22],[-8,-17],[-12,-11],[-114,-158],[-12,-9],[-42,-14],[-22,-17],[-12,-22],[-19,-58],[-25,-115],[-30,-93],[-25,121],[-46,92],[89,92],[2,14],[-8,49],[2,15],[8,21],[23,32],[-1,3],[-26,-12],[-41,-71],[-16,-22],[-8,-3],[-1,41],[22,109],[18,105],[6,30],[16,30],[-15,-2],[-72,-47],[-24,29],[-20,153],[-36,59],[-60,49],[-59,22],[-13,43],[-12,53],[16,62],[26,29],[23,14],[23,-7],[1,-22],[-15,-61],[20,-6],[81,-74],[17,-6],[34,28],[18,-1],[44,-23],[15,-28],[42,-54],[-6,32],[-46,66],[-25,22],[-45,4],[-28,-11],[-12,3],[-24,17],[-21,28],[-21,61],[-5,29],[1,21],[5,19],[9,17],[17,13],[26,7],[7,8],[-32,35],[-15,0],[-52,-51],[-10,-5],[-5,10],[-4,1],[-15,-25],[-12,-11],[-42,-79],[-7,-37],[-2,-57],[-5,-35],[-7,-14],[-50,-27],[-28,-55],[-34,48],[-38,45],[-25,80],[-45,14],[-52,45],[-20,41],[28,82],[41,63],[6,74],[6,16],[70,19],[46,37],[-47,4],[-29,-6],[-52,-26],[-57,51],[-29,47],[-10,40],[10,34],[2,34],[5,47],[5,20],[12,26],[25,17],[22,54],[9,37],[44,111],[16,48],[31,67],[61,105],[-20,-6],[-10,-9],[-9,1],[-9,11],[-9,24],[-8,35],[-5,-16],[-1,-66],[-6,-57],[-11,-39],[-30,-80],[-18,-31],[-12,29],[10,50],[17,40],[3,54],[-16,65],[-10,53],[-4,40],[-1,36],[3,33],[7,35],[11,39],[-1,4]],[[19495,97148],[49,-34],[17,1],[21,-6],[10,-9],[29,-43],[6,-21],[2,-27],[-5,-23],[-10,-19],[-27,-11],[-62,-8],[-87,11],[-75,-14],[-35,-2],[-93,9],[-24,7],[-52,26],[-40,11],[-16,-6],[-20,-23],[-37,-28],[-23,-7],[-68,4],[-103,48],[-118,-14],[-123,-28],[-48,-5],[-14,8],[-19,21],[3,11],[36,32],[82,33],[60,19],[118,28],[141,15],[52,17],[33,23],[92,37],[53,16],[73,13],[58,-1],[74,-30],[56,-15],[34,-16]],[[19317,96833],[223,-14],[9,-3],[1,-10],[-17,-33],[-25,-24],[-119,-30],[-153,-28],[-32,-13],[2,-8],[13,-10],[25,-12],[119,2],[29,-5],[10,-8],[6,-12],[4,-15],[0,-53],[-6,-30],[-17,-27],[-48,-20],[-86,-26],[-59,-11],[-46,4],[-46,-3],[-202,-48],[-62,-1],[-55,12],[-75,46],[-78,18],[-34,21],[-33,11],[-9,16],[-3,13],[6,11],[14,10],[4,9],[-13,25],[-6,24],[-22,35],[-4,20],[0,13],[4,14],[15,25],[8,5],[46,4],[60,13],[139,37],[305,47],[93,-4],[40,9],[75,4]],[[17902,96407],[21,-23],[2,-9],[-10,-9],[-33,-15],[-164,-51],[-32,-24],[12,-20],[59,-41],[60,-35],[13,-18],[-28,-17],[-55,5],[-20,-1],[-20,-8],[6,-16],[60,-52],[20,-28],[0,-14],[-11,-14],[-26,-19],[-40,-25],[-68,-19],[-148,-26],[-5,-21],[1,-15],[-3,-38],[-6,-18],[-17,-29],[-13,-14],[-22,-9],[-32,-6],[-40,0],[-67,26],[-30,16],[-42,35],[-8,24],[5,28],[11,45],[18,46],[25,46],[8,29],[-10,12],[-18,0],[-54,-19],[-35,-7],[-27,-13],[-20,-21],[-11,-22],[-6,-43],[-10,-23],[-29,-13],[-44,0],[-17,-7],[-8,-16],[6,-12],[43,-27],[6,-30],[-6,-18],[-46,-33],[-11,-11],[-29,-52],[-11,-13],[-24,-12],[-24,1],[-23,19],[-33,36],[-22,31],[-12,26],[-9,11],[-16,-8],[-19,-26],[0,-21],[4,-31],[-1,-19],[-28,-23],[4,-10],[49,-28],[6,-12],[0,-19],[-3,-9],[-20,1],[-16,-22],[-19,-17],[-49,-33],[-69,-4],[-57,-16],[-12,1],[-14,26],[-15,50],[-14,29],[-20,15],[-26,58],[-12,18],[-11,8],[-10,2],[-15,-12],[-33,-82],[-54,-21],[-29,-4],[-30,2],[-74,23],[-60,8],[-41,-9],[-68,-34],[-27,-9],[-37,4],[-16,13],[-14,21],[-1,12],[10,5],[17,24],[0,9],[-17,14],[0,11],[6,7],[-2,6],[-8,3],[-17,-3],[-61,-16],[7,17],[29,37],[71,72],[26,21],[16,6],[209,24],[15,7],[99,97],[28,22],[29,18],[143,58],[13,14],[22,40],[13,10],[31,16],[102,82],[94,59],[47,37],[65,37],[75,16],[227,28],[163,-37],[38,-2],[19,10],[17,17],[25,-7],[60,-5],[14,4],[25,19],[-17,11],[-73,19],[-5,10],[2,9],[26,23],[31,14],[90,11],[41,-3],[43,-15],[55,-32],[127,-56]],[[19919,95654],[35,-1],[41,6],[46,-4],[21,-13],[15,-23],[0,-13],[-3,-10],[-6,-9],[-60,-58],[-14,-20],[19,-5],[10,3],[59,44],[45,13],[34,4],[57,-9],[22,-8],[15,-8],[9,-11],[22,-41],[16,-54],[2,5],[1,31],[3,23],[55,16],[1,5],[-20,13],[-16,18],[-12,33],[4,12],[12,14],[35,28],[42,17],[36,4],[137,-29],[54,-25],[21,-12],[8,-9],[12,-28],[23,-78],[-1,-25],[-10,-40],[-44,-76],[-7,-51],[-44,-127],[-31,-35],[-33,-24],[-138,-43],[-104,-43],[-26,-7],[-27,-1],[-86,15],[-99,27],[-57,-7],[-56,-20],[-36,-6],[-33,3],[-33,7],[-44,19],[23,8],[10,10],[-9,10],[-46,14],[-48,-32],[-139,-73],[-187,-25],[-58,-15],[-44,-19],[-22,-16],[-35,-38],[-53,-28],[-96,-31],[-123,-48],[-220,-49],[-138,-8],[-138,16],[-44,13],[-46,21],[-93,49],[-26,17],[-31,39],[18,25],[50,30],[75,26],[150,36],[135,58],[49,11],[130,9],[66,-5],[48,3],[31,8],[47,20],[68,42],[50,39],[12,18],[-16,17],[-25,2],[-81,-40],[-41,-13],[-44,-1],[-61,-14],[-60,-5],[-11,0],[-62,39],[-33,6],[-16,-4],[-14,-10],[-26,-28],[-16,-10],[-27,-8],[-107,-8],[-104,-14],[-23,9],[-14,16],[-3,10],[-1,33],[-7,14],[9,28],[12,21],[14,15],[71,43],[10,11],[-34,-2],[-80,-21],[-11,7],[-18,24],[-9,2],[-11,-10],[-6,-14],[-13,-58],[-13,-30],[-32,6],[-40,18],[-15,3],[-9,-6],[3,-10],[41,-50],[0,-17],[-26,-31],[-114,-51],[-44,-13],[-16,5],[-14,14],[-13,22],[-29,31],[-18,7],[-19,1],[-18,-7],[-17,-13],[-10,-15],[-10,-26],[-20,-21],[-13,-3],[-115,42],[-93,75],[-101,-11],[-46,2],[-138,28],[-17,17],[-10,22],[1,12],[6,12],[17,25],[35,37],[15,12],[21,10],[29,8],[73,4],[189,2],[37,5],[206,72],[24,12],[30,23],[7,10],[-1,6],[-254,-57],[-109,-12],[-166,9],[-31,9],[-8,16],[35,42],[18,16],[48,15],[114,21],[154,19],[100,0],[84,15],[51,17],[-170,-1],[-204,-8],[-30,5],[-58,23],[-3,16],[23,19],[9,15],[-17,33],[5,13],[38,27],[68,29],[42,5],[81,-11],[230,-10],[45,4],[-28,13],[-40,9],[-178,17],[-37,7],[-7,10],[-3,15],[2,19],[13,20],[55,42],[162,35],[64,5],[65,-3],[65,-15],[29,-14],[15,-16],[7,-16],[1,-26],[3,-11],[12,-17],[37,-42],[28,-13],[128,24],[53,6],[54,-8],[78,-24],[101,-75],[130,-77],[-1,-16],[-49,-26],[-10,-11],[7,-7],[50,-5],[46,4],[45,-6],[10,-7],[16,-28],[23,-49],[27,-37],[31,-24],[31,-13],[45,-1],[46,8],[74,-3],[381,-28],[23,5],[16,15],[9,26],[4,22],[-5,29],[-8,14],[-236,94],[-21,38],[116,54],[8,12],[2,17],[-4,21],[-15,21],[-62,39],[-55,6],[-82,38],[-12,10],[-11,15],[-8,21],[1,16],[11,12],[80,39],[33,21],[100,98],[46,39],[33,19],[34,11],[74,5],[77,-36],[17,-2],[7,-10],[-3,-17],[-10,-16],[-27,-29],[-7,-12],[2,-13],[19,-29],[6,-19],[4,-32],[3,-5],[47,-27],[42,-36],[20,-55],[-16,-19],[-35,-27],[-21,-22],[-7,-18],[5,-10],[27,-6]],[[18188,93659],[18,-7],[32,6],[47,19],[60,15],[74,13],[19,-15],[12,3],[22,24],[4,16],[-3,18],[1,40],[12,23],[44,50],[23,18],[37,9],[89,-6],[84,-28],[112,-28],[165,-71],[52,-30],[5,-26],[-29,-55],[-71,-79],[-57,-28],[-22,-18],[37,-12],[24,-20],[36,29],[27,33],[38,27],[13,3],[3,-6],[-7,-14],[-2,-14],[1,-13],[4,-8],[23,-4],[13,5],[50,38],[49,59],[75,38],[20,19],[65,16],[-1,12],[3,44],[-22,19],[-77,40],[-37,48],[8,37],[42,-5],[115,-4],[24,-5],[111,-62],[39,-39],[31,-19],[65,-28],[22,-23],[16,-9],[5,-10],[-5,-10],[-2,-23],[12,-8],[42,-9],[12,-9],[16,-30],[19,-50],[17,-55],[27,-103],[54,-137],[18,-86],[7,-16],[12,-11],[34,-16],[27,-22],[31,-7],[7,2],[8,19],[20,31],[94,59],[5,9],[-11,14],[-3,9],[1,7],[20,5],[-66,75],[-43,71],[-27,89],[-4,25],[-4,55],[-9,15],[-15,13],[-6,17],[2,21],[-3,18],[-17,37],[-67,261],[0,26],[9,19],[24,11],[38,2],[13,6],[-15,10],[-25,27],[-3,13],[17,26],[86,-11],[62,-24],[106,-55],[11,3],[12,28],[22,17],[34,-6],[96,-40],[112,-71],[74,-36],[53,-48],[35,-45],[23,-35],[1,-13],[-5,-14],[5,-19],[16,-22],[8,-20],[7,-43],[15,-56],[3,-28],[99,-250],[19,-45],[12,-20],[69,-97],[37,-70],[3,-48],[5,-13],[2,-22],[-2,-30],[-8,-25],[-14,-22],[-14,-30],[-22,-67],[-1,-16],[15,-23],[97,-79],[59,-95],[28,-16],[74,-59],[81,-34],[27,-15],[26,-21],[7,-1],[16,4],[4,6],[1,9],[-22,45],[-2,17],[11,3],[83,-76],[45,-31],[61,-32],[105,-74],[15,-6],[57,7],[15,-5],[10,-7],[4,-10],[2,-44],[16,-21],[90,9],[25,-2],[16,-7],[13,-14],[20,-47],[17,-92],[1,-33],[-8,-56],[-13,-20],[-17,-7],[-48,7],[-33,17],[-18,23],[-16,48],[-7,10],[-7,-10],[-16,-45],[-10,-19],[-13,-14],[-24,4],[-35,19],[-66,50],[-23,12],[-15,-2],[-31,-17],[-49,-31],[-20,-23],[8,-15],[6,-19],[3,-22],[-2,-17],[-6,-10],[-16,-13],[-34,-2],[-49,9],[-39,18],[-68,46],[-15,6],[-21,-10],[-8,-14],[13,-19],[34,-24],[42,-41],[11,-8],[11,0],[4,-7],[5,-22],[-2,-38],[-21,-76],[-2,-18],[9,4],[57,75],[29,21],[65,32],[27,24],[82,7],[30,-13],[18,-23],[1,-10],[-21,-27],[-4,-14],[-1,-17],[2,-15],[5,-13],[14,-13],[26,6],[8,-4],[14,-13],[9,-20],[0,-29],[-19,-62],[-34,-21],[-105,-37],[-36,-20],[-70,-14],[-26,-18],[-17,-5],[-74,2],[-85,-11],[-98,23],[-69,10],[-79,36],[-30,-9],[-31,-24],[-148,28],[-18,20],[6,14],[35,42],[2,9],[-1,8],[-68,7],[-75,23],[-75,11],[-57,-3],[-37,8],[-36,19],[-19,17],[-4,16],[0,17],[3,34],[-5,24],[-16,18],[-34,17],[-33,-2],[-28,-18],[-26,-35],[-50,-96],[-24,-16],[-65,-70],[-24,-17],[-117,-27],[-140,-11],[-52,-22],[-49,-40],[-60,-39],[-146,-48],[-135,-27],[-142,-12],[-105,-18],[-31,9],[-47,-3],[-51,-27],[-57,-5],[-219,-10],[-100,-17],[-55,-5],[-44,2],[-30,8],[-28,23],[-30,37],[-60,97],[-17,41],[6,70],[-4,40],[-20,88],[-4,7],[-105,33],[-70,10],[-104,2],[-128,-4],[-127,10],[-68,12],[-67,19],[-114,51],[-7,5],[-8,17],[-12,28],[-28,37],[-78,82],[-31,49],[-5,13],[-7,36],[-10,59],[-3,36],[9,22],[7,5],[162,43],[284,47],[261,32],[118,-3],[69,-15],[70,-7],[126,-3],[160,-22],[31,2],[72,15],[21,12],[113,-2],[22,8],[20,13],[-26,25],[-108,55],[-286,97],[-70,21],[-100,22],[-58,3],[-74,-12],[-28,0],[-72,-19],[-69,-12],[-131,-12],[-189,-8],[-26,2],[-39,15],[-28,4],[-185,-11],[-165,15],[-188,149],[-32,46],[7,18],[23,20],[93,58],[34,13],[139,31],[138,38],[110,35],[53,12],[52,2],[42,11],[-9,11],[-34,13],[0,18],[18,9],[69,9],[72,-11],[37,3],[10,13],[-10,9],[-69,21],[-331,-59],[-155,-5],[-107,-26],[-59,1],[-70,25],[-10,8],[-1,10],[22,34],[75,20],[38,57],[-41,1],[-134,-12],[-59,5],[-79,22],[-23,26],[-10,18],[-2,23],[3,63],[6,34],[5,8],[98,105],[62,22],[43,33],[1,13],[-10,14],[-40,34],[-17,17],[-9,17],[7,25],[23,36],[67,57],[162,114],[82,48],[79,26],[110,55],[284,91],[254,92],[93,-24],[27,-19],[12,-16],[10,-23],[9,-29],[12,-63],[1,-32],[-2,-33],[-6,-29],[-9,-27],[-19,-32],[-29,-38],[-60,-65],[-7,-19]],[[16740,94534],[2,-2],[71,53],[44,3],[30,-5],[10,-6],[6,-11],[3,-23],[2,-58],[4,-7],[9,3],[16,14],[78,85],[33,23],[23,7],[96,13],[65,0],[71,-8],[54,-12],[88,-35],[69,-40],[63,-43],[212,-161],[90,-47],[35,-27],[15,-20],[13,-25],[4,-23],[-5,-21],[-10,-15],[-21,-13],[-130,-54],[-69,-16],[-67,-24],[-162,-84],[-111,-40],[-144,-78],[-272,-126],[-32,-25],[-15,-18],[-77,-143],[-29,-33],[-71,-34],[-89,-9],[-25,-9],[-5,-50],[-32,-82],[-15,-55],[-22,-148],[-5,-15],[-16,-28],[-28,-29],[-86,-35],[-64,-18],[-86,-15],[-21,10],[-21,24],[-22,2],[-13,-4],[-114,-103],[-109,-41],[-47,-38],[-33,-18],[-27,-5],[-44,3],[-32,17],[-29,27],[-22,28],[-56,118],[-24,40],[-21,20],[-55,72],[-15,14],[-209,91],[-101,51],[-25,18],[-23,11],[-130,-7],[-18,2],[-4,8],[15,27],[6,16],[2,17],[-2,27],[2,4],[49,27],[-8,5],[-5,10],[-4,15],[5,11],[15,6],[17,24],[21,43],[15,24],[22,16],[38,41],[27,17],[23,21],[1,9],[-10,8],[-3,16],[5,50],[-1,25],[5,22],[8,17],[11,11],[97,37],[4,10],[2,12],[-3,14],[-5,9],[-15,8],[-26,2],[-23,21],[-5,10],[9,29],[44,45],[14,22],[48,101],[86,63],[23,67],[65,72],[0,10],[-21,24],[-60,17],[-29,26],[-19,29],[-87,170],[-15,13],[-5,20],[-18,13],[4,12],[341,51],[235,16],[243,44],[68,2],[52,-8],[52,-23],[69,-40],[90,-39],[170,-58],[106,-12],[-42,-45],[-6,-14],[0,-10]],[[30697,99663],[227,-10],[73,4],[84,-26],[51,-3],[83,5],[61,-6],[226,-6],[47,-10],[-1,-11],[-48,-26],[-66,-25],[-423,-82],[-31,-13],[83,-4],[121,3],[94,9],[111,28],[37,2],[70,13],[137,38],[109,20],[49,-9],[42,-14],[28,-2],[15,11],[23,30],[14,11],[36,7],[22,-1],[35,-14],[40,-33],[36,-23],[20,0],[83,26],[41,3],[96,-9],[39,-12],[7,-12],[-25,-13],[-16,-11],[-6,-10],[14,-11],[58,-23],[83,-51],[-1,-19],[-45,-38],[1,-9],[214,40],[217,-18],[61,-12],[23,-15],[25,-24],[27,-34],[-19,-35],[-95,-55],[-98,-43],[-58,-38],[-88,-22],[-305,-92],[-149,-30],[-85,-30],[-39,-5],[-181,6],[-48,-16],[-26,-28],[-58,-13],[-84,-9],[-172,-7],[-39,-31],[-10,-21],[-17,-16],[-15,-8],[-492,-111],[-10,-18],[50,-8],[63,8],[717,134],[137,9],[128,-10],[-14,-31],[-181,-88],[-231,-80],[-115,-61],[-291,-104],[-237,-105],[-92,-52],[-122,-95],[-42,-23],[-51,-9],[-60,4],[-54,14],[-72,35],[-65,39],[-21,7],[13,-19],[126,-132],[-14,-25],[-232,-27],[-103,-23],[-53,-6],[-38,4],[-36,-2],[-36,-10],[-2,-10],[32,-11],[92,-9],[206,30],[33,-2],[52,-15],[3,-13],[-55,-42],[-166,-50],[21,-2],[48,-18],[-1,-16],[-52,-38],[-25,-12],[-160,-35],[-70,-8],[-62,4],[-281,77],[-99,11],[-94,19],[-69,-3],[-74,-22],[33,-12],[136,-21],[114,-4],[47,-9],[18,-14],[49,-51],[8,-27],[-11,-25],[-15,-18],[-18,-10],[-30,-5],[-111,3],[-41,-6],[-48,-15],[-61,-6],[-109,3],[-128,-22],[-67,-4],[-76,10],[-81,24],[-86,12],[-145,11],[12,-14],[51,-6],[104,-37],[50,-51],[47,-8],[96,-42],[69,-6],[72,-14],[102,18],[68,-3],[-14,-102],[-30,-10],[-164,0],[-79,15],[-34,15],[-76,17],[-68,-10],[-62,2],[-42,-10],[-67,1],[-174,-18],[-92,0],[-68,11],[-79,4],[-90,-4],[7,-12],[38,-4],[55,-19],[52,-29],[43,-13],[51,7],[52,14],[190,23],[84,3],[75,-10],[49,-12],[35,-15],[44,-40],[109,-5],[84,-13],[133,-58],[37,-4],[15,-15],[-28,-38],[-4,-22],[-92,-44],[-144,-12],[-158,4],[-113,-5],[-12,-6],[78,-11],[180,-51],[69,-28],[13,-16],[-100,-61],[-87,-122],[-29,-10],[-30,-3],[-77,2],[-98,-30],[-74,-6],[-134,11],[-154,-1],[-13,-19],[-7,-38],[1,-57],[9,-76],[-8,-56],[-26,-35],[-32,-26],[-58,-25],[-60,-16],[-44,-5],[-75,-1],[-213,-18],[-105,1],[-81,8],[-83,25],[-140,71],[-40,16],[-38,9],[1,-15],[42,-40],[35,-26],[28,-11],[-7,-12],[-62,-20],[-67,-8],[-81,0],[-2,-7],[27,-21],[35,-19],[24,-6],[61,6],[72,24],[44,8],[89,-6],[35,-9],[110,-54],[16,-2],[82,27],[118,1],[44,-21],[16,-43],[2,-34],[-12,-26],[27,-25],[67,-25],[52,-6],[37,14],[56,35],[24,8],[23,-2],[34,-25],[46,-48],[5,-56],[-38,-64],[-46,-42],[-180,-69],[-55,-27],[-43,-28],[-63,-26],[-123,-34],[-64,-6],[-140,-37],[-31,-2],[-45,6],[-9,18],[11,32],[15,30],[19,27],[0,23],[-39,35],[-28,16],[-27,9],[-54,-5],[-30,-10],[-33,-2],[-35,6],[-29,15],[-59,63],[-22,8],[-29,-2],[-25,9],[-23,20],[-38,19],[10,-15],[38,-35],[26,-36],[15,-35],[-7,-27],[-321,-16],[-138,8],[-28,25],[-66,103],[-14,-183],[-241,-30],[-56,5],[-93,20],[-121,50],[-50,33],[-20,32],[-15,18],[-9,3],[-30,-39],[-33,-81],[-83,21],[-104,20],[-38,80],[-2,-115],[-169,15],[-81,-4],[-23,100],[-4,112],[-33,-71],[14,-59],[5,-73],[-72,21],[-157,10],[-56,10],[7,96],[13,97],[202,96],[60,45],[44,18],[69,12],[89,7],[60,-6],[70,6],[82,17],[59,5],[11,6],[-17,9],[-63,62],[-23,14],[-23,6],[-45,3],[-45,27],[-25,24],[-28,32],[-43,62],[-44,69],[22,37],[72,30],[72,21],[73,11],[60,0],[73,-16],[103,-32],[59,-36],[74,-76],[49,-61],[39,-27],[177,-50],[59,-8],[70,4],[143,13],[70,14],[31,16],[16,23],[21,18],[63,41],[96,85],[54,68],[12,22],[11,28],[9,32],[-30,-17],[-167,-167],[-35,-30],[-97,-51],[-42,-8],[-66,2],[-89,23],[-104,-36],[-63,9],[-56,25],[0,118],[-71,95],[78,48],[65,29],[115,77],[26,1],[84,-12],[-46,17],[-45,26],[-100,-7],[35,166],[-67,-124],[-68,-65],[-42,-33],[-46,-18],[-176,-17],[43,61],[40,90],[-42,-34],[-99,-50],[-74,-27],[-61,-14],[-118,4],[-59,25],[17,62],[0,77],[36,35],[54,46],[59,61],[40,63],[158,29],[153,11],[128,34],[63,6],[60,-16],[244,-26],[100,-20],[44,-15],[33,-5],[34,22],[44,21],[152,-2],[42,3],[39,10],[47,20],[56,30],[8,15],[-38,-1],[-39,-8],[-58,-21],[-56,-12],[-57,2],[-115,19],[-200,3],[-102,8],[-47,9],[-27,12],[-23,19],[-20,25],[10,17],[41,10],[35,2],[57,-14],[63,-23],[69,-3],[-24,21],[-88,42],[-60,36],[-51,44],[-40,43],[-87,68],[-70,68],[-50,30],[-52,15],[-160,18],[-32,12],[-76,59],[-20,100],[-34,61],[32,77],[54,35],[318,-27],[135,4],[172,-10],[92,-19],[106,-47],[94,-53],[91,-36],[83,-48],[91,-73],[54,-34],[47,-21],[62,-19],[118,-23],[103,-7],[53,3],[57,16],[41,20],[-45,6],[-119,-3],[-82,11],[-47,23],[-50,31],[-79,59],[-60,39],[-131,63],[-97,62],[-78,60],[-7,25],[56,18],[69,13],[432,40],[258,48],[105,56],[12,13],[346,78],[244,29],[94,5],[85,13],[3,7],[-74,11],[-75,5],[-171,0],[-152,9],[-46,18],[10,28],[14,25],[46,40],[49,31],[209,88],[140,38],[41,25],[-302,-57],[-106,-41],[-106,-62],[-55,-19],[-39,5],[-35,-6],[-31,-16],[-25,-30],[-21,-44],[-19,-30],[-17,-16],[-43,-23],[-104,-44],[-242,-63],[-82,-16],[-70,-3],[-226,-35],[-68,-2],[-76,11],[33,31],[119,56],[32,25],[-77,-5],[-78,-16],[-172,-12],[-69,-23],[-66,-42],[-53,-26],[-40,-11],[-55,-6],[-202,-3],[-45,2],[-116,32],[-103,-11],[-43,2],[-78,23],[-23,14],[3,20],[45,37],[53,35],[170,78],[109,37],[158,31],[369,35],[17,26],[-374,-29],[-318,-36],[-52,-14],[-74,-35],[-235,-129],[-70,-33],[-106,-7],[-81,11],[-63,16],[-109,38],[-83,21],[-39,13],[-23,14],[-18,17],[-15,18],[27,16],[210,33],[284,-6],[128,7],[125,20],[186,51],[201,71],[40,22],[-74,5],[-54,-5],[-131,-26],[-208,-68],[-181,-24],[-448,-13],[-142,-19],[-63,4],[-47,19],[-52,34],[9,28],[107,31],[84,7],[15,7],[-119,30],[-11,15],[69,34],[148,50],[76,15],[137,10],[142,-5],[5,9],[-140,19],[-105,4],[-138,-14],[-369,-80],[-31,2],[-53,14],[15,20],[197,85],[6,13],[-141,-2],[-42,4],[-40,10],[-58,-9],[-75,-27],[-52,-12],[-31,4],[-78,33],[10,27],[62,35],[57,25],[77,23],[126,29],[90,10],[148,0],[70,13],[62,22],[78,36],[86,25],[140,20],[118,-6],[65,-18],[51,-31],[56,-24],[5,19],[46,24],[58,10],[69,-3],[61,-12],[79,-28],[63,-13],[30,0],[38,16],[99,1],[-2,6],[-32,17],[-40,12],[-352,82],[-10,18],[119,17],[74,21],[35,5],[87,43],[57,22],[105,25],[43,-7],[53,-22],[51,-14],[151,-13],[65,-14],[115,-81],[46,-26],[66,-27],[39,-10],[77,-6],[8,15],[-92,38],[-25,22],[11,18],[20,10],[28,1],[72,-17],[192,-56],[288,-67],[110,-15],[68,-24],[62,-29],[61,-20],[11,2],[-57,45],[-139,55],[-371,94],[-147,50],[-72,33],[-53,34],[-1,19],[50,21],[68,17],[85,7],[11,7],[-78,26],[-45,22],[1,16],[93,12],[57,-4],[108,-28],[91,-13],[15,8],[-94,75],[-9,17],[14,9],[33,10],[98,-5],[161,-37],[290,-18],[79,3],[-12,8],[-115,23],[-121,30],[-53,18],[-39,24],[-47,21],[-4,9],[75,16],[196,-3],[182,-24],[155,9],[97,-6],[39,-8],[70,-26],[224,-96],[23,-15],[26,-23],[27,-32],[38,-8],[74,21],[49,21],[-21,20],[-124,46],[-28,20],[-61,34],[-139,59],[-37,28],[-23,24],[383,22],[370,-20],[60,-14],[40,-19],[38,-30],[60,-30],[119,-46],[171,-29],[-33,20],[-127,51],[-58,35],[1,23],[10,18],[20,13],[144,47],[206,15],[24,-3],[161,-73],[76,-30],[53,-12],[2,5],[-74,34],[-56,18],[-6,12],[94,35],[59,9],[251,10],[28,-3],[24,-10],[59,-39],[22,-5]],[[23476,96654],[70,-22],[76,11],[81,2],[182,-10],[120,6],[31,-3],[47,-14],[25,-18],[23,-28],[-59,-18],[-50,-89],[-7,-5],[-54,-1],[-27,-7],[-159,13],[-438,5],[-19,11],[-58,53],[-4,21],[11,24],[12,16],[14,8],[128,39],[55,6]],[[24016,95061],[18,-43],[3,-18],[1,-37],[-8,-49],[-5,-9],[-7,-4],[-4,-13],[0,-21],[-7,-12],[-15,-5],[-99,-10],[-62,2],[-91,-6],[-45,3],[-30,11],[-43,22],[-91,55],[-45,2],[-116,19],[-63,58],[-24,11],[-25,-18],[-7,4],[-6,12],[-7,20],[-12,10],[-48,-5],[-9,6],[-2,18],[0,15],[9,23],[51,65],[25,5],[31,12],[17,35],[-2,33],[48,49],[28,15],[51,34],[172,54],[48,4],[63,-4],[62,-17],[47,-28],[97,-70],[44,-43],[23,-43],[21,-25],[26,-54],[-9,-21],[-6,-28],[3,-14]],[[22221,94438],[235,-123],[33,10],[71,6],[73,19],[102,15],[63,27],[26,8],[45,5],[25,0],[70,-15],[29,-11],[15,-11],[16,-19],[28,-49],[4,-18],[-1,-5],[-26,-30],[-17,-13],[-36,-12],[-30,-4],[-27,-21],[-29,5],[-9,-19],[4,-12],[8,-6],[15,1],[17,8],[33,-4],[18,-13],[15,-21],[-11,-20],[-59,-27],[-87,-31],[-105,-98],[-56,-41],[-11,-13],[-6,-13],[2,-24],[2,-10],[16,-4],[51,34],[34,16],[33,9],[60,0],[25,-5],[44,-20],[41,-32],[9,-11],[-4,-11],[-17,-12],[-2,-8],[39,-15],[43,-43],[3,-26],[-19,-26],[-5,-18],[9,-8],[21,5],[51,29],[55,15],[22,-2],[14,-6],[14,-40],[12,-45],[2,-37],[-9,-31],[-13,-23],[-33,-30],[-30,-11],[-16,0],[2,-5],[35,-25],[15,-19],[6,-19],[-2,-18],[-5,-16],[-41,-57],[2,-9],[12,-3],[26,-33],[3,-78],[-93,-24],[-22,-18],[-25,-28],[-29,-22],[-67,-22],[-33,-3],[-167,19],[-17,11],[-11,19],[-7,29],[-1,22],[2,16],[0,9],[-5,3],[-19,-16],[-19,-29],[11,-33],[52,-91],[10,-39],[2,-16],[-3,-13],[-59,-53],[-34,-18],[-36,-9],[-33,7],[-32,22],[-24,10],[-51,-1],[-15,11],[-15,22],[-35,76],[-50,54],[-42,61],[-108,89],[-56,53],[-75,86],[-31,19],[-26,8],[-51,6],[-12,11],[-19,29],[-32,22],[-11,3],[-19,-6],[-50,-20],[-63,22],[-14,15],[-8,25],[-8,14],[-21,13],[-18,31],[-119,63],[-71,72],[-14,26],[-2,10],[7,35],[17,39],[21,39],[14,16],[46,33],[37,8],[51,-4],[27,-8],[24,-22],[11,-26],[12,-18],[38,-19],[20,-15],[30,-36],[24,-43],[21,-14],[52,-5],[53,7],[114,27],[5,4],[7,16],[13,98],[8,0],[39,-45],[11,-5],[16,9],[10,23],[-1,10],[-24,53],[-15,23],[-13,15],[-14,4],[-31,-4],[-24,10],[-5,15],[4,19],[13,21],[14,12],[27,6],[32,-6],[44,-25],[28,-6],[40,7],[-51,15],[-70,58],[-30,11],[-36,-25],[-25,-9],[-47,-12],[-37,-2],[-156,89],[-9,9],[-11,23],[1,11],[16,17],[38,22],[58,13],[39,3],[34,-17],[49,-44],[43,-26],[4,9],[-8,26],[-20,38],[-14,10],[-34,11],[-33,26],[-15,20],[-8,20],[-1,22],[7,15],[13,8],[120,22],[83,-24],[53,-4],[22,30],[-7,6],[-28,-8],[-32,0],[-19,17],[-1,9],[25,23],[37,10]],[[26411,89435],[10,-7],[11,4],[20,29],[44,82],[13,7],[18,-1],[65,-52],[24,-30],[13,-41],[14,-16],[51,-21],[49,-7],[65,-21],[23,-16],[51,-78],[6,-5],[59,-32],[89,-72],[23,-10],[87,-24],[32,-17],[30,-27],[34,-49],[39,-77],[31,-123],[2,-24],[-3,-14],[-12,-16],[-50,-50],[4,-9],[48,4],[105,31],[65,-23],[22,-3],[5,1],[24,39],[25,-6],[38,-38],[24,-30],[10,-23],[-2,-13],[-25,-5],[60,-22],[53,-35],[-11,-23],[-57,-51],[-57,-45],[-67,-66],[-17,-11],[-9,0],[-37,12],[-54,32],[-164,73],[-51,15],[-64,9],[-9,17],[-16,110],[-29,19],[-99,23],[-29,13],[-2,22],[7,38],[-14,19],[-33,-1],[-33,-8],[-53,-26],[-25,-24],[-9,-25],[-6,-55],[-7,-26],[-18,-35],[-82,-88],[-33,-27],[-33,-7],[-13,-9],[-22,-32],[-33,-80],[-14,-23],[-21,-24],[-46,-36],[-46,-29],[-77,-33],[-42,-11],[-29,11],[-20,76],[-41,223],[-7,15],[-8,9],[-10,4],[-138,-29],[-76,3],[-75,-50],[-19,-3],[-39,1],[-27,8],[-7,6],[-5,21],[2,23],[9,25],[34,66],[28,41],[13,13],[129,74],[31,24],[16,25],[0,25],[-6,33],[-23,80],[-5,73],[0,36],[8,55],[33,135],[11,66],[20,234],[11,67],[16,62],[15,37],[42,73],[31,30],[41,20],[8,-2],[8,-9],[15,-31],[56,-29],[18,-28],[12,-31],[7,-40],[-7,-18],[-26,-27],[-5,-11],[1,-9],[51,-42],[38,-102]],[[22861,95890],[3,-26],[-4,-19],[-9,-14],[-1,-17],[9,-18],[37,-45],[12,-25],[2,-25],[-2,-17],[-23,-32],[-10,-43],[-1,-22],[14,-35],[0,-16],[-26,-28],[-54,-25],[8,-13],[117,-30],[9,-7],[0,-70],[20,-76],[-8,-1],[-28,24],[-52,28],[-63,-53],[7,-90],[42,-40],[12,-23],[-4,-13],[-35,-6],[-12,2],[-35,19],[-21,27],[-7,-1],[-6,-13],[4,-14],[24,-24],[11,-29],[-11,-8],[-36,-8],[-48,0],[-76,-13],[-38,-2],[-36,7],[-49,1],[-41,-3],[-24,6],[-23,14],[-26,-3],[-57,-35],[-89,11],[-80,3],[-16,11],[-18,23],[-35,70],[6,18],[86,9],[2,6],[-61,25],[-70,18],[-32,15],[7,27],[-2,7],[120,32],[88,62],[54,25],[4,12],[46,13],[106,7],[4,18],[-200,-10],[-274,-35],[-85,-18],[-71,10],[-300,-54],[-13,0],[-31,17],[-27,33],[19,22],[88,43],[44,37],[-5,21],[35,35],[56,5],[96,-29],[49,-29],[45,-14],[39,3],[41,20],[-11,3],[-69,-11],[-8,3],[-35,33],[-15,20],[-10,21],[-1,15],[21,28],[-79,9],[-29,19],[-14,24],[3,11],[25,28],[67,39],[-8,10],[-97,-1],[-22,5],[-42,24],[9,27],[39,39],[30,23],[19,7],[31,0],[73,-15],[21,-8],[56,-38],[14,-21],[-2,-21],[11,-15],[43,-22],[186,-115],[35,-27],[23,-12],[43,-9],[26,2],[20,8],[3,10],[-80,40],[-20,22],[-17,29],[7,9],[24,4],[58,-4],[69,8],[-76,12],[-50,16],[-52,1],[-64,26],[0,8],[16,9],[87,11],[17,5],[1,7],[-29,18],[-26,9],[-132,21],[-47,24],[-15,11],[-4,11],[17,28],[71,35],[51,17],[89,12],[71,-1],[40,-5],[94,-59],[45,-39],[77,7],[-22,40],[-15,45],[23,17],[64,29],[51,-15],[66,-40],[15,-13],[75,-25],[44,-8],[23,-13],[7,-17]],[[21270,97531],[65,-11],[77,-37],[73,-79],[4,-10],[0,-13],[-3,-16],[-9,-21],[-13,-12],[37,-15],[4,-8],[-3,-17],[4,-12],[23,12],[19,19],[5,12],[4,32],[57,17],[60,23],[28,5],[47,-5],[112,-56],[43,-5],[16,-7],[14,-13],[1,-14],[-23,-32],[-9,-20],[6,-13],[58,-11],[134,22],[117,-53],[65,-63],[47,-21],[8,-11],[-14,-11],[-13,-29],[-39,-22],[-8,-10],[21,-26],[1,-17],[-2,-22],[7,-13],[53,-14],[119,-93],[22,-26],[14,-32],[1,-11],[-17,-18],[-19,-51],[-10,-12],[-49,-10],[-88,-9],[-83,-17],[-88,22],[-87,34],[-26,22],[-22,28],[-5,10],[-9,44],[-4,9],[-37,24],[-32,37],[-63,3],[-147,38],[-63,8],[-64,-2],[-89,-15],[-17,4],[-15,11],[-14,18],[-3,14],[14,23],[-262,-29],[-75,-35],[-105,6],[-53,14],[-69,33],[-32,29],[-30,38],[-3,29],[24,20],[25,11],[26,4],[142,-23],[125,-11],[54,11],[25,32],[-30,16],[-120,7],[26,17],[101,16],[53,26],[-10,8],[-30,10],[-137,-2],[-48,9],[-3,9],[11,10],[77,51],[-3,10],[-33,16],[-29,22],[-11,3],[-68,-20],[-95,-75],[-22,-11],[-22,1],[-21,12],[1,16],[21,19],[44,58],[-4,21],[-42,14],[-114,-10],[-63,-1],[-9,17],[-3,30],[3,29],[15,45],[22,35],[13,12],[151,-7],[245,21],[71,2],[78,-21]],[[24476,98578],[36,-48],[134,-115],[61,-42],[103,-51],[13,-19],[1,-8],[-3,-28],[30,-10],[88,-16],[99,-28],[18,1],[34,17],[42,5],[54,-4],[26,-12],[19,-18],[8,-13],[1,-10],[-19,-19],[2,-8],[12,-8],[2,-11],[-20,-41],[5,-15],[50,-37],[45,-19],[89,-20],[58,2],[36,-13],[1,8],[-17,23],[-34,34],[-65,18],[-9,19],[-5,34],[6,22],[33,18],[27,6],[84,1],[45,-8],[80,-25],[8,-14],[4,-27],[3,-54],[-2,-12],[-67,-30],[-15,-21],[17,-6],[58,-5],[90,-19],[35,-2],[35,-44],[27,-41],[-20,-52],[-26,-82],[-21,-19],[-21,-28],[15,-6],[88,12],[18,4],[59,28],[86,-7],[29,-7],[15,-10],[26,-31],[22,-41],[16,3],[40,51],[15,12],[20,12],[9,-2],[40,-47],[91,-82],[31,-34],[6,-26],[-39,-29],[-30,-15],[-223,-62],[-99,-35],[-50,-28],[-25,-9],[-54,5],[-12,-5],[-16,-44],[-18,-19],[-46,-30],[-65,-55],[-38,-24],[-68,18],[-17,25],[-10,58],[-1,24],[2,13],[9,20],[29,49],[-3,6],[-14,-5],[-45,-24],[-18,-13],[-16,-23],[-8,-38],[7,-70],[-6,-28],[-18,-14],[7,-11],[53,-15],[9,-7],[6,-12],[3,-17],[-3,-16],[-16,-25],[-30,-10],[-38,11],[-82,61],[-36,-3],[-9,-7],[8,-22],[25,-48],[5,-41],[-12,-33],[-23,-53],[-16,-29],[-9,-3],[-41,-1],[-35,14],[-104,93],[-51,39],[-76,78],[-19,15],[-12,4],[-10,-33],[20,-31],[68,-72],[41,-53],[29,-43],[4,-19],[-9,-7],[-15,4],[-20,16],[-62,25],[-26,15],[-16,16],[-31,13],[-45,8],[-45,2],[-45,-5],[-8,-8],[50,-23],[18,-12],[13,-17],[9,-19],[-17,-13],[-63,-7],[-84,5],[-137,17],[-136,28],[-125,44],[-91,44],[-36,23],[-11,17],[34,16],[119,19],[119,13],[-19,11],[-217,25],[-71,4],[-38,-6],[-44,4],[-34,20],[-45,37],[-23,25],[3,10],[17,5],[99,-4],[13,3],[-49,19],[-157,37],[-59,33],[-11,12],[-4,13],[1,12],[59,25],[183,59],[62,9],[63,1],[44,16],[38,56],[189,20],[146,25],[12,7],[-109,-4],[-155,5],[-65,37],[-45,7],[-49,0],[-57,-12],[-98,-35],[-47,-9],[-107,-36],[-29,3],[-15,4],[-5,7],[19,24],[28,17],[-5,5],[-42,4],[-48,-1],[-34,-6],[-122,-32],[-55,-23],[-17,-3],[-59,38],[-95,20],[-21,16],[20,63],[27,13],[73,11],[217,57],[13,11],[20,29],[-50,-7],[-109,-27],[-90,-14],[-71,0],[-51,4],[-33,8],[-40,17],[-128,83],[-36,39],[-4,36],[-9,26],[-38,65],[276,-40],[107,-8],[208,-2],[10,3],[3,11],[-4,17],[2,13],[7,9],[77,23],[12,8],[-91,4],[-168,-39],[-59,0],[-67,56],[-71,-10],[-34,4],[-53,14],[-26,12],[-16,15],[-7,13],[2,10],[14,12],[62,16],[28,1],[73,-10],[55,1],[-18,17],[-79,43],[-70,47],[5,80],[57,17],[60,2],[58,-20],[77,-2],[56,-23],[37,-44],[44,1],[69,-8],[155,1],[-28,15],[-49,14],[-109,18],[-53,63],[-114,33],[-88,17],[1,15],[67,79],[80,28],[128,-10],[85,14],[108,28],[106,-13],[28,2],[16,8],[14,17],[0,15],[-14,14],[-34,17],[-135,2],[-60,7],[-23,9],[-7,14],[-4,14],[0,15],[4,9],[11,5],[33,6],[126,0],[76,8],[83,-10],[173,-39],[55,-20],[60,-34],[31,-30]],[[23807,96147],[52,-5],[44,8],[38,-2],[56,-23],[53,-36],[40,-16],[13,-8],[5,-9],[6,-27],[0,-12],[-3,-10],[-18,-25],[-15,-30],[-30,-27],[-16,-20],[-14,-26],[31,15],[119,85],[77,-10],[117,7],[141,35],[67,5],[67,-3],[50,-10],[108,-47],[37,-22],[14,-16],[3,-11],[-22,-18],[-67,11],[-111,10],[-20,5],[-18,0],[-12,-6],[8,-25],[22,-5],[133,-6],[436,-78],[19,-25],[-5,-11],[-16,-12],[-31,-17],[-252,-18],[-143,16],[-120,26],[-41,-6],[35,-35],[72,-10],[61,-21],[25,-17],[128,-13],[21,-13],[40,-34],[33,-3],[33,-24],[27,-41],[13,-5],[39,7],[64,-36],[21,-19],[0,-14],[-15,-22],[-29,-31],[-73,-35],[-6,-11],[86,4],[16,-5],[101,-63],[13,-1],[8,6],[10,23],[-4,21],[-13,28],[4,21],[19,13],[19,7],[19,0],[21,-8],[102,-77],[131,37],[24,-17],[20,-30],[9,-5],[49,61],[30,15],[123,-73],[75,-16],[30,-15],[55,-18],[79,-6],[13,27],[-45,35],[26,15],[109,29],[58,-4],[107,42],[66,5],[40,0],[133,63],[31,10],[23,22],[52,-3],[141,-36],[40,3],[150,36],[56,8],[55,-1],[141,-21],[105,-22],[33,-12],[-12,-29],[6,-9],[13,-7],[35,-8],[131,-1],[57,-7],[46,-28],[10,-11],[-1,-11],[-45,-30],[7,-7],[45,-6],[100,-4],[22,-7],[21,-37],[21,-52],[0,-20],[-35,-35],[-95,-46],[-106,-39],[-7,-10],[34,-18],[35,-9],[27,2],[85,18],[19,-1],[38,-18],[18,-17],[17,-24],[-30,-22],[-121,-27],[-72,36],[-24,7],[-16,-3],[9,-15],[35,-28],[11,-18],[-12,-9],[-6,-18],[1,-26],[-3,-27],[-11,-42],[-5,-2],[-263,-8],[-32,-8],[-74,-29],[-56,-15],[-36,-2],[-36,5],[-96,31],[-64,-6],[-25,3],[-55,20],[-13,10],[-22,27],[-16,37],[1,22],[7,32],[-4,17],[-16,0],[-17,6],[-52,33],[-32,10],[-6,-6],[10,-25],[6,-8],[34,-19],[6,-21],[-14,-55],[-5,-8],[-34,-40],[-25,-12],[-68,-1],[-105,-28],[-50,-4],[-67,7],[-42,12],[-27,15],[-27,21],[-13,2],[-7,-46],[-13,-6],[-23,1],[-35,14],[-28,33],[-9,0],[-4,-19],[-7,-13],[-8,-6],[-74,-20],[-41,0],[-43,23],[-28,-2],[-36,-13],[-87,24],[-21,1],[18,-39],[-29,-6],[-62,1],[-103,13],[-64,-19],[-114,11],[-116,3],[-22,9],[-15,18],[-1,16],[6,23],[17,33],[28,45],[10,23],[-26,11],[-15,15],[-13,1],[-41,-17],[-27,-50],[-20,-14],[-9,12],[-7,30],[-9,15],[-11,-1],[-11,-8],[-11,-15],[-15,-6],[-22,4],[-7,-7],[6,-20],[2,-18],[-2,-16],[-18,-17],[-52,-24],[-31,-7],[-79,-4],[-48,7],[-96,29],[-53,1],[-64,48],[-51,11],[3,18],[22,32],[-1,9],[-69,-47],[-10,-15],[9,-34],[-10,-3],[-47,13],[-47,-10],[-12,3],[-32,25],[-57,26],[-25,28],[-39,90],[-20,59],[2,12],[29,16],[-4,13],[-36,34],[-39,28],[-12,19],[-5,20],[-5,28],[-1,21],[5,13],[22,42],[62,76],[8,14],[3,13],[-8,40],[-12,40],[-12,29],[-34,39],[-46,42],[-66,73],[-48,58],[-58,80],[-28,7],[-32,-3],[-70,-28],[-24,-13],[-5,-9],[-52,-2],[-148,7],[-56,9],[-42,-3],[-72,-20],[-77,4],[-48,56],[-110,31],[-33,17],[-22,24],[7,15],[63,14],[26,15],[12,12],[-62,-10],[-27,1],[-186,77],[-57,14],[-10,7],[-4,9],[0,11],[5,17],[55,-22],[25,-1],[39,6],[14,14],[-9,7],[-64,26],[-30,19],[-12,15],[12,20],[3,13],[21,8],[37,1],[48,10],[88,26],[59,10],[59,-2],[142,-27],[142,-34],[89,-26]],[[23276,97079],[66,-15],[113,7],[41,-11],[106,-39],[32,-23],[8,-17],[0,-9],[-35,-19],[-71,-28],[-17,-22],[63,-27],[32,-24],[15,-17],[0,-18],[-42,-48],[-31,-14],[-48,2],[-23,-5],[-60,-22],[-95,-21],[-129,-9],[-35,-13],[-65,-22],[-43,-3],[-14,12],[-6,18],[3,13],[9,15],[-21,15],[-92,28],[-54,39],[-8,13],[-2,11],[119,7],[52,8],[23,13],[4,7],[-23,3],[-82,26],[-138,16],[-7,19],[-57,36],[-6,35],[-12,10],[-39,15],[-6,5],[-12,22],[-1,12],[2,12],[71,23],[-10,16],[-54,61],[-14,34],[2,13],[34,18],[47,0],[124,-5],[59,-8],[59,-14],[65,-22],[97,-19],[31,-12],[58,-41],[7,-12],[-4,-13],[14,-12]],[[24119,94562],[109,-27],[53,-18],[26,-12],[50,-40],[25,-12],[97,24],[68,8],[151,-10],[127,-34],[48,-24],[28,-23],[-7,-26],[-24,-41],[-27,-38],[-56,-61],[-47,-31],[-11,-14],[-8,-21],[-18,-29],[-50,-65],[-14,-11],[-71,-28],[25,-12],[11,-11],[-10,-29],[-45,-69],[-46,-63],[-33,-39],[-59,-55],[-32,-15],[-44,-5],[-263,48],[-66,-1],[-176,-25],[17,-12],[64,-19],[41,-20],[55,-63],[8,-16],[3,-18],[-2,-36],[-4,-9],[-87,-97],[-29,-71],[-18,-58],[-29,-16],[-98,24],[-32,0],[-110,-17],[-52,8],[8,88],[-8,95],[-16,90],[-82,161],[-9,29],[-6,31],[-3,33],[0,33],[6,67],[0,34],[-4,88],[-11,132],[-1,47],[1,19],[3,14],[18,19],[34,13],[17,2],[108,-40],[50,-13],[33,0],[2,5],[-30,8],[-27,18],[-46,51],[-20,44],[-5,14],[-1,16],[3,15],[6,15],[23,22],[18,10],[68,26],[69,15],[151,11],[42,-8],[66,29],[38,6],[67,-10]],[[22933,91959],[9,-7],[16,6],[12,19],[8,4],[12,-4],[39,-34],[29,-35],[32,-25],[50,-23],[110,-73],[32,-49],[34,-77],[31,-58],[26,-41],[29,-32],[46,-36],[41,26],[18,7],[15,-11],[14,-27],[-7,-12],[-18,-16],[-29,-17],[-42,-2],[-20,-5],[-32,-28],[-26,-35],[-36,-11],[-67,-57],[-37,-22],[-55,-5],[-114,44],[-71,-6],[-58,9],[-64,48],[-51,26],[-97,39],[-6,6],[-4,13],[-2,20],[-5,14],[-6,7],[-16,-1],[-15,-14],[-30,-11],[-46,2],[-20,9],[-15,12],[-8,15],[-1,17],[-5,13],[-7,9],[-16,0],[-26,-8],[-10,-11],[5,-13],[-4,-8],[-46,0],[-18,8],[-34,24],[-15,24],[-19,43],[2,11],[12,26],[16,19],[103,10],[48,11],[53,29],[61,52],[13,15],[1,11],[-4,12],[-19,30],[-7,20],[6,9],[25,1],[-13,12],[-11,16],[-4,10],[1,16],[19,4],[24,-8],[47,-47],[18,-9],[32,-7],[-34,32],[-35,67],[-4,24],[1,13],[9,36],[8,14],[11,10],[33,21],[53,14],[28,2],[27,-11],[24,-23],[54,-37],[8,-15],[-1,-7],[-20,-10],[-3,-9],[8,-14]],[[33026,78308],[9,-4],[38,28],[20,-1],[-1,-20],[-32,-22],[-15,-17],[18,-15],[0,-10],[-22,-25],[-11,-27],[9,-26],[36,26],[14,0],[20,-6],[19,8],[11,13],[63,99],[3,13],[-68,-20],[-8,13],[45,61],[-4,31],[23,51],[20,30],[15,16],[22,16],[15,-24],[5,-43],[37,6],[37,-9],[26,-18],[5,-10],[0,-17],[-9,-29],[-15,-25],[30,-31],[-4,-13],[-48,-36],[-28,-35],[-25,-44],[-50,-51],[-80,-36],[-25,0],[-30,11],[-30,-3],[-29,-13],[-29,1],[-13,-7],[-14,1],[-11,14],[-23,41],[-12,27],[-12,130],[4,68],[20,63],[29,43],[17,34],[72,200],[14,45],[17,39],[31,39],[40,64],[12,14],[23,6],[23,-4],[-7,-23],[2,-23],[26,-89],[0,-18],[-15,-71],[-27,-116],[-7,-63],[4,-19],[-11,-32],[-12,-25],[-47,-45],[-24,-11],[-22,-17],[-54,-58]],[[29247,77766],[40,22],[82,85],[61,30],[80,89],[57,17],[11,20],[9,73],[6,26],[26,73],[33,61],[26,84],[47,54],[71,45],[66,98],[36,30],[35,22],[15,40],[21,23],[58,46],[64,13],[64,38],[50,21],[30,36],[44,19],[132,104],[36,49],[48,99],[41,51],[14,54],[60,87],[62,116],[30,83],[46,45],[89,132],[47,52],[20,6],[53,47],[34,48],[54,49],[97,60],[91,72],[123,63],[144,93],[117,50],[82,7],[100,24],[35,-3],[156,-40],[74,-50],[85,-106],[13,-27],[2,-39],[-45,19],[-40,1],[28,-22],[47,-65],[-3,-81],[-26,-73],[-79,-36],[-20,-29],[-16,-47],[-16,-18],[-39,-22],[-21,-30],[-62,-49],[-28,-6],[-32,11],[-78,47],[-47,44],[-24,-24],[-20,-25],[-46,8],[-21,-11],[-34,12],[-71,-56],[20,-6],[56,32],[19,-4],[42,-41],[100,-45],[26,-29],[25,-95],[16,-15],[35,10],[39,47],[32,25],[63,20],[-13,-31],[48,3],[48,-42],[-18,-30],[-24,-59],[-16,-116],[-49,-78],[-64,-76],[16,-19],[19,-11],[41,22],[28,-1],[31,-15],[-10,-59],[-11,-40],[7,-38],[18,-71],[25,-16],[10,-92],[14,-50],[-2,-40],[25,-25],[4,-41],[92,-12],[19,-16],[63,-15],[12,-12],[12,-22],[-63,-49],[51,-36],[47,-59],[38,12],[16,-2],[42,-36],[12,-19],[6,-16],[21,4],[31,14],[54,-4],[59,-20],[-5,-32],[-9,-21],[46,7],[28,-23],[10,11],[7,14],[57,38],[73,79],[9,-9],[3,-30],[10,-49],[28,-34],[33,-8],[45,26],[18,-22],[22,-43],[20,-57],[-1,-20],[-26,-17],[-24,-26],[99,-10],[10,-11],[10,-22],[-10,-22],[-9,-11],[-18,13],[-33,-12],[-28,-29],[-31,-16],[-20,-2],[-22,-14],[-20,-20],[-20,-6],[-65,-52],[-66,-33],[-69,-54],[-71,-34],[-73,-40],[-16,-4],[-19,2],[-41,-40],[-21,6],[-21,-7],[-25,9],[-16,16],[13,-42],[3,-39],[-6,-16],[-12,-20],[-42,3],[-16,14],[-20,21],[-9,33],[-21,24],[-13,-33],[1,-25],[-16,-33],[-18,57],[-34,-21],[-14,-61],[7,-17],[10,-46],[-16,-25],[-12,7],[-25,-68],[-31,-25],[-31,-69],[-37,-53],[-11,-36],[-62,-81],[-24,2],[-17,-2],[-26,-34],[-5,-68],[-11,9],[-12,-2],[-6,-22],[-9,-3],[-23,20],[-27,-11],[-21,15],[-27,100],[-14,35],[-26,12],[-6,-22],[-10,-20],[-25,41],[-18,153],[0,37],[26,129],[64,116],[-21,4],[-56,-81],[6,20],[9,20],[19,33],[29,31],[39,17],[27,3],[18,17],[27,30],[5,16],[-24,-18],[-39,-18],[10,23],[10,13],[209,208],[42,34],[84,44],[12,28],[-12,19],[33,-17],[-3,-23],[-5,-18],[-2,-29],[3,-28],[34,-14],[27,-52],[-13,71],[25,40],[96,54],[80,6],[25,25],[-68,17],[-81,-9],[-50,19],[-70,-12],[-73,11],[-22,-15],[-19,-34],[-23,15],[-12,3],[-11,11],[24,58],[74,87],[46,75],[12,15],[10,31],[-24,-5],[-22,-12],[-15,34],[-27,47],[-2,-20],[13,-57],[-51,-101],[-34,-7],[-44,-47],[-62,-41],[-73,-78],[-95,-66],[-19,-1],[-43,55],[12,24],[11,34],[-11,-10],[-7,-14],[-25,-24],[21,-45],[-11,-17],[-30,-22],[-27,-32],[-25,-22],[-20,28],[-54,-35],[-46,-9],[-10,17],[-3,28],[-16,7],[-30,-8],[-11,15]],[[34594,81530],[-20,-58],[-14,-28],[-13,-9],[-28,-8],[-59,-9],[-25,-8],[-3,-39],[4,-20],[8,-16],[11,-4],[24,9],[9,-1],[7,-8],[6,-15],[3,-20],[0,-25],[-4,-31],[-20,-73],[-25,-40],[-33,-33],[-7,-12],[-5,-15],[-4,-48],[-16,-38],[-52,-96],[-20,-22],[0,-17],[-8,-46],[-16,-36],[-43,-85],[-10,-30],[-5,-24],[1,-33],[-2,-15],[-10,-28],[-14,-27],[-3,-13],[6,-23],[5,-8],[1,-22],[-4,-34],[18,22],[40,78],[31,47],[20,16],[15,21],[15,46],[20,44],[19,15],[9,-9],[7,-21],[-1,-28],[-10,-33],[0,-10],[24,24],[41,21],[15,-3],[30,-30],[26,3],[40,18],[7,-8],[-7,-27],[-15,-26],[-37,-36],[-90,-72],[-28,-49],[5,2],[20,21],[20,11],[21,2],[9,-7],[-3,-14],[-3,-37],[-54,-74],[13,3],[62,33],[39,-46],[52,16],[31,16],[0,-10],[6,-20],[0,-33],[3,-5],[15,11],[3,12],[-1,58],[5,6],[10,-9],[6,-15],[2,-42],[-7,-43],[-9,-39],[-23,-57],[3,-24],[-6,-27],[5,-1],[23,25],[1,10],[-2,24],[3,11],[19,26],[31,31],[11,4],[4,-7],[-2,-19],[10,5],[20,28],[18,16],[17,6],[18,19],[19,32],[20,27],[21,21],[9,2],[-3,-35],[4,-40],[1,-34],[4,-7],[17,36],[9,13],[11,6],[12,-3],[87,13],[27,-9],[30,-24],[37,-36],[14,-33],[3,-42],[-4,-29],[-27,-37],[-24,-24],[-14,-24],[-5,-25],[-5,-15],[-16,-20],[-72,-59],[17,-2],[41,13],[28,3],[1,-9],[-11,-16],[-21,-17],[-2,-8],[1,-11],[22,-12],[29,6],[24,-9],[-3,-14],[-19,-46],[-5,-28],[-26,-25],[-50,-37],[-13,-15],[3,-3],[46,28],[24,7],[14,0],[17,27],[26,9],[26,-17],[39,46],[14,6],[24,-5],[15,8],[26,32],[20,15],[4,-1],[4,-13],[2,-36],[-5,-32],[-6,-21],[-21,-45],[-13,-16],[-12,-6],[-21,2],[-9,-7],[-20,-35],[-35,-36],[-22,-14],[14,-20],[5,-37],[-8,-12],[-37,-12],[-2,-6],[-13,-8],[-31,-13],[21,-6],[39,9],[4,-6],[-5,-27],[-11,-27],[-46,-70],[0,-7],[7,-35],[9,-26],[11,-18],[26,-1],[19,8],[27,47],[62,146],[55,41],[45,45],[11,-9],[5,-11],[-2,-11],[-23,-37],[-12,-31],[-31,-94],[-12,-45],[-6,-47],[1,-81],[4,-14],[9,-19],[19,17],[31,40],[20,38],[15,63],[10,24],[10,-1],[10,-13],[2,-30],[8,-42],[6,-41],[-4,-46],[-5,-25],[-63,-186],[6,-33],[2,-20],[-2,-22],[-20,-89],[-19,-55],[-11,-24],[-12,-15],[-15,-5],[-13,8],[-11,21],[-10,11],[-9,1],[-17,-4],[-42,-45],[-9,-3],[-6,6],[-8,24],[6,120],[4,40],[-9,30],[9,52],[1,19],[-6,7],[-10,-4],[-17,-26],[-22,-47],[-23,-42],[-42,-57],[-18,-11],[-8,2],[-8,8],[-12,24],[1,22],[5,29],[17,68],[34,101],[28,72],[5,31],[-7,13],[-7,27],[-11,78],[-13,64],[-16,28],[-41,32],[-7,-8],[-4,-43],[-48,-124],[-8,-54],[-6,-20],[-9,-14],[-21,-17],[6,29],[22,64],[-3,6],[-28,-51],[-21,-29],[-26,-7],[-16,2],[-15,-8],[-65,-121],[-3,-41],[-11,-33],[-32,-60],[-17,-21],[-24,-4],[-21,11],[-15,-2],[-33,-19],[-38,-8],[-16,4],[-10,7],[-19,24],[-2,16],[1,10],[10,25],[22,32],[18,11],[45,16],[33,24],[25,35],[12,21],[47,110],[60,39],[29,31],[21,40],[3,14],[-30,-20],[-15,-5],[-25,7],[-11,14],[-34,-4],[-47,6],[-7,-10],[-6,-54],[-6,-28],[-7,-9],[-11,-6],[-21,-6],[-55,19],[-11,11],[-14,8],[-60,-18],[-13,2],[12,12],[60,40],[6,112],[-3,18],[-17,-16],[-28,-16],[-20,5],[-9,10],[-8,-9],[-19,-59],[-12,-7],[-17,-3],[-38,-21],[-73,-15],[-14,-15],[-49,5],[-145,33],[-52,-3],[-62,20],[-12,8],[-87,-3],[-26,4],[2,25],[-3,6],[-25,-27],[-23,-18],[-29,-15],[-91,-26],[-49,-6],[-28,18],[-11,19],[-17,59],[-12,74],[0,13],[6,26],[19,36],[87,94],[69,96],[30,49],[28,18],[46,41],[2,5],[-45,-5],[-32,11],[-32,5],[-62,-11],[-62,0],[0,21],[29,40],[62,68],[6,1],[-19,-32],[-5,-24],[8,-16],[9,-10],[36,-4],[8,14],[12,73],[27,85],[14,61],[25,47],[13,7],[11,-9],[37,-11],[38,-43],[12,-3],[4,3],[-14,13],[-11,20],[-5,19],[14,59],[16,17],[3,12],[-32,0],[-26,16],[-8,27],[1,47],[9,28],[21,37],[25,25],[15,-6],[30,-34],[18,10],[-3,10],[-27,53],[-9,39],[1,19],[59,187],[29,100],[40,153],[9,24],[20,45],[9,12],[25,0],[16,6],[-23,19],[-8,14],[-1,15],[6,15],[9,12],[31,24],[22,40],[13,48],[-2,16],[-7,16],[0,9],[17,10],[42,56],[5,11],[16,75],[19,33],[17,17],[28,21],[86,52],[51,46],[34,-3],[10,-32],[49,-21],[9,23],[-12,28],[10,11],[40,10],[7,-4],[12,-16],[-2,-14]],[[25947,92747],[11,-12],[64,16],[54,18],[84,45],[50,15],[152,0],[26,-9],[-11,-26],[-7,-8],[5,-11],[17,-16],[33,-17],[13,16],[9,37],[23,153],[9,46],[5,44],[-1,41],[-11,26],[-39,16],[-53,-3],[-28,4],[-33,8],[-25,13],[-16,17],[-31,52],[-24,28],[-60,52],[-28,17],[14,21],[55,23],[33,23],[39,65],[23,11],[84,-9],[114,-51],[72,-44],[19,-5],[0,8],[-18,21],[-82,54],[-38,40],[-17,29],[8,12],[46,13],[6,14],[-63,17],[-31,0],[-26,-12],[-28,-1],[-51,22],[-14,13],[-30,38],[-15,34],[-17,21],[-7,16],[-3,51],[2,30],[7,26],[12,22],[33,39],[19,12],[35,5],[76,-20],[203,-71],[-5,23],[-227,96],[-81,24],[-20,35],[122,133],[111,31],[56,38],[91,2],[85,-25],[1,7],[-38,46],[3,12],[48,27],[89,32],[108,26],[22,13],[28,9],[51,9],[127,3],[71,-3],[95,-20],[55,-35],[17,-21],[30,-69],[24,-95],[35,-40],[56,-21],[39,-24],[22,-26],[6,-32],[-10,-39],[7,-40],[25,-41],[20,-24],[42,-26],[1,-14],[-13,-16],[-28,-23],[-70,-69],[-90,-76],[-64,-66],[-3,-20],[133,104],[42,-4],[2,-15],[-28,-50],[-33,-45],[-33,-29],[6,-11],[63,-50],[-11,-9],[-31,5],[-12,-5],[-9,-9],[-6,-14],[0,-20],[5,-25],[-1,-18],[-6,-13],[7,-5],[18,2],[16,10],[27,34],[88,93],[57,34],[18,4],[52,-23],[13,1],[-58,72],[-5,18],[12,26],[7,9],[32,20],[26,10],[15,-4],[24,-36],[11,-25],[19,-11],[44,14],[28,30],[36,-20],[54,-48],[-5,-48],[0,-49],[3,-35],[65,-65],[44,-28],[9,-1],[-2,10],[-9,22],[-24,21],[-23,34],[-20,40],[12,95],[34,50],[32,-13],[43,-29],[34,-2],[53,3],[108,-58],[58,-1],[-5,23],[-44,12],[-64,31],[-101,38],[-46,44],[-8,20],[1,22],[6,20],[10,16],[20,17],[97,50],[69,22],[51,7],[87,-1],[100,-9],[55,-14],[62,-36],[79,-35],[28,-6],[33,0],[38,8],[36,-3],[114,-52],[30,-27],[18,-32],[14,-32],[8,-31],[-3,-24],[-95,-108],[-41,-18],[-28,-41],[-40,-77],[-35,-42],[-3,-8],[7,-2],[21,19],[36,53],[26,46],[47,38],[78,45],[68,22],[58,-2],[49,-6],[39,-11],[24,-10],[7,-7],[16,-34],[-1,-23],[-10,-26],[-19,-29],[-84,-33],[-47,-25],[-29,-10],[-87,-9],[4,-10],[65,-14],[71,4],[-1,-16],[-34,-44],[-11,-38],[9,-31],[-1,-26],[-26,-53],[-28,-48],[10,-7],[66,69],[18,76],[27,66],[31,37],[23,14],[74,5],[40,39],[35,12],[15,1],[29,-15],[-1,-15],[-43,-70],[-92,-112],[38,13],[25,27],[34,26],[38,40],[25,-36],[39,-27],[23,-61],[38,-29],[23,-23],[-3,39],[-33,77],[9,31],[25,16],[79,65],[55,-22],[34,-19],[17,5],[43,-3],[69,-10],[67,-19],[66,-25],[50,-31],[35,-34],[21,-24],[8,-14],[12,-34],[-9,-23],[-50,-53],[-27,-24],[-27,-11],[-73,11],[-23,-7],[-24,-16],[-76,-73],[-42,-32],[-41,-20],[-10,-10],[89,1],[24,21],[21,41],[39,42],[74,19],[103,-41],[52,2],[39,41],[44,28],[17,6],[9,-3],[33,-30],[10,-26],[0,-60],[-5,-18],[-29,-46],[-73,-68],[-47,-25],[-52,-14],[-57,-23],[-20,-19],[-20,-26],[-20,-18],[-25,-14],[33,-22],[12,1],[13,13],[33,50],[24,23],[14,4],[14,-2],[14,-10],[14,-18],[-1,-43],[-42,-171],[7,0],[26,47],[74,178],[18,36],[36,36],[80,54],[63,29],[70,24],[37,9],[43,-6],[28,-28],[37,-5],[46,7],[30,-4],[33,-11],[29,-20],[48,-24],[110,-44],[14,-10],[12,-16],[12,-25],[-1,-24],[-15,-23],[-18,-15],[-22,-5],[-23,-13],[-42,-34],[-13,-6],[-66,-14],[-61,-7],[-38,-14],[-73,-37],[-101,-68],[1,-16],[40,-8],[33,10],[45,47],[42,18],[66,15],[91,12],[39,-2],[7,-2],[5,-11],[3,-20],[-15,-26],[-17,-12],[-47,-58],[31,-15],[42,-7],[24,16],[22,36],[25,19],[27,4],[24,9],[21,15],[5,9],[-30,19],[-2,11],[12,28],[22,30],[23,19],[17,2],[57,-21],[39,-35],[98,-107],[12,-21],[34,-79],[7,-35],[-6,-25],[-8,-15],[-10,-5],[-22,-1],[-130,33],[-60,-4],[-26,-9],[-21,-14],[-16,-17],[-12,-21],[-23,-12],[-82,0],[-47,-12],[-80,-28],[-28,-16],[-7,-20],[49,4],[81,26],[75,8],[127,-59],[41,-9],[23,9],[28,2],[101,-4],[35,-7],[51,-22],[78,-49],[15,-14],[9,-15],[2,-16],[0,-39],[-8,-13],[-27,-9],[-112,10],[-35,9],[-42,-11],[-34,4],[-44,15],[-48,28],[-72,-26],[-58,17],[-59,-15],[-117,-62],[13,-11],[160,53],[31,-3],[51,-20],[80,-38],[23,-16],[0,-60],[-12,-41],[-25,-45],[-37,6],[-85,28],[-35,4],[-26,-4],[-34,-19],[-17,0],[-137,36],[-31,2],[-3,-4],[6,-7],[125,-56],[92,-6],[57,-10],[34,-17],[16,-13],[2,-37],[30,-38],[28,-15],[18,-1],[30,14],[30,2],[25,-9],[31,-21],[37,-6],[33,-13],[26,-2],[71,6],[31,-8],[8,-7],[-13,-12],[-66,-29],[-10,-28],[37,-36],[20,-28],[-1,-20],[-20,-47],[-5,-19],[6,-2],[48,38],[7,-4],[5,-53],[6,3],[16,43],[-7,58],[28,23],[88,18],[-15,-91],[-2,-47],[-39,-79],[-32,-25],[1,-6],[23,-10],[14,-1],[14,13],[33,60],[66,64],[12,1],[0,-23],[-9,-42],[31,-20],[29,19],[16,17],[37,-2],[17,-8],[5,-19],[-17,-79],[3,-19],[39,-52],[4,3],[-8,25],[-8,62],[8,28],[32,34],[65,50],[25,10],[15,-7],[24,-24],[-8,-14],[-26,-15],[-19,-27],[-13,-39],[14,-21],[53,-2],[54,32],[30,-16],[37,-42],[66,-67],[39,18],[47,-51],[-64,-40],[20,-86],[-82,4],[-46,-7],[-31,8],[-34,-3],[31,-20],[59,-9],[6,-25],[46,0],[35,5],[63,-1],[4,30],[41,17],[23,19],[20,-12],[57,-12],[77,-59],[-34,-35],[-9,-33],[-12,-28],[-6,-25],[-14,-17],[-109,-99],[18,-1],[46,24],[91,35],[50,15],[36,-10],[18,0],[16,13],[30,-15],[62,-13],[71,81],[43,-16],[40,-50],[86,-89],[45,-51],[15,-23],[-2,-23],[-41,-25],[-20,-5],[-55,46],[-50,24],[-31,-3],[-30,-18],[10,-9],[121,-71],[21,-52],[2,-23],[-81,-35],[-26,-2],[-57,17],[-32,31],[-28,11],[-37,3],[-12,-6],[41,-52],[-4,-16],[-21,-10],[-11,-25],[81,-46],[61,-46],[9,-19],[-41,-13],[-29,-4],[-62,7],[-35,10],[-9,-11],[35,-24],[14,-16],[10,-23],[7,-22],[1,-20],[-28,-17],[-35,-46],[-14,-48],[-31,-5],[-13,9],[-42,-15],[-55,21],[-20,22],[-61,90],[-1,-10],[15,-46],[-3,-27],[-64,-20],[0,-7],[39,-15],[48,-11],[-8,-42],[1,-181],[-11,-64],[-23,-56],[-34,-53],[-36,35],[-15,36],[-12,18],[-17,15],[-23,7],[-23,0],[-25,-32],[-28,28],[-26,33],[10,88],[11,44],[-4,-1],[-16,-20],[-36,-64],[-23,-79],[-31,30],[-28,38],[-22,38],[-37,43],[-36,51],[-19,60],[-8,13],[-21,50],[-8,14],[-8,5],[-17,31],[6,34],[28,39],[26,28],[42,28],[50,16],[22,36],[28,66],[30,46],[33,26],[-16,4],[-42,-22],[-30,-32],[-35,-54],[-32,-34],[-84,-40],[-30,-8],[-36,-4],[-78,5],[-18,14],[9,38],[56,68],[-9,5],[-20,-24],[-27,-17],[-23,-9],[-34,3],[-41,43],[-19,13],[-39,15],[-16,14],[-66,104],[-13,28],[-7,27],[-21,23],[-35,18],[-8,-3],[13,-23],[0,-20],[-30,-12],[-31,4],[-33,21],[-3,-28],[35,-51],[1,-64],[-10,-6],[-24,-4],[-16,8],[-53,48],[-50,33],[-36,18],[-4,-13],[23,-57],[27,-57],[44,-47],[69,-56],[32,-32],[-25,-46],[-22,-14],[-13,-5],[-42,0],[-77,25],[-37,28],[-52,67],[-87,69],[-19,-1],[-61,-28],[9,-4],[40,-2],[29,-9],[69,-55],[6,-23],[-18,-25],[1,-32],[20,-39],[20,-25],[41,-18],[20,-2],[8,-11],[-25,-87],[-2,-24],[7,-10],[9,0],[52,35],[22,9],[19,2],[22,-10],[26,-22],[14,-23],[5,-23],[7,-15],[52,-24],[-5,-12],[-53,-37],[-3,-5],[11,-3],[33,-22],[31,-34],[19,-41],[4,-21],[0,-19],[4,-11],[16,-2],[7,7],[7,-1],[9,-10],[8,-32],[19,-92],[10,-25],[5,-1],[3,92],[9,15],[33,-16],[47,-36],[34,-32],[4,-15],[-25,-29],[5,-13],[19,-19],[17,7],[12,33],[22,32],[25,22],[48,-18],[39,-48],[6,-16],[26,-21],[22,11],[44,-54],[-21,-25],[-45,-36],[-5,-12],[11,2],[87,1],[23,-15],[5,-28],[-38,-76],[-35,6],[-47,2],[-24,-4],[4,-10],[65,-35],[18,-29],[25,-30],[12,-25],[-1,-11],[-10,-17],[5,-6],[44,-11],[28,10],[34,4],[30,-3],[3,-11],[-5,-28],[-31,-25],[9,-7],[36,8],[17,-12],[21,-62],[25,-48],[-20,-11],[-22,-5],[3,-61],[14,-64],[1,-60],[-5,-54],[-20,-12],[-22,1],[-8,14],[-53,161],[-13,29],[-16,25],[-56,70],[2,-11],[14,-32],[12,-48],[16,-96],[8,-61],[-4,-23],[-11,-6],[-3,-11],[5,-17],[43,-63],[21,-38],[15,-39],[13,-26],[13,-14],[-3,-11],[-19,-9],[-32,-4],[-16,5],[-58,36],[-8,-11],[32,-133],[-1,-32],[-16,-11],[-20,13],[-24,38],[-36,42],[-49,46],[-47,37],[-11,-1],[-7,-11],[-7,-2],[-9,7],[-16,28],[-16,18],[-68,62],[-7,0],[7,-18],[6,-41],[-7,-8],[-18,3],[-34,18],[-23,40],[-28,70],[-16,26],[-1,-17],[8,-67],[-1,-22],[-17,-6],[-8,6],[-7,18],[-6,29],[-17,23],[-25,15],[-14,16],[-7,29],[-5,6],[-45,-6],[-23,20],[-65,81],[-59,88],[-38,46],[-14,12],[20,-57],[22,-84],[6,-39],[-10,-1],[-22,17],[-113,108],[-69,51],[-39,9],[-63,6],[-14,-28],[34,-62],[33,-47],[32,-32],[50,-61],[46,-79],[19,-25],[62,-34],[33,-9],[34,-2],[3,-12],[-16,-23],[-4,-14],[75,-35],[28,-20],[27,-32],[15,-8],[65,-82],[16,-14],[58,-26],[19,-17],[32,-53],[20,-27],[28,-64],[21,-29],[52,-32],[22,-10],[10,-12],[-7,-29],[-6,-12],[-30,-20],[5,-28],[17,-50],[-1,-31],[-18,-12],[-37,-14],[-19,1],[-28,12],[-35,20],[-70,50],[-105,35],[-39,18],[-13,17],[-20,10],[-260,48],[-44,12],[-27,15],[-25,22],[-100,49],[-12,11],[-67,85],[-49,100],[-17,13],[-54,13],[-45,-8],[-30,-11],[-46,4],[-30,16],[-63,45],[-64,23],[-56,39],[-29,14],[3,10],[41,58],[-12,0],[-73,-45],[-26,14],[-43,35],[-32,35],[-66,97],[-38,35],[5,8],[43,3],[34,-3],[23,8],[44,39],[19,25],[2,14],[-37,4],[-8,7],[-7,16],[-17,21],[-27,25],[-31,10],[-107,-9],[-19,11],[0,17],[21,47],[12,19],[3,10],[-4,3],[-14,-2],[-62,-42],[-14,3],[-24,45],[-15,51],[-11,17],[-14,6],[-51,50],[-72,95],[-27,30],[-30,27],[-21,11],[3,14],[46,79],[2,12],[-40,-4],[-59,16],[-28,-20],[-18,-1],[-21,11],[-12,-4],[-11,-65],[-9,-16],[-12,-9],[-11,2],[-9,11],[0,15],[-9,79],[-21,12],[-58,3],[-13,6],[-14,15],[-12,27],[-10,40],[-12,22],[-13,3],[-11,-3],[-8,-10],[-18,-6],[-28,-3],[-1,-15],[27,-28],[25,-40],[25,-52],[-15,-35],[-55,-18],[-48,-5],[-41,7],[-32,12],[-44,29],[-63,-9],[-15,-76],[-13,-4],[-60,1],[-24,-6],[-80,-42],[-25,-6],[-18,5],[-18,-11],[-27,-24],[-37,-2],[-47,19],[-39,8],[-33,-3],[-33,12],[-34,25],[-29,11],[-36,-2],[-9,4],[-54,55],[-17,22],[-35,68],[-7,27],[-1,29],[3,21],[13,32],[13,76],[12,25],[17,23],[32,29],[120,51],[24,20],[-1,14],[-27,62],[0,16],[9,9],[19,37],[9,10],[21,6],[44,-19],[37,-7],[50,-3],[83,-25],[115,-49],[66,-33],[50,-50],[36,-49],[5,-25],[-16,-38],[-9,-11],[1,-13],[9,-15],[29,-21],[7,8],[-3,26],[6,22],[15,17],[1,23],[-11,28],[-13,24],[-17,21],[-74,70],[-7,23],[25,11],[108,-24],[42,6],[16,27],[17,19],[18,10],[37,4],[51,-13],[25,-2],[23,5],[29,15],[42,50],[28,11],[41,8],[31,1],[56,-20],[35,0],[-3,34],[-23,63],[-28,66],[-23,22],[-57,41],[-68,78],[-34,49],[-9,24],[4,16],[12,24],[123,86],[97,86],[42,44],[21,31],[21,22],[22,14],[47,16],[13,22],[3,36],[8,32],[44,85],[33,23],[51,16],[33,20],[41,70],[-4,17],[-19,13],[-14,20],[-62,182],[-42,89],[-49,76],[-45,94],[-73,92],[-1,24],[13,28],[-6,6],[-76,-40],[-18,-2],[-29,17],[-20,22],[-16,38],[1,20],[11,19],[15,47],[0,24],[-5,22],[-6,16],[-9,9],[-23,6],[-38,2],[-13,-8],[43,-71],[-7,-17],[-54,-7],[-24,3],[-22,8],[-20,14],[-63,74],[-13,27],[4,20],[-5,11],[-13,-7],[-17,0],[-24,7],[-5,8],[44,40],[3,12],[-21,13],[-30,3],[-8,12],[10,12],[41,22],[15,14],[-25,11],[-13,1],[-28,-24],[-42,-48],[-30,-18],[-41,22],[-27,8],[-18,-5],[-28,-38],[-61,-27],[-109,-65],[-46,-20],[-51,4],[-9,13],[0,22],[4,18],[6,14],[2,18],[-4,73],[9,21],[17,12],[32,12],[81,-15],[37,3],[27,17],[26,24],[27,33],[5,31],[-28,50],[-10,11],[-72,39],[-40,14],[-35,6],[-26,11],[-16,17],[-15,27],[-1,18],[2,24],[15,17],[64,20],[0,5],[-53,14],[-25,-2],[-21,-16],[-27,-37],[-16,-11],[-48,22],[-29,3],[-19,11],[-11,10],[7,10],[24,11],[41,32],[3,18],[-29,28],[-15,7],[-60,10],[-72,-10],[-28,5],[-12,32],[-7,37],[-4,44],[-13,75],[-14,39],[-19,4],[-88,-16],[-20,0],[-15,6],[-57,50],[-24,18],[-13,4],[-42,53],[-16,10],[-19,26],[-22,42],[-24,13],[-26,-16],[-26,-24],[-26,-30],[-14,-26],[-2,-21],[16,-16],[91,-28],[24,-18],[19,-30],[15,-36],[10,-43],[-1,-32],[-11,-22],[-20,-19],[-57,-30],[-58,-17],[-59,-5],[-28,4],[-152,59],[-27,0],[-35,8],[-79,24],[-43,3],[-76,20],[-128,11],[-25,-9],[34,-27],[30,-14],[25,0],[37,-24],[48,-47],[28,-29],[22,-34],[1,-12],[-23,-23],[-178,122],[-109,-42],[-51,-16],[-43,-3],[-54,17],[-121,59],[-46,20],[-16,3],[-106,-25],[-91,-1],[-185,24],[-67,17],[-18,17],[-22,8],[-40,0],[-105,19],[-97,-43],[-116,40],[-35,23],[-11,16],[-33,66],[-5,36],[10,32],[9,22],[10,12],[-64,-37],[-22,-6],[-29,-1],[-87,13],[-14,-7],[5,-12],[23,-19],[2,-12],[-48,-8],[-73,9],[-33,-4],[-14,-5],[-33,-30],[-14,-7],[-17,3],[-77,67],[-62,43],[-73,16],[-33,14],[-18,16],[-100,137],[-14,29],[-32,107],[-10,23],[-13,15],[25,3],[95,-13],[91,0],[50,-8],[57,-27],[76,-19],[53,-4],[87,7],[98,18],[11,14],[-63,24],[-57,31],[-52,41],[-31,17],[-53,11],[-146,8],[-137,27],[-93,37],[-77,41],[-31,22],[-11,18],[-12,54],[-13,90],[-12,61],[-12,31],[-1,27],[26,57],[74,63],[2,10],[-15,3],[-31,16],[-10,23],[-4,37],[0,32],[3,25],[13,33],[32,57],[46,71],[49,65],[9,22],[4,58],[7,43],[6,30],[11,22],[31,43],[38,41],[60,34],[5,13],[1,18],[3,13],[6,9],[149,110],[68,45],[57,29],[69,21],[195,43],[101,12],[127,-3],[233,-24],[28,-17],[7,-9],[10,-24],[-7,-16],[-64,-52],[-80,-44],[-53,-38],[-88,-86],[-24,-30],[-110,-173],[-26,-28],[-15,-23],[-11,-63],[4,-22],[17,-36],[59,-79],[16,-36],[0,-34],[-7,-81],[-1,-41],[3,-39],[12,-56],[22,-73],[51,-74],[79,-74],[59,-50],[59,-36],[69,-54],[15,-26],[-32,-29],[-74,-44],[-98,-19],[-52,-18],[-65,-39],[-82,-30],[-32,-19]],[[32833,80122],[-117,-8],[-92,36],[-69,17],[-67,31],[-146,100],[-16,35],[-14,43],[-28,39],[-30,32],[-154,98],[-13,34],[31,23],[36,10],[31,-1],[104,-38],[130,-34],[56,-26],[64,-38],[62,-47],[140,-125],[24,-10],[63,-61],[23,-46],[11,-38],[-14,-19],[-15,-7]],[[32274,78610],[8,-8],[13,15],[15,47],[41,-12],[22,-21],[12,4],[12,-2],[23,-28],[44,-22],[46,4],[70,13],[8,5],[72,11],[72,5],[25,-12],[9,-12],[5,-14],[-41,-38],[-41,-44],[-58,-44],[-7,-21],[4,-39],[-1,-40],[11,-3],[7,-14],[-15,-13],[-59,-6],[-17,4],[-21,16],[-7,39],[-25,-6],[-7,5],[35,32],[-16,42],[-18,-3],[-11,19],[1,27],[16,13],[5,14],[-22,-13],[-17,-24],[-21,-9],[-22,-22],[33,-6],[-17,-17],[-17,-3],[-81,32],[-20,12],[-26,34],[-19,45],[11,2],[3,8],[-2,7],[-28,6],[-45,-2],[-25,12],[1,79],[-8,22],[-28,18],[-42,5],[-4,30],[13,44],[21,39],[16,37],[18,31],[46,62],[-1,-46],[4,-40],[-30,-79],[52,-79],[6,-17],[5,-21],[-4,-19],[-8,-18],[20,-8],[6,-15]],[[27222,88107],[11,-17],[3,-24],[-4,-32],[-7,-30],[-10,-27],[-25,-44],[-76,-77],[-28,-42],[-22,-25],[-124,-111],[-16,-6],[-16,2],[-34,17],[-34,3],[-90,-45],[-4,8],[-4,48],[-9,27],[-40,57],[-2,13],[0,16],[3,13],[45,54],[101,193],[24,10],[49,-22],[24,-7],[17,1],[72,41],[68,-5],[63,24],[29,0],[23,-4],[13,-9]],[[27904,87794],[22,-16],[36,-52],[14,-26],[4,-36],[-10,-48],[-5,-44],[-13,-34],[-25,-42],[-22,-50],[-20,-56],[-15,-38],[-13,-18],[-14,-10],[-14,-1],[-23,21],[-30,42],[-24,25],[-31,18],[-17,23],[-3,23],[-1,76],[1,37],[4,32],[7,25],[16,34],[44,75],[26,29],[16,7],[43,-6],[18,2],[14,9],[15,-1]],[[28979,91199],[145,-51],[14,-19],[7,-16],[4,-19],[0,-38],[-3,-15],[-14,-36],[-1,-12],[11,-123],[-1,-67],[-10,-56],[-21,-45],[-31,-34],[-24,-20],[-105,-48],[-75,-12],[-79,-2],[-100,-13],[-46,3],[-24,5],[-17,10],[-19,30],[-23,51],[-18,58],[-23,102],[0,12],[21,83],[29,56],[50,82],[57,81],[14,14],[26,14],[64,23],[54,-6],[23,3],[29,10],[33,3],[53,-8]],[[27906,94270],[47,-7],[300,14],[63,-11],[189,-64],[48,-21],[25,-28],[21,-45],[10,-10],[69,-26],[28,-32],[10,-17],[14,-38],[31,-22],[36,-12],[11,-11],[-5,-48],[15,-22],[33,-27],[13,-18],[-26,-22],[-61,-13],[-170,13],[-228,31],[-133,-9],[-67,-14],[-161,-49],[-51,-8],[-51,-1],[-89,40],[-32,22],[-11,16],[-21,49],[-17,58],[-9,48],[-10,37],[-31,12],[-90,14],[-30,20],[-14,17],[-13,27],[0,27],[7,25],[6,6],[11,1],[-25,29],[-9,33],[-1,46],[4,29],[7,13],[17,8],[39,5],[58,-1],[81,-33],[64,-4],[98,-27]],[[27574,82227],[-19,-8],[-58,16],[-24,11],[-71,41],[-135,61],[-46,31],[-10,22],[25,48],[13,19],[15,12],[143,22],[55,-11],[65,-97],[38,-66],[15,-52],[0,-26],[-6,-23]],[[28103,84184],[-14,-8],[-10,1],[2,19],[14,38],[8,34],[2,28],[6,25],[10,22],[11,11],[15,-1],[4,-70],[-5,-32],[-10,-28],[-14,-22],[-19,-17]],[[28073,84254],[-23,-58],[-18,-56],[-25,-106],[-15,-3],[-13,25],[37,123],[1,14],[-1,12],[-11,18],[-11,-21],[-52,-139],[-13,-22],[-11,-13],[-9,-2],[-22,3],[-44,-40],[74,165],[1,13],[-14,8],[-6,-5],[-60,-104],[-34,-40],[-23,13],[-6,10],[2,13],[59,104],[54,75],[22,48],[9,44],[4,33],[0,36],[3,10],[3,-2],[3,-14],[1,-38],[-12,-77],[-10,-38],[-12,-32],[5,-7],[22,18],[18,38],[15,57],[9,50],[10,80],[3,-3],[4,-16],[10,-11],[15,-7],[9,-10],[6,-26],[7,-12],[23,-10],[9,-8],[6,-29],[-1,-16],[3,-9],[7,-5],[-8,-31]],[[27784,84220],[-14,-4],[-17,8],[9,42],[14,18],[36,17],[7,11],[11,6],[17,0],[19,15],[21,32],[7,4],[-14,-46],[-16,-34],[-80,-69]],[[25046,96352],[-73,-33],[-37,1],[-212,67],[-43,33],[-8,23],[-2,32],[0,43],[9,30],[12,10],[25,10],[49,7],[46,-4],[70,-12],[70,-19],[92,-60],[34,-28],[7,-37],[0,-22],[-5,-17],[-10,-10],[-24,-14]],[[20956,96279],[-43,-10],[-84,23],[-56,10],[-45,42],[-49,57],[-39,62],[-14,37],[-28,22],[-10,36],[-51,57],[8,9],[48,8],[77,-11],[36,-20],[47,-34],[60,-54],[18,-24],[4,-33],[11,-17],[51,-4],[63,-43],[12,-17],[13,-34],[-1,-16],[-10,-34],[-18,-12]],[[22558,97915],[6,-75],[-6,-38],[-14,-28],[-12,-7],[-17,0],[-76,21],[-23,13],[-1,11],[-8,21],[-50,27],[-95,-4],[-40,3],[-16,8],[-10,12],[-9,47],[2,17],[11,29],[7,7],[70,27],[20,2],[85,-10],[75,-1],[38,-7],[34,-17],[20,-26],[9,-32]],[[20753,93847],[-14,-3],[-26,14],[-39,29],[-63,60],[-75,59],[-12,36],[-19,26],[-96,63],[-62,26],[-48,13],[-7,17],[33,51],[37,41],[23,15],[70,13],[236,27],[54,1],[56,-13],[78,-56],[32,-6],[20,-13],[17,-21],[9,-21],[0,-44],[-8,-64],[-11,-25],[-47,-82],[-49,-46],[-10,-29],[-20,-23],[-35,-29],[-24,-16]],[[21603,95630],[58,-35],[3,-9],[-11,-6],[-75,-19],[-29,-15],[-25,-35],[-19,-16],[-101,-10],[-103,1],[20,33],[56,56],[-44,22],[-158,-38],[-60,24],[51,60],[-51,5],[-71,0],[-46,36],[16,42],[94,24],[122,20],[131,31],[103,-3],[40,-14],[14,-49],[12,-59],[18,-5],[55,-41]],[[21105,95957],[13,-3],[43,12],[27,2],[30,-22],[8,-14],[110,-36],[38,-16],[5,-10],[-13,-15],[-33,-20],[-31,-13],[-44,-11],[-222,-2],[-24,5],[-14,18],[-28,65],[-19,36],[-8,24],[5,14],[24,13],[82,21],[36,0],[23,-5],[9,-11],[-3,-14],[-14,-18]],[[17131,95379],[-79,-37],[-57,4],[-75,27],[-61,10],[-21,9],[-3,9],[20,26],[26,21],[62,41],[105,78],[69,30],[67,21],[69,47],[38,21],[33,2],[33,-9],[4,-13],[-35,-64],[-25,-26],[-49,-67],[-93,-112],[-28,-18]],[[18380,96632],[-76,-19],[-51,0],[-89,28],[-103,84],[-14,30],[39,5],[28,9],[17,13],[34,15],[76,21],[10,-8],[-2,-18],[6,-16],[28,-4],[26,-11],[53,-36],[36,-7],[13,-8],[6,-12],[22,-21],[0,-11],[-30,-22],[-29,-12]],[[13631,83225],[-6,-1],[-3,12],[2,25],[9,42],[4,9],[36,-7],[5,-3],[1,-8],[-2,-13],[-12,-19],[-34,-37]],[[13603,81774],[-5,-1],[-9,12],[-7,19],[-4,51],[3,20],[3,8],[24,-32],[-5,-77]],[[13823,82925],[-8,-21],[-20,-32],[-13,-13],[-6,6],[-18,4],[-19,32],[-14,13],[-10,1],[-5,-12],[-1,-15],[3,-20],[-2,-9],[-6,2],[-5,9],[-6,16],[-1,17],[4,17],[13,24],[42,47],[13,9],[14,-2],[23,-22],[5,-7],[17,-44]],[[13931,82469],[-6,-2],[-18,7],[-60,98],[-43,35],[-29,48],[-30,31],[18,50],[16,-6],[56,-41],[44,-39],[25,-26],[53,-110],[-4,-16],[-22,-29]],[[13829,83540],[3,-46],[-40,-76],[-52,-38],[-11,12]],[[14291,82338],[13,-184],[-1,-59],[-19,-38],[-13,-65],[-15,-29],[-15,39],[-1,64],[-4,51],[-5,24],[6,95],[-6,-7],[-18,-41],[-19,-3],[-34,47],[-17,38],[-3,40],[-22,42],[-3,15],[2,16],[19,42],[7,28],[7,58],[7,23],[18,-3],[31,-27],[33,-28],[30,-39],[22,-99]],[[14974,80272],[8,-52],[-34,9],[-12,10],[0,25],[6,23],[26,-8],[6,-7]],[[15513,80374],[4,-12],[-62,45],[-27,27],[-10,19],[-6,11],[-32,28],[-5,13],[7,10],[21,-6],[35,-21],[32,-35],[43,-79]],[[14822,80417],[-11,-2],[-18,7],[-19,16],[-35,44],[-3,10],[3,9],[9,7],[3,11],[-8,32],[27,20],[25,-17],[11,-20],[13,-36],[6,-41],[1,-28],[-4,-12]],[[15226,80700],[-3,-30],[-17,49],[-28,105],[4,24],[12,35],[11,2],[18,-16],[16,-29],[3,-11],[10,-30],[5,-27],[-11,-33],[-20,-39]],[[14184,82090],[-9,-26],[-37,63],[-13,18],[-28,67],[-5,29],[1,17],[5,6],[9,-4],[8,-8],[53,-74],[15,-35],[1,-53]],[[14465,81493],[-4,-9],[-11,0],[-18,10],[-13,21],[-16,66],[2,12],[5,12],[25,24],[10,-3],[3,-18],[15,-39],[5,-11],[0,-46],[-3,-19]],[[14342,82027],[-21,-7],[7,31],[2,18],[-4,17],[-3,33],[-1,79],[21,49],[33,1],[-1,-25],[-14,-111],[-7,-51],[-5,-19],[-7,-15]],[[14079,82368],[-4,-5],[-11,8],[-11,15],[-19,43],[-6,18],[-4,29],[3,5],[9,-3],[5,-5],[30,-70],[8,-35]],[[14120,82440],[-2,-4],[-28,0],[-8,6],[-5,12],[-2,19],[4,22],[17,42],[1,18],[3,8],[12,-22],[5,-19],[3,-82]],[[15712,79927],[-11,-15],[-7,2],[-5,10],[-18,102],[8,-3],[24,-31],[-5,-12],[18,-31],[4,-21],[-8,-1]],[[33392,77153],[-37,-20],[-32,1],[-22,19],[-1,8],[51,-8],[19,5],[39,32],[-17,-37]],[[33066,78046],[-12,-4],[-2,8],[-18,24],[-1,12],[15,11],[32,-6],[-12,-30],[-2,-15]],[[32801,79080],[10,-11],[18,1],[12,-4],[-17,-21],[-33,-3],[-16,9],[23,110],[27,26],[56,71],[22,22],[21,9],[21,-5],[-22,-43],[-30,-2],[-28,-35],[-18,-40],[-23,-22],[-15,-27],[-8,-35]],[[32081,79427],[-7,-42],[-25,-36],[-12,-2],[-5,3],[6,23],[0,40],[20,6],[7,-4],[16,12]],[[32090,79469],[-32,-30],[14,45],[6,11],[5,5],[5,-4],[2,-27]],[[31590,77357],[-14,-21],[4,20],[17,51],[11,7],[-18,-57]],[[31455,77581],[-38,-31],[15,78],[12,24],[15,-8],[-2,-47],[-2,-16]],[[29565,78034],[-22,-11],[-36,11],[-41,-15],[-11,0],[30,42],[46,27],[46,80],[13,2],[-18,-91],[-3,-33],[-4,-12]],[[29529,78102],[-34,-12],[-11,5],[37,56],[42,13],[-34,-62]],[[30270,78843],[-25,-5],[6,20],[35,36],[25,20],[15,0],[-24,-44],[-32,-27]],[[34573,81059],[-9,-6],[-9,0],[-8,7],[-1,11],[8,23],[21,12],[17,-3],[-1,-12],[-9,-19],[-9,-13]],[[34846,80408],[-43,-34],[-10,-13],[-12,-7],[-9,11],[-12,35],[2,12],[12,2],[7,-5],[1,-11],[5,-6],[9,0],[32,35],[16,5],[6,-6],[-4,-18]],[[34622,81733],[-14,-1],[-3,7],[6,22],[15,26],[20,7],[-6,-38],[-18,-23]],[[34974,80497],[20,-37],[11,-10],[-72,-41],[-8,-2],[-5,4],[-1,38],[4,29],[5,5],[16,-18],[17,36],[13,-4]],[[34937,79171],[-14,-20],[-14,0],[2,18],[17,34],[8,24],[1,15],[3,11],[13,13],[11,23],[-5,-43],[-22,-75]],[[31993,87879],[53,-6],[33,2],[14,-9],[13,-28],[-17,-40],[-19,-16],[-31,-4],[-50,13],[-17,8],[-16,22],[7,15],[25,5],[4,7],[-6,12],[0,10],[7,9]],[[31046,86544],[-25,-5],[-12,12],[0,35],[8,26],[29,55],[25,62],[15,14],[31,-10],[18,-17],[18,-30],[8,-22],[-7,-34],[-22,-29],[-25,-21],[-61,-36]],[[30462,87873],[-20,-2],[-37,4],[-40,12],[-23,14],[-19,29],[-4,33],[-38,48],[-42,16],[-23,33],[24,3],[34,-8],[49,-14],[45,-19],[64,-42],[21,-40],[21,-28],[7,-22],[-6,-10],[-13,-7]],[[31991,87192],[-7,-7],[-6,2],[-21,30],[-28,13],[-10,12],[-84,63],[-9,28],[-2,22],[28,11],[56,10],[49,-1],[46,-13],[9,-14],[24,-26],[-6,-30],[-2,-40],[-10,-19],[-15,-14],[-12,-27]],[[31936,87487],[6,-5],[7,6],[6,-5],[4,-16],[6,-12],[17,-14],[5,-11],[0,-11],[-14,-16],[-9,0],[-66,37],[-18,39],[-1,19],[7,18],[10,8],[13,0],[16,-10],[11,-27]],[[30789,85852],[-17,-42],[-23,5],[-8,-8],[-6,-1],[10,39],[1,27],[-5,27],[8,13],[30,1],[0,-31],[4,-11],[7,-6],[-1,-13]],[[32109,86616],[-10,-40],[-32,15],[-50,30],[-20,20],[-7,22],[0,30],[15,5],[37,3],[32,-42],[9,-6],[26,-37]],[[33057,84123],[3,-14],[-43,10],[-15,9],[-1,9],[2,15],[8,17],[20,13],[11,-7],[23,-17],[3,-11],[-11,-24]],[[32849,84996],[23,-17],[6,-63],[-44,4],[-50,42],[-10,31],[1,5],[7,5],[13,-7],[12,11],[13,3],[29,-14]],[[31134,91901],[-7,-4],[-72,26],[-6,21],[36,24],[29,12],[22,2],[22,-4],[21,-25],[-25,-23],[-20,-29]],[[32588,90469],[-34,-15],[-19,19],[13,6],[19,23],[26,20],[11,17],[43,8],[15,-1],[5,-6],[-24,-26],[-55,-45]],[[28038,95579],[3,-34],[-20,1],[-65,-22],[-52,-3],[-26,10],[-17,23],[41,43],[47,31],[57,47],[47,30],[23,-6],[22,-16],[-28,-47],[-30,-23],[-2,-34]],[[27814,84547],[-7,-10],[-14,11],[0,29],[13,22],[10,-1],[10,-12],[-3,-15],[-9,-24]],[[27856,84974],[-4,-5],[-12,4],[-5,-38],[-4,-3],[-9,23],[7,20],[-1,14],[2,10],[12,23],[7,5],[4,-2],[4,-29],[-1,-22]],[[27911,84479],[-9,-7],[-7,0],[7,51],[-8,18],[-1,9],[4,9],[5,2],[11,-16],[6,-17],[2,-16],[0,-16],[-4,-11],[-6,-6]],[[27795,82548],[-1,-17],[-18,3],[-9,10],[-8,15],[-2,12],[7,11],[21,-7],[10,-27]],[[27949,81769],[-12,-4],[-26,4],[-22,15],[-13,18],[86,51],[18,-6],[0,-10],[-13,-27],[-3,-18],[-6,-14],[-9,-9]],[[15730,80003],[-4,-7],[-43,41],[-29,54],[-12,32],[57,-81],[29,-26],[2,-13]],[[15284,80661],[-7,-5],[-7,66],[9,23],[2,12],[-1,13],[15,-30],[6,-20],[2,-27],[0,-8],[-19,-24]],[[29549,90889],[-135,-1],[-74,4],[-29,9],[-26,13],[-29,45],[-19,45],[-1,20],[5,17],[7,11],[91,15],[74,-19],[64,-22],[83,-4],[25,-9],[9,-6],[7,-11],[9,-53],[1,-28],[-2,-21],[-60,-5]],[[28367,88404],[24,-25],[24,2],[14,-20],[32,-63],[3,-10],[-1,-21],[-17,-26],[-18,-13],[-37,-20],[-42,-9],[-23,14],[-64,58],[-59,68],[-19,38],[8,16],[25,11],[51,11],[83,-6],[16,-5]],[[23742,95477],[-27,0],[-35,12],[-10,12],[-8,17],[-5,22],[-7,18],[-10,13],[-2,10],[6,9],[11,5],[27,2],[57,22],[11,-2],[8,-12],[7,-31],[9,-19],[22,-34],[10,-22],[-2,-6],[-7,-6],[-55,-10]],[[27698,86188],[-9,-2],[-2,7],[7,24],[12,3],[13,26],[12,-9],[-4,-15],[-16,-22],[-13,-12]],[[27760,86273],[-29,-4],[13,34],[10,16],[12,11],[24,4],[16,-14],[-15,-25],[-31,-22]],[[23116,93857],[-45,-6],[-41,40],[-2,38],[3,21],[5,18],[15,16],[43,18],[19,-13],[7,-17],[6,-6],[28,-14],[13,-16],[-2,-19],[-8,-28],[-10,-18],[-11,-8],[-20,-6]],[[22957,94772],[-84,-34],[-18,13],[-8,12],[65,53],[28,14],[27,-16],[7,-13],[-3,-9],[-14,-20]],[[22702,94394],[-80,-13],[-36,6],[-20,-16],[-15,-7],[-44,-3],[-90,29],[-24,10],[-9,9],[4,9],[16,9],[69,12],[25,10],[11,13],[17,11],[24,8],[65,8],[146,41],[72,5],[28,-3],[9,-11],[2,-10],[-4,-11],[-22,-28],[-30,-21],[-79,-46],[-35,-11]],[[24944,91831],[6,-36],[-24,-49],[-8,-8],[-10,-4],[-9,6],[-28,38],[-8,24],[10,12],[22,15],[15,7],[20,-6],[6,10],[8,-9]],[[24863,91716],[-23,-6],[-14,24],[-12,5],[-5,16],[-24,3],[2,25],[7,12],[22,10],[17,-4],[17,-25],[8,-20],[7,-25],[-2,-15]],[[29444,87913],[-15,-5],[-55,7],[-69,27],[-35,25],[2,8],[15,4],[18,-4],[29,-17],[80,-9],[25,-10],[8,-16],[-3,-10]],[[29199,91214],[-21,-4],[-32,36],[-66,40],[-25,30],[-1,14],[2,22],[8,27],[23,30],[24,5],[35,-7],[25,-21],[27,-59],[19,-29],[5,-21],[-9,-10],[1,-10],[4,-6],[-1,-11],[-8,-16],[-10,-10]],[[28185,86824],[-38,-6],[0,8],[16,24],[59,20],[44,6],[-10,-20],[-26,-16],[-45,-16]],[[28060,91124],[-23,-6],[-30,30],[0,17],[6,41],[55,10],[24,-24],[11,-24],[-43,-44]],[[28700,88360],[-29,-6],[-38,13],[-38,25],[-85,80],[64,54],[102,-63],[31,-40],[-7,-63]],[[27936,92043],[11,-33],[7,-11],[-11,-15],[-41,-31],[-92,-13],[-46,14],[22,-44],[4,-19],[-6,-8],[-20,2],[-31,13],[-19,15],[-4,18],[-7,4],[-9,-10],[-8,2],[-19,27],[-14,9],[-92,16],[-4,7],[5,12],[14,18],[20,5],[52,-7],[4,4],[4,22],[4,9],[36,-3],[22,5],[13,-11],[12,-26],[17,5],[26,-4],[28,9],[43,23],[33,9],[46,-13]],[[28325,92001],[14,-29],[3,-15],[-20,-17],[-74,-33],[-46,-28],[-22,-7],[-31,7],[-37,-14],[-15,2],[17,23],[58,67],[49,7],[16,14],[14,-5],[8,12],[1,17],[17,13],[16,0],[32,-14]],[[28432,88704],[-20,-26],[-59,9],[-8,8],[-2,10],[9,12],[61,12],[26,1],[14,-4],[1,-4],[-22,-18]],[[26910,90024],[28,-7],[21,1],[4,-9],[-22,-28],[-13,-5],[-25,20],[-18,25],[-5,15],[-2,16],[4,3],[28,-31]],[[27997,91500],[-19,-4],[-23,11],[-8,19],[-4,19],[4,10],[10,9],[13,21],[18,32],[27,22],[60,21],[8,7],[27,58],[9,9],[30,6],[3,8],[-10,14],[0,14],[10,15],[15,12],[39,10],[35,-2],[9,-4],[7,-10],[11,-27],[1,-6],[-16,-24],[-42,-36],[-26,-31],[-5,-10],[-3,-13],[-9,-15],[-31,-38],[-20,-36],[-21,-20],[-56,-19],[-43,-22]],[[28612,91672],[-35,-7],[-26,4],[-17,13],[-13,19],[-16,46],[6,22],[2,38],[3,15],[6,7],[37,14],[21,-2],[32,-15],[69,-4],[18,-14],[4,-8],[-1,-10],[-4,-12],[-34,-35],[-17,-24],[-12,-29],[-23,-18]],[[25857,92230],[32,-4],[30,5],[22,-5],[13,-16],[9,-17],[5,-18],[-12,-13],[-49,-11],[-34,6],[-35,15],[-17,-7],[-41,11],[-20,14],[-17,21],[0,13],[43,14],[17,12],[54,-20]],[[26743,89744],[35,-23],[36,-13],[57,-6],[8,-5],[0,-11],[-8,-16],[-19,-22],[-14,0],[-31,15],[-12,7],[-13,17],[-6,2],[-9,-6],[-2,-7],[4,-10],[-5,-2],[-39,6],[-6,6],[3,18],[27,27],[-23,8],[-8,10],[-35,-17],[-19,-4],[-30,12],[-4,60],[-3,23],[-14,15],[-9,16],[-13,12],[-27,12],[-23,30],[-4,14],[3,10],[13,14],[79,-30],[48,-29],[46,-36],[23,-26],[2,-17],[-5,-17],[-14,-17],[11,-20]],[[25945,90861],[-11,-1],[-19,9],[-43,35],[-9,15],[-4,17],[0,21],[3,20],[14,42],[-26,33],[-6,19],[3,10],[14,26],[4,16],[14,22],[37,44],[37,-10],[32,-36],[9,-24],[-3,-26],[3,-37],[8,-49],[3,-36],[-4,-22],[-14,-41],[-12,-20],[-16,-18],[-14,-9]],[[26479,89616],[-15,-6],[-15,3],[-13,17],[-11,30],[-17,22],[-39,28],[-7,11],[-11,37],[-2,37],[-9,34],[0,16],[7,25],[33,6],[26,-10],[5,-7],[8,-14],[6,-18],[31,-47],[18,-38],[25,-78],[0,-15],[-7,-16],[-13,-17]],[[24154,87467],[-11,-1],[-26,29],[-5,15],[33,9],[23,-26],[-2,-12],[-12,-14]],[[21881,95955],[-72,-2],[-33,6],[-2,11],[29,13],[95,22],[57,39],[21,5],[73,6],[43,-1],[55,-10],[-132,-49],[-134,-40]],[[21388,96858],[-32,-12],[-37,7],[-6,7],[0,9],[3,10],[42,36],[38,12],[23,3],[18,-13],[10,-18],[-59,-41]],[[21752,96599],[-39,-6],[-69,3],[-83,21],[-22,24],[-5,38],[1,22],[7,4],[51,5],[96,6],[78,-5],[88,-22],[36,-14],[18,-10],[22,-20],[8,-8],[5,-16],[-110,-4],[-52,-6],[-30,-12]],[[25076,95914],[-13,-8],[-42,4],[-14,-8],[-22,5],[-31,16],[-36,32],[-41,48],[-32,41],[-1,12],[10,19],[32,13],[76,15],[52,0],[48,-31],[14,-11],[8,-13],[1,-12],[-4,-11],[-22,-24],[-10,-16],[0,-17],[5,-23],[9,-16],[13,-8],[0,-7]],[[23311,95339],[-21,-19],[-23,-1],[-30,18],[-32,-7],[-45,-36],[-16,-22],[-12,-7],[-37,-7],[-16,6],[-15,19],[-14,32],[10,24],[35,16],[93,27],[26,13],[3,14],[6,9],[8,4],[62,-23],[29,-16],[22,-18],[-2,-8],[-31,-18]],[[23526,94760],[-13,-2],[-25,3],[-93,26],[-16,10],[-4,8],[21,9],[8,10],[23,12],[42,0],[44,-29],[21,-27],[1,-12],[-9,-8]],[[16368,95475],[-22,-3],[-24,6],[5,15],[54,41],[3,11],[0,9],[-7,11],[14,15],[22,5],[7,-5],[2,-12],[-5,-36],[-6,-18],[-10,-14],[-14,-14],[-19,-11]],[[18455,96049],[-42,-18],[-289,27],[-15,9],[-8,12],[52,33],[64,14],[146,11],[51,-13],[34,-15],[19,-12],[8,-24],[-20,-24]],[[21078,95066],[-53,-3],[-90,18],[-54,33],[-17,16],[2,8],[9,7],[13,22],[31,63],[12,17],[48,36],[36,10],[75,-3],[44,-19],[18,-12],[13,-15],[13,-32],[3,-21],[22,-24],[7,-14],[0,-14],[-6,-14],[-12,-13],[-29,-21],[-85,-25]],[[22162,91478],[-9,-18],[-11,-6],[-22,-21],[-8,-3],[-13,14],[-11,22],[-4,3],[-7,0],[-14,-15],[-7,1],[-5,9],[-3,19],[0,29],[7,43],[1,16],[-4,12],[3,12],[10,10],[12,4],[30,-4],[23,-17],[12,-23],[23,-18],[7,-13],[-10,-56]],[[22223,91597],[-6,-34],[-34,9],[-15,12],[-13,28],[-2,8],[3,10],[14,25],[9,9],[23,-11],[10,-14],[8,-23],[3,-19]],[[22136,92451],[-3,-5],[-60,22],[-23,12],[-8,10],[-5,19],[-3,28],[12,14],[27,-1],[28,-11],[44,-31],[-12,-10],[-1,-20],[5,-20],[-1,-7]],[[23468,91920],[37,-39],[0,-19],[-5,-31],[-11,-24],[-16,-16],[-23,-8],[-29,-1],[-13,7],[10,24],[7,8],[1,21],[-5,35],[-6,22],[-16,12],[-12,1],[-3,-12],[5,-23],[-4,-30],[-13,-38],[-9,-17],[-18,9],[-8,14],[2,23],[-4,22],[4,22],[12,34],[17,22],[21,12],[26,-1],[29,-13],[24,-16]],[[21897,91818],[-23,-5],[-4,1],[2,16],[-2,8],[-6,5],[20,13],[3,10],[-7,7],[-27,14],[-8,13],[2,11],[10,10],[19,-2],[41,-18],[19,-26],[8,-20],[-13,-3],[-11,-8],[-11,-16],[-12,-10]],[[21709,91351],[-11,-1],[-16,10],[-90,35],[-11,11],[10,15],[33,19],[22,19],[17,30],[51,-16],[19,-14],[8,-12],[3,-17],[-3,-41],[-17,-9],[-15,-29]],[[20961,91247],[-16,-2],[-28,9],[-43,21],[-31,21],[-21,23],[-3,16],[16,9],[24,4],[57,-3],[28,-8],[36,-34],[7,-19],[2,-12],[-5,-11],[-23,-14]],[[20028,90668],[-14,-48],[-6,5],[-9,23],[-20,11],[-21,25],[0,55],[8,25],[-2,35],[22,21],[16,-25],[5,-42],[-4,-20],[16,-22],[7,-5],[4,-17],[-2,-21]],[[19676,91003],[31,-6],[23,4],[17,-23],[7,-23],[-2,-8],[-8,-4],[-49,26],[-18,16],[-6,14],[5,4]],[[19974,90440],[35,-5],[45,1],[-8,-44],[-17,-29],[-14,-8],[-6,16],[-26,35],[-9,34]],[[19632,91008],[-10,-2],[-38,34],[8,30],[35,-31],[5,-18],[0,-13]],[[11377,91921],[-23,-21],[-37,22],[-9,11],[42,30],[19,-1],[39,-18],[14,-15],[-45,-8]],[[52722,53170],[6,135],[12,113],[5,105],[18,93],[-9,93],[-11,40],[-57,131],[26,50],[-34,-7],[-7,49],[-17,58],[10,10],[10,32],[31,-10],[-1,16],[-27,49],[3,25],[11,27],[-6,12],[-19,-29],[-14,1],[-10,19],[-8,3],[5,-38],[-11,-33],[-10,-12],[-18,2],[-14,8],[-4,19],[-13,15],[-38,24],[-31,30],[-7,80],[-12,34],[-6,39],[-3,44],[5,69],[-8,11],[-9,3],[-14,-3],[-13,4],[-15,38],[-13,14],[8,-69],[-9,-20],[-23,6],[-9,26],[-2,20],[10,84],[-4,2]],[[78623,58343],[-5,-5],[-5,0],[-5,8],[1,34],[3,20],[9,4],[2,-61]],[[78699,58017],[-11,-22],[-16,46],[0,12],[27,-36]],[[79007,57840],[-46,75],[-90,26],[-10,33],[-9,6],[-8,-43],[-50,-41],[-21,25],[-15,30],[2,37],[15,30],[24,22],[12,76],[-19,97],[-16,28],[-18,23],[-18,-37],[-15,-61],[-16,-32],[-23,-7],[-33,2],[-13,93],[-4,79],[4,90],[5,53],[-32,74],[-2,70],[-15,37],[-4,-19],[0,-20]],[[77417,57713],[-13,-7],[-26,-83],[-12,42],[-7,43],[8,98],[-16,186],[10,25],[9,13],[18,71],[21,70],[2,85],[17,61],[-4,52],[1,61],[4,49],[-2,41],[14,42],[24,32],[-10,11],[-10,23],[-31,-35],[-16,11],[-3,37],[4,39],[2,23],[12,27],[-1,52],[-6,46],[9,57],[-18,0],[-9,11],[5,32],[17,28],[-15,53],[11,57],[0,71],[-8,62],[0,45],[-11,79],[-6,101],[-24,76],[-19,110],[-48,144],[0,61],[-2,54],[-11,27],[-14,-192],[-11,38],[-3,107],[-7,50],[7,101],[-28,100],[-6,73],[-19,110],[6,25],[25,-25],[-23,64],[-19,-14],[-16,69],[-3,188],[-16,70],[9,71],[-18,257],[-35,82],[7,72],[9,63],[-2,118],[8,36],[17,28],[-16,-10],[-13,-8],[-32,-7],[-36,-2],[-12,86],[-18,41],[-16,86],[-9,98],[6,19],[-27,40],[-8,24],[-29,64],[-33,48],[8,-34],[9,-21],[-17,-59],[16,-99],[-14,-63],[-13,-82],[-12,-40],[-40,-84],[-32,-29],[-21,-5],[-19,9],[-23,44],[-5,36],[-4,61],[-8,9],[-9,-7],[14,-79],[0,-37],[24,-71],[-9,-20],[-44,-38],[-15,6],[-10,-8],[-3,-32],[-6,-18],[-69,-48],[-14,-56],[-9,-55],[-35,-80],[-46,-66],[-11,3],[-13,16],[2,71],[15,61],[-5,64],[-3,-37],[-30,-90],[-14,-29],[-27,8],[-38,-12],[-14,92],[0,34],[-3,29],[5,30],[-2,25],[-9,-47],[-3,-40],[-14,-35],[-38,-39],[-1,49],[-2,44],[8,39],[-1,63],[12,90],[-1,31],[-3,34],[-7,-50],[-4,-51],[-8,-16],[-13,-11],[-26,-60],[-15,-52],[-40,-50],[-20,5],[-3,63],[16,225],[15,32],[8,39],[12,131],[15,50],[6,104],[6,18],[19,82],[7,150],[-8,75],[-18,72],[-18,217],[-46,176],[-4,59],[-22,71],[21,5],[-43,62],[-6,26],[-9,146],[2,81],[-6,-11],[-6,-50],[-17,-21],[7,-87],[-1,-21],[-9,-33],[-36,35],[-26,38],[-30,93],[-29,104],[10,16],[13,2],[42,-77],[27,-16],[17,19],[21,33],[10,64],[-11,24],[-20,13],[-13,17],[-20,43],[-2,23],[-6,28],[-20,20],[-16,25],[14,45],[13,34],[-35,-2],[-39,58],[-9,16],[-13,12],[-31,7],[-26,-17],[12,-82],[-2,-27],[-17,4],[-36,124],[11,32],[15,30],[-7,4],[-15,-2],[14,111],[-9,16],[-4,-34],[-8,-34],[-30,-78],[-15,15],[-10,19],[14,41],[8,11],[5,22],[-11,43],[-18,32],[-14,53],[-7,1],[6,-63],[-2,-91],[-32,100],[-64,143],[-15,42]],[[75645,63819],[-4,42],[-7,39],[-5,42],[-1,33],[-14,29],[-6,52],[-3,52],[8,38],[19,40],[15,7],[11,-18],[28,-27],[19,-24],[8,-33],[8,4],[9,21],[-2,25],[-8,68],[-3,81],[0,191],[-3,22]],[[77280,58152],[23,-100],[-3,-15],[-3,-8],[-6,3],[-9,54],[-17,34],[-21,-6],[17,44],[7,10],[12,-16]],[[77272,57565],[-13,-34],[-5,2],[6,55],[23,41],[19,4],[-2,-26],[-14,-31],[-14,-11]],[[77283,58455],[-1,-13],[-2,0],[-7,9],[4,55],[11,44],[11,66],[6,14],[2,-35],[-7,-74],[-5,-40],[-12,-26]],[[77365,58700],[-12,-3],[-5,93],[3,14],[16,-46],[24,-28],[-9,-18],[-17,-12]],[[77375,58608],[-7,-119],[-17,17],[-9,0],[-10,67],[0,18],[-6,44],[41,8],[8,-35]],[[77336,59100],[7,-16],[9,0],[-3,-56],[-22,-69],[-13,-10],[-5,0],[5,101],[-9,57],[3,39],[24,-18],[4,-28]],[[77259,58842],[-3,-3],[-4,1],[-10,10],[-10,39],[5,27],[4,7],[10,-2],[4,-5],[2,-10],[-3,-22],[1,-19],[4,-23]],[[76243,61028],[-18,-56],[-7,84],[30,47],[14,44],[15,31],[5,-37],[-14,-71],[-25,-42]],[[77103,61205],[-10,-7],[-16,37],[-3,90],[13,20],[7,5],[11,-11],[3,-14],[2,-18],[-3,-19],[-4,-83]],[[76024,62605],[-4,-5],[-29,49],[-23,62],[36,12],[35,-13],[1,-33],[-8,-53],[-8,-19]],[[75969,63301],[6,-79],[-19,30],[-7,41],[-2,42],[22,-34]],[[76031,63109],[32,-48],[13,3],[19,-30],[1,-12],[-4,-24],[-9,-19],[-24,-20],[-16,16],[-7,52],[-19,25],[-6,20],[13,29],[7,8]],[[77372,58157],[-6,-1],[-6,2],[-6,9],[14,62],[4,-72]],[[77242,58578],[3,-32],[-18,34],[-3,95],[14,-60],[6,-14],[-2,-23]],[[77240,58980],[-2,-21],[-16,-43],[-14,25],[-4,13],[15,28],[15,-4],[4,6],[2,-4]],[[77309,59388],[-2,-95],[-14,46],[-2,52],[1,49],[3,8],[1,-8],[8,-22],[5,-30]],[[76334,60955],[-6,-15],[-11,11],[-3,6],[26,64],[3,-24],[-9,-42]],[[75835,63320],[4,-55],[-13,22],[-18,76],[1,50],[12,-23],[14,-70]],[[50663,58696],[-7,-33],[-21,-86],[-16,-36],[-69,-121],[-35,14],[-71,-24],[-11,28],[-16,3],[-21,-4],[-8,-11],[-2,-12],[-7,-17],[-14,-48],[-10,-12],[-13,-8],[-15,1],[-9,-6],[0,-24],[-3,-21],[-11,-10],[-4,-23],[1,-23],[-6,-10],[-14,5],[-8,7],[-7,-30],[-10,-20],[-6,0]],[[57940,77040],[-7,-139],[-27,-65],[-40,22],[-52,-18],[-27,-73],[-16,-22],[-14,-26],[-9,-95],[-2,-156],[-19,-19],[-18,-6],[-75,-137],[43,-39],[19,-29],[32,-82],[44,-93],[9,-45]],[[81951,54665],[32,0]],[[81684,54488],[31,-1],[34,10],[35,30],[33,37],[28,43],[27,47],[27,38],[43,44],[15,-4],[0,-31],[-6,-36]],[[35652,54182],[26,99],[3,45],[24,2],[37,-52],[30,-75],[40,-243],[6,-225],[17,-118],[46,-245],[3,-45],[7,-55],[15,-58],[16,-96],[1,-18],[-11,-26],[16,-2],[14,-15],[9,-61],[11,-41],[21,-56],[43,-19],[33,-7],[37,-31],[27,-41],[21,-138],[-7,-87],[2,-61],[-11,-24],[-30,-40],[-7,-22],[-62,-103],[-14,-49],[-33,-65],[-33,-125],[-48,-114],[-17,-29],[-26,-7],[-16,-17],[-37,-93],[-51,-31],[-4,-54],[-29,-124],[-26,-67],[-16,-23],[-41,-122],[-5,-54],[0,-94],[-28,-57],[-28,-37],[-4,-80],[-12,-27],[-11,-18],[-58,21],[-91,-88],[-30,-21],[98,-5],[32,-46],[69,31],[83,110],[32,24],[65,75],[27,50],[48,60],[10,26],[27,29],[15,-36],[1,-23],[-22,-44],[6,-28],[14,-36],[5,-49],[2,-37],[9,-66],[30,-88],[1,-30],[-4,-38],[14,-32],[15,-19],[51,-95],[39,53],[25,15],[15,23],[33,14],[27,-22],[51,-32],[37,34],[75,78],[-23,-138],[-17,-127],[-13,-51],[-13,-138],[-13,-37],[-10,-42],[17,15],[14,20],[18,53],[14,92],[55,247],[16,22],[45,28],[78,197],[31,-1],[19,-45],[19,-27],[4,54],[27,22],[-28,27],[-5,24],[-2,40],[19,55],[-12,48],[40,61],[-3,45],[14,38],[18,39],[21,19],[3,33],[13,14],[10,4],[20,-37],[22,44],[21,17],[9,-7],[12,-20],[12,-8],[10,4],[26,28],[24,-46],[15,-10],[-4,26],[-8,23],[6,20],[11,12],[36,-11],[19,-20],[21,-38],[28,-3],[23,4],[14,-21],[23,1],[11,-33],[35,-46],[7,-31],[28,-16],[27,-19],[28,-5],[28,5],[1,-40],[21,-11],[26,9],[21,-48],[53,-37],[38,-56],[24,10],[27,-15],[30,-121],[6,-87],[13,12],[12,39],[16,71],[29,23],[14,-27],[30,-44],[25,-47],[11,-31],[19,-5],[-16,-38],[16,4],[19,27],[17,-55],[13,-60],[2,-62],[-12,-35],[-10,-22],[-12,-44],[-13,-7],[-14,-14],[16,-32],[10,-30],[24,82],[16,23],[23,13],[13,-59],[2,-55],[-38,-23],[0,-44],[-12,-24],[-7,-29],[-6,-59],[-8,-50],[-23,-218],[0,-36],[27,38],[52,112],[16,118],[20,117],[22,37],[14,0],[20,-13],[1,-38],[-3,-22],[-22,-58],[-9,-32],[9,-32],[50,97],[22,33],[19,-6],[38,44],[76,9],[5,51],[16,22],[41,-6],[82,-45],[29,-37],[43,-35],[23,-41],[96,-76],[69,-8],[34,35],[43,-36],[23,-41],[44,-21],[45,-12],[35,29],[88,10],[112,42],[66,-10],[75,-28],[54,-71],[45,-41],[27,-40],[44,-41],[94,-111],[33,-64],[58,-88],[59,-37],[32,-91],[25,-42],[61,-154],[71,-108],[47,-109],[90,-69],[35,-115],[61,-14],[26,-17],[32,-49],[44,-27],[56,8],[63,-6],[50,23],[120,-43],[19,-21],[24,-49],[44,-182],[26,-202],[13,-154],[30,-120],[16,-226],[14,-71],[1,-54],[12,-13],[7,-152],[-3,-61],[-11,-80],[-1,-35],[2,-23],[-5,-33],[-2,-32],[12,-72],[0,-57],[-15,-70],[-21,-181],[-53,-302],[-51,-173],[-71,-178],[-47,-93],[-18,-10],[-17,19],[12,-50],[-11,-43],[-47,-131],[-46,-86],[-49,-150],[-4,-3],[-62,-58],[-37,-47],[-47,-85],[-43,-135],[-9,-18],[-16,10],[0,-69],[-37,-108],[-11,-16],[0,30],[7,24],[3,25],[-1,29],[-10,-21],[-22,-82],[7,-59],[-16,-90],[-60,-257],[-75,-217],[-17,-66],[-62,-146],[-45,-70],[-12,-1],[-15,6],[-7,112],[-36,68],[-10,12],[-15,-72],[-12,-20],[-18,-4],[19,-31],[6,-36],[-19,-73],[-1,-66],[-34,-72],[-20,-53],[-10,-67],[-7,-62],[16,17],[7,-13],[5,-19],[-3,-29],[-11,-54],[2,-134],[-4,-30],[11,-33],[12,56],[6,-16],[-32,-359],[13,-162],[4,-183],[15,-179],[16,-160],[1,-13],[-22,-185],[-28,-183],[-17,-150],[-11,-161],[-11,-78],[-4,-79],[13,-188],[4,-35],[-34,-84],[-37,-41],[-21,-40],[-45,-151],[-25,-224],[-1,-118],[12,-249],[-9,-102],[-14,-67],[-17,-45],[-44,-53],[-39,-131],[-17,-137],[-27,-50],[-5,-76],[-21,-83],[-56,-124],[-36,-36],[-18,-34],[-11,-72],[-35,-119],[-25,-154],[6,-53],[1,-8],[9,-178],[-3,-46],[-34,-49],[-128,-91],[-34,-39],[-77,-156],[-4,-36],[3,-53],[12,-30],[-13,-33],[-15,-59],[-22,4],[-127,0],[-69,-19],[-36,4],[-16,14],[-18,23],[-6,30],[10,46],[-6,27],[-19,-1],[-20,-13],[-4,-27],[1,-20],[8,-28],[4,-35],[-8,-30],[-40,-4],[-46,-28],[-56,-12],[-45,-20],[-21,26],[21,13],[29,-7],[32,21],[-7,25],[-45,32],[-51,-19],[-28,-39],[-61,4],[-75,-29],[-12,-30],[2,-57],[15,-13],[14,-26],[-14,-24],[-13,-11],[-79,-27],[-73,-112],[-31,-14],[-27,-49],[-3,-42],[-8,-25],[-18,-2],[-38,23],[-50,1],[-35,-18],[-183,-182],[-66,-72],[-75,-148],[-126,-166],[-67,-99],[-12,-26],[-11,-1],[-21,-21],[9,-17],[14,-2],[-6,-57],[-26,-40],[-50,-103],[-11,7],[16,54],[-25,2],[-36,20],[-15,-22],[9,-54],[-14,-22],[-24,-3],[-23,6],[-24,39],[11,-70],[51,-18],[22,-16],[8,-27],[-40,-126],[-34,-17],[-3,-17],[18,0],[10,-35],[-12,-141],[-16,-26],[-10,-1],[-10,-24],[14,-46],[13,-33],[-2,-65],[-5,-54],[0,-52],[17,-101],[6,-104],[7,-37],[4,-42],[-11,-39],[6,-63],[-19,-107],[10,-154],[-4,-144],[-8,-76],[-12,-59],[-29,-76],[-1,-77],[-62,-71],[-69,-99],[-63,-118],[-69,-166],[-80,-252],[-73,-360],[-89,-272],[-36,-98],[-48,-109],[-64,-128],[-86,-128],[-94,-114],[-34,-51],[-33,-73],[-8,30],[7,49],[-4,37],[-1,48],[19,9],[28,-30],[14,20],[11,21],[34,12],[65,125],[48,47],[28,79],[4,42],[-1,85],[16,22],[35,-8],[7,24],[-3,27],[6,59],[48,52],[22,63],[-7,160],[8,7],[20,-25],[9,11],[10,70],[-5,36],[-23,10],[-79,-79],[-26,3],[-4,62],[-39,29],[-15,52],[-4,35],[-14,14],[1,-61],[4,-59],[34,-69],[-8,-28],[-17,-32],[-11,-71],[1,-92],[-9,28],[-12,16],[-5,-99],[-23,-38],[-7,-38],[6,-43],[-12,-30],[-58,-80],[-58,-55],[-13,-26],[-6,-61],[-9,-63],[-26,-55],[-21,-110],[1,-47],[7,-69],[11,-46],[-18,-31],[-23,-59],[-19,-67],[-46,-251],[-40,-151],[-31,-74],[-44,-78],[-125,-196]],[[33997,34453],[13,28],[44,61],[24,54],[5,48],[21,43],[38,38],[41,70],[47,102],[28,75],[9,49],[19,37],[26,26],[23,55],[20,84],[26,66],[35,49],[19,41],[4,32],[9,21],[15,9],[8,17],[-1,25],[5,17],[8,10],[15,-4],[21,-15],[12,3],[4,21],[-5,24],[-15,27],[5,30],[40,48],[29,18],[19,30],[18,47],[28,33],[40,18],[10,18],[-1,23],[8,16],[23,12],[13,22],[2,33],[7,31],[13,28],[15,10],[16,-7],[15,10],[14,29],[17,13],[19,-2],[10,6],[34,14],[18,24],[16,53],[13,20],[12,-12],[21,18],[29,48],[5,1],[22,22],[22,82],[11,55],[-3,45],[-7,32],[3,48],[7,128],[2,53],[12,37],[-1,36],[-21,82],[-21,71],[-12,121],[-7,46],[-18,13],[-16,40],[-20,3],[-9,16],[-10,12],[-15,-3],[-12,-24],[-23,-1],[-14,-9],[-17,-21],[-16,9],[-10,19],[-21,0]],[[33844,40227],[19,8],[7,23],[13,32],[17,8],[20,12],[7,24],[-47,84],[-28,51],[17,69],[27,116],[27,112],[21,85],[5,16],[18,6],[-3,44],[-1,29],[-14,1],[16,105],[24,148],[18,113],[6,19],[13,5],[3,13],[-16,19],[-10,35],[-20,100],[-33,159],[-3,57],[-12,35],[-20,-12],[-24,12],[-60,86],[-39,47],[-13,27],[-6,89],[-12,97],[-5,121],[2,30],[33,91],[0,47],[3,40],[-1,32],[-9,1],[-13,-14],[-20,-11],[-12,-1],[-116,9],[-133,10],[-110,8],[-96,7],[-3,79],[-5,133],[-4,94],[-6,149],[-39,93],[-41,101],[-15,25],[50,4],[36,2],[-7,271],[-11,28],[-10,87],[-6,49],[-18,41],[-4,45],[3,30],[10,19],[7,46],[-5,47],[-11,43],[-13,42],[-24,26],[-36,46],[-53,60],[-45,41],[-15,-5],[-79,-16],[-27,-9],[-18,10],[-59,-1],[-24,32],[-19,37],[-42,95],[-6,47],[-16,15],[-25,-6],[-25,7],[-48,39],[-44,40],[-22,-1],[-20,25],[-34,61],[-16,24],[-7,32],[-7,47],[-14,10],[-18,-9],[-19,-24],[-27,16],[-33,44],[-21,33],[-12,16],[-29,24],[-27,5],[-42,-35],[-34,14],[-54,13],[-46,25],[-17,65],[-9,44],[-27,27],[-22,33],[-26,50],[-13,17],[-23,14],[-22,17],[-2,32],[-8,42],[-2,10],[-15,51],[-7,4],[-8,-10],[-5,-8],[-6,10],[-2,22],[4,37],[-8,38],[-21,40],[-11,41],[-1,43],[-5,29],[-8,14],[-5,25],[-1,36],[6,43],[13,49],[-3,76],[-19,103],[-10,74],[-2,45],[3,34],[11,32],[23,81],[4,61],[-7,69],[-1,52],[5,37],[-8,47],[-16,45],[-11,1],[-16,-12],[-18,-38],[-22,-7],[-19,24],[-61,-10],[-94,-24],[-38,-24],[-22,-10],[-26,-8],[-43,-44],[-106,-169],[-22,-24],[-25,-3],[-15,-24],[-23,-18],[-46,-67],[-24,-54],[-15,-48],[-18,-2],[-13,13],[-44,-6],[-22,-17],[-24,-47],[-30,-85],[-13,-24],[-24,-26],[-28,-20],[-34,-32],[-16,-2],[-13,-5],[-12,14],[-4,31],[-18,19],[-42,10],[-63,22],[-65,4],[-33,-2]],[[36214,51711],[26,-3],[37,11],[24,27],[28,5],[27,-3],[92,-30],[55,-9],[20,-9],[20,-14],[14,-15],[4,-32],[-14,-51],[-10,-53],[-9,-75],[-7,-16],[-12,4],[7,-67],[-2,-27],[-6,-26],[-15,-54],[-22,-69],[-7,-14],[-17,-24],[-14,-31],[3,-29],[7,-29],[-8,-36],[-27,-53],[-16,-13],[-14,-6],[-14,6],[-23,53],[-3,-42],[-6,-42],[-8,-24],[-31,3],[-17,23],[-28,25],[-5,-69],[-18,-47],[-17,-15],[-27,-10],[-16,-20],[-30,16],[-27,31],[-16,3],[-12,-25],[-63,-5],[-29,-26],[-18,8],[-26,52],[-5,34],[-15,70],[-14,84],[-10,75],[8,66],[17,-3],[20,-9],[4,4],[1,21],[-4,18],[-32,-3],[-21,39],[-3,60],[4,124],[2,26],[15,36],[4,31],[-3,34],[6,61],[13,52],[52,67],[59,24],[172,-65]],[[37741,38512],[9,-16],[-16,2],[-18,-14],[-28,-12],[-11,23],[24,32],[9,24],[6,-5],[8,-17],[17,-17]],[[36504,36634],[-5,-7],[-18,72],[35,69],[12,-28],[-9,-55],[-10,-38],[-5,-13]],[[37427,38082],[0,-30],[-11,15],[-31,-12],[-11,23],[42,97],[8,-14],[6,-18],[5,-25],[-5,-16],[-3,-20]],[[37639,50149],[-28,-56],[9,65],[-4,45],[3,35],[19,34],[6,5],[-2,-41],[1,-13],[-4,-74]],[[39237,44298],[-10,-12],[-2,36],[29,47],[4,54],[15,-25],[4,-28],[0,-12],[-40,-60]],[[39193,44081],[-9,-33],[-11,5],[-5,22],[-8,22],[4,18],[8,10],[20,-2],[1,-42]],[[37532,51083],[-18,-27],[-5,-15],[-15,11],[3,16],[4,-2],[5,47],[25,-6],[1,-24]],[[36183,51997],[12,-30],[-40,-120],[-21,-18],[-24,-3],[-31,36],[-48,-3],[-15,9],[-1,52],[20,56],[40,-3],[69,45],[39,-21]],[[36028,52959],[-28,-26],[-16,10],[-15,69],[5,57],[20,19],[16,-4],[6,-8],[14,-93],[-2,-24]],[[35929,51767],[-76,-113],[-25,37],[-6,22],[5,21],[-1,9],[8,39],[43,32],[21,5],[27,-10],[5,-27],[-1,-15]],[[36265,51778],[-73,-18],[-34,29],[8,24],[25,38],[30,28],[28,12],[28,-15],[8,-33],[-2,-32],[-18,-33]],[[35992,51923],[-5,-85],[-50,36],[4,87],[24,24],[20,46],[7,56],[1,77],[8,14],[6,5],[6,-5],[3,-116],[2,-70],[-26,-69]],[[36068,52069],[-30,-19],[-5,18],[0,72],[8,40],[38,11],[4,12],[11,7],[7,-25],[-1,-41],[-32,-75]],[[35602,51017],[-30,-11],[38,144],[34,67],[1,133],[36,118],[34,49],[47,14],[26,-72],[-32,-205],[-9,-1],[-43,-108],[-48,-75],[-54,-53]],[[36531,35848],[-19,-26],[4,137],[10,45],[11,34],[14,21],[10,-29],[-8,-67],[-25,-81],[3,-34]],[[54907,76553],[-23,24]],[[32597,39035],[-4,9],[-22,34],[-20,63],[-5,29],[-3,1],[-118,-1],[-113,-3],[-11,-13],[-17,0],[-12,13],[-11,-1],[-17,-13],[-15,-25],[-44,-169],[-21,-72],[-16,-65],[-12,-110],[-4,-19],[-14,38],[-20,102],[-9,57],[-13,66],[-22,82],[-27,25],[-16,8],[-23,16],[-42,20],[-18,4],[-119,2],[-9,2],[-46,-9],[-24,6],[-25,46],[-55,81],[-11,26],[-21,17],[-13,2],[-7,-16],[-10,-68],[-11,-61],[-12,-35],[-39,-25],[-37,-27],[-20,-7],[-11,-30],[-5,-43],[-9,-38],[-53,-58],[-12,-24],[-6,-57],[-29,-71],[-10,-27]],[[50751,55512],[-116,-24],[-130,-39],[-55,-25]],[[25473,62483],[-15,-65],[15,-9],[14,7],[32,-3],[13,-71],[-4,-61],[-30,-158],[-4,-55],[-14,-81],[19,-54],[-18,-72],[-6,-46],[-1,-69],[9,-132],[-15,-190],[-25,-83],[-16,-32],[-28,-82],[-37,-25],[-51,-133],[-9,-35],[5,-38]],[[25569,62168],[-13,-11],[11,34],[1,21],[16,89],[10,-1],[3,-8],[-28,-124]],[[25596,61879],[-21,-81],[-2,23],[9,60],[12,21],[8,22],[2,26],[10,-13],[-3,-25],[-15,-33]],[[50701,81276],[121,97],[73,50],[35,15]],[[33474,59378],[-8,-11],[-25,23],[-9,28],[-1,88],[15,8],[29,-70],[17,-25],[-18,-41]],[[75645,63819],[-5,0],[-16,53],[-15,58],[-39,110],[-12,197],[-1,97],[-26,114],[-18,158],[-7,41],[9,51],[2,19],[-5,-4],[-14,-26],[-17,63],[-11,56],[-46,117],[-13,52],[-1,50],[-19,-50],[-27,-36],[-27,-54],[-18,-16],[-57,-10],[-33,72],[-47,175],[-7,40],[6,103],[-11,97],[0,52],[-3,34],[-8,-8],[-4,-23],[2,-36],[-3,-31],[-41,6],[-39,14],[34,-51],[36,-12],[19,-46],[3,-36],[-1,-40],[-19,-29],[-17,-17],[3,-39],[21,-47],[-26,-14],[-6,-31],[-1,-43],[13,-39],[5,-29],[-3,-26],[12,-29],[18,-60],[5,-42],[-7,-60],[-10,-23],[-16,-23],[-39,-75],[-19,-86],[-16,-40],[-20,-7],[-7,18],[-17,22],[0,42],[5,33],[33,81],[-18,-11],[-21,-23],[-31,-43],[-11,53],[-6,50],[0,61],[25,91],[-29,-45],[-8,-57],[4,-67],[-4,-47],[-11,-62],[-15,-37],[-25,-24],[-11,-37],[-17,-27],[0,54],[-5,71],[-18,168],[-4,-36],[9,-104],[0,-68],[-14,-54],[-27,-57],[-21,-8],[-12,8],[-19,36],[-20,51],[-4,82],[-8,45]],[[75319,64616],[-30,-40],[10,239],[22,-89],[6,-48],[-8,-62]],[[75432,64736],[-13,-17],[-12,14],[-16,56],[8,71],[5,11],[7,-23],[11,-50],[7,-38],[3,-24]],[[75215,64567],[-48,-20],[-25,6],[46,151],[-1,68],[-7,55],[-24,44],[-1,32],[-11,43],[-5,51],[26,16],[21,-29],[3,-16],[4,-42],[11,-43],[36,-88],[0,-55],[-10,-132],[-15,-41]],[[75520,64419],[-10,-47],[-5,34],[4,43],[4,24],[3,0],[6,-25],[-2,-29]],[[75541,64232],[-17,-3],[-8,17],[4,24],[-5,78],[14,8],[7,-1],[5,-22],[3,-42],[-3,-59]],[[75178,65070],[4,-25],[-15,15],[-12,17],[-7,23],[12,12],[18,-42]],[[64057,66752],[-9,-44],[-9,16],[-21,76],[6,53],[-10,76],[5,22],[26,11],[6,-4],[-8,-24],[15,-43],[2,-70],[-3,-69]],[[28428,65811],[1,-13],[-28,-36],[20,-26],[19,56],[15,-46],[8,-86],[-1,-15],[1,-12],[3,-17],[1,-24],[-16,-75],[-54,8],[-2,63],[-8,12],[-13,91],[-17,29],[-24,74],[14,19],[18,-6],[10,9],[25,7],[16,10],[12,-22]],[[28548,66764],[-6,-5],[-24,58],[-19,17],[30,41],[13,35],[0,76],[7,42],[-2,36],[7,37],[-9,42],[-26,33],[-50,131],[-79,32],[-41,1],[22,21],[21,-2],[32,-13],[39,-6],[23,-39],[22,-51],[21,-20],[8,-14],[-1,-14],[3,-14],[27,-24],[26,-39],[8,-113],[-36,-54],[-6,-164],[-10,-30]],[[29714,64050],[-8,-42],[-30,-81],[-65,-20],[-73,-4],[-5,22],[-2,20],[5,30],[0,12],[-3,12],[26,13],[18,37],[27,7],[34,-27],[19,-1],[27,29],[22,63],[13,-8],[-5,-62]],[[28404,66075],[0,-70],[3,-52],[-3,-19],[-30,-34],[-8,-20],[-28,-20],[-17,-27],[-9,45],[-17,27],[-2,47],[-13,-16],[-19,10],[-30,35],[-19,48],[27,8],[5,-30],[22,37],[-5,19],[-4,3],[-7,36],[32,94],[7,60],[-15,98],[14,6],[36,-34],[16,-34],[0,-46],[16,-35],[21,-86],[27,-50]],[[28196,67240],[34,-18],[18,2],[11,12],[49,-5],[41,17],[6,-30],[-1,-16],[-86,-15],[-78,-45],[-43,-31],[-21,-3],[-15,16],[-52,93],[14,-10],[38,-52],[24,10],[22,34],[4,26],[-4,13],[10,41],[29,-39]],[[28514,66252],[-31,-12],[-23,11],[-5,10],[9,16],[21,13],[34,1],[15,-15],[2,-7],[-22,-17]],[[29428,64932],[6,-10],[-17,-23],[-40,28],[-9,-2],[-8,31],[-3,22],[2,21],[24,-16],[12,-30],[33,-21]],[[29325,65707],[-22,-63],[-12,6],[7,78],[15,12],[6,0],[6,-33]],[[29387,64639],[-20,-18],[5,30],[37,51],[21,44],[11,16],[5,12],[16,17],[8,28],[-2,24],[-17,38],[0,27],[6,20],[29,9],[-8,-29],[12,-82],[-39,-103],[-33,-31],[-31,-53]],[[28708,66524],[46,-65],[39,-24],[42,-82],[18,-29],[4,-26],[-7,-120],[-10,-73],[2,-63],[-10,18],[-10,42],[-17,24],[-5,13],[29,2],[3,66],[14,51],[-2,54],[-34,59],[-24,53],[-36,16],[-34,52],[-20,7],[-24,-10],[9,31],[6,41],[4,8],[17,-45]],[[28982,65351],[-12,-4],[-21,16],[-48,70],[-23,6],[8,39],[17,-14],[39,-60],[15,-30],[25,-23]],[[29211,65031],[-2,-15],[-35,115],[-44,28],[-26,28],[6,15],[17,7],[3,37],[-7,39],[-24,80],[-13,54],[-6,12],[-1,45],[27,-70],[12,-62],[18,-61],[13,-105],[35,-36],[25,-51],[2,-60]],[[29081,65783],[2,-30],[-19,6],[-28,-11],[-9,0],[6,20],[19,27],[1,26],[-24,37],[-27,92],[-13,22],[-6,35],[-23,38],[5,20],[4,4],[16,-9],[35,-134],[2,-12],[59,-131]],[[29711,64763],[17,-9],[9,1],[32,-17],[19,-24],[4,-10],[-10,-21],[-29,40],[-26,5],[-36,-1],[-14,8],[10,43],[24,-15]],[[29745,64231],[-37,-28],[-3,33],[18,27],[22,-32]],[[62435,74713],[27,9],[46,27],[13,-13],[13,-27],[7,-23],[1,-42],[5,-7],[23,14],[9,-17],[18,-21],[29,-20],[43,32],[21,8],[18,-1],[9,-10],[4,-33],[-4,-41],[-5,-22],[9,-16],[35,-40],[15,-21],[-7,-38],[26,-93],[9,-36],[10,-44]],[[62913,74254],[-1,53],[1,41],[-4,24],[-20,33],[-1,14],[6,8],[16,-5],[20,2],[10,13],[-22,43],[-19,29],[-17,19],[-3,12],[0,8],[3,10],[28,24],[3,21],[-2,25],[-44,36],[-34,-14],[-30,41],[-19,31],[-24,33],[-21,19],[-20,42],[-36,43],[-23,12],[1,7],[4,8],[9,6],[64,-1],[7,7],[4,19],[9,27],[10,41],[-1,34],[-63,55],[-46,50],[-32,67],[-22,61],[1,20],[6,19],[49,56],[4,15],[-1,10],[-18,29],[-22,29],[-7,22],[-14,11],[-27,1],[-46,36],[-10,4],[-2,7],[2,7],[33,15],[0,12],[-10,16],[-19,12],[-17,29],[-6,26]],[[63492,75947],[25,-34],[45,-90],[63,-147],[15,-42],[10,-48],[9,-59],[14,-52],[64,-130],[28,-48],[45,-63],[16,-14],[21,-3],[39,-1],[35,-24],[18,-17],[18,-25],[16,-28],[17,-77],[-62,25],[-62,-4],[-36,-16],[-34,-22],[-32,-32],[-21,-62],[-17,-142],[-25,-134],[0,-61],[12,-59],[-2,-29],[-11,-12],[-15,-25],[-19,-122],[-10,-25],[-12,-15],[-3,15],[0,32],[-27,28],[-14,-32],[-10,-67],[-20,-71],[-1,-13],[5,-219]],[[62653,75239],[3,19],[-8,9],[-8,0],[-8,-9],[0,-24],[10,-5],[11,10]],[[62506,75476],[-6,-7],[-9,7],[-3,14],[1,16],[9,3],[7,-4],[2,-14],[-1,-15]],[[89771,44956],[-7,-69],[-14,-55],[-1,-32],[3,-45],[22,-33],[18,-21],[10,-58],[31,-81],[-1,-56],[16,-69],[16,-137],[4,-121],[16,-80],[-10,-172],[11,-70],[15,-58],[18,-116],[13,-106],[19,-30],[38,-36],[41,40],[28,53],[31,13],[43,28],[31,-71],[17,-80],[74,-104],[42,-68],[32,-37],[30,-50],[-3,-50],[-7,-39],[7,-61],[4,-71],[-6,-86],[22,-130],[7,-103],[23,-101],[-2,-104],[-4,-40],[-3,-58],[18,-72],[17,-54],[24,-58],[33,-89],[23,-17],[20,-2],[-3,-90],[41,-179],[22,-147],[-15,-197],[-14,-114],[3,-56],[53,-137],[30,-25],[-6,-65],[-4,-101],[24,-78],[27,-58],[30,-35],[29,-28],[38,-28],[48,-12],[25,-44],[13,-35],[39,-12],[17,7],[22,14],[14,-24],[11,-31],[21,-86],[44,-85],[30,-14],[18,-43],[24,-11],[22,-6],[30,-33],[49,-75],[45,-13],[20,-21],[44,-83],[17,-44],[18,-66],[-22,-6],[-21,13],[-13,-64],[29,-90],[35,-63],[41,-67],[40,-94],[10,-72],[11,-29],[13,-101],[35,-59],[2,-108],[18,-149],[19,-135],[14,-40],[17,-65],[18,8],[14,21],[28,-64],[15,-28],[8,16],[-17,123],[11,72],[10,9],[16,2],[18,-58],[26,-62],[47,-55],[38,-52],[11,2],[-4,40],[1,59],[15,9],[14,-29],[25,-91],[5,-188],[0,-158],[17,-162],[24,-43],[16,-40],[28,-54],[18,-51],[23,-23],[74,-108],[20,-13],[32,-2],[40,-49],[19,-45],[43,-169],[20,-59],[43,-59],[19,-19],[29,-40],[10,-59],[3,-34],[17,-63],[25,-75],[38,-41],[34,-91],[2,-148],[18,-73],[12,-32],[27,-30],[11,-24],[-23,-195],[22,-391],[-12,-122],[22,-121],[52,-210],[12,-74],[7,-87],[34,-111],[-2,-169],[13,-80],[-3,-105],[-40,-112],[-31,-139],[-1,-118],[-20,-228],[-14,-62],[-10,-95],[-43,-230],[-2,-90],[6,-108],[-7,-103],[-11,-71],[-10,-130],[-44,-202],[-63,-150],[-4,-114],[-8,-50],[-13,-62],[-39,-69],[-23,-29],[-9,-40],[-22,0],[0,-13],[15,-12],[-7,-21],[-58,-36],[-40,-47],[-40,-113],[-17,-60],[-21,-57],[-13,-27],[-6,-28],[-8,-72],[-21,-13],[-18,-21],[8,-68],[-9,-78],[-3,-53],[-10,-34],[-11,12],[-10,-5],[-12,-19],[19,-5],[11,-9],[-39,-76],[-36,-78],[-10,-51],[-15,-65],[-14,-144],[-11,-83],[8,-58],[-2,-11],[-8,-4],[-5,7],[-17,-20],[-4,-20],[7,-25],[4,-8],[-2,-12],[-6,-13],[-16,0],[-19,-21],[-53,-213],[-23,-57],[-27,-87],[-10,-79],[-8,-86],[-10,-145],[-9,-103],[-21,-99],[-7,-71],[-3,-135],[10,-103],[-7,-54],[0,-52],[-8,-49],[-34,-11],[-28,-40],[-40,-65],[-23,-24],[-51,-18],[-99,8],[-189,-24],[-37,-15],[-70,-45],[-68,-70],[-66,-94],[-149,-256],[-117,-28],[-22,0],[-18,7],[-21,-16],[0,-32],[19,-33],[14,-31],[25,43],[11,-12],[4,-79],[1,-50],[-8,-27],[-15,-20],[-17,13],[-2,27],[-22,65],[-26,57],[-25,18],[-14,-19],[-23,-20],[-20,72],[-20,63],[-28,7],[-24,-1],[-19,27],[-39,43],[8,33],[10,35],[22,13],[-6,48],[-12,39],[-30,10],[-21,-7],[-12,-30],[-16,-54],[-64,-67],[-32,37],[-36,55],[18,-4],[36,2],[30,49],[13,31],[15,66],[-19,46],[-18,34],[-26,30],[-98,-102],[-21,-15],[-19,-20],[34,-17],[20,5],[21,-30],[-34,-42],[-26,-12],[-34,-25],[-63,-66],[-80,-136],[-35,-39],[-41,-32],[-56,37],[-31,8],[-40,56],[-67,38],[-63,74],[-44,38],[-31,8],[-43,-16],[-73,67],[-56,7],[-36,-67],[-29,5],[-18,9],[-59,110],[-56,55],[-107,28],[-66,76],[-49,146],[-94,168],[-25,61],[-12,60],[-1,47],[13,90],[17,89],[3,50],[-35,167],[-50,159],[-23,49],[-62,106],[-57,79],[-15,42],[-4,21],[27,-10],[12,32],[19,11],[14,-43],[17,-8],[0,72],[10,35],[-7,15],[-5,14],[-25,16],[-28,-24],[-21,-31],[-28,-26],[-11,-28],[-29,-1],[-12,-7],[-58,-53],[-36,-1],[-57,18],[18,73],[23,43],[19,50],[30,173],[-5,151],[-15,61],[-48,125],[-22,76],[-27,80],[-13,-46],[-8,-49],[-26,-70],[-13,-157],[-50,-239],[-35,-3],[-30,10],[-52,-28],[-35,-33],[-32,0],[-18,-10],[-23,8],[37,187],[31,-5],[35,7],[15,-3],[23,2],[18,86],[11,96],[-7,62],[-3,64],[7,73],[3,53],[43,174],[37,89],[42,72],[-5,68],[-14,85],[-4,65],[20,20],[19,41],[-22,187],[-14,55],[-22,55],[0,-71],[2,-70],[-30,-89],[-40,-64],[-26,-60],[-25,-136],[-32,-115],[-30,-43],[-27,-9],[-27,-18],[-42,-45],[-42,-39],[-30,-50],[-26,-27],[-86,-230],[-40,-76],[-8,-31],[-16,-26],[3,-37],[13,-24],[13,-102],[-8,-22],[-14,11],[-35,57],[-22,-21],[-18,-23],[-46,105],[-20,24],[-24,42],[-26,36],[-11,5],[-19,-8],[2,28],[13,23],[11,6],[21,-34],[24,-30],[14,-2],[6,12],[-23,118],[-15,104],[-7,30],[-19,106],[-9,30],[-40,74],[-43,88],[-11,104],[-16,67],[-20,42],[-31,38],[-85,14],[-35,107],[-21,133],[16,9],[19,2],[7,41],[-5,64],[-84,78],[-40,83],[-34,35],[-31,14],[-42,-3],[-53,3],[-126,131],[-30,4],[-90,-41],[-31,7],[-137,179],[-91,86],[-30,15],[-39,15],[-32,-21],[-22,-19],[-46,-22],[-182,14],[-156,-28],[-105,-19],[-67,-24],[-112,-107],[-133,-103],[-108,-49],[-99,-65],[-66,-19],[-84,-8],[-179,32],[-61,-24],[-97,-120],[-29,-29],[-55,-33],[-141,-155],[-65,-33],[-42,-11],[-36,-32],[-32,-66],[-45,-183],[-27,-86],[-61,-138],[-39,-46],[-40,6],[-44,-48],[-38,51],[-31,9],[-50,-4],[-174,-58],[-25,68],[-32,10],[-60,-3],[-90,20],[-164,-25],[-79,-28],[-31,-25],[-58,16],[-99,-23],[-35,-38],[-26,-35],[-51,-154],[-56,-51],[-47,-1],[-51,-12],[-105,-148],[-106,-144],[-36,-15],[-40,-24],[-52,-12],[-26,-13],[-122,37],[-77,4],[-97,22],[-83,71],[-64,40],[-73,155],[-44,58],[-80,70],[-23,-2],[-19,-19],[-33,49],[-1,64],[-9,54],[1,142],[5,167],[29,-38],[23,-36],[49,2],[44,62],[25,92],[21,103],[-3,110],[-15,193],[10,41],[15,16],[5,96],[4,296],[-11,111],[-68,226],[-45,197],[-32,88],[-28,143],[-23,198],[-7,100],[-7,185],[8,105],[-4,61],[-28,167],[-64,156],[-10,58],[0,61],[-15,71],[-51,143],[-52,123],[-9,60],[-10,249],[-19,114],[-89,287],[-104,248],[-29,102],[-13,34],[8,4],[11,-13],[13,-25],[7,-2],[6,21],[-1,47],[4,26],[9,-14],[11,-53],[33,-138],[10,-70],[42,-21],[13,18],[15,36],[5,97],[-21,44],[-20,19],[-32,72],[-21,115],[-33,107],[0,38],[15,28],[25,-15],[23,-62],[25,-57],[-4,-100],[-4,-27],[2,-23],[9,-22],[12,-17],[13,25],[11,58],[7,-7],[18,-133],[14,-36],[27,-42],[24,32],[11,28],[-4,94],[7,91],[-4,67],[-61,177],[-56,218],[-34,109],[-28,164],[-18,56],[-24,92],[-1,104],[2,71],[19,151],[18,79],[56,181],[3,78],[0,59],[8,90],[0,63],[-8,59],[-23,100],[31,177],[45,226],[18,33],[28,31],[5,-47],[-13,-157],[19,-81],[-6,-92],[18,15],[27,18],[21,48],[11,46],[51,184],[30,69],[41,50],[85,61],[81,80],[39,77],[49,66],[34,73],[32,49],[166,183],[28,34],[36,4],[44,-6],[40,10],[43,-42],[31,-5],[77,46],[41,40],[71,89],[31,25],[72,28],[82,37],[98,154],[70,-10],[63,-15],[51,46],[119,28],[66,39],[124,102],[33,35],[50,73],[44,91],[43,123],[27,110],[11,57],[26,90],[17,71],[14,34],[48,48],[71,135],[23,28],[4,43],[-15,24],[-19,15],[-13,143],[-12,99],[-1,69],[5,66],[28,103],[19,44],[28,51],[25,16],[21,45],[34,44],[15,45],[21,91],[19,69],[15,-3],[28,-160],[19,-85],[35,-100],[32,-148],[27,-67],[13,-44],[10,-20],[3,28],[-3,33],[13,112],[-6,79],[2,31],[6,12],[13,-8],[25,-44],[13,-16],[9,3],[-1,72],[13,45],[-5,31],[-22,-2],[-9,39],[-18,44],[-21,32],[-24,74],[-8,28],[10,14],[15,-2],[13,31],[5,42],[-11,69],[12,25],[22,-7],[36,-109],[16,11],[13,44],[23,12],[24,-8],[15,-31],[32,-32],[42,4],[22,-8],[45,6],[22,-10],[-4,17],[-25,20],[-27,4],[-32,-2],[-14,21],[-5,55],[8,40],[5,17],[21,-7],[19,2],[2,53],[7,48],[11,39],[0,37],[-12,-10],[-28,-86],[-14,70],[-20,53],[4,77],[12,76],[18,10],[16,-12],[23,45],[13,34],[-3,28],[3,21],[16,-6],[62,-69],[12,-36],[13,14],[4,39],[-1,39],[-14,-5],[-32,3],[-7,22],[3,19],[-15,46],[21,29],[17,2],[13,20],[0,27],[4,12],[10,-17],[32,-7],[31,-35],[15,-8],[6,19],[2,41],[-39,41],[-1,40],[-17,47],[0,45],[24,39],[5,37],[15,15],[27,0],[19,32],[21,11],[6,70],[-1,48],[9,12],[21,-20],[-6,-55],[0,-53],[-6,-29],[8,2],[5,12],[9,35],[22,-14],[6,-37],[3,-37],[11,-12],[15,56],[21,15],[-1,71],[8,51],[2,38],[13,19],[3,40],[-10,28],[-6,51],[18,11],[18,-25],[13,-64],[8,-29],[11,16],[7,42],[22,25],[22,-34],[24,-48],[31,42],[28,77],[-5,47],[4,49],[35,26],[29,-19],[25,-52],[54,-39],[46,-56],[20,-36],[40,-58],[25,-60],[34,-107],[82,-131],[5,-23],[-11,-43],[-10,-56],[-12,-95],[-3,-139],[12,10],[12,50],[13,-10],[14,-32],[2,31],[-9,18],[-15,64],[0,34],[12,28],[19,32],[20,22],[13,18],[2,24],[18,23],[28,8],[16,-4],[118,-59],[29,-60],[3,-73],[11,-26],[7,46],[-2,100],[10,20],[31,-15],[22,-20],[30,-66],[6,-32],[13,-21],[4,30],[-6,43],[-4,50],[6,43],[36,3],[23,10],[-11,16],[-15,6],[-25,40],[-17,42],[27,42],[-1,10],[-25,-1],[-34,40],[-29,56],[22,103],[45,101],[25,34],[2,34],[12,62],[8,53],[2,42],[11,43],[28,41],[37,15],[18,16],[18,38],[16,46],[-34,90],[3,50],[6,59],[42,43],[22,112],[15,17],[33,-3],[13,10],[-2,89],[3,35],[14,14],[18,-12],[11,-39],[25,-36],[9,20],[-4,39],[-3,51],[23,11],[19,3],[1,41],[-3,33],[8,14],[48,7],[13,34],[7,29],[6,-16],[8,-66],[27,-38],[80,-1],[45,27],[19,-16],[30,-13],[32,31],[20,24],[33,-31],[11,-32],[8,69],[20,24],[20,14],[26,-12],[10,4],[-23,51],[1,46],[-1,69],[4,62],[8,45],[-55,91],[-55,14],[-40,-19],[-17,15],[-36,72],[-34,27],[-2,18],[41,52],[16,-9],[24,-49],[14,-17],[12,4],[7,38],[11,20],[20,-12],[62,-82],[34,-80],[18,21],[31,45],[29,-9],[17,-27],[25,-97],[20,-48],[48,-13],[24,-19],[25,-32],[33,3],[70,-12],[65,-62],[27,-39],[32,-11],[18,-15],[34,-5],[53,44],[24,-40],[11,-28],[48,-52],[53,-16],[37,53],[55,39],[38,60],[28,29],[27,49],[10,-2],[-22,-46],[-2,-26],[17,-11],[-2,-14],[-23,-35],[-29,-56],[1,-34],[11,-18],[13,8],[18,28],[23,16],[19,-23],[7,-80],[14,-53],[30,-7],[19,0],[19,74],[-10,63],[-12,14],[6,23],[48,104],[27,-3],[19,-102],[31,-53],[32,4],[17,-14],[14,-61],[-114,-251],[-5,-28],[15,-45],[6,-53],[-37,-128],[-14,-6],[-13,35],[-19,22],[-18,-16],[-18,-9],[-66,-71],[0,-183],[17,-109],[-10,-71],[-19,-126],[-22,-47],[-17,-30],[-57,-172],[-18,-41],[-19,-59],[6,-56],[7,-39],[22,-44],[83,-92],[38,-64],[66,-76],[15,-53],[9,-43],[47,-49],[34,-30],[10,8],[7,10],[8,0],[9,-6],[-2,-38],[-3,-21],[3,-27],[24,-34],[38,1],[22,8],[25,-36],[22,-24],[36,-48],[63,-58],[49,-38],[58,-140],[44,-81],[49,-59],[72,-41],[33,7],[54,-48],[53,-22],[28,-66],[9,-50],[3,-39],[26,-92],[54,-30],[69,-92],[57,-41],[14,-24],[25,-29],[48,-1],[84,46],[38,47],[51,74],[23,128],[14,103],[71,212],[20,105],[18,140],[15,87],[-5,95],[16,172],[36,237],[13,79],[-7,118],[-22,220],[10,77],[10,106],[-16,77],[-16,53],[-2,75],[17,140],[15,74],[16,96],[-9,182],[34,63],[13,32],[26,0],[12,-14],[3,36],[-10,34],[-4,39],[-8,20],[-16,7],[-13,21],[-19,22],[3,81],[33,156],[18,60],[11,-25],[14,-20],[2,45],[-5,46],[25,152],[27,207],[8,188],[44,36],[23,47],[13,55],[25,0],[17,-24],[-11,-41],[-4,-31],[47,-79],[16,-60],[7,-57],[9,-54],[4,-72],[0,-115],[6,-109],[17,-34],[15,-22],[22,-3],[31,-18]],[[92521,37009],[-7,-16],[-13,29],[-8,102],[6,59],[14,55],[3,30],[-6,62],[42,71],[10,37],[4,48],[-15,52],[-12,10],[10,29],[12,15],[9,6],[7,-5],[5,-102],[17,-36],[-3,-50],[-58,-259],[-16,-97],[-1,-40]],[[88751,42296],[-21,-51],[-11,7],[-10,-27],[-20,-13],[-12,0],[-22,-13],[-4,16],[4,51],[19,56],[18,35],[46,16],[36,25],[4,-4],[26,-65],[-38,-8],[-15,-25]],[[87975,43891],[12,-24],[13,2],[12,53],[7,-8],[5,-13],[4,-23],[-17,-40],[-8,-6],[-7,-23],[-12,-73],[1,-24],[11,-25],[27,-22],[13,10],[5,-3],[-5,-36],[-11,-27],[-36,12],[-32,-4],[-52,26],[-27,3],[-8,10],[16,21],[10,28],[-5,67],[4,84],[30,41],[14,42],[20,26],[13,-3],[-2,-26],[5,-45]],[[86238,45115],[23,-14],[10,-19],[7,-21],[1,-25],[-29,-11],[-52,37],[-51,-31],[-15,0],[-10,22],[8,61],[19,-9],[16,22],[-3,67],[-9,37],[27,68],[12,13],[12,0],[11,-48],[2,-51],[13,-48],[8,-50]],[[86282,45290],[37,-5],[45,43],[21,-18],[9,4],[33,41],[21,12],[15,30],[14,-33],[32,-38],[11,-40],[13,-19],[5,-12],[-20,-42],[-3,-45],[-21,3],[-25,-74],[-95,-124],[-85,106],[-37,71],[-24,99],[-5,82],[-10,51],[4,14],[5,6],[7,-1],[25,-56],[12,-15],[16,-40]],[[81439,36835],[-7,-24],[-54,180],[-15,123],[10,22],[10,6],[32,-170],[10,-39],[0,-40],[4,-12],[10,-46]],[[88220,31256],[67,-14],[26,21],[32,-17],[22,-56],[-16,-27],[-15,-4],[-49,23],[-46,-18],[-13,-23],[-9,-51],[-40,-28],[-18,31],[-48,22],[-17,-32],[-34,9],[-32,-14],[-43,8],[-46,57],[-14,26],[11,47],[16,34],[126,49],[67,41],[55,-7],[15,-9],[14,-21],[-10,-38],[-1,-9]],[[90412,29749],[-42,-38],[-15,17],[1,29],[3,13],[36,2],[17,-23]],[[90364,29671],[10,-28],[2,-11],[-24,22],[-39,-5],[24,40],[20,-8],[7,-10]],[[91400,40154],[-6,-6],[-10,0],[-13,11],[12,74],[6,-39],[12,-32],[-1,-8]],[[91370,40236],[-6,-3],[-7,6],[5,24],[7,19],[10,14],[-3,-52],[-6,-8]],[[91984,38311],[10,-15],[8,2],[8,-9],[-3,-38],[13,-42],[6,-30],[-10,-24],[-6,-8],[-15,20],[-42,121],[7,41],[24,-18]],[[91809,38984],[-8,-1],[-7,10],[6,23],[1,32],[10,-10],[7,-45],[-9,-9]],[[91646,39059],[-10,-18],[-6,42],[1,44],[10,15],[5,-58],[0,-25]],[[92649,36038],[-24,-158],[-7,3],[-9,24],[1,91],[10,58],[24,-10],[5,-8]],[[92622,36108],[-6,-9],[-12,55],[-4,56],[5,51],[14,11],[10,-4],[-11,-94],[4,-66]],[[89520,45676],[-23,-33],[-15,18],[-4,36],[2,16],[19,28],[21,-65]],[[89538,45972],[-17,-36],[-17,11],[-6,20],[6,29],[23,5],[11,-29]],[[89490,45994],[-7,-16],[-12,34],[14,40],[12,-19],[-7,-39]],[[90632,41341],[6,-55],[12,-42],[-5,-28],[-7,-21],[-18,19],[-12,51],[-21,41],[-5,23],[25,-2],[12,8],[5,9],[8,-3]],[[87943,45288],[-20,-35],[-1,26],[10,21],[25,84],[11,20],[6,11],[5,31],[1,46],[14,7],[-11,-105],[-40,-106]],[[87871,45159],[-44,-43],[24,58],[51,52],[8,12],[-2,-25],[-26,-43],[-11,-11]],[[88081,42754],[-12,-27],[-15,28],[-3,29],[-12,8],[6,27],[6,7],[6,33],[16,-39],[1,-43],[7,-23]],[[88017,42845],[-5,-4],[0,48],[8,24],[4,-50],[-7,-18]],[[87941,42840],[-17,-2],[-4,3],[-3,25],[5,23],[18,6],[7,-6],[-6,-49]],[[88738,41984],[-11,-10],[-3,24],[14,24],[9,34],[19,-30],[3,-30],[-31,-12]],[[87843,43879],[-7,-6],[-25,11],[0,21],[3,15],[7,10],[16,41],[11,-24],[5,-49],[-10,-19]],[[86831,45332],[-6,-9],[-22,89],[6,27],[-9,46],[15,5],[12,34],[4,-16],[1,-63],[9,-36],[-10,-77]],[[84777,43444],[-18,-36],[-12,29],[7,58],[12,20],[10,-10],[-1,-45],[2,-16]],[[84610,42971],[-11,-17],[-10,5],[0,23],[-11,24],[6,28],[4,14],[9,-2],[3,-23],[12,-26],[-2,-26]],[[82068,39868],[-17,-45],[-19,9],[-3,23],[13,37],[22,45],[7,-28],[-3,-41]],[[90289,28348],[32,-2],[18,14],[16,-2],[19,-33],[22,-18],[16,3],[13,-6],[12,-24],[30,-20],[14,-13],[11,-20],[13,-16],[81,-54],[57,-26],[71,12],[21,15],[21,22],[17,-20],[17,-32],[-3,34],[6,30],[17,23],[20,15],[32,-2],[31,7],[14,13],[14,2],[19,-17],[19,-9],[13,22],[21,51],[12,18],[55,-16],[15,0],[27,53],[17,-1],[51,-42],[22,-53],[-3,-97],[2,-34],[4,-34],[2,-67],[-6,-67],[-1,-52],[3,-52],[-3,-98],[8,-64],[-4,-44],[0,-21],[7,-19],[4,-22],[-3,-28],[3,-32],[-3,-27],[-11,4],[-4,21],[2,26],[-2,22],[-6,19],[-20,22],[6,13],[10,12],[-7,29],[-13,-24],[-8,-33],[5,-11],[-8,-9],[-17,-38],[-12,-51],[-5,-50],[1,-52],[-10,-40],[-14,-39],[-3,-49],[1,-91],[11,-83],[7,-113],[-10,-15],[-30,-7],[-14,-15],[-24,57],[-15,58],[11,24],[24,-14],[8,13],[2,16],[-2,15],[-30,32],[-33,15],[-11,-19],[4,-55],[-3,-13],[-24,-21],[-12,80],[-31,60],[1,-29],[13,-50],[-1,-21],[-5,-29],[-13,-10],[-5,-23],[0,-32],[-5,-51],[-20,-23],[-48,57],[-4,-19],[1,-17],[25,-33],[-12,-25],[-8,-29],[-14,-76],[-23,-64],[-11,-4],[-37,10],[-42,54],[-38,-6],[-62,4],[-40,-20],[-9,59],[-8,21],[3,18],[32,13],[33,-1],[-6,23],[-8,8],[-15,-5],[-41,19],[-29,-8],[-19,28],[-34,96],[-20,45],[-12,18],[-13,9],[-9,14],[-61,221],[-8,51],[-11,129],[48,-62],[18,-39],[9,-50],[16,61],[-3,19],[-43,73],[-6,21],[-2,25],[-10,-25],[-17,-3],[7,51],[-6,51],[-51,111],[-39,105],[-38,130],[-3,16],[-1,28],[-18,87],[-10,65],[-4,56],[17,114],[3,64],[27,-29],[63,-37]],[[89979,28734],[-8,-2],[-6,32],[3,47],[-14,45],[8,46],[-1,50],[5,22],[16,24],[3,43],[14,2],[25,-33],[9,-85],[-4,-51],[9,-46],[-8,-40],[-21,-32],[-30,-22]],[[91110,28941],[50,-104],[25,-17],[8,-11],[-2,-45],[-11,-20],[20,-26],[-3,-17],[-4,1],[-24,-35],[-29,-17],[-9,12],[-8,17],[-6,23],[-37,91],[4,25],[-8,38],[-18,-3],[-12,23],[20,22],[26,61],[18,-18]],[[90931,26844],[-13,-59],[-21,10],[-22,-10],[-13,40],[0,10],[16,-10],[6,13],[4,17],[5,4],[4,24],[14,29],[8,0],[9,-38],[3,-30]],[[91139,27240],[-15,-5],[-6,2],[1,30],[-2,13],[13,27],[20,-13],[7,-20],[-19,-17],[1,-17]],[[90953,26934],[-17,0],[-7,5],[-3,29],[-11,12],[6,9],[2,18],[7,20],[13,-22],[10,-71]],[[90217,28509],[-10,-47],[-11,60],[12,8],[9,21],[2,-3],[-2,-39]],[[91201,28624],[26,-34],[15,-38],[-20,-31],[-14,-6],[-9,36],[-29,-13],[-31,3],[-23,27],[-3,14],[14,14],[38,-1],[36,29]],[[91176,28504],[-14,-44],[-17,28],[-2,13],[21,10],[7,-1],[5,-6]],[[94132,20328],[-9,-23],[-3,26],[17,114],[17,20],[-3,-60],[-19,-77]],[[79367,45798],[-8,-41],[-14,23],[-17,7],[3,30],[14,5],[7,1],[10,11],[5,-36]],[[76899,44825],[4,-2],[4,3],[2,-4],[-7,-5],[-4,10],[-2,16],[-1,15],[2,0],[0,-6],[1,-5],[1,-9],[-1,-6],[1,-7]],[[76921,44818],[-3,-3],[-3,3],[-1,1],[0,3],[3,1],[3,2],[1,5],[1,7],[1,-7],[0,-6],[-2,-6]],[[70474,21234],[-34,-28],[-34,1],[-14,21],[-22,68],[-14,4],[-8,19],[-1,8],[15,5],[23,-19],[55,-16],[40,-37],[30,-12],[-12,-10],[-24,-4]],[[96649,35127],[6,-6],[5,-3],[3,-5],[0,-9],[-3,-10],[-3,-4],[-1,-2],[-1,-1],[0,-3],[0,-2],[-2,8],[-3,6],[-3,0],[-2,-6],[-1,0],[-1,6],[-1,6],[-1,5],[1,5],[3,5],[0,4],[-2,2],[-3,-2],[4,9],[5,-3]],[[84331,44685],[0,-6],[-6,1],[0,6],[6,-1]],[[33833,33138],[-6,-53],[14,-228],[-8,-32],[-14,-37],[-16,-2],[-19,6],[-13,-23],[-9,-100],[-25,-218],[4,-51],[21,-84],[7,-53],[6,-41],[5,-76],[-12,-34],[-11,-6],[-14,-19],[16,-93],[13,-43],[38,-87],[144,-122],[60,-72],[68,-97],[37,-100],[3,-83],[-54,-124],[-6,-103],[11,-73],[20,-68],[52,-88],[39,-32],[52,4],[9,-25],[5,-21],[8,-178],[-1,-67],[-15,-61],[-100,-282],[-86,-172],[-31,-94],[-11,-102],[-27,-48],[-148,-154],[-230,-137],[-186,-71],[-42,-24],[-299,-78],[-58,-11],[-75,7],[-61,-10],[-68,21],[-61,25],[-34,61],[-41,7],[-11,-30],[20,-78],[-9,-93],[11,-54],[24,-11],[23,-27],[21,-37],[-35,-4],[13,-29],[15,-18],[-2,-61],[-13,-148],[-34,-32],[-9,-8],[-11,-32],[-21,-142],[-7,-92],[9,-59],[41,-124],[-15,-81],[-26,-44],[-112,-90],[-45,-36],[-70,-25],[-114,-4],[-42,6],[-97,82],[-73,49],[-66,39],[-64,23],[9,12],[4,21],[-18,12],[-13,3],[-42,-43],[-18,-43],[-5,-38],[-1,-92],[8,-76],[30,-189],[3,-103],[-14,-130],[20,-76],[24,-34],[56,-34],[21,-23],[24,3],[7,-9],[-4,-16],[-14,-33],[1,-35],[42,-10],[43,7],[46,16],[11,24],[0,50],[-53,9],[6,18],[41,21],[53,33],[27,7],[18,-23],[12,-21],[16,-54],[9,-71],[1,-86],[-7,-81],[-7,-28],[-14,-35],[-95,-43],[-26,11],[-25,61],[-8,63],[-21,42],[-46,34],[-45,-10],[-45,-59],[-44,-19],[-15,-53],[110,-86],[52,-24],[17,0],[17,-11],[-15,-32],[-16,-20],[-79,-44],[-34,-31],[-41,-60],[-57,-132],[-17,-28],[-9,-34],[-6,-91],[19,-150],[-20,-63],[12,-70],[-6,-47],[-20,-67],[-80,-106],[-14,-78],[28,-45],[-2,-40],[-9,-36],[-33,0],[-120,24],[-44,-39],[-41,-49],[-11,-23],[-14,-14],[-83,-26],[-16,-17],[-88,-184],[-38,-115],[-45,-112],[-12,-47],[-3,-66],[7,-59],[6,-44],[16,-56],[33,-64],[170,-260],[35,-23],[181,-28],[40,-36],[23,-58],[9,-51],[-10,-128],[-11,-41],[-20,-36],[-43,-47],[-51,-25],[14,-18],[21,2],[46,16],[19,-16],[15,-50],[-28,-21],[-9,-24],[-20,-38],[-105,-148],[-56,-45],[-52,-59],[-70,-61],[-27,-34],[-37,-73],[-56,-79],[-61,-170],[-2,-33],[9,-22],[-34,-298],[-12,-35],[-24,-37],[-65,-62],[-31,-7],[-41,35],[-23,38],[-22,63],[-28,66],[-1,-23],[9,-40],[-6,-42],[-70,-19],[-18,-20],[63,9],[43,-13],[18,-15],[16,-32],[15,-38],[-12,-21],[-35,-18],[-44,-32],[-53,-58],[-29,-68],[-13,-48],[-14,-98],[-4,-64],[-22,-50],[-35,-44],[2,-11],[24,23],[18,7],[16,-59],[22,-119],[10,-82],[-2,-25],[-6,-33],[-45,-8],[-39,1],[-29,-15],[15,-15],[27,6],[37,-36],[41,15],[19,-23],[13,-22],[63,-172],[55,-106],[27,-63],[-13,-29]],[[30936,21513],[16,-25],[65,-118],[17,-48],[10,-56],[-26,35],[-27,-20],[-13,-34],[-12,-36],[0,-26],[9,-23],[27,-19],[64,-7],[5,-7],[37,-141],[19,-32],[22,-25],[51,-72],[49,-77],[58,-74],[62,-57],[57,-42],[54,-53],[58,-73],[63,-54],[67,-37],[69,-32],[105,13],[32,-4],[20,-23],[-20,-64],[-26,-51],[-35,-21],[-36,-8],[-34,1],[-33,10],[-31,-6],[-29,-21],[-31,-11],[-32,-2],[-31,-18],[-32,-13],[-32,11],[-84,51],[-55,12],[-185,20],[-59,12],[-59,18],[-31,0],[-45,-11],[-35,1],[-10,-11]],[[32069,20324],[31,-13],[61,10],[32,0],[14,-5],[6,-7],[42,11],[18,-1],[-5,-25],[-38,-24],[-16,10],[-82,-2],[-36,-25],[-15,0],[-36,-36],[-26,23],[-7,21],[18,29],[18,1],[12,12],[9,21]],[[32812,29278],[3,-36],[-15,4],[-34,35],[-12,33],[-2,14],[35,-15],[16,-14],[9,-21]],[[32856,61657],[-9,-23],[-31,9],[-6,29],[-1,20],[19,41],[22,-18],[9,-19],[6,-4],[0,-17],[-3,-12],[-6,-6]],[[32848,61966],[-4,-15],[-23,28],[-7,51],[1,11],[3,6],[9,-10],[12,-4],[8,-17],[1,-50]],[[53392,48525],[-4,16],[-12,57],[7,54],[7,41],[-8,82],[-18,74],[-20,93],[-6,18]],[[53261,41906],[11,218],[11,96],[0,116],[-7,298],[-7,41],[-5,48],[27,37],[14,27],[19,50],[13,69],[16,153],[58,352],[27,345],[35,163],[13,183],[96,236],[24,145],[50,72],[70,75],[51,135],[24,94],[28,179],[-1,187],[18,250],[-4,72],[-26,99],[-5,71],[-24,70],[-27,53],[-12,94],[-45,149],[-13,99],[-21,71],[-4,88],[-11,93],[-22,92],[-22,105],[0,32],[14,40],[12,13],[-4,-20],[-8,-23],[2,-19],[84,184],[6,36],[-3,41],[-1,49],[4,57],[-80,340],[-64,316],[-10,159],[-84,210],[-33,137],[-19,96],[-15,36],[6,18],[21,5],[49,22],[65,24],[61,56],[17,24]],[[49383,72064],[56,-11],[29,5],[67,51],[52,69],[41,36],[37,75],[32,48],[48,52],[136,111],[21,1],[45,-25],[39,8],[27,39],[29,93],[44,57],[57,58],[76,54],[50,51],[80,43],[199,28],[102,24],[70,-5],[70,80],[35,26],[152,6],[72,58],[272,0],[33,-19],[33,-32],[56,-75],[27,-17],[36,16],[84,72],[94,37],[51,42],[22,62],[44,23],[25,-47],[98,-48],[60,13],[26,15],[-9,71],[63,-19],[49,-34],[51,-69],[33,-14],[60,31],[125,16]],[[55555,74717],[-1,52],[-9,41],[-31,99],[-102,96],[-24,43],[-11,36],[-10,35],[10,1],[10,-9],[13,-11],[5,18],[-6,37],[-26,87],[-2,24],[13,74],[21,82],[-1,99],[7,75],[-8,49],[-3,60],[15,79],[14,20],[8,25],[1,85],[-31,39],[-35,8]],[[37300,16980],[61,-14],[31,-21],[8,-24],[36,-9],[5,-5],[7,-14],[4,-15],[-1,-20],[-62,48],[-86,3],[-20,34],[-44,-20],[-5,13],[0,17],[6,24],[28,-10],[32,13]],[[24851,12213],[-3,-1],[-6,0],[-4,0],[-4,-1],[-3,-1],[-3,0],[-1,0],[0,1],[-2,2],[-3,5],[-2,5],[-1,5],[1,7],[3,3],[0,4],[0,5],[1,5],[1,5],[0,3],[1,1],[2,1],[5,0],[3,0],[5,-1],[3,-1],[3,-2],[4,-5],[3,-6],[0,-3],[1,-3],[0,-4],[1,-5],[1,-4],[-1,-7],[-2,-7],[-2,-1],[-1,0]],[[0,0],[99608,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-391,0],[-390,0],[-391,0],[-390,0],[-391,0]],[[0,3253],[447,8],[89,-8],[94,-25],[207,-2],[194,-11],[50,-33],[65,-20],[137,17],[110,9],[89,1],[823,-46],[843,-81],[172,-26],[154,-61],[162,9],[957,-47],[148,0],[586,-50],[1026,-114],[89,-4],[97,3],[-51,62],[-96,56],[-129,40],[84,12],[184,1],[-37,29],[-101,16],[-366,19],[-1463,144],[-32,9],[-21,12],[-38,13],[-60,14],[-223,8],[-61,13],[-29,16],[15,7],[17,-3],[340,13],[38,16],[2,11],[-18,8],[-59,10],[-137,48],[-44,21],[23,33],[28,14],[105,11],[31,22],[-20,40],[-241,80],[-162,29],[-107,-20],[-203,-1],[-251,-10],[-68,11],[-70,32],[-82,57],[-42,15],[-80,47],[-106,46],[-561,111],[-98,30],[-702,175],[-29,30],[-18,32],[324,-71],[61,0],[72,18],[55,-5],[75,18],[84,9],[219,-55],[442,-89],[118,-31],[63,-22],[52,-7],[51,-16],[63,9],[38,-8],[92,5],[419,10],[166,-8],[195,-43],[75,-71],[56,-32],[107,25],[90,30],[173,25],[56,-10],[93,-37],[105,-62],[445,17],[187,-3],[133,-28],[485,93],[75,20],[111,65],[-91,20],[-65,7],[-25,33],[44,13],[140,18],[272,28],[161,27],[86,70],[369,109],[117,48],[108,79],[-242,157],[-232,136],[74,42],[73,33],[35,26],[29,37],[-76,45],[-71,33],[-117,32],[-440,77],[-150,33],[60,51],[80,39],[169,17],[1079,60],[1087,74],[27,37],[-144,44],[-123,11],[-45,13],[-17,28],[-1,38],[-14,6],[-46,4],[-196,44],[-41,17],[-65,41],[-17,32],[39,82],[60,35],[104,19],[75,7],[225,-1],[88,10],[37,11],[-7,39],[-25,18],[-1,24],[38,14],[47,-1],[13,29],[-26,47],[-67,25],[-176,43],[-400,65],[-155,49],[-89,38],[-74,44],[-75,21],[-52,23],[11,28],[-24,44],[-29,8],[-127,-19],[-227,10],[-278,41],[-192,47],[-251,127],[-99,63],[73,44],[80,28],[334,65],[50,22],[68,58],[-112,24],[-95,-2],[-84,16],[-342,4],[-193,-8],[-162,72],[-121,71],[-34,36],[-26,64],[41,94],[34,67],[-4,83],[9,113],[58,38],[45,7],[105,-87],[90,-7],[131,17],[83,45],[44,17],[81,4],[156,-20],[71,8],[80,-4],[251,-58],[55,-27],[30,-21],[9,-30],[31,-31],[107,-15],[299,17],[78,-7],[212,-85],[180,-91],[62,-23],[102,-15],[36,13],[31,34],[97,42],[218,52],[52,52],[-29,28],[-84,30],[-51,10],[-28,34],[2,47],[17,45],[57,11],[104,-61],[130,-57],[45,-8],[35,2],[65,20],[78,15],[149,-122],[88,-8],[110,-1],[21,19],[-13,32],[-18,35],[-23,5],[-3,32],[48,30],[33,13],[-13,22],[-53,33],[-31,6],[-28,14],[9,23],[35,10],[49,34],[-15,39],[2,51],[-20,27],[-116,53],[-169,87],[-157,39],[-350,-31],[-124,20],[-81,23],[-88,30],[103,32],[108,22],[32,20],[41,40],[48,29],[39,8],[128,-15],[289,-108],[61,-12],[198,-49],[55,-3],[68,11],[-55,48],[-61,34],[-145,96],[16,46],[94,76],[245,6],[107,27],[139,58],[179,96],[154,12],[192,30],[65,-22],[164,-93],[103,-32],[35,-3],[37,3],[-97,116],[63,14],[80,13],[66,29],[49,24],[168,111],[150,31],[426,48],[146,-44],[123,-5],[27,13],[25,59],[65,115],[55,41],[185,43],[145,-2],[104,-47],[97,-31],[89,-14],[90,1],[134,27],[178,9],[83,14],[96,-26],[236,-9],[183,-37],[113,0],[153,36],[83,5],[299,58],[234,12],[177,-26],[286,16],[290,-12],[117,-21],[652,13],[518,55],[71,19],[111,60],[61,55],[41,17],[87,6],[149,-12],[205,-41],[176,15],[337,-23],[32,19],[32,104],[55,165],[47,49],[77,-13],[233,-94],[5,-40],[-24,-29],[-38,-11],[-11,-80],[31,-23],[52,7],[33,-35],[-73,-60],[-52,-34],[-33,-15],[-23,-115],[-31,-38],[-4,-42],[50,0],[50,18],[44,4],[140,30],[255,35],[84,17],[48,6],[31,23],[-43,57],[-14,47],[26,39],[-7,67],[-24,68],[49,50],[46,-11],[79,8],[45,-25],[69,-22],[66,-11],[63,-45],[21,-98],[-19,-100],[-65,-73],[-121,-66],[-137,-105],[29,-50],[71,17],[309,-5],[199,8],[125,-12],[158,-27],[125,-39],[149,-8],[93,15],[87,-20],[339,84],[138,48],[79,-24],[128,20],[71,-18],[133,30],[84,3],[97,-12],[296,-6],[22,-55],[90,-83],[73,-32],[93,14],[67,25],[106,-9],[153,35],[153,-11],[64,6],[29,23],[25,51],[-47,28],[-134,36],[-123,74],[-55,16],[-88,-9],[-41,13],[-44,24],[57,29],[70,93],[-29,84],[-33,18],[-81,-3],[-98,-30],[-39,21],[-64,11],[-25,78],[-68,146],[-36,42],[-108,38],[-93,19],[-90,24],[-27,58],[17,79],[108,17],[104,-8],[58,-15],[67,-6],[77,-16],[50,-23],[40,-13],[75,0],[260,21],[35,15],[31,28],[55,7],[51,-4],[74,17],[-85,23],[-91,44],[-137,53],[-115,29],[-209,20],[-107,-7],[-67,11],[-239,-6],[-65,21],[-46,58],[-65,138],[-18,72],[44,27],[29,30],[71,3],[103,-12],[34,-14],[25,-43],[-25,-44],[-33,-23],[20,-21],[105,-6],[52,-13],[45,-5],[97,20],[142,8],[71,-20],[85,-15],[125,24],[445,-13],[54,-6],[54,-40],[46,-24],[49,10],[145,-46],[77,-36],[79,-18],[67,-5],[75,9],[98,30],[81,12],[58,-11],[123,-6],[94,-36],[73,15],[77,41],[244,29],[163,-8],[298,-74],[69,-7],[136,44],[44,72],[-6,81],[39,19],[33,-9],[60,56],[82,-5],[51,-10],[31,36],[28,77],[97,6],[70,-12],[92,-49],[0,-41],[-38,-43],[-63,-107],[39,-63],[59,6],[75,-13],[91,27],[58,1],[101,-93],[68,-5],[53,5],[172,84],[50,9],[61,-38],[89,-89],[78,-51],[114,-32],[99,-9],[116,-42],[64,-35],[146,0],[62,-15],[176,-72],[160,36],[83,33],[40,61],[-20,91],[-7,92],[24,38],[42,7],[191,-103],[-12,62],[-16,47],[-49,82],[7,61],[41,19],[80,-32],[96,-16],[79,-36],[155,-128],[50,-112],[105,-28],[73,5],[83,18],[111,16],[86,-5],[79,21],[24,-61],[-74,-88],[-29,-57],[24,-15],[45,13],[37,18],[129,-9],[104,40],[89,14],[84,42],[69,-4],[53,-7],[72,-33],[69,18],[41,-7],[56,-2],[297,145],[67,-3],[85,9],[107,34],[83,15],[68,-1],[121,53],[193,-7],[98,28],[191,32],[128,37],[228,98],[92,58],[100,129],[63,129],[70,171],[-34,111],[-37,49],[-31,54],[-73,111],[-20,139],[7,131],[-26,123],[-26,91],[-54,152],[-66,99],[-77,133],[0,121],[-19,95],[-46,68],[-20,54],[36,11],[33,17],[89,21],[213,-37],[19,54],[54,40],[38,50],[-13,77],[-47,31],[-56,65],[26,52],[45,0],[22,57],[-17,56],[21,70],[41,90],[28,33],[-51,54],[-48,70],[12,54],[24,57],[29,80],[40,57],[26,20],[-7,19],[-61,20],[-56,4],[-101,-36],[-16,7],[-5,19],[-6,39],[10,95],[16,90],[14,13],[40,11],[38,69],[35,4],[22,-23],[7,-91],[12,-21],[-4,-44],[18,-15],[22,28],[41,14],[16,-31],[15,-15],[7,26],[-5,74],[-7,30],[-5,48],[9,23],[10,37],[-17,78],[6,29],[37,47],[18,9],[35,0],[63,-31],[30,-2],[22,14],[14,30],[11,98],[-27,35],[0,31],[16,20],[28,68],[42,4],[41,-6],[40,13],[-14,28],[-12,43],[45,21],[29,6],[77,-27],[30,-15],[28,35],[-9,34],[-30,19],[-5,30],[7,39],[48,-20],[11,8],[13,34],[-8,17],[-6,22],[63,5],[9,9],[13,27],[19,9],[56,-1],[12,14],[6,30],[-31,7],[-39,29],[-6,80],[9,57],[35,50],[42,34],[78,-30],[60,7],[24,-30],[33,-8],[8,34],[-15,30],[-10,49],[96,59],[31,-10],[38,14],[-14,45],[21,57],[27,8],[19,-50],[26,-10],[29,12],[71,58],[35,9],[35,3],[36,34],[9,40],[20,28],[62,38],[25,27],[55,95],[-10,24],[16,20],[163,86],[80,8],[133,52],[81,61],[51,25],[45,68],[55,11],[128,47],[96,77],[133,53],[62,-5],[25,-16],[16,-63],[26,-77],[40,-38],[-15,-34],[-38,4],[-41,-8],[-9,38],[15,28],[-15,25],[-37,-6],[-49,-13],[-33,-19],[-43,-41],[-34,-23],[-113,-61],[-74,-88],[-53,-93],[-32,-63],[-47,-5],[-11,-23],[19,-18],[15,-8],[35,-7],[-6,-27],[-24,-7],[3,-22],[25,-32],[5,-46],[-29,-7],[-44,49],[-50,5],[-39,23],[-25,33],[-24,-7],[-18,-47],[11,-52],[-21,-31],[-24,14],[-9,62],[-23,11],[-32,1],[-77,-67],[-28,-2],[-14,-34],[-45,-38],[-29,-31],[-71,-102],[-40,-43],[-76,-24],[-30,3],[-18,10],[-27,7],[-28,1],[-9,-27],[44,-88],[-24,-30],[-53,2],[-26,25],[-21,-24],[-17,-23],[-17,-34],[26,-72],[41,-32],[30,-6],[11,-27],[-65,-11],[-44,-63],[-20,-44],[-23,-38],[3,-44],[34,-66],[46,-47],[46,-4],[60,15],[14,13],[59,7],[26,46],[19,3],[17,-8],[27,-2],[15,30],[20,11],[28,-8],[54,1],[15,-27],[-17,-30],[-33,-42],[-31,23],[-27,-4],[-15,-22],[29,-47],[-11,-42],[-24,-42],[-29,27],[-4,45],[-40,27],[-39,12],[-26,-47],[-41,-13],[-6,-54],[-17,-50],[-24,15],[-9,62],[-67,50],[-35,7],[-70,-13],[-24,1],[-28,-11],[-20,-42],[29,-31],[10,-42],[-1,-31],[-6,-12],[-5,-26],[32,-37],[1,-50],[-25,1],[-21,15],[-81,130],[-51,58],[-22,51],[-53,12],[-38,1],[-46,-21],[18,-24],[9,-36],[-28,-15],[-35,-56],[-23,-48],[-14,-10],[-18,-28],[75,-61],[11,-24],[4,-41],[-24,-22],[-56,-9],[-99,43],[-43,1],[-15,30],[-22,-4],[-13,-51],[-16,-45],[-24,-30],[7,-46],[19,-11],[-15,-19],[-31,-15],[-21,-18],[46,-17],[9,-15],[2,-22],[-72,-16],[-47,-4],[-28,18],[-26,-9],[-17,-29],[-5,-39],[5,-48],[9,-34],[7,-13],[8,-29],[-43,-74],[-5,-16],[-3,-34],[21,-31],[16,-46],[-23,-23],[-25,-47],[26,-9],[44,-2],[48,6],[72,41],[20,7],[9,-16],[6,-25],[-18,-24],[-130,-68],[-24,-29],[33,-16],[67,-3],[26,-22],[-16,-24],[-24,-23],[-28,-54],[23,-20],[72,-32],[131,-42],[97,-14],[-22,49],[-3,60],[68,49],[35,16],[162,29],[44,-1],[34,-13],[-13,-25],[-37,9],[-65,-16],[-100,-54],[-18,-23],[7,-42],[85,-34],[27,-27],[-37,-81],[6,-52],[43,-57],[57,-65],[28,-43],[43,-25],[70,-61],[38,-61],[12,-140],[57,-116],[67,-53],[8,-46],[-22,-46],[-57,27],[-32,-27],[-12,-49],[40,-34],[64,-42],[138,4],[4,-46],[-32,-27],[-25,-34],[-31,-19],[-52,-12],[-13,-41],[22,-58],[72,26],[53,3],[55,-10],[17,-77],[65,-95],[16,-45],[-12,-43],[-40,-13],[-25,-34],[-36,-29],[-41,-16],[-76,-79],[-33,-8],[-14,-16],[65,-8],[45,-2],[97,64],[37,-14],[24,-42],[12,-49],[-24,-42],[-169,-25],[-82,-23],[-88,-66],[101,-31],[74,11],[37,-12],[51,-23],[56,12],[44,24],[33,-1],[31,-12],[4,-41],[4,-72],[7,-54],[-18,-36],[-88,-26],[-64,1],[-2,-76],[96,-57],[60,30],[53,-15],[0,-91],[41,-101],[36,-6],[30,46],[38,0],[15,-54],[-17,-91],[-29,-50],[-78,21],[-44,16],[-35,-34],[-58,-29],[-51,-4],[-45,45],[-52,34],[-83,17],[-78,8],[26,-39],[35,-23],[14,-69],[28,-72],[65,19],[90,-41],[56,-43],[24,-57],[-31,-91],[-51,-34],[-32,-16],[-56,35],[-39,0],[-41,-16],[-14,-42],[-27,-20],[144,-3],[45,-11],[33,-38],[-52,-50],[-95,8],[-41,-19],[-35,-36],[142,-22],[59,12],[93,38],[22,-38],[-37,-38],[-48,-61],[-100,-19],[-75,-1],[-98,22],[-26,13],[-41,7],[3,-37],[26,-26],[66,-94],[11,-36],[-21,-50],[-58,-37],[-65,-14],[-54,32],[-39,91],[-50,27],[-51,8],[-30,-4],[3,-46],[12,-49],[-20,-35],[-44,18],[-57,-16],[-53,-27],[-48,-30],[98,-14],[65,-3],[46,-46],[-17,-23],[-88,-10],[-86,-20],[-117,-50],[86,-21],[81,1],[57,-5],[47,-9],[13,-27],[-29,-30],[-192,-74],[-201,-91],[-74,-29],[-77,-16],[-179,-78],[-113,-36],[-318,-55],[-497,-139],[-169,-99],[-50,-76],[-32,-11],[-95,-26],[-95,-12],[-251,-8],[-257,37],[-208,8],[-113,-12],[-386,66],[-49,-3],[-60,-12],[-48,0],[-36,9],[-78,4],[-263,-26],[-27,-41],[33,-76],[96,-92],[160,-162],[86,-35],[53,-37],[100,-43],[224,-2],[306,-34],[174,-31],[-6,-60],[-105,-115],[-65,-44],[-155,-80],[-213,-40],[-163,12],[-289,65],[-362,60],[-538,57],[-118,26],[-139,26],[-79,-27],[-60,-25],[-133,-2],[39,-23],[537,-155],[458,-113],[54,-29],[65,-20],[-6,-72],[-26,-57],[-90,-50],[-234,-3],[-293,-40],[-146,-1],[-145,39],[-309,113],[-189,84],[-132,96],[-91,76],[-102,75],[7,-47],[18,-47],[50,-58],[73,-63],[5,-25],[-35,-4],[-53,30],[-45,-28],[-16,-33],[19,-44],[28,-42],[93,-94],[80,-25],[106,-57],[258,-106],[44,-36],[78,-78],[16,-59],[76,-58],[52,-9],[47,2],[16,50],[-3,61],[20,15],[74,15],[193,-21],[821,-12],[78,-35],[31,-45],[21,-93],[-87,-112],[-59,-48],[-97,-29],[-88,-23],[-133,-9],[-275,8],[-269,0],[209,-54],[203,-44],[282,8],[112,12],[97,21],[41,-37],[77,-78],[45,-25],[31,-26],[43,-85],[17,-50],[42,-58],[30,-49],[44,-33],[75,-15],[82,28],[159,13],[154,-45],[99,-14],[132,37],[105,52],[221,47],[41,20],[60,16],[91,-4],[36,-12],[46,-51],[43,-70],[63,-35],[67,-25],[38,-3],[126,-22],[164,21],[73,-21],[12,-40],[39,-32],[49,-11],[665,-180],[229,-35],[353,-18],[274,-2],[38,-11],[53,-35],[-105,-24],[-112,-3],[-169,9],[-60,-5],[-129,10],[-67,-7],[-61,11],[-91,-25],[-166,-19],[37,-27],[62,-6],[126,-10],[172,5],[15,-43],[-158,-10],[-336,-9],[-35,-7],[-26,-22],[50,-11],[31,-12],[16,-31],[-36,-79],[56,-55],[39,-9],[41,8],[71,-22],[69,-30],[146,-2],[173,40],[85,-1],[228,25],[207,-4],[289,48],[48,-1],[44,-6],[-80,-44],[-355,-110],[-127,-21],[-51,-14],[29,-54],[46,-56],[94,-60],[59,-89],[57,-19],[110,41],[27,-31],[5,-61],[-29,-49],[-37,-28],[-26,-27],[-17,-36],[46,-31],[123,-19],[163,-7],[151,-1],[93,-9],[341,194],[137,94],[67,39],[56,29],[288,119],[67,36],[76,53],[141,8],[193,86],[171,66],[68,13],[51,5],[60,14],[150,-5],[107,11],[190,42],[145,27],[154,23],[174,4],[463,44],[132,-19],[146,-46],[95,1],[125,14],[86,18],[39,-53],[20,-69],[-42,-64],[-70,-40],[-19,-66],[95,-33],[108,10],[206,32],[164,42],[45,28],[64,-8],[109,35],[136,146],[171,147],[144,94],[93,110],[77,63],[86,48],[58,24],[132,5],[189,76],[275,87],[211,-42],[223,-63],[110,51],[87,9],[74,23],[74,17],[53,45],[71,38],[54,55],[271,27],[284,36],[38,13],[37,-7],[98,10],[125,30],[172,10],[90,-3],[82,81],[164,17],[175,32],[73,24],[57,6],[1413,63],[61,31],[124,25],[47,61],[-190,25],[-58,26],[-65,7],[-38,-9],[-164,7],[-1303,94],[-27,8],[-45,57],[9,105],[-39,81],[-91,22],[-94,-2],[-119,-10],[-314,-44],[-125,-4],[-335,68],[-221,77],[-145,25],[-104,52],[-97,40],[-7,91],[23,85],[187,246],[117,118],[78,9],[71,53],[73,119],[59,56],[135,66],[59,17],[212,81],[58,2],[95,-13],[108,73],[329,156],[75,59],[91,35],[266,132],[238,64],[118,19],[144,39],[160,59],[139,57],[497,109],[298,29],[203,32],[144,-19],[143,6],[123,29],[57,23],[83,59],[276,-28],[178,40],[74,4],[78,18],[-31,21],[-28,3],[-28,28],[-37,58],[37,73],[28,36],[82,45],[43,64],[40,94],[135,185],[38,26],[86,8],[73,-5],[83,2],[210,-48],[39,19],[67,54],[56,68],[120,100],[23,30],[-10,49],[-180,-21],[-136,-33],[-131,18],[-17,28],[28,21],[49,8],[19,34],[-45,28],[-81,16],[-36,21],[3,51],[20,75],[44,21],[36,31],[96,105],[57,32],[164,29],[190,-44],[44,12],[46,59],[-47,90],[-36,34],[0,30],[100,-14],[93,-20],[109,4],[129,90],[181,75],[88,31],[78,18],[42,76],[62,144],[46,75],[-1,45],[-14,38],[-47,-11],[-43,-5],[-101,38],[-125,61],[-38,68],[-18,61],[39,33],[38,20],[41,5],[73,-25],[93,-62],[46,-24],[53,-46],[40,4],[47,64],[38,85],[32,26],[49,28],[54,41],[-24,40],[-58,21],[-8,24],[25,27],[47,6],[59,-59],[80,-39],[55,-13],[47,-32],[74,-108],[89,-179],[41,-2],[78,16],[84,7],[56,51],[12,128],[22,58],[-8,59],[-38,60],[-33,44],[6,33],[28,24],[37,8],[64,24],[99,-28],[54,-5],[81,16],[84,35],[86,25],[67,-19],[29,-64],[-33,-65],[-54,-48],[-49,-59],[-13,-64],[2,-35],[47,-9],[416,8],[55,-6],[72,0],[78,-21],[132,8],[118,23],[56,0],[97,-21],[69,-44],[143,13],[40,14],[39,59],[41,11],[48,-48],[15,-110],[22,-52],[61,-47],[60,40],[39,48],[94,93],[107,71],[82,42],[200,70],[99,44],[194,60],[250,32],[446,108],[147,12],[240,28],[123,30],[125,23],[77,80],[175,-61],[60,-7],[82,48],[90,119],[131,-49],[75,-77],[93,-60],[208,-104],[66,-24],[138,-21],[37,17],[65,69],[67,100],[42,42],[61,35],[69,55],[-18,30],[-39,10],[-36,16],[9,29],[122,7],[64,-101],[66,-33],[80,-33],[186,26],[159,2],[138,-20],[68,3],[61,76],[99,28],[56,-34],[35,-112],[127,-31],[266,-51],[30,13],[33,59],[23,72],[54,12],[69,39],[37,-6],[52,-47],[-18,-114],[-29,-105],[35,-85],[31,-47],[40,-8],[67,-2],[82,6],[51,-4],[261,42],[32,94],[42,107],[103,136],[40,-10],[31,-14],[70,-67],[42,-34],[9,-49],[-46,-47],[13,-31],[46,-25],[148,-41],[48,8],[71,43],[72,85],[39,98],[61,-5],[59,-20],[41,-51],[0,-97],[57,-66],[46,-42],[120,-45],[128,-11],[90,-27],[146,10],[71,30],[46,8],[80,24],[84,57],[52,23],[192,52],[145,57],[154,102],[150,61],[230,31],[64,13],[88,-1],[217,73],[82,42],[46,15],[52,52],[28,102],[22,63],[-4,61],[-20,80],[-46,71],[-47,104],[21,119],[37,49],[96,54],[95,11],[108,-7],[94,-11],[8,-51],[-41,-55],[-52,-54],[-31,-23],[11,-46],[68,-7],[149,10],[43,-42],[106,-184],[26,-87],[37,-25],[58,12],[125,-1],[87,13],[71,1],[37,-9],[38,-42],[72,-49],[72,36],[52,17],[63,-4],[99,-57],[99,-133],[107,-67],[7,43],[-14,53],[44,47],[53,79],[77,103],[61,105],[15,145],[29,119],[49,57],[48,37],[75,38],[92,8],[88,86],[62,35],[130,47],[163,47],[114,131],[39,16],[58,21],[107,8],[173,42],[54,6],[91,33],[80,78],[58,22],[104,-3],[88,44],[74,2],[68,22],[10,49],[-32,33],[-1,43],[38,56],[30,21],[90,-4],[75,-48],[55,-2],[14,-27],[-48,-34],[-32,-61],[55,-53],[49,-36],[59,7],[71,32],[70,-23],[31,-49],[0,-76],[15,-41],[49,36],[27,76],[-8,97],[3,60],[117,97],[46,73],[-82,15],[-58,-10],[-32,27],[-37,73],[101,61],[116,-2],[67,-52],[144,-83],[80,2],[72,-13],[15,26],[-27,122],[3,68],[-60,38],[-17,87],[25,91],[71,51],[97,24],[208,140],[55,30],[137,29],[160,14],[199,50],[355,-34],[95,-21],[59,-28],[57,-45],[74,-74],[107,-94],[139,-30],[39,-29],[51,-80],[-55,-52],[-45,-5],[-87,31],[-60,32],[-42,-13],[41,-55],[45,-34],[7,-46],[-24,-66],[-164,-130],[98,-37],[59,30],[54,55],[55,25],[37,10],[130,2],[74,22],[56,-16],[55,-35],[81,-35],[116,-38],[143,-147],[111,15],[60,32],[171,10],[147,-65],[83,-24],[240,-20],[143,-42],[91,50],[61,20],[128,10],[65,-10],[178,-54],[315,-55],[217,-29],[191,-1],[91,-24],[166,-26],[63,-20],[159,16],[74,21],[70,47],[39,-11],[27,-59],[-15,-101],[29,-69],[23,-69],[33,-57],[21,-49],[-15,-41],[-46,-37],[-64,-79],[4,-69],[27,-44],[-32,-53],[24,-74],[4,-45],[-22,-36],[-50,-22],[-85,-3],[-44,-21],[-7,-55],[22,-41],[49,-22],[14,-44],[-7,-66],[-22,-56],[-45,-26],[-49,-6],[-91,12],[-66,37],[-42,-33],[-31,-34],[-95,-77],[-44,-52],[-41,-55],[108,-31],[79,-55],[172,6],[55,24],[73,26],[39,-5],[24,-56],[-14,-89],[-3,-69],[-87,-190],[-29,-32],[-41,-52],[-48,-41],[-39,-20],[-75,-60],[-46,-109],[-50,-90],[-73,-154],[-42,-165],[-18,-99],[-28,-103],[-62,-177],[-40,-30],[-69,-72],[20,-48],[54,-5],[66,-11],[89,-37],[118,76],[62,48],[13,96],[-13,97],[38,57],[87,78],[205,56],[42,6],[68,19],[60,70],[53,70],[93,44],[77,72],[12,51],[32,11],[96,50],[25,37],[30,28],[21,63],[8,118],[24,89],[47,118],[38,86],[37,54],[99,29],[43,33],[57,73],[39,44],[-5,90],[22,83],[61,50],[78,92],[98,13],[74,48],[79,-33],[95,-46],[161,14],[76,-21],[59,25],[52,71],[19,87],[61,50],[69,-1],[114,87],[118,77],[96,18],[77,60],[55,102],[59,79],[73,75],[20,133],[46,67],[85,59],[71,32],[298,100],[229,66],[231,82],[71,-1],[93,45],[153,2],[40,4],[53,93],[114,86],[71,28],[90,74],[73,7],[103,-13],[87,-20],[78,-1],[113,62],[176,10],[54,30],[38,26],[249,87],[93,-17],[132,15],[80,-4],[76,-11],[96,-3],[166,31],[70,20],[132,76],[146,18],[64,20],[82,17],[67,-29],[48,-27],[29,-6],[39,-5],[95,30],[79,-8],[101,-33],[67,-27],[35,0],[62,24],[76,60],[71,24],[67,-15],[46,-25],[81,-34],[126,5],[120,13],[101,28],[87,30],[80,-46],[92,-17],[149,81],[57,-18],[39,-21],[32,-10],[39,-68],[142,13],[126,57],[108,43],[105,28],[83,39],[122,148],[-2,46],[17,28],[26,12],[194,-1],[60,12],[79,39],[137,-30],[131,-47],[34,5],[53,1],[93,-29],[105,-57],[93,-15],[385,-142],[218,-35],[110,-47],[28,-16],[32,-48],[58,-5],[46,19],[61,-73],[148,-55],[154,-27],[100,43],[170,123],[52,55],[-10,122],[89,136],[151,67],[188,35],[116,30],[154,28],[74,-29],[38,-21],[57,-25],[68,-76],[106,-172],[79,-62],[69,-5],[60,-10],[63,-39],[90,-121],[-54,-108],[-46,-40],[-196,-46],[-86,-37],[-75,-23],[-21,-90],[31,-42],[81,21],[95,10],[74,18],[68,28],[59,40],[140,21],[91,34],[82,20],[57,35],[58,-5],[58,-34],[46,3],[124,-11],[58,25],[51,2],[52,-19],[54,-26],[54,-7],[70,16],[98,42],[125,46],[117,15],[28,-1],[24,-9],[-117,-53],[-187,-72],[-100,-69],[59,-29],[352,77],[160,58],[142,26],[35,19],[116,90],[42,24],[125,32],[163,34],[124,39],[84,40],[63,4],[49,-29],[63,-33],[62,8],[76,31],[53,72],[31,53],[57,18],[73,16],[59,-18],[96,-38],[67,-20],[58,-151],[136,-133],[49,-35],[119,13],[128,-52],[55,7],[52,15],[47,-10],[70,32],[73,167],[67,163],[66,72],[40,30],[50,14],[77,34],[104,10],[77,-14],[167,-12],[136,41],[154,-7],[76,48],[82,7],[111,-41],[32,-29],[61,-42],[15,-41],[16,-74],[30,-2],[103,73],[56,13],[106,117],[56,-30],[127,-50],[51,-15],[100,-85],[51,18],[42,40],[124,-4],[116,-35],[48,-29],[59,-50],[37,-12],[29,14],[240,-19],[104,-37],[79,-45],[278,-21],[107,-46],[64,22],[127,-7],[52,-39],[46,-43],[101,-37],[55,7],[78,30],[78,41],[78,0],[37,-35],[13,-88],[58,2],[64,40],[56,-10],[20,-61],[-30,-81],[-71,-114],[-29,-95],[-59,-86],[10,-41],[59,-20],[59,61],[132,42],[69,55],[119,20],[117,-19],[83,-73],[154,-123],[6,-44],[13,-46],[-5,-41],[-23,-47],[82,-55],[73,-9],[59,5],[247,-53],[118,21],[106,0],[126,8],[97,-2],[77,-9],[91,19],[74,26],[36,-16],[15,-137],[5,-81],[42,-30],[44,30],[32,41],[195,-19],[78,-2],[74,-22],[75,-51],[72,22],[43,31],[58,20],[17,51],[7,85],[-2,83],[34,15],[35,-15],[46,-39],[105,-125],[80,-81],[34,-38],[49,-31],[99,-75],[136,-31],[133,-60],[155,4],[121,-77],[82,60],[43,14],[63,-16],[76,-52],[60,-12],[205,-86],[110,-30],[41,-63],[54,-60],[0,-61],[24,-77],[123,-61],[48,-59],[59,-78],[107,-293],[56,-52],[81,5],[76,-76],[24,11],[3,30],[-69,198],[-5,107],[54,61],[127,17],[98,-114],[90,-69],[60,-12],[120,3],[113,73],[86,-26],[138,-9],[179,-43],[77,8],[137,-18],[167,-62],[95,-23],[20,-25],[44,-41],[22,-50],[24,-46],[58,-52],[58,-9],[115,-44],[241,-136],[87,-40],[51,-29],[25,35],[7,72],[44,15],[47,-107],[49,-81],[22,-71],[-51,-58],[-74,12],[-52,0],[-53,-96],[-22,-166],[49,3],[36,15],[8,-61],[-22,-51],[-44,-20],[-76,39],[-93,27],[-102,10],[-99,49],[-39,3],[-41,-3],[53,-51],[55,-46],[125,-40],[156,-62],[4,-38],[-37,-47],[-46,-100],[-142,-86],[-83,62],[-98,15],[-49,-37],[-98,4],[-194,-14],[-76,79],[-119,43],[4,-36],[102,-130],[109,-30],[108,-35],[26,-33],[-49,-31],[-66,5],[-83,-61],[-158,10],[-75,-3],[-44,-25],[-39,-9],[31,-22],[38,-60],[-54,-51],[-50,-25],[-51,12],[-56,-20],[-27,56],[-2,122],[-32,109],[-34,4],[-54,-13],[-17,-93],[38,-161],[26,-50],[-21,-45],[-36,-14],[73,-136],[62,-93],[38,-31],[3,-46],[-30,-20],[-83,18],[-41,-9],[-46,6],[-77,20],[-66,6],[-66,-26],[-56,2],[-50,85],[-44,20],[-36,-26],[-28,-101],[-57,-31],[-58,-46],[-41,-50],[-20,-198],[-34,-41],[-51,2],[-39,-16],[-49,16],[-64,10],[-214,-68],[34,-35],[54,6],[188,-11],[80,-36],[13,-89],[32,-38],[63,-41],[48,-20],[18,-30],[-20,-61],[-27,-56],[-59,-61],[17,-31],[64,-10],[27,-137],[-42,-61],[20,-51],[5,-51],[-43,-47],[-33,-24],[-11,-50],[64,-29],[47,-10],[66,-5],[45,-54],[58,-82],[42,-68],[3,-113],[41,-67],[77,-43],[-2,-45],[54,-14],[53,-4],[19,-41],[-17,-50],[-89,-61],[-37,-44],[89,-7],[92,-46],[117,52],[62,56],[40,50],[30,-13],[3,-52],[36,-87],[151,-84],[84,-27],[81,-14],[71,2],[20,-50],[-22,-46],[-56,3],[-90,-8],[-66,38],[-47,33],[-412,-19],[-93,-15],[-111,-50],[-110,-24],[-169,-50],[-71,-30],[-185,117],[-60,86],[-25,5],[-44,-20],[-2,-61],[86,-133],[39,-35],[0,-35],[-25,-18],[-35,0],[-53,26],[-99,21],[-88,-41],[-108,-87],[23,-58],[29,-33],[-7,-39],[-121,-74],[-40,-3],[-25,-15],[30,-27],[66,-1],[7,-33],[-23,-26],[-109,-30],[7,-40],[59,-19],[77,7],[48,-29],[0,-46],[-49,-26],[-57,-19],[-392,-118],[-57,-32],[3,-43],[137,-11],[410,10],[27,-14],[-10,-34],[-23,-43],[23,-31],[61,-21],[2,-33],[-30,-13],[-61,-15],[-67,-4],[4,-35],[92,-31],[31,-4],[3,-118],[-3,-50],[-49,-24],[-18,-17],[-2,-40],[122,-29],[187,-127],[41,0],[74,-24],[119,-65],[42,-39],[68,-19],[9,-32],[42,-27],[166,-88],[22,-38],[-348,-73],[-350,-54],[32,-48],[378,5],[102,-30],[45,9],[26,32],[204,38],[207,25],[65,-18],[278,-141],[129,-53],[82,-20],[60,-5],[44,-21],[43,-45],[-10,-42],[18,-19],[29,-8],[55,-28],[63,10],[73,32],[51,-7],[92,-45],[-35,-35],[-20,-17],[-24,-32],[-23,-11],[-74,-7],[-41,0],[-42,6],[-4,-23],[51,-25],[74,-27],[480,-21],[137,-46],[135,25],[61,-8],[51,-15],[19,-46],[69,-15],[106,-36],[148,-18],[118,1],[145,-49],[73,-2],[45,-28],[330,-17],[49,-22],[38,-36],[78,-16],[85,-3],[464,-59],[174,-31],[40,2],[40,-6],[125,-26],[127,-14],[61,-36],[-99894,-48]],[[37438,6445],[36,-2],[146,6],[146,-2],[89,-7],[26,-16],[23,-32],[26,-50],[24,-55],[27,-45],[16,-79],[25,-29],[43,-73],[6,-59],[-13,-128],[-21,-52],[-56,-50],[-64,5],[-29,-2],[-28,-10],[-11,-7],[-4,-10],[74,-43],[9,-16],[1,-19],[-10,-13],[-10,-7],[-1573,-260],[-61,-14],[-61,-27],[-20,-23],[-20,-18],[-1219,-49],[-11,3],[-11,10],[-31,50],[-6,79],[7,31],[61,30],[23,17],[103,117],[53,55],[25,46],[13,-3],[47,-27],[35,-8],[68,11],[67,33],[29,18],[29,-6],[5,-28],[12,-9],[162,88],[147,98],[144,111],[73,66],[18,19],[12,28],[-10,28],[-13,25],[-12,10],[-12,4],[-75,18],[23,29],[22,35],[14,39],[5,47],[-3,24],[3,18],[34,15],[23,24],[16,28],[-26,9],[-12,21],[23,49],[21,52],[21,28],[56,55],[163,138],[59,74],[17,27],[386,119],[63,12],[121,17],[56,3],[158,-12],[74,-12],[128,-32],[189,-61],[71,-27],[71,-34],[68,-43],[67,-52],[13,-16],[6,-29],[2,-28],[-3,-27],[-18,-56],[-26,-39],[-311,-37],[-41,-15],[-22,-30],[-16,-30],[36,-11]],[[33407,5562],[-11,-124],[1,-56],[-16,-45],[-28,-23],[-55,-39],[-40,-23],[-87,-38],[-400,34],[-180,31],[-75,40],[-12,18],[-23,61],[-21,19],[-159,-13],[-97,-19],[-17,-10],[-26,-38],[-14,-8],[-259,81],[-273,95],[-113,49],[-39,22],[-11,15],[25,19],[26,12],[29,9],[30,1],[22,-7],[22,-14],[14,-51],[14,-8],[38,-14],[961,7],[80,2],[166,15],[89,21],[33,29],[-80,7],[-32,22],[-27,41],[-6,38],[9,28],[106,14],[16,10],[-28,16],[1,37],[63,14],[25,31],[124,39],[196,-21],[47,-56],[-13,-36],[-9,-37],[-1,-57],[80,-8],[25,-21],[24,-26],[-29,-1],[-28,-6],[-23,-27],[-20,-35],[-14,-16]],[[30541,11987],[-8,-70],[46,25],[17,-5],[40,-26],[81,-151],[18,-48],[33,-139],[40,-105],[100,-183],[49,-100],[26,-58],[3,-78],[31,-22],[7,-32],[10,-107],[7,-124],[7,-238],[-4,-55],[-43,-89],[-18,-63],[-23,-42],[-27,-30],[-141,-125],[-17,-62],[-237,-53],[-134,-22],[-52,24],[-53,6],[-66,-8],[-191,-7],[-144,-18],[-19,7],[-13,23],[-14,16],[-38,-3],[-31,9],[-30,19],[-33,36],[-14,21],[-8,23],[64,60],[33,13],[33,4],[67,-13],[67,-20],[147,-16],[204,-4],[56,6],[67,19],[62,55],[-30,21],[-31,13],[-30,3],[-30,-4],[-84,-34],[-65,-20],[-65,-12],[-69,20],[-64,56],[-2,18],[220,43],[20,7],[40,27],[13,24],[6,23],[-148,40],[-31,-1],[-30,-7],[-67,17],[-64,47],[-59,57],[-22,5],[-21,-17],[-143,-150],[-12,-1],[-54,11],[-68,30],[-62,10],[-40,-8],[-15,-12],[39,-34],[33,-30],[10,-24],[-101,-75],[-27,-10],[-43,7],[-16,9],[-31,40],[-30,10],[-65,-8],[-34,3],[-34,18],[-32,26],[-30,14],[-36,29],[-26,20],[-8,29],[3,28],[11,16],[2,15],[-8,27],[5,19],[12,18],[54,34],[65,7],[63,-43],[42,-13],[19,-1],[7,2],[5,12],[-1,22],[-12,42],[-1,29],[14,24],[19,9],[20,6],[13,3],[41,-15],[29,-16],[59,-46],[49,-32],[19,-3],[14,11],[13,18],[-59,46],[-6,30],[3,26],[36,15],[22,2],[104,-27],[56,-9],[55,-3],[114,31],[-61,35],[-132,30],[-25,21],[-18,34],[97,31],[99,-1],[177,-40],[59,19],[55,58],[32,15],[125,-5],[101,27],[16,-3],[15,-8],[97,-97],[13,5],[10,19],[3,34],[1,34],[-3,35],[-12,22],[-16,-3],[-17,-10],[-28,9],[-28,18],[-29,8],[-100,11],[-71,18],[-37,14],[-34,28],[-5,31],[36,71],[138,76],[65,25],[66,6],[32,-5],[76,-32],[12,2],[11,8],[-73,53],[-65,41],[-33,31],[-26,12],[-109,12],[-57,-31],[-27,-5],[-27,3],[-160,74],[-9,8],[-23,28],[-12,21],[-7,35],[3,35],[5,23],[24,91],[13,72],[-7,59],[-25,32],[-36,22],[-33,35],[-9,24],[-6,28],[-1,36],[9,32],[14,34],[18,17],[34,17],[133,39],[270,49],[30,-25],[43,-52],[14,-21],[15,-104],[0,-29]],[[22752,10418],[-23,-61],[2,-60],[68,4],[30,114],[64,21],[31,-68],[-30,-55],[15,-31],[18,-22],[32,-1],[29,33],[13,24],[11,26],[19,58],[61,54],[135,8],[71,-34],[-48,-86],[-115,-50],[-74,-52],[25,-14],[25,-7],[23,2],[65,27],[160,50],[61,37],[22,-6],[0,-62],[21,-42],[-12,-93],[-69,-17],[-71,-8],[18,-41],[-4,-17],[-6,-13],[-178,17],[-31,-6],[-31,-12],[-31,3],[-62,30],[-32,0],[-64,-15],[-65,-6],[-93,1],[-68,5],[-64,33],[-67,9],[-75,1],[-79,38],[-66,15],[-95,39],[-25,15],[-25,8],[-45,-3],[-346,59],[-51,-1],[-33,-8],[-33,4],[-67,28],[-14,31],[7,29],[15,13],[30,13],[480,69],[50,19],[37,-2],[28,-59],[42,-61],[14,1],[14,6],[47,51],[86,-16],[48,23],[33,45],[97,52],[61,-10],[57,-22],[27,-54]],[[16512,9357],[49,-58],[19,-38],[11,-39],[-199,-96],[-9,-10],[-9,-50],[5,-11],[8,-8],[1,-19],[-17,-6],[-340,-38],[-159,35],[-22,23],[-5,36],[19,7],[35,5],[-9,16],[-22,29],[-2,24],[48,61],[23,16],[-90,57],[-11,13],[-12,4],[-44,-7],[-43,3],[15,23],[12,38],[38,32],[28,5],[28,-3],[132,-2],[130,-17],[131,-12],[215,-11],[46,-2]],[[14908,9627],[74,-16],[25,-25],[33,-18],[33,-10],[31,-27],[18,-48],[16,-15],[49,-32],[17,-28],[-3,-14],[-93,-11],[-31,4],[-29,-9],[-9,-17],[1,-18],[16,-13],[34,-12],[34,2],[63,14],[28,-3],[32,-15],[32,-2],[84,46],[21,8],[21,-2],[115,-54],[24,-27],[-17,-15],[-14,-22],[6,-15],[55,-22],[23,-28],[14,-11],[-3,-24],[-8,-29],[1,-33],[-28,-18],[-13,0],[-60,18],[-187,10],[-60,15],[-92,65],[-36,4],[-37,16],[-57,46],[-99,37],[-63,45],[2,38],[-9,27],[-12,11],[-12,6],[-36,10],[-35,-3],[-18,-11],[-29,-28],[-32,-5],[-25,6],[-5,6],[-1,74],[-27,10],[-23,30],[-4,40],[10,37],[35,45],[40,5],[40,-7],[41,10],[65,6],[74,-4]],[[5819,5871],[-347,-22],[-141,19],[-294,63],[-403,114],[-110,36],[-72,31],[-70,39],[-16,43],[10,62],[13,51],[21,32],[86,38],[43,42],[87,44],[25,33],[37,2],[70,-4],[69,-9],[65,-11],[63,-19],[144,-62],[100,-61],[144,-72],[143,-81],[80,-30],[77,-45],[74,-61],[14,-21],[31,-27],[19,-26],[19,-22],[19,-11],[15,-24],[-3,-26],[-12,-15]],[[96411,7303],[105,-42],[275,4],[229,-39],[21,-40],[-65,-21],[-101,-53],[-65,-17],[-55,0],[-112,22],[-146,-3],[-31,-31],[-71,-31],[-82,-54],[-22,44],[-33,42],[-82,89],[-6,13],[45,17],[22,29],[47,39],[-5,24],[-39,26],[-15,22],[26,36],[58,16],[75,-15],[34,-48],[-6,-21],[-1,-8]],[[41355,5876],[38,-12],[40,28],[-6,26],[23,45],[33,-49],[219,-52],[71,-50],[-29,-12],[-22,2],[-64,-5],[-109,-43],[-117,41],[-209,29],[-63,22],[-49,68],[88,56],[21,-6],[135,-88]],[[40573,6151],[-32,-21],[-675,36],[-33,7],[9,43],[92,7],[52,8],[72,19],[53,33],[18,1],[317,-77],[111,-32],[13,-15],[3,-9]],[[30462,5944],[-60,-2],[-120,5],[-120,20],[-31,10],[-44,32],[-14,17],[-12,21],[-1,33],[32,114],[59,68],[56,39],[174,92],[23,10],[159,43],[62,23],[97,48],[534,186],[122,27],[55,-20],[31,-19],[-16,-22],[-72,-53],[-34,-32],[-87,-65],[-188,-109],[-133,-82],[-171,-113],[-40,-40],[-81,-95],[15,-42],[-27,-58],[-107,-28],[-61,-8]],[[33931,14945],[11,-8],[9,4],[9,8],[9,19],[33,27],[31,3],[-10,-28],[74,-50],[-6,-39],[14,-32],[-30,-10],[-24,-33],[21,-13],[12,-28],[-25,-7],[-54,17],[-28,-4],[3,26],[-9,10],[-33,-5],[-14,-57],[-10,-5],[-12,9],[9,37],[-14,6],[-14,-1],[-42,-27],[-12,-1],[-25,32],[79,42],[-33,21],[-7,26],[5,36],[-29,-5],[-28,-14],[-13,-2],[-11,12],[4,26],[23,43],[18,45],[36,22],[21,17],[28,8],[12,16],[26,1],[15,-37],[-1,-22],[-12,-24],[-6,-61]],[[34575,15452],[17,-15],[70,1],[16,-4],[14,-25],[9,-43],[-23,-17],[-121,10],[-44,22],[-22,-1],[-49,-24],[-21,-24],[-82,-32],[-23,12],[-11,34],[-1,14],[8,9],[4,9],[-1,11],[22,29],[95,44],[126,16],[17,-16],[0,-10]],[[33895,16179],[35,-16],[31,11],[17,-12],[12,-33],[-1,-12],[-47,5],[-43,-38],[-51,8],[-7,-31],[11,-17],[-14,-14],[-44,30],[-35,-11],[-11,-51],[-16,-10],[-8,-2],[-14,13],[-29,4],[-2,7],[-18,20],[-51,-22],[13,26],[68,69],[8,21],[79,40],[37,-9],[80,24]],[[32450,14706],[-27,-60],[40,1],[28,21],[29,9],[25,-30],[-52,-23],[-50,-40],[-20,-21],[-22,-9],[-28,3],[-28,-4],[-25,-39],[-26,-18],[-8,15],[-10,9],[-56,14],[-26,20],[-23,14],[-25,7],[13,35],[15,31],[85,42],[-8,13],[-6,17],[67,21],[2,21],[-4,24],[21,16],[20,24],[14,7],[42,-3],[29,-33],[-12,-33],[26,-51]],[[32687,14732],[-20,-23],[-16,-4],[-15,10],[-20,-35],[-40,11],[-16,9],[10,5],[7,15],[22,31],[38,79],[7,25],[-31,41],[-5,13],[7,24],[11,17],[26,19],[34,0],[17,-16],[0,-29],[58,-27],[-10,-56],[-22,-35],[-3,-42],[-33,-19],[-6,-13]],[[31114,12975],[-29,-37],[-23,-11],[-21,10],[-21,5],[-15,-14],[-16,-58],[-19,-29],[-20,-15],[-12,6],[-12,0],[-19,-13],[-24,-5],[-23,6],[-22,37],[-32,44],[-6,14],[-5,36],[1,37],[14,28],[73,98],[24,44],[21,50],[23,45],[44,80],[22,29],[111,84],[30,19],[33,-5],[8,-44],[-16,-22],[-53,-56],[-11,-79],[1,-29],[5,-8],[20,-10],[14,-11],[18,-24],[21,-14],[-45,-41],[-30,-21],[-21,-26],[-40,-25],[-17,-16],[26,-6],[38,-21],[10,-18],[-5,-14]],[[29526,11154],[43,-51],[-40,-40],[-142,-75],[-83,-29],[-84,-22],[-380,-69],[-27,0],[-26,9],[-15,15],[-25,57],[3,29],[34,27],[35,18],[60,16],[229,36],[23,12],[19,27],[6,31],[8,24],[15,11],[16,0],[30,-23],[55,-93],[18,13],[16,25],[3,80],[16,6],[49,-22],[30,-23],[1,45],[21,14],[22,-5],[22,-10],[48,-33]],[[29170,11677],[49,-14],[72,-63],[24,-32],[7,-19],[-6,-13],[-33,-15],[-25,-77],[-50,-27],[-116,17],[-128,31],[-10,6],[-11,27],[-2,31],[14,39],[22,20],[95,24],[7,14],[14,39],[24,8],[11,-3],[42,7]],[[29346,9735],[-40,-75],[-7,-8],[-40,-19],[14,-20],[11,-10],[7,-24],[23,-33],[28,-21],[-23,-59],[-34,-26],[-369,160],[-28,26],[-14,19],[-11,30],[-1,30],[9,24],[13,14],[33,17],[34,1],[75,-32],[10,5],[14,28],[40,1],[9,24],[-55,8],[-44,24],[-29,24],[-8,19],[99,33],[251,-42],[38,-14],[17,-19],[14,-26],[-36,-59]],[[24677,9687],[-51,-14],[-46,6],[17,132],[26,33],[-7,24],[-47,66],[-33,75],[16,17],[86,27],[99,-5],[39,-32],[12,-40],[-5,-29],[-32,-53],[33,-18],[7,-36],[-7,-44],[-32,-52],[-30,-31],[-45,-26]],[[96566,6830],[-34,-43],[-39,-19],[-123,16],[-86,-36],[-95,-13],[-45,19],[-20,35],[-10,47],[0,17],[27,7],[127,-33],[53,-29],[29,1],[76,38],[63,48],[16,23],[21,8],[27,-17],[13,-52],[0,-17]],[[78050,14010],[-121,-14],[-10,15],[-45,2],[-16,12],[-6,28],[15,47],[24,32],[37,33],[18,7],[76,11],[55,-15],[39,-40],[11,-32],[-6,-21],[-71,-65]],[[57460,11301],[-18,-22],[-51,4],[-39,-21],[-31,8],[-98,35],[-11,45],[-3,20],[8,35],[88,73],[35,7],[50,-10],[22,-21],[14,-41],[39,-83],[-5,-29]],[[48362,11202],[-73,-34],[-6,15],[-24,20],[-48,56],[54,4],[49,24],[27,-10],[6,-6],[15,-69]],[[49088,11213],[-45,-1],[-13,16],[-2,11],[58,83],[32,21],[62,16],[40,-5],[26,-18],[8,-33],[0,-49],[-15,-26],[-151,-15]],[[31618,5715],[-26,-2],[-14,4],[-14,12],[-12,46],[-137,37],[-16,21],[-9,46],[-23,18],[-178,82],[-15,17],[-10,25],[33,10],[70,-18],[127,-5],[28,-8],[26,-14],[142,-3],[72,-7],[40,-65],[81,-19],[11,-38],[10,-68],[-110,-50],[-25,-7],[-51,-14]],[[31316,6075],[-48,-28],[-202,13],[-69,9],[-39,15],[36,60],[27,20],[25,8],[56,33],[88,8],[67,-6],[113,-26],[-29,-25],[-19,-9],[-18,-38],[12,-34]],[[34676,16577],[-37,-16],[-13,22],[-7,37],[-19,23],[14,20],[199,-26],[-11,-13],[-96,-17],[-30,-30]],[[34480,15244],[-24,-26],[-61,39],[-16,25],[7,19],[98,17],[26,-9],[12,-40],[-42,-25]],[[34100,14650],[-24,-2],[-30,17],[-4,30],[0,16],[23,13],[14,2],[81,47],[36,12],[-16,-29],[2,-26],[-13,-23],[-69,-57]],[[34427,15507],[-55,-54],[-26,2],[-54,41],[-15,21],[-3,9],[34,37],[97,-14],[22,-4],[1,-3],[2,-21],[-3,-14]],[[34062,15087],[4,-10],[56,6],[15,-15],[-31,-20],[-8,4],[-27,-6],[-76,15],[-18,23],[67,13],[18,-10]],[[32778,11680],[-24,-4],[-24,53],[-13,82],[-77,119],[-20,62],[14,15],[21,5],[56,-17],[34,-23],[38,-49],[46,-44],[9,-37],[-7,-42],[-29,-11],[1,-31],[-17,-60],[-8,-18]],[[33159,15806],[14,-7],[121,13],[38,-40],[43,2],[-103,-75],[-28,22],[-9,16],[-7,36],[-67,-9],[-22,7],[-27,-24],[-55,-10],[-19,0],[-24,26],[-1,26],[49,-1],[38,33],[11,34],[19,-9],[29,-40]],[[30004,11694],[-60,-24],[-40,19],[-120,36],[-50,66],[5,35],[23,21],[36,11],[73,-22],[37,-23],[96,-119]],[[23603,9985],[-53,-3],[-15,13],[16,28],[128,47],[52,28],[8,-4],[7,-9],[22,-56],[2,-14],[-167,-30]],[[20961,9696],[-33,-26],[-62,6],[-48,43],[-19,58],[-2,20],[13,15],[31,14],[120,-130]],[[16792,9152],[-58,-6],[-18,1],[-18,13],[-5,9],[30,30],[29,13],[9,10],[-40,101],[37,3],[43,20],[83,-2],[72,-18],[13,-15],[9,-25],[-31,-51],[-19,-18],[-108,-45],[-28,-20]],[[14620,8857],[-42,-10],[-83,38],[-27,18],[-24,31],[-19,7],[-7,6],[-11,80],[25,9],[53,-11],[102,-42],[71,-12],[24,-32],[-24,-56],[-38,-26]],[[5002,3963],[-87,-13],[-206,26],[-54,21],[-30,22],[-56,20],[-14,11],[0,24],[-9,14],[-19,13],[-9,13],[-17,8],[277,-12],[108,-20],[20,-14],[195,-60],[-53,-9],[-46,-44]],[[5426,4844],[-29,-5],[-745,67],[-143,22],[-34,12],[-14,11],[-3,8],[6,22],[17,16],[185,25],[207,-19],[250,-48],[172,-38],[89,-34],[37,-26],[5,-13]],[[95548,8736],[-37,0],[-22,18],[-7,39],[1,13],[72,48],[58,12],[-31,-72],[-11,-12],[-23,-46]],[[95268,8313],[-50,-74],[-35,2],[-20,14],[36,41],[34,18],[21,5],[14,-6]],[[97178,9444],[-38,-12],[-51,37],[-12,12],[50,70],[-4,23],[7,19],[19,14],[12,-2],[29,-77],[20,-32],[-28,-31],[-4,-21]],[[95786,12937],[-24,-16],[-15,5],[-15,34],[16,53],[-6,69],[3,17],[39,-39],[7,-21],[16,-32],[3,-17],[-16,-32],[-8,-21]],[[95361,13351],[-5,-35],[-14,8],[-20,28],[-20,69],[18,7],[23,-12],[9,-34],[8,-18],[1,-13]],[[95169,13549],[-15,-27],[-13,3],[-58,69],[7,30],[-8,25],[1,23],[2,8],[71,-105],[13,-26]],[[76836,13804],[32,-15],[57,2],[20,-22],[4,-25],[-1,-14],[-23,-21],[-150,-14],[-24,22],[26,61],[28,20],[31,6]],[[77851,13700],[-37,-8],[-14,15],[-2,9],[27,33],[33,11],[-3,-39],[-4,-21]],[[77456,13554],[-26,-7],[-27,16],[-13,31],[-3,10],[42,8],[56,-30],[-29,-28]],[[78721,14144],[-17,-14],[-45,8],[-10,12],[-4,55],[-3,16],[-17,15],[-73,28],[-8,40],[10,18],[27,4],[67,-35],[15,-27],[-2,-41],[1,-13],[21,-27],[33,-28],[5,-11]],[[75722,13935],[-37,-8],[-38,8],[-19,27],[-4,12],[15,19],[54,3],[38,-17],[8,-17],[2,-8],[-19,-19]],[[73839,13275],[-48,-15],[-8,8],[-1,9],[-72,55],[-12,45],[7,31],[59,-3],[70,-27],[37,-69],[-32,-34]],[[74039,13382],[-32,-14],[-25,3],[-29,31],[12,21],[30,13],[38,-7],[10,-11],[26,-7],[-30,-29]],[[73702,13472],[-30,-18],[-24,3],[-16,19],[-3,12],[15,38],[12,-2],[8,-20],[38,-32]],[[69421,10415],[-35,-74],[-13,2],[-15,43],[13,27],[16,16],[28,-8],[6,-6]],[[69016,10195],[-14,0],[7,23],[37,41],[28,50],[17,8],[31,-44],[-7,-37],[-41,-27],[-58,-14]],[[70000,11156],[-20,0],[-25,6],[-32,42],[-18,30],[-7,31],[3,61],[16,30],[26,12],[11,-28],[4,-32],[8,-21],[33,-30],[16,-25],[5,-14],[6,-29],[-5,-20],[-21,-13]],[[63484,13373],[-46,-14],[-21,6],[-2,14],[-1,13],[2,15],[16,12],[78,1],[31,-10],[9,-7],[1,-21],[-3,-6],[-64,-3]],[[54506,11516],[-18,-37],[-87,51],[-51,16],[-13,9],[-12,32],[-3,12],[10,20],[28,32],[59,26],[93,13],[91,-10],[15,-16],[-86,-54],[-26,-94]],[[50843,11176],[-94,-15],[-21,17],[-11,34],[13,20],[123,68],[33,-6],[11,-6],[8,-26],[-11,-41],[-14,-20],[-37,-25]],[[49179,10821],[-30,-13],[-39,3],[-30,17],[-21,34],[-5,13],[3,22],[-2,11],[38,6],[14,-14],[6,-11],[66,-68]],[[50360,11373],[-24,-73],[-15,2],[-15,43],[-31,46],[-11,32],[-1,43],[22,25],[80,16],[27,-10],[13,-55],[-45,-69]],[[49296,11078],[30,-19],[47,3],[45,-15],[-7,-20],[-26,-26],[-22,-56],[-22,-26],[-66,-56],[-49,-15],[-11,31],[1,32],[4,25],[2,18],[-46,24],[-3,33],[-9,19],[-134,66],[-23,19],[10,12],[138,5],[81,-12],[60,-42]],[[51257,11244],[-45,-13],[-51,29],[-14,20],[-15,53],[-2,20],[12,13],[40,15],[66,-6],[25,-24],[9,-43],[-8,-37],[-17,-27]],[[44275,9281],[-13,-125],[4,-27],[11,-26],[49,-70],[4,-52],[-2,-20],[-20,-29],[-69,7],[-22,15],[-8,10],[-36,122],[-21,29],[-32,25],[-123,23],[-118,-8],[29,28],[178,39],[45,29],[28,34],[13,52],[31,65],[49,30],[31,3],[16,-53],[0,-50],[-24,-51]],[[45526,9977],[-19,-14],[-40,1],[-38,28],[-16,41],[-1,29],[17,33],[27,9],[15,-11],[36,-71],[19,-45]],[[46525,10268],[-22,-13],[-37,5],[-47,29],[-15,22],[-5,20],[13,29],[11,8],[24,-4],[42,-37],[29,-40],[7,-19]],[[41016,5948],[-48,-6],[-19,15],[23,38],[34,33],[63,3],[60,-22],[-6,-21],[-13,-2],[-94,-38]],[[34980,16532],[-12,-5],[-19,22],[-3,13],[20,26],[20,35],[7,4],[-5,-70],[-8,-25]],[[33656,15954],[-62,-26],[-32,27],[-7,10],[38,26],[20,-6],[8,-9],[23,-2],[12,-20]],[[33011,11534],[-42,-1],[-19,16],[-7,10],[5,23],[16,21],[49,-16],[12,-41],[-14,-12]],[[33151,12230],[-11,-16],[-35,10],[-20,11],[-34,28],[19,17],[37,-4],[30,-20],[14,-26]],[[33127,11111],[-23,0],[-20,12],[-17,35],[-5,17],[9,38],[16,9],[92,5],[28,-20],[1,-34],[-10,-25],[-71,-37]],[[33180,10914],[-28,-4],[-38,10],[-33,20],[-11,23],[16,19],[30,12],[47,-4],[22,-24],[5,-22],[-6,-23],[-4,-7]],[[33503,15872],[-38,-4],[-26,33],[-12,23],[51,2],[23,-9],[12,-26],[-10,-19]],[[33193,15571],[-14,-6],[-18,5],[0,-10],[15,-13],[-16,-5],[-19,13],[-14,27],[10,25],[19,6],[37,-42]],[[33152,15053],[-35,-20],[-21,6],[-33,24],[45,7],[4,70],[22,27],[43,-15],[-26,-37],[-9,-28],[9,-24],[1,-10]],[[32791,14932],[-26,-2],[7,31],[23,21],[38,14],[-24,-35],[-7,-16],[-11,-13]],[[32412,14480],[-44,-26],[-23,0],[27,64],[26,2],[41,36],[11,-5],[-22,-30],[-16,-41]],[[32607,15512],[-12,-2],[5,24],[31,62],[58,29],[-7,-25],[-19,-31],[-56,-57]],[[31709,13915],[-60,-22],[-31,8],[-2,23],[8,31],[29,16],[-5,46],[18,19],[9,35],[38,26],[54,-12],[-8,-45],[-1,-16],[-32,-12],[-8,-7],[-7,-30],[1,-43],[-3,-17]],[[31501,13709],[-62,-65],[-9,4],[-5,7],[1,11],[20,24],[4,70],[41,26],[16,-9],[-14,-30],[9,-26],[-1,-12]],[[31288,13309],[-13,-4],[-31,2],[-20,13],[26,41],[-3,28],[23,11],[26,-10],[18,-35],[3,-15],[-29,-31]],[[31292,12807],[-55,-11],[-41,12],[1,44],[-11,5],[-4,10],[52,33],[39,8],[47,-5],[20,-14],[7,-15],[-36,-36],[-6,-14],[-13,-17]],[[30084,11367],[14,-17],[60,16],[21,-17],[4,-12],[-27,-42],[-32,-28],[-37,-2],[-27,71],[-3,18],[27,13]],[[29478,9586],[-27,-11],[-17,6],[-31,29],[4,23],[14,15],[10,17],[60,62],[44,7],[36,-13],[-39,-59],[-10,-41],[-44,-35]],[[23945,9838],[-47,0],[-31,21],[-10,14],[19,21],[11,2],[57,-36],[12,-15],[-11,-7]],[[17572,9121],[-136,-16],[-37,18],[-10,22],[6,23],[277,125],[49,-17],[14,-8],[-83,-62],[-37,-22],[-6,-7],[20,-9],[6,-7],[-16,-17],[-47,-23]],[[13225,8961],[-44,-32],[-86,21],[7,23],[78,20],[53,-13],[-8,-19]],[[13592,8880],[-31,-12],[-116,29],[-68,6],[-31,17],[-20,15],[-6,14],[-32,22],[62,44],[49,14],[47,-3],[10,-22],[90,-26],[70,-1],[7,-24],[-3,-34],[-28,-39]],[[9003,7690],[3,-8],[-42,6],[-63,32],[-12,11],[28,11],[36,-10],[33,-20],[17,-22]],[[9656,8230],[-31,-3],[-53,14],[-140,46],[-30,23],[21,23],[50,16],[38,-5],[95,-43],[29,-31],[17,-23],[4,-17]],[[9276,7510],[-104,-25],[-27,7],[9,36],[-16,25],[-4,12],[9,17],[61,0],[172,-27],[23,-37],[-123,-8]],[[8723,7484],[-116,-7],[-64,15],[-16,44],[18,9],[148,-20],[54,-11],[20,-13],[-10,-12],[-34,-5]],[[8518,7651],[113,-8],[74,6],[77,-14],[18,-16],[-14,-13],[-83,-4],[-40,-22],[-47,-3],[-71,16],[-64,35],[37,23]],[[8550,7294],[81,-29],[-142,9],[-62,41],[40,15],[40,-3],[35,-21],[8,-12]],[[8269,7617],[-118,-8],[-48,16],[-12,15],[10,13],[183,13],[20,-16],[6,-10],[-41,-23]],[[9253,7922],[-57,-8],[-71,36],[-54,29],[-18,25],[-3,8],[0,10],[16,6],[115,-21],[72,-85]],[[9225,7699],[-33,-46],[-87,24],[-37,30],[21,39],[40,12],[52,-14],[19,-5],[25,-40]],[[8223,7275],[-22,-2],[-241,44],[-47,13],[82,27],[54,4],[146,-66],[39,-8],[-11,-12]],[[7241,5741],[-51,-2],[-65,6],[-50,14],[-114,20],[-29,38],[-134,31],[-62,10],[21,37],[142,-49],[175,-49],[141,-30],[26,-26]],[[8547,7418],[-17,-9],[-121,5],[-25,8],[-11,9],[-168,13],[-76,41],[-15,13],[30,20],[57,12],[23,16],[145,14],[23,-8],[13,-22],[66,-43],[17,-27],[7,-18],[36,-8],[16,-16]],[[6115,4547],[-25,-4],[-22,31],[-108,63],[-64,42],[-42,33],[-18,23],[21,0],[158,-70],[24,-27],[118,-48],[-42,-43]],[[32497,62251],[-1,-14],[-3,-15],[-18,13],[-10,13],[0,3]]],"bbox":[-180,-89.999,180,83.599609375],"transform":{"scale":[0.0036000360003600037,0.001736003453784538],"translate":[-180,-89.999]}} diff --git a/assets/map_tile_128_google_hybrid.png b/assets/map_tile_128_google_hybrid.png new file mode 100644 index 0000000..6fa23f9 Binary files /dev/null and b/assets/map_tile_128_google_hybrid.png differ diff --git a/assets/map_tile_128_google_normal.png b/assets/map_tile_128_google_normal.png new file mode 100644 index 0000000..59a2852 Binary files /dev/null and b/assets/map_tile_128_google_normal.png differ diff --git a/assets/map_tile_128_google_terrain.png b/assets/map_tile_128_google_terrain.png new file mode 100644 index 0000000..b7d50ad Binary files /dev/null and b/assets/map_tile_128_google_terrain.png differ diff --git a/assets/map_tile_128_opentopomap.png b/assets/map_tile_128_opentopomap.png new file mode 100644 index 0000000..71f8c21 Binary files /dev/null and b/assets/map_tile_128_opentopomap.png differ diff --git a/assets/map_tile_128_osm_hot.png b/assets/map_tile_128_osm_hot.png new file mode 100644 index 0000000..0e59475 Binary files /dev/null and b/assets/map_tile_128_osm_hot.png differ diff --git a/assets/map_tile_128_osm_liberty.png b/assets/map_tile_128_osm_liberty.png new file mode 100644 index 0000000..8d91644 Binary files /dev/null and b/assets/map_tile_128_osm_liberty.png differ diff --git a/assets/map_tile_128_stamen_watercolor.png b/assets/map_tile_128_stamen_watercolor.png new file mode 100644 index 0000000..b064c7e Binary files /dev/null and b/assets/map_tile_128_stamen_watercolor.png differ diff --git a/assets/terms.md b/assets/terms.md new file mode 100644 index 0000000..dee3479 --- /dev/null +++ b/assets/terms.md @@ -0,0 +1,25 @@ +## Terms of Service + +“Aves Gallery” is an open-source gallery and metadata explorer app allowing you to access and manage your local photos and videos. + +The app is designed for legal, authorized and acceptable purposes. + +## Disclaimer + +The app is released “as-is”, without any warranty, responsibility or liability. Use of the app is at your own risk. + +## Privacy Policy + +The app does not collect any personal data. We never have access to your photos and videos. This also means that we cannot get them back for you if you delete them without backing them up. + +__Optionally, with your consent, the app accesses the inventory of installed apps__ to improve album display. + +__Optionally, with your consent, the app collects anonymous error and diagnostic data__ to improve the app quality. We use Firebase Crashlytics, and the anonymous data are stored on their servers. Please note that those are anonymous data, there is absolutely nothing personal about those data. + +## Contact + +Developer: Thibault Deckers + +Email: [gallery.aves@gmail.com](mailto:gallery.aves@gmail.com) + +Website: [https://github.com/deckerst/aves](https://github.com/deckerst/aves) diff --git a/assets/terms.txt b/assets/terms.txt new file mode 100644 index 0000000..dc24a33 --- /dev/null +++ b/assets/terms.txt @@ -0,0 +1,35 @@ +Terms of Service +================ + +“Aves Gallery” is an open-source gallery and metadata explorer app allowing you to access and manage your local photos and videos. + +The app is designed for legal, authorized and acceptable purposes. + + + +Disclaimer +========== + +The app is released “as-is”, without any warranty, responsibility or liability. Use of the app is at your own risk. + + + +Privacy Policy +============== + +The app does not collect any personal data. We never have access to your photos and videos. This also means that we cannot get them back for you if you delete them without backing them up. + +Optionally, with your consent, the app accesses the inventory of installed apps to improve album display. + +Optionally, with your consent, the app collects anonymous error and diagnostic data to improve the app quality. We use Firebase Crashlytics, and the anonymous data are stored on their servers. Please note that those are anonymous data, there is absolutely nothing personal about those data. + + + +Contact +======= + +Developer: Thibault Deckers + +Email: gallery.aves@gmail.com + +Website: https://github.com/deckerst/aves diff --git a/aves_logo.svg b/aves_logo.svg new file mode 100644 index 0000000..327ddbe --- /dev/null +++ b/aves_logo.svg @@ -0,0 +1 @@ +<svg width="100" height="100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m29.04 62.547 16.498 16.497a2.916 2.916 0 0 1 0 4.125l-7.887 7.887a15.094 15.094 0 0 1-21.345 0l-7.887-7.887a2.916 2.916 0 0 1 0-4.124l16.497-16.498a2.916 2.916 0 0 1 4.125 0z" style="fill:#ef435a;fill-opacity:1;fill-rule:evenodd;stroke:#000;stroke-width:3.0565;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"/><path style="fill:#e0e0e0;fill-rule:evenodd;stroke:#000;stroke-width:3.05648;stroke-linecap:round;stroke-linejoin:round" d="m53.669 37.917 16.498 16.498a2.91 2.91 0 0 1 0 4.123L53.669 75.036a2.91 2.91 0 0 1-4.124 0L33.047 58.538a2.91 2.91 0 0 1 0-4.123l16.498-16.498a2.91 2.91 0 0 1 4.124 0z"/><path style="fill:#ffc11f;fill-opacity:1;fill-rule:evenodd;stroke:#000;stroke-width:3.05648;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" d="M57.678 29.784a2.916 2.916 0 0 0 0 4.124l16.498 16.497a2.916 2.916 0 0 0 4.124 0l16.497-16.497a2.916 2.916 0 0 0 0-4.124l-8.188-8.189a14.667 14.667 0 0 0-20.742 0zm16.284-.213a3.219 3.219 0 0 1 4.55 0 3.219 3.219 0 0 1 0 4.55 3.219 3.219 0 0 1-4.55 0 3.219 3.219 0 0 1 0-4.551z"/><path d="M21.548 5.792 45.636 29.88a2.916 2.916 0 0 1 0 4.124L29.138 50.501a2.916 2.916 0 0 1-4.124 0l-10.7-10.7a22.78 22.78 0 0 1 0-32.215l1.792-1.794a3.848 3.848 0 0 1 5.442 0z" style="fill:#1cc8eb;fill-opacity:1;fill-rule:evenodd;stroke:#000;stroke-width:3.0565;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"/></svg> \ No newline at end of file diff --git a/avesbuild.sh b/avesbuild.sh new file mode 100644 index 0000000..dfecaaf --- /dev/null +++ b/avesbuild.sh @@ -0,0 +1 @@ +fvm flutter build apk --debug -t lib/main_play.dart --flavor play diff --git a/before.sha1 b/before.sha1 new file mode 100644 index 0000000..2b462a6 --- /dev/null +++ b/before.sha1 @@ -0,0 +1 @@ +d293b0e55340b249a24532d2dd61a6ebcfb328fb metadata.db diff --git a/build_log.txt b/build_log.txt new file mode 100644 index 0000000..4e4e1ce --- /dev/null +++ b/build_log.txt @@ -0,0 +1,7661 @@ +[ +44 ms] executing: sysctl hw.optional.arm64 +[ +6 ms] Exit code 1 from: sysctl hw.optional.arm64 +[ ] sysctl: unknown oid 'hw.optional.arm64' +[ +10 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update. +[ ] Artifact Instance of 'GradleWrapper' is not required, skipping update. +[ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ +2 ms] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ ] Artifact Instance of 'FlutterSdk' is not required, skipping update. +[ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'PubDependencies' is not required, skipping update. +[ +44 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update. +[ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ +2 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ +57 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update. +[ ] Artifact Instance of 'GradleWrapper' is not required, skipping update. +[ +2 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update. +[ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ ] Artifact Instance of 'FlutterSdk' is not required, skipping update. +[ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'PubDependencies' is not required, skipping update. +[ +84 ms] executing: [/Volumes/terrain/aves_mio54/] /Users/fabio/fvm/versions/3.35.7/bin/cache/dart-sdk/bin/dart pub --suppress-analytics --directory . get --example +Resolving dependencies... +Downloading packages... + _fe_analyzer_shared 85.0.0 (100.0.0 available) + analyzer 7.7.1 (13.0.0 available) + characters 1.4.0 (1.4.1 available) + csv 6.0.0 (8.0.0 available) + dchs_motion_sensors 2.0.1 (2.0.2 available) + device_info_plus 12.4.0 (13.1.0 available) + device_info_plus_platform_interface 7.0.3 (8.1.0 available) + flex_color_picker 3.7.2 (3.8.0 available) + flex_seed_scheme 3.6.1 (4.0.1 available) + flutter_secure_storage 9.2.4 (10.1.0 available) + flutter_secure_storage_linux 1.2.3 (3.0.0 available) + flutter_secure_storage_macos 3.1.3 (4.0.0 available) + flutter_secure_storage_platform_interface 1.1.2 (2.0.1 available) + flutter_secure_storage_web 1.2.1 (2.1.1 available) + flutter_secure_storage_windows 3.1.2 (4.1.0 available) + google_maps_flutter 2.14.2 (2.17.0 available) + google_maps_flutter_ios 2.17.4 (2.18.1 available) + google_maps_flutter_web 0.5.14+3 (0.6.2+1 available) + idb_shim 2.6.7+1 (2.9.1 available) + js 0.6.7 (0.7.2 available) + latlong2 0.9.1 (0.10.1 available) + local_auth_darwin 2.0.1 (2.0.3 available) + matcher 0.12.17 (0.12.20 available) + material_color_utilities 0.11.1 (0.13.0 available) + meta 1.16.0 (1.18.2 available) + network_info_plus 7.0.0 (8.1.0 available) + network_info_plus_platform_interface 2.0.2 (3.1.0 available) + package_info_plus 9.0.1 (10.1.0 available) + package_info_plus_platform_interface 3.2.1 (4.1.0 available) + palette_generator 0.3.3+7 (discontinued) + path_provider_foundation 2.5.1 (2.6.0 available) + pin_code_fields 8.0.1 (9.3.0 available) + protobuf 3.1.0 (6.0.0 available) + sembast 3.8.5+2 (3.8.6 available) +! shared_preferences_android 2.4.18 (overridden) (2.4.23 available) + sqflite 2.4.2 (2.4.2+1 available) + sqflite_android 2.4.2+2 (2.4.2+3 available) + sqflite_common 2.5.6 (2.5.7 available) + synchronized 3.4.0 (3.4.0+1 available) + test 1.26.2 (1.31.1 available) + test_api 0.7.6 (0.7.12 available) + test_core 0.6.11 (0.6.18 available) + url_launcher_ios 6.3.6 (6.4.1 available) + url_launcher_web 2.4.1 (2.4.3 available) + vector_map_tiles 9.0.0-beta.8 (10.0.0-beta.2 available) + vector_math 2.2.0 (2.3.0 available) + vector_tile 2.0.1 (4.0.0 available) + video_player 2.10.1 (2.11.1 available) + video_player_avfoundation 2.8.9 (2.9.4 available) + wakelock_plus 1.4.0 (1.6.0 available) + wakelock_plus_platform_interface 1.3.0 (1.5.0 available) + win32 5.15.0 (6.1.0 available) + win32_registry 2.1.0 (3.0.3 available) + xml 6.6.1 (7.0.1 available) +Got dependencies! +1 package is discontinued. +53 packages have newer versions incompatible with dependency constraints. +Try `flutter pub outdated` for more information. +[+2598 ms] Found plugin volume_controller at /Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/ +[ +8 ms] Found plugin video_player at /Users/fabio/.pub-cache/hosted/pub.dev/video_player-2.10.1/ +[ +1 ms] Found plugin video_player_web at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_web-2.4.0/ +[ +4 ms] Found plugin video_player_avfoundation at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.8.9/ +[ +2 ms] Found plugin video_player_android at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_android-2.9.5/ +[ +27 ms] Found plugin path_provider at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider-2.1.5/ +[ +2 ms] Found plugin path_provider_windows at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/ +[ +5 ms] Found plugin path_provider_linux at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/ +[ +3 ms] Found plugin path_provider_foundation at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_foundation-2.5.1/ +[ +2 ms] Found plugin path_provider_android at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/ +[ +2 ms] Found plugin jni_flutter at /Users/fabio/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/ +[ +2 ms] Found plugin jni at /Users/fabio/.pub-cache/hosted/pub.dev/jni-1.0.0/ +[ +19 ms] Found plugin url_launcher at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher-6.3.2/ +[ +1 ms] Found plugin url_launcher_windows at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.5/ +[ +3 ms] Found plugin url_launcher_web at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_web-2.4.1/ +[ +1 ms] Found plugin url_launcher_macos at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.5/ +[ +2 ms] Found plugin url_launcher_linux at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.2/ +[ +1 ms] Found plugin url_launcher_ios at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.6/ +[ +1 ms] Found plugin url_launcher_android at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.29/ +[ +1 ms] Found plugin streams_channel at /Users/fabio/.pub-cache/git/aves_streams_channel-35a9b0fcc0e97f756756c0010fb223129c2d832c/ +[ +2 ms] Found plugin sqflite at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite-2.4.2/ +[ +5 ms] Found plugin sqflite_darwin at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/ +[ +1 ms] Found plugin sqflite_android at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+2/ +[ +2 ms] Found plugin shared_preferences at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences-2.5.5/ +[ +1 ms] Found plugin shared_preferences_windows at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/ +[ +1 ms] Found plugin shared_preferences_web at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3/ +[ +1 ms] Found plugin shared_preferences_linux at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/ +[ +1 ms] Found plugin shared_preferences_foundation at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/ +[ +1 ms] Found plugin shared_preferences_android at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.18/ +[ +1 ms] Found plugin screen_brightness at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness-2.1.7/ +[ +1 ms] Found plugin screen_brightness_windows at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_windows-2.1.0/ +[ +2 ms] Found plugin screen_brightness_ohos at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_ohos-2.1.2/ +[ +1 ms] Found plugin screen_brightness_macos at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_macos-2.1.1/ +[ +1 ms] Found plugin screen_brightness_ios at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_ios-2.1.2/ +[ +1 ms] Found plugin screen_brightness_android at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/ +[ +4 ms] Found plugin printing at /Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/ +[ +8 ms] Found plugin permission_handler at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler-12.0.1/ +[ +1 ms] Found plugin permission_handler_windows at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_windows-0.2.1/ +[ +2 ms] Found plugin permission_handler_html at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_html-0.1.3+5/ +[ +1 ms] Found plugin permission_handler_apple at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_apple-9.4.7/ +[ ] Found plugin permission_handler_android at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_android-13.0.1/ +[ +4 ms] Found plugin dchs_motion_sensors at /Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/ +[ +2 ms] Found plugin package_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/ +[ +5 ms] Found plugin network_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/ +[ +7 ms] Found plugin local_auth at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth-3.0.1/ +[ +1 ms] Found plugin local_auth_windows at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_windows-2.0.1/ +[ +1 ms] Found plugin local_auth_darwin at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_darwin-2.0.1/ +[ +1 ms] Found plugin local_auth_android at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_android-2.0.8/ +[ +1 ms] Found plugin flutter_plugin_android_lifecycle at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.34/ +[ +2 ms] Found plugin google_cast at /Volumes/terrain/aves_mio54/plugins/google_cast/ +[ +3 ms] Found plugin flutter_secure_storage at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/ +[ +2 ms] Found plugin flutter_secure_storage_windows at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_windows-3.1.2/ +[ +2 ms] Found plugin flutter_secure_storage_web at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_web-1.2.1/ +[ +1 ms] Found plugin flutter_secure_storage_macos at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_macos-3.1.3/ +[ +1 ms] Found plugin flutter_secure_storage_linux at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_linux-1.2.3/ +[ +4 ms] Found plugin flutter_displaymode at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_displaymode-0.7.0/ +[ +1 ms] Found plugin floating at /Users/fabio/.pub-cache/hosted/pub.dev/floating-6.0.0/ +[ +7 ms] Found plugin dynamic_color at /Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/ +[ +2 ms] Found plugin device_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/ +[ +5 ms] Found plugin connectivity_plus at /Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/ +[ +5 ms] Found plugin media_kit_video at /Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/ +[ +1 ms] Found plugin wakelock_plus at /Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/ +[ +5 ms] Found plugin media_kit_libs_android_video at /Users/fabio/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8/ +[ +5 ms] Found plugin google_maps_flutter_android at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_android-2.19.8/ +[ ] Found plugin google_maps_flutter at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter-2.14.2/ +[ +1 ms] Found plugin google_maps_flutter_web at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_web-0.5.14+3/ +[ +2 ms] Found plugin google_maps_flutter_ios at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_ios-2.17.4/ +[ ] Found plugin google_api_availability at /Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability-5.0.1/ +[ +1 ms] Found plugin google_api_availability_android at /Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability_android-1.1.1/ +[ +3 ms] Found plugin aves_screen_state at /Volumes/terrain/aves_mio54/plugins/aves_screen_state/ +[ +1 ms] Found plugin firebase_crashlytics at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_crashlytics-5.2.0/ +[ +1 ms] Found plugin firebase_core at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/ +[ ] Found plugin firebase_core_web at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_core_web-3.6.0/ +[ +77 ms] Found plugin volume_controller at /Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/ +[ ] Found plugin video_player at /Users/fabio/.pub-cache/hosted/pub.dev/video_player-2.10.1/ +[ ] Found plugin video_player_web at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_web-2.4.0/ +[ +1 ms] Found plugin video_player_avfoundation at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.8.9/ +[ ] Found plugin video_player_android at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_android-2.9.5/ +[ +8 ms] Found plugin path_provider at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider-2.1.5/ +[ ] Found plugin path_provider_windows at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/ +[ +1 ms] Found plugin path_provider_linux at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/ +[ +1 ms] Found plugin path_provider_foundation at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_foundation-2.5.1/ +[ ] Found plugin path_provider_android at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/ +[ ] Found plugin jni_flutter at /Users/fabio/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/ +[ +1 ms] Found plugin jni at /Users/fabio/.pub-cache/hosted/pub.dev/jni-1.0.0/ +[ +8 ms] Found plugin url_launcher at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher-6.3.2/ +[ ] Found plugin url_launcher_windows at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.5/ +[ +1 ms] Found plugin url_launcher_web at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_web-2.4.1/ +[ ] Found plugin url_launcher_macos at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.5/ +[ ] Found plugin url_launcher_linux at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.2/ +[ ] Found plugin url_launcher_ios at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.6/ +[ ] Found plugin url_launcher_android at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.29/ +[ ] Found plugin streams_channel at /Users/fabio/.pub-cache/git/aves_streams_channel-35a9b0fcc0e97f756756c0010fb223129c2d832c/ +[ ] Found plugin sqflite at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite-2.4.2/ +[ +1 ms] Found plugin sqflite_darwin at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/ +[ ] Found plugin sqflite_android at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+2/ +[ +1 ms] Found plugin shared_preferences at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences-2.5.5/ +[ ] Found plugin shared_preferences_windows at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/ +[ ] Found plugin shared_preferences_web at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3/ +[ ] Found plugin shared_preferences_linux at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/ +[ ] Found plugin shared_preferences_foundation at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/ +[ ] Found plugin shared_preferences_android at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.18/ +[ ] Found plugin screen_brightness at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness-2.1.7/ +[ ] Found plugin screen_brightness_windows at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_windows-2.1.0/ +[ +1 ms] Found plugin screen_brightness_ohos at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_ohos-2.1.2/ +[ ] Found plugin screen_brightness_macos at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_macos-2.1.1/ +[ ] Found plugin screen_brightness_ios at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_ios-2.1.2/ +[ ] Found plugin screen_brightness_android at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/ +[ +1 ms] Found plugin printing at /Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/ +[ +4 ms] Found plugin permission_handler at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler-12.0.1/ +[ ] Found plugin permission_handler_windows at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_windows-0.2.1/ +[ +1 ms] Found plugin permission_handler_html at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_html-0.1.3+5/ +[ ] Found plugin permission_handler_apple at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_apple-9.4.7/ +[ ] Found plugin permission_handler_android at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_android-13.0.1/ +[ +2 ms] Found plugin dchs_motion_sensors at /Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/ +[ +1 ms] Found plugin package_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/ +[ +3 ms] Found plugin network_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/ +[ +4 ms] Found plugin local_auth at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth-3.0.1/ +[ ] Found plugin local_auth_windows at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_windows-2.0.1/ +[ +1 ms] Found plugin local_auth_darwin at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_darwin-2.0.1/ +[ ] Found plugin local_auth_android at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_android-2.0.8/ +[ ] Found plugin flutter_plugin_android_lifecycle at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.34/ +[ +1 ms] Found plugin google_cast at /Volumes/terrain/aves_mio54/plugins/google_cast/ +[ +1 ms] Found plugin flutter_secure_storage at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/ +[ ] Found plugin flutter_secure_storage_windows at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_windows-3.1.2/ +[ +1 ms] Found plugin flutter_secure_storage_web at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_web-1.2.1/ +[ ] Found plugin flutter_secure_storage_macos at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_macos-3.1.3/ +[ +1 ms] Found plugin flutter_secure_storage_linux at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_linux-1.2.3/ +[ +4 ms] Found plugin flutter_displaymode at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_displaymode-0.7.0/ +[ +1 ms] Found plugin floating at /Users/fabio/.pub-cache/hosted/pub.dev/floating-6.0.0/ +[ +3 ms] Found plugin dynamic_color at /Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/ +[ +1 ms] Found plugin device_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/ +[ +3 ms] Found plugin connectivity_plus at /Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/ +[ +4 ms] Found plugin media_kit_video at /Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/ +[ +1 ms] Found plugin wakelock_plus at /Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/ +[ +3 ms] Found plugin media_kit_libs_android_video at /Users/fabio/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8/ +[ +4 ms] Found plugin google_maps_flutter_android at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_android-2.19.8/ +[ ] Found plugin google_maps_flutter at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter-2.14.2/ +[ ] Found plugin google_maps_flutter_web at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_web-0.5.14+3/ +[ +1 ms] Found plugin google_maps_flutter_ios at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_ios-2.17.4/ +[ ] Found plugin google_api_availability at /Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability-5.0.1/ +[ +1 ms] Found plugin google_api_availability_android at /Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability_android-1.1.1/ +[ +2 ms] Found plugin aves_screen_state at /Volumes/terrain/aves_mio54/plugins/aves_screen_state/ +[ +1 ms] Found plugin firebase_crashlytics at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_crashlytics-5.2.0/ +[ +1 ms] Found plugin firebase_core at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/ +[ ] Found plugin firebase_core_web at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_core_web-3.6.0/ +[ +30 ms] Generating /Volumes/terrain/aves_mio54/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java +[ +15 ms] Skipping generating GeneratedPluginRegistrant.java because it is up-to-date. +[ +243 ms] executing: /usr/bin/plutil -convert xml1 -o - /Applications/Android Studio.app/Contents/Info.plist +[ +16 ms] Exit code 0 from: /usr/bin/plutil -convert xml1 -o - /Applications/Android Studio.app/Contents/Info.plist +[ ] <?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> + <plist version="1.0"> + <dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleDocumentTypes</key> + <array> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>ipr</string> + </array> + <key>CFBundleTypeIconFile</key> + <string>studio.icns</string> + <key>CFBundleTypeName</key> + <string>Android Studio Project File</string> + <key>CFBundleTypeRole</key> + <string>Editor</string> + </dict> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>*</string> + </array> + <key>CFBundleTypeName</key> + <string>All documents</string> + <key>CFBundleTypeOSTypes</key> + <array> + <string>****</string> + </array> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>LSTypeIsPackage</key> + <false/> + </dict> + </array> + <key>CFBundleExecutable</key> + <string>studio</string> + <key>CFBundleGetInfoString</key> + <string>Android Studio 2024.3, build AI-243.26053.27.2432.13536105. Copyright JetBrains s.r.o., (c) 2000-2025</string> + <key>CFBundleIconFile</key> + <string>studio.icns</string> + <key>CFBundleIdentifier</key> + <string>com.google.android.studio</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>Android Studio</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>2024.3</string> + <key>CFBundleURLTypes</key> + <array> + <dict> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>CFBundleURLName</key> + <string>Stacktrace</string> + <key>CFBundleURLSchemes</key> + <array> + <string>idea</string> + </array> + </dict> + </array> + <key>CFBundleVersion</key> + <string>AI-243.26053.27.2432.13536105</string> + <key>LSApplicationCategoryType</key> + <string>public.app-category.developer-tools</string> + <key>LSArchitecturePriority</key> + <array> + <string>x86_64</string> + </array> + <key>LSMinimumSystemVersion</key> + <string>10.13</string> + <key>LSRequiresNativeExecution</key> + <string>YES</string> + <key>NSAppleEventsUsageDescription</key> + <string>An application in Android Studio requests the ability to send Apple events.</string> + <key>NSBluetoothAlwaysUsageDescription</key> + <string>An application in Android Studio requests access to Bluetooth.</string> + <key>NSCameraUsageDescription</key> + <string>An application in Android Studio requests access to the device's camera.</string> + <key>NSDesktopFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Desktop folder.</string> + <key>NSDocumentsFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Documents folder.</string> + <key>NSDownloadsFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Downloads folder.</string> + <key>NSHighResolutionCapable</key> + <true/> + <key>NSLocalNetworkUsageDescription</key> + <string>Android Studio's features, such as SSH and database connectivity, require permissions for accessing the local network and sending broadcast requests.</string> + <key>NSLocationUsageDescription</key> + <string>An application in Android Studio requests access to the user's location information.</string> + <key>NSMicrophoneUsageDescription</key> + <string>An application in Android Studio requests access to the device's microphone.</string> + <key>NSNetworkVolumesUsageDescription</key> + <string>An application in Android Studio requests access to files on a network volume.</string> + <key>NSRemovableVolumesUsageDescription</key> + <string>An application in Android Studio requests access to files on a removable volume.</string> + <key>NSSupportsAutomaticGraphicsSwitching</key> + <true/> + </dict> + </plist> +[ +10 ms] executing: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java -version +[ +103 ms] Exit code 0 from: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java -version +[ ] openjdk version "21.0.6" 2025-01-21 + OpenJDK Runtime Environment (build 21.0.6+-13368085-b895.109) + OpenJDK 64-Bit Server VM (build 21.0.6+-13368085-b895.109, mixed mode) +[ +1 ms] executing: /usr/bin/plutil -convert xml1 -o - /Volumes/MacHD/Applications/Android Studio.app/Contents/Info.plist +[ +14 ms] Exit code 0 from: /usr/bin/plutil -convert xml1 -o - /Volumes/MacHD/Applications/Android Studio.app/Contents/Info.plist +[ ] <?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> + <plist version="1.0"> + <dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleDocumentTypes</key> + <array> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>ipr</string> + </array> + <key>CFBundleTypeIconFile</key> + <string>studio.icns</string> + <key>CFBundleTypeName</key> + <string>Android Studio Project File</string> + <key>CFBundleTypeRole</key> + <string>Editor</string> + </dict> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>*</string> + </array> + <key>CFBundleTypeName</key> + <string>All documents</string> + <key>CFBundleTypeOSTypes</key> + <array> + <string>****</string> + </array> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>LSTypeIsPackage</key> + <false/> + </dict> + </array> + <key>CFBundleExecutable</key> + <string>studio</string> + <key>CFBundleGetInfoString</key> + <string>Android Studio 4.1, build AI-201.8743.12.41.6858069. Copyright JetBrains s.r.o., (c) 2000-2020</string> + <key>CFBundleIconFile</key> + <string>studio.icns</string> + <key>CFBundleIdentifier</key> + <string>com.google.android.studio</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>Android Studio</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>4.1</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleURLTypes</key> + <array> + <dict> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>CFBundleURLName</key> + <string>Stacktrace</string> + <key>CFBundleURLSchemes</key> + <array> + <string>idea</string> + </array> + </dict> + </array> + <key>CFBundleVersion</key> + <string>AI-201.8743.12.41.6858069</string> + <key>JVMOptions</key> + <dict> + <key>ClassPath</key> + <string>$APP_PACKAGE/Contents/lib/bootstrap.jar:$APP_PACKAGE/Contents/lib/extensions.jar:$APP_PACKAGE/Contents/lib/util.jar:$APP_PACKAGE/Contents/lib/jdom.jar:$APP_PACKAGE/Contents/lib/log4j.jar:$APP_PACKAGE/Contents/lib/trove4j.jar:$APP_PACKAGE/Contents/lib/jna.jar</string> + <key>JVMVersion</key> + <string>1.8*,1.8+</string> + <key>MainClass</key> + <string>com.intellij.idea.Main</string> + <key>Properties</key> + <dict> + <key>idea.executable</key> + <string>studio</string> + <key>idea.home.path</key> + <string>$APP_PACKAGE/Contents</string> + <key>idea.paths.selector</key> + <string>AndroidStudio4.1</string> + <key>idea.platform.prefix</key> + <string>AndroidStudio</string> + <key>idea.vendor.name</key> + <string>Google</string> + </dict> + </dict> + <key>LSApplicationCategoryType</key> + <string>public.app-category.developer-tools</string> + <key>LSArchitecturePriority</key> + <array> + <string>x86_64</string> + </array> + <key>LSMinimumSystemVersion</key> + <string>10.8</string> + <key>LSRequiresNativeExecution</key> + <string>YES</string> + <key>NSCameraUsageDescription</key> + <string>An application in Android Studio requests access to the device's camera.</string> + <key>NSDesktopFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Desktop folder.</string> + <key>NSDocumentsFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Documents folder.</string> + <key>NSDownloadsFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Downloads folder.</string> + <key>NSHighResolutionCapable</key> + <true/> + <key>NSLocationUsageDescription</key> + <string>An application in Android Studio requests access to the user's location information.</string> + <key>NSMicrophoneUsageDescription</key> + <string>An application in Android Studio requests access to the device's microphone.</string> + <key>NSNetworkVolumesUsageDescription</key> + <string>An application in Android Studio requests access to files on a network volume.</string> + <key>NSRemovableVolumesUsageDescription</key> + <string>An application in Android Studio requests access to files on a removable volume.</string> + <key>NSSupportsAutomaticGraphicsSwitching</key> + <true/> + </dict> + </plist> +[ +5 ms] executing: /Volumes/MacHD/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java -version +[ +212 ms] Exit code 0 from: /Volumes/MacHD/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java -version +[ ] openjdk version "1.8.0_242-release" + OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593) + OpenJDK 64-Bit Server VM (build 25.242-b3-6222593, mixed mode) +[ +15 ms] Top-level Gradle build file not found, skipping migration of task "clean". +[ +3 ms] executing: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java --version +[ +94 ms] Exit code 0 from: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java --version +[ ] openjdk 21.0.6 2025-01-21 + OpenJDK Runtime Environment (build 21.0.6+-13368085-b895.109) + OpenJDK 64-Bit Server VM (build 21.0.6+-13368085-b895.109, mixed mode) +[ +2 ms] Version of Java is different than impacted version, no migration attempted. +[ +13 ms] CMake project not found, skipping support Android 15 16k page size migration. +[ +4 ms] Using gradle from /Volumes/terrain/aves_mio54/android/gradlew. +[ +70 ms] LocalFile: '/Volumes/terrain/aves_mio54/android/build.gradle.kts' doesn't provide an AGP version. Checking settings. +[ +10 ms] LocalFile: '/Volumes/terrain/aves_mio54/android/settings.gradle.kts' provides AGP version: 8.13.2 +[ +21 ms] Running Gradle task 'assemblePlayDebug'... +[ +1 ms] executing: [/Volumes/terrain/aves_mio54/android/] /Volumes/terrain/aves_mio54/android/gradlew --full-stacktrace --info -Pverbose=true -Ptarget-platform=android-arm,android-arm64,android-x64 -Ptarget=lib/main_play.dart -Pbase-application-name=android.app.Application -Pdart-defines=RkxVVFRFUl9BUFBfRkxBVk9SPXBsYXk=,RkxVVFRFUl9WRVJTSU9OPTMuMzUuNw==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049YWRjOTAxMDYyNQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDM1MzE2NTY1YQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My45LjI= -Pdart-obfuscation=false -Ptrack-widget-creation=true -Ptree-shake-icons=false assemblePlayDebug +[ +778 ms] Initialized native services in: /Users/fabio/.gradle/native +[ ] Initialized jansi services in: /Users/fabio/.gradle/native +[ +120 ms] Welcome to Gradle 8.14.4! +[ ] Here are the highlights of this release: +[ ] - Java 24 support +[ ] - GraalVM Native Image toolchain selection +[ ] - Enhancements to test reporting +[ ] - Build Authoring improvements +[ ] For more details see https://docs.gradle.org/8.14.4/release-notes.html +[ +201 ms] The client will now receive all logging from the daemon (pid: 27645). The daemon log file: /Users/fabio/.gradle/daemon/8.14.4/daemon-27645.out.log +[ ] Starting 3rd build in daemon [uptime: 24 mins 38.561 secs, performance: 100%, GC rate: 0.00/s, heap usage: 0% of 8 GiB, non-heap usage: 8% of 4 GiB] +[ ] Using 4 worker leases. +[ ] Now considering [/Volumes/terrain/aves_mio54/android, /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle] as hierarchies to watch +[ ] Watching the file system is configured to be enabled if available +[ +99 ms] File system watching is active +[ ] Starting Build +[ ] Now considering [/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle, /Volumes/terrain/aves_mio54/android] as hierarchies to watch +[ +105 ms] > Configure project :gradle +[ ] Evaluating project ':gradle' using build file '/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/build.gradle.kts'. +[ ] Resolved plugin [id: 'org.gradle.java-gradle-plugin'] +[ ] Resolved plugin [id: 'org.gradle.groovy'] +[ ] Resolved plugin [id: 'org.gradle.kotlin.kotlin-dsl', version: '5.2.0'] +[ ] Resolved plugin [id: 'org.jetbrains.kotlin.jvm', version: '1.9.20'] +[ ] Using Kotlin Gradle Plugin gradle85 variant +[ ] kotlin scripting plugin: created the scripting discovery configuration: kotlinScriptDef +[ ] kotlin scripting plugin: created the scripting discovery configuration: testKotlinScriptDef +[ ] file or directory '/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/java', not found +[ ] Resolved plugin [id: 'dev.flutter.flutter-plugin-loader', version: '1.0.0'] +[ ] Resolved plugin [id: 'org.gradle.toolchains.foojay-resolver-convention', version: '1.0.0'] +[ ] Resolved plugin [id: 'com.android.application', version: '8.13.2', apply: false] +[ ] Resolved plugin [id: 'org.jetbrains.kotlin.android', version: '2.3.0', apply: false] +[ ] Resolve mutations for :gradle:checkKotlinGradlePluginConfigurationErrors (Thread[#385,Execution worker,5,main]) started. +[ ] :gradle:checkKotlinGradlePluginConfigurationErrors (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :gradle:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':gradle:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :gradle:compileKotlin (Thread[#385,Execution worker,5,main]) started. +[ ] :gradle:compileKotlin (Thread[#385,Execution worker,5,main]) started. +[ +91 ms] > Task :gradle:compileKotlin UP-TO-DATE +[ ] Caching disabled for task ':gradle:compileKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':gradle:compileKotlin' as it is up-to-date. +[ ] Resolve mutations for :gradle:compileJava (Thread[#385,Execution worker,5,main]) started. +[ ] :gradle:compileJava (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :gradle:compileJava NO-SOURCE +[ ] Skipping task ':gradle:compileJava' as it has no source files and no previous output files. +[ ] Resolve mutations for :gradle:compileGroovy (Thread[#385,Execution worker,5,main]) started. +[ ] :gradle:compileGroovy (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :gradle:compileGroovy NO-SOURCE +[ ] Skipping task ':gradle:compileGroovy' as it has no source files and no previous output files. +[ ] Resolve mutations for :gradle:pluginDescriptors (Thread[#385,Execution worker,5,main]) started. +[ ] :gradle:pluginDescriptors (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :gradle:pluginDescriptors UP-TO-DATE +[ ] Caching disabled for task ':gradle:pluginDescriptors' because: +[ ] Build cache is disabled +[ ] Not worth caching +[ ] Skipping task ':gradle:pluginDescriptors' as it is up-to-date. +[ ] Resolve mutations for :gradle:processResources (Thread[#385,Execution worker,5,main]) started. +[ ] :gradle:processResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :gradle:processResources UP-TO-DATE +[ ] Caching disabled for task ':gradle:processResources' because: +[ ] Build cache is disabled +[ ] Not worth caching +[ ] Skipping task ':gradle:processResources' as it is up-to-date. +[ ] Resolve mutations for :gradle:classes (Thread[#385,Execution worker,5,main]) started. +[ ] :gradle:classes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :gradle:classes UP-TO-DATE +[ ] Skipping task ':gradle:classes' as it has no actions. +[ +1 ms] Resolve mutations for :gradle:jar (Thread[#385,Execution worker,5,main]) started. +[ ] :gradle:jar (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :gradle:jar UP-TO-DATE +[ ] Caching disabled for task ':gradle:jar' because: +[ ] Build cache is disabled +[ ] Not worth caching +[ ] Skipping task ':gradle:jar' as it is up-to-date. +[ +394 ms] Settings evaluated using settings file '/Volumes/terrain/aves_mio54/android/settings.gradle.kts'. +[ ] Projects loaded. Root project using build file '/Volumes/terrain/aves_mio54/android/build.gradle.kts'. +[ ] Included projects: [root project 'android', project ':app', project ':aves_screen_state', project ':connectivity_plus', project ':dchs_motion_sensors', project ':device_info_plus', project ':dynamic_color', project ':exifinterface', project ':firebase_core', project ':firebase_crashlytics', project ':floating', project ':flutter_displaymode', project ':flutter_plugin_android_lifecycle', project ':flutter_secure_storage', project ':google_api_availability_android', project ':google_cast', project ':google_maps_flutter_android', project ':jni', project ':jni_flutter', project ':local_auth_android', project ':media_kit_libs_android_video', project ':media_kit_video', project ':network_info_plus', project ':package_info_plus', project ':permission_handler_android', project ':printing', project ':screen_brightness_android', project ':shared_preferences_android', project ':sqflite_android', project ':streams_channel', project ':url_launcher_android', project ':video_player_android', project ':volume_controller', project ':wakelock_plus'] +[ +795 ms] > Configure project :app +[ ] Evaluating project ':app' using build file '/Volumes/terrain/aves_mio54/android/app/build.gradle.kts'. +[ ] Resolved plugin [id: 'com.android.application', version: '8.13.2'] +[ ] Resolved plugin [id: 'com.google.devtools.ksp', version: '2.3.5'] +[ ] Resolved plugin [id: 'kotlin-android'] +[ ] Resolved plugin [id: 'dev.flutter.flutter-gradle-plugin'] +[ ] Using default execution profile +[ ] Build e2f31eb5-55bd-4bd4-b7da-1f60a9dc24a4 is started +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ ] Load keystore props from file=/Volumes/terrain/aves_mio54/android/key.properties +[ ] Create signing config for release using file=../keystore/release.jks +[ ] Building flavor with Crashlytics plugin +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] Application variant applicationId=deckers.thibault.aves.debug name=playDebug +[ ] Application variant applicationId=deckers.thibault.aves.debug name=izzyDebug +[ ] Application variant applicationId=deckers.thibault.aves.libre.debug name=libreDebug +[ ] Application variant applicationId=deckers.thibault.aves.libre.debug name=libre_romDebug +[ ] Application variant applicationId=deckers.thibault.aves name=playRelease +[ ] Application variant applicationId=deckers.thibault.aves name=izzyRelease +[ ] Application variant applicationId=deckers.thibault.aves.libre name=libreRelease +[ ] Application variant applicationId=deckers.thibault.aves.libre name=libre_romRelease +[ ] Application variant applicationId=deckers.thibault.aves name=playProfile +[ ] Application variant applicationId=deckers.thibault.aves name=izzyProfile +[ ] Application variant applicationId=deckers.thibault.aves.libre name=libreProfile +[ ] Application variant applicationId=deckers.thibault.aves.libre name=libre_romProfile +[ ] > Configure project : +[ ] Evaluating root project 'android' using build file '/Volumes/terrain/aves_mio54/android/build.gradle.kts'. +[ ] Tasks=[assemblePlayDebug] +[ ] Extra= +[ ] android.enableR8.fullMode=false +[ ] android.useAndroidX=true +[ ] aves.useCrashlytics=true +[ ] base-application-name=android.app.Application +[ ] dart-defines=RkxVVFRFUl9BUFBfRkxBVk9SPXBsYXk=,RkxVVFRFUl9WRVJTSU9OPTMuMzUuNw==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049YWRjOTAxMDYyNQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDM1MzE2NTY1YQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My45LjI= +[ ] dart-obfuscation=false +[ ] kotlin.code.style=official +[ ] kotlin.jvm.target.validation.mode=IGNORE +[ ] org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +[ ] target-platform=android-arm,android-arm64,android-x64 +[ ] target=lib/main_play.dart +[ ] track-widget-creation=true +[ ] tree-shake-icons=false +[ ] verbose=true +[ ] Resolved plugin [id: 'org.gradlex.reproducible-builds', version: '1.1'] +[ +68 ms] > Configure project :aves_screen_state +[ ] Evaluating project ':aves_screen_state' using build file '/Volumes/terrain/aves_mio54/plugins/aves_screen_state/android/build.gradle.kts'. +[ ] Resolved plugin [id: 'com.android.library'] +[ ] Resolved plugin [id: 'kotlin-android'] +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ +97 ms] > Configure project :connectivity_plus +[ ] Evaluating project ':connectivity_plus' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/android/build.gradle'. +[ ] Using default execution profile +[ +194 ms] > Configure project :dchs_motion_sensors +[ ] Evaluating project ':dchs_motion_sensors' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/android/build.gradle'. +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ +105 ms] > Configure project :device_info_plus +[ ] Evaluating project ':device_info_plus' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/android/build.gradle'. +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ +196 ms] > Configure project :dynamic_color +[ ] Evaluating project ':dynamic_color' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/android/build.gradle'. +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ +97 ms] > Configure project :exifinterface +[ ] Evaluating project ':exifinterface' using build file '/Volumes/terrain/aves_mio54/android/exifinterface/build.gradle.kts'. +[ ] Resolved plugin [id: 'com.android.library'] +[ ] Using default execution profile +[ ] > Configure project :firebase_core +[ ] Evaluating project ':firebase_core' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/android/build.gradle'. +[ ] Using default execution profile +[ +101 ms] > Configure project :firebase_crashlytics +[ ] Evaluating project ':firebase_crashlytics' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/firebase_crashlytics-5.2.0/android/build.gradle'. +[ ] Using default execution profile +[ ] > Configure project :floating +[ ] Evaluating project ':floating' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/floating-6.0.0/android/build.gradle'. +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ +99 ms] > Configure project :flutter_displaymode +[ ] Evaluating project ':flutter_displaymode' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_displaymode-0.7.0/android/build.gradle'. +[ ] Resolved plugin [id: 'com.android.library'] +[ ] Using default execution profile +[ +105 ms] > Configure project :flutter_plugin_android_lifecycle +[ ] Evaluating project ':flutter_plugin_android_lifecycle' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.34/android/build.gradle.kts'. +[ ] Resolved plugin [id: 'com.android.library'] +[ ] Using default execution profile +[ +195 ms] > Configure project :flutter_secure_storage +[ ] Evaluating project ':flutter_secure_storage' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/android/build.gradle'. +[ ] Using default execution profile +[ ] > Configure project :google_api_availability_android +[ ] Evaluating project ':google_api_availability_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability_android-1.1.1/android/build.gradle'. +[ ] Using default execution profile +[ +194 ms] > Configure project :google_cast +[ ] Evaluating project ':google_cast' using build file '/Volumes/terrain/aves_mio54/plugins/google_cast/android/build.gradle'. +[ ] Using default execution profile +[ +105 ms] > Configure project :google_maps_flutter_android +[ ] Evaluating project ':google_maps_flutter_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_android-2.19.8/android/build.gradle.kts'. +[ ] Resolved plugin [id: 'com.android.library'] +[ ] Resolved plugin [id: 'kotlin-android'] +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ ] > Configure project :jni +[ ] Evaluating project ':jni' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/jni-1.0.0/android/build.gradle'. +[ ] Using default execution profile +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ +86 ms] > Configure project :jni_flutter +[ ] Evaluating project ':jni_flutter' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/android/build.gradle'. +[ ] Using default execution profile +[ ] > Configure project :local_auth_android +[ ] Evaluating project ':local_auth_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/local_auth_android-2.0.8/android/build.gradle.kts'. +[ ] Resolved plugin [id: 'com.android.library'] +[ ] Resolved plugin [id: 'kotlin-android'] +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ +298 ms] > Configure project :media_kit_libs_android_video +[ ] Evaluating project ':media_kit_libs_android_video' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8/android/build.gradle'. +[ ] Using default execution profile +[ ] > Configure project :media_kit_video +[ ] Evaluating project ':media_kit_video' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/android/build.gradle'. +[ ] Using default execution profile +[ +101 ms] > Configure project :network_info_plus +[ ] Evaluating project ':network_info_plus' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/android/build.gradle'. +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ +104 ms] > Configure project :package_info_plus +[ ] Evaluating project ':package_info_plus' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/android/build.gradle'. +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ +98 ms] > Configure project :permission_handler_android +[ ] Evaluating project ':permission_handler_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_android-13.0.1/android/build.gradle'. +[ ] Using default execution profile +[ +91 ms] > Configure project :printing +[ ] Evaluating project ':printing' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/android/build.gradle'. +[ ] Using default execution profile +[ +207 ms] > Configure project :screen_brightness_android +[ ] Evaluating project ':screen_brightness_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/android/build.gradle'. +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ +91 ms] > Configure project :shared_preferences_android +[ ] Evaluating project ':shared_preferences_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.18/android/build.gradle'. +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ +104 ms] > Configure project :sqflite_android +[ ] Evaluating project ':sqflite_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+2/android/build.gradle'. +[ ] Using default execution profile +[ +196 ms] > Configure project :streams_channel +[ ] Evaluating project ':streams_channel' using build file '/Users/fabio/.pub-cache/git/aves_streams_channel-35a9b0fcc0e97f756756c0010fb223129c2d832c/android/build.gradle'. +[ ] Using default execution profile +[ +115 ms] > Configure project :url_launcher_android +[ ] Evaluating project ':url_launcher_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.29/android/build.gradle.kts'. +[ ] Resolved plugin [id: 'com.android.library'] +[ ] Using default execution profile +[ ] > Configure project :video_player_android +[ ] Evaluating project ':video_player_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/video_player_android-2.9.5/android/build.gradle.kts'. +[ ] Resolved plugin [id: 'com.android.library'] +[ ] Resolved plugin [id: 'kotlin-android'] +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ +90 ms] > Configure project :volume_controller +[ ] Evaluating project ':volume_controller' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/android/build.gradle'. +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ +94 ms] > Configure project :wakelock_plus +[ ] Evaluating project ':wakelock_plus' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/android/build.gradle'. +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ ] All projects evaluated. +[ ] Task name matched 'assemblePlayDebug' +[ ] Selected primary task 'assemblePlayDebug' from project : +[ ] Starting process 'command '/usr/libexec/java_home''. Working directory: /Users/fabio/.gradle/daemon/8.14.4 Command: /usr/libexec/java_home -V +[ ] Successfully started process 'command '/usr/libexec/java_home'' +[ +100 ms] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :app:compilePlayDebugKotlin +[ +801 ms] Tasks to be executed: [task ':app:PlayDebugMinSdkCheck', task ':app:preBuild', task ':app:prePlayDebugBuild', task ':app:mergePlayDebugNativeDebugMetadata', task ':app:checkKotlinGradlePluginConfigurationErrors', task ':app:compileFlutterBuildPlayDebug', task ':app:packJniLibsflutterBuildPlayDebug', task ':aves_screen_state:preBuild', task ':aves_screen_state:preDebugBuild', task ':aves_screen_state:writeDebugAarMetadata', task ':connectivity_plus:preBuild', task ':connectivity_plus:preDebugBuild', task ':connectivity_plus:writeDebugAarMetadata', task ':dchs_motion_sensors:preBuild', task ':dchs_motion_sensors:preDebugBuild', task ':dchs_motion_sensors:writeDebugAarMetadata', task ':device_info_plus:preBuild', task ':device_info_plus:preDebugBuild', task ':device_info_plus:writeDebugAarMetadata', task ':dynamic_color:preBuild', task ':dynamic_color:preDebugBuild', task ':dynamic_color:writeDebugAarMetadata', task ':exifinterface:preBuild', task ':exifinterface:preDebugBuild', task ':exifinterface:writeDebugAarMetadata', task ':firebase_core:preBuild', task ':firebase_core:preDebugBuild', task ':firebase_core:writeDebugAarMetadata', task ':firebase_crashlytics:preBuild', task ':firebase_crashlytics:preDebugBuild', task ':firebase_crashlytics:writeDebugAarMetadata', task ':floating:preBuild', task ':floating:preDebugBuild', task ':floating:writeDebugAarMetadata', task ':flutter_displaymode:preBuild', task ':flutter_displaymode:preDebugBuild', task ':flutter_displaymode:writeDebugAarMetadata', task ':flutter_plugin_android_lifecycle:preBuild', task ':flutter_plugin_android_lifecycle:preDebugBuild', task ':flutter_plugin_android_lifecycle:writeDebugAarMetadata', task ':flutter_secure_storage:preBuild', task ':flutter_secure_storage:preDebugBuild', task ':flutter_secure_storage:writeDebugAarMetadata', task ':google_api_availability_android:preBuild', task ':google_api_availability_android:preDebugBuild', task ':google_api_availability_android:writeDebugAarMetadata', task ':google_cast:preBuild', task ':google_cast:preDebugBuild', task ':google_cast:writeDebugAarMetadata', task ':google_maps_flutter_android:preBuild', task ':google_maps_flutter_android:preDebugBuild', task ':google_maps_flutter_android:writeDebugAarMetadata', task ':jni:preBuild', task ':jni:preDebugBuild', task ':jni:writeDebugAarMetadata', task ':jni_flutter:preBuild', task ':jni_flutter:preDebugBuild', task ':jni_flutter:writeDebugAarMetadata', task ':local_auth_android:preBuild', task ':local_auth_android:preDebugBuild', task ':local_auth_android:writeDebugAarMetadata', task ':media_kit_libs_android_video:preBuild', task ':media_kit_libs_android_video:preDebugBuild', task ':media_kit_libs_android_video:writeDebugAarMetadata', task ':media_kit_video:preBuild', task ':media_kit_video:preDebugBuild', task ':media_kit_video:writeDebugAarMetadata', task ':network_info_plus:preBuild', task ':network_info_plus:preDebugBuild', task ':network_info_plus:writeDebugAarMetadata', task ':package_info_plus:preBuild', task ':package_info_plus:preDebugBuild', task ':package_info_plus:writeDebugAarMetadata', task ':permission_handler_android:preBuild', task ':permission_handler_android:preDebugBuild', task ':permission_handler_android:writeDebugAarMetadata', task ':printing:preBuild', task ':printing:preDebugBuild', task ':printing:writeDebugAarMetadata', task ':screen_brightness_android:preBuild', task ':screen_brightness_android:preDebugBuild', task ':screen_brightness_android:writeDebugAarMetadata', task ':shared_preferences_android:preBuild', task ':shared_preferences_android:preDebugBuild', task ':shared_preferences_android:writeDebugAarMetadata', task ':sqflite_android:preBuild', task ':sqflite_android:preDebugBuild', task ':sqflite_android:writeDebugAarMetadata', task ':streams_channel:preBuild', task ':streams_channel:preDebugBuild', task ':streams_channel:writeDebugAarMetadata', task ':url_launcher_android:preBuild', task ':url_launcher_android:preDebugBuild', task ':url_launcher_android:writeDebugAarMetadata', task ':video_player_android:preBuild', task ':video_player_android:preDebugBuild', task ':video_player_android:writeDebugAarMetadata', task ':volume_controller:preBuild', task ':volume_controller:preDebugBuild', task ':volume_controller:writeDebugAarMetadata', task ':wakelock_plus:preBuild', task ':wakelock_plus:preDebugBuild', task ':wakelock_plus:writeDebugAarMetadata', task ':app:checkPlayDebugAarMetadata', task ':aves_screen_state:processDebugNavigationResources', task ':connectivity_plus:processDebugNavigationResources', task ':dchs_motion_sensors:processDebugNavigationResources', task ':device_info_plus:processDebugNavigationResources', task ':dynamic_color:processDebugNavigationResources', task ':exifinterface:processDebugNavigationResources', task ':firebase_core:processDebugNavigationResources', task ':firebase_crashlytics:processDebugNavigationResources', task ':floating:processDebugNavigationResources', task ':flutter_displaymode:processDebugNavigationResources', task ':flutter_plugin_android_lifecycle:processDebugNavigationResources', task ':flutter_secure_storage:processDebugNavigationResources', task ':google_api_availability_android:processDebugNavigationResources', task ':google_cast:processDebugNavigationResources', task ':google_maps_flutter_android:processDebugNavigationResources', task ':jni:processDebugNavigationResources', task ':jni_flutter:processDebugNavigationResources', task ':local_auth_android:processDebugNavigationResources', task ':media_kit_libs_android_video:processDebugNavigationResources', task ':media_kit_video:processDebugNavigationResources', task ':network_info_plus:processDebugNavigationResources', task ':package_info_plus:processDebugNavigationResources', task ':permission_handler_android:processDebugNavigationResources', task ':printing:processDebugNavigationResources', task ':screen_brightness_android:processDebugNavigationResources', task ':shared_preferences_android:processDebugNavigationResources', task ':sqflite_android:processDebugNavigationResources', task ':streams_channel:processDebugNavigationResources', task ':url_launcher_android:processDebugNavigationResources', task ':video_player_android:processDebugNavigationResources', task ':volume_controller:processDebugNavigationResources', task ':wakelock_plus:processDebugNavigationResources', task ':app:processPlayDebugNavigationResources', task ':app:compilePlayDebugNavigationResources', task ':app:cleanMergePlayDebugAssets', task ':app:mergePlayDebugShaders', task ':app:compilePlayDebugShaders', task ':app:generatePlayDebugAssets', task ':aves_screen_state:mergeDebugShaders', task ':aves_screen_state:compileDebugShaders', task ':aves_screen_state:generateDebugAssets', task ':aves_screen_state:mergeDebugAssets', task ':connectivity_plus:mergeDebugShaders', task ':connectivity_plus:compileDebugShaders', task ':connectivity_plus:generateDebugAssets', task ':connectivity_plus:mergeDebugAssets', task ':dchs_motion_sensors:mergeDebugShaders', task ':dchs_motion_sensors:compileDebugShaders', task ':dchs_motion_sensors:generateDebugAssets', task ':dchs_motion_sensors:mergeDebugAssets', task ':device_info_plus:mergeDebugShaders', task ':device_info_plus:compileDebugShaders', task ':device_info_plus:generateDebugAssets', task ':device_info_plus:mergeDebugAssets', task ':dynamic_color:mergeDebugShaders', task ':dynamic_color:compileDebugShaders', task ':dynamic_color:generateDebugAssets', task ':dynamic_color:mergeDebugAssets', task ':exifinterface:mergeDebugShaders', task ':exifinterface:compileDebugShaders', task ':exifinterface:generateDebugAssets', task ':exifinterface:mergeDebugAssets', task ':firebase_core:mergeDebugShaders', task ':firebase_core:compileDebugShaders', task ':firebase_core:generateDebugAssets', task ':firebase_core:mergeDebugAssets', task ':firebase_crashlytics:mergeDebugShaders', task ':firebase_crashlytics:compileDebugShaders', task ':firebase_crashlytics:generateDebugAssets', task ':firebase_crashlytics:mergeDebugAssets', task ':floating:mergeDebugShaders', task ':floating:compileDebugShaders', task ':floating:generateDebugAssets', task ':floating:mergeDebugAssets', task ':flutter_displaymode:mergeDebugShaders', task ':flutter_displaymode:compileDebugShaders', task ':flutter_displaymode:generateDebugAssets', task ':flutter_displaymode:mergeDebugAssets', task ':flutter_plugin_android_lifecycle:mergeDebugShaders', task ':flutter_plugin_android_lifecycle:compileDebugShaders', task ':flutter_plugin_android_lifecycle:generateDebugAssets', task ':flutter_plugin_android_lifecycle:mergeDebugAssets', task ':flutter_secure_storage:mergeDebugShaders', task ':flutter_secure_storage:compileDebugShaders', task ':flutter_secure_storage:generateDebugAssets', task ':flutter_secure_storage:mergeDebugAssets', task ':google_api_availability_android:mergeDebugShaders', task ':google_api_availability_android:compileDebugShaders', task ':google_api_availability_android:generateDebugAssets', task ':google_api_availability_android:mergeDebugAssets', task ':google_cast:mergeDebugShaders', task ':google_cast:compileDebugShaders', task ':google_cast:generateDebugAssets', task ':google_cast:mergeDebugAssets', task ':google_maps_flutter_android:mergeDebugShaders', task ':google_maps_flutter_android:compileDebugShaders', task ':google_maps_flutter_android:generateDebugAssets', task ':google_maps_flutter_android:mergeDebugAssets', task ':jni:mergeDebugShaders', task ':jni:compileDebugShaders', task ':jni:generateDebugAssets', task ':jni:mergeDebugAssets', task ':jni_flutter:mergeDebugShaders', task ':jni_flutter:compileDebugShaders', task ':jni_flutter:generateDebugAssets', task ':jni_flutter:mergeDebugAssets', task ':local_auth_android:mergeDebugShaders', task ':local_auth_android:compileDebugShaders', task ':local_auth_android:generateDebugAssets', task ':local_auth_android:mergeDebugAssets', task ':media_kit_libs_android_video:mergeDebugShaders', task ':media_kit_libs_android_video:compileDebugShaders', task ':media_kit_libs_android_video:generateDebugAssets', task ':media_kit_libs_android_video:mergeDebugAssets', task ':media_kit_video:mergeDebugShaders', task ':media_kit_video:compileDebugShaders', task ':media_kit_video:generateDebugAssets', task ':media_kit_video:mergeDebugAssets', task ':network_info_plus:mergeDebugShaders', task ':network_info_plus:compileDebugShaders', task ':network_info_plus:generateDebugAssets', task ':network_info_plus:mergeDebugAssets', task ':package_info_plus:mergeDebugShaders', task ':package_info_plus:compileDebugShaders', task ':package_info_plus:generateDebugAssets', task ':package_info_plus:mergeDebugAssets', task ':permission_handler_android:mergeDebugShaders', task ':permission_handler_android:compileDebugShaders', task ':permission_handler_android:generateDebugAssets', task ':permission_handler_android:mergeDebugAssets', task ':printing:mergeDebugShaders', task ':printing:compileDebugShaders', task ':printing:generateDebugAssets', task ':printing:mergeDebugAssets', task ':screen_brightness_android:mergeDebugShaders', task ':screen_brightness_android:compileDebugShaders', task ':screen_brightness_android:generateDebugAssets', task ':screen_brightness_android:mergeDebugAssets', task ':shared_preferences_android:mergeDebugShaders', task ':shared_preferences_android:compileDebugShaders', task ':shared_preferences_android:generateDebugAssets', task ':shared_preferences_android:mergeDebugAssets', task ':sqflite_android:mergeDebugShaders', task ':sqflite_android:compileDebugShaders', task ':sqflite_android:generateDebugAssets', task ':sqflite_android:mergeDebugAssets', task ':streams_channel:mergeDebugShaders', task ':streams_channel:compileDebugShaders', task ':streams_channel:generateDebugAssets', task ':streams_channel:mergeDebugAssets', task ':url_launcher_android:mergeDebugShaders', task ':url_launcher_android:compileDebugShaders', task ':url_launcher_android:generateDebugAssets', task ':url_launcher_android:mergeDebugAssets', task ':video_player_android:mergeDebugShaders', task ':video_player_android:compileDebugShaders', task ':video_player_android:generateDebugAssets', task ':video_player_android:mergeDebugAssets', task ':volume_controller:mergeDebugShaders', task ':volume_controller:compileDebugShaders', task ':volume_controller:generateDebugAssets', task ':volume_controller:mergeDebugAssets', task ':wakelock_plus:mergeDebugShaders', task ':wakelock_plus:compileDebugShaders', task ':wakelock_plus:generateDebugAssets', task ':wakelock_plus:mergeDebugAssets', task ':app:mergePlayDebugAssets', task ':app:copyFlutterAssetsPlayDebug', task ':app:generatePlayDebugResValues', task ':app:injectCrashlyticsMappingFileIdPlayDebug', task ':app:injectCrashlyticsVersionControlInfoPlayDebug', task ':app:processPlayDebugGoogleServices', task ':aves_screen_state:generateDebugResValues', task ':aves_screen_state:generateDebugResources', task ':aves_screen_state:packageDebugResources', task ':connectivity_plus:generateDebugResValues', task ':connectivity_plus:generateDebugResources', task ':connectivity_plus:packageDebugResources', task ':dchs_motion_sensors:generateDebugResValues', task ':dchs_motion_sensors:generateDebugResources', task ':dchs_motion_sensors:packageDebugResources', task ':device_info_plus:generateDebugResValues', task ':device_info_plus:generateDebugResources', task ':device_info_plus:packageDebugResources', task ':dynamic_color:generateDebugResValues', task ':dynamic_color:generateDebugResources', task ':dynamic_color:packageDebugResources', task ':exifinterface:generateDebugResValues', task ':exifinterface:generateDebugResources', task ':exifinterface:packageDebugResources', task ':firebase_core:generateDebugResValues', task ':firebase_core:generateDebugResources', task ':firebase_core:packageDebugResources', task ':firebase_crashlytics:generateDebugResValues', task ':firebase_crashlytics:generateDebugResources', task ':firebase_crashlytics:packageDebugResources', task ':floating:generateDebugResValues', task ':floating:generateDebugResources', task ':floating:packageDebugResources', task ':flutter_displaymode:generateDebugResValues', task ':flutter_displaymode:generateDebugResources', task ':flutter_displaymode:packageDebugResources', task ':flutter_plugin_android_lifecycle:generateDebugResValues', task ':flutter_plugin_android_lifecycle:generateDebugResources', task ':flutter_plugin_android_lifecycle:packageDebugResources', task ':flutter_secure_storage:generateDebugResValues', task ':flutter_secure_storage:generateDebugResources', task ':flutter_secure_storage:packageDebugResources', task ':google_api_availability_android:generateDebugResValues', task ':google_api_availability_android:generateDebugResources', task ':google_api_availability_android:packageDebugResources', task ':google_cast:generateDebugResValues', task ':google_cast:generateDebugResources', task ':google_cast:packageDebugResources', task ':google_maps_flutter_android:generateDebugResValues', task ':google_maps_flutter_android:generateDebugResources', task ':google_maps_flutter_android:packageDebugResources', task ':jni:generateDebugResValues', task ':jni:generateDebugResources', task ':jni:packageDebugResources', task ':jni_flutter:generateDebugResValues', task ':jni_flutter:generateDebugResources', task ':jni_flutter:packageDebugResources', task ':local_auth_android:generateDebugResValues', task ':local_auth_android:generateDebugResources', task ':local_auth_android:packageDebugResources', task ':media_kit_libs_android_video:generateDebugResValues', task ':media_kit_libs_android_video:generateDebugResources', task ':media_kit_libs_android_video:packageDebugResources', task ':media_kit_video:generateDebugResValues', task ':media_kit_video:generateDebugResources', task ':media_kit_video:packageDebugResources', task ':network_info_plus:generateDebugResValues', task ':network_info_plus:generateDebugResources', task ':network_info_plus:packageDebugResources', task ':package_info_plus:generateDebugResValues', task ':package_info_plus:generateDebugResources', task ':package_info_plus:packageDebugResources', task ':permission_handler_android:generateDebugResValues', task ':permission_handler_android:generateDebugResources', task ':permission_handler_android:packageDebugResources', task ':printing:generateDebugResValues', task ':printing:generateDebugResources', task ':printing:packageDebugResources', task ':screen_brightness_android:generateDebugResValues', task ':screen_brightness_android:generateDebugResources', task ':screen_brightness_android:packageDebugResources', task ':shared_preferences_android:generateDebugResValues', task ':shared_preferences_android:generateDebugResources', task ':shared_preferences_android:packageDebugResources', task ':sqflite_android:generateDebugResValues', task ':sqflite_android:generateDebugResources', task ':sqflite_android:packageDebugResources', task ':streams_channel:generateDebugResValues', task ':streams_channel:generateDebugResources', task ':streams_channel:packageDebugResources', task ':url_launcher_android:generateDebugResValues', task ':url_launcher_android:generateDebugResources', task ':url_launcher_android:packageDebugResources', task ':video_player_android:generateDebugResValues', task ':video_player_android:generateDebugResources', task ':video_player_android:packageDebugResources', task ':volume_controller:generateDebugResValues', task ':volume_controller:generateDebugResources', task ':volume_controller:packageDebugResources', task ':wakelock_plus:generateDebugResValues', task ':wakelock_plus:generateDebugResources', task ':wakelock_plus:packageDebugResources', task ':app:mapPlayDebugSourceSetPaths', task ':app:generatePlayDebugResources', task ':app:mergePlayDebugResources', task ':app:packagePlayDebugResources', task ':app:parsePlayDebugLocalResources', task ':app:createPlayDebugCompatibleScreenManifests', task ':app:extractDeepLinksPlayDebug', task ':aves_screen_state:extractDeepLinksDebug', task ':aves_screen_state:processDebugManifest', task ':connectivity_plus:extractDeepLinksDebug', task ':connectivity_plus:processDebugManifest', task ':dchs_motion_sensors:extractDeepLinksDebug', task ':dchs_motion_sensors:processDebugManifest', task ':device_info_plus:extractDeepLinksDebug', task ':device_info_plus:processDebugManifest', task ':dynamic_color:extractDeepLinksDebug', task ':dynamic_color:processDebugManifest', task ':exifinterface:extractDeepLinksDebug', task ':exifinterface:processDebugManifest', task ':firebase_core:extractDeepLinksDebug', task ':firebase_core:processDebugManifest', task ':firebase_crashlytics:extractDeepLinksDebug', task ':firebase_crashlytics:processDebugManifest', task ':floating:extractDeepLinksDebug', task ':floating:processDebugManifest', task ':flutter_displaymode:extractDeepLinksDebug', task ':flutter_displaymode:processDebugManifest', task ':flutter_plugin_android_lifecycle:extractDeepLinksDebug', task ':flutter_plugin_android_lifecycle:processDebugManifest', task ':flutter_secure_storage:extractDeepLinksDebug', task ':flutter_secure_storage:processDebugManifest', task ':google_api_availability_android:extractDeepLinksDebug', task ':google_api_availability_android:processDebugManifest', task ':google_cast:extractDeepLinksDebug', task ':google_cast:processDebugManifest', task ':google_maps_flutter_android:extractDeepLinksDebug', task ':google_maps_flutter_android:processDebugManifest', task ':jni:extractDeepLinksDebug', task ':jni:processDebugManifest', task ':jni_flutter:extractDeepLinksDebug', task ':jni_flutter:processDebugManifest', task ':local_auth_android:extractDeepLinksDebug', task ':local_auth_android:processDebugManifest', task ':media_kit_libs_android_video:extractDeepLinksDebug', task ':media_kit_libs_android_video:processDebugManifest', task ':media_kit_video:extractDeepLinksDebug', task ':media_kit_video:processDebugManifest', task ':network_info_plus:extractDeepLinksDebug', task ':network_info_plus:processDebugManifest', task ':package_info_plus:extractDeepLinksDebug', task ':package_info_plus:processDebugManifest', task ':permission_handler_android:extractDeepLinksDebug', task ':permission_handler_android:processDebugManifest', task ':printing:extractDeepLinksDebug', task ':printing:processDebugManifest', task ':screen_brightness_android:extractDeepLinksDebug', task ':screen_brightness_android:processDebugManifest', task ':shared_preferences_android:extractDeepLinksDebug', task ':shared_preferences_android:processDebugManifest', task ':sqflite_android:extractDeepLinksDebug', task ':sqflite_android:processDebugManifest', task ':streams_channel:extractDeepLinksDebug', task ':streams_channel:processDebugManifest', task ':url_launcher_android:extractDeepLinksDebug', task ':url_launcher_android:processDebugManifest', task ':video_player_android:extractDeepLinksDebug', task ':video_player_android:processDebugManifest', task ':volume_controller:extractDeepLinksDebug', task ':volume_controller:processDebugManifest', task ':wakelock_plus:extractDeepLinksDebug', task ':wakelock_plus:processDebugManifest', task ':app:processPlayDebugMainManifest', task ':app:processPlayDebugManifest', task ':app:processPlayDebugManifestForPackage', task ':aves_screen_state:compileDebugLibraryResources', task ':aves_screen_state:parseDebugLocalResources', task ':aves_screen_state:generateDebugRFile', task ':connectivity_plus:compileDebugLibraryResources', task ':connectivity_plus:parseDebugLocalResources', task ':connectivity_plus:generateDebugRFile', task ':dchs_motion_sensors:compileDebugLibraryResources', task ':dchs_motion_sensors:parseDebugLocalResources', task ':dchs_motion_sensors:generateDebugRFile', task ':device_info_plus:compileDebugLibraryResources', task ':device_info_plus:parseDebugLocalResources', task ':device_info_plus:generateDebugRFile', task ':dynamic_color:compileDebugLibraryResources', task ':dynamic_color:parseDebugLocalResources', task ':dynamic_color:generateDebugRFile', task ':exifinterface:compileDebugLibraryResources', task ':exifinterface:parseDebugLocalResources', task ':exifinterface:generateDebugRFile', task ':firebase_core:compileDebugLibraryResources', task ':firebase_core:parseDebugLocalResources', task ':firebase_core:generateDebugRFile', task ':firebase_crashlytics:compileDebugLibraryResources', task ':firebase_crashlytics:parseDebugLocalResources', task ':firebase_crashlytics:generateDebugRFile', task ':floating:compileDebugLibraryResources', task ':floating:parseDebugLocalResources', task ':floating:generateDebugRFile', task ':flutter_displaymode:compileDebugLibraryResources', task ':flutter_displaymode:parseDebugLocalResources', task ':flutter_displaymode:generateDebugRFile', task ':flutter_plugin_android_lifecycle:compileDebugLibraryResources', task ':flutter_plugin_android_lifecycle:parseDebugLocalResources', task ':flutter_plugin_android_lifecycle:generateDebugRFile', task ':flutter_secure_storage:compileDebugLibraryResources', task ':flutter_secure_storage:parseDebugLocalResources', task ':flutter_secure_storage:generateDebugRFile', task ':google_api_availability_android:compileDebugLibraryResources', task ':google_api_availability_android:parseDebugLocalResources', task ':google_api_availability_android:generateDebugRFile', task ':google_cast:compileDebugLibraryResources', task ':google_cast:parseDebugLocalResources', task ':google_cast:generateDebugRFile', task ':google_maps_flutter_android:compileDebugLibraryResources', task ':google_maps_flutter_android:parseDebugLocalResources', task ':google_maps_flutter_android:generateDebugRFile', task ':jni:compileDebugLibraryResources', task ':jni:parseDebugLocalResources', task ':jni:generateDebugRFile', task ':jni_flutter:compileDebugLibraryResources', task ':jni_flutter:parseDebugLocalResources', task ':jni_flutter:generateDebugRFile', task ':local_auth_android:compileDebugLibraryResources', task ':local_auth_android:parseDebugLocalResources', task ':local_auth_android:generateDebugRFile', task ':media_kit_libs_android_video:compileDebugLibraryResources', task ':media_kit_libs_android_video:parseDebugLocalResources', task ':media_kit_libs_android_video:generateDebugRFile', task ':media_kit_video:compileDebugLibraryResources', task ':media_kit_video:parseDebugLocalResources', task ':media_kit_video:generateDebugRFile', task ':network_info_plus:compileDebugLibraryResources', task ':network_info_plus:parseDebugLocalResources', task ':network_info_plus:generateDebugRFile', task ':package_info_plus:compileDebugLibraryResources', task ':package_info_plus:parseDebugLocalResources', task ':package_info_plus:generateDebugRFile', task ':permission_handler_android:compileDebugLibraryResources', task ':permission_handler_android:parseDebugLocalResources', task ':permission_handler_android:generateDebugRFile', task ':printing:compileDebugLibraryResources', task ':printing:parseDebugLocalResources', task ':printing:generateDebugRFile', task ':screen_brightness_android:compileDebugLibraryResources', task ':screen_brightness_android:parseDebugLocalResources', task ':screen_brightness_android:generateDebugRFile', task ':shared_preferences_android:compileDebugLibraryResources', task ':shared_preferences_android:parseDebugLocalResources', task ':shared_preferences_android:generateDebugRFile', task ':sqflite_android:compileDebugLibraryResources', task ':sqflite_android:parseDebugLocalResources', task ':sqflite_android:generateDebugRFile', task ':streams_channel:compileDebugLibraryResources', task ':streams_channel:parseDebugLocalResources', task ':streams_channel:generateDebugRFile', task ':url_launcher_android:compileDebugLibraryResources', task ':url_launcher_android:parseDebugLocalResources', task ':url_launcher_android:generateDebugRFile', task ':video_player_android:compileDebugLibraryResources', task ':video_player_android:parseDebugLocalResources', task ':video_player_android:generateDebugRFile', task ':volume_controller:compileDebugLibraryResources', task ':volume_controller:parseDebugLocalResources', task ':volume_controller:generateDebugRFile', task ':wakelock_plus:compileDebugLibraryResources', task ':wakelock_plus:parseDebugLocalResources', task ':wakelock_plus:generateDebugRFile', task ':app:processPlayDebugResources', task ':aves_screen_state:checkKotlinGradlePluginConfigurationErrors', task ':aves_screen_state:compileDebugKotlin', task ':aves_screen_state:javaPreCompileDebug', task ':aves_screen_state:compileDebugJavaWithJavac', task ':aves_screen_state:bundleLibCompileToJarDebug', task ':connectivity_plus:javaPreCompileDebug', task ':connectivity_plus:compileDebugJavaWithJavac', task ':connectivity_plus:bundleLibCompileToJarDebug', task ':dchs_motion_sensors:checkKotlinGradlePluginConfigurationErrors', task ':dchs_motion_sensors:compileDebugKotlin', task ':dchs_motion_sensors:javaPreCompileDebug', task ':dchs_motion_sensors:compileDebugJavaWithJavac', task ':dchs_motion_sensors:bundleLibCompileToJarDebug', task ':device_info_plus:checkKotlinGradlePluginConfigurationErrors', task ':device_info_plus:compileDebugKotlin', task ':device_info_plus:javaPreCompileDebug', task ':device_info_plus:compileDebugJavaWithJavac', task ':device_info_plus:bundleLibCompileToJarDebug', task ':dynamic_color:checkKotlinGradlePluginConfigurationErrors', task ':dynamic_color:compileDebugKotlin', task ':dynamic_color:javaPreCompileDebug', task ':dynamic_color:compileDebugJavaWithJavac', task ':dynamic_color:bundleLibCompileToJarDebug', task ':exifinterface:javaPreCompileDebug', task ':exifinterface:compileDebugJavaWithJavac', task ':exifinterface:bundleLibCompileToJarDebug', task ':firebase_core:generateDebugBuildConfig', task ':firebase_core:javaPreCompileDebug', task ':firebase_core:compileDebugJavaWithJavac', task ':firebase_core:bundleLibCompileToJarDebug', task ':firebase_crashlytics:generateDebugBuildConfig', task ':firebase_crashlytics:javaPreCompileDebug', task ':firebase_crashlytics:compileDebugJavaWithJavac', task ':firebase_crashlytics:bundleLibCompileToJarDebug', task ':floating:checkKotlinGradlePluginConfigurationErrors', task ':floating:compileDebugKotlin', task ':floating:javaPreCompileDebug', task ':floating:compileDebugJavaWithJavac', task ':floating:bundleLibCompileToJarDebug', task ':flutter_displaymode:javaPreCompileDebug', task ':flutter_displaymode:compileDebugJavaWithJavac', task ':flutter_displaymode:bundleLibCompileToJarDebug', task ':flutter_plugin_android_lifecycle:javaPreCompileDebug', task ':flutter_plugin_android_lifecycle:compileDebugJavaWithJavac', task ':flutter_plugin_android_lifecycle:bundleLibCompileToJarDebug', task ':flutter_secure_storage:generateDebugBuildConfig', task ':flutter_secure_storage:javaPreCompileDebug', task ':flutter_secure_storage:compileDebugJavaWithJavac', task ':flutter_secure_storage:bundleLibCompileToJarDebug', task ':google_api_availability_android:javaPreCompileDebug', task ':google_api_availability_android:compileDebugJavaWithJavac', task ':google_api_availability_android:bundleLibCompileToJarDebug', task ':google_cast:javaPreCompileDebug', task ':google_cast:compileDebugJavaWithJavac', task ':google_cast:bundleLibCompileToJarDebug', task ':google_maps_flutter_android:checkKotlinGradlePluginConfigurationErrors', task ':google_maps_flutter_android:compileDebugKotlin', task ':google_maps_flutter_android:javaPreCompileDebug', task ':google_maps_flutter_android:compileDebugJavaWithJavac', task ':google_maps_flutter_android:bundleLibCompileToJarDebug', task ':jni:javaPreCompileDebug', task ':jni:compileDebugJavaWithJavac', task ':jni:bundleLibCompileToJarDebug', task ':jni_flutter:javaPreCompileDebug', task ':jni_flutter:compileDebugJavaWithJavac', task ':jni_flutter:bundleLibCompileToJarDebug', task ':local_auth_android:checkKotlinGradlePluginConfigurationErrors', task ':local_auth_android:compileDebugKotlin', task ':local_auth_android:javaPreCompileDebug', task ':local_auth_android:compileDebugJavaWithJavac', task ':local_auth_android:bundleLibCompileToJarDebug', task ':media_kit_libs_android_video:javaPreCompileDebug', task ':media_kit_libs_android_video:compileDebugJavaWithJavac', task ':media_kit_libs_android_video:bundleLibCompileToJarDebug', task ':media_kit_video:javaPreCompileDebug', task ':package_info_plus:checkKotlinGradlePluginConfigurationErrors', task ':package_info_plus:compileDebugKotlin', task ':package_info_plus:javaPreCompileDebug', task ':package_info_plus:compileDebugJavaWithJavac', task ':package_info_plus:bundleLibCompileToJarDebug', task ':wakelock_plus:checkKotlinGradlePluginConfigurationErrors', task ':wakelock_plus:compileDebugKotlin', task ':wakelock_plus:javaPreCompileDebug', task ':wakelock_plus:compileDebugJavaWithJavac', task ':wakelock_plus:bundleLibCompileToJarDebug', task ':media_kit_video:compileDebugJavaWithJavac', task ':media_kit_video:bundleLibCompileToJarDebug', task ':network_info_plus:checkKotlinGradlePluginConfigurationErrors', task ':network_info_plus:compileDebugKotlin', task ':network_info_plus:javaPreCompileDebug', task ':network_info_plus:compileDebugJavaWithJavac', task ':network_info_plus:bundleLibCompileToJarDebug', task ':permission_handler_android:javaPreCompileDebug', task ':permission_handler_android:compileDebugJavaWithJavac', task ':permission_handler_android:bundleLibCompileToJarDebug', task ':printing:javaPreCompileDebug', task ':printing:compileDebugJavaWithJavac', task ':printing:bundleLibCompileToJarDebug', task ':screen_brightness_android:checkKotlinGradlePluginConfigurationErrors', task ':screen_brightness_android:compileDebugKotlin', task ':screen_brightness_android:javaPreCompileDebug', task ':screen_brightness_android:compileDebugJavaWithJavac', task ':screen_brightness_android:bundleLibCompileToJarDebug', task ':shared_preferences_android:checkKotlinGradlePluginConfigurationErrors', task ':shared_preferences_android:compileDebugKotlin', task ':shared_preferences_android:javaPreCompileDebug', task ':shared_preferences_android:compileDebugJavaWithJavac', task ':shared_preferences_android:bundleLibCompileToJarDebug', task ':sqflite_android:javaPreCompileDebug', task ':sqflite_android:compileDebugJavaWithJavac', task ':sqflite_android:bundleLibCompileToJarDebug', task ':streams_channel:javaPreCompileDebug', task ':streams_channel:compileDebugJavaWithJavac', task ':streams_channel:bundleLibCompileToJarDebug', task ':url_launcher_android:generateDebugBuildConfig', task ':url_launcher_android:javaPreCompileDebug', task ':url_launcher_android:compileDebugJavaWithJavac', task ':url_launcher_android:bundleLibCompileToJarDebug', task ':video_player_android:checkKotlinGradlePluginConfigurationErrors', task ':video_player_android:compileDebugKotlin', task ':video_player_android:javaPreCompileDebug', task ':video_player_android:compileDebugJavaWithJavac', task ':video_player_android:bundleLibCompileToJarDebug', task ':volume_controller:checkKotlinGradlePluginConfigurationErrors', task ':volume_controller:compileDebugKotlin', task ':volume_controller:javaPreCompileDebug', task ':volume_controller:compileDebugJavaWithJavac', task ':volume_controller:bundleLibCompileToJarDebug', task ':app:kspPlayDebugKotlin', task ':app:compilePlayDebugKotlin', task ':app:javaPreCompilePlayDebug', task ':app:compilePlayDebugJavaWithJavac', task ':app:compressPlayDebugAssets', task ':app:l8DexDesugarLibPlayDebug', task ':app:checkPlayDebugDuplicateClasses', task ':app:desugarPlayDebugFileDependencies', task ':app:mergeExtDexPlayDebug', task ':aves_screen_state:bundleLibRuntimeToDirDebug', task ':connectivity_plus:bundleLibRuntimeToDirDebug', task ':dchs_motion_sensors:bundleLibRuntimeToDirDebug', task ':device_info_plus:bundleLibRuntimeToDirDebug', task ':dynamic_color:bundleLibRuntimeToDirDebug', task ':firebase_crashlytics:bundleLibRuntimeToDirDebug', task ':firebase_core:bundleLibRuntimeToDirDebug', task ':floating:bundleLibRuntimeToDirDebug', task ':flutter_displaymode:bundleLibRuntimeToDirDebug', task ':google_maps_flutter_android:bundleLibRuntimeToDirDebug', task ':local_auth_android:bundleLibRuntimeToDirDebug', task ':flutter_plugin_android_lifecycle:bundleLibRuntimeToDirDebug', task ':flutter_secure_storage:bundleLibRuntimeToDirDebug', task ':google_api_availability_android:bundleLibRuntimeToDirDebug', task ':google_cast:bundleLibRuntimeToDirDebug', task ':jni_flutter:bundleLibRuntimeToDirDebug', task ':jni:bundleLibRuntimeToDirDebug', task ':media_kit_libs_android_video:bundleLibRuntimeToDirDebug', task ':media_kit_video:bundleLibRuntimeToDirDebug', task ':network_info_plus:bundleLibRuntimeToDirDebug', task ':wakelock_plus:bundleLibRuntimeToDirDebug', task ':package_info_plus:bundleLibRuntimeToDirDebug', task ':permission_handler_android:bundleLibRuntimeToDirDebug', task ':printing:bundleLibRuntimeToDirDebug', task ':screen_brightness_android:bundleLibRuntimeToDirDebug', task ':shared_preferences_android:bundleLibRuntimeToDirDebug', task ':sqflite_android:bundleLibRuntimeToDirDebug', task ':streams_channel:bundleLibRuntimeToDirDebug', task ':url_launcher_android:bundleLibRuntimeToDirDebug', task ':video_player_android:bundleLibRuntimeToDirDebug', task ':volume_controller:bundleLibRuntimeToDirDebug', task ':exifinterface:bundleLibRuntimeToDirDebug', task ':app:mergeLibDexPlayDebug', task ':aves_screen_state:bundleLibRuntimeToJarDebug', task ':connectivity_plus:bundleLibRuntimeToJarDebug', task ':dchs_motion_sensors:bundleLibRuntimeToJarDebug', task ':device_info_plus:bundleLibRuntimeToJarDebug', task ':dynamic_color:bundleLibRuntimeToJarDebug', task ':firebase_crashlytics:bundleLibRuntimeToJarDebug', task ':firebase_core:bundleLibRuntimeToJarDebug', task ':floating:bundleLibRuntimeToJarDebug', task ':flutter_displaymode:bundleLibRuntimeToJarDebug', task ':google_maps_flutter_android:bundleLibRuntimeToJarDebug', task ':local_auth_android:bundleLibRuntimeToJarDebug', task ':flutter_plugin_android_lifecycle:bundleLibRuntimeToJarDebug', task ':flutter_secure_storage:bundleLibRuntimeToJarDebug', task ':google_api_availability_android:bundleLibRuntimeToJarDebug', task ':google_cast:bundleLibRuntimeToJarDebug', task ':jni_flutter:bundleLibRuntimeToJarDebug', task ':jni:bundleLibRuntimeToJarDebug', task ':media_kit_libs_android_video:bundleLibRuntimeToJarDebug', task ':media_kit_video:bundleLibRuntimeToJarDebug', task ':network_info_plus:bundleLibRuntimeToJarDebug', task ':wakelock_plus:bundleLibRuntimeToJarDebug', task ':package_info_plus:bundleLibRuntimeToJarDebug', task ':permission_handler_android:bundleLibRuntimeToJarDebug', task ':printing:bundleLibRuntimeToJarDebug', task ':screen_brightness_android:bundleLibRuntimeToJarDebug', task ':shared_preferences_android:bundleLibRuntimeToJarDebug', task ':sqflite_android:bundleLibRuntimeToJarDebug', task ':streams_channel:bundleLibRuntimeToJarDebug', task ':url_launcher_android:bundleLibRuntimeToJarDebug', task ':video_player_android:bundleLibRuntimeToJarDebug', task ':volume_controller:bundleLibRuntimeToJarDebug', task ':exifinterface:bundleLibRuntimeToJarDebug', task ':app:dexBuilderPlayDebug', task ':app:mergePlayDebugGlobalSynthetics', task ':app:processPlayDebugJavaRes', task ':aves_screen_state:processDebugJavaRes', task ':connectivity_plus:processDebugJavaRes', task ':dchs_motion_sensors:processDebugJavaRes', task ':device_info_plus:processDebugJavaRes', task ':dynamic_color:processDebugJavaRes', task ':exifinterface:processDebugJavaRes', task ':firebase_core:processDebugJavaRes', task ':firebase_crashlytics:processDebugJavaRes', task ':floating:processDebugJavaRes', task ':flutter_displaymode:processDebugJavaRes', task ':flutter_plugin_android_lifecycle:processDebugJavaRes', task ':flutter_secure_storage:processDebugJavaRes', task ':google_api_availability_android:processDebugJavaRes', task ':google_cast:processDebugJavaRes', task ':google_maps_flutter_android:processDebugJavaRes', task ':jni:processDebugJavaRes', task ':jni_flutter:processDebugJavaRes', task ':local_auth_android:processDebugJavaRes', task ':media_kit_libs_android_video:processDebugJavaRes', task ':media_kit_video:processDebugJavaRes', task ':network_info_plus:processDebugJavaRes', task ':package_info_plus:processDebugJavaRes', task ':permission_handler_android:processDebugJavaRes', task ':printing:processDebugJavaRes', task ':screen_brightness_android:processDebugJavaRes', task ':shared_preferences_android:processDebugJavaRes', task ':sqflite_android:processDebugJavaRes', task ':streams_channel:processDebugJavaRes', task ':url_launcher_android:processDebugJavaRes', task ':video_player_android:processDebugJavaRes', task ':volume_controller:processDebugJavaRes', task ':wakelock_plus:processDebugJavaRes', task ':app:mergePlayDebugJavaResource', task ':app:mergeProjectDexPlayDebug', task ':app:compileFlutterBuildLibre_romDebug', task ':app:packJniLibsflutterBuildLibre_romDebug', task ':app:preLibre_romDebugBuild', task ':app:configureCMakeDebug[arm64-v8a]', task ':app:buildCMakeDebug[arm64-v8a]', task ':app:configureCMakeDebug[armeabi-v7a]', task ':app:buildCMakeDebug[armeabi-v7a]', task ':app:configureCMakeDebug[x86_64]', task ':app:buildCMakeDebug[x86_64]', task ':app:mergePlayDebugJniLibFolders', task ':aves_screen_state:mergeDebugJniLibFolders', task ':aves_screen_state:mergeDebugNativeLibs', task ':aves_screen_state:copyDebugJniLibsProjectOnly', task ':connectivity_plus:mergeDebugJniLibFolders', task ':connectivity_plus:mergeDebugNativeLibs', task ':connectivity_plus:copyDebugJniLibsProjectOnly', task ':dchs_motion_sensors:mergeDebugJniLibFolders', task ':dchs_motion_sensors:mergeDebugNativeLibs', task ':dchs_motion_sensors:copyDebugJniLibsProjectOnly', task ':device_info_plus:mergeDebugJniLibFolders', task ':device_info_plus:mergeDebugNativeLibs', task ':device_info_plus:copyDebugJniLibsProjectOnly', task ':dynamic_color:mergeDebugJniLibFolders', task ':dynamic_color:mergeDebugNativeLibs', task ':dynamic_color:copyDebugJniLibsProjectOnly', task ':exifinterface:mergeDebugJniLibFolders', task ':exifinterface:mergeDebugNativeLibs', task ':exifinterface:copyDebugJniLibsProjectOnly', task ':firebase_core:mergeDebugJniLibFolders', task ':firebase_core:mergeDebugNativeLibs', task ':firebase_core:copyDebugJniLibsProjectOnly', task ':firebase_crashlytics:mergeDebugJniLibFolders', task ':firebase_crashlytics:mergeDebugNativeLibs', task ':firebase_crashlytics:copyDebugJniLibsProjectOnly', task ':floating:mergeDebugJniLibFolders', task ':floating:mergeDebugNativeLibs', task ':floating:copyDebugJniLibsProjectOnly', task ':flutter_displaymode:mergeDebugJniLibFolders', task ':flutter_displaymode:mergeDebugNativeLibs', task ':flutter_displaymode:copyDebugJniLibsProjectOnly', task ':flutter_plugin_android_lifecycle:mergeDebugJniLibFolders', task ':flutter_plugin_android_lifecycle:mergeDebugNativeLibs', task ':flutter_plugin_android_lifecycle:copyDebugJniLibsProjectOnly', task ':flutter_secure_storage:mergeDebugJniLibFolders', task ':flutter_secure_storage:mergeDebugNativeLibs', task ':flutter_secure_storage:copyDebugJniLibsProjectOnly', task ':google_api_availability_android:mergeDebugJniLibFolders', task ':google_api_availability_android:mergeDebugNativeLibs', task ':google_api_availability_android:copyDebugJniLibsProjectOnly', task ':google_cast:mergeDebugJniLibFolders', task ':google_cast:mergeDebugNativeLibs', task ':google_cast:copyDebugJniLibsProjectOnly', task ':google_maps_flutter_android:mergeDebugJniLibFolders', task ':google_maps_flutter_android:mergeDebugNativeLibs', task ':google_maps_flutter_android:copyDebugJniLibsProjectOnly', task ':jni:configureCMakeDebug[arm64-v8a]', task ':jni:buildCMakeDebug[arm64-v8a]', task ':jni:configureCMakeDebug[armeabi-v7a]', task ':jni:buildCMakeDebug[armeabi-v7a]', task ':jni:configureCMakeDebug[x86]', task ':jni:buildCMakeDebug[x86]', task ':jni:configureCMakeDebug[x86_64]', task ':jni:buildCMakeDebug[x86_64]', task ':jni:mergeDebugJniLibFolders', task ':jni:mergeDebugNativeLibs', task ':jni:copyDebugJniLibsProjectOnly', task ':jni_flutter:mergeDebugJniLibFolders', task ':jni_flutter:mergeDebugNativeLibs', task ':jni_flutter:copyDebugJniLibsProjectOnly', task ':local_auth_android:mergeDebugJniLibFolders', task ':local_auth_android:mergeDebugNativeLibs', task ':local_auth_android:copyDebugJniLibsProjectOnly', task ':media_kit_libs_android_video:mergeDebugJniLibFolders', task ':media_kit_libs_android_video:mergeDebugNativeLibs', task ':media_kit_libs_android_video:copyDebugJniLibsProjectOnly', task ':media_kit_video:mergeDebugJniLibFolders', task ':media_kit_video:mergeDebugNativeLibs', task ':media_kit_video:copyDebugJniLibsProjectOnly', task ':network_info_plus:mergeDebugJniLibFolders', task ':network_info_plus:mergeDebugNativeLibs', task ':network_info_plus:copyDebugJniLibsProjectOnly', task ':package_info_plus:mergeDebugJniLibFolders', task ':package_info_plus:mergeDebugNativeLibs', task ':package_info_plus:copyDebugJniLibsProjectOnly', task ':permission_handler_android:mergeDebugJniLibFolders', task ':permission_handler_android:mergeDebugNativeLibs', task ':permission_handler_android:copyDebugJniLibsProjectOnly', task ':printing:mergeDebugJniLibFolders', task ':printing:mergeDebugNativeLibs', task ':printing:copyDebugJniLibsProjectOnly', task ':screen_brightness_android:mergeDebugJniLibFolders', task ':screen_brightness_android:mergeDebugNativeLibs', task ':screen_brightness_android:copyDebugJniLibsProjectOnly', task ':shared_preferences_android:mergeDebugJniLibFolders', task ':shared_preferences_android:mergeDebugNativeLibs', task ':shared_preferences_android:copyDebugJniLibsProjectOnly', task ':sqflite_android:mergeDebugJniLibFolders', task ':sqflite_android:mergeDebugNativeLibs', task ':sqflite_android:copyDebugJniLibsProjectOnly', task ':streams_channel:mergeDebugJniLibFolders', task ':streams_channel:mergeDebugNativeLibs', task ':streams_channel:copyDebugJniLibsProjectOnly', task ':url_launcher_android:mergeDebugJniLibFolders', task ':url_launcher_android:mergeDebugNativeLibs', task ':url_launcher_android:copyDebugJniLibsProjectOnly', task ':video_player_android:mergeDebugJniLibFolders', task ':video_player_android:mergeDebugNativeLibs', task ':video_player_android:copyDebugJniLibsProjectOnly', task ':volume_controller:mergeDebugJniLibFolders', task ':volume_controller:mergeDebugNativeLibs', task ':volume_controller:copyDebugJniLibsProjectOnly', task ':wakelock_plus:mergeDebugJniLibFolders', task ':wakelock_plus:mergeDebugNativeLibs', task ':wakelock_plus:copyDebugJniLibsProjectOnly', task ':app:mergePlayDebugNativeLibs', task ':app:stripPlayDebugDebugSymbols', task ':app:validateSigningPlayDebug', task ':app:writePlayDebugAppMetadata', task ':app:writePlayDebugSigningConfigVersions', task ':app:packagePlayDebug', task ':app:createPlayDebugApkListingFileRedirect', task ':app:assemblePlayDebug'] +[ ] Tasks that were excluded: [] +[ ] work action Parameters of ClassesDirToClassesTransform (Thread[#384,included builds,5,main]) started. +[ ] work action Parameters of DexingNoClasspathTransform (Thread[#384,included builds,5,main]) started. +[ ] work action Parameters of DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] work action Parameters of IdentityTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] work action Parameters of DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :app:PlayDebugMinSdkCheck (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :app:PlayDebugMinSdkCheck (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :app:PlayDebugMinSdkCheck +[ ] Caching disabled for task ':app:PlayDebugMinSdkCheck' because: +[ ] Build cache is disabled +[ ] Task ':app:PlayDebugMinSdkCheck' is not up-to-date because: +[ ] Task has not declared any outputs despite executing actions. +[ ] Resolve mutations for :app:preBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :app:preBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :app:preBuild UP-TO-DATE +[ ] Skipping task ':app:preBuild' as it has no actions. +[ ] Resolve mutations for :app:prePlayDebugBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :app:prePlayDebugBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :app:prePlayDebugBuild UP-TO-DATE +[ ] Skipping task ':app:prePlayDebugBuild' as it has no actions. +[ ] Resolve mutations for :app:mergePlayDebugNativeDebugMetadata (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :app:mergePlayDebugNativeDebugMetadata (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :app:mergePlayDebugNativeDebugMetadata NO-SOURCE +[ ] Skipping task ':app:mergePlayDebugNativeDebugMetadata' as it has no source files and no previous output files. +[ ] Resolve mutations for :app:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :app:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :app:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':app:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :app:compileFlutterBuildPlayDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :app:compileFlutterBuildPlayDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[+1996 ms] > Task :app:compileFlutterBuildPlayDebug +[ ] Caching disabled for task ':app:compileFlutterBuildPlayDebug' because: +[ ] Build cache is disabled +[ ] Caching has not been enabled for the task +[ ] Task ':app:compileFlutterBuildPlayDebug' is not up-to-date because: +[ ] Value of input property 'verbose' has changed for task ':app:compileFlutterBuildPlayDebug' +[ ] Starting process 'command '/Users/fabio/fvm/versions/3.35.7/bin/flutter''. Working directory: /Volumes/terrain/aves_mio54 Command: /Users/fabio/fvm/versions/3.35.7/bin/flutter --verbose assemble --no-version-check --depfile /Volumes/terrain/aves_mio54/build/app/intermediates/flutter/playDebug/flutter_build.d --output /Volumes/terrain/aves_mio54/build/app/intermediates/flutter/playDebug -dTargetFile=lib/main_play.dart -dTargetPlatform=android -dBuildMode=debug -dTrackWidgetCreation=true --DartDefines=RkxVVFRFUl9BUFBfRkxBVk9SPXBsYXk=,RkxVVFRFUl9WRVJTSU9OPTMuMzUuNw==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049YWRjOTAxMDYyNQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDM1MzE2NTY1YQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My45LjI= -dFlavor=play -dAndroidArchs=android-arm android-arm64 android-x64 -dMinSdkVersion=24 debug_android_application +[ ] Successfully started process 'command '/Users/fabio/fvm/versions/3.35.7/bin/flutter'' +[ ] [ +46 ms] executing: sysctl hw.optional.arm64 +[ ] [ +7 ms] Exit code 1 from: sysctl hw.optional.arm64 +[ ] [ ] sysctl: unknown oid 'hw.optional.arm64' +[ ] [ +10 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update. +[ ] [ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ ] [ +2 ms] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update. +[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update. +[ ] [ +12 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ ] [ +2 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ ] [ +84 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update. +[ ] [ +1 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update. +[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update. +[ ] [ +61 ms] Initializing file store +[ ] [ +24 ms] Done initializing file store +[ ] [ +214 ms] Skipping target: gen_localizations +[ ] [ +2 ms] Skipping target: gen_dart_plugin_registrant +[ ] [ +1 ms] Skipping target: dart_build +[+1892 ms] [+2307 ms] Skipping target: kernel_snapshot_program +[ ] [ +9 ms] Skipping target: install_code_assets +[ ] [ +3 ms] invalidated build due to missing files: /Volumes/terrain/aves_mio54/DOES_NOT_EXIST_RERUN_FOR_WILDCARD473866709 +[+1389 ms] [+1406 ms] debug_android_application: Starting due to {InvalidatedReasonKind.inputMissing: The following inputs were missing: /Volumes/terrain/aves_mio54/DOES_NOT_EXIST_RERUN_FOR_WILDCARD473866709} +[ +599 ms] [ +594 ms] Manifest contained wildcard assets. Inserting missing file into build graph to force rerun. for more information see #56466. +[ ] [ +10 ms] shaderc command: [/Users/fabio/fvm/versions/3.35.7/bin/cache/artifacts/engine/darwin-x64/impellerc, --sksl, --runtime-stage-gles, --runtime-stage-gles3, --runtime-stage-vulkan, --iplr, --sl=/Volumes/terrain/aves_mio54/build/app/intermediates/flutter/playDebug/flutter_assets/shaders/ink_sparkle.frag, --spirv=/Volumes/terrain/aves_mio54/build/app/intermediates/flutter/playDebug/flutter_assets/shaders/ink_sparkle.frag.spirv, --input=/Users/fabio/fvm/versions/3.35.7/packages/flutter/lib/src/material/shaders/ink_sparkle.frag, --input-type=frag, --include=/Users/fabio/fvm/versions/3.35.7/packages/flutter/lib/src/material/shaders, --include=/Users/fabio/fvm/versions/3.35.7/bin/cache/artifacts/engine/darwin-x64/shader_lib] +[ +902 ms] [ +827 ms] debug_android_application: Complete +[+1098 ms] [+1096 ms] Persisting file store +[ ] [ +20 ms] Done persisting file store +[ ] [ +54 ms] build succeeded. +[ ] [ +12 ms] "flutter assemble" took 6.749ms. +[ ] [ +6 ms] executing: sw_vers -productName +[ +101 ms] [ +20 ms] Exit code 0 from: sw_vers -productName +[ ] [ ] macOS +[ ] [ ] executing: sw_vers -productVersion +[ ] [ +17 ms] Exit code 0 from: sw_vers -productVersion +[ ] [ ] 13.7.7 +[ ] [ ] executing: sw_vers -buildVersion +[ ] [ +16 ms] Exit code 0 from: sw_vers -buildVersion +[ ] [ ] 22H722 +[ ] [ ] executing: uname -m +[ ] [ +6 ms] Exit code 0 from: uname -m +[ ] [ ] x86_64 +[ +100 ms] [ +84 ms] Running 1 shutdown hook +[ ] [ +1 ms] Shutdown hooks complete +[ +97 ms] [ +90 ms] exiting with code 0 +[ ] Resolve mutations for :app:packJniLibsflutterBuildPlayDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :app:packJniLibsflutterBuildPlayDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :app:packJniLibsflutterBuildPlayDebug UP-TO-DATE +[ ] Caching disabled for task ':app:packJniLibsflutterBuildPlayDebug' because: +[ ] Build cache is disabled +[ ] Not worth caching +[ ] Skipping task ':app:packJniLibsflutterBuildPlayDebug' as it is up-to-date. +[ ] Resolve mutations for :aves_screen_state:preBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :aves_screen_state:preBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :aves_screen_state:preBuild UP-TO-DATE +[ ] Skipping task ':aves_screen_state:preBuild' as it has no actions. +[ ] Resolve mutations for :aves_screen_state:preDebugBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :aves_screen_state:preDebugBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :aves_screen_state:preDebugBuild UP-TO-DATE +[ ] Skipping task ':aves_screen_state:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :aves_screen_state:writeDebugAarMetadata (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :aves_screen_state:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] > Task :aves_screen_state:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':aves_screen_state:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :aves_screen_state) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :connectivity_plus:preBuild (Thread[#384,included builds,5,main]) started. +[ ] :connectivity_plus:preBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :connectivity_plus:preBuild UP-TO-DATE +[ ] Skipping task ':connectivity_plus:preBuild' as it has no actions. +[ ] Resolve mutations for :connectivity_plus:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] :connectivity_plus:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :connectivity_plus:preDebugBuild UP-TO-DATE +[ ] Skipping task ':connectivity_plus:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :connectivity_plus:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] :connectivity_plus:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] > Task :connectivity_plus:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':connectivity_plus:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :connectivity_plus) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :dchs_motion_sensors:preBuild (Thread[#384,included builds,5,main]) started. +[ ] :dchs_motion_sensors:preBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :dchs_motion_sensors:preBuild UP-TO-DATE +[ ] Skipping task ':dchs_motion_sensors:preBuild' as it has no actions. +[ ] Resolve mutations for :dchs_motion_sensors:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] :dchs_motion_sensors:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :dchs_motion_sensors:preDebugBuild UP-TO-DATE +[ ] Skipping task ':dchs_motion_sensors:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :dchs_motion_sensors:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] :dchs_motion_sensors:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] > Task :dchs_motion_sensors:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':dchs_motion_sensors:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :dchs_motion_sensors) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :device_info_plus:preBuild (Thread[#384,included builds,5,main]) started. +[ ] :device_info_plus:preBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :device_info_plus:preBuild UP-TO-DATE +[ ] Skipping task ':device_info_plus:preBuild' as it has no actions. +[ ] Resolve mutations for :device_info_plus:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] :device_info_plus:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :device_info_plus:preDebugBuild UP-TO-DATE +[ ] Skipping task ':device_info_plus:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :device_info_plus:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] :device_info_plus:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] > Task :device_info_plus:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':device_info_plus:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :device_info_plus) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :dynamic_color:preBuild (Thread[#384,included builds,5,main]) started. +[ ] :dynamic_color:preBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :dynamic_color:preBuild UP-TO-DATE +[ ] Skipping task ':dynamic_color:preBuild' as it has no actions. +[ ] Resolve mutations for :dynamic_color:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] :dynamic_color:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :dynamic_color:preDebugBuild UP-TO-DATE +[ ] Skipping task ':dynamic_color:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :dynamic_color:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] :dynamic_color:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] > Task :dynamic_color:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':dynamic_color:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :dynamic_color) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :exifinterface:preBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :exifinterface:preBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :exifinterface:preBuild UP-TO-DATE +[ ] Skipping task ':exifinterface:preBuild' as it has no actions. +[ ] Resolve mutations for :exifinterface:preDebugBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :exifinterface:preDebugBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :exifinterface:preDebugBuild UP-TO-DATE +[ ] Skipping task ':exifinterface:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :exifinterface:writeDebugAarMetadata (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :exifinterface:writeDebugAarMetadata (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :exifinterface:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':exifinterface:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :exifinterface) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ +2 ms] Resolve mutations for :firebase_core:preBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_core:preBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_core:preBuild UP-TO-DATE +[ ] Skipping task ':firebase_core:preBuild' as it has no actions. +[ ] Resolve mutations for :firebase_core:preDebugBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_core:preDebugBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_core:preDebugBuild UP-TO-DATE +[ ] Skipping task ':firebase_core:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :firebase_core:writeDebugAarMetadata (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_core:writeDebugAarMetadata (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_core:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':firebase_core:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :firebase_core) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :firebase_crashlytics:preBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_crashlytics:preBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_crashlytics:preBuild UP-TO-DATE +[ ] Skipping task ':firebase_crashlytics:preBuild' as it has no actions. +[ ] Resolve mutations for :firebase_crashlytics:preDebugBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_crashlytics:preDebugBuild (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_crashlytics:preDebugBuild UP-TO-DATE +[ ] Skipping task ':firebase_crashlytics:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :firebase_crashlytics:writeDebugAarMetadata (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_crashlytics:writeDebugAarMetadata (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_crashlytics:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':firebase_crashlytics:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :firebase_crashlytics) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :floating:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :floating:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :floating:preBuild UP-TO-DATE +[ ] Skipping task ':floating:preBuild' as it has no actions. +[ ] Resolve mutations for :floating:preDebugBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :floating:preDebugBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :floating:preDebugBuild UP-TO-DATE +[ ] Skipping task ':floating:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :floating:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] :floating:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :floating:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':floating:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':floating:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :floating) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_displaymode:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_displaymode:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_displaymode:preBuild UP-TO-DATE +[ ] Skipping task ':flutter_displaymode:preBuild' as it has no actions. +[ ] Resolve mutations for :flutter_displaymode:preDebugBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_displaymode:preDebugBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_displaymode:preDebugBuild UP-TO-DATE +[ ] Skipping task ':flutter_displaymode:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :flutter_displaymode:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_displaymode:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_displaymode:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':flutter_displaymode:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :flutter_displaymode) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:preBuild UP-TO-DATE +[ ] Skipping task ':flutter_plugin_android_lifecycle:preBuild' as it has no actions. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:preDebugBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:preDebugBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:preDebugBuild UP-TO-DATE +[ ] Skipping task ':flutter_plugin_android_lifecycle:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':flutter_plugin_android_lifecycle:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :flutter_plugin_android_lifecycle) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_secure_storage:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_secure_storage:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_secure_storage:preBuild UP-TO-DATE +[ ] Skipping task ':flutter_secure_storage:preBuild' as it has no actions. +[ ] Resolve mutations for :flutter_secure_storage:preDebugBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_secure_storage:preDebugBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_secure_storage:preDebugBuild UP-TO-DATE +[ ] Skipping task ':flutter_secure_storage:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :flutter_secure_storage:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_secure_storage:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_secure_storage:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':flutter_secure_storage:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :flutter_secure_storage) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_api_availability_android:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :google_api_availability_android:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_api_availability_android:preBuild UP-TO-DATE +[ ] Skipping task ':google_api_availability_android:preBuild' as it has no actions. +[ ] Resolve mutations for :google_api_availability_android:preDebugBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :google_api_availability_android:preDebugBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_api_availability_android:preDebugBuild UP-TO-DATE +[ ] Skipping task ':google_api_availability_android:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :google_api_availability_android:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] :google_api_availability_android:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_api_availability_android:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':google_api_availability_android:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :google_api_availability_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_cast:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :google_cast:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_cast:preBuild UP-TO-DATE +[ ] Skipping task ':google_cast:preBuild' as it has no actions. +[ ] Resolve mutations for :google_cast:preDebugBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :google_cast:preDebugBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_cast:preDebugBuild UP-TO-DATE +[ ] Skipping task ':google_cast:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :google_cast:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] :google_cast:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_cast:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':google_cast:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':google_cast:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :google_cast) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_maps_flutter_android:preBuild (Thread[#384,included builds,5,main]) started. +[ ] :google_maps_flutter_android:preBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_maps_flutter_android:preBuild UP-TO-DATE +[ ] Skipping task ':google_maps_flutter_android:preBuild' as it has no actions. +[ ] Resolve mutations for :google_maps_flutter_android:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] :google_maps_flutter_android:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_maps_flutter_android:preDebugBuild UP-TO-DATE +[ ] Skipping task ':google_maps_flutter_android:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :google_maps_flutter_android:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] :google_maps_flutter_android:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_maps_flutter_android:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':google_maps_flutter_android:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :google_maps_flutter_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :jni:preBuild (Thread[#384,included builds,5,main]) started. +[ ] :jni:preBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni:preBuild UP-TO-DATE +[ ] Skipping task ':jni:preBuild' as it has no actions. +[ ] Resolve mutations for :jni:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] :jni:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni:preDebugBuild UP-TO-DATE +[ ] Skipping task ':jni:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :jni:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] :jni:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':jni:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':jni:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :jni) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :jni_flutter:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :jni_flutter:preBuild (Thread[#384,included builds,5,main]) started. +[ +71 ms] > Task :jni_flutter:preBuild UP-TO-DATE +[ ] Skipping task ':jni_flutter:preBuild' as it has no actions. +[ ] Resolve mutations for :jni_flutter:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] :jni_flutter:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni_flutter:preDebugBuild UP-TO-DATE +[ ] Skipping task ':jni_flutter:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :jni_flutter:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] :jni_flutter:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni_flutter:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':jni_flutter:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :jni_flutter) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :local_auth_android:preBuild (Thread[#384,included builds,5,main]) started. +[ ] :local_auth_android:preBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :local_auth_android:preBuild UP-TO-DATE +[ ] Skipping task ':local_auth_android:preBuild' as it has no actions. +[ ] Resolve mutations for :local_auth_android:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] :local_auth_android:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :local_auth_android:preDebugBuild UP-TO-DATE +[ ] Skipping task ':local_auth_android:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :local_auth_android:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] :local_auth_android:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] > Task :local_auth_android:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':local_auth_android:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :local_auth_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :media_kit_libs_android_video:preBuild (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_libs_android_video:preBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_libs_android_video:preBuild UP-TO-DATE +[ ] Skipping task ':media_kit_libs_android_video:preBuild' as it has no actions. +[ ] Resolve mutations for :media_kit_libs_android_video:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_libs_android_video:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_libs_android_video:preDebugBuild UP-TO-DATE +[ ] Skipping task ':media_kit_libs_android_video:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :media_kit_libs_android_video:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_libs_android_video:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_libs_android_video:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':media_kit_libs_android_video:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :media_kit_libs_android_video) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :media_kit_video:preBuild (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_video:preBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_video:preBuild UP-TO-DATE +[ ] Skipping task ':media_kit_video:preBuild' as it has no actions. +[ ] Resolve mutations for :media_kit_video:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_video:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_video:preDebugBuild UP-TO-DATE +[ ] Skipping task ':media_kit_video:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :media_kit_video:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_video:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :media_kit_video:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':media_kit_video:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :media_kit_video) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :network_info_plus:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :network_info_plus:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :network_info_plus:preBuild UP-TO-DATE +[ ] Skipping task ':network_info_plus:preBuild' as it has no actions. +[ ] Resolve mutations for :network_info_plus:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :network_info_plus:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :network_info_plus:preDebugBuild UP-TO-DATE +[ ] Skipping task ':network_info_plus:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :network_info_plus:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :network_info_plus:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :network_info_plus:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':network_info_plus:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :network_info_plus) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :package_info_plus:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :package_info_plus:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :package_info_plus:preBuild UP-TO-DATE +[ ] Skipping task ':package_info_plus:preBuild' as it has no actions. +[ ] Resolve mutations for :package_info_plus:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :package_info_plus:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :package_info_plus:preDebugBuild UP-TO-DATE +[ ] Skipping task ':package_info_plus:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :package_info_plus:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :package_info_plus:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :package_info_plus:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':package_info_plus:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :package_info_plus) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :permission_handler_android:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :permission_handler_android:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :permission_handler_android:preBuild UP-TO-DATE +[ ] Skipping task ':permission_handler_android:preBuild' as it has no actions. +[ ] Resolve mutations for :permission_handler_android:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :permission_handler_android:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :permission_handler_android:preDebugBuild UP-TO-DATE +[ ] Skipping task ':permission_handler_android:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :permission_handler_android:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :permission_handler_android:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :permission_handler_android:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':permission_handler_android:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :permission_handler_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :printing:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :printing:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :printing:preBuild UP-TO-DATE +[ ] Skipping task ':printing:preBuild' as it has no actions. +[ ] Resolve mutations for :printing:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :printing:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :printing:preDebugBuild UP-TO-DATE +[ ] Skipping task ':printing:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :printing:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :printing:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :printing:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':printing:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':printing:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :printing) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :screen_brightness_android:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :screen_brightness_android:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :screen_brightness_android:preBuild UP-TO-DATE +[ ] Skipping task ':screen_brightness_android:preBuild' as it has no actions. +[ ] Resolve mutations for :screen_brightness_android:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :screen_brightness_android:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :screen_brightness_android:preDebugBuild UP-TO-DATE +[ ] Skipping task ':screen_brightness_android:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :screen_brightness_android:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :screen_brightness_android:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :screen_brightness_android:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':screen_brightness_android:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :screen_brightness_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :shared_preferences_android:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :shared_preferences_android:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :shared_preferences_android:preBuild UP-TO-DATE +[ ] Skipping task ':shared_preferences_android:preBuild' as it has no actions. +[ ] Resolve mutations for :shared_preferences_android:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :shared_preferences_android:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :shared_preferences_android:preDebugBuild UP-TO-DATE +[ ] Skipping task ':shared_preferences_android:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :shared_preferences_android:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :shared_preferences_android:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :shared_preferences_android:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':shared_preferences_android:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :shared_preferences_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :sqflite_android:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :sqflite_android:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :sqflite_android:preBuild UP-TO-DATE +[ ] Skipping task ':sqflite_android:preBuild' as it has no actions. +[ ] Resolve mutations for :sqflite_android:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :sqflite_android:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :sqflite_android:preDebugBuild UP-TO-DATE +[ ] Skipping task ':sqflite_android:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :sqflite_android:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :sqflite_android:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :sqflite_android:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':sqflite_android:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :sqflite_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :streams_channel:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :streams_channel:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :streams_channel:preBuild UP-TO-DATE +[ ] Skipping task ':streams_channel:preBuild' as it has no actions. +[ ] Resolve mutations for :streams_channel:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :streams_channel:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :streams_channel:preDebugBuild UP-TO-DATE +[ ] Skipping task ':streams_channel:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :streams_channel:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :streams_channel:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :streams_channel:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':streams_channel:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :streams_channel) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :url_launcher_android:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :url_launcher_android:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :url_launcher_android:preBuild UP-TO-DATE +[ ] Skipping task ':url_launcher_android:preBuild' as it has no actions. +[ ] Resolve mutations for :url_launcher_android:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :url_launcher_android:preDebugBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :url_launcher_android:preDebugBuild UP-TO-DATE +[ ] Skipping task ':url_launcher_android:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :url_launcher_android:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :url_launcher_android:writeDebugAarMetadata (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :url_launcher_android:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':url_launcher_android:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :url_launcher_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :video_player_android:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :video_player_android:preBuild (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :video_player_android:preBuild UP-TO-DATE +[ ] Skipping task ':video_player_android:preBuild' as it has no actions. +[ ] Resolve mutations for :video_player_android:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] :video_player_android:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :video_player_android:preDebugBuild UP-TO-DATE +[ ] Skipping task ':video_player_android:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :video_player_android:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] :video_player_android:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] > Task :video_player_android:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':video_player_android:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :video_player_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :volume_controller:preBuild (Thread[#384,included builds,5,main]) started. +[ ] :volume_controller:preBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :volume_controller:preBuild UP-TO-DATE +[ ] Skipping task ':volume_controller:preBuild' as it has no actions. +[ ] Resolve mutations for :volume_controller:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] :volume_controller:preDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :volume_controller:preDebugBuild UP-TO-DATE +[ ] Skipping task ':volume_controller:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :volume_controller:writeDebugAarMetadata (Thread[#384,included builds,5,main]) started. +[ ] :volume_controller:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :volume_controller:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':volume_controller:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :volume_controller) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :wakelock_plus:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:preBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :wakelock_plus:preBuild UP-TO-DATE +[ ] Skipping task ':wakelock_plus:preBuild' as it has no actions. +[ ] Resolve mutations for :wakelock_plus:preDebugBuild (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:preDebugBuild (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :wakelock_plus:preDebugBuild UP-TO-DATE +[ ] Skipping task ':wakelock_plus:preDebugBuild' as it has no actions. +[ ] Resolve mutations for :wakelock_plus:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:writeDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :wakelock_plus:writeDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:writeDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':wakelock_plus:writeDebugAarMetadata' as it is up-to-date. +[ ] work action resolve aar-metadata.properties (project :wakelock_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :app:checkPlayDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ ] :app:checkPlayDebugAarMetadata (Thread[#385,Execution worker,5,main]) started. +[ +271 ms] > Task :app:checkPlayDebugAarMetadata UP-TO-DATE +[ ] Caching disabled for task ':app:checkPlayDebugAarMetadata' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':app:checkPlayDebugAarMetadata' as it is up-to-date. +[ ] Resolve mutations for :aves_screen_state:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :aves_screen_state:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':aves_screen_state:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :aves_screen_state) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :connectivity_plus:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :connectivity_plus:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :connectivity_plus:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':connectivity_plus:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :connectivity_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dchs_motion_sensors:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :dchs_motion_sensors:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dchs_motion_sensors:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':dchs_motion_sensors:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :dchs_motion_sensors) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :device_info_plus:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :device_info_plus:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :device_info_plus:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':device_info_plus:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :device_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dynamic_color:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :dynamic_color:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dynamic_color:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':dynamic_color:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :dynamic_color) (Thread[#385,Execution worker,5,main]) started. +[ +95 ms] Resolve mutations for :exifinterface:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :exifinterface:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :exifinterface:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':exifinterface:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :exifinterface) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :firebase_core:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_core:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_core:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_core:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :firebase_core) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :firebase_crashlytics:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_crashlytics:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_crashlytics:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_crashlytics:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :firebase_crashlytics) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :floating:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :floating:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :floating:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':floating:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':floating:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :floating) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_displaymode:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_displaymode:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_displaymode:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_displaymode:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :flutter_displaymode) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_plugin_android_lifecycle:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :flutter_plugin_android_lifecycle) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_secure_storage:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_secure_storage:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_secure_storage:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_secure_storage:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :flutter_secure_storage) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_api_availability_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :google_api_availability_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_api_availability_android:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_api_availability_android:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :google_api_availability_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_cast:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :google_cast:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_cast:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':google_cast:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_cast:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :google_cast) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_maps_flutter_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :google_maps_flutter_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_maps_flutter_android:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_maps_flutter_android:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :google_maps_flutter_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :jni:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':jni:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :jni) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni_flutter:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :jni_flutter:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni_flutter:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni_flutter:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :jni_flutter) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :local_auth_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :local_auth_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :local_auth_android:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':local_auth_android:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :local_auth_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :media_kit_libs_android_video:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :media_kit_libs_android_video:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :media_kit_libs_android_video:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_libs_android_video:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :media_kit_libs_android_video) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :media_kit_video:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :media_kit_video:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :media_kit_video:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_video:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :media_kit_video) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :network_info_plus:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :network_info_plus:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :network_info_plus:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':network_info_plus:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :network_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :package_info_plus:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :package_info_plus:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :package_info_plus:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':package_info_plus:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :package_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :permission_handler_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :permission_handler_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :permission_handler_android:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':permission_handler_android:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :permission_handler_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :printing:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :printing:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :printing:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':printing:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':printing:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :printing) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :screen_brightness_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :screen_brightness_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :screen_brightness_android:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':screen_brightness_android:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :screen_brightness_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :shared_preferences_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :shared_preferences_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :shared_preferences_android:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':shared_preferences_android:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :shared_preferences_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :sqflite_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :sqflite_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :sqflite_android:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':sqflite_android:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :sqflite_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :streams_channel:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :streams_channel:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :streams_channel:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':streams_channel:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :streams_channel) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :url_launcher_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :url_launcher_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :url_launcher_android:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':url_launcher_android:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :url_launcher_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :video_player_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :video_player_android:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :video_player_android:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':video_player_android:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :video_player_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :volume_controller:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :volume_controller:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :volume_controller:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':volume_controller:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :volume_controller) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :wakelock_plus:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:processDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :wakelock_plus:processDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:processDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':wakelock_plus:processDebugNavigationResources' as it is up-to-date. +[ ] work action resolve debug (project :wakelock_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :app:processPlayDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :app:processPlayDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:processPlayDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':app:processPlayDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:processPlayDebugNavigationResources' as it is up-to-date. +[ ] Resolve mutations for :app:compilePlayDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] :app:compilePlayDebugNavigationResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:compilePlayDebugNavigationResources UP-TO-DATE +[ ] Caching disabled for task ':app:compilePlayDebugNavigationResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:compilePlayDebugNavigationResources' as it is up-to-date. +[ ] Resolve mutations for :app:cleanMergePlayDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :app:cleanMergePlayDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:cleanMergePlayDebugAssets +[ ] Caching disabled for task ':app:cleanMergePlayDebugAssets' because: +[ ] Build cache is disabled +[ ] Task ':app:cleanMergePlayDebugAssets' is not up-to-date because: +[ ] Task has not declared any outputs despite executing actions. +[ ] Resolve mutations for :app:mergePlayDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :app:mergePlayDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:mergePlayDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':app:mergePlayDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':app:mergePlayDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :app:compilePlayDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :app:compilePlayDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:compilePlayDebugShaders NO-SOURCE +[ ] Skipping task ':app:compilePlayDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :app:generatePlayDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :app:generatePlayDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:generatePlayDebugAssets UP-TO-DATE +[ ] Skipping task ':app:generatePlayDebugAssets' as it has no actions. +[ ] Resolve mutations for :aves_screen_state:mergeDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:mergeDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :aves_screen_state:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':aves_screen_state:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :aves_screen_state:compileDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:compileDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :aves_screen_state:compileDebugShaders NO-SOURCE +[ ] Skipping task ':aves_screen_state:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :aves_screen_state:generateDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:generateDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :aves_screen_state:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':aves_screen_state:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :aves_screen_state:mergeDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:mergeDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :aves_screen_state:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':aves_screen_state:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :aves_screen_state) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :connectivity_plus:mergeDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :connectivity_plus:mergeDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :connectivity_plus:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':connectivity_plus:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :connectivity_plus:compileDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :connectivity_plus:compileDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :connectivity_plus:compileDebugShaders NO-SOURCE +[ ] Skipping task ':connectivity_plus:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :connectivity_plus:generateDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :connectivity_plus:generateDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :connectivity_plus:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':connectivity_plus:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :connectivity_plus:mergeDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :connectivity_plus:mergeDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :connectivity_plus:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':connectivity_plus:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :connectivity_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dchs_motion_sensors:mergeDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :dchs_motion_sensors:mergeDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dchs_motion_sensors:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':dchs_motion_sensors:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :dchs_motion_sensors:compileDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :dchs_motion_sensors:compileDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dchs_motion_sensors:compileDebugShaders NO-SOURCE +[ ] Skipping task ':dchs_motion_sensors:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :dchs_motion_sensors:generateDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :dchs_motion_sensors:generateDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dchs_motion_sensors:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':dchs_motion_sensors:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :dchs_motion_sensors:mergeDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :dchs_motion_sensors:mergeDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dchs_motion_sensors:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':dchs_motion_sensors:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :dchs_motion_sensors) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :device_info_plus:mergeDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :device_info_plus:mergeDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :device_info_plus:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':device_info_plus:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :device_info_plus:compileDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :device_info_plus:compileDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :device_info_plus:compileDebugShaders NO-SOURCE +[ ] Skipping task ':device_info_plus:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :device_info_plus:generateDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :device_info_plus:generateDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :device_info_plus:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':device_info_plus:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :device_info_plus:mergeDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :device_info_plus:mergeDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :device_info_plus:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':device_info_plus:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :device_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dynamic_color:mergeDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :dynamic_color:mergeDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dynamic_color:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':dynamic_color:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :dynamic_color:compileDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :dynamic_color:compileDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dynamic_color:compileDebugShaders NO-SOURCE +[ ] Skipping task ':dynamic_color:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :dynamic_color:generateDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :dynamic_color:generateDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dynamic_color:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':dynamic_color:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :dynamic_color:mergeDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :dynamic_color:mergeDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dynamic_color:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':dynamic_color:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :dynamic_color) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :exifinterface:mergeDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :exifinterface:mergeDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :exifinterface:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':exifinterface:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :exifinterface:compileDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :exifinterface:compileDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :exifinterface:compileDebugShaders NO-SOURCE +[ ] Skipping task ':exifinterface:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :exifinterface:generateDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :exifinterface:generateDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :exifinterface:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':exifinterface:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :exifinterface:mergeDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :exifinterface:mergeDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :exifinterface:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':exifinterface:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :exifinterface) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :firebase_core:mergeDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_core:mergeDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_core:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':firebase_core:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :firebase_core:compileDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_core:compileDebugShaders (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_core:compileDebugShaders NO-SOURCE +[ ] Skipping task ':firebase_core:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :firebase_core:generateDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_core:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :firebase_core:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':firebase_core:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :firebase_core:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :firebase_core:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :firebase_core:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':firebase_core:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :firebase_core) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :firebase_crashlytics:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :firebase_crashlytics:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :firebase_crashlytics:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':firebase_crashlytics:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :firebase_crashlytics:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :firebase_crashlytics:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ +64 ms] > Task :firebase_crashlytics:compileDebugShaders NO-SOURCE +[ ] Skipping task ':firebase_crashlytics:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :firebase_crashlytics:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :firebase_crashlytics:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :firebase_crashlytics:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':firebase_crashlytics:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :firebase_crashlytics:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :firebase_crashlytics:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :firebase_crashlytics:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':firebase_crashlytics:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :firebase_crashlytics) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :floating:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :floating:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :floating:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':floating:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':floating:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :floating:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :floating:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :floating:compileDebugShaders NO-SOURCE +[ ] Skipping task ':floating:compileDebugShaders' as it has no source files and no previous output files. +[ +1 ms] Resolve mutations for :floating:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :floating:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :floating:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':floating:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :floating:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :floating:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :floating:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':floating:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':floating:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :floating) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :flutter_displaymode:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :flutter_displaymode:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_displaymode:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_displaymode:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :flutter_displaymode:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :flutter_displaymode:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_displaymode:compileDebugShaders NO-SOURCE +[ ] Skipping task ':flutter_displaymode:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :flutter_displaymode:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :flutter_displaymode:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_displaymode:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':flutter_displaymode:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :flutter_displaymode:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :flutter_displaymode:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_displaymode:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_displaymode:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :flutter_displaymode) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_plugin_android_lifecycle:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:compileDebugShaders NO-SOURCE +[ ] Skipping task ':flutter_plugin_android_lifecycle:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':flutter_plugin_android_lifecycle:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_plugin_android_lifecycle:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :flutter_plugin_android_lifecycle) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :flutter_secure_storage:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :flutter_secure_storage:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_secure_storage:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_secure_storage:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :flutter_secure_storage:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :flutter_secure_storage:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_secure_storage:compileDebugShaders NO-SOURCE +[ ] Skipping task ':flutter_secure_storage:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :flutter_secure_storage:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :flutter_secure_storage:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_secure_storage:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':flutter_secure_storage:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :flutter_secure_storage:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :flutter_secure_storage:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_secure_storage:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_secure_storage:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :flutter_secure_storage) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :google_api_availability_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :google_api_availability_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_api_availability_android:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_api_availability_android:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :google_api_availability_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :google_api_availability_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_api_availability_android:compileDebugShaders NO-SOURCE +[ ] Skipping task ':google_api_availability_android:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :google_api_availability_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :google_api_availability_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_api_availability_android:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':google_api_availability_android:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :google_api_availability_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :google_api_availability_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_api_availability_android:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_api_availability_android:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :google_api_availability_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :google_cast:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :google_cast:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_cast:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':google_cast:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_cast:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :google_cast:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :google_cast:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_cast:compileDebugShaders NO-SOURCE +[ ] Skipping task ':google_cast:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :google_cast:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :google_cast:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_cast:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':google_cast:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :google_cast:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :google_cast:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_cast:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':google_cast:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_cast:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :google_cast) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :google_maps_flutter_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :google_maps_flutter_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_maps_flutter_android:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_maps_flutter_android:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :google_maps_flutter_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :google_maps_flutter_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_maps_flutter_android:compileDebugShaders NO-SOURCE +[ ] Skipping task ':google_maps_flutter_android:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :google_maps_flutter_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :google_maps_flutter_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_maps_flutter_android:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':google_maps_flutter_android:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :google_maps_flutter_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :google_maps_flutter_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_maps_flutter_android:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_maps_flutter_android:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :google_maps_flutter_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :jni:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :jni:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':jni:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':jni:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :jni:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :jni:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni:compileDebugShaders NO-SOURCE +[ ] Skipping task ':jni:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :jni:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :jni:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':jni:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :jni:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :jni:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':jni:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':jni:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :jni) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :jni_flutter:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :jni_flutter:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni_flutter:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':jni_flutter:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :jni_flutter:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :jni_flutter:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni_flutter:compileDebugShaders NO-SOURCE +[ ] Skipping task ':jni_flutter:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :jni_flutter:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :jni_flutter:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni_flutter:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':jni_flutter:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :jni_flutter:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :jni_flutter:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni_flutter:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':jni_flutter:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :jni_flutter) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :local_auth_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :local_auth_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :local_auth_android:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':local_auth_android:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :local_auth_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :local_auth_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :local_auth_android:compileDebugShaders NO-SOURCE +[ ] Skipping task ':local_auth_android:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :local_auth_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :local_auth_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :local_auth_android:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':local_auth_android:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :local_auth_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :local_auth_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :local_auth_android:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':local_auth_android:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :local_auth_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :media_kit_libs_android_video:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_libs_android_video:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_libs_android_video:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':media_kit_libs_android_video:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :media_kit_libs_android_video:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_libs_android_video:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_libs_android_video:compileDebugShaders NO-SOURCE +[ ] Skipping task ':media_kit_libs_android_video:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :media_kit_libs_android_video:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_libs_android_video:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_libs_android_video:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':media_kit_libs_android_video:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :media_kit_libs_android_video:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_libs_android_video:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_libs_android_video:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':media_kit_libs_android_video:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :media_kit_libs_android_video) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :media_kit_video:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_video:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_video:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':media_kit_video:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :media_kit_video:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_video:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_video:compileDebugShaders NO-SOURCE +[ ] Skipping task ':media_kit_video:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :media_kit_video:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_video:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_video:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':media_kit_video:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :media_kit_video:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_video:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_video:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':media_kit_video:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :media_kit_video) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :network_info_plus:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :network_info_plus:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :network_info_plus:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':network_info_plus:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :network_info_plus:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :network_info_plus:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :network_info_plus:compileDebugShaders NO-SOURCE +[ ] Skipping task ':network_info_plus:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :network_info_plus:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :network_info_plus:generateDebugAssets (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :network_info_plus:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':network_info_plus:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :network_info_plus:mergeDebugAssets (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :network_info_plus:mergeDebugAssets (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :network_info_plus:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':network_info_plus:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :network_info_plus) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :package_info_plus:mergeDebugShaders (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :package_info_plus:mergeDebugShaders (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :package_info_plus:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':package_info_plus:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :package_info_plus:compileDebugShaders (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :package_info_plus:compileDebugShaders (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :package_info_plus:compileDebugShaders NO-SOURCE +[ ] Skipping task ':package_info_plus:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :package_info_plus:generateDebugAssets (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :package_info_plus:generateDebugAssets (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :package_info_plus:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':package_info_plus:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :package_info_plus:mergeDebugAssets (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :package_info_plus:mergeDebugAssets (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :package_info_plus:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':package_info_plus:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :package_info_plus) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :permission_handler_android:mergeDebugShaders (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :permission_handler_android:mergeDebugShaders (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :permission_handler_android:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':permission_handler_android:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :permission_handler_android:compileDebugShaders (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :permission_handler_android:compileDebugShaders (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :permission_handler_android:compileDebugShaders NO-SOURCE +[ ] Skipping task ':permission_handler_android:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :permission_handler_android:generateDebugAssets (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :permission_handler_android:generateDebugAssets (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :permission_handler_android:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':permission_handler_android:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :permission_handler_android:mergeDebugAssets (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :permission_handler_android:mergeDebugAssets (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :permission_handler_android:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':permission_handler_android:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :permission_handler_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :printing:mergeDebugShaders (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :printing:mergeDebugShaders (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :printing:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':printing:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':printing:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :printing:compileDebugShaders (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :printing:compileDebugShaders (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :printing:compileDebugShaders NO-SOURCE +[ ] Skipping task ':printing:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :printing:generateDebugAssets (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :printing:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :printing:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':printing:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :printing:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :printing:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :printing:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':printing:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':printing:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :printing) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :screen_brightness_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :screen_brightness_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :screen_brightness_android:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':screen_brightness_android:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :screen_brightness_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :screen_brightness_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :screen_brightness_android:compileDebugShaders NO-SOURCE +[ ] Skipping task ':screen_brightness_android:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :screen_brightness_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :screen_brightness_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :screen_brightness_android:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':screen_brightness_android:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :screen_brightness_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :screen_brightness_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :screen_brightness_android:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':screen_brightness_android:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :screen_brightness_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :shared_preferences_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :shared_preferences_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :shared_preferences_android:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':shared_preferences_android:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :shared_preferences_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :shared_preferences_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :shared_preferences_android:compileDebugShaders NO-SOURCE +[ ] Skipping task ':shared_preferences_android:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :shared_preferences_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :shared_preferences_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :shared_preferences_android:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':shared_preferences_android:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :shared_preferences_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :shared_preferences_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :shared_preferences_android:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':shared_preferences_android:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :shared_preferences_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :sqflite_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :sqflite_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :sqflite_android:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':sqflite_android:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :sqflite_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :sqflite_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :sqflite_android:compileDebugShaders NO-SOURCE +[ ] Skipping task ':sqflite_android:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :sqflite_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :sqflite_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :sqflite_android:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':sqflite_android:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :sqflite_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :sqflite_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :sqflite_android:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':sqflite_android:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :sqflite_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :streams_channel:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :streams_channel:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :streams_channel:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':streams_channel:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :streams_channel:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :streams_channel:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :streams_channel:compileDebugShaders NO-SOURCE +[ ] Skipping task ':streams_channel:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :streams_channel:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :streams_channel:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :streams_channel:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':streams_channel:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :streams_channel:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :streams_channel:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :streams_channel:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':streams_channel:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :streams_channel) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :url_launcher_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :url_launcher_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :url_launcher_android:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':url_launcher_android:mergeDebugShaders' as it is up-to-date. +[ +2 ms] Resolve mutations for :url_launcher_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :url_launcher_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ +64 ms] > Task :url_launcher_android:compileDebugShaders NO-SOURCE +[ ] Skipping task ':url_launcher_android:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :url_launcher_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :url_launcher_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :url_launcher_android:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':url_launcher_android:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :url_launcher_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :url_launcher_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :url_launcher_android:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':url_launcher_android:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :url_launcher_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :video_player_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :video_player_android:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :video_player_android:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':video_player_android:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :video_player_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :video_player_android:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :video_player_android:compileDebugShaders NO-SOURCE +[ ] Skipping task ':video_player_android:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :video_player_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :video_player_android:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :video_player_android:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':video_player_android:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :video_player_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :video_player_android:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :video_player_android:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':video_player_android:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :video_player_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :volume_controller:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :volume_controller:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :volume_controller:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':volume_controller:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :volume_controller:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :volume_controller:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :volume_controller:compileDebugShaders NO-SOURCE +[ ] Skipping task ':volume_controller:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :volume_controller:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :volume_controller:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :volume_controller:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':volume_controller:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :volume_controller:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :volume_controller:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :volume_controller:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':volume_controller:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :volume_controller) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :wakelock_plus:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :wakelock_plus:mergeDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :wakelock_plus:mergeDebugShaders UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:mergeDebugShaders' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':wakelock_plus:mergeDebugShaders' as it is up-to-date. +[ ] Resolve mutations for :wakelock_plus:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] :wakelock_plus:compileDebugShaders (Thread[#384,included builds,5,main]) started. +[ ] > Task :wakelock_plus:compileDebugShaders NO-SOURCE +[ ] Skipping task ':wakelock_plus:compileDebugShaders' as it has no source files and no previous output files. +[ ] Resolve mutations for :wakelock_plus:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :wakelock_plus:generateDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :wakelock_plus:generateDebugAssets UP-TO-DATE +[ ] Skipping task ':wakelock_plus:generateDebugAssets' as it has no actions. +[ ] Resolve mutations for :wakelock_plus:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :wakelock_plus:mergeDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :wakelock_plus:mergeDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:mergeDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':wakelock_plus:mergeDebugAssets' as it is up-to-date. +[ ] work action resolve mergeDebugAssets (project :wakelock_plus) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :app:mergePlayDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] :app:mergePlayDebugAssets (Thread[#384,included builds,5,main]) started. +[ ] > Task :app:mergePlayDebugAssets +[ ] Caching disabled for task ':app:mergePlayDebugAssets' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Task ':app:mergePlayDebugAssets' is not up-to-date because: +[ ] Output property 'outputDir' file /Volumes/terrain/aves_mio54/build/app/intermediates/assets/playDebug/mergePlayDebugAssets has been removed. +[ ] The input changes require a full rebuild for incremental task ':app:mergePlayDebugAssets'. +[ ] Resolve mutations for :app:copyFlutterAssetsPlayDebug (Thread[#384,included builds,5,main]) started. +[ ] :app:copyFlutterAssetsPlayDebug (Thread[#384,included builds,5,main]) started. +[ +686 ms] > Task :app:copyFlutterAssetsPlayDebug +[ ] Caching disabled for task ':app:copyFlutterAssetsPlayDebug' because: +[ ] Build cache is disabled +[ ] Not worth caching +[ ] Task ':app:copyFlutterAssetsPlayDebug' is not up-to-date because: +[ ] Output property 'destinationDir' file /Volumes/terrain/aves_mio54/build/app/intermediates/assets/playDebug/mergePlayDebugAssets/flutter_assets has been removed. +[ ] Output property 'destinationDir' file /Volumes/terrain/aves_mio54/build/app/intermediates/assets/playDebug/mergePlayDebugAssets/flutter_assets/AssetManifest.bin has been removed. +[ ] Output property 'destinationDir' file /Volumes/terrain/aves_mio54/build/app/intermediates/assets/playDebug/mergePlayDebugAssets/flutter_assets/AssetManifest.json has been removed. +[ ] and more... +[ ] Resolve mutations for :app:generatePlayDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :app:generatePlayDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :app:generatePlayDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':app:generatePlayDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:generatePlayDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :app:injectCrashlyticsMappingFileIdPlayDebug (Thread[#384,included builds,5,main]) started. +[ ] :app:injectCrashlyticsMappingFileIdPlayDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :app:injectCrashlyticsMappingFileIdPlayDebug UP-TO-DATE +[ ] Caching disabled for task ':app:injectCrashlyticsMappingFileIdPlayDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:injectCrashlyticsMappingFileIdPlayDebug' as it is up-to-date. +[ ] Resolve mutations for :app:injectCrashlyticsVersionControlInfoPlayDebug (Thread[#384,included builds,5,main]) started. +[ ] :app:injectCrashlyticsVersionControlInfoPlayDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :app:injectCrashlyticsVersionControlInfoPlayDebug UP-TO-DATE +[ ] Caching disabled for task ':app:injectCrashlyticsVersionControlInfoPlayDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:injectCrashlyticsVersionControlInfoPlayDebug' as it is up-to-date. +[ ] Resolve mutations for :app:processPlayDebugGoogleServices (Thread[#384,included builds,5,main]) started. +[ ] :app:processPlayDebugGoogleServices (Thread[#384,included builds,5,main]) started. +[ ] > Task :app:processPlayDebugGoogleServices UP-TO-DATE +[ ] Caching disabled for task ':app:processPlayDebugGoogleServices' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:processPlayDebugGoogleServices' as it is up-to-date. +[ ] Resolve mutations for :aves_screen_state:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :aves_screen_state:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :aves_screen_state:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':aves_screen_state:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :aves_screen_state:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :aves_screen_state:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :aves_screen_state:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':aves_screen_state:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :aves_screen_state:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :aves_screen_state:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :aves_screen_state:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':aves_screen_state:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :aves_screen_state) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :connectivity_plus:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :connectivity_plus:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :connectivity_plus:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':connectivity_plus:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :connectivity_plus:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :connectivity_plus:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :connectivity_plus:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':connectivity_plus:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :connectivity_plus:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :connectivity_plus:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :connectivity_plus:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':connectivity_plus:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :connectivity_plus) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :dchs_motion_sensors:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :dchs_motion_sensors:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :dchs_motion_sensors:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':dchs_motion_sensors:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :dchs_motion_sensors:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :dchs_motion_sensors:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :dchs_motion_sensors:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':dchs_motion_sensors:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :dchs_motion_sensors:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :dchs_motion_sensors:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :dchs_motion_sensors:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':dchs_motion_sensors:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :dchs_motion_sensors) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :device_info_plus:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :device_info_plus:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :device_info_plus:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':device_info_plus:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :device_info_plus:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :device_info_plus:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :device_info_plus:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':device_info_plus:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :device_info_plus:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :device_info_plus:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :device_info_plus:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':device_info_plus:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :device_info_plus) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :dynamic_color:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :dynamic_color:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :dynamic_color:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':dynamic_color:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :dynamic_color:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :dynamic_color:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :dynamic_color:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':dynamic_color:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :dynamic_color:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :dynamic_color:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :dynamic_color:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':dynamic_color:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :dynamic_color) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :exifinterface:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :exifinterface:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :exifinterface:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':exifinterface:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :exifinterface:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :exifinterface:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :exifinterface:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':exifinterface:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :exifinterface:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :exifinterface:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ +1 ms] > Task :exifinterface:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':exifinterface:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :exifinterface) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :firebase_core:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :firebase_core:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :firebase_core:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_core:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :firebase_core:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :firebase_core:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :firebase_core:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_core:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :firebase_core:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :firebase_core:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :firebase_core:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_core:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :firebase_core) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :firebase_crashlytics:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :firebase_crashlytics:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :firebase_crashlytics:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_crashlytics:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :firebase_crashlytics:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :firebase_crashlytics:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :firebase_crashlytics:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_crashlytics:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :firebase_crashlytics:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :firebase_crashlytics:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :firebase_crashlytics:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_crashlytics:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :firebase_crashlytics) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :floating:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :floating:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :floating:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':floating:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':floating:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :floating:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :floating:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :floating:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':floating:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':floating:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :floating:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ +84 ms] :floating:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :floating:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':floating:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':floating:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :floating) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :flutter_displaymode:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :flutter_displaymode:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_displaymode:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_displaymode:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :flutter_displaymode:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :flutter_displaymode:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_displaymode:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_displaymode:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :flutter_displaymode:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :flutter_displaymode:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_displaymode:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_displaymode:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :flutter_displaymode) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_plugin_android_lifecycle:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_plugin_android_lifecycle:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_plugin_android_lifecycle:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :flutter_plugin_android_lifecycle) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :flutter_secure_storage:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :flutter_secure_storage:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_secure_storage:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_secure_storage:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :flutter_secure_storage:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :flutter_secure_storage:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_secure_storage:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_secure_storage:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :flutter_secure_storage:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :flutter_secure_storage:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :flutter_secure_storage:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_secure_storage:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :flutter_secure_storage) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :google_api_availability_android:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :google_api_availability_android:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_api_availability_android:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_api_availability_android:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :google_api_availability_android:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :google_api_availability_android:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_api_availability_android:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_api_availability_android:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :google_api_availability_android:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :google_api_availability_android:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_api_availability_android:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_api_availability_android:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :google_api_availability_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :google_cast:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :google_cast:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_cast:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':google_cast:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_cast:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :google_cast:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :google_cast:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_cast:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':google_cast:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_cast:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :google_cast:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :google_cast:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_cast:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':google_cast:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_cast:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :google_cast) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :google_maps_flutter_android:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :google_maps_flutter_android:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_maps_flutter_android:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_maps_flutter_android:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :google_maps_flutter_android:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :google_maps_flutter_android:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_maps_flutter_android:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_maps_flutter_android:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :google_maps_flutter_android:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :google_maps_flutter_android:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :google_maps_flutter_android:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_maps_flutter_android:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :google_maps_flutter_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :jni:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :jni:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':jni:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :jni:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :jni:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':jni:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :jni:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :jni:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':jni:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :jni) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :jni_flutter:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :jni_flutter:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni_flutter:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni_flutter:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :jni_flutter:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :jni_flutter:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni_flutter:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni_flutter:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :jni_flutter:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :jni_flutter:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :jni_flutter:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni_flutter:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :jni_flutter) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :local_auth_android:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :local_auth_android:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :local_auth_android:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':local_auth_android:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :local_auth_android:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :local_auth_android:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :local_auth_android:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':local_auth_android:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :local_auth_android:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :local_auth_android:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :local_auth_android:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':local_auth_android:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :local_auth_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :media_kit_libs_android_video:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_libs_android_video:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_libs_android_video:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_libs_android_video:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :media_kit_libs_android_video:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_libs_android_video:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_libs_android_video:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_libs_android_video:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :media_kit_libs_android_video:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_libs_android_video:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_libs_android_video:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_libs_android_video:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :media_kit_libs_android_video) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :media_kit_video:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_video:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_video:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_video:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :media_kit_video:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_video:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_video:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_video:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :media_kit_video:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :media_kit_video:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :media_kit_video:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_video:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :media_kit_video) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :network_info_plus:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :network_info_plus:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :network_info_plus:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':network_info_plus:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :network_info_plus:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :network_info_plus:generateDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :network_info_plus:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':network_info_plus:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :network_info_plus:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] :network_info_plus:packageDebugResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :network_info_plus:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':network_info_plus:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :network_info_plus) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :package_info_plus:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] :package_info_plus:generateDebugResValues (Thread[#384,included builds,5,main]) started. +[ ] > Task :package_info_plus:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':package_info_plus:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :package_info_plus:generateDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :package_info_plus:generateDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :package_info_plus:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':package_info_plus:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :package_info_plus:packageDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :package_info_plus:packageDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :package_info_plus:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':package_info_plus:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :package_info_plus) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :permission_handler_android:generateDebugResValues (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :permission_handler_android:generateDebugResValues (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :permission_handler_android:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':permission_handler_android:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :permission_handler_android:generateDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :permission_handler_android:generateDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :permission_handler_android:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':permission_handler_android:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :permission_handler_android:packageDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :permission_handler_android:packageDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :permission_handler_android:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':permission_handler_android:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :permission_handler_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :printing:generateDebugResValues (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :printing:generateDebugResValues (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :printing:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':printing:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':printing:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :printing:generateDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :printing:generateDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :printing:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':printing:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':printing:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :printing:packageDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :printing:packageDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :printing:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':printing:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':printing:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :printing) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :screen_brightness_android:generateDebugResValues (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :screen_brightness_android:generateDebugResValues (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :screen_brightness_android:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':screen_brightness_android:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :screen_brightness_android:generateDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :screen_brightness_android:generateDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :screen_brightness_android:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':screen_brightness_android:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :screen_brightness_android:packageDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :screen_brightness_android:packageDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ +83 ms] > Task :screen_brightness_android:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':screen_brightness_android:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :screen_brightness_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :shared_preferences_android:generateDebugResValues (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :shared_preferences_android:generateDebugResValues (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :shared_preferences_android:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':shared_preferences_android:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :shared_preferences_android:generateDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :shared_preferences_android:generateDebugResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :shared_preferences_android:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':shared_preferences_android:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :shared_preferences_android:packageDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :shared_preferences_android:packageDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :shared_preferences_android:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':shared_preferences_android:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :shared_preferences_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :sqflite_android:generateDebugResValues (Thread[#385,Execution worker,5,main]) started. +[ ] :sqflite_android:generateDebugResValues (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :sqflite_android:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':sqflite_android:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :sqflite_android:generateDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :sqflite_android:generateDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :sqflite_android:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':sqflite_android:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :sqflite_android:packageDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :sqflite_android:packageDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :sqflite_android:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':sqflite_android:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :sqflite_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :streams_channel:generateDebugResValues (Thread[#385,Execution worker,5,main]) started. +[ ] :streams_channel:generateDebugResValues (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :streams_channel:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':streams_channel:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :streams_channel:generateDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :streams_channel:generateDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :streams_channel:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':streams_channel:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :streams_channel:packageDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :streams_channel:packageDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :streams_channel:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':streams_channel:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :streams_channel) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :url_launcher_android:generateDebugResValues (Thread[#385,Execution worker,5,main]) started. +[ ] :url_launcher_android:generateDebugResValues (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :url_launcher_android:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':url_launcher_android:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :url_launcher_android:generateDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :url_launcher_android:generateDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :url_launcher_android:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':url_launcher_android:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :url_launcher_android:packageDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :url_launcher_android:packageDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :url_launcher_android:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':url_launcher_android:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :url_launcher_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :video_player_android:generateDebugResValues (Thread[#385,Execution worker,5,main]) started. +[ ] :video_player_android:generateDebugResValues (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :video_player_android:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':video_player_android:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :video_player_android:generateDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :video_player_android:generateDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :video_player_android:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':video_player_android:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :video_player_android:packageDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :video_player_android:packageDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :video_player_android:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':video_player_android:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :video_player_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :volume_controller:generateDebugResValues (Thread[#385,Execution worker,5,main]) started. +[ ] :volume_controller:generateDebugResValues (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :volume_controller:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':volume_controller:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :volume_controller:generateDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :volume_controller:generateDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :volume_controller:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':volume_controller:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :volume_controller:packageDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :volume_controller:packageDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :volume_controller:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':volume_controller:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :volume_controller) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :wakelock_plus:generateDebugResValues (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:generateDebugResValues (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :wakelock_plus:generateDebugResValues UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:generateDebugResValues' because: +[ ] Build cache is disabled +[ ] Skipping task ':wakelock_plus:generateDebugResValues' as it is up-to-date. +[ ] Resolve mutations for :wakelock_plus:generateDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:generateDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :wakelock_plus:generateDebugResources UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:generateDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':wakelock_plus:generateDebugResources' as it is up-to-date. +[ ] Resolve mutations for :wakelock_plus:packageDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:packageDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :wakelock_plus:packageDebugResources UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:packageDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':wakelock_plus:packageDebugResources' as it is up-to-date. +[ ] work action resolve packageDebugResources (project :wakelock_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :app:mapPlayDebugSourceSetPaths (Thread[#385,Execution worker,5,main]) started. +[ ] :app:mapPlayDebugSourceSetPaths (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:mapPlayDebugSourceSetPaths UP-TO-DATE +[ ] Caching disabled for task ':app:mapPlayDebugSourceSetPaths' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':app:mapPlayDebugSourceSetPaths' as it is up-to-date. +[ ] Resolve mutations for :app:generatePlayDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :app:generatePlayDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:generatePlayDebugResources UP-TO-DATE +[ ] Caching disabled for task ':app:generatePlayDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:generatePlayDebugResources' as it is up-to-date. +[ ] Resolve mutations for :app:mergePlayDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :app:mergePlayDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:mergePlayDebugResources UP-TO-DATE +[ ] Caching disabled for task ':app:mergePlayDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:mergePlayDebugResources' as it is up-to-date. +[ ] Resolve mutations for :app:packagePlayDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :app:packagePlayDebugResources (Thread[#385,Execution worker,5,main]) started. +[ +85 ms] > Task :app:packagePlayDebugResources UP-TO-DATE +[ ] Caching disabled for task ':app:packagePlayDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:packagePlayDebugResources' as it is up-to-date. +[ ] Resolve mutations for :app:parsePlayDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :app:parsePlayDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:parsePlayDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':app:parsePlayDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:parsePlayDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :app:createPlayDebugCompatibleScreenManifests (Thread[#385,Execution worker,5,main]) started. +[ ] :app:createPlayDebugCompatibleScreenManifests (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:createPlayDebugCompatibleScreenManifests UP-TO-DATE +[ ] Caching disabled for task ':app:createPlayDebugCompatibleScreenManifests' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':app:createPlayDebugCompatibleScreenManifests' as it is up-to-date. +[ ] Resolve mutations for :app:extractDeepLinksPlayDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :app:extractDeepLinksPlayDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:extractDeepLinksPlayDebug UP-TO-DATE +[ ] Caching disabled for task ':app:extractDeepLinksPlayDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:extractDeepLinksPlayDebug' as it is up-to-date. +[ ] Resolve mutations for :aves_screen_state:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :aves_screen_state:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':aves_screen_state:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :aves_screen_state) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :aves_screen_state:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :aves_screen_state:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':aves_screen_state:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :aves_screen_state) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :connectivity_plus:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :connectivity_plus:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :connectivity_plus:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':connectivity_plus:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :connectivity_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :connectivity_plus:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :connectivity_plus:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :connectivity_plus:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':connectivity_plus:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :connectivity_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dchs_motion_sensors:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :dchs_motion_sensors:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dchs_motion_sensors:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':dchs_motion_sensors:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :dchs_motion_sensors) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dchs_motion_sensors:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :dchs_motion_sensors:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dchs_motion_sensors:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':dchs_motion_sensors:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :dchs_motion_sensors) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :device_info_plus:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :device_info_plus:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :device_info_plus:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':device_info_plus:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :device_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :device_info_plus:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :device_info_plus:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :device_info_plus:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':device_info_plus:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :device_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dynamic_color:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :dynamic_color:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dynamic_color:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':dynamic_color:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :dynamic_color) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dynamic_color:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :dynamic_color:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dynamic_color:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':dynamic_color:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :dynamic_color) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :exifinterface:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :exifinterface:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :exifinterface:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':exifinterface:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :exifinterface) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :exifinterface:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :exifinterface:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :exifinterface:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':exifinterface:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :exifinterface) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :firebase_core:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_core:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_core:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_core:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :firebase_core) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :firebase_core:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_core:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_core:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_core:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :firebase_core) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :firebase_crashlytics:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_crashlytics:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_crashlytics:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_crashlytics:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :firebase_crashlytics) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :firebase_crashlytics:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_crashlytics:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_crashlytics:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_crashlytics:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :firebase_crashlytics) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :floating:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :floating:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :floating:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':floating:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':floating:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :floating) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :floating:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :floating:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :floating:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':floating:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':floating:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :floating) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_displaymode:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_displaymode:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_displaymode:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_displaymode:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :flutter_displaymode) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_displaymode:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_displaymode:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_displaymode:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_displaymode:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :flutter_displaymode) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_plugin_android_lifecycle:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :flutter_plugin_android_lifecycle) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_plugin_android_lifecycle:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :flutter_plugin_android_lifecycle) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_secure_storage:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_secure_storage:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_secure_storage:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_secure_storage:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :flutter_secure_storage) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_secure_storage:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_secure_storage:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_secure_storage:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_secure_storage:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :flutter_secure_storage) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_api_availability_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :google_api_availability_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_api_availability_android:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_api_availability_android:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :google_api_availability_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_api_availability_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :google_api_availability_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_api_availability_android:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_api_availability_android:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :google_api_availability_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_cast:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :google_cast:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_cast:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':google_cast:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_cast:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :google_cast) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_cast:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :google_cast:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_cast:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':google_cast:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_cast:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :google_cast) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_maps_flutter_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :google_maps_flutter_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_maps_flutter_android:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_maps_flutter_android:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :google_maps_flutter_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_maps_flutter_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :google_maps_flutter_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_maps_flutter_android:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_maps_flutter_android:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :google_maps_flutter_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :jni:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':jni:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :jni) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :jni:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':jni:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :jni) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni_flutter:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :jni_flutter:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni_flutter:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni_flutter:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :jni_flutter) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni_flutter:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :jni_flutter:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni_flutter:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni_flutter:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :jni_flutter) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :local_auth_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :local_auth_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :local_auth_android:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':local_auth_android:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :local_auth_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :local_auth_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :local_auth_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :local_auth_android:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':local_auth_android:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :local_auth_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :media_kit_libs_android_video:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :media_kit_libs_android_video:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :media_kit_libs_android_video:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_libs_android_video:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :media_kit_libs_android_video) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :media_kit_libs_android_video:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :media_kit_libs_android_video:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :media_kit_libs_android_video:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_libs_android_video:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :media_kit_libs_android_video) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :media_kit_video:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :media_kit_video:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :media_kit_video:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_video:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :media_kit_video) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :media_kit_video:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :media_kit_video:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :media_kit_video:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_video:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :media_kit_video) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :network_info_plus:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :network_info_plus:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :network_info_plus:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':network_info_plus:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :network_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :network_info_plus:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :network_info_plus:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :network_info_plus:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':network_info_plus:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :network_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :package_info_plus:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :package_info_plus:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :package_info_plus:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':package_info_plus:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :package_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :package_info_plus:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :package_info_plus:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :package_info_plus:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':package_info_plus:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :package_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :permission_handler_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :permission_handler_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :permission_handler_android:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':permission_handler_android:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :permission_handler_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :permission_handler_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :permission_handler_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :permission_handler_android:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':permission_handler_android:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :permission_handler_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :printing:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :printing:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :printing:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':printing:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':printing:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :printing) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :printing:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :printing:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :printing:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':printing:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':printing:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :printing) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :screen_brightness_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :screen_brightness_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :screen_brightness_android:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':screen_brightness_android:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :screen_brightness_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :screen_brightness_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :screen_brightness_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :screen_brightness_android:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':screen_brightness_android:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :screen_brightness_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :shared_preferences_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :shared_preferences_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :shared_preferences_android:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':shared_preferences_android:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :shared_preferences_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :shared_preferences_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :shared_preferences_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :shared_preferences_android:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':shared_preferences_android:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :shared_preferences_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :sqflite_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :sqflite_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :sqflite_android:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':sqflite_android:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :sqflite_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :sqflite_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :sqflite_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :sqflite_android:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':sqflite_android:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :sqflite_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :streams_channel:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :streams_channel:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ +69 ms] > Task :streams_channel:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':streams_channel:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :streams_channel) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :streams_channel:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :streams_channel:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :streams_channel:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':streams_channel:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :streams_channel) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :url_launcher_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :url_launcher_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :url_launcher_android:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':url_launcher_android:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :url_launcher_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :url_launcher_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :url_launcher_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :url_launcher_android:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':url_launcher_android:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :url_launcher_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :video_player_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :video_player_android:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :video_player_android:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':video_player_android:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :video_player_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :video_player_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :video_player_android:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :video_player_android:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':video_player_android:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :video_player_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :volume_controller:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :volume_controller:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :volume_controller:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':volume_controller:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :volume_controller) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :volume_controller:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :volume_controller:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :volume_controller:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':volume_controller:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :volume_controller) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :wakelock_plus:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:extractDeepLinksDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :wakelock_plus:extractDeepLinksDebug UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:extractDeepLinksDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':wakelock_plus:extractDeepLinksDebug' as it is up-to-date. +[ ] work action resolve navigation.json (project :wakelock_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :wakelock_plus:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:processDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :wakelock_plus:processDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:processDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':wakelock_plus:processDebugManifest' as it is up-to-date. +[ ] work action resolve AndroidManifest.xml (project :wakelock_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :app:processPlayDebugMainManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :app:processPlayDebugMainManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:processPlayDebugMainManifest UP-TO-DATE +[ ] Caching disabled for task ':app:processPlayDebugMainManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:processPlayDebugMainManifest' as it is up-to-date. +[ ] Resolve mutations for :app:processPlayDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] :app:processPlayDebugManifest (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:processPlayDebugManifest UP-TO-DATE +[ ] Caching disabled for task ':app:processPlayDebugManifest' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:processPlayDebugManifest' as it is up-to-date. +[ ] Resolve mutations for :app:processPlayDebugManifestForPackage (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :app:processPlayDebugManifestForPackage (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :app:processPlayDebugManifestForPackage UP-TO-DATE +[ ] Custom actions are attached to task ':app:processPlayDebugManifestForPackage'. +[ ] Caching disabled for task ':app:processPlayDebugManifestForPackage' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:processPlayDebugManifestForPackage' as it is up-to-date. +[ ] Resolve mutations for :aves_screen_state:compileDebugLibraryResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :aves_screen_state:compileDebugLibraryResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :aves_screen_state:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':aves_screen_state:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :aves_screen_state) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :aves_screen_state:parseDebugLocalResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :aves_screen_state:parseDebugLocalResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :aves_screen_state:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':aves_screen_state:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :aves_screen_state:generateDebugRFile (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :aves_screen_state:generateDebugRFile (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :aves_screen_state:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':aves_screen_state:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :aves_screen_state) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :connectivity_plus:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :connectivity_plus:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :connectivity_plus:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':connectivity_plus:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :connectivity_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :connectivity_plus:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :connectivity_plus:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :connectivity_plus:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':connectivity_plus:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :connectivity_plus:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :connectivity_plus:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :connectivity_plus:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':connectivity_plus:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :connectivity_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dchs_motion_sensors:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :dchs_motion_sensors:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dchs_motion_sensors:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':dchs_motion_sensors:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :dchs_motion_sensors) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dchs_motion_sensors:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :dchs_motion_sensors:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dchs_motion_sensors:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':dchs_motion_sensors:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :dchs_motion_sensors:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :dchs_motion_sensors:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dchs_motion_sensors:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':dchs_motion_sensors:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :dchs_motion_sensors) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :device_info_plus:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :device_info_plus:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :device_info_plus:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':device_info_plus:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :device_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :device_info_plus:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :device_info_plus:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :device_info_plus:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':device_info_plus:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :device_info_plus:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :device_info_plus:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :device_info_plus:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':device_info_plus:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :device_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dynamic_color:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :dynamic_color:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dynamic_color:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':dynamic_color:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :dynamic_color) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dynamic_color:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :dynamic_color:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dynamic_color:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':dynamic_color:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :dynamic_color:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :dynamic_color:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dynamic_color:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':dynamic_color:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :dynamic_color) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :exifinterface:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :exifinterface:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :exifinterface:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':exifinterface:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :exifinterface) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :exifinterface:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :exifinterface:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :exifinterface:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':exifinterface:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :exifinterface:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :exifinterface:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :exifinterface:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':exifinterface:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :exifinterface) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :firebase_core:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_core:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_core:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_core:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :firebase_core) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :firebase_core:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_core:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_core:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_core:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :firebase_core:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_core:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_core:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_core:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :firebase_core) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :firebase_crashlytics:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_crashlytics:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_crashlytics:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_crashlytics:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :firebase_crashlytics) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :firebase_crashlytics:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_crashlytics:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_crashlytics:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_crashlytics:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :firebase_crashlytics:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_crashlytics:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_crashlytics:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_crashlytics:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :firebase_crashlytics) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :floating:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :floating:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :floating:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':floating:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':floating:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :floating) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :floating:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :floating:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :floating:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':floating:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':floating:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :floating:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :floating:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :floating:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':floating:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':floating:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :floating) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_displaymode:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_displaymode:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_displaymode:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_displaymode:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :flutter_displaymode) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_displaymode:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_displaymode:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_displaymode:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_displaymode:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :flutter_displaymode:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_displaymode:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_displaymode:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_displaymode:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :flutter_displaymode) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ +81 ms] > Task :flutter_plugin_android_lifecycle:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_plugin_android_lifecycle:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :flutter_plugin_android_lifecycle) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_plugin_android_lifecycle:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_plugin_android_lifecycle:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :flutter_plugin_android_lifecycle) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_secure_storage:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_secure_storage:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_secure_storage:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_secure_storage:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :flutter_secure_storage) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_secure_storage:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_secure_storage:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_secure_storage:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_secure_storage:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :flutter_secure_storage:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_secure_storage:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_secure_storage:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_secure_storage:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :flutter_secure_storage) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_api_availability_android:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :google_api_availability_android:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_api_availability_android:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_api_availability_android:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :google_api_availability_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_api_availability_android:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :google_api_availability_android:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_api_availability_android:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_api_availability_android:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :google_api_availability_android:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :google_api_availability_android:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_api_availability_android:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_api_availability_android:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :google_api_availability_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_cast:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :google_cast:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_cast:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':google_cast:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_cast:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :google_cast) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_cast:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :google_cast:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_cast:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':google_cast:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_cast:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :google_cast:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :google_cast:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_cast:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':google_cast:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_cast:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :google_cast) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_maps_flutter_android:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :google_maps_flutter_android:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_maps_flutter_android:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_maps_flutter_android:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :google_maps_flutter_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_maps_flutter_android:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :google_maps_flutter_android:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_maps_flutter_android:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_maps_flutter_android:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :google_maps_flutter_android:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :google_maps_flutter_android:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_maps_flutter_android:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_maps_flutter_android:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :google_maps_flutter_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :jni:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':jni:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :jni) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :jni:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':jni:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :jni:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :jni:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':jni:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :jni) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni_flutter:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :jni_flutter:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni_flutter:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni_flutter:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :jni_flutter) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni_flutter:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :jni_flutter:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni_flutter:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni_flutter:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :jni_flutter:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :jni_flutter:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni_flutter:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni_flutter:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :jni_flutter) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :local_auth_android:compileDebugLibraryResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :local_auth_android:compileDebugLibraryResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :local_auth_android:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':local_auth_android:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :local_auth_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :local_auth_android:parseDebugLocalResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :local_auth_android:parseDebugLocalResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :local_auth_android:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':local_auth_android:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :local_auth_android:generateDebugRFile (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :local_auth_android:generateDebugRFile (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :local_auth_android:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':local_auth_android:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :local_auth_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :media_kit_libs_android_video:compileDebugLibraryResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :media_kit_libs_android_video:compileDebugLibraryResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :media_kit_libs_android_video:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_libs_android_video:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :media_kit_libs_android_video) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :media_kit_libs_android_video:parseDebugLocalResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :media_kit_libs_android_video:parseDebugLocalResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :media_kit_libs_android_video:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_libs_android_video:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :media_kit_libs_android_video:generateDebugRFile (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :media_kit_libs_android_video:generateDebugRFile (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :media_kit_libs_android_video:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_libs_android_video:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :media_kit_libs_android_video) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :media_kit_video:compileDebugLibraryResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :media_kit_video:compileDebugLibraryResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :media_kit_video:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_video:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :media_kit_video) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :media_kit_video:parseDebugLocalResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :media_kit_video:parseDebugLocalResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :media_kit_video:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_video:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :media_kit_video:generateDebugRFile (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :media_kit_video:generateDebugRFile (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :media_kit_video:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_video:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :media_kit_video) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :network_info_plus:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :network_info_plus:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :network_info_plus:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':network_info_plus:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :network_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :network_info_plus:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :network_info_plus:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :network_info_plus:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':network_info_plus:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :network_info_plus:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :network_info_plus:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :network_info_plus:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':network_info_plus:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :network_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :package_info_plus:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :package_info_plus:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :package_info_plus:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':package_info_plus:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :package_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :package_info_plus:parseDebugLocalResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :package_info_plus:parseDebugLocalResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :package_info_plus:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':package_info_plus:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :package_info_plus:generateDebugRFile (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :package_info_plus:generateDebugRFile (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :package_info_plus:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':package_info_plus:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :package_info_plus) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :permission_handler_android:compileDebugLibraryResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :permission_handler_android:compileDebugLibraryResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :permission_handler_android:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':permission_handler_android:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :permission_handler_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ +1 ms] Resolve mutations for :permission_handler_android:parseDebugLocalResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :permission_handler_android:parseDebugLocalResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :permission_handler_android:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':permission_handler_android:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :permission_handler_android:generateDebugRFile (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :permission_handler_android:generateDebugRFile (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :permission_handler_android:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':permission_handler_android:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :permission_handler_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :printing:compileDebugLibraryResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :printing:compileDebugLibraryResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :printing:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':printing:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':printing:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :printing) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :printing:parseDebugLocalResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :printing:parseDebugLocalResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :printing:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':printing:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':printing:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :printing:generateDebugRFile (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :printing:generateDebugRFile (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :printing:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':printing:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':printing:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :printing) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :screen_brightness_android:compileDebugLibraryResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :screen_brightness_android:compileDebugLibraryResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :screen_brightness_android:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':screen_brightness_android:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :screen_brightness_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :screen_brightness_android:parseDebugLocalResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :screen_brightness_android:parseDebugLocalResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :screen_brightness_android:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':screen_brightness_android:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :screen_brightness_android:generateDebugRFile (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :screen_brightness_android:generateDebugRFile (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :screen_brightness_android:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':screen_brightness_android:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :screen_brightness_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :shared_preferences_android:compileDebugLibraryResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :shared_preferences_android:compileDebugLibraryResources (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :shared_preferences_android:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':shared_preferences_android:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :shared_preferences_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :shared_preferences_android:parseDebugLocalResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :shared_preferences_android:parseDebugLocalResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :shared_preferences_android:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':shared_preferences_android:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :shared_preferences_android:generateDebugRFile (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :shared_preferences_android:generateDebugRFile (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :shared_preferences_android:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':shared_preferences_android:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :shared_preferences_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :sqflite_android:compileDebugLibraryResources (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :sqflite_android:compileDebugLibraryResources (Thread[#384,included builds,5,main]) started. +[ ] > Task :sqflite_android:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':sqflite_android:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :sqflite_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :sqflite_android:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :sqflite_android:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :sqflite_android:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':sqflite_android:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :sqflite_android:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :sqflite_android:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :sqflite_android:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':sqflite_android:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :sqflite_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :streams_channel:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :streams_channel:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :streams_channel:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':streams_channel:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :streams_channel) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :streams_channel:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :streams_channel:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :streams_channel:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':streams_channel:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :streams_channel:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :streams_channel:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ +81 ms] > Task :streams_channel:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':streams_channel:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :streams_channel) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :url_launcher_android:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :url_launcher_android:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :url_launcher_android:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':url_launcher_android:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :url_launcher_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :url_launcher_android:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :url_launcher_android:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :url_launcher_android:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':url_launcher_android:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :url_launcher_android:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :url_launcher_android:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :url_launcher_android:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':url_launcher_android:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :url_launcher_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :video_player_android:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :video_player_android:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :video_player_android:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':video_player_android:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :video_player_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :video_player_android:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :video_player_android:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :video_player_android:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':video_player_android:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :video_player_android:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :video_player_android:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :video_player_android:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':video_player_android:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :video_player_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :volume_controller:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :volume_controller:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :volume_controller:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':volume_controller:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :volume_controller) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :volume_controller:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :volume_controller:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :volume_controller:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':volume_controller:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :volume_controller:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :volume_controller:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :volume_controller:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':volume_controller:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :volume_controller) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :wakelock_plus:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:compileDebugLibraryResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :wakelock_plus:compileDebugLibraryResources UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:compileDebugLibraryResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':wakelock_plus:compileDebugLibraryResources' as it is up-to-date. +[ ] work action resolve out (project :wakelock_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :wakelock_plus:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:parseDebugLocalResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :wakelock_plus:parseDebugLocalResources UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:parseDebugLocalResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':wakelock_plus:parseDebugLocalResources' as it is up-to-date. +[ ] Resolve mutations for :wakelock_plus:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:generateDebugRFile (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :wakelock_plus:generateDebugRFile UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:generateDebugRFile' because: +[ ] Build cache is disabled +[ ] Skipping task ':wakelock_plus:generateDebugRFile' as it is up-to-date. +[ ] work action resolve package-aware-r.txt (project :wakelock_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :app:processPlayDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] :app:processPlayDebugResources (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:processPlayDebugResources UP-TO-DATE +[ ] Registered task dependencies: app:playDebugCompileClasspath +[ ] Skipping misunderstood TO dep string: project :streams_channel +[ ] Skipping misunderstood TO dep string: org.jetbrains.kotlin:kotlin-stdlib +[ ] Skipping misunderstood TO dep string: org.jetbrains.kotlin:kotlin-stdlib +[ ] Skipping misunderstood TO dep string: project :aves_screen_state +[ ] Skipping misunderstood TO dep string: project :connectivity_plus +[ ] Skipping misunderstood TO dep string: project :dchs_motion_sensors +[ ] Skipping misunderstood TO dep string: project :device_info_plus +[ ] Skipping misunderstood TO dep string: project :dynamic_color +[ ] Skipping misunderstood TO dep string: project :firebase_core +[ ] Skipping misunderstood TO dep string: project :firebase_crashlytics +[ ] Skipping misunderstood TO dep string: project :floating +[ ] Skipping misunderstood TO dep string: project :flutter_displaymode +[ ] Skipping misunderstood TO dep string: project :flutter_plugin_android_lifecycle +[ ] Skipping misunderstood TO dep string: project :flutter_secure_storage +[ ] Skipping misunderstood TO dep string: project :google_api_availability_android +[ ] Skipping misunderstood TO dep string: project :google_cast +[ ] Skipping misunderstood TO dep string: project :google_maps_flutter_android +[ ] Skipping misunderstood TO dep string: project :jni +[ ] Skipping misunderstood TO dep string: project :jni_flutter +[ ] Skipping misunderstood TO dep string: project :local_auth_android +[ ] Skipping misunderstood TO dep string: project :media_kit_libs_android_video +[ ] Skipping misunderstood TO dep string: project :media_kit_video +[ ] Skipping misunderstood TO dep string: project :network_info_plus +[ ] Skipping misunderstood TO dep string: project :package_info_plus +[ ] Skipping misunderstood TO dep string: project :permission_handler_android +[ ] Skipping misunderstood TO dep string: project :printing +[ ] Skipping misunderstood TO dep string: project :screen_brightness_android +[ ] Skipping misunderstood TO dep string: project :shared_preferences_android +[ ] Skipping misunderstood TO dep string: project :sqflite_android +[ ] Skipping misunderstood TO dep string: project :url_launcher_android +[ ] Skipping misunderstood TO dep string: project :video_player_android +[ ] Skipping misunderstood TO dep string: project :volume_controller +[ ] Skipping misunderstood TO dep string: project :wakelock_plus +[ ] Skipping misunderstood TO dep string: org.jetbrains.kotlin:kotlin-stdlib +[ ] Skipping misunderstood TO dep string: project :exifinterface +[ ] Starting dependency analysis +[ ] Caching disabled for task ':app:processPlayDebugResources' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:processPlayDebugResources' as it is up-to-date. +[ ] Resolve mutations for :aves_screen_state:checkKotlinGradlePluginConfigurationErrors (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:checkKotlinGradlePluginConfigurationErrors (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :aves_screen_state:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':aves_screen_state:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :aves_screen_state:compileDebugKotlin (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:compileDebugKotlin (Thread[#385,Execution worker,5,main]) started. +[ +85 ms] > Task :aves_screen_state:compileDebugKotlin UP-TO-DATE +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :aves_screen_state:compileDebugAndroidTestKotlin +[ ] Caching disabled for task ':aves_screen_state:compileDebugKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':aves_screen_state:compileDebugKotlin' as it is up-to-date. +[ ] Resolve mutations for :aves_screen_state:javaPreCompileDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:javaPreCompileDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :aves_screen_state:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':aves_screen_state:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :aves_screen_state:compileDebugJavaWithJavac (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:compileDebugJavaWithJavac (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :aves_screen_state:compileDebugJavaWithJavac NO-SOURCE +[ ] Skipping task ':aves_screen_state:compileDebugJavaWithJavac' as it has no source files and no previous output files. +[ ] Resolve mutations for :aves_screen_state:bundleLibCompileToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:bundleLibCompileToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :aves_screen_state:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':aves_screen_state:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :aves_screen_state) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :connectivity_plus:javaPreCompileDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :connectivity_plus:javaPreCompileDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :connectivity_plus:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':connectivity_plus:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :connectivity_plus:compileDebugJavaWithJavac (Thread[#385,Execution worker,5,main]) started. +[ ] :connectivity_plus:compileDebugJavaWithJavac (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :connectivity_plus:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':connectivity_plus:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':connectivity_plus:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':connectivity_plus:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :connectivity_plus:compileDebugJavaWithJavac +[ ] No compile result for :connectivity_plus:compileDebugJavaWithJavac +[ ] No compile result for :connectivity_plus:compileDebugJavaWithJavac +[ ] Resolve mutations for :connectivity_plus:bundleLibCompileToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :connectivity_plus:bundleLibCompileToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :connectivity_plus:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':connectivity_plus:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :connectivity_plus) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :dchs_motion_sensors:checkKotlinGradlePluginConfigurationErrors (Thread[#384,included builds,5,main]) started. +[ ] :dchs_motion_sensors:checkKotlinGradlePluginConfigurationErrors (Thread[#384,included builds,5,main]) started. +[ ] > Task :dchs_motion_sensors:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':dchs_motion_sensors:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :dchs_motion_sensors:compileDebugKotlin (Thread[#384,included builds,5,main]) started. +[ ] :dchs_motion_sensors:compileDebugKotlin (Thread[#384,included builds,5,main]) started. +[ ] > Task :dchs_motion_sensors:compileDebugKotlin UP-TO-DATE +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :dchs_motion_sensors:compileDebugAndroidTestKotlin +[ ] Caching disabled for task ':dchs_motion_sensors:compileDebugKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':dchs_motion_sensors:compileDebugKotlin' as it is up-to-date. +[ +99 ms] Resolve mutations for :dchs_motion_sensors:javaPreCompileDebug (Thread[#384,included builds,5,main]) started. +[ ] :dchs_motion_sensors:javaPreCompileDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :dchs_motion_sensors:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':dchs_motion_sensors:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :dchs_motion_sensors:compileDebugJavaWithJavac (Thread[#384,included builds,5,main]) started. +[ ] :dchs_motion_sensors:compileDebugJavaWithJavac (Thread[#384,included builds,5,main]) started. +[ ] > Task :dchs_motion_sensors:compileDebugJavaWithJavac NO-SOURCE +[ ] Skipping task ':dchs_motion_sensors:compileDebugJavaWithJavac' as it has no source files and no previous output files. +[ ] Resolve mutations for :dchs_motion_sensors:bundleLibCompileToJarDebug (Thread[#384,included builds,5,main]) started. +[ ] :dchs_motion_sensors:bundleLibCompileToJarDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :dchs_motion_sensors:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':dchs_motion_sensors:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :dchs_motion_sensors) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :device_info_plus:checkKotlinGradlePluginConfigurationErrors (Thread[#384,included builds,5,main]) started. +[ ] :device_info_plus:checkKotlinGradlePluginConfigurationErrors (Thread[#384,included builds,5,main]) started. +[ ] > Task :device_info_plus:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':device_info_plus:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :device_info_plus:compileDebugKotlin (Thread[#384,included builds,5,main]) started. +[ ] :device_info_plus:compileDebugKotlin (Thread[#384,included builds,5,main]) started. +[ ] > Task :device_info_plus:compileDebugKotlin UP-TO-DATE +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :device_info_plus:compileDebugAndroidTestKotlin +[ ] Caching disabled for task ':device_info_plus:compileDebugKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':device_info_plus:compileDebugKotlin' as it is up-to-date. +[ ] Resolve mutations for :device_info_plus:javaPreCompileDebug (Thread[#384,included builds,5,main]) started. +[ ] :device_info_plus:javaPreCompileDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :device_info_plus:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':device_info_plus:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :device_info_plus:compileDebugJavaWithJavac (Thread[#384,included builds,5,main]) started. +[ ] :device_info_plus:compileDebugJavaWithJavac (Thread[#384,included builds,5,main]) started. +[ ] > Task :device_info_plus:compileDebugJavaWithJavac NO-SOURCE +[ ] Skipping task ':device_info_plus:compileDebugJavaWithJavac' as it has no source files and no previous output files. +[ ] Resolve mutations for :device_info_plus:bundleLibCompileToJarDebug (Thread[#384,included builds,5,main]) started. +[ ] :device_info_plus:bundleLibCompileToJarDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :device_info_plus:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':device_info_plus:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :device_info_plus) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :dynamic_color:checkKotlinGradlePluginConfigurationErrors (Thread[#384,included builds,5,main]) started. +[ ] :dynamic_color:checkKotlinGradlePluginConfigurationErrors (Thread[#384,included builds,5,main]) started. +[ ] > Task :dynamic_color:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':dynamic_color:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :dynamic_color:compileDebugKotlin (Thread[#384,included builds,5,main]) started. +[ ] :dynamic_color:compileDebugKotlin (Thread[#384,included builds,5,main]) started. +[ +99 ms] > Task :dynamic_color:compileDebugKotlin UP-TO-DATE +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :dynamic_color:compileDebugAndroidTestKotlin +[ ] Caching disabled for task ':dynamic_color:compileDebugKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':dynamic_color:compileDebugKotlin' as it is up-to-date. +[ ] Resolve mutations for :dynamic_color:javaPreCompileDebug (Thread[#384,included builds,5,main]) started. +[ ] :dynamic_color:javaPreCompileDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :dynamic_color:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':dynamic_color:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :dynamic_color:compileDebugJavaWithJavac (Thread[#384,included builds,5,main]) started. +[ ] :dynamic_color:compileDebugJavaWithJavac (Thread[#384,included builds,5,main]) started. +[ ] > Task :dynamic_color:compileDebugJavaWithJavac NO-SOURCE +[ ] Skipping task ':dynamic_color:compileDebugJavaWithJavac' as it has no source files and no previous output files. +[ ] Resolve mutations for :dynamic_color:bundleLibCompileToJarDebug (Thread[#384,included builds,5,main]) started. +[ ] :dynamic_color:bundleLibCompileToJarDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :dynamic_color:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':dynamic_color:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :dynamic_color) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :exifinterface:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :exifinterface:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :exifinterface:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':exifinterface:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :exifinterface:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :exifinterface:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :exifinterface:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':exifinterface:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':exifinterface:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':exifinterface:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :exifinterface:compileDebugJavaWithJavac +[ ] No compile result for :exifinterface:compileDebugJavaWithJavac +[ ] No compile result for :exifinterface:compileDebugJavaWithJavac +[ ] Resolve mutations for :exifinterface:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :exifinterface:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :exifinterface:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':exifinterface:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :exifinterface) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :firebase_core:generateDebugBuildConfig (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_core:generateDebugBuildConfig (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_core:generateDebugBuildConfig UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:generateDebugBuildConfig' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_core:generateDebugBuildConfig' as it is up-to-date. +[ ] Resolve mutations for :firebase_core:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_core:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_core:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_core:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :firebase_core:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_core:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_core:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':firebase_core:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':firebase_core:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_core:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :firebase_core:compileDebugJavaWithJavac +[ ] No compile result for :firebase_core:compileDebugJavaWithJavac +[ ] No compile result for :firebase_core:compileDebugJavaWithJavac +[ ] Resolve mutations for :firebase_core:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_core:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_core:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':firebase_core:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :firebase_core) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :firebase_crashlytics:generateDebugBuildConfig (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_crashlytics:generateDebugBuildConfig (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_crashlytics:generateDebugBuildConfig UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:generateDebugBuildConfig' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_crashlytics:generateDebugBuildConfig' as it is up-to-date. +[ ] Resolve mutations for :firebase_crashlytics:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_crashlytics:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_crashlytics:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_crashlytics:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :firebase_crashlytics:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_crashlytics:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_crashlytics:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':firebase_crashlytics:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':firebase_crashlytics:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':firebase_crashlytics:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :firebase_crashlytics:compileDebugJavaWithJavac +[ ] No compile result for :firebase_crashlytics:compileDebugJavaWithJavac +[ ] No compile result for :firebase_crashlytics:compileDebugJavaWithJavac +[ ] Resolve mutations for :firebase_crashlytics:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_crashlytics:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_crashlytics:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':firebase_crashlytics:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :firebase_crashlytics) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :floating:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :floating:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :floating:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':floating:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :floating:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :floating:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ +98 ms] > Task :floating:compileDebugKotlin UP-TO-DATE +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :floating:compileDebugAndroidTestKotlin +[ ] Caching disabled for task ':floating:compileDebugKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':floating:compileDebugKotlin' as it is up-to-date. +[ ] Resolve mutations for :floating:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :floating:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :floating:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':floating:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':floating:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :floating:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :floating:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :floating:compileDebugJavaWithJavac NO-SOURCE +[ ] Skipping task ':floating:compileDebugJavaWithJavac' as it has no source files and no previous output files. +[ ] Resolve mutations for :floating:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :floating:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :floating:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':floating:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':floating:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :floating) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :flutter_displaymode:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :flutter_displaymode:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :flutter_displaymode:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_displaymode:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :flutter_displaymode:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :flutter_displaymode:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :flutter_displaymode:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':flutter_displaymode:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':flutter_displaymode:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_displaymode:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :flutter_displaymode:compileDebugJavaWithJavac +[ ] No compile result for :flutter_displaymode:compileDebugJavaWithJavac +[ ] No compile result for :flutter_displaymode:compileDebugJavaWithJavac +[ ] Resolve mutations for :flutter_displaymode:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :flutter_displaymode:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :flutter_displaymode:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_displaymode:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :flutter_displaymode) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_plugin_android_lifecycle:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':flutter_plugin_android_lifecycle:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_plugin_android_lifecycle:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :flutter_plugin_android_lifecycle:compileDebugJavaWithJavac +[ ] No compile result for :flutter_plugin_android_lifecycle:compileDebugJavaWithJavac +[ ] No compile result for :flutter_plugin_android_lifecycle:compileDebugJavaWithJavac +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_plugin_android_lifecycle:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :flutter_plugin_android_lifecycle) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :flutter_secure_storage:generateDebugBuildConfig (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :flutter_secure_storage:generateDebugBuildConfig (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :flutter_secure_storage:generateDebugBuildConfig UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:generateDebugBuildConfig' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_secure_storage:generateDebugBuildConfig' as it is up-to-date. +[ ] Resolve mutations for :flutter_secure_storage:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :flutter_secure_storage:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :flutter_secure_storage:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_secure_storage:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :flutter_secure_storage:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :flutter_secure_storage:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :flutter_secure_storage:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':flutter_secure_storage:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':flutter_secure_storage:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':flutter_secure_storage:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :flutter_secure_storage:compileDebugJavaWithJavac +[ ] No compile result for :flutter_secure_storage:compileDebugJavaWithJavac +[ ] No compile result for :flutter_secure_storage:compileDebugJavaWithJavac +[ ] Resolve mutations for :flutter_secure_storage:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :flutter_secure_storage:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :flutter_secure_storage:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_secure_storage:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :flutter_secure_storage) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :google_api_availability_android:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :google_api_availability_android:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :google_api_availability_android:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_api_availability_android:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :google_api_availability_android:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :google_api_availability_android:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ +83 ms] > Task :google_api_availability_android:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':google_api_availability_android:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':google_api_availability_android:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_api_availability_android:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :google_api_availability_android:compileDebugJavaWithJavac +[ ] No compile result for :google_api_availability_android:compileDebugJavaWithJavac +[ ] No compile result for :google_api_availability_android:compileDebugJavaWithJavac +[ ] Resolve mutations for :google_api_availability_android:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :google_api_availability_android:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :google_api_availability_android:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_api_availability_android:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :google_api_availability_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :google_cast:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :google_cast:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :google_cast:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':google_cast:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_cast:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :google_cast:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :google_cast:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :google_cast:compileDebugJavaWithJavac NO-SOURCE +[ ] Skipping task ':google_cast:compileDebugJavaWithJavac' as it has no source files and no previous output files. +[ ] Resolve mutations for :google_cast:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :google_cast:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :google_cast:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':google_cast:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_cast:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :google_cast) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :google_maps_flutter_android:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :google_maps_flutter_android:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :google_maps_flutter_android:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':google_maps_flutter_android:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :google_maps_flutter_android:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :google_maps_flutter_android:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :google_maps_flutter_android:compileDebugKotlin UP-TO-DATE +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :google_maps_flutter_android:compileDebugAndroidTestKotlin +[ ] Caching disabled for task ':google_maps_flutter_android:compileDebugKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_maps_flutter_android:compileDebugKotlin' as it is up-to-date. +[ ] Resolve mutations for :google_maps_flutter_android:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :google_maps_flutter_android:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :google_maps_flutter_android:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_maps_flutter_android:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :google_maps_flutter_android:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :google_maps_flutter_android:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :google_maps_flutter_android:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':google_maps_flutter_android:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':google_maps_flutter_android:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':google_maps_flutter_android:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :google_maps_flutter_android:compileDebugJavaWithJavac +[ ] No compile result for :google_maps_flutter_android:compileDebugJavaWithJavac +[ ] No compile result for :google_maps_flutter_android:compileDebugJavaWithJavac +[ ] Resolve mutations for :google_maps_flutter_android:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :google_maps_flutter_android:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :google_maps_flutter_android:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_maps_flutter_android:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :google_maps_flutter_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :jni:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :jni:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :jni:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':jni:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :jni:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :jni:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ +90 ms] > Task :jni:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':jni:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':jni:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :jni:compileDebugJavaWithJavac +[ ] No compile result for :jni:compileDebugJavaWithJavac +[ ] No compile result for :jni:compileDebugJavaWithJavac +[ ] Resolve mutations for :jni:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :jni:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :jni:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':jni:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':jni:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :jni) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :jni_flutter:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :jni_flutter:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :jni_flutter:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni_flutter:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :jni_flutter:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :jni_flutter:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :jni_flutter:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':jni_flutter:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':jni_flutter:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':jni_flutter:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :jni_flutter:compileDebugJavaWithJavac +[ ] No compile result for :jni_flutter:compileDebugJavaWithJavac +[ ] No compile result for :jni_flutter:compileDebugJavaWithJavac +[ ] Resolve mutations for :jni_flutter:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :jni_flutter:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :jni_flutter:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':jni_flutter:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :jni_flutter) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :local_auth_android:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :local_auth_android:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :local_auth_android:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':local_auth_android:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :local_auth_android:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :local_auth_android:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ +99 ms] > Task :local_auth_android:compileDebugKotlin UP-TO-DATE +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :local_auth_android:compileDebugAndroidTestKotlin +[ ] Caching disabled for task ':local_auth_android:compileDebugKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':local_auth_android:compileDebugKotlin' as it is up-to-date. +[ ] Resolve mutations for :local_auth_android:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :local_auth_android:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :local_auth_android:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':local_auth_android:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :local_auth_android:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :local_auth_android:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :local_auth_android:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':local_auth_android:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':local_auth_android:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':local_auth_android:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :local_auth_android:compileDebugJavaWithJavac +[ ] No compile result for :local_auth_android:compileDebugJavaWithJavac +[ ] No compile result for :local_auth_android:compileDebugJavaWithJavac +[ ] Resolve mutations for :local_auth_android:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :local_auth_android:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :local_auth_android:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':local_auth_android:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :local_auth_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :media_kit_libs_android_video:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :media_kit_libs_android_video:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :media_kit_libs_android_video:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_libs_android_video:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :media_kit_libs_android_video:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :media_kit_libs_android_video:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ +101 ms] > Task :media_kit_libs_android_video:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':media_kit_libs_android_video:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':media_kit_libs_android_video:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_libs_android_video:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :media_kit_libs_android_video:compileDebugJavaWithJavac +[ ] No compile result for :media_kit_libs_android_video:compileDebugJavaWithJavac +[ ] No compile result for :media_kit_libs_android_video:compileDebugJavaWithJavac +[ ] Resolve mutations for :media_kit_libs_android_video:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :media_kit_libs_android_video:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :media_kit_libs_android_video:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':media_kit_libs_android_video:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :media_kit_libs_android_video) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :media_kit_video:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :media_kit_video:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :media_kit_video:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_video:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :package_info_plus:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :package_info_plus:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :package_info_plus:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':package_info_plus:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :package_info_plus:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :package_info_plus:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :package_info_plus:compileDebugKotlin UP-TO-DATE +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :package_info_plus:compileDebugAndroidTestKotlin +[ ] Caching disabled for task ':package_info_plus:compileDebugKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':package_info_plus:compileDebugKotlin' as it is up-to-date. +[ ] Resolve mutations for :package_info_plus:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :package_info_plus:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :package_info_plus:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':package_info_plus:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :package_info_plus:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :package_info_plus:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :package_info_plus:compileDebugJavaWithJavac NO-SOURCE +[ ] Skipping task ':package_info_plus:compileDebugJavaWithJavac' as it has no source files and no previous output files. +[ ] Resolve mutations for :package_info_plus:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :package_info_plus:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :package_info_plus:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':package_info_plus:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :package_info_plus) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :wakelock_plus:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :wakelock_plus:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :wakelock_plus:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':wakelock_plus:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :wakelock_plus:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :wakelock_plus:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :wakelock_plus:compileDebugKotlin UP-TO-DATE +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :wakelock_plus:compileDebugAndroidTestKotlin +[ ] Caching disabled for task ':wakelock_plus:compileDebugKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':wakelock_plus:compileDebugKotlin' as it is up-to-date. +[ ] Resolve mutations for :wakelock_plus:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :wakelock_plus:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :wakelock_plus:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':wakelock_plus:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :wakelock_plus:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :wakelock_plus:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :wakelock_plus:compileDebugJavaWithJavac NO-SOURCE +[ ] Skipping task ':wakelock_plus:compileDebugJavaWithJavac' as it has no source files and no previous output files. +[ ] Resolve mutations for :wakelock_plus:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :wakelock_plus:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :wakelock_plus:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':wakelock_plus:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :wakelock_plus) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :media_kit_video:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :media_kit_video:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ +94 ms] > Task :media_kit_video:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':media_kit_video:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':media_kit_video:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':media_kit_video:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :media_kit_video:compileDebugJavaWithJavac +[ ] No compile result for :media_kit_video:compileDebugJavaWithJavac +[ ] No compile result for :media_kit_video:compileDebugJavaWithJavac +[ ] Resolve mutations for :media_kit_video:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :media_kit_video:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :media_kit_video:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':media_kit_video:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :media_kit_video) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :network_info_plus:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :network_info_plus:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :network_info_plus:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':network_info_plus:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :network_info_plus:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :network_info_plus:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :network_info_plus:compileDebugKotlin UP-TO-DATE +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :network_info_plus:compileDebugAndroidTestKotlin +[ ] Caching disabled for task ':network_info_plus:compileDebugKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':network_info_plus:compileDebugKotlin' as it is up-to-date. +[ ] Resolve mutations for :network_info_plus:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :network_info_plus:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :network_info_plus:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':network_info_plus:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :network_info_plus:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :network_info_plus:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :network_info_plus:compileDebugJavaWithJavac NO-SOURCE +[ ] Skipping task ':network_info_plus:compileDebugJavaWithJavac' as it has no source files and no previous output files. +[ ] Resolve mutations for :network_info_plus:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :network_info_plus:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :network_info_plus:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':network_info_plus:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :network_info_plus) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :permission_handler_android:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :permission_handler_android:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :permission_handler_android:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':permission_handler_android:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :permission_handler_android:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :permission_handler_android:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :permission_handler_android:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':permission_handler_android:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':permission_handler_android:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':permission_handler_android:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :permission_handler_android:compileDebugJavaWithJavac +[ ] No compile result for :permission_handler_android:compileDebugJavaWithJavac +[ ] No compile result for :permission_handler_android:compileDebugJavaWithJavac +[ ] Resolve mutations for :permission_handler_android:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :permission_handler_android:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :permission_handler_android:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':permission_handler_android:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :permission_handler_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :printing:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :printing:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :printing:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':printing:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':printing:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :printing:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :printing:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ +91 ms] > Task :printing:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':printing:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':printing:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':printing:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :printing:compileDebugJavaWithJavac +[ ] No compile result for :printing:compileDebugJavaWithJavac +[ ] No compile result for :printing:compileDebugJavaWithJavac +[ ] Resolve mutations for :printing:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :printing:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :printing:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':printing:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':printing:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :printing) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :screen_brightness_android:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :screen_brightness_android:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :screen_brightness_android:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':screen_brightness_android:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :screen_brightness_android:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :screen_brightness_android:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :screen_brightness_android:compileDebugKotlin UP-TO-DATE +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :screen_brightness_android:compileDebugAndroidTestKotlin +[ ] Caching disabled for task ':screen_brightness_android:compileDebugKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':screen_brightness_android:compileDebugKotlin' as it is up-to-date. +[ ] Resolve mutations for :screen_brightness_android:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :screen_brightness_android:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :screen_brightness_android:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':screen_brightness_android:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :screen_brightness_android:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :screen_brightness_android:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :screen_brightness_android:compileDebugJavaWithJavac NO-SOURCE +[ ] Skipping task ':screen_brightness_android:compileDebugJavaWithJavac' as it has no source files and no previous output files. +[ ] Resolve mutations for :screen_brightness_android:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :screen_brightness_android:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :screen_brightness_android:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':screen_brightness_android:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :screen_brightness_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :shared_preferences_android:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :shared_preferences_android:checkKotlinGradlePluginConfigurationErrors (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :shared_preferences_android:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':shared_preferences_android:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :shared_preferences_android:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :shared_preferences_android:compileDebugKotlin (Thread[#387,Execution worker Thread 3,5,main]) started. +[ +102 ms] > Task :shared_preferences_android:compileDebugKotlin UP-TO-DATE +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :shared_preferences_android:compileDebugAndroidTestKotlin +[ ] Caching disabled for task ':shared_preferences_android:compileDebugKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':shared_preferences_android:compileDebugKotlin' as it is up-to-date. +[ ] Resolve mutations for :shared_preferences_android:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :shared_preferences_android:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :shared_preferences_android:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':shared_preferences_android:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :shared_preferences_android:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :shared_preferences_android:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :shared_preferences_android:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':shared_preferences_android:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':shared_preferences_android:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':shared_preferences_android:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :shared_preferences_android:compileDebugJavaWithJavac +[ ] No compile result for :shared_preferences_android:compileDebugJavaWithJavac +[ ] No compile result for :shared_preferences_android:compileDebugJavaWithJavac +[ ] Resolve mutations for :shared_preferences_android:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :shared_preferences_android:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :shared_preferences_android:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':shared_preferences_android:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :shared_preferences_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :sqflite_android:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :sqflite_android:javaPreCompileDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :sqflite_android:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':sqflite_android:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :sqflite_android:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :sqflite_android:compileDebugJavaWithJavac (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :sqflite_android:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':sqflite_android:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':sqflite_android:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':sqflite_android:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :sqflite_android:compileDebugJavaWithJavac +[ ] No compile result for :sqflite_android:compileDebugJavaWithJavac +[ ] No compile result for :sqflite_android:compileDebugJavaWithJavac +[ ] Resolve mutations for :sqflite_android:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :sqflite_android:bundleLibCompileToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :sqflite_android:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':sqflite_android:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :sqflite_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :streams_channel:javaPreCompileDebug (Thread[#384,included builds,5,main]) started. +[ ] :streams_channel:javaPreCompileDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :streams_channel:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':streams_channel:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :streams_channel:compileDebugJavaWithJavac (Thread[#384,included builds,5,main]) started. +[ ] :streams_channel:compileDebugJavaWithJavac (Thread[#384,included builds,5,main]) started. +[ +88 ms] > Task :streams_channel:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':streams_channel:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':streams_channel:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':streams_channel:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :streams_channel:compileDebugJavaWithJavac +[ ] No compile result for :streams_channel:compileDebugJavaWithJavac +[ ] No compile result for :streams_channel:compileDebugJavaWithJavac +[ ] Resolve mutations for :streams_channel:bundleLibCompileToJarDebug (Thread[#384,included builds,5,main]) started. +[ ] :streams_channel:bundleLibCompileToJarDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :streams_channel:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':streams_channel:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :streams_channel) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :url_launcher_android:generateDebugBuildConfig (Thread[#384,included builds,5,main]) started. +[ ] :url_launcher_android:generateDebugBuildConfig (Thread[#384,included builds,5,main]) started. +[ ] > Task :url_launcher_android:generateDebugBuildConfig UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:generateDebugBuildConfig' because: +[ ] Build cache is disabled +[ ] Skipping task ':url_launcher_android:generateDebugBuildConfig' as it is up-to-date. +[ ] Resolve mutations for :url_launcher_android:javaPreCompileDebug (Thread[#384,included builds,5,main]) started. +[ ] :url_launcher_android:javaPreCompileDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :url_launcher_android:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':url_launcher_android:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :url_launcher_android:compileDebugJavaWithJavac (Thread[#384,included builds,5,main]) started. +[ ] :url_launcher_android:compileDebugJavaWithJavac (Thread[#384,included builds,5,main]) started. +[ ] > Task :url_launcher_android:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':url_launcher_android:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':url_launcher_android:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':url_launcher_android:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :url_launcher_android:compileDebugJavaWithJavac +[ ] No compile result for :url_launcher_android:compileDebugJavaWithJavac +[ ] No compile result for :url_launcher_android:compileDebugJavaWithJavac +[ ] Resolve mutations for :url_launcher_android:bundleLibCompileToJarDebug (Thread[#384,included builds,5,main]) started. +[ ] :url_launcher_android:bundleLibCompileToJarDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :url_launcher_android:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':url_launcher_android:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :url_launcher_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :video_player_android:checkKotlinGradlePluginConfigurationErrors (Thread[#384,included builds,5,main]) started. +[ ] :video_player_android:checkKotlinGradlePluginConfigurationErrors (Thread[#384,included builds,5,main]) started. +[ ] > Task :video_player_android:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':video_player_android:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :video_player_android:compileDebugKotlin (Thread[#384,included builds,5,main]) started. +[ ] :video_player_android:compileDebugKotlin (Thread[#384,included builds,5,main]) started. +[ ] > Task :video_player_android:compileDebugKotlin UP-TO-DATE +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :video_player_android:compileDebugAndroidTestKotlin +[ ] Caching disabled for task ':video_player_android:compileDebugKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':video_player_android:compileDebugKotlin' as it is up-to-date. +[ ] Resolve mutations for :video_player_android:javaPreCompileDebug (Thread[#384,included builds,5,main]) started. +[ ] :video_player_android:javaPreCompileDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :video_player_android:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':video_player_android:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :video_player_android:compileDebugJavaWithJavac (Thread[#384,included builds,5,main]) started. +[ ] :video_player_android:compileDebugJavaWithJavac (Thread[#384,included builds,5,main]) started. +[ ] > Task :video_player_android:compileDebugJavaWithJavac UP-TO-DATE +[ ] Custom actions are attached to task ':video_player_android:compileDebugJavaWithJavac'. +[ ] Caching disabled for task ':video_player_android:compileDebugJavaWithJavac' because: +[ ] Build cache is disabled +[ ] Skipping task ':video_player_android:compileDebugJavaWithJavac' as it is up-to-date. +[ ] No compile result for :video_player_android:compileDebugJavaWithJavac +[ ] No compile result for :video_player_android:compileDebugJavaWithJavac +[ ] No compile result for :video_player_android:compileDebugJavaWithJavac +[ ] Resolve mutations for :video_player_android:bundleLibCompileToJarDebug (Thread[#384,included builds,5,main]) started. +[ ] :video_player_android:bundleLibCompileToJarDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :video_player_android:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':video_player_android:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :video_player_android) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :volume_controller:checkKotlinGradlePluginConfigurationErrors (Thread[#384,included builds,5,main]) started. +[ ] :volume_controller:checkKotlinGradlePluginConfigurationErrors (Thread[#384,included builds,5,main]) started. +[ ] > Task :volume_controller:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':volume_controller:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :volume_controller:compileDebugKotlin (Thread[#384,included builds,5,main]) started. +[ ] :volume_controller:compileDebugKotlin (Thread[#384,included builds,5,main]) started. +[ +98 ms] > Task :volume_controller:compileDebugKotlin UP-TO-DATE +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :volume_controller:compileDebugAndroidTestKotlin +[ ] Caching disabled for task ':volume_controller:compileDebugKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':volume_controller:compileDebugKotlin' as it is up-to-date. +[ ] Resolve mutations for :volume_controller:javaPreCompileDebug (Thread[#384,included builds,5,main]) started. +[ ] :volume_controller:javaPreCompileDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :volume_controller:javaPreCompileDebug UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:javaPreCompileDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':volume_controller:javaPreCompileDebug' as it is up-to-date. +[ ] Resolve mutations for :volume_controller:compileDebugJavaWithJavac (Thread[#384,included builds,5,main]) started. +[ ] :volume_controller:compileDebugJavaWithJavac (Thread[#384,included builds,5,main]) started. +[ ] > Task :volume_controller:compileDebugJavaWithJavac NO-SOURCE +[ ] Skipping task ':volume_controller:compileDebugJavaWithJavac' as it has no source files and no previous output files. +[ ] Resolve mutations for :volume_controller:bundleLibCompileToJarDebug (Thread[#384,included builds,5,main]) started. +[ ] :volume_controller:bundleLibCompileToJarDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :volume_controller:bundleLibCompileToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:bundleLibCompileToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':volume_controller:bundleLibCompileToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :volume_controller) (Thread[#384,included builds,5,main]) started. +[ ] Resolve mutations for :app:kspPlayDebugKotlin (Thread[#384,included builds,5,main]) started. +[ ] :app:kspPlayDebugKotlin (Thread[#384,included builds,5,main]) started. +[ +294 ms] Resolve mutations for :app:javaPreCompilePlayDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :app:javaPreCompilePlayDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:javaPreCompilePlayDebug UP-TO-DATE +[ ] Registered task dependencies: app:_agp_internal_javaPreCompilePlayDebug_kspClasspath +[ ] Starting dependency analysis +[ ] Caching disabled for task ':app:javaPreCompilePlayDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:javaPreCompilePlayDebug' as it is up-to-date. +[ ] Resolve mutations for :app:compressPlayDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] :app:compressPlayDebugAssets (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:compressPlayDebugAssets UP-TO-DATE +[ ] Caching disabled for task ':app:compressPlayDebugAssets' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:compressPlayDebugAssets' as it is up-to-date. +[ ] Resolve mutations for :app:l8DexDesugarLibPlayDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :app:l8DexDesugarLibPlayDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:l8DexDesugarLibPlayDebug UP-TO-DATE +[ ] Caching disabled for task ':app:l8DexDesugarLibPlayDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:l8DexDesugarLibPlayDebug' as it is up-to-date. +[ ] Resolve mutations for :app:checkPlayDebugDuplicateClasses (Thread[#385,Execution worker,5,main]) started. +[ ] :app:checkPlayDebugDuplicateClasses (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:checkPlayDebugDuplicateClasses UP-TO-DATE +[ ] Caching disabled for task ':app:checkPlayDebugDuplicateClasses' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':app:checkPlayDebugDuplicateClasses' as it is up-to-date. +[ ] Resolve mutations for :app:desugarPlayDebugFileDependencies (Thread[#385,Execution worker,5,main]) started. +[ ] :app:desugarPlayDebugFileDependencies (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:desugarPlayDebugFileDependencies UP-TO-DATE +[ ] Caching disabled for task ':app:desugarPlayDebugFileDependencies' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:desugarPlayDebugFileDependencies' as it is up-to-date. +[ ] Resolve mutations for :app:mergeExtDexPlayDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :app:mergeExtDexPlayDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :app:mergeExtDexPlayDebug UP-TO-DATE +[ ] Caching disabled for task ':app:mergeExtDexPlayDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:mergeExtDexPlayDebug' as it is up-to-date. +[ ] Resolve mutations for :aves_screen_state:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :aves_screen_state:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':aves_screen_state:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :aves_screen_state) (Thread[#385,Execution worker,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :connectivity_plus:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :connectivity_plus:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :connectivity_plus:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':connectivity_plus:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :connectivity_plus) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :dchs_motion_sensors:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :aves_screen_state) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/aves_screen_state/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/aves_screen_state/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] :dchs_motion_sensors:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :connectivity_plus) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/connectivity_plus/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/connectivity_plus/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :dchs_motion_sensors:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':dchs_motion_sensors:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :dchs_motion_sensors) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :device_info_plus:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :device_info_plus:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :device_info_plus:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':device_info_plus:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :device_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dynamic_color:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :dchs_motion_sensors) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/dchs_motion_sensors/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/dchs_motion_sensors/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] :dynamic_color:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :dynamic_color:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':dynamic_color:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :dynamic_color) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :firebase_crashlytics:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :device_info_plus) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/device_info_plus/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/device_info_plus/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_crashlytics:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :dynamic_color) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/dynamic_color/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/dynamic_color/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :firebase_crashlytics:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':firebase_crashlytics:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :firebase_crashlytics) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :firebase_core:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_core:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_core:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':firebase_core:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :firebase_core) (Thread[#385,Execution worker,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :floating:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :floating:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :firebase_crashlytics) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/firebase_crashlytics/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/firebase_crashlytics/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :floating:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':floating:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':floating:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :floating) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :firebase_core) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/firebase_core/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/firebase_core/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :flutter_displaymode:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_displaymode:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_displaymode:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_displaymode:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :flutter_displaymode) (Thread[#385,Execution worker,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_maps_flutter_android:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] :google_maps_flutter_android:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :floating) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/floating/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/floating/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :flutter_displaymode) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/flutter_displaymode/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/flutter_displaymode/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_maps_flutter_android:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_maps_flutter_android:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :google_maps_flutter_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :local_auth_android:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :local_auth_android:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ +89 ms] > Task :local_auth_android:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':local_auth_android:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :local_auth_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_plugin_android_lifecycle:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :flutter_plugin_android_lifecycle) (Thread[#385,Execution worker,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :local_auth_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/local_auth_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/local_auth_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :flutter_secure_storage:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :flutter_secure_storage:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :flutter_secure_storage:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_secure_storage:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :flutter_secure_storage) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :flutter_plugin_android_lifecycle) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/flutter_plugin_android_lifecycle/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/flutter_plugin_android_lifecycle/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_api_availability_android:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :google_api_availability_android:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_api_availability_android:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_api_availability_android:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :google_api_availability_android) (Thread[#385,Execution worker,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :flutter_secure_storage) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/flutter_secure_storage/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/flutter_secure_storage/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :google_cast:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :google_cast:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :google_cast:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':google_cast:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_cast:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :google_cast) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :google_api_availability_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/google_api_availability_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/google_api_availability_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni_flutter:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :jni_flutter:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :google_cast) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/google_cast/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/google_cast/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :jni_flutter:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':jni_flutter:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :jni_flutter) (Thread[#385,Execution worker,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] :jni:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :jni:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':jni:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':jni:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :jni) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :google_maps_flutter_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/google_maps_flutter_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/google_maps_flutter_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :jni_flutter) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/jni_flutter/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/jni_flutter/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :media_kit_libs_android_video:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :media_kit_libs_android_video:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :media_kit_libs_android_video:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':media_kit_libs_android_video:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :media_kit_libs_android_video) (Thread[#385,Execution worker,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :media_kit_video:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :jni) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/jni/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/jni/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] :media_kit_video:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :media_kit_video:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':media_kit_video:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :media_kit_video) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :network_info_plus:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :network_info_plus:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :media_kit_libs_android_video) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/media_kit_libs_android_video/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/media_kit_libs_android_video/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :network_info_plus:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':network_info_plus:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :network_info_plus) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :wakelock_plus:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :media_kit_video) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/media_kit_video/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/media_kit_video/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :wakelock_plus:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':wakelock_plus:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :wakelock_plus) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :package_info_plus:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :package_info_plus:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :network_info_plus) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/network_info_plus/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/network_info_plus/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :wakelock_plus) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/wakelock_plus/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/wakelock_plus/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :package_info_plus:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':package_info_plus:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :package_info_plus) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :permission_handler_android:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :permission_handler_android:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :permission_handler_android:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':permission_handler_android:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :permission_handler_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :printing:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :printing:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :package_info_plus) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/package_info_plus/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/package_info_plus/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :printing:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':printing:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':printing:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :printing) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :screen_brightness_android:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :screen_brightness_android:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :permission_handler_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/permission_handler_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/permission_handler_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :screen_brightness_android:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':screen_brightness_android:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :screen_brightness_android) (Thread[#385,Execution worker,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :shared_preferences_android:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] :shared_preferences_android:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :printing) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/printing/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/printing/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :screen_brightness_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/screen_brightness_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/screen_brightness_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :shared_preferences_android:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':shared_preferences_android:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :shared_preferences_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :sqflite_android:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :sqflite_android:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :sqflite_android:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':sqflite_android:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :sqflite_android) (Thread[#385,Execution worker,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :streams_channel:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :streams_channel:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :streams_channel:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':streams_channel:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :streams_channel) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :streams_channel) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/streams_channel/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/streams_channel/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] > Transform bundleLibRuntimeToDirDebug (project :shared_preferences_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/shared_preferences_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/shared_preferences_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] > Transform bundleLibRuntimeToDirDebug (project :sqflite_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/sqflite_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/sqflite_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :url_launcher_android:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :url_launcher_android:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :url_launcher_android:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':url_launcher_android:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :url_launcher_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ +1 ms] Resolve mutations for :video_player_android:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :video_player_android:bundleLibRuntimeToDirDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :url_launcher_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/url_launcher_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/url_launcher_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :video_player_android:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':video_player_android:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :video_player_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :volume_controller:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :volume_controller:bundleLibRuntimeToDirDebug (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :volume_controller:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':volume_controller:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :volume_controller) (Thread[#385,Execution worker,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :exifinterface:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] :exifinterface:bundleLibRuntimeToDirDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :exifinterface:bundleLibRuntimeToDirDebug UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:bundleLibRuntimeToDirDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':exifinterface:bundleLibRuntimeToDirDebug' as it is up-to-date. +[ ] work action resolve bundleLibRuntimeToDirDebug (project :exifinterface) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] ClassesDirToClassesTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :volume_controller) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/volume_controller/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/volume_controller/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :aves_screen_state:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :aves_screen_state:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':aves_screen_state:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':aves_screen_state:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :aves_screen_state) (Thread[#385,Execution worker,5,main]) started. +[ ] IdentityTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :exifinterface) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/exifinterface/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/exifinterface/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform bundleLibRuntimeToDirDebug (project :video_player_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/video_player_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/video_player_android/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug as it is up-to-date. +[ ] > Transform classes.jar (project :aves_screen_state) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/aves_screen_state/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/aves_screen_state/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :connectivity_plus:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :app:mergeLibDexPlayDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :app:mergeLibDexPlayDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :app:mergeLibDexPlayDebug UP-TO-DATE +[ ] Caching disabled for task ':app:mergeLibDexPlayDebug' because: +[ ] Build cache is disabled +[ ] Skipping task ':app:mergeLibDexPlayDebug' as it is up-to-date. +[ ] :connectivity_plus:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :connectivity_plus:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':connectivity_plus:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':connectivity_plus:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :connectivity_plus) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] IdentityTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :dchs_motion_sensors:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :dchs_motion_sensors:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dchs_motion_sensors:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':dchs_motion_sensors:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':dchs_motion_sensors:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :dchs_motion_sensors) (Thread[#385,Execution worker,5,main]) started. +[ ] IdentityTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :device_info_plus:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :device_info_plus:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :device_info_plus:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':device_info_plus:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':device_info_plus:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :device_info_plus) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] IdentityTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform classes.jar (project :dchs_motion_sensors) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/dchs_motion_sensors/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ +1 ms] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/dchs_motion_sensors/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dynamic_color:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform classes.jar (project :connectivity_plus) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/connectivity_plus/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/connectivity_plus/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :dynamic_color:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dynamic_color:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':dynamic_color:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':dynamic_color:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :dynamic_color) (Thread[#385,Execution worker,5,main]) started. +[ ] IdentityTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform classes.jar (project :device_info_plus) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/device_info_plus/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/device_info_plus/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :firebase_crashlytics:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :firebase_crashlytics:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :firebase_crashlytics:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':firebase_crashlytics:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':firebase_crashlytics:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :firebase_crashlytics) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] IdentityTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :firebase_core:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :firebase_core:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform classes.jar (project :dynamic_color) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/dynamic_color/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/dynamic_color/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ +64 ms] > Task :firebase_core:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':firebase_core:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':firebase_core:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :firebase_core) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] IdentityTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :floating:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :floating:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :floating:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':floating:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':floating:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :floating) (Thread[#385,Execution worker,5,main]) started. +[ ] IdentityTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform classes.jar (project :firebase_core) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/firebase_core/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/firebase_core/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] > Transform classes.jar (project :firebase_crashlytics) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/firebase_crashlytics/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/firebase_crashlytics/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :flutter_displaymode:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :flutter_displaymode:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :flutter_displaymode:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_displaymode:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_displaymode:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :flutter_displaymode) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] IdentityTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :google_maps_flutter_android:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform classes.jar (project :floating) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/floating/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/floating/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :google_maps_flutter_android:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :google_maps_flutter_android:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':google_maps_flutter_android:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_maps_flutter_android:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :google_maps_flutter_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] IdentityTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :local_auth_android:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :local_auth_android:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :local_auth_android:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':local_auth_android:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':local_auth_android:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :local_auth_android) (Thread[#385,Execution worker,5,main]) started. +[ ] IdentityTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform classes.jar (project :flutter_displaymode) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/flutter_displaymode/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/flutter_displaymode/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform classes.jar (project :local_auth_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/local_auth_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/local_auth_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_plugin_android_lifecycle:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_plugin_android_lifecycle:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :flutter_plugin_android_lifecycle) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] IdentityTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :flutter_secure_storage:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_secure_storage:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform classes.jar (project :google_maps_flutter_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/google_maps_flutter_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/google_maps_flutter_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :flutter_secure_storage:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':flutter_secure_storage:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':flutter_secure_storage:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :flutter_secure_storage) (Thread[#385,Execution worker,5,main]) started. +[ ] IdentityTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform classes.jar (project :flutter_plugin_android_lifecycle) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/flutter_plugin_android_lifecycle/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/flutter_plugin_android_lifecycle/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :google_api_availability_android:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :google_api_availability_android:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :google_api_availability_android:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':google_api_availability_android:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_api_availability_android:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :google_api_availability_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] IdentityTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :google_cast:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :google_cast:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :google_cast:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':google_cast:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':google_cast:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :google_cast) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] IdentityTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform classes.jar (project :flutter_secure_storage) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/flutter_secure_storage/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/flutter_secure_storage/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] > Transform classes.jar (project :google_api_availability_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/google_api_availability_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/google_api_availability_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni_flutter:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :jni_flutter:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni_flutter:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':jni_flutter:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':jni_flutter:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :jni_flutter) (Thread[#385,Execution worker,5,main]) started. +[ ] IdentityTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform classes.jar (project :google_cast) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/google_cast/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/google_cast/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :jni:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :jni:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :jni:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':jni:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':jni:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :jni) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] IdentityTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :media_kit_libs_android_video:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :media_kit_libs_android_video:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :media_kit_libs_android_video:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':media_kit_libs_android_video:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':media_kit_libs_android_video:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :media_kit_libs_android_video) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] IdentityTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform classes.jar (project :jni) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/jni/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/jni/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :media_kit_video:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :media_kit_video:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform classes.jar (project :jni_flutter) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/jni_flutter/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/jni_flutter/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform classes.jar (project :media_kit_libs_android_video) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/media_kit_libs_android_video/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/media_kit_libs_android_video/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :media_kit_video:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':media_kit_video:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':media_kit_video:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :media_kit_video) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] IdentityTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :network_info_plus:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :network_info_plus:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :network_info_plus:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':network_info_plus:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':network_info_plus:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :network_info_plus) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] IdentityTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :wakelock_plus:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :wakelock_plus:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':wakelock_plus:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':wakelock_plus:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :wakelock_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] IdentityTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform classes.jar (project :network_info_plus) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/network_info_plus/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/network_info_plus/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] > Transform classes.jar (project :media_kit_video) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/media_kit_video/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/media_kit_video/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :package_info_plus:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :package_info_plus:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform classes.jar (project :wakelock_plus) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/wakelock_plus/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/wakelock_plus/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :package_info_plus:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':package_info_plus:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':package_info_plus:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :package_info_plus) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] IdentityTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :permission_handler_android:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :permission_handler_android:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :permission_handler_android:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':permission_handler_android:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':permission_handler_android:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :permission_handler_android) (Thread[#385,Execution worker,5,main]) started. +[ ] IdentityTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :printing:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :printing:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :printing:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':printing:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':printing:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :printing) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] IdentityTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform classes.jar (project :package_info_plus) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/package_info_plus/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/package_info_plus/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :screen_brightness_android:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :screen_brightness_android:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform classes.jar (project :permission_handler_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/permission_handler_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/permission_handler_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :screen_brightness_android:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':screen_brightness_android:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':screen_brightness_android:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :screen_brightness_android) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] IdentityTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :shared_preferences_android:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :shared_preferences_android:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform classes.jar (project :printing) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/printing/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/printing/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :shared_preferences_android:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':shared_preferences_android:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':shared_preferences_android:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :shared_preferences_android) (Thread[#385,Execution worker,5,main]) started. +[ ] IdentityTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :sqflite_android:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :sqflite_android:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :sqflite_android:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':sqflite_android:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':sqflite_android:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :sqflite_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] IdentityTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform classes.jar (project :screen_brightness_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/screen_brightness_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/screen_brightness_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :streams_channel:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :streams_channel:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform classes.jar (project :sqflite_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/sqflite_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/sqflite_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :streams_channel:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':streams_channel:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':streams_channel:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :streams_channel) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] IdentityTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :url_launcher_android:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform classes.jar (project :shared_preferences_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/shared_preferences_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/shared_preferences_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] :url_launcher_android:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Task :url_launcher_android:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':url_launcher_android:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':url_launcher_android:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :url_launcher_android) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] IdentityTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :video_player_android:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :video_player_android:bundleLibRuntimeToJarDebug (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :video_player_android:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':video_player_android:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':video_player_android:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :video_player_android) (Thread[#385,Execution worker,5,main]) started. +[ ] IdentityTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform classes.jar (project :url_launcher_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/url_launcher_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/url_launcher_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :volume_controller:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] :volume_controller:bundleLibRuntimeToJarDebug (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform classes.jar (project :streams_channel) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/streams_channel/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/streams_channel/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :volume_controller:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':volume_controller:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':volume_controller:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :volume_controller) (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] IdentityTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] Resolve mutations for :exifinterface:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] :exifinterface:bundleLibRuntimeToJarDebug (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :exifinterface:bundleLibRuntimeToJarDebug UP-TO-DATE +[ ] Caching disabled for task ':exifinterface:bundleLibRuntimeToJarDebug' because: +[ ] Build cache is disabled +[ ] Simple merging task +[ ] Skipping task ':exifinterface:bundleLibRuntimeToJarDebug' as it is up-to-date. +[ ] work action resolve classes.jar (project :exifinterface) (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] IdentityTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Transform classes.jar (project :video_player_android) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/video_player_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/video_player_android/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#385,Execution worker,5,main]) started. +[ ] DexingNoClasspathTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] Resolve mutations for :aves_screen_state:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :aves_screen_state:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Transform classes.jar (project :volume_controller) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/volume_controller/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/volume_controller/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#387,Execution worker Thread 3,5,main]) started. +[ ] > Transform classes.jar (project :exifinterface) with DexingNoClasspathTransform +[ ] Caching disabled for DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/exifinterface/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar because: +[ ] Build cache is disabled +[ ] Skipping DexingNoClasspathTransform: /Volumes/terrain/aves_mio54/build/exifinterface/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar as it is up-to-date. +[ ] DexingOutputSplitTransform (Thread[#386,Execution worker Thread 2,5,main]) started. +[ ] > Task :aves_screen_state:processDebugJavaRes UP-TO-DATE +[ ] file or directory '/Volumes/terrain/aves_mio54/plugins/aves_screen_state/android/src/main/resources', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/plugins/aves_screen_state/android/src/debug/resources', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/plugins/aves_screen_state/android/src/main/resources', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/plugins/aves_screen_state/android/src/debug/resources', not found +[ ] Caching disabled for task ':aves_screen_state:processDebugJavaRes' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':aves_screen_state:processDebugJavaRes' as it is up-to-date. +[ ] work action resolve out (project :aves_screen_state) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :connectivity_plus:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :connectivity_plus:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :connectivity_plus:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/android/src/debug/resources', not found +[ ] Skipping task ':connectivity_plus:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :connectivity_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dchs_motion_sensors:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :dchs_motion_sensors:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :dchs_motion_sensors:processDebugJavaRes UP-TO-DATE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/android/src/debug/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/android/src/debug/resources', not found +[ ] Caching disabled for task ':dchs_motion_sensors:processDebugJavaRes' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':dchs_motion_sensors:processDebugJavaRes' as it is up-to-date. +[ ] work action resolve out (project :dchs_motion_sensors) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :device_info_plus:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :device_info_plus:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :device_info_plus:processDebugJavaRes UP-TO-DATE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/android/src/debug/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/android/src/debug/resources', not found +[ ] Caching disabled for task ':device_info_plus:processDebugJavaRes' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':device_info_plus:processDebugJavaRes' as it is up-to-date. +[ ] work action resolve out (project :device_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :dynamic_color:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :dynamic_color:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ +77 ms] > Task :dynamic_color:processDebugJavaRes UP-TO-DATE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/android/src/debug/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/android/src/debug/resources', not found +[ ] Caching disabled for task ':dynamic_color:processDebugJavaRes' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':dynamic_color:processDebugJavaRes' as it is up-to-date. +[ ] work action resolve out (project :dynamic_color) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :exifinterface:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :exifinterface:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :exifinterface:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Volumes/terrain/aves_mio54/android/exifinterface/src/main/resources', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/exifinterface/src/debug/resources', not found +[ ] Skipping task ':exifinterface:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :exifinterface) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :firebase_core:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_core:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_core:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/android/src/debug/resources', not found +[ ] Skipping task ':firebase_core:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :firebase_core) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :firebase_crashlytics:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :firebase_crashlytics:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :firebase_crashlytics:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/firebase_crashlytics-5.2.0/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/firebase_crashlytics-5.2.0/android/src/debug/resources', not found +[ ] Skipping task ':firebase_crashlytics:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :firebase_crashlytics) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :floating:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :floating:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :floating:processDebugJavaRes UP-TO-DATE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/floating-6.0.0/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/floating-6.0.0/android/src/debug/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/floating-6.0.0/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/floating-6.0.0/android/src/debug/resources', not found +[ ] Caching disabled for task ':floating:processDebugJavaRes' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':floating:processDebugJavaRes' as it is up-to-date. +[ ] work action resolve out (project :floating) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_displaymode:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_displaymode:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_displaymode:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_displaymode-0.7.0/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_displaymode-0.7.0/android/src/debug/resources', not found +[ ] Skipping task ':flutter_displaymode:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :flutter_displaymode) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_plugin_android_lifecycle:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_plugin_android_lifecycle:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_plugin_android_lifecycle:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.34/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.34/android/src/debug/resources', not found +[ ] Skipping task ':flutter_plugin_android_lifecycle:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :flutter_plugin_android_lifecycle) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :flutter_secure_storage:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :flutter_secure_storage:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :flutter_secure_storage:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/android/src/debug/resources', not found +[ ] Skipping task ':flutter_secure_storage:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :flutter_secure_storage) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_api_availability_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :google_api_availability_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_api_availability_android:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability_android-1.1.1/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability_android-1.1.1/android/src/debug/resources', not found +[ ] Skipping task ':google_api_availability_android:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :google_api_availability_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_cast:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :google_cast:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_cast:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Volumes/terrain/aves_mio54/plugins/google_cast/android/src/main/resources', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/plugins/google_cast/android/src/debug/resources', not found +[ ] Skipping task ':google_cast:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :google_cast) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :google_maps_flutter_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :google_maps_flutter_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :google_maps_flutter_android:processDebugJavaRes UP-TO-DATE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_android-2.19.8/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_android-2.19.8/android/src/debug/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_android-2.19.8/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_android-2.19.8/android/src/debug/resources', not found +[ ] Caching disabled for task ':google_maps_flutter_android:processDebugJavaRes' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':google_maps_flutter_android:processDebugJavaRes' as it is up-to-date. +[ ] work action resolve out (project :google_maps_flutter_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :jni:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/jni-1.0.0/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/jni-1.0.0/android/src/debug/resources', not found +[ ] Skipping task ':jni:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :jni) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :jni_flutter:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :jni_flutter:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :jni_flutter:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/android/src/debug/resources', not found +[ ] Skipping task ':jni_flutter:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :jni_flutter) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :local_auth_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :local_auth_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :local_auth_android:processDebugJavaRes UP-TO-DATE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/local_auth_android-2.0.8/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/local_auth_android-2.0.8/android/src/debug/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/local_auth_android-2.0.8/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/local_auth_android-2.0.8/android/src/debug/resources', not found +[ ] Caching disabled for task ':local_auth_android:processDebugJavaRes' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':local_auth_android:processDebugJavaRes' as it is up-to-date. +[ ] work action resolve out (project :local_auth_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :media_kit_libs_android_video:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :media_kit_libs_android_video:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :media_kit_libs_android_video:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8/android/src/debug/resources', not found +[ ] Skipping task ':media_kit_libs_android_video:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :media_kit_libs_android_video) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :media_kit_video:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :media_kit_video:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :media_kit_video:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/android/src/debug/resources', not found +[ ] Skipping task ':media_kit_video:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :media_kit_video) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :network_info_plus:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :network_info_plus:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :network_info_plus:processDebugJavaRes UP-TO-DATE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/android/src/debug/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/android/src/debug/resources', not found +[ ] Caching disabled for task ':network_info_plus:processDebugJavaRes' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':network_info_plus:processDebugJavaRes' as it is up-to-date. +[ ] work action resolve out (project :network_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :package_info_plus:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :package_info_plus:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :package_info_plus:processDebugJavaRes UP-TO-DATE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/android/src/debug/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/android/src/debug/resources', not found +[ ] Caching disabled for task ':package_info_plus:processDebugJavaRes' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':package_info_plus:processDebugJavaRes' as it is up-to-date. +[ ] work action resolve out (project :package_info_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :permission_handler_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :permission_handler_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :permission_handler_android:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_android-13.0.1/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_android-13.0.1/android/src/debug/resources', not found +[ ] Skipping task ':permission_handler_android:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :permission_handler_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :printing:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :printing:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :printing:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/android/src/debug/resources', not found +[ ] Skipping task ':printing:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :printing) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :screen_brightness_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :screen_brightness_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :screen_brightness_android:processDebugJavaRes UP-TO-DATE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/android/src/debug/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/android/src/debug/resources', not found +[ ] Caching disabled for task ':screen_brightness_android:processDebugJavaRes' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':screen_brightness_android:processDebugJavaRes' as it is up-to-date. +[ ] work action resolve out (project :screen_brightness_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :shared_preferences_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :shared_preferences_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :shared_preferences_android:processDebugJavaRes UP-TO-DATE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.18/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.18/android/src/debug/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.18/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.18/android/src/debug/resources', not found +[ ] Caching disabled for task ':shared_preferences_android:processDebugJavaRes' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':shared_preferences_android:processDebugJavaRes' as it is up-to-date. +[ ] work action resolve out (project :shared_preferences_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :sqflite_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :sqflite_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :sqflite_android:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+2/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+2/android/src/debug/resources', not found +[ ] Skipping task ':sqflite_android:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :sqflite_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :streams_channel:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :streams_channel:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :streams_channel:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/git/aves_streams_channel-35a9b0fcc0e97f756756c0010fb223129c2d832c/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/git/aves_streams_channel-35a9b0fcc0e97f756756c0010fb223129c2d832c/android/src/debug/resources', not found +[ ] Skipping task ':streams_channel:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :streams_channel) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :url_launcher_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :url_launcher_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :url_launcher_android:processDebugJavaRes NO-SOURCE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.29/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.29/android/src/debug/resources', not found +[ ] Skipping task ':url_launcher_android:processDebugJavaRes' as it has no source files and no previous output files. +[ ] work action resolve out (project :url_launcher_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :video_player_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :video_player_android:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :video_player_android:processDebugJavaRes UP-TO-DATE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/video_player_android-2.9.5/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/video_player_android-2.9.5/android/src/debug/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/video_player_android-2.9.5/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/video_player_android-2.9.5/android/src/debug/resources', not found +[ ] Caching disabled for task ':video_player_android:processDebugJavaRes' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':video_player_android:processDebugJavaRes' as it is up-to-date. +[ ] work action resolve out (project :video_player_android) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :volume_controller:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :volume_controller:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :volume_controller:processDebugJavaRes UP-TO-DATE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/android/src/debug/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/android/src/debug/resources', not found +[ ] Caching disabled for task ':volume_controller:processDebugJavaRes' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':volume_controller:processDebugJavaRes' as it is up-to-date. +[ ] work action resolve out (project :volume_controller) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :wakelock_plus:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] :wakelock_plus:processDebugJavaRes (Thread[#385,Execution worker,5,main]) started. +[ ] > Task :wakelock_plus:processDebugJavaRes UP-TO-DATE +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/android/src/debug/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/android/src/main/resources', not found +[ ] file or directory '/Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/android/src/debug/resources', not found +[ ] Caching disabled for task ':wakelock_plus:processDebugJavaRes' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Skipping task ':wakelock_plus:processDebugJavaRes' as it is up-to-date. +[ ] work action resolve out (project :wakelock_plus) (Thread[#385,Execution worker,5,main]) started. +[ ] Resolve mutations for :app:compileFlutterBuildLibre_romDebug (Thread[#385,Execution worker,5,main]) started. +[ ] :app:compileFlutterBuildLibre_romDebug (Thread[#385,Execution worker,5,main]) started. +[+1392 ms] > Task :app:kspPlayDebugKotlin +[ ] Caching disabled for task ':app:kspPlayDebugKotlin' because: +[ ] Build cache is disabled +[ ] Task ':app:kspPlayDebugKotlin' is not up-to-date because: +[ ] Value of input property 'kspConfig.logLevel' has changed for task ':app:kspPlayDebugKotlin' +[ ] The input changes require a full rebuild for incremental task ':app:kspPlayDebugKotlin'. +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] i: [ksp] loaded provider(s): [com.bumptech.glide.annotation.ksp.GlideSymbolProcessorProvider] +[ +591 ms] i: [ksp] Found index annotation: GlideIndexer_GlideModule_deckers_thibault_aves_glide_SvgGlideModule_deckers_thibault_aves_glide_MultiPageImageGlideModule_deckers_thibault_aves_glide_TiffGlideModule_deckers_thibault_aves_glide_VideoThumbnailGlideModule with modules: [deckers.thibault.aves.glide.SvgGlideModule, deckers.thibault.aves.glide.MultiPageImageGlideModule, deckers.thibault.aves.glide.TiffGlideModule, deckers.thibault.aves.glide.VideoThumbnailGlideModule] +[ +199 ms] > Task :app:compileFlutterBuildLibre_romDebug +[ ] Caching disabled for task ':app:compileFlutterBuildLibre_romDebug' because: +[ ] Build cache is disabled +[ ] Caching has not been enabled for the task +[ ] Task ':app:compileFlutterBuildLibre_romDebug' is not up-to-date because: +[ ] Value of input property 'verbose' has changed for task ':app:compileFlutterBuildLibre_romDebug' +[ ] Starting process 'command '/Users/fabio/fvm/versions/3.35.7/bin/flutter''. Working directory: /Volumes/terrain/aves_mio54 Command: /Users/fabio/fvm/versions/3.35.7/bin/flutter --verbose assemble --no-version-check --depfile /Volumes/terrain/aves_mio54/build/app/intermediates/flutter/libre_romDebug/flutter_build.d --output /Volumes/terrain/aves_mio54/build/app/intermediates/flutter/libre_romDebug -dTargetFile=lib/main_play.dart -dTargetPlatform=android -dBuildMode=debug -dTrackWidgetCreation=true --DartDefines=RkxVVFRFUl9BUFBfRkxBVk9SPXBsYXk=,RkxVVFRFUl9WRVJTSU9OPTMuMzUuNw==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049YWRjOTAxMDYyNQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDM1MzE2NTY1YQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My45LjI= -dFlavor=libre_rom -dAndroidArchs=android-arm android-arm64 android-x64 -dMinSdkVersion=24 debug_android_application +[ ] Successfully started process 'command '/Users/fabio/fvm/versions/3.35.7/bin/flutter'' +[ ] [ +53 ms] executing: sysctl hw.optional.arm64 +[ ] [ +11 ms] Exit code 1 from: sysctl hw.optional.arm64 +[ ] [ ] sysctl: unknown oid 'hw.optional.arm64' +[ ] [ +12 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update. +[ ] [ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ ] [ +6 ms] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update. +[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update. +[ ] [ +13 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ ] [ +3 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ ] [ +103 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update. +[ ] [ +2 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update. +[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update. +[ ] [ ] Artifact Instance of 'PubDependencies' is not required, skipping update. +[ ] [ +75 ms] Initializing file store +[ ] [ +29 ms] Done initializing file store +[ ] [ +232 ms] Skipping target: gen_localizations +[ ] [ +3 ms] Skipping target: gen_dart_plugin_registrant +[ ] [ +2 ms] Skipping target: dart_build +[+1402 ms] [+2399 ms] Skipping target: kernel_snapshot_program +[ ] [ +8 ms] Skipping target: install_code_assets +[ ] [ +3 ms] invalidated build due to missing files: /Volumes/terrain/aves_mio54/DOES_NOT_EXIST_RERUN_FOR_WILDCARD72940985 +[+1496 ms] [+1442 ms] debug_android_application: Starting due to {InvalidatedReasonKind.inputMissing: The following inputs were missing: /Volumes/terrain/aves_mio54/DOES_NOT_EXIST_RERUN_FOR_WILDCARD72940985} +[ +702 ms] [ +790 ms] Manifest contained wildcard assets. Inserting missing file into build graph to force rerun. for more information see #56466. +[ ] [ +10 ms] shaderc command: [/Users/fabio/fvm/versions/3.35.7/bin/cache/artifacts/engine/darwin-x64/impellerc, --sksl, --runtime-stage-gles, --runtime-stage-gles3, --runtime-stage-vulkan, --iplr, --sl=/Volumes/terrain/aves_mio54/build/app/intermediates/flutter/libre_romDebug/flutter_assets/shaders/ink_sparkle.frag, --spirv=/Volumes/terrain/aves_mio54/build/app/intermediates/flutter/libre_romDebug/flutter_assets/shaders/ink_sparkle.frag.spirv, --input=/Users/fabio/fvm/versions/3.35.7/packages/flutter/lib/src/material/shaders/ink_sparkle.frag, --input-type=frag, --include=/Users/fabio/fvm/versions/3.35.7/packages/flutter/lib/src/material/shaders, --include=/Users/fabio/fvm/versions/3.35.7/bin/cache/artifacts/engine/darwin-x64/shader_lib] +[ +894 ms] [ +815 ms] debug_android_application: Complete +[+1199 ms] [+1218 ms] Persisting file store +[ ] [ +20 ms] Done persisting file store +[ +106 ms] [ +54 ms] build succeeded. +[ ] [ +11 ms] "flutter assemble" took 7.242ms. +[ ] [ +6 ms] executing: sw_vers -productName +[ ] [ +20 ms] Exit code 0 from: sw_vers -productName +[ ] [ ] macOS +[ ] [ ] executing: sw_vers -productVersion +[ ] [ +20 ms] Exit code 0 from: sw_vers -productVersion +[ ] [ ] 13.7.7 +[ ] [ ] executing: sw_vers -buildVersion +[ ] [ +17 ms] Exit code 0 from: sw_vers -buildVersion +[ ] [ ] 22H722 +[ ] [ ] executing: uname -m +[ +94 ms] [ +7 ms] Exit code 0 from: uname -m +[ ] [ ] x86_64 +[ ] [ +84 ms] Running 1 shutdown hook +[ ] [ +1 ms] Shutdown hooks complete +[ +105 ms] [ +97 ms] exiting with code 0 +[ +98 ms] Resolve mutations for :app:compilePlayDebugKotlin (Thread[#385,Execution worker,5,main]) started. +[ ] :app:compilePlayDebugKotlin (Thread[#385,Execution worker,5,main]) started. +[ +100 ms] Resolve mutations for :app:packJniLibsflutterBuildLibre_romDebug (Thread[#384,included builds,5,main]) started. +[ ] :app:packJniLibsflutterBuildLibre_romDebug (Thread[#384,included builds,5,main]) started. +[ ] > Task :app:packJniLibsflutterBuildLibre_romDebug +[ ] Caching disabled for task ':app:packJniLibsflutterBuildLibre_romDebug' because: +[ ] Build cache is disabled +[ ] Not worth caching +[ ] Task ':app:packJniLibsflutterBuildLibre_romDebug' is not up-to-date because: +[ ] Output property 'archiveFile' file /Volumes/terrain/aves_mio54/build/app/intermediates/flutter/libre_romDebug/libs.jar has been removed. +[ ] file or directory '/Volumes/terrain/aves_mio54/build/app/intermediates/flutter/libre_romDebug/armeabi-v7a', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/build/native_assets/android/jniLibs/lib/armeabi-v7a', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/build/app/intermediates/flutter/libre_romDebug/arm64-v8a', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/build/native_assets/android/jniLibs/lib/arm64-v8a', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/build/app/intermediates/flutter/libre_romDebug/x86_64', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/build/native_assets/android/jniLibs/lib/x86_64', not found +[ ] Resolve mutations for :app:preLibre_romDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] :app:preLibre_romDebugBuild (Thread[#384,included builds,5,main]) started. +[ ] > Task :app:preLibre_romDebugBuild UP-TO-DATE +[ ] Skipping task ':app:preLibre_romDebugBuild' as it has no actions. +[ ] Resolve mutations for :app:configureCMakeDebug[arm64-v8a] (Thread[#384,included builds,5,main]) started. +[ ] :app:configureCMakeDebug[arm64-v8a] (Thread[#384,included builds,5,main]) started. +[+1893 ms] > Task :app:compilePlayDebugKotlin +[ ] Adding -Xuse-inline-scopes-numbers Kotlin compiler flag for task :app:compilePlayDebugAndroidTestKotlin +[ ] Registered task dependencies: app:kotlinCompilerClasspath +[ ] Starting dependency analysis +[ ] Registered task dependencies: app:kotlinCompilerPluginClasspathPlayDebug +[ ] Starting dependency analysis +[ ] Caching disabled for task ':app:compilePlayDebugKotlin' because: +[ ] Build cache is disabled +[ ] Task ':app:compilePlayDebugKotlin' is not up-to-date because: +[ ] Task has failed previously. +[ ] The input changes require a full rebuild for incremental task ':app:compilePlayDebugKotlin'. +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/build/app/generated/ksp/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/build/app/generated/ksp/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/build/app/generated/ksp/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/build/app/generated/ksp/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/build/app/generated/ksp/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/build/app/generated/ksp/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/build/app/generated/ksp/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/kotlin', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/play/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/debug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/android/app/src/playDebug/java', not found +[ ] file or directory '/Volumes/terrain/aves_mio54/build/app/generated/ksp/playDebug/java', not found +[ +1 ms] Kotlin source files: /Volumes/terrain/aves_mio54/build/app/generated/ksp/playDebug/kotlin/com/bumptech/glide/annotation/ksp/GlideIndexer_GlideModule_deckers_thibault_aves_glide_SvgGlideModule_deckers_thibault_aves_glide_MultiPageImageGlideModule_deckers_thibault_aves_glide_TiffGlideModule_deckers_thibault_aves_glide_VideoThumbnailGlideModule.kt, /Volumes/terrain/aves_mio54/build/app/generated/ksp/playDebug/kotlin/com/bumptech/glide/GeneratedAppGlideModuleImpl.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/HomeWidgetProvider.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/WallpaperActivity.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/glide/SvgGlideModule.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/glide/MultiPageImageGlideModule.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/glide/TiffGlideModule.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/glide/AvesAppGlideModule.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/glide/VideoThumbnailGlideModule.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/SearchSuggestionsProvider.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/StorageUtils.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/HashUtils.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/ContextUtils.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/Compat33.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/FlutterUtils.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/MathUtils.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/BmpWriter.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/MemoryUtils.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/CollectionUtils.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/Compat.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/UriUtils.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/ExceptionUtils.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/LogUtils.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/ByteUtils.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/PermissionManager.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/utils/FileUtils.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/decoding/SvgRegionFetcher.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/decoding/RegionFetcher.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/decoding/TiffRegionFetcher.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/decoding/ThumbnailFetcher.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/HomeWidgetConfigureActivity.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaStoreHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaEditHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AccessibilityHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/StorageHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/Coresult.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataEditHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GlobalSearchHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppProfileHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/EmbeddedDataHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/SecurityHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AnalysisHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchObjectHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/WindowHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ServiceWindowHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/window/ActivityWindowHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/WallpaperHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GeocodingHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaSessionHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/HomeWidgetHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/IntentStreamHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/MediaStoreChangeStreamHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/ErrorStreamHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/AnalysisStreamHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/SettingsChangeStreamHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/WindowChangeStreamHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/platformtodart/MediaCommandStreamHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/ImageByteStreamHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/ActivityResultStreamHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/ImageOpStreamHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/darttoplatform/MediaStoreStreamHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/BaseStreamHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/ScreenSaverSettingsActivity.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/model/ExifOrientationOp.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/model/EntryFields.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/model/FieldMap.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/AvesEmbeddedMediaProvider.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/FileImageProvider.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/UnknownContentProvider.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProviderFactory.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/model/NameConflictStrategy.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceEntry.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/ScreenSaverService.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MediaPlaybackService.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MediaMetadataRetrieverHelper.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/Helper.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeXmpReader.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePsdMetadataReader.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePsdReader.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpEntryDirectory.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpfReader.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpfDirectory.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpEntry.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/PngActlDirectory.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeExifTiffHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeMp4UuidBoxHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePngMetadataReader.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePhotoshopReader.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeMp4BoxHandler.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/PixyMetaHelper.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/DngTags.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/QuickTimeMetadata.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/SvgHelper.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/xmp/GoogleDeviceContainer.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/xmp/GoogleXMP.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/xmp/XMP.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/SphericalVideo.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/GeoTiffTags.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/ExifInterfaceHelper.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiTrackMedia.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Mp4ParserHelper.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/metadata/ExifTags.kt, /Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/EntryPathChannel.kt +[ ] Java source files: /Volumes/terrain/aves_mio54/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java +[ ] Script source files: +[ ] Script file extensions: +[ ] Using Kotlin/JVM incremental compilation +[ ] [KOTLIN] Kotlin compilation 'jdkHome' argument: null +[ ] Options for KOTLIN DAEMON: IncrementalCompilationOptions(super=CompilationOptions(compilerMode=INCREMENTAL_COMPILER, targetPlatform=JVM, reportCategories=[0, 3], reportSeverity=2, requestedCompilationResults=[0], kotlinScriptExtensions=[]), sourceChanges=org.jetbrains.kotlin.buildtools.api.SourcesChanges$Unknown@755cae8c, classpathChanges=NotAvailableForNonIncrementalRun, workingDir=/Volumes/terrain/aves_mio54/build/app/kotlin/compilePlayDebugKotlin/cacheable, multiModuleICSettings=MultiModuleICSettings(buildHistoryFile=/Volumes/terrain/aves_mio54/build/app/kotlin/compilePlayDebugKotlin/local-state/build-history.bin, useModuleDetection=true), icFeatures=IncrementalCompilationFeatures(usePreciseJavaTracking=true, withAbiSnapshot=false, preciseCompilationResultsBackup=true, keepIncrementalCompilationCachesInMemory=true, enableUnsafeIncrementalCompilationForMultiplatform=false, enableMonotonousIncrementalCompileSetExpansion=true), outputFiles=[/Volumes/terrain/aves_mio54/build/app/tmp/kotlin-classes/playDebug, /Volumes/terrain/aves_mio54/build/app/kotlin/compilePlayDebugKotlin/cacheable, /Volumes/terrain/aves_mio54/build/app/kotlin/compilePlayDebugKotlin/local-state]) +[+4095 ms] > Task :app:configureCMakeDebug[arm64-v8a] +[ ] Caching disabled for task ':app:configureCMakeDebug[arm64-v8a]' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Task ':app:configureCMakeDebug[arm64-v8a]' is not up-to-date because: +[ ] Task.upToDateWhen is false. +[ ] C/C++: SDK Manager found the following installed packages: build-tools;28.0.3 build-tools;30.0.3 build-tools;33.0.1 build-tools;34.0.0 build-tools;35.0.0 build-tools;35.0.1 build-tools;36.0.0 cmake;3.18.1 cmake;3.22.1 cmake;3.31.6 cmake;3.6.4111459 cmake;4.0.2 cmdline-tools;latest emulator extras;android;m2repository extras;google;google_play_services extras;google;m2repository extras;google;webdriver ndk;25.2.9519653 ndk;26.3.11579264 ndk;27.0.12077973 ndk;27.2.12479018 ndk;29.0.13113456 platform-tools platforms;android-10 platforms;android-24 platforms;android-28 platforms;android-31 platforms;android-33 platforms;android-34 platforms;android-35 platforms;android-36 sources;android-24 sources;android-33 sources;android-35 sources;android-36 system-images;android-35;default;x86_64 system-images;android-36;google_apis_playstore;x86_64 +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|arm64-v8a : Start JSON generation. Platform version: 24 min SDK version: arm64-v8a +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|arm64-v8a : rebuilding JSON /Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/arm64-v8a/android_gradle_build.json due to: +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|arm64-v8a : - no fingerprint file, will remove stale configuration folder +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|arm64-v8a : removing stale contents from '/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/arm64-v8a' +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|arm64-v8a : created folder '/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/arm64-v8a' +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|arm64-v8a : executing cmake /Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake \ +[ ] -H/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts \ +[ ] -DCMAKE_SYSTEM_NAME=Android \ +[ ] -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ +[ ] -DCMAKE_SYSTEM_VERSION=24 \ +[ ] -DANDROID_PLATFORM=android-24 \ +[ ] -DANDROID_ABI=arm64-v8a \ +[ ] -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \ +[ ] -DANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 \ +[ ] -DCMAKE_ANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 \ +[ ] -DCMAKE_TOOLCHAIN_FILE=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake \ +[ ] -DCMAKE_MAKE_PROGRAM=/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/ninja \ +[ ] -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/arm64-v8a \ +[ ] -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/arm64-v8a \ +[ ] -B/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/arm64-v8a \ +[ ] -GNinja \ +[ ] -Wno-dev \ +[ ] --no-warn-unused-cli \ +[ ] -DCMAKE_BUILD_TYPE=debug +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|arm64-v8a : /Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake \ +[ ] -H/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts \ +[ ] -DCMAKE_SYSTEM_NAME=Android \ +[ ] -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ +[ ] -DCMAKE_SYSTEM_VERSION=24 \ +[ ] -DANDROID_PLATFORM=android-24 \ +[ ] -DANDROID_ABI=arm64-v8a \ +[ ] -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \ +[ ] -DANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 \ +[ ] -DCMAKE_ANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 \ +[ ] -DCMAKE_TOOLCHAIN_FILE=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake \ +[ ] -DCMAKE_MAKE_PROGRAM=/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/ninja \ +[ ] -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/arm64-v8a \ +[ ] -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/arm64-v8a \ +[ ] -B/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/arm64-v8a \ +[ ] -GNinja \ +[ ] -Wno-dev \ +[ ] --no-warn-unused-cli \ +[ ] -DCMAKE_BUILD_TYPE=debug +[ ] Starting process 'command '/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake''. Working directory: /Volumes/terrain/aves_mio54/android/app Command: /Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake -H/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts -DCMAKE_SYSTEM_NAME=Android -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_SYSTEM_VERSION=24 -DANDROID_PLATFORM=android-24 -DANDROID_ABI=arm64-v8a -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a -DANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 -DCMAKE_ANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 -DCMAKE_TOOLCHAIN_FILE=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake -DCMAKE_MAKE_PROGRAM=/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/ninja -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/arm64-v8a -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/arm64-v8a -B/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/arm64-v8a -GNinja -Wno-dev --no-warn-unused-cli -DCMAKE_BUILD_TYPE=debug +[ ] Successfully started process 'command '/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake'' +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|arm64-v8a : Received process result: 0 +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|arm64-v8a : /Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/arm64-v8a/compile_commands.json.bin existed but not /Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/arm64-v8a/compile_commands.json +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|arm64-v8a : done executing cmake +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|arm64-v8a : JSON generation completed without problems +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|arm64-v8a : Writing build model to /Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/logs/arm64-v8a/build_model.json +[ ] Resolve mutations for :app:buildCMakeDebug[arm64-v8a] (Thread[#384,included builds,5,main]) started. +[ ] :app:buildCMakeDebug[arm64-v8a] (Thread[#384,included builds,5,main]) started. +[ ] > Task :app:buildCMakeDebug[arm64-v8a] +[ ] Caching disabled for task ':app:buildCMakeDebug[arm64-v8a]' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Task ':app:buildCMakeDebug[arm64-v8a]' is not up-to-date because: +[ ] Task.upToDateWhen is false. +[ ] C/C++: starting build +[ ] C/C++: reading expected JSONs +[ ] C/C++: done reading expected JSONs +[ ] C/C++: executing build commands for targets that produce .so files or executables +[ ] C/C++: evaluate miniconfig +[ ] C/C++: no libraries +[ ] Resolve mutations for :app:configureCMakeDebug[armeabi-v7a] (Thread[#384,included builds,5,main]) started. +[ ] :app:configureCMakeDebug[armeabi-v7a] (Thread[#384,included builds,5,main]) started. +[ +890 ms] > Task :app:configureCMakeDebug[armeabi-v7a] +[ ] Caching disabled for task ':app:configureCMakeDebug[armeabi-v7a]' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Task ':app:configureCMakeDebug[armeabi-v7a]' is not up-to-date because: +[ ] Task.upToDateWhen is false. +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|armeabi-v7a : Start JSON generation. Platform version: 24 min SDK version: armeabi-v7a +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|armeabi-v7a : rebuilding JSON /Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/armeabi-v7a/android_gradle_build.json due to: +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|armeabi-v7a : - no fingerprint file, will remove stale configuration folder +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|armeabi-v7a : removing stale contents from '/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/armeabi-v7a' +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|armeabi-v7a : created folder '/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/armeabi-v7a' +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|armeabi-v7a : executing cmake /Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake \ +[ ] -H/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts \ +[ ] -DCMAKE_SYSTEM_NAME=Android \ +[ ] -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ +[ ] -DCMAKE_SYSTEM_VERSION=24 \ +[ ] -DANDROID_PLATFORM=android-24 \ +[ ] -DANDROID_ABI=armeabi-v7a \ +[ ] -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a \ +[ ] -DANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 \ +[ ] -DCMAKE_ANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 \ +[ ] -DCMAKE_TOOLCHAIN_FILE=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake \ +[ ] -DCMAKE_MAKE_PROGRAM=/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/ninja \ +[ ] -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/armeabi-v7a \ +[ ] -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/armeabi-v7a \ +[ ] -B/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/armeabi-v7a \ +[ ] -GNinja \ +[ ] -Wno-dev \ +[ ] --no-warn-unused-cli \ +[ ] -DCMAKE_BUILD_TYPE=debug +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|armeabi-v7a : /Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake \ +[ ] -H/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts \ +[ ] -DCMAKE_SYSTEM_NAME=Android \ +[ ] -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ +[ ] -DCMAKE_SYSTEM_VERSION=24 \ +[ ] -DANDROID_PLATFORM=android-24 \ +[ ] -DANDROID_ABI=armeabi-v7a \ +[ ] -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a \ +[ ] -DANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 \ +[ ] -DCMAKE_ANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 \ +[ ] -DCMAKE_TOOLCHAIN_FILE=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake \ +[ ] -DCMAKE_MAKE_PROGRAM=/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/ninja \ +[ ] -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/armeabi-v7a \ +[ ] -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/armeabi-v7a \ +[ ] -B/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/armeabi-v7a \ +[ ] -GNinja \ +[ ] -Wno-dev \ +[ ] --no-warn-unused-cli \ +[ ] -DCMAKE_BUILD_TYPE=debug +[ ] Starting process 'command '/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake''. Working directory: /Volumes/terrain/aves_mio54/android/app Command: /Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake -H/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts -DCMAKE_SYSTEM_NAME=Android -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_SYSTEM_VERSION=24 -DANDROID_PLATFORM=android-24 -DANDROID_ABI=armeabi-v7a -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 -DCMAKE_ANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 -DCMAKE_TOOLCHAIN_FILE=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake -DCMAKE_MAKE_PROGRAM=/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/ninja -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/armeabi-v7a -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/armeabi-v7a -B/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/armeabi-v7a -GNinja -Wno-dev --no-warn-unused-cli -DCMAKE_BUILD_TYPE=debug +[ ] Successfully started process 'command '/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake'' +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|armeabi-v7a : Received process result: 0 +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|armeabi-v7a : /Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/armeabi-v7a/compile_commands.json.bin existed but not /Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/armeabi-v7a/compile_commands.json +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|armeabi-v7a : done executing cmake +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|armeabi-v7a : JSON generation completed without problems +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|armeabi-v7a : Writing build model to /Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/logs/armeabi-v7a/build_model.json +[ ] Resolve mutations for :app:buildCMakeDebug[armeabi-v7a] (Thread[#384,included builds,5,main]) started. +[ ] :app:buildCMakeDebug[armeabi-v7a] (Thread[#384,included builds,5,main]) started. +[ ] > Task :app:buildCMakeDebug[armeabi-v7a] +[ ] Caching disabled for task ':app:buildCMakeDebug[armeabi-v7a]' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Task ':app:buildCMakeDebug[armeabi-v7a]' is not up-to-date because: +[ ] Task.upToDateWhen is false. +[ ] C/C++: starting build +[ ] C/C++: reading expected JSONs +[ ] C/C++: done reading expected JSONs +[ ] C/C++: executing build commands for targets that produce .so files or executables +[ ] C/C++: evaluate miniconfig +[ ] C/C++: no libraries +[ ] Resolve mutations for :app:configureCMakeDebug[x86_64] (Thread[#384,included builds,5,main]) started. +[ ] :app:configureCMakeDebug[x86_64] (Thread[#384,included builds,5,main]) started. +[ +105 ms] > Task :app:compilePlayDebugKotlin FAILED +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:75:29 Unresolved reference 'app'. +[ +1 ms] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:76:46 Unresolved reference 'CastButtonFactory'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:78:46 Unresolved reference 'CastContext'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:81:29 Unresolved reference 'CastActivityProvider'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:82:29 Unresolved reference 'FlutterCastFrameworkPlugin'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:98:29 Unresolved reference 'MediaRouteButton'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:108:9 Unresolved reference 'CastContext'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:115:18 Unresolved reference 'MediaRouteButton'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:115:41 Cannot infer type for type parameter 'T'. Specify it explicitly. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:115:47 Cannot infer type for type parameter 'T'. Specify it explicitly. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:116:9 Unresolved reference 'CastButtonFactory'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:116:68 Cannot infer type for type parameter 'T'. Specify it explicitly. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:147:27 Unresolved reference 'FlutterCastFrameworkPlugin'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:150:48 Unresolved reference 'CastActivityProvider'. +[ ] Finished executing kotlin compiler using DAEMON strategy +[ +692 ms] > Task :app:configureCMakeDebug[x86_64] +[ ] Caching disabled for task ':app:configureCMakeDebug[x86_64]' because: +[ ] Build cache is disabled +[ ] Caching has been disabled for the task +[ ] Task ':app:configureCMakeDebug[x86_64]' is not up-to-date because: +[ ] Task.upToDateWhen is false. +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|x86_64 : Start JSON generation. Platform version: 24 min SDK version: x86_64 +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|x86_64 : rebuilding JSON /Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/x86_64/android_gradle_build.json due to: +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|x86_64 : - no fingerprint file, will remove stale configuration folder +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|x86_64 : removing stale contents from '/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/x86_64' +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|x86_64 : created folder '/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/x86_64' +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|x86_64 : executing cmake /Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake \ +[ ] -H/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts \ +[ ] -DCMAKE_SYSTEM_NAME=Android \ +[ ] -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ +[ ] -DCMAKE_SYSTEM_VERSION=24 \ +[ ] -DANDROID_PLATFORM=android-24 \ +[ ] -DANDROID_ABI=x86_64 \ +[ ] -DCMAKE_ANDROID_ARCH_ABI=x86_64 \ +[ ] -DANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 \ +[ ] -DCMAKE_ANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 \ +[ ] -DCMAKE_TOOLCHAIN_FILE=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake \ +[ ] -DCMAKE_MAKE_PROGRAM=/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/ninja \ +[ ] -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/x86_64 \ +[ ] -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/x86_64 \ +[ ] -B/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/x86_64 \ +[ ] -GNinja \ +[ ] -Wno-dev \ +[ ] --no-warn-unused-cli \ +[ ] -DCMAKE_BUILD_TYPE=debug +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|x86_64 : /Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake \ +[ ] -H/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts \ +[ ] -DCMAKE_SYSTEM_NAME=Android \ +[ ] -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ +[ ] -DCMAKE_SYSTEM_VERSION=24 \ +[ ] -DANDROID_PLATFORM=android-24 \ +[ ] -DANDROID_ABI=x86_64 \ +[ ] -DCMAKE_ANDROID_ARCH_ABI=x86_64 \ +[ ] -DANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 \ +[ ] -DCMAKE_ANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 \ +[ ] -DCMAKE_TOOLCHAIN_FILE=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake \ +[ ] -DCMAKE_MAKE_PROGRAM=/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/ninja \ +[ ] -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/x86_64 \ +[ ] -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/x86_64 \ +[ ] -B/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/x86_64 \ +[ ] -GNinja \ +[ ] -Wno-dev \ +[ ] --no-warn-unused-cli \ +[ ] -DCMAKE_BUILD_TYPE=debug +[ ] Starting process 'command '/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake''. Working directory: /Volumes/terrain/aves_mio54/android/app Command: /Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake -H/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts -DCMAKE_SYSTEM_NAME=Android -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_SYSTEM_VERSION=24 -DANDROID_PLATFORM=android-24 -DANDROID_ABI=x86_64 -DCMAKE_ANDROID_ARCH_ABI=x86_64 -DANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 -DCMAKE_ANDROID_NDK=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973 -DCMAKE_TOOLCHAIN_FILE=/Users/fabio/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake -DCMAKE_MAKE_PROGRAM=/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/ninja -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/x86_64 -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/obj/x86_64 -B/Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/x86_64 -GNinja -Wno-dev --no-warn-unused-cli -DCMAKE_BUILD_TYPE=debug +[ ] Successfully started process 'command '/Users/fabio/Library/Android/sdk/cmake/3.22.1/bin/cmake'' +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|x86_64 : Received process result: 0 +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|x86_64 : /Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/x86_64/compile_commands.json.bin existed but not /Volumes/terrain/aves_mio54/build/.cxx/debug/4u1x4r62/x86_64/compile_commands.json +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|x86_64 : done executing cmake +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|x86_64 : JSON generation completed without problems +[ ] C/C++: /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/scripts/CMakeLists.txt libre_romDebug|x86_64 : Writing build model to /Volumes/terrain/aves_mio54/build/app/intermediates/cxx/debug/4u1x4r62/logs/x86_64/build_model.json +[ +95 ms] Build e2f31eb5-55bd-4bd4-b7da-1f60a9dc24a4 is closed +[ +102 ms] [Incubating] Problems report is available at: file:///Volumes/terrain/aves_mio54/build/reports/problems/problems-report.html +[ ] Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. +[ ] You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. +[ ] For more on this, please refer to https://docs.gradle.org/8.14.4/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. +[ ] 610 actionable tasks: 14 executed, 596 up-to-date +[ ] Watched directory hierarchies: [/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle, /Volumes/terrain/aves_mio54/android] +[ ] FAILURE: Build failed with an exception. +[ ] * What went wrong: +[ ] Execution failed for task ':app:compilePlayDebugKotlin'. +[ ] > A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction +[ ] > Compilation error. See log for more details +[ ] * Try: +[ ] > Run with --debug option to get more log output. +[ ] > Run with --scan to get full insights. +[ ] > Get more help at https://help.gradle.org. +[ ] * Exception is: +[ ] org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compilePlayDebugKotlin'. +[ ] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:130) +[ ] at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:293) +[ ] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:128) +[ ] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116) +[ ] at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41) +[ ] at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) +[ ] at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) +[ ] at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) +[ ] at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74) +[ ] at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) +[ ] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) +[ ] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) +[ ] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54) +[ ] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) +[ ] at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42) +[ ] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331) +[ ] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318) +[ ] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314) +[ ] at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85) +[ ] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314) +[ ] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303) +[ ] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459) +[ ] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376) +[ ] at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) +[ ] at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) +[ ] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) +[ ] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) +[ ] at java.base/java.lang.Thread.run(Unknown Source) +[ ] Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction +[ ] at org.gradle.workers.internal.DefaultWorkerExecutor$WorkItemExecution.waitForCompletion(DefaultWorkerExecutor.java:287) +[ ] at org.gradle.internal.work.DefaultAsyncWorkTracker.lambda$waitForItemsAndGatherFailures$2(DefaultAsyncWorkTracker.java:130) +[ ] at org.gradle.internal.Factories$1.create(Factories.java:31) +[ ] at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:335) +[ ] at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:318) +[ ] at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLock(DefaultWorkerLeaseService.java:323) +[ ] at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:126) +[ ] at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:92) +[ ] at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForAll(DefaultAsyncWorkTracker.java:78) +[ ] at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForCompletion(DefaultAsyncWorkTracker.java:66) +[ ] at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:252) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:30) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:27) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:48) +[ ] at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:229) +[ ] at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:212) +[ ] at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:195) +[ ] at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:162) +[ ] at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105) +[ ] at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44) +[ ] at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59) +[ ] at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54) +[ ] at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56) +[ ] at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44) +[ ] at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42) +[ ] at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75) +[ ] at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55) +[ ] at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50) +[ ] at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28) +[ ] at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67) +[ ] at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37) +[ ] at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61) +[ ] at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26) +[ ] at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69) +[ ] at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46) +[ ] at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40) +[ ] at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29) +[ ] at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189) +[ ] at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75) +[ ] at org.gradle.internal.Either$Right.fold(Either.java:175) +[ ] at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62) +[ ] at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73) +[ ] at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48) +[ ] at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46) +[ ] at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35) +[ ] at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75) +[ ] at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53) +[ ] at java.base/java.util.Optional.orElseGet(Unknown Source) +[ ] at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53) +[ ] at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35) +[ ] at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37) +[ ] at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27) +[ ] at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49) +[ ] at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27) +[ ] at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71) +[ ] at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39) +[ ] at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65) +[ ] at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36) +[ ] at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:107) +[ ] at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:56) +[ ] at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:64) +[ ] at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:43) +[ ] at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:125) +[ ] at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:61) +[ ] at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:36) +[ ] at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38) +[ ] at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36) +[ ] at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23) +[ ] at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75) +[ ] at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41) +[ ] at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35) +[ ] at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:289) +[ ] at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31) +[ ] at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22) +[ ] at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40) +[ ] at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23) +[ ] at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67) +[ ] at java.base/java.util.Optional.orElseGet(Unknown Source) +[ ] at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67) +[ ] at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39) +[ ] at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46) +[ ] at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34) +[ ] at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:48) +[ ] at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:35) +[ ] at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64) +[ ] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:127) +[ ] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116) +[ ] at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41) +[ ] at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) +[ ] at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) +[ ] at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) +[ ] at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74) +[ ] at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) +[ ] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) +[ ] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) +[ ] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54) +[ ] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) +[ ] at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42) +[ ] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331) +[ ] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318) +[ ] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314) +[ ] at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85) +[ ] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314) +[ ] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303) +[ ] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459) +[ ] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376) +[ ] at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) +[ ] at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) +[ ] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) +[ ] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) +[ ] at java.base/java.lang.Thread.run(Unknown Source) +[ ] Caused by: org.jetbrains.kotlin.gradle.tasks.CompilationErrorException: Compilation error. See log for more details +[ ] at org.jetbrains.kotlin.gradle.tasks.TasksUtilsKt.throwExceptionIfCompilationFailed(tasksUtils.kt:21) +[ ] at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:112) +[ ] at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:75) +[ ] at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63) +[ ] at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66) +[ ] at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62) +[ ] at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100) +[ ] at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62) +[ ] at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44) +[ ] at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54) +[ ] at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41) +[ ] at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59) +[ ] at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:174) +[ ] at java.base/java.util.concurrent.FutureTask.run(Unknown Source) +[ ] at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194) +[ ] at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127) +[ ] at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169) +[ ] at org.gradle.internal.Factories$1.create(Factories.java:31) +[ ] at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263) +[ ] at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127) +[ ] at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132) +[ ] at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164) +[ ] at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133) +[ ] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) +[ ] at java.base/java.util.concurrent.FutureTask.run(Unknown Source) +[ ] ... 5 more +[ ] BUILD FAILED in 34s +[ +48 ms] Running Gradle task 'assemblePlayDebug'... (completed in 35,3s) +[ +96 ms] "flutter apk" took 39.438ms. +[ +14 ms] executing: sw_vers -productName +[ +18 ms] Exit code 0 from: sw_vers -productName +[ ] macOS +[ ] executing: sw_vers -productVersion +[ +19 ms] Exit code 0 from: sw_vers -productVersion +[ ] 13.7.7 +[ ] executing: sw_vers -buildVersion +[ +18 ms] Exit code 0 from: sw_vers -buildVersion +[ ] 22H722 +[ ] executing: uname -m +[ +8 ms] Exit code 0 from: uname -m +[ ] x86_64 +[ +91 ms] Gradle task assemblePlayDebug failed with exit code 1 +[ ] + #0 throwToolExit (package:flutter_tools/src/base/common.dart:34:3) + #1 AndroidGradleBuilder.buildGradleApp (package:flutter_tools/src/android/gradle.dart:600:7) + <asynchronous suspension> + #2 AndroidGradleBuilder.buildApk (package:flutter_tools/src/android/gradle.dart:239:5) + <asynchronous suspension> + #3 BuildApkCommand.runCommand (package:flutter_tools/src/commands/build_apk.dart:131:5) + <asynchronous suspension> + #4 FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:1581:27) + <asynchronous suspension> + #5 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:154:19) + <asynchronous suspension> + #6 CommandRunner.runCommand (package:args/command_runner.dart:212:13) + <asynchronous suspension> + #7 FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:503:9) + <asynchronous suspension> + #8 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:154:19) + <asynchronous suspension> + #9 FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:438:5) + <asynchronous suspension> + #10 run.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:98:11) + <asynchronous suspension> + #11 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:154:19) + <asynchronous suspension> + #12 main (package:flutter_tools/executable.dart:101:3) + <asynchronous suspension> + + +[ ] Running 1 shutdown hook +[ ] Shutdown hooks complete +[ +96 ms] exiting with code 1 diff --git a/dbcvs.sh b/dbcvs.sh new file mode 100644 index 0000000..efdb0a6 --- /dev/null +++ b/dbcvs.sh @@ -0,0 +1,12 @@ +#!/bin/bash +DB="metadata.db" + +for t in $(sqlite3 "$DB" ".tables"); do + echo "Esporto $t..." + sqlite3 "$DB" <<EOF +.headers on +.mode csv +.output ${t}.csv +SELECT * FROM $t; +EOF +done diff --git a/dbdown.sh b/dbdown.sh new file mode 100644 index 0000000..7d4eb11 --- /dev/null +++ b/dbdown.sh @@ -0,0 +1,2 @@ +adb exec-out run-as deckers.thibault.aves.debug cat /data/user/0/deckers.thibault.aves.debug/databases/metadata.db > metadata.db +#adb exec-out run-as deckers.thibault.aves.debug cat /data/user/0/deckers.thibault.aves.debug/databases/metadata.db-wal > metadata.db-wal diff --git a/dbnremote.sh b/dbnremote.sh new file mode 100644 index 0000000..b1ac653 --- /dev/null +++ b/dbnremote.sh @@ -0,0 +1 @@ +sqlite3 -header -csv metadata.db "SELECT COUNT(*) AS nremote FROM entry WHERE origin=1;" diff --git a/dbrecord.sh b/dbrecord.sh new file mode 100644 index 0000000..5850f93 --- /dev/null +++ b/dbrecord.sh @@ -0,0 +1,2 @@ +sqlite3 -header -csv metadata.db \ "SELECT * FROM entry WHERE origin=0 ORDER BY id LIMIT 1;" +sqlite3 -header -csv metadata.db \ "SELECT * FROM entry WHERE origin=1000 ORDER BY id LIMIT 1;" diff --git a/dbrotate.sh b/dbrotate.sh new file mode 100644 index 0000000..4f3ab05 --- /dev/null +++ b/dbrotate.sh @@ -0,0 +1,7 @@ +sqlite3 metadata.db <<'SQL' +BEGIN; +UPDATE entry SET sourceRotationDegrees = 90 WHERE origin = 1; +COMMIT; +SELECT COUNT(*) AS total_origin_1 FROM entry WHERE origin = 1; +SELECT COUNT(*) AS now_90 FROM entry WHERE origin = 1 AND sourceRotationDegrees = 90; +SQL diff --git a/dbrotate2.sh b/dbrotate2.sh new file mode 100644 index 0000000..bdf72cd --- /dev/null +++ b/dbrotate2.sh @@ -0,0 +1,7 @@ +sqlite3 metadata.db <<'SQL' +BEGIN; +UPDATE entry SET sourceRotationDegrees = 0 WHERE origin = 1; +COMMIT; +SELECT COUNT(*) AS total_origin_1 FROM entry WHERE origin = 1; +SELECT COUNT(*) AS now_90 FROM entry WHERE origin = 1 AND sourceRotationDegrees = 0; +SQL diff --git a/dbrotation.sh b/dbrotation.sh new file mode 100644 index 0000000..1985918 --- /dev/null +++ b/dbrotation.sh @@ -0,0 +1,8 @@ +sqlite3 metadata.db <<'SQL' +BEGIN; +UPDATE entry +SET remoteRotation = 0 +WHERE origin = 1 + AND remoteRotation IS NULL; +COMMIT; +SQL diff --git a/dbupload.sh b/dbupload.sh new file mode 100644 index 0000000..dcf3490 --- /dev/null +++ b/dbupload.sh @@ -0,0 +1,4 @@ +adb push metadata.db /data/local/tmp/metadata.db + +adb shell "run-as deckers.thibault.aves.debug sh -c 'cat > /data/user/0/deckers.thibault.aves.debug/databases/metadata.db' < /data/local/tmp/metadata.db" +adb shell run-as deckers.thibault.aves.debug chmod 600 /data/user/0/deckers.thibault.aves.debug/databases/metadata.db diff --git a/debug.sh b/debug.sh new file mode 100644 index 0000000..8f8006b --- /dev/null +++ b/debug.sh @@ -0,0 +1 @@ +fvm flutter run -t lib/main_play.dart --flavor play 2>&1 | tee output.log diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..2bc8e05 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,4 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: + - provider: true \ No newline at end of file diff --git a/dip.txt b/dip.txt new file mode 100644 index 0000000..b2eb8fc --- /dev/null +++ b/dip.txt @@ -0,0 +1,12522 @@ + +=== FILE NON USATI === +lib/app_flavor.dart +lib/app_mode.dart +lib/convert/convert.dart +lib/convert/metadata/date_field_source.dart +lib/convert/metadata/fields.dart +lib/convert/metadata/metadata_type.dart +lib/geo/countries.dart +lib/geo/states.dart +lib/geo/topojson.dart +lib/geo/uri.dart +lib/image_providers/app_icon_image_provider.dart +lib/image_providers/descriptor_provider.dart +lib/image_providers/full_image_provider.dart +lib/image_providers/region_provider.dart +lib/image_providers/thumbnail_provider.dart +lib/l10n/l10n.dart +lib/l10ngen/app_localizations.dart +lib/l10ngen/app_localizations_ar.dart +lib/l10ngen/app_localizations_az.dart +lib/l10ngen/app_localizations_be.dart +lib/l10ngen/app_localizations_bg.dart +lib/l10ngen/app_localizations_bn.dart +lib/l10ngen/app_localizations_ca.dart +lib/l10ngen/app_localizations_ckb.dart +lib/l10ngen/app_localizations_cs.dart +lib/l10ngen/app_localizations_da.dart +lib/l10ngen/app_localizations_de.dart +lib/l10ngen/app_localizations_el.dart +lib/l10ngen/app_localizations_en.dart +lib/l10ngen/app_localizations_es.dart +lib/l10ngen/app_localizations_et.dart +lib/l10ngen/app_localizations_eu.dart +lib/l10ngen/app_localizations_fa.dart +lib/l10ngen/app_localizations_fi.dart +lib/l10ngen/app_localizations_fr.dart +lib/l10ngen/app_localizations_gl.dart +lib/l10ngen/app_localizations_he.dart +lib/l10ngen/app_localizations_hi.dart +lib/l10ngen/app_localizations_hr.dart +lib/l10ngen/app_localizations_hu.dart +lib/l10ngen/app_localizations_id.dart +lib/l10ngen/app_localizations_is.dart +lib/l10ngen/app_localizations_it.dart +lib/l10ngen/app_localizations_ja.dart +lib/l10ngen/app_localizations_kmr.dart +lib/l10ngen/app_localizations_kn.dart +lib/l10ngen/app_localizations_ko.dart +lib/l10ngen/app_localizations_lt.dart +lib/l10ngen/app_localizations_ml.dart +lib/l10ngen/app_localizations_my.dart +lib/l10ngen/app_localizations_nb.dart +lib/l10ngen/app_localizations_ne.dart +lib/l10ngen/app_localizations_nl.dart +lib/l10ngen/app_localizations_nn.dart +lib/l10ngen/app_localizations_or.dart +lib/l10ngen/app_localizations_pl.dart +lib/l10ngen/app_localizations_pt.dart +lib/l10ngen/app_localizations_ro.dart +lib/l10ngen/app_localizations_ru.dart +lib/l10ngen/app_localizations_sat.dart +lib/l10ngen/app_localizations_sk.dart +lib/l10ngen/app_localizations_sl.dart +lib/l10ngen/app_localizations_sr.dart +lib/l10ngen/app_localizations_sv.dart +lib/l10ngen/app_localizations_ta.dart +lib/l10ngen/app_localizations_th.dart +lib/l10ngen/app_localizations_tr.dart +lib/l10ngen/app_localizations_uk.dart +lib/l10ngen/app_localizations_ur.dart +lib/l10ngen/app_localizations_vi.dart +lib/l10ngen/app_localizations_zh.dart +lib/main_common.dart +lib/main_izzy.dart +lib/main_libre.dart +lib/main_play.dart +lib/main_play_test_editor.dart +lib/model/app/contributors.dart +lib/model/app/dependencies.dart +lib/model/app/intent.dart +lib/model/app/permissions.dart +lib/model/app/support.dart +lib/model/app_inventory.dart +lib/model/availability.dart +lib/model/covers.dart +lib/model/db/db.dart +lib/model/db/db_extension.dart +lib/model/db/db_sqflite.dart +lib/model/db/db_sqflite_schema.dart +lib/model/db/db_sqflite_upgrade.dart +lib/model/device.dart +lib/model/dynamic_albums.dart +lib/model/entry/cache.dart +lib/model/entry/dirs.dart +lib/model/entry/entry.dart +lib/model/entry/extensions/catalog.dart +lib/model/entry/extensions/favourites.dart +lib/model/entry/extensions/images.dart +lib/model/entry/extensions/info.dart +lib/model/entry/extensions/keys.dart +lib/model/entry/extensions/location.dart +lib/model/entry/extensions/metadata_edition.dart +lib/model/entry/extensions/multipage.dart +lib/model/entry/extensions/props.dart +lib/model/entry/extensions/remote_flags.dart +lib/model/entry/origins.dart +lib/model/entry/sort.dart +lib/model/favourites.dart +lib/model/filters/aspect_ratio.dart +lib/model/filters/container/album_group.dart +lib/model/filters/container/container.dart +lib/model/filters/container/dynamic_album.dart +lib/model/filters/container/group_base.dart +lib/model/filters/container/set_and.dart +lib/model/filters/container/set_or.dart +lib/model/filters/container/tag_group.dart +lib/model/filters/coordinate.dart +lib/model/filters/covered/covered.dart +lib/model/filters/covered/location.dart +lib/model/filters/covered/stored_album.dart +lib/model/filters/covered/tag.dart +lib/model/filters/date.dart +lib/model/filters/favourite.dart +lib/model/filters/filters.dart +lib/model/filters/mime.dart +lib/model/filters/missing.dart +lib/model/filters/path.dart +lib/model/filters/placeholder.dart +lib/model/filters/query.dart +lib/model/filters/rating.dart +lib/model/filters/recent.dart +lib/model/filters/trash.dart +lib/model/filters/type.dart +lib/model/filters/weekday.dart +lib/model/grouping/common.dart +lib/model/grouping/convert.dart +lib/model/highlight.dart +lib/model/media/geotiff.dart +lib/model/media/panorama.dart +lib/model/media/video/channel_layouts.dart +lib/model/media/video/codecs.dart +lib/model/media/video/metadata.dart +lib/model/media/video/profiles/aac.dart +lib/model/media/video/profiles/h264.dart +lib/model/media/video/profiles/hevc.dart +lib/model/media/video/stereo_3d_modes.dart +lib/model/metadata/address.dart +lib/model/metadata/catalog.dart +lib/model/metadata/date_modifier.dart +lib/model/metadata/overlay.dart +lib/model/metadata/trash.dart +lib/model/multipage.dart +lib/model/naming_pattern.dart +lib/model/query.dart +lib/model/selection.dart +lib/model/settings/defaults.dart +lib/model/settings/enums/accessibility_animations.dart +lib/model/settings/enums/accessibility_timeout.dart +lib/model/settings/enums/coordinate_format.dart +lib/model/settings/enums/display_refresh_rate_mode.dart +lib/model/settings/enums/entry_background.dart +lib/model/settings/enums/local_cast_source_mode.dart +lib/model/settings/enums/screen_on.dart +lib/model/settings/enums/subtitle_position.dart +lib/model/settings/enums/theme_brightness.dart +lib/model/settings/enums/viewer_transition.dart +lib/model/settings/enums/widget_outline.dart +lib/model/settings/enums/widget_shape.dart +lib/model/settings/modules/app.dart +lib/model/settings/modules/collection.dart +lib/model/settings/modules/debug.dart +lib/model/settings/modules/display.dart +lib/model/settings/modules/filter_grids.dart +lib/model/settings/modules/info.dart +lib/model/settings/modules/navigation.dart +lib/model/settings/modules/privacy.dart +lib/model/settings/modules/screen_saver.dart +lib/model/settings/modules/search.dart +lib/model/settings/modules/slideshow.dart +lib/model/settings/modules/viewer.dart +lib/model/settings/modules/widget.dart +lib/model/settings/settings.dart +lib/model/settings/store_shared_pref.dart +lib/model/source/album.dart +lib/model/source/analysis_controller.dart +lib/model/source/collection_lens.dart +lib/model/source/collection_source.dart +lib/model/source/events.dart +lib/model/source/location/country.dart +lib/model/source/location/location.dart +lib/model/source/location/place.dart +lib/model/source/location/state.dart +lib/model/source/media_store_source.dart +lib/model/source/section_keys.dart +lib/model/source/tag.dart +lib/model/source/trash.dart +lib/model/vaults/details.dart +lib/model/vaults/vaults.dart +lib/model/viewer/video_playback.dart +lib/model/viewer/view_state.dart +lib/ref/brand_colors.dart +lib/ref/bursts.dart +lib/ref/languages.dart +lib/ref/locales.dart +lib/ref/metadata/exif.dart +lib/ref/metadata/geotiff.dart +lib/ref/metadata/iptc.dart +lib/ref/metadata/xmp.dart +lib/ref/mime_types.dart +lib/ref/mp4.dart +lib/ref/poi.dart +lib/ref/unicode.dart +lib/ref/upnp.dart +lib/remote/auth_client.dart +lib/remote/collection_source_remote_ext.dart +lib/remote/remote_client.dart +lib/remote/remote_controller.dart +lib/remote/remote_db_uris.dart +lib/remote/remote_gallery_bridge.dart +lib/remote/remote_http.dart +lib/remote/remote_http_api.dart +lib/remote/remote_image_tile.dart +lib/remote/remote_models.dart +lib/remote/remote_origin.dart +lib/remote/remote_repository.dart +lib/remote/remote_settings.dart +lib/remote/remote_settings_dialog.dart +lib/remote/remote_settings_page.dart +lib/remote/remote_state_store.dart +lib/remote/remote_sync_bus.dart +lib/remote/remote_sync_engine.dart +lib/remote/remote_test_page.dart +lib/remote/remote_view_helpers.dart +lib/remote/remote_ws_client.dart +lib/remote/run_remote_sync.dart +lib/remote/url_utils.dart +lib/services/accessibility_service.dart +lib/services/analysis_service.dart +lib/services/android_debug_service.dart +lib/services/app_profile_service.dart +lib/services/app_service.dart +lib/services/cast/cast_backend_switcher.dart +lib/services/cast/cast_server.dart +lib/services/common/channel.dart +lib/services/common/custom_exception.dart +lib/services/common/decoding.dart +lib/services/common/image_op_events.dart +lib/services/common/output_buffer.dart +lib/services/common/service_policy.dart +lib/services/common/services.dart +lib/services/device_service.dart +lib/services/geocoding_service.dart +lib/services/global_search.dart +lib/services/intent_service.dart +lib/services/media/embedded_data_service.dart +lib/services/media/enums.dart +lib/services/media/media_edit_service.dart +lib/services/media/media_fetch_service.dart +lib/services/media/media_session_service.dart +lib/services/media/media_store_service.dart +lib/services/metadata/metadata_edit_service.dart +lib/services/metadata/metadata_fetch_service.dart +lib/services/metadata/svg_metadata_service.dart +lib/services/metadata/xmp.dart +lib/services/security_service.dart +lib/services/storage_service.dart +lib/services/wallpaper_service.dart +lib/services/widget_service.dart +lib/services/window_service.dart +lib/theme/colors.dart +lib/theme/durations.dart +lib/theme/format.dart +lib/theme/icons.dart +lib/theme/styles.dart +lib/theme/text.dart +lib/theme/themes.dart +lib/utils/android_file_utils.dart +lib/utils/collection_utils.dart +lib/utils/debouncer.dart +lib/utils/diff_match.dart +lib/utils/emoji_utils.dart +lib/utils/file_utils.dart +lib/utils/math_utils.dart +lib/utils/mime_utils.dart +lib/utils/string_utils.dart +lib/utils/time_utils.dart +lib/utils/xmp_utils.dart +lib/view/src/actions/chip.dart +lib/view/src/actions/chip_set.dart +lib/view/src/actions/entry.dart +lib/view/src/actions/entry_set.dart +lib/view/src/actions/explorer.dart +lib/view/src/actions/map.dart +lib/view/src/actions/map_cluster.dart +lib/view/src/actions/share.dart +lib/view/src/actions/slideshow.dart +lib/view/src/editor/enums.dart +lib/view/src/metadata/convert_action.dart +lib/view/src/metadata/date_edit_action.dart +lib/view/src/metadata/date_field_source.dart +lib/view/src/metadata/exportable_fields.dart +lib/view/src/metadata/fields.dart +lib/view/src/metadata/length_unit.dart +lib/view/src/metadata/location_edit_action.dart +lib/view/src/metadata/metadata_type.dart +lib/view/src/settings/enums.dart +lib/view/src/settings/thumbnail_overlay_location_icon.dart +lib/view/src/settings/thumbnail_overlay_tag_icon.dart +lib/view/src/source/album.dart +lib/view/src/source/group.dart +lib/view/src/source/layout.dart +lib/view/src/source/sort.dart +lib/view/src/source/state.dart +lib/view/src/source/vault.dart +lib/view/src/storage/relative_dir.dart +lib/view/src/storage/volume.dart +lib/view/src/wallpaper_target.dart +lib/view/src/xmp.dart +lib/view/view.dart +lib/widget_common.dart +lib/widgets/about/about_mobile_page.dart +lib/widgets/about/about_page.dart +lib/widgets/about/about_tv_page.dart +lib/widgets/about/app_ref.dart +lib/widgets/about/bug_report.dart +lib/widgets/about/credits.dart +lib/widgets/about/data_usage.dart +lib/widgets/about/licenses.dart +lib/widgets/about/policy_page.dart +lib/widgets/about/title.dart +lib/widgets/about/translators.dart +lib/widgets/about/tv_license_page.dart +lib/widgets/aves_app.dart +lib/widgets/cast/animated_cast_icon.dart +lib/widgets/cast/backends/dlna_cast_backend.dart +lib/widgets/cast/backends/fast_cast_backend.dart +lib/widgets/cast/backends/google_cast_backend.dart +lib/widgets/cast/cast_controller.dart +lib/widgets/cast/cast_state.dart +lib/widgets/cast/dlna.dart +lib/widgets/cast/dlna_dialog.dart +lib/widgets/cast/dlna_manager.dart +lib/widgets/cast/google_cast_controller.dart +lib/widgets/collection/app_bar/cast/cast_actions.dart +lib/widgets/collection/app_bar/cast/cast_bar_inline.dart +lib/widgets/collection/app_bar/cast/cast_controls_sheet.dart +lib/widgets/collection/app_bar/cast/cast_icon_button.dart +lib/widgets/collection/app_bar/collection_app_bar.dart +lib/widgets/collection/app_bar/remote/remote_bar.dart +lib/widgets/collection/app_bar/remote/remote_controls_sheet.dart +lib/widgets/collection/collection_grid.dart +lib/widgets/collection/collection_page.dart +lib/widgets/collection/draggable_thumb_label.dart +lib/widgets/collection/entry_set_action_delegate.dart +lib/widgets/collection/filter_bar.dart +lib/widgets/collection/grid/headers/album.dart +lib/widgets/collection/grid/headers/any.dart +lib/widgets/collection/grid/headers/date.dart +lib/widgets/collection/grid/headers/rating.dart +lib/widgets/collection/grid/list_details.dart +lib/widgets/collection/grid/list_details_theme.dart +lib/widgets/collection/grid/section_layout.dart +lib/widgets/collection/grid/tile.dart +lib/widgets/collection/loading.dart +lib/widgets/collection/query_bar.dart +lib/widgets/collection/remote_progress_banner.dart +lib/widgets/collection/remote_status_button.dart +lib/widgets/collection/remote_status_icon.dart +lib/widgets/common/action_controls/quick_choosers/album_chooser.dart +lib/widgets/common/action_controls/quick_choosers/common/button.dart +lib/widgets/common/action_controls/quick_choosers/common/menu.dart +lib/widgets/common/action_controls/quick_choosers/common/quick_chooser.dart +lib/widgets/common/action_controls/quick_choosers/common/route_layout.dart +lib/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart +lib/widgets/common/action_controls/quick_choosers/move_button.dart +lib/widgets/common/action_controls/quick_choosers/rate_button.dart +lib/widgets/common/action_controls/quick_choosers/rate_chooser.dart +lib/widgets/common/action_controls/quick_choosers/share_button.dart +lib/widgets/common/action_controls/quick_choosers/share_chooser.dart +lib/widgets/common/action_controls/quick_choosers/tag_button.dart +lib/widgets/common/action_controls/quick_choosers/tag_chooser.dart +lib/widgets/common/action_controls/togglers/favourite.dart +lib/widgets/common/action_controls/togglers/mute.dart +lib/widgets/common/action_controls/togglers/play.dart +lib/widgets/common/action_controls/togglers/title_search.dart +lib/widgets/common/action_mixins/entry_editor.dart +lib/widgets/common/action_mixins/entry_storage.dart +lib/widgets/common/action_mixins/feedback.dart +lib/widgets/common/action_mixins/overlay_snack_bar.dart +lib/widgets/common/action_mixins/permission_aware.dart +lib/widgets/common/action_mixins/size_aware.dart +lib/widgets/common/action_mixins/vault_aware.dart +lib/widgets/common/app_bar/app_bar_subtitle.dart +lib/widgets/common/app_bar/app_bar_title.dart +lib/widgets/common/app_bar/crumb_line.dart +lib/widgets/common/app_bar/sliver_app_bar_title.dart +lib/widgets/common/aves_highlight.dart +lib/widgets/common/basic/circle.dart +lib/widgets/common/basic/color_indicator.dart +lib/widgets/common/basic/derived_material_localization.dart +lib/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart +lib/widgets/common/basic/draggable_scrollbar/notifications.dart +lib/widgets/common/basic/draggable_scrollbar/scroll_label.dart +lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart +lib/widgets/common/basic/draggable_scrollbar/transition.dart +lib/widgets/common/basic/font_size_icon_theme.dart +lib/widgets/common/basic/gestures/gesture_detector.dart +lib/widgets/common/basic/gestures/ink_well.dart +lib/widgets/common/basic/insets.dart +lib/widgets/common/basic/labeled_checkbox.dart +lib/widgets/common/basic/link_chip.dart +lib/widgets/common/basic/list_tiles/color.dart +lib/widgets/common/basic/list_tiles/reselectable_radio.dart +lib/widgets/common/basic/list_tiles/slider.dart +lib/widgets/common/basic/markdown_container.dart +lib/widgets/common/basic/multi_cross_fader.dart +lib/widgets/common/basic/popup/container.dart +lib/widgets/common/basic/popup/expansion_panel.dart +lib/widgets/common/basic/popup/menu_row.dart +lib/widgets/common/basic/query_bar.dart +lib/widgets/common/basic/scaffold.dart +lib/widgets/common/basic/text/animated_diff.dart +lib/widgets/common/basic/text/background_painter.dart +lib/widgets/common/basic/text/change_highlight.dart +lib/widgets/common/basic/text/outlined.dart +lib/widgets/common/basic/text_dropdown_button.dart +lib/widgets/common/basic/time_shift_selector.dart +lib/widgets/common/basic/tv_edge_focus.dart +lib/widgets/common/basic/wheel.dart +lib/widgets/common/behaviour/eager_scale_gesture_recognizer.dart +lib/widgets/common/behaviour/intents.dart +lib/widgets/common/behaviour/known_extent_scroll_physics.dart +lib/widgets/common/behaviour/pop/double_back.dart +lib/widgets/common/behaviour/pop/scope.dart +lib/widgets/common/behaviour/pop/tv_navigation.dart +lib/widgets/common/behaviour/route_tracker.dart +lib/widgets/common/behaviour/routes.dart +lib/widgets/common/behaviour/sloppy_scroll_physics.dart +lib/widgets/common/behaviour/springy_scroll_physics.dart +lib/widgets/common/expandable_filter_row.dart +lib/widgets/common/extensions/build_context.dart +lib/widgets/common/extensions/geometry.dart +lib/widgets/common/extensions/media_query.dart +lib/widgets/common/extensions/theme.dart +lib/widgets/common/fx/blurred.dart +lib/widgets/common/fx/borders.dart +lib/widgets/common/fx/checkered_decoration.dart +lib/widgets/common/fx/colors.dart +lib/widgets/common/fx/dashed_path_painter.dart +lib/widgets/common/fx/highlight_decoration.dart +lib/widgets/common/fx/sweeper.dart +lib/widgets/common/fx/transition_image.dart +lib/widgets/common/fx/transitions.dart +lib/widgets/common/grid/draggable_thumb_label.dart +lib/widgets/common/grid/header.dart +lib/widgets/common/grid/item_tracker.dart +lib/widgets/common/grid/overlay.dart +lib/widgets/common/grid/scaling.dart +lib/widgets/common/grid/sections/fixed/list_layout.dart +lib/widgets/common/grid/sections/fixed/row.dart +lib/widgets/common/grid/sections/fixed/scale_grid.dart +lib/widgets/common/grid/sections/fixed/scale_overlay.dart +lib/widgets/common/grid/sections/fixed/section_layout.dart +lib/widgets/common/grid/sections/fixed/section_layout_builder.dart +lib/widgets/common/grid/sections/list_layout.dart +lib/widgets/common/grid/sections/mosaic/list_layout.dart +lib/widgets/common/grid/sections/mosaic/row.dart +lib/widgets/common/grid/sections/mosaic/scale_grid.dart +lib/widgets/common/grid/sections/mosaic/scale_overlay.dart +lib/widgets/common/grid/sections/mosaic/section_layout.dart +lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart +lib/widgets/common/grid/sections/provider.dart +lib/widgets/common/grid/sections/section_layout.dart +lib/widgets/common/grid/sections/section_layout_builder.dart +lib/widgets/common/grid/selector.dart +lib/widgets/common/grid/sliver.dart +lib/widgets/common/grid/theme.dart +lib/widgets/common/hybrid_frame.dart +lib/widgets/common/identity/aves_app_bar.dart +lib/widgets/common/identity/aves_caption.dart +lib/widgets/common/identity/aves_donut.dart +lib/widgets/common/identity/aves_expansion_tile.dart +lib/widgets/common/identity/aves_fab.dart +lib/widgets/common/identity/aves_filter_chip.dart +lib/widgets/common/identity/aves_icons.dart +lib/widgets/common/identity/aves_logo.dart +lib/widgets/common/identity/buttons/captioned_button.dart +lib/widgets/common/identity/buttons/outlined_button.dart +lib/widgets/common/identity/buttons/overlay_button.dart +lib/widgets/common/identity/empty.dart +lib/widgets/common/identity/highlight_title.dart +lib/widgets/common/identity/scroll_thumb.dart +lib/widgets/common/map/attribution.dart +lib/widgets/common/map/buttons/button.dart +lib/widgets/common/map/buttons/coordinate_filter.dart +lib/widgets/common/map/buttons/panel.dart +lib/widgets/common/map/compass.dart +lib/widgets/common/map/decorator.dart +lib/widgets/common/map/geo_map.dart +lib/widgets/common/map/leaflet/latlng_tween.dart +lib/widgets/common/map/leaflet/latlng_utils.dart +lib/widgets/common/map/leaflet/map.dart +lib/widgets/common/map/leaflet/scale_layer.dart +lib/widgets/common/map/leaflet/tile_layers.dart +lib/widgets/common/map/leaflet/vector_style_reader_extra.dart +lib/widgets/common/map/map_action_delegate.dart +lib/widgets/common/providers/durations_provider.dart +lib/widgets/common/providers/filter_group_provider.dart +lib/widgets/common/providers/highlight_info_provider.dart +lib/widgets/common/providers/map_theme_provider.dart +lib/widgets/common/providers/media_query_data_provider.dart +lib/widgets/common/providers/query_provider.dart +lib/widgets/common/providers/selection_provider.dart +lib/widgets/common/providers/tile_extent_controller_provider.dart +lib/widgets/common/providers/viewer_entry_provider.dart +lib/widgets/common/search/delegate.dart +lib/widgets/common/search/page.dart +lib/widgets/common/search/route.dart +lib/widgets/common/thumbnail/decorated.dart +lib/widgets/common/thumbnail/error.dart +lib/widgets/common/thumbnail/image.dart +lib/widgets/common/thumbnail/notifications.dart +lib/widgets/common/thumbnail/overlay.dart +lib/widgets/common/thumbnail/scroller.dart +lib/widgets/common/tile_extent_controller.dart +lib/widgets/debug/app_debug_action.dart +lib/widgets/debug/app_debug_page.dart +lib/widgets/debug/cache.dart +lib/widgets/debug/capabilities.dart +lib/widgets/debug/colors.dart +lib/widgets/debug/database.dart +lib/widgets/debug/general.dart +lib/widgets/debug/leaking.dart +lib/widgets/debug/media_store_scan_dialog.dart +lib/widgets/debug/os_apps.dart +lib/widgets/debug/os_codecs.dart +lib/widgets/debug/os_paths.dart +lib/widgets/debug/os_storage.dart +lib/widgets/debug/report.dart +lib/widgets/debug/settings.dart +lib/widgets/dialogs/add_shortcut_dialog.dart +lib/widgets/dialogs/aves_confirmation_dialog.dart +lib/widgets/dialogs/aves_dialog.dart +lib/widgets/dialogs/cast_dialog.dart +lib/widgets/dialogs/convert_entry_dialog.dart +lib/widgets/dialogs/duration_dialog.dart +lib/widgets/dialogs/entry_editors/edit_date_dialog.dart +lib/widgets/dialogs/entry_editors/edit_description_dialog.dart +lib/widgets/dialogs/entry_editors/edit_location_dialog.dart +lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart +lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart +lib/widgets/dialogs/entry_editors/rename_entry_dialog.dart +lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart +lib/widgets/dialogs/entry_editors/tag_editor_page.dart +lib/widgets/dialogs/export_collection_stats_page.dart +lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart +lib/widgets/dialogs/filter_editors/create_dynamic_album_dialog.dart +lib/widgets/dialogs/filter_editors/create_group_dialog.dart +lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart +lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart +lib/widgets/dialogs/filter_editors/password_dialog.dart +lib/widgets/dialogs/filter_editors/pattern_dialog.dart +lib/widgets/dialogs/filter_editors/pin_dialog.dart +lib/widgets/dialogs/filter_editors/rename_dynamic_album_dialog.dart +lib/widgets/dialogs/filter_editors/rename_group_dialog.dart +lib/widgets/dialogs/filter_editors/rename_stored_album_dialog.dart +lib/widgets/dialogs/item_picker.dart +lib/widgets/dialogs/map/style_editor_dialog.dart +lib/widgets/dialogs/map/style_selection_dialog.dart +lib/widgets/dialogs/pick_dialogs/album_pick_page.dart +lib/widgets/dialogs/pick_dialogs/app_pick_page.dart +lib/widgets/dialogs/pick_dialogs/item_pick_page.dart +lib/widgets/dialogs/pick_dialogs/location_pick_page.dart +lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart +lib/widgets/dialogs/select_storage_dialog.dart +lib/widgets/dialogs/selection_dialogs/common.dart +lib/widgets/dialogs/selection_dialogs/multi_selection.dart +lib/widgets/dialogs/selection_dialogs/radio_list_tile.dart +lib/widgets/dialogs/selection_dialogs/single_selection.dart +lib/widgets/dialogs/tile_view_dialog.dart +lib/widgets/dialogs/time_shift_dialog.dart +lib/widgets/dialogs/video_speed_dialog.dart +lib/widgets/dialogs/video_stream_selection_dialog.dart +lib/widgets/dialogs/wallpaper_settings_dialog.dart +lib/widgets/editor/control_panel.dart +lib/widgets/editor/entry_editor_page.dart +lib/widgets/editor/image.dart +lib/widgets/editor/transform/control_panel.dart +lib/widgets/editor/transform/controller.dart +lib/widgets/editor/transform/crop_region.dart +lib/widgets/editor/transform/cropper.dart +lib/widgets/editor/transform/handles.dart +lib/widgets/editor/transform/painter.dart +lib/widgets/editor/transform/transformation.dart +lib/widgets/explorer/app_bar.dart +lib/widgets/explorer/crumb_line.dart +lib/widgets/explorer/explorer_action_delegate.dart +lib/widgets/explorer/explorer_page.dart +lib/widgets/filter_grids/albums_page.dart +lib/widgets/filter_grids/common/action_delegates/album_set.dart +lib/widgets/filter_grids/common/action_delegates/chip.dart +lib/widgets/filter_grids/common/action_delegates/chip_set.dart +lib/widgets/filter_grids/common/action_delegates/country_set.dart +lib/widgets/filter_grids/common/action_delegates/place_set.dart +lib/widgets/filter_grids/common/action_delegates/state_set.dart +lib/widgets/filter_grids/common/action_delegates/tag_set.dart +lib/widgets/filter_grids/common/app_bar.dart +lib/widgets/filter_grids/common/covered_filter_chip.dart +lib/widgets/filter_grids/common/draggable_thumb_label.dart +lib/widgets/filter_grids/common/enums.dart +lib/widgets/filter_grids/common/filter_chip_grid_decorator.dart +lib/widgets/filter_grids/common/filter_grid_page.dart +lib/widgets/filter_grids/common/filter_nav_page.dart +lib/widgets/filter_grids/common/filter_tile.dart +lib/widgets/filter_grids/common/group_crumb_line.dart +lib/widgets/filter_grids/common/list_details.dart +lib/widgets/filter_grids/common/list_details_theme.dart +lib/widgets/filter_grids/common/overlay.dart +lib/widgets/filter_grids/common/query_bar.dart +lib/widgets/filter_grids/common/section_header.dart +lib/widgets/filter_grids/common/section_keys.dart +lib/widgets/filter_grids/common/section_layout.dart +lib/widgets/filter_grids/countries_page.dart +lib/widgets/filter_grids/places_page.dart +lib/widgets/filter_grids/states_page.dart +lib/widgets/filter_grids/tags_page.dart +lib/widgets/home/home_error.dart +lib/widgets/home/home_page.dart +lib/widgets/home_widget.dart +lib/widgets/map/address_row.dart +lib/widgets/map/date_row.dart +lib/widgets/map/info_row.dart +lib/widgets/map/map_page.dart +lib/widgets/map/scroller.dart +lib/widgets/navigation/drawer/app_drawer.dart +lib/widgets/navigation/drawer/collection_nav_tile.dart +lib/widgets/navigation/drawer/page_nav_tile.dart +lib/widgets/navigation/drawer/tile.dart +lib/widgets/navigation/nav_bar/floating.dart +lib/widgets/navigation/nav_bar/nav_bar.dart +lib/widgets/navigation/nav_display.dart +lib/widgets/navigation/nav_item.dart +lib/widgets/navigation/tv_page_transitions.dart +lib/widgets/navigation/tv_rail.dart +lib/widgets/search/collection_search_delegate.dart +lib/widgets/settings/accessibility/accessibility.dart +lib/widgets/settings/accessibility/time_to_take_action.dart +lib/widgets/settings/app_export/items.dart +lib/widgets/settings/app_export/selection_dialog.dart +lib/widgets/settings/common/collection_tile.dart +lib/widgets/settings/common/quick_actions/action_panel.dart +lib/widgets/settings/common/quick_actions/available_actions.dart +lib/widgets/settings/common/quick_actions/editor_page.dart +lib/widgets/settings/common/quick_actions/placeholder.dart +lib/widgets/settings/common/quick_actions/quick_actions.dart +lib/widgets/settings/common/switch_icon.dart +lib/widgets/settings/common/tile_leading.dart +lib/widgets/settings/common/tiles.dart +lib/widgets/settings/display/display.dart +lib/widgets/settings/home_widget_settings_page.dart +lib/widgets/settings/language/language.dart +lib/widgets/settings/language/locale_selection_page.dart +lib/widgets/settings/language/locale_tile.dart +lib/widgets/settings/language/locales.dart +lib/widgets/settings/navigation/bottom_nav_actions_editor.dart +lib/widgets/settings/navigation/confirmation_dialogs.dart +lib/widgets/settings/navigation/drawer.dart +lib/widgets/settings/navigation/drawer_editor_banner.dart +lib/widgets/settings/navigation/drawer_tab_albums.dart +lib/widgets/settings/navigation/drawer_tab_fixed.dart +lib/widgets/settings/navigation/navigation.dart +lib/widgets/settings/privacy/access_grants_page.dart +lib/widgets/settings/privacy/hidden_items_page.dart +lib/widgets/settings/privacy/privacy.dart +lib/widgets/settings/screen_saver_settings_page.dart +lib/widgets/settings/settings_definition.dart +lib/widgets/settings/settings_mobile_page.dart +lib/widgets/settings/settings_page.dart +lib/widgets/settings/settings_search_delegate.dart +lib/widgets/settings/settings_tv_page.dart +lib/widgets/settings/thumbnails/collection_actions_editor_page.dart +lib/widgets/settings/thumbnails/overlay.dart +lib/widgets/settings/thumbnails/thumbnails.dart +lib/widgets/settings/video/control_actions.dart +lib/widgets/settings/video/controls.dart +lib/widgets/settings/video/playback.dart +lib/widgets/settings/video/subtitle_sample.dart +lib/widgets/settings/video/subtitle_theme.dart +lib/widgets/settings/video/video.dart +lib/widgets/settings/video/video_settings_page.dart +lib/widgets/settings/viewer/entry_background.dart +lib/widgets/settings/viewer/overlay.dart +lib/widgets/settings/viewer/slideshow.dart +lib/widgets/settings/viewer/viewer.dart +lib/widgets/settings/viewer/viewer_actions_editor.dart +lib/widgets/stats/date/axis.dart +lib/widgets/stats/date/histogram.dart +lib/widgets/stats/filter_table.dart +lib/widgets/stats/mime_donut.dart +lib/widgets/stats/percent_text.dart +lib/widgets/stats/stats_page.dart +lib/widgets/stats/top_page.dart +lib/widgets/viewer/action/entry_action_delegate.dart +lib/widgets/viewer/action/entry_info_action_delegate.dart +lib/widgets/viewer/action/printer.dart +lib/widgets/viewer/action/single_entry_editor.dart +lib/widgets/viewer/action/video_action_delegate.dart +lib/widgets/viewer/controls/controller.dart +lib/widgets/viewer/controls/events.dart +lib/widgets/viewer/controls/intents.dart +lib/widgets/viewer/controls/notifications.dart +lib/widgets/viewer/controls/shortcuts.dart +lib/widgets/viewer/controls/transitions.dart +lib/widgets/viewer/debug/db.dart +lib/widgets/viewer/debug/debug_page.dart +lib/widgets/viewer/debug/metadata.dart +lib/widgets/viewer/entry_horizontal_pager.dart +lib/widgets/viewer/entry_vertical_pager.dart +lib/widgets/viewer/entry_viewer_page.dart +lib/widgets/viewer/entry_viewer_page_dlna.dart +lib/widgets/viewer/entry_viewer_stack.dart +lib/widgets/viewer/fullscreen_cast_viewer.dart +lib/widgets/viewer/fullscreen_cast_viewer_dlna.dart +lib/widgets/viewer/fullscreen_cast_viewer_fast.dart +lib/widgets/viewer/hero.dart +lib/widgets/viewer/info/basic_section.dart +lib/widgets/viewer/info/color_section.dart +lib/widgets/viewer/info/common.dart +lib/widgets/viewer/info/embedded/embedded_data_opener.dart +lib/widgets/viewer/info/embedded/notifications.dart +lib/widgets/viewer/info/info_app_bar.dart +lib/widgets/viewer/info/info_page.dart +lib/widgets/viewer/info/info_search_delegate.dart +lib/widgets/viewer/info/location_section.dart +lib/widgets/viewer/info/metadata/geotiff.dart +lib/widgets/viewer/info/metadata/metadata_dir.dart +lib/widgets/viewer/info/metadata/metadata_dir_tile.dart +lib/widgets/viewer/info/metadata/metadata_section.dart +lib/widgets/viewer/info/metadata/metadata_thumbnail.dart +lib/widgets/viewer/info/metadata/tv_page.dart +lib/widgets/viewer/info/metadata/xmp_card.dart +lib/widgets/viewer/info/metadata/xmp_namespaces.dart +lib/widgets/viewer/info/metadata/xmp_ns/crs.dart +lib/widgets/viewer/info/metadata/xmp_ns/exif.dart +lib/widgets/viewer/info/metadata/xmp_ns/google.dart +lib/widgets/viewer/info/metadata/xmp_ns/misc.dart +lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart +lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart +lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart +lib/widgets/viewer/info/metadata/xmp_tile.dart +lib/widgets/viewer/multipage/conductor.dart +lib/widgets/viewer/multipage/controller.dart +lib/widgets/viewer/overlay/bottom.dart +lib/widgets/viewer/overlay/details/date.dart +lib/widgets/viewer/overlay/details/description.dart +lib/widgets/viewer/overlay/details/details.dart +lib/widgets/viewer/overlay/details/expander.dart +lib/widgets/viewer/overlay/details/location.dart +lib/widgets/viewer/overlay/details/position_title.dart +lib/widgets/viewer/overlay/details/rating_tags.dart +lib/widgets/viewer/overlay/details/shooting.dart +lib/widgets/viewer/overlay/histogram.dart +lib/widgets/viewer/overlay/locked.dart +lib/widgets/viewer/overlay/minimap.dart +lib/widgets/viewer/overlay/multipage.dart +lib/widgets/viewer/overlay/panorama.dart +lib/widgets/viewer/overlay/selection_button.dart +lib/widgets/viewer/overlay/slideshow_buttons.dart +lib/widgets/viewer/overlay/thumbnail_preview.dart +lib/widgets/viewer/overlay/top.dart +lib/widgets/viewer/overlay/video/ab_repeat.dart +lib/widgets/viewer/overlay/video/controls.dart +lib/widgets/viewer/overlay/video/progress_bar.dart +lib/widgets/viewer/overlay/video/video.dart +lib/widgets/viewer/overlay/viewer_buttons.dart +lib/widgets/viewer/overlay/wallpaper_buttons.dart +lib/widgets/viewer/page_entry_builder.dart +lib/widgets/viewer/panorama_page.dart +lib/widgets/viewer/providers.dart +lib/widgets/viewer/screen_saver_page.dart +lib/widgets/viewer/slideshow_page.dart +lib/widgets/viewer/source_viewer_page.dart +lib/widgets/viewer/video/conductor.dart +lib/widgets/viewer/video/db_playback_state_handler.dart +lib/widgets/viewer/video/remote_video_factory.dart +lib/widgets/viewer/view/conductor.dart +lib/widgets/viewer/view/controller.dart +lib/widgets/viewer/view/histogram.dart +lib/widgets/viewer/visual/controller_mixin.dart +lib/widgets/viewer/visual/entry_page_view.dart +lib/widgets/viewer/visual/error.dart +lib/widgets/viewer/visual/raster.dart +lib/widgets/viewer/visual/vector.dart +lib/widgets/viewer/visual/video/cover.dart +lib/widgets/viewer/visual/video/subtitle/ass_parser.dart +lib/widgets/viewer/visual/video/subtitle/line.dart +lib/widgets/viewer/visual/video/subtitle/span.dart +lib/widgets/viewer/visual/video/subtitle/style.dart +lib/widgets/viewer/visual/video/subtitle/subtitle.dart +lib/widgets/viewer/visual/video/swipe_action.dart +lib/widgets/viewer/visual/video/video_view.dart +lib/widgets/wallpaper_page.dart +lib/widgets/welcome_page.dart + +=== DIPENDENZE === + +lib/app_flavor.dart + importa: + importato da: + - lib/main_play.dart + - lib/widget_common.dart + - lib/main_play_test_editor.dart + - lib/main_common.dart + - lib/main_libre.dart + - lib/main_izzy.dart + - lib/model/settings/settings.dart + - lib/model/app/dependencies.dart + - lib/widgets/welcome_page.dart + - lib/widgets/aves_app.dart + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/about/licenses.dart + +lib/app_mode.dart + importa: + importato da: + - lib/widgets/aves_app.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/collection/grid/tile.dart + - lib/widgets/navigation/nav_bar/nav_bar.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/slideshow_page.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/action/single_entry_editor.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/visual/controller_mixin.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/viewer/debug/debug_page.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/country_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/convert/convert.dart + importa: + importato da: + - lib/model/naming_pattern.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/services/metadata/metadata_fetch_service.dart + - lib/services/metadata/metadata_edit_service.dart + +lib/convert/metadata/date_field_source.dart + importa: + importato da: + +lib/convert/metadata/fields.dart + importa: + importato da: + +lib/convert/metadata/metadata_type.dart + importa: + importato da: + +lib/geo/countries.dart + importa: + - lib/geo/topojson.dart + importato da: + - lib/model/entry/extensions/location.dart + - lib/model/source/location/location.dart + +lib/geo/states.dart + importa: + - lib/ref/unicode.dart + importato da: + - lib/model/metadata/address.dart + - lib/widgets/filter_grids/states_page.dart + - lib/widgets/filter_grids/common/action_delegates/country_set.dart + +lib/geo/topojson.dart + importa: + importato da: + - lib/geo/countries.dart + +lib/geo/uri.dart + importa: + - lib/utils/math_utils.dart + importato da: + - lib/services/app_service.dart + - lib/widgets/aves_app.dart + - lib/widgets/home/home_page.dart + - lib/widgets/common/map/map_action_delegate.dart + +lib/image_providers/app_icon_image_provider.dart + importa: + - lib/services/common/services.dart + importato da: + - lib/theme/colors.dart + - lib/widgets/common/identity/aves_icons.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + - lib/widgets/dialogs/pick_dialogs/app_pick_page.dart + - lib/widgets/debug/os_apps.dart + +lib/image_providers/descriptor_provider.dart + importa: + importato da: + - lib/widgets/viewer/info/metadata/metadata_thumbnail.dart + +lib/image_providers/full_image_provider.dart + importa: + - lib/services/common/services.dart + - lib/services/media/media_fetch_service.dart + importato da: + - lib/model/entry/cache.dart + - lib/model/entry/extensions/images.dart + +lib/image_providers/region_provider.dart + importa: + - lib/ref/mime_types.dart + - lib/services/common/services.dart + importato da: + - lib/model/entry/extensions/images.dart + - lib/services/media/media_fetch_service.dart + - lib/widgets/viewer/visual/vector.dart + - lib/widgets/viewer/visual/raster.dart + +lib/image_providers/thumbnail_provider.dart + importa: + - lib/services/common/services.dart + importato da: + - lib/model/entry/cache.dart + - lib/model/entry/extensions/images.dart + - lib/services/app_service.dart + - lib/services/media/media_fetch_service.dart + - lib/widgets/common/thumbnail/image.dart + +lib/l10n/l10n.dart + importa: + importato da: + - lib/model/filters/coordinate.dart + - lib/model/settings/enums/coordinate_format.dart + - lib/view/src/source/state.dart + - lib/services/analysis_service.dart + - lib/widgets/aves_app.dart + - lib/widgets/common/extensions/build_context.dart + +lib/l10ngen/app_localizations.dart + importa: + importato da: + +lib/l10ngen/app_localizations_ar.dart + importa: + importato da: + +lib/l10ngen/app_localizations_az.dart + importa: + importato da: + +lib/l10ngen/app_localizations_be.dart + importa: + importato da: + +lib/l10ngen/app_localizations_bg.dart + importa: + importato da: + +lib/l10ngen/app_localizations_bn.dart + importa: + importato da: + +lib/l10ngen/app_localizations_ca.dart + importa: + importato da: + +lib/l10ngen/app_localizations_ckb.dart + importa: + importato da: + +lib/l10ngen/app_localizations_cs.dart + importa: + importato da: + +lib/l10ngen/app_localizations_da.dart + importa: + importato da: + +lib/l10ngen/app_localizations_de.dart + importa: + importato da: + +lib/l10ngen/app_localizations_el.dart + importa: + importato da: + +lib/l10ngen/app_localizations_en.dart + importa: + importato da: + +lib/l10ngen/app_localizations_es.dart + importa: + importato da: + +lib/l10ngen/app_localizations_et.dart + importa: + importato da: + +lib/l10ngen/app_localizations_eu.dart + importa: + importato da: + +lib/l10ngen/app_localizations_fa.dart + importa: + importato da: + +lib/l10ngen/app_localizations_fi.dart + importa: + importato da: + +lib/l10ngen/app_localizations_fr.dart + importa: + importato da: + +lib/l10ngen/app_localizations_gl.dart + importa: + importato da: + +lib/l10ngen/app_localizations_he.dart + importa: + importato da: + +lib/l10ngen/app_localizations_hi.dart + importa: + importato da: + +lib/l10ngen/app_localizations_hr.dart + importa: + importato da: + +lib/l10ngen/app_localizations_hu.dart + importa: + importato da: + +lib/l10ngen/app_localizations_id.dart + importa: + importato da: + +lib/l10ngen/app_localizations_is.dart + importa: + importato da: + +lib/l10ngen/app_localizations_it.dart + importa: + importato da: + +lib/l10ngen/app_localizations_ja.dart + importa: + importato da: + +lib/l10ngen/app_localizations_kmr.dart + importa: + importato da: + +lib/l10ngen/app_localizations_kn.dart + importa: + importato da: + +lib/l10ngen/app_localizations_ko.dart + importa: + importato da: + +lib/l10ngen/app_localizations_lt.dart + importa: + importato da: + +lib/l10ngen/app_localizations_ml.dart + importa: + importato da: + +lib/l10ngen/app_localizations_my.dart + importa: + importato da: + +lib/l10ngen/app_localizations_nb.dart + importa: + importato da: + +lib/l10ngen/app_localizations_ne.dart + importa: + importato da: + +lib/l10ngen/app_localizations_nl.dart + importa: + importato da: + +lib/l10ngen/app_localizations_nn.dart + importa: + importato da: + +lib/l10ngen/app_localizations_or.dart + importa: + importato da: + +lib/l10ngen/app_localizations_pl.dart + importa: + importato da: + +lib/l10ngen/app_localizations_pt.dart + importa: + importato da: + +lib/l10ngen/app_localizations_ro.dart + importa: + importato da: + +lib/l10ngen/app_localizations_ru.dart + importa: + importato da: + +lib/l10ngen/app_localizations_sat.dart + importa: + importato da: + +lib/l10ngen/app_localizations_sk.dart + importa: + importato da: + +lib/l10ngen/app_localizations_sl.dart + importa: + importato da: + +lib/l10ngen/app_localizations_sr.dart + importa: + importato da: + +lib/l10ngen/app_localizations_sv.dart + importa: + importato da: + +lib/l10ngen/app_localizations_ta.dart + importa: + importato da: + +lib/l10ngen/app_localizations_th.dart + importa: + importato da: + +lib/l10ngen/app_localizations_tr.dart + importa: + importato da: + +lib/l10ngen/app_localizations_uk.dart + importa: + importato da: + +lib/l10ngen/app_localizations_ur.dart + importa: + importato da: + +lib/l10ngen/app_localizations_vi.dart + importa: + importato da: + +lib/l10ngen/app_localizations_zh.dart + importa: + importato da: + +lib/main_common.dart + importa: + - lib/app_flavor.dart + - lib/services/common/services.dart + - lib/widgets/aves_app.dart + importato da: + - lib/main_play.dart + - lib/main_play_test_editor.dart + - lib/main_libre.dart + - lib/main_izzy.dart + +lib/main_izzy.dart + importa: + - lib/app_flavor.dart + - lib/main_common.dart + - lib/widget_common.dart + importato da: + +lib/main_libre.dart + importa: + - lib/app_flavor.dart + - lib/main_common.dart + - lib/widget_common.dart + importato da: + +lib/main_play.dart + importa: + - lib/app_flavor.dart + - lib/main_common.dart + - lib/widget_common.dart + - lib/widgets/cast/cast_controller.dart + importato da: + +lib/main_play_test_editor.dart + importa: + - lib/app_flavor.dart + - lib/main_common.dart + - lib/model/app/intent.dart + importato da: + +lib/model/app/contributors.dart + importa: + importato da: + - lib/widgets/about/translators.dart + +lib/model/app/dependencies.dart + importa: + - lib/app_flavor.dart + importato da: + - lib/widgets/about/licenses.dart + +lib/model/app/intent.dart + importa: + importato da: + - lib/main_play_test_editor.dart + - lib/widgets/aves_app.dart + - lib/widgets/home/home_page.dart + +lib/model/app/permissions.dart + importa: + importato da: + - lib/widgets/home/home_page.dart + - lib/widgets/collection/collection_grid.dart + +lib/model/app/support.dart + importa: + - lib/ref/mime_types.dart + importato da: + - lib/model/entry/extensions/props.dart + - lib/services/media/media_fetch_service.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + +lib/model/app_inventory.dart + importa: + - lib/services/common/services.dart + importato da: + - lib/utils/android_file_utils.dart + - lib/model/covers.dart + - lib/services/app_service.dart + - lib/widgets/aves_app.dart + - lib/widgets/home/home_page.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/dialogs/pick_dialogs/app_pick_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/debug/os_apps.dart + +lib/model/availability.dart + importa: + - lib/model/device.dart + - lib/services/common/services.dart + importato da: + - lib/services/common/services.dart + +lib/model/covers.dart + importa: + - lib/model/app_inventory.dart + - lib/model/dynamic_albums.dart + - lib/model/entry/entry.dart + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/container/tag_group.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/model/source/collection_source.dart + - lib/model/vaults/vaults.dart + - lib/services/common/services.dart + - lib/utils/android_file_utils.dart + importato da: + - lib/theme/colors.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/covered/covered.dart + - lib/model/source/media_store_source.dart + - lib/model/source/collection_source.dart + - lib/model/db/db_sqflite.dart + - lib/model/db/db_sqflite_upgrade.dart + - lib/model/db/db.dart + - lib/services/storage_service.dart + - lib/widgets/settings/app_export/items.dart + - lib/widgets/collection/grid/headers/album.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/identity/aves_icons.dart + - lib/widgets/dialogs/add_shortcut_dialog.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/debug/database.dart + +lib/model/db/db.dart + importa: + - lib/model/covers.dart + - lib/model/dynamic_albums.dart + - lib/model/entry/entry.dart + - lib/model/favourites.dart + - lib/model/filters/filters.dart + - lib/model/metadata/address.dart + - lib/model/metadata/catalog.dart + - lib/model/metadata/trash.dart + - lib/model/vaults/details.dart + - lib/model/viewer/video_playback.dart + importato da: + - lib/model/db/db_sqflite.dart + - lib/services/common/services.dart + - lib/remote/run_remote_sync.dart + +lib/model/db/db_extension.dart + importa: + importato da: + - lib/model/db/db_sqflite_upgrade.dart + +lib/model/db/db_sqflite.dart + importa: + - lib/model/covers.dart + - lib/model/db/db.dart + - lib/model/db/db_sqflite_schema.dart + - lib/model/db/db_sqflite_upgrade.dart + - lib/model/dynamic_albums.dart + - lib/model/entry/entry.dart + - lib/model/favourites.dart + - lib/model/filters/filters.dart + - lib/model/metadata/address.dart + - lib/model/metadata/catalog.dart + - lib/model/metadata/trash.dart + - lib/model/vaults/details.dart + - lib/model/viewer/video_playback.dart + - lib/services/common/services.dart + - lib/remote/remote_origin.dart + importato da: + - lib/services/common/services.dart + +lib/model/db/db_sqflite_schema.dart + importa: + importato da: + - lib/model/db/db_sqflite.dart + - lib/model/db/db_sqflite_upgrade.dart + +lib/model/db/db_sqflite_upgrade.dart + importa: + - lib/model/covers.dart + - lib/model/db/db_extension.dart + - lib/model/db/db_sqflite_schema.dart + - lib/model/filters/filters.dart + importato da: + - lib/model/db/db_sqflite.dart + +lib/model/device.dart + importa: + - lib/services/common/services.dart + importato da: + - lib/model/availability.dart + - lib/model/filters/covered/location.dart + - lib/model/settings/settings.dart + - lib/model/settings/modules/display.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/services/analysis_service.dart + - lib/widgets/aves_app.dart + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/settings/video/playback.dart + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/settings/display/display.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/about/about_tv_page.dart + - lib/widgets/about/app_ref.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/common/map/map_action_delegate.dart + - lib/widgets/common/map/leaflet/map.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/visual/controller_mixin.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/debug/capabilities.dart + +lib/model/dynamic_albums.dart + importa: + - lib/model/filters/container/container.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/container/group_base.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/services/common/services.dart + importato da: + - lib/model/covers.dart + - lib/model/settings/settings.dart + - lib/model/grouping/common.dart + - lib/model/grouping/convert.dart + - lib/model/source/media_store_source.dart + - lib/model/db/db_sqflite.dart + - lib/model/db/db.dart + - lib/widgets/settings/app_export/items.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/dialogs/filter_editors/create_dynamic_album_dialog.dart + - lib/widgets/dialogs/filter_editors/rename_dynamic_album_dialog.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/debug/database.dart + +lib/model/entry/cache.dart + importa: + - lib/image_providers/full_image_provider.dart + - lib/image_providers/thumbnail_provider.dart + importato da: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/images.dart + +lib/model/entry/dirs.dart + importa: + - lib/services/common/services.dart + - lib/utils/android_file_utils.dart + importato da: + - lib/model/entry/entry.dart + +lib/model/entry/entry.dart + importa: + - lib/model/entry/cache.dart + - lib/model/entry/dirs.dart + - lib/model/entry/extensions/keys.dart + - lib/model/metadata/address.dart + - lib/model/metadata/catalog.dart + - lib/model/metadata/trash.dart + - lib/ref/mime_types.dart + - lib/services/common/services.dart + - lib/theme/format.dart + - lib/utils/time_utils.dart + - lib/remote/remote_origin.dart + importato da: + - lib/widget_common.dart + - lib/model/favourites.dart + - lib/model/naming_pattern.dart + - lib/model/multipage.dart + - lib/model/covers.dart + - lib/model/filters/favourite.dart + - lib/model/filters/placeholder.dart + - lib/model/filters/filters.dart + - lib/model/filters/trash.dart + - lib/model/filters/query.dart + - lib/model/settings/enums/widget_shape.dart + - lib/model/entry/sort.dart + - lib/model/entry/extensions/favourites.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/model/entry/extensions/remote_flags.dart + - lib/model/entry/extensions/catalog.dart + - lib/model/entry/extensions/props.dart + - lib/model/entry/extensions/info.dart + - lib/model/entry/extensions/location.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/images.dart + - lib/model/source/album.dart + - lib/model/source/trash.dart + - lib/model/source/tag.dart + - lib/model/source/events.dart + - lib/model/source/collection_lens.dart + - lib/model/source/media_store_source.dart + - lib/model/source/collection_source.dart + - lib/model/source/location/country.dart + - lib/model/source/location/place.dart + - lib/model/source/location/location.dart + - lib/model/source/location/state.dart + - lib/model/vaults/vaults.dart + - lib/model/db/db_sqflite.dart + - lib/model/db/db.dart + - lib/model/media/geotiff.dart + - lib/model/media/video/metadata.dart + - lib/services/app_service.dart + - lib/services/android_debug_service.dart + - lib/services/metadata/svg_metadata_service.dart + - lib/services/metadata/metadata_fetch_service.dart + - lib/services/metadata/metadata_edit_service.dart + - lib/services/media/media_fetch_service.dart + - lib/services/media/media_session_service.dart + - lib/services/media/media_edit_service.dart + - lib/services/media/media_store_service.dart + - lib/services/media/embedded_data_service.dart + - lib/widgets/wallpaper_page.dart + - lib/widgets/home_widget.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/query_bar.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/draggable_thumb_label.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/collection/app_bar/cast/cast_actions.dart + - lib/widgets/collection/app_bar/cast/cast_icon_button.dart + - lib/widgets/collection/app_bar/cast/cast_bar_inline.dart + - lib/widgets/collection/grid/tile.dart + - lib/widgets/collection/grid/section_layout.dart + - lib/widgets/collection/grid/list_details.dart + - lib/widgets/collection/grid/headers/album.dart + - lib/widgets/collection/grid/headers/any.dart + - lib/widgets/cast/cast_controller.dart + - lib/widgets/cast/cast_state.dart + - lib/widgets/cast/google_cast_controller.dart + - lib/widgets/cast/backends/google_cast_backend.dart + - lib/widgets/cast/backends/fast_cast_backend.dart + - lib/widgets/cast/backends/dlna_cast_backend.dart + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/common/thumbnail/scroller.dart + - lib/widgets/common/thumbnail/image.dart + - lib/widgets/common/thumbnail/decorated.dart + - lib/widgets/common/thumbnail/notifications.dart + - lib/widgets/common/thumbnail/error.dart + - lib/widgets/common/thumbnail/overlay.dart + - lib/widgets/common/identity/aves_icons.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/action_mixins/size_aware.dart + - lib/widgets/common/action_mixins/entry_editor.dart + - lib/widgets/common/providers/viewer_entry_provider.dart + - lib/widgets/common/map/map_action_delegate.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/common/action_controls/quick_choosers/share_button.dart + - lib/widgets/common/action_controls/togglers/favourite.dart + - lib/widgets/common/grid/theme.dart + - lib/widgets/viewer/fullscreen_cast_viewer_fast.dart + - lib/widgets/viewer/hero.dart + - lib/widgets/viewer/entry_viewer_page.dart + - lib/widgets/viewer/panorama_page.dart + - lib/widgets/viewer/entry_viewer_page_dlna.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/fullscreen_cast_viewer.dart + - lib/widgets/viewer/page_entry_builder.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/slideshow_page.dart + - lib/widgets/viewer/fullscreen_cast_viewer_dlna.dart + - lib/widgets/viewer/entry_horizontal_pager.dart + - lib/widgets/viewer/video/conductor.dart + - lib/widgets/viewer/video/remote_video_factory.dart + - lib/widgets/viewer/multipage/conductor.dart + - lib/widgets/viewer/multipage/controller.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/viewer/info/info_search_delegate.dart + - lib/widgets/viewer/info/color_section.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/info/metadata/tv_page.dart + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + - lib/widgets/viewer/info/metadata/metadata_thumbnail.dart + - lib/widgets/viewer/info/metadata/metadata_section.dart + - lib/widgets/viewer/info/embedded/embedded_data_opener.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/controls/controller.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/action/single_entry_editor.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/action/printer.dart + - lib/widgets/viewer/visual/controller_mixin.dart + - lib/widgets/viewer/visual/vector.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/visual/raster.dart + - lib/widgets/viewer/visual/error.dart + - lib/widgets/viewer/visual/video/video_view.dart + - lib/widgets/viewer/visual/video/cover.dart + - lib/widgets/viewer/visual/video/subtitle/subtitle.dart + - lib/widgets/viewer/view/conductor.dart + - lib/widgets/viewer/view/controller.dart + - lib/widgets/viewer/overlay/selection_button.dart + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/thumbnail_preview.dart + - lib/widgets/viewer/overlay/wallpaper_buttons.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/viewer/overlay/histogram.dart + - lib/widgets/viewer/overlay/panorama.dart + - lib/widgets/viewer/overlay/video/video.dart + - lib/widgets/viewer/overlay/details/position_title.dart + - lib/widgets/viewer/overlay/details/details.dart + - lib/widgets/viewer/overlay/details/rating_tags.dart + - lib/widgets/viewer/overlay/details/location.dart + - lib/widgets/viewer/overlay/details/date.dart + - lib/widgets/viewer/debug/debug_page.dart + - lib/widgets/viewer/debug/metadata.dart + - lib/widgets/viewer/debug/db.dart + - lib/widgets/map/scroller.dart + - lib/widgets/map/info_row.dart + - lib/widgets/map/address_row.dart + - lib/widgets/map/map_page.dart + - lib/widgets/map/date_row.dart + - lib/widgets/dialogs/item_picker.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + - lib/widgets/dialogs/add_shortcut_dialog.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart + - lib/widgets/dialogs/entry_editors/rename_entry_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/list_details.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/stats/date/histogram.dart + - lib/widgets/editor/image.dart + - lib/widgets/editor/entry_editor_page.dart + - lib/widgets/editor/control_panel.dart + - lib/widgets/editor/transform/control_panel.dart + - lib/widgets/debug/database.dart + - lib/remote/remote_view_helpers.dart + - lib/remote/remote_image_tile.dart + - lib/remote/remote_gallery_bridge.dart + - lib/remote/collection_source_remote_ext.dart + - lib/remote/remote_controller.dart + +lib/model/entry/extensions/catalog.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/keys.dart + - lib/model/entry/extensions/props.dart + - lib/model/media/geotiff.dart + - lib/model/media/video/metadata.dart + - lib/model/metadata/catalog.dart + - lib/ref/mime_types.dart + - lib/services/common/services.dart + - lib/services/metadata/svg_metadata_service.dart + importato da: + - lib/model/filters/placeholder.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/model/source/tag.dart + - lib/model/source/collection_source.dart + - lib/widgets/home/home_page.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/action/single_entry_editor.dart + +lib/model/entry/extensions/favourites.dart + importa: + - lib/model/entry/entry.dart + - lib/model/favourites.dart + importato da: + - lib/model/filters/favourite.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_controls/togglers/favourite.dart + - lib/widgets/common/grid/theme.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/debug/debug_page.dart + +lib/model/entry/extensions/images.dart + importa: + - lib/image_providers/full_image_provider.dart + - lib/image_providers/region_provider.dart + - lib/image_providers/thumbnail_provider.dart + - lib/model/entry/cache.dart + - lib/model/entry/entry.dart + - lib/utils/math_utils.dart + - lib/remote/remote_http.dart + - lib/remote/remote_origin.dart + importato da: + - lib/model/media/geotiff.dart + - lib/widgets/home_widget.dart + - lib/widgets/common/thumbnail/image.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/viewer/panorama_page.dart + - lib/widgets/viewer/info/color_section.dart + - lib/widgets/viewer/action/printer.dart + - lib/widgets/viewer/visual/vector.dart + - lib/widgets/viewer/visual/raster.dart + - lib/widgets/viewer/visual/video/cover.dart + - lib/widgets/viewer/overlay/wallpaper_buttons.dart + - lib/widgets/viewer/debug/debug_page.dart + +lib/model/entry/extensions/info.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/media/video/metadata.dart + - lib/ref/mime_types.dart + - lib/services/common/services.dart + - lib/services/metadata/svg_metadata_service.dart + - lib/theme/colors.dart + - lib/theme/format.dart + - lib/theme/text.dart + - lib/widgets/viewer/info/metadata/metadata_dir.dart + importato da: + - lib/widgets/viewer/info/metadata/metadata_section.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + +lib/model/entry/extensions/keys.dart + importa: + importato da: + - lib/model/multipage.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/catalog.dart + - lib/model/source/collection_source.dart + - lib/model/media/video/metadata.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/viewer/info/embedded/embedded_data_opener.dart + - lib/widgets/viewer/action/video_action_delegate.dart + +lib/model/entry/extensions/location.dart + importa: + - lib/geo/countries.dart + - lib/model/entry/entry.dart + - lib/model/metadata/address.dart + - lib/services/common/service_policy.dart + - lib/services/common/services.dart + - lib/services/geocoding_service.dart + importato da: + - lib/model/filters/placeholder.dart + - lib/model/filters/coordinate.dart + - lib/model/source/collection_source.dart + - lib/model/source/location/location.dart + - lib/widgets/collection/grid/list_details.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/action/single_entry_editor.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/overlay/details/location.dart + - lib/widgets/viewer/debug/debug_page.dart + - lib/widgets/viewer/debug/metadata.dart + - lib/widgets/map/address_row.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/stats/stats_page.dart + +lib/model/entry/extensions/metadata_edition.dart + importa: + - lib/convert/convert.dart + - lib/model/device.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/catalog.dart + - lib/model/entry/extensions/props.dart + - lib/model/metadata/date_modifier.dart + - lib/ref/locales.dart + - lib/ref/metadata/exif.dart + - lib/ref/metadata/iptc.dart + - lib/ref/metadata/xmp.dart + - lib/ref/mime_types.dart + - lib/services/common/services.dart + - lib/services/metadata/xmp.dart + - lib/utils/time_utils.dart + - lib/utils/xmp_utils.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/action_mixins/entry_editor.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_description_dialog.dart + +lib/model/entry/extensions/multipage.dart + importa: + - lib/model/entry/entry.dart + - lib/model/multipage.dart + - lib/ref/bursts.dart + - lib/services/common/services.dart + importato da: + - lib/model/multipage.dart + - lib/model/filters/type.dart + - lib/model/entry/extensions/info.dart + - lib/model/source/collection_lens.dart + - lib/services/metadata/metadata_fetch_service.dart + - lib/widgets/wallpaper_page.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/identity/aves_icons.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/entry_editor.dart + - lib/widgets/common/action_controls/quick_choosers/share_button.dart + - lib/widgets/common/grid/theme.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/entry_horizontal_pager.dart + - lib/widgets/viewer/multipage/controller.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/action/printer.dart + - lib/widgets/viewer/visual/controller_mixin.dart + - lib/widgets/viewer/visual/video/cover.dart + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/viewer/debug/debug_page.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + +lib/model/entry/extensions/props.dart + importa: + - lib/model/app/support.dart + - lib/model/entry/entry.dart + - lib/model/settings/settings.dart + - lib/model/source/trash.dart + - lib/ref/mime_types.dart + - lib/ref/unicode.dart + - lib/services/common/services.dart + - lib/theme/text.dart + - lib/utils/android_file_utils.dart + - lib/utils/time_utils.dart + importato da: + - lib/model/filters/type.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/model/entry/extensions/catalog.dart + - lib/model/entry/extensions/info.dart + - lib/model/source/trash.dart + - lib/model/source/collection_lens.dart + - lib/services/app_service.dart + - lib/services/metadata/metadata_fetch_service.dart + - lib/services/metadata/metadata_edit_service.dart + - lib/widgets/wallpaper_page.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/thumbnail/image.dart + - lib/widgets/common/identity/aves_icons.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/grid/theme.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/entry_horizontal_pager.dart + - lib/widgets/viewer/video/conductor.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/action/printer.dart + - lib/widgets/viewer/visual/controller_mixin.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/visual/raster.dart + - lib/widgets/viewer/visual/video/subtitle/subtitle.dart + - lib/widgets/viewer/overlay/wallpaper_buttons.dart + - lib/widgets/viewer/overlay/details/date.dart + - lib/widgets/viewer/debug/debug_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/stats/stats_page.dart + - lib/remote/remote_image_tile.dart + +lib/model/entry/extensions/remote_flags.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/origins.dart + - lib/remote/remote_origin.dart + importato da: + - lib/widgets/collection/collection_grid.dart + +lib/model/entry/origins.dart + importa: + importato da: + - lib/model/entry/extensions/remote_flags.dart + - lib/model/source/media_store_source.dart + - lib/model/vaults/vaults.dart + +lib/model/entry/sort.dart + importa: + - lib/model/entry/entry.dart + - lib/utils/time_utils.dart + importato da: + - lib/widget_common.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/services/global_search.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/stats/date/histogram.dart + +lib/model/favourites.dart + importa: + - lib/model/entry/entry.dart + - lib/model/source/collection_source.dart + - lib/services/common/services.dart + - lib/utils/android_file_utils.dart + importato da: + - lib/model/entry/extensions/favourites.dart + - lib/model/source/collection_lens.dart + - lib/model/source/media_store_source.dart + - lib/model/source/collection_source.dart + - lib/model/db/db_sqflite.dart + - lib/model/db/db.dart + - lib/widgets/settings/app_export/items.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_controls/togglers/favourite.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/debug/database.dart + - lib/widgets/debug/app_debug_page.dart + +lib/model/filters/aspect_ratio.dart + importa: + - lib/model/filters/filters.dart + - lib/model/filters/query.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/filters/filters.dart + - lib/widgets/search/collection_search_delegate.dart + +lib/model/filters/container/album_group.dart + importa: + - lib/model/filters/container/group_base.dart + - lib/model/filters/container/set_or.dart + - lib/model/filters/filters.dart + importato da: + - lib/model/covers.dart + - lib/model/filters/filters.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/settings/modules/navigation.dart + - lib/model/grouping/common.dart + - lib/model/source/album.dart + - lib/model/source/collection_source.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/settings/navigation/drawer_tab_albums.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/drawer/collection_nav_tile.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + +lib/model/filters/container/container.dart + importa: + - lib/model/filters/filters.dart + importato da: + - lib/model/dynamic_albums.dart + - lib/model/filters/container/group_base.dart + - lib/model/filters/container/set_or.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/container/set_and.dart + +lib/model/filters/container/dynamic_album.dart + importa: + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/container.dart + - lib/model/filters/covered/covered.dart + - lib/model/filters/filters.dart + - lib/theme/icons.dart + importato da: + - lib/model/dynamic_albums.dart + - lib/model/covers.dart + - lib/model/filters/filters.dart + - lib/model/settings/modules/filter_grids.dart + - lib/model/settings/modules/navigation.dart + - lib/model/grouping/common.dart + - lib/model/grouping/convert.dart + - lib/model/source/album.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/list_details.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + +lib/model/filters/container/group_base.dart + importa: + - lib/model/filters/container/container.dart + - lib/model/filters/container/set_or.dart + - lib/model/filters/covered/covered.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/theme/icons.dart + importato da: + - lib/model/dynamic_albums.dart + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/tag_group.dart + - lib/model/grouping/common.dart + - lib/model/grouping/convert.dart + - lib/widgets/filter_grids/common/list_details.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + +lib/model/filters/container/set_and.dart + importa: + - lib/model/filters/container/container.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/theme/icons.dart + importato da: + - lib/model/filters/filters.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/search/collection_search_delegate.dart + +lib/model/filters/container/set_or.dart + importa: + - lib/model/filters/container/container.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/theme/icons.dart + importato da: + - lib/model/filters/filters.dart + - lib/model/filters/container/group_base.dart + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/tag_group.dart + - lib/model/grouping/common.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/model/filters/container/tag_group.dart + importa: + - lib/model/filters/container/group_base.dart + - lib/model/filters/container/set_or.dart + - lib/model/filters/filters.dart + importato da: + - lib/model/covers.dart + - lib/model/filters/filters.dart + - lib/model/filters/covered/tag.dart + - lib/model/grouping/common.dart + - lib/model/source/tag.dart + - lib/model/source/collection_source.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + +lib/model/filters/coordinate.dart + importa: + - lib/l10n/l10n.dart + - lib/model/entry/extensions/location.dart + - lib/model/filters/filters.dart + - lib/model/settings/enums/coordinate_format.dart + - lib/model/settings/settings.dart + - lib/theme/icons.dart + importato da: + - lib/model/filters/filters.dart + - lib/widgets/common/map/buttons/coordinate_filter.dart + - lib/widgets/map/map_page.dart + +lib/model/filters/covered/covered.dart + importa: + - lib/model/covers.dart + - lib/model/filters/filters.dart + importato da: + - lib/model/filters/container/group_base.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/covered/stored_album.dart + +lib/model/filters/covered/location.dart + importa: + - lib/model/device.dart + - lib/model/filters/covered/covered.dart + - lib/model/filters/filters.dart + - lib/theme/icons.dart + - lib/utils/emoji_utils.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/filters/filters.dart + - lib/model/filters/container/set_or.dart + - lib/model/filters/container/set_and.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/model/source/location/country.dart + - lib/model/source/location/place.dart + - lib/model/source/location/location.dart + - lib/model/source/location/state.dart + - lib/widgets/home/home_page.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/states_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/action_delegates/place_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/filter_grids/common/action_delegates/country_set.dart + - lib/widgets/filter_grids/common/action_delegates/state_set.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/debug/app_debug_page.dart + +lib/model/filters/covered/stored_album.dart + importa: + - lib/model/covers.dart + - lib/model/filters/container/album_group.dart + - lib/model/filters/covered/covered.dart + - lib/model/filters/filters.dart + - lib/model/vaults/vaults.dart + - lib/services/common/services.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/utils/android_file_utils.dart + - lib/widgets/common/identity/aves_icons.dart + importato da: + - lib/model/covers.dart + - lib/model/filters/filters.dart + - lib/model/filters/container/set_or.dart + - lib/model/filters/container/set_and.dart + - lib/model/grouping/common.dart + - lib/model/grouping/convert.dart + - lib/model/source/album.dart + - lib/model/source/collection_lens.dart + - lib/model/source/media_store_source.dart + - lib/model/source/collection_source.dart + - lib/widgets/home/home_page.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/drawer/collection_nav_tile.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/action_controls/quick_choosers/album_chooser.dart + - lib/widgets/common/action_controls/quick_choosers/move_button.dart + - lib/widgets/viewer/slideshow_page.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/list_details.dart + - lib/widgets/filter_grids/common/filter_tile.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/stats/top_page.dart + - lib/widgets/stats/stats_page.dart + +lib/model/filters/covered/tag.dart + importa: + - lib/model/filters/container/tag_group.dart + - lib/model/filters/covered/covered.dart + - lib/model/filters/filters.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/filters/filters.dart + - lib/model/settings/modules/app.dart + - lib/model/grouping/common.dart + - lib/model/grouping/convert.dart + - lib/model/source/tag.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/common/action_mixins/entry_editor.dart + - lib/widgets/common/action_controls/quick_choosers/tag_button.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/debug/app_debug_page.dart + +lib/model/filters/date.dart + importa: + - lib/model/filters/filters.dart + - lib/theme/format.dart + - lib/theme/icons.dart + - lib/utils/time_utils.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/filters/filters.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/stats/date/axis.dart + - lib/widgets/stats/date/histogram.dart + +lib/model/filters/favourite.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/favourites.dart + - lib/model/filters/filters.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/filters/filters.dart + - lib/model/settings/defaults.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/viewer/info/basic_section.dart + +lib/model/filters/filters.dart + importa: + - lib/model/entry/entry.dart + - lib/model/filters/aspect_ratio.dart + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/container/set_and.dart + - lib/model/filters/container/set_or.dart + - lib/model/filters/container/tag_group.dart + - lib/model/filters/coordinate.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/date.dart + - lib/model/filters/favourite.dart + - lib/model/filters/mime.dart + - lib/model/filters/missing.dart + - lib/model/filters/path.dart + - lib/model/filters/placeholder.dart + - lib/model/filters/query.dart + - lib/model/filters/rating.dart + - lib/model/filters/recent.dart + - lib/model/filters/trash.dart + - lib/model/filters/type.dart + - lib/model/filters/weekday.dart + - lib/theme/colors.dart + importato da: + - lib/model/dynamic_albums.dart + - lib/model/covers.dart + - lib/model/filters/type.dart + - lib/model/filters/favourite.dart + - lib/model/filters/missing.dart + - lib/model/filters/placeholder.dart + - lib/model/filters/trash.dart + - lib/model/filters/recent.dart + - lib/model/filters/query.dart + - lib/model/filters/rating.dart + - lib/model/filters/coordinate.dart + - lib/model/filters/weekday.dart + - lib/model/filters/mime.dart + - lib/model/filters/aspect_ratio.dart + - lib/model/filters/date.dart + - lib/model/filters/path.dart + - lib/model/filters/container/group_base.dart + - lib/model/filters/container/set_or.dart + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/container.dart + - lib/model/filters/container/tag_group.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/container/set_and.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/covered/covered.dart + - lib/model/settings/modules/screen_saver.dart + - lib/model/settings/modules/filter_grids.dart + - lib/model/settings/modules/widget.dart + - lib/model/settings/modules/navigation.dart + - lib/model/settings/modules/privacy.dart + - lib/model/settings/modules/app.dart + - lib/model/settings/modules/search.dart + - lib/model/grouping/common.dart + - lib/model/grouping/convert.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/model/db/db_sqflite.dart + - lib/model/db/db_sqflite_upgrade.dart + - lib/model/db/db.dart + - lib/services/intent_service.dart + - lib/services/app_service.dart + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/settings/screen_saver_settings_page.dart + - lib/widgets/settings/privacy/hidden_items_page.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/settings/navigation/navigation.dart + - lib/widgets/settings/common/collection_tile.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/filter_bar.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/navigation/drawer/tile.dart + - lib/widgets/navigation/drawer/collection_nav_tile.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/common/expandable_filter_row.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/action_mixins/entry_editor.dart + - lib/widgets/common/action_controls/quick_choosers/tag_chooser.dart + - lib/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart + - lib/widgets/common/action_controls/quick_choosers/album_chooser.dart + - lib/widgets/common/action_controls/quick_choosers/move_button.dart + - lib/widgets/common/action_controls/quick_choosers/tag_button.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/states_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/filter_chip_grid_decorator.dart + - lib/widgets/filter_grids/common/section_layout.dart + - lib/widgets/filter_grids/common/query_bar.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/list_details.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/draggable_thumb_label.dart + - lib/widgets/filter_grids/common/filter_tile.dart + - lib/widgets/filter_grids/common/overlay.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/place_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/filter_grids/common/action_delegates/country_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/filter_grids/common/action_delegates/state_set.dart + - lib/widgets/stats/top_page.dart + - lib/widgets/stats/filter_table.dart + - lib/widgets/stats/stats_page.dart + +lib/model/filters/mime.dart + importa: + - lib/model/filters/filters.dart + - lib/ref/mime_types.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/utils/mime_utils.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/filters/filters.dart + - lib/model/settings/defaults.dart + - lib/model/settings/settings.dart + - lib/widgets/settings/video/video.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/viewer/screen_saver_page.dart + - lib/widgets/viewer/slideshow_page.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/stats/mime_donut.dart + +lib/model/filters/missing.dart + importa: + - lib/model/filters/filters.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/filters/filters.dart + - lib/widgets/search/collection_search_delegate.dart + +lib/model/filters/path.dart + importa: + - lib/model/filters/filters.dart + - lib/services/common/services.dart + - lib/theme/icons.dart + - lib/utils/android_file_utils.dart + - lib/view/view.dart + importato da: + - lib/model/filters/filters.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/debug/app_debug_page.dart + +lib/model/filters/placeholder.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/catalog.dart + - lib/model/entry/extensions/location.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/filters/filters.dart + - lib/widgets/common/action_mixins/entry_editor.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + +lib/model/filters/query.dart + importa: + - lib/model/entry/entry.dart + - lib/model/filters/filters.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/utils/file_utils.dart + importato da: + - lib/model/filters/filters.dart + - lib/model/filters/aspect_ratio.dart + - lib/model/source/collection_lens.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/dialogs/add_shortcut_dialog.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + +lib/model/filters/rating.dart + importa: + - lib/model/filters/filters.dart + - lib/ref/unicode.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/filters/filters.dart + - lib/model/source/collection_lens.dart + - lib/widgets/collection/draggable_thumb_label.dart + - lib/widgets/collection/grid/headers/rating.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/stats/stats_page.dart + +lib/model/filters/recent.dart + importa: + - lib/model/filters/filters.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/filters/filters.dart + - lib/model/settings/defaults.dart + - lib/widgets/aves_app.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/search/collection_search_delegate.dart + +lib/model/filters/trash.dart + importa: + - lib/model/entry/entry.dart + - lib/model/filters/filters.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/filters/filters.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/viewer/entry_viewer_stack.dart + +lib/model/filters/type.dart + importa: + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/filters/filters.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/filters/filters.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/viewer/info/basic_section.dart + +lib/model/filters/weekday.dart + importa: + - lib/model/filters/filters.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/filters/filters.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/viewer/info/basic_section.dart + +lib/model/grouping/common.dart + importa: + - lib/model/dynamic_albums.dart + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/container/group_base.dart + - lib/model/filters/container/set_or.dart + - lib/model/filters/container/tag_group.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/filters.dart + - lib/model/grouping/convert.dart + - lib/model/source/album.dart + - lib/model/source/collection_source.dart + - lib/model/source/events.dart + - lib/services/common/services.dart + - lib/utils/collection_utils.dart + importato da: + - lib/model/dynamic_albums.dart + - lib/model/covers.dart + - lib/model/filters/container/group_base.dart + - lib/model/settings/settings.dart + - lib/model/settings/modules/filter_grids.dart + - lib/model/settings/modules/navigation.dart + - lib/model/grouping/convert.dart + - lib/model/source/media_store_source.dart + - lib/model/source/collection_source.dart + - lib/widgets/settings/app_export/items.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/dialogs/filter_editors/create_group_dialog.dart + - lib/widgets/dialogs/filter_editors/rename_group_dialog.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/group_crumb_line.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/model/grouping/convert.dart + importa: + - lib/model/dynamic_albums.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/container/group_base.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + importato da: + - lib/model/grouping/common.dart + - lib/model/source/collection_source.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + +lib/model/highlight.dart + importa: + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/thumbnail/overlay.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/providers/highlight_info_provider.dart + - lib/widgets/common/grid/scaling.dart + - lib/widgets/common/grid/item_tracker.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/map/map_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/overlay.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + +lib/model/media/geotiff.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/images.dart + - lib/ref/metadata/geotiff.dart + - lib/utils/math_utils.dart + importato da: + - lib/model/entry/extensions/catalog.dart + - lib/services/metadata/metadata_fetch_service.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/map/map_page.dart + +lib/model/media/panorama.dart + importa: + importato da: + - lib/services/metadata/metadata_fetch_service.dart + - lib/widgets/viewer/panorama_page.dart + +lib/model/media/video/channel_layouts.dart + importa: + importato da: + - lib/model/media/video/metadata.dart + +lib/model/media/video/codecs.dart + importa: + importato da: + - lib/model/media/video/metadata.dart + +lib/model/media/video/metadata.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/keys.dart + - lib/model/media/video/channel_layouts.dart + - lib/model/media/video/codecs.dart + - lib/model/media/video/profiles/aac.dart + - lib/model/media/video/profiles/h264.dart + - lib/model/media/video/profiles/hevc.dart + - lib/model/media/video/stereo_3d_modes.dart + - lib/model/metadata/catalog.dart + - lib/ref/languages.dart + - lib/ref/locales.dart + - lib/ref/mime_types.dart + - lib/ref/mp4.dart + - lib/services/common/services.dart + - lib/theme/format.dart + - lib/utils/file_utils.dart + - lib/utils/math_utils.dart + - lib/utils/string_utils.dart + - lib/utils/time_utils.dart + importato da: + - lib/model/entry/extensions/catalog.dart + - lib/model/entry/extensions/info.dart + +lib/model/media/video/profiles/aac.dart + importa: + importato da: + - lib/model/media/video/metadata.dart + +lib/model/media/video/profiles/h264.dart + importa: + importato da: + - lib/model/media/video/metadata.dart + +lib/model/media/video/profiles/hevc.dart + importa: + importato da: + - lib/model/media/video/metadata.dart + +lib/model/media/video/stereo_3d_modes.dart + importa: + importato da: + - lib/model/media/video/metadata.dart + +lib/model/metadata/address.dart + importa: + - lib/geo/states.dart + importato da: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/location.dart + - lib/model/source/location/location.dart + - lib/model/db/db_sqflite.dart + - lib/model/db/db.dart + - lib/widgets/viewer/debug/db.dart + - lib/widgets/debug/database.dart + +lib/model/metadata/catalog.dart + importa: + - lib/services/geocoding_service.dart + importato da: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/catalog.dart + - lib/model/source/tag.dart + - lib/model/db/db_sqflite.dart + - lib/model/db/db.dart + - lib/model/media/video/metadata.dart + - lib/services/metadata/metadata_fetch_service.dart + - lib/widgets/viewer/debug/db.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/debug/database.dart + +lib/model/metadata/date_modifier.dart + importa: + importato da: + - lib/model/entry/extensions/metadata_edition.dart + - lib/services/metadata/metadata_edit_service.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/entry_editor.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + +lib/model/metadata/overlay.dart + importa: + importato da: + - lib/services/metadata/metadata_fetch_service.dart + - lib/widgets/viewer/overlay/details/details.dart + - lib/widgets/viewer/overlay/details/shooting.dart + +lib/model/metadata/trash.dart + importa: + importato da: + - lib/model/entry/entry.dart + - lib/model/source/trash.dart + - lib/model/source/collection_source.dart + - lib/model/db/db_sqflite.dart + - lib/model/db/db.dart + - lib/widgets/viewer/debug/db.dart + - lib/widgets/debug/database.dart + +lib/model/multipage.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/keys.dart + - lib/model/entry/extensions/multipage.dart + - lib/ref/mime_types.dart + - lib/services/common/services.dart + importato da: + - lib/model/entry/extensions/multipage.dart + - lib/services/metadata/metadata_fetch_service.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/viewer/page_entry_builder.dart + - lib/widgets/viewer/multipage/controller.dart + - lib/widgets/viewer/overlay/multipage.dart + - lib/widgets/viewer/overlay/details/position_title.dart + +lib/model/naming_pattern.dart + importa: + - lib/convert/convert.dart + - lib/model/entry/entry.dart + - lib/services/common/services.dart + importato da: + - lib/model/settings/defaults.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + +lib/model/query.dart + importa: + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/common/providers/query_provider.dart + - lib/widgets/common/action_controls/togglers/title_search.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/model/selection.dart + importa: + importato da: + - lib/widgets/collection/query_bar.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/collection/app_bar/cast/cast_icon_button.dart + - lib/widgets/collection/app_bar/cast/cast_bar_inline.dart + - lib/widgets/collection/grid/tile.dart + - lib/widgets/common/thumbnail/overlay.dart + - lib/widgets/common/providers/selection_provider.dart + - lib/widgets/common/grid/selector.dart + - lib/widgets/common/grid/header.dart + - lib/widgets/common/grid/overlay.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/overlay/selection_button.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/query_bar.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/model/settings/defaults.dart + importa: + - lib/model/filters/favourite.dart + - lib/model/filters/mime.dart + - lib/model/filters/recent.dart + - lib/model/naming_pattern.dart + - lib/ref/mime_types.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/navigation/nav_item.dart + - lib/model/settings/enums/local_cast_source_mode.dart + importato da: + - lib/model/settings/settings.dart + - lib/model/settings/modules/collection.dart + - lib/model/settings/modules/screen_saver.dart + - lib/model/settings/modules/filter_grids.dart + - lib/model/settings/modules/info.dart + - lib/model/settings/modules/slideshow.dart + - lib/model/settings/modules/viewer.dart + - lib/model/settings/modules/display.dart + - lib/model/settings/modules/widget.dart + - lib/model/settings/modules/navigation.dart + - lib/model/settings/modules/app.dart + - lib/model/settings/modules/search.dart + - lib/widgets/welcome_page.dart + - lib/widgets/aves_app.dart + +lib/model/settings/enums/accessibility_animations.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/durations.dart + importato da: + - lib/model/settings/settings.dart + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/map/buttons/panel.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/debug/app_debug_page.dart + +lib/model/settings/enums/accessibility_timeout.dart + importa: + - lib/services/accessibility_service.dart + - lib/theme/durations.dart + importato da: + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/viewer/entry_viewer_stack.dart + +lib/model/settings/enums/coordinate_format.dart + importa: + - lib/l10n/l10n.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/filters/coordinate.dart + - lib/widgets/settings/language/language.dart + - lib/widgets/collection/grid/list_details.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/viewer/overlay/details/location.dart + - lib/widgets/map/address_row.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + +lib/model/settings/enums/display_refresh_rate_mode.dart + importa: + - lib/services/common/services.dart + importato da: + - lib/widgets/aves_app.dart + +lib/model/settings/enums/entry_background.dart + importa: + importato da: + - lib/widgets/settings/viewer/entry_background.dart + - lib/widgets/common/thumbnail/image.dart + - lib/widgets/viewer/visual/vector.dart + - lib/widgets/viewer/visual/raster.dart + +lib/model/settings/enums/local_cast_source_mode.dart + importa: + importato da: + - lib/model/settings/defaults.dart + - lib/model/settings/modules/viewer.dart + - lib/widgets/settings/viewer/viewer.dart + +lib/model/settings/enums/screen_on.dart + importa: + - lib/services/common/services.dart + importato da: + - lib/widgets/aves_app.dart + +lib/model/settings/enums/subtitle_position.dart + importa: + importato da: + - lib/widgets/viewer/visual/video/subtitle/subtitle.dart + +lib/model/settings/enums/theme_brightness.dart + importa: + importato da: + - lib/widgets/aves_app.dart + +lib/model/settings/enums/viewer_transition.dart + importa: + - lib/widgets/viewer/controls/transitions.dart + importato da: + - lib/widgets/viewer/entry_horizontal_pager.dart + +lib/model/settings/enums/widget_outline.dart + importa: + importato da: + - lib/widget_common.dart + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/viewer/visual/entry_page_view.dart + +lib/model/settings/enums/widget_shape.dart + importa: + - lib/model/entry/entry.dart + importato da: + - lib/widgets/home_widget.dart + - lib/widgets/settings/home_widget_settings_page.dart + +lib/model/settings/modules/app.dart + importa: + - lib/model/filters/covered/tag.dart + - lib/model/filters/filters.dart + - lib/model/settings/defaults.dart + - lib/model/source/collection_source.dart + - lib/model/vaults/vaults.dart + - lib/widgets/aves_app.dart + importato da: + - lib/model/settings/settings.dart + - lib/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart + +lib/model/settings/modules/collection.dart + importa: + - lib/model/settings/defaults.dart + importato da: + - lib/model/settings/settings.dart + +lib/model/settings/modules/debug.dart + importa: + importato da: + - lib/model/settings/settings.dart + +lib/model/settings/modules/display.dart + importa: + - lib/model/device.dart + - lib/model/settings/defaults.dart + importato da: + - lib/model/settings/settings.dart + +lib/model/settings/modules/filter_grids.dart + importa: + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/model/settings/defaults.dart + - lib/utils/collection_utils.dart + importato da: + - lib/model/settings/settings.dart + +lib/model/settings/modules/info.dart + importa: + - lib/model/settings/defaults.dart + importato da: + - lib/model/settings/settings.dart + +lib/model/settings/modules/navigation.dart + importa: + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/model/settings/defaults.dart + - lib/utils/collection_utils.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/navigation/nav_item.dart + importato da: + - lib/model/settings/settings.dart + +lib/model/settings/modules/privacy.dart + importa: + - lib/model/filters/filters.dart + - lib/model/settings/modules/search.dart + importato da: + - lib/model/settings/settings.dart + +lib/model/settings/modules/screen_saver.dart + importa: + - lib/model/filters/filters.dart + - lib/model/settings/defaults.dart + importato da: + - lib/model/settings/settings.dart + +lib/model/settings/modules/search.dart + importa: + - lib/model/filters/filters.dart + - lib/model/settings/defaults.dart + importato da: + - lib/model/settings/settings.dart + - lib/model/settings/modules/privacy.dart + +lib/model/settings/modules/slideshow.dart + importa: + - lib/model/settings/defaults.dart + importato da: + - lib/model/settings/settings.dart + +lib/model/settings/modules/viewer.dart + importa: + - lib/model/settings/defaults.dart + - lib/model/settings/enums/local_cast_source_mode.dart + importato da: + - lib/model/settings/settings.dart + +lib/model/settings/modules/widget.dart + importa: + - lib/model/filters/filters.dart + - lib/model/settings/defaults.dart + importato da: + - lib/model/settings/settings.dart + +lib/model/settings/settings.dart + importa: + - lib/app_flavor.dart + - lib/model/device.dart + - lib/model/dynamic_albums.dart + - lib/model/filters/favourite.dart + - lib/model/filters/mime.dart + - lib/model/grouping/common.dart + - lib/model/settings/defaults.dart + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/modules/app.dart + - lib/model/settings/modules/collection.dart + - lib/model/settings/modules/debug.dart + - lib/model/settings/modules/display.dart + - lib/model/settings/modules/filter_grids.dart + - lib/model/settings/modules/info.dart + - lib/model/settings/modules/navigation.dart + - lib/model/settings/modules/privacy.dart + - lib/model/settings/modules/screen_saver.dart + - lib/model/settings/modules/search.dart + - lib/model/settings/modules/slideshow.dart + - lib/model/settings/modules/viewer.dart + - lib/model/settings/modules/widget.dart + - lib/ref/bursts.dart + - lib/services/accessibility_service.dart + - lib/services/common/services.dart + - lib/widgets/common/search/page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + importato da: + - lib/widget_common.dart + - lib/theme/colors.dart + - lib/model/filters/placeholder.dart + - lib/model/filters/coordinate.dart + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/entry/extensions/props.dart + - lib/model/source/album.dart + - lib/model/source/collection_lens.dart + - lib/model/source/media_store_source.dart + - lib/model/source/collection_source.dart + - lib/model/source/location/location.dart + - lib/services/analysis_service.dart + - lib/widgets/welcome_page.dart + - lib/widgets/wallpaper_page.dart + - lib/widgets/aves_app.dart + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/settings_page.dart + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/settings/screen_saver_settings_page.dart + - lib/widgets/settings/video/control_actions.dart + - lib/widgets/settings/video/subtitle_theme.dart + - lib/widgets/settings/video/subtitle_sample.dart + - lib/widgets/settings/video/video.dart + - lib/widgets/settings/video/playback.dart + - lib/widgets/settings/video/controls.dart + - lib/widgets/settings/video/video_settings_page.dart + - lib/widgets/settings/privacy/hidden_items_page.dart + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/settings/navigation/drawer_tab_fixed.dart + - lib/widgets/settings/navigation/confirmation_dialogs.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/settings/navigation/navigation.dart + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/settings/navigation/drawer_tab_albums.dart + - lib/widgets/settings/language/locale_tile.dart + - lib/widgets/settings/language/locale_selection_page.dart + - lib/widgets/settings/language/language.dart + - lib/widgets/settings/app_export/items.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/common/quick_actions/quick_actions.dart + - lib/widgets/settings/common/quick_actions/available_actions.dart + - lib/widgets/settings/viewer/slideshow.dart + - lib/widgets/settings/viewer/viewer_actions_editor.dart + - lib/widgets/settings/viewer/viewer.dart + - lib/widgets/settings/viewer/overlay.dart + - lib/widgets/settings/display/display.dart + - lib/widgets/settings/accessibility/accessibility.dart + - lib/widgets/settings/accessibility/time_to_take_action.dart + - lib/widgets/settings/thumbnails/collection_actions_editor_page.dart + - lib/widgets/settings/thumbnails/thumbnails.dart + - lib/widgets/settings/thumbnails/overlay.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/filter_bar.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/collection/grid/list_details.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/nav_bar/nav_bar.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/about/title.dart + - lib/widgets/about/policy_page.dart + - lib/widgets/about/about_page.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/common/tile_extent_controller.dart + - lib/widgets/common/expandable_filter_row.dart + - lib/widgets/common/thumbnail/image.dart + - lib/widgets/common/identity/aves_app_bar.dart + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/common/identity/aves_donut.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/identity/aves_logo.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/providers/durations_provider.dart + - lib/widgets/common/providers/map_theme_provider.dart + - lib/widgets/common/basic/markdown_container.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/tv_edge_focus.dart + - lib/widgets/common/basic/list_tiles/color.dart + - lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart + - lib/widgets/common/app_bar/crumb_line.dart + - lib/widgets/common/search/page.dart + - lib/widgets/common/search/route.dart + - lib/widgets/common/search/delegate.dart + - lib/widgets/common/map/attribution.dart + - lib/widgets/common/map/decorator.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/common/map/buttons/coordinate_filter.dart + - lib/widgets/common/map/buttons/panel.dart + - lib/widgets/common/map/leaflet/map.dart + - lib/widgets/common/action_controls/quick_choosers/move_button.dart + - lib/widgets/common/action_controls/quick_choosers/tag_button.dart + - lib/widgets/common/action_controls/quick_choosers/common/button.dart + - lib/widgets/common/action_controls/togglers/favourite.dart + - lib/widgets/common/behaviour/pop/double_back.dart + - lib/widgets/common/behaviour/pop/tv_navigation.dart + - lib/widgets/common/grid/selector.dart + - lib/widgets/common/grid/header.dart + - lib/widgets/common/grid/theme.dart + - lib/widgets/viewer/screen_saver_page.dart + - lib/widgets/viewer/panorama_page.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/slideshow_page.dart + - lib/widgets/viewer/entry_horizontal_pager.dart + - lib/widgets/viewer/video/db_playback_state_handler.dart + - lib/widgets/viewer/video/conductor.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/info/metadata/metadata_section.dart + - lib/widgets/viewer/action/single_entry_editor.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/visual/controller_mixin.dart + - lib/widgets/viewer/visual/vector.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/visual/raster.dart + - lib/widgets/viewer/visual/video/subtitle/subtitle.dart + - lib/widgets/viewer/view/histogram.dart + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/slideshow_buttons.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/viewer/overlay/video/progress_bar.dart + - lib/widgets/viewer/overlay/video/controls.dart + - lib/widgets/viewer/overlay/details/details.dart + - lib/widgets/viewer/overlay/details/location.dart + - lib/widgets/viewer/debug/metadata.dart + - lib/widgets/map/address_row.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/dialogs/tile_view_dialog.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + - lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart + - lib/widgets/dialogs/map/style_selection_dialog.dart + - lib/widgets/dialogs/map/style_editor_dialog.dart + - lib/widgets/dialogs/pick_dialogs/app_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/states_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/filter_tile.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/place_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/filter_grids/common/action_delegates/country_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/filter_grids/common/action_delegates/state_set.dart + - lib/widgets/stats/top_page.dart + - lib/widgets/stats/filter_table.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/editor/entry_editor_page.dart + - lib/widgets/debug/app_debug_page.dart + - lib/widgets/debug/general.dart + - lib/widgets/debug/settings.dart + +lib/model/settings/store_shared_pref.dart + importa: + importato da: + - lib/services/common/services.dart + +lib/model/source/album.dart + importa: + - lib/model/entry/entry.dart + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/model/vaults/vaults.dart + - lib/services/common/services.dart + - lib/utils/android_file_utils.dart + - lib/utils/collection_utils.dart + - lib/view/view.dart + importato da: + - lib/model/grouping/common.dart + - lib/model/source/collection_source.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + +lib/model/source/analysis_controller.dart + importa: + importato da: + - lib/model/source/tag.dart + - lib/model/source/media_store_source.dart + - lib/model/source/collection_source.dart + - lib/model/source/location/location.dart + - lib/services/analysis_service.dart + - lib/widgets/collection/entry_set_action_delegate.dart + +lib/model/source/collection_lens.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/entry/sort.dart + - lib/model/favourites.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/favourite.dart + - lib/model/filters/filters.dart + - lib/model/filters/query.dart + - lib/model/filters/rating.dart + - lib/model/filters/trash.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/model/source/events.dart + - lib/model/source/location/location.dart + - lib/model/source/section_keys.dart + - lib/model/source/tag.dart + - lib/ref/mime_types.dart + - lib/utils/collection_utils.dart + - lib/remote/collection_source_remote_ext.dart + - lib/remote/remote_origin.dart + importato da: + - lib/widget_common.dart + - lib/widgets/aves_app.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/query_bar.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/draggable_thumb_label.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/collection/app_bar/cast/cast_icon_button.dart + - lib/widgets/collection/app_bar/cast/cast_bar_inline.dart + - lib/widgets/collection/grid/tile.dart + - lib/widgets/collection/grid/section_layout.dart + - lib/widgets/collection/grid/headers/any.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/nav_bar/nav_bar.dart + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/entry_editor.dart + - lib/widgets/common/map/map_action_delegate.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/common/behaviour/pop/tv_navigation.dart + - lib/widgets/viewer/hero.dart + - lib/widgets/viewer/entry_viewer_page.dart + - lib/widgets/viewer/providers.dart + - lib/widgets/viewer/screen_saver_page.dart + - lib/widgets/viewer/entry_viewer_page_dlna.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/slideshow_page.dart + - lib/widgets/viewer/entry_horizontal_pager.dart + - lib/widgets/viewer/video/conductor.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/map/scroller.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/add_shortcut_dialog.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/stats/stats_page.dart + +lib/model/source/collection_source.dart + importa: + - lib/model/covers.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/catalog.dart + - lib/model/entry/extensions/keys.dart + - lib/model/entry/extensions/location.dart + - lib/model/entry/sort.dart + - lib/model/favourites.dart + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/tag_group.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/filters/trash.dart + - lib/model/grouping/common.dart + - lib/model/grouping/convert.dart + - lib/model/metadata/trash.dart + - lib/model/settings/settings.dart + - lib/model/source/album.dart + - lib/model/source/analysis_controller.dart + - lib/model/source/events.dart + - lib/model/source/location/country.dart + - lib/model/source/location/location.dart + - lib/model/source/location/place.dart + - lib/model/source/location/state.dart + - lib/model/source/tag.dart + - lib/model/source/trash.dart + - lib/model/vaults/vaults.dart + - lib/services/analysis_service.dart + - lib/services/common/image_op_events.dart + - lib/services/common/services.dart + - lib/widgets/aves_app.dart + - lib/remote/remote_origin.dart + importato da: + - lib/model/favourites.dart + - lib/model/covers.dart + - lib/model/settings/modules/app.dart + - lib/model/grouping/common.dart + - lib/model/source/album.dart + - lib/model/source/trash.dart + - lib/model/source/tag.dart + - lib/model/source/collection_lens.dart + - lib/model/source/media_store_source.dart + - lib/model/source/location/country.dart + - lib/model/source/location/place.dart + - lib/model/source/location/state.dart + - lib/model/vaults/vaults.dart + - lib/services/analysis_service.dart + - lib/widgets/aves_app.dart + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/settings/app_export/items.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/remote_status_button.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/draggable_thumb_label.dart + - lib/widgets/collection/loading.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/collection/app_bar/remote/remote_controls_sheet.dart + - lib/widgets/collection/app_bar/remote/remote_bar.dart + - lib/widgets/collection/grid/headers/album.dart + - lib/widgets/collection/grid/headers/any.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/drawer/collection_nav_tile.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/app_bar/app_bar_subtitle.dart + - lib/widgets/common/action_controls/quick_choosers/album_chooser.dart + - lib/widgets/common/action_controls/quick_choosers/move_button.dart + - lib/widgets/common/action_controls/quick_choosers/tag_button.dart + - lib/widgets/viewer/screen_saver_page.dart + - lib/widgets/viewer/slideshow_page.dart + - lib/widgets/viewer/action/single_entry_editor.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/debug/db.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/states_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/list_details.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/draggable_thumb_label.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/debug/app_debug_page.dart + - lib/widgets/debug/general.dart + - lib/remote/remote_settings_page.dart + - lib/remote/remote_settings_dialog.dart + - lib/remote/remote_sync_engine.dart + - lib/remote/collection_source_remote_ext.dart + - lib/remote/remote_controller.dart + +lib/model/source/events.dart + importa: + - lib/model/entry/entry.dart + importato da: + - lib/model/grouping/common.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/widgets/collection/loading.dart + - lib/widgets/common/app_bar/app_bar_subtitle.dart + - lib/remote/collection_source_remote_ext.dart + - lib/remote/remote_controller.dart + +lib/model/source/location/country.dart + importa: + - lib/model/entry/entry.dart + - lib/model/filters/covered/location.dart + - lib/model/source/collection_source.dart + - lib/utils/collection_utils.dart + importato da: + - lib/model/source/collection_source.dart + - lib/model/source/location/location.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + +lib/model/source/location/location.dart + importa: + - lib/geo/countries.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/location.dart + - lib/model/filters/covered/location.dart + - lib/model/metadata/address.dart + - lib/model/settings/settings.dart + - lib/model/source/analysis_controller.dart + - lib/model/source/location/country.dart + - lib/model/source/location/place.dart + - lib/model/source/location/state.dart + - lib/services/common/services.dart + importato da: + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + +lib/model/source/location/place.dart + importa: + - lib/model/entry/entry.dart + - lib/model/filters/covered/location.dart + - lib/model/source/collection_source.dart + - lib/utils/collection_utils.dart + importato da: + - lib/model/source/collection_source.dart + - lib/model/source/location/location.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/states_page.dart + +lib/model/source/location/state.dart + importa: + - lib/model/entry/entry.dart + - lib/model/filters/covered/location.dart + - lib/model/source/collection_source.dart + - lib/utils/collection_utils.dart + importato da: + - lib/model/source/collection_source.dart + - lib/model/source/location/location.dart + +lib/model/source/media_store_source.dart + importa: + - lib/model/covers.dart + - lib/model/dynamic_albums.dart + - lib/model/entry/entry.dart + - lib/model/entry/origins.dart + - lib/model/favourites.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/grouping/common.dart + - lib/model/settings/settings.dart + - lib/model/source/analysis_controller.dart + - lib/model/source/collection_source.dart + - lib/model/vaults/vaults.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/utils/android_file_utils.dart + - lib/utils/debouncer.dart + importato da: + - lib/widget_common.dart + - lib/services/analysis_service.dart + - lib/widgets/aves_app.dart + +lib/model/source/section_keys.dart + importa: + importato da: + - lib/model/source/collection_lens.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/grid/section_layout.dart + - lib/widgets/collection/grid/headers/album.dart + - lib/widgets/collection/grid/headers/any.dart + - lib/widgets/collection/grid/headers/rating.dart + - lib/widgets/collection/grid/headers/date.dart + - lib/widgets/common/grid/header.dart + - lib/widgets/common/grid/sections/provider.dart + - lib/widgets/common/grid/sections/section_layout.dart + - lib/widgets/common/grid/sections/list_layout.dart + - lib/widgets/common/grid/sections/section_layout_builder.dart + - lib/widgets/common/grid/sections/mosaic/list_layout.dart + - lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart + - lib/widgets/common/grid/sections/fixed/list_layout.dart + - lib/widgets/common/grid/sections/fixed/section_layout_builder.dart + - lib/widgets/filter_grids/common/section_layout.dart + - lib/widgets/filter_grids/common/section_keys.dart + +lib/model/source/tag.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/catalog.dart + - lib/model/filters/container/tag_group.dart + - lib/model/filters/covered/tag.dart + - lib/model/metadata/catalog.dart + - lib/model/source/analysis_controller.dart + - lib/model/source/collection_source.dart + - lib/services/common/services.dart + - lib/utils/collection_utils.dart + importato da: + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + +lib/model/source/trash.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/props.dart + - lib/model/metadata/trash.dart + - lib/model/source/collection_source.dart + - lib/services/common/image_op_events.dart + - lib/services/common/services.dart + - lib/utils/android_file_utils.dart + importato da: + - lib/model/entry/extensions/props.dart + - lib/model/source/collection_source.dart + +lib/model/vaults/details.dart + importa: + - lib/utils/android_file_utils.dart + - lib/utils/collection_utils.dart + importato da: + - lib/model/vaults/vaults.dart + - lib/model/db/db_sqflite.dart + - lib/model/db/db.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/debug/database.dart + +lib/model/vaults/vaults.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/origins.dart + - lib/model/source/collection_source.dart + - lib/model/vaults/details.dart + - lib/services/common/services.dart + importato da: + - lib/utils/android_file_utils.dart + - lib/model/covers.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/settings/modules/app.dart + - lib/model/source/album.dart + - lib/model/source/media_store_source.dart + - lib/model/source/collection_source.dart + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/identity/aves_icons.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/filter_tile.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/debug/database.dart + +lib/model/viewer/video_playback.dart + importa: + importato da: + - lib/model/db/db_sqflite.dart + - lib/model/db/db.dart + - lib/widgets/viewer/video/db_playback_state_handler.dart + - lib/widgets/viewer/debug/db.dart + - lib/widgets/debug/database.dart + +lib/model/viewer/view_state.dart + importa: + importato da: + - lib/widgets/viewer/visual/vector.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/visual/raster.dart + - lib/widgets/viewer/visual/video/subtitle/subtitle.dart + - lib/widgets/viewer/view/conductor.dart + - lib/widgets/viewer/view/controller.dart + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/viewer/overlay/minimap.dart + - lib/widgets/editor/image.dart + - lib/widgets/editor/entry_editor_page.dart + - lib/widgets/editor/transform/cropper.dart + +lib/ref/brand_colors.dart + importa: + importato da: + - lib/widgets/about/licenses.dart + - lib/widgets/about/data_usage.dart + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + - lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart + +lib/ref/bursts.dart + importa: + importato da: + - lib/model/settings/settings.dart + - lib/model/entry/extensions/multipage.dart + - lib/widgets/settings/thumbnails/thumbnails.dart + +lib/ref/languages.dart + importa: + importato da: + - lib/model/media/video/metadata.dart + - lib/widgets/dialogs/video_stream_selection_dialog.dart + +lib/ref/locales.dart + importa: + importato da: + - lib/utils/xmp_utils.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/model/media/video/metadata.dart + - lib/widgets/aves_app.dart + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/home/home_error.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/about/app_ref.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/common/basic/time_shift_selector.dart + - lib/widgets/viewer/overlay/video/progress_bar.dart + - lib/widgets/dialogs/duration_dialog.dart + - lib/widgets/stats/top_page.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/debug/leaking.dart + - lib/widgets/debug/cache.dart + - lib/widgets/debug/database.dart + - lib/widgets/debug/os_storage.dart + +lib/ref/metadata/exif.dart + importa: + importato da: + - lib/model/entry/extensions/metadata_edition.dart + - lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart + - lib/widgets/viewer/info/metadata/xmp_ns/exif.dart + +lib/ref/metadata/geotiff.dart + importa: + importato da: + - lib/model/media/geotiff.dart + - lib/widgets/viewer/info/metadata/geotiff.dart + +lib/ref/metadata/iptc.dart + importa: + importato da: + - lib/model/entry/extensions/metadata_edition.dart + +lib/ref/metadata/xmp.dart + importa: + importato da: + - lib/utils/xmp_utils.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/view/src/xmp.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + - lib/widgets/viewer/info/metadata/xmp_ns/google.dart + - lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart + - lib/widgets/viewer/info/metadata/xmp_ns/crs.dart + - lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart + - lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart + - lib/widgets/viewer/info/metadata/xmp_ns/misc.dart + - lib/widgets/viewer/info/metadata/xmp_ns/exif.dart + +lib/ref/mime_types.dart + importa: + importato da: + - lib/image_providers/region_provider.dart + - lib/utils/mime_utils.dart + - lib/model/multipage.dart + - lib/model/filters/mime.dart + - lib/model/settings/defaults.dart + - lib/model/app/support.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/model/entry/extensions/catalog.dart + - lib/model/entry/extensions/props.dart + - lib/model/entry/extensions/info.dart + - lib/model/source/collection_lens.dart + - lib/model/media/video/metadata.dart + - lib/services/android_debug_service.dart + - lib/services/media/media_fetch_service.dart + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/home/home_error.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/entry_editor.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart + - lib/widgets/viewer/info/embedded/embedded_data_opener.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/debug/metadata.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + - lib/widgets/dialogs/export_collection_stats_page.dart + - lib/widgets/stats/top_page.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/debug/media_store_scan_dialog.dart + +lib/ref/mp4.dart + importa: + importato da: + - lib/model/media/video/metadata.dart + +lib/ref/poi.dart + importa: + importato da: + - lib/widgets/settings/language/language.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + +lib/ref/unicode.dart + importa: + importato da: + - lib/geo/states.dart + - lib/utils/emoji_utils.dart + - lib/theme/text.dart + - lib/model/filters/rating.dart + - lib/model/entry/extensions/props.dart + - lib/view/src/editor/enums.dart + - lib/widgets/viewer/visual/video/subtitle/ass_parser.dart + +lib/ref/upnp.dart + importa: + importato da: + - lib/widgets/cast/dlna.dart + +lib/remote/auth_client.dart + importa: + importato da: + - lib/remote/remote_controller.dart + +lib/remote/collection_source_remote_ext.dart + importa: + - lib/model/entry/entry.dart + - lib/model/source/collection_source.dart + - lib/model/source/events.dart + - lib/services/common/services.dart + - lib/remote/remote_sync_bus.dart + importato da: + - lib/model/source/collection_lens.dart + - lib/remote/remote_settings_page.dart + - lib/remote/remote_settings_dialog.dart + - lib/remote/remote_sync_engine.dart + - lib/remote/remote_controller.dart + +lib/remote/remote_client.dart + importa: + importato da: + - lib/remote/remote_controller.dart + +lib/remote/remote_controller.dart + importa: + - lib/model/entry/entry.dart + - lib/model/source/collection_source.dart + - lib/model/source/events.dart + - lib/remote/remote_settings.dart + - lib/remote/remote_sync_bus.dart + - lib/remote/remote_repository.dart + - lib/services/common/services.dart + - lib/remote/remote_client.dart + - lib/remote/auth_client.dart + - lib/remote/collection_source_remote_ext.dart + importato da: + - lib/widgets/aves_app.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/remote_status_button.dart + - lib/remote/remote_settings_page.dart + - lib/remote/remote_settings_dialog.dart + +lib/remote/remote_db_uris.dart + importa: + importato da: + +lib/remote/remote_gallery_bridge.dart + importa: + - lib/services/common/services.dart + - lib/model/entry/entry.dart + importato da: + +lib/remote/remote_http.dart + importa: + importato da: + - lib/model/entry/extensions/images.dart + - lib/widgets/viewer/video/remote_video_factory.dart + - lib/widgets/viewer/visual/raster.dart + - lib/remote/remote_image_tile.dart + - lib/remote/remote_settings_dialog.dart + +lib/remote/remote_http_api.dart + importa: + importato da: + +lib/remote/remote_image_tile.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/props.dart + - lib/remote/remote_http.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/grid/tile.dart + - lib/widgets/common/thumbnail/scroller.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + +lib/remote/remote_models.dart + importa: + importato da: + - lib/remote/run_remote_sync.dart + +lib/remote/remote_origin.dart + importa: + importato da: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/remote_flags.dart + - lib/model/entry/extensions/images.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/model/db/db_sqflite.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/grid/tile.dart + - lib/widgets/common/thumbnail/scroller.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/viewer/video/conductor.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/visual/raster.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + +lib/remote/remote_repository.dart + importa: + importato da: + - lib/remote/run_remote_sync.dart + - lib/remote/remote_controller.dart + +lib/remote/remote_settings.dart + importa: + importato da: + - lib/widgets/home/home_page.dart + - lib/widgets/cast/google_cast_controller.dart + - lib/remote/remote_settings_dialog.dart + - lib/remote/remote_controller.dart + +lib/remote/remote_settings_dialog.dart + importa: + - lib/model/source/collection_source.dart + - lib/remote/collection_source_remote_ext.dart + - lib/remote/remote_controller.dart + - lib/remote/remote_settings.dart + - lib/remote/remote_http.dart + - lib/remote/remote_sync_bus.dart + importato da: + - lib/widgets/collection/remote_status_button.dart + +lib/remote/remote_settings_page.dart + importa: + - lib/model/source/collection_source.dart + - lib/remote/collection_source_remote_ext.dart + - lib/remote/remote_controller.dart + - lib/remote/remote_sync_bus.dart + importato da: + +lib/remote/remote_state_store.dart + importa: + importato da: + +lib/remote/remote_sync_bus.dart + importa: + importato da: + - lib/widgets/collection/remote_progress_banner.dart + - lib/widgets/collection/remote_status_icon.dart + - lib/widgets/collection/remote_status_button.dart + - lib/widgets/collection/loading.dart + - lib/remote/remote_settings_page.dart + - lib/remote/remote_settings_dialog.dart + - lib/remote/collection_source_remote_ext.dart + - lib/remote/remote_controller.dart + +lib/remote/remote_sync_engine.dart + importa: + - lib/model/source/collection_source.dart + - lib/remote/collection_source_remote_ext.dart + importato da: + +lib/remote/remote_test_page.dart + importa: + importato da: + +lib/remote/remote_view_helpers.dart + importa: + - lib/model/entry/entry.dart + importato da: + +lib/remote/remote_ws_client.dart + importa: + importato da: + +lib/remote/run_remote_sync.dart + importa: + - lib/services/common/services.dart + - lib/model/db/db.dart + - lib/remote/remote_repository.dart + - lib/remote/remote_models.dart + importato da: + +lib/remote/url_utils.dart + importa: + importato da: + +lib/services/accessibility_service.dart + importa: + - lib/services/common/channel.dart + - lib/services/common/services.dart + importato da: + - lib/model/settings/settings.dart + - lib/model/settings/enums/accessibility_timeout.dart + - lib/widgets/aves_app.dart + - lib/widgets/settings/accessibility/time_to_take_action.dart + +lib/services/analysis_service.dart + importa: + - lib/l10n/l10n.dart + - lib/model/device.dart + - lib/model/settings/settings.dart + - lib/model/source/analysis_controller.dart + - lib/model/source/collection_source.dart + - lib/model/source/media_store_source.dart + - lib/services/common/channel.dart + - lib/services/common/services.dart + - lib/utils/android_file_utils.dart + - lib/view/view.dart + importato da: + - lib/model/source/collection_source.dart + - lib/widgets/home/home_page.dart + - lib/widgets/debug/general.dart + +lib/services/android_debug_service.dart + importa: + - lib/model/entry/entry.dart + - lib/ref/mime_types.dart + - lib/services/common/channel.dart + - lib/services/common/services.dart + importato da: + - lib/widgets/viewer/debug/metadata.dart + - lib/widgets/debug/os_codecs.dart + - lib/widgets/debug/os_paths.dart + - lib/widgets/debug/report.dart + +lib/services/app_profile_service.dart + importa: + - lib/services/common/channel.dart + - lib/services/common/services.dart + importato da: + - lib/services/common/services.dart + +lib/services/app_service.dart + importa: + - lib/geo/uri.dart + - lib/image_providers/thumbnail_provider.dart + - lib/model/app_inventory.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/props.dart + - lib/model/filters/filters.dart + - lib/services/common/channel.dart + - lib/services/common/decoding.dart + - lib/services/common/services.dart + importato da: + - lib/services/intent_service.dart + - lib/services/common/services.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/collection_page.dart + +lib/services/cast/cast_backend_switcher.dart + importa: + - lib/widgets/cast/google_cast_controller.dart + - lib/widgets/cast/cast_controller.dart + importato da: + +lib/services/cast/cast_server.dart + importa: + importato da: + - lib/widgets/collection/app_bar/cast/cast_bar_inline.dart + - lib/widgets/cast/google_cast_controller.dart + - lib/widgets/cast/backends/dlna_cast_backend.dart + +lib/services/common/channel.dart + importa: + importato da: + - lib/widget_common.dart + - lib/services/wallpaper_service.dart + - lib/services/intent_service.dart + - lib/services/accessibility_service.dart + - lib/services/global_search.dart + - lib/services/geocoding_service.dart + - lib/services/security_service.dart + - lib/services/analysis_service.dart + - lib/services/app_profile_service.dart + - lib/services/app_service.dart + - lib/services/device_service.dart + - lib/services/android_debug_service.dart + - lib/services/widget_service.dart + - lib/services/window_service.dart + - lib/services/storage_service.dart + - lib/services/metadata/metadata_fetch_service.dart + - lib/services/metadata/metadata_edit_service.dart + - lib/services/media/media_fetch_service.dart + - lib/services/media/media_session_service.dart + - lib/services/media/media_edit_service.dart + - lib/services/media/media_store_service.dart + - lib/services/media/embedded_data_service.dart + +lib/services/common/custom_exception.dart + importa: + importato da: + - lib/services/metadata/metadata_fetch_service.dart + - lib/services/metadata/metadata_edit_service.dart + +lib/services/common/decoding.dart + importa: + importato da: + - lib/services/app_service.dart + - lib/services/media/media_fetch_service.dart + - lib/services/media/embedded_data_service.dart + +lib/services/common/image_op_events.dart + importa: + importato da: + - lib/model/source/trash.dart + - lib/model/source/collection_source.dart + - lib/services/media/media_edit_service.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + +lib/services/common/output_buffer.dart + importa: + importato da: + - lib/services/storage_service.dart + - lib/services/media/media_fetch_service.dart + +lib/services/common/service_policy.dart + importa: + importato da: + - lib/model/entry/extensions/location.dart + - lib/services/metadata/metadata_fetch_service.dart + - lib/services/media/media_fetch_service.dart + - lib/widgets/debug/general.dart + +lib/services/common/services.dart + importa: + - lib/model/availability.dart + - lib/model/db/db.dart + - lib/model/db/db_sqflite.dart + - lib/model/settings/store_shared_pref.dart + - lib/services/app_profile_service.dart + - lib/services/app_service.dart + - lib/services/device_service.dart + - lib/services/media/embedded_data_service.dart + - lib/services/media/media_edit_service.dart + - lib/services/media/media_fetch_service.dart + - lib/services/media/media_session_service.dart + - lib/services/media/media_store_service.dart + - lib/services/metadata/metadata_edit_service.dart + - lib/services/metadata/metadata_fetch_service.dart + - lib/services/security_service.dart + - lib/services/storage_service.dart + - lib/services/window_service.dart + importato da: + - lib/widget_common.dart + - lib/main_common.dart + - lib/image_providers/thumbnail_provider.dart + - lib/image_providers/app_icon_image_provider.dart + - lib/image_providers/full_image_provider.dart + - lib/image_providers/region_provider.dart + - lib/utils/android_file_utils.dart + - lib/model/favourites.dart + - lib/model/naming_pattern.dart + - lib/model/dynamic_albums.dart + - lib/model/availability.dart + - lib/model/device.dart + - lib/model/multipage.dart + - lib/model/app_inventory.dart + - lib/model/covers.dart + - lib/model/filters/path.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/settings/settings.dart + - lib/model/settings/enums/display_refresh_rate_mode.dart + - lib/model/settings/enums/screen_on.dart + - lib/model/entry/dirs.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/model/entry/extensions/catalog.dart + - lib/model/entry/extensions/props.dart + - lib/model/entry/extensions/info.dart + - lib/model/entry/extensions/location.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/grouping/common.dart + - lib/model/source/album.dart + - lib/model/source/trash.dart + - lib/model/source/tag.dart + - lib/model/source/media_store_source.dart + - lib/model/source/collection_source.dart + - lib/model/source/location/location.dart + - lib/model/vaults/vaults.dart + - lib/model/db/db_sqflite.dart + - lib/model/media/video/metadata.dart + - lib/services/wallpaper_service.dart + - lib/services/intent_service.dart + - lib/services/accessibility_service.dart + - lib/services/global_search.dart + - lib/services/security_service.dart + - lib/services/analysis_service.dart + - lib/services/app_profile_service.dart + - lib/services/app_service.dart + - lib/services/device_service.dart + - lib/services/android_debug_service.dart + - lib/services/widget_service.dart + - lib/services/window_service.dart + - lib/services/storage_service.dart + - lib/services/metadata/svg_metadata_service.dart + - lib/services/metadata/metadata_fetch_service.dart + - lib/services/metadata/metadata_edit_service.dart + - lib/services/media/media_fetch_service.dart + - lib/services/media/media_session_service.dart + - lib/services/media/media_edit_service.dart + - lib/services/media/media_store_service.dart + - lib/services/media/embedded_data_service.dart + - lib/widgets/wallpaper_page.dart + - lib/widgets/aves_app.dart + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/settings/privacy/access_grants_page.dart + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/settings/navigation/navigation.dart + - lib/widgets/settings/viewer/viewer.dart + - lib/widgets/home/home_error.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/explorer/crumb_line.dart + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/about/data_usage.dart + - lib/widgets/common/thumbnail/image.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/action_mixins/size_aware.dart + - lib/widgets/common/action_mixins/entry_editor.dart + - lib/widgets/common/basic/derived_material_localization.dart + - lib/widgets/common/map/map_action_delegate.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/common/map/leaflet/tile_layers.dart + - lib/widgets/common/behaviour/route_tracker.dart + - lib/widgets/common/behaviour/pop/double_back.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/video/db_playback_state_handler.dart + - lib/widgets/viewer/video/conductor.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/info/metadata/metadata_thumbnail.dart + - lib/widgets/viewer/info/embedded/embedded_data_opener.dart + - lib/widgets/viewer/controls/controller.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/action/single_entry_editor.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/action/printer.dart + - lib/widgets/viewer/visual/controller_mixin.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/viewer/overlay/panorama.dart + - lib/widgets/viewer/overlay/details/details.dart + - lib/widgets/viewer/debug/db.dart + - lib/widgets/map/address_row.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart + - lib/widgets/dialogs/filter_editors/rename_stored_album_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/rename_entry_dialog.dart + - lib/widgets/dialogs/map/style_selection_dialog.dart + - lib/widgets/dialogs/pick_dialogs/app_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/group_crumb_line.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/filter_grids/common/action_delegates/country_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/stats/top_page.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/debug/cache.dart + - lib/widgets/debug/database.dart + - lib/widgets/debug/media_store_scan_dialog.dart + - lib/widgets/debug/os_storage.dart + - lib/widgets/debug/capabilities.dart + - lib/widgets/debug/os_apps.dart + - lib/widgets/debug/report.dart + - lib/remote/run_remote_sync.dart + - lib/remote/remote_gallery_bridge.dart + - lib/remote/collection_source_remote_ext.dart + - lib/remote/remote_controller.dart + +lib/services/device_service.dart + importa: + - lib/services/common/channel.dart + - lib/services/common/services.dart + importato da: + - lib/services/common/services.dart + +lib/services/geocoding_service.dart + importa: + - lib/services/common/channel.dart + importato da: + - lib/model/entry/extensions/location.dart + - lib/model/metadata/catalog.dart + - lib/widgets/viewer/debug/metadata.dart + - lib/widgets/map/address_row.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + +lib/services/global_search.dart + importa: + - lib/model/entry/sort.dart + - lib/services/common/channel.dart + - lib/services/common/services.dart + - lib/theme/format.dart + importato da: + - lib/widgets/home/home_page.dart + +lib/services/intent_service.dart + importa: + - lib/model/filters/filters.dart + - lib/services/app_service.dart + - lib/services/common/channel.dart + - lib/services/common/services.dart + importato da: + - lib/widgets/settings/common/collection_tile.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/grid/tile.dart + +lib/services/media/embedded_data_service.dart + importa: + - lib/model/entry/entry.dart + - lib/services/common/channel.dart + - lib/services/common/decoding.dart + - lib/services/common/services.dart + - lib/theme/text.dart + importato da: + - lib/services/common/services.dart + +lib/services/media/enums.dart + importa: + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/services/media/media_edit_service.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + +lib/services/media/media_edit_service.dart + importa: + - lib/model/entry/entry.dart + - lib/services/common/channel.dart + - lib/services/common/image_op_events.dart + - lib/services/common/services.dart + - lib/services/media/enums.dart + importato da: + - lib/services/common/services.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + +lib/services/media/media_fetch_service.dart + importa: + - lib/image_providers/region_provider.dart + - lib/image_providers/thumbnail_provider.dart + - lib/model/app/support.dart + - lib/model/entry/entry.dart + - lib/ref/mime_types.dart + - lib/services/common/channel.dart + - lib/services/common/decoding.dart + - lib/services/common/output_buffer.dart + - lib/services/common/service_policy.dart + - lib/services/common/services.dart + importato da: + - lib/image_providers/full_image_provider.dart + - lib/services/common/services.dart + +lib/services/media/media_session_service.dart + importa: + - lib/model/entry/entry.dart + - lib/services/common/channel.dart + - lib/services/common/services.dart + importato da: + - lib/services/common/services.dart + - lib/widgets/viewer/visual/entry_page_view.dart + +lib/services/media/media_store_service.dart + importa: + - lib/model/entry/entry.dart + - lib/services/common/channel.dart + - lib/services/common/services.dart + importato da: + - lib/services/common/services.dart + +lib/services/metadata/metadata_edit_service.dart + importa: + - lib/convert/convert.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/props.dart + - lib/model/metadata/date_modifier.dart + - lib/services/common/channel.dart + - lib/services/common/custom_exception.dart + - lib/services/common/services.dart + importato da: + - lib/services/common/services.dart + +lib/services/metadata/metadata_fetch_service.dart + importa: + - lib/convert/convert.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/media/geotiff.dart + - lib/model/media/panorama.dart + - lib/model/metadata/catalog.dart + - lib/model/metadata/overlay.dart + - lib/model/multipage.dart + - lib/services/common/channel.dart + - lib/services/common/custom_exception.dart + - lib/services/common/service_policy.dart + - lib/services/common/services.dart + - lib/services/metadata/xmp.dart + - lib/utils/time_utils.dart + importato da: + - lib/services/common/services.dart + +lib/services/metadata/svg_metadata_service.dart + importa: + - lib/model/entry/entry.dart + - lib/services/common/services.dart + - lib/utils/string_utils.dart + importato da: + - lib/model/entry/extensions/catalog.dart + - lib/model/entry/extensions/info.dart + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + +lib/services/metadata/xmp.dart + importa: + importato da: + - lib/model/entry/extensions/metadata_edition.dart + - lib/services/metadata/metadata_fetch_service.dart + +lib/services/security_service.dart + importa: + - lib/services/common/channel.dart + - lib/services/common/services.dart + importato da: + - lib/services/common/services.dart + +lib/services/storage_service.dart + importa: + - lib/model/covers.dart + - lib/services/common/channel.dart + - lib/services/common/output_buffer.dart + - lib/services/common/services.dart + importato da: + - lib/services/common/services.dart + +lib/services/wallpaper_service.dart + importa: + - lib/services/common/channel.dart + - lib/services/common/services.dart + importato da: + - lib/widgets/viewer/overlay/wallpaper_buttons.dart + +lib/services/widget_service.dart + importa: + - lib/services/common/channel.dart + - lib/services/common/services.dart + importato da: + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/home/home_page.dart + +lib/services/window_service.dart + importa: + - lib/services/common/channel.dart + - lib/services/common/services.dart + importato da: + - lib/services/common/services.dart + +lib/theme/colors.dart + importa: + - lib/image_providers/app_icon_image_provider.dart + - lib/model/covers.dart + - lib/model/settings/settings.dart + - lib/widgets/common/extensions/theme.dart + importato da: + - lib/model/filters/type.dart + - lib/model/filters/favourite.dart + - lib/model/filters/filters.dart + - lib/model/filters/query.dart + - lib/model/filters/mime.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/entry/extensions/info.dart + - lib/view/src/actions/entry.dart + - lib/widgets/aves_app.dart + - lib/widgets/home_widget.dart + - lib/widgets/settings/video/subtitle_sample.dart + - lib/widgets/settings/video/video.dart + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/settings/navigation/navigation.dart + - lib/widgets/settings/language/language.dart + - lib/widgets/settings/common/switch_icon.dart + - lib/widgets/settings/viewer/viewer.dart + - lib/widgets/settings/display/display.dart + - lib/widgets/settings/accessibility/accessibility.dart + - lib/widgets/settings/thumbnails/thumbnails.dart + - lib/widgets/navigation/drawer/tile.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/about/licenses.dart + - lib/widgets/about/data_usage.dart + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/common/identity/aves_donut.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_controls/quick_choosers/rate_chooser.dart + - lib/widgets/common/action_controls/togglers/favourite.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + - lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart + - lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/stats/mime_donut.dart + +lib/theme/durations.dart + importa: + importato da: + - lib/model/settings/enums/accessibility_timeout.dart + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/source/media_store_source.dart + - lib/widgets/welcome_page.dart + - lib/widgets/wallpaper_page.dart + - lib/widgets/settings/settings_page.dart + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/settings/language/locale_tile.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/common/switch_icon.dart + - lib/widgets/settings/common/tile_leading.dart + - lib/widgets/settings/common/quick_actions/action_panel.dart + - lib/widgets/settings/common/quick_actions/editor_page.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/filter_bar.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/about/data_usage.dart + - lib/widgets/common/expandable_filter_row.dart + - lib/widgets/common/thumbnail/scroller.dart + - lib/widgets/common/thumbnail/overlay.dart + - lib/widgets/common/identity/aves_app_bar.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/common/identity/aves_caption.dart + - lib/widgets/common/fx/sweeper.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/providers/durations_provider.dart + - lib/widgets/common/basic/query_bar.dart + - lib/widgets/common/basic/wheel.dart + - lib/widgets/common/basic/popup/expansion_panel.dart + - lib/widgets/common/app_bar/app_bar_subtitle.dart + - lib/widgets/common/search/page.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/common/map/buttons/coordinate_filter.dart + - lib/widgets/common/map/buttons/panel.dart + - lib/widgets/common/map/leaflet/map.dart + - lib/widgets/common/action_controls/quick_choosers/common/button.dart + - lib/widgets/common/action_controls/quick_choosers/common/menu.dart + - lib/widgets/common/action_controls/togglers/play.dart + - lib/widgets/common/behaviour/pop/double_back.dart + - lib/widgets/common/grid/header.dart + - lib/widgets/common/grid/overlay.dart + - lib/widgets/common/grid/item_tracker.dart + - lib/widgets/common/grid/sections/section_layout_builder.dart + - lib/widgets/common/grid/sections/mosaic/scale_overlay.dart + - lib/widgets/common/grid/sections/mosaic/scale_grid.dart + - lib/widgets/common/grid/sections/fixed/scale_overlay.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/info/color_section.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/info/metadata/xmp_card.dart + - lib/widgets/viewer/info/metadata/metadata_section.dart + - lib/widgets/viewer/controls/controller.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/visual/controller_mixin.dart + - lib/widgets/viewer/visual/video/cover.dart + - lib/widgets/viewer/overlay/selection_button.dart + - lib/widgets/viewer/overlay/details/details.dart + - lib/widgets/map/scroller.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + - lib/widgets/dialogs/tile_view_dialog.dart + - lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + - lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart + - lib/widgets/dialogs/selection_dialogs/common.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/stats/date/histogram.dart + - lib/widgets/editor/image.dart + - lib/widgets/editor/control_panel.dart + - lib/widgets/editor/transform/cropper.dart + - lib/widgets/editor/transform/control_panel.dart + +lib/theme/format.dart + importa: + - lib/theme/text.dart + importato da: + - lib/model/filters/date.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/info.dart + - lib/model/media/video/metadata.dart + - lib/services/global_search.dart + - lib/widgets/collection/grid/list_details.dart + - lib/widgets/collection/grid/list_details_theme.dart + - lib/widgets/common/grid/draggable_thumb_label.dart + - lib/widgets/viewer/video/db_playback_state_handler.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/overlay/video/progress_bar.dart + - lib/widgets/viewer/overlay/details/date.dart + - lib/widgets/map/date_row.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + - lib/widgets/filter_grids/common/list_details.dart + - lib/widgets/filter_grids/common/list_details_theme.dart + - lib/widgets/stats/stats_page.dart + +lib/theme/icons.dart + importa: + importato da: + - lib/model/filters/type.dart + - lib/model/filters/favourite.dart + - lib/model/filters/missing.dart + - lib/model/filters/placeholder.dart + - lib/model/filters/trash.dart + - lib/model/filters/recent.dart + - lib/model/filters/query.dart + - lib/model/filters/rating.dart + - lib/model/filters/coordinate.dart + - lib/model/filters/weekday.dart + - lib/model/filters/mime.dart + - lib/model/filters/aspect_ratio.dart + - lib/model/filters/date.dart + - lib/model/filters/path.dart + - lib/model/filters/container/group_base.dart + - lib/model/filters/container/set_or.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/container/set_and.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/covered/stored_album.dart + - lib/view/src/settings/thumbnail_overlay_tag_icon.dart + - lib/view/src/settings/thumbnail_overlay_location_icon.dart + - lib/view/src/source/group.dart + - lib/view/src/source/sort.dart + - lib/view/src/source/layout.dart + - lib/view/src/actions/explorer.dart + - lib/view/src/actions/map_cluster.dart + - lib/view/src/actions/entry_set.dart + - lib/view/src/actions/map.dart + - lib/view/src/actions/slideshow.dart + - lib/view/src/actions/chip.dart + - lib/view/src/actions/chip_set.dart + - lib/view/src/actions/share.dart + - lib/view/src/actions/entry.dart + - lib/view/src/metadata/convert_action.dart + - lib/view/src/editor/enums.dart + - lib/widgets/welcome_page.dart + - lib/widgets/aves_app.dart + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/settings_search_delegate.dart + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/settings/video/video.dart + - lib/widgets/settings/privacy/access_grants_page.dart + - lib/widgets/settings/privacy/hidden_items_page.dart + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/settings/navigation/drawer_tab_fixed.dart + - lib/widgets/settings/navigation/drawer_editor_banner.dart + - lib/widgets/settings/navigation/navigation.dart + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/settings/navigation/drawer_tab_albums.dart + - lib/widgets/settings/language/language.dart + - lib/widgets/settings/common/collection_tile.dart + - lib/widgets/settings/common/quick_actions/editor_page.dart + - lib/widgets/settings/viewer/viewer.dart + - lib/widgets/settings/viewer/overlay.dart + - lib/widgets/settings/display/display.dart + - lib/widgets/settings/accessibility/accessibility.dart + - lib/widgets/settings/thumbnails/thumbnails.dart + - lib/widgets/settings/thumbnails/overlay.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/collection/grid/list_details.dart + - lib/widgets/collection/grid/headers/album.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/navigation/drawer/tile.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/drawer/collection_nav_tile.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/about/app_ref.dart + - lib/widgets/common/expandable_filter_row.dart + - lib/widgets/common/thumbnail/error.dart + - lib/widgets/common/thumbnail/overlay.dart + - lib/widgets/common/identity/aves_donut.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/identity/aves_fab.dart + - lib/widgets/common/identity/aves_icons.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/basic/query_bar.dart + - lib/widgets/common/basic/link_chip.dart + - lib/widgets/common/app_bar/crumb_line.dart + - lib/widgets/common/search/delegate.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/common/map/buttons/panel.dart + - lib/widgets/common/action_controls/quick_choosers/rate_chooser.dart + - lib/widgets/common/action_controls/quick_choosers/common/menu.dart + - lib/widgets/common/action_controls/togglers/favourite.dart + - lib/widgets/common/action_controls/togglers/play.dart + - lib/widgets/common/action_controls/togglers/title_search.dart + - lib/widgets/common/action_controls/togglers/mute.dart + - lib/widgets/common/grid/header.dart + - lib/widgets/common/grid/overlay.dart + - lib/widgets/viewer/screen_saver_page.dart + - lib/widgets/viewer/panorama_page.dart + - lib/widgets/viewer/slideshow_page.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/viewer/info/info_search_delegate.dart + - lib/widgets/viewer/info/color_section.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/info/metadata/tv_page.dart + - lib/widgets/viewer/info/metadata/xmp_card.dart + - lib/widgets/viewer/info/metadata/metadata_section.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/visual/error.dart + - lib/widgets/viewer/visual/video/swipe_action.dart + - lib/widgets/viewer/overlay/selection_button.dart + - lib/widgets/viewer/overlay/locked.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/viewer/overlay/video/progress_bar.dart + - lib/widgets/viewer/overlay/video/ab_repeat.dart + - lib/widgets/viewer/overlay/details/description.dart + - lib/widgets/viewer/overlay/details/rating_tags.dart + - lib/widgets/viewer/overlay/details/location.dart + - lib/widgets/viewer/overlay/details/shooting.dart + - lib/widgets/viewer/overlay/details/date.dart + - lib/widgets/viewer/debug/debug_page.dart + - lib/widgets/map/address_row.dart + - lib/widgets/map/map_page.dart + - lib/widgets/map/date_row.dart + - lib/widgets/dialogs/item_picker.dart + - lib/widgets/dialogs/tile_view_dialog.dart + - lib/widgets/dialogs/video_stream_selection_dialog.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + - lib/widgets/dialogs/map/style_selection_dialog.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/states_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/common/enums.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/list_details.dart + - lib/widgets/filter_grids/common/section_keys.dart + - lib/widgets/stats/top_page.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/editor/transform/control_panel.dart + +lib/theme/styles.dart + importa: + importato da: + - lib/widgets/aves_app.dart + - lib/widgets/settings/common/tile_leading.dart + - lib/widgets/settings/common/quick_actions/editor_page.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/about/title.dart + - lib/widgets/about/data_usage.dart + - lib/widgets/common/expandable_filter_row.dart + - lib/widgets/common/grid/header.dart + - lib/widgets/viewer/overlay/video/progress_bar.dart + - lib/widgets/viewer/overlay/details/details.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/stats/percent_text.dart + +lib/theme/text.dart + importa: + - lib/ref/unicode.dart + importato da: + - lib/theme/format.dart + - lib/model/entry/extensions/props.dart + - lib/model/entry/extensions/info.dart + - lib/services/media/embedded_data_service.dart + - lib/widgets/welcome_page.dart + - lib/widgets/settings/navigation/navigation.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/collection/grid/list_details.dart + - lib/widgets/about/translators.dart + - lib/widgets/common/map/attribution.dart + - lib/widgets/viewer/overlay/selection_button.dart + - lib/widgets/viewer/overlay/details/position_title.dart + - lib/widgets/viewer/overlay/details/rating_tags.dart + - lib/widgets/viewer/overlay/details/location.dart + - lib/widgets/viewer/overlay/details/shooting.dart + - lib/widgets/viewer/overlay/details/date.dart + - lib/widgets/map/address_row.dart + - lib/widgets/map/date_row.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + - lib/widgets/dialogs/video_stream_selection_dialog.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/list_details.dart + +lib/theme/themes.dart + importa: + - lib/widgets/aves_app.dart + importato da: + - lib/widgets/aves_app.dart + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/common/tile_leading.dart + - lib/widgets/settings/common/quick_actions/action_panel.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/about/about_tv_page.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/about/licenses.dart + - lib/widgets/about/tv_license_page.dart + - lib/widgets/common/thumbnail/error.dart + - lib/widgets/common/identity/aves_app_bar.dart + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/common/identity/aves_donut.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/basic/markdown_container.dart + - lib/widgets/common/search/page.dart + - lib/widgets/common/map/buttons/coordinate_filter.dart + - lib/widgets/common/action_controls/quick_choosers/common/quick_chooser.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/viewer/overlay/video/progress_bar.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/dialogs/tile_view_dialog.dart + - lib/widgets/dialogs/export_collection_stats_page.dart + - lib/widgets/dialogs/video_stream_selection_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + - lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/stats/filter_table.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/stats/percent_text.dart + - lib/widgets/stats/date/histogram.dart + +lib/utils/android_file_utils.dart + importa: + - lib/model/app_inventory.dart + - lib/model/vaults/vaults.dart + - lib/services/common/services.dart + importato da: + - lib/widget_common.dart + - lib/model/favourites.dart + - lib/model/covers.dart + - lib/model/filters/path.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/entry/dirs.dart + - lib/model/entry/extensions/props.dart + - lib/model/source/album.dart + - lib/model/source/trash.dart + - lib/model/source/media_store_source.dart + - lib/model/vaults/details.dart + - lib/view/src/storage/relative_dir.dart + - lib/services/analysis_service.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/grid/headers/album.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/explorer/crumb_line.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/action_mixins/size_aware.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/dialogs/select_storage_dialog.dart + - lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/list_details.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/debug/os_storage.dart + +lib/utils/collection_utils.dart + importa: + importato da: + - lib/model/settings/modules/filter_grids.dart + - lib/model/settings/modules/navigation.dart + - lib/model/grouping/common.dart + - lib/model/source/album.dart + - lib/model/source/tag.dart + - lib/model/source/collection_lens.dart + - lib/model/source/location/country.dart + - lib/model/source/location/place.dart + - lib/model/source/location/state.dart + - lib/model/vaults/details.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/grid/list_details.dart + - lib/widgets/common/action_mixins/size_aware.dart + - lib/widgets/dialogs/map/style_selection_dialog.dart + +lib/utils/debouncer.dart + importa: + importato da: + - lib/model/source/media_store_source.dart + - lib/widgets/common/basic/query_bar.dart + - lib/widgets/common/search/page.dart + - lib/widgets/common/map/buttons/coordinate_filter.dart + - lib/widgets/common/map/leaflet/map.dart + - lib/widgets/map/scroller.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + +lib/utils/diff_match.dart + importa: + importato da: + - lib/widgets/common/basic/text/animated_diff.dart + +lib/utils/emoji_utils.dart + importa: + - lib/ref/unicode.dart + importato da: + - lib/model/filters/covered/location.dart + +lib/utils/file_utils.dart + importa: + importato da: + - lib/model/filters/query.dart + - lib/model/media/video/metadata.dart + - lib/widgets/collection/draggable_thumb_label.dart + - lib/widgets/collection/grid/list_details.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/about/data_usage.dart + - lib/widgets/common/action_mixins/size_aware.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/filter_grids/common/list_details.dart + - lib/widgets/filter_grids/common/draggable_thumb_label.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/debug/leaking.dart + - lib/widgets/debug/cache.dart + - lib/widgets/debug/database.dart + - lib/widgets/debug/os_storage.dart + +lib/utils/math_utils.dart + importa: + importato da: + - lib/geo/uri.dart + - lib/model/entry/extensions/images.dart + - lib/model/media/geotiff.dart + - lib/model/media/video/metadata.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/common/grid/selector.dart + - lib/widgets/viewer/visual/vector.dart + +lib/utils/mime_utils.dart + importa: + - lib/ref/mime_types.dart + importato da: + - lib/model/filters/mime.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/thumbnail/error.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + - lib/widgets/dialogs/export_collection_stats_page.dart + - lib/widgets/stats/mime_donut.dart + +lib/utils/string_utils.dart + importa: + importato da: + - lib/model/media/video/metadata.dart + - lib/services/metadata/svg_metadata_service.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + +lib/utils/time_utils.dart + importa: + importato da: + - lib/model/filters/date.dart + - lib/model/entry/sort.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/model/entry/extensions/props.dart + - lib/model/media/video/metadata.dart + - lib/services/metadata/metadata_fetch_service.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/grid/headers/date.dart + - lib/widgets/common/basic/time_shift_selector.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/dialogs/duration_dialog.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/stats/date/axis.dart + - lib/widgets/stats/date/histogram.dart + +lib/utils/xmp_utils.dart + importa: + - lib/ref/locales.dart + - lib/ref/metadata/xmp.dart + importato da: + - lib/model/entry/extensions/metadata_edition.dart + - lib/widgets/viewer/info/metadata/xmp_tile.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + +lib/view/src/actions/chip.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/actions/chip_set.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/actions/entry.dart + importa: + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/actions/entry_set.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/actions/explorer.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/actions/map.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/actions/map_cluster.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/actions/share.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/actions/slideshow.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/editor/enums.dart + importa: + - lib/ref/unicode.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/metadata/convert_action.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/metadata/date_edit_action.dart + importa: + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/metadata/date_field_source.dart + importa: + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/metadata/exportable_fields.dart + importa: + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/dialogs/export_collection_stats_page.dart + - lib/widgets/stats/stats_page.dart + +lib/view/src/metadata/fields.dart + importa: + importato da: + +lib/view/src/metadata/length_unit.dart + importa: + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/metadata/location_edit_action.dart + importa: + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/metadata/metadata_type.dart + importa: + importato da: + +lib/view/src/settings/enums.dart + importa: + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/dialogs/map/style_selection_dialog.dart + +lib/view/src/settings/thumbnail_overlay_location_icon.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/settings/thumbnail_overlay_tag_icon.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/source/album.dart + importa: + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/source/group.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/source/layout.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/source/sort.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/source/state.dart + importa: + - lib/l10n/l10n.dart + importato da: + +lib/view/src/source/vault.dart + importa: + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/storage/relative_dir.dart + importa: + - lib/utils/android_file_utils.dart + - lib/view/view.dart + importato da: + +lib/view/src/storage/volume.dart + importa: + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/wallpaper_target.dart + importa: + - lib/widgets/common/extensions/build_context.dart + importato da: + +lib/view/src/xmp.dart + importa: + - lib/ref/metadata/xmp.dart + importato da: + +lib/view/view.dart + importa: + importato da: + - lib/model/filters/path.dart + - lib/model/source/album.dart + - lib/view/src/storage/relative_dir.dart + - lib/services/analysis_service.dart + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/settings/screen_saver_settings_page.dart + - lib/widgets/settings/video/control_actions.dart + - lib/widgets/settings/video/subtitle_theme.dart + - lib/widgets/settings/video/playback.dart + - lib/widgets/settings/navigation/navigation.dart + - lib/widgets/settings/language/language.dart + - lib/widgets/settings/viewer/slideshow.dart + - lib/widgets/settings/viewer/viewer_actions_editor.dart + - lib/widgets/settings/viewer/overlay.dart + - lib/widgets/settings/display/display.dart + - lib/widgets/settings/accessibility/accessibility.dart + - lib/widgets/settings/accessibility/time_to_take_action.dart + - lib/widgets/settings/thumbnails/collection_actions_editor_page.dart + - lib/widgets/settings/thumbnails/overlay.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/explorer/crumb_line.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/action_mixins/size_aware.dart + - lib/widgets/common/app_bar/app_bar_subtitle.dart + - lib/widgets/common/map/buttons/panel.dart + - lib/widgets/common/action_controls/quick_choosers/share_button.dart + - lib/widgets/common/action_controls/quick_choosers/share_chooser.dart + - lib/widgets/common/action_controls/quick_choosers/rate_button.dart + - lib/widgets/common/action_controls/quick_choosers/move_button.dart + - lib/widgets/common/action_controls/quick_choosers/tag_button.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/overlay/slideshow_buttons.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/viewer/overlay/video/video.dart + - lib/widgets/viewer/overlay/video/controls.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + - lib/widgets/dialogs/select_storage_dialog.dart + - lib/widgets/dialogs/wallpaper_settings_dialog.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + - lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/section_keys.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/editor/control_panel.dart + - lib/widgets/editor/transform/control_panel.dart + - lib/widgets/debug/os_storage.dart + +lib/widget_common.dart + importa: + - lib/app_flavor.dart + - lib/model/entry/entry.dart + - lib/model/entry/sort.dart + - lib/model/settings/enums/widget_outline.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/media_store_source.dart + - lib/services/common/channel.dart + - lib/services/common/services.dart + - lib/utils/android_file_utils.dart + - lib/widgets/home_widget.dart + importato da: + - lib/main_play.dart + - lib/main_libre.dart + - lib/main_izzy.dart + +lib/widgets/about/about_mobile_page.dart + importa: + - lib/widgets/about/app_ref.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/about/credits.dart + - lib/widgets/about/data_usage.dart + - lib/widgets/about/licenses.dart + - lib/widgets/about/translators.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/about/about_page.dart + +lib/widgets/about/about_page.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/about/about_mobile_page.dart + - lib/widgets/about/about_tv_page.dart + importato da: + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/navigation/drawer/app_drawer.dart + +lib/widgets/about/about_tv_page.dart + importa: + - lib/model/device.dart + - lib/theme/themes.dart + - lib/widgets/about/app_ref.dart + - lib/widgets/about/credits.dart + - lib/widgets/about/translators.dart + - lib/widgets/about/tv_license_page.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/behaviour/pop/scope.dart + - lib/widgets/common/behaviour/pop/tv_navigation.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + - lib/widgets/navigation/tv_rail.dart + importato da: + - lib/widgets/about/about_page.dart + +lib/widgets/about/app_ref.dart + importa: + - lib/model/device.dart + - lib/ref/locales.dart + - lib/theme/icons.dart + - lib/widgets/about/policy_page.dart + - lib/widgets/common/basic/link_chip.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_logo.dart + importato da: + - lib/widgets/about/about_tv_page.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/about/about_mobile_page.dart + +lib/widgets/about/bug_report.dart + importa: + - lib/app_flavor.dart + - lib/model/device.dart + - lib/model/settings/settings.dart + - lib/ref/locales.dart + - lib/ref/mime_types.dart + - lib/services/common/services.dart + - lib/theme/colors.dart + - lib/theme/durations.dart + - lib/theme/styles.dart + - lib/theme/themes.dart + - lib/widgets/about/app_ref.dart + - lib/widgets/aves_app.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/fx/borders.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + importato da: + - lib/widgets/home/home_error.dart + - lib/widgets/about/about_mobile_page.dart + +lib/widgets/about/credits.dart + importa: + - lib/widgets/about/title.dart + - lib/widgets/common/basic/link_chip.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/about/about_tv_page.dart + - lib/widgets/about/about_mobile_page.dart + +lib/widgets/about/data_usage.dart + importa: + - lib/ref/brand_colors.dart + - lib/services/common/services.dart + - lib/theme/colors.dart + - lib/theme/durations.dart + - lib/theme/styles.dart + - lib/utils/file_utils.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_donut.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + importato da: + - lib/widgets/about/about_mobile_page.dart + +lib/widgets/about/licenses.dart + importa: + - lib/app_flavor.dart + - lib/model/app/dependencies.dart + - lib/ref/brand_colors.dart + - lib/theme/colors.dart + - lib/theme/themes.dart + - lib/widgets/about/title.dart + - lib/widgets/common/basic/link_chip.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + importato da: + - lib/widgets/about/about_mobile_page.dart + +lib/widgets/about/policy_page.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/common/basic/markdown_container.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/welcome_page.dart + - lib/widgets/about/app_ref.dart + +lib/widgets/about/title.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/styles.dart + importato da: + - lib/widgets/about/licenses.dart + - lib/widgets/about/translators.dart + - lib/widgets/about/credits.dart + +lib/widgets/about/translators.dart + importa: + - lib/model/app/contributors.dart + - lib/theme/text.dart + - lib/widgets/about/title.dart + - lib/widgets/common/basic/text/change_highlight.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/about/about_tv_page.dart + - lib/widgets/about/about_mobile_page.dart + +lib/widgets/about/tv_license_page.dart + importa: + - lib/theme/themes.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/behaviour/intents.dart + importato da: + - lib/widgets/about/about_tv_page.dart + +lib/widgets/aves_app.dart + importa: + - lib/app_flavor.dart + - lib/app_mode.dart + - lib/geo/uri.dart + - lib/l10n/l10n.dart + - lib/model/app/intent.dart + - lib/model/app_inventory.dart + - lib/model/device.dart + - lib/model/filters/recent.dart + - lib/model/settings/defaults.dart + - lib/model/settings/enums/display_refresh_rate_mode.dart + - lib/model/settings/enums/screen_on.dart + - lib/model/settings/enums/theme_brightness.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/model/source/media_store_source.dart + - lib/ref/locales.dart + - lib/services/accessibility_service.dart + - lib/services/common/services.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/theme/styles.dart + - lib/theme/themes.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/basic/derived_material_localization.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/behaviour/pop/scope.dart + - lib/widgets/common/behaviour/route_tracker.dart + - lib/widgets/common/behaviour/routes.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/providers/durations_provider.dart + - lib/widgets/common/providers/highlight_info_provider.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/common/providers/viewer_entry_provider.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/home/home_page.dart + - lib/widgets/navigation/tv_page_transitions.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/welcome_page.dart + - lib/remote/remote_controller.dart + importato da: + - lib/main_common.dart + - lib/theme/themes.dart + - lib/model/settings/modules/app.dart + - lib/model/source/collection_source.dart + - lib/widgets/wallpaper_page.dart + - lib/widgets/settings/language/locale_selection_page.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/common/identity/aves_app_bar.dart + - lib/widgets/common/basic/markdown_container.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/link_chip.dart + - lib/widgets/common/map/attribution.dart + - lib/widgets/viewer/panorama_page.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/visual/video/swipe_action.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/filter_grids/common/app_bar.dart + +lib/widgets/cast/animated_cast_icon.dart + importa: + - lib/widgets/cast/cast_controller.dart + importato da: + - lib/widgets/collection/app_bar/cast/cast_icon_button.dart + +lib/widgets/cast/backends/dlna_cast_backend.dart + importa: + - lib/model/entry/entry.dart + - lib/services/cast/cast_server.dart + - lib/widgets/cast/dlna.dart + importato da: + +lib/widgets/cast/backends/fast_cast_backend.dart + importa: + - lib/model/entry/entry.dart + importato da: + +lib/widgets/cast/backends/google_cast_backend.dart + importa: + - lib/model/entry/entry.dart + importato da: + +lib/widgets/cast/cast_controller.dart + importa: + - lib/model/entry/entry.dart + importato da: + - lib/main_play.dart + - lib/services/cast/cast_backend_switcher.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/collection/app_bar/cast/cast_actions.dart + - lib/widgets/collection/app_bar/cast/cast_icon_button.dart + - lib/widgets/collection/app_bar/cast/cast_bar_inline.dart + - lib/widgets/collection/app_bar/cast/cast_controls_sheet.dart + - lib/widgets/cast/animated_cast_icon.dart + - lib/widgets/cast/google_cast_controller.dart + - lib/widgets/viewer/fullscreen_cast_viewer_fast.dart + - lib/widgets/viewer/fullscreen_cast_viewer.dart + - lib/widgets/viewer/fullscreen_cast_viewer_dlna.dart + - lib/widgets/viewer/controls/controller.dart + +lib/widgets/cast/cast_state.dart + importa: + - lib/model/entry/entry.dart + - lib/widgets/dialogs/cast_dialog.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + +lib/widgets/cast/dlna.dart + importa: + - lib/ref/upnp.dart + importato da: + - lib/widgets/collection/app_bar/cast/cast_icon_button.dart + - lib/widgets/cast/dlna_dialog.dart + - lib/widgets/cast/dlna_manager.dart + - lib/widgets/cast/backends/dlna_cast_backend.dart + - lib/widgets/dialogs/cast_dialog.dart + +lib/widgets/cast/dlna_dialog.dart + importa: + - lib/widgets/cast/dlna.dart + importato da: + - lib/widgets/collection/app_bar/cast/cast_icon_button.dart + +lib/widgets/cast/dlna_manager.dart + importa: + - lib/widgets/cast/dlna.dart + importato da: + +lib/widgets/cast/google_cast_controller.dart + importa: + - lib/model/entry/entry.dart + - lib/services/cast/cast_server.dart + - lib/remote/remote_settings.dart + - lib/widgets/cast/cast_controller.dart + importato da: + - lib/services/cast/cast_backend_switcher.dart + +lib/widgets/collection/app_bar/cast/cast_actions.dart + importa: + - lib/model/entry/entry.dart + - lib/widgets/cast/cast_controller.dart + importato da: + +lib/widgets/collection/app_bar/cast/cast_bar_inline.dart + importa: + - lib/model/entry/entry.dart + - lib/model/selection.dart + - lib/model/source/collection_lens.dart + - lib/services/cast/cast_server.dart + - lib/widgets/cast/cast_controller.dart + - lib/widgets/viewer/fullscreen_cast_viewer.dart + - lib/widgets/viewer/fullscreen_cast_viewer_dlna.dart + importato da: + +lib/widgets/collection/app_bar/cast/cast_controls_sheet.dart + importa: + - lib/widgets/cast/cast_controller.dart + importato da: + +lib/widgets/collection/app_bar/cast/cast_icon_button.dart + importa: + - lib/model/selection.dart + - lib/model/entry/entry.dart + - lib/model/source/collection_lens.dart + - lib/widgets/cast/animated_cast_icon.dart + - lib/widgets/cast/cast_controller.dart + - lib/widgets/cast/dlna_dialog.dart + - lib/widgets/cast/dlna.dart + importato da: + +lib/widgets/collection/app_bar/collection_app_bar.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/container/set_and.dart + - lib/model/filters/filters.dart + - lib/model/filters/query.dart + - lib/model/filters/trash.dart + - lib/model/query.dart + - lib/model/selection.dart + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/theme/themes.dart + - lib/view/view.dart + - lib/widgets/aves_app.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/filter_bar.dart + - lib/widgets/collection/query_bar.dart + - lib/widgets/common/action_controls/quick_choosers/move_button.dart + - lib/widgets/common/action_controls/quick_choosers/rate_button.dart + - lib/widgets/common/action_controls/quick_choosers/tag_button.dart + - lib/widgets/common/action_controls/togglers/favourite.dart + - lib/widgets/common/action_controls/togglers/title_search.dart + - lib/widgets/common/app_bar/app_bar_subtitle.dart + - lib/widgets/common/app_bar/app_bar_title.dart + - lib/widgets/common/basic/popup/container.dart + - lib/widgets/common/basic/popup/expansion_panel.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_app_bar.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + - lib/widgets/common/search/route.dart + - lib/widgets/common/tile_extent_controller.dart + - lib/widgets/dialogs/tile_view_dialog.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/collection/remote_status_button.dart + - lib/widgets/cast/cast_controller.dart + importato da: + - lib/widgets/collection/collection_grid.dart + +lib/widgets/collection/app_bar/remote/remote_bar.dart + importa: + - lib/widgets/collection/remote_status_button.dart + - lib/model/source/collection_source.dart + importato da: + +lib/widgets/collection/app_bar/remote/remote_controls_sheet.dart + importa: + - lib/widgets/collection/remote_status_button.dart + - lib/model/source/collection_source.dart + importato da: + +lib/widgets/collection/collection_grid.dart + importa: + - lib/app_mode.dart + - lib/model/app/permissions.dart + - lib/model/entry/entry.dart + - lib/model/favourites.dart + - lib/model/filters/favourite.dart + - lib/model/filters/mime.dart + - lib/model/selection.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/model/source/section_keys.dart + - lib/ref/mime_types.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/utils/time_utils.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/collection/draggable_thumb_label.dart + - lib/widgets/collection/grid/list_details_theme.dart + - lib/widgets/collection/grid/section_layout.dart + - lib/widgets/collection/grid/tile.dart + - lib/widgets/collection/loading.dart + - lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/behaviour/routes.dart + - lib/widgets/common/behaviour/sloppy_scroll_physics.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/media_query.dart + - lib/widgets/common/grid/draggable_thumb_label.dart + - lib/widgets/common/grid/item_tracker.dart + - lib/widgets/common/grid/scaling.dart + - lib/widgets/common/grid/sections/fixed/scale_grid.dart + - lib/widgets/common/grid/sections/list_layout.dart + - lib/widgets/common/grid/sections/section_layout.dart + - lib/widgets/common/grid/selector.dart + - lib/widgets/common/grid/sliver.dart + - lib/widgets/common/grid/theme.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/common/identity/scroll_thumb.dart + - lib/widgets/common/providers/tile_extent_controller_provider.dart + - lib/widgets/common/providers/viewer_entry_provider.dart + - lib/widgets/common/thumbnail/decorated.dart + - lib/widgets/common/thumbnail/image.dart + - lib/widgets/common/thumbnail/notifications.dart + - lib/widgets/common/tile_extent_controller.dart + - lib/widgets/navigation/nav_bar/nav_bar.dart + - lib/widgets/viewer/entry_viewer_page.dart + - lib/services/common/services.dart + - lib/remote/remote_image_tile.dart + - lib/remote/remote_origin.dart + - lib/model/entry/extensions/remote_flags.dart + - lib/widgets/common/hybrid_frame.dart + importato da: + - lib/widgets/aves_app.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + +lib/widgets/collection/collection_page.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/filters/filters.dart + - lib/model/filters/query.dart + - lib/model/filters/trash.dart + - lib/model/highlight.dart + - lib/model/selection.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/services/app_service.dart + - lib/services/intent_service.dart + - lib/theme/durations.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/common/basic/draggable_scrollbar/notifications.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/behaviour/pop/double_back.dart + - lib/widgets/common/behaviour/pop/scope.dart + - lib/widgets/common/behaviour/pop/tv_navigation.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_fab.dart + - lib/widgets/common/providers/query_provider.dart + - lib/widgets/common/providers/selection_provider.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/nav_bar/nav_bar.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/collection/remote_progress_banner.dart + importato da: + - lib/model/settings/defaults.dart + - lib/model/settings/modules/navigation.dart + - lib/widgets/aves_app.dart + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/drawer/collection_nav_tile.dart + - lib/widgets/navigation/nav_bar/nav_bar.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/behaviour/pop/tv_navigation.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/slideshow_page.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/debug/settings.dart + +lib/widgets/collection/draggable_thumb_label.dart + importa: + - lib/model/entry/entry.dart + - lib/model/filters/rating.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/utils/file_utils.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/grid/draggable_thumb_label.dart + - lib/widgets/common/grid/sections/list_layout.dart + importato da: + - lib/widgets/collection/collection_grid.dart + +lib/widgets/collection/entry_set_action_delegate.dart + importa: + - lib/app_mode.dart + - lib/model/device.dart + - lib/model/dynamic_albums.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/favourites.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/favourites.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/container/set_and.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/model/highlight.dart + - lib/model/metadata/date_modifier.dart + - lib/model/naming_pattern.dart + - lib/model/query.dart + - lib/model/selection.dart + - lib/model/settings/settings.dart + - lib/model/source/analysis_controller.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/model/vaults/vaults.dart + - lib/services/app_service.dart + - lib/services/common/image_op_events.dart + - lib/services/common/services.dart + - lib/services/media/media_edit_service.dart + - lib/theme/durations.dart + - lib/theme/themes.dart + - lib/utils/collection_utils.dart + - lib/utils/mime_utils.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/action_mixins/entry_editor.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/action_mixins/size_aware.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/search/route.dart + - lib/widgets/dialogs/add_shortcut_dialog.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + - lib/widgets/dialogs/filter_editors/create_dynamic_album_dialog.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/map/map_page.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/viewer/slideshow_page.dart + - lib/widgets/dialogs/cast_dialog.dart + - lib/widgets/cast/cast_state.dart + importato da: + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/map/map_page.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + +lib/widgets/collection/filter_bar.dart + importa: + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/theme/durations.dart + - lib/widgets/common/identity/aves_app_bar.dart + - lib/widgets/common/identity/aves_filter_chip.dart + importato da: + - lib/widgets/settings/common/collection_tile.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/common/identity/aves_filter_chip.dart + +lib/widgets/collection/grid/headers/album.dart + importa: + - lib/model/covers.dart + - lib/model/entry/entry.dart + - lib/model/source/collection_source.dart + - lib/model/source/section_keys.dart + - lib/theme/icons.dart + - lib/utils/android_file_utils.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/grid/header.dart + - lib/widgets/common/identity/aves_icons.dart + importato da: + - lib/widgets/collection/grid/headers/any.dart + +lib/widgets/collection/grid/headers/any.dart + importa: + - lib/model/entry/entry.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/model/source/section_keys.dart + - lib/widgets/collection/grid/headers/album.dart + - lib/widgets/collection/grid/headers/date.dart + - lib/widgets/collection/grid/headers/rating.dart + - lib/widgets/common/grid/header.dart + importato da: + - lib/widgets/collection/grid/section_layout.dart + +lib/widgets/collection/grid/headers/date.dart + importa: + - lib/model/source/section_keys.dart + - lib/utils/time_utils.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/grid/header.dart + importato da: + - lib/widgets/collection/grid/headers/any.dart + +lib/widgets/collection/grid/headers/rating.dart + importa: + - lib/model/filters/rating.dart + - lib/model/source/section_keys.dart + - lib/widgets/common/grid/header.dart + importato da: + - lib/widgets/collection/grid/headers/any.dart + +lib/widgets/collection/grid/list_details.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/location.dart + - lib/model/settings/enums/coordinate_format.dart + - lib/model/settings/settings.dart + - lib/theme/format.dart + - lib/theme/icons.dart + - lib/theme/text.dart + - lib/utils/collection_utils.dart + - lib/utils/file_utils.dart + - lib/widgets/collection/grid/list_details_theme.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/fx/borders.dart + importato da: + - lib/widgets/collection/grid/tile.dart + +lib/widgets/collection/grid/list_details_theme.dart + importa: + - lib/theme/format.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/tile_extent_controller.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/grid/tile.dart + - lib/widgets/collection/grid/list_details.dart + +lib/widgets/collection/grid/section_layout.dart + importa: + - lib/model/entry/entry.dart + - lib/model/source/collection_lens.dart + - lib/model/source/section_keys.dart + - lib/widgets/collection/grid/headers/any.dart + - lib/widgets/common/grid/sections/provider.dart + importato da: + - lib/widgets/collection/collection_grid.dart + +lib/widgets/collection/grid/tile.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/selection.dart + - lib/model/source/collection_lens.dart + - lib/services/intent_service.dart + - lib/widgets/collection/grid/list_details.dart + - lib/widgets/collection/grid/list_details_theme.dart + - lib/widgets/common/grid/scaling.dart + - lib/widgets/common/providers/viewer_entry_provider.dart + - lib/widgets/common/thumbnail/decorated.dart + - lib/widgets/common/thumbnail/notifications.dart + - lib/widgets/viewer/hero.dart + - lib/remote/remote_origin.dart + - lib/remote/remote_image_tile.dart + importato da: + - lib/widgets/collection/collection_grid.dart + +lib/widgets/collection/loading.dart + importa: + - lib/model/source/collection_source.dart + - lib/model/source/events.dart + - lib/remote/remote_sync_bus.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/empty.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/collection/query_bar.dart + importa: + - lib/model/entry/entry.dart + - lib/model/selection.dart + - lib/model/source/collection_lens.dart + - lib/widgets/common/basic/query_bar.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/collection/app_bar/collection_app_bar.dart + +lib/widgets/collection/remote_progress_banner.dart + importa: + - lib/remote/remote_sync_bus.dart + importato da: + - lib/widgets/collection/collection_page.dart + +lib/widgets/collection/remote_status_button.dart + importa: + - lib/model/source/collection_source.dart + - lib/remote/remote_sync_bus.dart + - lib/remote/remote_controller.dart + - lib/remote/remote_settings_dialog.dart + importato da: + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/collection/app_bar/remote/remote_controls_sheet.dart + - lib/widgets/collection/app_bar/remote/remote_bar.dart + +lib/widgets/collection/remote_status_icon.dart + importa: + - lib/remote/remote_sync_bus.dart + importato da: + +lib/widgets/common/action_controls/quick_choosers/album_chooser.dart + importa: + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/source/collection_source.dart + - lib/widgets/common/action_controls/quick_choosers/common/menu.dart + - lib/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/common/action_controls/quick_choosers/move_button.dart + +lib/widgets/common/action_controls/quick_choosers/common/button.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/durations.dart + - lib/widgets/common/action_controls/quick_choosers/common/route_layout.dart + - lib/widgets/common/basic/gestures/gesture_detector.dart + importato da: + - lib/widgets/common/action_controls/quick_choosers/share_button.dart + - lib/widgets/common/action_controls/quick_choosers/rate_button.dart + - lib/widgets/common/action_controls/quick_choosers/move_button.dart + - lib/widgets/common/action_controls/quick_choosers/tag_button.dart + +lib/widgets/common/action_controls/quick_choosers/common/menu.dart + importa: + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/widgets/common/action_controls/quick_choosers/common/quick_chooser.dart + importato da: + - lib/widgets/common/action_controls/quick_choosers/share_chooser.dart + - lib/widgets/common/action_controls/quick_choosers/tag_chooser.dart + - lib/widgets/common/action_controls/quick_choosers/album_chooser.dart + +lib/widgets/common/action_controls/quick_choosers/common/quick_chooser.dart + importa: + - lib/theme/themes.dart + - lib/widgets/common/fx/blurred.dart + - lib/widgets/common/fx/borders.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/common/action_controls/quick_choosers/rate_chooser.dart + - lib/widgets/common/action_controls/quick_choosers/common/menu.dart + +lib/widgets/common/action_controls/quick_choosers/common/route_layout.dart + importa: + importato da: + - lib/widgets/common/action_controls/quick_choosers/common/button.dart + +lib/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart + importa: + - lib/model/filters/filters.dart + - lib/model/settings/modules/app.dart + - lib/widgets/common/identity/aves_filter_chip.dart + importato da: + - lib/widgets/common/action_controls/quick_choosers/tag_chooser.dart + - lib/widgets/common/action_controls/quick_choosers/album_chooser.dart + - lib/widgets/common/action_controls/quick_choosers/move_button.dart + - lib/widgets/common/action_controls/quick_choosers/tag_button.dart + +lib/widgets/common/action_controls/quick_choosers/move_button.dart + importa: + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/view/view.dart + - lib/widgets/common/action_controls/quick_choosers/album_chooser.dart + - lib/widgets/common/action_controls/quick_choosers/common/button.dart + - lib/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + importato da: + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + +lib/widgets/common/action_controls/quick_choosers/rate_button.dart + importa: + - lib/view/view.dart + - lib/widgets/common/action_controls/quick_choosers/common/button.dart + - lib/widgets/common/action_controls/quick_choosers/rate_chooser.dart + importato da: + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + +lib/widgets/common/action_controls/quick_choosers/rate_chooser.dart + importa: + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/widgets/common/action_controls/quick_choosers/common/quick_chooser.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/common/action_controls/quick_choosers/rate_button.dart + +lib/widgets/common/action_controls/quick_choosers/share_button.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/view/view.dart + - lib/widgets/common/action_controls/quick_choosers/common/button.dart + - lib/widgets/common/action_controls/quick_choosers/share_chooser.dart + importato da: + - lib/widgets/viewer/overlay/viewer_buttons.dart + +lib/widgets/common/action_controls/quick_choosers/share_chooser.dart + importa: + - lib/view/view.dart + - lib/widgets/common/action_controls/quick_choosers/common/menu.dart + - lib/widgets/common/basic/popup/menu_row.dart + importato da: + - lib/widgets/common/action_controls/quick_choosers/share_button.dart + +lib/widgets/common/action_controls/quick_choosers/tag_button.dart + importa: + - lib/model/filters/covered/tag.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/view/view.dart + - lib/widgets/common/action_controls/quick_choosers/common/button.dart + - lib/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart + - lib/widgets/common/action_controls/quick_choosers/tag_chooser.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + importato da: + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + +lib/widgets/common/action_controls/quick_choosers/tag_chooser.dart + importa: + - lib/model/filters/filters.dart + - lib/widgets/common/action_controls/quick_choosers/common/menu.dart + - lib/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/common/action_controls/quick_choosers/tag_button.dart + +lib/widgets/common/action_controls/togglers/favourite.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/favourites.dart + - lib/model/favourites.dart + - lib/model/settings/settings.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/fx/sweeper.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + importato da: + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + +lib/widgets/common/action_controls/togglers/mute.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + importato da: + - lib/widgets/viewer/overlay/viewer_buttons.dart + +lib/widgets/common/action_controls/togglers/play.dart + importa: + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + importato da: + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/viewer/overlay/video/controls.dart + +lib/widgets/common/action_controls/togglers/title_search.dart + importa: + - lib/model/query.dart + - lib/theme/icons.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + importato da: + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/filter_grids/common/app_bar.dart + +lib/widgets/common/action_mixins/entry_editor.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/filters.dart + - lib/model/filters/placeholder.dart + - lib/model/metadata/date_modifier.dart + - lib/model/source/collection_lens.dart + - lib/ref/mime_types.dart + - lib/services/common/services.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_description_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart + - lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + +lib/widgets/common/action_mixins/entry_storage.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/favourites.dart + - lib/model/entry/extensions/keys.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/favourites.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/trash.dart + - lib/model/highlight.dart + - lib/model/metadata/date_modifier.dart + - lib/model/multipage.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/ref/mime_types.dart + - lib/services/common/image_op_events.dart + - lib/services/common/services.dart + - lib/services/media/enums.dart + - lib/services/media/media_edit_service.dart + - lib/theme/durations.dart + - lib/theme/themes.dart + - lib/utils/android_file_utils.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/action_mixins/size_aware.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/dialogs/selection_dialogs/single_selection.dart + - lib/widgets/filter_grids/common/enums.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + +lib/widgets/common/action_mixins/feedback.dart + importa: + - lib/model/settings/enums/accessibility_timeout.dart + - lib/model/settings/settings.dart + - lib/theme/colors.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/widgets/common/action_mixins/overlay_snack_bar.dart + - lib/widgets/common/basic/circle.dart + - lib/widgets/common/basic/text/change_highlight.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/media_query.dart + - lib/widgets/common/extensions/theme.dart + importato da: + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/home/home_error.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/loading.dart + - lib/widgets/navigation/drawer/collection_nav_tile.dart + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/about/data_usage.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/map/map_action_delegate.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/info/embedded/embedded_data_opener.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/action/single_entry_editor.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/action/printer.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/overlay/wallpaper_buttons.dart + - lib/widgets/viewer/overlay/panorama.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/stats/top_page.dart + - lib/widgets/stats/stats_page.dart + +lib/widgets/common/action_mixins/overlay_snack_bar.dart + importa: + - lib/widgets/common/extensions/theme.dart + importato da: + - lib/widgets/common/action_mixins/feedback.dart + +lib/widgets/common/action_mixins/permission_aware.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/props.dart + - lib/services/common/services.dart + - lib/utils/android_file_utils.dart + - lib/view/view.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/action/single_entry_editor.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/widgets/common/action_mixins/size_aware.dart + importa: + - lib/model/entry/entry.dart + - lib/services/common/services.dart + - lib/utils/android_file_utils.dart + - lib/utils/collection_utils.dart + - lib/utils/file_utils.dart + - lib/view/view.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/widgets/common/action_mixins/vault_aware.dart + importa: + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/vaults/details.dart + - lib/model/vaults/vaults.dart + - lib/services/common/services.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/dialogs/filter_editors/password_dialog.dart + - lib/widgets/dialogs/filter_editors/pattern_dialog.dart + - lib/widgets/dialogs/filter_editors/pin_dialog.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/navigation/drawer/collection_nav_tile.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/stats/stats_page.dart + +lib/widgets/common/app_bar/app_bar_subtitle.dart + importa: + - lib/model/source/collection_source.dart + - lib/model/source/events.dart + - lib/theme/durations.dart + - lib/view/view.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/theme.dart + importato da: + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/filter_grids/common/app_bar.dart + +lib/widgets/common/app_bar/app_bar_title.dart + importa: + importato da: + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/filter_grids/common/app_bar.dart + +lib/widgets/common/app_bar/crumb_line.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/icons.dart + importato da: + - lib/widgets/explorer/crumb_line.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/group_crumb_line.dart + +lib/widgets/common/app_bar/sliver_app_bar_title.dart + importa: + importato da: + - lib/widgets/viewer/info/info_app_bar.dart + +lib/widgets/common/aves_highlight.dart + importa: + importato da: + - lib/widgets/viewer/source_viewer_page.dart + +lib/widgets/common/basic/circle.dart + importa: + importato da: + - lib/widgets/common/action_mixins/feedback.dart + +lib/widgets/common/basic/color_indicator.dart + importa: + - lib/widgets/common/fx/borders.dart + importato da: + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/settings/viewer/entry_background.dart + - lib/widgets/common/basic/list_tiles/color.dart + - lib/widgets/viewer/info/color_section.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + +lib/widgets/common/basic/derived_material_localization.dart + importa: + - lib/services/common/services.dart + importato da: + - lib/widgets/aves_app.dart + +lib/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart + importa: + importato da: + - lib/widgets/common/identity/scroll_thumb.dart + +lib/widgets/common/basic/draggable_scrollbar/notifications.dart + importa: + importato da: + - lib/widgets/collection/collection_page.dart + - lib/widgets/navigation/nav_bar/floating.dart + - lib/widgets/navigation/nav_bar/nav_bar.dart + - lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/common/basic/draggable_scrollbar/scroll_label.dart + importa: + importato da: + - lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart + +lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/common/basic/draggable_scrollbar/notifications.dart + - lib/widgets/common/basic/draggable_scrollbar/scroll_label.dart + - lib/widgets/common/basic/draggable_scrollbar/transition.dart + - lib/widgets/common/basic/gestures/gesture_detector.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/common/identity/scroll_thumb.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/common/basic/draggable_scrollbar/transition.dart + importa: + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart + +lib/widgets/common/basic/font_size_icon_theme.dart + importa: + importato da: + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/privacy/access_grants_page.dart + - lib/widgets/settings/privacy/hidden_items_page.dart + - lib/widgets/settings/navigation/drawer_editor_banner.dart + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/settings/common/quick_actions/editor_page.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/common/identity/aves_app_bar.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/basic/query_bar.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/tile_view_dialog.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/common/basic/gestures/gesture_detector.dart + importa: + importato da: + - lib/widgets/common/basic/gestures/ink_well.dart + - lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart + - lib/widgets/common/map/leaflet/map.dart + - lib/widgets/common/action_controls/quick_choosers/common/button.dart + - lib/widgets/common/grid/selector.dart + - lib/widgets/common/grid/header.dart + +lib/widgets/common/basic/gestures/ink_well.dart + importa: + - lib/widgets/common/basic/gestures/gesture_detector.dart + importato da: + - lib/widgets/common/identity/aves_app_bar.dart + - lib/widgets/common/identity/aves_filter_chip.dart + +lib/widgets/common/basic/insets.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/aves_app.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/media_query.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/common/tile_extent_controller.dart + importato da: + - lib/widgets/wallpaper_page.dart + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/settings_tv_page.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/about/about_tv_page.dart + - lib/widgets/about/about_mobile_page.dart + - lib/widgets/common/thumbnail/image.dart + - lib/widgets/common/identity/aves_app_bar.dart + - lib/widgets/viewer/panorama_page.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/stats/top_page.dart + - lib/widgets/stats/stats_page.dart + +lib/widgets/common/basic/labeled_checkbox.dart + importa: + importato da: + - lib/widgets/dialogs/entry_editors/edit_description_dialog.dart + +lib/widgets/common/basic/link_chip.dart + importa: + - lib/theme/icons.dart + - lib/widgets/aves_app.dart + importato da: + - lib/widgets/welcome_page.dart + - lib/widgets/about/app_ref.dart + - lib/widgets/about/licenses.dart + - lib/widgets/about/credits.dart + - lib/widgets/viewer/info/common.dart + +lib/widgets/common/basic/list_tiles/color.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/common/basic/color_indicator.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/settings/video/subtitle_theme.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + +lib/widgets/common/basic/list_tiles/reselectable_radio.dart + importa: + importato da: + - lib/widgets/settings/language/locale_selection_page.dart + - lib/widgets/dialogs/selection_dialogs/radio_list_tile.dart + - lib/widgets/dialogs/pick_dialogs/app_pick_page.dart + +lib/widgets/common/basic/list_tiles/slider.dart + importa: + importato da: + - lib/widgets/settings/video/subtitle_theme.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + +lib/widgets/common/basic/markdown_container.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/themes.dart + - lib/widgets/aves_app.dart + - lib/widgets/common/fx/borders.dart + importato da: + - lib/widgets/welcome_page.dart + - lib/widgets/about/policy_page.dart + +lib/widgets/common/basic/multi_cross_fader.dart + importa: + importato da: + - lib/widgets/viewer/info/metadata/xmp_card.dart + - lib/widgets/editor/control_panel.dart + +lib/widgets/common/basic/popup/container.dart + importa: + importato da: + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + +lib/widgets/common/basic/popup/expansion_panel.dart + importa: + - lib/theme/durations.dart + - lib/widgets/common/basic/popup/menu_row.dart + importato da: + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + +lib/widgets/common/basic/popup/menu_row.dart + importa: + importato da: + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/basic/popup/expansion_panel.dart + - lib/widgets/common/map/buttons/panel.dart + - lib/widgets/common/action_controls/quick_choosers/share_chooser.dart + - lib/widgets/common/action_controls/togglers/favourite.dart + - lib/widgets/common/action_controls/togglers/play.dart + - lib/widgets/common/action_controls/togglers/title_search.dart + - lib/widgets/common/action_controls/togglers/mute.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/common/basic/query_bar.dart + importa: + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/utils/debouncer.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/settings/language/locale_selection_page.dart + - lib/widgets/collection/query_bar.dart + - lib/widgets/dialogs/pick_dialogs/app_pick_page.dart + - lib/widgets/filter_grids/common/query_bar.dart + - lib/widgets/debug/os_codecs.dart + - lib/widgets/debug/os_apps.dart + +lib/widgets/common/basic/scaffold.dart + importa: + importato da: + - lib/widgets/welcome_page.dart + - lib/widgets/wallpaper_page.dart + - lib/widgets/aves_app.dart + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/settings_tv_page.dart + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/settings/screen_saver_settings_page.dart + - lib/widgets/settings/video/control_actions.dart + - lib/widgets/settings/video/subtitle_theme.dart + - lib/widgets/settings/video/playback.dart + - lib/widgets/settings/video/controls.dart + - lib/widgets/settings/video/video_settings_page.dart + - lib/widgets/settings/privacy/access_grants_page.dart + - lib/widgets/settings/privacy/hidden_items_page.dart + - lib/widgets/settings/navigation/confirmation_dialogs.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/settings/language/locale_selection_page.dart + - lib/widgets/settings/common/quick_actions/editor_page.dart + - lib/widgets/settings/viewer/slideshow.dart + - lib/widgets/settings/viewer/overlay.dart + - lib/widgets/settings/thumbnails/collection_actions_editor_page.dart + - lib/widgets/settings/thumbnails/overlay.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/about/about_tv_page.dart + - lib/widgets/about/policy_page.dart + - lib/widgets/about/about_mobile_page.dart + - lib/widgets/about/tv_license_page.dart + - lib/widgets/common/search/page.dart + - lib/widgets/viewer/entry_viewer_page.dart + - lib/widgets/viewer/source_viewer_page.dart + - lib/widgets/viewer/screen_saver_page.dart + - lib/widgets/viewer/panorama_page.dart + - lib/widgets/viewer/entry_viewer_page_dlna.dart + - lib/widgets/viewer/slideshow_page.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/info/metadata/tv_page.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/export_collection_stats_page.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + - lib/widgets/dialogs/map/style_selection_dialog.dart + - lib/widgets/dialogs/pick_dialogs/app_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/stats/top_page.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/common/basic/text/animated_diff.dart + importa: + - lib/utils/diff_match.dart + importato da: + - lib/widgets/viewer/overlay/selection_button.dart + +lib/widgets/common/basic/text/background_painter.dart + importa: + importato da: + - lib/widgets/settings/video/subtitle_sample.dart + - lib/widgets/viewer/visual/video/subtitle/subtitle.dart + +lib/widgets/common/basic/text/change_highlight.dart + importa: + importato da: + - lib/widgets/about/translators.dart + - lib/widgets/common/identity/aves_caption.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + +lib/widgets/common/basic/text/outlined.dart + importa: + importato da: + - lib/widgets/settings/video/subtitle_sample.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/common/map/leaflet/scale_layer.dart + - lib/widgets/viewer/visual/video/subtitle/subtitle.dart + - lib/widgets/dialogs/export_collection_stats_page.dart + - lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart + - lib/widgets/stats/percent_text.dart + +lib/widgets/common/basic/text_dropdown_button.dart + importa: + importato da: + - lib/widgets/dialogs/convert_entry_dialog.dart + - lib/widgets/dialogs/tile_view_dialog.dart + - lib/widgets/dialogs/export_collection_stats_page.dart + - lib/widgets/dialogs/video_stream_selection_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + +lib/widgets/common/basic/time_shift_selector.dart + importa: + - lib/ref/locales.dart + - lib/utils/time_utils.dart + - lib/widgets/common/basic/wheel.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/dialogs/time_shift_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + +lib/widgets/common/basic/tv_edge_focus.dart + importa: + - lib/model/settings/settings.dart + importato da: + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/stats/stats_page.dart + +lib/widgets/common/basic/wheel.dart + importa: + - lib/theme/durations.dart + importato da: + - lib/widgets/common/basic/time_shift_selector.dart + - lib/widgets/dialogs/duration_dialog.dart + +lib/widgets/common/behaviour/eager_scale_gesture_recognizer.dart + importa: + importato da: + - lib/widgets/common/grid/scaling.dart + +lib/widgets/common/behaviour/intents.dart + importa: + importato da: + - lib/widgets/about/tv_license_page.dart + - lib/widgets/viewer/info/metadata/tv_page.dart + +lib/widgets/common/behaviour/known_extent_scroll_physics.dart + importa: + importato da: + - lib/widgets/common/thumbnail/scroller.dart + +lib/widgets/common/behaviour/pop/double_back.dart + importa: + - lib/model/settings/settings.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/widgets/common/behaviour/pop/scope.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/collection/collection_page.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/common/search/page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/common/behaviour/pop/scope.dart + importa: + importato da: + - lib/widgets/aves_app.dart + - lib/widgets/settings/settings_tv_page.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/about/about_tv_page.dart + - lib/widgets/common/search/page.dart + - lib/widgets/common/behaviour/pop/double_back.dart + - lib/widgets/common/behaviour/pop/tv_navigation.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/common/behaviour/pop/tv_navigation.dart + importa: + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/behaviour/pop/scope.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/settings/settings_tv_page.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/about/about_tv_page.dart + - lib/widgets/common/search/page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/common/behaviour/route_tracker.dart + importa: + - lib/services/common/services.dart + importato da: + - lib/widgets/aves_app.dart + +lib/widgets/common/behaviour/routes.dart + importa: + importato da: + - lib/widgets/aves_app.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/viewer/info/embedded/embedded_data_opener.dart + - lib/widgets/map/map_page.dart + +lib/widgets/common/behaviour/sloppy_scroll_physics.dart + importa: + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/common/behaviour/springy_scroll_physics.dart + importa: + importato da: + - lib/widgets/viewer/entry_vertical_pager.dart + +lib/widgets/common/expandable_filter_row.dart + importa: + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/theme/styles.dart + - lib/widgets/common/identity/aves_filter_chip.dart + importato da: + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + +lib/widgets/common/extensions/build_context.dart + importa: + - lib/l10n/l10n.dart + importato da: + - lib/model/filters/type.dart + - lib/model/filters/favourite.dart + - lib/model/filters/missing.dart + - lib/model/filters/placeholder.dart + - lib/model/filters/trash.dart + - lib/model/filters/recent.dart + - lib/model/filters/rating.dart + - lib/model/filters/weekday.dart + - lib/model/filters/mime.dart + - lib/model/filters/aspect_ratio.dart + - lib/model/filters/date.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/covered/location.dart + - lib/model/settings/enums/coordinate_format.dart + - lib/view/src/wallpaper_target.dart + - lib/view/src/settings/enums.dart + - lib/view/src/settings/thumbnail_overlay_tag_icon.dart + - lib/view/src/settings/thumbnail_overlay_location_icon.dart + - lib/view/src/source/album.dart + - lib/view/src/source/group.dart + - lib/view/src/source/sort.dart + - lib/view/src/source/layout.dart + - lib/view/src/source/vault.dart + - lib/view/src/storage/volume.dart + - lib/view/src/actions/explorer.dart + - lib/view/src/actions/map_cluster.dart + - lib/view/src/actions/entry_set.dart + - lib/view/src/actions/map.dart + - lib/view/src/actions/slideshow.dart + - lib/view/src/actions/chip.dart + - lib/view/src/actions/chip_set.dart + - lib/view/src/actions/share.dart + - lib/view/src/actions/entry.dart + - lib/view/src/metadata/length_unit.dart + - lib/view/src/metadata/exportable_fields.dart + - lib/view/src/metadata/location_edit_action.dart + - lib/view/src/metadata/convert_action.dart + - lib/view/src/metadata/date_field_source.dart + - lib/view/src/metadata/date_edit_action.dart + - lib/view/src/editor/enums.dart + - lib/services/media/enums.dart + - lib/widgets/welcome_page.dart + - lib/widgets/aves_app.dart + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/settings_tv_page.dart + - lib/widgets/settings/settings_search_delegate.dart + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/settings/screen_saver_settings_page.dart + - lib/widgets/settings/video/control_actions.dart + - lib/widgets/settings/video/subtitle_theme.dart + - lib/widgets/settings/video/subtitle_sample.dart + - lib/widgets/settings/video/video.dart + - lib/widgets/settings/video/playback.dart + - lib/widgets/settings/video/controls.dart + - lib/widgets/settings/video/video_settings_page.dart + - lib/widgets/settings/privacy/access_grants_page.dart + - lib/widgets/settings/privacy/hidden_items_page.dart + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/settings/navigation/drawer_tab_fixed.dart + - lib/widgets/settings/navigation/drawer_editor_banner.dart + - lib/widgets/settings/navigation/confirmation_dialogs.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/settings/navigation/navigation.dart + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/settings/navigation/drawer_tab_albums.dart + - lib/widgets/settings/language/locale_tile.dart + - lib/widgets/settings/language/locale_selection_page.dart + - lib/widgets/settings/language/language.dart + - lib/widgets/settings/app_export/selection_dialog.dart + - lib/widgets/settings/app_export/items.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/common/collection_tile.dart + - lib/widgets/settings/common/quick_actions/editor_page.dart + - lib/widgets/settings/viewer/slideshow.dart + - lib/widgets/settings/viewer/viewer_actions_editor.dart + - lib/widgets/settings/viewer/viewer.dart + - lib/widgets/settings/viewer/overlay.dart + - lib/widgets/settings/display/display.dart + - lib/widgets/settings/accessibility/accessibility.dart + - lib/widgets/settings/accessibility/time_to_take_action.dart + - lib/widgets/settings/thumbnails/collection_actions_editor_page.dart + - lib/widgets/settings/thumbnails/thumbnails.dart + - lib/widgets/settings/thumbnails/overlay.dart + - lib/widgets/home/home_error.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/query_bar.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/draggable_thumb_label.dart + - lib/widgets/collection/loading.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/collection/grid/list_details.dart + - lib/widgets/collection/grid/list_details_theme.dart + - lib/widgets/collection/grid/headers/album.dart + - lib/widgets/collection/grid/headers/date.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/drawer/page_nav_tile.dart + - lib/widgets/navigation/drawer/collection_nav_tile.dart + - lib/widgets/navigation/nav_bar/nav_bar.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/about/about_tv_page.dart + - lib/widgets/about/app_ref.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/about/licenses.dart + - lib/widgets/about/translators.dart + - lib/widgets/about/policy_page.dart + - lib/widgets/about/about_mobile_page.dart + - lib/widgets/about/data_usage.dart + - lib/widgets/about/credits.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/identity/aves_icons.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/action_mixins/size_aware.dart + - lib/widgets/common/action_mixins/entry_editor.dart + - lib/widgets/common/basic/query_bar.dart + - lib/widgets/common/basic/time_shift_selector.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/list_tiles/color.dart + - lib/widgets/common/basic/draggable_scrollbar/transition.dart + - lib/widgets/common/app_bar/app_bar_subtitle.dart + - lib/widgets/common/search/delegate.dart + - lib/widgets/common/map/map_action_delegate.dart + - lib/widgets/common/map/attribution.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/common/map/buttons/panel.dart + - lib/widgets/common/action_controls/quick_choosers/tag_chooser.dart + - lib/widgets/common/action_controls/quick_choosers/album_chooser.dart + - lib/widgets/common/action_controls/quick_choosers/rate_chooser.dart + - lib/widgets/common/action_controls/togglers/favourite.dart + - lib/widgets/common/action_controls/togglers/play.dart + - lib/widgets/common/action_controls/togglers/title_search.dart + - lib/widgets/common/action_controls/togglers/mute.dart + - lib/widgets/common/behaviour/pop/double_back.dart + - lib/widgets/common/behaviour/pop/tv_navigation.dart + - lib/widgets/common/grid/selector.dart + - lib/widgets/common/grid/draggable_thumb_label.dart + - lib/widgets/common/grid/header.dart + - lib/widgets/common/grid/sections/fixed/scale_overlay.dart + - lib/widgets/viewer/source_viewer_page.dart + - lib/widgets/viewer/screen_saver_page.dart + - lib/widgets/viewer/panorama_page.dart + - lib/widgets/viewer/slideshow_page.dart + - lib/widgets/viewer/video/db_playback_state_handler.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/viewer/info/info_search_delegate.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/info/metadata/tv_page.dart + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + - lib/widgets/viewer/info/metadata/xmp_card.dart + - lib/widgets/viewer/info/metadata/xmp_ns/google.dart + - lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart + - lib/widgets/viewer/info/embedded/embedded_data_opener.dart + - lib/widgets/viewer/controls/transitions.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/action/single_entry_editor.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/action/printer.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/visual/error.dart + - lib/widgets/viewer/overlay/selection_button.dart + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/viewer/overlay/locked.dart + - lib/widgets/viewer/overlay/minimap.dart + - lib/widgets/viewer/overlay/wallpaper_buttons.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/viewer/overlay/panorama.dart + - lib/widgets/viewer/overlay/video/ab_repeat.dart + - lib/widgets/viewer/overlay/details/rating_tags.dart + - lib/widgets/viewer/overlay/details/shooting.dart + - lib/widgets/viewer/overlay/details/date.dart + - lib/widgets/map/scroller.dart + - lib/widgets/map/map_page.dart + - lib/widgets/map/date_row.dart + - lib/widgets/dialogs/item_picker.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + - lib/widgets/dialogs/select_storage_dialog.dart + - lib/widgets/dialogs/duration_dialog.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/dialogs/wallpaper_settings_dialog.dart + - lib/widgets/dialogs/time_shift_dialog.dart + - lib/widgets/dialogs/tile_view_dialog.dart + - lib/widgets/dialogs/cast_dialog.dart + - lib/widgets/dialogs/add_shortcut_dialog.dart + - lib/widgets/dialogs/video_speed_dialog.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/dialogs/export_collection_stats_page.dart + - lib/widgets/dialogs/video_stream_selection_dialog.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/filter_editors/create_dynamic_album_dialog.dart + - lib/widgets/dialogs/filter_editors/rename_dynamic_album_dialog.dart + - lib/widgets/dialogs/filter_editors/create_group_dialog.dart + - lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart + - lib/widgets/dialogs/filter_editors/pin_dialog.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + - lib/widgets/dialogs/filter_editors/password_dialog.dart + - lib/widgets/dialogs/filter_editors/rename_stored_album_dialog.dart + - lib/widgets/dialogs/filter_editors/pattern_dialog.dart + - lib/widgets/dialogs/filter_editors/rename_group_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_description_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart + - lib/widgets/dialogs/entry_editors/rename_entry_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + - lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart + - lib/widgets/dialogs/selection_dialogs/multi_selection.dart + - lib/widgets/dialogs/map/style_selection_dialog.dart + - lib/widgets/dialogs/map/style_editor_dialog.dart + - lib/widgets/dialogs/pick_dialogs/app_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/states_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/query_bar.dart + - lib/widgets/filter_grids/common/enums.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/list_details.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/section_keys.dart + - lib/widgets/filter_grids/common/group_crumb_line.dart + - lib/widgets/filter_grids/common/draggable_thumb_label.dart + - lib/widgets/filter_grids/common/list_details_theme.dart + - lib/widgets/filter_grids/common/filter_tile.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/stats/top_page.dart + - lib/widgets/stats/filter_table.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/stats/mime_donut.dart + - lib/widgets/stats/percent_text.dart + - lib/widgets/stats/date/histogram.dart + - lib/widgets/editor/control_panel.dart + - lib/widgets/editor/transform/control_panel.dart + +lib/widgets/common/extensions/geometry.dart + importa: + importato da: + - lib/widgets/editor/transform/cropper.dart + +lib/widgets/common/extensions/media_query.dart + importa: + importato da: + - lib/widgets/settings/settings_page.dart + - lib/widgets/settings/navigation/drawer_tab_fixed.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/nav_bar/nav_bar.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/grid/selector.dart + - lib/widgets/viewer/panorama_page.dart + - lib/widgets/viewer/overlay/locked.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/slideshow_buttons.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/stats/top_page.dart + +lib/widgets/common/extensions/theme.dart + importa: + importato da: + - lib/theme/colors.dart + - lib/widgets/wallpaper_page.dart + - lib/widgets/settings/common/tile_leading.dart + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/common/identity/aves_icons.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/common/fx/borders.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/overlay_snack_bar.dart + - lib/widgets/common/app_bar/app_bar_subtitle.dart + - lib/widgets/common/grid/sections/mosaic/scale_overlay.dart + - lib/widgets/common/grid/sections/fixed/scale_overlay.dart + - lib/widgets/viewer/entry_viewer_page.dart + - lib/widgets/viewer/entry_viewer_page_dlna.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/overlay/video/progress_bar.dart + - lib/widgets/viewer/overlay/details/details.dart + - lib/widgets/dialogs/item_picker.dart + - lib/widgets/stats/percent_text.dart + +lib/widgets/common/fx/blurred.dart + importa: + importato da: + - lib/widgets/common/identity/aves_app_bar.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/common/map/buttons/coordinate_filter.dart + - lib/widgets/common/action_controls/quick_choosers/common/quick_chooser.dart + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/viewer/overlay/video/progress_bar.dart + +lib/widgets/common/fx/borders.dart + importa: + - lib/widgets/common/extensions/theme.dart + importato da: + - lib/widgets/settings/video/subtitle_sample.dart + - lib/widgets/collection/grid/list_details.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/common/thumbnail/decorated.dart + - lib/widgets/common/identity/aves_logo.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/common/basic/markdown_container.dart + - lib/widgets/common/basic/color_indicator.dart + - lib/widgets/common/map/decorator.dart + - lib/widgets/common/action_controls/quick_choosers/common/quick_chooser.dart + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/viewer/overlay/video/progress_bar.dart + - lib/widgets/dialogs/item_picker.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + - lib/widgets/filter_grids/common/list_details.dart + +lib/widgets/common/fx/checkered_decoration.dart + importa: + importato da: + - lib/widgets/settings/viewer/entry_background.dart + - lib/widgets/common/thumbnail/image.dart + - lib/widgets/viewer/visual/vector.dart + - lib/widgets/viewer/visual/raster.dart + +lib/widgets/common/fx/colors.dart + importa: + importato da: + - lib/widgets/common/identity/aves_logo.dart + +lib/widgets/common/fx/dashed_path_painter.dart + importa: + importato da: + - lib/widgets/editor/transform/cropper.dart + +lib/widgets/common/fx/highlight_decoration.dart + importa: + importato da: + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart + +lib/widgets/common/fx/sweeper.dart + importa: + - lib/theme/durations.dart + importato da: + - lib/widgets/common/thumbnail/overlay.dart + - lib/widgets/common/action_controls/togglers/favourite.dart + - lib/widgets/filter_grids/common/overlay.dart + +lib/widgets/common/fx/transition_image.dart + importa: + importato da: + - lib/widgets/common/thumbnail/image.dart + +lib/widgets/common/fx/transitions.dart + importa: + importato da: + - lib/widgets/dialogs/convert_entry_dialog.dart + - lib/widgets/dialogs/tile_view_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + - lib/widgets/stats/date/histogram.dart + +lib/widgets/common/grid/draggable_thumb_label.dart + importa: + - lib/theme/format.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/grid/sections/list_layout.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/draggable_thumb_label.dart + - lib/widgets/filter_grids/common/draggable_thumb_label.dart + +lib/widgets/common/grid/header.dart + importa: + - lib/model/selection.dart + - lib/model/settings/settings.dart + - lib/model/source/section_keys.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/theme/styles.dart + - lib/widgets/common/basic/gestures/gesture_detector.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/grid/sections/list_layout.dart + importato da: + - lib/widgets/collection/grid/headers/album.dart + - lib/widgets/collection/grid/headers/any.dart + - lib/widgets/collection/grid/headers/rating.dart + - lib/widgets/collection/grid/headers/date.dart + - lib/widgets/filter_grids/common/section_header.dart + +lib/widgets/common/grid/item_tracker.dart + importa: + - lib/model/highlight.dart + - lib/theme/durations.dart + - lib/widgets/common/grid/sections/list_layout.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/common/grid/overlay.dart + importa: + - lib/model/selection.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/widgets/common/identity/aves_icons.dart + importato da: + - lib/widgets/common/thumbnail/decorated.dart + - lib/widgets/filter_grids/common/filter_chip_grid_decorator.dart + +lib/widgets/common/grid/scaling.dart + importa: + - lib/model/highlight.dart + - lib/widgets/common/behaviour/eager_scale_gesture_recognizer.dart + - lib/widgets/common/grid/sections/fixed/scale_overlay.dart + - lib/widgets/common/grid/sections/mosaic/scale_overlay.dart + - lib/widgets/common/grid/sections/section_layout_builder.dart + - lib/widgets/common/grid/theme.dart + - lib/widgets/common/providers/tile_extent_controller_provider.dart + - lib/widgets/common/tile_extent_controller.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/grid/tile.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/filter_tile.dart + +lib/widgets/common/grid/sections/fixed/list_layout.dart + importa: + - lib/model/source/section_keys.dart + - lib/widgets/common/grid/sections/list_layout.dart + importato da: + - lib/widgets/common/grid/sections/fixed/section_layout_builder.dart + +lib/widgets/common/grid/sections/fixed/row.dart + importa: + importato da: + - lib/widgets/common/grid/sections/fixed/section_layout_builder.dart + +lib/widgets/common/grid/sections/fixed/scale_grid.dart + importa: + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/common/grid/sections/fixed/scale_overlay.dart + importa: + - lib/theme/durations.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/theme.dart + - lib/widgets/common/providers/media_query_data_provider.dart + importato da: + - lib/widgets/common/grid/scaling.dart + +lib/widgets/common/grid/sections/fixed/section_layout.dart + importa: + - lib/widgets/common/grid/sections/section_layout.dart + importato da: + - lib/widgets/common/grid/sections/fixed/section_layout_builder.dart + +lib/widgets/common/grid/sections/fixed/section_layout_builder.dart + importa: + - lib/model/source/section_keys.dart + - lib/widgets/common/grid/sections/fixed/list_layout.dart + - lib/widgets/common/grid/sections/fixed/row.dart + - lib/widgets/common/grid/sections/fixed/section_layout.dart + - lib/widgets/common/grid/sections/list_layout.dart + - lib/widgets/common/grid/sections/section_layout.dart + - lib/widgets/common/grid/sections/section_layout_builder.dart + importato da: + - lib/widgets/common/grid/sections/provider.dart + +lib/widgets/common/grid/sections/list_layout.dart + importa: + - lib/model/source/section_keys.dart + - lib/widgets/common/grid/sections/section_layout.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/draggable_thumb_label.dart + - lib/widgets/common/grid/selector.dart + - lib/widgets/common/grid/draggable_thumb_label.dart + - lib/widgets/common/grid/header.dart + - lib/widgets/common/grid/sliver.dart + - lib/widgets/common/grid/item_tracker.dart + - lib/widgets/common/grid/sections/provider.dart + - lib/widgets/common/grid/sections/section_layout_builder.dart + - lib/widgets/common/grid/sections/mosaic/list_layout.dart + - lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart + - lib/widgets/common/grid/sections/fixed/list_layout.dart + - lib/widgets/common/grid/sections/fixed/section_layout_builder.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/common/grid/sections/mosaic/list_layout.dart + importa: + - lib/model/source/section_keys.dart + - lib/widgets/common/grid/sections/list_layout.dart + - lib/widgets/common/grid/sections/mosaic/section_layout.dart + - lib/widgets/common/grid/sections/section_layout.dart + importato da: + - lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart + +lib/widgets/common/grid/sections/mosaic/row.dart + importa: + - lib/widgets/common/grid/sections/mosaic/section_layout.dart + importato da: + - lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart + +lib/widgets/common/grid/sections/mosaic/scale_grid.dart + importa: + - lib/theme/durations.dart + - lib/widgets/common/grid/sections/mosaic/scale_overlay.dart + - lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart + importato da: + - lib/widgets/common/grid/sections/mosaic/scale_overlay.dart + +lib/widgets/common/grid/sections/mosaic/scale_overlay.dart + importa: + - lib/theme/durations.dart + - lib/widgets/common/extensions/theme.dart + - lib/widgets/common/grid/sections/mosaic/scale_grid.dart + - lib/widgets/common/providers/media_query_data_provider.dart + importato da: + - lib/widgets/common/grid/scaling.dart + - lib/widgets/common/grid/sections/mosaic/scale_grid.dart + +lib/widgets/common/grid/sections/mosaic/section_layout.dart + importa: + - lib/widgets/common/grid/sections/section_layout.dart + importato da: + - lib/widgets/common/grid/sections/mosaic/list_layout.dart + - lib/widgets/common/grid/sections/mosaic/row.dart + - lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart + +lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart + importa: + - lib/model/source/section_keys.dart + - lib/widgets/common/grid/sections/list_layout.dart + - lib/widgets/common/grid/sections/mosaic/list_layout.dart + - lib/widgets/common/grid/sections/mosaic/row.dart + - lib/widgets/common/grid/sections/mosaic/section_layout.dart + - lib/widgets/common/grid/sections/provider.dart + - lib/widgets/common/grid/sections/section_layout.dart + - lib/widgets/common/grid/sections/section_layout_builder.dart + importato da: + - lib/widgets/common/thumbnail/image.dart + - lib/widgets/common/thumbnail/decorated.dart + - lib/widgets/common/grid/sections/provider.dart + - lib/widgets/common/grid/sections/mosaic/scale_grid.dart + +lib/widgets/common/grid/sections/provider.dart + importa: + - lib/model/source/section_keys.dart + - lib/widgets/common/grid/sections/fixed/section_layout_builder.dart + - lib/widgets/common/grid/sections/list_layout.dart + - lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart + - lib/widgets/common/grid/sections/section_layout_builder.dart + importato da: + - lib/widgets/collection/grid/section_layout.dart + - lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart + - lib/widgets/filter_grids/common/section_layout.dart + +lib/widgets/common/grid/sections/section_layout.dart + importa: + - lib/model/source/section_keys.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/common/grid/sliver.dart + - lib/widgets/common/grid/sections/list_layout.dart + - lib/widgets/common/grid/sections/section_layout_builder.dart + - lib/widgets/common/grid/sections/mosaic/section_layout.dart + - lib/widgets/common/grid/sections/mosaic/list_layout.dart + - lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart + - lib/widgets/common/grid/sections/fixed/section_layout.dart + - lib/widgets/common/grid/sections/fixed/section_layout_builder.dart + +lib/widgets/common/grid/sections/section_layout_builder.dart + importa: + - lib/model/source/section_keys.dart + - lib/theme/durations.dart + - lib/widgets/common/grid/sections/list_layout.dart + - lib/widgets/common/grid/sections/section_layout.dart + importato da: + - lib/widgets/common/grid/scaling.dart + - lib/widgets/common/grid/sections/provider.dart + - lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart + - lib/widgets/common/grid/sections/fixed/section_layout_builder.dart + +lib/widgets/common/grid/selector.dart + importa: + - lib/model/selection.dart + - lib/model/settings/settings.dart + - lib/utils/math_utils.dart + - lib/widgets/common/basic/gestures/gesture_detector.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/media_query.dart + - lib/widgets/common/grid/sections/list_layout.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/common/grid/sliver.dart + importa: + - lib/widgets/common/grid/sections/list_layout.dart + - lib/widgets/common/grid/sections/section_layout.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/common/grid/theme.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/favourites.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/settings/settings.dart + - lib/widgets/common/identity/aves_icons.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/common/thumbnail/scroller.dart + - lib/widgets/common/thumbnail/overlay.dart + - lib/widgets/common/identity/aves_icons.dart + - lib/widgets/common/grid/scaling.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/common/hybrid_frame.dart + importa: + importato da: + - lib/widgets/collection/collection_grid.dart + +lib/widgets/common/identity/aves_app_bar.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/durations.dart + - lib/theme/themes.dart + - lib/widgets/aves_app.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/basic/gestures/ink_well.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/fx/blurred.dart + importato da: + - lib/widgets/collection/filter_bar.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/navigation/nav_bar/nav_bar.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/common/search/page.dart + - lib/widgets/filter_grids/common/app_bar.dart + +lib/widgets/common/identity/aves_caption.dart + importa: + - lib/theme/durations.dart + - lib/widgets/common/basic/text/change_highlight.dart + importato da: + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/common/collection_tile.dart + - lib/widgets/dialogs/tile_view_dialog.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + +lib/widgets/common/identity/aves_donut.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/theme/themes.dart + importato da: + - lib/widgets/about/data_usage.dart + - lib/widgets/stats/mime_donut.dart + +lib/widgets/common/identity/aves_expansion_tile.dart + importa: + - lib/theme/durations.dart + - lib/theme/themes.dart + - lib/widgets/common/identity/highlight_title.dart + importato da: + - lib/widgets/settings/settings_definition.dart + - lib/widgets/home/home_error.dart + - lib/widgets/about/licenses.dart + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + - lib/widgets/viewer/debug/metadata.dart + - lib/widgets/debug/leaking.dart + - lib/widgets/debug/colors.dart + - lib/widgets/debug/os_codecs.dart + - lib/widgets/debug/os_paths.dart + - lib/widgets/debug/cache.dart + - lib/widgets/debug/database.dart + - lib/widgets/debug/general.dart + - lib/widgets/debug/os_storage.dart + - lib/widgets/debug/capabilities.dart + - lib/widgets/debug/os_apps.dart + - lib/widgets/debug/settings.dart + - lib/widgets/debug/report.dart + +lib/widgets/common/identity/aves_fab.dart + importa: + - lib/theme/icons.dart + importato da: + - lib/widgets/collection/collection_page.dart + +lib/widgets/common/identity/aves_filter_chip.dart + importa: + - lib/app_mode.dart + - lib/model/covers.dart + - lib/model/filters/filters.dart + - lib/model/filters/rating.dart + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/settings.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/theme/themes.dart + - lib/view/view.dart + - lib/widgets/collection/filter_bar.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/basic/gestures/ink_well.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + importato da: + - lib/widgets/home_widget.dart + - lib/widgets/settings/privacy/hidden_items_page.dart + - lib/widgets/settings/common/tile_leading.dart + - lib/widgets/collection/filter_bar.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/common/expandable_filter_row.dart + - lib/widgets/common/map/buttons/coordinate_filter.dart + - lib/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/viewer/info/common.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/list_details_theme.dart + - lib/widgets/filter_grids/common/filter_tile.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/stats/top_page.dart + - lib/widgets/stats/filter_table.dart + - lib/widgets/stats/mime_donut.dart + - lib/widgets/stats/date/histogram.dart + +lib/widgets/common/identity/aves_icons.dart + importa: + - lib/image_providers/app_icon_image_provider.dart + - lib/model/covers.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/vaults/vaults.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/theme.dart + - lib/widgets/common/grid/theme.dart + importato da: + - lib/model/filters/covered/stored_album.dart + - lib/widgets/settings/thumbnails/overlay.dart + - lib/widgets/collection/grid/headers/album.dart + - lib/widgets/common/grid/overlay.dart + - lib/widgets/common/grid/theme.dart + +lib/widgets/common/identity/aves_logo.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/common/fx/borders.dart + - lib/widgets/common/fx/colors.dart + importato da: + - lib/widgets/welcome_page.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/about/app_ref.dart + +lib/widgets/common/identity/buttons/captioned_button.dart + importa: + - lib/widgets/common/identity/buttons/overlay_button.dart + importato da: + - lib/widgets/settings/common/quick_actions/editor_page.dart + - lib/widgets/settings/common/quick_actions/available_actions.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/common/action_controls/togglers/favourite.dart + - lib/widgets/common/action_controls/togglers/play.dart + - lib/widgets/common/action_controls/togglers/title_search.dart + - lib/widgets/common/action_controls/togglers/mute.dart + - lib/widgets/viewer/overlay/slideshow_buttons.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/editor/transform/control_panel.dart + +lib/widgets/common/identity/buttons/outlined_button.dart + importa: + importato da: + - lib/widgets/welcome_page.dart + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/settings/navigation/drawer_tab_albums.dart + - lib/widgets/home/home_error.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/about/about_tv_page.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/about/licenses.dart + - lib/widgets/about/data_usage.dart + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + - lib/widgets/viewer/info/metadata/metadata_section.dart + - lib/widgets/dialogs/export_collection_stats_page.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + - lib/widgets/dialogs/map/style_selection_dialog.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + +lib/widgets/common/identity/buttons/overlay_button.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/themes.dart + - lib/widgets/common/extensions/theme.dart + - lib/widgets/common/fx/blurred.dart + - lib/widgets/common/fx/borders.dart + importato da: + - lib/widgets/settings/video/control_actions.dart + - lib/widgets/settings/common/quick_actions/editor_page.dart + - lib/widgets/settings/common/quick_actions/quick_actions.dart + - lib/widgets/settings/common/quick_actions/available_actions.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/common/map/buttons/button.dart + - lib/widgets/viewer/panorama_page.dart + - lib/widgets/viewer/overlay/selection_button.dart + - lib/widgets/viewer/overlay/locked.dart + - lib/widgets/viewer/overlay/slideshow_buttons.dart + - lib/widgets/viewer/overlay/wallpaper_buttons.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/viewer/overlay/panorama.dart + - lib/widgets/viewer/overlay/video/video.dart + - lib/widgets/viewer/overlay/video/ab_repeat.dart + - lib/widgets/viewer/overlay/video/controls.dart + - lib/widgets/editor/control_panel.dart + - lib/widgets/editor/transform/control_panel.dart + +lib/widgets/common/identity/empty.dart + importa: + - lib/theme/durations.dart + - lib/widgets/common/extensions/media_query.dart + importato da: + - lib/widgets/settings/settings_search_delegate.dart + - lib/widgets/settings/privacy/access_grants_page.dart + - lib/widgets/settings/privacy/hidden_items_page.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/loading.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/viewer/screen_saver_page.dart + - lib/widgets/viewer/slideshow_page.dart + - lib/widgets/viewer/info/info_search_delegate.dart + - lib/widgets/viewer/visual/error.dart + - lib/widgets/map/scroller.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/states_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/stats/stats_page.dart + +lib/widgets/common/identity/highlight_title.dart + importa: + - lib/model/settings/settings.dart + - lib/ref/locales.dart + - lib/theme/colors.dart + - lib/theme/themes.dart + - lib/widgets/common/basic/text/outlined.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/theme.dart + - lib/widgets/common/fx/highlight_decoration.dart + importato da: + - lib/widgets/settings/settings_search_delegate.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/viewer/info/metadata/xmp_card.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + - lib/widgets/dialogs/tile_view_dialog.dart + - lib/widgets/dialogs/export_collection_stats_page.dart + - lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart + - lib/widgets/debug/os_codecs.dart + - lib/widgets/debug/capabilities.dart + +lib/widgets/common/identity/scroll_thumb.dart + importa: + - lib/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart + - lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/common/map/attribution.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/text.dart + - lib/widgets/aves_app.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/common/map/geo_map.dart + +lib/widgets/common/map/buttons/button.dart + importa: + - lib/widgets/common/identity/buttons/overlay_button.dart + importato da: + - lib/widgets/common/map/buttons/panel.dart + +lib/widgets/common/map/buttons/coordinate_filter.dart + importa: + - lib/model/filters/coordinate.dart + - lib/model/settings/settings.dart + - lib/theme/durations.dart + - lib/theme/themes.dart + - lib/utils/debouncer.dart + - lib/widgets/common/fx/blurred.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/viewer/controls/notifications.dart + importato da: + - lib/widgets/common/map/buttons/panel.dart + +lib/widgets/common/map/buttons/panel.dart + importa: + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/settings.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/view/view.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/map/buttons/button.dart + - lib/widgets/common/map/buttons/coordinate_filter.dart + - lib/widgets/common/map/compass.dart + - lib/widgets/common/map/map_action_delegate.dart + - lib/widgets/common/providers/map_theme_provider.dart + importato da: + - lib/widgets/common/map/geo_map.dart + +lib/widgets/common/map/compass.dart + importa: + importato da: + - lib/widgets/common/map/buttons/panel.dart + +lib/widgets/common/map/decorator.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/common/fx/borders.dart + - lib/widgets/common/providers/map_theme_provider.dart + importato da: + - lib/widgets/common/map/geo_map.dart + +lib/widgets/common/map/geo_map.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/images.dart + - lib/model/entry/extensions/location.dart + - lib/model/entry/sort.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/ref/poi.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/utils/math_utils.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/common/map/attribution.dart + - lib/widgets/common/map/buttons/panel.dart + - lib/widgets/common/map/decorator.dart + - lib/widgets/common/map/leaflet/map.dart + - lib/widgets/common/map/map_action_delegate.dart + - lib/widgets/common/thumbnail/image.dart + - lib/remote/remote_origin.dart + - lib/remote/remote_image_tile.dart + importato da: + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + +lib/widgets/common/map/leaflet/latlng_tween.dart + importa: + - lib/widgets/common/map/leaflet/latlng_utils.dart + importato da: + +lib/widgets/common/map/leaflet/latlng_utils.dart + importa: + importato da: + - lib/widgets/common/map/leaflet/latlng_tween.dart + +lib/widgets/common/map/leaflet/map.dart + importa: + - lib/model/device.dart + - lib/model/settings/settings.dart + - lib/theme/durations.dart + - lib/utils/debouncer.dart + - lib/widgets/common/basic/gestures/gesture_detector.dart + - lib/widgets/common/map/leaflet/scale_layer.dart + - lib/widgets/common/map/leaflet/tile_layers.dart + importato da: + - lib/widgets/common/map/geo_map.dart + +lib/widgets/common/map/leaflet/scale_layer.dart + importa: + - lib/widgets/common/basic/text/outlined.dart + importato da: + - lib/widgets/common/map/leaflet/map.dart + +lib/widgets/common/map/leaflet/tile_layers.dart + importa: + - lib/services/common/services.dart + - lib/widgets/common/map/leaflet/vector_style_reader_extra.dart + importato da: + - lib/widgets/common/map/leaflet/map.dart + +lib/widgets/common/map/leaflet/vector_style_reader_extra.dart + importa: + importato da: + - lib/widgets/common/map/leaflet/tile_layers.dart + +lib/widgets/common/map/map_action_delegate.dart + importa: + - lib/geo/uri.dart + - lib/model/device.dart + - lib/model/entry/entry.dart + - lib/model/source/collection_lens.dart + - lib/services/common/services.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/add_shortcut_dialog.dart + - lib/widgets/dialogs/map/style_selection_dialog.dart + - lib/widgets/map/map_page.dart + importato da: + - lib/widgets/common/map/geo_map.dart + - lib/widgets/common/map/buttons/panel.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/map/map_page.dart + +lib/widgets/common/providers/durations_provider.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/durations.dart + importato da: + - lib/widgets/aves_app.dart + +lib/widgets/common/providers/filter_group_provider.dart + importa: + importato da: + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/widgets/common/providers/highlight_info_provider.dart + importa: + - lib/model/highlight.dart + importato da: + - lib/widgets/aves_app.dart + - lib/widgets/map/map_page.dart + +lib/widgets/common/providers/map_theme_provider.dart + importa: + - lib/model/settings/settings.dart + importato da: + - lib/widgets/common/map/decorator.dart + - lib/widgets/common/map/buttons/panel.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + +lib/widgets/common/providers/media_query_data_provider.dart + importa: + importato da: + - lib/widgets/aves_app.dart + - lib/widgets/settings/settings_search_delegate.dart + - lib/widgets/settings/common/quick_actions/quick_actions.dart + - lib/widgets/settings/common/quick_actions/available_actions.dart + - lib/widgets/common/thumbnail/image.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/action_controls/quick_choosers/move_button.dart + - lib/widgets/common/action_controls/quick_choosers/tag_button.dart + - lib/widgets/common/grid/sections/mosaic/scale_overlay.dart + - lib/widgets/common/grid/sections/fixed/scale_overlay.dart + - lib/widgets/viewer/info/info_search_delegate.dart + - lib/widgets/dialogs/duration_dialog.dart + - lib/widgets/dialogs/add_shortcut_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_description_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + +lib/widgets/common/providers/query_provider.dart + importa: + - lib/model/query.dart + importato da: + - lib/widgets/collection/collection_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + +lib/widgets/common/providers/selection_provider.dart + importa: + - lib/model/selection.dart + importato da: + - lib/widgets/collection/collection_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + +lib/widgets/common/providers/tile_extent_controller_provider.dart + importa: + - lib/widgets/common/tile_extent_controller.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/common/grid/scaling.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/common/providers/viewer_entry_provider.dart + importa: + - lib/model/entry/entry.dart + importato da: + - lib/widgets/aves_app.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/grid/tile.dart + - lib/widgets/viewer/entry_viewer_stack.dart + +lib/widgets/common/search/delegate.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/search/route.dart + importato da: + - lib/widgets/settings/settings_search_delegate.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/common/search/page.dart + - lib/widgets/common/search/route.dart + - lib/widgets/viewer/info/info_search_delegate.dart + +lib/widgets/common/search/page.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/durations.dart + - lib/theme/themes.dart + - lib/utils/debouncer.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/behaviour/pop/double_back.dart + - lib/widgets/common/behaviour/pop/scope.dart + - lib/widgets/common/behaviour/pop/tv_navigation.dart + - lib/widgets/common/identity/aves_app_bar.dart + - lib/widgets/common/search/delegate.dart + - lib/widgets/common/search/route.dart + importato da: + - lib/model/settings/settings.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/home/home_page.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/common/search/route.dart + +lib/widgets/common/search/route.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/common/search/delegate.dart + - lib/widgets/common/search/page.dart + importato da: + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/common/search/page.dart + - lib/widgets/common/search/delegate.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/widgets/common/thumbnail/decorated.dart + importa: + - lib/model/entry/entry.dart + - lib/widgets/common/fx/borders.dart + - lib/widgets/common/grid/overlay.dart + - lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart + - lib/widgets/common/thumbnail/image.dart + - lib/widgets/common/thumbnail/notifications.dart + - lib/widgets/common/thumbnail/overlay.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/grid/tile.dart + - lib/widgets/common/thumbnail/scroller.dart + - lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + +lib/widgets/common/thumbnail/error.dart + importa: + - lib/model/entry/entry.dart + - lib/theme/icons.dart + - lib/theme/themes.dart + - lib/utils/mime_utils.dart + importato da: + - lib/widgets/common/thumbnail/image.dart + +lib/widgets/common/thumbnail/image.dart + importa: + - lib/image_providers/thumbnail_provider.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/images.dart + - lib/model/entry/extensions/props.dart + - lib/model/settings/enums/entry_background.dart + - lib/model/settings/settings.dart + - lib/services/common/services.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/fx/checkered_decoration.dart + - lib/widgets/common/fx/transition_image.dart + - lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/common/thumbnail/error.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/common/thumbnail/decorated.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/viewer/visual/video/cover.dart + - lib/widgets/dialogs/item_picker.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + +lib/widgets/common/thumbnail/notifications.dart + importa: + - lib/model/entry/entry.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/grid/tile.dart + - lib/widgets/common/thumbnail/decorated.dart + +lib/widgets/common/thumbnail/overlay.dart + importa: + - lib/model/entry/entry.dart + - lib/model/highlight.dart + - lib/model/selection.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/widgets/common/fx/sweeper.dart + - lib/widgets/common/grid/theme.dart + importato da: + - lib/widgets/common/thumbnail/decorated.dart + +lib/widgets/common/thumbnail/scroller.dart + importa: + - lib/model/entry/entry.dart + - lib/theme/durations.dart + - lib/widgets/common/behaviour/known_extent_scroll_physics.dart + - lib/widgets/common/grid/theme.dart + - lib/widgets/common/thumbnail/decorated.dart + - lib/remote/remote_origin.dart + - lib/remote/remote_image_tile.dart + importato da: + - lib/widgets/viewer/overlay/thumbnail_preview.dart + - lib/widgets/viewer/overlay/multipage.dart + - lib/widgets/map/scroller.dart + +lib/widgets/common/tile_extent_controller.dart + importa: + - lib/model/settings/settings.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/collection/grid/list_details_theme.dart + - lib/widgets/common/providers/tile_extent_controller_provider.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/grid/scaling.dart + - lib/widgets/dialogs/tile_view_dialog.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/list_details_theme.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/widgets/debug/app_debug_action.dart + importa: + importato da: + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/debug/app_debug_page.dart + importa: + - lib/model/favourites.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/path.dart + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/behaviour/pop/scope.dart + - lib/widgets/common/behaviour/pop/tv_navigation.dart + - lib/widgets/debug/app_debug_action.dart + - lib/widgets/debug/cache.dart + - lib/widgets/debug/capabilities.dart + - lib/widgets/debug/colors.dart + - lib/widgets/debug/database.dart + - lib/widgets/debug/general.dart + - lib/widgets/debug/leaking.dart + - lib/widgets/debug/media_store_scan_dialog.dart + - lib/widgets/debug/os_apps.dart + - lib/widgets/debug/os_codecs.dart + - lib/widgets/debug/os_paths.dart + - lib/widgets/debug/os_storage.dart + - lib/widgets/debug/report.dart + - lib/widgets/debug/settings.dart + importato da: + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/navigation/drawer/tile.dart + - lib/widgets/navigation/drawer/app_drawer.dart + +lib/widgets/debug/cache.dart + importa: + - lib/ref/locales.dart + - lib/services/common/services.dart + - lib/utils/file_utils.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + importato da: + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/debug/capabilities.dart + importa: + - lib/model/device.dart + - lib/services/common/services.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/debug/colors.dart + importa: + - lib/widgets/common/identity/aves_expansion_tile.dart + importato da: + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/debug/database.dart + importa: + - lib/model/covers.dart + - lib/model/dynamic_albums.dart + - lib/model/entry/entry.dart + - lib/model/favourites.dart + - lib/model/metadata/address.dart + - lib/model/metadata/catalog.dart + - lib/model/metadata/trash.dart + - lib/model/vaults/details.dart + - lib/model/vaults/vaults.dart + - lib/model/viewer/video_playback.dart + - lib/ref/locales.dart + - lib/services/common/services.dart + - lib/utils/file_utils.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + importato da: + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/debug/general.dart + importa: + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/services/analysis_service.dart + - lib/services/common/service_policy.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/debug/leaking.dart + importa: + - lib/ref/locales.dart + - lib/utils/file_utils.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + importato da: + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/debug/media_store_scan_dialog.dart + importa: + - lib/ref/mime_types.dart + - lib/services/common/services.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/debug/os_apps.dart + importa: + - lib/image_providers/app_icon_image_provider.dart + - lib/model/app_inventory.dart + - lib/services/common/services.dart + - lib/widgets/common/basic/query_bar.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/debug/os_codecs.dart + importa: + - lib/services/android_debug_service.dart + - lib/widgets/common/basic/query_bar.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/debug/os_paths.dart + importa: + - lib/services/android_debug_service.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/debug/os_storage.dart + importa: + - lib/ref/locales.dart + - lib/services/common/services.dart + - lib/utils/android_file_utils.dart + - lib/utils/file_utils.dart + - lib/view/view.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/debug/report.dart + importa: + - lib/services/android_debug_service.dart + - lib/services/common/services.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/debug/settings.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/debug/app_debug_page.dart + +lib/widgets/dialogs/add_shortcut_dialog.dart + importa: + - lib/model/covers.dart + - lib/model/entry/entry.dart + - lib/model/filters/query.dart + - lib/model/source/collection_lens.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/dialogs/item_picker.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/common/map/map_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + +lib/widgets/dialogs/aves_confirmation_dialog.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/settings/display/display.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/action_mixins/entry_editor.dart + - lib/widgets/viewer/video/db_playback_state_handler.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/entry_editors/tag_editor_page.dart + - lib/widgets/dialogs/map/style_selection_dialog.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/widgets/dialogs/aves_dialog.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/themes.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/settings/app_export/selection_dialog.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/action_mixins/size_aware.dart + - lib/widgets/common/basic/list_tiles/color.dart + - lib/widgets/common/action_controls/quick_choosers/common/quick_chooser.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/viewer/info/embedded/embedded_data_opener.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/map/map_page.dart + - lib/widgets/dialogs/select_storage_dialog.dart + - lib/widgets/dialogs/duration_dialog.dart + - lib/widgets/dialogs/wallpaper_settings_dialog.dart + - lib/widgets/dialogs/cast_dialog.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/filter_editors/create_dynamic_album_dialog.dart + - lib/widgets/dialogs/filter_editors/rename_dynamic_album_dialog.dart + - lib/widgets/dialogs/filter_editors/create_group_dialog.dart + - lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart + - lib/widgets/dialogs/filter_editors/pin_dialog.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + - lib/widgets/dialogs/filter_editors/password_dialog.dart + - lib/widgets/dialogs/filter_editors/rename_stored_album_dialog.dart + - lib/widgets/dialogs/filter_editors/pattern_dialog.dart + - lib/widgets/dialogs/filter_editors/rename_group_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_description_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart + - lib/widgets/dialogs/entry_editors/rename_entry_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + - lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart + - lib/widgets/dialogs/selection_dialogs/single_selection.dart + - lib/widgets/dialogs/selection_dialogs/multi_selection.dart + - lib/widgets/dialogs/map/style_editor_dialog.dart + - lib/widgets/debug/media_store_scan_dialog.dart + +lib/widgets/dialogs/cast_dialog.dart + importa: + - lib/widgets/cast/dlna.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/cast/cast_state.dart + - lib/widgets/viewer/controls/controller.dart + +lib/widgets/dialogs/convert_entry_dialog.dart + importa: + - lib/model/app/support.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/settings/settings.dart + - lib/ref/mime_types.dart + - lib/services/media/media_edit_service.dart + - lib/theme/durations.dart + - lib/theme/text.dart + - lib/theme/themes.dart + - lib/utils/mime_utils.dart + - lib/view/view.dart + - lib/widgets/common/basic/list_tiles/slider.dart + - lib/widgets/common/basic/text/change_highlight.dart + - lib/widgets/common/basic/text_dropdown_button.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/fx/transitions.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + +lib/widgets/dialogs/duration_dialog.dart + importa: + - lib/ref/locales.dart + - lib/utils/time_utils.dart + - lib/widgets/common/basic/wheel.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/settings/common/tiles.dart + +lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + importa: + - lib/model/entry/entry.dart + - lib/model/metadata/date_modifier.dart + - lib/model/source/collection_lens.dart + - lib/theme/durations.dart + - lib/theme/format.dart + - lib/theme/icons.dart + - lib/theme/themes.dart + - lib/view/view.dart + - lib/widgets/common/basic/text_dropdown_button.dart + - lib/widgets/common/basic/time_shift_selector.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/fx/transitions.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/dialogs/item_picker.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + importato da: + - lib/widgets/common/action_mixins/entry_editor.dart + +lib/widgets/dialogs/entry_editors/edit_description_dialog.dart + importa: + - lib/model/entry/extensions/metadata_edition.dart + - lib/widgets/common/basic/labeled_checkbox.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/common/action_mixins/entry_editor.dart + +lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/location.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/model/entry/sort.dart + - lib/model/filters/covered/location.dart + - lib/model/metadata/catalog.dart + - lib/model/settings/enums/coordinate_format.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/ref/poi.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/theme/format.dart + - lib/theme/icons.dart + - lib/theme/themes.dart + - lib/view/view.dart + - lib/widgets/aves_app.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/basic/text_dropdown_button.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/fx/transitions.dart + - lib/widgets/common/identity/aves_caption.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/dialogs/item_picker.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + - lib/widgets/dialogs/time_shift_dialog.dart + - lib/widgets/map/map_page.dart + importato da: + - lib/widgets/aves_app.dart + - lib/widgets/common/action_mixins/entry_editor.dart + +lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart + importa: + - lib/model/entry/entry.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/common/action_mixins/entry_editor.dart + +lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart + importa: + - lib/model/settings/settings.dart + - lib/ref/brand_colors.dart + - lib/theme/colors.dart + - lib/theme/durations.dart + - lib/theme/themes.dart + - lib/view/view.dart + - lib/widgets/common/basic/text/outlined.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/fx/highlight_decoration.dart + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/common/action_mixins/entry_editor.dart + +lib/widgets/dialogs/entry_editors/rename_entry_dialog.dart + importa: + - lib/model/entry/entry.dart + - lib/services/common/services.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/viewer/action/entry_action_delegate.dart + +lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart + importa: + - lib/model/entry/entry.dart + - lib/model/naming_pattern.dart + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/settings.dart + - lib/theme/icons.dart + - lib/theme/styles.dart + - lib/view/view.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/basic/popup/expansion_panel.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/grid/theme.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + - lib/widgets/common/thumbnail/decorated.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + +lib/widgets/dialogs/entry_editors/tag_editor_page.dart + importa: + - lib/model/entry/entry.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/filters.dart + - lib/model/filters/placeholder.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/theme/themes.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/expandable_filter_row.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + importato da: + - lib/widgets/common/action_mixins/entry_editor.dart + +lib/widgets/dialogs/export_collection_stats_page.dart + importa: + - lib/ref/mime_types.dart + - lib/theme/themes.dart + - lib/utils/mime_utils.dart + - lib/view/src/metadata/exportable_fields.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/basic/text/outlined.dart + - lib/widgets/common/basic/text_dropdown_button.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + - lib/widgets/common/identity/highlight_title.dart + importato da: + - lib/widgets/stats/stats_page.dart + +lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + importa: + - lib/image_providers/app_icon_image_provider.dart + - lib/model/entry/entry.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/theme/icons.dart + - lib/widgets/common/basic/color_indicator.dart + - lib/widgets/common/basic/list_tiles/color.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/fx/borders.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/dialogs/item_picker.dart + - lib/widgets/dialogs/pick_dialogs/app_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + importato da: + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/widgets/dialogs/filter_editors/create_dynamic_album_dialog.dart + importa: + - lib/model/dynamic_albums.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + +lib/widgets/dialogs/filter_editors/create_group_dialog.dart + importa: + - lib/model/grouping/common.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + +lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart + importa: + - lib/model/source/collection_source.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/utils/android_file_utils.dart + - lib/view/view.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + +lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + importa: + - lib/model/device.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/model/vaults/details.dart + - lib/model/vaults/vaults.dart + - lib/view/view.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_caption.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/dialogs/selection_dialogs/common.dart + - lib/widgets/dialogs/selection_dialogs/single_selection.dart + importato da: + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + +lib/widgets/dialogs/filter_editors/password_dialog.dart + importa: + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/common/action_mixins/vault_aware.dart + +lib/widgets/dialogs/filter_editors/pattern_dialog.dart + importa: + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/common/action_mixins/vault_aware.dart + +lib/widgets/dialogs/filter_editors/pin_dialog.dart + importa: + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/common/action_mixins/vault_aware.dart + +lib/widgets/dialogs/filter_editors/rename_dynamic_album_dialog.dart + importa: + - lib/model/dynamic_albums.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + +lib/widgets/dialogs/filter_editors/rename_group_dialog.dart + importa: + - lib/model/grouping/common.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + +lib/widgets/dialogs/filter_editors/rename_stored_album_dialog.dart + importa: + - lib/services/common/services.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + +lib/widgets/dialogs/item_picker.dart + importa: + - lib/model/entry/entry.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/theme.dart + - lib/widgets/common/fx/borders.dart + - lib/widgets/common/thumbnail/image.dart + importato da: + - lib/widgets/dialogs/add_shortcut_dialog.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + +lib/widgets/dialogs/map/style_editor_dialog.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/dialogs/map/style_selection_dialog.dart + +lib/widgets/dialogs/map/style_selection_dialog.dart + importa: + - lib/model/settings/settings.dart + - lib/services/common/services.dart + - lib/theme/icons.dart + - lib/utils/collection_utils.dart + - lib/view/src/settings/enums.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/dialogs/map/style_editor_dialog.dart + - lib/widgets/dialogs/selection_dialogs/radio_list_tile.dart + importato da: + - lib/widgets/common/map/map_action_delegate.dart + +lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + importa: + - lib/app_mode.dart + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/model/selection.dart + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/settings.dart + - lib/model/source/album.dart + - lib/model/source/collection_source.dart + - lib/model/vaults/details.dart + - lib/model/vaults/vaults.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/view/view.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/common/providers/filter_group_provider.dart + - lib/widgets/common/providers/query_provider.dart + - lib/widgets/common/providers/selection_provider.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/dialogs/filter_editors/create_group_dialog.dart + - lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/enums.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + importato da: + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/settings/navigation/drawer_tab_albums.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + +lib/widgets/dialogs/pick_dialogs/app_pick_page.dart + importa: + - lib/image_providers/app_icon_image_provider.dart + - lib/model/app_inventory.dart + - lib/model/settings/settings.dart + - lib/services/common/services.dart + - lib/widgets/common/basic/list_tiles/reselectable_radio.dart + - lib/widgets/common/basic/query_bar.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + +lib/widgets/dialogs/pick_dialogs/item_pick_page.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/filters/query.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/providers/query_provider.dart + - lib/widgets/common/providers/selection_provider.dart + importato da: + - lib/widgets/dialogs/add_shortcut_dialog.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/dialogs/entry_editors/edit_date_dialog.dart + +lib/widgets/dialogs/pick_dialogs/location_pick_page.dart + importa: + - lib/model/settings/enums/coordinate_format.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/services/common/services.dart + - lib/services/geocoding_service.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/theme/text.dart + - lib/utils/debouncer.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/common/providers/map_theme_provider.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + +lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + importa: + - lib/app_mode.dart + - lib/model/filters/container/tag_group.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/model/selection.dart + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/model/source/tag.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/view/view.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/common/providers/filter_group_provider.dart + - lib/widgets/common/providers/query_provider.dart + - lib/widgets/common/providers/selection_provider.dart + - lib/widgets/dialogs/filter_editors/create_group_dialog.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/enums.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/tags_page.dart + importato da: + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + +lib/widgets/dialogs/select_storage_dialog.dart + importa: + - lib/utils/android_file_utils.dart + - lib/view/view.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + importato da: + - lib/widgets/explorer/app_bar.dart + +lib/widgets/dialogs/selection_dialogs/common.dart + importa: + - lib/theme/durations.dart + - lib/widgets/dialogs/selection_dialogs/single_selection.dart + importato da: + - lib/widgets/settings/common/tiles.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/selection_dialogs/radio_list_tile.dart + - lib/widgets/dialogs/selection_dialogs/single_selection.dart + - lib/widgets/dialogs/selection_dialogs/multi_selection.dart + +lib/widgets/dialogs/selection_dialogs/multi_selection.dart + importa: + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/dialogs/selection_dialogs/common.dart + importato da: + - lib/widgets/settings/common/tiles.dart + +lib/widgets/dialogs/selection_dialogs/radio_list_tile.dart + importa: + - lib/widgets/common/basic/list_tiles/reselectable_radio.dart + - lib/widgets/dialogs/selection_dialogs/common.dart + importato da: + - lib/widgets/dialogs/wallpaper_settings_dialog.dart + - lib/widgets/dialogs/selection_dialogs/single_selection.dart + - lib/widgets/dialogs/map/style_selection_dialog.dart + +lib/widgets/dialogs/selection_dialogs/single_selection.dart + importa: + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/dialogs/selection_dialogs/common.dart + - lib/widgets/dialogs/selection_dialogs/radio_list_tile.dart + importato da: + - lib/widgets/settings/common/tiles.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/selection_dialogs/common.dart + +lib/widgets/dialogs/tile_view_dialog.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/theme/themes.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/basic/text_dropdown_button.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/fx/transitions.dart + - lib/widgets/common/identity/aves_caption.dart + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/common/tile_extent_controller.dart + importato da: + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/widgets/dialogs/time_shift_dialog.dart + importa: + - lib/widgets/common/basic/time_shift_selector.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + +lib/widgets/dialogs/video_speed_dialog.dart + importa: + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/viewer/action/video_action_delegate.dart + +lib/widgets/dialogs/video_stream_selection_dialog.dart + importa: + - lib/ref/languages.dart + - lib/theme/icons.dart + - lib/theme/text.dart + - lib/theme/themes.dart + - lib/widgets/common/basic/text_dropdown_button.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/viewer/action/video_action_delegate.dart + +lib/widgets/dialogs/wallpaper_settings_dialog.dart + importa: + - lib/view/view.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/dialogs/selection_dialogs/radio_list_tile.dart + importato da: + - lib/widgets/viewer/overlay/wallpaper_buttons.dart + +lib/widgets/editor/control_panel.dart + importa: + - lib/model/entry/entry.dart + - lib/theme/durations.dart + - lib/view/view.dart + - lib/widgets/common/basic/multi_cross_fader.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/editor/transform/control_panel.dart + - lib/widgets/editor/transform/controller.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + importato da: + - lib/widgets/editor/entry_editor_page.dart + - lib/widgets/editor/transform/control_panel.dart + +lib/widgets/editor/entry_editor_page.dart + importa: + - lib/model/entry/entry.dart + - lib/model/settings/settings.dart + - lib/model/viewer/view_state.dart + - lib/widgets/editor/control_panel.dart + - lib/widgets/editor/image.dart + - lib/widgets/editor/transform/controller.dart + - lib/widgets/editor/transform/cropper.dart + - lib/widgets/viewer/overlay/minimap.dart + importato da: + - lib/widgets/home/home_page.dart + +lib/widgets/editor/image.dart + importa: + - lib/model/entry/entry.dart + - lib/model/viewer/view_state.dart + - lib/theme/durations.dart + - lib/widgets/editor/transform/controller.dart + - lib/widgets/editor/transform/painter.dart + - lib/widgets/editor/transform/transformation.dart + - lib/widgets/viewer/visual/error.dart + - lib/widgets/viewer/visual/raster.dart + importato da: + - lib/widgets/editor/entry_editor_page.dart + +lib/widgets/editor/transform/control_panel.dart + importa: + - lib/model/entry/entry.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/view/view.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/editor/control_panel.dart + - lib/widgets/editor/transform/controller.dart + - lib/widgets/editor/transform/transformation.dart + importato da: + - lib/widgets/editor/control_panel.dart + +lib/widgets/editor/transform/controller.dart + importa: + - lib/widgets/editor/transform/crop_region.dart + - lib/widgets/editor/transform/transformation.dart + importato da: + - lib/widgets/viewer/overlay/minimap.dart + - lib/widgets/editor/image.dart + - lib/widgets/editor/entry_editor_page.dart + - lib/widgets/editor/control_panel.dart + - lib/widgets/editor/transform/cropper.dart + - lib/widgets/editor/transform/control_panel.dart + +lib/widgets/editor/transform/crop_region.dart + importa: + importato da: + - lib/widgets/editor/transform/transformation.dart + - lib/widgets/editor/transform/cropper.dart + - lib/widgets/editor/transform/controller.dart + +lib/widgets/editor/transform/cropper.dart + importa: + - lib/model/viewer/view_state.dart + - lib/theme/durations.dart + - lib/widgets/common/extensions/geometry.dart + - lib/widgets/common/fx/dashed_path_painter.dart + - lib/widgets/editor/transform/controller.dart + - lib/widgets/editor/transform/crop_region.dart + - lib/widgets/editor/transform/handles.dart + - lib/widgets/editor/transform/painter.dart + - lib/widgets/editor/transform/transformation.dart + importato da: + - lib/widgets/editor/entry_editor_page.dart + - lib/widgets/editor/transform/handles.dart + +lib/widgets/editor/transform/handles.dart + importa: + - lib/widgets/editor/transform/cropper.dart + importato da: + - lib/widgets/editor/transform/cropper.dart + +lib/widgets/editor/transform/painter.dart + importa: + importato da: + - lib/widgets/editor/image.dart + - lib/widgets/editor/transform/cropper.dart + +lib/widgets/editor/transform/transformation.dart + importa: + - lib/widgets/editor/transform/crop_region.dart + importato da: + - lib/widgets/viewer/overlay/minimap.dart + - lib/widgets/editor/image.dart + - lib/widgets/editor/transform/cropper.dart + - lib/widgets/editor/transform/control_panel.dart + - lib/widgets/editor/transform/controller.dart + +lib/widgets/explorer/app_bar.dart + importa: + - lib/app_mode.dart + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/theme/icons.dart + - lib/theme/themes.dart + - lib/utils/android_file_utils.dart + - lib/view/view.dart + - lib/widgets/common/app_bar/app_bar_subtitle.dart + - lib/widgets/common/app_bar/app_bar_title.dart + - lib/widgets/common/app_bar/crumb_line.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_app_bar.dart + - lib/widgets/common/search/route.dart + - lib/widgets/dialogs/select_storage_dialog.dart + - lib/widgets/explorer/crumb_line.dart + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/search/collection_search_delegate.dart + importato da: + - lib/widgets/explorer/explorer_page.dart + +lib/widgets/explorer/crumb_line.dart + importa: + - lib/services/common/services.dart + - lib/utils/android_file_utils.dart + - lib/view/view.dart + - lib/widgets/common/app_bar/crumb_line.dart + importato da: + - lib/widgets/explorer/app_bar.dart + +lib/widgets/explorer/explorer_action_delegate.dart + importa: + - lib/app_mode.dart + - lib/model/device.dart + - lib/model/entry/entry.dart + - lib/model/filters/path.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/services/common/services.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/add_shortcut_dialog.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/stats/stats_page.dart + importato da: + - lib/widgets/explorer/app_bar.dart + +lib/widgets/explorer/explorer_page.dart + importa: + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/filters/path.dart + - lib/model/source/album.dart + - lib/model/source/collection_source.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/utils/android_file_utils.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/loading.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/behaviour/pop/double_back.dart + - lib/widgets/common/behaviour/pop/scope.dart + - lib/widgets/common/behaviour/pop/tv_navigation.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/navigation/drawer/app_drawer.dart + importato da: + - lib/model/settings/defaults.dart + - lib/model/settings/modules/navigation.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/home/home_page.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + +lib/widgets/filter_grids/albums_page.dart + importa: + - lib/model/app_inventory.dart + - lib/model/covers.dart + - lib/model/dynamic_albums.dart + - lib/model/entry/extensions/props.dart + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/model/settings/settings.dart + - lib/model/source/album.dart + - lib/model/source/collection_source.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/common/providers/filter_group_provider.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/enums.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/section_keys.dart + importato da: + - lib/model/settings/defaults.dart + - lib/model/settings/settings.dart + - lib/model/settings/modules/navigation.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/debug/settings.dart + +lib/widgets/filter_grids/common/action_delegates/album_set.dart + importa: + - lib/app_mode.dart + - lib/model/covers.dart + - lib/model/dynamic_albums.dart + - lib/model/entry/entry.dart + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/model/grouping/convert.dart + - lib/model/highlight.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/model/vaults/details.dart + - lib/model/vaults/vaults.dart + - lib/services/common/image_op_events.dart + - lib/services/common/services.dart + - lib/services/media/enums.dart + - lib/theme/durations.dart + - lib/utils/android_file_utils.dart + - lib/view/view.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/providers/filter_group_provider.dart + - lib/widgets/common/tile_extent_controller.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart + - lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart + - lib/widgets/dialogs/filter_editors/rename_dynamic_album_dialog.dart + - lib/widgets/dialogs/filter_editors/rename_group_dialog.dart + - lib/widgets/dialogs/filter_editors/rename_stored_album_dialog.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/dialogs/tile_view_dialog.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/filter_grids/common/enums.dart + importato da: + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/albums_page.dart + +lib/widgets/filter_grids/common/action_delegates/chip.dart + importa: + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/filters.dart + - lib/model/filters/path.dart + - lib/model/filters/rating.dart + - lib/model/grouping/common.dart + - lib/model/highlight.dart + - lib/model/settings/settings.dart + - lib/model/vaults/vaults.dart + - lib/services/common/services.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/viewer/controls/notifications.dart + importato da: + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/common/identity/aves_filter_chip.dart + +lib/widgets/filter_grids/common/action_delegates/chip_set.dart + importa: + - lib/app_mode.dart + - lib/model/covers.dart + - lib/model/entry/entry.dart + - lib/model/filters/container/set_or.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/model/query.dart + - lib/model/selection.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/services/common/services.dart + - lib/theme/colors.dart + - lib/theme/durations.dart + - lib/theme/themes.dart + - lib/view/view.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/action_mixins/size_aware.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/providers/filter_group_provider.dart + - lib/widgets/common/search/route.dart + - lib/widgets/common/tile_extent_controller.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart + - lib/widgets/dialogs/tile_view_dialog.dart + - lib/widgets/map/map_page.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/stats/stats_page.dart + - lib/widgets/viewer/slideshow_page.dart + importato da: + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + - lib/widgets/filter_grids/common/action_delegates/place_set.dart + - lib/widgets/filter_grids/common/action_delegates/country_set.dart + - lib/widgets/filter_grids/common/action_delegates/state_set.dart + +lib/widgets/filter_grids/common/action_delegates/country_set.dart + importa: + - lib/app_mode.dart + - lib/geo/states.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/services/common/services.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/states_page.dart + importato da: + - lib/widgets/filter_grids/countries_page.dart + +lib/widgets/filter_grids/common/action_delegates/place_set.dart + importa: + - lib/model/filters/covered/location.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/filter_grids/places_page.dart + importato da: + - lib/widgets/filter_grids/places_page.dart + +lib/widgets/filter_grids/common/action_delegates/state_set.dart + importa: + - lib/model/filters/covered/location.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/filter_grids/states_page.dart + importato da: + - lib/widgets/filter_grids/states_page.dart + +lib/widgets/filter_grids/common/action_delegates/tag_set.dart + importa: + - lib/app_mode.dart + - lib/model/filters/container/tag_group.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/model/grouping/convert.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/services/common/services.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/providers/filter_group_provider.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/filter_grids/common/enums.dart + - lib/widgets/filter_grids/tags_page.dart + importato da: + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/filter_grids/tags_page.dart + +lib/widgets/filter_grids/common/app_bar.dart + importa: + - lib/app_mode.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/model/query.dart + - lib/model/selection.dart + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/theme/durations.dart + - lib/theme/themes.dart + - lib/view/view.dart + - lib/widgets/aves_app.dart + - lib/widgets/common/action_controls/togglers/title_search.dart + - lib/widgets/common/app_bar/app_bar_subtitle.dart + - lib/widgets/common/app_bar/app_bar_title.dart + - lib/widgets/common/app_bar/crumb_line.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_app_bar.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + - lib/widgets/common/providers/filter_group_provider.dart + - lib/widgets/common/search/route.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/filter_grids/common/group_crumb_line.dart + - lib/widgets/filter_grids/common/query_bar.dart + - lib/widgets/search/collection_search_delegate.dart + importato da: + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + +lib/widgets/filter_grids/common/covered_filter_chip.dart + importa: + - lib/model/entry/entry.dart + - lib/model/app_inventory.dart + - lib/model/covers.dart + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/container/tag_group.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/model/source/album.dart + - lib/model/source/collection_source.dart + - lib/model/source/location/country.dart + - lib/model/source/tag.dart + - lib/model/vaults/vaults.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/theme/text.dart + - lib/utils/android_file_utils.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/thumbnail/image.dart + - lib/remote/remote_origin.dart + - lib/remote/remote_image_tile.dart + importato da: + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/filter_chip_grid_decorator.dart + - lib/widgets/filter_grids/common/filter_tile.dart + +lib/widgets/filter_grids/common/draggable_thumb_label.dart + importa: + - lib/model/filters/filters.dart + - lib/model/source/collection_source.dart + - lib/utils/file_utils.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/grid/draggable_thumb_label.dart + importato da: + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/filter_grids/common/enums.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/settings/navigation/drawer_tab_albums.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/common/section_keys.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/action_delegates/album_set.dart + +lib/widgets/filter_grids/common/filter_chip_grid_decorator.dart + importa: + - lib/model/filters/filters.dart + - lib/widgets/common/grid/overlay.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/overlay.dart + importato da: + - lib/widgets/filter_grids/common/filter_tile.dart + +lib/widgets/filter_grids/common/filter_grid_page.dart + importa: + - lib/app_mode.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/model/highlight.dart + - lib/model/query.dart + - lib/model/selection.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/model/vaults/vaults.dart + - lib/theme/colors.dart + - lib/theme/durations.dart + - lib/widgets/collection/loading.dart + - lib/widgets/common/basic/draggable_scrollbar/notifications.dart + - lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/behaviour/pop/double_back.dart + - lib/widgets/common/behaviour/pop/scope.dart + - lib/widgets/common/behaviour/pop/tv_navigation.dart + - lib/widgets/common/behaviour/sloppy_scroll_physics.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/media_query.dart + - lib/widgets/common/grid/item_tracker.dart + - lib/widgets/common/grid/scaling.dart + - lib/widgets/common/grid/sections/fixed/scale_grid.dart + - lib/widgets/common/grid/sections/list_layout.dart + - lib/widgets/common/grid/selector.dart + - lib/widgets/common/grid/sliver.dart + - lib/widgets/common/grid/theme.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/identity/scroll_thumb.dart + - lib/widgets/common/providers/filter_group_provider.dart + - lib/widgets/common/providers/tile_extent_controller_provider.dart + - lib/widgets/common/thumbnail/image.dart + - lib/widgets/common/tile_extent_controller.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/draggable_thumb_label.dart + - lib/widgets/filter_grids/common/filter_tile.dart + - lib/widgets/filter_grids/common/list_details_theme.dart + - lib/widgets/filter_grids/common/section_keys.dart + - lib/widgets/filter_grids/common/section_layout.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/nav_bar/nav_bar.dart + - lib/widgets/navigation/tv_rail.dart + importato da: + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + +lib/widgets/filter_grids/common/filter_nav_page.dart + importa: + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/group_base.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/selection.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/utils/time_utils.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/providers/filter_group_provider.dart + - lib/widgets/common/providers/query_provider.dart + - lib/widgets/common/providers/selection_provider.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/section_keys.dart + importato da: + - lib/widgets/common/action_controls/quick_choosers/move_button.dart + - lib/widgets/common/action_controls/quick_choosers/tag_button.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/states_page.dart + - lib/widgets/filter_grids/countries_page.dart + +lib/widgets/filter_grids/common/filter_tile.dart + importa: + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/model/vaults/vaults.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/grid/scaling.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/filter_grids/common/covered_filter_chip.dart + - lib/widgets/filter_grids/common/filter_chip_grid_decorator.dart + - lib/widgets/filter_grids/common/list_details.dart + importato da: + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/filter_grids/common/group_crumb_line.dart + importa: + - lib/model/grouping/common.dart + - lib/services/common/services.dart + - lib/widgets/common/app_bar/crumb_line.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/filter_grids/common/app_bar.dart + +lib/widgets/filter_grids/common/list_details.dart + importa: + - lib/model/entry/entry.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/container/group_base.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/source/collection_source.dart + - lib/theme/format.dart + - lib/theme/icons.dart + - lib/theme/text.dart + - lib/utils/android_file_utils.dart + - lib/utils/file_utils.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/fx/borders.dart + - lib/widgets/filter_grids/common/list_details_theme.dart + importato da: + - lib/widgets/filter_grids/common/filter_tile.dart + +lib/widgets/filter_grids/common/list_details_theme.dart + importa: + - lib/theme/format.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/tile_extent_controller.dart + importato da: + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/list_details.dart + +lib/widgets/filter_grids/common/overlay.dart + importa: + - lib/model/filters/filters.dart + - lib/model/highlight.dart + - lib/widgets/common/fx/sweeper.dart + importato da: + - lib/widgets/filter_grids/common/filter_chip_grid_decorator.dart + +lib/widgets/filter_grids/common/query_bar.dart + importa: + - lib/model/filters/filters.dart + - lib/model/selection.dart + - lib/widgets/common/basic/query_bar.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/filter_grids/common/app_bar.dart + +lib/widgets/filter_grids/common/section_header.dart + importa: + - lib/widgets/common/grid/header.dart + - lib/widgets/filter_grids/common/section_keys.dart + importato da: + - lib/widgets/filter_grids/common/section_layout.dart + +lib/widgets/filter_grids/common/section_keys.dart + importa: + - lib/model/source/section_keys.dart + - lib/theme/icons.dart + - lib/view/view.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/filter_grids/common/enums.dart + importato da: + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/states_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + - lib/widgets/filter_grids/common/section_layout.dart + - lib/widgets/filter_grids/common/section_header.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + +lib/widgets/filter_grids/common/section_layout.dart + importa: + - lib/model/filters/filters.dart + - lib/model/source/section_keys.dart + - lib/widgets/common/grid/sections/provider.dart + - lib/widgets/filter_grids/common/section_header.dart + - lib/widgets/filter_grids/common/section_keys.dart + importato da: + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/filter_grids/countries_page.dart + importa: + - lib/model/filters/covered/location.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/model/source/location/country.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/filter_grids/common/action_delegates/country_set.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/section_keys.dart + importato da: + - lib/model/settings/defaults.dart + - lib/model/settings/settings.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/filter_grids/common/action_delegates/country_set.dart + - lib/widgets/debug/settings.dart + +lib/widgets/filter_grids/places_page.dart + importa: + - lib/model/filters/covered/location.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/model/source/location/place.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/filter_grids/common/action_delegates/place_set.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/section_keys.dart + importato da: + - lib/model/settings/settings.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/filter_grids/common/action_delegates/place_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/debug/settings.dart + +lib/widgets/filter_grids/states_page.dart + importa: + - lib/geo/states.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/model/source/location/place.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/filter_grids/common/action_delegates/state_set.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/section_keys.dart + importato da: + - lib/widgets/filter_grids/common/action_delegates/country_set.dart + - lib/widgets/filter_grids/common/action_delegates/state_set.dart + +lib/widgets/filter_grids/tags_page.dart + importa: + - lib/model/filters/container/tag_group.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/filters.dart + - lib/model/grouping/common.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/model/source/tag.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/common/providers/filter_group_provider.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/enums.dart + - lib/widgets/filter_grids/common/filter_nav_page.dart + - lib/widgets/filter_grids/common/section_keys.dart + importato da: + - lib/model/settings/defaults.dart + - lib/model/settings/settings.dart + - lib/model/settings/modules/navigation.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/home/home_page.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/filter_grids/common/action_delegates/tag_set.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/debug/settings.dart + +lib/widgets/home/home_error.dart + importa: + - lib/ref/locales.dart + - lib/ref/mime_types.dart + - lib/services/common/services.dart + - lib/widgets/about/bug_report.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + importato da: + - lib/widgets/home/home_page.dart + +lib/widgets/home/home_page.dart + importa: + - lib/app_mode.dart + - lib/geo/uri.dart + - lib/model/app/intent.dart + - lib/model/app/permissions.dart + - lib/model/app_inventory.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/catalog.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/services/analysis_service.dart + - lib/services/common/services.dart + - lib/services/global_search.dart + - lib/services/intent_service.dart + - lib/services/widget_service.dart + - lib/theme/themes.dart + - lib/utils/android_file_utils.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/behaviour/routes.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/search/page.dart + - lib/widgets/common/search/route.dart + - lib/widgets/editor/entry_editor_page.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/home/home_error.dart + - lib/widgets/map/map_page.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/settings/screen_saver_settings_page.dart + - lib/widgets/viewer/entry_viewer_page.dart + - lib/widgets/viewer/screen_saver_page.dart + - lib/widgets/wallpaper_page.dart + - lib/remote/remote_controller.dart + - lib/remote/remote_settings.dart + importato da: + - lib/widgets/welcome_page.dart + - lib/widgets/aves_app.dart + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/navigation/drawer/app_drawer.dart + +lib/widgets/home_widget.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/images.dart + - lib/model/settings/enums/widget_shape.dart + - lib/theme/colors.dart + - lib/widgets/common/identity/aves_filter_chip.dart + importato da: + - lib/widget_common.dart + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/viewer/visual/entry_page_view.dart + +lib/widgets/map/address_row.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/location.dart + - lib/model/settings/enums/coordinate_format.dart + - lib/model/settings/settings.dart + - lib/services/common/services.dart + - lib/services/geocoding_service.dart + - lib/theme/icons.dart + - lib/theme/text.dart + importato da: + - lib/widgets/map/info_row.dart + +lib/widgets/map/date_row.dart + importa: + - lib/model/entry/entry.dart + - lib/theme/format.dart + - lib/theme/icons.dart + - lib/theme/text.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/map/info_row.dart + importato da: + - lib/widgets/map/info_row.dart + +lib/widgets/map/info_row.dart + importa: + - lib/model/entry/entry.dart + - lib/widgets/map/address_row.dart + - lib/widgets/map/date_row.dart + importato da: + - lib/widgets/map/scroller.dart + - lib/widgets/map/date_row.dart + +lib/widgets/map/map_page.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/location.dart + - lib/model/filters/coordinate.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/filters.dart + - lib/model/highlight.dart + - lib/model/media/geotiff.dart + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/tag.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/view/view.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/behaviour/routes.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/common/map/map_action_delegate.dart + - lib/widgets/common/providers/highlight_info_provider.dart + - lib/widgets/common/providers/map_theme_provider.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/map/scroller.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/entry_viewer_page.dart + importato da: + - lib/widgets/home/home_page.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/map/map_action_delegate.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/dialogs/entry_editors/edit_location_dialog.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/widgets/map/scroller.dart + importa: + - lib/model/entry/entry.dart + - lib/model/source/collection_lens.dart + - lib/theme/durations.dart + - lib/utils/debouncer.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/common/thumbnail/scroller.dart + - lib/widgets/map/info_row.dart + - lib/widgets/viewer/hero.dart + importato da: + - lib/widgets/map/map_page.dart + +lib/widgets/navigation/drawer/app_drawer.dart + importa: + - lib/model/filters/container/album_group.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/trash.dart + - lib/model/settings/settings.dart + - lib/model/source/album.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/model/source/location/country.dart + - lib/model/source/location/place.dart + - lib/model/source/tag.dart + - lib/ref/locales.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/utils/android_file_utils.dart + - lib/utils/file_utils.dart + - lib/widgets/about/about_page.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/basic/text/outlined.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/media_query.dart + - lib/widgets/common/identity/aves_logo.dart + - lib/widgets/debug/app_debug_page.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/home/home_page.dart + - lib/widgets/navigation/drawer/collection_nav_tile.dart + - lib/widgets/navigation/drawer/page_nav_tile.dart + - lib/widgets/navigation/drawer/tile.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/settings/settings_page.dart + importato da: + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/navigation/drawer/collection_nav_tile.dart + importa: + - lib/model/filters/container/album_group.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/source/collection_source.dart + - lib/theme/icons.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/navigation/drawer/tile.dart + importato da: + - lib/widgets/navigation/drawer/app_drawer.dart + +lib/widgets/navigation/drawer/page_nav_tile.dart + importa: + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/navigation/drawer/tile.dart + - lib/widgets/navigation/nav_item.dart + importato da: + - lib/widgets/navigation/drawer/app_drawer.dart + +lib/widgets/navigation/drawer/tile.dart + importa: + - lib/model/filters/filters.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/widgets/debug/app_debug_page.dart + - lib/widgets/navigation/nav_display.dart + importato da: + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/settings/navigation/drawer_tab_albums.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/drawer/page_nav_tile.dart + - lib/widgets/navigation/drawer/collection_nav_tile.dart + +lib/widgets/navigation/nav_bar/floating.dart + importa: + - lib/widgets/common/basic/draggable_scrollbar/notifications.dart + importato da: + - lib/widgets/navigation/nav_bar/nav_bar.dart + +lib/widgets/navigation/nav_bar/nav_bar.dart + importa: + - lib/app_mode.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/basic/draggable_scrollbar/notifications.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/media_query.dart + - lib/widgets/common/identity/aves_app_bar.dart + - lib/widgets/navigation/nav_bar/floating.dart + - lib/widgets/navigation/nav_item.dart + importato da: + - lib/widgets/collection/collection_grid.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/navigation/nav_display.dart + importa: + - lib/model/filters/favourite.dart + - lib/model/filters/filters.dart + - lib/model/filters/mime.dart + - lib/model/filters/type.dart + - lib/theme/icons.dart + - lib/widgets/about/about_page.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/search/page.dart + - lib/widgets/debug/app_debug_page.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/home/home_page.dart + - lib/widgets/settings/settings_page.dart + importato da: + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/drawer/tile.dart + +lib/widgets/navigation/nav_item.dart + importa: + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/theme/themes.dart + - lib/widgets/about/about_page.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/search/page.dart + - lib/widgets/common/search/route.dart + - lib/widgets/debug/app_debug_page.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/home/home_page.dart + - lib/widgets/navigation/drawer/tile.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/settings/settings_page.dart + importato da: + - lib/model/settings/defaults.dart + - lib/model/settings/modules/navigation.dart + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/drawer/page_nav_tile.dart + - lib/widgets/navigation/nav_bar/nav_bar.dart + +lib/widgets/navigation/tv_page_transitions.dart + importa: + importato da: + - lib/widgets/aves_app.dart + +lib/widgets/navigation/tv_rail.dart + importa: + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/ref/locales.dart + - lib/widgets/about/about_page.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_logo.dart + - lib/widgets/debug/app_debug_page.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/drawer/tile.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/settings/settings_page.dart + importato da: + - lib/widgets/aves_app.dart + - lib/widgets/settings/settings_tv_page.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/about/about_tv_page.dart + - lib/widgets/viewer/info/metadata/tv_page.dart + - lib/widgets/filter_grids/common/filter_grid_page.dart + +lib/widgets/search/collection_search_delegate.dart + importa: + - lib/model/dynamic_albums.dart + - lib/model/filters/aspect_ratio.dart + - lib/model/filters/container/dynamic_album.dart + - lib/model/filters/container/set_and.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/date.dart + - lib/model/filters/favourite.dart + - lib/model/filters/filters.dart + - lib/model/filters/mime.dart + - lib/model/filters/missing.dart + - lib/model/filters/query.dart + - lib/model/filters/rating.dart + - lib/model/filters/recent.dart + - lib/model/filters/type.dart + - lib/model/filters/weekday.dart + - lib/model/grouping/common.dart + - lib/model/settings/settings.dart + - lib/model/source/album.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/model/source/location/country.dart + - lib/model/source/location/place.dart + - lib/model/source/tag.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/basic/tv_edge_focus.dart + - lib/widgets/common/expandable_filter_row.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/search/delegate.dart + - lib/widgets/common/search/page.dart + - lib/widgets/viewer/controls/notifications.dart + importato da: + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/home/home_page.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/explorer/app_bar.dart + - lib/widgets/filter_grids/common/app_bar.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/widgets/settings/accessibility/accessibility.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/view/view.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/accessibility/time_to_take_action.dart + - lib/widgets/settings/common/tile_leading.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/settings_definition.dart + importato da: + - lib/widgets/settings/settings_page.dart + +lib/widgets/settings/accessibility/time_to_take_action.dart + importa: + - lib/model/settings/settings.dart + - lib/services/accessibility_service.dart + - lib/view/view.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/tiles.dart + importato da: + - lib/widgets/settings/accessibility/accessibility.dart + +lib/widgets/settings/app_export/items.dart + importa: + - lib/model/covers.dart + - lib/model/dynamic_albums.dart + - lib/model/favourites.dart + - lib/model/grouping/common.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/app_export/selection_dialog.dart + +lib/widgets/settings/app_export/selection_dialog.dart + importa: + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/settings/app_export/items.dart + importato da: + - lib/widgets/settings/settings_mobile_page.dart + +lib/widgets/settings/common/collection_tile.dart + importa: + - lib/model/filters/filters.dart + - lib/services/intent_service.dart + - lib/theme/icons.dart + - lib/widgets/collection/filter_bar.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_caption.dart + importato da: + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/settings/screen_saver_settings_page.dart + +lib/widgets/settings/common/quick_actions/action_panel.dart + importa: + - lib/theme/durations.dart + - lib/theme/themes.dart + importato da: + - lib/widgets/settings/video/control_actions.dart + - lib/widgets/settings/common/quick_actions/editor_page.dart + +lib/widgets/settings/common/quick_actions/available_actions.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/settings/common/quick_actions/placeholder.dart + importato da: + - lib/widgets/settings/common/quick_actions/editor_page.dart + +lib/widgets/settings/common/quick_actions/editor_page.dart + importa: + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/theme/styles.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/settings/common/quick_actions/action_panel.dart + - lib/widgets/settings/common/quick_actions/available_actions.dart + - lib/widgets/settings/common/quick_actions/placeholder.dart + - lib/widgets/settings/common/quick_actions/quick_actions.dart + importato da: + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/settings/viewer/viewer_actions_editor.dart + - lib/widgets/settings/thumbnails/collection_actions_editor_page.dart + +lib/widgets/settings/common/quick_actions/placeholder.dart + importa: + importato da: + - lib/widgets/settings/common/quick_actions/editor_page.dart + - lib/widgets/settings/common/quick_actions/available_actions.dart + +lib/widgets/settings/common/quick_actions/quick_actions.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/common/providers/media_query_data_provider.dart + importato da: + - lib/widgets/settings/common/quick_actions/editor_page.dart + +lib/widgets/settings/common/switch_icon.dart + importa: + - lib/theme/colors.dart + - lib/theme/durations.dart + - lib/widgets/settings/common/tiles.dart + importato da: + - lib/widgets/settings/viewer/overlay.dart + - lib/widgets/settings/thumbnails/overlay.dart + +lib/widgets/settings/common/tile_leading.dart + importa: + - lib/theme/durations.dart + - lib/theme/styles.dart + - lib/theme/themes.dart + - lib/widgets/common/extensions/theme.dart + - lib/widgets/common/identity/aves_filter_chip.dart + importato da: + - lib/widgets/settings/video/video.dart + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/settings/navigation/navigation.dart + - lib/widgets/settings/language/language.dart + - lib/widgets/settings/viewer/viewer.dart + - lib/widgets/settings/display/display.dart + - lib/widgets/settings/accessibility/accessibility.dart + - lib/widgets/settings/thumbnails/thumbnails.dart + +lib/widgets/settings/common/tiles.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/durations.dart + - lib/theme/text.dart + - lib/utils/time_utils.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_caption.dart + - lib/widgets/dialogs/duration_dialog.dart + - lib/widgets/dialogs/selection_dialogs/common.dart + - lib/widgets/dialogs/selection_dialogs/multi_selection.dart + - lib/widgets/dialogs/selection_dialogs/single_selection.dart + importato da: + - lib/widgets/settings/home_widget_settings_page.dart + - lib/widgets/settings/screen_saver_settings_page.dart + - lib/widgets/settings/video/subtitle_theme.dart + - lib/widgets/settings/video/video.dart + - lib/widgets/settings/video/playback.dart + - lib/widgets/settings/video/controls.dart + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/settings/navigation/confirmation_dialogs.dart + - lib/widgets/settings/navigation/navigation.dart + - lib/widgets/settings/language/language.dart + - lib/widgets/settings/common/switch_icon.dart + - lib/widgets/settings/viewer/slideshow.dart + - lib/widgets/settings/viewer/viewer.dart + - lib/widgets/settings/viewer/overlay.dart + - lib/widgets/settings/display/display.dart + - lib/widgets/settings/accessibility/accessibility.dart + - lib/widgets/settings/accessibility/time_to_take_action.dart + - lib/widgets/settings/thumbnails/thumbnails.dart + - lib/widgets/settings/thumbnails/overlay.dart + - lib/widgets/debug/general.dart + +lib/widgets/settings/display/display.dart + importa: + - lib/model/device.dart + - lib/model/settings/settings.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/view/view.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/settings/common/tile_leading.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/settings/settings_definition.dart + importato da: + - lib/widgets/settings/settings_page.dart + +lib/widgets/settings/home_widget_settings_page.dart + importa: + - lib/model/device.dart + - lib/model/filters/filters.dart + - lib/model/settings/enums/widget_outline.dart + - lib/model/settings/enums/widget_shape.dart + - lib/model/settings/settings.dart + - lib/services/common/services.dart + - lib/services/widget_service.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/view/view.dart + - lib/widgets/common/basic/color_indicator.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + - lib/widgets/home_widget.dart + - lib/widgets/settings/common/collection_tile.dart + - lib/widgets/settings/common/tiles.dart + importato da: + - lib/widgets/home/home_page.dart + +lib/widgets/settings/language/language.dart + importa: + - lib/model/settings/enums/coordinate_format.dart + - lib/model/settings/settings.dart + - lib/ref/poi.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/view/view.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/tile_leading.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/language/locale_tile.dart + - lib/widgets/settings/settings_definition.dart + importato da: + - lib/widgets/settings/settings_page.dart + +lib/widgets/settings/language/locale_selection_page.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/aves_app.dart + - lib/widgets/common/basic/list_tiles/reselectable_radio.dart + - lib/widgets/common/basic/query_bar.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/language/locale_tile.dart + importato da: + - lib/widgets/settings/language/locale_tile.dart + +lib/widgets/settings/language/locale_tile.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/durations.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/language/locale_selection_page.dart + - lib/widgets/settings/language/locales.dart + importato da: + - lib/widgets/settings/language/locale_selection_page.dart + - lib/widgets/settings/language/language.dart + +lib/widgets/settings/language/locales.dart + importa: + importato da: + - lib/widgets/settings/language/locale_tile.dart + +lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + importa: + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/settings.dart + - lib/theme/icons.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart + - lib/widgets/filter_grids/common/enums.dart + - lib/widgets/home/home_page.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/settings/common/quick_actions/editor_page.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/settings/settings_page.dart + importato da: + - lib/widgets/settings/navigation/navigation.dart + +lib/widgets/settings/navigation/confirmation_dialogs.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/tiles.dart + importato da: + - lib/widgets/settings/navigation/navigation.dart + +lib/widgets/settings/navigation/drawer.dart + importa: + - lib/model/filters/container/album_group.dart + - lib/model/filters/filters.dart + - lib/model/filters/mime.dart + - lib/model/filters/recent.dart + - lib/model/settings/settings.dart + - lib/ref/mime_types.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/search/page.dart + - lib/widgets/explorer/explorer_page.dart + - lib/widgets/filter_grids/albums_page.dart + - lib/widgets/filter_grids/countries_page.dart + - lib/widgets/filter_grids/places_page.dart + - lib/widgets/filter_grids/tags_page.dart + - lib/widgets/navigation/drawer/app_drawer.dart + - lib/widgets/navigation/drawer/tile.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/settings/navigation/drawer_tab_albums.dart + - lib/widgets/settings/navigation/drawer_tab_fixed.dart + importato da: + - lib/widgets/settings/navigation/navigation.dart + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + +lib/widgets/settings/navigation/drawer_editor_banner.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/settings/navigation/drawer_tab_fixed.dart + - lib/widgets/settings/navigation/drawer_tab_albums.dart + +lib/widgets/settings/navigation/drawer_tab_albums.dart + importa: + - lib/model/filters/container/album_group.dart + - lib/model/settings/settings.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + - lib/widgets/dialogs/pick_dialogs/album_pick_page.dart + - lib/widgets/filter_grids/common/enums.dart + - lib/widgets/navigation/drawer/tile.dart + - lib/widgets/settings/navigation/drawer_editor_banner.dart + importato da: + - lib/widgets/settings/navigation/drawer.dart + +lib/widgets/settings/navigation/drawer_tab_fixed.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/media_query.dart + - lib/widgets/settings/navigation/drawer_editor_banner.dart + importato da: + - lib/widgets/settings/navigation/drawer.dart + +lib/widgets/settings/navigation/navigation.dart + importa: + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/services/common/services.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/theme/text.dart + - lib/view/view.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/tile_leading.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/settings/navigation/confirmation_dialogs.dart + - lib/widgets/settings/navigation/drawer.dart + - lib/widgets/settings/settings_definition.dart + importato da: + - lib/widgets/settings/settings_page.dart + +lib/widgets/settings/privacy/access_grants_page.dart + importa: + - lib/services/common/services.dart + - lib/theme/icons.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/empty.dart + importato da: + - lib/widgets/settings/privacy/privacy.dart + +lib/widgets/settings/privacy/hidden_items_page.dart + importa: + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/theme/icons.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/identity/empty.dart + importato da: + - lib/widgets/settings/privacy/privacy.dart + +lib/widgets/settings/privacy/privacy.dart + importa: + - lib/app_flavor.dart + - lib/model/device.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/model/vaults/vaults.dart + - lib/services/common/services.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/settings/common/tile_leading.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/privacy/access_grants_page.dart + - lib/widgets/settings/privacy/hidden_items_page.dart + - lib/widgets/settings/settings_definition.dart + importato da: + - lib/widgets/settings/settings_page.dart + - lib/widgets/settings/display/display.dart + +lib/widgets/settings/screen_saver_settings_page.dart + importa: + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/view/view.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/collection_tile.dart + - lib/widgets/settings/common/tiles.dart + importato da: + - lib/widgets/home/home_page.dart + +lib/widgets/settings/settings_definition.dart + importa: + - lib/widgets/common/identity/aves_expansion_tile.dart + importato da: + - lib/widgets/settings/settings_tv_page.dart + - lib/widgets/settings/settings_search_delegate.dart + - lib/widgets/settings/settings_page.dart + - lib/widgets/settings/video/video.dart + - lib/widgets/settings/video/video_settings_page.dart + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/settings/navigation/navigation.dart + - lib/widgets/settings/language/language.dart + - lib/widgets/settings/viewer/viewer.dart + - lib/widgets/settings/display/display.dart + - lib/widgets/settings/accessibility/accessibility.dart + - lib/widgets/settings/thumbnails/thumbnails.dart + - lib/widgets/settings/thumbnails/overlay.dart + +lib/widgets/settings/settings_mobile_page.dart + importa: + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/ref/locales.dart + - lib/ref/mime_types.dart + - lib/services/common/services.dart + - lib/theme/icons.dart + - lib/theme/themes.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/app_bar/app_bar_title.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/search/route.dart + - lib/widgets/settings/app_export/items.dart + - lib/widgets/settings/app_export/selection_dialog.dart + - lib/widgets/settings/settings_page.dart + - lib/widgets/settings/settings_search_delegate.dart + importato da: + - lib/widgets/settings/settings_page.dart + +lib/widgets/settings/settings_page.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/durations.dart + - lib/widgets/common/extensions/media_query.dart + - lib/widgets/settings/accessibility/accessibility.dart + - lib/widgets/settings/display/display.dart + - lib/widgets/settings/language/language.dart + - lib/widgets/settings/navigation/navigation.dart + - lib/widgets/settings/privacy/privacy.dart + - lib/widgets/settings/settings_definition.dart + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/settings_tv_page.dart + - lib/widgets/settings/thumbnails/thumbnails.dart + - lib/widgets/settings/video/video.dart + - lib/widgets/settings/viewer/viewer.dart + importato da: + - lib/widgets/settings/settings_mobile_page.dart + - lib/widgets/settings/settings_tv_page.dart + - lib/widgets/settings/navigation/bottom_nav_actions_editor.dart + - lib/widgets/navigation/nav_item.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/navigation/nav_display.dart + - lib/widgets/navigation/drawer/app_drawer.dart + +lib/widgets/settings/settings_search_delegate.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/common/search/delegate.dart + - lib/widgets/settings/settings_definition.dart + importato da: + - lib/widgets/settings/settings_mobile_page.dart + +lib/widgets/settings/settings_tv_page.dart + importa: + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/behaviour/pop/scope.dart + - lib/widgets/common/behaviour/pop/tv_navigation.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/settings/settings_definition.dart + - lib/widgets/settings/settings_page.dart + importato da: + - lib/widgets/settings/settings_page.dart + +lib/widgets/settings/thumbnails/collection_actions_editor_page.dart + importa: + - lib/model/settings/settings.dart + - lib/view/view.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/quick_actions/editor_page.dart + importato da: + - lib/widgets/settings/thumbnails/thumbnails.dart + +lib/widgets/settings/thumbnails/overlay.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/icons.dart + - lib/view/view.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_icons.dart + - lib/widgets/settings/common/switch_icon.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/settings_definition.dart + importato da: + - lib/widgets/settings/thumbnails/thumbnails.dart + +lib/widgets/settings/thumbnails/thumbnails.dart + importa: + - lib/model/settings/settings.dart + - lib/ref/bursts.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/tile_leading.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/settings_definition.dart + - lib/widgets/settings/thumbnails/collection_actions_editor_page.dart + - lib/widgets/settings/thumbnails/overlay.dart + importato da: + - lib/widgets/settings/settings_page.dart + +lib/widgets/settings/video/control_actions.dart + importa: + - lib/model/settings/settings.dart + - lib/view/view.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/settings/common/quick_actions/action_panel.dart + - lib/widgets/viewer/overlay/video/controls.dart + importato da: + - lib/widgets/settings/video/controls.dart + +lib/widgets/settings/video/controls.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/video/control_actions.dart + importato da: + - lib/widgets/settings/video/video.dart + +lib/widgets/settings/video/playback.dart + importa: + - lib/model/device.dart + - lib/model/settings/settings.dart + - lib/view/view.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/tiles.dart + importato da: + - lib/widgets/settings/video/video.dart + +lib/widgets/settings/video/subtitle_sample.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/colors.dart + - lib/widgets/common/basic/text/background_painter.dart + - lib/widgets/common/basic/text/outlined.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/fx/borders.dart + - lib/widgets/viewer/visual/video/subtitle/subtitle.dart + importato da: + - lib/widgets/settings/video/subtitle_theme.dart + +lib/widgets/settings/video/subtitle_theme.dart + importa: + - lib/model/settings/settings.dart + - lib/view/view.dart + - lib/widgets/common/basic/list_tiles/color.dart + - lib/widgets/common/basic/list_tiles/slider.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/video/subtitle_sample.dart + importato da: + - lib/widgets/settings/video/video.dart + +lib/widgets/settings/video/video.dart + importa: + - lib/model/filters/mime.dart + - lib/model/settings/settings.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/tile_leading.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/settings_definition.dart + - lib/widgets/settings/video/controls.dart + - lib/widgets/settings/video/playback.dart + - lib/widgets/settings/video/subtitle_theme.dart + importato da: + - lib/widgets/settings/settings_page.dart + - lib/widgets/settings/video/video_settings_page.dart + +lib/widgets/settings/video/video_settings_page.dart + importa: + - lib/model/settings/settings.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/settings_definition.dart + - lib/widgets/settings/video/video.dart + importato da: + - lib/widgets/viewer/action/video_action_delegate.dart + +lib/widgets/settings/viewer/entry_background.dart + importa: + - lib/model/settings/enums/entry_background.dart + - lib/widgets/common/basic/color_indicator.dart + - lib/widgets/common/fx/checkered_decoration.dart + importato da: + - lib/widgets/settings/viewer/viewer.dart + +lib/widgets/settings/viewer/overlay.dart + importa: + - lib/model/settings/settings.dart + - lib/theme/icons.dart + - lib/view/view.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/switch_icon.dart + - lib/widgets/settings/common/tiles.dart + importato da: + - lib/widgets/settings/viewer/viewer.dart + +lib/widgets/settings/viewer/slideshow.dart + importa: + - lib/model/settings/settings.dart + - lib/view/view.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/tiles.dart + importato da: + - lib/widgets/settings/viewer/viewer.dart + - lib/widgets/viewer/slideshow_page.dart + +lib/widgets/settings/viewer/viewer.dart + importa: + - lib/model/settings/settings.dart + - lib/services/common/services.dart + - lib/theme/colors.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/tile_leading.dart + - lib/widgets/settings/common/tiles.dart + - lib/widgets/settings/settings_definition.dart + - lib/widgets/settings/viewer/entry_background.dart + - lib/widgets/settings/viewer/overlay.dart + - lib/widgets/settings/viewer/slideshow.dart + - lib/widgets/settings/viewer/viewer_actions_editor.dart + - lib/model/settings/enums/local_cast_source_mode.dart + importato da: + - lib/widgets/settings/settings_page.dart + +lib/widgets/settings/viewer/viewer_actions_editor.dart + importa: + - lib/model/settings/settings.dart + - lib/view/view.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/settings/common/quick_actions/editor_page.dart + - lib/widgets/viewer/overlay/bottom.dart + importato da: + - lib/widgets/settings/viewer/viewer.dart + +lib/widgets/stats/date/axis.dart + importa: + - lib/model/filters/date.dart + - lib/utils/time_utils.dart + importato da: + - lib/widgets/stats/date/histogram.dart + +lib/widgets/stats/date/histogram.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/sort.dart + - lib/model/filters/date.dart + - lib/theme/durations.dart + - lib/theme/themes.dart + - lib/utils/time_utils.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/fx/transitions.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/stats/date/axis.dart + importato da: + - lib/widgets/stats/stats_page.dart + +lib/widgets/stats/filter_table.dart + importa: + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/theme/themes.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/stats/percent_text.dart + importato da: + - lib/widgets/stats/top_page.dart + - lib/widgets/stats/stats_page.dart + +lib/widgets/stats/mime_donut.dart + importa: + - lib/model/filters/mime.dart + - lib/theme/colors.dart + - lib/utils/mime_utils.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_donut.dart + - lib/widgets/common/identity/aves_filter_chip.dart + importato da: + - lib/widgets/stats/stats_page.dart + +lib/widgets/stats/percent_text.dart + importa: + - lib/theme/styles.dart + - lib/theme/themes.dart + - lib/widgets/common/basic/text/outlined.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/theme.dart + importato da: + - lib/widgets/stats/filter_table.dart + - lib/widgets/stats/stats_page.dart + +lib/widgets/stats/stats_page.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/location.dart + - lib/model/entry/extensions/props.dart + - lib/model/filters/covered/location.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/filters.dart + - lib/model/filters/rating.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/ref/locales.dart + - lib/ref/mime_types.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/theme/format.dart + - lib/theme/icons.dart + - lib/theme/styles.dart + - lib/theme/themes.dart + - lib/utils/file_utils.dart + - lib/view/src/metadata/exportable_fields.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/basic/tv_edge_focus.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/dialogs/export_collection_stats_page.dart + - lib/widgets/stats/date/histogram.dart + - lib/widgets/stats/filter_table.dart + - lib/widgets/stats/mime_donut.dart + - lib/widgets/stats/percent_text.dart + - lib/widgets/stats/top_page.dart + - lib/widgets/viewer/controls/notifications.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/explorer/explorer_action_delegate.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/widgets/stats/top_page.dart + importa: + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/ref/locales.dart + - lib/ref/mime_types.dart + - lib/services/common/services.dart + - lib/theme/icons.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/media_query.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/stats/filter_table.dart + - lib/widgets/viewer/controls/notifications.dart + importato da: + - lib/widgets/stats/stats_page.dart + +lib/widgets/viewer/action/entry_action_delegate.dart + importa: + - lib/app_mode.dart + - lib/model/device.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/favourites.dart + - lib/model/entry/extensions/location.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/filters/filters.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/model/vaults/vaults.dart + - lib/services/common/services.dart + - lib/services/media/media_edit_service.dart + - lib/theme/durations.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/action_mixins/size_aware.dart + - lib/widgets/common/action_mixins/vault_aware.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/add_shortcut_dialog.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/dialogs/convert_entry_dialog.dart + - lib/widgets/dialogs/entry_editors/rename_entry_dialog.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/printer.dart + - lib/widgets/viewer/action/single_entry_editor.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/debug/debug_page.dart + - lib/widgets/viewer/entry_viewer_page.dart + - lib/widgets/viewer/multipage/conductor.dart + - lib/widgets/viewer/source_viewer_page.dart + - lib/widgets/viewer/video/conductor.dart + importato da: + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + +lib/widgets/viewer/action/entry_info_action_delegate.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/info.dart + - lib/model/entry/extensions/metadata_edition.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/filters/filters.dart + - lib/model/media/geotiff.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/ref/mime_types.dart + - lib/services/common/services.dart + - lib/widgets/common/action_mixins/entry_editor.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + - lib/widgets/map/map_page.dart + - lib/widgets/viewer/action/single_entry_editor.dart + - lib/widgets/viewer/debug/debug_page.dart + - lib/widgets/viewer/info/embedded/notifications.dart + importato da: + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + +lib/widgets/viewer/action/printer.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/images.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/services/common/services.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/viewer/action/entry_action_delegate.dart + +lib/widgets/viewer/action/single_entry_editor.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/catalog.dart + - lib/model/entry/extensions/location.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_source.dart + - lib/services/common/services.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + +lib/widgets/viewer/action/video_action_delegate.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/keys.dart + - lib/model/entry/extensions/location.dart + - lib/model/entry/extensions/props.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/source/collection_lens.dart + - lib/services/common/services.dart + - lib/services/media/enums.dart + - lib/theme/durations.dart + - lib/utils/android_file_utils.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/action_mixins/permission_aware.dart + - lib/widgets/common/action_mixins/size_aware.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/dialogs/video_speed_dialog.dart + - lib/widgets/dialogs/video_stream_selection_dialog.dart + - lib/widgets/settings/video/video_settings_page.dart + - lib/widgets/viewer/controls/notifications.dart + importato da: + - lib/widgets/wallpaper_page.dart + - lib/widgets/viewer/entry_viewer_stack.dart + +lib/widgets/viewer/controls/controller.dart + importa: + - lib/model/entry/entry.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/widgets/cast/cast_controller.dart + - lib/widgets/dialogs/cast_dialog.dart + - lib/widgets/viewer/controls/events.dart + importato da: + - lib/widgets/wallpaper_page.dart + - lib/widgets/viewer/entry_viewer_page.dart + - lib/widgets/viewer/screen_saver_page.dart + - lib/widgets/viewer/entry_viewer_page_dlna.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/slideshow_page.dart + - lib/widgets/viewer/fullscreen_cast_viewer_dlna.dart + - lib/widgets/viewer/entry_horizontal_pager.dart + - lib/widgets/viewer/visual/entry_page_view.dart + +lib/widgets/viewer/controls/events.dart + importa: + importato da: + - lib/widgets/viewer/controls/controller.dart + +lib/widgets/viewer/controls/intents.dart + importa: + importato da: + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/controls/shortcuts.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/slideshow_buttons.dart + +lib/widgets/viewer/controls/notifications.dart + importa: + - lib/model/entry/entry.dart + - lib/model/filters/filters.dart + importato da: + - lib/widgets/wallpaper_page.dart + - lib/widgets/collection/app_bar/collection_app_bar.dart + - lib/widgets/search/collection_search_delegate.dart + - lib/widgets/common/action_mixins/entry_storage.dart + - lib/widgets/common/map/buttons/coordinate_filter.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/entry_horizontal_pager.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/visual/raster.dart + - lib/widgets/viewer/overlay/locked.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/slideshow_buttons.dart + - lib/widgets/viewer/overlay/thumbnail_preview.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/map/map_page.dart + - lib/widgets/filter_grids/common/action_delegates/chip.dart + - lib/widgets/stats/top_page.dart + - lib/widgets/stats/stats_page.dart + +lib/widgets/viewer/controls/shortcuts.dart + importa: + - lib/widgets/viewer/controls/intents.dart + importato da: + - lib/widgets/viewer/entry_vertical_pager.dart + +lib/widgets/viewer/controls/transitions.dart + importa: + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/model/settings/enums/viewer_transition.dart + +lib/widgets/viewer/debug/db.dart + importa: + - lib/model/entry/entry.dart + - lib/model/metadata/address.dart + - lib/model/metadata/catalog.dart + - lib/model/metadata/trash.dart + - lib/model/source/collection_source.dart + - lib/model/viewer/video_playback.dart + - lib/services/common/services.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/viewer/debug/debug_page.dart + +lib/widgets/viewer/debug/debug_page.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/favourites.dart + - lib/model/entry/extensions/images.dart + - lib/model/entry/extensions/location.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/theme/icons.dart + - lib/widgets/viewer/debug/db.dart + - lib/widgets/viewer/debug/metadata.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + +lib/widgets/viewer/debug/metadata.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/location.dart + - lib/model/settings/settings.dart + - lib/ref/mime_types.dart + - lib/services/android_debug_service.dart + - lib/services/geocoding_service.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/viewer/debug/debug_page.dart + +lib/widgets/viewer/entry_horizontal_pager.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/settings/enums/viewer_transition.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/widgets/viewer/controls/controller.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/multipage/conductor.dart + - lib/widgets/viewer/page_entry_builder.dart + - lib/widgets/viewer/visual/entry_page_view.dart + importato da: + - lib/widgets/wallpaper_page.dart + - lib/widgets/viewer/entry_vertical_pager.dart + +lib/widgets/viewer/entry_vertical_pager.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/catalog.dart + - lib/model/entry/extensions/location.dart + - lib/model/entry/extensions/props.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/theme/durations.dart + - lib/widgets/aves_app.dart + - lib/widgets/common/behaviour/springy_scroll_physics.dart + - lib/widgets/common/extensions/theme.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/controls/controller.dart + - lib/widgets/viewer/controls/intents.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/controls/shortcuts.dart + - lib/widgets/viewer/entry_horizontal_pager.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/multipage/conductor.dart + - lib/widgets/viewer/video/conductor.dart + importato da: + - lib/widgets/viewer/entry_viewer_stack.dart + +lib/widgets/viewer/entry_viewer_page.dart + importa: + - lib/model/entry/entry.dart + - lib/model/source/collection_lens.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/theme.dart + - lib/widgets/viewer/controls/controller.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/providers.dart + importato da: + - lib/widgets/home/home_page.dart + - lib/widgets/collection/collection_grid.dart + - lib/widgets/viewer/info/embedded/embedded_data_opener.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/visual/error.dart + - lib/widgets/map/map_page.dart + +lib/widgets/viewer/entry_viewer_page_dlna.dart + importa: + - lib/model/entry/entry.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/theme.dart + - lib/widgets/viewer/controls/controller.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/providers.dart + - lib/model/source/collection_lens.dart + importato da: + - lib/widgets/viewer/fullscreen_cast_viewer_dlna.dart + +lib/widgets/viewer/entry_viewer_stack.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/filters/filters.dart + - lib/model/filters/trash.dart + - lib/model/highlight.dart + - lib/model/settings/enums/accessibility_timeout.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/widgets/aves_app.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/providers/viewer_entry_provider.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/controls/controller.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/hero.dart + - lib/widgets/viewer/multipage/conductor.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/locked.dart + - lib/widgets/viewer/overlay/panorama.dart + - lib/widgets/viewer/overlay/slideshow_buttons.dart + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/viewer/overlay/video/video.dart + - lib/widgets/viewer/page_entry_builder.dart + - lib/widgets/viewer/video/conductor.dart + - lib/widgets/viewer/view/conductor.dart + - lib/widgets/viewer/visual/controller_mixin.dart + importato da: + - lib/widgets/viewer/entry_viewer_page.dart + - lib/widgets/viewer/screen_saver_page.dart + - lib/widgets/viewer/entry_viewer_page_dlna.dart + - lib/widgets/viewer/slideshow_page.dart + +lib/widgets/viewer/fullscreen_cast_viewer.dart + importa: + - lib/model/entry/entry.dart + - lib/widgets/cast/cast_controller.dart + importato da: + - lib/widgets/collection/app_bar/cast/cast_bar_inline.dart + +lib/widgets/viewer/fullscreen_cast_viewer_dlna.dart + importa: + - lib/model/entry/entry.dart + - lib/widgets/viewer/controls/controller.dart + - lib/widgets/viewer/entry_viewer_page_dlna.dart + - lib/widgets/cast/cast_controller.dart + importato da: + - lib/widgets/collection/app_bar/cast/cast_bar_inline.dart + +lib/widgets/viewer/fullscreen_cast_viewer_fast.dart + importa: + - lib/model/entry/entry.dart + - lib/widgets/cast/cast_controller.dart + importato da: + +lib/widgets/viewer/hero.dart + importa: + - lib/model/entry/entry.dart + - lib/model/source/collection_lens.dart + importato da: + - lib/widgets/collection/grid/tile.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/map/scroller.dart + +lib/widgets/viewer/info/basic_section.dart + importa: + - lib/app_mode.dart + - lib/image_providers/app_icon_image_provider.dart + - lib/model/app_inventory.dart + - lib/model/dynamic_albums.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/favourites.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/favourites.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/covered/tag.dart + - lib/model/filters/date.dart + - lib/model/filters/favourite.dart + - lib/model/filters/mime.dart + - lib/model/filters/rating.dart + - lib/model/filters/type.dart + - lib/model/filters/weekday.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/ref/mime_types.dart + - lib/services/common/services.dart + - lib/theme/colors.dart + - lib/theme/format.dart + - lib/utils/file_utils.dart + - lib/utils/time_utils.dart + - lib/view/view.dart + - lib/widgets/common/action_controls/quick_choosers/rate_button.dart + - lib/widgets/common/action_controls/quick_choosers/tag_button.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/viewer/info/info_page.dart + +lib/widgets/viewer/info/color_section.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/images.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/widgets/common/basic/color_indicator.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/viewer/info/info_page.dart + +lib/widgets/viewer/info/common.dart + importa: + - lib/widgets/common/basic/link_chip.dart + - lib/widgets/common/identity/aves_filter_chip.dart + importato da: + - lib/widgets/common/map/attribution.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/viewer/info/color_section.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + - lib/widgets/viewer/info/metadata/xmp_card.dart + - lib/widgets/viewer/info/metadata/metadata_section.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + - lib/widgets/viewer/info/metadata/xmp_ns/google.dart + - lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart + - lib/widgets/viewer/debug/debug_page.dart + - lib/widgets/viewer/debug/metadata.dart + - lib/widgets/viewer/debug/db.dart + - lib/widgets/debug/os_codecs.dart + - lib/widgets/debug/os_paths.dart + - lib/widgets/debug/general.dart + - lib/widgets/debug/os_storage.dart + - lib/widgets/debug/capabilities.dart + - lib/widgets/debug/os_apps.dart + - lib/widgets/debug/settings.dart + - lib/widgets/debug/report.dart + +lib/widgets/viewer/info/embedded/embedded_data_opener.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/keys.dart + - lib/ref/mime_types.dart + - lib/services/common/services.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/behaviour/routes.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/viewer/entry_viewer_page.dart + - lib/widgets/viewer/info/embedded/notifications.dart + importato da: + - lib/widgets/viewer/info/info_search_delegate.dart + - lib/widgets/viewer/info/info_page.dart + +lib/widgets/viewer/info/embedded/notifications.dart + importa: + importato da: + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + - lib/widgets/viewer/info/metadata/xmp_ns/google.dart + - lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart + - lib/widgets/viewer/info/embedded/embedded_data_opener.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + +lib/widgets/viewer/info/info_app_bar.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/props.dart + - lib/model/selection.dart + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/theme/icons.dart + - lib/theme/themes.dart + - lib/view/view.dart + - lib/widgets/common/app_bar/app_bar_title.dart + - lib/widgets/common/app_bar/sliver_app_bar_title.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/search/route.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/info/info_search_delegate.dart + - lib/widgets/viewer/info/metadata/metadata_dir.dart + importato da: + - lib/widgets/viewer/info/info_page.dart + +lib/widgets/viewer/info/info_page.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/filters/filters.dart + - lib/model/selection.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/theme/durations.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/basic/tv_edge_focus.dart + - lib/widgets/viewer/action/entry_info_action_delegate.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/info/basic_section.dart + - lib/widgets/viewer/info/color_section.dart + - lib/widgets/viewer/info/embedded/embedded_data_opener.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/info/location_section.dart + - lib/widgets/viewer/info/metadata/metadata_dir.dart + - lib/widgets/viewer/info/metadata/metadata_section.dart + - lib/widgets/viewer/multipage/conductor.dart + - lib/widgets/viewer/page_entry_builder.dart + importato da: + - lib/widgets/viewer/entry_vertical_pager.dart + +lib/widgets/viewer/info/info_search_delegate.dart + importa: + - lib/model/entry/entry.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/common/providers/media_query_data_provider.dart + - lib/widgets/common/search/delegate.dart + - lib/widgets/viewer/info/embedded/embedded_data_opener.dart + - lib/widgets/viewer/info/metadata/metadata_dir.dart + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + importato da: + - lib/widgets/viewer/info/info_app_bar.dart + +lib/widgets/viewer/info/location_section.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/location.dart + - lib/model/filters/covered/location.dart + - lib/model/settings/enums/coordinate_format.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/services/common/services.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_filter_chip.dart + - lib/widgets/common/map/geo_map.dart + - lib/widgets/common/map/map_action_delegate.dart + - lib/widgets/common/providers/map_theme_provider.dart + - lib/widgets/dialogs/aves_dialog.dart + - lib/widgets/map/map_page.dart + - lib/widgets/viewer/info/common.dart + importato da: + - lib/widgets/viewer/info/info_page.dart + +lib/widgets/viewer/info/metadata/geotiff.dart + importa: + - lib/ref/metadata/geotiff.dart + importato da: + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + +lib/widgets/viewer/info/metadata/metadata_dir.dart + importa: + importato da: + - lib/model/entry/extensions/info.dart + - lib/widgets/viewer/info/info_search_delegate.dart + - lib/widgets/viewer/info/info_app_bar.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/info/metadata/tv_page.dart + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + - lib/widgets/viewer/info/metadata/metadata_section.dart + +lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + importa: + - lib/model/entry/entry.dart + - lib/ref/brand_colors.dart + - lib/services/metadata/svg_metadata_service.dart + - lib/theme/colors.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_expansion_tile.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + - lib/widgets/viewer/info/common.dart + - lib/widgets/viewer/info/embedded/notifications.dart + - lib/widgets/viewer/info/metadata/geotiff.dart + - lib/widgets/viewer/info/metadata/metadata_dir.dart + - lib/widgets/viewer/info/metadata/metadata_thumbnail.dart + - lib/widgets/viewer/info/metadata/xmp_tile.dart + - lib/widgets/viewer/source_viewer_page.dart + importato da: + - lib/widgets/viewer/info/info_search_delegate.dart + - lib/widgets/viewer/info/metadata/tv_page.dart + - lib/widgets/viewer/info/metadata/metadata_section.dart + +lib/widgets/viewer/info/metadata/metadata_section.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/info.dart + - lib/model/settings/settings.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + - lib/widgets/viewer/info/common.dart + - lib/widgets/viewer/info/metadata/metadata_dir.dart + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + - lib/widgets/viewer/info/metadata/tv_page.dart + importato da: + - lib/widgets/viewer/info/info_page.dart + +lib/widgets/viewer/info/metadata/metadata_thumbnail.dart + importa: + - lib/image_providers/descriptor_provider.dart + - lib/model/entry/entry.dart + - lib/services/common/services.dart + importato da: + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + +lib/widgets/viewer/info/metadata/tv_page.dart + importa: + - lib/model/entry/entry.dart + - lib/theme/icons.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/behaviour/intents.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/navigation/tv_rail.dart + - lib/widgets/viewer/info/metadata/metadata_dir.dart + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + importato da: + - lib/widgets/viewer/info/metadata/metadata_section.dart + +lib/widgets/viewer/info/metadata/xmp_card.dart + importa: + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/widgets/common/basic/multi_cross_fader.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/viewer/info/common.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + importato da: + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + +lib/widgets/viewer/info/metadata/xmp_namespaces.dart + importa: + - lib/ref/brand_colors.dart + - lib/ref/metadata/xmp.dart + - lib/theme/colors.dart + - lib/utils/string_utils.dart + - lib/utils/xmp_utils.dart + - lib/view/view.dart + - lib/widgets/common/identity/highlight_title.dart + - lib/widgets/viewer/info/common.dart + - lib/widgets/viewer/info/metadata/xmp_card.dart + - lib/widgets/viewer/info/metadata/xmp_ns/crs.dart + - lib/widgets/viewer/info/metadata/xmp_ns/exif.dart + - lib/widgets/viewer/info/metadata/xmp_ns/google.dart + - lib/widgets/viewer/info/metadata/xmp_ns/misc.dart + - lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart + - lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart + - lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart + importato da: + - lib/widgets/viewer/info/metadata/xmp_card.dart + - lib/widgets/viewer/info/metadata/xmp_tile.dart + - lib/widgets/viewer/info/metadata/xmp_ns/google.dart + - lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart + - lib/widgets/viewer/info/metadata/xmp_ns/crs.dart + - lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart + - lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart + - lib/widgets/viewer/info/metadata/xmp_ns/misc.dart + - lib/widgets/viewer/info/metadata/xmp_ns/exif.dart + +lib/widgets/viewer/info/metadata/xmp_ns/crs.dart + importa: + - lib/ref/metadata/xmp.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + importato da: + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + +lib/widgets/viewer/info/metadata/xmp_ns/exif.dart + importa: + - lib/ref/metadata/exif.dart + - lib/ref/metadata/xmp.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + importato da: + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + +lib/widgets/viewer/info/metadata/xmp_ns/google.dart + importa: + - lib/ref/metadata/xmp.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/viewer/info/common.dart + - lib/widgets/viewer/info/embedded/notifications.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + importato da: + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + +lib/widgets/viewer/info/metadata/xmp_ns/misc.dart + importa: + - lib/ref/metadata/xmp.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + importato da: + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + +lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart + importa: + - lib/ref/metadata/xmp.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + importato da: + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + +lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart + importa: + - lib/ref/metadata/exif.dart + - lib/ref/metadata/xmp.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + importato da: + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + +lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart + importa: + - lib/ref/metadata/xmp.dart + - lib/ref/mime_types.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/viewer/info/common.dart + - lib/widgets/viewer/info/embedded/notifications.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + importato da: + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + +lib/widgets/viewer/info/metadata/xmp_tile.dart + importa: + - lib/utils/xmp_utils.dart + - lib/widgets/viewer/info/metadata/xmp_namespaces.dart + importato da: + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + +lib/widgets/viewer/multipage/conductor.dart + importa: + - lib/model/entry/entry.dart + - lib/widgets/viewer/multipage/controller.dart + importato da: + - lib/widgets/wallpaper_page.dart + - lib/widgets/viewer/providers.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/entry_horizontal_pager.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/visual/controller_mixin.dart + - lib/widgets/viewer/overlay/top.dart + +lib/widgets/viewer/multipage/controller.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/multipage.dart + importato da: + - lib/widgets/viewer/page_entry_builder.dart + - lib/widgets/viewer/multipage/conductor.dart + - lib/widgets/viewer/visual/controller_mixin.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/multipage.dart + - lib/widgets/viewer/overlay/details/position_title.dart + - lib/widgets/viewer/overlay/details/details.dart + - lib/widgets/viewer/overlay/details/date.dart + +lib/widgets/viewer/overlay/bottom.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/selection.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/widgets/common/extensions/media_query.dart + - lib/widgets/viewer/controls/intents.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/multipage/controller.dart + - lib/widgets/viewer/overlay/multipage.dart + - lib/widgets/viewer/overlay/selection_button.dart + - lib/widgets/viewer/overlay/thumbnail_preview.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/viewer/overlay/wallpaper_buttons.dart + - lib/widgets/viewer/page_entry_builder.dart + importato da: + - lib/widgets/wallpaper_page.dart + - lib/widgets/settings/viewer/viewer_actions_editor.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/overlay/selection_button.dart + - lib/widgets/viewer/overlay/slideshow_buttons.dart + - lib/widgets/viewer/overlay/wallpaper_buttons.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/viewer/overlay/panorama.dart + - lib/widgets/viewer/overlay/video/video.dart + - lib/widgets/viewer/overlay/video/ab_repeat.dart + - lib/widgets/viewer/overlay/video/controls.dart + +lib/widgets/viewer/overlay/details/date.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/props.dart + - lib/theme/format.dart + - lib/theme/icons.dart + - lib/theme/text.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/viewer/multipage/controller.dart + - lib/widgets/viewer/overlay/details/details.dart + importato da: + - lib/widgets/viewer/overlay/details/details.dart + +lib/widgets/viewer/overlay/details/description.dart + importa: + - lib/theme/icons.dart + - lib/widgets/viewer/overlay/details/details.dart + importato da: + - lib/widgets/viewer/overlay/details/details.dart + +lib/widgets/viewer/overlay/details/details.dart + importa: + - lib/model/entry/entry.dart + - lib/model/metadata/overlay.dart + - lib/model/settings/settings.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/theme/styles.dart + - lib/widgets/common/extensions/theme.dart + - lib/widgets/viewer/multipage/controller.dart + - lib/widgets/viewer/overlay/details/date.dart + - lib/widgets/viewer/overlay/details/description.dart + - lib/widgets/viewer/overlay/details/expander.dart + - lib/widgets/viewer/overlay/details/location.dart + - lib/widgets/viewer/overlay/details/position_title.dart + - lib/widgets/viewer/overlay/details/rating_tags.dart + - lib/widgets/viewer/overlay/details/shooting.dart + - lib/widgets/viewer/page_entry_builder.dart + importato da: + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/viewer/overlay/details/description.dart + - lib/widgets/viewer/overlay/details/rating_tags.dart + - lib/widgets/viewer/overlay/details/location.dart + - lib/widgets/viewer/overlay/details/shooting.dart + - lib/widgets/viewer/overlay/details/date.dart + +lib/widgets/viewer/overlay/details/expander.dart + importa: + importato da: + - lib/widgets/viewer/overlay/details/details.dart + +lib/widgets/viewer/overlay/details/location.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/location.dart + - lib/model/settings/enums/coordinate_format.dart + - lib/model/settings/settings.dart + - lib/theme/icons.dart + - lib/theme/text.dart + - lib/widgets/viewer/overlay/details/details.dart + importato da: + - lib/widgets/viewer/overlay/details/details.dart + +lib/widgets/viewer/overlay/details/position_title.dart + importa: + - lib/model/entry/entry.dart + - lib/model/multipage.dart + - lib/theme/text.dart + - lib/widgets/viewer/multipage/controller.dart + importato da: + - lib/widgets/viewer/overlay/details/details.dart + +lib/widgets/viewer/overlay/details/rating_tags.dart + importa: + - lib/model/entry/entry.dart + - lib/theme/icons.dart + - lib/theme/text.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/viewer/overlay/details/details.dart + importato da: + - lib/widgets/viewer/overlay/details/details.dart + +lib/widgets/viewer/overlay/details/shooting.dart + importa: + - lib/model/metadata/overlay.dart + - lib/theme/icons.dart + - lib/theme/text.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/viewer/overlay/details/details.dart + importato da: + - lib/widgets/viewer/overlay/details/details.dart + +lib/widgets/viewer/overlay/histogram.dart + importa: + - lib/model/entry/entry.dart + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/viewer/view/controller.dart + - lib/widgets/viewer/view/histogram.dart + importato da: + - lib/widgets/viewer/overlay/top.dart + +lib/widgets/viewer/overlay/locked.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/media_query.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + importato da: + - lib/widgets/viewer/entry_viewer_stack.dart + +lib/widgets/viewer/overlay/minimap.dart + importa: + - lib/model/viewer/view_state.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/editor/transform/controller.dart + - lib/widgets/editor/transform/transformation.dart + - lib/widgets/viewer/overlay/top.dart + importato da: + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/editor/entry_editor_page.dart + +lib/widgets/viewer/overlay/multipage.dart + importa: + - lib/model/multipage.dart + - lib/widgets/common/thumbnail/scroller.dart + - lib/widgets/viewer/multipage/controller.dart + - lib/widgets/viewer/view/conductor.dart + importato da: + - lib/widgets/viewer/overlay/bottom.dart + +lib/widgets/viewer/overlay/panorama.dart + importa: + - lib/model/entry/entry.dart + - lib/services/common/services.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/panorama_page.dart + importato da: + - lib/widgets/viewer/entry_viewer_stack.dart + +lib/widgets/viewer/overlay/selection_button.dart + importa: + - lib/model/entry/entry.dart + - lib/model/selection.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/theme/text.dart + - lib/widgets/common/basic/text/animated_diff.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/viewer/overlay/bottom.dart + importato da: + - lib/widgets/viewer/overlay/bottom.dart + +lib/widgets/viewer/overlay/slideshow_buttons.dart + importa: + - lib/model/settings/settings.dart + - lib/view/view.dart + - lib/widgets/common/extensions/media_query.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/viewer/controls/intents.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/viewer/slideshow_page.dart + importato da: + - lib/widgets/viewer/entry_viewer_stack.dart + +lib/widgets/viewer/overlay/thumbnail_preview.dart + importa: + - lib/model/entry/entry.dart + - lib/widgets/common/thumbnail/scroller.dart + - lib/widgets/viewer/controls/notifications.dart + importato da: + - lib/widgets/viewer/overlay/bottom.dart + +lib/widgets/viewer/overlay/top.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/settings/settings.dart + - lib/model/viewer/view_state.dart + - lib/theme/themes.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/fx/blurred.dart + - lib/widgets/common/fx/borders.dart + - lib/widgets/viewer/multipage/conductor.dart + - lib/widgets/viewer/overlay/details/details.dart + - lib/widgets/viewer/overlay/histogram.dart + - lib/widgets/viewer/overlay/minimap.dart + - lib/widgets/viewer/page_entry_builder.dart + - lib/widgets/viewer/view/conductor.dart + - lib/widgets/viewer/view/controller.dart + importato da: + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/overlay/minimap.dart + - lib/widgets/viewer/overlay/histogram.dart + +lib/widgets/viewer/overlay/video/ab_repeat.dart + importa: + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/viewer/overlay/bottom.dart + importato da: + - lib/widgets/viewer/overlay/video/video.dart + +lib/widgets/viewer/overlay/video/controls.dart + importa: + - lib/model/settings/settings.dart + - lib/view/view.dart + - lib/widgets/common/action_controls/togglers/play.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/viewer/overlay/bottom.dart + importato da: + - lib/widgets/settings/video/control_actions.dart + - lib/widgets/viewer/overlay/video/video.dart + +lib/widgets/viewer/overlay/video/progress_bar.dart + importa: + - lib/model/settings/settings.dart + - lib/ref/locales.dart + - lib/theme/format.dart + - lib/theme/icons.dart + - lib/theme/styles.dart + - lib/theme/themes.dart + - lib/widgets/common/extensions/theme.dart + - lib/widgets/common/fx/blurred.dart + - lib/widgets/common/fx/borders.dart + importato da: + - lib/widgets/viewer/overlay/video/video.dart + +lib/widgets/viewer/overlay/video/video.dart + importa: + - lib/model/entry/entry.dart + - lib/view/view.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/video/ab_repeat.dart + - lib/widgets/viewer/overlay/video/controls.dart + - lib/widgets/viewer/overlay/video/progress_bar.dart + importato da: + - lib/widgets/wallpaper_page.dart + - lib/widgets/viewer/entry_viewer_stack.dart + +lib/widgets/viewer/overlay/viewer_buttons.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/settings/enums/accessibility_animations.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/services/common/services.dart + - lib/theme/icons.dart + - lib/view/view.dart + - lib/widgets/common/action_controls/quick_choosers/move_button.dart + - lib/widgets/common/action_controls/quick_choosers/rate_button.dart + - lib/widgets/common/action_controls/quick_choosers/share_button.dart + - lib/widgets/common/action_controls/quick_choosers/tag_button.dart + - lib/widgets/common/action_controls/togglers/favourite.dart + - lib/widgets/common/action_controls/togglers/mute.dart + - lib/widgets/common/action_controls/togglers/play.dart + - lib/widgets/common/basic/font_size_icon_theme.dart + - lib/widgets/common/basic/popup/container.dart + - lib/widgets/common/basic/popup/expansion_panel.dart + - lib/widgets/common/basic/popup/menu_row.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/captioned_button.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/video/conductor.dart + importato da: + - lib/widgets/viewer/overlay/locked.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/slideshow_buttons.dart + - lib/widgets/viewer/overlay/wallpaper_buttons.dart + - lib/widgets/editor/control_panel.dart + +lib/widgets/viewer/overlay/wallpaper_buttons.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/images.dart + - lib/model/entry/extensions/props.dart + - lib/services/wallpaper_service.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + - lib/widgets/dialogs/wallpaper_settings_dialog.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + - lib/widgets/viewer/video/conductor.dart + - lib/widgets/viewer/view/conductor.dart + importato da: + - lib/widgets/viewer/overlay/bottom.dart + +lib/widgets/viewer/page_entry_builder.dart + importa: + - lib/model/entry/entry.dart + - lib/model/multipage.dart + - lib/widgets/viewer/multipage/controller.dart + importato da: + - lib/widgets/wallpaper_page.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/entry_horizontal_pager.dart + - lib/widgets/viewer/info/info_page.dart + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/details/details.dart + +lib/widgets/viewer/panorama_page.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/images.dart + - lib/model/media/panorama.dart + - lib/model/settings/settings.dart + - lib/theme/icons.dart + - lib/widgets/aves_app.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/extensions/media_query.dart + - lib/widgets/common/identity/buttons/overlay_button.dart + importato da: + - lib/widgets/viewer/overlay/panorama.dart + +lib/widgets/viewer/providers.dart + importa: + - lib/model/source/collection_lens.dart + - lib/widgets/viewer/multipage/conductor.dart + - lib/widgets/viewer/video/conductor.dart + - lib/widgets/viewer/view/conductor.dart + importato da: + - lib/widgets/wallpaper_page.dart + - lib/widgets/viewer/entry_viewer_page.dart + - lib/widgets/viewer/screen_saver_page.dart + - lib/widgets/viewer/entry_viewer_page_dlna.dart + - lib/widgets/viewer/slideshow_page.dart + +lib/widgets/viewer/screen_saver_page.dart + importa: + - lib/model/filters/mime.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/theme/icons.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/viewer/controls/controller.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/providers.dart + importato da: + - lib/widgets/home/home_page.dart + +lib/widgets/viewer/slideshow_page.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/filters/covered/stored_album.dart + - lib/model/filters/mime.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/model/source/collection_source.dart + - lib/theme/icons.dart + - lib/widgets/collection/collection_page.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/settings/viewer/slideshow.dart + - lib/widgets/viewer/controls/controller.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/providers.dart + importato da: + - lib/widgets/collection/entry_set_action_delegate.dart + - lib/widgets/viewer/overlay/slideshow_buttons.dart + - lib/widgets/filter_grids/common/action_delegates/chip_set.dart + +lib/widgets/viewer/source_viewer_page.dart + importa: + - lib/widgets/common/aves_highlight.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + importato da: + - lib/widgets/viewer/info/metadata/metadata_dir_tile.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + +lib/widgets/viewer/video/conductor.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/props.dart + - lib/model/settings/settings.dart + - lib/model/source/collection_lens.dart + - lib/services/common/services.dart + - lib/widgets/viewer/video/db_playback_state_handler.dart + - lib/remote/remote_origin.dart + importato da: + - lib/widgets/wallpaper_page.dart + - lib/widgets/viewer/providers.dart + - lib/widgets/viewer/entry_vertical_pager.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/action/entry_action_delegate.dart + - lib/widgets/viewer/visual/controller_mixin.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/overlay/wallpaper_buttons.dart + - lib/widgets/viewer/overlay/viewer_buttons.dart + +lib/widgets/viewer/video/db_playback_state_handler.dart + importa: + - lib/model/settings/settings.dart + - lib/model/viewer/video_playback.dart + - lib/services/common/services.dart + - lib/theme/format.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/dialogs/aves_confirmation_dialog.dart + importato da: + - lib/widgets/viewer/video/conductor.dart + +lib/widgets/viewer/video/remote_video_factory.dart + importa: + - lib/remote/remote_http.dart + - lib/model/entry/entry.dart + importato da: + - lib/widgets/viewer/visual/entry_page_view.dart + +lib/widgets/viewer/view/conductor.dart + importa: + - lib/model/entry/entry.dart + - lib/model/viewer/view_state.dart + - lib/widgets/viewer/view/controller.dart + importato da: + - lib/widgets/viewer/providers.dart + - lib/widgets/viewer/entry_viewer_stack.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/viewer/overlay/wallpaper_buttons.dart + - lib/widgets/viewer/overlay/multipage.dart + +lib/widgets/viewer/view/controller.dart + importa: + - lib/model/entry/entry.dart + - lib/model/viewer/view_state.dart + - lib/widgets/viewer/view/histogram.dart + importato da: + - lib/widgets/viewer/view/conductor.dart + - lib/widgets/viewer/overlay/top.dart + - lib/widgets/viewer/overlay/histogram.dart + +lib/widgets/viewer/view/histogram.dart + importa: + - lib/model/settings/settings.dart + importato da: + - lib/widgets/viewer/view/controller.dart + - lib/widgets/viewer/overlay/histogram.dart + +lib/widgets/viewer/visual/controller_mixin.dart + importa: + - lib/app_mode.dart + - lib/model/device.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/settings/settings.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/widgets/viewer/multipage/conductor.dart + - lib/widgets/viewer/multipage/controller.dart + - lib/widgets/viewer/video/conductor.dart + importato da: + - lib/widgets/wallpaper_page.dart + - lib/widgets/viewer/entry_viewer_stack.dart + +lib/widgets/viewer/visual/entry_page_view.dart + importa: + - lib/app_mode.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/props.dart + - lib/model/settings/enums/widget_outline.dart + - lib/model/settings/settings.dart + - lib/model/viewer/view_state.dart + - lib/services/common/services.dart + - lib/services/media/media_session_service.dart + - lib/theme/icons.dart + - lib/view/view.dart + - lib/widgets/aves_app.dart + - lib/widgets/common/action_mixins/feedback.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/home_widget.dart + - lib/widgets/viewer/controls/controller.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/hero.dart + - lib/widgets/viewer/video/conductor.dart + - lib/widgets/viewer/view/conductor.dart + - lib/widgets/viewer/visual/error.dart + - lib/widgets/viewer/visual/raster.dart + - lib/widgets/viewer/visual/vector.dart + - lib/widgets/viewer/visual/video/cover.dart + - lib/widgets/viewer/visual/video/subtitle/subtitle.dart + - lib/widgets/viewer/visual/video/swipe_action.dart + - lib/widgets/viewer/visual/video/video_view.dart + - lib/widgets/viewer/video/remote_video_factory.dart + - lib/remote/remote_origin.dart + importato da: + - lib/widgets/viewer/entry_horizontal_pager.dart + - lib/widgets/viewer/visual/vector.dart + - lib/widgets/viewer/visual/raster.dart + +lib/widgets/viewer/visual/error.dart + importa: + - lib/model/entry/entry.dart + - lib/theme/icons.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/empty.dart + - lib/widgets/viewer/entry_viewer_page.dart + importato da: + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/editor/image.dart + +lib/widgets/viewer/visual/raster.dart + importa: + - lib/image_providers/region_provider.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/images.dart + - lib/model/entry/extensions/props.dart + - lib/model/settings/enums/entry_background.dart + - lib/model/settings/settings.dart + - lib/model/viewer/view_state.dart + - lib/widgets/common/fx/checkered_decoration.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/remote/remote_http.dart + - lib/remote/remote_origin.dart + importato da: + - lib/widgets/viewer/visual/entry_page_view.dart + - lib/widgets/editor/image.dart + +lib/widgets/viewer/visual/vector.dart + importa: + - lib/image_providers/region_provider.dart + - lib/model/entry/entry.dart + - lib/model/entry/extensions/images.dart + - lib/model/settings/enums/entry_background.dart + - lib/model/settings/settings.dart + - lib/model/viewer/view_state.dart + - lib/utils/math_utils.dart + - lib/widgets/common/fx/checkered_decoration.dart + - lib/widgets/viewer/visual/entry_page_view.dart + importato da: + - lib/widgets/viewer/visual/entry_page_view.dart + +lib/widgets/viewer/visual/video/cover.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/images.dart + - lib/model/entry/extensions/multipage.dart + - lib/theme/durations.dart + - lib/widgets/common/thumbnail/image.dart + importato da: + - lib/widgets/viewer/visual/entry_page_view.dart + +lib/widgets/viewer/visual/video/subtitle/ass_parser.dart + importa: + - lib/ref/unicode.dart + - lib/widgets/viewer/visual/video/subtitle/line.dart + - lib/widgets/viewer/visual/video/subtitle/span.dart + - lib/widgets/viewer/visual/video/subtitle/style.dart + importato da: + - lib/widgets/viewer/visual/video/subtitle/subtitle.dart + +lib/widgets/viewer/visual/video/subtitle/line.dart + importa: + - lib/widgets/viewer/visual/video/subtitle/span.dart + importato da: + - lib/widgets/viewer/visual/video/subtitle/ass_parser.dart + +lib/widgets/viewer/visual/video/subtitle/span.dart + importa: + - lib/widgets/viewer/visual/video/subtitle/style.dart + importato da: + - lib/widgets/viewer/visual/video/subtitle/ass_parser.dart + - lib/widgets/viewer/visual/video/subtitle/subtitle.dart + - lib/widgets/viewer/visual/video/subtitle/line.dart + +lib/widgets/viewer/visual/video/subtitle/style.dart + importa: + importato da: + - lib/widgets/viewer/visual/video/subtitle/ass_parser.dart + - lib/widgets/viewer/visual/video/subtitle/subtitle.dart + - lib/widgets/viewer/visual/video/subtitle/span.dart + +lib/widgets/viewer/visual/video/subtitle/subtitle.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/props.dart + - lib/model/settings/enums/subtitle_position.dart + - lib/model/settings/settings.dart + - lib/model/viewer/view_state.dart + - lib/widgets/common/basic/text/background_painter.dart + - lib/widgets/common/basic/text/outlined.dart + - lib/widgets/viewer/visual/video/subtitle/ass_parser.dart + - lib/widgets/viewer/visual/video/subtitle/span.dart + - lib/widgets/viewer/visual/video/subtitle/style.dart + importato da: + - lib/widgets/settings/video/subtitle_sample.dart + - lib/widgets/viewer/visual/entry_page_view.dart + +lib/widgets/viewer/visual/video/swipe_action.dart + importa: + - lib/theme/icons.dart + - lib/widgets/aves_app.dart + importato da: + - lib/widgets/viewer/visual/entry_page_view.dart + +lib/widgets/viewer/visual/video/video_view.dart + importa: + - lib/model/entry/entry.dart + importato da: + - lib/widgets/viewer/visual/entry_page_view.dart + +lib/widgets/wallpaper_page.dart + importa: + - lib/model/entry/entry.dart + - lib/model/entry/extensions/multipage.dart + - lib/model/entry/extensions/props.dart + - lib/model/settings/settings.dart + - lib/services/common/services.dart + - lib/theme/durations.dart + - lib/widgets/aves_app.dart + - lib/widgets/common/basic/insets.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/theme.dart + - lib/widgets/viewer/action/video_action_delegate.dart + - lib/widgets/viewer/controls/controller.dart + - lib/widgets/viewer/controls/notifications.dart + - lib/widgets/viewer/entry_horizontal_pager.dart + - lib/widgets/viewer/multipage/conductor.dart + - lib/widgets/viewer/overlay/bottom.dart + - lib/widgets/viewer/overlay/video/video.dart + - lib/widgets/viewer/page_entry_builder.dart + - lib/widgets/viewer/providers.dart + - lib/widgets/viewer/video/conductor.dart + - lib/widgets/viewer/visual/controller_mixin.dart + importato da: + - lib/widgets/home/home_page.dart + +lib/widgets/welcome_page.dart + importa: + - lib/app_flavor.dart + - lib/model/settings/defaults.dart + - lib/model/settings/settings.dart + - lib/theme/durations.dart + - lib/theme/icons.dart + - lib/theme/text.dart + - lib/widgets/about/policy_page.dart + - lib/widgets/common/basic/link_chip.dart + - lib/widgets/common/basic/markdown_container.dart + - lib/widgets/common/basic/scaffold.dart + - lib/widgets/common/extensions/build_context.dart + - lib/widgets/common/identity/aves_logo.dart + - lib/widgets/common/identity/buttons/outlined_button.dart + - lib/widgets/home/home_page.dart + importato da: + - lib/widgets/aves_app.dart diff --git a/docs/address.csv b/docs/address.csv new file mode 100644 index 0000000..ea44784 --- /dev/null +++ b/docs/address.csv @@ -0,0 +1,2058 @@ +id,addressLine,countryCode,countryName,adminArea,locality +1,WorkEat,,Italy,Lombardy,"Orio al Serio" +2,"17 Botany Bay",,Ireland,Leinster,Dublin +3,"The Lombard Townhouse",,Ireland,Leinster,Dublin +4,"O’Neill’s of Pearse Street",,Ireland,Leinster,Dublin +5,"O’Neill’s of Pearse Street",,Ireland,Leinster,Dublin +6,"29 Pearse Street",,Ireland,Leinster,Dublin +7,"The Oliver St John Gogarty",,Ireland,Leinster,Dublin +8,"23 Temple Bar",,Ireland,Leinster,Dublin +9,"ESSEX STREET EAST (SE)",,Ireland,Leinster,Dublin +10,"St Patrick's Park Tea Gardens",,Ireland,Leinster,Dublin +11,"Liberty Bell",,Ireland,Leinster,Dublin +12,"Saint James' Gate",,Ireland,Leinster,Dublin +13,"The Store",,Ireland,Leinster,Dublin +14,1837,,Ireland,Leinster,Dublin +15,Roasthouse,,Ireland,Leinster,Dublin +16,Roasthouse,,Ireland,Leinster,Dublin +17,"Gravity Bar",,Ireland,Leinster,Dublin +18,"Gravity Bar",,Ireland,Leinster,Dublin +19,"BELVIEW (SC)",,Ireland,Leinster,Dublin +20,"Arthur’s",,Ireland,Leinster,Dublin +21,"Morelli's",,Ireland,Dublin,Dublin +22,"Hansel & Gretel",,Ireland,Leinster,Dublin +23,"Dublin (Clare Street)",,Ireland,Leinster,Dublin +24,"20 Clare Street",,Ireland,Dublin,Dublin +25,"Glendalough Cathedral",,Ireland,"The Municipal District of Wicklow","The Municipal District of Wicklow" +26,"Glendasan River",,Ireland,"The Municipal District of Wicklow","The Municipal District of Wicklow" +27,"Kilkenny Castle",,Ireland,"The Municipal District of Kilkenny City",Kilkenny +28,"O Neills Restaurant",,Ireland,"The Municipal District of Cahir — Cashel",Cashel +29,"O Neills Restaurant",,Ireland,"The Municipal District of Cahir — Cashel",Cashel +30,"O Neills Restaurant",,Ireland,"The Municipal District of Cahir — Cashel",Cashel +31,"Castle Ivy Lodge",,Ireland,"The Municipal District of Cahir — Cashel",Cashel +32,"The Rock Of Cashel",,Ireland,"The Municipal District of Cahir — Cashel",Cashel +33,"Rock of Cashel",,Ireland,"The Municipal District of Cahir — Cashel",Cashel +34,"The Cathedral",,Ireland,"The Municipal District of Cahir — Cashel",Cashel +35,"Rock of Cashel",,Ireland,"The Municipal District of Cahir — Cashel",Cashel +36,"The Cathedral",,Ireland,"The Municipal District of Cahir — Cashel",Cashel +37,"The Cathedral",,Ireland,"The Municipal District of Cahir — Cashel",Cashel +38,"The Cathedral",,Ireland,"The Municipal District of Cahir — Cashel",Cashel +39,"Cormac's Chapel",,Ireland,"The Municipal District of Cahir — Cashel",Cashel +40,"Rock of Cashel",,Ireland,"The Municipal District of Cahir — Cashel",Cashel +41,"Mr. Bells",,Ireland,Munster,Cork +42,"English Market",,Ireland,Munster,Cork +43,"Mr. Bells",,Ireland,Munster,Cork +44,"English Market",,Ireland,Munster,Cork +45,"English Market",,Ireland,Munster,Cork +46,"Bishop Street",,Ireland,Cork,Cork +47,"Merchant's Quay Shopping Centre",,Ireland,Munster,Cork +48,"Ashes Bar",,Ireland,"Kenmare Municipal District",Glenbeigh +49,"Ashes Bar",,Ireland,"Kenmare Municipal District",Glenbeigh +50,"Castle View House",,Ireland,"Kenmare Municipal District",Glenbeigh +51,"Ashes Bar",,Ireland,"Kenmare Municipal District",Glenbeigh +52,"Ashes Bar",,Ireland,"Kenmare Municipal District",Glenbeigh +53,"Cúm an Easpaig",,Ireland,"Kenmare Municipal District","Kenmare Municipal District" +54,"John Egan",,Ireland,"Kenmare Municipal District",Sneem +55,"John Egan",,Ireland,"Kenmare Municipal District",Sneem +56,"John Egan",,Ireland,"Kenmare Municipal District",Sneem +57,"Grá & co.",,Ireland,"West Clare Municipal District","West Clare Municipal District" +58,"Grá & co.",,Ireland,"West Clare Municipal District", +59,"Grá & co.",,Ireland,"West Clare Municipal District", +60,"Grá & co.",,Ireland,"West Clare Municipal District", +61,"The Cliffs of Moher",,Ireland,"West Clare Municipal District","West Clare Municipal District" +62,"The Cliffs of Moher",,Ireland,"West Clare Municipal District","West Clare Municipal District" +63,"The Cliffs of Moher",,Ireland,"West Clare Municipal District","West Clare Municipal District" +64,"The Cliffs of Moher",,Ireland,"West Clare Municipal District","West Clare Municipal District" +65,"The Cliffs of Moher",,Ireland,"West Clare Municipal District","West Clare Municipal District" +66,"Aille River",,Ireland,"West Clare Municipal District","West Clare Municipal District" +67,"Aille River",,Ireland,"West Clare Municipal District","West Clare Municipal District" +68,"Fisherman's Rest",,Ireland,"West Clare Municipal District","Fitz's Cross" +69,"Fisherman's Rest",,Ireland,"West Clare Municipal District","Fitz's Cross" +70,"The Portal Tomb",,Ireland,"West Clare Municipal District","West Clare Municipal District" +71,"Poulnabrone Dolmen",,Ireland,"West Clare Municipal District","West Clare Municipal District" +72,"Poulnabrone Dolmen",,Ireland,"West Clare Municipal District","West Clare Municipal District" +73,"Corkscrew Hill",,Ireland,Clare, +74,Avenue,,Ireland,Connacht,Galway +75,"Cregg House",,Ireland,"Conamara Municipal District","Conamara Municipal District" +76,Vivian,,Ireland,"Conamara Municipal District",Clifden +77,"Burkes B & B",,Ireland,"Conamara Municipal District",Clifden +78,"Dawros River",,Ireland,"Conamara Municipal District","Conamara Municipal District" +79,"Dawros River",,Ireland,"Conamara Municipal District","Conamara Municipal District" +80,"Dawros River",,Ireland,"Conamara Municipal District","Conamara Municipal District" +81,"Dawros River",,Ireland,"Conamara Municipal District","Conamara Municipal District" +82,"Ballna Bog",,Ireland,"The Municipal District of Clane — Maynooth","The Municipal District of Clane — Maynooth" +83,"Rathbride House",,Ireland,Kildare,"The Municipal District of Kildare — Newbridge" +84,"Rathbride House",,Ireland,Kildare,"The Municipal District of Kildare — Newbridge" +85,"Japanese Gardens",,Ireland,"The Municipal District of Kildare — Newbridge","Tracey's Crossroads" +86,"Japanese Gardens",,Ireland,"The Municipal District of Kildare — Newbridge","Tracey's Crossroads" +87,"Japanese Gardens",,Ireland,"The Municipal District of Kildare — Newbridge","Tracey's Crossroads" +88,"Japanese Gardens",,Ireland,"The Municipal District of Kildare — Newbridge","Tracey's Crossroads" +89,"Japanese Gardens",,Ireland,"The Municipal District of Kildare — Newbridge","Tracey's Crossroads" +90,"Japanese Gardens",,Ireland,"The Municipal District of Kildare — Newbridge","Tracey's Crossroads" +6959,,IT,Italy,Emilia-Romagna,"Forlì" +6960,,IT,Italy,Emilia-Romagna,"Forlì" +6961,,IT,Italy,Emilia-Romagna,"Forlì" +6962,,IT,Italy,Emilia-Romagna,"Forlì" +6964,,IT,Italy,Emilia-Romagna,"Forlì" +6965,,IT,Italy,Emilia-Romagna,"Forlì" +6967,,IT,Italy,Emilia-Romagna,"Forlì" +7832,,IT,Italy,Emilia-Romagna,"Forlì" +7847,,IT,Italy,Emilia-Romagna,Brisighella +7848,,IT,Italy,Emilia-Romagna,Brisighella +7850,,IT,Italy,Emilia-Romagna,Brisighella +7851,,IT,Italy,Emilia-Romagna,Brisighella +7852,,IT,Italy,Emilia-Romagna,Brisighella +7853,,IT,Italy,Emilia-Romagna,Brisighella +7854,,IT,Italy,Emilia-Romagna,Brisighella +7855,,IT,Italy,Emilia-Romagna,Brisighella +7856,,IT,Italy,Emilia-Romagna,Brisighella +7857,,IT,Italy,Emilia-Romagna,Brisighella +7858,,IT,Italy,Emilia-Romagna,Brisighella +7859,,IT,Italy,Emilia-Romagna,Brisighella +7860,,IT,Italy,Emilia-Romagna,Brisighella +7861,,IT,Italy,Emilia-Romagna,Brisighella +7862,,IT,Italy,Emilia-Romagna,Brisighella +7863,,IT,Italy,Emilia-Romagna,Brisighella +7864,,IT,Italy,Emilia-Romagna,Brisighella +7865,,IT,Italy,Emilia-Romagna,Brisighella +7866,,IT,Italy,Emilia-Romagna,Brisighella +7867,,IT,Italy,Emilia-Romagna,Brisighella +7868,,IT,Italy,Emilia-Romagna,Brisighella +7869,,IT,Italy,Emilia-Romagna,Brisighella +7870,,IT,Italy,Emilia-Romagna,Brisighella +7871,,IT,Italy,Emilia-Romagna,Brisighella +7872,,IT,Italy,Emilia-Romagna,Brisighella +7873,,IT,Italy,Emilia-Romagna,Brisighella +7874,,IT,Italy,Emilia-Romagna,Brisighella +7875,,IT,Italy,Emilia-Romagna,Brisighella +7876,,IT,Italy,Emilia-Romagna,Brisighella +7877,,IT,Italy,Emilia-Romagna,Brisighella +7878,,IT,Italy,Emilia-Romagna,Brisighella +7879,,IT,Italy,Emilia-Romagna,Brisighella +7880,,IT,Italy,Emilia-Romagna,Brisighella +7881,,IT,Italy,Emilia-Romagna,Brisighella +7882,,IT,Italy,Emilia-Romagna,Brisighella +7883,,IT,Italy,Emilia-Romagna,Brisighella +7884,,IT,Italy,Emilia-Romagna,Brisighella +7885,,IT,Italy,Emilia-Romagna,Brisighella +7886,,IT,Italy,Emilia-Romagna,Brisighella +7887,,IT,Italy,Emilia-Romagna,Rontana +7888,,IT,Italy,Emilia-Romagna,Brisighella +7891,,IT,Italy,Emilia-Romagna,"Forlì" +7911,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7912,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7915,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7916,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7917,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7918,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7919,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7920,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7921,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7922,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7923,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7924,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7925,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7926,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7927,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7928,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7929,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7930,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7931,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7932,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7933,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7934,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7935,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7936,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7937,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7938,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7939,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7940,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7941,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7942,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7943,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7944,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7945,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7946,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7947,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7948,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7949,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7950,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7951,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7952,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7953,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7954,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7955,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7956,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7957,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7958,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7959,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7960,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7961,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7962,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7963,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7964,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7965,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7966,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7967,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7968,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7969,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7970,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7971,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7972,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7976,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7977,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7978,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7980,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7981,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7982,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7983,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7984,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7985,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7989,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7990,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7991,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7992,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7993,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7994,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7995,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7996,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7997,,IT,Italy,"Friuli-Venezia Giulia",Trieste +7998,,IT,Italy,"Friuli-Venezia Giulia",Trieste +8000,,IT,Italy,"Friuli-Venezia Giulia",Trieste +8029,,IT,Italy,Emilia-Romagna,"Forlì" +8030,,IT,Italy,Emilia-Romagna,"Forlì" +8031,,IT,Italy,Emilia-Romagna,"Forlì" +8032,,IT,Italy,Emilia-Romagna,"Forlì" +8037,,IT,Italy,Emilia-Romagna,"Forlì" +8077,,IT,Italy,Emilia-Romagna,"Civitella di Romagna" +8078,,IT,Italy,Emilia-Romagna,"Civitella di Romagna" +8079,,IT,Italy,Emilia-Romagna,"Civitella di Romagna" +8084,,IT,Italy,Emilia-Romagna,"Forlì" +8085,,IT,Italy,Emilia-Romagna,"Forlì" +8086,,IT,Italy,Emilia-Romagna,"Forlì" +8087,,IT,Italy,Emilia-Romagna,"Forlì" +8088,,IT,Italy,Emilia-Romagna,"Forlì" +8089,,IT,Italy,Emilia-Romagna,"Forlì" +8090,,IT,Italy,Emilia-Romagna,"Forlì" +8091,,IT,Italy,Emilia-Romagna,"Forlì" +8092,,IT,Italy,Emilia-Romagna,"Forlì" +8108,,IT,Italy,Emilia-Romagna,"Forlì" +8109,,IT,Italy,Emilia-Romagna,"Forlì" +8110,,IT,Italy,Emilia-Romagna,"Forlì" +8112,,IT,Italy,Emilia-Romagna,"Forlì" +8113,,IT,Italy,Emilia-Romagna,"Forlì" +8115,,IT,Italy,Emilia-Romagna,Riccione +8117,,IT,Italy,Marche,"Gabicce Mare" +8118,,IT,Italy,Marche,"Gabicce Mare" +8119,,IT,Italy,Marche,"Gabicce Mare" +8121,,IT,Italy,Marche,"Gabicce Mare" +8122,,IT,Italy,Marche,"Gabicce Mare" +8123,,IT,Italy,Marche,"Gabicce Mare" +8124,,IT,Italy,Marche,"Gabicce Mare" +8129,,IT,Italy,"Friuli-Venezia Giulia",Pordenone +8130,,IT,Italy,Emilia-Romagna,"Forlì" +8137,,IT,Italy,"Friuli-Venezia Giulia",Pordenone +8138,,IT,Italy,"Friuli-Venezia Giulia",Pordenone +8139,,IT,Italy,"Friuli-Venezia Giulia",Pordenone +8144,,IT,Italy,Emilia-Romagna,"Civitella di Romagna" +8145,,IT,Italy,Emilia-Romagna,"Civitella di Romagna" +8146,,IT,Italy,Emilia-Romagna,"Civitella di Romagna" +8147,,IT,Italy,Emilia-Romagna,"Civitella di Romagna" +8148,,IT,Italy,Emilia-Romagna,"Civitella di Romagna" +8149,,IT,Italy,Emilia-Romagna,"Civitella di Romagna" +8150,,IT,Italy,Emilia-Romagna,"Forlì" +8151,,IT,Italy,Emilia-Romagna,"Forlì" +8160,,IT,Italy,Emilia-Romagna,Faenza +8161,,IT,Italy,Emilia-Romagna,Faenza +8163,,IT,Italy,Emilia-Romagna,Faenza +8164,,IT,Italy,Emilia-Romagna,Faenza +8165,,IT,Italy,Emilia-Romagna,Faenza +8166,,IT,Italy,Emilia-Romagna,Faenza +8167,,IT,Italy,Emilia-Romagna,Faenza +8168,,IT,Italy,Emilia-Romagna,"Forlì" +8169,,IT,Italy,Emilia-Romagna,"Forlì" +8188,,IT,Italy,"Trentino-Alto Adige","Vigo di Fassa" +8189,,IT,Italy,"Trentino-South Tyrol","San Giovanni di Fassa" +8190,,IT,Italy,"Trentino-South Tyrol","San Giovanni di Fassa" +8192,,IT,Italy,"Trentino-Alto Adige","Vigo di Fassa" +8193,,IT,Italy,"Trentino-Alto Adige","Vigo di Fassa" +8194,,IT,Italy,"Trentino-Alto Adige","Vigo di Fassa" +8195,,IT,Italy,"Trentino-Alto Adige","Vigo di Fassa" +8196,,IT,Italy,"Trentino-Alto Adige","Vigo di Fassa" +8197,,IT,Italy,"Trentino-Alto Adige","Vigo di Fassa" +8198,,IT,Italy,"Trentino-Alto Adige","Vigo di Fassa" +8292,,IT,Italy,Emilia-Romagna,Longiano +8308,,IT,Italy,Emilia-Romagna,"Forlì" +8310,,IT,Italy,Emilia-Romagna,"Castrocaro Terme e Terra del Sole" +8311,,IT,Italy,Emilia-Romagna,"Castrocaro Terme e Terra del Sole" +8312,,IT,Italy,Emilia-Romagna,"Castrocaro Terme" +8313,,IT,Italy,Emilia-Romagna,"Castrocaro Terme" +8314,,IT,Italy,Emilia-Romagna,"Castrocaro Terme e Terra del Sole" +8315,,IT,Italy,Emilia-Romagna,"Castrocaro Terme e Terra del Sole" +8316,,IT,Italy,Emilia-Romagna,"Via Sadurano" +8317,,IT,Italy,Emilia-Romagna,Predappio +8318,,IT,Italy,Emilia-Romagna,Predappio +8319,,IT,Italy,Emilia-Romagna,Predappio +8320,,IT,Italy,Emilia-Romagna,Predappio +8322,,IT,Italy,Emilia-Romagna,Meldola +8323,,IT,Italy,Emilia-Romagna,Meldola +8324,,IT,Italy,Emilia-Romagna,Meldola +8325,,IT,Italy,Emilia-Romagna,"Forlì" +8326,,IT,Italy,Emilia-Romagna,"Forlì" +8328,,IT,Italy,Veneto,"Porto Santa Margherita" +8330,,IT,Italy,Emilia-Romagna,"Forlì" +8334,,IT,Italy,Emilia-Romagna,"Forlì" +8335,,IT,Italy,Emilia-Romagna,"Forlì" +8341,,IT,Italy,Emilia-Romagna,Ravenna +8342,,IT,Italy,Emilia-Romagna,Ravenna +8410,,IT,Italy,Emilia-Romagna,"Forlì" +8411,,IT,Italy,Emilia-Romagna,"Forlì" +8433,,IT,Italy,Emilia-Romagna,"Castrocaro Terme e Terra del Sole" +8434,,IT,Italy,Emilia-Romagna,"Castrocaro Terme e Terra del Sole" +8435,,IT,Italy,Emilia-Romagna,"Castrocaro Terme e Terra del Sole" +8436,,IT,Italy,Emilia-Romagna,"Forlì" +8437,,IT,Italy,Emilia-Romagna,"Forlì" +8438,,IT,Italy,Emilia-Romagna,"Forlì" +8448,,IT,Italy,Emilia-Romagna,"Forlì" +8461,,IT,Italy,Emilia-Romagna,"Forlì" +8462,,IT,Italy,Emilia-Romagna,"Forlì" +8463,,IT,Italy,Emilia-Romagna,"Forlì" +8464,,IT,Italy,Emilia-Romagna,"Forlì" +8465,,IT,Italy,Emilia-Romagna,"Forlì" +8475,,IT,Italy,Emilia-Romagna,"Forlì" +8511,,IT,Italy,Emilia-Romagna,"Castrocaro Terme e Terra del Sole" +8512,,IT,Italy,Emilia-Romagna,"Castrocaro Terme e Terra del Sole" +8513,,IT,Italy,Emilia-Romagna,"Forlì" +8518,,IT,Italy,Emilia-Romagna,Lugo +8519,,IT,Italy,Emilia-Romagna,Lugo +8525,,IT,Italy,Emilia-Romagna,Cesena +8536,,IT,Italy,Emilia-Romagna,Faenza +8592,,IT,Italy,Emilia-Romagna,"Poggio Piccolo" +8593,,IT,Italy,Emilia-Romagna,"San Pietro in Vincoli" +8594,,IT,Italy,Emilia-Romagna,"San Pietro in Vincoli" +8598,,IT,Italy,Emilia-Romagna,Ravenna +8600,,IT,Italy,Emilia-Romagna,Ravenna +8601,,IT,Italy,Emilia-Romagna,Ravenna +8612,,IT,Italy,"Trentino-South Tyrol","Santa Cristina Gherdëina" +8655,,IT,Italy,Emilia-Romagna,Felloniche +8656,,IT,Italy,Emilia-Romagna,Felloniche +8657,,IT,Italy,Emilia-Romagna,Felloniche +8658,,IT,Italy,Emilia-Romagna,Felloniche +8659,,IT,Italy,Emilia-Romagna,Felloniche +8660,,IT,Italy,Emilia-Romagna,Felloniche +8668,,IT,Italy,Veneto,"Porto Santa Margherita" +8673,,IT,Italy,Emilia-Romagna,"Forlì" +8674,,IT,Italy,Emilia-Romagna,"Forlì" +8675,,IT,Italy,Emilia-Romagna,"Forlì" +8676,,IT,Italy,Emilia-Romagna,"Forlì" +8727,,IT,Italy,Emilia-Romagna,"Forlì" +8732,,IT,Italy,Emilia-Romagna,"Forlì" +8741,,IT,Italy,Emilia-Romagna,Brisighella +8742,,IT,Italy,Emilia-Romagna,"Forlì" +8743,,IT,Italy,Emilia-Romagna,"Forlì" +8746,,IT,Italy,Emilia-Romagna,"Forlì" +8747,,IT,Italy,Emilia-Romagna,"Forlì" +8749,,IT,Italy,Emilia-Romagna,"Forlì" +8751,,IT,Italy,Emilia-Romagna,"Forlì" +8752,,IT,Italy,Emilia-Romagna,"Forlì" +8753,,IT,Italy,Emilia-Romagna,"Forlì" +8763,,IT,Italy,Emilia-Romagna,"Forlì" +8773,,IT,Italy,Emilia-Romagna,"Forlì" +8774,,IT,Italy,Emilia-Romagna,"Forlì" +8775,,IT,Italy,"Friuli-Venezia Giulia",Pordenone +8776,,IT,Italy,Marche,Fano +8777,,IT,Italy,Emilia-Romagna,Bertinoro +8778,,IT,Italy,Emilia-Romagna,Forlimpopoli +8795,,IT,Italy,Veneto,Venezia +8796,,IT,Italy,Veneto,Venezia +8797,,IT,Italy,Veneto,Venezia +8802,,IT,Italy,Veneto,Venezia +8803,,IT,Italy,Veneto,Venezia +8806,,IT,Italy,"Friuli-Venezia Giulia",Pordenone +8807,,IT,Italy,"Friuli-Venezia Giulia",Pordenone +8808,,IT,Italy,"Friuli-Venezia Giulia",Pordenone +8814,,IT,Italy,Emilia-Romagna,"Forlì" +8858,,IT,Italy,Emilia-Romagna,"Lido di Dante" +8860,,IT,Italy,Emilia-Romagna,Ravenna +8861,,IT,Italy,Emilia-Romagna,Ravenna +8863,,IT,Italy,Emilia-Romagna,Savio +8864,,IT,Italy,Emilia-Romagna,Savio +8867,,IT,Italy,Emilia-Romagna,Cesena +8868,,IT,Italy,Emilia-Romagna,Faenza +8869,,IT,Italy,Emilia-Romagna,Faenza +8870,,IT,Italy,Emilia-Romagna,Faenza +8871,,IT,Italy,Emilia-Romagna,Faenza +8872,,IT,Italy,Emilia-Romagna,Faenza +8873,,IT,Italy,Emilia-Romagna,Faenza +8885,,IT,Italy,Emilia-Romagna,"Forlì" +8890,,IT,Italy,Emilia-Romagna,Villanova +8891,,IT,Italy,Emilia-Romagna,Villanova +8892,,IT,Italy,Emilia-Romagna,Villanova +8893,,IT,Italy,Emilia-Romagna,Villanova +8894,,IT,Italy,Emilia-Romagna,Villanova +8932,,IT,Italy,Emilia-Romagna,Zattaglia +8938,,IT,Italy,Emilia-Romagna,Ravenna +8939,,IT,Italy,Emilia-Romagna,Ravenna +8940,,IT,Italy,Emilia-Romagna,Ravenna +8941,,IT,Italy,Emilia-Romagna,Ravenna +8948,,IT,Italy,Emilia-Romagna,"Forlì" +8949,,IT,Italy,Emilia-Romagna,"Forlì" +8950,,IT,Italy,Emilia-Romagna,"Forlì" +8951,,IT,Italy,Emilia-Romagna,"Forlì" +8952,,IT,Italy,Emilia-Romagna,"Forlì" +8963,,IT,Italy,Emilia-Romagna,"Forlì" +8964,,IT,Italy,Emilia-Romagna,"Forlì" +8968,,IT,Italy,Emilia-Romagna,"Forlì" +8969,,IT,Italy,Emilia-Romagna,"Forlì" +8991,,IT,Italy,Emilia-Romagna,"Forlì" +8998,,IT,Italy,Emilia-Romagna,"Forlì" +9044,,IT,Italy,Emilia-Romagna,"Forlì" +9075,,IT,Italy,Emilia-Romagna,Cesena +9076,,IT,Italy,Emilia-Romagna,Bertinoro +9085,,IT,Italy,Marche,Pesaro +9086,,IT,Italy,Marche,Pesaro +9087,,IT,Italy,Marche,Pesaro +9088,,IT,Italy,Marche,Pesaro +9089,,IT,Italy,Marche,Pesaro +9090,,IT,Italy,Marche,"Gabicce Monte" +9092,,IT,Italy,Marche,"Gabicce Monte" +9093,,IT,Italy,Emilia-Romagna,Riccione +9094,,IT,Italy,Emilia-Romagna,Rimini +9095,,IT,Italy,Emilia-Romagna,"Gatteo a Mare" +9096,,IT,Italy,Emilia-Romagna,Cesenatico +9097,,IT,Italy,Emilia-Romagna,Cervia +9099,,IT,Italy,Emilia-Romagna,"Forlì" +9100,,IT,Italy,Emilia-Romagna,"Forlì" +9101,,IT,Italy,Emilia-Romagna,"Forlì" +9102,,IT,Italy,Emilia-Romagna,"Forlì" +9103,,IT,Italy,Emilia-Romagna,"Forlì" +9104,,IT,Italy,Emilia-Romagna,"Forlì" +9105,,IT,Italy,Emilia-Romagna,"Forlì" +9106,,IT,Italy,Emilia-Romagna,"Forlì" +9107,,IT,Italy,Emilia-Romagna,"Forlì" +9108,,IT,Italy,Emilia-Romagna,"Forlì" +9109,,IT,Italy,Emilia-Romagna,"Forlì" +9115,,IT,Italy,Marche,"Montecosaro Scalo" +9128,,IT,Italy,Emilia-Romagna,"Forlì" +9129,,IT,Italy,Emilia-Romagna,"Forlì" +9156,,IT,Italy,Emilia-Romagna,"San Mauro Pascoli" +9157,,IT,Italy,Emilia-Romagna,"San Mauro Pascoli" +9158,,IT,Italy,Emilia-Romagna,"Forlì" +9159,,IT,Italy,"Trentino-Alto Adige",Cavedine +9160,,IT,Italy,"Trentino-Alto Adige",Cavedine +9161,,IT,Italy,"Trentino-Alto Adige",Cavedine +9165,,IT,Italy,"Trentino-Alto Adige",Drena +9166,,IT,Italy,"Trentino-Alto Adige",Drena +9167,,IT,Italy,"Trentino-Alto Adige",Drena +9169,,IT,Italy,"Trentino-Alto Adige","Santa Cristina Valgardena" +9170,,IT,Italy,"Trentino-Alto Adige","Santa Cristina Valgardena" +9176,,IT,Italy,"Trentino-Alto Adige","Santa Cristina Valgardena" +9177,,IT,Italy,"Trentino-Alto Adige","Santa Cristina Valgardena" +9182,,IT,Italy,"Trentino-Alto Adige",Moena +9183,,IT,Italy,"Trentino-Alto Adige",Moena +9184,,IT,Italy,"Trentino-Alto Adige",Moena +9185,,IT,Italy,"Trentino-Alto Adige",Moena +9186,,IT,Italy,"Trentino-Alto Adige",Moena +9187,,IT,Italy,"Trentino-Alto Adige",Moena +9188,,IT,Italy,"Trentino-Alto Adige",Moena +9189,,IT,Italy,"Trentino-Alto Adige",Canazei +9190,,IT,Italy,"Trentino-Alto Adige",Canazei +9191,,IT,Italy,"Trentino-Alto Adige","Campitello di Fassa" +9192,,IT,Italy,"Trentino-Alto Adige","Campitello di Fassa" +9197,,IT,Italy,"Trentino-Alto Adige","Campitello di Fassa" +9198,,IT,Italy,"Trentino-Alto Adige","Campitello di Fassa" +9199,,IT,Italy,"Trentino-Alto Adige","Campitello di Fassa" +9200,,IT,Italy,"Trentino-Alto Adige","Campitello di Fassa" +9201,,IT,Italy,"Trentino-Alto Adige","Campitello di Fassa" +9210,,IT,Italy,"Trentino-Alto Adige","Livinallongo del Col di Lana" +9212,,IT,Italy,"Trentino-South Tyrol",Canazei +9213,,IT,Italy,"Trentino-South Tyrol",Canazei +9214,,IT,Italy,"Trentino-South Tyrol",Canazei +9215,,IT,Italy,"Trentino-South Tyrol",Canazei +9216,,IT,Italy,"Trentino-South Tyrol",Canazei +9217,,IT,Italy,"Trentino-South Tyrol",Canazei +9218,,IT,Italy,"Trentino-South Tyrol",Canazei +9219,,IT,Italy,"Trentino-South Tyrol",Canazei +9220,,IT,Italy,"Trentino-South Tyrol",Canazei +9221,,IT,Italy,"Trentino-South Tyrol",Canazei +9223,,IT,Italy,"Trentino-Alto Adige",Canazei +9224,,IT,Italy,"Trentino-Alto Adige",Canazei +9225,,IT,Italy,"Trentino-Alto Adige",Canazei +9226,,IT,Italy,"Trentino-Alto Adige",Canazei +9227,,IT,Italy,"Trentino-Alto Adige",Canazei +9228,,IT,Italy,"Trentino-Alto Adige",Canazei +9229,,IT,Italy,"Trentino-Alto Adige",Canazei +9232,,IT,Italy,"Trentino-Alto Adige","Campitello di Fassa" +9233,,IT,Italy,"Trentino-Alto Adige","Campitello di Fassa" +9234,,IT,Italy,"Trentino-Alto Adige","Campitello di Fassa" +9235,,IT,Italy,"Trentino-Alto Adige","Campitello di Fassa" +9236,,IT,Italy,"Trentino-Alto Adige","Campitello di Fassa" +9237,,IT,Italy,"Trentino-Alto Adige","Campitello di Fassa" +9238,,IT,Italy,"Trentino-Alto Adige","Campitello di Fassa" +9239,,IT,ITA,, +9240,,IT,ITA,, +9370,,IT,ITA,, +9371,,IT,ITA,, +9372,,IT,ITA,, +9373,,IT,ITA,, +9374,,IT,ITA,, +9380,,IT,ITA,, +9381,,IT,ITA,, +9382,,IT,ITA,, +9383,,IT,ITA,, +9384,,IT,ITA,, +9385,,IT,ITA,, +9386,,IT,ITA,, +9387,,IT,ITA,, +9388,,IT,ITA,, +9389,,IT,ITA,, +9390,,IT,ITA,, +9391,,IT,ITA,, +9392,,IT,ITA,, +9393,,IT,ITA,, +9394,,IT,ITA,, +9395,,IT,ITA,, +9396,,IT,ITA,, +9397,,IT,ITA,, +9398,,IT,ITA,, +9417,,IT,ITA,, +9422,,IT,ITA,, +9438,,IT,ITA,, +9439,,IT,ITA,, +9443,,IT,ITA,, +9450,,IT,ITA,, +9451,,IT,ITA,, +9452,,IT,ITA,, +9453,,IT,ITA,, +9454,,IT,ITA,, +9455,,IT,ITA,, +9456,,IT,ITA,, +9457,,IT,ITA,, +9458,,IT,ITA,, +9459,,IT,ITA,, +9460,,IT,ITA,, +9461,,IT,ITA,, +9469,,IT,ITA,, +9491,,IT,ITA,, +9492,,IT,ITA,, +9493,,IT,ITA,, +9494,,IT,ITA,, +9495,,IT,ITA,, +9496,,IT,ITA,, +9497,,IT,ITA,, +9498,,IT,ITA,, +9499,,IT,ITA,, +9500,,IT,ITA,, +9501,,IT,ITA,, +9502,,IT,ITA,, +9503,,IT,ITA,, +9504,,IT,ITA,, +9505,,IT,ITA,, +9506,,IT,ITA,, +9556,,IT,ITA,, +9557,,IT,ITA,, +9558,,IT,ITA,, +9559,,IT,ITA,, +9560,,IT,ITA,, +9565,,IT,ITA,, +9569,,IT,ITA,, +9605,,IT,ITA,, +9606,,IT,ITA,, +9607,,IT,ITA,, +9612,,IT,ITA,, +9708,,IT,ITA,, +9709,,IT,ITA,, +9761,,IT,ITA,, +9762,,IT,ITA,, +9763,,IT,ITA,, +9764,,IT,ITA,, +9770,,IT,ITA,, +9774,,IT,ITA,, +9776,,IT,ITA,, +9777,,IT,ITA,, +9778,,IT,ITA,, +9779,,IT,ITA,, +9789,,IT,ITA,, +9790,,IT,ITA,, +9795,,IT,ITA,, +9796,,IT,ITA,, +9797,,IT,ITA,, +9798,,IT,ITA,, +9799,,IT,ITA,, +9800,,IT,ITA,, +9804,,IT,ITA,, +9807,,IT,ITA,, +9810,,IT,ITA,, +9811,,IT,ITA,, +9812,,IT,ITA,, +9813,,IT,ITA,, +9814,,IT,ITA,, +9815,,IT,ITA,, +9816,,IT,ITA,, +9817,,IT,ITA,, +9818,,IT,ITA,, +9819,,IT,ITA,, +9821,,IT,ITA,, +9822,,IT,ITA,, +9831,,IT,ITA,, +9832,,IT,ITA,, +9833,,IT,ITA,, +9834,,IT,ITA,, +9835,,IT,ITA,, +9836,,IT,ITA,, +9837,,IT,ITA,, +9844,,IT,ITA,, +9855,,IT,ITA,, +9870,,IT,ITA,, +9871,,IT,ITA,, +9872,,IT,ITA,, +9873,,IT,ITA,, +9874,,IT,ITA,, +9875,,IT,ITA,, +9876,,IT,ITA,, +9877,,IT,ITA,, +9878,,IT,ITA,, +9880,,IT,ITA,, +9898,,IT,ITA,, +9899,,IT,ITA,, +9900,,IT,ITA,, +9906,,IT,ITA,, +9907,,IT,ITA,, +9908,,IT,ITA,, +9913,,IT,ITA,, +9914,,IT,ITA,, +9927,,IT,ITA,, +9928,,IT,ITA,, +9929,,IT,ITA,, +9930,,IT,ITA,, +9931,,IT,ITA,, +9932,,IT,ITA,, +9933,,IT,ITA,, +9934,,IT,ITA,, +9935,,IT,ITA,, +9936,,IT,ITA,, +9937,,IT,ITA,, +9938,,IT,ITA,, +9939,,IT,ITA,, +9940,,IT,ITA,, +9941,,IT,ITA,, +9942,,IT,ITA,, +9943,,IT,ITA,, +9944,,IT,ITA,, +9945,,IT,ITA,, +9946,,IT,ITA,, +9947,,IT,ITA,, +9948,,IT,ITA,, +9949,,IT,ITA,, +9950,,IT,ITA,, +9951,,IT,ITA,, +9952,,IT,ITA,, +9953,,IT,ITA,, +9954,,IT,ITA,, +9955,,IT,ITA,, +9956,,IT,ITA,, +9957,,IT,ITA,, +9958,,IT,ITA,, +9959,,IT,ITA,, +9960,,IT,ITA,, +9961,,IT,ITA,, +9962,,IT,ITA,, +9963,,IT,ITA,, +9964,,IT,ITA,, +9965,,IT,ITA,, +9966,,IT,ITA,, +9967,,IT,ITA,, +9968,,IT,ITA,, +9969,,IT,ITA,, +9971,,IT,ITA,, +9972,,IT,ITA,, +9973,,IT,ITA,, +9975,,IT,ITA,, +9976,,IT,ITA,, +9977,,IT,ITA,, +9978,,IT,ITA,, +9979,,IT,ITA,, +9980,,IT,ITA,, +9981,,IT,ITA,, +9982,,IT,ITA,, +9983,,IT,ITA,, +10002,,IT,ITA,, +10003,,IT,ITA,, +10004,,IT,ITA,, +10007,,IT,ITA,, +10008,,IT,ITA,, +10009,,IT,ITA,, +10010,,IT,ITA,, +10011,,IT,ITA,, +10012,,IT,ITA,, +10013,,IT,ITA,, +10014,,IT,ITA,, +10015,,IT,ITA,, +10016,,IT,ITA,, +10017,,IT,ITA,, +10018,,IT,ITA,, +10019,,IT,ITA,, +10020,,IT,ITA,, +10021,,IT,ITA,, +10022,,IT,ITA,, +10023,,IT,ITA,, +10024,,IT,ITA,, +10025,,IT,ITA,, +10026,,IT,ITA,, +10027,,IT,ITA,, +10032,,IT,ITA,, +10033,,IT,ITA,, +10034,,IT,ITA,, +10035,,IT,ITA,, +10036,,IT,ITA,, +10037,,IT,ITA,, +10038,,IT,ITA,, +10039,,IT,ITA,, +10040,,IT,ITA,, +10041,,IT,ITA,, +10042,,IT,ITA,, +10043,,IT,ITA,, +10044,,IT,ITA,, +10045,,IT,ITA,, +10046,,IT,ITA,, +10047,,IT,ITA,, +10048,,IT,ITA,, +10050,,IT,ITA,, +10051,,IT,ITA,, +10053,,IT,ITA,, +10055,,IT,ITA,, +10056,,IT,ITA,, +10057,,IT,ITA,, +10058,,IT,ITA,, +10059,,IT,ITA,, +10060,,IT,ITA,, +10061,,IT,ITA,, +10062,,IT,ITA,, +10063,,IT,ITA,, +10064,,IT,ITA,, +10065,,IT,ITA,, +10066,,IT,ITA,, +10067,,IT,ITA,, +10069,,IT,ITA,, +10070,,IT,ITA,, +10071,,IT,ITA,, +10075,,IT,ITA,, +10077,,IT,ITA,, +10078,,IT,ITA,, +10079,,IT,ITA,, +10080,,IT,ITA,, +10081,,IT,ITA,, +10082,,IT,ITA,, +10084,,IT,ITA,, +10085,,IT,ITA,, +10086,,IT,ITA,, +10087,,IT,ITA,, +10088,,IT,ITA,, +10089,,IT,ITA,, +10090,,IT,ITA,, +10091,,IT,ITA,, +10093,,IT,ITA,, +10094,,IT,ITA,, +10114,,IT,ITA,, +10115,,IT,ITA,, +10116,,IT,ITA,, +10117,,IT,ITA,, +10118,,IT,ITA,, +10119,,IT,ITA,, +10131,,IT,ITA,, +10132,,IT,ITA,, +10133,,IT,ITA,, +10134,,IT,ITA,, +10135,,IT,ITA,, +10136,,IT,ITA,, +10137,,IT,ITA,, +10138,,IT,ITA,, +10139,,IT,ITA,, +10140,,IT,ITA,, +10141,,IT,ITA,, +10142,,IT,ITA,, +10143,,IT,ITA,, +10144,,IT,ITA,, +10147,,IT,ITA,, +10149,,IT,ITA,, +10150,,IT,ITA,, +10151,,IT,ITA,, +10153,,IT,ITA,, +10160,,IT,ITA,, +10162,,IT,ITA,, +10163,,IT,ITA,, +10169,,IT,ITA,, +10171,,IT,ITA,, +10174,,IT,ITA,, +10175,,IT,ITA,, +10176,,IT,ITA,, +10177,,IT,ITA,, +10178,,IT,ITA,, +10179,,IT,ITA,, +10180,,IT,ITA,, +10181,,IT,ITA,, +10182,,IT,ITA,, +10183,,IT,ITA,, +10185,,IT,ITA,, +10186,,IT,ITA,, +10187,,IT,ITA,, +10188,,IT,ITA,, +10194,,IT,ITA,, +10198,,IT,ITA,, +10199,,IT,ITA,, +10200,,IT,ITA,, +10201,,IT,ITA,, +10215,,IT,ITA,, +10217,,IT,ITA,, +10219,,IT,ITA,, +10220,,IT,ITA,, +10221,,IT,ITA,, +10225,,IT,ITA,, +10231,,IT,ITA,, +10232,,IT,ITA,, +10233,,IT,ITA,, +10234,,IT,ITA,, +10235,,IT,ITA,, +10237,,IT,ITA,, +10238,,IT,ITA,, +10239,,IT,ITA,, +10240,,IT,ITA,, +10241,,IT,ITA,, +10242,,IT,ITA,, +10244,,IT,ITA,, +10245,,IT,ITA,, +10246,,IT,ITA,, +10247,,IT,ITA,, +10248,,IT,ITA,, +10249,,IT,ITA,, +10250,,IT,ITA,, +10251,,IT,ITA,, +10324,,IT,ITA,, +10325,,IT,ITA,, +10329,,IT,ITA,, +10330,,IT,ITA,, +10332,,IT,ITA,, +10333,,IT,ITA,, +10334,,IT,ITA,, +10335,,IT,ITA,, +10336,,IT,ITA,, +10337,,IT,ITA,, +10338,,IT,ITA,, +10339,,IT,ITA,, +10348,,IT,ITA,, +10349,,IT,ITA,, +10350,,IT,ITA,, +10351,,IT,ITA,, +10352,,IT,ITA,, +10355,,IT,ITA,, +10356,,IT,ITA,, +10357,,IT,ITA,, +10358,,IT,ITA,, +10359,,IT,ITA,, +10361,,IT,ITA,, +10391,,IT,ITA,, +10392,,IT,ITA,, +10393,,IT,ITA,, +10394,,IT,ITA,, +10395,,IT,ITA,, +10399,,IT,ITA,, +10400,,IT,ITA,, +10401,,IT,ITA,, +10402,,IT,ITA,, +10403,,IT,ITA,, +10404,,IT,ITA,, +10437,,IT,ITA,, +10455,,IT,ITA,, +10463,,IT,ITA,, +10471,,IT,ITA,, +10479,,IT,ITA,, +10488,,IT,ITA,, +10489,,IT,ITA,, +10490,,IT,ITA,, +10506,,IT,ITA,, +10507,,IT,ITA,, +10508,,IT,ITA,, +10509,,IT,ITA,, +10510,,IT,ITA,, +10513,,IT,ITA,, +10518,,IT,ITA,, +10520,,IT,ITA,, +10522,,IT,ITA,, +10523,,IT,ITA,, +10524,,IT,ITA,, +10542,,IT,ITA,, +10543,,IT,ITA,, +10547,,IT,ITA,, +10548,,IT,ITA,, +10549,,IT,ITA,, +10550,,IT,ITA,, +10551,,IT,ITA,, +10552,,IT,ITA,, +10553,,IT,ITA,, +10554,,IT,ITA,, +10555,,IT,ITA,, +10556,,IT,ITA,, +10557,,IT,ITA,, +10558,,IT,ITA,, +10559,,IT,ITA,, +10560,,IT,ITA,, +10561,,IT,ITA,, +10571,,IT,ITA,, +10578,,IT,ITA,, +10582,,IT,ITA,, +10583,,IT,ITA,, +10584,,IT,ITA,, +10585,,IT,ITA,, +10586,,IT,ITA,, +10587,,IT,ITA,, +10588,,IT,ITA,, +10590,,IT,ITA,, +10591,,IT,ITA,, +10592,,IT,ITA,, +10615,,IT,ITA,, +10616,,IT,ITA,, +10617,,IT,ITA,, +10618,,IT,ITA,, +10619,,IT,ITA,, +10620,,IT,ITA,, +10621,,IT,ITA,, +10626,,IT,ITA,, +10627,,IT,ITA,, +10628,,IT,ITA,, +10629,,IT,ITA,, +10630,,IT,ITA,, +10631,,IT,ITA,, +10632,,IT,ITA,, +10633,,IT,ITA,, +10634,,IT,ITA,, +10635,,IT,ITA,, +10637,,IT,ITA,, +10638,,IT,ITA,, +10639,,IT,ITA,, +10640,,IT,ITA,, +10641,,IT,ITA,, +10642,,IT,ITA,, +10643,,IT,ITA,, +10644,,IT,ITA,, +10645,,IT,ITA,, +10646,,IT,ITA,, +10647,,IT,ITA,, +10648,,IT,ITA,, +10649,,IT,ITA,, +10650,,IT,ITA,, +10651,,IT,ITA,, +10654,,IT,ITA,, +10655,,IT,ITA,, +10656,,IT,ITA,, +10657,,IT,ITA,, +10658,,IT,ITA,, +10659,,IT,ITA,, +10666,,IT,ITA,, +10667,,IT,ITA,, +10668,,IT,ITA,, +10669,,IT,ITA,, +10670,,IT,ITA,, +10671,,IT,ITA,, +10672,,IT,ITA,, +10697,,IT,ITA,, +10698,,IT,ITA,, +10699,,IT,ITA,, +10700,,IT,ITA,, +10701,,IT,ITA,, +10702,,IT,ITA,, +10703,,IT,ITA,, +10704,,IT,ITA,, +10705,,IT,ITA,, +10706,,IT,ITA,, +10707,,IT,ITA,, +10708,,IT,ITA,, +10709,,IT,ITA,, +10710,,IT,ITA,, +10711,,IT,ITA,, +10712,,IT,ITA,, +10713,,IT,ITA,, +10714,,IT,ITA,, +10715,,IT,ITA,, +10717,,IT,ITA,, +10718,,IT,ITA,, +10719,,IT,ITA,, +10720,,IT,ITA,, +10721,,IT,ITA,, +10722,,IT,ITA,, +10723,,IT,ITA,, +10724,,IT,ITA,, +10725,,IT,ITA,, +10726,,IT,ITA,, +10727,,IT,ITA,, +10728,,IT,ITA,, +10729,,IT,ITA,, +10730,,IT,ITA,, +10731,,IT,ITA,, +10732,,IT,ITA,, +10733,,IT,ITA,, +10734,,IT,ITA,, +10735,,IT,ITA,, +10736,,IT,ITA,, +10737,,IT,ITA,, +10765,,IT,ITA,, +10768,,IT,ITA,, +10769,,IT,ITA,, +10770,,IT,ITA,, +10771,,IT,ITA,, +10772,,IT,ITA,, +10773,,IT,ITA,, +10774,,IT,ITA,, +10777,,IT,ITA,, +10778,,IT,ITA,, +10779,,IT,ITA,, +10780,,IT,ITA,, +10781,,IT,ITA,, +10782,,IT,ITA,, +10783,,IT,ITA,, +10784,,IT,ITA,, +10785,,IT,ITA,, +10787,,IT,ITA,, +10788,,IT,ITA,, +10793,,IT,ITA,, +10794,,IT,ITA,, +10805,,IT,ITA,, +10806,,IT,ITA,, +10807,,IT,ITA,, +10810,,IT,ITA,, +10811,,IT,ITA,, +10812,,IT,ITA,, +10813,,IT,ITA,, +10814,,IT,ITA,, +10815,,IT,ITA,, +10816,,IT,ITA,, +10817,,IT,ITA,, +10818,,IT,ITA,, +10829,,IT,ITA,, +10842,,IT,ITA,, +10844,,IT,ITA,, +10845,,IT,ITA,, +10846,,IT,ITA,, +10850,,IT,ITA,, +10851,,IT,ITA,, +10852,,IT,ITA,, +10857,,IT,ITA,, +10858,,IT,ITA,, +10859,,IT,ITA,, +10860,,IT,ITA,, +10861,,IT,ITA,, +10862,,IT,ITA,, +10863,,IT,ITA,, +10867,,IT,ITA,, +10868,,IT,ITA,, +10869,,IT,ITA,, +10870,,IT,ITA,, +10871,,IT,ITA,, +10872,,IT,ITA,, +10878,,IT,ITA,, +10879,,IT,ITA,, +10880,,IT,ITA,, +10881,,IT,ITA,, +10882,,IT,ITA,, +10883,,IT,ITA,, +10885,,IT,ITA,, +10886,,IT,ITA,, +10887,,IT,ITA,, +10888,,IT,ITA,, +10889,,IT,ITA,, +10890,,IT,ITA,, +10891,,IT,ITA,, +10892,,IT,ITA,, +10893,,IT,ITA,, +10901,,IT,ITA,, +10908,,IT,ITA,, +10909,,IT,ITA,, +10914,,IT,ITA,, +10915,,IT,ITA,, +10916,,IT,ITA,, +10917,,IT,ITA,, +10918,,IT,ITA,, +10919,,IT,ITA,, +10941,,IT,ITA,, +10942,,IT,ITA,, +10943,,IT,ITA,, +10944,,IT,ITA,, +10957,,IT,ITA,, +10959,,IT,ITA,, +10960,,IT,ITA,, +10961,,IT,ITA,, +10962,,IT,ITA,, +10963,,IT,ITA,, +10964,,IT,ITA,, +10965,,IT,ITA,, +10968,,IT,ITA,, +10969,,IT,ITA,, +10970,,IT,ITA,, +10971,,IT,ITA,, +10972,,IT,ITA,, +10973,,IT,ITA,, +10974,,IT,ITA,, +10975,,IT,ITA,, +10976,,IT,ITA,, +10977,,IT,ITA,, +10978,,IT,ITA,, +10979,,IT,ITA,, +10983,,IT,ITA,, +10996,,IT,ITA,, +10997,,IT,ITA,, +11008,,IT,ITA,, +11009,,IT,ITA,, +11010,,IT,ITA,, +11038,,IT,ITA,, +11040,,IT,ITA,, +11041,,IT,ITA,, +11053,,IT,ITA,, +11054,,IT,ITA,, +11057,,IT,ITA,, +11058,,IT,ITA,, +11060,,IT,ITA,, +11061,,IT,ITA,, +11062,,IT,ITA,, +11063,,IT,ITA,, +11064,,IT,ITA,, +11065,,IT,ITA,, +11081,,IT,ITA,, +11082,,IT,ITA,, +11083,,IT,ITA,, +11084,,IT,ITA,, +11085,,IT,ITA,, +11086,,IT,ITA,, +11087,,IT,ITA,, +11088,,IT,ITA,, +11089,,IT,ITA,, +11090,,IT,ITA,, +11092,,IT,ITA,, +11093,,IT,ITA,, +11096,,IT,ITA,, +11097,,IT,ITA,, +11099,,IT,ITA,, +11100,,IT,ITA,, +11101,,IT,ITA,, +11102,,IT,ITA,, +11103,,IT,ITA,, +11104,,IT,ITA,, +11105,,IT,ITA,, +11106,,IT,ITA,, +11107,,IT,ITA,, +11108,,IT,ITA,, +11109,,IT,ITA,, +11110,,IT,ITA,, +11111,,IT,ITA,, +11112,,IT,ITA,, +11113,,IT,ITA,, +11115,,IT,ITA,, +11116,,IT,ITA,, +11117,,IT,ITA,, +11118,,IT,ITA,, +11119,,IT,ITA,, +11120,,IT,ITA,, +11123,,IT,ITA,, +11124,,IT,ITA,, +11125,,IT,ITA,, +11126,,IT,ITA,, +11127,,IT,ITA,, +11128,,IT,ITA,, +11129,,IT,ITA,, +11130,,IT,ITA,, +11131,,IT,ITA,, +11132,,IT,ITA,, +11133,,IT,ITA,, +11134,,IT,ITA,, +11135,,IT,ITA,, +11136,,IT,ITA,, +11152,,IT,ITA,, +11153,,IT,ITA,, +11154,,IT,ITA,, +11155,,IT,ITA,, +11156,,IT,ITA,, +11157,,IT,ITA,, +11158,,IT,ITA,, +11159,,IT,ITA,, +11160,,IT,ITA,, +11165,,IT,ITA,, +11166,,IT,ITA,, +11167,,IT,ITA,, +11168,,IT,ITA,, +11169,,IT,ITA,, +11170,,IT,ITA,, +11171,,IT,ITA,, +11240,,IT,ITA,, +11241,,IT,ITA,, +11242,,IT,ITA,, +11243,,IT,ITA,, +11244,,IT,ITA,, +11245,,IT,ITA,, +11246,,IT,ITA,, +11247,,IT,ITA,, +11248,,IT,ITA,, +11270,,IT,ITA,, +11271,,IT,ITA,, +11278,,IT,ITA,, +11279,,IT,ITA,, +11281,,IT,ITA,, +11282,,IT,ITA,, +11284,,IT,ITA,, +11286,,IT,ITA,, +11287,,IT,ITA,, +11288,,IT,ITA,, +11292,,IT,ITA,, +11293,,IT,ITA,, +11294,,IT,ITA,, +11295,,IT,ITA,, +11296,,IT,ITA,, +11297,,IT,ITA,, +11298,,IT,ITA,, +11299,,IT,ITA,, +11300,,IT,ITA,, +11301,,IT,ITA,, +11311,,IT,ITA,, +11312,,IT,ITA,, +11313,,IT,ITA,, +11314,,IT,ITA,, +11315,,IT,ITA,, +11316,,IT,ITA,, +11317,,IT,ITA,, +11318,,IT,ITA,, +11321,,IT,ITA,, +11322,,IT,ITA,, +11323,,IT,ITA,, +11326,,IT,ITA,, +11327,,IT,ITA,, +11328,,IT,ITA,, +11329,,IT,ITA,, +11337,,IT,ITA,, +11347,,IT,ITA,, +11364,,IT,ITA,, +11365,,IT,ITA,, +11366,,IT,ITA,, +11367,,IT,ITA,, +11378,,IT,ITA,, +11379,,IT,ITA,, +11380,,IT,ITA,, +11381,,IT,ITA,, +11384,,IT,ITA,, +11385,,IT,ITA,, +11386,,IT,ITA,, +11387,,IT,ITA,, +11388,,IT,ITA,, +11389,,IT,ITA,, +11390,,IT,ITA,, +11393,,IT,ITA,, +11394,,IT,ITA,, +11397,,IT,ITA,, +11401,,IT,ITA,, +11402,,IT,ITA,, +11403,,IT,ITA,, +11404,,IT,ITA,, +11405,,IT,ITA,, +11406,,IT,ITA,, +11407,,IT,ITA,, +11408,,IT,ITA,, +11409,,IT,ITA,, +11410,,IT,ITA,, +11411,,IT,ITA,, +11412,,IT,ITA,, +11413,,IT,ITA,, +11414,,IT,ITA,, +11454,,IT,ITA,, +11455,,IT,ITA,, +11456,,IT,ITA,, +11459,,IT,ITA,, +11460,,IT,ITA,, +11461,,IT,ITA,, +11462,,IT,ITA,, +11463,,IT,ITA,, +11464,,IT,ITA,, +11465,,IT,ITA,, +11467,,IT,ITA,, +11468,,IT,ITA,, +11469,,IT,ITA,, +11471,,IT,ITA,, +11472,,IT,ITA,, +11473,,IT,ITA,, +11474,,IT,ITA,, +11475,,IT,ITA,, +11477,,IT,ITA,, +11478,,IT,ITA,, +11479,,IT,ITA,, +11480,,IT,ITA,, +11481,,IT,ITA,, +11482,,IT,ITA,, +11483,,IT,ITA,, +11485,,IT,ITA,, +11486,,IT,ITA,, +11487,,IT,ITA,, +11491,,IT,ITA,, +11492,,IT,ITA,, +11493,,IT,ITA,, +11496,,IT,ITA,, +11497,,IT,ITA,, +11498,,IT,ITA,, +11499,,IT,ITA,, +11500,,IT,ITA,, +11501,,IT,ITA,, +11502,,IT,ITA,, +11503,,IT,ITA,, +11504,,IT,ITA,, +11505,,IT,ITA,, +11506,,IT,ITA,, +11507,,IT,ITA,, +11508,,IT,ITA,, +11510,,IT,ITA,, +11511,,IT,ITA,, +11513,,IT,ITA,, +11514,,IT,ITA,, +11515,,IT,ITA,, +11516,,IT,ITA,, +11517,,IT,ITA,, +11520,,IT,ITA,, +11521,,IT,ITA,, +11522,,IT,ITA,, +11523,,IT,ITA,, +11524,,IT,ITA,, +11525,,IT,ITA,, +11526,,IT,ITA,, +11527,,IT,ITA,, +11528,,IT,ITA,, +11529,,IT,ITA,, +11530,,IT,ITA,, +11531,,IT,ITA,, +11532,,IT,ITA,, +11533,,IT,ITA,, +11534,,IT,ITA,, +11536,,IT,ITA,, +11537,,IT,ITA,, +11538,,IT,ITA,, +11539,,IT,ITA,, +11541,,IT,ITA,, +11542,,IT,ITA,, +11543,,IT,ITA,, +11549,,IT,ITA,, +11550,,IT,ITA,, +11551,,IT,ITA,, +11552,,IT,ITA,, +11554,,IT,ITA,, +11555,,IT,ITA,, +11556,,IT,ITA,, +11557,,IT,ITA,, +11559,,IT,ITA,, +11560,,IT,ITA,, +11561,,IT,ITA,, +11562,,IT,ITA,, +11563,,IT,ITA,, +11564,,IT,ITA,, +11565,,IT,ITA,, +11566,,IT,ITA,, +11568,,IT,ITA,, +11569,,IT,ITA,, +11570,,IT,ITA,, +11571,,IT,ITA,, +11578,,IT,ITA,, +11579,,IT,ITA,, +11589,,IT,ITA,, +11590,,IT,ITA,, +11591,,IT,ITA,, +11596,,IT,ITA,, +11597,,IT,ITA,, +11607,,IT,ITA,, +11608,,IT,ITA,, +11609,,IT,ITA,, +11610,,IT,ITA,, +11611,,IT,ITA,, +11612,,IT,ITA,, +11615,,IT,ITA,, +11618,,IT,ITA,, +11623,,IT,ITA,, +11624,,IT,ITA,, +11625,,IT,ITA,, +11626,,IT,ITA,, +11627,,IT,ITA,, +11628,,IT,ITA,, +11629,,IT,ITA,, +11630,,IT,ITA,, +11631,,IT,ITA,, +11632,,IT,ITA,, +11633,,IT,ITA,, +11659,,IT,ITA,, +11660,,IT,ITA,, +11665,,IT,ITA,, +11666,,IT,ITA,, +11667,,IT,ITA,, +11668,,IT,ITA,, +11669,,IT,ITA,, +11670,,IT,ITA,, +11671,,IT,ITA,, +11672,,IT,ITA,, +11673,,IT,ITA,, +11680,,IT,ITA,, +11681,,IT,ITA,, +11684,,IT,ITA,, +11685,,IT,ITA,, +11686,,IT,ITA,, +11692,,IT,ITA,, +11693,,IT,ITA,, +11694,,IT,ITA,, +11695,,IT,ITA,, +11699,,IT,ITA,, +11704,,IT,ITA,, +11705,,IT,ITA,, +11706,,IT,ITA,, +11707,,IT,ITA,, +11708,,IT,ITA,, +11709,,IT,ITA,, +11712,,IT,ITA,, +11713,,IT,ITA,, +11714,,IT,ITA,, +11715,,IT,ITA,, +11719,,IT,ITA,, +11735,,IT,ITA,, +11739,,IT,ITA,, +11740,,IT,ITA,, +11741,,IT,ITA,, +11742,,IT,ITA,, +11743,,IT,ITA,, +11745,,IT,ITA,, +11746,,IT,ITA,, +11747,,IT,ITA,, +11750,,IT,ITA,, +11751,,IT,ITA,, +11752,,IT,ITA,, +11753,,IT,ITA,, +11755,,IT,ITA,, +11756,,IT,ITA,, +11757,,IT,ITA,, +11758,,IT,ITA,, +11759,,IT,ITA,, +11760,,IT,ITA,, +11764,,IT,ITA,, +11765,,IT,ITA,, +11766,,IT,ITA,, +11767,,IT,ITA,, +11768,,IT,ITA,, +11769,,IT,ITA,, +11770,,IT,ITA,, +11771,,IT,ITA,, +11772,,IT,ITA,, +11773,,IT,ITA,, +11774,,IT,ITA,, +11776,,IT,ITA,, +11777,,IT,ITA,, +11778,,IT,ITA,, +11779,,IT,ITA,, +11789,,IT,ITA,, +11790,,IT,ITA,, +11791,,IT,ITA,, +11792,,IT,ITA,, +11793,,IT,ITA,, +11794,,IT,ITA,, +11795,,IT,ITA,, +11797,,IT,ITA,, +11799,,IT,ITA,, +11800,,IT,ITA,, +11801,,IT,ITA,, +11802,,IT,ITA,, +11803,,IT,ITA,, +11804,,IT,ITA,, +11832,,IT,ITA,, +11833,,IT,ITA,, +11835,,IT,ITA,, +11836,,IT,ITA,, +11837,,IT,ITA,, +11838,,IT,ITA,, +11839,,IT,ITA,, +11840,,IT,ITA,, +11846,,IT,ITA,, +11847,,IT,ITA,, +11848,,IT,ITA,, +11849,,IT,ITA,, +11850,,IT,ITA,, +11851,,IT,ITA,, +11852,,IT,ITA,, +11853,,IT,ITA,, +11854,,IT,ITA,, +11855,,IT,ITA,, +11856,,IT,ITA,, +11858,,IT,ITA,, +11859,,IT,ITA,, +11862,,IT,ITA,, +11863,,IT,ITA,, +11864,,IT,ITA,, +11865,,IT,ITA,, +11866,,IT,ITA,, +11868,,IT,ITA,, +11869,,IT,ITA,, +11870,,IT,ITA,, +11871,,IT,ITA,, +11872,,IT,ITA,, +11873,,IT,ITA,, +11874,,IT,ITA,, +11875,,IT,ITA,, +11876,,IT,ITA,, +11877,,IT,ITA,, +11878,,IT,ITA,, +11879,,IT,ITA,, +11880,,IT,ITA,, +11881,,IT,ITA,, +11882,,IT,ITA,, +11883,,IT,ITA,, +11884,,IT,ITA,, +11887,,IT,ITA,, +11888,,IT,ITA,, +11889,,IT,ITA,, +11892,,IT,ITA,, +11893,,IT,ITA,, +11894,,IT,ITA,, +11895,,IT,ITA,, +11896,,IT,ITA,, +11897,,IT,ITA,, +11898,,IT,ITA,, +11899,,IT,ITA,, +11900,,IT,ITA,, +11901,,IT,ITA,, +11902,,IT,ITA,, +11904,,IT,ITA,, +11905,,IT,ITA,, +11906,,IT,ITA,, +11907,,IT,ITA,, +11908,,IT,ITA,, +11909,,IT,ITA,, +11910,,IT,ITA,, +11911,,IT,ITA,, +11913,,IT,ITA,, +11914,,IT,ITA,, +11915,,IT,ITA,, +11916,,IT,ITA,, +11917,,IT,ITA,, +11918,,IT,ITA,, +11949,,IT,ITA,, +11950,,IT,ITA,, +11951,,IT,ITA,, +11954,,IT,ITA,, +11955,,IT,ITA,, +11956,,IT,ITA,, +11958,,IT,ITA,, +11962,,IT,ITA,, +11965,,IT,ITA,, +11966,,IT,ITA,, +11967,,IT,ITA,, +11968,,IT,ITA,, +11969,,IT,ITA,, +11970,,IT,ITA,, +11972,,IT,ITA,, +11973,,IT,ITA,, +11974,,IT,ITA,, +11975,,IT,ITA,, +11976,,IT,ITA,, +11977,,IT,ITA,, +11978,,IT,ITA,, +11979,,IT,ITA,, +11980,,IT,ITA,, +12006,,IT,ITA,, +12007,,IT,ITA,, +12008,,IT,ITA,, +12009,,IT,ITA,, +12010,,IT,ITA,, +12011,,IT,ITA,, +12012,,IT,ITA,, +12013,,IT,ITA,, +12014,,IT,ITA,, +12015,,IT,ITA,, +12016,,IT,ITA,, +12017,,IT,ITA,, +12018,,IT,ITA,, +12019,,IT,ITA,, +12020,,IT,ITA,, +12023,,IT,ITA,, +12024,,IT,ITA,, +12025,,IT,ITA,, +12027,,IT,ITA,, +12028,,IT,ITA,, +12029,,IT,ITA,, +12030,,IT,ITA,, +12037,,IT,ITA,, +12038,,IT,ITA,, +12039,,IT,ITA,, +12040,,IT,ITA,, +12041,,IT,ITA,, +12042,,IT,ITA,, +12043,,IT,ITA,, +12044,,IT,ITA,, +12045,,IT,ITA,, +12046,,IT,ITA,, +12047,,IT,ITA,, +12048,,IT,ITA,, +12049,,IT,ITA,, +12050,,IT,ITA,, +12051,,IT,ITA,, +12052,,IT,ITA,, +12053,,IT,ITA,, +12054,,IT,ITA,, +12055,,IT,ITA,, +12056,,IT,ITA,, +12057,,IT,ITA,, +12058,,IT,ITA,, +12059,,IT,ITA,, +12060,,IT,ITA,, +12061,,IT,ITA,, +12062,,IT,ITA,, +12063,,IT,ITA,, +12064,,IT,ITA,, +12065,,IT,ITA,, +12066,,IT,ITA,, +12067,,IT,ITA,, +12068,,IT,ITA,, +12069,,IT,ITA,, +12070,,IT,ITA,, +12071,,IT,ITA,, +12072,,IT,ITA,, +12073,,IT,ITA,, +12074,,IT,ITA,, +12075,,IT,ITA,, +12076,,IT,ITA,, +12077,,IT,ITA,, +12078,,IT,ITA,, +12079,,IT,ITA,, +12080,,IT,ITA,, +12081,,IT,ITA,, +12082,,IT,ITA,, +12083,,IT,ITA,, +12084,,IT,ITA,, +12087,,IT,ITA,, +12119,,IT,ITA,, +12120,,IT,ITA,, +12122,,IT,ITA,, +12123,,IT,ITA,, +12124,,IT,ITA,, +12125,,IT,ITA,, +12133,,IT,ITA,, +12134,,IT,ITA,, +12135,,IT,ITA,, +12136,,IT,ITA,, +12137,,IT,ITA,, +12139,,IT,ITA,, +12144,,IT,ITA,, +12145,,IT,ITA,, +12146,,IT,ITA,, +12149,,IT,ITA,, +12159,,IT,ITA,, +12160,,IT,ITA,, +12161,,IT,ITA,, +12163,,IT,ITA,, +12164,,IT,ITA,, +12165,,IT,ITA,, +12166,,IT,ITA,, +12167,,IT,ITA,, +12168,,IT,ITA,, +12170,,IT,ITA,, +12171,,IT,ITA,, +12172,,IT,ITA,, +12173,,IT,ITA,, +12174,,IT,ITA,, +12179,,IT,ITA,, +12180,,IT,ITA,, +12185,,IT,ITA,, +12186,,IT,ITA,, +12187,,IT,ITA,, +12188,,IT,ITA,, +12189,,IT,ITA,, +12190,,IT,ITA,, +12191,,IT,ITA,, +12192,,IT,ITA,, +12193,,IT,ITA,, +12194,,IT,ITA,, +12195,,IT,ITA,, +12196,,IT,ITA,, +12197,,IT,ITA,, +12198,,IT,ITA,, +12199,,IT,ITA,, +12200,,IT,ITA,, +12201,,IT,ITA,, +12202,,IT,ITA,, +12203,,IT,ITA,, +12204,,IT,ITA,, +12205,,IT,ITA,, +12206,,IT,ITA,, +12207,,IT,ITA,, +12208,,IT,ITA,, +12209,,IT,ITA,, +12210,,IT,ITA,, +12211,,IT,ITA,, +12212,,IT,ITA,, +12214,,IT,ITA,, +12215,,IT,ITA,, +12216,,IT,ITA,, +12217,,IT,ITA,, +12218,,IT,ITA,, +12219,,IT,ITA,, +12220,,IT,ITA,, +12222,,IT,ITA,, +12223,,IT,ITA,, +12225,,IT,ITA,, +12226,,IT,ITA,, +12227,,IT,ITA,, +12228,,IT,ITA,, +12229,,IT,ITA,, +12230,,IT,ITA,, +12231,,IT,ITA,, +12232,,IT,ITA,, +12233,,IT,ITA,, +12234,,IT,ITA,, +12235,,IT,ITA,, +12236,,IT,ITA,, +12237,,IT,ITA,, +12238,,IT,ITA,, +12239,,IT,ITA,, +12240,,IT,ITA,, +12241,,IT,ITA,, +12242,,IT,ITA,, +12244,,IT,ITA,, +12245,,IT,ITA,, +12246,,IT,ITA,, +12247,,IT,ITA,, +12250,,IT,ITA,, +12251,,IT,ITA,, +12252,,IT,ITA,, +12253,,IT,ITA,, +12258,,IT,ITA,, +12259,,IT,ITA,, +12260,,IT,ITA,, +12261,,IT,ITA,, +12262,,IT,ITA,, +12263,,IT,ITA,, +12294,,IT,ITA,, +12295,,IT,ITA,, +12296,,IT,ITA,, +12300,,IT,ITA,, +12302,,IT,ITA,, +12311,,IT,ITA,, +12312,,IT,ITA,, +12313,,IT,ITA,, +12314,,IT,ITA,, +12316,,IT,ITA,, +12317,,IT,ITA,, +12318,,IT,ITA,, +12337,,IT,ITA,, +12340,,IT,ITA,, +12341,,IT,ITA,, +12342,,IT,ITA,, +12343,,IT,ITA,, +12351,,IT,ITA,, +12352,,IT,ITA,, +12353,,IT,ITA,, +12354,,IT,ITA,, +12355,,IT,ITA,, +12356,,IT,ITA,, +12357,,IT,ITA,, +12358,,IT,ITA,, +12359,,IT,ITA,, +12360,,IT,ITA,, +12361,,IT,ITA,, +12362,,IT,ITA,, +12363,,IT,ITA,, +12364,,IT,ITA,, +12365,,IT,ITA,, +12386,,IT,ITA,, +12388,,IT,ITA,, +12391,,IT,ITA,, +12392,,IT,ITA,, +12393,,IT,ITA,, +12398,,IT,ITA,, +12399,,IT,ITA,, +12400,,IT,ITA,, +12401,,IT,ITA,, +12402,,IT,ITA,, +12403,,IT,ITA,, +12404,,IT,ITA,, +12405,,IT,ITA,, +12406,,IT,ITA,, +12407,,IT,ITA,, +12409,,IT,ITA,, +12411,,IT,ITA,, +12417,,IT,ITA,, +12418,,IT,ITA,, +12430,,IT,ITA,, +12431,,IT,ITA,, +12432,,IT,ITA,, +12433,,IT,ITA,, +12434,,IT,ITA,, +12435,,IT,ITA,, +12436,,IT,ITA,, +12437,,IT,ITA,, +12438,,IT,ITA,, +12439,,IT,ITA,, +12440,,IT,ITA,, +12441,,IT,ITA,, +12442,,IT,ITA,, +12443,,IT,ITA,, +12444,,IT,ITA,, +12445,,IT,ITA,, +12446,,IT,ITA,, +12447,,IT,ITA,, +12448,,IT,ITA,, +12449,,IT,ITA,, +12450,,IT,ITA,, +12451,,IT,ITA,, +12452,,IT,ITA,, +12453,,IT,ITA,, +12454,,IT,ITA,, +12455,,IT,ITA,, +12456,,IT,ITA,, +12457,,IT,ITA,, +12458,,IT,ITA,, +12460,,IT,ITA,, +12461,,IT,ITA,, +12462,,IT,ITA,, +12463,,IT,ITA,, +12464,,IT,ITA,, +12465,,IT,ITA,, +12466,,IT,ITA,, +12467,,IT,ITA,, +12468,,IT,ITA,, +12469,,IT,ITA,, +12470,,IT,ITA,, +12471,,IT,ITA,, +12472,,IT,ITA,, +12473,,IT,ITA,, +12474,,IT,ITA,, +12475,,IT,ITA,, +12476,,IT,ITA,, +12477,,IT,ITA,, +12478,,IT,ITA,, +12479,,IT,ITA,, +12480,,IT,ITA,, +12481,,IT,ITA,, +12482,,IT,ITA,, +12483,,IT,ITA,, +12484,,IT,ITA,, +12485,,IT,ITA,, +12486,,IT,ITA,, +12487,,IT,ITA,, +12488,,IT,ITA,, +12489,,IT,ITA,, +12490,,IT,ITA,, +12491,,IT,ITA,, +12519,,IT,ITA,, +12522,,IT,ITA,, +12523,,IT,ITA,, +12524,,IT,ITA,, +12527,,IT,ITA,, +12528,,IT,ITA,, +12529,,IT,ITA,, +12530,,IT,ITA,, +12534,,IT,ITA,, +12535,,IT,ITA,, +12536,,IT,ITA,, +12537,,IT,ITA,, +12538,,IT,ITA,, +12539,,IT,ITA,, +12540,,IT,ITA,, +12541,,IT,ITA,, +12542,,IT,ITA,, +12543,,IT,ITA,, +12544,,IT,ITA,, +12545,,IT,ITA,, +12546,,IT,ITA,, +12547,,IT,ITA,, +12548,,IT,ITA,, +12549,,IT,ITA,, +12550,,IT,ITA,, +12551,,IT,ITA,, +12552,,IT,ITA,, +12553,,IT,ITA,, +12560,,IT,ITA,, +12561,,IT,ITA,, +12562,,IT,ITA,, +12564,,IT,ITA,, +12565,,IT,ITA,, +12566,,IT,ITA,, +12569,,IT,ITA,, +12570,,IT,ITA,, +12571,,IT,ITA,, +12572,,IT,ITA,, +12573,,IT,ITA,, +12593,,IT,ITA,, +12612,,IT,ITA,, +12613,,IT,ITA,, +12616,,IT,ITA,, +12617,,IT,ITA,, +12618,,IT,ITA,, +12619,,IT,ITA,, +12620,,IT,ITA,, +12621,,IT,ITA,, +12622,,IT,ITA,, +12625,,IT,ITA,, +12632,,IT,ITA,, +12650,,IT,ITA,, +12651,,IT,ITA,, +12652,,IT,ITA,, +12677,,IT,ITA,, +12681,,IT,ITA,, +12682,,IT,ITA,, +12683,,IT,ITA,, +12697,,IT,ITA,, +12741,,IT,ITA,, +12742,,IT,ITA,, +12743,,IT,ITA,, +12748,,IT,ITA,, +12749,,IT,ITA,, +12751,,IT,ITA,, +12753,,IT,ITA,, +12754,,IT,ITA,, +12755,,IT,ITA,, +12756,,IT,ITA,, +12757,,IT,ITA,, +12761,,IT,ITA,, +12762,,IT,ITA,, +12763,,IT,ITA,, +12764,,IT,ITA,, +12765,,IT,ITA,, +12766,,IT,ITA,, +12767,,IT,ITA,, +12768,,IT,ITA,, +12769,,IT,ITA,, +12770,,IT,ITA,, +12806,,IT,ITA,, +12845,,IT,ITA,, +12846,,IT,ITA,, +12862,,IT,ITA,, +12863,,IT,ITA,, +12864,,IT,ITA,, +12878,,IT,ITA,, +12879,,IT,ITA,, +12880,,IT,ITA,, +13259,,IT,ITA,, +13296,,IT,ITA,, +13303,,IT,ITA,, +13324,,IT,ITA,, +13369,,IT,ITA,, +13370,,IT,ITA,, +13371,,IT,ITA,, +13372,,IT,ITA,, +13396,,IT,ITA,, +13397,,IT,ITA,, +13398,,IT,ITA,, +13399,,IT,ITA,, +13400,,IT,ITA,, +13401,,IT,ITA,, +13402,,IT,ITA,, +13403,,IT,ITA,, +13404,,IT,ITA,, +13405,,IT,ITA,, +13406,,IT,ITA,, +13407,,IT,ITA,, +13408,,IT,ITA,, +13409,,IT,ITA,, +13411,,IT,ITA,, +13412,,IT,ITA,, +13418,,IT,ITA,, +13419,,IT,ITA,, +13422,,IT,ITA,, +13426,,IT,ITA,, +13427,,IT,ITA,, +13428,,IT,ITA,, +13429,,IT,ITA,, +13430,,IT,ITA,, +13431,,IT,ITA,, +13432,,IT,ITA,, +13433,,IT,ITA,, +13441,,IT,ITA,, +13442,,IT,ITA,, +13443,,IT,ITA,, +13444,,IT,ITA,, +13445,,IT,ITA,, +13446,,IT,ITA,, +13447,,IT,ITA,, +13449,,IT,ITA,, +13450,,IT,ITA,, +13451,,IT,ITA,, +13452,,IT,ITA,, +13455,,IT,ITA,, +13456,,IT,ITA,, +13457,,IT,ITA,, +13483,,IT,ITA,, +13485,,IT,ITA,, +13486,,IT,ITA,, +13515,,IT,ITA,, +13516,,IT,ITA,, +13519,,IT,ITA,, +13520,,IT,ITA,, +13521,,IT,ITA,, +13522,,IT,ITA,, +13523,,IT,ITA,, +13529,,IT,ITA,, +13530,,IT,ITA,, +13531,,IT,ITA,, +13532,,IT,ITA,, +13549,,IT,ITA,, +13550,,IT,ITA,, +13551,,IT,ITA,, +13552,,IT,ITA,, +13553,,IT,ITA,, +13554,,IT,ITA,, +13555,,IT,ITA,, +13556,,IT,ITA,, +13559,,IT,ITA,, +13561,,IT,ITA,, +13562,,IT,ITA,, +13563,,IT,ITA,, +13564,,IT,ITA,, +13565,,IT,ITA,, +13566,,IT,ITA,, +13567,,IT,ITA,, +13568,,IT,ITA,, +13569,,IT,ITA,, +13570,,IT,ITA,, +13709,,IT,ITA,, +13710,,IT,ITA,, +13718,,IT,ITA,, +13732,,IT,ITA,, +13740,,IT,ITA,, +13803,,IT,ITA,, +13806,,IT,ITA,, +13815,,IT,ITA,, +13816,,IT,ITA,, +13827,,IT,ITA,, +13846,,IT,ITA,, +13847,,IT,ITA,, +13858,,IT,ITA,, +13859,,IT,ITA,, +13860,,IT,ITA,, +13868,,IT,ITA,, +13869,,IT,ITA,, +13870,,IT,ITA,, +13871,,IT,ITA,, +13872,,IT,ITA,, +13873,,IT,ITA,, +13877,,IT,ITA,, +13878,,IT,ITA,, +13879,,IT,ITA,, +13880,,IT,ITA,, +13881,,IT,ITA,, +13882,,IT,ITA,, +13884,,IT,ITA,, +13887,,IT,ITA,, +13888,,IT,ITA,, +13889,,IT,ITA,, +13890,,IT,ITA,, +13891,,IT,ITA,, +13892,,IT,ITA,, +13894,,IT,ITA,, +13896,,IT,ITA,, +13897,,IT,ITA,, +13899,,IT,ITA,, +13900,,IT,ITA,, +13901,,IT,ITA,, +13902,,IT,ITA,, +13903,,IT,ITA,, +13905,,IT,ITA,, +13906,,IT,ITA,, +13907,,IT,ITA,, +13908,,IT,ITA,, +13909,,IT,ITA,, +13910,,IT,ITA,, +13911,,IT,ITA,, +13912,,IT,ITA,, diff --git a/docs/after.csv b/docs/after.csv new file mode 100644 index 0000000..eaaf1d4 --- /dev/null +++ b/docs/after.csv @@ -0,0 +1,102 @@ +id,remoteId,uri,provider,trashed,sourceMimeType,sizeBytes,remoteWidth,remoteHeight,remoteRotation,dateModifiedMillis +1,b3cda38a2fdee7ba9bdd2ea07d936b2fa5361baa21be2b2c29f1ad8ebcc4c31e,aves-remote://rid/b3cda38a2fdee7ba9bdd2ea07d936b2fa5361baa21be2b2c29f1ad8ebcc4c31e,json@patachina,0,image/jpeg,3758888,4032,3024,0,1503481740000 +2,09ef919ff2a105ad75d2e7631b9c02228c1784df5048c98276fd379f1533360b,aves-remote://rid/09ef919ff2a105ad75d2e7631b9c02228c1784df5048c98276fd379f1533360b,json@patachina,0,image/jpeg,3984165,4032,3024,0,1503493700000 +3,dba1de0e187650e62118279beb2d83e8759a6d4fb8a5412a6a18cdc4e01a33d7,aves-remote://rid/dba1de0e187650e62118279beb2d83e8759a6d4fb8a5412a6a18cdc4e01a33d7,json@patachina,0,image/jpeg,4338120,5326,3950,0,1503496121000 +4,751d8a15766bf2686bc87e60b33b4a8c38befe454428e6a5a82b00f26026c0e0,aves-remote://rid/751d8a15766bf2686bc87e60b33b4a8c38befe454428e6a5a82b00f26026c0e0,json@patachina,0,image/jpeg,3159006,4032,3024,0,1503496785000 +5,73dfd75dd639da9c7c0d4a6244f189a833d543bfdd4059b06f9f98e49f83c937,aves-remote://rid/73dfd75dd639da9c7c0d4a6244f189a833d543bfdd4059b06f9f98e49f83c937,json@patachina,0,image/jpeg,3338305,4032,3024,0,1503496787000 +6,f32173d43d16b47eda3e7a32257ec956287d60b0516a5f6e46a8d1d433f53fd8,aves-remote://rid/f32173d43d16b47eda3e7a32257ec956287d60b0516a5f6e46a8d1d433f53fd8,json@patachina,0,image/jpeg,2815021,4032,3024,0,1503496997000 +7,90c0a0932fdfa3eefb64156dec5b366c4af5245def4cc619d8eee29ca72cd7fe,aves-remote://rid/90c0a0932fdfa3eefb64156dec5b366c4af5245def4cc619d8eee29ca72cd7fe,json@patachina,0,image/jpeg,3207260,4032,3024,0,1503497854000 +8,4d74430aa1fbc45154ad4e8bf43bff334065ebd2757367806d4b8c165c9a7935,aves-remote://rid/4d74430aa1fbc45154ad4e8bf43bff334065ebd2757367806d4b8c165c9a7935,json@patachina,0,image/jpeg,2674913,4032,3024,0,1503497873000 +9,1955c91d411219c131c210b97fe38eb78df83be6ca12cdc845b952bcb78abc6f,aves-remote://rid/1955c91d411219c131c210b97fe38eb78df83be6ca12cdc845b952bcb78abc6f,json@patachina,0,image/jpeg,2788605,4032,3024,0,1503498970000 +10,14616f6446b0ffc01895f24db1656fa0b7a33da3b9e8c8e24065647faa2138f2,aves-remote://rid/14616f6446b0ffc01895f24db1656fa0b7a33da3b9e8c8e24065647faa2138f2,json@patachina,0,image/jpeg,3447883,4032,3024,90,1503504834000 +11,7668b4a6cf960b548a0bd1480444a3a039a4ca59d16656d2a1a3ca80a11eaa41,aves-remote://rid/7668b4a6cf960b548a0bd1480444a3a039a4ca59d16656d2a1a3ca80a11eaa41,json@patachina,0,image/jpeg,3513469,4032,3024,0,1503505103000 +12,4a10ae72b84c6e205c8295dc1f94b5407d78f25576707fba0f3bb9093e70ce1c,aves-remote://rid/4a10ae72b84c6e205c8295dc1f94b5407d78f25576707fba0f3bb9093e70ce1c,json@patachina,0,image/jpeg,2353262,4032,3024,0,1503509034000 +13,490631b5d03e797f7ca50b5e42be1cdabafd54b20804b51d2c9565aef18de750,aves-remote://rid/490631b5d03e797f7ca50b5e42be1cdabafd54b20804b51d2c9565aef18de750,json@patachina,0,image/jpeg,2912549,4032,3024,90,1503510106000 +14,1a9759607a60387b7ff383fce2fce32f5e5aba91c0b0d3e09c1c2763c40334be,aves-remote://rid/1a9759607a60387b7ff383fce2fce32f5e5aba91c0b0d3e09c1c2763c40334be,json@patachina,0,image/jpeg,2351855,4032,3024,90,1503510129000 +15,486d095f85a006800b9d3760e2ef4ac7ba909d82ba1347800a273d99395962a3,aves-remote://rid/486d095f85a006800b9d3760e2ef4ac7ba909d82ba1347800a273d99395962a3,json@patachina,0,image/jpeg,1869483,4032,3024,0,1503512829000 +16,69eb91132640feeb561e94bb3258ca69c41e27ca711cb814c2ac33270599167a,aves-remote://rid/69eb91132640feeb561e94bb3258ca69c41e27ca711cb814c2ac33270599167a,json@patachina,0,image/jpeg,1800632,4032,3024,90,1503512842000 +17,1da97cbc6e7914cbd33e4dbd51729cd45f1c77116c1f5be9531adeb6424eb6e2,aves-remote://rid/1da97cbc6e7914cbd33e4dbd51729cd45f1c77116c1f5be9531adeb6424eb6e2,json@patachina,0,image/jpeg,1643315,4032,3024,90,1503514391000 +18,7fbc8546424236f94107681a69ed37fa94159377cf378a44f9d0e907a2afd31a,aves-remote://rid/7fbc8546424236f94107681a69ed37fa94159377cf378a44f9d0e907a2afd31a,json@patachina,0,image/jpeg,1450013,4032,3024,90,1503514403000 +19,35772196ab28b9fd957199f81b267c9b99097055bfdcf1749e0c772241681cac,aves-remote://rid/35772196ab28b9fd957199f81b267c9b99097055bfdcf1749e0c772241681cac,json@patachina,0,image/jpeg,1606095,4032,3024,90,1503514433000 +20,48b26b6f9aaf835dd90e6098194dedfbee75b85c20429d939188e70873dd4274,aves-remote://rid/48b26b6f9aaf835dd90e6098194dedfbee75b85c20429d939188e70873dd4274,json@patachina,0,image/jpeg,1839090,4032,3024,90,1503518935000 +21,10ca45bc5aab42b5ba08da7d6a15d7f942478ca5e052f89054097c93d3dd6134,aves-remote://rid/10ca45bc5aab42b5ba08da7d6a15d7f942478ca5e052f89054097c93d3dd6134,json@patachina,0,image/jpeg,2013689,4032,3024,90,1503519976000 +22,c6b58236822fab393b8793af2991115182afaf13b26a27394c4d5d6a799d0969,aves-remote://rid/c6b58236822fab393b8793af2991115182afaf13b26a27394c4d5d6a799d0969,json@patachina,0,image/jpeg,1557955,3724,2096,90,1773491614087 +23,1d4945502b8686c4f4dc3ea94bfb37db7587d505e6c411bdf11976402c000e90,aves-remote://rid/1d4945502b8686c4f4dc3ea94bfb37db7587d505e6c411bdf11976402c000e90,json@patachina,0,image/jpeg,2667599,4032,3024,0,1503563815000 +24,bf2f60a20771c3647d605a7cc192b95a7e078b7c6530ad30462ee6a2794c9df0,aves-remote://rid/bf2f60a20771c3647d605a7cc192b95a7e078b7c6530ad30462ee6a2794c9df0,json@patachina,0,image/jpeg,2698118,4032,3024,0,1503563819000 +25,7d753539885cd882a1fdf04241eda6bfb8332ba1ed32bfc078dbadb3e5eb321f,aves-remote://rid/7d753539885cd882a1fdf04241eda6bfb8332ba1ed32bfc078dbadb3e5eb321f,json@patachina,0,image/jpeg,2656457,4032,3024,0,1503563838000 +26,29eb6ed3cd8e3d85e0803d091291b75677e6de2702918a286047894e444d669b,aves-remote://rid/29eb6ed3cd8e3d85e0803d091291b75677e6de2702918a286047894e444d669b,json@patachina,0,image/jpeg,4654237,4032,3024,90,1503583782000 +27,ebaf024e4df7764c2c458484d6e6eef1ced76611dd70b84f82af46337ba13839,aves-remote://rid/ebaf024e4df7764c2c458484d6e6eef1ced76611dd70b84f82af46337ba13839,json@patachina,0,image/jpeg,3760564,4032,3024,0,1503584553000 +28,c782108a839231c6dda63924f0b855747f98a4f56d8e93390f70877d4a452db6,aves-remote://rid/c782108a839231c6dda63924f0b855747f98a4f56d8e93390f70877d4a452db6,json@patachina,0,image/jpeg,3627847,4032,3024,0,1503594928000 +29,f56db1595a3b822e1e5cc119c101904285dca3f3f1b8edbf0bfa42999583cc2f,aves-remote://rid/f56db1595a3b822e1e5cc119c101904285dca3f3f1b8edbf0bfa42999583cc2f,json@patachina,0,image/jpeg,1900418,4032,3024,90,1503605922000 +30,5d03b5d0866a5cce0b6a12b78173c1f77eef5b1e5bfc5a4fd8e2cfd1c53a2b8e,aves-remote://rid/5d03b5d0866a5cce0b6a12b78173c1f77eef5b1e5bfc5a4fd8e2cfd1c53a2b8e,json@patachina,0,image/jpeg,1944490,4032,3024,90,1503605929000 +31,dd715de9995fd11a23fee1df7c1561ea45bd215e765e9e93b2efc3f2ca59c39c,aves-remote://rid/dd715de9995fd11a23fee1df7c1561ea45bd215e765e9e93b2efc3f2ca59c39c,json@patachina,0,image/jpeg,2020943,4032,3024,90,1503606518000 +32,8e1a2d2abbd36803ec8670f56869ae723c4c8c8fcd5e634ada9f988c942df1b8,aves-remote://rid/8e1a2d2abbd36803ec8670f56869ae723c4c8c8fcd5e634ada9f988c942df1b8,json@patachina,0,image/jpeg,2632829,4032,3024,90,1503656054000 +33,46412728d6155abe53abfec76c97898aad60e36322a46f4a4da280fba8c7c0cc,aves-remote://rid/46412728d6155abe53abfec76c97898aad60e36322a46f4a4da280fba8c7c0cc,json@patachina,0,image/jpeg,3300375,4032,3024,0,1503656159000 +34,999cc0997f51584fef2627c5c9bd87d2f41cd9fe52d930fdc85f791c6adc328e,aves-remote://rid/999cc0997f51584fef2627c5c9bd87d2f41cd9fe52d930fdc85f791c6adc328e,json@patachina,0,image/jpeg,4461504,5532,3898,0,1503656554000 +35,7ed0d6366274f3cadfc4caa618847c9c6c250e6b55127367d4ad1e3ca8322436,aves-remote://rid/7ed0d6366274f3cadfc4caa618847c9c6c250e6b55127367d4ad1e3ca8322436,json@patachina,0,image/jpeg,4964535,5232,3872,270,1503656644000 +36,4025ea19107cf40d092576e4aaa122bdfb027dc90592a50dd6fa8131838dae69,aves-remote://rid/4025ea19107cf40d092576e4aaa122bdfb027dc90592a50dd6fa8131838dae69,json@patachina,0,image/jpeg,4837273,5300,3908,270,1503656673000 +37,d91b81a39d72056b2b7eb5bbf6058cf5b5df85cd5d9ca7e2a1bc7e9b897ebfb4,aves-remote://rid/d91b81a39d72056b2b7eb5bbf6058cf5b5df85cd5d9ca7e2a1bc7e9b897ebfb4,json@patachina,0,image/jpeg,1697485,4032,3024,0,1503656711000 +38,49a2098503bd07db18c869b17419352a0a2232389b3cad98cbb013ad42882600,aves-remote://rid/49a2098503bd07db18c869b17419352a0a2232389b3cad98cbb013ad42882600,json@patachina,0,image/jpeg,1680963,4032,3024,90,1503656725000 +39,a856fcea4cade1ed9c59dab96f180c06f18bc97a39654301ad623aed4a4979d7,aves-remote://rid/a856fcea4cade1ed9c59dab96f180c06f18bc97a39654301ad623aed4a4979d7,json@patachina,0,image/jpeg,1502040,3024,4032,,1503656771000 +40,fd3df96d42b300c66332b98ce7639a79ae07aa0cbadf6ebbd283901bcca510c6,aves-remote://rid/fd3df96d42b300c66332b98ce7639a79ae07aa0cbadf6ebbd283901bcca510c6,json@patachina,0,image/jpeg,1520788,4032,3024,90,1503656843000 +41,c8ada02d1e1b7155607e905de25546c0a079c39528fe6df0b601a9c7b5f5df93,aves-remote://rid/c8ada02d1e1b7155607e905de25546c0a079c39528fe6df0b601a9c7b5f5df93,json@patachina,0,image/jpeg,4954269,8178,3754,0,1503657571000 +42,7351a37b3092015b6dee6e2911581ce590043619497ca84240b71e5ee37a0d2d,aves-remote://rid/7351a37b3092015b6dee6e2911581ce590043619497ca84240b71e5ee37a0d2d,json@patachina,0,image/jpeg,2747267,4032,3024,90,1503666106000 +43,23852fb024f46c21667b30107942c40d57429b37c0df1549ab32004a739d792f,aves-remote://rid/23852fb024f46c21667b30107942c40d57429b37c0df1549ab32004a739d792f,json@patachina,0,image/jpeg,2808395,4032,3024,0,1503666149000 +44,0ed7a1b65e9181db517fc4b75dcb3c8f398b7c3cd880ebc6d345886d070dc843,aves-remote://rid/0ed7a1b65e9181db517fc4b75dcb3c8f398b7c3cd880ebc6d345886d070dc843,json@patachina,0,image/jpeg,3137643,4032,3024,0,1503666179000 +45,64ec16ebc0611619d7c397453119ffe1f80f211b7bc9c428f65f8d761c6aa61f,aves-remote://rid/64ec16ebc0611619d7c397453119ffe1f80f211b7bc9c428f65f8d761c6aa61f,json@patachina,0,image/jpeg,2929880,4032,3024,90,1503667517000 +46,8fa73c5ac88c878b12ec926377f54e4d01187d92cc150730c514284d34581b39,aves-remote://rid/8fa73c5ac88c878b12ec926377f54e4d01187d92cc150730c514284d34581b39,json@patachina,0,image/jpeg,2498451,4032,3024,90,1503667524000 +47,ddab26bedbe3287cb210d46a2397336f879655c99224f90f8da1646ee111fee8,aves-remote://rid/ddab26bedbe3287cb210d46a2397336f879655c99224f90f8da1646ee111fee8,json@patachina,0,image/jpeg,3020402,4032,3024,90,1503669348000 +48,a07cfd0dfca3d9377ea2f4fea5501c6403f90f4a42a5732bde8b5d31214a2a7a,aves-remote://rid/a07cfd0dfca3d9377ea2f4fea5501c6403f90f4a42a5732bde8b5d31214a2a7a,json@patachina,0,image/jpeg,2161605,4032,3024,90,1503671202000 +49,7a9382798ebaa67e80804165044390a2fded193ec5aa9753e75b62d9d54ce39a,aves-remote://rid/7a9382798ebaa67e80804165044390a2fded193ec5aa9753e75b62d9d54ce39a,json@patachina,0,image/jpeg,2913137,4032,3024,90,1503686951000 +50,9e8eb4959ed23f9dc3f8722bca1c5dd5a13ff7a6b95a0f0bf8df430d0e2ee9c3,aves-remote://rid/9e8eb4959ed23f9dc3f8722bca1c5dd5a13ff7a6b95a0f0bf8df430d0e2ee9c3,json@patachina,0,image/jpeg,3437757,4032,3024,90,1503686966000 +51,df20d33dc73c45e9832c4a83fa5e4fd625c58518dfab5e3465d55959539cf57a,aves-remote://rid/df20d33dc73c45e9832c4a83fa5e4fd625c58518dfab5e3465d55959539cf57a,json@patachina,0,image/jpeg,1668522,3724,2096,90,1773491614875 +52,f46da4f2e78a8428eda4ea3a0363878cd50dd1d4b3798e4c858a34a217cc53d6,aves-remote://rid/f46da4f2e78a8428eda4ea3a0363878cd50dd1d4b3798e4c858a34a217cc53d6,json@patachina,0,image/jpeg,1781263,3724,2096,90,1773491614881 +53,68c6d643cbe16143e9255bd3c84576e943b60412d506c090f4a7b93de3e9fd56,aves-remote://rid/68c6d643cbe16143e9255bd3c84576e943b60412d506c090f4a7b93de3e9fd56,json@patachina,0,image/jpeg,973684,3763,1657,,1503695558000 +54,6b4d4396b06a0513b53fa9d088c1a95bbfacb99ede015addb9e34ad973fd77f4,aves-remote://rid/6b4d4396b06a0513b53fa9d088c1a95bbfacb99ede015addb9e34ad973fd77f4,json@patachina,0,image/jpeg,1311890,3724,2096,0,1773491614903 +55,dc17f07d88bdd90f4e439911484a2a31f91acb15fcb1201115f16157eec70e66,aves-remote://rid/dc17f07d88bdd90f4e439911484a2a31f91acb15fcb1201115f16157eec70e66,json@patachina,0,image/jpeg,4612510,7506,3870,0,1503734480000 +56,4f041976518502b14f0520489ac932cfd3f9e4e9226e38b09b483327b34ad3bf,aves-remote://rid/4f041976518502b14f0520489ac932cfd3f9e4e9226e38b09b483327b34ad3bf,json@patachina,0,image/jpeg,4484747,5624,3958,0,1503734933000 +57,4a125c9271159191ab923bc14fb5398d08aef6ee5ba313a2f6b1599a52e4e0cc,aves-remote://rid/4a125c9271159191ab923bc14fb5398d08aef6ee5ba313a2f6b1599a52e4e0cc,json@patachina,0,image/jpeg,2873334,8968,1560,,1503743055000 +58,0bd35f8c46fa2ec4979d977d13bab6b8e0dc18365a0f25a7d87d81c5336c0378,aves-remote://rid/0bd35f8c46fa2ec4979d977d13bab6b8e0dc18365a0f25a7d87d81c5336c0378,json@patachina,0,image/jpeg,2168733,4032,3024,90,1503749114000 +59,4065f86b9af59235a5727abaaccb54a9a91fa585b464da2c592db5ed300d8836,aves-remote://rid/4065f86b9af59235a5727abaaccb54a9a91fa585b464da2c592db5ed300d8836,json@patachina,0,image/jpeg,1891230,4032,3024,90,1503749116000 +60,76ea19c9ae626658b75942ad3fb9cf4caae2b2a4b845103dac42c006a3af3984,aves-remote://rid/76ea19c9ae626658b75942ad3fb9cf4caae2b2a4b845103dac42c006a3af3984,json@patachina,0,image/jpeg,1766923,4032,3024,90,1503749303000 +61,065a80861c5452dd07586b786aad63e9d74a822cbf10913201658c54023e63cd,aves-remote://rid/065a80861c5452dd07586b786aad63e9d74a822cbf10913201658c54023e63cd,json@patachina,0,image/jpeg,2935053,4032,3024,0,1503767620000 +62,e30a1427708cfc8d63a66d369781b15ac6a07b43e13550b1a7625003914503ed,aves-remote://rid/e30a1427708cfc8d63a66d369781b15ac6a07b43e13550b1a7625003914503ed,json@patachina,0,image/jpeg,1852261,4032,3024,0,1503767749000 +63,c584bb41bc73b6b452c6964622ea7e4ccfddc741ed6e1d3757ed6015b59cf65f,aves-remote://rid/c584bb41bc73b6b452c6964622ea7e4ccfddc741ed6e1d3757ed6015b59cf65f,json@patachina,0,image/jpeg,1936144,4032,3024,0,1503767754000 +64,77b822134129d751070d73441dda90996dab21186c50be2ce79064e22bba94bd,aves-remote://rid/77b822134129d751070d73441dda90996dab21186c50be2ce79064e22bba94bd,json@patachina,0,image/jpeg,1843400,4032,3024,0,1503768183000 +65,be834d7663441134af0e4fc6619b1c3ae06b5ce0856beac123ac6972c5b270d7,aves-remote://rid/be834d7663441134af0e4fc6619b1c3ae06b5ce0856beac123ac6972c5b270d7,json@patachina,0,image/jpeg,4221357,4658,3974,0,1503769227000 +66,6750d21dec9eb3436ce6c821b40e344ef0fb280e43081cbc5e584310711417b7,aves-remote://rid/6750d21dec9eb3436ce6c821b40e344ef0fb280e43081cbc5e584310711417b7,json@patachina,0,image/jpeg,4179034,7305,2311,,1503769265000 +67,ea8ae33ca15f21e84d75f5b853a88ca78d722b4f461478bdccfa9c059f6b69db,aves-remote://rid/ea8ae33ca15f21e84d75f5b853a88ca78d722b4f461478bdccfa9c059f6b69db,json@patachina,0,image/jpeg,1750381,1680,4030,0,1503769375000 +68,3be962052af0da265a1bd9cb69ed6868798f47343a2e1dc774c77568c20139bf,aves-remote://rid/3be962052af0da265a1bd9cb69ed6868798f47343a2e1dc774c77568c20139bf,json@patachina,0,image/jpeg,2046548,4427,2389,,1503769385000 +69,3041f044b86b8888937659a1c691db34f0c8b52b6dec6a7db023c18e9cd24722,aves-remote://rid/3041f044b86b8888937659a1c691db34f0c8b52b6dec6a7db023c18e9cd24722,json@patachina,0,image/jpeg,4328104,6438,3900,,1503769503000 +70,50c16b24a37a6d76da00bc64b0a6f96ae858ba386dd5750ce0187a7cc3402027,aves-remote://rid/50c16b24a37a6d76da00bc64b0a6f96ae858ba386dd5750ce0187a7cc3402027,json@patachina,0,image/jpeg,703594,3946,2960,,1503779894000 +71,df606e3b1a55f9f2c90e333bd113a0af2beb83a319aac9619b5b9cd729b13b0e,aves-remote://rid/df606e3b1a55f9f2c90e333bd113a0af2beb83a319aac9619b5b9cd729b13b0e,json@patachina,0,image/jpeg,468928,3745,1941,,1503779936000 +72,2454c04dd9067d2b5288dcca99c5c3eac85660779a97d6165a08ca7c37481070,aves-remote://rid/2454c04dd9067d2b5288dcca99c5c3eac85660779a97d6165a08ca7c37481070,json@patachina,0,image/jpeg,2097953,4032,3024,90,1503822184000 +73,bc0155f7235dc0ede6921f43debb8ebe8ca44fb1db57447d26a63f6904f38bba,aves-remote://rid/bc0155f7235dc0ede6921f43debb8ebe8ca44fb1db57447d26a63f6904f38bba,json@patachina,0,image/jpeg,2489649,4032,3024,0,1503823090000 +74,a99f57f0bea2cb9b6caf3d0e60c3719e379d3d5bc2bbe37d1044c764214dd0b9,aves-remote://rid/a99f57f0bea2cb9b6caf3d0e60c3719e379d3d5bc2bbe37d1044c764214dd0b9,json@patachina,0,image/jpeg,3009764,4032,3024,0,1503830851000 +75,915492fbf9fc1769985e4f5684d42728b5ee63092b148b887c6d07d1fb66fe8f,aves-remote://rid/915492fbf9fc1769985e4f5684d42728b5ee63092b148b887c6d07d1fb66fe8f,json@patachina,0,image/jpeg,2757600,4032,3024,0,1503830943000 +76,0c2e99aa7c89c4a124019241d0131a03877d49bef2e409be8421b93d0f15ed82,aves-remote://rid/0c2e99aa7c89c4a124019241d0131a03877d49bef2e409be8421b93d0f15ed82,json@patachina,0,image/jpeg,3442902,4032,3024,0,1503830950000 +77,a80cdc2fe8bfed0bddc25931f17f5f263ea273cca34558d9e190effa5fcc7bc9,aves-remote://rid/a80cdc2fe8bfed0bddc25931f17f5f263ea273cca34558d9e190effa5fcc7bc9,json@patachina,0,image/jpeg,3891743,4032,3024,90,1503833355000 +78,308808d70076dd738c2d8d7703332dd000fb5592084ff292e2e7d2e43cac75df,aves-remote://rid/308808d70076dd738c2d8d7703332dd000fb5592084ff292e2e7d2e43cac75df,json@patachina,0,image/jpeg,1551495,3162,1743,,1503844208000 +79,20bdd8d0c71b2e1b6a55586e2def4db18152371efbd966b98f055ba340bf471a,aves-remote://rid/20bdd8d0c71b2e1b6a55586e2def4db18152371efbd966b98f055ba340bf471a,json@patachina,0,image/jpeg,1257412,4032,3024,90,1503857624000 +80,37df228c1e983e94e3abea8800b04660e647034fca4948ef45ed6ec69d468687,aves-remote://rid/37df228c1e983e94e3abea8800b04660e647034fca4948ef45ed6ec69d468687,json@patachina,0,image/jpeg,2405533,4032,3024,90,1503862949000 +81,1a4313d5086018efcd689dbca06040d99a75f7b331798b0fa2ced0d25dea95b7,aves-remote://rid/1a4313d5086018efcd689dbca06040d99a75f7b331798b0fa2ced0d25dea95b7,json@patachina,0,image/jpeg,2066043,4032,3024,90,1503909783000 +82,6ab20a650288559438d81881ade44773873472c54d4d8cbbe69aaf2337c9d92b,aves-remote://rid/6ab20a650288559438d81881ade44773873472c54d4d8cbbe69aaf2337c9d92b,json@patachina,0,image/jpeg,4708675,4032,3024,90,1503916727000 +83,6cf111099d98f97b09cf7a397d9ef6c849693e8273bf6026e0af0f257c0240bc,aves-remote://rid/6cf111099d98f97b09cf7a397d9ef6c849693e8273bf6026e0af0f257c0240bc,json@patachina,0,image/jpeg,4888844,4032,3024,90,1503916733000 +84,e830691975e126ad19891ea10585409a551791e8d0e8c6eda7e9d5e7878ce6a2,aves-remote://rid/e830691975e126ad19891ea10585409a551791e8d0e8c6eda7e9d5e7878ce6a2,json@patachina,0,image/jpeg,4413193,4032,3024,90,1503916750000 +85,9fabc411f90e2a1452f4880b21ee6cdfb14c1274ce8c7a9a23c30444f07b370b,aves-remote://rid/9fabc411f90e2a1452f4880b21ee6cdfb14c1274ce8c7a9a23c30444f07b370b,json@patachina,0,image/jpeg,3314673,3630,3790,270,1503916764000 +86,3846bf7e160007e43c6de5a612b3384ad4235276b7ac86284fd2a7e45a3b0a27,aves-remote://rid/3846bf7e160007e43c6de5a612b3384ad4235276b7ac86284fd2a7e45a3b0a27,json@patachina,0,image/jpeg,1745323,4032,3024,0,1504001722000 +87,b4fec8470cd605882c09ec97558d3a737d25a43488adfb903c3573f8b1fb5ebc,aves-remote://rid/b4fec8470cd605882c09ec97558d3a737d25a43488adfb903c3573f8b1fb5ebc,json@patachina,0,image/jpeg,1242828,4032,3024,0,1504005466000 +88,b864196e118aa2b40142438c2e28df587c53fb27e6d4e24fa9b98a00cecccdc9,aves-remote://rid/b864196e118aa2b40142438c2e28df587c53fb27e6d4e24fa9b98a00cecccdc9,json@patachina,0,image/jpeg,3347118,4032,3024,0,1504005486000 +89,b1f9d25d6d7217c01a3a67f59176d54ce73b1bb626a687d1447a5354e5cad020,aves-remote://rid/b1f9d25d6d7217c01a3a67f59176d54ce73b1bb626a687d1447a5354e5cad020,json@patachina,0,image/jpeg,4832084,4032,3024,90,1504006676000 +90,e9549aa2bb21ad70ff35ad1626cf15f6cb62a321e25e3e7ab832bd9e7430e186,aves-remote://rid/e9549aa2bb21ad70ff35ad1626cf15f6cb62a321e25e3e7ab832bd9e7430e186,json@patachina,0,image/jpeg,4210606,4032,3024,90,1504006732000 +91,b8013a96d80b1a6c3b39384f0910ff1f4507fcbf6936b90472d066f75772e751,aves-remote://rid/b8013a96d80b1a6c3b39384f0910ff1f4507fcbf6936b90472d066f75772e751,json@patachina,0,image/jpeg,4047020,4032,3024,0,1504006811000 +92,d32b08d40cee22365e0193a7372cf85e997501d1e5e6d67b80aaddd569ee7030,aves-remote://rid/d32b08d40cee22365e0193a7372cf85e997501d1e5e6d67b80aaddd569ee7030,json@patachina,0,image/jpeg,3155785,4032,3024,90,1504006896000 +93,0402bf83d35731c94314d6333cea4350e725209307a45fe6fe548ae04bf2e763,aves-remote://rid/0402bf83d35731c94314d6333cea4350e725209307a45fe6fe548ae04bf2e763,json@patachina,0,image/jpeg,4551844,4032,3024,90,1504007112000 +94,10e4a1c655829f11ad8f465cfc1e105e7430b9c0bf36f5589624cd5932c50457,aves-remote://rid/10e4a1c655829f11ad8f465cfc1e105e7430b9c0bf36f5589624cd5932c50457,json@patachina,0,image/jpeg,4772193,4032,3024,90,1504007140000 +95,a570da3c838dfd9f3035b658b8d7e873baf6399cf5d39674b37fb4ae4961879e,aves-remote://rid/a570da3c838dfd9f3035b658b8d7e873baf6399cf5d39674b37fb4ae4961879e,json@patachina,0,image/jpeg,1840010,4000,2250,90,1622628398000 +96,5c59ae9398c232eaa2f9e472df32691eb55b335bf07eb4e873d374b4144dbc72,aves-remote://rid/5c59ae9398c232eaa2f9e472df32691eb55b335bf07eb4e873d374b4144dbc72,json@patachina,0,image/jpeg,1756574,4000,2250,0,1622655546000 +97,283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1,aves-remote://rid/283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1,json@patachina,0,image/jpeg,4410362,2592,4608,0,1655646943000 +98,11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1,aves-remote://rid/11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1,json@patachina,0,image/jpeg,4473038,2592,4608,0,1655647001000 +99,87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968,aves-remote://rid/87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968,json@patachina,0,image/jpeg,4782460,2592,4608,0,1655647064000 +100,f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488,aves-remote://rid/f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488,json@patachina,0,image/jpeg,4749840,2592,4608,0,1655647065000 +101,e18affb38f030e3bc631457f0ff2ecaf041b0e150d0e87dd8a23c7bb068ca7c1,aves-remote://rid/e18affb38f030e3bc631457f0ff2ecaf041b0e150d0e87dd8a23c7bb068ca7c1,json@patachina,0,video/mp4,12273606,1920,1080,,1773491615180 diff --git a/docs/after_commit_500.txt b/docs/after_commit_500.txt new file mode 100644 index 0000000..c0c8e0b --- /dev/null +++ b/docs/after_commit_500.txt @@ -0,0 +1,500 @@ +I/flutter ( 2891): [repo-upsert] batch.commit resultsCount=101 +I/flutter ( 2891): [RemoteRepository] deduplicateRemotes deleted=0 +I/flutter ( 2891): [RemoteRepository] deduplicateByRemotePath deleted=0 +I/flutter ( 2891): [RemoteRepository] ensured UNIQUE index on entry(remoteId) for origin=1 +I/flutter ( 2891): [RemoteRepository] ensured UNIQUE index on entry(remotePath) for origin=1 +I/flutter ( 2891): [RemoteRepository] backfill URIs via SQL (remoteId) updated=0 +I/flutter ( 2891): [RemoteRepository] backfill dateModifiedMillis updated=0 +I/flutter ( 2891): [remote-sync] upsert+sanitize completed in 698ms +I/flutter ( 2891): [remote-sync][post] count origin=1 = 101 +I/flutter ( 2891): [remote-sync][post] sample origin=1 = [{id: 101, remoteId: e18affb38f030e3bc631457f0ff2ecaf041b0e150d0e87dd8a23c7bb068ca7c1, provider: json@patachina, uri: aves-remote://rid/e18affb38f030e3bc631457f0ff2ecaf041b0e150d0e87dd8a23c7bb068ca7c1, trashed: 0, dateModifiedMillis: 1773494703526}, {id: 100, remoteId: f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488, provider: json@patachina, uri: aves-remote://rid/f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488, trashed: 0, dateModifiedMillis: 1655647065000}, {id: 99, remoteId: 87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968, provider: json@patachina, uri: aves-remote://rid/87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968, trashed: 0, dateModifiedMillis: 1655647064000}] +I/flutter ( 2891): [remote-sync] completed in 3816ms, imported=101 +I/flutter ( 2891): [remote-sync] END (active=false) +D/OpenGLRenderer( 2891): --- Failed to create image decoder with message 'unimplemented' +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Loading, message: null} +I/WM-Processor( 2891): Moving WorkSpec (03037187-348b-4f75-8601-aab27a012776) to the foreground +D/WM-SystemFgDispatcher( 2891): Notifying with (id:1, workSpecId: 03037187-348b-4f75-8601-aab27a012776, notificationType :1) +I/flutter ( 2891): MediaStoreSource load 0:00:07.563084 save 6956 new entries +I/flutter ( 2891): SqfliteLocalMediaDb saveEntries inserting slice of [1, 6956] entries +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Loading, message: null} +I/WM-Processor( 2891): Moving WorkSpec (03037187-348b-4f75-8601-aab27a012776) to the foreground +D/WM-SystemFgDispatcher( 2891): Notifying with (id:1, workSpecId: 03037187-348b-4f75-8601-aab27a012776, notificationType :1) +I/flutter ( 2891): SqfliteLocalMediaDb saveEntries complete in 737ms for 6956 entries +I/flutter ( 2891): MediaStoreSource load 0:00:08.864527 analyze +I/flutter ( 2891): analyze 6956 entries, force=false, starting service=false +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=requestGarbageCollection arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Loading, message: null} +I/ault.aves.debug( 2891): Explicit concurrent copying GC freed 21MB AllocSpace bytes, 3(132KB) LOS objects, 73% free, 8648KB/32MB, paused 31us,24us total 24.653ms +I/WM-Processor( 2891): Moving WorkSpec (03037187-348b-4f75-8601-aab27a012776) to the foreground +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/WM-SystemFgDispatcher( 2891): Notifying with (id:1, workSpecId: 03037187-348b-4f75-8601-aab27a012776, notificationType :1) +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000020101, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2026-03-12-13-28-00-079_deckers.thibault.aves.debug.jpg, sizeBytes: 780252} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000019657, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2025-10-27-21-11-59-581_com.example.webauthn_flutter.jpg, sizeBytes: 184918} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000019251, path: /storage/emulated/0/DCIM/Camera/IMG_20250810_121828.jpg, sizeBytes: 6177515} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000019250, path: /storage/emulated/0/DCIM/Camera/IMG_20250810_121822.jpg, sizeBytes: 3773772} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000019249, path: /storage/emulated/0/DCIM/Camera/IMG_20250810_121817.jpg, sizeBytes: 4270621} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000018527, path: /storage/emulated/0/DCIM/Camera/IMG_20250204_104544.jpg, sizeBytes: 6799176} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000018526, path: /storage/emulated/0/DCIM/Camera/IMG_20250204_104528.jpg, sizeBytes: 4551647} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000018523, path: /storage/emulated/0/DCIM/Camera/IMG_20250129_080657.jpg, sizeBytes: 4161293} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000018486, path: /storage/emulated/0/DCIM/Camera/IMG_20250125_103858.jpg, sizeBytes: 4403217} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000018374, path: /storage/emulated/0/Pictures/IMG_0206.jpg, sizeBytes: 268463} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017561, path: /storage/emulated/0/DCIM/Camera/IMG_20230406_093739.jpg, sizeBytes: 4581800} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017199, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0023.jpg, sizeBytes: 100057} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017196, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0022.jpg, sizeBytes: 102459} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017192, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0021.jpg, sizeBytes: 150438} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017190, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-15-14-56-56-555_com.google.android.apps.docs-edit.jpg, sizeBytes: 289800} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017189, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-15-14-56-56-555_com.google.android.apps.docs.jpg, sizeBytes: 654556} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017176, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0019.jpg, sizeBytes: 254051} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017173, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0018.jpg, sizeBytes: 234955} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017168, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0017.jpg, sizeBytes: 417289} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017162, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0015.jpg, sizeBytes: 480560} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017165, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0016.jpg, sizeBytes: 365348} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017156, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0013.jpg, sizeBytes: 261621} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017159, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0014.jpg, sizeBytes: 343535} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017150, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0011.jpg, sizeBytes: 224870} +I/WM-Processor( 2891): Moving WorkSpec (03037187-348b-4f75-8601-aab27a012776) to the foreground +D/WM-SystemFgDispatcher( 2891): Notifying with (id:1, workSpecId: 03037187-348b-4f75-8601-aab27a012776, notificationType :1) +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017153, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0012.jpg, sizeBytes: 250785} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017147, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0010.jpg, sizeBytes: 250725} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017140, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0009.jpg, sizeBytes: 151431} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017137, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0008.jpg, sizeBytes: 280768} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017134, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0007.jpg, sizeBytes: 186948} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017131, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0006.jpg, sizeBytes: 643220} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017128, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0005.jpg, sizeBytes: 280447} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017121, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0004.jpg, sizeBytes: 169269} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017115, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0003.jpg, sizeBytes: 133330} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017112, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0002.jpg, sizeBytes: 167765} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017109, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0001.jpg, sizeBytes: 246704} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017099, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0000.jpg, sizeBytes: 121328} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017096, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0010.jpg, sizeBytes: 203460} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017087, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0008.jpg, sizeBytes: 56841} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017081, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0006.jpg, sizeBytes: 61761} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017084, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0007.jpg, sizeBytes: 56259} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017078, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0005.jpg, sizeBytes: 104603} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017072, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0004.jpg, sizeBytes: 149717} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017070, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0003.jpg, sizeBytes: 169100} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017068, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0002.jpg, sizeBytes: 113876} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 43/6956} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017065, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0001.jpg, sizeBytes: 67796} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017062, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0000.jpg, sizeBytes: 101131} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017052, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0004.jpg, sizeBytes: 194676} +I/WM-Processor( 2891): Moving WorkSpec (03037187-348b-4f75-8601-aab27a012776) to the foreground +D/WM-SystemFgDispatcher( 2891): Notifying with (id:1, workSpecId: 03037187-348b-4f75-8601-aab27a012776, notificationType :1) +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017049, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0003.jpg, sizeBytes: 310678} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017046, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0002.jpg, sizeBytes: 218853} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017044, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-13-12-08-26-323_com.miui.home.jpg, sizeBytes: 794984} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017041, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0000.jpg, sizeBytes: 39706} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017040, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-13-10-07-09-365_com.miui.home.jpg, sizeBytes: 807932} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017015, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230212-WA0005.jpg, sizeBytes: 615150} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017008, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230212-WA0004.jpg, sizeBytes: 115959} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017006, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-12-14-17-21-917_com.instagram.android.jpg, sizeBytes: 801141} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017003, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230212-WA0002.jpg, sizeBytes: 266459} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016999, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-12-08-21-46-596_com.whatsapp.jpg, sizeBytes: 876809} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016989, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0014.jpg, sizeBytes: 106154} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016973, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-18-05-12-024_com.google.android.gm.jpg, sizeBytes: 615455} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016971, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-17-33-02-236_com.whatsapp.jpg, sizeBytes: 828351} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016968, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0009.jpg, sizeBytes: 60850} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016965, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0008.jpg, sizeBytes: 74140} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016960, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-12-29-01-111_com.whatsapp.jpg, sizeBytes: 828986} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016958, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-12-28-39-912_com.whatsapp.jpg, sizeBytes: 724062} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016945, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0001.jpg, sizeBytes: 271535} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016942, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0000.jpg, sizeBytes: 126235} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016926, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0006.jpg, sizeBytes: 137403} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016924, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-10-17-31-10-634_com.google.android.googlequicksearchbox-edit.jpg, sizeBytes: 272112} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016922, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0004.jpg, sizeBytes: 129533} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016920, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-10-15-57-09-170_com.miui.home.jpg, sizeBytes: 625585} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016917, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0003.jpg, sizeBytes: 64094} +I/WM-Processor( 2891): Moving WorkSpec (03037187-348b-4f75-8601-aab27a012776) to the foreground +D/WM-SystemFgDispatcher( 2891): Notifying with (id:1, workSpecId: 03037187-348b-4f75-8601-aab27a012776, notificationType :1) +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016914, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0002.jpg, sizeBytes: 318779} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016911, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0001.jpg, sizeBytes: 42122} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016890, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0014.jpg, sizeBytes: 155891} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016876, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0011.jpg, sizeBytes: 192046} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016851, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0006.jpg, sizeBytes: 67535} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016812, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0010.jpg, sizeBytes: 371772} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016806, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0008.jpg, sizeBytes: 382274} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016809, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0009.jpg, sizeBytes: 439268} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016798, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0006.jpg, sizeBytes: 422064} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016795, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0005.jpg, sizeBytes: 338082} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016789, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0003.jpg, sizeBytes: 279930} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016792, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0004.jpg, sizeBytes: 190775} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016786, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0002.jpg, sizeBytes: 289841} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016778, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0000.jpg, sizeBytes: 409315} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016765, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230207-WA0001.jpg, sizeBytes: 216388} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016762, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230207-WA0000.jpg, sizeBytes: 213350} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016738, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-07-16-13-05-638_com.shazam.android.jpg, sizeBytes: 941691} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016707, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230206-WA0000.jpg, sizeBytes: 193385} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016692, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0032.jpg, sizeBytes: 215636} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016689, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0031.jpg, sizeBytes: 279947} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016686, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0030.jpg, sizeBytes: 331013} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016683, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0029.jpg, sizeBytes: 328680} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016680, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0028.jpg, sizeBytes: 337417} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor( 2891): Moving WorkSpec (03037187-348b-4f75-8601-aab27a012776) to the foreground +D/WM-SystemFgDispatcher( 2891): Notifying with (id:1, workSpecId: 03037187-348b-4f75-8601-aab27a012776, notificationType :1) +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016677, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0027.jpg, sizeBytes: 294504} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016674, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0026.jpg, sizeBytes: 358036} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016668, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0024.jpg, sizeBytes: 333838} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016671, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0025.jpg, sizeBytes: 347022} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016665, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0023.jpg, sizeBytes: 324751} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016659, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0021.jpg, sizeBytes: 240105} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016662, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0022.jpg, sizeBytes: 353403} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016656, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0020.jpg, sizeBytes: 382894} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016653, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0019.jpg, sizeBytes: 385053} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016650, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0018.jpg, sizeBytes: 398987} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016599, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0002.jpg, sizeBytes: 340368} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016646, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0017.jpg, sizeBytes: 330573} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016643, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0016.jpg, sizeBytes: 391092} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016640, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0015.jpg, sizeBytes: 354548} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016634, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0013.jpg, sizeBytes: 386698} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016637, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0014.jpg, sizeBytes: 370078} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016628, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0011.jpg, sizeBytes: 370664} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016631, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0012.jpg, sizeBytes: 280670} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016622, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0009.jpg, sizeBytes: 318984} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016625, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0010.jpg, sizeBytes: 302076} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016619, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0008.jpg, sizeBytes: 339385} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016613, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0006.jpg, sizeBytes: 341430} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016616, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0007.jpg, sizeBytes: 348511} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016610, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0005.jpg, sizeBytes: 351561} +I/WM-Processor( 2891): Moving WorkSpec (03037187-348b-4f75-8601-aab27a012776) to the foreground +D/WM-SystemFgDispatcher( 2891): Notifying with (id:1, workSpecId: 03037187-348b-4f75-8601-aab27a012776, notificationType :1) +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016607, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0004.jpg, sizeBytes: 361860} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016596, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0001.jpg, sizeBytes: 115084} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016586, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-49-15-733_com.android.chrome.jpg, sizeBytes: 621329} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016585, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-48-21-380_com.android.chrome.jpg, sizeBytes: 746568} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016584, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-48-15-501_com.android.chrome.jpg, sizeBytes: 618906} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 123/6956} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016581, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-15-21-802_com.google.android.googlequicksearchbox.jpg, sizeBytes: 605874} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016572, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230204-WA0000.jpg, sizeBytes: 193943} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016545, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-03-19-56-29-319_com.whatsapp.jpg, sizeBytes: 836985} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016536, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0003.jpg, sizeBytes: 345525} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016539, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0004.jpg, sizeBytes: 501543} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016533, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0002.jpg, sizeBytes: 591603} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016527, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0001.jpg, sizeBytes: 143731} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016524, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0000.jpg, sizeBytes: 85831} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016513, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230202-WA0004.jpg, sizeBytes: 136481} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016511, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-02-18-13-19-852_ch.publisheria.bring.jpg, sizeBytes: 496941} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016505, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-02-16-34-54-238_com.google.android.googlequicksearchbox-edit.jpg, sizeBytes: 588438} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016497, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230202-WA0000.jpg, sizeBytes: 430669} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016477, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230201-WA0003.jpg, sizeBytes: 395349} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016474, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230201-WA0002.jpg, sizeBytes: 605187} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016470, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230201-WA0000.jpg, sizeBytes: 197092} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016454, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230131-WA0006.jpg, sizeBytes: 260899} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016451, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230131-WA0005.jpg, sizeBytes: 228335} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016449, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-12-21-22-297_com.momondo.flightsearch.jpg, sizeBytes: 557143} +I/WM-Processor( 2891): Moving WorkSpec (03037187-348b-4f75-8601-aab27a012776) to the foreground +D/WM-SystemFgDispatcher( 2891): Notifying with (id:1, workSpecId: 03037187-348b-4f75-8601-aab27a012776, notificationType :1) +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016447, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-12-10-40-642_com.momondo.flightsearch.jpg, sizeBytes: 563187} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016446, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-12-10-30-976_com.momondo.flightsearch.jpg, sizeBytes: 562512} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016444, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-10-54-37-729_com.google.android.gm.jpg, sizeBytes: 616113} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016430, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0007.jpg, sizeBytes: 224338} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016412, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0005.jpg, sizeBytes: 135044} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016409, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0004.jpg, sizeBytes: 38680} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016402, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-30-12-01-39-334_com.google.android.gm.jpg, sizeBytes: 329317} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016399, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0000.jpg, sizeBytes: 307208} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016388, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230129-WA0000.jpg, sizeBytes: 141167} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016361, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0014.jpg, sizeBytes: 65570} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016358, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0013.jpg, sizeBytes: 98011} +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null diff --git a/docs/android_metadata.csv b/docs/android_metadata.csv new file mode 100644 index 0000000..887de15 --- /dev/null +++ b/docs/android_metadata.csv @@ -0,0 +1,2 @@ +locale +it_IT diff --git a/docs/before.csv b/docs/before.csv new file mode 100644 index 0000000..a18037e --- /dev/null +++ b/docs/before.csv @@ -0,0 +1,102 @@ +id,remoteId,uri,provider,trashed,sourceMimeType,sizeBytes,remoteWidth,remoteHeight,remoteRotation,dateModifiedMillis +1,b3cda38a2fdee7ba9bdd2ea07d936b2fa5361baa21be2b2c29f1ad8ebcc4c31e,aves-remote://rid/b3cda38a2fdee7ba9bdd2ea07d936b2fa5361baa21be2b2c29f1ad8ebcc4c31e,json@patachina,0,image/jpeg,3758888,4032,3024,0,1503481740000 +2,09ef919ff2a105ad75d2e7631b9c02228c1784df5048c98276fd379f1533360b,aves-remote://rid/09ef919ff2a105ad75d2e7631b9c02228c1784df5048c98276fd379f1533360b,json@patachina,0,image/jpeg,3984165,4032,3024,0,1503493700000 +3,dba1de0e187650e62118279beb2d83e8759a6d4fb8a5412a6a18cdc4e01a33d7,aves-remote://rid/dba1de0e187650e62118279beb2d83e8759a6d4fb8a5412a6a18cdc4e01a33d7,json@patachina,0,image/jpeg,4338120,5326,3950,0,1503496121000 +4,751d8a15766bf2686bc87e60b33b4a8c38befe454428e6a5a82b00f26026c0e0,aves-remote://rid/751d8a15766bf2686bc87e60b33b4a8c38befe454428e6a5a82b00f26026c0e0,json@patachina,0,image/jpeg,3159006,4032,3024,0,1503496785000 +5,73dfd75dd639da9c7c0d4a6244f189a833d543bfdd4059b06f9f98e49f83c937,aves-remote://rid/73dfd75dd639da9c7c0d4a6244f189a833d543bfdd4059b06f9f98e49f83c937,json@patachina,0,image/jpeg,3338305,4032,3024,0,1503496787000 +6,f32173d43d16b47eda3e7a32257ec956287d60b0516a5f6e46a8d1d433f53fd8,aves-remote://rid/f32173d43d16b47eda3e7a32257ec956287d60b0516a5f6e46a8d1d433f53fd8,json@patachina,0,image/jpeg,2815021,4032,3024,0,1503496997000 +7,90c0a0932fdfa3eefb64156dec5b366c4af5245def4cc619d8eee29ca72cd7fe,aves-remote://rid/90c0a0932fdfa3eefb64156dec5b366c4af5245def4cc619d8eee29ca72cd7fe,json@patachina,0,image/jpeg,3207260,4032,3024,0,1503497854000 +8,4d74430aa1fbc45154ad4e8bf43bff334065ebd2757367806d4b8c165c9a7935,aves-remote://rid/4d74430aa1fbc45154ad4e8bf43bff334065ebd2757367806d4b8c165c9a7935,json@patachina,0,image/jpeg,2674913,4032,3024,0,1503497873000 +9,1955c91d411219c131c210b97fe38eb78df83be6ca12cdc845b952bcb78abc6f,aves-remote://rid/1955c91d411219c131c210b97fe38eb78df83be6ca12cdc845b952bcb78abc6f,json@patachina,0,image/jpeg,2788605,4032,3024,0,1503498970000 +10,14616f6446b0ffc01895f24db1656fa0b7a33da3b9e8c8e24065647faa2138f2,aves-remote://rid/14616f6446b0ffc01895f24db1656fa0b7a33da3b9e8c8e24065647faa2138f2,json@patachina,0,image/jpeg,3447883,4032,3024,90,1503504834000 +11,7668b4a6cf960b548a0bd1480444a3a039a4ca59d16656d2a1a3ca80a11eaa41,aves-remote://rid/7668b4a6cf960b548a0bd1480444a3a039a4ca59d16656d2a1a3ca80a11eaa41,json@patachina,0,image/jpeg,3513469,4032,3024,0,1503505103000 +12,4a10ae72b84c6e205c8295dc1f94b5407d78f25576707fba0f3bb9093e70ce1c,aves-remote://rid/4a10ae72b84c6e205c8295dc1f94b5407d78f25576707fba0f3bb9093e70ce1c,json@patachina,0,image/jpeg,2353262,4032,3024,0,1503509034000 +13,490631b5d03e797f7ca50b5e42be1cdabafd54b20804b51d2c9565aef18de750,aves-remote://rid/490631b5d03e797f7ca50b5e42be1cdabafd54b20804b51d2c9565aef18de750,json@patachina,0,image/jpeg,2912549,4032,3024,90,1503510106000 +14,1a9759607a60387b7ff383fce2fce32f5e5aba91c0b0d3e09c1c2763c40334be,aves-remote://rid/1a9759607a60387b7ff383fce2fce32f5e5aba91c0b0d3e09c1c2763c40334be,json@patachina,0,image/jpeg,2351855,4032,3024,90,1503510129000 +15,486d095f85a006800b9d3760e2ef4ac7ba909d82ba1347800a273d99395962a3,aves-remote://rid/486d095f85a006800b9d3760e2ef4ac7ba909d82ba1347800a273d99395962a3,json@patachina,0,image/jpeg,1869483,4032,3024,0,1503512829000 +16,69eb91132640feeb561e94bb3258ca69c41e27ca711cb814c2ac33270599167a,aves-remote://rid/69eb91132640feeb561e94bb3258ca69c41e27ca711cb814c2ac33270599167a,json@patachina,0,image/jpeg,1800632,4032,3024,90,1503512842000 +17,1da97cbc6e7914cbd33e4dbd51729cd45f1c77116c1f5be9531adeb6424eb6e2,aves-remote://rid/1da97cbc6e7914cbd33e4dbd51729cd45f1c77116c1f5be9531adeb6424eb6e2,json@patachina,0,image/jpeg,1643315,4032,3024,90,1503514391000 +18,7fbc8546424236f94107681a69ed37fa94159377cf378a44f9d0e907a2afd31a,aves-remote://rid/7fbc8546424236f94107681a69ed37fa94159377cf378a44f9d0e907a2afd31a,json@patachina,0,image/jpeg,1450013,4032,3024,90,1503514403000 +19,35772196ab28b9fd957199f81b267c9b99097055bfdcf1749e0c772241681cac,aves-remote://rid/35772196ab28b9fd957199f81b267c9b99097055bfdcf1749e0c772241681cac,json@patachina,0,image/jpeg,1606095,4032,3024,90,1503514433000 +20,48b26b6f9aaf835dd90e6098194dedfbee75b85c20429d939188e70873dd4274,aves-remote://rid/48b26b6f9aaf835dd90e6098194dedfbee75b85c20429d939188e70873dd4274,json@patachina,0,image/jpeg,1839090,4032,3024,90,1503518935000 +21,10ca45bc5aab42b5ba08da7d6a15d7f942478ca5e052f89054097c93d3dd6134,aves-remote://rid/10ca45bc5aab42b5ba08da7d6a15d7f942478ca5e052f89054097c93d3dd6134,json@patachina,0,image/jpeg,2013689,4032,3024,90,1503519976000 +22,c6b58236822fab393b8793af2991115182afaf13b26a27394c4d5d6a799d0969,aves-remote://rid/c6b58236822fab393b8793af2991115182afaf13b26a27394c4d5d6a799d0969,json@patachina,0,image/jpeg,1557955,3724,2096,90,1773490241586 +23,1d4945502b8686c4f4dc3ea94bfb37db7587d505e6c411bdf11976402c000e90,aves-remote://rid/1d4945502b8686c4f4dc3ea94bfb37db7587d505e6c411bdf11976402c000e90,json@patachina,0,image/jpeg,2667599,4032,3024,0,1503563815000 +24,bf2f60a20771c3647d605a7cc192b95a7e078b7c6530ad30462ee6a2794c9df0,aves-remote://rid/bf2f60a20771c3647d605a7cc192b95a7e078b7c6530ad30462ee6a2794c9df0,json@patachina,0,image/jpeg,2698118,4032,3024,0,1503563819000 +25,7d753539885cd882a1fdf04241eda6bfb8332ba1ed32bfc078dbadb3e5eb321f,aves-remote://rid/7d753539885cd882a1fdf04241eda6bfb8332ba1ed32bfc078dbadb3e5eb321f,json@patachina,0,image/jpeg,2656457,4032,3024,0,1503563838000 +26,29eb6ed3cd8e3d85e0803d091291b75677e6de2702918a286047894e444d669b,aves-remote://rid/29eb6ed3cd8e3d85e0803d091291b75677e6de2702918a286047894e444d669b,json@patachina,0,image/jpeg,4654237,4032,3024,90,1503583782000 +27,ebaf024e4df7764c2c458484d6e6eef1ced76611dd70b84f82af46337ba13839,aves-remote://rid/ebaf024e4df7764c2c458484d6e6eef1ced76611dd70b84f82af46337ba13839,json@patachina,0,image/jpeg,3760564,4032,3024,0,1503584553000 +28,c782108a839231c6dda63924f0b855747f98a4f56d8e93390f70877d4a452db6,aves-remote://rid/c782108a839231c6dda63924f0b855747f98a4f56d8e93390f70877d4a452db6,json@patachina,0,image/jpeg,3627847,4032,3024,0,1503594928000 +29,f56db1595a3b822e1e5cc119c101904285dca3f3f1b8edbf0bfa42999583cc2f,aves-remote://rid/f56db1595a3b822e1e5cc119c101904285dca3f3f1b8edbf0bfa42999583cc2f,json@patachina,0,image/jpeg,1900418,4032,3024,90,1503605922000 +30,5d03b5d0866a5cce0b6a12b78173c1f77eef5b1e5bfc5a4fd8e2cfd1c53a2b8e,aves-remote://rid/5d03b5d0866a5cce0b6a12b78173c1f77eef5b1e5bfc5a4fd8e2cfd1c53a2b8e,json@patachina,0,image/jpeg,1944490,4032,3024,90,1503605929000 +31,dd715de9995fd11a23fee1df7c1561ea45bd215e765e9e93b2efc3f2ca59c39c,aves-remote://rid/dd715de9995fd11a23fee1df7c1561ea45bd215e765e9e93b2efc3f2ca59c39c,json@patachina,0,image/jpeg,2020943,4032,3024,90,1503606518000 +32,8e1a2d2abbd36803ec8670f56869ae723c4c8c8fcd5e634ada9f988c942df1b8,aves-remote://rid/8e1a2d2abbd36803ec8670f56869ae723c4c8c8fcd5e634ada9f988c942df1b8,json@patachina,0,image/jpeg,2632829,4032,3024,90,1503656054000 +33,46412728d6155abe53abfec76c97898aad60e36322a46f4a4da280fba8c7c0cc,aves-remote://rid/46412728d6155abe53abfec76c97898aad60e36322a46f4a4da280fba8c7c0cc,json@patachina,0,image/jpeg,3300375,4032,3024,0,1503656159000 +34,999cc0997f51584fef2627c5c9bd87d2f41cd9fe52d930fdc85f791c6adc328e,aves-remote://rid/999cc0997f51584fef2627c5c9bd87d2f41cd9fe52d930fdc85f791c6adc328e,json@patachina,0,image/jpeg,4461504,5532,3898,0,1503656554000 +35,7ed0d6366274f3cadfc4caa618847c9c6c250e6b55127367d4ad1e3ca8322436,aves-remote://rid/7ed0d6366274f3cadfc4caa618847c9c6c250e6b55127367d4ad1e3ca8322436,json@patachina,0,image/jpeg,4964535,5232,3872,270,1503656644000 +36,4025ea19107cf40d092576e4aaa122bdfb027dc90592a50dd6fa8131838dae69,aves-remote://rid/4025ea19107cf40d092576e4aaa122bdfb027dc90592a50dd6fa8131838dae69,json@patachina,0,image/jpeg,4837273,5300,3908,270,1503656673000 +37,d91b81a39d72056b2b7eb5bbf6058cf5b5df85cd5d9ca7e2a1bc7e9b897ebfb4,aves-remote://rid/d91b81a39d72056b2b7eb5bbf6058cf5b5df85cd5d9ca7e2a1bc7e9b897ebfb4,json@patachina,0,image/jpeg,1697485,4032,3024,0,1503656711000 +38,49a2098503bd07db18c869b17419352a0a2232389b3cad98cbb013ad42882600,aves-remote://rid/49a2098503bd07db18c869b17419352a0a2232389b3cad98cbb013ad42882600,json@patachina,0,image/jpeg,1680963,4032,3024,90,1503656725000 +39,a856fcea4cade1ed9c59dab96f180c06f18bc97a39654301ad623aed4a4979d7,aves-remote://rid/a856fcea4cade1ed9c59dab96f180c06f18bc97a39654301ad623aed4a4979d7,json@patachina,0,image/jpeg,1502040,3024,4032,,1503656771000 +40,fd3df96d42b300c66332b98ce7639a79ae07aa0cbadf6ebbd283901bcca510c6,aves-remote://rid/fd3df96d42b300c66332b98ce7639a79ae07aa0cbadf6ebbd283901bcca510c6,json@patachina,0,image/jpeg,1520788,4032,3024,90,1503656843000 +41,c8ada02d1e1b7155607e905de25546c0a079c39528fe6df0b601a9c7b5f5df93,aves-remote://rid/c8ada02d1e1b7155607e905de25546c0a079c39528fe6df0b601a9c7b5f5df93,json@patachina,0,image/jpeg,4954269,8178,3754,0,1503657571000 +42,7351a37b3092015b6dee6e2911581ce590043619497ca84240b71e5ee37a0d2d,aves-remote://rid/7351a37b3092015b6dee6e2911581ce590043619497ca84240b71e5ee37a0d2d,json@patachina,0,image/jpeg,2747267,4032,3024,90,1503666106000 +43,23852fb024f46c21667b30107942c40d57429b37c0df1549ab32004a739d792f,aves-remote://rid/23852fb024f46c21667b30107942c40d57429b37c0df1549ab32004a739d792f,json@patachina,0,image/jpeg,2808395,4032,3024,0,1503666149000 +44,0ed7a1b65e9181db517fc4b75dcb3c8f398b7c3cd880ebc6d345886d070dc843,aves-remote://rid/0ed7a1b65e9181db517fc4b75dcb3c8f398b7c3cd880ebc6d345886d070dc843,json@patachina,0,image/jpeg,3137643,4032,3024,0,1503666179000 +45,64ec16ebc0611619d7c397453119ffe1f80f211b7bc9c428f65f8d761c6aa61f,aves-remote://rid/64ec16ebc0611619d7c397453119ffe1f80f211b7bc9c428f65f8d761c6aa61f,json@patachina,0,image/jpeg,2929880,4032,3024,90,1503667517000 +46,8fa73c5ac88c878b12ec926377f54e4d01187d92cc150730c514284d34581b39,aves-remote://rid/8fa73c5ac88c878b12ec926377f54e4d01187d92cc150730c514284d34581b39,json@patachina,0,image/jpeg,2498451,4032,3024,90,1503667524000 +47,ddab26bedbe3287cb210d46a2397336f879655c99224f90f8da1646ee111fee8,aves-remote://rid/ddab26bedbe3287cb210d46a2397336f879655c99224f90f8da1646ee111fee8,json@patachina,0,image/jpeg,3020402,4032,3024,90,1503669348000 +48,a07cfd0dfca3d9377ea2f4fea5501c6403f90f4a42a5732bde8b5d31214a2a7a,aves-remote://rid/a07cfd0dfca3d9377ea2f4fea5501c6403f90f4a42a5732bde8b5d31214a2a7a,json@patachina,0,image/jpeg,2161605,4032,3024,90,1503671202000 +49,7a9382798ebaa67e80804165044390a2fded193ec5aa9753e75b62d9d54ce39a,aves-remote://rid/7a9382798ebaa67e80804165044390a2fded193ec5aa9753e75b62d9d54ce39a,json@patachina,0,image/jpeg,2913137,4032,3024,90,1503686951000 +50,9e8eb4959ed23f9dc3f8722bca1c5dd5a13ff7a6b95a0f0bf8df430d0e2ee9c3,aves-remote://rid/9e8eb4959ed23f9dc3f8722bca1c5dd5a13ff7a6b95a0f0bf8df430d0e2ee9c3,json@patachina,0,image/jpeg,3437757,4032,3024,90,1503686966000 +51,df20d33dc73c45e9832c4a83fa5e4fd625c58518dfab5e3465d55959539cf57a,aves-remote://rid/df20d33dc73c45e9832c4a83fa5e4fd625c58518dfab5e3465d55959539cf57a,json@patachina,0,image/jpeg,1668522,3724,2096,90,1773490241712 +52,f46da4f2e78a8428eda4ea3a0363878cd50dd1d4b3798e4c858a34a217cc53d6,aves-remote://rid/f46da4f2e78a8428eda4ea3a0363878cd50dd1d4b3798e4c858a34a217cc53d6,json@patachina,0,image/jpeg,1781263,3724,2096,90,1773490241720 +53,68c6d643cbe16143e9255bd3c84576e943b60412d506c090f4a7b93de3e9fd56,aves-remote://rid/68c6d643cbe16143e9255bd3c84576e943b60412d506c090f4a7b93de3e9fd56,json@patachina,0,image/jpeg,973684,3763,1657,,1503695558000 +54,6b4d4396b06a0513b53fa9d088c1a95bbfacb99ede015addb9e34ad973fd77f4,aves-remote://rid/6b4d4396b06a0513b53fa9d088c1a95bbfacb99ede015addb9e34ad973fd77f4,json@patachina,0,image/jpeg,1311890,3724,2096,0,1773490241733 +55,dc17f07d88bdd90f4e439911484a2a31f91acb15fcb1201115f16157eec70e66,aves-remote://rid/dc17f07d88bdd90f4e439911484a2a31f91acb15fcb1201115f16157eec70e66,json@patachina,0,image/jpeg,4612510,7506,3870,0,1503734480000 +56,4f041976518502b14f0520489ac932cfd3f9e4e9226e38b09b483327b34ad3bf,aves-remote://rid/4f041976518502b14f0520489ac932cfd3f9e4e9226e38b09b483327b34ad3bf,json@patachina,0,image/jpeg,4484747,5624,3958,0,1503734933000 +57,4a125c9271159191ab923bc14fb5398d08aef6ee5ba313a2f6b1599a52e4e0cc,aves-remote://rid/4a125c9271159191ab923bc14fb5398d08aef6ee5ba313a2f6b1599a52e4e0cc,json@patachina,0,image/jpeg,2873334,8968,1560,,1503743055000 +58,0bd35f8c46fa2ec4979d977d13bab6b8e0dc18365a0f25a7d87d81c5336c0378,aves-remote://rid/0bd35f8c46fa2ec4979d977d13bab6b8e0dc18365a0f25a7d87d81c5336c0378,json@patachina,0,image/jpeg,2168733,4032,3024,90,1503749114000 +59,4065f86b9af59235a5727abaaccb54a9a91fa585b464da2c592db5ed300d8836,aves-remote://rid/4065f86b9af59235a5727abaaccb54a9a91fa585b464da2c592db5ed300d8836,json@patachina,0,image/jpeg,1891230,4032,3024,90,1503749116000 +60,76ea19c9ae626658b75942ad3fb9cf4caae2b2a4b845103dac42c006a3af3984,aves-remote://rid/76ea19c9ae626658b75942ad3fb9cf4caae2b2a4b845103dac42c006a3af3984,json@patachina,0,image/jpeg,1766923,4032,3024,90,1503749303000 +61,065a80861c5452dd07586b786aad63e9d74a822cbf10913201658c54023e63cd,aves-remote://rid/065a80861c5452dd07586b786aad63e9d74a822cbf10913201658c54023e63cd,json@patachina,0,image/jpeg,2935053,4032,3024,0,1503767620000 +62,e30a1427708cfc8d63a66d369781b15ac6a07b43e13550b1a7625003914503ed,aves-remote://rid/e30a1427708cfc8d63a66d369781b15ac6a07b43e13550b1a7625003914503ed,json@patachina,0,image/jpeg,1852261,4032,3024,0,1503767749000 +63,c584bb41bc73b6b452c6964622ea7e4ccfddc741ed6e1d3757ed6015b59cf65f,aves-remote://rid/c584bb41bc73b6b452c6964622ea7e4ccfddc741ed6e1d3757ed6015b59cf65f,json@patachina,0,image/jpeg,1936144,4032,3024,0,1503767754000 +64,77b822134129d751070d73441dda90996dab21186c50be2ce79064e22bba94bd,aves-remote://rid/77b822134129d751070d73441dda90996dab21186c50be2ce79064e22bba94bd,json@patachina,0,image/jpeg,1843400,4032,3024,0,1503768183000 +65,be834d7663441134af0e4fc6619b1c3ae06b5ce0856beac123ac6972c5b270d7,aves-remote://rid/be834d7663441134af0e4fc6619b1c3ae06b5ce0856beac123ac6972c5b270d7,json@patachina,0,image/jpeg,4221357,4658,3974,0,1503769227000 +66,6750d21dec9eb3436ce6c821b40e344ef0fb280e43081cbc5e584310711417b7,aves-remote://rid/6750d21dec9eb3436ce6c821b40e344ef0fb280e43081cbc5e584310711417b7,json@patachina,0,image/jpeg,4179034,7305,2311,,1503769265000 +67,ea8ae33ca15f21e84d75f5b853a88ca78d722b4f461478bdccfa9c059f6b69db,aves-remote://rid/ea8ae33ca15f21e84d75f5b853a88ca78d722b4f461478bdccfa9c059f6b69db,json@patachina,0,image/jpeg,1750381,1680,4030,0,1503769375000 +68,3be962052af0da265a1bd9cb69ed6868798f47343a2e1dc774c77568c20139bf,aves-remote://rid/3be962052af0da265a1bd9cb69ed6868798f47343a2e1dc774c77568c20139bf,json@patachina,0,image/jpeg,2046548,4427,2389,,1503769385000 +69,3041f044b86b8888937659a1c691db34f0c8b52b6dec6a7db023c18e9cd24722,aves-remote://rid/3041f044b86b8888937659a1c691db34f0c8b52b6dec6a7db023c18e9cd24722,json@patachina,0,image/jpeg,4328104,6438,3900,,1503769503000 +70,50c16b24a37a6d76da00bc64b0a6f96ae858ba386dd5750ce0187a7cc3402027,aves-remote://rid/50c16b24a37a6d76da00bc64b0a6f96ae858ba386dd5750ce0187a7cc3402027,json@patachina,0,image/jpeg,703594,3946,2960,,1503779894000 +71,df606e3b1a55f9f2c90e333bd113a0af2beb83a319aac9619b5b9cd729b13b0e,aves-remote://rid/df606e3b1a55f9f2c90e333bd113a0af2beb83a319aac9619b5b9cd729b13b0e,json@patachina,0,image/jpeg,468928,3745,1941,,1503779936000 +72,2454c04dd9067d2b5288dcca99c5c3eac85660779a97d6165a08ca7c37481070,aves-remote://rid/2454c04dd9067d2b5288dcca99c5c3eac85660779a97d6165a08ca7c37481070,json@patachina,0,image/jpeg,2097953,4032,3024,90,1503822184000 +73,bc0155f7235dc0ede6921f43debb8ebe8ca44fb1db57447d26a63f6904f38bba,aves-remote://rid/bc0155f7235dc0ede6921f43debb8ebe8ca44fb1db57447d26a63f6904f38bba,json@patachina,0,image/jpeg,2489649,4032,3024,0,1503823090000 +74,a99f57f0bea2cb9b6caf3d0e60c3719e379d3d5bc2bbe37d1044c764214dd0b9,aves-remote://rid/a99f57f0bea2cb9b6caf3d0e60c3719e379d3d5bc2bbe37d1044c764214dd0b9,json@patachina,0,image/jpeg,3009764,4032,3024,0,1503830851000 +75,915492fbf9fc1769985e4f5684d42728b5ee63092b148b887c6d07d1fb66fe8f,aves-remote://rid/915492fbf9fc1769985e4f5684d42728b5ee63092b148b887c6d07d1fb66fe8f,json@patachina,0,image/jpeg,2757600,4032,3024,0,1503830943000 +76,0c2e99aa7c89c4a124019241d0131a03877d49bef2e409be8421b93d0f15ed82,aves-remote://rid/0c2e99aa7c89c4a124019241d0131a03877d49bef2e409be8421b93d0f15ed82,json@patachina,0,image/jpeg,3442902,4032,3024,0,1503830950000 +77,a80cdc2fe8bfed0bddc25931f17f5f263ea273cca34558d9e190effa5fcc7bc9,aves-remote://rid/a80cdc2fe8bfed0bddc25931f17f5f263ea273cca34558d9e190effa5fcc7bc9,json@patachina,0,image/jpeg,3891743,4032,3024,90,1503833355000 +78,308808d70076dd738c2d8d7703332dd000fb5592084ff292e2e7d2e43cac75df,aves-remote://rid/308808d70076dd738c2d8d7703332dd000fb5592084ff292e2e7d2e43cac75df,json@patachina,0,image/jpeg,1551495,3162,1743,,1503844208000 +79,20bdd8d0c71b2e1b6a55586e2def4db18152371efbd966b98f055ba340bf471a,aves-remote://rid/20bdd8d0c71b2e1b6a55586e2def4db18152371efbd966b98f055ba340bf471a,json@patachina,0,image/jpeg,1257412,4032,3024,90,1503857624000 +80,37df228c1e983e94e3abea8800b04660e647034fca4948ef45ed6ec69d468687,aves-remote://rid/37df228c1e983e94e3abea8800b04660e647034fca4948ef45ed6ec69d468687,json@patachina,0,image/jpeg,2405533,4032,3024,90,1503862949000 +81,1a4313d5086018efcd689dbca06040d99a75f7b331798b0fa2ced0d25dea95b7,aves-remote://rid/1a4313d5086018efcd689dbca06040d99a75f7b331798b0fa2ced0d25dea95b7,json@patachina,0,image/jpeg,2066043,4032,3024,90,1503909783000 +82,6ab20a650288559438d81881ade44773873472c54d4d8cbbe69aaf2337c9d92b,aves-remote://rid/6ab20a650288559438d81881ade44773873472c54d4d8cbbe69aaf2337c9d92b,json@patachina,0,image/jpeg,4708675,4032,3024,90,1503916727000 +83,6cf111099d98f97b09cf7a397d9ef6c849693e8273bf6026e0af0f257c0240bc,aves-remote://rid/6cf111099d98f97b09cf7a397d9ef6c849693e8273bf6026e0af0f257c0240bc,json@patachina,0,image/jpeg,4888844,4032,3024,90,1503916733000 +84,e830691975e126ad19891ea10585409a551791e8d0e8c6eda7e9d5e7878ce6a2,aves-remote://rid/e830691975e126ad19891ea10585409a551791e8d0e8c6eda7e9d5e7878ce6a2,json@patachina,0,image/jpeg,4413193,4032,3024,90,1503916750000 +85,9fabc411f90e2a1452f4880b21ee6cdfb14c1274ce8c7a9a23c30444f07b370b,aves-remote://rid/9fabc411f90e2a1452f4880b21ee6cdfb14c1274ce8c7a9a23c30444f07b370b,json@patachina,0,image/jpeg,3314673,3630,3790,270,1503916764000 +86,3846bf7e160007e43c6de5a612b3384ad4235276b7ac86284fd2a7e45a3b0a27,aves-remote://rid/3846bf7e160007e43c6de5a612b3384ad4235276b7ac86284fd2a7e45a3b0a27,json@patachina,0,image/jpeg,1745323,4032,3024,0,1504001722000 +87,b4fec8470cd605882c09ec97558d3a737d25a43488adfb903c3573f8b1fb5ebc,aves-remote://rid/b4fec8470cd605882c09ec97558d3a737d25a43488adfb903c3573f8b1fb5ebc,json@patachina,0,image/jpeg,1242828,4032,3024,0,1504005466000 +88,b864196e118aa2b40142438c2e28df587c53fb27e6d4e24fa9b98a00cecccdc9,aves-remote://rid/b864196e118aa2b40142438c2e28df587c53fb27e6d4e24fa9b98a00cecccdc9,json@patachina,0,image/jpeg,3347118,4032,3024,0,1504005486000 +89,b1f9d25d6d7217c01a3a67f59176d54ce73b1bb626a687d1447a5354e5cad020,aves-remote://rid/b1f9d25d6d7217c01a3a67f59176d54ce73b1bb626a687d1447a5354e5cad020,json@patachina,0,image/jpeg,4832084,4032,3024,90,1504006676000 +90,e9549aa2bb21ad70ff35ad1626cf15f6cb62a321e25e3e7ab832bd9e7430e186,aves-remote://rid/e9549aa2bb21ad70ff35ad1626cf15f6cb62a321e25e3e7ab832bd9e7430e186,json@patachina,0,image/jpeg,4210606,4032,3024,90,1504006732000 +91,b8013a96d80b1a6c3b39384f0910ff1f4507fcbf6936b90472d066f75772e751,aves-remote://rid/b8013a96d80b1a6c3b39384f0910ff1f4507fcbf6936b90472d066f75772e751,json@patachina,0,image/jpeg,4047020,4032,3024,0,1504006811000 +92,d32b08d40cee22365e0193a7372cf85e997501d1e5e6d67b80aaddd569ee7030,aves-remote://rid/d32b08d40cee22365e0193a7372cf85e997501d1e5e6d67b80aaddd569ee7030,json@patachina,0,image/jpeg,3155785,4032,3024,90,1504006896000 +93,0402bf83d35731c94314d6333cea4350e725209307a45fe6fe548ae04bf2e763,aves-remote://rid/0402bf83d35731c94314d6333cea4350e725209307a45fe6fe548ae04bf2e763,json@patachina,0,image/jpeg,4551844,4032,3024,90,1504007112000 +94,10e4a1c655829f11ad8f465cfc1e105e7430b9c0bf36f5589624cd5932c50457,aves-remote://rid/10e4a1c655829f11ad8f465cfc1e105e7430b9c0bf36f5589624cd5932c50457,json@patachina,0,image/jpeg,4772193,4032,3024,90,1504007140000 +95,a570da3c838dfd9f3035b658b8d7e873baf6399cf5d39674b37fb4ae4961879e,aves-remote://rid/a570da3c838dfd9f3035b658b8d7e873baf6399cf5d39674b37fb4ae4961879e,json@patachina,0,image/jpeg,1840010,4000,2250,90,1622628398000 +96,5c59ae9398c232eaa2f9e472df32691eb55b335bf07eb4e873d374b4144dbc72,aves-remote://rid/5c59ae9398c232eaa2f9e472df32691eb55b335bf07eb4e873d374b4144dbc72,json@patachina,0,image/jpeg,1756574,4000,2250,0,1622655546000 +97,283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1,aves-remote://rid/283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1,json@patachina,0,image/jpeg,4410362,2592,4608,0,1655646943000 +98,11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1,aves-remote://rid/11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1,json@patachina,0,image/jpeg,4473038,2592,4608,0,1655647001000 +99,87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968,aves-remote://rid/87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968,json@patachina,0,image/jpeg,4782460,2592,4608,0,1655647064000 +100,f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488,aves-remote://rid/f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488,json@patachina,0,image/jpeg,4749840,2592,4608,0,1655647065000 +101,e18affb38f030e3bc631457f0ff2ecaf041b0e150d0e87dd8a23c7bb068ca7c1,aves-remote://rid/e18affb38f030e3bc631457f0ff2ecaf041b0e150d0e87dd8a23c7bb068ca7c1,json@patachina,0,video/mp4,12273606,1920,1080,,1773490244080 diff --git a/docs/covers.csv b/docs/covers.csv new file mode 100644 index 0000000..e69de29 diff --git a/docs/dateTaken.csv b/docs/dateTaken.csv new file mode 100644 index 0000000..67b8cb9 --- /dev/null +++ b/docs/dateTaken.csv @@ -0,0 +1,2401 @@ +id,dateMillis +6959,1754821108570 +6960,1754821103064 +6961,1754821097513 +6962,1738662344594 +6963,1738662328825 +6964,1738134417709 +6965,1737797938693 +6967,1680766659114 +7142,1674564275927 +7323,1672502012254 +7338,1672393116174 +7516,1670015518328 +7517,1670014520473 +7593,1668765580899 +7629,1668074178288 +7729,1667146761232 +7777,1666866810365 +7778,1666866595250 +7779,1666866568366 +7832,1666009790669 +7839,1665766999000 +7847,1665754391370 +7848,1665754366919 +7850,1665750982848 +7851,1665750981761 +7852,1665750979400 +7853,1665748983200 +7854,1665748983903 +7855,1665748979210 +7856,1665748972758 +7857,1665745332628 +7858,1665745316548 +7859,1665745287792 +7860,1665745283442 +7861,1665744735460 +7862,1665744731328 +7863,1665744722565 +7864,1665744691209 +7865,1665742791521 +7866,1665742702613 +7867,1665742296560 +7868,1665738559480 +7869,1665738357330 +7870,1665738349808 +7871,1665738326458 +7872,1665737979659 +7873,1665737973400 +7874,1665737971105 +7875,1665737337575 +7876,1665737334996 +7877,1665737305279 +7878,1665737299909 +7879,1665737290479 +7880,1665737251000 +7881,1665737244000 +7882,1665737173772 +7883,1665736422313 +7884,1665736409583 +7885,1665736398426 +7886,1665736017619 +7887,1665734414768 +7888,1665732449888 +7891,1665677906907 +7911,1665307357686 +7912,1665307354520 +7915,1665303566000 +7916,1665303551000 +7917,1665303546000 +7918,1665303533000 +7919,1665254655335 +7920,1665254597333 +7921,1665254491374 +7922,1665254485600 +7923,1665254425172 +7924,1665254415984 +7925,1665254410315 +7926,1665254355000 +7927,1665254290650 +7928,1665254275832 +7929,1665254235340 +7930,1665254233333 +7931,1665254178853 +7932,1665253982260 +7933,1665253977727 +7934,1665253916615 +7935,1665253893279 +7936,1665253889724 +7937,1665253788435 +7938,1665253775567 +7939,1665253764710 +7940,1665253744975 +7941,1665253739671 +7942,1665253715502 +7943,1665253065830 +7944,1665253035148 +7945,1665253028485 +7946,1665253026151 +7947,1665252249627 +7948,1665252220992 +7949,1665252216400 +7950,1665251539710 +7951,1665251016347 +7952,1665250488530 +7953,1665250453830 +7954,1665250407795 +7955,1665250369720 +7956,1665250331424 +7957,1665249691239 +7958,1665249691239 +7959,1665249691239 +7960,1665249657649 +7961,1665249603872 +7962,1665249431975 +7963,1665249418704 +7964,1665249412857 +7965,1665249344394 +7966,1665249338978 +7967,1665249257790 +7968,1665249252815 +7969,1665249248150 +7970,1665249083000 +7971,1665249076716 +7972,1665238114125 +7976,1665237323762 +7977,1665237319370 +7978,1665237311409 +7980,1665237202990 +7981,1665237192623 +7982,1665237185699 +7983,1665237181168 +7984,1665237175965 +7985,1665237168198 +7989,1665236827120 +7990,1665236813284 +7991,1665236799558 +7992,1665236681485 +7993,1665236675228 +7994,1665236526267 +7995,1665236513552 +7996,1665236508368 +7997,1665236364128 +7998,1665236349450 +8000,1665227572000 +8003,1665124961300 +8029,1664901399124 +8030,1664901343580 +8031,1664899987914 +8032,1664897360508 +8037,1664729815600 +8077,1664611819000 +8078,1664611743000 +8079,1664611733000 +8084,1664541571808 +8085,1664541541670 +8086,1664541507507 +8087,1664541501912 +8088,1664541497730 +8089,1664541454937 +8090,1664538350338 +8091,1664519901754 +8092,1664519901754 +8107,1664299755870 +8108,1664295588198 +8109,1664291916484 +8110,1664291916484 +8111,1664291869960 +8112,1664291737298 +8113,1664291737298 +8115,1664282583000 +8117,1664280748517 +8118,1664280710591 +8119,1664278712601 +8120,1664278071356 +8121,1664277914000 +8122,1664277734000 +8123,1664277729000 +8124,1664277718000 +8126,1664202378000 +8129,1664088953912 +8130,1663782713270 +8137,1664088985340 +8138,1664088844575 +8139,1664088478910 +8144,1663954205593 +8145,1663954200302 +8146,1663954162787 +8147,1663954154347 +8148,1663954135140 +8149,1663954114150 +8150,1663782713270 +8151,1663692158117 +8160,1663510096325 +8161,1663510094906 +8163,1663506556660 +8164,1663506552241 +8165,1663493224198 +8166,1663493221297 +8167,1663493203271 +8168,1663400739372 +8169,1663400732789 +8188,1662884044582 +8189,1662883630158 +8190,1662883626590 +8192,1662880605400 +8193,1662880601201 +8194,1662880525975 +8195,1662880518259 +8196,1662880509536 +8197,1662880506264 +8198,1662880502374 +8284,1662284003511 +8288,1662103170602 +8292,1661884562298 +8308,1660472693947 +8310,1660388902000 +8311,1660388891741 +8312,1660386406229 +8313,1660386395000 +8314,1660385484426 +8315,1660384853376 +8316,1660384309000 +8317,1660382623000 +8318,1660382623000 +8319,1660382599620 +8320,1660382484250 +8322,1660378554477 +8323,1660378554477 +8324,1660377258000 +8325,1660372774836 +8326,1660372429808 +8328,1660232348830 +8330,1660066176993 +8334,1659894932253 +8335,1659890831860 +8339,1659738030000 +8340,1659738030000 +8341,1659809349126 +8342,1659809343333 +8343,1659738030000 +8344,1659738030000 +8345,1659738030000 +8346,1659738030000 +8347,1659738030000 +8348,1659738030000 +8349,1659738030000 +8350,1659738030000 +8351,1659738030000 +8352,1659738030000 +8353,1659738030000 +8354,1659738030000 +8355,1659738030000 +8356,1659738030000 +8357,1659738030000 +8358,1659738030000 +8359,1659738030000 +8360,1659738030000 +8361,1659738030000 +8362,1659738030000 +8363,1659738030000 +8364,1659738030000 +8365,1659738030000 +8366,1659738030000 +8367,1659738030000 +8368,1659738030000 +8369,1659738030000 +8370,1659738030000 +8371,1659738030000 +8372,1659738030000 +8373,1659738030000 +8374,1659738030000 +8375,1659738030000 +8410,1659182887405 +8411,1659182689570 +8433,1658946830782 +8434,1658946831869 +8435,1658946779508 +8436,1658944691821 +8437,1658944679310 +8438,1658944624611 +8448,1658745264572 +8461,1658561780431 +8462,1658561777778 +8463,1658561763906 +8464,1658561755733 +8465,1658561751905 +8472,1658419215195 +8475,1658403892963 +8511,1657824129684 +8512,1657824123663 +8513,1657817770190 +8518,1657795843669 +8519,1657794609946 +8525,1657729625419 +8536,1657462047609 +8537,1657459617100 +8592,1656840604731 +8593,1656788729210 +8594,1656788575463 +8595,1656096489000 +8597,1656753557000 +8598,1656753557281 +8600,1656753557281 +8601,1656753091926 +8608,1656080514000 +8609,1656080514000 +8610,1656080514000 +8611,1656080514000 +8612,1656080612091 +8655,1655062886000 +8656,1655062886074 +8657,1655062886074 +8658,1655062886000 +8659,1655062886000 +8660,1655062886074 +8668,1655384521478 +8672,1655317546979 +8673,1655313857106 +8674,1655313850750 +8675,1655313756274 +8676,1655313753267 +8727,1655034387970 +8731,1655029847186 +8732,1655027335318 +8741,1654890969285 +8742,1654873245523 +8743,1654872868408 +8745,1654855494554 +8746,1654852453485 +8747,1654852440563 +8748,1654852271683 +8749,1654852037586 +8750,1654851967350 +8751,1654791527798 +8752,1654791477676 +8753,1654791400755 +8763,1654693697812 +8773,1654606140540 +8774,1654606095589 +8775,1653654293717 +8776,1654268338189 +8777,1654016706807 +8778,1654015611523 +8795,1653830830747 +8796,1653830757867 +8797,1653830750868 +8802,1653827553655 +8803,1653820008265 +8806,1653654325363 +8807,1653654320524 +8808,1653654293717 +8810,1640524806000 +8811,1640524794000 +8814,1653478191896 +8858,1653052019700 +8860,1653050412303 +8861,1653049914700 +8863,1653045041767 +8864,1653044895613 +8867,1653037037300 +8868,1652976263512 +8869,1652976240230 +8870,1652976211416 +8871,1652976169730 +8872,1652976150866 +8873,1652976136916 +8885,1652939873816 +8890,1652890309166 +8891,1652890194354 +8892,1652890136838 +8893,1652890129378 +8894,1652890126467 +8932,1652724713160 +8938,1652625543274 +8939,1652625536444 +8940,1652625528640 +8941,1652625528969 +8948,1652461289122 +8949,1652437225093 +8950,1652437206164 +8951,1652437099476 +8952,1652437084999 +8963,1652335257149 +8964,1652335237792 +8968,1652205476417 +8969,1652014641558 +8970,1651839756000 +8991,1651171500410 +8996,1570479693000 +8997,1570479693000 +8998,1650533149158 +9044,1650127198300 +9075,1649504486965 +9076,1649502756734 +9077,1649501186339 +9082,1648825396021 +9085,1648821500222 +9086,1648820490162 +9087,1648819368340 +9088,1648819174623 +9089,1648818716750 +9090,1648813956298 +9091,1648813267934 +9092,1648812911189 +9093,1648809487292 +9094,1648807157882 +9095,1648803625522 +9096,1648802284822 +9097,1648800346966 +9099,1648294562699 +9100,1648294541209 +9101,1648294536842 +9102,1648294532565 +9103,1648294529490 +9104,1648246226610 +9105,1648246221942 +9106,1648239086830 +9107,1648239082635 +9108,1648224283643 +9109,1648224278909 +9115,1647713760549 +9128,1647240618255 +9129,1647240604998 +9156,1646260581979 +9157,1646260557236 +9158,1646064676829 +9159,1645707841998 +9160,1645707743304 +9161,1645707740935 +9162,1645707732892 +9163,1645706256213 +9164,1645706253174 +9165,1645705020913 +9166,1645705017321 +9167,1645704978738 +9168,1645704687296 +9169,1645616459934 +9170,1645616429254 +9176,1645612545249 +9177,1645612539464 +9178,1645529608477 +9179,1645529609600 +9180,1645529576573 +9182,1645526924132 +9183,1645526705359 +9184,1645526590537 +9185,1645526587100 +9186,1645526585167 +9187,1645526564982 +9188,1645526549379 +9189,1645522689934 +9190,1645522671360 +9191,1645517163206 +9192,1645517033874 +9197,1645462744948 +9198,1645462743429 +9199,1645462578986 +9200,1645462571219 +9201,1645462468460 +9210,1645453845132 +9211,1645452610992 +9212,1645439441614 +9213,1645439427787 +9214,1645439423354 +9215,1645439255126 +9216,1645439152436 +9217,1645439140268 +9218,1645439134697 +9219,1645439109742 +9220,1645439101311 +9221,1645439094366 +9223,1645433390587 +9224,1645433388724 +9225,1645433387620 +9226,1645433384257 +9227,1645433346297 +9228,1645433326469 +9229,1645433322706 +9230,1645383183112 +9232,1645379492194 +9233,1645379486446 +9234,1645379441576 +9235,1645379430632 +9236,1645379422609 +9237,1645379417725 +9238,1645379380967 +9239,1645379363563 +9240,1645379352354 +9243,1645361284260 +9244,1645031477932 +9266,1644766199709 +9267,1644766150220 +9269,1644765346542 +9274,1644763340495 +9275,1644763342452 +9276,1644760972748 +9291,1644746403659 +9292,1644746395710 +9295,1644741903168 +9296,1644741318276 +9306,1644683125536 +9307,1644680788926 +9308,1644680786523 +9309,1644680746285 +9316,1644680034387 +9317,1644680029755 +9318,1644679988117 +9319,1644679978587 +9320,1644679430737 +9321,1644679035833 +9322,1644679033333 +9323,1644677066966 +9324,1644676858125 +9325,1644676846195 +9326,1644676843332 +9327,1644676838731 +9328,1644676474903 +9329,1644676466920 +9330,1644676408867 +9331,1644676401154 +9332,1644676396751 +9333,1644676386474 +9334,1644675260725 +9335,1644675254701 +9337,1644673245409 +9338,1644673241975 +9339,1644673236114 +9340,1644673234650 +9341,1644673229423 +9342,1644673227351 +9343,1644673152781 +9344,1644673144835 +9345,1644673142901 +9346,1644672704206 +9347,1644672695180 +9365,1644666330239 +9366,1644666324545 +9367,1644662548792 +9368,1644660379981 +9370,1644532600433 +9371,1644532597128 +9372,1644532594535 +9373,1644532530561 +9374,1644324226509 +9380,1644092133150 +9381,1644092258146 +9382,1644092258146 +9383,1644092253339 +9384,1644092180833 +9385,1644092135779 +9386,1644092133150 +9387,1644092126760 +9388,1644092106817 +9389,1644092017761 +9390,1644061787186 +9391,1644061754425 +9392,1644055301345 +9393,1644055261141 +9394,1644055239413 +9395,1644055222590 +9396,1644053802798 +9397,1644053799226 +9398,1644053786272 +9417,1642694664658 +9422,1642333568256 +9438,1640591255506 +9439,1640439498687 +9443,1638443369887 +9450,1639926485130 +9451,1639926484328 +9452,1639926482897 +9453,1639926481497 +9454,1639926226525 +9455,1639926225356 +9456,1639926193543 +9457,1639926118176 +9458,1639926115942 +9459,1639925921497 +9460,1639925904130 +9461,1639925891947 +9469,1639917038932 +9491,1638889192547 +9492,1638888549142 +9493,1638888544347 +9494,1638888393934 +9495,1638888229141 +9496,1638888100112 +9497,1638884438600 +9498,1638884434422 +9499,1638878272281 +9500,1638878267931 +9501,1638878265101 +9502,1638878254660 +9503,1638875522455 +9504,1638867970177 +9505,1638821670200 +9506,1638821626355 +9513,1638781540829 +9514,1638786143511 +9520,1638803110520 +9521,1638800457749 +9522,1638800451311 +9523,1638799762364 +9524,1638799672934 +9525,1638799607758 +9526,1638799565348 +9527,1638799552420 +9528,1638799337267 +9529,1638799332355 +9530,1638799322584 +9531,1638799308998 +9532,1638799131182 +9533,1638798695795 +9534,1638798696186 +9535,1638798689195 +9536,1638796787567 +9537,1638796767113 +9538,1638796757359 +9539,1638796541488 +9540,1638796482471 +9541,1638796476208 +9542,1638788700654 +9543,1638788649745 +9544,1638787755450 +9545,1638787744963 +9546,1638787676394 +9547,1638787386586 +9548,1638782939486 +9549,1638781538132 +9550,1638781507478 +9551,1638781502679 +9552,1638781503781 +9553,1638781475450 +9554,1638781434403 +9555,1638781422369 +9556,1638734092431 +9557,1638728830902 +9558,1638728829458 +9559,1638728825690 +9560,1638728824366 +9564,1638707414646 +9565,1638443369887 +9569,1637837504987 +9605,1635796615150 +9606,1635796605393 +9607,1635794981436 +9612,1635775860898 +9697,1635696551297 +9698,1635696542888 +9699,1635694753149 +9700,1635694737508 +9701,1635694664731 +9702,1635687377158 +9703,1635687359069 +9704,1635686402248 +9705,1635677962863 +9706,1635677949398 +9707,1635676821858 +9708,1635674072942 +9709,1635619268072 +9761,1635604645361 +9762,1635604639025 +9763,1635604398408 +9764,1635604396491 +9765,1635599980863 +9766,1635599951579 +9770,1635273872234 +9774,1634881697578 +9776,1634798045284 +9777,1634752087492 +9778,1634666838575 +9779,1633975473140 +9789,1633858890015 +9790,1633779317035 +9795,1633246186297 +9796,1633245904748 +9797,1633245620071 +9798,1633245612087 +9799,1633244094594 +9800,1633241223302 +9804,1633176077524 +9807,1633098864346 +9810,1632851595442 +9811,1632851560450 +9812,1632848897666 +9813,1632848892351 +9814,1632848836403 +9815,1632848641872 +9816,1632848398429 +9817,1632848347141 +9818,1632848156207 +9819,1632847920634 +9821,1632675029711 +9822,1632675021031 +9831,1631971288323 +9832,1631970080789 +9833,1631970039555 +9834,1631970030812 +9835,1631949968795 +9836,1631949959786 +9837,1631949672884 +9842,1631353420158 +9843,1631353420158 +9844,1631378479128 +9855,1631423554299 +9870,1631380274856 +9871,1631380266488 +9872,1631379955198 +9873,1631379367844 +9874,1631379360451 +9875,1631367357620 +9876,1631367344073 +9877,1631367328344 +9878,1631367069890 +9880,1631365639850 +9881,1631357967122 +9882,1631357880609 +9883,1631354581788 +9884,1631354569218 +9885,1631353871733 +9886,1631353592978 +9887,1631353575232 +9888,1631353047502 +9889,1631353047502 +9890,1631352770255 +9891,1631352744633 +9896,1631349455003 +9897,1631349410941 +9898,1631344294921 +9899,1631343484604 +9900,1631342761535 +9906,1631302231238 +9907,1631292359814 +9908,1631292358352 +9909,1631282680715 +9910,1631282447188 +9911,1631270234895 +9912,1631270218421 +9913,1631252653577 +9914,1631252653577 +9927,1631220021845 +9928,1631219630123 +9929,1631219624506 +9930,1631219527537 +9931,1631219502285 +9932,1631219401323 +9933,1631213643628 +9934,1631213585345 +9935,1631212725834 +9936,1631207173061 +9937,1631207114508 +9938,1631207112098 +9939,1631207108020 +9940,1631207105755 +9941,1631207101935 +9942,1631207099404 +9943,1631207096895 +9944,1631207087326 +9945,1631206955908 +9946,1631206930138 +9947,1631206924315 +9948,1631206923158 +9949,1631206258736 +9950,1631206258736 +9951,1631206258736 +9952,1631206254251 +9953,1631206251146 +9954,1631206135561 +9955,1631205926209 +9956,1631205906653 +9957,1631205877776 +9958,1631205874650 +9959,1631205826589 +9960,1631205536893 +9961,1631205526186 +9962,1631205522781 +9963,1631205494810 +9964,1631205483861 +9965,1631205209227 +9966,1631205198625 +9967,1631205145039 +9968,1631205144021 +9969,1631205129063 +9971,1631185504108 +9972,1631185426045 +9973,1631185423103 +9975,1631183305513 +9976,1631182435908 +9977,1631182422938 +9978,1631182409383 +9979,1631180919816 +9980,1631179500457 +9981,1631179494758 +9982,1631177881957 +9983,1631177870653 +9984,1631176253776 +9987,1631173914713 +9988,1631173849100 +9989,1631173828510 +9990,1631173800352 +9991,1631173668991 +9992,1631173650408 +9993,1631173441267 +9994,1631172412122 +9995,1631172088569 +9996,1631172037553 +9997,1631172024574 +9998,1631171618574 +9999,1631171611337 +10000,1631171383760 +10001,1631171383760 +10002,1631164678163 +10003,1631128466996 +10004,1631128347172 +10005,1631121409947 +10006,1631121398237 +10007,1631121373943 +10008,1631121359059 +10009,1631121355605 +10010,1631121270161 +10011,1631121139250 +10012,1631121067987 +10013,1631121060642 +10014,1631121021694 +10015,1631120939902 +10016,1631120909411 +10017,1631120903988 +10018,1631117587137 +10019,1631116045237 +10020,1631116032702 +10021,1631116013306 +10022,1631115751741 +10023,1631115739191 +10024,1631115734254 +10025,1631113432242 +10026,1631113427621 +10027,1631113139863 +10032,1631112864517 +10033,1631112839414 +10034,1631112836714 +10035,1631112824643 +10036,1631112811679 +10037,1631112804816 +10038,1631112781418 +10039,1631112767157 +10040,1631112750213 +10041,1631112425644 +10042,1631112308986 +10043,1631111805674 +10044,1631111801748 +10045,1631111786064 +10046,1631109229766 +10047,1631109218778 +10048,1631109214398 +10050,1631109125424 +10051,1631109115114 +10053,1631108744087 +10055,1631108744087 +10056,1631102800471 +10057,1631102776184 +10058,1631102145835 +10059,1631088174541 +10060,1631088163162 +10061,1631088126583 +10062,1631087569611 +10063,1631086855452 +10064,1631085913984 +10065,1631085910989 +10066,1631085895343 +10067,1631085310942 +10069,1631084946361 +10070,1631083974621 +10071,1631083450407 +10075,1631034848566 +10077,1631034594451 +10078,1631033027859 +10079,1631032991446 +10080,1631032988391 +10081,1631031854233 +10082,1631031840867 +10084,1631022323909 +10085,1631022296867 +10086,1631008420027 +10087,1631008412709 +10088,1631007243000 +10089,1631007185887 +10090,1631007181547 +10091,1631007175309 +10093,1631006250114 +10094,1631006230004 +10095,1631001149395 +10096,1631001811359 +10097,1631001351918 +10098,1631001225180 +10099,1631001225005 +10100,1631001132799 +10101,1631001127983 +10103,1631000815449 +10104,1631000803261 +10110,1631000632497 +10111,1631000621372 +10112,1631000213526 +10113,1631000208984 +10114,1630998803684 +10115,1630998778307 +10116,1630998000230 +10117,1630997907767 +10118,1630997878802 +10119,1630993826307 +10131,1630956489887 +10132,1630954341041 +10133,1630954336989 +10134,1630953648921 +10135,1630953036239 +10136,1630952898126 +10137,1630952747352 +10138,1630947869031 +10139,1630947865930 +10140,1630947853692 +10141,1630947844564 +10142,1630947297340 +10143,1630947267637 +10144,1630947208111 +10147,1630945207410 +10149,1630943052469 +10150,1630943046418 +10151,1630943037374 +10153,1630939361638 +10154,1630938554880 +10155,1630938519367 +10160,1630936863106 +10162,1630935149473 +10163,1630935126099 +10169,1630934743236 +10171,1630934686817 +10174,1630933555838 +10175,1630933583034 +10176,1630933578887 +10177,1630933555838 +10178,1630925059458 +10179,1630925030609 +10180,1630924995902 +10181,1630924017806 +10182,1630917668880 +10183,1630917650397 +10185,1630908947624 +10186,1630905747675 +10187,1630905235863 +10188,1630820815848 +10194,1630756488628 +10198,1630508743887 +10199,1630495845675 +10200,1630495484336 +10201,1630495009623 +10202,1630423567381 +10215,1630255595539 +10217,1630227244679 +10219,1630227246841 +10220,1630227237226 +10221,1630227219510 +10225,1630005090535 +10231,1629461261230 +10232,1629452497200 +10233,1629446968540 +10234,1629446260756 +10235,1629443970981 +10237,1629303009170 +10238,1629280956470 +10239,1629280626323 +10240,1629268189801 +10241,1629137552291 +10242,1629137510641 +10244,1629043170154 +10245,1629025788474 +10246,1629025783307 +10247,1629025775480 +10248,1629025772321 +10249,1629007285421 +10250,1628858074884 +10251,1628858074884 +10324,1628573613480 +10325,1628573548466 +10329,1628403372637 +10330,1628403361377 +10332,1628320930061 +10333,1628320648513 +10334,1628270102951 +10335,1628146227755 +10336,1628146218055 +10337,1628146204175 +10338,1628107276219 +10339,1628107193930 +10348,1627753478948 +10349,1627752341347 +10350,1627752339876 +10351,1627752233396 +10352,1627752220594 +10355,1627318145132 +10356,1627218447550 +10357,1627218399385 +10358,1627218324560 +10359,1627120852071 +10360,1627120809442 +10361,1626963746436 +10362,1626802481681 +10391,1626733830028 +10392,1626108084387 +10393,1626012222358 +10394,1626012214681 +10395,1626012211305 +10396,1625942958014 +10397,1625942802855 +10398,1625942161801 +10399,1625761098240 +10400,1625593279764 +10401,1625593205629 +10402,1625593138974 +10403,1625593117440 +10404,1625586468362 +10437,1624692776612 +10455,1624354937315 +10463,1624265077853 +10471,1624184018082 +10473,1624108621731 +10479,1623952865692 +10488,1623694666783 +10489,1623694663218 +10490,1623694237114 +10491,1623572653359 +10492,1623572716927 +10493,1623572653359 +10506,1622965530087 +10507,1622965294645 +10508,1622964783734 +10509,1622964756890 +10510,1622964304893 +10513,1622905453067 +10518,1622650236835 +10520,1622650214396 +10522,1622650048802 +10523,1622650032143 +10524,1622650015130 +10542,1622648365459 +10543,1622648346017 +10547,1622635281814 +10548,1622635281814 +10549,1622635281814 +10550,1622635279921 +10551,1622635252060 +10552,1622623486684 +10553,1622623483092 +10554,1622621259541 +10555,1622621227543 +10556,1622621198998 +10557,1622621158819 +10558,1622621133822 +10559,1622621090713 +10560,1622621070171 +10561,1622621065110 +10571,1622440185251 +10578,1622368512751 +10582,1622359758583 +10583,1622359743190 +10584,1622359661595 +10585,1622359655945 +10586,1622354211156 +10587,1622311268267 +10588,1622311248671 +10590,1622028476203 +10591,1622028475547 +10592,1622028368914 +10615,1621704080406 +10616,1621704072726 +10617,1621699965474 +10618,1621699937806 +10619,1621699907168 +10620,1621699653179 +10621,1621699649566 +10625,1621490462949 +10626,1621243174917 +10627,1621241848478 +10628,1621177548243 +10629,1621177525311 +10630,1621177269230 +10631,1621177242381 +10632,1621177163457 +10633,1621177148782 +10634,1621177026815 +10635,1621109675325 +10637,1621084298699 +10638,1621083277326 +10639,1621083272326 +10640,1621076038273 +10641,1621067638246 +10642,1621067604281 +10643,1621067498912 +10644,1621067494840 +10645,1621067475495 +10646,1620854483147 +10647,1620728033339 +10648,1620727978292 +10649,1620727942217 +10650,1620727939505 +10651,1620713026087 +10654,1620667624871 +10655,1620667608162 +10656,1620667308372 +10657,1620666842857 +10658,1620664493252 +10659,1620664058128 +10666,1620416731274 +10667,1620416728695 +10668,1620416688472 +10669,1620379746467 +10670,1620073776638 +10671,1620073769821 +10672,1620073759434 +10697,1619867770269 +10698,1619867768558 +10699,1619867760897 +10700,1619867753943 +10701,1619867731859 +10702,1619867721542 +10703,1619863654465 +10704,1619863420878 +10705,1619863419252 +10706,1619863401894 +10707,1619862076129 +10708,1619861841823 +10709,1619861833644 +10710,1619861811385 +10711,1619861791998 +10712,1619861058625 +10713,1619860970878 +10714,1619860727529 +10715,1619860248923 +10717,1619860248923 +10718,1619860242457 +10719,1619860147364 +10720,1619860115213 +10721,1619860109361 +10722,1619860105696 +10723,1619860085096 +10724,1619860045015 +10725,1619860042563 +10726,1619860041319 +10727,1619859602166 +10728,1619859578619 +10729,1619859021615 +10730,1619859209894 +10731,1619859209894 +10732,1619859209894 +10733,1619859021615 +10734,1619857169457 +10735,1619857167167 +10736,1619857166999 +10737,1619857165715 +10756,1618736044074 +10757,1618736044074 +10765,1618736044074 +10768,1618427939500 +10769,1618427977620 +10770,1618427975978 +10771,1618427974062 +10772,1618427942304 +10773,1618427939500 +10774,1618427936582 +10776,1618342632470 +10777,1618342632470 +10778,1618342632470 +10779,1618342630294 +10780,1618342514067 +10781,1618342450924 +10782,1618342412297 +10783,1618342325329 +10784,1618341826229 +10785,1618292934567 +10787,1617905698283 +10788,1617809811228 +10793,1617440093982 +10794,1617440083935 +10796,1616954224655 +10805,1616923698353 +10806,1616919779612 +10807,1616919767876 +10810,1616174882485 +10811,1616171067290 +10812,1616146397337 +10813,1616084503110 +10814,1616084491402 +10815,1616084460928 +10816,1616084452838 +10817,1616084410487 +10818,1616062674594 +10829,1615799835331 +10842,1615105356002 +10844,1614946319493 +10845,1614595891289 +10846,1614160732882 +10847,1613930766249 +10850,1613823685419 +10851,1613823387835 +10852,1613823369281 +10857,1613822075645 +10858,1613822065085 +10859,1613811821933 +10860,1613811815848 +10861,1613811812873 +10862,1613741858719 +10863,1613741858719 +10867,1613243249472 +10868,1613243245774 +10869,1613243139672 +10870,1613240885036 +10871,1613240866316 +10872,1613239834043 +10878,1613198848746 +10879,1613198818066 +10880,1613198794281 +10881,1613133984544 +10882,1612874525542 +10883,1612692699015 +10885,1612507134529 +10886,1612450446205 +10887,1612450438419 +10888,1612438185415 +10889,1612438178641 +10890,1612436552022 +10891,1612431387520 +10892,1612431184980 +10893,1612430832619 +10901,1610805441197 +10904,1609697223495 +10905,1609697220270 +10908,1608482561588 +10909,1608458198740 +10914,1608385248860 +10915,1608312581474 +10916,1608312355964 +10917,1608311609801 +10918,1608101825691 +10919,1608101778747 +10941,1607342524414 +10942,1607342510914 +10943,1607333629587 +10944,1607160933732 +10957,1606590414526 +10959,1606552628612 +10960,1606552614931 +10961,1606477390666 +10962,1606477386850 +10963,1606045164230 +10964,1605984069701 +10965,1605962327849 +10966,1605962324190 +10968,1605682051343 +10969,1605682047103 +10970,1605682044648 +10971,1605682042272 +10972,1605682039726 +10973,1605682035289 +10974,1605682031800 +10975,1605682027312 +10976,1605682025167 +10977,1605682022486 +10978,1605682018308 +10979,1605681998817 +10983,1604234781593 +10984,1604149703781 +10985,1604149702289 +10986,1604147334285 +10996,1603016373128 +10997,1602969924564 +10998,1602623673861 +10999,1602623645253 +11008,1601229133401 +11009,1601229129858 +11010,1601220838941 +11038,1600003228418 +11039,1599999484962 +11040,1599982584690 +11041,1599982567639 +11051,1599928590473 +11052,1599928586683 +11053,1599921165991 +11054,1599918658905 +11055,1599910621207 +11056,1599908990501 +11057,1599908319392 +11058,1599907857216 +11059,1599907093191 +11060,1599903904071 +11061,1599901471200 +11062,1599901365572 +11063,1599901107852 +11064,1599901093526 +11065,1599896789111 +11067,1599844271373 +11068,1599844264466 +11081,1599824143699 +11082,1599824146982 +11083,1599823294603 +11084,1599823281793 +11085,1599823272803 +11086,1599821709850 +11087,1599821024974 +11088,1599821005309 +11089,1599820703082 +11090,1599820653119 +11092,1599818600375 +11093,1599818415436 +11096,1599817959191 +11097,1599817940772 +11099,1599817908855 +11100,1599817850478 +11101,1599817850613 +11102,1599817847183 +11103,1599817843545 +11104,1599817546650 +11105,1599817162614 +11106,1599817131112 +11107,1599817112241 +11108,1599816296127 +11109,1599816296127 +11110,1599816243515 +11111,1599816235665 +11112,1599815520215 +11113,1599815503851 +11114,1599752431175 +11115,1599747830547 +11116,1599747822098 +11117,1599747802355 +11118,1599747766563 +11119,1599747757466 +11120,1599744611662 +11123,1599735561801 +11124,1599734672342 +11125,1599732938969 +11126,1599731545814 +11127,1599731111955 +11128,1599731086695 +11129,1599730956245 +11130,1599729764576 +11131,1599729218215 +11132,1599729155775 +11133,1599727025965 +11134,1599727010347 +11135,1599726007795 +11136,1599726002214 +11138,1599656729253 +11147,1599650180051 +11148,1599649914858 +11149,1599647720215 +11150,1599647700283 +11152,1599639849672 +11153,1599639849672 +11154,1599633903054 +11155,1599633862463 +11156,1599633851876 +11157,1599633805207 +11158,1599632133728 +11159,1599631081850 +11160,1599631074966 +11165,1599573287080 +11166,1599573271513 +11167,1599573265667 +11168,1599565579588 +11169,1599565414083 +11170,1599564949391 +11171,1599564503204 +11172,1599555978499 +11173,1599555977114 +11174,1599555971985 +11175,1599555962849 +11176,1599555962780 +11177,1599555847215 +11178,1599555828785 +11179,1599555443675 +11180,1599555432816 +11181,1599555388519 +11182,1599553891200 +11183,1599553876863 +11184,1599523226576 +11185,1599523216216 +11186,1599520447531 +11187,1599520446300 +11188,1599516489777 +11189,1599516467028 +11190,1599516403570 +11191,1599516399635 +11192,1599516369837 +11193,1599513155068 +11194,1599510377242 +11195,1599510372576 +11196,1599510367566 +11197,1599510357362 +11198,1599487036132 +11199,1599486962826 +11200,1599486448877 +11201,1599486420668 +11202,1599486407207 +11203,1599469016354 +11204,1599468977999 +11205,1599468975880 +11206,1599468582421 +11207,1599433967613 +11223,1599409401044 +11224,1599409399960 +11225,1599409398830 +11237,1599372949170 +11238,1599370375338 +11239,1599370364741 +11240,1599332628026 +11241,1599332532260 +11242,1599332467925 +11243,1599332452660 +11244,1599332442815 +11245,1599332180957 +11246,1599332116479 +11247,1599331941508 +11248,1599331927845 +11249,1599328045385 +11250,1599327302998 +11251,1599327288849 +11252,1599327279238 +11253,1599326993694 +11254,1599326984406 +11255,1599324507388 +11256,1599324780311 +11257,1599324762801 +11258,1599324725486 +11259,1599324713040 +11260,1599324631481 +11261,1599324628217 +11262,1599324398887 +11263,1599319640136 +11264,1599318443620 +11265,1599318448487 +11266,1599318443620 +11267,1599317827104 +11268,1599317565664 +11269,1599317400354 +11270,1599312904457 +11271,1599309054166 +11278,1599234937818 +11279,1599234934810 +11281,1599233907202 +11282,1599233902096 +11284,1598681012425 +11286,1598507271317 +11287,1598507267261 +11288,1598507238137 +11292,1598191990094 +11293,1598122122489 +11294,1598122119468 +11295,1598122100712 +11296,1598120153341 +11297,1598118913288 +11298,1598118706650 +11299,1598117635440 +11300,1598117627093 +11301,1598117627538 +11311,1597574041121 +11312,1597573066921 +11313,1597572569133 +11314,1597572489307 +11315,1597572486815 +11316,1597572342172 +11317,1597572318797 +11318,1597572206122 +11321,1597570867213 +11322,1597570860386 +11323,1597570842433 +11326,1597517920838 +11327,1597517917594 +11328,1597517863992 +11329,1597517861244 +11337,1597504429993 +11347,1597495624017 +11364,1597486942957 +11365,1597486387418 +11366,1597486380608 +11367,1597486375604 +11378,1597484559586 +11379,1597484552825 +11380,1597482240257 +11381,1597482096992 +11384,1596926277983 +11385,1596926266881 +11386,1596902396848 +11387,1596819383218 +11388,1596819377017 +11389,1596819365703 +11390,1596819328624 +11393,1596733839588 +11394,1596733833082 +11397,1596106103702 +11401,1595524721049 +11402,1595524690559 +11403,1595524093948 +11404,1595524093948 +11405,1595524084728 +11406,1595523901752 +11407,1595523901752 +11408,1595523901752 +11409,1595523762940 +11410,1595523340529 +11411,1595523332189 +11412,1595523307659 +11413,1595523299365 +11414,1595523297277 +11454,1595156022678 +11455,1595155995965 +11456,1595155975304 +11457,1595151327454 +11458,1595151316732 +11459,1595149046967 +11460,1595149040909 +11461,1595149037690 +11462,1595149018462 +11463,1595149015466 +11464,1595144380594 +11465,1595144370325 +11467,1595143153222 +11468,1595143147049 +11469,1595142298893 +11471,1595086062490 +11472,1595086043830 +11473,1595085963648 +11474,1595085954664 +11475,1595078458812 +11476,1595078453390 +11477,1595076349284 +11478,1595076335896 +11479,1595076331629 +11480,1595076289910 +11481,1595076281742 +11482,1595076112894 +11483,1595076107510 +11484,1595076100415 +11485,1595073057957 +11486,1595072926047 +11487,1595072914524 +11488,1595069192113 +11489,1595069187340 +11490,1595068120422 +11491,1595067649523 +11492,1595067603249 +11493,1595067571984 +11496,1595066541240 +11497,1595064859017 +11498,1595061428071 +11499,1595061411817 +11500,1595061407869 +11501,1595060957382 +11502,1595060941746 +11503,1595060935058 +11504,1595060385221 +11505,1595060188623 +11506,1595060177708 +11507,1595053267231 +11508,1595053253970 +11510,1595053086948 +11511,1595051760032 +11513,1594838379447 +11514,1594838279282 +11515,1594838246446 +11516,1594838231398 +11517,1594838222857 +11520,1594489752600 +11521,1594489727263 +11522,1594488465733 +11523,1594488440986 +11524,1594487312708 +11525,1594487310839 +11526,1594487308116 +11527,1594487308476 +11528,1594487297037 +11529,1594487294847 +11530,1594487286478 +11531,1594487221928 +11532,1594482980107 +11533,1594482976947 +11534,1594476829132 +11536,1594407071825 +11537,1594406193924 +11538,1594405136561 +11539,1594136062328 +11541,1593961633598 +11542,1593961618296 +11543,1593961612432 +11549,1593861356899 +11550,1593861344195 +11551,1593861167386 +11552,1593861167785 +11554,1593349607127 +11555,1593349607127 +11556,1593349607127 +11557,1593349607127 +11559,1593376073683 +11560,1593376073683 +11561,1593363579198 +11562,1593361356365 +11563,1593361350294 +11564,1593361280904 +11565,1593361274573 +11566,1593349607127 +11568,1593245936610 +11569,1593245920228 +11570,1593245909655 +11571,1593151387211 +11578,1592646006954 +11579,1592632700102 +11589,1592590396505 +11590,1592581476395 +11591,1592581471591 +11596,1592371207622 +11597,1592371173483 +11606,1592161323379 +11607,1592149316233 +11608,1592148738175 +11609,1592148729150 +11610,1592148726461 +11611,1592135671686 +11612,1592135669599 +11615,1592040205075 +11618,1591953227976 +11623,1591720615502 +11624,1591561335173 +11625,1591533301298 +11626,1591533285153 +11627,1591532239957 +11628,1591532235180 +11629,1591532201692 +11630,1591532195208 +11631,1591532177250 +11632,1591532167612 +11633,1591455535703 +11659,1591097301214 +11660,1591097301088 +11665,1591087314949 +11666,1591087299030 +11667,1591087067789 +11668,1591087046802 +11669,1591086966839 +11670,1591086952709 +11671,1591086918976 +11672,1591083213758 +11673,1591083197811 +11678,1590919821933 +11680,1590848674858 +11681,1590848668235 +11684,1590336692383 +11685,1590336682737 +11686,1590230355241 +11692,1590230385816 +11693,1590230347453 +11694,1590238701756 +11695,1590238686192 +11699,1589903501930 +11703,1589105360073 +11704,1589028918677 +11705,1589029115320 +11706,1588871465068 +11707,1588780930863 +11708,1588765681989 +11709,1588765668745 +11712,1587901092151 +11713,1587839534209 +11714,1587839529879 +11715,1587839520955 +11716,1587839312896 +11719,1587829022104 +11735,1587569696421 +11739,1584286717363 +11740,1587216907796 +11741,1586955118800 +11742,1586934117333 +11743,1586934101428 +11745,1586702364589 +11746,1586702341241 +11747,1586691185281 +11750,1586688134124 +11751,1586688047212 +11752,1586686809576 +11753,1586686797289 +11755,1586376666219 +11756,1586020161091 +11757,1585996778466 +11758,1585996751756 +11759,1585990917118 +11760,1585990520561 +11764,1584875873300 +11765,1584875822593 +11766,1584869237674 +11767,1584814078438 +11768,1584806021136 +11769,1584737893887 +11770,1584551672007 +11771,1584551654262 +11772,1584551640315 +11773,1584551634797 +11774,1584292861352 +11776,1584266757260 +11777,1584216576184 +11778,1584216553889 +11779,1584216543605 +11789,1583662925105 +11790,1583662925105 +11791,1583661221614 +11792,1583661211704 +11793,1583660867000 +11794,1583660862440 +11795,1583660843905 +11797,1583444383460 +11799,1582969024205 +11800,1582967141093 +11801,1582402656950 +11802,1581970150912 +11803,1581841872891 +11804,1581841855885 +11809,1581175212706 +11810,1581167927141 +11811,1581166450238 +11812,1581162245430 +11819,1581161763562 +11820,1581161382702 +11821,1581161379073 +11822,1581160905474 +11824,1581160132647 +11825,1581157987555 +11826,1581157979071 +11827,1581156866358 +11828,1581156865140 +11829,1581156862638 +11830,1581156110115 +11832,1580499255528 +11833,1580496563506 +11835,1580152685633 +11836,1579355336023 +11837,1579347771280 +11838,1579347705335 +11839,1579347683285 +11840,1579347644559 +11846,1578341480183 +11847,1578251517563 +11848,1578128739737 +11849,1578128709401 +11850,1578128680484 +11851,1578128637566 +11852,1578128585485 +11853,1578128475580 +11854,1578128374905 +11855,1578126165923 +11856,1578125862085 +11857,1578125851153 +11858,1578080610584 +11859,1578077150496 +11860,1578074111000 +11862,1577831783991 +11863,1577830781088 +11864,1577829436213 +11865,1577829425407 +11866,1577829392022 +11868,1577826763050 +11869,1577826743071 +11870,1577826051631 +11871,1577737318955 +11872,1577721361095 +11873,1577721327059 +11874,1577721320091 +11875,1577701218830 +11876,1577701029665 +11877,1577701026533 +11878,1577700988416 +11879,1577700972868 +11880,1577627281896 +11881,1577625911708 +11882,1577625823241 +11883,1577625563953 +11884,1577625558276 +11887,1577197301000 +11888,1577197301000 +11889,1577197301000 +11892,1576942917959 +11893,1576942917959 +11894,1576942798129 +11895,1576354969015 +11896,1576349694706 +11897,1576349678616 +11898,1576348974716 +11899,1576348946983 +11900,1576348906093 +11901,1576348873272 +11902,1576348846653 +11903,1576345993409 +11904,1576341800523 +11905,1576341792016 +11906,1576341770398 +11907,1576341601000 +11908,1576340357251 +11909,1576339562671 +11910,1576339451433 +11911,1576339402301 +11913,1576333504873 +11914,1576333156332 +11915,1576174708988 +11916,1575721393757 +11917,1575721309888 +11918,1575721305750 +11919,1575549169748 +11949,1575217385742 +11950,1575217333189 +11951,1575194906303 +11954,1575116126158 +11955,1575116100874 +11956,1575116065536 +11958,1574717219000 +11962,1574521055079 +11965,1573914935855 +11966,1573914872310 +11967,1573905526963 +11968,1573905314564 +11969,1573905308510 +11970,1573764406761 +11972,1573386240896 +11973,1573386227348 +11974,1573386218659 +11975,1573336915232 +11976,1573336824652 +11977,1573336807214 +11978,1573066505386 +11979,1573065827090 +11980,1572978832843 +12006,1572791410176 +12007,1572791283993 +12008,1572791267897 +12009,1572791264696 +12010,1572791252105 +12011,1572790900602 +12012,1572782641767 +12013,1572782635291 +12014,1572781780093 +12015,1572777014451 +12016,1572776961119 +12017,1572717285118 +12018,1572717280784 +12019,1572717218060 +12020,1572717142686 +12023,1572709853033 +12024,1572709841192 +12025,1572709728046 +12027,1572690905771 +12028,1572690891476 +12029,1572689595215 +12030,1572689586543 +12032,1572640627813 +12033,1572640623683 +12034,1572640616223 +12035,1572639420610 +12036,1572639418717 +12037,1572635746999 +12038,1572630991834 +12039,1572630938640 +12040,1572630192041 +12041,1572630147552 +12042,1572630137331 +12043,1572630115748 +12044,1572629963118 +12045,1572629923841 +12046,1572629870000 +12047,1572620776025 +12048,1572620774205 +12049,1572620766479 +12050,1572620765177 +12051,1572620747489 +12052,1572616779732 +12053,1572616630000 +12054,1572616597000 +12055,1572616556412 +12056,1572616464316 +12057,1572616388873 +12058,1572616382210 +12059,1572616269921 +12060,1572616260967 +12061,1572616198233 +12062,1572616182260 +12063,1572616158005 +12064,1572616134421 +12065,1572615934081 +12066,1572615871000 +12067,1572612658889 +12068,1572612656769 +12069,1572609338587 +12070,1572609331332 +12071,1572609087979 +12072,1572609087657 +12073,1572608990000 +12074,1572608982596 +12075,1572606542534 +12076,1572606522528 +12077,1572606511357 +12078,1572606453134 +12079,1572606441795 +12080,1572606276549 +12081,1572605427750 +12082,1572605010619 +12083,1572605005618 +12084,1572605002493 +12087,1572553759041 +12119,1572104216746 +12120,1572104187852 +12122,1571596259266 +12123,1571594071175 +12124,1571575986000 +12125,1571337049920 +12133,1570899808174 +12134,1570894403138 +12135,1570894375788 +12136,1570894287337 +12137,1570894285332 +12139,1570476248525 +12143,1570479693000 +12144,1570477227764 +12145,1570477222475 +12146,1570476248525 +12149,1570284921957 +12159,1569959032720 +12160,1569860239121 +12161,1569859188852 +12163,1569650776872 +12164,1569618030408 +12165,1569617931289 +12166,1569617770772 +12167,1569516965197 +12168,1569263758876 +12170,1569060527055 +12171,1569060493458 +12172,1569060493562 +12173,1569059713225 +12174,1569059707750 +12179,1569002174963 +12180,1569002170253 +12185,1568485613732 +12186,1567949572590 +12187,1568188217349 +12188,1567949579770 +12189,1567949572590 +12190,1567949559844 +12191,1567945412338 +12192,1567945408192 +12193,1567945408424 +12194,1567944214857 +12195,1567944185053 +12196,1567944175983 +12197,1567944021642 +12198,1567944020111 +12199,1567867390354 +12200,1567867390886 +12201,1567867388513 +12202,1567867387349 +12203,1567867293658 +12204,1567867287749 +12205,1567867275632 +12206,1567867272581 +12207,1567867264894 +12208,1567867260207 +12209,1567862476084 +12210,1567862474688 +12211,1567862456349 +12212,1567862454066 +12214,1567783173942 +12215,1567782156081 +12216,1567780608494 +12217,1567713461000 +12218,1567713438000 +12219,1567713357393 +12220,1567708406140 +12222,1567702413064 +12223,1567700946000 +12225,1567664159000 +12226,1567663560667 +12227,1567663543740 +12228,1567663009234 +12229,1567662990379 +12230,1567662684145 +12231,1567612899104 +12232,1567612686094 +12233,1567612679791 +12234,1567612657203 +12235,1567612641201 +12236,1567612627238 +12237,1567612608498 +12238,1567612598560 +12239,1567612596819 +12240,1567612478187 +12241,1567612427052 +12242,1567612424313 +12244,1567612398904 +12245,1567611691603 +12246,1567611379000 +12247,1567611372300 +12248,1567609300640 +12250,1567338657274 +12251,1567332684697 +12252,1567332681360 +12253,1567260362250 +12258,1566921112009 +12259,1566921017969 +12260,1566920994478 +12261,1566920667517 +12262,1566904402371 +12263,1566904174401 +12294,1566669104312 +12295,1566654106325 +12296,1566654090860 +12300,1566488738982 +12302,1566381382556 +12303,1566380256400 +12304,1566379420000 +12305,1566379467379 +12306,1566379464440 +12307,1566378855530 +12308,1566379091214 +12309,1566379459650 +12310,1566378570935 +12311,1566374298280 +12312,1566374295882 +12313,1566374292836 +12314,1566309470935 +12316,1566295075975 +12317,1566242921659 +12318,1566242866704 +12337,1566135643275 +12340,1566125386681 +12341,1566125382836 +12342,1566125322551 +12343,1566125299265 +12350,1565949399674 +12351,1565949430477 +12352,1565949442968 +12353,1565949447079 +12354,1565949459784 +12355,1565949496524 +12356,1565949501797 +12357,1565949501797 +12358,1565949505835 +12359,1565949505835 +12360,1565949505835 +12361,1565949505835 +12362,1565949505835 +12363,1565949505835 +12364,1565949505835 +12365,1565949505835 +12386,1566038494396 +12388,1566036512932 +12391,1566035184693 +12392,1566035171565 +12393,1566033852636 +12398,1566033099768 +12399,1566033085325 +12400,1566033076202 +12401,1566032806587 +12402,1566031894987 +12403,1566031616616 +12404,1566031612950 +12405,1566031609907 +12406,1566031571079 +12407,1566031561346 +12409,1566028443434 +12411,1566026771746 +12417,1565982814282 +12418,1565982814282 +12430,1565959018000 +12431,1565958794149 +12432,1565958789121 +12433,1565957627337 +12434,1565955944912 +12435,1565955940033 +12436,1565955877913 +12437,1565955871092 +12438,1565955650543 +12439,1565955642674 +12440,1565955341658 +12441,1565955334633 +12442,1565955329419 +12443,1565954488776 +12444,1565954486584 +12445,1565954167170 +12446,1565953170320 +12447,1565953009000 +12448,1565952813088 +12449,1565951656864 +12450,1565951175621 +12451,1565951172318 +12452,1565951168528 +12453,1565950225196 +12454,1565950107105 +12455,1565950098149 +12456,1565950092896 +12457,1565950085346 +12458,1565949854311 +12459,1565949849984 +12460,1565949505835 +12461,1565949501797 +12462,1565949496524 +12463,1565949459784 +12464,1565949447079 +12465,1565949442968 +12466,1565949436674 +12467,1565949430477 +12468,1565949399674 +12469,1565948218819 +12470,1565947461602 +12471,1565947440909 +12472,1565947379149 +12473,1565947374640 +12474,1565946833076 +12475,1565944834005 +12476,1565943096504 +12477,1565943091127 +12478,1565942102641 +12479,1565942095828 +12480,1565942089221 +12481,1565941796206 +12482,1565941788154 +12483,1565941786870 +12484,1565940367493 +12485,1565940356074 +12486,1565940327878 +12487,1565940317091 +12488,1565939787174 +12489,1565938484187 +12490,1565938029722 +12491,1565938013061 +12519,1565881824616 +12522,1565878121323 +12523,1565877976750 +12524,1565877962617 +12527,1565876078244 +12528,1565876065935 +12529,1565876059372 +12530,1565876053326 +12534,1565875011653 +12535,1565873854000 +12536,1565873835000 +12537,1565873825664 +12538,1565873822649 +12539,1565873701859 +12540,1565873516430 +12541,1565873487973 +12542,1565873485728 +12543,1565873477440 +12544,1565873474432 +12545,1565873458052 +12546,1565873455715 +12547,1565873453948 +12548,1565873213651 +12549,1565873212500 +12550,1565873189341 +12551,1565873168774 +12552,1565873159884 +12553,1565872678175 +12554,1565871910421 +12555,1565871901719 +12556,1565871838833 +12557,1565871835193 +12558,1565871833449 +12559,1565871831262 +12560,1565870750133 +12561,1565870744762 +12562,1565870618594 +12564,1565866852000 +12565,1565866847089 +12566,1565866840006 +12569,1565864893898 +12570,1565864882205 +12571,1565863947980 +12572,1565863909526 +12573,1565863900767 +12593,1565820430183 +12612,1565711758316 +12613,1565708907589 +12616,1565688462202 +12617,1565688432257 +12618,1565688402916 +12619,1565686907254 +12620,1565685473067 +12621,1565685451898 +12622,1565682827977 +12625,1565681385609 +12632,1565541233431 +12650,1565541233431 +12651,1565541213728 +12652,1565541208693 +12677,1565512570239 +12681,1565456900029 +12682,1565456873961 +12683,1565455859985 +12697,1565158640764 +12741,1564940903168 +12742,1564912685647 +12743,1564912544655 +12748,1564851304275 +12749,1564848732894 +12751,1564773818171 +12753,1564512778429 +12754,1564511470794 +12755,1564511468766 +12756,1564510542342 +12757,1564508602924 +12761,1564416142809 +12762,1564416197126 +12763,1564415353237 +12764,1564230477700 +12765,1564230477967 +12766,1564230476094 +12767,1564230475922 +12768,1564230472069 +12769,1564230313516 +12770,1564230285657 +12806,1564163988660 +12845,1564124903956 +12846,1564123537268 +12862,1564000246108 +12863,1564000240725 +12864,1564000230598 +12878,1563964669296 +12879,1563964669296 +12880,1563964023471 +13199,1563912397980 +13200,1563911990016 +13201,1563908746420 +13202,1563908739932 +13203,1563908710365 +13204,1563907564516 +13205,1563907303427 +13206,1563907297447 +13207,1563906650262 +13209,1563902568866 +13210,1563902564257 +13211,1563902545379 +13212,1563902418122 +13213,1563902413139 +13214,1563902335316 +13215,1563902329779 +13216,1563902319764 +13259,1563734843013 +13296,1563536417534 +13303,1563528907335 +13324,1563392851418 +13369,1563123582088 +13370,1563123564565 +13371,1563122749692 +13372,1563122737776 +13396,1563102878807 +13397,1563102874553 +13398,1563102827853 +13399,1563102817819 +13400,1563102810646 +13401,1563099798431 +13402,1563099789721 +13403,1563099629808 +13404,1563099026000 +13405,1563098991044 +13406,1563098983216 +13407,1563098980661 +13408,1563098946950 +13409,1563096758517 +13411,1563096621475 +13412,1563096428440 +13418,1563021224699 +13419,1563018895203 +13422,1563046604981 +13426,1563039977257 +13427,1563039930491 +13428,1563039902876 +13429,1563039856040 +13430,1563039835414 +13431,1563039832051 +13432,1563039344219 +13433,1563039328934 +13441,1563026342505 +13442,1563025146105 +13443,1563023693113 +13444,1563023745747 +13445,1563023743024 +13446,1563023740156 +13447,1563023693113 +13449,1563021190673 +13450,1563018895203 +13451,1563018877482 +13452,1563018865385 +13455,1563011737662 +13456,1563011736433 +13457,1563011640296 +13483,1562787234871 +13485,1562784609040 +13486,1562784602516 +13515,1562397708940 +13516,1562396704310 +13519,1562341833545 +13520,1562341824947 +13521,1562341817397 +13522,1562341810691 +13523,1562341803961 +13529,1562255193342 +13530,1562255191287 +13531,1562255189095 +13532,1562255184291 +13549,1561963473000 +13550,1561745046000 +13551,1561744979764 +13552,1561744565149 +13553,1561744565149 +13554,1561744565149 +13555,1738662447000 +13556,1738662378000 +13559,1680774370000 +13561,1680767195000 +13562,1680766964000 +13563,1680766855000 +13564,1680766789000 +13565,1680766777000 +13566,1680766730000 +13567,1680766710000 +13568,1680766672000 +13569,1680766103000 +13570,1680765750000 +13709,1665003884000 +13710,1665003856000 +13718,1664398910000 +13721,1664268022000 +13732,1656082556000 +13736,1655894108000 +13737,1655893848000 +13739,1655803018000 +13740,1655800068000 +13742,1655469406000 +13743,1655468862000 +13779,1654853708000 +13780,1654797415000 +13801,1653142687000 +13802,1653142562000 +13803,1653142000000 +13806,1653050499000 +13815,1652873447000 +13816,1652873170000 +13827,1651957960000 +13846,1645631524000 +13847,1645631395000 +13850,1644673334000 +13858,1639926429000 +13859,1639926182000 +13860,1639926141000 +13864,1638788859000 +13867,1635674384000 +13868,1631955632000 +13869,1631953876000 +13870,1631953858000 +13871,1631953809000 +13872,1631344972000 +13873,1631344752000 +13874,1630499488000 +13875,1630499416000 +13876,1630489705000 +13877,1630484668000 +13878,1630484640000 +13879,1623079427000 +13880,1621700148000 +13881,1621067186000 +13882,1621067157000 +13883,1619864930000 +13884,1619864916000 +13885,1619864888000 +13886,1619864517000 +13887,1619864442000 +13888,1619863983000 +13889,1619863902000 +13890,1619863885000 +13891,1619863871000 +13892,1619860362000 +13894,1606552718000 +13895,1599555285000 +13896,1595066788000 +13897,1587569702000 +13898,1585426658000 +13899,1583356551000 +13900,1582402959000 +13901,1578344219000 +13902,1577833473000 +13903,1576942054000 +13904,1575726539000 +13905,1575217377000 +13906,1574584820000 +13907,1574527981000 +13908,1574527913000 +13909,1571416770000 +13910,1569062779000 +13911,1569061196000 +13912,1567867108000 diff --git a/docs/dynamicAlbums.csv b/docs/dynamicAlbums.csv new file mode 100644 index 0000000..e69de29 diff --git a/docs/entry.csv b/docs/entry.csv new file mode 100644 index 0000000..e00f1a2 --- /dev/null +++ b/docs/entry.csv @@ -0,0 +1,7405 @@ +id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedMillis,sourceDateTakenMillis,durationMillis,trashed,origin,provider,remoteId,remotePath,remoteThumb1,remoteThumb2,remoteWidth,remoteHeight,remoteRotation,latitude,longitude,altitude +1,1365405451,aves-remote://rid/b3cda38a2fdee7ba9bdd2ea07d936b2fa5361baa21be2b2c29f1ad8ebcc4c31e,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0099.JPG,image/jpeg,4032,3024,,3758888,"",1773604734,1503481740000,1503481740000,,0,1,json@patachina,b3cda38a2fdee7ba9bdd2ea07d936b2fa5361baa21be2b2c29f1ad8ebcc4c31e,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0099.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0099_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0099_avg.jpg,,,0,45.6661194444444,9.70110833333333,229.648888888889 +2,1029951453,aves-remote://rid/09ef919ff2a105ad75d2e7631b9c02228c1784df5048c98276fd379f1533360b,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0103.JPG,image/jpeg,4032,3024,,3984165,"",1773604734,1503493700000,1503493700000,,0,1,json@patachina,09ef919ff2a105ad75d2e7631b9c02228c1784df5048c98276fd379f1533360b,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0103.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0103_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0103_avg.jpg,,,0,53.344925,-6.256825,6.37160120845921 +3,1191391559,aves-remote://rid/dba1de0e187650e62118279beb2d83e8759a6d4fb8a5412a6a18cdc4e01a33d7,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0106.JPG,image/jpeg,5326,3950,,4338120,"",1773604734,1503496121000,1503496121000,,0,1,json@patachina,dba1de0e187650e62118279beb2d83e8759a6d4fb8a5412a6a18cdc4e01a33d7,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0106.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0106_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0106_avg.jpg,,,0,53.3439416666667,-6.24924722222222,7.3796928327645 +4,1130333887,aves-remote://rid/751d8a15766bf2686bc87e60b33b4a8c38befe454428e6a5a82b00f26026c0e0,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0107.JPG,image/jpeg,4032,3024,,3159006,"",1773604734,1503496785000,1503496785000,,0,1,json@patachina,751d8a15766bf2686bc87e60b33b4a8c38befe454428e6a5a82b00f26026c0e0,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0107.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0107_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0107_avg.jpg,,,0,53.3448611111111,-6.25230555555556,7.89636462289745 +5,1694606371,aves-remote://rid/73dfd75dd639da9c7c0d4a6244f189a833d543bfdd4059b06f9f98e49f83c937,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0108.JPG,image/jpeg,4032,3024,,3338305,"",1773604734,1503496787000,1503496787000,,0,1,json@patachina,73dfd75dd639da9c7c0d4a6244f189a833d543bfdd4059b06f9f98e49f83c937,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0108.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0108_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0108_avg.jpg,,,0,53.3447916666667,-6.25231666666667,7.79565096180652 +6,1777498318,aves-remote://rid/f32173d43d16b47eda3e7a32257ec956287d60b0516a5f6e46a8d1d433f53fd8,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0109.JPG,image/jpeg,4032,3024,,2815021,"",1773604734,1503496997000,1503496997000,,0,1,json@patachina,f32173d43d16b47eda3e7a32257ec956287d60b0516a5f6e46a8d1d433f53fd8,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0109.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0109_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0109_avg.jpg,,,0,53.3450055555556,-6.25331388888889,8.37461617195496 +7,1140224238,aves-remote://rid/90c0a0932fdfa3eefb64156dec5b366c4af5245def4cc619d8eee29ca72cd7fe,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0110.JPG,image/jpeg,4032,3024,,3207260,"",1773604734,1503497854000,1503497854000,,0,1,json@patachina,90c0a0932fdfa3eefb64156dec5b366c4af5245def4cc619d8eee29ca72cd7fe,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0110.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0110_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0110_avg.jpg,,,0,53.3456888888889,-6.26175555555556,11.630410654828 +8,1470736014,aves-remote://rid/4d74430aa1fbc45154ad4e8bf43bff334065ebd2757367806d4b8c165c9a7935,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0112.JPG,image/jpeg,4032,3024,,2674913,"",1773604734,1503497873000,1503497873000,,0,1,json@patachina,4d74430aa1fbc45154ad4e8bf43bff334065ebd2757367806d4b8c165c9a7935,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0112.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0112_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0112_avg.jpg,,,0,53.3456805555556,-6.26185555555556,11.9820261437908 +9,1150276078,aves-remote://rid/1955c91d411219c131c210b97fe38eb78df83be6ca12cdc845b952bcb78abc6f,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0113.JPG,image/jpeg,4032,3024,,2788605,"",1773604734,1503498970000,1503498970000,,0,1,json@patachina,1955c91d411219c131c210b97fe38eb78df83be6ca12cdc845b952bcb78abc6f,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0113.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0113_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0113_avg.jpg,,,0,53.3451777777778,-6.26584166666667,15.9843161856964 +10,1557624269,aves-remote://rid/14616f6446b0ffc01895f24db1656fa0b7a33da3b9e8c8e24065647faa2138f2,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0114.JPG,image/jpeg,4032,3024,,3447883,"",1773604734,1503504834000,1503504834000,,0,1,json@patachina,14616f6446b0ffc01895f24db1656fa0b7a33da3b9e8c8e24065647faa2138f2,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0114.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0114_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0114_avg.jpg,,,90,53.3398666666667,-6.269975,12.4432963058641 +11,1044617780,aves-remote://rid/7668b4a6cf960b548a0bd1480444a3a039a4ca59d16656d2a1a3ca80a11eaa41,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0116.JPG,image/jpeg,4032,3024,,3513469,"",1773604734,1503505103000,1503505103000,,0,1,json@patachina,7668b4a6cf960b548a0bd1480444a3a039a4ca59d16656d2a1a3ca80a11eaa41,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0116.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0116_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0116_avg.jpg,,,0,53.3400333333333,-6.27069166666667,11.4195501730104 +12,1466201148,aves-remote://rid/4a10ae72b84c6e205c8295dc1f94b5407d78f25576707fba0f3bb9093e70ce1c,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0119.JPG,image/jpeg,4032,3024,,2353262,"",1773604734,1503509034000,1503509034000,,0,1,json@patachina,4a10ae72b84c6e205c8295dc1f94b5407d78f25576707fba0f3bb9093e70ce1c,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0119.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0119_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0119_avg.jpg,,,0,53.3422972222222,-6.28371111111111,20.3343023255814 +13,1157425757,aves-remote://rid/490631b5d03e797f7ca50b5e42be1cdabafd54b20804b51d2c9565aef18de750,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0120.JPG,image/jpeg,4032,3024,,2912549,"",1773604734,1503510106000,1503510106000,,0,1,json@patachina,490631b5d03e797f7ca50b5e42be1cdabafd54b20804b51d2c9565aef18de750,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0120.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0120_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0120_avg.jpg,,,90,53.3418194444444,-6.28665,23.0946428571429 +14,1267392308,aves-remote://rid/1a9759607a60387b7ff383fce2fce32f5e5aba91c0b0d3e09c1c2763c40334be,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0122.JPG,image/jpeg,4032,3024,,2351855,"",1773604734,1503510129000,1503510129000,,0,1,json@patachina,1a9759607a60387b7ff383fce2fce32f5e5aba91c0b0d3e09c1c2763c40334be,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0122.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0122_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0122_avg.jpg,,,90,53.3417277777778,-6.28651111111111,23.021686746988 +15,1067333253,aves-remote://rid/486d095f85a006800b9d3760e2ef4ac7ba909d82ba1347800a273d99395962a3,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0123.JPG,image/jpeg,4032,3024,,1869483,"",1773604734,1503512829000,1503512829000,,0,1,json@patachina,486d095f85a006800b9d3760e2ef4ac7ba909d82ba1347800a273d99395962a3,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0123.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0123_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0123_avg.jpg,,,0,53.3419416666667,-6.28671666666667,23.6626344086022 +16,1002574570,aves-remote://rid/69eb91132640feeb561e94bb3258ca69c41e27ca711cb814c2ac33270599167a,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0124.JPG,image/jpeg,4032,3024,,1800632,"",1773604734,1503512842000,1503512842000,,0,1,json@patachina,69eb91132640feeb561e94bb3258ca69c41e27ca711cb814c2ac33270599167a,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0124.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0124_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0124_avg.jpg,,,90,53.341975,-6.28675277777778,23.8189509306261 +17,1154510684,aves-remote://rid/1da97cbc6e7914cbd33e4dbd51729cd45f1c77116c1f5be9531adeb6424eb6e2,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0125.JPG,image/jpeg,4032,3024,,1643315,"",1773604734,1503514391000,1503514391000,,0,1,json@patachina,1da97cbc6e7914cbd33e4dbd51729cd45f1c77116c1f5be9531adeb6424eb6e2,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0125.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0125_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0125_avg.jpg,,,90,53.3419305555556,-6.28595833333333,22.3709706464974 +18,1222261537,aves-remote://rid/7fbc8546424236f94107681a69ed37fa94159377cf378a44f9d0e907a2afd31a,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0126.JPG,image/jpeg,4032,3024,,1450013,"",1773604734,1503514403000,1503514403000,,0,1,json@patachina,7fbc8546424236f94107681a69ed37fa94159377cf378a44f9d0e907a2afd31a,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0126.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0126_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0126_avg.jpg,,,90,53.3419111111111,-6.286,22.4462081128748 +19,1626294670,aves-remote://rid/35772196ab28b9fd957199f81b267c9b99097055bfdcf1749e0c772241681cac,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0133.JPG,image/jpeg,4032,3024,,1606095,"",1773604734,1503514433000,1503514433000,,0,1,json@patachina,35772196ab28b9fd957199f81b267c9b99097055bfdcf1749e0c772241681cac,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0133.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0133_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0133_avg.jpg,,,90,53.3418416666667,-6.28600833333333,22.6986506746627 +20,1788253462,aves-remote://rid/48b26b6f9aaf835dd90e6098194dedfbee75b85c20429d939188e70873dd4274,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0134.JPG,image/jpeg,4032,3024,,1839090,"",1773604734,1503518935000,1503518935000,,0,1,json@patachina,48b26b6f9aaf835dd90e6098194dedfbee75b85c20429d939188e70873dd4274,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0134.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0134_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0134_avg.jpg,,,90,53.3432222222222,-6.28155277777778,23.0 +21,1159980735,aves-remote://rid/10ca45bc5aab42b5ba08da7d6a15d7f942478ca5e052f89054097c93d3dd6134,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0135.JPG,image/jpeg,4032,3024,,2013689,"",1773604734,1503519976000,1503519976000,,0,1,json@patachina,10ca45bc5aab42b5ba08da7d6a15d7f942478ca5e052f89054097c93d3dd6134,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0135.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0135_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0135_avg.jpg,,,90,53.3432805555556,-6.28151666666667,23.0 +22,1390820280,aves-remote://rid/1d4945502b8686c4f4dc3ea94bfb37db7587d505e6c411bdf11976402c000e90,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0137.JPG,image/jpeg,4032,3024,,2667599,"",1773604734,1503563815000,1503563815000,,0,1,json@patachina,1d4945502b8686c4f4dc3ea94bfb37db7587d505e6c411bdf11976402c000e90,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0137.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0137_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0137_avg.jpg,,,0,53.3412944444444,-6.2516,22.9563758389262 +23,1873525704,aves-remote://rid/bf2f60a20771c3647d605a7cc192b95a7e078b7c6530ad30462ee6a2794c9df0,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0138.JPG,image/jpeg,4032,3024,,2698118,"",1773604734,1503563819000,1503563819000,,0,1,json@patachina,bf2f60a20771c3647d605a7cc192b95a7e078b7c6530ad30462ee6a2794c9df0,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0138.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0138_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0138_avg.jpg,,,0,53.3413555555556,-6.25156111111111,22.9563758389262 +24,1362042416,aves-remote://rid/7d753539885cd882a1fdf04241eda6bfb8332ba1ed32bfc078dbadb3e5eb321f,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0139.JPG,image/jpeg,4032,3024,,2656457,"",1773604734,1503563838000,1503563838000,,0,1,json@patachina,7d753539885cd882a1fdf04241eda6bfb8332ba1ed32bfc078dbadb3e5eb321f,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0139.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0139_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0139_avg.jpg,,,0,53.3414388888889,-6.25145833333333,22.9818799546999 +25,1091352253,aves-remote://rid/29eb6ed3cd8e3d85e0803d091291b75677e6de2702918a286047894e444d669b,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0140.JPG,image/jpeg,4032,3024,,4654237,"",1773604734,1503583782000,1503583782000,,0,1,json@patachina,29eb6ed3cd8e3d85e0803d091291b75677e6de2702918a286047894e444d669b,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0140.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0140_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0140_avg.jpg,,,90,53.0105055555556,-6.32679722222222,129.976782752902 +26,1045940594,aves-remote://rid/ebaf024e4df7764c2c458484d6e6eef1ced76611dd70b84f82af46337ba13839,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0141.JPG,image/jpeg,4032,3024,,3760564,"",1773604734,1503584553000,1503584553000,,0,1,json@patachina,ebaf024e4df7764c2c458484d6e6eef1ced76611dd70b84f82af46337ba13839,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0141.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0141_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0141_avg.jpg,,,0,53.0095527777778,-6.32451666666667,138.501805054152 +27,1245266687,aves-remote://rid/c782108a839231c6dda63924f0b855747f98a4f56d8e93390f70877d4a452db6,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0143.JPG,image/jpeg,4032,3024,,3627847,"",1773604734,1503594928000,1503594928000,,0,1,json@patachina,c782108a839231c6dda63924f0b855747f98a4f56d8e93390f70877d4a452db6,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0143.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0143_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0143_avg.jpg,,,0,52.6501722222222,-7.24905,71.8359788359788 +28,1150481585,aves-remote://rid/f56db1595a3b822e1e5cc119c101904285dca3f3f1b8edbf0bfa42999583cc2f,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0145.JPG,image/jpeg,4032,3024,,1900418,"",1773604734,1503605922000,1503605922000,,0,1,json@patachina,f56db1595a3b822e1e5cc119c101904285dca3f3f1b8edbf0bfa42999583cc2f,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0145.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0145_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0145_avg.jpg,,,90,52.5192833333333,-7.88663611111111,117.002457002457 +29,1381838013,aves-remote://rid/5d03b5d0866a5cce0b6a12b78173c1f77eef5b1e5bfc5a4fd8e2cfd1c53a2b8e,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0146.JPG,image/jpeg,4032,3024,,1944490,"",1773604734,1503605929000,1503605929000,,0,1,json@patachina,5d03b5d0866a5cce0b6a12b78173c1f77eef5b1e5bfc5a4fd8e2cfd1c53a2b8e,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0146.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0146_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0146_avg.jpg,,,90,52.5192388888889,-7.88669444444444,118.549618320611 +30,1233213460,aves-remote://rid/dd715de9995fd11a23fee1df7c1561ea45bd215e765e9e93b2efc3f2ca59c39c,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0147.JPG,image/jpeg,4032,3024,,2020943,"",1773604734,1503606518000,1503606518000,,0,1,json@patachina,dd715de9995fd11a23fee1df7c1561ea45bd215e765e9e93b2efc3f2ca59c39c,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0147.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0147_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0147_avg.jpg,,,90,52.5192833333333,-7.88663888888889,117.0 +31,1194965610,aves-remote://rid/8e1a2d2abbd36803ec8670f56869ae723c4c8c8fcd5e634ada9f988c942df1b8,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0148.JPG,image/jpeg,4032,3024,,2632829,"",1773604734,1503656054000,1503656054000,,0,1,json@patachina,8e1a2d2abbd36803ec8670f56869ae723c4c8c8fcd5e634ada9f988c942df1b8,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0148.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0148_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0148_avg.jpg,,,90,52.5197305555556,-7.88870277777778,111.238961038961 +32,1680306999,aves-remote://rid/46412728d6155abe53abfec76c97898aad60e36322a46f4a4da280fba8c7c0cc,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0149.JPG,image/jpeg,4032,3024,,3300375,"",1773604734,1503656159000,1503656159000,,0,1,json@patachina,46412728d6155abe53abfec76c97898aad60e36322a46f4a4da280fba8c7c0cc,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0149.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0149_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0149_avg.jpg,,,0,52.5197333333333,-7.88949166666667,117.027237354086 +33,1748248928,aves-remote://rid/999cc0997f51584fef2627c5c9bd87d2f41cd9fe52d930fdc85f791c6adc328e,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0150.JPG,image/jpeg,5532,3898,,4461504,"",1773604734,1503656554000,1503656554000,,0,1,json@patachina,999cc0997f51584fef2627c5c9bd87d2f41cd9fe52d930fdc85f791c6adc328e,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0150.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0150_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0150_avg.jpg,,,0,52.5197305555556,-7.89075833333333,135.530864197531 +34,1115550227,aves-remote://rid/7ed0d6366274f3cadfc4caa618847c9c6c250e6b55127367d4ad1e3ca8322436,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0152.JPG,image/jpeg,5232,3872,,4964535,"",1773604734,1503656644000,1503656644000,,0,1,json@patachina,7ed0d6366274f3cadfc4caa618847c9c6c250e6b55127367d4ad1e3ca8322436,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0152.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0152_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0152_avg.jpg,,,270,52.5200611111111,-7.8907,133.491869918699 +35,1064388291,aves-remote://rid/4025ea19107cf40d092576e4aaa122bdfb027dc90592a50dd6fa8131838dae69,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0153.JPG,image/jpeg,5300,3908,,4837273,"",1773604734,1503656673000,1503656673000,,0,1,json@patachina,4025ea19107cf40d092576e4aaa122bdfb027dc90592a50dd6fa8131838dae69,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0153.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0153_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0153_avg.jpg,,,270,52.5200111111111,-7.89067777777778,133.92578125 +36,1097325735,aves-remote://rid/d91b81a39d72056b2b7eb5bbf6058cf5b5df85cd5d9ca7e2a1bc7e9b897ebfb4,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0154.JPG,image/jpeg,4032,3024,,1697485,"",1773604734,1503656711000,1503656711000,,0,1,json@patachina,d91b81a39d72056b2b7eb5bbf6058cf5b5df85cd5d9ca7e2a1bc7e9b897ebfb4,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0154.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0154_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0154_avg.jpg,,,0,52.5200666666667,-7.89070833333333,133.53431372549 +37,1516586103,aves-remote://rid/49a2098503bd07db18c869b17419352a0a2232389b3cad98cbb013ad42882600,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0155.JPG,image/jpeg,4032,3024,,1680963,"",1773604734,1503656725000,1503656725000,,0,1,json@patachina,49a2098503bd07db18c869b17419352a0a2232389b3cad98cbb013ad42882600,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0155.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0155_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0155_avg.jpg,,,90,52.5200361111111,-7.89056666666667,134.34188034188 +38,1170226716,aves-remote://rid/a856fcea4cade1ed9c59dab96f180c06f18bc97a39654301ad623aed4a4979d7,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0156.JPG,image/jpeg,3024,4032,,1502040,"",1773604734,1503656771000,1503656771000,,0,1,json@patachina,a856fcea4cade1ed9c59dab96f180c06f18bc97a39654301ad623aed4a4979d7,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0156.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0156_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0156_avg.jpg,,,0,52.5199305555556,-7.89053611111111,133.320014529604 +39,1114345044,aves-remote://rid/fd3df96d42b300c66332b98ce7639a79ae07aa0cbadf6ebbd283901bcca510c6,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0157.JPG,image/jpeg,4032,3024,,1520788,"",1773604734,1503656843000,1503656843000,,0,1,json@patachina,fd3df96d42b300c66332b98ce7639a79ae07aa0cbadf6ebbd283901bcca510c6,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0157.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0157_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0157_avg.jpg,,,90,52.5197555555556,-7.89038888888889,130.223546944858 +40,1139146041,aves-remote://rid/c8ada02d1e1b7155607e905de25546c0a079c39528fe6df0b601a9c7b5f5df93,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0160.JPG,image/jpeg,8178,3754,,4954269,"",1773604734,1503657571000,1503657571000,,0,1,json@patachina,c8ada02d1e1b7155607e905de25546c0a079c39528fe6df0b601a9c7b5f5df93,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0160.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0160_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0160_avg.jpg,,,0,52.5204694444444,-7.89060555555556,129.350974930362 +41,1715310927,aves-remote://rid/7351a37b3092015b6dee6e2911581ce590043619497ca84240b71e5ee37a0d2d,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0162.JPG,image/jpeg,4032,3024,,2747267,"",1773604734,1503666106000,1503666106000,,0,1,json@patachina,7351a37b3092015b6dee6e2911581ce590043619497ca84240b71e5ee37a0d2d,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0162.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0162_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0162_avg.jpg,,,90,51.8977805555556,-8.47415555555555,9.36507605751198 +42,1477362528,aves-remote://rid/23852fb024f46c21667b30107942c40d57429b37c0df1549ab32004a739d792f,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0163.JPG,image/jpeg,4032,3024,,2808395,"",1773604734,1503666149000,1503666149000,,0,1,json@patachina,23852fb024f46c21667b30107942c40d57429b37c0df1549ab32004a739d792f,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0163.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0163_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0163_avg.jpg,,,0,51.8977388888889,-8.47423888888889,9.51040525739321 +43,1892884989,aves-remote://rid/0ed7a1b65e9181db517fc4b75dcb3c8f398b7c3cd880ebc6d345886d070dc843,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0164.JPG,image/jpeg,4032,3024,,3137643,"",1773604734,1503666179000,1503666179000,,0,1,json@patachina,0ed7a1b65e9181db517fc4b75dcb3c8f398b7c3cd880ebc6d345886d070dc843,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0164.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0164_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0164_avg.jpg,,,0,51.8977805555556,-8.47415555555555,8.26983050847458 +44,1020250167,aves-remote://rid/64ec16ebc0611619d7c397453119ffe1f80f211b7bc9c428f65f8d761c6aa61f,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0165.JPG,image/jpeg,4032,3024,,2929880,"",1773604734,1503667517000,1503667517000,,0,1,json@patachina,64ec16ebc0611619d7c397453119ffe1f80f211b7bc9c428f65f8d761c6aa61f,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0165.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0165_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0165_avg.jpg,,,90,51.8977388888889,-8.47416666666667,9.73065476190476 +45,1288766411,aves-remote://rid/8fa73c5ac88c878b12ec926377f54e4d01187d92cc150730c514284d34581b39,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0166.JPG,image/jpeg,4032,3024,,2498451,"",1773604734,1503667524000,1503667524000,,0,1,json@patachina,8fa73c5ac88c878b12ec926377f54e4d01187d92cc150730c514284d34581b39,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0166.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0166_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0166_avg.jpg,,,90,51.8977361111111,-8.47423611111111,9.62190812720848 +46,1205885218,aves-remote://rid/ddab26bedbe3287cb210d46a2397336f879655c99224f90f8da1646ee111fee8,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0167.JPG,image/jpeg,4032,3024,,3020402,"",1773604734,1503669348000,1503669348000,,0,1,json@patachina,ddab26bedbe3287cb210d46a2397336f879655c99224f90f8da1646ee111fee8,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0167.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0167_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0167_avg.jpg,,,90,51.894675,-8.47927777777778,7.38107416879795 +47,1215517765,aves-remote://rid/a07cfd0dfca3d9377ea2f4fea5501c6403f90f4a42a5732bde8b5d31214a2a7a,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0170.JPG,image/jpeg,4032,3024,,2161605,"",1773604734,1503671202000,1503671202000,,0,1,json@patachina,a07cfd0dfca3d9377ea2f4fea5501c6403f90f4a42a5732bde8b5d31214a2a7a,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0170.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0170_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0170_avg.jpg,,,90,51.8999472222222,-8.46975833333333,14.0864691753403 +48,1484031524,aves-remote://rid/7a9382798ebaa67e80804165044390a2fded193ec5aa9753e75b62d9d54ce39a,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0171.JPG,image/jpeg,4032,3024,,2913137,"",1773604734,1503686951000,1503686951000,,0,1,json@patachina,7a9382798ebaa67e80804165044390a2fded193ec5aa9753e75b62d9d54ce39a,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0171.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0171_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0171_avg.jpg,,,90,52.0567166666667,-9.93916111111111,23.2950138504155 +49,1671668493,aves-remote://rid/9e8eb4959ed23f9dc3f8722bca1c5dd5a13ff7a6b95a0f0bf8df430d0e2ee9c3,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0172.JPG,image/jpeg,4032,3024,,3437757,"",1773604734,1503686966000,1503686966000,,0,1,json@patachina,9e8eb4959ed23f9dc3f8722bca1c5dd5a13ff7a6b95a0f0bf8df430d0e2ee9c3,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0172.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0172_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0172_avg.jpg,,,90,52.0567083333333,-9.93916111111111,23.2950138504155 +50,1004144397,aves-remote://rid/68c6d643cbe16143e9255bd3c84576e943b60412d506c090f4a7b93de3e9fd56,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0176.JPG,image/jpeg,3763,1657,,973684,"",1773604734,1503695558000,1503695558000,,0,1,json@patachina,68c6d643cbe16143e9255bd3c84576e943b60412d506c090f4a7b93de3e9fd56,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0176.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0176_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0176_avg.jpg,,,0,52.0529444444444,-9.94103888888889,50.2045088566828 +51,1009011029,aves-remote://rid/dc17f07d88bdd90f4e439911484a2a31f91acb15fcb1201115f16157eec70e66,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0178.JPG,image/jpeg,7506,3870,,4612510,"",1773604734,1503734480000,1503734480000,,0,1,json@patachina,dc17f07d88bdd90f4e439911484a2a31f91acb15fcb1201115f16157eec70e66,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0178.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0178_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0178_avg.jpg,,,0,52.0566777777778,-9.93897777777778,31.5173010380623 +52,1794385703,aves-remote://rid/4f041976518502b14f0520489ac932cfd3f9e4e9226e38b09b483327b34ad3bf,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0179.JPG,image/jpeg,5624,3958,,4484747,"",1773604734,1503734933000,1503734933000,,0,1,json@patachina,4f041976518502b14f0520489ac932cfd3f9e4e9226e38b09b483327b34ad3bf,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0179.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0179_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0179_avg.jpg,,,0,52.0566027777778,-9.93912222222222,32.3182108626198 +53,1258037603,aves-remote://rid/4a125c9271159191ab923bc14fb5398d08aef6ee5ba313a2f6b1599a52e4e0cc,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0180.JPG,image/jpeg,8968,1560,,2873334,"",1773604734,1503743055000,1503743055000,,0,1,json@patachina,4a125c9271159191ab923bc14fb5398d08aef6ee5ba313a2f6b1599a52e4e0cc,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0180.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0180_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0180_avg.jpg,,,0,51.8562888888889,-10.3671916666667,259.472727272727 +54,1686197661,aves-remote://rid/0bd35f8c46fa2ec4979d977d13bab6b8e0dc18365a0f25a7d87d81c5336c0378,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0182.JPG,image/jpeg,4032,3024,,2168733,"",1773604734,1503749114000,1503749114000,,0,1,json@patachina,0bd35f8c46fa2ec4979d977d13bab6b8e0dc18365a0f25a7d87d81c5336c0378,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0182.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0182_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0182_avg.jpg,,,90,51.8378305555556,-9.89884722222222,-1.2328990228013 +55,1786482943,aves-remote://rid/4065f86b9af59235a5727abaaccb54a9a91fa585b464da2c592db5ed300d8836,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0183.JPG,image/jpeg,4032,3024,,1891230,"",1773604734,1503749116000,1503749116000,,0,1,json@patachina,4065f86b9af59235a5727abaaccb54a9a91fa585b464da2c592db5ed300d8836,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0183.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0183_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0183_avg.jpg,,,90,51.8378222222222,-9.89883888888889,-5.13778020776381 +56,1733835872,aves-remote://rid/76ea19c9ae626658b75942ad3fb9cf4caae2b2a4b845103dac42c006a3af3984,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0185.JPG,image/jpeg,4032,3024,,1766923,"",1773604734,1503749303000,1503749303000,,0,1,json@patachina,76ea19c9ae626658b75942ad3fb9cf4caae2b2a4b845103dac42c006a3af3984,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0185.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0185_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0185_avg.jpg,,,90,51.8378555555556,-9.89896111111111,13.9998817407758 +57,1298852427,aves-remote://rid/065a80861c5452dd07586b786aad63e9d74a822cbf10913201658c54023e63cd,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0188.JPG,image/jpeg,4032,3024,,2935053,"",1773604734,1503767620000,1503767620000,,0,1,json@patachina,065a80861c5452dd07586b786aad63e9d74a822cbf10913201658c54023e63cd,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0188.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0188_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0188_avg.jpg,,,0,52.9653972222222,-9.43424444444445,159.092122830441 +58,1567128000,aves-remote://rid/e30a1427708cfc8d63a66d369781b15ac6a07b43e13550b1a7625003914503ed,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0190.JPG,image/jpeg,4032,3024,,1852261,"",1773604734,1503767749000,1503767749000,,0,1,json@patachina,e30a1427708cfc8d63a66d369781b15ac6a07b43e13550b1a7625003914503ed,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0190.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0190_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0190_avg.jpg,,,0,52.9652722222222,-9.434625,165.538258575198 +59,1117724520,aves-remote://rid/c584bb41bc73b6b452c6964622ea7e4ccfddc741ed6e1d3757ed6015b59cf65f,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0193.JPG,image/jpeg,4032,3024,,1936144,"",1773604734,1503767754000,1503767754000,,0,1,json@patachina,c584bb41bc73b6b452c6964622ea7e4ccfddc741ed6e1d3757ed6015b59cf65f,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0193.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0193_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0193_avg.jpg,,,0,52.9652944444444,-9.434625,167.757575757576 +60,1133184157,aves-remote://rid/77b822134129d751070d73441dda90996dab21186c50be2ce79064e22bba94bd,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0203.JPG,image/jpeg,4032,3024,,1843400,"",1773604734,1503768183000,1503768183000,,0,1,json@patachina,77b822134129d751070d73441dda90996dab21186c50be2ce79064e22bba94bd,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0203.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0203_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0203_avg.jpg,,,0,52.9642138888889,-9.43779444444444,174.479212253829 +61,1643286672,aves-remote://rid/be834d7663441134af0e4fc6619b1c3ae06b5ce0856beac123ac6972c5b270d7,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0204.JPG,image/jpeg,4658,3974,,4221357,"",1773604734,1503769227000,1503769227000,,0,1,json@patachina,be834d7663441134af0e4fc6619b1c3ae06b5ce0856beac123ac6972c5b270d7,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0204.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0204_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0204_avg.jpg,,,0,52.9688222222222,-9.43002777777778,149.953667953668 +62,1856866863,aves-remote://rid/6750d21dec9eb3436ce6c821b40e344ef0fb280e43081cbc5e584310711417b7,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0206.JPG,image/jpeg,7305,2311,,4179034,"",1773604734,1503769265000,1503769265000,,0,1,json@patachina,6750d21dec9eb3436ce6c821b40e344ef0fb280e43081cbc5e584310711417b7,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0206.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0206_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0206_avg.jpg,,,0,52.9688611111111,-9.42955,162.050561797753 +63,1167698908,aves-remote://rid/ea8ae33ca15f21e84d75f5b853a88ca78d722b4f461478bdccfa9c059f6b69db,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0207.JPG,image/jpeg,1680,4030,,1750381,"",1773604734,1503769375000,1503769375000,,0,1,json@patachina,ea8ae33ca15f21e84d75f5b853a88ca78d722b4f461478bdccfa9c059f6b69db,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0207.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0207_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0207_avg.jpg,,,0,52.9689361111111,-9.42912777777778,158.71615720524 +64,1063999215,aves-remote://rid/3be962052af0da265a1bd9cb69ed6868798f47343a2e1dc774c77568c20139bf,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0208.JPG,image/jpeg,4427,2389,,2046548,"",1773604734,1503769385000,1503769385000,,0,1,json@patachina,3be962052af0da265a1bd9cb69ed6868798f47343a2e1dc774c77568c20139bf,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0208.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0208_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0208_avg.jpg,,,0,52.9689027777778,-9.42917777777778,159.492574257426 +65,1306284951,aves-remote://rid/3041f044b86b8888937659a1c691db34f0c8b52b6dec6a7db023c18e9cd24722,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0209.JPG,image/jpeg,6438,3900,,4328104,"",1773604734,1503769503000,1503769503000,,0,1,json@patachina,3041f044b86b8888937659a1c691db34f0c8b52b6dec6a7db023c18e9cd24722,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0209.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0209_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0209_avg.jpg,,,0,52.9694555555556,-9.42878888888889,164.520231213873 +66,1401503525,aves-remote://rid/50c16b24a37a6d76da00bc64b0a6f96ae858ba386dd5750ce0187a7cc3402027,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0211.JPG,image/jpeg,3946,2960,,703594,"",1773604734,1503779894000,1503779894000,,0,1,json@patachina,50c16b24a37a6d76da00bc64b0a6f96ae858ba386dd5750ce0187a7cc3402027,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0211.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0211_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0211_avg.jpg,,,0,53.0089222222222,-9.39038055555556,29.118190212373 +67,1500211638,aves-remote://rid/df606e3b1a55f9f2c90e333bd113a0af2beb83a319aac9619b5b9cd729b13b0e,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0212.JPG,image/jpeg,3745,1941,,468928,"",1773604734,1503779936000,1503779936000,,0,1,json@patachina,df606e3b1a55f9f2c90e333bd113a0af2beb83a319aac9619b5b9cd729b13b0e,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0212.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0212_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0212_avg.jpg,,,0,53.0088888888889,-9.39027777777778,30.341211225997 +68,1636892470,aves-remote://rid/2454c04dd9067d2b5288dcca99c5c3eac85660779a97d6165a08ca7c37481070,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0214.JPG,image/jpeg,4032,3024,,2097953,"",1773604734,1503822184000,1503822184000,,0,1,json@patachina,2454c04dd9067d2b5288dcca99c5c3eac85660779a97d6165a08ca7c37481070,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0214.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0214_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0214_avg.jpg,,,90,53.0133083333333,-9.3872,19.4500978473581 +69,1097145062,aves-remote://rid/bc0155f7235dc0ede6921f43debb8ebe8ca44fb1db57447d26a63f6904f38bba,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0215.JPG,image/jpeg,4032,3024,,2489649,"",1773604734,1503823090000,1503823090000,,0,1,json@patachina,bc0155f7235dc0ede6921f43debb8ebe8ca44fb1db57447d26a63f6904f38bba,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0215.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0215_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0215_avg.jpg,,,0,53.0132,-9.38715,18.4987593052109 +70,1830521862,aves-remote://rid/a99f57f0bea2cb9b6caf3d0e60c3719e379d3d5bc2bbe37d1044c764214dd0b9,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0216.JPG,image/jpeg,4032,3024,,3009764,"",1773604734,1503830851000,1503830851000,,0,1,json@patachina,a99f57f0bea2cb9b6caf3d0e60c3719e379d3d5bc2bbe37d1044c764214dd0b9,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0216.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0216_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0216_avg.jpg,,,0,53.0483083333333,-9.139725,140.781512605042 +71,1855047961,aves-remote://rid/915492fbf9fc1769985e4f5684d42728b5ee63092b148b887c6d07d1fb66fe8f,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0217.JPG,image/jpeg,4032,3024,,2757600,"",1773604734,1503830943000,1503830943000,,0,1,json@patachina,915492fbf9fc1769985e4f5684d42728b5ee63092b148b887c6d07d1fb66fe8f,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0217.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0217_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0217_avg.jpg,,,0,53.0487777777778,-9.13991944444444,142.048387096774 +72,1370638735,aves-remote://rid/0c2e99aa7c89c4a124019241d0131a03877d49bef2e409be8421b93d0f15ed82,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0218.JPG,image/jpeg,4032,3024,,3442902,"",1773604734,1503830950000,1503830950000,,0,1,json@patachina,0c2e99aa7c89c4a124019241d0131a03877d49bef2e409be8421b93d0f15ed82,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0218.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0218_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0218_avg.jpg,,,0,53.0487888888889,-9.139975,142.04854368932 +73,1378706611,aves-remote://rid/a80cdc2fe8bfed0bddc25931f17f5f263ea273cca34558d9e190effa5fcc7bc9,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0223.JPG,image/jpeg,4032,3024,,3891743,"",1773604734,1503833355000,1503833355000,,0,1,json@patachina,a80cdc2fe8bfed0bddc25931f17f5f263ea273cca34558d9e190effa5fcc7bc9,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0223.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0223_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0223_avg.jpg,,,90,53.0764305555556,-9.15987222222222,100.636253041363 +74,1297823534,aves-remote://rid/308808d70076dd738c2d8d7703332dd000fb5592084ff292e2e7d2e43cac75df,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0227.JPG,image/jpeg,3162,1743,,1551495,"",1773604734,1503844208000,1503844208000,,0,1,json@patachina,308808d70076dd738c2d8d7703332dd000fb5592084ff292e2e7d2e43cac75df,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0227.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0227_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0227_avg.jpg,,,0,53.2715305555556,-9.05381111111111,12.4263322884013 +75,1820010620,aves-remote://rid/20bdd8d0c71b2e1b6a55586e2def4db18152371efbd966b98f055ba340bf471a,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0228.JPG,image/jpeg,4032,3024,,1257412,"",1773604734,1503857624000,1503857624000,,0,1,json@patachina,20bdd8d0c71b2e1b6a55586e2def4db18152371efbd966b98f055ba340bf471a,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0228.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0228_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0228_avg.jpg,,,90,53.4840166666667,-9.97761944444444,40.7386888273315 +76,1788987801,aves-remote://rid/37df228c1e983e94e3abea8800b04660e647034fca4948ef45ed6ec69d468687,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0229.JPG,image/jpeg,4032,3024,,2405533,"",1773604734,1503862949000,1503862949000,,0,1,json@patachina,37df228c1e983e94e3abea8800b04660e647034fca4948ef45ed6ec69d468687,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0229.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0229_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0229_avg.jpg,,,90,53.4887277777778,-10.0223944444444,16.3738959764475 +77,1067439266,aves-remote://rid/1a4313d5086018efcd689dbca06040d99a75f7b331798b0fa2ced0d25dea95b7,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0232.JPG,image/jpeg,4032,3024,,2066043,"",1773604734,1503909783000,1503909783000,,0,1,json@patachina,1a4313d5086018efcd689dbca06040d99a75f7b331798b0fa2ced0d25dea95b7,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0232.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0232_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0232_avg.jpg,,,90,53.4879888888889,-10.0105555555556,17.3643178410795 +78,1251066349,aves-remote://rid/6ab20a650288559438d81881ade44773873472c54d4d8cbbe69aaf2337c9d92b,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0233.JPG,image/jpeg,4032,3024,,4708675,"",1773604734,1503916727000,1503916727000,,0,1,json@patachina,6ab20a650288559438d81881ade44773873472c54d4d8cbbe69aaf2337c9d92b,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0233.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0233_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0233_avg.jpg,,,90,53.5616,-9.91743055555555,25.3661417322835 +79,1874963301,aves-remote://rid/6cf111099d98f97b09cf7a397d9ef6c849693e8273bf6026e0af0f257c0240bc,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0234.JPG,image/jpeg,4032,3024,,4888844,"",1773604734,1503916733000,1503916733000,,0,1,json@patachina,6cf111099d98f97b09cf7a397d9ef6c849693e8273bf6026e0af0f257c0240bc,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0234.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0234_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0234_avg.jpg,,,90,53.5616305555556,-9.91740833333333,25.6041724617524 +80,1866412850,aves-remote://rid/e830691975e126ad19891ea10585409a551791e8d0e8c6eda7e9d5e7878ce6a2,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0235.JPG,image/jpeg,4032,3024,,4413193,"",1773604734,1503916750000,1503916750000,,0,1,json@patachina,e830691975e126ad19891ea10585409a551791e8d0e8c6eda7e9d5e7878ce6a2,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0235.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0235_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0235_avg.jpg,,,90,53.5616722222222,-9.91726944444444,25.2461139896373 +81,1668659604,aves-remote://rid/9fabc411f90e2a1452f4880b21ee6cdfb14c1274ce8c7a9a23c30444f07b370b,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0237.JPG,image/jpeg,3630,3790,,3314673,"",1773604734,1503916764000,1503916764000,,0,1,json@patachina,9fabc411f90e2a1452f4880b21ee6cdfb14c1274ce8c7a9a23c30444f07b370b,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0237.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0237_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0237_avg.jpg,,,270,53.5616694444444,-9.91726388888889,25.1903614457831 +82,1193505713,aves-remote://rid/3846bf7e160007e43c6de5a612b3384ad4235276b7ac86284fd2a7e45a3b0a27,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0241.JPG,image/jpeg,4032,3024,,1745323,"",1773604734,1504001722000,1504001722000,,0,1,json@patachina,3846bf7e160007e43c6de5a612b3384ad4235276b7ac86284fd2a7e45a3b0a27,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0241.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0241_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0241_avg.jpg,,,0,53.4199361111111,-6.94059722222222,72.5619967793881 +83,1299938908,aves-remote://rid/b4fec8470cd605882c09ec97558d3a737d25a43488adfb903c3573f8b1fb5ebc,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0242.JPG,image/jpeg,4032,3024,,1242828,"",1773604734,1504005466000,1504005466000,,0,1,json@patachina,b4fec8470cd605882c09ec97558d3a737d25a43488adfb903c3573f8b1fb5ebc,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0242.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0242_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0242_avg.jpg,,,0,53.1860111111111,-6.87943888888889,120.114695340502 +84,1879601327,aves-remote://rid/b864196e118aa2b40142438c2e28df587c53fb27e6d4e24fa9b98a00cecccdc9,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0243.JPG,image/jpeg,4032,3024,,3347118,"",1773604734,1504005486000,1504005486000,,0,1,json@patachina,b864196e118aa2b40142438c2e28df587c53fb27e6d4e24fa9b98a00cecccdc9,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0243.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0243_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0243_avg.jpg,,,0,53.1858,-6.87960833333333,111.824541284404 +85,1126971033,aves-remote://rid/b1f9d25d6d7217c01a3a67f59176d54ce73b1bb626a687d1447a5354e5cad020,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0244.JPG,image/jpeg,4032,3024,,4832084,"",1773604734,1504006676000,1504006676000,,0,1,json@patachina,b1f9d25d6d7217c01a3a67f59176d54ce73b1bb626a687d1447a5354e5cad020,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0244.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0244_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0244_avg.jpg,,,90,53.1446416666667,-6.90140833333333,83.1320754716981 +86,1427255665,aves-remote://rid/e9549aa2bb21ad70ff35ad1626cf15f6cb62a321e25e3e7ab832bd9e7430e186,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0245.JPG,image/jpeg,4032,3024,,4210606,"",1773604734,1504006732000,1504006732000,,0,1,json@patachina,e9549aa2bb21ad70ff35ad1626cf15f6cb62a321e25e3e7ab832bd9e7430e186,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0245.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0245_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0245_avg.jpg,,,90,53.1446333333333,-6.90120555555556,104.186679174484 +87,1705035479,aves-remote://rid/b8013a96d80b1a6c3b39384f0910ff1f4507fcbf6936b90472d066f75772e751,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0246.JPG,image/jpeg,4032,3024,,4047020,"",1773604734,1504006811000,1504006811000,,0,1,json@patachina,b8013a96d80b1a6c3b39384f0910ff1f4507fcbf6936b90472d066f75772e751,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0246.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0246_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0246_avg.jpg,,,0,53.1444083333333,-6.90123888888889,122.443243243243 +88,1645583906,aves-remote://rid/d32b08d40cee22365e0193a7372cf85e997501d1e5e6d67b80aaddd569ee7030,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0247.JPG,image/jpeg,4032,3024,,3155785,"",1773604734,1504006896000,1504006896000,,0,1,json@patachina,d32b08d40cee22365e0193a7372cf85e997501d1e5e6d67b80aaddd569ee7030,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0247.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0247_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0247_avg.jpg,,,90,53.1444861111111,-6.90139444444444,101.991319444444 +89,1250037761,aves-remote://rid/0402bf83d35731c94314d6333cea4350e725209307a45fe6fe548ae04bf2e763,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0248.JPG,image/jpeg,4032,3024,,4551844,"",1773604734,1504007112000,1504007112000,,0,1,json@patachina,0402bf83d35731c94314d6333cea4350e725209307a45fe6fe548ae04bf2e763,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0248.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0248_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0248_avg.jpg,,,90,53.1442611111111,-6.90213055555556,117.170491803279 +90,1564301608,aves-remote://rid/10e4a1c655829f11ad8f465cfc1e105e7430b9c0bf36f5589624cd5932c50457,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0249.JPG,image/jpeg,4032,3024,,4772193,"",1773604734,1504007140000,1504007140000,,0,1,json@patachina,10e4a1c655829f11ad8f465cfc1e105e7430b9c0bf36f5589624cd5932c50457,/photos/Fabio/original/2017Irlanda19-29ago/IMG_0249.JPG,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0249_min.jpg,/photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0249_avg.jpg,,,90,53.1442083333333,-6.90205555555556,90.4784688995215 +13555,1000018529,content://media/external/video/media/1000018529,/storage/emulated/0/DCIM/Camera/VID_20250204_104639.mp4,video/mp4,1920,1080,90,122129847,,1738662399,1738662449402,1738662447000,46831,0,0,,,,,,,,,,, +13556,1000018528,content://media/external/video/media/1000018528,/storage/emulated/0/DCIM/Camera/VID_20250204_104615.mp4,video/mp4,1920,1080,90,4954519,,1738662375,1738662380450,1738662378000,1429,0,0,,,,,,,,,,, +13557,1000017577,content://media/external/video/media/1000017577,/storage/emulated/0/Movies/youcut/YouCut_20230406_115557563.mp4,video/mp4,480,854,0,23088431,,1680774974,1680774974529,0,43769,0,0,,,,,,,,,,, +13558,1000017576,content://media/external/video/media/1000017576,/storage/emulated/0/Movies/youcut/YouCut_20230406_115352610.mp4,video/mp4,480,854,0,23106418,,1680774876,1680774876501,0,43753,0,0,,,,,,,,,,, +13559,1000017571,content://media/external/video/media/1000017571,/storage/emulated/0/DCIM/Camera/VID_20230406_114322.mp4,video/mp4,1920,1080,90,423510599,,1680774202,1680774371872,1680774370000,166241,0,0,,,,,,,,,,, +13560,1000017570,content://media/external/video/media/1000017570,/storage/emulated/0/Movies/youcut/YouCut_20230406_095900058.mp4,video/mp4,640,1138,0,93360590,,1680767983,1680767984061,0,104230,0,0,,,,,,,,,,, +13561,1000017569,content://media/external/video/media/1000017569,/storage/emulated/0/DCIM/Camera/VID_20230406_094301.mp4,video/mp4,1920,1080,90,463585431,,1680766981,1680767196377,1680767195000,212806,0,0,,,,,,,,,,, +13562,1000017568,content://media/external/video/media/1000017568,/storage/emulated/0/DCIM/Camera/VID_20230406_094058.mp4,video/mp4,1920,1080,90,262535089,,1680766858,1680766965037,1680766964000,104221,0,0,,,,,,,,,,, +13563,1000017567,content://media/external/video/media/1000017567,/storage/emulated/0/DCIM/Camera/VID_20230406_093958.mp4,video/mp4,1920,1080,90,104709206,,1680766798,1680766856149,1680766855000,55791,0,0,,,,,,,,,,, +13564,1000017566,content://media/external/video/media/1000017566,/storage/emulated/0/DCIM/Camera/VID_20230406_093943.mp4,video/mp4,1920,1080,90,11759440,,1680766783,1680766789381,1680766789000,3863,0,0,,,,,,,,,,, +13565,1000017565,content://media/external/video/media/1000017565,/storage/emulated/0/DCIM/Camera/VID_20230406_093928.mp4,video/mp4,1920,1080,90,2058848,,1680766768,1680766777597,1680766777000,7327,0,0,,,,,,,,,,, +13566,1000017564,content://media/external/video/media/1000017564,/storage/emulated/0/DCIM/Camera/VID_20230406_093833.mp4,video/mp4,1920,1080,90,41058060,,1680766713,1680766730769,1680766730000,15573,0,0,,,,,,,,,,, +13567,1000017563,content://media/external/video/media/1000017563,/storage/emulated/0/DCIM/Camera/VID_20230406_093757.mp4,video/mp4,1920,1080,90,75715258,,1680766677,1680766711145,1680766710000,31709,0,0,,,,,,,,,,, +13568,1000017562,content://media/external/video/media/1000017562,/storage/emulated/0/DCIM/Camera/VID_20230406_093744.mp4,video/mp4,1920,1080,90,19372133,,1680766664,1680766672869,1680766672000,6528,0,0,,,,,,,,,,, +13569,1000017557,content://media/external/video/media/1000017557,/storage/emulated/0/DCIM/Camera/VID_20230406_092500.mp4,video/mp4,1920,1080,90,409664958,,1680765900,1680766104197,1680766103000,200848,0,0,,,,,,,,,,, +13570,1000017555,content://media/external/video/media/1000017555,/storage/emulated/0/DCIM/Camera/VID_20230406_092103.mp4,video/mp4,1920,1080,90,223932873,,1680765663,1680765751881,1680765750000,85592,0,0,,,,,,,,,,, +13571,1000017089,content://media/external/video/media/1000017089,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230214-WA0009.mp4",video/mp4,432,640,0,1214691,,1676390519,1676390521575,0,13792,0,0,,,,,,,,,,, +13572,1000016883,content://media/external/video/media/1000016883,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230209-WA0013.mp4",video/mp4,640,352,0,18524455,,1675981555,1675981562086,0,71981,0,0,,,,,,,,,,, +13573,1000016879,content://media/external/video/media/1000016879,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230209-WA0012.mp4",video/mp4,640,352,0,15117079,,1675981506,1675981523703,0,57285,0,0,,,,,,,,,,, +13574,1000016817,content://media/external/video/media/1000016817,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230208-WA0013.mp4",video/mp4,640,352,0,33152637,,1675893941,1675897085669,0,168490,0,0,,,,,,,,,,, +13575,1000016602,content://media/external/video/media/1000016602,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230205-WA0003.mp4",video/mp4,224,288,0,63877,,1675595349,1675595349713,0,3202,0,0,,,,,,,,,,, +13576,1000016485,content://media/external/video/media/1000016485,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230201-WA0004.mp4",video/mp4,640,352,90,7086727,,1675260006,1675260011334,0,25024,0,0,,,,,,,,,,, +13577,1000016404,content://media/external/video/media/1000016404,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230130-WA0002.mp4",video/mp4,576,1024,0,6629921,,1675077148,1675077151990,0,22200,0,0,,,,,,,,,,, +13578,1000016342,content://media/external/video/media/1000016342,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230128-WA0010.mp4",video/mp4,320,180,0,11183703,,1674925437,1674925443377,0,230063,0,0,,,,,,,,,,, +13579,1000016225,content://media/external/video/media/1000016225,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230125-WA0002.mp4",video/mp4,368,480,0,3238791,,1674653930,1674653932324,0,16068,0,0,,,,,,,,,,, +13580,1000016223,content://media/external/video/media/1000016223,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230125-WA0001.mp4",video/mp4,386,386,0,125649,,1674647711,1674647711832,0,1640,0,0,,,,,,,,,,, +13581,1000016101,content://media/external/video/media/1000016101,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230123-WA0000.mp4",video/mp4,480,848,0,8394246,,1674457555,1674457561061,0,41076,0,0,,,,,,,,,,, +13582,1000016072,content://media/external/video/media/1000016072,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp video/VID-20230122-WA0002.mp4",video/mp4,640,352,90,14859422,,1674386242,1674386248003,0,61354,0,0,,,,,,,,,,, +13583,1000016065,content://media/external/video/media/1000016065,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230122-WA0000.mp4",video/mp4,352,640,0,6559639,,1674378853,1674378855730,0,25557,0,0,,,,,,,,,,, +13584,1000016053,content://media/external/video/media/1000016053,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230121-WA0018.mp4",video/mp4,640,352,0,31856363,,1674313737,1674313754132,0,147517,0,0,,,,,,,,,,, +13585,1000016017,content://media/external/video/media/1000016017,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230121-WA0007.mp4",video/mp4,640,352,180,594378,,1674303877,1674303878135,0,3221,0,0,,,,,,,,,,, +13586,1000015928,content://media/external/video/media/1000015928,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230119-WA0006.mp4",video/mp4,848,480,90,1168997,,1674154092,1674154093608,0,5456,0,0,,,,,,,,,,, +13587,1000015924,content://media/external/video/media/1000015924,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230119-WA0005.mp4",video/mp4,480,848,0,1246264,,1674148581,1674148582720,0,7755,0,0,,,,,,,,,,, +13588,1000015872,content://media/external/video/media/1000015872,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230117-WA0001.mp4",video/mp4,576,1028,0,1096734,,1673970844,1673970846126,0,13444,0,0,,,,,,,,,,, +13589,1000015852,content://media/external/video/media/1000015852,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230116-WA0009.mp4",video/mp4,640,352,0,6081845,,1673901213,1673901216285,0,75520,0,0,,,,,,,,,,, +13590,1000015848,content://media/external/video/media/1000015848,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230116-WA0008.mp4",video/mp4,640,352,90,10515248,,1673892856,1673892860654,0,39853,0,0,,,,,,,,,,, +13591,1000015791,content://media/external/video/media/1000015791,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230115-WA0003.mp4",video/mp4,258,258,0,223602,,1673780647,1673780648936,0,2800,0,0,,,,,,,,,,, +13592,1000015734,content://media/external/video/media/1000015734,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230114-WA0016.mp4",video/mp4,640,352,90,17576102,,1673691080,1673695630431,0,58922,0,0,,,,,,,,,,, +13593,1000015742,content://media/external/video/media/1000015742,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230114-WA0018.mp4",video/mp4,640,352,90,3170326,,1673691465,1673691466537,0,11605,0,0,,,,,,,,,,, +13594,1000015738,content://media/external/video/media/1000015738,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230114-WA0017.mp4",video/mp4,640,352,90,12755127,,1673691121,1673691158032,0,41045,0,0,,,,,,,,,,, +13595,1000015697,content://media/external/video/media/1000015697,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp video/VID-20230114-WA0004.mp4",video/mp4,640,352,90,6906775,,1673690399,1673690403188,0,21930,0,0,,,,,,,,,,, +13596,1000015635,content://media/external/video/media/1000015635,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230113-WA0001.mp4",video/mp4,160,92,0,44657,,1673612396,1673612396729,0,4880,0,0,,,,,,,,,,, +13597,1000015628,content://media/external/video/media/1000015628,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230113-WA0000.mp4",video/mp4,480,480,0,57087,,1673594928,1673594928848,0,420,0,0,,,,,,,,,,, +13598,1000015510,content://media/external/video/media/1000015510,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230110-WA0006.mp4",video/mp4,640,352,0,18733759,,1673365616,1673365623404,0,71964,0,0,,,,,,,,,,, +13599,1000015504,content://media/external/video/media/1000015504,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230110-WA0004.mp4",video/mp4,640,352,180,17381225,,1673364596,1673364602278,0,66944,0,0,,,,,,,,,,, +13600,1000015362,content://media/external/video/media/1000015362,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230106-WA0012.mp4",video/mp4,640,352,90,3987642,,1673009630,1673009670736,0,22139,0,0,,,,,,,,,,, +13601,1000015355,content://media/external/video/media/1000015355,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230106-WA0010.mp4",video/mp4,640,352,90,1602686,,1673009597,1673009629537,0,8746,0,0,,,,,,,,,,, +13602,1000015345,content://media/external/video/media/1000015345,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230106-WA0007.mp4",video/mp4,640,352,90,2711198,,1673009570,1673009596363,0,15168,0,0,,,,,,,,,,, +13603,1000015335,content://media/external/video/media/1000015335,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230106-WA0003.mp4",video/mp4,294,350,0,50023,,1673001333,1673001333742,0,2040,0,0,,,,,,,,,,, +13604,1000015242,content://media/external/video/media/1000015242,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230104-WA0006.mp4",video/mp4,640,352,0,15408715,,1672870189,1672870199173,0,84074,0,0,,,,,,,,,,, +13605,1000015200,content://media/external/video/media/1000015200,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230103-WA0001.mp4",video/mp4,640,352,90,5190458,,1672750731,1672750734092,0,29162,0,0,,,,,,,,,,, +13606,1000015155,content://media/external/video/media/1000015155,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230102-WA0001.mp4",video/mp4,640,352,0,26427520,,1672655930,1672655950805,0,120072,0,0,,,,,,,,,,, +13607,1000015130,content://media/external/video/media/1000015130,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0030.mp4",video/mp4,480,848,0,2739789,,1672577891,1672577893359,0,12817,0,0,,,,,,,,,,, +13608,1000015126,content://media/external/video/media/1000015126,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0029.mp4",video/mp4,352,640,0,894546,,1672575271,1672575309860,0,3370,0,0,,,,,,,,,,, +13609,1000015122,content://media/external/video/media/1000015122,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0028.mp4",video/mp4,480,480,0,5866263,,1672574009,1672574011598,0,61509,0,0,,,,,,,,,,, +13610,1000015111,content://media/external/video/media/1000015111,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230101-WA0024.mp4",video/mp4,354,354,0,84318,,1672569209,1672569210049,0,1400,0,0,,,,,,,,,,, +13611,1000015089,content://media/external/video/media/1000015089,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0019.mp4",video/mp4,352,640,0,1148426,,1672534230,1672534231325,0,4458,0,0,,,,,,,,,,, +13612,1000015085,content://media/external/video/media/1000015085,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0018.mp4",video/mp4,352,640,0,1572747,,1672532458,1672532459273,0,5944,0,0,,,,,,,,,,, +13613,1000015066,content://media/external/video/media/1000015066,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0012.mp4",video/mp4,400,304,0,987692,,1672530428,1672530430745,0,15000,0,0,,,,,,,,,,, +13614,1000015062,content://media/external/video/media/1000015062,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0011.mp4",video/mp4,640,352,0,30465215,,1672529924,1672529951962,0,145498,0,0,,,,,,,,,,, +13615,1000015058,content://media/external/video/media/1000015058,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0010.mp4",video/mp4,576,576,0,5130476,,1672529670,1672529678616,0,72006,0,0,,,,,,,,,,, +13616,1000015056,content://media/external/video/media/1000015056,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230101-WA0009.mp4",video/mp4,512,512,0,34140,,1672529528,1672529528897,0,450,0,0,,,,,,,,,,, +13617,1000015052,content://media/external/video/media/1000015052,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0008.mp4",video/mp4,544,640,0,1835184,,1672528886,1672528887992,0,19760,0,0,,,,,,,,,,, +13618,1000015050,content://media/external/video/media/1000015050,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230101-WA0007.mp4",video/mp4,192,192,0,74080,,1672528821,1672528821260,0,3991,0,0,,,,,,,,,,, +13619,1000015040,content://media/external/video/media/1000015040,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0004.mp4",video/mp4,480,848,0,10628778,,1672528124,1672528136340,0,66641,0,0,,,,,,,,,,, +13620,1000015036,content://media/external/video/media/1000015036,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0003.mp4",video/mp4,640,352,0,11787358,,1672528027,1672528035188,0,43882,0,0,,,,,,,,,,, +13621,1000014982,content://media/external/video/media/1000014982,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221231-WA0022.mp4",video/mp4,112,144,0,71096,,1672510927,1672510927576,0,2250,0,0,,,,,,,,,,, +13622,1000014978,content://media/external/video/media/1000014978,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221231-WA0021.mp4",video/mp4,432,240,0,2691444,,1672510301,1672510303149,0,47391,0,0,,,,,,,,,,, +13623,1000014971,content://media/external/video/media/1000014971,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221231-WA0018.mp4",video/mp4,416,256,0,93677,,1672506287,1672506287439,0,1805,0,0,,,,,,,,,,, +13624,1000014963,content://media/external/video/media/1000014963,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221231-WA0015.mp4",video/mp4,452,378,0,102601,,1672504770,1672504785641,0,1960,0,0,,,,,,,,,,, +13625,1000014927,content://media/external/video/media/1000014927,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221231-WA0001.mp4",video/mp4,432,240,0,2735597,,1672491395,1672493179411,0,47391,0,0,,,,,,,,,,, +13626,1000014783,content://media/external/video/media/1000014783,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221228-WA0002.mp4",video/mp4,640,352,90,3682952,,1672226652,1672226654186,0,13290,0,0,,,,,,,,,,, +13627,1000014670,content://media/external/video/media/1000014670,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221225-WA0029.mp4",video/mp4,400,400,0,118985,,1671984921,1671984921796,0,1682,0,0,,,,,,,,,,, +13628,1000014657,content://media/external/video/media/1000014657,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0025.mp4",video/mp4,640,352,0,924297,,1671976523,1671976525692,0,8512,0,0,,,,,,,,,,, +13629,1000014631,content://media/external/video/media/1000014631,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0017.mp4",video/mp4,576,1024,0,1290948,,1671962265,1671962268074,0,18134,0,0,,,,,,,,,,, +13630,1000014623,content://media/external/video/media/1000014623,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221225-WA0014.mp4",video/mp4,432,432,0,91851,,1671959440,1671959440339,0,1360,0,0,,,,,,,,,,, +13631,1000014619,content://media/external/video/media/1000014619,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0013.mp4",video/mp4,848,480,0,6070972,,1671959077,1671959088171,0,29698,0,0,,,,,,,,,,, +13632,1000014613,content://media/external/video/media/1000014613,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0011.mp4",video/mp4,640,352,90,2482890,,1671958851,1671958855972,0,9216,0,0,,,,,,,,,,, +13633,1000014605,content://media/external/video/media/1000014605,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221225-WA0009.mp4",video/mp4,480,336,0,49147,,1671956919,1671956919583,0,984,0,0,,,,,,,,,,, +13634,1000014597,content://media/external/video/media/1000014597,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221225-WA0006.mp4",video/mp4,224,160,0,35812,,1671955348,1671955348509,0,1777,0,0,,,,,,,,,,, +13635,1000014579,content://media/external/video/media/1000014579,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0001.mp4",video/mp4,720,1280,0,7947490,,1671936654,1671936660930,0,52825,0,0,,,,,,,,,,, +13636,1000014542,content://media/external/video/media/1000014542,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0018.mp4",video/mp4,512,640,0,16769016,,1671905903,1671905911632,0,36469,0,0,,,,,,,,,,, +13637,1000014535,content://media/external/video/media/1000014535,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0016.mp4",video/mp4,1280,720,0,20853533,,1671904115,1671904125167,0,74005,0,0,,,,,,,,,,, +13638,1000014504,content://media/external/video/media/1000014504,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0008.mp4",video/mp4,720,720,0,6235238,,1671886204,1671886210249,0,77763,0,0,,,,,,,,,,, +13639,1000014480,content://media/external/video/media/1000014480,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0001.mp4",video/mp4,480,848,0,16780560,,1671869816,1671869824546,0,87701,0,0,,,,,,,,,,, +13640,1000014476,content://media/external/video/media/1000014476,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0000.mp4",video/mp4,400,400,0,7059204,,1671869211,1671869215230,0,82709,0,0,,,,,,,,,,, +13641,1000014448,content://media/external/video/media/1000014448,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0011.mp4",video/mp4,768,768,0,7199235,,1671811977,1671811981740,0,18633,0,0,,,,,,,,,,, +13642,1000014443,content://media/external/video/media/1000014443,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0010.mp4",video/mp4,480,848,0,16910738,,1671807629,1671807636585,0,87724,0,0,,,,,,,,,,, +13643,1000014439,content://media/external/video/media/1000014439,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0009.mp4",video/mp4,640,352,90,7981047,,1671807385,1671807388678,0,29099,0,0,,,,,,,,,,, +13644,1000014407,content://media/external/video/media/1000014407,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0004.mp4",video/mp4,480,848,0,4368109,,1671783017,1671783019924,0,24032,0,0,,,,,,,,,,, +13645,1000014403,content://media/external/video/media/1000014403,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0003.mp4",video/mp4,640,480,90,50037036,,1671778755,1671778777751,0,84157,0,0,,,,,,,,,,, +13646,1000014345,content://media/external/video/media/1000014345,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221221-WA0011.mp4",video/mp4,640,352,90,65764308,,1671650799,1671652515636,0,502976,0,0,,,,,,,,,,, +13647,1000014326,content://media/external/video/media/1000014326,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221221-WA0007.mp4",video/mp4,640,352,90,4808779,,1671642416,1671642423664,0,18346,0,0,,,,,,,,,,, +13648,1000014222,content://media/external/video/media/1000014222,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221218-WA0015.mp4",video/mp4,300,170,0,311527,,1671400584,1671400585209,0,1200,0,0,,,,,,,,,,, +13649,1000014215,content://media/external/video/media/1000014215,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221218-WA0013.mp4",video/mp4,352,640,0,9079910,,1671384842,1671384847799,0,17531,0,0,,,,,,,,,,, +13650,1000014197,content://media/external/video/media/1000014197,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221218-WA0009.mp4",video/mp4,960,540,0,11621486,,1671376466,1671376472337,0,40840,0,0,,,,,,,,,,, +13651,1000014188,content://media/external/video/media/1000014188,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221218-WA0007.mp4",video/mp4,640,352,0,14812926,,1671370371,1671370377617,0,60117,0,0,,,,,,,,,,, +13652,1000014166,content://media/external/video/media/1000014166,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221218-WA0001.mp4",video/mp4,352,640,0,4967699,,1671356575,1671356577446,0,19136,0,0,,,,,,,,,,, +13653,1000014147,content://media/external/video/media/1000014147,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221217-WA0010.mp4",video/mp4,320,174,0,78148,,1671306479,1671306479810,0,2000,0,0,,,,,,,,,,, +13654,1000014120,content://media/external/video/media/1000014120,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221217-WA0004.mp4",video/mp4,640,352,90,3918882,,1671280491,1671280498133,0,15253,0,0,,,,,,,,,,, +13655,1000014054,content://media/external/video/media/1000014054,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221215-WA0001.mp4",video/mp4,480,544,0,4247367,,1671111400,1671111402255,0,30812,0,0,,,,,,,,,,, +13656,1000013850,content://media/external/video/media/1000013850,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221208-WA0022.mp4",video/mp4,640,352,90,8977481,,1670522483,1670522517247,0,33130,0,0,,,,,,,,,,, +13657,1000013843,content://media/external/video/media/1000013843,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221208-WA0020.mp4",video/mp4,624,480,0,1351783,,1670514482,1670514488886,0,9589,0,0,,,,,,,,,,, +13658,1000013787,content://media/external/video/media/1000013787,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221208-WA0009.mp4",video/mp4,640,640,0,118327,,1670457361,1670457362201,0,1123,0,0,,,,,,,,,,, +13659,1000013783,content://media/external/video/media/1000013783,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221208-WA0008.mp4",video/mp4,848,480,0,3014716,,1670455715,1670455717020,0,14164,0,0,,,,,,,,,,, +13660,1000013770,content://media/external/video/media/1000013770,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221208-WA0004.mp4",video/mp4,848,480,90,9648120,,1670455709,1670455714247,0,47717,0,0,,,,,,,,,,, +13661,1000013735,content://media/external/video/media/1000013735,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221207-WA0007.mp4",video/mp4,640,352,0,67826213,,1670424582,1670424606461,0,682218,0,0,,,,,,,,,,, +13662,1000013731,content://media/external/video/media/1000013731,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221207-WA0006.mp4",video/mp4,640,352,0,20376283,,1670424175,1670424195010,0,123626,0,0,,,,,,,,,,, +13663,1000013585,content://media/external/video/media/1000013585,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221202-WA0000.mp4",video/mp4,506,360,0,3174196,,1669995245,1669995248534,0,71471,0,0,,,,,,,,,,, +13664,1000013568,content://media/external/video/media/1000013568,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221201-WA0000.mp4",video/mp4,136,202,0,96539,,1669883811,1669883811817,0,4500,0,0,,,,,,,,,,, +13665,1000013520,content://media/external/video/media/1000013520,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221129-WA0009.mp4",video/mp4,480,320,0,4521215,,1669740748,1669740771903,0,28699,0,0,,,,,,,,,,, +13666,1000013368,content://media/external/video/media/1000013368,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221128-WA0000.mp4",video/mp4,848,480,0,30289656,,1669590876,1669590890280,0,169203,0,0,,,,,,,,,,, +13667,1000013356,content://media/external/video/media/1000013356,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221127-WA0001.mp4",video/mp4,640,352,90,3817573,,1669548716,1669548719358,0,14506,0,0,,,,,,,,,,, +13668,1000013154,content://media/external/video/media/1000013154,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221123-WA0008.mp4",video/mp4,848,480,90,2594336,,1669243935,1669243941836,0,12306,0,0,,,,,,,,,,, +13669,1000013083,content://media/external/video/media/1000013083,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221122-WA0001.mp4",video/mp4,352,640,0,8682798,,1669123240,1669123243604,0,80576,0,0,,,,,,,,,,, +13670,1000012975,content://media/external/video/media/1000012975,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221120-WA0019.mp4",video/mp4,640,352,0,2571389,,1668976606,1668976611726,0,9664,0,0,,,,,,,,,,, +13671,1000012962,content://media/external/video/media/1000012962,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221120-WA0014.mp4",video/mp4,848,480,0,5743455,,1668968676,1668968681202,0,27445,0,0,,,,,,,,,,, +13672,1000012948,content://media/external/video/media/1000012948,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221120-WA0010.mp4",video/mp4,640,352,0,6319785,,1668966878,1668966881497,0,24320,0,0,,,,,,,,,,, +13673,1000012938,content://media/external/video/media/1000012938,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221120-WA0007.mp4",video/mp4,320,212,0,91795,,1668961226,1668961226357,0,2071,0,0,,,,,,,,,,, +13674,1000012911,content://media/external/video/media/1000012911,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221120-WA0000.mp4",video/mp4,640,352,90,4089917,,1668931558,1668931563865,0,14794,0,0,,,,,,,,,,, +13675,1000012703,content://media/external/video/media/1000012703,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221115-WA0008.mp4",video/mp4,640,352,90,7442104,,1668521044,1668521047266,0,26538,0,0,,,,,,,,,,, +13676,1000012683,content://media/external/video/media/1000012683,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221115-WA0003.mp4",video/mp4,576,1024,0,1984187,,1668503045,1668503047619,0,17507,0,0,,,,,,,,,,, +13677,1000012582,content://media/external/video/media/1000012582,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221112-WA0010.mp4",video/mp4,640,304,90,5727832,,1668292429,1668292432348,0,22566,0,0,,,,,,,,,,, +13678,1000012525,content://media/external/video/media/1000012525,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221111-WA0001.mp4",video/mp4,224,168,0,129058,,1668166061,1668166061746,0,2999,0,0,,,,,,,,,,, +13679,1000012304,content://media/external/video/media/1000012304,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221105-WA0003.mp4",video/mp4,640,352,0,5288928,,1667643905,1667643915061,0,29845,0,0,,,,,,,,,,, +13680,1000012247,content://media/external/video/media/1000012247,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221104-WA0002.mp4",video/mp4,848,480,0,10460352,,1667550236,1667550241753,0,51803,0,0,,,,,,,,,,, +13681,1000012188,content://media/external/video/media/1000012188,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0010.mp4",video/mp4,640,352,0,14339435,,1667427665,1667427673698,0,68650,0,0,,,,,,,,,,, +13682,1000012153,content://media/external/video/media/1000012153,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0007.mp4",video/mp4,1920,1080,0,59296731,,1667379194,1667406562737,0,9962,0,0,,,,,,,,,,, +13683,1000012175,content://media/external/video/media/1000012175,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0005.mp4",video/mp4,640,352,90,23362952,,1667392322,1667392337162,0,105088,0,0,,,,,,,,,,, +13684,1000012165,content://media/external/video/media/1000012165,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0002.mp4",video/mp4,640,352,90,15177537,,1667389216,1667389223313,0,62890,0,0,,,,,,,,,,, +13685,1000012161,content://media/external/video/media/1000012161,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0001.mp4",video/mp4,640,352,90,8518757,,1667389198,1667389208416,0,33365,0,0,,,,,,,,,,, +13686,1000012105,content://media/external/video/media/1000012105,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221031-WA0035.mp4",video/mp4,640,352,270,3296961,,1667255619,1667255632372,0,11584,0,0,,,,,,,,,,, +13687,1000012022,content://media/external/video/media/1000012022,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221031-WA0007.mp4",video/mp4,224,224,0,113433,,1667218074,1667218074795,0,5701,0,0,,,,,,,,,,, +13688,1000011945,content://media/external/video/media/1000011945,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221030-WA0003.mp4",video/mp4,288,640,0,315928,,1667128961,1667128962036,0,2321,0,0,,,,,,,,,,, +13689,1000011949,content://media/external/video/media/1000011949,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221030-WA0004.mp4",video/mp4,288,640,0,1879220,,1667128962,1667128962930,0,16857,0,0,,,,,,,,,,, +13690,1000011941,content://media/external/video/media/1000011941,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221030-WA0002.mp4",video/mp4,288,640,0,2451721,,1667128959,1667128961650,0,22616,0,0,,,,,,,,,,, +13691,1000011840,content://media/external/video/media/1000011840,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0012.mp4",video/mp4,480,848,90,35198500,,1667004164,1667004180867,0,94505,0,0,,,,,,,,,,, +13692,1000011830,content://media/external/video/media/1000011830,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0011.mp4",video/mp4,848,480,0,37531175,,1667000645,1667002731914,0,217803,0,0,,,,,,,,,,, +13693,1000011826,content://media/external/video/media/1000011826,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0010.mp4",video/mp4,848,480,0,44480593,,1667000583,1667002718542,0,266077,0,0,,,,,,,,,,, +13694,1000011819,content://media/external/video/media/1000011819,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0008.mp4",video/mp4,848,480,0,13299498,,1667000432,1667000439228,0,66989,0,0,,,,,,,,,,, +13695,1000011806,content://media/external/video/media/1000011806,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0004.mp4",video/mp4,848,480,0,5632931,,1667000357,1667000361627,0,27051,0,0,,,,,,,,,,, +13696,1000011793,content://media/external/video/media/1000011793,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0000.mp4",video/mp4,848,480,90,2196126,,1667000322,1667000323825,0,10309,0,0,,,,,,,,,,, +13697,1000011562,content://media/external/video/media/1000011562,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221025-WA0005.mp4",video/mp4,640,352,90,1392891,,1666691434,1666691435397,0,4650,0,0,,,,,,,,,,, +13698,1000011179,content://media/external/video/media/1000011179,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221021-WA0001.mp4",video/mp4,150,150,0,32839,,1666372039,1666372039963,0,640,0,0,,,,,,,,,,, +13699,1000011065,content://media/external/video/media/1000011065,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221020-WA0004.mp4",video/mp4,432,240,0,5035580,,1666260391,1666260394544,0,87399,0,0,,,,,,,,,,, +13700,1000011031,content://media/external/video/media/1000011031,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221019-WA0008.mp4",video/mp4,848,480,0,26833118,,1666213862,1666213877520,0,146819,0,0,,,,,,,,,,, +13701,1000010944,content://media/external/video/media/1000010944,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221017-WA0008.mp4",video/mp4,640,352,0,10036617,,1666029205,1666029207909,0,19221,0,0,,,,,,,,,,, +13702,1000010940,content://media/external/video/media/1000010940,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221017-WA0007.mp4",video/mp4,640,352,0,18053710,,1666029200,1666029205012,0,35648,0,0,,,,,,,,,,, +13703,1000010894,content://media/external/video/media/1000010894,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221016-WA0015.mp4",video/mp4,640,352,90,8681455,,1665929156,1665929179151,0,30720,0,0,,,,,,,,,,, +13704,1000010822,content://media/external/video/media/1000010822,"/storage/emulated/0/Download/Patate in padella.mp4",video/mp4,720,1280,0,5704055,,1665848946,1665848853124,0,20781,0,0,,,,,,,,,,, +13705,1000010771,content://media/external/video/media/1000010771,/storage/emulated/0/DCIM/Camera/20221014_190106_201.mp4,video/mp4,1440,2560,0,392447466,,1665766997,1665766997000,0,38229,0,0,,,,,,,,,,, +13706,1000010770,content://media/external/video/media/1000010770,/storage/emulated/0/DCIM/Camera/20221014_185904_770.mp4,video/mp4,2560,1440,0,320517278,,1665766865,1665766865000,0,31296,0,0,,,,,,,,,,, +13707,1000010767,content://media/external/video/media/1000010767,/storage/emulated/0/DCIM/Camera/20221014_185348_840.mp4,video/mp4,1920,1080,0,40783880,,1665766429,1665766430448,0,12693,0,0,,,,,,,,,,, +13708,1000010125,content://media/external/video/media/1000010125,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221007-WA0021.mp4",video/mp4,640,352,0,20225149,,1665145116,1665145124250,0,87936,0,0,,,,,,,,,,, +13709,1000009934,content://media/external/video/media/1000009934,/storage/emulated/0/DCIM/Camera/VID_20221005_230418.mp4,video/mp4,1920,1080,0,51489574,,1665003858,1665003884893,1665003884000,24048,0,0,,,,,,,,,,, +13710,1000009933,content://media/external/video/media/1000009933,/storage/emulated/0/DCIM/Camera/VID_20221005_230236.mp4,video/mp4,1920,1080,0,189422128,,1665003756,1665003857365,1665003856000,98240,0,0,,,,,,,,,,, +13711,1000009643,content://media/external/video/media/1000009643,/storage/emulated/0/Pictures/WeChat/wx_camera_1664620972115.mp4,video/mp4,576,1280,0,1729347,,1664620972,1664620972193,0,5620,0,0,,,,,,,,,,, +13712,1000009546,content://media/external/video/media/1000009546,/storage/emulated/0/DCIM/Camera/20220930_214936_763.mp4,video/mp4,1920,1080,0,32824807,,1664567377,1664567378004,0,8618,0,0,,,,,,,,,,, +13713,1000009540,content://media/external/video/media/1000009540,/storage/emulated/0/DCIM/Camera/20220930_202158_698.mp4,video/mp4,1920,1080,0,104188103,,1664562240,1664562240000,0,26026,0,0,,,,,,,,,,, +13714,1000009539,content://media/external/video/media/1000009539,/storage/emulated/0/DCIM/Camera/20220930_201703_531.mp4,video/mp4,1920,1080,0,57609067,,1664561860,1664561860000,0,14101,0,0,,,,,,,,,,, +13715,1000009535,content://media/external/video/media/1000009535,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220930-WA0003.mp4",video/mp4,320,178,0,38511,,1664552748,1664552748753,0,750,0,0,,,,,,,,,,, +13716,1000009495,content://media/external/video/media/1000009495,/storage/emulated/0/DCIM/Camera/20220930_105805_646.mp4,video/mp4,1920,1080,0,383938540,,1664528937,1664528937000,0,116455,0,0,,,,,,,,,,, +13717,1000009494,content://media/external/video/media/1000009494,/storage/emulated/0/DCIM/Camera/20220930_095757_388.mp4,video/mp4,1920,1080,0,472286429,,1664525356,1664525356000,0,145695,0,0,,,,,,,,,,, +13718,1000009427,content://media/external/video/media/1000009427,/storage/emulated/0/DCIM/Camera/VID_20220928_230030.mp4,video/mp4,1920,1080,0,144085539,,1664398830,1664398910954,1664398910000,78677,0,0,,,,,,,,,,, +13719,1000009165,content://media/external/video/media/1000009165,/storage/emulated/0/DCIM/Camera/20220928_200243_281.mp4,video/mp4,1920,1080,0,35845075,,1664388163,1664388164630,0,10600,0,0,,,,,,,,,,, +13720,1000009164,content://media/external/video/media/1000009164,/storage/emulated/0/DCIM/Camera/20220928_200047_268.mp4,video/mp4,1920,1080,0,36040723,,1664388048,1664388048900,0,10600,0,0,,,,,,,,,,, +13721,1000009051,content://media/external/video/media/1000009051,/storage/emulated/0/DCIM/Camera/VID_20220927_103815(0).mp4,video/mp4,1920,1080,0,26334711,,1664268022,1664268022000,1664268022000,12400,0,0,,,,,,,,,,, +13722,1000008548,content://media/external/video/media/1000008548,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220919-WA0002.mp4",video/mp4,640,352,90,45530393,,1663579867,1663579901141,0,284791,0,0,,,,,,,,,,, +13723,63556,content://media/external/video/media/63556,/storage/emulated/0/DCIM/undefined_1657865629721.mp4,video/mp4,960,540,0,14526678,,1657865677,1657865677203,0,50873,0,0,,,,,,,,,,, +13724,63264,content://media/external/video/media/63264,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220710-WA0020.mp4",video/mp4,640,352,90,25768789,,1657438046,1657438058289,0,90901,0,0,,,,,,,,,,, +13725,63134,content://media/external/video/media/63134,"/storage/emulated/0/Video/FOCACCIA MILLE BOLLE croccante fuori e soffice dentro SENZA SPORCARSI LE MANI_Full-HD.mp4",video/mp4,1920,1080,0,150882716,,1657270285,1657270312762,0,610150,0,0,,,,,,,,,,, +13726,62771,content://media/external/video/media/62771,/storage/emulated/0/DCIM/efa55a1cf611be98b21071c4a607f117_bryton_1656698122494.mp4,video/mp4,960,540,0,12450612,,1656698223,1656698223831,0,38373,0,0,,,,,,,,,,, +13727,62596,content://media/external/video/media/62596,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220628-WA0000.mp4",video/mp4,848,480,0,9376728,,1656406561,1656406568439,0,52273,0,0,,,,,,,,,,, +13728,62411,content://media/external/video/media/62411,/storage/emulated/0/DCIM/0781365561-7757512607_amazfit_1656190184806.mp4,video/mp4,960,540,0,9424634,,1656190271,1656190271662,0,56040,0,0,,,,,,,,,,, +13729,62409,content://media/external/video/media/62409,/storage/emulated/0/DCIM/2918695561-7757512607_amazfit_1656189786615.mp4,video/mp4,960,540,0,13184066,,1656189873,1656189873674,0,63673,0,0,,,,,,,,,,, +13730,62291,content://media/external/video/media/62291,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220624-WA0020.mp4",video/mp4,640,352,90,5080243,,1656088472,1656088480283,0,17094,0,0,,,,,,,,,,, +13731,62287,content://media/external/video/media/62287,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220624-WA0019.mp4",video/mp4,640,352,90,17846429,,1656088456,1656088466213,0,61312,0,0,,,,,,,,,,, +13732,62276,content://media/external/video/media/62276,/storage/emulated/0/DCIM/GoPro-Exports/GX010705_1656082665580.MP4,video/mp4,3840,2160,0,72056988,,1656082922,1656082923141,1656082556000,9460,0,0,,,,,,,,,,, +13733,62249,content://media/external/video/media/62249,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220624-WA0009.mp4",video/mp4,640,352,90,4710941,,1656080018,1656080023857,0,17160,0,0,,,,,,,,,,, +13734,62150,content://media/external/video/media/62150,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Video/VID-20220623-WA0026.mp4",video/mp4,640,352,90,2436282,,1655998713,1656001671280,0,12330,0,0,,,,,,,,,,, +13735,61988,content://media/external/video/media/61988,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220623-WA0000.mp4",video/mp4,848,480,180,36244499,,1655938437,1655963079240,0,209049,0,0,,,,,,,,,,, +13736,61971,content://media/external/video/media/61971,/storage/emulated/0/DCIM/GoPro-Exports/GH010595_1655894512765.MP4,video/mp4,1920,1080,0,1332932426,,1655894664,1655894672559,1655894108000,235460,0,0,,,,,,,,,,, +13737,61970,content://media/external/video/media/61970,/storage/emulated/0/DCIM/GoPro-Exports/GH010594_1655894052790.MP4,video/mp4,1920,1080,0,612270541,,1655894461,1655894464783,1655893848000,108080,0,0,,,,,,,,,,, +13738,61855,content://media/external/video/media/61855,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220621-WA0005.mp4",video/mp4,640,352,0,8197836,,1655823424,1655823427253,0,25514,0,0,,,,,,,,,,, +13739,61851,content://media/external/video/media/61851,/storage/emulated/0/DCIM/GoPro-Exports/GH010590_1655822870693.MP4,video/mp4,1920,1080,0,357905634,,1655822926,1655822929094,1655803018000,63160,0,0,,,,,,,,,,, +13740,61852,content://media/external/video/media/61852,/storage/emulated/0/DCIM/GoPro-Exports/GH010589_1655822870693.MP4,video/mp4,1920,1080,0,48888934,,1655822929,1655822929562,1655800068000,8520,0,0,,,,,,,,,,, +13741,61784,content://media/external/video/media/61784,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220620-WA0008.mp4",video/mp4,640,352,0,13124230,,1655721301,1655721307755,0,42218,0,0,,,,,,,,,,, +13742,61686,content://media/external/video/media/61686,/storage/emulated/0/DCIM/GoPro-Exports/GH010581_1655643416125.MP4,video/mp4,1920,1080,0,445231224,,1655643475,1655643478826,1655469406000,78600,0,0,,,,,,,,,,, +13743,61286,content://media/external/video/media/61286,/storage/emulated/0/DCIM/GoPro-Exports/_.mp4,video/mp4,1920,1080,0,699524818,,1655469626,1655469631114,1655468862000,233314,0,0,,,,,,,,,,, +13744,61222,content://media/external/video/media/61222,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220616-WA0005.mp4",video/mp4,640,352,0,6199063,,1655384557,1655384570151,0,21504,0,0,,,,,,,,,,, +13745,61202,content://media/external/video/media/61202,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220616-WA0001.mp4",video/mp4,848,480,90,54533403,,1655334164,1655334376958,0,335876,0,0,,,,,,,,,,, +13746,61198,content://media/external/video/media/61198,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220616-WA0000.mp4",video/mp4,640,352,0,50831870,,1655330206,1655334354988,0,388736,0,0,,,,,,,,,,, +13747,60891,content://media/external/video/media/60891,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220615-WA0017.mp4",video/mp4,480,624,0,2700965,,1655303586,1655303588381,0,42771,0,0,,,,,,,,,,, +13748,60890,content://media/external/video/media/60890,/storage/emulated/0/Download/InsMate/post_10000000_890310339038306_5110097143848137540_n.mp4,video/mp4,720,406,0,39495749,,1655299976,1655299979902,0,501620,0,0,,,,,,,,,,, +13749,60678,content://media/external/video/media/60678,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220614-WA0016.mp4",video/mp4,640,352,0,4770165,,1655227626,1655227629995,0,19242,0,0,,,,,,,,,,, +13750,60671,content://media/external/video/media/60671,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220614-WA0014.mp4",video/mp4,848,480,90,5948513,,1655220389,1655220392365,0,28606,0,0,,,,,,,,,,, +13751,60646,content://media/external/video/media/60646,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220614-WA0004.mp4",video/mp4,1920,1088,0,11897229,,1655203243,1655203250751,0,204778,0,0,,,,,,,,,,, +13752,60621,content://media/external/video/media/60621,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0063.mp4",video/mp4,848,480,90,6499169,,1655157053,1655157058024,0,31393,0,0,,,,,,,,,,, +13753,60617,content://media/external/video/media/60617,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0062.mp4",video/mp4,848,480,90,4230408,,1655157037,1655157038685,0,20131,0,0,,,,,,,,,,, +13754,60613,content://media/external/video/media/60613,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0061.mp4",video/mp4,848,480,90,7090968,,1655157024,1655157026763,0,34342,0,0,,,,,,,,,,, +13755,60609,content://media/external/video/media/60609,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0060.mp4",video/mp4,640,352,0,29489746,,1655156976,1655156992718,0,163946,0,0,,,,,,,,,,, +13756,60602,content://media/external/video/media/60602,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0059.mp4",video/mp4,848,480,0,14111459,,1655148115,1655148121356,0,71238,0,0,,,,,,,,,,, +13757,60526,content://media/external/video/media/60526,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0052.mp4",video/mp4,640,352,90,40862448,,1655125415,1655134349526,0,198524,0,0,,,,,,,,,,, +13758,60558,content://media/external/video/media/60558,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0051.mp4",video/mp4,640,352,90,42250389,,1655125470,1655134331572,0,208999,0,0,,,,,,,,,,, +13759,60578,content://media/external/video/media/60578,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220613-WA0050.mp4",video/mp4,224,320,0,119296,,1655133467,1655133467688,0,6002,0,0,,,,,,,,,,, +13760,60562,content://media/external/video/media/60562,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0045.mp4",video/mp4,640,352,90,394734,,1655125470,1655125471045,0,1388,0,0,,,,,,,,,,, +13761,60554,content://media/external/video/media/60554,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0044.mp4",video/mp4,640,352,90,17761433,,1655125461,1655125469995,0,68649,0,0,,,,,,,,,,, +13762,60550,content://media/external/video/media/60550,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0043.mp4",video/mp4,640,352,90,19786633,,1655125453,1655125461152,0,77694,0,0,,,,,,,,,,, +13763,60546,content://media/external/video/media/60546,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0042.mp4",video/mp4,640,352,90,5970320,,1655125450,1655125453066,0,21161,0,0,,,,,,,,,,, +13764,60542,content://media/external/video/media/60542,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0041.mp4",video/mp4,640,352,90,18981894,,1655125439,1655125450166,0,73940,0,0,,,,,,,,,,, +13765,60538,content://media/external/video/media/60538,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0040.mp4",video/mp4,640,352,90,9994064,,1655125435,1655125439829,0,36543,0,0,,,,,,,,,,, +13766,60534,content://media/external/video/media/60534,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0039.mp4",video/mp4,640,352,90,26646582,,1655125424,1655125435506,0,110888,0,0,,,,,,,,,,, +13767,60530,content://media/external/video/media/60530,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0038.mp4",video/mp4,640,352,90,21504320,,1655125415,1655125424588,0,85652,0,0,,,,,,,,,,, +13768,60516,content://media/external/video/media/60516,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0035.mp4",video/mp4,640,352,90,9085201,,1655125410,1655125414596,0,32916,0,0,,,,,,,,,,, +13769,60512,content://media/external/video/media/60512,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0034.mp4",video/mp4,640,352,90,5799775,,1655125408,1655125410360,0,20461,0,0,,,,,,,,,,, +13770,60508,content://media/external/video/media/60508,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0033.mp4",video/mp4,640,352,90,25643842,,1655125396,1655125408050,0,105747,0,0,,,,,,,,,,, +13771,60489,content://media/external/video/media/60489,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0027.mp4",video/mp4,640,352,90,24299110,,1655125385,1655125394539,0,99074,0,0,,,,,,,,,,, +13772,60455,content://media/external/video/media/60455,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0016.mp4",video/mp4,640,352,90,1878624,,1655125380,1655125381671,0,6527,0,0,,,,,,,,,,, +13773,60439,content://media/external/video/media/60439,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0011.mp4",video/mp4,640,352,90,26667364,,1655125368,1655125378636,0,111016,0,0,,,,,,,,,,, +13774,60399,content://media/external/video/media/60399,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0006.mp4",video/mp4,480,848,0,5098569,,1655075299,1655103979534,0,24288,0,0,,,,,,,,,,, +13775,60407,content://media/external/video/media/60407,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0005.mp4",video/mp4,480,848,0,11911492,,1655075266,1655103956430,0,59605,0,0,,,,,,,,,,, +13776,60409,content://media/external/video/media/60409,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0001.mp4",video/mp4,640,368,0,20269781,,1655075234,1655098586801,0,320528,0,0,,,,,,,,,,, +13777,60378,content://media/external/video/media/60378,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220612-WA0003.mp4",video/mp4,640,352,0,37937396,,1655041200,1655041229685,0,187966,0,0,,,,,,,,,,, +13778,60277,content://media/external/video/media/60277,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220611-WA0000.mp4",video/mp4,640,352,0,54301319,,1654898674,1654898699618,0,301079,0,0,,,,,,,,,,, +13779,60215,content://media/external/video/media/60215,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220610-WA0013.mp4",video/mp4,1072,1920,0,4766223,,1654853702,1654853708998,1654853708000,5162,0,0,,,,,,,,,,, +13780,60169,content://media/external/video/media/60169,/storage/emulated/0/DCIM/GoPro-Exports/Nueva_Pandilla.mp4,video/mp4,1920,1080,0,65765636,,1654798356,1654798357099,1654797415000,33877,0,0,,,,,,,,,,, +13781,60165,content://media/external/video/media/60165,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220609-WA0045.mp4",video/mp4,640,352,0,45651704,,1654794971,1654794995133,0,255095,0,0,,,,,,,,,,, +13782,60033,content://media/external/video/media/60033,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220609-WA0001.mp4",video/mp4,160,118,0,50698,,1654754803,1654754803891,0,2459,0,0,,,,,,,,,,, +13783,60021,content://media/external/video/media/60021,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220609-WA0000.mp4",video/mp4,848,480,90,6839153,,1654725685,1654725688719,0,33111,0,0,,,,,,,,,,, +13784,60017,content://media/external/video/media/60017,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220608-WA0017.mp4",video/mp4,640,352,0,16802128,,1654724292,1654724360220,0,110464,0,0,,,,,,,,,,, +13785,60013,content://media/external/video/media/60013,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220608-WA0016.mp4",video/mp4,848,480,90,16643326,,1654724251,1654724261640,0,85658,0,0,,,,,,,,,,, +13786,59912,content://media/external/video/media/59912,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220607-WA0019.mp4",video/mp4,640,352,0,28390608,,1654626091,1654626105755,0,151920,0,0,,,,,,,,,,, +13787,59886,content://media/external/video/media/59886,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220607-WA0016.mp4",video/mp4,640,352,0,19827445,,1654615264,1654615272837,0,91960,0,0,,,,,,,,,,, +13788,59828,content://media/external/video/media/59828,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220606-WA0025.mp4",video/mp4,848,480,90,15050745,,1654551818,1654551825021,0,76858,0,0,,,,,,,,,,, +13789,59824,content://media/external/video/media/59824,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220606-WA0024.mp4",video/mp4,848,480,90,10811439,,1654551790,1654551795563,0,53730,0,0,,,,,,,,,,, +13790,59820,content://media/external/video/media/59820,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220606-WA0023.mp4",video/mp4,640,352,0,27596274,,1654551248,1654551262028,0,156885,0,0,,,,,,,,,,, +13791,59433,content://media/external/video/media/59433,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0011.mp4",video/mp4,848,480,270,1147568,,1654171767,1654171769623,0,5363,0,0,,,,,,,,,,, +13792,48594,content://media/external/video/media/48594,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0005.mp4",video/mp4,848,480,90,17751141,,1654121056,1654121063934,0,92020,0,0,,,,,,,,,,, +13793,48590,content://media/external/video/media/48590,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0004.mp4",video/mp4,848,480,90,10176412,,1654120923,1654120926518,0,50340,0,0,,,,,,,,,,, +13794,48586,content://media/external/video/media/48586,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0003.mp4",video/mp4,848,480,90,11722101,,1654120900,1654120905193,0,58467,0,0,,,,,,,,,,, +13795,48582,content://media/external/video/media/48582,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0002.mp4",video/mp4,848,480,90,12642494,,1654120878,1654120882755,0,63436,0,0,,,,,,,,,,, +13796,48578,content://media/external/video/media/48578,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0001.mp4",video/mp4,848,480,90,6059078,,1654120842,1654120844673,0,29141,0,0,,,,,,,,,,, +13797,48574,content://media/external/video/media/48574,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0000.mp4",video/mp4,848,480,90,29003659,,1654120831,1654120842177,0,161169,0,0,,,,,,,,,,, +13798,47954,content://media/external/video/media/47954,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220525-WA0010.mp4",video/mp4,848,480,90,6064636,,1653515015,1653515020254,0,29141,0,0,,,,,,,,,,, +13799,47950,content://media/external/video/media/47950,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220525-WA0009.mp4",video/mp4,848,480,90,29005489,,1653514973,1653514988430,0,161169,0,0,,,,,,,,,,, +13800,47677,content://media/external/video/media/47677,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220522-WA0000.mp4",video/mp4,848,480,180,31166200,,1653174586,1653174602936,0,177841,0,0,,,,,,,,,,, +13801,47670,content://media/external/video/media/47670,/storage/emulated/0/DCIM/Creative/Screenrecorder-2022-05-21-16-15-35-278(0).mp4,video/mp4,1080,2400,0,24975077,,1653142687,1653142687000,1653142687000,9766,0,0,,,,,,,,,,, +13802,47669,content://media/external/video/media/47669,/storage/emulated/0/DCIM/ScreenRecorder/Screenrecorder-2022-05-21-16-15-35-278.mp4,video/mp4,1080,2400,0,11824973,,1653142535,1653142562543,1653142562000,26059,0,0,,,,,,,,,,, +13803,47666,content://media/external/video/media/47666,/storage/emulated/0/DCIM/Camera/VID_20220521_160634.mp4,video/mp4,1920,1080,0,11765707,,1653141994,1653142001759,1653142000000,3712,0,0,,,,,,,,,,, +13804,47665,content://media/external/video/media/47665,/storage/emulated/0/Movies/Whatsapp/VID-20220521-WA0017.mp4,video/mp4,640,352,0,5297470,,1653141772,1653141772764,0,28886,0,0,,,,,,,,,,, +13805,47577,content://media/external/video/media/47577,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220520-WA0013.mp4",video/mp4,848,480,180,54345018,,1653056822,1653062510342,0,334042,0,0,,,,,,,,,,, +13806,47567,content://media/external/video/media/47567,/storage/emulated/0/DCIM/Camera/VID_20220520_144059.mp4,video/mp4,1920,1080,0,90860657,,1653050459,1653050500479,1653050499000,37888,0,0,,,,,,,,,,, +13807,47556,content://media/external/video/media/47556,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220520-WA0008.mp4",video/mp4,240,432,0,901306,,1653048483,1653048485839,0,15000,0,0,,,,,,,,,,, +13808,47504,content://media/external/video/media/47504,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220519-WA0020.mp4",video/mp4,640,288,0,5867035,,1652982716,1652982720605,0,29648,0,0,,,,,,,,,,, +13809,47491,content://media/external/video/media/47491,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220519-WA0019.mp4",video/mp4,200,200,0,53668,,1652976148,1652976148672,0,1200,0,0,,,,,,,,,,, +13810,47487,content://media/external/video/media/47487,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220519-WA0018.mp4",video/mp4,132,154,0,209755,,1652973859,1652973859696,0,4920,0,0,,,,,,,,,,, +13811,47476,content://media/external/video/media/47476,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220519-WA0013.mp4",video/mp4,352,640,0,3359134,,1652959437,1652959439688,0,12736,0,0,,,,,,,,,,, +13812,47433,content://media/external/video/media/47433,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220519-WA0001.mp4",video/mp4,254,254,0,183028,,1652938883,1652938915133,0,3375,0,0,,,,,,,,,,, +13813,47389,content://media/external/video/media/47389,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220518-WA0033.mp4",video/mp4,848,480,0,5508993,,1652881874,1652881876560,0,26424,0,0,,,,,,,,,,, +13814,47356,content://media/external/video/media/47356,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220518-WA0022.mp4",video/mp4,848,480,0,13486098,,1652873603,1652873611894,0,31486,0,0,,,,,,,,,,, +13815,47347,content://media/external/video/media/47347,/storage/emulated/0/DCIM/Camera/VID_20220518_133018.mp4,video/mp4,1920,1080,0,78032917,,1652873418,1652873448373,1652873447000,27545,0,0,,,,,,,,,,, +13816,47344,content://media/external/video/media/47344,/storage/emulated/0/DCIM/Camera/VID_20220518_132554.mp4,video/mp4,1920,1080,90,30039358,,1652873154,1652873170772,1652873170000,13845,0,0,,,,,,,,,,, +13817,47217,content://media/external/video/media/47217,/storage/emulated/0/Movies/Whatsapp/VID-20220505-WA0014(1).mp4,video/mp4,640,352,0,11186336,,1652718212,1652718212298,0,67456,0,0,,,,,,,,,,, +13818,47216,content://media/external/video/media/47216,/storage/emulated/0/Movies/Whatsapp/VID-20220505-WA0013(1).mp4,video/mp4,640,352,0,14849659,,1652718207,1652718207954,0,105386,0,0,,,,,,,,,,, +13819,46941,content://media/external/video/media/46941,/storage/emulated/0/Movies/Whatsapp/VID-20220505-WA0013.mp4,video/mp4,640,352,0,14849659,,1652290593,1652290593320,0,105386,0,0,,,,,,,,,,, +13820,46940,content://media/external/video/media/46940,/storage/emulated/0/Movies/Whatsapp/VID-20220505-WA0014.mp4,video/mp4,640,352,0,11186336,,1652290586,1652290586592,0,67456,0,0,,,,,,,,,,, +13821,46755,content://media/external/video/media/46755,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220509-WA0002.mp4",video/mp4,640,352,90,7518305,,1652078792,1652078795514,0,40704,0,0,,,,,,,,,,, +13822,46734,content://media/external/video/media/46734,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220508-WA0014.mp4",video/mp4,640,352,0,32364202,,1652016550,1652016559908,0,167658,0,0,,,,,,,,,,, +13823,46349,content://media/external/video/media/46349,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220508-WA0006.mp4",video/mp4,640,352,90,28943269,,1651996989,1651997013342,0,169472,0,0,,,,,,,,,,, +13824,46342,content://media/external/video/media/46342,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220508-WA0005.mp4",video/mp4,480,480,0,88387,,1651996475,1651996476452,0,640,0,0,,,,,,,,,,, +13825,46336,content://media/external/video/media/46336,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220508-WA0003.mp4",video/mp4,224,160,0,25557,,1651994543,1651994544184,0,909,0,0,,,,,,,,,,, +13826,46319,content://media/external/video/media/46319,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220508-WA0001.mp4",video/mp4,640,352,90,33287842,,1651960963,1651989410193,0,169493,0,0,,,,,,,,,,, +13827,46318,content://media/external/video/media/46318,/storage/emulated/0/DCIM/Camera/VID_20220507_230925.mp4,video/mp4,1920,1080,0,449837489,,1651957765,1651957960904,1651957960000,193493,0,0,,,,,,,,,,, +13828,45604,content://media/external/video/media/45604,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220505-WA0014.mp4",video/mp4,640,352,0,11186336,,1651748476,1651748488324,0,67456,0,0,,,,,,,,,,, +13829,45600,content://media/external/video/media/45600,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220505-WA0013.mp4",video/mp4,640,352,0,14849659,,1651748450,1651748476466,0,105386,0,0,,,,,,,,,,, +13830,44318,content://media/external/video/media/44318,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220428-WA0033.mp4",video/mp4,640,352,90,806621,,1651151448,1651151449921,0,2937,0,0,,,,,,,,,,, +13831,44260,content://media/external/video/media/44260,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220428-WA0014.mp4",video/mp4,848,480,90,4529890,,1651134551,1651134554457,0,21432,0,0,,,,,,,,,,, +13832,44196,content://media/external/video/media/44196,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220427-WA0010.mp4",video/mp4,576,1024,0,2996481,,1651082732,1651082735345,0,52497,0,0,,,,,,,,,,, +13833,44023,content://media/external/video/media/44023,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220424-WA0017.mp4",video/mp4,640,352,90,736870,,1650824652,1650824653449,0,3200,0,0,,,,,,,,,,, +13834,43840,content://media/external/video/media/43840,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220421-WA0002.mp4",video/mp4,848,480,0,1191479,,1650496249,1650496250578,0,5433,0,0,,,,,,,,,,, +13835,43713,content://media/external/video/media/43713,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220417-WA0046.mp4",video/mp4,640,352,90,5931999,,1650194259,1650194365221,0,22890,0,0,,,,,,,,,,, +13836,37425,content://media/external/video/media/37425,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220414-WA0000.mp4",video/mp4,640,352,90,25909873,,1649914050,1649915802395,0,135914,0,0,,,,,,,,,,, +13837,37215,content://media/external/video/media/37215,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220411-WA0001.mp4",video/mp4,640,352,0,33570661,,1649630122,1649630274588,0,171477,0,0,,,,,,,,,,, +13838,37206,content://media/external/video/media/37206,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220411-WA0000.mp4",video/mp4,640,352,90,33740138,,1649626839,1649629017891,0,173013,0,0,,,,,,,,,,, +13839,37202,content://media/external/video/media/37202,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220410-WA0006.mp4",video/mp4,848,480,0,34303348,,1649625628,1649625748844,0,196046,0,0,,,,,,,,,,, +13840,37086,content://media/external/video/media/37086,"/storage/emulated/0/Download/COLOMBA INTRECCIATA VELOCE ricetta Pasquale casalinga Colomba in versione casalinga intrecciata, senza...fs#colomba #brioche #ricetta #colombaveloce uvetta #canditi #Pasqua #tuttiatavola2016 #cooking #easyrecipe #italiancolomba.mp4",video/mp4,1280,720,0,77934395,,1649572035,1649572089397,0,634647,0,0,,,,,,,,,,, +13841,37049,content://media/external/video/media/37049,/storage/emulated/0/DCIM/Camera/63b3c20783ec3a17847e88fea8a8d286.mp4,video/mp4,576,1024,0,4770940,,1649449221,1649449221391,0,26167,0,0,,,,,,,,,,, +13842,36693,content://media/external/video/media/36693,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220329-WA0004.mp4",video/mp4,352,640,0,6529876,,1648556770,1648556782052,0,12493,0,0,,,,,,,,,,, +13843,35824,content://media/external/video/media/35824,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220313-WA0026.mp4",video/mp4,352,640,0,5096514,,1647197438,1647197442679,0,19093,0,0,,,,,,,,,,, +13844,35524,content://media/external/video/media/35524,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220310-WA0000.mp4",video/mp4,640,352,90,9513514,,1646867229,1646867252274,0,37845,0,0,,,,,,,,,,, +13845,34863,content://media/external/video/media/34863,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220227-WA0002.mp4",video/mp4,640,352,90,2161415,,1645954337,1645954339746,0,21397,0,0,,,,,,,,,,, +13846,34707,content://media/external/video/media/34707,/storage/emulated/0/DCIM/Camera/VID_20220223_165136.mp4,video/mp4,1920,1080,0,74115708,,1645631524,1645631524752,1645631524000,25621,0,0,,,,,,,,,,, +13847,34706,content://media/external/video/media/34706,/storage/emulated/0/DCIM/Camera/VID_20220223_164845.mp4,video/mp4,1920,1080,90,175304025,,1645631395,1645631396226,1645631395000,67817,0,0,,,,,,,,,,, +13848,33978,content://media/external/video/media/33978,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220217-WA0001.mp4",video/mp4,848,480,90,7351058,,1645052407,1645052412015,0,35758,0,0,,,,,,,,,,, +13849,33974,content://media/external/video/media/33974,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220217-WA0000.mp4",video/mp4,848,480,90,7309756,,1645052402,1645052407025,0,35549,0,0,,,,,,,,,,, +13850,33402,content://media/external/video/media/33402,/storage/emulated/0/DCIM/Camera/VID_20220212_144114.mp4,video/mp4,1920,1080,0,147489200,,1644673334,1644673334912,1644673334000,57898,0,0,,,,,,,,,,, +13851,32793,content://media/external/video/media/32793,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Video/VID-20220204-WA0005.mp4",video/mp4,640,352,90,29643950,,1643988560,1643988581524,0,143530,0,0,,,,,,,,,,, +13852,32044,content://media/external/video/media/32044,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220130-WA0027.mp4",video/mp4,848,480,90,23854372,,1643575629,1643575645621,0,127709,0,0,,,,,,,,,,, +13853,31731,content://media/external/video/media/31731,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220126-WA0015.mp4",video/mp4,848,480,90,3224112,,1643234218,1643234222389,0,15232,0,0,,,,,,,,,,, +13854,31727,content://media/external/video/media/31727,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220126-WA0014.mp4",video/mp4,848,480,90,1151178,,1643234217,1643234218307,0,5340,0,0,,,,,,,,,,, +13855,31723,content://media/external/video/media/31723,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220126-WA0013.mp4",video/mp4,848,480,90,4303089,,1643234211,1643234217156,0,20572,0,0,,,,,,,,,,, +13856,31719,content://media/external/video/media/31719,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220126-WA0012.mp4",video/mp4,848,480,90,4941683,,1643234207,1643234211183,0,23754,0,0,,,,,,,,,,, +13857,20912,content://media/external/video/media/20912,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20211219-WA0018.mp4",video/mp4,848,480,90,21532308,,1639935188,1639935200406,0,113266,0,0,,,,,,,,,,, +13858,20898,content://media/external/video/media/20898,/storage/emulated/0/DCIM/Camera/VID_20211219_160629.mp4,video/mp4,1920,1080,90,103475850,,1639926430,1639926430385,1639926429000,39274,0,0,,,,,,,,,,, +13859,20891,content://media/external/video/media/20891,/storage/emulated/0/DCIM/Camera/VID_20211219_160257.mp4,video/mp4,1920,1080,90,6748750,,1639926182,1639926183052,1639926182000,1798,0,0,,,,,,,,,,, +13860,20890,content://media/external/video/media/20890,/storage/emulated/0/DCIM/Camera/VID_20211219_160204.mp4,video/mp4,1920,1080,90,42426934,,1639926141,1639926141861,1639926141000,15658,0,0,,,,,,,,,,, +13861,20687,content://media/external/video/media/20687,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20211215-WA0008.mp4",video/mp4,640,352,0,10890493,,1639606003,1639606013123,0,46933,0,0,,,,,,,,,,, +13862,20147,content://media/external/video/media/20147,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20211207-WA0018.mp4",video/mp4,640,352,90,1509998,,1638892295,1638898179822,0,7296,0,0,,,,,,,,,,, +13863,20079,content://media/external/video/media/20079,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20211207-WA0000.mp4",video/mp4,640,352,90,37339371,,1638865658,1638865803635,0,203882,0,0,,,,,,,,,,, +13864,19884,content://media/external/video/media/19884,/storage/emulated/0/DCIM/Camera/VID_20211206_120640.mp4,video/mp4,1920,1080,0,150973255,,1638788859,1638788859857,1638788859000,57044,0,0,,,,,,,,,,, +13865,11277,content://media/external/video/media/11277,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20211125-WA0000.mp4",video/mp4,432,226,0,116900,,1637819410,1637819411083,0,3090,0,0,,,,,,,,,,, +13866,9212,content://media/external/video/media/9212,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20211120-WA0002.mp4",video/mp4,394,218,0,105959,,1637527257,1637527257652,0,2400,0,0,,,,,,,,,,, +13867,5232,content://media/external/video/media/5232,/storage/emulated/0/DCIM/Camera/VID_20211031_105930.mp4,video/mp4,1920,1080,0,34815573,,1637508194,1635674385000,1635674384000,13077,0,0,,,,,,,,,,, +13868,5204,content://media/external/video/media/5204,/storage/emulated/0/DCIM/Camera/VID_20210918_105932.mp4,video/mp4,1920,1080,90,152260621,,1637507872,1631955633000,1631955632000,59562,0,0,,,,,,,,,,, +13869,5237,content://media/external/video/media/5237,/storage/emulated/0/DCIM/Camera/VID_20210918_103101.mp4,video/mp4,1920,1080,0,36783212,,1637508238,1631953877000,1631953876000,13957,0,0,,,,,,,,,,, +13870,5211,content://media/external/video/media/5211,/storage/emulated/0/DCIM/Camera/VID_20210918_103050.mp4,video/mp4,1920,1080,0,19286643,,1637507953,1631953858000,1631953858000,6912,0,0,,,,,,,,,,, +13871,5225,content://media/external/video/media/5225,/storage/emulated/0/DCIM/Camera/VID_20210918_103001.mp4,video/mp4,1920,1080,0,19341904,,1637508092,1631953809000,1631953809000,6996,0,0,,,,,,,,,,, +13872,5238,content://media/external/video/media/5238,/storage/emulated/0/DCIM/Camera/VID_20210911_092203.mp4,video/mp4,1920,1080,90,123840537,,1637508246,1631344973000,1631344972000,48434,0,0,,,,,,,,,,, +13873,5224,content://media/external/video/media/5224,/storage/emulated/0/DCIM/Camera/VID_20210911_091851.mp4,video/mp4,1920,1080,0,53012394,,1637508092,1631344753000,1631344752000,20352,0,0,,,,,,,,,,, +13874,5210,content://media/external/video/media/5210,/storage/emulated/0/DCIM/Camera/VID_20210901_143122.mp4,video/mp4,1920,1080,0,13775909,,1637507953,1630499488000,1630499488000,4692,0,0,,,,,,,,,,, +13875,5245,content://media/external/video/media/5245,/storage/emulated/0/DCIM/Camera/VID_20210901_143011.mp4,video/mp4,1920,1080,0,13009204,,1637508323,1630499417000,1630499416000,4425,0,0,,,,,,,,,,, +13876,5213,content://media/external/video/media/5213,/storage/emulated/0/DCIM/Camera/VID_20210901_114807.mp4,video/mp4,1920,1080,270,43196594,,1637507955,1630489705000,1630489705000,16471,0,0,,,,,,,,,,, +13877,5249,content://media/external/video/media/5249,/storage/emulated/0/DCIM/Camera/VID_20210901_102411.mp4,video/mp4,1920,1080,0,41623455,,1637508324,1630484669000,1630484668000,15872,0,0,,,,,,,,,,, +13878,5240,content://media/external/video/media/5240,/storage/emulated/0/DCIM/Camera/VID_20210901_102349.mp4,video/mp4,1920,1080,0,25301364,,1637508289,1630484641000,1630484640000,9472,0,0,,,,,,,,,,, +13879,5236,content://media/external/video/media/5236,/storage/emulated/0/DCIM/Camera/VID_20210607_172321.mp4,video/mp4,1920,1080,0,64109676,,1637508238,1623079428000,1623079427000,24704,0,0,,,,,,,,,,, +13880,5228,content://media/external/video/media/5228,/storage/emulated/0/DCIM/Camera/VID_20210522_181454.mp4,video/mp4,1920,1080,90,134743866,,1637508138,1621700148000,1621700148000,53065,0,0,,,,,,,,,,, +13881,5234,content://media/external/video/media/5234,/storage/emulated/0/DCIM/Camera/VID_20210515_102613.mp4,video/mp4,1920,1080,0,30781004,,1637508238,1621067186000,1621067186000,11925,0,0,,,,,,,,,,, +13882,5244,content://media/external/video/media/5244,/storage/emulated/0/DCIM/Camera/VID_20210515_102546.mp4,video/mp4,1920,1080,0,27033594,,1637508323,1621067157000,1621067157000,10359,0,0,,,,,,,,,,, +13883,5247,content://media/external/video/media/5247,/storage/emulated/0/DCIM/Camera/VID_20210501_122842.mp4,video/mp4,1280,720,90,11624942,,1637508324,1619864930000,1619864930000,10000,0,0,,,,,,,,,,, +13884,5223,content://media/external/video/media/5223,/storage/emulated/0/DCIM/Camera/VID_20210501_122821_HSR_240.mp4,video/mp4,1280,720,90,94284966,,1637508092,1619864916000,1619864916000,13450,0,0,,,,,,,,,,, +13885,5203,content://media/external/video/media/5203,/storage/emulated/0/DCIM/Camera/VID_20210501_122759.mp4,video/mp4,1280,720,90,11380526,,1637507864,1619864888000,1619864888000,10000,0,0,,,,,,,,,,, +13886,5230,content://media/external/video/media/5230,/storage/emulated/0/DCIM/Camera/VID_20210501_122030_HSR_12045926572.mp4,video/mp4,1280,720,90,19814325,,1637508194,1619864517000,1619864517000,16937,0,0,,,,,,,,,,, +13887,5235,content://media/external/video/media/5235,/storage/emulated/0/DCIM/Camera/VID_20210501_122030_HSR_120.mp4,video/mp4,1280,720,90,39542524,,1637508238,1619864442000,1619864442000,10950,0,0,,,,,,,,,,, +13888,5217,content://media/external/video/media/5217,/storage/emulated/0/DCIM/Camera/VID_20210501_121250_HSR_120.mp4,video/mp4,1280,720,0,40455690,,1637507982,1619863983000,1619863983000,11241,0,0,,,,,,,,,,, +13889,5209,content://media/external/video/media/5209,/storage/emulated/0/DCIM/Camera/VID_20210501_121137.mp4,video/mp4,1920,1080,90,4548164,,1637507953,1619863902000,1619863902000,1300,0,0,,,,,,,,,,, +13890,5208,content://media/external/video/media/5208,/storage/emulated/0/DCIM/Camera/VID_20210501_121113_HSR_120.mp4,video/mp4,1280,720,90,39843042,,1637507953,1619863885000,1619863885000,11103,0,0,,,,,,,,,,, +13891,5229,content://media/external/video/media/5229,/storage/emulated/0/DCIM/Camera/VID_20210501_121104_HSR_120.mp4,video/mp4,1280,720,90,23004725,,1637508194,1619863871000,1619863871000,6361,0,0,,,,,,,,,,, +13892,5233,content://media/external/video/media/5233,/storage/emulated/0/DCIM/Camera/VID_20210501_111206.mp4,video/mp4,1920,1080,90,87620333,,1637508238,1619860362000,1619860362000,34390,0,0,,,,,,,,,,, +13893,5199,content://media/external/video/media/5199,/storage/emulated/0/DCIM/367262990/VIDEO_20201227_143745341.mp4,video/mp4,2304,1296,0,918876,,1637507864,1609076265000,0,8748,0,0,,,,,,,,,,, +13894,5202,content://media/external/video/media/5202,/storage/emulated/0/DCIM/Camera/VID_20201128_093831.mp4,video/mp4,1920,1080,90,16825414,,1637507864,1606552718000,1606552718000,6351,0,0,,,,,,,,,,, +13895,5222,content://media/external/video/media/5222,/storage/emulated/0/DCIM/Camera/VID_20200908_105431.mp4,video/mp4,1920,1080,90,33432311,,1637508090,1599555285000,1599555285000,13013,0,0,,,,,,,,,,, +13896,5205,content://media/external/video/media/5205,/storage/emulated/0/DCIM/Camera/VID_20200718_120538.mp4,video/mp4,1920,1080,90,123009682,,1637507916,1595066788000,1595066788000,48680,0,0,,,,,,,,,,, +13897,5207,content://media/external/video/media/5207,/storage/emulated/0/DCIM/Camera/VID_20200422_173459.mp4,video/mp4,1920,1080,90,3086084,,1637507953,1587569702000,1587569702000,1164,0,0,,,,,,,,,,, +13898,5246,content://media/external/video/media/5246,/storage/emulated/0/DCIM/Camera/VID_20200328_211732.mp4,video/mp4,1920,1080,90,12703640,,1637508324,1585426658000,1585426658000,4925,0,0,,,,,,,,,,, +13899,5201,content://media/external/video/media/5201,/storage/emulated/0/DCIM/Camera/VID_20200304_221509.mp4,video/mp4,1920,1080,0,103227509,,1637507864,1583356551000,1583356551000,40783,0,0,,,,,,,,,,, +13900,5250,content://media/external/video/media/5250,/storage/emulated/0/DCIM/Camera/VID_20200222_211743.mp4,video/mp4,1920,1080,0,745776064,,1637508433,1582402959000,1582402959000,295358,0,0,,,,,,,,,,, +13901,5221,content://media/external/video/media/5221,/storage/emulated/0/DCIM/Camera/VID_20200106_215632.mp4,video/mp4,1920,1080,90,65617938,,1637508090,1578344219000,1578344219000,25813,0,0,,,,,,,,,,, +13902,5216,content://media/external/video/media/5216,/storage/emulated/0/DCIM/Camera/VID_20200101_000404.mp4,video/mp4,1920,1080,90,70650914,,1637507981,1577833473000,1577833473000,27855,0,0,,,,,,,,,,, +13903,5206,content://media/external/video/media/5206,/storage/emulated/0/DCIM/Camera/VID_20191221_162658.mp4,video/mp4,1920,1080,0,87995481,,1637507953,1576942054000,1576942054000,34742,0,0,,,,,,,,,,, +13904,7609,content://media/external/video/media/7609,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20191207-WA0027.mp4",video/mp4,848,480,90,1603686,,1637518223,1575733679000,1575726539000,7198,0,0,,,,,,,,,,, +13905,5220,content://media/external/video/media/5220,/storage/emulated/0/DCIM/Camera/VID_20191201_172255.mp4,video/mp4,1920,1080,90,2666010,,1637508090,1575217377000,1575217377000,773,0,0,,,,,,,,,,, +13906,5215,content://media/external/video/media/5215,/storage/emulated/0/DCIM/Camera/VID_20191124_094017.mp4,video/mp4,1920,1080,90,6569692,,1637507981,1574584820000,1574584820000,2337,0,0,,,,,,,,,,, +13907,5239,content://media/external/video/media/5239,/storage/emulated/0/DCIM/Camera/VID_20191123_175238.mp4,video/mp4,1920,1080,90,53494148,,1637508289,1574527981000,1574527981000,21028,0,0,,,,,,,,,,, +13908,5214,content://media/external/video/media/5214,/storage/emulated/0/DCIM/Camera/VID_20191123_175146.mp4,video/mp4,1920,1080,90,15560523,,1637507981,1574527913000,1574527913000,6000,0,0,,,,,,,,,,, +13909,5242,content://media/external/video/media/5242,/storage/emulated/0/DCIM/Camera/VID_20191018_183750.mp4,video/mp4,1920,1080,0,249796093,,1637508306,1571416770000,1571416770000,98767,0,0,,,,,,,,,,, +13910,5219,content://media/external/video/media/5219,/storage/emulated/0/DCIM/Camera/VID_20190921_124555.mp4,video/mp4,1920,1080,90,56385712,,1637508090,1569062779000,1569062779000,22310,0,0,,,,,,,,,,, +13911,5212,content://media/external/video/media/5212,/storage/emulated/0/DCIM/Camera/VID_20190921_121929.mp4,video/mp4,1920,1080,90,64138334,,1637507955,1569061196000,1569061196000,25379,0,0,,,,,,,,,,, +13912,5200,content://media/external/video/media/5200,/storage/emulated/0/DCIM/Camera/VID_20190907_163811.mp4,video/mp4,1920,1080,0,41157835,,1637507864,1567867108000,1567867108000,16289,0,0,,,,,,,,,,, +13913,1000020101,content://media/external/images/media/1000020101,/storage/emulated/0/DCIM/Screenshots/Screenshot_2026-03-12-13-28-00-079_deckers.thibault.aves.debug.jpg,image/jpeg,1080,2400,0,780252,,1773318480,1773318480157,0,0,0,0,,,,,,,,,,, +13914,1000019657,content://media/external/images/media/1000019657,/storage/emulated/0/DCIM/Screenshots/Screenshot_2025-10-27-21-11-59-581_com.example.webauthn_flutter.jpg,image/jpeg,1080,2400,0,184918,,1761595919,1761595919841,0,0,0,0,,,,,,,,,,, +13915,1000019251,content://media/external/images/media/1000019251,/storage/emulated/0/DCIM/Camera/IMG_20250810_121828.jpg,image/jpeg,3472,4640,0,6177515,,1754821109,1754821112383,1754821108570,0,0,0,,,,,,,,,,, +13916,1000019250,content://media/external/images/media/1000019250,/storage/emulated/0/DCIM/Camera/IMG_20250810_121822.jpg,image/jpeg,3472,4640,0,3773772,,1754821103,1754821110847,1754821103064,0,0,0,,,,,,,,,,, +13917,1000019249,content://media/external/images/media/1000019249,/storage/emulated/0/DCIM/Camera/IMG_20250810_121817.jpg,image/jpeg,3472,4640,0,4270621,,1754821098,1754821105143,1754821097513,0,0,0,,,,,,,,,,, +13918,1000018527,content://media/external/images/media/1000018527,/storage/emulated/0/DCIM/Camera/IMG_20250204_104544.jpg,image/jpeg,3472,4640,0,6799176,,1738662346,1738662354782,1738662344594,0,0,0,,,,,,,,,,, +13919,1000018526,content://media/external/images/media/1000018526,/storage/emulated/0/DCIM/Camera/IMG_20250204_104528.jpg,image/jpeg,3472,4640,0,4551647,,1738662333,1738662338250,1738662328825,0,0,0,,,,,,,,,,, +13920,1000018523,content://media/external/images/media/1000018523,/storage/emulated/0/DCIM/Camera/IMG_20250129_080657.jpg,image/jpeg,2450,1943,0,4161293,,1738134417,1738134421104,1738134417709,0,0,0,,,,,,,,,,, +13921,1000018486,content://media/external/images/media/1000018486,/storage/emulated/0/DCIM/Camera/IMG_20250125_103858.jpg,image/jpeg,2813,3991,0,4403217,,1737797939,1737797944240,1737797938693,0,0,0,,,,,,,,,,, +13922,1000018374,content://media/external/images/media/1000018374,/storage/emulated/0/Pictures/IMG_0206.jpg,image/jpeg,1500,1001,0,268463,,1735806799,1735806799595,0,0,0,0,,,,,,,,,,, +13923,1000017561,content://media/external/images/media/1000017561,/storage/emulated/0/DCIM/Camera/IMG_20230406_093739.jpg,image/jpeg,2592,4608,0,4581800,,1680766660,1680766661753,1680766659114,0,0,0,,,,,,,,,,, +13924,1000017199,content://media/external/images/media/1000017199,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0023.jpg",image/jpeg,921,2048,0,100057,,1676472921,1676472922362,0,0,0,0,,,,,,,,,,, +13925,1000017196,content://media/external/images/media/1000017196,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0022.jpg",image/jpeg,921,2048,0,102459,,1676472915,1676472921761,0,0,0,0,,,,,,,,,,, +13926,1000017192,content://media/external/images/media/1000017192,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0021.jpg",image/jpeg,1600,764,0,150438,,1676469491,1676470460661,0,0,0,0,,,,,,,,,,, +13927,1000017190,content://media/external/images/media/1000017190,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-15-14-56-56-555_com.google.android.apps.docs-edit.jpg,image/jpeg,1017,996,0,289800,,1676469427,1676469427922,0,0,0,0,,,,,,,,,,, +13928,1000017189,content://media/external/images/media/1000017189,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-15-14-56-56-555_com.google.android.apps.docs.jpg,image/jpeg,1080,2400,0,654556,,1676469416,1676469417102,0,0,0,0,,,,,,,,,,, +13929,1000017176,content://media/external/images/media/1000017176,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0019.jpg",image/jpeg,1600,719,0,254051,,1676469325,1676469326243,0,0,0,0,,,,,,,,,,, +13930,1000017173,content://media/external/images/media/1000017173,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0018.jpg",image/jpeg,1600,719,0,234955,,1676469325,1676469325891,0,0,0,0,,,,,,,,,,, +13931,1000017168,content://media/external/images/media/1000017168,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0017.jpg",image/jpeg,2048,1532,0,417289,,1676465765,1676465766018,0,0,0,0,,,,,,,,,,, +13932,1000017162,content://media/external/images/media/1000017162,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0015.jpg",image/jpeg,2048,1532,0,480560,,1676465764,1676465765067,0,0,0,0,,,,,,,,,,, +13933,1000017165,content://media/external/images/media/1000017165,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0016.jpg",image/jpeg,1532,2048,0,365348,,1676465765,1676465765517,0,0,0,0,,,,,,,,,,, +13934,1000017156,content://media/external/images/media/1000017156,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0013.jpg",image/jpeg,2048,1532,0,261621,,1676465763,1676465764033,0,0,0,0,,,,,,,,,,, +13935,1000017159,content://media/external/images/media/1000017159,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0014.jpg",image/jpeg,2048,1532,0,343535,,1676465764,1676465764429,0,0,0,0,,,,,,,,,,, +13936,1000017150,content://media/external/images/media/1000017150,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0011.jpg",image/jpeg,1532,2048,0,224870,,1676465762,1676465763299,0,0,0,0,,,,,,,,,,, +13937,1000017153,content://media/external/images/media/1000017153,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0012.jpg",image/jpeg,1532,2048,0,250785,,1676465763,1676465763780,0,0,0,0,,,,,,,,,,, +13938,1000017147,content://media/external/images/media/1000017147,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0010.jpg",image/jpeg,1532,2048,0,250725,,1676465761,1676465762413,0,0,0,0,,,,,,,,,,, +13939,1000017140,content://media/external/images/media/1000017140,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0009.jpg",image/jpeg,1200,1599,0,151431,,1676463418,1676463420986,0,0,0,0,,,,,,,,,,, +13940,1000017137,content://media/external/images/media/1000017137,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0008.jpg",image/jpeg,1200,1599,0,280768,,1676462769,1676462770138,0,0,0,0,,,,,,,,,,, +13941,1000017134,content://media/external/images/media/1000017134,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0007.jpg",image/jpeg,1532,2048,0,186948,,1676461675,1676461676535,0,0,0,0,,,,,,,,,,, +13942,1000017131,content://media/external/images/media/1000017131,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0006.jpg",image/jpeg,2048,1536,0,643220,,1676460189,1676460193906,0,0,0,0,,,,,,,,,,, +13943,1000017128,content://media/external/images/media/1000017128,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0005.jpg",image/jpeg,1200,1599,0,280447,,1676457919,1676457920859,0,0,0,0,,,,,,,,,,, +13944,1000017121,content://media/external/images/media/1000017121,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0004.jpg",image/jpeg,2048,1532,0,169269,,1676445734,1676445735288,0,0,0,0,,,,,,,,,,, +13945,1000017115,content://media/external/images/media/1000017115,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0003.jpg",image/jpeg,2048,1532,0,133330,,1676444229,1676444230359,0,0,0,0,,,,,,,,,,, +13946,1000017112,content://media/external/images/media/1000017112,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0002.jpg",image/jpeg,2048,1532,0,167765,,1676444228,1676444229460,0,0,0,0,,,,,,,,,,, +13947,1000017109,content://media/external/images/media/1000017109,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0001.jpg",image/jpeg,2048,1532,0,246704,,1676443003,1676443038434,0,0,0,0,,,,,,,,,,, +13948,1000017099,content://media/external/images/media/1000017099,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0000.jpg",image/jpeg,1532,2048,0,121328,,1676417154,1676417155093,0,0,0,0,,,,,,,,,,, +13949,1000017096,content://media/external/images/media/1000017096,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0010.jpg",image/jpeg,1080,905,0,203460,,1676401060,1676401061169,0,0,0,0,,,,,,,,,,, +13950,1000017087,content://media/external/images/media/1000017087,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0008.jpg",image/jpeg,701,1024,0,56841,,1676387088,1676387088353,0,0,0,0,,,,,,,,,,, +13951,1000017081,content://media/external/images/media/1000017081,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0006.jpg",image/jpeg,630,787,0,61761,,1676386525,1676386526260,0,0,0,0,,,,,,,,,,, +13952,1000017084,content://media/external/images/media/1000017084,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0007.jpg",image/jpeg,633,1078,0,56259,,1676386526,1676386526603,0,0,0,0,,,,,,,,,,, +13953,1000017078,content://media/external/images/media/1000017078,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0005.jpg",image/jpeg,1065,1015,0,104603,,1676375271,1676375271905,0,0,0,0,,,,,,,,,,, +13954,1000017072,content://media/external/images/media/1000017072,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0004.jpg",image/jpeg,1600,604,0,149717,,1676373634,1676373635392,0,0,0,0,,,,,,,,,,, +13955,1000017070,content://media/external/images/media/1000017070,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0003.jpg",image/jpeg,1188,583,0,169100,,1676371498,1676371498632,0,0,0,0,,,,,,,,,,, +13956,1000017068,content://media/external/images/media/1000017068,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0002.jpg",image/jpeg,836,618,0,113876,,1676371338,1676371339102,0,0,0,0,,,,,,,,,,, +13957,1000017065,content://media/external/images/media/1000017065,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0001.jpg",image/jpeg,930,201,0,67796,,1676366075,1676366075497,0,0,0,0,,,,,,,,,,, +13958,1000017062,content://media/external/images/media/1000017062,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0000.jpg",image/jpeg,1600,688,0,101131,,1676363084,1676363085479,0,0,0,0,,,,,,,,,,, +13959,1000017052,content://media/external/images/media/1000017052,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0004.jpg",image/jpeg,921,2048,0,194676,,1676319091,1676319092130,0,0,0,0,,,,,,,,,,, +13960,1000017049,content://media/external/images/media/1000017049,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0003.jpg",image/jpeg,2048,1536,0,310678,,1676288280,1676288282158,0,0,0,0,,,,,,,,,,, +13961,1000017046,content://media/external/images/media/1000017046,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0002.jpg",image/jpeg,1536,2048,0,218853,,1676288279,1676288280907,0,0,0,0,,,,,,,,,,, +13962,1000017044,content://media/external/images/media/1000017044,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-13-12-08-26-323_com.miui.home.jpg,image/jpeg,1080,2400,0,794984,,1676286506,1676286506865,0,0,0,0,,,,,,,,,,, +13963,1000017041,content://media/external/images/media/1000017041,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0000.jpg",image/jpeg,900,1600,0,39706,,1676279875,1676279876199,0,0,0,0,,,,,,,,,,, +13964,1000017040,content://media/external/images/media/1000017040,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-13-10-07-09-365_com.miui.home.jpg,image/jpeg,1080,2400,0,807932,,1676279229,1676279229920,0,0,0,0,,,,,,,,,,, +13965,1000017015,content://media/external/images/media/1000017015,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230212-WA0005.jpg",image/jpeg,2048,1536,0,615150,,1676225289,1676225291461,0,0,0,0,,,,,,,,,,, +13966,1000017008,content://media/external/images/media/1000017008,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230212-WA0004.jpg",image/jpeg,768,1024,0,115959,,1676209150,1676209151138,0,0,0,0,,,,,,,,,,, +13967,1000017006,content://media/external/images/media/1000017006,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-12-14-17-21-917_com.instagram.android.jpg,image/jpeg,1080,2400,0,801141,,1676207842,1676207842398,0,0,0,0,,,,,,,,,,, +13968,1000017003,content://media/external/images/media/1000017003,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230212-WA0002.jpg",image/jpeg,2048,1532,0,266459,,1676204314,1676204315042,0,0,0,0,,,,,,,,,,, +13969,1000016999,content://media/external/images/media/1000016999,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-12-08-21-46-596_com.whatsapp.jpg,image/jpeg,1080,2400,0,876809,,1676186506,1676186507008,0,0,0,0,,,,,,,,,,, +13970,1000016989,content://media/external/images/media/1000016989,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0014.jpg",image/jpeg,921,2048,0,106154,,1676149901,1676149901676,0,0,0,0,,,,,,,,,,, +13971,1000016973,content://media/external/images/media/1000016973,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-18-05-12-024_com.google.android.gm.jpg,image/jpeg,1080,2400,0,615455,,1676135112,1676135112487,0,0,0,0,,,,,,,,,,, +13972,1000016971,content://media/external/images/media/1000016971,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-17-33-02-236_com.whatsapp.jpg,image/jpeg,1080,2400,0,828351,,1676133182,1676133182674,0,0,0,0,,,,,,,,,,, +13973,1000016968,content://media/external/images/media/1000016968,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0009.jpg",image/jpeg,1080,1080,0,60850,,1676125605,1676125606556,0,0,0,0,,,,,,,,,,, +13974,1000016965,content://media/external/images/media/1000016965,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0008.jpg",image/jpeg,1080,608,0,74140,,1676122954,1676122954784,0,0,0,0,,,,,,,,,,, +13975,1000016960,content://media/external/images/media/1000016960,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-12-29-01-111_com.whatsapp.jpg,image/jpeg,1080,2400,0,828986,,1676114941,1676114941220,0,0,0,0,,,,,,,,,,, +13976,1000016958,content://media/external/images/media/1000016958,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-12-28-39-912_com.whatsapp.jpg,image/jpeg,1080,2400,0,724062,,1676114920,1676114920404,0,0,0,0,,,,,,,,,,, +13977,1000016945,content://media/external/images/media/1000016945,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0001.jpg",image/jpeg,1152,2048,0,271535,,1676102221,1676102221863,0,0,0,0,,,,,,,,,,, +13978,1000016942,content://media/external/images/media/1000016942,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0000.jpg",image/jpeg,843,1600,0,126235,,1676100159,1676100204800,0,0,0,0,,,,,,,,,,, +13979,1000016926,content://media/external/images/media/1000016926,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0006.jpg",image/jpeg,1080,1385,0,137403,,1676053786,1676053787593,0,0,0,0,,,,,,,,,,, +13980,1000016924,content://media/external/images/media/1000016924,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-10-17-31-10-634_com.google.android.googlequicksearchbox-edit.jpg,image/jpeg,865,1054,0,272112,,1676046681,1676046681175,0,0,0,0,,,,,,,,,,, +13981,1000016922,content://media/external/images/media/1000016922,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0004.jpg",image/jpeg,1080,1074,0,129533,,1676041126,1676041126653,0,0,0,0,,,,,,,,,,, +13982,1000016920,content://media/external/images/media/1000016920,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-10-15-57-09-170_com.miui.home.jpg,image/jpeg,1080,2400,0,625585,,1676041029,1676041029651,0,0,0,0,,,,,,,,,,, +13983,1000016917,content://media/external/images/media/1000016917,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0003.jpg",image/jpeg,720,793,0,64094,,1676040722,1676040723409,0,0,0,0,,,,,,,,,,, +13984,1000016914,content://media/external/images/media/1000016914,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0002.jpg",image/jpeg,1080,1920,0,318779,,1676038842,1676038843415,0,0,0,0,,,,,,,,,,, +13985,1000016911,content://media/external/images/media/1000016911,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0001.jpg",image/jpeg,720,675,0,42122,,1676036778,1676036779132,0,0,0,0,,,,,,,,,,, +13986,1000016890,content://media/external/images/media/1000016890,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0014.jpg",image/jpeg,719,1600,0,155891,,1675982833,1675982834246,0,0,0,0,,,,,,,,,,, +13987,1000016876,content://media/external/images/media/1000016876,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0011.jpg",image/jpeg,1054,1600,0,192046,,1675974343,1675974344500,0,0,0,0,,,,,,,,,,, +13988,1000016851,content://media/external/images/media/1000016851,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0006.jpg",image/jpeg,500,913,0,67535,,1675945299,1675945299653,0,0,0,0,,,,,,,,,,, +13989,1000016812,content://media/external/images/media/1000016812,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0010.jpg",image/jpeg,2048,1532,0,371772,,1675864591,1675864592310,0,0,0,0,,,,,,,,,,, +13990,1000016806,content://media/external/images/media/1000016806,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0008.jpg",image/jpeg,2048,1532,0,382274,,1675864590,1675864591284,0,0,0,0,,,,,,,,,,, +13991,1000016809,content://media/external/images/media/1000016809,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0009.jpg",image/jpeg,2048,1532,0,439268,,1675864591,1675864591956,0,0,0,0,,,,,,,,,,, +13992,1000016798,content://media/external/images/media/1000016798,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0006.jpg",image/jpeg,2048,1532,0,422064,,1675854403,1675854404057,0,0,0,0,,,,,,,,,,, +13993,1000016795,content://media/external/images/media/1000016795,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0005.jpg",image/jpeg,2048,1532,0,338082,,1675854401,1675854403116,0,0,0,0,,,,,,,,,,, +13994,1000016789,content://media/external/images/media/1000016789,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0003.jpg",image/jpeg,2048,1532,0,279930,,1675853773,1675853774325,0,0,0,0,,,,,,,,,,, +13995,1000016792,content://media/external/images/media/1000016792,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0004.jpg",image/jpeg,1532,2048,0,190775,,1675853774,1675853774499,0,0,0,0,,,,,,,,,,, +13996,1000016786,content://media/external/images/media/1000016786,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0002.jpg",image/jpeg,1532,2048,0,289841,,1675853773,1675853773791,0,0,0,0,,,,,,,,,,, +13997,1000016778,content://media/external/images/media/1000016778,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0000.jpg",image/jpeg,1512,1512,0,409315,,1675843626,1675843627156,0,0,0,0,,,,,,,,,,, +13998,1000016765,content://media/external/images/media/1000016765,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230207-WA0001.jpg",image/jpeg,1078,1346,0,216388,,1675801742,1675802013417,0,0,0,0,,,,,,,,,,, +13999,1000016762,content://media/external/images/media/1000016762,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230207-WA0000.jpg",image/jpeg,1200,1600,0,213350,,1675785430,1675785431507,0,0,0,0,,,,,,,,,,, +14000,1000016738,content://media/external/images/media/1000016738,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-07-16-13-05-638_com.shazam.android.jpg,image/jpeg,1080,2400,0,941691,,1675782785,1675782785881,0,0,0,0,,,,,,,,,,, +14001,1000016707,content://media/external/images/media/1000016707,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230206-WA0000.jpg",image/jpeg,921,2048,0,193385,,1675667822,1675667823018,0,0,0,0,,,,,,,,,,, +14002,1000016692,content://media/external/images/media/1000016692,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0032.jpg",image/jpeg,2048,1532,0,215636,,1675614842,1675614843850,0,0,0,0,,,,,,,,,,, +14003,1000016689,content://media/external/images/media/1000016689,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0031.jpg",image/jpeg,2048,1532,0,279947,,1675614841,1675614842427,0,0,0,0,,,,,,,,,,, +14004,1000016686,content://media/external/images/media/1000016686,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0030.jpg",image/jpeg,2048,1532,0,331013,,1675614840,1675614841301,0,0,0,0,,,,,,,,,,, +14005,1000016683,content://media/external/images/media/1000016683,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0029.jpg",image/jpeg,2048,1532,0,328680,,1675614839,1675614840717,0,0,0,0,,,,,,,,,,, +14006,1000016680,content://media/external/images/media/1000016680,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0028.jpg",image/jpeg,2048,1532,0,337417,,1675614838,1675614839674,0,0,0,0,,,,,,,,,,, +14007,1000016677,content://media/external/images/media/1000016677,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0027.jpg",image/jpeg,2048,1532,0,294504,,1675614837,1675614838417,0,0,0,0,,,,,,,,,,, +14008,1000016674,content://media/external/images/media/1000016674,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0026.jpg",image/jpeg,2048,1532,0,358036,,1675614835,1675614837157,0,0,0,0,,,,,,,,,,, +14009,1000016668,content://media/external/images/media/1000016668,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0024.jpg",image/jpeg,2048,1532,0,333838,,1675614834,1675614835006,0,0,0,0,,,,,,,,,,, +14010,1000016671,content://media/external/images/media/1000016671,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0025.jpg",image/jpeg,2048,1532,0,347022,,1675614835,1675614835777,0,0,0,0,,,,,,,,,,, +14011,1000016665,content://media/external/images/media/1000016665,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0023.jpg",image/jpeg,2048,1532,0,324751,,1675614833,1675614834475,0,0,0,0,,,,,,,,,,, +14012,1000016659,content://media/external/images/media/1000016659,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0021.jpg",image/jpeg,1532,2048,0,240105,,1675614832,1675614833324,0,0,0,0,,,,,,,,,,, +14013,1000016662,content://media/external/images/media/1000016662,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0022.jpg",image/jpeg,2048,1532,0,353403,,1675614833,1675614833926,0,0,0,0,,,,,,,,,,, +14014,1000016656,content://media/external/images/media/1000016656,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0020.jpg",image/jpeg,1532,2048,0,382894,,1675614831,1675614832872,0,0,0,0,,,,,,,,,,, +14015,1000016653,content://media/external/images/media/1000016653,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0019.jpg",image/jpeg,1532,2048,0,385053,,1675614830,1675614831813,0,0,0,0,,,,,,,,,,, +14016,1000016650,content://media/external/images/media/1000016650,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0018.jpg",image/jpeg,1532,2048,0,398987,,1675614829,1675614830355,0,0,0,0,,,,,,,,,,, +14017,1000016599,content://media/external/images/media/1000016599,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0002.jpg",image/jpeg,2048,1532,0,340368,,1675595233,1675614829075,0,0,0,0,,,,,,,,,,, +14018,1000016646,content://media/external/images/media/1000016646,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0017.jpg",image/jpeg,2048,1532,0,330573,,1675614828,1675614829037,0,0,0,0,,,,,,,,,,, +14019,1000016643,content://media/external/images/media/1000016643,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0016.jpg",image/jpeg,1532,2048,0,391092,,1675614827,1675614828295,0,0,0,0,,,,,,,,,,, +14020,1000016640,content://media/external/images/media/1000016640,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0015.jpg",image/jpeg,1532,2048,0,354548,,1675614826,1675614827469,0,0,0,0,,,,,,,,,,, +14021,1000016634,content://media/external/images/media/1000016634,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0013.jpg",image/jpeg,1532,2048,0,386698,,1675614825,1675614826398,0,0,0,0,,,,,,,,,,, +14022,1000016637,content://media/external/images/media/1000016637,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0014.jpg",image/jpeg,1532,2048,0,370078,,1675614826,1675614826946,0,0,0,0,,,,,,,,,,, +14023,1000016628,content://media/external/images/media/1000016628,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0011.jpg",image/jpeg,2048,1532,0,370664,,1675614824,1675614825110,0,0,0,0,,,,,,,,,,, +14024,1000016631,content://media/external/images/media/1000016631,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0012.jpg",image/jpeg,1532,2048,0,280670,,1675614825,1675614825707,0,0,0,0,,,,,,,,,,, +14025,1000016622,content://media/external/images/media/1000016622,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0009.jpg",image/jpeg,2048,1532,0,318984,,1675614823,1675614824075,0,0,0,0,,,,,,,,,,, +14026,1000016625,content://media/external/images/media/1000016625,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0010.jpg",image/jpeg,2048,1532,0,302076,,1675614824,1675614824553,0,0,0,0,,,,,,,,,,, +14027,1000016619,content://media/external/images/media/1000016619,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0008.jpg",image/jpeg,2048,1532,0,339385,,1675614822,1675614823482,0,0,0,0,,,,,,,,,,, +14028,1000016613,content://media/external/images/media/1000016613,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0006.jpg",image/jpeg,2048,1532,0,341430,,1675614821,1675614822500,0,0,0,0,,,,,,,,,,, +14029,1000016616,content://media/external/images/media/1000016616,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0007.jpg",image/jpeg,2048,1532,0,348511,,1675614822,1675614822962,0,0,0,0,,,,,,,,,,, +14030,1000016610,content://media/external/images/media/1000016610,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0005.jpg",image/jpeg,2048,1532,0,351561,,1675614820,1675614821760,0,0,0,0,,,,,,,,,,, +14031,1000016607,content://media/external/images/media/1000016607,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0004.jpg",image/jpeg,1532,2048,0,361860,,1675614819,1675614820772,0,0,0,0,,,,,,,,,,, +14032,1000016596,content://media/external/images/media/1000016596,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0001.jpg",image/jpeg,1080,1629,0,115084,,1675591187,1675591188248,0,0,0,0,,,,,,,,,,, +14033,1000016586,content://media/external/images/media/1000016586,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-49-15-733_com.android.chrome.jpg,image/jpeg,1080,2400,0,621329,,1675529356,1675529356116,0,0,0,0,,,,,,,,,,, +14034,1000016585,content://media/external/images/media/1000016585,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-48-21-380_com.android.chrome.jpg,image/jpeg,1080,2400,0,746568,,1675529301,1675529301456,0,0,0,0,,,,,,,,,,, +14035,1000016584,content://media/external/images/media/1000016584,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-48-15-501_com.android.chrome.jpg,image/jpeg,1080,2400,0,618906,,1675529295,1675529295908,0,0,0,0,,,,,,,,,,, +14036,1000016581,content://media/external/images/media/1000016581,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-15-21-802_com.google.android.googlequicksearchbox.jpg,image/jpeg,1080,2400,0,605874,,1675527322,1675527322137,0,0,0,0,,,,,,,,,,, +14037,1000016572,content://media/external/images/media/1000016572,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230204-WA0000.jpg",image/jpeg,1200,1600,0,193943,,1675516863,1675516864059,0,0,0,0,,,,,,,,,,, +14038,1000016545,content://media/external/images/media/1000016545,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-03-19-56-29-319_com.whatsapp.jpg,image/jpeg,1080,2400,0,836985,,1675450589,1675450589732,0,0,0,0,,,,,,,,,,, +14039,1000016536,content://media/external/images/media/1000016536,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0003.jpg",image/jpeg,2048,1532,0,345525,,1675438864,1675438865252,0,0,0,0,,,,,,,,,,, +14040,1000016539,content://media/external/images/media/1000016539,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0004.jpg",image/jpeg,2048,1532,0,501543,,1675438865,1675438865620,0,0,0,0,,,,,,,,,,, +14041,1000016533,content://media/external/images/media/1000016533,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0002.jpg",image/jpeg,2048,1532,0,591603,,1675438862,1675438864364,0,0,0,0,,,,,,,,,,, +14042,1000016527,content://media/external/images/media/1000016527,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0001.jpg",image/jpeg,921,2048,0,143731,,1675425476,1675425477061,0,0,0,0,,,,,,,,,,, +14043,1000016524,content://media/external/images/media/1000016524,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0000.jpg",image/jpeg,921,2048,0,85831,,1675420661,1675420661816,0,0,0,0,,,,,,,,,,, +14044,1000016513,content://media/external/images/media/1000016513,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230202-WA0004.jpg",image/jpeg,921,2048,0,136481,,1675372541,1675372542638,0,0,0,0,,,,,,,,,,, +14045,1000016511,content://media/external/images/media/1000016511,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-02-18-13-19-852_ch.publisheria.bring.jpg,image/jpeg,1080,2400,0,496941,,1675358000,1675358000252,0,0,0,0,,,,,,,,,,, +14046,1000016505,content://media/external/images/media/1000016505,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-02-16-34-54-238_com.google.android.googlequicksearchbox-edit.jpg,image/jpeg,1080,2400,0,588438,,1675352107,1675352107284,0,0,0,0,,,,,,,,,,, +14047,1000016497,content://media/external/images/media/1000016497,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230202-WA0000.jpg",image/jpeg,2048,1532,0,430669,,1675327248,1675327249081,0,0,0,0,,,,,,,,,,, +14048,1000016477,content://media/external/images/media/1000016477,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230201-WA0003.jpg",image/jpeg,2048,1532,0,395349,,1675247402,1675247403069,0,0,0,0,,,,,,,,,,, +14049,1000016474,content://media/external/images/media/1000016474,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230201-WA0002.jpg",image/jpeg,2048,1532,0,605187,,1675247214,1675247216020,0,0,0,0,,,,,,,,,,, +14050,1000016470,content://media/external/images/media/1000016470,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230201-WA0000.jpg",image/jpeg,921,2048,0,197092,,1675238350,1675238351188,0,0,0,0,,,,,,,,,,, +14051,1000016454,content://media/external/images/media/1000016454,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230131-WA0006.jpg",image/jpeg,1268,1792,0,260899,,1675175957,1675175958490,0,0,0,0,,,,,,,,,,, +14052,1000016451,content://media/external/images/media/1000016451,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230131-WA0005.jpg",image/jpeg,1292,1828,0,228335,,1675175955,1675175957429,0,0,0,0,,,,,,,,,,, +14053,1000016449,content://media/external/images/media/1000016449,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-12-21-22-297_com.momondo.flightsearch.jpg,image/jpeg,1080,2400,0,557143,,1675164082,1675164082707,0,0,0,0,,,,,,,,,,, +14054,1000016447,content://media/external/images/media/1000016447,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-12-10-40-642_com.momondo.flightsearch.jpg,image/jpeg,1080,2400,0,563187,,1675163440,1675163440736,0,0,0,0,,,,,,,,,,, +14055,1000016446,content://media/external/images/media/1000016446,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-12-10-30-976_com.momondo.flightsearch.jpg,image/jpeg,1080,2400,0,562512,,1675163431,1675163431508,0,0,0,0,,,,,,,,,,, +14056,1000016444,content://media/external/images/media/1000016444,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-10-54-37-729_com.google.android.gm.jpg,image/jpeg,1080,2400,0,616113,,1675158878,1675158878164,0,0,0,0,,,,,,,,,,, +14057,1000016430,content://media/external/images/media/1000016430,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0007.jpg",image/jpeg,1536,2048,0,224338,,1675108977,1675108978697,0,0,0,0,,,,,,,,,,, +14058,1000016412,content://media/external/images/media/1000016412,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0005.jpg",image/jpeg,921,2048,0,135044,,1675083107,1675083108655,0,0,0,0,,,,,,,,,,, +14059,1000016409,content://media/external/images/media/1000016409,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0004.jpg",image/jpeg,520,720,0,38680,,1675082965,1675082966339,0,0,0,0,,,,,,,,,,, +14060,1000016402,content://media/external/images/media/1000016402,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-30-12-01-39-334_com.google.android.gm.jpg,image/jpeg,1080,2400,0,329317,,1675076499,1675076499705,0,0,0,0,,,,,,,,,,, +14061,1000016399,content://media/external/images/media/1000016399,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0000.jpg",image/jpeg,2048,1536,0,307208,,1675064256,1675064256872,0,0,0,0,,,,,,,,,,, +14062,1000016388,content://media/external/images/media/1000016388,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230129-WA0000.jpg",image/jpeg,844,1600,0,141167,,1674999565,1674999565840,0,0,0,0,,,,,,,,,,, +14063,1000016361,content://media/external/images/media/1000016361,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0014.jpg",image/jpeg,851,1024,0,65570,,1674942141,1674942142625,0,0,0,0,,,,,,,,,,, +14064,1000016358,content://media/external/images/media/1000016358,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0013.jpg",image/jpeg,646,1024,0,98011,,1674942036,1674942038296,0,0,0,0,,,,,,,,,,, +14065,1000016348,content://media/external/images/media/1000016348,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0012.jpg",image/jpeg,1168,1600,0,159464,,1674933498,1674933499829,0,0,0,0,,,,,,,,,,, +14066,1000016346,content://media/external/images/media/1000016346,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0011.jpg",image/jpeg,720,617,0,42987,,1674925443,1674925443525,0,0,0,0,,,,,,,,,,, +14067,1000016339,content://media/external/images/media/1000016339,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0009.jpg",image/jpeg,720,1600,0,34057,,1674923139,1674923139587,0,0,0,0,,,,,,,,,,, +14068,1000016336,content://media/external/images/media/1000016336,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0008.jpg",image/jpeg,1152,2048,0,171339,,1674917876,1674917876686,0,0,0,0,,,,,,,,,,, +14069,1000016334,content://media/external/images/media/1000016334,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20230128-WA0007.jpg",image/jpeg,1080,1409,0,117378,,1674910483,1674910483504,0,0,0,0,,,,,,,,,,, +14070,1000016315,content://media/external/images/media/1000016315,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20230128-WA0000.jpg",image/jpeg,2048,1532,0,180716,,1674892517,1674892518415,0,0,0,0,,,,,,,,,,, +14071,1000016301,content://media/external/images/media/1000016301,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230127-WA0003.jpg",image/jpeg,540,804,0,37123,,1674844417,1674844417728,0,0,0,0,,,,,,,,,,, +14072,1000016297,content://media/external/images/media/1000016297,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230127-WA0002.jpg",image/jpeg,1532,2048,0,205318,,1674824403,1674824404234,0,0,0,0,,,,,,,,,,, +14073,1000016287,content://media/external/images/media/1000016287,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230127-WA0001.jpg",image/jpeg,720,1600,0,150683,,1674807597,1674807597888,0,0,0,0,,,,,,,,,,, +14074,1000016284,content://media/external/images/media/1000016284,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230127-WA0000.jpg",image/jpeg,1200,1600,0,135021,,1674806525,1674806527284,0,0,0,0,,,,,,,,,,, +14075,1000016263,content://media/external/images/media/1000016263,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0004.jpg",image/jpeg,1080,565,0,84795,,1674757716,1674757716732,0,0,0,0,,,,,,,,,,, +14076,1000016260,content://media/external/images/media/1000016260,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0003.jpg",image/jpeg,899,1599,0,116557,,1674757250,1674757251360,0,0,0,0,,,,,,,,,,, +14077,1000016257,content://media/external/images/media/1000016257,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0002.jpg",image/jpeg,899,1599,0,107879,,1674757168,1674757168564,0,0,0,0,,,,,,,,,,, +14078,1000016254,content://media/external/images/media/1000016254,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0001.jpg",image/jpeg,921,2048,0,118007,,1674731354,1674731355407,0,0,0,0,,,,,,,,,,, +14079,1000016251,content://media/external/images/media/1000016251,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0000.jpg",image/jpeg,720,1600,0,114224,,1674731117,1674731118163,0,0,0,0,,,,,,,,,,, +14080,1000016235,content://media/external/images/media/1000016235,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230125-WA0005.jpg",image/jpeg,875,1600,0,112834,,1674668207,1674668207553,0,0,0,0,,,,,,,,,,, +14081,1000016232,content://media/external/images/media/1000016232,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230125-WA0004.jpg",image/jpeg,720,1600,0,62208,,1674668075,1674668075949,0,0,0,0,,,,,,,,,,, +14082,1000016221,content://media/external/images/media/1000016221,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-25-10-06-47-076_com.google.android.gm.jpg,image/jpeg,1080,2400,0,662053,,1674637607,1674637607456,0,0,0,0,,,,,,,,,,, +14083,1000016211,content://media/external/images/media/1000016211,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0023.jpg",image/jpeg,921,2048,0,143005,,1674598427,1674598428189,0,0,0,0,,,,,,,,,,, +14084,1000016209,content://media/external/images/media/1000016209,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0022.jpg",image/jpeg,946,652,0,152046,,1674571086,1674571086781,0,0,0,0,,,,,,,,,,, +14085,1000016200,content://media/external/images/media/1000016200,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0019.jpg",image/jpeg,768,1024,0,57323,,1674570436,1674570437196,0,0,0,0,,,,,,,,,,, +14086,1000016203,content://media/external/images/media/1000016203,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0020.jpg",image/jpeg,768,1024,0,55983,,1674570437,1674570437449,0,0,0,0,,,,,,,,,,, +14087,1000016206,content://media/external/images/media/1000016206,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0021.jpg",image/jpeg,1024,768,0,68543,,1674570437,1674570437672,0,0,0,0,,,,,,,,,,, +14088,1000016188,content://media/external/images/media/1000016188,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0015.jpg",image/jpeg,1024,683,0,70398,,1674570435,1674570436150,0,0,0,0,,,,,,,,,,, +14089,1000016191,content://media/external/images/media/1000016191,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0016.jpg",image/jpeg,768,1024,0,64017,,1674570436,1674570436443,0,0,0,0,,,,,,,,,,, +14090,1000016194,content://media/external/images/media/1000016194,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0017.jpg",image/jpeg,768,1024,0,51157,,1674570436,1674570436753,0,0,0,0,,,,,,,,,,, +14091,1000016197,content://media/external/images/media/1000016197,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0018.jpg",image/jpeg,768,1024,0,60792,,1674570436,1674570436954,0,0,0,0,,,,,,,,,,, +14092,1000016176,content://media/external/images/media/1000016176,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0011.jpg",image/jpeg,768,1024,0,57904,,1674570434,1674570435069,0,0,0,0,,,,,,,,,,, +14093,1000016179,content://media/external/images/media/1000016179,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0012.jpg",image/jpeg,1024,683,0,53017,,1674570435,1674570435330,0,0,0,0,,,,,,,,,,, +14094,1000016182,content://media/external/images/media/1000016182,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0013.jpg",image/jpeg,1024,682,0,54181,,1674570435,1674570435584,0,0,0,0,,,,,,,,,,, +14095,1000016185,content://media/external/images/media/1000016185,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0014.jpg",image/jpeg,1024,683,0,47111,,1674570435,1674570435748,0,0,0,0,,,,,,,,,,, +14096,1000016173,content://media/external/images/media/1000016173,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0010.jpg",image/jpeg,768,1024,0,70258,,1674570433,1674570434599,0,0,0,0,,,,,,,,,,, +14097,1000016167,content://media/external/images/media/1000016167,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0008.jpg",image/jpeg,1080,795,0,56798,,1674564281,1674564282381,0,0,0,0,,,,,,,,,,, +14098,1000016165,content://media/external/images/media/1000016165,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0006.jpeg",image/jpeg,3840,2160,0,2138355,,1674564276,1674564276111,1674564275927,0,0,0,,,,,,,,,,, +14099,1000016162,content://media/external/images/media/1000016162,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0005.jpg",image/jpeg,1073,1162,0,82663,,1674564110,1674564111221,0,0,0,0,,,,,,,,,,, +14100,1000016145,content://media/external/images/media/1000016145,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0004.jpg",image/jpeg,819,1600,0,167291,,1674557302,1674557303076,0,0,0,0,,,,,,,,,,, +14101,1000016137,content://media/external/images/media/1000016137,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-24-09-46-03-144-edit_net.skyscanner.android.main.jpg,image/jpeg,1080,2400,0,477710,,1674549963,1674549963191,0,0,0,0,,,,,,,,,,, +14102,1000016134,content://media/external/images/media/1000016134,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0002.jpg",image/jpeg,753,388,0,59816,,1674547593,1674547594007,0,0,0,0,,,,,,,,,,, +14103,1000016132,content://media/external/images/media/1000016132,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0001.jpg",image/jpeg,1273,620,0,82997,,1674546503,1674546504019,0,0,0,0,,,,,,,,,,, +14104,1000016130,content://media/external/images/media/1000016130,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0000.jpg",image/jpeg,1213,698,0,88615,,1674545117,1674545117983,0,0,0,0,,,,,,,,,,, +14105,1000016120,content://media/external/images/media/1000016120,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230123-WA0001.jpg",image/jpeg,738,1600,0,75681,,1674502909,1674502909665,0,0,0,0,,,,,,,,,,, +14106,1000016088,content://media/external/images/media/1000016088,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230122-WA0007.jpg",image/jpeg,921,2048,0,164842,,1674420110,1674420110991,0,0,0,0,,,,,,,,,,, +14107,1000016085,content://media/external/images/media/1000016085,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230122-WA0006.jpg",image/jpeg,896,2000,0,163800,,1674415434,1674415435493,0,0,0,0,,,,,,,,,,, +14108,1000016079,content://media/external/images/media/1000016079,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230122-WA0004.jpg",image/jpeg,1600,1200,0,263187,,1674401283,1674401283884,0,0,0,0,,,,,,,,,,, +14109,1000016050,content://media/external/images/media/1000016050,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0017.jpg",image/jpeg,1080,1080,0,62271,,1674312490,1674312491254,0,0,0,0,,,,,,,,,,, +14110,1000016033,content://media/external/images/media/1000016033,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0012.jpg",image/jpeg,1600,900,0,267537,,1674303879,1674303879146,0,0,0,0,,,,,,,,,,, +14111,1000016036,content://media/external/images/media/1000016036,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0013.jpg",image/jpeg,1600,900,0,268094,,1674303879,1674303879241,0,0,0,0,,,,,,,,,,, +14112,1000016039,content://media/external/images/media/1000016039,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0014.jpg",image/jpeg,1600,900,0,267684,,1674303879,1674303879358,0,0,0,0,,,,,,,,,,, +14113,1000016042,content://media/external/images/media/1000016042,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0015.jpg",image/jpeg,1600,900,0,268618,,1674303879,1674303879549,0,0,0,0,,,,,,,,,,, +14114,1000016045,content://media/external/images/media/1000016045,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0016.jpg",image/jpeg,1600,1022,0,344154,,1674303879,1674303879798,0,0,0,0,,,,,,,,,,, +14115,1000016021,content://media/external/images/media/1000016021,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0008.jpg",image/jpeg,1600,900,0,154562,,1674303878,1674303878338,0,0,0,0,,,,,,,,,,, +14116,1000016024,content://media/external/images/media/1000016024,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0009.jpg",image/jpeg,1600,900,0,139737,,1674303878,1674303878554,0,0,0,0,,,,,,,,,,, +14117,1000016027,content://media/external/images/media/1000016027,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0010.jpg",image/jpeg,1600,900,0,150605,,1674303878,1674303878751,0,0,0,0,,,,,,,,,,, +14118,1000016030,content://media/external/images/media/1000016030,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0011.jpg",image/jpeg,1600,900,0,267627,,1674303878,1674303878999,0,0,0,0,,,,,,,,,,, +14119,1000016006,content://media/external/images/media/1000016006,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0002.jpg",image/jpeg,1077,744,0,221225,,1674293969,1674293970256,0,0,0,0,,,,,,,,,,, +14120,1000016002,content://media/external/images/media/1000016002,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-21-08-12-20-427_com.whatsapp.jpg,image/jpeg,1080,2400,0,877542,,1674285140,1674285140827,0,0,0,0,,,,,,,,,,, +14121,1000015992,content://media/external/images/media/1000015992,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0014.jpg",image/jpeg,1599,899,0,176257,,1674236611,1674236612466,0,0,0,0,,,,,,,,,,, +14122,1000015979,content://media/external/images/media/1000015979,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-20-17-03-25-750_com.google.android.googlequicksearchbox.jpg,image/jpeg,1080,2400,0,538677,,1674230606,1674230606173,0,0,0,0,,,,,,,,,,, +14123,1000015977,content://media/external/images/media/1000015977,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-20-16-58-30-737_com.google.android.googlequicksearchbox.jpg,image/jpeg,1080,2400,0,697657,,1674230311,1674230311126,0,0,0,0,,,,,,,,,,, +14124,1000015975,content://media/external/images/media/1000015975,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0011.jpg",image/jpeg,576,438,0,97381,,1674224967,1674224968231,0,0,0,0,,,,,,,,,,, +14125,1000015969,content://media/external/images/media/1000015969,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0010.jpg",image/jpeg,1600,1200,0,210277,,1674222108,1674222109049,0,0,0,0,,,,,,,,,,, +14126,1000015963,content://media/external/images/media/1000015963,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0008.jpg",image/jpeg,1600,1200,0,250782,,1674222107,1674222108141,0,0,0,0,,,,,,,,,,, +14127,1000015966,content://media/external/images/media/1000015966,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0009.jpg",image/jpeg,1200,1600,0,137968,,1674222108,1674222108871,0,0,0,0,,,,,,,,,,, +14128,1000015958,content://media/external/images/media/1000015958,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0007.jpg",image/jpeg,1200,1600,0,170289,,1674213407,1674213408569,0,0,0,0,,,,,,,,,,, +14129,1000015952,content://media/external/images/media/1000015952,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0005.jpg",image/jpeg,1600,1200,0,155415,,1674213231,1674213232220,0,0,0,0,,,,,,,,,,, +14130,1000015955,content://media/external/images/media/1000015955,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0006.jpg",image/jpeg,1600,1200,0,186524,,1674213232,1674213232575,0,0,0,0,,,,,,,,,,, +14131,1000015949,content://media/external/images/media/1000015949,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0004.jpg",image/jpeg,1600,900,0,221434,,1674212933,1674212934476,0,0,0,0,,,,,,,,,,, +14132,1000015946,content://media/external/images/media/1000015946,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0003.jpg",image/jpeg,1536,2048,0,523700,,1674211631,1674211633082,0,0,0,0,,,,,,,,,,, +14133,1000015943,content://media/external/images/media/1000015943,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0002.jpg",image/jpeg,1200,1599,0,232799,,1674206260,1674206261517,0,0,0,0,,,,,,,,,,, +14134,1000015932,content://media/external/images/media/1000015932,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0000.jpg",image/jpeg,1600,1200,0,394567,,1674169202,1674169202763,0,0,0,0,,,,,,,,,,, +14135,1000015922,content://media/external/images/media/1000015922,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-19-17-45-28-381_com.whatsapp.jpg,image/jpeg,1080,2400,0,782571,,1674146728,1674146728575,0,0,0,0,,,,,,,,,,, +14136,1000015918,content://media/external/images/media/1000015918,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230119-WA0003.jpg",image/jpeg,1360,672,0,130525,,1674123829,1674123830280,0,0,0,0,,,,,,,,,,, +14137,1000015915,content://media/external/images/media/1000015915,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230119-WA0002.jpg",image/jpeg,1599,899,0,89542,,1674112917,1674112918543,0,0,0,0,,,,,,,,,,, +14138,1000015906,content://media/external/images/media/1000015906,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230119-WA0001.jpg",image/jpeg,2048,1536,0,1935346,,1674085186,1674085188555,0,0,0,0,,,,,,,,,,, +14139,1000015904,content://media/external/images/media/1000015904,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230119-WA0000.jpg",image/jpeg,2048,1536,0,1701010,,1674085180,1674085183737,0,0,0,0,,,,,,,,,,, +14140,1000015902,content://media/external/images/media/1000015902,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230118-WA0003.jpg",image/jpeg,1080,1228,0,101401,,1674061368,1674061369232,0,0,0,0,,,,,,,,,,, +14141,1000015900,content://media/external/images/media/1000015900,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230118-WA0002.jpg",image/jpeg,1081,720,0,90568,,1674059417,1674059417495,0,0,0,0,,,,,,,,,,, +14142,1000015892,content://media/external/images/media/1000015892,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230118-WA0001.jpg",image/jpeg,1368,1824,0,265395,,1674031529,1674031530423,0,0,0,0,,,,,,,,,,, +14143,1000015889,content://media/external/images/media/1000015889,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230118-WA0000.jpg",image/jpeg,1599,899,0,171611,,1674022104,1674022105563,0,0,0,0,,,,,,,,,,, +14144,1000015864,content://media/external/images/media/1000015864,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230117-WA0000.jpg",image/jpeg,640,526,0,47401,,1673968819,1673968820064,0,0,0,0,,,,,,,,,,, +14145,1000015841,content://media/external/images/media/1000015841,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0007.jpg",image/jpeg,1080,706,0,114070,,1673877202,1673877202988,0,0,0,0,,,,,,,,,,, +14146,1000015838,content://media/external/images/media/1000015838,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0006.jpg",image/jpeg,899,1599,0,149168,,1673876068,1673876072508,0,0,0,0,,,,,,,,,,, +14147,1000015833,content://media/external/images/media/1000015833,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0004.jpg",image/jpeg,1024,554,0,32481,,1673874218,1673874219438,0,0,0,0,,,,,,,,,,, +14148,1000015830,content://media/external/images/media/1000015830,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0003.jpg",image/jpeg,1532,2048,0,207521,,1673872396,1673872397086,0,0,0,0,,,,,,,,,,, +14149,1000015827,content://media/external/images/media/1000015827,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0002.jpg",image/jpeg,2048,1536,0,1886351,,1673865400,1673865401489,0,0,0,0,,,,,,,,,,, +14150,1000015824,content://media/external/images/media/1000015824,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0001.jpg",image/jpeg,1532,2048,0,212262,,1673859460,1673859461273,0,0,0,0,,,,,,,,,,, +14151,1000015821,content://media/external/images/media/1000015821,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0000.jpg",image/jpeg,1532,2048,0,285702,,1673859459,1673859460583,0,0,0,0,,,,,,,,,,, +14152,1000015790,content://media/external/images/media/1000015790,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-15-11-15-38-814_lockscreen.jpg,image/jpeg,1080,2400,0,368060,,1673777739,1673777739560,0,0,0,0,,,,,,,,,,, +14153,1000015789,content://media/external/images/media/1000015789,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-15-11-15-33-576_com.google.android.apps.maps.jpg,image/jpeg,1080,2400,0,429185,,1673777733,1673777733956,0,0,0,0,,,,,,,,,,, +14154,1000015786,content://media/external/images/media/1000015786,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230115-WA0002.jpg",image/jpeg,2048,1536,0,212868,,1673775901,1673775905784,0,0,0,0,,,,,,,,,,, +14155,1000015781,content://media/external/images/media/1000015781,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230115-WA0001.jpg",image/jpeg,203,231,0,11468,,1673770443,1673770445022,0,0,0,0,,,,,,,,,,, +14156,1000015768,content://media/external/images/media/1000015768,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0026.jpg",image/jpeg,959,1600,0,180495,,1673714996,1673714997037,0,0,0,0,,,,,,,,,,, +14157,1000015763,content://media/external/images/media/1000015763,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0025.jpg",image/jpeg,1296,598,0,100880,,1673700295,1673700297369,0,0,0,0,,,,,,,,,,, +14158,1000015760,content://media/external/images/media/1000015760,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0024.jpg",image/jpeg,1201,1600,0,214915,,1673700236,1673700240074,0,0,0,0,,,,,,,,,,, +14159,1000015756,content://media/external/images/media/1000015756,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0023.jpg",image/jpeg,1024,845,0,85090,,1673696874,1673696875105,0,0,0,0,,,,,,,,,,, +14160,1000015753,content://media/external/images/media/1000015753,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0022.jpg",image/jpeg,2048,1532,0,241557,,1673696856,1673696866561,0,0,0,0,,,,,,,,,,, +14161,1000015731,content://media/external/images/media/1000015731,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0015.jpg",image/jpeg,1197,1600,0,111857,,1673691079,1673691079534,0,0,0,0,,,,,,,,,,, +14162,1000015728,content://media/external/images/media/1000015728,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0014.jpg",image/jpeg,1197,1600,0,97514,,1673691077,1673691078564,0,0,0,0,,,,,,,,,,, +14163,1000015725,content://media/external/images/media/1000015725,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0013.jpg",image/jpeg,1197,1600,0,116731,,1673691075,1673691077410,0,0,0,0,,,,,,,,,,, +14164,1000015722,content://media/external/images/media/1000015722,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0012.jpg",image/jpeg,1197,1600,0,111985,,1673690781,1673690781914,0,0,0,0,,,,,,,,,,, +14165,1000015716,content://media/external/images/media/1000015716,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0010.jpg",image/jpeg,1197,1600,0,90745,,1673690775,1673690776224,0,0,0,0,,,,,,,,,,, +14166,1000015719,content://media/external/images/media/1000015719,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0011.jpg",image/jpeg,1197,1600,0,83709,,1673690776,1673690776462,0,0,0,0,,,,,,,,,,, +14167,1000015713,content://media/external/images/media/1000015713,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0009.jpg",image/jpeg,1197,1600,0,88981,,1673690775,1673690775763,0,0,0,0,,,,,,,,,,, +14168,1000015710,content://media/external/images/media/1000015710,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0008.jpg",image/jpeg,1197,1600,0,361105,,1673690606,1673690606805,0,0,0,0,,,,,,,,,,, +14169,1000015707,content://media/external/images/media/1000015707,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0007.jpg",image/jpeg,1197,1600,0,380536,,1673690585,1673690586120,0,0,0,0,,,,,,,,,,, +14170,1000015704,content://media/external/images/media/1000015704,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0006.jpg",image/jpeg,1197,1600,0,349570,,1673690581,1673690582585,0,0,0,0,,,,,,,,,,, +14171,1000015701,content://media/external/images/media/1000015701,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0005.jpg",image/jpeg,1197,1600,0,327878,,1673690580,1673690581752,0,0,0,0,,,,,,,,,,, +14172,1000015690,content://media/external/images/media/1000015690,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0002.jpg",image/jpeg,320,209,0,8333,,1673684960,1673684961902,0,0,0,0,,,,,,,,,,, +14173,1000015645,content://media/external/images/media/1000015645,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230113-WA0005.jpg",image/jpeg,502,1600,0,125408,,1673620531,1673620532896,0,0,0,0,,,,,,,,,,, +14174,1000015640,content://media/external/images/media/1000015640,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230113-WA0003.jpg",image/jpeg,2048,1532,0,312660,,1673616654,1673616655224,0,0,0,0,,,,,,,,,,, +14175,1000015637,content://media/external/images/media/1000015637,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230113-WA0002.jpg",image/jpeg,1600,1197,0,281020,,1673612977,1673612977846,0,0,0,0,,,,,,,,,,, +14176,1000015610,content://media/external/images/media/1000015610,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0009.jpg",image/jpeg,1080,1417,0,99632,,1673558021,1673558021475,0,0,0,0,,,,,,,,,,, +14177,1000015607,content://media/external/images/media/1000015607,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0008.jpg",image/jpeg,795,1201,0,85837,,1673557874,1673557875189,0,0,0,0,,,,,,,,,,, +14178,1000015604,content://media/external/images/media/1000015604,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0007.jpg",image/jpeg,854,1534,0,126465,,1673557761,1673557761865,0,0,0,0,,,,,,,,,,, +14179,1000015601,content://media/external/images/media/1000015601,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0006.jpg",image/jpeg,1080,1490,0,138509,,1673557667,1673557667993,0,0,0,0,,,,,,,,,,, +14180,1000015598,content://media/external/images/media/1000015598,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0005.jpg",image/jpeg,1076,725,0,53171,,1673557204,1673557205303,0,0,0,0,,,,,,,,,,, +14181,1000015593,content://media/external/images/media/1000015593,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-12-15-52-44-667_com.google.android.googlequicksearchbox.jpg,image/jpeg,1080,2400,0,589252,,1673535165,1673535165067,0,0,0,0,,,,,,,,,,, +14182,1000015590,content://media/external/images/media/1000015590,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-12-14-08-03-210-edit_com.android.chrome.jpg,image/jpeg,1072,1185,0,267846,,1673528883,1673528883295,0,0,0,0,,,,,,,,,,, +14183,1000015582,content://media/external/images/media/1000015582,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0003.jpg",image/jpeg,899,1599,0,107940,,1673519032,1673519033628,0,0,0,0,,,,,,,,,,, +14184,1000015572,content://media/external/images/media/1000015572,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0000.jpg",image/jpeg,921,2048,0,112624,,1673509806,1673509807753,0,0,0,0,,,,,,,,,,, +14185,1000015556,content://media/external/images/media/1000015556,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0006.jpg",image/jpeg,1500,2000,0,114956,,1673457161,1673457162123,0,0,0,0,,,,,,,,,,, +14186,1000015559,content://media/external/images/media/1000015559,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0007.jpg",image/jpeg,1500,2000,0,161006,,1673457162,1673457162854,0,0,0,0,,,,,,,,,,, +14187,1000015550,content://media/external/images/media/1000015550,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0004.jpg",image/jpeg,1500,2000,0,236227,,1673457160,1673457161421,0,0,0,0,,,,,,,,,,, +14188,1000015553,content://media/external/images/media/1000015553,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0005.jpg",image/jpeg,1500,2000,0,193297,,1673457161,1673457161901,0,0,0,0,,,,,,,,,,, +14189,1000015544,content://media/external/images/media/1000015544,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0002.jpg",image/jpeg,1500,2000,0,134382,,1673457159,1673457160279,0,0,0,0,,,,,,,,,,, +14190,1000015547,content://media/external/images/media/1000015547,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0003.jpg",image/jpeg,1500,2000,0,195002,,1673457160,1673457160885,0,0,0,0,,,,,,,,,,, +14191,1000015542,content://media/external/images/media/1000015542,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-11-18-10-31-171-edit_com.booking.jpg,image/jpeg,1046,1456,0,516270,,1673457031,1673457031220,0,0,0,0,,,,,,,,,,, +14192,1000015536,content://media/external/images/media/1000015536,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0000.jpg",image/jpeg,720,1082,0,63176,,1673421049,1673421050862,0,0,0,0,,,,,,,,,,, +14193,1000015524,content://media/external/images/media/1000015524,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0009.jpg",image/jpeg,1024,728,0,85625,,1673383092,1673383092932,0,0,0,0,,,,,,,,,,, +14194,1000015237,content://media/external/images/media/1000015237,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0004.jpg",image/jpeg,940,788,0,114900,,1672853377,1673378704623,0,0,0,0,,,,,,,,,,, +14195,1000015501,content://media/external/images/media/1000015501,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0003.jpg",image/jpeg,1536,2048,0,294160,,1673359585,1673359586258,0,0,0,0,,,,,,,,,,, +14196,1000015495,content://media/external/images/media/1000015495,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0001.jpg",image/jpeg,1536,2048,0,348185,,1673359203,1673359204489,0,0,0,0,,,,,,,,,,, +14197,1000015498,content://media/external/images/media/1000015498,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0002.jpg",image/jpeg,1600,900,0,95236,,1673359204,1673359204702,0,0,0,0,,,,,,,,,,, +14198,1000015492,content://media/external/images/media/1000015492,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0000.jpg",image/jpeg,1600,900,0,195564,,1673359203,1673359203942,0,0,0,0,,,,,,,,,,, +14199,1000015483,content://media/external/images/media/1000015483,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230109-WA0001.jpg",image/jpeg,720,893,0,159019,,1673297374,1673297375031,0,0,0,0,,,,,,,,,,, +14200,1000015479,content://media/external/images/media/1000015479,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230109-WA0000.jpg",image/jpeg,1200,1599,0,209363,,1673285043,1673285044470,0,0,0,0,,,,,,,,,,, +14201,1000015464,content://media/external/images/media/1000015464,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-08-20-58-56-462_de.komoot.android.jpg,image/jpeg,1080,2400,0,753527,,1673207936,1673207936870,0,0,0,0,,,,,,,,,,, +14202,1000015462,content://media/external/images/media/1000015462,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-08-20-52-51-133_de.komoot.android.jpg,image/jpeg,1080,2400,0,880629,,1673207571,1673207571570,0,0,0,0,,,,,,,,,,, +14203,1000015456,content://media/external/images/media/1000015456,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0004.jpg",image/jpeg,1600,738,0,122148,,1673205926,1673205932258,0,0,0,0,,,,,,,,,,, +14204,1000015459,content://media/external/images/media/1000015459,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0005.jpg",image/jpeg,1200,1600,0,117862,,1673205932,1673205932771,0,0,0,0,,,,,,,,,,, +14205,1000015453,content://media/external/images/media/1000015453,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0003.jpg",image/jpeg,920,960,0,155022,,1673189896,1673189898475,0,0,0,0,,,,,,,,,,, +14206,1000015448,content://media/external/images/media/1000015448,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0002.jpg",image/jpeg,923,2048,0,111220,,1673183532,1673183533467,0,0,0,0,,,,,,,,,,, +14207,1000015445,content://media/external/images/media/1000015445,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0001.jpg",image/jpeg,2000,1500,0,279472,,1673183525,1673183526994,0,0,0,0,,,,,,,,,,, +14208,1000015444,content://media/external/images/media/1000015444,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-08-09-33-12-038_com.android.chrome.jpg,image/jpeg,2400,1080,0,257771,,1673166792,1673166792465,0,0,0,0,,,,,,,,,,, +14209,1000015443,content://media/external/images/media/1000015443,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-08-09-30-35-652-edit_com.android.chrome.jpg,image/jpeg,2400,1080,0,308340,,1673166635,1673166635713,0,0,0,0,,,,,,,,,,, +14210,1000015375,content://media/external/images/media/1000015375,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0016.jpg",image/jpeg,1200,1600,0,183299,,1673013403,1673013408265,0,0,0,0,,,,,,,,,,, +14211,1000015372,content://media/external/images/media/1000015372,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0015.jpg",image/jpeg,1200,1600,0,166318,,1673013348,1673013373992,0,0,0,0,,,,,,,,,,, +14212,1000015369,content://media/external/images/media/1000015369,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0014.jpg",image/jpeg,520,1156,0,89756,,1673009671,1673009672090,0,0,0,0,,,,,,,,,,, +14213,1000015366,content://media/external/images/media/1000015366,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0013.jpg",image/jpeg,1156,520,0,77586,,1673009670,1673009671348,0,0,0,0,,,,,,,,,,, +14214,1000015359,content://media/external/images/media/1000015359,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0011.jpg",image/jpeg,520,1156,0,103485,,1673009629,1673009630659,0,0,0,0,,,,,,,,,,, +14215,1000015349,content://media/external/images/media/1000015349,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0008.jpg",image/jpeg,520,1156,0,42584,,1673009596,1673009597089,0,0,0,0,,,,,,,,,,, +14216,1000015352,content://media/external/images/media/1000015352,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0009.jpg",image/jpeg,520,1156,0,37003,,1673009597,1673009597713,0,0,0,0,,,,,,,,,,, +14217,1000015340,content://media/external/images/media/1000015340,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0005.jpg",image/jpeg,1536,2048,0,402875,,1673004785,1673004810191,0,0,0,0,,,,,,,,,,, +14218,1000015337,content://media/external/images/media/1000015337,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0004.jpg",image/jpeg,1536,2048,0,338076,,1673004748,1673004785178,0,0,0,0,,,,,,,,,,, +14219,1000015332,content://media/external/images/media/1000015332,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0002.jpg",image/jpeg,650,865,0,86508,,1673001097,1673001097517,0,0,0,0,,,,,,,,,,, +14220,1000015329,content://media/external/images/media/1000015329,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0001.jpg",image/jpeg,720,1080,0,229541,,1673001049,1673001049957,0,0,0,0,,,,,,,,,,, +14221,1000015304,content://media/external/images/media/1000015304,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0000.jpg",image/jpeg,736,736,0,60937,,1672992494,1672992567390,0,0,0,0,,,,,,,,,,, +14222,1000015292,content://media/external/images/media/1000015292,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0005.jpg",image/jpeg,1200,1599,0,109452,,1672947645,1672947646247,0,0,0,0,,,,,,,,,,, +14223,1000015275,content://media/external/images/media/1000015275,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0004.jpg",image/jpeg,1024,768,0,80140,,1672935928,1672935930306,0,0,0,0,,,,,,,,,,, +14224,1000015272,content://media/external/images/media/1000015272,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0003.jpg",image/jpeg,1200,1600,0,137176,,1672926562,1672926562810,0,0,0,0,,,,,,,,,,, +14225,1000015269,content://media/external/images/media/1000015269,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0002.jpg",image/jpeg,945,2048,0,135954,,1672921574,1672921575220,0,0,0,0,,,,,,,,,,, +14226,1000015255,content://media/external/images/media/1000015255,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0001.jpg",image/jpeg,1197,1600,0,181580,,1672911001,1672911002195,0,0,0,0,,,,,,,,,,, +14227,1000015252,content://media/external/images/media/1000015252,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0000.jpg",image/jpeg,1052,473,0,75092,,1672909632,1672909632781,0,0,0,0,,,,,,,,,,, +14228,1000015239,content://media/external/images/media/1000015239,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0005.jpg",image/jpeg,1080,1169,0,146520,,1672853685,1672853686023,0,0,0,0,,,,,,,,,,, +14229,1000015231,content://media/external/images/media/1000015231,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0003.jpg",image/jpeg,520,1156,0,47987,,1672843585,1672843585665,0,0,0,0,,,,,,,,,,, +14230,1000015227,content://media/external/images/media/1000015227,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0002.jpg",image/jpeg,1280,958,0,40001,,1672831901,1672831902399,0,0,0,0,,,,,,,,,,, +14231,1000015223,content://media/external/images/media/1000015223,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0001.jpg",image/jpeg,1200,1599,0,229030,,1672827143,1672827144340,0,0,0,0,,,,,,,,,,, +14232,1000015220,content://media/external/images/media/1000015220,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0000.jpg",image/jpeg,1200,1600,0,397129,,1672822797,1672822797943,0,0,0,0,,,,,,,,,,, +14233,1000015214,content://media/external/images/media/1000015214,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0005.jpg",image/jpeg,768,1024,0,140508,,1672772695,1672772696376,0,0,0,0,,,,,,,,,,, +14234,1000015211,content://media/external/images/media/1000015211,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0004.jpg",image/jpeg,1052,473,0,24978,,1672756246,1672756247272,0,0,0,0,,,,,,,,,,, +14235,1000015208,content://media/external/images/media/1000015208,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0003.jpg",image/jpeg,721,1600,0,125898,,1672753026,1672753027109,0,0,0,0,,,,,,,,,,, +14236,1000015206,content://media/external/images/media/1000015206,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0002.jpg",image/jpeg,720,900,0,54633,,1672750932,1672750932330,0,0,0,0,,,,,,,,,,, +14237,1000015191,content://media/external/images/media/1000015191,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0000.jpg",image/jpeg,520,1156,0,33377,,1672746626,1672746627360,0,0,0,0,,,,,,,,,,, +14238,1000015172,content://media/external/images/media/1000015172,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230102-WA0005.jpg",image/jpeg,497,1046,0,52673,,1672673892,1672673893036,0,0,0,0,,,,,,,,,,, +14239,1000015169,content://media/external/images/media/1000015169,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230102-WA0004.jpg",image/jpeg,1536,2048,0,1894216,,1672669547,1672669548039,0,0,0,0,,,,,,,,,,, +14240,1000015166,content://media/external/images/media/1000015166,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230102-WA0003.jpg",image/jpeg,1824,1368,0,141671,,1672669501,1672669502419,0,0,0,0,,,,,,,,,,, +14241,1000015163,content://media/external/images/media/1000015163,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230102-WA0002.jpg",image/jpeg,1824,1368,0,203734,,1672669489,1672669490568,0,0,0,0,,,,,,,,,,, +14242,1000015152,content://media/external/images/media/1000015152,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-02-11-37-41-731_com.android.chrome.jpg,image/jpeg,1080,2400,0,841332,,1672655862,1672655862251,0,0,0,0,,,,,,,,,,, +14243,1000015140,content://media/external/images/media/1000015140,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0032.jpg",image/jpeg,1512,2016,0,396780,,1672596875,1672596876140,0,0,0,0,,,,,,,,,,, +14244,1000015137,content://media/external/images/media/1000015137,/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-01-15-04-25-479_com.mi.globalbrowser.jpg,image/jpeg,1080,2400,0,470363,,1672581865,1672581865969,0,0,0,0,,,,,,,,,,, +14245,1000015134,content://media/external/images/media/1000015134,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0031.jpg",image/jpeg,1080,1344,0,81350,,1672578227,1672578228416,0,0,0,0,,,,,,,,,,, +14246,1000015119,content://media/external/images/media/1000015119,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0027.jpg",image/jpeg,1600,758,0,155176,,1672573286,1672573286927,0,0,0,0,,,,,,,,,,, +14247,1000015116,content://media/external/images/media/1000015116,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0026.jpg",image/jpeg,1080,1245,0,153881,,1672569481,1672569481813,0,0,0,0,,,,,,,,,,, +14248,1000015113,content://media/external/images/media/1000015113,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0025.jpg",image/jpeg,1078,1077,0,182344,,1672569469,1672569469375,0,0,0,0,,,,,,,,,,, +14249,1000015108,content://media/external/images/media/1000015108,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0023.jpg",image/jpeg,960,779,0,38324,,1672569080,1672569080278,0,0,0,0,,,,,,,,,,, +14250,1000015105,content://media/external/images/media/1000015105,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0022.jpg",image/jpeg,1080,1146,0,81549,,1672564543,1672564544090,0,0,0,0,,,,,,,,,,, +14251,1000015102,content://media/external/images/media/1000015102,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0021.jpg",image/jpeg,736,1308,0,73308,,1672562809,1672562810257,0,0,0,0,,,,,,,,,,, +14252,1000015099,content://media/external/images/media/1000015099,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0020.jpg",image/jpeg,900,1600,0,168435,,1672547457,1672547457736,0,0,0,0,,,,,,,,,,, +14253,1000015070,content://media/external/images/media/1000015070,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0013.jpg",image/jpeg,1080,1279,0,186362,,1672530616,1672535102594,0,0,0,0,,,,,,,,,,, +14254,1000015082,content://media/external/images/media/1000015082,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0017.jpg",image/jpeg,564,922,0,82952,,1672531734,1672531734618,0,0,0,0,,,,,,,,,,, +14255,1000015080,content://media/external/images/media/1000015080,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0016.jpg",image/jpeg,2048,1152,0,1538653,,1672531528,1672531528799,0,0,0,0,,,,,,,,,,, +14256,1000015078,content://media/external/images/media/1000015078,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0015.jpg",image/jpeg,960,542,0,107396,,1672531292,1672531292203,0,0,0,0,,,,,,,,,,, +14257,1000015075,content://media/external/images/media/1000015075,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0014.jpg",image/jpeg,735,481,0,141479,,1672531213,1672531214366,0,0,0,0,,,,,,,,,,, +14258,1000015047,content://media/external/images/media/1000015047,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0006.jpg",image/jpeg,900,1600,0,176672,,1672528166,1672528166364,0,0,0,0,,,,,,,,,,, +14259,1000015044,content://media/external/images/media/1000015044,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0005.jpg",image/jpeg,900,1600,0,173579,,1672528161,1672528161580,0,0,0,0,,,,,,,,,,, +14260,1000015033,content://media/external/images/media/1000015033,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0002.jpg",image/jpeg,2000,1500,0,272743,,1672527857,1672527857282,0,0,0,0,,,,,,,,,,, +14261,1000015030,content://media/external/images/media/1000015030,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0001.jpg",image/jpeg,2000,1500,0,335547,,1672527839,1672527839613,0,0,0,0,,,,,,,,,,, +14262,1000015027,content://media/external/images/media/1000015027,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0000.jpg",image/jpeg,2000,1500,0,316669,,1672527828,1672527829227,0,0,0,0,,,,,,,,,,, +14263,1000015011,content://media/external/images/media/1000015011,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0030.jpg",image/jpeg,1734,1734,0,341538,,1672515855,1672525136561,0,0,0,0,,,,,,,,,,, +14264,1000015020,content://media/external/images/media/1000015020,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0033.jpg",image/jpeg,1170,1447,0,540860,,1672521548,1672521549374,0,0,0,0,,,,,,,,,,, +14265,1000015017,content://media/external/images/media/1000015017,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0032.jpg",image/jpeg,1080,970,0,217530,,1672518424,1672518496585,0,0,0,0,,,,,,,,,,, +14266,1000015014,content://media/external/images/media/1000015014,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0031.jpg",image/jpeg,1734,1734,0,314835,,1672515856,1672515856471,0,0,0,0,,,,,,,,,,, +14267,1000015008,content://media/external/images/media/1000015008,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0029.jpg",image/jpeg,1734,1734,0,368255,,1672515854,1672515855701,0,0,0,0,,,,,,,,,,, +14268,1000015005,content://media/external/images/media/1000015005,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0028.jpg",image/jpeg,2048,2048,0,325031,,1672515834,1672515835266,0,0,0,0,,,,,,,,,,, +14269,1000015002,content://media/external/images/media/1000015002,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0027.jpg",image/jpeg,2048,2048,0,346769,,1672515827,1672515834274,0,0,0,0,,,,,,,,,,, +14270,1000014999,content://media/external/images/media/1000014999,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0026.jpg",image/jpeg,2000,1500,0,336779,,1672515464,1672515465549,0,0,0,0,,,,,,,,,,, +14271,1000014992,content://media/external/images/media/1000014992,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0025.jpg",image/jpeg,771,960,0,209109,,1672511828,1672511828528,0,0,0,0,,,,,,,,,,, +14272,1000014989,content://media/external/images/media/1000014989,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0024.jpg",image/jpeg,564,564,0,6330,,1672511806,1672511809379,0,0,0,0,,,,,,,,,,, +14273,1000014986,content://media/external/images/media/1000014986,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0023.jpg",image/jpeg,1200,1600,0,188547,,1672511355,1672511356599,0,0,0,0,,,,,,,,,,, +14274,1000014973,content://media/external/images/media/1000014973,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0019.jpg",image/jpeg,270,1169,0,17220,,1672506432,1672506433180,0,0,0,0,,,,,,,,,,, +14275,1000014968,content://media/external/images/media/1000014968,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0017.jpg",image/jpeg,1051,465,0,19862,,1672506086,1672506086984,0,0,0,0,,,,,,,,,,, +14276,1000014965,content://media/external/images/media/1000014965,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0016.jpg",image/jpeg,500,333,0,92739,,1672505387,1672505387377,0,0,0,0,,,,,,,,,,, +14277,1000014960,content://media/external/images/media/1000014960,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0014.jpg",image/jpeg,729,479,0,76057,,1672504342,1672504342915,0,0,0,0,,,,,,,,,,, +14278,1000014959,content://media/external/images/media/1000014959,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-31-17-12-33-972_com.google.android.youtube.jpg,image/jpeg,1080,2400,0,624537,,1672503154,1672503154474,0,0,0,0,,,,,,,,,,, +14279,1000014957,content://media/external/images/media/1000014957,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0012.jpeg",image/jpeg,3840,2160,0,1074065,,1672502012,1672502012310,1672502012254,0,0,0,,,,,,,,,,, +14280,1000014954,content://media/external/images/media/1000014954,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0011.jpg",image/jpeg,1532,2048,0,233454,,1672499456,1672499457595,0,0,0,0,,,,,,,,,,, +14281,1000014952,content://media/external/images/media/1000014952,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0010.jpg",image/jpeg,1078,1095,0,155144,,1672498550,1672498551123,0,0,0,0,,,,,,,,,,, +14282,1000014949,content://media/external/images/media/1000014949,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0009.jpg",image/jpeg,1080,1333,0,191683,,1672498452,1672498477321,0,0,0,0,,,,,,,,,,, +14283,1000014947,content://media/external/images/media/1000014947,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0008.jpg",image/jpeg,1080,1383,0,245318,,1672496639,1672496639584,0,0,0,0,,,,,,,,,,, +14284,1000014945,content://media/external/images/media/1000014945,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0007.jpg",image/jpeg,663,364,0,53268,,1672496027,1672496028069,0,0,0,0,,,,,,,,,,, +14285,1000014941,content://media/external/images/media/1000014941,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0005.jpg",image/jpeg,1041,1431,0,116054,,1672494697,1672494697971,0,0,0,0,,,,,,,,,,, +14286,1000014938,content://media/external/images/media/1000014938,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0004.jpg",image/jpeg,1080,709,0,59554,,1672494492,1672494492777,0,0,0,0,,,,,,,,,,, +14287,1000014935,content://media/external/images/media/1000014935,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0003.jpg",image/jpeg,735,917,0,123709,,1672494350,1672494350982,0,0,0,0,,,,,,,,,,, +14288,1000014932,content://media/external/images/media/1000014932,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0002.jpg",image/jpeg,899,1599,0,128631,,1672493941,1672493941849,0,0,0,0,,,,,,,,,,, +14289,1000014924,content://media/external/images/media/1000014924,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0000.jpg",image/jpeg,579,1024,0,306019,,1672484485,1672484485742,0,0,0,0,,,,,,,,,,, +14290,1000014911,content://media/external/images/media/1000014911,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221230-WA0012.jpg",image/jpeg,720,888,0,103903,,1672435925,1672435926524,0,0,0,0,,,,,,,,,,, +14291,1000014908,content://media/external/images/media/1000014908,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221230-WA0011.jpg",image/jpeg,1536,2048,0,227194,,1672431492,1672431492995,0,0,0,0,,,,,,,,,,, +14292,1000014881,content://media/external/images/media/1000014881,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20221230-WA0005.jpg",image/jpeg,1532,2048,0,412362,,1672406247,1672406248214,0,0,0,0,,,,,,,,,,, +14293,1000014878,content://media/external/images/media/1000014878,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20221230-WA0004.jpg",image/jpeg,1532,2048,0,435222,,1672405505,1672405506493,0,0,0,0,,,,,,,,,,, +14294,1000014864,content://media/external/images/media/1000014864,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20221230-WA0002.jpeg",image/jpeg,3840,2160,0,957552,,1672393116,1672393116342,1672393116174,0,0,0,,,,,,,,,,, +14295,1000014858,content://media/external/images/media/1000014858,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221230-WA0000.jpg",image/jpeg,1197,1600,0,288245,,1672391602,1672391603700,0,0,0,0,,,,,,,,,,, +14296,1000014844,content://media/external/images/media/1000014844,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221229-WA0001.jpg",image/jpeg,526,526,0,63535,,1672339764,1672339764742,0,0,0,0,,,,,,,,,,, +14297,1000014805,content://media/external/images/media/1000014805,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0007.jpg",image/jpeg,720,986,0,57520,,1672258465,1672258476013,0,0,0,0,,,,,,,,,,, +14298,1000014799,content://media/external/images/media/1000014799,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0006.jpg",image/jpeg,1920,1080,0,139770,,1672243334,1672243337017,0,0,0,0,,,,,,,,,,, +14299,1000014796,content://media/external/images/media/1000014796,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0005.jpg",image/jpeg,2048,1532,0,268827,,1672235623,1672235623614,0,0,0,0,,,,,,,,,,, +14300,1000014793,content://media/external/images/media/1000014793,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0004.jpg",image/jpeg,1200,1600,0,247435,,1672230829,1672230830028,0,0,0,0,,,,,,,,,,, +14301,1000014790,content://media/external/images/media/1000014790,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0003.jpg",image/jpeg,1219,1600,0,180625,,1672229735,1672229736574,0,0,0,0,,,,,,,,,,, +14302,1000014779,content://media/external/images/media/1000014779,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0000.jpg",image/jpeg,550,678,0,200472,,1672217354,1672217440326,0,0,0,0,,,,,,,,,,, +14303,1000014770,content://media/external/images/media/1000014770,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0009.jpg",image/jpeg,1500,2000,0,288437,,1672170730,1672170731904,0,0,0,0,,,,,,,,,,, +14304,1000014767,content://media/external/images/media/1000014767,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0008.jpg",image/jpeg,1500,2000,0,202247,,1672170728,1672170728797,0,0,0,0,,,,,,,,,,, +14305,1000014764,content://media/external/images/media/1000014764,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0007.jpg",image/jpeg,1500,2000,0,293742,,1672170722,1672170723190,0,0,0,0,,,,,,,,,,, +14306,1000014761,content://media/external/images/media/1000014761,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0006.jpg",image/jpeg,1080,1331,0,103357,,1672170707,1672170707899,0,0,0,0,,,,,,,,,,, +14307,1000014758,content://media/external/images/media/1000014758,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0005.jpg",image/jpeg,1200,1600,0,159910,,1672170704,1672170705067,0,0,0,0,,,,,,,,,,, +14308,1000014755,content://media/external/images/media/1000014755,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0004.jpg",image/jpeg,712,895,0,120734,,1672157265,1672157265887,0,0,0,0,,,,,,,,,,, +14309,1000014752,content://media/external/images/media/1000014752,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0003.jpg",image/jpeg,1080,1080,0,195221,,1672156111,1672156112246,0,0,0,0,,,,,,,,,,, +14310,1000014749,content://media/external/images/media/1000014749,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0002.jpg",image/jpeg,1196,1600,0,106103,,1672145341,1672145342679,0,0,0,0,,,,,,,,,,, +14311,1000014746,content://media/external/images/media/1000014746,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0001.jpg",image/jpeg,899,1599,0,86010,,1672143410,1672143411507,0,0,0,0,,,,,,,,,,, +14312,1000014744,content://media/external/images/media/1000014744,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0000.jpg",image/jpeg,369,570,0,86266,,1672139550,1672139551421,0,0,0,0,,,,,,,,,,, +14313,1000013665,content://media/external/images/media/1000013665,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221205-WA0002.jpg",image/jpeg,768,1024,0,58541,,1670255637,1672126208466,0,0,0,0,,,,,,,,,,, +14314,1000014723,content://media/external/images/media/1000014723,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0009.jpg",image/jpeg,1600,1066,0,352754,,1672066420,1672079219052,0,0,0,0,,,,,,,,,,, +14315,1000014725,content://media/external/images/media/1000014725,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0010.jpg",image/jpeg,1600,1066,0,316915,,1672066421,1672066422047,0,0,0,0,,,,,,,,,,, +14316,1000014713,content://media/external/images/media/1000014713,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0002.jpg",image/jpeg,1080,1080,0,263179,,1672057489,1672057491548,0,0,0,0,,,,,,,,,,, +14317,1000014710,content://media/external/images/media/1000014710,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0001.jpg",image/jpeg,1536,2048,0,244777,,1672054667,1672054667548,0,0,0,0,,,,,,,,,,, +14318,1000014707,content://media/external/images/media/1000014707,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0000.jpg",image/jpeg,1280,958,0,69787,,1672052299,1672052299404,0,0,0,0,,,,,,,,,,, +14319,1000014680,content://media/external/images/media/1000014680,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0033.jpg",image/jpeg,626,413,0,110283,,1671987309,1671987309856,0,0,0,0,,,,,,,,,,, +14320,1000014677,content://media/external/images/media/1000014677,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0032.jpg",image/jpeg,298,444,0,16349,,1671986795,1671986795659,0,0,0,0,,,,,,,,,,, +14321,1000014672,content://media/external/images/media/1000014672,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0030.jpg",image/jpeg,1024,694,0,33777,,1671985702,1671985702765,0,0,0,0,,,,,,,,,,, +14322,1000014667,content://media/external/images/media/1000014667,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0028.jpg",image/jpeg,900,1600,0,183880,,1671984318,1671984319455,0,0,0,0,,,,,,,,,,, +14323,1000014664,content://media/external/images/media/1000014664,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0027.jpg",image/jpeg,160,160,0,3732,,1671983895,1671983895839,0,0,0,0,,,,,,,,,,, +14324,1000014661,content://media/external/images/media/1000014661,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0026.jpg",image/jpeg,800,576,0,44439,,1671981713,1671981713795,0,0,0,0,,,,,,,,,,, +14325,1000014653,content://media/external/images/media/1000014653,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0024.jpg",image/jpeg,1153,2048,0,185747,,1671970739,1671970739960,0,0,0,0,,,,,,,,,,, +14326,1000014651,content://media/external/images/media/1000014651,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0023.jpg",image/jpeg,1024,512,0,59196,,1671970063,1671970063587,0,0,0,0,,,,,,,,,,, +14327,1000014648,content://media/external/images/media/1000014648,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0022.jpg",image/jpeg,1200,1600,0,217045,,1671968517,1671968517871,0,0,0,0,,,,,,,,,,, +14328,1000014645,content://media/external/images/media/1000014645,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0021.jpg",image/jpeg,1053,601,0,64203,,1671967591,1671967591493,0,0,0,0,,,,,,,,,,, +14329,1000014637,content://media/external/images/media/1000014637,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0019.jpg",image/jpeg,1200,1599,0,391600,,1671963716,1671963720245,0,0,0,0,,,,,,,,,,, +14330,1000014635,content://media/external/images/media/1000014635,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0018.jpg",image/jpeg,538,541,0,45613,,1671963305,1671963305433,0,0,0,0,,,,,,,,,,, +14331,1000014628,content://media/external/images/media/1000014628,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0016.jpg",image/jpeg,862,1143,0,22570,,1671961491,1671961491960,0,0,0,0,,,,,,,,,,, +14332,1000014625,content://media/external/images/media/1000014625,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0015.jpg",image/jpeg,899,1599,0,205575,,1671961449,1671961450209,0,0,0,0,,,,,,,,,,, +14333,1000014617,content://media/external/images/media/1000014617,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0012.jpg",image/jpeg,1080,1319,0,148420,,1671959067,1671959068230,0,0,0,0,,,,,,,,,,, +14334,1000014610,content://media/external/images/media/1000014610,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0010.jpg",image/jpeg,726,883,0,16471,,1671957710,1671957711084,0,0,0,0,,,,,,,,,,, +14335,1000014602,content://media/external/images/media/1000014602,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0008.jpg",image/jpeg,2048,1366,0,1424198,,1671956264,1671956266499,0,0,0,0,,,,,,,,,,, +14336,1000014594,content://media/external/images/media/1000014594,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0005.jpg",image/jpeg,1080,830,0,134430,,1671954809,1671954809575,0,0,0,0,,,,,,,,,,, +14337,1000014592,content://media/external/images/media/1000014592,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0004.jpg",image/jpeg,720,1280,0,157385,,1671954660,1671954661168,0,0,0,0,,,,,,,,,,, +14338,1000014586,content://media/external/images/media/1000014586,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0002.jpg",image/jpeg,520,1156,0,39618,,1671954129,1671954130324,0,0,0,0,,,,,,,,,,, +14339,1000014567,content://media/external/images/media/1000014567,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0000.jpg",image/jpeg,1200,1600,0,141075,,1671923835,1671923835980,0,0,0,0,,,,,,,,,,, +14340,1000014564,content://media/external/images/media/1000014564,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0023.jpg",image/jpeg,736,1308,0,229870,,1671922632,1671922633381,0,0,0,0,,,,,,,,,,, +14341,1000014561,content://media/external/images/media/1000014561,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0022.jpg",image/jpeg,2048,1532,0,192700,,1671915842,1671915843553,0,0,0,0,,,,,,,,,,, +14342,1000014558,content://media/external/images/media/1000014558,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0021.jpg",image/jpeg,1197,1600,0,96391,,1671914764,1671914765545,0,0,0,0,,,,,,,,,,, +14343,1000014549,content://media/external/images/media/1000014549,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0020.jpg",image/jpeg,1200,1600,0,216290,,1671911644,1671911645366,0,0,0,0,,,,,,,,,,, +14344,1000014546,content://media/external/images/media/1000014546,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0019.jpg",image/jpeg,1370,1600,0,259288,,1671906393,1671906408671,0,0,0,0,,,,,,,,,,, +14345,1000014539,content://media/external/images/media/1000014539,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0017.jpg",image/jpeg,1200,1600,0,265795,,1671904640,1671904641540,0,0,0,0,,,,,,,,,,, +14346,1000014532,content://media/external/images/media/1000014532,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0015.jpg",image/jpeg,700,500,0,73335,,1671903369,1671903369230,0,0,0,0,,,,,,,,,,, +14347,1000014529,content://media/external/images/media/1000014529,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0014.jpg",image/jpeg,1080,1239,0,94783,,1671903308,1671903309199,0,0,0,0,,,,,,,,,,, +14348,1000014523,content://media/external/images/media/1000014523,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0011.jpg",image/jpeg,544,960,0,63063,,1671899550,1671899550454,0,0,0,0,,,,,,,,,,, +14349,1000014520,content://media/external/images/media/1000014520,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0010.jpg",image/jpeg,921,2048,0,214874,,1671895590,1671895590754,0,0,0,0,,,,,,,,,,, +14350,1000014508,content://media/external/images/media/1000014508,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0009.jpg",image/jpeg,320,320,0,24637,,1671888208,1671888208757,0,0,0,0,,,,,,,,,,, +14351,1000014501,content://media/external/images/media/1000014501,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0007.jpg",image/jpeg,1080,1298,0,120018,,1671881552,1671881552837,0,0,0,0,,,,,,,,,,, +14352,1000014491,content://media/external/images/media/1000014491,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0005.jpg",image/jpeg,738,1600,0,109677,,1671873638,1671873639639,0,0,0,0,,,,,,,,,,, +14353,1000014486,content://media/external/images/media/1000014486,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0003.jpg",image/jpeg,750,730,0,305040,,1671870871,1671870872163,0,0,0,0,,,,,,,,,,, +14354,1000014484,content://media/external/images/media/1000014484,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-24-09-28-28-235_com.booking.jpg,image/jpeg,1080,2400,0,797646,,1671870508,1671870508564,0,0,0,0,,,,,,,,,,, +14355,1000014460,content://media/external/images/media/1000014460,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0013.jpg",image/jpeg,720,1600,0,53692,,1671819768,1671819769074,0,0,0,0,,,,,,,,,,, +14356,1000014457,content://media/external/images/media/1000014457,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0012.jpg",image/jpeg,1536,2048,0,2664485,,1671816800,1671816802352,0,0,0,0,,,,,,,,,,, +14357,1000014435,content://media/external/images/media/1000014435,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0008.jpg",image/jpeg,400,368,0,29840,,1671805115,1671805115650,0,0,0,0,,,,,,,,,,, +14358,1000014418,content://media/external/images/media/1000014418,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0006.jpg",image/jpeg,899,1599,0,76259,,1671793001,1671793021837,0,0,0,0,,,,,,,,,,, +14359,1000014415,content://media/external/images/media/1000014415,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0005.jpg",image/jpeg,1600,1197,0,147305,,1671792949,1671793001290,0,0,0,0,,,,,,,,,,, +14360,1000014397,content://media/external/images/media/1000014397,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0002.jpg",image/jpeg,2048,1536,0,2042448,,1671773247,1671773247578,0,0,0,0,,,,,,,,,,, +14361,1000014395,content://media/external/images/media/1000014395,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0001.jpg",image/jpeg,2048,1536,0,1997527,,1671773245,1671773245863,0,0,0,0,,,,,,,,,,, +14362,1000014392,content://media/external/images/media/1000014392,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0000.jpg",image/jpeg,1600,1030,0,247914,,1671773243,1671773244282,0,0,0,0,,,,,,,,,,, +14363,1000014377,content://media/external/images/media/1000014377,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-22-10-29-44-242_com.whatsapp.jpg,image/jpeg,1080,2400,0,707617,,1671701384,1671701384437,0,0,0,0,,,,,,,,,,, +14364,1000014373,content://media/external/images/media/1000014373,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221222-WA0003.jpg",image/jpeg,921,2048,0,137283,,1671696599,1671696614253,0,0,0,0,,,,,,,,,,, +14365,1000014371,content://media/external/images/media/1000014371,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221222-WA0002.jpg",image/jpeg,1536,2048,0,1796251,,1671696114,1671696114985,0,0,0,0,,,,,,,,,,, +14366,1000014358,content://media/external/images/media/1000014358,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221222-WA0000.jpg",image/jpeg,1536,2048,0,1767770,,1671696111,1671696112332,0,0,0,0,,,,,,,,,,, +14367,1000014363,content://media/external/images/media/1000014363,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221222-WA0001.jpg",image/jpeg,1080,899,0,110717,,1671696112,1671696112882,0,0,0,0,,,,,,,,,,, +14368,1000014323,content://media/external/images/media/1000014323,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221221-WA0006.jpg",image/jpeg,900,1600,0,369231,,1671619294,1671619294845,0,0,0,0,,,,,,,,,,, +14369,1000014320,content://media/external/images/media/1000014320,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221221-WA0005.jpg",image/jpeg,1536,2048,0,615210,,1671618882,1671618883077,0,0,0,0,,,,,,,,,,, +14370,1000014317,content://media/external/images/media/1000014317,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221221-WA0004.jpg",image/jpeg,945,2048,0,191010,,1671612949,1671612950012,0,0,0,0,,,,,,,,,,, +14371,1000014315,content://media/external/images/media/1000014315,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-25-47-884_com.whatsapp.jpg,image/jpeg,1080,2400,0,315004,,1671607547,1671607547967,0,0,0,0,,,,,,,,,,, +14372,1000014313,content://media/external/images/media/1000014313,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-25-26-051_it.caitalia.apphub.jpg,image/jpeg,1080,2400,0,369785,,1671607526,1671607526143,0,0,0,0,,,,,,,,,,, +14373,1000014311,content://media/external/images/media/1000014311,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-24-12-629_it.caitalia.apphub.jpg,image/jpeg,1080,2400,0,367741,,1671607452,1671607452703,0,0,0,0,,,,,,,,,,, +14374,1000014310,content://media/external/images/media/1000014310,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-24-01-666_it.caitalia.apphub.jpg,image/jpeg,1080,2400,0,368592,,1671607441,1671607441967,0,0,0,0,,,,,,,,,,, +14375,1000014308,content://media/external/images/media/1000014308,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-23-37-066_com.whatsapp.jpg,image/jpeg,1080,2400,0,350409,,1671607417,1671607417531,0,0,0,0,,,,,,,,,,, +14376,1000014263,content://media/external/images/media/1000014263,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221220-WA0003.jpg",image/jpeg,921,2048,0,71326,,1671532404,1671532404719,0,0,0,0,,,,,,,,,,, +14377,1000014259,content://media/external/images/media/1000014259,/storage/emulated/0/DCIM/Facebook/FB_IMG_1671532011809.jpg,image/jpeg,1080,720,0,44198,,1671532011,1671532011849,0,0,0,0,,,,,,,,,,, +14378,1000014258,content://media/external/images/media/1000014258,/storage/emulated/0/DCIM/Facebook/FB_IMG_1671531982691.jpg,image/jpeg,1080,720,0,53820,,1671531982,1671531982737,0,0,0,0,,,,,,,,,,, +14379,1000014257,content://media/external/images/media/1000014257,/storage/emulated/0/DCIM/Facebook/FB_IMG_1671531893046.jpg,image/jpeg,1080,720,0,40848,,1671531893,1671531893089,0,0,0,0,,,,,,,,,,, +14380,1000014238,content://media/external/images/media/1000014238,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221219-WA0003.jpg",image/jpeg,1076,1600,0,190119,,1671431857,1671431858029,0,0,0,0,,,,,,,,,,, +14381,1000014227,content://media/external/images/media/1000014227,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221219-WA0001.jpg",image/jpeg,2048,1536,0,2158972,,1671407347,1671407348070,0,0,0,0,,,,,,,,,,, +14382,1000014229,content://media/external/images/media/1000014229,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221219-WA0002.jpg",image/jpeg,2048,1536,0,1816669,,1671407348,1671407348870,0,0,0,0,,,,,,,,,,, +14383,1000014224,content://media/external/images/media/1000014224,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221219-WA0000.jpg",image/jpeg,1600,1197,0,208605,,1671404816,1671404816821,0,0,0,0,,,,,,,,,,, +14384,1000014219,content://media/external/images/media/1000014219,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0014.jpg",image/jpeg,600,398,0,15744,,1671386799,1671386799932,0,0,0,0,,,,,,,,,,, +14385,1000014206,content://media/external/images/media/1000014206,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0012.jpg",image/jpeg,1024,344,0,23780,,1671380384,1671380384630,0,0,0,0,,,,,,,,,,, +14386,1000014203,content://media/external/images/media/1000014203,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0011.jpg",image/jpeg,2048,1536,0,119855,,1671378552,1671378552576,0,0,0,0,,,,,,,,,,, +14387,1000014195,content://media/external/images/media/1000014195,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0008.jpg",image/jpeg,1376,986,0,663946,,1671376109,1671376110185,0,0,0,0,,,,,,,,,,, +14388,1000014182,content://media/external/images/media/1000014182,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0006.jpg",image/jpeg,1920,1080,0,631241,,1671368081,1671368082189,0,0,0,0,,,,,,,,,,, +14389,1000014179,content://media/external/images/media/1000014179,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0005.jpg",image/jpeg,1536,2048,0,152348,,1671368080,1671368081101,0,0,0,0,,,,,,,,,,, +14390,1000014173,content://media/external/images/media/1000014173,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0003.jpg",image/jpeg,2046,2048,0,279432,,1671368079,1671368080216,0,0,0,0,,,,,,,,,,, +14391,1000014176,content://media/external/images/media/1000014176,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0004.jpg",image/jpeg,1536,2048,0,146271,,1671368080,1671368080620,0,0,0,0,,,,,,,,,,, +14392,1000014170,content://media/external/images/media/1000014170,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0002.jpg",image/jpeg,1920,1080,0,274305,,1671368078,1671368079198,0,0,0,0,,,,,,,,,,, +14393,1000014163,content://media/external/images/media/1000014163,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0000.jpg",image/jpeg,520,1156,0,68733,,1671353890,1671353890809,0,0,0,0,,,,,,,,,,, +14394,1000014149,content://media/external/images/media/1000014149,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0011.jpg",image/jpeg,1080,1920,0,229941,,1671306642,1671306642915,0,0,0,0,,,,,,,,,,, +14395,1000014143,content://media/external/images/media/1000014143,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-17-16-45-06-683_com.whatsapp.jpg,image/jpeg,1080,2400,0,792848,,1671291906,1671291906841,0,0,0,0,,,,,,,,,,, +14396,1000014135,content://media/external/images/media/1000014135,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0008.jpg",image/jpeg,1532,2048,0,157077,,1671288446,1671289490028,0,0,0,0,,,,,,,,,,, +14397,1000014138,content://media/external/images/media/1000014138,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0009.jpg",image/jpeg,1532,2048,0,137012,,1671289411,1671289470136,0,0,0,0,,,,,,,,,,, +14398,1000014130,content://media/external/images/media/1000014130,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0007.jpg",image/jpeg,1197,1600,0,133796,,1671285802,1671285803104,0,0,0,0,,,,,,,,,,, +14399,1000014124,content://media/external/images/media/1000014124,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0005.jpg",image/jpeg,921,2048,0,141543,,1671282059,1671282060121,0,0,0,0,,,,,,,,,,, +14400,1000014127,content://media/external/images/media/1000014127,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0006.jpg",image/jpeg,1197,1600,0,114106,,1671282060,1671282060442,0,0,0,0,,,,,,,,,,, +14401,1000014117,content://media/external/images/media/1000014117,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0003.jpg",image/jpeg,520,1156,0,46082,,1671275796,1671275796544,0,0,0,0,,,,,,,,,,, +14402,1000014114,content://media/external/images/media/1000014114,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0002.jpg",image/jpeg,1052,473,0,26894,,1671275077,1671275077566,0,0,0,0,,,,,,,,,,, +14403,1000014111,content://media/external/images/media/1000014111,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0001.jpg",image/jpeg,611,856,0,63326,,1671265942,1671265943272,0,0,0,0,,,,,,,,,,, +14404,1000014108,content://media/external/images/media/1000014108,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0000.jpg",image/jpeg,921,2048,0,108386,,1671264577,1671264578726,0,0,0,0,,,,,,,,,,, +14405,1000014099,content://media/external/images/media/1000014099,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221216-WA0004.jpg",image/jpeg,720,1600,0,85678,,1671212383,1671212383898,0,0,0,0,,,,,,,,,,, +14406,1000014093,content://media/external/images/media/1000014093,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221216-WA0003.jpg",image/jpeg,720,960,0,39912,,1671201284,1671201285147,0,0,0,0,,,,,,,,,,, +14407,1000014088,content://media/external/images/media/1000014088,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-16-12-15-09-354_com.google.android.gm.jpg,image/jpeg,1080,2400,0,384085,,1671189309,1671189309558,0,0,0,0,,,,,,,,,,, +14408,1000014072,content://media/external/images/media/1000014072,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221216-WA0001.jpg",image/jpeg,921,2048,0,108715,,1671182599,1671182599945,0,0,0,0,,,,,,,,,,, +14409,1000014070,content://media/external/images/media/1000014070,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-16-08-44-41-276_com.ebay.mobile.jpg,image/jpeg,1080,2400,0,366996,,1671176681,1671176681369,0,0,0,0,,,,,,,,,,, +14410,1000014069,content://media/external/images/media/1000014069,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-16-08-43-19-381_com.ebay.mobile.jpg,image/jpeg,1080,2400,0,477958,,1671176599,1671176599729,0,0,0,0,,,,,,,,,,, +14411,1000014049,content://media/external/images/media/1000014049,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221215-WA0000.jpg",image/jpeg,1530,2040,0,271228,,1671104604,1671104605048,0,0,0,0,,,,,,,,,,, +14412,1000014027,content://media/external/images/media/1000014027,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-14-16-43-16-707-edit_com.whatsapp.jpg,image/jpeg,1080,2400,0,702513,,1671032596,1671032596849,0,0,0,0,,,,,,,,,,, +14413,1000014026,content://media/external/images/media/1000014026,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-14-16-43-01-341_com.whatsapp.jpg,image/jpeg,1080,2400,0,670514,,1671032581,1671032581437,0,0,0,0,,,,,,,,,,, +14414,1000013993,content://media/external/images/media/1000013993,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0007.jpg",image/jpeg,940,1600,0,141187,,1670960409,1670960409639,0,0,0,0,,,,,,,,,,, +14415,1000013990,content://media/external/images/media/1000013990,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0006.jpg",image/jpeg,1280,958,0,75636,,1670959900,1670959905702,0,0,0,0,,,,,,,,,,, +14416,1000013986,content://media/external/images/media/1000013986,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0005.jpg",image/jpeg,720,1004,0,217247,,1670957815,1670957816306,0,0,0,0,,,,,,,,,,, +14417,1000013983,content://media/external/images/media/1000013983,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0004.jpg",image/jpeg,1536,2048,0,346389,,1670952827,1670952828273,0,0,0,0,,,,,,,,,,, +14418,1000013975,content://media/external/images/media/1000013975,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0003.jpg",image/jpeg,1152,2048,0,480336,,1670919598,1670919598972,0,0,0,0,,,,,,,,,,, +14419,1000013972,content://media/external/images/media/1000013972,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0002.jpg",image/jpeg,1500,2000,0,166614,,1670919538,1670919539039,0,0,0,0,,,,,,,,,,, +14420,1000013969,content://media/external/images/media/1000013969,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0001.jpg",image/jpeg,921,2048,0,67602,,1670916224,1670916225131,0,0,0,0,,,,,,,,,,, +14421,1000013966,content://media/external/images/media/1000013966,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0000.jpg",image/jpeg,921,2048,0,75245,,1670916223,1670916224127,0,0,0,0,,,,,,,,,,, +14422,1000013952,content://media/external/images/media/1000013952,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221212-WA0002.jpg",image/jpeg,2048,815,0,163585,,1670849397,1670849398162,0,0,0,0,,,,,,,,,,, +14423,1000013955,content://media/external/images/media/1000013955,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221212-WA0003.jpg",image/jpeg,1532,2048,0,289560,,1670849398,1670849398679,0,0,0,0,,,,,,,,,,, +14424,1000013949,content://media/external/images/media/1000013949,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221212-WA0001.jpg",image/jpeg,1532,2048,0,193583,,1670849396,1670849397895,0,0,0,0,,,,,,,,,,, +14425,1000013946,content://media/external/images/media/1000013946,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221212-WA0000.jpg",image/jpeg,1532,2048,0,309775,,1670849396,1670849396913,0,0,0,0,,,,,,,,,,, +14426,1000013931,content://media/external/images/media/1000013931,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221211-WA0001.jpg",image/jpeg,921,2048,0,148188,,1670753723,1670753725257,0,0,0,0,,,,,,,,,,, +14427,1000013918,content://media/external/images/media/1000013918,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221211-WA0000.jpg",image/jpeg,899,1599,0,148536,,1670716047,1670716089967,0,0,0,0,,,,,,,,,,, +14428,1000013910,content://media/external/images/media/1000013910,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221210-WA0003.jpg",image/jpeg,1240,1748,0,114866,,1670702861,1670702861758,0,0,0,0,,,,,,,,,,, +14429,1000013898,content://media/external/images/media/1000013898,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221210-WA0001.jpg",image/jpeg,1131,1600,0,241255,,1670680187,1670680187795,0,0,0,0,,,,,,,,,,, +14430,1000013895,content://media/external/images/media/1000013895,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221210-WA0000.jpg",image/jpeg,1152,2048,0,217276,,1670672814,1670672815460,0,0,0,0,,,,,,,,,,, +14431,1000013847,content://media/external/images/media/1000013847,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0021.jpg",image/jpeg,576,1024,0,14922,,1670514488,1670514489129,0,0,0,0,,,,,,,,,,, +14432,1000013840,content://media/external/images/media/1000013840,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0019.jpg",image/jpeg,1080,1920,0,155147,,1670512285,1670512286819,0,0,0,0,,,,,,,,,,, +14433,1000013816,content://media/external/images/media/1000013816,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0016.jpg",image/jpeg,1024,768,0,65384,,1670493366,1670493367128,0,0,0,0,,,,,,,,,,, +14434,1000013819,content://media/external/images/media/1000013819,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0017.jpg",image/jpeg,1024,768,0,21270,,1670493367,1670493367379,0,0,0,0,,,,,,,,,,, +14435,1000013822,content://media/external/images/media/1000013822,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0018.jpg",image/jpeg,768,1024,0,39580,,1670493367,1670493367628,0,0,0,0,,,,,,,,,,, +14436,1000013807,content://media/external/images/media/1000013807,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0013.jpg",image/jpeg,1024,768,0,45283,,1670493365,1670493366001,0,0,0,0,,,,,,,,,,, +14437,1000013810,content://media/external/images/media/1000013810,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0014.jpg",image/jpeg,1024,768,0,90968,,1670493366,1670493366288,0,0,0,0,,,,,,,,,,, +14438,1000013813,content://media/external/images/media/1000013813,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0015.jpg",image/jpeg,768,1024,0,43948,,1670493366,1670493366686,0,0,0,0,,,,,,,,,,, +14439,1000013804,content://media/external/images/media/1000013804,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0012.jpg",image/jpeg,768,1024,0,40710,,1670493364,1670493365589,0,0,0,0,,,,,,,,,,, +14440,1000013801,content://media/external/images/media/1000013801,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0011.jpg",image/jpeg,1024,768,0,95492,,1670493364,1670493364978,0,0,0,0,,,,,,,,,,, +14441,1000013798,content://media/external/images/media/1000013798,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0010.jpg",image/jpeg,516,727,0,84678,,1670487935,1670487936488,0,0,0,0,,,,,,,,,,, +14442,1000013777,content://media/external/images/media/1000013777,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0006.jpg",image/jpeg,1536,2048,0,444563,,1670455714,1670455715144,0,0,0,0,,,,,,,,,,, +14443,1000013780,content://media/external/images/media/1000013780,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0007.jpg",image/jpeg,1536,2048,0,393308,,1670455715,1670455715562,0,0,0,0,,,,,,,,,,, +14444,1000013774,content://media/external/images/media/1000013774,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0005.jpg",image/jpeg,1536,2048,0,508881,,1670455714,1670455714695,0,0,0,0,,,,,,,,,,, +14445,1000013764,content://media/external/images/media/1000013764,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0002.jpg",image/jpeg,2048,1536,0,396961,,1670455704,1670455705380,0,0,0,0,,,,,,,,,,, +14446,1000013767,content://media/external/images/media/1000013767,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0003.jpg",image/jpeg,2048,1536,0,436756,,1670455705,1670455705730,0,0,0,0,,,,,,,,,,, +14447,1000013758,content://media/external/images/media/1000013758,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0000.jpg",image/jpeg,2048,1536,0,494155,,1670455703,1670455704504,0,0,0,0,,,,,,,,,,, +14448,1000013761,content://media/external/images/media/1000013761,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0001.jpg",image/jpeg,2048,1536,0,455648,,1670455704,1670455704956,0,0,0,0,,,,,,,,,,, +14449,1000013752,content://media/external/images/media/1000013752,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0011.jpg",image/jpeg,720,517,0,53499,,1670440629,1670440630426,0,0,0,0,,,,,,,,,,, +14450,1000013746,content://media/external/images/media/1000013746,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0010.jpg",image/jpeg,1500,1500,0,116824,,1670434037,1670434037477,0,0,0,0,,,,,,,,,,, +14451,1000013740,content://media/external/images/media/1000013740,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0008.jpg",image/jpeg,1200,1600,0,183374,,1670426843,1670426843956,0,0,0,0,,,,,,,,,,, +14452,1000013728,content://media/external/images/media/1000013728,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0005.jpg",image/jpeg,1532,2048,0,159116,,1670421590,1670421591484,0,0,0,0,,,,,,,,,,, +14453,1000013725,content://media/external/images/media/1000013725,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0004.jpg",image/jpeg,1640,1232,0,139938,,1670421590,1670421590975,0,0,0,0,,,,,,,,,,, +14454,1000013722,content://media/external/images/media/1000013722,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0003.jpg",image/jpeg,1532,2048,0,121163,,1670421581,1670421582181,0,0,0,0,,,,,,,,,,, +14455,1000013718,content://media/external/images/media/1000013718,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0001.jpg",image/jpeg,720,1280,0,506915,,1670421070,1670421070623,0,0,0,0,,,,,,,,,,, +14456,1000013720,content://media/external/images/media/1000013720,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0002.jpg",image/jpeg,720,813,0,297772,,1670421070,1670421070973,0,0,0,0,,,,,,,,,,, +14457,1000013716,content://media/external/images/media/1000013716,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0000.jpg",image/jpeg,1080,1091,0,400013,,1670408367,1670408367718,0,0,0,0,,,,,,,,,,, +14458,1000013701,content://media/external/images/media/1000013701,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221206-WA0001.jpg",image/jpeg,1920,1080,0,257126,,1670364051,1670364052646,0,0,0,0,,,,,,,,,,, +14459,1000013695,content://media/external/images/media/1000013695,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221206-WA0000.jpg",image/jpeg,2048,1532,0,534312,,1670327789,1670327790184,0,0,0,0,,,,,,,,,,, +14460,1000013685,content://media/external/images/media/1000013685,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-05-19-44-12-953_com.android.chrome.jpg,image/jpeg,1080,2400,0,515000,,1670265853,1670265853082,0,0,0,0,,,,,,,,,,, +14461,1000013668,content://media/external/images/media/1000013668,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221205-WA0003.jpg",image/jpeg,1024,1144,0,123427,,1670258868,1670258869187,0,0,0,0,,,,,,,,,,, +14462,1000013664,content://media/external/images/media/1000013664,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-05-14-15-29-274_lockscreen.jpg,image/jpeg,1080,2400,0,847083,,1670246129,1670246129756,0,0,0,0,,,,,,,,,,, +14463,1000013659,content://media/external/images/media/1000013659,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221205-WA0001.jpg",image/jpeg,1599,899,0,145569,,1670223223,1670223224193,0,0,0,0,,,,,,,,,,, +14464,1000013656,content://media/external/images/media/1000013656,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221205-WA0000.jpg",image/jpeg,921,2048,0,113780,,1670222182,1670222183237,0,0,0,0,,,,,,,,,,, +14465,1000013648,content://media/external/images/media/1000013648,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0009.jpg",image/jpeg,1037,776,0,242159,,1670191208,1670191211395,0,0,0,0,,,,,,,,,,, +14466,1000013645,content://media/external/images/media/1000013645,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0008.jpg",image/jpeg,1532,2048,0,161536,,1670173690,1670173691385,0,0,0,0,,,,,,,,,,, +14467,1000013642,content://media/external/images/media/1000013642,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0007.jpg",image/jpeg,1170,1318,0,144759,,1670155648,1670155654464,0,0,0,0,,,,,,,,,,, +14468,1000013638,content://media/external/images/media/1000013638,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0005.jpg",image/jpeg,819,1024,0,176400,,1670153813,1670153814161,0,0,0,0,,,,,,,,,,, +14469,1000013633,content://media/external/images/media/1000013633,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0003.jpg",image/jpeg,1600,1134,0,82956,,1670147998,1670147998590,0,0,0,0,,,,,,,,,,, +14470,1000013628,content://media/external/images/media/1000013628,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0001.jpg",image/jpeg,1532,2048,0,107368,,1670147505,1670147506764,0,0,0,0,,,,,,,,,,, +14471,1000013625,content://media/external/images/media/1000013625,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0000.jpg",image/jpeg,720,1080,0,128926,,1670144148,1670144149256,0,0,0,0,,,,,,,,,,, +14472,1000013602,content://media/external/images/media/1000013602,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221202-WA0007.jpeg",image/jpeg,3840,2160,90,1485067,,1670015518,1670015518395,1670015518328,0,0,0,,,,,,,,,,, +14473,1000013600,content://media/external/images/media/1000013600,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221202-WA0005.jpeg",image/jpeg,3840,2160,90,1599136,,1670014520,1670014520571,1670014520473,0,0,0,,,,,,,,,,, +14474,1000013593,content://media/external/images/media/1000013593,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221202-WA0002.jpg",image/jpeg,1197,1600,0,156593,,1670012260,1670012273998,0,0,0,0,,,,,,,,,,, +14475,1000013572,content://media/external/images/media/1000013572,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221201-WA0001.jpg",image/jpeg,921,2048,0,149974,,1669921101,1669921106432,0,0,0,0,,,,,,,,,,, +14476,1000013545,content://media/external/images/media/1000013545,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221130-WA0000.jpg",image/jpeg,1128,1504,0,124304,,1669798137,1669798138286,0,0,0,0,,,,,,,,,,, +14477,1000013533,content://media/external/images/media/1000013533,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0013.jpg",image/jpeg,1920,1080,0,233055,,1669750038,1669750039158,0,0,0,0,,,,,,,,,,, +14478,1000013530,content://media/external/images/media/1000013530,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0012.jpg",image/jpeg,737,960,0,42991,,1669748977,1669748977986,0,0,0,0,,,,,,,,,,, +14479,1000013527,content://media/external/images/media/1000013527,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0011.jpg",image/jpeg,2048,1536,0,435625,,1669741162,1669741169280,0,0,0,0,,,,,,,,,,, +14480,1000013524,content://media/external/images/media/1000013524,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0010.jpg",image/jpeg,2048,1536,0,414373,,1669741151,1669741162176,0,0,0,0,,,,,,,,,,, +14481,1000013518,content://media/external/images/media/1000013518,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0008.jpg",image/jpeg,640,1309,0,77580,,1669739662,1669739662922,0,0,0,0,,,,,,,,,,, +14482,1000013512,content://media/external/images/media/1000013512,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0006.jpg",image/jpeg,2048,921,0,139243,,1669728596,1669728625328,0,0,0,0,,,,,,,,,,, +14483,1000013515,content://media/external/images/media/1000013515,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0007.jpg",image/jpeg,1010,840,0,68987,,1669728625,1669728625506,0,0,0,0,,,,,,,,,,, +14484,1000013506,content://media/external/images/media/1000013506,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0004.jpg",image/jpeg,942,524,0,19721,,1669728595,1669728596487,0,0,0,0,,,,,,,,,,, +14485,1000013509,content://media/external/images/media/1000013509,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0005.jpg",image/jpeg,582,428,0,21532,,1669728596,1669728596612,0,0,0,0,,,,,,,,,,, +14486,1000013503,content://media/external/images/media/1000013503,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0003.jpg",image/jpeg,1600,1200,0,101253,,1669725861,1669725861710,0,0,0,0,,,,,,,,,,, +14487,1000013500,content://media/external/images/media/1000013500,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0002.jpg",image/jpeg,921,2048,0,100183,,1669720457,1669720458116,0,0,0,0,,,,,,,,,,, +14488,1000013498,content://media/external/images/media/1000013498,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0001.jpg",image/jpeg,844,1024,0,94218,,1669708002,1669708002377,0,0,0,0,,,,,,,,,,, +14489,1000013495,content://media/external/images/media/1000013495,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0000.jpg",image/jpeg,1504,1128,0,101551,,1669707850,1669707863584,0,0,0,0,,,,,,,,,,, +14490,1000013366,content://media/external/images/media/1000013366,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-27-14-28-51-460_com.huami.watch.hmwatchmanager.jpg,image/jpeg,1080,2400,0,567482,,1669555731,1669555731804,0,0,0,0,,,,,,,,,,, +14491,1000013347,content://media/external/images/media/1000013347,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221127-WA0000.jpg",image/jpeg,1536,2048,0,426106,,1669507869,1669507870512,0,0,0,0,,,,,,,,,,, +14492,1000013340,content://media/external/images/media/1000013340,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221126-WA0002.jpg",image/jpeg,2000,900,0,145883,,1669493041,1669493079137,0,0,0,0,,,,,,,,,,, +14493,1000013334,content://media/external/images/media/1000013334,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221126-WA0001.jpg",image/jpeg,1040,726,0,59711,,1669467436,1669467437237,0,0,0,0,,,,,,,,,,, +14494,1000013330,content://media/external/images/media/1000013330,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-26-13-30-23-962_com.android.chrome.jpg,image/jpeg,1080,2400,0,283153,,1669465824,1669465824157,0,0,0,0,,,,,,,,,,, +14495,1000013328,content://media/external/images/media/1000013328,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-26-12-35-15-162-edit_com.google.android.apps.docs.editors.sheets.jpg,image/jpeg,1080,763,0,127727,,1669462515,1669462515447,0,0,0,0,,,,,,,,,,, +14496,1000012631,content://media/external/images/media/1000012631,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221114-WA0000.jpg",image/jpeg,400,400,0,8881,,1668412265,1669388695793,0,0,0,0,,,,,,,,,,, +14497,1000013308,content://media/external/images/media/1000013308,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221125-WA0000.jpg",image/jpeg,720,1600,0,136874,,1669378249,1669378250615,0,0,0,0,,,,,,,,,,, +14498,1000013289,content://media/external/images/media/1000013289,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0013.jpg",image/jpeg,1600,1200,0,400052,,1669328554,1669328555117,0,0,0,0,,,,,,,,,,, +14499,1000013285,content://media/external/images/media/1000013285,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0011.jpg",image/jpeg,1600,1200,0,362182,,1669328554,1669328554389,0,0,0,0,,,,,,,,,,, +14500,1000013287,content://media/external/images/media/1000013287,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0012.jpg",image/jpeg,1600,1200,0,387692,,1669328554,1669328554785,0,0,0,0,,,,,,,,,,, +14501,1000013278,content://media/external/images/media/1000013278,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-24-19-52-48-646-edit_com.google.android.googlequicksearchbox.jpg,image/jpeg,1052,1538,0,582226,,1669315968,1669315968760,0,0,0,0,,,,,,,,,,, +14502,1000013213,content://media/external/images/media/1000013213,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0009.jpg",image/jpeg,1024,683,0,89231,,1669293034,1669293034931,0,0,0,0,,,,,,,,,,, +14503,1000013207,content://media/external/images/media/1000013207,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0008.jpg",image/jpeg,2048,1536,0,486101,,1669287924,1669287926018,0,0,0,0,,,,,,,,,,, +14504,1000013204,content://media/external/images/media/1000013204,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0007.jpg",image/jpeg,1599,1200,0,389238,,1669287530,1669287531798,0,0,0,0,,,,,,,,,,, +14505,1000013198,content://media/external/images/media/1000013198,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0005.jpg",image/jpeg,1200,1599,0,298583,,1669285638,1669285639090,0,0,0,0,,,,,,,,,,, +14506,1000013201,content://media/external/images/media/1000013201,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0006.jpg",image/jpeg,1200,1599,0,317813,,1669285639,1669285639829,0,0,0,0,,,,,,,,,,, +14507,1000013192,content://media/external/images/media/1000013192,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0003.jpg",image/jpeg,1599,1200,0,322671,,1669285637,1669285638040,0,0,0,0,,,,,,,,,,, +14508,1000013195,content://media/external/images/media/1000013195,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0004.jpg",image/jpeg,1200,1599,0,306012,,1669285638,1669285638543,0,0,0,0,,,,,,,,,,, +14509,1000013189,content://media/external/images/media/1000013189,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0002.jpg",image/jpeg,1200,1599,0,316870,,1669285636,1669285637395,0,0,0,0,,,,,,,,,,, +14510,1000013186,content://media/external/images/media/1000013186,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0001.jpg",image/jpeg,1200,1599,0,307336,,1669285635,1669285636889,0,0,0,0,,,,,,,,,,, +14511,1000013180,content://media/external/images/media/1000013180,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0000.jpg",image/jpeg,526,526,0,42548,,1669275092,1669275093306,0,0,0,0,,,,,,,,,,, +14512,1000013164,content://media/external/images/media/1000013164,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0011.jpg",image/jpeg,1600,1200,0,267728,,1669243942,1669247570185,0,0,0,0,,,,,,,,,,, +14513,1000013158,content://media/external/images/media/1000013158,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0009.jpg",image/jpeg,1600,1200,0,218646,,1669243941,1669243942207,0,0,0,0,,,,,,,,,,, +14514,1000013161,content://media/external/images/media/1000013161,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0010.jpg",image/jpeg,1600,1200,0,276379,,1669243942,1669243942457,0,0,0,0,,,,,,,,,,, +14515,1000013167,content://media/external/images/media/1000013167,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0012.jpg",image/jpeg,1600,1200,0,270717,,1669243942,1669243942869,0,0,0,0,,,,,,,,,,, +14516,1000013141,content://media/external/images/media/1000013141,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0007.jpg",image/jpeg,1024,768,0,111575,,1669201621,1669201622047,0,0,0,0,,,,,,,,,,, +14517,1000013129,content://media/external/images/media/1000013129,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0003.jpg",image/jpeg,1024,768,0,178339,,1669201620,1669201621079,0,0,0,0,,,,,,,,,,, +14518,1000013132,content://media/external/images/media/1000013132,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0004.jpg",image/jpeg,1024,768,0,113406,,1669201621,1669201621288,0,0,0,0,,,,,,,,,,, +14519,1000013135,content://media/external/images/media/1000013135,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0005.jpg",image/jpeg,1024,768,0,131041,,1669201621,1669201621564,0,0,0,0,,,,,,,,,,, +14520,1000013138,content://media/external/images/media/1000013138,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0006.jpg",image/jpeg,1024,768,0,88819,,1669201621,1669201621777,0,0,0,0,,,,,,,,,,, +14521,1000013120,content://media/external/images/media/1000013120,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0000.jpg",image/jpeg,1024,768,0,122145,,1669201619,1669201620256,0,0,0,0,,,,,,,,,,, +14522,1000013123,content://media/external/images/media/1000013123,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0001.jpg",image/jpeg,768,1024,0,104050,,1669201620,1669201620660,0,0,0,0,,,,,,,,,,, +14523,1000013126,content://media/external/images/media/1000013126,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0002.jpg",image/jpeg,768,1024,0,158897,,1669201620,1669201620898,0,0,0,0,,,,,,,,,,, +14524,1000013087,content://media/external/images/media/1000013087,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221122-WA0002.jpg",image/jpeg,1080,1440,0,302185,,1669123243,1669123244158,0,0,0,0,,,,,,,,,,, +14525,1000013081,content://media/external/images/media/1000013081,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221122-WA0000.jpg",image/jpeg,360,360,0,40345,,1669119696,1669119696263,0,0,0,0,,,,,,,,,,, +14526,1000013023,content://media/external/images/media/1000013023,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0010.jpg",image/jpeg,1080,720,0,108452,,1669046525,1669046657110,0,0,0,0,,,,,,,,,,, +14527,1000013017,content://media/external/images/media/1000013017,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0008.jpg",image/jpeg,1080,611,0,91952,,1669046502,1669046649951,0,0,0,0,,,,,,,,,,, +14528,1000013020,content://media/external/images/media/1000013020,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0009.jpg",image/jpeg,940,787,0,35048,,1669046503,1669046504024,0,0,0,0,,,,,,,,,,, +14529,1000012766,content://media/external/images/media/1000012766,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0000.jpg",image/jpeg,921,2048,0,195675,,1668685370,1669036981250,0,0,0,0,,,,,,,,,,, +14530,1000013010,content://media/external/images/media/1000013010,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0007.jpg",image/jpeg,921,2048,0,119927,,1669028684,1669028684928,0,0,0,0,,,,,,,,,,, +14531,1000013005,content://media/external/images/media/1000013005,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0005.jpg",image/jpeg,1196,1600,0,448026,,1669026552,1669026557828,0,0,0,0,,,,,,,,,,, +14532,1000013002,content://media/external/images/media/1000013002,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0004.jpg",image/jpeg,400,400,0,14221,,1669024979,1669024980148,0,0,0,0,,,,,,,,,,, +14533,1000012999,content://media/external/images/media/1000012999,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0003.jpg",image/jpeg,1195,2048,0,171198,,1669022614,1669022614637,0,0,0,0,,,,,,,,,,, +14534,1000012996,content://media/external/images/media/1000012996,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0002.jpg",image/jpeg,2048,1536,0,682408,,1669020084,1669020085804,0,0,0,0,,,,,,,,,,, +14535,1000012993,content://media/external/images/media/1000012993,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0001.jpg",image/jpeg,750,750,0,56006,,1669019293,1669019293917,0,0,0,0,,,,,,,,,,, +14536,1000012966,content://media/external/images/media/1000012966,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0015.jpg",image/jpeg,1197,1600,0,155843,,1668970199,1668970201872,0,0,0,0,,,,,,,,,,, +14537,1000012959,content://media/external/images/media/1000012959,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0013.jpg",image/jpeg,1532,2048,0,485349,,1668966882,1668966883300,0,0,0,0,,,,,,,,,,, +14538,1000012934,content://media/external/images/media/1000012934,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0005.jpg",image/jpeg,1196,1600,0,220856,,1668959268,1668966882139,0,0,0,0,,,,,,,,,,, +14539,1000012952,content://media/external/images/media/1000012952,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0011.jpg",image/jpeg,2048,1532,0,539055,,1668966881,1668966882077,0,0,0,0,,,,,,,,,,, +14540,1000012956,content://media/external/images/media/1000012956,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0012.jpg",image/jpeg,2048,1532,0,457000,,1668966882,1668966882609,0,0,0,0,,,,,,,,,,, +14541,1000012946,content://media/external/images/media/1000012946,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0009.jpg",image/jpeg,236,248,0,11924,,1668966680,1668966680813,0,0,0,0,,,,,,,,,,, +14542,1000012940,content://media/external/images/media/1000012940,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0008.jpg",image/jpeg,1201,1600,0,131444,,1668961337,1668961338330,0,0,0,0,,,,,,,,,,, +14543,1000012925,content://media/external/images/media/1000012925,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0004.jpg",image/jpeg,1536,2048,0,316670,,1668946862,1668946865051,0,0,0,0,,,,,,,,,,, +14544,1000012918,content://media/external/images/media/1000012918,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0001.jpg",image/jpeg,2048,1532,0,330794,,1668933146,1668933146558,0,0,0,0,,,,,,,,,,, +14545,1000012902,content://media/external/images/media/1000012902,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221119-WA0002.jpg",image/jpeg,1024,768,0,148487,,1668892885,1668892885487,0,0,0,0,,,,,,,,,,, +14546,1000012891,content://media/external/images/media/1000012891,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221119-WA0000.jpg",image/jpeg,751,1226,0,92531,,1668852095,1668852096327,0,0,0,0,,,,,,,,,,, +14547,1000012816,content://media/external/images/media/1000012816,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221118-WA0005.jpg",image/jpeg,921,2048,0,179933,,1668773802,1668773810785,0,0,0,0,,,,,,,,,,, +14548,1000012813,content://media/external/images/media/1000012813,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221118-WA0004.jpg",image/jpeg,1200,1600,0,215410,,1668768033,1668768034179,0,0,0,0,,,,,,,,,,, +14549,1000012811,content://media/external/images/media/1000012811,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221118-WA0002.jpeg",image/jpeg,3840,2160,90,1396084,,1668765580,1668765580965,1668765580899,0,0,0,,,,,,,,,,, +14550,1000012799,content://media/external/images/media/1000012799,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221118-WA0000.jpg",image/jpeg,720,1600,0,80702,,1668728293,1668728293748,0,0,0,0,,,,,,,,,,, +14551,1000012793,content://media/external/images/media/1000012793,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0005.jpg",image/jpeg,921,2048,0,149296,,1668725530,1668725531456,0,0,0,0,,,,,,,,,,, +14552,1000012796,content://media/external/images/media/1000012796,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0006.jpg",image/jpeg,921,2048,0,120564,,1668725531,1668725531923,0,0,0,0,,,,,,,,,,, +14553,1000012789,content://media/external/images/media/1000012789,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0004.jpg",image/jpeg,821,1024,0,73175,,1668721913,1668721913949,0,0,0,0,,,,,,,,,,, +14554,1000012778,content://media/external/images/media/1000012778,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0002.jpg",image/jpeg,921,2048,0,154011,,1668690831,1668690833098,0,0,0,0,,,,,,,,,,, +14555,1000012772,content://media/external/images/media/1000012772,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0001.jpg",image/jpeg,921,2048,0,143855,,1668689720,1668689721885,0,0,0,0,,,,,,,,,,, +14556,1000012726,content://media/external/images/media/1000012726,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-16-09-11-04-106-edit_com.strava.jpg,image/jpeg,1071,1194,0,107020,,1668586264,1668586264174,0,0,0,0,,,,,,,,,,, +14557,1000012720,content://media/external/images/media/1000012720,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-16-09-08-11-012_com.miui.gallery.jpg,image/jpeg,1080,2400,0,544134,,1668586091,1668586091410,0,0,0,0,,,,,,,,,,, +14558,1000012709,content://media/external/images/media/1000012709,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0010.jpg",image/jpeg,545,960,0,101561,,1668537278,1668537278878,0,0,0,0,,,,,,,,,,, +14559,1000012707,content://media/external/images/media/1000012707,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0009.jpg",image/jpeg,720,833,0,107466,,1668533346,1668533346991,0,0,0,0,,,,,,,,,,, +14560,1000012696,content://media/external/images/media/1000012696,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0007.jpg",image/jpeg,1599,777,0,141400,,1668510798,1668510798883,0,0,0,0,,,,,,,,,,, +14561,1000012690,content://media/external/images/media/1000012690,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0005.jpg",image/jpeg,1599,777,0,261614,,1668505979,1668505980032,0,0,0,0,,,,,,,,,,, +14562,1000012693,content://media/external/images/media/1000012693,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0006.jpg",image/jpeg,1599,777,0,335829,,1668505980,1668505980380,0,0,0,0,,,,,,,,,,, +14563,1000012687,content://media/external/images/media/1000012687,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0004.jpg",image/jpeg,1600,1200,0,413622,,1668505438,1668505438763,0,0,0,0,,,,,,,,,,, +14564,1000012680,content://media/external/images/media/1000012680,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0002.jpg",image/jpeg,2048,1536,0,245442,,1668502775,1668502776507,0,0,0,0,,,,,,,,,,, +14565,1000012677,content://media/external/images/media/1000012677,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0001.jpg",image/jpeg,1600,900,0,333478,,1668501191,1668501192472,0,0,0,0,,,,,,,,,,, +14566,1000012674,content://media/external/images/media/1000012674,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0000.jpg",image/jpeg,2048,1536,0,277983,,1668498871,1668498872064,0,0,0,0,,,,,,,,,,, +14567,1000012665,content://media/external/images/media/1000012665,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221114-WA0002.jpg",image/jpeg,921,2048,0,119700,,1668456003,1668456004554,0,0,0,0,,,,,,,,,,, +14568,1000012661,content://media/external/images/media/1000012661,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-14-13-43-01-262-edit_cn.wps.moffice_eng.jpg,image/jpeg,292,650,0,86717,,1668429781,1668429781408,0,0,0,0,,,,,,,,,,, +14569,1000012617,content://media/external/images/media/1000012617,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0005.jpg",image/jpeg,921,2048,0,121587,,1668346843,1668346843753,0,0,0,0,,,,,,,,,,, +14570,1000012614,content://media/external/images/media/1000012614,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0004.jpg",image/jpeg,400,400,0,11910,,1668346790,1668346791021,0,0,0,0,,,,,,,,,,, +14571,1000012611,content://media/external/images/media/1000012611,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0003.jpg",image/jpeg,1536,2048,0,530589,,1668339188,1668339194663,0,0,0,0,,,,,,,,,,, +14572,1000012608,content://media/external/images/media/1000012608,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0002.jpg",image/jpeg,1536,2048,0,553549,,1668337508,1668337508981,0,0,0,0,,,,,,,,,,, +14573,1000012605,content://media/external/images/media/1000012605,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0001.jpg",image/jpeg,1599,1200,0,361702,,1668336622,1668336623287,0,0,0,0,,,,,,,,,,, +14574,1000012602,content://media/external/images/media/1000012602,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0000.jpg",image/jpeg,1599,1200,0,375591,,1668336622,1668336622797,0,0,0,0,,,,,,,,,,, +14575,1000012576,content://media/external/images/media/1000012576,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221112-WA0008.jpg",image/jpeg,2048,1536,0,350896,,1668288664,1668288665317,0,0,0,0,,,,,,,,,,, +14576,1000012579,content://media/external/images/media/1000012579,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221112-WA0009.jpg",image/jpeg,2048,1536,0,345422,,1668288665,1668288665524,0,0,0,0,,,,,,,,,,, +14577,1000012573,content://media/external/images/media/1000012573,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221112-WA0007.jpg",image/jpeg,1536,2048,0,362583,,1668288494,1668288495183,0,0,0,0,,,,,,,,,,, +14578,1000012570,content://media/external/images/media/1000012570,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221112-WA0006.jpg",image/jpeg,2048,1536,0,232186,,1668275680,1668275681556,0,0,0,0,,,,,,,,,,, +14579,1000012541,content://media/external/images/media/1000012541,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-11-19-27-22-128-edit_com.strava.jpg,image/jpeg,1080,1641,0,485763,,1668191242,1668191242225,0,0,0,0,,,,,,,,,,, +14580,1000012523,content://media/external/images/media/1000012523,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221111-WA0000.jpg",image/jpeg,654,810,0,44278,,1668164787,1668165818726,0,0,0,0,,,,,,,,,,, +14581,1000012485,content://media/external/images/media/1000012485,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0009.jpg",image/jpeg,1536,2048,0,305654,,1668090496,1668090496947,0,0,0,0,,,,,,,,,,, +14582,1000012480,content://media/external/images/media/1000012480,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0008.jpg",image/jpeg,1440,2036,0,106687,,1668079822,1668079822967,0,0,0,0,,,,,,,,,,, +14583,1000012478,content://media/external/images/media/1000012478,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0007.jpg",image/jpeg,1156,405,0,46645,,1668075312,1668075312962,0,0,0,0,,,,,,,,,,, +14584,1000012475,content://media/external/images/media/1000012475,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0006.jpg",image/jpeg,379,191,0,13972,,1668074579,1668074579346,0,0,0,0,,,,,,,,,,, +14585,1000012473,content://media/external/images/media/1000012473,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0004.jpeg",image/jpeg,3840,2160,90,760823,,1668074178,1668074178361,1668074178288,0,0,0,,,,,,,,,,, +14586,1000012467,content://media/external/images/media/1000012467,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0002.jpg",image/jpeg,899,1599,0,79258,,1668072385,1668072386036,0,0,0,0,,,,,,,,,,, +14587,1000012470,content://media/external/images/media/1000012470,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0003.jpg",image/jpeg,899,1599,0,139875,,1668072386,1668072386694,0,0,0,0,,,,,,,,,,, +14588,1000012464,content://media/external/images/media/1000012464,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0001.jpg",image/jpeg,899,1599,0,130673,,1668072384,1668072385294,0,0,0,0,,,,,,,,,,, +14589,1000012459,content://media/external/images/media/1000012459,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0000.jpg",image/jpeg,921,2048,0,227385,,1668065054,1668065054975,0,0,0,0,,,,,,,,,,, +14590,1000012450,content://media/external/images/media/1000012450,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0005.jpg",image/jpeg,1080,1389,0,191139,,1668023463,1668023464565,0,0,0,0,,,,,,,,,,, +14591,1000012447,content://media/external/images/media/1000012447,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0004.jpg",image/jpeg,946,2048,0,216015,,1667999141,1667999142712,0,0,0,0,,,,,,,,,,, +14592,1000012444,content://media/external/images/media/1000012444,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0003.jpg",image/jpeg,921,2048,0,110105,,1667975411,1667975411471,0,0,0,0,,,,,,,,,,, +14593,1000012441,content://media/external/images/media/1000012441,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0002.jpg",image/jpeg,1076,979,0,107790,,1667975228,1667975228559,0,0,0,0,,,,,,,,,,, +14594,1000012438,content://media/external/images/media/1000012438,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0001.jpg",image/jpeg,946,2048,0,201361,,1667974605,1667974606004,0,0,0,0,,,,,,,,,,, +14595,1000012435,content://media/external/images/media/1000012435,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0000.jpg",image/jpeg,2048,1536,0,697305,,1667973962,1667973963575,0,0,0,0,,,,,,,,,,, +14596,1000012427,content://media/external/images/media/1000012427,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0007.jpg",image/jpeg,720,960,0,72871,,1667930217,1667930218230,0,0,0,0,,,,,,,,,,, +14597,1000012420,content://media/external/images/media/1000012420,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0006.jpg",image/jpeg,793,1600,0,122016,,1667924729,1667924730276,0,0,0,0,,,,,,,,,,, +14598,1000012417,content://media/external/images/media/1000012417,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0005.jpg",image/jpeg,1143,1600,0,70758,,1667914624,1667914624895,0,0,0,0,,,,,,,,,,, +14599,1000012414,content://media/external/images/media/1000012414,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0004.jpg",image/jpeg,1536,2048,0,300602,,1667906311,1667906312802,0,0,0,0,,,,,,,,,,, +14600,1000012408,content://media/external/images/media/1000012408,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0002.jpg",image/jpeg,1536,2048,0,575949,,1667906310,1667906311410,0,0,0,0,,,,,,,,,,, +14601,1000012411,content://media/external/images/media/1000012411,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0003.jpg",image/jpeg,1536,2048,0,562824,,1667906311,1667906311927,0,0,0,0,,,,,,,,,,, +14602,1000012405,content://media/external/images/media/1000012405,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0001.jpg",image/jpeg,1200,1599,0,365952,,1667906127,1667906127600,0,0,0,0,,,,,,,,,,, +14603,1000012402,content://media/external/images/media/1000012402,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0000.jpg",image/jpeg,1600,1380,0,353218,,1667905899,1667905900268,0,0,0,0,,,,,,,,,,, +14604,1000012401,content://media/external/images/media/1000012401,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-08-08-04-08-999_com.google.android.dialer.jpg,image/jpeg,1080,2400,0,175417,,1667891049,1667891049234,0,0,0,0,,,,,,,,,,, +14605,1000012392,content://media/external/images/media/1000012392,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0013.jpg",image/jpeg,1200,1599,0,394301,,1667828970,1667828971240,0,0,0,0,,,,,,,,,,, +14606,1000012375,content://media/external/images/media/1000012375,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0007.jpg",image/jpeg,1504,1128,0,222099,,1667823212,1667823213018,0,0,0,0,,,,,,,,,,, +14607,1000012378,content://media/external/images/media/1000012378,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0008.jpg",image/jpeg,1600,1200,0,313223,,1667823213,1667823213299,0,0,0,0,,,,,,,,,,, +14608,1000012381,content://media/external/images/media/1000012381,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0009.jpg",image/jpeg,1128,1504,0,166728,,1667823213,1667823213602,0,0,0,0,,,,,,,,,,, +14609,1000012384,content://media/external/images/media/1000012384,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0010.jpg",image/jpeg,1128,1504,0,146250,,1667823213,1667823213958,0,0,0,0,,,,,,,,,,, +14610,1000012372,content://media/external/images/media/1000012372,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0006.jpg",image/jpeg,1504,1128,0,138195,,1667823211,1667823212184,0,0,0,0,,,,,,,,,,, +14611,1000012369,content://media/external/images/media/1000012369,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0005.jpg",image/jpeg,1600,1200,0,232774,,1667823210,1667823211693,0,0,0,0,,,,,,,,,,, +14612,1000012362,content://media/external/images/media/1000012362,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0004.jpg",image/jpeg,1200,1599,0,220312,,1667816069,1667816069763,0,0,0,0,,,,,,,,,,, +14613,1000012359,content://media/external/images/media/1000012359,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0003.jpg",image/jpeg,1600,434,0,71503,,1667815998,1667815998650,0,0,0,0,,,,,,,,,,, +14614,1000012354,content://media/external/images/media/1000012354,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0002.jpg",image/jpeg,1200,1599,0,527090,,1667810315,1667810316380,0,0,0,0,,,,,,,,,,, +14615,1000012352,content://media/external/images/media/1000012352,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-07-08-39-50-826_it.subito.jpg,image/jpeg,1080,2400,0,453997,,1667806791,1667806791309,0,0,0,0,,,,,,,,,,, +14616,1000012349,content://media/external/images/media/1000012349,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0000.jpg",image/jpeg,713,892,0,89611,,1667806145,1667806145817,0,0,0,0,,,,,,,,,,, +14617,1000012341,content://media/external/images/media/1000012341,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221106-WA0001.jpg",image/jpeg,720,948,0,146177,,1667738925,1667738926131,0,0,0,0,,,,,,,,,,, +14618,1000012338,content://media/external/images/media/1000012338,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221106-WA0000.jpg",image/jpeg,1504,1128,0,308752,,1667722460,1667722460928,0,0,0,0,,,,,,,,,,, +14619,1000012329,content://media/external/images/media/1000012329,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0009.jpg",image/jpeg,2048,1536,0,307746,,1667677352,1667677352486,0,0,0,0,,,,,,,,,,, +14620,1000012322,content://media/external/images/media/1000012322,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0008.jpg",image/jpeg,1080,1080,0,58466,,1667651368,1667651368912,0,0,0,0,,,,,,,,,,, +14621,1000012317,content://media/external/images/media/1000012317,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0007.jpg",image/jpeg,1156,520,0,88207,,1667645479,1667645479910,0,0,0,0,,,,,,,,,,, +14622,1000012314,content://media/external/images/media/1000012314,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0006.jpg",image/jpeg,1600,900,0,198098,,1667645113,1667645114516,0,0,0,0,,,,,,,,,,, +14623,1000012311,content://media/external/images/media/1000012311,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0005.jpg",image/jpeg,958,1280,0,104268,,1667645111,1667645112338,0,0,0,0,,,,,,,,,,, +14624,1000012308,content://media/external/images/media/1000012308,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0004.jpg",image/jpeg,1200,1599,0,501061,,1667643994,1667643995202,0,0,0,0,,,,,,,,,,, +14625,1000012299,content://media/external/images/media/1000012299,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0002.jpg",image/jpeg,520,1156,0,86668,,1667640007,1667640008991,0,0,0,0,,,,,,,,,,, +14626,1000012281,content://media/external/images/media/1000012281,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0011.jpg",image/jpeg,1599,899,0,149668,,1667592080,1667592085861,0,0,0,0,,,,,,,,,,, +14627,1000012272,content://media/external/images/media/1000012272,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0010.jpg",image/jpeg,1599,899,0,235005,,1667589978,1667589979219,0,0,0,0,,,,,,,,,,, +14628,1000012270,content://media/external/images/media/1000012270,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0009.jpg",image/jpeg,720,1123,0,188237,,1667582656,1667582692938,0,0,0,0,,,,,,,,,,, +14629,1000012268,content://media/external/images/media/1000012268,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0008.jpg",image/jpeg,601,920,0,103086,,1667582129,1667582129657,0,0,0,0,,,,,,,,,,, +14630,1000012265,content://media/external/images/media/1000012265,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0007.jpg",image/jpeg,640,640,0,46445,,1667581807,1667581808078,0,0,0,0,,,,,,,,,,, +14631,1000012263,content://media/external/images/media/1000012263,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0006.jpg",image/jpeg,720,1480,0,307388,,1667581571,1667581577489,0,0,0,0,,,,,,,,,,, +14632,1000012257,content://media/external/images/media/1000012257,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0005.jpg",image/jpeg,544,541,0,30644,,1667565146,1667565146954,0,0,0,0,,,,,,,,,,, +14633,1000012254,content://media/external/images/media/1000012254,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0004.jpg",image/jpeg,921,2048,0,131607,,1667562148,1667562149301,0,0,0,0,,,,,,,,,,, +14634,1000012251,content://media/external/images/media/1000012251,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0003.jpg",image/jpeg,1080,936,0,116928,,1667551760,1667551761303,0,0,0,0,,,,,,,,,,, +14635,1000012244,content://media/external/images/media/1000012244,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0001.jpg",image/jpeg,1599,899,0,266106,,1667549158,1667549159660,0,0,0,0,,,,,,,,,,, +14636,1000012241,content://media/external/images/media/1000012241,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0000.jpg",image/jpeg,2048,1536,0,258788,,1667549053,1667549054668,0,0,0,0,,,,,,,,,,, +14637,1000012229,content://media/external/images/media/1000012229,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0005.jpg",image/jpeg,1080,1074,0,59466,,1667510364,1667510365648,0,0,0,0,,,,,,,,,,, +14638,1000012226,content://media/external/images/media/1000012226,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0004.jpg",image/jpeg,473,1024,0,58611,,1667506188,1667506189499,0,0,0,0,,,,,,,,,,, +14639,1000012223,content://media/external/images/media/1000012223,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0003.jpg",image/jpeg,995,2048,0,104082,,1667491152,1667491153551,0,0,0,0,,,,,,,,,,, +14640,1000012218,content://media/external/images/media/1000012218,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0001.jpg",image/jpeg,2016,908,0,134125,,1667486203,1667486203762,0,0,0,0,,,,,,,,,,, +14641,1000012215,content://media/external/images/media/1000012215,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0000.jpg",image/jpeg,720,1021,0,74726,,1667479579,1667479580508,0,0,0,0,,,,,,,,,,, +14642,1000012186,content://media/external/images/media/1000012186,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-02-19-34-23-959-edit_com.strava.jpg,image/jpeg,1078,1112,0,88136,,1667414063,1667414063997,0,0,0,0,,,,,,,,,,, +14643,1000012183,content://media/external/images/media/1000012183,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-02-19-33-31-938-edit_com.strava.jpg,image/jpeg,1080,1442,0,383909,,1667414012,1667414012101,0,0,0,0,,,,,,,,,,, +14644,1000012182,content://media/external/images/media/1000012182,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-02-19-33-16-551_com.strava.jpg,image/jpeg,1080,2400,0,568349,,1667413996,1667413996981,0,0,0,0,,,,,,,,,,, +14645,1000012179,content://media/external/images/media/1000012179,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221102-WA0006.jpg",image/jpeg,1132,1600,0,145761,,1667394297,1667394298829,0,0,0,0,,,,,,,,,,, +14646,1000012172,content://media/external/images/media/1000012172,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221102-WA0004.jpg",image/jpeg,1532,2048,0,207713,,1667391448,1667391449515,0,0,0,0,,,,,,,,,,, +14647,1000012169,content://media/external/images/media/1000012169,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221102-WA0003.jpg",image/jpeg,1532,2048,0,214664,,1667391448,1667391448944,0,0,0,0,,,,,,,,,,, +14648,1000012160,content://media/external/images/media/1000012160,/storage/emulated/0/DCIM/Creative/IMG_20221102_122030.jpg,image/jpeg,2048,1532,0,789564,,1667388030,1667388030936,0,0,0,0,,,,,,,,,,, +14649,1000012157,content://media/external/images/media/1000012157,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221102-WA0000.jpg",image/jpeg,1532,2048,0,280095,,1667385301,1667385302767,0,0,0,0,,,,,,,,,,, +14650,1000012138,content://media/external/images/media/1000012138,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0006.jpg",image/jpeg,720,763,0,67080,,1667323645,1667323647109,0,0,0,0,,,,,,,,,,, +14651,1000012135,content://media/external/images/media/1000012135,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0005.jpg",image/jpeg,720,960,0,67807,,1667320082,1667320082608,0,0,0,0,,,,,,,,,,, +14652,1000012132,content://media/external/images/media/1000012132,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0004.jpg",image/jpeg,899,1599,0,173027,,1667309366,1667309366945,0,0,0,0,,,,,,,,,,, +14653,1000012129,content://media/external/images/media/1000012129,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0003.jpg",image/jpeg,1600,1196,0,426940,,1667307635,1667307636190,0,0,0,0,,,,,,,,,,, +14654,1000012126,content://media/external/images/media/1000012126,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0002.jpg",image/jpeg,1600,1196,0,172133,,1667307634,1667307635596,0,0,0,0,,,,,,,,,,, +14655,1000012123,content://media/external/images/media/1000012123,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0001.jpg",image/jpeg,1600,1196,0,513101,,1667307633,1667307634967,0,0,0,0,,,,,,,,,,, +14656,1000012120,content://media/external/images/media/1000012120,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0000.jpg",image/jpeg,1496,2000,0,307353,,1667302295,1667302295758,0,0,0,0,,,,,,,,,,, +14657,1000012102,content://media/external/images/media/1000012102,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0034.jpg",image/jpeg,1200,1600,0,252162,,1667255544,1667255546848,0,0,0,0,,,,,,,,,,, +14658,1000012099,content://media/external/images/media/1000012099,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0033.jpg",image/jpeg,853,1280,0,80233,,1667254591,1667254592019,0,0,0,0,,,,,,,,,,, +14659,1000012096,content://media/external/images/media/1000012096,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0032.jpg",image/jpeg,853,1280,0,70097,,1667254576,1667254577126,0,0,0,0,,,,,,,,,,, +14660,1000012090,content://media/external/images/media/1000012090,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0030.jpg",image/jpeg,1280,853,0,82503,,1667254575,1667254576034,0,0,0,0,,,,,,,,,,, +14661,1000012093,content://media/external/images/media/1000012093,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0031.jpg",image/jpeg,853,1280,0,70283,,1667254576,1667254576557,0,0,0,0,,,,,,,,,,, +14662,1000012084,content://media/external/images/media/1000012084,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0028.jpg",image/jpeg,1280,853,0,56499,,1667254574,1667254575065,0,0,0,0,,,,,,,,,,, +14663,1000012087,content://media/external/images/media/1000012087,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0029.jpg",image/jpeg,853,1280,0,89847,,1667254575,1667254575513,0,0,0,0,,,,,,,,,,, +14664,1000012081,content://media/external/images/media/1000012081,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0027.jpg",image/jpeg,1280,853,0,55486,,1667254571,1667254574632,0,0,0,0,,,,,,,,,,, +14665,1000012078,content://media/external/images/media/1000012078,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0026.jpg",image/jpeg,853,1280,0,82369,,1667254570,1667254571383,0,0,0,0,,,,,,,,,,, +14666,1000012075,content://media/external/images/media/1000012075,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0025.jpg",image/jpeg,1280,853,0,84113,,1667254569,1667254570450,0,0,0,0,,,,,,,,,,, +14667,1000012072,content://media/external/images/media/1000012072,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0024.jpg",image/jpeg,1599,1200,0,140486,,1667252053,1667252054834,0,0,0,0,,,,,,,,,,, +14668,1000012069,content://media/external/images/media/1000012069,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0023.jpg",image/jpeg,1599,1200,0,121319,,1667252041,1667252042553,0,0,0,0,,,,,,,,,,, +14669,1000012066,content://media/external/images/media/1000012066,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20221031-WA0022.jpg",image/jpeg,2048,1536,0,375780,,1667247663,1667247664771,0,0,0,0,,,,,,,,,,, +14670,1000012057,content://media/external/images/media/1000012057,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20221031-WA0017.jpg",image/jpeg,1080,1920,0,255071,,1667245052,1667245053221,0,0,0,0,,,,,,,,,,, +14671,1000012044,content://media/external/images/media/1000012044,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-31-19-49-48-927_com.google.android.apps.maps.jpg,image/jpeg,1080,2400,0,352971,,1667242189,1667242189113,0,0,0,0,,,,,,,,,,, +14672,1000012042,content://media/external/images/media/1000012042,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0014.jpg",image/jpeg,536,1024,0,102217,,1667242181,1667242181491,0,0,0,0,,,,,,,,,,, +14673,1000012035,content://media/external/images/media/1000012035,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0012.jpg",image/jpeg,1532,2048,0,134550,,1667234560,1667234561567,0,0,0,0,,,,,,,,,,, +14674,1000012032,content://media/external/images/media/1000012032,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0011.jpg",image/jpeg,2048,1152,0,181795,,1667229848,1667229850088,0,0,0,0,,,,,,,,,,, +14675,1000012030,content://media/external/images/media/1000012030,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0010.jpg",image/jpeg,640,796,0,40998,,1667225903,1667225903405,0,0,0,0,,,,,,,,,,, +14676,1000012027,content://media/external/images/media/1000012027,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0009.jpg",image/jpeg,720,960,0,155709,,1667221887,1667221888086,0,0,0,0,,,,,,,,,,, +14677,1000012024,content://media/external/images/media/1000012024,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0008.jpg",image/jpeg,720,540,0,93802,,1667221886,1667221887507,0,0,0,0,,,,,,,,,,, +14678,1000012019,content://media/external/images/media/1000012019,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0006.jpg",image/jpeg,980,980,0,44760,,1667217691,1667217691892,0,0,0,0,,,,,,,,,,, +14679,1000012016,content://media/external/images/media/1000012016,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0005.jpg",image/jpeg,720,777,0,35126,,1667216030,1667216031328,0,0,0,0,,,,,,,,,,, +14680,1000011998,content://media/external/images/media/1000011998,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0002.jpg",image/jpeg,2048,1532,0,395992,,1667214588,1667214591051,0,0,0,0,,,,,,,,,,, +14681,1000011985,content://media/external/images/media/1000011985,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0001.jpg",image/jpeg,719,1600,0,75212,,1667200383,1667200384941,0,0,0,0,,,,,,,,,,, +14682,1000011976,content://media/external/images/media/1000011976,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0000.jpg",image/jpeg,1197,1600,0,219523,,1667175385,1667175386855,0,0,0,0,,,,,,,,,,, +14683,1000011974,content://media/external/images/media/1000011974,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0012.jpg",image/jpeg,671,960,0,56645,,1667161182,1667161183041,0,0,0,0,,,,,,,,,,, +14684,1000011967,content://media/external/images/media/1000011967,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0011.jpg",image/jpeg,719,1600,0,67441,,1667147305,1667147306722,0,0,0,0,,,,,,,,,,, +14685,1000011965,content://media/external/images/media/1000011965,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0009.jpeg",image/jpeg,3840,2160,0,1000510,,1667146761,1667146761349,1667146761232,0,0,0,,,,,,,,,,, +14686,1000011962,content://media/external/images/media/1000011962,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0008.jpg",image/jpeg,1196,1600,0,96091,,1667139903,1667139904687,0,0,0,0,,,,,,,,,,, +14687,1000011959,content://media/external/images/media/1000011959,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0007.jpg",image/jpeg,960,951,0,82996,,1667132678,1667132678746,0,0,0,0,,,,,,,,,,, +14688,1000011956,content://media/external/images/media/1000011956,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0006.jpg",image/jpeg,1296,970,0,109214,,1667132359,1667132360178,0,0,0,0,,,,,,,,,,, +14689,1000011953,content://media/external/images/media/1000011953,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0005.jpg",image/jpeg,720,709,0,81048,,1667132219,1667132220473,0,0,0,0,,,,,,,,,,, +14690,1000011936,content://media/external/images/media/1000011936,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-30-11-35-43-323_ch.publisheria.bring.jpg,image/jpeg,1080,2400,0,441019,,1667126143,1667126143784,0,0,0,0,,,,,,,,,,, +14691,1000011933,content://media/external/images/media/1000011933,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0000.jpg",image/jpeg,1530,2040,0,574503,,1667120243,1667120245000,0,0,0,0,,,,,,,,,,, +14692,1000011924,content://media/external/images/media/1000011924,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0039.jpg",image/jpeg,1600,1197,0,181781,,1667069957,1667069958011,0,0,0,0,,,,,,,,,,, +14693,1000011921,content://media/external/images/media/1000011921,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0038.jpg",image/jpeg,1600,1196,0,104722,,1667065441,1667065442252,0,0,0,0,,,,,,,,,,, +14694,1000011918,content://media/external/images/media/1000011918,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0037.jpg",image/jpeg,1312,1600,0,169461,,1667061094,1667061095782,0,0,0,0,,,,,,,,,,, +14695,1000011915,content://media/external/images/media/1000011915,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0036.jpg",image/jpeg,1080,1080,0,152863,,1667057152,1667057160481,0,0,0,0,,,,,,,,,,, +14696,1000011912,content://media/external/images/media/1000011912,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0035.jpg",image/jpeg,721,1600,0,84178,,1667056502,1667056502747,0,0,0,0,,,,,,,,,,, +14697,1000011909,content://media/external/images/media/1000011909,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0034.jpg",image/jpeg,2016,1512,0,732031,,1667056431,1667056433467,0,0,0,0,,,,,,,,,,, +14698,1000011906,content://media/external/images/media/1000011906,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0033.jpg",image/jpeg,1600,719,0,300180,,1667053457,1667053458321,0,0,0,0,,,,,,,,,,, +14699,1000011903,content://media/external/images/media/1000011903,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0032.jpg",image/jpeg,1512,2016,0,448319,,1667051358,1667051359490,0,0,0,0,,,,,,,,,,, +14700,1000011900,content://media/external/images/media/1000011900,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0031.jpg",image/jpeg,2016,1512,0,246717,,1667051318,1667051318712,0,0,0,0,,,,,,,,,,, +14701,1000011897,content://media/external/images/media/1000011897,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0030.jpg",image/jpeg,2016,1512,0,772407,,1667051289,1667051290468,0,0,0,0,,,,,,,,,,, +14702,1000011895,content://media/external/images/media/1000011895,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0029.jpg",image/jpeg,2016,954,0,414046,,1667049885,1667049885750,0,0,0,0,,,,,,,,,,, +14703,1000011892,content://media/external/images/media/1000011892,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0028.jpg",image/jpeg,2040,1530,0,809201,,1667047366,1667047367516,0,0,0,0,,,,,,,,,,, +14704,1000011889,content://media/external/images/media/1000011889,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0027.jpg",image/jpeg,1530,2040,0,475353,,1667047310,1667047366914,0,0,0,0,,,,,,,,,,, +14705,1000011886,content://media/external/images/media/1000011886,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0026.jpg",image/jpeg,2048,1536,0,315211,,1667047304,1667047310307,0,0,0,0,,,,,,,,,,, +14706,1000011880,content://media/external/images/media/1000011880,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0024.jpg",image/jpeg,2048,995,0,417868,,1667047293,1667047294249,0,0,0,0,,,,,,,,,,, +14707,1000011883,content://media/external/images/media/1000011883,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0025.jpg",image/jpeg,2048,995,0,300916,,1667047294,1667047294672,0,0,0,0,,,,,,,,,,, +14708,1000011874,content://media/external/images/media/1000011874,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0022.jpg",image/jpeg,2048,995,0,236697,,1667047292,1667047293012,0,0,0,0,,,,,,,,,,, +14709,1000011877,content://media/external/images/media/1000011877,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0023.jpg",image/jpeg,2048,995,0,435815,,1667047293,1667047293396,0,0,0,0,,,,,,,,,,, +14710,1000011868,content://media/external/images/media/1000011868,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0020.jpg",image/jpeg,2048,995,0,277750,,1667047291,1667047292131,0,0,0,0,,,,,,,,,,, +14711,1000011871,content://media/external/images/media/1000011871,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0021.jpg",image/jpeg,2048,995,0,119062,,1667047292,1667047292701,0,0,0,0,,,,,,,,,,, +14712,1000011862,content://media/external/images/media/1000011862,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0018.jpg",image/jpeg,1600,1196,0,147718,,1667039028,1667039028467,0,0,0,0,,,,,,,,,,, +14713,1000011865,content://media/external/images/media/1000011865,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0019.jpg",image/jpeg,1600,1196,0,89881,,1667039028,1667039028660,0,0,0,0,,,,,,,,,,, +14714,1000011859,content://media/external/images/media/1000011859,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0017.jpg",image/jpeg,1044,1600,0,118840,,1667037554,1667037555266,0,0,0,0,,,,,,,,,,, +14715,1000011856,content://media/external/images/media/1000011856,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0016.jpg",image/jpeg,1599,899,0,80633,,1667037248,1667037248995,0,0,0,0,,,,,,,,,,, +14716,1000011853,content://media/external/images/media/1000011853,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0015.jpg",image/jpeg,899,1599,0,152550,,1667031691,1667031696899,0,0,0,0,,,,,,,,,,, +14717,1000011850,content://media/external/images/media/1000011850,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0014.jpg",image/jpeg,2048,1536,0,366468,,1667031580,1667031581447,0,0,0,0,,,,,,,,,,, +14718,1000011847,content://media/external/images/media/1000011847,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0013.jpg",image/jpeg,1536,2048,0,335383,,1667031579,1667031580730,0,0,0,0,,,,,,,,,,, +14719,1000011823,content://media/external/images/media/1000011823,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0009.jpg",image/jpeg,1200,1600,0,226744,,1667000490,1667000491368,0,0,0,0,,,,,,,,,,, +14720,1000011813,content://media/external/images/media/1000011813,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0006.jpg",image/jpeg,2048,1536,0,409330,,1667000389,1667000390054,0,0,0,0,,,,,,,,,,, +14721,1000011816,content://media/external/images/media/1000011816,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0007.jpg",image/jpeg,2048,1536,0,427333,,1667000390,1667000390608,0,0,0,0,,,,,,,,,,, +14722,1000011810,content://media/external/images/media/1000011810,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0005.jpg",image/jpeg,2048,1536,0,411959,,1667000387,1667000388310,0,0,0,0,,,,,,,,,,, +14723,1000011803,content://media/external/images/media/1000011803,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0003.jpg",image/jpeg,2048,1536,0,417348,,1667000339,1667000340045,0,0,0,0,,,,,,,,,,, +14724,1000011797,content://media/external/images/media/1000011797,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0001.jpg",image/jpeg,2048,1536,0,404364,,1667000338,1667000339165,0,0,0,0,,,,,,,,,,, +14725,1000011800,content://media/external/images/media/1000011800,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0002.jpg",image/jpeg,2048,1536,0,504975,,1667000339,1667000339633,0,0,0,0,,,,,,,,,,, +14726,1000011791,content://media/external/images/media/1000011791,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0005.jpg",image/jpeg,711,960,0,49159,,1666974571,1666974572061,0,0,0,0,,,,,,,,,,, +14727,1000011778,content://media/external/images/media/1000011778,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0004.jpg",image/jpeg,1080,1088,0,228661,,1666959836,1666959865876,0,0,0,0,,,,,,,,,,, +14728,1000011772,content://media/external/images/media/1000011772,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0002.jpg",image/jpeg,1080,660,0,62583,,1666953579,1666953580150,0,0,0,0,,,,,,,,,,, +14729,1000011769,content://media/external/images/media/1000011769,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0001.jpg",image/jpeg,1080,1537,0,172732,,1666953458,1666953464202,0,0,0,0,,,,,,,,,,, +14730,1000011766,content://media/external/images/media/1000011766,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0000.jpg",image/jpeg,795,960,0,80977,,1666945695,1666945696591,0,0,0,0,,,,,,,,,,, +14731,1000011745,content://media/external/images/media/1000011745,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0010.jpg",image/jpeg,1024,755,0,92387,,1666891337,1666891341601,0,0,0,0,,,,,,,,,,, +14732,1000011733,content://media/external/images/media/1000011733,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0008.jpg",image/jpeg,1149,1024,0,136089,,1666881194,1666881194460,0,0,0,0,,,,,,,,,,, +14733,1000011624,content://media/external/images/media/1000011624,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0006.jpeg",image/jpeg,3840,2160,90,1565691,,1666866810,1666866810415,1666866810365,0,0,0,,,,,,,,,,, +14734,1000011622,content://media/external/images/media/1000011622,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0004.jpeg",image/jpeg,3840,2160,90,1532752,,1666866595,1666866595399,1666866595250,0,0,0,,,,,,,,,,, +14735,1000011620,content://media/external/images/media/1000011620,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0002.jpeg",image/jpeg,3840,2160,90,1931762,,1666866568,1666866568531,1666866568366,0,0,0,,,,,,,,,,, +14736,1000011617,content://media/external/images/media/1000011617,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0001.jpg",image/jpeg,1080,750,0,210382,,1666866551,1666866551200,0,0,0,0,,,,,,,,,,, +14737,1000011614,content://media/external/images/media/1000011614,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0000.jpg",image/jpeg,1536,2048,0,840141,,1666866549,1666866550827,0,0,0,0,,,,,,,,,,, +14738,1000011611,content://media/external/images/media/1000011611,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0005.jpg",image/jpeg,1600,1200,0,260654,,1666814026,1666814027507,0,0,0,0,,,,,,,,,,, +14739,1000011605,content://media/external/images/media/1000011605,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0004.jpg",image/jpeg,1156,520,0,27036,,1666801905,1666801906134,0,0,0,0,,,,,,,,,,, +14740,1000011602,content://media/external/images/media/1000011602,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0003.jpg",image/jpeg,520,1156,0,10373,,1666801763,1666801764632,0,0,0,0,,,,,,,,,,, +14741,1000011599,content://media/external/images/media/1000011599,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0002.jpg",image/jpeg,1052,473,0,11067,,1666801703,1666801703985,0,0,0,0,,,,,,,,,,, +14742,1000011596,content://media/external/images/media/1000011596,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0001.jpg",image/jpeg,1052,473,0,10570,,1666801702,1666801702828,0,0,0,0,,,,,,,,,,, +14743,1000010935,content://media/external/images/media/1000010935,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0005.jpg",image/jpeg,1131,1600,0,198155,,1666028588,1666768963079,0,0,0,0,,,,,,,,,,, +14744,1000011590,content://media/external/images/media/1000011590,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0000.jpg",image/jpeg,1536,2048,0,417661,,1666762475,1666762476327,0,0,0,0,,,,,,,,,,, +14745,1000011581,content://media/external/images/media/1000011581,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0011.jpg",image/jpeg,1156,520,0,15278,,1666725335,1666725335627,0,0,0,0,,,,,,,,,,, +14746,1000011579,content://media/external/images/media/1000011579,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-25-19-09-58-201_com.huami.watch.hmwatchmanager.jpg,image/jpeg,1080,2400,0,501246,,1666717798,1666717798487,0,0,0,0,,,,,,,,,,, +14747,1000011576,content://media/external/images/media/1000011576,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0009.jpg",image/jpeg,1200,1600,0,166705,,1666709925,1666709926493,0,0,0,0,,,,,,,,,,, +14748,1000011572,content://media/external/images/media/1000011572,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0008.jpg",image/jpeg,1600,900,0,190905,,1666694937,1666694937988,0,0,0,0,,,,,,,,,,, +14749,1000011569,content://media/external/images/media/1000011569,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0007.jpg",image/jpeg,1600,900,0,269746,,1666693680,1666693682550,0,0,0,0,,,,,,,,,,, +14750,1000011566,content://media/external/images/media/1000011566,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0006.jpg",image/jpeg,1599,1200,0,385940,,1666693370,1666693371628,0,0,0,0,,,,,,,,,,, +14751,1000011556,content://media/external/images/media/1000011556,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0003.jpg",image/jpeg,941,1600,0,158985,,1666690348,1666690349285,0,0,0,0,,,,,,,,,,, +14752,1000011559,content://media/external/images/media/1000011559,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0004.jpg",image/jpeg,899,1599,0,119902,,1666690349,1666690349638,0,0,0,0,,,,,,,,,,, +14753,1000011549,content://media/external/images/media/1000011549,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-25-09-41-21-279_com.whatsapp.jpg,image/jpeg,1080,2400,0,659666,,1666683681,1666683681698,0,0,0,0,,,,,,,,,,, +14754,1000011535,content://media/external/images/media/1000011535,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0000.jpg",image/jpeg,1080,1386,0,119690,,1666653391,1666653392176,0,0,0,0,,,,,,,,,,, +14755,1000011515,content://media/external/images/media/1000011515,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0010.jpg",image/jpeg,1504,1128,0,242199,,1666635004,1666635005307,0,0,0,0,,,,,,,,,,, +14756,1000011518,content://media/external/images/media/1000011518,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0011.jpg",image/jpeg,1504,1128,0,248861,,1666635005,1666635005993,0,0,0,0,,,,,,,,,,, +14757,1000011512,content://media/external/images/media/1000011512,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0009.jpg",image/jpeg,1504,1128,0,272820,,1666635003,1666635004549,0,0,0,0,,,,,,,,,,, +14758,1000011506,content://media/external/images/media/1000011506,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0007.jpg",image/jpeg,1504,1128,0,183907,,1666635002,1666635003139,0,0,0,0,,,,,,,,,,, +14759,1000011509,content://media/external/images/media/1000011509,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0008.jpg",image/jpeg,1600,1200,0,347362,,1666635003,1666635003938,0,0,0,0,,,,,,,,,,, +14760,1000011436,content://media/external/images/media/1000011436,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0024.jpg",image/jpeg,1500,2000,0,391439,,1666551403,1666551404742,0,0,0,0,,,,,,,,,,, +14761,1000011434,content://media/external/images/media/1000011434,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0023.jpg",image/jpeg,960,655,0,30287,,1666550711,1666550711974,0,0,0,0,,,,,,,,,,, +14762,1000011431,content://media/external/images/media/1000011431,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0022.jpg",image/jpeg,1204,1600,0,194392,,1666547665,1666547665969,0,0,0,0,,,,,,,,,,, +14763,1000011428,content://media/external/images/media/1000011428,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0021.jpg",image/jpeg,900,1600,0,132667,,1666547371,1666547372475,0,0,0,0,,,,,,,,,,, +14764,1000011425,content://media/external/images/media/1000011425,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0020.jpg",image/jpeg,1504,1128,0,221853,,1666544288,1666544289021,0,0,0,0,,,,,,,,,,, +14765,1000011401,content://media/external/images/media/1000011401,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0012.jpg",image/jpeg,970,1296,0,226610,,1666534381,1666534382192,0,0,0,0,,,,,,,,,,, +14766,1000011365,content://media/external/images/media/1000011365,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0000.jpg",image/jpeg,1600,1197,0,571791,,1666514969,1666514980047,0,0,0,0,,,,,,,,,,, +14767,1000011353,content://media/external/images/media/1000011353,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221022-WA0011.jpg",image/jpeg,1080,1339,0,127388,,1666475804,1666475823170,0,0,0,0,,,,,,,,,,, +14768,1000011278,content://media/external/images/media/1000011278,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221021-WA0003.jpg",image/jpeg,1080,1276,0,84963,,1666384328,1666384328952,0,0,0,0,,,,,,,,,,, +14769,1000011149,content://media/external/images/media/1000011149,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221021-WA0000.jpg",image/jpeg,1536,2048,0,569057,,1666348806,1666348807999,0,0,0,0,,,,,,,,,,, +14770,1000011134,content://media/external/images/media/1000011134,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0024.jpg",image/jpeg,899,1599,0,86790,,1666291415,1666291417005,0,0,0,0,,,,,,,,,,, +14771,1000011112,content://media/external/images/media/1000011112,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0019.jpg",image/jpeg,1200,1600,0,124792,,1666291035,1666291036166,0,0,0,0,,,,,,,,,,, +14772,1000011103,content://media/external/images/media/1000011103,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0017.jpg",image/jpeg,1200,1600,0,144725,,1666289660,1666289661224,0,0,0,0,,,,,,,,,,, +14773,1000011101,content://media/external/images/media/1000011101,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0016.jpg",image/jpeg,1500,2000,0,812683,,1666289279,1666289280359,0,0,0,0,,,,,,,,,,, +14774,1000011097,content://media/external/images/media/1000011097,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0014.jpg",image/jpeg,460,1024,0,35541,,1666289269,1666289279643,0,0,0,0,,,,,,,,,,, +14775,1000011099,content://media/external/images/media/1000011099,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0015.jpg",image/jpeg,200,200,0,7642,,1666289279,1666289279813,0,0,0,0,,,,,,,,,,, +14776,1000011090,content://media/external/images/media/1000011090,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0011.jpg",image/jpeg,750,989,0,115222,,1666289268,1666289268908,0,0,0,0,,,,,,,,,,, +14777,1000011041,content://media/external/images/media/1000011041,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-20-08-10-45-855_com.google.android.dialer.png,image/png,173,2274,0,14929,,1666246245,1666246246052,0,0,0,0,,,,,,,,,,, +14778,1000011023,content://media/external/images/media/1000011023,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0007.jpg",image/jpeg,1200,1600,0,98085,,1666200395,1666200397307,0,0,0,0,,,,,,,,,,, +14779,1000011020,content://media/external/images/media/1000011020,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0006.jpg",image/jpeg,1200,1600,0,110513,,1666200394,1666200395334,0,0,0,0,,,,,,,,,,, +14780,1000011018,content://media/external/images/media/1000011018,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0005.jpg",image/jpeg,1080,601,0,83243,,1666190586,1666190586529,0,0,0,0,,,,,,,,,,, +14781,1000011006,content://media/external/images/media/1000011006,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-19-08-56-18-501_com.google.android.googlequicksearchbox.jpg,image/jpeg,1080,2400,0,563831,,1666162578,1666162578981,0,0,0,0,,,,,,,,,,, +14782,1000011003,content://media/external/images/media/1000011003,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0001.jpg",image/jpeg,1080,1243,0,116417,,1666159676,1666159677124,0,0,0,0,,,,,,,,,,, +14783,1000010997,content://media/external/images/media/1000010997,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0000.jpg",image/jpeg,2048,1659,0,338387,,1666157752,1666157753691,0,0,0,0,,,,,,,,,,, +14784,1000010985,content://media/external/images/media/1000010985,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-18-19-34-52-397_com.huami.watch.hmwatchmanager.jpg,image/jpeg,1080,2400,0,493920,,1666114492,1666114492852,0,0,0,0,,,,,,,,,,, +14785,1000010948,content://media/external/images/media/1000010948,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0009.jpg",image/jpeg,899,1599,0,131117,,1666031162,1666031162773,0,0,0,0,,,,,,,,,,, +14786,1000010938,content://media/external/images/media/1000010938,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0006.jpg",image/jpeg,739,1600,0,41107,,1666029140,1666029140995,0,0,0,0,,,,,,,,,,, +14787,1000010929,content://media/external/images/media/1000010929,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0004.jpg",image/jpeg,1532,2048,0,211493,,1666017768,1666017769938,0,0,0,0,,,,,,,,,,, +14788,1000010921,content://media/external/images/media/1000010921,/storage/emulated/0/DCIM/Camera/IMG_20221017_142950.jpg,image/jpeg,4608,2592,0,5041227,,1666009793,1666009793910,1666009790669,0,0,0,,,,,,,,,,, +14789,1000010914,content://media/external/images/media/1000010914,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0003.jpg",image/jpeg,921,2048,0,116964,,1666004710,1666004710900,0,0,0,0,,,,,,,,,,, +14790,1000010912,content://media/external/images/media/1000010912,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0002.jpg",image/jpeg,576,1024,0,65284,,1665998724,1665998730213,0,0,0,0,,,,,,,,,,, +14791,1000010880,content://media/external/images/media/1000010880,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221016-WA0011.jpg",image/jpeg,852,1490,0,175719,,1665910346,1665910346943,0,0,0,0,,,,,,,,,,, +14792,1000010877,content://media/external/images/media/1000010877,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221016-WA0010.jpg",image/jpeg,1200,1600,0,157129,,1665910108,1665910109275,0,0,0,0,,,,,,,,,,, +14793,1000010810,content://media/external/images/media/1000010810,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221015-WA0000.jpg",image/jpeg,1536,2048,0,284766,,1665818225,1665818226872,0,0,0,0,,,,,,,,,,, +14794,1000010773,content://media/external/images/media/1000010773,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0038.jpg",image/jpeg,906,1600,0,97812,,1665767958,1665767974468,0,0,0,0,,,,,,,,,,, +14795,1000010772,content://media/external/images/media/1000010772,/storage/emulated/0/DCIM/Camera/20221014_190318_886.jpg,image/jpeg,2560,1440,0,2494631,,1665766999,1665766999000,0,0,0,0,,,,,,,,,,, +14796,1000010752,content://media/external/images/media/1000010752,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0024.jpg",image/jpeg,1599,899,0,50820,,1665761798,1665761799246,0,0,0,0,,,,,,,,,,, +14797,1000010749,content://media/external/images/media/1000010749,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0023.jpg",image/jpeg,1128,1504,0,377113,,1665761767,1665761768632,0,0,0,0,,,,,,,,,,, +14798,1000010740,content://media/external/images/media/1000010740,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0020.jpg",image/jpeg,1128,1504,0,243891,,1665761766,1665761767023,0,0,0,0,,,,,,,,,,, +14799,1000010743,content://media/external/images/media/1000010743,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0021.jpg",image/jpeg,1504,1128,0,275621,,1665761767,1665761767352,0,0,0,0,,,,,,,,,,, +14800,1000010746,content://media/external/images/media/1000010746,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0022.jpg",image/jpeg,1128,1504,0,181227,,1665761767,1665761767738,0,0,0,0,,,,,,,,,,, +14801,1000010737,content://media/external/images/media/1000010737,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0019.jpg",image/jpeg,1128,1504,0,386488,,1665761765,1665761766563,0,0,0,0,,,,,,,,,,, +14802,1000010734,content://media/external/images/media/1000010734,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0018.jpg",image/jpeg,1504,1128,0,360587,,1665761764,1665761765389,0,0,0,0,,,,,,,,,,, +14803,1000010729,content://media/external/images/media/1000010729,/storage/emulated/0/DCIM/Camera/IMG_20221014_153311.jpg,image/jpeg,1800,3200,0,2276965,,1665754393,1665754393042,1665754391370,0,0,0,,,,,,,,,,, +14804,1000010727,content://media/external/images/media/1000010727,/storage/emulated/0/DCIM/Camera/IMG_20221014_153246.jpg,image/jpeg,1800,3200,0,2278488,,1665754369,1665754369810,1665754366919,0,0,0,,,,,,,,,,, +14805,1000010718,content://media/external/images/media/1000010718,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-14-14-43-25-330_com.huami.watch.hmwatchmanager.jpg,image/jpeg,1080,2400,0,569264,,1665751405,1665751405644,0,0,0,0,,,,,,,,,,, +14806,1000010704,content://media/external/images/media/1000010704,/storage/emulated/0/DCIM/Camera/IMG_20221014_143622.jpg,image/jpeg,4608,2592,0,5112300,,1665750984,1665750984303,1665750982848,0,0,0,,,,,,,,,,, +14807,1000010703,content://media/external/images/media/1000010703,/storage/emulated/0/DCIM/Camera/IMG_20221014_143621.jpg,image/jpeg,4608,2592,0,5148327,,1665750983,1665750983511,1665750981761,0,0,0,,,,,,,,,,, +14808,1000010701,content://media/external/images/media/1000010701,/storage/emulated/0/DCIM/Camera/IMG_20221014_143618.jpg,image/jpeg,4608,2592,0,5073501,,1665750981,1665750981143,1665750979400,0,0,0,,,,,,,,,,, +14809,1000010697,content://media/external/images/media/1000010697,/storage/emulated/0/DCIM/Camera/IMG_20221014_140302.jpg,image/jpeg,2592,4608,0,5994257,,1665748984,1665748984768,1665748983200,0,0,0,,,,,,,,,,, +14810,1000010698,content://media/external/images/media/1000010698,/storage/emulated/0/DCIM/Camera/IMG_20221014_140303.jpg,image/jpeg,2592,4608,0,5672971,,1665748984,1665748984936,1665748983903,0,0,0,,,,,,,,,,, +14811,1000010695,content://media/external/images/media/1000010695,/storage/emulated/0/DCIM/Camera/IMG_20221014_140258.jpg,image/jpeg,2592,4608,0,5591203,,1665748981,1665748981288,1665748979210,0,0,0,,,,,,,,,,, +14812,1000010693,content://media/external/images/media/1000010693,/storage/emulated/0/DCIM/Camera/IMG_20221014_140252.jpg,image/jpeg,2592,4608,0,7207541,,1665748977,1665748977064,1665748972758,0,0,0,,,,,,,,,,, +14813,1000010688,content://media/external/images/media/1000010688,/storage/emulated/0/DCIM/Camera/IMG_20221014_130212.jpg,image/jpeg,4608,2592,0,9015380,,1665745335,1665745335688,1665745332628,0,0,0,,,,,,,,,,, +14814,1000010686,content://media/external/images/media/1000010686,/storage/emulated/0/DCIM/Camera/IMG_20221014_130156.jpg,image/jpeg,4608,2592,0,8498699,,1665745318,1665745318312,1665745316548,0,0,0,,,,,,,,,,, +14815,1000010684,content://media/external/images/media/1000010684,/storage/emulated/0/DCIM/Camera/IMG_20221014_130127.jpg,image/jpeg,2592,4608,0,7241852,,1665745291,1665745291124,1665745287792,0,0,0,,,,,,,,,,, +14816,1000010682,content://media/external/images/media/1000010682,/storage/emulated/0/DCIM/Camera/IMG_20221014_130123.jpg,image/jpeg,4608,2592,0,7853513,,1665745286,1665745286148,1665745283442,0,0,0,,,,,,,,,,, +14817,1000010680,content://media/external/images/media/1000010680,/storage/emulated/0/DCIM/Camera/IMG_20221014_125215.jpg,image/jpeg,2592,4608,0,7733087,,1665744736,1665744736907,1665744735460,0,0,0,,,,,,,,,,, +14818,1000010678,content://media/external/images/media/1000010678,/storage/emulated/0/DCIM/Camera/IMG_20221014_125211.jpg,image/jpeg,4608,2592,0,7001236,,1665744732,1665744732791,1665744731328,0,0,0,,,,,,,,,,, +14819,1000010676,content://media/external/images/media/1000010676,/storage/emulated/0/DCIM/Camera/IMG_20221014_125202.jpg,image/jpeg,4608,2592,0,7919815,,1665744723,1665744723871,1665744722565,0,0,0,,,,,,,,,,, +14820,1000010674,content://media/external/images/media/1000010674,/storage/emulated/0/DCIM/Camera/IMG_20221014_125130.jpg,image/jpeg,2592,4608,0,8731676,,1665744694,1665744694507,1665744691209,0,0,0,,,,,,,,,,, +14821,1000010669,content://media/external/images/media/1000010669,/storage/emulated/0/DCIM/Camera/IMG_20221014_121951.jpg,image/jpeg,4608,2592,0,5496419,,1665742793,1665742793758,1665742791521,0,0,0,,,,,,,,,,, +14822,1000010667,content://media/external/images/media/1000010667,/storage/emulated/0/DCIM/Camera/IMG_20221014_121822.jpg,image/jpeg,4608,2592,0,8319332,,1665742705,1665742705840,1665742702613,0,0,0,,,,,,,,,,, +14823,1000010662,content://media/external/images/media/1000010662,/storage/emulated/0/DCIM/Camera/IMG_20221014_121135.jpg,image/jpeg,3200,1800,0,3992254,,1665742300,1665742300838,1665742296560,0,0,0,,,,,,,,,,, +14824,1000010659,content://media/external/images/media/1000010659,/storage/emulated/0/DCIM/Camera/IMG_20221014_110919.jpg,image/jpeg,2592,4608,0,5368507,,1665738562,1665738562647,1665738559480,0,0,0,,,,,,,,,,, +14825,1000010657,content://media/external/images/media/1000010657,/storage/emulated/0/DCIM/Camera/IMG_20221014_110557.jpg,image/jpeg,3200,1800,0,3407197,,1665738359,1665738359355,1665738357330,0,0,0,,,,,,,,,,, +14826,1000010655,content://media/external/images/media/1000010655,/storage/emulated/0/DCIM/Camera/IMG_20221014_110549.jpg,image/jpeg,4608,2592,0,7096292,,1665738352,1665738352163,1665738349808,0,0,0,,,,,,,,,,, +14827,1000010653,content://media/external/images/media/1000010653,/storage/emulated/0/DCIM/Camera/IMG_20221014_110526.jpg,image/jpeg,4608,2592,0,6650799,,1665738328,1665738328363,1665738326458,0,0,0,,,,,,,,,,, +14828,1000010649,content://media/external/images/media/1000010649,/storage/emulated/0/DCIM/Camera/IMG_20221014_105939.jpg,image/jpeg,3200,1800,0,4109652,,1665737981,1665737981412,1665737979659,0,0,0,,,,,,,,,,, +14829,1000010647,content://media/external/images/media/1000010647,/storage/emulated/0/DCIM/Camera/IMG_20221014_105933.jpg,image/jpeg,3200,1800,0,3791151,,1665737975,1665737975076,1665737973400,0,0,0,,,,,,,,,,, +14830,1000010645,content://media/external/images/media/1000010645,/storage/emulated/0/DCIM/Camera/IMG_20221014_105930.jpg,image/jpeg,3200,1800,0,3799983,,1665737972,1665737972968,1665737971105,0,0,0,,,,,,,,,,, +14831,1000010641,content://media/external/images/media/1000010641,/storage/emulated/0/DCIM/Camera/IMG_20221014_104857.jpg,image/jpeg,4608,2592,0,7639315,,1665737338,1665737338967,1665737337575,0,0,0,,,,,,,,,,, +14832,1000010639,content://media/external/images/media/1000010639,/storage/emulated/0/DCIM/Camera/IMG_20221014_104854.jpg,image/jpeg,4608,2592,0,8392178,,1665737336,1665737336459,1665737334996,0,0,0,,,,,,,,,,, +14833,1000010637,content://media/external/images/media/1000010637,/storage/emulated/0/DCIM/Camera/IMG_20221014_104825.jpg,image/jpeg,3200,1800,0,3282143,,1665737307,1665737307243,1665737305279,0,0,0,,,,,,,,,,, +14834,1000010635,content://media/external/images/media/1000010635,/storage/emulated/0/DCIM/Camera/IMG_20221014_104819.jpg,image/jpeg,4608,2592,0,8534289,,1665737302,1665737302439,1665737299909,0,0,0,,,,,,,,,,, +14835,1000010633,content://media/external/images/media/1000010633,/storage/emulated/0/DCIM/Camera/IMG_20221014_104810.jpg,image/jpeg,4608,2592,0,8796953,,1665737291,1665737291943,1665737290479,0,0,0,,,,,,,,,,, +14836,1000010632,content://media/external/images/media/1000010632,/storage/emulated/0/DCIM/Camera/PANO_20221014_104731.jpg,image/jpeg,15792,4288,0,54543472,,1665737256,1665737257639,1665737251000,0,0,0,,,,,,,,,,, +14837,1000010631,content://media/external/images/media/1000010631,/storage/emulated/0/DCIM/Camera/PANO_20221014_104724.jpg,image/jpeg,15888,4160,0,51080844,,1665737249,1665737250143,1665737244000,0,0,0,,,,,,,,,,, +14838,1000010629,content://media/external/images/media/1000010629,/storage/emulated/0/DCIM/Camera/IMG_20221014_104613.jpg,image/jpeg,4608,2592,0,7250654,,1665737175,1665737175670,1665737173772,0,0,0,,,,,,,,,,, +14839,1000010627,content://media/external/images/media/1000010627,/storage/emulated/0/DCIM/Camera/IMG_20221014_103342.jpg,image/jpeg,3200,1800,0,3346492,,1665736423,1665736423629,1665736422313,0,0,0,,,,,,,,,,, +14840,1000010625,content://media/external/images/media/1000010625,/storage/emulated/0/DCIM/Camera/IMG_20221014_103329.jpg,image/jpeg,3200,1800,0,4323902,,1665736410,1665736410661,1665736409583,0,0,0,,,,,,,,,,, +14841,1000010623,content://media/external/images/media/1000010623,/storage/emulated/0/DCIM/Camera/IMG_20221014_103318.jpg,image/jpeg,3200,1800,0,4007257,,1665736401,1665736401173,1665736398426,0,0,0,,,,,,,,,,, +14842,1000010618,content://media/external/images/media/1000010618,/storage/emulated/0/DCIM/Camera/IMG_20221014_102657.jpg,image/jpeg,4608,2592,0,7838982,,1665736021,1665736021123,1665736017619,0,0,0,,,,,,,,,,, +14843,1000010616,content://media/external/images/media/1000010616,/storage/emulated/0/DCIM/Camera/IMG_20221014_100014.jpg,image/jpeg,4608,2592,0,5030307,,1665734417,1665734417255,1665734414768,0,0,0,,,,,,,,,,, +14844,1000010614,content://media/external/images/media/1000010614,/storage/emulated/0/DCIM/Camera/IMG_20221014_092729.jpg,image/jpeg,5120,2880,0,4641587,,1665732453,1665732453798,1665732449888,0,0,0,,,,,,,,,,, +14845,1000010602,content://media/external/images/media/1000010602,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0014.jpg",image/jpeg,921,2048,0,77415,,1665695854,1665695855413,0,0,0,0,,,,,,,,,,, +14846,1000010599,content://media/external/images/media/1000010599,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0013.jpg",image/jpeg,921,2048,0,92208,,1665684226,1665684237445,0,0,0,0,,,,,,,,,,, +14847,1000010594,content://media/external/images/media/1000010594,/storage/emulated/0/DCIM/Camera/IMG_20221013_181826.jpg,image/jpeg,4608,2592,0,5347170,,1665677911,1665677911370,1665677906907,0,0,0,,,,,,,,,,, +14848,1000010589,content://media/external/images/media/1000010589,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0010.jpg",image/jpeg,739,1600,0,86837,,1665676415,1665676416380,0,0,0,0,,,,,,,,,,, +14849,1000010581,content://media/external/images/media/1000010581,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0009.jpg",image/jpeg,1920,1080,0,212229,,1665673236,1665673237361,0,0,0,0,,,,,,,,,,, +14850,1000010564,content://media/external/images/media/1000010564,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0003.jpg",image/jpeg,833,1024,0,75736,,1665658749,1665658750125,0,0,0,0,,,,,,,,,,, +14851,1000010561,content://media/external/images/media/1000010561,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0001.jpg",image/jpeg,275,341,0,24349,,1665646243,1665646243653,0,0,0,0,,,,,,,,,,, +14852,1000010557,content://media/external/images/media/1000010557,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0000.jpg",image/jpeg,480,475,0,41474,,1665640762,1665643134433,0,0,0,0,,,,,,,,,,, +14853,1000010511,content://media/external/images/media/1000010511,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221011-WA0011.jpg",image/jpeg,1076,1178,0,77570,,1665522117,1665522122074,0,0,0,0,,,,,,,,,,, +14854,1000010508,content://media/external/images/media/1000010508,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221011-WA0010.jpg",image/jpeg,1032,1205,0,110007,,1665521865,1665521866499,0,0,0,0,,,,,,,,,,, +14855,1000010499,content://media/external/images/media/1000010499,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221011-WA0007.jpg",image/jpeg,1080,1466,0,105531,,1665516451,1665516452538,0,0,0,0,,,,,,,,,,, +14856,1000010486,content://media/external/images/media/1000010486,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-11-19-02-32-361_com.huami.watch.hmwatchmanager.jpg,image/jpeg,1080,2400,0,492394,,1665507752,1665507752830,0,0,0,0,,,,,,,,,,, +14857,1000010476,content://media/external/images/media/1000010476,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221011-WA0001.jpg",image/jpeg,921,2048,0,163198,,1665473052,1665473053717,0,0,0,0,,,,,,,,,,, +14858,1000010461,content://media/external/images/media/1000010461,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221010-WA0006.jpg",image/jpeg,1425,1021,0,147840,,1665407665,1665407665380,0,0,0,0,,,,,,,,,,, +14859,1000010455,content://media/external/images/media/1000010455,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221010-WA0004.jpg",image/jpeg,1536,2048,0,321995,,1665399558,1665399559418,0,0,0,0,,,,,,,,,,, +14860,1000010445,content://media/external/images/media/1000010445,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221010-WA0002.jpg",image/jpeg,2048,1536,0,586720,,1665388756,1665388757377,0,0,0,0,,,,,,,,,,, +14861,1000010436,content://media/external/images/media/1000010436,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221010-WA0000.jpg",image/jpeg,1599,899,0,130127,,1665382825,1665382826415,0,0,0,0,,,,,,,,,,, +14862,1000010420,content://media/external/images/media/1000010420,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0010.jpg",image/jpeg,719,1600,0,188568,,1665327306,1665327307500,0,0,0,0,,,,,,,,,,, +14863,1000010417,content://media/external/images/media/1000010417,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0009.jpg",image/jpeg,1478,732,0,220723,,1665327305,1665327306868,0,0,0,0,,,,,,,,,,, +14864,1000010411,content://media/external/images/media/1000010411,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0008.jpg",image/jpeg,1200,1600,0,215023,,1665313866,1665313873604,0,0,0,0,,,,,,,,,,, +14865,1000010408,content://media/external/images/media/1000010408,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0007.jpg",image/jpeg,1600,1200,0,172153,,1665313866,1665313866698,0,0,0,0,,,,,,,,,,, +14866,1000010405,content://media/external/images/media/1000010405,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0006.jpg",image/jpeg,1200,1600,0,274459,,1665313581,1665313582377,0,0,0,0,,,,,,,,,,, +14867,1000010402,content://media/external/images/media/1000010402,/storage/emulated/0/DCIM/Camera/IMG_20221009_112237.jpg,image/jpeg,4608,2592,0,5683776,,1665307362,1665307362422,1665307357686,0,0,0,,,,,,,,,,, +14868,1000010401,content://media/external/images/media/1000010401,/storage/emulated/0/DCIM/Camera/IMG_20221009_112234.jpg,image/jpeg,4608,2592,0,6031061,,1665307358,1665307358202,1665307354520,0,0,0,,,,,,,,,,, +14869,1000010398,content://media/external/images/media/1000010398,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0005.jpg",image/jpeg,2048,1532,0,273463,,1665304403,1665304404722,0,0,0,0,,,,,,,,,,, +14870,1000010395,content://media/external/images/media/1000010395,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0004.jpg",image/jpeg,1532,2048,0,279739,,1665304402,1665304403390,0,0,0,0,,,,,,,,,,, +14871,1000010394,content://media/external/images/media/1000010394,/storage/emulated/0/DCIM/Camera/PANO_20221009_101926.jpg,image/jpeg,8336,4320,0,23919625,,1665303574,1665303575183,1665303566000,0,0,0,,,,,,,,,,, +14872,1000010393,content://media/external/images/media/1000010393,/storage/emulated/0/DCIM/Camera/PANO_20221009_101911.jpg,image/jpeg,6576,4352,0,19122500,,1665303556,1665303557523,1665303551000,0,0,0,,,,,,,,,,, +14873,1000010392,content://media/external/images/media/1000010392,/storage/emulated/0/DCIM/Camera/PANO_20221009_101906.jpg,image/jpeg,3440,4288,0,10393651,,1665303549,1665303549963,1665303546000,0,0,0,,,,,,,,,,, +14874,1000010391,content://media/external/images/media/1000010391,/storage/emulated/0/DCIM/Camera/PANO_20221009_101853.jpg,image/jpeg,7888,4128,0,22719276,,1665303539,1665303541179,1665303533000,0,0,0,,,,,,,,,,, +14875,1000010360,content://media/external/images/media/1000010360,/storage/emulated/0/DCIM/Camera/IMG_20221008_204414.jpg,image/jpeg,1800,3200,0,2841528,,1665254656,1665254656843,1665254655335,0,0,0,,,,,,,,,,, +14876,1000010358,content://media/external/images/media/1000010358,/storage/emulated/0/DCIM/Camera/IMG_20221008_204317.jpg,image/jpeg,2592,4608,0,5280985,,1665254599,1665254599071,1665254597333,0,0,0,,,,,,,,,,, +14877,1000010356,content://media/external/images/media/1000010356,/storage/emulated/0/DCIM/Camera/IMG_20221008_204131.jpg,image/jpeg,2592,4608,0,5544662,,1665254492,1665254492871,1665254491374,0,0,0,,,,,,,,,,, +14878,1000010354,content://media/external/images/media/1000010354,/storage/emulated/0/DCIM/Camera/IMG_20221008_204125.jpg,image/jpeg,1800,3200,0,3302384,,1665254487,1665254487271,1665254485600,0,0,0,,,,,,,,,,, +14879,1000010352,content://media/external/images/media/1000010352,/storage/emulated/0/DCIM/Camera/IMG_20221008_204025.jpg,image/jpeg,3200,1800,0,2439147,,1665254426,1665254426511,1665254425172,0,0,0,,,,,,,,,,, +14880,1000010350,content://media/external/images/media/1000010350,/storage/emulated/0/DCIM/Camera/IMG_20221008_204015.jpg,image/jpeg,4608,2592,0,9509937,,1665254418,1665254418399,1665254415984,0,0,0,,,,,,,,,,, +14881,1000010348,content://media/external/images/media/1000010348,/storage/emulated/0/DCIM/Camera/IMG_20221008_204010.jpg,image/jpeg,2592,4608,0,8624280,,1665254414,1665254414055,1665254410315,0,0,0,,,,,,,,,,, +14882,1000010347,content://media/external/images/media/1000010347,/storage/emulated/0/DCIM/Camera/PANO_20221008_203915.jpg,image/jpeg,7696,4256,0,19277752,,1665254360,1665254360827,1665254355000,0,0,0,,,,,,,,,,, +14883,1000010345,content://media/external/images/media/1000010345,/storage/emulated/0/DCIM/Camera/IMG_20221008_203809.jpg,image/jpeg,3200,1800,0,2006093,,1665254291,1665254291351,1665254290650,0,0,0,,,,,,,,,,, +14884,1000010343,content://media/external/images/media/1000010343,/storage/emulated/0/DCIM/Camera/IMG_20221008_203755.jpg,image/jpeg,4608,2592,0,5716400,,1665254277,1665254277479,1665254275832,0,0,0,,,,,,,,,,, +14885,1000010341,content://media/external/images/media/1000010341,/storage/emulated/0/DCIM/Camera/IMG_20221008_203714.jpg,image/jpeg,2592,4608,0,4670429,,1665254236,1665254236391,1665254235340,0,0,0,,,,,,,,,,, +14886,1000010339,content://media/external/images/media/1000010339,/storage/emulated/0/DCIM/Camera/IMG_20221008_203713.jpg,image/jpeg,2592,4608,0,4529002,,1665254234,1665254234951,1665254233333,0,0,0,,,,,,,,,,, +14887,1000010337,content://media/external/images/media/1000010337,/storage/emulated/0/DCIM/Camera/IMG_20221008_203618.jpg,image/jpeg,2592,4608,0,5425679,,1665254183,1665254183059,1665254178853,0,0,0,,,,,,,,,,, +14888,1000010335,content://media/external/images/media/1000010335,/storage/emulated/0/DCIM/Camera/IMG_20221008_203302.jpg,image/jpeg,4608,2592,0,4731923,,1665253983,1665253983603,1665253982260,0,0,0,,,,,,,,,,, +14889,1000010333,content://media/external/images/media/1000010333,/storage/emulated/0/DCIM/Camera/IMG_20221008_203257.jpg,image/jpeg,2592,4608,0,4993631,,1665253979,1665253979183,1665253977727,0,0,0,,,,,,,,,,, +14890,1000010331,content://media/external/images/media/1000010331,/storage/emulated/0/DCIM/Camera/IMG_20221008_203156.jpg,image/jpeg,2592,4608,0,4823709,,1665253918,1665253918095,1665253916615,0,0,0,,,,,,,,,,, +14891,1000010329,content://media/external/images/media/1000010329,/storage/emulated/0/DCIM/Camera/IMG_20221008_203132.jpg,image/jpeg,2592,4608,0,4350676,,1665253895,1665253895615,1665253893279,0,0,0,,,,,,,,,,, +14892,1000010327,content://media/external/images/media/1000010327,/storage/emulated/0/DCIM/Camera/IMG_20221008_203129.jpg,image/jpeg,2592,4608,0,3778635,,1665253893,1665253893067,1665253889724,0,0,0,,,,,,,,,,, +14893,1000010325,content://media/external/images/media/1000010325,/storage/emulated/0/DCIM/Camera/IMG_20221008_202948.jpg,image/jpeg,1800,3200,0,2359176,,1665253789,1665253789787,1665253788435,0,0,0,,,,,,,,,,, +14894,1000010323,content://media/external/images/media/1000010323,/storage/emulated/0/DCIM/Camera/IMG_20221008_202935.jpg,image/jpeg,3200,1800,0,3019439,,1665253777,1665253777011,1665253775567,0,0,0,,,,,,,,,,, +14895,1000010321,content://media/external/images/media/1000010321,/storage/emulated/0/DCIM/Camera/IMG_20221008_202923.jpg,image/jpeg,3200,1800,0,2859899,,1665253765,1665253765427,1665253764710,0,0,0,,,,,,,,,,, +14896,1000010319,content://media/external/images/media/1000010319,/storage/emulated/0/DCIM/Camera/IMG_20221008_202904.jpg,image/jpeg,3200,1800,0,2681628,,1665253746,1665253746391,1665253744975,0,0,0,,,,,,,,,,, +14897,1000010317,content://media/external/images/media/1000010317,/storage/emulated/0/DCIM/Camera/IMG_20221008_202859.jpg,image/jpeg,3200,1800,0,2563967,,1665253741,1665253741679,1665253739671,0,0,0,,,,,,,,,,, +14898,1000010311,content://media/external/images/media/1000010311,/storage/emulated/0/DCIM/Camera/IMG_20221008_202835.jpg,image/jpeg,4608,2592,0,5413290,,1665253717,1665253717171,1665253715502,0,0,0,,,,,,,,,,, +14899,1000010309,content://media/external/images/media/1000010309,/storage/emulated/0/DCIM/Camera/IMG_20221008_201745.jpg,image/jpeg,2592,4608,0,5095913,,1665253067,1665253067270,1665253065830,0,0,0,,,,,,,,,,, +14900,1000010307,content://media/external/images/media/1000010307,/storage/emulated/0/DCIM/Camera/IMG_20221008_201714.jpg,image/jpeg,4608,2592,0,4756363,,1665253036,1665253036526,1665253035148,0,0,0,,,,,,,,,,, +14901,1000010305,content://media/external/images/media/1000010305,/storage/emulated/0/DCIM/Camera/IMG_20221008_201708.jpg,image/jpeg,2592,4608,0,4608058,,1665253029,1665253029966,1665253028485,0,0,0,,,,,,,,,,, +14902,1000010303,content://media/external/images/media/1000010303,/storage/emulated/0/DCIM/Camera/IMG_20221008_201705.jpg,image/jpeg,2592,4608,0,4611229,,1665253028,1665253028234,1665253026151,0,0,0,,,,,,,,,,, +14903,1000010301,content://media/external/images/media/1000010301,/storage/emulated/0/DCIM/Camera/IMG_20221008_200409.jpg,image/jpeg,2592,4608,0,4247381,,1665252251,1665252251291,1665252249627,0,0,0,,,,,,,,,,, +14904,1000010299,content://media/external/images/media/1000010299,/storage/emulated/0/DCIM/Camera/IMG_20221008_200340.jpg,image/jpeg,2592,4608,0,3018916,,1665252224,1665252224267,1665252220992,0,0,0,,,,,,,,,,, +14905,1000010297,content://media/external/images/media/1000010297,/storage/emulated/0/DCIM/Camera/IMG_20221008_200335.jpg,image/jpeg,2592,4608,0,4396971,,1665252220,1665252220231,1665252216400,0,0,0,,,,,,,,,,, +14906,1000010295,content://media/external/images/media/1000010295,/storage/emulated/0/DCIM/Camera/IMG_20221008_195219.jpg,image/jpeg,2592,4608,0,3274287,,1665251543,1665251543405,1665251539710,0,0,0,,,,,,,,,,, +14907,1000010293,content://media/external/images/media/1000010293,/storage/emulated/0/DCIM/Camera/IMG_20221008_194336.jpg,image/jpeg,2592,4608,0,5088470,,1665251018,1665251018254,1665251016347,0,0,0,,,,,,,,,,, +14908,1000010291,content://media/external/images/media/1000010291,/storage/emulated/0/DCIM/Camera/IMG_20221008_193448.jpg,image/jpeg,2592,4608,0,3536028,,1665250490,1665250490149,1665250488530,0,0,0,,,,,,,,,,, +14909,1000010289,content://media/external/images/media/1000010289,/storage/emulated/0/DCIM/Camera/IMG_20221008_193412.jpg,image/jpeg,2592,4608,0,3908486,,1665250454,1665250454625,1665250453830,0,0,0,,,,,,,,,,, +14910,1000010287,content://media/external/images/media/1000010287,/storage/emulated/0/DCIM/Camera/IMG_20221008_193327.jpg,image/jpeg,2592,4608,0,3992791,,1665250409,1665250409437,1665250407795,0,0,0,,,,,,,,,,, +14911,1000010285,content://media/external/images/media/1000010285,/storage/emulated/0/DCIM/Camera/IMG_20221008_193248.jpg,image/jpeg,2592,4608,0,4012753,,1665250370,1665250370793,1665250369720,0,0,0,,,,,,,,,,, +14912,1000010283,content://media/external/images/media/1000010283,/storage/emulated/0/DCIM/Camera/IMG_20221008_193211.jpg,image/jpeg,2592,4608,0,4230246,,1665250333,1665250333309,1665250331424,0,0,0,,,,,,,,,,, +14913,1000010281,content://media/external/images/media/1000010281,/storage/emulated/0/DCIM/Camera/IMG_20221008_192319.jpg,image/jpeg,1729,2901,0,1497896,,1665249800,1665249800235,1665249691239,0,0,0,,,,,,,,,,, +14914,1000010280,content://media/external/images/media/1000010280,/storage/emulated/0/DCIM/Camera/IMG_20221008_192237.jpg,image/jpeg,2199,3592,0,2562035,,1665249758,1665249758655,1665249691239,0,0,0,,,,,,,,,,, +14915,1000010278,content://media/external/images/media/1000010278,/storage/emulated/0/DCIM/Camera/IMG_20221008_192131.jpg,image/jpeg,2592,4608,0,4106871,,1665249692,1665249692835,1665249691239,0,0,0,,,,,,,,,,, +14916,1000010276,content://media/external/images/media/1000010276,/storage/emulated/0/DCIM/Camera/IMG_20221008_192057.jpg,image/jpeg,2592,4608,0,4223553,,1665249659,1665249659447,1665249657649,0,0,0,,,,,,,,,,, +14917,1000010274,content://media/external/images/media/1000010274,/storage/emulated/0/DCIM/Camera/IMG_20221008_192003.jpg,image/jpeg,2592,4608,0,3892155,,1665249606,1665249606199,1665249603872,0,0,0,,,,,,,,,,, +14918,1000010269,content://media/external/images/media/1000010269,/storage/emulated/0/DCIM/Camera/IMG_20221008_191711.jpg,image/jpeg,2592,4608,0,3885607,,1665249433,1665249433483,1665249431975,0,0,0,,,,,,,,,,, +14919,1000010267,content://media/external/images/media/1000010267,/storage/emulated/0/DCIM/Camera/IMG_20221008_191658.jpg,image/jpeg,4608,2592,0,4491017,,1665249420,1665249421007,1665249418704,0,0,0,,,,,,,,,,, +14920,1000010265,content://media/external/images/media/1000010265,/storage/emulated/0/DCIM/Camera/IMG_20221008_191652.jpg,image/jpeg,4608,2592,0,4222165,,1665249416,1665249416227,1665249412857,0,0,0,,,,,,,,,,, +14921,1000010263,content://media/external/images/media/1000010263,/storage/emulated/0/DCIM/Camera/IMG_20221008_191543.jpg,image/jpeg,2592,4608,0,4165301,,1665249346,1665249346755,1665249344394,0,0,0,,,,,,,,,,, +14922,1000010261,content://media/external/images/media/1000010261,/storage/emulated/0/DCIM/Camera/IMG_20221008_191538.jpg,image/jpeg,2592,4608,0,3523978,,1665249342,1665249342387,1665249338978,0,0,0,,,,,,,,,,, +14923,1000010259,content://media/external/images/media/1000010259,/storage/emulated/0/DCIM/Camera/IMG_20221008_191416.jpg,image/jpeg,2592,4608,0,4280896,,1665249259,1665249259455,1665249257790,0,0,0,,,,,,,,,,, +14924,1000010257,content://media/external/images/media/1000010257,/storage/emulated/0/DCIM/Camera/IMG_20221008_191412.jpg,image/jpeg,2592,4608,0,4201873,,1665249255,1665249255059,1665249252815,0,0,0,,,,,,,,,,, +14925,1000010255,content://media/external/images/media/1000010255,/storage/emulated/0/DCIM/Camera/IMG_20221008_191407.jpg,image/jpeg,2592,4608,0,4204177,,1665249251,1665249251839,1665249248150,0,0,0,,,,,,,,,,, +14926,1000010245,content://media/external/images/media/1000010245,/storage/emulated/0/DCIM/Camera/PANO_20221008_191123.jpg,image/jpeg,8272,4192,0,20403174,,1665249091,1665249092394,1665249083000,0,0,0,,,,,,,,,,, +14927,1000010243,content://media/external/images/media/1000010243,/storage/emulated/0/DCIM/Camera/IMG_20221008_191116.jpg,image/jpeg,1800,3200,0,2751081,,1665249078,1665249078818,1665249076716,0,0,0,,,,,,,,,,, +14928,1000010241,content://media/external/images/media/1000010241,/storage/emulated/0/DCIM/Camera/IMG_20221008_160833.jpg,image/jpeg,2592,4608,0,4051464,,1665238116,1665238116666,1665238114125,0,0,0,,,,,,,,,,, +14929,1000010238,content://media/external/images/media/1000010238,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0010.jpg",image/jpeg,1532,2048,0,369058,,1665238108,1665238110247,0,0,0,0,,,,,,,,,,, +14930,1000010235,content://media/external/images/media/1000010235,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0009.jpg",image/jpeg,1532,2048,0,176945,,1665238106,1665238107527,0,0,0,0,,,,,,,,,,, +14931,1000010232,content://media/external/images/media/1000010232,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0008.jpg",image/jpeg,2048,1532,0,526280,,1665237458,1665237459670,0,0,0,0,,,,,,,,,,, +14932,1000010230,content://media/external/images/media/1000010230,/storage/emulated/0/DCIM/Camera/IMG_20221008_155523.jpg,image/jpeg,4608,2592,0,6112795,,1665237325,1665237325394,1665237323762,0,0,0,,,,,,,,,,, +14933,1000010228,content://media/external/images/media/1000010228,/storage/emulated/0/DCIM/Camera/IMG_20221008_155519.jpg,image/jpeg,4608,2592,0,6296161,,1665237320,1665237320894,1665237319370,0,0,0,,,,,,,,,,, +14934,1000010226,content://media/external/images/media/1000010226,/storage/emulated/0/DCIM/Camera/IMG_20221008_155511.jpg,image/jpeg,4608,2592,0,6236860,,1665237313,1665237313946,1665237311409,0,0,0,,,,,,,,,,, +14935,1000010223,content://media/external/images/media/1000010223,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0007.jpg",image/jpeg,1920,1080,0,350591,,1665237207,1665237208647,0,0,0,0,,,,,,,,,,, +14936,1000010221,content://media/external/images/media/1000010221,/storage/emulated/0/DCIM/Camera/IMG_20221008_155322.jpg,image/jpeg,4608,2592,0,6317875,,1665237204,1665237204811,1665237202990,0,0,0,,,,,,,,,,, +14937,1000010219,content://media/external/images/media/1000010219,/storage/emulated/0/DCIM/Camera/IMG_20221008_155312.jpg,image/jpeg,2592,4608,0,5861661,,1665237194,1665237194415,1665237192623,0,0,0,,,,,,,,,,, +14938,1000010217,content://media/external/images/media/1000010217,/storage/emulated/0/DCIM/Camera/IMG_20221008_155305.jpg,image/jpeg,4608,2592,0,7353049,,1665237189,1665237189479,1665237185699,0,0,0,,,,,,,,,,, +14939,1000010215,content://media/external/images/media/1000010215,/storage/emulated/0/DCIM/Camera/IMG_20221008_155301.jpg,image/jpeg,4608,2592,0,5982422,,1665237182,1665237182959,1665237181168,0,0,0,,,,,,,,,,, +14940,1000010213,content://media/external/images/media/1000010213,/storage/emulated/0/DCIM/Camera/IMG_20221008_155255.jpg,image/jpeg,2592,4608,0,5339159,,1665237180,1665237180127,1665237175965,0,0,0,,,,,,,,,,, +14941,1000010211,content://media/external/images/media/1000010211,/storage/emulated/0/DCIM/Camera/IMG_20221008_155247.jpg,image/jpeg,4608,2592,0,6250172,,1665237171,1665237171447,1665237168198,0,0,0,,,,,,,,,,, +14942,1000010206,content://media/external/images/media/1000010206,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0005.jpg",image/jpeg,2048,1532,0,398864,,1665237045,1665237046158,0,0,0,0,,,,,,,,,,, +14943,1000010203,content://media/external/images/media/1000010203,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0004.jpg",image/jpeg,2048,1532,0,494789,,1665237044,1665237045515,0,0,0,0,,,,,,,,,,, +14944,1000010199,content://media/external/images/media/1000010199,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0003.jpg",image/jpeg,1532,2048,0,411206,,1665236987,1665237043411,0,0,0,0,,,,,,,,,,, +14945,1000010197,content://media/external/images/media/1000010197,/storage/emulated/0/DCIM/Camera/IMG_20221008_154706.jpg,image/jpeg,4608,2592,0,5899107,,1665236828,1665236828278,1665236827120,0,0,0,,,,,,,,,,, +14946,1000010195,content://media/external/images/media/1000010195,/storage/emulated/0/DCIM/Camera/IMG_20221008_154653.jpg,image/jpeg,4608,2592,0,5671143,,1665236814,1665236814826,1665236813284,0,0,0,,,,,,,,,,, +14947,1000010193,content://media/external/images/media/1000010193,/storage/emulated/0/DCIM/Camera/IMG_20221008_154639.jpg,image/jpeg,2592,4608,0,5999929,,1665236801,1665236801778,1665236799558,0,0,0,,,,,,,,,,, +14948,1000010191,content://media/external/images/media/1000010191,/storage/emulated/0/DCIM/Camera/IMG_20221008_154441.jpg,image/jpeg,2592,4608,0,5657323,,1665236683,1665236683350,1665236681485,0,0,0,,,,,,,,,,, +14949,1000010189,content://media/external/images/media/1000010189,/storage/emulated/0/DCIM/Camera/IMG_20221008_154435.jpg,image/jpeg,2592,4608,0,5209120,,1665236676,1665236676818,1665236675228,0,0,0,,,,,,,,,,, +14950,1000010187,content://media/external/images/media/1000010187,/storage/emulated/0/DCIM/Camera/IMG_20221008_154206.jpg,image/jpeg,1800,3200,0,2028241,,1665236527,1665236528043,1665236526267,0,0,0,,,,,,,,,,, +14951,1000010185,content://media/external/images/media/1000010185,/storage/emulated/0/DCIM/Camera/IMG_20221008_154153.jpg,image/jpeg,4608,2592,0,5328501,,1665236515,1665236515563,1665236513552,0,0,0,,,,,,,,,,, +14952,1000010183,content://media/external/images/media/1000010183,/storage/emulated/0/DCIM/Camera/IMG_20221008_154148.jpg,image/jpeg,4608,2592,0,5160276,,1665236509,1665236509967,1665236508368,0,0,0,,,,,,,,,,, +14953,1000010181,content://media/external/images/media/1000010181,/storage/emulated/0/DCIM/Camera/IMG_20221008_153923.jpg,image/jpeg,3200,1800,0,2702002,,1665236365,1665236365982,1665236364128,0,0,0,,,,,,,,,,, +14954,1000010179,content://media/external/images/media/1000010179,/storage/emulated/0/DCIM/Camera/IMG_20221008_153909.jpg,image/jpeg,1800,3200,0,2749495,,1665236352,1665236352046,1665236349450,0,0,0,,,,,,,,,,, +14955,1000010176,content://media/external/images/media/1000010176,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0002.jpg",image/jpeg,900,1600,0,135673,,1665235776,1665235777453,0,0,0,0,,,,,,,,,,, +14956,1000010175,content://media/external/images/media/1000010175,/storage/emulated/0/DCIM/Camera/PANO_20221008_131252.jpg,image/jpeg,10928,4320,0,32047394,,1665227578,1665227579376,1665227572000,0,0,0,,,,,,,,,,, +14957,1000010120,content://media/external/images/media/1000010120,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221007-WA0020.jpg",image/jpeg,514,478,0,60693,,1665138688,1665138688149,0,0,0,0,,,,,,,,,,, +14958,1000010105,content://media/external/images/media/1000010105,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-07-09-54-14-402_com.android.vending.jpg,image/jpeg,1080,2400,0,178005,,1665129254,1665129254824,0,0,0,0,,,,,,,,,,, +14959,1000010103,content://media/external/images/media/1000010103,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221007-WA0018.jpeg",image/jpeg,3840,2160,0,2459004,,1665124961,1665124961394,1665124961300,0,0,0,,,,,,,,,,, +14960,1000010042,content://media/external/images/media/1000010042,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0029.jpg",image/jpeg,921,2048,0,127925,,1665085686,1665085687494,0,0,0,0,,,,,,,,,,, +14961,1000009982,content://media/external/images/media/1000009982,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0014.jpg",image/jpeg,1152,2048,0,248156,,1665051036,1665051036532,0,0,0,0,,,,,,,,,,, +14962,1000009980,content://media/external/images/media/1000009980,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0013.jpg",image/jpeg,1152,2048,0,289449,,1665051035,1665051035981,0,0,0,0,,,,,,,,,,, +14963,1000009977,content://media/external/images/media/1000009977,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0012.jpg",image/jpeg,654,810,0,43233,,1665050727,1665050728441,0,0,0,0,,,,,,,,,,, +14964,1000009975,content://media/external/images/media/1000009975,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0011.jpg",image/jpeg,449,248,0,27930,,1665049972,1665049973091,0,0,0,0,,,,,,,,,,, +14965,1000009973,content://media/external/images/media/1000009973,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0010.jpg",image/jpeg,591,114,0,23126,,1665049371,1665049371467,0,0,0,0,,,,,,,,,,, +14966,1000009971,content://media/external/images/media/1000009971,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-06-11-11-59-972_com.lynxspa.prontotreno.jpg,image/jpeg,1080,9356,0,1659044,,1665047520,1665047543595,0,0,0,0,,,,,,,,,,, +14967,1000009969,content://media/external/images/media/1000009969,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-06-11-03-46-449_com.lynxspa.prontotreno.jpg,image/jpeg,1080,4772,0,848520,,1665047026,1665047036736,0,0,0,0,,,,,,,,,,, +14968,1000009954,content://media/external/images/media/1000009954,"/storage/emulated/0/Download/Picture (Device Independent Bitmap) 1.jpg",image/jpeg,1311,770,0,81639,,1665038913,1665038913489,0,0,0,0,,,,,,,,,,, +14969,1000009955,content://media/external/images/media/1000009955,"/storage/emulated/0/Download/Picture (Device Independent Bitmap) 2.jpg",image/jpeg,1538,1175,0,135065,,1665038913,1665038913493,0,0,0,0,,,,,,,,,,, +14970,1000009951,content://media/external/images/media/1000009951,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0004.jpg",image/jpeg,921,2048,0,135969,,1665038543,1665038544303,0,0,0,0,,,,,,,,,,, +14971,1000009948,content://media/external/images/media/1000009948,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0003.jpg",image/jpeg,921,2048,0,127590,,1665038542,1665038543478,0,0,0,0,,,,,,,,,,, +14972,1000009945,content://media/external/images/media/1000009945,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0002.jpg",image/jpeg,921,2048,0,142264,,1665038541,1665038542466,0,0,0,0,,,,,,,,,,, +14973,1000009944,content://media/external/images/media/1000009944,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0001.jpg",image/jpeg,1131,1600,0,266992,,1665036737,1665036737462,0,0,0,0,,,,,,,,,,, +14974,1000009930,content://media/external/images/media/1000009930,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0009.jpg",image/jpeg,847,1600,0,95397,,1664991426,1664991426832,0,0,0,0,,,,,,,,,,, +14975,1000009924,content://media/external/images/media/1000009924,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0008.jpg",image/jpeg,720,1600,0,89888,,1664988371,1664988372245,0,0,0,0,,,,,,,,,,, +14976,1000009921,content://media/external/images/media/1000009921,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0007.jpg",image/jpeg,1080,1477,0,102122,,1664988370,1664988371681,0,0,0,0,,,,,,,,,,, +14977,1000009902,content://media/external/images/media/1000009902,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0002.jpg",image/jpeg,662,1024,0,35462,,1664964127,1664964128097,0,0,0,0,,,,,,,,,,, +14978,1000009905,content://media/external/images/media/1000009905,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0003.jpg",image/jpeg,662,1024,0,39160,,1664964128,1664964128457,0,0,0,0,,,,,,,,,,, +14979,1000009901,content://media/external/images/media/1000009901,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-05-08-54-25-024_com.google.android.documentsui.jpg,image/jpeg,1080,2400,0,260649,,1664952865,1664952865069,0,0,0,0,,,,,,,,,,, +14980,1000009900,content://media/external/images/media/1000009900,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-05-08-54-16-223_com.google.android.documentsui.jpg,image/jpeg,1080,2400,0,260972,,1664952856,1664952856277,0,0,0,0,,,,,,,,,,, +14981,1000009899,content://media/external/images/media/1000009899,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-05-08-54-07-339_com.google.android.documentsui.jpg,image/jpeg,1080,2400,0,258878,,1664952847,1664952847809,0,0,0,0,,,,,,,,,,, +14982,1000009898,content://media/external/images/media/1000009898,/storage/emulated/0/Pictures/insta360_official_weixin_1664952669207.jpg,image/jpeg,528,528,0,50380,,1664952669,1664952669288,0,0,0,0,,,,,,,,,,, +14983,1000009895,content://media/external/images/media/1000009895,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0001.jpg",image/jpeg,1024,966,0,83686,,1664948570,1664948606616,0,0,0,0,,,,,,,,,,, +14984,1000009892,content://media/external/images/media/1000009892,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0000.jpg",image/jpeg,2000,1500,0,401118,,1664948531,1664948532040,0,0,0,0,,,,,,,,,,, +14985,1000009884,content://media/external/images/media/1000009884,/storage/emulated/0/DCIM/Camera/IMG_20221004_183638.jpg,image/jpeg,4608,2592,0,5370143,,1664901402,1664901402213,1664901399124,0,0,0,,,,,,,,,,, +14986,1000009882,content://media/external/images/media/1000009882,/storage/emulated/0/DCIM/Camera/IMG_20221004_183543.jpg,image/jpeg,2592,4608,0,3647530,,1664901347,1664901348081,1664901343580,0,0,0,,,,,,,,,,, +14987,1000009880,content://media/external/images/media/1000009880,/storage/emulated/0/DCIM/Camera/IMG_20221004_181307.jpg,image/jpeg,4608,2592,0,5640745,,1664899992,1664899992279,1664899987914,0,0,0,,,,,,,,,,, +14988,1000009877,content://media/external/images/media/1000009877,/storage/emulated/0/DCIM/Camera/IMG_20221004_172920.jpg,image/jpeg,2592,4608,0,6587792,,1664897364,1664897364821,1664897360508,0,0,0,,,,,,,,,,, +14989,1000009857,content://media/external/images/media/1000009857,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221003-WA0007.jpg",image/jpeg,210,238,0,10679,,1664829803,1664829803461,0,0,0,0,,,,,,,,,,, +14990,1000009854,content://media/external/images/media/1000009854,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221003-WA0006.jpg",image/jpeg,720,838,0,64635,,1664822639,1664822640090,0,0,0,0,,,,,,,,,,, +14991,1000009852,content://media/external/images/media/1000009852,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-03-20-13-15-048_com.huami.watch.hmwatchmanager.jpg,image/jpeg,1080,2400,0,484880,,1664820795,1664820795530,0,0,0,0,,,,,,,,,,, +14992,1000009849,content://media/external/images/media/1000009849,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221003-WA0004.jpg",image/jpeg,1072,1511,0,97068,,1664817868,1664817869904,0,0,0,0,,,,,,,,,,, +14993,1000009812,content://media/external/images/media/1000009812,/storage/emulated/0/DCIM/Camera/IMG_20221002_185655.jpg,image/jpeg,4608,2592,0,2977988,,1664729820,1664729820519,1664729815600,0,0,0,,,,,,,,,,, +14994,1000009794,content://media/external/images/media/1000009794,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221002-WA0004.jpg",image/jpeg,959,1024,0,49210,,1664703256,1664703257435,0,0,0,0,,,,,,,,,,, +14995,1000009791,content://media/external/images/media/1000009791,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221002-WA0003.jpg",image/jpeg,1600,1200,0,110618,,1664698284,1664698284903,0,0,0,0,,,,,,,,,,, +14996,1000009788,content://media/external/images/media/1000009788,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221002-WA0002.jpg",image/jpeg,1600,1200,0,242222,,1664698259,1664698260032,0,0,0,0,,,,,,,,,,, +14997,1000009782,content://media/external/images/media/1000009782,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221002-WA0000.jpg",image/jpeg,1200,1600,0,179055,,1664698191,1664698192481,0,0,0,0,,,,,,,,,,, +14998,1000009767,content://media/external/images/media/1000009767,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0068.jpg",image/jpeg,1080,829,0,160826,,1664659537,1664659538057,0,0,0,0,,,,,,,,,,, +14999,1000009770,content://media/external/images/media/1000009770,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0069.jpg",image/jpeg,1080,1325,0,147737,,1664659538,1664659538690,0,0,0,0,,,,,,,,,,, +15000,1000009773,content://media/external/images/media/1000009773,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0070.jpg",image/jpeg,1080,1089,0,268733,,1664659538,1664659538974,0,0,0,0,,,,,,,,,,, +15001,1000009761,content://media/external/images/media/1000009761,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0066.jpg",image/jpeg,1600,1329,0,243546,,1664659536,1664659537467,0,0,0,0,,,,,,,,,,, +15002,1000009764,content://media/external/images/media/1000009764,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0067.jpg",image/jpeg,1080,1364,0,272951,,1664659537,1664659537769,0,0,0,0,,,,,,,,,,, +15003,1000009755,content://media/external/images/media/1000009755,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0064.jpg",image/jpeg,1600,1200,0,236824,,1664659536,1664659536278,0,0,0,0,,,,,,,,,,, +15004,1000009758,content://media/external/images/media/1000009758,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0065.jpg",image/jpeg,1600,1438,0,478915,,1664659536,1664659536874,0,0,0,0,,,,,,,,,,, +15005,1000009743,content://media/external/images/media/1000009743,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0060.jpg",image/jpeg,1200,1600,0,420024,,1664659534,1664659535169,0,0,0,0,,,,,,,,,,, +15006,1000009746,content://media/external/images/media/1000009746,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0061.jpg",image/jpeg,1600,1200,0,284401,,1664659535,1664659535342,0,0,0,0,,,,,,,,,,, +15007,1000009749,content://media/external/images/media/1000009749,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0062.jpg",image/jpeg,1600,1200,0,210447,,1664659535,1664659535556,0,0,0,0,,,,,,,,,,, +15008,1000009752,content://media/external/images/media/1000009752,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0063.jpg",image/jpeg,1200,1600,0,389056,,1664659535,1664659535874,0,0,0,0,,,,,,,,,,, +15009,1000009737,content://media/external/images/media/1000009737,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0058.jpg",image/jpeg,1600,1200,0,316428,,1664659534,1664659534489,0,0,0,0,,,,,,,,,,, +15010,1000009740,content://media/external/images/media/1000009740,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0059.jpg",image/jpeg,1200,1600,0,434185,,1664659534,1664659534818,0,0,0,0,,,,,,,,,,, +15011,1000009734,content://media/external/images/media/1000009734,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0057.jpg",image/jpeg,1600,1200,0,264811,,1664659462,1664659462468,0,0,0,0,,,,,,,,,,, +15012,1000009731,content://media/external/images/media/1000009731,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0056.jpg",image/jpeg,783,1024,0,77365,,1664648908,1664648908580,0,0,0,0,,,,,,,,,,, +15013,1000009722,content://media/external/images/media/1000009722,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0053.jpg",image/jpeg,1600,1200,0,246075,,1664646770,1664646771062,0,0,0,0,,,,,,,,,,, +15014,1000009725,content://media/external/images/media/1000009725,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0054.jpg",image/jpeg,1600,1200,0,231572,,1664646771,1664646771462,0,0,0,0,,,,,,,,,,, +15015,1000009719,content://media/external/images/media/1000009719,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0052.jpg",image/jpeg,1600,1200,0,218017,,1664646769,1664646770061,0,0,0,0,,,,,,,,,,, +15016,1000009716,content://media/external/images/media/1000009716,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0051.jpg",image/jpeg,1600,1200,0,234747,,1664646768,1664646769256,0,0,0,0,,,,,,,,,,, +15017,1000009708,content://media/external/images/media/1000009708,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0048.jpg",image/jpeg,2016,1134,0,438720,,1664644072,1664644073146,0,0,0,0,,,,,,,,,,, +15018,1000009711,content://media/external/images/media/1000009711,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0049.jpg",image/jpeg,2016,1134,0,383405,,1664644073,1664644073929,0,0,0,0,,,,,,,,,,, +15019,1000009705,content://media/external/images/media/1000009705,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0047.jpg",image/jpeg,1824,1368,0,260396,,1664644071,1664644072134,0,0,0,0,,,,,,,,,,, +15020,1000009699,content://media/external/images/media/1000009699,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0045.jpg",image/jpeg,1824,1368,0,262108,,1664644070,1664644071098,0,0,0,0,,,,,,,,,,, +15021,1000009702,content://media/external/images/media/1000009702,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0046.jpg",image/jpeg,1824,1368,0,242647,,1664644071,1664644071837,0,0,0,0,,,,,,,,,,, +15022,1000009690,content://media/external/images/media/1000009690,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0042.jpg",image/jpeg,1824,1368,0,247516,,1664644069,1664644070079,0,0,0,0,,,,,,,,,,, +15023,1000009693,content://media/external/images/media/1000009693,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0043.jpg",image/jpeg,1824,1368,0,252444,,1664644070,1664644070352,0,0,0,0,,,,,,,,,,, +15024,1000009696,content://media/external/images/media/1000009696,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0044.jpg",image/jpeg,1824,1368,0,244386,,1664644070,1664644070662,0,0,0,0,,,,,,,,,,, +15025,1000009684,content://media/external/images/media/1000009684,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0040.jpg",image/jpeg,2016,1134,0,421078,,1664644068,1664644069017,0,0,0,0,,,,,,,,,,, +15026,1000009687,content://media/external/images/media/1000009687,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0041.jpg",image/jpeg,2016,1134,0,433683,,1664644069,1664644069462,0,0,0,0,,,,,,,,,,, +15027,1000009681,content://media/external/images/media/1000009681,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0039.jpg",image/jpeg,2016,1134,0,353885,,1664644067,1664644068095,0,0,0,0,,,,,,,,,,, +15028,1000009645,content://media/external/images/media/1000009645,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0027.jpg",image/jpeg,1600,900,0,168552,,1664625240,1664625241130,0,0,0,0,,,,,,,,,,, +15029,1000009648,content://media/external/images/media/1000009648,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0028.jpg",image/jpeg,1600,900,0,85472,,1664625241,1664625241384,0,0,0,0,,,,,,,,,,, +15030,1000009641,content://media/external/images/media/1000009641,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-01-12-26-43-727_com.arashivision.insta360akiko.jpg,image/jpeg,1080,2400,0,501747,,1664620004,1664620004078,0,0,0,0,,,,,,,,,,, +15031,1000009611,content://media/external/images/media/1000009611,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0017.jpg",image/jpeg,1536,2048,0,714656,,1664614638,1664614639721,0,0,0,0,,,,,,,,,,, +15032,1000009608,content://media/external/images/media/1000009608,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0016.jpg",image/jpeg,1536,2048,0,607050,,1664614632,1664614633365,0,0,0,0,,,,,,,,,,, +15033,1000009607,content://media/external/images/media/1000009607,/storage/emulated/0/DCIM/Camera/PANO_20221001_101019.jpg,image/jpeg,8400,4192,0,33795058,,1664611824,1664611824859,1664611819000,0,0,0,,,,,,,,,,, +15034,1000009606,content://media/external/images/media/1000009606,/storage/emulated/0/DCIM/Camera/PANO_20221001_100903.jpg,image/jpeg,9552,3936,0,31636657,,1664611748,1664611749397,1664611743000,0,0,0,,,,,,,,,,, +15035,1000009605,content://media/external/images/media/1000009605,/storage/emulated/0/DCIM/Camera/PANO_20221001_100853.jpg,image/jpeg,11792,4032,0,35559963,,1664611738,1664611739161,1664611733000,0,0,0,,,,,,,,,,, +15036,1000009594,content://media/external/images/media/1000009594,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0013.jpg",image/jpeg,1536,2048,0,379911,,1664609338,1664609339124,0,0,0,0,,,,,,,,,,, +15037,1000009562,content://media/external/images/media/1000009562,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0002.jpg",image/jpeg,1080,1116,0,136557,,1664605022,1664605023301,0,0,0,0,,,,,,,,,,, +15038,1000009545,content://media/external/images/media/1000009545,/storage/emulated/0/Pictures/insta360_official_weixin_1664566464837.jpg,image/jpeg,528,528,0,50380,,1664566464,1664566464927,0,0,0,0,,,,,,,,,,, +15039,1000009543,content://media/external/images/media/1000009543,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220930-WA0004.jpg",image/jpeg,768,1024,0,67825,,1664563474,1664563474875,0,0,0,0,,,,,,,,,,, +15040,1000009510,content://media/external/images/media/1000009510,/storage/emulated/0/DCIM/Camera/IMG_20220930_143931.jpg,image/jpeg,4608,2592,0,4430993,,1664541573,1664541573944,1664541571808,0,0,0,,,,,,,,,,, +15041,1000009508,content://media/external/images/media/1000009508,/storage/emulated/0/DCIM/Camera/IMG_20220930_143901.jpg,image/jpeg,4608,2592,0,5380389,,1664541542,1664541542636,1664541541670,0,0,0,,,,,,,,,,, +15042,1000009506,content://media/external/images/media/1000009506,/storage/emulated/0/DCIM/Camera/IMG_20220930_143827.jpg,image/jpeg,4608,2592,0,5488287,,1664541509,1664541509124,1664541507507,0,0,0,,,,,,,,,,, +15043,1000009504,content://media/external/images/media/1000009504,/storage/emulated/0/DCIM/Camera/IMG_20220930_143821.jpg,image/jpeg,4608,2592,0,6007507,,1664541503,1664541503532,1664541501912,0,0,0,,,,,,,,,,, +15044,1000009502,content://media/external/images/media/1000009502,/storage/emulated/0/DCIM/Camera/IMG_20220930_143817.jpg,image/jpeg,4608,2592,0,5581139,,1664541499,1664541499628,1664541497730,0,0,0,,,,,,,,,,, +15045,1000009500,content://media/external/images/media/1000009500,/storage/emulated/0/DCIM/Camera/IMG_20220930_143734.jpg,image/jpeg,4608,2592,0,5484543,,1664541457,1664541457384,1664541454937,0,0,0,,,,,,,,,,, +15046,1000009498,content://media/external/images/media/1000009498,/storage/emulated/0/DCIM/Camera/IMG_20220930_134548.jpg,image/jpeg,3032,1098,0,2369868,,1664538350,1664538350650,1664538350338,0,0,0,,,,,,,,,,, +15047,1000009493,content://media/external/images/media/1000009493,/storage/emulated/0/DCIM/Camera/IMG_20220930_083842.jpg,image/jpeg,4261,840,0,998424,,1664519923,1664519923177,1664519901754,0,0,0,,,,,,,,,,, +15048,1000009491,content://media/external/images/media/1000009491,/storage/emulated/0/DCIM/Camera/IMG_20220930_083819.jpg,image/jpeg,840,4262,0,2693023,,1664519902,1664519902289,1664519901754,0,0,0,,,,,,,,,,, +15049,1000009466,content://media/external/images/media/1000009466,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220929-WA0009.jpg",image/jpeg,1532,2048,0,314555,,1664472299,1664472300385,0,0,0,0,,,,,,,,,,, +15050,1000009463,content://media/external/images/media/1000009463,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220929-WA0008.jpg",image/jpeg,1532,2048,0,301806,,1664472296,1664472299841,0,0,0,0,,,,,,,,,,, +15051,1000009442,content://media/external/images/media/1000009442,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-29-12-12-45-830_com.google.android.googlequicksearchbox.jpg,image/jpeg,1080,2400,0,420409,,1664446365,1664446365994,0,0,0,0,,,,,,,,,,, +15052,1000009154,content://media/external/images/media/1000009154,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0012.jpg",image/jpeg,719,1600,0,77173,,1664372957,1664372958143,0,0,0,0,,,,,,,,,,, +15053,1000009152,content://media/external/images/media/1000009152,/storage/emulated/0/DCIM/Creative/IMG_20220928_144848.jpg,image/jpeg,738,1175,0,180214,,1664369328,1664369328892,0,0,0,0,,,,,,,,,,, +15054,1000009149,content://media/external/images/media/1000009149,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220928-WA0010.jpg",image/jpeg,738,1600,0,76333,,1664365170,1664365171314,0,0,0,0,,,,,,,,,,, +15055,1000009143,content://media/external/images/media/1000009143,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0008.jpg",image/jpeg,1080,847,0,54745,,1664357181,1664357182108,0,0,0,0,,,,,,,,,,, +15056,1000009140,content://media/external/images/media/1000009140,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0007.jpg",image/jpeg,921,2048,0,81893,,1664354981,1664354982154,0,0,0,0,,,,,,,,,,, +15057,1000009137,content://media/external/images/media/1000009137,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0006.jpg",image/jpeg,921,2048,0,66433,,1664352885,1664352886152,0,0,0,0,,,,,,,,,,, +15058,1000009134,content://media/external/images/media/1000009134,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0005.jpg",image/jpeg,921,2048,0,150835,,1664352412,1664352412860,0,0,0,0,,,,,,,,,,, +15059,1000009131,content://media/external/images/media/1000009131,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0004.jpg",image/jpeg,2048,1532,0,379628,,1664352267,1664352267703,0,0,0,0,,,,,,,,,,, +15060,1000009128,content://media/external/images/media/1000009128,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0003.jpg",image/jpeg,1920,1080,0,208529,,1664352036,1664352036306,0,0,0,0,,,,,,,,,,, +15061,1000009125,content://media/external/images/media/1000009125,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0002.jpg",image/jpeg,1920,1080,0,103926,,1664351995,1664351995957,0,0,0,0,,,,,,,,,,, +15062,1000009120,content://media/external/images/media/1000009120,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-28-07-44-59-635_it.caitalia.apphub.jpg,image/jpeg,1080,2400,0,325443,,1664343899,1664343899961,0,0,0,0,,,,,,,,,,, +15063,1000009101,content://media/external/images/media/1000009101,/storage/emulated/0/DCIM/Camera/IMG_20220927_192915.jpg,image/jpeg,4608,2592,0,4234171,,1664299760,1664299760685,1664299755870,0,0,0,,,,,,,,,,, +15064,1000009096,content://media/external/images/media/1000009096,/storage/emulated/0/DCIM/Camera/IMG_20220927_181947.jpg,image/jpeg,2592,4608,0,3641456,,1664295595,1664295595130,1664295588198,0,0,0,,,,,,,,,,, +15065,1000009094,content://media/external/images/media/1000009094,/storage/emulated/0/DCIM/Camera/IMG_20220927_171852.jpg,image/jpeg,4608,2592,0,5155139,,1664291933,1664291933593,1664291916484,0,0,0,,,,,,,,,,, +15066,1000009092,content://media/external/images/media/1000009092,/storage/emulated/0/DCIM/Camera/IMG_20220927_171836.jpg,image/jpeg,2592,4608,0,5699962,,1664291919,1664291919081,1664291916484,0,0,0,,,,,,,,,,, +15067,1000009090,content://media/external/images/media/1000009090,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220927-WA0016.jpeg",image/jpeg,3840,2160,90,1243555,,1664291870,1664291870025,1664291869960,0,0,0,,,,,,,,,,, +15068,1000009088,content://media/external/images/media/1000009088,/storage/emulated/0/DCIM/Camera/IMG_20220927_171601.jpg,image/jpeg,4608,2592,0,4054676,,1664291761,1664291761858,1664291737298,0,0,0,,,,,,,,,,, +15069,1000009086,content://media/external/images/media/1000009086,/storage/emulated/0/DCIM/Camera/IMG_20220927_171537.jpg,image/jpeg,2592,4608,0,4502724,,1664291742,1664291742922,1664291737298,0,0,0,,,,,,,,,,, +15070,1000009084,content://media/external/images/media/1000009084,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-27-15-35-12-729_com.brytonsport.active.jpg,image/jpeg,1080,2400,0,485155,,1664285713,1664285713198,0,0,0,0,,,,,,,,,,, +15071,1000009080,content://media/external/images/media/1000009080,/storage/emulated/0/DCIM/Camera/PANO_20220927_144303.jpg,image/jpeg,7120,4224,0,24200909,,1664282588,1664282589304,1664282583000,0,0,0,,,,,,,,,,, +15072,1000009077,content://media/external/images/media/1000009077,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220927-WA0011.jpg",image/jpeg,410,721,0,44345,,1664281414,1664281415931,0,0,0,0,,,,,,,,,,, +15073,1000009074,content://media/external/images/media/1000009074,/storage/emulated/0/DCIM/Camera/IMG_20220927_141228.jpg,image/jpeg,2592,4608,0,4973876,,1664280750,1664280750982,1664280748517,0,0,0,,,,,,,,,,, +15074,1000009072,content://media/external/images/media/1000009072,/storage/emulated/0/DCIM/Camera/IMG_20220927_141150.jpg,image/jpeg,4608,2592,0,6503266,,1664280716,1664280716298,1664280710591,0,0,0,,,,,,,,,,, +15075,1000009067,content://media/external/images/media/1000009067,/storage/emulated/0/DCIM/Camera/IMG_20220927_133832.jpg,image/jpeg,3200,1800,0,2728258,,1664278716,1664278716407,1664278712601,0,0,0,,,,,,,,,,, +15076,1000009065,content://media/external/images/media/1000009065,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220927-WA0005.jpeg",image/jpeg,3840,2160,90,1005669,,1664278071,1664278071447,1664278071356,0,0,0,,,,,,,,,,, +15077,1000009063,content://media/external/images/media/1000009063,/storage/emulated/0/DCIM/Camera/PANO_20220927_132514.jpg,image/jpeg,9808,4192,0,27465059,,1664277919,1664277920339,1664277914000,0,0,0,,,,,,,,,,, +15078,1000009062,content://media/external/images/media/1000009062,/storage/emulated/0/DCIM/Camera/PANO_20220927_132214.jpg,image/jpeg,12656,3904,0,36401975,,1664277740,1664277742178,1664277734000,0,0,0,,,,,,,,,,, +15079,1000009061,content://media/external/images/media/1000009061,/storage/emulated/0/DCIM/Camera/PANO_20220927_132209.jpg,image/jpeg,5360,4352,0,17571362,,1664277733,1664277733682,1664277729000,0,0,0,,,,,,,,,,, +15080,1000009060,content://media/external/images/media/1000009060,/storage/emulated/0/DCIM/Camera/PANO_20220927_132158.jpg,image/jpeg,8048,4320,0,26208576,,1664277723,1664277724154,1664277718000,0,0,0,,,,,,,,,,, +15081,1000009048,content://media/external/images/media/1000009048,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220927-WA0000.jpg",image/jpeg,948,559,0,147855,,1664264887,1664264887856,0,0,0,0,,,,,,,,,,, +15082,1000009035,content://media/external/images/media/1000009035,/storage/emulated/0/DCIM/Camera/1664202377932.jpg,image/jpeg,3840,2160,0,4245459,,1664202378,1664202378000,0,0,0,0,,,,,,,,,,, +15083,1000009030,content://media/external/images/media/1000009030,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220926-WA0004.jpg",image/jpeg,1080,683,0,64305,,1664194371,1664194372468,0,0,0,0,,,,,,,,,,, +15084,1000009026,content://media/external/images/media/1000009026,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-26-12-38-14-676_com.mi.globalbrowser.jpg,image/jpeg,1080,2400,0,390750,,1664188694,1664188695044,0,0,0,0,,,,,,,,,,, +15085,1000009025,content://media/external/images/media/1000009025,/storage/emulated/0/DCIM/Camera/IMG_20220926_120403.jpg,image/jpeg,4608,2592,0,4886532,,1664186643,1664186643828,1664088953912,0,0,0,,,,,,,,,,, +15086,1000009024,content://media/external/images/media/1000009024,/storage/emulated/0/DCIM/Camera/IMG_20220926_120030.jpg,image/jpeg,1250,889,0,380741,,1664186431,1664186431193,1663782713270,0,0,0,,,,,,,,,,, +15087,1000009005,content://media/external/images/media/1000009005,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0012.jpg",image/jpeg,1080,1315,0,81483,,1664137294,1664137296477,0,0,0,0,,,,,,,,,,, +15088,1000008974,content://media/external/images/media/1000008974,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0007.jpg",image/jpeg,2048,1532,0,251491,,1664102106,1664102107846,0,0,0,0,,,,,,,,,,, +15089,1000008965,content://media/external/images/media/1000008965,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0004.jpg",image/jpeg,921,2048,0,207449,,1664100472,1664100473924,0,0,0,0,,,,,,,,,,, +15090,1000008956,content://media/external/images/media/1000008956,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0002.jpg",image/jpeg,579,960,0,59433,,1664093512,1664093512917,0,0,0,0,,,,,,,,,,, +15091,1000008953,content://media/external/images/media/1000008953,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0001.jpg",image/jpeg,921,2048,0,154388,,1664092943,1664092944656,0,0,0,0,,,,,,,,,,, +15092,1000008947,content://media/external/images/media/1000008947,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0000.jpg",image/jpeg,921,2048,0,86718,,1664091787,1664091788481,0,0,0,0,,,,,,,,,,, +15093,1000008945,content://media/external/images/media/1000008945,/storage/emulated/0/DCIM/Camera/IMG_20220925_085624.jpg,image/jpeg,2592,4608,0,4338691,,1664088987,1664088987787,1664088985340,0,0,0,,,,,,,,,,, +15094,1000008941,content://media/external/images/media/1000008941,/storage/emulated/0/DCIM/Camera/IMG_20220925_085404.jpg,image/jpeg,4608,2592,0,4448429,,1664088850,1664088851838,1664088844575,0,0,0,,,,,,,,,,, +15095,1000008939,content://media/external/images/media/1000008939,/storage/emulated/0/DCIM/Camera/IMG_20220925_084757.jpg,image/jpeg,4608,2592,0,4416218,,1664088481,1664088481770,1664088478910,0,0,0,,,,,,,,,,, +15096,1000008926,content://media/external/images/media/1000008926,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220924-WA0008.jpg",image/jpeg,570,805,0,49819,,1664044698,1664044700035,0,0,0,0,,,,,,,,,,, +15097,1000008902,content://media/external/images/media/1000008902,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220924-WA0002.jpg",image/jpeg,828,1792,0,109586,,1664003872,1664003873040,0,0,0,0,,,,,,,,,,, +15098,1000008899,content://media/external/images/media/1000008899,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220924-WA0001.jpg",image/jpeg,899,1599,0,144474,,1664003190,1664003191439,0,0,0,0,,,,,,,,,,, +15099,1000008896,content://media/external/images/media/1000008896,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220924-WA0000.jpg",image/jpeg,899,1599,0,148439,,1664003110,1664003110905,0,0,0,0,,,,,,,,,,, +15100,1000008877,content://media/external/images/media/1000008877,/storage/emulated/0/DCIM/Camera/IMG_20220923_193005.jpg,image/jpeg,3200,1800,0,2215028,,1663954207,1663954207409,1663954205593,0,0,0,,,,,,,,,,, +15101,1000008875,content://media/external/images/media/1000008875,/storage/emulated/0/DCIM/Camera/IMG_20220923_192959.jpg,image/jpeg,3200,1800,0,2673939,,1663954203,1663954203101,1663954200302,0,0,0,,,,,,,,,,, +15102,1000008873,content://media/external/images/media/1000008873,/storage/emulated/0/DCIM/Camera/IMG_20220923_192922.jpg,image/jpeg,4608,2592,0,5066184,,1663954166,1663954166161,1663954162787,0,0,0,,,,,,,,,,, +15103,1000008871,content://media/external/images/media/1000008871,/storage/emulated/0/DCIM/Camera/IMG_20220923_192914.jpg,image/jpeg,4608,2592,0,5855215,,1663954156,1663954156589,1663954154347,0,0,0,,,,,,,,,,, +15104,1000008869,content://media/external/images/media/1000008869,/storage/emulated/0/DCIM/Camera/IMG_20220923_192854.jpg,image/jpeg,4608,2592,0,5140011,,1663954138,1663954138141,1663954135140,0,0,0,,,,,,,,,,, +15105,1000008867,content://media/external/images/media/1000008867,/storage/emulated/0/DCIM/Camera/IMG_20220923_192833.jpg,image/jpeg,4608,2592,0,4350257,,1663954119,1663954119069,1663954114150,0,0,0,,,,,,,,,,, +15106,1000008719,content://media/external/images/media/1000008719,/storage/emulated/0/DCIM/Camera/IMG_20220921_195153.jpg,image/jpeg,2592,4608,0,1697726,,1663782714,1663782714925,1663782713270,0,0,0,,,,,,,,,,, +15107,1000008673,content://media/external/images/media/1000008673,/storage/emulated/0/DCIM/Camera/IMG_20220920_184315.jpg,image/jpeg,4608,2592,0,3459940,,1663692196,1663692196343,1663692158117,0,0,0,,,,,,,,,,, +15108,1000008541,content://media/external/images/media/1000008541,/storage/emulated/0/Pictures/my_stickers_images/IMG_20220919_095303.jpg,image/jpeg,512,512,0,64947,,1663573983,1663573983890,0,0,0,0,,,,,,,,,,, +15109,1000000201,content://media/external/images/media/1000000201,/storage/emulated/0/Pictures/my_stickers_images/sp_ayjluwu_z1663526402.webp,image/webp,512,512,0,47438,,1663526402,1663526402660,0,0,0,0,,,,,,,,,,, +15110,1000000197,content://media/external/images/media/1000000197,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220918-WA0020.jpg",image/jpeg,2048,1532,0,306946,,1663526338,1663526339430,0,0,0,0,,,,,,,,,,, +15111,64548,content://media/external/images/media/64548,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0011.jpg",image/jpeg,2048,1532,0,341822,,1659297624,1663526338375,0,0,0,0,,,,,,,,,,, +15112,1000000195,content://media/external/images/media/1000000195,/storage/emulated/0/Pictures/my_stickers_images/sp_arnhqri_z1663526310.webp,image/webp,512,512,0,46416,,1663526310,1663526310392,0,0,0,0,,,,,,,,,,, +15113,1000000194,content://media/external/images/media/1000000194,/storage/emulated/0/DCIM/Creative/IMG_20220918_203704.jpg,image/jpeg,495,472,0,89127,,1663526224,1663526224552,0,0,0,0,,,,,,,,,,, +15114,1000000191,content://media/external/images/media/1000000191,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220918-WA0018.jpg",image/jpeg,921,2048,0,174006,,1663526146,1663526146736,0,0,0,0,,,,,,,,,,, +15115,1000000189,content://media/external/images/media/1000000189,/storage/emulated/0/Pictures/my_stickers_images/sp_arspfti_z1663525312.webp,image/webp,512,512,0,45596,,1663525312,1663525312520,0,0,0,0,,,,,,,,,,, +15116,1000000162,content://media/external/images/media/1000000162,/storage/emulated/0/DCIM/Camera/IMG_20220918_160816.jpg,image/jpeg,4608,2592,0,4927543,,1663510099,1663510099212,1663510096325,0,0,0,,,,,,,,,,, +15117,1000000161,content://media/external/images/media/1000000161,/storage/emulated/0/DCIM/Camera/IMG_20220918_160814.jpg,image/jpeg,4608,2592,0,5176101,,1663510098,1663510098920,1663510094906,0,0,0,,,,,,,,,,, +15118,1000000160,content://media/external/images/media/1000000160,/storage/emulated/0/DCIM/Creative/IMG_20220918_160520.jpg,image/jpeg,2048,1324,0,1213807,,1663509920,1663509920740,0,0,0,0,,,,,,,,,,, +15119,1000000151,content://media/external/images/media/1000000151,/storage/emulated/0/DCIM/Camera/IMG_20220918_150916.jpg,image/jpeg,2592,4608,0,4800705,,1663506559,1663506559468,1663506556660,0,0,0,,,,,,,,,,, +15120,1000000149,content://media/external/images/media/1000000149,/storage/emulated/0/DCIM/Camera/IMG_20220918_150912.jpg,image/jpeg,2592,4608,0,5406584,,1663506555,1663506555500,1663506552241,0,0,0,,,,,,,,,,, +15121,1000000133,content://media/external/images/media/1000000133,/storage/emulated/0/DCIM/Camera/IMG_20220918_112703.jpg,image/jpeg,2592,4608,0,10030007,,1663493227,1663493227422,1663493224198,0,0,0,,,,,,,,,,, +15122,1000000131,content://media/external/images/media/1000000131,/storage/emulated/0/DCIM/Camera/IMG_20220918_112701.jpg,image/jpeg,2592,4608,0,9993662,,1663493224,1663493224098,1663493221297,0,0,0,,,,,,,,,,, +15123,1000000129,content://media/external/images/media/1000000129,/storage/emulated/0/DCIM/Camera/IMG_20220918_112642.jpg,image/jpeg,2592,4608,0,9864863,,1663493208,1663493208298,1663493203271,0,0,0,,,,,,,,,,, +15124,1000000021,content://media/external/images/media/1000000021,/storage/emulated/0/DCIM/Camera/IMG_20220917_094537.jpg,image/jpeg,2529,1599,0,2565544,,1663400739,1663400739792,1663400739372,0,0,0,,,,,,,,,,, +15125,1000000019,content://media/external/images/media/1000000019,/storage/emulated/0/DCIM/Camera/IMG_20220917_094530.jpg,image/jpeg,2037,1276,0,2170806,,1663400733,1663400733212,1663400732789,0,0,0,,,,,,,,,,, +15126,68711,content://media/external/images/media/68711,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220913-WA0012.jpg",image/jpeg,1024,768,0,218150,,1663067351,1663067352563,0,0,0,0,,,,,,,,,,, +15127,68714,content://media/external/images/media/68714,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220913-WA0013.jpg",image/jpeg,709,1024,0,79512,,1663067352,1663067352983,0,0,0,0,,,,,,,,,,, +15128,68708,content://media/external/images/media/68708,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220913-WA0011.jpg",image/jpeg,888,1024,0,180261,,1663067351,1663067351865,0,0,0,0,,,,,,,,,,, +15129,68688,content://media/external/images/media/68688,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-13-11-51-53-713_com.strava.jpg,image/jpeg,1080,2400,0,796082,,1663062713,1663062713868,0,0,0,0,,,,,,,,,,, +15130,68685,content://media/external/images/media/68685,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220913-WA0003.jpg",image/jpeg,1080,1480,0,139136,,1663062339,1663062340190,0,0,0,0,,,,,,,,,,, +15131,68682,content://media/external/images/media/68682,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-13-11-42-37-357_com.strava.jpg,image/jpeg,1080,2400,0,801076,,1663062157,1663062157772,0,0,0,0,,,,,,,,,,, +15132,68555,content://media/external/images/media/68555,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0059.jpg",image/jpeg,1052,473,0,34200,,1662893317,1662893317777,0,0,0,0,,,,,,,,,,, +15133,68551,content://media/external/images/media/68551,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0057.jpg",image/jpeg,1052,473,0,33888,,1662893315,1662893315528,0,0,0,0,,,,,,,,,,, +15134,68547,content://media/external/images/media/68547,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0055.jpg",image/jpeg,1156,520,0,38713,,1662893311,1662893311141,0,0,0,0,,,,,,,,,,, +15135,68543,content://media/external/images/media/68543,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0053.jpg",image/jpeg,1280,333,0,25140,,1662893309,1662893309869,0,0,0,0,,,,,,,,,,, +15136,68506,content://media/external/images/media/68506,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0041.jpg",image/jpeg,520,1156,0,76818,,1662887910,1662887911267,0,0,0,0,,,,,,,,,,, +15137,68509,content://media/external/images/media/68509,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0042.jpg",image/jpeg,520,1156,0,100458,,1662887911,1662887911567,0,0,0,0,,,,,,,,,,, +15138,68503,content://media/external/images/media/68503,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0040.jpg",image/jpeg,520,1156,0,54004,,1662887910,1662887910781,0,0,0,0,,,,,,,,,,, +15139,68500,content://media/external/images/media/68500,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0039.jpg",image/jpeg,1600,1200,0,370481,,1662887702,1662887703351,0,0,0,0,,,,,,,,,,, +15140,68492,content://media/external/images/media/68492,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0035.jpg",image/jpeg,1280,720,0,84200,,1662887560,1662887561064,0,0,0,0,,,,,,,,,,, +15141,68496,content://media/external/images/media/68496,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0037.jpg",image/jpeg,1280,720,0,68858,,1662887561,1662887561945,0,0,0,0,,,,,,,,,,, +15142,68484,content://media/external/images/media/68484,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0031.jpg",image/jpeg,1280,720,0,96462,,1662887554,1662887555138,0,0,0,0,,,,,,,,,,, +15143,68488,content://media/external/images/media/68488,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0033.jpg",image/jpeg,1280,720,0,102199,,1662887555,1662887555988,0,0,0,0,,,,,,,,,,, +15144,68463,content://media/external/images/media/68463,/storage/emulated/0/DCIM/Camera/IMG_20220911_101402.jpg,image/jpeg,2316,2068,0,5323574,,1662884045,1662884045575,1662884044582,0,0,0,,,,,,,,,,, +15145,68457,content://media/external/images/media/68457,/storage/emulated/0/DCIM/Camera/IMG_20220911_100709.jpg,image/jpeg,4608,2592,0,9934040,,1662883633,1662883633722,1662883630158,0,0,0,,,,,,,,,,, +15146,68456,content://media/external/images/media/68456,/storage/emulated/0/DCIM/Camera/IMG_20220911_100706.jpg,image/jpeg,4608,2592,0,10075006,,1662883630,1662883630510,1662883626590,0,0,0,,,,,,,,,,, +15147,68455,content://media/external/images/media/68455,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0026.jpg",image/jpeg,1280,260,0,32992,,1662883569,1662883569214,0,0,0,0,,,,,,,,,,, +15148,68444,content://media/external/images/media/68444,/storage/emulated/0/DCIM/Camera/IMG_20220911_091644.jpg,image/jpeg,2592,4608,0,5165350,,1662880608,1662880608977,1662880605400,0,0,0,,,,,,,,,,, +15149,68442,content://media/external/images/media/68442,/storage/emulated/0/DCIM/Camera/IMG_20220911_091641.jpg,image/jpeg,2592,4608,0,5405839,,1662880604,1662880604953,1662880601201,0,0,0,,,,,,,,,,, +15150,68440,content://media/external/images/media/68440,/storage/emulated/0/DCIM/Camera/IMG_20220911_091525.jpg,image/jpeg,3200,1800,0,1908222,,1662880530,1662880530184,1662880525975,0,0,0,,,,,,,,,,, +15151,68438,content://media/external/images/media/68438,/storage/emulated/0/DCIM/Camera/IMG_20220911_091518.jpg,image/jpeg,1800,3200,0,2067999,,1662880522,1662880522180,1662880518259,0,0,0,,,,,,,,,,, +15152,68435,content://media/external/images/media/68435,/storage/emulated/0/DCIM/Camera/IMG_20220911_091509.jpg,image/jpeg,3200,1800,0,2105916,,1662880513,1662880513752,1662880509536,0,0,0,,,,,,,,,,, +15153,68433,content://media/external/images/media/68433,/storage/emulated/0/DCIM/Camera/IMG_20220911_091506.jpg,image/jpeg,3200,1800,0,2095243,,1662880510,1662880510580,1662880506264,0,0,0,,,,,,,,,,, +15154,68432,content://media/external/images/media/68432,/storage/emulated/0/DCIM/Camera/IMG_20220911_091501.jpg,image/jpeg,1800,3200,0,2015282,,1662880508,1662880508072,1662880502374,0,0,0,,,,,,,,,,, +15155,68087,content://media/external/images/media/68087,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0032.jpg",image/jpeg,2048,1532,0,602830,,1662795373,1662878401870,0,0,0,0,,,,,,,,,,, +15156,68204,content://media/external/images/media/68204,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0071.jpg",image/jpeg,1600,1200,0,248772,,1662805183,1662878401554,0,0,0,0,,,,,,,,,,, +15157,68240,content://media/external/images/media/68240,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0083.jpg",image/jpeg,1200,1600,0,449034,,1662805233,1662878401193,0,0,0,0,,,,,,,,,,, +15158,68309,content://media/external/images/media/68309,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0104.jpg",image/jpeg,1280,958,0,73252,,1662817221,1662878116444,0,0,0,0,,,,,,,,,,, +15159,68360,content://media/external/images/media/68360,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0116.jpg",image/jpeg,958,1280,0,87214,,1662823282,1662878116876,0,0,0,0,,,,,,,,,,, +15160,68252,content://media/external/images/media/68252,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0087.jpg",image/jpeg,721,1600,0,347794,,1662805392,1662878035759,0,0,0,0,,,,,,,,,,, +15161,68420,content://media/external/images/media/68420,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0022.jpg",image/jpeg,1600,1200,0,268928,,1662877723,1662877726939,0,0,0,0,,,,,,,,,,, +15162,68367,content://media/external/images/media/68367,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0119.jpg",image/jpeg,1080,1080,0,91895,,1662826510,1662826510112,0,0,0,0,,,,,,,,,,, +15163,68328,content://media/external/images/media/68328,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0113.jpg",image/jpeg,1532,2048,0,337625,,1662821443,1662821444199,0,0,0,0,,,,,,,,,,, +15164,68325,content://media/external/images/media/68325,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0112.jpg",image/jpeg,721,1600,0,243242,,1662820296,1662820297365,0,0,0,0,,,,,,,,,,, +15165,68321,content://media/external/images/media/68321,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0110.jpg",image/jpeg,1599,899,0,209633,,1662819977,1662819978456,0,0,0,0,,,,,,,,,,, +15166,68316,content://media/external/images/media/68316,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0108.jpg",image/jpeg,520,1156,0,36097,,1662817847,1662817848586,0,0,0,0,,,,,,,,,,, +15167,68313,content://media/external/images/media/68313,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0106.jpg",image/jpeg,1156,520,0,57533,,1662817847,1662817847987,0,0,0,0,,,,,,,,,,, +15168,68305,content://media/external/images/media/68305,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0102.jpg",image/jpeg,958,1280,0,59181,,1662816894,1662816895242,0,0,0,0,,,,,,,,,,, +15169,68300,content://media/external/images/media/68300,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0100.jpg",image/jpeg,1280,343,0,34910,,1662813376,1662813376590,0,0,0,0,,,,,,,,,,, +15170,68261,content://media/external/images/media/68261,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0090.jpg",image/jpeg,1600,1197,0,218001,,1662806638,1662806639002,0,0,0,0,,,,,,,,,,, +15171,68258,content://media/external/images/media/68258,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0089.jpg",image/jpeg,1600,1197,0,172733,,1662806637,1662806638358,0,0,0,0,,,,,,,,,,, +15172,68255,content://media/external/images/media/68255,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0088.jpg",image/jpeg,923,2048,0,430222,,1662805417,1662805419148,0,0,0,0,,,,,,,,,,, +15173,68249,content://media/external/images/media/68249,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0086.jpg",image/jpeg,1200,1600,0,421159,,1662805237,1662805239159,0,0,0,0,,,,,,,,,,, +15174,68246,content://media/external/images/media/68246,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0085.jpg",image/jpeg,1200,1600,0,476648,,1662805236,1662805237950,0,0,0,0,,,,,,,,,,, +15175,68243,content://media/external/images/media/68243,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0084.jpg",image/jpeg,1600,1200,0,543670,,1662805234,1662805236262,0,0,0,0,,,,,,,,,,, +15176,68237,content://media/external/images/media/68237,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0082.jpg",image/jpeg,1200,1600,0,354965,,1662805232,1662805233852,0,0,0,0,,,,,,,,,,, +15177,68234,content://media/external/images/media/68234,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0081.jpg",image/jpeg,719,1600,0,287932,,1662805231,1662805232902,0,0,0,0,,,,,,,,,,, +15178,68231,content://media/external/images/media/68231,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0080.jpg",image/jpeg,1200,1600,0,470258,,1662805230,1662805231938,0,0,0,0,,,,,,,,,,, +15179,68228,content://media/external/images/media/68228,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0079.jpg",image/jpeg,1200,1600,0,497040,,1662805229,1662805230787,0,0,0,0,,,,,,,,,,, +15180,68225,content://media/external/images/media/68225,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0078.jpg",image/jpeg,1200,1600,0,422648,,1662805228,1662805229561,0,0,0,0,,,,,,,,,,, +15181,68222,content://media/external/images/media/68222,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0077.jpg",image/jpeg,1600,1200,0,525628,,1662805227,1662805228385,0,0,0,0,,,,,,,,,,, +15182,68219,content://media/external/images/media/68219,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0076.jpg",image/jpeg,1600,1200,0,552140,,1662805224,1662805225713,0,0,0,0,,,,,,,,,,, +15183,68216,content://media/external/images/media/68216,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0075.jpg",image/jpeg,1600,1200,0,509908,,1662805217,1662805218992,0,0,0,0,,,,,,,,,,, +15184,68213,content://media/external/images/media/68213,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0074.jpg",image/jpeg,1200,1600,0,240911,,1662805215,1662805216843,0,0,0,0,,,,,,,,,,, +15185,68210,content://media/external/images/media/68210,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0073.jpg",image/jpeg,1600,1200,0,473311,,1662805209,1662805210793,0,0,0,0,,,,,,,,,,, +15186,68207,content://media/external/images/media/68207,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0072.jpg",image/jpeg,1600,1200,0,566704,,1662805206,1662805207752,0,0,0,0,,,,,,,,,,, +15187,68200,content://media/external/images/media/68200,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0069.jpg",image/jpeg,958,1280,0,69963,,1662804227,1662804228136,0,0,0,0,,,,,,,,,,, +15188,68197,content://media/external/images/media/68197,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0068.jpg",image/jpeg,721,1600,0,281738,,1662804019,1662804029441,0,0,0,0,,,,,,,,,,, +15189,68194,content://media/external/images/media/68194,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0067.jpg",image/jpeg,721,1600,0,274653,,1662804012,1662804019661,0,0,0,0,,,,,,,,,,, +15190,68188,content://media/external/images/media/68188,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0065.jpg",image/jpeg,1197,1600,0,171620,,1662802860,1662802861999,0,0,0,0,,,,,,,,,,, +15191,68185,content://media/external/images/media/68185,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0064.jpg",image/jpeg,721,1600,0,271792,,1662800765,1662800766648,0,0,0,0,,,,,,,,,,, +15192,68181,content://media/external/images/media/68181,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0062.jpg",image/jpeg,1156,520,0,67679,,1662799082,1662799082806,0,0,0,0,,,,,,,,,,, +15193,68175,content://media/external/images/media/68175,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0060.jpg",image/jpeg,958,1280,0,61490,,1662798023,1662798023918,0,0,0,0,,,,,,,,,,, +15194,68167,content://media/external/images/media/68167,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0056.jpg",image/jpeg,520,1156,0,48548,,1662797869,1662797870011,0,0,0,0,,,,,,,,,,, +15195,68170,content://media/external/images/media/68170,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0058.jpg",image/jpeg,473,1052,0,50781,,1662797870,1662797870346,0,0,0,0,,,,,,,,,,, +15196,68160,content://media/external/images/media/68160,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0053.jpg",image/jpeg,1052,473,0,45721,,1662797867,1662797868538,0,0,0,0,,,,,,,,,,, +15197,68150,content://media/external/images/media/68150,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0051.jpg",image/jpeg,1280,958,0,81399,,1662797005,1662797006619,0,0,0,0,,,,,,,,,,, +15198,68139,content://media/external/images/media/68139,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0049.jpg",image/jpeg,1920,1080,0,332074,,1662796399,1662796400856,0,0,0,0,,,,,,,,,,, +15199,68135,content://media/external/images/media/68135,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0047.jpg",image/jpeg,1280,277,0,26572,,1662796356,1662796357450,0,0,0,0,,,,,,,,,,, +15200,68123,content://media/external/images/media/68123,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0044.jpg",image/jpeg,520,1156,0,83295,,1662795818,1662795819551,0,0,0,0,,,,,,,,,,, +15201,68120,content://media/external/images/media/68120,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0043.jpg",image/jpeg,1532,2048,0,507537,,1662795391,1662795393230,0,0,0,0,,,,,,,,,,, +15202,68117,content://media/external/images/media/68117,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0042.jpg",image/jpeg,1532,2048,0,502020,,1662795390,1662795391808,0,0,0,0,,,,,,,,,,, +15203,68114,content://media/external/images/media/68114,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0041.jpg",image/jpeg,1532,2048,0,561016,,1662795388,1662795390368,0,0,0,0,,,,,,,,,,, +15204,68111,content://media/external/images/media/68111,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0040.jpg",image/jpeg,1532,2048,0,563386,,1662795387,1662795388715,0,0,0,0,,,,,,,,,,, +15205,68108,content://media/external/images/media/68108,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0039.jpg",image/jpeg,1532,2048,0,602483,,1662795385,1662795387154,0,0,0,0,,,,,,,,,,, +15206,68105,content://media/external/images/media/68105,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0038.jpg",image/jpeg,1532,2048,0,652457,,1662795383,1662795385571,0,0,0,0,,,,,,,,,,, +15207,68102,content://media/external/images/media/68102,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0037.jpg",image/jpeg,2048,1532,0,669929,,1662795382,1662795383932,0,0,0,0,,,,,,,,,,, +15208,68099,content://media/external/images/media/68099,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0036.jpg",image/jpeg,1532,2048,0,595224,,1662795380,1662795382046,0,0,0,0,,,,,,,,,,, +15209,68096,content://media/external/images/media/68096,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0035.jpg",image/jpeg,1532,2048,0,561258,,1662795379,1662795380454,0,0,0,0,,,,,,,,,,, +15210,68093,content://media/external/images/media/68093,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0034.jpg",image/jpeg,1532,2048,0,597732,,1662795377,1662795379040,0,0,0,0,,,,,,,,,,, +15211,68090,content://media/external/images/media/68090,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0033.jpg",image/jpeg,2048,1532,0,646637,,1662795376,1662795377553,0,0,0,0,,,,,,,,,,, +15212,68084,content://media/external/images/media/68084,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0031.jpg",image/jpeg,2048,1532,0,595393,,1662795371,1662795373558,0,0,0,0,,,,,,,,,,, +15213,68081,content://media/external/images/media/68081,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0030.jpg",image/jpeg,1532,2048,0,572834,,1662795356,1662795358115,0,0,0,0,,,,,,,,,,, +15214,68073,content://media/external/images/media/68073,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0028.jpg",image/jpeg,1280,958,0,81148,,1662793808,1662793809546,0,0,0,0,,,,,,,,,,, +15215,68066,content://media/external/images/media/68066,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0027.jpg",image/jpeg,2048,1532,0,327643,,1662789891,1662789892627,0,0,0,0,,,,,,,,,,, +15216,68063,content://media/external/images/media/68063,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0026.jpg",image/jpeg,2048,1532,0,295555,,1662789890,1662789891752,0,0,0,0,,,,,,,,,,, +15217,68060,content://media/external/images/media/68060,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0025.jpg",image/jpeg,2048,1532,0,282254,,1662789889,1662789890854,0,0,0,0,,,,,,,,,,, +15218,68056,content://media/external/images/media/68056,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0023.jpg",image/jpeg,1156,520,0,52380,,1662789195,1662789196009,0,0,0,0,,,,,,,,,,, +15219,68053,content://media/external/images/media/68053,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0022.jpg",image/jpeg,719,1599,0,74021,,1662788883,1662788884231,0,0,0,0,,,,,,,,,,, +15220,68024,content://media/external/images/media/68024,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0010.jpg",image/jpeg,1280,720,0,96960,,1662787072,1662787076903,0,0,0,0,,,,,,,,,,, +15221,68028,content://media/external/images/media/68028,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0012.jpg",image/jpeg,1280,720,0,82695,,1662787073,1662787076385,0,0,0,0,,,,,,,,,,, +15222,68046,content://media/external/images/media/68046,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0020.jpg",image/jpeg,1280,720,0,61980,,1662787075,1662787076238,0,0,0,0,,,,,,,,,,, +15223,68036,content://media/external/images/media/68036,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0016.jpg",image/jpeg,1280,720,0,70416,,1662787074,1662787075353,0,0,0,0,,,,,,,,,,, +15224,68041,content://media/external/images/media/68041,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0018.jpg",image/jpeg,1280,720,0,22437,,1662787074,1662787075178,0,0,0,0,,,,,,,,,,, +15225,68033,content://media/external/images/media/68033,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0014.jpg",image/jpeg,1280,720,0,85984,,1662787074,1662787074396,0,0,0,0,,,,,,,,,,, +15226,68013,content://media/external/images/media/68013,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0004.jpg",image/jpeg,1280,720,0,49452,,1662787071,1662787072075,0,0,0,0,,,,,,,,,,, +15227,68016,content://media/external/images/media/68016,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0006.jpg",image/jpeg,1280,720,0,47209,,1662787072,1662787072378,0,0,0,0,,,,,,,,,,, +15228,68020,content://media/external/images/media/68020,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0008.jpg",image/jpeg,1280,720,0,104156,,1662787072,1662787072955,0,0,0,0,,,,,,,,,,, +15229,68004,content://media/external/images/media/68004,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0001.jpg",image/jpeg,1599,719,0,48903,,1662785165,1662785166370,0,0,0,0,,,,,,,,,,, +15230,68007,content://media/external/images/media/68007,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0002.jpg",image/jpeg,1386,520,0,36199,,1662785166,1662785166642,0,0,0,0,,,,,,,,,,, +15231,68010,content://media/external/images/media/68010,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0003.jpg",image/jpeg,1599,719,0,59410,,1662785166,1662785166971,0,0,0,0,,,,,,,,,,, +15232,67949,content://media/external/images/media/67949,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0037.jpg",image/jpeg,1080,1920,0,210831,,1662738809,1662738810843,0,0,0,0,,,,,,,,,,, +15233,67946,content://media/external/images/media/67946,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0036.jpg",image/jpeg,1080,1920,0,267487,,1662738769,1662738771062,0,0,0,0,,,,,,,,,,, +15234,67925,content://media/external/images/media/67925,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0028.jpg",image/jpeg,1280,958,0,124821,,1662735031,1662735032076,0,0,0,0,,,,,,,,,,, +15235,67922,content://media/external/images/media/67922,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0027.jpg",image/jpeg,1280,720,0,97526,,1662734914,1662734915519,0,0,0,0,,,,,,,,,,, +15236,67910,content://media/external/images/media/67910,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0023.jpg",image/jpeg,1052,592,0,46274,,1662733024,1662734914060,0,0,0,0,,,,,,,,,,, +15237,67885,content://media/external/images/media/67885,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0015.jpg",image/jpeg,1599,900,0,203579,,1662725327,1662725328767,0,0,0,0,,,,,,,,,,, +15238,67882,content://media/external/images/media/67882,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0014.jpg",image/jpeg,1599,900,0,187428,,1662725326,1662725327962,0,0,0,0,,,,,,,,,,, +15239,67288,content://media/external/images/media/67288,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220903-WA0010.jpg",image/jpeg,1599,899,0,308662,,1662191735,1662317080219,0,0,0,0,,,,,,,,,,, +15240,67412,content://media/external/images/media/67412,/storage/emulated/0/DCIM/Camera/IMG_20220904_113323.jpg,image/jpeg,2592,4608,0,4387599,,1662284007,1662284007761,1662284003511,0,0,0,,,,,,,,,,, +15241,67291,content://media/external/images/media/67291,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220903-WA0011.jpg",image/jpeg,899,1599,0,278801,,1662191735,1662191736172,0,0,0,0,,,,,,,,,,, +15242,67294,content://media/external/images/media/67294,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220903-WA0012.jpg",image/jpeg,1599,899,0,310113,,1662191736,1662191736528,0,0,0,0,,,,,,,,,,, +15243,67240,content://media/external/images/media/67240,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220902-WA0013.jpg",image/jpeg,1600,1197,0,235236,,1662144027,1662144027766,0,0,0,0,,,,,,,,,,, +15244,67150,content://media/external/images/media/67150,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220902-WA0000.jpeg",image/jpeg,3840,2160,90,1278366,,1662103170,1662103170810,1662103170602,0,0,0,,,,,,,,,,, +15245,67133,content://media/external/images/media/67133,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220901-WA0007.jpg",image/jpeg,1532,2048,0,329962,,1662054252,1662054253194,0,0,0,0,,,,,,,,,,, +15246,67130,content://media/external/images/media/67130,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220901-WA0006.jpg",image/jpeg,2048,1532,0,326442,,1662054251,1662054252422,0,0,0,0,,,,,,,,,,, +15247,67127,content://media/external/images/media/67127,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220901-WA0005.jpg",image/jpeg,1200,1600,0,418462,,1662047041,1662047041757,0,0,0,0,,,,,,,,,,, +15248,67050,content://media/external/images/media/67050,/storage/emulated/0/DCIM/Camera/IMG_20220830_203602.jpg,image/jpeg,2592,4608,0,5545670,,1661884564,1661884564640,1661884562298,0,0,0,,,,,,,,,,, +15249,66861,content://media/external/images/media/66861,/storage/emulated/0/DCIM/Screenshots/IMG_20220826_173419.jpg,image/jpeg,998,1444,0,351691,,1661528059,1661528059190,0,0,0,0,,,,,,,,,,, +15250,66641,content://media/external/images/media/66641,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220821-WA0004.jpg",image/jpeg,2048,969,0,158164,,1661090255,1661090256165,0,0,0,0,,,,,,,,,,, +15251,66644,content://media/external/images/media/66644,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220821-WA0005.jpg",image/jpeg,2048,969,0,150216,,1661090256,1661090256591,0,0,0,0,,,,,,,,,,, +15252,66647,content://media/external/images/media/66647,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220821-WA0006.jpg",image/jpeg,2048,969,0,145679,,1661090256,1661090256930,0,0,0,0,,,,,,,,,,, +15253,66638,content://media/external/images/media/66638,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220821-WA0003.jpg",image/jpeg,2048,969,0,168830,,1661090255,1661090255564,0,0,0,0,,,,,,,,,,, +15254,66056,content://media/external/images/media/66056,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220818-WA0005.jpg",image/jpeg,1599,1200,0,198274,,1660847566,1660847566591,0,0,0,0,,,,,,,,,,, +15255,66029,content://media/external/images/media/66029,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220818-WA0001.jpg",image/jpeg,720,1600,0,118438,,1660819764,1660819766733,0,0,0,0,,,,,,,,,,, +15256,65942,content://media/external/images/media/65942,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220815-WA0040.jpg",image/jpeg,1560,1040,0,319624,,1660570970,1660570972188,0,0,0,0,,,,,,,,,,, +15257,65939,content://media/external/images/media/65939,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220815-WA0039.jpg",image/jpeg,1560,1040,0,334672,,1660570969,1660570970386,0,0,0,0,,,,,,,,,,, +15258,65772,content://media/external/images/media/65772,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0033.jpg",image/jpeg,720,1600,0,101175,,1660501623,1660505222769,0,0,0,0,,,,,,,,,,, +15259,65703,content://media/external/images/media/65703,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0010.jpg",image/jpeg,720,1600,0,79131,,1660479581,1660479582177,0,0,0,0,,,,,,,,,,, +15260,65697,content://media/external/images/media/65697,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0008.jpg",image/jpeg,720,1600,0,77201,,1660479580,1660479581313,0,0,0,0,,,,,,,,,,, +15261,65700,content://media/external/images/media/65700,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0009.jpg",image/jpeg,720,1600,0,71876,,1660479581,1660479581663,0,0,0,0,,,,,,,,,,, +15262,65691,content://media/external/images/media/65691,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0006.jpg",image/jpeg,720,1600,0,79866,,1660479579,1660479580343,0,0,0,0,,,,,,,,,,, +15263,65694,content://media/external/images/media/65694,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0007.jpg",image/jpeg,720,1600,0,115255,,1660479580,1660479580834,0,0,0,0,,,,,,,,,,, +15264,65681,content://media/external/images/media/65681,/storage/emulated/0/DCIM/Camera/IMG_20220814_122453.jpg,image/jpeg,4608,2592,0,4763091,,1660472696,1660472696711,1660472693947,0,0,0,,,,,,,,,,, +15265,65631,content://media/external/images/media/65631,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-13-15-11-42-247_com.brytonsport.active.jpg,image/jpeg,1080,2400,0,518897,,1660396302,1660396302430,0,0,0,0,,,,,,,,,,, +15266,65623,content://media/external/images/media/65623,/storage/emulated/0/DCIM/Camera/PANO_20220813_130822.jpg,image/jpeg,8304,4288,0,30635896,,1660388910,1660388912098,1660388902000,0,0,0,,,,,,,,,,, +15267,65621,content://media/external/images/media/65621,/storage/emulated/0/DCIM/Camera/IMG_20220813_130811.jpg,image/jpeg,4608,2592,0,7666894,,1660388893,1660388893914,1660388891741,0,0,0,,,,,,,,,,, +15268,65618,content://media/external/images/media/65618,/storage/emulated/0/DCIM/Camera/IMG_20220813_122646.jpg,image/jpeg,1800,3200,0,2702424,,1660386408,1660386408046,1660386406229,0,0,0,,,,,,,,,,, +15269,65617,content://media/external/images/media/65617,/storage/emulated/0/DCIM/Camera/PANO_20220813_122635.jpg,image/jpeg,2512,4352,0,8818024,,1660386398,1660386398310,1660386395000,0,0,0,,,,,,,,,,, +15270,65615,content://media/external/images/media/65615,/storage/emulated/0/DCIM/Camera/IMG_20220813_121124.jpg,image/jpeg,2592,4608,0,7093971,,1660385487,1660385487527,1660385484426,0,0,0,,,,,,,,,,, +15271,65612,content://media/external/images/media/65612,/storage/emulated/0/DCIM/Camera/IMG_20220813_120053.jpg,image/jpeg,3200,1800,0,3850048,,1660384855,1660384855803,1660384853376,0,0,0,,,,,,,,,,, +15272,65610,content://media/external/images/media/65610,/storage/emulated/0/DCIM/Camera/PANO_20220813_115149.jpg,image/jpeg,8784,4288,0,30604067,,1660384314,1660384316263,1660384309000,0,0,0,,,,,,,,,,, +15273,65608,content://media/external/images/media/65608,/storage/emulated/0/DCIM/Camera/IMG_20220813_112422.jpg,image/jpeg,7203,3785,0,12456026,,1660382664,1660382664606,1660382623000,0,0,0,,,,,,,,,,, +15274,65607,content://media/external/images/media/65607,/storage/emulated/0/DCIM/Camera/PANO_20220813_112343.jpg,image/jpeg,7888,4320,0,29941622,,1660382631,1660382632354,1660382623000,0,0,0,,,,,,,,,,, +15275,65605,content://media/external/images/media/65605,/storage/emulated/0/DCIM/Camera/IMG_20220813_112319.jpg,image/jpeg,5120,2880,0,5734843,,1660382601,1660382601402,1660382599620,0,0,0,,,,,,,,,,, +15276,65603,content://media/external/images/media/65603,/storage/emulated/0/DCIM/Camera/IMG_20220813_112123.jpg,image/jpeg,5120,2880,0,10462742,,1660382486,1660382486842,1660382484250,0,0,0,,,,,,,,,,, +15277,65600,content://media/external/images/media/65600,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220813-WA0006.jpg",image/jpeg,921,2048,0,144017,,1660382217,1660382218689,0,0,0,0,,,,,,,,,,, +15278,65598,content://media/external/images/media/65598,/storage/emulated/0/DCIM/Camera/IMG_20220813_101616.jpg,image/jpeg,5120,2880,0,2443491,,1660378577,1660378577622,1660378554477,0,0,0,,,,,,,,,,, +15279,65596,content://media/external/images/media/65596,/storage/emulated/0/DCIM/Camera/IMG_20220813_101554.jpg,image/jpeg,5120,2880,0,9377681,,1660378557,1660378557726,1660378554477,0,0,0,,,,,,,,,,, +15280,65587,content://media/external/images/media/65587,/storage/emulated/0/DCIM/Camera/PANO_20220813_095418.jpg,image/jpeg,8496,4352,0,29569132,,1660377266,1660377266838,1660377258000,0,0,0,,,,,,,,,,, +15281,65580,content://media/external/images/media/65580,/storage/emulated/0/DCIM/Camera/IMG_20220813_083934.jpg,image/jpeg,2592,4608,0,8722462,,1660372777,1660372777294,1660372774836,0,0,0,,,,,,,,,,, +15282,65577,content://media/external/images/media/65577,/storage/emulated/0/DCIM/Camera/IMG_20220813_083349.jpg,image/jpeg,4608,2592,0,7331172,,1660372433,1660372433375,1660372429808,0,0,0,,,,,,,,,,, +15283,65566,content://media/external/images/media/65566,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220812-WA0011.jpg",image/jpeg,1532,2048,0,264181,,1660328283,1660328285402,0,0,0,0,,,,,,,,,,, +15284,65482,content://media/external/images/media/65482,/storage/emulated/0/DCIM/Camera/IMG_20220811_173908.jpg,image/jpeg,3200,1800,0,2812132,,1660232356,1660232357996,1660232348830,0,0,0,,,,,,,,,,, +15285,65445,content://media/external/images/media/65445,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-11-11-00-35-707_de.komoot.android.jpg,image/jpeg,1080,2400,0,809898,,1660208436,1660208436290,0,0,0,0,,,,,,,,,,, +15286,65325,content://media/external/images/media/65325,/storage/emulated/0/DCIM/Camera/IMG_20220809_192936.jpg,image/jpeg,2592,4608,0,4214473,,1660066181,1660066182007,1660066176993,0,0,0,,,,,,,,,,, +15287,65242,content://media/external/images/media/65242,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220808-WA0013.jpg",image/jpeg,640,959,0,57094,,1659979131,1659979132782,0,0,0,0,,,,,,,,,,, +15288,65231,content://media/external/images/media/65231,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220808-WA0010.jpg",image/jpeg,940,788,0,537190,,1659970736,1659970737779,0,0,0,0,,,,,,,,,,, +15289,65213,content://media/external/images/media/65213,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220808-WA0002.jpg",image/jpeg,720,1600,0,54807,,1659950267,1659950267930,0,0,0,0,,,,,,,,,,, +15290,65188,content://media/external/images/media/65188,/storage/emulated/0/DCIM/Camera/IMG_20220807_195532.jpg,image/jpeg,4608,2592,0,4020584,,1659894934,1659894934588,1659894932253,0,0,0,,,,,,,,,,, +15291,65186,content://media/external/images/media/65186,/storage/emulated/0/DCIM/Camera/IMG_20220807_184711.jpg,image/jpeg,4608,2592,0,4938602,,1659890834,1659890834019,1659890831860,0,0,0,,,,,,,,,,, +15292,65183,content://media/external/images/media/65183,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220807-WA0010.jpg",image/jpeg,896,2000,0,74448,,1659890393,1659890393540,0,0,0,0,,,,,,,,,,, +15293,65171,content://media/external/images/media/65171,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220807-WA0006.jpg",image/jpeg,1080,1637,0,211109,,1659886625,1659886626424,0,0,0,0,,,,,,,,,,, +15294,65119,content://media/external/images/media/65119,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220806-WA0070.jpg",image/jpeg,319,190,0,26787,,1659813078,1659813083426,0,0,0,0,,,,,,,,,,, +15295,65116,content://media/external/images/media/65116,/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_205718.jpg,image/jpeg,742,1030,0,209275,,1659812238,1659812238819,1659738030000,0,0,0,,,,,,,,,,, +15296,65114,content://media/external/images/media/65114,/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_205520.jpg,image/jpeg,678,968,0,187666,,1659812120,1659812120571,1659738030000,0,0,0,,,,,,,,,,, +15297,65112,content://media/external/images/media/65112,/storage/emulated/0/DCIM/Camera/IMG_20220806_200909.jpg,image/jpeg,2592,4608,0,5432680,,1659809351,1659809351490,1659809349126,0,0,0,,,,,,,,,,, +15298,65110,content://media/external/images/media/65110,/storage/emulated/0/DCIM/Camera/IMG_20220806_200903.jpg,image/jpeg,2592,4608,0,5461245,,1659809348,1659809348478,1659809343333,0,0,0,,,,,,,,,,, +15299,65074,content://media/external/images/media/65074,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803997289.jpg,image/jpeg,1920,1080,0,260104,,1659803998,1659803998546,1659738030000,0,0,0,,,,,,,,,,, +15300,65073,content://media/external/images/media/65073,/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_183758.jpg,image/jpeg,1129,652,0,252797,,1659803878,1659803878530,1659738030000,0,0,0,,,,,,,,,,, +15301,65071,content://media/external/images/media/65071,/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_183524.jpg,image/jpeg,1920,1080,0,502373,,1659803724,1659803724762,1659738030000,0,0,0,,,,,,,,,,, +15302,65070,content://media/external/images/media/65070,/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_183433.jpg,image/jpeg,1240,626,0,235635,,1659803673,1659803673598,1659738030000,0,0,0,,,,,,,,,,, +15303,65065,content://media/external/images/media/65065,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803278076.jpg,image/jpeg,1920,1080,0,233213,,1659803278,1659803278582,1659738030000,0,0,0,,,,,,,,,,, +15304,65060,content://media/external/images/media/65060,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803202400.jpg,image/jpeg,1920,1080,0,208335,,1659803202,1659803202922,1659738030000,0,0,0,,,,,,,,,,, +15305,65059,content://media/external/images/media/65059,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803180304.jpg,image/jpeg,1920,1080,0,237923,,1659803180,1659803180754,1659738030000,0,0,0,,,,,,,,,,, +15306,65058,content://media/external/images/media/65058,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803156553.jpg,image/jpeg,1920,1080,0,230439,,1659803157,1659803157030,1659738030000,0,0,0,,,,,,,,,,, +15307,65057,content://media/external/images/media/65057,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803142382.jpg,image/jpeg,1920,1080,0,214629,,1659803142,1659803142862,1659738030000,0,0,0,,,,,,,,,,, +15308,65056,content://media/external/images/media/65056,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803133394.jpg,image/jpeg,1920,1080,0,206446,,1659803133,1659803133894,1659738030000,0,0,0,,,,,,,,,,, +15309,65055,content://media/external/images/media/65055,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803089637.jpg,image/jpeg,1920,1080,0,236453,,1659803090,1659803090102,1659738030000,0,0,0,,,,,,,,,,, +15310,65054,content://media/external/images/media/65054,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803075094.jpg,image/jpeg,1920,1080,0,221905,,1659803075,1659803075586,1659738030000,0,0,0,,,,,,,,,,, +15311,65053,content://media/external/images/media/65053,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803065132.jpg,image/jpeg,1920,1080,0,185377,,1659803065,1659803065554,1659738030000,0,0,0,,,,,,,,,,, +15312,65052,content://media/external/images/media/65052,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803049397.jpg,image/jpeg,1920,1080,0,200023,,1659803049,1659803049962,1659738030000,0,0,0,,,,,,,,,,, +15313,65051,content://media/external/images/media/65051,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803017449.jpg,image/jpeg,1920,1080,0,239186,,1659803018,1659803018050,1659738030000,0,0,0,,,,,,,,,,, +15314,65050,content://media/external/images/media/65050,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802928948.jpg,image/jpeg,1920,1080,0,197828,,1659802929,1659802929498,1659738030000,0,0,0,,,,,,,,,,, +15315,65049,content://media/external/images/media/65049,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802895515.jpg,image/jpeg,1920,1080,0,257717,,1659802896,1659802896014,1659738030000,0,0,0,,,,,,,,,,, +15316,65048,content://media/external/images/media/65048,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802878320.jpg,image/jpeg,1920,1080,0,232179,,1659802878,1659802878886,1659738030000,0,0,0,,,,,,,,,,, +15317,65047,content://media/external/images/media/65047,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802854254.jpg,image/jpeg,1920,1080,0,242638,,1659802854,1659802854886,1659738030000,0,0,0,,,,,,,,,,, +15318,65046,content://media/external/images/media/65046,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802792419.jpg,image/jpeg,1920,1080,0,250515,,1659802792,1659802792830,1659738030000,0,0,0,,,,,,,,,,, +15319,65045,content://media/external/images/media/65045,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802774233.jpg,image/jpeg,1920,1080,0,254426,,1659802774,1659802774766,1659738030000,0,0,0,,,,,,,,,,, +15320,65044,content://media/external/images/media/65044,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802760807.jpg,image/jpeg,1920,1080,0,227792,,1659802761,1659802761414,1659738030000,0,0,0,,,,,,,,,,, +15321,65043,content://media/external/images/media/65043,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802742718.jpg,image/jpeg,1920,1080,0,228522,,1659802743,1659802743230,1659738030000,0,0,0,,,,,,,,,,, +15322,65042,content://media/external/images/media/65042,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802673097.jpg,image/jpeg,1920,1080,0,247042,,1659802673,1659802673582,1659738030000,0,0,0,,,,,,,,,,, +15323,65041,content://media/external/images/media/65041,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802598338.jpg,image/jpeg,1920,1080,0,211428,,1659802599,1659802599010,1659738030000,0,0,0,,,,,,,,,,, +15324,65040,content://media/external/images/media/65040,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802490053.jpg,image/jpeg,1920,1080,0,225672,,1659802491,1659802491370,1659738030000,0,0,0,,,,,,,,,,, +15325,65039,content://media/external/images/media/65039,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802401681.jpg,image/jpeg,1920,1080,0,265130,,1659802402,1659802402266,1659738030000,0,0,0,,,,,,,,,,, +15326,65038,content://media/external/images/media/65038,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802359461.jpg,image/jpeg,1920,1080,0,268561,,1659802359,1659802359942,1659738030000,0,0,0,,,,,,,,,,, +15327,65037,content://media/external/images/media/65037,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802313187.jpg,image/jpeg,1920,1080,0,259866,,1659802313,1659802313754,1659738030000,0,0,0,,,,,,,,,,, +15328,65036,content://media/external/images/media/65036,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802271415.jpg,image/jpeg,1920,1080,0,257983,,1659802271,1659802272002,1659738030000,0,0,0,,,,,,,,,,, +15329,65035,content://media/external/images/media/65035,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802218131.jpg,image/jpeg,1920,1080,0,257076,,1659802218,1659802218894,1659738030000,0,0,0,,,,,,,,,,, +15330,65034,content://media/external/images/media/65034,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802183156.jpg,image/jpeg,1920,1080,0,245102,,1659802184,1659802184082,1659738030000,0,0,0,,,,,,,,,,, +15331,65033,content://media/external/images/media/65033,/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802138784.jpg,image/jpeg,1920,1080,0,205522,,1659802139,1659802139674,1659738030000,0,0,0,,,,,,,,,,, +15332,64936,content://media/external/images/media/64936,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220806-WA0002.jpg",image/jpeg,896,2000,0,40501,,1659779173,1659779174946,0,0,0,0,,,,,,,,,,, +15333,64894,content://media/external/images/media/64894,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220805-WA0003.jpg",image/jpeg,1080,318,0,14201,,1659687622,1659687623568,0,0,0,0,,,,,,,,,,, +15334,64819,content://media/external/images/media/64819,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220804-WA0016.jpg",image/jpeg,946,2048,0,278372,,1659626050,1659626051242,0,0,0,0,,,,,,,,,,, +15335,64814,content://media/external/images/media/64814,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220804-WA0014.jpg",image/jpeg,921,2048,0,103477,,1659622721,1659622721917,0,0,0,0,,,,,,,,,,, +15336,64808,content://media/external/images/media/64808,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220804-WA0012.jpg",image/jpeg,1080,2019,0,239602,,1659622677,1659622678959,0,0,0,0,,,,,,,,,,, +15337,64765,content://media/external/images/media/64765,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220804-WA0000.jpg",image/jpeg,738,1600,0,84939,,1659590012,1659590013421,0,0,0,0,,,,,,,,,,, +15338,64755,content://media/external/images/media/64755,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220803-WA0010.jpg",image/jpeg,900,900,0,141015,,1659540177,1659540178207,0,0,0,0,,,,,,,,,,, +15339,64743,content://media/external/images/media/64743,/storage/emulated/0/DCIM/Screenshots/IMG_20220803_163733.jpg,image/jpeg,1058,1230,0,274309,,1659537453,1659537453936,0,0,0,0,,,,,,,,,,, +15340,64736,content://media/external/images/media/64736,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220803-WA0005.jpg",image/jpeg,960,540,0,58820,,1659525442,1659525443052,0,0,0,0,,,,,,,,,,, +15341,64722,content://media/external/images/media/64722,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220803-WA0001.jpg",image/jpeg,921,2048,0,167981,,1659513300,1659513300615,0,0,0,0,,,,,,,,,,, +15342,64715,content://media/external/images/media/64715,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220803-WA0000.jpg",image/jpeg,921,2048,0,138623,,1659479760,1659479910830,0,0,0,0,,,,,,,,,,, +15343,64698,content://media/external/images/media/64698,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-02-15-15-28-283_it.subito.jpg,image/jpeg,1080,2400,0,453944,,1659446128,1659446128690,0,0,0,0,,,,,,,,,,, +15344,64691,content://media/external/images/media/64691,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-02-12-09-32-492_it.subito.jpg,image/jpeg,1080,2400,0,587852,,1659434972,1659434972609,0,0,0,0,,,,,,,,,,, +15345,64689,content://media/external/images/media/64689,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-02-12-09-12-808_it.subito.jpg,image/jpeg,1080,2400,0,552853,,1659434953,1659434953189,0,0,0,0,,,,,,,,,,, +15346,64682,content://media/external/images/media/64682,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220802-WA0002.jpg",image/jpeg,1196,1600,0,137277,,1659432054,1659432055424,0,0,0,0,,,,,,,,,,, +15347,64680,content://media/external/images/media/64680,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-02-08-55-44-581_com.whatsapp.jpg,image/jpeg,1080,2400,0,728107,,1659423344,1659423344768,0,0,0,0,,,,,,,,,,, +15348,64654,content://media/external/images/media/64654,/storage/emulated/0/DCIM/Facebook/FB_IMG_1659383396599.jpg,image/jpeg,960,640,0,71124,,1659383396,1659383396615,0,0,0,0,,,,,,,,,,, +15349,64653,content://media/external/images/media/64653,/storage/emulated/0/DCIM/Facebook/FB_IMG_1659383367309.jpg,image/jpeg,960,640,0,69144,,1659383367,1659383367323,0,0,0,0,,,,,,,,,,, +15350,64652,content://media/external/images/media/64652,/storage/emulated/0/DCIM/Facebook/FB_IMG_1659383340679.jpg,image/jpeg,960,640,0,69450,,1659383340,1659383340699,0,0,0,0,,,,,,,,,,, +15351,64651,content://media/external/images/media/64651,/storage/emulated/0/DCIM/Facebook/FB_IMG_1659383329248.jpg,image/jpeg,960,640,0,71040,,1659383329,1659383329263,0,0,0,0,,,,,,,,,,, +15352,64649,content://media/external/images/media/64649,/storage/emulated/0/DCIM/Facebook/FB_IMG_1659383276845.jpg,image/jpeg,960,640,0,54014,,1659383276,1659383276871,0,0,0,0,,,,,,,,,,, +15353,64648,content://media/external/images/media/64648,/storage/emulated/0/DCIM/Facebook/FB_IMG_1659383271090.jpg,image/jpeg,960,640,0,73323,,1659383271,1659383271155,0,0,0,0,,,,,,,,,,, +15354,64626,content://media/external/images/media/64626,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220801-WA0016.jpg",image/jpeg,1600,1200,0,197459,,1659374503,1659374503866,0,0,0,0,,,,,,,,,,, +15355,64561,content://media/external/images/media/64561,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220801-WA0000.jpg",image/jpeg,899,1599,0,130388,,1659330301,1659330302093,0,0,0,0,,,,,,,,,,, +15356,64554,content://media/external/images/media/64554,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0013.jpg",image/jpeg,921,2048,0,75671,,1659301026,1659301043392,0,0,0,0,,,,,,,,,,, +15357,64551,content://media/external/images/media/64551,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0012.jpg",image/jpeg,2048,1532,0,364575,,1659300415,1659300416423,0,0,0,0,,,,,,,,,,, +15358,64546,content://media/external/images/media/64546,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0010.jpg",image/jpeg,270,270,0,31412,,1659294461,1659294465264,0,0,0,0,,,,,,,,,,, +15359,64528,content://media/external/images/media/64528,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0006.jpg",image/jpeg,957,2048,0,240908,,1659275486,1659292737323,0,0,0,0,,,,,,,,,,, +15360,64500,content://media/external/images/media/64500,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0025.jpg",image/jpeg,1536,2048,0,582569,,1659208056,1659208057364,0,0,0,0,,,,,,,,,,, +15361,64497,content://media/external/images/media/64497,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0024.jpg",image/jpeg,896,2000,0,280082,,1659207499,1659207500704,0,0,0,0,,,,,,,,,,, +15362,64487,content://media/external/images/media/64487,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0021.jpg",image/jpeg,899,1599,0,125716,,1659203675,1659203676126,0,0,0,0,,,,,,,,,,, +15363,64482,content://media/external/images/media/64482,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0019.jpg",image/jpeg,1080,479,0,45177,,1659203570,1659203570478,0,0,0,0,,,,,,,,,,, +15364,64485,content://media/external/images/media/64485,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0020.jpg",image/jpeg,1600,1200,0,290214,,1659203570,1659203570663,0,0,0,0,,,,,,,,,,, +15365,64453,content://media/external/images/media/64453,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0010.jpg",image/jpeg,1200,1600,0,229268,,1659189569,1659189570864,0,0,0,0,,,,,,,,,,, +15366,64446,content://media/external/images/media/64446,/storage/emulated/0/DCIM/Camera/IMG_20220730_140807.jpg,image/jpeg,4608,2592,0,5542340,,1659182889,1659182889345,1659182887405,0,0,0,,,,,,,,,,, +15367,64444,content://media/external/images/media/64444,/storage/emulated/0/DCIM/Camera/IMG_20220730_140449.jpg,image/jpeg,4608,2592,0,4634389,,1659182692,1659182692056,1659182689570,0,0,0,,,,,,,,,,, +15368,64438,content://media/external/images/media/64438,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0005.jpg",image/jpeg,1532,2048,0,427858,,1659169414,1659169415028,0,0,0,0,,,,,,,,,,, +15369,64356,content://media/external/images/media/64356,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0026.jpg",image/jpeg,768,1024,0,106523,,1659120620,1659120621534,0,0,0,0,,,,,,,,,,, +15370,64350,content://media/external/images/media/64350,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0024.jpg",image/jpeg,923,2048,0,324717,,1659118319,1659118320361,0,0,0,0,,,,,,,,,,, +15371,64353,content://media/external/images/media/64353,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0025.jpg",image/jpeg,721,1600,0,146034,,1659118320,1659118320583,0,0,0,0,,,,,,,,,,, +15372,64341,content://media/external/images/media/64341,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0021.jpg",image/jpeg,1600,720,0,109032,,1659116433,1659116434110,0,0,0,0,,,,,,,,,,, +15373,64334,content://media/external/images/media/64334,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0018.jpg",image/jpeg,1600,900,0,197522,,1659113764,1659113764958,0,0,0,0,,,,,,,,,,, +15374,64331,content://media/external/images/media/64331,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0017.jpg",image/jpeg,1600,1200,0,292588,,1659108147,1659108148357,0,0,0,0,,,,,,,,,,, +15375,64315,content://media/external/images/media/64315,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0013.jpg",image/jpeg,921,2048,0,180259,,1659090584,1659090585052,0,0,0,0,,,,,,,,,,, +15376,64318,content://media/external/images/media/64318,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0014.jpg",image/jpeg,921,2048,0,191323,,1659090585,1659090585785,0,0,0,0,,,,,,,,,,, +15377,64312,content://media/external/images/media/64312,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0012.jpg",image/jpeg,921,2048,0,204969,,1659090583,1659090584402,0,0,0,0,,,,,,,,,,, +15378,64309,content://media/external/images/media/64309,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0011.jpg",image/jpeg,921,2048,0,184782,,1659090582,1659090583640,0,0,0,0,,,,,,,,,,, +15379,64306,content://media/external/images/media/64306,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0010.jpg",image/jpeg,921,2048,0,178501,,1659090581,1659090582825,0,0,0,0,,,,,,,,,,, +15380,64303,content://media/external/images/media/64303,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0009.jpg",image/jpeg,921,2048,0,180893,,1659090580,1659090581908,0,0,0,0,,,,,,,,,,, +15381,64300,content://media/external/images/media/64300,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0008.jpg",image/jpeg,2048,1532,0,339210,,1659085489,1659085489948,0,0,0,0,,,,,,,,,,, +15382,64296,content://media/external/images/media/64296,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0007.jpg",image/jpeg,2048,1536,0,359811,,1659073970,1659073971159,0,0,0,0,,,,,,,,,,, +15383,64293,content://media/external/images/media/64293,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0006.jpg",image/jpeg,2048,1536,0,415853,,1659073970,1659073970825,0,0,0,0,,,,,,,,,,, +15384,64267,content://media/external/images/media/64267,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220728-WA0007.jpg",image/jpeg,1500,2000,0,252039,,1659029715,1659029716394,0,0,0,0,,,,,,,,,,, +15385,64254,content://media/external/images/media/64254,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220728-WA0004.jpg",image/jpeg,921,2048,0,123217,,1659013150,1659013150889,0,0,0,0,,,,,,,,,,, +15386,64246,content://media/external/images/media/64246,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220728-WA0003.jpg",image/jpeg,921,2048,0,89435,,1659007624,1659007625153,0,0,0,0,,,,,,,,,,, +15387,64226,content://media/external/images/media/64226,/storage/emulated/0/DCIM/Screenshots/IMG_20220727_231710.jpg,image/jpeg,1080,1181,0,262600,,1658956630,1658956630736,0,0,0,0,,,,,,,,,,, +15388,64222,content://media/external/images/media/64222,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0010.jpg",image/jpeg,1024,1213,0,77153,,1658949676,1658949677578,0,0,0,0,,,,,,,,,,, +15389,64214,content://media/external/images/media/64214,/storage/emulated/0/DCIM/Camera/IMG_20220727_203350.jpg,image/jpeg,4608,2592,0,6111730,,1658946833,1658946833047,1658946830782,0,0,0,,,,,,,,,,, +15390,64215,content://media/external/images/media/64215,/storage/emulated/0/DCIM/Camera/IMG_20220727_203351.jpg,image/jpeg,4608,2592,0,6082607,,1658946833,1658946833299,1658946831869,0,0,0,,,,,,,,,,, +15391,64212,content://media/external/images/media/64212,/storage/emulated/0/DCIM/Camera/IMG_20220727_203259.jpg,image/jpeg,4608,2592,0,6691261,,1658946782,1658946782071,1658946779508,0,0,0,,,,,,,,,,, +15392,64210,content://media/external/images/media/64210,/storage/emulated/0/DCIM/Camera/IMG_20220727_195811.jpg,image/jpeg,2592,4608,0,7095072,,1658944694,1658944694071,1658944691821,0,0,0,,,,,,,,,,, +15393,64208,content://media/external/images/media/64208,/storage/emulated/0/DCIM/Camera/IMG_20220727_195759.jpg,image/jpeg,3200,1800,0,2655734,,1658944681,1658944681363,1658944679310,0,0,0,,,,,,,,,,, +15394,64206,content://media/external/images/media/64206,/storage/emulated/0/DCIM/Camera/IMG_20220727_195704.jpg,image/jpeg,4608,2592,0,6054986,,1658944628,1658944628835,1658944624611,0,0,0,,,,,,,,,,, +15395,64195,content://media/external/images/media/64195,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0006.jpg",image/jpeg,1080,1920,0,313592,,1658918312,1658918313130,0,0,0,0,,,,,,,,,,, +15396,64192,content://media/external/images/media/64192,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0005.jpg",image/jpeg,1532,2048,0,396309,,1658918261,1658918262919,0,0,0,0,,,,,,,,,,, +15397,64189,content://media/external/images/media/64189,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0004.jpg",image/jpeg,1532,2048,0,456721,,1658917415,1658917416206,0,0,0,0,,,,,,,,,,, +15398,64186,content://media/external/images/media/64186,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0003.jpg",image/jpeg,720,718,0,64166,,1658914112,1658914113688,0,0,0,0,,,,,,,,,,, +15399,64183,content://media/external/images/media/64183,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0002.jpg",image/jpeg,828,828,0,66473,,1658911885,1658911885987,0,0,0,0,,,,,,,,,,, +15400,64144,content://media/external/images/media/64144,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-26-07-59-40-201_com.instagram.android.jpg,image/jpeg,1080,2400,0,1350009,,1658815180,1658815180703,0,0,0,0,,,,,,,,,,, +15401,64143,content://media/external/images/media/64143,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-26-07-45-45-793_com.instagram.android.jpg,image/jpeg,1080,2400,0,1029225,,1658814346,1658814346227,0,0,0,0,,,,,,,,,,, +15402,64123,content://media/external/images/media/64123,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220725-WA0005.jpg",image/jpeg,720,1164,0,87314,,1658766358,1658766361523,0,0,0,0,,,,,,,,,,, +15403,64120,content://media/external/images/media/64120,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220725-WA0004.jpg",image/jpeg,1920,1080,0,160664,,1658759399,1658759402344,0,0,0,0,,,,,,,,,,, +15404,64109,content://media/external/images/media/64109,/storage/emulated/0/DCIM/Camera/IMG_20220725_123424.jpg,image/jpeg,4608,2592,0,5373135,,1658745266,1658745266901,1658745264572,0,0,0,,,,,,,,,,, +15405,64101,content://media/external/images/media/64101,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220725-WA0001.jpg",image/jpeg,921,2048,0,380625,,1658734896,1658734896939,0,0,0,0,,,,,,,,,,, +15406,64098,content://media/external/images/media/64098,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220725-WA0000.jpg",image/jpeg,921,2048,0,276398,,1658734560,1658734560749,0,0,0,0,,,,,,,,,,, +15407,64085,content://media/external/images/media/64085,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220724-WA0008.jpg",image/jpeg,2000,1500,0,364292,,1658686882,1658686890086,0,0,0,0,,,,,,,,,,, +15408,64082,content://media/external/images/media/64082,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220724-WA0007.jpg",image/jpeg,768,1024,0,86390,,1658682156,1658682157614,0,0,0,0,,,,,,,,,,, +15409,64061,content://media/external/images/media/64061,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220724-WA0000.jpg",image/jpeg,1600,1200,0,227199,,1658624044,1658624044865,0,0,0,0,,,,,,,,,,, +15410,64053,content://media/external/images/media/64053,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220723-WA0011.jpg",image/jpeg,1600,738,0,169018,,1658597916,1658597917090,0,0,0,0,,,,,,,,,,, +15411,64050,content://media/external/images/media/64050,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220723-WA0010.jpg",image/jpeg,473,1024,0,117123,,1658595713,1658595714883,0,0,0,0,,,,,,,,,,, +15412,64032,content://media/external/images/media/64032,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-23-16-09-36-988_io.homeassistant.companion.android.jpg,image/jpeg,1080,2400,0,176704,,1658585377,1658585377080,0,0,0,0,,,,,,,,,,, +15413,64031,content://media/external/images/media/64031,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-23-16-09-01-912_io.homeassistant.companion.android.jpg,image/jpeg,1080,2400,0,188383,,1658585342,1658585342300,0,0,0,0,,,,,,,,,,, +15414,64029,content://media/external/images/media/64029,/storage/emulated/0/DCIM/Screenshots/IMG_20220723_141411.jpg,image/jpeg,1042,494,0,50764,,1658578451,1658578451563,0,0,0,0,,,,,,,,,,, +15415,64028,content://media/external/images/media/64028,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-23-14-13-34-769_io.homeassistant.companion.android.jpg,image/jpeg,1080,2400,0,268081,,1658578414,1658578414891,0,0,0,0,,,,,,,,,,, +15416,64025,content://media/external/images/media/64025,/storage/emulated/0/DCIM/Screenshots/IMG_20220723_130403.jpg,image/jpeg,1080,1520,0,488716,,1658574243,1658574243630,0,0,0,0,,,,,,,,,,, +15417,64019,content://media/external/images/media/64019,/storage/emulated/0/DCIM/Camera/IMG_20220723_093620.jpg,image/jpeg,2592,4608,0,4970479,,1658561781,1658561781739,1658561780431,0,0,0,,,,,,,,,,, +15418,64017,content://media/external/images/media/64017,/storage/emulated/0/DCIM/Camera/IMG_20220723_093617.jpg,image/jpeg,2592,4608,0,5055250,,1658561779,1658561779583,1658561777778,0,0,0,,,,,,,,,,, +15419,64015,content://media/external/images/media/64015,/storage/emulated/0/DCIM/Camera/IMG_20220723_093603.jpg,image/jpeg,2592,4608,0,4513383,,1658561765,1658561765327,1658561763906,0,0,0,,,,,,,,,,, +15420,64013,content://media/external/images/media/64013,/storage/emulated/0/DCIM/Camera/IMG_20220723_093555.jpg,image/jpeg,2592,4608,0,6642269,,1658561757,1658561757539,1658561755733,0,0,0,,,,,,,,,,, +15421,64011,content://media/external/images/media/64011,/storage/emulated/0/DCIM/Camera/IMG_20220723_093551.jpg,image/jpeg,2592,4608,0,6880092,,1658561753,1658561753639,1658561751905,0,0,0,,,,,,,,,,, +15422,64001,content://media/external/images/media/64001,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0008.jpg",image/jpeg,1504,1128,0,228397,,1658498530,1658498531233,0,0,0,0,,,,,,,,,,, +15423,63999,content://media/external/images/media/63999,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-22-15-13-01-212_com.android.chrome.jpg,image/jpeg,1080,2400,0,681311,,1658495581,1658495581383,0,0,0,0,,,,,,,,,,, +15424,63996,content://media/external/images/media/63996,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0006.jpg",image/jpeg,1128,1504,0,172558,,1658492074,1658492075560,0,0,0,0,,,,,,,,,,, +15425,63993,content://media/external/images/media/63993,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0005.jpg",image/jpeg,2048,1532,0,529892,,1658484771,1658484773030,0,0,0,0,,,,,,,,,,, +15426,63984,content://media/external/images/media/63984,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0004.jpg",image/jpeg,1599,899,0,186105,,1658475680,1658475681847,0,0,0,0,,,,,,,,,,, +15427,63969,content://media/external/images/media/63969,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0002.jpg",image/jpeg,1504,1128,0,173133,,1658469963,1658469964358,0,0,0,0,,,,,,,,,,, +15428,63953,content://media/external/images/media/63953,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220721-WA0013.jpeg",image/jpeg,3840,2160,0,1074058,,1658419215,1658419215297,1658419215195,0,0,0,,,,,,,,,,, +15429,63921,content://media/external/images/media/63921,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-21-15-34-56-433_com.brightstripe.parcels.jpg,image/jpeg,1080,2400,0,416845,,1658410496,1658410496829,0,0,0,0,,,,,,,,,,, +15430,63893,content://media/external/images/media/63893,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220721-WA0005.jpg",image/jpeg,1080,1440,0,162565,,1658405074,1658405076161,0,0,0,0,,,,,,,,,,, +15431,63891,content://media/external/images/media/63891,/storage/emulated/0/DCIM/Camera/IMG_20220721_134452.jpg,image/jpeg,4608,2592,0,4551011,,1658403895,1658403895862,1658403892963,0,0,0,,,,,,,,,,, +15432,63886,content://media/external/images/media/63886,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220721-WA0003.jpg",image/jpeg,1080,1398,0,139480,,1658402154,1658402155506,0,0,0,0,,,,,,,,,,, +15433,63880,content://media/external/images/media/63880,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220721-WA0002.jpg",image/jpeg,921,2048,0,176041,,1658394481,1658394482441,0,0,0,0,,,,,,,,,,, +15434,63872,content://media/external/images/media/63872,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-21-09-27-07-109_com.google.android.apps.messaging.jpg,image/jpeg,1080,2400,0,408504,,1658388427,1658388427237,0,0,0,0,,,,,,,,,,, +15435,63864,content://media/external/images/media/63864,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-20-21-06-07-538_lockscreen.jpg,image/jpeg,1080,2400,0,494029,,1658343967,1658343968039,0,0,0,0,,,,,,,,,,, +15436,63708,content://media/external/images/media/63708,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220718-WA0000.jpg",image/jpeg,1532,2048,0,223530,,1658097656,1658343906568,0,0,0,0,,,,,,,,,,, +15437,63861,content://media/external/images/media/63861,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0007.jpg",image/jpeg,1080,1405,0,114783,,1658341844,1658341845247,0,0,0,0,,,,,,,,,,, +15438,63855,content://media/external/images/media/63855,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0006.jpg",image/jpeg,508,600,0,40931,,1658340768,1658340768554,0,0,0,0,,,,,,,,,,, +15439,63853,content://media/external/images/media/63853,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220218-WA0005.jpg",image/jpeg,1080,757,0,74087,,1658327672,1658327672294,0,0,0,0,,,,,,,,,,, +15440,63850,content://media/external/images/media/63850,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0005.jpg",image/jpeg,1200,1600,0,128767,,1658317779,1658317779698,0,0,0,0,,,,,,,,,,, +15441,63847,content://media/external/images/media/63847,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0004.jpg",image/jpeg,2048,1805,0,228116,,1658313491,1658313492274,0,0,0,0,,,,,,,,,,, +15442,63816,content://media/external/images/media/63816,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0002.jpg",image/jpeg,720,1600,0,49788,,1658304234,1658304235091,0,0,0,0,,,,,,,,,,, +15443,63795,content://media/external/images/media/63795,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0000.jpg",image/jpeg,1080,1269,0,74543,,1658296573,1658296574068,0,0,0,0,,,,,,,,,,, +15444,63787,content://media/external/images/media/63787,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-19-11-18-39-818_com.whatsapp.jpg,image/jpeg,1080,2400,0,701656,,1658222320,1658222320230,0,0,0,0,,,,,,,,,,, +15445,63785,content://media/external/images/media/63785,/storage/emulated/0/DCIM/Screenshots/IMG_20220719_111659.jpg,image/jpeg,1080,1038,0,142592,,1658222219,1658222219790,0,0,0,0,,,,,,,,,,, +15446,63779,content://media/external/images/media/63779,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-19-09-55-44-155_it.subito.jpg,image/jpeg,1080,2400,0,410537,,1658217344,1658217344599,0,0,0,0,,,,,,,,,,, +15447,63768,content://media/external/images/media/63768,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-19-09-29-50-754_com.google.android.gm.jpg,image/jpeg,1080,2400,0,369026,,1658215791,1658215791128,0,0,0,0,,,,,,,,,,, +15448,63752,content://media/external/images/media/63752,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220718-WA0009.jpg",image/jpeg,2048,1536,0,325107,,1658174442,1658174444935,0,0,0,0,,,,,,,,,,, +15449,63739,content://media/external/images/media/63739,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-18-20-18-52-236_com.facebook.katana.jpg,image/jpeg,1080,2400,0,781284,,1658168332,1658168332710,0,0,0,0,,,,,,,,,,, +15450,63690,content://media/external/images/media/63690,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-17-10-52-20-354_com.dopa.android.blevo.jpg,image/jpeg,1080,2400,0,452704,,1658047940,1658047940863,0,0,0,0,,,,,,,,,,, +15451,63619,content://media/external/images/media/63619,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0010.jpg",image/jpeg,1024,768,0,119407,,1657957272,1657957272802,0,0,0,0,,,,,,,,,,, +15452,63616,content://media/external/images/media/63616,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0009.jpg",image/jpeg,1024,768,0,113780,,1657957256,1657957257369,0,0,0,0,,,,,,,,,,, +15453,63610,content://media/external/images/media/63610,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0007.jpg",image/jpeg,2048,1536,0,429108,,1657957224,1657957226005,0,0,0,0,,,,,,,,,,, +15454,63613,content://media/external/images/media/63613,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0008.jpg",image/jpeg,2048,1536,0,431554,,1657957226,1657957226236,0,0,0,0,,,,,,,,,,, +15455,63604,content://media/external/images/media/63604,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0005.jpg",image/jpeg,2048,1536,0,426303,,1657957223,1657957224318,0,0,0,0,,,,,,,,,,, +15456,63607,content://media/external/images/media/63607,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0006.jpg",image/jpeg,2048,1536,0,433873,,1657957224,1657957224706,0,0,0,0,,,,,,,,,,, +15457,63601,content://media/external/images/media/63601,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0004.jpg",image/jpeg,2048,1536,0,430588,,1657957223,1657957223915,0,0,0,0,,,,,,,,,,, +15458,63595,content://media/external/images/media/63595,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0002.jpg",image/jpeg,2048,1536,0,404374,,1657957185,1657957186132,0,0,0,0,,,,,,,,,,, +15459,63598,content://media/external/images/media/63598,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0003.jpg",image/jpeg,2048,1536,0,227828,,1657957186,1657957186485,0,0,0,0,,,,,,,,,,, +15460,63592,content://media/external/images/media/63592,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0001.jpg",image/jpeg,2048,1536,0,368394,,1657957185,1657957185633,0,0,0,0,,,,,,,,,,, +15461,63590,content://media/external/images/media/63590,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-16-09-27-20-603_com.android.chrome.jpg,image/jpeg,1080,2400,0,738100,,1657956440,1657956440968,0,0,0,0,,,,,,,,,,, +15462,63580,content://media/external/images/media/63580,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220715-WA0009.jpg",image/jpeg,1544,1600,0,345017,,1657913918,1657913919703,0,0,0,0,,,,,,,,,,, +15463,63558,content://media/external/images/media/63558,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220715-WA0003.jpg",image/jpeg,1599,899,0,66398,,1657868065,1657868066348,0,0,0,0,,,,,,,,,,, +15464,63552,content://media/external/images/media/63552,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220715-WA0000.jpg",image/jpeg,1080,1435,0,120583,,1657863906,1657863908087,0,0,0,0,,,,,,,,,,, +15465,63542,content://media/external/images/media/63542,/storage/emulated/0/DCIM/Screenshots/IMG_20220714_232212.jpg,image/jpeg,1071,1100,0,228685,,1657833732,1657833732451,0,0,0,0,,,,,,,,,,, +15466,63541,content://media/external/images/media/63541,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-14-23-21-35-283_com.strava.jpg,image/jpeg,1080,2400,0,654507,,1657833695,1657833695519,0,0,0,0,,,,,,,,,,, +15467,63521,content://media/external/images/media/63521,/storage/emulated/0/DCIM/Camera/IMG_20220714_204209.jpg,image/jpeg,3200,1800,0,3482352,,1657824130,1657824130872,1657824129684,0,0,0,,,,,,,,,,, +15468,63519,content://media/external/images/media/63519,/storage/emulated/0/DCIM/Camera/IMG_20220714_204203.jpg,image/jpeg,3200,1800,0,3390532,,1657824126,1657824126796,1657824123663,0,0,0,,,,,,,,,,, +15469,63508,content://media/external/images/media/63508,/storage/emulated/0/DCIM/Camera/IMG_20220714_185609.jpg,image/jpeg,2880,5120,0,4935049,,1657817772,1657817772440,1657817770190,0,0,0,,,,,,,,,,, +15470,63504,content://media/external/images/media/63504,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0008.jpg",image/jpeg,921,2048,0,168195,,1657812243,1657812244909,0,0,0,0,,,,,,,,,,, +15471,63502,content://media/external/images/media/63502,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-14-16-48-23-243_com.whatsapp.jpg,image/jpeg,1080,2400,0,785767,,1657810103,1657810103750,0,0,0,0,,,,,,,,,,, +15472,63497,content://media/external/images/media/63497,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0006.jpg",image/jpeg,1532,2048,0,318125,,1657799588,1657799607181,0,0,0,0,,,,,,,,,,, +15473,63494,content://media/external/images/media/63494,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0005.jpg",image/jpeg,921,2048,0,206271,,1657798410,1657798411757,0,0,0,0,,,,,,,,,,, +15474,63491,content://media/external/images/media/63491,/storage/emulated/0/DCIM/Camera/IMG_20220714_125043.jpg,image/jpeg,2592,4608,0,4571221,,1657795846,1657795846034,1657795843669,0,0,0,,,,,,,,,,, +15475,63488,content://media/external/images/media/63488,/storage/emulated/0/DCIM/Camera/IMG_20220714_123009.jpg,image/jpeg,2592,4608,0,4332548,,1657794612,1657794612314,1657794609946,0,0,0,,,,,,,,,,, +15476,63482,content://media/external/images/media/63482,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0001.jpg",image/jpeg,921,2048,0,92539,,1657785929,1657785930103,0,0,0,0,,,,,,,,,,, +15477,63485,content://media/external/images/media/63485,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0002.jpg",image/jpeg,921,2048,0,86875,,1657785930,1657785930797,0,0,0,0,,,,,,,,,,, +15478,63479,content://media/external/images/media/63479,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0000.jpg",image/jpeg,921,2048,0,163807,,1657785926,1657785929391,0,0,0,0,,,,,,,,,,, +15479,63466,content://media/external/images/media/63466,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0018.jpg",image/jpeg,1600,1200,0,165258,,1657741110,1657741111386,0,0,0,0,,,,,,,,,,, +15480,63461,content://media/external/images/media/63461,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0016.jpg",image/jpeg,899,1599,0,84478,,1657740036,1657740041669,0,0,0,0,,,,,,,,,,, +15481,63448,content://media/external/images/media/63448,/storage/emulated/0/DCIM/Camera/IMG_20220713_182705.jpg,image/jpeg,2592,4608,0,5185367,,1657729628,1657729628544,1657729625419,0,0,0,,,,,,,,,,, +15482,63441,content://media/external/images/media/63441,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-13-16-25-35-102_com.whatsapp.jpg,image/jpeg,1080,2400,0,898523,,1657722335,1657722335393,0,0,0,0,,,,,,,,,,, +15483,63435,content://media/external/images/media/63435,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0009.jpg",image/jpeg,2048,1532,0,300698,,1657721864,1657721865335,0,0,0,0,,,,,,,,,,, +15484,63421,content://media/external/images/media/63421,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0002.jpg",image/jpeg,828,1792,0,210884,,1657719173,1657719174185,0,0,0,0,,,,,,,,,,, +15485,63418,content://media/external/images/media/63418,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0001.jpg",image/jpeg,1080,1920,0,270642,,1657719157,1657719158382,0,0,0,0,,,,,,,,,,, +15486,63406,content://media/external/images/media/63406,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0000.jpg",image/jpeg,921,2048,0,167382,,1657708355,1657708356603,0,0,0,0,,,,,,,,,,, +15487,63396,content://media/external/images/media/63396,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220712-WA0008.jpg",image/jpeg,1581,1600,0,362107,,1657654789,1657654805400,0,0,0,0,,,,,,,,,,, +15488,63383,content://media/external/images/media/63383,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220712-WA0006.jpg",image/jpeg,2048,1532,0,413373,,1657628905,1657628906987,0,0,0,0,,,,,,,,,,, +15489,63349,content://media/external/images/media/63349,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220711-WA0003.jpg",image/jpeg,1504,1128,0,78347,,1657554282,1657554283051,0,0,0,0,,,,,,,,,,, +15490,63343,content://media/external/images/media/63343,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220711-WA0000.jpg",image/jpeg,1024,1024,0,89692,,1657520828,1657520828334,0,0,0,0,,,,,,,,,,, +15491,63332,content://media/external/images/media/63332,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220710-WA0042.jpg",image/jpeg,620,413,0,46139,,1657462338,1657462339372,0,0,0,0,,,,,,,,,,, +15492,63330,content://media/external/images/media/63330,/storage/emulated/0/DCIM/Camera/IMG_20220710_160725.jpg,image/jpeg,3177,2144,0,2430478,,1657462048,1657462048207,1657462047609,0,0,0,,,,,,,,,,, +15493,63328,content://media/external/images/media/63328,/storage/emulated/0/DCIM/Camera/IMG_20220710_152656.jpg,image/jpeg,4608,2592,0,4775694,,1657459621,1657459621207,1657459617100,0,0,0,,,,,,,,,,, +15494,63325,content://media/external/images/media/63325,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0041.jpg",image/jpeg,1080,1074,0,175808,,1657444613,1657444613940,0,0,0,0,,,,,,,,,,, +15495,63313,content://media/external/images/media/63313,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0036.jpg",image/jpeg,1532,2048,0,807045,,1657438067,1657438068414,0,0,0,0,,,,,,,,,,, +15496,63310,content://media/external/images/media/63310,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0035.jpg",image/jpeg,1532,2048,0,759851,,1657438066,1657438067495,0,0,0,0,,,,,,,,,,, +15497,63307,content://media/external/images/media/63307,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0034.jpg",image/jpeg,1532,2048,0,700811,,1657438066,1657438066502,0,0,0,0,,,,,,,,,,, +15498,63301,content://media/external/images/media/63301,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0032.jpg",image/jpeg,2048,1532,0,491818,,1657438064,1657438065470,0,0,0,0,,,,,,,,,,, +15499,63304,content://media/external/images/media/63304,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0033.jpg",image/jpeg,1200,1600,0,251534,,1657438065,1657438065998,0,0,0,0,,,,,,,,,,, +15500,63298,content://media/external/images/media/63298,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0031.jpg",image/jpeg,1532,2048,0,660021,,1657438063,1657438064757,0,0,0,0,,,,,,,,,,, +15501,63292,content://media/external/images/media/63292,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0029.jpg",image/jpeg,1200,1600,0,393126,,1657438062,1657438063179,0,0,0,0,,,,,,,,,,, +15502,63295,content://media/external/images/media/63295,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0030.jpg",image/jpeg,1532,2048,0,723412,,1657438063,1657438063837,0,0,0,0,,,,,,,,,,, +15503,63289,content://media/external/images/media/63289,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0028.jpg",image/jpeg,1200,1600,0,179176,,1657438061,1657438062254,0,0,0,0,,,,,,,,,,, +15504,63286,content://media/external/images/media/63286,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0027.jpg",image/jpeg,1200,1600,0,367718,,1657438060,1657438061578,0,0,0,0,,,,,,,,,,, +15505,63277,content://media/external/images/media/63277,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0024.jpg",image/jpeg,1600,1200,0,219244,,1657438059,1657438060110,0,0,0,0,,,,,,,,,,, +15506,63280,content://media/external/images/media/63280,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0025.jpg",image/jpeg,1600,1200,0,237428,,1657438060,1657438060695,0,0,0,0,,,,,,,,,,, +15507,63283,content://media/external/images/media/63283,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0026.jpg",image/jpeg,1200,1600,0,419492,,1657438060,1657438060992,0,0,0,0,,,,,,,,,,, +15508,63271,content://media/external/images/media/63271,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0022.jpg",image/jpeg,1600,1200,0,381988,,1657438058,1657438059591,0,0,0,0,,,,,,,,,,, +15509,63274,content://media/external/images/media/63274,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0023.jpg",image/jpeg,1187,1599,0,161506,,1657438059,1657438059955,0,0,0,0,,,,,,,,,,, +15510,63268,content://media/external/images/media/63268,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0021.jpg",image/jpeg,1600,1200,0,213725,,1657438058,1657438058821,0,0,0,0,,,,,,,,,,, +15511,63261,content://media/external/images/media/63261,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0019.jpg",image/jpeg,2048,1532,0,346579,,1657438005,1657438006036,0,0,0,0,,,,,,,,,,, +15512,63258,content://media/external/images/media/63258,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0018.jpg",image/jpeg,2048,1532,0,400237,,1657438004,1657438005399,0,0,0,0,,,,,,,,,,, +15513,63252,content://media/external/images/media/63252,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0016.jpg",image/jpeg,1532,2048,0,358171,,1657438003,1657438004013,0,0,0,0,,,,,,,,,,, +15514,63255,content://media/external/images/media/63255,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0017.jpg",image/jpeg,2048,1532,0,462910,,1657438004,1657438004744,0,0,0,0,,,,,,,,,,, +15515,63249,content://media/external/images/media/63249,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0015.jpg",image/jpeg,1532,2048,0,314818,,1657438002,1657438003272,0,0,0,0,,,,,,,,,,, +15516,63246,content://media/external/images/media/63246,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0014.jpg",image/jpeg,2048,1532,0,297397,,1657438001,1657438002323,0,0,0,0,,,,,,,,,,, +15517,63243,content://media/external/images/media/63243,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0013.jpg",image/jpeg,2048,1532,0,852877,,1657438000,1657438001534,0,0,0,0,,,,,,,,,,, +15518,63240,content://media/external/images/media/63240,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0012.jpg",image/jpeg,1532,2048,0,597255,,1657437999,1657438000662,0,0,0,0,,,,,,,,,,, +15519,63234,content://media/external/images/media/63234,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0010.jpg",image/jpeg,1532,2048,0,690395,,1657437997,1657437999131,0,0,0,0,,,,,,,,,,, +15520,63237,content://media/external/images/media/63237,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0011.jpg",image/jpeg,1532,2048,0,584181,,1657437999,1657437999735,0,0,0,0,,,,,,,,,,, +15521,63231,content://media/external/images/media/63231,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0009.jpg",image/jpeg,1532,2048,0,646909,,1657437996,1657437997583,0,0,0,0,,,,,,,,,,, +15522,63228,content://media/external/images/media/63228,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0008.jpg",image/jpeg,1532,2048,0,669504,,1657437995,1657437996656,0,0,0,0,,,,,,,,,,, +15523,63225,content://media/external/images/media/63225,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0007.jpg",image/jpeg,2048,1532,0,333534,,1657437995,1657437995859,0,0,0,0,,,,,,,,,,, +15524,63176,content://media/external/images/media/63176,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220709-WA0000.jpg",image/jpeg,1250,1250,0,259968,,1657353456,1657353457092,0,0,0,0,,,,,,,,,,, +15525,63167,content://media/external/images/media/63167,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-08-22-30-37-842_com.google.android.gm.jpg,image/jpeg,1080,2400,0,377328,,1657312238,1657312238230,0,0,0,0,,,,,,,,,,, +15526,63164,content://media/external/images/media/63164,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220708-WA0004.jpg",image/jpeg,738,1600,0,102071,,1657300721,1657300721948,0,0,0,0,,,,,,,,,,, +15527,63161,content://media/external/images/media/63161,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220708-WA0003.jpg",image/jpeg,700,700,0,65583,,1657294511,1657294559897,0,0,0,0,,,,,,,,,,, +15528,63150,content://media/external/images/media/63150,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-08-14-23-00-679_com.google.android.gm.jpg,image/jpeg,1080,2400,0,337318,,1657282981,1657282981077,0,0,0,0,,,,,,,,,,, +15529,63106,content://media/external/images/media/63106,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0007.jpg",image/jpeg,921,2048,0,173956,,1657209736,1657209742294,0,0,0,0,,,,,,,,,,, +15530,63096,content://media/external/images/media/63096,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0005.jpg",image/jpeg,1128,1600,0,82110,,1657201870,1657201871194,0,0,0,0,,,,,,,,,,, +15531,63084,content://media/external/images/media/63084,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0003.jpg",image/jpeg,1600,1200,0,571201,,1657189139,1657189141012,0,0,0,0,,,,,,,,,,, +15532,63081,content://media/external/images/media/63081,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0002.jpg",image/jpeg,1200,1600,0,207176,,1657189137,1657189138111,0,0,0,0,,,,,,,,,,, +15533,63078,content://media/external/images/media/63078,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0001.jpg",image/jpeg,1600,1200,0,301900,,1657189136,1657189137533,0,0,0,0,,,,,,,,,,, +15534,63075,content://media/external/images/media/63075,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0000.jpg",image/jpeg,921,2048,0,124368,,1657180162,1657180168321,0,0,0,0,,,,,,,,,,, +15535,63069,content://media/external/images/media/63069,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220706-WA0021.jpg",image/jpeg,720,1600,0,127459,,1657132191,1657132191967,0,0,0,0,,,,,,,,,,, +15536,63046,content://media/external/images/media/63046,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220706-WA0014.jpg",image/jpeg,1000,663,0,63078,,1657119424,1657119424757,0,0,0,0,,,,,,,,,,, +15537,63023,content://media/external/images/media/63023,/storage/emulated/0/DCIM/Screenshots/IMG_20220706_145016.jpg,image/jpeg,1080,2400,0,361982,,1657111816,1657111816162,0,0,0,0,,,,,,,,,,, +15538,63020,content://media/external/images/media/63020,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-06-14-48-52-324_com.google.android.gm.jpg,image/jpeg,1080,2400,0,298987,,1657111732,1657111732438,0,0,0,0,,,,,,,,,,, +15539,62982,content://media/external/images/media/62982,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220705-WA0006.jpg",image/jpeg,1600,1200,0,128240,,1657047983,1657047983692,0,0,0,0,,,,,,,,,,, +15540,62979,content://media/external/images/media/62979,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220705-WA0005.jpg",image/jpeg,1600,1200,0,129928,,1657047974,1657047975566,0,0,0,0,,,,,,,,,,, +15541,62976,content://media/external/images/media/62976,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220705-WA0004.jpg",image/jpeg,617,892,0,67677,,1657044936,1657044936634,0,0,0,0,,,,,,,,,,, +15542,62970,content://media/external/images/media/62970,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220705-WA0003.jpg",image/jpeg,636,1024,0,80631,,1657030852,1657030852301,0,0,0,0,,,,,,,,,,, +15543,62940,content://media/external/images/media/62940,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220704-WA0006.jpg",image/jpeg,2048,2048,0,689259,,1656950092,1656950092758,0,0,0,0,,,,,,,,,,, +15544,62921,content://media/external/images/media/62921,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220704-WA0000.jpg",image/jpeg,750,1334,0,60959,,1656929062,1656929063181,0,0,0,0,,,,,,,,,,, +15545,62917,content://media/external/images/media/62917,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-04-09-12-29-636_lockscreen.jpg,image/jpeg,1080,2400,0,805073,,1656918750,1656918750227,0,0,0,0,,,,,,,,,,, +15546,62907,content://media/external/images/media/62907,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220703-WA0016.jpg",image/jpeg,2048,1536,0,648210,,1656862711,1656862713146,0,0,0,0,,,,,,,,,,, +15547,62868,content://media/external/images/media/62868,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220703-WA0003.jpg",image/jpeg,960,720,0,85497,,1656847337,1656847337657,0,0,0,0,,,,,,,,,,, +15548,62858,content://media/external/images/media/62858,/storage/emulated/0/DCIM/Camera/IMG_20220703_113004.jpg,image/jpeg,2592,4608,0,4154051,,1656840608,1656840608384,1656840604731,0,0,0,,,,,,,,,,, +15549,62848,content://media/external/images/media/62848,/storage/emulated/0/DCIM/Camera/IMG_20220702_210527.jpg,image/jpeg,4608,2592,0,4905148,,1656788731,1656788731795,1656788729210,0,0,0,,,,,,,,,,, +15550,62845,content://media/external/images/media/62845,/storage/emulated/0/DCIM/Camera/IMG_20220702_210253.jpg,image/jpeg,2592,4608,0,5228053,,1656788578,1656788578835,1656788575463,0,0,0,,,,,,,,,,, +15551,62812,content://media/external/images/media/62812,/storage/emulated/0/Download/Soduto/1656768165956.jpg,image/jpeg,2592,4608,0,4539056,,1656768181,1656768182075,1656096489000,0,0,0,,,,,,,,,,, +15552,62811,content://media/external/images/media/62811,"/storage/emulated/0/Download/Soduto/greg diploma 2.png",image/png,1890,1345,0,2102678,,1656768044,1656768044368,0,0,0,0,,,,,,,,,,, +15553,62810,content://media/external/images/media/62810,/storage/emulated/0/Download/Soduto/1656763946908.jpg,image/jpeg,1352,904,0,313422,,1656768013,1656768013840,1656753557000,0,0,0,,,,,,,,,,, +15554,62803,content://media/external/images/media/62803,/storage/emulated/0/DCIM/Camera/IMG_20220702_135617.jpg,image/jpeg,1352,904,0,317969,,1656762977,1656762977556,1656753557281,0,0,0,,,,,,,,,,, +15555,62800,content://media/external/images/media/62800,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220702-WA0003.jpg",image/jpeg,720,1600,0,106819,,1656759042,1656759044858,0,0,0,0,,,,,,,,,,, +15556,62798,content://media/external/images/media/62798,/storage/emulated/0/DCIM/Camera/IMG_20220702_111917.jpg,image/jpeg,2592,4608,0,3290399,,1656753559,1656753559760,1656753557281,0,0,0,,,,,,,,,,, +15557,62794,content://media/external/images/media/62794,/storage/emulated/0/DCIM/Camera/IMG_20220702_111131.jpg,image/jpeg,2592,4608,0,3882924,,1656753094,1656753094070,1656753091926,0,0,0,,,,,,,,,,, +15558,62793,content://media/external/images/media/62793,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220702-WA0002.jpg",image/jpeg,1600,1138,0,330845,,1656748692,1656748693331,0,0,0,0,,,,,,,,,,, +15559,62790,content://media/external/images/media/62790,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220702-WA0001.jpg",image/jpeg,2048,2048,0,781474,,1656747037,1656747038403,0,0,0,0,,,,,,,,,,, +15560,62770,content://media/external/images/media/62770,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-01-19-26-35-778_com.android.chrome.jpg,image/jpeg,1080,2400,0,679381,,1656696396,1656696396215,0,0,0,0,,,,,,,,,,, +15561,62769,content://media/external/images/media/62769,/storage/emulated/0/DCIM/Creative/IMG_20220701_190239.jpg,image/jpeg,1190,803,0,535389,,1656694960,1656694960519,0,0,0,0,,,,,,,,,,, +15562,62728,content://media/external/images/media/62728,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220630-WA0004.jpg",image/jpeg,1600,1200,0,124538,,1656625294,1656625295058,0,0,0,0,,,,,,,,,,, +15563,62351,content://media/external/images/media/62351,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220625-WA0000.jpg",image/jpeg,2048,1532,0,193423,,1656141604,1656141604589,0,0,0,0,,,,,,,,,,, +15564,62334,content://media/external/images/media/62334,/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220624_192804.jpg,image/jpeg,999,1378,0,476162,,1656091684,1656091684827,1656080514000,0,0,0,,,,,,,,,,, +15565,62333,content://media/external/images/media/62333,/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220624_192520.jpg,image/jpeg,999,1378,0,432709,,1656091520,1656091520967,1656080514000,0,0,0,,,,,,,,,,, +15566,62332,content://media/external/images/media/62332,/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220624_192415.jpg,image/jpeg,1920,1440,0,789838,,1656091455,1656091455939,1656080514000,0,0,0,,,,,,,,,,, +15567,62331,content://media/external/images/media/62331,/storage/emulated/0/DCIM/GoPro-Exports/G0070646_1656090860527.jpg,image/jpeg,1920,1440,0,423019,,1656091070,1656091070251,1656080514000,0,0,0,,,,,,,,,,, +15568,62329,content://media/external/images/media/62329,/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220624_190120.jpg,image/jpeg,2970,1886,0,2061851,,1656090080,1656090081054,1656080612091,0,0,0,,,,,,,,,,, +15569,62246,content://media/external/images/media/62246,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0008.jpg",image/jpeg,1196,1600,0,427050,,1656078228,1656088418832,0,0,0,0,,,,,,,,,,, +15570,62273,content://media/external/images/media/62273,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0014.jpg",image/jpeg,1532,2048,0,452470,,1656082203,1656082204074,0,0,0,0,,,,,,,,,,, +15571,62267,content://media/external/images/media/62267,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0012.jpg",image/jpeg,1532,2048,0,433984,,1656082202,1656082203107,0,0,0,0,,,,,,,,,,, +15572,62270,content://media/external/images/media/62270,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0013.jpg",image/jpeg,1532,2048,0,439929,,1656082203,1656082203564,0,0,0,0,,,,,,,,,,, +15573,62264,content://media/external/images/media/62264,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0011.jpg",image/jpeg,2048,1532,0,465347,,1656082201,1656082202011,0,0,0,0,,,,,,,,,,, +15574,62261,content://media/external/images/media/62261,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0010.jpg",image/jpeg,2048,1532,0,449187,,1656082200,1656082200518,0,0,0,0,,,,,,,,,,, +15575,62243,content://media/external/images/media/62243,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0007.jpg",image/jpeg,2048,1532,0,353627,,1656077993,1656077994332,0,0,0,0,,,,,,,,,,, +15576,62240,content://media/external/images/media/62240,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0006.jpg",image/jpeg,2048,1532,0,400098,,1656077988,1656077988706,0,0,0,0,,,,,,,,,,, +15577,62154,content://media/external/images/media/62154,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0027.jpg",image/jpeg,1532,2048,0,274332,,1655998715,1655998715759,0,0,0,0,,,,,,,,,,, +15578,62147,content://media/external/images/media/62147,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0025.jpg",image/jpeg,2048,1532,0,514855,,1655998712,1655998713588,0,0,0,0,,,,,,,,,,, +15579,62144,content://media/external/images/media/62144,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0024.jpg",image/jpeg,1599,899,0,241535,,1655998461,1655998461799,0,0,0,0,,,,,,,,,,, +15580,62109,content://media/external/images/media/62109,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0019.jpg",image/jpeg,1080,1920,0,119040,,1655988543,1655988544058,0,0,0,0,,,,,,,,,,, +15581,62104,content://media/external/images/media/62104,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0018.jpg",image/jpeg,1080,1920,0,123463,,1655987684,1655987786653,0,0,0,0,,,,,,,,,,, +15582,62054,content://media/external/images/media/62054,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0010.jpg",image/jpeg,900,1600,0,132546,,1655977669,1655977670071,0,0,0,0,,,,,,,,,,, +15583,62051,content://media/external/images/media/62051,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0009.jpg",image/jpeg,1201,1600,0,359319,,1655977556,1655977557804,0,0,0,0,,,,,,,,,,, +15584,61998,content://media/external/images/media/61998,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0002.jpg",image/jpeg,2048,662,0,232979,,1655968153,1655968154189,0,0,0,0,,,,,,,,,,, +15585,61944,content://media/external/images/media/61944,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220621-WA0008.jpg",image/jpeg,1532,2048,0,289515,,1655837082,1655837083101,0,0,0,0,,,,,,,,,,, +15586,61848,content://media/external/images/media/61848,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220621-WA0002.jpg",image/jpeg,1294,516,0,94273,,1655814829,1655814830494,0,0,0,0,,,,,,,,,,, +15587,61721,content://media/external/images/media/61721,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220619-WA0026.jpg",image/jpeg,2048,1532,0,277732,,1655658591,1655658592725,0,0,0,0,,,,,,,,,,, +15588,61718,content://media/external/images/media/61718,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220619-WA0025.jpg",image/jpeg,1532,2048,0,176855,,1655658591,1655658591967,0,0,0,0,,,,,,,,,,, +15589,61681,content://media/external/images/media/61681,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220619-WA0009.jpg",image/jpeg,1600,1197,0,288164,,1655642434,1655642434824,0,0,0,0,,,,,,,,,,, +15590,61676,content://media/external/images/media/61676,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220619-WA0007.jpg",image/jpeg,899,1599,0,389489,,1655642380,1655642384905,0,0,0,0,,,,,,,,,,, +15591,61673,content://media/external/images/media/61673,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220619-WA0006.jpg",image/jpeg,1197,1600,0,276899,,1655642339,1655642341688,0,0,0,0,,,,,,,,,,, +15592,61625,content://media/external/images/media/61625,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220619-WA0000.jpg",image/jpeg,2048,1532,0,516584,,1655628473,1655628474073,0,0,0,0,,,,,,,,,,, +15593,61585,content://media/external/images/media/61585,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0032.jpg",image/jpeg,1532,2048,0,386116,,1655581315,1655582741721,0,0,0,0,,,,,,,,,,, +15594,61588,content://media/external/images/media/61588,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0033.jpg",image/jpeg,1532,2048,0,308992,,1655581316,1655582741671,0,0,0,0,,,,,,,,,,, +15595,61591,content://media/external/images/media/61591,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0034.jpg",image/jpeg,1532,2048,0,355413,,1655581317,1655582741607,0,0,0,0,,,,,,,,,,, +15596,61579,content://media/external/images/media/61579,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0030.jpg",image/jpeg,2048,1532,0,332780,,1655581313,1655582740701,0,0,0,0,,,,,,,,,,, +15597,61582,content://media/external/images/media/61582,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0031.jpg",image/jpeg,2048,1532,0,331155,,1655581314,1655582740809,0,0,0,0,,,,,,,,,,, +15598,61594,content://media/external/images/media/61594,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0035.jpg",image/jpeg,2048,1532,0,351278,,1655581318,1655582740917,0,0,0,0,,,,,,,,,,, +15599,61524,content://media/external/images/media/61524,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0013.jpg",image/jpeg,1600,993,0,231059,,1655555063,1655555064483,0,0,0,0,,,,,,,,,,, +15600,61488,content://media/external/images/media/61488,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0002.jpg",image/jpeg,899,1599,0,87378,,1655539205,1655539206168,0,0,0,0,,,,,,,,,,, +15601,61471,content://media/external/images/media/61471,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0021.jpg",image/jpeg,1496,1496,0,217484,,1655497882,1655497883483,0,0,0,0,,,,,,,,,,, +15602,61468,content://media/external/images/media/61468,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0020.jpg",image/jpeg,1201,1600,0,246258,,1655495938,1655495940549,0,0,0,0,,,,,,,,,,, +15603,61465,content://media/external/images/media/61465,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0019.jpg",image/jpeg,1599,899,0,136121,,1655493605,1655493606257,0,0,0,0,,,,,,,,,,, +15604,61464,content://media/external/images/media/61464,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0018.jpg",image/jpeg,1600,1201,0,237681,,1655493532,1655493532424,0,0,0,0,,,,,,,,,,, +15605,61458,content://media/external/images/media/61458,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0016.jpg",image/jpeg,923,1600,0,129013,,1655493478,1655493479180,0,0,0,0,,,,,,,,,,, +15606,61455,content://media/external/images/media/61455,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0015.jpg",image/jpeg,1600,1152,0,244987,,1655493029,1655493030467,0,0,0,0,,,,,,,,,,, +15607,61449,content://media/external/images/media/61449,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0013.jpg",image/jpeg,1296,970,0,171832,,1655493000,1655493001263,0,0,0,0,,,,,,,,,,, +15608,61452,content://media/external/images/media/61452,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0014.jpg",image/jpeg,1201,1600,0,175244,,1655493001,1655493001839,0,0,0,0,,,,,,,,,,, +15609,61442,content://media/external/images/media/61442,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0011.jpg",image/jpeg,735,960,0,46041,,1655490902,1655490903043,0,0,0,0,,,,,,,,,,, +15610,61439,content://media/external/images/media/61439,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0010.jpg",image/jpeg,1296,970,0,189340,,1655488350,1655488354223,0,0,0,0,,,,,,,,,,, +15611,61297,content://media/external/images/media/61297,/storage/emulated/0/DCIM/GoPro-Exports/G0040555_1655467634509_2.JPG,image/jpeg,4000,3000,0,2377689,,1655471732,1655471732620,1655062886000,0,0,0,,,,,,,,,,, +15612,61295,content://media/external/images/media/61295,/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220617_150655.jpg,image/jpeg,4000,3000,0,3957577,,1655471215,1655471215735,1655062886074,0,0,0,,,,,,,,,,, +15613,61294,content://media/external/images/media/61294,/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220617_150442.jpg,image/jpeg,4000,3000,0,3884808,,1655471083,1655471083271,1655062886074,0,0,0,,,,,,,,,,, +15614,61293,content://media/external/images/media/61293,/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220617_150336.jpg,image/jpeg,4000,3000,0,4158657,,1655471017,1655471017155,1655062886000,0,0,0,,,,,,,,,,, +15615,61292,content://media/external/images/media/61292,/storage/emulated/0/DCIM/GoPro-Exports/G0040555_1655467634509.JPG,image/jpeg,4000,3000,0,2377689,,1655470910,1655470910755,1655062886000,0,0,0,,,,,,,,,,, +15616,61289,content://media/external/images/media/61289,/storage/emulated/0/DCIM/GoPro-Exports/G0040551_1655467634509.JPG,image/jpeg,4000,3000,0,2327671,,1655470763,1655470763715,1655062886074,0,0,0,,,,,,,,,,, +15617,61244,content://media/external/images/media/61244,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0012.jpg",image/jpeg,2000,1500,0,405354,,1655384811,1655384812666,0,0,0,0,,,,,,,,,,, +15618,61241,content://media/external/images/media/61241,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0011.jpg",image/jpeg,2000,1500,0,413807,,1655384810,1655384811460,0,0,0,0,,,,,,,,,,, +15619,61238,content://media/external/images/media/61238,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0010.jpg",image/jpeg,2000,1500,0,424635,,1655384809,1655384810251,0,0,0,0,,,,,,,,,,, +15620,61235,content://media/external/images/media/61235,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0009.jpg",image/jpeg,2000,1500,0,420395,,1655384807,1655384809211,0,0,0,0,,,,,,,,,,, +15621,61232,content://media/external/images/media/61232,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0008.jpg",image/jpeg,1716,1447,0,303016,,1655384806,1655384807951,0,0,0,0,,,,,,,,,,, +15622,61229,content://media/external/images/media/61229,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0007.jpg",image/jpeg,2000,1500,0,379397,,1655384805,1655384806916,0,0,0,0,,,,,,,,,,, +15623,61226,content://media/external/images/media/61226,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0006.jpg",image/jpeg,2000,1500,0,405977,,1655384804,1655384805940,0,0,0,0,,,,,,,,,,, +15624,61220,content://media/external/images/media/61220,/storage/emulated/0/DCIM/Camera/IMG_20220616_150201.jpg,image/jpeg,4608,2592,0,3866827,,1655384524,1655384524277,1655384521478,0,0,0,,,,,,,,,,, +15625,61217,content://media/external/images/media/61217,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0004.jpg",image/jpeg,899,1599,0,101194,,1655379420,1655379421283,0,0,0,0,,,,,,,,,,, +15626,61214,content://media/external/images/media/61214,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0003.jpg",image/jpeg,899,1599,0,135104,,1655379014,1655379015059,0,0,0,0,,,,,,,,,,, +15627,61178,content://media/external/images/media/61178,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220615-WA0105.jpg",image/jpeg,633,680,0,53299,,1655319281,1655319282204,0,0,0,0,,,,,,,,,,, +15628,61176,content://media/external/images/media/61176,/storage/emulated/0/DCIM/Camera/IMG_20220615_202546.jpg,image/jpeg,4608,2592,0,6224167,,1655317549,1655317549619,1655317546979,0,0,0,,,,,,,,,,, +15629,61162,content://media/external/images/media/61162,/storage/emulated/0/DCIM/Camera/IMG_20220615_192417.jpg,image/jpeg,4608,2592,0,4198440,,1655313858,1655313858482,1655313857106,0,0,0,,,,,,,,,,, +15630,61160,content://media/external/images/media/61160,/storage/emulated/0/DCIM/Camera/IMG_20220615_192410.jpg,image/jpeg,4608,2592,0,4271626,,1655313852,1655313852338,1655313850750,0,0,0,,,,,,,,,,, +15631,61158,content://media/external/images/media/61158,/storage/emulated/0/DCIM/Camera/IMG_20220615_192236.jpg,image/jpeg,4608,2592,0,5796562,,1655313758,1655313758190,1655313756274,0,0,0,,,,,,,,,,, +15632,61156,content://media/external/images/media/61156,/storage/emulated/0/DCIM/Camera/IMG_20220615_192233.jpg,image/jpeg,4608,2592,0,5809399,,1655313756,1655313756378,1655313753267,0,0,0,,,,,,,,,,, +15633,60596,content://media/external/images/media/60596,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0057.jpg",image/jpeg,1024,768,0,127568,,1655147851,1655309089789,0,0,0,0,,,,,,,,,,, +15634,60599,content://media/external/images/media/60599,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0058.jpg",image/jpeg,1024,768,0,124780,,1655147934,1655308654166,0,0,0,0,,,,,,,,,,, +15635,60888,content://media/external/images/media/60888,/storage/emulated/0/Download/InsMate/profile_42403120_1176292779190197_5464748050482200576_n.jpg,image/jpeg,150,150,0,5082,,1655299976,1655299976398,0,0,0,0,,,,,,,,,,, +15636,60889,content://media/external/images/media/60889,/storage/emulated/0/Download/InsMate/cover_286287402_169236282177023_8220648733451645970_n.jpg,image/jpeg,720,406,0,41871,,1655299976,1655299976402,0,0,0,0,,,,,,,,,,, +15637,60885,content://media/external/images/media/60885,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220615-WA0016.jpg",image/jpeg,921,2048,0,149007,,1655292931,1655292932042,0,0,0,0,,,,,,,,,,, +15638,60880,content://media/external/images/media/60880,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-15-12-39-09-254_com.ilmeteo.android.ilmeteo.jpg,image/jpeg,1080,2400,0,881234,,1655289549,1655289549602,0,0,0,0,,,,,,,,,,, +15639,60848,content://media/external/images/media/60848,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220615-WA0003.jpg",image/jpeg,1920,1080,0,155200,,1655281428,1655281429206,0,0,0,0,,,,,,,,,,, +15640,60844,content://media/external/images/media/60844,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220615-WA0001.jpg",image/jpeg,1132,1600,0,159597,,1655276156,1655276156773,0,0,0,0,,,,,,,,,,, +15641,60842,content://media/external/images/media/60842,/storage/emulated/0/DCIM/Screenshots/IMG_20220615_082301.jpg,image/jpeg,1080,1402,0,379915,,1655274181,1655274181139,0,0,0,0,,,,,,,,,,, +15642,60816,content://media/external/images/media/60816,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0062.jpg",image/jpeg,1024,768,0,122212,,1655242526,1655242530604,0,0,0,0,,,,,,,,,,, +15643,60684,content://media/external/images/media/60684,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0018.jpg",image/jpeg,806,300,0,73852,,1655234990,1655234990764,0,0,0,0,,,,,,,,,,, +15644,60682,content://media/external/images/media/60682,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0017.jpg",image/jpeg,464,232,0,22548,,1655234904,1655234906184,0,0,0,0,,,,,,,,,,, +15645,60675,content://media/external/images/media/60675,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0015.jpg",image/jpeg,1536,2048,0,894067,,1655220405,1655220406365,0,0,0,0,,,,,,,,,,, +15646,60669,content://media/external/images/media/60669,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-14-16-25-50-730_com.mi.globalbrowser.jpg,image/jpeg,1080,2400,0,1268243,,1655216751,1655216751121,0,0,0,0,,,,,,,,,,, +15647,60658,content://media/external/images/media/60658,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0008.jpg",image/jpeg,1280,905,0,115691,,1655210712,1655210713211,0,0,0,0,,,,,,,,,,, +15648,60656,content://media/external/images/media/60656,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-14-14-03-44-739_com.ilmeteo.android.ilmeteo.jpg,image/jpeg,1080,2400,0,1005604,,1655208225,1655208225193,0,0,0,0,,,,,,,,,,, +15649,60653,content://media/external/images/media/60653,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-14-14-02-55-494_com.ilmeteo.android.ilmeteo.jpg,image/jpeg,1080,2400,0,1019494,,1655208175,1655208175837,0,0,0,0,,,,,,,,,,, +15650,60650,content://media/external/images/media/60650,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0005.jpg",image/jpeg,921,2048,0,111342,,1655205173,1655205173958,0,0,0,0,,,,,,,,,,, +15651,60643,content://media/external/images/media/60643,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0003.jpg",image/jpeg,1200,1600,0,120724,,1655193129,1655193130156,0,0,0,0,,,,,,,,,,, +15652,60640,content://media/external/images/media/60640,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0002.jpg",image/jpeg,1500,2000,0,191818,,1655190889,1655190890405,0,0,0,0,,,,,,,,,,, +15653,60639,content://media/external/images/media/60639,/storage/emulated/0/DCIM/Screenshots/IMG_20220614_082140.jpg,image/jpeg,1080,2400,0,482494,,1655187700,1655187700137,0,0,0,0,,,,,,,,,,, +15654,60586,content://media/external/images/media/60586,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0055.jpg",image/jpeg,608,331,0,12953,,1655140040,1655140040208,0,0,0,0,,,,,,,,,,, +15655,60523,content://media/external/images/media/60523,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0037.jpg",image/jpeg,2000,1500,0,259838,,1655125414,1655125415111,0,0,0,0,,,,,,,,,,, +15656,60520,content://media/external/images/media/60520,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0036.jpg",image/jpeg,2000,1500,0,280548,,1655125414,1655125414860,0,0,0,0,,,,,,,,,,, +15657,60505,content://media/external/images/media/60505,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0032.jpg",image/jpeg,1500,2000,0,254770,,1655125395,1655125396295,0,0,0,0,,,,,,,,,,, +15658,60496,content://media/external/images/media/60496,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0029.jpg",image/jpeg,2000,1500,0,311601,,1655125394,1655125395154,0,0,0,0,,,,,,,,,,, +15659,60499,content://media/external/images/media/60499,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0030.jpg",image/jpeg,2000,1500,0,277853,,1655125395,1655125395472,0,0,0,0,,,,,,,,,,, +15660,60502,content://media/external/images/media/60502,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0031.jpg",image/jpeg,2000,1500,0,243271,,1655125395,1655125395764,0,0,0,0,,,,,,,,,,, +15661,60493,content://media/external/images/media/60493,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0028.jpg",image/jpeg,2000,1500,0,351030,,1655125394,1655125394851,0,0,0,0,,,,,,,,,,, +15662,60486,content://media/external/images/media/60486,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0026.jpg",image/jpeg,1500,2000,0,271437,,1655125384,1655125385084,0,0,0,0,,,,,,,,,,, +15663,60477,content://media/external/images/media/60477,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0023.jpg",image/jpeg,2000,1500,0,275708,,1655125383,1655125384029,0,0,0,0,,,,,,,,,,, +15664,60480,content://media/external/images/media/60480,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0024.jpg",image/jpeg,2000,1500,0,275433,,1655125384,1655125384245,0,0,0,0,,,,,,,,,,, +15665,60483,content://media/external/images/media/60483,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0025.jpg",image/jpeg,2000,1500,0,285767,,1655125384,1655125384634,0,0,0,0,,,,,,,,,,, +15666,60468,content://media/external/images/media/60468,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0020.jpg",image/jpeg,2000,1500,0,273543,,1655125382,1655125383243,0,0,0,0,,,,,,,,,,, +15667,60471,content://media/external/images/media/60471,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0021.jpg",image/jpeg,2000,1500,0,300431,,1655125383,1655125383496,0,0,0,0,,,,,,,,,,, +15668,60474,content://media/external/images/media/60474,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0022.jpg",image/jpeg,2000,1500,0,308966,,1655125383,1655125383762,0,0,0,0,,,,,,,,,,, +15669,60459,content://media/external/images/media/60459,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0017.jpg",image/jpeg,2000,1500,0,262803,,1655125381,1655125382199,0,0,0,0,,,,,,,,,,, +15670,60462,content://media/external/images/media/60462,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0018.jpg",image/jpeg,1500,2000,0,315037,,1655125382,1655125382566,0,0,0,0,,,,,,,,,,, +15671,60465,content://media/external/images/media/60465,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0019.jpg",image/jpeg,2000,1500,0,284329,,1655125382,1655125382972,0,0,0,0,,,,,,,,,,, +15672,60452,content://media/external/images/media/60452,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0015.jpg",image/jpeg,2000,1500,0,279791,,1655125379,1655125380117,0,0,0,0,,,,,,,,,,, +15673,60446,content://media/external/images/media/60446,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0013.jpg",image/jpeg,2000,1500,0,301234,,1655125378,1655125379244,0,0,0,0,,,,,,,,,,, +15674,60449,content://media/external/images/media/60449,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0014.jpg",image/jpeg,1500,2000,0,333123,,1655125379,1655125379733,0,0,0,0,,,,,,,,,,, +15675,60443,content://media/external/images/media/60443,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0012.jpg",image/jpeg,2000,1500,0,292650,,1655125378,1655125378957,0,0,0,0,,,,,,,,,,, +15676,60436,content://media/external/images/media/60436,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-13-13-54-39-970_com.whatsapp.jpg,image/jpeg,1080,2400,0,877524,,1655121280,1655121280390,0,0,0,0,,,,,,,,,,, +15677,60430,content://media/external/images/media/60430,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0008.jpg",image/jpeg,768,1024,0,71305,,1655104224,1655104224687,0,0,0,0,,,,,,,,,,, +15678,60394,content://media/external/images/media/60394,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220612-WA0006.jpg",image/jpeg,1200,1600,0,175795,,1655066455,1655104006065,0,0,0,0,,,,,,,,,,, +15679,60401,content://media/external/images/media/60401,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0002.jpg",image/jpeg,1152,2048,0,317227,,1655075261,1655098572302,0,0,0,0,,,,,,,,,,, +15680,60403,content://media/external/images/media/60403,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0003.jpg",image/jpeg,2048,1536,0,384617,,1655075262,1655098562144,0,0,0,0,,,,,,,,,,, +15681,60405,content://media/external/images/media/60405,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0004.jpg",image/jpeg,2048,1536,0,482298,,1655075264,1655098536462,0,0,0,0,,,,,,,,,,, +15682,60397,content://media/external/images/media/60397,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0007.jpg",image/jpeg,1200,1600,0,173562,,1655069407,1655075304306,0,0,0,0,,,,,,,,,,, +15683,60376,content://media/external/images/media/60376,/storage/emulated/0/DCIM/Camera/IMG_20220612_134626.jpg,image/jpeg,4608,2592,0,4680280,,1655034393,1655034393105,1655034387970,0,0,0,,,,,,,,,,, +15684,60375,content://media/external/images/media/60375,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-12-13-00-10-850_com.instagram.android.jpg,image/jpeg,1080,2400,0,1020560,,1655031611,1655031611282,0,0,0,0,,,,,,,,,,, +15685,60374,content://media/external/images/media/60374,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-12-12-59-18-222_com.shazam.android.jpg,image/jpeg,1080,2400,0,818294,,1655031558,1655031558726,0,0,0,0,,,,,,,,,,, +15686,60370,content://media/external/images/media/60370,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220612-WA0002.jpg",image/jpeg,1080,590,0,36322,,1655030398,1655030398974,0,0,0,0,,,,,,,,,,, +15687,60368,content://media/external/images/media/60368,/storage/emulated/0/DCIM/Camera/IMG_20220612_123046.jpg,image/jpeg,4608,2592,0,5129811,,1655029852,1655029852374,1655029847186,0,0,0,,,,,,,,,,, +15688,60366,content://media/external/images/media/60366,/storage/emulated/0/DCIM/Camera/IMG_20220612_114855.jpg,image/jpeg,4608,2592,0,5302932,,1655027339,1655027339177,1655027335318,0,0,0,,,,,,,,,,, +15689,60363,content://media/external/images/media/60363,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220612-WA0001.jpg",image/jpeg,1920,1080,0,196756,,1655026673,1655026674409,0,0,0,0,,,,,,,,,,, +15690,60361,content://media/external/images/media/60361,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220612-WA0000.jpg",image/jpeg,1117,1462,0,106302,,1655023031,1655023031974,0,0,0,0,,,,,,,,,,, +15691,60353,content://media/external/images/media/60353,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-11-18-25-23-269_com.google.android.apps.maps.jpg,image/jpeg,1080,2400,0,972485,,1654964723,1654964723675,0,0,0,0,,,,,,,,,,, +15692,60336,content://media/external/images/media/60336,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-11-14-59-25-713_com.huami.watch.hmwatchmanager.jpg,image/jpeg,1080,2400,0,655183,,1654952365,1654952366085,0,0,0,0,,,,,,,,,,, +15693,60304,content://media/external/images/media/60304,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220611-WA0007.jpg",image/jpeg,1361,935,0,295696,,1654939781,1654939781586,0,0,0,0,,,,,,,,,,, +15694,60302,content://media/external/images/media/60302,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220611-WA0006.jpg",image/jpeg,1000,1422,0,336809,,1654939469,1654939469347,0,0,0,0,,,,,,,,,,, +15695,60295,content://media/external/images/media/60295,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220611-WA0004.jpg",image/jpeg,1200,1600,0,174483,,1654935353,1654935354866,0,0,0,0,,,,,,,,,,, +15696,60289,content://media/external/images/media/60289,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220611-WA0002.jpg",image/jpeg,1488,1984,0,164515,,1654929033,1654929034136,0,0,0,0,,,,,,,,,,, +15697,60269,content://media/external/images/media/60269,/storage/emulated/0/DCIM/Camera/IMG_20220610_215608.jpg,image/jpeg,4608,2592,0,4404940,,1654890976,1654890976966,1654890969285,0,0,0,,,,,,,,,,, +15698,60243,content://media/external/images/media/60243,/storage/emulated/0/DCIM/Camera/IMG_20220610_170045.jpg,image/jpeg,2592,4608,0,3602205,,1654873251,1654873251508,1654873245523,0,0,0,,,,,,,,,,, +15699,60241,content://media/external/images/media/60241,/storage/emulated/0/DCIM/Camera/IMG_20220610_165428.jpg,image/jpeg,2592,4608,0,2968458,,1654872871,1654872871206,1654872868408,0,0,0,,,,,,,,,,, +15700,60231,content://media/external/images/media/60231,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220610-WA0023.jpg",image/jpeg,1125,1600,0,379094,,1654860946,1654860947491,0,0,0,0,,,,,,,,,,, +15701,60217,content://media/external/images/media/60217,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220610-WA0015.jpeg",image/jpeg,3840,2160,90,1644514,,1654855494,1654855494727,1654855494554,0,0,0,,,,,,,,,,, +15702,60214,content://media/external/images/media/60214,/storage/emulated/0/DCIM/Camera/IMG_20220610_111729.jpg,image/jpeg,735,614,0,117338,,1654852649,1654852649710,1654852453485,0,0,0,,,,,,,,,,, +15703,60210,content://media/external/images/media/60210,/storage/emulated/0/DCIM/Camera/IMG_20220610_111400.jpg,image/jpeg,2592,4608,0,4908382,,1654852443,1654852443365,1654852440563,0,0,0,,,,,,,,,,, +15704,60208,content://media/external/images/media/60208,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220610-WA0011.jpeg",image/jpeg,3840,2160,0,1384497,,1654852271,1654852271902,1654852271683,0,0,0,,,,,,,,,,, +15705,60205,content://media/external/images/media/60205,/storage/emulated/0/DCIM/Camera/IMG_20220610_110716.jpg,image/jpeg,2592,4608,0,3903160,,1654852041,1654852041487,1654852037586,0,0,0,,,,,,,,,,, +15706,60203,content://media/external/images/media/60203,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220610-WA0008.jpeg",image/jpeg,3840,2160,90,1417320,,1654851967,1654851967563,1654851967350,0,0,0,,,,,,,,,,, +15707,60163,content://media/external/images/media/60163,/storage/emulated/0/DCIM/Camera/IMG_20220609_181845.jpg,image/jpeg,3395,2142,0,3141619,,1654791528,1654791528311,1654791527798,0,0,0,,,,,,,,,,, +15708,60161,content://media/external/images/media/60161,/storage/emulated/0/DCIM/Camera/IMG_20220609_181754.jpg,image/jpeg,3083,1951,0,2694019,,1654791478,1654791478903,1654791477676,0,0,0,,,,,,,,,,, +15709,60159,content://media/external/images/media/60159,/storage/emulated/0/DCIM/Camera/IMG_20220609_181638.jpg,image/jpeg,3673,2273,0,3661670,,1654791401,1654791401671,1654791400755,0,0,0,,,,,,,,,,, +15710,60143,content://media/external/images/media/60143,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0039.jpg",image/jpeg,921,2048,0,118259,,1654771405,1654771406444,0,0,0,0,,,,,,,,,,, +15711,60141,content://media/external/images/media/60141,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0038.jpg",image/jpeg,474,828,0,65885,,1654769670,1654769670635,0,0,0,0,,,,,,,,,,, +15712,60139,content://media/external/images/media/60139,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0037.jpg",image/jpeg,710,808,0,245270,,1654769665,1654769665988,0,0,0,0,,,,,,,,,,, +15713,60137,content://media/external/images/media/60137,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0036.jpg",image/jpeg,462,928,0,144148,,1654769660,1654769660352,0,0,0,0,,,,,,,,,,, +15714,60135,content://media/external/images/media/60135,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0035.jpg",image/jpeg,784,961,0,307868,,1654769651,1654769652251,0,0,0,0,,,,,,,,,,, +15715,60040,content://media/external/images/media/60040,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-09-08-55-02-938_com.android.chrome.jpg,image/jpeg,1080,2400,0,385812,,1654757703,1654757703261,0,0,0,0,,,,,,,,,,, +15716,60035,content://media/external/images/media/60035,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220531-WA0020.jpg",image/jpeg,900,1600,0,118660,,1654754878,1654754879131,0,0,0,0,,,,,,,,,,, +15717,60009,content://media/external/images/media/60009,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220608-WA0015.jpg",image/jpeg,1600,2000,0,317921,,1654720095,1654720095860,0,0,0,0,,,,,,,,,,, +15718,59992,content://media/external/images/media/59992,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-08-18-57-57-457_com.ilmeteo.android.ilmeteo.jpg,image/jpeg,1080,2400,0,1030055,,1654707477,1654707477877,0,0,0,0,,,,,,,,,,, +15719,59987,content://media/external/images/media/59987,/storage/emulated/0/DCIM/Camera/IMG_20220608_150812.jpg,image/jpeg,2184,3357,0,5733796,,1654693698,1654693698546,1654693697812,0,0,0,,,,,,,,,,, +15720,59986,content://media/external/images/media/59986,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-08-15-04-55-029_com.google.android.apps.photos.jpg,image/jpeg,1080,2400,0,1529751,,1654693495,1654693495129,0,0,0,0,,,,,,,,,,, +15721,59985,content://media/external/images/media/59985,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-08-15-04-46-742_com.google.android.apps.photos.jpg,image/jpeg,1080,2400,0,1444078,,1654693486,1654693486853,0,0,0,0,,,,,,,,,,, +15722,59982,content://media/external/images/media/59982,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220608-WA0009.jpg",image/jpeg,1080,1920,0,170007,,1654693247,1654693248073,0,0,0,0,,,,,,,,,,, +15723,59951,content://media/external/images/media/59951,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220608-WA0002.jpg",image/jpeg,720,1600,0,176974,,1654677418,1654677419115,0,0,0,0,,,,,,,,,,, +15724,59930,content://media/external/images/media/59930,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-08-09-11-03-950_it.caitalia.apphub.jpg,image/jpeg,1080,2400,0,653439,,1654672264,1654672264368,0,0,0,0,,,,,,,,,,, +15725,59919,content://media/external/images/media/59919,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220607-WA0021.jpg",image/jpeg,1236,1600,0,306577,,1654632712,1654632713170,0,0,0,0,,,,,,,,,,, +15726,59916,content://media/external/images/media/59916,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220607-WA0020.jpg",image/jpeg,1060,465,0,41734,,1654632272,1654632272736,0,0,0,0,,,,,,,,,,, +15727,59911,content://media/external/images/media/59911,/storage/emulated/0/Pictures/Whatsapp/IMG-20220607-WA0018.jpg,image/jpeg,997,2048,0,312905,,1654623436,1654623436367,0,0,0,0,,,,,,,,,,, +15728,59883,content://media/external/images/media/59883,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220607-WA0015.jpg",image/jpeg,921,2048,0,147539,,1654614777,1654614778166,0,0,0,0,,,,,,,,,,, +15729,59879,content://media/external/images/media/59879,/storage/emulated/0/DCIM/Camera/IMG_20220607_144859.jpg,image/jpeg,2592,4608,0,4473680,,1654606142,1654606142523,1654606140540,0,0,0,,,,,,,,,,, +15730,59877,content://media/external/images/media/59877,/storage/emulated/0/DCIM/Camera/IMG_20220607_144813.jpg,image/jpeg,1257,3352,0,2161977,,1654606096,1654606096047,1654606095589,0,0,0,,,,,,,,,,, +15731,59873,content://media/external/images/media/59873,/storage/emulated/0/DCIM/Camera/IMG_20220607_143507.jpg,image/jpeg,4608,2592,0,4139679,,1654605308,1654605308231,1653654293717,0,0,0,,,,,,,,,,, +15732,59519,content://media/external/images/media/59519,/storage/emulated/0/DCIM/Camera/IMG_20220603_165858.jpg,image/jpeg,3200,1800,0,2700423,,1654268339,1654268340021,1654268338189,0,0,0,,,,,,,,,,, +15733,48523,content://media/external/images/media/48523,/storage/emulated/0/DCIM/Camera/IMG_20220531_190506.jpg,image/jpeg,3200,1800,0,3176332,,1654016708,1654016708720,1654016706807,0,0,0,,,,,,,,,,, +15734,48521,content://media/external/images/media/48521,/storage/emulated/0/DCIM/Camera/IMG_20220531_184651.jpg,image/jpeg,4608,2592,0,6141148,,1654015614,1654015614630,1654015611523,0,0,0,,,,,,,,,,, +15735,48374,content://media/external/images/media/48374,/storage/emulated/0/Pictures/Whatsapp/IMG-20220529-WA0028.jpg,image/jpeg,2048,1537,0,273406,,1653914153,1653914153918,0,0,0,0,,,,,,,,,,, +15736,48326,content://media/external/images/media/48326,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0028.jpg",image/jpeg,2048,1537,0,273406,,1653848668,1653897519149,0,0,0,0,,,,,,,,,,, +15737,48336,content://media/external/images/media/48336,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220530-WA0001.jpg",image/jpeg,768,1024,0,108983,,1653862814,1653862815286,0,0,0,0,,,,,,,,,,, +15738,48332,content://media/external/images/media/48332,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220530-WA0000.jpg",image/jpeg,720,1600,0,87535,,1653862444,1653862444926,0,0,0,0,,,,,,,,,,, +15739,48321,content://media/external/images/media/48321,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0026.jpg",image/jpeg,1153,2048,0,285505,,1653848124,1653848125980,0,0,0,0,,,,,,,,,,, +15740,48288,content://media/external/images/media/48288,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0016.jpg",image/jpeg,1128,1504,0,235476,,1653836453,1653837107471,0,0,0,0,,,,,,,,,,, +15741,48286,content://media/external/images/media/48286,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0015.jpg",image/jpeg,1128,1504,0,297995,,1653836451,1653836453189,0,0,0,0,,,,,,,,,,, +15742,48284,content://media/external/images/media/48284,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0014.jpg",image/jpeg,1600,1200,0,165322,,1653836380,1653836451216,0,0,0,0,,,,,,,,,,, +15743,48282,content://media/external/images/media/48282,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0013.jpg",image/jpeg,1128,1504,0,269255,,1653836359,1653836380194,0,0,0,0,,,,,,,,,,, +15744,48290,content://media/external/images/media/48290,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0012.jpg",image/jpeg,1128,1504,0,304809,,1653836349,1653836359833,0,0,0,0,,,,,,,,,,, +15745,48279,content://media/external/images/media/48279,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0011.jpg",image/jpeg,1128,1504,0,199236,,1653836246,1653836283528,0,0,0,0,,,,,,,,,,, +15746,48276,content://media/external/images/media/48276,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0010.jpg",image/jpeg,1128,1504,0,220274,,1653836237,1653836246182,0,0,0,0,,,,,,,,,,, +15747,48273,content://media/external/images/media/48273,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0009.jpg",image/jpeg,1504,1128,0,234273,,1653836233,1653836237435,0,0,0,0,,,,,,,,,,, +15748,48270,content://media/external/images/media/48270,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0008.jpg",image/jpeg,1504,1128,0,254041,,1653836228,1653836233155,0,0,0,0,,,,,,,,,,, +15749,48267,content://media/external/images/media/48267,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0007.jpg",image/jpeg,1128,1504,0,175580,,1653836224,1653836228134,0,0,0,0,,,,,,,,,,, +15750,48264,content://media/external/images/media/48264,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0006.jpg",image/jpeg,1532,2048,0,343052,,1653831376,1653831376826,0,0,0,0,,,,,,,,,,, +15751,48262,content://media/external/images/media/48262,/storage/emulated/0/DCIM/Camera/IMG_20220529_152710.jpg,image/jpeg,4608,2592,0,4857590,,1653830834,1653830834465,1653830830747,0,0,0,,,,,,,,,,, +15752,48260,content://media/external/images/media/48260,/storage/emulated/0/DCIM/Camera/IMG_20220529_152557.jpg,image/jpeg,2592,4608,0,5506638,,1653830763,1653830764609,1653830757867,0,0,0,,,,,,,,,,, +15753,48258,content://media/external/images/media/48258,/storage/emulated/0/DCIM/Camera/IMG_20220529_152550.jpg,image/jpeg,2592,4608,0,5093604,,1653830755,1653830755701,1653830750868,0,0,0,,,,,,,,,,, +15754,48255,content://media/external/images/media/48255,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0005.jpg",image/jpeg,2048,1536,0,372196,,1653828279,1653828280102,0,0,0,0,,,,,,,,,,, +15755,48252,content://media/external/images/media/48252,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0004.jpg",image/jpeg,1536,2048,0,224822,,1653828264,1653828264845,0,0,0,0,,,,,,,,,,, +15756,48246,content://media/external/images/media/48246,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0002.jpg",image/jpeg,1536,2048,0,242151,,1653828249,1653828250319,0,0,0,0,,,,,,,,,,, +15757,48249,content://media/external/images/media/48249,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0003.jpg",image/jpeg,1536,2048,0,208934,,1653828250,1653828250632,0,0,0,0,,,,,,,,,,, +15758,48243,content://media/external/images/media/48243,/storage/emulated/0/DCIM/Camera/IMG_20220529_143233.jpg,image/jpeg,3200,1800,0,2371231,,1653827556,1653827556435,1653827553655,0,0,0,,,,,,,,,,, +15759,48237,content://media/external/images/media/48237,/storage/emulated/0/DCIM/Camera/IMG_20220529_122648.jpg,image/jpeg,4608,2592,0,2952897,,1653820011,1653820011807,1653820008265,0,0,0,,,,,,,,,,, +15760,48200,content://media/external/images/media/48200,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220528-WA0009.jpg",image/jpeg,1200,1600,0,191104,,1653741106,1653741107012,0,0,0,0,,,,,,,,,,, +15761,48203,content://media/external/images/media/48203,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220528-WA0010.jpg",image/jpeg,1200,1600,0,172648,,1653741107,1653741107453,0,0,0,0,,,,,,,,,,, +15762,48116,content://media/external/images/media/48116,/storage/emulated/0/DCIM/Camera/IMG_20220527_142525.jpg,image/jpeg,4608,2592,0,5163939,,1653654327,1653654327088,1653654325363,0,0,0,,,,,,,,,,, +15763,48114,content://media/external/images/media/48114,/storage/emulated/0/DCIM/Camera/IMG_20220527_142520.jpg,image/jpeg,4608,2592,0,4773250,,1653654323,1653654323120,1653654320524,0,0,0,,,,,,,,,,, +15764,48112,content://media/external/images/media/48112,/storage/emulated/0/DCIM/Camera/IMG_20220527_142453.jpg,image/jpeg,4608,2592,0,4716700,,1653654297,1653654297464,1653654293717,0,0,0,,,,,,,,,,, +15765,48082,content://media/external/images/media/48082,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220527-WA0008.jpg",image/jpeg,921,2048,0,148516,,1653646507,1653646560796,0,0,0,0,,,,,,,,,,, +15766,48001,content://media/external/images/media/48001,/storage/emulated/0/Download/Soduto/retro.jpg,image/jpeg,2590,4612,0,501289,,1653555956,1653555957930,1640524806000,0,0,0,,,,,,,,,,, +15767,48000,content://media/external/images/media/48000,/storage/emulated/0/Download/Soduto/fronte.jpg,image/jpeg,2590,4612,0,500503,,1653555950,1653555951269,1640524794000,0,0,0,,,,,,,,,,, +15768,47946,content://media/external/images/media/47946,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0008.jpg",image/jpeg,1599,899,0,123374,,1653494034,1653494034754,0,0,0,0,,,,,,,,,,, +15769,47945,content://media/external/images/media/47945,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-25-15-09-16-661_com.instagram.android.jpg,image/jpeg,1080,2400,0,953606,,1653484157,1653484157240,0,0,0,0,,,,,,,,,,, +15770,47944,content://media/external/images/media/47944,/storage/emulated/0/DCIM/PlantNet/2022-05-25T13_30_00+02_00.JPEG,image/jpeg,3000,4000,0,5053627,,1653478200,1653478200273,1653478191896,0,0,0,,,,,,,,,,, +15771,47941,content://media/external/images/media/47941,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0007.jpg",image/jpeg,1192,2048,0,197598,,1653477184,1653477185831,0,0,0,0,,,,,,,,,,, +15772,47938,content://media/external/images/media/47938,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0006.jpg",image/jpeg,1600,900,0,130334,,1653476769,1653476770846,0,0,0,0,,,,,,,,,,, +15773,47935,content://media/external/images/media/47935,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0005.jpg",image/jpeg,900,1600,0,132733,,1653471612,1653471612992,0,0,0,0,,,,,,,,,,, +15774,47932,content://media/external/images/media/47932,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0004.jpg",image/jpeg,900,1600,0,64583,,1653471604,1653471605666,0,0,0,0,,,,,,,,,,, +15775,47929,content://media/external/images/media/47929,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0003.jpg",image/jpeg,818,1599,0,72940,,1653471115,1653471116799,0,0,0,0,,,,,,,,,,, +15776,47917,content://media/external/images/media/47917,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0000.jpg",image/jpeg,1080,1377,0,90145,,1653454334,1653454335652,0,0,0,0,,,,,,,,,,, +15777,47899,content://media/external/images/media/47899,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220524-WA0002.jpg",image/jpeg,1599,899,0,113208,,1653388067,1653388068562,0,0,0,0,,,,,,,,,,, +15778,47896,content://media/external/images/media/47896,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220524-WA0001.jpg",image/jpeg,921,2048,0,138191,,1653384907,1653384908240,0,0,0,0,,,,,,,,,,, +15779,47877,content://media/external/images/media/47877,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220523-WA0009.jpg",image/jpeg,1532,2048,0,112821,,1653298509,1653298510705,0,0,0,0,,,,,,,,,,, +15780,47852,content://media/external/images/media/47852,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-23-10-41-42-885_it.subito.jpg,image/jpeg,1080,2400,0,1031151,,1653295303,1653295303324,0,0,0,0,,,,,,,,,,, +15781,47850,content://media/external/images/media/47850,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220523-WA0002.jpg",image/jpeg,1200,1312,0,219920,,1653290146,1653290147077,0,0,0,0,,,,,,,,,,, +15782,47847,content://media/external/images/media/47847,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220523-WA0001.jpg",image/jpeg,1536,2048,0,249290,,1653289900,1653289901046,0,0,0,0,,,,,,,,,,, +15783,47840,content://media/external/images/media/47840,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220523-WA0000.jpg",image/jpeg,1600,1200,0,177774,,1653282459,1653282460248,0,0,0,0,,,,,,,,,,, +15784,47834,content://media/external/images/media/47834,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0047.jpg",image/jpeg,1200,1600,0,127728,,1653256635,1653256636579,0,0,0,0,,,,,,,,,,, +15785,47787,content://media/external/images/media/47787,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0034.jpg",image/jpeg,896,2000,0,374736,,1653226756,1653226757741,0,0,0,0,,,,,,,,,,, +15786,47784,content://media/external/images/media/47784,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0033.jpg",image/jpeg,896,2000,0,127369,,1653226755,1653226756497,0,0,0,0,,,,,,,,,,, +15787,47778,content://media/external/images/media/47778,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0031.jpg",image/jpeg,896,2000,0,202145,,1653226754,1653226755202,0,0,0,0,,,,,,,,,,, +15788,47781,content://media/external/images/media/47781,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0032.jpg",image/jpeg,896,2000,0,147011,,1653226755,1653226755889,0,0,0,0,,,,,,,,,,, +15789,47775,content://media/external/images/media/47775,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0030.jpg",image/jpeg,896,2000,0,162459,,1653226753,1653226754397,0,0,0,0,,,,,,,,,,, +15790,47772,content://media/external/images/media/47772,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0029.jpg",image/jpeg,896,2000,0,151834,,1653226752,1653226753553,0,0,0,0,,,,,,,,,,, +15791,47766,content://media/external/images/media/47766,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0027.jpg",image/jpeg,896,2000,0,422731,,1653226751,1653226752207,0,0,0,0,,,,,,,,,,, +15792,47769,content://media/external/images/media/47769,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0028.jpg",image/jpeg,896,2000,0,151284,,1653226752,1653226752929,0,0,0,0,,,,,,,,,,, +15793,47763,content://media/external/images/media/47763,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0026.jpg",image/jpeg,896,2000,0,513130,,1653226749,1653226751024,0,0,0,0,,,,,,,,,,, +15794,47760,content://media/external/images/media/47760,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0025.jpg",image/jpeg,896,2000,0,505037,,1653226748,1653226749709,0,0,0,0,,,,,,,,,,, +15795,47757,content://media/external/images/media/47757,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0024.jpg",image/jpeg,2000,896,0,337955,,1653226747,1653226748456,0,0,0,0,,,,,,,,,,, +15796,47754,content://media/external/images/media/47754,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0023.jpg",image/jpeg,2000,896,0,347650,,1653226746,1653226747511,0,0,0,0,,,,,,,,,,, +15797,47751,content://media/external/images/media/47751,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0022.jpg",image/jpeg,2000,896,0,232229,,1653226745,1653226746514,0,0,0,0,,,,,,,,,,, +15798,47745,content://media/external/images/media/47745,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0020.jpg",image/jpeg,896,2000,0,234016,,1653226744,1653226745041,0,0,0,0,,,,,,,,,,, +15799,47748,content://media/external/images/media/47748,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0021.jpg",image/jpeg,896,2000,0,215028,,1653226745,1653226745850,0,0,0,0,,,,,,,,,,, +15800,47742,content://media/external/images/media/47742,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0019.jpg",image/jpeg,896,2000,0,421970,,1653226742,1653226744197,0,0,0,0,,,,,,,,,,, +15801,47705,content://media/external/images/media/47705,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0008.jpg",image/jpeg,1536,2048,0,501565,,1653202869,1653202870025,0,0,0,0,,,,,,,,,,, +15802,47702,content://media/external/images/media/47702,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0007.jpg",image/jpeg,1536,2048,0,521375,,1653202836,1653202836819,0,0,0,0,,,,,,,,,,, +15803,47699,content://media/external/images/media/47699,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0006.jpg",image/jpeg,1536,2048,0,543721,,1653202831,1653202832049,0,0,0,0,,,,,,,,,,, +15804,47696,content://media/external/images/media/47696,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0005.jpg",image/jpeg,1200,1600,0,208543,,1653202160,1653202163845,0,0,0,0,,,,,,,,,,, +15805,47693,content://media/external/images/media/47693,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0004.jpg",image/jpeg,1200,1600,0,199489,,1653201568,1653201574944,0,0,0,0,,,,,,,,,,, +15806,47690,content://media/external/images/media/47690,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0003.jpg",image/jpeg,1200,1600,0,192409,,1653201522,1653201522925,0,0,0,0,,,,,,,,,,, +15807,47674,content://media/external/images/media/47674,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-21-18-11-51-414_com.google.android.apps.maps.jpg,image/jpeg,1080,2400,0,671008,,1653149511,1653149511575,0,0,0,0,,,,,,,,,,, +15808,47614,content://media/external/images/media/47614,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220521-WA0002.jpg",image/jpeg,899,1599,0,288125,,1653117742,1653117743877,0,0,0,0,,,,,,,,,,, +15809,47610,content://media/external/images/media/47610,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-21-09-14-25-272_com.outdooractive.Outdooractive.jpg,image/jpeg,1080,2400,0,587786,,1653117265,1653117265797,0,0,0,0,,,,,,,,,,, +15810,47598,content://media/external/images/media/47598,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-20-20-43-30-851_com.huami.watch.hmwatchmanager.jpg,image/jpeg,1080,2400,0,667662,,1653072211,1653072211276,0,0,0,0,,,,,,,,,,, +15811,47596,content://media/external/images/media/47596,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-20-20-42-57-534_com.brytonsport.active.jpg,image/jpeg,1080,2400,0,569625,,1653072177,1653072177940,0,0,0,0,,,,,,,,,,, +15812,47587,content://media/external/images/media/47587,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-20-18-52-55-038_com.whatsapp.jpg,image/jpeg,1080,2400,0,815009,,1653065575,1653065575511,0,0,0,0,,,,,,,,,,, +15813,47581,content://media/external/images/media/47581,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-20-18-34-31-372_de.komoot.android.jpg,image/jpeg,1080,2400,0,750021,,1653064471,1653064471810,0,0,0,0,,,,,,,,,,, +15814,47575,content://media/external/images/media/47575,/storage/emulated/0/DCIM/Camera/IMG_20220520_150658.jpg,image/jpeg,4608,2592,0,4060560,,1653052023,1653052023795,1653052019700,0,0,0,,,,,,,,,,, +15815,47572,content://media/external/images/media/47572,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220520-WA0012.jpg",image/jpeg,1600,1200,0,292953,,1653051079,1653051080375,0,0,0,0,,,,,,,,,,, +15816,47565,content://media/external/images/media/47565,/storage/emulated/0/DCIM/Camera/IMG_20220520_144012.jpg,image/jpeg,2592,4608,0,8039432,,1653050415,1653050415531,1653050412303,0,0,0,,,,,,,,,,, +15817,47563,content://media/external/images/media/47563,/storage/emulated/0/DCIM/Camera/IMG_20220520_143153.jpg,image/jpeg,2592,4608,0,8837297,,1653049920,1653049920835,1653049914700,0,0,0,,,,,,,,,,, +15818,47560,content://media/external/images/media/47560,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220520-WA0009.jpg",image/jpeg,1599,1200,0,136762,,1653049062,1653049063010,0,0,0,0,,,,,,,,,,, +15819,47550,content://media/external/images/media/47550,/storage/emulated/0/DCIM/Camera/IMG_20220520_131041.jpg,image/jpeg,3200,1800,0,2422586,,1653045047,1653045047974,1653045041767,0,0,0,,,,,,,,,,, +15820,47547,content://media/external/images/media/47547,/storage/emulated/0/DCIM/Camera/IMG_20220520_130814.jpg,image/jpeg,3200,1800,0,2639771,,1653044902,1653044902830,1653044895613,0,0,0,,,,,,,,,,, +15821,47544,content://media/external/images/media/47544,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220520-WA0004.jpg",image/jpeg,1920,1080,0,255430,,1653042127,1653042127629,0,0,0,0,,,,,,,,,,, +15822,47541,content://media/external/images/media/47541,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220520-WA0003.jpg",image/jpeg,600,600,0,11043,,1653041984,1653041985250,0,0,0,0,,,,,,,,,,, +15823,47535,content://media/external/images/media/47535,/storage/emulated/0/DCIM/Camera/IMG_20220520_105716.jpg,image/jpeg,5120,2880,0,5478039,,1653037039,1653037039274,1653037037300,0,0,0,,,,,,,,,,, +15824,47501,content://media/external/images/media/47501,/storage/emulated/0/DCIM/Camera/IMG_20220519_180423.jpg,image/jpeg,2592,4608,0,5029788,,1652976265,1652976265621,1652976263512,0,0,0,,,,,,,,,,, +15825,47499,content://media/external/images/media/47499,/storage/emulated/0/DCIM/Camera/IMG_20220519_180400.jpg,image/jpeg,2592,4608,0,4838157,,1652976242,1652976242205,1652976240230,0,0,0,,,,,,,,,,, +15826,47497,content://media/external/images/media/47497,/storage/emulated/0/DCIM/Camera/IMG_20220519_180331.jpg,image/jpeg,2592,4608,0,5284619,,1652976213,1652976214065,1652976211416,0,0,0,,,,,,,,,,, +15827,47495,content://media/external/images/media/47495,/storage/emulated/0/DCIM/Camera/IMG_20220519_180249.jpg,image/jpeg,2592,4608,0,4705962,,1652976171,1652976171661,1652976169730,0,0,0,,,,,,,,,,, +15828,47493,content://media/external/images/media/47493,/storage/emulated/0/DCIM/Camera/IMG_20220519_180230.jpg,image/jpeg,2592,4608,0,4561585,,1652976152,1652976152885,1652976150866,0,0,0,,,,,,,,,,, +15829,47489,content://media/external/images/media/47489,/storage/emulated/0/DCIM/Camera/IMG_20220519_180216.jpg,image/jpeg,2592,4608,0,4454490,,1652976141,1652976141489,1652976136916,0,0,0,,,,,,,,,,, +15830,47467,content://media/external/images/media/47467,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0010.jpg",image/jpeg,2048,1536,0,383398,,1652956120,1652956121257,0,0,0,0,,,,,,,,,,, +15831,47464,content://media/external/images/media/47464,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0009.jpg",image/jpeg,2048,1536,0,358049,,1652956118,1652956118766,0,0,0,0,,,,,,,,,,, +15832,47461,content://media/external/images/media/47461,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0008.jpg",image/jpeg,1536,2048,0,449485,,1652955990,1652955991577,0,0,0,0,,,,,,,,,,, +15833,47454,content://media/external/images/media/47454,/storage/emulated/0/Pictures/Whatsapp/IMG-20220519-WA0003.jpg,image/jpeg,768,1024,0,139245,,1652951795,1652951796011,0,0,0,0,,,,,,,,,,, +15834,47453,content://media/external/images/media/47453,/storage/emulated/0/Pictures/Whatsapp/IMG-20220519-WA0004.jpg,image/jpeg,576,1024,0,94979,,1652951793,1652951793239,0,0,0,0,,,,,,,,,,, +15835,47452,content://media/external/images/media/47452,/storage/emulated/0/Pictures/Whatsapp/IMG-20220519-WA0005.jpg,image/jpeg,768,1024,0,135274,,1652951789,1652951789859,0,0,0,0,,,,,,,,,,, +15836,47451,content://media/external/images/media/47451,/storage/emulated/0/Pictures/Whatsapp/IMG-20220519-WA0002.jpg,image/jpeg,768,1024,0,139611,,1652951785,1652951785743,0,0,0,0,,,,,,,,,,, +15837,47448,content://media/external/images/media/47448,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0005.jpg",image/jpeg,768,1024,0,135274,,1652948236,1652948237495,0,0,0,0,,,,,,,,,,, +15838,47442,content://media/external/images/media/47442,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0003.jpg",image/jpeg,768,1024,0,139245,,1652948235,1652948236137,0,0,0,0,,,,,,,,,,, +15839,47445,content://media/external/images/media/47445,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0004.jpg",image/jpeg,576,1024,0,94979,,1652948236,1652948236812,0,0,0,0,,,,,,,,,,, +15840,47439,content://media/external/images/media/47439,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0002.jpg",image/jpeg,768,1024,0,139611,,1652948234,1652948235445,0,0,0,0,,,,,,,,,,, +15841,47437,content://media/external/images/media/47437,/storage/emulated/0/DCIM/Camera/IMG_20220519_075753.jpg,image/jpeg,4608,2592,0,5190001,,1652939877,1652939878010,1652939873816,0,0,0,,,,,,,,,,, +15842,47430,content://media/external/images/media/47430,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0000.jpg",image/jpeg,640,640,0,41511,,1652938514,1652938523966,0,0,0,0,,,,,,,,,,, +15843,47418,content://media/external/images/media/47418,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0042.jpg",image/jpeg,1079,720,0,79825,,1652903333,1652903333830,0,0,0,0,,,,,,,,,,, +15844,47386,content://media/external/images/media/47386,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0032.jpg",image/jpeg,996,2048,0,145294,,1652876946,1652902371597,0,0,0,0,,,,,,,,,,, +15845,47414,content://media/external/images/media/47414,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0041.jpg",image/jpeg,1080,1920,0,265733,,1652891707,1652891707825,0,0,0,0,,,,,,,,,,, +15846,47411,content://media/external/images/media/47411,/storage/emulated/0/DCIM/Camera/IMG_20220518_181149.jpg,image/jpeg,2592,4608,0,5137687,,1652890311,1652890311611,1652890309166,0,0,0,,,,,,,,,,, +15847,47405,content://media/external/images/media/47405,/storage/emulated/0/DCIM/Camera/IMG_20220518_180954.jpg,image/jpeg,2592,4608,0,4918229,,1652890196,1652890196715,1652890194354,0,0,0,,,,,,,,,,, +15848,47403,content://media/external/images/media/47403,/storage/emulated/0/DCIM/Camera/IMG_20220518_180856.jpg,image/jpeg,4608,2592,0,4276907,,1652890138,1652890138875,1652890136838,0,0,0,,,,,,,,,,, +15849,47400,content://media/external/images/media/47400,/storage/emulated/0/DCIM/Camera/IMG_20220518_180849.jpg,image/jpeg,2592,4608,0,4832278,,1652890131,1652890131723,1652890129378,0,0,0,,,,,,,,,,, +15850,47399,content://media/external/images/media/47399,/storage/emulated/0/DCIM/Camera/IMG_20220518_180846.jpg,image/jpeg,2592,4608,0,4800522,,1652890130,1652890130351,1652890126467,0,0,0,,,,,,,,,,, +15851,47396,content://media/external/images/media/47396,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0035.jpg",image/jpeg,2048,1361,0,374006,,1652883631,1652883631650,0,0,0,0,,,,,,,,,,, +15852,47393,content://media/external/images/media/47393,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0034.jpg",image/jpeg,1050,698,0,119555,,1652883581,1652883581956,0,0,0,0,,,,,,,,,,, +15853,47378,content://media/external/images/media/47378,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0029.jpg",image/jpeg,1080,715,0,76921,,1652875423,1652875423640,0,0,0,0,,,,,,,,,,, +15854,47369,content://media/external/images/media/47369,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0027.jpg",image/jpeg,853,480,0,56776,,1652875077,1652875077697,0,0,0,0,,,,,,,,,,, +15855,47366,content://media/external/images/media/47366,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0026.jpg",image/jpeg,960,720,0,58467,,1652875055,1652875056337,0,0,0,0,,,,,,,,,,, +15856,47363,content://media/external/images/media/47363,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0025.jpg",image/jpeg,720,1600,0,60521,,1652874177,1652874178444,0,0,0,0,,,,,,,,,,, +15857,47360,content://media/external/images/media/47360,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0023.jpg",image/jpeg,1599,899,0,142812,,1652873634,1652873634923,0,0,0,0,,,,,,,,,,, +15858,47354,content://media/external/images/media/47354,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0021.jpg",image/jpeg,648,1152,0,123306,,1652873594,1652873594713,0,0,0,0,,,,,,,,,,, +15859,47348,content://media/external/images/media/47348,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0019.jpg",image/jpeg,1416,1062,0,125806,,1652873543,1652873543557,0,0,0,0,,,,,,,,,,, +15860,37310,content://media/external/images/media/37310,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220411-WA0030.jpg",image/jpeg,921,2048,0,125665,,1649697374,1652872971290,0,0,0,0,,,,,,,,,,, +15861,47340,content://media/external/images/media/47340,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0017.jpg",image/jpeg,2048,921,0,97647,,1652872935,1652872936238,0,0,0,0,,,,,,,,,,, +15862,47338,content://media/external/images/media/47338,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0016.jpg",image/jpeg,1277,634,0,480907,,1652872837,1652872837709,0,0,0,0,,,,,,,,,,, +15863,47335,content://media/external/images/media/47335,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0015.jpg",image/jpeg,1440,960,0,127540,,1652872779,1652872779381,0,0,0,0,,,,,,,,,,, +15864,47332,content://media/external/images/media/47332,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0014.jpg",image/jpeg,750,1334,0,66821,,1652872733,1652872733556,0,0,0,0,,,,,,,,,,, +15865,47329,content://media/external/images/media/47329,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0013.jpg",image/jpeg,1600,1200,0,234273,,1652872687,1652872688082,0,0,0,0,,,,,,,,,,, +15866,47327,content://media/external/images/media/47327,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0012.jpg",image/jpeg,720,482,0,193159,,1652872639,1652872639731,0,0,0,0,,,,,,,,,,, +15867,47324,content://media/external/images/media/47324,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0011.jpg",image/jpeg,768,1152,0,108118,,1652872608,1652872608833,0,0,0,0,,,,,,,,,,, +15868,47322,content://media/external/images/media/47322,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0010.jpg",image/jpeg,968,648,0,134680,,1652872500,1652872500803,0,0,0,0,,,,,,,,,,, +15869,47319,content://media/external/images/media/47319,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0009.jpg",image/jpeg,921,2048,0,91227,,1652872479,1652872480362,0,0,0,0,,,,,,,,,,, +15870,47316,content://media/external/images/media/47316,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0008.jpg",image/jpeg,921,2048,0,134623,,1652872471,1652872472112,0,0,0,0,,,,,,,,,,, +15871,47313,content://media/external/images/media/47313,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0007.jpg",image/jpeg,921,2048,0,89902,,1652872452,1652872453380,0,0,0,0,,,,,,,,,,, +15872,47310,content://media/external/images/media/47310,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0006.jpg",image/jpeg,921,2048,0,127202,,1652872443,1652872443699,0,0,0,0,,,,,,,,,,, +15873,47308,content://media/external/images/media/47308,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0005.jpg",image/jpeg,700,467,0,53692,,1652872284,1652872284667,0,0,0,0,,,,,,,,,,, +15874,47305,content://media/external/images/media/47305,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0004.jpg",image/jpeg,1536,2048,0,370125,,1652871389,1652871390551,0,0,0,0,,,,,,,,,,, +15875,47302,content://media/external/images/media/47302,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0003.jpg",image/jpeg,1080,1920,0,176965,,1652871328,1652871329133,0,0,0,0,,,,,,,,,,, +15876,47299,content://media/external/images/media/47299,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0002.jpg",image/jpeg,1536,2048,0,286429,,1652871126,1652871127413,0,0,0,0,,,,,,,,,,, +15877,47293,content://media/external/images/media/47293,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0001.jpg",image/jpeg,899,1599,0,120723,,1652868510,1652868511326,0,0,0,0,,,,,,,,,,, +15878,47277,content://media/external/images/media/47277,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220517-WA0014.jpg",image/jpeg,1024,639,0,78912,,1652818122,1652818123286,0,0,0,0,,,,,,,,,,, +15879,47271,content://media/external/images/media/47271,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220517-WA0012.jpg",image/jpeg,921,2048,0,118304,,1652787441,1652787442593,0,0,0,0,,,,,,,,,,, +15880,47269,content://media/external/images/media/47269,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-17-13-36-30-294_com.whatsapp.jpg,image/jpeg,1080,2400,0,1017217,,1652787390,1652787390636,0,0,0,0,,,,,,,,,,, +15881,47267,content://media/external/images/media/47267,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-17-13-12-45-999_com.whatsapp.jpg,image/jpeg,1080,2400,0,823361,,1652785966,1652785966373,0,0,0,0,,,,,,,,,,, +15882,47259,content://media/external/images/media/47259,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-17-12-07-26-386_com.whatsapp.jpg,image/jpeg,1080,2400,0,830204,,1652782046,1652782046693,0,0,0,0,,,,,,,,,,, +15883,47251,content://media/external/images/media/47251,/storage/emulated/0/DCIM/Screenshots/IMG_20220517_100932.jpg,image/jpeg,1080,1396,0,342121,,1652774972,1652774972336,0,0,0,0,,,,,,,,,,, +15884,47248,content://media/external/images/media/47248,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-17-10-04-57-964_com.whatsapp.jpg,image/jpeg,1080,2400,0,939372,,1652774698,1652774698285,0,0,0,0,,,,,,,,,,, +15885,47242,content://media/external/images/media/47242,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220517-WA0001.jpg",image/jpeg,1078,654,0,54960,,1652770494,1652770494958,0,0,0,0,,,,,,,,,,, +15886,47230,content://media/external/images/media/47230,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220516-WA0005.jpg",image/jpeg,1024,768,0,140050,,1652728415,1652728453520,0,0,0,0,,,,,,,,,,, +15887,47223,content://media/external/images/media/47223,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220516-WA0003.jpg",image/jpeg,720,1015,0,73984,,1652726020,1652726109550,0,0,0,0,,,,,,,,,,, +15888,47225,content://media/external/images/media/47225,/storage/emulated/0/DCIM/Camera/IMG_20220516_201153.jpg,image/jpeg,2592,4608,0,5102459,,1652724715,1652724715685,1652724713160,0,0,0,,,,,,,,,,, +15889,47218,content://media/external/images/media/47218,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220516-WA0001.jpg",image/jpeg,1080,1080,0,104834,,1652718664,1652718665014,0,0,0,0,,,,,,,,,,, +15890,47207,content://media/external/images/media/47207,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220516-WA0000.jpg",image/jpeg,720,1600,0,106998,,1652682529,1652682531693,0,0,0,0,,,,,,,,,,, +15891,47194,content://media/external/images/media/47194,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220515-WA0011.jpg",image/jpeg,1200,1600,0,240793,,1652639980,1652639981423,0,0,0,0,,,,,,,,,,, +15892,47191,content://media/external/images/media/47191,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220515-WA0010.jpg",image/jpeg,1536,2048,0,314563,,1652639940,1652639941356,0,0,0,0,,,,,,,,,,, +15893,47188,content://media/external/images/media/47188,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220515-WA0009.jpg",image/jpeg,1200,1600,0,185999,,1652637131,1652637131518,0,0,0,0,,,,,,,,,,, +15894,47173,content://media/external/images/media/47173,/storage/emulated/0/DCIM/Camera/IMG_20220515_163903.jpg,image/jpeg,3200,1800,0,2688717,,1652625545,1652625545978,1652625543274,0,0,0,,,,,,,,,,, +15895,47171,content://media/external/images/media/47171,/storage/emulated/0/DCIM/Camera/IMG_20220515_163856.jpg,image/jpeg,4608,2592,0,6446685,,1652625539,1652625539122,1652625536444,0,0,0,,,,,,,,,,, +15896,47167,content://media/external/images/media/47167,/storage/emulated/0/DCIM/Camera/IMG_20220515_163847.jpg,image/jpeg,2592,4608,0,6277320,,1652625533,1652625533730,1652625528640,0,0,0,,,,,,,,,,, +15897,47168,content://media/external/images/media/47168,/storage/emulated/0/DCIM/Camera/IMG_20220515_163848.jpg,image/jpeg,2592,4608,0,5832916,,1652625533,1652625533730,1652625528969,0,0,0,,,,,,,,,,, +15898,47152,content://media/external/images/media/47152,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-15-08-31-02-971_com.android.chrome.jpg,image/jpeg,1080,2400,0,625396,,1652596263,1652596263283,0,0,0,0,,,,,,,,,,, +15899,47142,content://media/external/images/media/47142,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0011.jpg",image/jpeg,1200,1600,0,218584,,1652556600,1652556601058,0,0,0,0,,,,,,,,,,, +15900,47118,content://media/external/images/media/47118,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0004.jpg",image/jpeg,1170,1924,0,271220,,1652510565,1652510566298,0,0,0,0,,,,,,,,,,, +15901,47109,content://media/external/images/media/47109,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0002.jpg",image/jpeg,1170,1333,0,187688,,1652509640,1652509641434,0,0,0,0,,,,,,,,,,, +15902,47112,content://media/external/images/media/47112,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0003.jpg",image/jpeg,983,740,0,115909,,1652509641,1652509641648,0,0,0,0,,,,,,,,,,, +15903,47106,content://media/external/images/media/47106,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0001.jpg",image/jpeg,986,1107,0,134812,,1652509639,1652509640853,0,0,0,0,,,,,,,,,,, +15904,47094,content://media/external/images/media/47094,/storage/emulated/0/DCIM/Camera/IMG_20220513_190129.jpg,image/jpeg,4608,2592,0,5598053,,1652461294,1652461294626,1652461289122,0,0,0,,,,,,,,,,, +15905,47071,content://media/external/images/media/47071,/storage/emulated/0/DCIM/Camera/IMG_20220513_122021.jpg,image/jpeg,2405,2606,0,4043497,,1652437226,1652437226812,1652437225093,0,0,0,,,,,,,,,,, +15906,47069,content://media/external/images/media/47069,/storage/emulated/0/DCIM/Camera/IMG_20220513_122003.jpg,image/jpeg,2408,2609,0,3542972,,1652437207,1652437207860,1652437206164,0,0,0,,,,,,,,,,, +15907,47063,content://media/external/images/media/47063,/storage/emulated/0/DCIM/Camera/IMG_20220513_121819.jpg,image/jpeg,2592,4608,0,4884368,,1652437101,1652437101840,1652437099476,0,0,0,,,,,,,,,,, +15908,47061,content://media/external/images/media/47061,/storage/emulated/0/DCIM/Camera/IMG_20220513_121804.jpg,image/jpeg,2592,4608,0,5492185,,1652437090,1652437090508,1652437084999,0,0,0,,,,,,,,,,, +15909,47058,content://media/external/images/media/47058,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220513-WA0004.jpg",image/jpeg,2048,1365,0,243991,,1652434876,1652434876431,0,0,0,0,,,,,,,,,,, +15910,47056,content://media/external/images/media/47056,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220513-WA0003.jpg",image/jpeg,640,640,0,103629,,1652433273,1652433274066,0,0,0,0,,,,,,,,,,, +15911,47043,content://media/external/images/media/47043,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220513-WA0000.jpg",image/jpeg,720,1018,0,94855,,1652392973,1652392974472,0,0,0,0,,,,,,,,,,, +15912,47035,content://media/external/images/media/47035,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220512-WA0019.jpg",image/jpeg,1500,2000,0,295249,,1652377627,1652377627970,0,0,0,0,,,,,,,,,,, +15913,47023,content://media/external/images/media/47023,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220512-WA0016.jpg",image/jpeg,1200,1600,0,265185,,1652362648,1652362649364,0,0,0,0,,,,,,,,,,, +15914,47012,content://media/external/images/media/47012,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220512-WA0012.jpg",image/jpeg,1080,1057,0,63031,,1652357784,1652357785524,0,0,0,0,,,,,,,,,,, +15915,47004,content://media/external/images/media/47004,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220512-WA0010.jpg",image/jpeg,1536,2048,0,115697,,1652351633,1652351643596,0,0,0,0,,,,,,,,,,, +15916,46999,content://media/external/images/media/46999,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-12-10-16-07-708_it.subito.jpg,image/jpeg,1080,2400,0,534638,,1652343368,1652343368065,0,0,0,0,,,,,,,,,,, +15917,46997,content://media/external/images/media/46997,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-12-10-08-18-626_it.subito.jpg,image/jpeg,1080,2400,0,507067,,1652342898,1652342899026,0,0,0,0,,,,,,,,,,, +15918,46995,content://media/external/images/media/46995,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-12-08-39-52-303_it.sda.mobile.jpg,image/jpeg,1080,2400,0,803000,,1652337592,1652337592623,0,0,0,0,,,,,,,,,,, +15919,46973,content://media/external/images/media/46973,/storage/emulated/0/DCIM/Camera/IMG_20220512_080057.jpg,image/jpeg,4608,2592,0,5212290,,1652335258,1652335258927,1652335257149,0,0,0,,,,,,,,,,, +15920,46971,content://media/external/images/media/46971,/storage/emulated/0/DCIM/Camera/IMG_20220512_080037.jpg,image/jpeg,2592,4608,0,4851262,,1652335241,1652335241291,1652335237792,0,0,0,,,,,,,,,,, +15921,46969,content://media/external/images/media/46969,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-12-07-47-16-660_com.google.android.gm.jpg,image/jpeg,1080,2400,0,404863,,1652334437,1652334437125,0,0,0,0,,,,,,,,,,, +15922,46942,content://media/external/images/media/46942,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220511-WA0014.jpg",image/jpeg,634,960,0,54712,,1652290946,1652290946669,0,0,0,0,,,,,,,,,,, +15923,46876,content://media/external/images/media/46876,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-10-21-15-31-002_com.google.android.googlequicksearchbox.jpg,image/jpeg,1080,2400,0,552581,,1652210131,1652210131455,0,0,0,0,,,,,,,,,,, +15924,46874,content://media/external/images/media/46874,/storage/emulated/0/DCIM/Camera/IMG_20220510_195756.jpg,image/jpeg,2592,4608,0,4708990,,1652205483,1652205483901,1652205476417,0,0,0,,,,,,,,,,, +15925,46732,content://media/external/images/media/46732,/storage/emulated/0/DCIM/Camera/IMG_20220508_145721.jpg,image/jpeg,2592,4608,0,5081700,,1652014643,1652014643734,1652014641558,0,0,0,,,,,,,,,,, +15926,45848,content://media/external/images/media/45848,/storage/emulated/0/Download/MiShare/1651841771728.jpg,image/jpeg,4624,3472,0,10751726,,1651841782,1651841783334,1651841556000,0,0,0,,,,,,,,,,, +15927,45839,content://media/external/images/media/45839,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220506-WA0023.jpg",image/jpeg,1599,1187,0,132311,,1651838594,1651838595268,0,0,0,0,,,,,,,,,,, +15928,45598,content://media/external/images/media/45598,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220505-WA0018.jpg",image/jpeg,921,2048,0,125657,,1651748441,1651751348395,0,0,0,0,,,,,,,,,,, +15929,45298,content://media/external/images/media/45298,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0047.jpg",image/jpeg,1536,2048,0,444669,,1651613464,1651613465444,0,0,0,0,,,,,,,,,,, +15930,45292,content://media/external/images/media/45292,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0045.jpg",image/jpeg,1536,2048,0,321000,,1651613463,1651613464144,0,0,0,0,,,,,,,,,,, +15931,45295,content://media/external/images/media/45295,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0046.jpg",image/jpeg,1200,1600,0,283681,,1651613464,1651613464707,0,0,0,0,,,,,,,,,,, +15932,45289,content://media/external/images/media/45289,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0044.jpg",image/jpeg,1200,1600,0,124166,,1651613462,1651613463065,0,0,0,0,,,,,,,,,,, +15933,45286,content://media/external/images/media/45286,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0043.jpg",image/jpeg,1536,2048,0,368662,,1651613461,1651613462375,0,0,0,0,,,,,,,,,,, +15934,45283,content://media/external/images/media/45283,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0042.jpg",image/jpeg,1152,2048,0,245692,,1651613459,1651613461185,0,0,0,0,,,,,,,,,,, +15935,45262,content://media/external/images/media/45262,/storage/emulated/0/DCIM/Screenshots/IMG_20220503_175820.jpg,image/jpeg,937,1396,0,332820,,1651593500,1651593500648,0,0,0,0,,,,,,,,,,, +15936,45114,content://media/external/images/media/45114,/storage/emulated/0/DCIM/Creative/IMG_20220503_102929.jpg,image/jpeg,874,1943,0,279496,,1651566569,1651566569734,0,0,0,0,,,,,,,,,,, +15937,44806,content://media/external/images/media/44806,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220501-WA0030.jpg",image/jpeg,1532,2048,0,231247,,1651413099,1651413100716,0,0,0,0,,,,,,,,,,, +15938,44800,content://media/external/images/media/44800,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220501-WA0028.jpg",image/jpeg,1532,2048,0,237176,,1651413098,1651413099326,0,0,0,0,,,,,,,,,,, +15939,44803,content://media/external/images/media/44803,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220501-WA0029.jpg",image/jpeg,1532,2048,0,249891,,1651413099,1651413099959,0,0,0,0,,,,,,,,,,, +15940,44365,content://media/external/images/media/44365,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0044.jpg",image/jpeg,1532,2048,0,215743,,1651176767,1651176768395,0,0,0,0,,,,,,,,,,, +15941,44368,content://media/external/images/media/44368,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0045.jpg",image/jpeg,1532,2048,0,248536,,1651176768,1651176768805,0,0,0,0,,,,,,,,,,, +15942,44359,content://media/external/images/media/44359,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0042.jpg",image/jpeg,1532,2048,0,217712,,1651176766,1651176767401,0,0,0,0,,,,,,,,,,, +15943,44362,content://media/external/images/media/44362,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0043.jpg",image/jpeg,1532,2048,0,217822,,1651176767,1651176767921,0,0,0,0,,,,,,,,,,, +15944,44353,content://media/external/images/media/44353,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0040.jpg",image/jpeg,1532,2048,0,264469,,1651176765,1651176766527,0,0,0,0,,,,,,,,,,, +15945,44356,content://media/external/images/media/44356,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0041.jpg",image/jpeg,1532,2048,0,207762,,1651176766,1651176766988,0,0,0,0,,,,,,,,,,, +15946,44350,content://media/external/images/media/44350,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0039.jpg",image/jpeg,1532,2048,0,229718,,1651176764,1651176765828,0,0,0,0,,,,,,,,,,, +15947,44342,content://media/external/images/media/44342,/storage/emulated/0/DCIM/Camera/IMG_20220428_204500.jpg,image/jpeg,2592,4608,0,4967592,,1651171503,1651171503988,1651171500410,0,0,0,,,,,,,,,,, +15948,44125,content://media/external/images/media/44125,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-26-13-55-25-149_com.whatsapp.jpg,image/jpeg,1080,2400,0,922495,,1650974125,1650974125510,0,0,0,0,,,,,,,,,,, +15949,44080,content://media/external/images/media/44080,"/storage/emulated/0/DCIM/Certificazione verde COVID-19.png",image/png,948,2507,0,423885,,1650886394,1650886394686,0,0,0,0,,,,,,,,,,, +15950,43992,content://media/external/images/media/43992,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-24-14-05-30-791_com.google.android.apps.docs.jpg,image/jpeg,2400,1080,0,380657,,1650801931,1650801931095,0,0,0,0,,,,,,,,,,, +15951,43986,content://media/external/images/media/43986,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220424-WA0007.jpg",image/jpeg,1200,1600,0,124458,,1650801042,1650801048530,0,0,0,0,,,,,,,,,,, +15952,43972,content://media/external/images/media/43972,/storage/emulated/0/DCIM/PhotoScan/IMG_20220424_131312.jpg,image/jpeg,765,1086,0,231277,,1650798793,1650798793086,0,0,0,0,,,,,,,,,,, +15953,43967,content://media/external/images/media/43967,/storage/emulated/0/DCIM/PhotoScan/IMG_20220424_131235.jpg,image/jpeg,1333,1091,0,376316,,1650798755,1650798755574,0,0,0,0,,,,,,,,,,, +15954,43858,content://media/external/images/media/43858,/storage/emulated/0/DCIM/Camera/IMG_20220421_112818.jpg,image/jpeg,3229,455,0,450605,,1650533298,1650533298750,1650533149158,0,0,0,,,,,,,,,,, +15955,43834,content://media/external/images/media/43834,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220421-WA0000.jpg",image/jpeg,2048,1536,0,461199,,1650496248,1650496249092,0,0,0,0,,,,,,,,,,, +15956,43828,content://media/external/images/media/43828,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220420-WA0000.jpg",image/jpeg,700,700,0,49341,,1650473182,1650473182815,0,0,0,0,,,,,,,,,,, +15957,43810,content://media/external/images/media/43810,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220419-WA0008.jpg",image/jpeg,1080,469,0,39839,,1650382710,1650382710643,0,0,0,0,,,,,,,,,,, +15958,43789,content://media/external/images/media/43789,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220419-WA0001.jpg",image/jpeg,900,1600,0,77021,,1650368896,1650368897822,0,0,0,0,,,,,,,,,,, +15959,43786,content://media/external/images/media/43786,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220419-WA0000.jpg",image/jpeg,900,1600,0,119602,,1650353009,1650353044975,0,0,0,0,,,,,,,,,,, +15960,43776,content://media/external/images/media/43776,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0007.jpg",image/jpeg,921,2048,0,118190,,1650312413,1650312413745,0,0,0,0,,,,,,,,,,, +15961,43774,content://media/external/images/media/43774,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0006.jpg",image/jpeg,1080,720,0,93903,,1650312401,1650312401373,0,0,0,0,,,,,,,,,,, +15962,43771,content://media/external/images/media/43771,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0005.jpg",image/jpeg,921,2048,0,111696,,1650312384,1650312385228,0,0,0,0,,,,,,,,,,, +15963,43768,content://media/external/images/media/43768,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220418-WA0004.jpg",image/jpeg,921,2048,0,144659,,1650310614,1650310615807,0,0,0,0,,,,,,,,,,, +15964,43759,content://media/external/images/media/43759,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0002.jpg",image/jpeg,921,2048,0,117212,,1650281736,1650281739343,0,0,0,0,,,,,,,,,,, +15965,43756,content://media/external/images/media/43756,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0001.jpg",image/jpeg,1416,1062,0,124493,,1650278678,1650278679556,0,0,0,0,,,,,,,,,,, +15966,43737,content://media/external/images/media/43737,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0054.jpg",image/jpeg,1080,744,0,69567,,1650207304,1650207305463,0,0,0,0,,,,,,,,,,, +15967,43731,content://media/external/images/media/43731,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0052.jpg",image/jpeg,490,866,0,48725,,1650202255,1650202256330,0,0,0,0,,,,,,,,,,, +15968,43726,content://media/external/images/media/43726,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0050.jpg",image/jpeg,2048,1568,0,292882,,1650197139,1650197140684,0,0,0,0,,,,,,,,,,, +15969,43723,content://media/external/images/media/43723,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0049.jpg",image/jpeg,1600,1200,0,215783,,1650196045,1650196049763,0,0,0,0,,,,,,,,,,, +15970,43710,content://media/external/images/media/43710,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0045.jpg",image/jpeg,1532,2048,0,232612,,1650193943,1650193944701,0,0,0,0,,,,,,,,,,, +15971,43707,content://media/external/images/media/43707,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0044.jpg",image/jpeg,1600,1200,0,264064,,1650193698,1650193699155,0,0,0,0,,,,,,,,,,, +15972,43696,content://media/external/images/media/43696,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0041.jpg",image/jpeg,1200,1600,0,195745,,1650193463,1650193464097,0,0,0,0,,,,,,,,,,, +15973,43699,content://media/external/images/media/43699,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0042.jpg",image/jpeg,1200,1600,0,275496,,1650193464,1650193464517,0,0,0,0,,,,,,,,,,, +15974,43693,content://media/external/images/media/43693,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0040.jpg",image/jpeg,1200,1600,0,278324,,1650193462,1650193463634,0,0,0,0,,,,,,,,,,, +15975,43690,content://media/external/images/media/43690,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0039.jpg",image/jpeg,1600,1200,0,275035,,1650193462,1650193462942,0,0,0,0,,,,,,,,,,, +15976,43681,content://media/external/images/media/43681,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0036.jpg",image/jpeg,289,460,0,26681,,1650191873,1650191874380,0,0,0,0,,,,,,,,,,, +15977,43675,content://media/external/images/media/43675,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0034.jpg",image/jpeg,1024,1015,0,93106,,1650188254,1650188254573,0,0,0,0,,,,,,,,,,, +15978,43672,content://media/external/images/media/43672,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0033.jpg",image/jpeg,720,479,0,72228,,1650187611,1650187612213,0,0,0,0,,,,,,,,,,, +15979,43669,content://media/external/images/media/43669,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0032.jpg",image/jpeg,612,488,0,13856,,1650187571,1650187579713,0,0,0,0,,,,,,,,,,, +15980,43666,content://media/external/images/media/43666,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0031.jpg",image/jpeg,1600,1200,0,392720,,1650185882,1650185887659,0,0,0,0,,,,,,,,,,, +15981,43661,content://media/external/images/media/43661,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0029.jpg",image/jpeg,1061,1212,0,149942,,1650185403,1650185403655,0,0,0,0,,,,,,,,,,, +15982,43655,content://media/external/images/media/43655,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0027.jpg",image/jpeg,1200,1600,0,88855,,1650185312,1650185312400,0,0,0,0,,,,,,,,,,, +15983,43658,content://media/external/images/media/43658,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0028.jpg",image/jpeg,1187,1599,0,99050,,1650185312,1650185312650,0,0,0,0,,,,,,,,,,, +15984,43653,content://media/external/images/media/43653,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0026.jpg",image/jpeg,720,905,0,75255,,1650185284,1650185284726,0,0,0,0,,,,,,,,,,, +15985,43650,content://media/external/images/media/43650,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0025.jpg",image/jpeg,225,224,0,14585,,1650184970,1650184970717,0,0,0,0,,,,,,,,,,, +15986,43647,content://media/external/images/media/43647,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0024.jpg",image/jpeg,1134,1400,0,206338,,1650184874,1650184876368,0,0,0,0,,,,,,,,,,, +15987,43644,content://media/external/images/media/43644,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0023.jpg",image/jpeg,998,1389,0,91899,,1650184485,1650184494356,0,0,0,0,,,,,,,,,,, +15988,43630,content://media/external/images/media/43630,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0017.jpg",image/jpeg,200,250,0,15223,,1650181406,1650181407350,0,0,0,0,,,,,,,,,,, +15989,43627,content://media/external/images/media/43627,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0016.jpg",image/jpeg,592,443,0,43747,,1650181335,1650181335400,0,0,0,0,,,,,,,,,,, +15990,43625,content://media/external/images/media/43625,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0015.jpg",image/jpeg,696,464,0,90464,,1650180865,1650180865221,0,0,0,0,,,,,,,,,,, +15991,43621,content://media/external/images/media/43621,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0013.jpg",image/jpeg,720,881,0,219159,,1650180442,1650180443033,0,0,0,0,,,,,,,,,,, +15992,43614,content://media/external/images/media/43614,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0011.jpg",image/jpeg,900,1600,0,414927,,1650179736,1650179751576,0,0,0,0,,,,,,,,,,, +15993,43611,content://media/external/images/media/43611,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0010.jpg",image/jpeg,1080,1068,0,162167,,1650179522,1650179527961,0,0,0,0,,,,,,,,,,, +15994,43608,content://media/external/images/media/43608,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0009.jpg",image/jpeg,1078,814,0,108955,,1650179436,1650179440802,0,0,0,0,,,,,,,,,,, +15995,43605,content://media/external/images/media/43605,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0008.jpg",image/jpeg,720,540,0,45340,,1650178782,1650178783087,0,0,0,0,,,,,,,,,,, +15996,43603,content://media/external/images/media/43603,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0007.jpg",image/jpeg,450,630,0,42171,,1650178544,1650178554698,0,0,0,0,,,,,,,,,,, +15997,43593,content://media/external/images/media/43593,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0003.jpg",image/jpeg,266,188,0,8774,,1650176684,1650176685451,0,0,0,0,,,,,,,,,,, +15998,43590,content://media/external/images/media/43590,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0002.jpg",image/jpeg,750,1082,0,98671,,1650176579,1650176580475,0,0,0,0,,,,,,,,,,, +15999,43588,content://media/external/images/media/43588,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0001.jpg",image/jpeg,300,168,0,16752,,1650176522,1650176522169,0,0,0,0,,,,,,,,,,, +16000,43570,content://media/external/images/media/43570,/storage/emulated/0/DCIM/Camera/IMG_20220416_183958.jpg,image/jpeg,4608,2592,0,5261469,,1650127211,1650127211973,1650127198300,0,0,0,,,,,,,,,,, +16001,43569,content://media/external/images/media/43569,/storage/emulated/0/Pictures/Telegram/IMG_20220416_181451_197.jpg,image/jpeg,1280,960,0,252214,,1650125690,1650125690875,0,0,0,0,,,,,,,,,,, +16002,43568,content://media/external/images/media/43568,/storage/emulated/0/Pictures/Telegram/IMG_20220416_181445_996.jpg,image/jpeg,960,1280,0,296101,,1650125685,1650125685799,0,0,0,0,,,,,,,,,,, +16003,43567,content://media/external/images/media/43567,/storage/emulated/0/Pictures/Telegram/IMG_20220416_181442_321.jpg,image/jpeg,1280,960,0,252040,,1650125681,1650125681939,0,0,0,0,,,,,,,,,,, +16004,43566,content://media/external/images/media/43566,/storage/emulated/0/Pictures/Telegram/IMG_20220416_181439_852.jpg,image/jpeg,960,1280,0,226602,,1650125679,1650125679175,0,0,0,0,,,,,,,,,,, +16005,43550,content://media/external/images/media/43550,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220416-WA0002.jpg",image/jpeg,1200,1600,0,625792,,1650119451,1650119569016,0,0,0,0,,,,,,,,,,, +16006,43548,content://media/external/images/media/43548,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220416-WA0001.jpg",image/jpeg,1600,1200,0,136820,,1650114370,1650119490871,0,0,0,0,,,,,,,,,,, +16007,43545,content://media/external/images/media/43545,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220416-WA0000.jpg",image/jpeg,921,2048,0,172995,,1650107026,1650107027427,0,0,0,0,,,,,,,,,,, +16008,43530,content://media/external/images/media/43530,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0011.jpg",image/jpeg,896,2000,0,214843,,1650045040,1650045041478,0,0,0,0,,,,,,,,,,, +16009,37532,content://media/external/images/media/37532,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0009.jpg",image/jpeg,2048,2048,0,362960,,1650037223,1650037224202,0,0,0,0,,,,,,,,,,, +16010,37518,content://media/external/images/media/37518,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0007.jpg",image/jpeg,600,639,0,50201,,1650025308,1650025308468,0,0,0,0,,,,,,,,,,, +16011,37512,content://media/external/images/media/37512,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0006.jpg",image/jpeg,1532,2048,0,198644,,1650016901,1650016905214,0,0,0,0,,,,,,,,,,, +16012,37510,content://media/external/images/media/37510,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-15-09-34-57-599_com.instagram.android.jpg,image/jpeg,1080,2400,0,971947,,1650008097,1650008097744,0,0,0,0,,,,,,,,,,, +16013,37508,content://media/external/images/media/37508,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-15-08-13-19-821_com.google.android.gm.jpg,image/jpeg,1080,2400,0,412628,,1650003200,1650003200127,0,0,0,0,,,,,,,,,,, +16014,37506,content://media/external/images/media/37506,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-15-08-11-43-214_com.google.android.gm.jpg,image/jpeg,1080,2400,0,388803,,1650003103,1650003103603,0,0,0,0,,,,,,,,,,, +16015,37500,content://media/external/images/media/37500,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-15-08-06-35-522_com.instagram.android.jpg,image/jpeg,1080,2400,0,1057211,,1650002795,1650002795703,0,0,0,0,,,,,,,,,,, +16016,37498,content://media/external/images/media/37498,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0000.jpg",image/jpeg,1080,655,0,382817,,1650002316,1650002317202,0,0,0,0,,,,,,,,,,, +16017,37481,content://media/external/images/media/37481,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0017.jpg",image/jpeg,1532,2048,0,233239,,1649946888,1649946889108,0,0,0,0,,,,,,,,,,, +16018,37484,content://media/external/images/media/37484,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0018.jpg",image/jpeg,1532,2048,0,432979,,1649946889,1649946889520,0,0,0,0,,,,,,,,,,, +16019,37475,content://media/external/images/media/37475,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0015.jpg",image/jpeg,1512,2016,0,369122,,1649943665,1649943666136,0,0,0,0,,,,,,,,,,, +16020,37472,content://media/external/images/media/37472,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0014.jpg",image/jpeg,1512,2016,0,287506,,1649943664,1649943665439,0,0,0,0,,,,,,,,,,, +16021,37466,content://media/external/images/media/37466,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0012.jpg",image/jpeg,1512,2016,0,365111,,1649943663,1649943664177,0,0,0,0,,,,,,,,,,, +16022,37469,content://media/external/images/media/37469,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0013.jpg",image/jpeg,1512,2016,0,300439,,1649943664,1649943664795,0,0,0,0,,,,,,,,,,, +16023,37460,content://media/external/images/media/37460,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0010.jpg",image/jpeg,2016,1512,0,572735,,1649943662,1649943663100,0,0,0,0,,,,,,,,,,, +16024,37463,content://media/external/images/media/37463,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0011.jpg",image/jpeg,2016,1512,0,170058,,1649943663,1649943663501,0,0,0,0,,,,,,,,,,, +16025,37457,content://media/external/images/media/37457,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0009.jpg",image/jpeg,1512,2016,0,403211,,1649943661,1649943662597,0,0,0,0,,,,,,,,,,, +16026,37454,content://media/external/images/media/37454,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0008.jpg",image/jpeg,1512,2016,0,297171,,1649943660,1649943661858,0,0,0,0,,,,,,,,,,, +16027,37418,content://media/external/images/media/37418,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220413-WA0008.jpg",image/jpeg,1200,1600,0,126701,,1649874008,1649874010236,0,0,0,0,,,,,,,,,,, +16028,37375,content://media/external/images/media/37375,/storage/emulated/0/Download/maxresdefault.jpg,image/jpeg,1280,720,0,135761,,1649775713,1649775713011,0,0,0,0,,,,,,,,,,, +16029,37319,content://media/external/images/media/37319,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220411-WA0033.jpg",image/jpeg,921,2048,0,139359,,1649700058,1649700060235,0,0,0,0,,,,,,,,,,, +16030,37307,content://media/external/images/media/37307,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220411-WA0029.jpg",image/jpeg,921,2048,0,104999,,1649697324,1649697325525,0,0,0,0,,,,,,,,,,, +16031,37076,content://media/external/images/media/37076,/storage/emulated/0/DCIM/Camera/IMG_20220409_134126.jpg,image/jpeg,3200,1800,0,2540357,,1649504489,1649504490219,1649504486965,0,0,0,,,,,,,,,,, +16032,37065,content://media/external/images/media/37065,/storage/emulated/0/DCIM/Camera/IMG_20220409_131236.jpg,image/jpeg,3200,1800,0,2893029,,1649502759,1649502759998,1649502756734,0,0,0,,,,,,,,,,, +16033,37063,content://media/external/images/media/37063,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220409-WA0002.jpeg",image/jpeg,3840,2160,0,2639071,,1649501186,1649501186437,1649501186339,0,0,0,,,,,,,,,,, +16034,37006,content://media/external/images/media/37006,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220407-WA0006.jpg",image/jpeg,870,1024,0,66173,,1649332278,1649332278857,0,0,0,0,,,,,,,,,,, +16035,36990,content://media/external/images/media/36990,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220407-WA0001.jpg",image/jpeg,2048,1536,0,381538,,1649310554,1649310555506,0,0,0,0,,,,,,,,,,, +16036,36987,content://media/external/images/media/36987,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220407-WA0000.jpg",image/jpeg,2048,1536,0,434324,,1649310553,1649310554700,0,0,0,0,,,,,,,,,,, +16037,36897,content://media/external/images/media/36897,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220403-WA0004.jpg",image/jpeg,1536,2048,0,532400,,1648987549,1648987561122,0,0,0,0,,,,,,,,,,, +16038,36805,content://media/external/images/media/36805,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220401-WA0020.jpeg",image/jpeg,3840,2160,0,2197823,,1648825396,1648825396114,1648825396021,0,0,0,,,,,,,,,,, +16039,36802,content://media/external/images/media/36802,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-01-16-59-22-124_com.brytonsport.active.jpg,image/jpeg,1080,2400,0,453046,,1648825162,1648825162394,0,0,0,0,,,,,,,,,,, +16040,36801,content://media/external/images/media/36801,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-01-16-59-08-036_com.brytonsport.active.jpg,image/jpeg,1080,2400,0,460853,,1648825148,1648825148394,0,0,0,0,,,,,,,,,,, +16041,36798,content://media/external/images/media/36798,/storage/emulated/0/DCIM/Camera/IMG_20220401_155820.jpg,image/jpeg,4608,2592,0,3599677,,1648821504,1648821504962,1648821500222,0,0,0,,,,,,,,,,, +16042,36795,content://media/external/images/media/36795,/storage/emulated/0/DCIM/Camera/IMG_20220401_154130.jpg,image/jpeg,4608,2592,0,6789485,,1648820495,1648820495206,1648820490162,0,0,0,,,,,,,,,,, +16043,36792,content://media/external/images/media/36792,/storage/emulated/0/DCIM/Camera/IMG_20220401_152248.jpg,image/jpeg,4608,2592,0,9245028,,1648819373,1648819373574,1648819368340,0,0,0,,,,,,,,,,, +16044,36789,content://media/external/images/media/36789,/storage/emulated/0/DCIM/Camera/IMG_20220401_151934.jpg,image/jpeg,3200,1800,0,3029166,,1648819179,1648819179506,1648819174623,0,0,0,,,,,,,,,,, +16045,36786,content://media/external/images/media/36786,/storage/emulated/0/DCIM/Camera/IMG_20220401_151155.jpg,image/jpeg,4608,2592,0,6251759,,1648818718,1648818718182,1648818716750,0,0,0,,,,,,,,,,, +16046,36776,content://media/external/images/media/36776,/storage/emulated/0/DCIM/Camera/IMG_20220401_135236.jpg,image/jpeg,4608,2592,0,4956838,,1648813959,1648813959390,1648813956298,0,0,0,,,,,,,,,,, +16047,36773,content://media/external/images/media/36773,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220401-WA0008.jpeg",image/jpeg,3840,2160,90,1077125,,1648813267,1648813268014,1648813267934,0,0,0,,,,,,,,,,, +16048,36770,content://media/external/images/media/36770,/storage/emulated/0/DCIM/Camera/IMG_20220401_133510.jpg,image/jpeg,4608,2592,0,4535622,,1648812915,1648812916094,1648812911189,0,0,0,,,,,,,,,,, +16049,36767,content://media/external/images/media/36767,/storage/emulated/0/DCIM/Camera/IMG_20220401_123807.jpg,image/jpeg,4608,2592,0,4269087,,1648809492,1648809492302,1648809487292,0,0,0,,,,,,,,,,, +16050,36764,content://media/external/images/media/36764,/storage/emulated/0/DCIM/Camera/IMG_20220401_115917.jpg,image/jpeg,3200,1800,0,2213434,,1648807164,1648807164114,1648807157882,0,0,0,,,,,,,,,,, +16051,36758,content://media/external/images/media/36758,/storage/emulated/0/DCIM/Camera/IMG_20220401_110025.jpg,image/jpeg,5120,2880,0,4285225,,1648803628,1648803628250,1648803625522,0,0,0,,,,,,,,,,, +16052,36752,content://media/external/images/media/36752,/storage/emulated/0/DCIM/Camera/IMG_20220401_103804.jpg,image/jpeg,3200,1800,0,2479857,,1648802290,1648802290990,1648802284822,0,0,0,,,,,,,,,,, +16053,36749,content://media/external/images/media/36749,/storage/emulated/0/DCIM/Camera/IMG_20220401_100545.jpg,image/jpeg,3200,1800,0,2614847,,1648800352,1648800352154,1648800346966,0,0,0,,,,,,,,,,, +16054,36529,content://media/external/images/media/36529,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-03-26-19-25-46-048_com.strava.jpg,image/jpeg,1080,2400,0,648921,,1648319146,1648319146190,0,0,0,0,,,,,,,,,,, +16055,36514,content://media/external/images/media/36514,/storage/emulated/0/DCIM/Camera/IMG_20220326_123602.jpg,image/jpeg,4608,2592,0,4193057,,1648294564,1648294564114,1648294562699,0,0,0,,,,,,,,,,, +16056,36512,content://media/external/images/media/36512,/storage/emulated/0/DCIM/Camera/IMG_20220326_123541.jpg,image/jpeg,4608,2592,0,3951755,,1648294542,1648294542646,1648294541209,0,0,0,,,,,,,,,,, +16057,36510,content://media/external/images/media/36510,/storage/emulated/0/DCIM/Camera/IMG_20220326_123536.jpg,image/jpeg,4608,2592,0,3994389,,1648294538,1648294538398,1648294536842,0,0,0,,,,,,,,,,, +16058,36508,content://media/external/images/media/36508,/storage/emulated/0/DCIM/Camera/IMG_20220326_123532.jpg,image/jpeg,4608,2592,0,3700818,,1648294534,1648294534658,1648294532565,0,0,0,,,,,,,,,,, +16059,36506,content://media/external/images/media/36506,/storage/emulated/0/DCIM/Camera/IMG_20220326_123528.jpg,image/jpeg,4608,2592,0,3754046,,1648294532,1648294532294,1648294529490,0,0,0,,,,,,,,,,, +16060,36474,content://media/external/images/media/36474,/storage/emulated/0/DCIM/Camera/IMG_20220325_231026.jpg,image/jpeg,4608,2592,0,4208483,,1648246228,1648246228686,1648246226610,0,0,0,,,,,,,,,,, +16061,36472,content://media/external/images/media/36472,/storage/emulated/0/DCIM/Camera/IMG_20220325_231021.jpg,image/jpeg,4608,2592,0,4067058,,1648246225,1648246225370,1648246221942,0,0,0,,,,,,,,,,, +16062,36470,content://media/external/images/media/36470,/storage/emulated/0/DCIM/Camera/IMG_20220325_211126.jpg,image/jpeg,4608,2592,0,3756237,,1648239088,1648239088322,1648239086830,0,0,0,,,,,,,,,,, +16063,36468,content://media/external/images/media/36468,/storage/emulated/0/DCIM/Camera/IMG_20220325_211122.jpg,image/jpeg,4608,2592,0,4273626,,1648239085,1648239085434,1648239082635,0,0,0,,,,,,,,,,, +16064,36461,content://media/external/images/media/36461,/storage/emulated/0/DCIM/Camera/IMG_20220325_170441.jpg,image/jpeg,4608,2592,0,4255688,,1648224285,1648224285518,1648224283643,0,0,0,,,,,,,,,,, +16065,36459,content://media/external/images/media/36459,/storage/emulated/0/DCIM/Camera/IMG_20220325_170437.jpg,image/jpeg,4608,2592,0,4756792,,1648224281,1648224281726,1648224278909,0,0,0,,,,,,,,,,, +16066,36260,content://media/external/images/media/36260,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-03-20-19-26-21-628_com.brytonsport.active.jpg,image/jpeg,1080,2400,0,412334,,1647800781,1647800781731,0,0,0,0,,,,,,,,,,, +16067,36259,content://media/external/images/media/36259,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-03-20-19-26-06-837_com.brytonsport.active.jpg,image/jpeg,1080,2400,0,541851,,1647800767,1647800767123,0,0,0,0,,,,,,,,,,, +16068,36244,content://media/external/images/media/36244,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220320-WA0009.jpg",image/jpeg,1200,1600,0,219298,,1647789979,1647789980204,0,0,0,0,,,,,,,,,,, +16069,36203,content://media/external/images/media/36203,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220319-WA0010.jpg",image/jpeg,2048,1532,0,221047,,1647716756,1647716757151,0,0,0,0,,,,,,,,,,, +16070,36200,content://media/external/images/media/36200,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220319-WA0009.jpg",image/jpeg,2048,1532,0,251040,,1647716752,1647716753775,0,0,0,0,,,,,,,,,,, +16071,36198,content://media/external/images/media/36198,/storage/emulated/0/DCIM/Camera/IMG_20220319_191600.jpg,image/jpeg,3200,1800,0,1914414,,1647713763,1647713763200,1647713760549,0,0,0,,,,,,,,,,, +16072,36177,content://media/external/images/media/36177,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220319-WA0002.jpg",image/jpeg,2048,1532,0,326969,,1647688846,1647688847457,0,0,0,0,,,,,,,,,,, +16073,36029,content://media/external/images/media/36029,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0009.jpg",image/jpeg,1536,2048,0,344326,,1647472368,1647472369189,0,0,0,0,,,,,,,,,,, +16074,36023,content://media/external/images/media/36023,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0007.jpg",image/jpeg,2048,1536,0,460448,,1647472367,1647472368311,0,0,0,0,,,,,,,,,,, +16075,36026,content://media/external/images/media/36026,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0008.jpg",image/jpeg,1536,2048,0,412597,,1647472368,1647472368791,0,0,0,0,,,,,,,,,,, +16076,36017,content://media/external/images/media/36017,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0005.jpg",image/jpeg,2048,1536,0,413455,,1647472366,1647472367313,0,0,0,0,,,,,,,,,,, +16077,36020,content://media/external/images/media/36020,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0006.jpg",image/jpeg,2048,1536,0,465153,,1647472367,1647472367706,0,0,0,0,,,,,,,,,,, +16078,36011,content://media/external/images/media/36011,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0003.jpg",image/jpeg,2048,1536,0,394657,,1647472365,1647472366334,0,0,0,0,,,,,,,,,,, +16079,36014,content://media/external/images/media/36014,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0004.jpg",image/jpeg,1536,2048,0,409071,,1647472366,1647472366994,0,0,0,0,,,,,,,,,,, +16080,36005,content://media/external/images/media/36005,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0001.jpg",image/jpeg,2048,1536,0,454208,,1647472364,1647472365109,0,0,0,0,,,,,,,,,,, +16081,36008,content://media/external/images/media/36008,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0002.jpg",image/jpeg,2048,1536,0,342868,,1647472365,1647472365775,0,0,0,0,,,,,,,,,,, +16082,36002,content://media/external/images/media/36002,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0000.jpg",image/jpeg,2048,1536,0,378262,,1647472361,1647472364230,0,0,0,0,,,,,,,,,,, +16083,35858,content://media/external/images/media/35858,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220314-WA0004.jpg",image/jpeg,899,1599,0,97375,,1647243306,1647248790133,0,0,0,0,,,,,,,,,,, +16084,35854,content://media/external/images/media/35854,/storage/emulated/0/DCIM/Camera/IMG_20220314_075018.jpg,image/jpeg,2592,4608,0,5561975,,1647240620,1647240620822,1647240618255,0,0,0,,,,,,,,,,, +16085,35852,content://media/external/images/media/35852,/storage/emulated/0/DCIM/Camera/IMG_20220314_075004.jpg,image/jpeg,2592,4608,0,4789090,,1647240608,1647240608574,1647240604998,0,0,0,,,,,,,,,,, +16086,35332,content://media/external/images/media/35332,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0008.jpg",image/jpeg,1600,1200,0,144446,,1646578185,1646578186527,0,0,0,0,,,,,,,,,,, +16087,35335,content://media/external/images/media/35335,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0009.jpg",image/jpeg,1600,1200,0,146664,,1646578186,1646578186957,0,0,0,0,,,,,,,,,,, +16088,35326,content://media/external/images/media/35326,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0006.jpg",image/jpeg,1600,1200,0,145332,,1646578184,1646578185306,0,0,0,0,,,,,,,,,,, +16089,35329,content://media/external/images/media/35329,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0007.jpg",image/jpeg,1600,1200,0,143787,,1646578185,1646578185904,0,0,0,0,,,,,,,,,,, +16090,35323,content://media/external/images/media/35323,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0005.jpg",image/jpeg,899,1599,0,184393,,1646574126,1646574127021,0,0,0,0,,,,,,,,,,, +16091,35320,content://media/external/images/media/35320,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0004.jpg",image/jpeg,899,1599,0,106311,,1646574125,1646574126004,0,0,0,0,,,,,,,,,,, +16092,35309,content://media/external/images/media/35309,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0001.jpg",image/jpeg,1200,1600,0,139728,,1646572528,1646573497107,0,0,0,0,,,,,,,,,,, +16093,35312,content://media/external/images/media/35312,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0002.jpg",image/jpeg,738,1600,0,143838,,1646572802,1646573449451,0,0,0,0,,,,,,,,,,, +16094,35315,content://media/external/images/media/35315,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0003.jpg",image/jpeg,899,1599,0,110241,,1646572838,1646572844231,0,0,0,0,,,,,,,,,,, +16095,35306,content://media/external/images/media/35306,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0000.jpg",image/jpeg,1536,2048,0,381277,,1646568187,1646568189182,0,0,0,0,,,,,,,,,,, +16096,35293,content://media/external/images/media/35293,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220305-WA0006.jpg",image/jpeg,1532,2048,0,280215,,1646507842,1646507843525,0,0,0,0,,,,,,,,,,, +16097,35283,content://media/external/images/media/35283,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220305-WA0003.jpg",image/jpeg,1532,2048,0,205843,,1646482966,1646482967363,0,0,0,0,,,,,,,,,,, +16098,35078,content://media/external/images/media/35078,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0013.jpg",image/jpeg,1599,899,0,106611,,1646287844,1646287844987,0,0,0,0,,,,,,,,,,, +16099,35074,content://media/external/images/media/35074,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0012.jpg",image/jpeg,2048,1536,0,308073,,1646263448,1646263449772,0,0,0,0,,,,,,,,,,, +16100,35071,content://media/external/images/media/35071,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0011.jpg",image/jpeg,2048,1536,0,309758,,1646263447,1646263448959,0,0,0,0,,,,,,,,,,, +16101,35068,content://media/external/images/media/35068,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0010.jpg",image/jpeg,1536,2048,0,272891,,1646263446,1646263447772,0,0,0,0,,,,,,,,,,, +16102,35065,content://media/external/images/media/35065,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0009.jpg",image/jpeg,2048,1536,0,435631,,1646263445,1646263446878,0,0,0,0,,,,,,,,,,, +16103,35062,content://media/external/images/media/35062,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0008.jpg",image/jpeg,2048,1536,0,262799,,1646263444,1646263445805,0,0,0,0,,,,,,,,,,, +16104,35056,content://media/external/images/media/35056,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0006.jpg",image/jpeg,2048,1536,0,384053,,1646263443,1646263444178,0,0,0,0,,,,,,,,,,, +16105,35059,content://media/external/images/media/35059,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0007.jpg",image/jpeg,2048,1536,0,272540,,1646263444,1646263444978,0,0,0,0,,,,,,,,,,, +16106,35053,content://media/external/images/media/35053,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0005.jpg",image/jpeg,2048,1536,0,314726,,1646263442,1646263443244,0,0,0,0,,,,,,,,,,, +16107,35050,content://media/external/images/media/35050,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0004.jpg",image/jpeg,1536,2048,0,292492,,1646263441,1646263442091,0,0,0,0,,,,,,,,,,, +16108,35047,content://media/external/images/media/35047,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0003.jpg",image/jpeg,2048,1536,0,328616,,1646263440,1646263441209,0,0,0,0,,,,,,,,,,, +16109,35044,content://media/external/images/media/35044,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0002.jpg",image/jpeg,1536,2048,0,259912,,1646263439,1646263440270,0,0,0,0,,,,,,,,,,, +16110,35041,content://media/external/images/media/35041,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0001.jpg",image/jpeg,2048,1394,0,357570,,1646263438,1646263439344,0,0,0,0,,,,,,,,,,, +16111,35038,content://media/external/images/media/35038,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0000.jpg",image/jpeg,2048,1536,0,456394,,1646263436,1646263438423,0,0,0,0,,,,,,,,,,, +16112,35035,content://media/external/images/media/35035,/storage/emulated/0/DCIM/Camera/IMG_20220302_233621.jpg,image/jpeg,4608,2592,0,4072844,,1646260585,1646260585240,1646260581979,0,0,0,,,,,,,,,,, +16113,35033,content://media/external/images/media/35033,/storage/emulated/0/DCIM/Camera/IMG_20220302_233557.jpg,image/jpeg,4608,2592,0,4589797,,1646260561,1646260561932,1646260557236,0,0,0,,,,,,,,,,, +16114,34925,content://media/external/images/media/34925,/storage/emulated/0/DCIM/Camera/IMG_20220228_171116.jpg,image/jpeg,4608,2592,0,5598854,,1646064681,1646064681765,1646064676829,0,0,0,,,,,,,,,,, +16115,34761,content://media/external/images/media/34761,/storage/emulated/0/DCIM/Camera/IMG_20220224_140401.jpg,image/jpeg,4608,2592,0,4539108,,1645707844,1645707844467,1645707841998,0,0,0,,,,,,,,,,, +16116,34759,content://media/external/images/media/34759,/storage/emulated/0/DCIM/Camera/IMG_20220224_140223.jpg,image/jpeg,2592,4608,0,4381862,,1645707745,1645707745054,1645707743304,0,0,0,,,,,,,,,,, +16117,34757,content://media/external/images/media/34757,/storage/emulated/0/DCIM/Camera/IMG_20220224_140220.jpg,image/jpeg,2592,4608,0,4443193,,1645707742,1645707742774,1645707740935,0,0,0,,,,,,,,,,, +16118,34755,content://media/external/images/media/34755,/storage/emulated/0/DCIM/Camera/IMG_20220224_140212.jpg,image/jpeg,4608,2592,0,4097973,,1645707735,1645707735586,1645707732892,0,0,0,,,,,,,,,,, +16119,34753,content://media/external/images/media/34753,/storage/emulated/0/DCIM/Camera/IMG_20220224_133735.jpg,image/jpeg,4608,2592,0,3690649,,1645706257,1645706257778,1645706256213,0,0,0,,,,,,,,,,, +16120,34751,content://media/external/images/media/34751,/storage/emulated/0/DCIM/Camera/IMG_20220224_133732.jpg,image/jpeg,4608,2592,0,4794275,,1645706255,1645706255750,1645706253174,0,0,0,,,,,,,,,,, +16121,34749,content://media/external/images/media/34749,/storage/emulated/0/DCIM/Camera/IMG_20220224_131700.jpg,image/jpeg,3200,1800,0,1795114,,1645705021,1645705021801,1645705020913,0,0,0,,,,,,,,,,, +16122,34747,content://media/external/images/media/34747,/storage/emulated/0/DCIM/Camera/IMG_20220224_131656.jpg,image/jpeg,3200,1800,0,1876064,,1645705019,1645705019457,1645705017321,0,0,0,,,,,,,,,,, +16123,34746,content://media/external/images/media/34746,/storage/emulated/0/DCIM/Camera/PANO_20220224_131618.jpg,image/jpeg,9168,4352,0,22879655,,1645704984,1645704984213,0,0,0,0,,,,,,,,,,, +16124,34739,content://media/external/images/media/34739,/storage/emulated/0/DCIM/Camera/IMG_20220224_131127.jpg,image/jpeg,4608,2592,0,4791719,,1645704690,1645704690393,1645704687296,0,0,0,,,,,,,,,,, +16125,34696,content://media/external/images/media/34696,/storage/emulated/0/DCIM/Camera/PANO_20220223_124059.jpg,image/jpeg,9808,4256,0,31160356,,1645616466,1645616466036,0,0,0,0,,,,,,,,,,, +16126,34694,content://media/external/images/media/34694,/storage/emulated/0/DCIM/Camera/PANO_20220223_124029.jpg,image/jpeg,10064,4352,0,30739071,,1645616439,1645616438820,0,0,0,0,,,,,,,,,,, +16127,34678,content://media/external/images/media/34678,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0007.jpg",image/jpeg,2048,1536,0,204987,,1645613939,1645613940306,0,0,0,0,,,,,,,,,,, +16128,34681,content://media/external/images/media/34681,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0008.jpg",image/jpeg,2048,1536,0,188152,,1645613940,1645613940633,0,0,0,0,,,,,,,,,,, +16129,34684,content://media/external/images/media/34684,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0009.jpg",image/jpeg,2048,1536,0,184685,,1645613940,1645613940894,0,0,0,0,,,,,,,,,,, +16130,34675,content://media/external/images/media/34675,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0006.jpg",image/jpeg,2048,1536,0,203174,,1645613939,1645613939608,0,0,0,0,,,,,,,,,,, +16131,34672,content://media/external/images/media/34672,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0005.jpg",image/jpeg,2048,1536,0,211192,,1645613937,1645613938597,0,0,0,0,,,,,,,,,,, +16132,34667,content://media/external/images/media/34667,/storage/emulated/0/DCIM/Camera/IMG_20220223_113545.jpg,image/jpeg,3200,1800,0,2376439,,1645612546,1645612546659,1645612545249,0,0,0,,,,,,,,,,, +16133,34665,content://media/external/images/media/34665,/storage/emulated/0/DCIM/Camera/IMG_20220223_113539.jpg,image/jpeg,3200,1800,0,2416884,,1645612541,1645612541691,1645612539464,0,0,0,,,,,,,,,,, +16134,34597,content://media/external/images/media/34597,/storage/emulated/0/DCIM/Camera/IMG_20220222_123328.jpg,image/jpeg,3200,1800,0,1936666,,1645529610,1645529610237,1645529608477,0,0,0,,,,,,,,,,, +16135,34598,content://media/external/images/media/34598,/storage/emulated/0/DCIM/Camera/IMG_20220222_123328_1.jpg,image/jpeg,3200,1800,0,1818229,,1645529610,1645529610317,1645529609600,0,0,0,,,,,,,,,,, +16136,34595,content://media/external/images/media/34595,/storage/emulated/0/DCIM/Camera/IMG_20220222_123256.jpg,image/jpeg,3200,1800,0,2021106,,1645529578,1645529578837,1645529576573,0,0,0,,,,,,,,,,, +16137,34592,content://media/external/images/media/34592,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220222-WA0005.jpg",image/jpeg,1824,1368,0,344942,,1645528037,1645528120017,0,0,0,0,,,,,,,,,,, +16138,34590,content://media/external/images/media/34590,/storage/emulated/0/DCIM/Camera/IMG_20220222_114843.jpg,image/jpeg,3200,1800,0,2712229,,1645526926,1645526926036,1645526924132,0,0,0,,,,,,,,,,, +16139,34588,content://media/external/images/media/34588,/storage/emulated/0/DCIM/Camera/IMG_20220222_114505.jpg,image/jpeg,4608,2592,0,8167715,,1645526707,1645526707546,1645526705359,0,0,0,,,,,,,,,,, +16140,34586,content://media/external/images/media/34586,/storage/emulated/0/DCIM/Camera/IMG_20220222_114310.jpg,image/jpeg,3200,1800,0,3379094,,1645526591,1645526591666,1645526590537,0,0,0,,,,,,,,,,, +16141,34584,content://media/external/images/media/34584,/storage/emulated/0/DCIM/Camera/IMG_20220222_114306.jpg,image/jpeg,3200,1800,0,3446774,,1645526588,1645526588090,1645526587100,0,0,0,,,,,,,,,,, +16142,34582,content://media/external/images/media/34582,/storage/emulated/0/DCIM/Camera/IMG_20220222_114304.jpg,image/jpeg,3200,1800,0,3416597,,1645526586,1645526586258,1645526585167,0,0,0,,,,,,,,,,, +16143,34580,content://media/external/images/media/34580,/storage/emulated/0/DCIM/Camera/IMG_20220222_114244.jpg,image/jpeg,3200,1800,0,3453187,,1645526566,1645526566842,1645526564982,0,0,0,,,,,,,,,,, +16144,34578,content://media/external/images/media/34578,/storage/emulated/0/DCIM/Camera/IMG_20220222_114229.jpg,image/jpeg,2592,4608,0,7158247,,1645526552,1645526552366,1645526549379,0,0,0,,,,,,,,,,, +16145,34572,content://media/external/images/media/34572,/storage/emulated/0/DCIM/Camera/IMG_20220222_103809.jpg,image/jpeg,5120,2880,0,4327767,,1645522691,1645522691410,1645522689934,0,0,0,,,,,,,,,,, +16146,34570,content://media/external/images/media/34570,/storage/emulated/0/DCIM/Camera/IMG_20220222_103750.jpg,image/jpeg,3200,1800,0,2549600,,1645522673,1645522673394,1645522671360,0,0,0,,,,,,,,,,, +16147,34566,content://media/external/images/media/34566,/storage/emulated/0/DCIM/Camera/IMG_20220222_090602.jpg,image/jpeg,4608,2592,0,4624591,,1645517165,1645517165572,1645517163206,0,0,0,,,,,,,,,,, +16148,34563,content://media/external/images/media/34563,/storage/emulated/0/DCIM/Camera/IMG_20220222_090353.jpg,image/jpeg,4608,2592,0,5559291,,1645517036,1645517036412,1645517033874,0,0,0,,,,,,,,,,, +16149,34527,content://media/external/images/media/34527,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220221-WA0042.jpg",image/jpeg,1599,899,0,92542,,1645467868,1645467868594,0,0,0,0,,,,,,,,,,, +16150,34516,content://media/external/images/media/34516,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220221-WA0033.jpg",image/jpeg,1536,2048,0,107404,,1645466869,1645466870009,0,0,0,0,,,,,,,,,,, +16151,34504,content://media/external/images/media/34504,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220221-WA0027.jpg",image/jpeg,1824,1368,0,251416,,1645462914,1645462915070,0,0,0,0,,,,,,,,,,, +16152,34501,content://media/external/images/media/34501,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220221-WA0026.jpg",image/jpeg,1920,1080,0,199621,,1645462913,1645462914490,0,0,0,0,,,,,,,,,,, +16153,34499,content://media/external/images/media/34499,/storage/emulated/0/DCIM/Camera/IMG_20220221_175904.jpg,image/jpeg,1800,3200,0,1678970,,1645462745,1645462745624,1645462744948,0,0,0,,,,,,,,,,, +16154,34497,content://media/external/images/media/34497,/storage/emulated/0/DCIM/Camera/IMG_20220221_175902.jpg,image/jpeg,1800,3200,0,1634904,,1645462744,1645462744308,1645462743429,0,0,0,,,,,,,,,,, +16155,34493,content://media/external/images/media/34493,/storage/emulated/0/DCIM/Camera/IMG_20220221_175618.jpg,image/jpeg,3200,1800,0,2144821,,1645462579,1645462579733,1645462578986,0,0,0,,,,,,,,,,, +16156,34491,content://media/external/images/media/34491,/storage/emulated/0/DCIM/Camera/IMG_20220221_175610.jpg,image/jpeg,3200,1800,0,1922611,,1645462571,1645462572001,1645462571219,0,0,0,,,,,,,,,,, +16157,34489,content://media/external/images/media/34489,/storage/emulated/0/DCIM/Camera/IMG_20220221_175427.jpg,image/jpeg,3200,1800,0,1857282,,1645462469,1645462469401,1645462468460,0,0,0,,,,,,,,,,, +16158,34485,content://media/external/images/media/34485,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0022.jpg",image/jpeg,896,2000,0,288615,,1645462149,1645462150107,0,0,0,0,,,,,,,,,,, +16159,34482,content://media/external/images/media/34482,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0021.jpg",image/jpeg,896,2000,0,286537,,1645462148,1645462149490,0,0,0,0,,,,,,,,,,, +16160,34476,content://media/external/images/media/34476,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0019.jpg",image/jpeg,896,2000,0,67481,,1645462147,1645462148143,0,0,0,0,,,,,,,,,,, +16161,34479,content://media/external/images/media/34479,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0020.jpg",image/jpeg,896,2000,0,342683,,1645462148,1645462148745,0,0,0,0,,,,,,,,,,, +16162,34430,content://media/external/images/media/34430,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0004.jpg",image/jpeg,1536,2048,0,141043,,1645439643,1645462147186,0,0,0,0,,,,,,,,,,, +16163,34469,content://media/external/images/media/34469,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0017.jpg",image/jpeg,896,2000,0,80966,,1645462146,1645462147113,0,0,0,0,,,,,,,,,,, +16164,34473,content://media/external/images/media/34473,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0018.jpg",image/jpeg,896,2000,0,78618,,1645462147,1645462147812,0,0,0,0,,,,,,,,,,, +16165,34466,content://media/external/images/media/34466,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0016.jpg",image/jpeg,896,2000,0,257358,,1645462145,1645462146553,0,0,0,0,,,,,,,,,,, +16166,34439,content://media/external/images/media/34439,/storage/emulated/0/DCIM/Camera/IMG_20220221_153044.jpg,image/jpeg,4608,2592,0,3024039,,1645453846,1645453846893,1645453845132,0,0,0,,,,,,,,,,, +16167,34437,content://media/external/images/media/34437,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220221-WA0008.jpeg",image/jpeg,3840,2160,90,1499517,,1645452611,1645452611067,1645452610992,0,0,0,,,,,,,,,,, +16168,34428,content://media/external/images/media/34428,/storage/emulated/0/DCIM/Camera/IMG_20220221_113041.jpg,image/jpeg,2592,4608,0,3443044,,1645439442,1645439442915,1645439441614,0,0,0,,,,,,,,,,, +16169,34426,content://media/external/images/media/34426,/storage/emulated/0/DCIM/Camera/IMG_20220221_113027.jpg,image/jpeg,4608,2592,0,2679421,,1645439429,1645439429139,1645439427787,0,0,0,,,,,,,,,,, +16170,34424,content://media/external/images/media/34424,/storage/emulated/0/DCIM/Camera/IMG_20220221_113023.jpg,image/jpeg,4608,2592,0,2895483,,1645439425,1645439425295,1645439423354,0,0,0,,,,,,,,,,, +16171,34422,content://media/external/images/media/34422,/storage/emulated/0/DCIM/Camera/IMG_20220221_112734.jpg,image/jpeg,5120,2880,0,4001292,,1645439256,1645439256511,1645439255126,0,0,0,,,,,,,,,,, +16172,34420,content://media/external/images/media/34420,/storage/emulated/0/DCIM/Camera/IMG_20220221_112552.jpg,image/jpeg,3200,1800,0,2107413,,1645439153,1645439153947,1645439152436,0,0,0,,,,,,,,,,, +16173,34418,content://media/external/images/media/34418,/storage/emulated/0/DCIM/Camera/IMG_20220221_112539.jpg,image/jpeg,4608,2592,0,5143946,,1645439141,1645439141931,1645439140268,0,0,0,,,,,,,,,,, +16174,34416,content://media/external/images/media/34416,/storage/emulated/0/DCIM/Camera/IMG_20220221_112534.jpg,image/jpeg,3200,1800,0,2492328,,1645439135,1645439135579,1645439134697,0,0,0,,,,,,,,,,, +16175,34414,content://media/external/images/media/34414,/storage/emulated/0/DCIM/Camera/IMG_20220221_112509.jpg,image/jpeg,3200,1800,0,2305076,,1645439111,1645439111195,1645439109742,0,0,0,,,,,,,,,,, +16176,34412,content://media/external/images/media/34412,/storage/emulated/0/DCIM/Camera/IMG_20220221_112501.jpg,image/jpeg,4608,2592,0,4704482,,1645439104,1645439104207,1645439101311,0,0,0,,,,,,,,,,, +16177,34410,content://media/external/images/media/34410,/storage/emulated/0/DCIM/Camera/IMG_20220221_112454.jpg,image/jpeg,4608,2592,0,4514158,,1645439096,1645439096775,1645439094366,0,0,0,,,,,,,,,,, +16178,34407,content://media/external/images/media/34407,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220221-WA0003.jpg",image/jpeg,2048,1345,0,390050,,1645437072,1645437073675,0,0,0,0,,,,,,,,,,, +16179,34405,content://media/external/images/media/34405,/storage/emulated/0/DCIM/Camera/IMG_20220221_094950.jpg,image/jpeg,3200,1800,0,2932569,,1645433391,1645433391425,1645433390587,0,0,0,,,,,,,,,,, +16180,34403,content://media/external/images/media/34403,/storage/emulated/0/DCIM/Camera/IMG_20220221_094948.jpg,image/jpeg,3200,1800,0,2858051,,1645433389,1645433389593,1645433388724,0,0,0,,,,,,,,,,, +16181,34401,content://media/external/images/media/34401,/storage/emulated/0/DCIM/Camera/IMG_20220221_094947.jpg,image/jpeg,3200,1800,0,2832335,,1645433388,1645433388501,1645433387620,0,0,0,,,,,,,,,,, +16182,34399,content://media/external/images/media/34399,/storage/emulated/0/DCIM/Camera/IMG_20220221_094943.jpg,image/jpeg,3200,1800,0,2937601,,1645433385,1645433385501,1645433384257,0,0,0,,,,,,,,,,, +16183,34397,content://media/external/images/media/34397,/storage/emulated/0/DCIM/Camera/IMG_20220221_094906.jpg,image/jpeg,3200,1800,0,2659514,,1645433347,1645433347101,1645433346297,0,0,0,,,,,,,,,,, +16184,34395,content://media/external/images/media/34395,/storage/emulated/0/DCIM/Camera/IMG_20220221_094846.jpg,image/jpeg,3200,1800,0,2543800,,1645433327,1645433327501,1645433326469,0,0,0,,,,,,,,,,, +16185,34393,content://media/external/images/media/34393,/storage/emulated/0/DCIM/Camera/IMG_20220221_094842.jpg,image/jpeg,3200,1800,0,2596983,,1645433324,1645433324581,1645433322706,0,0,0,,,,,,,,,,, +16186,34368,content://media/external/images/media/34368,/storage/emulated/0/DCIM/Camera/IMG_20220220_195302.jpg,image/jpeg,4608,2592,0,5082629,,1645383185,1645383185425,1645383183112,0,0,0,,,,,,,,,,, +16187,34362,content://media/external/images/media/34362,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220220-WA0022.jpg",image/jpeg,2048,1532,0,167685,,1645380259,1645380281554,0,0,0,0,,,,,,,,,,, +16188,34348,content://media/external/images/media/34348,/storage/emulated/0/DCIM/Camera/IMG_20220220_185131.jpg,image/jpeg,3200,1800,0,1675028,,1645379493,1645379493230,1645379492194,0,0,0,,,,,,,,,,, +16189,34346,content://media/external/images/media/34346,/storage/emulated/0/DCIM/Camera/IMG_20220220_185126.jpg,image/jpeg,3200,1800,0,2207904,,1645379487,1645379487386,1645379486446,0,0,0,,,,,,,,,,, +16190,34344,content://media/external/images/media/34344,/storage/emulated/0/DCIM/Camera/IMG_20220220_185041.jpg,image/jpeg,3200,1800,0,2071367,,1645379442,1645379442158,1645379441576,0,0,0,,,,,,,,,,, +16191,34342,content://media/external/images/media/34342,/storage/emulated/0/DCIM/Camera/IMG_20220220_185030.jpg,image/jpeg,3200,1800,0,1889223,,1645379431,1645379431178,1645379430632,0,0,0,,,,,,,,,,, +16192,34340,content://media/external/images/media/34340,/storage/emulated/0/DCIM/Camera/IMG_20220220_185022.jpg,image/jpeg,3200,1800,0,1958398,,1645379423,1645379423414,1645379422609,0,0,0,,,,,,,,,,, +16193,34338,content://media/external/images/media/34338,/storage/emulated/0/DCIM/Camera/IMG_20220220_185017.jpg,image/jpeg,3200,1800,0,2056081,,1645379418,1645379418770,1645379417725,0,0,0,,,,,,,,,,, +16194,34336,content://media/external/images/media/34336,/storage/emulated/0/DCIM/Camera/IMG_20220220_184940.jpg,image/jpeg,3200,1800,0,2142092,,1645379382,1645379382054,1645379380967,0,0,0,,,,,,,,,,, +16195,34334,content://media/external/images/media/34334,/storage/emulated/0/DCIM/Camera/IMG_20220220_184923.jpg,image/jpeg,3200,1800,0,2127253,,1645379364,1645379364582,1645379363563,0,0,0,,,,,,,,,,, +16196,34332,content://media/external/images/media/34332,/storage/emulated/0/DCIM/Camera/IMG_20220220_184911.jpg,image/jpeg,3200,1800,0,2052933,,1645379353,1645379353662,1645379352354,0,0,0,,,,,,,,,,, +16197,34317,content://media/external/images/media/34317,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220220-WA0010.jpg",image/jpeg,1024,768,0,127247,,1645371121,1645371132403,0,0,0,0,,,,,,,,,,, +16198,34305,content://media/external/images/media/34305,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220220-WA0007.jpg",image/jpeg,1600,1200,0,181070,,1645364112,1645364113750,0,0,0,0,,,,,,,,,,, +16199,34299,content://media/external/images/media/34299,/storage/emulated/0/DCIM/Camera/IMG_20220220_134803.jpg,image/jpeg,3200,1800,0,2381823,,1645361286,1645361286348,1645361284260,0,0,0,,,,,,,,,,, +16200,33964,content://media/external/images/media/33964,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220216-WA0016.jpeg",image/jpeg,3840,2160,0,1470483,,1645031477,1645031478010,1645031477932,0,0,0,,,,,,,,,,, +16201,33812,content://media/external/images/media/33812,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0034.jpg",image/jpeg,1532,2048,0,295345,,1644860819,1644860826064,0,0,0,0,,,,,,,,,,, +16202,33805,content://media/external/images/media/33805,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0032.jpg",image/jpeg,1200,1600,0,111114,,1644852318,1644852319311,0,0,0,0,,,,,,,,,,, +16203,33759,content://media/external/images/media/33759,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0017.jpg",image/jpeg,2048,1532,0,415772,,1644821483,1644821484241,0,0,0,0,,,,,,,,,,, +16204,33756,content://media/external/images/media/33756,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0016.jpg",image/jpeg,2048,1532,0,318674,,1644821479,1644821483578,0,0,0,0,,,,,,,,,,, +16205,33753,content://media/external/images/media/33753,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0015.jpg",image/jpeg,1532,2048,0,403051,,1644821478,1644821479221,0,0,0,0,,,,,,,,,,, +16206,33750,content://media/external/images/media/33750,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0014.jpg",image/jpeg,1532,2048,0,449880,,1644821477,1644821478043,0,0,0,0,,,,,,,,,,, +16207,33747,content://media/external/images/media/33747,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0013.jpg",image/jpeg,2048,1532,0,400934,,1644821476,1644821477270,0,0,0,0,,,,,,,,,,, +16208,33741,content://media/external/images/media/33741,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0011.jpg",image/jpeg,1532,2048,0,361221,,1644821475,1644821476242,0,0,0,0,,,,,,,,,,, +16209,33744,content://media/external/images/media/33744,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0012.jpg",image/jpeg,2048,1532,0,331500,,1644821476,1644821476718,0,0,0,0,,,,,,,,,,, +16210,33738,content://media/external/images/media/33738,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0010.jpg",image/jpeg,1532,2048,0,307625,,1644821474,1644821475492,0,0,0,0,,,,,,,,,,, +16211,33732,content://media/external/images/media/33732,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0008.jpg",image/jpeg,2048,1532,0,373787,,1644821473,1644821474202,0,0,0,0,,,,,,,,,,, +16212,33735,content://media/external/images/media/33735,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0009.jpg",image/jpeg,2048,1003,0,268648,,1644821474,1644821474728,0,0,0,0,,,,,,,,,,, +16213,33726,content://media/external/images/media/33726,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0006.jpg",image/jpeg,2048,1532,0,274276,,1644821472,1644821473243,0,0,0,0,,,,,,,,,,, +16214,33729,content://media/external/images/media/33729,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0007.jpg",image/jpeg,2048,1532,0,260005,,1644821473,1644821473751,0,0,0,0,,,,,,,,,,, +16215,33720,content://media/external/images/media/33720,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0004.jpg",image/jpeg,2048,1532,0,490144,,1644821471,1644821472367,0,0,0,0,,,,,,,,,,, +16216,33723,content://media/external/images/media/33723,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0005.jpg",image/jpeg,2048,1532,0,270303,,1644821472,1644821472827,0,0,0,0,,,,,,,,,,, +16217,33717,content://media/external/images/media/33717,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0003.jpg",image/jpeg,2048,1532,0,364400,,1644821471,1644821471755,0,0,0,0,,,,,,,,,,, +16218,33711,content://media/external/images/media/33711,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0001.jpg",image/jpeg,1532,2048,0,294651,,1644821469,1644821470515,0,0,0,0,,,,,,,,,,, +16219,33708,content://media/external/images/media/33708,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0000.jpg",image/jpeg,1532,2048,0,382816,,1644821468,1644821469725,0,0,0,0,,,,,,,,,,, +16220,33683,content://media/external/images/media/33683,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220213-WA0072.jpg",image/jpeg,2048,1532,0,243883,,1644771851,1644771852843,0,0,0,0,,,,,,,,,,, +16221,33680,content://media/external/images/media/33680,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220213-WA0071.jpg",image/jpeg,2048,1532,0,201985,,1644771851,1644771851790,0,0,0,0,,,,,,,,,,, +16222,33669,content://media/external/images/media/33669,/storage/emulated/0/DCIM/Camera/IMG_20220213_162959.jpg,image/jpeg,4608,2592,0,3892753,,1644766201,1644766201429,1644766199709,0,0,0,,,,,,,,,,, +16223,33667,content://media/external/images/media/33667,/storage/emulated/0/DCIM/Camera/IMG_20220213_162909.jpg,image/jpeg,2592,4608,0,4551623,,1644766152,1644766152157,1644766150220,0,0,0,,,,,,,,,,, +16224,33659,content://media/external/images/media/33659,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220213-WA0065.jpg",image/jpeg,1599,899,0,164792,,1644765627,1644765628378,0,0,0,0,,,,,,,,,,, +16225,33656,content://media/external/images/media/33656,/storage/emulated/0/DCIM/Camera/IMG_20220213_161546.jpg,image/jpeg,2592,4608,0,4937367,,1644765348,1644765348389,1644765346542,0,0,0,,,,,,,,,,, +16226,33653,content://media/external/images/media/33653,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0063.jpg",image/jpeg,2048,1536,0,477901,,1644765022,1644765023047,0,0,0,0,,,,,,,,,,, +16227,33650,content://media/external/images/media/33650,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0062.jpg",image/jpeg,2048,1536,0,386546,,1644765021,1644765022090,0,0,0,0,,,,,,,,,,, +16228,33647,content://media/external/images/media/33647,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0061.jpg",image/jpeg,2048,1536,0,447968,,1644765019,1644765021117,0,0,0,0,,,,,,,,,,, +16229,33644,content://media/external/images/media/33644,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0060.jpg",image/jpeg,2048,1536,0,479560,,1644765017,1644765018578,0,0,0,0,,,,,,,,,,, +16230,33640,content://media/external/images/media/33640,/storage/emulated/0/DCIM/Camera/IMG_20220213_154220.jpg,image/jpeg,3200,1800,0,2101402,,1644763343,1644763343100,1644763340495,0,0,0,,,,,,,,,,, +16231,33641,content://media/external/images/media/33641,/storage/emulated/0/DCIM/Camera/IMG_20220213_154222.jpg,image/jpeg,3200,1800,0,2109630,,1644763343,1644763343792,1644763342452,0,0,0,,,,,,,,,,, +16232,33638,content://media/external/images/media/33638,/storage/emulated/0/DCIM/Camera/IMG_20220213_150252.jpg,image/jpeg,3200,1800,0,2538619,,1644760975,1644760975740,1644760972748,0,0,0,,,,,,,,,,, +16233,33620,content://media/external/images/media/33620,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0054.jpg",image/jpeg,1600,1200,0,351614,,1644753732,1644753733406,0,0,0,0,,,,,,,,,,, +16234,33611,content://media/external/images/media/33611,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0051.jpg",image/jpeg,1600,1200,0,347704,,1644753731,1644753732268,0,0,0,0,,,,,,,,,,, +16235,33614,content://media/external/images/media/33614,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0052.jpg",image/jpeg,1200,1600,0,94867,,1644753732,1644753732610,0,0,0,0,,,,,,,,,,, +16236,33617,content://media/external/images/media/33617,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0053.jpg",image/jpeg,1200,1600,0,112271,,1644753732,1644753732964,0,0,0,0,,,,,,,,,,, +16237,33602,content://media/external/images/media/33602,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0048.jpg",image/jpeg,1200,1600,0,226521,,1644753730,1644753731270,0,0,0,0,,,,,,,,,,, +16238,33605,content://media/external/images/media/33605,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0049.jpg",image/jpeg,1200,1600,0,313488,,1644753731,1644753731601,0,0,0,0,,,,,,,,,,, +16239,33608,content://media/external/images/media/33608,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0050.jpg",image/jpeg,1600,1200,0,266704,,1644753731,1644753731833,0,0,0,0,,,,,,,,,,, +16240,33599,content://media/external/images/media/33599,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0047.jpg",image/jpeg,2048,1536,0,478269,,1644753721,1644753722662,0,0,0,0,,,,,,,,,,, +16241,33318,content://media/external/images/media/33318,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220212-WA0015.jpg",image/jpeg,1600,1200,0,196334,,1644668943,1644750600176,0,0,0,0,,,,,,,,,,, +16242,33372,content://media/external/images/media/33372,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220212-WA0033.jpg",image/jpeg,1532,2048,0,234676,,1644671125,1644750600099,0,0,0,0,,,,,,,,,,, +16243,33406,content://media/external/images/media/33406,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220212-WA0036.jpg",image/jpeg,738,1600,0,179489,,1644674129,1644750600300,0,0,0,0,,,,,,,,,,, +16244,33591,content://media/external/images/media/33591,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0045.jpg",image/jpeg,1600,1197,0,245247,,1644750599,1644750600013,0,0,0,0,,,,,,,,,,, +16245,33595,content://media/external/images/media/33595,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0046.jpg",image/jpeg,900,1600,0,188221,,1644750600,1644750600702,0,0,0,0,,,,,,,,,,, +16246,33534,content://media/external/images/media/33534,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0004.jpg",image/jpeg,1532,2048,0,434639,,1644742037,1644750599409,0,0,0,0,,,,,,,,,,, +16247,33589,content://media/external/images/media/33589,/storage/emulated/0/DCIM/Camera/IMG_20220213_110003.jpg,image/jpeg,4608,2592,0,6757574,,1644746405,1644746405978,1644746403659,0,0,0,,,,,,,,,,, +16248,33587,content://media/external/images/media/33587,/storage/emulated/0/DCIM/Camera/IMG_20220213_105955.jpg,image/jpeg,4608,2592,0,6891502,,1644746400,1644746400530,1644746395710,0,0,0,,,,,,,,,,, +16249,33537,content://media/external/images/media/33537,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220213-WA0005.jpg",image/jpeg,1532,2048,0,406715,,1644742037,1644742038734,0,0,0,0,,,,,,,,,,, +16250,33531,content://media/external/images/media/33531,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220213-WA0003.jpg",image/jpeg,1532,2048,0,423800,,1644742035,1644742037064,0,0,0,0,,,,,,,,,,, +16251,33529,content://media/external/images/media/33529,/storage/emulated/0/DCIM/Camera/IMG_20220213_094502.jpg,image/jpeg,2592,4608,0,5364359,,1644741904,1644741905021,1644741903168,0,0,0,,,,,,,,,,, +16252,33527,content://media/external/images/media/33527,/storage/emulated/0/DCIM/Camera/IMG_20220213_093517.jpg,image/jpeg,3200,1800,0,2209734,,1644741320,1644741320651,1644741318276,0,0,0,,,,,,,,,,, +16253,33521,content://media/external/images/media/33521,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220213-WA0001.jpg",image/jpeg,2048,1532,0,349396,,1644740640,1644740641315,0,0,0,0,,,,,,,,,,, +16254,33524,content://media/external/images/media/33524,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220213-WA0002.jpg",image/jpeg,2048,1532,0,353520,,1644740641,1644740641820,0,0,0,0,,,,,,,,,,, +16255,33518,content://media/external/images/media/33518,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220213-WA0000.jpg",image/jpeg,2048,1532,0,339284,,1644740638,1644740640701,0,0,0,0,,,,,,,,,,, +16256,33504,content://media/external/images/media/33504,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0052.jpg",image/jpeg,1200,1600,0,268850,,1644688221,1644688222961,0,0,0,0,,,,,,,,,,, +16257,33498,content://media/external/images/media/33498,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0050.jpg",image/jpeg,1600,1200,0,331545,,1644688220,1644688221351,0,0,0,0,,,,,,,,,,, +16258,33501,content://media/external/images/media/33501,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0051.jpg",image/jpeg,1200,1600,0,280796,,1644688221,1644688221941,0,0,0,0,,,,,,,,,,, +16259,33495,content://media/external/images/media/33495,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0049.jpg",image/jpeg,1200,1600,0,365368,,1644688219,1644688220758,0,0,0,0,,,,,,,,,,, +16260,33492,content://media/external/images/media/33492,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0048.jpg",image/jpeg,1600,1200,0,266506,,1644688213,1644688215820,0,0,0,0,,,,,,,,,,, +16261,33489,content://media/external/images/media/33489,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0047.jpg",image/jpeg,1600,1200,0,319110,,1644688198,1644688200236,0,0,0,0,,,,,,,,,,, +16262,33484,content://media/external/images/media/33484,/storage/emulated/0/DCIM/Camera/IMG_20220212_172525.jpg,image/jpeg,2592,4608,0,5207763,,1644683130,1644683130552,1644683125536,0,0,0,,,,,,,,,,, +16263,33479,content://media/external/images/media/33479,/storage/emulated/0/DCIM/Camera/IMG_20220212_164628.jpg,image/jpeg,4608,2592,0,5878043,,1644680790,1644680790073,1644680788926,0,0,0,,,,,,,,,,, +16264,33477,content://media/external/images/media/33477,/storage/emulated/0/DCIM/Camera/IMG_20220212_164626.jpg,image/jpeg,4608,2592,0,6005172,,1644680788,1644680788117,1644680786523,0,0,0,,,,,,,,,,, +16265,33475,content://media/external/images/media/33475,/storage/emulated/0/DCIM/Camera/IMG_20220212_164545.jpg,image/jpeg,4608,2592,0,5990279,,1644680747,1644680747905,1644680746285,0,0,0,,,,,,,,,,, +16266,33472,content://media/external/images/media/33472,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0045.jpg",image/jpeg,1532,2048,0,362785,,1644680471,1644680472294,0,0,0,0,,,,,,,,,,, +16267,33469,content://media/external/images/media/33469,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0044.jpg",image/jpeg,1532,2048,0,344531,,1644680470,1644680471543,0,0,0,0,,,,,,,,,,, +16268,33466,content://media/external/images/media/33466,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0043.jpg",image/jpeg,2048,1532,0,422205,,1644680469,1644680470046,0,0,0,0,,,,,,,,,,, +16269,33463,content://media/external/images/media/33463,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0042.jpg",image/jpeg,2048,1532,0,424205,,1644680468,1644680469514,0,0,0,0,,,,,,,,,,, +16270,33460,content://media/external/images/media/33460,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0041.jpg",image/jpeg,1532,2048,0,328311,,1644680467,1644680468256,0,0,0,0,,,,,,,,,,, +16271,33457,content://media/external/images/media/33457,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0040.jpg",image/jpeg,1532,2048,0,361036,,1644680466,1644680467689,0,0,0,0,,,,,,,,,,, +16272,33455,content://media/external/images/media/33455,/storage/emulated/0/DCIM/Camera/IMG_20220212_163354.jpg,image/jpeg,3200,1800,0,2402062,,1644680035,1644680035506,1644680034387,0,0,0,,,,,,,,,,, +16273,33453,content://media/external/images/media/33453,/storage/emulated/0/DCIM/Camera/IMG_20220212_163349.jpg,image/jpeg,3200,1800,0,2459787,,1644680031,1644680031170,1644680029755,0,0,0,,,,,,,,,,, +16274,33451,content://media/external/images/media/33451,/storage/emulated/0/DCIM/Camera/IMG_20220212_163307.jpg,image/jpeg,3200,1800,0,2700046,,1644679989,1644679989278,1644679988117,0,0,0,,,,,,,,,,, +16275,33449,content://media/external/images/media/33449,/storage/emulated/0/DCIM/Camera/IMG_20220212_163258.jpg,image/jpeg,3200,1800,0,2636558,,1644679980,1644679980750,1644679978587,0,0,0,,,,,,,,,,, +16276,33447,content://media/external/images/media/33447,/storage/emulated/0/DCIM/Camera/IMG_20220212_162350.jpg,image/jpeg,1800,3200,0,2919123,,1644679434,1644679434605,1644679430737,0,0,0,,,,,,,,,,, +16277,33444,content://media/external/images/media/33444,/storage/emulated/0/DCIM/Camera/IMG_20220212_161715.jpg,image/jpeg,2592,4608,0,6340317,,1644679038,1644679038895,1644679035833,0,0,0,,,,,,,,,,, +16278,33443,content://media/external/images/media/33443,/storage/emulated/0/DCIM/Camera/IMG_20220212_161713.jpg,image/jpeg,2592,4608,0,6564824,,1644679036,1644679036443,1644679033333,0,0,0,,,,,,,,,,, +16279,33441,content://media/external/images/media/33441,/storage/emulated/0/DCIM/Camera/IMG_20220212_154426.jpg,image/jpeg,3200,1800,0,2516675,,1644677068,1644677068855,1644677066966,0,0,0,,,,,,,,,,, +16280,33439,content://media/external/images/media/33439,/storage/emulated/0/DCIM/Camera/IMG_20220212_154057.jpg,image/jpeg,4608,2592,0,5855432,,1644676859,1644676859512,1644676858125,0,0,0,,,,,,,,,,, +16281,33437,content://media/external/images/media/33437,/storage/emulated/0/DCIM/Camera/IMG_20220212_154045.jpg,image/jpeg,4608,2592,0,5160236,,1644676847,1644676847432,1644676846195,0,0,0,,,,,,,,,,, +16282,33435,content://media/external/images/media/33435,/storage/emulated/0/DCIM/Camera/IMG_20220212_154043.jpg,image/jpeg,4608,2592,0,5223571,,1644676844,1644676844536,1644676843332,0,0,0,,,,,,,,,,, +16283,33433,content://media/external/images/media/33433,/storage/emulated/0/DCIM/Camera/IMG_20220212_154038.jpg,image/jpeg,2592,4608,0,4336169,,1644676840,1644676840468,1644676838731,0,0,0,,,,,,,,,,, +16284,33428,content://media/external/images/media/33428,/storage/emulated/0/DCIM/Camera/IMG_20220212_153434.jpg,image/jpeg,4608,2592,0,4863829,,1644676476,1644676476574,1644676474903,0,0,0,,,,,,,,,,, +16285,33426,content://media/external/images/media/33426,/storage/emulated/0/DCIM/Camera/IMG_20220212_153425.jpg,image/jpeg,3200,1800,0,2199290,,1644676467,1644676467442,1644676466920,0,0,0,,,,,,,,,,, +16286,33424,content://media/external/images/media/33424,/storage/emulated/0/DCIM/Camera/IMG_20220212_153328.jpg,image/jpeg,3200,1800,0,3015226,,1644676410,1644676410730,1644676408867,0,0,0,,,,,,,,,,, +16287,33422,content://media/external/images/media/33422,/storage/emulated/0/DCIM/Camera/IMG_20220212_153320.jpg,image/jpeg,2592,4608,0,5706616,,1644676402,1644676402710,1644676401154,0,0,0,,,,,,,,,,, +16288,33420,content://media/external/images/media/33420,/storage/emulated/0/DCIM/Camera/IMG_20220212_153316.jpg,image/jpeg,2592,4608,0,5188150,,1644676398,1644676398302,1644676396751,0,0,0,,,,,,,,,,, +16289,33418,content://media/external/images/media/33418,/storage/emulated/0/DCIM/Camera/IMG_20220212_153306.jpg,image/jpeg,4608,2592,0,5771513,,1644676390,1644676390318,1644676386474,0,0,0,,,,,,,,,,, +16290,33413,content://media/external/images/media/33413,/storage/emulated/0/DCIM/Camera/IMG_20220212_151420.jpg,image/jpeg,3200,1800,0,2123904,,1644675262,1644675262182,1644675260725,0,0,0,,,,,,,,,,, +16291,33411,content://media/external/images/media/33411,/storage/emulated/0/DCIM/Camera/IMG_20220212_151414.jpg,image/jpeg,1800,3200,0,2170427,,1644675256,1644675256530,1644675254701,0,0,0,,,,,,,,,,, +16292,33403,content://media/external/images/media/33403,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0035.jpg",image/jpeg,1600,738,0,202476,,1644674128,1644674129795,0,0,0,0,,,,,,,,,,, +16293,33400,content://media/external/images/media/33400,/storage/emulated/0/DCIM/Camera/IMG_20220212_144045.jpg,image/jpeg,3200,1800,0,2508098,,1644673246,1644673246536,1644673245409,0,0,0,,,,,,,,,,, +16294,33398,content://media/external/images/media/33398,/storage/emulated/0/DCIM/Camera/IMG_20220212_144041.jpg,image/jpeg,3200,1800,0,2490331,,1644673243,1644673243012,1644673241975,0,0,0,,,,,,,,,,, +16295,33396,content://media/external/images/media/33396,/storage/emulated/0/DCIM/Camera/IMG_20220212_144035.jpg,image/jpeg,3200,1800,0,2484454,,1644673237,1644673237160,1644673236114,0,0,0,,,,,,,,,,, +16296,33394,content://media/external/images/media/33394,/storage/emulated/0/DCIM/Camera/IMG_20220212_144034.jpg,image/jpeg,3200,1800,0,2531151,,1644673235,1644673235788,1644673234650,0,0,0,,,,,,,,,,, +16297,33392,content://media/external/images/media/33392,/storage/emulated/0/DCIM/Camera/IMG_20220212_144029.jpg,image/jpeg,3200,1800,0,2549622,,1644673230,1644673230556,1644673229423,0,0,0,,,,,,,,,,, +16298,33390,content://media/external/images/media/33390,/storage/emulated/0/DCIM/Camera/IMG_20220212_144027.jpg,image/jpeg,3200,1800,0,2522682,,1644673228,1644673228848,1644673227351,0,0,0,,,,,,,,,,, +16299,33388,content://media/external/images/media/33388,/storage/emulated/0/DCIM/Camera/IMG_20220212_143912.jpg,image/jpeg,1800,3200,0,2399990,,1644673153,1644673153977,1644673152781,0,0,0,,,,,,,,,,, +16300,33385,content://media/external/images/media/33385,/storage/emulated/0/DCIM/Camera/IMG_20220212_143904.jpg,image/jpeg,1800,3200,0,2635674,,1644673146,1644673146245,1644673144835,0,0,0,,,,,,,,,,, +16301,33384,content://media/external/images/media/33384,/storage/emulated/0/DCIM/Camera/IMG_20220212_143902.jpg,image/jpeg,1800,3200,0,2586412,,1644673145,1644673145329,1644673142901,0,0,0,,,,,,,,,,, +16302,33382,content://media/external/images/media/33382,/storage/emulated/0/DCIM/Camera/IMG_20220212_143143.jpg,image/jpeg,1800,3200,0,2524997,,1644672709,1644672709380,1644672704206,0,0,0,,,,,,,,,,, +16303,33380,content://media/external/images/media/33380,/storage/emulated/0/DCIM/Camera/IMG_20220212_143134.jpg,image/jpeg,4608,2592,0,6210555,,1644672698,1644672698304,1644672695180,0,0,0,,,,,,,,,,, +16304,33369,content://media/external/images/media/33369,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0032.jpg",image/jpeg,1532,2048,0,333125,,1644671123,1644671125070,0,0,0,0,,,,,,,,,,, +16305,33366,content://media/external/images/media/33366,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0031.jpg",image/jpeg,1532,2048,0,272407,,1644671122,1644671123760,0,0,0,0,,,,,,,,,,, +16306,33360,content://media/external/images/media/33360,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0029.jpg",image/jpeg,1532,2048,0,282708,,1644671121,1644671122224,0,0,0,0,,,,,,,,,,, +16307,33363,content://media/external/images/media/33363,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0030.jpg",image/jpeg,1532,2048,0,409181,,1644671122,1644671122980,0,0,0,0,,,,,,,,,,, +16308,33357,content://media/external/images/media/33357,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0028.jpg",image/jpeg,2048,1033,0,287120,,1644671120,1644671121055,0,0,0,0,,,,,,,,,,, +16309,33354,content://media/external/images/media/33354,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0027.jpg",image/jpeg,1532,2048,0,378265,,1644671119,1644671120177,0,0,0,0,,,,,,,,,,, +16310,33348,content://media/external/images/media/33348,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0025.jpg",image/jpeg,2048,1532,0,429379,,1644671118,1644671119282,0,0,0,0,,,,,,,,,,, +16311,33351,content://media/external/images/media/33351,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0026.jpg",image/jpeg,2048,1532,0,421652,,1644671119,1644671119760,0,0,0,0,,,,,,,,,,, +16312,33345,content://media/external/images/media/33345,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0024.jpg",image/jpeg,1532,2048,0,461888,,1644671117,1644671118812,0,0,0,0,,,,,,,,,,, +16313,33342,content://media/external/images/media/33342,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0023.jpg",image/jpeg,1700,1080,0,270344,,1644671116,1644671117181,0,0,0,0,,,,,,,,,,, +16314,33339,content://media/external/images/media/33339,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0022.jpg",image/jpeg,1532,2048,0,355126,,1644671114,1644671116201,0,0,0,0,,,,,,,,,,, +16315,33336,content://media/external/images/media/33336,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0021.jpg",image/jpeg,1532,2048,0,474886,,1644671113,1644671114919,0,0,0,0,,,,,,,,,,, +16316,33327,content://media/external/images/media/33327,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0018.jpg",image/jpeg,1200,1600,0,198810,,1644668944,1644668945296,0,0,0,0,,,,,,,,,,, +16317,33330,content://media/external/images/media/33330,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0019.jpg",image/jpeg,1600,1200,0,259869,,1644668945,1644668945838,0,0,0,0,,,,,,,,,,, +16318,33321,content://media/external/images/media/33321,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0016.jpg",image/jpeg,1200,1600,0,202967,,1644668943,1644668944499,0,0,0,0,,,,,,,,,,, +16319,33324,content://media/external/images/media/33324,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0017.jpg",image/jpeg,1600,1200,0,304463,,1644668944,1644668944858,0,0,0,0,,,,,,,,,,, +16320,33315,content://media/external/images/media/33315,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0014.jpg",image/jpeg,1600,1200,0,257141,,1644668942,1644668943470,0,0,0,0,,,,,,,,,,, +16321,33302,content://media/external/images/media/33302,/storage/emulated/0/DCIM/Camera/IMG_20220212_124529.jpg,image/jpeg,3200,1800,0,2406668,,1644666331,1644666331094,1644666330239,0,0,0,,,,,,,,,,, +16322,33300,content://media/external/images/media/33300,/storage/emulated/0/DCIM/Camera/IMG_20220212_124524.jpg,image/jpeg,3200,1800,0,2499722,,1644666326,1644666326654,1644666324545,0,0,0,,,,,,,,,,, +16323,33296,content://media/external/images/media/33296,/storage/emulated/0/DCIM/Camera/IMG_20220212_114228.jpg,image/jpeg,4608,2592,0,4706106,,1644662551,1644662551144,1644662548792,0,0,0,,,,,,,,,,, +16324,33283,content://media/external/images/media/33283,/storage/emulated/0/DCIM/Camera/IMG_20220212_110619.jpg,image/jpeg,4608,2592,0,5437106,,1644660383,1644660383923,1644660379981,0,0,0,,,,,,,,,,, +16325,33231,content://media/external/images/media/33231,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220211-WA0000.jpg",image/jpeg,1152,2048,0,156368,,1644566532,1644566533002,0,0,0,0,,,,,,,,,,, +16326,33225,content://media/external/images/media/33225,/storage/emulated/0/DCIM/Camera/IMG_20220210_233640.jpg,image/jpeg,4608,2592,0,4817972,,1644532601,1644532601773,1644532600433,0,0,0,,,,,,,,,,, +16327,33223,content://media/external/images/media/33223,/storage/emulated/0/DCIM/Camera/IMG_20220210_233636.jpg,image/jpeg,2592,4608,0,5271474,,1644532598,1644532598801,1644532597128,0,0,0,,,,,,,,,,, +16328,33221,content://media/external/images/media/33221,/storage/emulated/0/DCIM/Camera/IMG_20220210_233634.jpg,image/jpeg,2592,4608,0,5208552,,1644532596,1644532596573,1644532594535,0,0,0,,,,,,,,,,, +16329,33219,content://media/external/images/media/33219,/storage/emulated/0/DCIM/Camera/IMG_20220210_233530.jpg,image/jpeg,4608,2592,0,3328339,,1644532532,1644532532705,1644532530561,0,0,0,,,,,,,,,,, +16330,33090,content://media/external/images/media/33090,/storage/emulated/0/DCIM/Camera/IMG_20220208_134346.jpg,image/jpeg,2592,4608,0,5405034,,1644324228,1644324228390,1644324226509,0,0,0,,,,,,,,,,, +16331,33024,content://media/external/images/media/33024,/storage/emulated/0/DCIM/Screenshots/IMG_20220206_195232.jpg,image/jpeg,1425,978,0,383244,,1644173553,1644173552982,0,0,0,0,,,,,,,,,,, +16332,33022,content://media/external/images/media/33022,/storage/emulated/0/DCIM/Screenshots/IMG_20220206_195144.jpg,image/jpeg,978,1425,0,382859,,1644173504,1644173504818,0,0,0,0,,,,,,,,,,, +16333,33013,content://media/external/images/media/33013,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-02-06-15-41-58-289_com.google.android.gm.jpg,image/jpeg,1080,2400,0,487046,,1644158518,1644158518432,0,0,0,0,,,,,,,,,,, +16334,32996,content://media/external/images/media/32996,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220206-WA0010.jpg",image/jpeg,1080,1920,0,142703,,1644151065,1644151066891,0,0,0,0,,,,,,,,,,, +16335,32985,content://media/external/images/media/32985,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220206-WA0006.jpg",image/jpeg,1080,1920,0,203496,,1644147954,1644147954710,0,0,0,0,,,,,,,,,,, +16336,32914,content://media/external/images/media/32914,/storage/emulated/0/DCIM/Camera/IMG_20220205_220932.jpg,image/jpeg,4608,2592,0,3138267,,1644095373,1644095373138,1644092133150,0,0,0,,,,,,,,,,, +16337,32904,content://media/external/images/media/32904,/storage/emulated/0/DCIM/Camera/IMG_20220205_215634.jpg,image/jpeg,4608,2592,0,3323726,,1644094595,1644094595706,1644092258146,0,0,0,,,,,,,,,,, +16338,32893,content://media/external/images/media/32893,/storage/emulated/0/DCIM/Camera/IMG_20220205_211737.jpg,image/jpeg,4608,2592,0,3408383,,1644092260,1644092260655,1644092258146,0,0,0,,,,,,,,,,, +16339,32891,content://media/external/images/media/32891,/storage/emulated/0/DCIM/Camera/IMG_20220205_211732.jpg,image/jpeg,4608,2592,0,3200773,,1644092256,1644092256787,1644092253339,0,0,0,,,,,,,,,,, +16340,32889,content://media/external/images/media/32889,/storage/emulated/0/DCIM/Camera/IMG_20220205_211620.jpg,image/jpeg,4608,2592,0,4221411,,1644092182,1644092182299,1644092180833,0,0,0,,,,,,,,,,, +16341,32887,content://media/external/images/media/32887,/storage/emulated/0/DCIM/Camera/IMG_20220205_211535.jpg,image/jpeg,4608,2592,0,3053216,,1644092137,1644092137111,1644092135779,0,0,0,,,,,,,,,,, +16342,32885,content://media/external/images/media/32885,/storage/emulated/0/DCIM/Camera/IMG_20220205_211532.jpg,image/jpeg,4608,2592,0,3089613,,1644092135,1644092135167,1644092133150,0,0,0,,,,,,,,,,, +16343,32883,content://media/external/images/media/32883,/storage/emulated/0/DCIM/Camera/IMG_20220205_211526.jpg,image/jpeg,4608,2592,0,5332086,,1644092127,1644092127891,1644092126760,0,0,0,,,,,,,,,,, +16344,32881,content://media/external/images/media/32881,/storage/emulated/0/DCIM/Camera/IMG_20220205_211506.jpg,image/jpeg,4608,2592,0,5400197,,1644092108,1644092108319,1644092106817,0,0,0,,,,,,,,,,, +16345,32879,content://media/external/images/media/32879,/storage/emulated/0/DCIM/Camera/IMG_20220205_211337.jpg,image/jpeg,4608,2592,0,5452996,,1644092019,1644092019927,1644092017761,0,0,0,,,,,,,,,,, +16346,32841,content://media/external/images/media/32841,/storage/emulated/0/DCIM/Camera/IMG_20220205_124947.jpg,image/jpeg,5120,2880,0,3155943,,1644061788,1644061788909,1644061787186,0,0,0,,,,,,,,,,, +16347,32839,content://media/external/images/media/32839,/storage/emulated/0/DCIM/Camera/IMG_20220205_124914.jpg,image/jpeg,2592,4608,0,4423297,,1644061756,1644061756697,1644061754425,0,0,0,,,,,,,,,,, +16348,32837,content://media/external/images/media/32837,/storage/emulated/0/DCIM/Camera/IMG_20220205_110141.jpg,image/jpeg,2592,4608,0,4395321,,1644055302,1644055302819,1644055301345,0,0,0,,,,,,,,,,, +16349,32835,content://media/external/images/media/32835,/storage/emulated/0/DCIM/Camera/IMG_20220205_110100.jpg,image/jpeg,4608,2592,0,3537173,,1644055263,1644055263519,1644055261141,0,0,0,,,,,,,,,,, +16350,32833,content://media/external/images/media/32833,/storage/emulated/0/DCIM/Camera/IMG_20220205_110039.jpg,image/jpeg,1800,3200,0,1960870,,1644055240,1644055240451,1644055239413,0,0,0,,,,,,,,,,, +16351,32831,content://media/external/images/media/32831,/storage/emulated/0/DCIM/Camera/IMG_20220205_110021.jpg,image/jpeg,1800,3200,0,2215620,,1644055223,1644055223819,1644055222590,0,0,0,,,,,,,,,,, +16352,32829,content://media/external/images/media/32829,/storage/emulated/0/DCIM/Camera/IMG_20220205_103642.jpg,image/jpeg,3200,1800,0,2238809,,1644053803,1644053803781,1644053802798,0,0,0,,,,,,,,,,, +16353,32827,content://media/external/images/media/32827,/storage/emulated/0/DCIM/Camera/IMG_20220205_103638.jpg,image/jpeg,3200,1800,0,2206389,,1644053800,1644053800597,1644053799226,0,0,0,,,,,,,,,,, +16354,32825,content://media/external/images/media/32825,/storage/emulated/0/DCIM/Camera/IMG_20220205_103626.jpg,image/jpeg,4608,2592,0,5227731,,1644053790,1644053790569,1644053786272,0,0,0,,,,,,,,,,, +16355,32803,content://media/external/images/media/32803,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220204-WA0009.jpg",image/jpeg,1024,768,0,91480,,1644002625,1644002625869,0,0,0,0,,,,,,,,,,, +16356,32789,content://media/external/images/media/32789,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220204-WA0004.jpg",image/jpeg,1532,2048,0,397015,,1643987509,1643987663989,0,0,0,0,,,,,,,,,,, +16357,32374,content://media/external/images/media/32374,/storage/emulated/0/Pictures/Remini20220201223000490.jpg,image/jpeg,3476,2452,0,690212,,1643751000,1643751000570,0,0,0,0,,,,,,,,,,, +16358,32380,content://media/external/images/media/32380,/storage/emulated/0/Pictures/_.thumbnails/1643751000623.jpg,image/jpeg,-1,-1,0,0,,1643785986,1643751000634,0,0,0,0,,,,,,,,,,, +16359,32060,content://media/external/images/media/32060,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0032.jpg",image/jpeg,1532,2048,0,198749,,1643580883,1643580884297,0,0,0,0,,,,,,,,,,, +16360,32057,content://media/external/images/media/32057,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0031.jpg",image/jpeg,1532,2048,0,222691,,1643580882,1643580883639,0,0,0,0,,,,,,,,,,, +16361,32054,content://media/external/images/media/32054,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0030.jpg",image/jpeg,1532,2048,0,269902,,1643580881,1643580882879,0,0,0,0,,,,,,,,,,, +16362,32051,content://media/external/images/media/32051,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0029.jpg",image/jpeg,1532,2048,0,236432,,1643580880,1643580881976,0,0,0,0,,,,,,,,,,, +16363,32048,content://media/external/images/media/32048,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0028.jpg",image/jpeg,1532,2048,0,195151,,1643580878,1643580880979,0,0,0,0,,,,,,,,,,, +16364,32038,content://media/external/images/media/32038,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0025.jpg",image/jpeg,1600,1179,0,243957,,1643569450,1643569451296,0,0,0,0,,,,,,,,,,, +16365,32010,content://media/external/images/media/32010,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0009.jpg",image/jpeg,1532,2048,0,155840,,1643561875,1643561876216,0,0,0,0,,,,,,,,,,, +16366,31892,content://media/external/images/media/31892,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220129-WA0000.jpg",image/jpeg,921,2048,0,88441,,1643448166,1643448167583,0,0,0,0,,,,,,,,,,, +16367,31712,content://media/external/images/media/31712,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220126-WA0010.jpg",image/jpeg,720,1600,0,93783,,1643225943,1643227149056,0,0,0,0,,,,,,,,,,, +16368,31603,content://media/external/images/media/31603,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220125-WA0000.jpg",image/jpeg,1197,1600,0,134711,,1643091780,1643091781000,0,0,0,0,,,,,,,,,,, +16369,31606,content://media/external/images/media/31606,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220125-WA0001.jpg",image/jpeg,1197,1600,0,132548,,1643091781,1643091781375,0,0,0,0,,,,,,,,,,, +16370,31609,content://media/external/images/media/31609,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220125-WA0002.jpg",image/jpeg,1197,1600,0,145215,,1643091781,1643091781835,0,0,0,0,,,,,,,,,,, +16371,31503,content://media/external/images/media/31503,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220123-WA0002.jpg",image/jpeg,2048,1930,0,588830,,1642943229,1642943230928,0,0,0,0,,,,,,,,,,, +16372,31418,content://media/external/images/media/31418,/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-01-21-23-20-58-379_com.android.chrome.jpg,image/jpeg,1080,2400,0,399435,,1642803658,1642803658537,0,0,0,0,,,,,,,,,,, +16373,31349,content://media/external/images/media/31349,/storage/emulated/0/DCIM/Camera/IMG_20220120_170424.jpg,image/jpeg,4608,2592,0,5133311,,1642694666,1642694666136,1642694664658,0,0,0,,,,,,,,,,, +16374,31245,content://media/external/images/media/31245,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220118-WA0002.jpg",image/jpeg,946,2048,0,148479,,1642522568,1642522569068,0,0,0,0,,,,,,,,,,, +16375,31226,content://media/external/images/media/31226,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220117-WA0016.jpg",image/jpeg,1197,1600,0,218381,,1642453035,1642453036411,0,0,0,0,,,,,,,,,,, +16376,31223,content://media/external/images/media/31223,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220117-WA0015.jpg",image/jpeg,1197,1600,0,214602,,1642453035,1642453035928,0,0,0,0,,,,,,,,,,, +16377,31180,content://media/external/images/media/31180,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220117-WA0004.jpg",image/jpeg,1536,2048,0,431713,,1642413499,1642413500486,0,0,0,0,,,,,,,,,,, +16378,31136,content://media/external/images/media/31136,/storage/emulated/0/DCIM/Camera/IMG_20220116_124608.jpg,image/jpeg,2592,4608,0,5524649,,1642333569,1642333570007,1642333568256,0,0,0,,,,,,,,,,, +16379,31003,content://media/external/images/media/31003,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220115-WA0019.jpg",image/jpeg,1532,2048,0,419816,,1642264636,1642264637696,0,0,0,0,,,,,,,,,,, +16380,30653,content://media/external/images/media/30653,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220109-WA0021.jpg",image/jpeg,1600,900,0,70927,,1641745260,1641745260553,0,0,0,0,,,,,,,,,,, +16381,30656,content://media/external/images/media/30656,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220109-WA0022.jpg",image/jpeg,1600,900,0,84904,,1641745260,1641745260853,0,0,0,0,,,,,,,,,,, +16382,30647,content://media/external/images/media/30647,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220109-WA0019.jpg",image/jpeg,1599,899,0,63546,,1641745259,1641745259759,0,0,0,0,,,,,,,,,,, +16383,30607,content://media/external/images/media/30607,/storage/emulated/0/DCIM/ReactNative-snapshot-image2335675742430269525.png,image/png,948,2513,0,278259,,1641731629,1641731629917,0,0,0,0,,,,,,,,,,, +16384,30213,content://media/external/images/media/30213,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220104-WA0002.jpg",image/jpeg,2048,1532,0,181956,,1641291064,1641291070058,0,0,0,0,,,,,,,,,,, +16385,30210,content://media/external/images/media/30210,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220104-WA0001.jpg",image/jpeg,1532,2048,0,188031,,1641291052,1641291053354,0,0,0,0,,,,,,,,,,, +16386,30207,content://media/external/images/media/30207,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220104-WA0000.jpg",image/jpeg,1532,2048,0,163395,,1641291047,1641291049320,0,0,0,0,,,,,,,,,,, +16387,30064,content://media/external/images/media/30064,"/storage/emulated/0/android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220101-WA0029.jpg",image/jpeg,2048,1536,0,156887,,1641133457,1641041844000,0,0,0,0,,,,,,,,,,, +16388,29978,content://media/external/images/media/29978,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220101-WA0028.jpg",image/jpeg,2048,1536,0,159386,,1641041843,1641041843762,0,0,0,0,,,,,,,,,,, +16389,29939,content://media/external/images/media/29939,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220101-WA0017.jpg",image/jpeg,2048,1365,0,796504,,1641028104,1641028105309,0,0,0,0,,,,,,,,,,, +16390,29916,content://media/external/images/media/29916,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220101-WA0012.jpg",image/jpeg,1472,1104,0,113982,,1640997746,1640997747264,0,0,0,0,,,,,,,,,,, +16391,29712,content://media/external/images/media/29712,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211231-WA0012.jpg",image/jpeg,1599,899,0,185806,,1640950381,1640950381487,0,0,0,0,,,,,,,,,,, +16392,29715,content://media/external/images/media/29715,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211231-WA0013.jpg",image/jpeg,899,1599,0,121098,,1640950381,1640950381934,0,0,0,0,,,,,,,,,,, +16393,29311,content://media/external/images/media/29311,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211227-WA0005.jpg",image/jpeg,873,732,0,317875,,1640604631,1640606110910,0,0,0,0,,,,,,,,,,, +16394,29298,content://media/external/images/media/29298,/storage/emulated/0/DCIM/Camera/IMG_20211227_084735.jpg,image/jpeg,2592,4608,0,4852891,,1640591257,1640591257385,1640591255506,0,0,0,,,,,,,,,,, +16395,29151,content://media/external/images/media/29151,/storage/emulated/0/DCIM/Camera/IMG_20211225_143846.jpg,image/jpeg,4184,1007,0,1122400,,1640439526,1640439526788,1640439498687,0,0,0,,,,,,,,,,, +16396,28865,content://media/external/images/media/28865,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211224-WA0014.jpg",image/jpeg,1197,1600,0,208900,,1640364106,1640364107185,0,0,0,0,,,,,,,,,,, +16397,28862,content://media/external/images/media/28862,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211224-WA0013.jpg",image/jpeg,1197,1600,0,268166,,1640355004,1640355005065,0,0,0,0,,,,,,,,,,, +16398,28859,content://media/external/images/media/28859,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211224-WA0012.jpg",image/jpeg,1600,1197,0,322883,,1640354998,1640354999286,0,0,0,0,,,,,,,,,,, +16399,28814,content://media/external/images/media/28814,/storage/emulated/0/DCIM/Camera/IMG_20211223_223433.jpg,image/jpeg,3950,715,0,907598,,1640295274,1640295274021,1638443369887,0,0,0,,,,,,,,,,, +16400,28802,content://media/external/images/media/28802,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0033.jpg",image/jpeg,1200,1600,0,171724,,1640292626,1640292626701,0,0,0,0,,,,,,,,,,, +16401,28779,content://media/external/images/media/28779,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0027.jpg",image/jpeg,1200,1600,0,173944,,1640292586,1640292587039,0,0,0,0,,,,,,,,,,, +16402,28713,content://media/external/images/media/28713,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0016.jpg",image/jpeg,1157,1066,0,123524,,1640275213,1640275213815,0,0,0,0,,,,,,,,,,, +16403,28711,content://media/external/images/media/28711,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0015.jpg",image/jpeg,1600,1066,0,343394,,1640275103,1640275103393,0,0,0,0,,,,,,,,,,, +16404,28704,content://media/external/images/media/28704,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0012.jpg",image/jpeg,720,1600,0,136022,,1640272747,1640272747912,0,0,0,0,,,,,,,,,,, +16405,20909,content://media/external/images/media/20909,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20211219-WA0017.jpg",image/jpeg,768,1024,0,192238,,1639928157,1639928158437,0,0,0,0,,,,,,,,,,, +16406,20904,content://media/external/images/media/20904,/storage/emulated/0/DCIM/Camera/IMG_20211219_160804_1.jpg,image/jpeg,2592,4608,0,4576388,,1639926486,1639926486368,1639926485130,0,0,0,,,,,,,,,,, +16407,20902,content://media/external/images/media/20902,/storage/emulated/0/DCIM/Camera/IMG_20211219_160804.jpg,image/jpeg,2592,4608,0,4347123,,1639926485,1639926485904,1639926484328,0,0,0,,,,,,,,,,, +16408,20900,content://media/external/images/media/20900,/storage/emulated/0/DCIM/Camera/IMG_20211219_160802.jpg,image/jpeg,2592,4608,0,5132815,,1639926484,1639926484336,1639926482897,0,0,0,,,,,,,,,,, +16409,20899,content://media/external/images/media/20899,/storage/emulated/0/DCIM/Camera/IMG_20211219_160801.jpg,image/jpeg,2592,4608,0,5088597,,1639926483,1639926483952,1639926481497,0,0,0,,,,,,,,,,, +16410,20895,content://media/external/images/media/20895,/storage/emulated/0/DCIM/Camera/IMG_20211219_160346.jpg,image/jpeg,2592,4608,0,5096585,,1639926227,1639926227664,1639926226525,0,0,0,,,,,,,,,,, +16411,20894,content://media/external/images/media/20894,/storage/emulated/0/DCIM/Camera/IMG_20211219_160345.jpg,image/jpeg,2592,4608,0,5079473,,1639926226,1639926226776,1639926225356,0,0,0,,,,,,,,,,, +16412,20892,content://media/external/images/media/20892,/storage/emulated/0/DCIM/Camera/IMG_20211219_160313.jpg,image/jpeg,2592,4608,0,4765984,,1639926195,1639926195040,1639926193543,0,0,0,,,,,,,,,,, +16413,20888,content://media/external/images/media/20888,/storage/emulated/0/DCIM/Camera/IMG_20211219_160157.jpg,image/jpeg,1800,3200,0,2530067,,1639926118,1639926118977,1639926118176,0,0,0,,,,,,,,,,, +16414,20886,content://media/external/images/media/20886,/storage/emulated/0/DCIM/Camera/IMG_20211219_160155.jpg,image/jpeg,1800,3200,0,2631687,,1639926117,1639926117317,1639926115942,0,0,0,,,,,,,,,,, +16415,20882,content://media/external/images/media/20882,/storage/emulated/0/DCIM/Camera/IMG_20211219_155841.jpg,image/jpeg,2592,4608,0,5494433,,1639925922,1639925922871,1639925921497,0,0,0,,,,,,,,,,, +16416,20880,content://media/external/images/media/20880,/storage/emulated/0/DCIM/Camera/IMG_20211219_155823.jpg,image/jpeg,4608,2592,0,5445175,,1639925905,1639925905031,1639925904130,0,0,0,,,,,,,,,,, +16417,20878,content://media/external/images/media/20878,/storage/emulated/0/DCIM/Camera/IMG_20211219_155811.jpg,image/jpeg,4608,2592,0,4896114,,1639925893,1639925893751,1639925891947,0,0,0,,,,,,,,,,, +16418,20875,content://media/external/images/media/20875,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0012.jpg",image/jpeg,1536,2048,0,679965,,1639924668,1639924668942,0,0,0,0,,,,,,,,,,, +16419,20867,content://media/external/images/media/20867,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0010.jpg",image/jpeg,2048,1536,0,418669,,1639921667,1639921667698,0,0,0,0,,,,,,,,,,, +16420,20864,content://media/external/images/media/20864,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0009.jpg",image/jpeg,1532,2048,0,279483,,1639919090,1639919091769,0,0,0,0,,,,,,,,,,, +16421,20858,content://media/external/images/media/20858,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0007.jpg",image/jpeg,1080,700,0,97173,,1639918852,1639918853078,0,0,0,0,,,,,,,,,,, +16422,20861,content://media/external/images/media/20861,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0008.jpg",image/jpeg,1080,700,0,88189,,1639918853,1639918853436,0,0,0,0,,,,,,,,,,, +16423,20852,content://media/external/images/media/20852,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0005.jpg",image/jpeg,1080,1137,0,150811,,1639918851,1639918852294,0,0,0,0,,,,,,,,,,, +16424,20855,content://media/external/images/media/20855,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0006.jpg",image/jpeg,1080,700,0,157442,,1639918852,1639918852833,0,0,0,0,,,,,,,,,,, +16425,20849,content://media/external/images/media/20849,/storage/emulated/0/DCIM/Camera/IMG_20211219_133038.jpg,image/jpeg,3200,1800,0,1897384,,1639917040,1639917040018,1639917038932,0,0,0,,,,,,,,,,, +16426,20748,content://media/external/images/media/20748,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211216-WA0014.jpg",image/jpeg,1600,1200,0,156876,,1639686121,1639686122453,0,0,0,0,,,,,,,,,,, +16427,20343,content://media/external/images/media/20343,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211209-WA0005.jpg",image/jpeg,921,2048,0,119039,,1639062987,1639062988150,0,0,0,0,,,,,,,,,,, +16428,20300,content://media/external/images/media/20300,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211208-WA0021.jpg",image/jpeg,1086,1448,0,181199,,1638992235,1638992236246,0,0,0,0,,,,,,,,,,, +16429,20132,content://media/external/images/media/20132,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0013.jpg",image/jpeg,1197,1600,0,276147,,1638892289,1638898180250,0,0,0,0,,,,,,,,,,, +16430,20135,content://media/external/images/media/20135,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0014.jpg",image/jpeg,1197,1600,0,329110,,1638892291,1638898180990,0,0,0,0,,,,,,,,,,, +16431,20141,content://media/external/images/media/20141,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0016.jpg",image/jpeg,1600,1197,0,312384,,1638892293,1638898180772,0,0,0,0,,,,,,,,,,, +16432,20144,content://media/external/images/media/20144,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0017.jpg",image/jpeg,1600,1197,0,243102,,1638892294,1638898180483,0,0,0,0,,,,,,,,,,, +16433,20088,content://media/external/images/media/20088,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0002.jpg",image/jpeg,1197,1600,0,185087,,1638874664,1638898179923,0,0,0,0,,,,,,,,,,, +16434,20193,content://media/external/images/media/20193,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0037.jpg",image/jpeg,1600,1197,0,323348,,1638898175,1638898176424,0,0,0,0,,,,,,,,,,, +16435,20190,content://media/external/images/media/20190,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0036.jpg",image/jpeg,1296,970,0,135458,,1638898174,1638898175078,0,0,0,0,,,,,,,,,,, +16436,20085,content://media/external/images/media/20085,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0001.jpg",image/jpeg,1197,1600,0,192104,,1638874653,1638892321020,0,0,0,0,,,,,,,,,,, +16437,20170,content://media/external/images/media/20170,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0025.jpg",image/jpeg,1600,1197,0,277874,,1638892319,1638892320027,0,0,0,0,,,,,,,,,,, +16438,20173,content://media/external/images/media/20173,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0026.jpg",image/jpeg,1600,1197,0,287537,,1638892320,1638892320908,0,0,0,0,,,,,,,,,,, +16439,20163,content://media/external/images/media/20163,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0023.jpg",image/jpeg,2048,1532,0,479876,,1638892309,1638892311444,0,0,0,0,,,,,,,,,,, +16440,20160,content://media/external/images/media/20160,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0022.jpg",image/jpeg,2048,1532,0,281673,,1638892308,1638892309956,0,0,0,0,,,,,,,,,,, +16441,20157,content://media/external/images/media/20157,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0021.jpg",image/jpeg,2048,1532,0,275096,,1638892307,1638892308631,0,0,0,0,,,,,,,,,,, +16442,20154,content://media/external/images/media/20154,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0020.jpg",image/jpeg,1532,2048,0,445528,,1638892305,1638892307242,0,0,0,0,,,,,,,,,,, +16443,20151,content://media/external/images/media/20151,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0019.jpg",image/jpeg,1532,2048,0,441798,,1638892304,1638892305835,0,0,0,0,,,,,,,,,,, +16444,20138,content://media/external/images/media/20138,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0015.jpg",image/jpeg,1197,1600,0,339570,,1638892292,1638892293316,0,0,0,0,,,,,,,,,,, +16445,20129,content://media/external/images/media/20129,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0012.jpg",image/jpeg,1197,1600,0,332998,,1638892288,1638892289860,0,0,0,0,,,,,,,,,,, +16446,20126,content://media/external/images/media/20126,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0011.jpg",image/jpeg,1197,1600,0,116527,,1638892287,1638892288672,0,0,0,0,,,,,,,,,,, +16447,20116,content://media/external/images/media/20116,/storage/emulated/0/DCIM/Camera/IMG_20211207_155952.jpg,image/jpeg,4608,2592,0,5716113,,1638889194,1638889194017,1638889192547,0,0,0,,,,,,,,,,, +16448,20114,content://media/external/images/media/20114,/storage/emulated/0/DCIM/Camera/IMG_20211207_154908.jpg,image/jpeg,3200,1800,0,2637611,,1638888550,1638888550106,1638888549142,0,0,0,,,,,,,,,,, +16449,20112,content://media/external/images/media/20112,/storage/emulated/0/DCIM/Camera/IMG_20211207_154904.jpg,image/jpeg,2592,4608,0,4876675,,1638888545,1638888545750,1638888544347,0,0,0,,,,,,,,,,, +16450,20110,content://media/external/images/media/20110,/storage/emulated/0/DCIM/Camera/IMG_20211207_154633.jpg,image/jpeg,4608,2592,0,5674702,,1638888395,1638888395121,1638888393934,0,0,0,,,,,,,,,,, +16451,20108,content://media/external/images/media/20108,/storage/emulated/0/DCIM/Camera/IMG_20211207_154348.jpg,image/jpeg,1800,3200,0,2567812,,1638888230,1638888230480,1638888229141,0,0,0,,,,,,,,,,, +16452,20106,content://media/external/images/media/20106,/storage/emulated/0/DCIM/Camera/IMG_20211207_154139.jpg,image/jpeg,4608,2592,0,4765770,,1638888101,1638888101723,1638888100112,0,0,0,,,,,,,,,,, +16453,20105,content://media/external/images/media/20105,/storage/emulated/0/DCIM/Camera/IMG_20211207_144037.jpg,image/jpeg,2592,4608,0,4094805,,1638884439,1638884439302,1638884437972,0,0,0,,,,,,,,,,, +16454,20103,content://media/external/images/media/20103,/storage/emulated/0/DCIM/Camera/IMG_20211207_144034.jpg,image/jpeg,2592,4608,0,4720660,,1638884437,1638884437350,1638884434421,0,0,0,,,,,,,,,,, +16455,20100,content://media/external/images/media/20100,/storage/emulated/0/DCIM/Camera/IMG_20211207_125751.jpg,image/jpeg,4608,2592,0,5657817,,1638878273,1638878273500,1638878272281,0,0,0,,,,,,,,,,, +16456,20098,content://media/external/images/media/20098,/storage/emulated/0/DCIM/Camera/IMG_20211207_125747.jpg,image/jpeg,3200,1800,0,2235303,,1638878268,1638878268768,1638878267931,0,0,0,,,,,,,,,,, +16457,20096,content://media/external/images/media/20096,/storage/emulated/0/DCIM/Camera/IMG_20211207_125744.jpg,image/jpeg,1800,3200,0,2313731,,1638878266,1638878266876,1638878265101,0,0,0,,,,,,,,,,, +16458,20094,content://media/external/images/media/20094,/storage/emulated/0/DCIM/Camera/IMG_20211207_125733.jpg,image/jpeg,4608,2592,0,5670664,,1638878255,1638878255956,1638878254660,0,0,0,,,,,,,,,,, +16459,20091,content://media/external/images/media/20091,/storage/emulated/0/DCIM/Camera/IMG_20211207_121202.jpg,image/jpeg,4608,2592,0,5091399,,1638875524,1638875524269,1638875522455,0,0,0,,,,,,,,,,, +16460,20083,content://media/external/images/media/20083,/storage/emulated/0/DCIM/Camera/IMG_20211207_100609.jpg,image/jpeg,4608,2592,0,5346204,,1638867972,1638867972784,1638867970177,0,0,0,,,,,,,,,,, +16461,20061,content://media/external/images/media/20061,/storage/emulated/0/DCIM/Camera/IMG_20211206_211429.jpg,image/jpeg,1800,3200,0,3209639,,1638821671,1638821671615,1638821670200,0,0,0,,,,,,,,,,, +16462,20059,content://media/external/images/media/20059,/storage/emulated/0/DCIM/Camera/IMG_20211206_211346.jpg,image/jpeg,2592,4608,0,6305014,,1638821628,1638821628307,1638821626355,0,0,0,,,,,,,,,,, +16463,19982,content://media/external/images/media/19982,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0016.jpg",image/jpeg,1197,1600,0,273368,,1638803408,1638820232103,0,0,0,0,,,,,,,,,,, +16464,20048,content://media/external/images/media/20048,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0059.jpg",image/jpeg,899,1599,0,109895,,1638820231,1638820232033,0,0,0,0,,,,,,,,,,, +16465,20052,content://media/external/images/media/20052,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0060.jpg",image/jpeg,1600,900,0,210560,,1638820232,1638820232541,0,0,0,0,,,,,,,,,,, +16466,20055,content://media/external/images/media/20055,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0061.jpg",image/jpeg,899,1599,0,148697,,1638820232,1638820232928,0,0,0,0,,,,,,,,,,, +16467,20045,content://media/external/images/media/20045,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0058.jpg",image/jpeg,900,1600,0,278557,,1638820230,1638820231681,0,0,0,0,,,,,,,,,,, +16468,19891,content://media/external/images/media/19891,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0004.jpg",image/jpeg,900,1600,0,233066,,1638791362,1638820230634,0,0,0,0,,,,,,,,,,, +16469,20037,content://media/external/images/media/20037,/storage/emulated/0/DCIM/Camera/IMG_20211206_203646.jpg,image/jpeg,1437,2319,0,1343971,,1638819407,1638819406905,1638819406000,0,0,0,,,,,,,,,,, +16470,20036,content://media/external/images/media/20036,/storage/emulated/0/DCIM/Camera/IMG_20211206_203454.jpg,image/jpeg,2478,4405,0,4131388,,1638819295,1638819294937,1638819294000,0,0,0,,,,,,,,,,, +16471,19991,content://media/external/images/media/19991,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0018.jpg",image/jpeg,1197,1600,0,84813,,1638816111,1638816112082,0,0,0,0,,,,,,,,,,, +16472,19985,content://media/external/images/media/19985,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0017.jpg",image/jpeg,720,1600,0,118393,,1638806227,1638806228242,0,0,0,0,,,,,,,,,,, +16473,19976,content://media/external/images/media/19976,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0014.jpg",image/jpeg,1600,1197,0,183445,,1638803407,1638803408509,0,0,0,0,,,,,,,,,,, +16474,19979,content://media/external/images/media/19979,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0015.jpg",image/jpeg,1290,540,0,105609,,1638803408,1638803408956,0,0,0,0,,,,,,,,,,, +16475,19973,content://media/external/images/media/19973,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0013.jpg",image/jpeg,1197,1600,0,159064,,1638803406,1638803407618,0,0,0,0,,,,,,,,,,, +16476,19971,content://media/external/images/media/19971,/storage/emulated/0/DCIM/Camera/IMG_20211206_160510.jpg,image/jpeg,2592,4608,0,7183965,,1638803115,1638803115446,1638803110520,0,0,0,,,,,,,,,,, +16477,19963,content://media/external/images/media/19963,/storage/emulated/0/DCIM/Camera/IMG_20211206_152057.jpg,image/jpeg,1800,3200,0,1515529,,1638800458,1638800458956,1638800457749,0,0,0,,,,,,,,,,, +16478,19961,content://media/external/images/media/19961,/storage/emulated/0/DCIM/Camera/IMG_20211206_152051.jpg,image/jpeg,2592,4608,0,4920744,,1638800453,1638800453212,1638800451311,0,0,0,,,,,,,,,,, +16479,19959,content://media/external/images/media/19959,/storage/emulated/0/DCIM/Camera/IMG_20211206_150922.jpg,image/jpeg,4608,2592,0,4812559,,1638799763,1638799763492,1638799762364,0,0,0,,,,,,,,,,, +16480,19958,content://media/external/images/media/19958,/storage/emulated/0/DCIM/Camera/PANO_20211206_150752.jpg,image/jpeg,9680,4320,0,30058063,,1638799685,1638799685648,1638799672934,0,0,0,,,,,,,,,,, +16481,19955,content://media/external/images/media/19955,/storage/emulated/0/DCIM/Camera/IMG_20211206_150647.jpg,image/jpeg,4608,2592,0,5558042,,1638799608,1638799608918,1638799607758,0,0,0,,,,,,,,,,, +16482,19953,content://media/external/images/media/19953,/storage/emulated/0/DCIM/Camera/IMG_20211206_150605.jpg,image/jpeg,4608,2592,0,6299877,,1638799566,1638799566826,1638799565348,0,0,0,,,,,,,,,,, +16483,19951,content://media/external/images/media/19951,/storage/emulated/0/DCIM/Camera/IMG_20211206_150551.jpg,image/jpeg,2592,4608,0,5608528,,1638799553,1638799553302,1638799552420,0,0,0,,,,,,,,,,, +16484,19949,content://media/external/images/media/19949,/storage/emulated/0/DCIM/Camera/IMG_20211206_150216.jpg,image/jpeg,3200,1800,0,1896393,,1638799338,1638799338446,1638799337267,0,0,0,,,,,,,,,,, +16485,19947,content://media/external/images/media/19947,/storage/emulated/0/DCIM/Camera/IMG_20211206_150212.jpg,image/jpeg,4608,2592,0,5228928,,1638799334,1638799334390,1638799332355,0,0,0,,,,,,,,,,, +16486,19945,content://media/external/images/media/19945,/storage/emulated/0/DCIM/Camera/IMG_20211206_150202.jpg,image/jpeg,4608,2592,0,4361325,,1638799323,1638799323682,1638799322584,0,0,0,,,,,,,,,,, +16487,19943,content://media/external/images/media/19943,/storage/emulated/0/DCIM/Camera/IMG_20211206_150148.jpg,image/jpeg,4608,2592,0,4221835,,1638799310,1638799310650,1638799308998,0,0,0,,,,,,,,,,, +16488,19941,content://media/external/images/media/19941,/storage/emulated/0/DCIM/Camera/IMG_20211206_145850.jpg,image/jpeg,3200,1800,0,2614160,,1638799132,1638799132383,1638799131182,0,0,0,,,,,,,,,,, +16489,19937,content://media/external/images/media/19937,/storage/emulated/0/DCIM/Camera/IMG_20211206_145135.jpg,image/jpeg,3200,1800,0,2299341,,1638798696,1638798696797,1638798695795,0,0,0,,,,,,,,,,, +16490,19938,content://media/external/images/media/19938,/storage/emulated/0/DCIM/Camera/IMG_20211206_145135_1.jpg,image/jpeg,3200,1800,0,2092646,,1638798696,1638798696905,1638798696186,0,0,0,,,,,,,,,,, +16491,19935,content://media/external/images/media/19935,/storage/emulated/0/DCIM/Camera/IMG_20211206_145128.jpg,image/jpeg,1800,3200,0,2533480,,1638798690,1638798690829,1638798689195,0,0,0,,,,,,,,,,, +16492,19916,content://media/external/images/media/19916,/storage/emulated/0/DCIM/Camera/IMG_20211206_141947.jpg,image/jpeg,1800,3200,0,2616657,,1638796788,1638796788646,1638796787567,0,0,0,,,,,,,,,,, +16493,19914,content://media/external/images/media/19914,/storage/emulated/0/DCIM/Camera/IMG_20211206_141926.jpg,image/jpeg,1800,3200,0,2632826,,1638796768,1638796768510,1638796767113,0,0,0,,,,,,,,,,, +16494,19912,content://media/external/images/media/19912,/storage/emulated/0/DCIM/Camera/IMG_20211206_141917.jpg,image/jpeg,2592,4608,0,5459240,,1638796758,1638796758810,1638796757359,0,0,0,,,,,,,,,,, +16495,19910,content://media/external/images/media/19910,/storage/emulated/0/DCIM/Camera/IMG_20211206_141541.jpg,image/jpeg,2592,4608,0,5525842,,1638796543,1638796543222,1638796541488,0,0,0,,,,,,,,,,, +16496,19900,content://media/external/images/media/19900,/storage/emulated/0/DCIM/Camera/IMG_20211206_141442.jpg,image/jpeg,2592,4608,0,5060157,,1638796483,1638796483766,1638796482471,0,0,0,,,,,,,,,,, +16497,19898,content://media/external/images/media/19898,/storage/emulated/0/DCIM/Camera/IMG_20211206_141435.jpg,image/jpeg,2592,4608,0,4984744,,1638796477,1638796478010,1638796476208,0,0,0,,,,,,,,,,, +16498,19882,content://media/external/images/media/19882,/storage/emulated/0/DCIM/Camera/IMG_20211206_120500.jpg,image/jpeg,3200,1800,0,2716285,,1638788702,1638788702085,1638788700654,0,0,0,,,,,,,,,,, +16499,19880,content://media/external/images/media/19880,/storage/emulated/0/DCIM/Camera/IMG_20211206_120409.jpg,image/jpeg,4608,2592,0,5721332,,1638788650,1638788651017,1638788649745,0,0,0,,,,,,,,,,, +16500,19878,content://media/external/images/media/19878,/storage/emulated/0/DCIM/Camera/IMG_20211206_114914.jpg,image/jpeg,1800,3200,0,2780405,,1638787756,1638787756249,1638787755450,0,0,0,,,,,,,,,,, +16501,19876,content://media/external/images/media/19876,/storage/emulated/0/DCIM/Camera/IMG_20211206_114904.jpg,image/jpeg,2592,4608,0,5049476,,1638787746,1638787746269,1638787744963,0,0,0,,,,,,,,,,, +16502,19874,content://media/external/images/media/19874,/storage/emulated/0/DCIM/Camera/IMG_20211206_114756.jpg,image/jpeg,1800,3200,0,2735559,,1638787677,1638787677729,1638787676394,0,0,0,,,,,,,,,,, +16503,19872,content://media/external/images/media/19872,/storage/emulated/0/DCIM/Camera/IMG_20211206_114306.jpg,image/jpeg,2592,4608,0,5239629,,1638787388,1638787388113,1638787386586,0,0,0,,,,,,,,,,, +16504,19865,content://media/external/images/media/19865,/storage/emulated/0/DCIM/Camera/IMG_20211206_102859.jpg,image/jpeg,1800,3200,0,2817708,,1638782941,1638782941101,1638782939486,0,0,0,,,,,,,,,,, +16505,19860,content://media/external/images/media/19860,/storage/emulated/0/DCIM/Camera/IMG_20211206_100537.jpg,image/jpeg,2592,4608,0,6377492,,1638781539,1638781539832,1638781538132,0,0,0,,,,,,,,,,, +16506,19858,content://media/external/images/media/19858,/storage/emulated/0/DCIM/Camera/IMG_20211206_100507.jpg,image/jpeg,4608,2592,0,6551911,,1638781508,1638781508548,1638781507478,0,0,0,,,,,,,,,,, +16507,19854,content://media/external/images/media/19854,/storage/emulated/0/DCIM/Camera/IMG_20211206_100502.jpg,image/jpeg,4608,2592,0,6438226,,1638781503,1638781504032,1638781502679,0,0,0,,,,,,,,,,, +16508,19855,content://media/external/images/media/19855,/storage/emulated/0/DCIM/Camera/IMG_20211206_100503.jpg,image/jpeg,4608,2592,0,6398307,,1638781504,1638781504896,1638781503781,0,0,0,,,,,,,,,,, +16509,19852,content://media/external/images/media/19852,/storage/emulated/0/DCIM/Camera/IMG_20211206_100434.jpg,image/jpeg,4608,2592,0,5096663,,1638781476,1638781476304,1638781475450,0,0,0,,,,,,,,,,, +16510,19850,content://media/external/images/media/19850,/storage/emulated/0/DCIM/Camera/IMG_20211206_100354.jpg,image/jpeg,4608,2592,0,5824790,,1638781437,1638781437264,1638781434403,0,0,0,,,,,,,,,,, +16511,19848,content://media/external/images/media/19848,/storage/emulated/0/DCIM/Camera/IMG_20211206_100342.jpg,image/jpeg,4608,2592,0,6198435,,1638781424,1638781424924,1638781422369,0,0,0,,,,,,,,,,, +16512,19830,content://media/external/images/media/19830,/storage/emulated/0/DCIM/Camera/IMG_20211205_205452.jpg,image/jpeg,2592,4608,0,5222180,,1638734094,1638734094047,1638734092431,0,0,0,,,,,,,,,,, +16513,19823,content://media/external/images/media/19823,/storage/emulated/0/DCIM/Camera/IMG_20211205_192710.jpg,image/jpeg,2592,4608,0,4047109,,1638728831,1638728831825,1638728830902,0,0,0,,,,,,,,,,, +16514,19821,content://media/external/images/media/19821,/storage/emulated/0/DCIM/Camera/IMG_20211205_192709.jpg,image/jpeg,2592,4608,0,4122591,,1638728830,1638728830333,1638728829458,0,0,0,,,,,,,,,,, +16515,19818,content://media/external/images/media/19818,/storage/emulated/0/DCIM/Camera/IMG_20211205_192705.jpg,image/jpeg,2592,4608,0,4389483,,1638728826,1638728826753,1638728825690,0,0,0,,,,,,,,,,, +16516,19817,content://media/external/images/media/19817,/storage/emulated/0/DCIM/Camera/IMG_20211205_192704.jpg,image/jpeg,2592,4608,0,4501878,,1638728825,1638728825821,1638728824366,0,0,0,,,,,,,,,,, +16517,19814,content://media/external/images/media/19814,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211205-WA0024.jpg",image/jpeg,899,1599,0,141961,,1638728269,1638728271946,0,0,0,0,,,,,,,,,,, +16518,19802,content://media/external/images/media/19802,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20211205-WA0021.jpg",image/jpeg,1600,1197,0,156818,,1638710057,1638710057877,0,0,0,0,,,,,,,,,,, +16519,19799,content://media/external/images/media/19799,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20211205-WA0020.jpg",image/jpeg,1197,1600,0,176240,,1638710043,1638710044318,0,0,0,0,,,,,,,,,,, +16520,19770,content://media/external/images/media/19770,/storage/emulated/0/DCIM/Camera/IMG_20211205_133014.jpg,image/jpeg,2592,4608,0,4626061,,1638707416,1638707416737,1638707414646,0,0,0,,,,,,,,,,, +16521,19558,content://media/external/images/media/19558,/storage/emulated/0/DCIM/Camera/IMG_20211202_120929.jpg,image/jpeg,4608,2592,0,5184558,,1638443371,1638443371066,1638443369887,0,0,0,,,,,,,,,,, +16522,19526,content://media/external/images/media/19526,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211201-WA0006.jpg",image/jpeg,1128,1504,0,194115,,1638370263,1638370263769,0,0,0,0,,,,,,,,,,, +16523,19292,content://media/external/images/media/19292,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211128-WA0006.jpg",image/jpeg,1536,2048,0,481698,,1638108725,1638108739686,0,0,0,0,,,,,,,,,,, +16524,11726,content://media/external/images/media/11726,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-11-26-21-35-40-219_com.google.android.apps.photos.jpg,image/jpeg,1080,2400,0,1367240,,1637958940,1637958940330,0,0,0,0,,,,,,,,,,, +16525,11628,content://media/external/images/media/11628,/storage/emulated/0/DCIM/Camera/IMG_20211125_115144.jpg,image/jpeg,4608,2592,0,3765558,,1637837506,1637837506345,1637837504987,0,0,0,,,,,,,,,,, +16526,11196,content://media/external/images/media/11196,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211124-WA0019.jpg",image/jpeg,1536,2048,0,496107,,1637780954,1637780960244,0,0,0,0,,,,,,,,,,, +16527,11155,content://media/external/images/media/11155,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-11-24-14-38-59-101_com.google.android.gm.jpg,image/jpeg,1080,2400,0,365934,,1637761139,1637761139166,0,0,0,0,,,,,,,,,,, +16528,11124,content://media/external/images/media/11124,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211124-WA0001.jpg",image/jpeg,1536,2048,0,555244,,1637751767,1637751768956,0,0,0,0,,,,,,,,,,, +16529,11093,content://media/external/images/media/11093,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211123-WA0005.jpg",image/jpeg,720,866,0,90900,,1637701917,1637701918649,0,0,0,0,,,,,,,,,,, +16530,7443,content://media/external/images/media/7443,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211121-WA0008.jpg",image/jpeg,899,1599,0,186270,,1637518223,1637497478000,0,0,0,0,,,,,,,,,,, +16531,7476,content://media/external/images/media/7476,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211120-WA0005.jpg",image/jpeg,1153,2048,0,299392,,1637518223,1637411924000,0,0,0,0,,,,,,,,,,, +16532,7175,content://media/external/images/media/7175,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211118-WA0017.jpg",image/jpeg,576,1024,0,18543,,1637518222,1637274180000,0,0,0,0,,,,,,,,,,, +16533,2763,content://media/external/images/media/2763,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-11-17-19-32-05-781_it.subito.jpg,image/jpeg,1080,2340,0,403835,,1637500987,1637173926000,0,0,0,0,,,,,,,,,,, +16534,7114,content://media/external/images/media/7114,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211107-WA0009.jpg",image/jpeg,2048,1536,0,227969,,1637518222,1636289209000,0,0,0,0,,,,,,,,,,, +16535,7079,content://media/external/images/media/7079,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211107-WA0007.jpg",image/jpeg,1536,2048,0,438473,,1637518222,1636285786000,0,0,0,0,,,,,,,,,,, +16536,7562,content://media/external/images/media/7562,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0030.jpg",image/jpeg,1440,1440,0,309654,,1637518223,1635875332000,0,0,0,0,,,,,,,,,,, +16537,7348,content://media/external/images/media/7348,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0029.jpg",image/jpeg,1440,1440,0,286381,,1637518223,1635872296000,0,0,0,0,,,,,,,,,,, +16538,7523,content://media/external/images/media/7523,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0024.jpg",image/jpeg,1200,1600,0,406742,,1637518223,1635859569000,0,0,0,0,,,,,,,,,,, +16539,7475,content://media/external/images/media/7475,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0023.jpg",image/jpeg,1200,1600,0,255027,,1637518223,1635859568000,0,0,0,0,,,,,,,,,,, +16540,7204,content://media/external/images/media/7204,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0022.jpg",image/jpeg,1200,1600,0,230532,,1637518223,1635859567000,0,0,0,0,,,,,,,,,,, +16541,7470,content://media/external/images/media/7470,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0021.jpg",image/jpeg,1200,1600,0,463648,,1637518223,1635859567000,0,0,0,0,,,,,,,,,,, +16542,7282,content://media/external/images/media/7282,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0019.jpg",image/jpeg,1600,1200,0,353747,,1637518223,1635859565000,0,0,0,0,,,,,,,,,,, +16543,7517,content://media/external/images/media/7517,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0020.jpg",image/jpeg,1600,1200,0,225325,,1637518223,1635859565000,0,0,0,0,,,,,,,,,,, +16544,7078,content://media/external/images/media/7078,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0017.jpg",image/jpeg,1600,1200,0,288103,,1637518222,1635859563000,0,0,0,0,,,,,,,,,,, +16545,7236,content://media/external/images/media/7236,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0018.jpg",image/jpeg,1200,1600,0,276512,,1637518223,1635859563000,0,0,0,0,,,,,,,,,,, +16546,7235,content://media/external/images/media/7235,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0016.jpg",image/jpeg,1200,1600,0,361926,,1637518223,1635859562000,0,0,0,0,,,,,,,,,,, +16547,7515,content://media/external/images/media/7515,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0015.jpg",image/jpeg,1600,1200,0,367313,,1637518223,1635859561000,0,0,0,0,,,,,,,,,,, +16548,7234,content://media/external/images/media/7234,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0014.jpg",image/jpeg,1600,1200,0,405436,,1637518223,1635859560000,0,0,0,0,,,,,,,,,,, +16549,7110,content://media/external/images/media/7110,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0013.jpg",image/jpeg,1600,1200,0,389496,,1637518222,1635859559000,0,0,0,0,,,,,,,,,,, +16550,7203,content://media/external/images/media/7203,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0012.jpg",image/jpeg,1600,1200,0,392602,,1637518223,1635859558000,0,0,0,0,,,,,,,,,,, +16551,7383,content://media/external/images/media/7383,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0011.jpg",image/jpeg,1600,1200,0,301627,,1637518223,1635859557000,0,0,0,0,,,,,,,,,,, +16552,7137,content://media/external/images/media/7137,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0010.jpg",image/jpeg,1600,1200,0,333548,,1637518222,1635859556000,0,0,0,0,,,,,,,,,,, +16553,7233,content://media/external/images/media/7233,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0009.jpg",image/jpeg,1200,1600,0,184599,,1637518223,1635859555000,0,0,0,0,,,,,,,,,,, +16554,7330,content://media/external/images/media/7330,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0008.jpg",image/jpeg,1200,1600,0,204388,,1637518223,1635859553000,0,0,0,0,,,,,,,,,,, +16555,7202,content://media/external/images/media/7202,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0007.jpg",image/jpeg,1200,1600,0,183687,,1637518223,1635859551000,0,0,0,0,,,,,,,,,,, +16556,7516,content://media/external/images/media/7516,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0006.jpg",image/jpeg,1600,1200,0,167469,,1637518223,1635859550000,0,0,0,0,,,,,,,,,,, +16557,7441,content://media/external/images/media/7441,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0052.jpg",image/jpeg,1536,2048,0,292779,,1637518223,1635797191000,0,0,0,0,,,,,,,,,,, +16558,7238,content://media/external/images/media/7238,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0051.jpg",image/jpeg,2048,1536,0,373903,,1637518223,1635797190000,0,0,0,0,,,,,,,,,,, +16559,7347,content://media/external/images/media/7347,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0050.jpg",image/jpeg,1536,2048,0,333073,,1637518223,1635797189000,0,0,0,0,,,,,,,,,,, +16560,7384,content://media/external/images/media/7384,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0049.jpg",image/jpeg,1536,2048,0,298965,,1637518223,1635797188000,0,0,0,0,,,,,,,,,,, +16561,3756,content://media/external/images/media/3756,/storage/emulated/0/DCIM/Camera/IMG_20211101_205653.jpg,image/jpeg,4000,2250,0,3889002,,1637503488,1635796615000,1635796615150,0,0,0,,,,,,,,,,, +16562,4810,content://media/external/images/media/4810,/storage/emulated/0/DCIM/Camera/IMG_20211101_205642.jpg,image/jpeg,4000,2250,90,4144346,,1637505663,1635796605000,1635796605393,0,0,0,,,,,,,,,,, +16563,2795,content://media/external/images/media/2795,/storage/emulated/0/DCIM/Camera/IMG_20211101_202935.jpg,image/jpeg,4160,2340,0,3191232,,1637501282,1635794981000,1635794981436,0,0,0,,,,,,,,,,, +16564,7561,content://media/external/images/media/7561,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0048.jpg",image/jpeg,1532,2048,0,268107,,1637518223,1635794203000,0,0,0,0,,,,,,,,,,, +16565,7346,content://media/external/images/media/7346,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0047.jpg",image/jpeg,1532,2048,0,185720,,1637518223,1635794202000,0,0,0,0,,,,,,,,,,, +16566,7605,content://media/external/images/media/7605,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0043.jpg",image/jpeg,1600,1200,0,246389,,1637518223,1635786201000,0,0,0,0,,,,,,,,,,, +16567,7169,content://media/external/images/media/7169,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0038.jpg",image/jpeg,1200,1600,0,287415,,1637518222,1635786166000,0,0,0,0,,,,,,,,,,, +16568,4683,content://media/external/images/media/4683,/storage/emulated/0/DCIM/Camera/IMG_20211101_151059.jpg,image/jpeg,4000,2250,90,3219524,,1637505480,1635775861000,1635775860898,0,0,0,,,,,,,,,,, +16569,7201,content://media/external/images/media/7201,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0031.jpg",image/jpeg,2048,1536,0,465009,,1637518223,1635770805000,0,0,0,0,,,,,,,,,,, +16570,7557,content://media/external/images/media/7557,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0032.jpg",image/jpeg,1536,2048,0,328270,,1637518223,1635770805000,0,0,0,0,,,,,,,,,,, +16571,7111,content://media/external/images/media/7111,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0030.jpg",image/jpeg,2048,1536,0,510231,,1637518222,1635770804000,0,0,0,0,,,,,,,,,,, +16572,7077,content://media/external/images/media/7077,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0029.jpg",image/jpeg,1536,2048,0,284613,,1637518222,1635770803000,0,0,0,0,,,,,,,,,,, +16573,7603,content://media/external/images/media/7603,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0028.jpg",image/jpeg,1536,2048,0,329939,,1637518223,1635770802000,0,0,0,0,,,,,,,,,,, +16574,7380,content://media/external/images/media/7380,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0027.jpg",image/jpeg,1536,2048,0,576713,,1637518223,1635770801000,0,0,0,0,,,,,,,,,,, +16575,7136,content://media/external/images/media/7136,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0026.jpg",image/jpeg,2048,1536,0,296058,,1637518222,1635770799000,0,0,0,0,,,,,,,,,,, +16576,7381,content://media/external/images/media/7381,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0025.jpg",image/jpeg,2048,1536,0,249437,,1637518223,1635770798000,0,0,0,0,,,,,,,,,,, +16577,7405,content://media/external/images/media/7405,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0024.jpg",image/jpeg,2048,1536,0,295855,,1637518223,1635770797000,0,0,0,0,,,,,,,,,,, +16578,7379,content://media/external/images/media/7379,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0023.jpg",image/jpeg,2048,1536,0,303650,,1637518223,1635770796000,0,0,0,0,,,,,,,,,,, +16579,7514,content://media/external/images/media/7514,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0022.jpg",image/jpeg,1536,2048,0,275000,,1637518223,1635770795000,0,0,0,0,,,,,,,,,,, +16580,7439,content://media/external/images/media/7439,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0021.jpg",image/jpeg,2048,1536,0,339837,,1637518223,1635770794000,0,0,0,0,,,,,,,,,,, +16581,7401,content://media/external/images/media/7401,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0019.jpg",image/jpeg,2000,1500,0,313822,,1637518223,1635770793000,0,0,0,0,,,,,,,,,,, +16582,7403,content://media/external/images/media/7403,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0020.jpg",image/jpeg,2048,1536,0,316515,,1637518223,1635770793000,0,0,0,0,,,,,,,,,,, +16583,7076,content://media/external/images/media/7076,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0018.jpg",image/jpeg,1536,2048,0,294407,,1637518222,1635770792000,0,0,0,0,,,,,,,,,,, +16584,7402,content://media/external/images/media/7402,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0017.jpg",image/jpeg,1536,2048,0,305123,,1637518223,1635770791000,0,0,0,0,,,,,,,,,,, +16585,7281,content://media/external/images/media/7281,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0016.jpg",image/jpeg,1536,2048,0,275106,,1637518223,1635770789000,0,0,0,0,,,,,,,,,,, +16586,7200,content://media/external/images/media/7200,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0015.jpg",image/jpeg,2048,1536,0,378053,,1637518223,1635770788000,0,0,0,0,,,,,,,,,,, +16587,7513,content://media/external/images/media/7513,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0014.jpg",image/jpeg,1536,2048,0,358125,,1637518223,1635770783000,0,0,0,0,,,,,,,,,,, +16588,7328,content://media/external/images/media/7328,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0013.jpg",image/jpeg,2048,1536,0,351139,,1637518223,1635770771000,0,0,0,0,,,,,,,,,,, +16589,7168,content://media/external/images/media/7168,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0012.jpg",image/jpeg,2048,1536,0,286766,,1637518222,1635770769000,0,0,0,0,,,,,,,,,,, +16590,7469,content://media/external/images/media/7469,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0011.jpg",image/jpeg,2048,1536,0,286018,,1637518223,1635770767000,0,0,0,0,,,,,,,,,,, +16591,7468,content://media/external/images/media/7468,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0010.jpg",image/jpeg,738,1600,0,166833,,1637518223,1635770715000,0,0,0,0,,,,,,,,,,, +16592,7467,content://media/external/images/media/7467,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0009.jpg",image/jpeg,738,1600,0,184845,,1637518223,1635770714000,0,0,0,0,,,,,,,,,,, +16593,7280,content://media/external/images/media/7280,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0008.jpg",image/jpeg,738,1600,0,127646,,1637518223,1635770713000,0,0,0,0,,,,,,,,,,, +16594,7108,content://media/external/images/media/7108,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0062.jpg",image/jpeg,1600,1200,0,249405,,1637518222,1635702523000,0,0,0,0,,,,,,,,,,, +16595,7329,content://media/external/images/media/7329,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0100.jpg",image/jpeg,1600,1200,0,324264,,1637518223,1635702523000,0,0,0,0,,,,,,,,,,, +16596,7438,content://media/external/images/media/7438,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0099.jpg",image/jpeg,1600,1200,0,232311,,1637518223,1635702522000,0,0,0,0,,,,,,,,,,, +16597,7556,content://media/external/images/media/7556,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0098.jpg",image/jpeg,1600,1200,0,261490,,1637518223,1635702521000,0,0,0,0,,,,,,,,,,, +16598,7197,content://media/external/images/media/7197,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0074.jpg",image/jpeg,1200,1600,0,458024,,1637518223,1635702520000,0,0,0,0,,,,,,,,,,, +16599,7555,content://media/external/images/media/7555,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0097.jpg",image/jpeg,1600,1200,0,327107,,1637518223,1635702520000,0,0,0,0,,,,,,,,,,, +16600,7378,content://media/external/images/media/7378,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0096.jpg",image/jpeg,1600,1200,0,300042,,1637518223,1635702519000,0,0,0,0,,,,,,,,,,, +16601,7198,content://media/external/images/media/7198,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0088.jpg",image/jpeg,1600,1200,0,258495,,1637518223,1635702517000,0,0,0,0,,,,,,,,,,, +16602,7512,content://media/external/images/media/7512,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0094.jpg",image/jpeg,1200,1600,0,174689,,1637518223,1635702429000,0,0,0,0,,,,,,,,,,, +16603,7074,content://media/external/images/media/7074,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0093.jpg",image/jpeg,1200,1600,0,354554,,1637518222,1635702428000,0,0,0,0,,,,,,,,,,, +16604,7199,content://media/external/images/media/7199,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0092.jpg",image/jpeg,1200,1600,0,369976,,1637518223,1635702427000,0,0,0,0,,,,,,,,,,, +16605,7109,content://media/external/images/media/7109,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0091.jpg",image/jpeg,1600,1200,0,387528,,1637518222,1635702426000,0,0,0,0,,,,,,,,,,, +16606,7341,content://media/external/images/media/7341,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0090.jpg",image/jpeg,1600,1200,0,331753,,1637518223,1635702425000,0,0,0,0,,,,,,,,,,, +16607,7602,content://media/external/images/media/7602,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0089.jpg",image/jpeg,1200,1600,0,440113,,1637518223,1635702424000,0,0,0,0,,,,,,,,,,, +16608,7075,content://media/external/images/media/7075,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0066.jpg",image/jpeg,1200,1600,0,408915,,1637518222,1635702422000,0,0,0,0,,,,,,,,,,, +16609,7135,content://media/external/images/media/7135,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0087.jpg",image/jpeg,1200,1600,0,363296,,1637518222,1635702421000,0,0,0,0,,,,,,,,,,, +16610,7326,content://media/external/images/media/7326,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0086.jpg",image/jpeg,1600,1200,0,336733,,1637518223,1635702419000,0,0,0,0,,,,,,,,,,, +16611,7340,content://media/external/images/media/7340,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0085.jpg",image/jpeg,1200,1600,0,585858,,1637518223,1635702418000,0,0,0,0,,,,,,,,,,, +16612,7377,content://media/external/images/media/7377,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0084.jpg",image/jpeg,1600,1200,0,267325,,1637518223,1635702365000,0,0,0,0,,,,,,,,,,, +16613,7134,content://media/external/images/media/7134,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0083.jpg",image/jpeg,1600,1200,0,265527,,1637518222,1635702363000,0,0,0,0,,,,,,,,,,, +16614,7339,content://media/external/images/media/7339,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0082.jpg",image/jpeg,1600,1200,0,540054,,1637518223,1635702362000,0,0,0,0,,,,,,,,,,, +16615,7376,content://media/external/images/media/7376,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0081.jpg",image/jpeg,1600,1200,0,400253,,1637518223,1635702361000,0,0,0,0,,,,,,,,,,, +16616,7232,content://media/external/images/media/7232,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0080.jpg",image/jpeg,1200,1600,0,343566,,1637518223,1635699955000,0,0,0,0,,,,,,,,,,, +16617,7466,content://media/external/images/media/7466,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0078.jpg",image/jpeg,1600,1200,0,172435,,1637518223,1635699947000,0,0,0,0,,,,,,,,,,, +16618,7374,content://media/external/images/media/7374,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0076.jpg",image/jpeg,1200,1600,0,231366,,1637518223,1635699942000,0,0,0,0,,,,,,,,,,, +16619,7231,content://media/external/images/media/7231,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0075.jpg",image/jpeg,1600,1200,0,397788,,1637518223,1635699929000,0,0,0,0,,,,,,,,,,, +16620,7437,content://media/external/images/media/7437,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0065.jpg",image/jpeg,1200,1600,0,485432,,1637518223,1635699904000,0,0,0,0,,,,,,,,,,, +16621,7196,content://media/external/images/media/7196,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0064.jpg",image/jpeg,1200,1600,0,534112,,1637518223,1635699895000,0,0,0,0,,,,,,,,,,, +16622,7436,content://media/external/images/media/7436,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0063.jpg",image/jpeg,1200,1600,0,519042,,1637518223,1635699881000,0,0,0,0,,,,,,,,,,, +16623,7195,content://media/external/images/media/7195,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0061.jpg",image/jpeg,1200,1600,0,393708,,1637518223,1635699876000,0,0,0,0,,,,,,,,,,, +16624,7073,content://media/external/images/media/7073,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0060.jpg",image/jpeg,1200,1600,0,212489,,1637518222,1635699872000,0,0,0,0,,,,,,,,,,, +16625,7337,content://media/external/images/media/7337,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0059.jpg",image/jpeg,1600,1200,0,549669,,1637518223,1635699868000,0,0,0,0,,,,,,,,,,, +16626,7601,content://media/external/images/media/7601,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0058.jpg",image/jpeg,1200,1600,0,136520,,1637518223,1635699861000,0,0,0,0,,,,,,,,,,, +16627,7194,content://media/external/images/media/7194,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0057.jpg",image/jpeg,1200,1600,0,188353,,1637518223,1635699846000,0,0,0,0,,,,,,,,,,, +16628,7552,content://media/external/images/media/7552,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0056.jpg",image/jpeg,1200,1600,0,299249,,1637518223,1635699838000,0,0,0,0,,,,,,,,,,, +16629,7554,content://media/external/images/media/7554,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0055.jpg",image/jpeg,1600,1200,0,186570,,1637518223,1635699828000,0,0,0,0,,,,,,,,,,, +16630,7434,content://media/external/images/media/7434,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0054.jpg",image/jpeg,1600,1200,0,322595,,1637518223,1635699824000,0,0,0,0,,,,,,,,,,, +16631,7230,content://media/external/images/media/7230,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0053.jpg",image/jpeg,1600,1200,0,372431,,1637518223,1635699811000,0,0,0,0,,,,,,,,,,, +16632,7107,content://media/external/images/media/7107,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0052.jpg",image/jpeg,1200,1600,0,337100,,1637518222,1635699806000,0,0,0,0,,,,,,,,,,, +16633,7375,content://media/external/images/media/7375,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0051.jpg",image/jpeg,1200,1600,0,232249,,1637518223,1635699800000,0,0,0,0,,,,,,,,,,, +16634,7106,content://media/external/images/media/7106,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0050.jpg",image/jpeg,1600,1200,0,281362,,1637518222,1635699794000,0,0,0,0,,,,,,,,,,, +16635,7133,content://media/external/images/media/7133,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0049.jpg",image/jpeg,1200,1600,0,338447,,1637518222,1635699786000,0,0,0,0,,,,,,,,,,, +16636,7167,content://media/external/images/media/7167,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0048.jpg",image/jpeg,1200,1600,0,286172,,1637518222,1635699782000,0,0,0,0,,,,,,,,,,, +16637,7104,content://media/external/images/media/7104,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0047.jpg",image/jpeg,1600,1200,0,266956,,1637518222,1635699706000,0,0,0,0,,,,,,,,,,, +16638,7132,content://media/external/images/media/7132,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0046.jpg",image/jpeg,1600,1200,0,348612,,1637518222,1635699651000,0,0,0,0,,,,,,,,,,, +16639,7435,content://media/external/images/media/7435,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0045.jpg",image/jpeg,1600,1200,0,256041,,1637518223,1635699626000,0,0,0,0,,,,,,,,,,, +16640,7338,content://media/external/images/media/7338,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0044.jpg",image/jpeg,1600,1200,0,163496,,1637518223,1635699611000,0,0,0,0,,,,,,,,,,, +16641,7553,content://media/external/images/media/7553,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0043.jpg",image/jpeg,1200,1600,0,302638,,1637518223,1635699603000,0,0,0,0,,,,,,,,,,, +16642,7511,content://media/external/images/media/7511,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0042.jpg",image/jpeg,1600,1200,0,186313,,1637518223,1635699587000,0,0,0,0,,,,,,,,,,, +16643,7072,content://media/external/images/media/7072,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0041.jpg",image/jpeg,1200,1600,0,228313,,1637518222,1635699576000,0,0,0,0,,,,,,,,,,, +16644,7327,content://media/external/images/media/7327,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0040.jpg",image/jpeg,1600,1200,0,282403,,1637518223,1635699526000,0,0,0,0,,,,,,,,,,, +16645,7600,content://media/external/images/media/7600,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0035.jpg",image/jpeg,1200,1600,0,226546,,1637518223,1635699495000,0,0,0,0,,,,,,,,,,, +16646,7465,content://media/external/images/media/7465,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0034.jpg",image/jpeg,1200,1600,0,235746,,1637518223,1635699494000,0,0,0,0,,,,,,,,,,, +16647,7071,content://media/external/images/media/7071,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0033.jpg",image/jpeg,1600,604,0,118025,,1637518222,1635699492000,0,0,0,0,,,,,,,,,,, +16648,7325,content://media/external/images/media/7325,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0031.jpg",image/jpeg,1600,1200,0,180168,,1637518223,1635699382000,0,0,0,0,,,,,,,,,,, +16649,7433,content://media/external/images/media/7433,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0030.jpg",image/jpeg,1600,1200,0,220019,,1637518223,1635699299000,0,0,0,0,,,,,,,,,,, +16650,7279,content://media/external/images/media/7279,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0029.jpg",image/jpeg,1600,1200,0,325024,,1637518223,1635699213000,0,0,0,0,,,,,,,,,,, +16651,7464,content://media/external/images/media/7464,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0028.jpg",image/jpeg,1600,1200,0,203675,,1637518223,1635699170000,0,0,0,0,,,,,,,,,,, +16652,7105,content://media/external/images/media/7105,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0027.jpg",image/jpeg,1600,1200,0,201117,,1637518222,1635699145000,0,0,0,0,,,,,,,,,,, +16653,3632,content://media/external/images/media/3632,/storage/emulated/0/DCIM/Camera/IMG_20211031_170909.jpg,image/jpeg,4000,2250,90,2593956,,1637503272,1635696551000,1635696551297,0,0,0,,,,,,,,,,, +16654,3835,content://media/external/images/media/3835,/storage/emulated/0/DCIM/Camera/IMG_20211031_170859.jpg,image/jpeg,4160,2340,90,3990956,,1637503630,1635696543000,1635696542888,0,0,0,,,,,,,,,,, +16655,4517,content://media/external/images/media/4517,/storage/emulated/0/DCIM/Camera/IMG_20211031_163910.jpg,image/jpeg,4160,2340,0,4517505,,1637505160,1635694753000,1635694753149,0,0,0,,,,,,,,,,, +16656,3018,content://media/external/images/media/3018,/storage/emulated/0/DCIM/Camera/IMG_20211031_163853.jpg,image/jpeg,4160,2340,90,4697604,,1637501786,1635694737000,1635694737508,0,0,0,,,,,,,,,,, +16657,2794,content://media/external/images/media/2794,/storage/emulated/0/DCIM/Camera/IMG_20211031_163736.jpg,image/jpeg,4160,2340,0,4903490,,1637501282,1635694665000,1635694664731,0,0,0,,,,,,,,,,, +16658,3990,content://media/external/images/media/3990,/storage/emulated/0/DCIM/Camera/IMG_20211031_143613.jpg,image/jpeg,4160,2340,90,4665859,,1637504059,1635687377000,1635687377158,0,0,0,,,,,,,,,,, +16659,4595,content://media/external/images/media/4595,/storage/emulated/0/DCIM/Camera/IMG_20211031_143557.jpg,image/jpeg,4160,2340,0,5147331,,1637505278,1635687359000,1635687359069,0,0,0,,,,,,,,,,, +16660,3330,content://media/external/images/media/3330,/storage/emulated/0/DCIM/Camera/PANO_20211031_142002.jpg,image/jpeg,9008,3616,0,20118670,,1637502439,1635686410000,0,0,0,0,,,,,,,,,,, +16661,3235,content://media/external/images/media/3235,/storage/emulated/0/DCIM/Camera/IMG_20211031_115920.jpg,image/jpeg,4000,2250,0,7142215,,1637502258,1635677963000,1635677962863,0,0,0,,,,,,,,,,, +16662,3429,content://media/external/images/media/3429,/storage/emulated/0/DCIM/Camera/IMG_20211031_115905.jpg,image/jpeg,4000,2250,0,5748898,,1637502682,1635677949000,1635677949398,0,0,0,,,,,,,,,,, +16663,3219,content://media/external/images/media/3219,/storage/emulated/0/DCIM/Camera/IMG_20211031_114017.jpg,image/jpeg,4000,2250,90,4523383,,1637502256,1635676822000,1635676821858,0,0,0,,,,,,,,,,, +16664,3755,content://media/external/images/media/3755,/storage/emulated/0/DCIM/Camera/IMG_20211031_105430.jpg,image/jpeg,4000,2250,0,4276958,,1637503488,1635674073000,1635674072942,0,0,0,,,,,,,,,,, +16665,3989,content://media/external/images/media/3989,/storage/emulated/0/DCIM/Camera/IMG_20211030_204105.jpg,image/jpeg,4000,2250,90,3456868,,1637504059,1635619268000,1635619268072,0,0,0,,,,,,,,,,, +16666,7432,content://media/external/images/media/7432,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0089.jpg",image/jpeg,1600,1200,0,439497,,1637518223,1635615604000,0,0,0,0,,,,,,,,,,, +16667,7373,content://media/external/images/media/7373,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0088.jpg",image/jpeg,1600,1200,0,218388,,1637518223,1635615600000,0,0,0,0,,,,,,,,,,, +16668,7599,content://media/external/images/media/7599,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0087.jpg",image/jpeg,2000,1125,0,222329,,1637518223,1635615598000,0,0,0,0,,,,,,,,,,, +16669,7103,content://media/external/images/media/7103,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0086.jpg",image/jpeg,1600,1200,0,461492,,1637518222,1635615596000,0,0,0,0,,,,,,,,,,, +16670,7463,content://media/external/images/media/7463,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0065.jpg",image/jpeg,2048,1536,0,350399,,1637518223,1635615596000,0,0,0,0,,,,,,,,,,, +16671,7431,content://media/external/images/media/7431,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0085.jpg",image/jpeg,1600,1200,0,255448,,1637518223,1635614197000,0,0,0,0,,,,,,,,,,, +16672,7510,content://media/external/images/media/7510,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0084.jpg",image/jpeg,1600,1200,0,254110,,1637518223,1635614193000,0,0,0,0,,,,,,,,,,, +16673,7324,content://media/external/images/media/7324,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0083.jpg",image/jpeg,1600,1200,0,297696,,1637518223,1635614191000,0,0,0,0,,,,,,,,,,, +16674,7070,content://media/external/images/media/7070,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0075.jpg",image/jpeg,1080,1920,0,136578,,1637518222,1635614127000,0,0,0,0,,,,,,,,,,, +16675,7166,content://media/external/images/media/7166,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0074.jpg",image/jpeg,1536,2048,0,205145,,1637518222,1635614050000,0,0,0,0,,,,,,,,,,, +16676,7131,content://media/external/images/media/7131,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0073.jpg",image/jpeg,1536,2048,0,243133,,1637518222,1635614046000,0,0,0,0,,,,,,,,,,, +16677,7509,content://media/external/images/media/7509,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0072.jpg",image/jpeg,1536,2048,0,229053,,1637518223,1635614042000,0,0,0,0,,,,,,,,,,, +16678,7336,content://media/external/images/media/7336,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0071.jpg",image/jpeg,1536,2048,0,169596,,1637518223,1635614039000,0,0,0,0,,,,,,,,,,, +16679,7229,content://media/external/images/media/7229,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0070.jpg",image/jpeg,1536,2048,0,342573,,1637518223,1635614037000,0,0,0,0,,,,,,,,,,, +16680,7598,content://media/external/images/media/7598,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0069.jpg",image/jpeg,2048,640,0,120058,,1637518223,1635614026000,0,0,0,0,,,,,,,,,,, +16681,7130,content://media/external/images/media/7130,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0068.jpg",image/jpeg,2048,1536,0,371602,,1637518222,1635614024000,0,0,0,0,,,,,,,,,,, +16682,7372,content://media/external/images/media/7372,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0067.jpg",image/jpeg,2048,1536,0,541686,,1637518223,1635614021000,0,0,0,0,,,,,,,,,,, +16683,7277,content://media/external/images/media/7277,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0066.jpg",image/jpeg,2048,1536,0,264918,,1637518223,1635614018000,0,0,0,0,,,,,,,,,,, +16684,7462,content://media/external/images/media/7462,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0064.jpg",image/jpeg,1536,2048,0,473694,,1637518223,1635614015000,0,0,0,0,,,,,,,,,,, +16685,7507,content://media/external/images/media/7507,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0063.jpg",image/jpeg,1536,2048,0,496198,,1637518223,1635614011000,0,0,0,0,,,,,,,,,,, +16686,7461,content://media/external/images/media/7461,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0062.jpg",image/jpeg,2048,1536,0,397457,,1637518223,1635614002000,0,0,0,0,,,,,,,,,,, +16687,7278,content://media/external/images/media/7278,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0061.jpg",image/jpeg,2048,1536,0,489939,,1637518223,1635614000000,0,0,0,0,,,,,,,,,,, +16688,7102,content://media/external/images/media/7102,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0060.jpg",image/jpeg,1536,2048,0,294762,,1637518222,1635613998000,0,0,0,0,,,,,,,,,,, +16689,7400,content://media/external/images/media/7400,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0059.jpg",image/jpeg,2048,1536,0,306344,,1637518223,1635613996000,0,0,0,0,,,,,,,,,,, +16690,7551,content://media/external/images/media/7551,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0058.jpg",image/jpeg,2048,1536,0,288378,,1637518223,1635613993000,0,0,0,0,,,,,,,,,,, +16691,7399,content://media/external/images/media/7399,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0057.jpg",image/jpeg,2048,1536,0,377221,,1637518223,1635613991000,0,0,0,0,,,,,,,,,,, +16692,7193,content://media/external/images/media/7193,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0056.jpg",image/jpeg,1536,2048,0,441537,,1637518223,1635613989000,0,0,0,0,,,,,,,,,,, +16693,7129,content://media/external/images/media/7129,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0055.jpg",image/jpeg,2048,1536,0,578704,,1637518222,1635613987000,0,0,0,0,,,,,,,,,,, +16694,7322,content://media/external/images/media/7322,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0054.jpg",image/jpeg,1536,2048,0,505864,,1637518223,1635613984000,0,0,0,0,,,,,,,,,,, +16695,7192,content://media/external/images/media/7192,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0052.jpg",image/jpeg,1600,1200,0,189747,,1637518223,1635613406000,0,0,0,0,,,,,,,,,,, +16696,7323,content://media/external/images/media/7323,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0051.jpg",image/jpeg,1600,1200,0,303310,,1637518223,1635613404000,0,0,0,0,,,,,,,,,,, +16697,7508,content://media/external/images/media/7508,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0050.jpg",image/jpeg,1200,1600,0,488070,,1637518223,1635613402000,0,0,0,0,,,,,,,,,,, +16698,7276,content://media/external/images/media/7276,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0049.jpg",image/jpeg,1200,1600,0,508953,,1637518223,1635613399000,0,0,0,0,,,,,,,,,,, +16699,7335,content://media/external/images/media/7335,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0048.jpg",image/jpeg,1200,1600,0,237530,,1637518223,1635613385000,0,0,0,0,,,,,,,,,,, +16700,7275,content://media/external/images/media/7275,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0047.jpg",image/jpeg,1200,1600,0,490454,,1637518223,1635613383000,0,0,0,0,,,,,,,,,,, +16701,7398,content://media/external/images/media/7398,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0046.jpg",image/jpeg,1600,1200,0,444458,,1637518223,1635613381000,0,0,0,0,,,,,,,,,,, +16702,7128,content://media/external/images/media/7128,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0045.jpg",image/jpeg,1600,1200,0,444992,,1637518222,1635613380000,0,0,0,0,,,,,,,,,,, +16703,7321,content://media/external/images/media/7321,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0044.jpg",image/jpeg,1600,1200,0,204076,,1637518223,1635613378000,0,0,0,0,,,,,,,,,,, +16704,7165,content://media/external/images/media/7165,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0043.jpg",image/jpeg,1600,1200,0,288413,,1637518222,1635613377000,0,0,0,0,,,,,,,,,,, +16705,7397,content://media/external/images/media/7397,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0042.jpg",image/jpeg,1600,1200,0,143339,,1637518223,1635613376000,0,0,0,0,,,,,,,,,,, +16706,7506,content://media/external/images/media/7506,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0041.jpg",image/jpeg,1600,1200,0,266207,,1637518223,1635613375000,0,0,0,0,,,,,,,,,,, +16707,7505,content://media/external/images/media/7505,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0040.jpg",image/jpeg,1600,1200,0,176475,,1637518223,1635613374000,0,0,0,0,,,,,,,,,,, +16708,7396,content://media/external/images/media/7396,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0039.jpg",image/jpeg,1600,1200,0,158968,,1637518223,1635613372000,0,0,0,0,,,,,,,,,,, +16709,7320,content://media/external/images/media/7320,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0038.jpg",image/jpeg,1600,1200,0,269479,,1637518223,1635613371000,0,0,0,0,,,,,,,,,,, +16710,7164,content://media/external/images/media/7164,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0037.jpg",image/jpeg,1200,1600,0,158202,,1637518222,1635613368000,0,0,0,0,,,,,,,,,,, +16711,7069,content://media/external/images/media/7069,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0036.jpg",image/jpeg,1200,1600,0,179784,,1637518222,1635613366000,0,0,0,0,,,,,,,,,,, +16712,7319,content://media/external/images/media/7319,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0035.jpg",image/jpeg,1200,1600,0,121850,,1637518223,1635613364000,0,0,0,0,,,,,,,,,,, +16713,7228,content://media/external/images/media/7228,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0034.jpg",image/jpeg,1200,1600,0,164286,,1637518223,1635613363000,0,0,0,0,,,,,,,,,,, +16714,7274,content://media/external/images/media/7274,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0033.jpg",image/jpeg,1536,2048,0,454692,,1637518223,1635613361000,0,0,0,0,,,,,,,,,,, +16715,7068,content://media/external/images/media/7068,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0032.jpg",image/jpeg,1600,1200,0,418846,,1637518222,1635613359000,0,0,0,0,,,,,,,,,,, +16716,7191,content://media/external/images/media/7191,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0031.jpg",image/jpeg,1600,1200,0,158571,,1637518223,1635613352000,0,0,0,0,,,,,,,,,,, +16717,3218,content://media/external/images/media/3218,/storage/emulated/0/DCIM/Camera/IMG_20211030_163724.jpg,image/jpeg,4000,2250,0,3981688,,1637502256,1635604645000,1635604645361,0,0,0,,,,,,,,,,, +16718,3834,content://media/external/images/media/3834,/storage/emulated/0/DCIM/Camera/IMG_20211030_163714.jpg,image/jpeg,4160,2340,0,3953000,,1637503630,1635604639000,1635604639025,0,0,0,,,,,,,,,,, +16719,4594,content://media/external/images/media/4594,/storage/emulated/0/DCIM/Camera/IMG_20211030_163315.jpg,image/jpeg,4000,2250,0,4547184,,1637505278,1635604398000,1635604398408,0,0,0,,,,,,,,,,, +16720,4638,content://media/external/images/media/4638,/storage/emulated/0/DCIM/Camera/IMG_20211030_163313.jpg,image/jpeg,4000,2250,0,5073033,,1637505390,1635604396000,1635604396491,0,0,0,,,,,,,,,,, +16721,4809,content://media/external/images/media/4809,/storage/emulated/0/DCIM/Camera/IMG_20211030_151937.jpg,image/jpeg,4000,2250,0,2783517,,1637505663,1635599981000,1635599980863,0,0,0,,,,,,,,,,, +16722,3367,content://media/external/images/media/3367,/storage/emulated/0/DCIM/Camera/IMG_20211030_151909.jpg,image/jpeg,4000,2250,0,4109127,,1637502451,1635599951000,1635599951579,0,0,0,,,,,,,,,,, +16723,7395,content://media/external/images/media/7395,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0004.jpg",image/jpeg,908,2016,0,97235,,1637518223,1635584057000,0,0,0,0,,,,,,,,,,, +16724,21,content://media/external/images/media/21,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-10-27-19-17-18-101_com.android.provision.jpg,image/jpeg,1080,2400,0,349077,,1635355038,1635355038195,0,0,0,0,,,,,,,,,,, +16725,22,content://media/external/images/media/22,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-10-27-18-41-56-131_com.android.provision.jpg,image/jpeg,1080,2400,0,122167,,1635352916,1635352916195,0,0,0,0,,,,,,,,,,, +16726,3459,content://media/external/images/media/3459,/storage/emulated/0/DCIM/Camera/IMG_20211026_204429.jpg,image/jpeg,4000,2250,90,4128069,,1637502804,1635273872000,1635273872234,0,0,0,,,,,,,,,,, +16727,2597,content://media/external/images/media/2597,"/storage/emulated/0/DCIM/00 greenpass_20211025_220007_986.png",image/png,936,3178,0,303178,,1637500870,1635192007000,0,0,0,0,,,,,,,,,,, +16728,2762,content://media/external/images/media/2762,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-10-24-08-22-26-563_com.android.chrome.jpg,image/jpeg,1080,2340,0,479557,,1637500987,1635056547000,0,0,0,0,,,,,,,,,,, +16729,2761,content://media/external/images/media/2761,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-10-22-15-59-52-850_com.facebook.katana.jpg,image/jpeg,1080,2340,0,1111581,,1637500987,1634911193000,0,0,0,0,,,,,,,,,,, +16730,3613,content://media/external/images/media/3613,/storage/emulated/0/DCIM/Camera/IMG_20211022_074847.jpg,image/jpeg,2590,1647,0,808906,,1637503238,1634881727000,1634881697578,0,0,0,,,,,,,,,,, +16731,7189,content://media/external/images/media/7189,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211022-WA0000.jpg",image/jpeg,1600,1066,0,159606,,1637518223,1634855745000,0,0,0,0,,,,,,,,,,, +16732,3039,content://media/external/images/media/3039,/storage/emulated/0/DCIM/Camera/IMG_20211021_083402.jpg,image/jpeg,4000,2250,0,3934985,,1637501805,1634798045000,1634798045284,0,0,0,,,,,,,,,,, +16733,2881,content://media/external/images/media/2881,/storage/emulated/0/DCIM/Camera/IMG_20211020_195025.jpg,image/jpeg,2799,1308,0,1217636,,1637501461,1634752225000,1634752087492,0,0,0,,,,,,,,,,, +16734,4316,content://media/external/images/media/4316,/storage/emulated/0/DCIM/Camera/IMG_20211019_200716.jpg,image/jpeg,4000,2250,90,3340398,,1637504817,1634666838000,1634666838575,0,0,0,,,,,,,,,,, +16735,3017,content://media/external/images/media/3017,/storage/emulated/0/DCIM/Camera/IMG_20211011_200431.jpg,image/jpeg,4000,2250,90,3907432,,1637501786,1633975473000,1633975473140,0,0,0,,,,,,,,,,, +16736,7504,content://media/external/images/media/7504,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0018.jpg",image/jpeg,2048,1536,0,498808,,1637518223,1633880752000,0,0,0,0,,,,,,,,,,, +16737,7550,content://media/external/images/media/7550,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0017.jpg",image/jpeg,2048,1536,0,476289,,1637518223,1633880751000,0,0,0,0,,,,,,,,,,, +16738,7597,content://media/external/images/media/7597,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0016.jpg",image/jpeg,2048,1536,0,377509,,1637518223,1633880749000,0,0,0,0,,,,,,,,,,, +16739,7596,content://media/external/images/media/7596,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0015.jpg",image/jpeg,2048,1536,0,377890,,1637518223,1633880747000,0,0,0,0,,,,,,,,,,, +16740,7394,content://media/external/images/media/7394,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0014.jpg",image/jpeg,2048,1536,0,385390,,1637518223,1633880737000,0,0,0,0,,,,,,,,,,, +16741,7273,content://media/external/images/media/7273,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0012.jpg",image/jpeg,1200,1600,0,138409,,1637518223,1633880633000,0,0,0,0,,,,,,,,,,, +16742,7393,content://media/external/images/media/7393,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0011.jpg",image/jpeg,1200,1600,0,155720,,1637518223,1633880628000,0,0,0,0,,,,,,,,,,, +16743,7318,content://media/external/images/media/7318,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0010.jpg",image/jpeg,1200,1600,0,166935,,1637518223,1633880411000,0,0,0,0,,,,,,,,,,, +16744,7227,content://media/external/images/media/7227,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0009.jpg",image/jpeg,1200,1600,0,140641,,1637518223,1633880408000,0,0,0,0,,,,,,,,,,, +16745,3671,content://media/external/images/media/3671,/storage/emulated/0/DCIM/Camera/IMG_20211010_114126.jpg,image/jpeg,4000,2250,0,4069161,,1637503358,1633858890000,1633858890015,0,0,0,,,,,,,,,,, +16746,4364,content://media/external/images/media/4364,/storage/emulated/0/DCIM/Camera/IMG_20211009_133514.jpg,image/jpeg,4000,2250,0,3683181,,1637504970,1633779317000,1633779317035,0,0,0,,,,,,,,,,, +16747,7226,content://media/external/images/media/7226,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211004-WA0021.jpg",image/jpeg,738,1600,0,94070,,1637518223,1633383846000,0,0,0,0,,,,,,,,,,, +16748,7316,content://media/external/images/media/7316,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211004-WA0020.jpg",image/jpeg,720,1600,0,90118,,1637518223,1633357755000,0,0,0,0,,,,,,,,,,, +16749,2723,content://media/external/images/media/2723,/storage/emulated/0/DCIM/Screenshots/IMG_20211003_123512.jpg,image/jpeg,1053,1538,0,315165,,1637500987,1633257313000,0,0,0,0,,,,,,,,,,, +16750,2722,content://media/external/images/media/2722,/storage/emulated/0/DCIM/Screenshots/IMG_20211003_122627.jpg,image/jpeg,1050,920,0,271228,,1637500987,1633256788000,0,0,0,0,,,,,,,,,,, +16751,2920,content://media/external/images/media/2920,/storage/emulated/0/DCIM/Camera/IMG_20211003_092944.jpg,image/jpeg,4000,2250,0,5258102,,1637501535,1633246186000,1633246186297,0,0,0,,,,,,,,,,, +16752,4808,content://media/external/images/media/4808,/storage/emulated/0/DCIM/Camera/IMG_20211003_092501.jpg,image/jpeg,4000,2250,0,5573567,,1637505663,1633245904000,1633245904748,0,0,0,,,,,,,,,,, +16753,3273,content://media/external/images/media/3273,/storage/emulated/0/DCIM/Camera/IMG_20211003_092018.jpg,image/jpeg,4000,2250,0,6045294,,1637502342,1633245620000,1633245620071,0,0,0,,,,,,,,,,, +16754,3525,content://media/external/images/media/3525,/storage/emulated/0/DCIM/Camera/IMG_20211003_092010.jpg,image/jpeg,4000,2250,0,5292149,,1637502970,1633245612000,1633245612087,0,0,0,,,,,,,,,,, +16755,4555,content://media/external/images/media/4555,/storage/emulated/0/DCIM/Camera/IMG_20211003_085449.jpg,image/jpeg,4000,2250,0,4689146,,1637505187,1633244095000,1633244094594,0,0,0,,,,,,,,,,, +16756,4046,content://media/external/images/media/4046,/storage/emulated/0/DCIM/Camera/IMG_20211003_080654.jpg,image/jpeg,4160,2340,0,4513479,,1637504234,1633241223000,1633241223302,0,0,0,,,,,,,,,,, +16757,7331,content://media/external/images/media/7331,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211002-WA0024.jpg",image/jpeg,1408,1056,0,146045,,1637518223,1633181501000,0,0,0,0,,,,,,,,,,, +16758,7518,content://media/external/images/media/7518,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211002-WA0023.jpg",image/jpeg,1600,1200,0,176004,,1637518223,1633181500000,0,0,0,0,,,,,,,,,,, +16759,7112,content://media/external/images/media/7112,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211002-WA0022.jpg",image/jpeg,2048,1536,0,250678,,1637518222,1633181499000,0,0,0,0,,,,,,,,,,, +16760,3016,content://media/external/images/media/3016,/storage/emulated/0/DCIM/Camera/IMG_20211002_140114.jpg,image/jpeg,4000,2250,0,3648810,,1637501786,1633176078000,1633176077524,0,0,0,,,,,,,,,,, +16761,2721,content://media/external/images/media/2721,/storage/emulated/0/DCIM/Screenshots/IMG_20211002_101634.jpg,image/jpeg,1080,1146,0,245287,,1637500987,1633162594000,0,0,0,0,,,,,,,,,,, +16762,7101,content://media/external/images/media/7101,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211001-WA0019.jpg",image/jpeg,1536,2048,0,572976,,1637518222,1633119174000,0,0,0,0,,,,,,,,,,, +16763,3499,content://media/external/images/media/3499,/storage/emulated/0/DCIM/Camera/IMG_20211001_163421.jpg,image/jpeg,4000,2250,0,3416362,,1637502870,1633098864000,1633098864346,0,0,0,,,,,,,,,,, +16764,2720,content://media/external/images/media/2720,/storage/emulated/0/DCIM/Screenshots/IMG_20210929_073140.jpg,image/jpeg,1080,1744,0,339395,,1637500987,1632893500000,0,0,0,0,,,,,,,,,,, +16765,2719,content://media/external/images/media/2719,/storage/emulated/0/DCIM/Screenshots/IMG_20210928_205840.jpg,image/jpeg,1054,1070,0,80423,,1637500987,1632855520000,0,0,0,0,,,,,,,,,,, +16766,3543,content://media/external/images/media/3543,/storage/emulated/0/DCIM/Camera/IMG_20210928_195315.jpg,image/jpeg,4160,2340,0,3006849,,1637503010,1632851595000,1632851595442,0,0,0,,,,,,,,,,, +16767,2883,content://media/external/images/media/2883,/storage/emulated/0/DCIM/Camera/PANO_20210928_195240.jpg,image/jpeg,7728,3648,0,15812054,,1637501461,1632851568000,0,0,0,0,,,,,,,,,,, +16768,3354,content://media/external/images/media/3354,/storage/emulated/0/DCIM/Camera/IMG_20210928_190815.jpg,image/jpeg,4000,2250,0,3316560,,1637502439,1632848897000,1632848897666,0,0,0,,,,,,,,,,, +16769,3428,content://media/external/images/media/3428,/storage/emulated/0/DCIM/Camera/IMG_20210928_190810.jpg,image/jpeg,4000,2250,0,2713134,,1637502682,1632848892000,1632848892351,0,0,0,,,,,,,,,,, +16770,4873,content://media/external/images/media/4873,/storage/emulated/0/DCIM/Camera/IMG_20210928_190714.jpg,image/jpeg,4000,2250,0,5226266,,1637505831,1632848836000,1632848836403,0,0,0,,,,,,,,,,, +16771,4649,content://media/external/images/media/4649,/storage/emulated/0/DCIM/Camera/IMG_20210928_190420.jpg,image/jpeg,4000,2250,0,3537104,,1637505414,1632848660000,1632848641872,0,0,0,,,,,,,,,,, +16772,4384,content://media/external/images/media/4384,/storage/emulated/0/DCIM/Camera/IMG_20210928_185956.jpg,image/jpeg,4000,2250,0,4262759,,1637504982,1632848398000,1632848398429,0,0,0,,,,,,,,,,, +16773,3275,content://media/external/images/media/3275,/storage/emulated/0/DCIM/Camera/PANO_20210928_185907.jpg,image/jpeg,10288,3712,0,22747465,,1637502343,1632848357000,0,0,0,0,,,,,,,,,,, +16774,4922,content://media/external/images/media/4922,/storage/emulated/0/DCIM/Camera/PANO_20210928_185556.jpg,image/jpeg,8880,3712,0,18527720,,1637505944,1632848163000,0,0,0,0,,,,,,,,,,, +16775,4575,content://media/external/images/media/4575,/storage/emulated/0/DCIM/Camera/PANO_20210928_185200.jpg,image/jpeg,7344,3680,0,12491663,,1637505216,1632847928000,0,0,0,0,,,,,,,,,,, +16776,2718,content://media/external/images/media/2718,/storage/emulated/0/DCIM/Screenshots/IMG_20210927_102714.jpg,image/jpeg,1080,1328,0,258548,,1637500987,1632731234000,0,0,0,0,,,,,,,,,,, +16777,5025,content://media/external/images/media/5025,/storage/emulated/0/DCIM/Camera/IMG_20210926_185026.jpg,image/jpeg,4000,2250,90,2625293,,1637506135,1632675030000,1632675029711,0,0,0,,,,,,,,,,, +16778,4554,content://media/external/images/media/4554,/storage/emulated/0/DCIM/Camera/IMG_20210926_185019.jpg,image/jpeg,4000,2250,0,4514525,,1637505187,1632675021000,1632675021031,0,0,0,,,,,,,,,,, +16779,2717,content://media/external/images/media/2717,/storage/emulated/0/DCIM/Screenshots/IMG_20210926_105850.jpg,image/jpeg,1080,2006,0,300878,,1637500987,1632646730000,0,0,0,0,,,,,,,,,,, +16780,7100,content://media/external/images/media/7100,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210925-WA0025.jpg",image/jpeg,1599,899,0,210056,,1637518222,1632577492000,0,0,0,0,,,,,,,,,,, +16781,7225,content://media/external/images/media/7225,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210925-WA0024.jpg",image/jpeg,899,1599,0,216376,,1637518223,1632577456000,0,0,0,0,,,,,,,,,,, +16782,7272,content://media/external/images/media/7272,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210925-WA0021.jpg",image/jpeg,1200,1600,0,237069,,1637518223,1632572144000,0,0,0,0,,,,,,,,,,, +16783,7127,content://media/external/images/media/7127,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210925-WA0020.jpg",image/jpeg,1024,768,0,149108,,1637518222,1632571679000,0,0,0,0,,,,,,,,,,, +16784,7503,content://media/external/images/media/7503,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210924-WA0014.jpg",image/jpeg,1200,1600,0,188223,,1637518223,1632503701000,0,0,0,0,,,,,,,,,,, +16785,7317,content://media/external/images/media/7317,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210924-WA0012.jpg",image/jpeg,778,1600,0,75902,,1637518223,1632501372000,0,0,0,0,,,,,,,,,,, +16786,2630,content://media/external/images/media/2630,/storage/emulated/0/DCIM/Facebook/FB_IMG_1632381337969.jpg,image/jpeg,1000,1000,0,74573,,1637500870,1632381338000,0,0,0,0,,,,,,,,,,, +16787,4460,content://media/external/images/media/4460,/storage/emulated/0/DCIM/Camera/IMG_20210918_152125.jpg,image/jpeg,4000,2250,0,6813703,,1637505068,1631971288000,1631971288323,0,0,0,,,,,,,,,,, +16788,4724,content://media/external/images/media/4724,/storage/emulated/0/DCIM/Camera/IMG_20210918_150116.jpg,image/jpeg,4000,2250,0,3381837,,1637505565,1631970081000,1631970080789,0,0,0,,,,,,,,,,, +16789,4294,content://media/external/images/media/4294,/storage/emulated/0/DCIM/Camera/IMG_20210918_150036.jpg,image/jpeg,4000,2250,0,3215053,,1637504808,1631970039000,1631970039555,0,0,0,,,,,,,,,,, +16790,3988,content://media/external/images/media/3988,/storage/emulated/0/DCIM/Camera/IMG_20210918_150025.jpg,image/jpeg,4000,2250,0,4516254,,1637504059,1631970031000,1631970030812,0,0,0,,,,,,,,,,, +16791,4009,content://media/external/images/media/4009,/storage/emulated/0/DCIM/Camera/IMG_20210918_092608.jpg,image/jpeg,4160,2340,0,3706173,,1637504086,1631949968000,1631949968795,0,0,0,,,,,,,,,,, +16792,3694,content://media/external/images/media/3694,/storage/emulated/0/DCIM/Camera/IMG_20210918_092557.jpg,image/jpeg,4000,2250,0,4758950,,1637503390,1631949959000,1631949959786,0,0,0,,,,,,,,,,, +16793,3038,content://media/external/images/media/3038,/storage/emulated/0/DCIM/Camera/IMG_20210918_092106.jpg,image/jpeg,4160,2340,0,4406559,,1637501805,1631949673000,1631949672884,0,0,0,,,,,,,,,,, +16794,7190,content://media/external/images/media/7190,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210916-WA0011.jpg",image/jpeg,1600,900,0,177555,,1637518223,1631813905000,0,0,0,0,,,,,,,,,,, +16795,7430,content://media/external/images/media/7430,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210915-WA0002.jpg",image/jpeg,1536,2048,0,318307,,1637518223,1631689554000,0,0,0,0,,,,,,,,,,, +16796,7392,content://media/external/images/media/7392,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210915-WA0001.jpg",image/jpeg,1536,2048,0,499466,,1637518223,1631689552000,0,0,0,0,,,,,,,,,,, +16797,7460,content://media/external/images/media/7460,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210913-WA0000.jpg",image/jpeg,1500,2000,0,713859,,1637518223,1631518615000,0,0,0,0,,,,,,,,,,, +16798,3524,content://media/external/images/media/3524,/storage/emulated/0/DCIM/Camera/IMG_20210912_075418.jpg,image/jpeg,3680,2070,0,2971740,,1637502970,1631426058000,1631353420158,0,0,0,,,,,,,,,,, +16799,4493,content://media/external/images/media/4493,/storage/emulated/0/DCIM/Camera/IMG_20210912_075402.jpg,image/jpeg,3729,2097,0,3050744,,1637505122,1631426043000,1631353420158,0,0,0,,,,,,,,,,, +16800,4637,content://media/external/images/media/4637,/storage/emulated/0/DCIM/Camera/IMG_20210912_075225.jpg,image/jpeg,5184,2916,0,3506965,,1637505390,1631425946000,1631378479128,0,0,0,,,,,,,,,,, +16801,7391,content://media/external/images/media/7391,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0009.jpg",image/jpeg,904,1600,0,124093,,1637518223,1631424815000,0,0,0,0,,,,,,,,,,, +16802,7271,content://media/external/images/media/7271,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0008.jpg",image/jpeg,904,1600,0,150994,,1637518223,1631424397000,0,0,0,0,,,,,,,,,,, +16803,7595,content://media/external/images/media/7595,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0007.jpg",image/jpeg,904,1600,0,160566,,1637518223,1631424396000,0,0,0,0,,,,,,,,,,, +16804,7067,content://media/external/images/media/7067,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0006.jpg",image/jpeg,904,1600,0,236620,,1637518222,1631424395000,0,0,0,0,,,,,,,,,,, +16805,7502,content://media/external/images/media/7502,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0005.jpg",image/jpeg,904,1600,0,151523,,1637518223,1631424289000,0,0,0,0,,,,,,,,,,, +16806,7334,content://media/external/images/media/7334,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0002.jpg",image/jpeg,1600,904,0,169162,,1637518223,1631423699000,0,0,0,0,,,,,,,,,,, +16807,7549,content://media/external/images/media/7549,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0001.jpg",image/jpeg,1200,1600,0,158948,,1637518223,1631423699000,0,0,0,0,,,,,,,,,,, +16808,7188,content://media/external/images/media/7188,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0003.jpg",image/jpeg,904,1600,0,168967,,1637518223,1631423698000,0,0,0,0,,,,,,,,,,, +16809,7429,content://media/external/images/media/7429,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0004.jpg",image/jpeg,1600,904,0,198202,,1637518223,1631423698000,0,0,0,0,,,,,,,,,,, +16810,7501,content://media/external/images/media/7501,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0000.jpg",image/jpeg,904,1600,0,140582,,1637518223,1631423674000,0,0,0,0,,,,,,,,,,, +16811,3860,content://media/external/images/media/3860,/storage/emulated/0/DCIM/Camera/IMG_20210912_071234.jpg,image/jpeg,4160,2340,0,3312162,,1637503642,1631423554000,1631423554299,0,0,0,,,,,,,,,,, +16812,7270,content://media/external/images/media/7270,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0064.jpg",image/jpeg,2048,1536,0,273317,,1637518223,1631392233000,0,0,0,0,,,,,,,,,,, +16813,7606,content://media/external/images/media/7606,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0063.jpg",image/jpeg,1600,1200,0,130204,,1637518223,1631385930000,0,0,0,0,,,,,,,,,,, +16814,7285,content://media/external/images/media/7285,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0062.jpg",image/jpeg,1600,900,0,221779,,1637518223,1631385929000,0,0,0,0,,,,,,,,,,, +16815,7345,content://media/external/images/media/7345,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0061.jpg",image/jpeg,1600,900,0,204808,,1637518223,1631385928000,0,0,0,0,,,,,,,,,,, +16816,7206,content://media/external/images/media/7206,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0002.jpg",image/jpeg,1600,900,0,170675,,1637518223,1631385927000,0,0,0,0,,,,,,,,,,, +16817,7406,content://media/external/images/media/7406,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0060.jpg",image/jpeg,1600,900,0,151268,,1637518223,1631385927000,0,0,0,0,,,,,,,,,,, +16818,7522,content://media/external/images/media/7522,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0020.jpg",image/jpeg,1600,1200,0,339106,,1637518223,1631385927000,0,0,0,0,,,,,,,,,,, +16819,7559,content://media/external/images/media/7559,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0003.jpg",image/jpeg,1200,1600,0,305779,,1637518223,1631385927000,0,0,0,0,,,,,,,,,,, +16820,7473,content://media/external/images/media/7473,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0058.jpg",image/jpeg,1600,1200,0,235488,,1637518223,1631385926000,0,0,0,0,,,,,,,,,,, +16821,7474,content://media/external/images/media/7474,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0059.jpg",image/jpeg,1600,900,0,94156,,1637518223,1631385926000,0,0,0,0,,,,,,,,,,, +16822,7560,content://media/external/images/media/7560,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0018.jpg",image/jpeg,1600,1200,0,370101,,1637518223,1631385926000,0,0,0,0,,,,,,,,,,, +16823,7174,content://media/external/images/media/7174,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0057.jpg",image/jpeg,1600,900,0,160593,,1637518222,1631385925000,0,0,0,0,,,,,,,,,,, +16824,7344,content://media/external/images/media/7344,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0056.jpg",image/jpeg,1600,900,0,153953,,1637518223,1631385924000,0,0,0,0,,,,,,,,,,, +16825,7099,content://media/external/images/media/7099,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0055.jpg",image/jpeg,1080,1080,0,54906,,1637518222,1631385793000,0,0,0,0,,,,,,,,,,, +16826,3177,content://media/external/images/media/3177,/storage/emulated/0/DCIM/Camera/IMG_20210911_191111.jpg,image/jpeg,4000,2250,0,3499471,,1637502143,1631380276000,1631380274856,0,0,0,,,,,,,,,,, +16827,5009,content://media/external/images/media/5009,/storage/emulated/0/DCIM/Camera/IMG_20210911_191104.jpg,image/jpeg,4000,2250,0,4168555,,1637506101,1631380266000,1631380266488,0,0,0,,,,,,,,,,, +16828,3716,content://media/external/images/media/3716,/storage/emulated/0/DCIM/Camera/IMG_20210911_190552.jpg,image/jpeg,4000,2250,0,4122128,,1637503393,1631379955000,1631379955198,0,0,0,,,,,,,,,,, +16829,4462,content://media/external/images/media/4462,/storage/emulated/0/DCIM/Camera/PANO_20210911_185607.jpg,image/jpeg,7280,3712,0,16259766,,1637505068,1631379375000,0,0,0,0,,,,,,,,,,, +16830,4405,content://media/external/images/media/4405,/storage/emulated/0/DCIM/Camera/IMG_20210911_185556.jpg,image/jpeg,4000,2250,0,4599638,,1637505004,1631379360000,1631379360451,0,0,0,,,,,,,,,,, +16831,2834,content://media/external/images/media/2834,/storage/emulated/0/DCIM/Camera/IMG_20210911_153553.jpg,image/jpeg,4000,2250,0,6579888,,1637501370,1631367357000,1631367357620,0,0,0,,,,,,,,,,, +16832,3558,content://media/external/images/media/3558,/storage/emulated/0/DCIM/Camera/IMG_20210911_153539.jpg,image/jpeg,4000,2250,0,6730796,,1637503058,1631367344000,1631367344073,0,0,0,,,,,,,,,,, +16833,4615,content://media/external/images/media/4615,/storage/emulated/0/DCIM/Camera/IMG_20210911_153523.jpg,image/jpeg,4000,2250,0,5568172,,1637505308,1631367328000,1631367328344,0,0,0,,,,,,,,,,, +16834,4492,content://media/external/images/media/4492,/storage/emulated/0/DCIM/Camera/IMG_20210911_153104.jpg,image/jpeg,4000,2250,0,3360650,,1637505122,1631367070000,1631367069890,0,0,0,,,,,,,,,,, +16835,7173,content://media/external/images/media/7173,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0038.jpg",image/jpeg,1600,904,0,243087,,1637518222,1631366093000,0,0,0,0,,,,,,,,,,, +16836,4708,content://media/external/images/media/4708,/storage/emulated/0/DCIM/Camera/IMG_20210911_150710.jpg,image/jpeg,4160,2340,0,5333292,,1637505509,1631365640000,1631365639850,0,0,0,,,,,,,,,,, +16837,4553,content://media/external/images/media/4553,/storage/emulated/0/DCIM/Camera/IMG_20210911_125920.jpg,image/jpeg,4160,2340,0,4536502,,1637505187,1631357967000,1631357967122,0,0,0,,,,,,,,,,, +16838,3405,content://media/external/images/media/3405,/storage/emulated/0/DCIM/Camera/IMG_20210911_125757.jpg,image/jpeg,4000,2250,0,3291337,,1637502598,1631357880000,1631357880609,0,0,0,,,,,,,,,,, +16839,4479,content://media/external/images/media/4479,/storage/emulated/0/DCIM/Camera/IMG_20210911_120252.jpg,image/jpeg,4000,2250,0,4659922,,1637505091,1631354581000,1631354581788,0,0,0,,,,,,,,,,, +16840,3444,content://media/external/images/media/3444,/storage/emulated/0/DCIM/Camera/IMG_20210911_120245.jpg,image/jpeg,4000,2250,0,6313676,,1637502783,1631354569000,1631354569218,0,0,0,,,,,,,,,,, +16841,3987,content://media/external/images/media/3987,/storage/emulated/0/DCIM/Camera/IMG_20210911_115105.jpg,image/jpeg,4160,2340,0,5123958,,1637504059,1631353871000,1631353871733,0,0,0,,,,,,,,,,, +16842,4807,content://media/external/images/media/4807,/storage/emulated/0/DCIM/Camera/IMG_20210911_114626.jpg,image/jpeg,4000,2250,0,4134692,,1637505663,1631353593000,1631353592978,0,0,0,,,,,,,,,,, +16843,3542,content://media/external/images/media/3542,/storage/emulated/0/DCIM/Camera/IMG_20210911_114612.jpg,image/jpeg,4000,2250,0,5974959,,1637503010,1631353575000,1631353575232,0,0,0,,,,,,,,,,, +16844,3948,content://media/external/images/media/3948,/storage/emulated/0/DCIM/Camera/IMG_20210911_113835.jpg,image/jpeg,4000,2250,0,4767794,,1637503853,1631353116000,1631353047502,0,0,0,,,,,,,,,,, +16845,3798,content://media/external/images/media/3798,/storage/emulated/0/DCIM/Camera/IMG_20210911_113724.jpg,image/jpeg,4000,2250,0,5330080,,1637503558,1631353047000,1631353047502,0,0,0,,,,,,,,,,, +16846,3328,content://media/external/images/media/3328,/storage/emulated/0/DCIM/Camera/IMG_20210911_113248.jpg,image/jpeg,4000,2250,0,5847287,,1637502438,1631352770000,1631352770255,0,0,0,,,,,,,,,,, +16847,4363,content://media/external/images/media/4363,/storage/emulated/0/DCIM/Camera/IMG_20210911_113221.jpg,image/jpeg,4000,2250,90,6529016,,1637504970,1631352744000,1631352744633,0,0,0,,,,,,,,,,, +16848,7205,content://media/external/images/media/7205,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0021.jpg",image/jpeg,1600,1200,0,332325,,1637518223,1631351167000,0,0,0,0,,,,,,,,,,, +16849,7382,content://media/external/images/media/7382,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0019.jpg",image/jpeg,1600,900,0,119442,,1637518223,1631351164000,0,0,0,0,,,,,,,,,,, +16850,7440,content://media/external/images/media/7440,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0015.jpg",image/jpeg,1600,904,0,129324,,1637518223,1631350191000,0,0,0,0,,,,,,,,,,, +16851,7519,content://media/external/images/media/7519,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0014.jpg",image/jpeg,2048,1536,0,258191,,1637518223,1631350190000,0,0,0,0,,,,,,,,,,, +16852,4216,content://media/external/images/media/4216,/storage/emulated/0/DCIM/Camera/IMG_20210911_103805.jpg,image/jpeg,5184,2916,0,4858378,,1637504640,1631349486000,1631349455003,0,0,0,,,,,,,,,,, +16853,4806,content://media/external/images/media/4806,/storage/emulated/0/DCIM/Camera/IMG_20210911_103648.jpg,image/jpeg,5184,2916,0,4715865,,1637505663,1631349411000,1631349410941,0,0,0,,,,,,,,,,, +16854,4787,content://media/external/images/media/4787,/storage/emulated/0/DCIM/Camera/IMG_20210911_091127.jpg,image/jpeg,4160,2340,0,4685670,,1637505656,1631344296000,1631344294921,0,0,0,,,,,,,,,,, +16855,2836,content://media/external/images/media/2836,/storage/emulated/0/DCIM/Camera/PANO_20210911_085804.jpg,image/jpeg,7888,3712,0,20679566,,1637501370,1631343493000,0,0,0,0,,,,,,,,,,, +16856,4686,content://media/external/images/media/4686,/storage/emulated/0/DCIM/Camera/PANO_20210911_084601.jpg,image/jpeg,9168,3648,0,26123583,,1637505480,1631342770000,0,0,0,0,,,,,,,,,,, +16857,7163,content://media/external/images/media/7163,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0049.jpg",image/jpeg,1200,1600,0,227045,,1637518222,1631307720000,0,0,0,0,,,,,,,,,,, +16858,7500,content://media/external/images/media/7500,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0048.jpg",image/jpeg,1200,1600,0,160171,,1637518223,1631307718000,0,0,0,0,,,,,,,,,,, +16859,7098,content://media/external/images/media/7098,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0047.jpg",image/jpeg,1600,1200,0,251463,,1637518222,1631307716000,0,0,0,0,,,,,,,,,,, +16860,7066,content://media/external/images/media/7066,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0046.jpg",image/jpeg,1600,900,0,209145,,1637518222,1631307715000,0,0,0,0,,,,,,,,,,, +16861,7499,content://media/external/images/media/7499,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0016.jpg",image/jpeg,1536,2048,0,276015,,1637518223,1631307715000,0,0,0,0,,,,,,,,,,, +16862,3693,content://media/external/images/media/3693,/storage/emulated/0/DCIM/Camera/IMG_20210910_213028.jpg,image/jpeg,4000,2250,0,3792686,,1637503390,1631302231000,1631302231238,0,0,0,,,,,,,,,,, +16863,3590,content://media/external/images/media/3590,/storage/emulated/0/DCIM/Camera/IMG_20210910_184557.jpg,image/jpeg,4000,2250,90,4854027,,1637503154,1631292360000,1631292359814,0,0,0,,,,,,,,,,, +16864,3217,content://media/external/images/media/3217,/storage/emulated/0/DCIM/Camera/IMG_20210910_184556.jpg,image/jpeg,4000,2250,90,4923420,,1637502256,1631292358000,1631292358352,0,0,0,,,,,,,,,,, +16865,3905,content://media/external/images/media/3905,/storage/emulated/0/DCIM/Camera/IMG_20210910_160438.jpg,image/jpeg,4000,2250,0,3462406,,1637503732,1631282680000,1631282680715,0,0,0,,,,,,,,,,, +16866,4767,content://media/external/images/media/4767,/storage/emulated/0/DCIM/Camera/IMG_20210910_160044.jpg,image/jpeg,4000,2250,90,4468380,,1637505639,1631282447000,1631282447188,0,0,0,,,,,,,,,,, +16867,4960,content://media/external/images/media/4960,/storage/emulated/0/DCIM/Camera/IMG_20210910_123711.jpg,image/jpeg,4000,2250,0,4559345,,1637506015,1631270235000,1631270234895,0,0,0,,,,,,,,,,, +16868,4573,content://media/external/images/media/4573,/storage/emulated/0/DCIM/Camera/IMG_20210910_123653.jpg,image/jpeg,4160,2340,0,5056283,,1637505216,1631270218000,1631270218421,0,0,0,,,,,,,,,,, +16869,3390,content://media/external/images/media/3390,/storage/emulated/0/DCIM/Camera/IMG_20210910_080341.jpg,image/jpeg,2250,1941,0,1968955,,1637502523,1631253823000,1631252653577,0,0,0,,,,,,,,,,, +16870,3458,content://media/external/images/media/3458,/storage/emulated/0/DCIM/Camera/IMG_20210910_074411.jpg,image/jpeg,4000,2250,90,4356581,,1637502804,1631252653000,1631252653577,0,0,0,,,,,,,,,,, +16871,7269,content://media/external/images/media/7269,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0012.jpg",image/jpeg,1536,2048,0,593968,,1637518223,1631250663000,0,0,0,0,,,,,,,,,,, +16872,7283,content://media/external/images/media/7283,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG_20210910_070932.jpg",image/jpeg,579,599,0,142580,,1637518223,1631250572000,0,0,0,0,,,,,,,,,,, +16873,7428,content://media/external/images/media/7428,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0013.jpg",image/jpeg,1536,2048,0,597882,,1637518223,1631250304000,0,0,0,0,,,,,,,,,,, +16874,7126,content://media/external/images/media/7126,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0010.jpg",image/jpeg,1200,1600,0,403502,,1637518222,1631232989000,0,0,0,0,,,,,,,,,,, +16875,7097,content://media/external/images/media/7097,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0009.jpg",image/jpeg,1600,900,0,108654,,1637518222,1631232988000,0,0,0,0,,,,,,,,,,, +16876,7458,content://media/external/images/media/7458,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0003.jpg",image/jpeg,1600,900,0,199246,,1637518223,1631232988000,0,0,0,0,,,,,,,,,,, +16877,7268,content://media/external/images/media/7268,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0008.jpg",image/jpeg,1600,1200,0,334155,,1637518223,1631232987000,0,0,0,0,,,,,,,,,,, +16878,7224,content://media/external/images/media/7224,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0007.jpg",image/jpeg,1600,900,0,201551,,1637518223,1631232816000,0,0,0,0,,,,,,,,,,, +16879,7427,content://media/external/images/media/7427,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0006.jpg",image/jpeg,1600,900,0,206182,,1637518223,1631232816000,0,0,0,0,,,,,,,,,,, +16880,7459,content://media/external/images/media/7459,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0005.jpg",image/jpeg,1600,900,0,221772,,1637518223,1631232815000,0,0,0,0,,,,,,,,,,, +16881,7594,content://media/external/images/media/7594,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0004.jpg",image/jpeg,1600,1200,0,289632,,1637518223,1631232814000,0,0,0,0,,,,,,,,,,, +16882,7125,content://media/external/images/media/7125,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210909-WA0040.jpg",image/jpeg,1600,900,0,285826,,1637518222,1631232812000,0,0,0,0,,,,,,,,,,, +16883,2892,content://media/external/images/media/2892,/storage/emulated/0/DCIM/Camera/IMG_20210909_224019.jpg,image/jpeg,4000,2250,90,3436548,,1637501516,1631220022000,1631220021845,0,0,0,,,,,,,,,,, +16884,3157,content://media/external/images/media/3157,/storage/emulated/0/DCIM/Camera/IMG_20210909_223348.jpg,image/jpeg,4000,2250,90,3720195,,1637502130,1631219630000,1631219630123,0,0,0,,,,,,,,,,, +16885,3015,content://media/external/images/media/3015,/storage/emulated/0/DCIM/Camera/IMG_20210909_223342.jpg,image/jpeg,4000,2250,90,2297086,,1637501786,1631219624000,1631219624506,0,0,0,,,,,,,,,,, +16886,4940,content://media/external/images/media/4940,/storage/emulated/0/DCIM/Camera/IMG_20210909_223205.jpg,image/jpeg,4000,2250,90,3836075,,1637506010,1631219527000,1631219527537,0,0,0,,,,,,,,,,, +16887,4144,content://media/external/images/media/4144,/storage/emulated/0/DCIM/Camera/IMG_20210909_223138.jpg,image/jpeg,4160,2340,90,2925148,,1637504473,1631219502000,1631219502285,0,0,0,,,,,,,,,,, +16888,4459,content://media/external/images/media/4459,/storage/emulated/0/DCIM/Camera/IMG_20210909_223001.jpg,image/jpeg,4160,2340,90,2760066,,1637505068,1631219401000,1631219401323,0,0,0,,,,,,,,,,, +16889,2955,content://media/external/images/media/2955,/storage/emulated/0/DCIM/Camera/IMG_20210909_205358.jpg,image/jpeg,4160,2340,0,3923410,,1637501661,1631213643000,1631213643628,0,0,0,,,,,,,,,,, +16890,4901,content://media/external/images/media/4901,/storage/emulated/0/DCIM/Camera/IMG_20210909_205300.jpg,image/jpeg,4160,2340,0,3921425,,1637505920,1631213585000,1631213585345,0,0,0,,,,,,,,,,, +16891,3541,content://media/external/images/media/3541,/storage/emulated/0/DCIM/Camera/IMG_20210909_203845.jpg,image/jpeg,4160,2340,90,2643222,,1637503010,1631212726000,1631212725834,0,0,0,,,,,,,,,,, +16892,5024,content://media/external/images/media/5024,/storage/emulated/0/DCIM/Camera/IMG_20210909_190610.jpg,image/jpeg,5184,2916,180,3533042,,1637506134,1631207173000,1631207173061,0,0,0,,,,,,,,,,, +16893,3859,content://media/external/images/media/3859,/storage/emulated/0/DCIM/Camera/IMG_20210909_190512.jpg,image/jpeg,4000,2250,0,4862388,,1637503642,1631207114000,1631207114508,0,0,0,,,,,,,,,,, +16894,2833,content://media/external/images/media/2833,/storage/emulated/0/DCIM/Camera/IMG_20210909_190509.jpg,image/jpeg,4000,2250,0,4739655,,1637501370,1631207112000,1631207112098,0,0,0,,,,,,,,,,, +16895,3670,content://media/external/images/media/3670,/storage/emulated/0/DCIM/Camera/IMG_20210909_190506.jpg,image/jpeg,4000,2250,0,4381529,,1637503358,1631207108000,1631207108020,0,0,0,,,,,,,,,,, +16896,4648,content://media/external/images/media/4648,/storage/emulated/0/DCIM/Camera/IMG_20210909_190504.jpg,image/jpeg,4000,2250,0,4299371,,1637505414,1631207105000,1631207105755,0,0,0,,,,,,,,,,, +16897,3754,content://media/external/images/media/3754,/storage/emulated/0/DCIM/Camera/IMG_20210909_190500.jpg,image/jpeg,4000,2250,0,4320074,,1637503488,1631207102000,1631207101935,0,0,0,,,,,,,,,,, +16898,4424,content://media/external/images/media/4424,/storage/emulated/0/DCIM/Camera/IMG_20210909_190457.jpg,image/jpeg,4000,2250,0,4303752,,1637505063,1631207099000,1631207099404,0,0,0,,,,,,,,,,, +16899,3649,content://media/external/images/media/3649,/storage/emulated/0/DCIM/Camera/IMG_20210909_190455.jpg,image/jpeg,4000,2250,0,4319722,,1637503301,1631207096000,1631207096895,0,0,0,,,,,,,,,,, +16900,4766,content://media/external/images/media/4766,/storage/emulated/0/DCIM/Camera/IMG_20210909_190445.jpg,image/jpeg,4000,2250,0,4220082,,1637505639,1631207087000,1631207087326,0,0,0,,,,,,,,,,, +16901,3648,content://media/external/images/media/3648,/storage/emulated/0/DCIM/Camera/IMG_20210909_190234.jpg,image/jpeg,4000,2250,0,4265662,,1637503301,1631206956000,1631206955908,0,0,0,,,,,,,,,,, +16902,4215,content://media/external/images/media/4215,/storage/emulated/0/DCIM/Camera/IMG_20210909_190209.jpg,image/jpeg,4000,2250,0,4272182,,1637504640,1631206930000,1631206930138,0,0,0,,,,,,,,,,, +16903,4516,content://media/external/images/media/4516,/storage/emulated/0/DCIM/Camera/IMG_20210909_190202.jpg,image/jpeg,4000,2250,0,4188155,,1637505160,1631206924000,1631206924315,0,0,0,,,,,,,,,,, +16904,3037,content://media/external/images/media/3037,/storage/emulated/0/DCIM/Camera/IMG_20210909_190200.jpg,image/jpeg,4000,2250,0,4214189,,1637501805,1631206923000,1631206923158,0,0,0,,,,,,,,,,, +16905,4682,content://media/external/images/media/4682,/storage/emulated/0/DCIM/Camera/IMG_20210909_185330.jpg,image/jpeg,1906,2898,0,1939617,,1637505480,1631206410000,1631206258736,0,0,0,,,,,,,,,,, +16906,3692,content://media/external/images/media/3692,/storage/emulated/0/DCIM/Camera/IMG_20210909_185117.jpg,image/jpeg,1906,2898,0,1937059,,1637503390,1631206278000,1631206258736,0,0,0,,,,,,,,,,, +16907,4071,content://media/external/images/media/4071,/storage/emulated/0/DCIM/Camera/IMG_20210909_185057.jpg,image/jpeg,4000,2250,90,4239679,,1637504342,1631206258000,1631206258736,0,0,0,,,,,,,,,,, +16908,4744,content://media/external/images/media/4744,/storage/emulated/0/DCIM/Camera/IMG_20210909_185052.jpg,image/jpeg,4000,2250,90,4226263,,1637505574,1631206254000,1631206254251,0,0,0,,,,,,,,,,, +16909,3932,content://media/external/images/media/3932,/storage/emulated/0/DCIM/Camera/IMG_20210909_185049.jpg,image/jpeg,4000,2250,90,4282244,,1637503834,1631206251000,1631206251146,0,0,0,,,,,,,,,,, +16910,4939,content://media/external/images/media/4939,/storage/emulated/0/DCIM/Camera/IMG_20210909_184853.jpg,image/jpeg,4000,2250,90,3777464,,1637506010,1631206135000,1631206135561,0,0,0,,,,,,,,,,, +16911,3314,content://media/external/images/media/3314,/storage/emulated/0/DCIM/Camera/IMG_20210909_184524.jpg,image/jpeg,4000,2250,90,4108862,,1637502430,1631205926000,1631205926209,0,0,0,,,,,,,,,,, +16912,4274,content://media/external/images/media/4274,/storage/emulated/0/DCIM/Camera/IMG_20210909_184505.jpg,image/jpeg,4000,2250,90,4051728,,1637504757,1631205906000,1631205906653,0,0,0,,,,,,,,,,, +16913,3964,content://media/external/images/media/3964,/storage/emulated/0/DCIM/Camera/IMG_20210909_184435.jpg,image/jpeg,4000,2250,90,3316785,,1637503942,1631205877000,1631205877776,0,0,0,,,,,,,,,,, +16914,3255,content://media/external/images/media/3255,/storage/emulated/0/DCIM/Camera/IMG_20210909_184430.jpg,image/jpeg,4000,2250,90,3513138,,1637502259,1631205874000,1631205874650,0,0,0,,,,,,,,,,, +16915,4478,content://media/external/images/media/4478,/storage/emulated/0/DCIM/Camera/IMG_20210909_184345.jpg,image/jpeg,4000,2250,90,4515821,,1637505091,1631205826000,1631205826589,0,0,0,,,,,,,,,,, +16916,2851,content://media/external/images/media/2851,/storage/emulated/0/DCIM/Camera/IMG_20210909_183851.jpg,image/jpeg,4160,2340,0,4429647,,1637501431,1631205537000,1631205536893,0,0,0,,,,,,,,,,, +16917,5023,content://media/external/images/media/5023,/storage/emulated/0/DCIM/Camera/IMG_20210909_183844.jpg,image/jpeg,4000,2250,0,4220984,,1637506134,1631205526000,1631205526186,0,0,0,,,,,,,,,,, +16918,3498,content://media/external/images/media/3498,/storage/emulated/0/DCIM/Camera/IMG_20210909_183841.jpg,image/jpeg,4000,2250,0,4543364,,1637502870,1631205522000,1631205522781,0,0,0,,,,,,,,,,, +16919,3327,content://media/external/images/media/3327,/storage/emulated/0/DCIM/Camera/IMG_20210909_183813.jpg,image/jpeg,4000,2250,0,4479162,,1637502438,1631205494000,1631205494810,0,0,0,,,,,,,,,,, +16920,3931,content://media/external/images/media/3931,/storage/emulated/0/DCIM/Camera/IMG_20210909_183758.jpg,image/jpeg,4160,2340,0,4666663,,1637503834,1631205484000,1631205483861,0,0,0,,,,,,,,,,, +16921,4872,content://media/external/images/media/4872,/storage/emulated/0/DCIM/Camera/IMG_20210909_183327.jpg,image/jpeg,4000,2250,0,4445001,,1637505831,1631205209000,1631205209227,0,0,0,,,,,,,,,,, +16922,4593,content://media/external/images/media/4593,/storage/emulated/0/DCIM/Camera/IMG_20210909_183314.jpg,image/jpeg,4160,2340,90,4678898,,1637505278,1631205198000,1631205198625,0,0,0,,,,,,,,,,, +16923,4920,content://media/external/images/media/4920,/storage/emulated/0/DCIM/Camera/IMG_20210909_183222.jpg,image/jpeg,5184,2916,0,4252151,,1637505944,1631205145000,1631205145039,0,0,0,,,,,,,,,,, +16924,2793,content://media/external/images/media/2793,/storage/emulated/0/DCIM/Camera/IMG_20210909_183220.jpg,image/jpeg,5184,2916,0,4241327,,1637501282,1631205144000,1631205144021,0,0,0,,,,,,,,,,, +16925,4125,content://media/external/images/media/4125,/storage/emulated/0/DCIM/Camera/IMG_20210909_183206.jpg,image/jpeg,4000,2250,0,4384669,,1637504451,1631205129000,1631205129063,0,0,0,,,,,,,,,,, +16926,7604,content://media/external/images/media/7604,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG_20210909_132354.jpg",image/jpeg,1600,1200,0,672459,,1637518223,1631186634000,0,0,0,0,,,,,,,,,,, +16927,2832,content://media/external/images/media/2832,/storage/emulated/0/DCIM/Camera/IMG_20210909_130504.jpg,image/jpeg,4160,2340,0,3049698,,1637501370,1631185504000,1631185504108,0,0,0,,,,,,,,,,, +16928,2850,content://media/external/images/media/2850,/storage/emulated/0/DCIM/Camera/IMG_20210909_130344.jpg,image/jpeg,4000,2250,90,4096217,,1637501431,1631185426000,1631185426045,0,0,0,,,,,,,,,,, +16929,4194,content://media/external/images/media/4194,/storage/emulated/0/DCIM/Camera/IMG_20210909_130340.jpg,image/jpeg,4000,2250,90,3929764,,1637504558,1631185423000,1631185423103,0,0,0,,,,,,,,,,, +16930,7343,content://media/external/images/media/7343,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210909-WA0026.jpg",image/jpeg,1600,1200,0,276625,,1637518223,1631183590000,0,0,0,0,,,,,,,,,,, +16931,4919,content://media/external/images/media/4919,/storage/emulated/0/DCIM/Camera/IMG_20210909_122820.jpg,image/jpeg,4000,2250,0,4613555,,1637505944,1631183305000,1631183305513,0,0,0,,,,,,,,,,, +16932,3460,content://media/external/images/media/3460,/storage/emulated/0/DCIM/Camera/PANO_20210909_121355.jpg,image/jpeg,6416,3744,0,15954804,,1637502804,1631182446000,0,0,0,0,,,,,,,,,,, +16933,4707,content://media/external/images/media/4707,/storage/emulated/0/DCIM/Camera/IMG_20210909_121335.jpg,image/jpeg,4160,2340,0,5157499,,1637505509,1631182423000,1631182422938,0,0,0,,,,,,,,,,, +16934,3557,content://media/external/images/media/3557,/storage/emulated/0/DCIM/Camera/IMG_20210909_121324.jpg,image/jpeg,4000,2250,0,6873328,,1637503058,1631182409000,1631182409383,0,0,0,,,,,,,,,,, +16935,4723,content://media/external/images/media/4723,/storage/emulated/0/DCIM/Camera/IMG_20210909_114835.jpg,image/jpeg,4000,2250,0,5334614,,1637505565,1631180920000,1631180919816,0,0,0,,,,,,,,,,, +16936,4871,content://media/external/images/media/4871,/storage/emulated/0/DCIM/Camera/IMG_20210909_112455.jpg,image/jpeg,4160,2340,90,3836202,,1637505831,1631179503000,1631179500457,0,0,0,,,,,,,,,,, +16937,3313,content://media/external/images/media/3313,/storage/emulated/0/DCIM/Camera/IMG_20210909_112446.jpg,image/jpeg,4160,2340,0,4246152,,1637502430,1631179495000,1631179494758,0,0,0,,,,,,,,,,, +16938,4515,content://media/external/images/media/4515,/storage/emulated/0/DCIM/Camera/IMG_20210909_105758.jpg,image/jpeg,4160,2340,0,4650326,,1637505160,1631177882000,1631177881957,0,0,0,,,,,,,,,,, +16939,4361,content://media/external/images/media/4361,/storage/emulated/0/DCIM/Camera/IMG_20210909_105747.jpg,image/jpeg,4000,2250,0,5226280,,1637504970,1631177870000,1631177870653,0,0,0,,,,,,,,,,, +16940,3797,content://media/external/images/media/3797,/storage/emulated/0/DCIM/Camera/IMG_20210909_103050.jpg,image/jpeg,4000,2250,0,5560677,,1637503558,1631176253000,1631176253776,0,0,0,,,,,,,,,,, +16941,7457,content://media/external/images/media/7457,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210909-WA0020.jpg",image/jpeg,904,1600,0,181144,,1637518223,1631175525000,0,0,0,0,,,,,,,,,,, +16942,7593,content://media/external/images/media/7593,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210909-WA0021.jpg",image/jpeg,1600,904,0,217160,,1637518223,1631175525000,0,0,0,0,,,,,,,,,,, +16943,3479,content://media/external/images/media/3479,/storage/emulated/0/DCIM/Camera/IMG_20210909_095150.jpg,image/jpeg,4160,2340,0,5370716,,1637502817,1631173914000,1631173914713,0,0,0,,,,,,,,,,, +16944,4477,content://media/external/images/media/4477,/storage/emulated/0/DCIM/Camera/IMG_20210909_095041.jpg,image/jpeg,4160,2340,0,4887323,,1637505091,1631173849000,1631173849100,0,0,0,,,,,,,,,,, +16945,3156,content://media/external/images/media/3156,/storage/emulated/0/DCIM/Camera/IMG_20210909_095026.jpg,image/jpeg,4000,2250,0,5552255,,1637502130,1631173828000,1631173828510,0,0,0,,,,,,,,,,, +16946,3691,content://media/external/images/media/3691,/storage/emulated/0/DCIM/Camera/IMG_20210909_094956.jpg,image/jpeg,4000,2250,0,4955497,,1637503390,1631173800000,1631173800352,0,0,0,,,,,,,,,,, +16947,4087,content://media/external/images/media/4087,/storage/emulated/0/DCIM/Camera/IMG_20210909_094744.jpg,image/jpeg,4160,2340,90,5939961,,1637504394,1631173669000,1631173668991,0,0,0,,,,,,,,,,, +16948,4458,content://media/external/images/media/4458,/storage/emulated/0/DCIM/Camera/IMG_20210909_094727.jpg,image/jpeg,4000,2250,90,4788384,,1637505068,1631173650000,1631173650408,0,0,0,,,,,,,,,,, +16949,3389,content://media/external/images/media/3389,/storage/emulated/0/DCIM/Camera/IMG_20210909_094355.jpg,image/jpeg,4160,2340,0,4882568,,1637502523,1631173441000,1631173441267,0,0,0,,,,,,,,,,, +16950,4592,content://media/external/images/media/4592,/storage/emulated/0/DCIM/Camera/IMG_20210909_092650.jpg,image/jpeg,4000,2250,0,4570390,,1637505278,1631172412000,1631172412122,0,0,0,,,,,,,,,,, +16951,4706,content://media/external/images/media/4706,/storage/emulated/0/DCIM/Camera/IMG_20210909_092122.jpg,image/jpeg,4160,2340,0,4763634,,1637505509,1631172088000,1631172088569,0,0,0,,,,,,,,,,, +16952,3884,content://media/external/images/media/3884,/storage/emulated/0/DCIM/Camera/IMG_20210909_092032.jpg,image/jpeg,4160,2340,0,4092156,,1637503729,1631172037000,1631172037553,0,0,0,,,,,,,,,,, +16953,4214,content://media/external/images/media/4214,/storage/emulated/0/DCIM/Camera/IMG_20210909_092021.jpg,image/jpeg,4000,2250,0,4856270,,1637504640,1631172024000,1631172024574,0,0,0,,,,,,,,,,, +16954,2954,content://media/external/images/media/2954,/storage/emulated/0/DCIM/Camera/IMG_20210909_091336.jpg,image/jpeg,4160,2340,0,4207864,,1637501661,1631171618000,1631171618574,0,0,0,,,,,,,,,,, +16955,2869,content://media/external/images/media/2869,/storage/emulated/0/DCIM/Camera/IMG_20210909_091325.jpg,image/jpeg,4160,2340,0,4932501,,1637501458,1631171611000,1631171611337,0,0,0,,,,,,,,,,, +16956,5008,content://media/external/images/media/5008,/storage/emulated/0/DCIM/Camera/IMG_20210909_091035.jpg,image/jpeg,5184,2916,0,4038609,,1637506101,1631171436000,1631171383760,0,0,0,,,,,,,,,,, +16957,2997,content://media/external/images/media/2997,/storage/emulated/0/DCIM/Camera/IMG_20210909_090941.jpg,image/jpeg,5184,2916,0,3780440,,1637501771,1631171384000,1631171383760,0,0,0,,,,,,,,,,, +16958,4047,content://media/external/images/media/4047,/storage/emulated/0/DCIM/Camera/PANO_20210909_071758.jpg,image/jpeg,8112,3712,0,17703205,,1637504234,1631164687000,0,0,0,0,,,,,,,,,,, +16959,4236,content://media/external/images/media/4236,/storage/emulated/0/DCIM/Camera/IMG_20210908_211424.jpg,image/jpeg,4000,2250,0,4216032,,1637504726,1631128467000,1631128466996,0,0,0,,,,,,,,,,, +16960,3523,content://media/external/images/media/3523,/storage/emulated/0/DCIM/Camera/IMG_20210908_211223.jpg,image/jpeg,4000,2250,0,3794076,,1637502970,1631128347000,1631128347172,0,0,0,,,,,,,,,,, +16961,4423,content://media/external/images/media/4423,/storage/emulated/0/DCIM/Camera/IMG_20210908_191646.jpg,image/jpeg,4160,2340,0,4216915,,1637505063,1631121410000,1631121409947,0,0,0,,,,,,,,,,, +16962,4086,content://media/external/images/media/4086,/storage/emulated/0/DCIM/Camera/IMG_20210908_191638.jpg,image/jpeg,4160,2340,0,3260706,,1637504394,1631121398000,1631121398237,0,0,0,,,,,,,,,,, +16963,4938,content://media/external/images/media/4938,/storage/emulated/0/DCIM/Camera/IMG_20210908_191607.jpg,image/jpeg,4160,2340,0,4651455,,1637506010,1631121374000,1631121373943,0,0,0,,,,,,,,,,, +16964,3404,content://media/external/images/media/3404,/storage/emulated/0/DCIM/Camera/IMG_20210908_191555.jpg,image/jpeg,4000,2250,0,4537260,,1637502598,1631121359000,1631121359059,0,0,0,,,,,,,,,,, +16965,3858,content://media/external/images/media/3858,/storage/emulated/0/DCIM/Camera/IMG_20210908_191550.jpg,image/jpeg,4000,2250,0,3957911,,1637503642,1631121355000,1631121355605,0,0,0,,,,,,,,,,, +16966,4805,content://media/external/images/media/4805,/storage/emulated/0/DCIM/Camera/IMG_20210908_191425.jpg,image/jpeg,4000,2250,0,3139470,,1637505663,1631121270000,1631121270161,0,0,0,,,,,,,,,,, +16967,4273,content://media/external/images/media/4273,/storage/emulated/0/DCIM/Camera/IMG_20210908_191216.jpg,image/jpeg,4000,2250,90,3936495,,1637504757,1631121139000,1631121139250,0,0,0,,,,,,,,,,, +16968,2792,content://media/external/images/media/2792,/storage/emulated/0/DCIM/Camera/IMG_20210908_191102.jpg,image/jpeg,4160,2340,90,5007726,,1637501282,1631121068000,1631121067987,0,0,0,,,,,,,,,,, +16969,3857,content://media/external/images/media/3857,/storage/emulated/0/DCIM/Camera/IMG_20210908_191100.jpg,image/jpeg,4160,2340,0,4074886,,1637503642,1631121060000,1631121060642,0,0,0,,,,,,,,,,, +16970,4235,content://media/external/images/media/4235,/storage/emulated/0/DCIM/Camera/IMG_20210908_191015.jpg,image/jpeg,4160,2340,0,5044599,,1637504726,1631121021000,1631121021694,0,0,0,,,,,,,,,,, +16971,3930,content://media/external/images/media/3930,/storage/emulated/0/DCIM/Camera/IMG_20210908_190853.jpg,image/jpeg,4160,2340,0,4719631,,1637503834,1631120940000,1631120939902,0,0,0,,,,,,,,,,, +16972,2977,content://media/external/images/media/2977,/storage/emulated/0/DCIM/Camera/IMG_20210908_190825.jpg,image/jpeg,4160,2340,0,4420185,,1637501685,1631120909000,1631120909411,0,0,0,,,,,,,,,,, +16973,3234,content://media/external/images/media/3234,/storage/emulated/0/DCIM/Camera/IMG_20210908_190818.jpg,image/jpeg,4160,2340,90,4152287,,1637502258,1631120904000,1631120903988,0,0,0,,,,,,,,,,, +16974,3326,content://media/external/images/media/3326,/storage/emulated/0/DCIM/Camera/IMG_20210908_181304.jpg,image/jpeg,4000,2250,0,5006219,,1637502438,1631117587000,1631117587137,0,0,0,,,,,,,,,,, +16975,3833,content://media/external/images/media/3833,/storage/emulated/0/DCIM/Camera/IMG_20210908_174722.jpg,image/jpeg,4000,2250,0,5856581,,1637503630,1631116045000,1631116045237,0,0,0,,,,,,,,,,, +16976,3176,content://media/external/images/media/3176,/storage/emulated/0/DCIM/Camera/IMG_20210908_174709.jpg,image/jpeg,4160,2340,0,5799162,,1637502143,1631116032000,1631116032702,0,0,0,,,,,,,,,,, +16977,3427,content://media/external/images/media/3427,/storage/emulated/0/DCIM/Camera/IMG_20210908_174650.jpg,image/jpeg,4000,2250,0,5925237,,1637502682,1631116013000,1631116013306,0,0,0,,,,,,,,,,, +16978,4536,content://media/external/images/media/4536,/storage/emulated/0/DCIM/Camera/IMG_20210908_174227.jpg,image/jpeg,4160,2340,0,4514069,,1637505165,1631115751000,1631115751741,0,0,0,,,,,,,,,,, +16979,2919,content://media/external/images/media/2919,/storage/emulated/0/DCIM/Camera/IMG_20210908_174217.jpg,image/jpeg,4000,2250,0,4791830,,1637501535,1631115739000,1631115739191,0,0,0,,,,,,,,,,, +16980,3120,content://media/external/images/media/3120,/storage/emulated/0/DCIM/Camera/IMG_20210908_174211.jpg,image/jpeg,4000,2250,0,4506332,,1637502054,1631115734000,1631115734254,0,0,0,,,,,,,,,,, +16981,3478,content://media/external/images/media/3478,/storage/emulated/0/DCIM/Camera/IMG_20210908_170350.jpg,image/jpeg,4000,2250,90,5796887,,1637502817,1631113432000,1631113432242,0,0,0,,,,,,,,,,, +16982,4234,content://media/external/images/media/4234,/storage/emulated/0/DCIM/Camera/IMG_20210908_170345.jpg,image/jpeg,4000,2250,0,7378175,,1637504726,1631113427000,1631113427621,0,0,0,,,,,,,,,,, +16983,2935,content://media/external/images/media/2935,/storage/emulated/0/DCIM/Camera/IMG_20210908_165857.jpg,image/jpeg,4000,2250,0,3710096,,1637501599,1631113140000,1631113139863,0,0,0,,,,,,,,,,, +16984,7333,content://media/external/images/media/7333,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0039.jpg",image/jpeg,904,1600,0,217040,,1637518223,1631112925000,0,0,0,0,,,,,,,,,,, +16985,7592,content://media/external/images/media/7592,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0038.jpg",image/jpeg,904,1600,0,183524,,1637518223,1631112924000,0,0,0,0,,,,,,,,,,, +16986,7371,content://media/external/images/media/7371,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0037.jpg",image/jpeg,904,1600,0,167613,,1637518223,1631112923000,0,0,0,0,,,,,,,,,,, +16987,7124,content://media/external/images/media/7124,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0036.jpg",image/jpeg,904,1600,0,192613,,1637518222,1631112922000,0,0,0,0,,,,,,,,,,, +16988,4045,content://media/external/images/media/4045,/storage/emulated/0/DCIM/Camera/IMG_20210908_165419.jpg,image/jpeg,4000,2250,0,3819133,,1637504234,1631112864000,1631112864517,0,0,0,,,,,,,,,,, +16989,4331,content://media/external/images/media/4331,/storage/emulated/0/DCIM/Camera/IMG_20210908_165357.jpg,image/jpeg,8000,6000,0,20349276,,1637504895,1631112839000,1631112839414,0,0,0,,,,,,,,,,, +16990,4900,content://media/external/images/media/4900,/storage/emulated/0/DCIM/Camera/IMG_20210908_165354.jpg,image/jpeg,8000,6000,0,20562938,,1637505920,1631112837000,1631112836714,0,0,0,,,,,,,,,,, +16991,3690,content://media/external/images/media/3690,/storage/emulated/0/DCIM/Camera/IMG_20210908_165342.jpg,image/jpeg,8000,6000,0,23855021,,1637503390,1631112824000,1631112824643,0,0,0,,,,,,,,,,, +16992,4959,content://media/external/images/media/4959,/storage/emulated/0/DCIM/Camera/IMG_20210908_165329.jpg,image/jpeg,8000,6000,0,22522566,,1637506015,1631112811000,1631112811679,0,0,0,,,,,,,,,,, +16993,2818,content://media/external/images/media/2818,/storage/emulated/0/DCIM/Camera/IMG_20210908_165321.jpg,image/jpeg,8000,6000,0,21185185,,1637501312,1631112805000,1631112804816,0,0,0,,,,,,,,,,, +16994,4743,content://media/external/images/media/4743,/storage/emulated/0/DCIM/Camera/IMG_20210908_165259.jpg,image/jpeg,4000,2250,0,2623746,,1637505574,1631112781000,1631112781418,0,0,0,,,,,,,,,,, +16995,3781,content://media/external/images/media/3781,/storage/emulated/0/DCIM/Camera/IMG_20210908_165245.jpg,image/jpeg,4000,2250,0,2259934,,1637503508,1631112767000,1631112767157,0,0,0,,,,,,,,,,, +16996,4786,content://media/external/images/media/4786,/storage/emulated/0/DCIM/Camera/IMG_20210908_165228.jpg,image/jpeg,4000,2250,0,1795379,,1637505656,1631112750000,1631112750213,0,0,0,,,,,,,,,,, +16997,4958,content://media/external/images/media/4958,/storage/emulated/0/DCIM/Camera/IMG_20210908_164702.jpg,image/jpeg,4000,2250,90,4596232,,1637506015,1631112425000,1631112425644,0,0,0,,,,,,,,,,, +16998,3689,content://media/external/images/media/3689,/storage/emulated/0/DCIM/Camera/IMG_20210908_164504.jpg,image/jpeg,4000,2250,0,5328642,,1637503390,1631112309000,1631112308986,0,0,0,,,,,,,,,,, +16999,4330,content://media/external/images/media/4330,/storage/emulated/0/DCIM/Camera/IMG_20210908_163644.jpg,image/jpeg,4000,2250,0,2326035,,1637504895,1631111805000,1631111805674,0,0,0,,,,,,,,,,, +17000,4457,content://media/external/images/media/4457,/storage/emulated/0/DCIM/Camera/IMG_20210908_163640.jpg,image/jpeg,4000,2250,0,2210587,,1637505068,1631111801000,1631111801748,0,0,0,,,,,,,,,,, +17001,4252,content://media/external/images/media/4252,/storage/emulated/0/DCIM/Camera/IMG_20210908_163623.jpg,image/jpeg,4000,2250,0,6051087,,1637504734,1631111786000,1631111786064,0,0,0,,,,,,,,,,, +17002,4025,content://media/external/images/media/4025,/storage/emulated/0/DCIM/Camera/IMG_20210908_155348.jpg,image/jpeg,4160,2340,0,5218302,,1637504201,1631109229000,1631109229766,0,0,0,,,,,,,,,,, +17003,3904,content://media/external/images/media/3904,/storage/emulated/0/DCIM/Camera/IMG_20210908_155336.jpg,image/jpeg,4160,2340,0,5539379,,1637503732,1631109218000,1631109218778,0,0,0,,,,,,,,,,, +17004,3294,content://media/external/images/media/3294,/storage/emulated/0/DCIM/Camera/IMG_20210908_155330.jpg,image/jpeg,4160,2340,90,5413535,,1637502355,1631109214000,1631109214398,0,0,0,,,,,,,,,,, +17005,3426,content://media/external/images/media/3426,/storage/emulated/0/DCIM/Camera/IMG_20210908_155206.jpg,image/jpeg,720,1280,270,192844,,1637502682,1631109126000,0,0,0,0,,,,,,,,,,, +17006,4551,content://media/external/images/media/4551,/storage/emulated/0/DCIM/Camera/IMG_20210908_155201.jpg,image/jpeg,4160,2340,0,5500403,,1637505187,1631109125000,1631109125424,0,0,0,,,,,,,,,,, +17007,4833,content://media/external/images/media/4833,/storage/emulated/0/DCIM/Camera/IMG_20210908_155152.jpg,image/jpeg,4000,2250,0,6171498,,1637505731,1631109115000,1631109115114,0,0,0,,,,,,,,,,, +17008,7591,content://media/external/images/media/7591,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0032.jpg",image/jpeg,1600,904,0,247577,,1637518223,1631109028000,0,0,0,0,,,,,,,,,,, +17009,4832,content://media/external/images/media/4832,/storage/emulated/0/DCIM/Camera/IMG_20210908_154814.jpg,image/jpeg,1338,1938,0,831377,,1637505731,1631108895000,1631108744087,0,0,0,,,,,,,,,,, +17010,7267,content://media/external/images/media/7267,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0031.jpg",image/jpeg,1600,904,0,263868,,1637518223,1631108885000,0,0,0,0,,,,,,,,,,, +17011,3014,content://media/external/images/media/3014,/storage/emulated/0/DCIM/Camera/IMG_20210908_154538.jpg,image/jpeg,4000,2250,0,4438121,,1637501786,1631108744000,1631108744087,0,0,0,,,,,,,,,,, +17012,3736,content://media/external/images/media/3736,/storage/emulated/0/DCIM/Camera/IMG_20210908_140637.jpg,image/jpeg,4000,2250,0,1726798,,1637503477,1631102800000,1631102800471,0,0,0,,,,,,,,,,, +17013,3195,content://media/external/images/media/3195,/storage/emulated/0/DCIM/Camera/IMG_20210908_140609.jpg,image/jpeg,4160,2340,0,5647476,,1637502161,1631102776000,1631102776184,0,0,0,,,,,,,,,,, +17014,3272,content://media/external/images/media/3272,/storage/emulated/0/DCIM/Camera/IMG_20210908_135538.jpg,image/jpeg,4160,2340,0,5135722,,1637502342,1631102146000,1631102145835,0,0,0,,,,,,,,,,, +17015,2849,content://media/external/images/media/2849,/storage/emulated/0/DCIM/Camera/IMG_20210908_100253.jpg,image/jpeg,5184,2916,0,3293524,,1637501431,1631088174000,1631088174541,0,0,0,,,,,,,,,,, +17016,3540,content://media/external/images/media/3540,/storage/emulated/0/DCIM/Camera/IMG_20210908_100240.jpg,image/jpeg,5184,2916,0,2872784,,1637503010,1631088163000,1631088163162,0,0,0,,,,,,,,,,, +17017,4104,content://media/external/images/media/4104,/storage/emulated/0/DCIM/Camera/IMG_20210908_100204.jpg,image/jpeg,4000,2250,0,5294375,,1637504400,1631088126000,1631088126583,0,0,0,,,,,,,,,,, +17018,4360,content://media/external/images/media/4360,/storage/emulated/0/DCIM/Camera/IMG_20210908_095247.jpg,image/jpeg,4000,2250,0,5459558,,1637504970,1631087569000,1631087569611,0,0,0,,,,,,,,,,, +17019,3119,content://media/external/images/media/3119,/storage/emulated/0/DCIM/Camera/IMG_20210908_094052.jpg,image/jpeg,4000,2250,90,5515566,,1637502054,1631086855000,1631086855452,0,0,0,,,,,,,,,,, +17020,2996,content://media/external/images/media/2996,/storage/emulated/0/DCIM/Camera/IMG_20210908_092511.jpg,image/jpeg,4160,2340,0,4988034,,1637501771,1631085914000,1631085913984,0,0,0,,,,,,,,,,, +17021,4382,content://media/external/images/media/4382,/storage/emulated/0/DCIM/Camera/IMG_20210908_092506.jpg,image/jpeg,4160,2340,0,4972500,,1637504982,1631085911000,1631085910989,0,0,0,,,,,,,,,,, +17022,3457,content://media/external/images/media/3457,/storage/emulated/0/DCIM/Camera/IMG_20210908_092451.jpg,image/jpeg,4000,2250,0,5415191,,1637502804,1631085895000,1631085895343,0,0,0,,,,,,,,,,, +17023,3312,content://media/external/images/media/3312,/storage/emulated/0/DCIM/Camera/IMG_20210908_091508.jpg,image/jpeg,4000,2250,0,4063969,,1637502430,1631085311000,1631085310942,0,0,0,,,,,,,,,,, +17024,7096,content://media/external/images/media/7096,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0016.jpg",image/jpeg,904,1600,0,188724,,1637518222,1631085295000,0,0,0,0,,,,,,,,,,, +17025,5006,content://media/external/images/media/5006,/storage/emulated/0/DCIM/Camera/IMG_20210908_090903.jpg,image/jpeg,4000,2250,0,4802907,,1637506101,1631084946000,1631084946361,0,0,0,,,,,,,,,,, +17026,4381,content://media/external/images/media/4381,/storage/emulated/0/DCIM/Camera/IMG_20210908_085250.jpg,image/jpeg,4000,2250,90,4098977,,1637504982,1631083974000,1631083974621,0,0,0,,,,,,,,,,, +17027,4160,content://media/external/images/media/4160,/storage/emulated/0/DCIM/Camera/IMG_20210908_084445.jpg,image/jpeg,5184,2916,0,4021731,,1637504481,1631083486000,1631083450407,0,0,0,,,,,,,,,,, +17028,7315,content://media/external/images/media/7315,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0011.jpg",image/jpeg,2048,1536,0,699661,,1637518223,1631082780000,0,0,0,0,,,,,,,,,,, +17029,7266,content://media/external/images/media/7266,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0009.jpg",image/jpeg,1600,904,0,177219,,1637518223,1631078335000,0,0,0,0,,,,,,,,,,, +17030,7548,content://media/external/images/media/7548,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0000.jpg",image/jpeg,1600,904,0,146772,,1637518223,1631078330000,0,0,0,0,,,,,,,,,,, +17031,3194,content://media/external/images/media/3194,/storage/emulated/0/DCIM/Camera/IMG_20210907_191432.jpg,image/jpeg,5184,2916,0,4605888,,1637502161,1631034873000,1631034848566,0,0,0,,,,,,,,,,, +17032,7332,content://media/external/images/media/7332,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0054.jpg",image/jpeg,904,1600,0,170825,,1637518223,1631034665000,0,0,0,0,,,,,,,,,,, +17033,4475,content://media/external/images/media/4475,/storage/emulated/0/DCIM/Camera/IMG_20210907_190951.jpg,image/jpeg,4000,2250,0,4492651,,1637505091,1631034594000,1631034594451,0,0,0,,,,,,,,,,, +17034,4681,content://media/external/images/media/4681,/storage/emulated/0/DCIM/Camera/IMG_20210907_184344.jpg,image/jpeg,4000,2250,90,4103854,,1637505480,1631033028000,1631033027859,0,0,0,,,,,,,,,,, +17035,3057,content://media/external/images/media/3057,/storage/emulated/0/DCIM/Camera/IMG_20210907_184309.jpg,image/jpeg,4000,2250,0,4478823,,1637501858,1631032991000,1631032991446,0,0,0,,,,,,,,,,, +17036,4671,content://media/external/images/media/4671,/storage/emulated/0/DCIM/Camera/IMG_20210907_184304.jpg,image/jpeg,4000,2250,0,4210132,,1637505418,1631032988000,1631032988391,0,0,0,,,,,,,,,,, +17037,4742,content://media/external/images/media/4742,/storage/emulated/0/DCIM/Camera/IMG_20210907_182410.jpg,image/jpeg,5184,2916,0,5107573,,1637505574,1631031854000,1631031854233,0,0,0,,,,,,,,,,, +17038,4173,content://media/external/images/media/4173,/storage/emulated/0/DCIM/Camera/IMG_20210907_182358.jpg,image/jpeg,4000,2250,0,5676378,,1637504556,1631031841000,1631031840867,0,0,0,,,,,,,,,,, +17039,7404,content://media/external/images/media/7404,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0044.jpg",image/jpeg,904,1600,0,221024,,1637518223,1631022352000,0,0,0,0,,,,,,,,,,, +17040,4192,content://media/external/images/media/4192,/storage/emulated/0/DCIM/Camera/IMG_20210907_154522.jpg,image/jpeg,4000,2250,90,4834328,,1637504558,1631022324000,1631022323909,0,0,0,,,,,,,,,,, +17041,4292,content://media/external/images/media/4292,/storage/emulated/0/DCIM/Camera/IMG_20210907_154452.jpg,image/jpeg,4000,2250,90,5460218,,1637504808,1631022297000,1631022296867,0,0,0,,,,,,,,,,, +17042,2995,content://media/external/images/media/2995,/storage/emulated/0/DCIM/Camera/IMG_20210907_115338.jpg,image/jpeg,4000,2250,0,4472841,,1637501771,1631008420000,1631008420027,0,0,0,,,,,,,,,,, +17043,3819,content://media/external/images/media/3819,/storage/emulated/0/DCIM/Camera/IMG_20210907_115328.jpg,image/jpeg,4160,2340,0,4215049,,1637503601,1631008412000,1631008412709,0,0,0,,,,,,,,,,, +17044,3647,content://media/external/images/media/3647,/storage/emulated/0/DCIM/Camera/IMG_20210907_113401.jpg,image/jpeg,4000,2250,90,4408669,,1637503301,1631007243000,1631007243000,0,0,0,,,,,,,,,,, +17045,3832,content://media/external/images/media/3832,/storage/emulated/0/DCIM/Camera/IMG_20210907_113304.jpg,image/jpeg,4000,2250,0,4612946,,1637503630,1631007186000,1631007185887,0,0,0,,,,,,,,,,, +17046,4765,content://media/external/images/media/4765,/storage/emulated/0/DCIM/Camera/IMG_20210907_113300.jpg,image/jpeg,4000,2250,0,4426133,,1637505639,1631007181000,1631007181547,0,0,0,,,,,,,,,,, +17047,3056,content://media/external/images/media/3056,/storage/emulated/0/DCIM/Camera/IMG_20210907_113251.jpg,image/jpeg,4000,2250,0,3544647,,1637501858,1631007175000,1631007175309,0,0,0,,,,,,,,,,, +17048,7471,content://media/external/images/media/7471,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0035.jpg",image/jpeg,1600,904,0,174149,,1637518223,1631006428000,0,0,0,0,,,,,,,,,,, +17049,4831,content://media/external/images/media/4831,/storage/emulated/0/DCIM/Camera/IMG_20210907_111723.jpg,image/jpeg,4160,2340,0,5213436,,1637505731,1631006250000,1631006250114,0,0,0,,,,,,,,,,, +17050,3780,content://media/external/images/media/3780,/storage/emulated/0/DCIM/Camera/IMG_20210907_111707.jpg,image/jpeg,4000,2250,0,4761431,,1637503508,1631006230000,1631006230004,0,0,0,,,,,,,,,,, +17051,2891,content://media/external/images/media/2891,/storage/emulated/0/DCIM/Camera/IMG_20210907_100747.jpg,image/jpeg,2250,4000,0,3952761,,1637501516,1631002068000,1631001149395,0,0,0,,,,,,,,,,, +17052,3012,content://media/external/images/media/3012,/storage/emulated/0/DCIM/Camera/IMG_20210907_100321.jpg,image/jpeg,4160,2340,0,5230996,,1637501786,1631001811000,1631001811359,0,0,0,,,,,,,,,,, +17053,3425,content://media/external/images/media/3425,/storage/emulated/0/DCIM/Camera/IMG_20210907_095543.jpg,image/jpeg,4160,2340,0,5253451,,1637502682,1631001352000,1631001351918,0,0,0,,,,,,,,,,, +17054,3753,content://media/external/images/media/3753,/storage/emulated/0/DCIM/Camera/IMG_20210907_095342.jpg,image/jpeg,4000,2250,0,4956086,,1637503488,1631001225000,1631001225180,0,0,0,,,,,,,,,,, +17055,4474,content://media/external/images/media/4474,/storage/emulated/0/DCIM/Camera/IMG_20210907_095343.jpg,image/jpeg,4000,2250,0,4424600,,1637505091,1631001225000,1631001225005,0,0,0,,,,,,,,,,, +17056,3963,content://media/external/images/media/3963,/storage/emulated/0/DCIM/Camera/IMG_20210907_095210.jpg,image/jpeg,4000,2250,90,5891972,,1637503942,1631001133000,1631001132799,0,0,0,,,,,,,,,,, +17057,2953,content://media/external/images/media/2953,/storage/emulated/0/DCIM/Camera/IMG_20210907_095204.jpg,image/jpeg,4000,2250,0,5705334,,1637501661,1631001128000,1631001127983,0,0,0,,,,,,,,,,, +17058,7521,content://media/external/images/media/7521,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0030.jpg",image/jpeg,904,1600,0,229244,,1637518223,1631000973000,0,0,0,0,,,,,,,,,,, +17059,4685,content://media/external/images/media/4685,/storage/emulated/0/DCIM/Camera/PANO_20210907_094655.jpg,image/jpeg,7152,3776,0,17770257,,1637505480,1631000821000,0,0,0,0,,,,,,,,,,, +17060,4348,content://media/external/images/media/4348,/storage/emulated/0/DCIM/Camera/PANO_20210907_094643.jpg,image/jpeg,7888,3744,0,21130271,,1637504907,1631000811000,0,0,0,0,,,,,,,,,,, +17061,7065,content://media/external/images/media/7065,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0028.jpg",image/jpeg,1600,904,0,211999,,1637518222,1631000677000,0,0,0,0,,,,,,,,,,, +17062,7370,content://media/external/images/media/7370,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0027.jpg",image/jpeg,904,1600,0,151089,,1637518223,1631000676000,0,0,0,0,,,,,,,,,,, +17063,7237,content://media/external/images/media/7237,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0026.jpg",image/jpeg,1600,904,0,269429,,1637518223,1631000675000,0,0,0,0,,,,,,,,,,, +17064,7123,content://media/external/images/media/7123,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0025.jpg",image/jpeg,1600,904,0,270805,,1637518222,1631000674000,0,0,0,0,,,,,,,,,,, +17065,7284,content://media/external/images/media/7284,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0024.jpg",image/jpeg,1600,904,0,267732,,1637518223,1631000672000,0,0,0,0,,,,,,,,,,, +17066,3353,content://media/external/images/media/3353,/storage/emulated/0/DCIM/Camera/IMG_20210907_094348.jpg,image/jpeg,4160,2340,90,6733815,,1637502439,1631000632000,1631000632497,0,0,0,,,,,,,,,,, +17067,4741,content://media/external/images/media/4741,/storage/emulated/0/DCIM/Camera/IMG_20210907_094341.jpg,image/jpeg,4160,2340,0,3332467,,1637505574,1631000621000,1631000621372,0,0,0,,,,,,,,,,, +17068,4722,content://media/external/images/media/4722,/storage/emulated/0/DCIM/Camera/IMG_20210907_093650.jpg,image/jpeg,4160,2340,0,3920531,,1637505565,1631000213000,1631000213526,0,0,0,,,,,,,,,,, +17069,4591,content://media/external/images/media/4591,/storage/emulated/0/DCIM/Camera/IMG_20210907_093641.jpg,image/jpeg,4160,2340,0,3955212,,1637505278,1631000209000,1631000208984,0,0,0,,,,,,,,,,, +17070,3818,content://media/external/images/media/3818,/storage/emulated/0/DCIM/Camera/IMG_20210907_091321.jpg,image/jpeg,4000,2250,90,5245808,,1637503601,1630998804000,1630998803684,0,0,0,,,,,,,,,,, +17071,4764,content://media/external/images/media/4764,/storage/emulated/0/DCIM/Camera/IMG_20210907_091255.jpg,image/jpeg,4000,2250,0,4764258,,1637505639,1630998778000,1630998778307,0,0,0,,,,,,,,,,, +17072,3175,content://media/external/images/media/3175,/storage/emulated/0/DCIM/Camera/IMG_20210907_085958.jpg,image/jpeg,4000,2250,0,4495246,,1637502143,1630998000000,1630998000230,0,0,0,,,,,,,,,,, +17073,3929,content://media/external/images/media/3929,/storage/emulated/0/DCIM/Camera/IMG_20210907_085825.jpg,image/jpeg,5184,2916,0,4964613,,1637503834,1630997907000,1630997907767,0,0,0,,,,,,,,,,, +17074,4272,content://media/external/images/media/4272,/storage/emulated/0/DCIM/Camera/IMG_20210907_085754.jpg,image/jpeg,5184,2916,0,4463010,,1637504757,1630997878000,1630997878802,0,0,0,,,,,,,,,,, +17075,3271,content://media/external/images/media/3271,/storage/emulated/0/DCIM/Camera/IMG_20210907_075022.jpg,image/jpeg,4000,2250,0,3549185,,1637502342,1630993826000,1630993826307,0,0,0,,,,,,,,,,, +17076,7162,content://media/external/images/media/7162,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0013.jpg",image/jpeg,1600,904,0,202862,,1637518222,1630992135000,0,0,0,0,,,,,,,,,,, +17077,7223,content://media/external/images/media/7223,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0011.jpg",image/jpeg,904,1600,0,113725,,1637518223,1630991539000,0,0,0,0,,,,,,,,,,, +17078,7498,content://media/external/images/media/7498,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0010.jpg",image/jpeg,1600,904,0,167854,,1637518223,1630991444000,0,0,0,0,,,,,,,,,,, +17079,7369,content://media/external/images/media/7369,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0009.jpg",image/jpeg,904,1600,0,143687,,1637518223,1630991315000,0,0,0,0,,,,,,,,,,, +17080,7222,content://media/external/images/media/7222,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0008.jpg",image/jpeg,1600,904,0,103051,,1637518223,1630991152000,0,0,0,0,,,,,,,,,,, +17081,7161,content://media/external/images/media/7161,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0007.jpg",image/jpeg,1600,904,0,181836,,1637518222,1630991049000,0,0,0,0,,,,,,,,,,, +17082,7456,content://media/external/images/media/7456,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0005.jpg",image/jpeg,904,1600,0,124058,,1637518223,1630990534000,0,0,0,0,,,,,,,,,,, +17083,7122,content://media/external/images/media/7122,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0004.jpg",image/jpeg,1600,904,0,169256,,1637518222,1630990533000,0,0,0,0,,,,,,,,,,, +17084,7497,content://media/external/images/media/7497,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0003.jpg",image/jpeg,1600,904,0,142957,,1637518223,1630990532000,0,0,0,0,,,,,,,,,,, +17085,7221,content://media/external/images/media/7221,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0002.jpg",image/jpeg,1600,904,0,95911,,1637518223,1630990530000,0,0,0,0,,,,,,,,,,, +17086,7368,content://media/external/images/media/7368,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0001.jpg",image/jpeg,1600,904,0,111757,,1637518223,1630990529000,0,0,0,0,,,,,,,,,,, +17087,4721,content://media/external/images/media/4721,/storage/emulated/0/DCIM/Camera/IMG_20210906_212806.jpg,image/jpeg,4000,2250,0,3933047,,1637505565,1630956490000,1630956489887,0,0,0,,,,,,,,,,, +17088,4851,content://media/external/images/media/4851,/storage/emulated/0/DCIM/Camera/IMG_20210906_205221.jpg,image/jpeg,4160,2340,0,2853909,,1637505753,1630954341000,1630954341041,0,0,0,,,,,,,,,,, +17089,4251,content://media/external/images/media/4251,/storage/emulated/0/DCIM/Camera/IMG_20210906_205217.jpg,image/jpeg,4160,2340,0,2873510,,1637504734,1630954337000,1630954336989,0,0,0,,,,,,,,,,, +17090,4404,content://media/external/images/media/4404,/storage/emulated/0/DCIM/Camera/IMG_20210906_204046.jpg,image/jpeg,4000,2250,0,3317693,,1637505004,1630953649000,1630953648921,0,0,0,,,,,,,,,,, +17091,2952,content://media/external/images/media/2952,/storage/emulated/0/DCIM/Camera/IMG_20210906_203033.jpg,image/jpeg,4000,2250,0,2256039,,1637501661,1630953036000,1630953036239,0,0,0,,,,,,,,,,, +17092,4442,content://media/external/images/media/4442,/storage/emulated/0/DCIM/Camera/IMG_20210906_202814.jpg,image/jpeg,4000,2250,0,2542668,,1637505068,1630952898000,1630952898126,0,0,0,,,,,,,,,,, +17093,3752,content://media/external/images/media/3752,/storage/emulated/0/DCIM/Camera/IMG_20210906_202541.jpg,image/jpeg,4000,2250,0,2486601,,1637503488,1630952747000,1630952747352,0,0,0,,,,,,,,,,, +17094,4380,content://media/external/images/media/4380,/storage/emulated/0/DCIM/Camera/IMG_20210906_190427.jpg,image/jpeg,4160,2340,0,4595428,,1637504982,1630947869000,1630947869031,0,0,0,,,,,,,,,,, +17095,3556,content://media/external/images/media/3556,/storage/emulated/0/DCIM/Camera/IMG_20210906_190421.jpg,image/jpeg,4160,2340,0,4819837,,1637503058,1630947866000,1630947865930,0,0,0,,,,,,,,,,, +17096,4008,content://media/external/images/media/4008,/storage/emulated/0/DCIM/Camera/IMG_20210906_190410.jpg,image/jpeg,4000,2250,0,5161307,,1637504086,1630947853000,1630947853692,0,0,0,,,,,,,,,,, +17097,2934,content://media/external/images/media/2934,/storage/emulated/0/DCIM/Camera/IMG_20210906_190402.jpg,image/jpeg,4000,2250,0,5087462,,1637501599,1630947844000,1630947844564,0,0,0,,,,,,,,,,, +17098,2880,content://media/external/images/media/2880,/storage/emulated/0/DCIM/Camera/IMG_20210906_185455.jpg,image/jpeg,4000,2250,0,4205085,,1637501461,1630947297000,1630947297340,0,0,0,,,,,,,,,,, +17099,4763,content://media/external/images/media/4763,/storage/emulated/0/DCIM/Camera/IMG_20210906_185423.jpg,image/jpeg,4000,2250,0,4774913,,1637505639,1630947267000,1630947267637,0,0,0,,,,,,,,,,, +17100,3735,content://media/external/images/media/3735,/storage/emulated/0/DCIM/Camera/IMG_20210906_185325.jpg,image/jpeg,4000,2250,0,3938163,,1637503477,1630947208000,1630947208111,0,0,0,,,,,,,,,,, +17101,7590,content://media/external/images/media/7590,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0057.jpg",image/jpeg,1600,904,0,117528,,1637518223,1630946250000,0,0,0,0,,,,,,,,,,, +17102,7390,content://media/external/images/media/7390,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0053.jpg",image/jpeg,1600,904,0,193872,,1637518223,1630945235000,0,0,0,0,,,,,,,,,,, +17103,2951,content://media/external/images/media/2951,/storage/emulated/0/DCIM/Camera/IMG_20210906_182004.jpg,image/jpeg,4000,2250,0,5065696,,1637501661,1630945207000,1630945207410,0,0,0,,,,,,,,,,, +17104,7389,content://media/external/images/media/7389,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0052.jpg",image/jpeg,1600,904,0,158753,,1637518223,1630943750000,0,0,0,0,,,,,,,,,,, +17105,4785,content://media/external/images/media/4785,/storage/emulated/0/DCIM/Camera/IMG_20210906_174410.jpg,image/jpeg,4000,2250,90,5139973,,1637505656,1630943052000,1630943052469,0,0,0,,,,,,,,,,, +17106,2831,content://media/external/images/media/2831,/storage/emulated/0/DCIM/Camera/IMG_20210906_174404.jpg,image/jpeg,4000,2250,0,5020255,,1637501370,1630943046000,1630943046418,0,0,0,,,,,,,,,,, +17107,4850,content://media/external/images/media/4850,/storage/emulated/0/DCIM/Camera/IMG_20210906_174354.jpg,image/jpeg,4000,2250,0,4211276,,1637505753,1630943037000,1630943037374,0,0,0,,,,,,,,,,, +17108,7367,content://media/external/images/media/7367,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0051.jpg",image/jpeg,1600,904,0,109241,,1637518223,1630939386000,0,0,0,0,,,,,,,,,,, +17109,3669,content://media/external/images/media/3669,/storage/emulated/0/DCIM/Camera/IMG_20210906_164239.jpg,image/jpeg,4000,2250,0,4542810,,1637503358,1630939361000,1630939361638,0,0,0,,,,,,,,,,, +17110,4514,content://media/external/images/media/4514,/storage/emulated/0/DCIM/Camera/IMG_20210906_162909.jpg,image/jpeg,4160,2340,0,4999021,,1637505160,1630938555000,1630938554880,0,0,0,,,,,,,,,,, +17111,3856,content://media/external/images/media/3856,/storage/emulated/0/DCIM/Camera/IMG_20210906_162837.jpg,image/jpeg,4000,2250,0,5409498,,1637503642,1630938519000,1630938519367,0,0,0,,,,,,,,,,, +17112,7366,content://media/external/images/media/7366,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0050.jpg",image/jpeg,1600,904,0,192564,,1637518223,1630938488000,0,0,0,0,,,,,,,,,,, +17113,7455,content://media/external/images/media/7455,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0049.jpg",image/jpeg,1600,904,0,149518,,1637518223,1630938109000,0,0,0,0,,,,,,,,,,, +17114,7547,content://media/external/images/media/7547,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0048.jpg",image/jpeg,1600,904,0,180068,,1637518223,1630938108000,0,0,0,0,,,,,,,,,,, +17115,7314,content://media/external/images/media/7314,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0047.jpg",image/jpeg,1600,904,0,168851,,1637518223,1630938107000,0,0,0,0,,,,,,,,,,, +17116,3254,content://media/external/images/media/3254,/storage/emulated/0/DCIM/Camera/IMG_20210906_160056.jpg,image/jpeg,4000,2250,0,5609395,,1637502259,1630936863000,1630936863106,0,0,0,,,,,,,,,,, +17117,7472,content://media/external/images/media/7472,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0044.jpg",image/jpeg,904,1600,0,112920,,1637518223,1630935662000,0,0,0,0,,,,,,,,,,, +17118,3036,content://media/external/images/media/3036,/storage/emulated/0/DCIM/Camera/IMG_20210906_153222.jpg,image/jpeg,4160,2340,0,5286509,,1637501805,1630935149000,1630935149473,0,0,0,,,,,,,,,,, +17119,3882,content://media/external/images/media/3882,/storage/emulated/0/DCIM/Camera/IMG_20210906_153202.jpg,image/jpeg,5184,2916,270,4830196,,1637503729,1630935126000,1630935126099,0,0,0,,,,,,,,,,, +17120,7171,content://media/external/images/media/7171,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0039.jpg",image/jpeg,1600,904,0,239439,,1637518222,1630934887000,0,0,0,0,,,,,,,,,,, +17121,7172,content://media/external/images/media/7172,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0041.jpg",image/jpeg,1600,904,0,246106,,1637518222,1630934860000,0,0,0,0,,,,,,,,,,, +17122,7520,content://media/external/images/media/7520,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0040.jpg",image/jpeg,1600,904,0,245658,,1637518223,1630934859000,0,0,0,0,,,,,,,,,,, +17123,7342,content://media/external/images/media/7342,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0038.jpg",image/jpeg,1600,904,0,239984,,1637518223,1630934857000,0,0,0,0,,,,,,,,,,, +17124,7170,content://media/external/images/media/7170,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0037.jpg",image/jpeg,1600,904,0,251228,,1637518222,1630934855000,0,0,0,0,,,,,,,,,,, +17125,3796,content://media/external/images/media/3796,/storage/emulated/0/DCIM/Camera/IMG_20210906_152540.jpg,image/jpeg,5184,2916,0,4450056,,1637503558,1630934743000,1630934743236,0,0,0,,,,,,,,,,, +17126,7187,content://media/external/images/media/7187,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0036.jpg",image/jpeg,1600,904,0,204266,,1637518223,1630934720000,0,0,0,0,,,,,,,,,,, +17127,4143,content://media/external/images/media/4143,/storage/emulated/0/DCIM/Camera/IMG_20210906_152443.jpg,image/jpeg,4000,2250,0,5338684,,1637504473,1630934687000,1630934686817,0,0,0,,,,,,,,,,, +17128,7558,content://media/external/images/media/7558,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0034.jpg",image/jpeg,1600,904,0,139617,,1637518223,1630934679000,0,0,0,0,,,,,,,,,,, +17129,7113,content://media/external/images/media/7113,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0033.jpg",image/jpeg,904,1600,0,165974,,1637518222,1630934676000,0,0,0,0,,,,,,,,,,, +17130,3477,content://media/external/images/media/3477,/storage/emulated/0/DCIM/Camera/IMG_20210906_150831.jpg,image/jpeg,2113,3757,0,2196698,,1637502817,1630933713000,1630933555838,0,0,0,,,,,,,,,,, +17131,4007,content://media/external/images/media/4007,/storage/emulated/0/DCIM/Camera/IMG_20210906_150619.jpg,image/jpeg,4160,2340,0,4888096,,1637504086,1630933583000,1630933583034,0,0,0,,,,,,,,,,, +17132,4232,content://media/external/images/media/4232,/storage/emulated/0/DCIM/Camera/IMG_20210906_150613.jpg,image/jpeg,4160,2340,0,5043441,,1637504726,1630933579000,1630933578887,0,0,0,,,,,,,,,,, +17133,4085,content://media/external/images/media/4085,/storage/emulated/0/DCIM/Camera/IMG_20210906_150551.jpg,image/jpeg,5184,2916,270,4799354,,1637504394,1630933556000,1630933555838,0,0,0,,,,,,,,,,, +17134,4670,content://media/external/images/media/4670,/storage/emulated/0/DCIM/Camera/IMG_20210906_124416.jpg,image/jpeg,5184,2916,0,4529542,,1637505418,1630925059000,1630925059458,0,0,0,,,,,,,,,,, +17135,4250,content://media/external/images/media/4250,/storage/emulated/0/DCIM/Camera/IMG_20210906_124346.jpg,image/jpeg,5184,2916,0,4278154,,1637504734,1630925030000,1630925030609,0,0,0,,,,,,,,,,, +17136,4084,content://media/external/images/media/4084,/storage/emulated/0/DCIM/Camera/IMG_20210906_124312.jpg,image/jpeg,5184,2916,0,2372640,,1637504394,1630924996000,1630924995902,0,0,0,,,,,,,,,,, +17137,3456,content://media/external/images/media/3456,/storage/emulated/0/DCIM/Camera/IMG_20210906_122651.jpg,image/jpeg,4160,2340,0,5696392,,1637502804,1630924018000,1630924017806,0,0,0,,,,,,,,,,, +17138,4403,content://media/external/images/media/4403,/storage/emulated/0/DCIM/Camera/IMG_20210906_104105.jpg,image/jpeg,5184,2916,0,4598710,,1637505004,1630917669000,1630917668880,0,0,0,,,,,,,,,,, +17139,3646,content://media/external/images/media/3646,/storage/emulated/0/DCIM/Camera/IMG_20210906_104044.jpg,image/jpeg,4160,2340,0,4658267,,1637503301,1630917650000,1630917650397,0,0,0,,,,,,,,,,, +17140,2760,content://media/external/images/media/2760,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-09-06-08-57-13-029_com.android.chrome.jpg,image/jpeg,1080,2340,0,539381,,1637500987,1630911433000,0,0,0,0,,,,,,,,,,, +17141,2918,content://media/external/images/media/2918,/storage/emulated/0/DCIM/Camera/IMG_20210906_081538.jpg,image/jpeg,4160,2340,180,4355891,,1637501535,1630908948000,1630908947624,0,0,0,,,,,,,,,,, +17142,3351,content://media/external/images/media/3351,/storage/emulated/0/DCIM/Camera/IMG_20210906_072222.jpg,image/jpeg,4160,2340,0,4210302,,1637502439,1630905747000,1630905747675,0,0,0,,,,,,,,,,, +17143,4957,content://media/external/images/media/4957,/storage/emulated/0/DCIM/Camera/IMG_20210906_071351.jpg,image/jpeg,4160,2340,0,4638883,,1637506015,1630905236000,1630905235863,0,0,0,,,,,,,,,,, +17144,2817,content://media/external/images/media/2817,/storage/emulated/0/DCIM/Camera/IMG_20210905_074649.jpg,image/jpeg,4000,2250,90,4211123,,1637501312,1630820816000,1630820815848,0,0,0,,,,,,,,,,, +17145,2716,content://media/external/images/media/2716,/storage/emulated/0/DCIM/Screenshots/IMG_20210904_173937.jpg,image/jpeg,1080,1062,0,151139,,1637500987,1630769977000,0,0,0,0,,,,,,,,,,, +17146,7496,content://media/external/images/media/7496,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210904-WA0014.jpg",image/jpeg,2048,1536,0,691366,,1637518223,1630768762000,0,0,0,0,,,,,,,,,,, +17147,2642,content://media/external/images/media/2642,/storage/emulated/0/DCIM/Screenshots/IMG_20210904_150136.jpg,image/jpeg,1064,1053,0,156384,,1637500870,1630760496000,0,0,0,0,,,,,,,,,,, +17148,2715,content://media/external/images/media/2715,/storage/emulated/0/DCIM/Screenshots/IMG_20210904_150030.jpg,image/jpeg,1080,1082,0,148997,,1637500987,1630760430000,0,0,0,0,,,,,,,,,,, +17149,2714,content://media/external/images/media/2714,/storage/emulated/0/DCIM/Screenshots/IMG_20210904_145936.jpg,image/jpeg,1080,611,0,122367,,1637500987,1630760376000,0,0,0,0,,,,,,,,,,, +17150,3155,content://media/external/images/media/3155,/storage/emulated/0/DCIM/Camera/IMG_20210904_135507.jpg,image/jpeg,1033,2582,0,963316,,1637502130,1630756507000,1630756488628,0,0,0,,,,,,,,,,, +17151,2759,content://media/external/images/media/2759,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-09-03-08-53-49-361_com.strava.jpg,image/jpeg,1080,2340,0,584562,,1637500987,1630652029000,0,0,0,0,,,,,,,,,,, +17152,7186,content://media/external/images/media/7186,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210902-WA0012.jpg",image/jpeg,1536,2048,0,384517,,1637518223,1630590780000,0,0,0,0,,,,,,,,,,, +17153,7064,content://media/external/images/media/7064,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210902-WA0011.jpg",image/jpeg,1600,900,0,178668,,1637518222,1630590779000,0,0,0,0,,,,,,,,,,, +17154,3589,content://media/external/images/media/3589,/storage/emulated/0/DCIM/Camera/IMG_20210901_170612.jpg,image/jpeg,2916,5184,0,3813342,,1637503154,1630508774000,1630508743887,0,0,0,,,,,,,,,,, +17155,4473,content://media/external/images/media/4473,/storage/emulated/0/DCIM/Camera/IMG_20210901_133041.jpg,image/jpeg,4160,2340,0,4235092,,1637505091,1630495845000,1630495845675,0,0,0,,,,,,,,,,, +17156,3270,content://media/external/images/media/3270,/storage/emulated/0/DCIM/Camera/IMG_20210901_132439.jpg,image/jpeg,4160,2340,90,4011793,,1637502342,1630495484000,1630495484336,0,0,0,,,,,,,,,,, +17157,4937,content://media/external/images/media/4937,/storage/emulated/0/DCIM/Camera/IMG_20210901_131642.jpg,image/jpeg,4160,2340,0,4430754,,1637506010,1630495009000,1630495009623,0,0,0,,,,,,,,,,, +17158,2791,content://media/external/images/media/2791,/storage/emulated/0/DCIM/Camera/IMG_20210831_172602.jpg,image/jpeg,4000,2250,90,3485294,,1637501282,1630423567000,1630423567381,0,0,0,,,,,,,,,,, +17159,6321,content://media/external/images/media/6321,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0014.jpg",image/jpeg,2048,1536,0,480317,,1637518221,1630315791000,0,0,0,0,,,,,,,,,,, +17160,7454,content://media/external/images/media/7454,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0013.jpg",image/jpeg,2048,1536,0,456568,,1637518223,1630315791000,0,0,0,0,,,,,,,,,,, +17161,7094,content://media/external/images/media/7094,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0012.jpg",image/jpeg,2048,1536,0,494982,,1637518222,1630315790000,0,0,0,0,,,,,,,,,,, +17162,7185,content://media/external/images/media/7185,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0011.jpg",image/jpeg,2048,1153,0,376141,,1637518223,1630315789000,0,0,0,0,,,,,,,,,,, +17163,7426,content://media/external/images/media/7426,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0010.jpg",image/jpeg,2048,1153,0,438995,,1637518223,1630315789000,0,0,0,0,,,,,,,,,,, +17164,7452,content://media/external/images/media/7452,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0008.jpg",image/jpeg,2048,1153,0,457996,,1637518223,1630315787000,0,0,0,0,,,,,,,,,,, +17165,7160,content://media/external/images/media/7160,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0007.jpg",image/jpeg,2048,1153,0,234916,,1637518222,1630315786000,0,0,0,0,,,,,,,,,,, +17166,7159,content://media/external/images/media/7159,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0005.jpg",image/jpeg,2048,1536,0,468403,,1637518222,1630315785000,0,0,0,0,,,,,,,,,,, +17167,7365,content://media/external/images/media/7365,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0004.jpg",image/jpeg,2048,1536,0,378656,,1637518223,1630315784000,0,0,0,0,,,,,,,,,,, +17168,7155,content://media/external/images/media/7155,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0001.jpg",image/jpeg,1536,2048,0,727128,,1637518222,1630305854000,0,0,0,0,,,,,,,,,,, +17169,7157,content://media/external/images/media/7157,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0000.jpg",image/jpeg,1536,2048,0,700098,,1637518222,1630305854000,0,0,0,0,,,,,,,,,,, +17170,7158,content://media/external/images/media/7158,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0002.jpg",image/jpeg,1536,2048,0,410271,,1637518222,1630305854000,0,0,0,0,,,,,,,,,,, +17171,4680,content://media/external/images/media/4680,/storage/emulated/0/DCIM/Camera/IMG_20210829_184632.jpg,image/jpeg,4000,2250,0,5194817,,1637505480,1630255595000,1630255595539,0,0,0,,,,,,,,,,, +17172,2654,content://media/external/images/media/2654,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-29-14-33-58-187_com.stt.android.suunto.jpg,image/jpeg,1080,2340,0,633514,,1637500871,1630240438000,0,0,0,0,,,,,,,,,,, +17173,4989,content://media/external/images/media/4989,/storage/emulated/0/DCIM/Camera/IMG_20210829_142823.jpg,image/jpeg,5184,2916,0,3625619,,1637506097,1630240105000,1630227244679,0,0,0,,,,,,,,,,, +17174,2713,content://media/external/images/media/2713,/storage/emulated/0/DCIM/Screenshots/IMG_20210829_142138.jpg,image/jpeg,1074,1695,0,303734,,1637500987,1630239698000,0,0,0,0,,,,,,,,,,, +17175,3011,content://media/external/images/media/3011,/storage/emulated/0/DCIM/Camera/IMG_20210829_105404.jpg,image/jpeg,5184,2916,0,4468393,,1637501786,1630227246000,1630227246841,0,0,0,,,,,,,,,,, +17176,2830,content://media/external/images/media/2830,/storage/emulated/0/DCIM/Camera/IMG_20210829_105353.jpg,image/jpeg,5184,2916,0,4561466,,1637501370,1630227237000,1630227237226,0,0,0,,,,,,,,,,, +17177,4006,content://media/external/images/media/4006,/storage/emulated/0/DCIM/Camera/IMG_20210829_105333.jpg,image/jpeg,4160,2340,0,5846949,,1637504086,1630227220000,1630227219510,0,0,0,,,,,,,,,,, +17178,2758,content://media/external/images/media/2758,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-27-15-44-09-039_de.komoot.android.jpg,image/jpeg,1080,2340,0,1461501,,1637500987,1630071849000,0,0,0,0,,,,,,,,,,, +17179,7364,content://media/external/images/media/7364,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210827-WA0000.jpg",image/jpeg,768,1024,0,78064,,1637518223,1630042550000,0,0,0,0,,,,,,,,,,, +17180,7589,content://media/external/images/media/7589,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210826-WA0007.jpg",image/jpeg,1536,2048,0,197692,,1637518223,1630006640000,0,0,0,0,,,,,,,,,,, +17181,3645,content://media/external/images/media/3645,/storage/emulated/0/DCIM/Camera/IMG_20210826_211130.jpg,image/jpeg,4160,2340,90,2980157,,1637503301,1630005091000,1630005090535,0,0,0,,,,,,,,,,, +17182,7425,content://media/external/images/media/7425,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210824-WA0001.jpg",image/jpeg,1200,1600,0,235905,,1637518223,1629781778000,0,0,0,0,,,,,,,,,,, +17183,7363,content://media/external/images/media/7363,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210824-WA0000.jpg",image/jpeg,1200,1600,0,204181,,1637518223,1629781777000,0,0,0,0,,,,,,,,,,, +17184,2641,content://media/external/images/media/2641,/storage/emulated/0/DCIM/Screenshots/IMG_20210823_221635.jpg,image/jpeg,1080,1652,0,269985,,1637500870,1629749795000,0,0,0,0,,,,,,,,,,, +17185,2712,content://media/external/images/media/2712,/storage/emulated/0/DCIM/Screenshots/IMG_20210820_174703.jpg,image/jpeg,1080,1358,0,109156,,1637500987,1629474423000,0,0,0,0,,,,,,,,,,, +17186,2711,content://media/external/images/media/2711,/storage/emulated/0/DCIM/Screenshots/IMG_20210820_174628.jpg,image/jpeg,1077,2038,0,459305,,1637500987,1629474388000,0,0,0,0,,,,,,,,,,, +17187,3830,content://media/external/images/media/3830,/storage/emulated/0/DCIM/Camera/IMG_20210820_140736.jpg,image/jpeg,4160,2340,90,4249676,,1637503630,1629461261000,1629461261230,0,0,0,,,,,,,,,,, +17188,4941,content://media/external/images/media/4941,/storage/emulated/0/DCIM/Camera/PANO_20210820_114137.jpg,image/jpeg,7568,3712,0,24673924,,1637506010,1629452503000,0,0,0,0,,,,,,,,,,, +17189,4253,content://media/external/images/media/4253,/storage/emulated/0/DCIM/Camera/PANO_20210820_100928.jpg,image/jpeg,7888,3776,0,23419825,,1637504734,1629446975000,0,0,0,0,,,,,,,,,,, +17190,3903,content://media/external/images/media/3903,/storage/emulated/0/DCIM/Camera/IMG_20210820_095734.jpg,image/jpeg,4160,2340,90,7715453,,1637503732,1629446261000,1629446260756,0,0,0,,,,,,,,,,, +17191,3098,content://media/external/images/media/3098,/storage/emulated/0/DCIM/Camera/PANO_20210820_091930.jpg,image/jpeg,7632,3776,0,22201318,,1637501971,1629443980000,0,0,0,0,,,,,,,,,,, +17192,7453,content://media/external/images/media/7453,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210818-WA0011.jpg",image/jpeg,901,1600,0,182195,,1637518223,1629307337000,0,0,0,0,,,,,,,,,,, +17193,4082,content://media/external/images/media/4082,/storage/emulated/0/DCIM/Camera/IMG_20210818_181006.jpg,image/jpeg,4000,2250,90,3583111,,1637504394,1629303009000,1629303009170,0,0,0,,,,,,,,,,, +17194,4988,content://media/external/images/media/4988,/storage/emulated/0/DCIM/Camera/IMG_20210818_120234.jpg,image/jpeg,4000,2250,0,6670884,,1637506097,1629280956000,1629280956470,0,0,0,,,,,,,,,,, +17195,3795,content://media/external/images/media/3795,/storage/emulated/0/DCIM/Camera/IMG_20210818_115703.jpg,image/jpeg,4000,2250,0,7443383,,1637503558,1629280626000,1629280626323,0,0,0,,,,,,,,,,, +17196,4956,content://media/external/images/media/4956,/storage/emulated/0/DCIM/Camera/IMG_20210818_082947.jpg,image/jpeg,4000,2250,0,6428763,,1637506015,1629268190000,1629268189801,0,0,0,,,,,,,,,,, +17197,3476,content://media/external/images/media/3476,/storage/emulated/0/DCIM/Camera/IMG_20210816_201230.jpg,image/jpeg,4000,2250,0,4389773,,1637502817,1629137552000,1629137552291,0,0,0,,,,,,,,,,, +17198,3388,content://media/external/images/media/3388,/storage/emulated/0/DCIM/Camera/IMG_20210816_201146.jpg,image/jpeg,4000,2250,90,3489236,,1637502523,1629137510000,1629137510641,0,0,0,,,,,,,,,,, +17199,7494,content://media/external/images/media/7494,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210816-WA0011.jpg",image/jpeg,2048,1536,0,527020,,1637518223,1629129343000,0,0,0,0,,,,,,,,,,, +17200,3325,content://media/external/images/media/3325,/storage/emulated/0/DCIM/Camera/IMG_20210815_175925.jpg,image/jpeg,4000,2250,0,3899611,,1637502438,1629043170000,1629043170154,0,0,0,,,,,,,,,,, +17201,4044,content://media/external/images/media/4044,/storage/emulated/0/DCIM/Camera/IMG_20210815_130946.jpg,image/jpeg,4000,2250,0,4810253,,1637504234,1629025788000,1629025788474,0,0,0,,,,,,,,,,, +17202,3118,content://media/external/images/media/3118,/storage/emulated/0/DCIM/Camera/IMG_20210815_130941.jpg,image/jpeg,4000,2250,0,5087345,,1637502054,1629025783000,1629025783307,0,0,0,,,,,,,,,,, +17203,3035,content://media/external/images/media/3035,/storage/emulated/0/DCIM/Camera/IMG_20210815_130931.jpg,image/jpeg,4000,2250,90,4934404,,1637501805,1629025775000,1629025775480,0,0,0,,,,,,,,,,, +17204,4472,content://media/external/images/media/4472,/storage/emulated/0/DCIM/Camera/IMG_20210815_130927.jpg,image/jpeg,4000,2250,0,5329432,,1637505091,1629025768000,1629025772321,0,0,0,,,,,,,,,,, +17205,3928,content://media/external/images/media/3928,/storage/emulated/0/DCIM/Camera/IMG_20210815_080123.jpg,image/jpeg,4000,2250,0,2618622,,1637503834,1629007285000,1629007285421,0,0,0,,,,,,,,,,, +17206,2866,content://media/external/images/media/2866,/storage/emulated/0/DCIM/Camera/IMG_20210813_144114.jpg,image/jpeg,1259,642,0,248289,,1637501458,1628858475000,1628858074884,0,0,0,,,,,,,,,,, +17207,3778,content://media/external/images/media/3778,/storage/emulated/0/DCIM/Camera/IMG_20210813_143432.jpg,image/jpeg,4000,2250,180,3602526,,1637503508,1628858075000,1628858074884,0,0,0,,,,,,,,,,, +17208,2555,content://media/external/images/media/2555,/storage/emulated/0/Android/services/picto_services_2461.png,image/png,90,90,0,5058,,1637500783,1628761180000,0,0,0,0,,,,,,,,,,, +17209,2522,content://media/external/images/media/2522,/storage/emulated/0/Android/nearby/picto_nearby_100.png,image/png,90,90,0,4129,,1637500783,1628761179000,0,0,0,0,,,,,,,,,,, +17210,2537,content://media/external/images/media/2537,/storage/emulated/0/Android/nearby/picto_nearby_33.png,image/png,90,90,0,5745,,1637500783,1628761179000,0,0,0,0,,,,,,,,,,, +17211,2538,content://media/external/images/media/2538,/storage/emulated/0/Android/nearby/picto_nearby_37.png,image/png,90,90,0,4592,,1637500783,1628761179000,0,0,0,0,,,,,,,,,,, +17212,2547,content://media/external/images/media/2547,/storage/emulated/0/Android/services/picto_services_11.png,image/png,90,90,0,3075,,1637500783,1628761179000,0,0,0,0,,,,,,,,,,, +17213,2540,content://media/external/images/media/2540,/storage/emulated/0/Android/nearby/picto_nearby_43.png,image/png,90,90,0,5059,,1637500783,1628761158000,0,0,0,0,,,,,,,,,,, +17214,2523,content://media/external/images/media/2523,/storage/emulated/0/Android/nearby/picto_nearby_103.png,image/png,90,90,0,4178,,1637500783,1628761157000,0,0,0,0,,,,,,,,,,, +17215,2529,content://media/external/images/media/2529,/storage/emulated/0/Android/nearby/picto_nearby_174.png,image/png,90,90,0,4747,,1637500783,1628761157000,0,0,0,0,,,,,,,,,,, +17216,2530,content://media/external/images/media/2530,/storage/emulated/0/Android/nearby/picto_nearby_20.png,image/png,90,90,0,3362,,1637500783,1628761157000,0,0,0,0,,,,,,,,,,, +17217,2548,content://media/external/images/media/2548,/storage/emulated/0/Android/services/picto_services_12.png,image/png,90,90,0,3674,,1637500783,1628761157000,0,0,0,0,,,,,,,,,,, +17218,2549,content://media/external/images/media/2549,/storage/emulated/0/Android/services/picto_services_14.png,image/png,90,90,0,4289,,1637500783,1628761157000,0,0,0,0,,,,,,,,,,, +17219,2550,content://media/external/images/media/2550,/storage/emulated/0/Android/services/picto_services_15.png,image/png,90,90,0,3259,,1637500783,1628761157000,0,0,0,0,,,,,,,,,,, +17220,2551,content://media/external/images/media/2551,/storage/emulated/0/Android/services/picto_services_1624.png,image/png,90,90,0,4153,,1637500783,1628761157000,0,0,0,0,,,,,,,,,,, +17221,2552,content://media/external/images/media/2552,/storage/emulated/0/Android/services/picto_services_1731.png,image/png,90,90,0,4515,,1637500783,1628761157000,0,0,0,0,,,,,,,,,,, +17222,2556,content://media/external/images/media/2556,/storage/emulated/0/Android/services/picto_services_64.png,image/png,90,90,0,3704,,1637500783,1628761157000,0,0,0,0,,,,,,,,,,, +17223,2558,content://media/external/images/media/2558,/storage/emulated/0/Android/tarifs/picto_tarifs_1320.png,image/png,90,90,0,4101,,1637500783,1628761157000,0,0,0,0,,,,,,,,,,, +17224,2536,content://media/external/images/media/2536,/storage/emulated/0/Android/nearby/picto_nearby_32.png,image/png,90,90,0,3217,,1637500783,1628761156000,0,0,0,0,,,,,,,,,,, +17225,2539,content://media/external/images/media/2539,/storage/emulated/0/Android/nearby/picto_nearby_40.png,image/png,90,90,0,3450,,1637500783,1628761156000,0,0,0,0,,,,,,,,,,, +17226,2541,content://media/external/images/media/2541,/storage/emulated/0/Android/nearby/picto_nearby_55.png,image/png,90,90,0,4657,,1637500783,1628761156000,0,0,0,0,,,,,,,,,,, +17227,2544,content://media/external/images/media/2544,/storage/emulated/0/Android/nearby/picto_nearby_89.png,image/png,90,90,0,3700,,1637500783,1628761156000,0,0,0,0,,,,,,,,,,, +17228,2553,content://media/external/images/media/2553,/storage/emulated/0/Android/services/picto_services_18.png,image/png,90,90,0,3320,,1637500783,1628761156000,0,0,0,0,,,,,,,,,,, +17229,2524,content://media/external/images/media/2524,/storage/emulated/0/Android/nearby/picto_nearby_110.png,image/png,90,90,0,6084,,1637500783,1628761127000,0,0,0,0,,,,,,,,,,, +17230,2525,content://media/external/images/media/2525,/storage/emulated/0/Android/nearby/picto_nearby_122.png,image/png,90,90,0,6442,,1637500783,1628761126000,0,0,0,0,,,,,,,,,,, +17231,2526,content://media/external/images/media/2526,/storage/emulated/0/Android/nearby/picto_nearby_158.png,image/png,90,90,0,4153,,1637500783,1628761126000,0,0,0,0,,,,,,,,,,, +17232,2527,content://media/external/images/media/2527,/storage/emulated/0/Android/nearby/picto_nearby_1589.png,image/png,90,90,0,5885,,1637500783,1628761126000,0,0,0,0,,,,,,,,,,, +17233,2528,content://media/external/images/media/2528,/storage/emulated/0/Android/nearby/picto_nearby_1634.png,image/png,90,90,0,5711,,1637500783,1628761126000,0,0,0,0,,,,,,,,,,, +17234,2531,content://media/external/images/media/2531,/storage/emulated/0/Android/nearby/picto_nearby_21.png,image/png,90,90,0,4016,,1637500783,1628761126000,0,0,0,0,,,,,,,,,,, +17235,2532,content://media/external/images/media/2532,/storage/emulated/0/Android/nearby/picto_nearby_2174.png,image/png,90,90,0,5711,,1637500783,1628761126000,0,0,0,0,,,,,,,,,,, +17236,2533,content://media/external/images/media/2533,/storage/emulated/0/Android/nearby/picto_nearby_23.png,image/png,90,90,0,3455,,1637500783,1628761126000,0,0,0,0,,,,,,,,,,, +17237,2534,content://media/external/images/media/2534,/storage/emulated/0/Android/nearby/picto_nearby_2313.png,image/png,90,90,0,5711,,1637500783,1628761126000,0,0,0,0,,,,,,,,,,, +17238,2535,content://media/external/images/media/2535,/storage/emulated/0/Android/nearby/picto_nearby_25.png,image/png,90,90,0,3726,,1637500783,1628761126000,0,0,0,0,,,,,,,,,,, +17239,2542,content://media/external/images/media/2542,/storage/emulated/0/Android/nearby/picto_nearby_58.png,image/png,90,90,0,3208,,1637500783,1628761126000,0,0,0,0,,,,,,,,,,, +17240,2543,content://media/external/images/media/2543,/storage/emulated/0/Android/nearby/picto_nearby_74.png,image/png,90,90,0,4219,,1637500783,1628761126000,0,0,0,0,,,,,,,,,,, +17241,2545,content://media/external/images/media/2545,/storage/emulated/0/Android/nearby/picto_nearby_90.png,image/png,90,90,0,4123,,1637500783,1628761126000,0,0,0,0,,,,,,,,,,, +17242,2554,content://media/external/images/media/2554,/storage/emulated/0/Android/services/picto_services_2198.png,image/png,90,90,0,5711,,1637500783,1628761125000,0,0,0,0,,,,,,,,,,, +17243,2567,content://media/external/images/media/2567,/storage/emulated/0/offlineSearch/ac_city.png,image/png,90,90,0,2204,,1637500783,1628761096000,0,0,0,0,,,,,,,,,,, +17244,7220,content://media/external/images/media/7220,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0022.jpg",image/jpeg,1200,1600,0,439004,,1637518223,1628682979000,0,0,0,0,,,,,,,,,,, +17245,7588,content://media/external/images/media/7588,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0020.jpg",image/jpeg,1200,1600,0,396967,,1637518223,1628682873000,0,0,0,0,,,,,,,,,,, +17246,7587,content://media/external/images/media/7587,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0019.jpg",image/jpeg,1600,1200,0,384380,,1637518223,1628682872000,0,0,0,0,,,,,,,,,,, +17247,6320,content://media/external/images/media/6320,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0018.jpg",image/jpeg,1600,1200,0,416386,,1637518221,1628682871000,0,0,0,0,,,,,,,,,,, +17248,7121,content://media/external/images/media/7121,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0017.jpg",image/jpeg,1600,1200,0,437496,,1637518222,1628682870000,0,0,0,0,,,,,,,,,,, +17249,7095,content://media/external/images/media/7095,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0016.jpg",image/jpeg,1600,1200,0,152467,,1637518222,1628682869000,0,0,0,0,,,,,,,,,,, +17250,7093,content://media/external/images/media/7093,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0015.jpg",image/jpeg,1600,1200,0,307330,,1637518222,1628682868000,0,0,0,0,,,,,,,,,,, +17251,6319,content://media/external/images/media/6319,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0014.jpg",image/jpeg,1200,1600,0,217301,,1637518221,1628682867000,0,0,0,0,,,,,,,,,,, +17252,7120,content://media/external/images/media/7120,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0010.jpg",image/jpeg,1600,1200,0,625201,,1637518222,1628677884000,0,0,0,0,,,,,,,,,,, +17253,7546,content://media/external/images/media/7546,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0009.jpg",image/jpeg,1600,1200,0,448526,,1637518223,1628677874000,0,0,0,0,,,,,,,,,,, +17254,7265,content://media/external/images/media/7265,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0008.jpg",image/jpeg,1024,768,0,202666,,1637518223,1628677866000,0,0,0,0,,,,,,,,,,, +17255,7586,content://media/external/images/media/7586,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0007.jpg",image/jpeg,768,1024,0,197072,,1637518223,1628677864000,0,0,0,0,,,,,,,,,,, +17256,7092,content://media/external/images/media/7092,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0006.jpg",image/jpeg,768,1024,0,192539,,1637518222,1628677863000,0,0,0,0,,,,,,,,,,, +17257,7091,content://media/external/images/media/7091,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0005.jpg",image/jpeg,1024,768,0,167569,,1637518222,1628677862000,0,0,0,0,,,,,,,,,,, +17258,7424,content://media/external/images/media/7424,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0022.jpg",image/jpeg,1200,1600,0,346358,,1637518223,1628582255000,0,0,0,0,,,,,,,,,,, +17259,7119,content://media/external/images/media/7119,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0021.jpg",image/jpeg,1200,1600,0,362239,,1637518222,1628582254000,0,0,0,0,,,,,,,,,,, +17260,7156,content://media/external/images/media/7156,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0020.jpg",image/jpeg,1200,1600,0,376053,,1637518222,1628582253000,0,0,0,0,,,,,,,,,,, +17261,6318,content://media/external/images/media/6318,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0019.jpg",image/jpeg,1200,1600,0,380261,,1637518221,1628582252000,0,0,0,0,,,,,,,,,,, +17262,7312,content://media/external/images/media/7312,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0018.jpg",image/jpeg,1200,1600,0,351746,,1637518223,1628582251000,0,0,0,0,,,,,,,,,,, +17263,7090,content://media/external/images/media/7090,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0017.jpg",image/jpeg,1200,1600,0,374427,,1637518222,1628582250000,0,0,0,0,,,,,,,,,,, +17264,7313,content://media/external/images/media/7313,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0016.jpg",image/jpeg,1200,1600,0,384821,,1637518223,1628582249000,0,0,0,0,,,,,,,,,,, +17265,7264,content://media/external/images/media/7264,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0015.jpg",image/jpeg,1200,1600,0,387003,,1637518223,1628582248000,0,0,0,0,,,,,,,,,,, +17266,7219,content://media/external/images/media/7219,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0014.jpg",image/jpeg,1500,2000,0,615528,,1637518223,1628582247000,0,0,0,0,,,,,,,,,,, +17267,7362,content://media/external/images/media/7362,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0013.jpg",image/jpeg,1500,2000,0,592614,,1637518223,1628582246000,0,0,0,0,,,,,,,,,,, +17268,7545,content://media/external/images/media/7545,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0012.jpg",image/jpeg,1520,2048,0,370557,,1637518223,1628582245000,0,0,0,0,,,,,,,,,,, +17269,7423,content://media/external/images/media/7423,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0011.jpg",image/jpeg,1500,2000,0,721427,,1637518223,1628582243000,0,0,0,0,,,,,,,,,,, +17270,7361,content://media/external/images/media/7361,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0010.jpg",image/jpeg,1500,2000,0,704200,,1637518223,1628582242000,0,0,0,0,,,,,,,,,,, +17271,7311,content://media/external/images/media/7311,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0009.jpg",image/jpeg,1500,2000,0,711457,,1637518223,1628582241000,0,0,0,0,,,,,,,,,,, +17272,7118,content://media/external/images/media/7118,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0008.jpg",image/jpeg,1500,2000,0,715786,,1637518222,1628582239000,0,0,0,0,,,,,,,,,,, +17273,7360,content://media/external/images/media/7360,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0007.jpg",image/jpeg,2048,1520,0,293792,,1637518223,1628582238000,0,0,0,0,,,,,,,,,,, +17274,7495,content://media/external/images/media/7495,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0006.jpg",image/jpeg,1500,2000,0,688181,,1637518223,1628582237000,0,0,0,0,,,,,,,,,,, +17275,7218,content://media/external/images/media/7218,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0005.jpg",image/jpeg,1600,1200,0,175121,,1637518223,1628582236000,0,0,0,0,,,,,,,,,,, +17276,7544,content://media/external/images/media/7544,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0003.jpg",image/jpeg,1536,2048,0,692293,,1637518223,1628576839000,0,0,0,0,,,,,,,,,,, +17277,7451,content://media/external/images/media/7451,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0002.jpg",image/jpeg,1536,2048,0,774960,,1637518223,1628576837000,0,0,0,0,,,,,,,,,,, +17278,7543,content://media/external/images/media/7543,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0001.jpg",image/jpeg,1536,2048,0,702918,,1637518223,1628576835000,0,0,0,0,,,,,,,,,,, +17279,7089,content://media/external/images/media/7089,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0000.jpg",image/jpeg,2048,1536,0,977771,,1637518222,1628576834000,0,0,0,0,,,,,,,,,,, +17280,3630,content://media/external/images/media/3630,/storage/emulated/0/DCIM/Camera/IMG_20210810_073329.jpg,image/jpeg,4000,2250,90,5614096,,1637503272,1628573613000,1628573613480,0,0,0,,,,,,,,,,, +17281,3154,content://media/external/images/media/3154,/storage/emulated/0/DCIM/Camera/IMG_20210810_073225.jpg,image/jpeg,4000,2250,0,5078332,,1637502130,1628573548000,1628573548466,0,0,0,,,,,,,,,,, +17282,7184,content://media/external/images/media/7184,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210809-WA0002.jpg",image/jpeg,898,1600,0,208266,,1637518223,1628531397000,0,0,0,0,,,,,,,,,,, +17283,2757,content://media/external/images/media/2757,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-08-15-14-10-804_com.strava.jpg,image/jpeg,1080,2340,0,855366,,1637500987,1628428451000,0,0,0,0,,,,,,,,,,, +17284,2756,content://media/external/images/media/2756,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-08-14-37-51-662_com.brytonsport.active.jpg,image/jpeg,1080,2340,0,523821,,1637500987,1628426271000,0,0,0,0,,,,,,,,,,, +17285,3947,content://media/external/images/media/3947,/storage/emulated/0/DCIM/Camera/IMG_20210808_081610.jpg,image/jpeg,4000,2250,0,4209222,,1637503853,1628403372000,1628403372637,0,0,0,,,,,,,,,,, +17286,4291,content://media/external/images/media/4291,/storage/emulated/0/DCIM/Camera/IMG_20210808_081556.jpg,image/jpeg,4000,2250,0,3358575,,1637504808,1628403361000,1628403361377,0,0,0,,,,,,,,,,, +17287,2755,content://media/external/images/media/2755,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-07-13-10-09-898_com.strava.jpg,image/jpeg,1080,2340,0,528558,,1637500987,1628334610000,0,0,0,0,,,,,,,,,,, +17288,3794,content://media/external/images/media/3794,/storage/emulated/0/DCIM/Camera/IMG_20210807_092208.jpg,image/jpeg,4000,2250,0,4482364,,1637503558,1628320930000,1628320930061,0,0,0,,,,,,,,,,, +17289,4422,content://media/external/images/media/4422,/storage/emulated/0/DCIM/Camera/IMG_20210807_091725.jpg,image/jpeg,4000,2250,0,4775489,,1637505063,1628320648000,1628320648513,0,0,0,,,,,,,,,,, +17290,4918,content://media/external/images/media/4918,/storage/emulated/0/DCIM/Camera/IMG_20210806_191501.jpg,image/jpeg,4000,2250,0,2994010,,1637505944,1628270103000,1628270102951,0,0,0,,,,,,,,,,, +17291,3350,content://media/external/images/media/3350,/storage/emulated/0/DCIM/Camera/IMG_20210805_085026.jpg,image/jpeg,4000,2250,0,3203232,,1637502439,1628146227000,1628146227755,0,0,0,,,,,,,,,,, +17292,3555,content://media/external/images/media/3555,/storage/emulated/0/DCIM/Camera/IMG_20210805_085016.jpg,image/jpeg,4000,2250,0,3311677,,1637503058,1628146218000,1628146218055,0,0,0,,,,,,,,,,, +17293,3034,content://media/external/images/media/3034,/storage/emulated/0/DCIM/Camera/IMG_20210805_085001.jpg,image/jpeg,4000,2250,0,3773247,,1637501805,1628146205000,1628146204175,0,0,0,,,,,,,,,,, +17294,2637,content://media/external/images/media/2637,/storage/emulated/0/DCIM/PlantNet/2021-08-04T22_01_19+02_00.JPEG,image/jpeg,4000,3000,90,2158517,,1637500870,1628107279000,1628107276219,0,0,0,,,,,,,,,,, +17295,2636,content://media/external/images/media/2636,/storage/emulated/0/DCIM/PlantNet/2021-08-04T22_00_00+02_00.JPEG,image/jpeg,4000,3000,90,4922986,,1637500870,1628107200000,1628107193930,0,0,0,,,,,,,,,,, +17296,2754,content://media/external/images/media/2754,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-03-14-59-27-525_com.miui.gallery.jpg,image/jpeg,1080,2340,0,179005,,1637500987,1627995567000,0,0,0,0,,,,,,,,,,, +17297,2710,content://media/external/images/media/2710,/storage/emulated/0/DCIM/Screenshots/IMG_20210803_145857.jpg,image/jpeg,1037,844,0,79146,,1637500987,1627995537000,0,0,0,0,,,,,,,,,,, +17298,2640,content://media/external/images/media/2640,/storage/emulated/0/DCIM/Screenshots/IMG_20210803_075113.jpg,image/jpeg,1075,1041,0,114078,,1637500870,1627969873000,0,0,0,0,,,,,,,,,,, +17299,2639,content://media/external/images/media/2639,/storage/emulated/0/DCIM/Screenshots/IMG_20210803_075039.jpg,image/jpeg,1072,1290,0,418911,,1637500870,1627969839000,0,0,0,0,,,,,,,,,,, +17300,2753,content://media/external/images/media/2753,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-03-07-49-51-860_com.stt.android.suunto.jpg,image/jpeg,1080,2340,0,288082,,1637500987,1627969792000,0,0,0,0,,,,,,,,,,, +17301,2709,content://media/external/images/media/2709,/storage/emulated/0/DCIM/Screenshots/IMG_20210802_083956.jpg,image/jpeg,1062,1527,0,351626,,1637500987,1627886396000,0,0,0,0,,,,,,,,,,, +17302,2752,content://media/external/images/media/2752,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-02-08-39-07-791_com.strava.jpg,image/jpeg,1080,2340,0,694030,,1637500987,1627886347000,0,0,0,0,,,,,,,,,,, +17303,7493,content://media/external/images/media/7493,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210801-WA0002.jpg",image/jpeg,1536,2048,0,195624,,1637518223,1627803108000,0,0,0,0,,,,,,,,,,, +17304,2816,content://media/external/images/media/2816,/storage/emulated/0/DCIM/Camera/IMG_20210731_194436.jpg,image/jpeg,4000,2250,90,1395356,,1637501312,1627753479000,1627753478948,0,0,0,,,,,,,,,,, +17305,3253,content://media/external/images/media/3253,/storage/emulated/0/DCIM/Camera/IMG_20210731_192540.jpg,image/jpeg,4000,2250,0,1742178,,1637502259,1627752341000,1627752341347,0,0,0,,,,,,,,,,, +17306,4803,content://media/external/images/media/4803,/storage/emulated/0/DCIM/Camera/IMG_20210731_192538.jpg,image/jpeg,4000,2250,0,1745887,,1637505663,1627752339000,1627752339876,0,0,0,,,,,,,,,,, +17307,3522,content://media/external/images/media/3522,/storage/emulated/0/DCIM/Camera/IMG_20210731_192351.jpg,image/jpeg,4000,2250,0,1702871,,1637502970,1627752233000,1627752233396,0,0,0,,,,,,,,,,, +17308,4124,content://media/external/images/media/4124,/storage/emulated/0/DCIM/Camera/IMG_20210731_192337.jpg,image/jpeg,4000,2250,0,3381397,,1637504451,1627752220000,1627752220594,0,0,0,,,,,,,,,,, +17309,7183,content://media/external/images/media/7183,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210731-WA0012.jpg",image/jpeg,1536,2048,0,354581,,1637518223,1627751974000,0,0,0,0,,,,,,,,,,, +17310,6317,content://media/external/images/media/6317,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210726-WA0018.jpg",image/jpeg,1536,2048,0,190700,,1637518221,1627327342000,0,0,0,0,,,,,,,,,,, +17311,3854,content://media/external/images/media/3854,/storage/emulated/0/DCIM/Camera/IMG_20210726_184901.jpg,image/jpeg,4000,2250,0,2651437,,1637503642,1627318145000,1627318145132,0,0,0,,,,,,,,,,, +17312,4720,content://media/external/images/media/4720,/storage/emulated/0/DCIM/Camera/IMG_20210725_150753.jpg,image/jpeg,4000,2250,0,2688725,,1637505565,1627218474000,1627218447550,0,0,0,,,,,,,,,,, +17313,3213,content://media/external/images/media/3213,/storage/emulated/0/DCIM/Camera/IMG_20210725_150637.jpg,image/jpeg,4000,2250,90,2397700,,1637502256,1627218399000,1627218399385,0,0,0,,,,,,,,,,, +17314,3961,content://media/external/images/media/3961,/storage/emulated/0/DCIM/Camera/IMG_20210725_150601.jpg,image/jpeg,4000,2250,0,2685201,,1637503942,1627218361000,1627218324560,0,0,0,,,,,,,,,,, +17315,3387,content://media/external/images/media/3387,/storage/emulated/0/DCIM/Camera/IMG_20210724_120047.jpg,image/jpeg,4000,2250,90,4231364,,1637502523,1627120852000,1627120852071,0,0,0,,,,,,,,,,, +17316,4636,content://media/external/images/media/4636,/storage/emulated/0/DCIM/Camera/IMG_20210724_120007.jpg,image/jpeg,4000,2250,0,3741544,,1637505390,1627120809000,1627120809442,0,0,0,,,,,,,,,,, +17317,3076,content://media/external/images/media/3076,/storage/emulated/0/DCIM/Camera/IMG_20210722_162217.jpg,image/jpeg,4160,2340,90,4793012,,1637501905,1626963746000,1626963746436,0,0,0,,,,,,,,,,, +17318,3714,content://media/external/images/media/3714,/storage/emulated/0/DCIM/Camera/IMG_20210720_193438.jpg,image/jpeg,4000,2250,0,4685708,,1637503393,1626802482000,1626802481681,0,0,0,,,,,,,,,,, +17319,2629,content://media/external/images/media/2629,/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786468044.jpg,image/jpeg,1079,720,0,67827,,1637500870,1626786468000,0,0,0,0,,,,,,,,,,, +17320,2628,content://media/external/images/media/2628,/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786457385.jpg,image/jpeg,1079,720,0,59367,,1637500870,1626786457000,0,0,0,0,,,,,,,,,,, +17321,2627,content://media/external/images/media/2627,/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786400784.jpg,image/jpeg,1079,720,0,54367,,1637500870,1626786400000,0,0,0,0,,,,,,,,,,, +17322,2626,content://media/external/images/media/2626,/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786395070.jpg,image/jpeg,1080,516,0,66095,,1637500870,1626786395000,0,0,0,0,,,,,,,,,,, +17323,2625,content://media/external/images/media/2625,/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786360083.jpg,image/jpeg,1080,487,0,64299,,1637500870,1626786360000,0,0,0,0,,,,,,,,,,, +17324,2624,content://media/external/images/media/2624,/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786356869.jpg,image/jpeg,1080,561,0,69211,,1637500870,1626786356000,0,0,0,0,,,,,,,,,,, +17325,2623,content://media/external/images/media/2623,/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786354371.jpg,image/jpeg,1080,542,0,65310,,1637500870,1626786354000,0,0,0,0,,,,,,,,,,, +17326,2622,content://media/external/images/media/2622,/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786321974.jpg,image/jpeg,1079,720,0,78552,,1637500870,1626786322000,0,0,0,0,,,,,,,,,,, +17327,2621,content://media/external/images/media/2621,/storage/emulated/0/DCIM/Facebook/FB_IMG_1626784990030.jpg,image/jpeg,1079,720,0,88118,,1637500870,1626784990000,0,0,0,0,,,,,,,,,,, +17328,2620,content://media/external/images/media/2620,/storage/emulated/0/DCIM/Facebook/FB_IMG_1626784981067.jpg,image/jpeg,1079,720,0,50201,,1637500870,1626784981000,0,0,0,0,,,,,,,,,,, +17329,2619,content://media/external/images/media/2619,/storage/emulated/0/DCIM/Facebook/FB_IMG_1626784972521.jpg,image/jpeg,1079,720,0,86307,,1637500870,1626784972000,0,0,0,0,,,,,,,,,,, +17330,2618,content://media/external/images/media/2618,/storage/emulated/0/DCIM/Facebook/FB_IMG_1626784969026.jpg,image/jpeg,1079,720,0,86472,,1637500870,1626784969000,0,0,0,0,,,,,,,,,,, +17331,7585,content://media/external/images/media/7585,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0028.jpg",image/jpeg,750,1334,0,87192,,1637518223,1626783689000,0,0,0,0,,,,,,,,,,, +17332,6316,content://media/external/images/media/6316,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0018.jpg",image/jpeg,1536,2048,0,471906,,1637518221,1626741582000,0,0,0,0,,,,,,,,,,, +17333,7153,content://media/external/images/media/7153,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0016.jpg",image/jpeg,2048,1536,0,496685,,1637518222,1626741581000,0,0,0,0,,,,,,,,,,, +17334,7154,content://media/external/images/media/7154,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0017.jpg",image/jpeg,2048,1536,0,497273,,1637518222,1626741581000,0,0,0,0,,,,,,,,,,, +17335,7088,content://media/external/images/media/7088,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0015.jpg",image/jpeg,2048,1536,0,518927,,1637518222,1626741580000,0,0,0,0,,,,,,,,,,, +17336,7584,content://media/external/images/media/7584,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0014.jpg",image/jpeg,2048,1536,0,498750,,1637518223,1626741579000,0,0,0,0,,,,,,,,,,, +17337,7087,content://media/external/images/media/7087,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0013.jpg",image/jpeg,2048,1536,0,435024,,1637518222,1626741578000,0,0,0,0,,,,,,,,,,, +17338,7310,content://media/external/images/media/7310,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0012.jpg",image/jpeg,2048,1536,0,491427,,1637518223,1626741578000,0,0,0,0,,,,,,,,,,, +17339,7217,content://media/external/images/media/7217,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0011.jpg",image/jpeg,2048,1536,0,529173,,1637518223,1626741577000,0,0,0,0,,,,,,,,,,, +17340,7216,content://media/external/images/media/7216,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0010.jpg",image/jpeg,2048,1536,0,519851,,1637518223,1626741576000,0,0,0,0,,,,,,,,,,, +17341,6314,content://media/external/images/media/6314,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0009.jpg",image/jpeg,1536,2048,0,456695,,1637518221,1626741575000,0,0,0,0,,,,,,,,,,, +17342,6315,content://media/external/images/media/6315,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0008.jpg",image/jpeg,1536,2048,0,458018,,1637518221,1626741573000,0,0,0,0,,,,,,,,,,, +17343,7263,content://media/external/images/media/7263,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0007.jpg",image/jpeg,2048,1536,0,370809,,1637518223,1626741486000,0,0,0,0,,,,,,,,,,, +17344,7583,content://media/external/images/media/7583,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0006.jpg",image/jpeg,2048,1536,0,317948,,1637518223,1626741485000,0,0,0,0,,,,,,,,,,, +17345,7182,content://media/external/images/media/7182,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0005.jpg",image/jpeg,2048,1536,0,307061,,1637518223,1626741484000,0,0,0,0,,,,,,,,,,, +17346,7262,content://media/external/images/media/7262,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0004.jpg",image/jpeg,2048,1536,0,332058,,1637518223,1626741483000,0,0,0,0,,,,,,,,,,, +17347,4987,content://media/external/images/media/4987,/storage/emulated/0/DCIM/Camera/IMG_20210720_003027.jpg,image/jpeg,4000,2250,0,3916983,,1637506097,1626733830000,1626733830028,0,0,0,,,,,,,,,,, +17348,4005,content://media/external/images/media/4005,/storage/emulated/0/DCIM/Camera/IMG_20210712_184122.jpg,image/jpeg,4000,2250,0,4278389,,1637504086,1626108084000,1626108084387,0,0,0,,,,,,,,,,, +17349,4026,content://media/external/images/media/4026,/storage/emulated/0/DCIM/Camera/PANO_20210711_160342.jpg,image/jpeg,8528,3744,0,21877666,,1637504201,1626012231000,0,0,0,0,,,,,,,,,,, +17350,4191,content://media/external/images/media/4191,/storage/emulated/0/DCIM/Camera/IMG_20210711_160332.jpg,image/jpeg,4160,2340,0,4673958,,1637504558,1626012214000,1626012214681,0,0,0,,,,,,,,,,, +17351,3269,content://media/external/images/media/3269,/storage/emulated/0/DCIM/Camera/IMG_20210711_160325.jpg,image/jpeg,4160,2340,0,4602509,,1637502342,1626012211000,1626012211305,0,0,0,,,,,,,,,,, +17352,4849,content://media/external/images/media/4849,/storage/emulated/0/DCIM/Camera/IMG_20210710_204916.jpg,image/jpeg,4000,2250,90,1448694,,1637505753,1625942958000,1625942958014,0,0,0,,,,,,,,,,, +17353,2814,content://media/external/images/media/2814,/storage/emulated/0/DCIM/Camera/IMG_20210710_204639.jpg,image/jpeg,4000,2250,90,1964295,,1637501312,1625942803000,1625942802855,0,0,0,,,,,,,,,,, +17354,4103,content://media/external/images/media/4103,/storage/emulated/0/DCIM/Camera/IMG_20210710_203559.jpg,image/jpeg,4000,2250,0,4088660,,1637504400,1625942161000,1625942161801,0,0,0,,,,,,,,,,, +17355,4231,content://media/external/images/media/4231,/storage/emulated/0/DCIM/Camera/IMG_20210708_181815.jpg,image/jpeg,4000,2250,90,5045693,,1637504726,1625761098000,1625761098240,0,0,0,,,,,,,,,,, +17356,4740,content://media/external/images/media/4740,/storage/emulated/0/DCIM/Camera/IMG_20210706_194117.jpg,image/jpeg,4160,2340,0,4545085,,1637505574,1625593280000,1625593279764,0,0,0,,,,,,,,,,, +17357,4358,content://media/external/images/media/4358,/storage/emulated/0/DCIM/Camera/IMG_20210706_193958.jpg,image/jpeg,4160,2340,0,6764696,,1637504970,1625593206000,1625593205629,0,0,0,,,,,,,,,,, +17358,4365,content://media/external/images/media/4365,/storage/emulated/0/DCIM/Camera/PANO_20210706_193858.jpg,image/jpeg,8976,3584,0,31790400,,1637504970,1625593145000,0,0,0,0,,,,,,,,,,, +17359,4726,content://media/external/images/media/4726,/storage/emulated/0/DCIM/Camera/PANO_20210706_193837.jpg,image/jpeg,6640,3584,0,23079435,,1637505565,1625593124000,0,0,0,0,,,,,,,,,,, +17360,4249,content://media/external/images/media/4249,/storage/emulated/0/DCIM/Camera/IMG_20210706_174743.jpg,image/jpeg,4000,2250,90,3720248,,1637504734,1625586468000,1625586468362,0,0,0,,,,,,,,,,, +17361,2617,content://media/external/images/media/2617,/storage/emulated/0/DCIM/Facebook/FB_IMG_1625521144640.jpg,image/jpeg,960,581,0,57135,,1637500870,1625521144000,0,0,0,0,,,,,,,,,,, +17362,2616,content://media/external/images/media/2616,/storage/emulated/0/DCIM/Facebook/FB_IMG_1625509616896.jpg,image/jpeg,960,720,0,84069,,1637500870,1625509616000,0,0,0,0,,,,,,,,,,, +17363,2615,content://media/external/images/media/2615,/storage/emulated/0/DCIM/Facebook/FB_IMG_1625509609173.jpg,image/jpeg,960,720,0,71895,,1637500870,1625509609000,0,0,0,0,,,,,,,,,,, +17364,6313,content://media/external/images/media/6313,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210705-WA0004.jpg",image/jpeg,960,581,0,65590,,1637518221,1625463756000,0,0,0,0,,,,,,,,,,, +17365,7422,content://media/external/images/media/7422,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210705-WA0003.jpg",image/jpeg,960,712,0,96161,,1637518223,1625463756000,0,0,0,0,,,,,,,,,,, +17366,7086,content://media/external/images/media/7086,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210705-WA0000.jpg",image/jpeg,1536,2048,0,378976,,1637518222,1625441375000,0,0,0,0,,,,,,,,,,, +17367,7359,content://media/external/images/media/7359,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210704-WA0028.jpg",image/jpeg,1600,1008,0,148331,,1637518223,1625415390000,0,0,0,0,,,,,,,,,,, +17368,7117,content://media/external/images/media/7117,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210704-WA0026.jpg",image/jpeg,1600,900,0,132903,,1637518222,1625415389000,0,0,0,0,,,,,,,,,,, +17369,7181,content://media/external/images/media/7181,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210704-WA0027.jpg",image/jpeg,900,1600,0,144261,,1637518223,1625415389000,0,0,0,0,,,,,,,,,,, +17370,7421,content://media/external/images/media/7421,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210704-WA0025.jpg",image/jpeg,1600,900,0,141257,,1637518223,1625415388000,0,0,0,0,,,,,,,,,,, +17371,7309,content://media/external/images/media/7309,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0016.jpg",image/jpeg,1024,768,0,125499,,1637518223,1625221122000,0,0,0,0,,,,,,,,,,, +17372,7358,content://media/external/images/media/7358,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0015.jpg",image/jpeg,1024,768,0,131380,,1637518223,1625221122000,0,0,0,0,,,,,,,,,,, +17373,7492,content://media/external/images/media/7492,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0014.jpg",image/jpeg,1024,768,0,121029,,1637518223,1625221122000,0,0,0,0,,,,,,,,,,, +17374,7085,content://media/external/images/media/7085,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0013.jpg",image/jpeg,1024,768,0,107464,,1637518222,1625221121000,0,0,0,0,,,,,,,,,,, +17375,7491,content://media/external/images/media/7491,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0012.jpg",image/jpeg,1024,768,0,108473,,1637518223,1625221121000,0,0,0,0,,,,,,,,,,, +17376,6312,content://media/external/images/media/6312,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0011.jpg",image/jpeg,1024,768,0,109887,,1637518221,1625221120000,0,0,0,0,,,,,,,,,,, +17377,7215,content://media/external/images/media/7215,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0010.jpg",image/jpeg,768,1024,0,107744,,1637518223,1625221120000,0,0,0,0,,,,,,,,,,, +17378,7490,content://media/external/images/media/7490,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0009.jpg",image/jpeg,768,1024,0,112343,,1637518223,1625221119000,0,0,0,0,,,,,,,,,,, +17379,7582,content://media/external/images/media/7582,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0008.jpg",image/jpeg,768,1024,0,116504,,1637518223,1625221119000,0,0,0,0,,,,,,,,,,, +17380,7357,content://media/external/images/media/7357,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0006.jpg",image/jpeg,760,1024,0,76779,,1637518223,1625221118000,0,0,0,0,,,,,,,,,,, +17381,7581,content://media/external/images/media/7581,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0007.jpg",image/jpeg,472,1024,0,62070,,1637518223,1625221118000,0,0,0,0,,,,,,,,,,, +17382,7388,content://media/external/images/media/7388,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0005.jpg",image/jpeg,768,1024,0,96328,,1637518223,1625221117000,0,0,0,0,,,,,,,,,,, +17383,7308,content://media/external/images/media/7308,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210701-WA0030.jpg",image/jpeg,1504,1128,0,152972,,1637518223,1625169418000,0,0,0,0,,,,,,,,,,, +17384,7084,content://media/external/images/media/7084,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210701-WA0028.jpg",image/jpeg,1504,1128,0,171857,,1637518222,1625167577000,0,0,0,0,,,,,,,,,,, +17385,7116,content://media/external/images/media/7116,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210701-WA0011.jpg",image/jpeg,2048,1536,0,543195,,1637518222,1625138613000,0,0,0,0,,,,,,,,,,, +17386,7420,content://media/external/images/media/7420,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210629-WA0000.jpg",image/jpeg,750,1334,0,84190,,1637518223,1624945732000,0,0,0,0,,,,,,,,,,, +17387,7286,content://media/external/images/media/7286,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210628-WA0007.jpg",image/jpeg,960,720,0,99019,,1637518223,1624878474000,0,0,0,0,,,,,,,,,,, +17388,2653,content://media/external/images/media/2653,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-27-18-14-13-292_com.strava.jpg,image/jpeg,1080,2340,0,773737,,1637500871,1624810453000,0,0,0,0,,,,,,,,,,, +17389,6311,content://media/external/images/media/6311,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210627-WA0005.jpg",image/jpeg,1536,2048,0,393437,,1637518221,1624778321000,0,0,0,0,,,,,,,,,,, +17390,7450,content://media/external/images/media/7450,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210627-WA0004.jpg",image/jpeg,1536,2048,0,386379,,1637518223,1624778320000,0,0,0,0,,,,,,,,,,, +17391,7261,content://media/external/images/media/7261,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210627-WA0003.jpg",image/jpeg,1536,2048,0,396873,,1637518223,1624778317000,0,0,0,0,,,,,,,,,,, +17392,7356,content://media/external/images/media/7356,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210626-WA0003.jpg",image/jpeg,1600,1200,0,332316,,1637518223,1624693157000,0,0,0,0,,,,,,,,,,, +17393,3310,content://media/external/images/media/3310,/storage/emulated/0/DCIM/Camera/IMG_20210626_093254.jpg,image/jpeg,4000,2250,0,6512662,,1637502430,1624692776000,1624692776612,0,0,0,,,,,,,,,,, +17394,7449,content://media/external/images/media/7449,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0026.jpg",image/jpeg,2048,475,0,146468,,1637518223,1624645695000,0,0,0,0,,,,,,,,,,, +17395,7489,content://media/external/images/media/7489,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0025.jpg",image/jpeg,2048,594,0,227161,,1637518223,1624645695000,0,0,0,0,,,,,,,,,,, +17396,7418,content://media/external/images/media/7418,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0022.jpg",image/jpeg,1600,900,0,162953,,1637518223,1624645328000,0,0,0,0,,,,,,,,,,, +17397,2708,content://media/external/images/media/2708,/storage/emulated/0/DCIM/Screenshots/IMG_20210625_201921.jpg,image/jpeg,1080,1781,0,408927,,1637500987,1624645161000,0,0,0,0,,,,,,,,,,, +17398,7488,content://media/external/images/media/7488,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0021.jpg",image/jpeg,900,1600,0,373164,,1637518223,1624636891000,0,0,0,0,,,,,,,,,,, +17399,7355,content://media/external/images/media/7355,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0010.jpg",image/jpeg,1200,1600,0,204825,,1637518223,1624635746000,0,0,0,0,,,,,,,,,,, +17400,7542,content://media/external/images/media/7542,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0007.jpg",image/jpeg,1600,1200,0,176604,,1637518223,1624618317000,0,0,0,0,,,,,,,,,,, +17401,7487,content://media/external/images/media/7487,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0006.jpg",image/jpeg,1600,370,0,83864,,1637518223,1624618307000,0,0,0,0,,,,,,,,,,, +17402,7260,content://media/external/images/media/7260,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0035.jpg",image/jpeg,2048,1536,0,631714,,1637518223,1624384307000,0,0,0,0,,,,,,,,,,, +17403,7448,content://media/external/images/media/7448,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0034.jpg",image/jpeg,2048,1536,0,643695,,1637518223,1624384306000,0,0,0,0,,,,,,,,,,, +17404,7580,content://media/external/images/media/7580,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0033.jpg",image/jpeg,2048,1536,0,454809,,1637518223,1624384306000,0,0,0,0,,,,,,,,,,, +17405,7486,content://media/external/images/media/7486,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0032.jpg",image/jpeg,2048,1536,0,466838,,1637518223,1624384305000,0,0,0,0,,,,,,,,,,, +17406,6310,content://media/external/images/media/6310,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0030.jpg",image/jpeg,2048,1536,0,466223,,1637518221,1624384304000,0,0,0,0,,,,,,,,,,, +17407,7083,content://media/external/images/media/7083,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0031.jpg",image/jpeg,2048,1536,0,435082,,1637518222,1624384304000,0,0,0,0,,,,,,,,,,, +17408,7419,content://media/external/images/media/7419,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0029.jpg",image/jpeg,2048,1536,0,658932,,1637518223,1624384303000,0,0,0,0,,,,,,,,,,, +17409,7180,content://media/external/images/media/7180,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0028.jpg",image/jpeg,2000,1125,0,334396,,1637518223,1624384302000,0,0,0,0,,,,,,,,,,, +17410,2751,content://media/external/images/media/2751,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-22-18-16-22-477_com.strava.jpg,image/jpeg,1080,2340,0,805203,,1637500987,1624378582000,0,0,0,0,,,,,,,,,,, +17411,4827,content://media/external/images/media/4827,/storage/emulated/0/DCIM/Camera/IMG_20210622_114213.jpg,image/jpeg,4160,2340,0,5540629,,1637505731,1624354937000,1624354937315,0,0,0,,,,,,,,,,, +17412,7354,content://media/external/images/media/7354,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0015.jpg",image/jpeg,2048,1152,0,212402,,1637518223,1624353921000,0,0,0,0,,,,,,,,,,, +17413,7541,content://media/external/images/media/7541,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0014.jpg",image/jpeg,2000,1125,0,335713,,1637518223,1624353907000,0,0,0,0,,,,,,,,,,, +17414,2638,content://media/external/images/media/2638,/storage/emulated/0/DCIM/ReactNative-snapshot-image866497803399468491.jpg,image/jpeg,936,3082,0,737773,,1637500870,1624342622000,0,0,0,0,,,,,,,,,,, +17415,6427,content://media/external/images/media/6427,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210621-WA0017.jpg",image/jpeg,1536,2048,0,503975,,1637518221,1624278997000,0,0,0,0,,,,,,,,,,, +17416,7579,content://media/external/images/media/7579,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210621-WA0014.jpg",image/jpeg,1600,900,0,247595,,1637518223,1624275160000,0,0,0,0,,,,,,,,,,, +17417,7214,content://media/external/images/media/7214,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210621-WA0013.jpg",image/jpeg,900,1600,0,263113,,1637518223,1624275076000,0,0,0,0,,,,,,,,,,, +17418,6426,content://media/external/images/media/6426,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210621-WA0010.jpg",image/jpeg,1600,900,0,114365,,1637518221,1624272986000,0,0,0,0,,,,,,,,,,, +17419,3074,content://media/external/images/media/3074,/storage/emulated/0/DCIM/Camera/IMG_20210621_104436.jpg,image/jpeg,4000,2250,90,6915533,,1637501905,1624265077000,1624265077853,0,0,0,,,,,,,,,,, +17420,7578,content://media/external/images/media/7578,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0043.jpg",image/jpeg,768,1024,0,146355,,1637518223,1624211684000,0,0,0,0,,,,,,,,,,, +17421,7259,content://media/external/images/media/7259,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0042.jpg",image/jpeg,1024,768,0,213586,,1637518223,1624211683000,0,0,0,0,,,,,,,,,,, +17422,7307,content://media/external/images/media/7307,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0040.jpg",image/jpeg,768,1024,0,262066,,1637518223,1624211682000,0,0,0,0,,,,,,,,,,, +17423,7540,content://media/external/images/media/7540,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0041.jpg",image/jpeg,1024,768,0,181998,,1637518223,1624211682000,0,0,0,0,,,,,,,,,,, +17424,7306,content://media/external/images/media/7306,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0038.jpg",image/jpeg,768,1024,0,295954,,1637518223,1624211681000,0,0,0,0,,,,,,,,,,, +17425,7539,content://media/external/images/media/7539,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0039.jpg",image/jpeg,1024,768,0,245057,,1637518223,1624211681000,0,0,0,0,,,,,,,,,,, +17426,6309,content://media/external/images/media/6309,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0037.jpg",image/jpeg,1024,768,0,207727,,1637518221,1624211680000,0,0,0,0,,,,,,,,,,, +17427,3192,content://media/external/images/media/3192,/storage/emulated/0/DCIM/Camera/IMG_20210620_121336.jpg,image/jpeg,4000,2250,90,7314220,,1637502161,1624184018000,1624184018082,0,0,0,,,,,,,,,,, +17428,7258,content://media/external/images/media/7258,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0010.jpg",image/jpeg,1200,1600,0,227643,,1637518223,1624109320000,0,0,0,0,,,,,,,,,,, +17429,7305,content://media/external/images/media/7305,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0008.jpeg",image/jpeg,3840,2160,90,1452657,,1637518223,1624108621000,1624108621731,0,0,0,,,,,,,,,,, +17430,6307,content://media/external/images/media/6307,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0007.jpg",image/jpeg,1200,1600,0,242391,,1637518221,1624108573000,0,0,0,0,,,,,,,,,,, +17431,7213,content://media/external/images/media/7213,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0006.jpg",image/jpeg,1200,1600,0,235568,,1637518223,1624108572000,0,0,0,0,,,,,,,,,,, +17432,7485,content://media/external/images/media/7485,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0005.jpg",image/jpeg,1600,1200,0,221798,,1637518223,1624105434000,0,0,0,0,,,,,,,,,,, +17433,7212,content://media/external/images/media/7212,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210618-WA0011.jpg",image/jpeg,2048,1536,0,269814,,1637518223,1624040132000,0,0,0,0,,,,,,,,,,, +17434,7178,content://media/external/images/media/7178,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210618-WA0010.jpg",image/jpeg,2048,1536,0,234492,,1637518223,1624040130000,0,0,0,0,,,,,,,,,,, +17435,4511,content://media/external/images/media/4511,/storage/emulated/0/DCIM/Camera/IMG_20210617_200103.jpg,image/jpeg,4000,2250,90,4222625,,1637505160,1623952865000,1623952865692,0,0,0,,,,,,,,,,, +17436,2663,content://media/external/images/media/2663,"/storage/emulated/0/Download/montagna/Da Campitello di Fassa al Rifugio Alpe di Tires percorrendo la spettacolare Val Duron/Da Campitello di Fassa al Rifugio Alpe di Tires percorrendo la spettacolare Val Duron.rtfd/Schermata 2021-06-17 alle 12.36.29.png",image/png,1956,424,0,53556,,1637500871,1623926190000,0,0,0,0,,,,,,,,,,, +17437,2662,content://media/external/images/media/2662,"/storage/emulated/0/Download/montagna/Da Alba di Canazei ai rifugi Contrin e Passo San Nicolò/Da Alba di Canazei ai rifugi Contrin e Passo San Nicolò.rtfd/Schermata 2021-06-17 alle 12.33.32.png",image/png,1942,388,0,52282,,1637500871,1623926017000,0,0,0,0,,,,,,,,,,, +17438,2664,content://media/external/images/media/2664,"/storage/emulated/0/Download/montagna/Dal Rifugio Gardeccia al Rifugio Antermoia un giro ad anello sul Catinaccio/Dal Rifugio Gardeccia al Rifugio Antermoia un giro ad anello sul Catinaccio.rtfd/Schermata 2021-06-17 alle 12.30.28.png",image/png,1924,388,0,51940,,1637500871,1623925829000,0,0,0,0,,,,,,,,,,, +17439,2661,content://media/external/images/media/2661,"/storage/emulated/0/Download/montagna/Ciclabile della Val di Fiemme e Fassa/Ciclabile della Val di Fiemme e Fassa.rtfd/Schermata 2021-06-17 alle 12.26.05.png",image/png,1924,312,0,47980,,1637500871,1623925566000,0,0,0,0,,,,,,,,,,, +17440,2668,content://media/external/images/media/2668,"/storage/emulated/0/Download/montagna/Rifugio Re Alberto I° da Pera di Fassa/Rifugio Re Alberto I° da Pera di Fassa.rtfd/Schermata 2021-06-17 alle 12.23.29.png",image/png,1928,386,0,52561,,1637500871,1623925412000,0,0,0,0,,,,,,,,,,, +17441,2666,content://media/external/images/media/2666,"/storage/emulated/0/Download/montagna/Giro ad anello sul Catinaccio passando per i rifugi Roda di Vael, Fronza e Paolina/Roda di Vael, Fronza e Paolina.rtfd/Schermata 2021-06-17 alle 11.54.53.png",image/png,1898,316,0,47749,,1637500871,1623923696000,0,0,0,0,,,,,,,,,,, +17442,2665,content://media/external/images/media/2665,"/storage/emulated/0/Download/montagna/Giro ad anello alla Malga Vaèl e al Rifugio Ciampedie/Giro ad anello alla Malga Vaèl e al Rifugio Ciampedie.rtfd/Schermata 2021-06-17 alle 11.51.12.png",image/png,1942,382,0,51800,,1637500871,1623923474000,0,0,0,0,,,,,,,,,,, +17443,2667,content://media/external/images/media/2667,"/storage/emulated/0/Download/montagna/Mazzin - Rifugio Antermoia - Rifugio Dona -Mazzin/Mazzin - Rifugio Antermoia - Rifugio Dona.rtfd/Schermata 2021-06-17 alle 11.47.19.png",image/png,1958,388,0,52755,,1637500871,1623923243000,0,0,0,0,,,,,,,,,,, +17444,4102,content://media/external/images/media/4102,/storage/emulated/0/DCIM/Camera/IMG_20210614_201745.jpg,image/jpeg,4000,2250,90,3525981,,1637504400,1623694666000,1623694666783,0,0,0,,,,,,,,,,, +17445,4230,content://media/external/images/media/4230,/storage/emulated/0/DCIM/Camera/IMG_20210614_201741.jpg,image/jpeg,4000,2250,90,3265503,,1637504726,1623694663000,1623694663218,0,0,0,,,,,,,,,,, +17446,4420,content://media/external/images/media/4420,/storage/emulated/0/DCIM/Camera/IMG_20210614_201035.jpg,image/jpeg,4000,2250,90,3511387,,1637505063,1623694237000,1623694237114,0,0,0,,,,,,,,,,, +17447,3349,content://media/external/images/media/3349,/storage/emulated/0/DCIM/Camera/IMG_20210613_173905.jpg,image/jpeg,2091,1316,0,964427,,1637502439,1623598745000,1623572653359,0,0,0,,,,,,,,,,, +17448,3828,content://media/external/images/media/3828,/storage/emulated/0/DCIM/Camera/IMG_20210613_102514.jpg,image/jpeg,4000,2250,0,4986359,,1637503630,1623572717000,1623572716927,0,0,0,,,,,,,,,,, +17449,3960,content://media/external/images/media/3960,/storage/emulated/0/DCIM/Camera/IMG_20210613_102411.jpg,image/jpeg,4000,2250,180,4004416,,1637503942,1623572653000,1623572653359,0,0,0,,,,,,,,,,, +17450,7151,content://media/external/images/media/7151,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210611-WA0001.jpg",image/jpeg,738,1600,0,90006,,1637518222,1623394936000,0,0,0,0,,,,,,,,,,, +17451,7484,content://media/external/images/media/7484,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210609-WA0003.jpg",image/jpeg,1377,1080,0,587148,,1637518223,1623224373000,0,0,0,0,,,,,,,,,,, +17452,7483,content://media/external/images/media/7483,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210609-WA0002.jpg",image/jpeg,1200,1600,0,535363,,1637518223,1623222996000,0,0,0,0,,,,,,,,,,, +17453,7538,content://media/external/images/media/7538,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210609-WA0001.jpg",image/jpeg,1200,1600,0,497383,,1637518223,1623222994000,0,0,0,0,,,,,,,,,,, +17454,7211,content://media/external/images/media/7211,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210608-WA0021.jpg",image/jpeg,1200,1600,0,281910,,1637518223,1623181389000,0,0,0,0,,,,,,,,,,, +17455,6425,content://media/external/images/media/6425,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210608-WA0020.jpg",image/jpeg,1200,1600,0,181936,,1637518221,1623181387000,0,0,0,0,,,,,,,,,,, +17456,7387,content://media/external/images/media/7387,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210608-WA0015.jpg",image/jpeg,935,1600,0,489941,,1637518223,1623157409000,0,0,0,0,,,,,,,,,,, +17457,7304,content://media/external/images/media/7304,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210608-WA0000.jpg",image/jpeg,1200,1600,0,251150,,1637518223,1623106332000,0,0,0,0,,,,,,,,,,, +17458,2707,content://media/external/images/media/2707,/storage/emulated/0/DCIM/Screenshots/IMG_20210606_190023.jpg,image/jpeg,1080,1153,0,100781,,1637500987,1622998823000,0,0,0,0,,,,,,,,,,, +17459,2706,content://media/external/images/media/2706,/storage/emulated/0/DCIM/Screenshots/IMG_20210606_185954.jpg,image/jpeg,1080,1103,0,239034,,1637500987,1622998794000,0,0,0,0,,,,,,,,,,, +17460,2750,content://media/external/images/media/2750,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-06-18-58-30-908_com.strava.jpg,image/jpeg,1080,2340,0,279307,,1637500987,1622998711000,0,0,0,0,,,,,,,,,,, +17461,2749,content://media/external/images/media/2749,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-06-18-58-05-990_com.strava.jpg,image/jpeg,1080,2340,0,635184,,1637500987,1622998686000,0,0,0,0,,,,,,,,,,, +17462,4171,content://media/external/images/media/4171,/storage/emulated/0/DCIM/Camera/IMG_20210606_094520.jpg,image/jpeg,4160,2340,90,6030474,,1637504556,1622965530000,1622965530087,0,0,0,,,,,,,,,,, +17463,2863,content://media/external/images/media/2863,/storage/emulated/0/DCIM/Camera/IMG_20210606_094128.jpg,image/jpeg,4160,2340,0,6277932,,1637501457,1622965295000,1622965294645,0,0,0,,,,,,,,,,, +17464,3446,content://media/external/images/media/3446,/storage/emulated/0/DCIM/Camera/PANO_20210606_093303.jpg,image/jpeg,8720,3456,0,25582964,,1637502783,1622964794000,0,0,0,0,,,,,,,,,,, +17465,4332,content://media/external/images/media/4332,/storage/emulated/0/DCIM/Camera/PANO_20210606_093236.jpg,image/jpeg,5904,3680,0,18972135,,1637504895,1622964765000,0,0,0,0,,,,,,,,,,, +17466,4652,content://media/external/images/media/4652,/storage/emulated/0/DCIM/Camera/PANO_20210606_092504.jpg,image/jpeg,7120,3616,0,21608334,,1637505414,1622964313000,0,0,0,0,,,,,,,,,,, +17467,7150,content://media/external/images/media/7150,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210606-WA0003.jpg",image/jpeg,1536,2048,0,677448,,1637518222,1622963314000,0,0,0,0,,,,,,,,,,, +17468,7257,content://media/external/images/media/7257,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210606-WA0001.jpg",image/jpeg,1200,1600,0,436012,,1637518223,1622963294000,0,0,0,0,,,,,,,,,,, +17469,3249,content://media/external/images/media/3249,/storage/emulated/0/DCIM/Camera/IMG_20210605_170411.jpg,image/jpeg,4000,2250,0,3623437,,1637502259,1622905453000,1622905453067,0,0,0,,,,,,,,,,, +17470,6308,content://media/external/images/media/6308,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210603-WA0001.jpg",image/jpeg,1200,1600,0,131616,,1637518221,1622704800000,0,0,0,0,,,,,,,,,,, +17471,2652,content://media/external/images/media/2652,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-02-19-16-06-101_com.strava.jpg,image/jpeg,1080,2340,0,488957,,1637500871,1622654166000,0,0,0,0,,,,,,,,,,, +17472,7179,content://media/external/images/media/7179,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0049.jpg",image/jpeg,1600,1200,0,223671,,1637518223,1622653853000,0,0,0,0,,,,,,,,,,, +17473,7417,content://media/external/images/media/7417,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0048.jpg",image/jpeg,1599,738,0,145517,,1637518223,1622652722000,0,0,0,0,,,,,,,,,,, +17474,4569,content://media/external/images/media/4569,/storage/emulated/0/DCIM/Camera/IMG_20210602_181034.jpg,image/jpeg,4160,2340,0,5050478,,1637505216,1622650237000,1622650236835,0,0,0,,,,,,,,,,, +17475,6306,content://media/external/images/media/6306,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0047.jpg",image/jpeg,1153,2048,0,229115,,1637518221,1622650233000,0,0,0,0,,,,,,,,,,, +17476,4668,content://media/external/images/media/4668,/storage/emulated/0/DCIM/Camera/IMG_20210602_181011.jpg,image/jpeg,4160,2340,0,5136444,,1637505418,1622650214000,1622650214396,0,0,0,,,,,,,,,,, +17477,7447,content://media/external/images/media/7447,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0046.jpg",image/jpeg,1600,738,0,156771,,1637518223,1622650162000,0,0,0,0,,,,,,,,,,, +17478,4738,content://media/external/images/media/4738,/storage/emulated/0/DCIM/Camera/IMG_20210602_180723.jpg,image/jpeg,4160,2340,0,5190488,,1637505574,1622650049000,1622650048802,0,0,0,,,,,,,,,,, +17479,2949,content://media/external/images/media/2949,/storage/emulated/0/DCIM/Camera/IMG_20210602_180710.jpg,image/jpeg,4000,2250,0,5066649,,1637501661,1622650032000,1622650032143,0,0,0,,,,,,,,,,, +17480,4530,content://media/external/images/media/4530,/storage/emulated/0/DCIM/Camera/IMG_20210602_180652.jpg,image/jpeg,4000,2250,0,7473092,,1637505165,1622650015000,1622650015130,0,0,0,,,,,,,,,,, +17481,6305,content://media/external/images/media/6305,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0044.jpg",image/jpeg,2048,1536,0,323103,,1637518221,1622649030000,0,0,0,0,,,,,,,,,,, +17482,6304,content://media/external/images/media/6304,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0043.jpg",image/jpeg,2048,1536,0,346247,,1637518221,1622649029000,0,0,0,0,,,,,,,,,,, +17483,7446,content://media/external/images/media/7446,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0042.jpg",image/jpeg,2048,1536,0,517442,,1637518223,1622649029000,0,0,0,0,,,,,,,,,,, +17484,7177,content://media/external/images/media/7177,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0041.jpg",image/jpeg,2048,1536,0,410277,,1637518223,1622649028000,0,0,0,0,,,,,,,,,,, +17485,7577,content://media/external/images/media/7577,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0040.jpg",image/jpeg,1536,2048,0,455963,,1637518223,1622649027000,0,0,0,0,,,,,,,,,,, +17486,6303,content://media/external/images/media/6303,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0038.jpg",image/jpeg,1536,2048,0,545500,,1637518221,1622649026000,0,0,0,0,,,,,,,,,,, +17487,6424,content://media/external/images/media/6424,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0039.jpg",image/jpeg,2048,1536,0,453964,,1637518221,1622649026000,0,0,0,0,,,,,,,,,,, +17488,7537,content://media/external/images/media/7537,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0037.jpg",image/jpeg,2048,1536,0,527344,,1637518223,1622649025000,0,0,0,0,,,,,,,,,,, +17489,7210,content://media/external/images/media/7210,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0036.jpg",image/jpeg,2048,1536,0,460139,,1637518223,1622649024000,0,0,0,0,,,,,,,,,,, +17490,7256,content://media/external/images/media/7256,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0034.jpg",image/jpeg,1536,2048,0,565685,,1637518223,1622649023000,0,0,0,0,,,,,,,,,,, +17491,7482,content://media/external/images/media/7482,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0035.jpg",image/jpeg,2048,1536,0,756422,,1637518223,1622649023000,0,0,0,0,,,,,,,,,,, +17492,6302,content://media/external/images/media/6302,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0033.jpg",image/jpeg,2048,1536,0,332439,,1637518221,1622649022000,0,0,0,0,,,,,,,,,,, +17493,7445,content://media/external/images/media/7445,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0032.jpg",image/jpeg,2048,1536,0,770943,,1637518223,1622649021000,0,0,0,0,,,,,,,,,,, +17494,7416,content://media/external/images/media/7416,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0030.jpg",image/jpeg,1536,2048,0,298731,,1637518223,1622649020000,0,0,0,0,,,,,,,,,,, +17495,7481,content://media/external/images/media/7481,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0031.jpg",image/jpeg,2048,1536,0,449431,,1637518223,1622649020000,0,0,0,0,,,,,,,,,,, +17496,6301,content://media/external/images/media/6301,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0029.jpg",image/jpeg,2048,1536,0,428582,,1637518221,1622649019000,0,0,0,0,,,,,,,,,,, +17497,7480,content://media/external/images/media/7480,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0028.jpg",image/jpeg,1536,2048,0,333370,,1637518223,1622649019000,0,0,0,0,,,,,,,,,,, +17498,3774,content://media/external/images/media/3774,/storage/emulated/0/DCIM/Camera/IMG_20210602_173923.jpg,image/jpeg,4000,2250,0,5624149,,1637503508,1622648365000,1622648365459,0,0,0,,,,,,,,,,, +17499,4041,content://media/external/images/media/4041,/storage/emulated/0/DCIM/Camera/IMG_20210602_173903.jpg,image/jpeg,4000,2250,0,5153318,,1637504234,1622648346000,1622648346017,0,0,0,,,,,,,,,,, +17500,7176,content://media/external/images/media/7176,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0026.jpg",image/jpeg,1200,1600,0,172853,,1637518223,1622638402000,0,0,0,0,,,,,,,,,,, +17501,7209,content://media/external/images/media/7209,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0027.jpg",image/jpeg,1600,738,0,133944,,1637518223,1622638402000,0,0,0,0,,,,,,,,,,, +17502,7535,content://media/external/images/media/7535,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0010.jpg",image/jpeg,1600,1200,0,181082,,1637518223,1622635376000,0,0,0,0,,,,,,,,,,, +17503,4068,content://media/external/images/media/4068,/storage/emulated/0/DCIM/Camera/IMG_20210602_140246.jpg,image/jpeg,4000,2250,0,3970564,,1637504342,1622635367000,1622635281814,0,0,0,,,,,,,,,,, +17504,3443,content://media/external/images/media/3443,/storage/emulated/0/DCIM/Camera/IMG_20210602_140215.jpg,image/jpeg,4000,2250,0,3670328,,1637502783,1622635336000,1622635281814,0,0,0,,,,,,,,,,, +17505,3210,content://media/external/images/media/3210,/storage/emulated/0/DCIM/Camera/IMG_20210602_140120.jpg,image/jpeg,4000,2250,0,3905851,,1637502256,1622635281000,1622635281814,0,0,0,,,,,,,,,,, +17506,4667,content://media/external/images/media/4667,/storage/emulated/0/DCIM/Camera/IMG_20210602_140118.jpg,image/jpeg,4000,2250,0,3903186,,1637505418,1622635280000,1622635279921,0,0,0,,,,,,,,,,, +17507,3959,content://media/external/images/media/3959,/storage/emulated/0/DCIM/Camera/IMG_20210602_140046.jpg,image/jpeg,4160,2340,0,2634799,,1637503942,1622635252000,1622635252060,0,0,0,,,,,,,,,,, +17508,4271,content://media/external/images/media/4271,/storage/emulated/0/DCIM/Camera/IMG_20210602_104444.jpg,image/jpeg,4000,2250,90,4049446,,1637504757,1622623486000,1622623486684,0,0,0,,,,,,,,,,, +17509,4378,content://media/external/images/media/4378,/storage/emulated/0/DCIM/Camera/IMG_20210602_104441.jpg,image/jpeg,4000,2250,90,4599769,,1637504982,1622623483000,1622623483092,0,0,0,,,,,,,,,,, +17510,3190,content://media/external/images/media/3190,/storage/emulated/0/DCIM/Camera/IMG_20210602_100736.jpg,image/jpeg,4000,2250,90,5298753,,1637502161,1622621259000,1622621259541,0,0,0,,,,,,,,,,, +17511,4718,content://media/external/images/media/4718,/storage/emulated/0/DCIM/Camera/IMG_20210602_100703.jpg,image/jpeg,4160,2340,0,6811202,,1637505565,1622621227000,1622621227543,0,0,0,,,,,,,,,,, +17512,4067,content://media/external/images/media/4067,/storage/emulated/0/DCIM/Camera/IMG_20210602_100637.jpg,image/jpeg,4000,2250,90,5010708,,1637504342,1622621199000,1622621198998,0,0,0,,,,,,,,,,, +17513,3095,content://media/external/images/media/3095,/storage/emulated/0/DCIM/Camera/IMG_20210602_100557.jpg,image/jpeg,4000,2250,90,6828207,,1637501971,1622621158000,1622621158819,0,0,0,,,,,,,,,,, +17514,4326,content://media/external/images/media/4326,/storage/emulated/0/DCIM/Camera/IMG_20210602_100532.jpg,image/jpeg,4000,2250,90,6115236,,1637504895,1622621133000,1622621133822,0,0,0,,,,,,,,,,, +17515,3497,content://media/external/images/media/3497,/storage/emulated/0/DCIM/Camera/IMG_20210602_100449.jpg,image/jpeg,4000,2250,0,6034151,,1637502870,1622621090000,1622621090713,0,0,0,,,,,,,,,,, +17516,3422,content://media/external/images/media/3422,/storage/emulated/0/DCIM/Camera/IMG_20210602_100428.jpg,image/jpeg,4000,2250,0,7184913,,1637502682,1622621070000,1622621070171,0,0,0,,,,,,,,,,, +17517,4782,content://media/external/images/media/4782,/storage/emulated/0/DCIM/Camera/IMG_20210602_100423.jpg,image/jpeg,4000,2250,90,6513468,,1637505656,1622621065000,1622621065110,0,0,0,,,,,,,,,,, +17518,6423,content://media/external/images/media/6423,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0005.jpg",image/jpeg,1600,738,0,139179,,1637518221,1622619660000,0,0,0,0,,,,,,,,,,, +17519,2748,content://media/external/images/media/2748,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-31-20-04-42-767_com.alltrails.alltrails.jpg,image/jpeg,1080,2340,0,540676,,1637500987,1622484282000,0,0,0,0,,,,,,,,,,, +17520,6300,content://media/external/images/media/6300,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0013.jpg",image/jpeg,1600,1197,0,257703,,1637518221,1622467853000,0,0,0,0,,,,,,,,,,, +17521,7479,content://media/external/images/media/7479,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0012.jpg",image/jpeg,1600,1197,0,251376,,1637518223,1622467853000,0,0,0,0,,,,,,,,,,, +17522,6299,content://media/external/images/media/6299,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0011.jpg",image/jpeg,1600,1197,0,259765,,1637518221,1622467852000,0,0,0,0,,,,,,,,,,, +17523,7149,content://media/external/images/media/7149,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0010.jpg",image/jpeg,1600,1197,0,224422,,1637518222,1622467852000,0,0,0,0,,,,,,,,,,, +17524,7148,content://media/external/images/media/7148,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0009.jpg",image/jpeg,1600,1197,0,257722,,1637518222,1622467851000,0,0,0,0,,,,,,,,,,, +17525,7255,content://media/external/images/media/7255,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0008.jpg",image/jpeg,1600,1197,0,260107,,1637518223,1622467850000,0,0,0,0,,,,,,,,,,, +17526,7386,content://media/external/images/media/7386,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0007.jpg",image/jpeg,1600,1197,0,246259,,1637518223,1622467849000,0,0,0,0,,,,,,,,,,, +17527,3629,content://media/external/images/media/3629,/storage/emulated/0/DCIM/Camera/IMG_20210531_074942.jpg,image/jpeg,4000,2250,90,6965358,,1637503272,1622440185000,1622440185251,0,0,0,,,,,,,,,,, +17528,6533,content://media/external/images/media/6533,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0045.jpg",image/jpeg,1200,1600,0,400295,,1637518221,1622399883000,0,0,0,0,,,,,,,,,,, +17529,7303,content://media/external/images/media/7303,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0044.jpg",image/jpeg,1200,1600,0,381864,,1637518223,1622399882000,0,0,0,0,,,,,,,,,,, +17530,7478,content://media/external/images/media/7478,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0043.jpg",image/jpeg,1200,1600,0,336846,,1637518223,1622399881000,0,0,0,0,,,,,,,,,,, +17531,7115,content://media/external/images/media/7115,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0042.jpg",image/jpeg,1200,1600,0,409890,,1637518222,1622399880000,0,0,0,0,,,,,,,,,,, +17532,7147,content://media/external/images/media/7147,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0041.jpg",image/jpeg,1200,1600,0,456283,,1637518222,1622399879000,0,0,0,0,,,,,,,,,,, +17533,7444,content://media/external/images/media/7444,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0040.jpg",image/jpeg,1200,1600,0,457452,,1637518223,1622399878000,0,0,0,0,,,,,,,,,,, +17534,3773,content://media/external/images/media/3773,/storage/emulated/0/DCIM/Camera/IMG_20210530_115509.jpg,image/jpeg,4000,2250,0,4783422,,1637503508,1622368513000,1622368512751,0,0,0,,,,,,,,,,, +17535,2747,content://media/external/images/media/2747,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-30-10-54-34-554_com.brytonsport.active.jpg,image/jpeg,1080,2340,0,453509,,1637500987,1622364874000,0,0,0,0,,,,,,,,,,, +17536,2651,content://media/external/images/media/2651,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-30-10-52-33-818_com.brytonsport.active.jpg,image/jpeg,1080,2340,0,381893,,1637500870,1622364753000,0,0,0,0,,,,,,,,,,, +17537,2746,content://media/external/images/media/2746,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-30-10-51-47-666_com.brytonsport.active.jpg,image/jpeg,1080,2340,0,686556,,1637500987,1622364708000,0,0,0,0,,,,,,,,,,, +17538,3445,content://media/external/images/media/3445,/storage/emulated/0/DCIM/Camera/PANO_20210530_092918.jpg,image/jpeg,7536,3680,0,21235984,,1637502783,1622359764000,0,0,0,0,,,,,,,,,,, +17539,4651,content://media/external/images/media/4651,/storage/emulated/0/DCIM/Camera/PANO_20210530_092903.jpg,image/jpeg,7856,3744,0,18617937,,1637505414,1622359752000,0,0,0,0,,,,,,,,,,, +17540,4761,content://media/external/images/media/4761,/storage/emulated/0/DCIM/Camera/IMG_20210530_092740.jpg,image/jpeg,4160,2340,0,5171688,,1637505639,1622359661000,1622359661595,0,0,0,,,,,,,,,,, +17541,4917,content://media/external/images/media/4917,/storage/emulated/0/DCIM/Camera/IMG_20210530_092732.jpg,image/jpeg,4160,2340,0,4463325,,1637505944,1622359656000,1622359655945,0,0,0,,,,,,,,,,, +17542,3666,content://media/external/images/media/3666,/storage/emulated/0/DCIM/Camera/IMG_20210530_075649.jpg,image/jpeg,4000,2250,0,3395419,,1637503358,1622354211000,1622354211156,0,0,0,,,,,,,,,,, +17543,4587,content://media/external/images/media/4587,/storage/emulated/0/DCIM/Camera/IMG_20210529_200103.jpg,image/jpeg,4160,2340,0,3021577,,1637505278,1622311268000,1622311268267,0,0,0,,,,,,,,,,, +17544,4040,content://media/external/images/media/4040,/storage/emulated/0/DCIM/Camera/IMG_20210529_200046.jpg,image/jpeg,4000,2250,90,3353403,,1637504234,1622311248000,1622311248671,0,0,0,,,,,,,,,,, +17545,6532,content://media/external/images/media/6532,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210528-WA0000.jpg",image/jpeg,1200,1600,0,111795,,1637518221,1622178656000,0,0,0,0,,,,,,,,,,, +17546,3958,content://media/external/images/media/3958,/storage/emulated/0/DCIM/Camera/IMG_20210526_132754.jpg,image/jpeg,4000,2250,180,5560675,,1637503942,1622028476000,1622028476203,0,0,0,,,,,,,,,,, +17547,3474,content://media/external/images/media/3474,/storage/emulated/0/DCIM/Camera/IMG_20210526_132754_1.jpg,image/jpeg,4000,2250,180,4799389,,1637502817,1622028475000,1622028475547,0,0,0,,,,,,,,,,, +17548,4781,content://media/external/images/media/4781,/storage/emulated/0/DCIM/Camera/IMG_20210526_132606.jpg,image/jpeg,4000,2250,90,4113684,,1637505656,1622028369000,1622028368914,0,0,0,,,,,,,,,,, +17549,6745,content://media/external/images/media/6745,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210523-WA0035.jpg",image/jpeg,2048,1152,0,149972,,1637518222,1621788328000,0,0,0,0,,,,,,,,,,, +17550,6298,content://media/external/images/media/6298,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0079.jpg",image/jpeg,1296,970,0,165273,,1637518221,1621715796000,0,0,0,0,,,,,,,,,,, +17551,7254,content://media/external/images/media/7254,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0078.jpg",image/jpeg,1296,970,0,144567,,1637518223,1621715796000,0,0,0,0,,,,,,,,,,, +17552,6530,content://media/external/images/media/6530,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0077.jpg",image/jpeg,2048,1536,0,527379,,1637518221,1621715383000,0,0,0,0,,,,,,,,,,, +17553,7576,content://media/external/images/media/7576,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0076.jpg",image/jpeg,2048,1536,0,432430,,1637518223,1621715265000,0,0,0,0,,,,,,,,,,, +17554,7477,content://media/external/images/media/7477,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0075.jpg",image/jpeg,1024,768,0,123825,,1637518223,1621715257000,0,0,0,0,,,,,,,,,,, +17555,7253,content://media/external/images/media/7253,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0074.jpg",image/jpeg,768,1024,0,138622,,1637518223,1621715256000,0,0,0,0,,,,,,,,,,, +17556,7146,content://media/external/images/media/7146,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0072.jpg",image/jpeg,1200,1600,0,234150,,1637518222,1621714141000,0,0,0,0,,,,,,,,,,, +17557,7415,content://media/external/images/media/7415,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0071.jpg",image/jpeg,1600,1200,0,396002,,1637518223,1621714104000,0,0,0,0,,,,,,,,,,, +17558,7252,content://media/external/images/media/7252,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0070.jpg",image/jpeg,1200,1600,0,245226,,1637518223,1621714103000,0,0,0,0,,,,,,,,,,, +17559,6743,content://media/external/images/media/6743,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0069.jpg",image/jpeg,1200,1600,0,349910,,1637518222,1621714102000,0,0,0,0,,,,,,,,,,, +17560,7251,content://media/external/images/media/7251,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0068.jpg",image/jpeg,1600,1200,0,267273,,1637518223,1621714102000,0,0,0,0,,,,,,,,,,, +17561,7414,content://media/external/images/media/7414,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0067.jpg",image/jpeg,1600,1200,0,345092,,1637518223,1621714101000,0,0,0,0,,,,,,,,,,, +17562,7536,content://media/external/images/media/7536,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0066.jpg",image/jpeg,1200,1600,0,461840,,1637518223,1621714101000,0,0,0,0,,,,,,,,,,, +17563,6422,content://media/external/images/media/6422,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0065.jpg",image/jpeg,1200,1600,0,278992,,1637518221,1621714100000,0,0,0,0,,,,,,,,,,, +17564,7207,content://media/external/images/media/7207,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0064.jpg",image/jpeg,1600,1200,0,306717,,1637518223,1621714099000,0,0,0,0,,,,,,,,,,, +17565,7413,content://media/external/images/media/7413,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0062.jpg",image/jpeg,1600,1200,0,331716,,1637518223,1621714098000,0,0,0,0,,,,,,,,,,, +17566,7575,content://media/external/images/media/7575,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0063.jpg",image/jpeg,1600,1200,0,434643,,1637518223,1621714098000,0,0,0,0,,,,,,,,,,, +17567,7208,content://media/external/images/media/7208,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0061.jpg",image/jpeg,1600,1200,0,212184,,1637518223,1621714097000,0,0,0,0,,,,,,,,,,, +17568,6851,content://media/external/images/media/6851,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0060.jpg",image/jpeg,1600,1200,0,424872,,1637518222,1621714096000,0,0,0,0,,,,,,,,,,, +17569,6744,content://media/external/images/media/6744,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0059.jpg",image/jpeg,1600,1200,0,320271,,1637518222,1621714095000,0,0,0,0,,,,,,,,,,, +17570,6421,content://media/external/images/media/6421,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0058.jpg",image/jpeg,1600,1200,0,150297,,1637518221,1621714081000,0,0,0,0,,,,,,,,,,, +17571,3209,content://media/external/images/media/3209,/storage/emulated/0/DCIM/Camera/IMG_20210522_192118.jpg,image/jpeg,4000,2250,0,5152741,,1637502256,1621704080000,1621704080406,0,0,0,,,,,,,,,,, +17572,4270,content://media/external/images/media/4270,/storage/emulated/0/DCIM/Camera/IMG_20210522_192110.jpg,image/jpeg,4000,2250,0,5430040,,1637504757,1621704072000,1621704072726,0,0,0,,,,,,,,,,, +17573,4612,content://media/external/images/media/4612,/storage/emulated/0/DCIM/Camera/IMG_20210522_181245.jpg,image/jpeg,4160,2340,0,5141288,,1637505308,1621699965000,1621699965474,0,0,0,,,,,,,,,,, +17574,2912,content://media/external/images/media/2912,/storage/emulated/0/DCIM/Camera/IMG_20210522_181217.jpg,image/jpeg,4160,2340,0,3824204,,1637501535,1621699937000,1621699937806,0,0,0,,,,,,,,,,, +17575,4737,content://media/external/images/media/4737,/storage/emulated/0/DCIM/Camera/IMG_20210522_181147.jpg,image/jpeg,4160,2340,0,4021022,,1637505574,1621699907000,1621699907168,0,0,0,,,,,,,,,,, +17576,4895,content://media/external/images/media/4895,/storage/emulated/0/DCIM/Camera/IMG_20210522_180733.jpg,image/jpeg,4160,2340,0,5942653,,1637505920,1621699653000,1621699653179,0,0,0,,,,,,,,,,, +17577,3442,content://media/external/images/media/3442,/storage/emulated/0/DCIM/Camera/IMG_20210522_180729.jpg,image/jpeg,4160,2340,0,5040312,,1637502783,1621699649000,1621699649566,0,0,0,,,,,,,,,,, +17578,7250,content://media/external/images/media/7250,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0014.jpg",image/jpeg,1536,2048,0,317100,,1637518223,1621672200000,0,0,0,0,,,,,,,,,,, +17579,6420,content://media/external/images/media/6420,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0013.jpg",image/jpeg,2048,1536,0,264442,,1637518221,1621672189000,0,0,0,0,,,,,,,,,,, +17580,7574,content://media/external/images/media/7574,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0012.jpg",image/jpeg,1536,2048,0,368723,,1637518223,1621672181000,0,0,0,0,,,,,,,,,,, +17581,7249,content://media/external/images/media/7249,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210520-WA0004.jpeg",image/jpeg,3840,2160,90,2188091,,1637518223,1621490463000,1621490462949,0,0,0,,,,,,,,,,, +17582,4932,content://media/external/images/media/4932,/storage/emulated/0/DCIM/Camera/IMG_20210517_111932.jpg,image/jpeg,4000,2250,0,6194377,,1637506010,1621243175000,1621243174917,0,0,0,,,,,,,,,,, +17583,3539,content://media/external/images/media/3539,/storage/emulated/0/DCIM/Camera/IMG_20210517_105727.jpg,image/jpeg,4000,2250,90,8299048,,1637503010,1621241848000,1621241848478,0,0,0,,,,,,,,,,, +17584,3538,content://media/external/images/media/3538,/storage/emulated/0/DCIM/Camera/IMG_20210516_170546.jpg,image/jpeg,4000,2250,90,2864824,,1637503010,1621177548000,1621177548243,0,0,0,,,,,,,,,,, +17585,3732,content://media/external/images/media/3732,/storage/emulated/0/DCIM/Camera/IMG_20210516_170523.jpg,image/jpeg,4000,2250,90,4372280,,1637503477,1621177525000,1621177525311,0,0,0,,,,,,,,,,, +17586,3402,content://media/external/images/media/3402,/storage/emulated/0/DCIM/Camera/IMG_20210516_170106.jpg,image/jpeg,4000,2250,90,4338238,,1637502598,1621177269000,1621177269230,0,0,0,,,,,,,,,,, +17587,4529,content://media/external/images/media/4529,/storage/emulated/0/DCIM/Camera/IMG_20210516_170040.jpg,image/jpeg,4000,2250,90,4643081,,1637505165,1621177242000,1621177242381,0,0,0,,,,,,,,,,, +17588,4209,content://media/external/images/media/4209,/storage/emulated/0/DCIM/Camera/IMG_20210516_165921.jpg,image/jpeg,4000,2250,90,4160981,,1637504640,1621177163000,1621177163457,0,0,0,,,,,,,,,,, +17589,3473,content://media/external/images/media/3473,/storage/emulated/0/DCIM/Camera/IMG_20210516_165907.jpg,image/jpeg,4000,2250,90,2356843,,1637502817,1621177148000,1621177148782,0,0,0,,,,,,,,,,, +17590,4611,content://media/external/images/media/4611,/storage/emulated/0/DCIM/Camera/IMG_20210516_165705.jpg,image/jpeg,4000,2250,90,4632466,,1637505308,1621177026000,1621177026815,0,0,0,,,,,,,,,,, +17591,4004,content://media/external/images/media/4004,/storage/emulated/0/DCIM/Camera/IMG_20210515_221432.jpg,image/jpeg,4000,2250,90,4680240,,1637504086,1621109675000,1621109675325,0,0,0,,,,,,,,,,, +17592,2745,content://media/external/images/media/2745,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-15-19-40-21-566_com.brytonsport.active.jpg,image/jpeg,1080,2340,0,713289,,1637500987,1621100421000,0,0,0,0,,,,,,,,,,, +17593,3610,content://media/external/images/media/3610,/storage/emulated/0/DCIM/Camera/IMG_20210515_151134.jpg,image/jpeg,4000,2250,90,4648032,,1637503238,1621084298000,1621084298699,0,0,0,,,,,,,,,,, +17594,2879,content://media/external/images/media/2879,/storage/emulated/0/DCIM/Camera/IMG_20210515_145435.jpg,image/jpeg,4000,2250,0,7935985,,1637501460,1621083277000,1621083277326,0,0,0,,,,,,,,,,, +17595,4121,content://media/external/images/media/4121,/storage/emulated/0/DCIM/Camera/IMG_20210515_145429.jpg,image/jpeg,4000,2250,0,7810632,,1637504451,1621083272000,1621083272326,0,0,0,,,,,,,,,,, +17596,4080,content://media/external/images/media/4080,/storage/emulated/0/DCIM/Camera/IMG_20210515_125356.jpg,image/jpeg,4000,2250,90,4302598,,1637504394,1621076038000,1621076038273,0,0,0,,,,,,,,,,, +17597,4377,content://media/external/images/media/4377,/storage/emulated/0/DCIM/Camera/IMG_20210515_103356.jpg,image/jpeg,4000,2250,0,6358341,,1637504982,1621067638000,1621067638246,0,0,0,,,,,,,,,,, +17598,4456,content://media/external/images/media/4456,/storage/emulated/0/DCIM/Camera/IMG_20210515_103321.jpg,image/jpeg,4000,2250,0,7434694,,1637505068,1621067604000,1621067604281,0,0,0,,,,,,,,,,, +17599,3385,content://media/external/images/media/3385,/storage/emulated/0/DCIM/Camera/IMG_20210515_103138.jpg,image/jpeg,4160,2340,0,6209952,,1637502523,1621067499000,1621067498912,0,0,0,,,,,,,,,,, +17600,3748,content://media/external/images/media/3748,/storage/emulated/0/DCIM/Camera/IMG_20210515_103134.jpg,image/jpeg,4160,2340,0,6341251,,1637503488,1621067495000,1621067494840,0,0,0,,,,,,,,,,, +17601,4003,content://media/external/images/media/4003,/storage/emulated/0/DCIM/Camera/IMG_20210515_103112.jpg,image/jpeg,4000,2250,0,6146567,,1637504086,1621067475000,1621067475495,0,0,0,,,,,,,,,,, +17602,4325,content://media/external/images/media/4325,/storage/emulated/0/DCIM/Camera/IMG_20210512_232119.jpg,image/jpeg,4000,2250,0,4468066,,1637504895,1620854483000,1620854483147,0,0,0,,,,,,,,,,, +17603,3609,content://media/external/images/media/3609,/storage/emulated/0/DCIM/Camera/IMG_20210511_121350.jpg,image/jpeg,4000,2250,90,4259165,,1637503238,1620728033000,1620728033339,0,0,0,,,,,,,,,,, +17604,3643,content://media/external/images/media/3643,/storage/emulated/0/DCIM/Camera/IMG_20210511_121256.jpg,image/jpeg,4000,2250,90,4533840,,1637503301,1620727978000,1620727978292,0,0,0,,,,,,,,,,, +17605,3878,content://media/external/images/media/3878,/storage/emulated/0/DCIM/Camera/IMG_20210511_121219.jpg,image/jpeg,4000,2250,0,4460000,,1637503729,1620727942000,1620727942217,0,0,0,,,,,,,,,,, +17606,3151,content://media/external/images/media/3151,/storage/emulated/0/DCIM/Camera/IMG_20210511_121215.jpg,image/jpeg,4000,2250,0,4399902,,1637502130,1620727939000,1620727939505,0,0,0,,,,,,,,,,, +17607,3053,content://media/external/images/media/3053,/storage/emulated/0/DCIM/Camera/IMG_20210511_080342.jpg,image/jpeg,4000,2250,0,7617836,,1637501858,1620713026000,1620713026087,0,0,0,,,,,,,,,,, +17608,2744,content://media/external/images/media/2744,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-10-22-52-15-341_com.strava.jpg,image/jpeg,1080,2340,0,629952,,1637500987,1620679935000,0,0,0,0,,,,,,,,,,, +17609,2743,content://media/external/images/media/2743,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-10-22-09-47-430_com.brytonsport.active.jpg,image/jpeg,1080,2340,0,618877,,1637500987,1620677387000,0,0,0,0,,,,,,,,,,, +17610,4921,content://media/external/images/media/4921,/storage/emulated/0/DCIM/Camera/PANO_20210510_192704.jpg,image/jpeg,5840,3680,0,15158818,,1637505944,1620667630000,0,0,0,0,,,,,,,,,,, +17611,3368,content://media/external/images/media/3368,/storage/emulated/0/DCIM/Camera/PANO_20210510_192648.jpg,image/jpeg,6704,3552,0,14600528,,1637502451,1620667617000,0,0,0,0,,,,,,,,,,, +17612,3791,content://media/external/images/media/3791,/storage/emulated/0/DCIM/Camera/IMG_20210510_192145.jpg,image/jpeg,4000,2250,0,6878863,,1637503558,1620667308000,1620667308372,0,0,0,,,,,,,,,,, +17613,3348,content://media/external/images/media/3348,/storage/emulated/0/DCIM/Camera/IMG_20210510_191400.jpg,image/jpeg,4000,2250,0,6711810,,1637502439,1620666843000,1620666842857,0,0,0,,,,,,,,,,, +17614,3158,content://media/external/images/media/3158,/storage/emulated/0/DCIM/Camera/PANO_20210510_183453.jpg,image/jpeg,6160,3680,0,19157435,,1637502130,1620664503000,0,0,0,0,,,,,,,,,,, +17615,4425,content://media/external/images/media/4425,/storage/emulated/0/DCIM/Camera/PANO_20210510_182738.jpg,image/jpeg,7056,3360,0,20601930,,1637505063,1620664065000,0,0,0,0,,,,,,,,,,, +17616,7248,content://media/external/images/media/7248,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0021.jpg",image/jpeg,1536,2048,0,207397,,1637518223,1620655295000,0,0,0,0,,,,,,,,,,, +17617,6531,content://media/external/images/media/6531,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0020.jpg",image/jpeg,1536,2048,0,253237,,1637518221,1620655292000,0,0,0,0,,,,,,,,,,, +17618,6742,content://media/external/images/media/6742,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0019.jpg",image/jpeg,2048,1536,0,299510,,1637518222,1620655286000,0,0,0,0,,,,,,,,,,, +17619,7412,content://media/external/images/media/7412,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0018.jpg",image/jpeg,2048,1536,0,257270,,1637518223,1620655286000,0,0,0,0,,,,,,,,,,, +17620,7144,content://media/external/images/media/7144,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0016.jpg",image/jpeg,1536,2048,0,649124,,1637518222,1620655285000,0,0,0,0,,,,,,,,,,, +17621,7145,content://media/external/images/media/7145,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0017.jpg",image/jpeg,1536,2048,0,414928,,1637518222,1620655285000,0,0,0,0,,,,,,,,,,, +17622,3712,content://media/external/images/media/3712,/storage/emulated/0/DCIM/Camera/IMG_20210507_214529.jpg,image/jpeg,4000,2250,90,4063891,,1637503393,1620416731000,1620416731274,0,0,0,,,,,,,,,,, +17623,3628,content://media/external/images/media/3628,/storage/emulated/0/DCIM/Camera/IMG_20210507_214527.jpg,image/jpeg,4000,2250,90,4125236,,1637503272,1620416728000,1620416728695,0,0,0,,,,,,,,,,, +17624,4894,content://media/external/images/media/4894,/storage/emulated/0/DCIM/Camera/IMG_20210507_214446.jpg,image/jpeg,4000,2250,0,4159509,,1637505920,1620416688000,1620416688472,0,0,0,,,,,,,,,,, +17625,4208,content://media/external/images/media/4208,/storage/emulated/0/DCIM/Camera/IMG_20210507_112903.jpg,image/jpeg,4000,2250,0,5144404,,1637504640,1620379746000,1620379746467,0,0,0,,,,,,,,,,, +17626,3711,content://media/external/images/media/3711,/storage/emulated/0/DCIM/Camera/IMG_20210503_222931.jpg,image/jpeg,4000,2250,90,5312232,,1637503393,1620073776000,1620073776638,0,0,0,,,,,,,,,,, +17627,4170,content://media/external/images/media/4170,/storage/emulated/0/DCIM/Camera/IMG_20210503_222924.jpg,image/jpeg,4000,2250,90,5291587,,1637504556,1620073769000,1620073769821,0,0,0,,,,,,,,,,, +17628,3401,content://media/external/images/media/3401,/storage/emulated/0/DCIM/Camera/IMG_20210503_222915.jpg,image/jpeg,4000,2250,90,4469376,,1637502598,1620073759000,1620073759434,0,0,0,,,,,,,,,,, +17629,7143,content://media/external/images/media/7143,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210502-WA0005.jpg",image/jpeg,2048,1536,0,189587,,1637518222,1619948046000,0,0,0,0,,,,,,,,,,, +17630,6297,content://media/external/images/media/6297,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210502-WA0004.jpg",image/jpeg,1024,768,0,93555,,1637518221,1619948044000,0,0,0,0,,,,,,,,,,, +17631,7573,content://media/external/images/media/7573,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210502-WA0003.jpg",image/jpeg,768,1024,0,237313,,1637518223,1619946489000,0,0,0,0,,,,,,,,,,, +17632,7411,content://media/external/images/media/7411,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0055.jpg",image/jpeg,1200,1600,0,410077,,1637518223,1619882814000,0,0,0,0,,,,,,,,,,, +17633,6419,content://media/external/images/media/6419,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0040.jpg",image/jpeg,750,1334,0,119000,,1637518221,1619882760000,0,0,0,0,,,,,,,,,,, +17634,6739,content://media/external/images/media/6739,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0007.jpg",image/jpeg,750,1334,0,181992,,1637518222,1619882760000,0,0,0,0,,,,,,,,,,, +17635,6850,content://media/external/images/media/6850,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0054.jpg",image/jpeg,768,1024,0,149325,,1637518222,1619879780000,0,0,0,0,,,,,,,,,,, +17636,6849,content://media/external/images/media/6849,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0053.jpg",image/jpeg,768,1024,0,152135,,1637518222,1619879779000,0,0,0,0,,,,,,,,,,, +17637,6296,content://media/external/images/media/6296,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0045.jpg",image/jpeg,1600,1200,0,360997,,1637518221,1619879258000,0,0,0,0,,,,,,,,,,, +17638,6529,content://media/external/images/media/6529,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0044.jpg",image/jpeg,1200,1600,0,257211,,1637518221,1619879258000,0,0,0,0,,,,,,,,,,, +17639,6295,content://media/external/images/media/6295,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0041.jpg",image/jpeg,750,1334,0,127775,,1637518221,1619879252000,0,0,0,0,,,,,,,,,,, +17640,6418,content://media/external/images/media/6418,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0039.jpg",image/jpeg,1200,1600,0,261800,,1637518221,1619879251000,0,0,0,0,,,,,,,,,,, +17641,6848,content://media/external/images/media/6848,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0038.jpg",image/jpeg,1200,1600,0,375379,,1637518222,1619879251000,0,0,0,0,,,,,,,,,,, +17642,6741,content://media/external/images/media/6741,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0037.jpg",image/jpeg,1200,1600,0,255127,,1637518222,1619879250000,0,0,0,0,,,,,,,,,,, +17643,7247,content://media/external/images/media/7247,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0035.jpg",image/jpeg,1600,1200,0,312427,,1637518223,1619879248000,0,0,0,0,,,,,,,,,,, +17644,6528,content://media/external/images/media/6528,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0034.jpg",image/jpeg,1086,1600,0,214207,,1637518221,1619879247000,0,0,0,0,,,,,,,,,,, +17645,6847,content://media/external/images/media/6847,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0033.jpg",image/jpeg,1200,1600,0,399104,,1637518222,1619879247000,0,0,0,0,,,,,,,,,,, +17646,6527,content://media/external/images/media/6527,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0032.jpg",image/jpeg,408,1600,0,107487,,1637518221,1619879246000,0,0,0,0,,,,,,,,,,, +17647,6844,content://media/external/images/media/6844,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0031.jpg",image/jpeg,1200,1600,0,260679,,1637518222,1619879246000,0,0,0,0,,,,,,,,,,, +17648,6846,content://media/external/images/media/6846,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0030.jpg",image/jpeg,1200,1600,0,259861,,1637518222,1619879245000,0,0,0,0,,,,,,,,,,, +17649,7410,content://media/external/images/media/7410,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0026.jpg",image/jpeg,454,1600,0,118607,,1637518223,1619879226000,0,0,0,0,,,,,,,,,,, +17650,6417,content://media/external/images/media/6417,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0024.jpg",image/jpeg,1200,1600,0,236002,,1637518221,1619879210000,0,0,0,0,,,,,,,,,,, +17651,6740,content://media/external/images/media/6740,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0021.jpg",image/jpeg,1600,1200,0,359930,,1637518222,1619879177000,0,0,0,0,,,,,,,,,,, +17652,6293,content://media/external/images/media/6293,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0019.jpg",image/jpeg,1600,1200,0,357436,,1637518221,1619879171000,0,0,0,0,,,,,,,,,,, +17653,4666,content://media/external/images/media/4666,/storage/emulated/0/DCIM/Camera/IMG_20210501_131608.jpg,image/jpeg,4000,2250,0,6892574,,1637505418,1619867770000,1619867770269,0,0,0,,,,,,,,,,, +17654,4847,content://media/external/images/media/4847,/storage/emulated/0/DCIM/Camera/IMG_20210501_131607.jpg,image/jpeg,4000,2250,0,6728669,,1637505753,1619867768000,1619867768558,0,0,0,,,,,,,,,,, +17655,3308,content://media/external/images/media/3308,/storage/emulated/0/DCIM/Camera/IMG_20210501_131559.jpg,image/jpeg,4000,2250,90,5458200,,1637502430,1619867760000,1619867760897,0,0,0,,,,,,,,,,, +17656,4868,content://media/external/images/media/4868,/storage/emulated/0/DCIM/Camera/IMG_20210501_131552.jpg,image/jpeg,4000,2250,90,5916700,,1637505831,1619867754000,1619867753943,0,0,0,,,,,,,,,,, +17657,4510,content://media/external/images/media/4510,/storage/emulated/0/DCIM/Camera/IMG_20210501_131530.jpg,image/jpeg,4000,2250,0,6240808,,1637505160,1619867731000,1619867731859,0,0,0,,,,,,,,,,, +17658,4490,content://media/external/images/media/4490,/storage/emulated/0/DCIM/Camera/IMG_20210501_131519.jpg,image/jpeg,4000,2250,0,6365439,,1637505122,1619867721000,1619867721542,0,0,0,,,,,,,,,,, +17659,4867,content://media/external/images/media/4867,/storage/emulated/0/DCIM/Camera/IMG_20210501_120734.jpg,image/jpeg,4160,2340,0,5381392,,1637505831,1619863654000,1619863654465,0,0,0,,,,,,,,,,, +17660,4984,content://media/external/images/media/4984,/storage/emulated/0/DCIM/Camera/IMG_20210501_120339.jpg,image/jpeg,4000,2250,90,6996546,,1637506097,1619863420000,1619863420878,0,0,0,,,,,,,,,,, +17661,3496,content://media/external/images/media/3496,/storage/emulated/0/DCIM/Camera/IMG_20210501_120338.jpg,image/jpeg,4000,2250,90,7291707,,1637502870,1619863419000,1619863419252,0,0,0,,,,,,,,,,, +17662,4002,content://media/external/images/media/4002,/storage/emulated/0/DCIM/Camera/IMG_20210501_120320.jpg,image/jpeg,4000,2250,90,6947261,,1637504086,1619863402000,1619863401894,0,0,0,,,,,,,,,,, +17663,4156,content://media/external/images/media/4156,/storage/emulated/0/DCIM/Camera/IMG_20210501_114114.jpg,image/jpeg,4000,2250,90,6052023,,1637504481,1619862076000,1619862076129,0,0,0,,,,,,,,,,, +17664,4312,content://media/external/images/media/4312,/storage/emulated/0/DCIM/Camera/IMG_20210501_113721.jpg,image/jpeg,4160,2340,90,5815782,,1637504817,1619861841000,1619861841823,0,0,0,,,,,,,,,,, +17665,3688,content://media/external/images/media/3688,/storage/emulated/0/DCIM/Camera/IMG_20210501_113713.jpg,image/jpeg,4160,2340,90,5881644,,1637503390,1619861833000,1619861833644,0,0,0,,,,,,,,,,, +17666,4983,content://media/external/images/media/4983,/storage/emulated/0/DCIM/Camera/IMG_20210501_113649.jpg,image/jpeg,4000,2250,90,5848568,,1637506097,1619861811000,1619861811385,0,0,0,,,,,,,,,,, +17667,2931,content://media/external/images/media/2931,/storage/emulated/0/DCIM/Camera/IMG_20210501_113630.jpg,image/jpeg,4000,2250,0,7176339,,1637501599,1619861792000,1619861791998,0,0,0,,,,,,,,,,, +17668,3627,content://media/external/images/media/3627,/storage/emulated/0/DCIM/Camera/IMG_20210501_112416.jpg,image/jpeg,4000,2250,90,6209190,,1637503272,1619861058000,1619861058625,0,0,0,,,,,,,,,,, +17669,3710,content://media/external/images/media/3710,/storage/emulated/0/DCIM/Camera/IMG_20210501_112246.jpg,image/jpeg,4000,2250,90,5471893,,1637503393,1619860971000,1619860970878,0,0,0,,,,,,,,,,, +17670,2930,content://media/external/images/media/2930,/storage/emulated/0/DCIM/Camera/IMG_20210501_111843.jpg,image/jpeg,4000,2250,90,6699184,,1637501599,1619860727000,1619860727529,0,0,0,,,,,,,,,,, +17671,2848,content://media/external/images/media/2848,/storage/emulated/0/DCIM/Camera/IMG_20210501_111628.jpg,image/jpeg,2250,4000,0,4155879,,1637501431,1619860589000,1619860248923,0,0,0,,,,,,,,,,, +17672,7142,content://media/external/images/media/7142,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0008.jpg",image/jpeg,750,1334,0,136110,,1637518222,1619860479000,0,0,0,0,,,,,,,,,,, +17673,4229,content://media/external/images/media/4229,/storage/emulated/0/DCIM/Camera/IMG_20210501_111047.jpg,image/jpeg,4000,2250,90,5296945,,1637504726,1619860248000,1619860248923,0,0,0,,,,,,,,,,, +17674,3945,content://media/external/images/media/3945,/storage/emulated/0/DCIM/Camera/IMG_20210501_111041.jpg,image/jpeg,4000,2250,90,5963770,,1637503853,1619860242000,1619860242457,0,0,0,,,,,,,,,,, +17675,3495,content://media/external/images/media/3495,/storage/emulated/0/DCIM/Camera/IMG_20210501_110905.jpg,image/jpeg,4000,2250,90,5604992,,1637502870,1619860147000,1619860147364,0,0,0,,,,,,,,,,, +17676,3587,content://media/external/images/media/3587,/storage/emulated/0/DCIM/Camera/IMG_20210501_110833.jpg,image/jpeg,4000,2250,0,5067564,,1637503154,1619860115000,1619860115213,0,0,0,,,,,,,,,,, +17677,4402,content://media/external/images/media/4402,/storage/emulated/0/DCIM/Camera/IMG_20210501_110828.jpg,image/jpeg,4000,2250,0,5680743,,1637505004,1619860109000,1619860109361,0,0,0,,,,,,,,,,, +17678,4357,content://media/external/images/media/4357,/storage/emulated/0/DCIM/Camera/IMG_20210501_110824.jpg,image/jpeg,4000,2250,90,5127929,,1637504970,1619860105000,1619860105696,0,0,0,,,,,,,,,,, +17679,3052,content://media/external/images/media/3052,/storage/emulated/0/DCIM/Camera/IMG_20210501_110803.jpg,image/jpeg,4000,2250,90,6160966,,1637501858,1619860085000,1619860085096,0,0,0,,,,,,,,,,, +17680,4550,content://media/external/images/media/4550,/storage/emulated/0/DCIM/Camera/IMG_20210501_110724.jpg,image/jpeg,4000,2250,90,4058118,,1637505187,1619860045000,1619860045015,0,0,0,,,,,,,,,,, +17681,3626,content://media/external/images/media/3626,/storage/emulated/0/DCIM/Camera/IMG_20210501_110721.jpg,image/jpeg,4000,2250,90,3819312,,1637503271,1619860042000,1619860042563,0,0,0,,,,,,,,,,, +17682,4120,content://media/external/images/media/4120,/storage/emulated/0/DCIM/Camera/IMG_20210501_110719.jpg,image/jpeg,4000,2250,90,3850824,,1637504451,1619860041000,1619860041319,0,0,0,,,,,,,,,,, +17683,2929,content://media/external/images/media/2929,/storage/emulated/0/DCIM/Camera/IMG_20210501_105959.jpg,image/jpeg,4000,2250,90,5227224,,1637501599,1619859602000,1619859602166,0,0,0,,,,,,,,,,, +17684,4635,content://media/external/images/media/4635,/storage/emulated/0/DCIM/Camera/IMG_20210501_105935.jpg,image/jpeg,4000,2250,90,6454547,,1637505390,1619859578000,1619859578619,0,0,0,,,,,,,,,,, +17685,3232,content://media/external/images/media/3232,/storage/emulated/0/DCIM/Camera/IMG_20210501_105822.jpg,image/jpeg,4000,2250,0,4830134,,1637502258,1619859503000,1619859021615,0,0,0,,,,,,,,,,, +17686,3291,content://media/external/images/media/3291,/storage/emulated/0/DCIM/Camera/IMG_20210501_105537.jpg,image/jpeg,2250,4000,0,6183605,,1637502355,1619859338000,1619859209894,0,0,0,,,,,,,,,,, +17687,3665,content://media/external/images/media/3665,/storage/emulated/0/DCIM/Camera/IMG_20210501_105440.jpg,image/jpeg,2250,4000,0,5484491,,1637503358,1619859282000,1619859209894,0,0,0,,,,,,,,,,, +17688,4419,content://media/external/images/media/4419,/storage/emulated/0/DCIM/Camera/IMG_20210501_105328.jpg,image/jpeg,4000,2250,90,6738125,,1637505063,1619859209000,1619859209894,0,0,0,,,,,,,,,,, +17689,3248,content://media/external/images/media/3248,/storage/emulated/0/DCIM/Camera/IMG_20210501_105019.jpg,image/jpeg,4000,2250,0,5853805,,1637502259,1619859021000,1619859021615,0,0,0,,,,,,,,,,, +17690,3009,content://media/external/images/media/3009,/storage/emulated/0/DCIM/Camera/IMG_20210501_101927.jpg,image/jpeg,4000,2250,90,6857991,,1637501786,1619857169000,1619857169457,0,0,0,,,,,,,,,,, +17691,3537,content://media/external/images/media/3537,/storage/emulated/0/DCIM/Camera/IMG_20210501_101925.jpg,image/jpeg,4000,2250,90,6752936,,1637503010,1619857167000,1619857167167,0,0,0,,,,,,,,,,, +17692,3608,content://media/external/images/media/3608,/storage/emulated/0/DCIM/Camera/IMG_20210501_101926.jpg,image/jpeg,4000,2250,90,6847683,,1637503238,1619857167000,1619857166999,0,0,0,,,,,,,,,,, +17693,3900,content://media/external/images/media/3900,/storage/emulated/0/DCIM/Camera/IMG_20210501_101922.jpg,image/jpeg,4000,2250,90,6651366,,1637503732,1619857166000,1619857165715,0,0,0,,,,,,,,,,, +17694,7152,content://media/external/images/media/7152,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG_20210426_220825.jpg",image/jpeg,277,412,0,58943,,1637518222,1619467705000,0,0,0,0,,,,,,,,,,, +17695,6294,content://media/external/images/media/6294,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0015.jpg",image/jpeg,1024,768,0,156257,,1637518221,1619466899000,0,0,0,0,,,,,,,,,,, +17696,6843,content://media/external/images/media/6843,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0016.jpg",image/jpeg,1024,768,0,150627,,1637518222,1619466899000,0,0,0,0,,,,,,,,,,, +17697,6845,content://media/external/images/media/6845,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0017.jpg",image/jpeg,768,1024,0,112325,,1637518222,1619466899000,0,0,0,0,,,,,,,,,,, +17698,7141,content://media/external/images/media/7141,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0013.jpg",image/jpeg,1024,768,0,149428,,1637518222,1619466899000,0,0,0,0,,,,,,,,,,, +17699,7246,content://media/external/images/media/7246,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0014.jpg",image/jpeg,1024,768,0,154189,,1637518223,1619466899000,0,0,0,0,,,,,,,,,,, +17700,7245,content://media/external/images/media/7245,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0010.jpg",image/jpeg,738,1600,0,81616,,1637518223,1619450974000,0,0,0,0,,,,,,,,,,, +17701,6738,content://media/external/images/media/6738,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0009.jpg",image/jpeg,1200,1600,0,185252,,1637518222,1619446060000,0,0,0,0,,,,,,,,,,, +17702,6416,content://media/external/images/media/6416,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0030.jpg",image/jpeg,1200,1600,0,300281,,1637518221,1619375982000,0,0,0,0,,,,,,,,,,, +17703,6842,content://media/external/images/media/6842,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0029.jpg",image/jpeg,1200,1600,0,295756,,1637518222,1619375981000,0,0,0,0,,,,,,,,,,, +17704,6841,content://media/external/images/media/6841,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0019.jpg",image/jpeg,1536,2048,0,732464,,1637518222,1619363135000,0,0,0,0,,,,,,,,,,, +17705,7140,content://media/external/images/media/7140,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0018.jpg",image/jpeg,2048,1536,0,606252,,1637518222,1619363078000,0,0,0,0,,,,,,,,,,, +17706,6526,content://media/external/images/media/6526,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0011.jpg",image/jpeg,1024,768,0,127055,,1637518221,1619355437000,0,0,0,0,,,,,,,,,,, +17707,2650,content://media/external/images/media/2650,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-04-24-18-00-34-132_com.strava.jpg,image/jpeg,1080,2340,0,578683,,1637500870,1619280034000,0,0,0,0,,,,,,,,,,, +17708,6414,content://media/external/images/media/6414,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210421-WA0004.jpg",image/jpeg,1079,980,0,39842,,1637518221,1619022492000,0,0,0,0,,,,,,,,,,, +17709,7534,content://media/external/images/media/7534,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210420-WA0002.jpg",image/jpeg,1600,1296,0,210338,,1637518223,1618909756000,0,0,0,0,,,,,,,,,,, +17710,7302,content://media/external/images/media/7302,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210420-WA0001.jpg",image/jpeg,1600,1450,0,182443,,1637518223,1618909755000,0,0,0,0,,,,,,,,,,, +17711,2705,content://media/external/images/media/2705,/storage/emulated/0/DCIM/Screenshots/IMG_20210418_185707.jpg,image/jpeg,1005,1227,0,226073,,1637500987,1618765027000,0,0,0,0,,,,,,,,,,, +17712,2689,content://media/external/images/media/2689,/storage/emulated/0/Pictures/AdobeLightroom/IMG_20210418_142609.jpg,image/jpeg,4160,2340,0,5420450,,1637500871,1618748770000,1618748644074,0,0,0,,,,,,,,,,, +17713,2688,content://media/external/images/media/2688,/storage/emulated/0/Pictures/AdobeLightroom/IMG_20210418_105404.jpg,image/jpeg,4160,2340,0,4440803,,1637500871,1618748629000,1618748644074,0,0,0,,,,,,,,,,, +17714,2649,content://media/external/images/media/2649,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-04-18-14-12-25-530_com.dopa.android.blevo.jpg,image/jpeg,1080,2340,0,475153,,1637500870,1618747945000,0,0,0,0,,,,,,,,,,, +17715,6291,content://media/external/images/media/6291,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0003.jpg",image/jpeg,1500,2000,0,490702,,1637518221,1618747783000,0,0,0,0,,,,,,,,,,, +17716,6524,content://media/external/images/media/6524,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0005.jpg",image/jpeg,1500,2000,0,518655,,1637518221,1618747783000,0,0,0,0,,,,,,,,,,, +17717,6737,content://media/external/images/media/6737,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0002.jpg",image/jpeg,1536,2048,0,256052,,1637518222,1618747783000,0,0,0,0,,,,,,,,,,, +17718,6292,content://media/external/images/media/6292,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0008.jpg",image/jpeg,2000,1500,0,485671,,1637518221,1618740969000,0,0,0,0,,,,,,,,,,, +17719,7139,content://media/external/images/media/7139,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0004.jpg",image/jpeg,1500,2000,0,593373,,1637518222,1618740966000,0,0,0,0,,,,,,,,,,, +17720,6840,content://media/external/images/media/6840,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0001.jpg",image/jpeg,1536,2048,0,283068,,1637518222,1618740961000,0,0,0,0,,,,,,,,,,, +17721,3850,content://media/external/images/media/3850,/storage/emulated/0/DCIM/Camera/IMG_20210418_105404.jpg,image/jpeg,4160,2340,0,5382458,,1637503642,1618736044000,1618736044074,0,0,0,,,,,,,,,,, +17722,6736,content://media/external/images/media/6736,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210417-WA0008.jpg",image/jpeg,1536,2048,0,486658,,1637518222,1618684799000,0,0,0,0,,,,,,,,,,, +17723,6839,content://media/external/images/media/6839,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210416-WA0010.jpg",image/jpeg,1536,2048,0,249059,,1637518222,1618554657000,0,0,0,0,,,,,,,,,,, +17724,4376,content://media/external/images/media/4376,/storage/emulated/0/DCIM/Camera/IMG_20210414_212118.jpg,image/jpeg,5184,2916,0,2954257,,1637504982,1618428079000,1618427939500,0,0,0,,,,,,,,,,, +17725,4022,content://media/external/images/media/4022,/storage/emulated/0/DCIM/Camera/IMG_20210414_211935.jpg,image/jpeg,5184,2916,180,4053192,,1637504201,1618427977000,1618427977620,0,0,0,,,,,,,,,,, +17726,2993,content://media/external/images/media/2993,/storage/emulated/0/DCIM/Camera/IMG_20210414_211933.jpg,image/jpeg,5184,2916,180,3952800,,1637501771,1618427976000,1618427975978,0,0,0,,,,,,,,,,, +17727,3520,content://media/external/images/media/3520,/storage/emulated/0/DCIM/Camera/IMG_20210414_211932.jpg,image/jpeg,5184,2916,180,3988035,,1637502970,1618427974000,1618427974062,0,0,0,,,,,,,,,,, +17728,2811,content://media/external/images/media/2811,/storage/emulated/0/DCIM/Camera/IMG_20210414_211900.jpg,image/jpeg,5184,2916,0,4237656,,1637501312,1618427942000,1618427942304,0,0,0,,,,,,,,,,, +17729,3899,content://media/external/images/media/3899,/storage/emulated/0/DCIM/Camera/IMG_20210414_211857.jpg,image/jpeg,5184,2916,0,4089503,,1637503732,1618427939000,1618427939500,0,0,0,,,,,,,,,,, +17730,3586,content://media/external/images/media/3586,/storage/emulated/0/DCIM/Camera/IMG_20210414_211854.jpg,image/jpeg,5184,2916,0,4345814,,1637503154,1618427936000,1618427936582,0,0,0,,,,,,,,,,, +17731,7300,content://media/external/images/media/7300,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210414-WA0000.jpg",image/jpeg,1536,2048,0,719485,,1637518223,1618380953000,0,0,0,0,,,,,,,,,,, +17732,2687,content://media/external/images/media/2687,/storage/emulated/0/Pictures/AdobeLightroom/IMG_20210413_213711.jpg,image/jpeg,5184,2916,0,2820729,,1637500871,1618343273000,1618343532470,0,0,0,,,,,,,,,,, +17733,4801,content://media/external/images/media/4801,/storage/emulated/0/DCIM/Camera/IMG_20210413_213802.jpg,image/jpeg,5184,2916,0,2830302,,1637505663,1618342683000,1618342632470,0,0,0,,,,,,,,,,, +17734,4703,content://media/external/images/media/4703,/storage/emulated/0/DCIM/Camera/IMG_20210413_213711.jpg,image/jpeg,5184,2916,0,3762516,,1637505509,1618342632000,1618342632470,0,0,0,,,,,,,,,,, +17735,3094,content://media/external/images/media/3094,/storage/emulated/0/DCIM/Camera/IMG_20210413_213708.jpg,image/jpeg,5184,2916,0,3876842,,1637501971,1618342630000,1618342630294,0,0,0,,,,,,,,,,, +17736,4508,content://media/external/images/media/4508,/storage/emulated/0/DCIM/Camera/IMG_20210413_213512.jpg,image/jpeg,4000,2250,180,4526950,,1637505160,1618342514000,1618342514067,0,0,0,,,,,,,,,,, +17737,3384,content://media/external/images/media/3384,/storage/emulated/0/DCIM/Camera/IMG_20210413_213409.jpg,image/jpeg,4000,2250,180,4457230,,1637502523,1618342450000,1618342450924,0,0,0,,,,,,,,,,, +17738,5022,content://media/external/images/media/5022,/storage/emulated/0/DCIM/Camera/IMG_20210413_213331.jpg,image/jpeg,4000,2250,180,4456419,,1637506134,1618342412000,1618342412297,0,0,0,,,,,,,,,,, +17739,4665,content://media/external/images/media/4665,/storage/emulated/0/DCIM/Camera/IMG_20210413_213203.jpg,image/jpeg,4000,2250,180,4594270,,1637505418,1618342325000,1618342325329,0,0,0,,,,,,,,,,, +17740,4610,content://media/external/images/media/4610,/storage/emulated/0/DCIM/Camera/IMG_20210413_212344.jpg,image/jpeg,4000,2250,0,4476279,,1637505308,1618341826000,1618341826229,0,0,0,,,,,,,,,,, +17741,3268,content://media/external/images/media/3268,/storage/emulated/0/DCIM/Camera/IMG_20210413_074852.jpg,image/jpeg,4000,2250,90,4650758,,1637502342,1618292934000,1618292934567,0,0,0,,,,,,,,,,, +17742,2742,content://media/external/images/media/2742,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-04-09-08-27-45-406_com.brytonsport.active.jpg,image/jpeg,1080,2340,0,613861,,1637500987,1617949665000,0,0,0,0,,,,,,,,,,, +17743,3231,content://media/external/images/media/3231,/storage/emulated/0/DCIM/Camera/IMG_20210408_201456.jpg,image/jpeg,4000,2250,90,4710120,,1637502258,1617905698000,1617905698283,0,0,0,,,,,,,,,,, +17744,4189,content://media/external/images/media/4189,/storage/emulated/0/DCIM/Camera/IMG_20210407_173649.jpg,image/jpeg,4000,2250,90,4594038,,1637504558,1617809811000,1617809811228,0,0,0,,,,,,,,,,, +17745,7532,content://media/external/images/media/7532,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210406-WA0011.jpg",image/jpeg,899,1599,0,164529,,1637518223,1617720906000,0,0,0,0,,,,,,,,,,, +17746,7533,content://media/external/images/media/7533,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210406-WA0009.jpg",image/jpeg,899,1599,0,246904,,1637518223,1617715126000,0,0,0,0,,,,,,,,,,, +17747,6838,content://media/external/images/media/6838,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210406-WA0008.jpg",image/jpeg,899,1599,0,208282,,1637518222,1617714180000,0,0,0,0,,,,,,,,,,, +17748,7409,content://media/external/images/media/7409,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210406-WA0007.jpg",image/jpeg,1152,2048,0,515004,,1637518223,1617714151000,0,0,0,0,,,,,,,,,,, +17749,2992,content://media/external/images/media/2992,/storage/emulated/0/DCIM/Camera/IMG_20210403_105452.jpg,image/jpeg,4000,2250,90,8192143,,1637501771,1617440094000,1617440093982,0,0,0,,,,,,,,,,, +17750,4021,content://media/external/images/media/4021,/storage/emulated/0/DCIM/Camera/IMG_20210403_105441.jpg,image/jpeg,4000,2250,0,8950263,,1637504201,1617440084000,1617440083935,0,0,0,,,,,,,,,,, +17751,2648,content://media/external/images/media/2648,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-04-01-18-49-27-951_com.strava.jpg,image/jpeg,1080,2340,0,498472,,1637500870,1617295768000,0,0,0,0,,,,,,,,,,, +17752,6735,content://media/external/images/media/6735,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0035.jpeg",image/jpeg,3840,2160,0,2201782,,1637518222,1616954224000,1616954224655,0,0,0,,,,,,,,,,, +17753,2741,content://media/external/images/media/2741,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-03-28-19-36-34-272_com.google.android.googlequicksearchbox.jpg,image/jpeg,1080,2340,0,652883,,1637500987,1616952994000,0,0,0,0,,,,,,,,,,, +17754,6290,content://media/external/images/media/6290,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0023.jpg",image/jpeg,972,1296,0,104186,,1637518221,1616951366000,0,0,0,0,,,,,,,,,,, +17755,6734,content://media/external/images/media/6734,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0022.jpg",image/jpeg,1200,1600,0,108189,,1637518222,1616951366000,0,0,0,0,,,,,,,,,,, +17756,6525,content://media/external/images/media/6525,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0021.jpg",image/jpeg,1600,900,0,279990,,1637518221,1616951365000,0,0,0,0,,,,,,,,,,, +17757,7531,content://media/external/images/media/7531,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0019.jpg",image/jpeg,1200,1600,0,452339,,1637518223,1616950771000,0,0,0,0,,,,,,,,,,, +17758,7572,content://media/external/images/media/7572,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0011.jpg",image/jpeg,1200,1600,0,126582,,1637518223,1616931739000,0,0,0,0,,,,,,,,,,, +17759,6733,content://media/external/images/media/6733,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0010.jpg",image/jpeg,901,1600,0,120755,,1637518222,1616926582000,0,0,0,0,,,,,,,,,,, +17760,6415,content://media/external/images/media/6415,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0009.jpg",image/jpeg,1600,901,0,109706,,1637518221,1616926576000,0,0,0,0,,,,,,,,,,, +17761,3625,content://media/external/images/media/3625,/storage/emulated/0/DCIM/Camera/IMG_20210328_112815.jpg,image/jpeg,4000,2250,0,6648805,,1637503271,1616923698000,1616923698353,0,0,0,,,,,,,,,,, +17762,3560,content://media/external/images/media/3560,/storage/emulated/0/DCIM/Camera/PANO_20210328_102259.jpg,image/jpeg,7888,3744,0,20989729,,1637503058,1616919790000,0,0,0,0,,,,,,,,,,, +17763,2957,content://media/external/images/media/2957,/storage/emulated/0/DCIM/Camera/PANO_20210328_102247.jpg,image/jpeg,2192,3776,0,5546925,,1637501661,1616919769000,0,0,0,0,,,,,,,,,,, +17764,6837,content://media/external/images/media/6837,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210327-WA0003.jpg",image/jpeg,954,2016,0,229343,,1637518222,1616836489000,0,0,0,0,,,,,,,,,,, +17765,7530,content://media/external/images/media/7530,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210326-WA0002.jpg",image/jpeg,720,668,0,51923,,1637518223,1616744151000,0,0,0,0,,,,,,,,,,, +17766,4549,content://media/external/images/media/4549,/storage/emulated/0/DCIM/Camera/IMG_20210319_182759.jpg,image/jpeg,4000,2250,90,5540599,,1637505187,1616174882000,1616174882485,0,0,0,,,,,,,,,,, +17767,3382,content://media/external/images/media/3382,/storage/emulated/0/DCIM/Camera/IMG_20210319_172427.jpg,image/jpeg,4160,2340,0,4933717,,1637502523,1616171067000,1616171067290,0,0,0,,,,,,,,,,, +17768,4065,content://media/external/images/media/4065,/storage/emulated/0/DCIM/Camera/IMG_20210319_103315.jpg,image/jpeg,4000,2250,0,4550609,,1637504342,1616146397000,1616146397337,0,0,0,,,,,,,,,,, +17769,3381,content://media/external/images/media/3381,/storage/emulated/0/DCIM/Camera/IMG_20210318_172129.jpg,image/jpeg,4000,2250,90,6225566,,1637502523,1616084503000,1616084503110,0,0,0,,,,,,,,,,, +17770,3208,content://media/external/images/media/3208,/storage/emulated/0/DCIM/Camera/IMG_20210318_172109.jpg,image/jpeg,4000,2250,90,5137483,,1637502256,1616084491000,1616084491402,0,0,0,,,,,,,,,,, +17771,4528,content://media/external/images/media/4528,/storage/emulated/0/DCIM/Camera/IMG_20210318_172058.jpg,image/jpeg,4000,2250,90,4753249,,1637505165,1616084460000,1616084460928,0,0,0,,,,,,,,,,, +17772,3664,content://media/external/images/media/3664,/storage/emulated/0/DCIM/Camera/IMG_20210318_172049.jpg,image/jpeg,4000,2250,0,5120823,,1637503358,1616084452000,1616084452838,0,0,0,,,,,,,,,,, +17773,4527,content://media/external/images/media/4527,/storage/emulated/0/DCIM/Camera/IMG_20210318_172006.jpg,image/jpeg,4000,2250,90,3044666,,1637505165,1616084410000,1616084410487,0,0,0,,,,,,,,,,, +17774,2991,content://media/external/images/media/2991,/storage/emulated/0/DCIM/Camera/IMG_20210318_111751.jpg,image/jpeg,4000,2250,90,5003807,,1637501771,1616062674000,1616062674594,0,0,0,,,,,,,,,,, +17775,7301,content://media/external/images/media/7301,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0037.jpg",image/jpeg,720,1600,0,103375,,1637518223,1616010302000,0,0,0,0,,,,,,,,,,, +17776,6835,content://media/external/images/media/6835,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0021.jpg",image/jpeg,749,714,0,51638,,1637518222,1615977997000,0,0,0,0,,,,,,,,,,, +17777,6289,content://media/external/images/media/6289,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0008.jpg",image/jpeg,1536,2048,0,417453,,1637518221,1615974850000,0,0,0,0,,,,,,,,,,, +17778,6523,content://media/external/images/media/6523,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0009.jpg",image/jpeg,1536,2048,0,294662,,1637518221,1615974850000,0,0,0,0,,,,,,,,,,, +17779,6288,content://media/external/images/media/6288,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0005.jpg",image/jpeg,1536,2048,0,599484,,1637518221,1615974848000,0,0,0,0,,,,,,,,,,, +17780,6413,content://media/external/images/media/6413,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0007.jpg",image/jpeg,946,2048,0,71703,,1637518221,1615974848000,0,0,0,0,,,,,,,,,,, +17781,6732,content://media/external/images/media/6732,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0006.jpg",image/jpeg,946,2048,0,70515,,1637518222,1615974848000,0,0,0,0,,,,,,,,,,, +17782,6285,content://media/external/images/media/6285,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210316-WA0011.jpg",image/jpeg,1153,2048,0,324879,,1637518221,1615914259000,0,0,0,0,,,,,,,,,,, +17783,7244,content://media/external/images/media/7244,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210316-WA0010.jpg",image/jpeg,1536,2048,0,407794,,1637518223,1615914235000,0,0,0,0,,,,,,,,,,, +17784,7529,content://media/external/images/media/7529,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210315-WA0012.jpg",image/jpeg,984,2048,0,158090,,1637518223,1615845149000,0,0,0,0,,,,,,,,,,, +17785,3943,content://media/external/images/media/3943,/storage/emulated/0/DCIM/Camera/IMG_20210315_101713.jpg,image/jpeg,4000,2250,0,7299756,,1637503853,1615799835000,1615799835331,0,0,0,,,,,,,,,,, +17786,6836,content://media/external/images/media/6836,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210314-WA0003.jpg",image/jpeg,1536,2048,0,267793,,1637518222,1615714605000,0,0,0,0,,,,,,,,,,, +17787,6731,content://media/external/images/media/6731,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210314-WA0002.jpg",image/jpeg,1080,1920,0,230934,,1637518222,1615707219000,0,0,0,0,,,,,,,,,,, +17788,7528,content://media/external/images/media/7528,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210314-WA0001.jpg",image/jpeg,1536,2048,0,227320,,1637518223,1615706538000,0,0,0,0,,,,,,,,,,, +17789,6412,content://media/external/images/media/6412,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210313-WA0026.jpg",image/jpeg,1280,720,0,60892,,1637518221,1615654321000,0,0,0,0,,,,,,,,,,, +17790,6287,content://media/external/images/media/6287,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210311-WA0008.jpg",image/jpeg,1536,2048,0,568558,,1637518221,1615481425000,0,0,0,0,,,,,,,,,,, +17791,6730,content://media/external/images/media/6730,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210311-WA0009.jpg",image/jpeg,1536,2048,0,652273,,1637518222,1615481425000,0,0,0,0,,,,,,,,,,, +17792,6410,content://media/external/images/media/6410,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210311-WA0007.jpg",image/jpeg,1536,2048,0,576508,,1637518221,1615481423000,0,0,0,0,,,,,,,,,,, +17793,2740,content://media/external/images/media/2740,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-03-10-20-22-16-963_com.stt.android.suunto.jpg,image/jpeg,1080,2340,0,290165,,1637500987,1615404137000,0,0,0,0,,,,,,,,,,, +17794,7243,content://media/external/images/media/7243,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210307-WA0024.jpg",image/jpeg,1200,1600,0,217382,,1637518223,1615143778000,0,0,0,0,,,,,,,,,,, +17795,2739,content://media/external/images/media/2739,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-03-07-14-15-21-516_com.brytonsport.active.jpg,image/jpeg,1080,2340,0,536896,,1637500987,1615122921000,0,0,0,0,,,,,,,,,,, +17796,7242,content://media/external/images/media/7242,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210307-WA0006.jpg",image/jpeg,1200,1600,0,228483,,1637518223,1615118376000,0,0,0,0,,,,,,,,,,, +17797,7571,content://media/external/images/media/7571,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210307-WA0004.jpg",image/jpeg,1200,1600,0,305117,,1637518223,1615112944000,0,0,0,0,,,,,,,,,,, +17798,3772,content://media/external/images/media/3772,/storage/emulated/0/DCIM/Camera/IMG_20210307_092233.jpg,image/jpeg,4000,2250,90,7709690,,1637503508,1615105356000,1615105356002,0,0,0,,,,,,,,,,, +17799,6729,content://media/external/images/media/6729,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210305-WA0012.jpg",image/jpeg,960,720,0,60069,,1637518222,1614967772000,0,0,0,0,,,,,,,,,,, +17800,4609,content://media/external/images/media/4609,/storage/emulated/0/DCIM/Camera/IMG_20210305_131155.jpg,image/jpeg,4000,2250,0,5266601,,1637505308,1614946319000,1614946319493,0,0,0,,,,,,,,,,, +17801,3535,content://media/external/images/media/3535,/storage/emulated/0/DCIM/Camera/IMG_20210301_115129.jpg,image/jpeg,4000,2250,90,4732635,,1637503010,1614595891000,1614595891289,0,0,0,,,,,,,,,,, +17802,4678,content://media/external/images/media/4678,/storage/emulated/0/DCIM/Camera/IMG_20210224_105850.jpg,image/jpeg,4000,2250,90,4634636,,1637505480,1614160733000,1614160732882,0,0,0,,,,,,,,,,, +17803,3957,content://media/external/images/media/3957,/storage/emulated/0/DCIM/Camera/IMG_20210221_190603.jpg,image/jpeg,4000,2250,0,5262686,,1637503942,1613930766000,1613930766249,0,0,0,,,,,,,,,,, +17804,2738,content://media/external/images/media/2738,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-02-21-08-08-41-976_de.komoot.android.jpg,image/jpeg,1080,2340,0,778868,,1637500987,1613891322000,0,0,0,0,,,,,,,,,,, +17805,2647,content://media/external/images/media/2647,/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-02-21-07-58-13-676_de.komoot.android.jpg,image/jpeg,1080,2340,0,329943,,1637500870,1613890693000,0,0,0,0,,,,,,,,,,, +17806,4931,content://media/external/images/media/4931,/storage/emulated/0/DCIM/Camera/IMG_20210220_132123.jpg,image/jpeg,4000,2250,90,3951382,,1637506010,1613823685000,1613823685419,0,0,0,,,,,,,,,,, +17807,3206,content://media/external/images/media/3206,/storage/emulated/0/DCIM/Camera/IMG_20210220_131626.jpg,image/jpeg,4000,2250,0,5564882,,1637502256,1613823387000,1613823387835,0,0,0,,,,,,,,,,, +17808,3607,content://media/external/images/media/3607,/storage/emulated/0/DCIM/Camera/IMG_20210220_131609.jpg,image/jpeg,4160,2340,0,6813600,,1637503238,1613823369000,1613823369281,0,0,0,,,,,,,,,,, +17809,6522,content://media/external/images/media/6522,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210220-WA0011.jpg",image/jpeg,1200,1600,0,515802,,1637518221,1613822709000,0,0,0,0,,,,,,,,,,, +17810,6411,content://media/external/images/media/6411,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210220-WA0010.jpg",image/jpeg,1200,1600,0,313954,,1637518221,1613822708000,0,0,0,0,,,,,,,,,,, +17811,6521,content://media/external/images/media/6521,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210220-WA0009.jpg",image/jpeg,1200,1600,0,505252,,1637518221,1613822707000,0,0,0,0,,,,,,,,,,, +17812,6834,content://media/external/images/media/6834,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210220-WA0008.jpg",image/jpeg,1200,1600,0,435872,,1637518222,1613822621000,0,0,0,0,,,,,,,,,,, +17813,4567,content://media/external/images/media/4567,/storage/emulated/0/DCIM/Camera/IMG_20210220_125433.jpg,image/jpeg,4000,2250,0,5518083,,1637505216,1613822075000,1613822075645,0,0,0,,,,,,,,,,, +17814,3898,content://media/external/images/media/3898,/storage/emulated/0/DCIM/Camera/IMG_20210220_125423.jpg,image/jpeg,4000,2250,0,5579184,,1637503732,1613822065000,1613822065085,0,0,0,,,,,,,,,,, +17815,3134,content://media/external/images/media/3134,/storage/emulated/0/DCIM/Camera/PANO_20210220_100341.jpg,image/jpeg,7952,3680,0,21700853,,1637502068,1613811829000,0,0,0,0,,,,,,,,,,, +17816,4893,content://media/external/images/media/4893,/storage/emulated/0/DCIM/Camera/IMG_20210220_100335.jpg,image/jpeg,4160,2340,0,6254352,,1637505920,1613811815000,1613811815848,0,0,0,,,,,,,,,,, +17817,4633,content://media/external/images/media/4633,/storage/emulated/0/DCIM/Camera/IMG_20210220_100333.jpg,image/jpeg,4160,2340,0,6212418,,1637505390,1613811813000,1613811812873,0,0,0,,,,,,,,,,, +17818,3093,content://media/external/images/media/3093,/storage/emulated/0/DCIM/Camera/IMG_20210219_144310.jpg,image/jpeg,428,400,0,121768,,1637501971,1613742191000,1613741858719,0,0,0,,,,,,,,,,, +17819,2809,content://media/external/images/media/2809,/storage/emulated/0/DCIM/Camera/IMG_20210219_143734.jpg,image/jpeg,4000,2250,90,3519907,,1637501312,1613741858000,1613741858719,0,0,0,,,,,,,,,,, +17820,6728,content://media/external/images/media/6728,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0038.jpg",image/jpeg,1200,1600,0,220852,,1637518222,1613243463000,0,0,0,0,,,,,,,,,,, +17821,6520,content://media/external/images/media/6520,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0037.jpg",image/jpeg,1600,900,0,105509,,1637518221,1613243462000,0,0,0,0,,,,,,,,,,, +17822,6727,content://media/external/images/media/6727,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0034.jpg",image/jpeg,1600,760,0,127897,,1637518222,1613243461000,0,0,0,0,,,,,,,,,,, +17823,2888,content://media/external/images/media/2888,/storage/emulated/0/DCIM/Camera/IMG_20210213_200728.jpg,image/jpeg,4000,2250,0,4846307,,1637501516,1613243249000,1613243249472,0,0,0,,,,,,,,,,, +17824,3347,content://media/external/images/media/3347,/storage/emulated/0/DCIM/Camera/IMG_20210213_200724.jpg,image/jpeg,4000,2250,90,5001841,,1637502439,1613243245000,1613243245774,0,0,0,,,,,,,,,,, +17825,3189,content://media/external/images/media/3189,/storage/emulated/0/DCIM/Camera/IMG_20210213_200539.jpg,image/jpeg,4160,2340,0,2954130,,1637502161,1613243139000,1613243139672,0,0,0,,,,,,,,,,, +17826,3897,content://media/external/images/media/3897,/storage/emulated/0/DCIM/Camera/IMG_20210213_192803.jpg,image/jpeg,4000,2250,90,5008204,,1637503732,1613240885000,1613240885036,0,0,0,,,,,,,,,,, +17827,4664,content://media/external/images/media/4664,/storage/emulated/0/DCIM/Camera/IMG_20210213_192744.jpg,image/jpeg,4000,2250,0,5137411,,1637505418,1613240866000,1613240866316,0,0,0,,,,,,,,,,, +17828,3307,content://media/external/images/media/3307,/storage/emulated/0/DCIM/Camera/IMG_20210213_191034.jpg,image/jpeg,4160,2340,0,4388509,,1637502430,1613239834000,1613239834043,0,0,0,,,,,,,,,,, +17829,6639,content://media/external/images/media/6639,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0032.jpg",image/jpeg,1600,762,0,104591,,1637518221,1613239667000,0,0,0,0,,,,,,,,,,, +17830,7527,content://media/external/images/media/7527,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0024.jpg",image/jpeg,1080,1920,0,137024,,1637518223,1613238537000,0,0,0,0,,,,,,,,,,, +17831,6638,content://media/external/images/media/6638,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0007.jpg",image/jpeg,1200,1600,0,133121,,1637518221,1613222966000,0,0,0,0,,,,,,,,,,, +17832,7570,content://media/external/images/media/7570,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0006.jpg",image/jpeg,1200,1600,0,140061,,1637518223,1613205012000,0,0,0,0,,,,,,,,,,, +17833,6726,content://media/external/images/media/6726,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0003.jpg",image/jpeg,777,1599,0,138138,,1637518222,1613201617000,0,0,0,0,,,,,,,,,,, +17834,3346,content://media/external/images/media/3346,/storage/emulated/0/DCIM/Camera/IMG_20210213_074728.jpg,image/jpeg,4160,2340,0,6186375,,1637502439,1613198848000,1613198848746,0,0,0,,,,,,,,,,, +17835,4824,content://media/external/images/media/4824,/storage/emulated/0/DCIM/Camera/IMG_20210213_074658.jpg,image/jpeg,4160,2340,0,4985762,,1637505731,1613198818000,1613198818066,0,0,0,,,,,,,,,,, +17836,4461,content://media/external/images/media/4461,/storage/emulated/0/DCIM/Camera/PANO_20210213_074634.jpg,image/jpeg,6032,3744,0,13324807,,1637505068,1613198800000,0,0,0,0,,,,,,,,,,, +17837,4228,content://media/external/images/media/4228,/storage/emulated/0/DCIM/Camera/IMG_20210212_134622.jpg,image/jpeg,4000,2250,0,4604981,,1637504726,1613133984000,1613133984544,0,0,0,,,,,,,,,,, +17838,3606,content://media/external/images/media/3606,/storage/emulated/0/DCIM/Camera/IMG_20210209_134202.jpg,image/jpeg,4000,2250,0,4449686,,1637503238,1612874525000,1612874525542,0,0,0,,,,,,,,,,, +17839,4566,content://media/external/images/media/4566,/storage/emulated/0/DCIM/Camera/IMG_20210207_111136.jpg,image/jpeg,4000,2250,90,4464093,,1637505216,1612692699000,1612692699015,0,0,0,,,,,,,,,,, +17840,7299,content://media/external/images/media/7299,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210205-WA0002.jpg",image/jpeg,1200,1600,0,228332,,1637518223,1612530196000,0,0,0,0,,,,,,,,,,, +17841,3345,content://media/external/images/media/3345,/storage/emulated/0/DCIM/Camera/IMG_20210205_073852.jpg,image/jpeg,4000,2250,0,4079502,,1637502439,1612507134000,1612507134529,0,0,0,,,,,,,,,,, +17842,2990,content://media/external/images/media/2990,/storage/emulated/0/DCIM/Camera/IMG_20210204_155405.jpg,image/jpeg,4000,2250,90,4874049,,1637501771,1612450446000,1612450446205,0,0,0,,,,,,,,,,, +17843,3306,content://media/external/images/media/3306,/storage/emulated/0/DCIM/Camera/IMG_20210204_155356.jpg,image/jpeg,4000,2250,90,5935753,,1637502430,1612450438000,1612450438419,0,0,0,,,,,,,,,,, +17844,3130,content://media/external/images/media/3130,/storage/emulated/0/DCIM/Camera/IMG_20210204_122943.jpg,image/jpeg,4000,2250,0,4396607,,1637502068,1612438185000,1612438185415,0,0,0,,,,,,,,,,, +17845,3051,content://media/external/images/media/3051,/storage/emulated/0/DCIM/Camera/IMG_20210204_122935.jpg,image/jpeg,4000,2250,0,4365170,,1637501858,1612438178000,1612438178641,0,0,0,,,,,,,,,,, +17846,3709,content://media/external/images/media/3709,/storage/emulated/0/DCIM/Camera/IMG_20210204_120229.jpg,image/jpeg,4000,2250,0,5374989,,1637503393,1612436552000,1612436552022,0,0,0,,,,,,,,,,, +17847,3344,content://media/external/images/media/3344,/storage/emulated/0/DCIM/Camera/IMG_20210204_103625.jpg,image/jpeg,4000,2250,0,4754777,,1637502439,1612431387000,1612431387520,0,0,0,,,,,,,,,,, +17848,4324,content://media/external/images/media/4324,/storage/emulated/0/DCIM/Camera/IMG_20210204_103302.jpg,image/jpeg,4000,2250,0,4887226,,1637504895,1612431185000,1612431184980,0,0,0,,,,,,,,,,, +17849,4418,content://media/external/images/media/4418,/storage/emulated/0/DCIM/Camera/IMG_20210204_102710.jpg,image/jpeg,4000,2250,0,5572363,,1637505063,1612430832000,1612430832619,0,0,0,,,,,,,,,,, +17850,6833,content://media/external/images/media/6833,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210125-WA0013.jpg",image/jpeg,1200,1600,0,130007,,1637518222,1611603300000,0,0,0,0,,,,,,,,,,, +17851,6286,content://media/external/images/media/6286,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210125-WA0012.jpg",image/jpeg,1600,1200,0,180030,,1637518221,1611603298000,0,0,0,0,,,,,,,,,,, +17852,7241,content://media/external/images/media/7241,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210125-WA0011.jpg",image/jpeg,1600,1200,0,180097,,1637518223,1611603293000,0,0,0,0,,,,,,,,,,, +17853,6408,content://media/external/images/media/6408,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210125-WA0008.jpg",image/jpeg,1200,1600,0,147727,,1637518221,1611603228000,0,0,0,0,,,,,,,,,,, +17854,6637,content://media/external/images/media/6637,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210119-WA0007.jpg",image/jpeg,768,1024,0,93945,,1637518221,1611091648000,0,0,0,0,,,,,,,,,,, +17855,7297,content://media/external/images/media/7297,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210119-WA0006.jpg",image/jpeg,900,1600,0,200281,,1637518223,1611091094000,0,0,0,0,,,,,,,,,,, +17856,6636,content://media/external/images/media/6636,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210118-WA0012.jpg",image/jpeg,900,1599,0,142292,,1637518221,1610994680000,0,0,0,0,,,,,,,,,,, +17857,4632,content://media/external/images/media/4632,/storage/emulated/0/DCIM/Camera/IMG_20210116_145718.jpg,image/jpeg,4000,2250,0,4589506,,1637505390,1610805441000,1610805441197,0,0,0,,,,,,,,,,, +17858,7298,content://media/external/images/media/7298,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210116-WA0014.jpg",image/jpeg,1600,1202,0,157494,,1637518223,1610805105000,0,0,0,0,,,,,,,,,,, +17859,7526,content://media/external/images/media/7526,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210116-WA0013.jpg",image/jpeg,1202,1600,0,170384,,1637518223,1610805046000,0,0,0,0,,,,,,,,,,, +17860,3230,content://media/external/images/media/3230,/storage/emulated/0/DCIM/Camera/IMG_20210103_190702.jpg,image/jpeg,4000,2250,0,4079096,,1637502258,1609697223000,1609697223495,0,0,0,,,,,,,,,,, +17861,3246,content://media/external/images/media/3246,/storage/emulated/0/DCIM/Camera/IMG_20210103_190658.jpg,image/jpeg,4000,2250,0,4399575,,1637502259,1609697220000,1609697220270,0,0,0,,,,,,,,,,, +17862,6283,content://media/external/images/media/6283,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201224-WA0005.jpg",image/jpeg,1200,1600,0,135733,,1637518221,1608797352000,0,0,0,0,,,,,,,,,,, +17863,7240,content://media/external/images/media/7240,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201224-WA0004.jpg",image/jpeg,1200,1600,0,213286,,1637518223,1608797352000,0,0,0,0,,,,,,,,,,, +17864,3583,content://media/external/images/media/3583,/storage/emulated/0/DCIM/Camera/IMG_20201220_174238.jpg,image/jpeg,4000,2250,0,4794461,,1637503154,1608482561000,1608482561588,0,0,0,,,,,,,,,,, +17865,4736,content://media/external/images/media/4736,/storage/emulated/0/DCIM/Camera/IMG_20201220_105634.jpg,image/jpeg,4000,2250,90,7153834,,1637505574,1608458198000,1608458198740,0,0,0,,,,,,,,,,, +17866,6957,content://media/external/images/media/6957,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201219-WA0009.jpg",image/jpeg,1200,1600,0,115498,,1637518222,1608388136000,0,0,0,0,,,,,,,,,,, +17867,7525,content://media/external/images/media/7525,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201219-WA0008.jpg",image/jpeg,1200,1600,0,125087,,1637518223,1608388136000,0,0,0,0,,,,,,,,,,, +17868,6724,content://media/external/images/media/6724,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201219-WA0007.jpg",image/jpeg,1200,1600,0,125162,,1637518222,1608388135000,0,0,0,0,,,,,,,,,,, +17869,6409,content://media/external/images/media/6409,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201219-WA0006.jpg",image/jpeg,1200,1600,0,100615,,1637518221,1608388134000,0,0,0,0,,,,,,,,,,, +17870,4631,content://media/external/images/media/4631,/storage/emulated/0/DCIM/Camera/IMG_20201219_144250.jpg,image/jpeg,4000,2250,0,3166325,,1637505390,1608385371000,1608385248860,0,0,0,,,,,,,,,,, +17871,4117,content://media/external/images/media/4117,/storage/emulated/0/DCIM/Camera/IMG_20201218_182939.jpg,image/jpeg,4000,2250,0,4486406,,1637504451,1608312581000,1608312581474,0,0,0,,,,,,,,,,, +17872,4981,content://media/external/images/media/4981,/storage/emulated/0/DCIM/Camera/IMG_20201218_182553.jpg,image/jpeg,4000,2250,0,4887510,,1637506097,1608312356000,1608312355964,0,0,0,,,,,,,,,,, +17873,4565,content://media/external/images/media/4565,/storage/emulated/0/DCIM/Camera/IMG_20201218_181327.jpg,image/jpeg,4000,2250,90,7705964,,1637505216,1608311609000,1608311609801,0,0,0,,,,,,,,,,, +17874,4702,content://media/external/images/media/4702,/storage/emulated/0/DCIM/Camera/IMG_20201216_075703.jpg,image/jpeg,4000,2250,90,4637415,,1637505509,1608101825000,1608101825691,0,0,0,,,,,,,,,,, +17875,4779,content://media/external/images/media/4779,/storage/emulated/0/DCIM/Camera/IMG_20201216_075616.jpg,image/jpeg,4000,2250,90,4119474,,1637505656,1608101779000,1608101778747,0,0,0,,,,,,,,,,, +17876,6635,content://media/external/images/media/6635,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0017.jpg",image/jpeg,1600,737,0,68829,,1637518221,1608031557000,0,0,0,0,,,,,,,,,,, +17877,6830,content://media/external/images/media/6830,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0018.jpg",image/jpeg,1600,737,0,111669,,1637518222,1608031557000,0,0,0,0,,,,,,,,,,, +17878,6832,content://media/external/images/media/6832,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0019.jpg",image/jpeg,1202,918,0,201502,,1637518222,1608031557000,0,0,0,0,,,,,,,,,,, +17879,6634,content://media/external/images/media/6634,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0016.jpg",image/jpeg,1600,740,0,233812,,1637518221,1608031556000,0,0,0,0,,,,,,,,,,, +17880,6831,content://media/external/images/media/6831,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0015.jpg",image/jpeg,736,1600,0,259084,,1637518222,1608031556000,0,0,0,0,,,,,,,,,,, +17881,6284,content://media/external/images/media/6284,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0014.jpg",image/jpeg,1600,736,0,320224,,1637518221,1608031555000,0,0,0,0,,,,,,,,,,, +17882,6725,content://media/external/images/media/6725,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0013.jpg",image/jpeg,1600,737,0,115062,,1637518222,1608031554000,0,0,0,0,,,,,,,,,,, +17883,6956,content://media/external/images/media/6956,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0012.jpg",image/jpeg,736,1600,0,280201,,1637518222,1608031554000,0,0,0,0,,,,,,,,,,, +17884,6519,content://media/external/images/media/6519,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0011.jpg",image/jpeg,1600,736,0,254218,,1637518221,1608031553000,0,0,0,0,,,,,,,,,,, +17885,6633,content://media/external/images/media/6633,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0008.jpg",image/jpeg,1600,736,0,206208,,1637518221,1608031552000,0,0,0,0,,,,,,,,,,, +17886,6723,content://media/external/images/media/6723,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0009.jpg",image/jpeg,736,1600,0,255349,,1637518222,1608031552000,0,0,0,0,,,,,,,,,,, +17887,6829,content://media/external/images/media/6829,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0010.jpg",image/jpeg,1600,740,0,224911,,1637518222,1608031552000,0,0,0,0,,,,,,,,,,, +17888,6632,content://media/external/images/media/6632,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0007.jpg",image/jpeg,1600,736,0,278830,,1637518221,1608031551000,0,0,0,0,,,,,,,,,,, +17889,6282,content://media/external/images/media/6282,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0005.jpg",image/jpeg,1600,736,0,233902,,1637518221,1608031550000,0,0,0,0,,,,,,,,,,, +17890,6630,content://media/external/images/media/6630,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0006.jpg",image/jpeg,1600,737,0,140318,,1637518221,1608031550000,0,0,0,0,,,,,,,,,,, +17891,6280,content://media/external/images/media/6280,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0002.jpg",image/jpeg,1202,1318,0,290055,,1637518221,1608031549000,0,0,0,0,,,,,,,,,,, +17892,6281,content://media/external/images/media/6281,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0003.jpg",image/jpeg,1600,737,0,119993,,1637518221,1608031549000,0,0,0,0,,,,,,,,,,, +17893,6517,content://media/external/images/media/6517,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0004.jpg",image/jpeg,736,1600,0,121175,,1637518221,1608031549000,0,0,0,0,,,,,,,,,,, +17894,6279,content://media/external/images/media/6279,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201209-WA0003.jpg",image/jpeg,900,1600,0,157229,,1637518221,1607517100000,0,0,0,0,,,,,,,,,,, +17895,6407,content://media/external/images/media/6407,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201209-WA0002.jpg",image/jpeg,901,1600,0,164786,,1637518221,1607517084000,0,0,0,0,,,,,,,,,,, +17896,6518,content://media/external/images/media/6518,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201209-WA0001.jpg",image/jpeg,1600,900,0,152687,,1637518221,1607517078000,0,0,0,0,,,,,,,,,,, +17897,4207,content://media/external/images/media/4207,/storage/emulated/0/DCIM/Camera/IMG_20201207_130204.jpg,image/jpeg,4160,2340,0,4770211,,1637504640,1607342524000,1607342524414,0,0,0,,,,,,,,,,, +17898,4952,content://media/external/images/media/4952,/storage/emulated/0/DCIM/Camera/IMG_20201207_130148.jpg,image/jpeg,4000,2250,0,5393162,,1637506015,1607342511000,1607342510914,0,0,0,,,,,,,,,,, +17899,4701,content://media/external/images/media/4701,/storage/emulated/0/DCIM/Camera/IMG_20201207_103349.jpg,image/jpeg,4160,2340,0,6549854,,1637505509,1607333629000,1607333629587,0,0,0,,,,,,,,,,, +17900,4311,content://media/external/images/media/4311,/storage/emulated/0/DCIM/Camera/IMG_20201205_103531.jpg,image/jpeg,4000,2250,0,4485711,,1637504817,1607160933000,1607160933732,0,0,0,,,,,,,,,,, +17901,6963,content://media/external/images/media/6963,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0041.jpg",image/jpeg,1200,1600,0,314436,,1637518222,1606598621000,0,0,0,0,,,,,,,,,,, +17902,6278,content://media/external/images/media/6278,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0037.jpg",image/jpeg,768,1024,0,86656,,1637518221,1606597785000,0,0,0,0,,,,,,,,,,, +17903,6406,content://media/external/images/media/6406,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0039.jpg",image/jpeg,1024,768,0,84388,,1637518221,1606597785000,0,0,0,0,,,,,,,,,,, +17904,6828,content://media/external/images/media/6828,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0040.jpg",image/jpeg,768,1024,0,131436,,1637518222,1606597785000,0,0,0,0,,,,,,,,,,, +17905,7569,content://media/external/images/media/7569,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0038.jpg",image/jpeg,1024,768,0,68932,,1637518223,1606597785000,0,0,0,0,,,,,,,,,,, +17906,6405,content://media/external/images/media/6405,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0036.jpg",image/jpeg,1024,1024,0,67009,,1637518221,1606597784000,0,0,0,0,,,,,,,,,,, +17907,6629,content://media/external/images/media/6629,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0032.jpg",image/jpeg,768,1024,0,148629,,1637518221,1606597775000,0,0,0,0,,,,,,,,,,, +17908,6631,content://media/external/images/media/6631,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0033.jpg",image/jpeg,1024,769,0,128218,,1637518221,1606597775000,0,0,0,0,,,,,,,,,,, +17909,7296,content://media/external/images/media/7296,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0034.jpg",image/jpeg,1024,768,0,120935,,1637518223,1606597775000,0,0,0,0,,,,,,,,,,, +17910,6721,content://media/external/images/media/6721,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0030.jpg",image/jpeg,768,1024,0,111421,,1637518222,1606597774000,0,0,0,0,,,,,,,,,,, +17911,6722,content://media/external/images/media/6722,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0031.jpg",image/jpeg,1024,768,0,134486,,1637518222,1606597774000,0,0,0,0,,,,,,,,,,, +17912,7295,content://media/external/images/media/7295,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0029.jpg",image/jpeg,768,1024,0,142288,,1637518223,1606597774000,0,0,0,0,,,,,,,,,,, +17913,4101,content://media/external/images/media/4101,/storage/emulated/0/DCIM/Camera/IMG_20201128_200651.jpg,image/jpeg,4000,2250,0,5082563,,1637504400,1606590414000,1606590414526,0,0,0,,,,,,,,,,, +17914,7294,content://media/external/images/media/7294,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0026.jpg",image/jpeg,1504,1128,0,220679,,1637518223,1606589384000,0,0,0,0,,,,,,,,,,, +17915,3112,content://media/external/images/media/3112,/storage/emulated/0/DCIM/Camera/IMG_20201128_093706.jpg,image/jpeg,4000,2250,90,4830984,,1637502054,1606552628000,1606552628612,0,0,0,,,,,,,,,,, +17916,3019,content://media/external/images/media/3019,/storage/emulated/0/DCIM/Camera/PANO_20201128_093654.jpg,image/jpeg,2192,3776,0,5202927,,1637501786,1606552616000,0,0,0,0,,,,,,,,,,, +17917,3707,content://media/external/images/media/3707,/storage/emulated/0/DCIM/Camera/IMG_20201127_124308.jpg,image/jpeg,4000,2250,0,4324782,,1637503392,1606477390000,1606477390666,0,0,0,,,,,,,,,,, +17918,3622,content://media/external/images/media/3622,/storage/emulated/0/DCIM/Camera/IMG_20201127_124303.jpg,image/jpeg,4000,2250,0,4379283,,1637503271,1606477387000,1606477386850,0,0,0,,,,,,,,,,, +17919,4078,content://media/external/images/media/4078,/storage/emulated/0/DCIM/Camera/IMG_20201122_123922.jpg,image/jpeg,4000,2250,0,4195025,,1637504394,1606045164000,1606045164230,0,0,0,,,,,,,,,,, +17920,4822,content://media/external/images/media/4822,/storage/emulated/0/DCIM/Camera/IMG_20201121_194107.jpg,image/jpeg,4000,2250,0,4169192,,1637505730,1605984069000,1605984069701,0,0,0,,,,,,,,,,, +17921,3440,content://media/external/images/media/3440,/storage/emulated/0/DCIM/Camera/IMG_20201121_133846.jpg,image/jpeg,4000,2250,90,4824496,,1637502783,1605962328000,1605962327849,0,0,0,,,,,,,,,,, +17922,3518,content://media/external/images/media/3518,/storage/emulated/0/DCIM/Camera/IMG_20201121_133840.jpg,image/jpeg,4000,2250,90,4818786,,1637502970,1605962324000,1605962324190,0,0,0,,,,,,,,,,, +17923,7293,content://media/external/images/media/7293,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201118-WA0003.jpg",image/jpeg,1152,2048,0,108875,,1637518223,1605692799000,0,0,0,0,,,,,,,,,,, +17924,3706,content://media/external/images/media/3706,/storage/emulated/0/DCIM/Camera/IMG_20201118_074730.jpg,image/jpeg,4000,2250,90,4643725,,1637503392,1605682051000,1605682051343,0,0,0,,,,,,,,,,, +17925,3188,content://media/external/images/media/3188,/storage/emulated/0/DCIM/Camera/IMG_20201118_074725.jpg,image/jpeg,4000,2250,90,4834408,,1637502161,1605682047000,1605682047103,0,0,0,,,,,,,,,,, +17926,3363,content://media/external/images/media/3363,/storage/emulated/0/DCIM/Camera/IMG_20201118_074723.jpg,image/jpeg,4000,2250,90,4674939,,1637502451,1605682044000,1605682044648,0,0,0,,,,,,,,,,, +17927,4401,content://media/external/images/media/4401,/storage/emulated/0/DCIM/Camera/IMG_20201118_074721.jpg,image/jpeg,4000,2250,90,4793793,,1637505004,1605682042000,1605682042272,0,0,0,,,,,,,,,,, +17928,4980,content://media/external/images/media/4980,/storage/emulated/0/DCIM/Camera/IMG_20201118_074718.jpg,image/jpeg,4000,2250,90,4614884,,1637506097,1605682039000,1605682039726,0,0,0,,,,,,,,,,, +17929,3472,content://media/external/images/media/3472,/storage/emulated/0/DCIM/Camera/IMG_20201118_074714.jpg,image/jpeg,4000,2250,90,4854780,,1637502817,1605682035000,1605682035289,0,0,0,,,,,,,,,,, +17930,4289,content://media/external/images/media/4289,/storage/emulated/0/DCIM/Camera/IMG_20201118_074710.jpg,image/jpeg,4000,2250,90,4830761,,1637504807,1605682031000,1605682031800,0,0,0,,,,,,,,,,, +17931,2887,content://media/external/images/media/2887,/storage/emulated/0/DCIM/Camera/IMG_20201118_074706.jpg,image/jpeg,4000,2250,90,5082038,,1637501516,1605682027000,1605682027312,0,0,0,,,,,,,,,,, +17932,3705,content://media/external/images/media/3705,/storage/emulated/0/DCIM/Camera/IMG_20201118_074703.jpg,image/jpeg,4000,2250,90,5062838,,1637503392,1605682025000,1605682025167,0,0,0,,,,,,,,,,, +17933,5003,content://media/external/images/media/5003,/storage/emulated/0/DCIM/Camera/IMG_20201118_074701.jpg,image/jpeg,4000,2250,90,4864781,,1637506101,1605682022000,1605682022486,0,0,0,,,,,,,,,,, +17934,3050,content://media/external/images/media/3050,/storage/emulated/0/DCIM/Camera/IMG_20201118_074656.jpg,image/jpeg,4000,2250,90,4449966,,1637501858,1605682018000,1605682018308,0,0,0,,,,,,,,,,, +17935,4169,content://media/external/images/media/4169,/storage/emulated/0/DCIM/Camera/IMG_20201118_074636.jpg,image/jpeg,4000,2250,0,4655936,,1637504556,1605681999000,1605681998817,0,0,0,,,,,,,,,,, +17936,7292,content://media/external/images/media/7292,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201114-WA0008.jpg",image/jpeg,1200,1600,0,166099,,1637518223,1605382980000,0,0,0,0,,,,,,,,,,, +17937,6403,content://media/external/images/media/6403,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201112-WA0002.jpg",image/jpeg,1200,1600,0,148866,,1637518221,1605169144000,0,0,0,0,,,,,,,,,,, +17938,7291,content://media/external/images/media/7291,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201112-WA0000.jpg",image/jpeg,1202,1600,0,175394,,1637518223,1605169143000,0,0,0,0,,,,,,,,,,, +17939,4268,content://media/external/images/media/4268,/storage/emulated/0/DCIM/Camera/IMG_20201101_134619.jpg,image/jpeg,4000,2250,90,6422006,,1637504756,1604234781000,1604234781593,0,0,0,,,,,,,,,,, +17940,4979,content://media/external/images/media/4979,/storage/emulated/0/DCIM/Camera/IMG_20201031_140821.jpg,image/jpeg,4000,2250,90,5894617,,1637506097,1604149703000,1604149703781,0,0,0,,,,,,,,,,, +17941,2828,content://media/external/images/media/2828,/storage/emulated/0/DCIM/Camera/IMG_20201031_140819.jpg,image/jpeg,4000,2250,90,6126977,,1637501369,1604149702000,1604149702289,0,0,0,,,,,,,,,,, +17942,3049,content://media/external/images/media/3049,/storage/emulated/0/DCIM/Camera/IMG_20201031_132852.jpg,image/jpeg,4000,2250,0,5436073,,1637501858,1604147334000,1604147334285,0,0,0,,,,,,,,,,, +17943,6516,content://media/external/images/media/6516,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201031-WA0040.jpg",image/jpeg,1024,768,0,100393,,1637518221,1604145616000,0,0,0,0,,,,,,,,,,, +17944,6955,content://media/external/images/media/6955,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201031-WA0039.jpg",image/jpeg,768,1024,0,125631,,1637518222,1604145615000,0,0,0,0,,,,,,,,,,, +17945,6953,content://media/external/images/media/6953,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201031-WA0038.jpg",image/jpeg,1200,1600,0,227766,,1637518222,1604145543000,0,0,0,0,,,,,,,,,,, +17946,6277,content://media/external/images/media/6277,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201031-WA0036.jpg",image/jpeg,1200,1600,0,302857,,1637518221,1604143720000,0,0,0,0,,,,,,,,,,, +17947,6515,content://media/external/images/media/6515,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201030-WA0004.jpg",image/jpeg,750,1334,0,77588,,1637518221,1604069314000,0,0,0,0,,,,,,,,,,, +17948,6513,content://media/external/images/media/6513,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201022-WA0008.jpg",image/jpeg,901,1600,0,192092,,1637518221,1603391160000,0,0,0,0,,,,,,,,,,, +17949,6954,content://media/external/images/media/6954,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201022-WA0006.jpg",image/jpeg,1200,1600,0,154642,,1637518222,1603391103000,0,0,0,0,,,,,,,,,,, +17950,7568,content://media/external/images/media/7568,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201019-WA0003.jpg",image/jpeg,1600,1200,0,258990,,1637518223,1603096966000,0,0,0,0,,,,,,,,,,, +17951,6404,content://media/external/images/media/6404,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201018-WA0004.jpg",image/jpeg,1200,1600,0,261287,,1637518221,1603024568000,0,0,0,0,,,,,,,,,,, +17952,3420,content://media/external/images/media/3420,/storage/emulated/0/DCIM/Camera/IMG_20201018_121930.jpg,image/jpeg,4000,2250,90,4539026,,1637502682,1603016373000,1603016373128,0,0,0,,,,,,,,,,, +17953,2827,content://media/external/images/media/2827,/storage/emulated/0/DCIM/Camera/IMG_20201017_232522.jpg,image/jpeg,4000,2250,90,4930229,,1637501369,1602969924000,1602969924564,0,0,0,,,,,,,,,,, +17954,2826,content://media/external/images/media/2826,/storage/emulated/0/DCIM/Camera/IMG_20201013_231432.jpg,image/jpeg,4000,2250,0,4433774,,1637501369,1602623673000,1602623673861,0,0,0,,,,,,,,,,, +17955,4735,content://media/external/images/media/4735,/storage/emulated/0/DCIM/Camera/IMG_20201013_231403.jpg,image/jpeg,4000,2250,0,4158870,,1637505574,1602623645000,1602623645253,0,0,0,,,,,,,,,,, +17956,6628,content://media/external/images/media/6628,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201011-WA0004.jpg",image/jpeg,1600,1200,0,173952,,1637518221,1602369237000,0,0,0,0,,,,,,,,,,, +17957,6827,content://media/external/images/media/6827,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201011-WA0003.jpg",image/jpeg,1600,1200,0,155306,,1637518222,1602369237000,0,0,0,0,,,,,,,,,,, +17958,7567,content://media/external/images/media/7567,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201011-WA0002.jpg",image/jpeg,1128,1504,0,388166,,1637518223,1602369237000,0,0,0,0,,,,,,,,,,, +17959,6951,content://media/external/images/media/6951,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201011-WA0001.jpg",image/jpeg,1600,1200,0,149159,,1637518222,1602369236000,0,0,0,0,,,,,,,,,,, +17960,7290,content://media/external/images/media/7290,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201011-WA0000.jpg",image/jpeg,1600,1200,0,167270,,1637518223,1602369235000,0,0,0,0,,,,,,,,,,, +17961,6952,content://media/external/images/media/6952,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201009-WA0011.jpeg",image/jpeg,4000,2250,0,842178,,1637518222,1602270044000,0,0,0,0,,,,,,,,,,, +17962,6720,content://media/external/images/media/6720,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201009-WA0004.jpg",image/jpeg,768,1024,0,61621,,1637518222,1602245057000,0,0,0,0,,,,,,,,,,, +17963,6818,content://media/external/images/media/6818,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0070.jpg",image/jpeg,900,1600,0,103273,,1637518222,1601491402000,0,0,0,0,,,,,,,,,,, +17964,3769,content://media/external/images/media/3769,/storage/emulated/0/DCIM/Camera/IMG_20200927_195211.jpg,image/jpeg,4000,2250,90,5011696,,1637503508,1601229133000,1601229133401,0,0,0,,,,,,,,,,, +17965,4206,content://media/external/images/media/4206,/storage/emulated/0/DCIM/Camera/IMG_20200927_195207.jpg,image/jpeg,4000,2250,90,4641818,,1637504640,1601229130000,1601229129858,0,0,0,,,,,,,,,,, +17966,4416,content://media/external/images/media/4416,/storage/emulated/0/DCIM/Camera/IMG_20200927_173357.jpg,image/jpeg,4000,2250,0,5084526,,1637505063,1601220839000,1601220838941,0,0,0,,,,,,,,,,, +17967,6514,content://media/external/images/media/6514,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200925-WA0001.jpg",image/jpeg,1200,1600,0,133103,,1637518221,1601033957000,0,0,0,0,,,,,,,,,,, +17968,6627,content://media/external/images/media/6627,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200921-WA0000.jpg",image/jpeg,1200,1600,0,224645,,1637518221,1600666442000,0,0,0,0,,,,,,,,,,, +17969,6276,content://media/external/images/media/6276,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200920-WA0021.jpg",image/jpeg,1600,1201,0,325388,,1637518221,1600638894000,0,0,0,0,,,,,,,,,,, +17970,6512,content://media/external/images/media/6512,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200920-WA0020.jpg",image/jpeg,1600,1200,0,262179,,1637518221,1600627493000,0,0,0,0,,,,,,,,,,, +17971,6712,content://media/external/images/media/6712,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0061.jpg",image/jpeg,1024,768,0,106987,,1637518222,1600627493000,0,0,0,0,,,,,,,,,,, +17972,6275,content://media/external/images/media/6275,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0012.jpg",image/jpeg,1600,1200,0,247032,,1637518221,1600542612000,0,0,0,0,,,,,,,,,,, +17973,6511,content://media/external/images/media/6511,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0011.jpg",image/jpeg,1600,1200,0,232265,,1637518221,1600542596000,0,0,0,0,,,,,,,,,,, +17974,6950,content://media/external/images/media/6950,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0010.jpg",image/jpeg,768,1024,0,86892,,1637518222,1600536844000,0,0,0,0,,,,,,,,,,, +17975,6402,content://media/external/images/media/6402,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0009.jpg",image/jpeg,768,1024,0,86529,,1637518221,1600536843000,0,0,0,0,,,,,,,,,,, +17976,6719,content://media/external/images/media/6719,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0008.jpg",image/jpeg,768,1024,0,78354,,1637518222,1600536841000,0,0,0,0,,,,,,,,,,, +17977,6626,content://media/external/images/media/6626,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0007.jpg",image/jpeg,768,1024,0,89866,,1637518221,1600536840000,0,0,0,0,,,,,,,,,,, +17978,6510,content://media/external/images/media/6510,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0006.jpg",image/jpeg,768,1024,0,117053,,1637518221,1600536811000,0,0,0,0,,,,,,,,,,, +17979,6948,content://media/external/images/media/6948,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0005.jpg",image/jpeg,768,1024,0,77125,,1637518222,1600536810000,0,0,0,0,,,,,,,,,,, +17980,6826,content://media/external/images/media/6826,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0004.jpg",image/jpeg,768,1024,0,86748,,1637518222,1600536808000,0,0,0,0,,,,,,,,,,, +17981,6274,content://media/external/images/media/6274,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200916-WA0006.jpg",image/jpeg,900,1600,0,231161,,1637518221,1600282270000,0,0,0,0,,,,,,,,,,, +17982,6622,content://media/external/images/media/6622,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0082.jpg",image/jpeg,1024,768,0,149547,,1637518221,1600169735000,0,0,0,0,,,,,,,,,,, +17983,6825,content://media/external/images/media/6825,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200915-WA0002.jpg",image/jpeg,576,1024,0,112162,,1637518222,1600169735000,0,0,0,0,,,,,,,,,,, +17984,6401,content://media/external/images/media/6401,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200914-WA0010.jpg",image/jpeg,1024,473,0,66681,,1637518221,1600107435000,0,0,0,0,,,,,,,,,,, +17985,6273,content://media/external/images/media/6273,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200914-WA0009.jpg",image/jpeg,1024,473,0,57449,,1637518221,1600107390000,0,0,0,0,,,,,,,,,,, +17986,6824,content://media/external/images/media/6824,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200914-WA0006.jpg",image/jpeg,1024,768,0,109573,,1637518222,1600078105000,0,0,0,0,,,,,,,,,,, +17987,7289,content://media/external/images/media/7289,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200914-WA0005.jpg",image/jpeg,1024,768,0,119718,,1637518223,1600078044000,0,0,0,0,,,,,,,,,,, +17988,6823,content://media/external/images/media/6823,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200914-WA0004.jpg",image/jpeg,1024,622,0,99758,,1637518222,1600077250000,0,0,0,0,,,,,,,,,,, +17989,6822,content://media/external/images/media/6822,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200914-WA0001.jpg",image/jpeg,768,1024,0,151190,,1637518222,1600069295000,0,0,0,0,,,,,,,,,,, +17990,6718,content://media/external/images/media/6718,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200913-WA0028.jpg",image/jpeg,1125,2000,0,254784,,1637518222,1600023652000,0,0,0,0,,,,,,,,,,, +17991,6625,content://media/external/images/media/6625,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200913-WA0026.jpg",image/jpeg,1600,900,0,285608,,1637518221,1600022726000,0,0,0,0,,,,,,,,,,, +17992,6947,content://media/external/images/media/6947,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0031.jpg",image/jpeg,768,1024,0,156559,,1637518222,1600022410000,0,0,0,0,,,,,,,,,,, +17993,6509,content://media/external/images/media/6509,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0075.jpg",image/jpeg,768,1024,0,208473,,1637518221,1600021992000,0,0,0,0,,,,,,,,,,, +17994,5020,content://media/external/images/media/5020,/storage/emulated/0/DCIM/Camera/IMG_20200913_152026.jpg,image/jpeg,4000,2250,90,4380146,,1637506134,1600003228000,1600003228418,0,0,0,,,,,,,,,,, +17995,3767,content://media/external/images/media/3767,/storage/emulated/0/DCIM/Camera/IMG_20200913_141803.jpg,image/jpeg,4000,2250,0,4703466,,1637503508,1599999485000,1599999484962,0,0,0,,,,,,,,,,, +17996,4778,content://media/external/images/media/4778,/storage/emulated/0/DCIM/Camera/IMG_20200913_093624.jpg,image/jpeg,4160,2340,90,5396293,,1637505656,1599982584000,1599982584690,0,0,0,,,,,,,,,,, +17997,3730,content://media/external/images/media/3730,/storage/emulated/0/DCIM/Camera/IMG_20200913_093607.jpg,image/jpeg,4160,2340,0,5667580,,1637503477,1599982567000,1599982567639,0,0,0,,,,,,,,,,, +17998,6624,content://media/external/images/media/6624,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0038.jpg",image/jpeg,768,1024,0,123285,,1637518221,1599943232000,0,0,0,0,,,,,,,,,,, +17999,6949,content://media/external/images/media/6949,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0043.jpg",image/jpeg,1024,768,0,124765,,1637518222,1599943215000,0,0,0,0,,,,,,,,,,, +18000,6400,content://media/external/images/media/6400,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0041.jpg",image/jpeg,768,1024,0,113509,,1637518221,1599935299000,0,0,0,0,,,,,,,,,,, +18001,6272,content://media/external/images/media/6272,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0040.jpg",image/jpeg,1024,768,0,138820,,1637518221,1599935298000,0,0,0,0,,,,,,,,,,, +18002,6821,content://media/external/images/media/6821,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0039.jpg",image/jpeg,1024,768,0,156662,,1637518222,1599935296000,0,0,0,0,,,,,,,,,,, +18003,6623,content://media/external/images/media/6623,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0036.jpg",image/jpeg,1024,768,0,134832,,1637518221,1599935289000,0,0,0,0,,,,,,,,,,, +18004,6946,content://media/external/images/media/6946,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0035.jpg",image/jpeg,1024,768,0,145181,,1637518222,1599935285000,0,0,0,0,,,,,,,,,,, +18005,6944,content://media/external/images/media/6944,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0030.jpg",image/jpeg,1024,768,0,104069,,1637518222,1599929918000,0,0,0,0,,,,,,,,,,, +18006,6716,content://media/external/images/media/6716,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0029.jpg",image/jpeg,1024,768,0,146465,,1637518222,1599929917000,0,0,0,0,,,,,,,,,,, +18007,3986,content://media/external/images/media/3986,/storage/emulated/0/DCIM/Camera/IMG_20200912_183627.jpg,image/jpeg,4000,2250,90,5928221,,1637504059,1599928590000,1599928590473,0,0,0,,,,,,,,,,, +18008,4168,content://media/external/images/media/4168,/storage/emulated/0/DCIM/Camera/IMG_20200912_183622.jpg,image/jpeg,4000,2250,90,6647816,,1637504556,1599928586000,1599928586683,0,0,0,,,,,,,,,,, +18009,4267,content://media/external/images/media/4267,/storage/emulated/0/DCIM/Camera/IMG_20200912_163244.jpg,image/jpeg,4000,2250,90,4556382,,1637504756,1599921166000,1599921165991,0,0,0,,,,,,,,,,, +18010,4020,content://media/external/images/media/4020,/storage/emulated/0/DCIM/Camera/IMG_20200912_155056.jpg,image/jpeg,4000,2250,0,7001124,,1637504201,1599918659000,1599918658905,0,0,0,,,,,,,,,,, +18011,3766,content://media/external/images/media/3766,/storage/emulated/0/DCIM/Camera/IMG_20200912_133701.jpg,image/jpeg,4160,2340,0,4099720,,1637503508,1599910621000,1599910621207,0,0,0,,,,,,,,,,, +18012,3896,content://media/external/images/media/3896,/storage/emulated/0/DCIM/Camera/IMG_20200912_130949.jpg,image/jpeg,4000,2250,0,4150820,,1637503732,1599908990000,1599908990501,0,0,0,,,,,,,,,,, +18013,4227,content://media/external/images/media/4227,/storage/emulated/0/DCIM/Camera/IMG_20200912_125837.jpg,image/jpeg,4000,2250,90,5102174,,1637504726,1599908319000,1599908319392,0,0,0,,,,,,,,,,, +18014,3111,content://media/external/images/media/3111,/storage/emulated/0/DCIM/Camera/IMG_20200912_125055.jpg,image/jpeg,4000,2250,90,4699650,,1637502054,1599907857000,1599907857216,0,0,0,,,,,,,,,,, +18015,4821,content://media/external/images/media/4821,/storage/emulated/0/DCIM/Camera/IMG_20200912_123811.jpg,image/jpeg,4000,2250,90,4746906,,1637505730,1599907093000,1599907093191,0,0,0,,,,,,,,,,, +18016,4400,content://media/external/images/media/4400,/storage/emulated/0/DCIM/Camera/IMG_20200912_114502.jpg,image/jpeg,4000,2250,90,6141771,,1637505004,1599903904000,1599903904071,0,0,0,,,,,,,,,,, +18017,4745,content://media/external/images/media/4745,/storage/emulated/0/DCIM/Camera/PANO_20200912_110431.jpg,image/jpeg,7440,3744,0,16039057,,1637505574,1599901478000,0,0,0,0,,,,,,,,,,, +18018,4677,content://media/external/images/media/4677,/storage/emulated/0/DCIM/Camera/IMG_20200912_110243.jpg,image/jpeg,4000,2250,90,4834671,,1637505480,1599901365000,1599901365572,0,0,0,,,,,,,,,,, +18019,3197,content://media/external/images/media/3197,/storage/emulated/0/DCIM/Camera/PANO_20200912_105827.jpg,image/jpeg,3568,4736,270,9888136,,1637502162,1599901115000,0,0,0,0,,,,,,,,,,, +18020,3430,content://media/external/images/media/3430,/storage/emulated/0/DCIM/Camera/PANO_20200912_105813.jpg,image/jpeg,3600,5344,270,9560855,,1637502682,1599901104000,0,0,0,0,,,,,,,,,,, +18021,3453,content://media/external/images/media/3453,/storage/emulated/0/DCIM/Camera/IMG_20200912_094627.jpg,image/jpeg,4000,2250,0,5223976,,1637502804,1599896789000,1599896789111,0,0,0,,,,,,,,,,, +18022,6399,content://media/external/images/media/6399,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0081.jpg",image/jpeg,1024,768,0,108079,,1637518221,1599844765000,0,0,0,0,,,,,,,,,,, +18023,4584,content://media/external/images/media/4584,/storage/emulated/0/DCIM/Camera/IMG_20200911_191111.jpg,image/jpeg,4160,2340,0,4818481,,1637505278,1599844271000,1599844271373,0,0,0,,,,,,,,,,, +18024,5001,content://media/external/images/media/5001,/storage/emulated/0/DCIM/Camera/IMG_20200911_191104.jpg,image/jpeg,4160,2340,0,4808116,,1637506101,1599844264000,1599844264466,0,0,0,,,,,,,,,,, +18025,6271,content://media/external/images/media/6271,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0076.jpg",image/jpeg,1024,768,0,128428,,1637518221,1599836536000,0,0,0,0,,,,,,,,,,, +18026,6508,content://media/external/images/media/6508,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0074.jpg",image/jpeg,768,1024,0,191046,,1637518221,1599836473000,0,0,0,0,,,,,,,,,,, +18027,6717,content://media/external/images/media/6717,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0073.jpg",image/jpeg,768,1024,0,142205,,1637518222,1599836473000,0,0,0,0,,,,,,,,,,, +18028,6621,content://media/external/images/media/6621,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0071.jpg",image/jpeg,1024,768,0,165786,,1637518221,1599836472000,0,0,0,0,,,,,,,,,,, +18029,6713,content://media/external/images/media/6713,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0072.jpg",image/jpeg,1024,768,0,161277,,1637518222,1599836472000,0,0,0,0,,,,,,,,,,, +18030,7566,content://media/external/images/media/7566,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0070.jpg",image/jpeg,768,1024,0,142212,,1637518223,1599836472000,0,0,0,0,,,,,,,,,,, +18031,6820,content://media/external/images/media/6820,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0068.jpg",image/jpeg,768,1024,0,139743,,1637518222,1599836471000,0,0,0,0,,,,,,,,,,, +18032,7288,content://media/external/images/media/7288,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0069.jpg",image/jpeg,768,1024,0,69140,,1637518223,1599836471000,0,0,0,0,,,,,,,,,,, +18033,6398,content://media/external/images/media/6398,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0066.jpg",image/jpeg,1024,768,0,201015,,1637518221,1599836470000,0,0,0,0,,,,,,,,,,, +18034,6620,content://media/external/images/media/6620,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0067.jpg",image/jpeg,768,1024,0,139947,,1637518221,1599836470000,0,0,0,0,,,,,,,,,,, +18035,6945,content://media/external/images/media/6945,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0065.jpg",image/jpeg,1024,768,0,152898,,1637518222,1599836467000,0,0,0,0,,,,,,,,,,, +18036,7565,content://media/external/images/media/7565,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0006.jpg",image/jpeg,1125,2000,0,607275,,1637518223,1599827679000,0,0,0,0,,,,,,,,,,, +18037,4063,content://media/external/images/media/4063,/storage/emulated/0/DCIM/Camera/IMG_20200911_133658.jpg,image/jpeg,1076,821,0,432854,,1637504342,1599824218000,1599824143699,0,0,0,,,,,,,,,,, +18038,4001,content://media/external/images/media/4001,/storage/emulated/0/DCIM/Camera/IMG_20200911_133543.jpg,image/jpeg,4000,2250,0,7435508,,1637504086,1599824147000,1599824146982,0,0,0,,,,,,,,,,, +18039,3343,content://media/external/images/media/3343,/storage/emulated/0/DCIM/Camera/IMG_20200911_132133.jpg,image/jpeg,4000,2250,0,3271818,,1637502439,1599823294000,1599823294603,0,0,0,,,,,,,,,,, +18040,3516,content://media/external/images/media/3516,/storage/emulated/0/DCIM/Camera/IMG_20200911_132120.jpg,image/jpeg,4000,2250,90,3591361,,1637502970,1599823281000,1599823281793,0,0,0,,,,,,,,,,, +18041,4700,content://media/external/images/media/4700,/storage/emulated/0/DCIM/Camera/IMG_20200911_132108.jpg,image/jpeg,4000,2250,0,4800832,,1637505509,1599823272000,1599823272803,0,0,0,,,,,,,,,,, +18042,3439,content://media/external/images/media/3439,/storage/emulated/0/DCIM/Camera/IMG_20200911_125509.jpg,image/jpeg,4160,2340,90,6088838,,1637502783,1599821709000,1599821709850,0,0,0,,,,,,,,,,, +18043,2860,content://media/external/images/media/2860,/storage/emulated/0/DCIM/Camera/IMG_20200911_124343.jpg,image/jpeg,4000,2250,90,7424532,,1637501457,1599821025000,1599821024974,0,0,0,,,,,,,,,,, +18044,4266,content://media/external/images/media/4266,/storage/emulated/0/DCIM/Camera/IMG_20200911_124321.jpg,image/jpeg,4000,2250,90,6006088,,1637504756,1599821005000,1599821005309,0,0,0,,,,,,,,,,, +18045,4100,content://media/external/images/media/4100,/storage/emulated/0/DCIM/Camera/IMG_20200911_123821.jpg,image/jpeg,4000,2250,90,5343424,,1637504400,1599820703000,1599820703082,0,0,0,,,,,,,,,,, +18046,3827,content://media/external/images/media/3827,/storage/emulated/0/DCIM/Camera/IMG_20200911_123730.jpg,image/jpeg,4000,2250,90,6689912,,1637503630,1599820653000,1599820653119,0,0,0,,,,,,,,,,, +18047,4758,content://media/external/images/media/4758,/storage/emulated/0/DCIM/Camera/IMG_20200911_120553.jpg,image/jpeg,276,188,0,36151,,1637505639,1599818753000,0,0,0,0,,,,,,,,,,, +18048,4140,content://media/external/images/media/4140,/storage/emulated/0/DCIM/Camera/IMG_20200911_120320.jpg,image/jpeg,4160,2340,0,6917934,,1637504473,1599818600000,1599818600375,0,0,0,,,,,,,,,,, +18049,4247,content://media/external/images/media/4247,/storage/emulated/0/DCIM/Camera/IMG_20200911_120013.jpg,image/jpeg,4000,2250,0,7687489,,1637504734,1599818415000,1599818415436,0,0,0,,,,,,,,,,, +18050,4734,content://media/external/images/media/4734,/storage/emulated/0/DCIM/Camera/IMG_20200911_115504.jpg,image/jpeg,276,188,0,25830,,1637505574,1599818104000,0,0,0,0,,,,,,,,,,, +18051,3380,content://media/external/images/media/3380,/storage/emulated/0/DCIM/Camera/IMG_20200911_115357.jpg,image/jpeg,495,390,0,83683,,1637502523,1599818037000,0,0,0,0,,,,,,,,,,, +18052,3515,content://media/external/images/media/3515,/storage/emulated/0/DCIM/Camera/IMG_20200911_115239.jpg,image/jpeg,4160,2340,0,7359923,,1637502969,1599817959000,1599817959191,0,0,0,,,,,,,,,,, +18053,4356,content://media/external/images/media/4356,/storage/emulated/0/DCIM/Camera/IMG_20200911_115216.jpg,image/jpeg,4000,2250,90,4815173,,1637504970,1599817941000,1599817940772,0,0,0,,,,,,,,,,, +18054,3149,content://media/external/images/media/3149,/storage/emulated/0/DCIM/Camera/IMG_20200911_115218.jpg,image/jpeg,720,1280,0,211389,,1637502130,1599817939000,0,0,0,0,,,,,,,,,,, +18055,4099,content://media/external/images/media/4099,/storage/emulated/0/DCIM/Camera/IMG_20200911_115147.jpg,image/jpeg,4000,2250,90,6263070,,1637504400,1599817908000,1599817908855,0,0,0,,,,,,,,,,, +18056,2972,content://media/external/images/media/2972,/storage/emulated/0/DCIM/Camera/IMG_20200911_115048.jpg,image/jpeg,4000,2250,0,4475768,,1637501684,1599817850000,1599817850478,0,0,0,,,,,,,,,,, +18057,4914,content://media/external/images/media/4914,/storage/emulated/0/DCIM/Camera/IMG_20200911_115049.jpg,image/jpeg,4000,2250,0,4647135,,1637505944,1599817850000,1599817850613,0,0,0,,,,,,,,,,, +18058,2971,content://media/external/images/media/2971,/storage/emulated/0/DCIM/Camera/IMG_20200911_115045.jpg,image/jpeg,4000,2250,0,4401185,,1637501684,1599817847000,1599817847183,0,0,0,,,,,,,,,,, +18059,4415,content://media/external/images/media/4415,/storage/emulated/0/DCIM/Camera/IMG_20200911_115042.jpg,image/jpeg,4000,2250,0,4403118,,1637505063,1599817843000,1599817843545,0,0,0,,,,,,,,,,, +18060,4062,content://media/external/images/media/4062,/storage/emulated/0/DCIM/Camera/IMG_20200911_114545.jpg,image/jpeg,4000,2250,90,5090135,,1637504342,1599817546000,1599817546650,0,0,0,,,,,,,,,,, +18061,3514,content://media/external/images/media/3514,/storage/emulated/0/DCIM/Camera/IMG_20200911_113918.jpg,image/jpeg,4000,2250,90,5349577,,1637502969,1599817162000,1599817162614,0,0,0,,,,,,,,,,, +18062,4929,content://media/external/images/media/4929,/storage/emulated/0/DCIM/Camera/IMG_20200911_113845.jpg,image/jpeg,4000,2250,0,6399373,,1637506010,1599817131000,1599817131112,0,0,0,,,,,,,,,,, +18063,4646,content://media/external/images/media/4646,/storage/emulated/0/DCIM/Camera/IMG_20200911_113830.jpg,image/jpeg,4000,2250,90,6706207,,1637505414,1599817112000,1599817112241,0,0,0,,,,,,,,,,, +18064,3288,content://media/external/images/media/3288,/storage/emulated/0/DCIM/Camera/IMG_20200911_113023.jpg,image/jpeg,1148,1987,0,1399752,,1637502355,1599816623000,1599816296127,0,0,0,,,,,,,,,,, +18065,4546,content://media/external/images/media/4546,/storage/emulated/0/DCIM/Camera/IMG_20200911_112456.jpg,image/jpeg,4000,2250,0,8036775,,1637505187,1599816296000,1599816296127,0,0,0,,,,,,,,,,, +18066,3379,content://media/external/images/media/3379,/storage/emulated/0/DCIM/Camera/IMG_20200911_112359.jpg,image/jpeg,4000,2250,0,6224780,,1637502523,1599816243000,1599816243515,0,0,0,,,,,,,,,,, +18067,4439,content://media/external/images/media/4439,/storage/emulated/0/DCIM/Camera/IMG_20200911_112353.jpg,image/jpeg,4000,2250,0,6858236,,1637505068,1599816235000,1599816235665,0,0,0,,,,,,,,,,, +18068,4950,content://media/external/images/media/4950,/storage/emulated/0/DCIM/Camera/IMG_20200911_111158.jpg,image/jpeg,4000,2250,0,7230358,,1637506015,1599815520000,1599815520215,0,0,0,,,,,,,,,,, +18069,4487,content://media/external/images/media/4487,/storage/emulated/0/DCIM/Camera/IMG_20200911_111141.jpg,image/jpeg,4000,2250,0,7525507,,1637505122,1599815504000,1599815503851,0,0,0,,,,,,,,,,, +18070,4494,content://media/external/images/media/4494,/storage/emulated/0/DCIM/Camera/PANO_20200910_174031.jpg,image/jpeg,6512,3712,0,14770425,,1637505122,1599752439000,0,0,0,0,,,,,,,,,,, +18071,4445,content://media/external/images/media/4445,/storage/emulated/0/DCIM/Camera/PANO_20200910_162350.jpg,image/jpeg,6896,3616,0,16762572,,1637505068,1599747839000,0,0,0,0,,,,,,,,,,, +18072,4139,content://media/external/images/media/4139,/storage/emulated/0/DCIM/Camera/IMG_20200910_162340.jpg,image/jpeg,4000,2250,0,6452919,,1637504473,1599747822000,1599747822098,0,0,0,,,,,,,,,,, +18073,3342,content://media/external/images/media/3342,/storage/emulated/0/DCIM/Camera/IMG_20200910_162316.jpg,image/jpeg,4000,2250,0,4068888,,1637502439,1599747802000,1599747802355,0,0,0,,,,,,,,,,, +18074,4138,content://media/external/images/media/4138,/storage/emulated/0/DCIM/Camera/IMG_20200910_162244.jpg,image/jpeg,4000,2250,90,5967860,,1637504473,1599747766000,1599747766563,0,0,0,,,,,,,,,,, +18075,3895,content://media/external/images/media/3895,/storage/emulated/0/DCIM/Camera/IMG_20200910_162234.jpg,image/jpeg,4000,2250,0,6125255,,1637503732,1599747757000,1599747757466,0,0,0,,,,,,,,,,, +18076,4928,content://media/external/images/media/4928,/storage/emulated/0/DCIM/Camera/IMG_20200910_153011.jpg,image/jpeg,4160,2340,90,4530148,,1637506010,1599744611000,1599744611662,0,0,0,,,,,,,,,,, +18077,7287,content://media/external/images/media/7287,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200910-WA0003.jpg",image/jpeg,900,1600,0,129819,,1637518223,1599743099000,0,0,0,0,,,,,,,,,,, +18078,7564,content://media/external/images/media/7564,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200910-WA0002.jpg",image/jpeg,900,1600,0,161415,,1637518223,1599743086000,0,0,0,0,,,,,,,,,,, +18079,3965,content://media/external/images/media/3965,/storage/emulated/0/DCIM/Camera/PANO_20200910_125921.jpg,image/jpeg,9872,3648,0,27935219,,1637503942,1599735570000,0,0,0,0,,,,,,,,,,, +18080,4927,content://media/external/images/media/4927,/storage/emulated/0/DCIM/Camera/IMG_20200910_124430.jpg,image/jpeg,4000,2250,90,7061698,,1637506010,1599734672000,1599734672342,0,0,0,,,,,,,,,,, +18081,3582,content://media/external/images/media/3582,/storage/emulated/0/DCIM/Camera/IMG_20200910_121537.jpg,image/jpeg,4000,2250,90,6816162,,1637503154,1599732939000,1599732938969,0,0,0,,,,,,,,,,, +18082,4286,content://media/external/images/media/4286,/storage/emulated/0/DCIM/Camera/IMG_20200910_115222.jpg,image/jpeg,4000,2250,0,5104705,,1637504807,1599731545000,1599731545814,0,0,0,,,,,,,,,,, +18083,3826,content://media/external/images/media/3826,/storage/emulated/0/DCIM/Camera/IMG_20200910_114508.jpg,image/jpeg,4000,2250,0,4759962,,1637503629,1599731112000,1599731111955,0,0,0,,,,,,,,,,, +18084,5000,content://media/external/images/media/5000,/storage/emulated/0/DCIM/Camera/IMG_20200910_114446.jpg,image/jpeg,4160,2340,0,5332824,,1637506101,1599731086000,1599731086695,0,0,0,,,,,,,,,,, +18085,3031,content://media/external/images/media/3031,/storage/emulated/0/DCIM/Camera/IMG_20200910_114231.jpg,image/jpeg,4000,2250,90,5448143,,1637501805,1599730956000,1599730956245,0,0,0,,,,,,,,,,, +18086,3229,content://media/external/images/media/3229,/storage/emulated/0/DCIM/Camera/IMG_20200910_112243.jpg,image/jpeg,4000,2250,90,5370069,,1637502258,1599729764000,1599729764576,0,0,0,,,,,,,,,,, +18087,3186,content://media/external/images/media/3186,/storage/emulated/0/DCIM/Camera/IMG_20200910_111338.jpg,image/jpeg,4160,2340,0,5279281,,1637502161,1599729218000,1599729218215,0,0,0,,,,,,,,,,, +18088,4865,content://media/external/images/media/4865,/storage/emulated/0/DCIM/Camera/IMG_20200910_111235.jpg,image/jpeg,4160,2340,0,5113997,,1637505831,1599729155000,1599729155775,0,0,0,,,,,,,,,,, +18089,3811,content://media/external/images/media/3811,/storage/emulated/0/DCIM/Camera/IMG_20200910_103704.jpg,image/jpeg,4000,2250,0,5498723,,1637503601,1599727026000,1599727025965,0,0,0,,,,,,,,,,, +18090,4155,content://media/external/images/media/4155,/storage/emulated/0/DCIM/Camera/IMG_20200910_103648.jpg,image/jpeg,4000,2250,90,5750885,,1637504481,1599727010000,1599727010347,0,0,0,,,,,,,,,,, +18091,4556,content://media/external/images/media/4556,/storage/emulated/0/DCIM/Camera/PANO_20200910_102007.jpg,image/jpeg,7952,3744,0,25173157,,1637505187,1599726019000,0,0,0,0,,,,,,,,,,, +18092,4468,content://media/external/images/media/4468,/storage/emulated/0/DCIM/Camera/IMG_20200910_102002.jpg,image/jpeg,4160,2340,0,5710631,,1637505091,1599726002000,1599726002214,0,0,0,,,,,,,,,,, +18093,6715,content://media/external/images/media/6715,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0075.jpg",image/jpeg,1024,313,0,62844,,1637518222,1599656915000,0,0,0,0,,,,,,,,,,, +18094,3757,content://media/external/images/media/3757,/storage/emulated/0/DCIM/Camera/PANO_20200909_150529.jpg,image/jpeg,7696,3584,0,21775496,,1637503488,1599656735000,0,0,0,0,,,,,,,,,,, +18095,6819,content://media/external/images/media/6819,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0074.jpg",image/jpeg,1024,768,0,125498,,1637518222,1599653242000,0,0,0,0,,,,,,,,,,, +18096,6714,content://media/external/images/media/6714,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0073.jpg",image/jpeg,1024,372,0,78118,,1637518222,1599653119000,0,0,0,0,,,,,,,,,,, +18097,6397,content://media/external/images/media/6397,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0072.jpg",image/jpeg,900,1600,0,147832,,1637518221,1599653078000,0,0,0,0,,,,,,,,,,, +18098,6619,content://media/external/images/media/6619,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0071.jpg",image/jpeg,578,897,0,41239,,1637518221,1599653078000,0,0,0,0,,,,,,,,,,, +18099,6507,content://media/external/images/media/6507,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0068.jpg",image/jpeg,900,1600,0,228237,,1637518221,1599653077000,0,0,0,0,,,,,,,,,,, +18100,6817,content://media/external/images/media/6817,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0069.jpg",image/jpeg,900,1600,0,193069,,1637518222,1599653077000,0,0,0,0,,,,,,,,,,, +18101,6396,content://media/external/images/media/6396,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0065.jpg",image/jpeg,900,1600,0,203432,,1637518221,1599653076000,0,0,0,0,,,,,,,,,,, +18102,6942,content://media/external/images/media/6942,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0064.jpg",image/jpeg,900,1600,0,268231,,1637518222,1599653076000,0,0,0,0,,,,,,,,,,, +18103,3267,content://media/external/images/media/3267,/storage/emulated/0/DCIM/Camera/IMG_20200909_131618.jpg,image/jpeg,4000,2250,0,7608102,,1637502342,1599650180000,1599650180051,0,0,0,,,,,,,,,,, +18104,3847,content://media/external/images/media/3847,/storage/emulated/0/DCIM/Camera/IMG_20200909_131155.jpg,image/jpeg,4160,2340,90,4503778,,1637503642,1599649915000,1599649914858,0,0,0,,,,,,,,,,, +18105,4399,content://media/external/images/media/4399,/storage/emulated/0/DCIM/Camera/IMG_20200909_123518.jpg,image/jpeg,4000,2250,90,6109036,,1637505004,1599647720000,1599647720215,0,0,0,,,,,,,,,,, +18106,4608,content://media/external/images/media/4608,/storage/emulated/0/DCIM/Camera/IMG_20200909_123458.jpg,image/jpeg,4000,2250,90,5758897,,1637505308,1599647700000,1599647700283,0,0,0,,,,,,,,,,, +18107,4978,content://media/external/images/media/4978,/storage/emulated/0/DCIM/Camera/IMG_20200909_102546.jpg,image/jpeg,720,1280,0,92769,,1637506097,1599639946000,0,0,0,0,,,,,,,,,,, +18108,2910,content://media/external/images/media/2910,/storage/emulated/0/DCIM/Camera/IMG_20200909_102507.jpg,image/jpeg,1669,2488,0,829742,,1637501534,1599639908000,1599639849672,0,0,0,,,,,,,,,,, +18109,3148,content://media/external/images/media/3148,/storage/emulated/0/DCIM/Camera/IMG_20200909_102406.jpg,image/jpeg,4000,2250,90,3489763,,1637502130,1599639849000,1599639849672,0,0,0,,,,,,,,,,, +18110,4226,content://media/external/images/media/4226,/storage/emulated/0/DCIM/Camera/IMG_20200909_084500.jpg,image/jpeg,4000,2250,0,5302325,,1637504726,1599633903000,1599633903054,0,0,0,,,,,,,,,,, +18111,3942,content://media/external/images/media/3942,/storage/emulated/0/DCIM/Camera/IMG_20200909_084419.jpg,image/jpeg,8000,6000,0,22081262,,1637503853,1599633862000,1599633862463,0,0,0,,,,,,,,,,, +18112,2845,content://media/external/images/media/2845,/storage/emulated/0/DCIM/Camera/IMG_20200909_084408.jpg,image/jpeg,8000,6000,0,20858216,,1637501431,1599633852000,1599633851876,0,0,0,,,,,,,,,,, +18113,2878,content://media/external/images/media/2878,/storage/emulated/0/DCIM/Camera/IMG_20200909_084325.jpg,image/jpeg,4000,2250,0,5191038,,1637501460,1599633805000,1599633805207,0,0,0,,,,,,,,,,, +18114,4154,content://media/external/images/media/4154,/storage/emulated/0/DCIM/Camera/IMG_20200909_081531.jpg,image/jpeg,4000,2250,0,5107094,,1637504481,1599632133000,1599632133728,0,0,0,,,,,,,,,,, +18115,2787,content://media/external/images/media/2787,/storage/emulated/0/DCIM/Camera/IMG_20200909_075801.jpg,image/jpeg,4160,2340,0,3117309,,1637501282,1599631081000,1599631081850,0,0,0,,,,,,,,,,, +18116,3266,content://media/external/images/media/3266,/storage/emulated/0/DCIM/Camera/IMG_20200909_075755.jpg,image/jpeg,4160,2340,0,3126640,,1637502342,1599631075000,1599631074966,0,0,0,,,,,,,,,,, +18117,6618,content://media/external/images/media/6618,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200908-WA0024.jpg",image/jpeg,1024,768,0,229098,,1637518221,1599597324000,0,0,0,0,,,,,,,,,,, +18118,7563,content://media/external/images/media/7563,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200908-WA0025.jpg",image/jpeg,1024,442,0,100689,,1637518223,1599597324000,0,0,0,0,,,,,,,,,,, +18119,6711,content://media/external/images/media/6711,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200908-WA0023.jpg",image/jpeg,1024,417,0,97227,,1637518222,1599597323000,0,0,0,0,,,,,,,,,,, +18120,7063,content://media/external/images/media/7063,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200908-WA0022.jpg",image/jpeg,1024,768,0,208148,,1637518222,1599597323000,0,0,0,0,,,,,,,,,,, +18121,4285,content://media/external/images/media/4285,/storage/emulated/0/DCIM/Camera/IMG_20200908_155445.jpg,image/jpeg,4000,2250,0,6431824,,1637504807,1599573287000,1599573287080,0,0,0,,,,,,,,,,, +18122,4486,content://media/external/images/media/4486,/storage/emulated/0/DCIM/Camera/IMG_20200908_155430.jpg,image/jpeg,4000,2250,0,6071294,,1637505122,1599573271000,1599573271513,0,0,0,,,,,,,,,,, +18123,4061,content://media/external/images/media/4061,/storage/emulated/0/DCIM/Camera/IMG_20200908_155424.jpg,image/jpeg,4000,2250,0,6734530,,1637504342,1599573265000,1599573265667,0,0,0,,,,,,,,,,, +18124,3494,content://media/external/images/media/3494,/storage/emulated/0/DCIM/Camera/IMG_20200908_134619.jpg,image/jpeg,4160,2340,90,5768616,,1637502870,1599565579000,1599565579588,0,0,0,,,,,,,,,,, +18125,3874,content://media/external/images/media/3874,/storage/emulated/0/DCIM/Camera/IMG_20200908_134334.jpg,image/jpeg,4160,2340,0,5297559,,1637503729,1599565414000,1599565414083,0,0,0,,,,,,,,,,, +18126,3048,content://media/external/images/media/3048,/storage/emulated/0/DCIM/Camera/IMG_20200908_133547.jpg,image/jpeg,4000,2250,90,6442501,,1637501858,1599564949000,1599564949391,0,0,0,,,,,,,,,,, +18127,4820,content://media/external/images/media/4820,/storage/emulated/0/DCIM/Camera/IMG_20200908_132823.jpg,image/jpeg,4160,2340,0,5902199,,1637505730,1599564503000,1599564503204,0,0,0,,,,,,,,,,, +18128,3378,content://media/external/images/media/3378,/storage/emulated/0/DCIM/Camera/IMG_20200908_110617.jpg,image/jpeg,4000,2250,0,4586170,,1637502523,1599555978000,1599555978499,0,0,0,,,,,,,,,,, +18129,3605,content://media/external/images/media/3605,/storage/emulated/0/DCIM/Camera/IMG_20200908_110615.jpg,image/jpeg,4000,2250,0,4782505,,1637503238,1599555977000,1599555977114,0,0,0,,,,,,,,,,, +18130,4757,content://media/external/images/media/4757,/storage/emulated/0/DCIM/Camera/IMG_20200908_110610.jpg,image/jpeg,4000,2250,90,4495179,,1637505639,1599555972000,1599555971985,0,0,0,,,,,,,,,,, +18131,2907,content://media/external/images/media/2907,/storage/emulated/0/DCIM/Camera/IMG_20200908_110601.jpg,image/jpeg,4000,2250,90,4537891,,1637501534,1599555962000,1599555962849,0,0,0,,,,,,,,,,, +18132,3985,content://media/external/images/media/3985,/storage/emulated/0/DCIM/Camera/IMG_20200908_110602.jpg,image/jpeg,4000,2250,90,5343027,,1637504059,1599555962000,1599555962780,0,0,0,,,,,,,,,,, +18133,4733,content://media/external/images/media/4733,/storage/emulated/0/DCIM/Camera/IMG_20200908_110405.jpg,image/jpeg,4000,2250,0,4321721,,1637505574,1599555847000,1599555847215,0,0,0,,,,,,,,,,, +18134,2786,content://media/external/images/media/2786,/storage/emulated/0/DCIM/Camera/IMG_20200908_110346.jpg,image/jpeg,4000,2250,0,4375228,,1637501282,1599555828000,1599555828785,0,0,0,,,,,,,,,,, +18135,2877,content://media/external/images/media/2877,/storage/emulated/0/DCIM/Camera/IMG_20200908_105721.jpg,image/jpeg,4000,2250,90,4169937,,1637501460,1599555443000,1599555443675,0,0,0,,,,,,,,,,, +18136,3873,content://media/external/images/media/3873,/storage/emulated/0/DCIM/Camera/IMG_20200908_105711.jpg,image/jpeg,4000,2250,90,5306332,,1637503729,1599555432000,1599555432816,0,0,0,,,,,,,,,,, +18137,3324,content://media/external/images/media/3324,/storage/emulated/0/DCIM/Camera/IMG_20200908_105626.jpg,image/jpeg,4000,2250,90,5156675,,1637502438,1599555388000,1599555388519,0,0,0,,,,,,,,,,, +18138,2906,content://media/external/images/media/2906,/storage/emulated/0/DCIM/Camera/IMG_20200908_103130.jpg,image/jpeg,4000,2250,90,4966981,,1637501534,1599553891000,1599553891200,0,0,0,,,,,,,,,,, +18139,3091,content://media/external/images/media/3091,/storage/emulated/0/DCIM/Camera/IMG_20200908_103115.jpg,image/jpeg,4000,2250,90,6651067,,1637501971,1599553877000,1599553876863,0,0,0,,,,,,,,,,, +18140,3728,content://media/external/images/media/3728,/storage/emulated/0/DCIM/Camera/IMG_20200908_020024.jpg,image/jpeg,4000,2250,0,3211017,,1637503477,1599523226000,1599523226576,0,0,0,,,,,,,,,,, +18141,4153,content://media/external/images/media/4153,/storage/emulated/0/DCIM/Camera/IMG_20200908_020014.jpg,image/jpeg,4000,2250,0,4840313,,1637504481,1599523216000,1599523216216,0,0,0,,,,,,,,,,, +18142,3400,content://media/external/images/media/3400,/storage/emulated/0/DCIM/Camera/IMG_20200908_011408_BURST1.jpg,image/jpeg,4000,2250,0,1435555,,1637502598,1599520447000,1599520447531,0,0,0,,,,,,,,,,, +18143,3789,content://media/external/images/media/3789,/storage/emulated/0/DCIM/Camera/IMG_20200908_011404.jpg,image/jpeg,4000,2250,0,4040170,,1637503558,1599520446000,1599520446300,0,0,0,,,,,,,,,,, +18144,4060,content://media/external/images/media/4060,/storage/emulated/0/DCIM/Camera/IMG_20200908_000808.jpg,image/jpeg,4000,2250,90,4438528,,1637504342,1599516489000,1599516489777,0,0,0,,,,,,,,,,, +18145,4059,content://media/external/images/media/4059,/storage/emulated/0/DCIM/Camera/IMG_20200908_000745.jpg,image/jpeg,4000,2250,90,4899830,,1637504342,1599516467000,1599516467028,0,0,0,,,,,,,,,,, +18146,2785,content://media/external/images/media/2785,/storage/emulated/0/DCIM/Camera/IMG_20200908_000643.jpg,image/jpeg,4160,2340,0,3636701,,1637501282,1599516403000,1599516403570,0,0,0,,,,,,,,,,, +18147,2784,content://media/external/images/media/2784,/storage/emulated/0/DCIM/Camera/IMG_20200908_000639.jpg,image/jpeg,4160,2340,0,3134431,,1637501282,1599516399000,1599516399635,0,0,0,,,,,,,,,,, +18148,3534,content://media/external/images/media/3534,/storage/emulated/0/DCIM/Camera/IMG_20200908_000608.jpg,image/jpeg,4000,2250,90,4206196,,1637503010,1599516369000,1599516369837,0,0,0,,,,,,,,,,, +18149,2925,content://media/external/images/media/2925,/storage/emulated/0/DCIM/Camera/IMG_20200907_231233.jpg,image/jpeg,4000,2250,90,5365935,,1637501599,1599513155000,1599513155068,0,0,0,,,,,,,,,,, +18150,3533,content://media/external/images/media/3533,/storage/emulated/0/DCIM/Camera/IMG_20200907_222616.jpg,image/jpeg,4000,2250,0,5256984,,1637503010,1599510377000,1599510377242,0,0,0,,,,,,,,,,, +18151,4798,content://media/external/images/media/4798,/storage/emulated/0/DCIM/Camera/IMG_20200907_222611.jpg,image/jpeg,4000,2250,0,4775600,,1637505663,1599510372000,1599510372576,0,0,0,,,,,,,,,,, +18152,4507,content://media/external/images/media/4507,/storage/emulated/0/DCIM/Camera/IMG_20200907_222606.jpg,image/jpeg,4000,2250,0,4110885,,1637505160,1599510367000,1599510367566,0,0,0,,,,,,,,,,, +18153,4310,content://media/external/images/media/4310,/storage/emulated/0/DCIM/Camera/IMG_20200907_222557.jpg,image/jpeg,4160,2340,0,4172303,,1637504817,1599510357000,1599510357362,0,0,0,,,,,,,,,,, +18154,3825,content://media/external/images/media/3825,/storage/emulated/0/DCIM/Camera/IMG_20200907_155711.jpg,image/jpeg,4000,2250,90,7509543,,1637503629,1599487036000,1599487036132,0,0,0,,,,,,,,,,, +18155,3788,content://media/external/images/media/3788,/storage/emulated/0/DCIM/Camera/IMG_20200907_155557.jpg,image/jpeg,4000,2250,90,7484674,,1637503558,1599486962000,1599486962826,0,0,0,,,,,,,,,,, +18156,2783,content://media/external/images/media/2783,/storage/emulated/0/DCIM/Camera/IMG_20200907_154728.jpg,image/jpeg,4160,2340,0,3969603,,1637501282,1599486448000,1599486448877,0,0,0,,,,,,,,,,, +18157,3513,content://media/external/images/media/3513,/storage/emulated/0/DCIM/Camera/IMG_20200907_154700.jpg,image/jpeg,4160,2340,0,6298956,,1637502969,1599486420000,1599486420668,0,0,0,,,,,,,,,,, +18158,4526,content://media/external/images/media/4526,/storage/emulated/0/DCIM/Camera/IMG_20200907_154645.jpg,image/jpeg,4000,2250,0,6794667,,1637505165,1599486407000,1599486407207,0,0,0,,,,,,,,,,, +18159,3287,content://media/external/images/media/3287,/storage/emulated/0/DCIM/Camera/IMG_20200907_105656.jpg,image/jpeg,4160,2340,0,3614414,,1637502355,1599469016000,1599469016354,0,0,0,,,,,,,,,,, +18160,3581,content://media/external/images/media/3581,/storage/emulated/0/DCIM/Camera/IMG_20200907_105616.jpg,image/jpeg,4000,2250,0,4232453,,1637503154,1599468978000,1599468977999,0,0,0,,,,,,,,,,, +18161,3147,content://media/external/images/media/3147,/storage/emulated/0/DCIM/Camera/IMG_20200907_105614.jpg,image/jpeg,4000,2250,0,4350740,,1637502130,1599468975000,1599468975880,0,0,0,,,,,,,,,,, +18162,3323,content://media/external/images/media/3323,/storage/emulated/0/DCIM/Camera/IMG_20200907_104940.jpg,image/jpeg,4000,2250,0,5295169,,1637502438,1599468582000,1599468582421,0,0,0,,,,,,,,,,, +18163,4355,content://media/external/images/media/4355,/storage/emulated/0/DCIM/Camera/IMG_20200907_011245.jpg,image/jpeg,4000,2250,0,2607901,,1637504970,1599433967000,1599433967613,0,0,0,,,,,,,,,,, +18164,7062,content://media/external/images/media/7062,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0050.jpg",image/jpeg,1024,769,0,86371,,1637518222,1599428484000,0,0,0,0,,,,,,,,,,, +18165,6943,content://media/external/images/media/6943,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0049.jpg",image/jpeg,1024,769,0,81103,,1637518222,1599428483000,0,0,0,0,,,,,,,,,,, +18166,7061,content://media/external/images/media/7061,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0048.jpg",image/jpeg,1024,769,0,94510,,1637518222,1599428483000,0,0,0,0,,,,,,,,,,, +18167,6617,content://media/external/images/media/6617,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0045.jpg",image/jpeg,768,1024,0,84333,,1637518221,1599425378000,0,0,0,0,,,,,,,,,,, +18168,6940,content://media/external/images/media/6940,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0044.jpg",image/jpeg,1024,768,0,101710,,1637518222,1599416481000,0,0,0,0,,,,,,,,,,, +18169,6506,content://media/external/images/media/6506,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0042.jpg",image/jpeg,1024,768,0,106356,,1637518221,1599416309000,0,0,0,0,,,,,,,,,,, +18170,6270,content://media/external/images/media/6270,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0039.jpg",image/jpeg,1200,1600,0,178152,,1637518221,1599411087000,0,0,0,0,,,,,,,,,,, +18171,6710,content://media/external/images/media/6710,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0038.jpg",image/jpeg,1024,768,0,152976,,1637518222,1599409744000,0,0,0,0,,,,,,,,,,, +18172,6394,content://media/external/images/media/6394,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0037.jpg",image/jpeg,1024,768,0,160799,,1637518221,1599409743000,0,0,0,0,,,,,,,,,,, +18173,6616,content://media/external/images/media/6616,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0035.jpg",image/jpeg,1024,768,0,160229,,1637518221,1599409743000,0,0,0,0,,,,,,,,,,, +18174,6941,content://media/external/images/media/6941,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0036.jpg",image/jpeg,1024,768,0,157048,,1637518222,1599409743000,0,0,0,0,,,,,,,,,,, +18175,6395,content://media/external/images/media/6395,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0034.jpg",image/jpeg,1024,768,0,163064,,1637518221,1599409742000,0,0,0,0,,,,,,,,,,, +18176,6939,content://media/external/images/media/6939,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0032.jpg",image/jpeg,1024,768,0,161796,,1637518222,1599409741000,0,0,0,0,,,,,,,,,,, +18177,6709,content://media/external/images/media/6709,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0030.jpg",image/jpeg,768,1024,0,115219,,1637518222,1599409587000,0,0,0,0,,,,,,,,,,, +18178,6816,content://media/external/images/media/6816,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0022.jpg",image/jpeg,1600,1200,0,170373,,1637518222,1599409489000,0,0,0,0,,,,,,,,,,, +18179,4913,content://media/external/images/media/4913,/storage/emulated/0/DCIM/Camera/IMG_20200906_182317.jpg,image/jpeg,4000,2250,0,3916237,,1637505944,1599409401000,1599409401044,0,0,0,,,,,,,,,,, +18180,3787,content://media/external/images/media/3787,/storage/emulated/0/DCIM/Camera/IMG_20200906_182316.jpg,image/jpeg,4000,2250,0,3970710,,1637503558,1599409400000,1599409399960,0,0,0,,,,,,,,,,, +18181,3810,content://media/external/images/media/3810,/storage/emulated/0/DCIM/Camera/IMG_20200906_182314.jpg,image/jpeg,4000,2250,0,3972899,,1637503601,1599409398000,1599409398830,0,0,0,,,,,,,,,,, +18182,6393,content://media/external/images/media/6393,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0029.jpg",image/jpeg,1600,1200,0,228175,,1637518221,1599408726000,0,0,0,0,,,,,,,,,,, +18183,6504,content://media/external/images/media/6504,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0028.jpg",image/jpeg,1600,1200,0,182772,,1637518221,1599408699000,0,0,0,0,,,,,,,,,,, +18184,7060,content://media/external/images/media/7060,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0027.jpg",image/jpeg,1600,1200,0,187863,,1637518222,1599408699000,0,0,0,0,,,,,,,,,,, +18185,6937,content://media/external/images/media/6937,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0026.jpg",image/jpeg,1600,1200,0,167117,,1637518222,1599408698000,0,0,0,0,,,,,,,,,,, +18186,7058,content://media/external/images/media/7058,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0025.jpg",image/jpeg,1600,1200,0,164716,,1637518222,1599408698000,0,0,0,0,,,,,,,,,,, +18187,6938,content://media/external/images/media/6938,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0024.jpg",image/jpeg,1600,1200,0,165280,,1637518222,1599408697000,0,0,0,0,,,,,,,,,,, +18188,7059,content://media/external/images/media/7059,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0023.jpg",image/jpeg,1600,1200,0,187924,,1637518222,1599408697000,0,0,0,0,,,,,,,,,,, +18189,7057,content://media/external/images/media/7057,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0021.jpg",image/jpeg,1600,1200,0,186236,,1637518222,1599408695000,0,0,0,0,,,,,,,,,,, +18190,6707,content://media/external/images/media/6707,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0019.jpg",image/jpeg,768,1024,0,143713,,1637518222,1599407150000,0,0,0,0,,,,,,,,,,, +18191,7056,content://media/external/images/media/7056,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0018.jpg",image/jpeg,768,1024,0,144251,,1637518222,1599407040000,0,0,0,0,,,,,,,,,,, +18192,6815,content://media/external/images/media/6815,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0012.jpg",image/jpeg,1200,1600,0,184702,,1637518222,1599390853000,0,0,0,0,,,,,,,,,,, +18193,4455,content://media/external/images/media/4455,/storage/emulated/0/DCIM/Camera/IMG_20200906_081546.jpg,image/jpeg,4000,2250,90,4953180,,1637505068,1599372949000,1599372949170,0,0,0,,,,,,,,,,, +18194,4467,content://media/external/images/media/4467,/storage/emulated/0/DCIM/Camera/IMG_20200906_073255.jpg,image/jpeg,4160,2340,0,4900454,,1637505091,1599370375000,1599370375338,0,0,0,,,,,,,,,,, +18195,4863,content://media/external/images/media/4863,/storage/emulated/0/DCIM/Camera/IMG_20200906_073242.jpg,image/jpeg,4000,2250,0,5190735,,1637505831,1599370364000,1599370364741,0,0,0,,,,,,,,,,, +18196,2782,content://media/external/images/media/2782,/storage/emulated/0/DCIM/Camera/IMG_20200905_210348.jpg,image/jpeg,4160,2340,0,1997738,,1637501282,1599332628000,1599332628026,0,0,0,,,,,,,,,,, +18197,3329,content://media/external/images/media/3329,/storage/emulated/0/DCIM/Camera/PANO_20200905_210212.jpg,image/jpeg,7056,3680,0,12681069,,1637502439,1599332544000,0,0,0,0,,,,,,,,,,, +18198,4246,content://media/external/images/media/4246,/storage/emulated/0/DCIM/Camera/IMG_20200905_210104.jpg,image/jpeg,4000,2250,90,4098841,,1637504734,1599332468000,1599332467925,0,0,0,,,,,,,,,,, +18199,3171,content://media/external/images/media/3171,/storage/emulated/0/DCIM/Camera/IMG_20200905_210051.jpg,image/jpeg,4000,2250,0,3516189,,1637502143,1599332452000,1599332452660,0,0,0,,,,,,,,,,, +18200,2905,content://media/external/images/media/2905,/storage/emulated/0/DCIM/Camera/IMG_20200905_210040.jpg,image/jpeg,4000,2250,0,4994075,,1637501534,1599332442000,1599332442815,0,0,0,,,,,,,,,,, +18201,3924,content://media/external/images/media/3924,/storage/emulated/0/DCIM/Camera/IMG_20200905_205621.jpg,image/jpeg,4160,2340,90,4020203,,1637503834,1599332181000,1599332180957,0,0,0,,,,,,,,,,, +18202,3809,content://media/external/images/media/3809,/storage/emulated/0/DCIM/Camera/IMG_20200905_205512.jpg,image/jpeg,4000,2250,90,2819583,,1637503601,1599332116000,1599332116479,0,0,0,,,,,,,,,,, +18203,4999,content://media/external/images/media/4999,/storage/emulated/0/DCIM/Camera/IMG_20200905_205221.jpg,image/jpeg,4160,2340,0,2219264,,1637506101,1599331941000,1599331941508,0,0,0,,,,,,,,,,, +18204,4354,content://media/external/images/media/4354,/storage/emulated/0/DCIM/Camera/IMG_20200905_205204.jpg,image/jpeg,4000,2250,0,4021746,,1637504970,1599331928000,1599331927845,0,0,0,,,,,,,,,,, +18205,3983,content://media/external/images/media/3983,/storage/emulated/0/DCIM/Camera/IMG_20200905_194723.jpg,image/jpeg,4000,2250,0,4010102,,1637504059,1599328045000,1599328045385,0,0,0,,,,,,,,,,, +18206,3604,content://media/external/images/media/3604,/storage/emulated/0/DCIM/Camera/IMG_20200905_193457.jpg,image/jpeg,4000,2250,0,3302285,,1637503238,1599327303000,1599327302998,0,0,0,,,,,,,,,,, +18207,3286,content://media/external/images/media/3286,/storage/emulated/0/DCIM/Camera/IMG_20200905_193446.jpg,image/jpeg,4000,2250,0,3283150,,1637502355,1599327288000,1599327288849,0,0,0,,,,,,,,,,, +18208,3551,content://media/external/images/media/3551,/storage/emulated/0/DCIM/Camera/IMG_20200905_193437.jpg,image/jpeg,4000,2250,0,4312145,,1637503058,1599327279000,1599327279238,0,0,0,,,,,,,,,,, +18209,4414,content://media/external/images/media/4414,/storage/emulated/0/DCIM/Camera/IMG_20200905_192950.jpg,image/jpeg,4000,2250,0,3305820,,1637505063,1599326993000,1599326993694,0,0,0,,,,,,,,,,, +18210,4098,content://media/external/images/media/4098,/storage/emulated/0/DCIM/Camera/IMG_20200905_192941.jpg,image/jpeg,4000,2250,0,3473208,,1637504400,1599326984000,1599326984406,0,0,0,,,,,,,,,,, +18211,4058,content://media/external/images/media/4058,/storage/emulated/0/DCIM/Camera/IMG_20200905_185405.jpg,image/jpeg,4000,2250,0,5216625,,1637504342,1599324846000,1599324507388,0,0,0,,,,,,,,,,, +18212,3981,content://media/external/images/media/3981,/storage/emulated/0/DCIM/Camera/IMG_20200905_185258.jpg,image/jpeg,4000,2250,0,4770126,,1637504059,1599324780000,1599324780311,0,0,0,,,,,,,,,,, +18213,2781,content://media/external/images/media/2781,/storage/emulated/0/DCIM/Camera/IMG_20200905_185242.jpg,image/jpeg,4160,2340,0,4245106,,1637501282,1599324763000,1599324762801,0,0,0,,,,,,,,,,, +18214,3493,content://media/external/images/media/3493,/storage/emulated/0/DCIM/Camera/IMG_20200905_185205.jpg,image/jpeg,4160,2340,0,4852188,,1637502870,1599324725000,1599324725486,0,0,0,,,,,,,,,,, +18215,3846,content://media/external/images/media/3846,/storage/emulated/0/DCIM/Camera/IMG_20200905_185153.jpg,image/jpeg,4160,2340,0,5437440,,1637503642,1599324713000,1599324713040,0,0,0,,,,,,,,,,, +18216,4284,content://media/external/images/media/4284,/storage/emulated/0/DCIM/Camera/IMG_20200905_185031_1.jpg,image/jpeg,4000,2250,0,5790782,,1637504807,1599324631000,1599324631481,0,0,0,,,,,,,,,,, +18217,2904,content://media/external/images/media/2904,/storage/emulated/0/DCIM/Camera/IMG_20200905_185028.jpg,image/jpeg,4000,2250,0,5922338,,1637501534,1599324628000,1599324628217,0,0,0,,,,,,,,,,, +18218,4977,content://media/external/images/media/4977,/storage/emulated/0/DCIM/Camera/IMG_20200905_184639.jpg,image/jpeg,4160,2340,0,5787466,,1637506097,1599324399000,1599324398887,0,0,0,,,,,,,,,,, +18219,4398,content://media/external/images/media/4398,/storage/emulated/0/DCIM/Camera/IMG_20200905_172717.jpg,image/jpeg,4000,2250,0,5976043,,1637505004,1599319640000,1599319640136,0,0,0,,,,,,,,,,, +18220,3663,content://media/external/images/media/3663,/storage/emulated/0/DCIM/Camera/IMG_20200905_172545.jpg,image/jpeg,4000,2250,0,3181741,,1637503358,1599319546000,1599318443620,0,0,0,,,,,,,,,,, +18221,4038,content://media/external/images/media/4038,/storage/emulated/0/DCIM/Camera/IMG_20200905_170727.jpg,image/jpeg,4000,2250,180,4194439,,1637504234,1599318448000,1599318448487,0,0,0,,,,,,,,,,, +18222,4000,content://media/external/images/media/4000,/storage/emulated/0/DCIM/Camera/IMG_20200905_170722.jpg,image/jpeg,4000,2250,180,4164677,,1637504086,1599318443000,1599318443620,0,0,0,,,,,,,,,,, +18223,3377,content://media/external/images/media/3377,/storage/emulated/0/DCIM/Camera/IMG_20200905_165705.jpg,image/jpeg,4000,2250,0,4554192,,1637502523,1599317827000,1599317827104,0,0,0,,,,,,,,,,, +18224,3894,content://media/external/images/media/3894,/storage/emulated/0/DCIM/Camera/IMG_20200905_165244.jpg,image/jpeg,4000,2250,0,4701270,,1637503732,1599317565000,1599317565664,0,0,0,,,,,,,,,,, +18225,4976,content://media/external/images/media/4976,/storage/emulated/0/DCIM/Camera/IMG_20200905_164958.jpg,image/jpeg,4000,2250,0,5934266,,1637506097,1599317400000,1599317400354,0,0,0,,,,,,,,,,, +18226,2903,content://media/external/images/media/2903,/storage/emulated/0/DCIM/Camera/IMG_20200905_153502.jpg,image/jpeg,4000,2250,0,5808790,,1637501534,1599312904000,1599312904457,0,0,0,,,,,,,,,,, +18227,4167,content://media/external/images/media/4167,/storage/emulated/0/DCIM/Camera/IMG_20200905_143051.jpg,image/jpeg,4000,2250,0,4270489,,1637504556,1599309054000,1599309054166,0,0,0,,,,,,,,,,, +18228,6789,content://media/external/images/media/6789,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200905-WA0005.jpg",image/jpeg,1024,768,0,105921,,1637518222,1599295896000,0,0,0,0,,,,,,,,,,, +18229,6489,content://media/external/images/media/6489,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200905-WA0003.jpg",image/jpeg,1024,768,0,90831,,1637518221,1599295895000,0,0,0,0,,,,,,,,,,, +18230,6684,content://media/external/images/media/6684,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200905-WA0004.jpg",image/jpeg,1024,768,0,114883,,1637518222,1599295895000,0,0,0,0,,,,,,,,,,, +18231,6246,content://media/external/images/media/6246,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200905-WA0002.jpg",image/jpeg,1024,768,0,95516,,1637518221,1599295894000,0,0,0,0,,,,,,,,,,, +18232,6488,content://media/external/images/media/6488,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200905-WA0001.jpg",image/jpeg,1024,768,0,95928,,1637518221,1599294346000,0,0,0,0,,,,,,,,,,, +18233,6899,content://media/external/images/media/6899,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200904-WA0014.jpg",image/jpeg,900,1600,0,179664,,1637518222,1599240926000,0,0,0,0,,,,,,,,,,, +18234,3704,content://media/external/images/media/3704,/storage/emulated/0/DCIM/Camera/IMG_20200904_175534.jpg,image/jpeg,4000,2250,90,9496234,,1637503392,1599234938000,1599234937818,0,0,0,,,,,,,,,,, +18235,2780,content://media/external/images/media/2780,/storage/emulated/0/DCIM/Camera/IMG_20200904_175531.jpg,image/jpeg,4000,2250,90,8704835,,1637501282,1599234935000,1599234934810,0,0,0,,,,,,,,,,, +18236,6487,content://media/external/images/media/6487,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200904-WA0010.jpg",image/jpeg,900,1600,0,289876,,1637518221,1599234729000,0,0,0,0,,,,,,,,,,, +18237,3892,content://media/external/images/media/3892,/storage/emulated/0/DCIM/Camera/IMG_20200904_173827.jpg,image/jpeg,4160,2340,90,5344862,,1637503732,1599233907000,1599233907202,0,0,0,,,,,,,,,,, +18238,3980,content://media/external/images/media/3980,/storage/emulated/0/DCIM/Camera/IMG_20200904_173822.jpg,image/jpeg,4160,2340,0,5856258,,1637504059,1599233902000,1599233902096,0,0,0,,,,,,,,,,, +18239,6584,content://media/external/images/media/6584,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200904-WA0002.jpg",image/jpeg,1600,1202,0,217031,,1637518221,1599202706000,0,0,0,0,,,,,,,,,,, +18240,2924,content://media/external/images/media/2924,/storage/emulated/0/DCIM/Camera/IMG_20200829_080332.jpg,image/jpeg,4160,2340,0,5499305,,1637501599,1598681012000,1598681012425,0,0,0,,,,,,,,,,, +18241,2737,content://media/external/images/media/2737,/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-08-29-07-39-05-019_com.brytonsport.active.jpg,image/jpeg,1080,2340,0,649102,,1637500987,1598679545000,0,0,0,0,,,,,,,,,,, +18242,2844,content://media/external/images/media/2844,/storage/emulated/0/DCIM/Camera/IMG_20200827_074750.jpg,image/jpeg,4000,2250,0,4173160,,1637501431,1598507271000,1598507271317,0,0,0,,,,,,,,,,, +18243,4137,content://media/external/images/media/4137,/storage/emulated/0/DCIM/Camera/IMG_20200827_074745.jpg,image/jpeg,4000,2250,0,4585412,,1637504473,1598507267000,1598507267261,0,0,0,,,,,,,,,,, +18244,4188,content://media/external/images/media/4188,/storage/emulated/0/DCIM/Camera/IMG_20200827_074715.jpg,image/jpeg,4000,2250,0,4617053,,1637504558,1598507238000,1598507238137,0,0,0,,,,,,,,,,, +18245,6372,content://media/external/images/media/6372,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200825-WA0017.jpg",image/jpeg,2048,1537,0,449031,,1637518221,1598377942000,0,0,0,0,,,,,,,,,,, +18246,6898,content://media/external/images/media/6898,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200825-WA0016.jpg",image/jpeg,1599,1200,0,300175,,1637518222,1598373854000,0,0,0,0,,,,,,,,,,, +18247,6683,content://media/external/images/media/6683,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200825-WA0002.jpeg",image/jpeg,2250,4000,0,953537,,1637518222,1598352682000,0,0,0,0,,,,,,,,,,, +18248,4204,content://media/external/images/media/4204,/storage/emulated/0/DCIM/Camera/IMG_20200823_161310.jpg,image/jpeg,4000,2250,90,3442818,,1637504640,1598191990000,1598191990094,0,0,0,,,,,,,,,,, +18249,3362,content://media/external/images/media/3362,/storage/emulated/0/DCIM/Camera/IMG_20200822_204839.jpg,image/jpeg,4000,2250,0,4411391,,1637502451,1598122122000,1598122122489,0,0,0,,,,,,,,,,, +18250,3452,content://media/external/images/media/3452,/storage/emulated/0/DCIM/Camera/IMG_20200822_204836.jpg,image/jpeg,4000,2250,0,4421260,,1637502804,1598122119000,1598122119468,0,0,0,,,,,,,,,,, +18251,2946,content://media/external/images/media/2946,/storage/emulated/0/DCIM/Camera/IMG_20200822_204820.jpg,image/jpeg,4160,2340,0,3698621,,1637501660,1598122100000,1598122100712,0,0,0,,,,,,,,,,, +18252,3438,content://media/external/images/media/3438,/storage/emulated/0/DCIM/Camera/IMG_20200822_201551.jpg,image/jpeg,4000,2250,0,5098531,,1637502783,1598120153000,1598120153341,0,0,0,,,,,,,,,,, +18253,2970,content://media/external/images/media/2970,/storage/emulated/0/DCIM/Camera/IMG_20200822_195511.jpg,image/jpeg,4000,2250,90,4919199,,1637501684,1598118913000,1598118913288,0,0,0,,,,,,,,,,, +18254,2806,content://media/external/images/media/2806,/storage/emulated/0/DCIM/Camera/IMG_20200822_195140.jpg,image/jpeg,4000,2250,90,4759137,,1637501312,1598118706000,1598118706650,0,0,0,,,,,,,,,,, +18255,3322,content://media/external/images/media/3322,/storage/emulated/0/DCIM/Camera/IMG_20200822_193354.jpg,image/jpeg,4000,2250,0,4828086,,1637502438,1598117635000,1598117635440,0,0,0,,,,,,,,,,, +18256,4506,content://media/external/images/media/4506,/storage/emulated/0/DCIM/Camera/IMG_20200822_193345.jpg,image/jpeg,4000,2250,0,5434960,,1637505160,1598117627000,1598117627093,0,0,0,,,,,,,,,,, +18257,4997,content://media/external/images/media/4997,/storage/emulated/0/DCIM/Camera/IMG_20200822_193344.jpg,image/jpeg,4000,2250,0,5751683,,1637506101,1598117627000,1598117627538,0,0,0,,,,,,,,,,, +18258,7025,content://media/external/images/media/7025,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200817-WA0010.jpg",image/jpeg,1202,1600,0,168129,,1637518222,1597691194000,0,0,0,0,,,,,,,,,,, +18259,6897,content://media/external/images/media/6897,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0009.jpg",image/jpeg,900,1600,0,193960,,1637518222,1597590074000,0,0,0,0,,,,,,,,,,, +18260,7024,content://media/external/images/media/7024,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0008.jpg",image/jpeg,900,1600,0,170983,,1637518222,1597590074000,0,0,0,0,,,,,,,,,,, +18261,6245,content://media/external/images/media/6245,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0004.jpg",image/jpeg,900,1600,0,251909,,1637518221,1597590073000,0,0,0,0,,,,,,,,,,, +18262,6585,content://media/external/images/media/6585,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0005.jpg",image/jpeg,900,1600,0,185904,,1637518221,1597590073000,0,0,0,0,,,,,,,,,,, +18263,6586,content://media/external/images/media/6586,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0006.jpg",image/jpeg,900,1600,0,171264,,1637518221,1597590073000,0,0,0,0,,,,,,,,,,, +18264,6787,content://media/external/images/media/6787,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0003.jpg",image/jpeg,900,1600,0,111601,,1637518222,1597590072000,0,0,0,0,,,,,,,,,,, +18265,7023,content://media/external/images/media/7023,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0002.jpg",image/jpeg,1600,900,0,253707,,1637518222,1597590072000,0,0,0,0,,,,,,,,,,, +18266,6785,content://media/external/images/media/6785,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0001.jpg",image/jpeg,900,1600,0,150340,,1637518222,1597590071000,0,0,0,0,,,,,,,,,,, +18267,3872,content://media/external/images/media/3872,/storage/emulated/0/DCIM/Camera/IMG_20200816_123401.jpg,image/jpeg,4160,2340,0,7444894,,1637503729,1597574041000,1597574041121,0,0,0,,,,,,,,,,, +18268,4525,content://media/external/images/media/4525,/storage/emulated/0/DCIM/Camera/IMG_20200816_121743.jpg,image/jpeg,4000,2250,90,4347226,,1637505165,1597573066000,1597573066921,0,0,0,,,,,,,,,,, +18269,4926,content://media/external/images/media/4926,/storage/emulated/0/DCIM/Camera/IMG_20200816_120927.jpg,image/jpeg,4000,2250,90,5057869,,1637506010,1597572569000,1597572569133,0,0,0,,,,,,,,,,, +18270,4437,content://media/external/images/media/4437,/storage/emulated/0/DCIM/Camera/IMG_20200816_120808.jpg,image/jpeg,4000,2250,90,5105977,,1637505068,1597572489000,1597572489307,0,0,0,,,,,,,,,,, +18271,3321,content://media/external/images/media/3321,/storage/emulated/0/DCIM/Camera/IMG_20200816_120805.jpg,image/jpeg,4000,2250,90,5547202,,1637502438,1597572486000,1597572486815,0,0,0,,,,,,,,,,, +18272,3146,content://media/external/images/media/3146,/storage/emulated/0/DCIM/Camera/IMG_20200816_120542.jpg,image/jpeg,3264,1836,90,2930682,,1637502130,1597572342000,1597572342172,0,0,0,,,,,,,,,,, +18273,3746,content://media/external/images/media/3746,/storage/emulated/0/DCIM/Camera/IMG_20200816_120518_1.jpg,image/jpeg,4000,2250,90,5740234,,1637503488,1597572318000,1597572318797,0,0,0,,,,,,,,,,, +18274,3891,content://media/external/images/media/3891,/storage/emulated/0/DCIM/Camera/IMG_20200816_120326.jpg,image/jpeg,4000,2250,90,2307352,,1637503732,1597572206000,1597572206122,0,0,0,,,,,,,,,,, +18275,3265,content://media/external/images/media/3265,/storage/emulated/0/DCIM/Camera/IMG_20200816_120053.jpg,image/jpeg,1280,720,0,217059,,1637502342,1597572053000,0,0,0,0,,,,,,,,,,, +18276,3437,content://media/external/images/media/3437,/storage/emulated/0/DCIM/Camera/IMG_20200816_115930.jpg,image/jpeg,720,1280,270,100990,,1637502783,1597571971000,0,0,0,0,,,,,,,,,,, +18277,3244,content://media/external/images/media/3244,/storage/emulated/0/DCIM/Camera/IMG_20200816_114104.jpg,image/jpeg,4000,2250,90,4316935,,1637502259,1597570867000,1597570867213,0,0,0,,,,,,,,,,, +18278,3890,content://media/external/images/media/3890,/storage/emulated/0/DCIM/Camera/IMG_20200816_114057.jpg,image/jpeg,4000,2250,90,4073357,,1637503732,1597570860000,1597570860386,0,0,0,,,,,,,,,,, +18279,3661,content://media/external/images/media/3661,/storage/emulated/0/DCIM/Camera/IMG_20200816_114040.jpg,image/jpeg,4000,2250,90,4829987,,1637503358,1597570842000,1597570842433,0,0,0,,,,,,,,,,, +18280,6367,content://media/external/images/media/6367,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0119.jpg",image/jpeg,900,1600,0,166207,,1637518221,1597521960000,0,0,0,0,,,,,,,,,,, +18281,6480,content://media/external/images/media/6480,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0118.jpg",image/jpeg,1600,900,0,169029,,1637518221,1597521959000,0,0,0,0,,,,,,,,,,, +18282,4116,content://media/external/images/media/4116,/storage/emulated/0/DCIM/Camera/IMG_20200815_205840.jpg,image/jpeg,4160,2340,90,2736470,,1637504451,1597517921000,1597517920838,0,0,0,,,,,,,,,,, +18283,3512,content://media/external/images/media/3512,/storage/emulated/0/DCIM/Camera/IMG_20200815_205837.jpg,image/jpeg,4160,2340,90,2936236,,1637502969,1597517917000,1597517917594,0,0,0,,,,,,,,,,, +18284,2987,content://media/external/images/media/2987,/storage/emulated/0/DCIM/Camera/IMG_20200815_205744.jpg,image/jpeg,4160,2340,90,3824966,,1637501771,1597517864000,1597517863992,0,0,0,,,,,,,,,,, +18285,3765,content://media/external/images/media/3765,/storage/emulated/0/DCIM/Camera/IMG_20200815_205741.jpg,image/jpeg,4160,2340,90,3819901,,1637503508,1597517861000,1597517861244,0,0,0,,,,,,,,,,, +18286,2660,content://media/external/images/media/2660,"/storage/emulated/0/DCIM/YouCam Perfect/2020-08-15-18-56-42-082.jpg",image/jpeg,1600,900,0,766732,,1637500871,1597510602000,0,0,0,0,,,,,,,,,,, +18287,2659,content://media/external/images/media/2659,"/storage/emulated/0/DCIM/YouCam Perfect/2020-08-15-18-55-59-343.jpg",image/jpeg,1600,900,0,721992,,1637500871,1597510559000,0,0,0,0,,,,,,,,,,, +18288,2658,content://media/external/images/media/2658,"/storage/emulated/0/DCIM/YouCam Perfect/2020-08-15-18-52-00-112.jpg",image/jpeg,1600,900,0,686277,,1637500871,1597510320000,0,0,0,0,,,,,,,,,,, +18289,2657,content://media/external/images/media/2657,"/storage/emulated/0/DCIM/YouCam Perfect/2020-08-15-18-49-44-982.jpg",image/jpeg,1600,1600,0,1070118,,1637500871,1597510185000,0,0,0,0,,,,,,,,,,, +18290,2656,content://media/external/images/media/2656,"/storage/emulated/0/DCIM/YouCam Perfect/2020-08-15-18-49-38-173.jpg",image/jpeg,1600,1600,0,1070118,,1637500871,1597510178000,0,0,0,0,,,,,,,,,,, +18291,6784,content://media/external/images/media/6784,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0115.jpg",image/jpeg,1600,900,0,220660,,1637518222,1597509662000,0,0,0,0,,,,,,,,,,, +18292,6682,content://media/external/images/media/6682,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0114.jpg",image/jpeg,900,1600,0,273294,,1637518222,1597504529000,0,0,0,0,,,,,,,,,,, +18293,4019,content://media/external/images/media/4019,/storage/emulated/0/DCIM/Camera/IMG_20200815_171349.jpg,image/jpeg,4000,2250,90,4521299,,1637504201,1597504430000,1597504429993,0,0,0,,,,,,,,,,, +18294,6366,content://media/external/images/media/6366,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0113.jpg",image/jpeg,1600,900,0,221651,,1637518221,1597504102000,0,0,0,0,,,,,,,,,,, +18295,6781,content://media/external/images/media/6781,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0112.jpg",image/jpeg,1600,900,0,222759,,1637518222,1597504099000,0,0,0,0,,,,,,,,,,, +18296,7022,content://media/external/images/media/7022,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0111.jpg",image/jpeg,900,1600,0,276773,,1637518222,1597504097000,0,0,0,0,,,,,,,,,,, +18297,6477,content://media/external/images/media/6477,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0110.jpg",image/jpeg,1600,900,0,269725,,1637518221,1597504096000,0,0,0,0,,,,,,,,,,, +18298,6894,content://media/external/images/media/6894,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0109.jpg",image/jpeg,1600,900,0,191509,,1637518222,1597504094000,0,0,0,0,,,,,,,,,,, +18299,6365,content://media/external/images/media/6365,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0108.jpg",image/jpeg,1600,900,0,190755,,1637518221,1597504091000,0,0,0,0,,,,,,,,,,, +18300,6778,content://media/external/images/media/6778,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0107.jpg",image/jpeg,1600,900,0,215980,,1637518222,1597504087000,0,0,0,0,,,,,,,,,,, +18301,6475,content://media/external/images/media/6475,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0106.jpg",image/jpeg,1600,900,0,307645,,1637518221,1597503944000,0,0,0,0,,,,,,,,,,, +18302,7019,content://media/external/images/media/7019,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0105.jpg",image/jpeg,1600,900,0,252803,,1637518222,1597503941000,0,0,0,0,,,,,,,,,,, +18303,3145,content://media/external/images/media/3145,/storage/emulated/0/DCIM/Camera/IMG_20200815_144701.jpg,image/jpeg,4000,2250,90,8517195,,1637502130,1597495624000,1597495624017,0,0,0,,,,,,,,,,, +18304,7020,content://media/external/images/media/7020,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0103.jpg",image/jpeg,1600,900,0,254554,,1637518222,1597493855000,0,0,0,0,,,,,,,,,,, +18305,6473,content://media/external/images/media/6473,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0102.jpg",image/jpeg,900,1600,0,390976,,1637518221,1597493120000,0,0,0,0,,,,,,,,,,, +18306,6892,content://media/external/images/media/6892,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0101.jpg",image/jpeg,1600,900,0,161299,,1637518222,1597492921000,0,0,0,0,,,,,,,,,,, +18307,7017,content://media/external/images/media/7017,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0100.jpg",image/jpeg,900,1600,0,153012,,1637518222,1597492920000,0,0,0,0,,,,,,,,,,, +18308,6582,content://media/external/images/media/6582,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0098.jpg",image/jpeg,900,1600,0,229056,,1637518221,1597492919000,0,0,0,0,,,,,,,,,,, +18309,6890,content://media/external/images/media/6890,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0099.jpg",image/jpeg,1600,900,0,103131,,1637518222,1597492919000,0,0,0,0,,,,,,,,,,, +18310,6680,content://media/external/images/media/6680,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0095.jpg",image/jpeg,1600,900,0,225433,,1637518222,1597492856000,0,0,0,0,,,,,,,,,,, +18311,6240,content://media/external/images/media/6240,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0094.jpg",image/jpeg,1600,900,0,222523,,1637518221,1597492855000,0,0,0,0,,,,,,,,,,, +18312,6471,content://media/external/images/media/6471,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0093.jpg",image/jpeg,1600,900,0,260542,,1637518221,1597492855000,0,0,0,0,,,,,,,,,,, +18313,6362,content://media/external/images/media/6362,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0092.jpg",image/jpeg,1600,900,0,260814,,1637518221,1597492853000,0,0,0,0,,,,,,,,,,, +18314,6678,content://media/external/images/media/6678,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0091.jpg",image/jpeg,1600,900,0,259726,,1637518222,1597492852000,0,0,0,0,,,,,,,,,,, +18315,6889,content://media/external/images/media/6889,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0055.jpg",image/jpeg,900,1600,0,208082,,1637518222,1597490990000,0,0,0,0,,,,,,,,,,, +18316,6360,content://media/external/images/media/6360,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0054.jpg",image/jpeg,1600,900,0,205745,,1637518221,1597490968000,0,0,0,0,,,,,,,,,,, +18317,6677,content://media/external/images/media/6677,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0053.jpg",image/jpeg,1600,900,0,225863,,1637518222,1597490966000,0,0,0,0,,,,,,,,,,, +18318,7015,content://media/external/images/media/7015,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0048.jpg",image/jpeg,1600,900,0,146921,,1637518222,1597490957000,0,0,0,0,,,,,,,,,,, +18319,6579,content://media/external/images/media/6579,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0047.jpg",image/jpeg,1600,900,0,107444,,1637518221,1597490954000,0,0,0,0,,,,,,,,,,, +18320,4562,content://media/external/images/media/4562,/storage/emulated/0/DCIM/Camera/IMG_20200815_122223.jpg,image/jpeg,4160,2340,0,6562250,,1637505216,1597486943000,1597486942957,0,0,0,,,,,,,,,,, +18321,4166,content://media/external/images/media/4166,/storage/emulated/0/DCIM/Camera/IMG_20200815_121306.jpg,image/jpeg,4000,2250,90,6785975,,1637504556,1597486387000,1597486387418,0,0,0,,,,,,,,,,, +18322,4777,content://media/external/images/media/4777,/storage/emulated/0/DCIM/Camera/IMG_20200815_121300.jpg,image/jpeg,4160,2340,0,6185588,,1637505656,1597486380000,1597486380608,0,0,0,,,,,,,,,,, +18323,3070,content://media/external/images/media/3070,/storage/emulated/0/DCIM/Camera/IMG_20200815_121255.jpg,image/jpeg,4160,2340,90,6067401,,1637501905,1597486375000,1597486375604,0,0,0,,,,,,,,,,, +18324,6237,content://media/external/images/media/6237,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0026.jpg",image/jpeg,1600,900,0,187364,,1637518221,1597485247000,0,0,0,0,,,,,,,,,,, +18325,7014,content://media/external/images/media/7014,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0025.jpg",image/jpeg,1600,900,0,177046,,1637518222,1597485243000,0,0,0,0,,,,,,,,,,, +18326,7012,content://media/external/images/media/7012,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0024.jpg",image/jpeg,1600,900,0,152430,,1637518222,1597485239000,0,0,0,0,,,,,,,,,,, +18327,6357,content://media/external/images/media/6357,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0023.jpg",image/jpeg,900,1600,0,154608,,1637518221,1597485238000,0,0,0,0,,,,,,,,,,, +18328,6578,content://media/external/images/media/6578,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0022.jpg",image/jpeg,1600,900,0,149777,,1637518221,1597485236000,0,0,0,0,,,,,,,,,,, +18329,6467,content://media/external/images/media/6467,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0021.jpg",image/jpeg,900,1600,0,142840,,1637518221,1597485235000,0,0,0,0,,,,,,,,,,, +18330,6468,content://media/external/images/media/6468,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0020.jpg",image/jpeg,900,1600,0,157108,,1637518221,1597485234000,0,0,0,0,,,,,,,,,,, +18331,6676,content://media/external/images/media/6676,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0019.jpg",image/jpeg,1600,900,0,169403,,1637518222,1597485228000,0,0,0,0,,,,,,,,,,, +18332,6577,content://media/external/images/media/6577,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0018.jpg",image/jpeg,1600,900,0,231498,,1637518221,1597485227000,0,0,0,0,,,,,,,,,,, +18333,6771,content://media/external/images/media/6771,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0017.jpg",image/jpeg,900,1600,0,203802,,1637518222,1597485180000,0,0,0,0,,,,,,,,,,, +18334,3580,content://media/external/images/media/3580,/storage/emulated/0/DCIM/Camera/IMG_20200815_114238.jpg,image/jpeg,4000,2250,90,5070895,,1637503154,1597484559000,1597484559586,0,0,0,,,,,,,,,,, +18335,4283,content://media/external/images/media/4283,/storage/emulated/0/DCIM/Camera/IMG_20200815_114230.jpg,image/jpeg,4000,2250,90,4414706,,1637504807,1597484552000,1597484552825,0,0,0,,,,,,,,,,, +18336,4819,content://media/external/images/media/4819,/storage/emulated/0/DCIM/Camera/IMG_20200815_110358.jpg,image/jpeg,4000,2250,0,6510377,,1637505730,1597482240000,1597482240257,0,0,0,,,,,,,,,,, +18337,4974,content://media/external/images/media/4974,/storage/emulated/0/DCIM/Camera/IMG_20200815_110135.jpg,image/jpeg,4000,2250,0,4777714,,1637506097,1597482097000,1597482096992,0,0,0,,,,,,,,,,, +18338,6353,content://media/external/images/media/6353,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200812-WA0014.jpg",image/jpeg,825,1024,0,98052,,1637518221,1597261704000,0,0,0,0,,,,,,,,,,, +18339,6355,content://media/external/images/media/6355,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200812-WA0013.jpg",image/jpeg,824,1024,0,86132,,1637518221,1597244603000,0,0,0,0,,,,,,,,,,, +18340,3641,content://media/external/images/media/3641,/storage/emulated/0/DCIM/Camera/IMG_20200809_003753.jpg,image/jpeg,4000,2250,0,3027580,,1637503301,1596926278000,1596926277983,0,0,0,,,,,,,,,,, +18341,3871,content://media/external/images/media/3871,/storage/emulated/0/DCIM/Camera/IMG_20200809_003743.jpg,image/jpeg,8000,6000,0,14278054,,1637503729,1596926267000,1596926266881,0,0,0,,,,,,,,,,, +18342,2805,content://media/external/images/media/2805,/storage/emulated/0/DCIM/Camera/IMG_20200808_175954.jpg,image/jpeg,4000,2250,90,3952817,,1637501312,1596902396000,1596902396848,0,0,0,,,,,,,,,,, +18343,2876,content://media/external/images/media/2876,/storage/emulated/0/DCIM/Camera/IMG_20200807_185621.jpg,image/jpeg,4000,2250,90,4591170,,1637501460,1596819383000,1596819383218,0,0,0,,,,,,,,,,, +18344,4057,content://media/external/images/media/4057,/storage/emulated/0/DCIM/Camera/IMG_20200807_185615.jpg,image/jpeg,4000,2250,90,4880256,,1637504342,1596819377000,1596819377017,0,0,0,,,,,,,,,,, +18345,3436,content://media/external/images/media/3436,/storage/emulated/0/DCIM/Camera/IMG_20200807_185603.jpg,image/jpeg,4000,2250,90,4734127,,1637502783,1596819365000,1596819365703,0,0,0,,,,,,,,,,, +18346,4037,content://media/external/images/media/4037,/storage/emulated/0/DCIM/Camera/IMG_20200807_185526.jpg,image/jpeg,4000,2250,90,4535065,,1637504234,1596819328000,1596819328624,0,0,0,,,,,,,,,,, +18347,2704,content://media/external/images/media/2704,/storage/emulated/0/DCIM/Screenshots/IMG_20200806_214057.jpg,image/jpeg,1073,1347,0,110505,,1637500987,1596742857000,0,0,0,0,,,,,,,,,,, +18348,2703,content://media/external/images/media/2703,/storage/emulated/0/DCIM/Screenshots/IMG_20200806_213539.jpg,image/jpeg,1064,1355,0,242773,,1637500987,1596742539000,0,0,0,0,,,,,,,,,,, +18349,4596,content://media/external/images/media/4596,/storage/emulated/0/DCIM/Camera/PANO_20200806_191039.jpg,image/jpeg,7312,3680,0,16420871,,1637505278,1596733848000,0,0,0,0,,,,,,,,,,, +18350,3683,content://media/external/images/media/3683,/storage/emulated/0/DCIM/Camera/IMG_20200806_191033.jpg,image/jpeg,4160,2340,0,5347870,,1637503389,1596733833000,1596733833082,0,0,0,,,,,,,,,,, +18351,6885,content://media/external/images/media/6885,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200802-WA0005.jpg",image/jpeg,900,1600,0,272345,,1637518222,1596371079000,0,0,0,0,,,,,,,,,,, +18352,7011,content://media/external/images/media/7011,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200802-WA0004.jpg",image/jpeg,900,1600,0,252049,,1637518222,1596371078000,0,0,0,0,,,,,,,,,,, +18353,4309,content://media/external/images/media/4309,/storage/emulated/0/DCIM/Camera/IMG_20200730_124821.jpg,image/jpeg,4000,2250,0,4036000,,1637504817,1596106103000,1596106103702,0,0,0,,,,,,,,,,, +18354,6354,content://media/external/images/media/6354,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200729-WA0004.jpg",image/jpeg,1200,1600,0,338021,,1637518221,1596049471000,0,0,0,0,,,,,,,,,,, +18355,6233,content://media/external/images/media/6233,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200728-WA0008.jpg",image/jpeg,768,1024,0,115646,,1637518221,1595949603000,0,0,0,0,,,,,,,,,,, +18356,6573,content://media/external/images/media/6573,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200726-WA0006.jpeg",image/jpeg,4000,2250,0,767868,,1637518221,1595790380000,0,0,0,0,,,,,,,,,,, +18357,4845,content://media/external/images/media/4845,/storage/emulated/0/DCIM/Camera/IMG_20200723_191837.jpg,image/jpeg,4000,2250,90,5421296,,1637505753,1595524721000,1595524721049,0,0,0,,,,,,,,,,, +18358,4322,content://media/external/images/media/4322,/storage/emulated/0/DCIM/Camera/IMG_20200723_191810.jpg,image/jpeg,4160,2340,90,6108639,,1637504895,1595524690000,1595524690559,0,0,0,,,,,,,,,,, +18359,3305,content://media/external/images/media/3305,/storage/emulated/0/DCIM/Camera/IMG_20200723_190834.jpg,image/jpeg,8000,4247,0,14111847,,1637502430,1595524116000,1595524093948,0,0,0,,,,,,,,,,, +18360,4396,content://media/external/images/media/4396,/storage/emulated/0/DCIM/Camera/IMG_20200723_190810.jpg,image/jpeg,8000,6000,0,25594094,,1637505004,1595524094000,1595524093948,0,0,0,,,,,,,,,,, +18361,3304,content://media/external/images/media/3304,/storage/emulated/0/DCIM/Camera/IMG_20200723_190804.jpg,image/jpeg,4160,2340,0,5488314,,1637502430,1595524084000,1595524084728,0,0,0,,,,,,,,,,, +18362,3786,content://media/external/images/media/3786,/storage/emulated/0/DCIM/Camera/IMG_20200723_190624.jpg,image/jpeg,5155,1788,0,3738793,,1637503558,1595523985000,0,0,0,0,,,,,,,,,,, +18363,4755,content://media/external/images/media/4755,/storage/emulated/0/DCIM/Camera/IMG_20200723_190550.jpg,image/jpeg,7728,3648,0,13931194,,1637505639,1595523952000,0,0,0,0,,,,,,,,,,, +18364,3633,content://media/external/images/media/3633,/storage/emulated/0/DCIM/Camera/PANO_20200723_190501.jpg,image/jpeg,7728,3648,0,16397410,,1637503272,1595523908000,0,0,0,0,,,,,,,,,,, +18365,3121,content://media/external/images/media/3121,/storage/emulated/0/DCIM/Camera/PANO_20200723_190242.jpg,image/jpeg,6768,3552,0,17873641,,1637502054,1595523767000,0,0,0,0,,,,,,,,,,, +18366,2882,content://media/external/images/media/2882,/storage/emulated/0/DCIM/Camera/PANO_20200723_185540.jpg,image/jpeg,8048,3712,0,25506060,,1637501461,1595523346000,0,0,0,0,,,,,,,,,,, +18367,4145,content://media/external/images/media/4145,/storage/emulated/0/DCIM/Camera/PANO_20200723_185532.jpg,image/jpeg,7088,3680,0,18466687,,1637504473,1595523336000,0,0,0,0,,,,,,,,,,, +18368,4127,content://media/external/images/media/4127,/storage/emulated/0/DCIM/Camera/PANO_20200723_185507.jpg,image/jpeg,8336,3712,0,22061739,,1637504451,1595523316000,0,0,0,0,,,,,,,,,,, +18369,4949,content://media/external/images/media/4949,/storage/emulated/0/DCIM/Camera/IMG_20200723_185457.jpg,image/jpeg,4000,2250,0,5279669,,1637506015,1595523299000,1595523299365,0,0,0,,,,,,,,,,, +18370,4676,content://media/external/images/media/4676,/storage/emulated/0/DCIM/Camera/IMG_20200723_185455.jpg,image/jpeg,4000,2250,0,4161163,,1637505480,1595523297000,1595523297277,0,0,0,,,,,,,,,,, +18371,6351,content://media/external/images/media/6351,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0026.jpg",image/jpeg,900,1600,0,241803,,1637518221,1595357442000,0,0,0,0,,,,,,,,,,, +18372,6574,content://media/external/images/media/6574,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0025.jpg",image/jpeg,1600,900,0,206246,,1637518221,1595357439000,0,0,0,0,,,,,,,,,,, +18373,6675,content://media/external/images/media/6675,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0024.jpg",image/jpeg,1600,900,0,280995,,1637518222,1595357437000,0,0,0,0,,,,,,,,,,, +18374,6882,content://media/external/images/media/6882,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0023.jpg",image/jpeg,900,1600,0,143108,,1637518222,1595357433000,0,0,0,0,,,,,,,,,,, +18375,6880,content://media/external/images/media/6880,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0022.jpg",image/jpeg,1600,900,0,237797,,1637518222,1595357432000,0,0,0,0,,,,,,,,,,, +18376,6349,content://media/external/images/media/6349,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0021.jpg",image/jpeg,1600,900,0,269497,,1637518221,1595357429000,0,0,0,0,,,,,,,,,,, +18377,6672,content://media/external/images/media/6672,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0020.jpg",image/jpeg,900,1600,0,188236,,1637518222,1595357426000,0,0,0,0,,,,,,,,,,, +18378,6563,content://media/external/images/media/6563,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0023.jpg",image/jpeg,1600,900,0,219764,,1637518221,1595357423000,0,0,0,0,,,,,,,,,,, +18379,7009,content://media/external/images/media/7009,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0019.jpg",image/jpeg,1600,900,0,249344,,1637518222,1595357423000,0,0,0,0,,,,,,,,,,, +18380,6671,content://media/external/images/media/6671,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0018.jpg",image/jpeg,1600,900,0,228644,,1637518222,1595357419000,0,0,0,0,,,,,,,,,,, +18381,6670,content://media/external/images/media/6670,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0017.jpg",image/jpeg,1600,900,0,303703,,1637518222,1595357412000,0,0,0,0,,,,,,,,,,, +18382,6230,content://media/external/images/media/6230,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0016.jpg",image/jpeg,900,1600,0,288066,,1637518221,1595357407000,0,0,0,0,,,,,,,,,,, +18383,6881,content://media/external/images/media/6881,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0015.jpg",image/jpeg,1600,900,0,183738,,1637518222,1595357403000,0,0,0,0,,,,,,,,,,, +18384,6773,content://media/external/images/media/6773,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0014.jpg",image/jpeg,1600,900,0,244449,,1637518222,1595357400000,0,0,0,0,,,,,,,,,,, +18385,7007,content://media/external/images/media/7007,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0013.jpg",image/jpeg,1600,900,0,269144,,1637518222,1595357397000,0,0,0,0,,,,,,,,,,, +18386,6668,content://media/external/images/media/6668,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0012.jpg",image/jpeg,1600,900,0,317356,,1637518222,1595357393000,0,0,0,0,,,,,,,,,,, +18387,6878,content://media/external/images/media/6878,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0011.jpg",image/jpeg,1600,900,0,218948,,1637518222,1595357384000,0,0,0,0,,,,,,,,,,, +18388,6466,content://media/external/images/media/6466,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0010.jpg",image/jpeg,1600,900,0,282992,,1637518221,1595357380000,0,0,0,0,,,,,,,,,,, +18389,6340,content://media/external/images/media/6340,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0025.jpg",image/jpeg,1600,900,0,226940,,1637518221,1595357376000,0,0,0,0,,,,,,,,,,, +18390,6875,content://media/external/images/media/6875,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0009.jpg",image/jpeg,1600,900,0,265544,,1637518222,1595357376000,0,0,0,0,,,,,,,,,,, +18391,6346,content://media/external/images/media/6346,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0008.jpg",image/jpeg,1600,900,0,193626,,1637518221,1595357369000,0,0,0,0,,,,,,,,,,, +18392,7005,content://media/external/images/media/7005,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0007.jpg",image/jpeg,1600,900,0,268910,,1637518222,1595357366000,0,0,0,0,,,,,,,,,,, +18393,6667,content://media/external/images/media/6667,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0006.jpg",image/jpeg,1600,900,0,273494,,1637518222,1595357361000,0,0,0,0,,,,,,,,,,, +18394,6876,content://media/external/images/media/6876,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0005.jpg",image/jpeg,1600,900,0,291295,,1637518222,1595357355000,0,0,0,0,,,,,,,,,,, +18395,6458,content://media/external/images/media/6458,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0026.jpg",image/jpeg,900,1600,0,210842,,1637518221,1595357351000,0,0,0,0,,,,,,,,,,, +18396,6570,content://media/external/images/media/6570,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0004.jpg",image/jpeg,1600,900,0,297584,,1637518221,1595357351000,0,0,0,0,,,,,,,,,,, +18397,6464,content://media/external/images/media/6464,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0003.jpg",image/jpeg,1600,900,0,147048,,1637518221,1595357345000,0,0,0,0,,,,,,,,,,, +18398,6564,content://media/external/images/media/6564,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0024.jpg",image/jpeg,1600,900,0,199664,,1637518221,1595357345000,0,0,0,0,,,,,,,,,,, +18399,6666,content://media/external/images/media/6666,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0002.jpg",image/jpeg,1600,900,0,253853,,1637518222,1595357342000,0,0,0,0,,,,,,,,,,, +18400,6462,content://media/external/images/media/6462,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200720-WA0019.jpg",image/jpeg,1600,900,0,186639,,1637518221,1595269272000,0,0,0,0,,,,,,,,,,, +18401,6463,content://media/external/images/media/6463,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200720-WA0018.jpg",image/jpeg,900,1600,0,276124,,1637518221,1595269068000,0,0,0,0,,,,,,,,,,, +18402,6663,content://media/external/images/media/6663,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0029.jpg",image/jpeg,900,1600,0,335813,,1637518222,1595269068000,0,0,0,0,,,,,,,,,,, +18403,6873,content://media/external/images/media/6873,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0030.jpg",image/jpeg,1600,900,0,216856,,1637518222,1595269068000,0,0,0,0,,,,,,,,,,, +18404,6344,content://media/external/images/media/6344,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0031.jpg",image/jpeg,1600,726,0,192765,,1637518221,1595269067000,0,0,0,0,,,,,,,,,,, +18405,6768,content://media/external/images/media/6768,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200720-WA0017.jpg",image/jpeg,1200,1600,0,157509,,1637518222,1595269067000,0,0,0,0,,,,,,,,,,, +18406,6460,content://media/external/images/media/6460,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200720-WA0015.jpg",image/jpeg,1600,628,0,144878,,1637518221,1595269029000,0,0,0,0,,,,,,,,,,, +18407,6459,content://media/external/images/media/6459,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200719-WA0006.jpeg",image/jpeg,2250,4000,0,1908697,,1637518221,1595173582000,0,0,0,0,,,,,,,,,,, +18408,6686,content://media/external/images/media/6686,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG_20200719_173850.jpg",image/jpeg,1600,900,0,471664,,1637518222,1595173130000,0,0,0,0,,,,,,,,,,, +18409,6664,content://media/external/images/media/6664,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200719-WA0004.jpg",image/jpeg,1600,900,0,193413,,1637518222,1595173026000,0,0,0,0,,,,,,,,,,, +18410,4684,content://media/external/images/media/4684,/storage/emulated/0/DCIM/Camera/PANO_20200719_125342.jpg,image/jpeg,7216,3680,0,19180243,,1637505480,1595156028000,0,0,0,0,,,,,,,,,,, +18411,3408,content://media/external/images/media/3408,/storage/emulated/0/DCIM/Camera/PANO_20200719_125315.jpg,image/jpeg,7152,3648,0,22522617,,1637502598,1595156003000,0,0,0,0,,,,,,,,,,, +18412,4089,content://media/external/images/media/4089,/storage/emulated/0/DCIM/Camera/PANO_20200719_125255.jpg,image/jpeg,7504,3776,0,22070801,,1637504394,1595155980000,0,0,0,0,,,,,,,,,,, +18413,4606,content://media/external/images/media/4606,/storage/emulated/0/DCIM/Camera/IMG_20200719_113527.jpg,image/jpeg,4160,2340,0,4889176,,1637505308,1595151327000,1595151327454,0,0,0,,,,,,,,,,, +18414,3511,content://media/external/images/media/3511,/storage/emulated/0/DCIM/Camera/IMG_20200719_113514.jpg,image/jpeg,4000,2250,0,3602103,,1637502969,1595151316000,1595151316732,0,0,0,,,,,,,,,,, +18415,3603,content://media/external/images/media/3603,/storage/emulated/0/DCIM/Camera/IMG_20200719_105721.jpg,image/jpeg,4000,2250,90,7165394,,1637503238,1595149047000,1595149046967,0,0,0,,,,,,,,,,, +18416,3844,content://media/external/images/media/3844,/storage/emulated/0/DCIM/Camera/IMG_20200719_105717.jpg,image/jpeg,4000,2250,90,7031235,,1637503642,1595149040000,1595149040909,0,0,0,,,,,,,,,,, +18417,4697,content://media/external/images/media/4697,/storage/emulated/0/DCIM/Camera/IMG_20200719_105713.jpg,image/jpeg,4000,2250,90,6877205,,1637505509,1595149037000,1595149037690,0,0,0,,,,,,,,,,, +18418,3703,content://media/external/images/media/3703,/storage/emulated/0/DCIM/Camera/IMG_20200719_105657.jpg,image/jpeg,4000,2250,90,7813163,,1637503392,1595149018000,1595149018462,0,0,0,,,,,,,,,,, +18419,4282,content://media/external/images/media/4282,/storage/emulated/0/DCIM/Camera/IMG_20200719_105653.jpg,image/jpeg,4000,2250,90,7861018,,1637504807,1595149015000,1595149015466,0,0,0,,,,,,,,,,, +18420,4056,content://media/external/images/media/4056,/storage/emulated/0/DCIM/Camera/IMG_20200719_093940.jpg,image/jpeg,4160,2340,90,6211828,,1637504342,1595144380000,1595144380594,0,0,0,,,,,,,,,,, +18421,4097,content://media/external/images/media/4097,/storage/emulated/0/DCIM/Camera/IMG_20200719_093928.jpg,image/jpeg,4000,2250,0,8486802,,1637504400,1595144370000,1595144370325,0,0,0,,,,,,,,,,, +18422,6568,content://media/external/images/media/6568,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200719-WA0001.jpg",image/jpeg,1024,768,0,161887,,1637518221,1595143188000,0,0,0,0,,,,,,,,,,, +18423,3764,content://media/external/images/media/3764,/storage/emulated/0/DCIM/Camera/IMG_20200719_091913.jpg,image/jpeg,4160,2340,0,7374319,,1637503508,1595143153000,1595143153222,0,0,0,,,,,,,,,,, +18424,3243,content://media/external/images/media/3243,/storage/emulated/0/DCIM/Camera/IMG_20200719_091907.jpg,image/jpeg,4160,2340,90,7201134,,1637502259,1595143147000,1595143147049,0,0,0,,,,,,,,,,, +18425,3360,content://media/external/images/media/3360,/storage/emulated/0/DCIM/Camera/IMG_20200719_090459.jpg,image/jpeg,4160,2340,0,6500469,,1637502451,1595142299000,1595142298893,0,0,0,,,,,,,,,,, +18426,6343,content://media/external/images/media/6343,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0028.jpg",image/jpeg,900,1600,0,278462,,1637518221,1595095918000,0,0,0,0,,,,,,,,,,, +18427,3544,content://media/external/images/media/3544,/storage/emulated/0/DCIM/Camera/PANO_20200718_172742.jpg,image/jpeg,8112,3680,0,24352348,,1637503010,1595086070000,0,0,0,0,,,,,,,,,,, +18428,2893,content://media/external/images/media/2893,/storage/emulated/0/DCIM/Camera/PANO_20200718_172723.jpg,image/jpeg,9168,3680,0,31479931,,1637501516,1595086051000,0,0,0,0,,,,,,,,,,, +18429,4662,content://media/external/images/media/4662,/storage/emulated/0/DCIM/Camera/IMG_20200718_172603.jpg,image/jpeg,4160,2340,0,5836870,,1637505417,1595085963000,1595085963648,0,0,0,,,,,,,,,,, +18430,3320,content://media/external/images/media/3320,/storage/emulated/0/DCIM/Camera/IMG_20200718_172553.jpg,image/jpeg,4000,2250,0,6340792,,1637502438,1595085954000,1595085954664,0,0,0,,,,,,,,,,, +18431,3999,content://media/external/images/media/3999,/storage/emulated/0/DCIM/Camera/IMG_20200718_152057.jpg,image/jpeg,4000,2250,90,5090063,,1637504086,1595078458000,1595078458812,0,0,0,,,,,,,,,,, +18432,3727,content://media/external/images/media/3727,/storage/emulated/0/DCIM/Camera/IMG_20200718_152051.jpg,image/jpeg,4000,2250,90,4653103,,1637503477,1595078453000,1595078453390,0,0,0,,,,,,,,,,, +18433,2945,content://media/external/images/media/2945,/storage/emulated/0/DCIM/Camera/IMG_20200718_144548.jpg,image/jpeg,4000,2250,90,6171458,,1637501660,1595076349000,1595076349284,0,0,0,,,,,,,,,,, +18434,4912,content://media/external/images/media/4912,/storage/emulated/0/DCIM/Camera/IMG_20200718_144534.jpg,image/jpeg,4000,2250,0,6466946,,1637505944,1595076335000,1595076335896,0,0,0,,,,,,,,,,, +18435,4203,content://media/external/images/media/4203,/storage/emulated/0/DCIM/Camera/IMG_20200718_144528.jpg,image/jpeg,4000,2250,90,6377590,,1637504640,1595076331000,1595076331629,0,0,0,,,,,,,,,,, +18436,3185,content://media/external/images/media/3185,/storage/emulated/0/DCIM/Camera/IMG_20200718_144447.jpg,image/jpeg,4000,2250,0,5100130,,1637502161,1595076290000,1595076289910,0,0,0,,,,,,,,,,, +18437,3660,content://media/external/images/media/3660,/storage/emulated/0/DCIM/Camera/IMG_20200718_144440.jpg,image/jpeg,4000,2250,0,6024033,,1637503358,1595076281000,1595076281742,0,0,0,,,,,,,,,,, +18438,3726,content://media/external/images/media/3726,/storage/emulated/0/DCIM/Camera/IMG_20200718_144149.jpg,image/jpeg,4000,2250,90,4539815,,1637503477,1595076112000,1595076112894,0,0,0,,,,,,,,,,, +18439,3941,content://media/external/images/media/3941,/storage/emulated/0/DCIM/Camera/IMG_20200718_144144.jpg,image/jpeg,4000,2250,90,4645962,,1637503853,1595076107000,1595076107510,0,0,0,,,,,,,,,,, +18440,3492,content://media/external/images/media/3492,/storage/emulated/0/DCIM/Camera/IMG_20200718_144138.jpg,image/jpeg,4000,2250,90,6160486,,1637502870,1595076100000,1595076100415,0,0,0,,,,,,,,,,, +18441,4505,content://media/external/images/media/4505,/storage/emulated/0/DCIM/Camera/IMG_20200718_135055.jpg,image/jpeg,4000,2250,90,6271423,,1637505160,1595073058000,1595073057957,0,0,0,,,,,,,,,,, +18442,2969,content://media/external/images/media/2969,/storage/emulated/0/DCIM/Camera/IMG_20200718_134841.jpg,image/jpeg,4000,2250,90,6116905,,1637501684,1595072926000,1595072926047,0,0,0,,,,,,,,,,, +18443,3170,content://media/external/images/media/3170,/storage/emulated/0/DCIM/Camera/IMG_20200718_134830.jpg,image/jpeg,4000,2250,90,5780926,,1637502143,1595072914000,1595072914524,0,0,0,,,,,,,,,,, +18444,4911,content://media/external/images/media/4911,/storage/emulated/0/DCIM/Camera/IMG_20200718_124630.jpg,image/jpeg,4000,2250,0,5728083,,1637505944,1595069192000,1595069192113,0,0,0,,,,,,,,,,, +18445,3242,content://media/external/images/media/3242,/storage/emulated/0/DCIM/Camera/IMG_20200718_124625.jpg,image/jpeg,4000,2250,0,5336889,,1637502259,1595069187000,1595069187340,0,0,0,,,,,,,,,,, +18446,3659,content://media/external/images/media/3659,/storage/emulated/0/DCIM/Camera/IMG_20200718_122839.jpg,image/jpeg,4000,2250,90,5234800,,1637503358,1595068120000,1595068120422,0,0,0,,,,,,,,,,, +18447,4948,content://media/external/images/media/4948,/storage/emulated/0/DCIM/Camera/IMG_20200718_122048.jpg,image/jpeg,4000,2250,90,6106762,,1637506015,1595067649000,1595067649523,0,0,0,,,,,,,,,,, +18448,3090,content://media/external/images/media/3090,/storage/emulated/0/DCIM/Camera/IMG_20200718_122001.jpg,image/jpeg,4000,2250,0,6302641,,1637501971,1595067603000,1595067603249,0,0,0,,,,,,,,,,, +18449,3491,content://media/external/images/media/3491,/storage/emulated/0/DCIM/Camera/IMG_20200718_121928.jpg,image/jpeg,4000,2250,90,4314079,,1637502870,1595067572000,1595067571984,0,0,0,,,,,,,,,,, +18450,4413,content://media/external/images/media/4413,/storage/emulated/0/DCIM/Camera/IMG_20200718_120423.jpg,image/jpeg,720,1280,270,385657,,1637505063,1595066663000,0,0,0,0,,,,,,,,,,, +18451,3376,content://media/external/images/media/3376,/storage/emulated/0/DCIM/Camera/IMG_20200718_120346.jpg,image/jpeg,720,1280,270,396153,,1637502523,1595066627000,0,0,0,0,,,,,,,,,,, +18452,3808,content://media/external/images/media/3808,/storage/emulated/0/DCIM/Camera/IMG_20200718_120219.jpg,image/jpeg,4000,2250,0,8669778,,1637503601,1595066541000,1595066541240,0,0,0,,,,,,,,,,, +18453,3069,content://media/external/images/media/3069,/storage/emulated/0/DCIM/Camera/IMG_20200718_113419.jpg,image/jpeg,4160,2340,0,6138872,,1637501905,1595064859000,1595064859017,0,0,0,,,,,,,,,,, +18454,3341,content://media/external/images/media/3341,/storage/emulated/0/DCIM/Camera/IMG_20200718_103706.jpg,image/jpeg,4000,2250,90,7720000,,1637502439,1595061428000,1595061428071,0,0,0,,,,,,,,,,, +18455,4645,content://media/external/images/media/4645,/storage/emulated/0/DCIM/Camera/IMG_20200718_103650.jpg,image/jpeg,4000,2250,90,6770543,,1637505414,1595061411000,1595061411817,0,0,0,,,,,,,,,,, +18456,3144,content://media/external/images/media/3144,/storage/emulated/0/DCIM/Camera/IMG_20200718_103646.jpg,image/jpeg,4000,2250,90,6601496,,1637502130,1595061407000,1595061407869,0,0,0,,,,,,,,,,, +18457,4524,content://media/external/images/media/4524,/storage/emulated/0/DCIM/Camera/IMG_20200718_102917.jpg,image/jpeg,4160,2340,90,6567558,,1637505165,1595060957000,1595060957382,0,0,0,,,,,,,,,,, +18458,3725,content://media/external/images/media/3725,/storage/emulated/0/DCIM/Camera/IMG_20200718_102900.jpg,image/jpeg,4000,2250,90,7582595,,1637503477,1595060941000,1595060941746,0,0,0,,,,,,,,,,, +18459,3109,content://media/external/images/media/3109,/storage/emulated/0/DCIM/Camera/IMG_20200718_102855.jpg,image/jpeg,4160,2340,90,6672486,,1637502054,1595060935000,1595060935058,0,0,0,,,,,,,,,,, +18460,3228,content://media/external/images/media/3228,/storage/emulated/0/DCIM/Camera/IMG_20200718_101945.jpg,image/jpeg,4160,2340,0,6685486,,1637502258,1595060385000,1595060385221,0,0,0,,,,,,,,,,, +18461,2875,content://media/external/images/media/2875,/storage/emulated/0/DCIM/Camera/IMG_20200718_101627.jpg,image/jpeg,4000,2250,90,7038597,,1637501460,1595060188000,1595060188623,0,0,0,,,,,,,,,,, +18462,4485,content://media/external/images/media/4485,/storage/emulated/0/DCIM/Camera/IMG_20200718_101617.jpg,image/jpeg,4160,2340,90,6776605,,1637505122,1595060177000,1595060177708,0,0,0,,,,,,,,,,, +18463,3108,content://media/external/images/media/3108,/storage/emulated/0/DCIM/Camera/IMG_20200718_082107.jpg,image/jpeg,4160,2340,0,5936745,,1637502054,1595053267000,1595053267231,0,0,0,,,,,,,,,,, +18464,4661,content://media/external/images/media/4661,/storage/emulated/0/DCIM/Camera/IMG_20200718_082052.jpg,image/jpeg,4000,2250,0,7003884,,1637505417,1595053254000,1595053253970,0,0,0,,,,,,,,,,, +18465,6341,content://media/external/images/media/6341,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0002.jpg",image/jpeg,1600,1200,0,198446,,1637518221,1595053198000,0,0,0,0,,,,,,,,,,, +18466,3658,content://media/external/images/media/3658,/storage/emulated/0/DCIM/Camera/IMG_20200718_081803.jpg,image/jpeg,4000,2250,90,6582432,,1637503358,1595053087000,1595053086948,0,0,0,,,,,,,,,,, +18467,3204,content://media/external/images/media/3204,/storage/emulated/0/DCIM/Camera/IMG_20200718_075557.jpg,image/jpeg,4000,2250,90,4815542,,1637502256,1595051760000,1595051760032,0,0,0,,,,,,,,,,, +18468,6766,content://media/external/images/media/6766,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200717-WA0002.jpeg",image/jpeg,4000,2250,0,863625,,1637518222,1594984695000,0,0,0,0,,,,,,,,,,, +18469,3340,content://media/external/images/media/3340,/storage/emulated/0/DCIM/Camera/IMG_20200715_203937.jpg,image/jpeg,4000,2250,0,4267835,,1637502439,1594838379000,1594838379447,0,0,0,,,,,,,,,,, +18470,4925,content://media/external/images/media/4925,/storage/emulated/0/DCIM/Camera/IMG_20200715_203757.jpg,image/jpeg,4000,2250,90,4424446,,1637506010,1594838279000,1594838279282,0,0,0,,,,,,,,,,, +18471,3724,content://media/external/images/media/3724,/storage/emulated/0/DCIM/Camera/IMG_20200715_203724.jpg,image/jpeg,4000,2250,90,4243430,,1637503477,1594838246000,1594838246446,0,0,0,,,,,,,,,,, +18472,4395,content://media/external/images/media/4395,/storage/emulated/0/DCIM/Camera/IMG_20200715_203710.jpg,image/jpeg,4000,2250,90,4189644,,1637505004,1594838231000,1594838231398,0,0,0,,,,,,,,,,, +18473,2986,content://media/external/images/media/2986,/storage/emulated/0/DCIM/Camera/IMG_20200715_203701.jpg,image/jpeg,4000,2250,90,4181010,,1637501771,1594838222000,1594838222857,0,0,0,,,,,,,,,,, +18474,6764,content://media/external/images/media/6764,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200712-WA0004.jpg",image/jpeg,1200,1600,0,250133,,1637518222,1594577670000,0,0,0,0,,,,,,,,,,, +18475,6763,content://media/external/images/media/6763,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200712-WA0003.jpg",image/jpeg,900,1600,0,196918,,1637518222,1594559424000,0,0,0,0,,,,,,,,,,, +18476,3998,content://media/external/images/media/3998,/storage/emulated/0/DCIM/Camera/IMG_20200711_194910.jpg,image/jpeg,4000,2250,0,5500869,,1637504086,1594489752000,1594489752600,0,0,0,,,,,,,,,,, +18477,3435,content://media/external/images/media/3435,/storage/emulated/0/DCIM/Camera/IMG_20200711_194845.jpg,image/jpeg,4000,2250,0,4187712,,1637502783,1594489727000,1594489727263,0,0,0,,,,,,,,,,, +18478,2902,content://media/external/images/media/2902,/storage/emulated/0/DCIM/Camera/IMG_20200711_192744.jpg,image/jpeg,4000,2250,0,4966094,,1637501534,1594488465000,1594488465733,0,0,0,,,,,,,,,,, +18479,4096,content://media/external/images/media/4096,/storage/emulated/0/DCIM/Camera/IMG_20200711_192719.jpg,image/jpeg,4000,2250,0,4985403,,1637504400,1594488441000,1594488440986,0,0,0,,,,,,,,,,, +18480,4644,content://media/external/images/media/4644,/storage/emulated/0/DCIM/Camera/IMG_20200711_190831.jpg,image/jpeg,4000,2250,90,4452063,,1637505414,1594487312000,1594487312708,0,0,0,,,,,,,,,,, +18481,3339,content://media/external/images/media/3339,/storage/emulated/0/DCIM/Camera/IMG_20200711_190829.jpg,image/jpeg,4000,2250,90,4219149,,1637502439,1594487310000,1594487310839,0,0,0,,,,,,,,,,, +18482,4630,content://media/external/images/media/4630,/storage/emulated/0/DCIM/Camera/IMG_20200711_190827.jpg,image/jpeg,4000,2250,90,4300619,,1637505390,1594487308000,1594487308116,0,0,0,,,,,,,,,,, +18483,4643,content://media/external/images/media/4643,/storage/emulated/0/DCIM/Camera/IMG_20200711_190826.jpg,image/jpeg,4000,2250,90,3992059,,1637505414,1594487308000,1594487308476,0,0,0,,,,,,,,,,, +18484,3889,content://media/external/images/media/3889,/storage/emulated/0/DCIM/Camera/IMG_20200711_190815.jpg,image/jpeg,4000,2250,90,4272139,,1637503732,1594487297000,1594487297037,0,0,0,,,,,,,,,,, +18485,4818,content://media/external/images/media/4818,/storage/emulated/0/DCIM/Camera/IMG_20200711_190812.jpg,image/jpeg,4000,2250,90,4222400,,1637505730,1594487294000,1594487294847,0,0,0,,,,,,,,,,, +18486,4454,content://media/external/images/media/4454,/storage/emulated/0/DCIM/Camera/IMG_20200711_190804.jpg,image/jpeg,4000,2250,90,5196967,,1637505068,1594487286000,1594487286478,0,0,0,,,,,,,,,,, +18487,4436,content://media/external/images/media/4436,/storage/emulated/0/DCIM/Camera/IMG_20200711_190659.jpg,image/jpeg,4000,2250,90,4335230,,1637505068,1594487222000,1594487221928,0,0,0,,,,,,,,,,, +18488,4435,content://media/external/images/media/4435,/storage/emulated/0/DCIM/Camera/IMG_20200711_175617.jpg,image/jpeg,4000,2250,0,4083811,,1637505068,1594482980000,1594482980107,0,0,0,,,,,,,,,,, +18489,2968,content://media/external/images/media/2968,/storage/emulated/0/DCIM/Camera/IMG_20200711_175613.jpg,image/jpeg,4000,2250,0,3945439,,1637501684,1594482977000,1594482976947,0,0,0,,,,,,,,,,, +18490,4375,content://media/external/images/media/4375,/storage/emulated/0/DCIM/Camera/IMG_20200711_161347.jpg,image/jpeg,4000,2250,0,4126937,,1637504982,1594476829000,1594476829132,0,0,0,,,,,,,,,,, +18491,6455,content://media/external/images/media/6455,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200711-WA0005.jpg",image/jpeg,1200,1600,0,155213,,1637518221,1594476783000,0,0,0,0,,,,,,,,,,, +18492,3143,content://media/external/images/media/3143,/storage/emulated/0/DCIM/Camera/IMG_20200710_205110.jpg,image/jpeg,4000,2250,0,4133328,,1637502130,1594407071000,1594407071825,0,0,0,,,,,,,,,,, +18493,3107,content://media/external/images/media/3107,/storage/emulated/0/DCIM/Camera/IMG_20200710_203631.jpg,image/jpeg,4000,2250,0,4287045,,1637502054,1594406194000,1594406193924,0,0,0,,,,,,,,,,, +18494,3490,content://media/external/images/media/3490,/storage/emulated/0/DCIM/Camera/IMG_20200710_201853.jpg,image/jpeg,4000,2250,0,4395842,,1637502870,1594405136000,1594405136561,0,0,0,,,,,,,,,,, +18495,3106,content://media/external/images/media/3106,/storage/emulated/0/DCIM/Camera/IMG_20200707_173419.jpg,image/jpeg,4000,2250,0,4472943,,1637502054,1594136062000,1594136062328,0,0,0,,,,,,,,,,, +18496,2736,content://media/external/images/media/2736,/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-07-07-09-14-54-518_com.stt.android.suunto.jpg,image/jpeg,1080,2340,0,430987,,1637500987,1594106094000,0,0,0,0,,,,,,,,,,, +18497,4910,content://media/external/images/media/4910,/storage/emulated/0/DCIM/Camera/IMG_20200705_170712.jpg,image/jpeg,4000,2250,90,4227445,,1637505944,1593961633000,1593961633598,0,0,0,,,,,,,,,,, +18498,3640,content://media/external/images/media/3640,/storage/emulated/0/DCIM/Camera/IMG_20200705_170657.jpg,image/jpeg,4000,2250,90,4759691,,1637503301,1593961618000,1593961618296,0,0,0,,,,,,,,,,, +18499,4453,content://media/external/images/media/4453,/storage/emulated/0/DCIM/Camera/IMG_20200705_170650.jpg,image/jpeg,4000,2250,90,4512726,,1637505068,1593961612000,1593961612432,0,0,0,,,,,,,,,,, +18500,7000,content://media/external/images/media/7000,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200704-WA0016.jpg",image/jpeg,900,1600,0,162629,,1637518222,1593895387000,0,0,0,0,,,,,,,,,,, +18501,6228,content://media/external/images/media/6228,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200704-WA0015.jpg",image/jpeg,1200,1600,0,259994,,1637518221,1593894027000,0,0,0,0,,,,,,,,,,, +18502,6997,content://media/external/images/media/6997,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200704-WA0014.jpg",image/jpeg,1200,1600,0,257096,,1637518222,1593893947000,0,0,0,0,,,,,,,,,,, +18503,6454,content://media/external/images/media/6454,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200704-WA0013.jpg",image/jpeg,1200,1600,0,230923,,1637518221,1593893946000,0,0,0,0,,,,,,,,,,, +18504,6761,content://media/external/images/media/6761,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200704-WA0012.jpg",image/jpeg,1200,1600,0,245502,,1637518222,1593893945000,0,0,0,0,,,,,,,,,,, +18505,4715,content://media/external/images/media/4715,/storage/emulated/0/DCIM/Camera/IMG_20200704_131555.jpg,image/jpeg,4000,2250,0,4077117,,1637505565,1593861356000,1593861356899,0,0,0,,,,,,,,,,, +18506,3657,content://media/external/images/media/3657,/storage/emulated/0/DCIM/Camera/IMG_20200704_131542.jpg,image/jpeg,4000,2250,90,4127858,,1637503358,1593861344000,1593861344195,0,0,0,,,,,,,,,,, +18507,2804,content://media/external/images/media/2804,/storage/emulated/0/DCIM/Camera/IMG_20200704_131244.jpg,image/jpeg,5184,3880,0,6245770,,1637501312,1593861167000,1593861167386,0,0,0,,,,,,,,,,, +18508,4095,content://media/external/images/media/4095,/storage/emulated/0/DCIM/Camera/IMG_20200704_131246.jpg,image/jpeg,5184,3880,0,6296735,,1637504400,1593861167000,1593861167785,0,0,0,,,,,,,,,,, +18509,6658,content://media/external/images/media/6658,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200703-WA0007.jpg",image/jpeg,1600,1200,0,290556,,1637518221,1593785659000,0,0,0,0,,,,,,,,,,, +18510,1009,content://media/external/images/media/1009,/storage/emulated/0/PlantNet/1593380918025.JPEG,image/jpeg,506,900,0,108447,,1637500139,1593380918000,1593349607127,0,0,0,,,,,,,,,,, +18511,1008,content://media/external/images/media/1008,/storage/emulated/0/PlantNet/1593380863049.JPEG,image/jpeg,506,900,0,108447,,1637500139,1593380863000,1593349607127,0,0,0,,,,,,,,,,, +18512,1007,content://media/external/images/media/1007,/storage/emulated/0/PlantNet/1593380820581.JPEG,image/jpeg,506,900,0,108603,,1637500139,1593380820000,1593349607127,0,0,0,,,,,,,,,,, +18513,1006,content://media/external/images/media/1006,/storage/emulated/0/PlantNet/1593380794255.JPEG,image/jpeg,506,900,0,108819,,1637500139,1593380794000,1593349607127,0,0,0,,,,,,,,,,, +18514,2694,content://media/external/images/media/2694,/storage/emulated/0/Pictures/image-c7ccce40-a92b-46af-ab6a-b02bd55c2b561261348168463100365.jpg,image/jpeg,-1,-1,0,0,,1637500871,1593380757000,0,0,0,0,,,,,,,,,,, +18515,1005,content://media/external/images/media/1005,/storage/emulated/0/PlantNet/1593380748955.JPEG,image/jpeg,900,506,0,58367,,1637500139,1593380749000,1593376073683,0,0,0,,,,,,,,,,, +18516,3264,content://media/external/images/media/3264,/storage/emulated/0/DCIM/Camera/IMG_20200628_222751.jpg,image/jpeg,4000,2250,0,4344545,,1637502342,1593376073000,1593376073683,0,0,0,,,,,,,,,,, +18517,3602,content://media/external/images/media/3602,/storage/emulated/0/DCIM/Camera/IMG_20200628_185936.jpg,image/jpeg,5184,3880,270,8246339,,1637503238,1593363579000,1593363579198,0,0,0,,,,,,,,,,, +18518,3579,content://media/external/images/media/3579,/storage/emulated/0/DCIM/Camera/IMG_20200628_182233.jpg,image/jpeg,5184,3880,270,7751109,,1637503154,1593361356000,1593361356365,0,0,0,,,,,,,,,,, +18519,3702,content://media/external/images/media/3702,/storage/emulated/0/DCIM/Camera/IMG_20200628_182227.jpg,image/jpeg,5184,3880,270,7615055,,1637503392,1593361350000,1593361350294,0,0,0,,,,,,,,,,, +18520,2985,content://media/external/images/media/2985,/storage/emulated/0/DCIM/Camera/IMG_20200628_182118.jpg,image/jpeg,4000,2250,90,4718870,,1637501771,1593361281000,1593361280904,0,0,0,,,,,,,,,,, +18521,4996,content://media/external/images/media/4996,/storage/emulated/0/DCIM/Camera/IMG_20200628_182112.jpg,image/jpeg,4000,2250,90,8296965,,1637506101,1593361274000,1593361274573,0,0,0,,,,,,,,,,, +18522,3656,content://media/external/images/media/3656,/storage/emulated/0/DCIM/Camera/IMG_20200628_150643.jpg,image/jpeg,4000,2250,90,5633954,,1637503358,1593349607000,1593349607127,0,0,0,,,,,,,,,,, +18523,6561,content://media/external/images/media/6561,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200628-WA0007.jpg",image/jpeg,900,1600,0,116043,,1637518221,1593342408000,0,0,0,0,,,,,,,,,,, +18524,4265,content://media/external/images/media/4265,/storage/emulated/0/DCIM/Camera/IMG_20200627_101856.jpg,image/jpeg,4160,2340,0,5712600,,1637504756,1593245936000,1593245936610,0,0,0,,,,,,,,,,, +18525,3227,content://media/external/images/media/3227,/storage/emulated/0/DCIM/Camera/IMG_20200627_101838.jpg,image/jpeg,4000,2250,0,5914147,,1637502258,1593245920000,1593245920228,0,0,0,,,,,,,,,,, +18526,3601,content://media/external/images/media/3601,/storage/emulated/0/DCIM/Camera/IMG_20200627_101827.jpg,image/jpeg,4000,2250,0,4617956,,1637503238,1593245909000,1593245909655,0,0,0,,,,,,,,,,, +18527,4055,content://media/external/images/media/4055,/storage/emulated/0/DCIM/Camera/IMG_20200626_080304.jpg,image/jpeg,4000,2250,90,3831653,,1637504342,1593151387000,1593151387211,0,0,0,,,,,,,,,,, +18528,6452,content://media/external/images/media/6452,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200625-WA0000.jpg",image/jpeg,1600,900,0,175460,,1637518221,1593076419000,0,0,0,0,,,,,,,,,,, +18529,6760,content://media/external/images/media/6760,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200623-WA0005.jpg",image/jpeg,750,1334,0,43425,,1637518222,1592917373000,0,0,0,0,,,,,,,,,,, +18530,6338,content://media/external/images/media/6338,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0023.jpg",image/jpeg,1600,901,0,137201,,1637518221,1592680126000,0,0,0,0,,,,,,,,,,, +18531,6759,content://media/external/images/media/6759,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0020.jpg",image/jpeg,1600,901,0,148996,,1637518222,1592677168000,0,0,0,0,,,,,,,,,,, +18532,6559,content://media/external/images/media/6559,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0018.jpg",image/jpeg,1200,1600,0,174439,,1637518221,1592670963000,0,0,0,0,,,,,,,,,,, +18533,6869,content://media/external/images/media/6869,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0017.jpg",image/jpeg,1200,1600,0,167049,,1637518222,1592670961000,0,0,0,0,,,,,,,,,,, +18534,4484,content://media/external/images/media/4484,/storage/emulated/0/DCIM/Camera/IMG_20200620_114004.jpg,image/jpeg,4000,2250,90,4940102,,1637505122,1592646007000,1592646006954,0,0,0,,,,,,,,,,, +18535,3105,content://media/external/images/media/3105,/storage/emulated/0/DCIM/Camera/IMG_20200620_075817.jpg,image/jpeg,4000,2250,0,4223827,,1637502054,1592632700000,1592632700102,0,0,0,,,,,,,,,,, +18536,3127,content://media/external/images/media/3127,/storage/emulated/0/DCIM/Camera/IMG_20200620_075404.jpg,image/jpeg,720,1280,0,118578,,1637502068,1592632445000,0,0,0,0,,,,,,,,,,, +18537,6226,content://media/external/images/media/6226,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0007.jpg",image/jpeg,1200,1600,0,122546,,1637518221,1592604579000,0,0,0,0,,,,,,,,,,, +18538,6224,content://media/external/images/media/6224,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0006.jpg",image/jpeg,1200,1600,0,177980,,1637518221,1592604578000,0,0,0,0,,,,,,,,,,, +18539,6870,content://media/external/images/media/6870,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0005.jpg",image/jpeg,1200,1600,0,115046,,1637518222,1592604578000,0,0,0,0,,,,,,,,,,, +18540,6654,content://media/external/images/media/6654,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0003.jpg",image/jpeg,1200,1600,0,145760,,1637518221,1592604577000,0,0,0,0,,,,,,,,,,, +18541,6868,content://media/external/images/media/6868,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0004.jpg",image/jpeg,1200,1600,0,119044,,1637518222,1592604577000,0,0,0,0,,,,,,,,,,, +18542,6993,content://media/external/images/media/6993,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0002.jpg",image/jpeg,1200,1600,0,174557,,1637518222,1592604576000,0,0,0,0,,,,,,,,,,, +18543,6335,content://media/external/images/media/6335,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0001.jpg",image/jpeg,1200,1600,0,125787,,1637518221,1592604575000,0,0,0,0,,,,,,,,,,, +18544,6450,content://media/external/images/media/6450,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0000.jpg",image/jpeg,1200,1600,0,163636,,1637518221,1592604575000,0,0,0,0,,,,,,,,,,, +18545,4844,content://media/external/images/media/4844,/storage/emulated/0/DCIM/Camera/IMG_20200619_201313.jpg,image/jpeg,4000,2250,90,4808088,,1637505753,1592590396000,1592590396505,0,0,0,,,,,,,,,,, +18546,4504,content://media/external/images/media/4504,/storage/emulated/0/DCIM/Camera/IMG_20200619_174432.jpg,image/jpeg,4000,2250,0,4925930,,1637505160,1592581476000,1592581476395,0,0,0,,,,,,,,,,, +18547,4797,content://media/external/images/media/4797,/storage/emulated/0/DCIM/Camera/IMG_20200619_174427.jpg,image/jpeg,4000,2250,90,5125544,,1637505663,1592581471000,1592581471591,0,0,0,,,,,,,,,,, +18548,6864,content://media/external/images/media/6864,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200619-WA0016.jpg",image/jpeg,1080,810,0,65519,,1637518222,1592567228000,0,0,0,0,,,,,,,,,,, +18549,6655,content://media/external/images/media/6655,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200618-WA0001.jpg",image/jpeg,960,960,0,110335,,1637518221,1592475259000,0,0,0,0,,,,,,,,,,, +18550,6555,content://media/external/images/media/6555,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200617-WA0020.jpg",image/jpeg,1200,1600,0,256399,,1637518221,1592417986000,0,0,0,0,,,,,,,,,,, +18551,6756,content://media/external/images/media/6756,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200617-WA0010.jpg",image/jpeg,810,960,0,78319,,1637518222,1592394278000,0,0,0,0,,,,,,,,,,, +18552,3303,content://media/external/images/media/3303,/storage/emulated/0/DCIM/Camera/IMG_20200617_072006.jpg,image/jpeg,4000,2250,90,4290179,,1637502430,1592371207000,1592371207622,0,0,0,,,,,,,,,,, +18553,3226,content://media/external/images/media/3226,/storage/emulated/0/DCIM/Camera/IMG_20200617_071931.jpg,image/jpeg,4000,2250,90,4680060,,1637502258,1592371173000,1592371173483,0,0,0,,,,,,,,,,, +18554,6334,content://media/external/images/media/6334,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200616-WA0003.jpg",image/jpeg,1536,2048,0,188352,,1637518221,1592307033000,0,0,0,0,,,,,,,,,,, +18555,6652,content://media/external/images/media/6652,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200614-WA0014.jpg",image/jpeg,899,1599,0,173692,,1637518221,1592163811000,0,0,0,0,,,,,,,,,,, +18556,6333,content://media/external/images/media/6333,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200614-WA0012.jpg",image/jpeg,1600,1200,0,266821,,1637518221,1592163810000,0,0,0,0,,,,,,,,,,, +18557,6862,content://media/external/images/media/6862,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200614-WA0013.jpg",image/jpeg,1200,1600,0,183847,,1637518222,1592163810000,0,0,0,0,,,,,,,,,,, +18558,6332,content://media/external/images/media/6332,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200614-WA0011.jpg",image/jpeg,1200,1600,0,238769,,1637518221,1592163809000,0,0,0,0,,,,,,,,,,, +18559,6448,content://media/external/images/media/6448,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200614-WA0010.jpg",image/jpeg,1200,1600,0,250963,,1637518221,1592163809000,0,0,0,0,,,,,,,,,,, +18560,6991,content://media/external/images/media/6991,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200614-WA0009.jpg",image/jpeg,1200,1600,0,214237,,1637518222,1592163808000,0,0,0,0,,,,,,,,,,, +18561,6990,content://media/external/images/media/6990,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200614-WA0008.jpg",image/jpeg,1200,1600,0,163902,,1637518222,1592163807000,0,0,0,0,,,,,,,,,,, +18562,3979,content://media/external/images/media/3979,/storage/emulated/0/DCIM/Camera/IMG_20200614_210201.jpg,image/jpeg,4000,2250,0,4407332,,1637504059,1592161323000,1592161323379,0,0,0,,,,,,,,,,, +18563,4088,content://media/external/images/media/4088,/storage/emulated/0/DCIM/Camera/PANO_20200614_174156.jpg,image/jpeg,7344,3712,0,18571996,,1637504394,1592149323000,0,0,0,0,,,,,,,,,,, +18564,4650,content://media/external/images/media/4650,/storage/emulated/0/DCIM/Camera/PANO_20200614_173218.jpg,image/jpeg,7664,3744,0,20501233,,1637505414,1592148746000,0,0,0,0,,,,,,,,,,, +18565,2984,content://media/external/images/media/2984,/storage/emulated/0/DCIM/Camera/IMG_20200614_173209.jpg,image/jpeg,4160,2340,0,5748120,,1637501771,1592148729000,1592148729150,0,0,0,,,,,,,,,,, +18566,3923,content://media/external/images/media/3923,/storage/emulated/0/DCIM/Camera/IMG_20200614_173206.jpg,image/jpeg,4160,2340,0,5450934,,1637503834,1592148726000,1592148726461,0,0,0,,,,,,,,,,, +18567,4394,content://media/external/images/media/4394,/storage/emulated/0/DCIM/Camera/IMG_20200614_135430.jpg,image/jpeg,4000,2250,0,4360130,,1637505004,1592135671000,1592135671686,0,0,0,,,,,,,,,,, +18568,4036,content://media/external/images/media/4036,/storage/emulated/0/DCIM/Camera/IMG_20200614_135427.jpg,image/jpeg,4000,2250,0,4488144,,1637504234,1592135669000,1592135669599,0,0,0,,,,,,,,,,, +18569,6755,content://media/external/images/media/6755,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200613-WA0022.jpeg",image/jpeg,4000,2250,0,736302,,1637518222,1592066269000,0,0,0,0,,,,,,,,,,, +18570,6447,content://media/external/images/media/6447,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200613-WA0018.jpeg",image/jpeg,4000,2250,0,685648,,1637518221,1592062507000,0,0,0,0,,,,,,,,,,, +18571,2944,content://media/external/images/media/2944,/storage/emulated/0/DCIM/Camera/IMG_20200613_112323.jpg,image/jpeg,4000,2250,0,4755646,,1637501660,1592040205000,1592040205075,0,0,0,,,,,,,,,,, +18572,6221,content://media/external/images/media/6221,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200613-WA0004.jpeg",image/jpeg,2250,4000,0,624767,,1637518221,1592038900000,0,0,0,0,,,,,,,,,,, +18573,2735,content://media/external/images/media/2735,/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-06-12-20-50-06-812_com.brytonsport.active.jpg,image/jpeg,1080,2340,0,729332,,1637500987,1591987806000,0,0,0,0,,,,,,,,,,, +18574,4135,content://media/external/images/media/4135,/storage/emulated/0/DCIM/Camera/IMG_20200612_111344.jpg,image/jpeg,4000,2250,0,5918999,,1637504473,1591953228000,1591953227976,0,0,0,,,,,,,,,,, +18575,6650,content://media/external/images/media/6650,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200611-WA0009.jpg",image/jpeg,1600,1200,0,370537,,1637518221,1591890782000,0,0,0,0,,,,,,,,,,, +18576,6445,content://media/external/images/media/6445,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200611-WA0008.jpg",image/jpeg,1200,1600,0,402238,,1637518221,1591890781000,0,0,0,0,,,,,,,,,,, +18577,6986,content://media/external/images/media/6986,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200611-WA0007.jpg",image/jpeg,1200,1600,0,304505,,1637518222,1591890780000,0,0,0,0,,,,,,,,,,, +18578,6444,content://media/external/images/media/6444,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200609-WA0015.jpg",image/jpeg,755,1024,0,79385,,1637518221,1591735598000,0,0,0,0,,,,,,,,,,, +18579,4054,content://media/external/images/media/4054,/storage/emulated/0/DCIM/Camera/IMG_20200609_183651.jpg,image/jpeg,4000,2250,90,5779710,,1637504342,1591720615000,1591720615502,0,0,0,,,,,,,,,,, +18580,3578,content://media/external/images/media/3578,/storage/emulated/0/DCIM/Camera/IMG_20200607_222212.jpg,image/jpeg,4000,2250,90,4728246,,1637503154,1591561335000,1591561335173,0,0,0,,,,,,,,,,, +18581,4308,content://media/external/images/media/4308,/storage/emulated/0/DCIM/Camera/IMG_20200607_143459.jpg,image/jpeg,4000,2250,90,4453964,,1637504817,1591533301000,1591533301298,0,0,0,,,,,,,,,,, +18582,3104,content://media/external/images/media/3104,/storage/emulated/0/DCIM/Camera/IMG_20200607_143443.jpg,image/jpeg,4000,2250,90,4549174,,1637502054,1591533285000,1591533285153,0,0,0,,,,,,,,,,, +18583,4544,content://media/external/images/media/4544,/storage/emulated/0/DCIM/Camera/IMG_20200607_141718.jpg,image/jpeg,4000,2250,0,5018981,,1637505187,1591532240000,1591532239957,0,0,0,,,,,,,,,,, +18584,4483,content://media/external/images/media/4483,/storage/emulated/0/DCIM/Camera/IMG_20200607_141713.jpg,image/jpeg,4000,2250,0,4166849,,1637505122,1591532235000,1591532235180,0,0,0,,,,,,,,,,, +18585,3469,content://media/external/images/media/3469,/storage/emulated/0/DCIM/Camera/IMG_20200607_141640.jpg,image/jpeg,4000,2250,0,4429943,,1637502817,1591532201000,1591532201692,0,0,0,,,,,,,,,,, +18586,2967,content://media/external/images/media/2967,/storage/emulated/0/DCIM/Camera/IMG_20200607_141634.jpg,image/jpeg,4000,2250,0,4337150,,1637501684,1591532195000,1591532195208,0,0,0,,,,,,,,,,, +18587,4115,content://media/external/images/media/4115,/storage/emulated/0/DCIM/Camera/IMG_20200607_141616.jpg,image/jpeg,4000,2250,0,4691292,,1637504451,1591532177000,1591532177250,0,0,0,,,,,,,,,,, +18588,3807,content://media/external/images/media/3807,/storage/emulated/0/DCIM/Camera/IMG_20200607_141605.jpg,image/jpeg,4000,2250,90,4132204,,1637503601,1591532167000,1591532167612,0,0,0,,,,,,,,,,, +18589,4714,content://media/external/images/media/4714,/storage/emulated/0/DCIM/Camera/IMG_20200606_165852.jpg,image/jpeg,4000,2250,90,5406413,,1637505565,1591455535000,1591455535703,0,0,0,,,,,,,,,,, +18590,2734,content://media/external/images/media/2734,/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-06-05-19-52-54-676_com.brytonsport.active.jpg,image/jpeg,1080,2340,0,674799,,1637500987,1591379574000,0,0,0,0,,,,,,,,,,, +18591,2692,content://media/external/images/media/2692,/storage/emulated/0/Pictures/Suunto/sportie_a5840624.jpg,image/jpeg,1080,1080,0,168565,,1637500871,1591167767000,0,0,0,0,,,,,,,,,,, +18592,2733,content://media/external/images/media/2733,/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-06-03-09-02-03-192_com.stt.android.suunto.jpg,image/jpeg,1080,2340,0,749690,,1637500987,1591167723000,0,0,0,0,,,,,,,,,,, +18593,3682,content://media/external/images/media/3682,/storage/emulated/0/DCIM/Camera/IMG_20200602_204528.jpg,image/jpeg,720,1280,0,184373,,1637503389,1591123528000,0,0,0,0,,,,,,,,,,, +18594,4393,content://media/external/images/media/4393,/storage/emulated/0/DCIM/Camera/IMG_20200602_204516.jpg,image/jpeg,720,1280,0,123769,,1637505004,1591123521000,0,0,0,0,,,,,,,,,,, +18595,6984,content://media/external/images/media/6984,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0032.jpg",image/jpeg,972,1296,0,173269,,1637518222,1591123478000,0,0,0,0,,,,,,,,,,, +18596,6552,content://media/external/images/media/6552,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0031.jpg",image/jpeg,1200,1600,0,290197,,1637518221,1591123477000,0,0,0,0,,,,,,,,,,, +18597,6754,content://media/external/images/media/6754,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0030.jpg",image/jpeg,1200,1600,0,221240,,1637518222,1591123476000,0,0,0,0,,,,,,,,,,, +18598,6983,content://media/external/images/media/6983,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0029.jpg",image/jpeg,1200,1600,0,248947,,1637518222,1591123475000,0,0,0,0,,,,,,,,,,, +18599,6222,content://media/external/images/media/6222,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0028.jpg",image/jpeg,1200,1600,0,250257,,1637518221,1591123474000,0,0,0,0,,,,,,,,,,, +18600,6982,content://media/external/images/media/6982,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0027.jpg",image/jpeg,1200,1600,0,189014,,1637518222,1591123473000,0,0,0,0,,,,,,,,,,, +18601,6549,content://media/external/images/media/6549,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0026.jpg",image/jpeg,972,1296,0,150933,,1637518221,1591123472000,0,0,0,0,,,,,,,,,,, +18602,6753,content://media/external/images/media/6753,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0025.jpg",image/jpeg,1296,729,0,146576,,1637518222,1591123352000,0,0,0,0,,,,,,,,,,, +18603,6441,content://media/external/images/media/6441,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0024.jpg",image/jpeg,1600,900,0,272607,,1637518221,1591121932000,0,0,0,0,,,,,,,,,,, +18604,6328,content://media/external/images/media/6328,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0023.jpg",image/jpeg,1600,900,0,309178,,1637518221,1591121931000,0,0,0,0,,,,,,,,,,, +18605,6326,content://media/external/images/media/6326,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0021.jpg",image/jpeg,1600,900,0,212692,,1637518221,1591121930000,0,0,0,0,,,,,,,,,,, +18606,6981,content://media/external/images/media/6981,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0022.jpg",image/jpeg,1600,900,0,168951,,1637518222,1591121930000,0,0,0,0,,,,,,,,,,, +18607,6547,content://media/external/images/media/6547,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0020.jpg",image/jpeg,1600,900,0,280720,,1637518221,1591121929000,0,0,0,0,,,,,,,,,,, +18608,6979,content://media/external/images/media/6979,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0019.jpg",image/jpeg,1600,900,0,242068,,1637518222,1591121928000,0,0,0,0,,,,,,,,,,, +18609,6325,content://media/external/images/media/6325,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0015.jpg",image/jpeg,899,1600,0,160757,,1637518221,1591104052000,0,0,0,0,,,,,,,,,,, +18610,6545,content://media/external/images/media/6545,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0014.jpg",image/jpeg,1599,1200,0,383727,,1637518221,1591100525000,0,0,0,0,,,,,,,,,,, +18611,6978,content://media/external/images/media/6978,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0013.jpg",image/jpeg,1599,1200,0,378001,,1637518222,1591100525000,0,0,0,0,,,,,,,,,,, +18612,6219,content://media/external/images/media/6219,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0012.jpg",image/jpeg,1599,1200,0,566877,,1637518221,1591100524000,0,0,0,0,,,,,,,,,,, +18613,6323,content://media/external/images/media/6323,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0010.jpg",image/jpeg,1599,1200,0,284198,,1637518221,1591100523000,0,0,0,0,,,,,,,,,,, +18614,6440,content://media/external/images/media/6440,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0011.jpg",image/jpeg,1599,1200,0,342186,,1637518221,1591100523000,0,0,0,0,,,,,,,,,,, +18615,2966,content://media/external/images/media/2966,/storage/emulated/0/DCIM/Camera/IMG_20200602_132818.jpg,image/jpeg,4000,2250,90,4675914,,1637501684,1591097301000,1591097301214,0,0,0,,,,,,,,,,, +18616,4224,content://media/external/images/media/4224,/storage/emulated/0/DCIM/Camera/IMG_20200602_132819.jpg,image/jpeg,4000,2250,90,4661512,,1637504726,1591097301000,1591097301088,0,0,0,,,,,,,,,,, +18617,6974,content://media/external/images/media/6974,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0008.jpg",image/jpeg,768,1024,0,131803,,1637518222,1591095559000,0,0,0,0,,,,,,,,,,, +18618,6975,content://media/external/images/media/6975,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0009.jpg",image/jpeg,768,1024,0,110627,,1637518222,1591095559000,0,0,0,0,,,,,,,,,,, +18619,6546,content://media/external/images/media/6546,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0007.jpg",image/jpeg,768,1024,0,134302,,1637518221,1591095558000,0,0,0,0,,,,,,,,,,, +18620,6973,content://media/external/images/media/6973,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0006.jpg",image/jpeg,768,1024,0,111507,,1637518222,1591095557000,0,0,0,0,,,,,,,,,,, +18621,4152,content://media/external/images/media/4152,/storage/emulated/0/DCIM/Camera/IMG_20200602_104152.jpg,image/jpeg,4000,2250,0,7364586,,1637504481,1591087315000,1591087314949,0,0,0,,,,,,,,,,, +18622,3302,content://media/external/images/media/3302,/storage/emulated/0/DCIM/Camera/IMG_20200602_104137.jpg,image/jpeg,4000,2250,90,7339642,,1637502430,1591087299000,1591087299030,0,0,0,,,,,,,,,,, +18623,4353,content://media/external/images/media/4353,/storage/emulated/0/DCIM/Camera/IMG_20200602_103744.jpg,image/jpeg,4000,2250,0,7368172,,1637504970,1591087067000,1591087067789,0,0,0,,,,,,,,,,, +18624,3577,content://media/external/images/media/3577,/storage/emulated/0/DCIM/Camera/IMG_20200602_103726.jpg,image/jpeg,4160,2340,0,6355425,,1637503154,1591087046000,1591087046802,0,0,0,,,,,,,,,,, +18625,4281,content://media/external/images/media/4281,/storage/emulated/0/DCIM/Camera/IMG_20200602_103604.jpg,image/jpeg,4000,2250,90,5737335,,1637504807,1591086966000,1591086966839,0,0,0,,,,,,,,,,, +18626,3451,content://media/external/images/media/3451,/storage/emulated/0/DCIM/Camera/IMG_20200602_103552.jpg,image/jpeg,4160,2340,90,6469034,,1637502804,1591086952000,1591086952709,0,0,0,,,,,,,,,,, +18627,3088,content://media/external/images/media/3088,/storage/emulated/0/DCIM/Camera/IMG_20200602_103516.jpg,image/jpeg,4000,2250,0,6798601,,1637501971,1591086919000,1591086918976,0,0,0,,,,,,,,,,, +18628,3285,content://media/external/images/media/3285,/storage/emulated/0/DCIM/Camera/IMG_20200602_093331.jpg,image/jpeg,5184,3880,270,6939242,,1637502355,1591083213000,1591083213758,0,0,0,,,,,,,,,,, +18629,4076,content://media/external/images/media/4076,/storage/emulated/0/DCIM/Camera/IMG_20200602_093318.jpg,image/jpeg,4160,2340,90,6081638,,1637504394,1591083198000,1591083197811,0,0,0,,,,,,,,,,, +18630,2693,content://media/external/images/media/2693,/storage/emulated/0/Pictures/Suunto/sportie_d65f2fd9.jpg,image/jpeg,1080,1080,0,173529,,1637500871,1590942522000,0,0,0,0,,,,,,,,,,, +18631,6858,content://media/external/images/media/6858,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200531-WA0013.jpg",image/jpeg,900,1600,0,142384,,1637518222,1590924065000,0,0,0,0,,,,,,,,,,, +18632,6747,content://media/external/images/media/6747,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200531-WA0011.jpg",image/jpeg,900,1600,0,170137,,1637518222,1590920465000,0,0,0,0,,,,,,,,,,, +18633,6971,content://media/external/images/media/6971,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200531-WA0008.jpeg",image/jpeg,4000,2250,0,778050,,1637518222,1590920041000,0,0,0,0,,,,,,,,,,, +18634,3922,content://media/external/images/media/3922,/storage/emulated/0/DCIM/Camera/IMG_20200531_121020.jpg,image/jpeg,4000,2250,90,4533926,,1637503834,1590919822000,1590919821933,0,0,0,,,,,,,,,,, +18635,2732,content://media/external/images/media/2732,/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-05-30-20-00-03-432_com.brytonsport.active.jpg,image/jpeg,1080,2340,0,483115,,1637500987,1590861603000,0,0,0,0,,,,,,,,,,, +18636,2825,content://media/external/images/media/2825,/storage/emulated/0/DCIM/Camera/IMG_20200530_162433.jpg,image/jpeg,4000,2250,90,4495934,,1637501369,1590848674000,1590848674858,0,0,0,,,,,,,,,,, +18637,4754,content://media/external/images/media/4754,/storage/emulated/0/DCIM/Camera/IMG_20200530_162426.jpg,image/jpeg,4000,2250,90,4377923,,1637505639,1590848668000,1590848668235,0,0,0,,,,,,,,,,, +18638,2731,content://media/external/images/media/2731,/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-05-30-14-16-20-118_com.brytonsport.active.jpg,image/jpeg,1080,2340,0,621039,,1637500987,1590840980000,0,0,0,0,,,,,,,,,,, +18639,6543,content://media/external/images/media/6543,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200526-WA0010.jpg",image/jpeg,1080,1350,0,133191,,1637518221,1590493313000,0,0,0,0,,,,,,,,,,, +18640,4995,content://media/external/images/media/4995,/storage/emulated/0/DCIM/Camera/IMG_20200524_181131.jpg,image/jpeg,4000,2250,0,5206740,,1637506101,1590336692000,1590336692383,0,0,0,,,,,,,,,,, +18641,4434,content://media/external/images/media/4434,/storage/emulated/0/DCIM/Camera/IMG_20200524_181120.jpg,image/jpeg,4000,2250,90,4306390,,1637505068,1590336682000,1590336682737,0,0,0,,,,,,,,,,, +18642,4908,content://media/external/images/media/4908,/storage/emulated/0/DCIM/Camera/IMG_20200524_121527.jpg,image/jpeg,5184,3880,0,5272813,,1637505944,1590315329000,1590230355241,0,0,0,,,,,,,,,,, +18643,6857,content://media/external/images/media/6857,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200523-WA0013.jpg",image/jpeg,900,1600,0,236318,,1637518222,1590254932000,0,0,0,0,,,,,,,,,,, +18644,6647,content://media/external/images/media/6647,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200523-WA0012.jpg",image/jpeg,900,1600,0,265438,,1637518221,1590254931000,0,0,0,0,,,,,,,,,,, +18645,6001,content://media/external/images/media/6001,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200523-WA0011.jpg",image/jpeg,900,1600,0,249813,,1637518220,1590254930000,0,0,0,0,,,,,,,,,,, +18646,6002,content://media/external/images/media/6002,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200523-WA0010.jpg",image/jpeg,1600,900,0,233007,,1637518220,1590254929000,0,0,0,0,,,,,,,,,,, +18647,6434,content://media/external/images/media/6434,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200523-WA0009.jpg",image/jpeg,1600,900,0,192621,,1637518221,1590254928000,0,0,0,0,,,,,,,,,,, +18648,3434,content://media/external/images/media/3434,/storage/emulated/0/DCIM/Camera/IMG_20200523_123941.jpg,image/jpeg,4000,2250,90,5101895,,1637502783,1590242803000,1590230385816,0,0,0,,,,,,,,,,, +18649,3681,content://media/external/images/media/3681,/storage/emulated/0/DCIM/Camera/IMG_20200523_123905.jpg,image/jpeg,5184,3880,180,5851651,,1637503389,1590242803000,1590230347453,0,0,0,,,,,,,,,,, +18650,2874,content://media/external/images/media/2874,/storage/emulated/0/DCIM/Camera/IMG_20200523_145820.jpg,image/jpeg,4000,2250,0,5146040,,1637501460,1590238701000,1590238701756,0,0,0,,,,,,,,,,, +18651,4817,content://media/external/images/media/4817,/storage/emulated/0/DCIM/Camera/IMG_20200523_145804.jpg,image/jpeg,4000,2250,90,5600458,,1637505730,1590238686000,1590238686192,0,0,0,,,,,,,,,,, +18652,6000,content://media/external/images/media/6000,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200523-WA0007.jpg",image/jpeg,1600,1202,0,200064,,1637518220,1590235905000,0,0,0,0,,,,,,,,,,, +18653,6217,content://media/external/images/media/6217,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200523-WA0005.jpg",image/jpeg,1080,1080,0,540682,,1637518221,1590230531000,0,0,0,0,,,,,,,,,,, +18654,6855,content://media/external/images/media/6855,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200521-WA0000.jpg",image/jpeg,750,1334,0,93072,,1637518222,1590046855000,0,0,0,0,,,,,,,,,,, +18655,3655,content://media/external/images/media/3655,/storage/emulated/0/DCIM/Camera/IMG_20200519_175140.jpg,image/jpeg,4000,2250,90,4840618,,1637503358,1589903502000,1589903501930,0,0,0,,,,,,,,,,, +18656,6970,content://media/external/images/media/6970,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200516-WA0015.jpg",image/jpeg,900,1600,0,152344,,1637518222,1589699164000,0,0,0,0,,,,,,,,,,, +18657,6969,content://media/external/images/media/6969,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200516-WA0001.jpeg",image/jpeg,2250,4000,0,1043863,,1637518222,1589625924000,0,0,0,0,,,,,,,,,,, +18658,6542,content://media/external/images/media/6542,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200510-WA0020.jpg",image/jpeg,1200,1600,0,233492,,1637518221,1589121328000,0,0,0,0,,,,,,,,,,, +18659,4776,content://media/external/images/media/4776,/storage/emulated/0/DCIM/Camera/IMG_20200510_120915.jpg,image/jpeg,4000,2250,90,4208383,,1637505656,1589105360000,1589105360073,0,0,0,,,,,,,,,,, +18660,4223,content://media/external/images/media/4223,/storage/emulated/0/DCIM/Camera/IMG_20200509_145516.jpg,image/jpeg,5184,3880,0,5882348,,1637504726,1589032652000,1589028918677,0,0,0,,,,,,,,,,, +18661,4452,content://media/external/images/media/4452,/storage/emulated/0/DCIM/Camera/IMG_20200509_145832.jpg,image/jpeg,4000,2250,0,6350227,,1637505068,1589032652000,1589029115320,0,0,0,,,,,,,,,,, +18662,3619,content://media/external/images/media/3619,/storage/emulated/0/DCIM/Camera/IMG_20200507_191103.jpg,image/jpeg,4000,2250,90,4619129,,1637503271,1588871465000,1588871465068,0,0,0,,,,,,,,,,, +18663,4075,content://media/external/images/media/4075,/storage/emulated/0/DCIM/Camera/IMG_20200506_180208.jpg,image/jpeg,4000,2250,0,3385426,,1637504394,1588780931000,1588780930863,0,0,0,,,,,,,,,,, +18664,4605,content://media/external/images/media/4605,/storage/emulated/0/DCIM/Camera/IMG_20200506_134800.jpg,image/jpeg,4000,2250,0,4110083,,1637505308,1588765682000,1588765681989,0,0,0,,,,,,,,,,, +18665,4862,content://media/external/images/media/4862,/storage/emulated/0/DCIM/Camera/IMG_20200506_134747.jpg,image/jpeg,4000,2250,0,3984697,,1637505831,1588765668000,1588765668745,0,0,0,,,,,,,,,,, +18666,2646,content://media/external/images/media/2646,/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-05-01-14-19-34-148_com.orbit.orbitsmarthome.jpg,image/jpeg,1080,2340,0,852693,,1637500870,1588335574000,0,0,0,0,,,,,,,,,,, +18667,2645,content://media/external/images/media/2645,/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-04-29-15-08-02-092_com.android.browser.jpg,image/jpeg,1080,2340,0,587897,,1637500870,1588165682000,0,0,0,0,,,,,,,,,,, +18668,2843,content://media/external/images/media/2843,/storage/emulated/0/DCIM/Camera/IMG_20200426_133810.jpg,image/jpeg,4000,2250,90,4616959,,1637501431,1587901092000,1587901092151,0,0,0,,,,,,,,,,, +18669,3806,content://media/external/images/media/3806,/storage/emulated/0/DCIM/Camera/IMG_20200425_203214.jpg,image/jpeg,4160,2340,0,4166710,,1637503601,1587839534000,1587839534209,0,0,0,,,,,,,,,,, +18670,3510,content://media/external/images/media/3510,/storage/emulated/0/DCIM/Camera/IMG_20200425_203209.jpg,image/jpeg,4160,2340,0,4271375,,1637502969,1587839529000,1587839529879,0,0,0,,,,,,,,,,, +18671,4542,content://media/external/images/media/4542,/storage/emulated/0/DCIM/Camera/IMG_20200425_203201.jpg,image/jpeg,4160,2340,0,4849016,,1637505187,1587839521000,1587839520955,0,0,0,,,,,,,,,,, +18672,3433,content://media/external/images/media/3433,/storage/emulated/0/DCIM/Camera/IMG_20200425_202832.jpg,image/jpeg,4160,2340,0,3355473,,1637502783,1587839313000,1587839312896,0,0,0,,,,,,,,,,, +18673,6432,content://media/external/images/media/6432,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200425-WA0071.jpg",image/jpeg,901,1600,0,180340,,1637518221,1587838835000,0,0,0,0,,,,,,,,,,, +18674,5996,content://media/external/images/media/5996,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200425-WA0055.jpg",image/jpeg,1200,1600,0,169935,,1637518220,1587829202000,0,0,0,0,,,,,,,,,,, +18675,4018,content://media/external/images/media/4018,/storage/emulated/0/DCIM/Camera/IMG_20200425_173659.jpg,image/jpeg,4000,2250,90,5081431,,1637504201,1587829022000,1587829022104,0,0,0,,,,,,,,,,, +18676,6854,content://media/external/images/media/6854,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200425-WA0005.jpg",image/jpeg,1512,2016,0,189713,,1637518222,1587800995000,0,0,0,0,,,,,,,,,,, +18677,6540,content://media/external/images/media/6540,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200424-WA0038.jpg",image/jpeg,512,512,0,28255,,1637518221,1587754225000,0,0,0,0,,,,,,,,,,, +18678,6429,content://media/external/images/media/6429,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0044.jpg",image/jpeg,768,1280,0,88662,,1637518221,1587670348000,0,0,0,0,,,,,,,,,,, +18679,6965,content://media/external/images/media/6965,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0043.jpg",image/jpeg,960,1600,0,129377,,1637518222,1587670104000,0,0,0,0,,,,,,,,,,, +18680,6966,content://media/external/images/media/6966,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0042.jpg",image/jpeg,1600,960,0,136539,,1637518222,1587670011000,0,0,0,0,,,,,,,,,,, +18681,2614,content://media/external/images/media/2614,/storage/emulated/0/DCIM/Facebook/FB_IMG_1587669920344.jpg,image/jpeg,1080,810,0,131574,,1637500870,1587669920000,0,0,0,0,,,,,,,,,,, +18682,6642,content://media/external/images/media/6642,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0040.jpg",image/jpeg,1600,960,0,121809,,1637518221,1587669598000,0,0,0,0,,,,,,,,,,, +18683,2613,content://media/external/images/media/2613,/storage/emulated/0/DCIM/Facebook/FB_IMG_1587667814505.jpg,image/jpeg,1080,2038,0,146093,,1637500870,1587667814000,0,0,0,0,,,,,,,,,,, +18684,5994,content://media/external/images/media/5994,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0023.jpg",image/jpeg,1600,1200,0,271186,,1637518220,1587667494000,0,0,0,0,,,,,,,,,,, +18685,6643,content://media/external/images/media/6643,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0024.jpg",image/jpeg,1600,1200,0,244565,,1637518221,1587667494000,0,0,0,0,,,,,,,,,,, +18686,5992,content://media/external/images/media/5992,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0022.jpg",image/jpeg,1200,1600,0,200196,,1637518220,1587667493000,0,0,0,0,,,,,,,,,,, +18687,2612,content://media/external/images/media/2612,/storage/emulated/0/DCIM/Facebook/FB_IMG_1587666986060.jpg,image/jpeg,960,720,0,56295,,1637500870,1587666986000,0,0,0,0,,,,,,,,,,, +18688,2611,content://media/external/images/media/2611,/storage/emulated/0/DCIM/Facebook/FB_IMG_1587666955966.jpg,image/jpeg,542,542,0,52891,,1637500870,1587666955000,0,0,0,0,,,,,,,,,,, +18689,6538,content://media/external/images/media/6538,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0013.jpg",image/jpeg,768,1024,0,104574,,1637518221,1587662382000,0,0,0,0,,,,,,,,,,, +18690,6962,content://media/external/images/media/6962,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0012.jpg",image/jpeg,576,1024,0,79398,,1637518222,1587662381000,0,0,0,0,,,,,,,,,,, +18691,2779,content://media/external/images/media/2779,/storage/emulated/0/DCIM/Camera/IMG_20200422_173454.jpg,image/jpeg,4000,2250,90,4562248,,1637501282,1587569696000,1587569696421,0,0,0,,,,,,,,,,, +18692,6685,content://media/external/images/media/6685,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG_20200421_194936.jpg",image/jpeg,1600,899,0,380196,,1637518222,1587491376000,0,0,0,0,,,,,,,,,,, +18693,6213,content://media/external/images/media/6213,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200307-WA0062.jpg",image/jpeg,768,1024,0,112798,,1637518221,1587406448000,0,0,0,0,,,,,,,,,,, +18694,6852,content://media/external/images/media/6852,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200420-WA0026.jpg",image/jpeg,1200,1600,0,283402,,1637518222,1587406301000,0,0,0,0,,,,,,,,,,, +18695,4861,content://media/external/images/media/4861,/storage/emulated/0/DCIM/Camera/IMG_20200419_214727.jpg,image/jpeg,2115,3087,0,2585116,,1637505831,1587325648000,1584286717363,0,0,0,,,,,,,,,,, +18696,2859,content://media/external/images/media/2859,/storage/emulated/0/DCIM/Camera/IMG_20200418_153505.jpg,image/jpeg,4000,2250,0,4057550,,1637501457,1587216907000,1587216907796,0,0,0,,,,,,,,,,, +18697,4151,content://media/external/images/media/4151,/storage/emulated/0/DCIM/Camera/IMG_20200415_145156.jpg,image/jpeg,4000,2250,90,4577363,,1637504481,1586955118000,1586955118800,0,0,0,,,,,,,,,,, +18698,4262,content://media/external/images/media/4262,/storage/emulated/0/DCIM/Camera/IMG_20200415_090154.jpg,image/jpeg,4000,2250,0,4880863,,1637504756,1586934117000,1586934117333,0,0,0,,,,,,,,,,, +18699,4713,content://media/external/images/media/4713,/storage/emulated/0/DCIM/Camera/IMG_20200415_090137.jpg,image/jpeg,4000,2250,90,5456307,,1637505565,1586934101000,1586934101428,0,0,0,,,,,,,,,,, +18700,6428,content://media/external/images/media/6428,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200412-WA0101.jpg",image/jpeg,1200,1600,0,246296,,1637518221,1586720254000,0,0,0,0,,,,,,,,,,, +18701,3319,content://media/external/images/media/3319,/storage/emulated/0/DCIM/Camera/IMG_20200412_163922.jpg,image/jpeg,4000,2250,0,5824637,,1637502438,1586702364000,1586702364589,0,0,0,,,,,,,,,,, +18702,4202,content://media/external/images/media/4202,/storage/emulated/0/DCIM/Camera/IMG_20200412_163856.jpg,image/jpeg,4000,2250,90,5050067,,1637504640,1586702341000,1586702341241,0,0,0,,,,,,,,,,, +18703,4775,content://media/external/images/media/4775,/storage/emulated/0/DCIM/Camera/IMG_20200412_133302.jpg,image/jpeg,4000,2250,90,2907598,,1637505656,1586691185000,1586691185281,0,0,0,,,,,,,,,,, +18704,5991,content://media/external/images/media/5991,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200412-WA0076.jpeg",image/jpeg,4000,2250,0,1726363,,1637518220,1586689341000,0,0,0,0,,,,,,,,,,, +18705,6109,content://media/external/images/media/6109,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200412-WA0075.jpg",image/jpeg,899,1600,0,127651,,1637518220,1586689320000,0,0,0,0,,,,,,,,,,, +18706,4344,content://media/external/images/media/4344,/storage/emulated/0/DCIM/Camera/IMG_20200412_124212.jpg,image/jpeg,4000,2250,0,4675874,,1637504906,1586688134000,1586688134124,0,0,0,,,,,,,,,,, +18707,4541,content://media/external/images/media/4541,/storage/emulated/0/DCIM/Camera/IMG_20200412_124045.jpg,image/jpeg,4000,2250,0,5033715,,1637505187,1586688047000,1586688047212,0,0,0,,,,,,,,,,, +18708,3744,content://media/external/images/media/3744,/storage/emulated/0/DCIM/Camera/IMG_20200412_122007.jpg,image/jpeg,4000,2250,0,5647330,,1637503488,1586686809000,1586686809576,0,0,0,,,,,,,,,,, +18709,2981,content://media/external/images/media/2981,/storage/emulated/0/DCIM/Camera/IMG_20200412_121954.jpg,image/jpeg,4000,2250,0,5679131,,1637501771,1586686797000,1586686797289,0,0,0,,,,,,,,,,, +18710,5896,content://media/external/images/media/5896,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200411-WA0010.jpeg",image/jpeg,2250,4000,0,915966,,1637518220,1586601949000,0,0,0,0,,,,,,,,,,, +18711,4561,content://media/external/images/media/4561,/storage/emulated/0/DCIM/Camera/IMG_20200408_221839.jpg,image/jpeg,197,140,0,6372,,1637505216,1586377119000,1586376666219,0,0,0,,,,,,,,,,, +18712,3870,content://media/external/images/media/3870,/storage/emulated/0/DCIM/Camera/IMG_20200404_190918.jpg,image/jpeg,4000,2250,0,4858940,,1637503729,1586020161000,1586020161091,0,0,0,,,,,,,,,,, +18713,3921,content://media/external/images/media/3921,/storage/emulated/0/DCIM/Camera/IMG_20200404_123937.jpg,image/jpeg,4000,2250,0,4385355,,1637503834,1585996778000,1585996778466,0,0,0,,,,,,,,,,, +18714,2965,content://media/external/images/media/2965,/storage/emulated/0/DCIM/Camera/IMG_20200404_123911.jpg,image/jpeg,4160,2340,0,4727186,,1637501684,1585996751000,1585996751756,0,0,0,,,,,,,,,,, +18715,3066,content://media/external/images/media/3066,/storage/emulated/0/DCIM/Camera/IMG_20200404_110154.jpg,image/jpeg,4000,2250,90,4394520,,1637501905,1585990917000,1585990917118,0,0,0,,,,,,,,,,, +18716,3468,content://media/external/images/media/3468,/storage/emulated/0/DCIM/Camera/IMG_20200404_105518.jpg,image/jpeg,4000,2250,90,4014976,,1637502817,1585990520000,1585990520561,0,0,0,,,,,,,,,,, +18717,6107,content://media/external/images/media/6107,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200329-WA0046.jpg",image/jpeg,960,1280,0,103983,,1637518220,1585511598000,0,0,0,0,,,,,,,,,,, +18718,5989,content://media/external/images/media/5989,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200327-WA0010.jpeg",image/jpeg,4000,2250,0,1204082,,1637518220,1585311094000,0,0,0,0,,,,,,,,,,, +18719,6104,content://media/external/images/media/6104,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200327-WA0007.jpeg",image/jpeg,4000,2250,0,1083594,,1637518220,1585309682000,0,0,0,0,,,,,,,,,,, +18720,2842,content://media/external/images/media/2842,/storage/emulated/0/DCIM/Camera/IMG_20200322_121826.jpg,image/jpeg,2403,2250,0,1957376,,1637501431,1584875906000,1584875873300,0,0,0,,,,,,,,,,, +18721,2841,content://media/external/images/media/2841,/storage/emulated/0/DCIM/Camera/IMG_20200322_121659.jpg,image/jpeg,4000,2250,0,4563620,,1637501431,1584875822000,1584875822593,0,0,0,,,,,,,,,,, +18722,4753,content://media/external/images/media/4753,/storage/emulated/0/DCIM/Camera/IMG_20200322_102743.jpg,image/jpeg,4000,2250,0,3423021,,1637505639,1584869264000,1584869237674,0,0,0,,,,,,,,,,, +18723,4017,content://media/external/images/media/4017,/storage/emulated/0/DCIM/Camera/IMG_20200321_190755.jpg,image/jpeg,4000,2250,0,4521215,,1637504201,1584814078000,1584814078438,0,0,0,,,,,,,,,,, +18724,3888,content://media/external/images/media/3888,/storage/emulated/0/DCIM/Camera/IMG_20200321_165338.jpg,image/jpeg,4000,2250,0,4824561,,1637503732,1584806021000,1584806021136,0,0,0,,,,,,,,,,, +18725,3763,content://media/external/images/media/3763,/storage/emulated/0/DCIM/Camera/IMG_20200320_215811.jpg,image/jpeg,4000,2250,0,4741574,,1637503508,1584737894000,1584737893887,0,0,0,,,,,,,,,,, +18726,3955,content://media/external/images/media/3955,/storage/emulated/0/DCIM/Camera/IMG_20200318_181430.jpg,image/jpeg,4000,2250,90,2634074,,1637503942,1584551672000,1584551672007,0,0,0,,,,,,,,,,, +18727,3262,content://media/external/images/media/3262,/storage/emulated/0/DCIM/Camera/IMG_20200318_181412.jpg,image/jpeg,4000,2250,90,5020313,,1637502342,1584551654000,1584551654262,0,0,0,,,,,,,,,,, +18728,4150,content://media/external/images/media/4150,/storage/emulated/0/DCIM/Camera/IMG_20200318_181358.jpg,image/jpeg,4000,2250,90,2597492,,1637504481,1584551640000,1584551640315,0,0,0,,,,,,,,,,, +18729,3103,content://media/external/images/media/3103,/storage/emulated/0/DCIM/Camera/IMG_20200318_181352.jpg,image/jpeg,4000,2250,90,2637519,,1637502054,1584551634000,1584551634797,0,0,0,,,,,,,,,,, +18730,3338,content://media/external/images/media/3338,/storage/emulated/0/DCIM/Camera/IMG_20200315_182059.jpg,image/jpeg,4000,2250,0,4662485,,1637502439,1584292861000,1584292861352,0,0,0,,,,,,,,,,, +18731,5889,content://media/external/images/media/5889,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200307-WA0063.jpg",image/jpeg,768,1024,0,114369,,1637518220,1584291088000,0,0,0,0,,,,,,,,,,, +18732,4843,content://media/external/images/media/4843,/storage/emulated/0/DCIM/Camera/IMG_20200315_110555.jpg,image/jpeg,4000,2250,0,4534974,,1637505753,1584266757000,1584266757260,0,0,0,,,,,,,,,,, +18733,3722,content://media/external/images/media/3722,/storage/emulated/0/DCIM/Camera/IMG_20200314_210935.jpg,image/jpeg,4000,2250,0,4584736,,1637503477,1584216576000,1584216576184,0,0,0,,,,,,,,,,, +18734,2840,content://media/external/images/media/2840,/storage/emulated/0/DCIM/Camera/IMG_20200314_210912.jpg,image/jpeg,4000,2250,0,4840581,,1637501431,1584216553000,1584216553889,0,0,0,,,,,,,,,,, +18735,2824,content://media/external/images/media/2824,/storage/emulated/0/DCIM/Camera/IMG_20200314_210902.jpg,image/jpeg,4000,2250,0,4286702,,1637501369,1584216543000,1584216543605,0,0,0,,,,,,,,,,, +18736,5937,content://media/external/images/media/5937,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190924-WA0009.jpg",image/jpeg,1600,1200,0,228971,,1637518220,1583870715000,0,0,0,0,,,,,,,,,,, +18737,6103,content://media/external/images/media/6103,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0090.jpg",image/jpeg,1280,960,0,141759,,1637518220,1583702492000,0,0,0,0,,,,,,,,,,, +18738,6537,content://media/external/images/media/6537,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0088.jpg",image/jpeg,1201,1600,0,135325,,1637518221,1583697668000,0,0,0,0,,,,,,,,,,, +18739,5892,content://media/external/images/media/5892,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0040.jpg",image/jpeg,1200,1600,0,290604,,1637518220,1583663948000,0,0,0,0,,,,,,,,,,, +18740,6536,content://media/external/images/media/6536,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0039.jpg",image/jpeg,1200,1600,0,384201,,1637518221,1583663947000,0,0,0,0,,,,,,,,,,, +18741,5985,content://media/external/images/media/5985,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0037.jpg",image/jpeg,1200,1600,0,215545,,1637518220,1583663946000,0,0,0,0,,,,,,,,,,, +18742,6535,content://media/external/images/media/6535,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0038.jpg",image/jpeg,1200,1600,0,211844,,1637518221,1583663946000,0,0,0,0,,,,,,,,,,, +18743,6100,content://media/external/images/media/6100,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0036.jpg",image/jpeg,1200,1600,0,264822,,1637518220,1583663945000,0,0,0,0,,,,,,,,,,, +18744,6099,content://media/external/images/media/6099,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0035.jpg",image/jpeg,1600,1200,0,277137,,1637518220,1583663944000,0,0,0,0,,,,,,,,,,, +18745,3467,content://media/external/images/media/3467,/storage/emulated/0/DCIM/Camera/IMG_20200308_112301.jpg,image/jpeg,3419,1322,0,1707478,,1637502817,1583662982000,1583662925105,0,0,0,,,,,,,,,,, +18746,4321,content://media/external/images/media/4321,/storage/emulated/0/DCIM/Camera/IMG_20200308_112202.jpg,image/jpeg,4000,2250,0,4839964,,1637504895,1583662925000,1583662925105,0,0,0,,,,,,,,,,, +18747,4412,content://media/external/images/media/4412,/storage/emulated/0/DCIM/Camera/IMG_20200308_105340.jpg,image/jpeg,4000,2250,0,6154769,,1637505063,1583661221000,1583661221614,0,0,0,,,,,,,,,,, +18748,4320,content://media/external/images/media/4320,/storage/emulated/0/DCIM/Camera/IMG_20200308_105331.jpg,image/jpeg,4160,2340,0,5657459,,1637504894,1583661211000,1583661211704,0,0,0,,,,,,,,,,, +18749,2870,content://media/external/images/media/2870,/storage/emulated/0/DCIM/Camera/PANO_20200308_104747.jpg,image/jpeg,9808,3776,0,10235689,,1637501458,1583660877000,0,0,0,0,,,,,,,,,,, +18750,3887,content://media/external/images/media/3887,/storage/emulated/0/DCIM/Camera/IMG_20200308_104742.jpg,image/jpeg,4160,2340,0,5740160,,1637503732,1583660862000,1583660862440,0,0,0,,,,,,,,,,, +18751,3550,content://media/external/images/media/3550,/storage/emulated/0/DCIM/Camera/IMG_20200308_104720.jpg,image/jpeg,4000,2250,90,5461452,,1637503058,1583660843000,1583660843905,0,0,0,,,,,,,,,,, +18752,6534,content://media/external/images/media/6534,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200307-WA0002.jpg",image/jpeg,768,1024,0,160508,,1637518221,1583567554000,0,0,0,0,,,,,,,,,,, +18753,4307,content://media/external/images/media/4307,/storage/emulated/0/DCIM/Camera/IMG_20200305_223941.jpg,image/jpeg,4000,2250,0,3806563,,1637504817,1583444383000,1583444383460,0,0,0,,,,,,,,,,, +18754,6098,content://media/external/images/media/6098,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200301-WA0007.jpg",image/jpeg,1200,1600,0,129385,,1637518220,1583058739000,0,0,0,0,,,,,,,,,,, +18755,3743,content://media/external/images/media/3743,/storage/emulated/0/DCIM/Camera/IMG_20200229_103703.jpg,image/jpeg,4000,2250,0,4315800,,1637503488,1582969024000,1582969024205,0,0,0,,,,,,,,,,, +18756,4971,content://media/external/images/media/4971,/storage/emulated/0/DCIM/Camera/IMG_20200229_100539.jpg,image/jpeg,4000,2250,180,4276719,,1637506097,1582967141000,1582967141093,0,0,0,,,,,,,,,,, +18757,4035,content://media/external/images/media/4035,/storage/emulated/0/DCIM/Camera/IMG_20200222_211735.jpg,image/jpeg,4000,2250,0,4860476,,1637504234,1582402657000,1582402656950,0,0,0,,,,,,,,,,, +18758,3699,content://media/external/images/media/3699,/storage/emulated/0/DCIM/Camera/IMG_20200217_210909.jpg,image/jpeg,4000,2250,0,4695962,,1637503392,1581970150000,1581970150912,0,0,0,,,,,,,,,,, +18759,4433,content://media/external/images/media/4433,/storage/emulated/0/DCIM/Camera/IMG_20200216_093111.jpg,image/jpeg,4000,2250,0,4719905,,1637505068,1581841872000,1581841872891,0,0,0,,,,,,,,,,, +18760,2801,content://media/external/images/media/2801,/storage/emulated/0/DCIM/Camera/IMG_20200216_093053.jpg,image/jpeg,5184,3880,0,7421209,,1637501311,1581841855000,1581841855885,0,0,0,,,,,,,,,,, +18761,2610,content://media/external/images/media/2610,/storage/emulated/0/DCIM/Facebook/FB_IMG_1581761530510.jpg,image/jpeg,1080,763,0,107977,,1637500870,1581761530000,0,0,0,0,,,,,,,,,,, +18762,2609,content://media/external/images/media/2609,/storage/emulated/0/DCIM/Facebook/FB_IMG_1581761527395.jpg,image/jpeg,1080,763,0,115535,,1637500870,1581761527000,0,0,0,0,,,,,,,,,,, +18763,2702,content://media/external/images/media/2702,/storage/emulated/0/DCIM/Screenshots/IMG_20200209_184433.jpg,image/jpeg,1058,926,0,369519,,1637500987,1581270273000,0,0,0,0,,,,,,,,,,, +18764,2701,content://media/external/images/media/2701,/storage/emulated/0/DCIM/Screenshots/IMG_20200209_184413.jpg,image/jpeg,1048,912,0,264183,,1637500987,1581270253000,0,0,0,0,,,,,,,,,,, +18765,4343,content://media/external/images/media/4343,/storage/emulated/0/DCIM/Camera/IMG_20200208_162012.jpg,image/jpeg,4160,2340,90,5360476,,1637504906,1581175212000,1581175212706,0,0,0,,,,,,,,,,, +18766,3046,content://media/external/images/media/3046,/storage/emulated/0/DCIM/Camera/IMG_20200208_141847.jpg,image/jpeg,4160,2340,90,5328857,,1637501858,1581167927000,1581167927141,0,0,0,,,,,,,,,,, +18767,4134,content://media/external/images/media/4134,/storage/emulated/0/DCIM/Camera/IMG_20200208_135407.jpg,image/jpeg,4000,2250,90,4865590,,1637504473,1581166450000,1581166450238,0,0,0,,,,,,,,,,, +18768,4583,content://media/external/images/media/4583,/storage/emulated/0/DCIM/Camera/IMG_20200208_124405.jpg,image/jpeg,4160,2340,90,4875402,,1637505278,1581162245000,1581162245430,0,0,0,,,,,,,,,,, +18769,5886,content://media/external/images/media/5886,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200208-WA0013.jpg",image/jpeg,1200,1600,0,206904,,1637518220,1581161894000,0,0,0,0,,,,,,,,,,, +18770,5887,content://media/external/images/media/5887,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200208-WA0012.jpg",image/jpeg,1200,1600,0,273417,,1637518220,1581161892000,0,0,0,0,,,,,,,,,,, +18771,5984,content://media/external/images/media/5984,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200208-WA0011.jpg",image/jpeg,1200,1600,0,360018,,1637518220,1581161890000,0,0,0,0,,,,,,,,,,, +18772,6215,content://media/external/images/media/6215,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200208-WA0010.jpg",image/jpeg,1200,1600,0,206335,,1637518221,1581161888000,0,0,0,0,,,,,,,,,,, +18773,5885,content://media/external/images/media/5885,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200208-WA0009.jpg",image/jpeg,1200,1600,0,219289,,1637518220,1581161886000,0,0,0,0,,,,,,,,,,, +18774,6095,content://media/external/images/media/6095,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200208-WA0008.jpg",image/jpeg,1200,1600,0,245975,,1637518220,1581161884000,0,0,0,0,,,,,,,,,,, +18775,4187,content://media/external/images/media/4187,/storage/emulated/0/DCIM/Camera/IMG_20200208_123603.jpg,image/jpeg,4160,2340,90,4529396,,1637504558,1581161763000,1581161763562,0,0,0,,,,,,,,,,, +18776,3599,content://media/external/images/media/3599,/storage/emulated/0/DCIM/Camera/IMG_20200208_122942.jpg,image/jpeg,4160,2340,0,5338015,,1637503238,1581161382000,1581161382702,0,0,0,,,,,,,,,,, +18777,3869,content://media/external/images/media/3869,/storage/emulated/0/DCIM/Camera/IMG_20200208_122939.jpg,image/jpeg,4160,2340,0,5340499,,1637503729,1581161379000,1581161379073,0,0,0,,,,,,,,,,, +18778,4891,content://media/external/images/media/4891,/storage/emulated/0/DCIM/Camera/IMG_20200208_122143.jpg,image/jpeg,4000,2250,90,4403323,,1637505920,1581160905000,1581160905474,0,0,0,,,,,,,,,,, +18779,5883,content://media/external/images/media/5883,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200208-WA0003.jpg",image/jpeg,1200,1600,0,221217,,1637518220,1581160390000,0,0,0,0,,,,,,,,,,, +18780,4712,content://media/external/images/media/4712,/storage/emulated/0/DCIM/Camera/IMG_20200208_120850.jpg,image/jpeg,4000,2250,90,4338128,,1637505565,1581160132000,1581160132647,0,0,0,,,,,,,,,,, +18781,4016,content://media/external/images/media/4016,/storage/emulated/0/DCIM/Camera/IMG_20200208_113307.jpg,image/jpeg,4160,2340,90,4879640,,1637504201,1581157987000,1581157987555,0,0,0,,,,,,,,,,, +18782,2900,content://media/external/images/media/2900,/storage/emulated/0/DCIM/Camera/IMG_20200208_113259.jpg,image/jpeg,4160,2340,0,4528287,,1637501534,1581157979000,1581157979071,0,0,0,,,,,,,,,,, +18783,3489,content://media/external/images/media/3489,/storage/emulated/0/DCIM/Camera/IMG_20200208_111425.jpg,image/jpeg,4000,2250,90,5172865,,1637502870,1581156866000,1581156866358,0,0,0,,,,,,,,,,, +18784,4795,content://media/external/images/media/4795,/storage/emulated/0/DCIM/Camera/IMG_20200208_111424.jpg,image/jpeg,4000,2250,90,5193782,,1637505663,1581156865000,1581156865140,0,0,0,,,,,,,,,,, +18785,2823,content://media/external/images/media/2823,/storage/emulated/0/DCIM/Camera/IMG_20200208_111421.jpg,image/jpeg,4000,2250,0,5004557,,1637501369,1581156862000,1581156862638,0,0,0,,,,,,,,,,, +18786,5018,content://media/external/images/media/5018,/storage/emulated/0/DCIM/Camera/IMG_20200208_110150.jpg,image/jpeg,4160,2340,0,4271156,,1637506134,1581156110000,1581156110115,0,0,0,,,,,,,,,,, +18787,5882,content://media/external/images/media/5882,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200201-WA0006.jpg",image/jpeg,1200,1600,0,216841,,1637518220,1580580890000,0,0,0,0,,,,,,,,,,, +18788,3954,content://media/external/images/media/3954,/storage/emulated/0/DCIM/Camera/IMG_20200131_203415.jpg,image/jpeg,4160,2340,0,3371292,,1637503942,1580499255000,1580499255528,0,0,0,,,,,,,,,,, +18789,3142,content://media/external/images/media/3142,/storage/emulated/0/DCIM/Camera/IMG_20200131_194920.jpg,image/jpeg,5184,3880,180,5327340,,1637502130,1580496563000,1580496563506,0,0,0,,,,,,,,,,, +18790,5981,content://media/external/images/media/5981,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200128-WA0006.jpg",image/jpeg,960,1280,0,147447,,1637518220,1580218548000,0,0,0,0,,,,,,,,,,, +18791,3638,content://media/external/images/media/3638,/storage/emulated/0/DCIM/Camera/IMG_20200127_201803.jpg,image/jpeg,4000,2250,0,4295970,,1637503301,1580152685000,1580152685633,0,0,0,,,,,,,,,,, +18792,3868,content://media/external/images/media/3868,/storage/emulated/0/DCIM/Camera/IMG_20200118_144853.jpg,image/jpeg,4000,2250,90,4189569,,1637503729,1579355336000,1579355336023,0,0,0,,,,,,,,,,, +18793,3184,content://media/external/images/media/3184,/storage/emulated/0/DCIM/Camera/IMG_20200118_124250.jpg,image/jpeg,4000,2250,0,4195863,,1637502161,1579347771000,1579347771280,0,0,0,,,,,,,,,,, +18794,3065,content://media/external/images/media/3065,/storage/emulated/0/DCIM/Camera/IMG_20200118_124144.jpg,image/jpeg,4000,2250,0,4459870,,1637501905,1579347705000,1579347705335,0,0,0,,,,,,,,,,, +18795,3920,content://media/external/images/media/3920,/storage/emulated/0/DCIM/Camera/IMG_20200118_124122.jpg,image/jpeg,4000,2250,0,4628620,,1637503834,1579347683000,1579347683285,0,0,0,,,,,,,,,,, +18796,3045,content://media/external/images/media/3045,/storage/emulated/0/DCIM/Camera/IMG_20200118_124042.jpg,image/jpeg,4000,2250,0,5103933,,1637501858,1579347644000,1579347644559,0,0,0,,,,,,,,,,, +18797,6094,content://media/external/images/media/6094,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200112-WA0006.jpg",image/jpeg,1600,1200,0,125032,,1637518220,1578821888000,0,0,0,0,,,,,,,,,,, +18798,5978,content://media/external/images/media/5978,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200112-WA0005.jpg",image/jpeg,1600,1202,0,136548,,1637518220,1578821887000,0,0,0,0,,,,,,,,,,, +18799,5980,content://media/external/images/media/5980,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200112-WA0004.jpg",image/jpeg,1600,1202,0,177285,,1637518220,1578821885000,0,0,0,0,,,,,,,,,,, +18800,6092,content://media/external/images/media/6092,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200112-WA0003.jpg",image/jpeg,1600,1200,0,155353,,1637518220,1578821882000,0,0,0,0,,,,,,,,,,, +18801,6209,content://media/external/images/media/6209,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200106-WA0040.jpg",image/jpeg,1600,1200,0,193192,,1637518221,1578341724000,0,0,0,0,,,,,,,,,,, +18802,4015,content://media/external/images/media/4015,/storage/emulated/0/DCIM/Camera/IMG_20200106_211118.jpg,image/jpeg,4000,2250,90,3456598,,1637504201,1578341480000,1578341480183,0,0,0,,,,,,,,,,, +18803,3397,content://media/external/images/media/3397,/storage/emulated/0/DCIM/Camera/IMG_20200105_201155.jpg,image/jpeg,4000,2250,90,3523439,,1637502598,1578251517000,1578251517563,0,0,0,,,,,,,,,,, +18804,4201,content://media/external/images/media/4201,/storage/emulated/0/DCIM/Camera/IMG_20200104_100538.jpg,image/jpeg,4000,2250,0,7179346,,1637504640,1578128739000,1578128739737,0,0,0,,,,,,,,,,, +18805,3762,content://media/external/images/media/3762,/storage/emulated/0/DCIM/Camera/IMG_20200104_100508.jpg,image/jpeg,4000,2250,90,6672112,,1637503508,1578128709000,1578128709401,0,0,0,,,,,,,,,,, +18806,2778,content://media/external/images/media/2778,/storage/emulated/0/DCIM/Camera/IMG_20200104_100440.jpg,image/jpeg,4160,2340,90,6053410,,1637501282,1578128680000,1578128680484,0,0,0,,,,,,,,,,, +18807,4280,content://media/external/images/media/4280,/storage/emulated/0/DCIM/Camera/IMG_20200104_100357.jpg,image/jpeg,4160,2340,0,8111907,,1637504807,1578128637000,1578128637566,0,0,0,,,,,,,,,,, +18808,4522,content://media/external/images/media/4522,/storage/emulated/0/DCIM/Camera/IMG_20200104_100305.jpg,image/jpeg,4160,2340,0,6717042,,1637505165,1578128585000,1578128585485,0,0,0,,,,,,,,,,, +18809,3919,content://media/external/images/media/3919,/storage/emulated/0/DCIM/Camera/IMG_20200104_100115.jpg,image/jpeg,4160,2340,0,6314736,,1637503834,1578128475000,1578128475580,0,0,0,,,,,,,,,,, +18810,4133,content://media/external/images/media/4133,/storage/emulated/0/DCIM/Camera/IMG_20200104_095935.jpg,image/jpeg,4160,2340,0,4695918,,1637504473,1578128375000,1578128374905,0,0,0,,,,,,,,,,, +18811,3918,content://media/external/images/media/3918,/storage/emulated/0/DCIM/Camera/IMG_20200104_092244.jpg,image/jpeg,4000,2250,90,4837094,,1637503834,1578126166000,1578126165923,0,0,0,,,,,,,,,,, +18812,4675,content://media/external/images/media/4675,/storage/emulated/0/DCIM/Camera/IMG_20200104_091742.jpg,image/jpeg,4160,2340,0,3042839,,1637505480,1578125862000,1578125862085,0,0,0,,,,,,,,,,, +18813,4306,content://media/external/images/media/4306,/storage/emulated/0/DCIM/Camera/IMG_20200104_091728.jpg,image/jpeg,4000,2250,90,4248896,,1637504817,1578125851000,1578125851153,0,0,0,,,,,,,,,,, +18814,3488,content://media/external/images/media/3488,/storage/emulated/0/DCIM/Camera/IMG_20200103_204329.jpg,image/jpeg,4000,2250,0,4499214,,1637502870,1578080610000,1578080610584,0,0,0,,,,,,,,,,, +18815,3698,content://media/external/images/media/3698,/storage/emulated/0/DCIM/Camera/IMG_20200103_194548.jpg,image/jpeg,4000,2250,0,5096837,,1637503392,1578077150000,1578077150496,0,0,0,,,,,,,,,,, +18816,3559,content://media/external/images/media/3559,/storage/emulated/0/DCIM/Camera/PANO_20200103_185511.jpg,image/jpeg,6928,3616,0,5696149,,1637503058,1578074121000,0,0,0,0,,,,,,,,,,, +18817,5979,content://media/external/images/media/5979,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200101-WA0034.jpg",image/jpeg,1200,1600,0,167683,,1637518220,1577893587000,0,0,0,0,,,,,,,,,,, +18818,3301,content://media/external/images/media/3301,/storage/emulated/0/DCIM/Camera/IMG_20191231_233621.jpg,image/jpeg,4000,2250,90,3099299,,1637502430,1577831784000,1577831783991,0,0,0,,,,,,,,,,, +18819,3509,content://media/external/images/media/3509,/storage/emulated/0/DCIM/Camera/IMG_20191231_231940.jpg,image/jpeg,4000,2250,90,4518974,,1637502969,1577830781000,1577830781088,0,0,0,,,,,,,,,,, +18820,4924,content://media/external/images/media/4924,/storage/emulated/0/DCIM/Camera/IMG_20191231_225715.jpg,image/jpeg,4000,2250,90,4075836,,1637506010,1577829436000,1577829436213,0,0,0,,,,,,,,,,, +18821,4373,content://media/external/images/media/4373,/storage/emulated/0/DCIM/Camera/IMG_20191231_225704.jpg,image/jpeg,4000,2250,90,4704791,,1637504982,1577829425000,1577829425407,0,0,0,,,,,,,,,,, +18822,3531,content://media/external/images/media/3531,/storage/emulated/0/DCIM/Camera/IMG_20191231_225630.jpg,image/jpeg,4000,2250,0,4340561,,1637503010,1577829392000,1577829392022,0,0,0,,,,,,,,,,, +18823,5880,content://media/external/images/media/5880,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191231-WA0037.jpg",image/jpeg,900,1600,0,93045,,1637518220,1577826923000,0,0,0,0,,,,,,,,,,, +18824,4034,content://media/external/images/media/4034,/storage/emulated/0/DCIM/Camera/IMG_20191231_221241.jpg,image/jpeg,4000,2250,90,4687612,,1637504234,1577826763000,1577826763050,0,0,0,,,,,,,,,,, +18825,3576,content://media/external/images/media/3576,/storage/emulated/0/DCIM/Camera/IMG_20191231_221221.jpg,image/jpeg,4000,2250,90,4598844,,1637503154,1577826743000,1577826743071,0,0,0,,,,,,,,,,, +18826,4503,content://media/external/images/media/4503,/storage/emulated/0/DCIM/Camera/IMG_20191231_220050.jpg,image/jpeg,4000,2250,90,4183079,,1637505160,1577826051000,1577826051631,0,0,0,,,,,,,,,,, +18827,3300,content://media/external/images/media/3300,/storage/emulated/0/DCIM/Camera/IMG_20191230_212157.jpg,image/jpeg,4000,2250,0,5191818,,1637502430,1577737319000,1577737318955,0,0,0,,,,,,,,,,, +18828,4502,content://media/external/images/media/4502,/storage/emulated/0/DCIM/Camera/IMG_20191230_165559.jpg,image/jpeg,4000,2250,0,6173529,,1637505160,1577721361000,1577721361095,0,0,0,,,,,,,,,,, +18829,4582,content://media/external/images/media/4582,/storage/emulated/0/DCIM/Camera/IMG_20191230_165526.jpg,image/jpeg,4000,2250,90,5788193,,1637505278,1577721327000,1577721327059,0,0,0,,,,,,,,,,, +18830,3680,content://media/external/images/media/3680,/storage/emulated/0/DCIM/Camera/IMG_20191230_165518.jpg,image/jpeg,4000,2250,90,5702321,,1637503389,1577721320000,1577721320091,0,0,0,,,,,,,,,,, +18831,2943,content://media/external/images/media/2943,/storage/emulated/0/DCIM/Camera/IMG_20191230_112019_BURST1.jpg,image/jpeg,4000,2250,90,2021700,,1637501660,1577701218000,1577701218830,0,0,0,,,,,,,,,,, +18832,3029,content://media/external/images/media/3029,/storage/emulated/0/DCIM/Camera/IMG_20191230_111708.jpg,image/jpeg,4000,2250,0,5221561,,1637501805,1577701029000,1577701029665,0,0,0,,,,,,,,,,, +18833,4860,content://media/external/images/media/4860,/storage/emulated/0/DCIM/Camera/IMG_20191230_111705.jpg,image/jpeg,4000,2250,0,3700536,,1637505831,1577701026000,1577701026533,0,0,0,,,,,,,,,,, +18834,4947,content://media/external/images/media/4947,/storage/emulated/0/DCIM/Camera/IMG_20191230_111627.jpg,image/jpeg,4000,2250,0,4352269,,1637506015,1577700988000,1577700988416,0,0,0,,,,,,,,,,, +18835,3284,content://media/external/images/media/3284,/storage/emulated/0/DCIM/Camera/IMG_20191230_111611.jpg,image/jpeg,4000,2250,0,7142500,,1637502355,1577700972000,1577700972868,0,0,0,,,,,,,,,,, +18836,3396,content://media/external/images/media/3396,/storage/emulated/0/DCIM/Camera/IMG_20191229_144800.jpg,image/jpeg,4000,2250,180,4739194,,1637502598,1577627281000,1577627281896,0,0,0,,,,,,,,,,, +18837,3241,content://media/external/images/media/3241,/storage/emulated/0/DCIM/Camera/IMG_20191229_142510.jpg,image/jpeg,4000,2250,90,4520324,,1637502259,1577625911000,1577625911708,0,0,0,,,,,,,,,,, +18838,3140,content://media/external/images/media/3140,/storage/emulated/0/DCIM/Camera/IMG_20191229_142341.jpg,image/jpeg,4000,2250,90,4983754,,1637502130,1577625823000,1577625823241,0,0,0,,,,,,,,,,, +18839,3028,content://media/external/images/media/3028,/storage/emulated/0/DCIM/Camera/IMG_20191229_141922.jpg,image/jpeg,4000,2250,0,4827852,,1637501805,1577625564000,1577625563953,0,0,0,,,,,,,,,,, +18840,2923,content://media/external/images/media/2923,/storage/emulated/0/DCIM/Camera/IMG_20191229_141916.jpg,image/jpeg,4000,2250,90,4711161,,1637501599,1577625558000,1577625558276,0,0,0,,,,,,,,,,, +18841,6089,content://media/external/images/media/6089,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191227-WA0005.jpg",image/jpeg,1600,1200,0,259467,,1637518220,1577477908000,0,0,0,0,,,,,,,,,,, +18842,5879,content://media/external/images/media/5879,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191225-WA0049.jpg",image/jpeg,868,1156,0,53354,,1637518220,1577284981000,0,0,0,0,,,,,,,,,,, +18843,4014,content://media/external/images/media/4014,/storage/emulated/0/DCIM/Camera/IMG_20191225_132409.jpg,image/jpeg,8016,3712,0,10447404,,1637504201,1577276650000,0,0,0,0,,,,,,,,,,, +18844,4186,content://media/external/images/media/4186,/storage/emulated/0/DCIM/Camera/IMG_20191225_132320.jpg,image/jpeg,8016,3712,0,8649763,,1637504558,1577276604000,0,0,0,0,,,,,,,,,,, +18845,3256,content://media/external/images/media/3256,/storage/emulated/0/DCIM/Camera/PANO_20191224_152141.jpg,image/jpeg,8016,3712,0,7535561,,1637502259,1577197309000,0,0,0,0,,,,,,,,,,, +18846,6206,content://media/external/images/media/6206,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191222-WA0010.jpg",image/jpeg,1512,2016,0,266673,,1637518221,1577029963000,0,0,0,0,,,,,,,,,,, +18847,5976,content://media/external/images/media/5976,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191222-WA0009.jpg",image/jpeg,2048,1536,0,190899,,1637518220,1577029939000,0,0,0,0,,,,,,,,,,, +18848,3006,content://media/external/images/media/3006,/storage/emulated/0/DCIM/Camera/IMG_20191221_164254.jpg,image/jpeg,2148,1099,0,499917,,1637501786,1576942975000,1576942917959,0,0,0,,,,,,,,,,, +18849,4752,content://media/external/images/media/4752,/storage/emulated/0/DCIM/Camera/IMG_20191221_164216.jpg,image/jpeg,2470,1379,0,690340,,1637505639,1576942937000,1576942917959,0,0,0,,,,,,,,,,, +18850,3867,content://media/external/images/media/3867,/storage/emulated/0/DCIM/Camera/IMG_20191221_164102.jpg,image/jpeg,1365,871,0,277471,,1637503729,1576942863000,1576942798129,0,0,0,,,,,,,,,,, +18851,2942,content://media/external/images/media/2942,/storage/emulated/0/DCIM/Camera/IMG_20191214_212249.jpg,image/jpeg,4160,2340,90,4357967,,1637501660,1576354969000,1576354969015,0,0,0,,,,,,,,,,, +18852,4391,content://media/external/images/media/4391,/storage/emulated/0/DCIM/Camera/IMG_20191214_195454.jpg,image/jpeg,4160,2340,0,4297747,,1637505004,1576349694000,1576349694706,0,0,0,,,,,,,,,,, +18853,4222,content://media/external/images/media/4222,/storage/emulated/0/DCIM/Camera/IMG_20191214_195438.jpg,image/jpeg,4160,2340,0,3280944,,1637504726,1576349678000,1576349678616,0,0,0,,,,,,,,,,, +18854,4482,content://media/external/images/media/4482,/storage/emulated/0/DCIM/Camera/IMG_20191214_194254.jpg,image/jpeg,4160,2340,90,3262814,,1637505122,1576348974000,1576348974716,0,0,0,,,,,,,,,,, +18855,4970,content://media/external/images/media/4970,/storage/emulated/0/DCIM/Camera/IMG_20191214_194227.jpg,image/jpeg,4160,2340,90,3689335,,1637506097,1576348947000,1576348946983,0,0,0,,,,,,,,,,, +18856,4013,content://media/external/images/media/4013,/storage/emulated/0/DCIM/Camera/IMG_20191214_194146.jpg,image/jpeg,4160,2340,90,3840873,,1637504201,1576348906000,1576348906093,0,0,0,,,,,,,,,,, +18857,4245,content://media/external/images/media/4245,/storage/emulated/0/DCIM/Camera/IMG_20191214_194113.jpg,image/jpeg,4160,2340,90,3446212,,1637504734,1576348873000,1576348873272,0,0,0,,,,,,,,,,, +18858,3761,content://media/external/images/media/3761,/storage/emulated/0/DCIM/Camera/IMG_20191214_194046.jpg,image/jpeg,4160,2340,90,3221482,,1637503508,1576348846000,1576348846653,0,0,0,,,,,,,,,,, +18859,3203,content://media/external/images/media/3203,/storage/emulated/0/DCIM/Camera/IMG_20191214_185313.jpg,image/jpeg,4160,2340,0,3898145,,1637502256,1576345993000,1576345993409,0,0,0,,,,,,,,,,, +18860,4890,content://media/external/images/media/4890,/storage/emulated/0/DCIM/Camera/IMG_20191214_174319.jpg,image/jpeg,4000,2250,0,5357628,,1637505920,1576341800000,1576341800523,0,0,0,,,,,,,,,,, +18861,2899,content://media/external/images/media/2899,/storage/emulated/0/DCIM/Camera/IMG_20191214_174310.jpg,image/jpeg,4000,2250,0,4772196,,1637501534,1576341792000,1576341792016,0,0,0,,,,,,,,,,, +18862,4319,content://media/external/images/media/4319,/storage/emulated/0/DCIM/Camera/IMG_20191214_174249.jpg,image/jpeg,4000,2250,90,5000492,,1637504894,1576341770000,1576341770398,0,0,0,,,,,,,,,,, +18863,3196,content://media/external/images/media/3196,/storage/emulated/0/DCIM/Camera/PANO_20191214_174001.jpg,image/jpeg,11056,3712,0,7877572,,1637502161,1576341611000,0,0,0,0,,,,,,,,,,, +18864,3375,content://media/external/images/media/3375,/storage/emulated/0/DCIM/Camera/IMG_20191214_171916.jpg,image/jpeg,4000,2250,0,5343154,,1637502523,1576340357000,1576340357251,0,0,0,,,,,,,,,,, +18865,4260,content://media/external/images/media/4260,/storage/emulated/0/DCIM/Camera/IMG_20191214_170601.jpg,image/jpeg,4000,2250,0,4937318,,1637504756,1576339562000,1576339562671,0,0,0,,,,,,,,,,, +18866,3487,content://media/external/images/media/3487,/storage/emulated/0/DCIM/Camera/IMG_20191214_170411.jpg,image/jpeg,4160,2340,0,3769518,,1637502870,1576339451000,1576339451433,0,0,0,,,,,,,,,,, +18867,4244,content://media/external/images/media/4244,/storage/emulated/0/DCIM/Camera/IMG_20191214_170322.jpg,image/jpeg,4160,2340,0,4236495,,1637504734,1576339402000,1576339402301,0,0,0,,,,,,,,,,, +18868,3169,content://media/external/images/media/3169,/storage/emulated/0/DCIM/Camera/IMG_20191214_152514.jpg,image/jpeg,720,1280,0,194459,,1637502143,1576333514000,0,0,0,0,,,,,,,,,,, +18869,4243,content://media/external/images/media/4243,/storage/emulated/0/DCIM/Camera/IMG_20191214_152503.jpg,image/jpeg,4000,2250,0,5340646,,1637504734,1576333504000,1576333504873,0,0,0,,,,,,,,,,, +18870,3261,content://media/external/images/media/3261,/storage/emulated/0/DCIM/Camera/IMG_20191214_151914.jpg,image/jpeg,4000,2250,90,5701578,,1637502342,1576333156000,1576333156332,0,0,0,,,,,,,,,,, +18871,3139,content://media/external/images/media/3139,/storage/emulated/0/DCIM/Camera/IMG_20191212_191827.jpg,image/jpeg,4000,2250,0,4924431,,1637502130,1576174709000,1576174708988,0,0,0,,,,,,,,,,, +18872,4411,content://media/external/images/media/4411,/storage/emulated/0/DCIM/Camera/IMG_20191207_132312.jpg,image/jpeg,4000,2250,0,4576615,,1637505063,1575721393000,1575721393757,0,0,0,,,,,,,,,,, +18873,3395,content://media/external/images/media/3395,/storage/emulated/0/DCIM/Camera/IMG_20191207_132148.jpg,image/jpeg,4000,2250,0,4534406,,1637502598,1575721309000,1575721309888,0,0,0,,,,,,,,,,, +18874,4012,content://media/external/images/media/4012,/storage/emulated/0/DCIM/Camera/IMG_20191207_132143.jpg,image/jpeg,4000,2250,0,4988528,,1637504201,1575721305000,1575721305750,0,0,0,,,,,,,,,,, +18875,3283,content://media/external/images/media/3283,/storage/emulated/0/DCIM/Camera/IMG_20191205_133247.jpg,image/jpeg,4000,2250,90,4112692,,1637502355,1575549169000,1575549169748,0,0,0,,,,,,,,,,, +18876,5975,content://media/external/images/media/5975,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0029.jpg",image/jpeg,1600,1200,0,187552,,1637518220,1575503262000,0,0,0,0,,,,,,,,,,, +18877,5973,content://media/external/images/media/5973,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0028.jpg",image/jpeg,1600,1200,0,198519,,1637518220,1575503260000,0,0,0,0,,,,,,,,,,, +18878,5972,content://media/external/images/media/5972,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0027.jpg",image/jpeg,1600,1200,0,245640,,1637518220,1575503257000,0,0,0,0,,,,,,,,,,, +18879,5970,content://media/external/images/media/5970,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0026.jpg",image/jpeg,1600,1200,0,174334,,1637518220,1575503254000,0,0,0,0,,,,,,,,,,, +18880,6204,content://media/external/images/media/6204,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0025.jpg",image/jpeg,1600,1200,0,177966,,1637518221,1575503246000,0,0,0,0,,,,,,,,,,, +18881,5875,content://media/external/images/media/5875,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0024.jpg",image/jpeg,1600,1200,0,229313,,1637518220,1575503244000,0,0,0,0,,,,,,,,,,, +18882,5971,content://media/external/images/media/5971,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0023.jpg",image/jpeg,1600,1200,0,208433,,1637518220,1575503242000,0,0,0,0,,,,,,,,,,, +18883,6085,content://media/external/images/media/6085,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0022.jpg",image/jpeg,1600,1200,0,247479,,1637518220,1575503240000,0,0,0,0,,,,,,,,,,, +18884,6202,content://media/external/images/media/6202,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0021.jpg",image/jpeg,1200,1600,0,229484,,1637518221,1575503238000,0,0,0,0,,,,,,,,,,, +18885,6081,content://media/external/images/media/6081,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0020.jpg",image/jpeg,1600,1200,0,213381,,1637518220,1575503191000,0,0,0,0,,,,,,,,,,, +18886,6201,content://media/external/images/media/6201,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0019.jpg",image/jpeg,1600,1200,0,161761,,1637518221,1575503189000,0,0,0,0,,,,,,,,,,, +18887,5964,content://media/external/images/media/5964,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0018.jpg",image/jpeg,1600,1200,0,184995,,1637518220,1575503155000,0,0,0,0,,,,,,,,,,, +18888,6080,content://media/external/images/media/6080,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0017.jpg",image/jpeg,1600,1200,0,177629,,1637518220,1575503134000,0,0,0,0,,,,,,,,,,, +18889,6198,content://media/external/images/media/6198,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0016.jpg",image/jpeg,1600,1200,0,205372,,1637518221,1575503132000,0,0,0,0,,,,,,,,,,, +18890,6197,content://media/external/images/media/6197,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0015.jpg",image/jpeg,1600,1202,0,169390,,1637518221,1575503118000,0,0,0,0,,,,,,,,,,, +18891,6196,content://media/external/images/media/6196,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0014.jpg",image/jpeg,1600,1200,0,180999,,1637518221,1575503116000,0,0,0,0,,,,,,,,,,, +18892,5870,content://media/external/images/media/5870,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0013.jpg",image/jpeg,1600,1200,0,161813,,1637518220,1575503115000,0,0,0,0,,,,,,,,,,, +18893,5966,content://media/external/images/media/5966,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0012.jpg",image/jpeg,1200,1600,0,202388,,1637518220,1575503113000,0,0,0,0,,,,,,,,,,, +18894,5963,content://media/external/images/media/5963,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0011.jpg",image/jpeg,1600,1202,0,216768,,1637518220,1575503112000,0,0,0,0,,,,,,,,,,, +18895,6195,content://media/external/images/media/6195,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0010.jpg",image/jpeg,1600,1200,0,220659,,1637518221,1575503110000,0,0,0,0,,,,,,,,,,, +18896,6077,content://media/external/images/media/6077,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0009.jpg",image/jpeg,1200,1600,0,168715,,1637518220,1575503109000,0,0,0,0,,,,,,,,,,, +18897,5960,content://media/external/images/media/5960,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0008.jpg",image/jpeg,1600,1200,0,172813,,1637518220,1575503107000,0,0,0,0,,,,,,,,,,, +18898,5873,content://media/external/images/media/5873,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0007.jpg",image/jpeg,1600,1200,0,226726,,1637518220,1575503105000,0,0,0,0,,,,,,,,,,, +18899,5872,content://media/external/images/media/5872,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0006.jpg",image/jpeg,1600,1202,0,181848,,1637518220,1575503104000,0,0,0,0,,,,,,,,,,, +18900,6192,content://media/external/images/media/6192,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0005.jpg",image/jpeg,1600,1200,0,221443,,1637518221,1575503102000,0,0,0,0,,,,,,,,,,, +18901,6074,content://media/external/images/media/6074,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0004.jpg",image/jpeg,1600,1200,0,179315,,1637518220,1575503101000,0,0,0,0,,,,,,,,,,, +18902,5956,content://media/external/images/media/5956,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0003.jpg",image/jpeg,1600,1200,0,191552,,1637518220,1575503099000,0,0,0,0,,,,,,,,,,, +18903,6072,content://media/external/images/media/6072,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0002.jpg",image/jpeg,1600,1200,0,196562,,1637518220,1575503097000,0,0,0,0,,,,,,,,,,, +18904,6193,content://media/external/images/media/6193,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0001.jpg",image/jpeg,1600,1200,0,196201,,1637518221,1575503096000,0,0,0,0,,,,,,,,,,, +18905,4451,content://media/external/images/media/4451,/storage/emulated/0/DCIM/Camera/IMG_20191201_172305.jpg,image/jpeg,4160,2340,90,4796393,,1637505068,1575217385000,1575217385742,0,0,0,,,,,,,,,,, +18906,4342,content://media/external/images/media/4342,/storage/emulated/0/DCIM/Camera/IMG_20191201_172213.jpg,image/jpeg,4160,2340,0,4483333,,1637504906,1575217333000,1575217333189,0,0,0,,,,,,,,,,, +18907,3374,content://media/external/images/media/3374,/storage/emulated/0/DCIM/Camera/IMG_20191201_110824.jpg,image/jpeg,4000,2250,0,4674995,,1637502523,1575194906000,1575194906303,0,0,0,,,,,,,,,,, +18908,6190,content://media/external/images/media/6190,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191130-WA0006.jpg",image/jpeg,1599,1200,0,157799,,1637518221,1575123776000,0,0,0,0,,,,,,,,,,, +18909,6189,content://media/external/images/media/6189,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191130-WA0004.jpg",image/jpeg,960,1280,0,110231,,1637518221,1575119894000,0,0,0,0,,,,,,,,,,, +18910,3637,content://media/external/images/media/3637,/storage/emulated/0/DCIM/Camera/IMG_20191130_131524.jpg,image/jpeg,4000,2250,90,2859525,,1637503301,1575116126000,1575116126158,0,0,0,,,,,,,,,,, +18911,4629,content://media/external/images/media/4629,/storage/emulated/0/DCIM/Camera/IMG_20191130_131458.jpg,image/jpeg,4000,2250,90,2693294,,1637505390,1575116100000,1575116100874,0,0,0,,,,,,,,,,, +18912,4994,content://media/external/images/media/4994,/storage/emulated/0/DCIM/Camera/IMG_20191130_131420.jpg,image/jpeg,4000,2250,90,3155058,,1637506101,1575116065000,1575116065536,0,0,0,,,,,,,,,,, +18913,6071,content://media/external/images/media/6071,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191127-WA0000.jpg",image/jpeg,750,1334,0,114439,,1637518220,1574841063000,0,0,0,0,,,,,,,,,,, +18914,3526,content://media/external/images/media/3526,/storage/emulated/0/DCIM/Camera/PANO_20191125_222540.jpg,image/jpeg,3442,6398,0,2862682,,1637502970,1574717219000,1574717219000,0,0,0,,,,,,,,,,, +18915,5507,content://media/external/images/media/5507,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191124-WA0001.jpg",image/jpeg,1200,1600,0,264144,,1637518219,1574585731000,0,0,0,0,,,,,,,,,,, +18916,6069,content://media/external/images/media/6069,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191123-WA0016.jpg",image/jpeg,1500,2000,0,192937,,1637518220,1574542769000,0,0,0,0,,,,,,,,,,, +18917,6068,content://media/external/images/media/6068,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191123-WA0012.jpg",image/jpeg,1280,960,0,128728,,1637518220,1574535173000,0,0,0,0,,,,,,,,,,, +18918,4132,content://media/external/images/media/4132,/storage/emulated/0/DCIM/Camera/IMG_20191123_155733.jpg,image/jpeg,4000,2250,90,4973934,,1637504473,1574521055000,1574521055079,0,0,0,,,,,,,,,,, +18919,5867,content://media/external/images/media/5867,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191120-WA0020.jpg",image/jpeg,1156,868,0,105598,,1637518220,1574277422000,0,0,0,0,,,,,,,,,,, +18920,5866,content://media/external/images/media/5866,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191116-WA0019.jpg",image/jpeg,960,1280,0,130157,,1637518220,1573925081000,0,0,0,0,,,,,,,,,,, +18921,4114,content://media/external/images/media/4114,/storage/emulated/0/DCIM/Camera/IMG_20191116_153602.jpg,image/jpeg,3494,1465,0,1444449,,1637504451,1573914962000,1573914935855,0,0,0,,,,,,,,,,, +18922,4842,content://media/external/images/media/4842,/storage/emulated/0/DCIM/Camera/IMG_20191116_153432.jpg,image/jpeg,4160,2340,90,4345319,,1637505753,1573914872000,1573914872310,0,0,0,,,,,,,,,,, +18923,4731,content://media/external/images/media/4731,/storage/emulated/0/DCIM/Camera/IMG_20191116_125844.jpg,image/jpeg,4000,2250,0,5325475,,1637505574,1573905527000,1573905526963,0,0,0,,,,,,,,,,, +18924,3785,content://media/external/images/media/3785,/storage/emulated/0/DCIM/Camera/IMG_20191116_125512.jpg,image/jpeg,4000,2250,90,3196138,,1637503558,1573905314000,1573905314564,0,0,0,,,,,,,,,,, +18925,4603,content://media/external/images/media/4603,/storage/emulated/0/DCIM/Camera/IMG_20191116_125507.jpg,image/jpeg,4000,2250,90,4474185,,1637505308,1573905308000,1573905308510,0,0,0,,,,,,,,,,, +18926,4501,content://media/external/images/media/4501,/storage/emulated/0/DCIM/Camera/IMG_20191114_214645.jpg,image/jpeg,4000,2250,0,4696235,,1637505160,1573764406000,1573764406761,0,0,0,,,,,,,,,,, +18927,5953,content://media/external/images/media/5953,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191112-WA0012.jpg",image/jpeg,720,720,0,75990,,1637518220,1573755850000,0,0,0,0,,,,,,,,,,, +18928,3804,content://media/external/images/media/3804,/storage/emulated/0/DCIM/Camera/IMG_20191110_124356.jpg,image/jpeg,4000,2250,90,4321429,,1637503601,1573386240000,1573386240896,0,0,0,,,,,,,,,,, +18929,3940,content://media/external/images/media/3940,/storage/emulated/0/DCIM/Camera/IMG_20191110_124345.jpg,image/jpeg,4000,2250,0,4487304,,1637503853,1573386227000,1573386227348,0,0,0,,,,,,,,,,, +18930,3742,content://media/external/images/media/3742,/storage/emulated/0/DCIM/Camera/IMG_20191110_124338.jpg,image/jpeg,4160,2340,0,3411877,,1637503488,1573386218000,1573386218659,0,0,0,,,,,,,,,,, +18931,3721,content://media/external/images/media/3721,/storage/emulated/0/DCIM/Camera/IMG_20191109_230155.jpg,image/jpeg,4160,2340,0,4350180,,1637503477,1573336915000,1573336915232,0,0,0,,,,,,,,,,, +18932,4660,content://media/external/images/media/4660,/storage/emulated/0/DCIM/Camera/IMG_20191109_230024.jpg,image/jpeg,4160,2340,0,4262188,,1637505417,1573336824000,1573336824652,0,0,0,,,,,,,,,,, +18933,4602,content://media/external/images/media/4602,/storage/emulated/0/DCIM/Camera/IMG_20191109_230005.jpg,image/jpeg,4000,2250,90,2764122,,1637505308,1573336807000,1573336807214,0,0,0,,,,,,,,,,, +18934,4200,content://media/external/images/media/4200,/storage/emulated/0/DCIM/Camera/IMG_20191106_195611.jpg,image/jpeg,1649,466,0,261437,,1637504640,1573066572000,1573066505386,0,0,0,,,,,,,,,,, +18935,2964,content://media/external/images/media/2964,/storage/emulated/0/DCIM/Camera/IMG_20191106_194345.jpg,image/jpeg,4000,2250,0,4978873,,1637501684,1573065827000,1573065827090,0,0,0,,,,,,,,,,, +18936,4642,content://media/external/images/media/4642,/storage/emulated/0/DCIM/Camera/IMG_20191105_193351.jpg,image/jpeg,4000,3000,0,6503519,,1637505414,1572978833000,1572978832843,0,0,0,,,,,,,,,,, +18937,5952,content://media/external/images/media/5952,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0025.jpg",image/jpeg,1600,900,0,115552,,1637518220,1572874014000,0,0,0,0,,,,,,,,,,, +18938,6067,content://media/external/images/media/6067,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0024.jpg",image/jpeg,900,1600,0,161701,,1637518220,1572874014000,0,0,0,0,,,,,,,,,,, +18939,6066,content://media/external/images/media/6066,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0023.jpg",image/jpeg,900,1600,0,210673,,1637518220,1572874012000,0,0,0,0,,,,,,,,,,, +18940,6064,content://media/external/images/media/6064,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0020.jpg",image/jpeg,1600,900,0,83111,,1637518220,1572874011000,0,0,0,0,,,,,,,,,,, +18941,6065,content://media/external/images/media/6065,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0022.jpg",image/jpeg,1600,900,0,100034,,1637518220,1572874011000,0,0,0,0,,,,,,,,,,, +18942,6188,content://media/external/images/media/6188,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0021.jpg",image/jpeg,1600,900,0,110780,,1637518221,1572874011000,0,0,0,0,,,,,,,,,,, +18943,5951,content://media/external/images/media/5951,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0018.jpg",image/jpeg,1600,900,0,180667,,1637518220,1572874010000,0,0,0,0,,,,,,,,,,, +18944,6063,content://media/external/images/media/6063,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0019.jpg",image/jpeg,1600,900,0,78306,,1637518220,1572874010000,0,0,0,0,,,,,,,,,,, +18945,5949,content://media/external/images/media/5949,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0016.jpg",image/jpeg,900,1600,0,198604,,1637518220,1572874000000,0,0,0,0,,,,,,,,,,, +18946,5950,content://media/external/images/media/5950,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0017.jpg",image/jpeg,1600,900,0,122904,,1637518220,1572874000000,0,0,0,0,,,,,,,,,,, +18947,5865,content://media/external/images/media/5865,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0013.jpg",image/jpeg,1600,900,0,139612,,1637518220,1572873994000,0,0,0,0,,,,,,,,,,, +18948,6062,content://media/external/images/media/6062,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0015.jpg",image/jpeg,1600,900,0,173046,,1637518220,1572873994000,0,0,0,0,,,,,,,,,,, +18949,6187,content://media/external/images/media/6187,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0014.jpg",image/jpeg,1600,900,0,260508,,1637518221,1572873994000,0,0,0,0,,,,,,,,,,, +18950,5864,content://media/external/images/media/5864,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0008.jpg",image/jpeg,900,1600,0,258285,,1637518220,1572873993000,0,0,0,0,,,,,,,,,,, +18951,5948,content://media/external/images/media/5948,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0010.jpg",image/jpeg,1600,900,0,156254,,1637518220,1572873993000,0,0,0,0,,,,,,,,,,, +18952,6060,content://media/external/images/media/6060,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0009.jpg",image/jpeg,1600,900,0,144970,,1637518220,1572873993000,0,0,0,0,,,,,,,,,,, +18953,6061,content://media/external/images/media/6061,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0011.jpg",image/jpeg,1600,900,0,137608,,1637518220,1572873993000,0,0,0,0,,,,,,,,,,, +18954,6186,content://media/external/images/media/6186,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0012.jpg",image/jpeg,1600,900,0,167893,,1637518221,1572873993000,0,0,0,0,,,,,,,,,,, +18955,6185,content://media/external/images/media/6185,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0007.jpg",image/jpeg,900,1600,0,278360,,1637518221,1572873992000,0,0,0,0,,,,,,,,,,, +18956,5863,content://media/external/images/media/5863,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0006.jpg",image/jpeg,900,1600,0,172408,,1637518220,1572873788000,0,0,0,0,,,,,,,,,,, +18957,5947,content://media/external/images/media/5947,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0005.jpg",image/jpeg,900,1600,0,152429,,1637518220,1572873735000,0,0,0,0,,,,,,,,,,, +18958,6184,content://media/external/images/media/6184,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0004.jpg",image/jpeg,900,1600,0,147524,,1637518221,1572873733000,0,0,0,0,,,,,,,,,,, +18959,5862,content://media/external/images/media/5862,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0003.jpg",image/jpeg,900,1600,0,146499,,1637518220,1572873686000,0,0,0,0,,,,,,,,,,, +18960,6059,content://media/external/images/media/6059,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0002.jpg",image/jpeg,1600,900,0,278659,,1637518220,1572873685000,0,0,0,0,,,,,,,,,,, +18961,5861,content://media/external/images/media/5861,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0001.jpg",image/jpeg,899,1599,0,150529,,1637518220,1572870687000,0,0,0,0,,,,,,,,,,, +18962,4112,content://media/external/images/media/4112,/storage/emulated/0/DCIM/Camera/IMG_20191103_153008.jpg,image/jpeg,4000,2250,90,4293362,,1637504451,1572791410000,1572791410176,0,0,0,,,,,,,,,,, +18963,3168,content://media/external/images/media/3168,/storage/emulated/0/DCIM/Camera/IMG_20191103_152802.jpg,image/jpeg,4000,2250,90,6167305,,1637502143,1572791284000,1572791283993,0,0,0,,,,,,,,,,, +18964,3337,content://media/external/images/media/3337,/storage/emulated/0/DCIM/Camera/IMG_20191103_152747.jpg,image/jpeg,4160,2340,0,5510293,,1637502439,1572791267000,1572791267897,0,0,0,,,,,,,,,,, +18965,4815,content://media/external/images/media/4815,/storage/emulated/0/DCIM/Camera/IMG_20191103_152744.jpg,image/jpeg,4160,2340,0,3840553,,1637505730,1572791264000,1572791264696,0,0,0,,,,,,,,,,, +18966,3917,content://media/external/images/media/3917,/storage/emulated/0/DCIM/Camera/IMG_20191103_152732.jpg,image/jpeg,4160,2340,90,5217926,,1637503834,1572791252000,1572791252105,0,0,0,,,,,,,,,,, +18967,3005,content://media/external/images/media/3005,/storage/emulated/0/DCIM/Camera/IMG_20191103_152138.jpg,image/jpeg,4000,2250,90,3270535,,1637501786,1572790900000,1572790900602,0,0,0,,,,,,,,,,, +18968,3183,content://media/external/images/media/3183,/storage/emulated/0/DCIM/Camera/IMG_20191103_130401.jpg,image/jpeg,4160,2340,0,3266793,,1637502161,1572782641000,1572782641767,0,0,0,,,,,,,,,,, +18969,3102,content://media/external/images/media/3102,/storage/emulated/0/DCIM/Camera/IMG_20191103_130355.jpg,image/jpeg,4160,2340,0,4143209,,1637502054,1572782635000,1572782635291,0,0,0,,,,,,,,,,, +18970,3336,content://media/external/images/media/3336,/storage/emulated/0/DCIM/Camera/IMG_20191103_124940.jpg,image/jpeg,4160,2340,0,3443886,,1637502439,1572781780000,1572781780093,0,0,0,,,,,,,,,,, +18971,4432,content://media/external/images/media/4432,/storage/emulated/0/DCIM/Camera/IMG_20191103_113013.jpg,image/jpeg,4000,2250,90,4541962,,1637505068,1572777014000,1572777014451,0,0,0,,,,,,,,,,, +18972,4659,content://media/external/images/media/4659,/storage/emulated/0/DCIM/Camera/IMG_20191103_112916.jpg,image/jpeg,4000,2250,90,4134102,,1637505417,1572776961000,1572776961119,0,0,0,,,,,,,,,,, +18973,2839,content://media/external/images/media/2839,/storage/emulated/0/DCIM/Camera/IMG_20191102_185443.jpg,image/jpeg,4000,2250,90,4988023,,1637501431,1572717285000,1572717285118,0,0,0,,,,,,,,,,, +18974,4241,content://media/external/images/media/4241,/storage/emulated/0/DCIM/Camera/IMG_20191102_185439.jpg,image/jpeg,4000,2250,90,5036663,,1637504734,1572717280000,1572717280784,0,0,0,,,,,,,,,,, +18975,3318,content://media/external/images/media/3318,/storage/emulated/0/DCIM/Camera/IMG_20191102_185331.jpg,image/jpeg,5184,3880,90,7247423,,1637502438,1572717218000,1572717218060,0,0,0,,,,,,,,,,, +18976,4466,content://media/external/images/media/4466,/storage/emulated/0/DCIM/Camera/IMG_20191102_185220.jpg,image/jpeg,5184,3880,270,6689013,,1637505091,1572717142000,1572717142686,0,0,0,,,,,,,,,,, +18977,5860,content://media/external/images/media/5860,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191102-WA0016.jpg",image/jpeg,1200,1600,0,229978,,1637518220,1572712047000,0,0,0,0,,,,,,,,,,, +18978,5859,content://media/external/images/media/5859,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191102-WA0014.jpg",image/jpeg,768,1024,0,72201,,1637518220,1572710045000,0,0,0,0,,,,,,,,,,, +18979,3916,content://media/external/images/media/3916,/storage/emulated/0/DCIM/Camera/IMG_20191102_165051.jpg,image/jpeg,4000,2250,0,3464746,,1637503834,1572709853000,1572709853033,0,0,0,,,,,,,,,,, +18980,3282,content://media/external/images/media/3282,/storage/emulated/0/DCIM/Camera/IMG_20191102_165041.jpg,image/jpeg,4160,2340,90,4506695,,1637502355,1572709841000,1572709841192,0,0,0,,,,,,,,,,, +18981,3549,content://media/external/images/media/3549,/storage/emulated/0/DCIM/Camera/IMG_20191102_164848.jpg,image/jpeg,4160,2340,90,4879984,,1637503058,1572709728000,1572709728046,0,0,0,,,,,,,,,,, +18982,6183,content://media/external/images/media/6183,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191102-WA0007.jpg",image/jpeg,900,1600,0,133193,,1637518221,1572697871000,0,0,0,0,,,,,,,,,,, +18983,4341,content://media/external/images/media/4341,/storage/emulated/0/DCIM/Camera/IMG_20191102_113505.jpg,image/jpeg,4160,2340,0,3623044,,1637504906,1572690905000,1572690905771,0,0,0,,,,,,,,,,, +18984,4352,content://media/external/images/media/4352,/storage/emulated/0/DCIM/Camera/IMG_20191102_113451.jpg,image/jpeg,4160,2340,0,3576181,,1637504970,1572690891000,1572690891476,0,0,0,,,,,,,,,,, +18985,4628,content://media/external/images/media/4628,/storage/emulated/0/DCIM/Camera/IMG_20191102_111313.jpg,image/jpeg,4000,2250,0,6019171,,1637505390,1572689595000,1572689595215,0,0,0,,,,,,,,,,, +18986,2858,content://media/external/images/media/2858,/storage/emulated/0/DCIM/Camera/IMG_20191102_111304.jpg,image/jpeg,4000,2250,90,6089248,,1637501457,1572689586000,1572689586543,0,0,0,,,,,,,,,,, +18987,5858,content://media/external/images/media/5858,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191102-WA0000.jpg",image/jpeg,1200,1600,0,170122,,1637518220,1572681902000,0,0,0,0,,,,,,,,,,, +18988,4340,content://media/external/images/media/4340,/storage/emulated/0/DCIM/Camera/IMG_20191101_213706.jpg,image/jpeg,4000,2250,0,4848809,,1637504906,1572640627000,1572640627813,0,0,0,,,,,,,,,,, +18989,3654,content://media/external/images/media/3654,/storage/emulated/0/DCIM/Camera/IMG_20191101_213702.jpg,image/jpeg,4000,2250,0,4614830,,1637503358,1572640623000,1572640623683,0,0,0,,,,,,,,,,, +18990,4993,content://media/external/images/media/4993,/storage/emulated/0/DCIM/Camera/IMG_20191101_213655.jpg,image/jpeg,4000,2250,0,4762873,,1637506101,1572640616000,1572640616223,0,0,0,,,,,,,,,,, +18991,2800,content://media/external/images/media/2800,/storage/emulated/0/DCIM/Camera/IMG_20191101_211659.jpg,image/jpeg,4000,2250,0,4433192,,1637501311,1572639420000,1572639420610,0,0,0,,,,,,,,,,, +18992,3240,content://media/external/images/media/3240,/storage/emulated/0/DCIM/Camera/IMG_20191101_211657.jpg,image/jpeg,4000,2250,0,4317493,,1637502259,1572639418000,1572639418717,0,0,0,,,,,,,,,,, +18993,4450,content://media/external/images/media/4450,/storage/emulated/0/DCIM/Camera/IMG_20191101_201545.jpg,image/jpeg,4000,2250,0,5029128,,1637505068,1572635747000,1572635746999,0,0,0,,,,,,,,,,, +18994,4500,content://media/external/images/media/4500,/storage/emulated/0/DCIM/Camera/IMG_20191101_185629.jpg,image/jpeg,4000,2250,90,2708799,,1637505160,1572630991000,1572630991834,0,0,0,,,,,,,,,,, +18995,4696,content://media/external/images/media/4696,/storage/emulated/0/DCIM/Camera/IMG_20191101_185537.jpg,image/jpeg,4000,2250,90,4096857,,1637505509,1572630938000,1572630938640,0,0,0,,,,,,,,,,, +18996,3679,content://media/external/images/media/3679,/storage/emulated/0/DCIM/Camera/IMG_20191101_184312.jpg,image/jpeg,4000,2250,0,5141705,,1637503389,1572630192000,1572630192041,0,0,0,,,,,,,,,,, +18997,3996,content://media/external/images/media/3996,/storage/emulated/0/DCIM/Camera/IMG_20191101_184226.jpg,image/jpeg,4000,2250,0,4719992,,1637504086,1572630147000,1572630147552,0,0,0,,,,,,,,,,, +18998,4033,content://media/external/images/media/4033,/storage/emulated/0/DCIM/Camera/IMG_20191101_184215.jpg,image/jpeg,4000,2250,90,4462928,,1637504234,1572630137000,1572630137331,0,0,0,,,,,,,,,,, +18999,4390,content://media/external/images/media/4390,/storage/emulated/0/DCIM/Camera/IMG_20191101_184155.jpg,image/jpeg,4160,2340,0,4302250,,1637505004,1572630115000,1572630115748,0,0,0,,,,,,,,,,, +19000,4449,content://media/external/images/media/4449,/storage/emulated/0/DCIM/Camera/IMG_20191101_183923.jpg,image/jpeg,4000,2250,0,5144068,,1637505068,1572629963000,1572629963118,0,0,0,,,,,,,,,,, +19001,4351,content://media/external/images/media/4351,/storage/emulated/0/DCIM/Camera/IMG_20191101_183843.jpg,image/jpeg,4160,2340,0,4349270,,1637504970,1572629923000,1572629923841,0,0,0,,,,,,,,,,, +19002,3650,content://media/external/images/media/3650,/storage/emulated/0/DCIM/Camera/PANO_20191101_183750.jpg,image/jpeg,9648,3712,0,9435502,,1637503301,1572629882000,0,0,0,0,,,,,,,,,,, +19003,3598,content://media/external/images/media/3598,/storage/emulated/0/DCIM/Camera/IMG_20191101_160615.jpg,image/jpeg,4000,2250,0,5880605,,1637503238,1572620776000,1572620776025,0,0,0,,,,,,,,,,, +19004,3617,content://media/external/images/media/3617,/storage/emulated/0/DCIM/Camera/IMG_20191101_160613.jpg,image/jpeg,4000,2250,0,5994159,,1637503271,1572620774000,1572620774205,0,0,0,,,,,,,,,,, +19005,4601,content://media/external/images/media/4601,/storage/emulated/0/DCIM/Camera/IMG_20191101_160605.jpg,image/jpeg,4000,2250,90,6566431,,1637505308,1572620766000,1572620766479,0,0,0,,,,,,,,,,, +19006,4907,content://media/external/images/media/4907,/storage/emulated/0/DCIM/Camera/IMG_20191101_160604.jpg,image/jpeg,4000,2250,90,6426528,,1637505944,1572620765000,1572620765177,0,0,0,,,,,,,,,,, +19007,4499,content://media/external/images/media/4499,/storage/emulated/0/DCIM/Camera/IMG_20191101_160546.jpg,image/jpeg,4000,2250,90,6335142,,1637505160,1572620747000,1572620747489,0,0,0,,,,,,,,,,, +19008,3696,content://media/external/images/media/3696,/storage/emulated/0/DCIM/Camera/IMG_20191101_145939.jpg,image/jpeg,4160,2340,0,5604859,,1637503392,1572616779000,1572616779732,0,0,0,,,,,,,,,,, +19009,3933,content://media/external/images/media/3933,/storage/emulated/0/DCIM/Camera/PANO_20191101_145710.jpg,image/jpeg,7120,3776,0,5423498,,1637503834,1572616638000,0,0,0,0,,,,,,,,,,, +19010,3058,content://media/external/images/media/3058,/storage/emulated/0/DCIM/Camera/PANO_20191101_145637.jpg,image/jpeg,7536,3776,0,6286346,,1637501858,1572616606000,0,0,0,0,,,,,,,,,,, +19011,4259,content://media/external/images/media/4259,/storage/emulated/0/DCIM/Camera/IMG_20191101_145555.jpg,image/jpeg,4000,2250,0,4959627,,1637504756,1572616556000,1572616556412,0,0,0,,,,,,,,,,, +19012,3635,content://media/external/images/media/3635,/storage/emulated/0/DCIM/Camera/IMG_20191101_145423.jpg,image/jpeg,4000,2250,90,4702646,,1637503301,1572616464000,1572616464316,0,0,0,,,,,,,,,,, +19013,3335,content://media/external/images/media/3335,/storage/emulated/0/DCIM/Camera/IMG_20191101_145307.jpg,image/jpeg,4000,2250,90,4806479,,1637502439,1572616388000,1572616388873,0,0,0,,,,,,,,,,, +19014,4240,content://media/external/images/media/4240,/storage/emulated/0/DCIM/Camera/IMG_20191101_145301.jpg,image/jpeg,4000,2250,90,5031659,,1637504734,1572616382000,1572616382210,0,0,0,,,,,,,,,,, +19015,4185,content://media/external/images/media/4185,/storage/emulated/0/DCIM/Camera/IMG_20191101_145107.jpg,image/jpeg,4000,2250,90,4092876,,1637504558,1572616270000,1572616269921,0,0,0,,,,,,,,,,, +19016,3125,content://media/external/images/media/3125,/storage/emulated/0/DCIM/Camera/IMG_20191101_145058.jpg,image/jpeg,4000,2250,0,4145636,,1637502068,1572616261000,1572616260967,0,0,0,,,,,,,,,,, +19017,4305,content://media/external/images/media/4305,/storage/emulated/0/DCIM/Camera/IMG_20191101_144956.jpg,image/jpeg,4000,2250,0,4282826,,1637504817,1572616198000,1572616198233,0,0,0,,,,,,,,,,, +19018,3167,content://media/external/images/media/3167,/storage/emulated/0/DCIM/Camera/IMG_20191101_144939.jpg,image/jpeg,4000,2250,90,4138666,,1637502143,1572616182000,1572616182260,0,0,0,,,,,,,,,,, +19019,3530,content://media/external/images/media/3530,/storage/emulated/0/DCIM/Camera/IMG_20191101_144916.jpg,image/jpeg,4000,2250,90,4982705,,1637503010,1572616158000,1572616158005,0,0,0,,,,,,,,,,, +19020,3486,content://media/external/images/media/3486,/storage/emulated/0/DCIM/Camera/IMG_20191101_144851.jpg,image/jpeg,4000,2250,90,4371789,,1637502870,1572616134000,1572616134421,0,0,0,,,,,,,,,,, +19021,3508,content://media/external/images/media/3508,/storage/emulated/0/DCIM/Camera/IMG_20191101_144530.jpg,image/jpeg,4000,2250,0,4930093,,1637502969,1572615934000,1572615934081,0,0,0,,,,,,,,,,, +19022,3480,content://media/external/images/media/3480,/storage/emulated/0/DCIM/Camera/PANO_20191101_144431.jpg,image/jpeg,5040,3776,0,3615101,,1637502817,1572615878000,0,0,0,0,,,,,,,,,,, +19023,3450,content://media/external/images/media/3450,/storage/emulated/0/DCIM/Camera/IMG_20191101_135057.jpg,image/jpeg,4000,2250,90,4758357,,1637502804,1572612658000,1572612658889,0,0,0,,,,,,,,,,, +19024,3138,content://media/external/images/media/3138,/storage/emulated/0/DCIM/Camera/IMG_20191101_135055.jpg,image/jpeg,4000,2250,90,4878907,,1637502130,1572612656000,1572612656769,0,0,0,,,,,,,,,,, +19025,4540,content://media/external/images/media/4540,/storage/emulated/0/DCIM/Camera/IMG_20191101_125538.jpg,image/jpeg,4160,2340,0,4323910,,1637505187,1572609338000,1572609338587,0,0,0,,,,,,,,,,, +19026,3373,content://media/external/images/media/3373,/storage/emulated/0/DCIM/Camera/IMG_20191101_125531.jpg,image/jpeg,4160,2340,90,4274833,,1637502523,1572609331000,1572609331332,0,0,0,,,,,,,,,,, +19027,4111,content://media/external/images/media/4111,/storage/emulated/0/DCIM/Camera/IMG_20191101_125125.jpg,image/jpeg,5184,3880,0,5569047,,1637504451,1572609088000,1572609087979,0,0,0,,,,,,,,,,, +19028,2963,content://media/external/images/media/2963,/storage/emulated/0/DCIM/Camera/IMG_20191101_125124.jpg,image/jpeg,5184,3880,0,5580486,,1637501684,1572609087000,1572609087657,0,0,0,,,,,,,,,,, +19029,3407,content://media/external/images/media/3407,/storage/emulated/0/DCIM/Camera/PANO_20191101_124950.jpg,image/jpeg,7408,3616,0,6983003,,1637502598,1572608997000,0,0,0,0,,,,,,,,,,, +19030,4431,content://media/external/images/media/4431,/storage/emulated/0/DCIM/Camera/IMG_20191101_124942.jpg,image/jpeg,4160,2340,0,6159433,,1637505068,1572608982000,1572608982596,0,0,0,,,,,,,,,,, +19031,3299,content://media/external/images/media/3299,/storage/emulated/0/DCIM/Camera/IMG_20191101_120902.jpg,image/jpeg,4160,2340,90,5620754,,1637502430,1572606542000,1572606542534,0,0,0,,,,,,,,,,, +19032,4751,content://media/external/images/media/4751,/storage/emulated/0/DCIM/Camera/IMG_20191101_120842.jpg,image/jpeg,4160,2340,90,5646523,,1637505639,1572606522000,1572606522528,0,0,0,,,,,,,,,,, +19033,4131,content://media/external/images/media/4131,/storage/emulated/0/DCIM/Camera/IMG_20191101_120831.jpg,image/jpeg,4160,2340,90,5493734,,1637504473,1572606511000,1572606511357,0,0,0,,,,,,,,,,, +19034,4793,content://media/external/images/media/4793,/storage/emulated/0/DCIM/Camera/IMG_20191101_120733.jpg,image/jpeg,4160,2340,90,5400082,,1637505663,1572606453000,1572606453134,0,0,0,,,,,,,,,,, +19035,4581,content://media/external/images/media/4581,/storage/emulated/0/DCIM/Camera/IMG_20191101_120720.jpg,image/jpeg,4000,2250,90,5899266,,1637505278,1572606441000,1572606441795,0,0,0,,,,,,,,,,, +19036,2857,content://media/external/images/media/2857,/storage/emulated/0/DCIM/Camera/IMG_20191101_120436.jpg,image/jpeg,4160,2340,0,6106908,,1637501457,1572606276000,1572606276549,0,0,0,,,,,,,,,,, +19037,4239,content://media/external/images/media/4239,/storage/emulated/0/DCIM/Camera/IMG_20191101_115024.jpg,image/jpeg,4000,2250,90,4567435,,1637504734,1572605427000,1572605427750,0,0,0,,,,,,,,,,, +19038,4814,content://media/external/images/media/4814,/storage/emulated/0/DCIM/Camera/IMG_20191101_114329.jpg,image/jpeg,4000,2250,0,6286115,,1637505730,1572605010000,1572605010619,0,0,0,,,,,,,,,,, +19039,3449,content://media/external/images/media/3449,/storage/emulated/0/DCIM/Camera/IMG_20191101_114324.jpg,image/jpeg,4000,2250,90,4971316,,1637502804,1572605005000,1572605005618,0,0,0,,,,,,,,,,, +19040,4580,content://media/external/images/media/4580,/storage/emulated/0/DCIM/Camera/IMG_20191101_114319.jpg,image/jpeg,4000,2250,90,5626274,,1637505278,1572605002000,1572605002493,0,0,0,,,,,,,,,,, +19041,5946,content://media/external/images/media/5946,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191031-WA0021.jpg",image/jpeg,1280,958,0,92257,,1637518220,1572556012000,0,0,0,0,,,,,,,,,,, +19042,5857,content://media/external/images/media/5857,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191031-WA0020.jpg",image/jpeg,960,952,0,71095,,1637518220,1572554466000,0,0,0,0,,,,,,,,,,, +19043,4674,content://media/external/images/media/4674,/storage/emulated/0/DCIM/Camera/IMG_20191031_212917.jpg,image/jpeg,4000,2250,0,4540358,,1637505480,1572553759000,1572553759041,0,0,0,,,,,,,,,,, +19044,5856,content://media/external/images/media/5856,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0021.jpg",image/jpeg,1600,903,0,83160,,1637518220,1572444458000,0,0,0,0,,,,,,,,,,, +19045,5945,content://media/external/images/media/5945,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0020.jpg",image/jpeg,1600,903,0,93320,,1637518220,1572444457000,0,0,0,0,,,,,,,,,,, +19046,5855,content://media/external/images/media/5855,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0019.jpg",image/jpeg,903,1600,0,66635,,1637518220,1572444456000,0,0,0,0,,,,,,,,,,, +19047,6182,content://media/external/images/media/6182,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0018.jpg",image/jpeg,903,1600,0,84227,,1637518221,1572444456000,0,0,0,0,,,,,,,,,,, +19048,6181,content://media/external/images/media/6181,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0017.jpg",image/jpeg,1600,903,0,203266,,1637518221,1572444455000,0,0,0,0,,,,,,,,,,, +19049,6180,content://media/external/images/media/6180,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0016.jpg",image/jpeg,903,1600,0,108376,,1637518221,1572444418000,0,0,0,0,,,,,,,,,,, +19050,5854,content://media/external/images/media/5854,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0015.jpg",image/jpeg,1600,903,0,154348,,1637518220,1572444410000,0,0,0,0,,,,,,,,,,, +19051,5853,content://media/external/images/media/5853,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0014.jpg",image/jpeg,903,1600,0,95478,,1637518220,1572444403000,0,0,0,0,,,,,,,,,,, +19052,5852,content://media/external/images/media/5852,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0012.jpg",image/jpeg,903,1600,0,102052,,1637518220,1572444387000,0,0,0,0,,,,,,,,,,, +19053,5944,content://media/external/images/media/5944,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0013.jpg",image/jpeg,1600,903,0,89830,,1637518220,1572444387000,0,0,0,0,,,,,,,,,,, +19054,6179,content://media/external/images/media/6179,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0011.jpg",image/jpeg,1600,903,0,149884,,1637518221,1572444386000,0,0,0,0,,,,,,,,,,, +19055,5943,content://media/external/images/media/5943,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0010.jpg",image/jpeg,903,1600,0,159023,,1637518220,1572444385000,0,0,0,0,,,,,,,,,,, +19056,6178,content://media/external/images/media/6178,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0004.jpg",image/jpeg,768,1024,0,113872,,1637518221,1572440021000,0,0,0,0,,,,,,,,,,, +19057,6177,content://media/external/images/media/6177,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0018.jpg",image/jpeg,1448,1448,0,172472,,1637518221,1572166013000,0,0,0,0,,,,,,,,,,, +19058,5851,content://media/external/images/media/5851,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0014.jpg",image/jpeg,1200,1600,0,127086,,1637518220,1572131660000,0,0,0,0,,,,,,,,,,, +19059,6176,content://media/external/images/media/6176,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0013.jpg",image/jpeg,1200,1600,0,97351,,1637518221,1572131656000,0,0,0,0,,,,,,,,,,, +19060,6058,content://media/external/images/media/6058,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0012.jpg",image/jpeg,1200,1600,0,119678,,1637518220,1572131655000,0,0,0,0,,,,,,,,,,, +19061,5850,content://media/external/images/media/5850,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0011.jpg",image/jpeg,1200,1600,0,127749,,1637518220,1572131652000,0,0,0,0,,,,,,,,,,, +19062,6175,content://media/external/images/media/6175,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0010.jpg",image/jpeg,1200,1600,0,100914,,1637518221,1572131650000,0,0,0,0,,,,,,,,,,, +19063,5849,content://media/external/images/media/5849,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0009.jpg",image/jpeg,1200,1600,0,118422,,1637518220,1572131646000,0,0,0,0,,,,,,,,,,, +19064,5848,content://media/external/images/media/5848,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0008.jpg",image/jpeg,1200,1600,0,144898,,1637518220,1572131643000,0,0,0,0,,,,,,,,,,, +19065,5942,content://media/external/images/media/5942,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0007.jpg",image/jpeg,1200,1600,0,107255,,1637518220,1572131639000,0,0,0,0,,,,,,,,,,, +19066,6174,content://media/external/images/media/6174,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0006.jpg",image/jpeg,1200,1600,0,119701,,1637518221,1572131633000,0,0,0,0,,,,,,,,,,, +19067,6173,content://media/external/images/media/6173,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0005.jpg",image/jpeg,1200,1600,0,120882,,1637518221,1572131625000,0,0,0,0,,,,,,,,,,, +19068,6057,content://media/external/images/media/6057,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0004.jpg",image/jpeg,1200,1600,0,125899,,1637518220,1572131623000,0,0,0,0,,,,,,,,,,, +19069,6056,content://media/external/images/media/6056,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0003.jpg",image/jpeg,1200,1600,0,88918,,1637518220,1572131617000,0,0,0,0,,,,,,,,,,, +19070,6055,content://media/external/images/media/6055,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0002.jpg",image/jpeg,1200,1600,0,133060,,1637518220,1572131609000,0,0,0,0,,,,,,,,,,, +19071,6172,content://media/external/images/media/6172,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0001.jpg",image/jpeg,1200,1600,0,117046,,1637518221,1572131609000,0,0,0,0,,,,,,,,,,, +19072,5847,content://media/external/images/media/5847,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0000.jpg",image/jpeg,1200,1600,0,90244,,1637518220,1572131573000,0,0,0,0,,,,,,,,,,, +19073,6054,content://media/external/images/media/6054,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191026-WA0020.jpg",image/jpeg,1200,1600,0,281791,,1637518220,1572105156000,0,0,0,0,,,,,,,,,,, +19074,5846,content://media/external/images/media/5846,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191026-WA0016.jpg",image/jpeg,1200,1600,0,293843,,1637518220,1572104221000,0,0,0,0,,,,,,,,,,, +19075,4430,content://media/external/images/media/4430,/storage/emulated/0/DCIM/Camera/IMG_20191026_173655.jpg,image/jpeg,4000,2250,90,4471008,,1637505068,1572104216000,1572104216746,0,0,0,,,,,,,,,,, +19076,4774,content://media/external/images/media/4774,/storage/emulated/0/DCIM/Camera/IMG_20191026_173626.jpg,image/jpeg,4000,2250,0,4313356,,1637505656,1572104187000,1572104187852,0,0,0,,,,,,,,,,, +19077,6171,content://media/external/images/media/6171,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191022-WA0007.jpg",image/jpeg,1200,1600,0,130032,,1637518221,1571738344000,0,0,0,0,,,,,,,,,,, +19078,4258,content://media/external/images/media/4258,/storage/emulated/0/DCIM/Camera/IMG_20191020_203059.jpg,image/jpeg,4160,2340,0,2951455,,1637504756,1571596259000,1571596259266,0,0,0,,,,,,,,,,, +19079,2962,content://media/external/images/media/2962,/storage/emulated/0/DCIM/Camera/IMG_20191020_195429.jpg,image/jpeg,4000,2250,90,4706133,,1637501684,1571594071000,1571594071175,0,0,0,,,,,,,,,,, +19080,2998,content://media/external/images/media/2998,/storage/emulated/0/DCIM/Camera/PANO_20191020_145306.jpg,image/jpeg,8656,3776,0,7463836,,1637501772,1571575999000,0,0,0,0,,,,,,,,,,, +19081,2822,content://media/external/images/media/2822,/storage/emulated/0/DCIM/Camera/IMG_20191017_203050.jpg,image/jpeg,4160,2340,0,4305580,,1637501369,1571337050000,1571337049920,0,0,0,,,,,,,,,,, +19082,6170,content://media/external/images/media/6170,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191017-WA0007.jpg",image/jpeg,898,1600,0,140118,,1637518221,1571310812000,0,0,0,0,,,,,,,,,,, +19083,5845,content://media/external/images/media/5845,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191013-WA0020.jpg",image/jpeg,1600,1202,0,179236,,1637518220,1570986033000,0,0,0,0,,,,,,,,,,, +19084,6052,content://media/external/images/media/6052,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191013-WA0018.jpg",image/jpeg,1600,1200,0,248480,,1637518220,1570986009000,0,0,0,0,,,,,,,,,,, +19085,6053,content://media/external/images/media/6053,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191013-WA0019.jpg",image/jpeg,1600,1200,0,287081,,1637518220,1570986009000,0,0,0,0,,,,,,,,,,, +19086,5844,content://media/external/images/media/5844,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191013-WA0016.jpg",image/jpeg,1600,1200,0,289228,,1637518220,1570986008000,0,0,0,0,,,,,,,,,,, +19087,6051,content://media/external/images/media/6051,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191013-WA0017.jpg",image/jpeg,1600,1200,0,291475,,1637518220,1570986008000,0,0,0,0,,,,,,,,,,, +19088,2608,content://media/external/images/media/2608,/storage/emulated/0/DCIM/Facebook/FB_IMG_1570977783947.jpg,image/jpeg,966,966,0,56596,,1637500870,1570977783000,0,0,0,0,,,,,,,,,,, +19089,4184,content://media/external/images/media/4184,/storage/emulated/0/DCIM/Camera/IMG_20191012_190328.jpg,image/jpeg,4160,2340,0,4014446,,1637504558,1570899808000,1570899808174,0,0,0,,,,,,,,,,, +19090,3225,content://media/external/images/media/3225,/storage/emulated/0/DCIM/Camera/IMG_20191012_173323.jpg,image/jpeg,4160,2340,90,4968212,,1637502258,1570894403000,1570894403138,0,0,0,,,,,,,,,,, +19091,4992,content://media/external/images/media/4992,/storage/emulated/0/DCIM/Camera/IMG_20191012_173255.jpg,image/jpeg,4160,2340,90,4124053,,1637506101,1570894375000,1570894375788,0,0,0,,,,,,,,,,, +19092,4465,content://media/external/images/media/4465,/storage/emulated/0/DCIM/Camera/IMG_20191012_173126.jpg,image/jpeg,4000,2250,0,4601899,,1637505091,1570894287000,1570894287337,0,0,0,,,,,,,,,,, +19093,3939,content://media/external/images/media/3939,/storage/emulated/0/DCIM/Camera/IMG_20191012_173123.jpg,image/jpeg,4000,2250,0,5064820,,1637503853,1570894285000,1570894285332,0,0,0,,,,,,,,,,, +19094,5941,content://media/external/images/media/5941,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191011-WA0024.jpg",image/jpeg,989,1024,0,97728,,1637518220,1570829415000,0,0,0,0,,,,,,,,,,, +19095,2898,content://media/external/images/media/2898,/storage/emulated/0/DCIM/Camera/IMG_20191010_201512.jpg,image/jpeg,1928,803,0,412375,,1637501534,1570731312000,1570476248525,0,0,0,,,,,,,,,,, +19096,6050,content://media/external/images/media/6050,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191010-WA0001.jpg",image/jpeg,1600,1202,0,140626,,1637518220,1570684331000,0,0,0,0,,,,,,,,,,, +19097,5940,content://media/external/images/media/5940,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191010-WA0000.jpg",image/jpeg,1600,1200,0,208676,,1637518220,1570684330000,0,0,0,0,,,,,,,,,,, +19098,2685,content://media/external/images/media/2685,/storage/emulated/0/Pictures/1570482791224.jpg,image/jpeg,1399,2184,0,169829,,1637500871,1570482791000,0,0,0,0,,,,,,,,,,, +19099,2634,content://media/external/images/media/2634,/storage/emulated/0/DCIM/PhotoScan/1570479693994-71928632-f87c-45c2-82a8-7dd9166f427d.jpg,image/jpeg,1333,2000,0,1255016,,1637500870,1570479855000,0,0,0,0,,,,,,,,,,, +19100,3760,content://media/external/images/media/3760,/storage/emulated/0/DCIM/Camera/IMG_20191007_214026.jpg,image/jpeg,4000,2250,180,4033192,,1637503508,1570477227000,1570477227764,0,0,0,,,,,,,,,,, +19101,4110,content://media/external/images/media/4110,/storage/emulated/0/DCIM/Camera/IMG_20191007_214021.jpg,image/jpeg,4000,2250,180,4616888,,1637504451,1570477222000,1570477222475,0,0,0,,,,,,,,,,, +19102,3124,content://media/external/images/media/3124,/storage/emulated/0/DCIM/Camera/IMG_20191007_212406.jpg,image/jpeg,4000,2250,0,4768519,,1637502068,1570476248000,1570476248525,0,0,0,,,,,,,,,,, +19103,5843,content://media/external/images/media/5843,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191006-WA0019.jpg",image/jpeg,1200,1599,0,251169,,1637518220,1570363836000,0,0,0,0,,,,,,,,,,, +19104,6169,content://media/external/images/media/6169,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191006-WA0011.jpg",image/jpeg,1200,1599,0,226085,,1637518221,1570355193000,0,0,0,0,,,,,,,,,,, +19105,3678,content://media/external/images/media/3678,/storage/emulated/0/DCIM/Camera/IMG_20191005_161522.jpg,image/jpeg,3264,1836,90,3213840,,1637503389,1570284922000,1570284921957,0,0,0,,,,,,,,,,, +19106,1001,content://media/external/images/media/1001,/storage/emulated/0/JamendoMusic/EmbeddedCover.jpg,image/jpeg,1200,1161,0,432997,,1637500139,1570203811000,0,0,0,0,,,,,,,,,,, +19107,1002,content://media/external/images/media/1002,"/storage/emulated/0/Music Downloader/EmbeddedCover.jpg",image/jpeg,1200,1200,0,343524,,1637500139,1570203811000,0,0,0,0,,,,,,,,,,, +19108,1003,content://media/external/images/media/1003,/storage/emulated/0/Music/EmbeddedCover.jpg,image/jpeg,604,600,0,64468,,1637500139,1570203811000,0,0,0,0,,,,,,,,,,, +19109,6049,content://media/external/images/media/6049,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191004-WA0002.jpg",image/jpeg,750,1334,0,88097,,1637518220,1570193170000,0,0,0,0,,,,,,,,,,, +19110,5939,content://media/external/images/media/5939,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191002-WA0005.jpg",image/jpeg,1600,1202,0,200849,,1637518220,1570053589000,0,0,0,0,,,,,,,,,,, +19111,6048,content://media/external/images/media/6048,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191002-WA0004.jpg",image/jpeg,1600,901,0,155871,,1637518220,1570052324000,0,0,0,0,,,,,,,,,,, +19112,5938,content://media/external/images/media/5938,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191002-WA0002.jpg",image/jpeg,1600,901,0,152282,,1637518220,1570052323000,0,0,0,0,,,,,,,,,,, +19113,6167,content://media/external/images/media/6167,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191002-WA0001.jpg",image/jpeg,1600,901,0,180352,,1637518221,1570052323000,0,0,0,0,,,,,,,,,,, +19114,6168,content://media/external/images/media/6168,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191002-WA0003.jpg",image/jpeg,1600,901,0,156158,,1637518221,1570052323000,0,0,0,0,,,,,,,,,,, +19115,2821,content://media/external/images/media/2821,/storage/emulated/0/DCIM/Camera/IMG_20191001_214352.jpg,image/jpeg,4160,2340,0,3497738,,1637501369,1569959032000,1569959032720,0,0,0,,,,,,,,,,, +19116,4130,content://media/external/images/media/4130,/storage/emulated/0/DCIM/Camera/IMG_20190930_181717.jpg,image/jpeg,4000,2250,90,5164304,,1637504473,1569860239000,1569860239121,0,0,0,,,,,,,,,,, +19117,3597,content://media/external/images/media/3597,/storage/emulated/0/DCIM/Camera/IMG_20190930_175946.jpg,image/jpeg,4000,2250,0,5201537,,1637503238,1569859188000,1569859188852,0,0,0,,,,,,,,,,, +19118,5842,content://media/external/images/media/5842,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190930-WA0001.jpg",image/jpeg,973,624,0,78280,,1637518220,1569796036000,0,0,0,0,,,,,,,,,,, +19119,3822,content://media/external/images/media/3822,/storage/emulated/0/DCIM/Camera/IMG_20190928_080615.jpg,image/jpeg,4000,2250,0,4910065,,1637503629,1569650776000,1569650776872,0,0,0,,,,,,,,,,, +19120,3004,content://media/external/images/media/3004,/storage/emulated/0/DCIM/Camera/IMG_20190927_230030.jpg,image/jpeg,4160,2340,0,5271203,,1637501786,1569618030000,1569618030408,0,0,0,,,,,,,,,,, +19121,2856,content://media/external/images/media/2856,/storage/emulated/0/DCIM/Camera/IMG_20190927_225851.jpg,image/jpeg,4000,2250,90,3847939,,1637501457,1569617931000,1569617931289,0,0,0,,,,,,,,,,, +19122,4773,content://media/external/images/media/4773,/storage/emulated/0/DCIM/Camera/IMG_20190927_225610_1.jpg,image/jpeg,4000,3000,90,5427408,,1637505656,1569617770000,1569617770772,0,0,0,,,,,,,,,,, +19123,3166,content://media/external/images/media/3166,/storage/emulated/0/DCIM/Camera/IMG_20190926_185603.jpg,image/jpeg,4000,3000,90,6889330,,1637502143,1569516965000,1569516965197,0,0,0,,,,,,,,,,, +19124,3529,content://media/external/images/media/3529,/storage/emulated/0/DCIM/Camera/IMG_20190923_203557.jpg,image/jpeg,4000,3000,90,5795300,,1637503010,1569263758000,1569263758876,0,0,0,,,,,,,,,,, +19125,2644,content://media/external/images/media/2644,/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-09-21-18-49-48-679_com.brytonsport.active.png,image/png,1080,2340,0,624372,,1637500870,1569084589000,0,0,0,0,,,,,,,,,,, +19126,2855,content://media/external/images/media/2855,/storage/emulated/0/DCIM/Camera/IMG_20190921_120845.jpg,image/jpeg,8000,6000,90,22960750,,1637501457,1569060527000,1569060527055,0,0,0,,,,,,,,,,, +19127,3165,content://media/external/images/media/3165,/storage/emulated/0/DCIM/Camera/IMG_20190921_120812_1.jpg,image/jpeg,4000,3000,90,7482130,,1637502143,1569060493000,1569060493458,0,0,0,,,,,,,,,,, +19128,3372,content://media/external/images/media/3372,/storage/emulated/0/DCIM/Camera/IMG_20190921_120812.jpg,image/jpeg,4000,3000,90,8168234,,1637502523,1569060493000,1569060493562,0,0,0,,,,,,,,,,, +19129,3359,content://media/external/images/media/3359,/storage/emulated/0/DCIM/Camera/IMG_20190921_115513.jpg,image/jpeg,4160,3120,0,7039958,,1637502451,1569059713000,1569059713225,0,0,0,,,,,,,,,,, +19130,3953,content://media/external/images/media/3953,/storage/emulated/0/DCIM/Camera/IMG_20190921_115507.jpg,image/jpeg,4160,3120,0,6653348,,1637503942,1569059708000,1569059707750,0,0,0,,,,,,,,,,, +19131,5935,content://media/external/images/media/5935,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190920-WA0024.jpg",image/jpeg,1200,1600,0,138786,,1637518220,1569003829000,0,0,0,0,,,,,,,,,,, +19132,5936,content://media/external/images/media/5936,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190920-WA0025.jpg",image/jpeg,1200,1600,0,174715,,1637518220,1569003829000,0,0,0,0,,,,,,,,,,, +19133,5841,content://media/external/images/media/5841,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190920-WA0022.jpg",image/jpeg,1200,1600,0,189335,,1637518220,1569003828000,0,0,0,0,,,,,,,,,,, +19134,5934,content://media/external/images/media/5934,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190920-WA0023.jpg",image/jpeg,1200,1600,0,194556,,1637518220,1569003828000,0,0,0,0,,,,,,,,,,, +19135,4750,content://media/external/images/media/4750,/storage/emulated/0/DCIM/Camera/IMG_20190920_195613.jpg,image/jpeg,4000,3000,90,5588232,,1637505639,1569002175000,1569002174963,0,0,0,,,,,,,,,,, +19136,3087,content://media/external/images/media/3087,/storage/emulated/0/DCIM/Camera/IMG_20190920_195608.jpg,image/jpeg,4000,3000,0,5940569,,1637501970,1569002170000,1569002170253,0,0,0,,,,,,,,,,, +19137,2730,content://media/external/images/media/2730,/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-09-18-20-54-35-675_com.android.browser.png,image/png,1080,2340,0,1867455,,1637500987,1568832876000,0,0,0,0,,,,,,,,,,, +19138,5933,content://media/external/images/media/5933,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190915-WA0062.jpg",image/jpeg,1600,1200,0,238266,,1637518220,1568583570000,0,0,0,0,,,,,,,,,,, +19139,5840,content://media/external/images/media/5840,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190915-WA0061.jpg",image/jpeg,1600,1200,0,261431,,1637518220,1568583540000,0,0,0,0,,,,,,,,,,, +19140,6047,content://media/external/images/media/6047,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190915-WA0060.jpg",image/jpeg,1600,1200,0,180532,,1637518220,1568583538000,0,0,0,0,,,,,,,,,,, +19141,4032,content://media/external/images/media/4032,/storage/emulated/0/DCIM/Camera/IMG_20190914_202652.jpg,image/jpeg,4000,3000,90,5587977,,1637504234,1568485613000,1568485613732,0,0,0,,,,,,,,,,, +19142,2632,content://media/external/images/media/2632,/storage/emulated/0/DCIM/PhotoDirector/2019-09-11-09-58-55.jpg,image/jpeg,2560,1920,0,1073723,,1637500870,1568188735000,1567949572590,0,0,0,,,,,,,,,,, +19143,3418,content://media/external/images/media/3418,/storage/emulated/0/DCIM/Camera/IMG_20190911_095015.jpg,image/jpeg,4000,3000,90,5767081,,1637502682,1568188217000,1568188217349,0,0,0,,,,,,,,,,, +19144,3086,content://media/external/images/media/3086,/storage/emulated/0/DCIM/Camera/IMG_20190908_153258.jpg,image/jpeg,8000,6000,0,14423230,,1637501970,1567949579000,1567949579770,0,0,0,,,,,,,,,,, +19145,3281,content://media/external/images/media/3281,/storage/emulated/0/DCIM/Camera/IMG_20190908_153250.jpg,image/jpeg,8000,6000,0,12444971,,1637502355,1567949572000,1567949572590,0,0,0,,,,,,,,,,, +19146,4149,content://media/external/images/media/4149,/storage/emulated/0/DCIM/Camera/IMG_20190908_153239.jpg,image/jpeg,4000,3000,90,5934570,,1637504481,1567949559000,1567949559844,0,0,0,,,,,,,,,,, +19147,3003,content://media/external/images/media/3003,/storage/emulated/0/DCIM/Camera/IMG_20190908_142331.jpg,image/jpeg,4000,3000,90,6424583,,1637501786,1567945412000,1567945412338,0,0,0,,,,,,,,,,, +19148,4498,content://media/external/images/media/4498,/storage/emulated/0/DCIM/Camera/IMG_20190908_142326.jpg,image/jpeg,4000,3000,90,6493886,,1637505160,1567945408000,1567945408192,0,0,0,,,,,,,,,,, +19149,4658,content://media/external/images/media/4658,/storage/emulated/0/DCIM/Camera/IMG_20190908_142327.jpg,image/jpeg,4000,3000,90,6569337,,1637505417,1567945408000,1567945408424,0,0,0,,,,,,,,,,, +19150,4641,content://media/external/images/media/4641,/storage/emulated/0/DCIM/Camera/IMG_20190908_140333.jpg,image/jpeg,4000,3000,0,8846228,,1637505414,1567944214000,1567944214857,0,0,0,,,,,,,,,,, +19151,4627,content://media/external/images/media/4627,/storage/emulated/0/DCIM/Camera/IMG_20190908_140303.jpg,image/jpeg,4000,3000,0,9185929,,1637505390,1567944185000,1567944185053,0,0,0,,,,,,,,,,, +19152,3394,content://media/external/images/media/3394,/storage/emulated/0/DCIM/Camera/IMG_20190908_140254.jpg,image/jpeg,4000,3000,0,8897032,,1637502598,1567944176000,1567944175983,0,0,0,,,,,,,,,,, +19153,3843,content://media/external/images/media/3843,/storage/emulated/0/DCIM/Camera/IMG_20190908_140020.jpg,image/jpeg,4000,3000,0,8880191,,1637503642,1567944021000,1567944021642,0,0,0,,,,,,,,,,, +19154,3977,content://media/external/images/media/3977,/storage/emulated/0/DCIM/Camera/IMG_20190908_140018.jpg,image/jpeg,4000,3000,0,9255676,,1637504059,1567944020000,1567944020111,0,0,0,,,,,,,,,,, +19155,3528,content://media/external/images/media/3528,/storage/emulated/0/DCIM/Camera/IMG_20190907_164309_1.jpg,image/jpeg,4000,3000,90,6163026,,1637503010,1567867390000,1567867390354,0,0,0,,,,,,,,,,, +19156,3653,content://media/external/images/media/3653,/storage/emulated/0/DCIM/Camera/IMG_20190907_164309.jpg,image/jpeg,4000,3000,90,7122901,,1637503358,1567867390000,1567867390886,0,0,0,,,,,,,,,,, +19157,3485,content://media/external/images/media/3485,/storage/emulated/0/DCIM/Camera/IMG_20190907_164307.jpg,image/jpeg,4000,3000,90,6463181,,1637502870,1567867388000,1567867388513,0,0,0,,,,,,,,,,, +19158,4991,content://media/external/images/media/4991,/storage/emulated/0/DCIM/Camera/IMG_20190907_164306.jpg,image/jpeg,4000,3000,90,6719258,,1637506101,1567867387000,1567867387349,0,0,0,,,,,,,,,,, +19159,2820,content://media/external/images/media/2820,/storage/emulated/0/DCIM/Camera/IMG_20190907_164132.jpg,image/jpeg,4000,3000,0,8534888,,1637501369,1567867293000,1567867293658,0,0,0,,,,,,,,,,, +19160,3842,content://media/external/images/media/3842,/storage/emulated/0/DCIM/Camera/IMG_20190907_164127.jpg,image/jpeg,4160,3120,0,7013962,,1637503642,1567867287000,1567867287749,0,0,0,,,,,,,,,,, +19161,3741,content://media/external/images/media/3741,/storage/emulated/0/DCIM/Camera/IMG_20190907_164114.jpg,image/jpeg,4000,3000,90,6764786,,1637503488,1567867275000,1567867275632,0,0,0,,,,,,,,,,, +19162,2799,content://media/external/images/media/2799,/storage/emulated/0/DCIM/Camera/IMG_20190907_164111.jpg,image/jpeg,4000,3000,90,6658946,,1637501311,1567867272000,1567867272581,0,0,0,,,,,,,,,,, +19163,3202,content://media/external/images/media/3202,/storage/emulated/0/DCIM/Camera/IMG_20190907_164103.jpg,image/jpeg,4000,3000,90,6118985,,1637502256,1567867264000,1567867264894,0,0,0,,,,,,,,,,, +19164,3043,content://media/external/images/media/3043,/storage/emulated/0/DCIM/Camera/IMG_20190907_164059.jpg,image/jpeg,4000,3000,90,7257335,,1637501858,1567867260000,1567867260207,0,0,0,,,,,,,,,,, +19165,4429,content://media/external/images/media/4429,/storage/emulated/0/DCIM/Camera/IMG_20190907_152114.jpg,image/jpeg,4000,3000,90,5513948,,1637505068,1567862476000,1567862476084,0,0,0,,,,,,,,,,, +19166,3841,content://media/external/images/media/3841,/storage/emulated/0/DCIM/Camera/IMG_20190907_152113.jpg,image/jpeg,4000,3000,90,5501124,,1637503642,1567862474000,1567862474688,0,0,0,,,,,,,,,,, +19167,4304,content://media/external/images/media/4304,/storage/emulated/0/DCIM/Camera/IMG_20190907_152055.jpg,image/jpeg,4000,3000,90,5726070,,1637504817,1567862456000,1567862456349,0,0,0,,,,,,,,,,, +19168,4220,content://media/external/images/media/4220,/storage/emulated/0/DCIM/Camera/IMG_20190907_152052.jpg,image/jpeg,4000,3000,90,5657704,,1637504726,1567862454000,1567862454066,0,0,0,,,,,,,,,,, +19169,5839,content://media/external/images/media/5839,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190906-WA0016.jpg",image/jpeg,900,1600,0,175072,,1637518220,1567793184000,0,0,0,0,,,,,,,,,,, +19170,4841,content://media/external/images/media/4841,/storage/emulated/0/DCIM/Camera/IMG_20190906_171932.jpg,image/jpeg,4000,3000,90,5973258,,1637505753,1567783174000,1567783173942,0,0,0,,,,,,,,,,, +19171,4410,content://media/external/images/media/4410,/storage/emulated/0/DCIM/Camera/IMG_20190906_170234.jpg,image/jpeg,4000,3000,90,5422237,,1637505062,1567782156000,1567782156081,0,0,0,,,,,,,,,,, +19172,4031,content://media/external/images/media/4031,/storage/emulated/0/DCIM/Camera/IMG_20190906_163647.jpg,image/jpeg,4000,3000,90,5579793,,1637504234,1567780608000,1567780608494,0,0,0,,,,,,,,,,, +19173,2978,content://media/external/images/media/2978,/storage/emulated/0/DCIM/Camera/PANO_20190905_215741.jpg,image/jpeg,4816,3616,0,4407409,,1637501685,1567713465000,0,0,0,0,,,,,,,,,,, +19174,4874,content://media/external/images/media/4874,/storage/emulated/0/DCIM/Camera/PANO_20190905_215718.jpg,image/jpeg,7536,3712,0,7244937,,1637505831,1567713448000,0,0,0,0,,,,,,,,,,, +19175,3759,content://media/external/images/media/3759,/storage/emulated/0/DCIM/Camera/IMG_20190905_215557.jpg,image/jpeg,4000,3000,0,5399914,,1637503508,1567713357000,1567713357393,0,0,0,,,,,,,,,,, +19176,3866,content://media/external/images/media/3866,/storage/emulated/0/DCIM/Camera/IMG_20190905_203324.jpg,image/jpeg,4000,3000,0,5688071,,1637503729,1567708406000,1567708406140,0,0,0,,,,,,,,,,, +19177,2729,content://media/external/images/media/2729,/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-09-05-20-23-48-504_com.stt.android.suunto.png,image/png,1080,2340,0,870280,,1637500987,1567707828000,0,0,0,0,,,,,,,,,,, +19178,3720,content://media/external/images/media/3720,/storage/emulated/0/DCIM/Camera/IMG_20190905_185333.jpg,image/jpeg,4160,3120,0,9378681,,1637503477,1567702413000,1567702413064,0,0,0,,,,,,,,,,, +19179,4195,content://media/external/images/media/4195,/storage/emulated/0/DCIM/Camera/PANO_20190905_182906.jpg,image/jpeg,10352,3712,0,13297337,,1637504558,1567700952000,0,0,0,0,,,,,,,,,,, +19180,5838,content://media/external/images/media/5838,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190905-WA0017.jpg",image/jpeg,945,1024,0,233180,,1637518220,1567671819000,0,0,0,0,,,,,,,,,,, +19181,2835,content://media/external/images/media/2835,/storage/emulated/0/DCIM/Camera/PANO_20190905_081559.jpg,image/jpeg,9616,3648,0,8222603,,1637501370,1567664166000,0,0,0,0,,,,,,,,,,, +19182,3840,content://media/external/images/media/3840,/storage/emulated/0/DCIM/Camera/IMG_20190905_080559.jpg,image/jpeg,4000,3000,0,7557694,,1637503642,1567663560000,1567663560667,0,0,0,,,,,,,,,,, +19183,3548,content://media/external/images/media/3548,/storage/emulated/0/DCIM/Camera/IMG_20190905_080542.jpg,image/jpeg,4000,3000,0,7484975,,1637503058,1567663543000,1567663543740,0,0,0,,,,,,,,,,, +19184,4889,content://media/external/images/media/4889,/storage/emulated/0/DCIM/Camera/IMG_20190905_075648.jpg,image/jpeg,4000,3000,0,8170619,,1637505920,1567663009000,1567663009234,0,0,0,,,,,,,,,,, +19185,4640,content://media/external/images/media/4640,/storage/emulated/0/DCIM/Camera/IMG_20190905_075627.jpg,image/jpeg,4000,3000,0,8457860,,1637505414,1567662990000,1567662990379,0,0,0,,,,,,,,,,, +19186,4792,content://media/external/images/media/4792,/storage/emulated/0/DCIM/Camera/IMG_20190905_075124.jpg,image/jpeg,4160,3120,0,8278569,,1637505663,1567662684000,1567662684145,0,0,0,,,,,,,,,,, +19187,3719,content://media/external/images/media/3719,/storage/emulated/0/DCIM/Camera/IMG_20190904_180139.jpg,image/jpeg,4160,3120,0,7964378,,1637503477,1567612899000,1567612899104,0,0,0,,,,,,,,,,, +19188,4695,content://media/external/images/media/4695,/storage/emulated/0/DCIM/Camera/IMG_20190904_175806.jpg,image/jpeg,4160,3120,0,7285096,,1637505509,1567612686000,1567612686094,0,0,0,,,,,,,,,,, +19189,3042,content://media/external/images/media/3042,/storage/emulated/0/DCIM/Camera/IMG_20190904_175758.jpg,image/jpeg,4000,3000,0,8643836,,1637501858,1567612679000,1567612679791,0,0,0,,,,,,,,,,, +19190,3952,content://media/external/images/media/3952,/storage/emulated/0/DCIM/Camera/IMG_20190904_175735.jpg,image/jpeg,4000,3000,0,7838328,,1637503942,1567612657000,1567612657203,0,0,0,,,,,,,,,,, +19191,3573,content://media/external/images/media/3573,/storage/emulated/0/DCIM/Camera/IMG_20190904_175721.jpg,image/jpeg,4160,3120,0,6680904,,1637503154,1567612641000,1567612641201,0,0,0,,,,,,,,,,, +19192,4600,content://media/external/images/media/4600,/storage/emulated/0/DCIM/Camera/IMG_20190904_175707.jpg,image/jpeg,4160,3120,0,6992490,,1637505308,1567612627000,1567612627238,0,0,0,,,,,,,,,,, +19193,4129,content://media/external/images/media/4129,/storage/emulated/0/DCIM/Camera/IMG_20190904_175647.jpg,image/jpeg,4000,3000,0,7387842,,1637504473,1567612608000,1567612608498,0,0,0,,,,,,,,,,, +19194,4182,content://media/external/images/media/4182,/storage/emulated/0/DCIM/Camera/IMG_20190904_175637.jpg,image/jpeg,4000,3000,0,7659701,,1637504558,1567612598000,1567612598560,0,0,0,,,,,,,,,,, +19195,3182,content://media/external/images/media/3182,/storage/emulated/0/DCIM/Camera/IMG_20190904_175635.jpg,image/jpeg,4000,3000,0,7505172,,1637502161,1567612596000,1567612596819,0,0,0,,,,,,,,,,, +19196,3371,content://media/external/images/media/3371,/storage/emulated/0/DCIM/Camera/IMG_20190904_175436.jpg,image/jpeg,4000,3000,0,7643213,,1637502523,1567612478000,1567612478187,0,0,0,,,,,,,,,,, +19197,3803,content://media/external/images/media/3803,/storage/emulated/0/DCIM/Camera/IMG_20190904_175342.jpg,image/jpeg,4000,3000,90,5067924,,1637503601,1567612427000,1567612427052,0,0,0,,,,,,,,,,, +19198,3064,content://media/external/images/media/3064,/storage/emulated/0/DCIM/Camera/IMG_20190904_175340.jpg,image/jpeg,4000,3000,90,5991914,,1637501905,1567612424000,1567612424313,0,0,0,,,,,,,,,,, +19199,3416,content://media/external/images/media/3416,/storage/emulated/0/DCIM/Camera/IMG_20190904_175343.jpg,image/jpeg,720,960,0,120226,,1637502682,1567612424000,0,0,0,0,,,,,,,,,,, +19200,4497,content://media/external/images/media/4497,/storage/emulated/0/DCIM/Camera/IMG_20190904_175318.jpg,image/jpeg,4160,3120,0,6774044,,1637505160,1567612399000,1567612398904,0,0,0,,,,,,,,,,, +19201,4318,content://media/external/images/media/4318,/storage/emulated/0/DCIM/Camera/IMG_20190904_174131.jpg,image/jpeg,4160,3120,0,6428683,,1637504894,1567611691000,1567611691603,0,0,0,,,,,,,,,,, +19202,4161,content://media/external/images/media/4161,/storage/emulated/0/DCIM/Camera/PANO_20190904_173619.jpg,image/jpeg,9520,3776,0,10406528,,1637504481,1567611388000,0,0,0,0,,,,,,,,,,, +19203,4560,content://media/external/images/media/4560,/storage/emulated/0/DCIM/Camera/IMG_20190904_173611.jpg,image/jpeg,4000,3000,0,7707482,,1637505216,1567611372000,1567611372300,0,0,0,,,,,,,,,,, +19204,4859,content://media/external/images/media/4859,/storage/emulated/0/DCIM/Camera/IMG_20190904_170139.jpg,image/jpeg,4000,3000,90,5416241,,1637505831,1567609300000,1567609300640,0,0,0,,,,,,,,,,, +19205,5837,content://media/external/images/media/5837,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190902-WA0013.jpg",image/jpeg,1328,747,0,138340,,1637518220,1567454693000,0,0,0,0,,,,,,,,,,, +19206,4278,content://media/external/images/media/4278,/storage/emulated/0/DCIM/Camera/IMG_20190901_135056.jpg,image/jpeg,4000,3000,180,5526895,,1637504807,1567338657000,1567338657274,0,0,0,,,,,,,,,,, +19207,5016,content://media/external/images/media/5016,/storage/emulated/0/DCIM/Camera/IMG_20190901_121123.jpg,image/jpeg,4000,3000,0,6852134,,1637506134,1567332684000,1567332684697,0,0,0,,,,,,,,,,, +19208,2896,content://media/external/images/media/2896,/storage/emulated/0/DCIM/Camera/IMG_20190901_121119.jpg,image/jpeg,4000,3000,0,6859878,,1637501534,1567332681000,1567332681360,0,0,0,,,,,,,,,,, +19209,3239,content://media/external/images/media/3239,/storage/emulated/0/DCIM/Camera/IMG_20190831_160601.jpg,image/jpeg,4000,3000,0,6403744,,1637502259,1567260362000,1567260362250,0,0,0,,,,,,,,,,, +19210,6046,content://media/external/images/media/6046,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190830-WA0033.jpg",image/jpeg,768,1024,0,99591,,1637518220,1567189921000,0,0,0,0,,,,,,,,,,, +19211,6045,content://media/external/images/media/6045,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190830-WA0032.jpg",image/jpeg,768,1024,0,85844,,1637518220,1567189769000,0,0,0,0,,,,,,,,,,, +19212,5932,content://media/external/images/media/5932,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190830-WA0031.jpg",image/jpeg,768,1024,0,86498,,1637518220,1567189709000,0,0,0,0,,,,,,,,,,, +19213,6044,content://media/external/images/media/6044,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190830-WA0024.jpg",image/jpeg,1600,900,0,165194,,1637518220,1567180221000,0,0,0,0,,,,,,,,,,, +19214,4148,content://media/external/images/media/4148,/storage/emulated/0/DCIM/Camera/IMG_20190827_175151.jpg,image/jpeg,4000,3000,0,5370185,,1637504481,1566921112000,1566921112009,0,0,0,,,,,,,,,,, +19215,3995,content://media/external/images/media/3995,/storage/emulated/0/DCIM/Camera/IMG_20190827_175017.jpg,image/jpeg,4000,3000,270,5371745,,1637504086,1566921018000,1566921017969,0,0,0,,,,,,,,,,, +19216,4181,content://media/external/images/media/4181,/storage/emulated/0/DCIM/Camera/IMG_20190827_174953.jpg,image/jpeg,4000,3000,90,5559902,,1637504558,1566920994000,1566920994478,0,0,0,,,,,,,,,,, +19217,3137,content://media/external/images/media/3137,/storage/emulated/0/DCIM/Camera/IMG_20190827_174426.jpg,image/jpeg,4000,3000,180,5774798,,1637502130,1566920667000,1566920667517,0,0,0,,,,,,,,,,, +19218,3085,content://media/external/images/media/3085,/storage/emulated/0/DCIM/Camera/IMG_20190827_131321.jpg,image/jpeg,4000,3000,90,6367945,,1637501970,1566904402000,1566904402371,0,0,0,,,,,,,,,,, +19219,3224,content://media/external/images/media/3224,/storage/emulated/0/DCIM/Camera/IMG_20190827_130932.jpg,image/jpeg,4000,3000,90,5776311,,1637502258,1566904174000,1566904174401,0,0,0,,,,,,,,,,, +19220,6043,content://media/external/images/media/6043,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0031.jpg",image/jpeg,1600,1200,0,301829,,1637518220,1566721389000,0,0,0,0,,,,,,,,,,, +19221,5836,content://media/external/images/media/5836,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0030.jpg",image/jpeg,1600,1200,0,347926,,1637518220,1566721388000,0,0,0,0,,,,,,,,,,, +19222,6166,content://media/external/images/media/6166,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0029.jpg",image/jpeg,1600,1200,0,383824,,1637518221,1566721388000,0,0,0,0,,,,,,,,,,, +19223,5835,content://media/external/images/media/5835,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0027.jpg",image/jpeg,1600,1200,0,291181,,1637518220,1566721387000,0,0,0,0,,,,,,,,,,, +19224,6042,content://media/external/images/media/6042,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0028.jpg",image/jpeg,1600,1200,0,376852,,1637518220,1566721387000,0,0,0,0,,,,,,,,,,, +19225,5834,content://media/external/images/media/5834,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0025.jpg",image/jpeg,1600,1202,0,253998,,1637518220,1566721386000,0,0,0,0,,,,,,,,,,, +19226,5931,content://media/external/images/media/5931,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0026.jpg",image/jpeg,1600,1200,0,355828,,1637518220,1566721386000,0,0,0,0,,,,,,,,,,, +19227,5832,content://media/external/images/media/5832,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0022.jpg",image/jpeg,1600,1200,0,228394,,1637518220,1566721385000,0,0,0,0,,,,,,,,,,, +19228,5833,content://media/external/images/media/5833,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0023.jpg",image/jpeg,1600,1200,0,295543,,1637518220,1566721385000,0,0,0,0,,,,,,,,,,, +19229,6165,content://media/external/images/media/6165,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0024.jpg",image/jpeg,1600,1200,0,230990,,1637518221,1566721385000,0,0,0,0,,,,,,,,,,, +19230,5928,content://media/external/images/media/5928,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0018.jpg",image/jpeg,1600,1200,0,368650,,1637518220,1566721384000,0,0,0,0,,,,,,,,,,, +19231,5929,content://media/external/images/media/5929,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0019.jpg",image/jpeg,1600,1200,0,350973,,1637518220,1566721384000,0,0,0,0,,,,,,,,,,, +19232,5930,content://media/external/images/media/5930,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0020.jpg",image/jpeg,1600,1200,0,295265,,1637518220,1566721384000,0,0,0,0,,,,,,,,,,, +19233,6164,content://media/external/images/media/6164,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0021.jpg",image/jpeg,1600,1200,0,255906,,1637518221,1566721384000,0,0,0,0,,,,,,,,,,, +19234,6163,content://media/external/images/media/6163,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0017.jpg",image/jpeg,1600,1200,0,344909,,1637518221,1566721383000,0,0,0,0,,,,,,,,,,, +19235,5831,content://media/external/images/media/5831,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0016.jpg",image/jpeg,1600,1200,0,348921,,1637518220,1566721382000,0,0,0,0,,,,,,,,,,, +19236,5927,content://media/external/images/media/5927,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0015.jpg",image/jpeg,1600,1200,0,343570,,1637518220,1566721382000,0,0,0,0,,,,,,,,,,, +19237,5830,content://media/external/images/media/5830,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0014.jpg",image/jpeg,1200,1600,0,442934,,1637518220,1566721381000,0,0,0,0,,,,,,,,,,, +19238,5926,content://media/external/images/media/5926,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0013.jpg",image/jpeg,1600,1200,0,269297,,1637518220,1566721381000,0,0,0,0,,,,,,,,,,, +19239,6040,content://media/external/images/media/6040,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0010.jpg",image/jpeg,1600,1200,0,275833,,1637518220,1566721380000,0,0,0,0,,,,,,,,,,, +19240,6041,content://media/external/images/media/6041,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0011.jpg",image/jpeg,1600,1200,0,319720,,1637518220,1566721380000,0,0,0,0,,,,,,,,,,, +19241,6162,content://media/external/images/media/6162,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0012.jpg",image/jpeg,1600,1200,0,281521,,1637518221,1566721380000,0,0,0,0,,,,,,,,,,, +19242,5829,content://media/external/images/media/5829,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0008.jpg",image/jpeg,1600,1200,0,340756,,1637518220,1566721379000,0,0,0,0,,,,,,,,,,, +19243,5925,content://media/external/images/media/5925,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0009.jpg",image/jpeg,1600,1200,0,343056,,1637518220,1566721379000,0,0,0,0,,,,,,,,,,, +19244,6161,content://media/external/images/media/6161,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0007.jpg",image/jpeg,1600,1200,0,321415,,1637518221,1566721378000,0,0,0,0,,,,,,,,,,, +19245,6039,content://media/external/images/media/6039,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0006.jpg",image/jpeg,1600,1200,0,191310,,1637518220,1566721377000,0,0,0,0,,,,,,,,,,, +19246,6160,content://media/external/images/media/6160,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0005.jpg",image/jpeg,1600,1200,0,262338,,1637518220,1566721377000,0,0,0,0,,,,,,,,,,, +19247,5828,content://media/external/images/media/5828,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0004.jpg",image/jpeg,1600,1200,0,223454,,1637518220,1566721376000,0,0,0,0,,,,,,,,,,, +19248,5924,content://media/external/images/media/5924,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0003.jpg",image/jpeg,1600,1202,0,284205,,1637518220,1566721376000,0,0,0,0,,,,,,,,,,, +19249,6038,content://media/external/images/media/6038,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0002.jpg",image/jpeg,1600,898,0,230393,,1637518220,1566721376000,0,0,0,0,,,,,,,,,,, +19250,3317,content://media/external/images/media/3317,/storage/emulated/0/DCIM/Camera/IMG_20190824_195143.jpg,image/jpeg,4000,3000,90,5995017,,1637502438,1566669104000,1566669104312,0,0,0,,,,,,,,,,, +19251,4238,content://media/external/images/media/4238,/storage/emulated/0/DCIM/Camera/IMG_20190824_154145.jpg,image/jpeg,4000,3000,90,8409961,,1637504734,1566654106000,1566654106325,0,0,0,,,,,,,,,,, +19252,3415,content://media/external/images/media/3415,/storage/emulated/0/DCIM/Camera/IMG_20190824_154129.jpg,image/jpeg,4000,3000,90,5777194,,1637502682,1566654090000,1566654090860,0,0,0,,,,,,,,,,, +19253,2700,content://media/external/images/media/2700,/storage/emulated/0/Pictures/scanner/scanner_20190824_115851.jpg,image/jpeg,674,1062,0,391785,,1637500871,1566640731000,0,0,0,0,,,,,,,,,,, +19254,2699,content://media/external/images/media/2699,/storage/emulated/0/Pictures/scanner/scanner_20190824_115712.jpg,image/jpeg,715,1111,0,422944,,1637500871,1566640632000,0,0,0,0,,,,,,,,,,, +19255,2698,content://media/external/images/media/2698,/storage/emulated/0/Pictures/scanner/scanner_20190824_115708.jpg,image/jpeg,715,1111,0,422944,,1637500871,1566640628000,0,0,0,0,,,,,,,,,,, +19256,3652,content://media/external/images/media/3652,/storage/emulated/0/DCIM/Camera/IMG_20190822_174537.jpg,image/jpeg,4000,3000,90,6572521,,1637503358,1566488739000,1566488738982,0,0,0,,,,,,,,,,, +19257,2728,content://media/external/images/media/2728,/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-08-21-18-43-50-425_com.brytonsport.active.png,image/png,1080,2340,0,452375,,1637500987,1566405830000,0,0,0,0,,,,,,,,,,, +19258,4409,content://media/external/images/media/4409,/storage/emulated/0/DCIM/Camera/IMG_20190821_115621.jpg,image/jpeg,4000,3000,90,7884212,,1637505062,1566381382000,1566381382556,0,0,0,,,,,,,,,,, +19259,4520,content://media/external/images/media/4520,/storage/emulated/0/DCIM/Camera/IMG_20190821_113736.jpg,image/jpeg,4160,3120,0,9861784,,1637505165,1566380256000,1566380256400,0,0,0,,,,,,,,,,, +19260,2936,content://media/external/images/media/2936,/storage/emulated/0/DCIM/Camera/PANO_20190821_112340.jpg,image/jpeg,9776,3744,0,10162158,,1637501599,1566379735000,0,0,0,0,,,,,,,,,,, +19261,3123,content://media/external/images/media/3123,/storage/emulated/0/DCIM/Camera/IMG_20190821_112427.jpg,image/jpeg,4160,3120,0,7833126,,1637502068,1566379735000,1566379467379,0,0,0,,,,,,,,,,, +19262,3280,content://media/external/images/media/3280,/storage/emulated/0/DCIM/Camera/IMG_20190821_112424.jpg,image/jpeg,4160,3120,0,7607067,,1637502355,1566379735000,1566379464440,0,0,0,,,,,,,,,,, +19263,3298,content://media/external/images/media/3298,/storage/emulated/0/DCIM/Camera/IMG_20190821_111415.jpg,image/jpeg,4160,3120,90,8269443,,1637502430,1566379735000,1566378855530,0,0,0,,,,,,,,,,, +19264,3466,content://media/external/images/media/3466,/storage/emulated/0/DCIM/Camera/IMG_20190821_111811.jpg,image/jpeg,4160,3120,0,8063393,,1637502817,1566379735000,1566379091214,0,0,0,,,,,,,,,,, +19265,4858,content://media/external/images/media/4858,/storage/emulated/0/DCIM/Camera/IMG_20190821_112419.jpg,image/jpeg,4160,3120,0,7694703,,1637505831,1566379735000,1566379459650,0,0,0,,,,,,,,,,, +19266,4711,content://media/external/images/media/4711,/storage/emulated/0/DCIM/Camera/IMG_20190821_110931.jpg,image/jpeg,4160,3120,0,10927404,,1637505565,1566378571000,1566378570935,0,0,0,,,,,,,,,,, +19267,3572,content://media/external/images/media/3572,/storage/emulated/0/DCIM/Camera/IMG_20190821_095815.jpg,image/jpeg,4000,3000,0,5591172,,1637503154,1566374298000,1566374298280,0,0,0,,,,,,,,,,, +19268,4464,content://media/external/images/media/4464,/storage/emulated/0/DCIM/Camera/IMG_20190821_095813.jpg,image/jpeg,4000,3000,0,5570492,,1637505091,1566374295000,1566374295882,0,0,0,,,,,,,,,,, +19269,3316,content://media/external/images/media/3316,/storage/emulated/0/DCIM/Camera/IMG_20190821_095809.jpg,image/jpeg,4000,3000,0,4795204,,1637502438,1566374292000,1566374292836,0,0,0,,,,,,,,,,, +19270,3223,content://media/external/images/media/3223,/storage/emulated/0/DCIM/Camera/IMG_20190820_155749.jpg,image/jpeg,4000,3000,0,5066376,,1637502258,1566309471000,1566309470935,0,0,0,,,,,,,,,,, +19271,5923,content://media/external/images/media/5923,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190820-WA0012.jpg",image/jpeg,1200,1599,0,310524,,1637518220,1566307858000,0,0,0,0,,,,,,,,,,, +19272,5015,content://media/external/images/media/5015,/storage/emulated/0/DCIM/Camera/IMG_20190820_115754.jpg,image/jpeg,4000,3000,0,5260412,,1637506134,1566295076000,1566295075975,0,0,0,,,,,,,,,,, +19273,3027,content://media/external/images/media/3027,/storage/emulated/0/DCIM/Camera/IMG_20190819_212840.jpg,image/jpeg,4000,3000,90,5625376,,1637501805,1566242921000,1566242921659,0,0,0,,,,,,,,,,, +19274,4074,content://media/external/images/media/4074,/storage/emulated/0/DCIM/Camera/IMG_20190819_212745.jpg,image/jpeg,4000,3000,90,5666254,,1637504394,1566242866000,1566242866704,0,0,0,,,,,,,,,,, +19275,1012,content://media/external/images/media/1012,/storage/emulated/0/mivideo/images/1566240092755.png,image/png,1080,2259,0,78571,,1637500139,1566240093000,0,0,0,0,,,,,,,,,,, +19276,3222,content://media/external/images/media/3222,/storage/emulated/0/DCIM/Camera/IMG_20190819_134805.jpg,image/jpeg,1080,2161,0,524332,,1637502258,1566215286000,0,0,0,0,,,,,,,,,,, +19277,6159,content://media/external/images/media/6159,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0026.jpg",image/jpeg,1600,1200,0,165306,,1637518220,1566155710000,0,0,0,0,,,,,,,,,,, +19278,6037,content://media/external/images/media/6037,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0025.jpg",image/jpeg,1024,768,0,112159,,1637518220,1566155706000,0,0,0,0,,,,,,,,,,, +19279,5827,content://media/external/images/media/5827,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0024.jpg",image/jpeg,1024,768,0,280125,,1637518220,1566155704000,0,0,0,0,,,,,,,,,,, +19280,6158,content://media/external/images/media/6158,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0023.jpg",image/jpeg,1280,750,0,118779,,1637518220,1566155697000,0,0,0,0,,,,,,,,,,, +19281,6157,content://media/external/images/media/6157,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0022.jpg",image/jpeg,1047,1600,0,410783,,1637518220,1566155692000,0,0,0,0,,,,,,,,,,, +19282,6036,content://media/external/images/media/6036,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0021.jpg",image/jpeg,1024,769,0,130515,,1637518220,1566155685000,0,0,0,0,,,,,,,,,,, +19283,6156,content://media/external/images/media/6156,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0020.jpg",image/jpeg,1600,1200,0,404440,,1637518220,1566155682000,0,0,0,0,,,,,,,,,,, +19284,5922,content://media/external/images/media/5922,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0019.jpg",image/jpeg,1200,1600,0,419914,,1637518220,1566155676000,0,0,0,0,,,,,,,,,,, +19285,5921,content://media/external/images/media/5921,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0018.jpg",image/jpeg,1600,1200,0,284234,,1637518220,1566155667000,0,0,0,0,,,,,,,,,,, +19286,5826,content://media/external/images/media/5826,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0017.jpg",image/jpeg,1600,1200,0,269047,,1637518220,1566155660000,0,0,0,0,,,,,,,,,,, +19287,5825,content://media/external/images/media/5825,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0016.jpg",image/jpeg,1600,1200,0,294300,,1637518220,1566155656000,0,0,0,0,,,,,,,,,,, +19288,5920,content://media/external/images/media/5920,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0015.jpg",image/jpeg,1600,1022,0,256233,,1637518220,1566155634000,0,0,0,0,,,,,,,,,,, +19289,6035,content://media/external/images/media/6035,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0014.jpg",image/jpeg,1599,899,0,226551,,1637518220,1566138178000,0,0,0,0,,,,,,,,,,, +19290,6155,content://media/external/images/media/6155,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0013.jpg",image/jpeg,899,1599,0,153820,,1637518220,1566138155000,0,0,0,0,,,,,,,,,,, +19291,6034,content://media/external/images/media/6034,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0012.jpg",image/jpeg,899,1599,0,259736,,1637518220,1566138121000,0,0,0,0,,,,,,,,,,, +19292,6033,content://media/external/images/media/6033,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0011.jpg",image/jpeg,899,1599,0,204111,,1637518220,1566138116000,0,0,0,0,,,,,,,,,,, +19293,3616,content://media/external/images/media/3616,/storage/emulated/0/DCIM/Camera/IMG_20190818_154043.jpg,image/jpeg,4160,3120,0,5977880,,1637503271,1566135643000,1566135643275,0,0,0,,,,,,,,,,, +19294,6154,content://media/external/images/media/6154,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0010.jpg",image/jpeg,966,1288,0,165950,,1637518220,1566131053000,0,0,0,0,,,,,,,,,,, +19295,5824,content://media/external/images/media/5824,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0009.jpg",image/jpeg,1040,780,0,46442,,1637518220,1566130390000,0,0,0,0,,,,,,,,,,, +19296,3784,content://media/external/images/media/3784,/storage/emulated/0/DCIM/Camera/IMG_20190818_124946.jpg,image/jpeg,4160,3120,90,3731735,,1637503558,1566125386000,1566125386681,0,0,0,,,,,,,,,,, +19297,3333,content://media/external/images/media/3333,/storage/emulated/0/DCIM/Camera/IMG_20190818_124942.jpg,image/jpeg,4160,3120,90,3741794,,1637502439,1566125382000,1566125382836,0,0,0,,,,,,,,,,, +19298,4791,content://media/external/images/media/4791,/storage/emulated/0/DCIM/Camera/IMG_20190818_124840.jpg,image/jpeg,4000,3000,90,4614609,,1637505663,1566125322000,1566125322551,0,0,0,,,,,,,,,,, +19299,4857,content://media/external/images/media/4857,/storage/emulated/0/DCIM/Camera/IMG_20190818_124817.jpg,image/jpeg,4000,3000,90,6511358,,1637505830,1566125299000,1566125299265,0,0,0,,,,,,,,,,, +19300,6153,content://media/external/images/media/6153,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0008.jpg",image/jpeg,780,1040,0,48792,,1637518220,1566124004000,0,0,0,0,,,,,,,,,,, +19301,6032,content://media/external/images/media/6032,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0007.jpg",image/jpeg,1200,1599,0,158472,,1637518220,1566121621000,0,0,0,0,,,,,,,,,,, +19302,6152,content://media/external/images/media/6152,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0004.jpg",image/jpeg,1280,960,0,80270,,1637518220,1566119073000,0,0,0,0,,,,,,,,,,, +19303,6031,content://media/external/images/media/6031,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0003.jpg",image/jpeg,780,1040,0,43041,,1637518220,1566117241000,0,0,0,0,,,,,,,,,,, +19304,6030,content://media/external/images/media/6030,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0002.jpg",image/jpeg,898,1600,0,309596,,1637518220,1566114793000,0,0,0,0,,,,,,,,,,, +19305,5823,content://media/external/images/media/5823,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0001.jpg",image/jpeg,1200,1600,0,153210,,1637518220,1566114760000,0,0,0,0,,,,,,,,,,, +19306,2690,content://media/external/images/media/2690,/storage/emulated/0/Pictures/AdobeLightroom/LRM_EXPORT_135862161356858_20190818_090807768.jpeg,image/jpeg,5184,3880,0,4621959,,1637500871,1566112093000,0,0,0,0,,,,,,,,,,, +19307,4198,content://media/external/images/media/4198,/storage/emulated/0/DCIM/Camera/IMG_20190818_085745.jpg,image/jpeg,3120,4160,0,4675377,,1637504640,1566111467000,1565949430477,0,0,0,,,,,,,,,,, +19308,4481,content://media/external/images/media/4481,/storage/emulated/0/DCIM/Camera/IMG_20190818_085718.jpg,image/jpeg,3120,4160,0,2387862,,1637505122,1566111440000,1565949442968,0,0,0,,,,,,,,,,, +19309,5014,content://media/external/images/media/5014,/storage/emulated/0/DCIM/Camera/IMG_20190818_085642.jpg,image/jpeg,3120,4160,0,2338218,,1637506134,1566111406000,1565949447079,0,0,0,,,,,,,,,,, +19310,3718,content://media/external/images/media/3718,/storage/emulated/0/DCIM/Camera/IMG_20190818_085612.jpg,image/jpeg,4160,3120,0,2072402,,1637503477,1566111373000,1565949459784,0,0,0,,,,,,,,,,, +19311,4428,content://media/external/images/media/4428,/storage/emulated/0/DCIM/Camera/IMG_20190818_085550.jpg,image/jpeg,4160,3120,0,3796505,,1637505068,1566111353000,1565949496524,0,0,0,,,,,,,,,,, +19312,4946,content://media/external/images/media/4946,/storage/emulated/0/DCIM/Camera/IMG_20190818_085517.jpg,image/jpeg,4160,3120,0,3003866,,1637506015,1566111319000,1565949501797,0,0,0,,,,,,,,,,, +19313,3865,content://media/external/images/media/3865,/storage/emulated/0/DCIM/Camera/IMG_20190818_085448.jpg,image/jpeg,4160,3120,0,2957474,,1637503729,1566111290000,1565949501797,0,0,0,,,,,,,,,,, +19314,3002,content://media/external/images/media/3002,/storage/emulated/0/DCIM/Camera/IMG_20190818_085419.jpg,image/jpeg,4160,3120,0,2885367,,1637501786,1566111261000,1565949505835,0,0,0,,,,,,,,,,, +19315,4730,content://media/external/images/media/4730,/storage/emulated/0/DCIM/Camera/IMG_20190818_085357.jpg,image/jpeg,4160,3120,0,2895680,,1637505574,1566111239000,1565949505835,0,0,0,,,,,,,,,,, +19316,4339,content://media/external/images/media/4339,/storage/emulated/0/DCIM/Camera/IMG_20190818_085337.jpg,image/jpeg,4160,3120,0,2923368,,1637504906,1566111219000,1565949505835,0,0,0,,,,,,,,,,, +19317,3063,content://media/external/images/media/3063,/storage/emulated/0/DCIM/Camera/IMG_20190818_085314.jpg,image/jpeg,4160,3120,0,2889119,,1637501905,1566111197000,1565949505835,0,0,0,,,,,,,,,,, +19318,3740,content://media/external/images/media/3740,/storage/emulated/0/DCIM/Camera/IMG_20190818_085249.jpg,image/jpeg,4160,3120,0,2886474,,1637503488,1566111172000,1565949505835,0,0,0,,,,,,,,,,, +19319,3864,content://media/external/images/media/3864,/storage/emulated/0/DCIM/Camera/IMG_20190818_085226.jpg,image/jpeg,4160,3120,0,2901129,,1637503728,1566111148000,1565949505835,0,0,0,,,,,,,,,,, +19320,4389,content://media/external/images/media/4389,/storage/emulated/0/DCIM/Camera/IMG_20190818_085037.jpg,image/jpeg,4160,3120,0,2893597,,1637505004,1566111039000,1565949505835,0,0,0,,,,,,,,,,, +19321,4694,content://media/external/images/media/4694,/storage/emulated/0/DCIM/Camera/IMG_20190818_084857.jpg,image/jpeg,4160,3120,0,2908695,,1637505509,1566110939000,1565949505835,0,0,0,,,,,,,,,,, +19322,5919,content://media/external/images/media/5919,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0000.jpg",image/jpeg,747,1328,0,66025,,1637518220,1566110147000,0,0,0,0,,,,,,,,,,, +19323,6029,content://media/external/images/media/6029,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0040.jpg",image/jpeg,1600,1200,0,238655,,1637518220,1566067424000,0,0,0,0,,,,,,,,,,, +19324,6151,content://media/external/images/media/6151,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0039.jpg",image/jpeg,899,1599,0,163702,,1637518220,1566063591000,0,0,0,0,,,,,,,,,,, +19325,5822,content://media/external/images/media/5822,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0038.jpg",image/jpeg,777,1600,0,91433,,1637518220,1566063343000,0,0,0,0,,,,,,,,,,, +19326,6150,content://media/external/images/media/6150,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0037.jpg",image/jpeg,1599,1200,0,565709,,1637518220,1566053601000,0,0,0,0,,,,,,,,,,, +19327,6149,content://media/external/images/media/6149,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0036.jpg",image/jpeg,1200,1599,0,283858,,1637518220,1566053600000,0,0,0,0,,,,,,,,,,, +19328,6027,content://media/external/images/media/6027,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0034.jpg",image/jpeg,1599,1200,0,528667,,1637518220,1566053599000,0,0,0,0,,,,,,,,,,, +19329,6028,content://media/external/images/media/6028,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0035.jpg",image/jpeg,1599,1200,0,450503,,1637518220,1566053599000,0,0,0,0,,,,,,,,,,, +19330,5918,content://media/external/images/media/5918,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0033.jpg",image/jpeg,1599,1200,0,638832,,1637518220,1566053598000,0,0,0,0,,,,,,,,,,, +19331,5821,content://media/external/images/media/5821,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0032.jpg",image/jpeg,1599,1200,0,541847,,1637518220,1566053597000,0,0,0,0,,,,,,,,,,, +19332,6026,content://media/external/images/media/6026,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0031.jpg",image/jpeg,1599,1200,0,487707,,1637518220,1566053594000,0,0,0,0,,,,,,,,,,, +19333,6025,content://media/external/images/media/6025,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0030.jpg",image/jpeg,1200,1599,0,543716,,1637518220,1566053589000,0,0,0,0,,,,,,,,,,, +19334,5820,content://media/external/images/media/5820,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0029.jpg",image/jpeg,1599,1200,0,241601,,1637518220,1566053580000,0,0,0,0,,,,,,,,,,, +19335,6148,content://media/external/images/media/6148,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0028.jpg",image/jpeg,1599,1200,0,248101,,1637518220,1566053137000,0,0,0,0,,,,,,,,,,, +19336,5917,content://media/external/images/media/5917,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0027.jpg",image/jpeg,1599,1200,0,144301,,1637518220,1566053136000,0,0,0,0,,,,,,,,,,, +19337,7055,content://media/external/images/media/7055,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0025.jpg",image/jpeg,1200,1600,0,266290,,1637518222,1566051183000,0,0,0,0,,,,,,,,,,, +19338,6615,content://media/external/images/media/6615,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0023.jpg",image/jpeg,1600,1200,0,180110,,1637518221,1566044107000,0,0,0,0,,,,,,,,,,, +19339,6708,content://media/external/images/media/6708,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0024.jpg",image/jpeg,1200,1600,0,227199,,1637518222,1566044107000,0,0,0,0,,,,,,,,,,, +19340,6814,content://media/external/images/media/6814,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0022.jpg",image/jpeg,720,1280,0,42792,,1637518222,1566040693000,0,0,0,0,,,,,,,,,,, +19341,7054,content://media/external/images/media/7054,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0021.jpg",image/jpeg,899,1600,0,148478,,1637518222,1566038612000,0,0,0,0,,,,,,,,,,, +19342,2922,content://media/external/images/media/2922,/storage/emulated/0/DCIM/Camera/IMG_20190817_124132.jpg,image/jpeg,4000,3000,0,7512689,,1637501599,1566038494000,1566038494396,0,0,0,,,,,,,,,,, +19343,6269,content://media/external/images/media/6269,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0019.jpg",image/jpeg,1040,780,0,85845,,1637518221,1566038340000,0,0,0,0,,,,,,,,,,, +19344,4626,content://media/external/images/media/4626,/storage/emulated/0/DCIM/Camera/IMG_20190817_120830.jpg,image/jpeg,8000,6000,90,37005510,,1637505390,1566036513000,1566036512932,0,0,0,,,,,,,,,,, +19345,6268,content://media/external/images/media/6268,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0018.jpg",image/jpeg,1600,1200,0,131723,,1637518221,1566035984000,0,0,0,0,,,,,,,,,,, +19346,6813,content://media/external/images/media/6813,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0017.jpg",image/jpeg,1200,1599,0,227663,,1637518222,1566035691000,0,0,0,0,,,,,,,,,,, +19347,3358,content://media/external/images/media/3358,/storage/emulated/0/DCIM/Camera/IMG_20190817_114622.jpg,image/jpeg,8000,6000,90,24497988,,1637502451,1566035184000,1566035184693,0,0,0,,,,,,,,,,, +19348,4350,content://media/external/images/media/4350,/storage/emulated/0/DCIM/Camera/IMG_20190817_114610.jpg,image/jpeg,4000,3000,90,8896773,,1637504970,1566035171000,1566035171565,0,0,0,,,,,,,,,,, +19349,3465,content://media/external/images/media/3465,/storage/emulated/0/DCIM/Camera/IMG_20190817_112410.jpg,image/jpeg,8000,6000,90,21209524,,1637502817,1566033852000,1566033852636,0,0,0,,,,,,,,,,, +19350,6267,content://media/external/images/media/6267,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0014.jpg",image/jpeg,1600,898,0,143566,,1637518221,1566033255000,0,0,0,0,,,,,,,,,,, +19351,6614,content://media/external/images/media/6614,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0013.jpg",image/jpeg,1040,780,0,93241,,1637518221,1566033255000,0,0,0,0,,,,,,,,,,, +19352,6936,content://media/external/images/media/6936,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0012.jpg",image/jpeg,1040,780,0,55947,,1637518222,1566033255000,0,0,0,0,,,,,,,,,,, +19353,6706,content://media/external/images/media/6706,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0011.jpg",image/jpeg,1200,1600,0,192432,,1637518222,1566033254000,0,0,0,0,,,,,,,,,,, +19354,2980,content://media/external/images/media/2980,/storage/emulated/0/DCIM/Camera/IMG_20190817_111137.jpg,image/jpeg,4000,3000,0,5202576,,1637501771,1566033099000,1566033099768,0,0,0,,,,,,,,,,, +19355,4372,content://media/external/images/media/4372,/storage/emulated/0/DCIM/Camera/IMG_20190817_111125.jpg,image/jpeg,4160,3120,0,7769942,,1637504982,1566033085000,1566033085325,0,0,0,,,,,,,,,,, +19356,4338,content://media/external/images/media/4338,/storage/emulated/0/DCIM/Camera/IMG_20190817_111115.jpg,image/jpeg,4000,3000,0,8137225,,1637504906,1566033076000,1566033076202,0,0,0,,,,,,,,,,, +19357,4371,content://media/external/images/media/4371,/storage/emulated/0/DCIM/Camera/IMG_20190817_110645.jpg,image/jpeg,4000,3000,90,6494681,,1637504982,1566032806000,1566032806587,0,0,0,,,,,,,,,,, +19358,3393,content://media/external/images/media/3393,/storage/emulated/0/DCIM/Camera/IMG_20190817_105135.jpg,image/jpeg,4160,3120,90,7705098,,1637502598,1566031895000,1566031894987,0,0,0,,,,,,,,,,, +19359,3392,content://media/external/images/media/3392,/storage/emulated/0/DCIM/Camera/IMG_20190817_104656.jpg,image/jpeg,4160,3120,0,7184580,,1637502598,1566031616000,1566031616616,0,0,0,,,,,,,,,,, +19360,2873,content://media/external/images/media/2873,/storage/emulated/0/DCIM/Camera/IMG_20190817_104652.jpg,image/jpeg,4160,3120,0,7414571,,1637501460,1566031613000,1566031612950,0,0,0,,,,,,,,,,, +19361,4197,content://media/external/images/media/4197,/storage/emulated/0/DCIM/Camera/IMG_20190817_104649.jpg,image/jpeg,4160,3120,0,7951712,,1637504640,1566031610000,1566031609907,0,0,0,,,,,,,,,,, +19362,4599,content://media/external/images/media/4599,/storage/emulated/0/DCIM/Camera/IMG_20190817_104611.jpg,image/jpeg,4160,3120,0,4851501,,1637505308,1566031571000,1566031571079,0,0,0,,,,,,,,,,, +19363,2838,content://media/external/images/media/2838,/storage/emulated/0/DCIM/Camera/IMG_20190817_104601.jpg,image/jpeg,4160,3120,0,7023136,,1637501431,1566031561000,1566031561346,0,0,0,,,,,,,,,,, +19364,6934,content://media/external/images/media/6934,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0009.jpg",image/jpeg,1200,1600,0,525777,,1637518222,1566028723000,0,0,0,0,,,,,,,,,,, +19365,3634,content://media/external/images/media/3634,/storage/emulated/0/DCIM/Camera/IMG_20190817_095401.jpg,image/jpeg,8000,6000,90,32108375,,1637503301,1566028443000,1566028443434,0,0,0,,,,,,,,,,, +19366,6935,content://media/external/images/media/6935,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0008.jpg",image/jpeg,1200,1599,0,314598,,1637518222,1566026879000,0,0,0,0,,,,,,,,,,, +19367,3026,content://media/external/images/media/3026,/storage/emulated/0/DCIM/Camera/IMG_20190817_092610.jpg,image/jpeg,4000,3000,90,11114660,,1637501805,1566026771000,1566026771746,0,0,0,,,,,,,,,,, +19368,6392,content://media/external/images/media/6392,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0007.jpg",image/jpeg,1600,497,0,75939,,1637518221,1566026649000,0,0,0,0,,,,,,,,,,, +19369,6933,content://media/external/images/media/6933,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0006.jpg",image/jpeg,1600,497,0,79147,,1637518222,1566026648000,0,0,0,0,,,,,,,,,,, +19370,6932,content://media/external/images/media/6932,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0004.jpg",image/jpeg,1200,1600,0,208297,,1637518222,1566026374000,0,0,0,0,,,,,,,,,,, +19371,7053,content://media/external/images/media/7053,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0005.jpg",image/jpeg,1600,1200,0,123674,,1637518222,1566026374000,0,0,0,0,,,,,,,,,,, +19372,7052,content://media/external/images/media/7052,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0000.jpg",image/jpeg,747,1328,0,93296,,1637518222,1566023816000,0,0,0,0,,,,,,,,,,, +19373,4887,content://media/external/images/media/4887,/storage/emulated/0/DCIM/Camera/IMG_20190816_211432.jpg,image/jpeg,2128,1403,0,807022,,1637505920,1565982872000,1565982814282,0,0,0,,,,,,,,,,, +19374,3863,content://media/external/images/media/3863,/storage/emulated/0/DCIM/Camera/IMG_20190816_211333.jpg,image/jpeg,4000,3000,0,6108796,,1637503728,1565982814000,1565982814282,0,0,0,,,,,,,,,,, +19375,6812,content://media/external/images/media/6812,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0045.jpg",image/jpeg,1130,1600,0,369056,,1637518222,1565980343000,0,0,0,0,,,,,,,,,,, +19376,6811,content://media/external/images/media/6811,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0044.jpg",image/jpeg,747,1328,0,85479,,1637518222,1565978630000,0,0,0,0,,,,,,,,,,, +19377,6391,content://media/external/images/media/6391,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0043.jpg",image/jpeg,1080,714,0,35856,,1637518221,1565976568000,0,0,0,0,,,,,,,,,,, +19378,7051,content://media/external/images/media/7051,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0042.jpg",image/jpeg,1600,1202,0,253848,,1637518222,1565971874000,0,0,0,0,,,,,,,,,,, +19379,6931,content://media/external/images/media/6931,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0041.jpg",image/jpeg,1328,747,0,133768,,1637518222,1565970695000,0,0,0,0,,,,,,,,,,, +19380,7050,content://media/external/images/media/7050,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0040.jpg",image/jpeg,747,1328,0,176309,,1637518222,1565970647000,0,0,0,0,,,,,,,,,,, +19381,6930,content://media/external/images/media/6930,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0039.jpg",image/jpeg,747,1328,0,118280,,1637518222,1565970579000,0,0,0,0,,,,,,,,,,, +19382,6390,content://media/external/images/media/6390,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0011.jpg",image/jpeg,1200,1600,0,228445,,1637518221,1565969132000,0,0,0,0,,,,,,,,,,, +19383,6266,content://media/external/images/media/6266,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0010.jpg",image/jpeg,960,1280,0,167449,,1637518221,1565968755000,0,0,0,0,,,,,,,,,,, +19384,6613,content://media/external/images/media/6613,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0009.jpg",image/jpeg,800,1600,0,98508,,1637518221,1565965951000,0,0,0,0,,,,,,,,,,, +19385,6928,content://media/external/images/media/6928,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0008.jpg",image/jpeg,1600,1202,0,216444,,1637518222,1565965950000,0,0,0,0,,,,,,,,,,, +19386,5010,content://media/external/images/media/5010,/storage/emulated/0/DCIM/Camera/PANO_20190816_143658.jpg,image/jpeg,8400,3776,0,6419038,,1637506101,1565959029000,0,0,0,0,,,,,,,,,,, +19387,4337,content://media/external/images/media/4337,/storage/emulated/0/DCIM/Camera/IMG_20190816_143313.jpg,image/jpeg,4000,3000,0,7164425,,1637504906,1565958794000,1565958794149,0,0,0,,,,,,,,,,, +19388,4559,content://media/external/images/media/4559,/storage/emulated/0/DCIM/Camera/IMG_20190816_143308.jpg,image/jpeg,4000,3000,0,7315737,,1637505216,1565958789000,1565958789121,0,0,0,,,,,,,,,,, +19389,4772,content://media/external/images/media/4772,/storage/emulated/0/DCIM/Camera/IMG_20190816_141347.jpg,image/jpeg,4160,3120,0,8170549,,1637505656,1565957627000,1565957627337,0,0,0,,,,,,,,,,, +19390,3976,content://media/external/images/media/3976,/storage/emulated/0/DCIM/Camera/IMG_20190816_134543.jpg,image/jpeg,4000,3000,90,6985036,,1637504059,1565955944000,1565955944912,0,0,0,,,,,,,,,,, +19391,4639,content://media/external/images/media/4639,/storage/emulated/0/DCIM/Camera/IMG_20190816_134537.jpg,image/jpeg,4000,3000,0,8079921,,1637505414,1565955940000,1565955940033,0,0,0,,,,,,,,,,, +19392,4771,content://media/external/images/media/4771,/storage/emulated/0/DCIM/Camera/IMG_20190816_134435.jpg,image/jpeg,4000,3000,90,8011606,,1637505656,1565955878000,1565955877913,0,0,0,,,,,,,,,,, +19393,3221,content://media/external/images/media/3221,/storage/emulated/0/DCIM/Camera/IMG_20190816_134430.jpg,image/jpeg,4000,3000,90,8390012,,1637502258,1565955871000,1565955871092,0,0,0,,,,,,,,,,, +19394,4237,content://media/external/images/media/4237,/storage/emulated/0/DCIM/Camera/IMG_20190816_134050.jpg,image/jpeg,4160,3120,0,7927384,,1637504734,1565955650000,1565955650543,0,0,0,,,,,,,,,,, +19395,3414,content://media/external/images/media/3414,/storage/emulated/0/DCIM/Camera/IMG_20190816_134041.jpg,image/jpeg,4000,3000,0,9347967,,1637502682,1565955642000,1565955642674,0,0,0,,,,,,,,,,, +19396,4388,content://media/external/images/media/4388,/storage/emulated/0/DCIM/Camera/IMG_20190816_133538.jpg,image/jpeg,4000,3000,0,8159152,,1637505004,1565955341000,1565955341658,0,0,0,,,,,,,,,,, +19397,4277,content://media/external/images/media/4277,/storage/emulated/0/DCIM/Camera/IMG_20190816_133533.jpg,image/jpeg,4000,3000,0,8834850,,1637504807,1565955334000,1565955334633,0,0,0,,,,,,,,,,, +19398,2837,content://media/external/images/media/2837,/storage/emulated/0/DCIM/Camera/IMG_20190816_133529.jpg,image/jpeg,4160,3120,0,7937113,,1637501431,1565955329000,1565955329419,0,0,0,,,,,,,,,,, +19399,3464,content://media/external/images/media/3464,/storage/emulated/0/DCIM/Camera/IMG_20190816_132127.jpg,image/jpeg,4000,3000,0,8400868,,1637502817,1565954488000,1565954488776,0,0,0,,,,,,,,,,, +19400,4303,content://media/external/images/media/4303,/storage/emulated/0/DCIM/Camera/IMG_20190816_132125.jpg,image/jpeg,4000,3000,90,7473268,,1637504817,1565954486000,1565954486584,0,0,0,,,,,,,,,,, +19401,3062,content://media/external/images/media/3062,/storage/emulated/0/DCIM/Camera/IMG_20190816_131605.jpg,image/jpeg,4000,3000,90,6521889,,1637501905,1565954167000,1565954167170,0,0,0,,,,,,,,,,, +19402,4840,content://media/external/images/media/4840,/storage/emulated/0/DCIM/Camera/IMG_20190816_125930.jpg,image/jpeg,4160,3120,0,7385984,,1637505753,1565953170000,1565953170320,0,0,0,,,,,,,,,,, +19403,4444,content://media/external/images/media/4444,/storage/emulated/0/DCIM/Camera/PANO_20190816_125649.jpg,image/jpeg,10160,3776,0,12008020,,1637505068,1565953016000,0,0,0,0,,,,,,,,,,, +19404,3802,content://media/external/images/media/3802,/storage/emulated/0/DCIM/Camera/IMG_20190816_125331.jpg,image/jpeg,4000,3000,0,9790231,,1637503601,1565952813000,1565952813088,0,0,0,,,,,,,,,,, +19405,4052,content://media/external/images/media/4052,/storage/emulated/0/DCIM/Camera/IMG_20190816_123416.jpg,image/jpeg,4160,3120,0,4694221,,1637504342,1565951656000,1565951656864,0,0,0,,,,,,,,,,, +19406,3821,content://media/external/images/media/3821,/storage/emulated/0/DCIM/Camera/IMG_20190816_122615.jpg,image/jpeg,4160,3120,90,5012755,,1637503629,1565951175000,1565951175621,0,0,0,,,,,,,,,,, +19407,3484,content://media/external/images/media/3484,/storage/emulated/0/DCIM/Camera/IMG_20190816_122612.jpg,image/jpeg,4160,3120,90,4576229,,1637502870,1565951172000,1565951172318,0,0,0,,,,,,,,,,, +19408,4257,content://media/external/images/media/4257,/storage/emulated/0/DCIM/Camera/IMG_20190816_122608.jpg,image/jpeg,4160,3120,90,4555506,,1637504756,1565951168000,1565951168528,0,0,0,,,,,,,,,,, +19409,3739,content://media/external/images/media/3739,/storage/emulated/0/DCIM/Camera/IMG_20190816_121025.jpg,image/jpeg,4160,3120,0,4958312,,1637503488,1565950225000,1565950225196,0,0,0,,,,,,,,,,, +19410,4302,content://media/external/images/media/4302,/storage/emulated/0/DCIM/Camera/IMG_20190816_120823.jpg,image/jpeg,4000,3000,90,7291746,,1637504817,1565950107000,1565950107105,0,0,0,,,,,,,,,,, +19411,5013,content://media/external/images/media/5013,/storage/emulated/0/DCIM/Camera/IMG_20190816_120816.jpg,image/jpeg,4000,3000,0,8674402,,1637506134,1565950098000,1565950098149,0,0,0,,,,,,,,,,, +19412,3001,content://media/external/images/media/3001,/storage/emulated/0/DCIM/Camera/IMG_20190816_120812.jpg,image/jpeg,4160,3120,0,8081198,,1637501786,1565950092000,1565950092896,0,0,0,,,,,,,,,,, +19413,2941,content://media/external/images/media/2941,/storage/emulated/0/DCIM/Camera/IMG_20190816_120805.jpg,image/jpeg,4160,3120,0,7789236,,1637501660,1565950085000,1565950085346,0,0,0,,,,,,,,,,, +19414,3938,content://media/external/images/media/3938,/storage/emulated/0/DCIM/Camera/IMG_20190816_120414.jpg,image/jpeg,4160,3120,0,5070129,,1637503853,1565949854000,1565949854311,0,0,0,,,,,,,,,,, +19415,4790,content://media/external/images/media/4790,/storage/emulated/0/DCIM/Camera/IMG_20190816_120410.jpg,image/jpeg,4160,3120,0,7431049,,1637505663,1565949850000,1565949849984,0,0,0,,,,,,,,,,, +19416,4856,content://media/external/images/media/4856,/storage/emulated/0/DCIM/Camera/IMG_20190816_115825.jpg,image/jpeg,4160,3120,0,4906503,,1637505830,1565949505000,1565949505835,0,0,0,,,,,,,,,,, +19417,4011,content://media/external/images/media/4011,/storage/emulated/0/DCIM/Camera/IMG_20190816_115821.jpg,image/jpeg,4160,3120,0,5065113,,1637504201,1565949501000,1565949501797,0,0,0,,,,,,,,,,, +19418,4219,content://media/external/images/media/4219,/storage/emulated/0/DCIM/Camera/IMG_20190816_115816.jpg,image/jpeg,4160,3120,0,6473378,,1637504726,1565949496000,1565949496524,0,0,0,,,,,,,,,,, +19419,2940,content://media/external/images/media/2940,/storage/emulated/0/DCIM/Camera/IMG_20190816_115739.jpg,image/jpeg,4160,3120,0,3815722,,1637501660,1565949459000,1565949459784,0,0,0,,,,,,,,,,, +19420,2939,content://media/external/images/media/2939,/storage/emulated/0/DCIM/Camera/IMG_20190816_115727.jpg,image/jpeg,4160,3120,90,4069716,,1637501660,1565949447000,1565949447079,0,0,0,,,,,,,,,,, +19421,3432,content://media/external/images/media/3432,/storage/emulated/0/DCIM/Camera/IMG_20190816_115723.jpg,image/jpeg,4160,3120,90,4141666,,1637502783,1565949443000,1565949442968,0,0,0,,,,,,,,,,, +19422,3357,content://media/external/images/media/3357,/storage/emulated/0/DCIM/Camera/IMG_20190816_115716.jpg,image/jpeg,4160,3120,90,4318786,,1637502451,1565949436000,1565949436674,0,0,0,,,,,,,,,,, +19423,3571,content://media/external/images/media/3571,/storage/emulated/0/DCIM/Camera/IMG_20190816_115710.jpg,image/jpeg,4160,3120,90,7562899,,1637503154,1565949430000,1565949430477,0,0,0,,,,,,,,,,, +19424,3483,content://media/external/images/media/3483,/storage/emulated/0/DCIM/Camera/IMG_20190816_115638.jpg,image/jpeg,5184,3880,0,5138004,,1637502870,1565949399000,1565949399674,0,0,0,,,,,,,,,,, +19425,3915,content://media/external/images/media/3915,/storage/emulated/0/DCIM/Camera/IMG_20190816_113658.jpg,image/jpeg,4160,3120,0,7975083,,1637503834,1565948218000,1565948218819,0,0,0,,,,,,,,,,, +19426,3025,content://media/external/images/media/3025,/storage/emulated/0/DCIM/Camera/IMG_20190816_112421.jpg,image/jpeg,4160,3120,0,8004262,,1637501805,1565947461000,1565947461602,0,0,0,,,,,,,,,,, +19427,3122,content://media/external/images/media/3122,/storage/emulated/0/DCIM/Camera/IMG_20190816_112358.jpg,image/jpeg,8000,6000,0,29691205,,1637502068,1565947441000,1565947440909,0,0,0,,,,,,,,,,, +19428,3061,content://media/external/images/media/3061,/storage/emulated/0/DCIM/Camera/IMG_20190816_112259.jpg,image/jpeg,4160,3120,90,8638623,,1637501905,1565947379000,1565947379149,0,0,0,,,,,,,,,,, +19429,3279,content://media/external/images/media/3279,/storage/emulated/0/DCIM/Camera/IMG_20190816_112254.jpg,image/jpeg,4160,3120,0,8655247,,1637502355,1565947374000,1565947374640,0,0,0,,,,,,,,,,, +19430,3596,content://media/external/images/media/3596,/storage/emulated/0/DCIM/Camera/IMG_20190816_111351.jpg,image/jpeg,4000,3000,90,8428194,,1637503238,1565946833000,1565946833076,0,0,0,,,,,,,,,,, +19431,4370,content://media/external/images/media/4370,/storage/emulated/0/DCIM/Camera/IMG_20190816_104032.jpg,image/jpeg,8000,6000,0,27939021,,1637504982,1565944834000,1565944834005,0,0,0,,,,,,,,,,, +19432,4749,content://media/external/images/media/4749,/storage/emulated/0/DCIM/Camera/IMG_20190816_101134.jpg,image/jpeg,8000,6000,90,24987671,,1637505639,1565943096000,1565943096504,0,0,0,,,,,,,,,,, +19433,4886,content://media/external/images/media/4886,/storage/emulated/0/DCIM/Camera/IMG_20190816_101128.jpg,image/jpeg,4000,3000,90,7959881,,1637505920,1565943091000,1565943091127,0,0,0,,,,,,,,,,, +19434,3547,content://media/external/images/media/3547,/storage/emulated/0/DCIM/Camera/IMG_20190816_095458.jpg,image/jpeg,4000,3000,90,5862589,,1637503058,1565942102000,1565942102641,0,0,0,,,,,,,,,,, +19435,4147,content://media/external/images/media/4147,/storage/emulated/0/DCIM/Camera/IMG_20190816_095454.jpg,image/jpeg,4000,3000,90,8044663,,1637504481,1565942095000,1565942095828,0,0,0,,,,,,,,,,, +19436,3201,content://media/external/images/media/3201,/storage/emulated/0/DCIM/Camera/IMG_20190816_095449.jpg,image/jpeg,4160,3120,90,7440786,,1637502256,1565942089000,1565942089221,0,0,0,,,,,,,,,,, +19437,4693,content://media/external/images/media/4693,/storage/emulated/0/DCIM/Camera/IMG_20190816_094956.jpg,image/jpeg,4160,3120,0,7364771,,1637505509,1565941796000,1565941796206,0,0,0,,,,,,,,,,, +19438,3994,content://media/external/images/media/3994,/storage/emulated/0/DCIM/Camera/IMG_20190816_094947.jpg,image/jpeg,4000,3000,0,7308163,,1637504086,1565941788000,1565941788154,0,0,0,,,,,,,,,,, +19439,3507,content://media/external/images/media/3507,/storage/emulated/0/DCIM/Camera/IMG_20190816_094943.jpg,image/jpeg,4000,3000,0,7694781,,1637502969,1565941786000,1565941786870,0,0,0,,,,,,,,,,, +19440,3463,content://media/external/images/media/3463,/storage/emulated/0/DCIM/Camera/IMG_20190816_092604.jpg,image/jpeg,4000,3000,90,7146573,,1637502817,1565940367000,1565940367493,0,0,0,,,,,,,,,,, +19441,4969,content://media/external/images/media/4969,/storage/emulated/0/DCIM/Camera/IMG_20190816_092555.jpg,image/jpeg,4000,3000,90,8411893,,1637506097,1565940356000,1565940356074,0,0,0,,,,,,,,,,, +19442,3315,content://media/external/images/media/3315,/storage/emulated/0/DCIM/Camera/IMG_20190816_092523.jpg,image/jpeg,4000,3000,90,6524851,,1637502438,1565940327000,1565940327878,0,0,0,,,,,,,,,,, +19443,4839,content://media/external/images/media/4839,/storage/emulated/0/DCIM/Camera/IMG_20190816_092517.jpg,image/jpeg,4160,3120,0,7674867,,1637505753,1565940317000,1565940317091,0,0,0,,,,,,,,,,, +19444,4598,content://media/external/images/media/4598,/storage/emulated/0/DCIM/Camera/IMG_20190816_091625.jpg,image/jpeg,4000,3000,0,7517230,,1637505308,1565939787000,1565939787174,0,0,0,,,,,,,,,,, +19445,4030,content://media/external/images/media/4030,/storage/emulated/0/DCIM/Camera/IMG_20190816_085444.jpg,image/jpeg,4160,3120,0,6966928,,1637504234,1565938484000,1565938484187,0,0,0,,,,,,,,,,, +19446,4301,content://media/external/images/media/4301,/storage/emulated/0/DCIM/Camera/IMG_20190816_084708.jpg,image/jpeg,4000,3000,0,7491854,,1637504817,1565938029000,1565938029722,0,0,0,,,,,,,,,,, +19447,4146,content://media/external/images/media/4146,/storage/emulated/0/DCIM/Camera/IMG_20190816_084651.jpg,image/jpeg,8000,6000,0,26845626,,1637504481,1565938013000,1565938013061,0,0,0,,,,,,,,,,, +19448,6389,content://media/external/images/media/6389,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0005.jpg",image/jpeg,1200,1600,0,118647,,1637518221,1565936979000,0,0,0,0,,,,,,,,,,, +19449,7049,content://media/external/images/media/7049,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0004.jpg",image/jpeg,898,1600,0,85946,,1637518222,1565936485000,0,0,0,0,,,,,,,,,,, +19450,7047,content://media/external/images/media/7047,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0003.jpg",image/jpeg,1200,1600,0,138980,,1637518222,1565936413000,0,0,0,0,,,,,,,,,,, +19451,6388,content://media/external/images/media/6388,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0002.jpg",image/jpeg,899,1599,0,124868,,1637518221,1565936161000,0,0,0,0,,,,,,,,,,, +19452,6705,content://media/external/images/media/6705,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0001.jpg",image/jpeg,1200,1600,0,138980,,1637518222,1565935965000,0,0,0,0,,,,,,,,,,, +19453,6612,content://media/external/images/media/6612,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0000.jpg",image/jpeg,1040,780,0,47705,,1637518221,1565935402000,0,0,0,0,,,,,,,,,,, +19454,6387,content://media/external/images/media/6387,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0092.jpg",image/jpeg,1600,1144,0,198291,,1637518221,1565905960000,0,0,0,0,,,,,,,,,,, +19455,6611,content://media/external/images/media/6611,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0091.jpg",image/jpeg,1600,1060,0,147191,,1637518221,1565905947000,0,0,0,0,,,,,,,,,,, +19456,6609,content://media/external/images/media/6609,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0090.jpg",image/jpeg,1600,1580,0,435080,,1637518221,1565901875000,0,0,0,0,,,,,,,,,,, +19457,6704,content://media/external/images/media/6704,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0089.jpg",image/jpeg,1200,1600,0,162869,,1637518222,1565901747000,0,0,0,0,,,,,,,,,,, +19458,6610,content://media/external/images/media/6610,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0088.jpg",image/jpeg,1200,1600,0,208225,,1637518221,1565901739000,0,0,0,0,,,,,,,,,,, +19459,7048,content://media/external/images/media/7048,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0087.jpg",image/jpeg,1600,1200,0,340849,,1637518222,1565901723000,0,0,0,0,,,,,,,,,,, +19460,6929,content://media/external/images/media/6929,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0086.jpg",image/jpeg,1600,1200,0,185063,,1637518222,1565901710000,0,0,0,0,,,,,,,,,,, +19461,6505,content://media/external/images/media/6505,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0085.jpg",image/jpeg,1600,1200,0,269351,,1637518221,1565901693000,0,0,0,0,,,,,,,,,,, +19462,6265,content://media/external/images/media/6265,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0084.jpg",image/jpeg,1600,1200,0,176635,,1637518221,1565901637000,0,0,0,0,,,,,,,,,,, +19463,6808,content://media/external/images/media/6808,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0083.jpg",image/jpeg,1600,1200,0,250270,,1637518222,1565901628000,0,0,0,0,,,,,,,,,,, +19464,6927,content://media/external/images/media/6927,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0082.jpg",image/jpeg,1600,1200,0,299611,,1637518222,1565901579000,0,0,0,0,,,,,,,,,,, +19465,6703,content://media/external/images/media/6703,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0081.jpg",image/jpeg,1600,1200,0,136772,,1637518222,1565901168000,0,0,0,0,,,,,,,,,,, +19466,6264,content://media/external/images/media/6264,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0080.jpg",image/jpeg,1600,1600,0,207849,,1637518221,1565901134000,0,0,0,0,,,,,,,,,,, +19467,6926,content://media/external/images/media/6926,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0079.jpg",image/jpeg,1200,1600,0,300291,,1637518222,1565901033000,0,0,0,0,,,,,,,,,,, +19468,6386,content://media/external/images/media/6386,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0045.jpg",image/jpeg,899,1600,0,133146,,1637518221,1565893699000,0,0,0,0,,,,,,,,,,, +19469,6608,content://media/external/images/media/6608,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0044.jpg",image/jpeg,1000,1000,0,79779,,1637518221,1565892199000,0,0,0,0,,,,,,,,,,, +19470,6810,content://media/external/images/media/6810,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0043.jpg",image/jpeg,1200,1600,0,643292,,1637518222,1565892104000,0,0,0,0,,,,,,,,,,, +19471,7045,content://media/external/images/media/7045,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0042.jpg",image/jpeg,805,1280,0,45529,,1637518222,1565889223000,0,0,0,0,,,,,,,,,,, +19472,6809,content://media/external/images/media/6809,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0041.jpg",image/jpeg,1200,1600,0,245262,,1637518222,1565884605000,0,0,0,0,,,,,,,,,,, +19473,6263,content://media/external/images/media/6263,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0040.jpg",image/jpeg,267,189,0,12431,,1637518221,1565883517000,0,0,0,0,,,,,,,,,,, +19474,6385,content://media/external/images/media/6385,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0039.jpg",image/jpeg,1200,1600,0,277684,,1637518221,1565882593000,0,0,0,0,,,,,,,,,,, +19475,4256,content://media/external/images/media/4256,/storage/emulated/0/DCIM/Camera/IMG_20190815_171023.jpg,image/jpeg,4000,3000,90,7060789,,1637504756,1565881824000,1565881824616,0,0,0,,,,,,,,,,, +19476,6262,content://media/external/images/media/6262,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0038.jpg",image/jpeg,1200,1600,0,230704,,1637518221,1565881241000,0,0,0,0,,,,,,,,,,, +19477,6925,content://media/external/images/media/6925,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0036.jpg",image/jpeg,1599,899,0,346260,,1637518222,1565878600000,0,0,0,0,,,,,,,,,,, +19478,3041,content://media/external/images/media/3041,/storage/emulated/0/DCIM/Camera/IMG_20190815_160836.jpg,image/jpeg,4000,3000,0,6443286,,1637501858,1565878121000,1565878121323,0,0,0,,,,,,,,,,, +19479,3937,content://media/external/images/media/3937,/storage/emulated/0/DCIM/Camera/IMG_20190815_160614.jpg,image/jpeg,8000,6000,90,26344488,,1637503853,1565877976000,1565877976750,0,0,0,,,,,,,,,,, +19480,3677,content://media/external/images/media/3677,/storage/emulated/0/DCIM/Camera/IMG_20190815_160601.jpg,image/jpeg,4000,3000,90,7283904,,1637503389,1565877962000,1565877962617,0,0,0,,,,,,,,,,, +19481,6606,content://media/external/images/media/6606,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0034.jpg",image/jpeg,780,1040,0,96272,,1637518221,1565877426000,0,0,0,0,,,,,,,,,,, +19482,6702,content://media/external/images/media/6702,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0033.jpg",image/jpeg,900,1600,0,242627,,1637518222,1565876981000,0,0,0,0,,,,,,,,,,, +19483,3278,content://media/external/images/media/3278,/storage/emulated/0/DCIM/Camera/IMG_20190815_153438.jpg,image/jpeg,4160,3120,0,8370966,,1637502355,1565876078000,1565876078244,0,0,0,,,,,,,,,,, +19484,3975,content://media/external/images/media/3975,/storage/emulated/0/DCIM/Camera/IMG_20190815_153424.jpg,image/jpeg,8000,6000,0,25730954,,1637504059,1565876066000,1565876065935,0,0,0,,,,,,,,,,, +19485,4463,content://media/external/images/media/4463,/storage/emulated/0/DCIM/Camera/IMG_20190815_153417.jpg,image/jpeg,8000,6000,90,24559468,,1637505091,1565876059000,1565876059372,0,0,0,,,,,,,,,,, +19486,3370,content://media/external/images/media/3370,/storage/emulated/0/DCIM/Camera/IMG_20190815_153411.jpg,image/jpeg,4000,3000,90,9139725,,1637502523,1565876053000,1565876053326,0,0,0,,,,,,,,,,, +19487,6701,content://media/external/images/media/6701,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0031.jpg",image/jpeg,1200,1600,0,386259,,1637518222,1565875603000,0,0,0,0,,,,,,,,,,, +19488,6607,content://media/external/images/media/6607,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0030.jpg",image/jpeg,1600,370,0,128232,,1637518221,1565875580000,0,0,0,0,,,,,,,,,,, +19489,6699,content://media/external/images/media/6699,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0027.jpg",image/jpeg,1376,774,0,153812,,1637518222,1565875511000,0,0,0,0,,,,,,,,,,, +19490,4729,content://media/external/images/media/4729,/storage/emulated/0/DCIM/Camera/IMG_20190815_151650.jpg,image/jpeg,4000,3000,90,7057538,,1637505574,1565875011000,1565875011653,0,0,0,,,,,,,,,,, +19491,3274,content://media/external/images/media/3274,/storage/emulated/0/DCIM/Camera/PANO_20190815_145734.jpg,image/jpeg,10160,3552,0,7637677,,1637502343,1565873864000,0,0,0,0,,,,,,,,,,, +19492,2796,content://media/external/images/media/2796,/storage/emulated/0/DCIM/Camera/PANO_20190815_145715.jpg,image/jpeg,9552,3680,0,7741287,,1637501282,1565873847000,0,0,0,0,,,,,,,,,,, +19493,4336,content://media/external/images/media/4336,/storage/emulated/0/DCIM/Camera/IMG_20190815_145705.jpg,image/jpeg,4160,3120,0,8729234,,1637504906,1565873825000,1565873825664,0,0,0,,,,,,,,,,, +19494,4369,content://media/external/images/media/4369,/storage/emulated/0/DCIM/Camera/IMG_20190815_145702.jpg,image/jpeg,4160,3120,0,6699821,,1637504982,1565873822000,1565873822649,0,0,0,,,,,,,,,,, +19495,3200,content://media/external/images/media/3200,/storage/emulated/0/DCIM/Camera/IMG_20190815_145501.jpg,image/jpeg,4160,3120,0,4193252,,1637502256,1565873701000,1565873701859,0,0,0,,,,,,,,,,, +19496,3546,content://media/external/images/media/3546,/storage/emulated/0/DCIM/Camera/IMG_20190815_145156.jpg,image/jpeg,4160,3120,0,6808480,,1637503058,1565873516000,1565873516430,0,0,0,,,,,,,,,,, +19497,3060,content://media/external/images/media/3060,/storage/emulated/0/DCIM/Camera/IMG_20190815_145125.jpg,image/jpeg,8000,6000,0,22173586,,1637501905,1565873488000,1565873487973,0,0,0,,,,,,,,,,, +19498,2921,content://media/external/images/media/2921,/storage/emulated/0/DCIM/Camera/IMG_20190815_145124.jpg,image/jpeg,8000,6000,0,23714193,,1637501599,1565873485000,1565873485728,0,0,0,,,,,,,,,,, +19499,4164,content://media/external/images/media/4164,/storage/emulated/0/DCIM/Camera/IMG_20190815_145115.jpg,image/jpeg,8000,6000,90,24818976,,1637504556,1565873477000,1565873477440,0,0,0,,,,,,,,,,, +19500,3448,content://media/external/images/media/3448,/storage/emulated/0/DCIM/Camera/IMG_20190815_145112.jpg,image/jpeg,8000,6000,90,25849592,,1637502804,1565873474000,1565873474432,0,0,0,,,,,,,,,,, +19501,3163,content://media/external/images/media/3163,/storage/emulated/0/DCIM/Camera/IMG_20190815_145057.jpg,image/jpeg,5184,3880,0,6517720,,1637502143,1565873458000,1565873458052,0,0,0,,,,,,,,,,, +19502,3260,content://media/external/images/media/3260,/storage/emulated/0/DCIM/Camera/IMG_20190815_145054.jpg,image/jpeg,5184,3880,0,6067053,,1637502342,1565873455000,1565873455715,0,0,0,,,,,,,,,,, +19503,3886,content://media/external/images/media/3886,/storage/emulated/0/DCIM/Camera/IMG_20190815_145052.jpg,image/jpeg,5184,3880,0,6169857,,1637503732,1565873454000,1565873453948,0,0,0,,,,,,,,,,, +19504,3951,content://media/external/images/media/3951,/storage/emulated/0/DCIM/Camera/IMG_20190815_144652.jpg,image/jpeg,5184,3880,0,6779108,,1637503942,1565873213000,1565873213651,0,0,0,,,,,,,,,,, +19505,3545,content://media/external/images/media/3545,/storage/emulated/0/DCIM/Camera/IMG_20190815_144650.jpg,image/jpeg,5184,3880,0,6982675,,1637503058,1565873212000,1565873212500,0,0,0,,,,,,,,,,, +19506,4300,content://media/external/images/media/4300,/storage/emulated/0/DCIM/Camera/IMG_20190815_144629.jpg,image/jpeg,4160,3120,0,8600397,,1637504817,1565873189000,1565873189341,0,0,0,,,,,,,,,,, +19507,4770,content://media/external/images/media/4770,/storage/emulated/0/DCIM/Camera/IMG_20190815_144608.jpg,image/jpeg,4160,3120,0,8137131,,1637505656,1565873168000,1565873168774,0,0,0,,,,,,,,,,, +19508,2872,content://media/external/images/media/2872,/storage/emulated/0/DCIM/Camera/IMG_20190815_144558.jpg,image/jpeg,4000,3000,0,10120895,,1637501460,1565873160000,1565873159884,0,0,0,,,,,,,,,,, +19509,3413,content://media/external/images/media/3413,/storage/emulated/0/DCIM/Camera/IMG_20190815_143756.jpg,image/jpeg,5184,3880,0,7491442,,1637502682,1565872678000,1565872678175,0,0,0,,,,,,,,,,, +19510,4094,content://media/external/images/media/4094,/storage/emulated/0/DCIM/Camera/IMG_20190815_142509.jpg,image/jpeg,4000,3000,90,6290462,,1637504400,1565871910000,1565871910421,0,0,0,,,,,,,,,,, +19511,3332,content://media/external/images/media/3332,/storage/emulated/0/DCIM/Camera/IMG_20190815_142500.jpg,image/jpeg,4000,3000,90,6037147,,1637502439,1565871901000,1565871901719,0,0,0,,,,,,,,,,, +19512,4387,content://media/external/images/media/4387,/storage/emulated/0/DCIM/Camera/IMG_20190815_142357.jpg,image/jpeg,4000,3000,90,6089110,,1637505004,1565871838000,1565871838833,0,0,0,,,,,,,,,,, +19513,4335,content://media/external/images/media/4335,/storage/emulated/0/DCIM/Camera/IMG_20190815_142354.jpg,image/jpeg,4000,3000,90,6177449,,1637504906,1565871835000,1565871835193,0,0,0,,,,,,,,,,, +19514,2979,content://media/external/images/media/2979,/storage/emulated/0/DCIM/Camera/IMG_20190815_142352.jpg,image/jpeg,4000,3000,90,6261327,,1637501771,1565871833000,1565871833449,0,0,0,,,,,,,,,,, +19515,4673,content://media/external/images/media/4673,/storage/emulated/0/DCIM/Camera/IMG_20190815_142350.jpg,image/jpeg,4000,3000,90,6173004,,1637505480,1565871831000,1565871831262,0,0,0,,,,,,,,,,, +19516,4728,content://media/external/images/media/4728,/storage/emulated/0/DCIM/Camera/IMG_20190815_140549.jpg,image/jpeg,4000,3000,90,9473109,,1637505574,1565870750000,1565870750133,0,0,0,,,,,,,,,,, +19517,4657,content://media/external/images/media/4657,/storage/emulated/0/DCIM/Camera/IMG_20190815_140543.jpg,image/jpeg,4000,3000,90,9159822,,1637505417,1565870744000,1565870744762,0,0,0,,,,,,,,,,, +19518,4710,content://media/external/images/media/4710,/storage/emulated/0/DCIM/Camera/IMG_20190815_140337.jpg,image/jpeg,4000,3000,0,9783327,,1637505565,1565870618000,1565870618594,0,0,0,,,,,,,,,,, +19519,7046,content://media/external/images/media/7046,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0026.jpg",image/jpeg,720,915,0,77887,,1637518222,1565867910000,0,0,0,0,,,,,,,,,,, +19520,4346,content://media/external/images/media/4346,/storage/emulated/0/DCIM/Camera/PANO_20190815_130052.jpg,image/jpeg,7440,3776,0,6605888,,1637504907,1565866861000,0,0,0,0,,,,,,,,,,, +19521,3237,content://media/external/images/media/3237,/storage/emulated/0/DCIM/Camera/IMG_20190815_130047.jpg,image/jpeg,4160,3120,0,6808083,,1637502259,1565866847000,1565866847089,0,0,0,,,,,,,,,,, +19522,3993,content://media/external/images/media/3993,/storage/emulated/0/DCIM/Camera/IMG_20190815_130035.jpg,image/jpeg,4000,3000,0,6125002,,1637504085,1565866840000,1565866840006,0,0,0,,,,,,,,,,, +19523,6384,content://media/external/images/media/6384,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0025.jpg",image/jpeg,777,1599,0,228292,,1637518221,1565866773000,0,0,0,0,,,,,,,,,,, +19524,6700,content://media/external/images/media/6700,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0024.jpg",image/jpeg,1202,1600,0,311935,,1637518222,1565865666000,0,0,0,0,,,,,,,,,,, +19525,4906,content://media/external/images/media/4906,/storage/emulated/0/DCIM/Camera/IMG_20190815_122813.jpg,image/jpeg,4160,3120,90,7632611,,1637505944,1565864894000,1565864893898,0,0,0,,,,,,,,,,, +19526,4855,content://media/external/images/media/4855,/storage/emulated/0/DCIM/Camera/IMG_20190815_122802.jpg,image/jpeg,4160,3120,90,7589326,,1637505830,1565864882000,1565864882205,0,0,0,,,,,,,,,,, +19527,4748,content://media/external/images/media/4748,/storage/emulated/0/DCIM/Camera/IMG_20190815_121226.jpg,image/jpeg,5184,3880,270,5762683,,1637505639,1565863948000,1565863947980,0,0,0,,,,,,,,,,, +19528,3024,content://media/external/images/media/3024,/storage/emulated/0/DCIM/Camera/IMG_20190815_121149.jpg,image/jpeg,4160,3120,0,6204387,,1637501805,1565863909000,1565863909526,0,0,0,,,,,,,,,,, +19529,3259,content://media/external/images/media/3259,/storage/emulated/0/DCIM/Camera/IMG_20190815_121139.jpg,image/jpeg,4000,3000,0,7580614,,1637502342,1565863900000,1565863900767,0,0,0,,,,,,,,,,, +19530,6807,content://media/external/images/media/6807,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0022.jpg",image/jpeg,1200,1599,0,471599,,1637518222,1565863593000,0,0,0,0,,,,,,,,,,, +19531,6924,content://media/external/images/media/6924,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0020.jpg",image/jpeg,1333,1000,0,156467,,1637518222,1565862766000,0,0,0,0,,,,,,,,,,, +19532,7044,content://media/external/images/media/7044,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0019.jpg",image/jpeg,720,1280,0,106156,,1637518222,1565862677000,0,0,0,0,,,,,,,,,,, +19533,7042,content://media/external/images/media/7042,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0018.jpg",image/jpeg,1600,900,0,230358,,1637518222,1565856738000,0,0,0,0,,,,,,,,,,, +19534,6806,content://media/external/images/media/6806,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0017.jpg",image/jpeg,1600,1198,0,94999,,1637518222,1565854218000,0,0,0,0,,,,,,,,,,, +19535,6383,content://media/external/images/media/6383,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0015.jpg",image/jpeg,719,480,0,100555,,1637518221,1565853433000,0,0,0,0,,,,,,,,,,, +19536,6698,content://media/external/images/media/6698,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0014.jpg",image/jpeg,1600,1198,0,94999,,1637518222,1565852733000,0,0,0,0,,,,,,,,,,, +19537,7043,content://media/external/images/media/7043,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0012.jpg",image/jpeg,1600,901,0,126753,,1637518222,1565849863000,0,0,0,0,,,,,,,,,,, +19538,6382,content://media/external/images/media/6382,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0011.jpg",image/jpeg,852,1000,0,159575,,1637518221,1565848404000,0,0,0,0,,,,,,,,,,, +19539,6923,content://media/external/images/media/6923,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0009.jpg",image/jpeg,1600,1059,0,289563,,1637518222,1565821920000,0,0,0,0,,,,,,,,,,, +19540,6697,content://media/external/images/media/6697,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0008.jpg",image/jpeg,1600,1059,0,307118,,1637518222,1565821919000,0,0,0,0,,,,,,,,,,, +19541,6922,content://media/external/images/media/6922,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0007.jpg",image/jpeg,1600,1059,0,270163,,1637518222,1565821919000,0,0,0,0,,,,,,,,,,, +19542,6381,content://media/external/images/media/6381,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0005.jpg",image/jpeg,1600,1059,0,278825,,1637518221,1565821918000,0,0,0,0,,,,,,,,,,, +19543,6805,content://media/external/images/media/6805,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0006.jpg",image/jpeg,1600,1059,0,281734,,1637518222,1565821918000,0,0,0,0,,,,,,,,,,, +19544,6380,content://media/external/images/media/6380,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0003.jpg",image/jpeg,1600,1059,0,233932,,1637518221,1565821917000,0,0,0,0,,,,,,,,,,, +19545,6921,content://media/external/images/media/6921,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0002.jpg",image/jpeg,1600,1059,0,209900,,1637518222,1565821917000,0,0,0,0,,,,,,,,,,, +19546,7040,content://media/external/images/media/7040,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0001.jpg",image/jpeg,1600,1059,0,298066,,1637518222,1565821917000,0,0,0,0,,,,,,,,,,, +19547,7041,content://media/external/images/media/7041,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0004.jpg",image/jpeg,1600,1059,0,298331,,1637518222,1565821917000,0,0,0,0,,,,,,,,,,, +19548,6804,content://media/external/images/media/6804,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0000.jpg",image/jpeg,1600,1059,0,317622,,1637518222,1565821916000,0,0,0,0,,,,,,,,,,, +19549,3431,content://media/external/images/media/3431,/storage/emulated/0/DCIM/Camera/IMG_20190815_000710.jpg,image/jpeg,4000,3000,0,5417438,,1637502783,1565820430000,1565820430183,0,0,0,,,,,,,,,,, +19550,6920,content://media/external/images/media/6920,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0017.jpg",image/jpeg,1040,780,0,17615,,1637518222,1565808637000,0,0,0,0,,,,,,,,,,, +19551,6605,content://media/external/images/media/6605,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0016.jpg",image/jpeg,1040,780,0,16033,,1637518221,1565808634000,0,0,0,0,,,,,,,,,,, +19552,6604,content://media/external/images/media/6604,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0015.jpg",image/jpeg,1040,780,0,44907,,1637518221,1565808633000,0,0,0,0,,,,,,,,,,, +19553,6503,content://media/external/images/media/6503,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0014.jpg",image/jpeg,1599,899,0,166228,,1637518221,1565805322000,0,0,0,0,,,,,,,,,,, +19554,6919,content://media/external/images/media/6919,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0013.jpg",image/jpeg,768,1024,0,96393,,1637518222,1565791182000,0,0,0,0,,,,,,,,,,, +19555,6918,content://media/external/images/media/6918,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0010.jpg",image/jpeg,1600,1200,0,207613,,1637518222,1565782931000,0,0,0,0,,,,,,,,,,, +19556,6501,content://media/external/images/media/6501,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0009.jpg",image/jpeg,1200,1600,0,427072,,1637518221,1565781788000,0,0,0,0,,,,,,,,,,, +19557,6696,content://media/external/images/media/6696,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0007.jpg",image/jpeg,899,1600,0,87532,,1637518222,1565781186000,0,0,0,0,,,,,,,,,,, +19558,6917,content://media/external/images/media/6917,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0006.jpg",image/jpeg,898,1600,0,322122,,1637518222,1565781010000,0,0,0,0,,,,,,,,,,, +19559,7039,content://media/external/images/media/7039,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0004.jpg",image/jpeg,898,1600,0,321978,,1637518222,1565780091000,0,0,0,0,,,,,,,,,,, +19560,6695,content://media/external/images/media/6695,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0003.jpg",image/jpeg,747,1328,0,173013,,1637518222,1565779386000,0,0,0,0,,,,,,,,,,, +19561,6261,content://media/external/images/media/6261,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0002.jpg",image/jpeg,420,416,0,27253,,1637518221,1565768899000,0,0,0,0,,,,,,,,,,, +19562,6502,content://media/external/images/media/6502,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0001.jpg",image/jpeg,1200,1600,0,88633,,1637518221,1565768789000,0,0,0,0,,,,,,,,,,, +19563,6603,content://media/external/images/media/6603,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0000.jpg",image/jpeg,898,1600,0,219176,,1637518221,1565764040000,0,0,0,0,,,,,,,,,,, +19564,6916,content://media/external/images/media/6916,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0025.jpg",image/jpeg,1600,800,0,126652,,1637518222,1565722388000,0,0,0,0,,,,,,,,,,, +19565,7038,content://media/external/images/media/7038,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0024.jpg",image/jpeg,750,1334,0,109658,,1637518222,1565720959000,0,0,0,0,,,,,,,,,,, +19566,7037,content://media/external/images/media/7037,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0023.jpg",image/jpeg,1328,747,0,58578,,1637518222,1565718693000,0,0,0,0,,,,,,,,,,, +19567,2727,content://media/external/images/media/2727,/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-08-13-18-24-34-986_com.brytonsport.active.png,image/png,1080,2340,0,906171,,1637500987,1565713475000,0,0,0,0,,,,,,,,,,, +19568,3356,content://media/external/images/media/3356,/storage/emulated/0/DCIM/Camera/IMG_20190813_175557.jpg,image/jpeg,4000,3000,90,5395191,,1637502451,1565711758000,1565711758316,0,0,0,,,,,,,,,,, +19569,3992,content://media/external/images/media/3992,/storage/emulated/0/DCIM/Camera/IMG_20190813_170826.jpg,image/jpeg,4000,3000,90,6139255,,1637504085,1565708907000,1565708907589,0,0,0,,,,,,,,,,, +19570,6694,content://media/external/images/media/6694,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0017.jpg",image/jpeg,750,1334,0,70733,,1637518222,1565707338000,0,0,0,0,,,,,,,,,,, +19571,6803,content://media/external/images/media/6803,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0015.jpg",image/jpeg,1040,383,0,42246,,1637518222,1565688994000,0,0,0,0,,,,,,,,,,, +19572,2886,content://media/external/images/media/2886,/storage/emulated/0/DCIM/Camera/IMG_20190813_112742.jpg,image/jpeg,4160,3120,0,7893094,,1637501516,1565688462000,1565688462202,0,0,0,,,,,,,,,,, +19573,3950,content://media/external/images/media/3950,/storage/emulated/0/DCIM/Camera/IMG_20190813_112712.jpg,image/jpeg,4160,3120,0,7944445,,1637503942,1565688432000,1565688432257,0,0,0,,,,,,,,,,, +19574,2684,content://media/external/images/media/2684,/storage/emulated/0/Pictures/1565688389619.4ed2a9eb-1151-402f-99ea-5b44648d2ac9.jpg,image/jpeg,1500,2000,0,2266295,,1637500871,1565688414000,1565688402916,0,0,0,,,,,,,,,,, +19575,2683,content://media/external/images/media/2683,/storage/emulated/0/Pictures/1565686896617.c82119bf-6ae3-4765-af56-688f24d58a5d.jpg,image/jpeg,2000,1500,0,862923,,1637500871,1565686910000,1565686907254,0,0,0,,,,,,,,,,, +19576,3162,content://media/external/images/media/3162,/storage/emulated/0/DCIM/Camera/IMG_20190813_103753.jpg,image/jpeg,4160,3120,0,7618494,,1637502143,1565685473000,1565685473067,0,0,0,,,,,,,,,,, +19577,2682,content://media/external/images/media/2682,/storage/emulated/0/Pictures/1565685438657.ea8a2049-03c5-4c2f-b810-16f0dc039273.jpg,image/jpeg,2080,1560,0,952650,,1637500871,1565685458000,1565685451898,0,0,0,,,,,,,,,,, +19578,4051,content://media/external/images/media/4051,/storage/emulated/0/DCIM/Camera/IMG_20190813_095344.jpg,image/jpeg,4000,3000,0,8135601,,1637504342,1565682828000,1565682827977,0,0,0,,,,,,,,,,, +19579,6915,content://media/external/images/media/6915,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0010.jpg",image/jpeg,899,1599,0,141959,,1637518222,1565682237000,0,0,0,0,,,,,,,,,,, +19580,6693,content://media/external/images/media/6693,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0008.jpg",image/jpeg,1600,1200,0,313989,,1637518222,1565681541000,0,0,0,0,,,,,,,,,,, +19581,4656,content://media/external/images/media/4656,/storage/emulated/0/DCIM/Camera/IMG_20190813_092941.jpg,image/jpeg,4000,3000,90,7528951,,1637505417,1565681385000,1565681385609,0,0,0,,,,,,,,,,, +19582,6914,content://media/external/images/media/6914,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0007.jpg",image/jpeg,1200,1600,0,135227,,1637518222,1565680659000,0,0,0,0,,,,,,,,,,, +19583,6259,content://media/external/images/media/6259,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0004.jpg",image/jpeg,1599,1200,0,124648,,1637518221,1565676876000,0,0,0,0,,,,,,,,,,, +19584,6802,content://media/external/images/media/6802,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0000.jpg",image/jpeg,836,1600,0,226727,,1637518222,1565648341000,0,0,0,0,,,,,,,,,,, +19585,6913,content://media/external/images/media/6913,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0049.jpg",image/jpeg,473,1024,0,50328,,1637518222,1565645356000,0,0,0,0,,,,,,,,,,, +19586,6500,content://media/external/images/media/6500,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0047.jpg",image/jpeg,1200,1600,0,230070,,1637518221,1565629960000,0,0,0,0,,,,,,,,,,, +19587,6912,content://media/external/images/media/6912,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0046.jpg",image/jpeg,1200,1600,0,273898,,1637518222,1565629757000,0,0,0,0,,,,,,,,,,, +19588,4368,content://media/external/images/media/4368,/storage/emulated/0/DCIM/Camera/IMG_20190812_160947.jpg,image/jpeg,4000,3000,0,5041816,,1637504982,1565618988000,1565541233431,0,0,0,,,,,,,,,,, +19589,6800,content://media/external/images/media/6800,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0045.jpg",image/jpeg,1066,1599,0,146135,,1637518222,1565615057000,0,0,0,0,,,,,,,,,,, +19590,6260,content://media/external/images/media/6260,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0027.jpg",image/jpeg,1600,1200,0,433952,,1637518221,1565602984000,0,0,0,0,,,,,,,,,,, +19591,6258,content://media/external/images/media/6258,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0026.jpg",image/jpeg,1230,968,0,114306,,1637518221,1565602434000,0,0,0,0,,,,,,,,,,, +19592,6499,content://media/external/images/media/6499,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0023.jpg",image/jpeg,1328,747,0,239391,,1637518221,1565596159000,0,0,0,0,,,,,,,,,,, +19593,6498,content://media/external/images/media/6498,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0021.jpeg",image/jpeg,4000,2250,0,642924,,1637518221,1565595903000,0,0,0,0,,,,,,,,,,, +19594,6497,content://media/external/images/media/6497,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0019.jpeg",image/jpeg,4000,2250,0,615182,,1637518221,1565595396000,0,0,0,0,,,,,,,,,,, +19595,6379,content://media/external/images/media/6379,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0002.jpg",image/jpeg,1040,780,0,74023,,1637518221,1565588513000,0,0,0,0,,,,,,,,,,, +19596,6602,content://media/external/images/media/6602,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0001.jpg",image/jpeg,1408,1056,0,99090,,1637518221,1565587965000,0,0,0,0,,,,,,,,,,, +19597,6801,content://media/external/images/media/6801,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0000.jpg",image/jpeg,1328,747,0,72967,,1637518222,1565584987000,0,0,0,0,,,,,,,,,,, +19598,6495,content://media/external/images/media/6495,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0036.jpg",image/jpeg,1080,1080,0,137090,,1637518221,1565548722000,0,0,0,0,,,,,,,,,,, +19599,6799,content://media/external/images/media/6799,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0035.jpg",image/jpeg,679,960,0,77870,,1637518222,1565546558000,0,0,0,0,,,,,,,,,,, +19600,6496,content://media/external/images/media/6496,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0031.jpg",image/jpeg,282,424,0,13394,,1637518221,1565544973000,0,0,0,0,,,,,,,,,,, +19601,6692,content://media/external/images/media/6692,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0030.jpg",image/jpeg,299,306,0,11580,,1637518222,1565544969000,0,0,0,0,,,,,,,,,,, +19602,6690,content://media/external/images/media/6690,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0029.jpg",image/jpeg,1600,1088,0,328598,,1637518222,1565543619000,0,0,0,0,,,,,,,,,,, +19603,6257,content://media/external/images/media/6257,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0028.jpg",image/jpeg,1600,1200,0,350253,,1637518221,1565543545000,0,0,0,0,,,,,,,,,,, +19604,6599,content://media/external/images/media/6599,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0027.jpg",image/jpeg,1200,1600,0,371567,,1637518221,1565543517000,0,0,0,0,,,,,,,,,,, +19605,6691,content://media/external/images/media/6691,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0026.jpg",image/jpeg,1200,1600,0,469160,,1637518222,1565543502000,0,0,0,0,,,,,,,,,,, +19606,3355,content://media/external/images/media/3355,/storage/emulated/0/DCIM/Camera/IMG_20190811_183350.jpg,image/jpeg,4000,3000,0,10521904,,1637502451,1565541233000,1565541233431,0,0,0,,,,,,,,,,, +19607,4769,content://media/external/images/media/4769,/storage/emulated/0/DCIM/Camera/IMG_20190811_183332.jpg,image/jpeg,4000,3000,0,6353539,,1637505656,1565541213000,1565541213728,0,0,0,,,,,,,,,,, +19608,2938,content://media/external/images/media/2938,/storage/emulated/0/DCIM/Camera/IMG_20190811_183326.jpg,image/jpeg,8000,6000,0,20981435,,1637501660,1565541208000,1565541208693,0,0,0,,,,,,,,,,, +19609,6378,content://media/external/images/media/6378,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0025.jpg",image/jpeg,1600,1331,0,305257,,1637518221,1565539428000,0,0,0,0,,,,,,,,,,, +19610,6256,content://media/external/images/media/6256,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0024.jpg",image/jpeg,768,1024,0,178354,,1637518221,1565539052000,0,0,0,0,,,,,,,,,,, +19611,6911,content://media/external/images/media/6911,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0023.jpg",image/jpeg,1200,1600,0,314478,,1637518222,1565538927000,0,0,0,0,,,,,,,,,,, +19612,6910,content://media/external/images/media/6910,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0022.jpg",image/jpeg,899,1600,0,239554,,1637518222,1565536181000,0,0,0,0,,,,,,,,,,, +19613,6689,content://media/external/images/media/6689,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0021.jpg",image/jpeg,900,1600,0,203356,,1637518222,1565532498000,0,0,0,0,,,,,,,,,,, +19614,7036,content://media/external/images/media/7036,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0020.jpg",image/jpeg,764,1600,0,146272,,1637518222,1565532323000,0,0,0,0,,,,,,,,,,, +19615,6494,content://media/external/images/media/6494,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0018.jpg",image/jpeg,764,1600,0,106459,,1637518221,1565526384000,0,0,0,0,,,,,,,,,,, +19616,6601,content://media/external/images/media/6601,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0017.jpg",image/jpeg,898,1600,0,174561,,1637518221,1565525181000,0,0,0,0,,,,,,,,,,, +19617,6493,content://media/external/images/media/6493,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0016.jpg",image/jpeg,1600,764,0,232298,,1637518221,1565525145000,0,0,0,0,,,,,,,,,,, +19618,6688,content://media/external/images/media/6688,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0015.jpg",image/jpeg,750,1334,0,85915,,1637518222,1565524796000,0,0,0,0,,,,,,,,,,, +19619,6798,content://media/external/images/media/6798,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0014.jpg",image/jpeg,764,1600,0,56268,,1637518222,1565520380000,0,0,0,0,,,,,,,,,,, +19620,6600,content://media/external/images/media/6600,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0013.jpg",image/jpeg,900,1600,0,142536,,1637518221,1565520142000,0,0,0,0,,,,,,,,,,, +19621,7035,content://media/external/images/media/7035,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0012.jpg",image/jpeg,747,1328,0,167787,,1637518222,1565519919000,0,0,0,0,,,,,,,,,,, +19622,6597,content://media/external/images/media/6597,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0011.jpg",image/jpeg,780,1040,0,86020,,1637518221,1565518455000,0,0,0,0,,,,,,,,,,, +19623,6598,content://media/external/images/media/6598,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0010.jpg",image/jpeg,780,1040,0,108297,,1637518221,1565518452000,0,0,0,0,,,,,,,,,,, +19624,6491,content://media/external/images/media/6491,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0009.jpg",image/jpeg,780,1040,0,77706,,1637518221,1565518449000,0,0,0,0,,,,,,,,,,, +19625,6909,content://media/external/images/media/6909,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0008.jpg",image/jpeg,780,1040,0,75107,,1637518222,1565518446000,0,0,0,0,,,,,,,,,,, +19626,6596,content://media/external/images/media/6596,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0007.jpg",image/jpeg,899,1599,0,302832,,1637518221,1565518297000,0,0,0,0,,,,,,,,,,, +19627,6595,content://media/external/images/media/6595,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0006.jpg",image/jpeg,1599,899,0,346260,,1637518221,1565517085000,0,0,0,0,,,,,,,,,,, +19628,7034,content://media/external/images/media/7034,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0005.jpg",image/jpeg,1200,1600,0,248635,,1637518222,1565515751000,0,0,0,0,,,,,,,,,,, +19629,6594,content://media/external/images/media/6594,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0004.jpg",image/jpeg,780,1040,0,115833,,1637518221,1565515392000,0,0,0,0,,,,,,,,,,, +19630,6492,content://media/external/images/media/6492,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0002.jpg",image/jpeg,899,1599,0,386939,,1637518221,1565515340000,0,0,0,0,,,,,,,,,,, +19631,6593,content://media/external/images/media/6593,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0001.jpg",image/jpeg,1600,1200,0,314646,,1637518221,1565513424000,0,0,0,0,,,,,,,,,,, +19632,2697,content://media/external/images/media/2697,/storage/emulated/0/Pictures/scanner/scanner_20190811_103643.jpg,image/jpeg,459,1112,0,226630,,1637500871,1565512603000,0,0,0,0,,,,,,,,,,, +19633,4747,content://media/external/images/media/4747,/storage/emulated/0/DCIM/Camera/IMG_20190811_103608.jpg,image/jpeg,4000,3000,90,5462630,,1637505639,1565512570000,1565512570239,0,0,0,,,,,,,,,,, +19634,6907,content://media/external/images/media/6907,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0000.jpg",image/jpeg,1202,1600,0,212144,,1637518222,1565510932000,0,0,0,0,,,,,,,,,,, +19635,6590,content://media/external/images/media/6590,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190810-WA0045.jpg",image/jpeg,1200,1600,0,123915,,1637518221,1565470957000,0,0,0,0,,,,,,,,,,, +19636,6255,content://media/external/images/media/6255,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190810-WA0043.jpg",image/jpeg,1200,1600,0,123915,,1637518221,1565470364000,0,0,0,0,,,,,,,,,,, +19637,2681,content://media/external/images/media/2681,/storage/emulated/0/Pictures/1565456889873.bc9c730b-4198-4163-bb9a-78e8dd65f216.jpg,image/jpeg,2080,1560,0,850956,,1637500871,1565456904000,1565456900029,0,0,0,,,,,,,,,,, +19638,2680,content://media/external/images/media/2680,/storage/emulated/0/Pictures/1565456863547.697c8854-ed45-4672-9b7a-f73931d58b89.jpg,image/jpeg,2000,1500,0,902579,,1637500871,1565456879000,1565456873961,0,0,0,,,,,,,,,,, +19639,2679,content://media/external/images/media/2679,/storage/emulated/0/Pictures/1565455852824.118fe5bc-9ced-4bb7-bf8a-e86d61a9301c.jpg,image/jpeg,2000,1500,0,817836,,1637500871,1565455866000,1565455859985,0,0,0,,,,,,,,,,, +19640,7032,content://media/external/images/media/7032,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190810-WA0023.jpg",image/jpeg,1200,1600,0,133196,,1637518222,1565434748000,0,0,0,0,,,,,,,,,,, +19641,6376,content://media/external/images/media/6376,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190810-WA0022.jpg",image/jpeg,1200,1600,0,155669,,1637518221,1565434747000,0,0,0,0,,,,,,,,,,, +19642,6796,content://media/external/images/media/6796,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190810-WA0014.jpg",image/jpeg,900,1600,0,122644,,1637518222,1565425330000,0,0,0,0,,,,,,,,,,, +19643,6254,content://media/external/images/media/6254,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190810-WA0006.jpg",image/jpeg,900,1600,0,114434,,1637518221,1565424090000,0,0,0,0,,,,,,,,,,, +19644,7033,content://media/external/images/media/7033,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190810-WA0005.jpg",image/jpeg,1054,1600,0,169214,,1637518222,1565422951000,0,0,0,0,,,,,,,,,,, +19645,6797,content://media/external/images/media/6797,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190809-WA0006.jpg",image/jpeg,630,1024,0,67878,,1637518222,1565377373000,0,0,0,0,,,,,,,,,,, +19646,2696,content://media/external/images/media/2696,/storage/emulated/0/Pictures/scanner/scanner_20190807_103819.jpg,image/jpeg,718,945,0,286380,,1637500871,1565167100000,0,0,0,0,,,,,,,,,,, +19647,6687,content://media/external/images/media/6687,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0096.jpg",image/jpeg,769,1024,0,98525,,1637518222,1565159349000,0,0,0,0,,,,,,,,,,, +19648,7031,content://media/external/images/media/7031,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0097.jpg",image/jpeg,1600,1202,0,219622,,1637518222,1565159349000,0,0,0,0,,,,,,,,,,, +19649,6253,content://media/external/images/media/6253,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0094.jpg",image/jpeg,1599,1200,0,506169,,1637518221,1565159348000,0,0,0,0,,,,,,,,,,, +19650,6592,content://media/external/images/media/6592,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0095.jpg",image/jpeg,1599,1200,0,168144,,1637518221,1565159348000,0,0,0,0,,,,,,,,,,, +19651,6795,content://media/external/images/media/6795,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0093.jpg",image/jpeg,1599,1200,0,315481,,1637518222,1565159347000,0,0,0,0,,,,,,,,,,, +19652,7030,content://media/external/images/media/7030,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0092.jpg",image/jpeg,1080,1080,0,88433,,1637518222,1565159347000,0,0,0,0,,,,,,,,,,, +19653,3084,content://media/external/images/media/3084,/storage/emulated/0/DCIM/Camera/IMG_20190807_081719.jpg,image/jpeg,8000,6000,90,11893771,,1637501970,1565158640000,1565158640764,0,0,0,,,,,,,,,,, +19654,7029,content://media/external/images/media/7029,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0080.jpg",image/jpeg,1600,1200,0,186154,,1637518222,1565142137000,0,0,0,0,,,,,,,,,,, +19655,6908,content://media/external/images/media/6908,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0076.jpg",image/jpeg,1600,1200,0,175647,,1637518222,1565142136000,0,0,0,0,,,,,,,,,,, +19656,6792,content://media/external/images/media/6792,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0070.jpg",image/jpeg,1600,1200,0,189107,,1637518222,1565142133000,0,0,0,0,,,,,,,,,,, +19657,6794,content://media/external/images/media/6794,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0071.jpg",image/jpeg,1600,1200,0,166383,,1637518222,1565142133000,0,0,0,0,,,,,,,,,,, +19658,6591,content://media/external/images/media/6591,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0067.jpg",image/jpeg,1600,1200,0,179409,,1637518221,1565142131000,0,0,0,0,,,,,,,,,,, +19659,6377,content://media/external/images/media/6377,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0065.jpg",image/jpeg,1200,1600,0,168409,,1637518221,1565142130000,0,0,0,0,,,,,,,,,,, +19660,6252,content://media/external/images/media/6252,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0063.jpg",image/jpeg,1200,1600,0,131128,,1637518221,1565142129000,0,0,0,0,,,,,,,,,,, +19661,6906,content://media/external/images/media/6906,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0064.jpg",image/jpeg,1200,1600,0,166440,,1637518222,1565142129000,0,0,0,0,,,,,,,,,,, +19662,6905,content://media/external/images/media/6905,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0057.jpg",image/jpeg,1200,1600,0,141330,,1637518222,1565142099000,0,0,0,0,,,,,,,,,,, +19663,6903,content://media/external/images/media/6903,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0054.jpg",image/jpeg,1600,1200,0,155338,,1637518222,1565142098000,0,0,0,0,,,,,,,,,,, +19664,6250,content://media/external/images/media/6250,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0048.jpg",image/jpeg,1600,1200,0,163641,,1637518221,1565142095000,0,0,0,0,,,,,,,,,,, +19665,6251,content://media/external/images/media/6251,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0049.jpg",image/jpeg,1600,1200,0,177475,,1637518221,1565142095000,0,0,0,0,,,,,,,,,,, +19666,6375,content://media/external/images/media/6375,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0047.jpg",image/jpeg,1200,1600,0,138188,,1637518221,1565142094000,0,0,0,0,,,,,,,,,,, +19667,6904,content://media/external/images/media/6904,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0042.jpg",image/jpeg,1200,1600,0,173855,,1637518222,1565142082000,0,0,0,0,,,,,,,,,,, +19668,6486,content://media/external/images/media/6486,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0040.jpg",image/jpeg,1600,1200,0,180608,,1637518221,1565142081000,0,0,0,0,,,,,,,,,,, +19669,6249,content://media/external/images/media/6249,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0033.jpg",image/jpeg,1200,1600,0,154523,,1637518221,1565142080000,0,0,0,0,,,,,,,,,,, +19670,6589,content://media/external/images/media/6589,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0032.jpg",image/jpeg,1200,1600,0,178356,,1637518221,1565142080000,0,0,0,0,,,,,,,,,,, +19671,6793,content://media/external/images/media/6793,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0034.jpg",image/jpeg,1600,1200,0,197240,,1637518222,1565142080000,0,0,0,0,,,,,,,,,,, +19672,6374,content://media/external/images/media/6374,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0029.jpg",image/jpeg,1600,1200,0,177215,,1637518221,1565142079000,0,0,0,0,,,,,,,,,,, +19673,6790,content://media/external/images/media/6790,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0028.jpg",image/jpeg,1600,1200,0,190801,,1637518222,1565142079000,0,0,0,0,,,,,,,,,,, +19674,7028,content://media/external/images/media/7028,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0031.jpg",image/jpeg,1200,1600,0,170913,,1637518222,1565142079000,0,0,0,0,,,,,,,,,,, +19675,6248,content://media/external/images/media/6248,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0024.jpg",image/jpeg,1600,1200,0,145956,,1637518221,1565142078000,0,0,0,0,,,,,,,,,,, +19676,6791,content://media/external/images/media/6791,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0025.jpg",image/jpeg,1200,1600,0,196498,,1637518222,1565142078000,0,0,0,0,,,,,,,,,,, +19677,7027,content://media/external/images/media/7027,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0027.jpg",image/jpeg,1200,1600,0,160319,,1637518222,1565142078000,0,0,0,0,,,,,,,,,,, +19678,6371,content://media/external/images/media/6371,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0020.jpg",image/jpeg,1202,1600,0,165090,,1637518221,1565142026000,0,0,0,0,,,,,,,,,,, +19679,6588,content://media/external/images/media/6588,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0019.jpg",image/jpeg,1200,1600,0,142895,,1637518221,1565142026000,0,0,0,0,,,,,,,,,,, +19680,6373,content://media/external/images/media/6373,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0013.jpg",image/jpeg,1600,1200,0,149710,,1637518221,1565142025000,0,0,0,0,,,,,,,,,,, +19681,6490,content://media/external/images/media/6490,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0018.jpg",image/jpeg,1600,1200,0,146110,,1637518221,1565142025000,0,0,0,0,,,,,,,,,,, +19682,6587,content://media/external/images/media/6587,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0014.jpg",image/jpeg,1200,1600,0,129650,,1637518221,1565142025000,0,0,0,0,,,,,,,,,,, +19683,6901,content://media/external/images/media/6901,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0017.jpg",image/jpeg,1200,1600,0,125728,,1637518222,1565142025000,0,0,0,0,,,,,,,,,,, +19684,6902,content://media/external/images/media/6902,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0015.jpg",image/jpeg,1200,1600,0,142623,,1637518222,1565142025000,0,0,0,0,,,,,,,,,,, +19685,6900,content://media/external/images/media/6900,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0010.jpg",image/jpeg,1200,1600,0,136199,,1637518222,1565142024000,0,0,0,0,,,,,,,,,,, +19686,7026,content://media/external/images/media/7026,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0012.jpg",image/jpeg,1200,1600,0,130694,,1637518222,1565142024000,0,0,0,0,,,,,,,,,,, +19687,6247,content://media/external/images/media/6247,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0009.jpg",image/jpeg,1200,1600,0,151478,,1637518221,1565142023000,0,0,0,0,,,,,,,,,,, +19688,6485,content://media/external/images/media/6485,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0005.jpg",image/jpeg,1600,1200,0,187377,,1637518221,1565142023000,0,0,0,0,,,,,,,,,,, +19689,6788,content://media/external/images/media/6788,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0008.jpg",image/jpeg,1200,1600,0,146627,,1637518222,1565142023000,0,0,0,0,,,,,,,,,,, +19690,6243,content://media/external/images/media/6243,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0004.jpg",image/jpeg,1200,1600,0,202054,,1637518221,1565142022000,0,0,0,0,,,,,,,,,,, +19691,6484,content://media/external/images/media/6484,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0003.jpg",image/jpeg,1200,1600,0,110286,,1637518221,1565142022000,0,0,0,0,,,,,,,,,,, +19692,6786,content://media/external/images/media/6786,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190806-WA0013.jpg",image/jpeg,1599,1200,0,249018,,1637518222,1565123776000,0,0,0,0,,,,,,,,,,, +19693,6896,content://media/external/images/media/6896,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190806-WA0012.jpg",image/jpeg,1024,769,0,134781,,1637518222,1565123754000,0,0,0,0,,,,,,,,,,, +19694,6483,content://media/external/images/media/6483,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190806-WA0011.jpg",image/jpeg,1600,901,0,218148,,1637518221,1565123690000,0,0,0,0,,,,,,,,,,, +19695,6482,content://media/external/images/media/6482,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190806-WA0010.jpg",image/jpeg,1200,1599,0,244673,,1637518221,1565123065000,0,0,0,0,,,,,,,,,,, +19696,6481,content://media/external/images/media/6481,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190806-WA0008.jpg",image/jpeg,1600,1200,0,256869,,1637518221,1565122103000,0,0,0,0,,,,,,,,,,, +19697,4093,content://media/external/images/media/4093,/storage/emulated/0/DCIM/Camera/IMG_20190804_194823.jpg,image/jpeg,4000,3000,0,6317244,,1637504400,1564940903000,1564940903168,0,0,0,,,,,,,,,,, +19698,3783,content://media/external/images/media/3783,/storage/emulated/0/DCIM/Camera/IMG_20190804_115805.jpg,image/jpeg,4000,3000,0,3491716,,1637503558,1564912685000,1564912685647,0,0,0,,,,,,,,,,, +19699,4968,content://media/external/images/media/4968,/storage/emulated/0/DCIM/Camera/IMG_20190804_115544.jpg,image/jpeg,4000,3000,90,6709464,,1637506097,1564912544000,1564912544655,0,0,0,,,,,,,,,,, +19700,6370,content://media/external/images/media/6370,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190804-WA0014.jpg",image/jpeg,1600,692,0,88943,,1637518221,1564903495000,0,0,0,0,,,,,,,,,,, +19701,6478,content://media/external/images/media/6478,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190804-WA0012.jpg",image/jpeg,1600,1200,0,158635,,1637518221,1564882539000,0,0,0,0,,,,,,,,,,, +19702,6369,content://media/external/images/media/6369,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190804-WA0009.jpg",image/jpeg,1600,1200,0,152721,,1637518221,1564882538000,0,0,0,0,,,,,,,,,,, +19703,6368,content://media/external/images/media/6368,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190804-WA0002.jpg",image/jpeg,1600,1202,0,165474,,1637518221,1564882537000,0,0,0,0,,,,,,,,,,, +19704,3949,content://media/external/images/media/3949,/storage/emulated/0/DCIM/Camera/IMG_20190803_185504.jpg,image/jpeg,4000,3000,0,5270374,,1637503942,1564851304000,1564851304275,0,0,0,,,,,,,,,,, +19705,4029,content://media/external/images/media/4029,/storage/emulated/0/DCIM/Camera/IMG_20190803_181213.jpg,image/jpeg,4000,3000,90,6487293,,1637504234,1564848733000,1564848732894,0,0,0,,,,,,,,,,, +19706,6895,content://media/external/images/media/6895,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190802-WA0014.jpg",image/jpeg,1115,960,0,78817,,1637518222,1564778315000,0,0,0,0,,,,,,,,,,, +19707,4179,content://media/external/images/media/4179,/storage/emulated/0/DCIM/Camera/IMG_20190802_212856.jpg,image/jpeg,4000,3000,0,5403658,,1637504558,1564774138000,1564773818171,0,0,0,,,,,,,,,,, +19708,6583,content://media/external/images/media/6583,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190802-WA0001.jpg",image/jpeg,1080,1080,0,122115,,1637518221,1564729482000,0,0,0,0,,,,,,,,,,, +19709,3258,content://media/external/images/media/3258,/storage/emulated/0/DCIM/Camera/IMG_20190730_205258.jpg,image/jpeg,4160,3120,0,5808282,,1637502342,1564512779000,1564512778429,0,0,0,,,,,,,,,,, +19710,4028,content://media/external/images/media/4028,/storage/emulated/0/DCIM/Camera/IMG_20190730_203110.jpg,image/jpeg,4000,3000,90,6344577,,1637504234,1564511470000,1564511470794,0,0,0,,,,,,,,,,, +19711,4945,content://media/external/images/media/4945,/storage/emulated/0/DCIM/Camera/IMG_20190730_203108.jpg,image/jpeg,4000,3000,90,6198732,,1637506015,1564511468000,1564511468766,0,0,0,,,,,,,,,,, +19712,4092,content://media/external/images/media/4092,/storage/emulated/0/DCIM/Camera/IMG_20190730_201542.jpg,image/jpeg,4000,3000,0,4818138,,1637504399,1564510542000,1564510542342,0,0,0,,,,,,,,,,, +19713,3527,content://media/external/images/media/3527,/storage/emulated/0/DCIM/Camera/IMG_20190730_194323.jpg,image/jpeg,4000,3000,90,6922146,,1637503010,1564508603000,1564508602924,0,0,0,,,,,,,,,,, +19714,6479,content://media/external/images/media/6479,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190730-WA0019.jpg",image/jpeg,1600,1200,0,247075,,1637518221,1564468834000,0,0,0,0,,,,,,,,,,, +19715,7021,content://media/external/images/media/7021,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190730-WA0014.jpg",image/jpeg,1600,1200,0,235947,,1637518222,1564468831000,0,0,0,0,,,,,,,,,,, +19716,6783,content://media/external/images/media/6783,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190730-WA0012.jpg",image/jpeg,1600,1200,0,224582,,1637518222,1564468830000,0,0,0,0,,,,,,,,,,, +19717,3462,content://media/external/images/media/3462,/storage/emulated/0/DCIM/Camera/IMG_20190729_180407.jpg,image/jpeg,1813,1867,0,909278,,1637502817,1564416248000,1564416142809,0,0,0,,,,,,,,,,, +19718,4768,content://media/external/images/media/4768,/storage/emulated/0/DCIM/Camera/IMG_20190729_180317.jpg,image/jpeg,4000,3000,90,6158549,,1637505656,1564416197000,1564416197126,0,0,0,,,,,,,,,,, +19719,3974,content://media/external/images/media/3974,/storage/emulated/0/DCIM/Camera/IMG_20190729_174913.jpg,image/jpeg,4000,3000,90,6424332,,1637504059,1564415353000,1564415353237,0,0,0,,,,,,,,,,, +19720,4448,content://media/external/images/media/4448,/storage/emulated/0/DCIM/Camera/IMG_20190727_142757_1.jpg,image/jpeg,4000,3000,0,4195356,,1637505068,1564230478000,1564230477700,0,0,0,,,,,,,,,,, +19721,4923,content://media/external/images/media/4923,/storage/emulated/0/DCIM/Camera/IMG_20190727_142758.jpg,image/jpeg,4000,3000,0,2358918,,1637506010,1564230478000,1564230477967,0,0,0,,,,,,,,,,, +19722,2854,content://media/external/images/media/2854,/storage/emulated/0/DCIM/Camera/IMG_20190727_142756.jpg,image/jpeg,4000,3000,0,3374330,,1637501457,1564230476000,1564230476094,0,0,0,,,,,,,,,,, +19723,4838,content://media/external/images/media/4838,/storage/emulated/0/DCIM/Camera/IMG_20190727_142755_1.jpg,image/jpeg,4000,3000,0,5321240,,1637505753,1564230476000,1564230475922,0,0,0,,,,,,,,,,, +19724,4837,content://media/external/images/media/4837,/storage/emulated/0/DCIM/Camera/IMG_20190727_142752.jpg,image/jpeg,4000,3000,0,5054952,,1637505753,1564230472000,1564230472069,0,0,0,,,,,,,,,,, +19725,4109,content://media/external/images/media/4109,/storage/emulated/0/DCIM/Camera/IMG_20190727_142513.jpg,image/jpeg,4000,3000,0,5381701,,1637504451,1564230313000,1564230313516,0,0,0,,,,,,,,,,, +19726,4944,content://media/external/images/media/4944,/storage/emulated/0/DCIM/Camera/IMG_20190727_142445.jpg,image/jpeg,3000,3000,0,2891501,,1637506015,1564230286000,1564230285657,0,0,0,,,,,,,,,,, +19727,6782,content://media/external/images/media/6782,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0019.jpg",image/jpeg,1600,900,0,301750,,1637518222,1564227307000,0,0,0,0,,,,,,,,,,, +19728,6244,content://media/external/images/media/6244,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0017.jpg",image/jpeg,1600,900,0,201590,,1637518221,1564219915000,0,0,0,0,,,,,,,,,,, +19729,6242,content://media/external/images/media/6242,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0016.jpg",image/jpeg,1600,1200,0,143111,,1637518221,1564219023000,0,0,0,0,,,,,,,,,,, +19730,6241,content://media/external/images/media/6241,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0013.jpg",image/jpeg,898,1600,0,179420,,1637518221,1564217623000,0,0,0,0,,,,,,,,,,, +19731,6476,content://media/external/images/media/6476,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0012.jpg",image/jpeg,898,1600,0,135222,,1637518221,1564217551000,0,0,0,0,,,,,,,,,,, +19732,6780,content://media/external/images/media/6780,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0011.jpg",image/jpeg,898,1600,0,81835,,1637518222,1564217534000,0,0,0,0,,,,,,,,,,, +19733,6779,content://media/external/images/media/6779,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0010.jpg",image/jpeg,620,921,0,61701,,1637518222,1564217187000,0,0,0,0,,,,,,,,,,, +19734,6364,content://media/external/images/media/6364,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0009.jpg",image/jpeg,1200,1600,0,229379,,1637518221,1564214299000,0,0,0,0,,,,,,,,,,, +19735,6893,content://media/external/images/media/6893,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0008.jpg",image/jpeg,780,1040,0,89126,,1637518222,1564214288000,0,0,0,0,,,,,,,,,,, +19736,6681,content://media/external/images/media/6681,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0007.jpg",image/jpeg,1040,780,0,45745,,1637518222,1564213953000,0,0,0,0,,,,,,,,,,, +19737,7018,content://media/external/images/media/7018,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0006.jpg",image/jpeg,1182,838,0,417281,,1637518222,1564213169000,0,0,0,0,,,,,,,,,,, +19738,6363,content://media/external/images/media/6363,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0005.jpg",image/jpeg,780,1040,0,98996,,1637518221,1564211646000,0,0,0,0,,,,,,,,,,, +19739,6777,content://media/external/images/media/6777,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0003.jpeg",image/jpeg,2250,4000,0,1071992,,1637518222,1564209195000,0,0,0,0,,,,,,,,,,, +19740,6891,content://media/external/images/media/6891,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0002.jpg",image/jpeg,1200,1600,0,85198,,1637518222,1564208036000,0,0,0,0,,,,,,,,,,, +19741,6474,content://media/external/images/media/6474,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0001.jpg",image/jpeg,1200,1600,0,142530,,1637518221,1564208035000,0,0,0,0,,,,,,,,,,, +19742,7016,content://media/external/images/media/7016,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0000.jpg",image/jpeg,1200,1600,0,124953,,1637518222,1564208035000,0,0,0,0,,,,,,,,,,, +19743,6679,content://media/external/images/media/6679,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0069.jpg",image/jpeg,750,1334,0,112682,,1637518222,1564169182000,0,0,0,0,,,,,,,,,,, +19744,6581,content://media/external/images/media/6581,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0068.jpg",image/jpeg,898,1600,0,190392,,1637518221,1564169011000,0,0,0,0,,,,,,,,,,, +19745,6239,content://media/external/images/media/6239,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0066.jpg",image/jpeg,898,1600,0,149090,,1637518221,1564168611000,0,0,0,0,,,,,,,,,,, +19746,6472,content://media/external/images/media/6472,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0067.jpg",image/jpeg,898,1600,0,53196,,1637518221,1564168611000,0,0,0,0,,,,,,,,,,, +19747,6361,content://media/external/images/media/6361,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0065.jpg",image/jpeg,899,1599,0,152947,,1637518221,1564168610000,0,0,0,0,,,,,,,,,,, +19748,6238,content://media/external/images/media/6238,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0064.jpg",image/jpeg,780,1040,0,48633,,1637518221,1564167164000,0,0,0,0,,,,,,,,,,, +19749,6888,content://media/external/images/media/6888,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0063.jpg",image/jpeg,899,1599,0,138926,,1637518222,1564166535000,0,0,0,0,,,,,,,,,,, +19750,6470,content://media/external/images/media/6470,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0062.jpg",image/jpeg,777,1599,0,148058,,1637518221,1564165938000,0,0,0,0,,,,,,,,,,, +19751,7013,content://media/external/images/media/7013,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0061.jpg",image/jpeg,1600,898,0,178536,,1637518222,1564165740000,0,0,0,0,,,,,,,,,,, +19752,6580,content://media/external/images/media/6580,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0059.jpg",image/jpeg,1200,1600,0,159693,,1637518221,1564165663000,0,0,0,0,,,,,,,,,,, +19753,6359,content://media/external/images/media/6359,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0058.jpg",image/jpeg,898,1600,0,146355,,1637518221,1564165569000,0,0,0,0,,,,,,,,,,, +19754,6358,content://media/external/images/media/6358,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0056.jpg",image/jpeg,750,1334,0,70917,,1637518221,1564165491000,0,0,0,0,,,,,,,,,,, +19755,6469,content://media/external/images/media/6469,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0057.jpg",image/jpeg,750,1334,0,47466,,1637518221,1564165491000,0,0,0,0,,,,,,,,,,, +19756,6776,content://media/external/images/media/6776,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0055.jpg",image/jpeg,750,1334,0,56845,,1637518222,1564165491000,0,0,0,0,,,,,,,,,,, +19757,6356,content://media/external/images/media/6356,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0054.jpg",image/jpeg,750,1334,0,61055,,1637518221,1564165490000,0,0,0,0,,,,,,,,,,, +19758,6775,content://media/external/images/media/6775,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0053.jpg",image/jpeg,750,1334,0,65259,,1637518222,1564165490000,0,0,0,0,,,,,,,,,,, +19759,6887,content://media/external/images/media/6887,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0052.jpg",image/jpeg,750,1334,0,62659,,1637518222,1564165490000,0,0,0,0,,,,,,,,,,, +19760,7010,content://media/external/images/media/7010,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0051.jpg",image/jpeg,750,1334,0,73637,,1637518222,1564165489000,0,0,0,0,,,,,,,,,,, +19761,6774,content://media/external/images/media/6774,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0050.jpg",image/jpeg,1600,898,0,97560,,1637518222,1564165187000,0,0,0,0,,,,,,,,,,, +19762,4349,content://media/external/images/media/4349,/storage/emulated/0/DCIM/Camera/IMG_20190726_195948.jpg,image/jpeg,4000,3000,0,5537397,,1637504970,1564163989000,1564163988660,0,0,0,,,,,,,,,,, +19763,6886,content://media/external/images/media/6886,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0047.jpg",image/jpeg,899,1599,0,94076,,1637518222,1564163651000,0,0,0,0,,,,,,,,,,, +19764,6236,content://media/external/images/media/6236,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0046.jpg",image/jpeg,768,1024,0,83403,,1637518221,1564163283000,0,0,0,0,,,,,,,,,,, +19765,6235,content://media/external/images/media/6235,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0044.jpg",image/jpeg,1200,1599,0,89267,,1637518221,1564162492000,0,0,0,0,,,,,,,,,,, +19766,6234,content://media/external/images/media/6234,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0043.jpg",image/jpeg,1200,1600,0,485758,,1637518221,1564161343000,0,0,0,0,,,,,,,,,,, +19767,6884,content://media/external/images/media/6884,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0042.jpg",image/jpeg,1600,1202,0,116533,,1637518222,1564161342000,0,0,0,0,,,,,,,,,,, +19768,6576,content://media/external/images/media/6576,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0041.jpg",image/jpeg,900,1600,0,150087,,1637518221,1564161132000,0,0,0,0,,,,,,,,,,, +19769,6575,content://media/external/images/media/6575,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0040_1.jpg",image/jpeg,-1,-1,0,0,,1637518221,1564152445000,0,0,0,0,,,,,,,,,,, +19770,6352,content://media/external/images/media/6352,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0040.jpg",image/jpeg,898,1600,0,95706,,1637518221,1564147743000,0,0,0,0,,,,,,,,,,, +19771,6883,content://media/external/images/media/6883,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0039.jpg",image/jpeg,1600,901,0,233850,,1637518222,1564147715000,0,0,0,0,,,,,,,,,,, +19772,6571,content://media/external/images/media/6571,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0038.jpg",image/jpeg,480,670,0,16905,,1637518221,1564147082000,0,0,0,0,,,,,,,,,,, +19773,6674,content://media/external/images/media/6674,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0036.jpg",image/jpeg,1600,898,0,154391,,1637518222,1564146739000,0,0,0,0,,,,,,,,,,, +19774,6350,content://media/external/images/media/6350,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0035.jpg",image/jpeg,1600,898,0,192881,,1637518221,1564146738000,0,0,0,0,,,,,,,,,,, +19775,6673,content://media/external/images/media/6673,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0033.jpg",image/jpeg,709,646,0,298901,,1637518222,1564141815000,0,0,0,0,,,,,,,,,,, +19776,6879,content://media/external/images/media/6879,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0034.jpg",image/jpeg,627,863,0,62698,,1637518222,1564141815000,0,0,0,0,,,,,,,,,,, +19777,6348,content://media/external/images/media/6348,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0032.jpg",image/jpeg,780,1040,0,52060,,1637518221,1564141814000,0,0,0,0,,,,,,,,,,, +19778,6232,content://media/external/images/media/6232,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0031.jpg",image/jpeg,1600,900,0,160525,,1637518221,1564138451000,0,0,0,0,,,,,,,,,,, +19779,6231,content://media/external/images/media/6231,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0030.jpg",image/jpeg,1600,900,0,164644,,1637518221,1564138375000,0,0,0,0,,,,,,,,,,, +19780,6669,content://media/external/images/media/6669,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0029.jpg",image/jpeg,1600,900,0,114881,,1637518222,1564138372000,0,0,0,0,,,,,,,,,,, +19781,7008,content://media/external/images/media/7008,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0027.jpeg",image/jpeg,2250,4000,0,881583,,1637518222,1564138005000,0,0,0,0,,,,,,,,,,, +19782,6772,content://media/external/images/media/6772,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0025.jpeg",image/jpeg,2250,4000,0,834362,,1637518222,1564137991000,0,0,0,0,,,,,,,,,,, +19783,6465,content://media/external/images/media/6465,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0023.jpeg",image/jpeg,2250,4000,0,734384,,1637518221,1564137982000,0,0,0,0,,,,,,,,,,, +19784,6770,content://media/external/images/media/6770,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0021.jpeg",image/jpeg,2250,4000,0,874747,,1637518222,1564137967000,0,0,0,0,,,,,,,,,,, +19785,6347,content://media/external/images/media/6347,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0019.jpg",image/jpeg,1200,1599,0,366842,,1637518221,1564133782000,0,0,0,0,,,,,,,,,,, +19786,6877,content://media/external/images/media/6877,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0018.jpg",image/jpeg,1600,898,0,87606,,1637518222,1564133510000,0,0,0,0,,,,,,,,,,, +19787,7006,content://media/external/images/media/7006,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0017.jpg",image/jpeg,1599,1200,0,398024,,1637518222,1564132940000,0,0,0,0,,,,,,,,,,, +19788,6769,content://media/external/images/media/6769,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0015.jpeg",image/jpeg,4000,2250,0,900076,,1637518222,1564130026000,0,0,0,0,,,,,,,,,,, +19789,7004,content://media/external/images/media/7004,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0014.jpg",image/jpeg,1200,1599,0,357419,,1637518222,1564129644000,0,0,0,0,,,,,,,,,,, +19790,6572,content://media/external/images/media/6572,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0013.jpg",image/jpeg,1200,1599,0,296405,,1637518221,1564129643000,0,0,0,0,,,,,,,,,,, +19791,6874,content://media/external/images/media/6874,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0012.jpg",image/jpeg,1040,780,0,34970,,1637518222,1564129112000,0,0,0,0,,,,,,,,,,, +19792,7003,content://media/external/images/media/7003,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0011.jpg",image/jpeg,1040,780,0,51520,,1637518222,1564129109000,0,0,0,0,,,,,,,,,,, +19793,6569,content://media/external/images/media/6569,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0010.jpg",image/jpeg,1040,780,0,36037,,1637518221,1564129107000,0,0,0,0,,,,,,,,,,, +19794,7002,content://media/external/images/media/7002,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0009.jpg",image/jpeg,780,1040,0,39519,,1637518222,1564129104000,0,0,0,0,,,,,,,,,,, +19795,6567,content://media/external/images/media/6567,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0008.jpg",image/jpeg,1040,780,0,47514,,1637518221,1564129103000,0,0,0,0,,,,,,,,,,, +19796,6461,content://media/external/images/media/6461,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0007.jpg",image/jpeg,780,1040,0,70341,,1637518221,1564129101000,0,0,0,0,,,,,,,,,,, +19797,6665,content://media/external/images/media/6665,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0006.jpg",image/jpeg,780,1040,0,48516,,1637518222,1564129096000,0,0,0,0,,,,,,,,,,, +19798,7001,content://media/external/images/media/7001,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0005.jpg",image/jpeg,780,1040,0,16177,,1637518222,1564129095000,0,0,0,0,,,,,,,,,,, +19799,6345,content://media/external/images/media/6345,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0004.jpg",image/jpeg,1040,780,0,38893,,1637518221,1564129092000,0,0,0,0,,,,,,,,,,, +19800,6765,content://media/external/images/media/6765,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0003.jpg",image/jpeg,1040,780,0,43971,,1637518222,1564129089000,0,0,0,0,,,,,,,,,,, +19801,2871,content://media/external/images/media/2871,/storage/emulated/0/DCIM/Camera/IMG_20190726_090824.jpg,image/jpeg,4160,3120,0,8740301,,1637501460,1564124904000,1564124903956,0,0,0,,,,,,,,,,, +19802,4789,content://media/external/images/media/4789,/storage/emulated/0/DCIM/Camera/IMG_20190726_084537.jpg,image/jpeg,4000,3000,0,7733167,,1637505663,1564123537000,1564123537268,0,0,0,,,,,,,,,,, +19803,6457,content://media/external/images/media/6457,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0000.jpg",image/jpeg,1200,1600,0,277228,,1637518221,1564120670000,0,0,0,0,,,,,,,,,,, +19804,6565,content://media/external/images/media/6565,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0017.jpg",image/jpeg,750,1334,0,168484,,1637518221,1564077592000,0,0,0,0,,,,,,,,,,, +19805,6872,content://media/external/images/media/6872,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0016.jpg",image/jpeg,720,1280,0,48333,,1637518222,1564077431000,0,0,0,0,,,,,,,,,,, +19806,6999,content://media/external/images/media/6999,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0015.jpg",image/jpeg,720,1280,0,43337,,1637518222,1564077431000,0,0,0,0,,,,,,,,,,, +19807,6566,content://media/external/images/media/6566,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0014.jpg",image/jpeg,900,1600,0,275949,,1637518221,1564071222000,0,0,0,0,,,,,,,,,,, +19808,6342,content://media/external/images/media/6342,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0013.jpg",image/jpeg,900,1600,0,133310,,1637518221,1564067214000,0,0,0,0,,,,,,,,,,, +19809,6662,content://media/external/images/media/6662,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0012.jpg",image/jpeg,1200,1600,0,185432,,1637518222,1564060728000,0,0,0,0,,,,,,,,,,, +19810,6767,content://media/external/images/media/6767,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0011.jpg",image/jpeg,900,1600,0,145542,,1637518222,1564060621000,0,0,0,0,,,,,,,,,,, +19811,6562,content://media/external/images/media/6562,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0010.jpg",image/jpeg,780,1040,0,32352,,1637518221,1564060613000,0,0,0,0,,,,,,,,,,, +19812,6456,content://media/external/images/media/6456,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0009.jpg",image/jpeg,1200,1600,0,106386,,1637518221,1564060320000,0,0,0,0,,,,,,,,,,, +19813,6661,content://media/external/images/media/6661,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0008.jpg",image/jpeg,1040,780,0,36746,,1637518221,1564060029000,0,0,0,0,,,,,,,,,,, +19814,6229,content://media/external/images/media/6229,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0006.jpg",image/jpeg,780,1040,0,93690,,1637518221,1564057045000,0,0,0,0,,,,,,,,,,, +19815,6660,content://media/external/images/media/6660,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0004.jpg",image/jpeg,1200,1599,0,341703,,1637518221,1564048894000,0,0,0,0,,,,,,,,,,, +19816,6659,content://media/external/images/media/6659,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0002.jpg",image/jpeg,780,1040,0,60933,,1637518221,1564042159000,0,0,0,0,,,,,,,,,,, +19817,6871,content://media/external/images/media/6871,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0000.jpg",image/jpeg,1200,1600,0,215175,,1637518222,1564037585000,0,0,0,0,,,,,,,,,,, +19818,4408,content://media/external/images/media/4408,/storage/emulated/0/DCIM/Camera/IMG_20190724_223046.jpg,image/jpeg,4160,3120,0,4491804,,1637505062,1564000246000,1564000246108,0,0,0,,,,,,,,,,, +19819,4386,content://media/external/images/media/4386,/storage/emulated/0/DCIM/Camera/IMG_20190724_223040.jpg,image/jpeg,4160,3120,0,4475308,,1637505004,1564000240000,1564000240725,0,0,0,,,,,,,,,,, +19820,4655,content://media/external/images/media/4655,/storage/emulated/0/DCIM/Camera/IMG_20190724_223030.jpg,image/jpeg,4000,3000,0,6008820,,1637505417,1564000230000,1564000230598,0,0,0,,,,,,,,,,, +19821,6998,content://media/external/images/media/6998,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0334.jpg",image/jpeg,1560,496,0,73362,,1637518222,1563998598000,0,0,0,0,,,,,,,,,,, +19822,6762,content://media/external/images/media/6762,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0333.jpg",image/jpeg,780,1040,0,39924,,1637518222,1563992783000,0,0,0,0,,,,,,,,,,, +19823,6227,content://media/external/images/media/6227,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0330.jpg",image/jpeg,780,1040,0,80193,,1637518221,1563985963000,0,0,0,0,,,,,,,,,,, +19824,6453,content://media/external/images/media/6453,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0328.jpg",image/jpeg,900,1600,0,205746,,1637518221,1563984368000,0,0,0,0,,,,,,,,,,, +19825,6339,content://media/external/images/media/6339,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0327.jpg",image/jpeg,780,1040,0,82104,,1637518221,1563983839000,0,0,0,0,,,,,,,,,,, +19826,6996,content://media/external/images/media/6996,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0326.jpg",image/jpeg,780,1040,0,53033,,1637518222,1563983829000,0,0,0,0,,,,,,,,,,, +19827,6995,content://media/external/images/media/6995,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0325.jpg",image/jpeg,1200,1600,0,232480,,1637518222,1563981449000,0,0,0,0,,,,,,,,,,, +19828,6560,content://media/external/images/media/6560,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0324.jpg",image/jpeg,1200,1600,0,165093,,1637518221,1563981448000,0,0,0,0,,,,,,,,,,, +19829,6656,content://media/external/images/media/6656,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0323.jpg",image/jpeg,700,700,0,77925,,1637518221,1563977745000,0,0,0,0,,,,,,,,,,, +19830,6657,content://media/external/images/media/6657,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0322.jpg",image/jpeg,1600,1202,0,228427,,1637518221,1563969484000,0,0,0,0,,,,,,,,,,, +19831,6558,content://media/external/images/media/6558,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0321.jpg",image/jpeg,564,530,0,37040,,1637518221,1563967968000,0,0,0,0,,,,,,,,,,, +19832,6758,content://media/external/images/media/6758,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0320.jpg",image/jpeg,898,1600,0,132937,,1637518222,1563967333000,0,0,0,0,,,,,,,,,,, +19833,6337,content://media/external/images/media/6337,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0319.jpg",image/jpeg,1600,1200,0,114150,,1637518221,1563967206000,0,0,0,0,,,,,,,,,,, +19834,3136,content://media/external/images/media/3136,/storage/emulated/0/DCIM/Camera/IMG_20190724_123840.jpg,image/jpeg,1619,1214,0,464040,,1637502130,1563964721000,1563964669296,0,0,0,,,,,,,,,,, +19835,4496,content://media/external/images/media/4496,/storage/emulated/0/DCIM/Camera/IMG_20190724_123749.jpg,image/jpeg,4000,3000,90,5552266,,1637505160,1563964669000,1563964669296,0,0,0,,,,,,,,,,, +19836,3101,content://media/external/images/media/3101,/storage/emulated/0/DCIM/Camera/IMG_20190724_122703.jpg,image/jpeg,4000,3000,90,5478442,,1637502054,1563964024000,1563964023471,0,0,0,,,,,,,,,,, +19837,6451,content://media/external/images/media/6451,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0318.jpg",image/jpeg,770,1600,0,102707,,1637518221,1563963014000,0,0,0,0,,,,,,,,,,, +19838,6336,content://media/external/images/media/6336,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0316.jpg",image/jpeg,1600,1063,0,309289,,1637518221,1563955224000,0,0,0,0,,,,,,,,,,, +19839,6757,content://media/external/images/media/6757,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0317.jpg",image/jpeg,1600,1063,0,382062,,1637518222,1563955224000,0,0,0,0,,,,,,,,,,, +19840,6866,content://media/external/images/media/6866,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0314.jpg",image/jpeg,1600,1063,0,406452,,1637518222,1563955223000,0,0,0,0,,,,,,,,,,, +19841,6867,content://media/external/images/media/6867,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0315.jpg",image/jpeg,1600,1063,0,295034,,1637518222,1563955223000,0,0,0,0,,,,,,,,,,, +19842,6994,content://media/external/images/media/6994,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0313.jpg",image/jpeg,1600,1063,0,271479,,1637518222,1563955223000,0,0,0,0,,,,,,,,,,, +19843,6865,content://media/external/images/media/6865,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0312.jpg",image/jpeg,1600,1063,0,354115,,1637518222,1563955222000,0,0,0,0,,,,,,,,,,, +19844,6557,content://media/external/images/media/6557,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0311.jpg",image/jpeg,1600,1063,0,287912,,1637518221,1563955221000,0,0,0,0,,,,,,,,,,, +19845,6556,content://media/external/images/media/6556,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0310.jpg",image/jpeg,1600,1063,0,334096,,1637518221,1563955118000,0,0,0,0,,,,,,,,,,, +19846,6225,content://media/external/images/media/6225,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0308.jpg",image/jpeg,1600,1063,0,267041,,1637518221,1563955117000,0,0,0,0,,,,,,,,,,, +19847,6653,content://media/external/images/media/6653,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0309.jpg",image/jpeg,1600,1063,0,296916,,1637518221,1563955117000,0,0,0,0,,,,,,,,,,, +19848,6863,content://media/external/images/media/6863,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0307.jpg",image/jpeg,1063,1600,0,346898,,1637518222,1563955117000,0,0,0,0,,,,,,,,,,, +19849,6861,content://media/external/images/media/6861,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0306.jpg",image/jpeg,1600,1063,0,278994,,1637518222,1563955116000,0,0,0,0,,,,,,,,,,, +19850,6992,content://media/external/images/media/6992,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0305.jpg",image/jpeg,1600,1063,0,284014,,1637518222,1563955116000,0,0,0,0,,,,,,,,,,, +19851,6331,content://media/external/images/media/6331,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0303.jpg",image/jpeg,1600,1063,0,298674,,1637518221,1563955115000,0,0,0,0,,,,,,,,,,, +19852,6449,content://media/external/images/media/6449,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0304.jpg",image/jpeg,1600,1063,0,328637,,1637518221,1563955115000,0,0,0,0,,,,,,,,,,, +19853,6553,content://media/external/images/media/6553,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0302.jpg",image/jpeg,1600,1063,0,326319,,1637518221,1563955115000,0,0,0,0,,,,,,,,,,, +19854,6223,content://media/external/images/media/6223,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0301.jpg",image/jpeg,1600,1063,0,311406,,1637518221,1563955114000,0,0,0,0,,,,,,,,,,, +19855,6554,content://media/external/images/media/6554,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0300.jpg",image/jpeg,1600,1063,0,314149,,1637518221,1563955114000,0,0,0,0,,,,,,,,,,, +19856,6446,content://media/external/images/media/6446,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0298.jpg",image/jpeg,1600,1063,0,274160,,1637518221,1563955113000,0,0,0,0,,,,,,,,,,, +19857,6651,content://media/external/images/media/6651,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0297.jpg",image/jpeg,1600,1063,0,265273,,1637518221,1563955113000,0,0,0,0,,,,,,,,,,, +19858,6989,content://media/external/images/media/6989,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0299.jpg",image/jpeg,1600,1063,0,246877,,1637518222,1563955113000,0,0,0,0,,,,,,,,,,, +19859,6988,content://media/external/images/media/6988,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0296.jpg",image/jpeg,1600,1063,0,308847,,1637518222,1563955112000,0,0,0,0,,,,,,,,,,, +19860,6985,content://media/external/images/media/6985,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0294.jpg",image/jpeg,1063,1600,0,465416,,1637518222,1563954913000,0,0,0,0,,,,,,,,,,, +19861,6987,content://media/external/images/media/6987,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0295.jpg",image/jpeg,1600,1063,0,392976,,1637518222,1563954913000,0,0,0,0,,,,,,,,,,, +19862,6860,content://media/external/images/media/6860,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0293.jpg",image/jpeg,1600,1063,0,316709,,1637518222,1563954912000,0,0,0,0,,,,,,,,,,, +19863,6330,content://media/external/images/media/6330,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0292.jpg",image/jpeg,1600,1063,0,330080,,1637518221,1563954911000,0,0,0,0,,,,,,,,,,, +19864,6551,content://media/external/images/media/6551,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0291.jpg",image/jpeg,1600,1063,0,371000,,1637518221,1563954911000,0,0,0,0,,,,,,,,,,, +19865,6443,content://media/external/images/media/6443,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0290.jpg",image/jpeg,1600,1063,0,382886,,1637518221,1563954910000,0,0,0,0,,,,,,,,,,, +19866,6550,content://media/external/images/media/6550,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0289.jpg",image/jpeg,1600,1063,0,387792,,1637518221,1563954909000,0,0,0,0,,,,,,,,,,, +19867,6751,content://media/external/images/media/6751,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0288.jpg",image/jpeg,1600,1063,0,374314,,1637518222,1563954908000,0,0,0,0,,,,,,,,,,, +19868,6329,content://media/external/images/media/6329,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0286.jpg",image/jpeg,1600,1063,0,313983,,1637518221,1563954907000,0,0,0,0,,,,,,,,,,, +19869,6442,content://media/external/images/media/6442,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0287.jpg",image/jpeg,1600,1063,0,311176,,1637518221,1563954907000,0,0,0,0,,,,,,,,,,, +19870,6548,content://media/external/images/media/6548,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0285.jpg",image/jpeg,1600,1063,0,425955,,1637518221,1563954906000,0,0,0,0,,,,,,,,,,, +19871,6752,content://media/external/images/media/6752,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0284.jpg",image/jpeg,1600,1063,0,375405,,1637518222,1563954905000,0,0,0,0,,,,,,,,,,, +19872,6220,content://media/external/images/media/6220,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0283.jpg",image/jpeg,1600,1063,0,383492,,1637518221,1563954904000,0,0,0,0,,,,,,,,,,, +19873,6649,content://media/external/images/media/6649,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0282.jpg",image/jpeg,1063,1600,0,378608,,1637518221,1563954903000,0,0,0,0,,,,,,,,,,, +19874,6327,content://media/external/images/media/6327,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0281.jpg",image/jpeg,1600,1063,0,376057,,1637518221,1563954902000,0,0,0,0,,,,,,,,,,, +19875,6750,content://media/external/images/media/6750,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0280.jpg",image/jpeg,1600,1063,0,253318,,1637518222,1563954792000,0,0,0,0,,,,,,,,,,, +19876,6980,content://media/external/images/media/6980,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0279.jpg",image/jpeg,1600,1063,0,202068,,1637518222,1563954792000,0,0,0,0,,,,,,,,,,, +19877,6324,content://media/external/images/media/6324,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0276.jpg",image/jpeg,1600,1063,0,384685,,1637518221,1563954791000,0,0,0,0,,,,,,,,,,, +19878,6746,content://media/external/images/media/6746,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0277.jpg",image/jpeg,1600,1063,0,196137,,1637518222,1563954791000,0,0,0,0,,,,,,,,,,, +19879,6749,content://media/external/images/media/6749,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0278.jpg",image/jpeg,1600,1063,0,190890,,1637518222,1563954791000,0,0,0,0,,,,,,,,,,, +19880,6439,content://media/external/images/media/6439,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0273.jpg",image/jpeg,1600,1063,0,266734,,1637518221,1563954790000,0,0,0,0,,,,,,,,,,, +19881,6748,content://media/external/images/media/6748,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0275.jpg",image/jpeg,1600,1063,0,383430,,1637518222,1563954790000,0,0,0,0,,,,,,,,,,, +19882,6977,content://media/external/images/media/6977,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0274.jpg",image/jpeg,1600,1063,0,346732,,1637518222,1563954790000,0,0,0,0,,,,,,,,,,, +19883,6859,content://media/external/images/media/6859,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0271.jpg",image/jpeg,1600,1063,0,343494,,1637518222,1563954789000,0,0,0,0,,,,,,,,,,, +19884,6976,content://media/external/images/media/6976,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0272.jpg",image/jpeg,1063,1600,0,463440,,1637518222,1563954789000,0,0,0,0,,,,,,,,,,, +19885,6218,content://media/external/images/media/6218,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0270.jpg",image/jpeg,1600,1063,0,196041,,1637518221,1563954788000,0,0,0,0,,,,,,,,,,, +19886,6322,content://media/external/images/media/6322,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0269.jpg",image/jpeg,1600,1063,0,215681,,1637518221,1563954787000,0,0,0,0,,,,,,,,,,, +19887,6438,content://media/external/images/media/6438,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0268.jpg",image/jpeg,1600,1063,0,206930,,1637518221,1563954674000,0,0,0,0,,,,,,,,,,, +19888,6544,content://media/external/images/media/6544,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0266.jpg",image/jpeg,1600,1063,0,274043,,1637518221,1563954674000,0,0,0,0,,,,,,,,,,, +19889,6648,content://media/external/images/media/6648,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0267.jpg",image/jpeg,1600,1063,0,257313,,1637518221,1563954674000,0,0,0,0,,,,,,,,,,, +19890,6003,content://media/external/images/media/6003,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0265.jpg",image/jpeg,1063,1600,0,329137,,1637518220,1563954673000,0,0,0,0,,,,,,,,,,, +19891,6437,content://media/external/images/media/6437,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0264.jpg",image/jpeg,1063,1600,0,333519,,1637518221,1563954673000,0,0,0,0,,,,,,,,,,, +19892,6436,content://media/external/images/media/6436,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0262.jpg",image/jpeg,1600,1063,0,318421,,1637518221,1563954672000,0,0,0,0,,,,,,,,,,, +19893,6646,content://media/external/images/media/6646,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0263.jpg",image/jpeg,1600,1063,0,336132,,1637518221,1563954672000,0,0,0,0,,,,,,,,,,, +19894,6856,content://media/external/images/media/6856,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0261.jpg",image/jpeg,1600,1063,0,239959,,1637518222,1563954672000,0,0,0,0,,,,,,,,,,, +19895,6435,content://media/external/images/media/6435,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0259.jpg",image/jpeg,1600,1063,0,265639,,1637518221,1563954671000,0,0,0,0,,,,,,,,,,, +19896,6972,content://media/external/images/media/6972,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0260.jpg",image/jpeg,1600,1063,0,281517,,1637518222,1563954671000,0,0,0,0,,,,,,,,,,, +19897,6433,content://media/external/images/media/6433,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0258.jpg",image/jpeg,1600,1063,0,229052,,1637518221,1563954670000,0,0,0,0,,,,,,,,,,, +19898,6853,content://media/external/images/media/6853,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0257.jpg",image/jpeg,1600,1063,0,326424,,1637518222,1563954670000,0,0,0,0,,,,,,,,,,, +19899,5998,content://media/external/images/media/5998,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0256.jpg",image/jpeg,1600,1063,0,203425,,1637518220,1563954669000,0,0,0,0,,,,,,,,,,, +19900,5999,content://media/external/images/media/5999,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0253.jpg",image/jpeg,1600,1063,0,361305,,1637518220,1563954553000,0,0,0,0,,,,,,,,,,, +19901,6541,content://media/external/images/media/6541,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0254.jpg",image/jpeg,1600,1063,0,304392,,1637518221,1563954553000,0,0,0,0,,,,,,,,,,, +19902,6968,content://media/external/images/media/6968,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0255.jpg",image/jpeg,1600,1063,0,239569,,1637518222,1563954553000,0,0,0,0,,,,,,,,,,, +19903,6216,content://media/external/images/media/6216,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0252.jpg",image/jpeg,1600,1063,0,280316,,1637518221,1563954552000,0,0,0,0,,,,,,,,,,, +19904,6645,content://media/external/images/media/6645,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0251.jpg",image/jpeg,1600,1063,0,316634,,1637518221,1563954552000,0,0,0,0,,,,,,,,,,, +19905,5997,content://media/external/images/media/5997,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0250.jpg",image/jpeg,1600,1063,0,326408,,1637518220,1563954551000,0,0,0,0,,,,,,,,,,, +19906,6431,content://media/external/images/media/6431,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0249.jpg",image/jpeg,1600,1063,0,330591,,1637518221,1563954551000,0,0,0,0,,,,,,,,,,, +19907,5995,content://media/external/images/media/5995,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0248.jpg",image/jpeg,1600,1063,0,395378,,1637518220,1563954550000,0,0,0,0,,,,,,,,,,, +19908,6967,content://media/external/images/media/6967,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0247.jpg",image/jpeg,1600,1063,0,419725,,1637518222,1563954550000,0,0,0,0,,,,,,,,,,, +19909,6430,content://media/external/images/media/6430,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0246.jpg",image/jpeg,1600,1063,0,417564,,1637518221,1563954549000,0,0,0,0,,,,,,,,,,, +19910,6644,content://media/external/images/media/6644,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0245.jpg",image/jpeg,1600,1063,0,305459,,1637518221,1563954549000,0,0,0,0,,,,,,,,,,, +19911,6539,content://media/external/images/media/6539,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0244.jpg",image/jpeg,1600,1063,0,459061,,1637518221,1563954548000,0,0,0,0,,,,,,,,,,, +19912,5897,content://media/external/images/media/5897,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0242.jpg",image/jpeg,1600,1063,0,323399,,1637518220,1563954547000,0,0,0,0,,,,,,,,,,, +19913,6641,content://media/external/images/media/6641,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0243.jpg",image/jpeg,1600,1063,0,327002,,1637518221,1563954547000,0,0,0,0,,,,,,,,,,, +19914,5993,content://media/external/images/media/5993,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0241.jpg",image/jpeg,1600,1063,0,417631,,1637518220,1563954434000,0,0,0,0,,,,,,,,,,, +19915,6640,content://media/external/images/media/6640,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0240.jpg",image/jpeg,1600,1063,0,329406,,1637518221,1563954434000,0,0,0,0,,,,,,,,,,, +19916,5893,content://media/external/images/media/5893,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0237.jpg",image/jpeg,1600,1063,0,225858,,1637518220,1563954433000,0,0,0,0,,,,,,,,,,, +19917,5990,content://media/external/images/media/5990,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0238.jpg",image/jpeg,1600,1063,0,346403,,1637518220,1563954433000,0,0,0,0,,,,,,,,,,, +19918,6108,content://media/external/images/media/6108,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0239.jpg",image/jpeg,1063,1600,0,352996,,1637518220,1563954433000,0,0,0,0,,,,,,,,,,, +19919,6105,content://media/external/images/media/6105,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0235.jpg",image/jpeg,1600,1063,0,301008,,1637518220,1563954432000,0,0,0,0,,,,,,,,,,, +19920,6106,content://media/external/images/media/6106,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0236.jpg",image/jpeg,1600,1063,0,244652,,1637518220,1563954432000,0,0,0,0,,,,,,,,,,, +19921,5895,content://media/external/images/media/5895,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0233.jpg",image/jpeg,1063,1600,0,358115,,1637518220,1563954431000,0,0,0,0,,,,,,,,,,, +19922,5988,content://media/external/images/media/5988,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0234.jpg",image/jpeg,1063,1600,0,294308,,1637518220,1563954431000,0,0,0,0,,,,,,,,,,, +19923,6102,content://media/external/images/media/6102,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0232.jpg",image/jpeg,1063,1600,0,249321,,1637518220,1563954431000,0,0,0,0,,,,,,,,,,, +19924,5894,content://media/external/images/media/5894,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0231.jpg",image/jpeg,1600,1063,0,297690,,1637518220,1563954430000,0,0,0,0,,,,,,,,,,, +19925,6964,content://media/external/images/media/6964,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0230.jpg",image/jpeg,1063,1600,0,259764,,1637518222,1563954430000,0,0,0,0,,,,,,,,,,, +19926,6101,content://media/external/images/media/6101,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0229.jpg",image/jpeg,1063,1600,0,275225,,1637518220,1563954429000,0,0,0,0,,,,,,,,,,, +19927,6960,content://media/external/images/media/6960,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0228.jpg",image/jpeg,1600,1063,0,235694,,1637518222,1563954428000,0,0,0,0,,,,,,,,,,, +19928,5891,content://media/external/images/media/5891,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0227.jpg",image/jpeg,1600,1063,0,347216,,1637518220,1563954427000,0,0,0,0,,,,,,,,,,, +19929,5890,content://media/external/images/media/5890,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0226.jpg",image/jpeg,1600,1063,0,259673,,1637518220,1563954291000,0,0,0,0,,,,,,,,,,, +19930,5987,content://media/external/images/media/5987,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0224.jpg",image/jpeg,1600,1063,0,190888,,1637518220,1563954290000,0,0,0,0,,,,,,,,,,, +19931,6961,content://media/external/images/media/6961,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0225.jpg",image/jpeg,1600,1063,0,204247,,1637518222,1563954290000,0,0,0,0,,,,,,,,,,, +19932,5986,content://media/external/images/media/5986,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0222.jpg",image/jpeg,1063,1600,0,282876,,1637518220,1563954289000,0,0,0,0,,,,,,,,,,, +19933,6959,content://media/external/images/media/6959,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0223.jpg",image/jpeg,1063,1600,0,331927,,1637518222,1563954289000,0,0,0,0,,,,,,,,,,, +19934,5888,content://media/external/images/media/5888,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0221.jpg",image/jpeg,1063,1600,0,249288,,1637518220,1563954288000,0,0,0,0,,,,,,,,,,, +19935,6096,content://media/external/images/media/6096,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0219.jpg",image/jpeg,1600,1063,0,335160,,1637518220,1563954288000,0,0,0,0,,,,,,,,,,, +19936,6097,content://media/external/images/media/6097,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0220.jpg",image/jpeg,1600,1063,0,288151,,1637518220,1563954288000,0,0,0,0,,,,,,,,,,, +19937,5982,content://media/external/images/media/5982,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0216.jpg",image/jpeg,1063,1600,0,266861,,1637518220,1563954287000,0,0,0,0,,,,,,,,,,, +19938,6093,content://media/external/images/media/6093,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0218.jpg",image/jpeg,1600,1063,0,253375,,1637518220,1563954287000,0,0,0,0,,,,,,,,,,, +19939,6958,content://media/external/images/media/6958,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0217.jpg",image/jpeg,1600,1063,0,324911,,1637518222,1563954287000,0,0,0,0,,,,,,,,,,, +19940,5884,content://media/external/images/media/5884,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0214.jpg",image/jpeg,1600,1063,0,208268,,1637518220,1563954286000,0,0,0,0,,,,,,,,,,, +19941,6214,content://media/external/images/media/6214,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0215.jpg",image/jpeg,1063,1600,0,311131,,1637518221,1563954286000,0,0,0,0,,,,,,,,,,, +19942,6212,content://media/external/images/media/6212,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0213.jpg",image/jpeg,1600,1063,0,251801,,1637518221,1563954285000,0,0,0,0,,,,,,,,,,, +19943,5983,content://media/external/images/media/5983,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0212.jpg",image/jpeg,1600,1063,0,205356,,1637518220,1563954284000,0,0,0,0,,,,,,,,,,, +19944,6210,content://media/external/images/media/6210,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0211.jpg",image/jpeg,1600,1063,0,334545,,1637518221,1563954151000,0,0,0,0,,,,,,,,,,, +19945,5881,content://media/external/images/media/5881,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0208.jpg",image/jpeg,1600,1063,0,230285,,1637518220,1563954150000,0,0,0,0,,,,,,,,,,, +19946,6207,content://media/external/images/media/6207,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0209.jpg",image/jpeg,1600,1063,0,137324,,1637518221,1563954150000,0,0,0,0,,,,,,,,,,, +19947,6211,content://media/external/images/media/6211,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0210.jpg",image/jpeg,1600,1063,0,139202,,1637518221,1563954150000,0,0,0,0,,,,,,,,,,, +19948,6091,content://media/external/images/media/6091,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0207.jpg",image/jpeg,1600,1063,0,320700,,1637518220,1563954149000,0,0,0,0,,,,,,,,,,, +19949,6208,content://media/external/images/media/6208,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0206.jpg",image/jpeg,1600,1063,0,326640,,1637518221,1563954149000,0,0,0,0,,,,,,,,,,, +19950,5878,content://media/external/images/media/5878,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0204.jpg",image/jpeg,1600,1063,0,332809,,1637518220,1563954148000,0,0,0,0,,,,,,,,,,, +19951,5977,content://media/external/images/media/5977,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0203.jpg",image/jpeg,1600,1063,0,161952,,1637518220,1563954148000,0,0,0,0,,,,,,,,,,, +19952,6090,content://media/external/images/media/6090,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0205.jpg",image/jpeg,1600,1063,0,340395,,1637518220,1563954148000,0,0,0,0,,,,,,,,,,, +19953,5877,content://media/external/images/media/5877,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0201.jpg",image/jpeg,1600,1063,0,348422,,1637518220,1563954147000,0,0,0,0,,,,,,,,,,, +19954,6088,content://media/external/images/media/6088,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0202.jpg",image/jpeg,1600,1063,0,253069,,1637518220,1563954147000,0,0,0,0,,,,,,,,,,, +19955,5974,content://media/external/images/media/5974,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0199.jpg",image/jpeg,1600,1063,0,341616,,1637518220,1563954146000,0,0,0,0,,,,,,,,,,, +19956,6087,content://media/external/images/media/6087,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0200.jpg",image/jpeg,1063,1600,0,269712,,1637518220,1563954146000,0,0,0,0,,,,,,,,,,, +19957,6086,content://media/external/images/media/6086,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0198.jpg",image/jpeg,1600,1063,0,302119,,1637518220,1563954145000,0,0,0,0,,,,,,,,,,, +19958,6205,content://media/external/images/media/6205,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0197.jpg",image/jpeg,1600,1063,0,244917,,1637518221,1563954145000,0,0,0,0,,,,,,,,,,, +19959,5876,content://media/external/images/media/5876,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0195.jpg",image/jpeg,1600,1063,0,246673,,1637518220,1563954062000,0,0,0,0,,,,,,,,,,, +19960,6083,content://media/external/images/media/6083,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0196.jpg",image/jpeg,1600,1063,0,198057,,1637518220,1563954062000,0,0,0,0,,,,,,,,,,, +19961,6084,content://media/external/images/media/6084,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0194.jpg",image/jpeg,1600,1063,0,168873,,1637518220,1563954061000,0,0,0,0,,,,,,,,,,, +19962,6200,content://media/external/images/media/6200,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0193.jpg",image/jpeg,1600,1063,0,235881,,1637518221,1563954061000,0,0,0,0,,,,,,,,,,, +19963,6203,content://media/external/images/media/6203,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0192.jpg",image/jpeg,1600,1063,0,189029,,1637518221,1563954061000,0,0,0,0,,,,,,,,,,, +19964,5969,content://media/external/images/media/5969,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0190.jpg",image/jpeg,1600,1063,0,370182,,1637518220,1563954060000,0,0,0,0,,,,,,,,,,, +19965,6082,content://media/external/images/media/6082,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0191.jpg",image/jpeg,1600,1063,0,289646,,1637518220,1563954060000,0,0,0,0,,,,,,,,,,, +19966,6199,content://media/external/images/media/6199,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0189.jpg",image/jpeg,1600,1063,0,317542,,1637518221,1563954060000,0,0,0,0,,,,,,,,,,, +19967,6079,content://media/external/images/media/6079,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0188.jpg",image/jpeg,1600,1063,0,350255,,1637518220,1563954059000,0,0,0,0,,,,,,,,,,, +19968,5968,content://media/external/images/media/5968,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0186.jpg",image/jpeg,1600,1063,0,319737,,1637518220,1563954058000,0,0,0,0,,,,,,,,,,, +19969,6078,content://media/external/images/media/6078,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0187.jpg",image/jpeg,1600,1063,0,322690,,1637518220,1563954058000,0,0,0,0,,,,,,,,,,, +19970,5967,content://media/external/images/media/5967,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0183.jpg",image/jpeg,1600,1063,0,381248,,1637518220,1563954057000,0,0,0,0,,,,,,,,,,, +19971,6075,content://media/external/images/media/6075,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0185.jpg",image/jpeg,1600,1063,0,356149,,1637518220,1563954057000,0,0,0,0,,,,,,,,,,, +19972,6194,content://media/external/images/media/6194,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0184.jpg",image/jpeg,1600,1063,0,400882,,1637518221,1563954057000,0,0,0,0,,,,,,,,,,, +19973,5874,content://media/external/images/media/5874,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0181.jpg",image/jpeg,1600,1063,0,386250,,1637518220,1563954056000,0,0,0,0,,,,,,,,,,, +19974,5965,content://media/external/images/media/5965,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0182.jpg",image/jpeg,1600,1063,0,408812,,1637518220,1563954056000,0,0,0,0,,,,,,,,,,, +19975,5962,content://media/external/images/media/5962,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0180.jpg",image/jpeg,1600,1063,0,350573,,1637518220,1563954055000,0,0,0,0,,,,,,,,,,, +19976,6076,content://media/external/images/media/6076,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0179.jpg",image/jpeg,1600,1063,0,270701,,1637518220,1563954055000,0,0,0,0,,,,,,,,,,, +19977,5961,content://media/external/images/media/5961,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0178.jpg",image/jpeg,1600,1063,0,181596,,1637518220,1563954054000,0,0,0,0,,,,,,,,,,, +19978,6070,content://media/external/images/media/6070,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0177.jpg",image/jpeg,1600,1063,0,175129,,1637518220,1563954054000,0,0,0,0,,,,,,,,,,, +19979,5958,content://media/external/images/media/5958,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0176.jpg",image/jpeg,1600,1063,0,262013,,1637518220,1563953967000,0,0,0,0,,,,,,,,,,, +19980,5959,content://media/external/images/media/5959,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0175.jpg",image/jpeg,1600,1063,0,230741,,1637518220,1563953967000,0,0,0,0,,,,,,,,,,, +19981,5871,content://media/external/images/media/5871,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0173.jpg",image/jpeg,1600,1063,0,416356,,1637518220,1563953966000,0,0,0,0,,,,,,,,,,, +19982,5957,content://media/external/images/media/5957,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0174.jpg",image/jpeg,1600,1063,0,302619,,1637518220,1563953966000,0,0,0,0,,,,,,,,,,, +19983,5869,content://media/external/images/media/5869,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0172.jpg",image/jpeg,1600,1063,0,330576,,1637518220,1563953965000,0,0,0,0,,,,,,,,,,, +19984,5955,content://media/external/images/media/5955,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0170.jpg",image/jpeg,1600,1063,0,335538,,1637518220,1563953965000,0,0,0,0,,,,,,,,,,, +19985,6191,content://media/external/images/media/6191,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0171.jpg",image/jpeg,1600,1063,0,216855,,1637518221,1563953965000,0,0,0,0,,,,,,,,,,, +19986,5954,content://media/external/images/media/5954,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0168.jpg",image/jpeg,1600,1063,0,384841,,1637518220,1563953964000,0,0,0,0,,,,,,,,,,, +19987,6073,content://media/external/images/media/6073,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0169.jpg",image/jpeg,1600,1063,0,288235,,1637518220,1563953964000,0,0,0,0,,,,,,,,,,, +19988,5819,content://media/external/images/media/5819,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0166.jpg",image/jpeg,1600,1063,0,291252,,1637518220,1563953963000,0,0,0,0,,,,,,,,,,, +19989,5868,content://media/external/images/media/5868,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0167.jpg",image/jpeg,1600,1063,0,383092,,1637518220,1563953963000,0,0,0,0,,,,,,,,,,, +19990,5817,content://media/external/images/media/5817,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0164.jpg",image/jpeg,1600,1063,0,301846,,1637518220,1563953962000,0,0,0,0,,,,,,,,,,, +19991,5818,content://media/external/images/media/5818,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0165.jpg",image/jpeg,1600,1063,0,190164,,1637518220,1563953962000,0,0,0,0,,,,,,,,,,, +19992,6147,content://media/external/images/media/6147,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0163.jpg",image/jpeg,1600,1063,0,301545,,1637518220,1563953962000,0,0,0,0,,,,,,,,,,, +19993,5916,content://media/external/images/media/5916,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0162.jpg",image/jpeg,1600,1063,0,343611,,1637518220,1563953961000,0,0,0,0,,,,,,,,,,, +19994,6146,content://media/external/images/media/6146,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0161.jpg",image/jpeg,1600,1063,0,250259,,1637518220,1563953961000,0,0,0,0,,,,,,,,,,, +19995,5815,content://media/external/images/media/5815,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0159.jpg",image/jpeg,1600,1063,0,245710,,1637518220,1563953960000,0,0,0,0,,,,,,,,,,, +19996,5816,content://media/external/images/media/5816,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0160.jpg",image/jpeg,1600,1063,0,198792,,1637518220,1563953960000,0,0,0,0,,,,,,,,,,, +19997,6024,content://media/external/images/media/6024,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0158.jpg",image/jpeg,1600,1063,0,407420,,1637518220,1563953960000,0,0,0,0,,,,,,,,,,, +19998,5814,content://media/external/images/media/5814,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0157.jpg",image/jpeg,1600,1063,0,302107,,1637518220,1563953959000,0,0,0,0,,,,,,,,,,, +19999,6145,content://media/external/images/media/6145,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0156.jpg",image/jpeg,1600,1063,0,257810,,1637518220,1563953874000,0,0,0,0,,,,,,,,,,, +20000,6143,content://media/external/images/media/6143,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0154.jpg",image/jpeg,1600,1063,0,257141,,1637518220,1563953873000,0,0,0,0,,,,,,,,,,, +20001,6144,content://media/external/images/media/6144,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0155.jpg",image/jpeg,1600,1063,0,201570,,1637518220,1563953873000,0,0,0,0,,,,,,,,,,, +20002,5813,content://media/external/images/media/5813,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0153.jpg",image/jpeg,1600,1063,0,267168,,1637518220,1563953872000,0,0,0,0,,,,,,,,,,, +20003,6023,content://media/external/images/media/6023,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0152.jpg",image/jpeg,1600,1063,0,363801,,1637518220,1563953872000,0,0,0,0,,,,,,,,,,, +20004,6142,content://media/external/images/media/6142,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0151.jpg",image/jpeg,1600,1063,0,251854,,1637518220,1563953872000,0,0,0,0,,,,,,,,,,, +20005,5812,content://media/external/images/media/5812,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0150.jpg",image/jpeg,1600,1063,0,237846,,1637518220,1563953871000,0,0,0,0,,,,,,,,,,, +20006,5915,content://media/external/images/media/5915,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0149.jpg",image/jpeg,1600,1063,0,259915,,1637518220,1563953871000,0,0,0,0,,,,,,,,,,, +20007,6141,content://media/external/images/media/6141,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0148.jpg",image/jpeg,1600,1063,0,346624,,1637518220,1563953871000,0,0,0,0,,,,,,,,,,, +20008,5811,content://media/external/images/media/5811,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0147.jpg",image/jpeg,1600,1063,0,310737,,1637518220,1563953870000,0,0,0,0,,,,,,,,,,, +20009,6022,content://media/external/images/media/6022,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0146.jpg",image/jpeg,1600,1063,0,321465,,1637518220,1563953870000,0,0,0,0,,,,,,,,,,, +20010,5809,content://media/external/images/media/5809,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0144.jpg",image/jpeg,1600,1063,0,214554,,1637518220,1563953869000,0,0,0,0,,,,,,,,,,, +20011,5810,content://media/external/images/media/5810,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0145.jpg",image/jpeg,1600,1063,0,119315,,1637518220,1563953869000,0,0,0,0,,,,,,,,,,, +20012,6021,content://media/external/images/media/6021,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0143.jpg",image/jpeg,1600,1063,0,270460,,1637518220,1563953869000,0,0,0,0,,,,,,,,,,, +20013,5914,content://media/external/images/media/5914,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0142.jpg",image/jpeg,1600,1063,0,416011,,1637518220,1563953868000,0,0,0,0,,,,,,,,,,, +20014,6020,content://media/external/images/media/6020,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0141.jpg",image/jpeg,1600,1063,0,487686,,1637518220,1563953868000,0,0,0,0,,,,,,,,,,, +20015,5913,content://media/external/images/media/5913,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0139.jpg",image/jpeg,1600,1063,0,270008,,1637518220,1563953867000,0,0,0,0,,,,,,,,,,, +20016,6140,content://media/external/images/media/6140,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0140.jpg",image/jpeg,1600,1063,0,378068,,1637518220,1563953867000,0,0,0,0,,,,,,,,,,, +20017,5912,content://media/external/images/media/5912,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0137.jpg",image/jpeg,1600,1063,0,214802,,1637518220,1563953866000,0,0,0,0,,,,,,,,,,, +20018,6019,content://media/external/images/media/6019,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0138.jpg",image/jpeg,1600,1063,0,191332,,1637518220,1563953866000,0,0,0,0,,,,,,,,,,, +20019,6139,content://media/external/images/media/6139,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0136.jpg",image/jpeg,1600,1063,0,267067,,1637518220,1563953745000,0,0,0,0,,,,,,,,,,, +20020,5808,content://media/external/images/media/5808,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0135.jpg",image/jpeg,1600,1063,0,316746,,1637518220,1563953744000,0,0,0,0,,,,,,,,,,, +20021,6018,content://media/external/images/media/6018,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0134.jpg",image/jpeg,1600,1063,0,235178,,1637518220,1563953744000,0,0,0,0,,,,,,,,,,, +20022,5807,content://media/external/images/media/5807,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0131.jpg",image/jpeg,1600,1063,0,256005,,1637518220,1563953743000,0,0,0,0,,,,,,,,,,, +20023,5911,content://media/external/images/media/5911,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0132.jpg",image/jpeg,1600,1063,0,224397,,1637518220,1563953743000,0,0,0,0,,,,,,,,,,, +20024,6017,content://media/external/images/media/6017,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0133.jpg",image/jpeg,1600,1063,0,255532,,1637518220,1563953743000,0,0,0,0,,,,,,,,,,, +20025,6016,content://media/external/images/media/6016,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0129.jpg",image/jpeg,1600,1063,0,263159,,1637518220,1563953742000,0,0,0,0,,,,,,,,,,, +20026,6138,content://media/external/images/media/6138,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0130.jpg",image/jpeg,1600,1063,0,285928,,1637518220,1563953742000,0,0,0,0,,,,,,,,,,, +20027,5806,content://media/external/images/media/5806,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0127.jpg",image/jpeg,1600,1063,0,396186,,1637518220,1563953741000,0,0,0,0,,,,,,,,,,, +20028,6136,content://media/external/images/media/6136,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0126.jpg",image/jpeg,1600,1063,0,289420,,1637518220,1563953741000,0,0,0,0,,,,,,,,,,, +20029,6137,content://media/external/images/media/6137,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0128.jpg",image/jpeg,1600,1063,0,248216,,1637518220,1563953741000,0,0,0,0,,,,,,,,,,, +20030,5910,content://media/external/images/media/5910,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0124.jpg",image/jpeg,1600,1063,0,359877,,1637518220,1563953740000,0,0,0,0,,,,,,,,,,, +20031,6015,content://media/external/images/media/6015,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0125.jpg",image/jpeg,1600,1063,0,369672,,1637518220,1563953740000,0,0,0,0,,,,,,,,,,, +20032,6014,content://media/external/images/media/6014,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0122.jpg",image/jpeg,1600,1063,0,311080,,1637518220,1563953739000,0,0,0,0,,,,,,,,,,, +20033,6134,content://media/external/images/media/6134,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0121.jpg",image/jpeg,1600,1063,0,276346,,1637518220,1563953739000,0,0,0,0,,,,,,,,,,, +20034,6135,content://media/external/images/media/6135,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0123.jpg",image/jpeg,1600,1063,0,279053,,1637518220,1563953739000,0,0,0,0,,,,,,,,,,, +20035,6132,content://media/external/images/media/6132,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0119.jpg",image/jpeg,1600,1063,0,290290,,1637518220,1563953738000,0,0,0,0,,,,,,,,,,, +20036,6133,content://media/external/images/media/6133,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0120.jpg",image/jpeg,1600,1063,0,335775,,1637518220,1563953738000,0,0,0,0,,,,,,,,,,, +20037,5909,content://media/external/images/media/5909,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0117.jpg",image/jpeg,1600,1063,0,277759,,1637518220,1563953737000,0,0,0,0,,,,,,,,,,, +20038,6013,content://media/external/images/media/6013,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0118.jpg",image/jpeg,1600,1063,0,380762,,1637518220,1563953737000,0,0,0,0,,,,,,,,,,, +20039,6131,content://media/external/images/media/6131,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0116.jpg",image/jpeg,1600,1063,0,167279,,1637518220,1563953555000,0,0,0,0,,,,,,,,,,, +20040,6012,content://media/external/images/media/6012,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0115.jpg",image/jpeg,1600,1063,0,148326,,1637518220,1563953554000,0,0,0,0,,,,,,,,,,, +20041,6130,content://media/external/images/media/6130,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0114.jpg",image/jpeg,1600,1063,0,240070,,1637518220,1563953554000,0,0,0,0,,,,,,,,,,, +20042,6127,content://media/external/images/media/6127,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0111.jpg",image/jpeg,1600,1063,0,339792,,1637518220,1563953553000,0,0,0,0,,,,,,,,,,, +20043,6128,content://media/external/images/media/6128,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0112.jpg",image/jpeg,1600,1063,0,309169,,1637518220,1563953553000,0,0,0,0,,,,,,,,,,, +20044,6129,content://media/external/images/media/6129,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0113.jpg",image/jpeg,1600,1063,0,293839,,1637518220,1563953553000,0,0,0,0,,,,,,,,,,, +20045,5805,content://media/external/images/media/5805,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0109.jpg",image/jpeg,1600,1063,0,278356,,1637518220,1563953552000,0,0,0,0,,,,,,,,,,, +20046,5908,content://media/external/images/media/5908,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0110.jpg",image/jpeg,1600,1063,0,332355,,1637518220,1563953552000,0,0,0,0,,,,,,,,,,, +20047,5804,content://media/external/images/media/5804,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0108.jpg",image/jpeg,1600,1063,0,314581,,1637518220,1563953551000,0,0,0,0,,,,,,,,,,, +20048,6011,content://media/external/images/media/6011,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0107.jpg",image/jpeg,1600,1063,0,342990,,1637518220,1563953551000,0,0,0,0,,,,,,,,,,, +20049,5803,content://media/external/images/media/5803,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0106.jpg",image/jpeg,1600,1063,0,362629,,1637518220,1563953550000,0,0,0,0,,,,,,,,,,, +20050,5907,content://media/external/images/media/5907,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0105.jpg",image/jpeg,1600,1063,0,280186,,1637518220,1563953550000,0,0,0,0,,,,,,,,,,, +20051,6010,content://media/external/images/media/6010,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0104.jpg",image/jpeg,1600,1063,0,331322,,1637518220,1563953549000,0,0,0,0,,,,,,,,,,, +20052,6126,content://media/external/images/media/6126,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0103.jpg",image/jpeg,1600,1063,0,404496,,1637518220,1563953549000,0,0,0,0,,,,,,,,,,, +20053,6125,content://media/external/images/media/6125,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0102.jpg",image/jpeg,1063,1600,0,334155,,1637518220,1563953548000,0,0,0,0,,,,,,,,,,, +20054,6009,content://media/external/images/media/6009,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0101.jpg",image/jpeg,1600,1063,0,315770,,1637518220,1563953472000,0,0,0,0,,,,,,,,,,, +20055,5802,content://media/external/images/media/5802,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0099.jpg",image/jpeg,1600,1063,0,266771,,1637518220,1563953471000,0,0,0,0,,,,,,,,,,, +20056,5906,content://media/external/images/media/5906,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0100.jpg",image/jpeg,1600,1063,0,234817,,1637518220,1563953471000,0,0,0,0,,,,,,,,,,, +20057,5904,content://media/external/images/media/5904,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0097.jpg",image/jpeg,1600,1063,0,301350,,1637518220,1563953470000,0,0,0,0,,,,,,,,,,, +20058,5905,content://media/external/images/media/5905,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0098.jpg",image/jpeg,1600,1063,0,287294,,1637518220,1563953470000,0,0,0,0,,,,,,,,,,, +20059,6008,content://media/external/images/media/6008,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0096.jpg",image/jpeg,1600,1063,0,365229,,1637518220,1563953469000,0,0,0,0,,,,,,,,,,, +20060,6124,content://media/external/images/media/6124,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0095.jpg",image/jpeg,1600,1063,0,310162,,1637518220,1563953469000,0,0,0,0,,,,,,,,,,, +20061,5902,content://media/external/images/media/5902,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0093.jpg",image/jpeg,1600,1063,0,400504,,1637518220,1563953467000,0,0,0,0,,,,,,,,,,, +20062,5903,content://media/external/images/media/5903,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0094.jpg",image/jpeg,1600,1063,0,298495,,1637518220,1563953467000,0,0,0,0,,,,,,,,,,, +20063,5801,content://media/external/images/media/5801,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0091.jpg",image/jpeg,1600,1063,0,345338,,1637518220,1563953466000,0,0,0,0,,,,,,,,,,, +20064,6007,content://media/external/images/media/6007,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0092.jpg",image/jpeg,1600,1063,0,329872,,1637518220,1563953466000,0,0,0,0,,,,,,,,,,, +20065,5800,content://media/external/images/media/5800,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0090.jpg",image/jpeg,1600,1063,0,277614,,1637518220,1563953465000,0,0,0,0,,,,,,,,,,, +20066,6006,content://media/external/images/media/6006,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0088.jpg",image/jpeg,1600,1063,0,244696,,1637518220,1563953465000,0,0,0,0,,,,,,,,,,, +20067,6123,content://media/external/images/media/6123,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0089.jpg",image/jpeg,1600,1063,0,368367,,1637518220,1563953465000,0,0,0,0,,,,,,,,,,, +20068,5798,content://media/external/images/media/5798,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0086.jpg",image/jpeg,1600,1063,0,361205,,1637518220,1563953464000,0,0,0,0,,,,,,,,,,, +20069,5799,content://media/external/images/media/5799,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0087.jpg",image/jpeg,1600,1063,0,328936,,1637518220,1563953464000,0,0,0,0,,,,,,,,,,, +20070,5796,content://media/external/images/media/5796,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0084.jpg",image/jpeg,1600,1063,0,427672,,1637518220,1563953463000,0,0,0,0,,,,,,,,,,, +20071,5797,content://media/external/images/media/5797,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0085.jpg",image/jpeg,1600,1063,0,286046,,1637518220,1563953463000,0,0,0,0,,,,,,,,,,, +20072,6005,content://media/external/images/media/6005,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0083.jpg",image/jpeg,1600,1063,0,270140,,1637518220,1563953462000,0,0,0,0,,,,,,,,,,, +20073,5901,content://media/external/images/media/5901,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0082.jpg",image/jpeg,1600,1063,0,265287,,1637518220,1563953461000,0,0,0,0,,,,,,,,,,, +20074,6122,content://media/external/images/media/6122,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0081.jpg",image/jpeg,1600,1063,0,309547,,1637518220,1563953368000,0,0,0,0,,,,,,,,,,, +20075,5795,content://media/external/images/media/5795,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0080.jpg",image/jpeg,1600,1063,0,376810,,1637518220,1563953367000,0,0,0,0,,,,,,,,,,, +20076,6004,content://media/external/images/media/6004,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0078.jpg",image/jpeg,1600,1063,0,408991,,1637518220,1563953367000,0,0,0,0,,,,,,,,,,, +20077,6121,content://media/external/images/media/6121,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0079.jpg",image/jpeg,1600,1063,0,368338,,1637518220,1563953367000,0,0,0,0,,,,,,,,,,, +20078,5794,content://media/external/images/media/5794,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0076.jpg",image/jpeg,1600,1063,0,342310,,1637518220,1563953366000,0,0,0,0,,,,,,,,,,, +20079,5900,content://media/external/images/media/5900,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0077.jpg",image/jpeg,1600,1063,0,342425,,1637518220,1563953366000,0,0,0,0,,,,,,,,,,, +20080,6120,content://media/external/images/media/6120,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0075.jpg",image/jpeg,1600,1063,0,417138,,1637518220,1563953366000,0,0,0,0,,,,,,,,,,, +20081,6118,content://media/external/images/media/6118,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0073.jpg",image/jpeg,1600,1063,0,393123,,1637518220,1563953365000,0,0,0,0,,,,,,,,,,, +20082,6119,content://media/external/images/media/6119,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0074.jpg",image/jpeg,1600,1063,0,365989,,1637518220,1563953365000,0,0,0,0,,,,,,,,,,, +20083,5793,content://media/external/images/media/5793,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0072.jpg",image/jpeg,1600,1063,0,413497,,1637518220,1563953364000,0,0,0,0,,,,,,,,,,, +20084,5684,content://media/external/images/media/5684,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0069.jpg",image/jpeg,1600,1063,0,379029,,1637518219,1563953363000,0,0,0,0,,,,,,,,,,, +20085,5685,content://media/external/images/media/5685,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0070.jpg",image/jpeg,1600,1063,0,385707,,1637518219,1563953363000,0,0,0,0,,,,,,,,,,, +20086,5792,content://media/external/images/media/5792,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0071.jpg",image/jpeg,1600,1063,0,324080,,1637518220,1563953363000,0,0,0,0,,,,,,,,,,, +20087,5899,content://media/external/images/media/5899,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0067.jpg",image/jpeg,1600,1063,0,291492,,1637518220,1563953362000,0,0,0,0,,,,,,,,,,, +20088,6117,content://media/external/images/media/6117,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0068.jpg",image/jpeg,1600,1063,0,441415,,1637518220,1563953362000,0,0,0,0,,,,,,,,,,, +20089,5683,content://media/external/images/media/5683,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0065.jpg",image/jpeg,1600,1063,0,432457,,1637518219,1563953361000,0,0,0,0,,,,,,,,,,, +20090,6116,content://media/external/images/media/6116,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0066.jpg",image/jpeg,1600,1063,0,410758,,1637518220,1563953361000,0,0,0,0,,,,,,,,,,, +20091,5682,content://media/external/images/media/5682,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0064.jpg",image/jpeg,1600,1063,0,299755,,1637518219,1563953360000,0,0,0,0,,,,,,,,,,, +20092,6115,content://media/external/images/media/6115,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0063.jpg",image/jpeg,1600,1063,0,327956,,1637518220,1563953360000,0,0,0,0,,,,,,,,,,, +20093,5898,content://media/external/images/media/5898,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0062.jpg",image/jpeg,1600,1063,0,293261,,1637518220,1563953358000,0,0,0,0,,,,,,,,,,, +20094,5681,content://media/external/images/media/5681,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0060.jpg",image/jpeg,1600,1063,0,179197,,1637518219,1563953253000,0,0,0,0,,,,,,,,,,, +20095,6114,content://media/external/images/media/6114,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0061.jpg",image/jpeg,1600,1063,0,323370,,1637518220,1563953253000,0,0,0,0,,,,,,,,,,, +20096,5680,content://media/external/images/media/5680,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0059.jpg",image/jpeg,1600,1063,0,344578,,1637518219,1563953252000,0,0,0,0,,,,,,,,,,, +20097,6113,content://media/external/images/media/6113,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0058.jpg",image/jpeg,1600,1063,0,325288,,1637518220,1563953252000,0,0,0,0,,,,,,,,,,, +20098,5678,content://media/external/images/media/5678,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0055.jpg",image/jpeg,1600,1063,0,278777,,1637518219,1563953251000,0,0,0,0,,,,,,,,,,, +20099,5679,content://media/external/images/media/5679,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0057.jpg",image/jpeg,1600,1063,0,323309,,1637518219,1563953251000,0,0,0,0,,,,,,,,,,, +20100,6112,content://media/external/images/media/6112,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0056.jpg",image/jpeg,1600,1063,0,366833,,1637518220,1563953251000,0,0,0,0,,,,,,,,,,, +20101,6110,content://media/external/images/media/6110,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0053.jpg",image/jpeg,1600,1063,0,245335,,1637518220,1563953250000,0,0,0,0,,,,,,,,,,, +20102,6111,content://media/external/images/media/6111,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0054.jpg",image/jpeg,1600,1063,0,225284,,1637518220,1563953250000,0,0,0,0,,,,,,,,,,, +20103,5677,content://media/external/images/media/5677,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0051.jpg",image/jpeg,1600,1063,0,293864,,1637518219,1563953249000,0,0,0,0,,,,,,,,,,, +20104,5790,content://media/external/images/media/5790,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0050.jpg",image/jpeg,1600,1063,0,356533,,1637518220,1563953249000,0,0,0,0,,,,,,,,,,, +20105,5791,content://media/external/images/media/5791,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0052.jpg",image/jpeg,1600,1063,0,250223,,1637518220,1563953249000,0,0,0,0,,,,,,,,,,, +20106,5676,content://media/external/images/media/5676,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0048.jpg",image/jpeg,1600,1063,0,323339,,1637518219,1563953248000,0,0,0,0,,,,,,,,,,, +20107,5789,content://media/external/images/media/5789,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0049.jpg",image/jpeg,1600,1063,0,235369,,1637518220,1563953248000,0,0,0,0,,,,,,,,,,, +20108,5675,content://media/external/images/media/5675,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0047.jpg",image/jpeg,1600,1063,0,259400,,1637518219,1563953247000,0,0,0,0,,,,,,,,,,, +20109,5673,content://media/external/images/media/5673,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0045.jpg",image/jpeg,1600,1063,0,177906,,1637518219,1563953179000,0,0,0,0,,,,,,,,,,, +20110,5674,content://media/external/images/media/5674,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0046.jpg",image/jpeg,1600,1063,0,297230,,1637518219,1563953179000,0,0,0,0,,,,,,,,,,, +20111,5670,content://media/external/images/media/5670,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0042.jpg",image/jpeg,1600,1063,0,310986,,1637518219,1563953178000,0,0,0,0,,,,,,,,,,, +20112,5671,content://media/external/images/media/5671,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0043.jpg",image/jpeg,1600,1063,0,359323,,1637518219,1563953178000,0,0,0,0,,,,,,,,,,, +20113,5672,content://media/external/images/media/5672,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0044.jpg",image/jpeg,1600,1063,0,217665,,1637518219,1563953178000,0,0,0,0,,,,,,,,,,, +20114,5668,content://media/external/images/media/5668,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0040.jpg",image/jpeg,1600,1063,0,294968,,1637518219,1563953177000,0,0,0,0,,,,,,,,,,, +20115,5669,content://media/external/images/media/5669,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0041.jpg",image/jpeg,1600,1063,0,287901,,1637518219,1563953177000,0,0,0,0,,,,,,,,,,, +20116,5787,content://media/external/images/media/5787,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0038.jpg",image/jpeg,1600,1063,0,314493,,1637518220,1563953176000,0,0,0,0,,,,,,,,,,, +20117,5788,content://media/external/images/media/5788,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0039.jpg",image/jpeg,1600,1063,0,323038,,1637518220,1563953176000,0,0,0,0,,,,,,,,,,, +20118,5786,content://media/external/images/media/5786,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0037.jpg",image/jpeg,1600,1063,0,557188,,1637518220,1563953175000,0,0,0,0,,,,,,,,,,, +20119,5784,content://media/external/images/media/5784,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0035.jpg",image/jpeg,1600,1063,0,187149,,1637518220,1563953174000,0,0,0,0,,,,,,,,,,, +20120,5785,content://media/external/images/media/5785,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0036.jpg",image/jpeg,1600,1063,0,786201,,1637518220,1563953174000,0,0,0,0,,,,,,,,,,, +20121,5667,content://media/external/images/media/5667,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0034.jpg",image/jpeg,1600,1063,0,468278,,1637518219,1563953173000,0,0,0,0,,,,,,,,,,, +20122,5666,content://media/external/images/media/5666,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0033.jpg",image/jpeg,1600,1063,0,308362,,1637518219,1563953172000,0,0,0,0,,,,,,,,,,, +20123,5783,content://media/external/images/media/5783,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0032.jpg",image/jpeg,1600,1063,0,366036,,1637518220,1563953171000,0,0,0,0,,,,,,,,,,, +20124,5665,content://media/external/images/media/5665,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0031.jpg",image/jpeg,1600,1063,0,284047,,1637518219,1563953105000,0,0,0,0,,,,,,,,,,, +20125,5781,content://media/external/images/media/5781,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0029.jpg",image/jpeg,1600,1063,0,329727,,1637518220,1563953104000,0,0,0,0,,,,,,,,,,, +20126,5782,content://media/external/images/media/5782,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0030.jpg",image/jpeg,1600,1063,0,336000,,1637518220,1563953104000,0,0,0,0,,,,,,,,,,, +20127,5664,content://media/external/images/media/5664,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0028.jpg",image/jpeg,1600,1063,0,472465,,1637518219,1563953103000,0,0,0,0,,,,,,,,,,, +20128,5779,content://media/external/images/media/5779,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0026.jpg",image/jpeg,1600,1063,0,250267,,1637518220,1563953103000,0,0,0,0,,,,,,,,,,, +20129,5780,content://media/external/images/media/5780,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0027.jpg",image/jpeg,1600,1063,0,614619,,1637518220,1563953103000,0,0,0,0,,,,,,,,,,, +20130,5663,content://media/external/images/media/5663,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0025.jpg",image/jpeg,1600,1063,0,314845,,1637518219,1563953102000,0,0,0,0,,,,,,,,,,, +20131,5662,content://media/external/images/media/5662,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0024.jpg",image/jpeg,1600,1063,0,339086,,1637518219,1563953101000,0,0,0,0,,,,,,,,,,, +20132,5778,content://media/external/images/media/5778,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0023.jpg",image/jpeg,1600,1063,0,441251,,1637518220,1563953101000,0,0,0,0,,,,,,,,,,, +20133,5777,content://media/external/images/media/5777,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0022.jpg",image/jpeg,1600,1063,0,286280,,1637518220,1563953100000,0,0,0,0,,,,,,,,,,, +20134,5774,content://media/external/images/media/5774,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0019.jpg",image/jpeg,1600,1063,0,316180,,1637518220,1563953027000,0,0,0,0,,,,,,,,,,, +20135,5775,content://media/external/images/media/5775,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0020.jpg",image/jpeg,1600,1063,0,348093,,1637518220,1563953027000,0,0,0,0,,,,,,,,,,, +20136,5776,content://media/external/images/media/5776,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0021.jpg",image/jpeg,1600,1063,0,298799,,1637518220,1563953027000,0,0,0,0,,,,,,,,,,, +20137,5772,content://media/external/images/media/5772,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0017.jpg",image/jpeg,1600,1063,0,395576,,1637518220,1563953026000,0,0,0,0,,,,,,,,,,, +20138,5773,content://media/external/images/media/5773,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0018.jpg",image/jpeg,1600,1063,0,329417,,1637518220,1563953026000,0,0,0,0,,,,,,,,,,, +20139,5659,content://media/external/images/media/5659,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0014.jpg",image/jpeg,1600,1063,0,252601,,1637518219,1563953025000,0,0,0,0,,,,,,,,,,, +20140,5660,content://media/external/images/media/5660,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0015.jpg",image/jpeg,1600,1063,0,495224,,1637518219,1563953025000,0,0,0,0,,,,,,,,,,, +20141,5661,content://media/external/images/media/5661,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0016.jpg",image/jpeg,1600,1063,0,490006,,1637518219,1563953025000,0,0,0,0,,,,,,,,,,, +20142,5658,content://media/external/images/media/5658,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0012.jpg",image/jpeg,1600,1063,0,299749,,1637518219,1563953024000,0,0,0,0,,,,,,,,,,, +20143,5771,content://media/external/images/media/5771,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0013.jpg",image/jpeg,1600,1063,0,263546,,1637518220,1563953024000,0,0,0,0,,,,,,,,,,, +20144,5657,content://media/external/images/media/5657,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0010.jpg",image/jpeg,1600,1063,0,316478,,1637518219,1563953023000,0,0,0,0,,,,,,,,,,, +20145,5770,content://media/external/images/media/5770,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0011.jpg",image/jpeg,1600,1063,0,309899,,1637518220,1563953023000,0,0,0,0,,,,,,,,,,, +20146,5656,content://media/external/images/media/5656,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0009.jpg",image/jpeg,1600,1063,0,465241,,1637518219,1563953022000,0,0,0,0,,,,,,,,,,, +20147,5655,content://media/external/images/media/5655,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0008.jpg",image/jpeg,480,675,0,47007,,1637518219,1563922789000,0,0,0,0,,,,,,,,,,, +20148,5653,content://media/external/images/media/5653,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0006.jpg",image/jpeg,970,885,0,83217,,1637518219,1563922387000,0,0,0,0,,,,,,,,,,, +20149,5654,content://media/external/images/media/5654,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0007.jpg",image/jpeg,898,1600,0,141194,,1637518219,1563922387000,0,0,0,0,,,,,,,,,,, +20150,5768,content://media/external/images/media/5768,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0003.jpg",image/jpeg,1600,898,0,175979,,1637518220,1563922381000,0,0,0,0,,,,,,,,,,, +20151,5769,content://media/external/images/media/5769,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0004.jpg",image/jpeg,898,1600,0,150293,,1637518220,1563922381000,0,0,0,0,,,,,,,,,,, +20152,5652,content://media/external/images/media/5652,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0001.jpg",image/jpeg,1024,768,0,97047,,1637518219,1563922380000,0,0,0,0,,,,,,,,,,, +20153,5767,content://media/external/images/media/5767,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0002.jpg",image/jpeg,898,1600,0,159870,,1637518220,1563922380000,0,0,0,0,,,,,,,,,,, +20154,5766,content://media/external/images/media/5766,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0000.jpg",image/jpeg,1024,842,0,124687,,1637518220,1563922379000,0,0,0,0,,,,,,,,,,, +20155,3885,content://media/external/images/media/3885,/storage/emulated/0/DCIM/Camera/IMG_20190723_220638.jpg,image/jpeg,4000,3000,0,5601862,,1637503732,1563912398000,1563912397980,0,0,0,,,,,,,,,,, +20156,3912,content://media/external/images/media/3912,/storage/emulated/0/DCIM/Camera/IMG_20190723_215950.jpg,image/jpeg,5184,3880,0,7165714,,1637503834,1563911990000,1563911990016,0,0,0,,,,,,,,,,, +20157,4943,content://media/external/images/media/4943,/storage/emulated/0/DCIM/Camera/IMG_20190723_210546.jpg,image/jpeg,4160,3120,0,4728126,,1637506015,1563908746000,1563908746420,0,0,0,,,,,,,,,,, +20158,3135,content://media/external/images/media/3135,/storage/emulated/0/DCIM/Camera/IMG_20190723_210539.jpg,image/jpeg,4000,3000,0,4307840,,1637502130,1563908740000,1563908739932,0,0,0,,,,,,,,,,, +20159,4788,content://media/external/images/media/4788,/storage/emulated/0/DCIM/Camera/IMG_20190723_210510.jpg,image/jpeg,4000,3000,0,4340148,,1637505663,1563908710000,1563908710365,0,0,0,,,,,,,,,,, +20160,3615,content://media/external/images/media/3615,/storage/emulated/0/DCIM/Camera/IMG_20190723_204604.jpg,image/jpeg,4000,3000,90,3913122,,1637503271,1563907564000,1563907564516,0,0,0,,,,,,,,,,, +20161,3412,content://media/external/images/media/3412,/storage/emulated/0/DCIM/Camera/IMG_20190723_204143.jpg,image/jpeg,4000,3000,90,4530215,,1637502682,1563907303000,1563907303427,0,0,0,,,,,,,,,,, +20162,2776,content://media/external/images/media/2776,/storage/emulated/0/DCIM/Camera/IMG_20190723_204137.jpg,image/jpeg,4000,3000,90,7095255,,1637501282,1563907297000,1563907297447,0,0,0,,,,,,,,,,, +20163,4518,content://media/external/images/media/4518,/storage/emulated/0/DCIM/Camera/IMG_20190723_203050.jpg,image/jpeg,4000,3000,0,5128641,,1637505165,1563906651000,1563906650262,0,0,0,,,,,,,,,,, +20164,5765,content://media/external/images/media/5765,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0022.jpg",image/jpeg,899,1599,0,180160,,1637518220,1563903925000,0,0,0,0,,,,,,,,,,, +20165,4625,content://media/external/images/media/4625,/storage/emulated/0/DCIM/Camera/IMG_20190723_192248.jpg,image/jpeg,4000,3000,90,11475566,,1637505390,1563902569000,1563902568866,0,0,0,,,,,,,,,,, +20166,4196,content://media/external/images/media/4196,/storage/emulated/0/DCIM/Camera/IMG_20190723_192244.jpg,image/jpeg,4000,3000,90,10569341,,1637504640,1563902564000,1563902564257,0,0,0,,,,,,,,,,, +20167,4178,content://media/external/images/media/4178,/storage/emulated/0/DCIM/Camera/IMG_20190723_192225.jpg,image/jpeg,4000,3000,90,7081744,,1637504558,1563902545000,1563902545379,0,0,0,,,,,,,,,,, +20168,3161,content://media/external/images/media/3161,/storage/emulated/0/DCIM/Camera/IMG_20190723_192018.jpg,image/jpeg,4000,3000,0,7458860,,1637502143,1563902418000,1563902418122,0,0,0,,,,,,,,,,, +20169,3911,content://media/external/images/media/3911,/storage/emulated/0/DCIM/Camera/IMG_20190723_192013.jpg,image/jpeg,4160,3120,0,6979376,,1637503834,1563902413000,1563902413139,0,0,0,,,,,,,,,,, +20170,4446,content://media/external/images/media/4446,/storage/emulated/0/DCIM/Camera/IMG_20190723_191855.jpg,image/jpeg,4160,3120,0,6546604,,1637505068,1563902335000,1563902335316,0,0,0,,,,,,,,,,, +20171,4091,content://media/external/images/media/4091,/storage/emulated/0/DCIM/Camera/IMG_20190723_191849.jpg,image/jpeg,4160,3120,0,5329587,,1637504399,1563902330000,1563902329779,0,0,0,,,,,,,,,,, +20172,4255,content://media/external/images/media/4255,/storage/emulated/0/DCIM/Camera/IMG_20190723_191839.jpg,image/jpeg,4000,3000,0,6754058,,1637504756,1563902319000,1563902319764,0,0,0,,,,,,,,,,, +20173,5764,content://media/external/images/media/5764,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0021.jpg",image/jpeg,1600,1200,0,210237,,1637518220,1563900323000,0,0,0,0,,,,,,,,,,, +20174,5651,content://media/external/images/media/5651,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0020.jpg",image/jpeg,898,1600,0,155790,,1637518219,1563895017000,0,0,0,0,,,,,,,,,,, +20175,5650,content://media/external/images/media/5650,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0019.jpg",image/jpeg,1200,1600,0,238814,,1637518219,1563893763000,0,0,0,0,,,,,,,,,,, +20176,5649,content://media/external/images/media/5649,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0017.jpg",image/jpeg,1440,1024,0,194557,,1637518219,1563889388000,0,0,0,0,,,,,,,,,,, +20177,5763,content://media/external/images/media/5763,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0016.jpg",image/jpeg,900,1600,0,199431,,1637518220,1563888724000,0,0,0,0,,,,,,,,,,, +20178,5762,content://media/external/images/media/5762,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0015.jpg",image/jpeg,900,1600,0,232174,,1637518220,1563888703000,0,0,0,0,,,,,,,,,,, +20179,5761,content://media/external/images/media/5761,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0014.jpg",image/jpeg,900,1600,0,141537,,1637518220,1563888515000,0,0,0,0,,,,,,,,,,, +20180,5760,content://media/external/images/media/5760,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0013.jpg",image/jpeg,780,1040,0,75775,,1637518220,1563888257000,0,0,0,0,,,,,,,,,,, +20181,5759,content://media/external/images/media/5759,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0012.jpg",image/jpeg,822,1074,0,418174,,1637518220,1563880239000,0,0,0,0,,,,,,,,,,, +20182,5648,content://media/external/images/media/5648,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0011.jpg",image/jpeg,1600,900,0,255262,,1637518219,1563876913000,0,0,0,0,,,,,,,,,,, +20183,5647,content://media/external/images/media/5647,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0010.jpg",image/jpeg,1200,1599,0,93290,,1637518219,1563876520000,0,0,0,0,,,,,,,,,,, +20184,5646,content://media/external/images/media/5646,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0009.jpg",image/jpeg,1600,901,0,150029,,1637518219,1563873348000,0,0,0,0,,,,,,,,,,, +20185,5758,content://media/external/images/media/5758,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0008.jpg",image/jpeg,899,1600,0,128298,,1637518220,1563873216000,0,0,0,0,,,,,,,,,,, +20186,5645,content://media/external/images/media/5645,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0005.jpg",image/jpeg,1600,1200,0,125640,,1637518219,1563871493000,0,0,0,0,,,,,,,,,,, +20187,5757,content://media/external/images/media/5757,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0004.jpg",image/jpeg,1600,1200,0,147492,,1637518220,1563871493000,0,0,0,0,,,,,,,,,,, +20188,5755,content://media/external/images/media/5755,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0002.jpg",image/jpeg,1200,1600,0,198012,,1637518220,1563871492000,0,0,0,0,,,,,,,,,,, +20189,5756,content://media/external/images/media/5756,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0003.jpg",image/jpeg,1200,1600,0,247091,,1637518220,1563871492000,0,0,0,0,,,,,,,,,,, +20190,5754,content://media/external/images/media/5754,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0001.jpg",image/jpeg,1200,1600,0,189357,,1637518220,1563871491000,0,0,0,0,,,,,,,,,,, +20191,5644,content://media/external/images/media/5644,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0000.jpg",image/jpeg,1200,1599,0,311823,,1637518219,1563871395000,0,0,0,0,,,,,,,,,,, +20192,5643,content://media/external/images/media/5643,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0020.jpg",image/jpeg,1599,1200,0,128169,,1637518219,1563824664000,0,0,0,0,,,,,,,,,,, +20193,5753,content://media/external/images/media/5753,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0019.jpg",image/jpeg,898,1600,0,146837,,1637518220,1563821390000,0,0,0,0,,,,,,,,,,, +20194,5642,content://media/external/images/media/5642,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0018.jpg",image/jpeg,1600,898,0,82351,,1637518219,1563821161000,0,0,0,0,,,,,,,,,,, +20195,5752,content://media/external/images/media/5752,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0017.jpg",image/jpeg,750,1334,0,78879,,1637518220,1563820975000,0,0,0,0,,,,,,,,,,, +20196,5641,content://media/external/images/media/5641,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0016.jpg",image/jpeg,1200,1599,0,188861,,1637518219,1563820958000,0,0,0,0,,,,,,,,,,, +20197,5751,content://media/external/images/media/5751,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0014.jpg",image/jpeg,720,1280,0,47891,,1637518220,1563810856000,0,0,0,0,,,,,,,,,,, +20198,5750,content://media/external/images/media/5750,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0013.jpg",image/jpeg,780,1040,0,67525,,1637518220,1563809772000,0,0,0,0,,,,,,,,,,, +20199,5640,content://media/external/images/media/5640,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0012.jpg",image/jpeg,1200,1599,0,396117,,1637518219,1563801465000,0,0,0,0,,,,,,,,,,, +20200,5749,content://media/external/images/media/5749,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0011.jpg",image/jpeg,720,809,0,49181,,1637518220,1563796668000,0,0,0,0,,,,,,,,,,, +20201,5639,content://media/external/images/media/5639,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0010.jpg",image/jpeg,1599,1200,0,220904,,1637518219,1563796474000,0,0,0,0,,,,,,,,,,, +20202,5748,content://media/external/images/media/5748,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0009.jpg",image/jpeg,539,396,0,39058,,1637518220,1563796011000,0,0,0,0,,,,,,,,,,, +20203,5638,content://media/external/images/media/5638,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0006.jpg",image/jpeg,1599,1200,0,358962,,1637518219,1563795096000,0,0,0,0,,,,,,,,,,, +20204,5747,content://media/external/images/media/5747,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0007.jpg",image/jpeg,1599,1200,0,449178,,1637518220,1563795096000,0,0,0,0,,,,,,,,,,, +20205,5637,content://media/external/images/media/5637,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0005.jpg",image/jpeg,750,455,0,41831,,1637518219,1563795094000,0,0,0,0,,,,,,,,,,, +20206,5746,content://media/external/images/media/5746,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0004.jpg",image/jpeg,1600,898,0,192657,,1637518220,1563785360000,0,0,0,0,,,,,,,,,,, +20207,5636,content://media/external/images/media/5636,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0001.jpg",image/jpeg,780,1040,0,83523,,1637518219,1563781625000,0,0,0,0,,,,,,,,,,, +20208,5635,content://media/external/images/media/5635,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0000.jpg",image/jpeg,780,1040,0,69992,,1637518219,1563780697000,0,0,0,0,,,,,,,,,,, +20209,5634,content://media/external/images/media/5634,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0034.jpg",image/jpeg,900,1600,0,132014,,1637518219,1563739424000,0,0,0,0,,,,,,,,,,, +20210,5633,content://media/external/images/media/5633,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0033.jpg",image/jpeg,1040,780,0,34773,,1637518219,1563737838000,0,0,0,0,,,,,,,,,,, +20211,5632,content://media/external/images/media/5632,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0032.jpg",image/jpeg,500,279,0,28105,,1637518219,1563736832000,0,0,0,0,,,,,,,,,,, +20212,5631,content://media/external/images/media/5631,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0031.jpg",image/jpeg,1040,780,0,34773,,1637518219,1563736317000,0,0,0,0,,,,,,,,,,, +20213,5745,content://media/external/images/media/5745,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0030.jpg",image/jpeg,1600,898,0,115201,,1637518220,1563735954000,0,0,0,0,,,,,,,,,,, +20214,5630,content://media/external/images/media/5630,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0028.jpg",image/jpeg,900,1600,0,150620,,1637518219,1563734944000,0,0,0,0,,,,,,,,,,, +20215,3023,content://media/external/images/media/3023,/storage/emulated/0/DCIM/Camera/IMG_20190721_204723.jpg,image/jpeg,4160,3120,0,6016463,,1637501805,1563734843000,1563734843013,0,0,0,,,,,,,,,,, +20216,5629,content://media/external/images/media/5629,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0025.jpg",image/jpeg,898,1600,0,168436,,1637518219,1563733903000,0,0,0,0,,,,,,,,,,, +20217,5628,content://media/external/images/media/5628,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0024.jpg",image/jpeg,1456,1600,0,488883,,1637518219,1563733815000,0,0,0,0,,,,,,,,,,, +20218,5627,content://media/external/images/media/5627,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0023.jpg",image/jpeg,900,843,0,163584,,1637518219,1563732680000,0,0,0,0,,,,,,,,,,, +20219,5744,content://media/external/images/media/5744,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0022.jpg",image/jpeg,1600,898,0,164547,,1637518220,1563731970000,0,0,0,0,,,,,,,,,,, +20220,5626,content://media/external/images/media/5626,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0021.jpg",image/jpeg,1600,1200,0,170443,,1637518219,1563729782000,0,0,0,0,,,,,,,,,,, +20221,5625,content://media/external/images/media/5625,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0020.jpg",image/jpeg,660,1280,0,96729,,1637518219,1563728490000,0,0,0,0,,,,,,,,,,, +20222,5743,content://media/external/images/media/5743,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0018.jpg",image/jpeg,1600,900,0,154920,,1637518220,1563722906000,0,0,0,0,,,,,,,,,,, +20223,5624,content://media/external/images/media/5624,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0017.jpg",image/jpeg,750,1334,0,84552,,1637518219,1563722294000,0,0,0,0,,,,,,,,,,, +20224,5742,content://media/external/images/media/5742,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0016.jpg",image/jpeg,1600,900,0,123630,,1637518220,1563721836000,0,0,0,0,,,,,,,,,,, +20225,5623,content://media/external/images/media/5623,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0015.jpg",image/jpeg,900,1600,0,143004,,1637518219,1563720157000,0,0,0,0,,,,,,,,,,, +20226,5622,content://media/external/images/media/5622,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0014.jpg",image/jpeg,900,1600,0,183140,,1637518219,1563720086000,0,0,0,0,,,,,,,,,,, +20227,5621,content://media/external/images/media/5621,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0013.jpg",image/jpeg,1600,1200,0,114555,,1637518219,1563718499000,0,0,0,0,,,,,,,,,,, +20228,5741,content://media/external/images/media/5741,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0012.jpg",image/jpeg,720,1280,0,57515,,1637518220,1563708152000,0,0,0,0,,,,,,,,,,, +20229,5620,content://media/external/images/media/5620,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0009.jpg",image/jpeg,898,1600,0,97786,,1637518219,1563703954000,0,0,0,0,,,,,,,,,,, +20230,5740,content://media/external/images/media/5740,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0008.jpg",image/jpeg,1600,1200,0,220970,,1637518220,1563703571000,0,0,0,0,,,,,,,,,,, +20231,5739,content://media/external/images/media/5739,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0006.jpg",image/jpeg,1080,843,0,106245,,1637518220,1563699850000,0,0,0,0,,,,,,,,,,, +20232,5619,content://media/external/images/media/5619,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0005.jpg",image/jpeg,1599,788,0,120833,,1637518219,1563699397000,0,0,0,0,,,,,,,,,,, +20233,5618,content://media/external/images/media/5618,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0004.jpg",image/jpeg,900,1600,0,62908,,1637518219,1563699194000,0,0,0,0,,,,,,,,,,, +20234,5738,content://media/external/images/media/5738,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0003.jpg",image/jpeg,1414,688,0,134083,,1637518220,1563697326000,0,0,0,0,,,,,,,,,,, +20235,5617,content://media/external/images/media/5617,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0002.jpg",image/jpeg,768,1024,0,102409,,1637518219,1563694747000,0,0,0,0,,,,,,,,,,, +20236,5616,content://media/external/images/media/5616,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0001.jpg",image/jpeg,1080,808,0,68799,,1637518219,1563691611000,0,0,0,0,,,,,,,,,,, +20237,5737,content://media/external/images/media/5737,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0009.jpg",image/jpeg,480,247,0,13489,,1637518220,1563650972000,0,0,0,0,,,,,,,,,,, +20238,5736,content://media/external/images/media/5736,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0008.jpg",image/jpeg,1600,1200,0,312865,,1637518220,1563628950000,0,0,0,0,,,,,,,,,,, +20239,5615,content://media/external/images/media/5615,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0007.jpg",image/jpeg,1600,898,0,125139,,1637518219,1563626078000,0,0,0,0,,,,,,,,,,, +20240,5614,content://media/external/images/media/5614,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0006.jpg",image/jpeg,770,1600,0,84869,,1637518219,1563625233000,0,0,0,0,,,,,,,,,,, +20241,5735,content://media/external/images/media/5735,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0005.jpg",image/jpeg,1223,633,0,191782,,1637518220,1563622504000,0,0,0,0,,,,,,,,,,, +20242,5613,content://media/external/images/media/5613,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0004.jpg",image/jpeg,1200,1600,0,248952,,1637518219,1563619081000,0,0,0,0,,,,,,,,,,, +20243,5734,content://media/external/images/media/5734,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0002.jpg",image/jpeg,1280,960,0,100845,,1637518220,1563616449000,0,0,0,0,,,,,,,,,,, +20244,5733,content://media/external/images/media/5733,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0001.jpg",image/jpeg,1600,1200,0,246964,,1637518220,1563611421000,0,0,0,0,,,,,,,,,,, +20245,5732,content://media/external/images/media/5732,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0000.jpg",image/jpeg,1280,960,0,72084,,1637518220,1563610585000,0,0,0,0,,,,,,,,,,, +20246,5731,content://media/external/images/media/5731,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0019.jpg",image/jpeg,1024,768,0,112555,,1637518220,1563566795000,0,0,0,0,,,,,,,,,,, +20247,5730,content://media/external/images/media/5730,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0018.jpg",image/jpeg,1200,1600,0,104826,,1637518220,1563564543000,0,0,0,0,,,,,,,,,,, +20248,5612,content://media/external/images/media/5612,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0017.jpg",image/jpeg,1200,1600,0,133631,,1637518219,1563564361000,0,0,0,0,,,,,,,,,,, +20249,5611,content://media/external/images/media/5611,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0016.jpg",image/jpeg,1600,1202,0,213173,,1637518219,1563564360000,0,0,0,0,,,,,,,,,,, +20250,5729,content://media/external/images/media/5729,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0015.jpg",image/jpeg,1600,764,0,131982,,1637518220,1563563559000,0,0,0,0,,,,,,,,,,, +20251,5610,content://media/external/images/media/5610,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0013.jpg",image/jpeg,1600,900,0,107147,,1637518219,1563561478000,0,0,0,0,,,,,,,,,,, +20252,2960,content://media/external/images/media/2960,/storage/emulated/0/DCIM/Camera/IMG_20190719_134017.jpg,image/jpeg,5184,3880,270,5347455,,1637501684,1563536417000,1563536417534,0,0,0,,,,,,,,,,, +20253,547,content://media/external/images/media/547,/storage/emulated/0/FaceApp/FaceApp_1563536005739.jpg,image/jpeg,1080,2340,0,1716367,,1637500132,1563536005000,0,0,0,0,,,,,,,,,,, +20254,5728,content://media/external/images/media/5728,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0011.jpg",image/jpeg,960,1280,0,97909,,1637518220,1563534770000,0,0,0,0,,,,,,,,,,, +20255,5727,content://media/external/images/media/5727,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0010.jpg",image/jpeg,1200,1600,0,153376,,1637518220,1563534769000,0,0,0,0,,,,,,,,,,, +20256,5726,content://media/external/images/media/5726,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0009.jpg",image/jpeg,720,1280,0,431704,,1637518220,1563532954000,0,0,0,0,,,,,,,,,,, +20257,5609,content://media/external/images/media/5609,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0008.jpg",image/jpeg,1600,1200,0,235661,,1637518219,1563532765000,0,0,0,0,,,,,,,,,,, +20258,5608,content://media/external/images/media/5608,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0007.jpg",image/jpeg,1189,1600,0,99645,,1637518219,1563529024000,0,0,0,0,,,,,,,,,,, +20259,4654,content://media/external/images/media/4654,/storage/emulated/0/DCIM/Camera/IMG_20190719_113507.jpg,image/jpeg,4000,3000,0,11256423,,1637505417,1563528907000,1563528907335,0,0,0,,,,,,,,,,, +20260,5607,content://media/external/images/media/5607,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0004.jpeg",image/jpeg,4000,2250,0,1036887,,1637518219,1563526877000,0,0,0,0,,,,,,,,,,, +20261,5606,content://media/external/images/media/5606,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0023.jpg",image/jpeg,1600,1200,0,128559,,1637518219,1563480493000,0,0,0,0,,,,,,,,,,, +20262,5725,content://media/external/images/media/5725,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0024.jpg",image/jpeg,1600,1200,0,85008,,1637518220,1563480493000,0,0,0,0,,,,,,,,,,, +20263,5605,content://media/external/images/media/5605,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0022.jpg",image/jpeg,1600,1200,0,91064,,1637518219,1563480492000,0,0,0,0,,,,,,,,,,, +20264,5604,content://media/external/images/media/5604,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0021.jpg",image/jpeg,899,1599,0,114150,,1637518219,1563476306000,0,0,0,0,,,,,,,,,,, +20265,5724,content://media/external/images/media/5724,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0020.jpg",image/jpeg,899,1599,0,92035,,1637518220,1563476166000,0,0,0,0,,,,,,,,,,, +20266,5723,content://media/external/images/media/5723,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0019.jpg",image/jpeg,681,1600,0,300161,,1637518220,1563472593000,0,0,0,0,,,,,,,,,,, +20267,5603,content://media/external/images/media/5603,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0018.jpg",image/jpeg,898,1600,0,149574,,1637518219,1563472029000,0,0,0,0,,,,,,,,,,, +20268,5722,content://media/external/images/media/5722,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0017.jpg",image/jpeg,1600,1200,0,399716,,1637518220,1563466981000,0,0,0,0,,,,,,,,,,, +20269,5721,content://media/external/images/media/5721,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0015.jpg",image/jpeg,898,1600,0,65921,,1637518220,1563459672000,0,0,0,0,,,,,,,,,,, +20270,5602,content://media/external/images/media/5602,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0014.jpg",image/jpeg,1599,1200,0,267511,,1637518219,1563456494000,0,0,0,0,,,,,,,,,,, +20271,5720,content://media/external/images/media/5720,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0012.jpg",image/jpeg,1200,1599,0,364153,,1637518220,1563455523000,0,0,0,0,,,,,,,,,,, +20272,5719,content://media/external/images/media/5719,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0006.jpg",image/jpeg,768,1024,0,95271,,1637518220,1563449966000,0,0,0,0,,,,,,,,,,, +20273,5718,content://media/external/images/media/5718,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0005.jpg",image/jpeg,1600,1600,0,216361,,1637518220,1563449328000,0,0,0,0,,,,,,,,,,, +20274,5717,content://media/external/images/media/5717,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0004.jpg",image/jpeg,1599,899,0,416655,,1637518220,1563448035000,0,0,0,0,,,,,,,,,,, +20275,2726,content://media/external/images/media/2726,/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-07-18-12-40-46-143_com.stt.android.suunto.png,image/png,1080,2340,0,144635,,1637500987,1563446446000,0,0,0,0,,,,,,,,,,, +20276,2725,content://media/external/images/media/2725,/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-07-18-12-39-57-207_com.stt.android.suunto.png,image/png,1080,2340,0,430939,,1637500987,1563446397000,0,0,0,0,,,,,,,,,,, +20277,5601,content://media/external/images/media/5601,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0001.jpg",image/jpeg,1200,1600,0,192663,,1637518219,1563438085000,0,0,0,0,,,,,,,,,,, +20278,5600,content://media/external/images/media/5600,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0000.jpg",image/jpeg,1200,1600,0,204537,,1637518219,1563438084000,0,0,0,0,,,,,,,,,,, +20279,5716,content://media/external/images/media/5716,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0024.jpg",image/jpeg,1080,1068,0,106930,,1637518220,1563395505000,0,0,0,0,,,,,,,,,,, +20280,4692,content://media/external/images/media/4692,/storage/emulated/0/DCIM/Camera/IMG_20190717_214731.jpg,image/jpeg,4000,3000,90,3714230,,1637505509,1563392851000,1563392851418,0,0,0,,,,,,,,,,, +20281,5715,content://media/external/images/media/5715,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0023.jpg",image/jpeg,768,1024,0,89019,,1637518220,1563387218000,0,0,0,0,,,,,,,,,,, +20282,5599,content://media/external/images/media/5599,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0022.jpg",image/jpeg,720,960,0,128679,,1637518219,1563385313000,0,0,0,0,,,,,,,,,,, +20283,5713,content://media/external/images/media/5713,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0019.jpg",image/jpeg,898,1600,0,97501,,1637518220,1563379838000,0,0,0,0,,,,,,,,,,, +20284,5714,content://media/external/images/media/5714,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0020.jpg",image/jpeg,898,1600,0,126880,,1637518220,1563379838000,0,0,0,0,,,,,,,,,,, +20285,5712,content://media/external/images/media/5712,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0018.jpg",image/jpeg,1200,1600,0,112706,,1637518220,1563379439000,0,0,0,0,,,,,,,,,,, +20286,5711,content://media/external/images/media/5711,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0015.jpg",image/jpeg,1080,459,0,66075,,1637518220,1563371626000,0,0,0,0,,,,,,,,,,, +20287,5598,content://media/external/images/media/5598,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0014.jpg",image/jpeg,720,690,0,32865,,1637518219,1563363567000,0,0,0,0,,,,,,,,,,, +20288,5597,content://media/external/images/media/5597,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0013.jpg",image/jpeg,473,1024,0,56159,,1637518219,1563363070000,0,0,0,0,,,,,,,,,,, +20289,5596,content://media/external/images/media/5596,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0012.jpg",image/jpeg,1202,1600,0,207464,,1637518219,1563362640000,0,0,0,0,,,,,,,,,,, +20290,5595,content://media/external/images/media/5595,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0011.jpg",image/jpeg,768,1024,0,87739,,1637518219,1563361227000,0,0,0,0,,,,,,,,,,, +20291,5710,content://media/external/images/media/5710,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0010.jpg",image/jpeg,1600,900,0,202088,,1637518220,1563357622000,0,0,0,0,,,,,,,,,,, +20292,5709,content://media/external/images/media/5709,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0009.jpg",image/jpeg,898,1600,0,96147,,1637518220,1563356941000,0,0,0,0,,,,,,,,,,, +20293,5594,content://media/external/images/media/5594,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0008.jpg",image/jpeg,1200,1599,0,313179,,1637518219,1563354912000,0,0,0,0,,,,,,,,,,, +20294,5708,content://media/external/images/media/5708,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0007.jpg",image/jpeg,899,1599,0,197430,,1637518220,1563353149000,0,0,0,0,,,,,,,,,,, +20295,5707,content://media/external/images/media/5707,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0004.jpg",image/jpeg,1200,1599,0,531708,,1637518220,1563351878000,0,0,0,0,,,,,,,,,,, +20296,5593,content://media/external/images/media/5593,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0003.jpg",image/jpeg,1600,1200,0,133687,,1637518219,1563351765000,0,0,0,0,,,,,,,,,,, +20297,5706,content://media/external/images/media/5706,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0002.jpg",image/jpeg,1600,1200,0,204288,,1637518220,1563344511000,0,0,0,0,,,,,,,,,,, +20298,5705,content://media/external/images/media/5705,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0001.jpg",image/jpeg,898,1600,0,165073,,1637518220,1563341957000,0,0,0,0,,,,,,,,,,, +20299,5704,content://media/external/images/media/5704,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0000.jpg",image/jpeg,1600,1200,0,181771,,1637518219,1563341940000,0,0,0,0,,,,,,,,,,, +20300,5592,content://media/external/images/media/5592,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0017.jpg",image/jpeg,768,1024,0,67912,,1637518219,1563309443000,0,0,0,0,,,,,,,,,,, +20301,5591,content://media/external/images/media/5591,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0016.jpg",image/jpeg,1080,1199,0,66142,,1637518219,1563307716000,0,0,0,0,,,,,,,,,,, +20302,5590,content://media/external/images/media/5590,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0015.jpg",image/jpeg,899,1599,0,101286,,1637518219,1563307569000,0,0,0,0,,,,,,,,,,, +20303,5703,content://media/external/images/media/5703,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0012.jpg",image/jpeg,901,1600,0,153652,,1637518219,1563289337000,0,0,0,0,,,,,,,,,,, +20304,5702,content://media/external/images/media/5702,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0006.jpg",image/jpeg,960,952,0,87386,,1637518219,1563280388000,0,0,0,0,,,,,,,,,,, +20305,5589,content://media/external/images/media/5589,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0005.jpg",image/jpeg,569,788,0,62336,,1637518219,1563279827000,0,0,0,0,,,,,,,,,,, +20306,5588,content://media/external/images/media/5588,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0004.jpg",image/jpeg,1200,1600,0,282301,,1637518219,1563278050000,0,0,0,0,,,,,,,,,,, +20307,5587,content://media/external/images/media/5587,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0003.jpg",image/jpeg,1600,1202,0,240001,,1637518219,1563275794000,0,0,0,0,,,,,,,,,,, +20308,5701,content://media/external/images/media/5701,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0002.jpg",image/jpeg,1599,899,0,128815,,1637518219,1563272970000,0,0,0,0,,,,,,,,,,, +20309,5586,content://media/external/images/media/5586,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0001.jpg",image/jpeg,1600,901,0,130705,,1637518219,1563270093000,0,0,0,0,,,,,,,,,,, +20310,550,content://media/external/images/media/550,/storage/emulated/0/Pixlr/IMG_20190714_131434.jpg,image/jpeg,2904,3880,0,5663884,,1637500132,1563261467000,0,0,0,0,,,,,,,,,,, +20311,2600,content://media/external/images/media/2600,/storage/emulated/0/DCIM/Creative/IMG_20190715_213449.jpg,image/jpeg,2160,2880,0,2550632,,1637500870,1563219290000,0,0,0,0,,,,,,,,,,, +20312,2607,content://media/external/images/media/2607,/storage/emulated/0/DCIM/Facebook/FB_IMG_1563210935079.jpg,image/jpeg,2048,1152,0,411680,,1637500870,1563210935000,0,0,0,0,,,,,,,,,,, +20313,2606,content://media/external/images/media/2606,/storage/emulated/0/DCIM/Facebook/FB_IMG_1563210928090.jpg,image/jpeg,2048,1152,0,352299,,1637500870,1563210928000,0,0,0,0,,,,,,,,,,, +20314,2605,content://media/external/images/media/2605,/storage/emulated/0/DCIM/Facebook/FB_IMG_1563210495296.jpg,image/jpeg,1137,640,0,81523,,1637500870,1563210495000,0,0,0,0,,,,,,,,,,, +20315,2604,content://media/external/images/media/2604,/storage/emulated/0/DCIM/Facebook/FB_IMG_1563210488255.jpg,image/jpeg,1137,640,0,80810,,1637500870,1563210488000,0,0,0,0,,,,,,,,,,, +20316,2603,content://media/external/images/media/2603,/storage/emulated/0/DCIM/Facebook/FB_IMG_1563210476830.jpg,image/jpeg,1137,640,0,82211,,1637500870,1563210476000,0,0,0,0,,,,,,,,,,, +20317,2602,content://media/external/images/media/2602,/storage/emulated/0/DCIM/Facebook/FB_IMG_1563210465124.jpg,image/jpeg,1137,640,0,69746,,1637500870,1563210465000,0,0,0,0,,,,,,,,,,, +20318,5585,content://media/external/images/media/5585,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190715-WA0005.jpg",image/jpeg,960,540,0,123357,,1637518219,1563188847000,0,0,0,0,,,,,,,,,,, +20319,5700,content://media/external/images/media/5700,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190715-WA0004.jpg",image/jpeg,1024,768,0,95595,,1637518219,1563187903000,0,0,0,0,,,,,,,,,,, +20320,5584,content://media/external/images/media/5584,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190715-WA0003.jpg",image/jpeg,1600,1200,0,266620,,1637518219,1563187791000,0,0,0,0,,,,,,,,,,, +20321,5699,content://media/external/images/media/5699,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190715-WA0002.jpg",image/jpeg,768,1024,0,29794,,1637518219,1563187688000,0,0,0,0,,,,,,,,,,, +20322,5583,content://media/external/images/media/5583,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190715-WA0001.jpg",image/jpeg,762,846,0,75627,,1637518219,1563182180000,0,0,0,0,,,,,,,,,,, +20323,5698,content://media/external/images/media/5698,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190715-WA0000.jpg",image/jpeg,1040,780,0,47833,,1637518219,1563170620000,0,0,0,0,,,,,,,,,,, +20324,5697,content://media/external/images/media/5697,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0047.jpg",image/jpeg,1200,1599,0,164009,,1637518219,1563129610000,0,0,0,0,,,,,,,,,,, +20325,4691,content://media/external/images/media/4691,/storage/emulated/0/DCIM/Camera/IMG_20190714_185942.jpg,image/jpeg,4000,3000,0,6872421,,1637505509,1563123582000,1563123582088,0,0,0,,,,,,,,,,, +20326,4690,content://media/external/images/media/4690,/storage/emulated/0/DCIM/Camera/IMG_20190714_185924.jpg,image/jpeg,4000,3000,0,6430521,,1637505509,1563123564000,1563123564565,0,0,0,,,,,,,,,,, +20327,3040,content://media/external/images/media/3040,/storage/emulated/0/DCIM/Camera/IMG_20190714_184549.jpg,image/jpeg,4000,3000,90,6013052,,1637501858,1563122749000,1563122749692,0,0,0,,,,,,,,,,, +20328,4426,content://media/external/images/media/4426,/storage/emulated/0/DCIM/Camera/IMG_20190714_184537.jpg,image/jpeg,4000,3000,90,5883889,,1637505068,1563122737000,1563122737776,0,0,0,,,,,,,,,,, +20329,5696,content://media/external/images/media/5696,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0046.jpg",image/jpeg,1599,1200,0,216103,,1637518219,1563121004000,0,0,0,0,,,,,,,,,,, +20330,2599,content://media/external/images/media/2599,/storage/emulated/0/DCIM/Creative/IMG_20190714_181037.jpg,image/jpeg,2160,2880,0,2936798,,1637500870,1563120638000,0,0,0,0,,,,,,,,,,, +20331,5695,content://media/external/images/media/5695,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0045.jpg",image/jpeg,1200,1600,0,283023,,1637518219,1563115879000,0,0,0,0,,,,,,,,,,, +20332,5692,content://media/external/images/media/5692,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0042.jpg",image/jpeg,1200,1600,0,167084,,1637518219,1563115878000,0,0,0,0,,,,,,,,,,, +20333,5693,content://media/external/images/media/5693,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0043.jpg",image/jpeg,1600,1200,0,294856,,1637518219,1563115878000,0,0,0,0,,,,,,,,,,, +20334,5694,content://media/external/images/media/5694,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0044.jpg",image/jpeg,1200,1600,0,307172,,1637518219,1563115878000,0,0,0,0,,,,,,,,,,, +20335,5690,content://media/external/images/media/5690,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0040.jpg",image/jpeg,1056,1408,0,100754,,1637518219,1563115877000,0,0,0,0,,,,,,,,,,, +20336,5691,content://media/external/images/media/5691,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0041.jpg",image/jpeg,1600,1200,0,186265,,1637518219,1563115877000,0,0,0,0,,,,,,,,,,, +20337,5582,content://media/external/images/media/5582,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0039.jpg",image/jpeg,1600,1200,0,297665,,1637518219,1563113662000,0,0,0,0,,,,,,,,,,, +20338,5581,content://media/external/images/media/5581,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0038.jpg",image/jpeg,1200,1600,0,193723,,1637518219,1563113178000,0,0,0,0,,,,,,,,,,, +20339,5580,content://media/external/images/media/5580,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0037.jpg",image/jpeg,900,1600,0,183056,,1637518219,1563111943000,0,0,0,0,,,,,,,,,,, +20340,5689,content://media/external/images/media/5689,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0036.jpg",image/jpeg,1599,1200,0,248864,,1637518219,1563110105000,0,0,0,0,,,,,,,,,,, +20341,5688,content://media/external/images/media/5688,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0035.jpg",image/jpeg,1200,1599,0,235698,,1637518219,1563110104000,0,0,0,0,,,,,,,,,,, +20342,5686,content://media/external/images/media/5686,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0033.jpg",image/jpeg,1599,1200,0,221103,,1637518219,1563110103000,0,0,0,0,,,,,,,,,,, +20343,5687,content://media/external/images/media/5687,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0034.jpg",image/jpeg,1200,1599,0,136316,,1637518219,1563110103000,0,0,0,0,,,,,,,,,,, +20344,5579,content://media/external/images/media/5579,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0032.jpg",image/jpeg,1328,747,0,12230,,1637518219,1563109361000,0,0,0,0,,,,,,,,,,, +20345,5578,content://media/external/images/media/5578,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0031.jpg",image/jpeg,1200,1599,0,314241,,1637518219,1563108750000,0,0,0,0,,,,,,,,,,, +20346,5577,content://media/external/images/media/5577,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0030.jpg",image/jpeg,903,1600,0,140654,,1637518219,1563108608000,0,0,0,0,,,,,,,,,,, +20347,5576,content://media/external/images/media/5576,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0028.jpg",image/jpeg,747,1328,0,66719,,1637518219,1563106772000,0,0,0,0,,,,,,,,,,, +20348,5575,content://media/external/images/media/5575,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0027.jpg",image/jpeg,768,1024,0,98510,,1637518219,1563106244000,0,0,0,0,,,,,,,,,,, +20349,5574,content://media/external/images/media/5574,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0024.jpg",image/jpeg,1200,1600,0,220620,,1637518219,1563105235000,0,0,0,0,,,,,,,,,,, +20350,5573,content://media/external/images/media/5573,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0023.jpg",image/jpeg,1200,1600,0,477072,,1637518219,1563103938000,0,0,0,0,,,,,,,,,,, +20351,5572,content://media/external/images/media/5572,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0022.jpg",image/jpeg,1200,1600,0,429709,,1637518219,1563103937000,0,0,0,0,,,,,,,,,,, +20352,3506,content://media/external/images/media/3506,/storage/emulated/0/DCIM/Camera/IMG_20190714_131438.jpg,image/jpeg,5184,3880,270,7775083,,1637502969,1563102878000,1563102878807,0,0,0,,,,,,,,,,, +20353,3595,content://media/external/images/media/3595,/storage/emulated/0/DCIM/Camera/IMG_20190714_131434.jpg,image/jpeg,5184,3880,270,6553155,,1637503238,1563102874000,1563102874553,0,0,0,,,,,,,,,,, +20354,4177,content://media/external/images/media/4177,/storage/emulated/0/DCIM/Camera/IMG_20190714_131347.jpg,image/jpeg,4160,3120,0,9652142,,1637504558,1563102827000,1563102827853,0,0,0,,,,,,,,,,, +20355,4727,content://media/external/images/media/4727,/storage/emulated/0/DCIM/Camera/IMG_20190714_131337.jpg,image/jpeg,4160,3120,0,9512914,,1637505574,1563102817000,1563102817819,0,0,0,,,,,,,,,,, +20356,3000,content://media/external/images/media/3000,/storage/emulated/0/DCIM/Camera/IMG_20190714_131330.jpg,image/jpeg,4160,3120,90,9699534,,1637501786,1563102810000,1563102810646,0,0,0,,,,,,,,,,, +20357,3717,content://media/external/images/media/3717,/storage/emulated/0/DCIM/Camera/IMG_20190714_122318.jpg,image/jpeg,4160,3120,0,7432560,,1637503477,1563099798000,1563099798431,0,0,0,,,,,,,,,,, +20358,4299,content://media/external/images/media/4299,/storage/emulated/0/DCIM/Camera/IMG_20190714_122309.jpg,image/jpeg,4000,3000,0,7149697,,1637504817,1563099789000,1563099789721,0,0,0,,,,,,,,,,, +20359,3180,content://media/external/images/media/3180,/storage/emulated/0/DCIM/Camera/IMG_20190714_122029.jpg,image/jpeg,5184,3880,0,5683382,,1637502161,1563099629000,1563099629808,0,0,0,,,,,,,,,,, +20360,3837,content://media/external/images/media/3837,/storage/emulated/0/DCIM/Camera/PANO_20190714_121026.jpg,image/jpeg,8336,3808,0,15887761,,1637503630,1563099034000,0,0,0,0,,,,,,,,,,, +20361,4653,content://media/external/images/media/4653,/storage/emulated/0/DCIM/Camera/IMG_20190714_120951.jpg,image/jpeg,4160,3120,0,8779099,,1637505417,1563098991000,1563098991044,0,0,0,,,,,,,,,,, +20362,3695,content://media/external/images/media/3695,/storage/emulated/0/DCIM/Camera/IMG_20190714_120943.jpg,image/jpeg,4160,3120,0,6839474,,1637503392,1563098983000,1563098983216,0,0,0,,,,,,,,,,, +20363,4050,content://media/external/images/media/4050,/storage/emulated/0/DCIM/Camera/IMG_20190714_120940.jpg,image/jpeg,4160,3120,0,7257145,,1637504342,1563098980000,1563098980661,0,0,0,,,,,,,,,,, +20364,3505,content://media/external/images/media/3505,/storage/emulated/0/DCIM/Camera/IMG_20190714_120907.jpg,image/jpeg,4160,3120,0,7259450,,1637502969,1563098947000,1563098946950,0,0,0,,,,,,,,,,, +20365,3297,content://media/external/images/media/3297,/storage/emulated/0/DCIM/Camera/IMG_20190714_113238.jpg,image/jpeg,4160,3120,0,9930401,,1637502430,1563096758000,1563096758517,0,0,0,,,,,,,,,,, +20366,5571,content://media/external/images/media/5571,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0021.jpg",image/jpeg,1600,1200,0,213235,,1637518219,1563096751000,0,0,0,0,,,,,,,,,,, +20367,4558,content://media/external/images/media/4558,/storage/emulated/0/DCIM/Camera/IMG_20190714_113021.jpg,image/jpeg,4000,3000,0,8548948,,1637505216,1563096621000,1563096621475,0,0,0,,,,,,,,,,, +20368,3199,content://media/external/images/media/3199,/storage/emulated/0/DCIM/Camera/IMG_20190714_112708.jpg,image/jpeg,4000,3000,90,10598934,,1637502256,1563096428000,1563096428440,0,0,0,,,,,,,,,,, +20369,5570,content://media/external/images/media/5570,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0017.jpg",image/jpeg,1200,1600,0,447225,,1637518219,1563095210000,0,0,0,0,,,,,,,,,,, +20370,5569,content://media/external/images/media/5569,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0015.jpg",image/jpeg,1599,899,0,185648,,1637518219,1563092859000,0,0,0,0,,,,,,,,,,, +20371,5568,content://media/external/images/media/5568,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0014.jpg",image/jpeg,1200,1599,0,273672,,1637518219,1563092691000,0,0,0,0,,,,,,,,,,, +20372,5567,content://media/external/images/media/5567,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0013.jpg",image/jpeg,1200,1599,0,167700,,1637518219,1563092690000,0,0,0,0,,,,,,,,,,, +20373,5566,content://media/external/images/media/5566,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0012.jpg",image/jpeg,898,1600,0,190260,,1637518219,1563092142000,0,0,0,0,,,,,,,,,,, +20374,4090,content://media/external/images/media/4090,/storage/emulated/0/DCIM/Camera/IMG_20190714_100251.jpg,image/jpeg,4000,3000,0,6518106,,1637504399,1563091371000,1563021224699,0,0,0,,,,,,,,,,, +20375,3862,content://media/external/images/media/3862,/storage/emulated/0/DCIM/Camera/IMG_20190714_100126.jpg,image/jpeg,4160,3120,0,4827872,,1637503728,1563091286000,1563018895203,0,0,0,,,,,,,,,,, +20376,5565,content://media/external/images/media/5565,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0002.jpg",image/jpeg,1599,899,0,160881,,1637518219,1563090322000,0,0,0,0,,,,,,,,,,, +20377,5564,content://media/external/images/media/5564,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0001.jpg",image/jpeg,1200,1599,0,155455,,1637518219,1563090091000,0,0,0,0,,,,,,,,,,, +20378,2959,content://media/external/images/media/2959,/storage/emulated/0/DCIM/Camera/IMG_20190713_213645.jpg,image/jpeg,4000,3000,0,5494936,,1637501684,1563046605000,1563046604981,0,0,0,,,,,,,,,,, +20379,5563,content://media/external/images/media/5563,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0019.jpg",image/jpeg,1328,747,0,100475,,1637518219,1563046072000,0,0,0,0,,,,,,,,,,, +20380,5561,content://media/external/images/media/5561,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0017.jpg",image/jpeg,1200,1600,0,163635,,1637518219,1563045560000,0,0,0,0,,,,,,,,,,, +20381,5562,content://media/external/images/media/5562,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0018.jpg",image/jpeg,1200,1600,0,174554,,1637518219,1563045560000,0,0,0,0,,,,,,,,,,, +20382,3801,content://media/external/images/media/3801,/storage/emulated/0/DCIM/Camera/IMG_20190713_194617.jpg,image/jpeg,4160,3120,0,6791267,,1637503601,1563039977000,1563039977257,0,0,0,,,,,,,,,,, +20383,4163,content://media/external/images/media/4163,/storage/emulated/0/DCIM/Camera/IMG_20190713_194530.jpg,image/jpeg,4160,3120,0,6493198,,1637504556,1563039930000,1563039930491,0,0,0,,,,,,,,,,, +20384,3179,content://media/external/images/media/3179,/storage/emulated/0/DCIM/Camera/IMG_20190713_194502.jpg,image/jpeg,4160,3120,0,8810088,,1637502161,1563039902000,1563039902876,0,0,0,,,,,,,,,,, +20385,3059,content://media/external/images/media/3059,/storage/emulated/0/DCIM/Camera/IMG_20190713_194416.jpg,image/jpeg,4160,3120,0,7742655,,1637501905,1563039856000,1563039856040,0,0,0,,,,,,,,,,, +20386,3800,content://media/external/images/media/3800,/storage/emulated/0/DCIM/Camera/IMG_20190713_194355.jpg,image/jpeg,4160,3120,0,9156199,,1637503601,1563039835000,1563039835414,0,0,0,,,,,,,,,,, +20387,4276,content://media/external/images/media/4276,/storage/emulated/0/DCIM/Camera/IMG_20190713_194352.jpg,image/jpeg,4160,3120,0,9807592,,1637504807,1563039832000,1563039832051,0,0,0,,,,,,,,,,, +20388,2958,content://media/external/images/media/2958,/storage/emulated/0/DCIM/Camera/IMG_20190713_193544.jpg,image/jpeg,5184,3880,0,6814970,,1637501684,1563039344000,1563039344219,0,0,0,,,,,,,,,,, +20389,5011,content://media/external/images/media/5011,/storage/emulated/0/DCIM/Camera/IMG_20190713_193529.jpg,image/jpeg,4000,3000,0,7286622,,1637506134,1563039329000,1563039328934,0,0,0,,,,,,,,,,, +20390,2643,content://media/external/images/media/2643,/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-07-13-18-27-07-255_com.miui.gallery.png,image/png,1080,2340,0,3724615,,1637500870,1563035228000,0,0,0,0,,,,,,,,,,, +20391,2724,content://media/external/images/media/2724,/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-07-13-18-25-31-386_com.miui.gallery.png,image/png,1080,2340,0,3901287,,1637500987,1563035132000,0,0,0,0,,,,,,,,,,, +20392,5560,content://media/external/images/media/5560,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0015.jpg",image/jpeg,1600,898,0,196910,,1637518219,1563033393000,0,0,0,0,,,,,,,,,,, +20393,5559,content://media/external/images/media/5559,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0014.jpg",image/jpeg,1600,898,0,185438,,1637518219,1563033114000,0,0,0,0,,,,,,,,,,, +20394,5558,content://media/external/images/media/5558,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0013.jpg",image/jpeg,898,1600,0,69758,,1637518219,1563032925000,0,0,0,0,,,,,,,,,,, +20395,5557,content://media/external/images/media/5557,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0010.jpg",image/jpeg,1600,1200,0,133265,,1637518219,1563030446000,0,0,0,0,,,,,,,,,,, +20396,5556,content://media/external/images/media/5556,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0009.jpg",image/jpeg,1600,1200,0,103037,,1637518219,1563030445000,0,0,0,0,,,,,,,,,,, +20397,4010,content://media/external/images/media/4010,/storage/emulated/0/DCIM/Camera/IMG_20190713_155902.jpg,image/jpeg,4000,3000,0,5802753,,1637504201,1563026342000,1563026342505,0,0,0,,,,,,,,,,, +20398,3220,content://media/external/images/media/3220,/storage/emulated/0/DCIM/Camera/IMG_20190713_153906.jpg,image/jpeg,4000,3000,0,5812566,,1637502258,1563025146000,1563025146105,0,0,0,,,,,,,,,,, +20399,3461,content://media/external/images/media/3461,/storage/emulated/0/DCIM/Camera/IMG_20190713_152225.jpg,image/jpeg,5184,3880,0,3562453,,1637502817,1563024147000,1563023693113,0,0,0,,,,,,,,,,, +20400,3447,content://media/external/images/media/3447,/storage/emulated/0/DCIM/Camera/IMG_20190713_151545.jpg,image/jpeg,4160,3120,0,8864889,,1637502804,1563023745000,1563023745747,0,0,0,,,,,,,,,,, +20401,4689,content://media/external/images/media/4689,/storage/emulated/0/DCIM/Camera/IMG_20190713_151543.jpg,image/jpeg,4160,3120,0,8568602,,1637505509,1563023743000,1563023743024,0,0,0,,,,,,,,,,, +20402,3391,content://media/external/images/media/3391,/storage/emulated/0/DCIM/Camera/IMG_20190713_151540.jpg,image/jpeg,4160,3120,0,8453481,,1637502598,1563023740000,1563023740156,0,0,0,,,,,,,,,,, +20403,4407,content://media/external/images/media/4407,/storage/emulated/0/DCIM/Camera/IMG_20190713_151453.jpg,image/jpeg,5184,3880,0,5796379,,1637505062,1563023693000,1563023693113,0,0,0,,,,,,,,,,, +20404,5555,content://media/external/images/media/5555,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0005.jpg",image/jpeg,1280,960,0,45186,,1637518219,1563023086000,0,0,0,0,,,,,,,,,,, +20405,4811,content://media/external/images/media/4811,/storage/emulated/0/DCIM/Camera/IMG_20190713_143310.jpg,image/jpeg,4000,3000,0,6204334,,1637505730,1563021190000,1563021190673,0,0,0,,,,,,,,,,, +20406,3651,content://media/external/images/media/3651,/storage/emulated/0/DCIM/Camera/IMG_20190713_135455.jpg,image/jpeg,4160,3120,0,7382813,,1637503358,1563018895000,1563018895203,0,0,0,,,,,,,,,,, +20407,3782,content://media/external/images/media/3782,/storage/emulated/0/DCIM/Camera/IMG_20190713_135437.jpg,image/jpeg,4000,3000,0,8917424,,1637503558,1563018877000,1563018877482,0,0,0,,,,,,,,,,, +20408,4578,content://media/external/images/media/4578,/storage/emulated/0/DCIM/Camera/IMG_20190713_135425.jpg,image/jpeg,4000,3000,0,8212644,,1637505278,1563018865000,1563018865385,0,0,0,,,,,,,,,,, +20409,5554,content://media/external/images/media/5554,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0003.jpg",image/jpeg,1200,1600,0,251808,,1637518219,1563017111000,0,0,0,0,,,,,,,,,,, +20410,5553,content://media/external/images/media/5553,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0002.jpg",image/jpeg,1080,1080,0,539999,,1637518219,1563015161000,0,0,0,0,,,,,,,,,,, +20411,4480,content://media/external/images/media/4480,/storage/emulated/0/DCIM/Camera/IMG_20190713_115537.jpg,image/jpeg,4000,3000,90,7334493,,1637505122,1563011737000,1563011737662,0,0,0,,,,,,,,,,, +20412,3369,content://media/external/images/media/3369,/storage/emulated/0/DCIM/Camera/IMG_20190713_115536.jpg,image/jpeg,4000,3000,90,7280560,,1637502523,1563011736000,1563011736433,0,0,0,,,,,,,,,,, +20413,3991,content://media/external/images/media/3991,/storage/emulated/0/DCIM/Camera/IMG_20190713_115400.jpg,image/jpeg,4000,3000,90,8047203,,1637504085,1563011640000,1563011640296,0,0,0,,,,,,,,,,, +20414,5552,content://media/external/images/media/5552,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0001.jpg",image/jpeg,1040,780,0,58363,,1637518219,1563005255000,0,0,0,0,,,,,,,,,,, +20415,5551,content://media/external/images/media/5551,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0000.jpg",image/jpeg,900,1600,0,159151,,1637518219,1563004596000,0,0,0,0,,,,,,,,,,, +20416,5550,content://media/external/images/media/5550,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190712-WA0021.jpg",image/jpeg,899,1599,0,250755,,1637518219,1562958690000,0,0,0,0,,,,,,,,,,, +20417,5549,content://media/external/images/media/5549,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190712-WA0020.jpg",image/jpeg,1599,1200,0,185353,,1637518219,1562957337000,0,0,0,0,,,,,,,,,,, +20418,5548,content://media/external/images/media/5548,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190712-WA0018.jpg",image/jpeg,1200,1600,0,129871,,1637518219,1562950821000,0,0,0,0,,,,,,,,,,, +20419,5547,content://media/external/images/media/5547,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190712-WA0016.jpg",image/jpeg,899,1599,0,140675,,1637518219,1562931017000,0,0,0,0,,,,,,,,,,, +20420,5546,content://media/external/images/media/5546,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190712-WA0015.jpg",image/jpeg,1200,1600,0,276276,,1637518219,1562930895000,0,0,0,0,,,,,,,,,,, +20421,5545,content://media/external/images/media/5545,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190712-WA0001.jpg",image/jpeg,1600,800,0,132879,,1637518219,1562890067000,0,0,0,0,,,,,,,,,,, +20422,5544,content://media/external/images/media/5544,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0016.jpg",image/jpeg,1600,900,0,359673,,1637518219,1562862763000,0,0,0,0,,,,,,,,,,, +20423,5543,content://media/external/images/media/5543,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0015.jpg",image/jpeg,310,1107,0,71470,,1637518219,1562856253000,0,0,0,0,,,,,,,,,,, +20424,5542,content://media/external/images/media/5542,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0014.jpg",image/jpeg,898,1600,0,126009,,1637518219,1562846160000,0,0,0,0,,,,,,,,,,, +20425,5541,content://media/external/images/media/5541,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0013.jpg",image/jpeg,899,1599,0,109448,,1637518219,1562837834000,0,0,0,0,,,,,,,,,,, +20426,5540,content://media/external/images/media/5540,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0012.jpg",image/jpeg,899,1599,0,113794,,1637518219,1562834432000,0,0,0,0,,,,,,,,,,, +20427,5539,content://media/external/images/media/5539,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0011.jpg",image/jpeg,1600,898,0,94274,,1637518219,1562834154000,0,0,0,0,,,,,,,,,,, +20428,5538,content://media/external/images/media/5538,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0010.jpg",image/jpeg,1600,1200,0,165999,,1637518219,1562833774000,0,0,0,0,,,,,,,,,,, +20429,5537,content://media/external/images/media/5537,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0009.jpg",image/jpeg,1600,1600,0,530250,,1637518219,1562833772000,0,0,0,0,,,,,,,,,,, +20430,5536,content://media/external/images/media/5536,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0008.jpg",image/jpeg,1200,1600,0,219024,,1637518219,1562833771000,0,0,0,0,,,,,,,,,,, +20431,5535,content://media/external/images/media/5535,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0007.jpg",image/jpeg,1600,1200,0,282311,,1637518219,1562823914000,0,0,0,0,,,,,,,,,,, +20432,5534,content://media/external/images/media/5534,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0006.jpg",image/jpeg,1200,1600,0,329916,,1637518219,1562801619000,0,0,0,0,,,,,,,,,,, +20433,5532,content://media/external/images/media/5532,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0003.jpg",image/jpeg,1200,1600,0,208499,,1637518219,1562800695000,0,0,0,0,,,,,,,,,,, +20434,5533,content://media/external/images/media/5533,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0004.jpg",image/jpeg,960,1280,0,134236,,1637518219,1562800695000,0,0,0,0,,,,,,,,,,, +20435,5531,content://media/external/images/media/5531,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0002.jpg",image/jpeg,1200,1600,0,177205,,1637518219,1562800694000,0,0,0,0,,,,,,,,,,, +20436,5529,content://media/external/images/media/5529,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0000.jpg",image/jpeg,1200,1600,0,162636,,1637518219,1562800693000,0,0,0,0,,,,,,,,,,, +20437,5530,content://media/external/images/media/5530,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0001.jpg",image/jpeg,1600,688,0,115157,,1637518219,1562800693000,0,0,0,0,,,,,,,,,,, +20438,5528,content://media/external/images/media/5528,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190710-WA0007.jpg",image/jpeg,640,311,0,29823,,1637518219,1562788441000,0,0,0,0,,,,,,,,,,, +20439,4688,content://media/external/images/media/4688,/storage/emulated/0/DCIM/Camera/IMG_20190710_213354.jpg,image/jpeg,4000,3000,90,5797515,,1637505509,1562787234000,1562787234871,0,0,0,,,,,,,,,,, +20440,5527,content://media/external/images/media/5527,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190710-WA0006.jpg",image/jpeg,879,596,0,102737,,1637518219,1562785647000,0,0,0,0,,,,,,,,,,, +20441,4557,content://media/external/images/media/4557,/storage/emulated/0/DCIM/Camera/IMG_20190710_205009.jpg,image/jpeg,4000,3000,90,5484812,,1637505216,1562784609000,1562784609040,0,0,0,,,,,,,,,,, +20442,3839,content://media/external/images/media/3839,/storage/emulated/0/DCIM/Camera/IMG_20190710_205002.jpg,image/jpeg,4000,3000,90,6227777,,1637503642,1562784602000,1562784602516,0,0,0,,,,,,,,,,, +20443,5526,content://media/external/images/media/5526,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190710-WA0005.jpg",image/jpeg,750,914,0,67012,,1637518219,1562774830000,0,0,0,0,,,,,,,,,,, +20444,5525,content://media/external/images/media/5525,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190710-WA0002.jpg",image/jpeg,898,1600,0,167101,,1637518219,1562751269000,0,0,0,0,,,,,,,,,,, +20445,5524,content://media/external/images/media/5524,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190710-WA0001.jpg",image/jpeg,1066,1600,0,111644,,1637518219,1562736623000,0,0,0,0,,,,,,,,,,, +20446,5523,content://media/external/images/media/5523,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190710-WA0000.jpg",image/jpeg,1066,1600,0,116060,,1637518219,1562736617000,0,0,0,0,,,,,,,,,,, +20447,5522,content://media/external/images/media/5522,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0009.jpg",image/jpeg,1408,1056,0,127764,,1637518219,1562695158000,0,0,0,0,,,,,,,,,,, +20448,5521,content://media/external/images/media/5521,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0008.jpg",image/jpeg,1200,1600,0,152461,,1637518219,1562695157000,0,0,0,0,,,,,,,,,,, +20449,5520,content://media/external/images/media/5520,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0007.jpg",image/jpeg,1600,1200,0,291412,,1637518219,1562695154000,0,0,0,0,,,,,,,,,,, +20450,5519,content://media/external/images/media/5519,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0006.jpg",image/jpeg,1200,1600,0,249763,,1637518219,1562695151000,0,0,0,0,,,,,,,,,,, +20451,5518,content://media/external/images/media/5518,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0005.jpg",image/jpeg,1200,1600,0,310118,,1637518219,1562695146000,0,0,0,0,,,,,,,,,,, +20452,5517,content://media/external/images/media/5517,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0004.jpg",image/jpeg,1056,1408,0,205484,,1637518219,1562695131000,0,0,0,0,,,,,,,,,,, +20453,5516,content://media/external/images/media/5516,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0003.jpg",image/jpeg,1200,1600,0,224439,,1637518219,1562665985000,0,0,0,0,,,,,,,,,,, +20454,5515,content://media/external/images/media/5515,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0002.jpg",image/jpeg,898,1600,0,158286,,1637518219,1562663586000,0,0,0,0,,,,,,,,,,, +20455,5514,content://media/external/images/media/5514,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0001.jpg",image/jpeg,898,1600,0,152933,,1637518219,1562663584000,0,0,0,0,,,,,,,,,,, +20456,5513,content://media/external/images/media/5513,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0000.jpg",image/jpeg,898,1600,0,145771,,1637518219,1562663582000,0,0,0,0,,,,,,,,,,, +20457,5512,content://media/external/images/media/5512,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190708-WA0007.jpg",image/jpeg,899,1599,0,117539,,1637518219,1562611490000,0,0,0,0,,,,,,,,,,, +20458,5511,content://media/external/images/media/5511,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190708-WA0006.jpg",image/jpeg,749,1599,0,101874,,1637518219,1562611401000,0,0,0,0,,,,,,,,,,, +20459,5510,content://media/external/images/media/5510,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190708-WA0005.jpg",image/jpeg,750,1334,0,104122,,1637518219,1562602932000,0,0,0,0,,,,,,,,,,, +20460,5509,content://media/external/images/media/5509,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190708-WA0004.jpg",image/jpeg,1200,1600,0,157034,,1637518219,1562572127000,0,0,0,0,,,,,,,,,,, +20461,5508,content://media/external/images/media/5508,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190708-WA0002.jpeg",image/jpeg,2250,4000,0,569921,,1637518219,1562570482000,0,0,0,0,,,,,,,,,,, +20462,5475,content://media/external/images/media/5475,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190708-WA0000.jpeg",image/jpeg,2250,4000,0,535937,,1637518219,1562570470000,0,0,0,0,,,,,,,,,,, +20463,5506,content://media/external/images/media/5506,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190707-WA0001.jpg",image/jpeg,720,405,0,52441,,1637518219,1562513492000,0,0,0,0,,,,,,,,,,, +20464,5505,content://media/external/images/media/5505,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190707-WA0000.jpg",image/jpeg,1200,1600,0,203401,,1637518219,1562483377000,0,0,0,0,,,,,,,,,,, +20465,5504,content://media/external/images/media/5504,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190706-WA0008.jpg",image/jpeg,1600,900,0,187182,,1637518219,1562438638000,0,0,0,0,,,,,,,,,,, +20466,5503,content://media/external/images/media/5503,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190706-WA0007.jpg",image/jpeg,640,1136,0,50691,,1637518219,1562423607000,0,0,0,0,,,,,,,,,,, +20467,5502,content://media/external/images/media/5502,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190706-WA0006.jpg",image/jpeg,1200,1599,0,219085,,1637518219,1562422518000,0,0,0,0,,,,,,,,,,, +20468,5501,content://media/external/images/media/5501,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190706-WA0005.jpg",image/jpeg,899,1599,0,104652,,1637518219,1562410837000,0,0,0,0,,,,,,,,,,, +20469,5500,content://media/external/images/media/5500,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190706-WA0004.jpg",image/jpeg,448,302,0,45016,,1637518219,1562407006000,0,0,0,0,,,,,,,,,,, +20470,5499,content://media/external/images/media/5499,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190706-WA0002.jpg",image/jpeg,1040,780,0,72359,,1637518219,1562400792000,0,0,0,0,,,,,,,,,,, +20471,3504,content://media/external/images/media/3504,/storage/emulated/0/DCIM/Camera/IMG_20190706_092148.jpg,image/jpeg,4000,3000,90,4747617,,1637502969,1562397709000,1562397708940,0,0,0,,,,,,,,,,, +20472,4385,content://media/external/images/media/4385,/storage/emulated/0/DCIM/Camera/IMG_20190706_090504.jpg,image/jpeg,4000,3000,90,4543558,,1637505004,1562396704000,1562396704310,0,0,0,,,,,,,,,,, +20473,5498,content://media/external/images/media/5498,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190706-WA0001.jpg",image/jpeg,1600,1200,0,313442,,1637518219,1562392429000,0,0,0,0,,,,,,,,,,, +20474,5497,content://media/external/images/media/5497,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190705-WA0003.jpg",image/jpeg,1288,972,0,105619,,1637518219,1562353465000,0,0,0,0,,,,,,,,,,, +20475,3594,content://media/external/images/media/3594,/storage/emulated/0/DCIM/Camera/IMG_20190705_175033.jpg,image/jpeg,4000,3000,90,4423952,,1637503238,1562341834000,1562341833545,0,0,0,,,,,,,,,,, +20476,3758,content://media/external/images/media/3758,/storage/emulated/0/DCIM/Camera/IMG_20190705_175024.jpg,image/jpeg,4000,3000,0,4561908,,1637503508,1562341825000,1562341824947,0,0,0,,,,,,,,,,, +20477,2853,content://media/external/images/media/2853,/storage/emulated/0/DCIM/Camera/IMG_20190705_175017.jpg,image/jpeg,4000,3000,90,4876009,,1637501457,1562341818000,1562341817397,0,0,0,,,,,,,,,,, +20478,4746,content://media/external/images/media/4746,/storage/emulated/0/DCIM/Camera/IMG_20190705_175010.jpg,image/jpeg,4000,3000,0,5951174,,1637505639,1562341811000,1562341810691,0,0,0,,,,,,,,,,, +20479,3022,content://media/external/images/media/3022,/storage/emulated/0/DCIM/Camera/IMG_20190705_175004.jpg,image/jpeg,4000,3000,90,5645208,,1637501805,1562341805000,1562341803961,0,0,0,,,,,,,,,,, +20480,5495,content://media/external/images/media/5495,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190705-WA0001.jpg",image/jpeg,1296,864,0,115093,,1637518219,1562303290000,0,0,0,0,,,,,,,,,,, +20481,5496,content://media/external/images/media/5496,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190705-WA0002.jpg",image/jpeg,1296,864,0,120945,,1637518219,1562303290000,0,0,0,0,,,,,,,,,,, +20482,5494,content://media/external/images/media/5494,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190705-WA0000.jpg",image/jpeg,1296,864,0,105543,,1637518219,1562303289000,0,0,0,0,,,,,,,,,,, +20483,5493,content://media/external/images/media/5493,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0014.jpg",image/jpeg,436,650,0,72237,,1637518219,1562271635000,0,0,0,0,,,,,,,,,,, +20484,5492,content://media/external/images/media/5492,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0013.jpg",image/jpeg,1200,1600,0,519178,,1637518219,1562256252000,0,0,0,0,,,,,,,,,,, +20485,4108,content://media/external/images/media/4108,/storage/emulated/0/DCIM/Camera/IMG_20190704_174633.jpg,image/jpeg,4000,3000,90,4719312,,1637504451,1562255193000,1562255193342,0,0,0,,,,,,,,,,, +20486,3936,content://media/external/images/media/3936,/storage/emulated/0/DCIM/Camera/IMG_20190704_174631.jpg,image/jpeg,4000,3000,90,5568486,,1637503853,1562255191000,1562255191287,0,0,0,,,,,,,,,,, +20487,4836,content://media/external/images/media/4836,/storage/emulated/0/DCIM/Camera/IMG_20190704_174629.jpg,image/jpeg,4000,3000,90,4393204,,1637505753,1562255189000,1562255189095,0,0,0,,,,,,,,,,, +20488,4835,content://media/external/images/media/4835,/storage/emulated/0/DCIM/Camera/IMG_20190704_174624.jpg,image/jpeg,4000,3000,90,4723847,,1637505753,1562255184000,1562255184291,0,0,0,,,,,,,,,,, +20489,5491,content://media/external/images/media/5491,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0011.jpg",image/jpeg,622,205,0,24855,,1637518219,1562255053000,0,0,0,0,,,,,,,,,,, +20490,5490,content://media/external/images/media/5490,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0010.jpg",image/jpeg,750,1334,0,181281,,1637518219,1562251646000,0,0,0,0,,,,,,,,,,, +20491,5489,content://media/external/images/media/5489,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0009.jpg",image/jpeg,750,1334,0,121752,,1637518219,1562251645000,0,0,0,0,,,,,,,,,,, +20492,5488,content://media/external/images/media/5488,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0008.jpg",image/jpeg,750,1334,0,100436,,1637518219,1562251438000,0,0,0,0,,,,,,,,,,, +20493,5487,content://media/external/images/media/5487,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0007.jpg",image/jpeg,750,1334,0,123546,,1637518219,1562251437000,0,0,0,0,,,,,,,,,,, +20494,5486,content://media/external/images/media/5486,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0006.jpg",image/jpeg,1200,1600,0,166475,,1637518219,1562242702000,0,0,0,0,,,,,,,,,,, +20495,5485,content://media/external/images/media/5485,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0005.jpg",image/jpeg,898,1600,0,214793,,1637518219,1562239343000,0,0,0,0,,,,,,,,,,, +20496,5484,content://media/external/images/media/5484,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0003.jpg",image/jpeg,480,588,0,36334,,1637518219,1562236539000,0,0,0,0,,,,,,,,,,, +20497,5483,content://media/external/images/media/5483,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0002.jpg",image/jpeg,1200,1600,0,165133,,1637518219,1562230331000,0,0,0,0,,,,,,,,,,, +20498,5482,content://media/external/images/media/5482,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0001.jpg",image/jpeg,1200,1600,0,180130,,1637518219,1562230328000,0,0,0,0,,,,,,,,,,, +20499,5481,content://media/external/images/media/5481,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190703-WA0004.jpg",image/jpeg,704,960,0,66781,,1637518219,1562158244000,0,0,0,0,,,,,,,,,,, +20500,5480,content://media/external/images/media/5480,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190703-WA0003.jpg",image/jpeg,720,672,0,35763,,1637518219,1562148120000,0,0,0,0,,,,,,,,,,, +20501,5479,content://media/external/images/media/5479,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190703-WA0002.jpg",image/jpeg,1202,1600,0,103437,,1637518219,1562147251000,0,0,0,0,,,,,,,,,,, +20502,5478,content://media/external/images/media/5478,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190703-WA0001.jpg",image/jpeg,681,1600,0,300161,,1637518219,1562141462000,0,0,0,0,,,,,,,,,,, +20503,5477,content://media/external/images/media/5477,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190703-WA0000.jpg",image/jpeg,900,1600,0,187770,,1637518219,1562138899000,0,0,0,0,,,,,,,,,,, +20504,5476,content://media/external/images/media/5476,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190702-WA0002.jpg",image/jpeg,750,1334,0,111110,,1637518219,1562101453000,0,0,0,0,,,,,,,,,,, +20505,4162,content://media/external/images/media/4162,/storage/emulated/0/DCIM/Camera/IMG_20190628_200511.jpg,image/jpeg,5823,2747,0,1655237,,1637504556,1561963473000,0,0,0,0,,,,,,,,,,, +20506,4616,content://media/external/images/media/4616,/storage/emulated/0/DCIM/Camera/PANO_20190628_200406.jpg,image/jpeg,7664,3616,0,4269936,,1637505308,1561745052000,0,0,0,0,,,,,,,,,,, +20507,3820,content://media/external/images/media/3820,/storage/emulated/0/DCIM/Camera/IMG_20190628_200259.jpg,image/jpeg,4000,3000,90,8354585,,1637503629,1561744980000,1561744979764,0,0,0,,,,,,,,,,, +20508,3276,content://media/external/images/media/3276,/storage/emulated/0/DCIM/Camera/IMG_20190628_195919.jpg,image/jpeg,4160,3120,0,4683391,,1637502355,1561744760000,1561744565149,0,0,0,,,,,,,,,,, +20509,3021,content://media/external/images/media/3021,/storage/emulated/0/DCIM/Camera/IMG_20190628_195837.jpg,image/jpeg,4160,3120,0,4580392,,1637501805,1561744718000,1561744565149,0,0,0,,,,,,,,,,, +20510,4128,content://media/external/images/media/4128,/storage/emulated/0/DCIM/Camera/IMG_20190628_195605.jpg,image/jpeg,4160,3120,0,4602735,,1637504473,1561744565000,1561744565149,0,0,0,,,,,,,,,,, +20511,1000018529,content://media/external/video/media/1000018529,/storage/emulated/0/DCIM/Camera/VID_20250204_104639.mp4,video/mp4,1920,1080,90,122129847,,1738662399,1738662449402,1738662447000,46894,0,0,,,,,,,,,,, +20512,1000018528,content://media/external/video/media/1000018528,/storage/emulated/0/DCIM/Camera/VID_20250204_104615.mp4,video/mp4,1920,1080,90,4954519,,1738662375,1738662380450,1738662378000,1429,0,0,,,,,,,,,,, +20513,1000017577,content://media/external/video/media/1000017577,/storage/emulated/0/Movies/youcut/YouCut_20230406_115557563.mp4,video/mp4,480,854,0,23088431,,1680774974,1680774974529,0,43770,0,0,,,,,,,,,,, +20514,1000017576,content://media/external/video/media/1000017576,/storage/emulated/0/Movies/youcut/YouCut_20230406_115352610.mp4,video/mp4,480,854,0,23106418,,1680774876,1680774876501,0,43754,0,0,,,,,,,,,,, +20515,1000017571,content://media/external/video/media/1000017571,/storage/emulated/0/DCIM/Camera/VID_20230406_114322.mp4,video/mp4,1920,1080,90,423510599,,1680774202,1680774371872,1680774370000,166242,0,0,,,,,,,,,,, +20516,1000017570,content://media/external/video/media/1000017570,/storage/emulated/0/Movies/youcut/YouCut_20230406_095900058.mp4,video/mp4,640,1138,0,93360590,,1680767983,1680767984061,0,104231,0,0,,,,,,,,,,, +20517,1000017569,content://media/external/video/media/1000017569,/storage/emulated/0/DCIM/Camera/VID_20230406_094301.mp4,video/mp4,1920,1080,90,463585431,,1680766981,1680767196377,1680767195000,212807,0,0,,,,,,,,,,, +20518,1000017568,content://media/external/video/media/1000017568,/storage/emulated/0/DCIM/Camera/VID_20230406_094058.mp4,video/mp4,1920,1080,90,262535089,,1680766858,1680766965037,1680766964000,104226,0,0,,,,,,,,,,, +20519,1000017567,content://media/external/video/media/1000017567,/storage/emulated/0/DCIM/Camera/VID_20230406_093958.mp4,video/mp4,1920,1080,90,104709206,,1680766798,1680766856149,1680766855000,55797,0,0,,,,,,,,,,, +20520,1000017566,content://media/external/video/media/1000017566,/storage/emulated/0/DCIM/Camera/VID_20230406_093943.mp4,video/mp4,1920,1080,90,11759440,,1680766783,1680766789381,1680766789000,3864,0,0,,,,,,,,,,, +20521,1000017565,content://media/external/video/media/1000017565,/storage/emulated/0/DCIM/Camera/VID_20230406_093928.mp4,video/mp4,1920,1080,90,2058848,,1680766768,1680766777597,1680766777000,7328,0,0,,,,,,,,,,, +20522,1000017564,content://media/external/video/media/1000017564,/storage/emulated/0/DCIM/Camera/VID_20230406_093833.mp4,video/mp4,1920,1080,90,41058060,,1680766713,1680766730769,1680766730000,15576,0,0,,,,,,,,,,, +20523,1000017563,content://media/external/video/media/1000017563,/storage/emulated/0/DCIM/Camera/VID_20230406_093757.mp4,video/mp4,1920,1080,90,75715258,,1680766677,1680766711145,1680766710000,31711,0,0,,,,,,,,,,, +20524,1000017562,content://media/external/video/media/1000017562,/storage/emulated/0/DCIM/Camera/VID_20230406_093744.mp4,video/mp4,1920,1080,90,19372133,,1680766664,1680766672869,1680766672000,6534,0,0,,,,,,,,,,, +20525,1000017557,content://media/external/video/media/1000017557,/storage/emulated/0/DCIM/Camera/VID_20230406_092500.mp4,video/mp4,1920,1080,90,409664958,,1680765900,1680766104197,1680766103000,200849,0,0,,,,,,,,,,, +20526,1000017555,content://media/external/video/media/1000017555,/storage/emulated/0/DCIM/Camera/VID_20230406_092103.mp4,video/mp4,1920,1080,90,223932873,,1680765663,1680765751881,1680765750000,85592,0,0,,,,,,,,,,, +20527,1000017089,content://media/external/video/media/1000017089,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230214-WA0009.mp4",video/mp4,432,640,0,1214691,,1676390519,1676390521575,0,13793,0,0,,,,,,,,,,, +20528,1000016883,content://media/external/video/media/1000016883,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230209-WA0013.mp4",video/mp4,640,352,0,18524455,,1675981555,1675981562086,0,71981,0,0,,,,,,,,,,, +20529,1000016879,content://media/external/video/media/1000016879,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230209-WA0012.mp4",video/mp4,640,352,0,15117079,,1675981506,1675981523703,0,57285,0,0,,,,,,,,,,, +20530,1000016817,content://media/external/video/media/1000016817,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230208-WA0013.mp4",video/mp4,640,352,0,33152637,,1675893941,1675897085669,0,168491,0,0,,,,,,,,,,, +20531,1000016602,content://media/external/video/media/1000016602,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230205-WA0003.mp4",video/mp4,224,288,0,63877,,1675595349,1675595349713,0,3203,0,0,,,,,,,,,,, +20532,1000016485,content://media/external/video/media/1000016485,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230201-WA0004.mp4",video/mp4,640,352,90,7086727,,1675260006,1675260011334,0,25024,0,0,,,,,,,,,,, +20533,1000016404,content://media/external/video/media/1000016404,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230130-WA0002.mp4",video/mp4,576,1024,0,6629921,,1675077148,1675077151990,0,22200,0,0,,,,,,,,,,, +20534,1000016342,content://media/external/video/media/1000016342,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230128-WA0010.mp4",video/mp4,320,180,0,11183703,,1674925437,1674925443377,0,230063,0,0,,,,,,,,,,, +20535,1000016225,content://media/external/video/media/1000016225,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230125-WA0002.mp4",video/mp4,368,480,0,3238791,,1674653930,1674653932324,0,16068,0,0,,,,,,,,,,, +20536,1000016223,content://media/external/video/media/1000016223,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230125-WA0001.mp4",video/mp4,386,386,0,125649,,1674647711,1674647711832,0,1640,0,0,,,,,,,,,,, +20537,1000016101,content://media/external/video/media/1000016101,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230123-WA0000.mp4",video/mp4,480,848,0,8394246,,1674457555,1674457561061,0,41076,0,0,,,,,,,,,,, +20538,1000016072,content://media/external/video/media/1000016072,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp video/VID-20230122-WA0002.mp4",video/mp4,640,352,90,14859422,,1674386242,1674386248003,0,61355,0,0,,,,,,,,,,, +20539,1000016065,content://media/external/video/media/1000016065,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230122-WA0000.mp4",video/mp4,352,640,0,6559639,,1674378853,1674378855730,0,25557,0,0,,,,,,,,,,, +20540,1000016053,content://media/external/video/media/1000016053,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230121-WA0018.mp4",video/mp4,640,352,0,31856363,,1674313737,1674313754132,0,147517,0,0,,,,,,,,,,, +20541,1000016017,content://media/external/video/media/1000016017,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230121-WA0007.mp4",video/mp4,640,352,180,594378,,1674303877,1674303878135,0,3221,0,0,,,,,,,,,,, +20542,1000015928,content://media/external/video/media/1000015928,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230119-WA0006.mp4",video/mp4,848,480,90,1168997,,1674154092,1674154093608,0,5457,0,0,,,,,,,,,,, +20543,1000015924,content://media/external/video/media/1000015924,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230119-WA0005.mp4",video/mp4,480,848,0,1246264,,1674148581,1674148582720,0,7755,0,0,,,,,,,,,,, +20544,1000015872,content://media/external/video/media/1000015872,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230117-WA0001.mp4",video/mp4,576,1028,0,1096734,,1673970844,1673970846126,0,13444,0,0,,,,,,,,,,, +20545,1000015852,content://media/external/video/media/1000015852,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230116-WA0009.mp4",video/mp4,640,352,0,6081845,,1673901213,1673901216285,0,75520,0,0,,,,,,,,,,, +20546,1000015848,content://media/external/video/media/1000015848,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230116-WA0008.mp4",video/mp4,640,352,90,10515248,,1673892856,1673892860654,0,39853,0,0,,,,,,,,,,, +20547,1000015791,content://media/external/video/media/1000015791,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230115-WA0003.mp4",video/mp4,258,258,0,223602,,1673780647,1673780648936,0,2800,0,0,,,,,,,,,,, +20548,1000015734,content://media/external/video/media/1000015734,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230114-WA0016.mp4",video/mp4,640,352,90,17576102,,1673691080,1673695630431,0,58923,0,0,,,,,,,,,,, +20549,1000015742,content://media/external/video/media/1000015742,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230114-WA0018.mp4",video/mp4,640,352,90,3170326,,1673691465,1673691466537,0,11605,0,0,,,,,,,,,,, +20550,1000015738,content://media/external/video/media/1000015738,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230114-WA0017.mp4",video/mp4,640,352,90,12755127,,1673691121,1673691158032,0,41045,0,0,,,,,,,,,,, +20551,1000015697,content://media/external/video/media/1000015697,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp video/VID-20230114-WA0004.mp4",video/mp4,640,352,90,6906775,,1673690399,1673690403188,0,21931,0,0,,,,,,,,,,, +20552,1000015635,content://media/external/video/media/1000015635,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230113-WA0001.mp4",video/mp4,160,92,0,44657,,1673612396,1673612396729,0,4880,0,0,,,,,,,,,,, +20553,1000015628,content://media/external/video/media/1000015628,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230113-WA0000.mp4",video/mp4,480,480,0,57087,,1673594928,1673594928848,0,420,0,0,,,,,,,,,,, +20554,1000015510,content://media/external/video/media/1000015510,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230110-WA0006.mp4",video/mp4,640,352,0,18733759,,1673365616,1673365623404,0,71964,0,0,,,,,,,,,,, +20555,1000015504,content://media/external/video/media/1000015504,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230110-WA0004.mp4",video/mp4,640,352,180,17381225,,1673364596,1673364602278,0,66944,0,0,,,,,,,,,,, +20556,1000015362,content://media/external/video/media/1000015362,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230106-WA0012.mp4",video/mp4,640,352,90,3987642,,1673009630,1673009670736,0,22140,0,0,,,,,,,,,,, +20557,1000015355,content://media/external/video/media/1000015355,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230106-WA0010.mp4",video/mp4,640,352,90,1602686,,1673009597,1673009629537,0,8747,0,0,,,,,,,,,,, +20558,1000015345,content://media/external/video/media/1000015345,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230106-WA0007.mp4",video/mp4,640,352,90,2711198,,1673009570,1673009596363,0,15168,0,0,,,,,,,,,,, +20559,1000015335,content://media/external/video/media/1000015335,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230106-WA0003.mp4",video/mp4,294,350,0,50023,,1673001333,1673001333742,0,2040,0,0,,,,,,,,,,, +20560,1000015242,content://media/external/video/media/1000015242,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230104-WA0006.mp4",video/mp4,640,352,0,15408715,,1672870189,1672870199173,0,84075,0,0,,,,,,,,,,, +20561,1000015200,content://media/external/video/media/1000015200,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230103-WA0001.mp4",video/mp4,640,352,90,5190458,,1672750731,1672750734092,0,29163,0,0,,,,,,,,,,, +20562,1000015155,content://media/external/video/media/1000015155,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230102-WA0001.mp4",video/mp4,640,352,0,26427520,,1672655930,1672655950805,0,120073,0,0,,,,,,,,,,, +20563,1000015130,content://media/external/video/media/1000015130,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0030.mp4",video/mp4,480,848,0,2739789,,1672577891,1672577893359,0,12817,0,0,,,,,,,,,,, +20564,1000015126,content://media/external/video/media/1000015126,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0029.mp4",video/mp4,352,640,0,894546,,1672575271,1672575309860,0,3371,0,0,,,,,,,,,,, +20565,1000015122,content://media/external/video/media/1000015122,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0028.mp4",video/mp4,480,480,0,5866263,,1672574009,1672574011598,0,61510,0,0,,,,,,,,,,, +20566,1000015111,content://media/external/video/media/1000015111,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230101-WA0024.mp4",video/mp4,354,354,0,84318,,1672569209,1672569210049,0,1400,0,0,,,,,,,,,,, +20567,1000015089,content://media/external/video/media/1000015089,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0019.mp4",video/mp4,352,640,0,1148426,,1672534230,1672534231325,0,4459,0,0,,,,,,,,,,, +20568,1000015085,content://media/external/video/media/1000015085,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0018.mp4",video/mp4,352,640,0,1572747,,1672532458,1672532459273,0,5944,0,0,,,,,,,,,,, +20569,1000015066,content://media/external/video/media/1000015066,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0012.mp4",video/mp4,400,304,0,987692,,1672530428,1672530430745,0,15000,0,0,,,,,,,,,,, +20570,1000015062,content://media/external/video/media/1000015062,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0011.mp4",video/mp4,640,352,0,30465215,,1672529924,1672529951962,0,145499,0,0,,,,,,,,,,, +20571,1000015058,content://media/external/video/media/1000015058,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0010.mp4",video/mp4,576,576,0,5130476,,1672529670,1672529678616,0,72006,0,0,,,,,,,,,,, +20572,1000015056,content://media/external/video/media/1000015056,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230101-WA0009.mp4",video/mp4,512,512,0,34140,,1672529528,1672529528897,0,450,0,0,,,,,,,,,,, +20573,1000015052,content://media/external/video/media/1000015052,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0008.mp4",video/mp4,544,640,0,1835184,,1672528886,1672528887992,0,19760,0,0,,,,,,,,,,, +20574,1000015050,content://media/external/video/media/1000015050,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230101-WA0007.mp4",video/mp4,192,192,0,74080,,1672528821,1672528821260,0,3991,0,0,,,,,,,,,,, +20575,1000015040,content://media/external/video/media/1000015040,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0004.mp4",video/mp4,480,848,0,10628778,,1672528124,1672528136340,0,66641,0,0,,,,,,,,,,, +20576,1000015036,content://media/external/video/media/1000015036,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0003.mp4",video/mp4,640,352,0,11787358,,1672528027,1672528035188,0,43883,0,0,,,,,,,,,,, +20577,1000014982,content://media/external/video/media/1000014982,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221231-WA0022.mp4",video/mp4,112,144,0,71096,,1672510927,1672510927576,0,2250,0,0,,,,,,,,,,, +20578,1000014978,content://media/external/video/media/1000014978,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221231-WA0021.mp4",video/mp4,432,240,0,2691444,,1672510301,1672510303149,0,47392,0,0,,,,,,,,,,, +20579,1000014971,content://media/external/video/media/1000014971,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221231-WA0018.mp4",video/mp4,416,256,0,93677,,1672506287,1672506287439,0,1805,0,0,,,,,,,,,,, +20580,1000014963,content://media/external/video/media/1000014963,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221231-WA0015.mp4",video/mp4,452,378,0,102601,,1672504770,1672504785641,0,1960,0,0,,,,,,,,,,, +20581,1000014927,content://media/external/video/media/1000014927,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221231-WA0001.mp4",video/mp4,432,240,0,2735597,,1672491395,1672493179411,0,47392,0,0,,,,,,,,,,, +20582,1000014783,content://media/external/video/media/1000014783,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221228-WA0002.mp4",video/mp4,640,352,90,3682952,,1672226652,1672226654186,0,13290,0,0,,,,,,,,,,, +20583,1000014670,content://media/external/video/media/1000014670,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221225-WA0029.mp4",video/mp4,400,400,0,118985,,1671984921,1671984921796,0,1683,0,0,,,,,,,,,,, +20584,1000014657,content://media/external/video/media/1000014657,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0025.mp4",video/mp4,640,352,0,924297,,1671976523,1671976525692,0,8512,0,0,,,,,,,,,,, +20585,1000014631,content://media/external/video/media/1000014631,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0017.mp4",video/mp4,576,1024,0,1290948,,1671962265,1671962268074,0,18135,0,0,,,,,,,,,,, +20586,1000014623,content://media/external/video/media/1000014623,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221225-WA0014.mp4",video/mp4,432,432,0,91851,,1671959440,1671959440339,0,1360,0,0,,,,,,,,,,, +20587,1000014619,content://media/external/video/media/1000014619,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0013.mp4",video/mp4,848,480,0,6070972,,1671959077,1671959088171,0,29698,0,0,,,,,,,,,,, +20588,1000014613,content://media/external/video/media/1000014613,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0011.mp4",video/mp4,640,352,90,2482890,,1671958851,1671958855972,0,9216,0,0,,,,,,,,,,, +20589,1000014605,content://media/external/video/media/1000014605,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221225-WA0009.mp4",video/mp4,480,336,0,49147,,1671956919,1671956919583,0,984,0,0,,,,,,,,,,, +20590,1000014597,content://media/external/video/media/1000014597,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221225-WA0006.mp4",video/mp4,224,160,0,35812,,1671955348,1671955348509,0,1778,0,0,,,,,,,,,,, +20591,1000014579,content://media/external/video/media/1000014579,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0001.mp4",video/mp4,720,1280,0,7947490,,1671936654,1671936660930,0,52825,0,0,,,,,,,,,,, +20592,1000014542,content://media/external/video/media/1000014542,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0018.mp4",video/mp4,512,640,0,16769016,,1671905903,1671905911632,0,36470,0,0,,,,,,,,,,, +20593,1000014535,content://media/external/video/media/1000014535,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0016.mp4",video/mp4,1280,720,0,20853533,,1671904115,1671904125167,0,74006,0,0,,,,,,,,,,, +20594,1000014504,content://media/external/video/media/1000014504,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0008.mp4",video/mp4,720,720,0,6235238,,1671886204,1671886210249,0,77764,0,0,,,,,,,,,,, +20595,1000014480,content://media/external/video/media/1000014480,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0001.mp4",video/mp4,480,848,0,16780560,,1671869816,1671869824546,0,87702,0,0,,,,,,,,,,, +20596,1000014476,content://media/external/video/media/1000014476,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0000.mp4",video/mp4,400,400,0,7059204,,1671869211,1671869215230,0,82709,0,0,,,,,,,,,,, +20597,1000014448,content://media/external/video/media/1000014448,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0011.mp4",video/mp4,768,768,0,7199235,,1671811977,1671811981740,0,18633,0,0,,,,,,,,,,, +20598,1000014443,content://media/external/video/media/1000014443,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0010.mp4",video/mp4,480,848,0,16910738,,1671807629,1671807636585,0,87725,0,0,,,,,,,,,,, +20599,1000014439,content://media/external/video/media/1000014439,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0009.mp4",video/mp4,640,352,90,7981047,,1671807385,1671807388678,0,29099,0,0,,,,,,,,,,, +20600,1000014407,content://media/external/video/media/1000014407,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0004.mp4",video/mp4,480,848,0,4368109,,1671783017,1671783019924,0,24033,0,0,,,,,,,,,,, +20601,1000014403,content://media/external/video/media/1000014403,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0003.mp4",video/mp4,640,480,90,50037036,,1671778755,1671778777751,0,84158,0,0,,,,,,,,,,, +20602,1000014345,content://media/external/video/media/1000014345,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221221-WA0011.mp4",video/mp4,640,352,90,65764308,,1671650799,1671652515636,0,502976,0,0,,,,,,,,,,, +20603,1000014326,content://media/external/video/media/1000014326,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221221-WA0007.mp4",video/mp4,640,352,90,4808779,,1671642416,1671642423664,0,18347,0,0,,,,,,,,,,, +20604,1000014222,content://media/external/video/media/1000014222,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221218-WA0015.mp4",video/mp4,300,170,0,311527,,1671400584,1671400585209,0,1200,0,0,,,,,,,,,,, +20605,1000014215,content://media/external/video/media/1000014215,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221218-WA0013.mp4",video/mp4,352,640,0,9079910,,1671384842,1671384847799,0,17531,0,0,,,,,,,,,,, +20606,1000014197,content://media/external/video/media/1000014197,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221218-WA0009.mp4",video/mp4,960,540,0,11621486,,1671376466,1671376472337,0,40840,0,0,,,,,,,,,,, +20607,1000014188,content://media/external/video/media/1000014188,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221218-WA0007.mp4",video/mp4,640,352,0,14812926,,1671370371,1671370377617,0,60117,0,0,,,,,,,,,,, +20608,1000014166,content://media/external/video/media/1000014166,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221218-WA0001.mp4",video/mp4,352,640,0,4967699,,1671356575,1671356577446,0,19136,0,0,,,,,,,,,,, +20609,1000014147,content://media/external/video/media/1000014147,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221217-WA0010.mp4",video/mp4,320,174,0,78148,,1671306479,1671306479810,0,2000,0,0,,,,,,,,,,, +20610,1000014120,content://media/external/video/media/1000014120,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221217-WA0004.mp4",video/mp4,640,352,90,3918882,,1671280491,1671280498133,0,15253,0,0,,,,,,,,,,, +20611,1000014054,content://media/external/video/media/1000014054,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221215-WA0001.mp4",video/mp4,480,544,0,4247367,,1671111400,1671111402255,0,30813,0,0,,,,,,,,,,, +20612,1000013850,content://media/external/video/media/1000013850,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221208-WA0022.mp4",video/mp4,640,352,90,8977481,,1670522483,1670522517247,0,33131,0,0,,,,,,,,,,, +20613,1000013843,content://media/external/video/media/1000013843,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221208-WA0020.mp4",video/mp4,624,480,0,1351783,,1670514482,1670514488886,0,9590,0,0,,,,,,,,,,, +20614,1000013787,content://media/external/video/media/1000013787,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221208-WA0009.mp4",video/mp4,640,640,0,118327,,1670457361,1670457362201,0,1124,0,0,,,,,,,,,,, +20615,1000013783,content://media/external/video/media/1000013783,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221208-WA0008.mp4",video/mp4,848,480,0,3014716,,1670455715,1670455717020,0,14164,0,0,,,,,,,,,,, +20616,1000013770,content://media/external/video/media/1000013770,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221208-WA0004.mp4",video/mp4,848,480,90,9648120,,1670455709,1670455714247,0,47717,0,0,,,,,,,,,,, +20617,1000013735,content://media/external/video/media/1000013735,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221207-WA0007.mp4",video/mp4,640,352,0,67826213,,1670424582,1670424606461,0,682219,0,0,,,,,,,,,,, +20618,1000013731,content://media/external/video/media/1000013731,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221207-WA0006.mp4",video/mp4,640,352,0,20376283,,1670424175,1670424195010,0,123627,0,0,,,,,,,,,,, +20619,1000013585,content://media/external/video/media/1000013585,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221202-WA0000.mp4",video/mp4,506,360,0,3174196,,1669995245,1669995248534,0,71471,0,0,,,,,,,,,,, +20620,1000013568,content://media/external/video/media/1000013568,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221201-WA0000.mp4",video/mp4,136,202,0,96539,,1669883811,1669883811817,0,4500,0,0,,,,,,,,,,, +20621,1000013520,content://media/external/video/media/1000013520,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221129-WA0009.mp4",video/mp4,480,320,0,4521215,,1669740748,1669740771903,0,28700,0,0,,,,,,,,,,, +20622,1000013368,content://media/external/video/media/1000013368,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221128-WA0000.mp4",video/mp4,848,480,0,30289656,,1669590876,1669590890280,0,169204,0,0,,,,,,,,,,, +20623,1000013356,content://media/external/video/media/1000013356,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221127-WA0001.mp4",video/mp4,640,352,90,3817573,,1669548716,1669548719358,0,14507,0,0,,,,,,,,,,, +20624,1000013154,content://media/external/video/media/1000013154,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221123-WA0008.mp4",video/mp4,848,480,90,2594336,,1669243935,1669243941836,0,12307,0,0,,,,,,,,,,, +20625,1000013083,content://media/external/video/media/1000013083,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221122-WA0001.mp4",video/mp4,352,640,0,8682798,,1669123240,1669123243604,0,80576,0,0,,,,,,,,,,, +20626,1000012975,content://media/external/video/media/1000012975,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221120-WA0019.mp4",video/mp4,640,352,0,2571389,,1668976606,1668976611726,0,9664,0,0,,,,,,,,,,, +20627,1000012962,content://media/external/video/media/1000012962,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221120-WA0014.mp4",video/mp4,848,480,0,5743455,,1668968676,1668968681202,0,27446,0,0,,,,,,,,,,, +20628,1000012948,content://media/external/video/media/1000012948,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221120-WA0010.mp4",video/mp4,640,352,0,6319785,,1668966878,1668966881497,0,24320,0,0,,,,,,,,,,, +20629,1000012938,content://media/external/video/media/1000012938,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221120-WA0007.mp4",video/mp4,320,212,0,91795,,1668961226,1668961226357,0,2071,0,0,,,,,,,,,,, +20630,1000012911,content://media/external/video/media/1000012911,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221120-WA0000.mp4",video/mp4,640,352,90,4089917,,1668931558,1668931563865,0,14794,0,0,,,,,,,,,,, +20631,1000012703,content://media/external/video/media/1000012703,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221115-WA0008.mp4",video/mp4,640,352,90,7442104,,1668521044,1668521047266,0,26539,0,0,,,,,,,,,,, +20632,1000012683,content://media/external/video/media/1000012683,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221115-WA0003.mp4",video/mp4,576,1024,0,1984187,,1668503045,1668503047619,0,17508,0,0,,,,,,,,,,, +20633,1000012582,content://media/external/video/media/1000012582,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221112-WA0010.mp4",video/mp4,640,304,90,5727832,,1668292429,1668292432348,0,22566,0,0,,,,,,,,,,, +20634,1000012525,content://media/external/video/media/1000012525,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221111-WA0001.mp4",video/mp4,224,168,0,129058,,1668166061,1668166061746,0,3000,0,0,,,,,,,,,,, +20635,1000012304,content://media/external/video/media/1000012304,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221105-WA0003.mp4",video/mp4,640,352,0,5288928,,1667643905,1667643915061,0,29845,0,0,,,,,,,,,,, +20636,1000012247,content://media/external/video/media/1000012247,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221104-WA0002.mp4",video/mp4,848,480,0,10460352,,1667550236,1667550241753,0,51804,0,0,,,,,,,,,,, +20637,1000012188,content://media/external/video/media/1000012188,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0010.mp4",video/mp4,640,352,0,14339435,,1667427665,1667427673698,0,68651,0,0,,,,,,,,,,, +20638,1000012153,content://media/external/video/media/1000012153,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0007.mp4",video/mp4,1920,1080,0,59296731,,1667379194,1667406562737,0,9963,0,0,,,,,,,,,,, +20639,1000012175,content://media/external/video/media/1000012175,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0005.mp4",video/mp4,640,352,90,23362952,,1667392322,1667392337162,0,105088,0,0,,,,,,,,,,, +20640,1000012165,content://media/external/video/media/1000012165,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0002.mp4",video/mp4,640,352,90,15177537,,1667389216,1667389223313,0,62891,0,0,,,,,,,,,,, +20641,1000012161,content://media/external/video/media/1000012161,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0001.mp4",video/mp4,640,352,90,8518757,,1667389198,1667389208416,0,33365,0,0,,,,,,,,,,, +20642,1000012105,content://media/external/video/media/1000012105,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221031-WA0035.mp4",video/mp4,640,352,270,3296961,,1667255619,1667255632372,0,11584,0,0,,,,,,,,,,, +20643,1000012022,content://media/external/video/media/1000012022,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221031-WA0007.mp4",video/mp4,224,224,0,113433,,1667218074,1667218074795,0,5702,0,0,,,,,,,,,,, +20644,1000011945,content://media/external/video/media/1000011945,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221030-WA0003.mp4",video/mp4,288,640,0,315928,,1667128961,1667128962036,0,2322,0,0,,,,,,,,,,, +20645,1000011949,content://media/external/video/media/1000011949,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221030-WA0004.mp4",video/mp4,288,640,0,1879220,,1667128962,1667128962930,0,16858,0,0,,,,,,,,,,, +20646,1000011941,content://media/external/video/media/1000011941,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221030-WA0002.mp4",video/mp4,288,640,0,2451721,,1667128959,1667128961650,0,22616,0,0,,,,,,,,,,, +20647,1000011840,content://media/external/video/media/1000011840,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0012.mp4",video/mp4,480,848,90,35198500,,1667004164,1667004180867,0,94505,0,0,,,,,,,,,,, +20648,1000011830,content://media/external/video/media/1000011830,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0011.mp4",video/mp4,848,480,0,37531175,,1667000645,1667002731914,0,217803,0,0,,,,,,,,,,, +20649,1000011826,content://media/external/video/media/1000011826,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0010.mp4",video/mp4,848,480,0,44480593,,1667000583,1667002718542,0,266077,0,0,,,,,,,,,,, +20650,1000011819,content://media/external/video/media/1000011819,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0008.mp4",video/mp4,848,480,0,13299498,,1667000432,1667000439228,0,66990,0,0,,,,,,,,,,, +20651,1000011806,content://media/external/video/media/1000011806,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0004.mp4",video/mp4,848,480,0,5632931,,1667000357,1667000361627,0,27051,0,0,,,,,,,,,,, +20652,1000011793,content://media/external/video/media/1000011793,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0000.mp4",video/mp4,848,480,90,2196126,,1667000322,1667000323825,0,10310,0,0,,,,,,,,,,, +20653,1000011562,content://media/external/video/media/1000011562,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221025-WA0005.mp4",video/mp4,640,352,90,1392891,,1666691434,1666691435397,0,4651,0,0,,,,,,,,,,, +20654,1000011179,content://media/external/video/media/1000011179,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221021-WA0001.mp4",video/mp4,150,150,0,32839,,1666372039,1666372039963,0,640,0,0,,,,,,,,,,, +20655,1000011065,content://media/external/video/media/1000011065,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221020-WA0004.mp4",video/mp4,432,240,0,5035580,,1666260391,1666260394544,0,87400,0,0,,,,,,,,,,, +20656,1000011031,content://media/external/video/media/1000011031,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221019-WA0008.mp4",video/mp4,848,480,0,26833118,,1666213862,1666213877520,0,146820,0,0,,,,,,,,,,, +20657,1000010944,content://media/external/video/media/1000010944,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221017-WA0008.mp4",video/mp4,640,352,0,10036617,,1666029205,1666029207909,0,19221,0,0,,,,,,,,,,, +20658,1000010940,content://media/external/video/media/1000010940,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221017-WA0007.mp4",video/mp4,640,352,0,18053710,,1666029200,1666029205012,0,35648,0,0,,,,,,,,,,, +20659,1000010894,content://media/external/video/media/1000010894,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221016-WA0015.mp4",video/mp4,640,352,90,8681455,,1665929156,1665929179151,0,30720,0,0,,,,,,,,,,, +20660,1000010822,content://media/external/video/media/1000010822,"/storage/emulated/0/Download/Patate in padella.mp4",video/mp4,720,1280,0,5704055,,1665848946,1665848853124,0,20782,0,0,,,,,,,,,,, +20661,1000010771,content://media/external/video/media/1000010771,/storage/emulated/0/DCIM/Camera/20221014_190106_201.mp4,video/mp4,1440,2560,0,392447466,,1665766997,1665766997000,0,38229,0,0,,,,,,,,,,, +20662,1000010770,content://media/external/video/media/1000010770,/storage/emulated/0/DCIM/Camera/20221014_185904_770.mp4,video/mp4,2560,1440,0,320517278,,1665766865,1665766865000,0,31296,0,0,,,,,,,,,,, +20663,1000010767,content://media/external/video/media/1000010767,/storage/emulated/0/DCIM/Camera/20221014_185348_840.mp4,video/mp4,1920,1080,0,40783880,,1665766429,1665766430448,0,12693,0,0,,,,,,,,,,, +20664,1000010125,content://media/external/video/media/1000010125,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221007-WA0021.mp4",video/mp4,640,352,0,20225149,,1665145116,1665145124250,0,87936,0,0,,,,,,,,,,, +20665,1000009934,content://media/external/video/media/1000009934,/storage/emulated/0/DCIM/Camera/VID_20221005_230418.mp4,video/mp4,1920,1080,0,51489574,,1665003858,1665003884893,1665003884000,24049,0,0,,,,,,,,,,, +20666,1000009933,content://media/external/video/media/1000009933,/storage/emulated/0/DCIM/Camera/VID_20221005_230236.mp4,video/mp4,1920,1080,0,189422128,,1665003756,1665003857365,1665003856000,98240,0,0,,,,,,,,,,, +20667,1000009643,content://media/external/video/media/1000009643,/storage/emulated/0/Pictures/WeChat/wx_camera_1664620972115.mp4,video/mp4,576,1280,0,1729347,,1664620972,1664620972193,0,5621,0,0,,,,,,,,,,, +20668,1000009546,content://media/external/video/media/1000009546,/storage/emulated/0/DCIM/Camera/20220930_214936_763.mp4,video/mp4,1920,1080,0,32824807,,1664567377,1664567378004,0,8619,0,0,,,,,,,,,,, +20669,1000009540,content://media/external/video/media/1000009540,/storage/emulated/0/DCIM/Camera/20220930_202158_698.mp4,video/mp4,1920,1080,0,104188103,,1664562240,1664562240000,0,26027,0,0,,,,,,,,,,, +20670,1000009539,content://media/external/video/media/1000009539,/storage/emulated/0/DCIM/Camera/20220930_201703_531.mp4,video/mp4,1920,1080,0,57609067,,1664561860,1664561860000,0,14101,0,0,,,,,,,,,,, +20671,1000009535,content://media/external/video/media/1000009535,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220930-WA0003.mp4",video/mp4,320,178,0,38511,,1664552748,1664552748753,0,750,0,0,,,,,,,,,,, +20672,1000009495,content://media/external/video/media/1000009495,/storage/emulated/0/DCIM/Camera/20220930_105805_646.mp4,video/mp4,1920,1080,0,383938540,,1664528937,1664528937000,0,116456,0,0,,,,,,,,,,, +20673,1000009494,content://media/external/video/media/1000009494,/storage/emulated/0/DCIM/Camera/20220930_095757_388.mp4,video/mp4,1920,1080,0,472286429,,1664525356,1664525356000,0,145695,0,0,,,,,,,,,,, +20674,1000009427,content://media/external/video/media/1000009427,/storage/emulated/0/DCIM/Camera/VID_20220928_230030.mp4,video/mp4,1920,1080,0,144085539,,1664398830,1664398910954,1664398910000,78685,0,0,,,,,,,,,,, +20675,1000009165,content://media/external/video/media/1000009165,/storage/emulated/0/DCIM/Camera/20220928_200243_281.mp4,video/mp4,1920,1080,0,35845075,,1664388163,1664388164630,0,10600,0,0,,,,,,,,,,, +20676,1000009164,content://media/external/video/media/1000009164,/storage/emulated/0/DCIM/Camera/20220928_200047_268.mp4,video/mp4,1920,1080,0,36040723,,1664388048,1664388048900,0,10600,0,0,,,,,,,,,,, +20677,1000009051,content://media/external/video/media/1000009051,/storage/emulated/0/DCIM/Camera/VID_20220927_103815(0).mp4,video/mp4,1920,1080,0,26334711,,1664268022,1664268022000,1664268022000,12400,0,0,,,,,,,,,,, +20678,1000008548,content://media/external/video/media/1000008548,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220919-WA0002.mp4",video/mp4,640,352,90,45530393,,1663579867,1663579901141,0,284792,0,0,,,,,,,,,,, +20679,63556,content://media/external/video/media/63556,/storage/emulated/0/DCIM/undefined_1657865629721.mp4,video/mp4,960,540,0,14526678,,1657865677,1657865677203,0,50873,0,0,,,,,,,,,,, +20680,63264,content://media/external/video/media/63264,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220710-WA0020.mp4",video/mp4,640,352,90,25768789,,1657438046,1657438058289,0,90901,0,0,,,,,,,,,,, +20681,63134,content://media/external/video/media/63134,"/storage/emulated/0/Video/FOCACCIA MILLE BOLLE croccante fuori e soffice dentro SENZA SPORCARSI LE MANI_Full-HD.mp4",video/mp4,1920,1080,0,150882716,,1657270285,1657270312762,0,610151,0,0,,,,,,,,,,, +20682,62771,content://media/external/video/media/62771,/storage/emulated/0/DCIM/efa55a1cf611be98b21071c4a607f117_bryton_1656698122494.mp4,video/mp4,960,540,0,12450612,,1656698223,1656698223831,0,38373,0,0,,,,,,,,,,, +20683,62596,content://media/external/video/media/62596,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220628-WA0000.mp4",video/mp4,848,480,0,9376728,,1656406561,1656406568439,0,52273,0,0,,,,,,,,,,, +20684,62411,content://media/external/video/media/62411,/storage/emulated/0/DCIM/0781365561-7757512607_amazfit_1656190184806.mp4,video/mp4,960,540,0,9424634,,1656190271,1656190271662,0,56040,0,0,,,,,,,,,,, +20685,62409,content://media/external/video/media/62409,/storage/emulated/0/DCIM/2918695561-7757512607_amazfit_1656189786615.mp4,video/mp4,960,540,0,13184066,,1656189873,1656189873674,0,63673,0,0,,,,,,,,,,, +20686,62291,content://media/external/video/media/62291,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220624-WA0020.mp4",video/mp4,640,352,90,5080243,,1656088472,1656088480283,0,17094,0,0,,,,,,,,,,, +20687,62287,content://media/external/video/media/62287,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220624-WA0019.mp4",video/mp4,640,352,90,17846429,,1656088456,1656088466213,0,61312,0,0,,,,,,,,,,, +20688,62276,content://media/external/video/media/62276,/storage/emulated/0/DCIM/GoPro-Exports/GX010705_1656082665580.MP4,video/mp4,3840,2160,0,72056988,,1656082922,1656082923141,1656082556000,9460,0,0,,,,,,,,,,, +20689,62249,content://media/external/video/media/62249,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220624-WA0009.mp4",video/mp4,640,352,90,4710941,,1656080018,1656080023857,0,17161,0,0,,,,,,,,,,, +20690,62150,content://media/external/video/media/62150,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Video/VID-20220623-WA0026.mp4",video/mp4,640,352,90,2436282,,1655998713,1656001671280,0,12331,0,0,,,,,,,,,,, +20691,61988,content://media/external/video/media/61988,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220623-WA0000.mp4",video/mp4,848,480,180,36244499,,1655938437,1655963079240,0,209049,0,0,,,,,,,,,,, +20692,61971,content://media/external/video/media/61971,/storage/emulated/0/DCIM/GoPro-Exports/GH010595_1655894512765.MP4,video/mp4,1920,1080,0,1332932426,,1655894664,1655894672559,1655894108000,235460,0,0,,,,,,,,,,, +20693,61970,content://media/external/video/media/61970,/storage/emulated/0/DCIM/GoPro-Exports/GH010594_1655894052790.MP4,video/mp4,1920,1080,0,612270541,,1655894461,1655894464783,1655893848000,108080,0,0,,,,,,,,,,, +20694,61855,content://media/external/video/media/61855,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220621-WA0005.mp4",video/mp4,640,352,0,8197836,,1655823424,1655823427253,0,25515,0,0,,,,,,,,,,, +20695,61851,content://media/external/video/media/61851,/storage/emulated/0/DCIM/GoPro-Exports/GH010590_1655822870693.MP4,video/mp4,1920,1080,0,357905634,,1655822926,1655822929094,1655803018000,63160,0,0,,,,,,,,,,, +20696,61852,content://media/external/video/media/61852,/storage/emulated/0/DCIM/GoPro-Exports/GH010589_1655822870693.MP4,video/mp4,1920,1080,0,48888934,,1655822929,1655822929562,1655800068000,8520,0,0,,,,,,,,,,, +20697,61784,content://media/external/video/media/61784,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220620-WA0008.mp4",video/mp4,640,352,0,13124230,,1655721301,1655721307755,0,42219,0,0,,,,,,,,,,, +20698,61686,content://media/external/video/media/61686,/storage/emulated/0/DCIM/GoPro-Exports/GH010581_1655643416125.MP4,video/mp4,1920,1080,0,445231224,,1655643475,1655643478826,1655469406000,78600,0,0,,,,,,,,,,, +20699,61286,content://media/external/video/media/61286,/storage/emulated/0/DCIM/GoPro-Exports/_.mp4,video/mp4,1920,1080,0,699524818,,1655469626,1655469631114,1655468862000,233320,0,0,,,,,,,,,,, +20700,61222,content://media/external/video/media/61222,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220616-WA0005.mp4",video/mp4,640,352,0,6199063,,1655384557,1655384570151,0,21504,0,0,,,,,,,,,,, +20701,61202,content://media/external/video/media/61202,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220616-WA0001.mp4",video/mp4,848,480,90,54533403,,1655334164,1655334376958,0,335877,0,0,,,,,,,,,,, +20702,61198,content://media/external/video/media/61198,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220616-WA0000.mp4",video/mp4,640,352,0,50831870,,1655330206,1655334354988,0,388736,0,0,,,,,,,,,,, +20703,60891,content://media/external/video/media/60891,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220615-WA0017.mp4",video/mp4,480,624,0,2700965,,1655303586,1655303588381,0,42771,0,0,,,,,,,,,,, +20704,60890,content://media/external/video/media/60890,/storage/emulated/0/Download/InsMate/post_10000000_890310339038306_5110097143848137540_n.mp4,video/mp4,720,406,0,39495749,,1655299976,1655299979902,0,501621,0,0,,,,,,,,,,, +20705,60678,content://media/external/video/media/60678,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220614-WA0016.mp4",video/mp4,640,352,0,4770165,,1655227626,1655227629995,0,19243,0,0,,,,,,,,,,, +20706,60671,content://media/external/video/media/60671,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220614-WA0014.mp4",video/mp4,848,480,90,5948513,,1655220389,1655220392365,0,28607,0,0,,,,,,,,,,, +20707,60646,content://media/external/video/media/60646,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220614-WA0004.mp4",video/mp4,1920,1088,0,11897229,,1655203243,1655203250751,0,204778,0,0,,,,,,,,,,, +20708,60621,content://media/external/video/media/60621,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0063.mp4",video/mp4,848,480,90,6499169,,1655157053,1655157058024,0,31393,0,0,,,,,,,,,,, +20709,60617,content://media/external/video/media/60617,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0062.mp4",video/mp4,848,480,90,4230408,,1655157037,1655157038685,0,20132,0,0,,,,,,,,,,, +20710,60613,content://media/external/video/media/60613,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0061.mp4",video/mp4,848,480,90,7090968,,1655157024,1655157026763,0,34342,0,0,,,,,,,,,,, +20711,60609,content://media/external/video/media/60609,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0060.mp4",video/mp4,640,352,0,29489746,,1655156976,1655156992718,0,163947,0,0,,,,,,,,,,, +20712,60602,content://media/external/video/media/60602,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0059.mp4",video/mp4,848,480,0,14111459,,1655148115,1655148121356,0,71239,0,0,,,,,,,,,,, +20713,60526,content://media/external/video/media/60526,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0052.mp4",video/mp4,640,352,90,40862448,,1655125415,1655134349526,0,198525,0,0,,,,,,,,,,, +20714,60558,content://media/external/video/media/60558,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0051.mp4",video/mp4,640,352,90,42250389,,1655125470,1655134331572,0,208999,0,0,,,,,,,,,,, +20715,60578,content://media/external/video/media/60578,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220613-WA0050.mp4",video/mp4,224,320,0,119296,,1655133467,1655133467688,0,6002,0,0,,,,,,,,,,, +20716,60562,content://media/external/video/media/60562,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0045.mp4",video/mp4,640,352,90,394734,,1655125470,1655125471045,0,1388,0,0,,,,,,,,,,, +20717,60554,content://media/external/video/media/60554,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0044.mp4",video/mp4,640,352,90,17761433,,1655125461,1655125469995,0,68650,0,0,,,,,,,,,,, +20718,60550,content://media/external/video/media/60550,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0043.mp4",video/mp4,640,352,90,19786633,,1655125453,1655125461152,0,77695,0,0,,,,,,,,,,, +20719,60546,content://media/external/video/media/60546,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0042.mp4",video/mp4,640,352,90,5970320,,1655125450,1655125453066,0,21161,0,0,,,,,,,,,,, +20720,60542,content://media/external/video/media/60542,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0041.mp4",video/mp4,640,352,90,18981894,,1655125439,1655125450166,0,73940,0,0,,,,,,,,,,, +20721,60538,content://media/external/video/media/60538,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0040.mp4",video/mp4,640,352,90,9994064,,1655125435,1655125439829,0,36543,0,0,,,,,,,,,,, +20722,60534,content://media/external/video/media/60534,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0039.mp4",video/mp4,640,352,90,26646582,,1655125424,1655125435506,0,110889,0,0,,,,,,,,,,, +20723,60530,content://media/external/video/media/60530,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0038.mp4",video/mp4,640,352,90,21504320,,1655125415,1655125424588,0,85652,0,0,,,,,,,,,,, +20724,60516,content://media/external/video/media/60516,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0035.mp4",video/mp4,640,352,90,9085201,,1655125410,1655125414596,0,32917,0,0,,,,,,,,,,, +20725,60512,content://media/external/video/media/60512,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0034.mp4",video/mp4,640,352,90,5799775,,1655125408,1655125410360,0,20462,0,0,,,,,,,,,,, +20726,60508,content://media/external/video/media/60508,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0033.mp4",video/mp4,640,352,90,25643842,,1655125396,1655125408050,0,105748,0,0,,,,,,,,,,, +20727,60489,content://media/external/video/media/60489,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0027.mp4",video/mp4,640,352,90,24299110,,1655125385,1655125394539,0,99075,0,0,,,,,,,,,,, +20728,60455,content://media/external/video/media/60455,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0016.mp4",video/mp4,640,352,90,1878624,,1655125380,1655125381671,0,6528,0,0,,,,,,,,,,, +20729,60439,content://media/external/video/media/60439,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0011.mp4",video/mp4,640,352,90,26667364,,1655125368,1655125378636,0,111017,0,0,,,,,,,,,,, +20730,60399,content://media/external/video/media/60399,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0006.mp4",video/mp4,480,848,0,5098569,,1655075299,1655103979534,0,24288,0,0,,,,,,,,,,, +20731,60407,content://media/external/video/media/60407,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0005.mp4",video/mp4,480,848,0,11911492,,1655075266,1655103956430,0,59606,0,0,,,,,,,,,,, +20732,60409,content://media/external/video/media/60409,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0001.mp4",video/mp4,640,368,0,20269781,,1655075234,1655098586801,0,320528,0,0,,,,,,,,,,, +20733,60378,content://media/external/video/media/60378,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220612-WA0003.mp4",video/mp4,640,352,0,37937396,,1655041200,1655041229685,0,187967,0,0,,,,,,,,,,, +20734,60277,content://media/external/video/media/60277,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220611-WA0000.mp4",video/mp4,640,352,0,54301319,,1654898674,1654898699618,0,301080,0,0,,,,,,,,,,, +20735,60215,content://media/external/video/media/60215,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220610-WA0013.mp4",video/mp4,1072,1920,0,4766223,,1654853702,1654853708998,1654853708000,5163,0,0,,,,,,,,,,, +20736,60169,content://media/external/video/media/60169,/storage/emulated/0/DCIM/GoPro-Exports/Nueva_Pandilla.mp4,video/mp4,1920,1080,0,65765636,,1654798356,1654798357099,1654797415000,33878,0,0,,,,,,,,,,, +20737,60165,content://media/external/video/media/60165,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220609-WA0045.mp4",video/mp4,640,352,0,45651704,,1654794971,1654794995133,0,255096,0,0,,,,,,,,,,, +20738,60033,content://media/external/video/media/60033,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220609-WA0001.mp4",video/mp4,160,118,0,50698,,1654754803,1654754803891,0,2460,0,0,,,,,,,,,,, +20739,60021,content://media/external/video/media/60021,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220609-WA0000.mp4",video/mp4,848,480,90,6839153,,1654725685,1654725688719,0,33112,0,0,,,,,,,,,,, +20740,60017,content://media/external/video/media/60017,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220608-WA0017.mp4",video/mp4,640,352,0,16802128,,1654724292,1654724360220,0,110464,0,0,,,,,,,,,,, +20741,60013,content://media/external/video/media/60013,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220608-WA0016.mp4",video/mp4,848,480,90,16643326,,1654724251,1654724261640,0,85658,0,0,,,,,,,,,,, +20742,59912,content://media/external/video/media/59912,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220607-WA0019.mp4",video/mp4,640,352,0,28390608,,1654626091,1654626105755,0,151920,0,0,,,,,,,,,,, +20743,59886,content://media/external/video/media/59886,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220607-WA0016.mp4",video/mp4,640,352,0,19827445,,1654615264,1654615272837,0,91960,0,0,,,,,,,,,,, +20744,59828,content://media/external/video/media/59828,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220606-WA0025.mp4",video/mp4,848,480,90,15050745,,1654551818,1654551825021,0,76858,0,0,,,,,,,,,,, +20745,59824,content://media/external/video/media/59824,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220606-WA0024.mp4",video/mp4,848,480,90,10811439,,1654551790,1654551795563,0,53731,0,0,,,,,,,,,,, +20746,59820,content://media/external/video/media/59820,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220606-WA0023.mp4",video/mp4,640,352,0,27596274,,1654551248,1654551262028,0,156885,0,0,,,,,,,,,,, +20747,59433,content://media/external/video/media/59433,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0011.mp4",video/mp4,848,480,270,1147568,,1654171767,1654171769623,0,5364,0,0,,,,,,,,,,, +20748,48594,content://media/external/video/media/48594,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0005.mp4",video/mp4,848,480,90,17751141,,1654121056,1654121063934,0,92021,0,0,,,,,,,,,,, +20749,48590,content://media/external/video/media/48590,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0004.mp4",video/mp4,848,480,90,10176412,,1654120923,1654120926518,0,50341,0,0,,,,,,,,,,, +20750,48586,content://media/external/video/media/48586,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0003.mp4",video/mp4,848,480,90,11722101,,1654120900,1654120905193,0,58468,0,0,,,,,,,,,,, +20751,48582,content://media/external/video/media/48582,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0002.mp4",video/mp4,848,480,90,12642494,,1654120878,1654120882755,0,63437,0,0,,,,,,,,,,, +20752,48578,content://media/external/video/media/48578,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0001.mp4",video/mp4,848,480,90,6059078,,1654120842,1654120844673,0,29141,0,0,,,,,,,,,,, +20753,48574,content://media/external/video/media/48574,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0000.mp4",video/mp4,848,480,90,29003659,,1654120831,1654120842177,0,161170,0,0,,,,,,,,,,, +20754,47954,content://media/external/video/media/47954,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220525-WA0010.mp4",video/mp4,848,480,90,6064636,,1653515015,1653515020254,0,29141,0,0,,,,,,,,,,, +20755,47950,content://media/external/video/media/47950,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220525-WA0009.mp4",video/mp4,848,480,90,29005489,,1653514973,1653514988430,0,161170,0,0,,,,,,,,,,, +20756,47677,content://media/external/video/media/47677,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220522-WA0000.mp4",video/mp4,848,480,180,31166200,,1653174586,1653174602936,0,177842,0,0,,,,,,,,,,, +20757,47670,content://media/external/video/media/47670,/storage/emulated/0/DCIM/Creative/Screenrecorder-2022-05-21-16-15-35-278(0).mp4,video/mp4,1080,2400,0,24975077,,1653142687,1653142687000,1653142687000,9767,0,0,,,,,,,,,,, +20758,47669,content://media/external/video/media/47669,/storage/emulated/0/DCIM/ScreenRecorder/Screenrecorder-2022-05-21-16-15-35-278.mp4,video/mp4,1080,2400,0,11824973,,1653142535,1653142562543,1653142562000,26211,0,0,,,,,,,,,,, +20759,47666,content://media/external/video/media/47666,/storage/emulated/0/DCIM/Camera/VID_20220521_160634.mp4,video/mp4,1920,1080,0,11765707,,1653141994,1653142001759,1653142000000,3712,0,0,,,,,,,,,,, +20760,47665,content://media/external/video/media/47665,/storage/emulated/0/Movies/Whatsapp/VID-20220521-WA0017.mp4,video/mp4,640,352,0,5297470,,1653141772,1653141772764,0,28887,0,0,,,,,,,,,,, +20761,47577,content://media/external/video/media/47577,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220520-WA0013.mp4",video/mp4,848,480,180,54345018,,1653056822,1653062510342,0,334042,0,0,,,,,,,,,,, +20762,47567,content://media/external/video/media/47567,/storage/emulated/0/DCIM/Camera/VID_20220520_144059.mp4,video/mp4,1920,1080,0,90860657,,1653050459,1653050500479,1653050499000,37888,0,0,,,,,,,,,,, +20763,47556,content://media/external/video/media/47556,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220520-WA0008.mp4",video/mp4,240,432,0,901306,,1653048483,1653048485839,0,15000,0,0,,,,,,,,,,, +20764,47504,content://media/external/video/media/47504,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220519-WA0020.mp4",video/mp4,640,288,0,5867035,,1652982716,1652982720605,0,29648,0,0,,,,,,,,,,, +20765,47491,content://media/external/video/media/47491,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220519-WA0019.mp4",video/mp4,200,200,0,53668,,1652976148,1652976148672,0,1200,0,0,,,,,,,,,,, +20766,47487,content://media/external/video/media/47487,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220519-WA0018.mp4",video/mp4,132,154,0,209755,,1652973859,1652973859696,0,4920,0,0,,,,,,,,,,, +20767,47476,content://media/external/video/media/47476,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220519-WA0013.mp4",video/mp4,352,640,0,3359134,,1652959437,1652959439688,0,12736,0,0,,,,,,,,,,, +20768,47433,content://media/external/video/media/47433,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220519-WA0001.mp4",video/mp4,254,254,0,183028,,1652938883,1652938915133,0,3375,0,0,,,,,,,,,,, +20769,47389,content://media/external/video/media/47389,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220518-WA0033.mp4",video/mp4,848,480,0,5508993,,1652881874,1652881876560,0,26424,0,0,,,,,,,,,,, +20770,47356,content://media/external/video/media/47356,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220518-WA0022.mp4",video/mp4,848,480,0,13486098,,1652873603,1652873611894,0,31486,0,0,,,,,,,,,,, +20771,47347,content://media/external/video/media/47347,/storage/emulated/0/DCIM/Camera/VID_20220518_133018.mp4,video/mp4,1920,1080,0,78032917,,1652873418,1652873448373,1652873447000,27546,0,0,,,,,,,,,,, +20772,47344,content://media/external/video/media/47344,/storage/emulated/0/DCIM/Camera/VID_20220518_132554.mp4,video/mp4,1920,1080,90,30039358,,1652873154,1652873170772,1652873170000,13845,0,0,,,,,,,,,,, +20773,47217,content://media/external/video/media/47217,/storage/emulated/0/Movies/Whatsapp/VID-20220505-WA0014(1).mp4,video/mp4,640,352,0,11186336,,1652718212,1652718212298,0,67456,0,0,,,,,,,,,,, +20774,47216,content://media/external/video/media/47216,/storage/emulated/0/Movies/Whatsapp/VID-20220505-WA0013(1).mp4,video/mp4,640,352,0,14849659,,1652718207,1652718207954,0,105387,0,0,,,,,,,,,,, +20775,46941,content://media/external/video/media/46941,/storage/emulated/0/Movies/Whatsapp/VID-20220505-WA0013.mp4,video/mp4,640,352,0,14849659,,1652290593,1652290593320,0,105387,0,0,,,,,,,,,,, +20776,46940,content://media/external/video/media/46940,/storage/emulated/0/Movies/Whatsapp/VID-20220505-WA0014.mp4,video/mp4,640,352,0,11186336,,1652290586,1652290586592,0,67456,0,0,,,,,,,,,,, +20777,46755,content://media/external/video/media/46755,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220509-WA0002.mp4",video/mp4,640,352,90,7518305,,1652078792,1652078795514,0,40704,0,0,,,,,,,,,,, +20778,46734,content://media/external/video/media/46734,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220508-WA0014.mp4",video/mp4,640,352,0,32364202,,1652016550,1652016559908,0,167659,0,0,,,,,,,,,,, +20779,46349,content://media/external/video/media/46349,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220508-WA0006.mp4",video/mp4,640,352,90,28943269,,1651996989,1651997013342,0,169472,0,0,,,,,,,,,,, +20780,46342,content://media/external/video/media/46342,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220508-WA0005.mp4",video/mp4,480,480,0,88387,,1651996475,1651996476452,0,640,0,0,,,,,,,,,,, +20781,46336,content://media/external/video/media/46336,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220508-WA0003.mp4",video/mp4,224,160,0,25557,,1651994543,1651994544184,0,909,0,0,,,,,,,,,,, +20782,46319,content://media/external/video/media/46319,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220508-WA0001.mp4",video/mp4,640,352,90,33287842,,1651960963,1651989410193,0,169493,0,0,,,,,,,,,,, +20783,46318,content://media/external/video/media/46318,/storage/emulated/0/DCIM/Camera/VID_20220507_230925.mp4,video/mp4,1920,1080,0,449837489,,1651957765,1651957960904,1651957960000,193493,0,0,,,,,,,,,,, +20784,45604,content://media/external/video/media/45604,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220505-WA0014.mp4",video/mp4,640,352,0,11186336,,1651748476,1651748488324,0,67456,0,0,,,,,,,,,,, +20785,45600,content://media/external/video/media/45600,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220505-WA0013.mp4",video/mp4,640,352,0,14849659,,1651748450,1651748476466,0,105387,0,0,,,,,,,,,,, +20786,44318,content://media/external/video/media/44318,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220428-WA0033.mp4",video/mp4,640,352,90,806621,,1651151448,1651151449921,0,2938,0,0,,,,,,,,,,, +20787,44260,content://media/external/video/media/44260,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220428-WA0014.mp4",video/mp4,848,480,90,4529890,,1651134551,1651134554457,0,21432,0,0,,,,,,,,,,, +20788,44196,content://media/external/video/media/44196,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220427-WA0010.mp4",video/mp4,576,1024,0,2996481,,1651082732,1651082735345,0,52497,0,0,,,,,,,,,,, +20789,44023,content://media/external/video/media/44023,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220424-WA0017.mp4",video/mp4,640,352,90,736870,,1650824652,1650824653449,0,3200,0,0,,,,,,,,,,, +20790,43840,content://media/external/video/media/43840,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220421-WA0002.mp4",video/mp4,848,480,0,1191479,,1650496249,1650496250578,0,5433,0,0,,,,,,,,,,, +20791,43713,content://media/external/video/media/43713,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220417-WA0046.mp4",video/mp4,640,352,90,5931999,,1650194259,1650194365221,0,22891,0,0,,,,,,,,,,, +20792,37425,content://media/external/video/media/37425,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220414-WA0000.mp4",video/mp4,640,352,90,25909873,,1649914050,1649915802395,0,135915,0,0,,,,,,,,,,, +20793,37215,content://media/external/video/media/37215,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220411-WA0001.mp4",video/mp4,640,352,0,33570661,,1649630122,1649630274588,0,171477,0,0,,,,,,,,,,, +20794,37206,content://media/external/video/media/37206,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220411-WA0000.mp4",video/mp4,640,352,90,33740138,,1649626839,1649629017891,0,173013,0,0,,,,,,,,,,, +20795,37202,content://media/external/video/media/37202,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220410-WA0006.mp4",video/mp4,848,480,0,34303348,,1649625628,1649625748844,0,196046,0,0,,,,,,,,,,, +20796,37086,content://media/external/video/media/37086,"/storage/emulated/0/Download/COLOMBA INTRECCIATA VELOCE ricetta Pasquale casalinga Colomba in versione casalinga intrecciata, senza...fs#colomba #brioche #ricetta #colombaveloce uvetta #canditi #Pasqua #tuttiatavola2016 #cooking #easyrecipe #italiancolomba.mp4",video/mp4,1280,720,0,77934395,,1649572035,1649572089397,0,634648,0,0,,,,,,,,,,, +20797,37049,content://media/external/video/media/37049,/storage/emulated/0/DCIM/Camera/63b3c20783ec3a17847e88fea8a8d286.mp4,video/mp4,576,1024,0,4770940,,1649449221,1649449221391,0,26167,0,0,,,,,,,,,,, +20798,36693,content://media/external/video/media/36693,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220329-WA0004.mp4",video/mp4,352,640,0,6529876,,1648556770,1648556782052,0,12493,0,0,,,,,,,,,,, +20799,35824,content://media/external/video/media/35824,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220313-WA0026.mp4",video/mp4,352,640,0,5096514,,1647197438,1647197442679,0,19093,0,0,,,,,,,,,,, +20800,35524,content://media/external/video/media/35524,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220310-WA0000.mp4",video/mp4,640,352,90,9513514,,1646867229,1646867252274,0,37845,0,0,,,,,,,,,,, +20801,34863,content://media/external/video/media/34863,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220227-WA0002.mp4",video/mp4,640,352,90,2161415,,1645954337,1645954339746,0,21397,0,0,,,,,,,,,,, +20802,34707,content://media/external/video/media/34707,/storage/emulated/0/DCIM/Camera/VID_20220223_165136.mp4,video/mp4,1920,1080,0,74115708,,1645631524,1645631524752,1645631524000,25621,0,0,,,,,,,,,,, +20803,34706,content://media/external/video/media/34706,/storage/emulated/0/DCIM/Camera/VID_20220223_164845.mp4,video/mp4,1920,1080,90,175304025,,1645631395,1645631396226,1645631395000,67834,0,0,,,,,,,,,,, +20804,33978,content://media/external/video/media/33978,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220217-WA0001.mp4",video/mp4,848,480,90,7351058,,1645052407,1645052412015,0,35759,0,0,,,,,,,,,,, +20805,33974,content://media/external/video/media/33974,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220217-WA0000.mp4",video/mp4,848,480,90,7309756,,1645052402,1645052407025,0,35550,0,0,,,,,,,,,,, +20806,33402,content://media/external/video/media/33402,/storage/emulated/0/DCIM/Camera/VID_20220212_144114.mp4,video/mp4,1920,1080,0,147489200,,1644673334,1644673334912,1644673334000,57899,0,0,,,,,,,,,,, +20807,32793,content://media/external/video/media/32793,"/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Video/VID-20220204-WA0005.mp4",video/mp4,640,352,90,29643950,,1643988560,1643988581524,0,143531,0,0,,,,,,,,,,, +20808,32044,content://media/external/video/media/32044,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220130-WA0027.mp4",video/mp4,848,480,90,23854372,,1643575629,1643575645621,0,127710,0,0,,,,,,,,,,, +20809,31731,content://media/external/video/media/31731,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220126-WA0015.mp4",video/mp4,848,480,90,3224112,,1643234218,1643234222389,0,15232,0,0,,,,,,,,,,, +20810,31727,content://media/external/video/media/31727,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220126-WA0014.mp4",video/mp4,848,480,90,1151178,,1643234217,1643234218307,0,5341,0,0,,,,,,,,,,, +20811,31723,content://media/external/video/media/31723,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220126-WA0013.mp4",video/mp4,848,480,90,4303089,,1643234211,1643234217156,0,20573,0,0,,,,,,,,,,, +20812,31719,content://media/external/video/media/31719,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220126-WA0012.mp4",video/mp4,848,480,90,4941683,,1643234207,1643234211183,0,23754,0,0,,,,,,,,,,, +20813,20912,content://media/external/video/media/20912,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20211219-WA0018.mp4",video/mp4,848,480,90,21532308,,1639935188,1639935200406,0,113267,0,0,,,,,,,,,,, +20814,20898,content://media/external/video/media/20898,/storage/emulated/0/DCIM/Camera/VID_20211219_160629.mp4,video/mp4,1920,1080,90,103475850,,1639926430,1639926430385,1639926429000,39275,0,0,,,,,,,,,,, +20815,20891,content://media/external/video/media/20891,/storage/emulated/0/DCIM/Camera/VID_20211219_160257.mp4,video/mp4,1920,1080,90,6748750,,1639926182,1639926183052,1639926182000,1799,0,0,,,,,,,,,,, +20816,20890,content://media/external/video/media/20890,/storage/emulated/0/DCIM/Camera/VID_20211219_160204.mp4,video/mp4,1920,1080,90,42426934,,1639926141,1639926141861,1639926141000,15659,0,0,,,,,,,,,,, +20817,20687,content://media/external/video/media/20687,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20211215-WA0008.mp4",video/mp4,640,352,0,10890493,,1639606003,1639606013123,0,46933,0,0,,,,,,,,,,, +20818,20147,content://media/external/video/media/20147,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20211207-WA0018.mp4",video/mp4,640,352,90,1509998,,1638892295,1638898179822,0,7296,0,0,,,,,,,,,,, +20819,20079,content://media/external/video/media/20079,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20211207-WA0000.mp4",video/mp4,640,352,90,37339371,,1638865658,1638865803635,0,203883,0,0,,,,,,,,,,, +20820,19884,content://media/external/video/media/19884,/storage/emulated/0/DCIM/Camera/VID_20211206_120640.mp4,video/mp4,1920,1080,0,150973255,,1638788859,1638788859857,1638788859000,57045,0,0,,,,,,,,,,, +20821,11277,content://media/external/video/media/11277,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20211125-WA0000.mp4",video/mp4,432,226,0,116900,,1637819410,1637819411083,0,3090,0,0,,,,,,,,,,, +20822,9212,content://media/external/video/media/9212,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20211120-WA0002.mp4",video/mp4,394,218,0,105959,,1637527257,1637527257652,0,2400,0,0,,,,,,,,,,, +20823,5232,content://media/external/video/media/5232,/storage/emulated/0/DCIM/Camera/VID_20211031_105930.mp4,video/mp4,1920,1080,0,34815573,,1637508194,1635674385000,1635674384000,13077,0,0,,,,,,,,,,, +20824,5204,content://media/external/video/media/5204,/storage/emulated/0/DCIM/Camera/VID_20210918_105932.mp4,video/mp4,1920,1080,90,152260621,,1637507872,1631955633000,1631955632000,59597,0,0,,,,,,,,,,, +20825,5237,content://media/external/video/media/5237,/storage/emulated/0/DCIM/Camera/VID_20210918_103101.mp4,video/mp4,1920,1080,0,36783212,,1637508238,1631953877000,1631953876000,13974,0,0,,,,,,,,,,, +20826,5211,content://media/external/video/media/5211,/storage/emulated/0/DCIM/Camera/VID_20210918_103050.mp4,video/mp4,1920,1080,0,19286643,,1637507953,1631953858000,1631953858000,6938,0,0,,,,,,,,,,, +20827,5225,content://media/external/video/media/5225,/storage/emulated/0/DCIM/Camera/VID_20210918_103001.mp4,video/mp4,1920,1080,0,19341904,,1637508092,1631953809000,1631953809000,6962,0,0,,,,,,,,,,, +20828,5238,content://media/external/video/media/5238,/storage/emulated/0/DCIM/Camera/VID_20210911_092203.mp4,video/mp4,1920,1080,90,123840537,,1637508246,1631344973000,1631344972000,48451,0,0,,,,,,,,,,, +20829,5224,content://media/external/video/media/5224,/storage/emulated/0/DCIM/Camera/VID_20210911_091851.mp4,video/mp4,1920,1080,0,53012394,,1637508092,1631344753000,1631344752000,20405,0,0,,,,,,,,,,, +20830,5210,content://media/external/video/media/5210,/storage/emulated/0/DCIM/Camera/VID_20210901_143122.mp4,video/mp4,1920,1080,0,13775909,,1637507953,1630499488000,1630499488000,4693,0,0,,,,,,,,,,, +20831,5245,content://media/external/video/media/5245,/storage/emulated/0/DCIM/Camera/VID_20210901_143011.mp4,video/mp4,1920,1080,0,13009204,,1637508323,1630499417000,1630499416000,4426,0,0,,,,,,,,,,, +20832,5213,content://media/external/video/media/5213,/storage/emulated/0/DCIM/Camera/VID_20210901_114807.mp4,video/mp4,1920,1080,270,43196594,,1637507955,1630489705000,1630489705000,16472,0,0,,,,,,,,,,, +20833,5249,content://media/external/video/media/5249,/storage/emulated/0/DCIM/Camera/VID_20210901_102411.mp4,video/mp4,1920,1080,0,41623455,,1637508324,1630484669000,1630484668000,15873,0,0,,,,,,,,,,, +20834,5240,content://media/external/video/media/5240,/storage/emulated/0/DCIM/Camera/VID_20210901_102349.mp4,video/mp4,1920,1080,0,25301364,,1637508289,1630484641000,1630484640000,9506,0,0,,,,,,,,,,, +20835,5236,content://media/external/video/media/5236,/storage/emulated/0/DCIM/Camera/VID_20210607_172321.mp4,video/mp4,1920,1080,0,64109676,,1637508238,1623079428000,1623079427000,24755,0,0,,,,,,,,,,, +20836,5228,content://media/external/video/media/5228,/storage/emulated/0/DCIM/Camera/VID_20210522_181454.mp4,video/mp4,1920,1080,90,134743866,,1637508138,1621700148000,1621700148000,53066,0,0,,,,,,,,,,, +20837,5234,content://media/external/video/media/5234,/storage/emulated/0/DCIM/Camera/VID_20210515_102613.mp4,video/mp4,1920,1080,0,30781004,,1637508238,1621067186000,1621067186000,11926,0,0,,,,,,,,,,, +20838,5244,content://media/external/video/media/5244,/storage/emulated/0/DCIM/Camera/VID_20210515_102546.mp4,video/mp4,1920,1080,0,27033594,,1637508323,1621067157000,1621067157000,10360,0,0,,,,,,,,,,, +20839,5247,content://media/external/video/media/5247,/storage/emulated/0/DCIM/Camera/VID_20210501_122842.mp4,video/mp4,1280,720,90,11624942,,1637508324,1619864930000,1619864930000,10000,0,0,,,,,,,,,,, +20840,5223,content://media/external/video/media/5223,/storage/emulated/0/DCIM/Camera/VID_20210501_122821_HSR_240.mp4,video/mp4,1280,720,90,94284966,,1637508092,1619864916000,1619864916000,13451,0,0,,,,,,,,,,, +20841,5203,content://media/external/video/media/5203,/storage/emulated/0/DCIM/Camera/VID_20210501_122759.mp4,video/mp4,1280,720,90,11380526,,1637507864,1619864888000,1619864888000,10000,0,0,,,,,,,,,,, +20842,5230,content://media/external/video/media/5230,/storage/emulated/0/DCIM/Camera/VID_20210501_122030_HSR_12045926572.mp4,video/mp4,1280,720,90,19814325,,1637508194,1619864517000,1619864517000,16938,0,0,,,,,,,,,,, +20843,5235,content://media/external/video/media/5235,/storage/emulated/0/DCIM/Camera/VID_20210501_122030_HSR_120.mp4,video/mp4,1280,720,90,39542524,,1637508238,1619864442000,1619864442000,10950,0,0,,,,,,,,,,, +20844,5217,content://media/external/video/media/5217,/storage/emulated/0/DCIM/Camera/VID_20210501_121250_HSR_120.mp4,video/mp4,1280,720,0,40455690,,1637507982,1619863983000,1619863983000,11242,0,0,,,,,,,,,,, +20845,5209,content://media/external/video/media/5209,/storage/emulated/0/DCIM/Camera/VID_20210501_121137.mp4,video/mp4,1920,1080,90,4548164,,1637507953,1619863902000,1619863902000,1300,0,0,,,,,,,,,,, +20846,5208,content://media/external/video/media/5208,/storage/emulated/0/DCIM/Camera/VID_20210501_121113_HSR_120.mp4,video/mp4,1280,720,90,39843042,,1637507953,1619863885000,1619863885000,11104,0,0,,,,,,,,,,, +20847,5229,content://media/external/video/media/5229,/storage/emulated/0/DCIM/Camera/VID_20210501_121104_HSR_120.mp4,video/mp4,1280,720,90,23004725,,1637508194,1619863871000,1619863871000,6362,0,0,,,,,,,,,,, +20848,5233,content://media/external/video/media/5233,/storage/emulated/0/DCIM/Camera/VID_20210501_111206.mp4,video/mp4,1920,1080,90,87620333,,1637508238,1619860362000,1619860362000,34391,0,0,,,,,,,,,,, +20849,5199,content://media/external/video/media/5199,/storage/emulated/0/DCIM/367262990/VIDEO_20201227_143745341.mp4,video/mp4,2304,1296,0,918876,,1637507864,1609076265000,0,8748,0,0,,,,,,,,,,, +20850,5202,content://media/external/video/media/5202,/storage/emulated/0/DCIM/Camera/VID_20201128_093831.mp4,video/mp4,1920,1080,90,16825414,,1637507864,1606552718000,1606552718000,6352,0,0,,,,,,,,,,, +20851,5222,content://media/external/video/media/5222,/storage/emulated/0/DCIM/Camera/VID_20200908_105431.mp4,video/mp4,1920,1080,90,33432311,,1637508090,1599555285000,1599555285000,13013,0,0,,,,,,,,,,, +20852,5205,content://media/external/video/media/5205,/storage/emulated/0/DCIM/Camera/VID_20200718_120538.mp4,video/mp4,1920,1080,90,123009682,,1637507916,1595066788000,1595066788000,48682,0,0,,,,,,,,,,, +20853,5207,content://media/external/video/media/5207,/storage/emulated/0/DCIM/Camera/VID_20200422_173459.mp4,video/mp4,1920,1080,90,3086084,,1637507953,1587569702000,1587569702000,1165,0,0,,,,,,,,,,, +20854,5246,content://media/external/video/media/5246,/storage/emulated/0/DCIM/Camera/VID_20200328_211732.mp4,video/mp4,1920,1080,90,12703640,,1637508324,1585426658000,1585426658000,4925,0,0,,,,,,,,,,, +20855,5201,content://media/external/video/media/5201,/storage/emulated/0/DCIM/Camera/VID_20200304_221509.mp4,video/mp4,1920,1080,0,103227509,,1637507864,1583356551000,1583356551000,40784,0,0,,,,,,,,,,, +20856,5250,content://media/external/video/media/5250,/storage/emulated/0/DCIM/Camera/VID_20200222_211743.mp4,video/mp4,1920,1080,0,745776064,,1637508433,1582402959000,1582402959000,295365,0,0,,,,,,,,,,, +20857,5221,content://media/external/video/media/5221,/storage/emulated/0/DCIM/Camera/VID_20200106_215632.mp4,video/mp4,1920,1080,90,65617938,,1637508090,1578344219000,1578344219000,25814,0,0,,,,,,,,,,, +20858,5216,content://media/external/video/media/5216,/storage/emulated/0/DCIM/Camera/VID_20200101_000404.mp4,video/mp4,1920,1080,90,70650914,,1637507981,1577833473000,1577833473000,27856,0,0,,,,,,,,,,, +20859,5206,content://media/external/video/media/5206,/storage/emulated/0/DCIM/Camera/VID_20191221_162658.mp4,video/mp4,1920,1080,0,87995481,,1637507953,1576942054000,1576942054000,34743,0,0,,,,,,,,,,, +20860,7609,content://media/external/video/media/7609,"/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20191207-WA0027.mp4",video/mp4,848,480,90,1603686,,1637518223,1575733679000,1575726539000,7198,0,0,,,,,,,,,,, +20861,5220,content://media/external/video/media/5220,/storage/emulated/0/DCIM/Camera/VID_20191201_172255.mp4,video/mp4,1920,1080,90,2666010,,1637508090,1575217377000,1575217377000,774,0,0,,,,,,,,,,, +20862,5215,content://media/external/video/media/5215,/storage/emulated/0/DCIM/Camera/VID_20191124_094017.mp4,video/mp4,1920,1080,90,6569692,,1637507981,1574584820000,1574584820000,2337,0,0,,,,,,,,,,, +20863,5239,content://media/external/video/media/5239,/storage/emulated/0/DCIM/Camera/VID_20191123_175238.mp4,video/mp4,1920,1080,90,53494148,,1637508289,1574527981000,1574527981000,21029,0,0,,,,,,,,,,, +20864,5214,content://media/external/video/media/5214,/storage/emulated/0/DCIM/Camera/VID_20191123_175146.mp4,video/mp4,1920,1080,90,15560523,,1637507981,1574527913000,1574527913000,6000,0,0,,,,,,,,,,, +20865,5242,content://media/external/video/media/5242,/storage/emulated/0/DCIM/Camera/VID_20191018_183750.mp4,video/mp4,1920,1080,0,249796093,,1637508306,1571416770000,1571416770000,98769,0,0,,,,,,,,,,, +20866,5219,content://media/external/video/media/5219,/storage/emulated/0/DCIM/Camera/VID_20190921_124555.mp4,video/mp4,1920,1080,90,56385712,,1637508090,1569062779000,1569062779000,22311,0,0,,,,,,,,,,, +20867,5212,content://media/external/video/media/5212,/storage/emulated/0/DCIM/Camera/VID_20190921_121929.mp4,video/mp4,1920,1080,90,64138334,,1637507955,1569061196000,1569061196000,25380,0,0,,,,,,,,,,, +20868,5200,content://media/external/video/media/5200,/storage/emulated/0/DCIM/Camera/VID_20190907_163811.mp4,video/mp4,1920,1080,0,41157835,,1637507864,1567867108000,1567867108000,16290,0,0,,,,,,,,,,, diff --git a/docs/entry_2.txt b/docs/entry_2.txt new file mode 100644 index 0000000..74c4b57 --- /dev/null +++ b/docs/entry_2.txt @@ -0,0 +1 @@ +2|content://media/external/images/media/1000019251|/storage/emulated/0/DCIM/Camera/IMG_20250810_121828.jpg|image/jpeg|1754821108570|0|44.2502916666667|12.0827722222222 diff --git a/docs/entry_2_pretty.txt b/docs/entry_2_pretty.txt new file mode 100644 index 0000000..41eb2da --- /dev/null +++ b/docs/entry_2_pretty.txt @@ -0,0 +1,3 @@ +id uri path mimeType dateMillis metadata_date_local rotationDegrees latitude longitude +-- ------------------------------------------------ ------------------------------------------------------- ---------- ------------- ------------------- --------------- ---------------- ---------------- +2 content://media/external/images/media/1000019251 /storage/emulated/0/DCIM/Camera/IMG_20250810_121828.jpg image/jpeg 1754821108570 2025-08-10 12:18:28 0 44.2502916666667 12.0827722222222 diff --git a/docs/entry_6956.txt b/docs/entry_6956.txt new file mode 100644 index 0000000..2132063 --- /dev/null +++ b/docs/entry_6956.txt @@ -0,0 +1 @@ +6956|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0092.JPG|image/jpeg|4032|3024||3492198|IMG_0092.JPG|1772345058||1503142214000||0|1|json@patachina|58ee63712f451dd7ddce249bb17dfcc21659e1db75435486146c7f102ead3577|photos/Fabio/original/2017Irlanda19-29ago/IMG_0092.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0092_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0092_avg.jpg|44.1768833333333|11.9566694444444|38.8885135135135 diff --git a/docs/entry_schema.txt b/docs/entry_schema.txt new file mode 100644 index 0000000..6f43852 --- /dev/null +++ b/docs/entry_schema.txt @@ -0,0 +1,24 @@ +0|id|INTEGER|0||1 +1|contentId|INTEGER|0||0 +2|uri|TEXT|0||0 +3|path|TEXT|0||0 +4|sourceMimeType|TEXT|0||0 +5|width|INTEGER|0||0 +6|height|INTEGER|0||0 +7|sourceRotationDegrees|INTEGER|0||0 +8|sizeBytes|INTEGER|0||0 +9|title|TEXT|0||0 +10|dateAddedSecs|INTEGER|0|strftime('%s','now')|0 +11|dateModifiedMillis|INTEGER|0||0 +12|sourceDateTakenMillis|INTEGER|0||0 +13|durationMillis|INTEGER|0||0 +14|trashed|INTEGER|0|0|0 +15|origin|INTEGER|0|0|0 +16|provider|TEXT|0||0 +17|remoteId|TEXT|0||0 +18|remotePath|TEXT|0||0 +19|remoteThumb1|TEXT|0||0 +20|remoteThumb2|TEXT|0||0 +21|latitude|REAL|0||0 +22|longitude|REAL|0||0 +23|altitude|REAL|0||0 diff --git a/docs/favourites.csv b/docs/favourites.csv new file mode 100644 index 0000000..e69de29 diff --git a/docs/foto.txt b/docs/foto.txt new file mode 100644 index 0000000..c7c6542 --- /dev/null +++ b/docs/foto.txt @@ -0,0 +1,7054 @@ +1|1000019657|content://media/external/images/media/1000019657|/storage/emulated/0/DCIM/Screenshots/Screenshot_2025-10-27-21-11-59-581_com.example.webauthn_flutter.jpg|image/jpeg|1080|2400|0|184918||1761595919|1761595919841|0|0|0|0|||||||| +2|1000019251|content://media/external/images/media/1000019251|/storage/emulated/0/DCIM/Camera/IMG_20250810_121828.jpg|image/jpeg|3472|4640|0|6177515||1754821109|1754821112383|1754821108570|0|0|0|||||||| +3|1000019250|content://media/external/images/media/1000019250|/storage/emulated/0/DCIM/Camera/IMG_20250810_121822.jpg|image/jpeg|3472|4640|0|3773772||1754821103|1754821110847|1754821103064|0|0|0|||||||| +4|1000019249|content://media/external/images/media/1000019249|/storage/emulated/0/DCIM/Camera/IMG_20250810_121817.jpg|image/jpeg|3472|4640|0|4270621||1754821098|1754821105143|1754821097513|0|0|0|||||||| +5|1000018527|content://media/external/images/media/1000018527|/storage/emulated/0/DCIM/Camera/IMG_20250204_104544.jpg|image/jpeg|3472|4640|0|6799176||1738662346|1738662354782|1738662344594|0|0|0|||||||| +6|1000018526|content://media/external/images/media/1000018526|/storage/emulated/0/DCIM/Camera/IMG_20250204_104528.jpg|image/jpeg|3472|4640|0|4551647||1738662333|1738662338250|1738662328825|0|0|0|||||||| +7|1000018523|content://media/external/images/media/1000018523|/storage/emulated/0/DCIM/Camera/IMG_20250129_080657.jpg|image/jpeg|2450|1943|0|4161293||1738134417|1738134421104|1738134417709|0|0|0|||||||| +8|1000018486|content://media/external/images/media/1000018486|/storage/emulated/0/DCIM/Camera/IMG_20250125_103858.jpg|image/jpeg|2813|3991|0|4403217||1737797939|1737797944240|1737797938693|0|0|0|||||||| +9|1000018374|content://media/external/images/media/1000018374|/storage/emulated/0/Pictures/IMG_0206.jpg|image/jpeg|1500|1001|0|268463||1735806799|1735806799595|0|0|0|0|||||||| +10|1000017561|content://media/external/images/media/1000017561|/storage/emulated/0/DCIM/Camera/IMG_20230406_093739.jpg|image/jpeg|2592|4608|0|4581800||1680766660|1680766661753|1680766659114|0|0|0|||||||| +11|1000017199|content://media/external/images/media/1000017199|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0023.jpg|image/jpeg|921|2048|0|100057||1676472921|1676472922362|0|0|0|0|||||||| +12|1000017196|content://media/external/images/media/1000017196|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0022.jpg|image/jpeg|921|2048|0|102459||1676472915|1676472921761|0|0|0|0|||||||| +13|1000017192|content://media/external/images/media/1000017192|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0021.jpg|image/jpeg|1600|764|0|150438||1676469491|1676470460661|0|0|0|0|||||||| +14|1000017190|content://media/external/images/media/1000017190|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-15-14-56-56-555_com.google.android.apps.docs-edit.jpg|image/jpeg|1017|996|0|289800||1676469427|1676469427922|0|0|0|0|||||||| +15|1000017189|content://media/external/images/media/1000017189|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-15-14-56-56-555_com.google.android.apps.docs.jpg|image/jpeg|1080|2400|0|654556||1676469416|1676469417102|0|0|0|0|||||||| +16|1000017176|content://media/external/images/media/1000017176|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0019.jpg|image/jpeg|1600|719|0|254051||1676469325|1676469326243|0|0|0|0|||||||| +17|1000017173|content://media/external/images/media/1000017173|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0018.jpg|image/jpeg|1600|719|0|234955||1676469325|1676469325891|0|0|0|0|||||||| +18|1000017168|content://media/external/images/media/1000017168|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0017.jpg|image/jpeg|2048|1532|0|417289||1676465765|1676465766018|0|0|0|0|||||||| +19|1000017162|content://media/external/images/media/1000017162|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0015.jpg|image/jpeg|2048|1532|0|480560||1676465764|1676465765067|0|0|0|0|||||||| +20|1000017165|content://media/external/images/media/1000017165|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0016.jpg|image/jpeg|1532|2048|0|365348||1676465765|1676465765517|0|0|0|0|||||||| +21|1000017156|content://media/external/images/media/1000017156|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0013.jpg|image/jpeg|2048|1532|0|261621||1676465763|1676465764033|0|0|0|0|||||||| +22|1000017159|content://media/external/images/media/1000017159|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0014.jpg|image/jpeg|2048|1532|0|343535||1676465764|1676465764429|0|0|0|0|||||||| +23|1000017150|content://media/external/images/media/1000017150|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0011.jpg|image/jpeg|1532|2048|0|224870||1676465762|1676465763299|0|0|0|0|||||||| +24|1000017153|content://media/external/images/media/1000017153|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0012.jpg|image/jpeg|1532|2048|0|250785||1676465763|1676465763780|0|0|0|0|||||||| +25|1000017147|content://media/external/images/media/1000017147|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0010.jpg|image/jpeg|1532|2048|0|250725||1676465761|1676465762413|0|0|0|0|||||||| +26|1000017140|content://media/external/images/media/1000017140|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0009.jpg|image/jpeg|1200|1599|0|151431||1676463418|1676463420986|0|0|0|0|||||||| +27|1000017137|content://media/external/images/media/1000017137|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0008.jpg|image/jpeg|1200|1599|0|280768||1676462769|1676462770138|0|0|0|0|||||||| +28|1000017134|content://media/external/images/media/1000017134|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0007.jpg|image/jpeg|1532|2048|0|186948||1676461675|1676461676535|0|0|0|0|||||||| +29|1000017131|content://media/external/images/media/1000017131|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0006.jpg|image/jpeg|2048|1536|0|643220||1676460189|1676460193906|0|0|0|0|||||||| +30|1000017128|content://media/external/images/media/1000017128|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0005.jpg|image/jpeg|1200|1599|0|280447||1676457919|1676457920859|0|0|0|0|||||||| +31|1000017121|content://media/external/images/media/1000017121|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0004.jpg|image/jpeg|2048|1532|0|169269||1676445734|1676445735288|0|0|0|0|||||||| +32|1000017115|content://media/external/images/media/1000017115|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0003.jpg|image/jpeg|2048|1532|0|133330||1676444229|1676444230359|0|0|0|0|||||||| +33|1000017112|content://media/external/images/media/1000017112|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0002.jpg|image/jpeg|2048|1532|0|167765||1676444228|1676444229460|0|0|0|0|||||||| +34|1000017109|content://media/external/images/media/1000017109|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0001.jpg|image/jpeg|2048|1532|0|246704||1676443003|1676443038434|0|0|0|0|||||||| +35|1000017099|content://media/external/images/media/1000017099|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0000.jpg|image/jpeg|1532|2048|0|121328||1676417154|1676417155093|0|0|0|0|||||||| +36|1000017096|content://media/external/images/media/1000017096|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0010.jpg|image/jpeg|1080|905|0|203460||1676401060|1676401061169|0|0|0|0|||||||| +37|1000017087|content://media/external/images/media/1000017087|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0008.jpg|image/jpeg|701|1024|0|56841||1676387088|1676387088353|0|0|0|0|||||||| +38|1000017081|content://media/external/images/media/1000017081|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0006.jpg|image/jpeg|630|787|0|61761||1676386525|1676386526260|0|0|0|0|||||||| +39|1000017084|content://media/external/images/media/1000017084|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0007.jpg|image/jpeg|633|1078|0|56259||1676386526|1676386526603|0|0|0|0|||||||| +40|1000017078|content://media/external/images/media/1000017078|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0005.jpg|image/jpeg|1065|1015|0|104603||1676375271|1676375271905|0|0|0|0|||||||| +41|1000017072|content://media/external/images/media/1000017072|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0004.jpg|image/jpeg|1600|604|0|149717||1676373634|1676373635392|0|0|0|0|||||||| +42|1000017070|content://media/external/images/media/1000017070|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0003.jpg|image/jpeg|1188|583|0|169100||1676371498|1676371498632|0|0|0|0|||||||| +43|1000017068|content://media/external/images/media/1000017068|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0002.jpg|image/jpeg|836|618|0|113876||1676371338|1676371339102|0|0|0|0|||||||| +44|1000017065|content://media/external/images/media/1000017065|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0001.jpg|image/jpeg|930|201|0|67796||1676366075|1676366075497|0|0|0|0|||||||| +45|1000017062|content://media/external/images/media/1000017062|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0000.jpg|image/jpeg|1600|688|0|101131||1676363084|1676363085479|0|0|0|0|||||||| +46|1000017052|content://media/external/images/media/1000017052|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0004.jpg|image/jpeg|921|2048|0|194676||1676319091|1676319092130|0|0|0|0|||||||| +47|1000017049|content://media/external/images/media/1000017049|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0003.jpg|image/jpeg|2048|1536|0|310678||1676288280|1676288282158|0|0|0|0|||||||| +48|1000017046|content://media/external/images/media/1000017046|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0002.jpg|image/jpeg|1536|2048|0|218853||1676288279|1676288280907|0|0|0|0|||||||| +49|1000017044|content://media/external/images/media/1000017044|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-13-12-08-26-323_com.miui.home.jpg|image/jpeg|1080|2400|0|794984||1676286506|1676286506865|0|0|0|0|||||||| +50|1000017041|content://media/external/images/media/1000017041|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0000.jpg|image/jpeg|900|1600|0|39706||1676279875|1676279876199|0|0|0|0|||||||| +51|1000017040|content://media/external/images/media/1000017040|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-13-10-07-09-365_com.miui.home.jpg|image/jpeg|1080|2400|0|807932||1676279229|1676279229920|0|0|0|0|||||||| +52|1000017015|content://media/external/images/media/1000017015|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230212-WA0005.jpg|image/jpeg|2048|1536|0|615150||1676225289|1676225291461|0|0|0|0|||||||| +53|1000017008|content://media/external/images/media/1000017008|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230212-WA0004.jpg|image/jpeg|768|1024|0|115959||1676209150|1676209151138|0|0|0|0|||||||| +54|1000017006|content://media/external/images/media/1000017006|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-12-14-17-21-917_com.instagram.android.jpg|image/jpeg|1080|2400|0|801141||1676207842|1676207842398|0|0|0|0|||||||| +55|1000017003|content://media/external/images/media/1000017003|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230212-WA0002.jpg|image/jpeg|2048|1532|0|266459||1676204314|1676204315042|0|0|0|0|||||||| +56|1000016999|content://media/external/images/media/1000016999|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-12-08-21-46-596_com.whatsapp.jpg|image/jpeg|1080|2400|0|876809||1676186506|1676186507008|0|0|0|0|||||||| +57|1000016989|content://media/external/images/media/1000016989|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0014.jpg|image/jpeg|921|2048|0|106154||1676149901|1676149901676|0|0|0|0|||||||| +58|1000016973|content://media/external/images/media/1000016973|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-18-05-12-024_com.google.android.gm.jpg|image/jpeg|1080|2400|0|615455||1676135112|1676135112487|0|0|0|0|||||||| +59|1000016971|content://media/external/images/media/1000016971|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-17-33-02-236_com.whatsapp.jpg|image/jpeg|1080|2400|0|828351||1676133182|1676133182674|0|0|0|0|||||||| +60|1000016968|content://media/external/images/media/1000016968|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0009.jpg|image/jpeg|1080|1080|0|60850||1676125605|1676125606556|0|0|0|0|||||||| +61|1000016965|content://media/external/images/media/1000016965|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0008.jpg|image/jpeg|1080|608|0|74140||1676122954|1676122954784|0|0|0|0|||||||| +62|1000016960|content://media/external/images/media/1000016960|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-12-29-01-111_com.whatsapp.jpg|image/jpeg|1080|2400|0|828986||1676114941|1676114941220|0|0|0|0|||||||| +63|1000016958|content://media/external/images/media/1000016958|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-12-28-39-912_com.whatsapp.jpg|image/jpeg|1080|2400|0|724062||1676114920|1676114920404|0|0|0|0|||||||| +64|1000016945|content://media/external/images/media/1000016945|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0001.jpg|image/jpeg|1152|2048|0|271535||1676102221|1676102221863|0|0|0|0|||||||| +65|1000016942|content://media/external/images/media/1000016942|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0000.jpg|image/jpeg|843|1600|0|126235||1676100159|1676100204800|0|0|0|0|||||||| +66|1000016926|content://media/external/images/media/1000016926|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0006.jpg|image/jpeg|1080|1385|0|137403||1676053786|1676053787593|0|0|0|0|||||||| +67|1000016924|content://media/external/images/media/1000016924|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-10-17-31-10-634_com.google.android.googlequicksearchbox-edit.jpg|image/jpeg|865|1054|0|272112||1676046681|1676046681175|0|0|0|0|||||||| +68|1000016922|content://media/external/images/media/1000016922|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0004.jpg|image/jpeg|1080|1074|0|129533||1676041126|1676041126653|0|0|0|0|||||||| +69|1000016920|content://media/external/images/media/1000016920|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-10-15-57-09-170_com.miui.home.jpg|image/jpeg|1080|2400|0|625585||1676041029|1676041029651|0|0|0|0|||||||| +70|1000016917|content://media/external/images/media/1000016917|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0003.jpg|image/jpeg|720|793|0|64094||1676040722|1676040723409|0|0|0|0|||||||| +71|1000016914|content://media/external/images/media/1000016914|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0002.jpg|image/jpeg|1080|1920|0|318779||1676038842|1676038843415|0|0|0|0|||||||| +72|1000016911|content://media/external/images/media/1000016911|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0001.jpg|image/jpeg|720|675|0|42122||1676036778|1676036779132|0|0|0|0|||||||| +73|1000016890|content://media/external/images/media/1000016890|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0014.jpg|image/jpeg|719|1600|0|155891||1675982833|1675982834246|0|0|0|0|||||||| +74|1000016876|content://media/external/images/media/1000016876|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0011.jpg|image/jpeg|1054|1600|0|192046||1675974343|1675974344500|0|0|0|0|||||||| +75|1000016851|content://media/external/images/media/1000016851|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0006.jpg|image/jpeg|500|913|0|67535||1675945299|1675945299653|0|0|0|0|||||||| +76|1000016812|content://media/external/images/media/1000016812|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0010.jpg|image/jpeg|2048|1532|0|371772||1675864591|1675864592310|0|0|0|0|||||||| +77|1000016806|content://media/external/images/media/1000016806|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0008.jpg|image/jpeg|2048|1532|0|382274||1675864590|1675864591284|0|0|0|0|||||||| +78|1000016809|content://media/external/images/media/1000016809|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0009.jpg|image/jpeg|2048|1532|0|439268||1675864591|1675864591956|0|0|0|0|||||||| +79|1000016798|content://media/external/images/media/1000016798|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0006.jpg|image/jpeg|2048|1532|0|422064||1675854403|1675854404057|0|0|0|0|||||||| +80|1000016795|content://media/external/images/media/1000016795|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0005.jpg|image/jpeg|2048|1532|0|338082||1675854401|1675854403116|0|0|0|0|||||||| +81|1000016789|content://media/external/images/media/1000016789|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0003.jpg|image/jpeg|2048|1532|0|279930||1675853773|1675853774325|0|0|0|0|||||||| +82|1000016792|content://media/external/images/media/1000016792|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0004.jpg|image/jpeg|1532|2048|0|190775||1675853774|1675853774499|0|0|0|0|||||||| +83|1000016786|content://media/external/images/media/1000016786|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0002.jpg|image/jpeg|1532|2048|0|289841||1675853773|1675853773791|0|0|0|0|||||||| +84|1000016778|content://media/external/images/media/1000016778|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0000.jpg|image/jpeg|1512|1512|0|409315||1675843626|1675843627156|0|0|0|0|||||||| +85|1000016765|content://media/external/images/media/1000016765|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230207-WA0001.jpg|image/jpeg|1078|1346|0|216388||1675801742|1675802013417|0|0|0|0|||||||| +86|1000016762|content://media/external/images/media/1000016762|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230207-WA0000.jpg|image/jpeg|1200|1600|0|213350||1675785430|1675785431507|0|0|0|0|||||||| +87|1000016738|content://media/external/images/media/1000016738|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-07-16-13-05-638_com.shazam.android.jpg|image/jpeg|1080|2400|0|941691||1675782785|1675782785881|0|0|0|0|||||||| +88|1000016707|content://media/external/images/media/1000016707|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230206-WA0000.jpg|image/jpeg|921|2048|0|193385||1675667822|1675667823018|0|0|0|0|||||||| +89|1000016692|content://media/external/images/media/1000016692|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0032.jpg|image/jpeg|2048|1532|0|215636||1675614842|1675614843850|0|0|0|0|||||||| +90|1000016689|content://media/external/images/media/1000016689|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0031.jpg|image/jpeg|2048|1532|0|279947||1675614841|1675614842427|0|0|0|0|||||||| +91|1000016686|content://media/external/images/media/1000016686|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0030.jpg|image/jpeg|2048|1532|0|331013||1675614840|1675614841301|0|0|0|0|||||||| +92|1000016683|content://media/external/images/media/1000016683|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0029.jpg|image/jpeg|2048|1532|0|328680||1675614839|1675614840717|0|0|0|0|||||||| +93|1000016680|content://media/external/images/media/1000016680|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0028.jpg|image/jpeg|2048|1532|0|337417||1675614838|1675614839674|0|0|0|0|||||||| +94|1000016677|content://media/external/images/media/1000016677|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0027.jpg|image/jpeg|2048|1532|0|294504||1675614837|1675614838417|0|0|0|0|||||||| +95|1000016674|content://media/external/images/media/1000016674|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0026.jpg|image/jpeg|2048|1532|0|358036||1675614835|1675614837157|0|0|0|0|||||||| +96|1000016668|content://media/external/images/media/1000016668|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0024.jpg|image/jpeg|2048|1532|0|333838||1675614834|1675614835006|0|0|0|0|||||||| +97|1000016671|content://media/external/images/media/1000016671|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0025.jpg|image/jpeg|2048|1532|0|347022||1675614835|1675614835777|0|0|0|0|||||||| +98|1000016665|content://media/external/images/media/1000016665|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0023.jpg|image/jpeg|2048|1532|0|324751||1675614833|1675614834475|0|0|0|0|||||||| +99|1000016659|content://media/external/images/media/1000016659|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0021.jpg|image/jpeg|1532|2048|0|240105||1675614832|1675614833324|0|0|0|0|||||||| +100|1000016662|content://media/external/images/media/1000016662|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0022.jpg|image/jpeg|2048|1532|0|353403||1675614833|1675614833926|0|0|0|0|||||||| +101|1000016656|content://media/external/images/media/1000016656|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0020.jpg|image/jpeg|1532|2048|0|382894||1675614831|1675614832872|0|0|0|0|||||||| +102|1000016653|content://media/external/images/media/1000016653|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0019.jpg|image/jpeg|1532|2048|0|385053||1675614830|1675614831813|0|0|0|0|||||||| +103|1000016650|content://media/external/images/media/1000016650|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0018.jpg|image/jpeg|1532|2048|0|398987||1675614829|1675614830355|0|0|0|0|||||||| +104|1000016599|content://media/external/images/media/1000016599|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0002.jpg|image/jpeg|2048|1532|0|340368||1675595233|1675614829075|0|0|0|0|||||||| +105|1000016646|content://media/external/images/media/1000016646|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0017.jpg|image/jpeg|2048|1532|0|330573||1675614828|1675614829037|0|0|0|0|||||||| +106|1000016643|content://media/external/images/media/1000016643|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0016.jpg|image/jpeg|1532|2048|0|391092||1675614827|1675614828295|0|0|0|0|||||||| +107|1000016640|content://media/external/images/media/1000016640|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0015.jpg|image/jpeg|1532|2048|0|354548||1675614826|1675614827469|0|0|0|0|||||||| +108|1000016634|content://media/external/images/media/1000016634|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0013.jpg|image/jpeg|1532|2048|0|386698||1675614825|1675614826398|0|0|0|0|||||||| +109|1000016637|content://media/external/images/media/1000016637|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0014.jpg|image/jpeg|1532|2048|0|370078||1675614826|1675614826946|0|0|0|0|||||||| +110|1000016628|content://media/external/images/media/1000016628|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0011.jpg|image/jpeg|2048|1532|0|370664||1675614824|1675614825110|0|0|0|0|||||||| +111|1000016631|content://media/external/images/media/1000016631|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0012.jpg|image/jpeg|1532|2048|0|280670||1675614825|1675614825707|0|0|0|0|||||||| +112|1000016622|content://media/external/images/media/1000016622|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0009.jpg|image/jpeg|2048|1532|0|318984||1675614823|1675614824075|0|0|0|0|||||||| +113|1000016625|content://media/external/images/media/1000016625|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0010.jpg|image/jpeg|2048|1532|0|302076||1675614824|1675614824553|0|0|0|0|||||||| +114|1000016619|content://media/external/images/media/1000016619|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0008.jpg|image/jpeg|2048|1532|0|339385||1675614822|1675614823482|0|0|0|0|||||||| +115|1000016613|content://media/external/images/media/1000016613|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0006.jpg|image/jpeg|2048|1532|0|341430||1675614821|1675614822500|0|0|0|0|||||||| +116|1000016616|content://media/external/images/media/1000016616|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0007.jpg|image/jpeg|2048|1532|0|348511||1675614822|1675614822962|0|0|0|0|||||||| +117|1000016610|content://media/external/images/media/1000016610|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0005.jpg|image/jpeg|2048|1532|0|351561||1675614820|1675614821760|0|0|0|0|||||||| +118|1000016607|content://media/external/images/media/1000016607|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0004.jpg|image/jpeg|1532|2048|0|361860||1675614819|1675614820772|0|0|0|0|||||||| +119|1000016596|content://media/external/images/media/1000016596|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0001.jpg|image/jpeg|1080|1629|0|115084||1675591187|1675591188248|0|0|0|0|||||||| +120|1000016586|content://media/external/images/media/1000016586|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-49-15-733_com.android.chrome.jpg|image/jpeg|1080|2400|0|621329||1675529356|1675529356116|0|0|0|0|||||||| +121|1000016585|content://media/external/images/media/1000016585|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-48-21-380_com.android.chrome.jpg|image/jpeg|1080|2400|0|746568||1675529301|1675529301456|0|0|0|0|||||||| +122|1000016584|content://media/external/images/media/1000016584|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-48-15-501_com.android.chrome.jpg|image/jpeg|1080|2400|0|618906||1675529295|1675529295908|0|0|0|0|||||||| +123|1000016581|content://media/external/images/media/1000016581|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-15-21-802_com.google.android.googlequicksearchbox.jpg|image/jpeg|1080|2400|0|605874||1675527322|1675527322137|0|0|0|0|||||||| +124|1000016572|content://media/external/images/media/1000016572|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230204-WA0000.jpg|image/jpeg|1200|1600|0|193943||1675516863|1675516864059|0|0|0|0|||||||| +125|1000016545|content://media/external/images/media/1000016545|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-03-19-56-29-319_com.whatsapp.jpg|image/jpeg|1080|2400|0|836985||1675450589|1675450589732|0|0|0|0|||||||| +126|1000016536|content://media/external/images/media/1000016536|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0003.jpg|image/jpeg|2048|1532|0|345525||1675438864|1675438865252|0|0|0|0|||||||| +127|1000016539|content://media/external/images/media/1000016539|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0004.jpg|image/jpeg|2048|1532|0|501543||1675438865|1675438865620|0|0|0|0|||||||| +128|1000016533|content://media/external/images/media/1000016533|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0002.jpg|image/jpeg|2048|1532|0|591603||1675438862|1675438864364|0|0|0|0|||||||| +129|1000016527|content://media/external/images/media/1000016527|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0001.jpg|image/jpeg|921|2048|0|143731||1675425476|1675425477061|0|0|0|0|||||||| +130|1000016524|content://media/external/images/media/1000016524|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0000.jpg|image/jpeg|921|2048|0|85831||1675420661|1675420661816|0|0|0|0|||||||| +131|1000016513|content://media/external/images/media/1000016513|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230202-WA0004.jpg|image/jpeg|921|2048|0|136481||1675372541|1675372542638|0|0|0|0|||||||| +132|1000016511|content://media/external/images/media/1000016511|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-02-18-13-19-852_ch.publisheria.bring.jpg|image/jpeg|1080|2400|0|496941||1675358000|1675358000252|0|0|0|0|||||||| +133|1000016505|content://media/external/images/media/1000016505|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-02-16-34-54-238_com.google.android.googlequicksearchbox-edit.jpg|image/jpeg|1080|2400|0|588438||1675352107|1675352107284|0|0|0|0|||||||| +134|1000016497|content://media/external/images/media/1000016497|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230202-WA0000.jpg|image/jpeg|2048|1532|0|430669||1675327248|1675327249081|0|0|0|0|||||||| +135|1000016477|content://media/external/images/media/1000016477|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230201-WA0003.jpg|image/jpeg|2048|1532|0|395349||1675247402|1675247403069|0|0|0|0|||||||| +136|1000016474|content://media/external/images/media/1000016474|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230201-WA0002.jpg|image/jpeg|2048|1532|0|605187||1675247214|1675247216020|0|0|0|0|||||||| +137|1000016470|content://media/external/images/media/1000016470|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230201-WA0000.jpg|image/jpeg|921|2048|0|197092||1675238350|1675238351188|0|0|0|0|||||||| +138|1000016454|content://media/external/images/media/1000016454|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230131-WA0006.jpg|image/jpeg|1268|1792|0|260899||1675175957|1675175958490|0|0|0|0|||||||| +139|1000016451|content://media/external/images/media/1000016451|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230131-WA0005.jpg|image/jpeg|1292|1828|0|228335||1675175955|1675175957429|0|0|0|0|||||||| +140|1000016449|content://media/external/images/media/1000016449|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-12-21-22-297_com.momondo.flightsearch.jpg|image/jpeg|1080|2400|0|557143||1675164082|1675164082707|0|0|0|0|||||||| +141|1000016447|content://media/external/images/media/1000016447|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-12-10-40-642_com.momondo.flightsearch.jpg|image/jpeg|1080|2400|0|563187||1675163440|1675163440736|0|0|0|0|||||||| +142|1000016446|content://media/external/images/media/1000016446|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-12-10-30-976_com.momondo.flightsearch.jpg|image/jpeg|1080|2400|0|562512||1675163431|1675163431508|0|0|0|0|||||||| +143|1000016444|content://media/external/images/media/1000016444|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-10-54-37-729_com.google.android.gm.jpg|image/jpeg|1080|2400|0|616113||1675158878|1675158878164|0|0|0|0|||||||| +144|1000016430|content://media/external/images/media/1000016430|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0007.jpg|image/jpeg|1536|2048|0|224338||1675108977|1675108978697|0|0|0|0|||||||| +145|1000016412|content://media/external/images/media/1000016412|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0005.jpg|image/jpeg|921|2048|0|135044||1675083107|1675083108655|0|0|0|0|||||||| +146|1000016409|content://media/external/images/media/1000016409|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0004.jpg|image/jpeg|520|720|0|38680||1675082965|1675082966339|0|0|0|0|||||||| +147|1000016402|content://media/external/images/media/1000016402|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-30-12-01-39-334_com.google.android.gm.jpg|image/jpeg|1080|2400|0|329317||1675076499|1675076499705|0|0|0|0|||||||| +148|1000016399|content://media/external/images/media/1000016399|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0000.jpg|image/jpeg|2048|1536|0|307208||1675064256|1675064256872|0|0|0|0|||||||| +149|1000016388|content://media/external/images/media/1000016388|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230129-WA0000.jpg|image/jpeg|844|1600|0|141167||1674999565|1674999565840|0|0|0|0|||||||| +150|1000016361|content://media/external/images/media/1000016361|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0014.jpg|image/jpeg|851|1024|0|65570||1674942141|1674942142625|0|0|0|0|||||||| +151|1000016358|content://media/external/images/media/1000016358|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0013.jpg|image/jpeg|646|1024|0|98011||1674942036|1674942038296|0|0|0|0|||||||| +152|1000016348|content://media/external/images/media/1000016348|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0012.jpg|image/jpeg|1168|1600|0|159464||1674933498|1674933499829|0|0|0|0|||||||| +153|1000016346|content://media/external/images/media/1000016346|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0011.jpg|image/jpeg|720|617|0|42987||1674925443|1674925443525|0|0|0|0|||||||| +154|1000016339|content://media/external/images/media/1000016339|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0009.jpg|image/jpeg|720|1600|0|34057||1674923139|1674923139587|0|0|0|0|||||||| +155|1000016336|content://media/external/images/media/1000016336|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0008.jpg|image/jpeg|1152|2048|0|171339||1674917876|1674917876686|0|0|0|0|||||||| +156|1000016334|content://media/external/images/media/1000016334|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20230128-WA0007.jpg|image/jpeg|1080|1409|0|117378||1674910483|1674910483504|0|0|0|0|||||||| +157|1000016315|content://media/external/images/media/1000016315|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20230128-WA0000.jpg|image/jpeg|2048|1532|0|180716||1674892517|1674892518415|0|0|0|0|||||||| +158|1000016301|content://media/external/images/media/1000016301|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230127-WA0003.jpg|image/jpeg|540|804|0|37123||1674844417|1674844417728|0|0|0|0|||||||| +159|1000016297|content://media/external/images/media/1000016297|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230127-WA0002.jpg|image/jpeg|1532|2048|0|205318||1674824403|1674824404234|0|0|0|0|||||||| +160|1000016287|content://media/external/images/media/1000016287|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230127-WA0001.jpg|image/jpeg|720|1600|0|150683||1674807597|1674807597888|0|0|0|0|||||||| +161|1000016284|content://media/external/images/media/1000016284|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230127-WA0000.jpg|image/jpeg|1200|1600|0|135021||1674806525|1674806527284|0|0|0|0|||||||| +162|1000016263|content://media/external/images/media/1000016263|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0004.jpg|image/jpeg|1080|565|0|84795||1674757716|1674757716732|0|0|0|0|||||||| +163|1000016260|content://media/external/images/media/1000016260|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0003.jpg|image/jpeg|899|1599|0|116557||1674757250|1674757251360|0|0|0|0|||||||| +164|1000016257|content://media/external/images/media/1000016257|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0002.jpg|image/jpeg|899|1599|0|107879||1674757168|1674757168564|0|0|0|0|||||||| +165|1000016254|content://media/external/images/media/1000016254|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0001.jpg|image/jpeg|921|2048|0|118007||1674731354|1674731355407|0|0|0|0|||||||| +166|1000016251|content://media/external/images/media/1000016251|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0000.jpg|image/jpeg|720|1600|0|114224||1674731117|1674731118163|0|0|0|0|||||||| +167|1000016235|content://media/external/images/media/1000016235|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230125-WA0005.jpg|image/jpeg|875|1600|0|112834||1674668207|1674668207553|0|0|0|0|||||||| +168|1000016232|content://media/external/images/media/1000016232|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230125-WA0004.jpg|image/jpeg|720|1600|0|62208||1674668075|1674668075949|0|0|0|0|||||||| +169|1000016221|content://media/external/images/media/1000016221|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-25-10-06-47-076_com.google.android.gm.jpg|image/jpeg|1080|2400|0|662053||1674637607|1674637607456|0|0|0|0|||||||| +170|1000016211|content://media/external/images/media/1000016211|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0023.jpg|image/jpeg|921|2048|0|143005||1674598427|1674598428189|0|0|0|0|||||||| +171|1000016209|content://media/external/images/media/1000016209|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0022.jpg|image/jpeg|946|652|0|152046||1674571086|1674571086781|0|0|0|0|||||||| +172|1000016200|content://media/external/images/media/1000016200|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0019.jpg|image/jpeg|768|1024|0|57323||1674570436|1674570437196|0|0|0|0|||||||| +173|1000016203|content://media/external/images/media/1000016203|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0020.jpg|image/jpeg|768|1024|0|55983||1674570437|1674570437449|0|0|0|0|||||||| +174|1000016206|content://media/external/images/media/1000016206|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0021.jpg|image/jpeg|1024|768|0|68543||1674570437|1674570437672|0|0|0|0|||||||| +175|1000016188|content://media/external/images/media/1000016188|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0015.jpg|image/jpeg|1024|683|0|70398||1674570435|1674570436150|0|0|0|0|||||||| +176|1000016191|content://media/external/images/media/1000016191|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0016.jpg|image/jpeg|768|1024|0|64017||1674570436|1674570436443|0|0|0|0|||||||| +177|1000016194|content://media/external/images/media/1000016194|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0017.jpg|image/jpeg|768|1024|0|51157||1674570436|1674570436753|0|0|0|0|||||||| +178|1000016197|content://media/external/images/media/1000016197|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0018.jpg|image/jpeg|768|1024|0|60792||1674570436|1674570436954|0|0|0|0|||||||| +179|1000016176|content://media/external/images/media/1000016176|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0011.jpg|image/jpeg|768|1024|0|57904||1674570434|1674570435069|0|0|0|0|||||||| +180|1000016179|content://media/external/images/media/1000016179|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0012.jpg|image/jpeg|1024|683|0|53017||1674570435|1674570435330|0|0|0|0|||||||| +181|1000016182|content://media/external/images/media/1000016182|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0013.jpg|image/jpeg|1024|682|0|54181||1674570435|1674570435584|0|0|0|0|||||||| +182|1000016185|content://media/external/images/media/1000016185|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0014.jpg|image/jpeg|1024|683|0|47111||1674570435|1674570435748|0|0|0|0|||||||| +183|1000016173|content://media/external/images/media/1000016173|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0010.jpg|image/jpeg|768|1024|0|70258||1674570433|1674570434599|0|0|0|0|||||||| +184|1000016167|content://media/external/images/media/1000016167|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0008.jpg|image/jpeg|1080|795|0|56798||1674564281|1674564282381|0|0|0|0|||||||| +185|1000016165|content://media/external/images/media/1000016165|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0006.jpeg|image/jpeg|3840|2160|0|2138355||1674564276|1674564276111|1674564275927|0|0|0|||||||| +186|1000016162|content://media/external/images/media/1000016162|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0005.jpg|image/jpeg|1073|1162|0|82663||1674564110|1674564111221|0|0|0|0|||||||| +187|1000016145|content://media/external/images/media/1000016145|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0004.jpg|image/jpeg|819|1600|0|167291||1674557302|1674557303076|0|0|0|0|||||||| +188|1000016137|content://media/external/images/media/1000016137|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-24-09-46-03-144-edit_net.skyscanner.android.main.jpg|image/jpeg|1080|2400|0|477710||1674549963|1674549963191|0|0|0|0|||||||| +189|1000016134|content://media/external/images/media/1000016134|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0002.jpg|image/jpeg|753|388|0|59816||1674547593|1674547594007|0|0|0|0|||||||| +190|1000016132|content://media/external/images/media/1000016132|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0001.jpg|image/jpeg|1273|620|0|82997||1674546503|1674546504019|0|0|0|0|||||||| +191|1000016130|content://media/external/images/media/1000016130|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0000.jpg|image/jpeg|1213|698|0|88615||1674545117|1674545117983|0|0|0|0|||||||| +192|1000016120|content://media/external/images/media/1000016120|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230123-WA0001.jpg|image/jpeg|738|1600|0|75681||1674502909|1674502909665|0|0|0|0|||||||| +193|1000016088|content://media/external/images/media/1000016088|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230122-WA0007.jpg|image/jpeg|921|2048|0|164842||1674420110|1674420110991|0|0|0|0|||||||| +194|1000016085|content://media/external/images/media/1000016085|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230122-WA0006.jpg|image/jpeg|896|2000|0|163800||1674415434|1674415435493|0|0|0|0|||||||| +195|1000016079|content://media/external/images/media/1000016079|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230122-WA0004.jpg|image/jpeg|1600|1200|0|263187||1674401283|1674401283884|0|0|0|0|||||||| +196|1000016050|content://media/external/images/media/1000016050|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0017.jpg|image/jpeg|1080|1080|0|62271||1674312490|1674312491254|0|0|0|0|||||||| +197|1000016033|content://media/external/images/media/1000016033|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0012.jpg|image/jpeg|1600|900|0|267537||1674303879|1674303879146|0|0|0|0|||||||| +198|1000016036|content://media/external/images/media/1000016036|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0013.jpg|image/jpeg|1600|900|0|268094||1674303879|1674303879241|0|0|0|0|||||||| +199|1000016039|content://media/external/images/media/1000016039|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0014.jpg|image/jpeg|1600|900|0|267684||1674303879|1674303879358|0|0|0|0|||||||| +200|1000016042|content://media/external/images/media/1000016042|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0015.jpg|image/jpeg|1600|900|0|268618||1674303879|1674303879549|0|0|0|0|||||||| +201|1000016045|content://media/external/images/media/1000016045|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0016.jpg|image/jpeg|1600|1022|0|344154||1674303879|1674303879798|0|0|0|0|||||||| +202|1000016021|content://media/external/images/media/1000016021|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0008.jpg|image/jpeg|1600|900|0|154562||1674303878|1674303878338|0|0|0|0|||||||| +203|1000016024|content://media/external/images/media/1000016024|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0009.jpg|image/jpeg|1600|900|0|139737||1674303878|1674303878554|0|0|0|0|||||||| +204|1000016027|content://media/external/images/media/1000016027|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0010.jpg|image/jpeg|1600|900|0|150605||1674303878|1674303878751|0|0|0|0|||||||| +205|1000016030|content://media/external/images/media/1000016030|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0011.jpg|image/jpeg|1600|900|0|267627||1674303878|1674303878999|0|0|0|0|||||||| +206|1000016006|content://media/external/images/media/1000016006|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0002.jpg|image/jpeg|1077|744|0|221225||1674293969|1674293970256|0|0|0|0|||||||| +207|1000016002|content://media/external/images/media/1000016002|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-21-08-12-20-427_com.whatsapp.jpg|image/jpeg|1080|2400|0|877542||1674285140|1674285140827|0|0|0|0|||||||| +208|1000015992|content://media/external/images/media/1000015992|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0014.jpg|image/jpeg|1599|899|0|176257||1674236611|1674236612466|0|0|0|0|||||||| +209|1000015979|content://media/external/images/media/1000015979|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-20-17-03-25-750_com.google.android.googlequicksearchbox.jpg|image/jpeg|1080|2400|0|538677||1674230606|1674230606173|0|0|0|0|||||||| +210|1000015977|content://media/external/images/media/1000015977|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-20-16-58-30-737_com.google.android.googlequicksearchbox.jpg|image/jpeg|1080|2400|0|697657||1674230311|1674230311126|0|0|0|0|||||||| +211|1000015975|content://media/external/images/media/1000015975|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0011.jpg|image/jpeg|576|438|0|97381||1674224967|1674224968231|0|0|0|0|||||||| +212|1000015969|content://media/external/images/media/1000015969|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0010.jpg|image/jpeg|1600|1200|0|210277||1674222108|1674222109049|0|0|0|0|||||||| +213|1000015963|content://media/external/images/media/1000015963|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0008.jpg|image/jpeg|1600|1200|0|250782||1674222107|1674222108141|0|0|0|0|||||||| +214|1000015966|content://media/external/images/media/1000015966|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0009.jpg|image/jpeg|1200|1600|0|137968||1674222108|1674222108871|0|0|0|0|||||||| +215|1000015958|content://media/external/images/media/1000015958|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0007.jpg|image/jpeg|1200|1600|0|170289||1674213407|1674213408569|0|0|0|0|||||||| +216|1000015952|content://media/external/images/media/1000015952|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0005.jpg|image/jpeg|1600|1200|0|155415||1674213231|1674213232220|0|0|0|0|||||||| +217|1000015955|content://media/external/images/media/1000015955|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0006.jpg|image/jpeg|1600|1200|0|186524||1674213232|1674213232575|0|0|0|0|||||||| +218|1000015949|content://media/external/images/media/1000015949|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0004.jpg|image/jpeg|1600|900|0|221434||1674212933|1674212934476|0|0|0|0|||||||| +219|1000015946|content://media/external/images/media/1000015946|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0003.jpg|image/jpeg|1536|2048|0|523700||1674211631|1674211633082|0|0|0|0|||||||| +220|1000015943|content://media/external/images/media/1000015943|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0002.jpg|image/jpeg|1200|1599|0|232799||1674206260|1674206261517|0|0|0|0|||||||| +221|1000015932|content://media/external/images/media/1000015932|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0000.jpg|image/jpeg|1600|1200|0|394567||1674169202|1674169202763|0|0|0|0|||||||| +222|1000015922|content://media/external/images/media/1000015922|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-19-17-45-28-381_com.whatsapp.jpg|image/jpeg|1080|2400|0|782571||1674146728|1674146728575|0|0|0|0|||||||| +223|1000015918|content://media/external/images/media/1000015918|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230119-WA0003.jpg|image/jpeg|1360|672|0|130525||1674123829|1674123830280|0|0|0|0|||||||| +224|1000015915|content://media/external/images/media/1000015915|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230119-WA0002.jpg|image/jpeg|1599|899|0|89542||1674112917|1674112918543|0|0|0|0|||||||| +225|1000015906|content://media/external/images/media/1000015906|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230119-WA0001.jpg|image/jpeg|2048|1536|0|1935346||1674085186|1674085188555|0|0|0|0|||||||| +226|1000015904|content://media/external/images/media/1000015904|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230119-WA0000.jpg|image/jpeg|2048|1536|0|1701010||1674085180|1674085183737|0|0|0|0|||||||| +227|1000015902|content://media/external/images/media/1000015902|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230118-WA0003.jpg|image/jpeg|1080|1228|0|101401||1674061368|1674061369232|0|0|0|0|||||||| +228|1000015900|content://media/external/images/media/1000015900|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230118-WA0002.jpg|image/jpeg|1081|720|0|90568||1674059417|1674059417495|0|0|0|0|||||||| +229|1000015892|content://media/external/images/media/1000015892|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230118-WA0001.jpg|image/jpeg|1368|1824|0|265395||1674031529|1674031530423|0|0|0|0|||||||| +230|1000015889|content://media/external/images/media/1000015889|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230118-WA0000.jpg|image/jpeg|1599|899|0|171611||1674022104|1674022105563|0|0|0|0|||||||| +231|1000015864|content://media/external/images/media/1000015864|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230117-WA0000.jpg|image/jpeg|640|526|0|47401||1673968819|1673968820064|0|0|0|0|||||||| +232|1000015841|content://media/external/images/media/1000015841|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0007.jpg|image/jpeg|1080|706|0|114070||1673877202|1673877202988|0|0|0|0|||||||| +233|1000015838|content://media/external/images/media/1000015838|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0006.jpg|image/jpeg|899|1599|0|149168||1673876068|1673876072508|0|0|0|0|||||||| +234|1000015833|content://media/external/images/media/1000015833|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0004.jpg|image/jpeg|1024|554|0|32481||1673874218|1673874219438|0|0|0|0|||||||| +235|1000015830|content://media/external/images/media/1000015830|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0003.jpg|image/jpeg|1532|2048|0|207521||1673872396|1673872397086|0|0|0|0|||||||| +236|1000015827|content://media/external/images/media/1000015827|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0002.jpg|image/jpeg|2048|1536|0|1886351||1673865400|1673865401489|0|0|0|0|||||||| +237|1000015824|content://media/external/images/media/1000015824|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0001.jpg|image/jpeg|1532|2048|0|212262||1673859460|1673859461273|0|0|0|0|||||||| +238|1000015821|content://media/external/images/media/1000015821|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0000.jpg|image/jpeg|1532|2048|0|285702||1673859459|1673859460583|0|0|0|0|||||||| +239|1000015790|content://media/external/images/media/1000015790|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-15-11-15-38-814_lockscreen.jpg|image/jpeg|1080|2400|0|368060||1673777739|1673777739560|0|0|0|0|||||||| +240|1000015789|content://media/external/images/media/1000015789|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-15-11-15-33-576_com.google.android.apps.maps.jpg|image/jpeg|1080|2400|0|429185||1673777733|1673777733956|0|0|0|0|||||||| +241|1000015786|content://media/external/images/media/1000015786|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230115-WA0002.jpg|image/jpeg|2048|1536|0|212868||1673775901|1673775905784|0|0|0|0|||||||| +242|1000015781|content://media/external/images/media/1000015781|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230115-WA0001.jpg|image/jpeg|203|231|0|11468||1673770443|1673770445022|0|0|0|0|||||||| +243|1000015768|content://media/external/images/media/1000015768|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0026.jpg|image/jpeg|959|1600|0|180495||1673714996|1673714997037|0|0|0|0|||||||| +244|1000015763|content://media/external/images/media/1000015763|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0025.jpg|image/jpeg|1296|598|0|100880||1673700295|1673700297369|0|0|0|0|||||||| +245|1000015760|content://media/external/images/media/1000015760|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0024.jpg|image/jpeg|1201|1600|0|214915||1673700236|1673700240074|0|0|0|0|||||||| +246|1000015756|content://media/external/images/media/1000015756|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0023.jpg|image/jpeg|1024|845|0|85090||1673696874|1673696875105|0|0|0|0|||||||| +247|1000015753|content://media/external/images/media/1000015753|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0022.jpg|image/jpeg|2048|1532|0|241557||1673696856|1673696866561|0|0|0|0|||||||| +248|1000015731|content://media/external/images/media/1000015731|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0015.jpg|image/jpeg|1197|1600|0|111857||1673691079|1673691079534|0|0|0|0|||||||| +249|1000015728|content://media/external/images/media/1000015728|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0014.jpg|image/jpeg|1197|1600|0|97514||1673691077|1673691078564|0|0|0|0|||||||| +250|1000015725|content://media/external/images/media/1000015725|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0013.jpg|image/jpeg|1197|1600|0|116731||1673691075|1673691077410|0|0|0|0|||||||| +251|1000015722|content://media/external/images/media/1000015722|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0012.jpg|image/jpeg|1197|1600|0|111985||1673690781|1673690781914|0|0|0|0|||||||| +252|1000015716|content://media/external/images/media/1000015716|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0010.jpg|image/jpeg|1197|1600|0|90745||1673690775|1673690776224|0|0|0|0|||||||| +253|1000015719|content://media/external/images/media/1000015719|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0011.jpg|image/jpeg|1197|1600|0|83709||1673690776|1673690776462|0|0|0|0|||||||| +254|1000015713|content://media/external/images/media/1000015713|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0009.jpg|image/jpeg|1197|1600|0|88981||1673690775|1673690775763|0|0|0|0|||||||| +255|1000015710|content://media/external/images/media/1000015710|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0008.jpg|image/jpeg|1197|1600|0|361105||1673690606|1673690606805|0|0|0|0|||||||| +256|1000015707|content://media/external/images/media/1000015707|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0007.jpg|image/jpeg|1197|1600|0|380536||1673690585|1673690586120|0|0|0|0|||||||| +257|1000015704|content://media/external/images/media/1000015704|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0006.jpg|image/jpeg|1197|1600|0|349570||1673690581|1673690582585|0|0|0|0|||||||| +258|1000015701|content://media/external/images/media/1000015701|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0005.jpg|image/jpeg|1197|1600|0|327878||1673690580|1673690581752|0|0|0|0|||||||| +259|1000015690|content://media/external/images/media/1000015690|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0002.jpg|image/jpeg|320|209|0|8333||1673684960|1673684961902|0|0|0|0|||||||| +260|1000015645|content://media/external/images/media/1000015645|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230113-WA0005.jpg|image/jpeg|502|1600|0|125408||1673620531|1673620532896|0|0|0|0|||||||| +261|1000015640|content://media/external/images/media/1000015640|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230113-WA0003.jpg|image/jpeg|2048|1532|0|312660||1673616654|1673616655224|0|0|0|0|||||||| +262|1000015637|content://media/external/images/media/1000015637|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230113-WA0002.jpg|image/jpeg|1600|1197|0|281020||1673612977|1673612977846|0|0|0|0|||||||| +263|1000015610|content://media/external/images/media/1000015610|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0009.jpg|image/jpeg|1080|1417|0|99632||1673558021|1673558021475|0|0|0|0|||||||| +264|1000015607|content://media/external/images/media/1000015607|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0008.jpg|image/jpeg|795|1201|0|85837||1673557874|1673557875189|0|0|0|0|||||||| +265|1000015604|content://media/external/images/media/1000015604|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0007.jpg|image/jpeg|854|1534|0|126465||1673557761|1673557761865|0|0|0|0|||||||| +266|1000015601|content://media/external/images/media/1000015601|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0006.jpg|image/jpeg|1080|1490|0|138509||1673557667|1673557667993|0|0|0|0|||||||| +267|1000015598|content://media/external/images/media/1000015598|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0005.jpg|image/jpeg|1076|725|0|53171||1673557204|1673557205303|0|0|0|0|||||||| +268|1000015593|content://media/external/images/media/1000015593|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-12-15-52-44-667_com.google.android.googlequicksearchbox.jpg|image/jpeg|1080|2400|0|589252||1673535165|1673535165067|0|0|0|0|||||||| +269|1000015590|content://media/external/images/media/1000015590|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-12-14-08-03-210-edit_com.android.chrome.jpg|image/jpeg|1072|1185|0|267846||1673528883|1673528883295|0|0|0|0|||||||| +270|1000015582|content://media/external/images/media/1000015582|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0003.jpg|image/jpeg|899|1599|0|107940||1673519032|1673519033628|0|0|0|0|||||||| +271|1000015572|content://media/external/images/media/1000015572|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0000.jpg|image/jpeg|921|2048|0|112624||1673509806|1673509807753|0|0|0|0|||||||| +272|1000015556|content://media/external/images/media/1000015556|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0006.jpg|image/jpeg|1500|2000|0|114956||1673457161|1673457162123|0|0|0|0|||||||| +273|1000015559|content://media/external/images/media/1000015559|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0007.jpg|image/jpeg|1500|2000|0|161006||1673457162|1673457162854|0|0|0|0|||||||| +274|1000015550|content://media/external/images/media/1000015550|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0004.jpg|image/jpeg|1500|2000|0|236227||1673457160|1673457161421|0|0|0|0|||||||| +275|1000015553|content://media/external/images/media/1000015553|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0005.jpg|image/jpeg|1500|2000|0|193297||1673457161|1673457161901|0|0|0|0|||||||| +276|1000015544|content://media/external/images/media/1000015544|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0002.jpg|image/jpeg|1500|2000|0|134382||1673457159|1673457160279|0|0|0|0|||||||| +277|1000015547|content://media/external/images/media/1000015547|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0003.jpg|image/jpeg|1500|2000|0|195002||1673457160|1673457160885|0|0|0|0|||||||| +278|1000015542|content://media/external/images/media/1000015542|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-11-18-10-31-171-edit_com.booking.jpg|image/jpeg|1046|1456|0|516270||1673457031|1673457031220|0|0|0|0|||||||| +279|1000015536|content://media/external/images/media/1000015536|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0000.jpg|image/jpeg|720|1082|0|63176||1673421049|1673421050862|0|0|0|0|||||||| +280|1000015524|content://media/external/images/media/1000015524|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0009.jpg|image/jpeg|1024|728|0|85625||1673383092|1673383092932|0|0|0|0|||||||| +281|1000015237|content://media/external/images/media/1000015237|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0004.jpg|image/jpeg|940|788|0|114900||1672853377|1673378704623|0|0|0|0|||||||| +282|1000015501|content://media/external/images/media/1000015501|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0003.jpg|image/jpeg|1536|2048|0|294160||1673359585|1673359586258|0|0|0|0|||||||| +283|1000015495|content://media/external/images/media/1000015495|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0001.jpg|image/jpeg|1536|2048|0|348185||1673359203|1673359204489|0|0|0|0|||||||| +284|1000015498|content://media/external/images/media/1000015498|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0002.jpg|image/jpeg|1600|900|0|95236||1673359204|1673359204702|0|0|0|0|||||||| +285|1000015492|content://media/external/images/media/1000015492|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0000.jpg|image/jpeg|1600|900|0|195564||1673359203|1673359203942|0|0|0|0|||||||| +286|1000015483|content://media/external/images/media/1000015483|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230109-WA0001.jpg|image/jpeg|720|893|0|159019||1673297374|1673297375031|0|0|0|0|||||||| +287|1000015479|content://media/external/images/media/1000015479|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230109-WA0000.jpg|image/jpeg|1200|1599|0|209363||1673285043|1673285044470|0|0|0|0|||||||| +288|1000015464|content://media/external/images/media/1000015464|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-08-20-58-56-462_de.komoot.android.jpg|image/jpeg|1080|2400|0|753527||1673207936|1673207936870|0|0|0|0|||||||| +289|1000015462|content://media/external/images/media/1000015462|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-08-20-52-51-133_de.komoot.android.jpg|image/jpeg|1080|2400|0|880629||1673207571|1673207571570|0|0|0|0|||||||| +290|1000015456|content://media/external/images/media/1000015456|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0004.jpg|image/jpeg|1600|738|0|122148||1673205926|1673205932258|0|0|0|0|||||||| +291|1000015459|content://media/external/images/media/1000015459|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0005.jpg|image/jpeg|1200|1600|0|117862||1673205932|1673205932771|0|0|0|0|||||||| +292|1000015453|content://media/external/images/media/1000015453|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0003.jpg|image/jpeg|920|960|0|155022||1673189896|1673189898475|0|0|0|0|||||||| +293|1000015448|content://media/external/images/media/1000015448|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0002.jpg|image/jpeg|923|2048|0|111220||1673183532|1673183533467|0|0|0|0|||||||| +294|1000015445|content://media/external/images/media/1000015445|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0001.jpg|image/jpeg|2000|1500|0|279472||1673183525|1673183526994|0|0|0|0|||||||| +295|1000015444|content://media/external/images/media/1000015444|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-08-09-33-12-038_com.android.chrome.jpg|image/jpeg|2400|1080|0|257771||1673166792|1673166792465|0|0|0|0|||||||| +296|1000015443|content://media/external/images/media/1000015443|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-08-09-30-35-652-edit_com.android.chrome.jpg|image/jpeg|2400|1080|0|308340||1673166635|1673166635713|0|0|0|0|||||||| +297|1000015375|content://media/external/images/media/1000015375|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0016.jpg|image/jpeg|1200|1600|0|183299||1673013403|1673013408265|0|0|0|0|||||||| +298|1000015372|content://media/external/images/media/1000015372|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0015.jpg|image/jpeg|1200|1600|0|166318||1673013348|1673013373992|0|0|0|0|||||||| +299|1000015369|content://media/external/images/media/1000015369|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0014.jpg|image/jpeg|520|1156|0|89756||1673009671|1673009672090|0|0|0|0|||||||| +300|1000015366|content://media/external/images/media/1000015366|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0013.jpg|image/jpeg|1156|520|0|77586||1673009670|1673009671348|0|0|0|0|||||||| +301|1000015359|content://media/external/images/media/1000015359|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0011.jpg|image/jpeg|520|1156|0|103485||1673009629|1673009630659|0|0|0|0|||||||| +302|1000015349|content://media/external/images/media/1000015349|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0008.jpg|image/jpeg|520|1156|0|42584||1673009596|1673009597089|0|0|0|0|||||||| +303|1000015352|content://media/external/images/media/1000015352|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0009.jpg|image/jpeg|520|1156|0|37003||1673009597|1673009597713|0|0|0|0|||||||| +304|1000015340|content://media/external/images/media/1000015340|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0005.jpg|image/jpeg|1536|2048|0|402875||1673004785|1673004810191|0|0|0|0|||||||| +305|1000015337|content://media/external/images/media/1000015337|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0004.jpg|image/jpeg|1536|2048|0|338076||1673004748|1673004785178|0|0|0|0|||||||| +306|1000015332|content://media/external/images/media/1000015332|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0002.jpg|image/jpeg|650|865|0|86508||1673001097|1673001097517|0|0|0|0|||||||| +307|1000015329|content://media/external/images/media/1000015329|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0001.jpg|image/jpeg|720|1080|0|229541||1673001049|1673001049957|0|0|0|0|||||||| +308|1000015304|content://media/external/images/media/1000015304|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0000.jpg|image/jpeg|736|736|0|60937||1672992494|1672992567390|0|0|0|0|||||||| +309|1000015292|content://media/external/images/media/1000015292|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0005.jpg|image/jpeg|1200|1599|0|109452||1672947645|1672947646247|0|0|0|0|||||||| +310|1000015275|content://media/external/images/media/1000015275|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0004.jpg|image/jpeg|1024|768|0|80140||1672935928|1672935930306|0|0|0|0|||||||| +311|1000015272|content://media/external/images/media/1000015272|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0003.jpg|image/jpeg|1200|1600|0|137176||1672926562|1672926562810|0|0|0|0|||||||| +312|1000015269|content://media/external/images/media/1000015269|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0002.jpg|image/jpeg|945|2048|0|135954||1672921574|1672921575220|0|0|0|0|||||||| +313|1000015255|content://media/external/images/media/1000015255|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0001.jpg|image/jpeg|1197|1600|0|181580||1672911001|1672911002195|0|0|0|0|||||||| +314|1000015252|content://media/external/images/media/1000015252|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0000.jpg|image/jpeg|1052|473|0|75092||1672909632|1672909632781|0|0|0|0|||||||| +315|1000015239|content://media/external/images/media/1000015239|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0005.jpg|image/jpeg|1080|1169|0|146520||1672853685|1672853686023|0|0|0|0|||||||| +316|1000015231|content://media/external/images/media/1000015231|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0003.jpg|image/jpeg|520|1156|0|47987||1672843585|1672843585665|0|0|0|0|||||||| +317|1000015227|content://media/external/images/media/1000015227|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0002.jpg|image/jpeg|1280|958|0|40001||1672831901|1672831902399|0|0|0|0|||||||| +318|1000015223|content://media/external/images/media/1000015223|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0001.jpg|image/jpeg|1200|1599|0|229030||1672827143|1672827144340|0|0|0|0|||||||| +319|1000015220|content://media/external/images/media/1000015220|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0000.jpg|image/jpeg|1200|1600|0|397129||1672822797|1672822797943|0|0|0|0|||||||| +320|1000015214|content://media/external/images/media/1000015214|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0005.jpg|image/jpeg|768|1024|0|140508||1672772695|1672772696376|0|0|0|0|||||||| +321|1000015211|content://media/external/images/media/1000015211|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0004.jpg|image/jpeg|1052|473|0|24978||1672756246|1672756247272|0|0|0|0|||||||| +322|1000015208|content://media/external/images/media/1000015208|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0003.jpg|image/jpeg|721|1600|0|125898||1672753026|1672753027109|0|0|0|0|||||||| +323|1000015206|content://media/external/images/media/1000015206|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0002.jpg|image/jpeg|720|900|0|54633||1672750932|1672750932330|0|0|0|0|||||||| +324|1000015191|content://media/external/images/media/1000015191|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0000.jpg|image/jpeg|520|1156|0|33377||1672746626|1672746627360|0|0|0|0|||||||| +325|1000015172|content://media/external/images/media/1000015172|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230102-WA0005.jpg|image/jpeg|497|1046|0|52673||1672673892|1672673893036|0|0|0|0|||||||| +326|1000015169|content://media/external/images/media/1000015169|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230102-WA0004.jpg|image/jpeg|1536|2048|0|1894216||1672669547|1672669548039|0|0|0|0|||||||| +327|1000015166|content://media/external/images/media/1000015166|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230102-WA0003.jpg|image/jpeg|1824|1368|0|141671||1672669501|1672669502419|0|0|0|0|||||||| +328|1000015163|content://media/external/images/media/1000015163|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230102-WA0002.jpg|image/jpeg|1824|1368|0|203734||1672669489|1672669490568|0|0|0|0|||||||| +329|1000015152|content://media/external/images/media/1000015152|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-02-11-37-41-731_com.android.chrome.jpg|image/jpeg|1080|2400|0|841332||1672655862|1672655862251|0|0|0|0|||||||| +330|1000015140|content://media/external/images/media/1000015140|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0032.jpg|image/jpeg|1512|2016|0|396780||1672596875|1672596876140|0|0|0|0|||||||| +331|1000015137|content://media/external/images/media/1000015137|/storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-01-15-04-25-479_com.mi.globalbrowser.jpg|image/jpeg|1080|2400|0|470363||1672581865|1672581865969|0|0|0|0|||||||| +332|1000015134|content://media/external/images/media/1000015134|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0031.jpg|image/jpeg|1080|1344|0|81350||1672578227|1672578228416|0|0|0|0|||||||| +333|1000015119|content://media/external/images/media/1000015119|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0027.jpg|image/jpeg|1600|758|0|155176||1672573286|1672573286927|0|0|0|0|||||||| +334|1000015116|content://media/external/images/media/1000015116|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0026.jpg|image/jpeg|1080|1245|0|153881||1672569481|1672569481813|0|0|0|0|||||||| +335|1000015113|content://media/external/images/media/1000015113|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0025.jpg|image/jpeg|1078|1077|0|182344||1672569469|1672569469375|0|0|0|0|||||||| +336|1000015108|content://media/external/images/media/1000015108|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0023.jpg|image/jpeg|960|779|0|38324||1672569080|1672569080278|0|0|0|0|||||||| +337|1000015105|content://media/external/images/media/1000015105|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0022.jpg|image/jpeg|1080|1146|0|81549||1672564543|1672564544090|0|0|0|0|||||||| +338|1000015102|content://media/external/images/media/1000015102|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0021.jpg|image/jpeg|736|1308|0|73308||1672562809|1672562810257|0|0|0|0|||||||| +339|1000015099|content://media/external/images/media/1000015099|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0020.jpg|image/jpeg|900|1600|0|168435||1672547457|1672547457736|0|0|0|0|||||||| +340|1000015070|content://media/external/images/media/1000015070|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0013.jpg|image/jpeg|1080|1279|0|186362||1672530616|1672535102594|0|0|0|0|||||||| +341|1000015082|content://media/external/images/media/1000015082|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0017.jpg|image/jpeg|564|922|0|82952||1672531734|1672531734618|0|0|0|0|||||||| +342|1000015080|content://media/external/images/media/1000015080|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0016.jpg|image/jpeg|2048|1152|0|1538653||1672531528|1672531528799|0|0|0|0|||||||| +343|1000015078|content://media/external/images/media/1000015078|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0015.jpg|image/jpeg|960|542|0|107396||1672531292|1672531292203|0|0|0|0|||||||| +344|1000015075|content://media/external/images/media/1000015075|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0014.jpg|image/jpeg|735|481|0|141479||1672531213|1672531214366|0|0|0|0|||||||| +345|1000015047|content://media/external/images/media/1000015047|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0006.jpg|image/jpeg|900|1600|0|176672||1672528166|1672528166364|0|0|0|0|||||||| +346|1000015044|content://media/external/images/media/1000015044|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0005.jpg|image/jpeg|900|1600|0|173579||1672528161|1672528161580|0|0|0|0|||||||| +347|1000015033|content://media/external/images/media/1000015033|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0002.jpg|image/jpeg|2000|1500|0|272743||1672527857|1672527857282|0|0|0|0|||||||| +348|1000015030|content://media/external/images/media/1000015030|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0001.jpg|image/jpeg|2000|1500|0|335547||1672527839|1672527839613|0|0|0|0|||||||| +349|1000015027|content://media/external/images/media/1000015027|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0000.jpg|image/jpeg|2000|1500|0|316669||1672527828|1672527829227|0|0|0|0|||||||| +350|1000015011|content://media/external/images/media/1000015011|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0030.jpg|image/jpeg|1734|1734|0|341538||1672515855|1672525136561|0|0|0|0|||||||| +351|1000015020|content://media/external/images/media/1000015020|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0033.jpg|image/jpeg|1170|1447|0|540860||1672521548|1672521549374|0|0|0|0|||||||| +352|1000015017|content://media/external/images/media/1000015017|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0032.jpg|image/jpeg|1080|970|0|217530||1672518424|1672518496585|0|0|0|0|||||||| +353|1000015014|content://media/external/images/media/1000015014|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0031.jpg|image/jpeg|1734|1734|0|314835||1672515856|1672515856471|0|0|0|0|||||||| +354|1000015008|content://media/external/images/media/1000015008|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0029.jpg|image/jpeg|1734|1734|0|368255||1672515854|1672515855701|0|0|0|0|||||||| +355|1000015005|content://media/external/images/media/1000015005|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0028.jpg|image/jpeg|2048|2048|0|325031||1672515834|1672515835266|0|0|0|0|||||||| +356|1000015002|content://media/external/images/media/1000015002|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0027.jpg|image/jpeg|2048|2048|0|346769||1672515827|1672515834274|0|0|0|0|||||||| +357|1000014999|content://media/external/images/media/1000014999|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0026.jpg|image/jpeg|2000|1500|0|336779||1672515464|1672515465549|0|0|0|0|||||||| +358|1000014992|content://media/external/images/media/1000014992|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0025.jpg|image/jpeg|771|960|0|209109||1672511828|1672511828528|0|0|0|0|||||||| +359|1000014989|content://media/external/images/media/1000014989|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0024.jpg|image/jpeg|564|564|0|6330||1672511806|1672511809379|0|0|0|0|||||||| +360|1000014986|content://media/external/images/media/1000014986|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0023.jpg|image/jpeg|1200|1600|0|188547||1672511355|1672511356599|0|0|0|0|||||||| +361|1000014973|content://media/external/images/media/1000014973|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0019.jpg|image/jpeg|270|1169|0|17220||1672506432|1672506433180|0|0|0|0|||||||| +362|1000014968|content://media/external/images/media/1000014968|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0017.jpg|image/jpeg|1051|465|0|19862||1672506086|1672506086984|0|0|0|0|||||||| +363|1000014965|content://media/external/images/media/1000014965|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0016.jpg|image/jpeg|500|333|0|92739||1672505387|1672505387377|0|0|0|0|||||||| +364|1000014960|content://media/external/images/media/1000014960|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0014.jpg|image/jpeg|729|479|0|76057||1672504342|1672504342915|0|0|0|0|||||||| +365|1000014959|content://media/external/images/media/1000014959|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-31-17-12-33-972_com.google.android.youtube.jpg|image/jpeg|1080|2400|0|624537||1672503154|1672503154474|0|0|0|0|||||||| +366|1000014957|content://media/external/images/media/1000014957|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0012.jpeg|image/jpeg|3840|2160|0|1074065||1672502012|1672502012310|1672502012254|0|0|0|||||||| +367|1000014954|content://media/external/images/media/1000014954|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0011.jpg|image/jpeg|1532|2048|0|233454||1672499456|1672499457595|0|0|0|0|||||||| +368|1000014952|content://media/external/images/media/1000014952|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0010.jpg|image/jpeg|1078|1095|0|155144||1672498550|1672498551123|0|0|0|0|||||||| +369|1000014949|content://media/external/images/media/1000014949|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0009.jpg|image/jpeg|1080|1333|0|191683||1672498452|1672498477321|0|0|0|0|||||||| +370|1000014947|content://media/external/images/media/1000014947|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0008.jpg|image/jpeg|1080|1383|0|245318||1672496639|1672496639584|0|0|0|0|||||||| +371|1000014945|content://media/external/images/media/1000014945|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0007.jpg|image/jpeg|663|364|0|53268||1672496027|1672496028069|0|0|0|0|||||||| +372|1000014941|content://media/external/images/media/1000014941|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0005.jpg|image/jpeg|1041|1431|0|116054||1672494697|1672494697971|0|0|0|0|||||||| +373|1000014938|content://media/external/images/media/1000014938|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0004.jpg|image/jpeg|1080|709|0|59554||1672494492|1672494492777|0|0|0|0|||||||| +374|1000014935|content://media/external/images/media/1000014935|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0003.jpg|image/jpeg|735|917|0|123709||1672494350|1672494350982|0|0|0|0|||||||| +375|1000014932|content://media/external/images/media/1000014932|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0002.jpg|image/jpeg|899|1599|0|128631||1672493941|1672493941849|0|0|0|0|||||||| +376|1000014924|content://media/external/images/media/1000014924|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0000.jpg|image/jpeg|579|1024|0|306019||1672484485|1672484485742|0|0|0|0|||||||| +377|1000014911|content://media/external/images/media/1000014911|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221230-WA0012.jpg|image/jpeg|720|888|0|103903||1672435925|1672435926524|0|0|0|0|||||||| +378|1000014908|content://media/external/images/media/1000014908|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221230-WA0011.jpg|image/jpeg|1536|2048|0|227194||1672431492|1672431492995|0|0|0|0|||||||| +379|1000014881|content://media/external/images/media/1000014881|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20221230-WA0005.jpg|image/jpeg|1532|2048|0|412362||1672406247|1672406248214|0|0|0|0|||||||| +380|1000014878|content://media/external/images/media/1000014878|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20221230-WA0004.jpg|image/jpeg|1532|2048|0|435222||1672405505|1672405506493|0|0|0|0|||||||| +381|1000014864|content://media/external/images/media/1000014864|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20221230-WA0002.jpeg|image/jpeg|3840|2160|0|957552||1672393116|1672393116342|1672393116174|0|0|0|||||||| +382|1000014858|content://media/external/images/media/1000014858|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221230-WA0000.jpg|image/jpeg|1197|1600|0|288245||1672391602|1672391603700|0|0|0|0|||||||| +383|1000014844|content://media/external/images/media/1000014844|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221229-WA0001.jpg|image/jpeg|526|526|0|63535||1672339764|1672339764742|0|0|0|0|||||||| +384|1000014805|content://media/external/images/media/1000014805|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0007.jpg|image/jpeg|720|986|0|57520||1672258465|1672258476013|0|0|0|0|||||||| +385|1000014799|content://media/external/images/media/1000014799|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0006.jpg|image/jpeg|1920|1080|0|139770||1672243334|1672243337017|0|0|0|0|||||||| +386|1000014796|content://media/external/images/media/1000014796|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0005.jpg|image/jpeg|2048|1532|0|268827||1672235623|1672235623614|0|0|0|0|||||||| +387|1000014793|content://media/external/images/media/1000014793|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0004.jpg|image/jpeg|1200|1600|0|247435||1672230829|1672230830028|0|0|0|0|||||||| +388|1000014790|content://media/external/images/media/1000014790|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0003.jpg|image/jpeg|1219|1600|0|180625||1672229735|1672229736574|0|0|0|0|||||||| +389|1000014779|content://media/external/images/media/1000014779|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0000.jpg|image/jpeg|550|678|0|200472||1672217354|1672217440326|0|0|0|0|||||||| +390|1000014770|content://media/external/images/media/1000014770|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0009.jpg|image/jpeg|1500|2000|0|288437||1672170730|1672170731904|0|0|0|0|||||||| +391|1000014767|content://media/external/images/media/1000014767|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0008.jpg|image/jpeg|1500|2000|0|202247||1672170728|1672170728797|0|0|0|0|||||||| +392|1000014764|content://media/external/images/media/1000014764|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0007.jpg|image/jpeg|1500|2000|0|293742||1672170722|1672170723190|0|0|0|0|||||||| +393|1000014761|content://media/external/images/media/1000014761|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0006.jpg|image/jpeg|1080|1331|0|103357||1672170707|1672170707899|0|0|0|0|||||||| +394|1000014758|content://media/external/images/media/1000014758|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0005.jpg|image/jpeg|1200|1600|0|159910||1672170704|1672170705067|0|0|0|0|||||||| +395|1000014755|content://media/external/images/media/1000014755|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0004.jpg|image/jpeg|712|895|0|120734||1672157265|1672157265887|0|0|0|0|||||||| +396|1000014752|content://media/external/images/media/1000014752|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0003.jpg|image/jpeg|1080|1080|0|195221||1672156111|1672156112246|0|0|0|0|||||||| +397|1000014749|content://media/external/images/media/1000014749|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0002.jpg|image/jpeg|1196|1600|0|106103||1672145341|1672145342679|0|0|0|0|||||||| +398|1000014746|content://media/external/images/media/1000014746|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0001.jpg|image/jpeg|899|1599|0|86010||1672143410|1672143411507|0|0|0|0|||||||| +399|1000014744|content://media/external/images/media/1000014744|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0000.jpg|image/jpeg|369|570|0|86266||1672139550|1672139551421|0|0|0|0|||||||| +400|1000013665|content://media/external/images/media/1000013665|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221205-WA0002.jpg|image/jpeg|768|1024|0|58541||1670255637|1672126208466|0|0|0|0|||||||| +401|1000014723|content://media/external/images/media/1000014723|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0009.jpg|image/jpeg|1600|1066|0|352754||1672066420|1672079219052|0|0|0|0|||||||| +402|1000014725|content://media/external/images/media/1000014725|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0010.jpg|image/jpeg|1600|1066|0|316915||1672066421|1672066422047|0|0|0|0|||||||| +403|1000014713|content://media/external/images/media/1000014713|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0002.jpg|image/jpeg|1080|1080|0|263179||1672057489|1672057491548|0|0|0|0|||||||| +404|1000014710|content://media/external/images/media/1000014710|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0001.jpg|image/jpeg|1536|2048|0|244777||1672054667|1672054667548|0|0|0|0|||||||| +405|1000014707|content://media/external/images/media/1000014707|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0000.jpg|image/jpeg|1280|958|0|69787||1672052299|1672052299404|0|0|0|0|||||||| +406|1000014680|content://media/external/images/media/1000014680|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0033.jpg|image/jpeg|626|413|0|110283||1671987309|1671987309856|0|0|0|0|||||||| +407|1000014677|content://media/external/images/media/1000014677|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0032.jpg|image/jpeg|298|444|0|16349||1671986795|1671986795659|0|0|0|0|||||||| +408|1000014672|content://media/external/images/media/1000014672|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0030.jpg|image/jpeg|1024|694|0|33777||1671985702|1671985702765|0|0|0|0|||||||| +409|1000014667|content://media/external/images/media/1000014667|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0028.jpg|image/jpeg|900|1600|0|183880||1671984318|1671984319455|0|0|0|0|||||||| +410|1000014664|content://media/external/images/media/1000014664|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0027.jpg|image/jpeg|160|160|0|3732||1671983895|1671983895839|0|0|0|0|||||||| +411|1000014661|content://media/external/images/media/1000014661|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0026.jpg|image/jpeg|800|576|0|44439||1671981713|1671981713795|0|0|0|0|||||||| +412|1000014653|content://media/external/images/media/1000014653|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0024.jpg|image/jpeg|1153|2048|0|185747||1671970739|1671970739960|0|0|0|0|||||||| +413|1000014651|content://media/external/images/media/1000014651|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0023.jpg|image/jpeg|1024|512|0|59196||1671970063|1671970063587|0|0|0|0|||||||| +414|1000014648|content://media/external/images/media/1000014648|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0022.jpg|image/jpeg|1200|1600|0|217045||1671968517|1671968517871|0|0|0|0|||||||| +415|1000014645|content://media/external/images/media/1000014645|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0021.jpg|image/jpeg|1053|601|0|64203||1671967591|1671967591493|0|0|0|0|||||||| +416|1000014637|content://media/external/images/media/1000014637|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0019.jpg|image/jpeg|1200|1599|0|391600||1671963716|1671963720245|0|0|0|0|||||||| +417|1000014635|content://media/external/images/media/1000014635|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0018.jpg|image/jpeg|538|541|0|45613||1671963305|1671963305433|0|0|0|0|||||||| +418|1000014628|content://media/external/images/media/1000014628|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0016.jpg|image/jpeg|862|1143|0|22570||1671961491|1671961491960|0|0|0|0|||||||| +419|1000014625|content://media/external/images/media/1000014625|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0015.jpg|image/jpeg|899|1599|0|205575||1671961449|1671961450209|0|0|0|0|||||||| +420|1000014617|content://media/external/images/media/1000014617|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0012.jpg|image/jpeg|1080|1319|0|148420||1671959067|1671959068230|0|0|0|0|||||||| +421|1000014610|content://media/external/images/media/1000014610|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0010.jpg|image/jpeg|726|883|0|16471||1671957710|1671957711084|0|0|0|0|||||||| +422|1000014602|content://media/external/images/media/1000014602|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0008.jpg|image/jpeg|2048|1366|0|1424198||1671956264|1671956266499|0|0|0|0|||||||| +423|1000014594|content://media/external/images/media/1000014594|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0005.jpg|image/jpeg|1080|830|0|134430||1671954809|1671954809575|0|0|0|0|||||||| +424|1000014592|content://media/external/images/media/1000014592|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0004.jpg|image/jpeg|720|1280|0|157385||1671954660|1671954661168|0|0|0|0|||||||| +425|1000014586|content://media/external/images/media/1000014586|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0002.jpg|image/jpeg|520|1156|0|39618||1671954129|1671954130324|0|0|0|0|||||||| +426|1000014567|content://media/external/images/media/1000014567|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0000.jpg|image/jpeg|1200|1600|0|141075||1671923835|1671923835980|0|0|0|0|||||||| +427|1000014564|content://media/external/images/media/1000014564|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0023.jpg|image/jpeg|736|1308|0|229870||1671922632|1671922633381|0|0|0|0|||||||| +428|1000014561|content://media/external/images/media/1000014561|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0022.jpg|image/jpeg|2048|1532|0|192700||1671915842|1671915843553|0|0|0|0|||||||| +429|1000014558|content://media/external/images/media/1000014558|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0021.jpg|image/jpeg|1197|1600|0|96391||1671914764|1671914765545|0|0|0|0|||||||| +430|1000014549|content://media/external/images/media/1000014549|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0020.jpg|image/jpeg|1200|1600|0|216290||1671911644|1671911645366|0|0|0|0|||||||| +431|1000014546|content://media/external/images/media/1000014546|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0019.jpg|image/jpeg|1370|1600|0|259288||1671906393|1671906408671|0|0|0|0|||||||| +432|1000014539|content://media/external/images/media/1000014539|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0017.jpg|image/jpeg|1200|1600|0|265795||1671904640|1671904641540|0|0|0|0|||||||| +433|1000014532|content://media/external/images/media/1000014532|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0015.jpg|image/jpeg|700|500|0|73335||1671903369|1671903369230|0|0|0|0|||||||| +434|1000014529|content://media/external/images/media/1000014529|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0014.jpg|image/jpeg|1080|1239|0|94783||1671903308|1671903309199|0|0|0|0|||||||| +435|1000014523|content://media/external/images/media/1000014523|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0011.jpg|image/jpeg|544|960|0|63063||1671899550|1671899550454|0|0|0|0|||||||| +436|1000014520|content://media/external/images/media/1000014520|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0010.jpg|image/jpeg|921|2048|0|214874||1671895590|1671895590754|0|0|0|0|||||||| +437|1000014508|content://media/external/images/media/1000014508|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0009.jpg|image/jpeg|320|320|0|24637||1671888208|1671888208757|0|0|0|0|||||||| +438|1000014501|content://media/external/images/media/1000014501|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0007.jpg|image/jpeg|1080|1298|0|120018||1671881552|1671881552837|0|0|0|0|||||||| +439|1000014491|content://media/external/images/media/1000014491|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0005.jpg|image/jpeg|738|1600|0|109677||1671873638|1671873639639|0|0|0|0|||||||| +440|1000014486|content://media/external/images/media/1000014486|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0003.jpg|image/jpeg|750|730|0|305040||1671870871|1671870872163|0|0|0|0|||||||| +441|1000014484|content://media/external/images/media/1000014484|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-24-09-28-28-235_com.booking.jpg|image/jpeg|1080|2400|0|797646||1671870508|1671870508564|0|0|0|0|||||||| +442|1000014460|content://media/external/images/media/1000014460|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0013.jpg|image/jpeg|720|1600|0|53692||1671819768|1671819769074|0|0|0|0|||||||| +443|1000014457|content://media/external/images/media/1000014457|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0012.jpg|image/jpeg|1536|2048|0|2664485||1671816800|1671816802352|0|0|0|0|||||||| +444|1000014435|content://media/external/images/media/1000014435|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0008.jpg|image/jpeg|400|368|0|29840||1671805115|1671805115650|0|0|0|0|||||||| +445|1000014418|content://media/external/images/media/1000014418|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0006.jpg|image/jpeg|899|1599|0|76259||1671793001|1671793021837|0|0|0|0|||||||| +446|1000014415|content://media/external/images/media/1000014415|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0005.jpg|image/jpeg|1600|1197|0|147305||1671792949|1671793001290|0|0|0|0|||||||| +447|1000014397|content://media/external/images/media/1000014397|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0002.jpg|image/jpeg|2048|1536|0|2042448||1671773247|1671773247578|0|0|0|0|||||||| +448|1000014395|content://media/external/images/media/1000014395|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0001.jpg|image/jpeg|2048|1536|0|1997527||1671773245|1671773245863|0|0|0|0|||||||| +449|1000014392|content://media/external/images/media/1000014392|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0000.jpg|image/jpeg|1600|1030|0|247914||1671773243|1671773244282|0|0|0|0|||||||| +450|1000014377|content://media/external/images/media/1000014377|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-22-10-29-44-242_com.whatsapp.jpg|image/jpeg|1080|2400|0|707617||1671701384|1671701384437|0|0|0|0|||||||| +451|1000014373|content://media/external/images/media/1000014373|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221222-WA0003.jpg|image/jpeg|921|2048|0|137283||1671696599|1671696614253|0|0|0|0|||||||| +452|1000014371|content://media/external/images/media/1000014371|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221222-WA0002.jpg|image/jpeg|1536|2048|0|1796251||1671696114|1671696114985|0|0|0|0|||||||| +453|1000014358|content://media/external/images/media/1000014358|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221222-WA0000.jpg|image/jpeg|1536|2048|0|1767770||1671696111|1671696112332|0|0|0|0|||||||| +454|1000014363|content://media/external/images/media/1000014363|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221222-WA0001.jpg|image/jpeg|1080|899|0|110717||1671696112|1671696112882|0|0|0|0|||||||| +455|1000014323|content://media/external/images/media/1000014323|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221221-WA0006.jpg|image/jpeg|900|1600|0|369231||1671619294|1671619294845|0|0|0|0|||||||| +456|1000014320|content://media/external/images/media/1000014320|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221221-WA0005.jpg|image/jpeg|1536|2048|0|615210||1671618882|1671618883077|0|0|0|0|||||||| +457|1000014317|content://media/external/images/media/1000014317|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221221-WA0004.jpg|image/jpeg|945|2048|0|191010||1671612949|1671612950012|0|0|0|0|||||||| +458|1000014315|content://media/external/images/media/1000014315|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-25-47-884_com.whatsapp.jpg|image/jpeg|1080|2400|0|315004||1671607547|1671607547967|0|0|0|0|||||||| +459|1000014313|content://media/external/images/media/1000014313|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-25-26-051_it.caitalia.apphub.jpg|image/jpeg|1080|2400|0|369785||1671607526|1671607526143|0|0|0|0|||||||| +460|1000014311|content://media/external/images/media/1000014311|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-24-12-629_it.caitalia.apphub.jpg|image/jpeg|1080|2400|0|367741||1671607452|1671607452703|0|0|0|0|||||||| +461|1000014310|content://media/external/images/media/1000014310|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-24-01-666_it.caitalia.apphub.jpg|image/jpeg|1080|2400|0|368592||1671607441|1671607441967|0|0|0|0|||||||| +462|1000014308|content://media/external/images/media/1000014308|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-23-37-066_com.whatsapp.jpg|image/jpeg|1080|2400|0|350409||1671607417|1671607417531|0|0|0|0|||||||| +463|1000014263|content://media/external/images/media/1000014263|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221220-WA0003.jpg|image/jpeg|921|2048|0|71326||1671532404|1671532404719|0|0|0|0|||||||| +464|1000014259|content://media/external/images/media/1000014259|/storage/emulated/0/DCIM/Facebook/FB_IMG_1671532011809.jpg|image/jpeg|1080|720|0|44198||1671532011|1671532011849|0|0|0|0|||||||| +465|1000014258|content://media/external/images/media/1000014258|/storage/emulated/0/DCIM/Facebook/FB_IMG_1671531982691.jpg|image/jpeg|1080|720|0|53820||1671531982|1671531982737|0|0|0|0|||||||| +466|1000014257|content://media/external/images/media/1000014257|/storage/emulated/0/DCIM/Facebook/FB_IMG_1671531893046.jpg|image/jpeg|1080|720|0|40848||1671531893|1671531893089|0|0|0|0|||||||| +467|1000014238|content://media/external/images/media/1000014238|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221219-WA0003.jpg|image/jpeg|1076|1600|0|190119||1671431857|1671431858029|0|0|0|0|||||||| +468|1000014227|content://media/external/images/media/1000014227|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221219-WA0001.jpg|image/jpeg|2048|1536|0|2158972||1671407347|1671407348070|0|0|0|0|||||||| +469|1000014229|content://media/external/images/media/1000014229|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221219-WA0002.jpg|image/jpeg|2048|1536|0|1816669||1671407348|1671407348870|0|0|0|0|||||||| +470|1000014224|content://media/external/images/media/1000014224|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221219-WA0000.jpg|image/jpeg|1600|1197|0|208605||1671404816|1671404816821|0|0|0|0|||||||| +471|1000014219|content://media/external/images/media/1000014219|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0014.jpg|image/jpeg|600|398|0|15744||1671386799|1671386799932|0|0|0|0|||||||| +472|1000014206|content://media/external/images/media/1000014206|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0012.jpg|image/jpeg|1024|344|0|23780||1671380384|1671380384630|0|0|0|0|||||||| +473|1000014203|content://media/external/images/media/1000014203|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0011.jpg|image/jpeg|2048|1536|0|119855||1671378552|1671378552576|0|0|0|0|||||||| +474|1000014195|content://media/external/images/media/1000014195|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0008.jpg|image/jpeg|1376|986|0|663946||1671376109|1671376110185|0|0|0|0|||||||| +475|1000014182|content://media/external/images/media/1000014182|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0006.jpg|image/jpeg|1920|1080|0|631241||1671368081|1671368082189|0|0|0|0|||||||| +476|1000014179|content://media/external/images/media/1000014179|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0005.jpg|image/jpeg|1536|2048|0|152348||1671368080|1671368081101|0|0|0|0|||||||| +477|1000014173|content://media/external/images/media/1000014173|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0003.jpg|image/jpeg|2046|2048|0|279432||1671368079|1671368080216|0|0|0|0|||||||| +478|1000014176|content://media/external/images/media/1000014176|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0004.jpg|image/jpeg|1536|2048|0|146271||1671368080|1671368080620|0|0|0|0|||||||| +479|1000014170|content://media/external/images/media/1000014170|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0002.jpg|image/jpeg|1920|1080|0|274305||1671368078|1671368079198|0|0|0|0|||||||| +480|1000014163|content://media/external/images/media/1000014163|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0000.jpg|image/jpeg|520|1156|0|68733||1671353890|1671353890809|0|0|0|0|||||||| +481|1000014149|content://media/external/images/media/1000014149|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0011.jpg|image/jpeg|1080|1920|0|229941||1671306642|1671306642915|0|0|0|0|||||||| +482|1000014143|content://media/external/images/media/1000014143|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-17-16-45-06-683_com.whatsapp.jpg|image/jpeg|1080|2400|0|792848||1671291906|1671291906841|0|0|0|0|||||||| +483|1000014135|content://media/external/images/media/1000014135|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0008.jpg|image/jpeg|1532|2048|0|157077||1671288446|1671289490028|0|0|0|0|||||||| +484|1000014138|content://media/external/images/media/1000014138|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0009.jpg|image/jpeg|1532|2048|0|137012||1671289411|1671289470136|0|0|0|0|||||||| +485|1000014130|content://media/external/images/media/1000014130|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0007.jpg|image/jpeg|1197|1600|0|133796||1671285802|1671285803104|0|0|0|0|||||||| +486|1000014124|content://media/external/images/media/1000014124|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0005.jpg|image/jpeg|921|2048|0|141543||1671282059|1671282060121|0|0|0|0|||||||| +487|1000014127|content://media/external/images/media/1000014127|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0006.jpg|image/jpeg|1197|1600|0|114106||1671282060|1671282060442|0|0|0|0|||||||| +488|1000014117|content://media/external/images/media/1000014117|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0003.jpg|image/jpeg|520|1156|0|46082||1671275796|1671275796544|0|0|0|0|||||||| +489|1000014114|content://media/external/images/media/1000014114|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0002.jpg|image/jpeg|1052|473|0|26894||1671275077|1671275077566|0|0|0|0|||||||| +490|1000014111|content://media/external/images/media/1000014111|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0001.jpg|image/jpeg|611|856|0|63326||1671265942|1671265943272|0|0|0|0|||||||| +491|1000014108|content://media/external/images/media/1000014108|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0000.jpg|image/jpeg|921|2048|0|108386||1671264577|1671264578726|0|0|0|0|||||||| +492|1000014099|content://media/external/images/media/1000014099|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221216-WA0004.jpg|image/jpeg|720|1600|0|85678||1671212383|1671212383898|0|0|0|0|||||||| +493|1000014093|content://media/external/images/media/1000014093|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221216-WA0003.jpg|image/jpeg|720|960|0|39912||1671201284|1671201285147|0|0|0|0|||||||| +494|1000014088|content://media/external/images/media/1000014088|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-16-12-15-09-354_com.google.android.gm.jpg|image/jpeg|1080|2400|0|384085||1671189309|1671189309558|0|0|0|0|||||||| +495|1000014072|content://media/external/images/media/1000014072|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221216-WA0001.jpg|image/jpeg|921|2048|0|108715||1671182599|1671182599945|0|0|0|0|||||||| +496|1000014070|content://media/external/images/media/1000014070|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-16-08-44-41-276_com.ebay.mobile.jpg|image/jpeg|1080|2400|0|366996||1671176681|1671176681369|0|0|0|0|||||||| +497|1000014069|content://media/external/images/media/1000014069|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-16-08-43-19-381_com.ebay.mobile.jpg|image/jpeg|1080|2400|0|477958||1671176599|1671176599729|0|0|0|0|||||||| +498|1000014049|content://media/external/images/media/1000014049|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221215-WA0000.jpg|image/jpeg|1530|2040|0|271228||1671104604|1671104605048|0|0|0|0|||||||| +499|1000014027|content://media/external/images/media/1000014027|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-14-16-43-16-707-edit_com.whatsapp.jpg|image/jpeg|1080|2400|0|702513||1671032596|1671032596849|0|0|0|0|||||||| +500|1000014026|content://media/external/images/media/1000014026|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-14-16-43-01-341_com.whatsapp.jpg|image/jpeg|1080|2400|0|670514||1671032581|1671032581437|0|0|0|0|||||||| +501|1000013993|content://media/external/images/media/1000013993|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0007.jpg|image/jpeg|940|1600|0|141187||1670960409|1670960409639|0|0|0|0|||||||| +502|1000013990|content://media/external/images/media/1000013990|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0006.jpg|image/jpeg|1280|958|0|75636||1670959900|1670959905702|0|0|0|0|||||||| +503|1000013986|content://media/external/images/media/1000013986|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0005.jpg|image/jpeg|720|1004|0|217247||1670957815|1670957816306|0|0|0|0|||||||| +504|1000013983|content://media/external/images/media/1000013983|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0004.jpg|image/jpeg|1536|2048|0|346389||1670952827|1670952828273|0|0|0|0|||||||| +505|1000013975|content://media/external/images/media/1000013975|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0003.jpg|image/jpeg|1152|2048|0|480336||1670919598|1670919598972|0|0|0|0|||||||| +506|1000013972|content://media/external/images/media/1000013972|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0002.jpg|image/jpeg|1500|2000|0|166614||1670919538|1670919539039|0|0|0|0|||||||| +507|1000013969|content://media/external/images/media/1000013969|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0001.jpg|image/jpeg|921|2048|0|67602||1670916224|1670916225131|0|0|0|0|||||||| +508|1000013966|content://media/external/images/media/1000013966|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0000.jpg|image/jpeg|921|2048|0|75245||1670916223|1670916224127|0|0|0|0|||||||| +509|1000013952|content://media/external/images/media/1000013952|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221212-WA0002.jpg|image/jpeg|2048|815|0|163585||1670849397|1670849398162|0|0|0|0|||||||| +510|1000013955|content://media/external/images/media/1000013955|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221212-WA0003.jpg|image/jpeg|1532|2048|0|289560||1670849398|1670849398679|0|0|0|0|||||||| +511|1000013949|content://media/external/images/media/1000013949|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221212-WA0001.jpg|image/jpeg|1532|2048|0|193583||1670849396|1670849397895|0|0|0|0|||||||| +512|1000013946|content://media/external/images/media/1000013946|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221212-WA0000.jpg|image/jpeg|1532|2048|0|309775||1670849396|1670849396913|0|0|0|0|||||||| +513|1000013931|content://media/external/images/media/1000013931|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221211-WA0001.jpg|image/jpeg|921|2048|0|148188||1670753723|1670753725257|0|0|0|0|||||||| +514|1000013918|content://media/external/images/media/1000013918|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221211-WA0000.jpg|image/jpeg|899|1599|0|148536||1670716047|1670716089967|0|0|0|0|||||||| +515|1000013910|content://media/external/images/media/1000013910|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221210-WA0003.jpg|image/jpeg|1240|1748|0|114866||1670702861|1670702861758|0|0|0|0|||||||| +516|1000013898|content://media/external/images/media/1000013898|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221210-WA0001.jpg|image/jpeg|1131|1600|0|241255||1670680187|1670680187795|0|0|0|0|||||||| +517|1000013895|content://media/external/images/media/1000013895|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221210-WA0000.jpg|image/jpeg|1152|2048|0|217276||1670672814|1670672815460|0|0|0|0|||||||| +518|1000013847|content://media/external/images/media/1000013847|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0021.jpg|image/jpeg|576|1024|0|14922||1670514488|1670514489129|0|0|0|0|||||||| +519|1000013840|content://media/external/images/media/1000013840|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0019.jpg|image/jpeg|1080|1920|0|155147||1670512285|1670512286819|0|0|0|0|||||||| +520|1000013816|content://media/external/images/media/1000013816|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0016.jpg|image/jpeg|1024|768|0|65384||1670493366|1670493367128|0|0|0|0|||||||| +521|1000013819|content://media/external/images/media/1000013819|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0017.jpg|image/jpeg|1024|768|0|21270||1670493367|1670493367379|0|0|0|0|||||||| +522|1000013822|content://media/external/images/media/1000013822|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0018.jpg|image/jpeg|768|1024|0|39580||1670493367|1670493367628|0|0|0|0|||||||| +523|1000013807|content://media/external/images/media/1000013807|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0013.jpg|image/jpeg|1024|768|0|45283||1670493365|1670493366001|0|0|0|0|||||||| +524|1000013810|content://media/external/images/media/1000013810|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0014.jpg|image/jpeg|1024|768|0|90968||1670493366|1670493366288|0|0|0|0|||||||| +525|1000013813|content://media/external/images/media/1000013813|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0015.jpg|image/jpeg|768|1024|0|43948||1670493366|1670493366686|0|0|0|0|||||||| +526|1000013804|content://media/external/images/media/1000013804|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0012.jpg|image/jpeg|768|1024|0|40710||1670493364|1670493365589|0|0|0|0|||||||| +527|1000013801|content://media/external/images/media/1000013801|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0011.jpg|image/jpeg|1024|768|0|95492||1670493364|1670493364978|0|0|0|0|||||||| +528|1000013798|content://media/external/images/media/1000013798|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0010.jpg|image/jpeg|516|727|0|84678||1670487935|1670487936488|0|0|0|0|||||||| +529|1000013777|content://media/external/images/media/1000013777|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0006.jpg|image/jpeg|1536|2048|0|444563||1670455714|1670455715144|0|0|0|0|||||||| +530|1000013780|content://media/external/images/media/1000013780|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0007.jpg|image/jpeg|1536|2048|0|393308||1670455715|1670455715562|0|0|0|0|||||||| +531|1000013774|content://media/external/images/media/1000013774|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0005.jpg|image/jpeg|1536|2048|0|508881||1670455714|1670455714695|0|0|0|0|||||||| +532|1000013764|content://media/external/images/media/1000013764|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0002.jpg|image/jpeg|2048|1536|0|396961||1670455704|1670455705380|0|0|0|0|||||||| +533|1000013767|content://media/external/images/media/1000013767|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0003.jpg|image/jpeg|2048|1536|0|436756||1670455705|1670455705730|0|0|0|0|||||||| +534|1000013758|content://media/external/images/media/1000013758|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0000.jpg|image/jpeg|2048|1536|0|494155||1670455703|1670455704504|0|0|0|0|||||||| +535|1000013761|content://media/external/images/media/1000013761|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0001.jpg|image/jpeg|2048|1536|0|455648||1670455704|1670455704956|0|0|0|0|||||||| +536|1000013752|content://media/external/images/media/1000013752|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0011.jpg|image/jpeg|720|517|0|53499||1670440629|1670440630426|0|0|0|0|||||||| +537|1000013746|content://media/external/images/media/1000013746|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0010.jpg|image/jpeg|1500|1500|0|116824||1670434037|1670434037477|0|0|0|0|||||||| +538|1000013740|content://media/external/images/media/1000013740|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0008.jpg|image/jpeg|1200|1600|0|183374||1670426843|1670426843956|0|0|0|0|||||||| +539|1000013728|content://media/external/images/media/1000013728|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0005.jpg|image/jpeg|1532|2048|0|159116||1670421590|1670421591484|0|0|0|0|||||||| +540|1000013725|content://media/external/images/media/1000013725|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0004.jpg|image/jpeg|1640|1232|0|139938||1670421590|1670421590975|0|0|0|0|||||||| +541|1000013722|content://media/external/images/media/1000013722|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0003.jpg|image/jpeg|1532|2048|0|121163||1670421581|1670421582181|0|0|0|0|||||||| +542|1000013718|content://media/external/images/media/1000013718|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0001.jpg|image/jpeg|720|1280|0|506915||1670421070|1670421070623|0|0|0|0|||||||| +543|1000013720|content://media/external/images/media/1000013720|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0002.jpg|image/jpeg|720|813|0|297772||1670421070|1670421070973|0|0|0|0|||||||| +544|1000013716|content://media/external/images/media/1000013716|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0000.jpg|image/jpeg|1080|1091|0|400013||1670408367|1670408367718|0|0|0|0|||||||| +545|1000013701|content://media/external/images/media/1000013701|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221206-WA0001.jpg|image/jpeg|1920|1080|0|257126||1670364051|1670364052646|0|0|0|0|||||||| +546|1000013695|content://media/external/images/media/1000013695|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221206-WA0000.jpg|image/jpeg|2048|1532|0|534312||1670327789|1670327790184|0|0|0|0|||||||| +547|1000013685|content://media/external/images/media/1000013685|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-05-19-44-12-953_com.android.chrome.jpg|image/jpeg|1080|2400|0|515000||1670265853|1670265853082|0|0|0|0|||||||| +548|1000013668|content://media/external/images/media/1000013668|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221205-WA0003.jpg|image/jpeg|1024|1144|0|123427||1670258868|1670258869187|0|0|0|0|||||||| +549|1000013664|content://media/external/images/media/1000013664|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-05-14-15-29-274_lockscreen.jpg|image/jpeg|1080|2400|0|847083||1670246129|1670246129756|0|0|0|0|||||||| +550|1000013659|content://media/external/images/media/1000013659|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221205-WA0001.jpg|image/jpeg|1599|899|0|145569||1670223223|1670223224193|0|0|0|0|||||||| +551|1000013656|content://media/external/images/media/1000013656|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221205-WA0000.jpg|image/jpeg|921|2048|0|113780||1670222182|1670222183237|0|0|0|0|||||||| +552|1000013648|content://media/external/images/media/1000013648|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0009.jpg|image/jpeg|1037|776|0|242159||1670191208|1670191211395|0|0|0|0|||||||| +553|1000013645|content://media/external/images/media/1000013645|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0008.jpg|image/jpeg|1532|2048|0|161536||1670173690|1670173691385|0|0|0|0|||||||| +554|1000013642|content://media/external/images/media/1000013642|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0007.jpg|image/jpeg|1170|1318|0|144759||1670155648|1670155654464|0|0|0|0|||||||| +555|1000013638|content://media/external/images/media/1000013638|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0005.jpg|image/jpeg|819|1024|0|176400||1670153813|1670153814161|0|0|0|0|||||||| +556|1000013633|content://media/external/images/media/1000013633|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0003.jpg|image/jpeg|1600|1134|0|82956||1670147998|1670147998590|0|0|0|0|||||||| +557|1000013628|content://media/external/images/media/1000013628|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0001.jpg|image/jpeg|1532|2048|0|107368||1670147505|1670147506764|0|0|0|0|||||||| +558|1000013625|content://media/external/images/media/1000013625|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0000.jpg|image/jpeg|720|1080|0|128926||1670144148|1670144149256|0|0|0|0|||||||| +559|1000013602|content://media/external/images/media/1000013602|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221202-WA0007.jpeg|image/jpeg|3840|2160|90|1485067||1670015518|1670015518395|1670015518328|0|0|0|||||||| +560|1000013600|content://media/external/images/media/1000013600|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221202-WA0005.jpeg|image/jpeg|3840|2160|90|1599136||1670014520|1670014520571|1670014520473|0|0|0|||||||| +561|1000013593|content://media/external/images/media/1000013593|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221202-WA0002.jpg|image/jpeg|1197|1600|0|156593||1670012260|1670012273998|0|0|0|0|||||||| +562|1000013572|content://media/external/images/media/1000013572|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221201-WA0001.jpg|image/jpeg|921|2048|0|149974||1669921101|1669921106432|0|0|0|0|||||||| +563|1000013545|content://media/external/images/media/1000013545|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221130-WA0000.jpg|image/jpeg|1128|1504|0|124304||1669798137|1669798138286|0|0|0|0|||||||| +564|1000013533|content://media/external/images/media/1000013533|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0013.jpg|image/jpeg|1920|1080|0|233055||1669750038|1669750039158|0|0|0|0|||||||| +565|1000013530|content://media/external/images/media/1000013530|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0012.jpg|image/jpeg|737|960|0|42991||1669748977|1669748977986|0|0|0|0|||||||| +566|1000013527|content://media/external/images/media/1000013527|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0011.jpg|image/jpeg|2048|1536|0|435625||1669741162|1669741169280|0|0|0|0|||||||| +567|1000013524|content://media/external/images/media/1000013524|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0010.jpg|image/jpeg|2048|1536|0|414373||1669741151|1669741162176|0|0|0|0|||||||| +568|1000013518|content://media/external/images/media/1000013518|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0008.jpg|image/jpeg|640|1309|0|77580||1669739662|1669739662922|0|0|0|0|||||||| +569|1000013512|content://media/external/images/media/1000013512|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0006.jpg|image/jpeg|2048|921|0|139243||1669728596|1669728625328|0|0|0|0|||||||| +570|1000013515|content://media/external/images/media/1000013515|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0007.jpg|image/jpeg|1010|840|0|68987||1669728625|1669728625506|0|0|0|0|||||||| +571|1000013506|content://media/external/images/media/1000013506|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0004.jpg|image/jpeg|942|524|0|19721||1669728595|1669728596487|0|0|0|0|||||||| +572|1000013509|content://media/external/images/media/1000013509|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0005.jpg|image/jpeg|582|428|0|21532||1669728596|1669728596612|0|0|0|0|||||||| +573|1000013503|content://media/external/images/media/1000013503|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0003.jpg|image/jpeg|1600|1200|0|101253||1669725861|1669725861710|0|0|0|0|||||||| +574|1000013500|content://media/external/images/media/1000013500|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0002.jpg|image/jpeg|921|2048|0|100183||1669720457|1669720458116|0|0|0|0|||||||| +575|1000013498|content://media/external/images/media/1000013498|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0001.jpg|image/jpeg|844|1024|0|94218||1669708002|1669708002377|0|0|0|0|||||||| +576|1000013495|content://media/external/images/media/1000013495|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0000.jpg|image/jpeg|1504|1128|0|101551||1669707850|1669707863584|0|0|0|0|||||||| +577|1000013366|content://media/external/images/media/1000013366|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-27-14-28-51-460_com.huami.watch.hmwatchmanager.jpg|image/jpeg|1080|2400|0|567482||1669555731|1669555731804|0|0|0|0|||||||| +578|1000013347|content://media/external/images/media/1000013347|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221127-WA0000.jpg|image/jpeg|1536|2048|0|426106||1669507869|1669507870512|0|0|0|0|||||||| +579|1000013340|content://media/external/images/media/1000013340|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221126-WA0002.jpg|image/jpeg|2000|900|0|145883||1669493041|1669493079137|0|0|0|0|||||||| +580|1000013334|content://media/external/images/media/1000013334|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221126-WA0001.jpg|image/jpeg|1040|726|0|59711||1669467436|1669467437237|0|0|0|0|||||||| +581|1000013330|content://media/external/images/media/1000013330|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-26-13-30-23-962_com.android.chrome.jpg|image/jpeg|1080|2400|0|283153||1669465824|1669465824157|0|0|0|0|||||||| +582|1000013328|content://media/external/images/media/1000013328|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-26-12-35-15-162-edit_com.google.android.apps.docs.editors.sheets.jpg|image/jpeg|1080|763|0|127727||1669462515|1669462515447|0|0|0|0|||||||| +583|1000012631|content://media/external/images/media/1000012631|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221114-WA0000.jpg|image/jpeg|400|400|0|8881||1668412265|1669388695793|0|0|0|0|||||||| +584|1000013308|content://media/external/images/media/1000013308|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221125-WA0000.jpg|image/jpeg|720|1600|0|136874||1669378249|1669378250615|0|0|0|0|||||||| +585|1000013289|content://media/external/images/media/1000013289|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0013.jpg|image/jpeg|1600|1200|0|400052||1669328554|1669328555117|0|0|0|0|||||||| +586|1000013285|content://media/external/images/media/1000013285|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0011.jpg|image/jpeg|1600|1200|0|362182||1669328554|1669328554389|0|0|0|0|||||||| +587|1000013287|content://media/external/images/media/1000013287|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0012.jpg|image/jpeg|1600|1200|0|387692||1669328554|1669328554785|0|0|0|0|||||||| +588|1000013278|content://media/external/images/media/1000013278|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-24-19-52-48-646-edit_com.google.android.googlequicksearchbox.jpg|image/jpeg|1052|1538|0|582226||1669315968|1669315968760|0|0|0|0|||||||| +589|1000013213|content://media/external/images/media/1000013213|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0009.jpg|image/jpeg|1024|683|0|89231||1669293034|1669293034931|0|0|0|0|||||||| +590|1000013207|content://media/external/images/media/1000013207|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0008.jpg|image/jpeg|2048|1536|0|486101||1669287924|1669287926018|0|0|0|0|||||||| +591|1000013204|content://media/external/images/media/1000013204|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0007.jpg|image/jpeg|1599|1200|0|389238||1669287530|1669287531798|0|0|0|0|||||||| +592|1000013198|content://media/external/images/media/1000013198|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0005.jpg|image/jpeg|1200|1599|0|298583||1669285638|1669285639090|0|0|0|0|||||||| +593|1000013201|content://media/external/images/media/1000013201|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0006.jpg|image/jpeg|1200|1599|0|317813||1669285639|1669285639829|0|0|0|0|||||||| +594|1000013192|content://media/external/images/media/1000013192|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0003.jpg|image/jpeg|1599|1200|0|322671||1669285637|1669285638040|0|0|0|0|||||||| +595|1000013195|content://media/external/images/media/1000013195|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0004.jpg|image/jpeg|1200|1599|0|306012||1669285638|1669285638543|0|0|0|0|||||||| +596|1000013189|content://media/external/images/media/1000013189|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0002.jpg|image/jpeg|1200|1599|0|316870||1669285636|1669285637395|0|0|0|0|||||||| +597|1000013186|content://media/external/images/media/1000013186|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0001.jpg|image/jpeg|1200|1599|0|307336||1669285635|1669285636889|0|0|0|0|||||||| +598|1000013180|content://media/external/images/media/1000013180|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0000.jpg|image/jpeg|526|526|0|42548||1669275092|1669275093306|0|0|0|0|||||||| +599|1000013164|content://media/external/images/media/1000013164|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0011.jpg|image/jpeg|1600|1200|0|267728||1669243942|1669247570185|0|0|0|0|||||||| +600|1000013158|content://media/external/images/media/1000013158|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0009.jpg|image/jpeg|1600|1200|0|218646||1669243941|1669243942207|0|0|0|0|||||||| +601|1000013161|content://media/external/images/media/1000013161|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0010.jpg|image/jpeg|1600|1200|0|276379||1669243942|1669243942457|0|0|0|0|||||||| +602|1000013167|content://media/external/images/media/1000013167|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0012.jpg|image/jpeg|1600|1200|0|270717||1669243942|1669243942869|0|0|0|0|||||||| +603|1000013141|content://media/external/images/media/1000013141|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0007.jpg|image/jpeg|1024|768|0|111575||1669201621|1669201622047|0|0|0|0|||||||| +604|1000013129|content://media/external/images/media/1000013129|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0003.jpg|image/jpeg|1024|768|0|178339||1669201620|1669201621079|0|0|0|0|||||||| +605|1000013132|content://media/external/images/media/1000013132|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0004.jpg|image/jpeg|1024|768|0|113406||1669201621|1669201621288|0|0|0|0|||||||| +606|1000013135|content://media/external/images/media/1000013135|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0005.jpg|image/jpeg|1024|768|0|131041||1669201621|1669201621564|0|0|0|0|||||||| +607|1000013138|content://media/external/images/media/1000013138|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0006.jpg|image/jpeg|1024|768|0|88819||1669201621|1669201621777|0|0|0|0|||||||| +608|1000013120|content://media/external/images/media/1000013120|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0000.jpg|image/jpeg|1024|768|0|122145||1669201619|1669201620256|0|0|0|0|||||||| +609|1000013123|content://media/external/images/media/1000013123|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0001.jpg|image/jpeg|768|1024|0|104050||1669201620|1669201620660|0|0|0|0|||||||| +610|1000013126|content://media/external/images/media/1000013126|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0002.jpg|image/jpeg|768|1024|0|158897||1669201620|1669201620898|0|0|0|0|||||||| +611|1000013087|content://media/external/images/media/1000013087|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221122-WA0002.jpg|image/jpeg|1080|1440|0|302185||1669123243|1669123244158|0|0|0|0|||||||| +612|1000013081|content://media/external/images/media/1000013081|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221122-WA0000.jpg|image/jpeg|360|360|0|40345||1669119696|1669119696263|0|0|0|0|||||||| +613|1000013023|content://media/external/images/media/1000013023|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0010.jpg|image/jpeg|1080|720|0|108452||1669046525|1669046657110|0|0|0|0|||||||| +614|1000013017|content://media/external/images/media/1000013017|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0008.jpg|image/jpeg|1080|611|0|91952||1669046502|1669046649951|0|0|0|0|||||||| +615|1000013020|content://media/external/images/media/1000013020|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0009.jpg|image/jpeg|940|787|0|35048||1669046503|1669046504024|0|0|0|0|||||||| +616|1000012766|content://media/external/images/media/1000012766|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0000.jpg|image/jpeg|921|2048|0|195675||1668685370|1669036981250|0|0|0|0|||||||| +617|1000013010|content://media/external/images/media/1000013010|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0007.jpg|image/jpeg|921|2048|0|119927||1669028684|1669028684928|0|0|0|0|||||||| +618|1000013005|content://media/external/images/media/1000013005|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0005.jpg|image/jpeg|1196|1600|0|448026||1669026552|1669026557828|0|0|0|0|||||||| +619|1000013002|content://media/external/images/media/1000013002|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0004.jpg|image/jpeg|400|400|0|14221||1669024979|1669024980148|0|0|0|0|||||||| +620|1000012999|content://media/external/images/media/1000012999|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0003.jpg|image/jpeg|1195|2048|0|171198||1669022614|1669022614637|0|0|0|0|||||||| +621|1000012996|content://media/external/images/media/1000012996|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0002.jpg|image/jpeg|2048|1536|0|682408||1669020084|1669020085804|0|0|0|0|||||||| +622|1000012993|content://media/external/images/media/1000012993|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0001.jpg|image/jpeg|750|750|0|56006||1669019293|1669019293917|0|0|0|0|||||||| +623|1000012966|content://media/external/images/media/1000012966|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0015.jpg|image/jpeg|1197|1600|0|155843||1668970199|1668970201872|0|0|0|0|||||||| +624|1000012959|content://media/external/images/media/1000012959|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0013.jpg|image/jpeg|1532|2048|0|485349||1668966882|1668966883300|0|0|0|0|||||||| +625|1000012934|content://media/external/images/media/1000012934|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0005.jpg|image/jpeg|1196|1600|0|220856||1668959268|1668966882139|0|0|0|0|||||||| +626|1000012952|content://media/external/images/media/1000012952|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0011.jpg|image/jpeg|2048|1532|0|539055||1668966881|1668966882077|0|0|0|0|||||||| +627|1000012956|content://media/external/images/media/1000012956|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0012.jpg|image/jpeg|2048|1532|0|457000||1668966882|1668966882609|0|0|0|0|||||||| +628|1000012946|content://media/external/images/media/1000012946|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0009.jpg|image/jpeg|236|248|0|11924||1668966680|1668966680813|0|0|0|0|||||||| +629|1000012940|content://media/external/images/media/1000012940|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0008.jpg|image/jpeg|1201|1600|0|131444||1668961337|1668961338330|0|0|0|0|||||||| +630|1000012925|content://media/external/images/media/1000012925|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0004.jpg|image/jpeg|1536|2048|0|316670||1668946862|1668946865051|0|0|0|0|||||||| +631|1000012918|content://media/external/images/media/1000012918|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0001.jpg|image/jpeg|2048|1532|0|330794||1668933146|1668933146558|0|0|0|0|||||||| +632|1000012902|content://media/external/images/media/1000012902|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221119-WA0002.jpg|image/jpeg|1024|768|0|148487||1668892885|1668892885487|0|0|0|0|||||||| +633|1000012891|content://media/external/images/media/1000012891|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221119-WA0000.jpg|image/jpeg|751|1226|0|92531||1668852095|1668852096327|0|0|0|0|||||||| +634|1000012816|content://media/external/images/media/1000012816|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221118-WA0005.jpg|image/jpeg|921|2048|0|179933||1668773802|1668773810785|0|0|0|0|||||||| +635|1000012813|content://media/external/images/media/1000012813|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221118-WA0004.jpg|image/jpeg|1200|1600|0|215410||1668768033|1668768034179|0|0|0|0|||||||| +636|1000012811|content://media/external/images/media/1000012811|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221118-WA0002.jpeg|image/jpeg|3840|2160|90|1396084||1668765580|1668765580965|1668765580899|0|0|0|||||||| +637|1000012799|content://media/external/images/media/1000012799|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221118-WA0000.jpg|image/jpeg|720|1600|0|80702||1668728293|1668728293748|0|0|0|0|||||||| +638|1000012793|content://media/external/images/media/1000012793|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0005.jpg|image/jpeg|921|2048|0|149296||1668725530|1668725531456|0|0|0|0|||||||| +639|1000012796|content://media/external/images/media/1000012796|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0006.jpg|image/jpeg|921|2048|0|120564||1668725531|1668725531923|0|0|0|0|||||||| +640|1000012789|content://media/external/images/media/1000012789|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0004.jpg|image/jpeg|821|1024|0|73175||1668721913|1668721913949|0|0|0|0|||||||| +641|1000012778|content://media/external/images/media/1000012778|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0002.jpg|image/jpeg|921|2048|0|154011||1668690831|1668690833098|0|0|0|0|||||||| +642|1000012772|content://media/external/images/media/1000012772|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0001.jpg|image/jpeg|921|2048|0|143855||1668689720|1668689721885|0|0|0|0|||||||| +643|1000012726|content://media/external/images/media/1000012726|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-16-09-11-04-106-edit_com.strava.jpg|image/jpeg|1071|1194|0|107020||1668586264|1668586264174|0|0|0|0|||||||| +644|1000012720|content://media/external/images/media/1000012720|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-16-09-08-11-012_com.miui.gallery.jpg|image/jpeg|1080|2400|0|544134||1668586091|1668586091410|0|0|0|0|||||||| +645|1000012709|content://media/external/images/media/1000012709|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0010.jpg|image/jpeg|545|960|0|101561||1668537278|1668537278878|0|0|0|0|||||||| +646|1000012707|content://media/external/images/media/1000012707|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0009.jpg|image/jpeg|720|833|0|107466||1668533346|1668533346991|0|0|0|0|||||||| +647|1000012696|content://media/external/images/media/1000012696|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0007.jpg|image/jpeg|1599|777|0|141400||1668510798|1668510798883|0|0|0|0|||||||| +648|1000012690|content://media/external/images/media/1000012690|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0005.jpg|image/jpeg|1599|777|0|261614||1668505979|1668505980032|0|0|0|0|||||||| +649|1000012693|content://media/external/images/media/1000012693|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0006.jpg|image/jpeg|1599|777|0|335829||1668505980|1668505980380|0|0|0|0|||||||| +650|1000012687|content://media/external/images/media/1000012687|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0004.jpg|image/jpeg|1600|1200|0|413622||1668505438|1668505438763|0|0|0|0|||||||| +651|1000012680|content://media/external/images/media/1000012680|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0002.jpg|image/jpeg|2048|1536|0|245442||1668502775|1668502776507|0|0|0|0|||||||| +652|1000012677|content://media/external/images/media/1000012677|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0001.jpg|image/jpeg|1600|900|0|333478||1668501191|1668501192472|0|0|0|0|||||||| +653|1000012674|content://media/external/images/media/1000012674|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0000.jpg|image/jpeg|2048|1536|0|277983||1668498871|1668498872064|0|0|0|0|||||||| +654|1000012665|content://media/external/images/media/1000012665|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221114-WA0002.jpg|image/jpeg|921|2048|0|119700||1668456003|1668456004554|0|0|0|0|||||||| +655|1000012661|content://media/external/images/media/1000012661|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-14-13-43-01-262-edit_cn.wps.moffice_eng.jpg|image/jpeg|292|650|0|86717||1668429781|1668429781408|0|0|0|0|||||||| +656|1000012617|content://media/external/images/media/1000012617|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0005.jpg|image/jpeg|921|2048|0|121587||1668346843|1668346843753|0|0|0|0|||||||| +657|1000012614|content://media/external/images/media/1000012614|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0004.jpg|image/jpeg|400|400|0|11910||1668346790|1668346791021|0|0|0|0|||||||| +658|1000012611|content://media/external/images/media/1000012611|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0003.jpg|image/jpeg|1536|2048|0|530589||1668339188|1668339194663|0|0|0|0|||||||| +659|1000012608|content://media/external/images/media/1000012608|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0002.jpg|image/jpeg|1536|2048|0|553549||1668337508|1668337508981|0|0|0|0|||||||| +660|1000012605|content://media/external/images/media/1000012605|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0001.jpg|image/jpeg|1599|1200|0|361702||1668336622|1668336623287|0|0|0|0|||||||| +661|1000012602|content://media/external/images/media/1000012602|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0000.jpg|image/jpeg|1599|1200|0|375591||1668336622|1668336622797|0|0|0|0|||||||| +662|1000012576|content://media/external/images/media/1000012576|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221112-WA0008.jpg|image/jpeg|2048|1536|0|350896||1668288664|1668288665317|0|0|0|0|||||||| +663|1000012579|content://media/external/images/media/1000012579|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221112-WA0009.jpg|image/jpeg|2048|1536|0|345422||1668288665|1668288665524|0|0|0|0|||||||| +664|1000012573|content://media/external/images/media/1000012573|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221112-WA0007.jpg|image/jpeg|1536|2048|0|362583||1668288494|1668288495183|0|0|0|0|||||||| +665|1000012570|content://media/external/images/media/1000012570|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221112-WA0006.jpg|image/jpeg|2048|1536|0|232186||1668275680|1668275681556|0|0|0|0|||||||| +666|1000012541|content://media/external/images/media/1000012541|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-11-19-27-22-128-edit_com.strava.jpg|image/jpeg|1080|1641|0|485763||1668191242|1668191242225|0|0|0|0|||||||| +667|1000012523|content://media/external/images/media/1000012523|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221111-WA0000.jpg|image/jpeg|654|810|0|44278||1668164787|1668165818726|0|0|0|0|||||||| +668|1000012485|content://media/external/images/media/1000012485|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0009.jpg|image/jpeg|1536|2048|0|305654||1668090496|1668090496947|0|0|0|0|||||||| +669|1000012480|content://media/external/images/media/1000012480|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0008.jpg|image/jpeg|1440|2036|0|106687||1668079822|1668079822967|0|0|0|0|||||||| +670|1000012478|content://media/external/images/media/1000012478|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0007.jpg|image/jpeg|1156|405|0|46645||1668075312|1668075312962|0|0|0|0|||||||| +671|1000012475|content://media/external/images/media/1000012475|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0006.jpg|image/jpeg|379|191|0|13972||1668074579|1668074579346|0|0|0|0|||||||| +672|1000012473|content://media/external/images/media/1000012473|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0004.jpeg|image/jpeg|3840|2160|90|760823||1668074178|1668074178361|1668074178288|0|0|0|||||||| +673|1000012467|content://media/external/images/media/1000012467|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0002.jpg|image/jpeg|899|1599|0|79258||1668072385|1668072386036|0|0|0|0|||||||| +674|1000012470|content://media/external/images/media/1000012470|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0003.jpg|image/jpeg|899|1599|0|139875||1668072386|1668072386694|0|0|0|0|||||||| +675|1000012464|content://media/external/images/media/1000012464|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0001.jpg|image/jpeg|899|1599|0|130673||1668072384|1668072385294|0|0|0|0|||||||| +676|1000012459|content://media/external/images/media/1000012459|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0000.jpg|image/jpeg|921|2048|0|227385||1668065054|1668065054975|0|0|0|0|||||||| +677|1000012450|content://media/external/images/media/1000012450|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0005.jpg|image/jpeg|1080|1389|0|191139||1668023463|1668023464565|0|0|0|0|||||||| +678|1000012447|content://media/external/images/media/1000012447|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0004.jpg|image/jpeg|946|2048|0|216015||1667999141|1667999142712|0|0|0|0|||||||| +679|1000012444|content://media/external/images/media/1000012444|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0003.jpg|image/jpeg|921|2048|0|110105||1667975411|1667975411471|0|0|0|0|||||||| +680|1000012441|content://media/external/images/media/1000012441|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0002.jpg|image/jpeg|1076|979|0|107790||1667975228|1667975228559|0|0|0|0|||||||| +681|1000012438|content://media/external/images/media/1000012438|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0001.jpg|image/jpeg|946|2048|0|201361||1667974605|1667974606004|0|0|0|0|||||||| +682|1000012435|content://media/external/images/media/1000012435|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0000.jpg|image/jpeg|2048|1536|0|697305||1667973962|1667973963575|0|0|0|0|||||||| +683|1000012427|content://media/external/images/media/1000012427|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0007.jpg|image/jpeg|720|960|0|72871||1667930217|1667930218230|0|0|0|0|||||||| +684|1000012420|content://media/external/images/media/1000012420|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0006.jpg|image/jpeg|793|1600|0|122016||1667924729|1667924730276|0|0|0|0|||||||| +685|1000012417|content://media/external/images/media/1000012417|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0005.jpg|image/jpeg|1143|1600|0|70758||1667914624|1667914624895|0|0|0|0|||||||| +686|1000012414|content://media/external/images/media/1000012414|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0004.jpg|image/jpeg|1536|2048|0|300602||1667906311|1667906312802|0|0|0|0|||||||| +687|1000012408|content://media/external/images/media/1000012408|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0002.jpg|image/jpeg|1536|2048|0|575949||1667906310|1667906311410|0|0|0|0|||||||| +688|1000012411|content://media/external/images/media/1000012411|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0003.jpg|image/jpeg|1536|2048|0|562824||1667906311|1667906311927|0|0|0|0|||||||| +689|1000012405|content://media/external/images/media/1000012405|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0001.jpg|image/jpeg|1200|1599|0|365952||1667906127|1667906127600|0|0|0|0|||||||| +690|1000012402|content://media/external/images/media/1000012402|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0000.jpg|image/jpeg|1600|1380|0|353218||1667905899|1667905900268|0|0|0|0|||||||| +691|1000012401|content://media/external/images/media/1000012401|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-08-08-04-08-999_com.google.android.dialer.jpg|image/jpeg|1080|2400|0|175417||1667891049|1667891049234|0|0|0|0|||||||| +692|1000012392|content://media/external/images/media/1000012392|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0013.jpg|image/jpeg|1200|1599|0|394301||1667828970|1667828971240|0|0|0|0|||||||| +693|1000012375|content://media/external/images/media/1000012375|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0007.jpg|image/jpeg|1504|1128|0|222099||1667823212|1667823213018|0|0|0|0|||||||| +694|1000012378|content://media/external/images/media/1000012378|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0008.jpg|image/jpeg|1600|1200|0|313223||1667823213|1667823213299|0|0|0|0|||||||| +695|1000012381|content://media/external/images/media/1000012381|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0009.jpg|image/jpeg|1128|1504|0|166728||1667823213|1667823213602|0|0|0|0|||||||| +696|1000012384|content://media/external/images/media/1000012384|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0010.jpg|image/jpeg|1128|1504|0|146250||1667823213|1667823213958|0|0|0|0|||||||| +697|1000012372|content://media/external/images/media/1000012372|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0006.jpg|image/jpeg|1504|1128|0|138195||1667823211|1667823212184|0|0|0|0|||||||| +698|1000012369|content://media/external/images/media/1000012369|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0005.jpg|image/jpeg|1600|1200|0|232774||1667823210|1667823211693|0|0|0|0|||||||| +699|1000012362|content://media/external/images/media/1000012362|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0004.jpg|image/jpeg|1200|1599|0|220312||1667816069|1667816069763|0|0|0|0|||||||| +700|1000012359|content://media/external/images/media/1000012359|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0003.jpg|image/jpeg|1600|434|0|71503||1667815998|1667815998650|0|0|0|0|||||||| +701|1000012354|content://media/external/images/media/1000012354|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0002.jpg|image/jpeg|1200|1599|0|527090||1667810315|1667810316380|0|0|0|0|||||||| +702|1000012352|content://media/external/images/media/1000012352|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-07-08-39-50-826_it.subito.jpg|image/jpeg|1080|2400|0|453997||1667806791|1667806791309|0|0|0|0|||||||| +703|1000012349|content://media/external/images/media/1000012349|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0000.jpg|image/jpeg|713|892|0|89611||1667806145|1667806145817|0|0|0|0|||||||| +704|1000012341|content://media/external/images/media/1000012341|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221106-WA0001.jpg|image/jpeg|720|948|0|146177||1667738925|1667738926131|0|0|0|0|||||||| +705|1000012338|content://media/external/images/media/1000012338|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221106-WA0000.jpg|image/jpeg|1504|1128|0|308752||1667722460|1667722460928|0|0|0|0|||||||| +706|1000012329|content://media/external/images/media/1000012329|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0009.jpg|image/jpeg|2048|1536|0|307746||1667677352|1667677352486|0|0|0|0|||||||| +707|1000012322|content://media/external/images/media/1000012322|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0008.jpg|image/jpeg|1080|1080|0|58466||1667651368|1667651368912|0|0|0|0|||||||| +708|1000012317|content://media/external/images/media/1000012317|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0007.jpg|image/jpeg|1156|520|0|88207||1667645479|1667645479910|0|0|0|0|||||||| +709|1000012314|content://media/external/images/media/1000012314|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0006.jpg|image/jpeg|1600|900|0|198098||1667645113|1667645114516|0|0|0|0|||||||| +710|1000012311|content://media/external/images/media/1000012311|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0005.jpg|image/jpeg|958|1280|0|104268||1667645111|1667645112338|0|0|0|0|||||||| +711|1000012308|content://media/external/images/media/1000012308|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0004.jpg|image/jpeg|1200|1599|0|501061||1667643994|1667643995202|0|0|0|0|||||||| +712|1000012299|content://media/external/images/media/1000012299|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0002.jpg|image/jpeg|520|1156|0|86668||1667640007|1667640008991|0|0|0|0|||||||| +713|1000012281|content://media/external/images/media/1000012281|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0011.jpg|image/jpeg|1599|899|0|149668||1667592080|1667592085861|0|0|0|0|||||||| +714|1000012272|content://media/external/images/media/1000012272|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0010.jpg|image/jpeg|1599|899|0|235005||1667589978|1667589979219|0|0|0|0|||||||| +715|1000012270|content://media/external/images/media/1000012270|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0009.jpg|image/jpeg|720|1123|0|188237||1667582656|1667582692938|0|0|0|0|||||||| +716|1000012268|content://media/external/images/media/1000012268|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0008.jpg|image/jpeg|601|920|0|103086||1667582129|1667582129657|0|0|0|0|||||||| +717|1000012265|content://media/external/images/media/1000012265|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0007.jpg|image/jpeg|640|640|0|46445||1667581807|1667581808078|0|0|0|0|||||||| +718|1000012263|content://media/external/images/media/1000012263|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0006.jpg|image/jpeg|720|1480|0|307388||1667581571|1667581577489|0|0|0|0|||||||| +719|1000012257|content://media/external/images/media/1000012257|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0005.jpg|image/jpeg|544|541|0|30644||1667565146|1667565146954|0|0|0|0|||||||| +720|1000012254|content://media/external/images/media/1000012254|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0004.jpg|image/jpeg|921|2048|0|131607||1667562148|1667562149301|0|0|0|0|||||||| +721|1000012251|content://media/external/images/media/1000012251|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0003.jpg|image/jpeg|1080|936|0|116928||1667551760|1667551761303|0|0|0|0|||||||| +722|1000012244|content://media/external/images/media/1000012244|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0001.jpg|image/jpeg|1599|899|0|266106||1667549158|1667549159660|0|0|0|0|||||||| +723|1000012241|content://media/external/images/media/1000012241|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0000.jpg|image/jpeg|2048|1536|0|258788||1667549053|1667549054668|0|0|0|0|||||||| +724|1000012229|content://media/external/images/media/1000012229|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0005.jpg|image/jpeg|1080|1074|0|59466||1667510364|1667510365648|0|0|0|0|||||||| +725|1000012226|content://media/external/images/media/1000012226|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0004.jpg|image/jpeg|473|1024|0|58611||1667506188|1667506189499|0|0|0|0|||||||| +726|1000012223|content://media/external/images/media/1000012223|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0003.jpg|image/jpeg|995|2048|0|104082||1667491152|1667491153551|0|0|0|0|||||||| +727|1000012218|content://media/external/images/media/1000012218|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0001.jpg|image/jpeg|2016|908|0|134125||1667486203|1667486203762|0|0|0|0|||||||| +728|1000012215|content://media/external/images/media/1000012215|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0000.jpg|image/jpeg|720|1021|0|74726||1667479579|1667479580508|0|0|0|0|||||||| +729|1000012186|content://media/external/images/media/1000012186|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-02-19-34-23-959-edit_com.strava.jpg|image/jpeg|1078|1112|0|88136||1667414063|1667414063997|0|0|0|0|||||||| +730|1000012183|content://media/external/images/media/1000012183|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-02-19-33-31-938-edit_com.strava.jpg|image/jpeg|1080|1442|0|383909||1667414012|1667414012101|0|0|0|0|||||||| +731|1000012182|content://media/external/images/media/1000012182|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-02-19-33-16-551_com.strava.jpg|image/jpeg|1080|2400|0|568349||1667413996|1667413996981|0|0|0|0|||||||| +732|1000012179|content://media/external/images/media/1000012179|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221102-WA0006.jpg|image/jpeg|1132|1600|0|145761||1667394297|1667394298829|0|0|0|0|||||||| +733|1000012172|content://media/external/images/media/1000012172|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221102-WA0004.jpg|image/jpeg|1532|2048|0|207713||1667391448|1667391449515|0|0|0|0|||||||| +734|1000012169|content://media/external/images/media/1000012169|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221102-WA0003.jpg|image/jpeg|1532|2048|0|214664||1667391448|1667391448944|0|0|0|0|||||||| +735|1000012160|content://media/external/images/media/1000012160|/storage/emulated/0/DCIM/Creative/IMG_20221102_122030.jpg|image/jpeg|2048|1532|0|789564||1667388030|1667388030936|0|0|0|0|||||||| +736|1000012157|content://media/external/images/media/1000012157|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221102-WA0000.jpg|image/jpeg|1532|2048|0|280095||1667385301|1667385302767|0|0|0|0|||||||| +737|1000012138|content://media/external/images/media/1000012138|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0006.jpg|image/jpeg|720|763|0|67080||1667323645|1667323647109|0|0|0|0|||||||| +738|1000012135|content://media/external/images/media/1000012135|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0005.jpg|image/jpeg|720|960|0|67807||1667320082|1667320082608|0|0|0|0|||||||| +739|1000012132|content://media/external/images/media/1000012132|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0004.jpg|image/jpeg|899|1599|0|173027||1667309366|1667309366945|0|0|0|0|||||||| +740|1000012129|content://media/external/images/media/1000012129|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0003.jpg|image/jpeg|1600|1196|0|426940||1667307635|1667307636190|0|0|0|0|||||||| +741|1000012126|content://media/external/images/media/1000012126|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0002.jpg|image/jpeg|1600|1196|0|172133||1667307634|1667307635596|0|0|0|0|||||||| +742|1000012123|content://media/external/images/media/1000012123|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0001.jpg|image/jpeg|1600|1196|0|513101||1667307633|1667307634967|0|0|0|0|||||||| +743|1000012120|content://media/external/images/media/1000012120|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0000.jpg|image/jpeg|1496|2000|0|307353||1667302295|1667302295758|0|0|0|0|||||||| +744|1000012102|content://media/external/images/media/1000012102|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0034.jpg|image/jpeg|1200|1600|0|252162||1667255544|1667255546848|0|0|0|0|||||||| +745|1000012099|content://media/external/images/media/1000012099|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0033.jpg|image/jpeg|853|1280|0|80233||1667254591|1667254592019|0|0|0|0|||||||| +746|1000012096|content://media/external/images/media/1000012096|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0032.jpg|image/jpeg|853|1280|0|70097||1667254576|1667254577126|0|0|0|0|||||||| +747|1000012090|content://media/external/images/media/1000012090|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0030.jpg|image/jpeg|1280|853|0|82503||1667254575|1667254576034|0|0|0|0|||||||| +748|1000012093|content://media/external/images/media/1000012093|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0031.jpg|image/jpeg|853|1280|0|70283||1667254576|1667254576557|0|0|0|0|||||||| +749|1000012084|content://media/external/images/media/1000012084|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0028.jpg|image/jpeg|1280|853|0|56499||1667254574|1667254575065|0|0|0|0|||||||| +750|1000012087|content://media/external/images/media/1000012087|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0029.jpg|image/jpeg|853|1280|0|89847||1667254575|1667254575513|0|0|0|0|||||||| +751|1000012081|content://media/external/images/media/1000012081|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0027.jpg|image/jpeg|1280|853|0|55486||1667254571|1667254574632|0|0|0|0|||||||| +752|1000012078|content://media/external/images/media/1000012078|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0026.jpg|image/jpeg|853|1280|0|82369||1667254570|1667254571383|0|0|0|0|||||||| +753|1000012075|content://media/external/images/media/1000012075|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0025.jpg|image/jpeg|1280|853|0|84113||1667254569|1667254570450|0|0|0|0|||||||| +754|1000012072|content://media/external/images/media/1000012072|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0024.jpg|image/jpeg|1599|1200|0|140486||1667252053|1667252054834|0|0|0|0|||||||| +755|1000012069|content://media/external/images/media/1000012069|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0023.jpg|image/jpeg|1599|1200|0|121319||1667252041|1667252042553|0|0|0|0|||||||| +756|1000012066|content://media/external/images/media/1000012066|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20221031-WA0022.jpg|image/jpeg|2048|1536|0|375780||1667247663|1667247664771|0|0|0|0|||||||| +757|1000012057|content://media/external/images/media/1000012057|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20221031-WA0017.jpg|image/jpeg|1080|1920|0|255071||1667245052|1667245053221|0|0|0|0|||||||| +758|1000012044|content://media/external/images/media/1000012044|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-31-19-49-48-927_com.google.android.apps.maps.jpg|image/jpeg|1080|2400|0|352971||1667242189|1667242189113|0|0|0|0|||||||| +759|1000012042|content://media/external/images/media/1000012042|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0014.jpg|image/jpeg|536|1024|0|102217||1667242181|1667242181491|0|0|0|0|||||||| +760|1000012035|content://media/external/images/media/1000012035|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0012.jpg|image/jpeg|1532|2048|0|134550||1667234560|1667234561567|0|0|0|0|||||||| +761|1000012032|content://media/external/images/media/1000012032|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0011.jpg|image/jpeg|2048|1152|0|181795||1667229848|1667229850088|0|0|0|0|||||||| +762|1000012030|content://media/external/images/media/1000012030|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0010.jpg|image/jpeg|640|796|0|40998||1667225903|1667225903405|0|0|0|0|||||||| +763|1000012027|content://media/external/images/media/1000012027|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0009.jpg|image/jpeg|720|960|0|155709||1667221887|1667221888086|0|0|0|0|||||||| +764|1000012024|content://media/external/images/media/1000012024|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0008.jpg|image/jpeg|720|540|0|93802||1667221886|1667221887507|0|0|0|0|||||||| +765|1000012019|content://media/external/images/media/1000012019|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0006.jpg|image/jpeg|980|980|0|44760||1667217691|1667217691892|0|0|0|0|||||||| +766|1000012016|content://media/external/images/media/1000012016|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0005.jpg|image/jpeg|720|777|0|35126||1667216030|1667216031328|0|0|0|0|||||||| +767|1000011998|content://media/external/images/media/1000011998|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0002.jpg|image/jpeg|2048|1532|0|395992||1667214588|1667214591051|0|0|0|0|||||||| +768|1000011985|content://media/external/images/media/1000011985|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0001.jpg|image/jpeg|719|1600|0|75212||1667200383|1667200384941|0|0|0|0|||||||| +769|1000011976|content://media/external/images/media/1000011976|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0000.jpg|image/jpeg|1197|1600|0|219523||1667175385|1667175386855|0|0|0|0|||||||| +770|1000011974|content://media/external/images/media/1000011974|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0012.jpg|image/jpeg|671|960|0|56645||1667161182|1667161183041|0|0|0|0|||||||| +771|1000011967|content://media/external/images/media/1000011967|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0011.jpg|image/jpeg|719|1600|0|67441||1667147305|1667147306722|0|0|0|0|||||||| +772|1000011965|content://media/external/images/media/1000011965|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0009.jpeg|image/jpeg|3840|2160|0|1000510||1667146761|1667146761349|1667146761232|0|0|0|||||||| +773|1000011962|content://media/external/images/media/1000011962|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0008.jpg|image/jpeg|1196|1600|0|96091||1667139903|1667139904687|0|0|0|0|||||||| +774|1000011959|content://media/external/images/media/1000011959|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0007.jpg|image/jpeg|960|951|0|82996||1667132678|1667132678746|0|0|0|0|||||||| +775|1000011956|content://media/external/images/media/1000011956|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0006.jpg|image/jpeg|1296|970|0|109214||1667132359|1667132360178|0|0|0|0|||||||| +776|1000011953|content://media/external/images/media/1000011953|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0005.jpg|image/jpeg|720|709|0|81048||1667132219|1667132220473|0|0|0|0|||||||| +777|1000011936|content://media/external/images/media/1000011936|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-30-11-35-43-323_ch.publisheria.bring.jpg|image/jpeg|1080|2400|0|441019||1667126143|1667126143784|0|0|0|0|||||||| +778|1000011933|content://media/external/images/media/1000011933|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0000.jpg|image/jpeg|1530|2040|0|574503||1667120243|1667120245000|0|0|0|0|||||||| +779|1000011924|content://media/external/images/media/1000011924|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0039.jpg|image/jpeg|1600|1197|0|181781||1667069957|1667069958011|0|0|0|0|||||||| +780|1000011921|content://media/external/images/media/1000011921|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0038.jpg|image/jpeg|1600|1196|0|104722||1667065441|1667065442252|0|0|0|0|||||||| +781|1000011918|content://media/external/images/media/1000011918|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0037.jpg|image/jpeg|1312|1600|0|169461||1667061094|1667061095782|0|0|0|0|||||||| +782|1000011915|content://media/external/images/media/1000011915|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0036.jpg|image/jpeg|1080|1080|0|152863||1667057152|1667057160481|0|0|0|0|||||||| +783|1000011912|content://media/external/images/media/1000011912|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0035.jpg|image/jpeg|721|1600|0|84178||1667056502|1667056502747|0|0|0|0|||||||| +784|1000011909|content://media/external/images/media/1000011909|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0034.jpg|image/jpeg|2016|1512|0|732031||1667056431|1667056433467|0|0|0|0|||||||| +785|1000011906|content://media/external/images/media/1000011906|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0033.jpg|image/jpeg|1600|719|0|300180||1667053457|1667053458321|0|0|0|0|||||||| +786|1000011903|content://media/external/images/media/1000011903|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0032.jpg|image/jpeg|1512|2016|0|448319||1667051358|1667051359490|0|0|0|0|||||||| +787|1000011900|content://media/external/images/media/1000011900|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0031.jpg|image/jpeg|2016|1512|0|246717||1667051318|1667051318712|0|0|0|0|||||||| +788|1000011897|content://media/external/images/media/1000011897|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0030.jpg|image/jpeg|2016|1512|0|772407||1667051289|1667051290468|0|0|0|0|||||||| +789|1000011895|content://media/external/images/media/1000011895|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0029.jpg|image/jpeg|2016|954|0|414046||1667049885|1667049885750|0|0|0|0|||||||| +790|1000011892|content://media/external/images/media/1000011892|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0028.jpg|image/jpeg|2040|1530|0|809201||1667047366|1667047367516|0|0|0|0|||||||| +791|1000011889|content://media/external/images/media/1000011889|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0027.jpg|image/jpeg|1530|2040|0|475353||1667047310|1667047366914|0|0|0|0|||||||| +792|1000011886|content://media/external/images/media/1000011886|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0026.jpg|image/jpeg|2048|1536|0|315211||1667047304|1667047310307|0|0|0|0|||||||| +793|1000011880|content://media/external/images/media/1000011880|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0024.jpg|image/jpeg|2048|995|0|417868||1667047293|1667047294249|0|0|0|0|||||||| +794|1000011883|content://media/external/images/media/1000011883|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0025.jpg|image/jpeg|2048|995|0|300916||1667047294|1667047294672|0|0|0|0|||||||| +795|1000011874|content://media/external/images/media/1000011874|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0022.jpg|image/jpeg|2048|995|0|236697||1667047292|1667047293012|0|0|0|0|||||||| +796|1000011877|content://media/external/images/media/1000011877|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0023.jpg|image/jpeg|2048|995|0|435815||1667047293|1667047293396|0|0|0|0|||||||| +797|1000011868|content://media/external/images/media/1000011868|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0020.jpg|image/jpeg|2048|995|0|277750||1667047291|1667047292131|0|0|0|0|||||||| +798|1000011871|content://media/external/images/media/1000011871|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0021.jpg|image/jpeg|2048|995|0|119062||1667047292|1667047292701|0|0|0|0|||||||| +799|1000011862|content://media/external/images/media/1000011862|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0018.jpg|image/jpeg|1600|1196|0|147718||1667039028|1667039028467|0|0|0|0|||||||| +800|1000011865|content://media/external/images/media/1000011865|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0019.jpg|image/jpeg|1600|1196|0|89881||1667039028|1667039028660|0|0|0|0|||||||| +801|1000011859|content://media/external/images/media/1000011859|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0017.jpg|image/jpeg|1044|1600|0|118840||1667037554|1667037555266|0|0|0|0|||||||| +802|1000011856|content://media/external/images/media/1000011856|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0016.jpg|image/jpeg|1599|899|0|80633||1667037248|1667037248995|0|0|0|0|||||||| +803|1000011853|content://media/external/images/media/1000011853|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0015.jpg|image/jpeg|899|1599|0|152550||1667031691|1667031696899|0|0|0|0|||||||| +804|1000011850|content://media/external/images/media/1000011850|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0014.jpg|image/jpeg|2048|1536|0|366468||1667031580|1667031581447|0|0|0|0|||||||| +805|1000011847|content://media/external/images/media/1000011847|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0013.jpg|image/jpeg|1536|2048|0|335383||1667031579|1667031580730|0|0|0|0|||||||| +806|1000011823|content://media/external/images/media/1000011823|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0009.jpg|image/jpeg|1200|1600|0|226744||1667000490|1667000491368|0|0|0|0|||||||| +807|1000011813|content://media/external/images/media/1000011813|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0006.jpg|image/jpeg|2048|1536|0|409330||1667000389|1667000390054|0|0|0|0|||||||| +808|1000011816|content://media/external/images/media/1000011816|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0007.jpg|image/jpeg|2048|1536|0|427333||1667000390|1667000390608|0|0|0|0|||||||| +809|1000011810|content://media/external/images/media/1000011810|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0005.jpg|image/jpeg|2048|1536|0|411959||1667000387|1667000388310|0|0|0|0|||||||| +810|1000011803|content://media/external/images/media/1000011803|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0003.jpg|image/jpeg|2048|1536|0|417348||1667000339|1667000340045|0|0|0|0|||||||| +811|1000011797|content://media/external/images/media/1000011797|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0001.jpg|image/jpeg|2048|1536|0|404364||1667000338|1667000339165|0|0|0|0|||||||| +812|1000011800|content://media/external/images/media/1000011800|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0002.jpg|image/jpeg|2048|1536|0|504975||1667000339|1667000339633|0|0|0|0|||||||| +813|1000011791|content://media/external/images/media/1000011791|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0005.jpg|image/jpeg|711|960|0|49159||1666974571|1666974572061|0|0|0|0|||||||| +814|1000011778|content://media/external/images/media/1000011778|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0004.jpg|image/jpeg|1080|1088|0|228661||1666959836|1666959865876|0|0|0|0|||||||| +815|1000011772|content://media/external/images/media/1000011772|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0002.jpg|image/jpeg|1080|660|0|62583||1666953579|1666953580150|0|0|0|0|||||||| +816|1000011769|content://media/external/images/media/1000011769|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0001.jpg|image/jpeg|1080|1537|0|172732||1666953458|1666953464202|0|0|0|0|||||||| +817|1000011766|content://media/external/images/media/1000011766|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0000.jpg|image/jpeg|795|960|0|80977||1666945695|1666945696591|0|0|0|0|||||||| +818|1000011745|content://media/external/images/media/1000011745|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0010.jpg|image/jpeg|1024|755|0|92387||1666891337|1666891341601|0|0|0|0|||||||| +819|1000011733|content://media/external/images/media/1000011733|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0008.jpg|image/jpeg|1149|1024|0|136089||1666881194|1666881194460|0|0|0|0|||||||| +820|1000011624|content://media/external/images/media/1000011624|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0006.jpeg|image/jpeg|3840|2160|90|1565691||1666866810|1666866810415|1666866810365|0|0|0|||||||| +821|1000011622|content://media/external/images/media/1000011622|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0004.jpeg|image/jpeg|3840|2160|90|1532752||1666866595|1666866595399|1666866595250|0|0|0|||||||| +822|1000011620|content://media/external/images/media/1000011620|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0002.jpeg|image/jpeg|3840|2160|90|1931762||1666866568|1666866568531|1666866568366|0|0|0|||||||| +823|1000011617|content://media/external/images/media/1000011617|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0001.jpg|image/jpeg|1080|750|0|210382||1666866551|1666866551200|0|0|0|0|||||||| +824|1000011614|content://media/external/images/media/1000011614|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0000.jpg|image/jpeg|1536|2048|0|840141||1666866549|1666866550827|0|0|0|0|||||||| +825|1000011611|content://media/external/images/media/1000011611|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0005.jpg|image/jpeg|1600|1200|0|260654||1666814026|1666814027507|0|0|0|0|||||||| +826|1000011605|content://media/external/images/media/1000011605|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0004.jpg|image/jpeg|1156|520|0|27036||1666801905|1666801906134|0|0|0|0|||||||| +827|1000011602|content://media/external/images/media/1000011602|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0003.jpg|image/jpeg|520|1156|0|10373||1666801763|1666801764632|0|0|0|0|||||||| +828|1000011599|content://media/external/images/media/1000011599|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0002.jpg|image/jpeg|1052|473|0|11067||1666801703|1666801703985|0|0|0|0|||||||| +829|1000011596|content://media/external/images/media/1000011596|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0001.jpg|image/jpeg|1052|473|0|10570||1666801702|1666801702828|0|0|0|0|||||||| +830|1000010935|content://media/external/images/media/1000010935|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0005.jpg|image/jpeg|1131|1600|0|198155||1666028588|1666768963079|0|0|0|0|||||||| +831|1000011590|content://media/external/images/media/1000011590|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0000.jpg|image/jpeg|1536|2048|0|417661||1666762475|1666762476327|0|0|0|0|||||||| +832|1000011581|content://media/external/images/media/1000011581|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0011.jpg|image/jpeg|1156|520|0|15278||1666725335|1666725335627|0|0|0|0|||||||| +833|1000011579|content://media/external/images/media/1000011579|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-25-19-09-58-201_com.huami.watch.hmwatchmanager.jpg|image/jpeg|1080|2400|0|501246||1666717798|1666717798487|0|0|0|0|||||||| +834|1000011576|content://media/external/images/media/1000011576|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0009.jpg|image/jpeg|1200|1600|0|166705||1666709925|1666709926493|0|0|0|0|||||||| +835|1000011572|content://media/external/images/media/1000011572|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0008.jpg|image/jpeg|1600|900|0|190905||1666694937|1666694937988|0|0|0|0|||||||| +836|1000011569|content://media/external/images/media/1000011569|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0007.jpg|image/jpeg|1600|900|0|269746||1666693680|1666693682550|0|0|0|0|||||||| +837|1000011566|content://media/external/images/media/1000011566|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0006.jpg|image/jpeg|1599|1200|0|385940||1666693370|1666693371628|0|0|0|0|||||||| +838|1000011556|content://media/external/images/media/1000011556|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0003.jpg|image/jpeg|941|1600|0|158985||1666690348|1666690349285|0|0|0|0|||||||| +839|1000011559|content://media/external/images/media/1000011559|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0004.jpg|image/jpeg|899|1599|0|119902||1666690349|1666690349638|0|0|0|0|||||||| +840|1000011549|content://media/external/images/media/1000011549|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-25-09-41-21-279_com.whatsapp.jpg|image/jpeg|1080|2400|0|659666||1666683681|1666683681698|0|0|0|0|||||||| +841|1000011535|content://media/external/images/media/1000011535|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0000.jpg|image/jpeg|1080|1386|0|119690||1666653391|1666653392176|0|0|0|0|||||||| +842|1000011515|content://media/external/images/media/1000011515|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0010.jpg|image/jpeg|1504|1128|0|242199||1666635004|1666635005307|0|0|0|0|||||||| +843|1000011518|content://media/external/images/media/1000011518|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0011.jpg|image/jpeg|1504|1128|0|248861||1666635005|1666635005993|0|0|0|0|||||||| +844|1000011512|content://media/external/images/media/1000011512|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0009.jpg|image/jpeg|1504|1128|0|272820||1666635003|1666635004549|0|0|0|0|||||||| +845|1000011506|content://media/external/images/media/1000011506|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0007.jpg|image/jpeg|1504|1128|0|183907||1666635002|1666635003139|0|0|0|0|||||||| +846|1000011509|content://media/external/images/media/1000011509|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0008.jpg|image/jpeg|1600|1200|0|347362||1666635003|1666635003938|0|0|0|0|||||||| +847|1000011436|content://media/external/images/media/1000011436|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0024.jpg|image/jpeg|1500|2000|0|391439||1666551403|1666551404742|0|0|0|0|||||||| +848|1000011434|content://media/external/images/media/1000011434|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0023.jpg|image/jpeg|960|655|0|30287||1666550711|1666550711974|0|0|0|0|||||||| +849|1000011431|content://media/external/images/media/1000011431|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0022.jpg|image/jpeg|1204|1600|0|194392||1666547665|1666547665969|0|0|0|0|||||||| +850|1000011428|content://media/external/images/media/1000011428|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0021.jpg|image/jpeg|900|1600|0|132667||1666547371|1666547372475|0|0|0|0|||||||| +851|1000011425|content://media/external/images/media/1000011425|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0020.jpg|image/jpeg|1504|1128|0|221853||1666544288|1666544289021|0|0|0|0|||||||| +852|1000011401|content://media/external/images/media/1000011401|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0012.jpg|image/jpeg|970|1296|0|226610||1666534381|1666534382192|0|0|0|0|||||||| +853|1000011365|content://media/external/images/media/1000011365|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0000.jpg|image/jpeg|1600|1197|0|571791||1666514969|1666514980047|0|0|0|0|||||||| +854|1000011353|content://media/external/images/media/1000011353|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221022-WA0011.jpg|image/jpeg|1080|1339|0|127388||1666475804|1666475823170|0|0|0|0|||||||| +855|1000011278|content://media/external/images/media/1000011278|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221021-WA0003.jpg|image/jpeg|1080|1276|0|84963||1666384328|1666384328952|0|0|0|0|||||||| +856|1000011149|content://media/external/images/media/1000011149|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221021-WA0000.jpg|image/jpeg|1536|2048|0|569057||1666348806|1666348807999|0|0|0|0|||||||| +857|1000011134|content://media/external/images/media/1000011134|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0024.jpg|image/jpeg|899|1599|0|86790||1666291415|1666291417005|0|0|0|0|||||||| +858|1000011112|content://media/external/images/media/1000011112|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0019.jpg|image/jpeg|1200|1600|0|124792||1666291035|1666291036166|0|0|0|0|||||||| +859|1000011103|content://media/external/images/media/1000011103|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0017.jpg|image/jpeg|1200|1600|0|144725||1666289660|1666289661224|0|0|0|0|||||||| +860|1000011101|content://media/external/images/media/1000011101|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0016.jpg|image/jpeg|1500|2000|0|812683||1666289279|1666289280359|0|0|0|0|||||||| +861|1000011097|content://media/external/images/media/1000011097|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0014.jpg|image/jpeg|460|1024|0|35541||1666289269|1666289279643|0|0|0|0|||||||| +862|1000011099|content://media/external/images/media/1000011099|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0015.jpg|image/jpeg|200|200|0|7642||1666289279|1666289279813|0|0|0|0|||||||| +863|1000011090|content://media/external/images/media/1000011090|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0011.jpg|image/jpeg|750|989|0|115222||1666289268|1666289268908|0|0|0|0|||||||| +864|1000011041|content://media/external/images/media/1000011041|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-20-08-10-45-855_com.google.android.dialer.png|image/png|173|2274|0|14929||1666246245|1666246246052|0|0|0|0|||||||| +865|1000011023|content://media/external/images/media/1000011023|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0007.jpg|image/jpeg|1200|1600|0|98085||1666200395|1666200397307|0|0|0|0|||||||| +866|1000011020|content://media/external/images/media/1000011020|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0006.jpg|image/jpeg|1200|1600|0|110513||1666200394|1666200395334|0|0|0|0|||||||| +867|1000011018|content://media/external/images/media/1000011018|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0005.jpg|image/jpeg|1080|601|0|83243||1666190586|1666190586529|0|0|0|0|||||||| +868|1000011006|content://media/external/images/media/1000011006|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-19-08-56-18-501_com.google.android.googlequicksearchbox.jpg|image/jpeg|1080|2400|0|563831||1666162578|1666162578981|0|0|0|0|||||||| +869|1000011003|content://media/external/images/media/1000011003|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0001.jpg|image/jpeg|1080|1243|0|116417||1666159676|1666159677124|0|0|0|0|||||||| +870|1000010997|content://media/external/images/media/1000010997|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0000.jpg|image/jpeg|2048|1659|0|338387||1666157752|1666157753691|0|0|0|0|||||||| +871|1000010985|content://media/external/images/media/1000010985|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-18-19-34-52-397_com.huami.watch.hmwatchmanager.jpg|image/jpeg|1080|2400|0|493920||1666114492|1666114492852|0|0|0|0|||||||| +872|1000010948|content://media/external/images/media/1000010948|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0009.jpg|image/jpeg|899|1599|0|131117||1666031162|1666031162773|0|0|0|0|||||||| +873|1000010938|content://media/external/images/media/1000010938|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0006.jpg|image/jpeg|739|1600|0|41107||1666029140|1666029140995|0|0|0|0|||||||| +874|1000010929|content://media/external/images/media/1000010929|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0004.jpg|image/jpeg|1532|2048|0|211493||1666017768|1666017769938|0|0|0|0|||||||| +875|1000010921|content://media/external/images/media/1000010921|/storage/emulated/0/DCIM/Camera/IMG_20221017_142950.jpg|image/jpeg|4608|2592|0|5041227||1666009793|1666009793910|1666009790669|0|0|0|||||||| +876|1000010914|content://media/external/images/media/1000010914|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0003.jpg|image/jpeg|921|2048|0|116964||1666004710|1666004710900|0|0|0|0|||||||| +877|1000010912|content://media/external/images/media/1000010912|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0002.jpg|image/jpeg|576|1024|0|65284||1665998724|1665998730213|0|0|0|0|||||||| +878|1000010880|content://media/external/images/media/1000010880|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221016-WA0011.jpg|image/jpeg|852|1490|0|175719||1665910346|1665910346943|0|0|0|0|||||||| +879|1000010877|content://media/external/images/media/1000010877|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221016-WA0010.jpg|image/jpeg|1200|1600|0|157129||1665910108|1665910109275|0|0|0|0|||||||| +880|1000010810|content://media/external/images/media/1000010810|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221015-WA0000.jpg|image/jpeg|1536|2048|0|284766||1665818225|1665818226872|0|0|0|0|||||||| +881|1000010773|content://media/external/images/media/1000010773|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0038.jpg|image/jpeg|906|1600|0|97812||1665767958|1665767974468|0|0|0|0|||||||| +882|1000010772|content://media/external/images/media/1000010772|/storage/emulated/0/DCIM/Camera/20221014_190318_886.jpg|image/jpeg|2560|1440|0|2494631||1665766999|1665766999000|0|0|0|0|||||||| +883|1000010752|content://media/external/images/media/1000010752|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0024.jpg|image/jpeg|1599|899|0|50820||1665761798|1665761799246|0|0|0|0|||||||| +884|1000010749|content://media/external/images/media/1000010749|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0023.jpg|image/jpeg|1128|1504|0|377113||1665761767|1665761768632|0|0|0|0|||||||| +885|1000010740|content://media/external/images/media/1000010740|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0020.jpg|image/jpeg|1128|1504|0|243891||1665761766|1665761767023|0|0|0|0|||||||| +886|1000010743|content://media/external/images/media/1000010743|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0021.jpg|image/jpeg|1504|1128|0|275621||1665761767|1665761767352|0|0|0|0|||||||| +887|1000010746|content://media/external/images/media/1000010746|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0022.jpg|image/jpeg|1128|1504|0|181227||1665761767|1665761767738|0|0|0|0|||||||| +888|1000010737|content://media/external/images/media/1000010737|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0019.jpg|image/jpeg|1128|1504|0|386488||1665761765|1665761766563|0|0|0|0|||||||| +889|1000010734|content://media/external/images/media/1000010734|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0018.jpg|image/jpeg|1504|1128|0|360587||1665761764|1665761765389|0|0|0|0|||||||| +890|1000010729|content://media/external/images/media/1000010729|/storage/emulated/0/DCIM/Camera/IMG_20221014_153311.jpg|image/jpeg|1800|3200|0|2276965||1665754393|1665754393042|1665754391370|0|0|0|||||||| +891|1000010727|content://media/external/images/media/1000010727|/storage/emulated/0/DCIM/Camera/IMG_20221014_153246.jpg|image/jpeg|1800|3200|0|2278488||1665754369|1665754369810|1665754366919|0|0|0|||||||| +892|1000010718|content://media/external/images/media/1000010718|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-14-14-43-25-330_com.huami.watch.hmwatchmanager.jpg|image/jpeg|1080|2400|0|569264||1665751405|1665751405644|0|0|0|0|||||||| +893|1000010704|content://media/external/images/media/1000010704|/storage/emulated/0/DCIM/Camera/IMG_20221014_143622.jpg|image/jpeg|4608|2592|0|5112300||1665750984|1665750984303|1665750982848|0|0|0|||||||| +894|1000010703|content://media/external/images/media/1000010703|/storage/emulated/0/DCIM/Camera/IMG_20221014_143621.jpg|image/jpeg|4608|2592|0|5148327||1665750983|1665750983511|1665750981761|0|0|0|||||||| +895|1000010701|content://media/external/images/media/1000010701|/storage/emulated/0/DCIM/Camera/IMG_20221014_143618.jpg|image/jpeg|4608|2592|0|5073501||1665750981|1665750981143|1665750979400|0|0|0|||||||| +896|1000010697|content://media/external/images/media/1000010697|/storage/emulated/0/DCIM/Camera/IMG_20221014_140302.jpg|image/jpeg|2592|4608|0|5994257||1665748984|1665748984768|1665748983200|0|0|0|||||||| +897|1000010698|content://media/external/images/media/1000010698|/storage/emulated/0/DCIM/Camera/IMG_20221014_140303.jpg|image/jpeg|2592|4608|0|5672971||1665748984|1665748984936|1665748983903|0|0|0|||||||| +898|1000010695|content://media/external/images/media/1000010695|/storage/emulated/0/DCIM/Camera/IMG_20221014_140258.jpg|image/jpeg|2592|4608|0|5591203||1665748981|1665748981288|1665748979210|0|0|0|||||||| +899|1000010693|content://media/external/images/media/1000010693|/storage/emulated/0/DCIM/Camera/IMG_20221014_140252.jpg|image/jpeg|2592|4608|0|7207541||1665748977|1665748977064|1665748972758|0|0|0|||||||| +900|1000010688|content://media/external/images/media/1000010688|/storage/emulated/0/DCIM/Camera/IMG_20221014_130212.jpg|image/jpeg|4608|2592|0|9015380||1665745335|1665745335688|1665745332628|0|0|0|||||||| +901|1000010686|content://media/external/images/media/1000010686|/storage/emulated/0/DCIM/Camera/IMG_20221014_130156.jpg|image/jpeg|4608|2592|0|8498699||1665745318|1665745318312|1665745316548|0|0|0|||||||| +902|1000010684|content://media/external/images/media/1000010684|/storage/emulated/0/DCIM/Camera/IMG_20221014_130127.jpg|image/jpeg|2592|4608|0|7241852||1665745291|1665745291124|1665745287792|0|0|0|||||||| +903|1000010682|content://media/external/images/media/1000010682|/storage/emulated/0/DCIM/Camera/IMG_20221014_130123.jpg|image/jpeg|4608|2592|0|7853513||1665745286|1665745286148|1665745283442|0|0|0|||||||| +904|1000010680|content://media/external/images/media/1000010680|/storage/emulated/0/DCIM/Camera/IMG_20221014_125215.jpg|image/jpeg|2592|4608|0|7733087||1665744736|1665744736907|1665744735460|0|0|0|||||||| +905|1000010678|content://media/external/images/media/1000010678|/storage/emulated/0/DCIM/Camera/IMG_20221014_125211.jpg|image/jpeg|4608|2592|0|7001236||1665744732|1665744732791|1665744731328|0|0|0|||||||| +906|1000010676|content://media/external/images/media/1000010676|/storage/emulated/0/DCIM/Camera/IMG_20221014_125202.jpg|image/jpeg|4608|2592|0|7919815||1665744723|1665744723871|1665744722565|0|0|0|||||||| +907|1000010674|content://media/external/images/media/1000010674|/storage/emulated/0/DCIM/Camera/IMG_20221014_125130.jpg|image/jpeg|2592|4608|0|8731676||1665744694|1665744694507|1665744691209|0|0|0|||||||| +908|1000010669|content://media/external/images/media/1000010669|/storage/emulated/0/DCIM/Camera/IMG_20221014_121951.jpg|image/jpeg|4608|2592|0|5496419||1665742793|1665742793758|1665742791521|0|0|0|||||||| +909|1000010667|content://media/external/images/media/1000010667|/storage/emulated/0/DCIM/Camera/IMG_20221014_121822.jpg|image/jpeg|4608|2592|0|8319332||1665742705|1665742705840|1665742702613|0|0|0|||||||| +910|1000010662|content://media/external/images/media/1000010662|/storage/emulated/0/DCIM/Camera/IMG_20221014_121135.jpg|image/jpeg|3200|1800|0|3992254||1665742300|1665742300838|1665742296560|0|0|0|||||||| +911|1000010659|content://media/external/images/media/1000010659|/storage/emulated/0/DCIM/Camera/IMG_20221014_110919.jpg|image/jpeg|2592|4608|0|5368507||1665738562|1665738562647|1665738559480|0|0|0|||||||| +912|1000010657|content://media/external/images/media/1000010657|/storage/emulated/0/DCIM/Camera/IMG_20221014_110557.jpg|image/jpeg|3200|1800|0|3407197||1665738359|1665738359355|1665738357330|0|0|0|||||||| +913|1000010655|content://media/external/images/media/1000010655|/storage/emulated/0/DCIM/Camera/IMG_20221014_110549.jpg|image/jpeg|4608|2592|0|7096292||1665738352|1665738352163|1665738349808|0|0|0|||||||| +914|1000010653|content://media/external/images/media/1000010653|/storage/emulated/0/DCIM/Camera/IMG_20221014_110526.jpg|image/jpeg|4608|2592|0|6650799||1665738328|1665738328363|1665738326458|0|0|0|||||||| +915|1000010649|content://media/external/images/media/1000010649|/storage/emulated/0/DCIM/Camera/IMG_20221014_105939.jpg|image/jpeg|3200|1800|0|4109652||1665737981|1665737981412|1665737979659|0|0|0|||||||| +916|1000010647|content://media/external/images/media/1000010647|/storage/emulated/0/DCIM/Camera/IMG_20221014_105933.jpg|image/jpeg|3200|1800|0|3791151||1665737975|1665737975076|1665737973400|0|0|0|||||||| +917|1000010645|content://media/external/images/media/1000010645|/storage/emulated/0/DCIM/Camera/IMG_20221014_105930.jpg|image/jpeg|3200|1800|0|3799983||1665737972|1665737972968|1665737971105|0|0|0|||||||| +918|1000010641|content://media/external/images/media/1000010641|/storage/emulated/0/DCIM/Camera/IMG_20221014_104857.jpg|image/jpeg|4608|2592|0|7639315||1665737338|1665737338967|1665737337575|0|0|0|||||||| +919|1000010639|content://media/external/images/media/1000010639|/storage/emulated/0/DCIM/Camera/IMG_20221014_104854.jpg|image/jpeg|4608|2592|0|8392178||1665737336|1665737336459|1665737334996|0|0|0|||||||| +920|1000010637|content://media/external/images/media/1000010637|/storage/emulated/0/DCIM/Camera/IMG_20221014_104825.jpg|image/jpeg|3200|1800|0|3282143||1665737307|1665737307243|1665737305279|0|0|0|||||||| +921|1000010635|content://media/external/images/media/1000010635|/storage/emulated/0/DCIM/Camera/IMG_20221014_104819.jpg|image/jpeg|4608|2592|0|8534289||1665737302|1665737302439|1665737299909|0|0|0|||||||| +922|1000010633|content://media/external/images/media/1000010633|/storage/emulated/0/DCIM/Camera/IMG_20221014_104810.jpg|image/jpeg|4608|2592|0|8796953||1665737291|1665737291943|1665737290479|0|0|0|||||||| +923|1000010632|content://media/external/images/media/1000010632|/storage/emulated/0/DCIM/Camera/PANO_20221014_104731.jpg|image/jpeg|15792|4288|0|54543472||1665737256|1665737257639|1665737251000|0|0|0|||||||| +924|1000010631|content://media/external/images/media/1000010631|/storage/emulated/0/DCIM/Camera/PANO_20221014_104724.jpg|image/jpeg|15888|4160|0|51080844||1665737249|1665737250143|1665737244000|0|0|0|||||||| +925|1000010629|content://media/external/images/media/1000010629|/storage/emulated/0/DCIM/Camera/IMG_20221014_104613.jpg|image/jpeg|4608|2592|0|7250654||1665737175|1665737175670|1665737173772|0|0|0|||||||| +926|1000010627|content://media/external/images/media/1000010627|/storage/emulated/0/DCIM/Camera/IMG_20221014_103342.jpg|image/jpeg|3200|1800|0|3346492||1665736423|1665736423629|1665736422313|0|0|0|||||||| +927|1000010625|content://media/external/images/media/1000010625|/storage/emulated/0/DCIM/Camera/IMG_20221014_103329.jpg|image/jpeg|3200|1800|0|4323902||1665736410|1665736410661|1665736409583|0|0|0|||||||| +928|1000010623|content://media/external/images/media/1000010623|/storage/emulated/0/DCIM/Camera/IMG_20221014_103318.jpg|image/jpeg|3200|1800|0|4007257||1665736401|1665736401173|1665736398426|0|0|0|||||||| +929|1000010618|content://media/external/images/media/1000010618|/storage/emulated/0/DCIM/Camera/IMG_20221014_102657.jpg|image/jpeg|4608|2592|0|7838982||1665736021|1665736021123|1665736017619|0|0|0|||||||| +930|1000010616|content://media/external/images/media/1000010616|/storage/emulated/0/DCIM/Camera/IMG_20221014_100014.jpg|image/jpeg|4608|2592|0|5030307||1665734417|1665734417255|1665734414768|0|0|0|||||||| +931|1000010614|content://media/external/images/media/1000010614|/storage/emulated/0/DCIM/Camera/IMG_20221014_092729.jpg|image/jpeg|5120|2880|0|4641587||1665732453|1665732453798|1665732449888|0|0|0|||||||| +932|1000010602|content://media/external/images/media/1000010602|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0014.jpg|image/jpeg|921|2048|0|77415||1665695854|1665695855413|0|0|0|0|||||||| +933|1000010599|content://media/external/images/media/1000010599|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0013.jpg|image/jpeg|921|2048|0|92208||1665684226|1665684237445|0|0|0|0|||||||| +934|1000010594|content://media/external/images/media/1000010594|/storage/emulated/0/DCIM/Camera/IMG_20221013_181826.jpg|image/jpeg|4608|2592|0|5347170||1665677911|1665677911370|1665677906907|0|0|0|||||||| +935|1000010589|content://media/external/images/media/1000010589|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0010.jpg|image/jpeg|739|1600|0|86837||1665676415|1665676416380|0|0|0|0|||||||| +936|1000010581|content://media/external/images/media/1000010581|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0009.jpg|image/jpeg|1920|1080|0|212229||1665673236|1665673237361|0|0|0|0|||||||| +937|1000010564|content://media/external/images/media/1000010564|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0003.jpg|image/jpeg|833|1024|0|75736||1665658749|1665658750125|0|0|0|0|||||||| +938|1000010561|content://media/external/images/media/1000010561|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0001.jpg|image/jpeg|275|341|0|24349||1665646243|1665646243653|0|0|0|0|||||||| +939|1000010557|content://media/external/images/media/1000010557|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0000.jpg|image/jpeg|480|475|0|41474||1665640762|1665643134433|0|0|0|0|||||||| +940|1000010511|content://media/external/images/media/1000010511|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221011-WA0011.jpg|image/jpeg|1076|1178|0|77570||1665522117|1665522122074|0|0|0|0|||||||| +941|1000010508|content://media/external/images/media/1000010508|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221011-WA0010.jpg|image/jpeg|1032|1205|0|110007||1665521865|1665521866499|0|0|0|0|||||||| +942|1000010499|content://media/external/images/media/1000010499|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221011-WA0007.jpg|image/jpeg|1080|1466|0|105531||1665516451|1665516452538|0|0|0|0|||||||| +943|1000010486|content://media/external/images/media/1000010486|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-11-19-02-32-361_com.huami.watch.hmwatchmanager.jpg|image/jpeg|1080|2400|0|492394||1665507752|1665507752830|0|0|0|0|||||||| +944|1000010476|content://media/external/images/media/1000010476|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221011-WA0001.jpg|image/jpeg|921|2048|0|163198||1665473052|1665473053717|0|0|0|0|||||||| +945|1000010461|content://media/external/images/media/1000010461|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221010-WA0006.jpg|image/jpeg|1425|1021|0|147840||1665407665|1665407665380|0|0|0|0|||||||| +946|1000010455|content://media/external/images/media/1000010455|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221010-WA0004.jpg|image/jpeg|1536|2048|0|321995||1665399558|1665399559418|0|0|0|0|||||||| +947|1000010445|content://media/external/images/media/1000010445|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221010-WA0002.jpg|image/jpeg|2048|1536|0|586720||1665388756|1665388757377|0|0|0|0|||||||| +948|1000010436|content://media/external/images/media/1000010436|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221010-WA0000.jpg|image/jpeg|1599|899|0|130127||1665382825|1665382826415|0|0|0|0|||||||| +949|1000010420|content://media/external/images/media/1000010420|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0010.jpg|image/jpeg|719|1600|0|188568||1665327306|1665327307500|0|0|0|0|||||||| +950|1000010417|content://media/external/images/media/1000010417|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0009.jpg|image/jpeg|1478|732|0|220723||1665327305|1665327306868|0|0|0|0|||||||| +951|1000010411|content://media/external/images/media/1000010411|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0008.jpg|image/jpeg|1200|1600|0|215023||1665313866|1665313873604|0|0|0|0|||||||| +952|1000010408|content://media/external/images/media/1000010408|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0007.jpg|image/jpeg|1600|1200|0|172153||1665313866|1665313866698|0|0|0|0|||||||| +953|1000010405|content://media/external/images/media/1000010405|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0006.jpg|image/jpeg|1200|1600|0|274459||1665313581|1665313582377|0|0|0|0|||||||| +954|1000010402|content://media/external/images/media/1000010402|/storage/emulated/0/DCIM/Camera/IMG_20221009_112237.jpg|image/jpeg|4608|2592|0|5683776||1665307362|1665307362422|1665307357686|0|0|0|||||||| +955|1000010401|content://media/external/images/media/1000010401|/storage/emulated/0/DCIM/Camera/IMG_20221009_112234.jpg|image/jpeg|4608|2592|0|6031061||1665307358|1665307358202|1665307354520|0|0|0|||||||| +956|1000010398|content://media/external/images/media/1000010398|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0005.jpg|image/jpeg|2048|1532|0|273463||1665304403|1665304404722|0|0|0|0|||||||| +957|1000010395|content://media/external/images/media/1000010395|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0004.jpg|image/jpeg|1532|2048|0|279739||1665304402|1665304403390|0|0|0|0|||||||| +958|1000010394|content://media/external/images/media/1000010394|/storage/emulated/0/DCIM/Camera/PANO_20221009_101926.jpg|image/jpeg|8336|4320|0|23919625||1665303574|1665303575183|1665303566000|0|0|0|||||||| +959|1000010393|content://media/external/images/media/1000010393|/storage/emulated/0/DCIM/Camera/PANO_20221009_101911.jpg|image/jpeg|6576|4352|0|19122500||1665303556|1665303557523|1665303551000|0|0|0|||||||| +960|1000010392|content://media/external/images/media/1000010392|/storage/emulated/0/DCIM/Camera/PANO_20221009_101906.jpg|image/jpeg|3440|4288|0|10393651||1665303549|1665303549963|1665303546000|0|0|0|||||||| +961|1000010391|content://media/external/images/media/1000010391|/storage/emulated/0/DCIM/Camera/PANO_20221009_101853.jpg|image/jpeg|7888|4128|0|22719276||1665303539|1665303541179|1665303533000|0|0|0|||||||| +962|1000010360|content://media/external/images/media/1000010360|/storage/emulated/0/DCIM/Camera/IMG_20221008_204414.jpg|image/jpeg|1800|3200|0|2841528||1665254656|1665254656843|1665254655335|0|0|0|||||||| +963|1000010358|content://media/external/images/media/1000010358|/storage/emulated/0/DCIM/Camera/IMG_20221008_204317.jpg|image/jpeg|2592|4608|0|5280985||1665254599|1665254599071|1665254597333|0|0|0|||||||| +964|1000010356|content://media/external/images/media/1000010356|/storage/emulated/0/DCIM/Camera/IMG_20221008_204131.jpg|image/jpeg|2592|4608|0|5544662||1665254492|1665254492871|1665254491374|0|0|0|||||||| +965|1000010354|content://media/external/images/media/1000010354|/storage/emulated/0/DCIM/Camera/IMG_20221008_204125.jpg|image/jpeg|1800|3200|0|3302384||1665254487|1665254487271|1665254485600|0|0|0|||||||| +966|1000010352|content://media/external/images/media/1000010352|/storage/emulated/0/DCIM/Camera/IMG_20221008_204025.jpg|image/jpeg|3200|1800|0|2439147||1665254426|1665254426511|1665254425172|0|0|0|||||||| +967|1000010350|content://media/external/images/media/1000010350|/storage/emulated/0/DCIM/Camera/IMG_20221008_204015.jpg|image/jpeg|4608|2592|0|9509937||1665254418|1665254418399|1665254415984|0|0|0|||||||| +968|1000010348|content://media/external/images/media/1000010348|/storage/emulated/0/DCIM/Camera/IMG_20221008_204010.jpg|image/jpeg|2592|4608|0|8624280||1665254414|1665254414055|1665254410315|0|0|0|||||||| +969|1000010347|content://media/external/images/media/1000010347|/storage/emulated/0/DCIM/Camera/PANO_20221008_203915.jpg|image/jpeg|7696|4256|0|19277752||1665254360|1665254360827|1665254355000|0|0|0|||||||| +970|1000010345|content://media/external/images/media/1000010345|/storage/emulated/0/DCIM/Camera/IMG_20221008_203809.jpg|image/jpeg|3200|1800|0|2006093||1665254291|1665254291351|1665254290650|0|0|0|||||||| +971|1000010343|content://media/external/images/media/1000010343|/storage/emulated/0/DCIM/Camera/IMG_20221008_203755.jpg|image/jpeg|4608|2592|0|5716400||1665254277|1665254277479|1665254275832|0|0|0|||||||| +972|1000010341|content://media/external/images/media/1000010341|/storage/emulated/0/DCIM/Camera/IMG_20221008_203714.jpg|image/jpeg|2592|4608|0|4670429||1665254236|1665254236391|1665254235340|0|0|0|||||||| +973|1000010339|content://media/external/images/media/1000010339|/storage/emulated/0/DCIM/Camera/IMG_20221008_203713.jpg|image/jpeg|2592|4608|0|4529002||1665254234|1665254234951|1665254233333|0|0|0|||||||| +974|1000010337|content://media/external/images/media/1000010337|/storage/emulated/0/DCIM/Camera/IMG_20221008_203618.jpg|image/jpeg|2592|4608|0|5425679||1665254183|1665254183059|1665254178853|0|0|0|||||||| +975|1000010335|content://media/external/images/media/1000010335|/storage/emulated/0/DCIM/Camera/IMG_20221008_203302.jpg|image/jpeg|4608|2592|0|4731923||1665253983|1665253983603|1665253982260|0|0|0|||||||| +976|1000010333|content://media/external/images/media/1000010333|/storage/emulated/0/DCIM/Camera/IMG_20221008_203257.jpg|image/jpeg|2592|4608|0|4993631||1665253979|1665253979183|1665253977727|0|0|0|||||||| +977|1000010331|content://media/external/images/media/1000010331|/storage/emulated/0/DCIM/Camera/IMG_20221008_203156.jpg|image/jpeg|2592|4608|0|4823709||1665253918|1665253918095|1665253916615|0|0|0|||||||| +978|1000010329|content://media/external/images/media/1000010329|/storage/emulated/0/DCIM/Camera/IMG_20221008_203132.jpg|image/jpeg|2592|4608|0|4350676||1665253895|1665253895615|1665253893279|0|0|0|||||||| +979|1000010327|content://media/external/images/media/1000010327|/storage/emulated/0/DCIM/Camera/IMG_20221008_203129.jpg|image/jpeg|2592|4608|0|3778635||1665253893|1665253893067|1665253889724|0|0|0|||||||| +980|1000010325|content://media/external/images/media/1000010325|/storage/emulated/0/DCIM/Camera/IMG_20221008_202948.jpg|image/jpeg|1800|3200|0|2359176||1665253789|1665253789787|1665253788435|0|0|0|||||||| +981|1000010323|content://media/external/images/media/1000010323|/storage/emulated/0/DCIM/Camera/IMG_20221008_202935.jpg|image/jpeg|3200|1800|0|3019439||1665253777|1665253777011|1665253775567|0|0|0|||||||| +982|1000010321|content://media/external/images/media/1000010321|/storage/emulated/0/DCIM/Camera/IMG_20221008_202923.jpg|image/jpeg|3200|1800|0|2859899||1665253765|1665253765427|1665253764710|0|0|0|||||||| +983|1000010319|content://media/external/images/media/1000010319|/storage/emulated/0/DCIM/Camera/IMG_20221008_202904.jpg|image/jpeg|3200|1800|0|2681628||1665253746|1665253746391|1665253744975|0|0|0|||||||| +984|1000010317|content://media/external/images/media/1000010317|/storage/emulated/0/DCIM/Camera/IMG_20221008_202859.jpg|image/jpeg|3200|1800|0|2563967||1665253741|1665253741679|1665253739671|0|0|0|||||||| +985|1000010311|content://media/external/images/media/1000010311|/storage/emulated/0/DCIM/Camera/IMG_20221008_202835.jpg|image/jpeg|4608|2592|0|5413290||1665253717|1665253717171|1665253715502|0|0|0|||||||| +986|1000010309|content://media/external/images/media/1000010309|/storage/emulated/0/DCIM/Camera/IMG_20221008_201745.jpg|image/jpeg|2592|4608|0|5095913||1665253067|1665253067270|1665253065830|0|0|0|||||||| +987|1000010307|content://media/external/images/media/1000010307|/storage/emulated/0/DCIM/Camera/IMG_20221008_201714.jpg|image/jpeg|4608|2592|0|4756363||1665253036|1665253036526|1665253035148|0|0|0|||||||| +988|1000010305|content://media/external/images/media/1000010305|/storage/emulated/0/DCIM/Camera/IMG_20221008_201708.jpg|image/jpeg|2592|4608|0|4608058||1665253029|1665253029966|1665253028485|0|0|0|||||||| +989|1000010303|content://media/external/images/media/1000010303|/storage/emulated/0/DCIM/Camera/IMG_20221008_201705.jpg|image/jpeg|2592|4608|0|4611229||1665253028|1665253028234|1665253026151|0|0|0|||||||| +990|1000010301|content://media/external/images/media/1000010301|/storage/emulated/0/DCIM/Camera/IMG_20221008_200409.jpg|image/jpeg|2592|4608|0|4247381||1665252251|1665252251291|1665252249627|0|0|0|||||||| +991|1000010299|content://media/external/images/media/1000010299|/storage/emulated/0/DCIM/Camera/IMG_20221008_200340.jpg|image/jpeg|2592|4608|0|3018916||1665252224|1665252224267|1665252220992|0|0|0|||||||| +992|1000010297|content://media/external/images/media/1000010297|/storage/emulated/0/DCIM/Camera/IMG_20221008_200335.jpg|image/jpeg|2592|4608|0|4396971||1665252220|1665252220231|1665252216400|0|0|0|||||||| +993|1000010295|content://media/external/images/media/1000010295|/storage/emulated/0/DCIM/Camera/IMG_20221008_195219.jpg|image/jpeg|2592|4608|0|3274287||1665251543|1665251543405|1665251539710|0|0|0|||||||| +994|1000010293|content://media/external/images/media/1000010293|/storage/emulated/0/DCIM/Camera/IMG_20221008_194336.jpg|image/jpeg|2592|4608|0|5088470||1665251018|1665251018254|1665251016347|0|0|0|||||||| +995|1000010291|content://media/external/images/media/1000010291|/storage/emulated/0/DCIM/Camera/IMG_20221008_193448.jpg|image/jpeg|2592|4608|0|3536028||1665250490|1665250490149|1665250488530|0|0|0|||||||| +996|1000010289|content://media/external/images/media/1000010289|/storage/emulated/0/DCIM/Camera/IMG_20221008_193412.jpg|image/jpeg|2592|4608|0|3908486||1665250454|1665250454625|1665250453830|0|0|0|||||||| +997|1000010287|content://media/external/images/media/1000010287|/storage/emulated/0/DCIM/Camera/IMG_20221008_193327.jpg|image/jpeg|2592|4608|0|3992791||1665250409|1665250409437|1665250407795|0|0|0|||||||| +998|1000010285|content://media/external/images/media/1000010285|/storage/emulated/0/DCIM/Camera/IMG_20221008_193248.jpg|image/jpeg|2592|4608|0|4012753||1665250370|1665250370793|1665250369720|0|0|0|||||||| +999|1000010283|content://media/external/images/media/1000010283|/storage/emulated/0/DCIM/Camera/IMG_20221008_193211.jpg|image/jpeg|2592|4608|0|4230246||1665250333|1665250333309|1665250331424|0|0|0|||||||| +1000|1000010281|content://media/external/images/media/1000010281|/storage/emulated/0/DCIM/Camera/IMG_20221008_192319.jpg|image/jpeg|1729|2901|0|1497896||1665249800|1665249800235|1665249691239|0|0|0|||||||| +1001|1000010280|content://media/external/images/media/1000010280|/storage/emulated/0/DCIM/Camera/IMG_20221008_192237.jpg|image/jpeg|2199|3592|0|2562035||1665249758|1665249758655|1665249691239|0|0|0|||||||| +1002|1000010278|content://media/external/images/media/1000010278|/storage/emulated/0/DCIM/Camera/IMG_20221008_192131.jpg|image/jpeg|2592|4608|0|4106871||1665249692|1665249692835|1665249691239|0|0|0|||||||| +1003|1000010276|content://media/external/images/media/1000010276|/storage/emulated/0/DCIM/Camera/IMG_20221008_192057.jpg|image/jpeg|2592|4608|0|4223553||1665249659|1665249659447|1665249657649|0|0|0|||||||| +1004|1000010274|content://media/external/images/media/1000010274|/storage/emulated/0/DCIM/Camera/IMG_20221008_192003.jpg|image/jpeg|2592|4608|0|3892155||1665249606|1665249606199|1665249603872|0|0|0|||||||| +1005|1000010269|content://media/external/images/media/1000010269|/storage/emulated/0/DCIM/Camera/IMG_20221008_191711.jpg|image/jpeg|2592|4608|0|3885607||1665249433|1665249433483|1665249431975|0|0|0|||||||| +1006|1000010267|content://media/external/images/media/1000010267|/storage/emulated/0/DCIM/Camera/IMG_20221008_191658.jpg|image/jpeg|4608|2592|0|4491017||1665249420|1665249421007|1665249418704|0|0|0|||||||| +1007|1000010265|content://media/external/images/media/1000010265|/storage/emulated/0/DCIM/Camera/IMG_20221008_191652.jpg|image/jpeg|4608|2592|0|4222165||1665249416|1665249416227|1665249412857|0|0|0|||||||| +1008|1000010263|content://media/external/images/media/1000010263|/storage/emulated/0/DCIM/Camera/IMG_20221008_191543.jpg|image/jpeg|2592|4608|0|4165301||1665249346|1665249346755|1665249344394|0|0|0|||||||| +1009|1000010261|content://media/external/images/media/1000010261|/storage/emulated/0/DCIM/Camera/IMG_20221008_191538.jpg|image/jpeg|2592|4608|0|3523978||1665249342|1665249342387|1665249338978|0|0|0|||||||| +1010|1000010259|content://media/external/images/media/1000010259|/storage/emulated/0/DCIM/Camera/IMG_20221008_191416.jpg|image/jpeg|2592|4608|0|4280896||1665249259|1665249259455|1665249257790|0|0|0|||||||| +1011|1000010257|content://media/external/images/media/1000010257|/storage/emulated/0/DCIM/Camera/IMG_20221008_191412.jpg|image/jpeg|2592|4608|0|4201873||1665249255|1665249255059|1665249252815|0|0|0|||||||| +1012|1000010255|content://media/external/images/media/1000010255|/storage/emulated/0/DCIM/Camera/IMG_20221008_191407.jpg|image/jpeg|2592|4608|0|4204177||1665249251|1665249251839|1665249248150|0|0|0|||||||| +1013|1000010245|content://media/external/images/media/1000010245|/storage/emulated/0/DCIM/Camera/PANO_20221008_191123.jpg|image/jpeg|8272|4192|0|20403174||1665249091|1665249092394|1665249083000|0|0|0|||||||| +1014|1000010243|content://media/external/images/media/1000010243|/storage/emulated/0/DCIM/Camera/IMG_20221008_191116.jpg|image/jpeg|1800|3200|0|2751081||1665249078|1665249078818|1665249076716|0|0|0|||||||| +1015|1000010241|content://media/external/images/media/1000010241|/storage/emulated/0/DCIM/Camera/IMG_20221008_160833.jpg|image/jpeg|2592|4608|0|4051464||1665238116|1665238116666|1665238114125|0|0|0|||||||| +1016|1000010238|content://media/external/images/media/1000010238|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0010.jpg|image/jpeg|1532|2048|0|369058||1665238108|1665238110247|0|0|0|0|||||||| +1017|1000010235|content://media/external/images/media/1000010235|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0009.jpg|image/jpeg|1532|2048|0|176945||1665238106|1665238107527|0|0|0|0|||||||| +1018|1000010232|content://media/external/images/media/1000010232|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0008.jpg|image/jpeg|2048|1532|0|526280||1665237458|1665237459670|0|0|0|0|||||||| +1019|1000010230|content://media/external/images/media/1000010230|/storage/emulated/0/DCIM/Camera/IMG_20221008_155523.jpg|image/jpeg|4608|2592|0|6112795||1665237325|1665237325394|1665237323762|0|0|0|||||||| +1020|1000010228|content://media/external/images/media/1000010228|/storage/emulated/0/DCIM/Camera/IMG_20221008_155519.jpg|image/jpeg|4608|2592|0|6296161||1665237320|1665237320894|1665237319370|0|0|0|||||||| +1021|1000010226|content://media/external/images/media/1000010226|/storage/emulated/0/DCIM/Camera/IMG_20221008_155511.jpg|image/jpeg|4608|2592|0|6236860||1665237313|1665237313946|1665237311409|0|0|0|||||||| +1022|1000010223|content://media/external/images/media/1000010223|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0007.jpg|image/jpeg|1920|1080|0|350591||1665237207|1665237208647|0|0|0|0|||||||| +1023|1000010221|content://media/external/images/media/1000010221|/storage/emulated/0/DCIM/Camera/IMG_20221008_155322.jpg|image/jpeg|4608|2592|0|6317875||1665237204|1665237204811|1665237202990|0|0|0|||||||| +1024|1000010219|content://media/external/images/media/1000010219|/storage/emulated/0/DCIM/Camera/IMG_20221008_155312.jpg|image/jpeg|2592|4608|0|5861661||1665237194|1665237194415|1665237192623|0|0|0|||||||| +1025|1000010217|content://media/external/images/media/1000010217|/storage/emulated/0/DCIM/Camera/IMG_20221008_155305.jpg|image/jpeg|4608|2592|0|7353049||1665237189|1665237189479|1665237185699|0|0|0|||||||| +1026|1000010215|content://media/external/images/media/1000010215|/storage/emulated/0/DCIM/Camera/IMG_20221008_155301.jpg|image/jpeg|4608|2592|0|5982422||1665237182|1665237182959|1665237181168|0|0|0|||||||| +1027|1000010213|content://media/external/images/media/1000010213|/storage/emulated/0/DCIM/Camera/IMG_20221008_155255.jpg|image/jpeg|2592|4608|0|5339159||1665237180|1665237180127|1665237175965|0|0|0|||||||| +1028|1000010211|content://media/external/images/media/1000010211|/storage/emulated/0/DCIM/Camera/IMG_20221008_155247.jpg|image/jpeg|4608|2592|0|6250172||1665237171|1665237171447|1665237168198|0|0|0|||||||| +1029|1000010206|content://media/external/images/media/1000010206|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0005.jpg|image/jpeg|2048|1532|0|398864||1665237045|1665237046158|0|0|0|0|||||||| +1030|1000010203|content://media/external/images/media/1000010203|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0004.jpg|image/jpeg|2048|1532|0|494789||1665237044|1665237045515|0|0|0|0|||||||| +1031|1000010199|content://media/external/images/media/1000010199|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0003.jpg|image/jpeg|1532|2048|0|411206||1665236987|1665237043411|0|0|0|0|||||||| +1032|1000010197|content://media/external/images/media/1000010197|/storage/emulated/0/DCIM/Camera/IMG_20221008_154706.jpg|image/jpeg|4608|2592|0|5899107||1665236828|1665236828278|1665236827120|0|0|0|||||||| +1033|1000010195|content://media/external/images/media/1000010195|/storage/emulated/0/DCIM/Camera/IMG_20221008_154653.jpg|image/jpeg|4608|2592|0|5671143||1665236814|1665236814826|1665236813284|0|0|0|||||||| +1034|1000010193|content://media/external/images/media/1000010193|/storage/emulated/0/DCIM/Camera/IMG_20221008_154639.jpg|image/jpeg|2592|4608|0|5999929||1665236801|1665236801778|1665236799558|0|0|0|||||||| +1035|1000010191|content://media/external/images/media/1000010191|/storage/emulated/0/DCIM/Camera/IMG_20221008_154441.jpg|image/jpeg|2592|4608|0|5657323||1665236683|1665236683350|1665236681485|0|0|0|||||||| +1036|1000010189|content://media/external/images/media/1000010189|/storage/emulated/0/DCIM/Camera/IMG_20221008_154435.jpg|image/jpeg|2592|4608|0|5209120||1665236676|1665236676818|1665236675228|0|0|0|||||||| +1037|1000010187|content://media/external/images/media/1000010187|/storage/emulated/0/DCIM/Camera/IMG_20221008_154206.jpg|image/jpeg|1800|3200|0|2028241||1665236527|1665236528043|1665236526267|0|0|0|||||||| +1038|1000010185|content://media/external/images/media/1000010185|/storage/emulated/0/DCIM/Camera/IMG_20221008_154153.jpg|image/jpeg|4608|2592|0|5328501||1665236515|1665236515563|1665236513552|0|0|0|||||||| +1039|1000010183|content://media/external/images/media/1000010183|/storage/emulated/0/DCIM/Camera/IMG_20221008_154148.jpg|image/jpeg|4608|2592|0|5160276||1665236509|1665236509967|1665236508368|0|0|0|||||||| +1040|1000010181|content://media/external/images/media/1000010181|/storage/emulated/0/DCIM/Camera/IMG_20221008_153923.jpg|image/jpeg|3200|1800|0|2702002||1665236365|1665236365982|1665236364128|0|0|0|||||||| +1041|1000010179|content://media/external/images/media/1000010179|/storage/emulated/0/DCIM/Camera/IMG_20221008_153909.jpg|image/jpeg|1800|3200|0|2749495||1665236352|1665236352046|1665236349450|0|0|0|||||||| +1042|1000010176|content://media/external/images/media/1000010176|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0002.jpg|image/jpeg|900|1600|0|135673||1665235776|1665235777453|0|0|0|0|||||||| +1043|1000010175|content://media/external/images/media/1000010175|/storage/emulated/0/DCIM/Camera/PANO_20221008_131252.jpg|image/jpeg|10928|4320|0|32047394||1665227578|1665227579376|1665227572000|0|0|0|||||||| +1044|1000010120|content://media/external/images/media/1000010120|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221007-WA0020.jpg|image/jpeg|514|478|0|60693||1665138688|1665138688149|0|0|0|0|||||||| +1045|1000010105|content://media/external/images/media/1000010105|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-07-09-54-14-402_com.android.vending.jpg|image/jpeg|1080|2400|0|178005||1665129254|1665129254824|0|0|0|0|||||||| +1046|1000010103|content://media/external/images/media/1000010103|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221007-WA0018.jpeg|image/jpeg|3840|2160|0|2459004||1665124961|1665124961394|1665124961300|0|0|0|||||||| +1047|1000010042|content://media/external/images/media/1000010042|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0029.jpg|image/jpeg|921|2048|0|127925||1665085686|1665085687494|0|0|0|0|||||||| +1048|1000009982|content://media/external/images/media/1000009982|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0014.jpg|image/jpeg|1152|2048|0|248156||1665051036|1665051036532|0|0|0|0|||||||| +1049|1000009980|content://media/external/images/media/1000009980|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0013.jpg|image/jpeg|1152|2048|0|289449||1665051035|1665051035981|0|0|0|0|||||||| +1050|1000009977|content://media/external/images/media/1000009977|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0012.jpg|image/jpeg|654|810|0|43233||1665050727|1665050728441|0|0|0|0|||||||| +1051|1000009975|content://media/external/images/media/1000009975|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0011.jpg|image/jpeg|449|248|0|27930||1665049972|1665049973091|0|0|0|0|||||||| +1052|1000009973|content://media/external/images/media/1000009973|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0010.jpg|image/jpeg|591|114|0|23126||1665049371|1665049371467|0|0|0|0|||||||| +1053|1000009971|content://media/external/images/media/1000009971|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-06-11-11-59-972_com.lynxspa.prontotreno.jpg|image/jpeg|1080|9356|0|1659044||1665047520|1665047543595|0|0|0|0|||||||| +1054|1000009969|content://media/external/images/media/1000009969|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-06-11-03-46-449_com.lynxspa.prontotreno.jpg|image/jpeg|1080|4772|0|848520||1665047026|1665047036736|0|0|0|0|||||||| +1055|1000009954|content://media/external/images/media/1000009954|/storage/emulated/0/Download/Picture (Device Independent Bitmap) 1.jpg|image/jpeg|1311|770|0|81639||1665038913|1665038913489|0|0|0|0|||||||| +1056|1000009955|content://media/external/images/media/1000009955|/storage/emulated/0/Download/Picture (Device Independent Bitmap) 2.jpg|image/jpeg|1538|1175|0|135065||1665038913|1665038913493|0|0|0|0|||||||| +1057|1000009951|content://media/external/images/media/1000009951|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0004.jpg|image/jpeg|921|2048|0|135969||1665038543|1665038544303|0|0|0|0|||||||| +1058|1000009948|content://media/external/images/media/1000009948|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0003.jpg|image/jpeg|921|2048|0|127590||1665038542|1665038543478|0|0|0|0|||||||| +1059|1000009945|content://media/external/images/media/1000009945|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0002.jpg|image/jpeg|921|2048|0|142264||1665038541|1665038542466|0|0|0|0|||||||| +1060|1000009944|content://media/external/images/media/1000009944|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0001.jpg|image/jpeg|1131|1600|0|266992||1665036737|1665036737462|0|0|0|0|||||||| +1061|1000009930|content://media/external/images/media/1000009930|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0009.jpg|image/jpeg|847|1600|0|95397||1664991426|1664991426832|0|0|0|0|||||||| +1062|1000009924|content://media/external/images/media/1000009924|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0008.jpg|image/jpeg|720|1600|0|89888||1664988371|1664988372245|0|0|0|0|||||||| +1063|1000009921|content://media/external/images/media/1000009921|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0007.jpg|image/jpeg|1080|1477|0|102122||1664988370|1664988371681|0|0|0|0|||||||| +1064|1000009902|content://media/external/images/media/1000009902|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0002.jpg|image/jpeg|662|1024|0|35462||1664964127|1664964128097|0|0|0|0|||||||| +1065|1000009905|content://media/external/images/media/1000009905|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0003.jpg|image/jpeg|662|1024|0|39160||1664964128|1664964128457|0|0|0|0|||||||| +1066|1000009901|content://media/external/images/media/1000009901|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-05-08-54-25-024_com.google.android.documentsui.jpg|image/jpeg|1080|2400|0|260649||1664952865|1664952865069|0|0|0|0|||||||| +1067|1000009900|content://media/external/images/media/1000009900|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-05-08-54-16-223_com.google.android.documentsui.jpg|image/jpeg|1080|2400|0|260972||1664952856|1664952856277|0|0|0|0|||||||| +1068|1000009899|content://media/external/images/media/1000009899|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-05-08-54-07-339_com.google.android.documentsui.jpg|image/jpeg|1080|2400|0|258878||1664952847|1664952847809|0|0|0|0|||||||| +1069|1000009898|content://media/external/images/media/1000009898|/storage/emulated/0/Pictures/insta360_official_weixin_1664952669207.jpg|image/jpeg|528|528|0|50380||1664952669|1664952669288|0|0|0|0|||||||| +1070|1000009895|content://media/external/images/media/1000009895|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0001.jpg|image/jpeg|1024|966|0|83686||1664948570|1664948606616|0|0|0|0|||||||| +1071|1000009892|content://media/external/images/media/1000009892|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0000.jpg|image/jpeg|2000|1500|0|401118||1664948531|1664948532040|0|0|0|0|||||||| +1072|1000009884|content://media/external/images/media/1000009884|/storage/emulated/0/DCIM/Camera/IMG_20221004_183638.jpg|image/jpeg|4608|2592|0|5370143||1664901402|1664901402213|1664901399124|0|0|0|||||||| +1073|1000009882|content://media/external/images/media/1000009882|/storage/emulated/0/DCIM/Camera/IMG_20221004_183543.jpg|image/jpeg|2592|4608|0|3647530||1664901347|1664901348081|1664901343580|0|0|0|||||||| +1074|1000009880|content://media/external/images/media/1000009880|/storage/emulated/0/DCIM/Camera/IMG_20221004_181307.jpg|image/jpeg|4608|2592|0|5640745||1664899992|1664899992279|1664899987914|0|0|0|||||||| +1075|1000009877|content://media/external/images/media/1000009877|/storage/emulated/0/DCIM/Camera/IMG_20221004_172920.jpg|image/jpeg|2592|4608|0|6587792||1664897364|1664897364821|1664897360508|0|0|0|||||||| +1076|1000009857|content://media/external/images/media/1000009857|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221003-WA0007.jpg|image/jpeg|210|238|0|10679||1664829803|1664829803461|0|0|0|0|||||||| +1077|1000009854|content://media/external/images/media/1000009854|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221003-WA0006.jpg|image/jpeg|720|838|0|64635||1664822639|1664822640090|0|0|0|0|||||||| +1078|1000009852|content://media/external/images/media/1000009852|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-03-20-13-15-048_com.huami.watch.hmwatchmanager.jpg|image/jpeg|1080|2400|0|484880||1664820795|1664820795530|0|0|0|0|||||||| +1079|1000009849|content://media/external/images/media/1000009849|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221003-WA0004.jpg|image/jpeg|1072|1511|0|97068||1664817868|1664817869904|0|0|0|0|||||||| +1080|1000009812|content://media/external/images/media/1000009812|/storage/emulated/0/DCIM/Camera/IMG_20221002_185655.jpg|image/jpeg|4608|2592|0|2977988||1664729820|1664729820519|1664729815600|0|0|0|||||||| +1081|1000009794|content://media/external/images/media/1000009794|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221002-WA0004.jpg|image/jpeg|959|1024|0|49210||1664703256|1664703257435|0|0|0|0|||||||| +1082|1000009791|content://media/external/images/media/1000009791|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221002-WA0003.jpg|image/jpeg|1600|1200|0|110618||1664698284|1664698284903|0|0|0|0|||||||| +1083|1000009788|content://media/external/images/media/1000009788|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221002-WA0002.jpg|image/jpeg|1600|1200|0|242222||1664698259|1664698260032|0|0|0|0|||||||| +1084|1000009782|content://media/external/images/media/1000009782|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221002-WA0000.jpg|image/jpeg|1200|1600|0|179055||1664698191|1664698192481|0|0|0|0|||||||| +1085|1000009767|content://media/external/images/media/1000009767|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0068.jpg|image/jpeg|1080|829|0|160826||1664659537|1664659538057|0|0|0|0|||||||| +1086|1000009770|content://media/external/images/media/1000009770|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0069.jpg|image/jpeg|1080|1325|0|147737||1664659538|1664659538690|0|0|0|0|||||||| +1087|1000009773|content://media/external/images/media/1000009773|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0070.jpg|image/jpeg|1080|1089|0|268733||1664659538|1664659538974|0|0|0|0|||||||| +1088|1000009761|content://media/external/images/media/1000009761|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0066.jpg|image/jpeg|1600|1329|0|243546||1664659536|1664659537467|0|0|0|0|||||||| +1089|1000009764|content://media/external/images/media/1000009764|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0067.jpg|image/jpeg|1080|1364|0|272951||1664659537|1664659537769|0|0|0|0|||||||| +1090|1000009755|content://media/external/images/media/1000009755|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0064.jpg|image/jpeg|1600|1200|0|236824||1664659536|1664659536278|0|0|0|0|||||||| +1091|1000009758|content://media/external/images/media/1000009758|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0065.jpg|image/jpeg|1600|1438|0|478915||1664659536|1664659536874|0|0|0|0|||||||| +1092|1000009743|content://media/external/images/media/1000009743|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0060.jpg|image/jpeg|1200|1600|0|420024||1664659534|1664659535169|0|0|0|0|||||||| +1093|1000009746|content://media/external/images/media/1000009746|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0061.jpg|image/jpeg|1600|1200|0|284401||1664659535|1664659535342|0|0|0|0|||||||| +1094|1000009749|content://media/external/images/media/1000009749|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0062.jpg|image/jpeg|1600|1200|0|210447||1664659535|1664659535556|0|0|0|0|||||||| +1095|1000009752|content://media/external/images/media/1000009752|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0063.jpg|image/jpeg|1200|1600|0|389056||1664659535|1664659535874|0|0|0|0|||||||| +1096|1000009737|content://media/external/images/media/1000009737|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0058.jpg|image/jpeg|1600|1200|0|316428||1664659534|1664659534489|0|0|0|0|||||||| +1097|1000009740|content://media/external/images/media/1000009740|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0059.jpg|image/jpeg|1200|1600|0|434185||1664659534|1664659534818|0|0|0|0|||||||| +1098|1000009734|content://media/external/images/media/1000009734|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0057.jpg|image/jpeg|1600|1200|0|264811||1664659462|1664659462468|0|0|0|0|||||||| +1099|1000009731|content://media/external/images/media/1000009731|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0056.jpg|image/jpeg|783|1024|0|77365||1664648908|1664648908580|0|0|0|0|||||||| +1100|1000009722|content://media/external/images/media/1000009722|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0053.jpg|image/jpeg|1600|1200|0|246075||1664646770|1664646771062|0|0|0|0|||||||| +1101|1000009725|content://media/external/images/media/1000009725|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0054.jpg|image/jpeg|1600|1200|0|231572||1664646771|1664646771462|0|0|0|0|||||||| +1102|1000009719|content://media/external/images/media/1000009719|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0052.jpg|image/jpeg|1600|1200|0|218017||1664646769|1664646770061|0|0|0|0|||||||| +1103|1000009716|content://media/external/images/media/1000009716|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0051.jpg|image/jpeg|1600|1200|0|234747||1664646768|1664646769256|0|0|0|0|||||||| +1104|1000009708|content://media/external/images/media/1000009708|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0048.jpg|image/jpeg|2016|1134|0|438720||1664644072|1664644073146|0|0|0|0|||||||| +1105|1000009711|content://media/external/images/media/1000009711|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0049.jpg|image/jpeg|2016|1134|0|383405||1664644073|1664644073929|0|0|0|0|||||||| +1106|1000009705|content://media/external/images/media/1000009705|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0047.jpg|image/jpeg|1824|1368|0|260396||1664644071|1664644072134|0|0|0|0|||||||| +1107|1000009699|content://media/external/images/media/1000009699|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0045.jpg|image/jpeg|1824|1368|0|262108||1664644070|1664644071098|0|0|0|0|||||||| +1108|1000009702|content://media/external/images/media/1000009702|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0046.jpg|image/jpeg|1824|1368|0|242647||1664644071|1664644071837|0|0|0|0|||||||| +1109|1000009690|content://media/external/images/media/1000009690|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0042.jpg|image/jpeg|1824|1368|0|247516||1664644069|1664644070079|0|0|0|0|||||||| +1110|1000009693|content://media/external/images/media/1000009693|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0043.jpg|image/jpeg|1824|1368|0|252444||1664644070|1664644070352|0|0|0|0|||||||| +1111|1000009696|content://media/external/images/media/1000009696|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0044.jpg|image/jpeg|1824|1368|0|244386||1664644070|1664644070662|0|0|0|0|||||||| +1112|1000009684|content://media/external/images/media/1000009684|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0040.jpg|image/jpeg|2016|1134|0|421078||1664644068|1664644069017|0|0|0|0|||||||| +1113|1000009687|content://media/external/images/media/1000009687|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0041.jpg|image/jpeg|2016|1134|0|433683||1664644069|1664644069462|0|0|0|0|||||||| +1114|1000009681|content://media/external/images/media/1000009681|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0039.jpg|image/jpeg|2016|1134|0|353885||1664644067|1664644068095|0|0|0|0|||||||| +1115|1000009645|content://media/external/images/media/1000009645|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0027.jpg|image/jpeg|1600|900|0|168552||1664625240|1664625241130|0|0|0|0|||||||| +1116|1000009648|content://media/external/images/media/1000009648|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0028.jpg|image/jpeg|1600|900|0|85472||1664625241|1664625241384|0|0|0|0|||||||| +1117|1000009641|content://media/external/images/media/1000009641|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-01-12-26-43-727_com.arashivision.insta360akiko.jpg|image/jpeg|1080|2400|0|501747||1664620004|1664620004078|0|0|0|0|||||||| +1118|1000009611|content://media/external/images/media/1000009611|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0017.jpg|image/jpeg|1536|2048|0|714656||1664614638|1664614639721|0|0|0|0|||||||| +1119|1000009608|content://media/external/images/media/1000009608|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0016.jpg|image/jpeg|1536|2048|0|607050||1664614632|1664614633365|0|0|0|0|||||||| +1120|1000009607|content://media/external/images/media/1000009607|/storage/emulated/0/DCIM/Camera/PANO_20221001_101019.jpg|image/jpeg|8400|4192|0|33795058||1664611824|1664611824859|1664611819000|0|0|0|||||||| +1121|1000009606|content://media/external/images/media/1000009606|/storage/emulated/0/DCIM/Camera/PANO_20221001_100903.jpg|image/jpeg|9552|3936|0|31636657||1664611748|1664611749397|1664611743000|0|0|0|||||||| +1122|1000009605|content://media/external/images/media/1000009605|/storage/emulated/0/DCIM/Camera/PANO_20221001_100853.jpg|image/jpeg|11792|4032|0|35559963||1664611738|1664611739161|1664611733000|0|0|0|||||||| +1123|1000009594|content://media/external/images/media/1000009594|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0013.jpg|image/jpeg|1536|2048|0|379911||1664609338|1664609339124|0|0|0|0|||||||| +1124|1000009562|content://media/external/images/media/1000009562|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0002.jpg|image/jpeg|1080|1116|0|136557||1664605022|1664605023301|0|0|0|0|||||||| +1125|1000009545|content://media/external/images/media/1000009545|/storage/emulated/0/Pictures/insta360_official_weixin_1664566464837.jpg|image/jpeg|528|528|0|50380||1664566464|1664566464927|0|0|0|0|||||||| +1126|1000009543|content://media/external/images/media/1000009543|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220930-WA0004.jpg|image/jpeg|768|1024|0|67825||1664563474|1664563474875|0|0|0|0|||||||| +1127|1000009510|content://media/external/images/media/1000009510|/storage/emulated/0/DCIM/Camera/IMG_20220930_143931.jpg|image/jpeg|4608|2592|0|4430993||1664541573|1664541573944|1664541571808|0|0|0|||||||| +1128|1000009508|content://media/external/images/media/1000009508|/storage/emulated/0/DCIM/Camera/IMG_20220930_143901.jpg|image/jpeg|4608|2592|0|5380389||1664541542|1664541542636|1664541541670|0|0|0|||||||| +1129|1000009506|content://media/external/images/media/1000009506|/storage/emulated/0/DCIM/Camera/IMG_20220930_143827.jpg|image/jpeg|4608|2592|0|5488287||1664541509|1664541509124|1664541507507|0|0|0|||||||| +1130|1000009504|content://media/external/images/media/1000009504|/storage/emulated/0/DCIM/Camera/IMG_20220930_143821.jpg|image/jpeg|4608|2592|0|6007507||1664541503|1664541503532|1664541501912|0|0|0|||||||| +1131|1000009502|content://media/external/images/media/1000009502|/storage/emulated/0/DCIM/Camera/IMG_20220930_143817.jpg|image/jpeg|4608|2592|0|5581139||1664541499|1664541499628|1664541497730|0|0|0|||||||| +1132|1000009500|content://media/external/images/media/1000009500|/storage/emulated/0/DCIM/Camera/IMG_20220930_143734.jpg|image/jpeg|4608|2592|0|5484543||1664541457|1664541457384|1664541454937|0|0|0|||||||| +1133|1000009498|content://media/external/images/media/1000009498|/storage/emulated/0/DCIM/Camera/IMG_20220930_134548.jpg|image/jpeg|3032|1098|0|2369868||1664538350|1664538350650|1664538350338|0|0|0|||||||| +1134|1000009493|content://media/external/images/media/1000009493|/storage/emulated/0/DCIM/Camera/IMG_20220930_083842.jpg|image/jpeg|4261|840|0|998424||1664519923|1664519923177|1664519901754|0|0|0|||||||| +1135|1000009491|content://media/external/images/media/1000009491|/storage/emulated/0/DCIM/Camera/IMG_20220930_083819.jpg|image/jpeg|840|4262|0|2693023||1664519902|1664519902289|1664519901754|0|0|0|||||||| +1136|1000009466|content://media/external/images/media/1000009466|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220929-WA0009.jpg|image/jpeg|1532|2048|0|314555||1664472299|1664472300385|0|0|0|0|||||||| +1137|1000009463|content://media/external/images/media/1000009463|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220929-WA0008.jpg|image/jpeg|1532|2048|0|301806||1664472296|1664472299841|0|0|0|0|||||||| +1138|1000009442|content://media/external/images/media/1000009442|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-29-12-12-45-830_com.google.android.googlequicksearchbox.jpg|image/jpeg|1080|2400|0|420409||1664446365|1664446365994|0|0|0|0|||||||| +1139|1000009154|content://media/external/images/media/1000009154|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0012.jpg|image/jpeg|719|1600|0|77173||1664372957|1664372958143|0|0|0|0|||||||| +1140|1000009152|content://media/external/images/media/1000009152|/storage/emulated/0/DCIM/Creative/IMG_20220928_144848.jpg|image/jpeg|738|1175|0|180214||1664369328|1664369328892|0|0|0|0|||||||| +1141|1000009149|content://media/external/images/media/1000009149|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220928-WA0010.jpg|image/jpeg|738|1600|0|76333||1664365170|1664365171314|0|0|0|0|||||||| +1142|1000009143|content://media/external/images/media/1000009143|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0008.jpg|image/jpeg|1080|847|0|54745||1664357181|1664357182108|0|0|0|0|||||||| +1143|1000009140|content://media/external/images/media/1000009140|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0007.jpg|image/jpeg|921|2048|0|81893||1664354981|1664354982154|0|0|0|0|||||||| +1144|1000009137|content://media/external/images/media/1000009137|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0006.jpg|image/jpeg|921|2048|0|66433||1664352885|1664352886152|0|0|0|0|||||||| +1145|1000009134|content://media/external/images/media/1000009134|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0005.jpg|image/jpeg|921|2048|0|150835||1664352412|1664352412860|0|0|0|0|||||||| +1146|1000009131|content://media/external/images/media/1000009131|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0004.jpg|image/jpeg|2048|1532|0|379628||1664352267|1664352267703|0|0|0|0|||||||| +1147|1000009128|content://media/external/images/media/1000009128|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0003.jpg|image/jpeg|1920|1080|0|208529||1664352036|1664352036306|0|0|0|0|||||||| +1148|1000009125|content://media/external/images/media/1000009125|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0002.jpg|image/jpeg|1920|1080|0|103926||1664351995|1664351995957|0|0|0|0|||||||| +1149|1000009120|content://media/external/images/media/1000009120|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-28-07-44-59-635_it.caitalia.apphub.jpg|image/jpeg|1080|2400|0|325443||1664343899|1664343899961|0|0|0|0|||||||| +1150|1000009101|content://media/external/images/media/1000009101|/storage/emulated/0/DCIM/Camera/IMG_20220927_192915.jpg|image/jpeg|4608|2592|0|4234171||1664299760|1664299760685|1664299755870|0|0|0|||||||| +1151|1000009096|content://media/external/images/media/1000009096|/storage/emulated/0/DCIM/Camera/IMG_20220927_181947.jpg|image/jpeg|2592|4608|0|3641456||1664295595|1664295595130|1664295588198|0|0|0|||||||| +1152|1000009094|content://media/external/images/media/1000009094|/storage/emulated/0/DCIM/Camera/IMG_20220927_171852.jpg|image/jpeg|4608|2592|0|5155139||1664291933|1664291933593|1664291916484|0|0|0|||||||| +1153|1000009092|content://media/external/images/media/1000009092|/storage/emulated/0/DCIM/Camera/IMG_20220927_171836.jpg|image/jpeg|2592|4608|0|5699962||1664291919|1664291919081|1664291916484|0|0|0|||||||| +1154|1000009090|content://media/external/images/media/1000009090|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220927-WA0016.jpeg|image/jpeg|3840|2160|90|1243555||1664291870|1664291870025|1664291869960|0|0|0|||||||| +1155|1000009088|content://media/external/images/media/1000009088|/storage/emulated/0/DCIM/Camera/IMG_20220927_171601.jpg|image/jpeg|4608|2592|0|4054676||1664291761|1664291761858|1664291737298|0|0|0|||||||| +1156|1000009086|content://media/external/images/media/1000009086|/storage/emulated/0/DCIM/Camera/IMG_20220927_171537.jpg|image/jpeg|2592|4608|0|4502724||1664291742|1664291742922|1664291737298|0|0|0|||||||| +1157|1000009084|content://media/external/images/media/1000009084|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-27-15-35-12-729_com.brytonsport.active.jpg|image/jpeg|1080|2400|0|485155||1664285713|1664285713198|0|0|0|0|||||||| +1158|1000009080|content://media/external/images/media/1000009080|/storage/emulated/0/DCIM/Camera/PANO_20220927_144303.jpg|image/jpeg|7120|4224|0|24200909||1664282588|1664282589304|1664282583000|0|0|0|||||||| +1159|1000009077|content://media/external/images/media/1000009077|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220927-WA0011.jpg|image/jpeg|410|721|0|44345||1664281414|1664281415931|0|0|0|0|||||||| +1160|1000009074|content://media/external/images/media/1000009074|/storage/emulated/0/DCIM/Camera/IMG_20220927_141228.jpg|image/jpeg|2592|4608|0|4973876||1664280750|1664280750982|1664280748517|0|0|0|||||||| +1161|1000009072|content://media/external/images/media/1000009072|/storage/emulated/0/DCIM/Camera/IMG_20220927_141150.jpg|image/jpeg|4608|2592|0|6503266||1664280716|1664280716298|1664280710591|0|0|0|||||||| +1162|1000009067|content://media/external/images/media/1000009067|/storage/emulated/0/DCIM/Camera/IMG_20220927_133832.jpg|image/jpeg|3200|1800|0|2728258||1664278716|1664278716407|1664278712601|0|0|0|||||||| +1163|1000009065|content://media/external/images/media/1000009065|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220927-WA0005.jpeg|image/jpeg|3840|2160|90|1005669||1664278071|1664278071447|1664278071356|0|0|0|||||||| +1164|1000009063|content://media/external/images/media/1000009063|/storage/emulated/0/DCIM/Camera/PANO_20220927_132514.jpg|image/jpeg|9808|4192|0|27465059||1664277919|1664277920339|1664277914000|0|0|0|||||||| +1165|1000009062|content://media/external/images/media/1000009062|/storage/emulated/0/DCIM/Camera/PANO_20220927_132214.jpg|image/jpeg|12656|3904|0|36401975||1664277740|1664277742178|1664277734000|0|0|0|||||||| +1166|1000009061|content://media/external/images/media/1000009061|/storage/emulated/0/DCIM/Camera/PANO_20220927_132209.jpg|image/jpeg|5360|4352|0|17571362||1664277733|1664277733682|1664277729000|0|0|0|||||||| +1167|1000009060|content://media/external/images/media/1000009060|/storage/emulated/0/DCIM/Camera/PANO_20220927_132158.jpg|image/jpeg|8048|4320|0|26208576||1664277723|1664277724154|1664277718000|0|0|0|||||||| +1168|1000009048|content://media/external/images/media/1000009048|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220927-WA0000.jpg|image/jpeg|948|559|0|147855||1664264887|1664264887856|0|0|0|0|||||||| +1169|1000009035|content://media/external/images/media/1000009035|/storage/emulated/0/DCIM/Camera/1664202377932.jpg|image/jpeg|3840|2160|0|4245459||1664202378|1664202378000|0|0|0|0|||||||| +1170|1000009030|content://media/external/images/media/1000009030|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220926-WA0004.jpg|image/jpeg|1080|683|0|64305||1664194371|1664194372468|0|0|0|0|||||||| +1171|1000009026|content://media/external/images/media/1000009026|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-26-12-38-14-676_com.mi.globalbrowser.jpg|image/jpeg|1080|2400|0|390750||1664188694|1664188695044|0|0|0|0|||||||| +1172|1000009025|content://media/external/images/media/1000009025|/storage/emulated/0/DCIM/Camera/IMG_20220926_120403.jpg|image/jpeg|4608|2592|0|4886532||1664186643|1664186643828|1664088953912|0|0|0|||||||| +1173|1000009024|content://media/external/images/media/1000009024|/storage/emulated/0/DCIM/Camera/IMG_20220926_120030.jpg|image/jpeg|1250|889|0|380741||1664186431|1664186431193|1663782713270|0|0|0|||||||| +1174|1000009005|content://media/external/images/media/1000009005|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0012.jpg|image/jpeg|1080|1315|0|81483||1664137294|1664137296477|0|0|0|0|||||||| +1175|1000008974|content://media/external/images/media/1000008974|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0007.jpg|image/jpeg|2048|1532|0|251491||1664102106|1664102107846|0|0|0|0|||||||| +1176|1000008965|content://media/external/images/media/1000008965|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0004.jpg|image/jpeg|921|2048|0|207449||1664100472|1664100473924|0|0|0|0|||||||| +1177|1000008956|content://media/external/images/media/1000008956|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0002.jpg|image/jpeg|579|960|0|59433||1664093512|1664093512917|0|0|0|0|||||||| +1178|1000008953|content://media/external/images/media/1000008953|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0001.jpg|image/jpeg|921|2048|0|154388||1664092943|1664092944656|0|0|0|0|||||||| +1179|1000008947|content://media/external/images/media/1000008947|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0000.jpg|image/jpeg|921|2048|0|86718||1664091787|1664091788481|0|0|0|0|||||||| +1180|1000008945|content://media/external/images/media/1000008945|/storage/emulated/0/DCIM/Camera/IMG_20220925_085624.jpg|image/jpeg|2592|4608|0|4338691||1664088987|1664088987787|1664088985340|0|0|0|||||||| +1181|1000008941|content://media/external/images/media/1000008941|/storage/emulated/0/DCIM/Camera/IMG_20220925_085404.jpg|image/jpeg|4608|2592|0|4448429||1664088850|1664088851838|1664088844575|0|0|0|||||||| +1182|1000008939|content://media/external/images/media/1000008939|/storage/emulated/0/DCIM/Camera/IMG_20220925_084757.jpg|image/jpeg|4608|2592|0|4416218||1664088481|1664088481770|1664088478910|0|0|0|||||||| +1183|1000008926|content://media/external/images/media/1000008926|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220924-WA0008.jpg|image/jpeg|570|805|0|49819||1664044698|1664044700035|0|0|0|0|||||||| +1184|1000008902|content://media/external/images/media/1000008902|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220924-WA0002.jpg|image/jpeg|828|1792|0|109586||1664003872|1664003873040|0|0|0|0|||||||| +1185|1000008899|content://media/external/images/media/1000008899|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220924-WA0001.jpg|image/jpeg|899|1599|0|144474||1664003190|1664003191439|0|0|0|0|||||||| +1186|1000008896|content://media/external/images/media/1000008896|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220924-WA0000.jpg|image/jpeg|899|1599|0|148439||1664003110|1664003110905|0|0|0|0|||||||| +1187|1000008877|content://media/external/images/media/1000008877|/storage/emulated/0/DCIM/Camera/IMG_20220923_193005.jpg|image/jpeg|3200|1800|0|2215028||1663954207|1663954207409|1663954205593|0|0|0|||||||| +1188|1000008875|content://media/external/images/media/1000008875|/storage/emulated/0/DCIM/Camera/IMG_20220923_192959.jpg|image/jpeg|3200|1800|0|2673939||1663954203|1663954203101|1663954200302|0|0|0|||||||| +1189|1000008873|content://media/external/images/media/1000008873|/storage/emulated/0/DCIM/Camera/IMG_20220923_192922.jpg|image/jpeg|4608|2592|0|5066184||1663954166|1663954166161|1663954162787|0|0|0|||||||| +1190|1000008871|content://media/external/images/media/1000008871|/storage/emulated/0/DCIM/Camera/IMG_20220923_192914.jpg|image/jpeg|4608|2592|0|5855215||1663954156|1663954156589|1663954154347|0|0|0|||||||| +1191|1000008869|content://media/external/images/media/1000008869|/storage/emulated/0/DCIM/Camera/IMG_20220923_192854.jpg|image/jpeg|4608|2592|0|5140011||1663954138|1663954138141|1663954135140|0|0|0|||||||| +1192|1000008867|content://media/external/images/media/1000008867|/storage/emulated/0/DCIM/Camera/IMG_20220923_192833.jpg|image/jpeg|4608|2592|0|4350257||1663954119|1663954119069|1663954114150|0|0|0|||||||| +1193|1000008719|content://media/external/images/media/1000008719|/storage/emulated/0/DCIM/Camera/IMG_20220921_195153.jpg|image/jpeg|2592|4608|0|1697726||1663782714|1663782714925|1663782713270|0|0|0|||||||| +1194|1000008673|content://media/external/images/media/1000008673|/storage/emulated/0/DCIM/Camera/IMG_20220920_184315.jpg|image/jpeg|4608|2592|0|3459940||1663692196|1663692196343|1663692158117|0|0|0|||||||| +1195|1000008541|content://media/external/images/media/1000008541|/storage/emulated/0/Pictures/my_stickers_images/IMG_20220919_095303.jpg|image/jpeg|512|512|0|64947||1663573983|1663573983890|0|0|0|0|||||||| +1196|1000000201|content://media/external/images/media/1000000201|/storage/emulated/0/Pictures/my_stickers_images/sp_ayjluwu_z1663526402.webp|image/webp|512|512|0|47438||1663526402|1663526402660|0|0|0|0|||||||| +1197|1000000197|content://media/external/images/media/1000000197|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220918-WA0020.jpg|image/jpeg|2048|1532|0|306946||1663526338|1663526339430|0|0|0|0|||||||| +1198|64548|content://media/external/images/media/64548|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0011.jpg|image/jpeg|2048|1532|0|341822||1659297624|1663526338375|0|0|0|0|||||||| +1199|1000000195|content://media/external/images/media/1000000195|/storage/emulated/0/Pictures/my_stickers_images/sp_arnhqri_z1663526310.webp|image/webp|512|512|0|46416||1663526310|1663526310392|0|0|0|0|||||||| +1200|1000000194|content://media/external/images/media/1000000194|/storage/emulated/0/DCIM/Creative/IMG_20220918_203704.jpg|image/jpeg|495|472|0|89127||1663526224|1663526224552|0|0|0|0|||||||| +1201|1000000191|content://media/external/images/media/1000000191|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220918-WA0018.jpg|image/jpeg|921|2048|0|174006||1663526146|1663526146736|0|0|0|0|||||||| +1202|1000000189|content://media/external/images/media/1000000189|/storage/emulated/0/Pictures/my_stickers_images/sp_arspfti_z1663525312.webp|image/webp|512|512|0|45596||1663525312|1663525312520|0|0|0|0|||||||| +1203|1000000162|content://media/external/images/media/1000000162|/storage/emulated/0/DCIM/Camera/IMG_20220918_160816.jpg|image/jpeg|4608|2592|0|4927543||1663510099|1663510099212|1663510096325|0|0|0|||||||| +1204|1000000161|content://media/external/images/media/1000000161|/storage/emulated/0/DCIM/Camera/IMG_20220918_160814.jpg|image/jpeg|4608|2592|0|5176101||1663510098|1663510098920|1663510094906|0|0|0|||||||| +1205|1000000160|content://media/external/images/media/1000000160|/storage/emulated/0/DCIM/Creative/IMG_20220918_160520.jpg|image/jpeg|2048|1324|0|1213807||1663509920|1663509920740|0|0|0|0|||||||| +1206|1000000151|content://media/external/images/media/1000000151|/storage/emulated/0/DCIM/Camera/IMG_20220918_150916.jpg|image/jpeg|2592|4608|0|4800705||1663506559|1663506559468|1663506556660|0|0|0|||||||| +1207|1000000149|content://media/external/images/media/1000000149|/storage/emulated/0/DCIM/Camera/IMG_20220918_150912.jpg|image/jpeg|2592|4608|0|5406584||1663506555|1663506555500|1663506552241|0|0|0|||||||| +1208|1000000133|content://media/external/images/media/1000000133|/storage/emulated/0/DCIM/Camera/IMG_20220918_112703.jpg|image/jpeg|2592|4608|0|10030007||1663493227|1663493227422|1663493224198|0|0|0|||||||| +1209|1000000131|content://media/external/images/media/1000000131|/storage/emulated/0/DCIM/Camera/IMG_20220918_112701.jpg|image/jpeg|2592|4608|0|9993662||1663493224|1663493224098|1663493221297|0|0|0|||||||| +1210|1000000129|content://media/external/images/media/1000000129|/storage/emulated/0/DCIM/Camera/IMG_20220918_112642.jpg|image/jpeg|2592|4608|0|9864863||1663493208|1663493208298|1663493203271|0|0|0|||||||| +1211|1000000021|content://media/external/images/media/1000000021|/storage/emulated/0/DCIM/Camera/IMG_20220917_094537.jpg|image/jpeg|2529|1599|0|2565544||1663400739|1663400739792|1663400739372|0|0|0|||||||| +1212|1000000019|content://media/external/images/media/1000000019|/storage/emulated/0/DCIM/Camera/IMG_20220917_094530.jpg|image/jpeg|2037|1276|0|2170806||1663400733|1663400733212|1663400732789|0|0|0|||||||| +1213|68711|content://media/external/images/media/68711|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220913-WA0012.jpg|image/jpeg|1024|768|0|218150||1663067351|1663067352563|0|0|0|0|||||||| +1214|68714|content://media/external/images/media/68714|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220913-WA0013.jpg|image/jpeg|709|1024|0|79512||1663067352|1663067352983|0|0|0|0|||||||| +1215|68708|content://media/external/images/media/68708|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220913-WA0011.jpg|image/jpeg|888|1024|0|180261||1663067351|1663067351865|0|0|0|0|||||||| +1216|68688|content://media/external/images/media/68688|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-13-11-51-53-713_com.strava.jpg|image/jpeg|1080|2400|0|796082||1663062713|1663062713868|0|0|0|0|||||||| +1217|68685|content://media/external/images/media/68685|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220913-WA0003.jpg|image/jpeg|1080|1480|0|139136||1663062339|1663062340190|0|0|0|0|||||||| +1218|68682|content://media/external/images/media/68682|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-13-11-42-37-357_com.strava.jpg|image/jpeg|1080|2400|0|801076||1663062157|1663062157772|0|0|0|0|||||||| +1219|68555|content://media/external/images/media/68555|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0059.jpg|image/jpeg|1052|473|0|34200||1662893317|1662893317777|0|0|0|0|||||||| +1220|68551|content://media/external/images/media/68551|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0057.jpg|image/jpeg|1052|473|0|33888||1662893315|1662893315528|0|0|0|0|||||||| +1221|68547|content://media/external/images/media/68547|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0055.jpg|image/jpeg|1156|520|0|38713||1662893311|1662893311141|0|0|0|0|||||||| +1222|68543|content://media/external/images/media/68543|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0053.jpg|image/jpeg|1280|333|0|25140||1662893309|1662893309869|0|0|0|0|||||||| +1223|68506|content://media/external/images/media/68506|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0041.jpg|image/jpeg|520|1156|0|76818||1662887910|1662887911267|0|0|0|0|||||||| +1224|68509|content://media/external/images/media/68509|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0042.jpg|image/jpeg|520|1156|0|100458||1662887911|1662887911567|0|0|0|0|||||||| +1225|68503|content://media/external/images/media/68503|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0040.jpg|image/jpeg|520|1156|0|54004||1662887910|1662887910781|0|0|0|0|||||||| +1226|68500|content://media/external/images/media/68500|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0039.jpg|image/jpeg|1600|1200|0|370481||1662887702|1662887703351|0|0|0|0|||||||| +1227|68492|content://media/external/images/media/68492|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0035.jpg|image/jpeg|1280|720|0|84200||1662887560|1662887561064|0|0|0|0|||||||| +1228|68496|content://media/external/images/media/68496|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0037.jpg|image/jpeg|1280|720|0|68858||1662887561|1662887561945|0|0|0|0|||||||| +1229|68484|content://media/external/images/media/68484|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0031.jpg|image/jpeg|1280|720|0|96462||1662887554|1662887555138|0|0|0|0|||||||| +1230|68488|content://media/external/images/media/68488|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0033.jpg|image/jpeg|1280|720|0|102199||1662887555|1662887555988|0|0|0|0|||||||| +1231|68463|content://media/external/images/media/68463|/storage/emulated/0/DCIM/Camera/IMG_20220911_101402.jpg|image/jpeg|2316|2068|0|5323574||1662884045|1662884045575|1662884044582|0|0|0|||||||| +1232|68457|content://media/external/images/media/68457|/storage/emulated/0/DCIM/Camera/IMG_20220911_100709.jpg|image/jpeg|4608|2592|0|9934040||1662883633|1662883633722|1662883630158|0|0|0|||||||| +1233|68456|content://media/external/images/media/68456|/storage/emulated/0/DCIM/Camera/IMG_20220911_100706.jpg|image/jpeg|4608|2592|0|10075006||1662883630|1662883630510|1662883626590|0|0|0|||||||| +1234|68455|content://media/external/images/media/68455|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0026.jpg|image/jpeg|1280|260|0|32992||1662883569|1662883569214|0|0|0|0|||||||| +1235|68444|content://media/external/images/media/68444|/storage/emulated/0/DCIM/Camera/IMG_20220911_091644.jpg|image/jpeg|2592|4608|0|5165350||1662880608|1662880608977|1662880605400|0|0|0|||||||| +1236|68442|content://media/external/images/media/68442|/storage/emulated/0/DCIM/Camera/IMG_20220911_091641.jpg|image/jpeg|2592|4608|0|5405839||1662880604|1662880604953|1662880601201|0|0|0|||||||| +1237|68440|content://media/external/images/media/68440|/storage/emulated/0/DCIM/Camera/IMG_20220911_091525.jpg|image/jpeg|3200|1800|0|1908222||1662880530|1662880530184|1662880525975|0|0|0|||||||| +1238|68438|content://media/external/images/media/68438|/storage/emulated/0/DCIM/Camera/IMG_20220911_091518.jpg|image/jpeg|1800|3200|0|2067999||1662880522|1662880522180|1662880518259|0|0|0|||||||| +1239|68435|content://media/external/images/media/68435|/storage/emulated/0/DCIM/Camera/IMG_20220911_091509.jpg|image/jpeg|3200|1800|0|2105916||1662880513|1662880513752|1662880509536|0|0|0|||||||| +1240|68433|content://media/external/images/media/68433|/storage/emulated/0/DCIM/Camera/IMG_20220911_091506.jpg|image/jpeg|3200|1800|0|2095243||1662880510|1662880510580|1662880506264|0|0|0|||||||| +1241|68432|content://media/external/images/media/68432|/storage/emulated/0/DCIM/Camera/IMG_20220911_091501.jpg|image/jpeg|1800|3200|0|2015282||1662880508|1662880508072|1662880502374|0|0|0|||||||| +1242|68087|content://media/external/images/media/68087|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0032.jpg|image/jpeg|2048|1532|0|602830||1662795373|1662878401870|0|0|0|0|||||||| +1243|68204|content://media/external/images/media/68204|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0071.jpg|image/jpeg|1600|1200|0|248772||1662805183|1662878401554|0|0|0|0|||||||| +1244|68240|content://media/external/images/media/68240|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0083.jpg|image/jpeg|1200|1600|0|449034||1662805233|1662878401193|0|0|0|0|||||||| +1245|68309|content://media/external/images/media/68309|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0104.jpg|image/jpeg|1280|958|0|73252||1662817221|1662878116444|0|0|0|0|||||||| +1246|68360|content://media/external/images/media/68360|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0116.jpg|image/jpeg|958|1280|0|87214||1662823282|1662878116876|0|0|0|0|||||||| +1247|68252|content://media/external/images/media/68252|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0087.jpg|image/jpeg|721|1600|0|347794||1662805392|1662878035759|0|0|0|0|||||||| +1248|68420|content://media/external/images/media/68420|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0022.jpg|image/jpeg|1600|1200|0|268928||1662877723|1662877726939|0|0|0|0|||||||| +1249|68367|content://media/external/images/media/68367|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0119.jpg|image/jpeg|1080|1080|0|91895||1662826510|1662826510112|0|0|0|0|||||||| +1250|68328|content://media/external/images/media/68328|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0113.jpg|image/jpeg|1532|2048|0|337625||1662821443|1662821444199|0|0|0|0|||||||| +1251|68325|content://media/external/images/media/68325|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0112.jpg|image/jpeg|721|1600|0|243242||1662820296|1662820297365|0|0|0|0|||||||| +1252|68321|content://media/external/images/media/68321|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0110.jpg|image/jpeg|1599|899|0|209633||1662819977|1662819978456|0|0|0|0|||||||| +1253|68316|content://media/external/images/media/68316|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0108.jpg|image/jpeg|520|1156|0|36097||1662817847|1662817848586|0|0|0|0|||||||| +1254|68313|content://media/external/images/media/68313|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0106.jpg|image/jpeg|1156|520|0|57533||1662817847|1662817847987|0|0|0|0|||||||| +1255|68305|content://media/external/images/media/68305|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0102.jpg|image/jpeg|958|1280|0|59181||1662816894|1662816895242|0|0|0|0|||||||| +1256|68300|content://media/external/images/media/68300|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0100.jpg|image/jpeg|1280|343|0|34910||1662813376|1662813376590|0|0|0|0|||||||| +1257|68261|content://media/external/images/media/68261|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0090.jpg|image/jpeg|1600|1197|0|218001||1662806638|1662806639002|0|0|0|0|||||||| +1258|68258|content://media/external/images/media/68258|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0089.jpg|image/jpeg|1600|1197|0|172733||1662806637|1662806638358|0|0|0|0|||||||| +1259|68255|content://media/external/images/media/68255|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0088.jpg|image/jpeg|923|2048|0|430222||1662805417|1662805419148|0|0|0|0|||||||| +1260|68249|content://media/external/images/media/68249|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0086.jpg|image/jpeg|1200|1600|0|421159||1662805237|1662805239159|0|0|0|0|||||||| +1261|68246|content://media/external/images/media/68246|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0085.jpg|image/jpeg|1200|1600|0|476648||1662805236|1662805237950|0|0|0|0|||||||| +1262|68243|content://media/external/images/media/68243|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0084.jpg|image/jpeg|1600|1200|0|543670||1662805234|1662805236262|0|0|0|0|||||||| +1263|68237|content://media/external/images/media/68237|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0082.jpg|image/jpeg|1200|1600|0|354965||1662805232|1662805233852|0|0|0|0|||||||| +1264|68234|content://media/external/images/media/68234|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0081.jpg|image/jpeg|719|1600|0|287932||1662805231|1662805232902|0|0|0|0|||||||| +1265|68231|content://media/external/images/media/68231|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0080.jpg|image/jpeg|1200|1600|0|470258||1662805230|1662805231938|0|0|0|0|||||||| +1266|68228|content://media/external/images/media/68228|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0079.jpg|image/jpeg|1200|1600|0|497040||1662805229|1662805230787|0|0|0|0|||||||| +1267|68225|content://media/external/images/media/68225|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0078.jpg|image/jpeg|1200|1600|0|422648||1662805228|1662805229561|0|0|0|0|||||||| +1268|68222|content://media/external/images/media/68222|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0077.jpg|image/jpeg|1600|1200|0|525628||1662805227|1662805228385|0|0|0|0|||||||| +1269|68219|content://media/external/images/media/68219|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0076.jpg|image/jpeg|1600|1200|0|552140||1662805224|1662805225713|0|0|0|0|||||||| +1270|68216|content://media/external/images/media/68216|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0075.jpg|image/jpeg|1600|1200|0|509908||1662805217|1662805218992|0|0|0|0|||||||| +1271|68213|content://media/external/images/media/68213|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0074.jpg|image/jpeg|1200|1600|0|240911||1662805215|1662805216843|0|0|0|0|||||||| +1272|68210|content://media/external/images/media/68210|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0073.jpg|image/jpeg|1600|1200|0|473311||1662805209|1662805210793|0|0|0|0|||||||| +1273|68207|content://media/external/images/media/68207|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0072.jpg|image/jpeg|1600|1200|0|566704||1662805206|1662805207752|0|0|0|0|||||||| +1274|68200|content://media/external/images/media/68200|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0069.jpg|image/jpeg|958|1280|0|69963||1662804227|1662804228136|0|0|0|0|||||||| +1275|68197|content://media/external/images/media/68197|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0068.jpg|image/jpeg|721|1600|0|281738||1662804019|1662804029441|0|0|0|0|||||||| +1276|68194|content://media/external/images/media/68194|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0067.jpg|image/jpeg|721|1600|0|274653||1662804012|1662804019661|0|0|0|0|||||||| +1277|68188|content://media/external/images/media/68188|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0065.jpg|image/jpeg|1197|1600|0|171620||1662802860|1662802861999|0|0|0|0|||||||| +1278|68185|content://media/external/images/media/68185|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0064.jpg|image/jpeg|721|1600|0|271792||1662800765|1662800766648|0|0|0|0|||||||| +1279|68181|content://media/external/images/media/68181|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0062.jpg|image/jpeg|1156|520|0|67679||1662799082|1662799082806|0|0|0|0|||||||| +1280|68175|content://media/external/images/media/68175|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0060.jpg|image/jpeg|958|1280|0|61490||1662798023|1662798023918|0|0|0|0|||||||| +1281|68167|content://media/external/images/media/68167|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0056.jpg|image/jpeg|520|1156|0|48548||1662797869|1662797870011|0|0|0|0|||||||| +1282|68170|content://media/external/images/media/68170|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0058.jpg|image/jpeg|473|1052|0|50781||1662797870|1662797870346|0|0|0|0|||||||| +1283|68160|content://media/external/images/media/68160|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0053.jpg|image/jpeg|1052|473|0|45721||1662797867|1662797868538|0|0|0|0|||||||| +1284|68150|content://media/external/images/media/68150|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0051.jpg|image/jpeg|1280|958|0|81399||1662797005|1662797006619|0|0|0|0|||||||| +1285|68139|content://media/external/images/media/68139|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0049.jpg|image/jpeg|1920|1080|0|332074||1662796399|1662796400856|0|0|0|0|||||||| +1286|68135|content://media/external/images/media/68135|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0047.jpg|image/jpeg|1280|277|0|26572||1662796356|1662796357450|0|0|0|0|||||||| +1287|68123|content://media/external/images/media/68123|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0044.jpg|image/jpeg|520|1156|0|83295||1662795818|1662795819551|0|0|0|0|||||||| +1288|68120|content://media/external/images/media/68120|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0043.jpg|image/jpeg|1532|2048|0|507537||1662795391|1662795393230|0|0|0|0|||||||| +1289|68117|content://media/external/images/media/68117|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0042.jpg|image/jpeg|1532|2048|0|502020||1662795390|1662795391808|0|0|0|0|||||||| +1290|68114|content://media/external/images/media/68114|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0041.jpg|image/jpeg|1532|2048|0|561016||1662795388|1662795390368|0|0|0|0|||||||| +1291|68111|content://media/external/images/media/68111|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0040.jpg|image/jpeg|1532|2048|0|563386||1662795387|1662795388715|0|0|0|0|||||||| +1292|68108|content://media/external/images/media/68108|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0039.jpg|image/jpeg|1532|2048|0|602483||1662795385|1662795387154|0|0|0|0|||||||| +1293|68105|content://media/external/images/media/68105|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0038.jpg|image/jpeg|1532|2048|0|652457||1662795383|1662795385571|0|0|0|0|||||||| +1294|68102|content://media/external/images/media/68102|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0037.jpg|image/jpeg|2048|1532|0|669929||1662795382|1662795383932|0|0|0|0|||||||| +1295|68099|content://media/external/images/media/68099|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0036.jpg|image/jpeg|1532|2048|0|595224||1662795380|1662795382046|0|0|0|0|||||||| +1296|68096|content://media/external/images/media/68096|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0035.jpg|image/jpeg|1532|2048|0|561258||1662795379|1662795380454|0|0|0|0|||||||| +1297|68093|content://media/external/images/media/68093|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0034.jpg|image/jpeg|1532|2048|0|597732||1662795377|1662795379040|0|0|0|0|||||||| +1298|68090|content://media/external/images/media/68090|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0033.jpg|image/jpeg|2048|1532|0|646637||1662795376|1662795377553|0|0|0|0|||||||| +1299|68084|content://media/external/images/media/68084|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0031.jpg|image/jpeg|2048|1532|0|595393||1662795371|1662795373558|0|0|0|0|||||||| +1300|68081|content://media/external/images/media/68081|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0030.jpg|image/jpeg|1532|2048|0|572834||1662795356|1662795358115|0|0|0|0|||||||| +1301|68073|content://media/external/images/media/68073|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0028.jpg|image/jpeg|1280|958|0|81148||1662793808|1662793809546|0|0|0|0|||||||| +1302|68066|content://media/external/images/media/68066|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0027.jpg|image/jpeg|2048|1532|0|327643||1662789891|1662789892627|0|0|0|0|||||||| +1303|68063|content://media/external/images/media/68063|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0026.jpg|image/jpeg|2048|1532|0|295555||1662789890|1662789891752|0|0|0|0|||||||| +1304|68060|content://media/external/images/media/68060|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0025.jpg|image/jpeg|2048|1532|0|282254||1662789889|1662789890854|0|0|0|0|||||||| +1305|68056|content://media/external/images/media/68056|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0023.jpg|image/jpeg|1156|520|0|52380||1662789195|1662789196009|0|0|0|0|||||||| +1306|68053|content://media/external/images/media/68053|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0022.jpg|image/jpeg|719|1599|0|74021||1662788883|1662788884231|0|0|0|0|||||||| +1307|68024|content://media/external/images/media/68024|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0010.jpg|image/jpeg|1280|720|0|96960||1662787072|1662787076903|0|0|0|0|||||||| +1308|68028|content://media/external/images/media/68028|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0012.jpg|image/jpeg|1280|720|0|82695||1662787073|1662787076385|0|0|0|0|||||||| +1309|68046|content://media/external/images/media/68046|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0020.jpg|image/jpeg|1280|720|0|61980||1662787075|1662787076238|0|0|0|0|||||||| +1310|68036|content://media/external/images/media/68036|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0016.jpg|image/jpeg|1280|720|0|70416||1662787074|1662787075353|0|0|0|0|||||||| +1311|68041|content://media/external/images/media/68041|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0018.jpg|image/jpeg|1280|720|0|22437||1662787074|1662787075178|0|0|0|0|||||||| +1312|68033|content://media/external/images/media/68033|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0014.jpg|image/jpeg|1280|720|0|85984||1662787074|1662787074396|0|0|0|0|||||||| +1313|68013|content://media/external/images/media/68013|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0004.jpg|image/jpeg|1280|720|0|49452||1662787071|1662787072075|0|0|0|0|||||||| +1314|68016|content://media/external/images/media/68016|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0006.jpg|image/jpeg|1280|720|0|47209||1662787072|1662787072378|0|0|0|0|||||||| +1315|68020|content://media/external/images/media/68020|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0008.jpg|image/jpeg|1280|720|0|104156||1662787072|1662787072955|0|0|0|0|||||||| +1316|68004|content://media/external/images/media/68004|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0001.jpg|image/jpeg|1599|719|0|48903||1662785165|1662785166370|0|0|0|0|||||||| +1317|68007|content://media/external/images/media/68007|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0002.jpg|image/jpeg|1386|520|0|36199||1662785166|1662785166642|0|0|0|0|||||||| +1318|68010|content://media/external/images/media/68010|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0003.jpg|image/jpeg|1599|719|0|59410||1662785166|1662785166971|0|0|0|0|||||||| +1319|67949|content://media/external/images/media/67949|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0037.jpg|image/jpeg|1080|1920|0|210831||1662738809|1662738810843|0|0|0|0|||||||| +1320|67946|content://media/external/images/media/67946|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0036.jpg|image/jpeg|1080|1920|0|267487||1662738769|1662738771062|0|0|0|0|||||||| +1321|67925|content://media/external/images/media/67925|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0028.jpg|image/jpeg|1280|958|0|124821||1662735031|1662735032076|0|0|0|0|||||||| +1322|67922|content://media/external/images/media/67922|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0027.jpg|image/jpeg|1280|720|0|97526||1662734914|1662734915519|0|0|0|0|||||||| +1323|67910|content://media/external/images/media/67910|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0023.jpg|image/jpeg|1052|592|0|46274||1662733024|1662734914060|0|0|0|0|||||||| +1324|67885|content://media/external/images/media/67885|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0015.jpg|image/jpeg|1599|900|0|203579||1662725327|1662725328767|0|0|0|0|||||||| +1325|67882|content://media/external/images/media/67882|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0014.jpg|image/jpeg|1599|900|0|187428||1662725326|1662725327962|0|0|0|0|||||||| +1326|67288|content://media/external/images/media/67288|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220903-WA0010.jpg|image/jpeg|1599|899|0|308662||1662191735|1662317080219|0|0|0|0|||||||| +1327|67412|content://media/external/images/media/67412|/storage/emulated/0/DCIM/Camera/IMG_20220904_113323.jpg|image/jpeg|2592|4608|0|4387599||1662284007|1662284007761|1662284003511|0|0|0|||||||| +1328|67291|content://media/external/images/media/67291|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220903-WA0011.jpg|image/jpeg|899|1599|0|278801||1662191735|1662191736172|0|0|0|0|||||||| +1329|67294|content://media/external/images/media/67294|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220903-WA0012.jpg|image/jpeg|1599|899|0|310113||1662191736|1662191736528|0|0|0|0|||||||| +1330|67240|content://media/external/images/media/67240|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220902-WA0013.jpg|image/jpeg|1600|1197|0|235236||1662144027|1662144027766|0|0|0|0|||||||| +1331|67150|content://media/external/images/media/67150|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220902-WA0000.jpeg|image/jpeg|3840|2160|90|1278366||1662103170|1662103170810|1662103170602|0|0|0|||||||| +1332|67133|content://media/external/images/media/67133|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220901-WA0007.jpg|image/jpeg|1532|2048|0|329962||1662054252|1662054253194|0|0|0|0|||||||| +1333|67130|content://media/external/images/media/67130|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220901-WA0006.jpg|image/jpeg|2048|1532|0|326442||1662054251|1662054252422|0|0|0|0|||||||| +1334|67127|content://media/external/images/media/67127|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220901-WA0005.jpg|image/jpeg|1200|1600|0|418462||1662047041|1662047041757|0|0|0|0|||||||| +1335|67050|content://media/external/images/media/67050|/storage/emulated/0/DCIM/Camera/IMG_20220830_203602.jpg|image/jpeg|2592|4608|0|5545670||1661884564|1661884564640|1661884562298|0|0|0|||||||| +1336|66861|content://media/external/images/media/66861|/storage/emulated/0/DCIM/Screenshots/IMG_20220826_173419.jpg|image/jpeg|998|1444|0|351691||1661528059|1661528059190|0|0|0|0|||||||| +1337|66641|content://media/external/images/media/66641|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220821-WA0004.jpg|image/jpeg|2048|969|0|158164||1661090255|1661090256165|0|0|0|0|||||||| +1338|66644|content://media/external/images/media/66644|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220821-WA0005.jpg|image/jpeg|2048|969|0|150216||1661090256|1661090256591|0|0|0|0|||||||| +1339|66647|content://media/external/images/media/66647|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220821-WA0006.jpg|image/jpeg|2048|969|0|145679||1661090256|1661090256930|0|0|0|0|||||||| +1340|66638|content://media/external/images/media/66638|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220821-WA0003.jpg|image/jpeg|2048|969|0|168830||1661090255|1661090255564|0|0|0|0|||||||| +1341|66056|content://media/external/images/media/66056|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220818-WA0005.jpg|image/jpeg|1599|1200|0|198274||1660847566|1660847566591|0|0|0|0|||||||| +1342|66029|content://media/external/images/media/66029|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220818-WA0001.jpg|image/jpeg|720|1600|0|118438||1660819764|1660819766733|0|0|0|0|||||||| +1343|65942|content://media/external/images/media/65942|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220815-WA0040.jpg|image/jpeg|1560|1040|0|319624||1660570970|1660570972188|0|0|0|0|||||||| +1344|65939|content://media/external/images/media/65939|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220815-WA0039.jpg|image/jpeg|1560|1040|0|334672||1660570969|1660570970386|0|0|0|0|||||||| +1345|65772|content://media/external/images/media/65772|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0033.jpg|image/jpeg|720|1600|0|101175||1660501623|1660505222769|0|0|0|0|||||||| +1346|65703|content://media/external/images/media/65703|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0010.jpg|image/jpeg|720|1600|0|79131||1660479581|1660479582177|0|0|0|0|||||||| +1347|65697|content://media/external/images/media/65697|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0008.jpg|image/jpeg|720|1600|0|77201||1660479580|1660479581313|0|0|0|0|||||||| +1348|65700|content://media/external/images/media/65700|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0009.jpg|image/jpeg|720|1600|0|71876||1660479581|1660479581663|0|0|0|0|||||||| +1349|65691|content://media/external/images/media/65691|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0006.jpg|image/jpeg|720|1600|0|79866||1660479579|1660479580343|0|0|0|0|||||||| +1350|65694|content://media/external/images/media/65694|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0007.jpg|image/jpeg|720|1600|0|115255||1660479580|1660479580834|0|0|0|0|||||||| +1351|65681|content://media/external/images/media/65681|/storage/emulated/0/DCIM/Camera/IMG_20220814_122453.jpg|image/jpeg|4608|2592|0|4763091||1660472696|1660472696711|1660472693947|0|0|0|||||||| +1352|65631|content://media/external/images/media/65631|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-13-15-11-42-247_com.brytonsport.active.jpg|image/jpeg|1080|2400|0|518897||1660396302|1660396302430|0|0|0|0|||||||| +1353|65623|content://media/external/images/media/65623|/storage/emulated/0/DCIM/Camera/PANO_20220813_130822.jpg|image/jpeg|8304|4288|0|30635896||1660388910|1660388912098|1660388902000|0|0|0|||||||| +1354|65621|content://media/external/images/media/65621|/storage/emulated/0/DCIM/Camera/IMG_20220813_130811.jpg|image/jpeg|4608|2592|0|7666894||1660388893|1660388893914|1660388891741|0|0|0|||||||| +1355|65618|content://media/external/images/media/65618|/storage/emulated/0/DCIM/Camera/IMG_20220813_122646.jpg|image/jpeg|1800|3200|0|2702424||1660386408|1660386408046|1660386406229|0|0|0|||||||| +1356|65617|content://media/external/images/media/65617|/storage/emulated/0/DCIM/Camera/PANO_20220813_122635.jpg|image/jpeg|2512|4352|0|8818024||1660386398|1660386398310|1660386395000|0|0|0|||||||| +1357|65615|content://media/external/images/media/65615|/storage/emulated/0/DCIM/Camera/IMG_20220813_121124.jpg|image/jpeg|2592|4608|0|7093971||1660385487|1660385487527|1660385484426|0|0|0|||||||| +1358|65612|content://media/external/images/media/65612|/storage/emulated/0/DCIM/Camera/IMG_20220813_120053.jpg|image/jpeg|3200|1800|0|3850048||1660384855|1660384855803|1660384853376|0|0|0|||||||| +1359|65610|content://media/external/images/media/65610|/storage/emulated/0/DCIM/Camera/PANO_20220813_115149.jpg|image/jpeg|8784|4288|0|30604067||1660384314|1660384316263|1660384309000|0|0|0|||||||| +1360|65608|content://media/external/images/media/65608|/storage/emulated/0/DCIM/Camera/IMG_20220813_112422.jpg|image/jpeg|7203|3785|0|12456026||1660382664|1660382664606|1660382623000|0|0|0|||||||| +1361|65607|content://media/external/images/media/65607|/storage/emulated/0/DCIM/Camera/PANO_20220813_112343.jpg|image/jpeg|7888|4320|0|29941622||1660382631|1660382632354|1660382623000|0|0|0|||||||| +1362|65605|content://media/external/images/media/65605|/storage/emulated/0/DCIM/Camera/IMG_20220813_112319.jpg|image/jpeg|5120|2880|0|5734843||1660382601|1660382601402|1660382599620|0|0|0|||||||| +1363|65603|content://media/external/images/media/65603|/storage/emulated/0/DCIM/Camera/IMG_20220813_112123.jpg|image/jpeg|5120|2880|0|10462742||1660382486|1660382486842|1660382484250|0|0|0|||||||| +1364|65600|content://media/external/images/media/65600|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220813-WA0006.jpg|image/jpeg|921|2048|0|144017||1660382217|1660382218689|0|0|0|0|||||||| +1365|65598|content://media/external/images/media/65598|/storage/emulated/0/DCIM/Camera/IMG_20220813_101616.jpg|image/jpeg|5120|2880|0|2443491||1660378577|1660378577622|1660378554477|0|0|0|||||||| +1366|65596|content://media/external/images/media/65596|/storage/emulated/0/DCIM/Camera/IMG_20220813_101554.jpg|image/jpeg|5120|2880|0|9377681||1660378557|1660378557726|1660378554477|0|0|0|||||||| +1367|65587|content://media/external/images/media/65587|/storage/emulated/0/DCIM/Camera/PANO_20220813_095418.jpg|image/jpeg|8496|4352|0|29569132||1660377266|1660377266838|1660377258000|0|0|0|||||||| +1368|65580|content://media/external/images/media/65580|/storage/emulated/0/DCIM/Camera/IMG_20220813_083934.jpg|image/jpeg|2592|4608|0|8722462||1660372777|1660372777294|1660372774836|0|0|0|||||||| +1369|65577|content://media/external/images/media/65577|/storage/emulated/0/DCIM/Camera/IMG_20220813_083349.jpg|image/jpeg|4608|2592|0|7331172||1660372433|1660372433375|1660372429808|0|0|0|||||||| +1370|65566|content://media/external/images/media/65566|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220812-WA0011.jpg|image/jpeg|1532|2048|0|264181||1660328283|1660328285402|0|0|0|0|||||||| +1371|65482|content://media/external/images/media/65482|/storage/emulated/0/DCIM/Camera/IMG_20220811_173908.jpg|image/jpeg|3200|1800|0|2812132||1660232356|1660232357996|1660232348830|0|0|0|||||||| +1372|65445|content://media/external/images/media/65445|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-11-11-00-35-707_de.komoot.android.jpg|image/jpeg|1080|2400|0|809898||1660208436|1660208436290|0|0|0|0|||||||| +1373|65325|content://media/external/images/media/65325|/storage/emulated/0/DCIM/Camera/IMG_20220809_192936.jpg|image/jpeg|2592|4608|0|4214473||1660066181|1660066182007|1660066176993|0|0|0|||||||| +1374|65242|content://media/external/images/media/65242|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220808-WA0013.jpg|image/jpeg|640|959|0|57094||1659979131|1659979132782|0|0|0|0|||||||| +1375|65231|content://media/external/images/media/65231|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220808-WA0010.jpg|image/jpeg|940|788|0|537190||1659970736|1659970737779|0|0|0|0|||||||| +1376|65213|content://media/external/images/media/65213|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220808-WA0002.jpg|image/jpeg|720|1600|0|54807||1659950267|1659950267930|0|0|0|0|||||||| +1377|65188|content://media/external/images/media/65188|/storage/emulated/0/DCIM/Camera/IMG_20220807_195532.jpg|image/jpeg|4608|2592|0|4020584||1659894934|1659894934588|1659894932253|0|0|0|||||||| +1378|65186|content://media/external/images/media/65186|/storage/emulated/0/DCIM/Camera/IMG_20220807_184711.jpg|image/jpeg|4608|2592|0|4938602||1659890834|1659890834019|1659890831860|0|0|0|||||||| +1379|65183|content://media/external/images/media/65183|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220807-WA0010.jpg|image/jpeg|896|2000|0|74448||1659890393|1659890393540|0|0|0|0|||||||| +1380|65171|content://media/external/images/media/65171|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220807-WA0006.jpg|image/jpeg|1080|1637|0|211109||1659886625|1659886626424|0|0|0|0|||||||| +1381|65119|content://media/external/images/media/65119|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220806-WA0070.jpg|image/jpeg|319|190|0|26787||1659813078|1659813083426|0|0|0|0|||||||| +1382|65116|content://media/external/images/media/65116|/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_205718.jpg|image/jpeg|742|1030|0|209275||1659812238|1659812238819|1659738030000|0|0|0|||||||| +1383|65114|content://media/external/images/media/65114|/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_205520.jpg|image/jpeg|678|968|0|187666||1659812120|1659812120571|1659738030000|0|0|0|||||||| +1384|65112|content://media/external/images/media/65112|/storage/emulated/0/DCIM/Camera/IMG_20220806_200909.jpg|image/jpeg|2592|4608|0|5432680||1659809351|1659809351490|1659809349126|0|0|0|||||||| +1385|65110|content://media/external/images/media/65110|/storage/emulated/0/DCIM/Camera/IMG_20220806_200903.jpg|image/jpeg|2592|4608|0|5461245||1659809348|1659809348478|1659809343333|0|0|0|||||||| +1386|65074|content://media/external/images/media/65074|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803997289.jpg|image/jpeg|1920|1080|0|260104||1659803998|1659803998546|1659738030000|0|0|0|||||||| +1387|65073|content://media/external/images/media/65073|/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_183758.jpg|image/jpeg|1129|652|0|252797||1659803878|1659803878530|1659738030000|0|0|0|||||||| +1388|65071|content://media/external/images/media/65071|/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_183524.jpg|image/jpeg|1920|1080|0|502373||1659803724|1659803724762|1659738030000|0|0|0|||||||| +1389|65070|content://media/external/images/media/65070|/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_183433.jpg|image/jpeg|1240|626|0|235635||1659803673|1659803673598|1659738030000|0|0|0|||||||| +1390|65065|content://media/external/images/media/65065|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803278076.jpg|image/jpeg|1920|1080|0|233213||1659803278|1659803278582|1659738030000|0|0|0|||||||| +1391|65060|content://media/external/images/media/65060|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803202400.jpg|image/jpeg|1920|1080|0|208335||1659803202|1659803202922|1659738030000|0|0|0|||||||| +1392|65059|content://media/external/images/media/65059|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803180304.jpg|image/jpeg|1920|1080|0|237923||1659803180|1659803180754|1659738030000|0|0|0|||||||| +1393|65058|content://media/external/images/media/65058|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803156553.jpg|image/jpeg|1920|1080|0|230439||1659803157|1659803157030|1659738030000|0|0|0|||||||| +1394|65057|content://media/external/images/media/65057|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803142382.jpg|image/jpeg|1920|1080|0|214629||1659803142|1659803142862|1659738030000|0|0|0|||||||| +1395|65056|content://media/external/images/media/65056|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803133394.jpg|image/jpeg|1920|1080|0|206446||1659803133|1659803133894|1659738030000|0|0|0|||||||| +1396|65055|content://media/external/images/media/65055|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803089637.jpg|image/jpeg|1920|1080|0|236453||1659803090|1659803090102|1659738030000|0|0|0|||||||| +1397|65054|content://media/external/images/media/65054|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803075094.jpg|image/jpeg|1920|1080|0|221905||1659803075|1659803075586|1659738030000|0|0|0|||||||| +1398|65053|content://media/external/images/media/65053|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803065132.jpg|image/jpeg|1920|1080|0|185377||1659803065|1659803065554|1659738030000|0|0|0|||||||| +1399|65052|content://media/external/images/media/65052|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803049397.jpg|image/jpeg|1920|1080|0|200023||1659803049|1659803049962|1659738030000|0|0|0|||||||| +1400|65051|content://media/external/images/media/65051|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659803017449.jpg|image/jpeg|1920|1080|0|239186||1659803018|1659803018050|1659738030000|0|0|0|||||||| +1401|65050|content://media/external/images/media/65050|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802928948.jpg|image/jpeg|1920|1080|0|197828||1659802929|1659802929498|1659738030000|0|0|0|||||||| +1402|65049|content://media/external/images/media/65049|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802895515.jpg|image/jpeg|1920|1080|0|257717||1659802896|1659802896014|1659738030000|0|0|0|||||||| +1403|65048|content://media/external/images/media/65048|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802878320.jpg|image/jpeg|1920|1080|0|232179||1659802878|1659802878886|1659738030000|0|0|0|||||||| +1404|65047|content://media/external/images/media/65047|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802854254.jpg|image/jpeg|1920|1080|0|242638||1659802854|1659802854886|1659738030000|0|0|0|||||||| +1405|65046|content://media/external/images/media/65046|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802792419.jpg|image/jpeg|1920|1080|0|250515||1659802792|1659802792830|1659738030000|0|0|0|||||||| +1406|65045|content://media/external/images/media/65045|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802774233.jpg|image/jpeg|1920|1080|0|254426||1659802774|1659802774766|1659738030000|0|0|0|||||||| +1407|65044|content://media/external/images/media/65044|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802760807.jpg|image/jpeg|1920|1080|0|227792||1659802761|1659802761414|1659738030000|0|0|0|||||||| +1408|65043|content://media/external/images/media/65043|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802742718.jpg|image/jpeg|1920|1080|0|228522||1659802743|1659802743230|1659738030000|0|0|0|||||||| +1409|65042|content://media/external/images/media/65042|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802673097.jpg|image/jpeg|1920|1080|0|247042||1659802673|1659802673582|1659738030000|0|0|0|||||||| +1410|65041|content://media/external/images/media/65041|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802598338.jpg|image/jpeg|1920|1080|0|211428||1659802599|1659802599010|1659738030000|0|0|0|||||||| +1411|65040|content://media/external/images/media/65040|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802490053.jpg|image/jpeg|1920|1080|0|225672||1659802491|1659802491370|1659738030000|0|0|0|||||||| +1412|65039|content://media/external/images/media/65039|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802401681.jpg|image/jpeg|1920|1080|0|265130||1659802402|1659802402266|1659738030000|0|0|0|||||||| +1413|65038|content://media/external/images/media/65038|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802359461.jpg|image/jpeg|1920|1080|0|268561||1659802359|1659802359942|1659738030000|0|0|0|||||||| +1414|65037|content://media/external/images/media/65037|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802313187.jpg|image/jpeg|1920|1080|0|259866||1659802313|1659802313754|1659738030000|0|0|0|||||||| +1415|65036|content://media/external/images/media/65036|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802271415.jpg|image/jpeg|1920|1080|0|257983||1659802271|1659802272002|1659738030000|0|0|0|||||||| +1416|65035|content://media/external/images/media/65035|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802218131.jpg|image/jpeg|1920|1080|0|257076||1659802218|1659802218894|1659738030000|0|0|0|||||||| +1417|65034|content://media/external/images/media/65034|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802183156.jpg|image/jpeg|1920|1080|0|245102||1659802184|1659802184082|1659738030000|0|0|0|||||||| +1418|65033|content://media/external/images/media/65033|/storage/emulated/0/DCIM/GoPro-Exports/64932_1659802138784.jpg|image/jpeg|1920|1080|0|205522||1659802139|1659802139674|1659738030000|0|0|0|||||||| +1419|64936|content://media/external/images/media/64936|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220806-WA0002.jpg|image/jpeg|896|2000|0|40501||1659779173|1659779174946|0|0|0|0|||||||| +1420|64894|content://media/external/images/media/64894|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220805-WA0003.jpg|image/jpeg|1080|318|0|14201||1659687622|1659687623568|0|0|0|0|||||||| +1421|64819|content://media/external/images/media/64819|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220804-WA0016.jpg|image/jpeg|946|2048|0|278372||1659626050|1659626051242|0|0|0|0|||||||| +1422|64814|content://media/external/images/media/64814|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220804-WA0014.jpg|image/jpeg|921|2048|0|103477||1659622721|1659622721917|0|0|0|0|||||||| +1423|64808|content://media/external/images/media/64808|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220804-WA0012.jpg|image/jpeg|1080|2019|0|239602||1659622677|1659622678959|0|0|0|0|||||||| +1424|64765|content://media/external/images/media/64765|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220804-WA0000.jpg|image/jpeg|738|1600|0|84939||1659590012|1659590013421|0|0|0|0|||||||| +1425|64755|content://media/external/images/media/64755|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220803-WA0010.jpg|image/jpeg|900|900|0|141015||1659540177|1659540178207|0|0|0|0|||||||| +1426|64743|content://media/external/images/media/64743|/storage/emulated/0/DCIM/Screenshots/IMG_20220803_163733.jpg|image/jpeg|1058|1230|0|274309||1659537453|1659537453936|0|0|0|0|||||||| +1427|64736|content://media/external/images/media/64736|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220803-WA0005.jpg|image/jpeg|960|540|0|58820||1659525442|1659525443052|0|0|0|0|||||||| +1428|64722|content://media/external/images/media/64722|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220803-WA0001.jpg|image/jpeg|921|2048|0|167981||1659513300|1659513300615|0|0|0|0|||||||| +1429|64715|content://media/external/images/media/64715|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220803-WA0000.jpg|image/jpeg|921|2048|0|138623||1659479760|1659479910830|0|0|0|0|||||||| +1430|64698|content://media/external/images/media/64698|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-02-15-15-28-283_it.subito.jpg|image/jpeg|1080|2400|0|453944||1659446128|1659446128690|0|0|0|0|||||||| +1431|64691|content://media/external/images/media/64691|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-02-12-09-32-492_it.subito.jpg|image/jpeg|1080|2400|0|587852||1659434972|1659434972609|0|0|0|0|||||||| +1432|64689|content://media/external/images/media/64689|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-02-12-09-12-808_it.subito.jpg|image/jpeg|1080|2400|0|552853||1659434953|1659434953189|0|0|0|0|||||||| +1433|64682|content://media/external/images/media/64682|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220802-WA0002.jpg|image/jpeg|1196|1600|0|137277||1659432054|1659432055424|0|0|0|0|||||||| +1434|64680|content://media/external/images/media/64680|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-02-08-55-44-581_com.whatsapp.jpg|image/jpeg|1080|2400|0|728107||1659423344|1659423344768|0|0|0|0|||||||| +1435|64654|content://media/external/images/media/64654|/storage/emulated/0/DCIM/Facebook/FB_IMG_1659383396599.jpg|image/jpeg|960|640|0|71124||1659383396|1659383396615|0|0|0|0|||||||| +1436|64653|content://media/external/images/media/64653|/storage/emulated/0/DCIM/Facebook/FB_IMG_1659383367309.jpg|image/jpeg|960|640|0|69144||1659383367|1659383367323|0|0|0|0|||||||| +1437|64652|content://media/external/images/media/64652|/storage/emulated/0/DCIM/Facebook/FB_IMG_1659383340679.jpg|image/jpeg|960|640|0|69450||1659383340|1659383340699|0|0|0|0|||||||| +1438|64651|content://media/external/images/media/64651|/storage/emulated/0/DCIM/Facebook/FB_IMG_1659383329248.jpg|image/jpeg|960|640|0|71040||1659383329|1659383329263|0|0|0|0|||||||| +1439|64649|content://media/external/images/media/64649|/storage/emulated/0/DCIM/Facebook/FB_IMG_1659383276845.jpg|image/jpeg|960|640|0|54014||1659383276|1659383276871|0|0|0|0|||||||| +1440|64648|content://media/external/images/media/64648|/storage/emulated/0/DCIM/Facebook/FB_IMG_1659383271090.jpg|image/jpeg|960|640|0|73323||1659383271|1659383271155|0|0|0|0|||||||| +1441|64626|content://media/external/images/media/64626|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220801-WA0016.jpg|image/jpeg|1600|1200|0|197459||1659374503|1659374503866|0|0|0|0|||||||| +1442|64561|content://media/external/images/media/64561|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220801-WA0000.jpg|image/jpeg|899|1599|0|130388||1659330301|1659330302093|0|0|0|0|||||||| +1443|64554|content://media/external/images/media/64554|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0013.jpg|image/jpeg|921|2048|0|75671||1659301026|1659301043392|0|0|0|0|||||||| +1444|64551|content://media/external/images/media/64551|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0012.jpg|image/jpeg|2048|1532|0|364575||1659300415|1659300416423|0|0|0|0|||||||| +1445|64546|content://media/external/images/media/64546|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0010.jpg|image/jpeg|270|270|0|31412||1659294461|1659294465264|0|0|0|0|||||||| +1446|64528|content://media/external/images/media/64528|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0006.jpg|image/jpeg|957|2048|0|240908||1659275486|1659292737323|0|0|0|0|||||||| +1447|64500|content://media/external/images/media/64500|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0025.jpg|image/jpeg|1536|2048|0|582569||1659208056|1659208057364|0|0|0|0|||||||| +1448|64497|content://media/external/images/media/64497|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0024.jpg|image/jpeg|896|2000|0|280082||1659207499|1659207500704|0|0|0|0|||||||| +1449|64487|content://media/external/images/media/64487|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0021.jpg|image/jpeg|899|1599|0|125716||1659203675|1659203676126|0|0|0|0|||||||| +1450|64482|content://media/external/images/media/64482|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0019.jpg|image/jpeg|1080|479|0|45177||1659203570|1659203570478|0|0|0|0|||||||| +1451|64485|content://media/external/images/media/64485|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0020.jpg|image/jpeg|1600|1200|0|290214||1659203570|1659203570663|0|0|0|0|||||||| +1452|64453|content://media/external/images/media/64453|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0010.jpg|image/jpeg|1200|1600|0|229268||1659189569|1659189570864|0|0|0|0|||||||| +1453|64446|content://media/external/images/media/64446|/storage/emulated/0/DCIM/Camera/IMG_20220730_140807.jpg|image/jpeg|4608|2592|0|5542340||1659182889|1659182889345|1659182887405|0|0|0|||||||| +1454|64444|content://media/external/images/media/64444|/storage/emulated/0/DCIM/Camera/IMG_20220730_140449.jpg|image/jpeg|4608|2592|0|4634389||1659182692|1659182692056|1659182689570|0|0|0|||||||| +1455|64438|content://media/external/images/media/64438|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0005.jpg|image/jpeg|1532|2048|0|427858||1659169414|1659169415028|0|0|0|0|||||||| +1456|64356|content://media/external/images/media/64356|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0026.jpg|image/jpeg|768|1024|0|106523||1659120620|1659120621534|0|0|0|0|||||||| +1457|64350|content://media/external/images/media/64350|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0024.jpg|image/jpeg|923|2048|0|324717||1659118319|1659118320361|0|0|0|0|||||||| +1458|64353|content://media/external/images/media/64353|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0025.jpg|image/jpeg|721|1600|0|146034||1659118320|1659118320583|0|0|0|0|||||||| +1459|64341|content://media/external/images/media/64341|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0021.jpg|image/jpeg|1600|720|0|109032||1659116433|1659116434110|0|0|0|0|||||||| +1460|64334|content://media/external/images/media/64334|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0018.jpg|image/jpeg|1600|900|0|197522||1659113764|1659113764958|0|0|0|0|||||||| +1461|64331|content://media/external/images/media/64331|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0017.jpg|image/jpeg|1600|1200|0|292588||1659108147|1659108148357|0|0|0|0|||||||| +1462|64315|content://media/external/images/media/64315|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0013.jpg|image/jpeg|921|2048|0|180259||1659090584|1659090585052|0|0|0|0|||||||| +1463|64318|content://media/external/images/media/64318|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0014.jpg|image/jpeg|921|2048|0|191323||1659090585|1659090585785|0|0|0|0|||||||| +1464|64312|content://media/external/images/media/64312|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0012.jpg|image/jpeg|921|2048|0|204969||1659090583|1659090584402|0|0|0|0|||||||| +1465|64309|content://media/external/images/media/64309|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0011.jpg|image/jpeg|921|2048|0|184782||1659090582|1659090583640|0|0|0|0|||||||| +1466|64306|content://media/external/images/media/64306|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0010.jpg|image/jpeg|921|2048|0|178501||1659090581|1659090582825|0|0|0|0|||||||| +1467|64303|content://media/external/images/media/64303|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0009.jpg|image/jpeg|921|2048|0|180893||1659090580|1659090581908|0|0|0|0|||||||| +1468|64300|content://media/external/images/media/64300|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0008.jpg|image/jpeg|2048|1532|0|339210||1659085489|1659085489948|0|0|0|0|||||||| +1469|64296|content://media/external/images/media/64296|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0007.jpg|image/jpeg|2048|1536|0|359811||1659073970|1659073971159|0|0|0|0|||||||| +1470|64293|content://media/external/images/media/64293|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0006.jpg|image/jpeg|2048|1536|0|415853||1659073970|1659073970825|0|0|0|0|||||||| +1471|64267|content://media/external/images/media/64267|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220728-WA0007.jpg|image/jpeg|1500|2000|0|252039||1659029715|1659029716394|0|0|0|0|||||||| +1472|64254|content://media/external/images/media/64254|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220728-WA0004.jpg|image/jpeg|921|2048|0|123217||1659013150|1659013150889|0|0|0|0|||||||| +1473|64246|content://media/external/images/media/64246|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220728-WA0003.jpg|image/jpeg|921|2048|0|89435||1659007624|1659007625153|0|0|0|0|||||||| +1474|64226|content://media/external/images/media/64226|/storage/emulated/0/DCIM/Screenshots/IMG_20220727_231710.jpg|image/jpeg|1080|1181|0|262600||1658956630|1658956630736|0|0|0|0|||||||| +1475|64222|content://media/external/images/media/64222|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0010.jpg|image/jpeg|1024|1213|0|77153||1658949676|1658949677578|0|0|0|0|||||||| +1476|64214|content://media/external/images/media/64214|/storage/emulated/0/DCIM/Camera/IMG_20220727_203350.jpg|image/jpeg|4608|2592|0|6111730||1658946833|1658946833047|1658946830782|0|0|0|||||||| +1477|64215|content://media/external/images/media/64215|/storage/emulated/0/DCIM/Camera/IMG_20220727_203351.jpg|image/jpeg|4608|2592|0|6082607||1658946833|1658946833299|1658946831869|0|0|0|||||||| +1478|64212|content://media/external/images/media/64212|/storage/emulated/0/DCIM/Camera/IMG_20220727_203259.jpg|image/jpeg|4608|2592|0|6691261||1658946782|1658946782071|1658946779508|0|0|0|||||||| +1479|64210|content://media/external/images/media/64210|/storage/emulated/0/DCIM/Camera/IMG_20220727_195811.jpg|image/jpeg|2592|4608|0|7095072||1658944694|1658944694071|1658944691821|0|0|0|||||||| +1480|64208|content://media/external/images/media/64208|/storage/emulated/0/DCIM/Camera/IMG_20220727_195759.jpg|image/jpeg|3200|1800|0|2655734||1658944681|1658944681363|1658944679310|0|0|0|||||||| +1481|64206|content://media/external/images/media/64206|/storage/emulated/0/DCIM/Camera/IMG_20220727_195704.jpg|image/jpeg|4608|2592|0|6054986||1658944628|1658944628835|1658944624611|0|0|0|||||||| +1482|64195|content://media/external/images/media/64195|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0006.jpg|image/jpeg|1080|1920|0|313592||1658918312|1658918313130|0|0|0|0|||||||| +1483|64192|content://media/external/images/media/64192|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0005.jpg|image/jpeg|1532|2048|0|396309||1658918261|1658918262919|0|0|0|0|||||||| +1484|64189|content://media/external/images/media/64189|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0004.jpg|image/jpeg|1532|2048|0|456721||1658917415|1658917416206|0|0|0|0|||||||| +1485|64186|content://media/external/images/media/64186|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0003.jpg|image/jpeg|720|718|0|64166||1658914112|1658914113688|0|0|0|0|||||||| +1486|64183|content://media/external/images/media/64183|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0002.jpg|image/jpeg|828|828|0|66473||1658911885|1658911885987|0|0|0|0|||||||| +1487|64144|content://media/external/images/media/64144|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-26-07-59-40-201_com.instagram.android.jpg|image/jpeg|1080|2400|0|1350009||1658815180|1658815180703|0|0|0|0|||||||| +1488|64143|content://media/external/images/media/64143|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-26-07-45-45-793_com.instagram.android.jpg|image/jpeg|1080|2400|0|1029225||1658814346|1658814346227|0|0|0|0|||||||| +1489|64123|content://media/external/images/media/64123|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220725-WA0005.jpg|image/jpeg|720|1164|0|87314||1658766358|1658766361523|0|0|0|0|||||||| +1490|64120|content://media/external/images/media/64120|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220725-WA0004.jpg|image/jpeg|1920|1080|0|160664||1658759399|1658759402344|0|0|0|0|||||||| +1491|64109|content://media/external/images/media/64109|/storage/emulated/0/DCIM/Camera/IMG_20220725_123424.jpg|image/jpeg|4608|2592|0|5373135||1658745266|1658745266901|1658745264572|0|0|0|||||||| +1492|64101|content://media/external/images/media/64101|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220725-WA0001.jpg|image/jpeg|921|2048|0|380625||1658734896|1658734896939|0|0|0|0|||||||| +1493|64098|content://media/external/images/media/64098|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220725-WA0000.jpg|image/jpeg|921|2048|0|276398||1658734560|1658734560749|0|0|0|0|||||||| +1494|64085|content://media/external/images/media/64085|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220724-WA0008.jpg|image/jpeg|2000|1500|0|364292||1658686882|1658686890086|0|0|0|0|||||||| +1495|64082|content://media/external/images/media/64082|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220724-WA0007.jpg|image/jpeg|768|1024|0|86390||1658682156|1658682157614|0|0|0|0|||||||| +1496|64061|content://media/external/images/media/64061|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220724-WA0000.jpg|image/jpeg|1600|1200|0|227199||1658624044|1658624044865|0|0|0|0|||||||| +1497|64053|content://media/external/images/media/64053|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220723-WA0011.jpg|image/jpeg|1600|738|0|169018||1658597916|1658597917090|0|0|0|0|||||||| +1498|64050|content://media/external/images/media/64050|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220723-WA0010.jpg|image/jpeg|473|1024|0|117123||1658595713|1658595714883|0|0|0|0|||||||| +1499|64032|content://media/external/images/media/64032|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-23-16-09-36-988_io.homeassistant.companion.android.jpg|image/jpeg|1080|2400|0|176704||1658585377|1658585377080|0|0|0|0|||||||| +1500|64031|content://media/external/images/media/64031|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-23-16-09-01-912_io.homeassistant.companion.android.jpg|image/jpeg|1080|2400|0|188383||1658585342|1658585342300|0|0|0|0|||||||| +1501|64029|content://media/external/images/media/64029|/storage/emulated/0/DCIM/Screenshots/IMG_20220723_141411.jpg|image/jpeg|1042|494|0|50764||1658578451|1658578451563|0|0|0|0|||||||| +1502|64028|content://media/external/images/media/64028|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-23-14-13-34-769_io.homeassistant.companion.android.jpg|image/jpeg|1080|2400|0|268081||1658578414|1658578414891|0|0|0|0|||||||| +1503|64025|content://media/external/images/media/64025|/storage/emulated/0/DCIM/Screenshots/IMG_20220723_130403.jpg|image/jpeg|1080|1520|0|488716||1658574243|1658574243630|0|0|0|0|||||||| +1504|64019|content://media/external/images/media/64019|/storage/emulated/0/DCIM/Camera/IMG_20220723_093620.jpg|image/jpeg|2592|4608|0|4970479||1658561781|1658561781739|1658561780431|0|0|0|||||||| +1505|64017|content://media/external/images/media/64017|/storage/emulated/0/DCIM/Camera/IMG_20220723_093617.jpg|image/jpeg|2592|4608|0|5055250||1658561779|1658561779583|1658561777778|0|0|0|||||||| +1506|64015|content://media/external/images/media/64015|/storage/emulated/0/DCIM/Camera/IMG_20220723_093603.jpg|image/jpeg|2592|4608|0|4513383||1658561765|1658561765327|1658561763906|0|0|0|||||||| +1507|64013|content://media/external/images/media/64013|/storage/emulated/0/DCIM/Camera/IMG_20220723_093555.jpg|image/jpeg|2592|4608|0|6642269||1658561757|1658561757539|1658561755733|0|0|0|||||||| +1508|64011|content://media/external/images/media/64011|/storage/emulated/0/DCIM/Camera/IMG_20220723_093551.jpg|image/jpeg|2592|4608|0|6880092||1658561753|1658561753639|1658561751905|0|0|0|||||||| +1509|64001|content://media/external/images/media/64001|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0008.jpg|image/jpeg|1504|1128|0|228397||1658498530|1658498531233|0|0|0|0|||||||| +1510|63999|content://media/external/images/media/63999|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-22-15-13-01-212_com.android.chrome.jpg|image/jpeg|1080|2400|0|681311||1658495581|1658495581383|0|0|0|0|||||||| +1511|63996|content://media/external/images/media/63996|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0006.jpg|image/jpeg|1128|1504|0|172558||1658492074|1658492075560|0|0|0|0|||||||| +1512|63993|content://media/external/images/media/63993|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0005.jpg|image/jpeg|2048|1532|0|529892||1658484771|1658484773030|0|0|0|0|||||||| +1513|63984|content://media/external/images/media/63984|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0004.jpg|image/jpeg|1599|899|0|186105||1658475680|1658475681847|0|0|0|0|||||||| +1514|63969|content://media/external/images/media/63969|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0002.jpg|image/jpeg|1504|1128|0|173133||1658469963|1658469964358|0|0|0|0|||||||| +1515|63953|content://media/external/images/media/63953|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220721-WA0013.jpeg|image/jpeg|3840|2160|0|1074058||1658419215|1658419215297|1658419215195|0|0|0|||||||| +1516|63921|content://media/external/images/media/63921|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-21-15-34-56-433_com.brightstripe.parcels.jpg|image/jpeg|1080|2400|0|416845||1658410496|1658410496829|0|0|0|0|||||||| +1517|63893|content://media/external/images/media/63893|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220721-WA0005.jpg|image/jpeg|1080|1440|0|162565||1658405074|1658405076161|0|0|0|0|||||||| +1518|63891|content://media/external/images/media/63891|/storage/emulated/0/DCIM/Camera/IMG_20220721_134452.jpg|image/jpeg|4608|2592|0|4551011||1658403895|1658403895862|1658403892963|0|0|0|||||||| +1519|63886|content://media/external/images/media/63886|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220721-WA0003.jpg|image/jpeg|1080|1398|0|139480||1658402154|1658402155506|0|0|0|0|||||||| +1520|63880|content://media/external/images/media/63880|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220721-WA0002.jpg|image/jpeg|921|2048|0|176041||1658394481|1658394482441|0|0|0|0|||||||| +1521|63872|content://media/external/images/media/63872|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-21-09-27-07-109_com.google.android.apps.messaging.jpg|image/jpeg|1080|2400|0|408504||1658388427|1658388427237|0|0|0|0|||||||| +1522|63864|content://media/external/images/media/63864|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-20-21-06-07-538_lockscreen.jpg|image/jpeg|1080|2400|0|494029||1658343967|1658343968039|0|0|0|0|||||||| +1523|63708|content://media/external/images/media/63708|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220718-WA0000.jpg|image/jpeg|1532|2048|0|223530||1658097656|1658343906568|0|0|0|0|||||||| +1524|63861|content://media/external/images/media/63861|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0007.jpg|image/jpeg|1080|1405|0|114783||1658341844|1658341845247|0|0|0|0|||||||| +1525|63855|content://media/external/images/media/63855|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0006.jpg|image/jpeg|508|600|0|40931||1658340768|1658340768554|0|0|0|0|||||||| +1526|63853|content://media/external/images/media/63853|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220218-WA0005.jpg|image/jpeg|1080|757|0|74087||1658327672|1658327672294|0|0|0|0|||||||| +1527|63850|content://media/external/images/media/63850|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0005.jpg|image/jpeg|1200|1600|0|128767||1658317779|1658317779698|0|0|0|0|||||||| +1528|63847|content://media/external/images/media/63847|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0004.jpg|image/jpeg|2048|1805|0|228116||1658313491|1658313492274|0|0|0|0|||||||| +1529|63816|content://media/external/images/media/63816|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0002.jpg|image/jpeg|720|1600|0|49788||1658304234|1658304235091|0|0|0|0|||||||| +1530|63795|content://media/external/images/media/63795|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0000.jpg|image/jpeg|1080|1269|0|74543||1658296573|1658296574068|0|0|0|0|||||||| +1531|63787|content://media/external/images/media/63787|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-19-11-18-39-818_com.whatsapp.jpg|image/jpeg|1080|2400|0|701656||1658222320|1658222320230|0|0|0|0|||||||| +1532|63785|content://media/external/images/media/63785|/storage/emulated/0/DCIM/Screenshots/IMG_20220719_111659.jpg|image/jpeg|1080|1038|0|142592||1658222219|1658222219790|0|0|0|0|||||||| +1533|63779|content://media/external/images/media/63779|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-19-09-55-44-155_it.subito.jpg|image/jpeg|1080|2400|0|410537||1658217344|1658217344599|0|0|0|0|||||||| +1534|63768|content://media/external/images/media/63768|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-19-09-29-50-754_com.google.android.gm.jpg|image/jpeg|1080|2400|0|369026||1658215791|1658215791128|0|0|0|0|||||||| +1535|63752|content://media/external/images/media/63752|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220718-WA0009.jpg|image/jpeg|2048|1536|0|325107||1658174442|1658174444935|0|0|0|0|||||||| +1536|63739|content://media/external/images/media/63739|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-18-20-18-52-236_com.facebook.katana.jpg|image/jpeg|1080|2400|0|781284||1658168332|1658168332710|0|0|0|0|||||||| +1537|63690|content://media/external/images/media/63690|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-17-10-52-20-354_com.dopa.android.blevo.jpg|image/jpeg|1080|2400|0|452704||1658047940|1658047940863|0|0|0|0|||||||| +1538|63619|content://media/external/images/media/63619|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0010.jpg|image/jpeg|1024|768|0|119407||1657957272|1657957272802|0|0|0|0|||||||| +1539|63616|content://media/external/images/media/63616|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0009.jpg|image/jpeg|1024|768|0|113780||1657957256|1657957257369|0|0|0|0|||||||| +1540|63610|content://media/external/images/media/63610|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0007.jpg|image/jpeg|2048|1536|0|429108||1657957224|1657957226005|0|0|0|0|||||||| +1541|63613|content://media/external/images/media/63613|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0008.jpg|image/jpeg|2048|1536|0|431554||1657957226|1657957226236|0|0|0|0|||||||| +1542|63604|content://media/external/images/media/63604|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0005.jpg|image/jpeg|2048|1536|0|426303||1657957223|1657957224318|0|0|0|0|||||||| +1543|63607|content://media/external/images/media/63607|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0006.jpg|image/jpeg|2048|1536|0|433873||1657957224|1657957224706|0|0|0|0|||||||| +1544|63601|content://media/external/images/media/63601|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0004.jpg|image/jpeg|2048|1536|0|430588||1657957223|1657957223915|0|0|0|0|||||||| +1545|63595|content://media/external/images/media/63595|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0002.jpg|image/jpeg|2048|1536|0|404374||1657957185|1657957186132|0|0|0|0|||||||| +1546|63598|content://media/external/images/media/63598|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0003.jpg|image/jpeg|2048|1536|0|227828||1657957186|1657957186485|0|0|0|0|||||||| +1547|63592|content://media/external/images/media/63592|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0001.jpg|image/jpeg|2048|1536|0|368394||1657957185|1657957185633|0|0|0|0|||||||| +1548|63590|content://media/external/images/media/63590|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-16-09-27-20-603_com.android.chrome.jpg|image/jpeg|1080|2400|0|738100||1657956440|1657956440968|0|0|0|0|||||||| +1549|63580|content://media/external/images/media/63580|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220715-WA0009.jpg|image/jpeg|1544|1600|0|345017||1657913918|1657913919703|0|0|0|0|||||||| +1550|63558|content://media/external/images/media/63558|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220715-WA0003.jpg|image/jpeg|1599|899|0|66398||1657868065|1657868066348|0|0|0|0|||||||| +1551|63552|content://media/external/images/media/63552|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220715-WA0000.jpg|image/jpeg|1080|1435|0|120583||1657863906|1657863908087|0|0|0|0|||||||| +1552|63542|content://media/external/images/media/63542|/storage/emulated/0/DCIM/Screenshots/IMG_20220714_232212.jpg|image/jpeg|1071|1100|0|228685||1657833732|1657833732451|0|0|0|0|||||||| +1553|63541|content://media/external/images/media/63541|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-14-23-21-35-283_com.strava.jpg|image/jpeg|1080|2400|0|654507||1657833695|1657833695519|0|0|0|0|||||||| +1554|63521|content://media/external/images/media/63521|/storage/emulated/0/DCIM/Camera/IMG_20220714_204209.jpg|image/jpeg|3200|1800|0|3482352||1657824130|1657824130872|1657824129684|0|0|0|||||||| +1555|63519|content://media/external/images/media/63519|/storage/emulated/0/DCIM/Camera/IMG_20220714_204203.jpg|image/jpeg|3200|1800|0|3390532||1657824126|1657824126796|1657824123663|0|0|0|||||||| +1556|63508|content://media/external/images/media/63508|/storage/emulated/0/DCIM/Camera/IMG_20220714_185609.jpg|image/jpeg|2880|5120|0|4935049||1657817772|1657817772440|1657817770190|0|0|0|||||||| +1557|63504|content://media/external/images/media/63504|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0008.jpg|image/jpeg|921|2048|0|168195||1657812243|1657812244909|0|0|0|0|||||||| +1558|63502|content://media/external/images/media/63502|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-14-16-48-23-243_com.whatsapp.jpg|image/jpeg|1080|2400|0|785767||1657810103|1657810103750|0|0|0|0|||||||| +1559|63497|content://media/external/images/media/63497|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0006.jpg|image/jpeg|1532|2048|0|318125||1657799588|1657799607181|0|0|0|0|||||||| +1560|63494|content://media/external/images/media/63494|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0005.jpg|image/jpeg|921|2048|0|206271||1657798410|1657798411757|0|0|0|0|||||||| +1561|63491|content://media/external/images/media/63491|/storage/emulated/0/DCIM/Camera/IMG_20220714_125043.jpg|image/jpeg|2592|4608|0|4571221||1657795846|1657795846034|1657795843669|0|0|0|||||||| +1562|63488|content://media/external/images/media/63488|/storage/emulated/0/DCIM/Camera/IMG_20220714_123009.jpg|image/jpeg|2592|4608|0|4332548||1657794612|1657794612314|1657794609946|0|0|0|||||||| +1563|63482|content://media/external/images/media/63482|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0001.jpg|image/jpeg|921|2048|0|92539||1657785929|1657785930103|0|0|0|0|||||||| +1564|63485|content://media/external/images/media/63485|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0002.jpg|image/jpeg|921|2048|0|86875||1657785930|1657785930797|0|0|0|0|||||||| +1565|63479|content://media/external/images/media/63479|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0000.jpg|image/jpeg|921|2048|0|163807||1657785926|1657785929391|0|0|0|0|||||||| +1566|63466|content://media/external/images/media/63466|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0018.jpg|image/jpeg|1600|1200|0|165258||1657741110|1657741111386|0|0|0|0|||||||| +1567|63461|content://media/external/images/media/63461|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0016.jpg|image/jpeg|899|1599|0|84478||1657740036|1657740041669|0|0|0|0|||||||| +1568|63448|content://media/external/images/media/63448|/storage/emulated/0/DCIM/Camera/IMG_20220713_182705.jpg|image/jpeg|2592|4608|0|5185367||1657729628|1657729628544|1657729625419|0|0|0|||||||| +1569|63441|content://media/external/images/media/63441|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-13-16-25-35-102_com.whatsapp.jpg|image/jpeg|1080|2400|0|898523||1657722335|1657722335393|0|0|0|0|||||||| +1570|63435|content://media/external/images/media/63435|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0009.jpg|image/jpeg|2048|1532|0|300698||1657721864|1657721865335|0|0|0|0|||||||| +1571|63421|content://media/external/images/media/63421|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0002.jpg|image/jpeg|828|1792|0|210884||1657719173|1657719174185|0|0|0|0|||||||| +1572|63418|content://media/external/images/media/63418|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0001.jpg|image/jpeg|1080|1920|0|270642||1657719157|1657719158382|0|0|0|0|||||||| +1573|63406|content://media/external/images/media/63406|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0000.jpg|image/jpeg|921|2048|0|167382||1657708355|1657708356603|0|0|0|0|||||||| +1574|63396|content://media/external/images/media/63396|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220712-WA0008.jpg|image/jpeg|1581|1600|0|362107||1657654789|1657654805400|0|0|0|0|||||||| +1575|63383|content://media/external/images/media/63383|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220712-WA0006.jpg|image/jpeg|2048|1532|0|413373||1657628905|1657628906987|0|0|0|0|||||||| +1576|63349|content://media/external/images/media/63349|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220711-WA0003.jpg|image/jpeg|1504|1128|0|78347||1657554282|1657554283051|0|0|0|0|||||||| +1577|63343|content://media/external/images/media/63343|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220711-WA0000.jpg|image/jpeg|1024|1024|0|89692||1657520828|1657520828334|0|0|0|0|||||||| +1578|63332|content://media/external/images/media/63332|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220710-WA0042.jpg|image/jpeg|620|413|0|46139||1657462338|1657462339372|0|0|0|0|||||||| +1579|63330|content://media/external/images/media/63330|/storage/emulated/0/DCIM/Camera/IMG_20220710_160725.jpg|image/jpeg|3177|2144|0|2430478||1657462048|1657462048207|1657462047609|0|0|0|||||||| +1580|63328|content://media/external/images/media/63328|/storage/emulated/0/DCIM/Camera/IMG_20220710_152656.jpg|image/jpeg|4608|2592|0|4775694||1657459621|1657459621207|1657459617100|0|0|0|||||||| +1581|63325|content://media/external/images/media/63325|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0041.jpg|image/jpeg|1080|1074|0|175808||1657444613|1657444613940|0|0|0|0|||||||| +1582|63313|content://media/external/images/media/63313|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0036.jpg|image/jpeg|1532|2048|0|807045||1657438067|1657438068414|0|0|0|0|||||||| +1583|63310|content://media/external/images/media/63310|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0035.jpg|image/jpeg|1532|2048|0|759851||1657438066|1657438067495|0|0|0|0|||||||| +1584|63307|content://media/external/images/media/63307|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0034.jpg|image/jpeg|1532|2048|0|700811||1657438066|1657438066502|0|0|0|0|||||||| +1585|63301|content://media/external/images/media/63301|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0032.jpg|image/jpeg|2048|1532|0|491818||1657438064|1657438065470|0|0|0|0|||||||| +1586|63304|content://media/external/images/media/63304|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0033.jpg|image/jpeg|1200|1600|0|251534||1657438065|1657438065998|0|0|0|0|||||||| +1587|63298|content://media/external/images/media/63298|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0031.jpg|image/jpeg|1532|2048|0|660021||1657438063|1657438064757|0|0|0|0|||||||| +1588|63292|content://media/external/images/media/63292|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0029.jpg|image/jpeg|1200|1600|0|393126||1657438062|1657438063179|0|0|0|0|||||||| +1589|63295|content://media/external/images/media/63295|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0030.jpg|image/jpeg|1532|2048|0|723412||1657438063|1657438063837|0|0|0|0|||||||| +1590|63289|content://media/external/images/media/63289|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0028.jpg|image/jpeg|1200|1600|0|179176||1657438061|1657438062254|0|0|0|0|||||||| +1591|63286|content://media/external/images/media/63286|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0027.jpg|image/jpeg|1200|1600|0|367718||1657438060|1657438061578|0|0|0|0|||||||| +1592|63277|content://media/external/images/media/63277|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0024.jpg|image/jpeg|1600|1200|0|219244||1657438059|1657438060110|0|0|0|0|||||||| +1593|63280|content://media/external/images/media/63280|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0025.jpg|image/jpeg|1600|1200|0|237428||1657438060|1657438060695|0|0|0|0|||||||| +1594|63283|content://media/external/images/media/63283|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0026.jpg|image/jpeg|1200|1600|0|419492||1657438060|1657438060992|0|0|0|0|||||||| +1595|63271|content://media/external/images/media/63271|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0022.jpg|image/jpeg|1600|1200|0|381988||1657438058|1657438059591|0|0|0|0|||||||| +1596|63274|content://media/external/images/media/63274|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0023.jpg|image/jpeg|1187|1599|0|161506||1657438059|1657438059955|0|0|0|0|||||||| +1597|63268|content://media/external/images/media/63268|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0021.jpg|image/jpeg|1600|1200|0|213725||1657438058|1657438058821|0|0|0|0|||||||| +1598|63261|content://media/external/images/media/63261|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0019.jpg|image/jpeg|2048|1532|0|346579||1657438005|1657438006036|0|0|0|0|||||||| +1599|63258|content://media/external/images/media/63258|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0018.jpg|image/jpeg|2048|1532|0|400237||1657438004|1657438005399|0|0|0|0|||||||| +1600|63252|content://media/external/images/media/63252|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0016.jpg|image/jpeg|1532|2048|0|358171||1657438003|1657438004013|0|0|0|0|||||||| +1601|63255|content://media/external/images/media/63255|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0017.jpg|image/jpeg|2048|1532|0|462910||1657438004|1657438004744|0|0|0|0|||||||| +1602|63249|content://media/external/images/media/63249|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0015.jpg|image/jpeg|1532|2048|0|314818||1657438002|1657438003272|0|0|0|0|||||||| +1603|63246|content://media/external/images/media/63246|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0014.jpg|image/jpeg|2048|1532|0|297397||1657438001|1657438002323|0|0|0|0|||||||| +1604|63243|content://media/external/images/media/63243|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0013.jpg|image/jpeg|2048|1532|0|852877||1657438000|1657438001534|0|0|0|0|||||||| +1605|63240|content://media/external/images/media/63240|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0012.jpg|image/jpeg|1532|2048|0|597255||1657437999|1657438000662|0|0|0|0|||||||| +1606|63234|content://media/external/images/media/63234|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0010.jpg|image/jpeg|1532|2048|0|690395||1657437997|1657437999131|0|0|0|0|||||||| +1607|63237|content://media/external/images/media/63237|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0011.jpg|image/jpeg|1532|2048|0|584181||1657437999|1657437999735|0|0|0|0|||||||| +1608|63231|content://media/external/images/media/63231|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0009.jpg|image/jpeg|1532|2048|0|646909||1657437996|1657437997583|0|0|0|0|||||||| +1609|63228|content://media/external/images/media/63228|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0008.jpg|image/jpeg|1532|2048|0|669504||1657437995|1657437996656|0|0|0|0|||||||| +1610|63225|content://media/external/images/media/63225|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0007.jpg|image/jpeg|2048|1532|0|333534||1657437995|1657437995859|0|0|0|0|||||||| +1611|63176|content://media/external/images/media/63176|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220709-WA0000.jpg|image/jpeg|1250|1250|0|259968||1657353456|1657353457092|0|0|0|0|||||||| +1612|63167|content://media/external/images/media/63167|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-08-22-30-37-842_com.google.android.gm.jpg|image/jpeg|1080|2400|0|377328||1657312238|1657312238230|0|0|0|0|||||||| +1613|63164|content://media/external/images/media/63164|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220708-WA0004.jpg|image/jpeg|738|1600|0|102071||1657300721|1657300721948|0|0|0|0|||||||| +1614|63161|content://media/external/images/media/63161|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220708-WA0003.jpg|image/jpeg|700|700|0|65583||1657294511|1657294559897|0|0|0|0|||||||| +1615|63150|content://media/external/images/media/63150|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-08-14-23-00-679_com.google.android.gm.jpg|image/jpeg|1080|2400|0|337318||1657282981|1657282981077|0|0|0|0|||||||| +1616|63106|content://media/external/images/media/63106|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0007.jpg|image/jpeg|921|2048|0|173956||1657209736|1657209742294|0|0|0|0|||||||| +1617|63096|content://media/external/images/media/63096|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0005.jpg|image/jpeg|1128|1600|0|82110||1657201870|1657201871194|0|0|0|0|||||||| +1618|63084|content://media/external/images/media/63084|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0003.jpg|image/jpeg|1600|1200|0|571201||1657189139|1657189141012|0|0|0|0|||||||| +1619|63081|content://media/external/images/media/63081|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0002.jpg|image/jpeg|1200|1600|0|207176||1657189137|1657189138111|0|0|0|0|||||||| +1620|63078|content://media/external/images/media/63078|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0001.jpg|image/jpeg|1600|1200|0|301900||1657189136|1657189137533|0|0|0|0|||||||| +1621|63075|content://media/external/images/media/63075|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0000.jpg|image/jpeg|921|2048|0|124368||1657180162|1657180168321|0|0|0|0|||||||| +1622|63069|content://media/external/images/media/63069|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220706-WA0021.jpg|image/jpeg|720|1600|0|127459||1657132191|1657132191967|0|0|0|0|||||||| +1623|63046|content://media/external/images/media/63046|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220706-WA0014.jpg|image/jpeg|1000|663|0|63078||1657119424|1657119424757|0|0|0|0|||||||| +1624|63023|content://media/external/images/media/63023|/storage/emulated/0/DCIM/Screenshots/IMG_20220706_145016.jpg|image/jpeg|1080|2400|0|361982||1657111816|1657111816162|0|0|0|0|||||||| +1625|63020|content://media/external/images/media/63020|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-06-14-48-52-324_com.google.android.gm.jpg|image/jpeg|1080|2400|0|298987||1657111732|1657111732438|0|0|0|0|||||||| +1626|62982|content://media/external/images/media/62982|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220705-WA0006.jpg|image/jpeg|1600|1200|0|128240||1657047983|1657047983692|0|0|0|0|||||||| +1627|62979|content://media/external/images/media/62979|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220705-WA0005.jpg|image/jpeg|1600|1200|0|129928||1657047974|1657047975566|0|0|0|0|||||||| +1628|62976|content://media/external/images/media/62976|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220705-WA0004.jpg|image/jpeg|617|892|0|67677||1657044936|1657044936634|0|0|0|0|||||||| +1629|62970|content://media/external/images/media/62970|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220705-WA0003.jpg|image/jpeg|636|1024|0|80631||1657030852|1657030852301|0|0|0|0|||||||| +1630|62940|content://media/external/images/media/62940|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220704-WA0006.jpg|image/jpeg|2048|2048|0|689259||1656950092|1656950092758|0|0|0|0|||||||| +1631|62921|content://media/external/images/media/62921|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220704-WA0000.jpg|image/jpeg|750|1334|0|60959||1656929062|1656929063181|0|0|0|0|||||||| +1632|62917|content://media/external/images/media/62917|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-04-09-12-29-636_lockscreen.jpg|image/jpeg|1080|2400|0|805073||1656918750|1656918750227|0|0|0|0|||||||| +1633|62907|content://media/external/images/media/62907|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220703-WA0016.jpg|image/jpeg|2048|1536|0|648210||1656862711|1656862713146|0|0|0|0|||||||| +1634|62868|content://media/external/images/media/62868|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220703-WA0003.jpg|image/jpeg|960|720|0|85497||1656847337|1656847337657|0|0|0|0|||||||| +1635|62858|content://media/external/images/media/62858|/storage/emulated/0/DCIM/Camera/IMG_20220703_113004.jpg|image/jpeg|2592|4608|0|4154051||1656840608|1656840608384|1656840604731|0|0|0|||||||| +1636|62848|content://media/external/images/media/62848|/storage/emulated/0/DCIM/Camera/IMG_20220702_210527.jpg|image/jpeg|4608|2592|0|4905148||1656788731|1656788731795|1656788729210|0|0|0|||||||| +1637|62845|content://media/external/images/media/62845|/storage/emulated/0/DCIM/Camera/IMG_20220702_210253.jpg|image/jpeg|2592|4608|0|5228053||1656788578|1656788578835|1656788575463|0|0|0|||||||| +1638|62812|content://media/external/images/media/62812|/storage/emulated/0/Download/Soduto/1656768165956.jpg|image/jpeg|2592|4608|0|4539056||1656768181|1656768182075|1656096489000|0|0|0|||||||| +1639|62811|content://media/external/images/media/62811|/storage/emulated/0/Download/Soduto/greg diploma 2.png|image/png|1890|1345|0|2102678||1656768044|1656768044368|0|0|0|0|||||||| +1640|62810|content://media/external/images/media/62810|/storage/emulated/0/Download/Soduto/1656763946908.jpg|image/jpeg|1352|904|0|313422||1656768013|1656768013840|1656753557000|0|0|0|||||||| +1641|62803|content://media/external/images/media/62803|/storage/emulated/0/DCIM/Camera/IMG_20220702_135617.jpg|image/jpeg|1352|904|0|317969||1656762977|1656762977556|1656753557281|0|0|0|||||||| +1642|62800|content://media/external/images/media/62800|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220702-WA0003.jpg|image/jpeg|720|1600|0|106819||1656759042|1656759044858|0|0|0|0|||||||| +1643|62798|content://media/external/images/media/62798|/storage/emulated/0/DCIM/Camera/IMG_20220702_111917.jpg|image/jpeg|2592|4608|0|3290399||1656753559|1656753559760|1656753557281|0|0|0|||||||| +1644|62794|content://media/external/images/media/62794|/storage/emulated/0/DCIM/Camera/IMG_20220702_111131.jpg|image/jpeg|2592|4608|0|3882924||1656753094|1656753094070|1656753091926|0|0|0|||||||| +1645|62793|content://media/external/images/media/62793|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220702-WA0002.jpg|image/jpeg|1600|1138|0|330845||1656748692|1656748693331|0|0|0|0|||||||| +1646|62790|content://media/external/images/media/62790|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220702-WA0001.jpg|image/jpeg|2048|2048|0|781474||1656747037|1656747038403|0|0|0|0|||||||| +1647|62770|content://media/external/images/media/62770|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-01-19-26-35-778_com.android.chrome.jpg|image/jpeg|1080|2400|0|679381||1656696396|1656696396215|0|0|0|0|||||||| +1648|62769|content://media/external/images/media/62769|/storage/emulated/0/DCIM/Creative/IMG_20220701_190239.jpg|image/jpeg|1190|803|0|535389||1656694960|1656694960519|0|0|0|0|||||||| +1649|62728|content://media/external/images/media/62728|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220630-WA0004.jpg|image/jpeg|1600|1200|0|124538||1656625294|1656625295058|0|0|0|0|||||||| +1650|62351|content://media/external/images/media/62351|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220625-WA0000.jpg|image/jpeg|2048|1532|0|193423||1656141604|1656141604589|0|0|0|0|||||||| +1651|62334|content://media/external/images/media/62334|/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220624_192804.jpg|image/jpeg|999|1378|0|476162||1656091684|1656091684827|1656080514000|0|0|0|||||||| +1652|62333|content://media/external/images/media/62333|/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220624_192520.jpg|image/jpeg|999|1378|0|432709||1656091520|1656091520967|1656080514000|0|0|0|||||||| +1653|62332|content://media/external/images/media/62332|/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220624_192415.jpg|image/jpeg|1920|1440|0|789838||1656091455|1656091455939|1656080514000|0|0|0|||||||| +1654|62331|content://media/external/images/media/62331|/storage/emulated/0/DCIM/GoPro-Exports/G0070646_1656090860527.jpg|image/jpeg|1920|1440|0|423019||1656091070|1656091070251|1656080514000|0|0|0|||||||| +1655|62329|content://media/external/images/media/62329|/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220624_190120.jpg|image/jpeg|2970|1886|0|2061851||1656090080|1656090081054|1656080612091|0|0|0|||||||| +1656|62246|content://media/external/images/media/62246|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0008.jpg|image/jpeg|1196|1600|0|427050||1656078228|1656088418832|0|0|0|0|||||||| +1657|62273|content://media/external/images/media/62273|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0014.jpg|image/jpeg|1532|2048|0|452470||1656082203|1656082204074|0|0|0|0|||||||| +1658|62267|content://media/external/images/media/62267|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0012.jpg|image/jpeg|1532|2048|0|433984||1656082202|1656082203107|0|0|0|0|||||||| +1659|62270|content://media/external/images/media/62270|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0013.jpg|image/jpeg|1532|2048|0|439929||1656082203|1656082203564|0|0|0|0|||||||| +1660|62264|content://media/external/images/media/62264|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0011.jpg|image/jpeg|2048|1532|0|465347||1656082201|1656082202011|0|0|0|0|||||||| +1661|62261|content://media/external/images/media/62261|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0010.jpg|image/jpeg|2048|1532|0|449187||1656082200|1656082200518|0|0|0|0|||||||| +1662|62243|content://media/external/images/media/62243|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0007.jpg|image/jpeg|2048|1532|0|353627||1656077993|1656077994332|0|0|0|0|||||||| +1663|62240|content://media/external/images/media/62240|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0006.jpg|image/jpeg|2048|1532|0|400098||1656077988|1656077988706|0|0|0|0|||||||| +1664|62154|content://media/external/images/media/62154|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0027.jpg|image/jpeg|1532|2048|0|274332||1655998715|1655998715759|0|0|0|0|||||||| +1665|62147|content://media/external/images/media/62147|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0025.jpg|image/jpeg|2048|1532|0|514855||1655998712|1655998713588|0|0|0|0|||||||| +1666|62144|content://media/external/images/media/62144|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0024.jpg|image/jpeg|1599|899|0|241535||1655998461|1655998461799|0|0|0|0|||||||| +1667|62109|content://media/external/images/media/62109|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0019.jpg|image/jpeg|1080|1920|0|119040||1655988543|1655988544058|0|0|0|0|||||||| +1668|62104|content://media/external/images/media/62104|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0018.jpg|image/jpeg|1080|1920|0|123463||1655987684|1655987786653|0|0|0|0|||||||| +1669|62054|content://media/external/images/media/62054|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0010.jpg|image/jpeg|900|1600|0|132546||1655977669|1655977670071|0|0|0|0|||||||| +1670|62051|content://media/external/images/media/62051|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0009.jpg|image/jpeg|1201|1600|0|359319||1655977556|1655977557804|0|0|0|0|||||||| +1671|61998|content://media/external/images/media/61998|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0002.jpg|image/jpeg|2048|662|0|232979||1655968153|1655968154189|0|0|0|0|||||||| +1672|61944|content://media/external/images/media/61944|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220621-WA0008.jpg|image/jpeg|1532|2048|0|289515||1655837082|1655837083101|0|0|0|0|||||||| +1673|61848|content://media/external/images/media/61848|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220621-WA0002.jpg|image/jpeg|1294|516|0|94273||1655814829|1655814830494|0|0|0|0|||||||| +1674|61721|content://media/external/images/media/61721|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220619-WA0026.jpg|image/jpeg|2048|1532|0|277732||1655658591|1655658592725|0|0|0|0|||||||| +1675|61718|content://media/external/images/media/61718|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220619-WA0025.jpg|image/jpeg|1532|2048|0|176855||1655658591|1655658591967|0|0|0|0|||||||| +1676|61681|content://media/external/images/media/61681|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220619-WA0009.jpg|image/jpeg|1600|1197|0|288164||1655642434|1655642434824|0|0|0|0|||||||| +1677|61676|content://media/external/images/media/61676|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220619-WA0007.jpg|image/jpeg|899|1599|0|389489||1655642380|1655642384905|0|0|0|0|||||||| +1678|61673|content://media/external/images/media/61673|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220619-WA0006.jpg|image/jpeg|1197|1600|0|276899||1655642339|1655642341688|0|0|0|0|||||||| +1679|61625|content://media/external/images/media/61625|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220619-WA0000.jpg|image/jpeg|2048|1532|0|516584||1655628473|1655628474073|0|0|0|0|||||||| +1680|61585|content://media/external/images/media/61585|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0032.jpg|image/jpeg|1532|2048|0|386116||1655581315|1655582741721|0|0|0|0|||||||| +1681|61588|content://media/external/images/media/61588|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0033.jpg|image/jpeg|1532|2048|0|308992||1655581316|1655582741671|0|0|0|0|||||||| +1682|61591|content://media/external/images/media/61591|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0034.jpg|image/jpeg|1532|2048|0|355413||1655581317|1655582741607|0|0|0|0|||||||| +1683|61579|content://media/external/images/media/61579|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0030.jpg|image/jpeg|2048|1532|0|332780||1655581313|1655582740701|0|0|0|0|||||||| +1684|61582|content://media/external/images/media/61582|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0031.jpg|image/jpeg|2048|1532|0|331155||1655581314|1655582740809|0|0|0|0|||||||| +1685|61594|content://media/external/images/media/61594|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0035.jpg|image/jpeg|2048|1532|0|351278||1655581318|1655582740917|0|0|0|0|||||||| +1686|61524|content://media/external/images/media/61524|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0013.jpg|image/jpeg|1600|993|0|231059||1655555063|1655555064483|0|0|0|0|||||||| +1687|61488|content://media/external/images/media/61488|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0002.jpg|image/jpeg|899|1599|0|87378||1655539205|1655539206168|0|0|0|0|||||||| +1688|61471|content://media/external/images/media/61471|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0021.jpg|image/jpeg|1496|1496|0|217484||1655497882|1655497883483|0|0|0|0|||||||| +1689|61468|content://media/external/images/media/61468|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0020.jpg|image/jpeg|1201|1600|0|246258||1655495938|1655495940549|0|0|0|0|||||||| +1690|61465|content://media/external/images/media/61465|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0019.jpg|image/jpeg|1599|899|0|136121||1655493605|1655493606257|0|0|0|0|||||||| +1691|61464|content://media/external/images/media/61464|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0018.jpg|image/jpeg|1600|1201|0|237681||1655493532|1655493532424|0|0|0|0|||||||| +1692|61458|content://media/external/images/media/61458|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0016.jpg|image/jpeg|923|1600|0|129013||1655493478|1655493479180|0|0|0|0|||||||| +1693|61455|content://media/external/images/media/61455|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0015.jpg|image/jpeg|1600|1152|0|244987||1655493029|1655493030467|0|0|0|0|||||||| +1694|61449|content://media/external/images/media/61449|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0013.jpg|image/jpeg|1296|970|0|171832||1655493000|1655493001263|0|0|0|0|||||||| +1695|61452|content://media/external/images/media/61452|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0014.jpg|image/jpeg|1201|1600|0|175244||1655493001|1655493001839|0|0|0|0|||||||| +1696|61442|content://media/external/images/media/61442|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0011.jpg|image/jpeg|735|960|0|46041||1655490902|1655490903043|0|0|0|0|||||||| +1697|61439|content://media/external/images/media/61439|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0010.jpg|image/jpeg|1296|970|0|189340||1655488350|1655488354223|0|0|0|0|||||||| +1698|61297|content://media/external/images/media/61297|/storage/emulated/0/DCIM/GoPro-Exports/G0040555_1655467634509_2.JPG|image/jpeg|4000|3000|0|2377689||1655471732|1655471732620|1655062886000|0|0|0|||||||| +1699|61295|content://media/external/images/media/61295|/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220617_150655.jpg|image/jpeg|4000|3000|0|3957577||1655471215|1655471215735|1655062886074|0|0|0|||||||| +1700|61294|content://media/external/images/media/61294|/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220617_150442.jpg|image/jpeg|4000|3000|0|3884808||1655471083|1655471083271|1655062886074|0|0|0|||||||| +1701|61293|content://media/external/images/media/61293|/storage/emulated/0/DCIM/GoPro-Exports/IMG_20220617_150336.jpg|image/jpeg|4000|3000|0|4158657||1655471017|1655471017155|1655062886000|0|0|0|||||||| +1702|61292|content://media/external/images/media/61292|/storage/emulated/0/DCIM/GoPro-Exports/G0040555_1655467634509.JPG|image/jpeg|4000|3000|0|2377689||1655470910|1655470910755|1655062886000|0|0|0|||||||| +1703|61289|content://media/external/images/media/61289|/storage/emulated/0/DCIM/GoPro-Exports/G0040551_1655467634509.JPG|image/jpeg|4000|3000|0|2327671||1655470763|1655470763715|1655062886074|0|0|0|||||||| +1704|61244|content://media/external/images/media/61244|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0012.jpg|image/jpeg|2000|1500|0|405354||1655384811|1655384812666|0|0|0|0|||||||| +1705|61241|content://media/external/images/media/61241|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0011.jpg|image/jpeg|2000|1500|0|413807||1655384810|1655384811460|0|0|0|0|||||||| +1706|61238|content://media/external/images/media/61238|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0010.jpg|image/jpeg|2000|1500|0|424635||1655384809|1655384810251|0|0|0|0|||||||| +1707|61235|content://media/external/images/media/61235|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0009.jpg|image/jpeg|2000|1500|0|420395||1655384807|1655384809211|0|0|0|0|||||||| +1708|61232|content://media/external/images/media/61232|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0008.jpg|image/jpeg|1716|1447|0|303016||1655384806|1655384807951|0|0|0|0|||||||| +1709|61229|content://media/external/images/media/61229|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0007.jpg|image/jpeg|2000|1500|0|379397||1655384805|1655384806916|0|0|0|0|||||||| +1710|61226|content://media/external/images/media/61226|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0006.jpg|image/jpeg|2000|1500|0|405977||1655384804|1655384805940|0|0|0|0|||||||| +1711|61220|content://media/external/images/media/61220|/storage/emulated/0/DCIM/Camera/IMG_20220616_150201.jpg|image/jpeg|4608|2592|0|3866827||1655384524|1655384524277|1655384521478|0|0|0|||||||| +1712|61217|content://media/external/images/media/61217|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0004.jpg|image/jpeg|899|1599|0|101194||1655379420|1655379421283|0|0|0|0|||||||| +1713|61214|content://media/external/images/media/61214|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0003.jpg|image/jpeg|899|1599|0|135104||1655379014|1655379015059|0|0|0|0|||||||| +1714|61178|content://media/external/images/media/61178|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220615-WA0105.jpg|image/jpeg|633|680|0|53299||1655319281|1655319282204|0|0|0|0|||||||| +1715|61176|content://media/external/images/media/61176|/storage/emulated/0/DCIM/Camera/IMG_20220615_202546.jpg|image/jpeg|4608|2592|0|6224167||1655317549|1655317549619|1655317546979|0|0|0|||||||| +1716|61162|content://media/external/images/media/61162|/storage/emulated/0/DCIM/Camera/IMG_20220615_192417.jpg|image/jpeg|4608|2592|0|4198440||1655313858|1655313858482|1655313857106|0|0|0|||||||| +1717|61160|content://media/external/images/media/61160|/storage/emulated/0/DCIM/Camera/IMG_20220615_192410.jpg|image/jpeg|4608|2592|0|4271626||1655313852|1655313852338|1655313850750|0|0|0|||||||| +1718|61158|content://media/external/images/media/61158|/storage/emulated/0/DCIM/Camera/IMG_20220615_192236.jpg|image/jpeg|4608|2592|0|5796562||1655313758|1655313758190|1655313756274|0|0|0|||||||| +1719|61156|content://media/external/images/media/61156|/storage/emulated/0/DCIM/Camera/IMG_20220615_192233.jpg|image/jpeg|4608|2592|0|5809399||1655313756|1655313756378|1655313753267|0|0|0|||||||| +1720|60596|content://media/external/images/media/60596|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0057.jpg|image/jpeg|1024|768|0|127568||1655147851|1655309089789|0|0|0|0|||||||| +1721|60599|content://media/external/images/media/60599|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0058.jpg|image/jpeg|1024|768|0|124780||1655147934|1655308654166|0|0|0|0|||||||| +1722|60888|content://media/external/images/media/60888|/storage/emulated/0/Download/InsMate/profile_42403120_1176292779190197_5464748050482200576_n.jpg|image/jpeg|150|150|0|5082||1655299976|1655299976398|0|0|0|0|||||||| +1723|60889|content://media/external/images/media/60889|/storage/emulated/0/Download/InsMate/cover_286287402_169236282177023_8220648733451645970_n.jpg|image/jpeg|720|406|0|41871||1655299976|1655299976402|0|0|0|0|||||||| +1724|60885|content://media/external/images/media/60885|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220615-WA0016.jpg|image/jpeg|921|2048|0|149007||1655292931|1655292932042|0|0|0|0|||||||| +1725|60880|content://media/external/images/media/60880|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-15-12-39-09-254_com.ilmeteo.android.ilmeteo.jpg|image/jpeg|1080|2400|0|881234||1655289549|1655289549602|0|0|0|0|||||||| +1726|60848|content://media/external/images/media/60848|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220615-WA0003.jpg|image/jpeg|1920|1080|0|155200||1655281428|1655281429206|0|0|0|0|||||||| +1727|60844|content://media/external/images/media/60844|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220615-WA0001.jpg|image/jpeg|1132|1600|0|159597||1655276156|1655276156773|0|0|0|0|||||||| +1728|60842|content://media/external/images/media/60842|/storage/emulated/0/DCIM/Screenshots/IMG_20220615_082301.jpg|image/jpeg|1080|1402|0|379915||1655274181|1655274181139|0|0|0|0|||||||| +1729|60816|content://media/external/images/media/60816|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0062.jpg|image/jpeg|1024|768|0|122212||1655242526|1655242530604|0|0|0|0|||||||| +1730|60684|content://media/external/images/media/60684|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0018.jpg|image/jpeg|806|300|0|73852||1655234990|1655234990764|0|0|0|0|||||||| +1731|60682|content://media/external/images/media/60682|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0017.jpg|image/jpeg|464|232|0|22548||1655234904|1655234906184|0|0|0|0|||||||| +1732|60675|content://media/external/images/media/60675|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0015.jpg|image/jpeg|1536|2048|0|894067||1655220405|1655220406365|0|0|0|0|||||||| +1733|60669|content://media/external/images/media/60669|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-14-16-25-50-730_com.mi.globalbrowser.jpg|image/jpeg|1080|2400|0|1268243||1655216751|1655216751121|0|0|0|0|||||||| +1734|60658|content://media/external/images/media/60658|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0008.jpg|image/jpeg|1280|905|0|115691||1655210712|1655210713211|0|0|0|0|||||||| +1735|60656|content://media/external/images/media/60656|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-14-14-03-44-739_com.ilmeteo.android.ilmeteo.jpg|image/jpeg|1080|2400|0|1005604||1655208225|1655208225193|0|0|0|0|||||||| +1736|60653|content://media/external/images/media/60653|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-14-14-02-55-494_com.ilmeteo.android.ilmeteo.jpg|image/jpeg|1080|2400|0|1019494||1655208175|1655208175837|0|0|0|0|||||||| +1737|60650|content://media/external/images/media/60650|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0005.jpg|image/jpeg|921|2048|0|111342||1655205173|1655205173958|0|0|0|0|||||||| +1738|60643|content://media/external/images/media/60643|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0003.jpg|image/jpeg|1200|1600|0|120724||1655193129|1655193130156|0|0|0|0|||||||| +1739|60640|content://media/external/images/media/60640|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0002.jpg|image/jpeg|1500|2000|0|191818||1655190889|1655190890405|0|0|0|0|||||||| +1740|60639|content://media/external/images/media/60639|/storage/emulated/0/DCIM/Screenshots/IMG_20220614_082140.jpg|image/jpeg|1080|2400|0|482494||1655187700|1655187700137|0|0|0|0|||||||| +1741|60586|content://media/external/images/media/60586|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0055.jpg|image/jpeg|608|331|0|12953||1655140040|1655140040208|0|0|0|0|||||||| +1742|60523|content://media/external/images/media/60523|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0037.jpg|image/jpeg|2000|1500|0|259838||1655125414|1655125415111|0|0|0|0|||||||| +1743|60520|content://media/external/images/media/60520|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0036.jpg|image/jpeg|2000|1500|0|280548||1655125414|1655125414860|0|0|0|0|||||||| +1744|60505|content://media/external/images/media/60505|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0032.jpg|image/jpeg|1500|2000|0|254770||1655125395|1655125396295|0|0|0|0|||||||| +1745|60496|content://media/external/images/media/60496|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0029.jpg|image/jpeg|2000|1500|0|311601||1655125394|1655125395154|0|0|0|0|||||||| +1746|60499|content://media/external/images/media/60499|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0030.jpg|image/jpeg|2000|1500|0|277853||1655125395|1655125395472|0|0|0|0|||||||| +1747|60502|content://media/external/images/media/60502|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0031.jpg|image/jpeg|2000|1500|0|243271||1655125395|1655125395764|0|0|0|0|||||||| +1748|60493|content://media/external/images/media/60493|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0028.jpg|image/jpeg|2000|1500|0|351030||1655125394|1655125394851|0|0|0|0|||||||| +1749|60486|content://media/external/images/media/60486|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0026.jpg|image/jpeg|1500|2000|0|271437||1655125384|1655125385084|0|0|0|0|||||||| +1750|60477|content://media/external/images/media/60477|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0023.jpg|image/jpeg|2000|1500|0|275708||1655125383|1655125384029|0|0|0|0|||||||| +1751|60480|content://media/external/images/media/60480|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0024.jpg|image/jpeg|2000|1500|0|275433||1655125384|1655125384245|0|0|0|0|||||||| +1752|60483|content://media/external/images/media/60483|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0025.jpg|image/jpeg|2000|1500|0|285767||1655125384|1655125384634|0|0|0|0|||||||| +1753|60468|content://media/external/images/media/60468|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0020.jpg|image/jpeg|2000|1500|0|273543||1655125382|1655125383243|0|0|0|0|||||||| +1754|60471|content://media/external/images/media/60471|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0021.jpg|image/jpeg|2000|1500|0|300431||1655125383|1655125383496|0|0|0|0|||||||| +1755|60474|content://media/external/images/media/60474|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0022.jpg|image/jpeg|2000|1500|0|308966||1655125383|1655125383762|0|0|0|0|||||||| +1756|60459|content://media/external/images/media/60459|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0017.jpg|image/jpeg|2000|1500|0|262803||1655125381|1655125382199|0|0|0|0|||||||| +1757|60462|content://media/external/images/media/60462|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0018.jpg|image/jpeg|1500|2000|0|315037||1655125382|1655125382566|0|0|0|0|||||||| +1758|60465|content://media/external/images/media/60465|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0019.jpg|image/jpeg|2000|1500|0|284329||1655125382|1655125382972|0|0|0|0|||||||| +1759|60452|content://media/external/images/media/60452|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0015.jpg|image/jpeg|2000|1500|0|279791||1655125379|1655125380117|0|0|0|0|||||||| +1760|60446|content://media/external/images/media/60446|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0013.jpg|image/jpeg|2000|1500|0|301234||1655125378|1655125379244|0|0|0|0|||||||| +1761|60449|content://media/external/images/media/60449|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0014.jpg|image/jpeg|1500|2000|0|333123||1655125379|1655125379733|0|0|0|0|||||||| +1762|60443|content://media/external/images/media/60443|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0012.jpg|image/jpeg|2000|1500|0|292650||1655125378|1655125378957|0|0|0|0|||||||| +1763|60436|content://media/external/images/media/60436|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-13-13-54-39-970_com.whatsapp.jpg|image/jpeg|1080|2400|0|877524||1655121280|1655121280390|0|0|0|0|||||||| +1764|60430|content://media/external/images/media/60430|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0008.jpg|image/jpeg|768|1024|0|71305||1655104224|1655104224687|0|0|0|0|||||||| +1765|60394|content://media/external/images/media/60394|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220612-WA0006.jpg|image/jpeg|1200|1600|0|175795||1655066455|1655104006065|0|0|0|0|||||||| +1766|60401|content://media/external/images/media/60401|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0002.jpg|image/jpeg|1152|2048|0|317227||1655075261|1655098572302|0|0|0|0|||||||| +1767|60403|content://media/external/images/media/60403|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0003.jpg|image/jpeg|2048|1536|0|384617||1655075262|1655098562144|0|0|0|0|||||||| +1768|60405|content://media/external/images/media/60405|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0004.jpg|image/jpeg|2048|1536|0|482298||1655075264|1655098536462|0|0|0|0|||||||| +1769|60397|content://media/external/images/media/60397|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0007.jpg|image/jpeg|1200|1600|0|173562||1655069407|1655075304306|0|0|0|0|||||||| +1770|60376|content://media/external/images/media/60376|/storage/emulated/0/DCIM/Camera/IMG_20220612_134626.jpg|image/jpeg|4608|2592|0|4680280||1655034393|1655034393105|1655034387970|0|0|0|||||||| +1771|60375|content://media/external/images/media/60375|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-12-13-00-10-850_com.instagram.android.jpg|image/jpeg|1080|2400|0|1020560||1655031611|1655031611282|0|0|0|0|||||||| +1772|60374|content://media/external/images/media/60374|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-12-12-59-18-222_com.shazam.android.jpg|image/jpeg|1080|2400|0|818294||1655031558|1655031558726|0|0|0|0|||||||| +1773|60370|content://media/external/images/media/60370|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220612-WA0002.jpg|image/jpeg|1080|590|0|36322||1655030398|1655030398974|0|0|0|0|||||||| +1774|60368|content://media/external/images/media/60368|/storage/emulated/0/DCIM/Camera/IMG_20220612_123046.jpg|image/jpeg|4608|2592|0|5129811||1655029852|1655029852374|1655029847186|0|0|0|||||||| +1775|60366|content://media/external/images/media/60366|/storage/emulated/0/DCIM/Camera/IMG_20220612_114855.jpg|image/jpeg|4608|2592|0|5302932||1655027339|1655027339177|1655027335318|0|0|0|||||||| +1776|60363|content://media/external/images/media/60363|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220612-WA0001.jpg|image/jpeg|1920|1080|0|196756||1655026673|1655026674409|0|0|0|0|||||||| +1777|60361|content://media/external/images/media/60361|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220612-WA0000.jpg|image/jpeg|1117|1462|0|106302||1655023031|1655023031974|0|0|0|0|||||||| +1778|60353|content://media/external/images/media/60353|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-11-18-25-23-269_com.google.android.apps.maps.jpg|image/jpeg|1080|2400|0|972485||1654964723|1654964723675|0|0|0|0|||||||| +1779|60336|content://media/external/images/media/60336|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-11-14-59-25-713_com.huami.watch.hmwatchmanager.jpg|image/jpeg|1080|2400|0|655183||1654952365|1654952366085|0|0|0|0|||||||| +1780|60304|content://media/external/images/media/60304|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220611-WA0007.jpg|image/jpeg|1361|935|0|295696||1654939781|1654939781586|0|0|0|0|||||||| +1781|60302|content://media/external/images/media/60302|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220611-WA0006.jpg|image/jpeg|1000|1422|0|336809||1654939469|1654939469347|0|0|0|0|||||||| +1782|60295|content://media/external/images/media/60295|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220611-WA0004.jpg|image/jpeg|1200|1600|0|174483||1654935353|1654935354866|0|0|0|0|||||||| +1783|60289|content://media/external/images/media/60289|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220611-WA0002.jpg|image/jpeg|1488|1984|0|164515||1654929033|1654929034136|0|0|0|0|||||||| +1784|60269|content://media/external/images/media/60269|/storage/emulated/0/DCIM/Camera/IMG_20220610_215608.jpg|image/jpeg|4608|2592|0|4404940||1654890976|1654890976966|1654890969285|0|0|0|||||||| +1785|60243|content://media/external/images/media/60243|/storage/emulated/0/DCIM/Camera/IMG_20220610_170045.jpg|image/jpeg|2592|4608|0|3602205||1654873251|1654873251508|1654873245523|0|0|0|||||||| +1786|60241|content://media/external/images/media/60241|/storage/emulated/0/DCIM/Camera/IMG_20220610_165428.jpg|image/jpeg|2592|4608|0|2968458||1654872871|1654872871206|1654872868408|0|0|0|||||||| +1787|60231|content://media/external/images/media/60231|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220610-WA0023.jpg|image/jpeg|1125|1600|0|379094||1654860946|1654860947491|0|0|0|0|||||||| +1788|60217|content://media/external/images/media/60217|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220610-WA0015.jpeg|image/jpeg|3840|2160|90|1644514||1654855494|1654855494727|1654855494554|0|0|0|||||||| +1789|60214|content://media/external/images/media/60214|/storage/emulated/0/DCIM/Camera/IMG_20220610_111729.jpg|image/jpeg|735|614|0|117338||1654852649|1654852649710|1654852453485|0|0|0|||||||| +1790|60210|content://media/external/images/media/60210|/storage/emulated/0/DCIM/Camera/IMG_20220610_111400.jpg|image/jpeg|2592|4608|0|4908382||1654852443|1654852443365|1654852440563|0|0|0|||||||| +1791|60208|content://media/external/images/media/60208|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220610-WA0011.jpeg|image/jpeg|3840|2160|0|1384497||1654852271|1654852271902|1654852271683|0|0|0|||||||| +1792|60205|content://media/external/images/media/60205|/storage/emulated/0/DCIM/Camera/IMG_20220610_110716.jpg|image/jpeg|2592|4608|0|3903160||1654852041|1654852041487|1654852037586|0|0|0|||||||| +1793|60203|content://media/external/images/media/60203|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220610-WA0008.jpeg|image/jpeg|3840|2160|90|1417320||1654851967|1654851967563|1654851967350|0|0|0|||||||| +1794|60163|content://media/external/images/media/60163|/storage/emulated/0/DCIM/Camera/IMG_20220609_181845.jpg|image/jpeg|3395|2142|0|3141619||1654791528|1654791528311|1654791527798|0|0|0|||||||| +1795|60161|content://media/external/images/media/60161|/storage/emulated/0/DCIM/Camera/IMG_20220609_181754.jpg|image/jpeg|3083|1951|0|2694019||1654791478|1654791478903|1654791477676|0|0|0|||||||| +1796|60159|content://media/external/images/media/60159|/storage/emulated/0/DCIM/Camera/IMG_20220609_181638.jpg|image/jpeg|3673|2273|0|3661670||1654791401|1654791401671|1654791400755|0|0|0|||||||| +1797|60143|content://media/external/images/media/60143|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0039.jpg|image/jpeg|921|2048|0|118259||1654771405|1654771406444|0|0|0|0|||||||| +1798|60141|content://media/external/images/media/60141|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0038.jpg|image/jpeg|474|828|0|65885||1654769670|1654769670635|0|0|0|0|||||||| +1799|60139|content://media/external/images/media/60139|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0037.jpg|image/jpeg|710|808|0|245270||1654769665|1654769665988|0|0|0|0|||||||| +1800|60137|content://media/external/images/media/60137|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0036.jpg|image/jpeg|462|928|0|144148||1654769660|1654769660352|0|0|0|0|||||||| +1801|60135|content://media/external/images/media/60135|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0035.jpg|image/jpeg|784|961|0|307868||1654769651|1654769652251|0|0|0|0|||||||| +1802|60040|content://media/external/images/media/60040|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-09-08-55-02-938_com.android.chrome.jpg|image/jpeg|1080|2400|0|385812||1654757703|1654757703261|0|0|0|0|||||||| +1803|60035|content://media/external/images/media/60035|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220531-WA0020.jpg|image/jpeg|900|1600|0|118660||1654754878|1654754879131|0|0|0|0|||||||| +1804|60009|content://media/external/images/media/60009|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220608-WA0015.jpg|image/jpeg|1600|2000|0|317921||1654720095|1654720095860|0|0|0|0|||||||| +1805|59992|content://media/external/images/media/59992|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-08-18-57-57-457_com.ilmeteo.android.ilmeteo.jpg|image/jpeg|1080|2400|0|1030055||1654707477|1654707477877|0|0|0|0|||||||| +1806|59987|content://media/external/images/media/59987|/storage/emulated/0/DCIM/Camera/IMG_20220608_150812.jpg|image/jpeg|2184|3357|0|5733796||1654693698|1654693698546|1654693697812|0|0|0|||||||| +1807|59986|content://media/external/images/media/59986|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-08-15-04-55-029_com.google.android.apps.photos.jpg|image/jpeg|1080|2400|0|1529751||1654693495|1654693495129|0|0|0|0|||||||| +1808|59985|content://media/external/images/media/59985|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-08-15-04-46-742_com.google.android.apps.photos.jpg|image/jpeg|1080|2400|0|1444078||1654693486|1654693486853|0|0|0|0|||||||| +1809|59982|content://media/external/images/media/59982|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220608-WA0009.jpg|image/jpeg|1080|1920|0|170007||1654693247|1654693248073|0|0|0|0|||||||| +1810|59951|content://media/external/images/media/59951|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220608-WA0002.jpg|image/jpeg|720|1600|0|176974||1654677418|1654677419115|0|0|0|0|||||||| +1811|59930|content://media/external/images/media/59930|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-08-09-11-03-950_it.caitalia.apphub.jpg|image/jpeg|1080|2400|0|653439||1654672264|1654672264368|0|0|0|0|||||||| +1812|59919|content://media/external/images/media/59919|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220607-WA0021.jpg|image/jpeg|1236|1600|0|306577||1654632712|1654632713170|0|0|0|0|||||||| +1813|59916|content://media/external/images/media/59916|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220607-WA0020.jpg|image/jpeg|1060|465|0|41734||1654632272|1654632272736|0|0|0|0|||||||| +1814|59911|content://media/external/images/media/59911|/storage/emulated/0/Pictures/Whatsapp/IMG-20220607-WA0018.jpg|image/jpeg|997|2048|0|312905||1654623436|1654623436367|0|0|0|0|||||||| +1815|59883|content://media/external/images/media/59883|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220607-WA0015.jpg|image/jpeg|921|2048|0|147539||1654614777|1654614778166|0|0|0|0|||||||| +1816|59879|content://media/external/images/media/59879|/storage/emulated/0/DCIM/Camera/IMG_20220607_144859.jpg|image/jpeg|2592|4608|0|4473680||1654606142|1654606142523|1654606140540|0|0|0|||||||| +1817|59877|content://media/external/images/media/59877|/storage/emulated/0/DCIM/Camera/IMG_20220607_144813.jpg|image/jpeg|1257|3352|0|2161977||1654606096|1654606096047|1654606095589|0|0|0|||||||| +1818|59873|content://media/external/images/media/59873|/storage/emulated/0/DCIM/Camera/IMG_20220607_143507.jpg|image/jpeg|4608|2592|0|4139679||1654605308|1654605308231|1653654293717|0|0|0|||||||| +1819|59519|content://media/external/images/media/59519|/storage/emulated/0/DCIM/Camera/IMG_20220603_165858.jpg|image/jpeg|3200|1800|0|2700423||1654268339|1654268340021|1654268338189|0|0|0|||||||| +1820|48523|content://media/external/images/media/48523|/storage/emulated/0/DCIM/Camera/IMG_20220531_190506.jpg|image/jpeg|3200|1800|0|3176332||1654016708|1654016708720|1654016706807|0|0|0|||||||| +1821|48521|content://media/external/images/media/48521|/storage/emulated/0/DCIM/Camera/IMG_20220531_184651.jpg|image/jpeg|4608|2592|0|6141148||1654015614|1654015614630|1654015611523|0|0|0|||||||| +1822|48374|content://media/external/images/media/48374|/storage/emulated/0/Pictures/Whatsapp/IMG-20220529-WA0028.jpg|image/jpeg|2048|1537|0|273406||1653914153|1653914153918|0|0|0|0|||||||| +1823|48326|content://media/external/images/media/48326|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0028.jpg|image/jpeg|2048|1537|0|273406||1653848668|1653897519149|0|0|0|0|||||||| +1824|48336|content://media/external/images/media/48336|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220530-WA0001.jpg|image/jpeg|768|1024|0|108983||1653862814|1653862815286|0|0|0|0|||||||| +1825|48332|content://media/external/images/media/48332|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220530-WA0000.jpg|image/jpeg|720|1600|0|87535||1653862444|1653862444926|0|0|0|0|||||||| +1826|48321|content://media/external/images/media/48321|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0026.jpg|image/jpeg|1153|2048|0|285505||1653848124|1653848125980|0|0|0|0|||||||| +1827|48288|content://media/external/images/media/48288|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0016.jpg|image/jpeg|1128|1504|0|235476||1653836453|1653837107471|0|0|0|0|||||||| +1828|48286|content://media/external/images/media/48286|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0015.jpg|image/jpeg|1128|1504|0|297995||1653836451|1653836453189|0|0|0|0|||||||| +1829|48284|content://media/external/images/media/48284|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0014.jpg|image/jpeg|1600|1200|0|165322||1653836380|1653836451216|0|0|0|0|||||||| +1830|48282|content://media/external/images/media/48282|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0013.jpg|image/jpeg|1128|1504|0|269255||1653836359|1653836380194|0|0|0|0|||||||| +1831|48290|content://media/external/images/media/48290|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0012.jpg|image/jpeg|1128|1504|0|304809||1653836349|1653836359833|0|0|0|0|||||||| +1832|48279|content://media/external/images/media/48279|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0011.jpg|image/jpeg|1128|1504|0|199236||1653836246|1653836283528|0|0|0|0|||||||| +1833|48276|content://media/external/images/media/48276|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0010.jpg|image/jpeg|1128|1504|0|220274||1653836237|1653836246182|0|0|0|0|||||||| +1834|48273|content://media/external/images/media/48273|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0009.jpg|image/jpeg|1504|1128|0|234273||1653836233|1653836237435|0|0|0|0|||||||| +1835|48270|content://media/external/images/media/48270|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0008.jpg|image/jpeg|1504|1128|0|254041||1653836228|1653836233155|0|0|0|0|||||||| +1836|48267|content://media/external/images/media/48267|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0007.jpg|image/jpeg|1128|1504|0|175580||1653836224|1653836228134|0|0|0|0|||||||| +1837|48264|content://media/external/images/media/48264|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0006.jpg|image/jpeg|1532|2048|0|343052||1653831376|1653831376826|0|0|0|0|||||||| +1838|48262|content://media/external/images/media/48262|/storage/emulated/0/DCIM/Camera/IMG_20220529_152710.jpg|image/jpeg|4608|2592|0|4857590||1653830834|1653830834465|1653830830747|0|0|0|||||||| +1839|48260|content://media/external/images/media/48260|/storage/emulated/0/DCIM/Camera/IMG_20220529_152557.jpg|image/jpeg|2592|4608|0|5506638||1653830763|1653830764609|1653830757867|0|0|0|||||||| +1840|48258|content://media/external/images/media/48258|/storage/emulated/0/DCIM/Camera/IMG_20220529_152550.jpg|image/jpeg|2592|4608|0|5093604||1653830755|1653830755701|1653830750868|0|0|0|||||||| +1841|48255|content://media/external/images/media/48255|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0005.jpg|image/jpeg|2048|1536|0|372196||1653828279|1653828280102|0|0|0|0|||||||| +1842|48252|content://media/external/images/media/48252|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0004.jpg|image/jpeg|1536|2048|0|224822||1653828264|1653828264845|0|0|0|0|||||||| +1843|48246|content://media/external/images/media/48246|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0002.jpg|image/jpeg|1536|2048|0|242151||1653828249|1653828250319|0|0|0|0|||||||| +1844|48249|content://media/external/images/media/48249|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0003.jpg|image/jpeg|1536|2048|0|208934||1653828250|1653828250632|0|0|0|0|||||||| +1845|48243|content://media/external/images/media/48243|/storage/emulated/0/DCIM/Camera/IMG_20220529_143233.jpg|image/jpeg|3200|1800|0|2371231||1653827556|1653827556435|1653827553655|0|0|0|||||||| +1846|48237|content://media/external/images/media/48237|/storage/emulated/0/DCIM/Camera/IMG_20220529_122648.jpg|image/jpeg|4608|2592|0|2952897||1653820011|1653820011807|1653820008265|0|0|0|||||||| +1847|48200|content://media/external/images/media/48200|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220528-WA0009.jpg|image/jpeg|1200|1600|0|191104||1653741106|1653741107012|0|0|0|0|||||||| +1848|48203|content://media/external/images/media/48203|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220528-WA0010.jpg|image/jpeg|1200|1600|0|172648||1653741107|1653741107453|0|0|0|0|||||||| +1849|48116|content://media/external/images/media/48116|/storage/emulated/0/DCIM/Camera/IMG_20220527_142525.jpg|image/jpeg|4608|2592|0|5163939||1653654327|1653654327088|1653654325363|0|0|0|||||||| +1850|48114|content://media/external/images/media/48114|/storage/emulated/0/DCIM/Camera/IMG_20220527_142520.jpg|image/jpeg|4608|2592|0|4773250||1653654323|1653654323120|1653654320524|0|0|0|||||||| +1851|48112|content://media/external/images/media/48112|/storage/emulated/0/DCIM/Camera/IMG_20220527_142453.jpg|image/jpeg|4608|2592|0|4716700||1653654297|1653654297464|1653654293717|0|0|0|||||||| +1852|48082|content://media/external/images/media/48082|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220527-WA0008.jpg|image/jpeg|921|2048|0|148516||1653646507|1653646560796|0|0|0|0|||||||| +1853|48001|content://media/external/images/media/48001|/storage/emulated/0/Download/Soduto/retro.jpg|image/jpeg|2590|4612|0|501289||1653555956|1653555957930|1640524806000|0|0|0|||||||| +1854|48000|content://media/external/images/media/48000|/storage/emulated/0/Download/Soduto/fronte.jpg|image/jpeg|2590|4612|0|500503||1653555950|1653555951269|1640524794000|0|0|0|||||||| +1855|47946|content://media/external/images/media/47946|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0008.jpg|image/jpeg|1599|899|0|123374||1653494034|1653494034754|0|0|0|0|||||||| +1856|47945|content://media/external/images/media/47945|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-25-15-09-16-661_com.instagram.android.jpg|image/jpeg|1080|2400|0|953606||1653484157|1653484157240|0|0|0|0|||||||| +1857|47944|content://media/external/images/media/47944|/storage/emulated/0/DCIM/PlantNet/2022-05-25T13_30_00+02_00.JPEG|image/jpeg|3000|4000|0|5053627||1653478200|1653478200273|1653478191896|0|0|0|||||||| +1858|47941|content://media/external/images/media/47941|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0007.jpg|image/jpeg|1192|2048|0|197598||1653477184|1653477185831|0|0|0|0|||||||| +1859|47938|content://media/external/images/media/47938|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0006.jpg|image/jpeg|1600|900|0|130334||1653476769|1653476770846|0|0|0|0|||||||| +1860|47935|content://media/external/images/media/47935|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0005.jpg|image/jpeg|900|1600|0|132733||1653471612|1653471612992|0|0|0|0|||||||| +1861|47932|content://media/external/images/media/47932|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0004.jpg|image/jpeg|900|1600|0|64583||1653471604|1653471605666|0|0|0|0|||||||| +1862|47929|content://media/external/images/media/47929|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0003.jpg|image/jpeg|818|1599|0|72940||1653471115|1653471116799|0|0|0|0|||||||| +1863|47917|content://media/external/images/media/47917|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0000.jpg|image/jpeg|1080|1377|0|90145||1653454334|1653454335652|0|0|0|0|||||||| +1864|47899|content://media/external/images/media/47899|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220524-WA0002.jpg|image/jpeg|1599|899|0|113208||1653388067|1653388068562|0|0|0|0|||||||| +1865|47896|content://media/external/images/media/47896|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220524-WA0001.jpg|image/jpeg|921|2048|0|138191||1653384907|1653384908240|0|0|0|0|||||||| +1866|47877|content://media/external/images/media/47877|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220523-WA0009.jpg|image/jpeg|1532|2048|0|112821||1653298509|1653298510705|0|0|0|0|||||||| +1867|47852|content://media/external/images/media/47852|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-23-10-41-42-885_it.subito.jpg|image/jpeg|1080|2400|0|1031151||1653295303|1653295303324|0|0|0|0|||||||| +1868|47850|content://media/external/images/media/47850|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220523-WA0002.jpg|image/jpeg|1200|1312|0|219920||1653290146|1653290147077|0|0|0|0|||||||| +1869|47847|content://media/external/images/media/47847|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220523-WA0001.jpg|image/jpeg|1536|2048|0|249290||1653289900|1653289901046|0|0|0|0|||||||| +1870|47840|content://media/external/images/media/47840|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220523-WA0000.jpg|image/jpeg|1600|1200|0|177774||1653282459|1653282460248|0|0|0|0|||||||| +1871|47834|content://media/external/images/media/47834|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0047.jpg|image/jpeg|1200|1600|0|127728||1653256635|1653256636579|0|0|0|0|||||||| +1872|47787|content://media/external/images/media/47787|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0034.jpg|image/jpeg|896|2000|0|374736||1653226756|1653226757741|0|0|0|0|||||||| +1873|47784|content://media/external/images/media/47784|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0033.jpg|image/jpeg|896|2000|0|127369||1653226755|1653226756497|0|0|0|0|||||||| +1874|47778|content://media/external/images/media/47778|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0031.jpg|image/jpeg|896|2000|0|202145||1653226754|1653226755202|0|0|0|0|||||||| +1875|47781|content://media/external/images/media/47781|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0032.jpg|image/jpeg|896|2000|0|147011||1653226755|1653226755889|0|0|0|0|||||||| +1876|47775|content://media/external/images/media/47775|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0030.jpg|image/jpeg|896|2000|0|162459||1653226753|1653226754397|0|0|0|0|||||||| +1877|47772|content://media/external/images/media/47772|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0029.jpg|image/jpeg|896|2000|0|151834||1653226752|1653226753553|0|0|0|0|||||||| +1878|47766|content://media/external/images/media/47766|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0027.jpg|image/jpeg|896|2000|0|422731||1653226751|1653226752207|0|0|0|0|||||||| +1879|47769|content://media/external/images/media/47769|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0028.jpg|image/jpeg|896|2000|0|151284||1653226752|1653226752929|0|0|0|0|||||||| +1880|47763|content://media/external/images/media/47763|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0026.jpg|image/jpeg|896|2000|0|513130||1653226749|1653226751024|0|0|0|0|||||||| +1881|47760|content://media/external/images/media/47760|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0025.jpg|image/jpeg|896|2000|0|505037||1653226748|1653226749709|0|0|0|0|||||||| +1882|47757|content://media/external/images/media/47757|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0024.jpg|image/jpeg|2000|896|0|337955||1653226747|1653226748456|0|0|0|0|||||||| +1883|47754|content://media/external/images/media/47754|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0023.jpg|image/jpeg|2000|896|0|347650||1653226746|1653226747511|0|0|0|0|||||||| +1884|47751|content://media/external/images/media/47751|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0022.jpg|image/jpeg|2000|896|0|232229||1653226745|1653226746514|0|0|0|0|||||||| +1885|47745|content://media/external/images/media/47745|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0020.jpg|image/jpeg|896|2000|0|234016||1653226744|1653226745041|0|0|0|0|||||||| +1886|47748|content://media/external/images/media/47748|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0021.jpg|image/jpeg|896|2000|0|215028||1653226745|1653226745850|0|0|0|0|||||||| +1887|47742|content://media/external/images/media/47742|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0019.jpg|image/jpeg|896|2000|0|421970||1653226742|1653226744197|0|0|0|0|||||||| +1888|47705|content://media/external/images/media/47705|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0008.jpg|image/jpeg|1536|2048|0|501565||1653202869|1653202870025|0|0|0|0|||||||| +1889|47702|content://media/external/images/media/47702|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0007.jpg|image/jpeg|1536|2048|0|521375||1653202836|1653202836819|0|0|0|0|||||||| +1890|47699|content://media/external/images/media/47699|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0006.jpg|image/jpeg|1536|2048|0|543721||1653202831|1653202832049|0|0|0|0|||||||| +1891|47696|content://media/external/images/media/47696|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0005.jpg|image/jpeg|1200|1600|0|208543||1653202160|1653202163845|0|0|0|0|||||||| +1892|47693|content://media/external/images/media/47693|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0004.jpg|image/jpeg|1200|1600|0|199489||1653201568|1653201574944|0|0|0|0|||||||| +1893|47690|content://media/external/images/media/47690|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0003.jpg|image/jpeg|1200|1600|0|192409||1653201522|1653201522925|0|0|0|0|||||||| +1894|47674|content://media/external/images/media/47674|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-21-18-11-51-414_com.google.android.apps.maps.jpg|image/jpeg|1080|2400|0|671008||1653149511|1653149511575|0|0|0|0|||||||| +1895|47614|content://media/external/images/media/47614|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220521-WA0002.jpg|image/jpeg|899|1599|0|288125||1653117742|1653117743877|0|0|0|0|||||||| +1896|47610|content://media/external/images/media/47610|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-21-09-14-25-272_com.outdooractive.Outdooractive.jpg|image/jpeg|1080|2400|0|587786||1653117265|1653117265797|0|0|0|0|||||||| +1897|47598|content://media/external/images/media/47598|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-20-20-43-30-851_com.huami.watch.hmwatchmanager.jpg|image/jpeg|1080|2400|0|667662||1653072211|1653072211276|0|0|0|0|||||||| +1898|47596|content://media/external/images/media/47596|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-20-20-42-57-534_com.brytonsport.active.jpg|image/jpeg|1080|2400|0|569625||1653072177|1653072177940|0|0|0|0|||||||| +1899|47587|content://media/external/images/media/47587|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-20-18-52-55-038_com.whatsapp.jpg|image/jpeg|1080|2400|0|815009||1653065575|1653065575511|0|0|0|0|||||||| +1900|47581|content://media/external/images/media/47581|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-20-18-34-31-372_de.komoot.android.jpg|image/jpeg|1080|2400|0|750021||1653064471|1653064471810|0|0|0|0|||||||| +1901|47575|content://media/external/images/media/47575|/storage/emulated/0/DCIM/Camera/IMG_20220520_150658.jpg|image/jpeg|4608|2592|0|4060560||1653052023|1653052023795|1653052019700|0|0|0|||||||| +1902|47572|content://media/external/images/media/47572|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220520-WA0012.jpg|image/jpeg|1600|1200|0|292953||1653051079|1653051080375|0|0|0|0|||||||| +1903|47565|content://media/external/images/media/47565|/storage/emulated/0/DCIM/Camera/IMG_20220520_144012.jpg|image/jpeg|2592|4608|0|8039432||1653050415|1653050415531|1653050412303|0|0|0|||||||| +1904|47563|content://media/external/images/media/47563|/storage/emulated/0/DCIM/Camera/IMG_20220520_143153.jpg|image/jpeg|2592|4608|0|8837297||1653049920|1653049920835|1653049914700|0|0|0|||||||| +1905|47560|content://media/external/images/media/47560|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220520-WA0009.jpg|image/jpeg|1599|1200|0|136762||1653049062|1653049063010|0|0|0|0|||||||| +1906|47550|content://media/external/images/media/47550|/storage/emulated/0/DCIM/Camera/IMG_20220520_131041.jpg|image/jpeg|3200|1800|0|2422586||1653045047|1653045047974|1653045041767|0|0|0|||||||| +1907|47547|content://media/external/images/media/47547|/storage/emulated/0/DCIM/Camera/IMG_20220520_130814.jpg|image/jpeg|3200|1800|0|2639771||1653044902|1653044902830|1653044895613|0|0|0|||||||| +1908|47544|content://media/external/images/media/47544|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220520-WA0004.jpg|image/jpeg|1920|1080|0|255430||1653042127|1653042127629|0|0|0|0|||||||| +1909|47541|content://media/external/images/media/47541|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220520-WA0003.jpg|image/jpeg|600|600|0|11043||1653041984|1653041985250|0|0|0|0|||||||| +1910|47535|content://media/external/images/media/47535|/storage/emulated/0/DCIM/Camera/IMG_20220520_105716.jpg|image/jpeg|5120|2880|0|5478039||1653037039|1653037039274|1653037037300|0|0|0|||||||| +1911|47501|content://media/external/images/media/47501|/storage/emulated/0/DCIM/Camera/IMG_20220519_180423.jpg|image/jpeg|2592|4608|0|5029788||1652976265|1652976265621|1652976263512|0|0|0|||||||| +1912|47499|content://media/external/images/media/47499|/storage/emulated/0/DCIM/Camera/IMG_20220519_180400.jpg|image/jpeg|2592|4608|0|4838157||1652976242|1652976242205|1652976240230|0|0|0|||||||| +1913|47497|content://media/external/images/media/47497|/storage/emulated/0/DCIM/Camera/IMG_20220519_180331.jpg|image/jpeg|2592|4608|0|5284619||1652976213|1652976214065|1652976211416|0|0|0|||||||| +1914|47495|content://media/external/images/media/47495|/storage/emulated/0/DCIM/Camera/IMG_20220519_180249.jpg|image/jpeg|2592|4608|0|4705962||1652976171|1652976171661|1652976169730|0|0|0|||||||| +1915|47493|content://media/external/images/media/47493|/storage/emulated/0/DCIM/Camera/IMG_20220519_180230.jpg|image/jpeg|2592|4608|0|4561585||1652976152|1652976152885|1652976150866|0|0|0|||||||| +1916|47489|content://media/external/images/media/47489|/storage/emulated/0/DCIM/Camera/IMG_20220519_180216.jpg|image/jpeg|2592|4608|0|4454490||1652976141|1652976141489|1652976136916|0|0|0|||||||| +1917|47467|content://media/external/images/media/47467|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0010.jpg|image/jpeg|2048|1536|0|383398||1652956120|1652956121257|0|0|0|0|||||||| +1918|47464|content://media/external/images/media/47464|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0009.jpg|image/jpeg|2048|1536|0|358049||1652956118|1652956118766|0|0|0|0|||||||| +1919|47461|content://media/external/images/media/47461|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0008.jpg|image/jpeg|1536|2048|0|449485||1652955990|1652955991577|0|0|0|0|||||||| +1920|47454|content://media/external/images/media/47454|/storage/emulated/0/Pictures/Whatsapp/IMG-20220519-WA0003.jpg|image/jpeg|768|1024|0|139245||1652951795|1652951796011|0|0|0|0|||||||| +1921|47453|content://media/external/images/media/47453|/storage/emulated/0/Pictures/Whatsapp/IMG-20220519-WA0004.jpg|image/jpeg|576|1024|0|94979||1652951793|1652951793239|0|0|0|0|||||||| +1922|47452|content://media/external/images/media/47452|/storage/emulated/0/Pictures/Whatsapp/IMG-20220519-WA0005.jpg|image/jpeg|768|1024|0|135274||1652951789|1652951789859|0|0|0|0|||||||| +1923|47451|content://media/external/images/media/47451|/storage/emulated/0/Pictures/Whatsapp/IMG-20220519-WA0002.jpg|image/jpeg|768|1024|0|139611||1652951785|1652951785743|0|0|0|0|||||||| +1924|47448|content://media/external/images/media/47448|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0005.jpg|image/jpeg|768|1024|0|135274||1652948236|1652948237495|0|0|0|0|||||||| +1925|47442|content://media/external/images/media/47442|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0003.jpg|image/jpeg|768|1024|0|139245||1652948235|1652948236137|0|0|0|0|||||||| +1926|47445|content://media/external/images/media/47445|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0004.jpg|image/jpeg|576|1024|0|94979||1652948236|1652948236812|0|0|0|0|||||||| +1927|47439|content://media/external/images/media/47439|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0002.jpg|image/jpeg|768|1024|0|139611||1652948234|1652948235445|0|0|0|0|||||||| +1928|47437|content://media/external/images/media/47437|/storage/emulated/0/DCIM/Camera/IMG_20220519_075753.jpg|image/jpeg|4608|2592|0|5190001||1652939877|1652939878010|1652939873816|0|0|0|||||||| +1929|47430|content://media/external/images/media/47430|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0000.jpg|image/jpeg|640|640|0|41511||1652938514|1652938523966|0|0|0|0|||||||| +1930|47418|content://media/external/images/media/47418|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0042.jpg|image/jpeg|1079|720|0|79825||1652903333|1652903333830|0|0|0|0|||||||| +1931|47386|content://media/external/images/media/47386|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0032.jpg|image/jpeg|996|2048|0|145294||1652876946|1652902371597|0|0|0|0|||||||| +1932|47414|content://media/external/images/media/47414|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0041.jpg|image/jpeg|1080|1920|0|265733||1652891707|1652891707825|0|0|0|0|||||||| +1933|47411|content://media/external/images/media/47411|/storage/emulated/0/DCIM/Camera/IMG_20220518_181149.jpg|image/jpeg|2592|4608|0|5137687||1652890311|1652890311611|1652890309166|0|0|0|||||||| +1934|47405|content://media/external/images/media/47405|/storage/emulated/0/DCIM/Camera/IMG_20220518_180954.jpg|image/jpeg|2592|4608|0|4918229||1652890196|1652890196715|1652890194354|0|0|0|||||||| +1935|47403|content://media/external/images/media/47403|/storage/emulated/0/DCIM/Camera/IMG_20220518_180856.jpg|image/jpeg|4608|2592|0|4276907||1652890138|1652890138875|1652890136838|0|0|0|||||||| +1936|47400|content://media/external/images/media/47400|/storage/emulated/0/DCIM/Camera/IMG_20220518_180849.jpg|image/jpeg|2592|4608|0|4832278||1652890131|1652890131723|1652890129378|0|0|0|||||||| +1937|47399|content://media/external/images/media/47399|/storage/emulated/0/DCIM/Camera/IMG_20220518_180846.jpg|image/jpeg|2592|4608|0|4800522||1652890130|1652890130351|1652890126467|0|0|0|||||||| +1938|47396|content://media/external/images/media/47396|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0035.jpg|image/jpeg|2048|1361|0|374006||1652883631|1652883631650|0|0|0|0|||||||| +1939|47393|content://media/external/images/media/47393|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0034.jpg|image/jpeg|1050|698|0|119555||1652883581|1652883581956|0|0|0|0|||||||| +1940|47378|content://media/external/images/media/47378|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0029.jpg|image/jpeg|1080|715|0|76921||1652875423|1652875423640|0|0|0|0|||||||| +1941|47369|content://media/external/images/media/47369|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0027.jpg|image/jpeg|853|480|0|56776||1652875077|1652875077697|0|0|0|0|||||||| +1942|47366|content://media/external/images/media/47366|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0026.jpg|image/jpeg|960|720|0|58467||1652875055|1652875056337|0|0|0|0|||||||| +1943|47363|content://media/external/images/media/47363|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0025.jpg|image/jpeg|720|1600|0|60521||1652874177|1652874178444|0|0|0|0|||||||| +1944|47360|content://media/external/images/media/47360|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0023.jpg|image/jpeg|1599|899|0|142812||1652873634|1652873634923|0|0|0|0|||||||| +1945|47354|content://media/external/images/media/47354|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0021.jpg|image/jpeg|648|1152|0|123306||1652873594|1652873594713|0|0|0|0|||||||| +1946|47348|content://media/external/images/media/47348|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0019.jpg|image/jpeg|1416|1062|0|125806||1652873543|1652873543557|0|0|0|0|||||||| +1947|37310|content://media/external/images/media/37310|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220411-WA0030.jpg|image/jpeg|921|2048|0|125665||1649697374|1652872971290|0|0|0|0|||||||| +1948|47340|content://media/external/images/media/47340|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0017.jpg|image/jpeg|2048|921|0|97647||1652872935|1652872936238|0|0|0|0|||||||| +1949|47338|content://media/external/images/media/47338|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0016.jpg|image/jpeg|1277|634|0|480907||1652872837|1652872837709|0|0|0|0|||||||| +1950|47335|content://media/external/images/media/47335|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0015.jpg|image/jpeg|1440|960|0|127540||1652872779|1652872779381|0|0|0|0|||||||| +1951|47332|content://media/external/images/media/47332|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0014.jpg|image/jpeg|750|1334|0|66821||1652872733|1652872733556|0|0|0|0|||||||| +1952|47329|content://media/external/images/media/47329|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0013.jpg|image/jpeg|1600|1200|0|234273||1652872687|1652872688082|0|0|0|0|||||||| +1953|47327|content://media/external/images/media/47327|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0012.jpg|image/jpeg|720|482|0|193159||1652872639|1652872639731|0|0|0|0|||||||| +1954|47324|content://media/external/images/media/47324|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0011.jpg|image/jpeg|768|1152|0|108118||1652872608|1652872608833|0|0|0|0|||||||| +1955|47322|content://media/external/images/media/47322|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0010.jpg|image/jpeg|968|648|0|134680||1652872500|1652872500803|0|0|0|0|||||||| +1956|47319|content://media/external/images/media/47319|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0009.jpg|image/jpeg|921|2048|0|91227||1652872479|1652872480362|0|0|0|0|||||||| +1957|47316|content://media/external/images/media/47316|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0008.jpg|image/jpeg|921|2048|0|134623||1652872471|1652872472112|0|0|0|0|||||||| +1958|47313|content://media/external/images/media/47313|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0007.jpg|image/jpeg|921|2048|0|89902||1652872452|1652872453380|0|0|0|0|||||||| +1959|47310|content://media/external/images/media/47310|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0006.jpg|image/jpeg|921|2048|0|127202||1652872443|1652872443699|0|0|0|0|||||||| +1960|47308|content://media/external/images/media/47308|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0005.jpg|image/jpeg|700|467|0|53692||1652872284|1652872284667|0|0|0|0|||||||| +1961|47305|content://media/external/images/media/47305|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0004.jpg|image/jpeg|1536|2048|0|370125||1652871389|1652871390551|0|0|0|0|||||||| +1962|47302|content://media/external/images/media/47302|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0003.jpg|image/jpeg|1080|1920|0|176965||1652871328|1652871329133|0|0|0|0|||||||| +1963|47299|content://media/external/images/media/47299|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0002.jpg|image/jpeg|1536|2048|0|286429||1652871126|1652871127413|0|0|0|0|||||||| +1964|47293|content://media/external/images/media/47293|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0001.jpg|image/jpeg|899|1599|0|120723||1652868510|1652868511326|0|0|0|0|||||||| +1965|47277|content://media/external/images/media/47277|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220517-WA0014.jpg|image/jpeg|1024|639|0|78912||1652818122|1652818123286|0|0|0|0|||||||| +1966|47271|content://media/external/images/media/47271|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220517-WA0012.jpg|image/jpeg|921|2048|0|118304||1652787441|1652787442593|0|0|0|0|||||||| +1967|47269|content://media/external/images/media/47269|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-17-13-36-30-294_com.whatsapp.jpg|image/jpeg|1080|2400|0|1017217||1652787390|1652787390636|0|0|0|0|||||||| +1968|47267|content://media/external/images/media/47267|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-17-13-12-45-999_com.whatsapp.jpg|image/jpeg|1080|2400|0|823361||1652785966|1652785966373|0|0|0|0|||||||| +1969|47259|content://media/external/images/media/47259|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-17-12-07-26-386_com.whatsapp.jpg|image/jpeg|1080|2400|0|830204||1652782046|1652782046693|0|0|0|0|||||||| +1970|47251|content://media/external/images/media/47251|/storage/emulated/0/DCIM/Screenshots/IMG_20220517_100932.jpg|image/jpeg|1080|1396|0|342121||1652774972|1652774972336|0|0|0|0|||||||| +1971|47248|content://media/external/images/media/47248|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-17-10-04-57-964_com.whatsapp.jpg|image/jpeg|1080|2400|0|939372||1652774698|1652774698285|0|0|0|0|||||||| +1972|47242|content://media/external/images/media/47242|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220517-WA0001.jpg|image/jpeg|1078|654|0|54960||1652770494|1652770494958|0|0|0|0|||||||| +1973|47230|content://media/external/images/media/47230|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220516-WA0005.jpg|image/jpeg|1024|768|0|140050||1652728415|1652728453520|0|0|0|0|||||||| +1974|47223|content://media/external/images/media/47223|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220516-WA0003.jpg|image/jpeg|720|1015|0|73984||1652726020|1652726109550|0|0|0|0|||||||| +1975|47225|content://media/external/images/media/47225|/storage/emulated/0/DCIM/Camera/IMG_20220516_201153.jpg|image/jpeg|2592|4608|0|5102459||1652724715|1652724715685|1652724713160|0|0|0|||||||| +1976|47218|content://media/external/images/media/47218|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220516-WA0001.jpg|image/jpeg|1080|1080|0|104834||1652718664|1652718665014|0|0|0|0|||||||| +1977|47207|content://media/external/images/media/47207|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220516-WA0000.jpg|image/jpeg|720|1600|0|106998||1652682529|1652682531693|0|0|0|0|||||||| +1978|47194|content://media/external/images/media/47194|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220515-WA0011.jpg|image/jpeg|1200|1600|0|240793||1652639980|1652639981423|0|0|0|0|||||||| +1979|47191|content://media/external/images/media/47191|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220515-WA0010.jpg|image/jpeg|1536|2048|0|314563||1652639940|1652639941356|0|0|0|0|||||||| +1980|47188|content://media/external/images/media/47188|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220515-WA0009.jpg|image/jpeg|1200|1600|0|185999||1652637131|1652637131518|0|0|0|0|||||||| +1981|47173|content://media/external/images/media/47173|/storage/emulated/0/DCIM/Camera/IMG_20220515_163903.jpg|image/jpeg|3200|1800|0|2688717||1652625545|1652625545978|1652625543274|0|0|0|||||||| +1982|47171|content://media/external/images/media/47171|/storage/emulated/0/DCIM/Camera/IMG_20220515_163856.jpg|image/jpeg|4608|2592|0|6446685||1652625539|1652625539122|1652625536444|0|0|0|||||||| +1983|47167|content://media/external/images/media/47167|/storage/emulated/0/DCIM/Camera/IMG_20220515_163847.jpg|image/jpeg|2592|4608|0|6277320||1652625533|1652625533730|1652625528640|0|0|0|||||||| +1984|47168|content://media/external/images/media/47168|/storage/emulated/0/DCIM/Camera/IMG_20220515_163848.jpg|image/jpeg|2592|4608|0|5832916||1652625533|1652625533730|1652625528969|0|0|0|||||||| +1985|47152|content://media/external/images/media/47152|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-15-08-31-02-971_com.android.chrome.jpg|image/jpeg|1080|2400|0|625396||1652596263|1652596263283|0|0|0|0|||||||| +1986|47142|content://media/external/images/media/47142|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0011.jpg|image/jpeg|1200|1600|0|218584||1652556600|1652556601058|0|0|0|0|||||||| +1987|47118|content://media/external/images/media/47118|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0004.jpg|image/jpeg|1170|1924|0|271220||1652510565|1652510566298|0|0|0|0|||||||| +1988|47109|content://media/external/images/media/47109|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0002.jpg|image/jpeg|1170|1333|0|187688||1652509640|1652509641434|0|0|0|0|||||||| +1989|47112|content://media/external/images/media/47112|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0003.jpg|image/jpeg|983|740|0|115909||1652509641|1652509641648|0|0|0|0|||||||| +1990|47106|content://media/external/images/media/47106|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0001.jpg|image/jpeg|986|1107|0|134812||1652509639|1652509640853|0|0|0|0|||||||| +1991|47094|content://media/external/images/media/47094|/storage/emulated/0/DCIM/Camera/IMG_20220513_190129.jpg|image/jpeg|4608|2592|0|5598053||1652461294|1652461294626|1652461289122|0|0|0|||||||| +1992|47071|content://media/external/images/media/47071|/storage/emulated/0/DCIM/Camera/IMG_20220513_122021.jpg|image/jpeg|2405|2606|0|4043497||1652437226|1652437226812|1652437225093|0|0|0|||||||| +1993|47069|content://media/external/images/media/47069|/storage/emulated/0/DCIM/Camera/IMG_20220513_122003.jpg|image/jpeg|2408|2609|0|3542972||1652437207|1652437207860|1652437206164|0|0|0|||||||| +1994|47063|content://media/external/images/media/47063|/storage/emulated/0/DCIM/Camera/IMG_20220513_121819.jpg|image/jpeg|2592|4608|0|4884368||1652437101|1652437101840|1652437099476|0|0|0|||||||| +1995|47061|content://media/external/images/media/47061|/storage/emulated/0/DCIM/Camera/IMG_20220513_121804.jpg|image/jpeg|2592|4608|0|5492185||1652437090|1652437090508|1652437084999|0|0|0|||||||| +1996|47058|content://media/external/images/media/47058|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220513-WA0004.jpg|image/jpeg|2048|1365|0|243991||1652434876|1652434876431|0|0|0|0|||||||| +1997|47056|content://media/external/images/media/47056|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220513-WA0003.jpg|image/jpeg|640|640|0|103629||1652433273|1652433274066|0|0|0|0|||||||| +1998|47043|content://media/external/images/media/47043|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220513-WA0000.jpg|image/jpeg|720|1018|0|94855||1652392973|1652392974472|0|0|0|0|||||||| +1999|47035|content://media/external/images/media/47035|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220512-WA0019.jpg|image/jpeg|1500|2000|0|295249||1652377627|1652377627970|0|0|0|0|||||||| +2000|47023|content://media/external/images/media/47023|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220512-WA0016.jpg|image/jpeg|1200|1600|0|265185||1652362648|1652362649364|0|0|0|0|||||||| +2001|47012|content://media/external/images/media/47012|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220512-WA0012.jpg|image/jpeg|1080|1057|0|63031||1652357784|1652357785524|0|0|0|0|||||||| +2002|47004|content://media/external/images/media/47004|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220512-WA0010.jpg|image/jpeg|1536|2048|0|115697||1652351633|1652351643596|0|0|0|0|||||||| +2003|46999|content://media/external/images/media/46999|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-12-10-16-07-708_it.subito.jpg|image/jpeg|1080|2400|0|534638||1652343368|1652343368065|0|0|0|0|||||||| +2004|46997|content://media/external/images/media/46997|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-12-10-08-18-626_it.subito.jpg|image/jpeg|1080|2400|0|507067||1652342898|1652342899026|0|0|0|0|||||||| +2005|46995|content://media/external/images/media/46995|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-12-08-39-52-303_it.sda.mobile.jpg|image/jpeg|1080|2400|0|803000||1652337592|1652337592623|0|0|0|0|||||||| +2006|46973|content://media/external/images/media/46973|/storage/emulated/0/DCIM/Camera/IMG_20220512_080057.jpg|image/jpeg|4608|2592|0|5212290||1652335258|1652335258927|1652335257149|0|0|0|||||||| +2007|46971|content://media/external/images/media/46971|/storage/emulated/0/DCIM/Camera/IMG_20220512_080037.jpg|image/jpeg|2592|4608|0|4851262||1652335241|1652335241291|1652335237792|0|0|0|||||||| +2008|46969|content://media/external/images/media/46969|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-12-07-47-16-660_com.google.android.gm.jpg|image/jpeg|1080|2400|0|404863||1652334437|1652334437125|0|0|0|0|||||||| +2009|46942|content://media/external/images/media/46942|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220511-WA0014.jpg|image/jpeg|634|960|0|54712||1652290946|1652290946669|0|0|0|0|||||||| +2010|46876|content://media/external/images/media/46876|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-10-21-15-31-002_com.google.android.googlequicksearchbox.jpg|image/jpeg|1080|2400|0|552581||1652210131|1652210131455|0|0|0|0|||||||| +2011|46874|content://media/external/images/media/46874|/storage/emulated/0/DCIM/Camera/IMG_20220510_195756.jpg|image/jpeg|2592|4608|0|4708990||1652205483|1652205483901|1652205476417|0|0|0|||||||| +2012|46732|content://media/external/images/media/46732|/storage/emulated/0/DCIM/Camera/IMG_20220508_145721.jpg|image/jpeg|2592|4608|0|5081700||1652014643|1652014643734|1652014641558|0|0|0|||||||| +2013|45848|content://media/external/images/media/45848|/storage/emulated/0/Download/MiShare/1651841771728.jpg|image/jpeg|4624|3472|0|10751726||1651841782|1651841783334|1651841556000|0|0|0|||||||| +2014|45839|content://media/external/images/media/45839|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220506-WA0023.jpg|image/jpeg|1599|1187|0|132311||1651838594|1651838595268|0|0|0|0|||||||| +2015|45598|content://media/external/images/media/45598|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220505-WA0018.jpg|image/jpeg|921|2048|0|125657||1651748441|1651751348395|0|0|0|0|||||||| +2016|45298|content://media/external/images/media/45298|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0047.jpg|image/jpeg|1536|2048|0|444669||1651613464|1651613465444|0|0|0|0|||||||| +2017|45292|content://media/external/images/media/45292|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0045.jpg|image/jpeg|1536|2048|0|321000||1651613463|1651613464144|0|0|0|0|||||||| +2018|45295|content://media/external/images/media/45295|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0046.jpg|image/jpeg|1200|1600|0|283681||1651613464|1651613464707|0|0|0|0|||||||| +2019|45289|content://media/external/images/media/45289|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0044.jpg|image/jpeg|1200|1600|0|124166||1651613462|1651613463065|0|0|0|0|||||||| +2020|45286|content://media/external/images/media/45286|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0043.jpg|image/jpeg|1536|2048|0|368662||1651613461|1651613462375|0|0|0|0|||||||| +2021|45283|content://media/external/images/media/45283|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0042.jpg|image/jpeg|1152|2048|0|245692||1651613459|1651613461185|0|0|0|0|||||||| +2022|45262|content://media/external/images/media/45262|/storage/emulated/0/DCIM/Screenshots/IMG_20220503_175820.jpg|image/jpeg|937|1396|0|332820||1651593500|1651593500648|0|0|0|0|||||||| +2023|45114|content://media/external/images/media/45114|/storage/emulated/0/DCIM/Creative/IMG_20220503_102929.jpg|image/jpeg|874|1943|0|279496||1651566569|1651566569734|0|0|0|0|||||||| +2024|44806|content://media/external/images/media/44806|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220501-WA0030.jpg|image/jpeg|1532|2048|0|231247||1651413099|1651413100716|0|0|0|0|||||||| +2025|44800|content://media/external/images/media/44800|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220501-WA0028.jpg|image/jpeg|1532|2048|0|237176||1651413098|1651413099326|0|0|0|0|||||||| +2026|44803|content://media/external/images/media/44803|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220501-WA0029.jpg|image/jpeg|1532|2048|0|249891||1651413099|1651413099959|0|0|0|0|||||||| +2027|44365|content://media/external/images/media/44365|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0044.jpg|image/jpeg|1532|2048|0|215743||1651176767|1651176768395|0|0|0|0|||||||| +2028|44368|content://media/external/images/media/44368|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0045.jpg|image/jpeg|1532|2048|0|248536||1651176768|1651176768805|0|0|0|0|||||||| +2029|44359|content://media/external/images/media/44359|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0042.jpg|image/jpeg|1532|2048|0|217712||1651176766|1651176767401|0|0|0|0|||||||| +2030|44362|content://media/external/images/media/44362|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0043.jpg|image/jpeg|1532|2048|0|217822||1651176767|1651176767921|0|0|0|0|||||||| +2031|44353|content://media/external/images/media/44353|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0040.jpg|image/jpeg|1532|2048|0|264469||1651176765|1651176766527|0|0|0|0|||||||| +2032|44356|content://media/external/images/media/44356|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0041.jpg|image/jpeg|1532|2048|0|207762||1651176766|1651176766988|0|0|0|0|||||||| +2033|44350|content://media/external/images/media/44350|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0039.jpg|image/jpeg|1532|2048|0|229718||1651176764|1651176765828|0|0|0|0|||||||| +2034|44342|content://media/external/images/media/44342|/storage/emulated/0/DCIM/Camera/IMG_20220428_204500.jpg|image/jpeg|2592|4608|0|4967592||1651171503|1651171503988|1651171500410|0|0|0|||||||| +2035|44125|content://media/external/images/media/44125|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-26-13-55-25-149_com.whatsapp.jpg|image/jpeg|1080|2400|0|922495||1650974125|1650974125510|0|0|0|0|||||||| +2036|44080|content://media/external/images/media/44080|/storage/emulated/0/DCIM/Certificazione verde COVID-19.png|image/png|948|2507|0|423885||1650886394|1650886394686|0|0|0|0|||||||| +2037|43992|content://media/external/images/media/43992|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-24-14-05-30-791_com.google.android.apps.docs.jpg|image/jpeg|2400|1080|0|380657||1650801931|1650801931095|0|0|0|0|||||||| +2038|43986|content://media/external/images/media/43986|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220424-WA0007.jpg|image/jpeg|1200|1600|0|124458||1650801042|1650801048530|0|0|0|0|||||||| +2039|43972|content://media/external/images/media/43972|/storage/emulated/0/DCIM/PhotoScan/IMG_20220424_131312.jpg|image/jpeg|765|1086|0|231277||1650798793|1650798793086|0|0|0|0|||||||| +2040|43967|content://media/external/images/media/43967|/storage/emulated/0/DCIM/PhotoScan/IMG_20220424_131235.jpg|image/jpeg|1333|1091|0|376316||1650798755|1650798755574|0|0|0|0|||||||| +2041|43858|content://media/external/images/media/43858|/storage/emulated/0/DCIM/Camera/IMG_20220421_112818.jpg|image/jpeg|3229|455|0|450605||1650533298|1650533298750|1650533149158|0|0|0|||||||| +2042|43834|content://media/external/images/media/43834|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220421-WA0000.jpg|image/jpeg|2048|1536|0|461199||1650496248|1650496249092|0|0|0|0|||||||| +2043|43828|content://media/external/images/media/43828|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220420-WA0000.jpg|image/jpeg|700|700|0|49341||1650473182|1650473182815|0|0|0|0|||||||| +2044|43810|content://media/external/images/media/43810|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220419-WA0008.jpg|image/jpeg|1080|469|0|39839||1650382710|1650382710643|0|0|0|0|||||||| +2045|43789|content://media/external/images/media/43789|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220419-WA0001.jpg|image/jpeg|900|1600|0|77021||1650368896|1650368897822|0|0|0|0|||||||| +2046|43786|content://media/external/images/media/43786|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220419-WA0000.jpg|image/jpeg|900|1600|0|119602||1650353009|1650353044975|0|0|0|0|||||||| +2047|43776|content://media/external/images/media/43776|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0007.jpg|image/jpeg|921|2048|0|118190||1650312413|1650312413745|0|0|0|0|||||||| +2048|43774|content://media/external/images/media/43774|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0006.jpg|image/jpeg|1080|720|0|93903||1650312401|1650312401373|0|0|0|0|||||||| +2049|43771|content://media/external/images/media/43771|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0005.jpg|image/jpeg|921|2048|0|111696||1650312384|1650312385228|0|0|0|0|||||||| +2050|43768|content://media/external/images/media/43768|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220418-WA0004.jpg|image/jpeg|921|2048|0|144659||1650310614|1650310615807|0|0|0|0|||||||| +2051|43759|content://media/external/images/media/43759|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0002.jpg|image/jpeg|921|2048|0|117212||1650281736|1650281739343|0|0|0|0|||||||| +2052|43756|content://media/external/images/media/43756|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0001.jpg|image/jpeg|1416|1062|0|124493||1650278678|1650278679556|0|0|0|0|||||||| +2053|43737|content://media/external/images/media/43737|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0054.jpg|image/jpeg|1080|744|0|69567||1650207304|1650207305463|0|0|0|0|||||||| +2054|43731|content://media/external/images/media/43731|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0052.jpg|image/jpeg|490|866|0|48725||1650202255|1650202256330|0|0|0|0|||||||| +2055|43726|content://media/external/images/media/43726|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0050.jpg|image/jpeg|2048|1568|0|292882||1650197139|1650197140684|0|0|0|0|||||||| +2056|43723|content://media/external/images/media/43723|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0049.jpg|image/jpeg|1600|1200|0|215783||1650196045|1650196049763|0|0|0|0|||||||| +2057|43710|content://media/external/images/media/43710|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0045.jpg|image/jpeg|1532|2048|0|232612||1650193943|1650193944701|0|0|0|0|||||||| +2058|43707|content://media/external/images/media/43707|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0044.jpg|image/jpeg|1600|1200|0|264064||1650193698|1650193699155|0|0|0|0|||||||| +2059|43696|content://media/external/images/media/43696|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0041.jpg|image/jpeg|1200|1600|0|195745||1650193463|1650193464097|0|0|0|0|||||||| +2060|43699|content://media/external/images/media/43699|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0042.jpg|image/jpeg|1200|1600|0|275496||1650193464|1650193464517|0|0|0|0|||||||| +2061|43693|content://media/external/images/media/43693|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0040.jpg|image/jpeg|1200|1600|0|278324||1650193462|1650193463634|0|0|0|0|||||||| +2062|43690|content://media/external/images/media/43690|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0039.jpg|image/jpeg|1600|1200|0|275035||1650193462|1650193462942|0|0|0|0|||||||| +2063|43681|content://media/external/images/media/43681|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0036.jpg|image/jpeg|289|460|0|26681||1650191873|1650191874380|0|0|0|0|||||||| +2064|43675|content://media/external/images/media/43675|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0034.jpg|image/jpeg|1024|1015|0|93106||1650188254|1650188254573|0|0|0|0|||||||| +2065|43672|content://media/external/images/media/43672|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0033.jpg|image/jpeg|720|479|0|72228||1650187611|1650187612213|0|0|0|0|||||||| +2066|43669|content://media/external/images/media/43669|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0032.jpg|image/jpeg|612|488|0|13856||1650187571|1650187579713|0|0|0|0|||||||| +2067|43666|content://media/external/images/media/43666|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0031.jpg|image/jpeg|1600|1200|0|392720||1650185882|1650185887659|0|0|0|0|||||||| +2068|43661|content://media/external/images/media/43661|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0029.jpg|image/jpeg|1061|1212|0|149942||1650185403|1650185403655|0|0|0|0|||||||| +2069|43655|content://media/external/images/media/43655|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0027.jpg|image/jpeg|1200|1600|0|88855||1650185312|1650185312400|0|0|0|0|||||||| +2070|43658|content://media/external/images/media/43658|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0028.jpg|image/jpeg|1187|1599|0|99050||1650185312|1650185312650|0|0|0|0|||||||| +2071|43653|content://media/external/images/media/43653|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0026.jpg|image/jpeg|720|905|0|75255||1650185284|1650185284726|0|0|0|0|||||||| +2072|43650|content://media/external/images/media/43650|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0025.jpg|image/jpeg|225|224|0|14585||1650184970|1650184970717|0|0|0|0|||||||| +2073|43647|content://media/external/images/media/43647|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0024.jpg|image/jpeg|1134|1400|0|206338||1650184874|1650184876368|0|0|0|0|||||||| +2074|43644|content://media/external/images/media/43644|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0023.jpg|image/jpeg|998|1389|0|91899||1650184485|1650184494356|0|0|0|0|||||||| +2075|43630|content://media/external/images/media/43630|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0017.jpg|image/jpeg|200|250|0|15223||1650181406|1650181407350|0|0|0|0|||||||| +2076|43627|content://media/external/images/media/43627|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0016.jpg|image/jpeg|592|443|0|43747||1650181335|1650181335400|0|0|0|0|||||||| +2077|43625|content://media/external/images/media/43625|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0015.jpg|image/jpeg|696|464|0|90464||1650180865|1650180865221|0|0|0|0|||||||| +2078|43621|content://media/external/images/media/43621|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0013.jpg|image/jpeg|720|881|0|219159||1650180442|1650180443033|0|0|0|0|||||||| +2079|43614|content://media/external/images/media/43614|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0011.jpg|image/jpeg|900|1600|0|414927||1650179736|1650179751576|0|0|0|0|||||||| +2080|43611|content://media/external/images/media/43611|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0010.jpg|image/jpeg|1080|1068|0|162167||1650179522|1650179527961|0|0|0|0|||||||| +2081|43608|content://media/external/images/media/43608|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0009.jpg|image/jpeg|1078|814|0|108955||1650179436|1650179440802|0|0|0|0|||||||| +2082|43605|content://media/external/images/media/43605|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0008.jpg|image/jpeg|720|540|0|45340||1650178782|1650178783087|0|0|0|0|||||||| +2083|43603|content://media/external/images/media/43603|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0007.jpg|image/jpeg|450|630|0|42171||1650178544|1650178554698|0|0|0|0|||||||| +2084|43593|content://media/external/images/media/43593|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0003.jpg|image/jpeg|266|188|0|8774||1650176684|1650176685451|0|0|0|0|||||||| +2085|43590|content://media/external/images/media/43590|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0002.jpg|image/jpeg|750|1082|0|98671||1650176579|1650176580475|0|0|0|0|||||||| +2086|43588|content://media/external/images/media/43588|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0001.jpg|image/jpeg|300|168|0|16752||1650176522|1650176522169|0|0|0|0|||||||| +2087|43570|content://media/external/images/media/43570|/storage/emulated/0/DCIM/Camera/IMG_20220416_183958.jpg|image/jpeg|4608|2592|0|5261469||1650127211|1650127211973|1650127198300|0|0|0|||||||| +2088|43569|content://media/external/images/media/43569|/storage/emulated/0/Pictures/Telegram/IMG_20220416_181451_197.jpg|image/jpeg|1280|960|0|252214||1650125690|1650125690875|0|0|0|0|||||||| +2089|43568|content://media/external/images/media/43568|/storage/emulated/0/Pictures/Telegram/IMG_20220416_181445_996.jpg|image/jpeg|960|1280|0|296101||1650125685|1650125685799|0|0|0|0|||||||| +2090|43567|content://media/external/images/media/43567|/storage/emulated/0/Pictures/Telegram/IMG_20220416_181442_321.jpg|image/jpeg|1280|960|0|252040||1650125681|1650125681939|0|0|0|0|||||||| +2091|43566|content://media/external/images/media/43566|/storage/emulated/0/Pictures/Telegram/IMG_20220416_181439_852.jpg|image/jpeg|960|1280|0|226602||1650125679|1650125679175|0|0|0|0|||||||| +2092|43550|content://media/external/images/media/43550|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220416-WA0002.jpg|image/jpeg|1200|1600|0|625792||1650119451|1650119569016|0|0|0|0|||||||| +2093|43548|content://media/external/images/media/43548|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220416-WA0001.jpg|image/jpeg|1600|1200|0|136820||1650114370|1650119490871|0|0|0|0|||||||| +2094|43545|content://media/external/images/media/43545|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220416-WA0000.jpg|image/jpeg|921|2048|0|172995||1650107026|1650107027427|0|0|0|0|||||||| +2095|43530|content://media/external/images/media/43530|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0011.jpg|image/jpeg|896|2000|0|214843||1650045040|1650045041478|0|0|0|0|||||||| +2096|37532|content://media/external/images/media/37532|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0009.jpg|image/jpeg|2048|2048|0|362960||1650037223|1650037224202|0|0|0|0|||||||| +2097|37518|content://media/external/images/media/37518|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0007.jpg|image/jpeg|600|639|0|50201||1650025308|1650025308468|0|0|0|0|||||||| +2098|37512|content://media/external/images/media/37512|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0006.jpg|image/jpeg|1532|2048|0|198644||1650016901|1650016905214|0|0|0|0|||||||| +2099|37510|content://media/external/images/media/37510|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-15-09-34-57-599_com.instagram.android.jpg|image/jpeg|1080|2400|0|971947||1650008097|1650008097744|0|0|0|0|||||||| +2100|37508|content://media/external/images/media/37508|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-15-08-13-19-821_com.google.android.gm.jpg|image/jpeg|1080|2400|0|412628||1650003200|1650003200127|0|0|0|0|||||||| +2101|37506|content://media/external/images/media/37506|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-15-08-11-43-214_com.google.android.gm.jpg|image/jpeg|1080|2400|0|388803||1650003103|1650003103603|0|0|0|0|||||||| +2102|37500|content://media/external/images/media/37500|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-15-08-06-35-522_com.instagram.android.jpg|image/jpeg|1080|2400|0|1057211||1650002795|1650002795703|0|0|0|0|||||||| +2103|37498|content://media/external/images/media/37498|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0000.jpg|image/jpeg|1080|655|0|382817||1650002316|1650002317202|0|0|0|0|||||||| +2104|37481|content://media/external/images/media/37481|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0017.jpg|image/jpeg|1532|2048|0|233239||1649946888|1649946889108|0|0|0|0|||||||| +2105|37484|content://media/external/images/media/37484|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0018.jpg|image/jpeg|1532|2048|0|432979||1649946889|1649946889520|0|0|0|0|||||||| +2106|37475|content://media/external/images/media/37475|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0015.jpg|image/jpeg|1512|2016|0|369122||1649943665|1649943666136|0|0|0|0|||||||| +2107|37472|content://media/external/images/media/37472|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0014.jpg|image/jpeg|1512|2016|0|287506||1649943664|1649943665439|0|0|0|0|||||||| +2108|37466|content://media/external/images/media/37466|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0012.jpg|image/jpeg|1512|2016|0|365111||1649943663|1649943664177|0|0|0|0|||||||| +2109|37469|content://media/external/images/media/37469|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0013.jpg|image/jpeg|1512|2016|0|300439||1649943664|1649943664795|0|0|0|0|||||||| +2110|37460|content://media/external/images/media/37460|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0010.jpg|image/jpeg|2016|1512|0|572735||1649943662|1649943663100|0|0|0|0|||||||| +2111|37463|content://media/external/images/media/37463|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0011.jpg|image/jpeg|2016|1512|0|170058||1649943663|1649943663501|0|0|0|0|||||||| +2112|37457|content://media/external/images/media/37457|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0009.jpg|image/jpeg|1512|2016|0|403211||1649943661|1649943662597|0|0|0|0|||||||| +2113|37454|content://media/external/images/media/37454|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0008.jpg|image/jpeg|1512|2016|0|297171||1649943660|1649943661858|0|0|0|0|||||||| +2114|37418|content://media/external/images/media/37418|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220413-WA0008.jpg|image/jpeg|1200|1600|0|126701||1649874008|1649874010236|0|0|0|0|||||||| +2115|37375|content://media/external/images/media/37375|/storage/emulated/0/Download/maxresdefault.jpg|image/jpeg|1280|720|0|135761||1649775713|1649775713011|0|0|0|0|||||||| +2116|37319|content://media/external/images/media/37319|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220411-WA0033.jpg|image/jpeg|921|2048|0|139359||1649700058|1649700060235|0|0|0|0|||||||| +2117|37307|content://media/external/images/media/37307|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220411-WA0029.jpg|image/jpeg|921|2048|0|104999||1649697324|1649697325525|0|0|0|0|||||||| +2118|37076|content://media/external/images/media/37076|/storage/emulated/0/DCIM/Camera/IMG_20220409_134126.jpg|image/jpeg|3200|1800|0|2540357||1649504489|1649504490219|1649504486965|0|0|0|||||||| +2119|37065|content://media/external/images/media/37065|/storage/emulated/0/DCIM/Camera/IMG_20220409_131236.jpg|image/jpeg|3200|1800|0|2893029||1649502759|1649502759998|1649502756734|0|0|0|||||||| +2120|37063|content://media/external/images/media/37063|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220409-WA0002.jpeg|image/jpeg|3840|2160|0|2639071||1649501186|1649501186437|1649501186339|0|0|0|||||||| +2121|37006|content://media/external/images/media/37006|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220407-WA0006.jpg|image/jpeg|870|1024|0|66173||1649332278|1649332278857|0|0|0|0|||||||| +2122|36990|content://media/external/images/media/36990|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220407-WA0001.jpg|image/jpeg|2048|1536|0|381538||1649310554|1649310555506|0|0|0|0|||||||| +2123|36987|content://media/external/images/media/36987|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220407-WA0000.jpg|image/jpeg|2048|1536|0|434324||1649310553|1649310554700|0|0|0|0|||||||| +2124|36897|content://media/external/images/media/36897|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220403-WA0004.jpg|image/jpeg|1536|2048|0|532400||1648987549|1648987561122|0|0|0|0|||||||| +2125|36805|content://media/external/images/media/36805|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220401-WA0020.jpeg|image/jpeg|3840|2160|0|2197823||1648825396|1648825396114|1648825396021|0|0|0|||||||| +2126|36802|content://media/external/images/media/36802|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-01-16-59-22-124_com.brytonsport.active.jpg|image/jpeg|1080|2400|0|453046||1648825162|1648825162394|0|0|0|0|||||||| +2127|36801|content://media/external/images/media/36801|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-01-16-59-08-036_com.brytonsport.active.jpg|image/jpeg|1080|2400|0|460853||1648825148|1648825148394|0|0|0|0|||||||| +2128|36798|content://media/external/images/media/36798|/storage/emulated/0/DCIM/Camera/IMG_20220401_155820.jpg|image/jpeg|4608|2592|0|3599677||1648821504|1648821504962|1648821500222|0|0|0|||||||| +2129|36795|content://media/external/images/media/36795|/storage/emulated/0/DCIM/Camera/IMG_20220401_154130.jpg|image/jpeg|4608|2592|0|6789485||1648820495|1648820495206|1648820490162|0|0|0|||||||| +2130|36792|content://media/external/images/media/36792|/storage/emulated/0/DCIM/Camera/IMG_20220401_152248.jpg|image/jpeg|4608|2592|0|9245028||1648819373|1648819373574|1648819368340|0|0|0|||||||| +2131|36789|content://media/external/images/media/36789|/storage/emulated/0/DCIM/Camera/IMG_20220401_151934.jpg|image/jpeg|3200|1800|0|3029166||1648819179|1648819179506|1648819174623|0|0|0|||||||| +2132|36786|content://media/external/images/media/36786|/storage/emulated/0/DCIM/Camera/IMG_20220401_151155.jpg|image/jpeg|4608|2592|0|6251759||1648818718|1648818718182|1648818716750|0|0|0|||||||| +2133|36776|content://media/external/images/media/36776|/storage/emulated/0/DCIM/Camera/IMG_20220401_135236.jpg|image/jpeg|4608|2592|0|4956838||1648813959|1648813959390|1648813956298|0|0|0|||||||| +2134|36773|content://media/external/images/media/36773|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220401-WA0008.jpeg|image/jpeg|3840|2160|90|1077125||1648813267|1648813268014|1648813267934|0|0|0|||||||| +2135|36770|content://media/external/images/media/36770|/storage/emulated/0/DCIM/Camera/IMG_20220401_133510.jpg|image/jpeg|4608|2592|0|4535622||1648812915|1648812916094|1648812911189|0|0|0|||||||| +2136|36767|content://media/external/images/media/36767|/storage/emulated/0/DCIM/Camera/IMG_20220401_123807.jpg|image/jpeg|4608|2592|0|4269087||1648809492|1648809492302|1648809487292|0|0|0|||||||| +2137|36764|content://media/external/images/media/36764|/storage/emulated/0/DCIM/Camera/IMG_20220401_115917.jpg|image/jpeg|3200|1800|0|2213434||1648807164|1648807164114|1648807157882|0|0|0|||||||| +2138|36758|content://media/external/images/media/36758|/storage/emulated/0/DCIM/Camera/IMG_20220401_110025.jpg|image/jpeg|5120|2880|0|4285225||1648803628|1648803628250|1648803625522|0|0|0|||||||| +2139|36752|content://media/external/images/media/36752|/storage/emulated/0/DCIM/Camera/IMG_20220401_103804.jpg|image/jpeg|3200|1800|0|2479857||1648802290|1648802290990|1648802284822|0|0|0|||||||| +2140|36749|content://media/external/images/media/36749|/storage/emulated/0/DCIM/Camera/IMG_20220401_100545.jpg|image/jpeg|3200|1800|0|2614847||1648800352|1648800352154|1648800346966|0|0|0|||||||| +2141|36529|content://media/external/images/media/36529|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-03-26-19-25-46-048_com.strava.jpg|image/jpeg|1080|2400|0|648921||1648319146|1648319146190|0|0|0|0|||||||| +2142|36514|content://media/external/images/media/36514|/storage/emulated/0/DCIM/Camera/IMG_20220326_123602.jpg|image/jpeg|4608|2592|0|4193057||1648294564|1648294564114|1648294562699|0|0|0|||||||| +2143|36512|content://media/external/images/media/36512|/storage/emulated/0/DCIM/Camera/IMG_20220326_123541.jpg|image/jpeg|4608|2592|0|3951755||1648294542|1648294542646|1648294541209|0|0|0|||||||| +2144|36510|content://media/external/images/media/36510|/storage/emulated/0/DCIM/Camera/IMG_20220326_123536.jpg|image/jpeg|4608|2592|0|3994389||1648294538|1648294538398|1648294536842|0|0|0|||||||| +2145|36508|content://media/external/images/media/36508|/storage/emulated/0/DCIM/Camera/IMG_20220326_123532.jpg|image/jpeg|4608|2592|0|3700818||1648294534|1648294534658|1648294532565|0|0|0|||||||| +2146|36506|content://media/external/images/media/36506|/storage/emulated/0/DCIM/Camera/IMG_20220326_123528.jpg|image/jpeg|4608|2592|0|3754046||1648294532|1648294532294|1648294529490|0|0|0|||||||| +2147|36474|content://media/external/images/media/36474|/storage/emulated/0/DCIM/Camera/IMG_20220325_231026.jpg|image/jpeg|4608|2592|0|4208483||1648246228|1648246228686|1648246226610|0|0|0|||||||| +2148|36472|content://media/external/images/media/36472|/storage/emulated/0/DCIM/Camera/IMG_20220325_231021.jpg|image/jpeg|4608|2592|0|4067058||1648246225|1648246225370|1648246221942|0|0|0|||||||| +2149|36470|content://media/external/images/media/36470|/storage/emulated/0/DCIM/Camera/IMG_20220325_211126.jpg|image/jpeg|4608|2592|0|3756237||1648239088|1648239088322|1648239086830|0|0|0|||||||| +2150|36468|content://media/external/images/media/36468|/storage/emulated/0/DCIM/Camera/IMG_20220325_211122.jpg|image/jpeg|4608|2592|0|4273626||1648239085|1648239085434|1648239082635|0|0|0|||||||| +2151|36461|content://media/external/images/media/36461|/storage/emulated/0/DCIM/Camera/IMG_20220325_170441.jpg|image/jpeg|4608|2592|0|4255688||1648224285|1648224285518|1648224283643|0|0|0|||||||| +2152|36459|content://media/external/images/media/36459|/storage/emulated/0/DCIM/Camera/IMG_20220325_170437.jpg|image/jpeg|4608|2592|0|4756792||1648224281|1648224281726|1648224278909|0|0|0|||||||| +2153|36260|content://media/external/images/media/36260|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-03-20-19-26-21-628_com.brytonsport.active.jpg|image/jpeg|1080|2400|0|412334||1647800781|1647800781731|0|0|0|0|||||||| +2154|36259|content://media/external/images/media/36259|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-03-20-19-26-06-837_com.brytonsport.active.jpg|image/jpeg|1080|2400|0|541851||1647800767|1647800767123|0|0|0|0|||||||| +2155|36244|content://media/external/images/media/36244|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220320-WA0009.jpg|image/jpeg|1200|1600|0|219298||1647789979|1647789980204|0|0|0|0|||||||| +2156|36203|content://media/external/images/media/36203|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220319-WA0010.jpg|image/jpeg|2048|1532|0|221047||1647716756|1647716757151|0|0|0|0|||||||| +2157|36200|content://media/external/images/media/36200|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220319-WA0009.jpg|image/jpeg|2048|1532|0|251040||1647716752|1647716753775|0|0|0|0|||||||| +2158|36198|content://media/external/images/media/36198|/storage/emulated/0/DCIM/Camera/IMG_20220319_191600.jpg|image/jpeg|3200|1800|0|1914414||1647713763|1647713763200|1647713760549|0|0|0|||||||| +2159|36177|content://media/external/images/media/36177|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220319-WA0002.jpg|image/jpeg|2048|1532|0|326969||1647688846|1647688847457|0|0|0|0|||||||| +2160|36029|content://media/external/images/media/36029|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0009.jpg|image/jpeg|1536|2048|0|344326||1647472368|1647472369189|0|0|0|0|||||||| +2161|36023|content://media/external/images/media/36023|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0007.jpg|image/jpeg|2048|1536|0|460448||1647472367|1647472368311|0|0|0|0|||||||| +2162|36026|content://media/external/images/media/36026|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0008.jpg|image/jpeg|1536|2048|0|412597||1647472368|1647472368791|0|0|0|0|||||||| +2163|36017|content://media/external/images/media/36017|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0005.jpg|image/jpeg|2048|1536|0|413455||1647472366|1647472367313|0|0|0|0|||||||| +2164|36020|content://media/external/images/media/36020|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0006.jpg|image/jpeg|2048|1536|0|465153||1647472367|1647472367706|0|0|0|0|||||||| +2165|36011|content://media/external/images/media/36011|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0003.jpg|image/jpeg|2048|1536|0|394657||1647472365|1647472366334|0|0|0|0|||||||| +2166|36014|content://media/external/images/media/36014|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0004.jpg|image/jpeg|1536|2048|0|409071||1647472366|1647472366994|0|0|0|0|||||||| +2167|36005|content://media/external/images/media/36005|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0001.jpg|image/jpeg|2048|1536|0|454208||1647472364|1647472365109|0|0|0|0|||||||| +2168|36008|content://media/external/images/media/36008|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0002.jpg|image/jpeg|2048|1536|0|342868||1647472365|1647472365775|0|0|0|0|||||||| +2169|36002|content://media/external/images/media/36002|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0000.jpg|image/jpeg|2048|1536|0|378262||1647472361|1647472364230|0|0|0|0|||||||| +2170|35858|content://media/external/images/media/35858|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220314-WA0004.jpg|image/jpeg|899|1599|0|97375||1647243306|1647248790133|0|0|0|0|||||||| +2171|35854|content://media/external/images/media/35854|/storage/emulated/0/DCIM/Camera/IMG_20220314_075018.jpg|image/jpeg|2592|4608|0|5561975||1647240620|1647240620822|1647240618255|0|0|0|||||||| +2172|35852|content://media/external/images/media/35852|/storage/emulated/0/DCIM/Camera/IMG_20220314_075004.jpg|image/jpeg|2592|4608|0|4789090||1647240608|1647240608574|1647240604998|0|0|0|||||||| +2173|35332|content://media/external/images/media/35332|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0008.jpg|image/jpeg|1600|1200|0|144446||1646578185|1646578186527|0|0|0|0|||||||| +2174|35335|content://media/external/images/media/35335|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0009.jpg|image/jpeg|1600|1200|0|146664||1646578186|1646578186957|0|0|0|0|||||||| +2175|35326|content://media/external/images/media/35326|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0006.jpg|image/jpeg|1600|1200|0|145332||1646578184|1646578185306|0|0|0|0|||||||| +2176|35329|content://media/external/images/media/35329|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0007.jpg|image/jpeg|1600|1200|0|143787||1646578185|1646578185904|0|0|0|0|||||||| +2177|35323|content://media/external/images/media/35323|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0005.jpg|image/jpeg|899|1599|0|184393||1646574126|1646574127021|0|0|0|0|||||||| +2178|35320|content://media/external/images/media/35320|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0004.jpg|image/jpeg|899|1599|0|106311||1646574125|1646574126004|0|0|0|0|||||||| +2179|35309|content://media/external/images/media/35309|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0001.jpg|image/jpeg|1200|1600|0|139728||1646572528|1646573497107|0|0|0|0|||||||| +2180|35312|content://media/external/images/media/35312|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0002.jpg|image/jpeg|738|1600|0|143838||1646572802|1646573449451|0|0|0|0|||||||| +2181|35315|content://media/external/images/media/35315|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0003.jpg|image/jpeg|899|1599|0|110241||1646572838|1646572844231|0|0|0|0|||||||| +2182|35306|content://media/external/images/media/35306|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0000.jpg|image/jpeg|1536|2048|0|381277||1646568187|1646568189182|0|0|0|0|||||||| +2183|35293|content://media/external/images/media/35293|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220305-WA0006.jpg|image/jpeg|1532|2048|0|280215||1646507842|1646507843525|0|0|0|0|||||||| +2184|35283|content://media/external/images/media/35283|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220305-WA0003.jpg|image/jpeg|1532|2048|0|205843||1646482966|1646482967363|0|0|0|0|||||||| +2185|35078|content://media/external/images/media/35078|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0013.jpg|image/jpeg|1599|899|0|106611||1646287844|1646287844987|0|0|0|0|||||||| +2186|35074|content://media/external/images/media/35074|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0012.jpg|image/jpeg|2048|1536|0|308073||1646263448|1646263449772|0|0|0|0|||||||| +2187|35071|content://media/external/images/media/35071|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0011.jpg|image/jpeg|2048|1536|0|309758||1646263447|1646263448959|0|0|0|0|||||||| +2188|35068|content://media/external/images/media/35068|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0010.jpg|image/jpeg|1536|2048|0|272891||1646263446|1646263447772|0|0|0|0|||||||| +2189|35065|content://media/external/images/media/35065|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0009.jpg|image/jpeg|2048|1536|0|435631||1646263445|1646263446878|0|0|0|0|||||||| +2190|35062|content://media/external/images/media/35062|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0008.jpg|image/jpeg|2048|1536|0|262799||1646263444|1646263445805|0|0|0|0|||||||| +2191|35056|content://media/external/images/media/35056|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0006.jpg|image/jpeg|2048|1536|0|384053||1646263443|1646263444178|0|0|0|0|||||||| +2192|35059|content://media/external/images/media/35059|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0007.jpg|image/jpeg|2048|1536|0|272540||1646263444|1646263444978|0|0|0|0|||||||| +2193|35053|content://media/external/images/media/35053|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0005.jpg|image/jpeg|2048|1536|0|314726||1646263442|1646263443244|0|0|0|0|||||||| +2194|35050|content://media/external/images/media/35050|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0004.jpg|image/jpeg|1536|2048|0|292492||1646263441|1646263442091|0|0|0|0|||||||| +2195|35047|content://media/external/images/media/35047|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0003.jpg|image/jpeg|2048|1536|0|328616||1646263440|1646263441209|0|0|0|0|||||||| +2196|35044|content://media/external/images/media/35044|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0002.jpg|image/jpeg|1536|2048|0|259912||1646263439|1646263440270|0|0|0|0|||||||| +2197|35041|content://media/external/images/media/35041|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0001.jpg|image/jpeg|2048|1394|0|357570||1646263438|1646263439344|0|0|0|0|||||||| +2198|35038|content://media/external/images/media/35038|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0000.jpg|image/jpeg|2048|1536|0|456394||1646263436|1646263438423|0|0|0|0|||||||| +2199|35035|content://media/external/images/media/35035|/storage/emulated/0/DCIM/Camera/IMG_20220302_233621.jpg|image/jpeg|4608|2592|0|4072844||1646260585|1646260585240|1646260581979|0|0|0|||||||| +2200|35033|content://media/external/images/media/35033|/storage/emulated/0/DCIM/Camera/IMG_20220302_233557.jpg|image/jpeg|4608|2592|0|4589797||1646260561|1646260561932|1646260557236|0|0|0|||||||| +2201|34925|content://media/external/images/media/34925|/storage/emulated/0/DCIM/Camera/IMG_20220228_171116.jpg|image/jpeg|4608|2592|0|5598854||1646064681|1646064681765|1646064676829|0|0|0|||||||| +2202|34761|content://media/external/images/media/34761|/storage/emulated/0/DCIM/Camera/IMG_20220224_140401.jpg|image/jpeg|4608|2592|0|4539108||1645707844|1645707844467|1645707841998|0|0|0|||||||| +2203|34759|content://media/external/images/media/34759|/storage/emulated/0/DCIM/Camera/IMG_20220224_140223.jpg|image/jpeg|2592|4608|0|4381862||1645707745|1645707745054|1645707743304|0|0|0|||||||| +2204|34757|content://media/external/images/media/34757|/storage/emulated/0/DCIM/Camera/IMG_20220224_140220.jpg|image/jpeg|2592|4608|0|4443193||1645707742|1645707742774|1645707740935|0|0|0|||||||| +2205|34755|content://media/external/images/media/34755|/storage/emulated/0/DCIM/Camera/IMG_20220224_140212.jpg|image/jpeg|4608|2592|0|4097973||1645707735|1645707735586|1645707732892|0|0|0|||||||| +2206|34753|content://media/external/images/media/34753|/storage/emulated/0/DCIM/Camera/IMG_20220224_133735.jpg|image/jpeg|4608|2592|0|3690649||1645706257|1645706257778|1645706256213|0|0|0|||||||| +2207|34751|content://media/external/images/media/34751|/storage/emulated/0/DCIM/Camera/IMG_20220224_133732.jpg|image/jpeg|4608|2592|0|4794275||1645706255|1645706255750|1645706253174|0|0|0|||||||| +2208|34749|content://media/external/images/media/34749|/storage/emulated/0/DCIM/Camera/IMG_20220224_131700.jpg|image/jpeg|3200|1800|0|1795114||1645705021|1645705021801|1645705020913|0|0|0|||||||| +2209|34747|content://media/external/images/media/34747|/storage/emulated/0/DCIM/Camera/IMG_20220224_131656.jpg|image/jpeg|3200|1800|0|1876064||1645705019|1645705019457|1645705017321|0|0|0|||||||| +2210|34746|content://media/external/images/media/34746|/storage/emulated/0/DCIM/Camera/PANO_20220224_131618.jpg|image/jpeg|9168|4352|0|22879655||1645704984|1645704984213|0|0|0|0|||||||| +2211|34739|content://media/external/images/media/34739|/storage/emulated/0/DCIM/Camera/IMG_20220224_131127.jpg|image/jpeg|4608|2592|0|4791719||1645704690|1645704690393|1645704687296|0|0|0|||||||| +2212|34696|content://media/external/images/media/34696|/storage/emulated/0/DCIM/Camera/PANO_20220223_124059.jpg|image/jpeg|9808|4256|0|31160356||1645616466|1645616466036|0|0|0|0|||||||| +2213|34694|content://media/external/images/media/34694|/storage/emulated/0/DCIM/Camera/PANO_20220223_124029.jpg|image/jpeg|10064|4352|0|30739071||1645616439|1645616438820|0|0|0|0|||||||| +2214|34678|content://media/external/images/media/34678|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0007.jpg|image/jpeg|2048|1536|0|204987||1645613939|1645613940306|0|0|0|0|||||||| +2215|34681|content://media/external/images/media/34681|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0008.jpg|image/jpeg|2048|1536|0|188152||1645613940|1645613940633|0|0|0|0|||||||| +2216|34684|content://media/external/images/media/34684|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0009.jpg|image/jpeg|2048|1536|0|184685||1645613940|1645613940894|0|0|0|0|||||||| +2217|34675|content://media/external/images/media/34675|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0006.jpg|image/jpeg|2048|1536|0|203174||1645613939|1645613939608|0|0|0|0|||||||| +2218|34672|content://media/external/images/media/34672|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0005.jpg|image/jpeg|2048|1536|0|211192||1645613937|1645613938597|0|0|0|0|||||||| +2219|34667|content://media/external/images/media/34667|/storage/emulated/0/DCIM/Camera/IMG_20220223_113545.jpg|image/jpeg|3200|1800|0|2376439||1645612546|1645612546659|1645612545249|0|0|0|||||||| +2220|34665|content://media/external/images/media/34665|/storage/emulated/0/DCIM/Camera/IMG_20220223_113539.jpg|image/jpeg|3200|1800|0|2416884||1645612541|1645612541691|1645612539464|0|0|0|||||||| +2221|34597|content://media/external/images/media/34597|/storage/emulated/0/DCIM/Camera/IMG_20220222_123328.jpg|image/jpeg|3200|1800|0|1936666||1645529610|1645529610237|1645529608477|0|0|0|||||||| +2222|34598|content://media/external/images/media/34598|/storage/emulated/0/DCIM/Camera/IMG_20220222_123328_1.jpg|image/jpeg|3200|1800|0|1818229||1645529610|1645529610317|1645529609600|0|0|0|||||||| +2223|34595|content://media/external/images/media/34595|/storage/emulated/0/DCIM/Camera/IMG_20220222_123256.jpg|image/jpeg|3200|1800|0|2021106||1645529578|1645529578837|1645529576573|0|0|0|||||||| +2224|34592|content://media/external/images/media/34592|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220222-WA0005.jpg|image/jpeg|1824|1368|0|344942||1645528037|1645528120017|0|0|0|0|||||||| +2225|34590|content://media/external/images/media/34590|/storage/emulated/0/DCIM/Camera/IMG_20220222_114843.jpg|image/jpeg|3200|1800|0|2712229||1645526926|1645526926036|1645526924132|0|0|0|||||||| +2226|34588|content://media/external/images/media/34588|/storage/emulated/0/DCIM/Camera/IMG_20220222_114505.jpg|image/jpeg|4608|2592|0|8167715||1645526707|1645526707546|1645526705359|0|0|0|||||||| +2227|34586|content://media/external/images/media/34586|/storage/emulated/0/DCIM/Camera/IMG_20220222_114310.jpg|image/jpeg|3200|1800|0|3379094||1645526591|1645526591666|1645526590537|0|0|0|||||||| +2228|34584|content://media/external/images/media/34584|/storage/emulated/0/DCIM/Camera/IMG_20220222_114306.jpg|image/jpeg|3200|1800|0|3446774||1645526588|1645526588090|1645526587100|0|0|0|||||||| +2229|34582|content://media/external/images/media/34582|/storage/emulated/0/DCIM/Camera/IMG_20220222_114304.jpg|image/jpeg|3200|1800|0|3416597||1645526586|1645526586258|1645526585167|0|0|0|||||||| +2230|34580|content://media/external/images/media/34580|/storage/emulated/0/DCIM/Camera/IMG_20220222_114244.jpg|image/jpeg|3200|1800|0|3453187||1645526566|1645526566842|1645526564982|0|0|0|||||||| +2231|34578|content://media/external/images/media/34578|/storage/emulated/0/DCIM/Camera/IMG_20220222_114229.jpg|image/jpeg|2592|4608|0|7158247||1645526552|1645526552366|1645526549379|0|0|0|||||||| +2232|34572|content://media/external/images/media/34572|/storage/emulated/0/DCIM/Camera/IMG_20220222_103809.jpg|image/jpeg|5120|2880|0|4327767||1645522691|1645522691410|1645522689934|0|0|0|||||||| +2233|34570|content://media/external/images/media/34570|/storage/emulated/0/DCIM/Camera/IMG_20220222_103750.jpg|image/jpeg|3200|1800|0|2549600||1645522673|1645522673394|1645522671360|0|0|0|||||||| +2234|34566|content://media/external/images/media/34566|/storage/emulated/0/DCIM/Camera/IMG_20220222_090602.jpg|image/jpeg|4608|2592|0|4624591||1645517165|1645517165572|1645517163206|0|0|0|||||||| +2235|34563|content://media/external/images/media/34563|/storage/emulated/0/DCIM/Camera/IMG_20220222_090353.jpg|image/jpeg|4608|2592|0|5559291||1645517036|1645517036412|1645517033874|0|0|0|||||||| +2236|34527|content://media/external/images/media/34527|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220221-WA0042.jpg|image/jpeg|1599|899|0|92542||1645467868|1645467868594|0|0|0|0|||||||| +2237|34516|content://media/external/images/media/34516|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220221-WA0033.jpg|image/jpeg|1536|2048|0|107404||1645466869|1645466870009|0|0|0|0|||||||| +2238|34504|content://media/external/images/media/34504|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220221-WA0027.jpg|image/jpeg|1824|1368|0|251416||1645462914|1645462915070|0|0|0|0|||||||| +2239|34501|content://media/external/images/media/34501|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220221-WA0026.jpg|image/jpeg|1920|1080|0|199621||1645462913|1645462914490|0|0|0|0|||||||| +2240|34499|content://media/external/images/media/34499|/storage/emulated/0/DCIM/Camera/IMG_20220221_175904.jpg|image/jpeg|1800|3200|0|1678970||1645462745|1645462745624|1645462744948|0|0|0|||||||| +2241|34497|content://media/external/images/media/34497|/storage/emulated/0/DCIM/Camera/IMG_20220221_175902.jpg|image/jpeg|1800|3200|0|1634904||1645462744|1645462744308|1645462743429|0|0|0|||||||| +2242|34493|content://media/external/images/media/34493|/storage/emulated/0/DCIM/Camera/IMG_20220221_175618.jpg|image/jpeg|3200|1800|0|2144821||1645462579|1645462579733|1645462578986|0|0|0|||||||| +2243|34491|content://media/external/images/media/34491|/storage/emulated/0/DCIM/Camera/IMG_20220221_175610.jpg|image/jpeg|3200|1800|0|1922611||1645462571|1645462572001|1645462571219|0|0|0|||||||| +2244|34489|content://media/external/images/media/34489|/storage/emulated/0/DCIM/Camera/IMG_20220221_175427.jpg|image/jpeg|3200|1800|0|1857282||1645462469|1645462469401|1645462468460|0|0|0|||||||| +2245|34485|content://media/external/images/media/34485|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0022.jpg|image/jpeg|896|2000|0|288615||1645462149|1645462150107|0|0|0|0|||||||| +2246|34482|content://media/external/images/media/34482|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0021.jpg|image/jpeg|896|2000|0|286537||1645462148|1645462149490|0|0|0|0|||||||| +2247|34476|content://media/external/images/media/34476|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0019.jpg|image/jpeg|896|2000|0|67481||1645462147|1645462148143|0|0|0|0|||||||| +2248|34479|content://media/external/images/media/34479|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0020.jpg|image/jpeg|896|2000|0|342683||1645462148|1645462148745|0|0|0|0|||||||| +2249|34430|content://media/external/images/media/34430|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0004.jpg|image/jpeg|1536|2048|0|141043||1645439643|1645462147186|0|0|0|0|||||||| +2250|34469|content://media/external/images/media/34469|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0017.jpg|image/jpeg|896|2000|0|80966||1645462146|1645462147113|0|0|0|0|||||||| +2251|34473|content://media/external/images/media/34473|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0018.jpg|image/jpeg|896|2000|0|78618||1645462147|1645462147812|0|0|0|0|||||||| +2252|34466|content://media/external/images/media/34466|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0016.jpg|image/jpeg|896|2000|0|257358||1645462145|1645462146553|0|0|0|0|||||||| +2253|34439|content://media/external/images/media/34439|/storage/emulated/0/DCIM/Camera/IMG_20220221_153044.jpg|image/jpeg|4608|2592|0|3024039||1645453846|1645453846893|1645453845132|0|0|0|||||||| +2254|34437|content://media/external/images/media/34437|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220221-WA0008.jpeg|image/jpeg|3840|2160|90|1499517||1645452611|1645452611067|1645452610992|0|0|0|||||||| +2255|34428|content://media/external/images/media/34428|/storage/emulated/0/DCIM/Camera/IMG_20220221_113041.jpg|image/jpeg|2592|4608|0|3443044||1645439442|1645439442915|1645439441614|0|0|0|||||||| +2256|34426|content://media/external/images/media/34426|/storage/emulated/0/DCIM/Camera/IMG_20220221_113027.jpg|image/jpeg|4608|2592|0|2679421||1645439429|1645439429139|1645439427787|0|0|0|||||||| +2257|34424|content://media/external/images/media/34424|/storage/emulated/0/DCIM/Camera/IMG_20220221_113023.jpg|image/jpeg|4608|2592|0|2895483||1645439425|1645439425295|1645439423354|0|0|0|||||||| +2258|34422|content://media/external/images/media/34422|/storage/emulated/0/DCIM/Camera/IMG_20220221_112734.jpg|image/jpeg|5120|2880|0|4001292||1645439256|1645439256511|1645439255126|0|0|0|||||||| +2259|34420|content://media/external/images/media/34420|/storage/emulated/0/DCIM/Camera/IMG_20220221_112552.jpg|image/jpeg|3200|1800|0|2107413||1645439153|1645439153947|1645439152436|0|0|0|||||||| +2260|34418|content://media/external/images/media/34418|/storage/emulated/0/DCIM/Camera/IMG_20220221_112539.jpg|image/jpeg|4608|2592|0|5143946||1645439141|1645439141931|1645439140268|0|0|0|||||||| +2261|34416|content://media/external/images/media/34416|/storage/emulated/0/DCIM/Camera/IMG_20220221_112534.jpg|image/jpeg|3200|1800|0|2492328||1645439135|1645439135579|1645439134697|0|0|0|||||||| +2262|34414|content://media/external/images/media/34414|/storage/emulated/0/DCIM/Camera/IMG_20220221_112509.jpg|image/jpeg|3200|1800|0|2305076||1645439111|1645439111195|1645439109742|0|0|0|||||||| +2263|34412|content://media/external/images/media/34412|/storage/emulated/0/DCIM/Camera/IMG_20220221_112501.jpg|image/jpeg|4608|2592|0|4704482||1645439104|1645439104207|1645439101311|0|0|0|||||||| +2264|34410|content://media/external/images/media/34410|/storage/emulated/0/DCIM/Camera/IMG_20220221_112454.jpg|image/jpeg|4608|2592|0|4514158||1645439096|1645439096775|1645439094366|0|0|0|||||||| +2265|34407|content://media/external/images/media/34407|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220221-WA0003.jpg|image/jpeg|2048|1345|0|390050||1645437072|1645437073675|0|0|0|0|||||||| +2266|34405|content://media/external/images/media/34405|/storage/emulated/0/DCIM/Camera/IMG_20220221_094950.jpg|image/jpeg|3200|1800|0|2932569||1645433391|1645433391425|1645433390587|0|0|0|||||||| +2267|34403|content://media/external/images/media/34403|/storage/emulated/0/DCIM/Camera/IMG_20220221_094948.jpg|image/jpeg|3200|1800|0|2858051||1645433389|1645433389593|1645433388724|0|0|0|||||||| +2268|34401|content://media/external/images/media/34401|/storage/emulated/0/DCIM/Camera/IMG_20220221_094947.jpg|image/jpeg|3200|1800|0|2832335||1645433388|1645433388501|1645433387620|0|0|0|||||||| +2269|34399|content://media/external/images/media/34399|/storage/emulated/0/DCIM/Camera/IMG_20220221_094943.jpg|image/jpeg|3200|1800|0|2937601||1645433385|1645433385501|1645433384257|0|0|0|||||||| +2270|34397|content://media/external/images/media/34397|/storage/emulated/0/DCIM/Camera/IMG_20220221_094906.jpg|image/jpeg|3200|1800|0|2659514||1645433347|1645433347101|1645433346297|0|0|0|||||||| +2271|34395|content://media/external/images/media/34395|/storage/emulated/0/DCIM/Camera/IMG_20220221_094846.jpg|image/jpeg|3200|1800|0|2543800||1645433327|1645433327501|1645433326469|0|0|0|||||||| +2272|34393|content://media/external/images/media/34393|/storage/emulated/0/DCIM/Camera/IMG_20220221_094842.jpg|image/jpeg|3200|1800|0|2596983||1645433324|1645433324581|1645433322706|0|0|0|||||||| +2273|34368|content://media/external/images/media/34368|/storage/emulated/0/DCIM/Camera/IMG_20220220_195302.jpg|image/jpeg|4608|2592|0|5082629||1645383185|1645383185425|1645383183112|0|0|0|||||||| +2274|34362|content://media/external/images/media/34362|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220220-WA0022.jpg|image/jpeg|2048|1532|0|167685||1645380259|1645380281554|0|0|0|0|||||||| +2275|34348|content://media/external/images/media/34348|/storage/emulated/0/DCIM/Camera/IMG_20220220_185131.jpg|image/jpeg|3200|1800|0|1675028||1645379493|1645379493230|1645379492194|0|0|0|||||||| +2276|34346|content://media/external/images/media/34346|/storage/emulated/0/DCIM/Camera/IMG_20220220_185126.jpg|image/jpeg|3200|1800|0|2207904||1645379487|1645379487386|1645379486446|0|0|0|||||||| +2277|34344|content://media/external/images/media/34344|/storage/emulated/0/DCIM/Camera/IMG_20220220_185041.jpg|image/jpeg|3200|1800|0|2071367||1645379442|1645379442158|1645379441576|0|0|0|||||||| +2278|34342|content://media/external/images/media/34342|/storage/emulated/0/DCIM/Camera/IMG_20220220_185030.jpg|image/jpeg|3200|1800|0|1889223||1645379431|1645379431178|1645379430632|0|0|0|||||||| +2279|34340|content://media/external/images/media/34340|/storage/emulated/0/DCIM/Camera/IMG_20220220_185022.jpg|image/jpeg|3200|1800|0|1958398||1645379423|1645379423414|1645379422609|0|0|0|||||||| +2280|34338|content://media/external/images/media/34338|/storage/emulated/0/DCIM/Camera/IMG_20220220_185017.jpg|image/jpeg|3200|1800|0|2056081||1645379418|1645379418770|1645379417725|0|0|0|||||||| +2281|34336|content://media/external/images/media/34336|/storage/emulated/0/DCIM/Camera/IMG_20220220_184940.jpg|image/jpeg|3200|1800|0|2142092||1645379382|1645379382054|1645379380967|0|0|0|||||||| +2282|34334|content://media/external/images/media/34334|/storage/emulated/0/DCIM/Camera/IMG_20220220_184923.jpg|image/jpeg|3200|1800|0|2127253||1645379364|1645379364582|1645379363563|0|0|0|||||||| +2283|34332|content://media/external/images/media/34332|/storage/emulated/0/DCIM/Camera/IMG_20220220_184911.jpg|image/jpeg|3200|1800|0|2052933||1645379353|1645379353662|1645379352354|0|0|0|||||||| +2284|34317|content://media/external/images/media/34317|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220220-WA0010.jpg|image/jpeg|1024|768|0|127247||1645371121|1645371132403|0|0|0|0|||||||| +2285|34305|content://media/external/images/media/34305|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220220-WA0007.jpg|image/jpeg|1600|1200|0|181070||1645364112|1645364113750|0|0|0|0|||||||| +2286|34299|content://media/external/images/media/34299|/storage/emulated/0/DCIM/Camera/IMG_20220220_134803.jpg|image/jpeg|3200|1800|0|2381823||1645361286|1645361286348|1645361284260|0|0|0|||||||| +2287|33964|content://media/external/images/media/33964|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220216-WA0016.jpeg|image/jpeg|3840|2160|0|1470483||1645031477|1645031478010|1645031477932|0|0|0|||||||| +2288|33812|content://media/external/images/media/33812|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0034.jpg|image/jpeg|1532|2048|0|295345||1644860819|1644860826064|0|0|0|0|||||||| +2289|33805|content://media/external/images/media/33805|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0032.jpg|image/jpeg|1200|1600|0|111114||1644852318|1644852319311|0|0|0|0|||||||| +2290|33759|content://media/external/images/media/33759|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0017.jpg|image/jpeg|2048|1532|0|415772||1644821483|1644821484241|0|0|0|0|||||||| +2291|33756|content://media/external/images/media/33756|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0016.jpg|image/jpeg|2048|1532|0|318674||1644821479|1644821483578|0|0|0|0|||||||| +2292|33753|content://media/external/images/media/33753|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0015.jpg|image/jpeg|1532|2048|0|403051||1644821478|1644821479221|0|0|0|0|||||||| +2293|33750|content://media/external/images/media/33750|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0014.jpg|image/jpeg|1532|2048|0|449880||1644821477|1644821478043|0|0|0|0|||||||| +2294|33747|content://media/external/images/media/33747|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0013.jpg|image/jpeg|2048|1532|0|400934||1644821476|1644821477270|0|0|0|0|||||||| +2295|33741|content://media/external/images/media/33741|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0011.jpg|image/jpeg|1532|2048|0|361221||1644821475|1644821476242|0|0|0|0|||||||| +2296|33744|content://media/external/images/media/33744|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0012.jpg|image/jpeg|2048|1532|0|331500||1644821476|1644821476718|0|0|0|0|||||||| +2297|33738|content://media/external/images/media/33738|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0010.jpg|image/jpeg|1532|2048|0|307625||1644821474|1644821475492|0|0|0|0|||||||| +2298|33732|content://media/external/images/media/33732|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0008.jpg|image/jpeg|2048|1532|0|373787||1644821473|1644821474202|0|0|0|0|||||||| +2299|33735|content://media/external/images/media/33735|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0009.jpg|image/jpeg|2048|1003|0|268648||1644821474|1644821474728|0|0|0|0|||||||| +2300|33726|content://media/external/images/media/33726|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0006.jpg|image/jpeg|2048|1532|0|274276||1644821472|1644821473243|0|0|0|0|||||||| +2301|33729|content://media/external/images/media/33729|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0007.jpg|image/jpeg|2048|1532|0|260005||1644821473|1644821473751|0|0|0|0|||||||| +2302|33720|content://media/external/images/media/33720|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0004.jpg|image/jpeg|2048|1532|0|490144||1644821471|1644821472367|0|0|0|0|||||||| +2303|33723|content://media/external/images/media/33723|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0005.jpg|image/jpeg|2048|1532|0|270303||1644821472|1644821472827|0|0|0|0|||||||| +2304|33717|content://media/external/images/media/33717|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0003.jpg|image/jpeg|2048|1532|0|364400||1644821471|1644821471755|0|0|0|0|||||||| +2305|33711|content://media/external/images/media/33711|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0001.jpg|image/jpeg|1532|2048|0|294651||1644821469|1644821470515|0|0|0|0|||||||| +2306|33708|content://media/external/images/media/33708|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0000.jpg|image/jpeg|1532|2048|0|382816||1644821468|1644821469725|0|0|0|0|||||||| +2307|33683|content://media/external/images/media/33683|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220213-WA0072.jpg|image/jpeg|2048|1532|0|243883||1644771851|1644771852843|0|0|0|0|||||||| +2308|33680|content://media/external/images/media/33680|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220213-WA0071.jpg|image/jpeg|2048|1532|0|201985||1644771851|1644771851790|0|0|0|0|||||||| +2309|33669|content://media/external/images/media/33669|/storage/emulated/0/DCIM/Camera/IMG_20220213_162959.jpg|image/jpeg|4608|2592|0|3892753||1644766201|1644766201429|1644766199709|0|0|0|||||||| +2310|33667|content://media/external/images/media/33667|/storage/emulated/0/DCIM/Camera/IMG_20220213_162909.jpg|image/jpeg|2592|4608|0|4551623||1644766152|1644766152157|1644766150220|0|0|0|||||||| +2311|33659|content://media/external/images/media/33659|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220213-WA0065.jpg|image/jpeg|1599|899|0|164792||1644765627|1644765628378|0|0|0|0|||||||| +2312|33656|content://media/external/images/media/33656|/storage/emulated/0/DCIM/Camera/IMG_20220213_161546.jpg|image/jpeg|2592|4608|0|4937367||1644765348|1644765348389|1644765346542|0|0|0|||||||| +2313|33653|content://media/external/images/media/33653|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0063.jpg|image/jpeg|2048|1536|0|477901||1644765022|1644765023047|0|0|0|0|||||||| +2314|33650|content://media/external/images/media/33650|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0062.jpg|image/jpeg|2048|1536|0|386546||1644765021|1644765022090|0|0|0|0|||||||| +2315|33647|content://media/external/images/media/33647|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0061.jpg|image/jpeg|2048|1536|0|447968||1644765019|1644765021117|0|0|0|0|||||||| +2316|33644|content://media/external/images/media/33644|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0060.jpg|image/jpeg|2048|1536|0|479560||1644765017|1644765018578|0|0|0|0|||||||| +2317|33640|content://media/external/images/media/33640|/storage/emulated/0/DCIM/Camera/IMG_20220213_154220.jpg|image/jpeg|3200|1800|0|2101402||1644763343|1644763343100|1644763340495|0|0|0|||||||| +2318|33641|content://media/external/images/media/33641|/storage/emulated/0/DCIM/Camera/IMG_20220213_154222.jpg|image/jpeg|3200|1800|0|2109630||1644763343|1644763343792|1644763342452|0|0|0|||||||| +2319|33638|content://media/external/images/media/33638|/storage/emulated/0/DCIM/Camera/IMG_20220213_150252.jpg|image/jpeg|3200|1800|0|2538619||1644760975|1644760975740|1644760972748|0|0|0|||||||| +2320|33620|content://media/external/images/media/33620|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0054.jpg|image/jpeg|1600|1200|0|351614||1644753732|1644753733406|0|0|0|0|||||||| +2321|33611|content://media/external/images/media/33611|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0051.jpg|image/jpeg|1600|1200|0|347704||1644753731|1644753732268|0|0|0|0|||||||| +2322|33614|content://media/external/images/media/33614|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0052.jpg|image/jpeg|1200|1600|0|94867||1644753732|1644753732610|0|0|0|0|||||||| +2323|33617|content://media/external/images/media/33617|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0053.jpg|image/jpeg|1200|1600|0|112271||1644753732|1644753732964|0|0|0|0|||||||| +2324|33602|content://media/external/images/media/33602|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0048.jpg|image/jpeg|1200|1600|0|226521||1644753730|1644753731270|0|0|0|0|||||||| +2325|33605|content://media/external/images/media/33605|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0049.jpg|image/jpeg|1200|1600|0|313488||1644753731|1644753731601|0|0|0|0|||||||| +2326|33608|content://media/external/images/media/33608|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0050.jpg|image/jpeg|1600|1200|0|266704||1644753731|1644753731833|0|0|0|0|||||||| +2327|33599|content://media/external/images/media/33599|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0047.jpg|image/jpeg|2048|1536|0|478269||1644753721|1644753722662|0|0|0|0|||||||| +2328|33318|content://media/external/images/media/33318|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220212-WA0015.jpg|image/jpeg|1600|1200|0|196334||1644668943|1644750600176|0|0|0|0|||||||| +2329|33372|content://media/external/images/media/33372|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220212-WA0033.jpg|image/jpeg|1532|2048|0|234676||1644671125|1644750600099|0|0|0|0|||||||| +2330|33406|content://media/external/images/media/33406|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220212-WA0036.jpg|image/jpeg|738|1600|0|179489||1644674129|1644750600300|0|0|0|0|||||||| +2331|33591|content://media/external/images/media/33591|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0045.jpg|image/jpeg|1600|1197|0|245247||1644750599|1644750600013|0|0|0|0|||||||| +2332|33595|content://media/external/images/media/33595|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0046.jpg|image/jpeg|900|1600|0|188221||1644750600|1644750600702|0|0|0|0|||||||| +2333|33534|content://media/external/images/media/33534|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0004.jpg|image/jpeg|1532|2048|0|434639||1644742037|1644750599409|0|0|0|0|||||||| +2334|33589|content://media/external/images/media/33589|/storage/emulated/0/DCIM/Camera/IMG_20220213_110003.jpg|image/jpeg|4608|2592|0|6757574||1644746405|1644746405978|1644746403659|0|0|0|||||||| +2335|33587|content://media/external/images/media/33587|/storage/emulated/0/DCIM/Camera/IMG_20220213_105955.jpg|image/jpeg|4608|2592|0|6891502||1644746400|1644746400530|1644746395710|0|0|0|||||||| +2336|33537|content://media/external/images/media/33537|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220213-WA0005.jpg|image/jpeg|1532|2048|0|406715||1644742037|1644742038734|0|0|0|0|||||||| +2337|33531|content://media/external/images/media/33531|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220213-WA0003.jpg|image/jpeg|1532|2048|0|423800||1644742035|1644742037064|0|0|0|0|||||||| +2338|33529|content://media/external/images/media/33529|/storage/emulated/0/DCIM/Camera/IMG_20220213_094502.jpg|image/jpeg|2592|4608|0|5364359||1644741904|1644741905021|1644741903168|0|0|0|||||||| +2339|33527|content://media/external/images/media/33527|/storage/emulated/0/DCIM/Camera/IMG_20220213_093517.jpg|image/jpeg|3200|1800|0|2209734||1644741320|1644741320651|1644741318276|0|0|0|||||||| +2340|33521|content://media/external/images/media/33521|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220213-WA0001.jpg|image/jpeg|2048|1532|0|349396||1644740640|1644740641315|0|0|0|0|||||||| +2341|33524|content://media/external/images/media/33524|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220213-WA0002.jpg|image/jpeg|2048|1532|0|353520||1644740641|1644740641820|0|0|0|0|||||||| +2342|33518|content://media/external/images/media/33518|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220213-WA0000.jpg|image/jpeg|2048|1532|0|339284||1644740638|1644740640701|0|0|0|0|||||||| +2343|33504|content://media/external/images/media/33504|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0052.jpg|image/jpeg|1200|1600|0|268850||1644688221|1644688222961|0|0|0|0|||||||| +2344|33498|content://media/external/images/media/33498|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0050.jpg|image/jpeg|1600|1200|0|331545||1644688220|1644688221351|0|0|0|0|||||||| +2345|33501|content://media/external/images/media/33501|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0051.jpg|image/jpeg|1200|1600|0|280796||1644688221|1644688221941|0|0|0|0|||||||| +2346|33495|content://media/external/images/media/33495|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0049.jpg|image/jpeg|1200|1600|0|365368||1644688219|1644688220758|0|0|0|0|||||||| +2347|33492|content://media/external/images/media/33492|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0048.jpg|image/jpeg|1600|1200|0|266506||1644688213|1644688215820|0|0|0|0|||||||| +2348|33489|content://media/external/images/media/33489|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0047.jpg|image/jpeg|1600|1200|0|319110||1644688198|1644688200236|0|0|0|0|||||||| +2349|33484|content://media/external/images/media/33484|/storage/emulated/0/DCIM/Camera/IMG_20220212_172525.jpg|image/jpeg|2592|4608|0|5207763||1644683130|1644683130552|1644683125536|0|0|0|||||||| +2350|33479|content://media/external/images/media/33479|/storage/emulated/0/DCIM/Camera/IMG_20220212_164628.jpg|image/jpeg|4608|2592|0|5878043||1644680790|1644680790073|1644680788926|0|0|0|||||||| +2351|33477|content://media/external/images/media/33477|/storage/emulated/0/DCIM/Camera/IMG_20220212_164626.jpg|image/jpeg|4608|2592|0|6005172||1644680788|1644680788117|1644680786523|0|0|0|||||||| +2352|33475|content://media/external/images/media/33475|/storage/emulated/0/DCIM/Camera/IMG_20220212_164545.jpg|image/jpeg|4608|2592|0|5990279||1644680747|1644680747905|1644680746285|0|0|0|||||||| +2353|33472|content://media/external/images/media/33472|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0045.jpg|image/jpeg|1532|2048|0|362785||1644680471|1644680472294|0|0|0|0|||||||| +2354|33469|content://media/external/images/media/33469|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0044.jpg|image/jpeg|1532|2048|0|344531||1644680470|1644680471543|0|0|0|0|||||||| +2355|33466|content://media/external/images/media/33466|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0043.jpg|image/jpeg|2048|1532|0|422205||1644680469|1644680470046|0|0|0|0|||||||| +2356|33463|content://media/external/images/media/33463|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0042.jpg|image/jpeg|2048|1532|0|424205||1644680468|1644680469514|0|0|0|0|||||||| +2357|33460|content://media/external/images/media/33460|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0041.jpg|image/jpeg|1532|2048|0|328311||1644680467|1644680468256|0|0|0|0|||||||| +2358|33457|content://media/external/images/media/33457|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0040.jpg|image/jpeg|1532|2048|0|361036||1644680466|1644680467689|0|0|0|0|||||||| +2359|33455|content://media/external/images/media/33455|/storage/emulated/0/DCIM/Camera/IMG_20220212_163354.jpg|image/jpeg|3200|1800|0|2402062||1644680035|1644680035506|1644680034387|0|0|0|||||||| +2360|33453|content://media/external/images/media/33453|/storage/emulated/0/DCIM/Camera/IMG_20220212_163349.jpg|image/jpeg|3200|1800|0|2459787||1644680031|1644680031170|1644680029755|0|0|0|||||||| +2361|33451|content://media/external/images/media/33451|/storage/emulated/0/DCIM/Camera/IMG_20220212_163307.jpg|image/jpeg|3200|1800|0|2700046||1644679989|1644679989278|1644679988117|0|0|0|||||||| +2362|33449|content://media/external/images/media/33449|/storage/emulated/0/DCIM/Camera/IMG_20220212_163258.jpg|image/jpeg|3200|1800|0|2636558||1644679980|1644679980750|1644679978587|0|0|0|||||||| +2363|33447|content://media/external/images/media/33447|/storage/emulated/0/DCIM/Camera/IMG_20220212_162350.jpg|image/jpeg|1800|3200|0|2919123||1644679434|1644679434605|1644679430737|0|0|0|||||||| +2364|33444|content://media/external/images/media/33444|/storage/emulated/0/DCIM/Camera/IMG_20220212_161715.jpg|image/jpeg|2592|4608|0|6340317||1644679038|1644679038895|1644679035833|0|0|0|||||||| +2365|33443|content://media/external/images/media/33443|/storage/emulated/0/DCIM/Camera/IMG_20220212_161713.jpg|image/jpeg|2592|4608|0|6564824||1644679036|1644679036443|1644679033333|0|0|0|||||||| +2366|33441|content://media/external/images/media/33441|/storage/emulated/0/DCIM/Camera/IMG_20220212_154426.jpg|image/jpeg|3200|1800|0|2516675||1644677068|1644677068855|1644677066966|0|0|0|||||||| +2367|33439|content://media/external/images/media/33439|/storage/emulated/0/DCIM/Camera/IMG_20220212_154057.jpg|image/jpeg|4608|2592|0|5855432||1644676859|1644676859512|1644676858125|0|0|0|||||||| +2368|33437|content://media/external/images/media/33437|/storage/emulated/0/DCIM/Camera/IMG_20220212_154045.jpg|image/jpeg|4608|2592|0|5160236||1644676847|1644676847432|1644676846195|0|0|0|||||||| +2369|33435|content://media/external/images/media/33435|/storage/emulated/0/DCIM/Camera/IMG_20220212_154043.jpg|image/jpeg|4608|2592|0|5223571||1644676844|1644676844536|1644676843332|0|0|0|||||||| +2370|33433|content://media/external/images/media/33433|/storage/emulated/0/DCIM/Camera/IMG_20220212_154038.jpg|image/jpeg|2592|4608|0|4336169||1644676840|1644676840468|1644676838731|0|0|0|||||||| +2371|33428|content://media/external/images/media/33428|/storage/emulated/0/DCIM/Camera/IMG_20220212_153434.jpg|image/jpeg|4608|2592|0|4863829||1644676476|1644676476574|1644676474903|0|0|0|||||||| +2372|33426|content://media/external/images/media/33426|/storage/emulated/0/DCIM/Camera/IMG_20220212_153425.jpg|image/jpeg|3200|1800|0|2199290||1644676467|1644676467442|1644676466920|0|0|0|||||||| +2373|33424|content://media/external/images/media/33424|/storage/emulated/0/DCIM/Camera/IMG_20220212_153328.jpg|image/jpeg|3200|1800|0|3015226||1644676410|1644676410730|1644676408867|0|0|0|||||||| +2374|33422|content://media/external/images/media/33422|/storage/emulated/0/DCIM/Camera/IMG_20220212_153320.jpg|image/jpeg|2592|4608|0|5706616||1644676402|1644676402710|1644676401154|0|0|0|||||||| +2375|33420|content://media/external/images/media/33420|/storage/emulated/0/DCIM/Camera/IMG_20220212_153316.jpg|image/jpeg|2592|4608|0|5188150||1644676398|1644676398302|1644676396751|0|0|0|||||||| +2376|33418|content://media/external/images/media/33418|/storage/emulated/0/DCIM/Camera/IMG_20220212_153306.jpg|image/jpeg|4608|2592|0|5771513||1644676390|1644676390318|1644676386474|0|0|0|||||||| +2377|33413|content://media/external/images/media/33413|/storage/emulated/0/DCIM/Camera/IMG_20220212_151420.jpg|image/jpeg|3200|1800|0|2123904||1644675262|1644675262182|1644675260725|0|0|0|||||||| +2378|33411|content://media/external/images/media/33411|/storage/emulated/0/DCIM/Camera/IMG_20220212_151414.jpg|image/jpeg|1800|3200|0|2170427||1644675256|1644675256530|1644675254701|0|0|0|||||||| +2379|33403|content://media/external/images/media/33403|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0035.jpg|image/jpeg|1600|738|0|202476||1644674128|1644674129795|0|0|0|0|||||||| +2380|33400|content://media/external/images/media/33400|/storage/emulated/0/DCIM/Camera/IMG_20220212_144045.jpg|image/jpeg|3200|1800|0|2508098||1644673246|1644673246536|1644673245409|0|0|0|||||||| +2381|33398|content://media/external/images/media/33398|/storage/emulated/0/DCIM/Camera/IMG_20220212_144041.jpg|image/jpeg|3200|1800|0|2490331||1644673243|1644673243012|1644673241975|0|0|0|||||||| +2382|33396|content://media/external/images/media/33396|/storage/emulated/0/DCIM/Camera/IMG_20220212_144035.jpg|image/jpeg|3200|1800|0|2484454||1644673237|1644673237160|1644673236114|0|0|0|||||||| +2383|33394|content://media/external/images/media/33394|/storage/emulated/0/DCIM/Camera/IMG_20220212_144034.jpg|image/jpeg|3200|1800|0|2531151||1644673235|1644673235788|1644673234650|0|0|0|||||||| +2384|33392|content://media/external/images/media/33392|/storage/emulated/0/DCIM/Camera/IMG_20220212_144029.jpg|image/jpeg|3200|1800|0|2549622||1644673230|1644673230556|1644673229423|0|0|0|||||||| +2385|33390|content://media/external/images/media/33390|/storage/emulated/0/DCIM/Camera/IMG_20220212_144027.jpg|image/jpeg|3200|1800|0|2522682||1644673228|1644673228848|1644673227351|0|0|0|||||||| +2386|33388|content://media/external/images/media/33388|/storage/emulated/0/DCIM/Camera/IMG_20220212_143912.jpg|image/jpeg|1800|3200|0|2399990||1644673153|1644673153977|1644673152781|0|0|0|||||||| +2387|33385|content://media/external/images/media/33385|/storage/emulated/0/DCIM/Camera/IMG_20220212_143904.jpg|image/jpeg|1800|3200|0|2635674||1644673146|1644673146245|1644673144835|0|0|0|||||||| +2388|33384|content://media/external/images/media/33384|/storage/emulated/0/DCIM/Camera/IMG_20220212_143902.jpg|image/jpeg|1800|3200|0|2586412||1644673145|1644673145329|1644673142901|0|0|0|||||||| +2389|33382|content://media/external/images/media/33382|/storage/emulated/0/DCIM/Camera/IMG_20220212_143143.jpg|image/jpeg|1800|3200|0|2524997||1644672709|1644672709380|1644672704206|0|0|0|||||||| +2390|33380|content://media/external/images/media/33380|/storage/emulated/0/DCIM/Camera/IMG_20220212_143134.jpg|image/jpeg|4608|2592|0|6210555||1644672698|1644672698304|1644672695180|0|0|0|||||||| +2391|33369|content://media/external/images/media/33369|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0032.jpg|image/jpeg|1532|2048|0|333125||1644671123|1644671125070|0|0|0|0|||||||| +2392|33366|content://media/external/images/media/33366|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0031.jpg|image/jpeg|1532|2048|0|272407||1644671122|1644671123760|0|0|0|0|||||||| +2393|33360|content://media/external/images/media/33360|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0029.jpg|image/jpeg|1532|2048|0|282708||1644671121|1644671122224|0|0|0|0|||||||| +2394|33363|content://media/external/images/media/33363|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0030.jpg|image/jpeg|1532|2048|0|409181||1644671122|1644671122980|0|0|0|0|||||||| +2395|33357|content://media/external/images/media/33357|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0028.jpg|image/jpeg|2048|1033|0|287120||1644671120|1644671121055|0|0|0|0|||||||| +2396|33354|content://media/external/images/media/33354|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0027.jpg|image/jpeg|1532|2048|0|378265||1644671119|1644671120177|0|0|0|0|||||||| +2397|33348|content://media/external/images/media/33348|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0025.jpg|image/jpeg|2048|1532|0|429379||1644671118|1644671119282|0|0|0|0|||||||| +2398|33351|content://media/external/images/media/33351|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0026.jpg|image/jpeg|2048|1532|0|421652||1644671119|1644671119760|0|0|0|0|||||||| +2399|33345|content://media/external/images/media/33345|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0024.jpg|image/jpeg|1532|2048|0|461888||1644671117|1644671118812|0|0|0|0|||||||| +2400|33342|content://media/external/images/media/33342|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0023.jpg|image/jpeg|1700|1080|0|270344||1644671116|1644671117181|0|0|0|0|||||||| +2401|33339|content://media/external/images/media/33339|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0022.jpg|image/jpeg|1532|2048|0|355126||1644671114|1644671116201|0|0|0|0|||||||| +2402|33336|content://media/external/images/media/33336|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0021.jpg|image/jpeg|1532|2048|0|474886||1644671113|1644671114919|0|0|0|0|||||||| +2403|33327|content://media/external/images/media/33327|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0018.jpg|image/jpeg|1200|1600|0|198810||1644668944|1644668945296|0|0|0|0|||||||| +2404|33330|content://media/external/images/media/33330|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0019.jpg|image/jpeg|1600|1200|0|259869||1644668945|1644668945838|0|0|0|0|||||||| +2405|33321|content://media/external/images/media/33321|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0016.jpg|image/jpeg|1200|1600|0|202967||1644668943|1644668944499|0|0|0|0|||||||| +2406|33324|content://media/external/images/media/33324|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0017.jpg|image/jpeg|1600|1200|0|304463||1644668944|1644668944858|0|0|0|0|||||||| +2407|33315|content://media/external/images/media/33315|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0014.jpg|image/jpeg|1600|1200|0|257141||1644668942|1644668943470|0|0|0|0|||||||| +2408|33302|content://media/external/images/media/33302|/storage/emulated/0/DCIM/Camera/IMG_20220212_124529.jpg|image/jpeg|3200|1800|0|2406668||1644666331|1644666331094|1644666330239|0|0|0|||||||| +2409|33300|content://media/external/images/media/33300|/storage/emulated/0/DCIM/Camera/IMG_20220212_124524.jpg|image/jpeg|3200|1800|0|2499722||1644666326|1644666326654|1644666324545|0|0|0|||||||| +2410|33296|content://media/external/images/media/33296|/storage/emulated/0/DCIM/Camera/IMG_20220212_114228.jpg|image/jpeg|4608|2592|0|4706106||1644662551|1644662551144|1644662548792|0|0|0|||||||| +2411|33283|content://media/external/images/media/33283|/storage/emulated/0/DCIM/Camera/IMG_20220212_110619.jpg|image/jpeg|4608|2592|0|5437106||1644660383|1644660383923|1644660379981|0|0|0|||||||| +2412|33231|content://media/external/images/media/33231|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220211-WA0000.jpg|image/jpeg|1152|2048|0|156368||1644566532|1644566533002|0|0|0|0|||||||| +2413|33225|content://media/external/images/media/33225|/storage/emulated/0/DCIM/Camera/IMG_20220210_233640.jpg|image/jpeg|4608|2592|0|4817972||1644532601|1644532601773|1644532600433|0|0|0|||||||| +2414|33223|content://media/external/images/media/33223|/storage/emulated/0/DCIM/Camera/IMG_20220210_233636.jpg|image/jpeg|2592|4608|0|5271474||1644532598|1644532598801|1644532597128|0|0|0|||||||| +2415|33221|content://media/external/images/media/33221|/storage/emulated/0/DCIM/Camera/IMG_20220210_233634.jpg|image/jpeg|2592|4608|0|5208552||1644532596|1644532596573|1644532594535|0|0|0|||||||| +2416|33219|content://media/external/images/media/33219|/storage/emulated/0/DCIM/Camera/IMG_20220210_233530.jpg|image/jpeg|4608|2592|0|3328339||1644532532|1644532532705|1644532530561|0|0|0|||||||| +2417|33090|content://media/external/images/media/33090|/storage/emulated/0/DCIM/Camera/IMG_20220208_134346.jpg|image/jpeg|2592|4608|0|5405034||1644324228|1644324228390|1644324226509|0|0|0|||||||| +2418|33024|content://media/external/images/media/33024|/storage/emulated/0/DCIM/Screenshots/IMG_20220206_195232.jpg|image/jpeg|1425|978|0|383244||1644173553|1644173552982|0|0|0|0|||||||| +2419|33022|content://media/external/images/media/33022|/storage/emulated/0/DCIM/Screenshots/IMG_20220206_195144.jpg|image/jpeg|978|1425|0|382859||1644173504|1644173504818|0|0|0|0|||||||| +2420|33013|content://media/external/images/media/33013|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-02-06-15-41-58-289_com.google.android.gm.jpg|image/jpeg|1080|2400|0|487046||1644158518|1644158518432|0|0|0|0|||||||| +2421|32996|content://media/external/images/media/32996|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220206-WA0010.jpg|image/jpeg|1080|1920|0|142703||1644151065|1644151066891|0|0|0|0|||||||| +2422|32985|content://media/external/images/media/32985|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220206-WA0006.jpg|image/jpeg|1080|1920|0|203496||1644147954|1644147954710|0|0|0|0|||||||| +2423|32914|content://media/external/images/media/32914|/storage/emulated/0/DCIM/Camera/IMG_20220205_220932.jpg|image/jpeg|4608|2592|0|3138267||1644095373|1644095373138|1644092133150|0|0|0|||||||| +2424|32904|content://media/external/images/media/32904|/storage/emulated/0/DCIM/Camera/IMG_20220205_215634.jpg|image/jpeg|4608|2592|0|3323726||1644094595|1644094595706|1644092258146|0|0|0|||||||| +2425|32893|content://media/external/images/media/32893|/storage/emulated/0/DCIM/Camera/IMG_20220205_211737.jpg|image/jpeg|4608|2592|0|3408383||1644092260|1644092260655|1644092258146|0|0|0|||||||| +2426|32891|content://media/external/images/media/32891|/storage/emulated/0/DCIM/Camera/IMG_20220205_211732.jpg|image/jpeg|4608|2592|0|3200773||1644092256|1644092256787|1644092253339|0|0|0|||||||| +2427|32889|content://media/external/images/media/32889|/storage/emulated/0/DCIM/Camera/IMG_20220205_211620.jpg|image/jpeg|4608|2592|0|4221411||1644092182|1644092182299|1644092180833|0|0|0|||||||| +2428|32887|content://media/external/images/media/32887|/storage/emulated/0/DCIM/Camera/IMG_20220205_211535.jpg|image/jpeg|4608|2592|0|3053216||1644092137|1644092137111|1644092135779|0|0|0|||||||| +2429|32885|content://media/external/images/media/32885|/storage/emulated/0/DCIM/Camera/IMG_20220205_211532.jpg|image/jpeg|4608|2592|0|3089613||1644092135|1644092135167|1644092133150|0|0|0|||||||| +2430|32883|content://media/external/images/media/32883|/storage/emulated/0/DCIM/Camera/IMG_20220205_211526.jpg|image/jpeg|4608|2592|0|5332086||1644092127|1644092127891|1644092126760|0|0|0|||||||| +2431|32881|content://media/external/images/media/32881|/storage/emulated/0/DCIM/Camera/IMG_20220205_211506.jpg|image/jpeg|4608|2592|0|5400197||1644092108|1644092108319|1644092106817|0|0|0|||||||| +2432|32879|content://media/external/images/media/32879|/storage/emulated/0/DCIM/Camera/IMG_20220205_211337.jpg|image/jpeg|4608|2592|0|5452996||1644092019|1644092019927|1644092017761|0|0|0|||||||| +2433|32841|content://media/external/images/media/32841|/storage/emulated/0/DCIM/Camera/IMG_20220205_124947.jpg|image/jpeg|5120|2880|0|3155943||1644061788|1644061788909|1644061787186|0|0|0|||||||| +2434|32839|content://media/external/images/media/32839|/storage/emulated/0/DCIM/Camera/IMG_20220205_124914.jpg|image/jpeg|2592|4608|0|4423297||1644061756|1644061756697|1644061754425|0|0|0|||||||| +2435|32837|content://media/external/images/media/32837|/storage/emulated/0/DCIM/Camera/IMG_20220205_110141.jpg|image/jpeg|2592|4608|0|4395321||1644055302|1644055302819|1644055301345|0|0|0|||||||| +2436|32835|content://media/external/images/media/32835|/storage/emulated/0/DCIM/Camera/IMG_20220205_110100.jpg|image/jpeg|4608|2592|0|3537173||1644055263|1644055263519|1644055261141|0|0|0|||||||| +2437|32833|content://media/external/images/media/32833|/storage/emulated/0/DCIM/Camera/IMG_20220205_110039.jpg|image/jpeg|1800|3200|0|1960870||1644055240|1644055240451|1644055239413|0|0|0|||||||| +2438|32831|content://media/external/images/media/32831|/storage/emulated/0/DCIM/Camera/IMG_20220205_110021.jpg|image/jpeg|1800|3200|0|2215620||1644055223|1644055223819|1644055222590|0|0|0|||||||| +2439|32829|content://media/external/images/media/32829|/storage/emulated/0/DCIM/Camera/IMG_20220205_103642.jpg|image/jpeg|3200|1800|0|2238809||1644053803|1644053803781|1644053802798|0|0|0|||||||| +2440|32827|content://media/external/images/media/32827|/storage/emulated/0/DCIM/Camera/IMG_20220205_103638.jpg|image/jpeg|3200|1800|0|2206389||1644053800|1644053800597|1644053799226|0|0|0|||||||| +2441|32825|content://media/external/images/media/32825|/storage/emulated/0/DCIM/Camera/IMG_20220205_103626.jpg|image/jpeg|4608|2592|0|5227731||1644053790|1644053790569|1644053786272|0|0|0|||||||| +2442|32803|content://media/external/images/media/32803|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220204-WA0009.jpg|image/jpeg|1024|768|0|91480||1644002625|1644002625869|0|0|0|0|||||||| +2443|32789|content://media/external/images/media/32789|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220204-WA0004.jpg|image/jpeg|1532|2048|0|397015||1643987509|1643987663989|0|0|0|0|||||||| +2444|32374|content://media/external/images/media/32374|/storage/emulated/0/Pictures/Remini20220201223000490.jpg|image/jpeg|3476|2452|0|690212||1643751000|1643751000570|0|0|0|0|||||||| +2445|32380|content://media/external/images/media/32380|/storage/emulated/0/Pictures/_.thumbnails/1643751000623.jpg|image/jpeg|-1|-1|0|0||1643785986|1643751000634|0|0|0|0|||||||| +2446|32060|content://media/external/images/media/32060|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0032.jpg|image/jpeg|1532|2048|0|198749||1643580883|1643580884297|0|0|0|0|||||||| +2447|32057|content://media/external/images/media/32057|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0031.jpg|image/jpeg|1532|2048|0|222691||1643580882|1643580883639|0|0|0|0|||||||| +2448|32054|content://media/external/images/media/32054|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0030.jpg|image/jpeg|1532|2048|0|269902||1643580881|1643580882879|0|0|0|0|||||||| +2449|32051|content://media/external/images/media/32051|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0029.jpg|image/jpeg|1532|2048|0|236432||1643580880|1643580881976|0|0|0|0|||||||| +2450|32048|content://media/external/images/media/32048|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0028.jpg|image/jpeg|1532|2048|0|195151||1643580878|1643580880979|0|0|0|0|||||||| +2451|32038|content://media/external/images/media/32038|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0025.jpg|image/jpeg|1600|1179|0|243957||1643569450|1643569451296|0|0|0|0|||||||| +2452|32010|content://media/external/images/media/32010|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0009.jpg|image/jpeg|1532|2048|0|155840||1643561875|1643561876216|0|0|0|0|||||||| +2453|31892|content://media/external/images/media/31892|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220129-WA0000.jpg|image/jpeg|921|2048|0|88441||1643448166|1643448167583|0|0|0|0|||||||| +2454|31712|content://media/external/images/media/31712|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220126-WA0010.jpg|image/jpeg|720|1600|0|93783||1643225943|1643227149056|0|0|0|0|||||||| +2455|31603|content://media/external/images/media/31603|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220125-WA0000.jpg|image/jpeg|1197|1600|0|134711||1643091780|1643091781000|0|0|0|0|||||||| +2456|31606|content://media/external/images/media/31606|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220125-WA0001.jpg|image/jpeg|1197|1600|0|132548||1643091781|1643091781375|0|0|0|0|||||||| +2457|31609|content://media/external/images/media/31609|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220125-WA0002.jpg|image/jpeg|1197|1600|0|145215||1643091781|1643091781835|0|0|0|0|||||||| +2458|31503|content://media/external/images/media/31503|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220123-WA0002.jpg|image/jpeg|2048|1930|0|588830||1642943229|1642943230928|0|0|0|0|||||||| +2459|31418|content://media/external/images/media/31418|/storage/emulated/0/DCIM/Screenshots/Screenshot_2022-01-21-23-20-58-379_com.android.chrome.jpg|image/jpeg|1080|2400|0|399435||1642803658|1642803658537|0|0|0|0|||||||| +2460|31349|content://media/external/images/media/31349|/storage/emulated/0/DCIM/Camera/IMG_20220120_170424.jpg|image/jpeg|4608|2592|0|5133311||1642694666|1642694666136|1642694664658|0|0|0|||||||| +2461|31245|content://media/external/images/media/31245|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220118-WA0002.jpg|image/jpeg|946|2048|0|148479||1642522568|1642522569068|0|0|0|0|||||||| +2462|31226|content://media/external/images/media/31226|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220117-WA0016.jpg|image/jpeg|1197|1600|0|218381||1642453035|1642453036411|0|0|0|0|||||||| +2463|31223|content://media/external/images/media/31223|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220117-WA0015.jpg|image/jpeg|1197|1600|0|214602||1642453035|1642453035928|0|0|0|0|||||||| +2464|31180|content://media/external/images/media/31180|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220117-WA0004.jpg|image/jpeg|1536|2048|0|431713||1642413499|1642413500486|0|0|0|0|||||||| +2465|31136|content://media/external/images/media/31136|/storage/emulated/0/DCIM/Camera/IMG_20220116_124608.jpg|image/jpeg|2592|4608|0|5524649||1642333569|1642333570007|1642333568256|0|0|0|||||||| +2466|31003|content://media/external/images/media/31003|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220115-WA0019.jpg|image/jpeg|1532|2048|0|419816||1642264636|1642264637696|0|0|0|0|||||||| +2467|30653|content://media/external/images/media/30653|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220109-WA0021.jpg|image/jpeg|1600|900|0|70927||1641745260|1641745260553|0|0|0|0|||||||| +2468|30656|content://media/external/images/media/30656|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220109-WA0022.jpg|image/jpeg|1600|900|0|84904||1641745260|1641745260853|0|0|0|0|||||||| +2469|30647|content://media/external/images/media/30647|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220109-WA0019.jpg|image/jpeg|1599|899|0|63546||1641745259|1641745259759|0|0|0|0|||||||| +2470|30607|content://media/external/images/media/30607|/storage/emulated/0/DCIM/ReactNative-snapshot-image2335675742430269525.png|image/png|948|2513|0|278259||1641731629|1641731629917|0|0|0|0|||||||| +2471|30213|content://media/external/images/media/30213|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220104-WA0002.jpg|image/jpeg|2048|1532|0|181956||1641291064|1641291070058|0|0|0|0|||||||| +2472|30210|content://media/external/images/media/30210|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220104-WA0001.jpg|image/jpeg|1532|2048|0|188031||1641291052|1641291053354|0|0|0|0|||||||| +2473|30207|content://media/external/images/media/30207|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220104-WA0000.jpg|image/jpeg|1532|2048|0|163395||1641291047|1641291049320|0|0|0|0|||||||| +2474|30064|content://media/external/images/media/30064|/storage/emulated/0/android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220101-WA0029.jpg|image/jpeg|2048|1536|0|156887||1641133457|1641041844000|0|0|0|0|||||||| +2475|29978|content://media/external/images/media/29978|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220101-WA0028.jpg|image/jpeg|2048|1536|0|159386||1641041843|1641041843762|0|0|0|0|||||||| +2476|29939|content://media/external/images/media/29939|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220101-WA0017.jpg|image/jpeg|2048|1365|0|796504||1641028104|1641028105309|0|0|0|0|||||||| +2477|29916|content://media/external/images/media/29916|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220101-WA0012.jpg|image/jpeg|1472|1104|0|113982||1640997746|1640997747264|0|0|0|0|||||||| +2478|29712|content://media/external/images/media/29712|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211231-WA0012.jpg|image/jpeg|1599|899|0|185806||1640950381|1640950381487|0|0|0|0|||||||| +2479|29715|content://media/external/images/media/29715|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211231-WA0013.jpg|image/jpeg|899|1599|0|121098||1640950381|1640950381934|0|0|0|0|||||||| +2480|29311|content://media/external/images/media/29311|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211227-WA0005.jpg|image/jpeg|873|732|0|317875||1640604631|1640606110910|0|0|0|0|||||||| +2481|29298|content://media/external/images/media/29298|/storage/emulated/0/DCIM/Camera/IMG_20211227_084735.jpg|image/jpeg|2592|4608|0|4852891||1640591257|1640591257385|1640591255506|0|0|0|||||||| +2482|29151|content://media/external/images/media/29151|/storage/emulated/0/DCIM/Camera/IMG_20211225_143846.jpg|image/jpeg|4184|1007|0|1122400||1640439526|1640439526788|1640439498687|0|0|0|||||||| +2483|28865|content://media/external/images/media/28865|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211224-WA0014.jpg|image/jpeg|1197|1600|0|208900||1640364106|1640364107185|0|0|0|0|||||||| +2484|28862|content://media/external/images/media/28862|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211224-WA0013.jpg|image/jpeg|1197|1600|0|268166||1640355004|1640355005065|0|0|0|0|||||||| +2485|28859|content://media/external/images/media/28859|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211224-WA0012.jpg|image/jpeg|1600|1197|0|322883||1640354998|1640354999286|0|0|0|0|||||||| +2486|28814|content://media/external/images/media/28814|/storage/emulated/0/DCIM/Camera/IMG_20211223_223433.jpg|image/jpeg|3950|715|0|907598||1640295274|1640295274021|1638443369887|0|0|0|||||||| +2487|28802|content://media/external/images/media/28802|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0033.jpg|image/jpeg|1200|1600|0|171724||1640292626|1640292626701|0|0|0|0|||||||| +2488|28779|content://media/external/images/media/28779|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0027.jpg|image/jpeg|1200|1600|0|173944||1640292586|1640292587039|0|0|0|0|||||||| +2489|28713|content://media/external/images/media/28713|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0016.jpg|image/jpeg|1157|1066|0|123524||1640275213|1640275213815|0|0|0|0|||||||| +2490|28711|content://media/external/images/media/28711|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0015.jpg|image/jpeg|1600|1066|0|343394||1640275103|1640275103393|0|0|0|0|||||||| +2491|28704|content://media/external/images/media/28704|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0012.jpg|image/jpeg|720|1600|0|136022||1640272747|1640272747912|0|0|0|0|||||||| +2492|20909|content://media/external/images/media/20909|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20211219-WA0017.jpg|image/jpeg|768|1024|0|192238||1639928157|1639928158437|0|0|0|0|||||||| +2493|20904|content://media/external/images/media/20904|/storage/emulated/0/DCIM/Camera/IMG_20211219_160804_1.jpg|image/jpeg|2592|4608|0|4576388||1639926486|1639926486368|1639926485130|0|0|0|||||||| +2494|20902|content://media/external/images/media/20902|/storage/emulated/0/DCIM/Camera/IMG_20211219_160804.jpg|image/jpeg|2592|4608|0|4347123||1639926485|1639926485904|1639926484328|0|0|0|||||||| +2495|20900|content://media/external/images/media/20900|/storage/emulated/0/DCIM/Camera/IMG_20211219_160802.jpg|image/jpeg|2592|4608|0|5132815||1639926484|1639926484336|1639926482897|0|0|0|||||||| +2496|20899|content://media/external/images/media/20899|/storage/emulated/0/DCIM/Camera/IMG_20211219_160801.jpg|image/jpeg|2592|4608|0|5088597||1639926483|1639926483952|1639926481497|0|0|0|||||||| +2497|20895|content://media/external/images/media/20895|/storage/emulated/0/DCIM/Camera/IMG_20211219_160346.jpg|image/jpeg|2592|4608|0|5096585||1639926227|1639926227664|1639926226525|0|0|0|||||||| +2498|20894|content://media/external/images/media/20894|/storage/emulated/0/DCIM/Camera/IMG_20211219_160345.jpg|image/jpeg|2592|4608|0|5079473||1639926226|1639926226776|1639926225356|0|0|0|||||||| +2499|20892|content://media/external/images/media/20892|/storage/emulated/0/DCIM/Camera/IMG_20211219_160313.jpg|image/jpeg|2592|4608|0|4765984||1639926195|1639926195040|1639926193543|0|0|0|||||||| +2500|20888|content://media/external/images/media/20888|/storage/emulated/0/DCIM/Camera/IMG_20211219_160157.jpg|image/jpeg|1800|3200|0|2530067||1639926118|1639926118977|1639926118176|0|0|0|||||||| +2501|20886|content://media/external/images/media/20886|/storage/emulated/0/DCIM/Camera/IMG_20211219_160155.jpg|image/jpeg|1800|3200|0|2631687||1639926117|1639926117317|1639926115942|0|0|0|||||||| +2502|20882|content://media/external/images/media/20882|/storage/emulated/0/DCIM/Camera/IMG_20211219_155841.jpg|image/jpeg|2592|4608|0|5494433||1639925922|1639925922871|1639925921497|0|0|0|||||||| +2503|20880|content://media/external/images/media/20880|/storage/emulated/0/DCIM/Camera/IMG_20211219_155823.jpg|image/jpeg|4608|2592|0|5445175||1639925905|1639925905031|1639925904130|0|0|0|||||||| +2504|20878|content://media/external/images/media/20878|/storage/emulated/0/DCIM/Camera/IMG_20211219_155811.jpg|image/jpeg|4608|2592|0|4896114||1639925893|1639925893751|1639925891947|0|0|0|||||||| +2505|20875|content://media/external/images/media/20875|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0012.jpg|image/jpeg|1536|2048|0|679965||1639924668|1639924668942|0|0|0|0|||||||| +2506|20867|content://media/external/images/media/20867|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0010.jpg|image/jpeg|2048|1536|0|418669||1639921667|1639921667698|0|0|0|0|||||||| +2507|20864|content://media/external/images/media/20864|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0009.jpg|image/jpeg|1532|2048|0|279483||1639919090|1639919091769|0|0|0|0|||||||| +2508|20858|content://media/external/images/media/20858|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0007.jpg|image/jpeg|1080|700|0|97173||1639918852|1639918853078|0|0|0|0|||||||| +2509|20861|content://media/external/images/media/20861|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0008.jpg|image/jpeg|1080|700|0|88189||1639918853|1639918853436|0|0|0|0|||||||| +2510|20852|content://media/external/images/media/20852|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0005.jpg|image/jpeg|1080|1137|0|150811||1639918851|1639918852294|0|0|0|0|||||||| +2511|20855|content://media/external/images/media/20855|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0006.jpg|image/jpeg|1080|700|0|157442||1639918852|1639918852833|0|0|0|0|||||||| +2512|20849|content://media/external/images/media/20849|/storage/emulated/0/DCIM/Camera/IMG_20211219_133038.jpg|image/jpeg|3200|1800|0|1897384||1639917040|1639917040018|1639917038932|0|0|0|||||||| +2513|20748|content://media/external/images/media/20748|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211216-WA0014.jpg|image/jpeg|1600|1200|0|156876||1639686121|1639686122453|0|0|0|0|||||||| +2514|20343|content://media/external/images/media/20343|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211209-WA0005.jpg|image/jpeg|921|2048|0|119039||1639062987|1639062988150|0|0|0|0|||||||| +2515|20300|content://media/external/images/media/20300|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211208-WA0021.jpg|image/jpeg|1086|1448|0|181199||1638992235|1638992236246|0|0|0|0|||||||| +2516|20132|content://media/external/images/media/20132|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0013.jpg|image/jpeg|1197|1600|0|276147||1638892289|1638898180250|0|0|0|0|||||||| +2517|20135|content://media/external/images/media/20135|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0014.jpg|image/jpeg|1197|1600|0|329110||1638892291|1638898180990|0|0|0|0|||||||| +2518|20141|content://media/external/images/media/20141|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0016.jpg|image/jpeg|1600|1197|0|312384||1638892293|1638898180772|0|0|0|0|||||||| +2519|20144|content://media/external/images/media/20144|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0017.jpg|image/jpeg|1600|1197|0|243102||1638892294|1638898180483|0|0|0|0|||||||| +2520|20088|content://media/external/images/media/20088|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0002.jpg|image/jpeg|1197|1600|0|185087||1638874664|1638898179923|0|0|0|0|||||||| +2521|20193|content://media/external/images/media/20193|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0037.jpg|image/jpeg|1600|1197|0|323348||1638898175|1638898176424|0|0|0|0|||||||| +2522|20190|content://media/external/images/media/20190|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0036.jpg|image/jpeg|1296|970|0|135458||1638898174|1638898175078|0|0|0|0|||||||| +2523|20085|content://media/external/images/media/20085|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0001.jpg|image/jpeg|1197|1600|0|192104||1638874653|1638892321020|0|0|0|0|||||||| +2524|20170|content://media/external/images/media/20170|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0025.jpg|image/jpeg|1600|1197|0|277874||1638892319|1638892320027|0|0|0|0|||||||| +2525|20173|content://media/external/images/media/20173|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0026.jpg|image/jpeg|1600|1197|0|287537||1638892320|1638892320908|0|0|0|0|||||||| +2526|20163|content://media/external/images/media/20163|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0023.jpg|image/jpeg|2048|1532|0|479876||1638892309|1638892311444|0|0|0|0|||||||| +2527|20160|content://media/external/images/media/20160|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0022.jpg|image/jpeg|2048|1532|0|281673||1638892308|1638892309956|0|0|0|0|||||||| +2528|20157|content://media/external/images/media/20157|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0021.jpg|image/jpeg|2048|1532|0|275096||1638892307|1638892308631|0|0|0|0|||||||| +2529|20154|content://media/external/images/media/20154|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0020.jpg|image/jpeg|1532|2048|0|445528||1638892305|1638892307242|0|0|0|0|||||||| +2530|20151|content://media/external/images/media/20151|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0019.jpg|image/jpeg|1532|2048|0|441798||1638892304|1638892305835|0|0|0|0|||||||| +2531|20138|content://media/external/images/media/20138|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0015.jpg|image/jpeg|1197|1600|0|339570||1638892292|1638892293316|0|0|0|0|||||||| +2532|20129|content://media/external/images/media/20129|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0012.jpg|image/jpeg|1197|1600|0|332998||1638892288|1638892289860|0|0|0|0|||||||| +2533|20126|content://media/external/images/media/20126|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0011.jpg|image/jpeg|1197|1600|0|116527||1638892287|1638892288672|0|0|0|0|||||||| +2534|20116|content://media/external/images/media/20116|/storage/emulated/0/DCIM/Camera/IMG_20211207_155952.jpg|image/jpeg|4608|2592|0|5716113||1638889194|1638889194017|1638889192547|0|0|0|||||||| +2535|20114|content://media/external/images/media/20114|/storage/emulated/0/DCIM/Camera/IMG_20211207_154908.jpg|image/jpeg|3200|1800|0|2637611||1638888550|1638888550106|1638888549142|0|0|0|||||||| +2536|20112|content://media/external/images/media/20112|/storage/emulated/0/DCIM/Camera/IMG_20211207_154904.jpg|image/jpeg|2592|4608|0|4876675||1638888545|1638888545750|1638888544347|0|0|0|||||||| +2537|20110|content://media/external/images/media/20110|/storage/emulated/0/DCIM/Camera/IMG_20211207_154633.jpg|image/jpeg|4608|2592|0|5674702||1638888395|1638888395121|1638888393934|0|0|0|||||||| +2538|20108|content://media/external/images/media/20108|/storage/emulated/0/DCIM/Camera/IMG_20211207_154348.jpg|image/jpeg|1800|3200|0|2567812||1638888230|1638888230480|1638888229141|0|0|0|||||||| +2539|20106|content://media/external/images/media/20106|/storage/emulated/0/DCIM/Camera/IMG_20211207_154139.jpg|image/jpeg|4608|2592|0|4765770||1638888101|1638888101723|1638888100112|0|0|0|||||||| +2540|20105|content://media/external/images/media/20105|/storage/emulated/0/DCIM/Camera/IMG_20211207_144037.jpg|image/jpeg|2592|4608|0|4094805||1638884439|1638884439302|1638884437972|0|0|0|||||||| +2541|20103|content://media/external/images/media/20103|/storage/emulated/0/DCIM/Camera/IMG_20211207_144034.jpg|image/jpeg|2592|4608|0|4720660||1638884437|1638884437350|1638884434421|0|0|0|||||||| +2542|20100|content://media/external/images/media/20100|/storage/emulated/0/DCIM/Camera/IMG_20211207_125751.jpg|image/jpeg|4608|2592|0|5657817||1638878273|1638878273500|1638878272281|0|0|0|||||||| +2543|20098|content://media/external/images/media/20098|/storage/emulated/0/DCIM/Camera/IMG_20211207_125747.jpg|image/jpeg|3200|1800|0|2235303||1638878268|1638878268768|1638878267931|0|0|0|||||||| +2544|20096|content://media/external/images/media/20096|/storage/emulated/0/DCIM/Camera/IMG_20211207_125744.jpg|image/jpeg|1800|3200|0|2313731||1638878266|1638878266876|1638878265101|0|0|0|||||||| +2545|20094|content://media/external/images/media/20094|/storage/emulated/0/DCIM/Camera/IMG_20211207_125733.jpg|image/jpeg|4608|2592|0|5670664||1638878255|1638878255956|1638878254660|0|0|0|||||||| +2546|20091|content://media/external/images/media/20091|/storage/emulated/0/DCIM/Camera/IMG_20211207_121202.jpg|image/jpeg|4608|2592|0|5091399||1638875524|1638875524269|1638875522455|0|0|0|||||||| +2547|20083|content://media/external/images/media/20083|/storage/emulated/0/DCIM/Camera/IMG_20211207_100609.jpg|image/jpeg|4608|2592|0|5346204||1638867972|1638867972784|1638867970177|0|0|0|||||||| +2548|20061|content://media/external/images/media/20061|/storage/emulated/0/DCIM/Camera/IMG_20211206_211429.jpg|image/jpeg|1800|3200|0|3209639||1638821671|1638821671615|1638821670200|0|0|0|||||||| +2549|20059|content://media/external/images/media/20059|/storage/emulated/0/DCIM/Camera/IMG_20211206_211346.jpg|image/jpeg|2592|4608|0|6305014||1638821628|1638821628307|1638821626355|0|0|0|||||||| +2550|19982|content://media/external/images/media/19982|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0016.jpg|image/jpeg|1197|1600|0|273368||1638803408|1638820232103|0|0|0|0|||||||| +2551|20048|content://media/external/images/media/20048|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0059.jpg|image/jpeg|899|1599|0|109895||1638820231|1638820232033|0|0|0|0|||||||| +2552|20052|content://media/external/images/media/20052|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0060.jpg|image/jpeg|1600|900|0|210560||1638820232|1638820232541|0|0|0|0|||||||| +2553|20055|content://media/external/images/media/20055|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0061.jpg|image/jpeg|899|1599|0|148697||1638820232|1638820232928|0|0|0|0|||||||| +2554|20045|content://media/external/images/media/20045|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0058.jpg|image/jpeg|900|1600|0|278557||1638820230|1638820231681|0|0|0|0|||||||| +2555|19891|content://media/external/images/media/19891|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0004.jpg|image/jpeg|900|1600|0|233066||1638791362|1638820230634|0|0|0|0|||||||| +2556|20037|content://media/external/images/media/20037|/storage/emulated/0/DCIM/Camera/IMG_20211206_203646.jpg|image/jpeg|1437|2319|0|1343971||1638819407|1638819406905|1638819406000|0|0|0|||||||| +2557|20036|content://media/external/images/media/20036|/storage/emulated/0/DCIM/Camera/IMG_20211206_203454.jpg|image/jpeg|2478|4405|0|4131388||1638819295|1638819294937|1638819294000|0|0|0|||||||| +2558|19991|content://media/external/images/media/19991|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0018.jpg|image/jpeg|1197|1600|0|84813||1638816111|1638816112082|0|0|0|0|||||||| +2559|19985|content://media/external/images/media/19985|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0017.jpg|image/jpeg|720|1600|0|118393||1638806227|1638806228242|0|0|0|0|||||||| +2560|19976|content://media/external/images/media/19976|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0014.jpg|image/jpeg|1600|1197|0|183445||1638803407|1638803408509|0|0|0|0|||||||| +2561|19979|content://media/external/images/media/19979|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0015.jpg|image/jpeg|1290|540|0|105609||1638803408|1638803408956|0|0|0|0|||||||| +2562|19973|content://media/external/images/media/19973|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0013.jpg|image/jpeg|1197|1600|0|159064||1638803406|1638803407618|0|0|0|0|||||||| +2563|19971|content://media/external/images/media/19971|/storage/emulated/0/DCIM/Camera/IMG_20211206_160510.jpg|image/jpeg|2592|4608|0|7183965||1638803115|1638803115446|1638803110520|0|0|0|||||||| +2564|19963|content://media/external/images/media/19963|/storage/emulated/0/DCIM/Camera/IMG_20211206_152057.jpg|image/jpeg|1800|3200|0|1515529||1638800458|1638800458956|1638800457749|0|0|0|||||||| +2565|19961|content://media/external/images/media/19961|/storage/emulated/0/DCIM/Camera/IMG_20211206_152051.jpg|image/jpeg|2592|4608|0|4920744||1638800453|1638800453212|1638800451311|0|0|0|||||||| +2566|19959|content://media/external/images/media/19959|/storage/emulated/0/DCIM/Camera/IMG_20211206_150922.jpg|image/jpeg|4608|2592|0|4812559||1638799763|1638799763492|1638799762364|0|0|0|||||||| +2567|19958|content://media/external/images/media/19958|/storage/emulated/0/DCIM/Camera/PANO_20211206_150752.jpg|image/jpeg|9680|4320|0|30058063||1638799685|1638799685648|1638799672934|0|0|0|||||||| +2568|19955|content://media/external/images/media/19955|/storage/emulated/0/DCIM/Camera/IMG_20211206_150647.jpg|image/jpeg|4608|2592|0|5558042||1638799608|1638799608918|1638799607758|0|0|0|||||||| +2569|19953|content://media/external/images/media/19953|/storage/emulated/0/DCIM/Camera/IMG_20211206_150605.jpg|image/jpeg|4608|2592|0|6299877||1638799566|1638799566826|1638799565348|0|0|0|||||||| +2570|19951|content://media/external/images/media/19951|/storage/emulated/0/DCIM/Camera/IMG_20211206_150551.jpg|image/jpeg|2592|4608|0|5608528||1638799553|1638799553302|1638799552420|0|0|0|||||||| +2571|19949|content://media/external/images/media/19949|/storage/emulated/0/DCIM/Camera/IMG_20211206_150216.jpg|image/jpeg|3200|1800|0|1896393||1638799338|1638799338446|1638799337267|0|0|0|||||||| +2572|19947|content://media/external/images/media/19947|/storage/emulated/0/DCIM/Camera/IMG_20211206_150212.jpg|image/jpeg|4608|2592|0|5228928||1638799334|1638799334390|1638799332355|0|0|0|||||||| +2573|19945|content://media/external/images/media/19945|/storage/emulated/0/DCIM/Camera/IMG_20211206_150202.jpg|image/jpeg|4608|2592|0|4361325||1638799323|1638799323682|1638799322584|0|0|0|||||||| +2574|19943|content://media/external/images/media/19943|/storage/emulated/0/DCIM/Camera/IMG_20211206_150148.jpg|image/jpeg|4608|2592|0|4221835||1638799310|1638799310650|1638799308998|0|0|0|||||||| +2575|19941|content://media/external/images/media/19941|/storage/emulated/0/DCIM/Camera/IMG_20211206_145850.jpg|image/jpeg|3200|1800|0|2614160||1638799132|1638799132383|1638799131182|0|0|0|||||||| +2576|19937|content://media/external/images/media/19937|/storage/emulated/0/DCIM/Camera/IMG_20211206_145135.jpg|image/jpeg|3200|1800|0|2299341||1638798696|1638798696797|1638798695795|0|0|0|||||||| +2577|19938|content://media/external/images/media/19938|/storage/emulated/0/DCIM/Camera/IMG_20211206_145135_1.jpg|image/jpeg|3200|1800|0|2092646||1638798696|1638798696905|1638798696186|0|0|0|||||||| +2578|19935|content://media/external/images/media/19935|/storage/emulated/0/DCIM/Camera/IMG_20211206_145128.jpg|image/jpeg|1800|3200|0|2533480||1638798690|1638798690829|1638798689195|0|0|0|||||||| +2579|19916|content://media/external/images/media/19916|/storage/emulated/0/DCIM/Camera/IMG_20211206_141947.jpg|image/jpeg|1800|3200|0|2616657||1638796788|1638796788646|1638796787567|0|0|0|||||||| +2580|19914|content://media/external/images/media/19914|/storage/emulated/0/DCIM/Camera/IMG_20211206_141926.jpg|image/jpeg|1800|3200|0|2632826||1638796768|1638796768510|1638796767113|0|0|0|||||||| +2581|19912|content://media/external/images/media/19912|/storage/emulated/0/DCIM/Camera/IMG_20211206_141917.jpg|image/jpeg|2592|4608|0|5459240||1638796758|1638796758810|1638796757359|0|0|0|||||||| +2582|19910|content://media/external/images/media/19910|/storage/emulated/0/DCIM/Camera/IMG_20211206_141541.jpg|image/jpeg|2592|4608|0|5525842||1638796543|1638796543222|1638796541488|0|0|0|||||||| +2583|19900|content://media/external/images/media/19900|/storage/emulated/0/DCIM/Camera/IMG_20211206_141442.jpg|image/jpeg|2592|4608|0|5060157||1638796483|1638796483766|1638796482471|0|0|0|||||||| +2584|19898|content://media/external/images/media/19898|/storage/emulated/0/DCIM/Camera/IMG_20211206_141435.jpg|image/jpeg|2592|4608|0|4984744||1638796477|1638796478010|1638796476208|0|0|0|||||||| +2585|19882|content://media/external/images/media/19882|/storage/emulated/0/DCIM/Camera/IMG_20211206_120500.jpg|image/jpeg|3200|1800|0|2716285||1638788702|1638788702085|1638788700654|0|0|0|||||||| +2586|19880|content://media/external/images/media/19880|/storage/emulated/0/DCIM/Camera/IMG_20211206_120409.jpg|image/jpeg|4608|2592|0|5721332||1638788650|1638788651017|1638788649745|0|0|0|||||||| +2587|19878|content://media/external/images/media/19878|/storage/emulated/0/DCIM/Camera/IMG_20211206_114914.jpg|image/jpeg|1800|3200|0|2780405||1638787756|1638787756249|1638787755450|0|0|0|||||||| +2588|19876|content://media/external/images/media/19876|/storage/emulated/0/DCIM/Camera/IMG_20211206_114904.jpg|image/jpeg|2592|4608|0|5049476||1638787746|1638787746269|1638787744963|0|0|0|||||||| +2589|19874|content://media/external/images/media/19874|/storage/emulated/0/DCIM/Camera/IMG_20211206_114756.jpg|image/jpeg|1800|3200|0|2735559||1638787677|1638787677729|1638787676394|0|0|0|||||||| +2590|19872|content://media/external/images/media/19872|/storage/emulated/0/DCIM/Camera/IMG_20211206_114306.jpg|image/jpeg|2592|4608|0|5239629||1638787388|1638787388113|1638787386586|0|0|0|||||||| +2591|19865|content://media/external/images/media/19865|/storage/emulated/0/DCIM/Camera/IMG_20211206_102859.jpg|image/jpeg|1800|3200|0|2817708||1638782941|1638782941101|1638782939486|0|0|0|||||||| +2592|19860|content://media/external/images/media/19860|/storage/emulated/0/DCIM/Camera/IMG_20211206_100537.jpg|image/jpeg|2592|4608|0|6377492||1638781539|1638781539832|1638781538132|0|0|0|||||||| +2593|19858|content://media/external/images/media/19858|/storage/emulated/0/DCIM/Camera/IMG_20211206_100507.jpg|image/jpeg|4608|2592|0|6551911||1638781508|1638781508548|1638781507478|0|0|0|||||||| +2594|19854|content://media/external/images/media/19854|/storage/emulated/0/DCIM/Camera/IMG_20211206_100502.jpg|image/jpeg|4608|2592|0|6438226||1638781503|1638781504032|1638781502679|0|0|0|||||||| +2595|19855|content://media/external/images/media/19855|/storage/emulated/0/DCIM/Camera/IMG_20211206_100503.jpg|image/jpeg|4608|2592|0|6398307||1638781504|1638781504896|1638781503781|0|0|0|||||||| +2596|19852|content://media/external/images/media/19852|/storage/emulated/0/DCIM/Camera/IMG_20211206_100434.jpg|image/jpeg|4608|2592|0|5096663||1638781476|1638781476304|1638781475450|0|0|0|||||||| +2597|19850|content://media/external/images/media/19850|/storage/emulated/0/DCIM/Camera/IMG_20211206_100354.jpg|image/jpeg|4608|2592|0|5824790||1638781437|1638781437264|1638781434403|0|0|0|||||||| +2598|19848|content://media/external/images/media/19848|/storage/emulated/0/DCIM/Camera/IMG_20211206_100342.jpg|image/jpeg|4608|2592|0|6198435||1638781424|1638781424924|1638781422369|0|0|0|||||||| +2599|19830|content://media/external/images/media/19830|/storage/emulated/0/DCIM/Camera/IMG_20211205_205452.jpg|image/jpeg|2592|4608|0|5222180||1638734094|1638734094047|1638734092431|0|0|0|||||||| +2600|19823|content://media/external/images/media/19823|/storage/emulated/0/DCIM/Camera/IMG_20211205_192710.jpg|image/jpeg|2592|4608|0|4047109||1638728831|1638728831825|1638728830902|0|0|0|||||||| +2601|19821|content://media/external/images/media/19821|/storage/emulated/0/DCIM/Camera/IMG_20211205_192709.jpg|image/jpeg|2592|4608|0|4122591||1638728830|1638728830333|1638728829458|0|0|0|||||||| +2602|19818|content://media/external/images/media/19818|/storage/emulated/0/DCIM/Camera/IMG_20211205_192705.jpg|image/jpeg|2592|4608|0|4389483||1638728826|1638728826753|1638728825690|0|0|0|||||||| +2603|19817|content://media/external/images/media/19817|/storage/emulated/0/DCIM/Camera/IMG_20211205_192704.jpg|image/jpeg|2592|4608|0|4501878||1638728825|1638728825821|1638728824366|0|0|0|||||||| +2604|19814|content://media/external/images/media/19814|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211205-WA0024.jpg|image/jpeg|899|1599|0|141961||1638728269|1638728271946|0|0|0|0|||||||| +2605|19802|content://media/external/images/media/19802|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20211205-WA0021.jpg|image/jpeg|1600|1197|0|156818||1638710057|1638710057877|0|0|0|0|||||||| +2606|19799|content://media/external/images/media/19799|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20211205-WA0020.jpg|image/jpeg|1197|1600|0|176240||1638710043|1638710044318|0|0|0|0|||||||| +2607|19770|content://media/external/images/media/19770|/storage/emulated/0/DCIM/Camera/IMG_20211205_133014.jpg|image/jpeg|2592|4608|0|4626061||1638707416|1638707416737|1638707414646|0|0|0|||||||| +2608|19558|content://media/external/images/media/19558|/storage/emulated/0/DCIM/Camera/IMG_20211202_120929.jpg|image/jpeg|4608|2592|0|5184558||1638443371|1638443371066|1638443369887|0|0|0|||||||| +2609|19526|content://media/external/images/media/19526|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211201-WA0006.jpg|image/jpeg|1128|1504|0|194115||1638370263|1638370263769|0|0|0|0|||||||| +2610|19292|content://media/external/images/media/19292|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211128-WA0006.jpg|image/jpeg|1536|2048|0|481698||1638108725|1638108739686|0|0|0|0|||||||| +2611|11726|content://media/external/images/media/11726|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-11-26-21-35-40-219_com.google.android.apps.photos.jpg|image/jpeg|1080|2400|0|1367240||1637958940|1637958940330|0|0|0|0|||||||| +2612|11628|content://media/external/images/media/11628|/storage/emulated/0/DCIM/Camera/IMG_20211125_115144.jpg|image/jpeg|4608|2592|0|3765558||1637837506|1637837506345|1637837504987|0|0|0|||||||| +2613|11196|content://media/external/images/media/11196|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211124-WA0019.jpg|image/jpeg|1536|2048|0|496107||1637780954|1637780960244|0|0|0|0|||||||| +2614|11155|content://media/external/images/media/11155|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-11-24-14-38-59-101_com.google.android.gm.jpg|image/jpeg|1080|2400|0|365934||1637761139|1637761139166|0|0|0|0|||||||| +2615|11124|content://media/external/images/media/11124|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211124-WA0001.jpg|image/jpeg|1536|2048|0|555244||1637751767|1637751768956|0|0|0|0|||||||| +2616|11093|content://media/external/images/media/11093|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211123-WA0005.jpg|image/jpeg|720|866|0|90900||1637701917|1637701918649|0|0|0|0|||||||| +2617|7443|content://media/external/images/media/7443|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211121-WA0008.jpg|image/jpeg|899|1599|0|186270||1637518223|1637497478000|0|0|0|0|||||||| +2618|7476|content://media/external/images/media/7476|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211120-WA0005.jpg|image/jpeg|1153|2048|0|299392||1637518223|1637411924000|0|0|0|0|||||||| +2619|7175|content://media/external/images/media/7175|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211118-WA0017.jpg|image/jpeg|576|1024|0|18543||1637518222|1637274180000|0|0|0|0|||||||| +2620|2763|content://media/external/images/media/2763|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-11-17-19-32-05-781_it.subito.jpg|image/jpeg|1080|2340|0|403835||1637500987|1637173926000|0|0|0|0|||||||| +2621|7114|content://media/external/images/media/7114|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211107-WA0009.jpg|image/jpeg|2048|1536|0|227969||1637518222|1636289209000|0|0|0|0|||||||| +2622|7079|content://media/external/images/media/7079|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211107-WA0007.jpg|image/jpeg|1536|2048|0|438473||1637518222|1636285786000|0|0|0|0|||||||| +2623|7562|content://media/external/images/media/7562|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0030.jpg|image/jpeg|1440|1440|0|309654||1637518223|1635875332000|0|0|0|0|||||||| +2624|7348|content://media/external/images/media/7348|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0029.jpg|image/jpeg|1440|1440|0|286381||1637518223|1635872296000|0|0|0|0|||||||| +2625|7523|content://media/external/images/media/7523|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0024.jpg|image/jpeg|1200|1600|0|406742||1637518223|1635859569000|0|0|0|0|||||||| +2626|7475|content://media/external/images/media/7475|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0023.jpg|image/jpeg|1200|1600|0|255027||1637518223|1635859568000|0|0|0|0|||||||| +2627|7204|content://media/external/images/media/7204|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0022.jpg|image/jpeg|1200|1600|0|230532||1637518223|1635859567000|0|0|0|0|||||||| +2628|7470|content://media/external/images/media/7470|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0021.jpg|image/jpeg|1200|1600|0|463648||1637518223|1635859567000|0|0|0|0|||||||| +2629|7282|content://media/external/images/media/7282|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0019.jpg|image/jpeg|1600|1200|0|353747||1637518223|1635859565000|0|0|0|0|||||||| +2630|7517|content://media/external/images/media/7517|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0020.jpg|image/jpeg|1600|1200|0|225325||1637518223|1635859565000|0|0|0|0|||||||| +2631|7078|content://media/external/images/media/7078|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0017.jpg|image/jpeg|1600|1200|0|288103||1637518222|1635859563000|0|0|0|0|||||||| +2632|7236|content://media/external/images/media/7236|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0018.jpg|image/jpeg|1200|1600|0|276512||1637518223|1635859563000|0|0|0|0|||||||| +2633|7235|content://media/external/images/media/7235|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0016.jpg|image/jpeg|1200|1600|0|361926||1637518223|1635859562000|0|0|0|0|||||||| +2634|7515|content://media/external/images/media/7515|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0015.jpg|image/jpeg|1600|1200|0|367313||1637518223|1635859561000|0|0|0|0|||||||| +2635|7234|content://media/external/images/media/7234|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0014.jpg|image/jpeg|1600|1200|0|405436||1637518223|1635859560000|0|0|0|0|||||||| +2636|7110|content://media/external/images/media/7110|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0013.jpg|image/jpeg|1600|1200|0|389496||1637518222|1635859559000|0|0|0|0|||||||| +2637|7203|content://media/external/images/media/7203|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0012.jpg|image/jpeg|1600|1200|0|392602||1637518223|1635859558000|0|0|0|0|||||||| +2638|7383|content://media/external/images/media/7383|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0011.jpg|image/jpeg|1600|1200|0|301627||1637518223|1635859557000|0|0|0|0|||||||| +2639|7137|content://media/external/images/media/7137|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0010.jpg|image/jpeg|1600|1200|0|333548||1637518222|1635859556000|0|0|0|0|||||||| +2640|7233|content://media/external/images/media/7233|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0009.jpg|image/jpeg|1200|1600|0|184599||1637518223|1635859555000|0|0|0|0|||||||| +2641|7330|content://media/external/images/media/7330|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0008.jpg|image/jpeg|1200|1600|0|204388||1637518223|1635859553000|0|0|0|0|||||||| +2642|7202|content://media/external/images/media/7202|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0007.jpg|image/jpeg|1200|1600|0|183687||1637518223|1635859551000|0|0|0|0|||||||| +2643|7516|content://media/external/images/media/7516|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0006.jpg|image/jpeg|1600|1200|0|167469||1637518223|1635859550000|0|0|0|0|||||||| +2644|7441|content://media/external/images/media/7441|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0052.jpg|image/jpeg|1536|2048|0|292779||1637518223|1635797191000|0|0|0|0|||||||| +2645|7238|content://media/external/images/media/7238|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0051.jpg|image/jpeg|2048|1536|0|373903||1637518223|1635797190000|0|0|0|0|||||||| +2646|7347|content://media/external/images/media/7347|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0050.jpg|image/jpeg|1536|2048|0|333073||1637518223|1635797189000|0|0|0|0|||||||| +2647|7384|content://media/external/images/media/7384|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0049.jpg|image/jpeg|1536|2048|0|298965||1637518223|1635797188000|0|0|0|0|||||||| +2648|3756|content://media/external/images/media/3756|/storage/emulated/0/DCIM/Camera/IMG_20211101_205653.jpg|image/jpeg|4000|2250|0|3889002||1637503488|1635796615000|1635796615150|0|0|0|||||||| +2649|4810|content://media/external/images/media/4810|/storage/emulated/0/DCIM/Camera/IMG_20211101_205642.jpg|image/jpeg|4000|2250|90|4144346||1637505663|1635796605000|1635796605393|0|0|0|||||||| +2650|2795|content://media/external/images/media/2795|/storage/emulated/0/DCIM/Camera/IMG_20211101_202935.jpg|image/jpeg|4160|2340|0|3191232||1637501282|1635794981000|1635794981436|0|0|0|||||||| +2651|7561|content://media/external/images/media/7561|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0048.jpg|image/jpeg|1532|2048|0|268107||1637518223|1635794203000|0|0|0|0|||||||| +2652|7346|content://media/external/images/media/7346|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0047.jpg|image/jpeg|1532|2048|0|185720||1637518223|1635794202000|0|0|0|0|||||||| +2653|7605|content://media/external/images/media/7605|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0043.jpg|image/jpeg|1600|1200|0|246389||1637518223|1635786201000|0|0|0|0|||||||| +2654|7169|content://media/external/images/media/7169|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0038.jpg|image/jpeg|1200|1600|0|287415||1637518222|1635786166000|0|0|0|0|||||||| +2655|4683|content://media/external/images/media/4683|/storage/emulated/0/DCIM/Camera/IMG_20211101_151059.jpg|image/jpeg|4000|2250|90|3219524||1637505480|1635775861000|1635775860898|0|0|0|||||||| +2656|7201|content://media/external/images/media/7201|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0031.jpg|image/jpeg|2048|1536|0|465009||1637518223|1635770805000|0|0|0|0|||||||| +2657|7557|content://media/external/images/media/7557|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0032.jpg|image/jpeg|1536|2048|0|328270||1637518223|1635770805000|0|0|0|0|||||||| +2658|7111|content://media/external/images/media/7111|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0030.jpg|image/jpeg|2048|1536|0|510231||1637518222|1635770804000|0|0|0|0|||||||| +2659|7077|content://media/external/images/media/7077|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0029.jpg|image/jpeg|1536|2048|0|284613||1637518222|1635770803000|0|0|0|0|||||||| +2660|7603|content://media/external/images/media/7603|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0028.jpg|image/jpeg|1536|2048|0|329939||1637518223|1635770802000|0|0|0|0|||||||| +2661|7380|content://media/external/images/media/7380|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0027.jpg|image/jpeg|1536|2048|0|576713||1637518223|1635770801000|0|0|0|0|||||||| +2662|7136|content://media/external/images/media/7136|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0026.jpg|image/jpeg|2048|1536|0|296058||1637518222|1635770799000|0|0|0|0|||||||| +2663|7381|content://media/external/images/media/7381|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0025.jpg|image/jpeg|2048|1536|0|249437||1637518223|1635770798000|0|0|0|0|||||||| +2664|7405|content://media/external/images/media/7405|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0024.jpg|image/jpeg|2048|1536|0|295855||1637518223|1635770797000|0|0|0|0|||||||| +2665|7379|content://media/external/images/media/7379|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0023.jpg|image/jpeg|2048|1536|0|303650||1637518223|1635770796000|0|0|0|0|||||||| +2666|7514|content://media/external/images/media/7514|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0022.jpg|image/jpeg|1536|2048|0|275000||1637518223|1635770795000|0|0|0|0|||||||| +2667|7439|content://media/external/images/media/7439|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0021.jpg|image/jpeg|2048|1536|0|339837||1637518223|1635770794000|0|0|0|0|||||||| +2668|7401|content://media/external/images/media/7401|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0019.jpg|image/jpeg|2000|1500|0|313822||1637518223|1635770793000|0|0|0|0|||||||| +2669|7403|content://media/external/images/media/7403|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0020.jpg|image/jpeg|2048|1536|0|316515||1637518223|1635770793000|0|0|0|0|||||||| +2670|7076|content://media/external/images/media/7076|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0018.jpg|image/jpeg|1536|2048|0|294407||1637518222|1635770792000|0|0|0|0|||||||| +2671|7402|content://media/external/images/media/7402|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0017.jpg|image/jpeg|1536|2048|0|305123||1637518223|1635770791000|0|0|0|0|||||||| +2672|7281|content://media/external/images/media/7281|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0016.jpg|image/jpeg|1536|2048|0|275106||1637518223|1635770789000|0|0|0|0|||||||| +2673|7200|content://media/external/images/media/7200|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0015.jpg|image/jpeg|2048|1536|0|378053||1637518223|1635770788000|0|0|0|0|||||||| +2674|7513|content://media/external/images/media/7513|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0014.jpg|image/jpeg|1536|2048|0|358125||1637518223|1635770783000|0|0|0|0|||||||| +2675|7328|content://media/external/images/media/7328|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0013.jpg|image/jpeg|2048|1536|0|351139||1637518223|1635770771000|0|0|0|0|||||||| +2676|7168|content://media/external/images/media/7168|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0012.jpg|image/jpeg|2048|1536|0|286766||1637518222|1635770769000|0|0|0|0|||||||| +2677|7469|content://media/external/images/media/7469|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0011.jpg|image/jpeg|2048|1536|0|286018||1637518223|1635770767000|0|0|0|0|||||||| +2678|7468|content://media/external/images/media/7468|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0010.jpg|image/jpeg|738|1600|0|166833||1637518223|1635770715000|0|0|0|0|||||||| +2679|7467|content://media/external/images/media/7467|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0009.jpg|image/jpeg|738|1600|0|184845||1637518223|1635770714000|0|0|0|0|||||||| +2680|7280|content://media/external/images/media/7280|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0008.jpg|image/jpeg|738|1600|0|127646||1637518223|1635770713000|0|0|0|0|||||||| +2681|7108|content://media/external/images/media/7108|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0062.jpg|image/jpeg|1600|1200|0|249405||1637518222|1635702523000|0|0|0|0|||||||| +2682|7329|content://media/external/images/media/7329|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0100.jpg|image/jpeg|1600|1200|0|324264||1637518223|1635702523000|0|0|0|0|||||||| +2683|7438|content://media/external/images/media/7438|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0099.jpg|image/jpeg|1600|1200|0|232311||1637518223|1635702522000|0|0|0|0|||||||| +2684|7556|content://media/external/images/media/7556|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0098.jpg|image/jpeg|1600|1200|0|261490||1637518223|1635702521000|0|0|0|0|||||||| +2685|7197|content://media/external/images/media/7197|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0074.jpg|image/jpeg|1200|1600|0|458024||1637518223|1635702520000|0|0|0|0|||||||| +2686|7555|content://media/external/images/media/7555|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0097.jpg|image/jpeg|1600|1200|0|327107||1637518223|1635702520000|0|0|0|0|||||||| +2687|7378|content://media/external/images/media/7378|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0096.jpg|image/jpeg|1600|1200|0|300042||1637518223|1635702519000|0|0|0|0|||||||| +2688|7198|content://media/external/images/media/7198|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0088.jpg|image/jpeg|1600|1200|0|258495||1637518223|1635702517000|0|0|0|0|||||||| +2689|7512|content://media/external/images/media/7512|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0094.jpg|image/jpeg|1200|1600|0|174689||1637518223|1635702429000|0|0|0|0|||||||| +2690|7074|content://media/external/images/media/7074|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0093.jpg|image/jpeg|1200|1600|0|354554||1637518222|1635702428000|0|0|0|0|||||||| +2691|7199|content://media/external/images/media/7199|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0092.jpg|image/jpeg|1200|1600|0|369976||1637518223|1635702427000|0|0|0|0|||||||| +2692|7109|content://media/external/images/media/7109|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0091.jpg|image/jpeg|1600|1200|0|387528||1637518222|1635702426000|0|0|0|0|||||||| +2693|7341|content://media/external/images/media/7341|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0090.jpg|image/jpeg|1600|1200|0|331753||1637518223|1635702425000|0|0|0|0|||||||| +2694|7602|content://media/external/images/media/7602|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0089.jpg|image/jpeg|1200|1600|0|440113||1637518223|1635702424000|0|0|0|0|||||||| +2695|7075|content://media/external/images/media/7075|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0066.jpg|image/jpeg|1200|1600|0|408915||1637518222|1635702422000|0|0|0|0|||||||| +2696|7135|content://media/external/images/media/7135|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0087.jpg|image/jpeg|1200|1600|0|363296||1637518222|1635702421000|0|0|0|0|||||||| +2697|7326|content://media/external/images/media/7326|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0086.jpg|image/jpeg|1600|1200|0|336733||1637518223|1635702419000|0|0|0|0|||||||| +2698|7340|content://media/external/images/media/7340|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0085.jpg|image/jpeg|1200|1600|0|585858||1637518223|1635702418000|0|0|0|0|||||||| +2699|7377|content://media/external/images/media/7377|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0084.jpg|image/jpeg|1600|1200|0|267325||1637518223|1635702365000|0|0|0|0|||||||| +2700|7134|content://media/external/images/media/7134|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0083.jpg|image/jpeg|1600|1200|0|265527||1637518222|1635702363000|0|0|0|0|||||||| +2701|7339|content://media/external/images/media/7339|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0082.jpg|image/jpeg|1600|1200|0|540054||1637518223|1635702362000|0|0|0|0|||||||| +2702|7376|content://media/external/images/media/7376|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0081.jpg|image/jpeg|1600|1200|0|400253||1637518223|1635702361000|0|0|0|0|||||||| +2703|7232|content://media/external/images/media/7232|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0080.jpg|image/jpeg|1200|1600|0|343566||1637518223|1635699955000|0|0|0|0|||||||| +2704|7466|content://media/external/images/media/7466|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0078.jpg|image/jpeg|1600|1200|0|172435||1637518223|1635699947000|0|0|0|0|||||||| +2705|7374|content://media/external/images/media/7374|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0076.jpg|image/jpeg|1200|1600|0|231366||1637518223|1635699942000|0|0|0|0|||||||| +2706|7231|content://media/external/images/media/7231|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0075.jpg|image/jpeg|1600|1200|0|397788||1637518223|1635699929000|0|0|0|0|||||||| +2707|7437|content://media/external/images/media/7437|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0065.jpg|image/jpeg|1200|1600|0|485432||1637518223|1635699904000|0|0|0|0|||||||| +2708|7196|content://media/external/images/media/7196|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0064.jpg|image/jpeg|1200|1600|0|534112||1637518223|1635699895000|0|0|0|0|||||||| +2709|7436|content://media/external/images/media/7436|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0063.jpg|image/jpeg|1200|1600|0|519042||1637518223|1635699881000|0|0|0|0|||||||| +2710|7195|content://media/external/images/media/7195|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0061.jpg|image/jpeg|1200|1600|0|393708||1637518223|1635699876000|0|0|0|0|||||||| +2711|7073|content://media/external/images/media/7073|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0060.jpg|image/jpeg|1200|1600|0|212489||1637518222|1635699872000|0|0|0|0|||||||| +2712|7337|content://media/external/images/media/7337|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0059.jpg|image/jpeg|1600|1200|0|549669||1637518223|1635699868000|0|0|0|0|||||||| +2713|7601|content://media/external/images/media/7601|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0058.jpg|image/jpeg|1200|1600|0|136520||1637518223|1635699861000|0|0|0|0|||||||| +2714|7194|content://media/external/images/media/7194|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0057.jpg|image/jpeg|1200|1600|0|188353||1637518223|1635699846000|0|0|0|0|||||||| +2715|7552|content://media/external/images/media/7552|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0056.jpg|image/jpeg|1200|1600|0|299249||1637518223|1635699838000|0|0|0|0|||||||| +2716|7554|content://media/external/images/media/7554|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0055.jpg|image/jpeg|1600|1200|0|186570||1637518223|1635699828000|0|0|0|0|||||||| +2717|7434|content://media/external/images/media/7434|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0054.jpg|image/jpeg|1600|1200|0|322595||1637518223|1635699824000|0|0|0|0|||||||| +2718|7230|content://media/external/images/media/7230|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0053.jpg|image/jpeg|1600|1200|0|372431||1637518223|1635699811000|0|0|0|0|||||||| +2719|7107|content://media/external/images/media/7107|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0052.jpg|image/jpeg|1200|1600|0|337100||1637518222|1635699806000|0|0|0|0|||||||| +2720|7375|content://media/external/images/media/7375|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0051.jpg|image/jpeg|1200|1600|0|232249||1637518223|1635699800000|0|0|0|0|||||||| +2721|7106|content://media/external/images/media/7106|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0050.jpg|image/jpeg|1600|1200|0|281362||1637518222|1635699794000|0|0|0|0|||||||| +2722|7133|content://media/external/images/media/7133|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0049.jpg|image/jpeg|1200|1600|0|338447||1637518222|1635699786000|0|0|0|0|||||||| +2723|7167|content://media/external/images/media/7167|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0048.jpg|image/jpeg|1200|1600|0|286172||1637518222|1635699782000|0|0|0|0|||||||| +2724|7104|content://media/external/images/media/7104|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0047.jpg|image/jpeg|1600|1200|0|266956||1637518222|1635699706000|0|0|0|0|||||||| +2725|7132|content://media/external/images/media/7132|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0046.jpg|image/jpeg|1600|1200|0|348612||1637518222|1635699651000|0|0|0|0|||||||| +2726|7435|content://media/external/images/media/7435|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0045.jpg|image/jpeg|1600|1200|0|256041||1637518223|1635699626000|0|0|0|0|||||||| +2727|7338|content://media/external/images/media/7338|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0044.jpg|image/jpeg|1600|1200|0|163496||1637518223|1635699611000|0|0|0|0|||||||| +2728|7553|content://media/external/images/media/7553|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0043.jpg|image/jpeg|1200|1600|0|302638||1637518223|1635699603000|0|0|0|0|||||||| +2729|7511|content://media/external/images/media/7511|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0042.jpg|image/jpeg|1600|1200|0|186313||1637518223|1635699587000|0|0|0|0|||||||| +2730|7072|content://media/external/images/media/7072|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0041.jpg|image/jpeg|1200|1600|0|228313||1637518222|1635699576000|0|0|0|0|||||||| +2731|7327|content://media/external/images/media/7327|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0040.jpg|image/jpeg|1600|1200|0|282403||1637518223|1635699526000|0|0|0|0|||||||| +2732|7600|content://media/external/images/media/7600|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0035.jpg|image/jpeg|1200|1600|0|226546||1637518223|1635699495000|0|0|0|0|||||||| +2733|7465|content://media/external/images/media/7465|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0034.jpg|image/jpeg|1200|1600|0|235746||1637518223|1635699494000|0|0|0|0|||||||| +2734|7071|content://media/external/images/media/7071|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0033.jpg|image/jpeg|1600|604|0|118025||1637518222|1635699492000|0|0|0|0|||||||| +2735|7325|content://media/external/images/media/7325|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0031.jpg|image/jpeg|1600|1200|0|180168||1637518223|1635699382000|0|0|0|0|||||||| +2736|7433|content://media/external/images/media/7433|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0030.jpg|image/jpeg|1600|1200|0|220019||1637518223|1635699299000|0|0|0|0|||||||| +2737|7279|content://media/external/images/media/7279|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0029.jpg|image/jpeg|1600|1200|0|325024||1637518223|1635699213000|0|0|0|0|||||||| +2738|7464|content://media/external/images/media/7464|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0028.jpg|image/jpeg|1600|1200|0|203675||1637518223|1635699170000|0|0|0|0|||||||| +2739|7105|content://media/external/images/media/7105|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0027.jpg|image/jpeg|1600|1200|0|201117||1637518222|1635699145000|0|0|0|0|||||||| +2740|3632|content://media/external/images/media/3632|/storage/emulated/0/DCIM/Camera/IMG_20211031_170909.jpg|image/jpeg|4000|2250|90|2593956||1637503272|1635696551000|1635696551297|0|0|0|||||||| +2741|3835|content://media/external/images/media/3835|/storage/emulated/0/DCIM/Camera/IMG_20211031_170859.jpg|image/jpeg|4160|2340|90|3990956||1637503630|1635696543000|1635696542888|0|0|0|||||||| +2742|4517|content://media/external/images/media/4517|/storage/emulated/0/DCIM/Camera/IMG_20211031_163910.jpg|image/jpeg|4160|2340|0|4517505||1637505160|1635694753000|1635694753149|0|0|0|||||||| +2743|3018|content://media/external/images/media/3018|/storage/emulated/0/DCIM/Camera/IMG_20211031_163853.jpg|image/jpeg|4160|2340|90|4697604||1637501786|1635694737000|1635694737508|0|0|0|||||||| +2744|2794|content://media/external/images/media/2794|/storage/emulated/0/DCIM/Camera/IMG_20211031_163736.jpg|image/jpeg|4160|2340|0|4903490||1637501282|1635694665000|1635694664731|0|0|0|||||||| +2745|3990|content://media/external/images/media/3990|/storage/emulated/0/DCIM/Camera/IMG_20211031_143613.jpg|image/jpeg|4160|2340|90|4665859||1637504059|1635687377000|1635687377158|0|0|0|||||||| +2746|4595|content://media/external/images/media/4595|/storage/emulated/0/DCIM/Camera/IMG_20211031_143557.jpg|image/jpeg|4160|2340|0|5147331||1637505278|1635687359000|1635687359069|0|0|0|||||||| +2747|3330|content://media/external/images/media/3330|/storage/emulated/0/DCIM/Camera/PANO_20211031_142002.jpg|image/jpeg|9008|3616|0|20118670||1637502439|1635686410000|0|0|0|0|||||||| +2748|3235|content://media/external/images/media/3235|/storage/emulated/0/DCIM/Camera/IMG_20211031_115920.jpg|image/jpeg|4000|2250|0|7142215||1637502258|1635677963000|1635677962863|0|0|0|||||||| +2749|3429|content://media/external/images/media/3429|/storage/emulated/0/DCIM/Camera/IMG_20211031_115905.jpg|image/jpeg|4000|2250|0|5748898||1637502682|1635677949000|1635677949398|0|0|0|||||||| +2750|3219|content://media/external/images/media/3219|/storage/emulated/0/DCIM/Camera/IMG_20211031_114017.jpg|image/jpeg|4000|2250|90|4523383||1637502256|1635676822000|1635676821858|0|0|0|||||||| +2751|3755|content://media/external/images/media/3755|/storage/emulated/0/DCIM/Camera/IMG_20211031_105430.jpg|image/jpeg|4000|2250|0|4276958||1637503488|1635674073000|1635674072942|0|0|0|||||||| +2752|3989|content://media/external/images/media/3989|/storage/emulated/0/DCIM/Camera/IMG_20211030_204105.jpg|image/jpeg|4000|2250|90|3456868||1637504059|1635619268000|1635619268072|0|0|0|||||||| +2753|7432|content://media/external/images/media/7432|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0089.jpg|image/jpeg|1600|1200|0|439497||1637518223|1635615604000|0|0|0|0|||||||| +2754|7373|content://media/external/images/media/7373|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0088.jpg|image/jpeg|1600|1200|0|218388||1637518223|1635615600000|0|0|0|0|||||||| +2755|7599|content://media/external/images/media/7599|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0087.jpg|image/jpeg|2000|1125|0|222329||1637518223|1635615598000|0|0|0|0|||||||| +2756|7103|content://media/external/images/media/7103|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0086.jpg|image/jpeg|1600|1200|0|461492||1637518222|1635615596000|0|0|0|0|||||||| +2757|7463|content://media/external/images/media/7463|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0065.jpg|image/jpeg|2048|1536|0|350399||1637518223|1635615596000|0|0|0|0|||||||| +2758|7431|content://media/external/images/media/7431|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0085.jpg|image/jpeg|1600|1200|0|255448||1637518223|1635614197000|0|0|0|0|||||||| +2759|7510|content://media/external/images/media/7510|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0084.jpg|image/jpeg|1600|1200|0|254110||1637518223|1635614193000|0|0|0|0|||||||| +2760|7324|content://media/external/images/media/7324|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0083.jpg|image/jpeg|1600|1200|0|297696||1637518223|1635614191000|0|0|0|0|||||||| +2761|7070|content://media/external/images/media/7070|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0075.jpg|image/jpeg|1080|1920|0|136578||1637518222|1635614127000|0|0|0|0|||||||| +2762|7166|content://media/external/images/media/7166|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0074.jpg|image/jpeg|1536|2048|0|205145||1637518222|1635614050000|0|0|0|0|||||||| +2763|7131|content://media/external/images/media/7131|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0073.jpg|image/jpeg|1536|2048|0|243133||1637518222|1635614046000|0|0|0|0|||||||| +2764|7509|content://media/external/images/media/7509|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0072.jpg|image/jpeg|1536|2048|0|229053||1637518223|1635614042000|0|0|0|0|||||||| +2765|7336|content://media/external/images/media/7336|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0071.jpg|image/jpeg|1536|2048|0|169596||1637518223|1635614039000|0|0|0|0|||||||| +2766|7229|content://media/external/images/media/7229|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0070.jpg|image/jpeg|1536|2048|0|342573||1637518223|1635614037000|0|0|0|0|||||||| +2767|7598|content://media/external/images/media/7598|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0069.jpg|image/jpeg|2048|640|0|120058||1637518223|1635614026000|0|0|0|0|||||||| +2768|7130|content://media/external/images/media/7130|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0068.jpg|image/jpeg|2048|1536|0|371602||1637518222|1635614024000|0|0|0|0|||||||| +2769|7372|content://media/external/images/media/7372|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0067.jpg|image/jpeg|2048|1536|0|541686||1637518223|1635614021000|0|0|0|0|||||||| +2770|7277|content://media/external/images/media/7277|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0066.jpg|image/jpeg|2048|1536|0|264918||1637518223|1635614018000|0|0|0|0|||||||| +2771|7462|content://media/external/images/media/7462|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0064.jpg|image/jpeg|1536|2048|0|473694||1637518223|1635614015000|0|0|0|0|||||||| +2772|7507|content://media/external/images/media/7507|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0063.jpg|image/jpeg|1536|2048|0|496198||1637518223|1635614011000|0|0|0|0|||||||| +2773|7461|content://media/external/images/media/7461|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0062.jpg|image/jpeg|2048|1536|0|397457||1637518223|1635614002000|0|0|0|0|||||||| +2774|7278|content://media/external/images/media/7278|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0061.jpg|image/jpeg|2048|1536|0|489939||1637518223|1635614000000|0|0|0|0|||||||| +2775|7102|content://media/external/images/media/7102|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0060.jpg|image/jpeg|1536|2048|0|294762||1637518222|1635613998000|0|0|0|0|||||||| +2776|7400|content://media/external/images/media/7400|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0059.jpg|image/jpeg|2048|1536|0|306344||1637518223|1635613996000|0|0|0|0|||||||| +2777|7551|content://media/external/images/media/7551|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0058.jpg|image/jpeg|2048|1536|0|288378||1637518223|1635613993000|0|0|0|0|||||||| +2778|7399|content://media/external/images/media/7399|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0057.jpg|image/jpeg|2048|1536|0|377221||1637518223|1635613991000|0|0|0|0|||||||| +2779|7193|content://media/external/images/media/7193|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0056.jpg|image/jpeg|1536|2048|0|441537||1637518223|1635613989000|0|0|0|0|||||||| +2780|7129|content://media/external/images/media/7129|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0055.jpg|image/jpeg|2048|1536|0|578704||1637518222|1635613987000|0|0|0|0|||||||| +2781|7322|content://media/external/images/media/7322|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0054.jpg|image/jpeg|1536|2048|0|505864||1637518223|1635613984000|0|0|0|0|||||||| +2782|7192|content://media/external/images/media/7192|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0052.jpg|image/jpeg|1600|1200|0|189747||1637518223|1635613406000|0|0|0|0|||||||| +2783|7323|content://media/external/images/media/7323|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0051.jpg|image/jpeg|1600|1200|0|303310||1637518223|1635613404000|0|0|0|0|||||||| +2784|7508|content://media/external/images/media/7508|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0050.jpg|image/jpeg|1200|1600|0|488070||1637518223|1635613402000|0|0|0|0|||||||| +2785|7276|content://media/external/images/media/7276|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0049.jpg|image/jpeg|1200|1600|0|508953||1637518223|1635613399000|0|0|0|0|||||||| +2786|7335|content://media/external/images/media/7335|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0048.jpg|image/jpeg|1200|1600|0|237530||1637518223|1635613385000|0|0|0|0|||||||| +2787|7275|content://media/external/images/media/7275|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0047.jpg|image/jpeg|1200|1600|0|490454||1637518223|1635613383000|0|0|0|0|||||||| +2788|7398|content://media/external/images/media/7398|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0046.jpg|image/jpeg|1600|1200|0|444458||1637518223|1635613381000|0|0|0|0|||||||| +2789|7128|content://media/external/images/media/7128|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0045.jpg|image/jpeg|1600|1200|0|444992||1637518222|1635613380000|0|0|0|0|||||||| +2790|7321|content://media/external/images/media/7321|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0044.jpg|image/jpeg|1600|1200|0|204076||1637518223|1635613378000|0|0|0|0|||||||| +2791|7165|content://media/external/images/media/7165|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0043.jpg|image/jpeg|1600|1200|0|288413||1637518222|1635613377000|0|0|0|0|||||||| +2792|7397|content://media/external/images/media/7397|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0042.jpg|image/jpeg|1600|1200|0|143339||1637518223|1635613376000|0|0|0|0|||||||| +2793|7506|content://media/external/images/media/7506|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0041.jpg|image/jpeg|1600|1200|0|266207||1637518223|1635613375000|0|0|0|0|||||||| +2794|7505|content://media/external/images/media/7505|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0040.jpg|image/jpeg|1600|1200|0|176475||1637518223|1635613374000|0|0|0|0|||||||| +2795|7396|content://media/external/images/media/7396|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0039.jpg|image/jpeg|1600|1200|0|158968||1637518223|1635613372000|0|0|0|0|||||||| +2796|7320|content://media/external/images/media/7320|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0038.jpg|image/jpeg|1600|1200|0|269479||1637518223|1635613371000|0|0|0|0|||||||| +2797|7164|content://media/external/images/media/7164|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0037.jpg|image/jpeg|1200|1600|0|158202||1637518222|1635613368000|0|0|0|0|||||||| +2798|7069|content://media/external/images/media/7069|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0036.jpg|image/jpeg|1200|1600|0|179784||1637518222|1635613366000|0|0|0|0|||||||| +2799|7319|content://media/external/images/media/7319|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0035.jpg|image/jpeg|1200|1600|0|121850||1637518223|1635613364000|0|0|0|0|||||||| +2800|7228|content://media/external/images/media/7228|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0034.jpg|image/jpeg|1200|1600|0|164286||1637518223|1635613363000|0|0|0|0|||||||| +2801|7274|content://media/external/images/media/7274|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0033.jpg|image/jpeg|1536|2048|0|454692||1637518223|1635613361000|0|0|0|0|||||||| +2802|7068|content://media/external/images/media/7068|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0032.jpg|image/jpeg|1600|1200|0|418846||1637518222|1635613359000|0|0|0|0|||||||| +2803|7191|content://media/external/images/media/7191|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0031.jpg|image/jpeg|1600|1200|0|158571||1637518223|1635613352000|0|0|0|0|||||||| +2804|3218|content://media/external/images/media/3218|/storage/emulated/0/DCIM/Camera/IMG_20211030_163724.jpg|image/jpeg|4000|2250|0|3981688||1637502256|1635604645000|1635604645361|0|0|0|||||||| +2805|3834|content://media/external/images/media/3834|/storage/emulated/0/DCIM/Camera/IMG_20211030_163714.jpg|image/jpeg|4160|2340|0|3953000||1637503630|1635604639000|1635604639025|0|0|0|||||||| +2806|4594|content://media/external/images/media/4594|/storage/emulated/0/DCIM/Camera/IMG_20211030_163315.jpg|image/jpeg|4000|2250|0|4547184||1637505278|1635604398000|1635604398408|0|0|0|||||||| +2807|4638|content://media/external/images/media/4638|/storage/emulated/0/DCIM/Camera/IMG_20211030_163313.jpg|image/jpeg|4000|2250|0|5073033||1637505390|1635604396000|1635604396491|0|0|0|||||||| +2808|4809|content://media/external/images/media/4809|/storage/emulated/0/DCIM/Camera/IMG_20211030_151937.jpg|image/jpeg|4000|2250|0|2783517||1637505663|1635599981000|1635599980863|0|0|0|||||||| +2809|3367|content://media/external/images/media/3367|/storage/emulated/0/DCIM/Camera/IMG_20211030_151909.jpg|image/jpeg|4000|2250|0|4109127||1637502451|1635599951000|1635599951579|0|0|0|||||||| +2810|7395|content://media/external/images/media/7395|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0004.jpg|image/jpeg|908|2016|0|97235||1637518223|1635584057000|0|0|0|0|||||||| +2811|21|content://media/external/images/media/21|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-10-27-19-17-18-101_com.android.provision.jpg|image/jpeg|1080|2400|0|349077||1635355038|1635355038195|0|0|0|0|||||||| +2812|22|content://media/external/images/media/22|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-10-27-18-41-56-131_com.android.provision.jpg|image/jpeg|1080|2400|0|122167||1635352916|1635352916195|0|0|0|0|||||||| +2813|3459|content://media/external/images/media/3459|/storage/emulated/0/DCIM/Camera/IMG_20211026_204429.jpg|image/jpeg|4000|2250|90|4128069||1637502804|1635273872000|1635273872234|0|0|0|||||||| +2814|2597|content://media/external/images/media/2597|/storage/emulated/0/DCIM/00 greenpass_20211025_220007_986.png|image/png|936|3178|0|303178||1637500870|1635192007000|0|0|0|0|||||||| +2815|2762|content://media/external/images/media/2762|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-10-24-08-22-26-563_com.android.chrome.jpg|image/jpeg|1080|2340|0|479557||1637500987|1635056547000|0|0|0|0|||||||| +2816|2761|content://media/external/images/media/2761|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-10-22-15-59-52-850_com.facebook.katana.jpg|image/jpeg|1080|2340|0|1111581||1637500987|1634911193000|0|0|0|0|||||||| +2817|3613|content://media/external/images/media/3613|/storage/emulated/0/DCIM/Camera/IMG_20211022_074847.jpg|image/jpeg|2590|1647|0|808906||1637503238|1634881727000|1634881697578|0|0|0|||||||| +2818|7189|content://media/external/images/media/7189|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211022-WA0000.jpg|image/jpeg|1600|1066|0|159606||1637518223|1634855745000|0|0|0|0|||||||| +2819|3039|content://media/external/images/media/3039|/storage/emulated/0/DCIM/Camera/IMG_20211021_083402.jpg|image/jpeg|4000|2250|0|3934985||1637501805|1634798045000|1634798045284|0|0|0|||||||| +2820|2881|content://media/external/images/media/2881|/storage/emulated/0/DCIM/Camera/IMG_20211020_195025.jpg|image/jpeg|2799|1308|0|1217636||1637501461|1634752225000|1634752087492|0|0|0|||||||| +2821|4316|content://media/external/images/media/4316|/storage/emulated/0/DCIM/Camera/IMG_20211019_200716.jpg|image/jpeg|4000|2250|90|3340398||1637504817|1634666838000|1634666838575|0|0|0|||||||| +2822|3017|content://media/external/images/media/3017|/storage/emulated/0/DCIM/Camera/IMG_20211011_200431.jpg|image/jpeg|4000|2250|90|3907432||1637501786|1633975473000|1633975473140|0|0|0|||||||| +2823|7504|content://media/external/images/media/7504|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0018.jpg|image/jpeg|2048|1536|0|498808||1637518223|1633880752000|0|0|0|0|||||||| +2824|7550|content://media/external/images/media/7550|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0017.jpg|image/jpeg|2048|1536|0|476289||1637518223|1633880751000|0|0|0|0|||||||| +2825|7597|content://media/external/images/media/7597|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0016.jpg|image/jpeg|2048|1536|0|377509||1637518223|1633880749000|0|0|0|0|||||||| +2826|7596|content://media/external/images/media/7596|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0015.jpg|image/jpeg|2048|1536|0|377890||1637518223|1633880747000|0|0|0|0|||||||| +2827|7394|content://media/external/images/media/7394|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0014.jpg|image/jpeg|2048|1536|0|385390||1637518223|1633880737000|0|0|0|0|||||||| +2828|7273|content://media/external/images/media/7273|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0012.jpg|image/jpeg|1200|1600|0|138409||1637518223|1633880633000|0|0|0|0|||||||| +2829|7393|content://media/external/images/media/7393|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0011.jpg|image/jpeg|1200|1600|0|155720||1637518223|1633880628000|0|0|0|0|||||||| +2830|7318|content://media/external/images/media/7318|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0010.jpg|image/jpeg|1200|1600|0|166935||1637518223|1633880411000|0|0|0|0|||||||| +2831|7227|content://media/external/images/media/7227|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0009.jpg|image/jpeg|1200|1600|0|140641||1637518223|1633880408000|0|0|0|0|||||||| +2832|3671|content://media/external/images/media/3671|/storage/emulated/0/DCIM/Camera/IMG_20211010_114126.jpg|image/jpeg|4000|2250|0|4069161||1637503358|1633858890000|1633858890015|0|0|0|||||||| +2833|4364|content://media/external/images/media/4364|/storage/emulated/0/DCIM/Camera/IMG_20211009_133514.jpg|image/jpeg|4000|2250|0|3683181||1637504970|1633779317000|1633779317035|0|0|0|||||||| +2834|7226|content://media/external/images/media/7226|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211004-WA0021.jpg|image/jpeg|738|1600|0|94070||1637518223|1633383846000|0|0|0|0|||||||| +2835|7316|content://media/external/images/media/7316|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211004-WA0020.jpg|image/jpeg|720|1600|0|90118||1637518223|1633357755000|0|0|0|0|||||||| +2836|2723|content://media/external/images/media/2723|/storage/emulated/0/DCIM/Screenshots/IMG_20211003_123512.jpg|image/jpeg|1053|1538|0|315165||1637500987|1633257313000|0|0|0|0|||||||| +2837|2722|content://media/external/images/media/2722|/storage/emulated/0/DCIM/Screenshots/IMG_20211003_122627.jpg|image/jpeg|1050|920|0|271228||1637500987|1633256788000|0|0|0|0|||||||| +2838|2920|content://media/external/images/media/2920|/storage/emulated/0/DCIM/Camera/IMG_20211003_092944.jpg|image/jpeg|4000|2250|0|5258102||1637501535|1633246186000|1633246186297|0|0|0|||||||| +2839|4808|content://media/external/images/media/4808|/storage/emulated/0/DCIM/Camera/IMG_20211003_092501.jpg|image/jpeg|4000|2250|0|5573567||1637505663|1633245904000|1633245904748|0|0|0|||||||| +2840|3273|content://media/external/images/media/3273|/storage/emulated/0/DCIM/Camera/IMG_20211003_092018.jpg|image/jpeg|4000|2250|0|6045294||1637502342|1633245620000|1633245620071|0|0|0|||||||| +2841|3525|content://media/external/images/media/3525|/storage/emulated/0/DCIM/Camera/IMG_20211003_092010.jpg|image/jpeg|4000|2250|0|5292149||1637502970|1633245612000|1633245612087|0|0|0|||||||| +2842|4555|content://media/external/images/media/4555|/storage/emulated/0/DCIM/Camera/IMG_20211003_085449.jpg|image/jpeg|4000|2250|0|4689146||1637505187|1633244095000|1633244094594|0|0|0|||||||| +2843|4046|content://media/external/images/media/4046|/storage/emulated/0/DCIM/Camera/IMG_20211003_080654.jpg|image/jpeg|4160|2340|0|4513479||1637504234|1633241223000|1633241223302|0|0|0|||||||| +2844|7331|content://media/external/images/media/7331|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211002-WA0024.jpg|image/jpeg|1408|1056|0|146045||1637518223|1633181501000|0|0|0|0|||||||| +2845|7518|content://media/external/images/media/7518|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211002-WA0023.jpg|image/jpeg|1600|1200|0|176004||1637518223|1633181500000|0|0|0|0|||||||| +2846|7112|content://media/external/images/media/7112|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211002-WA0022.jpg|image/jpeg|2048|1536|0|250678||1637518222|1633181499000|0|0|0|0|||||||| +2847|3016|content://media/external/images/media/3016|/storage/emulated/0/DCIM/Camera/IMG_20211002_140114.jpg|image/jpeg|4000|2250|0|3648810||1637501786|1633176078000|1633176077524|0|0|0|||||||| +2848|2721|content://media/external/images/media/2721|/storage/emulated/0/DCIM/Screenshots/IMG_20211002_101634.jpg|image/jpeg|1080|1146|0|245287||1637500987|1633162594000|0|0|0|0|||||||| +2849|7101|content://media/external/images/media/7101|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211001-WA0019.jpg|image/jpeg|1536|2048|0|572976||1637518222|1633119174000|0|0|0|0|||||||| +2850|3499|content://media/external/images/media/3499|/storage/emulated/0/DCIM/Camera/IMG_20211001_163421.jpg|image/jpeg|4000|2250|0|3416362||1637502870|1633098864000|1633098864346|0|0|0|||||||| +2851|2720|content://media/external/images/media/2720|/storage/emulated/0/DCIM/Screenshots/IMG_20210929_073140.jpg|image/jpeg|1080|1744|0|339395||1637500987|1632893500000|0|0|0|0|||||||| +2852|2719|content://media/external/images/media/2719|/storage/emulated/0/DCIM/Screenshots/IMG_20210928_205840.jpg|image/jpeg|1054|1070|0|80423||1637500987|1632855520000|0|0|0|0|||||||| +2853|3543|content://media/external/images/media/3543|/storage/emulated/0/DCIM/Camera/IMG_20210928_195315.jpg|image/jpeg|4160|2340|0|3006849||1637503010|1632851595000|1632851595442|0|0|0|||||||| +2854|2883|content://media/external/images/media/2883|/storage/emulated/0/DCIM/Camera/PANO_20210928_195240.jpg|image/jpeg|7728|3648|0|15812054||1637501461|1632851568000|0|0|0|0|||||||| +2855|3354|content://media/external/images/media/3354|/storage/emulated/0/DCIM/Camera/IMG_20210928_190815.jpg|image/jpeg|4000|2250|0|3316560||1637502439|1632848897000|1632848897666|0|0|0|||||||| +2856|3428|content://media/external/images/media/3428|/storage/emulated/0/DCIM/Camera/IMG_20210928_190810.jpg|image/jpeg|4000|2250|0|2713134||1637502682|1632848892000|1632848892351|0|0|0|||||||| +2857|4873|content://media/external/images/media/4873|/storage/emulated/0/DCIM/Camera/IMG_20210928_190714.jpg|image/jpeg|4000|2250|0|5226266||1637505831|1632848836000|1632848836403|0|0|0|||||||| +2858|4649|content://media/external/images/media/4649|/storage/emulated/0/DCIM/Camera/IMG_20210928_190420.jpg|image/jpeg|4000|2250|0|3537104||1637505414|1632848660000|1632848641872|0|0|0|||||||| +2859|4384|content://media/external/images/media/4384|/storage/emulated/0/DCIM/Camera/IMG_20210928_185956.jpg|image/jpeg|4000|2250|0|4262759||1637504982|1632848398000|1632848398429|0|0|0|||||||| +2860|3275|content://media/external/images/media/3275|/storage/emulated/0/DCIM/Camera/PANO_20210928_185907.jpg|image/jpeg|10288|3712|0|22747465||1637502343|1632848357000|0|0|0|0|||||||| +2861|4922|content://media/external/images/media/4922|/storage/emulated/0/DCIM/Camera/PANO_20210928_185556.jpg|image/jpeg|8880|3712|0|18527720||1637505944|1632848163000|0|0|0|0|||||||| +2862|4575|content://media/external/images/media/4575|/storage/emulated/0/DCIM/Camera/PANO_20210928_185200.jpg|image/jpeg|7344|3680|0|12491663||1637505216|1632847928000|0|0|0|0|||||||| +2863|2718|content://media/external/images/media/2718|/storage/emulated/0/DCIM/Screenshots/IMG_20210927_102714.jpg|image/jpeg|1080|1328|0|258548||1637500987|1632731234000|0|0|0|0|||||||| +2864|5025|content://media/external/images/media/5025|/storage/emulated/0/DCIM/Camera/IMG_20210926_185026.jpg|image/jpeg|4000|2250|90|2625293||1637506135|1632675030000|1632675029711|0|0|0|||||||| +2865|4554|content://media/external/images/media/4554|/storage/emulated/0/DCIM/Camera/IMG_20210926_185019.jpg|image/jpeg|4000|2250|0|4514525||1637505187|1632675021000|1632675021031|0|0|0|||||||| +2866|2717|content://media/external/images/media/2717|/storage/emulated/0/DCIM/Screenshots/IMG_20210926_105850.jpg|image/jpeg|1080|2006|0|300878||1637500987|1632646730000|0|0|0|0|||||||| +2867|7100|content://media/external/images/media/7100|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210925-WA0025.jpg|image/jpeg|1599|899|0|210056||1637518222|1632577492000|0|0|0|0|||||||| +2868|7225|content://media/external/images/media/7225|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210925-WA0024.jpg|image/jpeg|899|1599|0|216376||1637518223|1632577456000|0|0|0|0|||||||| +2869|7272|content://media/external/images/media/7272|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210925-WA0021.jpg|image/jpeg|1200|1600|0|237069||1637518223|1632572144000|0|0|0|0|||||||| +2870|7127|content://media/external/images/media/7127|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210925-WA0020.jpg|image/jpeg|1024|768|0|149108||1637518222|1632571679000|0|0|0|0|||||||| +2871|7503|content://media/external/images/media/7503|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210924-WA0014.jpg|image/jpeg|1200|1600|0|188223||1637518223|1632503701000|0|0|0|0|||||||| +2872|7317|content://media/external/images/media/7317|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210924-WA0012.jpg|image/jpeg|778|1600|0|75902||1637518223|1632501372000|0|0|0|0|||||||| +2873|2630|content://media/external/images/media/2630|/storage/emulated/0/DCIM/Facebook/FB_IMG_1632381337969.jpg|image/jpeg|1000|1000|0|74573||1637500870|1632381338000|0|0|0|0|||||||| +2874|4460|content://media/external/images/media/4460|/storage/emulated/0/DCIM/Camera/IMG_20210918_152125.jpg|image/jpeg|4000|2250|0|6813703||1637505068|1631971288000|1631971288323|0|0|0|||||||| +2875|4724|content://media/external/images/media/4724|/storage/emulated/0/DCIM/Camera/IMG_20210918_150116.jpg|image/jpeg|4000|2250|0|3381837||1637505565|1631970081000|1631970080789|0|0|0|||||||| +2876|4294|content://media/external/images/media/4294|/storage/emulated/0/DCIM/Camera/IMG_20210918_150036.jpg|image/jpeg|4000|2250|0|3215053||1637504808|1631970039000|1631970039555|0|0|0|||||||| +2877|3988|content://media/external/images/media/3988|/storage/emulated/0/DCIM/Camera/IMG_20210918_150025.jpg|image/jpeg|4000|2250|0|4516254||1637504059|1631970031000|1631970030812|0|0|0|||||||| +2878|4009|content://media/external/images/media/4009|/storage/emulated/0/DCIM/Camera/IMG_20210918_092608.jpg|image/jpeg|4160|2340|0|3706173||1637504086|1631949968000|1631949968795|0|0|0|||||||| +2879|3694|content://media/external/images/media/3694|/storage/emulated/0/DCIM/Camera/IMG_20210918_092557.jpg|image/jpeg|4000|2250|0|4758950||1637503390|1631949959000|1631949959786|0|0|0|||||||| +2880|3038|content://media/external/images/media/3038|/storage/emulated/0/DCIM/Camera/IMG_20210918_092106.jpg|image/jpeg|4160|2340|0|4406559||1637501805|1631949673000|1631949672884|0|0|0|||||||| +2881|7190|content://media/external/images/media/7190|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210916-WA0011.jpg|image/jpeg|1600|900|0|177555||1637518223|1631813905000|0|0|0|0|||||||| +2882|7430|content://media/external/images/media/7430|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210915-WA0002.jpg|image/jpeg|1536|2048|0|318307||1637518223|1631689554000|0|0|0|0|||||||| +2883|7392|content://media/external/images/media/7392|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210915-WA0001.jpg|image/jpeg|1536|2048|0|499466||1637518223|1631689552000|0|0|0|0|||||||| +2884|7460|content://media/external/images/media/7460|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210913-WA0000.jpg|image/jpeg|1500|2000|0|713859||1637518223|1631518615000|0|0|0|0|||||||| +2885|3524|content://media/external/images/media/3524|/storage/emulated/0/DCIM/Camera/IMG_20210912_075418.jpg|image/jpeg|3680|2070|0|2971740||1637502970|1631426058000|1631353420158|0|0|0|||||||| +2886|4493|content://media/external/images/media/4493|/storage/emulated/0/DCIM/Camera/IMG_20210912_075402.jpg|image/jpeg|3729|2097|0|3050744||1637505122|1631426043000|1631353420158|0|0|0|||||||| +2887|4637|content://media/external/images/media/4637|/storage/emulated/0/DCIM/Camera/IMG_20210912_075225.jpg|image/jpeg|5184|2916|0|3506965||1637505390|1631425946000|1631378479128|0|0|0|||||||| +2888|7391|content://media/external/images/media/7391|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0009.jpg|image/jpeg|904|1600|0|124093||1637518223|1631424815000|0|0|0|0|||||||| +2889|7271|content://media/external/images/media/7271|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0008.jpg|image/jpeg|904|1600|0|150994||1637518223|1631424397000|0|0|0|0|||||||| +2890|7595|content://media/external/images/media/7595|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0007.jpg|image/jpeg|904|1600|0|160566||1637518223|1631424396000|0|0|0|0|||||||| +2891|7067|content://media/external/images/media/7067|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0006.jpg|image/jpeg|904|1600|0|236620||1637518222|1631424395000|0|0|0|0|||||||| +2892|7502|content://media/external/images/media/7502|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0005.jpg|image/jpeg|904|1600|0|151523||1637518223|1631424289000|0|0|0|0|||||||| +2893|7334|content://media/external/images/media/7334|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0002.jpg|image/jpeg|1600|904|0|169162||1637518223|1631423699000|0|0|0|0|||||||| +2894|7549|content://media/external/images/media/7549|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0001.jpg|image/jpeg|1200|1600|0|158948||1637518223|1631423699000|0|0|0|0|||||||| +2895|7188|content://media/external/images/media/7188|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0003.jpg|image/jpeg|904|1600|0|168967||1637518223|1631423698000|0|0|0|0|||||||| +2896|7429|content://media/external/images/media/7429|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0004.jpg|image/jpeg|1600|904|0|198202||1637518223|1631423698000|0|0|0|0|||||||| +2897|7501|content://media/external/images/media/7501|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0000.jpg|image/jpeg|904|1600|0|140582||1637518223|1631423674000|0|0|0|0|||||||| +2898|3860|content://media/external/images/media/3860|/storage/emulated/0/DCIM/Camera/IMG_20210912_071234.jpg|image/jpeg|4160|2340|0|3312162||1637503642|1631423554000|1631423554299|0|0|0|||||||| +2899|7270|content://media/external/images/media/7270|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0064.jpg|image/jpeg|2048|1536|0|273317||1637518223|1631392233000|0|0|0|0|||||||| +2900|7606|content://media/external/images/media/7606|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0063.jpg|image/jpeg|1600|1200|0|130204||1637518223|1631385930000|0|0|0|0|||||||| +2901|7285|content://media/external/images/media/7285|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0062.jpg|image/jpeg|1600|900|0|221779||1637518223|1631385929000|0|0|0|0|||||||| +2902|7345|content://media/external/images/media/7345|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0061.jpg|image/jpeg|1600|900|0|204808||1637518223|1631385928000|0|0|0|0|||||||| +2903|7206|content://media/external/images/media/7206|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0002.jpg|image/jpeg|1600|900|0|170675||1637518223|1631385927000|0|0|0|0|||||||| +2904|7406|content://media/external/images/media/7406|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0060.jpg|image/jpeg|1600|900|0|151268||1637518223|1631385927000|0|0|0|0|||||||| +2905|7522|content://media/external/images/media/7522|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0020.jpg|image/jpeg|1600|1200|0|339106||1637518223|1631385927000|0|0|0|0|||||||| +2906|7559|content://media/external/images/media/7559|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0003.jpg|image/jpeg|1200|1600|0|305779||1637518223|1631385927000|0|0|0|0|||||||| +2907|7473|content://media/external/images/media/7473|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0058.jpg|image/jpeg|1600|1200|0|235488||1637518223|1631385926000|0|0|0|0|||||||| +2908|7474|content://media/external/images/media/7474|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0059.jpg|image/jpeg|1600|900|0|94156||1637518223|1631385926000|0|0|0|0|||||||| +2909|7560|content://media/external/images/media/7560|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0018.jpg|image/jpeg|1600|1200|0|370101||1637518223|1631385926000|0|0|0|0|||||||| +2910|7174|content://media/external/images/media/7174|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0057.jpg|image/jpeg|1600|900|0|160593||1637518222|1631385925000|0|0|0|0|||||||| +2911|7344|content://media/external/images/media/7344|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0056.jpg|image/jpeg|1600|900|0|153953||1637518223|1631385924000|0|0|0|0|||||||| +2912|7099|content://media/external/images/media/7099|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0055.jpg|image/jpeg|1080|1080|0|54906||1637518222|1631385793000|0|0|0|0|||||||| +2913|3177|content://media/external/images/media/3177|/storage/emulated/0/DCIM/Camera/IMG_20210911_191111.jpg|image/jpeg|4000|2250|0|3499471||1637502143|1631380276000|1631380274856|0|0|0|||||||| +2914|5009|content://media/external/images/media/5009|/storage/emulated/0/DCIM/Camera/IMG_20210911_191104.jpg|image/jpeg|4000|2250|0|4168555||1637506101|1631380266000|1631380266488|0|0|0|||||||| +2915|3716|content://media/external/images/media/3716|/storage/emulated/0/DCIM/Camera/IMG_20210911_190552.jpg|image/jpeg|4000|2250|0|4122128||1637503393|1631379955000|1631379955198|0|0|0|||||||| +2916|4462|content://media/external/images/media/4462|/storage/emulated/0/DCIM/Camera/PANO_20210911_185607.jpg|image/jpeg|7280|3712|0|16259766||1637505068|1631379375000|0|0|0|0|||||||| +2917|4405|content://media/external/images/media/4405|/storage/emulated/0/DCIM/Camera/IMG_20210911_185556.jpg|image/jpeg|4000|2250|0|4599638||1637505004|1631379360000|1631379360451|0|0|0|||||||| +2918|2834|content://media/external/images/media/2834|/storage/emulated/0/DCIM/Camera/IMG_20210911_153553.jpg|image/jpeg|4000|2250|0|6579888||1637501370|1631367357000|1631367357620|0|0|0|||||||| +2919|3558|content://media/external/images/media/3558|/storage/emulated/0/DCIM/Camera/IMG_20210911_153539.jpg|image/jpeg|4000|2250|0|6730796||1637503058|1631367344000|1631367344073|0|0|0|||||||| +2920|4615|content://media/external/images/media/4615|/storage/emulated/0/DCIM/Camera/IMG_20210911_153523.jpg|image/jpeg|4000|2250|0|5568172||1637505308|1631367328000|1631367328344|0|0|0|||||||| +2921|4492|content://media/external/images/media/4492|/storage/emulated/0/DCIM/Camera/IMG_20210911_153104.jpg|image/jpeg|4000|2250|0|3360650||1637505122|1631367070000|1631367069890|0|0|0|||||||| +2922|7173|content://media/external/images/media/7173|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0038.jpg|image/jpeg|1600|904|0|243087||1637518222|1631366093000|0|0|0|0|||||||| +2923|4708|content://media/external/images/media/4708|/storage/emulated/0/DCIM/Camera/IMG_20210911_150710.jpg|image/jpeg|4160|2340|0|5333292||1637505509|1631365640000|1631365639850|0|0|0|||||||| +2924|4553|content://media/external/images/media/4553|/storage/emulated/0/DCIM/Camera/IMG_20210911_125920.jpg|image/jpeg|4160|2340|0|4536502||1637505187|1631357967000|1631357967122|0|0|0|||||||| +2925|3405|content://media/external/images/media/3405|/storage/emulated/0/DCIM/Camera/IMG_20210911_125757.jpg|image/jpeg|4000|2250|0|3291337||1637502598|1631357880000|1631357880609|0|0|0|||||||| +2926|4479|content://media/external/images/media/4479|/storage/emulated/0/DCIM/Camera/IMG_20210911_120252.jpg|image/jpeg|4000|2250|0|4659922||1637505091|1631354581000|1631354581788|0|0|0|||||||| +2927|3444|content://media/external/images/media/3444|/storage/emulated/0/DCIM/Camera/IMG_20210911_120245.jpg|image/jpeg|4000|2250|0|6313676||1637502783|1631354569000|1631354569218|0|0|0|||||||| +2928|3987|content://media/external/images/media/3987|/storage/emulated/0/DCIM/Camera/IMG_20210911_115105.jpg|image/jpeg|4160|2340|0|5123958||1637504059|1631353871000|1631353871733|0|0|0|||||||| +2929|4807|content://media/external/images/media/4807|/storage/emulated/0/DCIM/Camera/IMG_20210911_114626.jpg|image/jpeg|4000|2250|0|4134692||1637505663|1631353593000|1631353592978|0|0|0|||||||| +2930|3542|content://media/external/images/media/3542|/storage/emulated/0/DCIM/Camera/IMG_20210911_114612.jpg|image/jpeg|4000|2250|0|5974959||1637503010|1631353575000|1631353575232|0|0|0|||||||| +2931|3948|content://media/external/images/media/3948|/storage/emulated/0/DCIM/Camera/IMG_20210911_113835.jpg|image/jpeg|4000|2250|0|4767794||1637503853|1631353116000|1631353047502|0|0|0|||||||| +2932|3798|content://media/external/images/media/3798|/storage/emulated/0/DCIM/Camera/IMG_20210911_113724.jpg|image/jpeg|4000|2250|0|5330080||1637503558|1631353047000|1631353047502|0|0|0|||||||| +2933|3328|content://media/external/images/media/3328|/storage/emulated/0/DCIM/Camera/IMG_20210911_113248.jpg|image/jpeg|4000|2250|0|5847287||1637502438|1631352770000|1631352770255|0|0|0|||||||| +2934|4363|content://media/external/images/media/4363|/storage/emulated/0/DCIM/Camera/IMG_20210911_113221.jpg|image/jpeg|4000|2250|90|6529016||1637504970|1631352744000|1631352744633|0|0|0|||||||| +2935|7205|content://media/external/images/media/7205|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0021.jpg|image/jpeg|1600|1200|0|332325||1637518223|1631351167000|0|0|0|0|||||||| +2936|7382|content://media/external/images/media/7382|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0019.jpg|image/jpeg|1600|900|0|119442||1637518223|1631351164000|0|0|0|0|||||||| +2937|7440|content://media/external/images/media/7440|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0015.jpg|image/jpeg|1600|904|0|129324||1637518223|1631350191000|0|0|0|0|||||||| +2938|7519|content://media/external/images/media/7519|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0014.jpg|image/jpeg|2048|1536|0|258191||1637518223|1631350190000|0|0|0|0|||||||| +2939|4216|content://media/external/images/media/4216|/storage/emulated/0/DCIM/Camera/IMG_20210911_103805.jpg|image/jpeg|5184|2916|0|4858378||1637504640|1631349486000|1631349455003|0|0|0|||||||| +2940|4806|content://media/external/images/media/4806|/storage/emulated/0/DCIM/Camera/IMG_20210911_103648.jpg|image/jpeg|5184|2916|0|4715865||1637505663|1631349411000|1631349410941|0|0|0|||||||| +2941|4787|content://media/external/images/media/4787|/storage/emulated/0/DCIM/Camera/IMG_20210911_091127.jpg|image/jpeg|4160|2340|0|4685670||1637505656|1631344296000|1631344294921|0|0|0|||||||| +2942|2836|content://media/external/images/media/2836|/storage/emulated/0/DCIM/Camera/PANO_20210911_085804.jpg|image/jpeg|7888|3712|0|20679566||1637501370|1631343493000|0|0|0|0|||||||| +2943|4686|content://media/external/images/media/4686|/storage/emulated/0/DCIM/Camera/PANO_20210911_084601.jpg|image/jpeg|9168|3648|0|26123583||1637505480|1631342770000|0|0|0|0|||||||| +2944|7163|content://media/external/images/media/7163|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0049.jpg|image/jpeg|1200|1600|0|227045||1637518222|1631307720000|0|0|0|0|||||||| +2945|7500|content://media/external/images/media/7500|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0048.jpg|image/jpeg|1200|1600|0|160171||1637518223|1631307718000|0|0|0|0|||||||| +2946|7098|content://media/external/images/media/7098|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0047.jpg|image/jpeg|1600|1200|0|251463||1637518222|1631307716000|0|0|0|0|||||||| +2947|7066|content://media/external/images/media/7066|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0046.jpg|image/jpeg|1600|900|0|209145||1637518222|1631307715000|0|0|0|0|||||||| +2948|7499|content://media/external/images/media/7499|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0016.jpg|image/jpeg|1536|2048|0|276015||1637518223|1631307715000|0|0|0|0|||||||| +2949|3693|content://media/external/images/media/3693|/storage/emulated/0/DCIM/Camera/IMG_20210910_213028.jpg|image/jpeg|4000|2250|0|3792686||1637503390|1631302231000|1631302231238|0|0|0|||||||| +2950|3590|content://media/external/images/media/3590|/storage/emulated/0/DCIM/Camera/IMG_20210910_184557.jpg|image/jpeg|4000|2250|90|4854027||1637503154|1631292360000|1631292359814|0|0|0|||||||| +2951|3217|content://media/external/images/media/3217|/storage/emulated/0/DCIM/Camera/IMG_20210910_184556.jpg|image/jpeg|4000|2250|90|4923420||1637502256|1631292358000|1631292358352|0|0|0|||||||| +2952|3905|content://media/external/images/media/3905|/storage/emulated/0/DCIM/Camera/IMG_20210910_160438.jpg|image/jpeg|4000|2250|0|3462406||1637503732|1631282680000|1631282680715|0|0|0|||||||| +2953|4767|content://media/external/images/media/4767|/storage/emulated/0/DCIM/Camera/IMG_20210910_160044.jpg|image/jpeg|4000|2250|90|4468380||1637505639|1631282447000|1631282447188|0|0|0|||||||| +2954|4960|content://media/external/images/media/4960|/storage/emulated/0/DCIM/Camera/IMG_20210910_123711.jpg|image/jpeg|4000|2250|0|4559345||1637506015|1631270235000|1631270234895|0|0|0|||||||| +2955|4573|content://media/external/images/media/4573|/storage/emulated/0/DCIM/Camera/IMG_20210910_123653.jpg|image/jpeg|4160|2340|0|5056283||1637505216|1631270218000|1631270218421|0|0|0|||||||| +2956|3390|content://media/external/images/media/3390|/storage/emulated/0/DCIM/Camera/IMG_20210910_080341.jpg|image/jpeg|2250|1941|0|1968955||1637502523|1631253823000|1631252653577|0|0|0|||||||| +2957|3458|content://media/external/images/media/3458|/storage/emulated/0/DCIM/Camera/IMG_20210910_074411.jpg|image/jpeg|4000|2250|90|4356581||1637502804|1631252653000|1631252653577|0|0|0|||||||| +2958|7269|content://media/external/images/media/7269|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0012.jpg|image/jpeg|1536|2048|0|593968||1637518223|1631250663000|0|0|0|0|||||||| +2959|7283|content://media/external/images/media/7283|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG_20210910_070932.jpg|image/jpeg|579|599|0|142580||1637518223|1631250572000|0|0|0|0|||||||| +2960|7428|content://media/external/images/media/7428|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0013.jpg|image/jpeg|1536|2048|0|597882||1637518223|1631250304000|0|0|0|0|||||||| +2961|7126|content://media/external/images/media/7126|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0010.jpg|image/jpeg|1200|1600|0|403502||1637518222|1631232989000|0|0|0|0|||||||| +2962|7097|content://media/external/images/media/7097|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0009.jpg|image/jpeg|1600|900|0|108654||1637518222|1631232988000|0|0|0|0|||||||| +2963|7458|content://media/external/images/media/7458|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0003.jpg|image/jpeg|1600|900|0|199246||1637518223|1631232988000|0|0|0|0|||||||| +2964|7268|content://media/external/images/media/7268|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0008.jpg|image/jpeg|1600|1200|0|334155||1637518223|1631232987000|0|0|0|0|||||||| +2965|7224|content://media/external/images/media/7224|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0007.jpg|image/jpeg|1600|900|0|201551||1637518223|1631232816000|0|0|0|0|||||||| +2966|7427|content://media/external/images/media/7427|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0006.jpg|image/jpeg|1600|900|0|206182||1637518223|1631232816000|0|0|0|0|||||||| +2967|7459|content://media/external/images/media/7459|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0005.jpg|image/jpeg|1600|900|0|221772||1637518223|1631232815000|0|0|0|0|||||||| +2968|7594|content://media/external/images/media/7594|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0004.jpg|image/jpeg|1600|1200|0|289632||1637518223|1631232814000|0|0|0|0|||||||| +2969|7125|content://media/external/images/media/7125|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210909-WA0040.jpg|image/jpeg|1600|900|0|285826||1637518222|1631232812000|0|0|0|0|||||||| +2970|2892|content://media/external/images/media/2892|/storage/emulated/0/DCIM/Camera/IMG_20210909_224019.jpg|image/jpeg|4000|2250|90|3436548||1637501516|1631220022000|1631220021845|0|0|0|||||||| +2971|3157|content://media/external/images/media/3157|/storage/emulated/0/DCIM/Camera/IMG_20210909_223348.jpg|image/jpeg|4000|2250|90|3720195||1637502130|1631219630000|1631219630123|0|0|0|||||||| +2972|3015|content://media/external/images/media/3015|/storage/emulated/0/DCIM/Camera/IMG_20210909_223342.jpg|image/jpeg|4000|2250|90|2297086||1637501786|1631219624000|1631219624506|0|0|0|||||||| +2973|4940|content://media/external/images/media/4940|/storage/emulated/0/DCIM/Camera/IMG_20210909_223205.jpg|image/jpeg|4000|2250|90|3836075||1637506010|1631219527000|1631219527537|0|0|0|||||||| +2974|4144|content://media/external/images/media/4144|/storage/emulated/0/DCIM/Camera/IMG_20210909_223138.jpg|image/jpeg|4160|2340|90|2925148||1637504473|1631219502000|1631219502285|0|0|0|||||||| +2975|4459|content://media/external/images/media/4459|/storage/emulated/0/DCIM/Camera/IMG_20210909_223001.jpg|image/jpeg|4160|2340|90|2760066||1637505068|1631219401000|1631219401323|0|0|0|||||||| +2976|2955|content://media/external/images/media/2955|/storage/emulated/0/DCIM/Camera/IMG_20210909_205358.jpg|image/jpeg|4160|2340|0|3923410||1637501661|1631213643000|1631213643628|0|0|0|||||||| +2977|4901|content://media/external/images/media/4901|/storage/emulated/0/DCIM/Camera/IMG_20210909_205300.jpg|image/jpeg|4160|2340|0|3921425||1637505920|1631213585000|1631213585345|0|0|0|||||||| +2978|3541|content://media/external/images/media/3541|/storage/emulated/0/DCIM/Camera/IMG_20210909_203845.jpg|image/jpeg|4160|2340|90|2643222||1637503010|1631212726000|1631212725834|0|0|0|||||||| +2979|5024|content://media/external/images/media/5024|/storage/emulated/0/DCIM/Camera/IMG_20210909_190610.jpg|image/jpeg|5184|2916|180|3533042||1637506134|1631207173000|1631207173061|0|0|0|||||||| +2980|3859|content://media/external/images/media/3859|/storage/emulated/0/DCIM/Camera/IMG_20210909_190512.jpg|image/jpeg|4000|2250|0|4862388||1637503642|1631207114000|1631207114508|0|0|0|||||||| +2981|2833|content://media/external/images/media/2833|/storage/emulated/0/DCIM/Camera/IMG_20210909_190509.jpg|image/jpeg|4000|2250|0|4739655||1637501370|1631207112000|1631207112098|0|0|0|||||||| +2982|3670|content://media/external/images/media/3670|/storage/emulated/0/DCIM/Camera/IMG_20210909_190506.jpg|image/jpeg|4000|2250|0|4381529||1637503358|1631207108000|1631207108020|0|0|0|||||||| +2983|4648|content://media/external/images/media/4648|/storage/emulated/0/DCIM/Camera/IMG_20210909_190504.jpg|image/jpeg|4000|2250|0|4299371||1637505414|1631207105000|1631207105755|0|0|0|||||||| +2984|3754|content://media/external/images/media/3754|/storage/emulated/0/DCIM/Camera/IMG_20210909_190500.jpg|image/jpeg|4000|2250|0|4320074||1637503488|1631207102000|1631207101935|0|0|0|||||||| +2985|4424|content://media/external/images/media/4424|/storage/emulated/0/DCIM/Camera/IMG_20210909_190457.jpg|image/jpeg|4000|2250|0|4303752||1637505063|1631207099000|1631207099404|0|0|0|||||||| +2986|3649|content://media/external/images/media/3649|/storage/emulated/0/DCIM/Camera/IMG_20210909_190455.jpg|image/jpeg|4000|2250|0|4319722||1637503301|1631207096000|1631207096895|0|0|0|||||||| +2987|4766|content://media/external/images/media/4766|/storage/emulated/0/DCIM/Camera/IMG_20210909_190445.jpg|image/jpeg|4000|2250|0|4220082||1637505639|1631207087000|1631207087326|0|0|0|||||||| +2988|3648|content://media/external/images/media/3648|/storage/emulated/0/DCIM/Camera/IMG_20210909_190234.jpg|image/jpeg|4000|2250|0|4265662||1637503301|1631206956000|1631206955908|0|0|0|||||||| +2989|4215|content://media/external/images/media/4215|/storage/emulated/0/DCIM/Camera/IMG_20210909_190209.jpg|image/jpeg|4000|2250|0|4272182||1637504640|1631206930000|1631206930138|0|0|0|||||||| +2990|4516|content://media/external/images/media/4516|/storage/emulated/0/DCIM/Camera/IMG_20210909_190202.jpg|image/jpeg|4000|2250|0|4188155||1637505160|1631206924000|1631206924315|0|0|0|||||||| +2991|3037|content://media/external/images/media/3037|/storage/emulated/0/DCIM/Camera/IMG_20210909_190200.jpg|image/jpeg|4000|2250|0|4214189||1637501805|1631206923000|1631206923158|0|0|0|||||||| +2992|4682|content://media/external/images/media/4682|/storage/emulated/0/DCIM/Camera/IMG_20210909_185330.jpg|image/jpeg|1906|2898|0|1939617||1637505480|1631206410000|1631206258736|0|0|0|||||||| +2993|3692|content://media/external/images/media/3692|/storage/emulated/0/DCIM/Camera/IMG_20210909_185117.jpg|image/jpeg|1906|2898|0|1937059||1637503390|1631206278000|1631206258736|0|0|0|||||||| +2994|4071|content://media/external/images/media/4071|/storage/emulated/0/DCIM/Camera/IMG_20210909_185057.jpg|image/jpeg|4000|2250|90|4239679||1637504342|1631206258000|1631206258736|0|0|0|||||||| +2995|4744|content://media/external/images/media/4744|/storage/emulated/0/DCIM/Camera/IMG_20210909_185052.jpg|image/jpeg|4000|2250|90|4226263||1637505574|1631206254000|1631206254251|0|0|0|||||||| +2996|3932|content://media/external/images/media/3932|/storage/emulated/0/DCIM/Camera/IMG_20210909_185049.jpg|image/jpeg|4000|2250|90|4282244||1637503834|1631206251000|1631206251146|0|0|0|||||||| +2997|4939|content://media/external/images/media/4939|/storage/emulated/0/DCIM/Camera/IMG_20210909_184853.jpg|image/jpeg|4000|2250|90|3777464||1637506010|1631206135000|1631206135561|0|0|0|||||||| +2998|3314|content://media/external/images/media/3314|/storage/emulated/0/DCIM/Camera/IMG_20210909_184524.jpg|image/jpeg|4000|2250|90|4108862||1637502430|1631205926000|1631205926209|0|0|0|||||||| +2999|4274|content://media/external/images/media/4274|/storage/emulated/0/DCIM/Camera/IMG_20210909_184505.jpg|image/jpeg|4000|2250|90|4051728||1637504757|1631205906000|1631205906653|0|0|0|||||||| +3000|3964|content://media/external/images/media/3964|/storage/emulated/0/DCIM/Camera/IMG_20210909_184435.jpg|image/jpeg|4000|2250|90|3316785||1637503942|1631205877000|1631205877776|0|0|0|||||||| +3001|3255|content://media/external/images/media/3255|/storage/emulated/0/DCIM/Camera/IMG_20210909_184430.jpg|image/jpeg|4000|2250|90|3513138||1637502259|1631205874000|1631205874650|0|0|0|||||||| +3002|4478|content://media/external/images/media/4478|/storage/emulated/0/DCIM/Camera/IMG_20210909_184345.jpg|image/jpeg|4000|2250|90|4515821||1637505091|1631205826000|1631205826589|0|0|0|||||||| +3003|2851|content://media/external/images/media/2851|/storage/emulated/0/DCIM/Camera/IMG_20210909_183851.jpg|image/jpeg|4160|2340|0|4429647||1637501431|1631205537000|1631205536893|0|0|0|||||||| +3004|5023|content://media/external/images/media/5023|/storage/emulated/0/DCIM/Camera/IMG_20210909_183844.jpg|image/jpeg|4000|2250|0|4220984||1637506134|1631205526000|1631205526186|0|0|0|||||||| +3005|3498|content://media/external/images/media/3498|/storage/emulated/0/DCIM/Camera/IMG_20210909_183841.jpg|image/jpeg|4000|2250|0|4543364||1637502870|1631205522000|1631205522781|0|0|0|||||||| +3006|3327|content://media/external/images/media/3327|/storage/emulated/0/DCIM/Camera/IMG_20210909_183813.jpg|image/jpeg|4000|2250|0|4479162||1637502438|1631205494000|1631205494810|0|0|0|||||||| +3007|3931|content://media/external/images/media/3931|/storage/emulated/0/DCIM/Camera/IMG_20210909_183758.jpg|image/jpeg|4160|2340|0|4666663||1637503834|1631205484000|1631205483861|0|0|0|||||||| +3008|4872|content://media/external/images/media/4872|/storage/emulated/0/DCIM/Camera/IMG_20210909_183327.jpg|image/jpeg|4000|2250|0|4445001||1637505831|1631205209000|1631205209227|0|0|0|||||||| +3009|4593|content://media/external/images/media/4593|/storage/emulated/0/DCIM/Camera/IMG_20210909_183314.jpg|image/jpeg|4160|2340|90|4678898||1637505278|1631205198000|1631205198625|0|0|0|||||||| +3010|4920|content://media/external/images/media/4920|/storage/emulated/0/DCIM/Camera/IMG_20210909_183222.jpg|image/jpeg|5184|2916|0|4252151||1637505944|1631205145000|1631205145039|0|0|0|||||||| +3011|2793|content://media/external/images/media/2793|/storage/emulated/0/DCIM/Camera/IMG_20210909_183220.jpg|image/jpeg|5184|2916|0|4241327||1637501282|1631205144000|1631205144021|0|0|0|||||||| +3012|4125|content://media/external/images/media/4125|/storage/emulated/0/DCIM/Camera/IMG_20210909_183206.jpg|image/jpeg|4000|2250|0|4384669||1637504451|1631205129000|1631205129063|0|0|0|||||||| +3013|7604|content://media/external/images/media/7604|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG_20210909_132354.jpg|image/jpeg|1600|1200|0|672459||1637518223|1631186634000|0|0|0|0|||||||| +3014|2832|content://media/external/images/media/2832|/storage/emulated/0/DCIM/Camera/IMG_20210909_130504.jpg|image/jpeg|4160|2340|0|3049698||1637501370|1631185504000|1631185504108|0|0|0|||||||| +3015|2850|content://media/external/images/media/2850|/storage/emulated/0/DCIM/Camera/IMG_20210909_130344.jpg|image/jpeg|4000|2250|90|4096217||1637501431|1631185426000|1631185426045|0|0|0|||||||| +3016|4194|content://media/external/images/media/4194|/storage/emulated/0/DCIM/Camera/IMG_20210909_130340.jpg|image/jpeg|4000|2250|90|3929764||1637504558|1631185423000|1631185423103|0|0|0|||||||| +3017|7343|content://media/external/images/media/7343|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210909-WA0026.jpg|image/jpeg|1600|1200|0|276625||1637518223|1631183590000|0|0|0|0|||||||| +3018|4919|content://media/external/images/media/4919|/storage/emulated/0/DCIM/Camera/IMG_20210909_122820.jpg|image/jpeg|4000|2250|0|4613555||1637505944|1631183305000|1631183305513|0|0|0|||||||| +3019|3460|content://media/external/images/media/3460|/storage/emulated/0/DCIM/Camera/PANO_20210909_121355.jpg|image/jpeg|6416|3744|0|15954804||1637502804|1631182446000|0|0|0|0|||||||| +3020|4707|content://media/external/images/media/4707|/storage/emulated/0/DCIM/Camera/IMG_20210909_121335.jpg|image/jpeg|4160|2340|0|5157499||1637505509|1631182423000|1631182422938|0|0|0|||||||| +3021|3557|content://media/external/images/media/3557|/storage/emulated/0/DCIM/Camera/IMG_20210909_121324.jpg|image/jpeg|4000|2250|0|6873328||1637503058|1631182409000|1631182409383|0|0|0|||||||| +3022|4723|content://media/external/images/media/4723|/storage/emulated/0/DCIM/Camera/IMG_20210909_114835.jpg|image/jpeg|4000|2250|0|5334614||1637505565|1631180920000|1631180919816|0|0|0|||||||| +3023|4871|content://media/external/images/media/4871|/storage/emulated/0/DCIM/Camera/IMG_20210909_112455.jpg|image/jpeg|4160|2340|90|3836202||1637505831|1631179503000|1631179500457|0|0|0|||||||| +3024|3313|content://media/external/images/media/3313|/storage/emulated/0/DCIM/Camera/IMG_20210909_112446.jpg|image/jpeg|4160|2340|0|4246152||1637502430|1631179495000|1631179494758|0|0|0|||||||| +3025|4515|content://media/external/images/media/4515|/storage/emulated/0/DCIM/Camera/IMG_20210909_105758.jpg|image/jpeg|4160|2340|0|4650326||1637505160|1631177882000|1631177881957|0|0|0|||||||| +3026|4361|content://media/external/images/media/4361|/storage/emulated/0/DCIM/Camera/IMG_20210909_105747.jpg|image/jpeg|4000|2250|0|5226280||1637504970|1631177870000|1631177870653|0|0|0|||||||| +3027|3797|content://media/external/images/media/3797|/storage/emulated/0/DCIM/Camera/IMG_20210909_103050.jpg|image/jpeg|4000|2250|0|5560677||1637503558|1631176253000|1631176253776|0|0|0|||||||| +3028|7457|content://media/external/images/media/7457|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210909-WA0020.jpg|image/jpeg|904|1600|0|181144||1637518223|1631175525000|0|0|0|0|||||||| +3029|7593|content://media/external/images/media/7593|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210909-WA0021.jpg|image/jpeg|1600|904|0|217160||1637518223|1631175525000|0|0|0|0|||||||| +3030|3479|content://media/external/images/media/3479|/storage/emulated/0/DCIM/Camera/IMG_20210909_095150.jpg|image/jpeg|4160|2340|0|5370716||1637502817|1631173914000|1631173914713|0|0|0|||||||| +3031|4477|content://media/external/images/media/4477|/storage/emulated/0/DCIM/Camera/IMG_20210909_095041.jpg|image/jpeg|4160|2340|0|4887323||1637505091|1631173849000|1631173849100|0|0|0|||||||| +3032|3156|content://media/external/images/media/3156|/storage/emulated/0/DCIM/Camera/IMG_20210909_095026.jpg|image/jpeg|4000|2250|0|5552255||1637502130|1631173828000|1631173828510|0|0|0|||||||| +3033|3691|content://media/external/images/media/3691|/storage/emulated/0/DCIM/Camera/IMG_20210909_094956.jpg|image/jpeg|4000|2250|0|4955497||1637503390|1631173800000|1631173800352|0|0|0|||||||| +3034|4087|content://media/external/images/media/4087|/storage/emulated/0/DCIM/Camera/IMG_20210909_094744.jpg|image/jpeg|4160|2340|90|5939961||1637504394|1631173669000|1631173668991|0|0|0|||||||| +3035|4458|content://media/external/images/media/4458|/storage/emulated/0/DCIM/Camera/IMG_20210909_094727.jpg|image/jpeg|4000|2250|90|4788384||1637505068|1631173650000|1631173650408|0|0|0|||||||| +3036|3389|content://media/external/images/media/3389|/storage/emulated/0/DCIM/Camera/IMG_20210909_094355.jpg|image/jpeg|4160|2340|0|4882568||1637502523|1631173441000|1631173441267|0|0|0|||||||| +3037|4592|content://media/external/images/media/4592|/storage/emulated/0/DCIM/Camera/IMG_20210909_092650.jpg|image/jpeg|4000|2250|0|4570390||1637505278|1631172412000|1631172412122|0|0|0|||||||| +3038|4706|content://media/external/images/media/4706|/storage/emulated/0/DCIM/Camera/IMG_20210909_092122.jpg|image/jpeg|4160|2340|0|4763634||1637505509|1631172088000|1631172088569|0|0|0|||||||| +3039|3884|content://media/external/images/media/3884|/storage/emulated/0/DCIM/Camera/IMG_20210909_092032.jpg|image/jpeg|4160|2340|0|4092156||1637503729|1631172037000|1631172037553|0|0|0|||||||| +3040|4214|content://media/external/images/media/4214|/storage/emulated/0/DCIM/Camera/IMG_20210909_092021.jpg|image/jpeg|4000|2250|0|4856270||1637504640|1631172024000|1631172024574|0|0|0|||||||| +3041|2954|content://media/external/images/media/2954|/storage/emulated/0/DCIM/Camera/IMG_20210909_091336.jpg|image/jpeg|4160|2340|0|4207864||1637501661|1631171618000|1631171618574|0|0|0|||||||| +3042|2869|content://media/external/images/media/2869|/storage/emulated/0/DCIM/Camera/IMG_20210909_091325.jpg|image/jpeg|4160|2340|0|4932501||1637501458|1631171611000|1631171611337|0|0|0|||||||| +3043|5008|content://media/external/images/media/5008|/storage/emulated/0/DCIM/Camera/IMG_20210909_091035.jpg|image/jpeg|5184|2916|0|4038609||1637506101|1631171436000|1631171383760|0|0|0|||||||| +3044|2997|content://media/external/images/media/2997|/storage/emulated/0/DCIM/Camera/IMG_20210909_090941.jpg|image/jpeg|5184|2916|0|3780440||1637501771|1631171384000|1631171383760|0|0|0|||||||| +3045|4047|content://media/external/images/media/4047|/storage/emulated/0/DCIM/Camera/PANO_20210909_071758.jpg|image/jpeg|8112|3712|0|17703205||1637504234|1631164687000|0|0|0|0|||||||| +3046|4236|content://media/external/images/media/4236|/storage/emulated/0/DCIM/Camera/IMG_20210908_211424.jpg|image/jpeg|4000|2250|0|4216032||1637504726|1631128467000|1631128466996|0|0|0|||||||| +3047|3523|content://media/external/images/media/3523|/storage/emulated/0/DCIM/Camera/IMG_20210908_211223.jpg|image/jpeg|4000|2250|0|3794076||1637502970|1631128347000|1631128347172|0|0|0|||||||| +3048|4423|content://media/external/images/media/4423|/storage/emulated/0/DCIM/Camera/IMG_20210908_191646.jpg|image/jpeg|4160|2340|0|4216915||1637505063|1631121410000|1631121409947|0|0|0|||||||| +3049|4086|content://media/external/images/media/4086|/storage/emulated/0/DCIM/Camera/IMG_20210908_191638.jpg|image/jpeg|4160|2340|0|3260706||1637504394|1631121398000|1631121398237|0|0|0|||||||| +3050|4938|content://media/external/images/media/4938|/storage/emulated/0/DCIM/Camera/IMG_20210908_191607.jpg|image/jpeg|4160|2340|0|4651455||1637506010|1631121374000|1631121373943|0|0|0|||||||| +3051|3404|content://media/external/images/media/3404|/storage/emulated/0/DCIM/Camera/IMG_20210908_191555.jpg|image/jpeg|4000|2250|0|4537260||1637502598|1631121359000|1631121359059|0|0|0|||||||| +3052|3858|content://media/external/images/media/3858|/storage/emulated/0/DCIM/Camera/IMG_20210908_191550.jpg|image/jpeg|4000|2250|0|3957911||1637503642|1631121355000|1631121355605|0|0|0|||||||| +3053|4805|content://media/external/images/media/4805|/storage/emulated/0/DCIM/Camera/IMG_20210908_191425.jpg|image/jpeg|4000|2250|0|3139470||1637505663|1631121270000|1631121270161|0|0|0|||||||| +3054|4273|content://media/external/images/media/4273|/storage/emulated/0/DCIM/Camera/IMG_20210908_191216.jpg|image/jpeg|4000|2250|90|3936495||1637504757|1631121139000|1631121139250|0|0|0|||||||| +3055|2792|content://media/external/images/media/2792|/storage/emulated/0/DCIM/Camera/IMG_20210908_191102.jpg|image/jpeg|4160|2340|90|5007726||1637501282|1631121068000|1631121067987|0|0|0|||||||| +3056|3857|content://media/external/images/media/3857|/storage/emulated/0/DCIM/Camera/IMG_20210908_191100.jpg|image/jpeg|4160|2340|0|4074886||1637503642|1631121060000|1631121060642|0|0|0|||||||| +3057|4235|content://media/external/images/media/4235|/storage/emulated/0/DCIM/Camera/IMG_20210908_191015.jpg|image/jpeg|4160|2340|0|5044599||1637504726|1631121021000|1631121021694|0|0|0|||||||| +3058|3930|content://media/external/images/media/3930|/storage/emulated/0/DCIM/Camera/IMG_20210908_190853.jpg|image/jpeg|4160|2340|0|4719631||1637503834|1631120940000|1631120939902|0|0|0|||||||| +3059|2977|content://media/external/images/media/2977|/storage/emulated/0/DCIM/Camera/IMG_20210908_190825.jpg|image/jpeg|4160|2340|0|4420185||1637501685|1631120909000|1631120909411|0|0|0|||||||| +3060|3234|content://media/external/images/media/3234|/storage/emulated/0/DCIM/Camera/IMG_20210908_190818.jpg|image/jpeg|4160|2340|90|4152287||1637502258|1631120904000|1631120903988|0|0|0|||||||| +3061|3326|content://media/external/images/media/3326|/storage/emulated/0/DCIM/Camera/IMG_20210908_181304.jpg|image/jpeg|4000|2250|0|5006219||1637502438|1631117587000|1631117587137|0|0|0|||||||| +3062|3833|content://media/external/images/media/3833|/storage/emulated/0/DCIM/Camera/IMG_20210908_174722.jpg|image/jpeg|4000|2250|0|5856581||1637503630|1631116045000|1631116045237|0|0|0|||||||| +3063|3176|content://media/external/images/media/3176|/storage/emulated/0/DCIM/Camera/IMG_20210908_174709.jpg|image/jpeg|4160|2340|0|5799162||1637502143|1631116032000|1631116032702|0|0|0|||||||| +3064|3427|content://media/external/images/media/3427|/storage/emulated/0/DCIM/Camera/IMG_20210908_174650.jpg|image/jpeg|4000|2250|0|5925237||1637502682|1631116013000|1631116013306|0|0|0|||||||| +3065|4536|content://media/external/images/media/4536|/storage/emulated/0/DCIM/Camera/IMG_20210908_174227.jpg|image/jpeg|4160|2340|0|4514069||1637505165|1631115751000|1631115751741|0|0|0|||||||| +3066|2919|content://media/external/images/media/2919|/storage/emulated/0/DCIM/Camera/IMG_20210908_174217.jpg|image/jpeg|4000|2250|0|4791830||1637501535|1631115739000|1631115739191|0|0|0|||||||| +3067|3120|content://media/external/images/media/3120|/storage/emulated/0/DCIM/Camera/IMG_20210908_174211.jpg|image/jpeg|4000|2250|0|4506332||1637502054|1631115734000|1631115734254|0|0|0|||||||| +3068|3478|content://media/external/images/media/3478|/storage/emulated/0/DCIM/Camera/IMG_20210908_170350.jpg|image/jpeg|4000|2250|90|5796887||1637502817|1631113432000|1631113432242|0|0|0|||||||| +3069|4234|content://media/external/images/media/4234|/storage/emulated/0/DCIM/Camera/IMG_20210908_170345.jpg|image/jpeg|4000|2250|0|7378175||1637504726|1631113427000|1631113427621|0|0|0|||||||| +3070|2935|content://media/external/images/media/2935|/storage/emulated/0/DCIM/Camera/IMG_20210908_165857.jpg|image/jpeg|4000|2250|0|3710096||1637501599|1631113140000|1631113139863|0|0|0|||||||| +3071|7333|content://media/external/images/media/7333|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0039.jpg|image/jpeg|904|1600|0|217040||1637518223|1631112925000|0|0|0|0|||||||| +3072|7592|content://media/external/images/media/7592|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0038.jpg|image/jpeg|904|1600|0|183524||1637518223|1631112924000|0|0|0|0|||||||| +3073|7371|content://media/external/images/media/7371|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0037.jpg|image/jpeg|904|1600|0|167613||1637518223|1631112923000|0|0|0|0|||||||| +3074|7124|content://media/external/images/media/7124|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0036.jpg|image/jpeg|904|1600|0|192613||1637518222|1631112922000|0|0|0|0|||||||| +3075|4045|content://media/external/images/media/4045|/storage/emulated/0/DCIM/Camera/IMG_20210908_165419.jpg|image/jpeg|4000|2250|0|3819133||1637504234|1631112864000|1631112864517|0|0|0|||||||| +3076|4331|content://media/external/images/media/4331|/storage/emulated/0/DCIM/Camera/IMG_20210908_165357.jpg|image/jpeg|8000|6000|0|20349276||1637504895|1631112839000|1631112839414|0|0|0|||||||| +3077|4900|content://media/external/images/media/4900|/storage/emulated/0/DCIM/Camera/IMG_20210908_165354.jpg|image/jpeg|8000|6000|0|20562938||1637505920|1631112837000|1631112836714|0|0|0|||||||| +3078|3690|content://media/external/images/media/3690|/storage/emulated/0/DCIM/Camera/IMG_20210908_165342.jpg|image/jpeg|8000|6000|0|23855021||1637503390|1631112824000|1631112824643|0|0|0|||||||| +3079|4959|content://media/external/images/media/4959|/storage/emulated/0/DCIM/Camera/IMG_20210908_165329.jpg|image/jpeg|8000|6000|0|22522566||1637506015|1631112811000|1631112811679|0|0|0|||||||| +3080|2818|content://media/external/images/media/2818|/storage/emulated/0/DCIM/Camera/IMG_20210908_165321.jpg|image/jpeg|8000|6000|0|21185185||1637501312|1631112805000|1631112804816|0|0|0|||||||| +3081|4743|content://media/external/images/media/4743|/storage/emulated/0/DCIM/Camera/IMG_20210908_165259.jpg|image/jpeg|4000|2250|0|2623746||1637505574|1631112781000|1631112781418|0|0|0|||||||| +3082|3781|content://media/external/images/media/3781|/storage/emulated/0/DCIM/Camera/IMG_20210908_165245.jpg|image/jpeg|4000|2250|0|2259934||1637503508|1631112767000|1631112767157|0|0|0|||||||| +3083|4786|content://media/external/images/media/4786|/storage/emulated/0/DCIM/Camera/IMG_20210908_165228.jpg|image/jpeg|4000|2250|0|1795379||1637505656|1631112750000|1631112750213|0|0|0|||||||| +3084|4958|content://media/external/images/media/4958|/storage/emulated/0/DCIM/Camera/IMG_20210908_164702.jpg|image/jpeg|4000|2250|90|4596232||1637506015|1631112425000|1631112425644|0|0|0|||||||| +3085|3689|content://media/external/images/media/3689|/storage/emulated/0/DCIM/Camera/IMG_20210908_164504.jpg|image/jpeg|4000|2250|0|5328642||1637503390|1631112309000|1631112308986|0|0|0|||||||| +3086|4330|content://media/external/images/media/4330|/storage/emulated/0/DCIM/Camera/IMG_20210908_163644.jpg|image/jpeg|4000|2250|0|2326035||1637504895|1631111805000|1631111805674|0|0|0|||||||| +3087|4457|content://media/external/images/media/4457|/storage/emulated/0/DCIM/Camera/IMG_20210908_163640.jpg|image/jpeg|4000|2250|0|2210587||1637505068|1631111801000|1631111801748|0|0|0|||||||| +3088|4252|content://media/external/images/media/4252|/storage/emulated/0/DCIM/Camera/IMG_20210908_163623.jpg|image/jpeg|4000|2250|0|6051087||1637504734|1631111786000|1631111786064|0|0|0|||||||| +3089|4025|content://media/external/images/media/4025|/storage/emulated/0/DCIM/Camera/IMG_20210908_155348.jpg|image/jpeg|4160|2340|0|5218302||1637504201|1631109229000|1631109229766|0|0|0|||||||| +3090|3904|content://media/external/images/media/3904|/storage/emulated/0/DCIM/Camera/IMG_20210908_155336.jpg|image/jpeg|4160|2340|0|5539379||1637503732|1631109218000|1631109218778|0|0|0|||||||| +3091|3294|content://media/external/images/media/3294|/storage/emulated/0/DCIM/Camera/IMG_20210908_155330.jpg|image/jpeg|4160|2340|90|5413535||1637502355|1631109214000|1631109214398|0|0|0|||||||| +3092|3426|content://media/external/images/media/3426|/storage/emulated/0/DCIM/Camera/IMG_20210908_155206.jpg|image/jpeg|720|1280|270|192844||1637502682|1631109126000|0|0|0|0|||||||| +3093|4551|content://media/external/images/media/4551|/storage/emulated/0/DCIM/Camera/IMG_20210908_155201.jpg|image/jpeg|4160|2340|0|5500403||1637505187|1631109125000|1631109125424|0|0|0|||||||| +3094|4833|content://media/external/images/media/4833|/storage/emulated/0/DCIM/Camera/IMG_20210908_155152.jpg|image/jpeg|4000|2250|0|6171498||1637505731|1631109115000|1631109115114|0|0|0|||||||| +3095|7591|content://media/external/images/media/7591|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0032.jpg|image/jpeg|1600|904|0|247577||1637518223|1631109028000|0|0|0|0|||||||| +3096|4832|content://media/external/images/media/4832|/storage/emulated/0/DCIM/Camera/IMG_20210908_154814.jpg|image/jpeg|1338|1938|0|831377||1637505731|1631108895000|1631108744087|0|0|0|||||||| +3097|7267|content://media/external/images/media/7267|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0031.jpg|image/jpeg|1600|904|0|263868||1637518223|1631108885000|0|0|0|0|||||||| +3098|3014|content://media/external/images/media/3014|/storage/emulated/0/DCIM/Camera/IMG_20210908_154538.jpg|image/jpeg|4000|2250|0|4438121||1637501786|1631108744000|1631108744087|0|0|0|||||||| +3099|3736|content://media/external/images/media/3736|/storage/emulated/0/DCIM/Camera/IMG_20210908_140637.jpg|image/jpeg|4000|2250|0|1726798||1637503477|1631102800000|1631102800471|0|0|0|||||||| +3100|3195|content://media/external/images/media/3195|/storage/emulated/0/DCIM/Camera/IMG_20210908_140609.jpg|image/jpeg|4160|2340|0|5647476||1637502161|1631102776000|1631102776184|0|0|0|||||||| +3101|3272|content://media/external/images/media/3272|/storage/emulated/0/DCIM/Camera/IMG_20210908_135538.jpg|image/jpeg|4160|2340|0|5135722||1637502342|1631102146000|1631102145835|0|0|0|||||||| +3102|2849|content://media/external/images/media/2849|/storage/emulated/0/DCIM/Camera/IMG_20210908_100253.jpg|image/jpeg|5184|2916|0|3293524||1637501431|1631088174000|1631088174541|0|0|0|||||||| +3103|3540|content://media/external/images/media/3540|/storage/emulated/0/DCIM/Camera/IMG_20210908_100240.jpg|image/jpeg|5184|2916|0|2872784||1637503010|1631088163000|1631088163162|0|0|0|||||||| +3104|4104|content://media/external/images/media/4104|/storage/emulated/0/DCIM/Camera/IMG_20210908_100204.jpg|image/jpeg|4000|2250|0|5294375||1637504400|1631088126000|1631088126583|0|0|0|||||||| +3105|4360|content://media/external/images/media/4360|/storage/emulated/0/DCIM/Camera/IMG_20210908_095247.jpg|image/jpeg|4000|2250|0|5459558||1637504970|1631087569000|1631087569611|0|0|0|||||||| +3106|3119|content://media/external/images/media/3119|/storage/emulated/0/DCIM/Camera/IMG_20210908_094052.jpg|image/jpeg|4000|2250|90|5515566||1637502054|1631086855000|1631086855452|0|0|0|||||||| +3107|2996|content://media/external/images/media/2996|/storage/emulated/0/DCIM/Camera/IMG_20210908_092511.jpg|image/jpeg|4160|2340|0|4988034||1637501771|1631085914000|1631085913984|0|0|0|||||||| +3108|4382|content://media/external/images/media/4382|/storage/emulated/0/DCIM/Camera/IMG_20210908_092506.jpg|image/jpeg|4160|2340|0|4972500||1637504982|1631085911000|1631085910989|0|0|0|||||||| +3109|3457|content://media/external/images/media/3457|/storage/emulated/0/DCIM/Camera/IMG_20210908_092451.jpg|image/jpeg|4000|2250|0|5415191||1637502804|1631085895000|1631085895343|0|0|0|||||||| +3110|3312|content://media/external/images/media/3312|/storage/emulated/0/DCIM/Camera/IMG_20210908_091508.jpg|image/jpeg|4000|2250|0|4063969||1637502430|1631085311000|1631085310942|0|0|0|||||||| +3111|7096|content://media/external/images/media/7096|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0016.jpg|image/jpeg|904|1600|0|188724||1637518222|1631085295000|0|0|0|0|||||||| +3112|5006|content://media/external/images/media/5006|/storage/emulated/0/DCIM/Camera/IMG_20210908_090903.jpg|image/jpeg|4000|2250|0|4802907||1637506101|1631084946000|1631084946361|0|0|0|||||||| +3113|4381|content://media/external/images/media/4381|/storage/emulated/0/DCIM/Camera/IMG_20210908_085250.jpg|image/jpeg|4000|2250|90|4098977||1637504982|1631083974000|1631083974621|0|0|0|||||||| +3114|4160|content://media/external/images/media/4160|/storage/emulated/0/DCIM/Camera/IMG_20210908_084445.jpg|image/jpeg|5184|2916|0|4021731||1637504481|1631083486000|1631083450407|0|0|0|||||||| +3115|7315|content://media/external/images/media/7315|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0011.jpg|image/jpeg|2048|1536|0|699661||1637518223|1631082780000|0|0|0|0|||||||| +3116|7266|content://media/external/images/media/7266|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0009.jpg|image/jpeg|1600|904|0|177219||1637518223|1631078335000|0|0|0|0|||||||| +3117|7548|content://media/external/images/media/7548|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0000.jpg|image/jpeg|1600|904|0|146772||1637518223|1631078330000|0|0|0|0|||||||| +3118|3194|content://media/external/images/media/3194|/storage/emulated/0/DCIM/Camera/IMG_20210907_191432.jpg|image/jpeg|5184|2916|0|4605888||1637502161|1631034873000|1631034848566|0|0|0|||||||| +3119|7332|content://media/external/images/media/7332|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0054.jpg|image/jpeg|904|1600|0|170825||1637518223|1631034665000|0|0|0|0|||||||| +3120|4475|content://media/external/images/media/4475|/storage/emulated/0/DCIM/Camera/IMG_20210907_190951.jpg|image/jpeg|4000|2250|0|4492651||1637505091|1631034594000|1631034594451|0|0|0|||||||| +3121|4681|content://media/external/images/media/4681|/storage/emulated/0/DCIM/Camera/IMG_20210907_184344.jpg|image/jpeg|4000|2250|90|4103854||1637505480|1631033028000|1631033027859|0|0|0|||||||| +3122|3057|content://media/external/images/media/3057|/storage/emulated/0/DCIM/Camera/IMG_20210907_184309.jpg|image/jpeg|4000|2250|0|4478823||1637501858|1631032991000|1631032991446|0|0|0|||||||| +3123|4671|content://media/external/images/media/4671|/storage/emulated/0/DCIM/Camera/IMG_20210907_184304.jpg|image/jpeg|4000|2250|0|4210132||1637505418|1631032988000|1631032988391|0|0|0|||||||| +3124|4742|content://media/external/images/media/4742|/storage/emulated/0/DCIM/Camera/IMG_20210907_182410.jpg|image/jpeg|5184|2916|0|5107573||1637505574|1631031854000|1631031854233|0|0|0|||||||| +3125|4173|content://media/external/images/media/4173|/storage/emulated/0/DCIM/Camera/IMG_20210907_182358.jpg|image/jpeg|4000|2250|0|5676378||1637504556|1631031841000|1631031840867|0|0|0|||||||| +3126|7404|content://media/external/images/media/7404|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0044.jpg|image/jpeg|904|1600|0|221024||1637518223|1631022352000|0|0|0|0|||||||| +3127|4192|content://media/external/images/media/4192|/storage/emulated/0/DCIM/Camera/IMG_20210907_154522.jpg|image/jpeg|4000|2250|90|4834328||1637504558|1631022324000|1631022323909|0|0|0|||||||| +3128|4292|content://media/external/images/media/4292|/storage/emulated/0/DCIM/Camera/IMG_20210907_154452.jpg|image/jpeg|4000|2250|90|5460218||1637504808|1631022297000|1631022296867|0|0|0|||||||| +3129|2995|content://media/external/images/media/2995|/storage/emulated/0/DCIM/Camera/IMG_20210907_115338.jpg|image/jpeg|4000|2250|0|4472841||1637501771|1631008420000|1631008420027|0|0|0|||||||| +3130|3819|content://media/external/images/media/3819|/storage/emulated/0/DCIM/Camera/IMG_20210907_115328.jpg|image/jpeg|4160|2340|0|4215049||1637503601|1631008412000|1631008412709|0|0|0|||||||| +3131|3647|content://media/external/images/media/3647|/storage/emulated/0/DCIM/Camera/IMG_20210907_113401.jpg|image/jpeg|4000|2250|90|4408669||1637503301|1631007243000|1631007243000|0|0|0|||||||| +3132|3832|content://media/external/images/media/3832|/storage/emulated/0/DCIM/Camera/IMG_20210907_113304.jpg|image/jpeg|4000|2250|0|4612946||1637503630|1631007186000|1631007185887|0|0|0|||||||| +3133|4765|content://media/external/images/media/4765|/storage/emulated/0/DCIM/Camera/IMG_20210907_113300.jpg|image/jpeg|4000|2250|0|4426133||1637505639|1631007181000|1631007181547|0|0|0|||||||| +3134|3056|content://media/external/images/media/3056|/storage/emulated/0/DCIM/Camera/IMG_20210907_113251.jpg|image/jpeg|4000|2250|0|3544647||1637501858|1631007175000|1631007175309|0|0|0|||||||| +3135|7471|content://media/external/images/media/7471|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0035.jpg|image/jpeg|1600|904|0|174149||1637518223|1631006428000|0|0|0|0|||||||| +3136|4831|content://media/external/images/media/4831|/storage/emulated/0/DCIM/Camera/IMG_20210907_111723.jpg|image/jpeg|4160|2340|0|5213436||1637505731|1631006250000|1631006250114|0|0|0|||||||| +3137|3780|content://media/external/images/media/3780|/storage/emulated/0/DCIM/Camera/IMG_20210907_111707.jpg|image/jpeg|4000|2250|0|4761431||1637503508|1631006230000|1631006230004|0|0|0|||||||| +3138|2891|content://media/external/images/media/2891|/storage/emulated/0/DCIM/Camera/IMG_20210907_100747.jpg|image/jpeg|2250|4000|0|3952761||1637501516|1631002068000|1631001149395|0|0|0|||||||| +3139|3012|content://media/external/images/media/3012|/storage/emulated/0/DCIM/Camera/IMG_20210907_100321.jpg|image/jpeg|4160|2340|0|5230996||1637501786|1631001811000|1631001811359|0|0|0|||||||| +3140|3425|content://media/external/images/media/3425|/storage/emulated/0/DCIM/Camera/IMG_20210907_095543.jpg|image/jpeg|4160|2340|0|5253451||1637502682|1631001352000|1631001351918|0|0|0|||||||| +3141|3753|content://media/external/images/media/3753|/storage/emulated/0/DCIM/Camera/IMG_20210907_095342.jpg|image/jpeg|4000|2250|0|4956086||1637503488|1631001225000|1631001225180|0|0|0|||||||| +3142|4474|content://media/external/images/media/4474|/storage/emulated/0/DCIM/Camera/IMG_20210907_095343.jpg|image/jpeg|4000|2250|0|4424600||1637505091|1631001225000|1631001225005|0|0|0|||||||| +3143|3963|content://media/external/images/media/3963|/storage/emulated/0/DCIM/Camera/IMG_20210907_095210.jpg|image/jpeg|4000|2250|90|5891972||1637503942|1631001133000|1631001132799|0|0|0|||||||| +3144|2953|content://media/external/images/media/2953|/storage/emulated/0/DCIM/Camera/IMG_20210907_095204.jpg|image/jpeg|4000|2250|0|5705334||1637501661|1631001128000|1631001127983|0|0|0|||||||| +3145|7521|content://media/external/images/media/7521|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0030.jpg|image/jpeg|904|1600|0|229244||1637518223|1631000973000|0|0|0|0|||||||| +3146|4685|content://media/external/images/media/4685|/storage/emulated/0/DCIM/Camera/PANO_20210907_094655.jpg|image/jpeg|7152|3776|0|17770257||1637505480|1631000821000|0|0|0|0|||||||| +3147|4348|content://media/external/images/media/4348|/storage/emulated/0/DCIM/Camera/PANO_20210907_094643.jpg|image/jpeg|7888|3744|0|21130271||1637504907|1631000811000|0|0|0|0|||||||| +3148|7065|content://media/external/images/media/7065|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0028.jpg|image/jpeg|1600|904|0|211999||1637518222|1631000677000|0|0|0|0|||||||| +3149|7370|content://media/external/images/media/7370|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0027.jpg|image/jpeg|904|1600|0|151089||1637518223|1631000676000|0|0|0|0|||||||| +3150|7237|content://media/external/images/media/7237|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0026.jpg|image/jpeg|1600|904|0|269429||1637518223|1631000675000|0|0|0|0|||||||| +3151|7123|content://media/external/images/media/7123|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0025.jpg|image/jpeg|1600|904|0|270805||1637518222|1631000674000|0|0|0|0|||||||| +3152|7284|content://media/external/images/media/7284|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0024.jpg|image/jpeg|1600|904|0|267732||1637518223|1631000672000|0|0|0|0|||||||| +3153|3353|content://media/external/images/media/3353|/storage/emulated/0/DCIM/Camera/IMG_20210907_094348.jpg|image/jpeg|4160|2340|90|6733815||1637502439|1631000632000|1631000632497|0|0|0|||||||| +3154|4741|content://media/external/images/media/4741|/storage/emulated/0/DCIM/Camera/IMG_20210907_094341.jpg|image/jpeg|4160|2340|0|3332467||1637505574|1631000621000|1631000621372|0|0|0|||||||| +3155|4722|content://media/external/images/media/4722|/storage/emulated/0/DCIM/Camera/IMG_20210907_093650.jpg|image/jpeg|4160|2340|0|3920531||1637505565|1631000213000|1631000213526|0|0|0|||||||| +3156|4591|content://media/external/images/media/4591|/storage/emulated/0/DCIM/Camera/IMG_20210907_093641.jpg|image/jpeg|4160|2340|0|3955212||1637505278|1631000209000|1631000208984|0|0|0|||||||| +3157|3818|content://media/external/images/media/3818|/storage/emulated/0/DCIM/Camera/IMG_20210907_091321.jpg|image/jpeg|4000|2250|90|5245808||1637503601|1630998804000|1630998803684|0|0|0|||||||| +3158|4764|content://media/external/images/media/4764|/storage/emulated/0/DCIM/Camera/IMG_20210907_091255.jpg|image/jpeg|4000|2250|0|4764258||1637505639|1630998778000|1630998778307|0|0|0|||||||| +3159|3175|content://media/external/images/media/3175|/storage/emulated/0/DCIM/Camera/IMG_20210907_085958.jpg|image/jpeg|4000|2250|0|4495246||1637502143|1630998000000|1630998000230|0|0|0|||||||| +3160|3929|content://media/external/images/media/3929|/storage/emulated/0/DCIM/Camera/IMG_20210907_085825.jpg|image/jpeg|5184|2916|0|4964613||1637503834|1630997907000|1630997907767|0|0|0|||||||| +3161|4272|content://media/external/images/media/4272|/storage/emulated/0/DCIM/Camera/IMG_20210907_085754.jpg|image/jpeg|5184|2916|0|4463010||1637504757|1630997878000|1630997878802|0|0|0|||||||| +3162|3271|content://media/external/images/media/3271|/storage/emulated/0/DCIM/Camera/IMG_20210907_075022.jpg|image/jpeg|4000|2250|0|3549185||1637502342|1630993826000|1630993826307|0|0|0|||||||| +3163|7162|content://media/external/images/media/7162|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0013.jpg|image/jpeg|1600|904|0|202862||1637518222|1630992135000|0|0|0|0|||||||| +3164|7223|content://media/external/images/media/7223|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0011.jpg|image/jpeg|904|1600|0|113725||1637518223|1630991539000|0|0|0|0|||||||| +3165|7498|content://media/external/images/media/7498|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0010.jpg|image/jpeg|1600|904|0|167854||1637518223|1630991444000|0|0|0|0|||||||| +3166|7369|content://media/external/images/media/7369|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0009.jpg|image/jpeg|904|1600|0|143687||1637518223|1630991315000|0|0|0|0|||||||| +3167|7222|content://media/external/images/media/7222|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0008.jpg|image/jpeg|1600|904|0|103051||1637518223|1630991152000|0|0|0|0|||||||| +3168|7161|content://media/external/images/media/7161|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0007.jpg|image/jpeg|1600|904|0|181836||1637518222|1630991049000|0|0|0|0|||||||| +3169|7456|content://media/external/images/media/7456|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0005.jpg|image/jpeg|904|1600|0|124058||1637518223|1630990534000|0|0|0|0|||||||| +3170|7122|content://media/external/images/media/7122|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0004.jpg|image/jpeg|1600|904|0|169256||1637518222|1630990533000|0|0|0|0|||||||| +3171|7497|content://media/external/images/media/7497|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0003.jpg|image/jpeg|1600|904|0|142957||1637518223|1630990532000|0|0|0|0|||||||| +3172|7221|content://media/external/images/media/7221|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0002.jpg|image/jpeg|1600|904|0|95911||1637518223|1630990530000|0|0|0|0|||||||| +3173|7368|content://media/external/images/media/7368|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0001.jpg|image/jpeg|1600|904|0|111757||1637518223|1630990529000|0|0|0|0|||||||| +3174|4721|content://media/external/images/media/4721|/storage/emulated/0/DCIM/Camera/IMG_20210906_212806.jpg|image/jpeg|4000|2250|0|3933047||1637505565|1630956490000|1630956489887|0|0|0|||||||| +3175|4851|content://media/external/images/media/4851|/storage/emulated/0/DCIM/Camera/IMG_20210906_205221.jpg|image/jpeg|4160|2340|0|2853909||1637505753|1630954341000|1630954341041|0|0|0|||||||| +3176|4251|content://media/external/images/media/4251|/storage/emulated/0/DCIM/Camera/IMG_20210906_205217.jpg|image/jpeg|4160|2340|0|2873510||1637504734|1630954337000|1630954336989|0|0|0|||||||| +3177|4404|content://media/external/images/media/4404|/storage/emulated/0/DCIM/Camera/IMG_20210906_204046.jpg|image/jpeg|4000|2250|0|3317693||1637505004|1630953649000|1630953648921|0|0|0|||||||| +3178|2952|content://media/external/images/media/2952|/storage/emulated/0/DCIM/Camera/IMG_20210906_203033.jpg|image/jpeg|4000|2250|0|2256039||1637501661|1630953036000|1630953036239|0|0|0|||||||| +3179|4442|content://media/external/images/media/4442|/storage/emulated/0/DCIM/Camera/IMG_20210906_202814.jpg|image/jpeg|4000|2250|0|2542668||1637505068|1630952898000|1630952898126|0|0|0|||||||| +3180|3752|content://media/external/images/media/3752|/storage/emulated/0/DCIM/Camera/IMG_20210906_202541.jpg|image/jpeg|4000|2250|0|2486601||1637503488|1630952747000|1630952747352|0|0|0|||||||| +3181|4380|content://media/external/images/media/4380|/storage/emulated/0/DCIM/Camera/IMG_20210906_190427.jpg|image/jpeg|4160|2340|0|4595428||1637504982|1630947869000|1630947869031|0|0|0|||||||| +3182|3556|content://media/external/images/media/3556|/storage/emulated/0/DCIM/Camera/IMG_20210906_190421.jpg|image/jpeg|4160|2340|0|4819837||1637503058|1630947866000|1630947865930|0|0|0|||||||| +3183|4008|content://media/external/images/media/4008|/storage/emulated/0/DCIM/Camera/IMG_20210906_190410.jpg|image/jpeg|4000|2250|0|5161307||1637504086|1630947853000|1630947853692|0|0|0|||||||| +3184|2934|content://media/external/images/media/2934|/storage/emulated/0/DCIM/Camera/IMG_20210906_190402.jpg|image/jpeg|4000|2250|0|5087462||1637501599|1630947844000|1630947844564|0|0|0|||||||| +3185|2880|content://media/external/images/media/2880|/storage/emulated/0/DCIM/Camera/IMG_20210906_185455.jpg|image/jpeg|4000|2250|0|4205085||1637501461|1630947297000|1630947297340|0|0|0|||||||| +3186|4763|content://media/external/images/media/4763|/storage/emulated/0/DCIM/Camera/IMG_20210906_185423.jpg|image/jpeg|4000|2250|0|4774913||1637505639|1630947267000|1630947267637|0|0|0|||||||| +3187|3735|content://media/external/images/media/3735|/storage/emulated/0/DCIM/Camera/IMG_20210906_185325.jpg|image/jpeg|4000|2250|0|3938163||1637503477|1630947208000|1630947208111|0|0|0|||||||| +3188|7590|content://media/external/images/media/7590|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0057.jpg|image/jpeg|1600|904|0|117528||1637518223|1630946250000|0|0|0|0|||||||| +3189|7390|content://media/external/images/media/7390|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0053.jpg|image/jpeg|1600|904|0|193872||1637518223|1630945235000|0|0|0|0|||||||| +3190|2951|content://media/external/images/media/2951|/storage/emulated/0/DCIM/Camera/IMG_20210906_182004.jpg|image/jpeg|4000|2250|0|5065696||1637501661|1630945207000|1630945207410|0|0|0|||||||| +3191|7389|content://media/external/images/media/7389|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0052.jpg|image/jpeg|1600|904|0|158753||1637518223|1630943750000|0|0|0|0|||||||| +3192|4785|content://media/external/images/media/4785|/storage/emulated/0/DCIM/Camera/IMG_20210906_174410.jpg|image/jpeg|4000|2250|90|5139973||1637505656|1630943052000|1630943052469|0|0|0|||||||| +3193|2831|content://media/external/images/media/2831|/storage/emulated/0/DCIM/Camera/IMG_20210906_174404.jpg|image/jpeg|4000|2250|0|5020255||1637501370|1630943046000|1630943046418|0|0|0|||||||| +3194|4850|content://media/external/images/media/4850|/storage/emulated/0/DCIM/Camera/IMG_20210906_174354.jpg|image/jpeg|4000|2250|0|4211276||1637505753|1630943037000|1630943037374|0|0|0|||||||| +3195|7367|content://media/external/images/media/7367|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0051.jpg|image/jpeg|1600|904|0|109241||1637518223|1630939386000|0|0|0|0|||||||| +3196|3669|content://media/external/images/media/3669|/storage/emulated/0/DCIM/Camera/IMG_20210906_164239.jpg|image/jpeg|4000|2250|0|4542810||1637503358|1630939361000|1630939361638|0|0|0|||||||| +3197|4514|content://media/external/images/media/4514|/storage/emulated/0/DCIM/Camera/IMG_20210906_162909.jpg|image/jpeg|4160|2340|0|4999021||1637505160|1630938555000|1630938554880|0|0|0|||||||| +3198|3856|content://media/external/images/media/3856|/storage/emulated/0/DCIM/Camera/IMG_20210906_162837.jpg|image/jpeg|4000|2250|0|5409498||1637503642|1630938519000|1630938519367|0|0|0|||||||| +3199|7366|content://media/external/images/media/7366|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0050.jpg|image/jpeg|1600|904|0|192564||1637518223|1630938488000|0|0|0|0|||||||| +3200|7455|content://media/external/images/media/7455|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0049.jpg|image/jpeg|1600|904|0|149518||1637518223|1630938109000|0|0|0|0|||||||| +3201|7547|content://media/external/images/media/7547|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0048.jpg|image/jpeg|1600|904|0|180068||1637518223|1630938108000|0|0|0|0|||||||| +3202|7314|content://media/external/images/media/7314|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0047.jpg|image/jpeg|1600|904|0|168851||1637518223|1630938107000|0|0|0|0|||||||| +3203|3254|content://media/external/images/media/3254|/storage/emulated/0/DCIM/Camera/IMG_20210906_160056.jpg|image/jpeg|4000|2250|0|5609395||1637502259|1630936863000|1630936863106|0|0|0|||||||| +3204|7472|content://media/external/images/media/7472|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0044.jpg|image/jpeg|904|1600|0|112920||1637518223|1630935662000|0|0|0|0|||||||| +3205|3036|content://media/external/images/media/3036|/storage/emulated/0/DCIM/Camera/IMG_20210906_153222.jpg|image/jpeg|4160|2340|0|5286509||1637501805|1630935149000|1630935149473|0|0|0|||||||| +3206|3882|content://media/external/images/media/3882|/storage/emulated/0/DCIM/Camera/IMG_20210906_153202.jpg|image/jpeg|5184|2916|270|4830196||1637503729|1630935126000|1630935126099|0|0|0|||||||| +3207|7171|content://media/external/images/media/7171|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0039.jpg|image/jpeg|1600|904|0|239439||1637518222|1630934887000|0|0|0|0|||||||| +3208|7172|content://media/external/images/media/7172|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0041.jpg|image/jpeg|1600|904|0|246106||1637518222|1630934860000|0|0|0|0|||||||| +3209|7520|content://media/external/images/media/7520|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0040.jpg|image/jpeg|1600|904|0|245658||1637518223|1630934859000|0|0|0|0|||||||| +3210|7342|content://media/external/images/media/7342|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0038.jpg|image/jpeg|1600|904|0|239984||1637518223|1630934857000|0|0|0|0|||||||| +3211|7170|content://media/external/images/media/7170|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0037.jpg|image/jpeg|1600|904|0|251228||1637518222|1630934855000|0|0|0|0|||||||| +3212|3796|content://media/external/images/media/3796|/storage/emulated/0/DCIM/Camera/IMG_20210906_152540.jpg|image/jpeg|5184|2916|0|4450056||1637503558|1630934743000|1630934743236|0|0|0|||||||| +3213|7187|content://media/external/images/media/7187|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0036.jpg|image/jpeg|1600|904|0|204266||1637518223|1630934720000|0|0|0|0|||||||| +3214|4143|content://media/external/images/media/4143|/storage/emulated/0/DCIM/Camera/IMG_20210906_152443.jpg|image/jpeg|4000|2250|0|5338684||1637504473|1630934687000|1630934686817|0|0|0|||||||| +3215|7558|content://media/external/images/media/7558|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0034.jpg|image/jpeg|1600|904|0|139617||1637518223|1630934679000|0|0|0|0|||||||| +3216|7113|content://media/external/images/media/7113|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0033.jpg|image/jpeg|904|1600|0|165974||1637518222|1630934676000|0|0|0|0|||||||| +3217|3477|content://media/external/images/media/3477|/storage/emulated/0/DCIM/Camera/IMG_20210906_150831.jpg|image/jpeg|2113|3757|0|2196698||1637502817|1630933713000|1630933555838|0|0|0|||||||| +3218|4007|content://media/external/images/media/4007|/storage/emulated/0/DCIM/Camera/IMG_20210906_150619.jpg|image/jpeg|4160|2340|0|4888096||1637504086|1630933583000|1630933583034|0|0|0|||||||| +3219|4232|content://media/external/images/media/4232|/storage/emulated/0/DCIM/Camera/IMG_20210906_150613.jpg|image/jpeg|4160|2340|0|5043441||1637504726|1630933579000|1630933578887|0|0|0|||||||| +3220|4085|content://media/external/images/media/4085|/storage/emulated/0/DCIM/Camera/IMG_20210906_150551.jpg|image/jpeg|5184|2916|270|4799354||1637504394|1630933556000|1630933555838|0|0|0|||||||| +3221|4670|content://media/external/images/media/4670|/storage/emulated/0/DCIM/Camera/IMG_20210906_124416.jpg|image/jpeg|5184|2916|0|4529542||1637505418|1630925059000|1630925059458|0|0|0|||||||| +3222|4250|content://media/external/images/media/4250|/storage/emulated/0/DCIM/Camera/IMG_20210906_124346.jpg|image/jpeg|5184|2916|0|4278154||1637504734|1630925030000|1630925030609|0|0|0|||||||| +3223|4084|content://media/external/images/media/4084|/storage/emulated/0/DCIM/Camera/IMG_20210906_124312.jpg|image/jpeg|5184|2916|0|2372640||1637504394|1630924996000|1630924995902|0|0|0|||||||| +3224|3456|content://media/external/images/media/3456|/storage/emulated/0/DCIM/Camera/IMG_20210906_122651.jpg|image/jpeg|4160|2340|0|5696392||1637502804|1630924018000|1630924017806|0|0|0|||||||| +3225|4403|content://media/external/images/media/4403|/storage/emulated/0/DCIM/Camera/IMG_20210906_104105.jpg|image/jpeg|5184|2916|0|4598710||1637505004|1630917669000|1630917668880|0|0|0|||||||| +3226|3646|content://media/external/images/media/3646|/storage/emulated/0/DCIM/Camera/IMG_20210906_104044.jpg|image/jpeg|4160|2340|0|4658267||1637503301|1630917650000|1630917650397|0|0|0|||||||| +3227|2760|content://media/external/images/media/2760|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-09-06-08-57-13-029_com.android.chrome.jpg|image/jpeg|1080|2340|0|539381||1637500987|1630911433000|0|0|0|0|||||||| +3228|2918|content://media/external/images/media/2918|/storage/emulated/0/DCIM/Camera/IMG_20210906_081538.jpg|image/jpeg|4160|2340|180|4355891||1637501535|1630908948000|1630908947624|0|0|0|||||||| +3229|3351|content://media/external/images/media/3351|/storage/emulated/0/DCIM/Camera/IMG_20210906_072222.jpg|image/jpeg|4160|2340|0|4210302||1637502439|1630905747000|1630905747675|0|0|0|||||||| +3230|4957|content://media/external/images/media/4957|/storage/emulated/0/DCIM/Camera/IMG_20210906_071351.jpg|image/jpeg|4160|2340|0|4638883||1637506015|1630905236000|1630905235863|0|0|0|||||||| +3231|2817|content://media/external/images/media/2817|/storage/emulated/0/DCIM/Camera/IMG_20210905_074649.jpg|image/jpeg|4000|2250|90|4211123||1637501312|1630820816000|1630820815848|0|0|0|||||||| +3232|2716|content://media/external/images/media/2716|/storage/emulated/0/DCIM/Screenshots/IMG_20210904_173937.jpg|image/jpeg|1080|1062|0|151139||1637500987|1630769977000|0|0|0|0|||||||| +3233|7496|content://media/external/images/media/7496|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210904-WA0014.jpg|image/jpeg|2048|1536|0|691366||1637518223|1630768762000|0|0|0|0|||||||| +3234|2642|content://media/external/images/media/2642|/storage/emulated/0/DCIM/Screenshots/IMG_20210904_150136.jpg|image/jpeg|1064|1053|0|156384||1637500870|1630760496000|0|0|0|0|||||||| +3235|2715|content://media/external/images/media/2715|/storage/emulated/0/DCIM/Screenshots/IMG_20210904_150030.jpg|image/jpeg|1080|1082|0|148997||1637500987|1630760430000|0|0|0|0|||||||| +3236|2714|content://media/external/images/media/2714|/storage/emulated/0/DCIM/Screenshots/IMG_20210904_145936.jpg|image/jpeg|1080|611|0|122367||1637500987|1630760376000|0|0|0|0|||||||| +3237|3155|content://media/external/images/media/3155|/storage/emulated/0/DCIM/Camera/IMG_20210904_135507.jpg|image/jpeg|1033|2582|0|963316||1637502130|1630756507000|1630756488628|0|0|0|||||||| +3238|2759|content://media/external/images/media/2759|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-09-03-08-53-49-361_com.strava.jpg|image/jpeg|1080|2340|0|584562||1637500987|1630652029000|0|0|0|0|||||||| +3239|7186|content://media/external/images/media/7186|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210902-WA0012.jpg|image/jpeg|1536|2048|0|384517||1637518223|1630590780000|0|0|0|0|||||||| +3240|7064|content://media/external/images/media/7064|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210902-WA0011.jpg|image/jpeg|1600|900|0|178668||1637518222|1630590779000|0|0|0|0|||||||| +3241|3589|content://media/external/images/media/3589|/storage/emulated/0/DCIM/Camera/IMG_20210901_170612.jpg|image/jpeg|2916|5184|0|3813342||1637503154|1630508774000|1630508743887|0|0|0|||||||| +3242|4473|content://media/external/images/media/4473|/storage/emulated/0/DCIM/Camera/IMG_20210901_133041.jpg|image/jpeg|4160|2340|0|4235092||1637505091|1630495845000|1630495845675|0|0|0|||||||| +3243|3270|content://media/external/images/media/3270|/storage/emulated/0/DCIM/Camera/IMG_20210901_132439.jpg|image/jpeg|4160|2340|90|4011793||1637502342|1630495484000|1630495484336|0|0|0|||||||| +3244|4937|content://media/external/images/media/4937|/storage/emulated/0/DCIM/Camera/IMG_20210901_131642.jpg|image/jpeg|4160|2340|0|4430754||1637506010|1630495009000|1630495009623|0|0|0|||||||| +3245|2791|content://media/external/images/media/2791|/storage/emulated/0/DCIM/Camera/IMG_20210831_172602.jpg|image/jpeg|4000|2250|90|3485294||1637501282|1630423567000|1630423567381|0|0|0|||||||| +3246|6321|content://media/external/images/media/6321|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0014.jpg|image/jpeg|2048|1536|0|480317||1637518221|1630315791000|0|0|0|0|||||||| +3247|7454|content://media/external/images/media/7454|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0013.jpg|image/jpeg|2048|1536|0|456568||1637518223|1630315791000|0|0|0|0|||||||| +3248|7094|content://media/external/images/media/7094|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0012.jpg|image/jpeg|2048|1536|0|494982||1637518222|1630315790000|0|0|0|0|||||||| +3249|7185|content://media/external/images/media/7185|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0011.jpg|image/jpeg|2048|1153|0|376141||1637518223|1630315789000|0|0|0|0|||||||| +3250|7426|content://media/external/images/media/7426|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0010.jpg|image/jpeg|2048|1153|0|438995||1637518223|1630315789000|0|0|0|0|||||||| +3251|7452|content://media/external/images/media/7452|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0008.jpg|image/jpeg|2048|1153|0|457996||1637518223|1630315787000|0|0|0|0|||||||| +3252|7160|content://media/external/images/media/7160|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0007.jpg|image/jpeg|2048|1153|0|234916||1637518222|1630315786000|0|0|0|0|||||||| +3253|7159|content://media/external/images/media/7159|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0005.jpg|image/jpeg|2048|1536|0|468403||1637518222|1630315785000|0|0|0|0|||||||| +3254|7365|content://media/external/images/media/7365|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0004.jpg|image/jpeg|2048|1536|0|378656||1637518223|1630315784000|0|0|0|0|||||||| +3255|7155|content://media/external/images/media/7155|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0001.jpg|image/jpeg|1536|2048|0|727128||1637518222|1630305854000|0|0|0|0|||||||| +3256|7157|content://media/external/images/media/7157|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0000.jpg|image/jpeg|1536|2048|0|700098||1637518222|1630305854000|0|0|0|0|||||||| +3257|7158|content://media/external/images/media/7158|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0002.jpg|image/jpeg|1536|2048|0|410271||1637518222|1630305854000|0|0|0|0|||||||| +3258|4680|content://media/external/images/media/4680|/storage/emulated/0/DCIM/Camera/IMG_20210829_184632.jpg|image/jpeg|4000|2250|0|5194817||1637505480|1630255595000|1630255595539|0|0|0|||||||| +3259|2654|content://media/external/images/media/2654|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-29-14-33-58-187_com.stt.android.suunto.jpg|image/jpeg|1080|2340|0|633514||1637500871|1630240438000|0|0|0|0|||||||| +3260|4989|content://media/external/images/media/4989|/storage/emulated/0/DCIM/Camera/IMG_20210829_142823.jpg|image/jpeg|5184|2916|0|3625619||1637506097|1630240105000|1630227244679|0|0|0|||||||| +3261|2713|content://media/external/images/media/2713|/storage/emulated/0/DCIM/Screenshots/IMG_20210829_142138.jpg|image/jpeg|1074|1695|0|303734||1637500987|1630239698000|0|0|0|0|||||||| +3262|3011|content://media/external/images/media/3011|/storage/emulated/0/DCIM/Camera/IMG_20210829_105404.jpg|image/jpeg|5184|2916|0|4468393||1637501786|1630227246000|1630227246841|0|0|0|||||||| +3263|2830|content://media/external/images/media/2830|/storage/emulated/0/DCIM/Camera/IMG_20210829_105353.jpg|image/jpeg|5184|2916|0|4561466||1637501370|1630227237000|1630227237226|0|0|0|||||||| +3264|4006|content://media/external/images/media/4006|/storage/emulated/0/DCIM/Camera/IMG_20210829_105333.jpg|image/jpeg|4160|2340|0|5846949||1637504086|1630227220000|1630227219510|0|0|0|||||||| +3265|2758|content://media/external/images/media/2758|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-27-15-44-09-039_de.komoot.android.jpg|image/jpeg|1080|2340|0|1461501||1637500987|1630071849000|0|0|0|0|||||||| +3266|7364|content://media/external/images/media/7364|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210827-WA0000.jpg|image/jpeg|768|1024|0|78064||1637518223|1630042550000|0|0|0|0|||||||| +3267|7589|content://media/external/images/media/7589|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210826-WA0007.jpg|image/jpeg|1536|2048|0|197692||1637518223|1630006640000|0|0|0|0|||||||| +3268|3645|content://media/external/images/media/3645|/storage/emulated/0/DCIM/Camera/IMG_20210826_211130.jpg|image/jpeg|4160|2340|90|2980157||1637503301|1630005091000|1630005090535|0|0|0|||||||| +3269|7425|content://media/external/images/media/7425|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210824-WA0001.jpg|image/jpeg|1200|1600|0|235905||1637518223|1629781778000|0|0|0|0|||||||| +3270|7363|content://media/external/images/media/7363|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210824-WA0000.jpg|image/jpeg|1200|1600|0|204181||1637518223|1629781777000|0|0|0|0|||||||| +3271|2641|content://media/external/images/media/2641|/storage/emulated/0/DCIM/Screenshots/IMG_20210823_221635.jpg|image/jpeg|1080|1652|0|269985||1637500870|1629749795000|0|0|0|0|||||||| +3272|2712|content://media/external/images/media/2712|/storage/emulated/0/DCIM/Screenshots/IMG_20210820_174703.jpg|image/jpeg|1080|1358|0|109156||1637500987|1629474423000|0|0|0|0|||||||| +3273|2711|content://media/external/images/media/2711|/storage/emulated/0/DCIM/Screenshots/IMG_20210820_174628.jpg|image/jpeg|1077|2038|0|459305||1637500987|1629474388000|0|0|0|0|||||||| +3274|3830|content://media/external/images/media/3830|/storage/emulated/0/DCIM/Camera/IMG_20210820_140736.jpg|image/jpeg|4160|2340|90|4249676||1637503630|1629461261000|1629461261230|0|0|0|||||||| +3275|4941|content://media/external/images/media/4941|/storage/emulated/0/DCIM/Camera/PANO_20210820_114137.jpg|image/jpeg|7568|3712|0|24673924||1637506010|1629452503000|0|0|0|0|||||||| +3276|4253|content://media/external/images/media/4253|/storage/emulated/0/DCIM/Camera/PANO_20210820_100928.jpg|image/jpeg|7888|3776|0|23419825||1637504734|1629446975000|0|0|0|0|||||||| +3277|3903|content://media/external/images/media/3903|/storage/emulated/0/DCIM/Camera/IMG_20210820_095734.jpg|image/jpeg|4160|2340|90|7715453||1637503732|1629446261000|1629446260756|0|0|0|||||||| +3278|3098|content://media/external/images/media/3098|/storage/emulated/0/DCIM/Camera/PANO_20210820_091930.jpg|image/jpeg|7632|3776|0|22201318||1637501971|1629443980000|0|0|0|0|||||||| +3279|7453|content://media/external/images/media/7453|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210818-WA0011.jpg|image/jpeg|901|1600|0|182195||1637518223|1629307337000|0|0|0|0|||||||| +3280|4082|content://media/external/images/media/4082|/storage/emulated/0/DCIM/Camera/IMG_20210818_181006.jpg|image/jpeg|4000|2250|90|3583111||1637504394|1629303009000|1629303009170|0|0|0|||||||| +3281|4988|content://media/external/images/media/4988|/storage/emulated/0/DCIM/Camera/IMG_20210818_120234.jpg|image/jpeg|4000|2250|0|6670884||1637506097|1629280956000|1629280956470|0|0|0|||||||| +3282|3795|content://media/external/images/media/3795|/storage/emulated/0/DCIM/Camera/IMG_20210818_115703.jpg|image/jpeg|4000|2250|0|7443383||1637503558|1629280626000|1629280626323|0|0|0|||||||| +3283|4956|content://media/external/images/media/4956|/storage/emulated/0/DCIM/Camera/IMG_20210818_082947.jpg|image/jpeg|4000|2250|0|6428763||1637506015|1629268190000|1629268189801|0|0|0|||||||| +3284|3476|content://media/external/images/media/3476|/storage/emulated/0/DCIM/Camera/IMG_20210816_201230.jpg|image/jpeg|4000|2250|0|4389773||1637502817|1629137552000|1629137552291|0|0|0|||||||| +3285|3388|content://media/external/images/media/3388|/storage/emulated/0/DCIM/Camera/IMG_20210816_201146.jpg|image/jpeg|4000|2250|90|3489236||1637502523|1629137510000|1629137510641|0|0|0|||||||| +3286|7494|content://media/external/images/media/7494|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210816-WA0011.jpg|image/jpeg|2048|1536|0|527020||1637518223|1629129343000|0|0|0|0|||||||| +3287|3325|content://media/external/images/media/3325|/storage/emulated/0/DCIM/Camera/IMG_20210815_175925.jpg|image/jpeg|4000|2250|0|3899611||1637502438|1629043170000|1629043170154|0|0|0|||||||| +3288|4044|content://media/external/images/media/4044|/storage/emulated/0/DCIM/Camera/IMG_20210815_130946.jpg|image/jpeg|4000|2250|0|4810253||1637504234|1629025788000|1629025788474|0|0|0|||||||| +3289|3118|content://media/external/images/media/3118|/storage/emulated/0/DCIM/Camera/IMG_20210815_130941.jpg|image/jpeg|4000|2250|0|5087345||1637502054|1629025783000|1629025783307|0|0|0|||||||| +3290|3035|content://media/external/images/media/3035|/storage/emulated/0/DCIM/Camera/IMG_20210815_130931.jpg|image/jpeg|4000|2250|90|4934404||1637501805|1629025775000|1629025775480|0|0|0|||||||| +3291|4472|content://media/external/images/media/4472|/storage/emulated/0/DCIM/Camera/IMG_20210815_130927.jpg|image/jpeg|4000|2250|0|5329432||1637505091|1629025768000|1629025772321|0|0|0|||||||| +3292|3928|content://media/external/images/media/3928|/storage/emulated/0/DCIM/Camera/IMG_20210815_080123.jpg|image/jpeg|4000|2250|0|2618622||1637503834|1629007285000|1629007285421|0|0|0|||||||| +3293|2866|content://media/external/images/media/2866|/storage/emulated/0/DCIM/Camera/IMG_20210813_144114.jpg|image/jpeg|1259|642|0|248289||1637501458|1628858475000|1628858074884|0|0|0|||||||| +3294|3778|content://media/external/images/media/3778|/storage/emulated/0/DCIM/Camera/IMG_20210813_143432.jpg|image/jpeg|4000|2250|180|3602526||1637503508|1628858075000|1628858074884|0|0|0|||||||| +3295|2555|content://media/external/images/media/2555|/storage/emulated/0/Android/services/picto_services_2461.png|image/png|90|90|0|5058||1637500783|1628761180000|0|0|0|0|||||||| +3296|2522|content://media/external/images/media/2522|/storage/emulated/0/Android/nearby/picto_nearby_100.png|image/png|90|90|0|4129||1637500783|1628761179000|0|0|0|0|||||||| +3297|2537|content://media/external/images/media/2537|/storage/emulated/0/Android/nearby/picto_nearby_33.png|image/png|90|90|0|5745||1637500783|1628761179000|0|0|0|0|||||||| +3298|2538|content://media/external/images/media/2538|/storage/emulated/0/Android/nearby/picto_nearby_37.png|image/png|90|90|0|4592||1637500783|1628761179000|0|0|0|0|||||||| +3299|2547|content://media/external/images/media/2547|/storage/emulated/0/Android/services/picto_services_11.png|image/png|90|90|0|3075||1637500783|1628761179000|0|0|0|0|||||||| +3300|2540|content://media/external/images/media/2540|/storage/emulated/0/Android/nearby/picto_nearby_43.png|image/png|90|90|0|5059||1637500783|1628761158000|0|0|0|0|||||||| +3301|2523|content://media/external/images/media/2523|/storage/emulated/0/Android/nearby/picto_nearby_103.png|image/png|90|90|0|4178||1637500783|1628761157000|0|0|0|0|||||||| +3302|2529|content://media/external/images/media/2529|/storage/emulated/0/Android/nearby/picto_nearby_174.png|image/png|90|90|0|4747||1637500783|1628761157000|0|0|0|0|||||||| +3303|2530|content://media/external/images/media/2530|/storage/emulated/0/Android/nearby/picto_nearby_20.png|image/png|90|90|0|3362||1637500783|1628761157000|0|0|0|0|||||||| +3304|2548|content://media/external/images/media/2548|/storage/emulated/0/Android/services/picto_services_12.png|image/png|90|90|0|3674||1637500783|1628761157000|0|0|0|0|||||||| +3305|2549|content://media/external/images/media/2549|/storage/emulated/0/Android/services/picto_services_14.png|image/png|90|90|0|4289||1637500783|1628761157000|0|0|0|0|||||||| +3306|2550|content://media/external/images/media/2550|/storage/emulated/0/Android/services/picto_services_15.png|image/png|90|90|0|3259||1637500783|1628761157000|0|0|0|0|||||||| +3307|2551|content://media/external/images/media/2551|/storage/emulated/0/Android/services/picto_services_1624.png|image/png|90|90|0|4153||1637500783|1628761157000|0|0|0|0|||||||| +3308|2552|content://media/external/images/media/2552|/storage/emulated/0/Android/services/picto_services_1731.png|image/png|90|90|0|4515||1637500783|1628761157000|0|0|0|0|||||||| +3309|2556|content://media/external/images/media/2556|/storage/emulated/0/Android/services/picto_services_64.png|image/png|90|90|0|3704||1637500783|1628761157000|0|0|0|0|||||||| +3310|2558|content://media/external/images/media/2558|/storage/emulated/0/Android/tarifs/picto_tarifs_1320.png|image/png|90|90|0|4101||1637500783|1628761157000|0|0|0|0|||||||| +3311|2536|content://media/external/images/media/2536|/storage/emulated/0/Android/nearby/picto_nearby_32.png|image/png|90|90|0|3217||1637500783|1628761156000|0|0|0|0|||||||| +3312|2539|content://media/external/images/media/2539|/storage/emulated/0/Android/nearby/picto_nearby_40.png|image/png|90|90|0|3450||1637500783|1628761156000|0|0|0|0|||||||| +3313|2541|content://media/external/images/media/2541|/storage/emulated/0/Android/nearby/picto_nearby_55.png|image/png|90|90|0|4657||1637500783|1628761156000|0|0|0|0|||||||| +3314|2544|content://media/external/images/media/2544|/storage/emulated/0/Android/nearby/picto_nearby_89.png|image/png|90|90|0|3700||1637500783|1628761156000|0|0|0|0|||||||| +3315|2553|content://media/external/images/media/2553|/storage/emulated/0/Android/services/picto_services_18.png|image/png|90|90|0|3320||1637500783|1628761156000|0|0|0|0|||||||| +3316|2524|content://media/external/images/media/2524|/storage/emulated/0/Android/nearby/picto_nearby_110.png|image/png|90|90|0|6084||1637500783|1628761127000|0|0|0|0|||||||| +3317|2525|content://media/external/images/media/2525|/storage/emulated/0/Android/nearby/picto_nearby_122.png|image/png|90|90|0|6442||1637500783|1628761126000|0|0|0|0|||||||| +3318|2526|content://media/external/images/media/2526|/storage/emulated/0/Android/nearby/picto_nearby_158.png|image/png|90|90|0|4153||1637500783|1628761126000|0|0|0|0|||||||| +3319|2527|content://media/external/images/media/2527|/storage/emulated/0/Android/nearby/picto_nearby_1589.png|image/png|90|90|0|5885||1637500783|1628761126000|0|0|0|0|||||||| +3320|2528|content://media/external/images/media/2528|/storage/emulated/0/Android/nearby/picto_nearby_1634.png|image/png|90|90|0|5711||1637500783|1628761126000|0|0|0|0|||||||| +3321|2531|content://media/external/images/media/2531|/storage/emulated/0/Android/nearby/picto_nearby_21.png|image/png|90|90|0|4016||1637500783|1628761126000|0|0|0|0|||||||| +3322|2532|content://media/external/images/media/2532|/storage/emulated/0/Android/nearby/picto_nearby_2174.png|image/png|90|90|0|5711||1637500783|1628761126000|0|0|0|0|||||||| +3323|2533|content://media/external/images/media/2533|/storage/emulated/0/Android/nearby/picto_nearby_23.png|image/png|90|90|0|3455||1637500783|1628761126000|0|0|0|0|||||||| +3324|2534|content://media/external/images/media/2534|/storage/emulated/0/Android/nearby/picto_nearby_2313.png|image/png|90|90|0|5711||1637500783|1628761126000|0|0|0|0|||||||| +3325|2535|content://media/external/images/media/2535|/storage/emulated/0/Android/nearby/picto_nearby_25.png|image/png|90|90|0|3726||1637500783|1628761126000|0|0|0|0|||||||| +3326|2542|content://media/external/images/media/2542|/storage/emulated/0/Android/nearby/picto_nearby_58.png|image/png|90|90|0|3208||1637500783|1628761126000|0|0|0|0|||||||| +3327|2543|content://media/external/images/media/2543|/storage/emulated/0/Android/nearby/picto_nearby_74.png|image/png|90|90|0|4219||1637500783|1628761126000|0|0|0|0|||||||| +3328|2545|content://media/external/images/media/2545|/storage/emulated/0/Android/nearby/picto_nearby_90.png|image/png|90|90|0|4123||1637500783|1628761126000|0|0|0|0|||||||| +3329|2554|content://media/external/images/media/2554|/storage/emulated/0/Android/services/picto_services_2198.png|image/png|90|90|0|5711||1637500783|1628761125000|0|0|0|0|||||||| +3330|2567|content://media/external/images/media/2567|/storage/emulated/0/offlineSearch/ac_city.png|image/png|90|90|0|2204||1637500783|1628761096000|0|0|0|0|||||||| +3331|7220|content://media/external/images/media/7220|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0022.jpg|image/jpeg|1200|1600|0|439004||1637518223|1628682979000|0|0|0|0|||||||| +3332|7588|content://media/external/images/media/7588|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0020.jpg|image/jpeg|1200|1600|0|396967||1637518223|1628682873000|0|0|0|0|||||||| +3333|7587|content://media/external/images/media/7587|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0019.jpg|image/jpeg|1600|1200|0|384380||1637518223|1628682872000|0|0|0|0|||||||| +3334|6320|content://media/external/images/media/6320|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0018.jpg|image/jpeg|1600|1200|0|416386||1637518221|1628682871000|0|0|0|0|||||||| +3335|7121|content://media/external/images/media/7121|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0017.jpg|image/jpeg|1600|1200|0|437496||1637518222|1628682870000|0|0|0|0|||||||| +3336|7095|content://media/external/images/media/7095|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0016.jpg|image/jpeg|1600|1200|0|152467||1637518222|1628682869000|0|0|0|0|||||||| +3337|7093|content://media/external/images/media/7093|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0015.jpg|image/jpeg|1600|1200|0|307330||1637518222|1628682868000|0|0|0|0|||||||| +3338|6319|content://media/external/images/media/6319|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0014.jpg|image/jpeg|1200|1600|0|217301||1637518221|1628682867000|0|0|0|0|||||||| +3339|7120|content://media/external/images/media/7120|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0010.jpg|image/jpeg|1600|1200|0|625201||1637518222|1628677884000|0|0|0|0|||||||| +3340|7546|content://media/external/images/media/7546|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0009.jpg|image/jpeg|1600|1200|0|448526||1637518223|1628677874000|0|0|0|0|||||||| +3341|7265|content://media/external/images/media/7265|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0008.jpg|image/jpeg|1024|768|0|202666||1637518223|1628677866000|0|0|0|0|||||||| +3342|7586|content://media/external/images/media/7586|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0007.jpg|image/jpeg|768|1024|0|197072||1637518223|1628677864000|0|0|0|0|||||||| +3343|7092|content://media/external/images/media/7092|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0006.jpg|image/jpeg|768|1024|0|192539||1637518222|1628677863000|0|0|0|0|||||||| +3344|7091|content://media/external/images/media/7091|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0005.jpg|image/jpeg|1024|768|0|167569||1637518222|1628677862000|0|0|0|0|||||||| +3345|7424|content://media/external/images/media/7424|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0022.jpg|image/jpeg|1200|1600|0|346358||1637518223|1628582255000|0|0|0|0|||||||| +3346|7119|content://media/external/images/media/7119|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0021.jpg|image/jpeg|1200|1600|0|362239||1637518222|1628582254000|0|0|0|0|||||||| +3347|7156|content://media/external/images/media/7156|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0020.jpg|image/jpeg|1200|1600|0|376053||1637518222|1628582253000|0|0|0|0|||||||| +3348|6318|content://media/external/images/media/6318|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0019.jpg|image/jpeg|1200|1600|0|380261||1637518221|1628582252000|0|0|0|0|||||||| +3349|7312|content://media/external/images/media/7312|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0018.jpg|image/jpeg|1200|1600|0|351746||1637518223|1628582251000|0|0|0|0|||||||| +3350|7090|content://media/external/images/media/7090|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0017.jpg|image/jpeg|1200|1600|0|374427||1637518222|1628582250000|0|0|0|0|||||||| +3351|7313|content://media/external/images/media/7313|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0016.jpg|image/jpeg|1200|1600|0|384821||1637518223|1628582249000|0|0|0|0|||||||| +3352|7264|content://media/external/images/media/7264|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0015.jpg|image/jpeg|1200|1600|0|387003||1637518223|1628582248000|0|0|0|0|||||||| +3353|7219|content://media/external/images/media/7219|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0014.jpg|image/jpeg|1500|2000|0|615528||1637518223|1628582247000|0|0|0|0|||||||| +3354|7362|content://media/external/images/media/7362|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0013.jpg|image/jpeg|1500|2000|0|592614||1637518223|1628582246000|0|0|0|0|||||||| +3355|7545|content://media/external/images/media/7545|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0012.jpg|image/jpeg|1520|2048|0|370557||1637518223|1628582245000|0|0|0|0|||||||| +3356|7423|content://media/external/images/media/7423|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0011.jpg|image/jpeg|1500|2000|0|721427||1637518223|1628582243000|0|0|0|0|||||||| +3357|7361|content://media/external/images/media/7361|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0010.jpg|image/jpeg|1500|2000|0|704200||1637518223|1628582242000|0|0|0|0|||||||| +3358|7311|content://media/external/images/media/7311|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0009.jpg|image/jpeg|1500|2000|0|711457||1637518223|1628582241000|0|0|0|0|||||||| +3359|7118|content://media/external/images/media/7118|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0008.jpg|image/jpeg|1500|2000|0|715786||1637518222|1628582239000|0|0|0|0|||||||| +3360|7360|content://media/external/images/media/7360|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0007.jpg|image/jpeg|2048|1520|0|293792||1637518223|1628582238000|0|0|0|0|||||||| +3361|7495|content://media/external/images/media/7495|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0006.jpg|image/jpeg|1500|2000|0|688181||1637518223|1628582237000|0|0|0|0|||||||| +3362|7218|content://media/external/images/media/7218|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0005.jpg|image/jpeg|1600|1200|0|175121||1637518223|1628582236000|0|0|0|0|||||||| +3363|7544|content://media/external/images/media/7544|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0003.jpg|image/jpeg|1536|2048|0|692293||1637518223|1628576839000|0|0|0|0|||||||| +3364|7451|content://media/external/images/media/7451|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0002.jpg|image/jpeg|1536|2048|0|774960||1637518223|1628576837000|0|0|0|0|||||||| +3365|7543|content://media/external/images/media/7543|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0001.jpg|image/jpeg|1536|2048|0|702918||1637518223|1628576835000|0|0|0|0|||||||| +3366|7089|content://media/external/images/media/7089|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0000.jpg|image/jpeg|2048|1536|0|977771||1637518222|1628576834000|0|0|0|0|||||||| +3367|3630|content://media/external/images/media/3630|/storage/emulated/0/DCIM/Camera/IMG_20210810_073329.jpg|image/jpeg|4000|2250|90|5614096||1637503272|1628573613000|1628573613480|0|0|0|||||||| +3368|3154|content://media/external/images/media/3154|/storage/emulated/0/DCIM/Camera/IMG_20210810_073225.jpg|image/jpeg|4000|2250|0|5078332||1637502130|1628573548000|1628573548466|0|0|0|||||||| +3369|7184|content://media/external/images/media/7184|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210809-WA0002.jpg|image/jpeg|898|1600|0|208266||1637518223|1628531397000|0|0|0|0|||||||| +3370|2757|content://media/external/images/media/2757|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-08-15-14-10-804_com.strava.jpg|image/jpeg|1080|2340|0|855366||1637500987|1628428451000|0|0|0|0|||||||| +3371|2756|content://media/external/images/media/2756|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-08-14-37-51-662_com.brytonsport.active.jpg|image/jpeg|1080|2340|0|523821||1637500987|1628426271000|0|0|0|0|||||||| +3372|3947|content://media/external/images/media/3947|/storage/emulated/0/DCIM/Camera/IMG_20210808_081610.jpg|image/jpeg|4000|2250|0|4209222||1637503853|1628403372000|1628403372637|0|0|0|||||||| +3373|4291|content://media/external/images/media/4291|/storage/emulated/0/DCIM/Camera/IMG_20210808_081556.jpg|image/jpeg|4000|2250|0|3358575||1637504808|1628403361000|1628403361377|0|0|0|||||||| +3374|2755|content://media/external/images/media/2755|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-07-13-10-09-898_com.strava.jpg|image/jpeg|1080|2340|0|528558||1637500987|1628334610000|0|0|0|0|||||||| +3375|3794|content://media/external/images/media/3794|/storage/emulated/0/DCIM/Camera/IMG_20210807_092208.jpg|image/jpeg|4000|2250|0|4482364||1637503558|1628320930000|1628320930061|0|0|0|||||||| +3376|4422|content://media/external/images/media/4422|/storage/emulated/0/DCIM/Camera/IMG_20210807_091725.jpg|image/jpeg|4000|2250|0|4775489||1637505063|1628320648000|1628320648513|0|0|0|||||||| +3377|4918|content://media/external/images/media/4918|/storage/emulated/0/DCIM/Camera/IMG_20210806_191501.jpg|image/jpeg|4000|2250|0|2994010||1637505944|1628270103000|1628270102951|0|0|0|||||||| +3378|3350|content://media/external/images/media/3350|/storage/emulated/0/DCIM/Camera/IMG_20210805_085026.jpg|image/jpeg|4000|2250|0|3203232||1637502439|1628146227000|1628146227755|0|0|0|||||||| +3379|3555|content://media/external/images/media/3555|/storage/emulated/0/DCIM/Camera/IMG_20210805_085016.jpg|image/jpeg|4000|2250|0|3311677||1637503058|1628146218000|1628146218055|0|0|0|||||||| +3380|3034|content://media/external/images/media/3034|/storage/emulated/0/DCIM/Camera/IMG_20210805_085001.jpg|image/jpeg|4000|2250|0|3773247||1637501805|1628146205000|1628146204175|0|0|0|||||||| +3381|2637|content://media/external/images/media/2637|/storage/emulated/0/DCIM/PlantNet/2021-08-04T22_01_19+02_00.JPEG|image/jpeg|4000|3000|90|2158517||1637500870|1628107279000|1628107276219|0|0|0|||||||| +3382|2636|content://media/external/images/media/2636|/storage/emulated/0/DCIM/PlantNet/2021-08-04T22_00_00+02_00.JPEG|image/jpeg|4000|3000|90|4922986||1637500870|1628107200000|1628107193930|0|0|0|||||||| +3383|2754|content://media/external/images/media/2754|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-03-14-59-27-525_com.miui.gallery.jpg|image/jpeg|1080|2340|0|179005||1637500987|1627995567000|0|0|0|0|||||||| +3384|2710|content://media/external/images/media/2710|/storage/emulated/0/DCIM/Screenshots/IMG_20210803_145857.jpg|image/jpeg|1037|844|0|79146||1637500987|1627995537000|0|0|0|0|||||||| +3385|2640|content://media/external/images/media/2640|/storage/emulated/0/DCIM/Screenshots/IMG_20210803_075113.jpg|image/jpeg|1075|1041|0|114078||1637500870|1627969873000|0|0|0|0|||||||| +3386|2639|content://media/external/images/media/2639|/storage/emulated/0/DCIM/Screenshots/IMG_20210803_075039.jpg|image/jpeg|1072|1290|0|418911||1637500870|1627969839000|0|0|0|0|||||||| +3387|2753|content://media/external/images/media/2753|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-03-07-49-51-860_com.stt.android.suunto.jpg|image/jpeg|1080|2340|0|288082||1637500987|1627969792000|0|0|0|0|||||||| +3388|2709|content://media/external/images/media/2709|/storage/emulated/0/DCIM/Screenshots/IMG_20210802_083956.jpg|image/jpeg|1062|1527|0|351626||1637500987|1627886396000|0|0|0|0|||||||| +3389|2752|content://media/external/images/media/2752|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-02-08-39-07-791_com.strava.jpg|image/jpeg|1080|2340|0|694030||1637500987|1627886347000|0|0|0|0|||||||| +3390|7493|content://media/external/images/media/7493|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210801-WA0002.jpg|image/jpeg|1536|2048|0|195624||1637518223|1627803108000|0|0|0|0|||||||| +3391|2816|content://media/external/images/media/2816|/storage/emulated/0/DCIM/Camera/IMG_20210731_194436.jpg|image/jpeg|4000|2250|90|1395356||1637501312|1627753479000|1627753478948|0|0|0|||||||| +3392|3253|content://media/external/images/media/3253|/storage/emulated/0/DCIM/Camera/IMG_20210731_192540.jpg|image/jpeg|4000|2250|0|1742178||1637502259|1627752341000|1627752341347|0|0|0|||||||| +3393|4803|content://media/external/images/media/4803|/storage/emulated/0/DCIM/Camera/IMG_20210731_192538.jpg|image/jpeg|4000|2250|0|1745887||1637505663|1627752339000|1627752339876|0|0|0|||||||| +3394|3522|content://media/external/images/media/3522|/storage/emulated/0/DCIM/Camera/IMG_20210731_192351.jpg|image/jpeg|4000|2250|0|1702871||1637502970|1627752233000|1627752233396|0|0|0|||||||| +3395|4124|content://media/external/images/media/4124|/storage/emulated/0/DCIM/Camera/IMG_20210731_192337.jpg|image/jpeg|4000|2250|0|3381397||1637504451|1627752220000|1627752220594|0|0|0|||||||| +3396|7183|content://media/external/images/media/7183|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210731-WA0012.jpg|image/jpeg|1536|2048|0|354581||1637518223|1627751974000|0|0|0|0|||||||| +3397|6317|content://media/external/images/media/6317|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210726-WA0018.jpg|image/jpeg|1536|2048|0|190700||1637518221|1627327342000|0|0|0|0|||||||| +3398|3854|content://media/external/images/media/3854|/storage/emulated/0/DCIM/Camera/IMG_20210726_184901.jpg|image/jpeg|4000|2250|0|2651437||1637503642|1627318145000|1627318145132|0|0|0|||||||| +3399|4720|content://media/external/images/media/4720|/storage/emulated/0/DCIM/Camera/IMG_20210725_150753.jpg|image/jpeg|4000|2250|0|2688725||1637505565|1627218474000|1627218447550|0|0|0|||||||| +3400|3213|content://media/external/images/media/3213|/storage/emulated/0/DCIM/Camera/IMG_20210725_150637.jpg|image/jpeg|4000|2250|90|2397700||1637502256|1627218399000|1627218399385|0|0|0|||||||| +3401|3961|content://media/external/images/media/3961|/storage/emulated/0/DCIM/Camera/IMG_20210725_150601.jpg|image/jpeg|4000|2250|0|2685201||1637503942|1627218361000|1627218324560|0|0|0|||||||| +3402|3387|content://media/external/images/media/3387|/storage/emulated/0/DCIM/Camera/IMG_20210724_120047.jpg|image/jpeg|4000|2250|90|4231364||1637502523|1627120852000|1627120852071|0|0|0|||||||| +3403|4636|content://media/external/images/media/4636|/storage/emulated/0/DCIM/Camera/IMG_20210724_120007.jpg|image/jpeg|4000|2250|0|3741544||1637505390|1627120809000|1627120809442|0|0|0|||||||| +3404|3076|content://media/external/images/media/3076|/storage/emulated/0/DCIM/Camera/IMG_20210722_162217.jpg|image/jpeg|4160|2340|90|4793012||1637501905|1626963746000|1626963746436|0|0|0|||||||| +3405|3714|content://media/external/images/media/3714|/storage/emulated/0/DCIM/Camera/IMG_20210720_193438.jpg|image/jpeg|4000|2250|0|4685708||1637503393|1626802482000|1626802481681|0|0|0|||||||| +3406|2629|content://media/external/images/media/2629|/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786468044.jpg|image/jpeg|1079|720|0|67827||1637500870|1626786468000|0|0|0|0|||||||| +3407|2628|content://media/external/images/media/2628|/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786457385.jpg|image/jpeg|1079|720|0|59367||1637500870|1626786457000|0|0|0|0|||||||| +3408|2627|content://media/external/images/media/2627|/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786400784.jpg|image/jpeg|1079|720|0|54367||1637500870|1626786400000|0|0|0|0|||||||| +3409|2626|content://media/external/images/media/2626|/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786395070.jpg|image/jpeg|1080|516|0|66095||1637500870|1626786395000|0|0|0|0|||||||| +3410|2625|content://media/external/images/media/2625|/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786360083.jpg|image/jpeg|1080|487|0|64299||1637500870|1626786360000|0|0|0|0|||||||| +3411|2624|content://media/external/images/media/2624|/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786356869.jpg|image/jpeg|1080|561|0|69211||1637500870|1626786356000|0|0|0|0|||||||| +3412|2623|content://media/external/images/media/2623|/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786354371.jpg|image/jpeg|1080|542|0|65310||1637500870|1626786354000|0|0|0|0|||||||| +3413|2622|content://media/external/images/media/2622|/storage/emulated/0/DCIM/Facebook/FB_IMG_1626786321974.jpg|image/jpeg|1079|720|0|78552||1637500870|1626786322000|0|0|0|0|||||||| +3414|2621|content://media/external/images/media/2621|/storage/emulated/0/DCIM/Facebook/FB_IMG_1626784990030.jpg|image/jpeg|1079|720|0|88118||1637500870|1626784990000|0|0|0|0|||||||| +3415|2620|content://media/external/images/media/2620|/storage/emulated/0/DCIM/Facebook/FB_IMG_1626784981067.jpg|image/jpeg|1079|720|0|50201||1637500870|1626784981000|0|0|0|0|||||||| +3416|2619|content://media/external/images/media/2619|/storage/emulated/0/DCIM/Facebook/FB_IMG_1626784972521.jpg|image/jpeg|1079|720|0|86307||1637500870|1626784972000|0|0|0|0|||||||| +3417|2618|content://media/external/images/media/2618|/storage/emulated/0/DCIM/Facebook/FB_IMG_1626784969026.jpg|image/jpeg|1079|720|0|86472||1637500870|1626784969000|0|0|0|0|||||||| +3418|7585|content://media/external/images/media/7585|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0028.jpg|image/jpeg|750|1334|0|87192||1637518223|1626783689000|0|0|0|0|||||||| +3419|6316|content://media/external/images/media/6316|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0018.jpg|image/jpeg|1536|2048|0|471906||1637518221|1626741582000|0|0|0|0|||||||| +3420|7153|content://media/external/images/media/7153|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0016.jpg|image/jpeg|2048|1536|0|496685||1637518222|1626741581000|0|0|0|0|||||||| +3421|7154|content://media/external/images/media/7154|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0017.jpg|image/jpeg|2048|1536|0|497273||1637518222|1626741581000|0|0|0|0|||||||| +3422|7088|content://media/external/images/media/7088|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0015.jpg|image/jpeg|2048|1536|0|518927||1637518222|1626741580000|0|0|0|0|||||||| +3423|7584|content://media/external/images/media/7584|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0014.jpg|image/jpeg|2048|1536|0|498750||1637518223|1626741579000|0|0|0|0|||||||| +3424|7087|content://media/external/images/media/7087|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0013.jpg|image/jpeg|2048|1536|0|435024||1637518222|1626741578000|0|0|0|0|||||||| +3425|7310|content://media/external/images/media/7310|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0012.jpg|image/jpeg|2048|1536|0|491427||1637518223|1626741578000|0|0|0|0|||||||| +3426|7217|content://media/external/images/media/7217|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0011.jpg|image/jpeg|2048|1536|0|529173||1637518223|1626741577000|0|0|0|0|||||||| +3427|7216|content://media/external/images/media/7216|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0010.jpg|image/jpeg|2048|1536|0|519851||1637518223|1626741576000|0|0|0|0|||||||| +3428|6314|content://media/external/images/media/6314|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0009.jpg|image/jpeg|1536|2048|0|456695||1637518221|1626741575000|0|0|0|0|||||||| +3429|6315|content://media/external/images/media/6315|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0008.jpg|image/jpeg|1536|2048|0|458018||1637518221|1626741573000|0|0|0|0|||||||| +3430|7263|content://media/external/images/media/7263|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0007.jpg|image/jpeg|2048|1536|0|370809||1637518223|1626741486000|0|0|0|0|||||||| +3431|7583|content://media/external/images/media/7583|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0006.jpg|image/jpeg|2048|1536|0|317948||1637518223|1626741485000|0|0|0|0|||||||| +3432|7182|content://media/external/images/media/7182|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0005.jpg|image/jpeg|2048|1536|0|307061||1637518223|1626741484000|0|0|0|0|||||||| +3433|7262|content://media/external/images/media/7262|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0004.jpg|image/jpeg|2048|1536|0|332058||1637518223|1626741483000|0|0|0|0|||||||| +3434|4987|content://media/external/images/media/4987|/storage/emulated/0/DCIM/Camera/IMG_20210720_003027.jpg|image/jpeg|4000|2250|0|3916983||1637506097|1626733830000|1626733830028|0|0|0|||||||| +3435|4005|content://media/external/images/media/4005|/storage/emulated/0/DCIM/Camera/IMG_20210712_184122.jpg|image/jpeg|4000|2250|0|4278389||1637504086|1626108084000|1626108084387|0|0|0|||||||| +3436|4026|content://media/external/images/media/4026|/storage/emulated/0/DCIM/Camera/PANO_20210711_160342.jpg|image/jpeg|8528|3744|0|21877666||1637504201|1626012231000|0|0|0|0|||||||| +3437|4191|content://media/external/images/media/4191|/storage/emulated/0/DCIM/Camera/IMG_20210711_160332.jpg|image/jpeg|4160|2340|0|4673958||1637504558|1626012214000|1626012214681|0|0|0|||||||| +3438|3269|content://media/external/images/media/3269|/storage/emulated/0/DCIM/Camera/IMG_20210711_160325.jpg|image/jpeg|4160|2340|0|4602509||1637502342|1626012211000|1626012211305|0|0|0|||||||| +3439|4849|content://media/external/images/media/4849|/storage/emulated/0/DCIM/Camera/IMG_20210710_204916.jpg|image/jpeg|4000|2250|90|1448694||1637505753|1625942958000|1625942958014|0|0|0|||||||| +3440|2814|content://media/external/images/media/2814|/storage/emulated/0/DCIM/Camera/IMG_20210710_204639.jpg|image/jpeg|4000|2250|90|1964295||1637501312|1625942803000|1625942802855|0|0|0|||||||| +3441|4103|content://media/external/images/media/4103|/storage/emulated/0/DCIM/Camera/IMG_20210710_203559.jpg|image/jpeg|4000|2250|0|4088660||1637504400|1625942161000|1625942161801|0|0|0|||||||| +3442|4231|content://media/external/images/media/4231|/storage/emulated/0/DCIM/Camera/IMG_20210708_181815.jpg|image/jpeg|4000|2250|90|5045693||1637504726|1625761098000|1625761098240|0|0|0|||||||| +3443|4740|content://media/external/images/media/4740|/storage/emulated/0/DCIM/Camera/IMG_20210706_194117.jpg|image/jpeg|4160|2340|0|4545085||1637505574|1625593280000|1625593279764|0|0|0|||||||| +3444|4358|content://media/external/images/media/4358|/storage/emulated/0/DCIM/Camera/IMG_20210706_193958.jpg|image/jpeg|4160|2340|0|6764696||1637504970|1625593206000|1625593205629|0|0|0|||||||| +3445|4365|content://media/external/images/media/4365|/storage/emulated/0/DCIM/Camera/PANO_20210706_193858.jpg|image/jpeg|8976|3584|0|31790400||1637504970|1625593145000|0|0|0|0|||||||| +3446|4726|content://media/external/images/media/4726|/storage/emulated/0/DCIM/Camera/PANO_20210706_193837.jpg|image/jpeg|6640|3584|0|23079435||1637505565|1625593124000|0|0|0|0|||||||| +3447|4249|content://media/external/images/media/4249|/storage/emulated/0/DCIM/Camera/IMG_20210706_174743.jpg|image/jpeg|4000|2250|90|3720248||1637504734|1625586468000|1625586468362|0|0|0|||||||| +3448|2617|content://media/external/images/media/2617|/storage/emulated/0/DCIM/Facebook/FB_IMG_1625521144640.jpg|image/jpeg|960|581|0|57135||1637500870|1625521144000|0|0|0|0|||||||| +3449|2616|content://media/external/images/media/2616|/storage/emulated/0/DCIM/Facebook/FB_IMG_1625509616896.jpg|image/jpeg|960|720|0|84069||1637500870|1625509616000|0|0|0|0|||||||| +3450|2615|content://media/external/images/media/2615|/storage/emulated/0/DCIM/Facebook/FB_IMG_1625509609173.jpg|image/jpeg|960|720|0|71895||1637500870|1625509609000|0|0|0|0|||||||| +3451|6313|content://media/external/images/media/6313|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210705-WA0004.jpg|image/jpeg|960|581|0|65590||1637518221|1625463756000|0|0|0|0|||||||| +3452|7422|content://media/external/images/media/7422|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210705-WA0003.jpg|image/jpeg|960|712|0|96161||1637518223|1625463756000|0|0|0|0|||||||| +3453|7086|content://media/external/images/media/7086|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210705-WA0000.jpg|image/jpeg|1536|2048|0|378976||1637518222|1625441375000|0|0|0|0|||||||| +3454|7359|content://media/external/images/media/7359|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210704-WA0028.jpg|image/jpeg|1600|1008|0|148331||1637518223|1625415390000|0|0|0|0|||||||| +3455|7117|content://media/external/images/media/7117|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210704-WA0026.jpg|image/jpeg|1600|900|0|132903||1637518222|1625415389000|0|0|0|0|||||||| +3456|7181|content://media/external/images/media/7181|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210704-WA0027.jpg|image/jpeg|900|1600|0|144261||1637518223|1625415389000|0|0|0|0|||||||| +3457|7421|content://media/external/images/media/7421|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210704-WA0025.jpg|image/jpeg|1600|900|0|141257||1637518223|1625415388000|0|0|0|0|||||||| +3458|7309|content://media/external/images/media/7309|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0016.jpg|image/jpeg|1024|768|0|125499||1637518223|1625221122000|0|0|0|0|||||||| +3459|7358|content://media/external/images/media/7358|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0015.jpg|image/jpeg|1024|768|0|131380||1637518223|1625221122000|0|0|0|0|||||||| +3460|7492|content://media/external/images/media/7492|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0014.jpg|image/jpeg|1024|768|0|121029||1637518223|1625221122000|0|0|0|0|||||||| +3461|7085|content://media/external/images/media/7085|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0013.jpg|image/jpeg|1024|768|0|107464||1637518222|1625221121000|0|0|0|0|||||||| +3462|7491|content://media/external/images/media/7491|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0012.jpg|image/jpeg|1024|768|0|108473||1637518223|1625221121000|0|0|0|0|||||||| +3463|6312|content://media/external/images/media/6312|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0011.jpg|image/jpeg|1024|768|0|109887||1637518221|1625221120000|0|0|0|0|||||||| +3464|7215|content://media/external/images/media/7215|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0010.jpg|image/jpeg|768|1024|0|107744||1637518223|1625221120000|0|0|0|0|||||||| +3465|7490|content://media/external/images/media/7490|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0009.jpg|image/jpeg|768|1024|0|112343||1637518223|1625221119000|0|0|0|0|||||||| +3466|7582|content://media/external/images/media/7582|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0008.jpg|image/jpeg|768|1024|0|116504||1637518223|1625221119000|0|0|0|0|||||||| +3467|7357|content://media/external/images/media/7357|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0006.jpg|image/jpeg|760|1024|0|76779||1637518223|1625221118000|0|0|0|0|||||||| +3468|7581|content://media/external/images/media/7581|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0007.jpg|image/jpeg|472|1024|0|62070||1637518223|1625221118000|0|0|0|0|||||||| +3469|7388|content://media/external/images/media/7388|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0005.jpg|image/jpeg|768|1024|0|96328||1637518223|1625221117000|0|0|0|0|||||||| +3470|7308|content://media/external/images/media/7308|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210701-WA0030.jpg|image/jpeg|1504|1128|0|152972||1637518223|1625169418000|0|0|0|0|||||||| +3471|7084|content://media/external/images/media/7084|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210701-WA0028.jpg|image/jpeg|1504|1128|0|171857||1637518222|1625167577000|0|0|0|0|||||||| +3472|7116|content://media/external/images/media/7116|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210701-WA0011.jpg|image/jpeg|2048|1536|0|543195||1637518222|1625138613000|0|0|0|0|||||||| +3473|7420|content://media/external/images/media/7420|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210629-WA0000.jpg|image/jpeg|750|1334|0|84190||1637518223|1624945732000|0|0|0|0|||||||| +3474|7286|content://media/external/images/media/7286|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210628-WA0007.jpg|image/jpeg|960|720|0|99019||1637518223|1624878474000|0|0|0|0|||||||| +3475|2653|content://media/external/images/media/2653|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-27-18-14-13-292_com.strava.jpg|image/jpeg|1080|2340|0|773737||1637500871|1624810453000|0|0|0|0|||||||| +3476|6311|content://media/external/images/media/6311|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210627-WA0005.jpg|image/jpeg|1536|2048|0|393437||1637518221|1624778321000|0|0|0|0|||||||| +3477|7450|content://media/external/images/media/7450|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210627-WA0004.jpg|image/jpeg|1536|2048|0|386379||1637518223|1624778320000|0|0|0|0|||||||| +3478|7261|content://media/external/images/media/7261|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210627-WA0003.jpg|image/jpeg|1536|2048|0|396873||1637518223|1624778317000|0|0|0|0|||||||| +3479|7356|content://media/external/images/media/7356|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210626-WA0003.jpg|image/jpeg|1600|1200|0|332316||1637518223|1624693157000|0|0|0|0|||||||| +3480|3310|content://media/external/images/media/3310|/storage/emulated/0/DCIM/Camera/IMG_20210626_093254.jpg|image/jpeg|4000|2250|0|6512662||1637502430|1624692776000|1624692776612|0|0|0|||||||| +3481|7449|content://media/external/images/media/7449|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0026.jpg|image/jpeg|2048|475|0|146468||1637518223|1624645695000|0|0|0|0|||||||| +3482|7489|content://media/external/images/media/7489|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0025.jpg|image/jpeg|2048|594|0|227161||1637518223|1624645695000|0|0|0|0|||||||| +3483|7418|content://media/external/images/media/7418|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0022.jpg|image/jpeg|1600|900|0|162953||1637518223|1624645328000|0|0|0|0|||||||| +3484|2708|content://media/external/images/media/2708|/storage/emulated/0/DCIM/Screenshots/IMG_20210625_201921.jpg|image/jpeg|1080|1781|0|408927||1637500987|1624645161000|0|0|0|0|||||||| +3485|7488|content://media/external/images/media/7488|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0021.jpg|image/jpeg|900|1600|0|373164||1637518223|1624636891000|0|0|0|0|||||||| +3486|7355|content://media/external/images/media/7355|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0010.jpg|image/jpeg|1200|1600|0|204825||1637518223|1624635746000|0|0|0|0|||||||| +3487|7542|content://media/external/images/media/7542|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0007.jpg|image/jpeg|1600|1200|0|176604||1637518223|1624618317000|0|0|0|0|||||||| +3488|7487|content://media/external/images/media/7487|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0006.jpg|image/jpeg|1600|370|0|83864||1637518223|1624618307000|0|0|0|0|||||||| +3489|7260|content://media/external/images/media/7260|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0035.jpg|image/jpeg|2048|1536|0|631714||1637518223|1624384307000|0|0|0|0|||||||| +3490|7448|content://media/external/images/media/7448|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0034.jpg|image/jpeg|2048|1536|0|643695||1637518223|1624384306000|0|0|0|0|||||||| +3491|7580|content://media/external/images/media/7580|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0033.jpg|image/jpeg|2048|1536|0|454809||1637518223|1624384306000|0|0|0|0|||||||| +3492|7486|content://media/external/images/media/7486|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0032.jpg|image/jpeg|2048|1536|0|466838||1637518223|1624384305000|0|0|0|0|||||||| +3493|6310|content://media/external/images/media/6310|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0030.jpg|image/jpeg|2048|1536|0|466223||1637518221|1624384304000|0|0|0|0|||||||| +3494|7083|content://media/external/images/media/7083|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0031.jpg|image/jpeg|2048|1536|0|435082||1637518222|1624384304000|0|0|0|0|||||||| +3495|7419|content://media/external/images/media/7419|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0029.jpg|image/jpeg|2048|1536|0|658932||1637518223|1624384303000|0|0|0|0|||||||| +3496|7180|content://media/external/images/media/7180|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0028.jpg|image/jpeg|2000|1125|0|334396||1637518223|1624384302000|0|0|0|0|||||||| +3497|2751|content://media/external/images/media/2751|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-22-18-16-22-477_com.strava.jpg|image/jpeg|1080|2340|0|805203||1637500987|1624378582000|0|0|0|0|||||||| +3498|4827|content://media/external/images/media/4827|/storage/emulated/0/DCIM/Camera/IMG_20210622_114213.jpg|image/jpeg|4160|2340|0|5540629||1637505731|1624354937000|1624354937315|0|0|0|||||||| +3499|7354|content://media/external/images/media/7354|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0015.jpg|image/jpeg|2048|1152|0|212402||1637518223|1624353921000|0|0|0|0|||||||| +3500|7541|content://media/external/images/media/7541|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0014.jpg|image/jpeg|2000|1125|0|335713||1637518223|1624353907000|0|0|0|0|||||||| +3501|2638|content://media/external/images/media/2638|/storage/emulated/0/DCIM/ReactNative-snapshot-image866497803399468491.jpg|image/jpeg|936|3082|0|737773||1637500870|1624342622000|0|0|0|0|||||||| +3502|6427|content://media/external/images/media/6427|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210621-WA0017.jpg|image/jpeg|1536|2048|0|503975||1637518221|1624278997000|0|0|0|0|||||||| +3503|7579|content://media/external/images/media/7579|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210621-WA0014.jpg|image/jpeg|1600|900|0|247595||1637518223|1624275160000|0|0|0|0|||||||| +3504|7214|content://media/external/images/media/7214|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210621-WA0013.jpg|image/jpeg|900|1600|0|263113||1637518223|1624275076000|0|0|0|0|||||||| +3505|6426|content://media/external/images/media/6426|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210621-WA0010.jpg|image/jpeg|1600|900|0|114365||1637518221|1624272986000|0|0|0|0|||||||| +3506|3074|content://media/external/images/media/3074|/storage/emulated/0/DCIM/Camera/IMG_20210621_104436.jpg|image/jpeg|4000|2250|90|6915533||1637501905|1624265077000|1624265077853|0|0|0|||||||| +3507|7578|content://media/external/images/media/7578|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0043.jpg|image/jpeg|768|1024|0|146355||1637518223|1624211684000|0|0|0|0|||||||| +3508|7259|content://media/external/images/media/7259|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0042.jpg|image/jpeg|1024|768|0|213586||1637518223|1624211683000|0|0|0|0|||||||| +3509|7307|content://media/external/images/media/7307|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0040.jpg|image/jpeg|768|1024|0|262066||1637518223|1624211682000|0|0|0|0|||||||| +3510|7540|content://media/external/images/media/7540|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0041.jpg|image/jpeg|1024|768|0|181998||1637518223|1624211682000|0|0|0|0|||||||| +3511|7306|content://media/external/images/media/7306|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0038.jpg|image/jpeg|768|1024|0|295954||1637518223|1624211681000|0|0|0|0|||||||| +3512|7539|content://media/external/images/media/7539|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0039.jpg|image/jpeg|1024|768|0|245057||1637518223|1624211681000|0|0|0|0|||||||| +3513|6309|content://media/external/images/media/6309|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0037.jpg|image/jpeg|1024|768|0|207727||1637518221|1624211680000|0|0|0|0|||||||| +3514|3192|content://media/external/images/media/3192|/storage/emulated/0/DCIM/Camera/IMG_20210620_121336.jpg|image/jpeg|4000|2250|90|7314220||1637502161|1624184018000|1624184018082|0|0|0|||||||| +3515|7258|content://media/external/images/media/7258|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0010.jpg|image/jpeg|1200|1600|0|227643||1637518223|1624109320000|0|0|0|0|||||||| +3516|7305|content://media/external/images/media/7305|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0008.jpeg|image/jpeg|3840|2160|90|1452657||1637518223|1624108621000|1624108621731|0|0|0|||||||| +3517|6307|content://media/external/images/media/6307|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0007.jpg|image/jpeg|1200|1600|0|242391||1637518221|1624108573000|0|0|0|0|||||||| +3518|7213|content://media/external/images/media/7213|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0006.jpg|image/jpeg|1200|1600|0|235568||1637518223|1624108572000|0|0|0|0|||||||| +3519|7485|content://media/external/images/media/7485|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0005.jpg|image/jpeg|1600|1200|0|221798||1637518223|1624105434000|0|0|0|0|||||||| +3520|7212|content://media/external/images/media/7212|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210618-WA0011.jpg|image/jpeg|2048|1536|0|269814||1637518223|1624040132000|0|0|0|0|||||||| +3521|7178|content://media/external/images/media/7178|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210618-WA0010.jpg|image/jpeg|2048|1536|0|234492||1637518223|1624040130000|0|0|0|0|||||||| +3522|4511|content://media/external/images/media/4511|/storage/emulated/0/DCIM/Camera/IMG_20210617_200103.jpg|image/jpeg|4000|2250|90|4222625||1637505160|1623952865000|1623952865692|0|0|0|||||||| +3523|2663|content://media/external/images/media/2663|/storage/emulated/0/Download/montagna/Da Campitello di Fassa al Rifugio Alpe di Tires percorrendo la spettacolare Val Duron/Da Campitello di Fassa al Rifugio Alpe di Tires percorrendo la spettacolare Val Duron.rtfd/Schermata 2021-06-17 alle 12.36.29.png|image/png|1956|424|0|53556||1637500871|1623926190000|0|0|0|0|||||||| +3524|2662|content://media/external/images/media/2662|/storage/emulated/0/Download/montagna/Da Alba di Canazei ai rifugi Contrin e Passo San Nicolò/Da Alba di Canazei ai rifugi Contrin e Passo San Nicolò.rtfd/Schermata 2021-06-17 alle 12.33.32.png|image/png|1942|388|0|52282||1637500871|1623926017000|0|0|0|0|||||||| +3525|2664|content://media/external/images/media/2664|/storage/emulated/0/Download/montagna/Dal Rifugio Gardeccia al Rifugio Antermoia un giro ad anello sul Catinaccio/Dal Rifugio Gardeccia al Rifugio Antermoia un giro ad anello sul Catinaccio.rtfd/Schermata 2021-06-17 alle 12.30.28.png|image/png|1924|388|0|51940||1637500871|1623925829000|0|0|0|0|||||||| +3526|2661|content://media/external/images/media/2661|/storage/emulated/0/Download/montagna/Ciclabile della Val di Fiemme e Fassa/Ciclabile della Val di Fiemme e Fassa.rtfd/Schermata 2021-06-17 alle 12.26.05.png|image/png|1924|312|0|47980||1637500871|1623925566000|0|0|0|0|||||||| +3527|2668|content://media/external/images/media/2668|/storage/emulated/0/Download/montagna/Rifugio Re Alberto I° da Pera di Fassa/Rifugio Re Alberto I° da Pera di Fassa.rtfd/Schermata 2021-06-17 alle 12.23.29.png|image/png|1928|386|0|52561||1637500871|1623925412000|0|0|0|0|||||||| +3528|2666|content://media/external/images/media/2666|/storage/emulated/0/Download/montagna/Giro ad anello sul Catinaccio passando per i rifugi Roda di Vael, Fronza e Paolina/Roda di Vael, Fronza e Paolina.rtfd/Schermata 2021-06-17 alle 11.54.53.png|image/png|1898|316|0|47749||1637500871|1623923696000|0|0|0|0|||||||| +3529|2665|content://media/external/images/media/2665|/storage/emulated/0/Download/montagna/Giro ad anello alla Malga Vaèl e al Rifugio Ciampedie/Giro ad anello alla Malga Vaèl e al Rifugio Ciampedie.rtfd/Schermata 2021-06-17 alle 11.51.12.png|image/png|1942|382|0|51800||1637500871|1623923474000|0|0|0|0|||||||| +3530|2667|content://media/external/images/media/2667|/storage/emulated/0/Download/montagna/Mazzin - Rifugio Antermoia - Rifugio Dona -Mazzin/Mazzin - Rifugio Antermoia - Rifugio Dona.rtfd/Schermata 2021-06-17 alle 11.47.19.png|image/png|1958|388|0|52755||1637500871|1623923243000|0|0|0|0|||||||| +3531|4102|content://media/external/images/media/4102|/storage/emulated/0/DCIM/Camera/IMG_20210614_201745.jpg|image/jpeg|4000|2250|90|3525981||1637504400|1623694666000|1623694666783|0|0|0|||||||| +3532|4230|content://media/external/images/media/4230|/storage/emulated/0/DCIM/Camera/IMG_20210614_201741.jpg|image/jpeg|4000|2250|90|3265503||1637504726|1623694663000|1623694663218|0|0|0|||||||| +3533|4420|content://media/external/images/media/4420|/storage/emulated/0/DCIM/Camera/IMG_20210614_201035.jpg|image/jpeg|4000|2250|90|3511387||1637505063|1623694237000|1623694237114|0|0|0|||||||| +3534|3349|content://media/external/images/media/3349|/storage/emulated/0/DCIM/Camera/IMG_20210613_173905.jpg|image/jpeg|2091|1316|0|964427||1637502439|1623598745000|1623572653359|0|0|0|||||||| +3535|3828|content://media/external/images/media/3828|/storage/emulated/0/DCIM/Camera/IMG_20210613_102514.jpg|image/jpeg|4000|2250|0|4986359||1637503630|1623572717000|1623572716927|0|0|0|||||||| +3536|3960|content://media/external/images/media/3960|/storage/emulated/0/DCIM/Camera/IMG_20210613_102411.jpg|image/jpeg|4000|2250|180|4004416||1637503942|1623572653000|1623572653359|0|0|0|||||||| +3537|7151|content://media/external/images/media/7151|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210611-WA0001.jpg|image/jpeg|738|1600|0|90006||1637518222|1623394936000|0|0|0|0|||||||| +3538|7484|content://media/external/images/media/7484|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210609-WA0003.jpg|image/jpeg|1377|1080|0|587148||1637518223|1623224373000|0|0|0|0|||||||| +3539|7483|content://media/external/images/media/7483|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210609-WA0002.jpg|image/jpeg|1200|1600|0|535363||1637518223|1623222996000|0|0|0|0|||||||| +3540|7538|content://media/external/images/media/7538|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210609-WA0001.jpg|image/jpeg|1200|1600|0|497383||1637518223|1623222994000|0|0|0|0|||||||| +3541|7211|content://media/external/images/media/7211|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210608-WA0021.jpg|image/jpeg|1200|1600|0|281910||1637518223|1623181389000|0|0|0|0|||||||| +3542|6425|content://media/external/images/media/6425|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210608-WA0020.jpg|image/jpeg|1200|1600|0|181936||1637518221|1623181387000|0|0|0|0|||||||| +3543|7387|content://media/external/images/media/7387|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210608-WA0015.jpg|image/jpeg|935|1600|0|489941||1637518223|1623157409000|0|0|0|0|||||||| +3544|7304|content://media/external/images/media/7304|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210608-WA0000.jpg|image/jpeg|1200|1600|0|251150||1637518223|1623106332000|0|0|0|0|||||||| +3545|2707|content://media/external/images/media/2707|/storage/emulated/0/DCIM/Screenshots/IMG_20210606_190023.jpg|image/jpeg|1080|1153|0|100781||1637500987|1622998823000|0|0|0|0|||||||| +3546|2706|content://media/external/images/media/2706|/storage/emulated/0/DCIM/Screenshots/IMG_20210606_185954.jpg|image/jpeg|1080|1103|0|239034||1637500987|1622998794000|0|0|0|0|||||||| +3547|2750|content://media/external/images/media/2750|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-06-18-58-30-908_com.strava.jpg|image/jpeg|1080|2340|0|279307||1637500987|1622998711000|0|0|0|0|||||||| +3548|2749|content://media/external/images/media/2749|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-06-18-58-05-990_com.strava.jpg|image/jpeg|1080|2340|0|635184||1637500987|1622998686000|0|0|0|0|||||||| +3549|4171|content://media/external/images/media/4171|/storage/emulated/0/DCIM/Camera/IMG_20210606_094520.jpg|image/jpeg|4160|2340|90|6030474||1637504556|1622965530000|1622965530087|0|0|0|||||||| +3550|2863|content://media/external/images/media/2863|/storage/emulated/0/DCIM/Camera/IMG_20210606_094128.jpg|image/jpeg|4160|2340|0|6277932||1637501457|1622965295000|1622965294645|0|0|0|||||||| +3551|3446|content://media/external/images/media/3446|/storage/emulated/0/DCIM/Camera/PANO_20210606_093303.jpg|image/jpeg|8720|3456|0|25582964||1637502783|1622964794000|0|0|0|0|||||||| +3552|4332|content://media/external/images/media/4332|/storage/emulated/0/DCIM/Camera/PANO_20210606_093236.jpg|image/jpeg|5904|3680|0|18972135||1637504895|1622964765000|0|0|0|0|||||||| +3553|4652|content://media/external/images/media/4652|/storage/emulated/0/DCIM/Camera/PANO_20210606_092504.jpg|image/jpeg|7120|3616|0|21608334||1637505414|1622964313000|0|0|0|0|||||||| +3554|7150|content://media/external/images/media/7150|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210606-WA0003.jpg|image/jpeg|1536|2048|0|677448||1637518222|1622963314000|0|0|0|0|||||||| +3555|7257|content://media/external/images/media/7257|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210606-WA0001.jpg|image/jpeg|1200|1600|0|436012||1637518223|1622963294000|0|0|0|0|||||||| +3556|3249|content://media/external/images/media/3249|/storage/emulated/0/DCIM/Camera/IMG_20210605_170411.jpg|image/jpeg|4000|2250|0|3623437||1637502259|1622905453000|1622905453067|0|0|0|||||||| +3557|6308|content://media/external/images/media/6308|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210603-WA0001.jpg|image/jpeg|1200|1600|0|131616||1637518221|1622704800000|0|0|0|0|||||||| +3558|2652|content://media/external/images/media/2652|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-02-19-16-06-101_com.strava.jpg|image/jpeg|1080|2340|0|488957||1637500871|1622654166000|0|0|0|0|||||||| +3559|7179|content://media/external/images/media/7179|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0049.jpg|image/jpeg|1600|1200|0|223671||1637518223|1622653853000|0|0|0|0|||||||| +3560|7417|content://media/external/images/media/7417|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0048.jpg|image/jpeg|1599|738|0|145517||1637518223|1622652722000|0|0|0|0|||||||| +3561|4569|content://media/external/images/media/4569|/storage/emulated/0/DCIM/Camera/IMG_20210602_181034.jpg|image/jpeg|4160|2340|0|5050478||1637505216|1622650237000|1622650236835|0|0|0|||||||| +3562|6306|content://media/external/images/media/6306|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0047.jpg|image/jpeg|1153|2048|0|229115||1637518221|1622650233000|0|0|0|0|||||||| +3563|4668|content://media/external/images/media/4668|/storage/emulated/0/DCIM/Camera/IMG_20210602_181011.jpg|image/jpeg|4160|2340|0|5136444||1637505418|1622650214000|1622650214396|0|0|0|||||||| +3564|7447|content://media/external/images/media/7447|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0046.jpg|image/jpeg|1600|738|0|156771||1637518223|1622650162000|0|0|0|0|||||||| +3565|4738|content://media/external/images/media/4738|/storage/emulated/0/DCIM/Camera/IMG_20210602_180723.jpg|image/jpeg|4160|2340|0|5190488||1637505574|1622650049000|1622650048802|0|0|0|||||||| +3566|2949|content://media/external/images/media/2949|/storage/emulated/0/DCIM/Camera/IMG_20210602_180710.jpg|image/jpeg|4000|2250|0|5066649||1637501661|1622650032000|1622650032143|0|0|0|||||||| +3567|4530|content://media/external/images/media/4530|/storage/emulated/0/DCIM/Camera/IMG_20210602_180652.jpg|image/jpeg|4000|2250|0|7473092||1637505165|1622650015000|1622650015130|0|0|0|||||||| +3568|6305|content://media/external/images/media/6305|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0044.jpg|image/jpeg|2048|1536|0|323103||1637518221|1622649030000|0|0|0|0|||||||| +3569|6304|content://media/external/images/media/6304|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0043.jpg|image/jpeg|2048|1536|0|346247||1637518221|1622649029000|0|0|0|0|||||||| +3570|7446|content://media/external/images/media/7446|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0042.jpg|image/jpeg|2048|1536|0|517442||1637518223|1622649029000|0|0|0|0|||||||| +3571|7177|content://media/external/images/media/7177|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0041.jpg|image/jpeg|2048|1536|0|410277||1637518223|1622649028000|0|0|0|0|||||||| +3572|7577|content://media/external/images/media/7577|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0040.jpg|image/jpeg|1536|2048|0|455963||1637518223|1622649027000|0|0|0|0|||||||| +3573|6303|content://media/external/images/media/6303|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0038.jpg|image/jpeg|1536|2048|0|545500||1637518221|1622649026000|0|0|0|0|||||||| +3574|6424|content://media/external/images/media/6424|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0039.jpg|image/jpeg|2048|1536|0|453964||1637518221|1622649026000|0|0|0|0|||||||| +3575|7537|content://media/external/images/media/7537|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0037.jpg|image/jpeg|2048|1536|0|527344||1637518223|1622649025000|0|0|0|0|||||||| +3576|7210|content://media/external/images/media/7210|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0036.jpg|image/jpeg|2048|1536|0|460139||1637518223|1622649024000|0|0|0|0|||||||| +3577|7256|content://media/external/images/media/7256|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0034.jpg|image/jpeg|1536|2048|0|565685||1637518223|1622649023000|0|0|0|0|||||||| +3578|7482|content://media/external/images/media/7482|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0035.jpg|image/jpeg|2048|1536|0|756422||1637518223|1622649023000|0|0|0|0|||||||| +3579|6302|content://media/external/images/media/6302|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0033.jpg|image/jpeg|2048|1536|0|332439||1637518221|1622649022000|0|0|0|0|||||||| +3580|7445|content://media/external/images/media/7445|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0032.jpg|image/jpeg|2048|1536|0|770943||1637518223|1622649021000|0|0|0|0|||||||| +3581|7416|content://media/external/images/media/7416|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0030.jpg|image/jpeg|1536|2048|0|298731||1637518223|1622649020000|0|0|0|0|||||||| +3582|7481|content://media/external/images/media/7481|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0031.jpg|image/jpeg|2048|1536|0|449431||1637518223|1622649020000|0|0|0|0|||||||| +3583|6301|content://media/external/images/media/6301|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0029.jpg|image/jpeg|2048|1536|0|428582||1637518221|1622649019000|0|0|0|0|||||||| +3584|7480|content://media/external/images/media/7480|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0028.jpg|image/jpeg|1536|2048|0|333370||1637518223|1622649019000|0|0|0|0|||||||| +3585|3774|content://media/external/images/media/3774|/storage/emulated/0/DCIM/Camera/IMG_20210602_173923.jpg|image/jpeg|4000|2250|0|5624149||1637503508|1622648365000|1622648365459|0|0|0|||||||| +3586|4041|content://media/external/images/media/4041|/storage/emulated/0/DCIM/Camera/IMG_20210602_173903.jpg|image/jpeg|4000|2250|0|5153318||1637504234|1622648346000|1622648346017|0|0|0|||||||| +3587|7176|content://media/external/images/media/7176|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0026.jpg|image/jpeg|1200|1600|0|172853||1637518223|1622638402000|0|0|0|0|||||||| +3588|7209|content://media/external/images/media/7209|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0027.jpg|image/jpeg|1600|738|0|133944||1637518223|1622638402000|0|0|0|0|||||||| +3589|7535|content://media/external/images/media/7535|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0010.jpg|image/jpeg|1600|1200|0|181082||1637518223|1622635376000|0|0|0|0|||||||| +3590|4068|content://media/external/images/media/4068|/storage/emulated/0/DCIM/Camera/IMG_20210602_140246.jpg|image/jpeg|4000|2250|0|3970564||1637504342|1622635367000|1622635281814|0|0|0|||||||| +3591|3443|content://media/external/images/media/3443|/storage/emulated/0/DCIM/Camera/IMG_20210602_140215.jpg|image/jpeg|4000|2250|0|3670328||1637502783|1622635336000|1622635281814|0|0|0|||||||| +3592|3210|content://media/external/images/media/3210|/storage/emulated/0/DCIM/Camera/IMG_20210602_140120.jpg|image/jpeg|4000|2250|0|3905851||1637502256|1622635281000|1622635281814|0|0|0|||||||| +3593|4667|content://media/external/images/media/4667|/storage/emulated/0/DCIM/Camera/IMG_20210602_140118.jpg|image/jpeg|4000|2250|0|3903186||1637505418|1622635280000|1622635279921|0|0|0|||||||| +3594|3959|content://media/external/images/media/3959|/storage/emulated/0/DCIM/Camera/IMG_20210602_140046.jpg|image/jpeg|4160|2340|0|2634799||1637503942|1622635252000|1622635252060|0|0|0|||||||| +3595|4271|content://media/external/images/media/4271|/storage/emulated/0/DCIM/Camera/IMG_20210602_104444.jpg|image/jpeg|4000|2250|90|4049446||1637504757|1622623486000|1622623486684|0|0|0|||||||| +3596|4378|content://media/external/images/media/4378|/storage/emulated/0/DCIM/Camera/IMG_20210602_104441.jpg|image/jpeg|4000|2250|90|4599769||1637504982|1622623483000|1622623483092|0|0|0|||||||| +3597|3190|content://media/external/images/media/3190|/storage/emulated/0/DCIM/Camera/IMG_20210602_100736.jpg|image/jpeg|4000|2250|90|5298753||1637502161|1622621259000|1622621259541|0|0|0|||||||| +3598|4718|content://media/external/images/media/4718|/storage/emulated/0/DCIM/Camera/IMG_20210602_100703.jpg|image/jpeg|4160|2340|0|6811202||1637505565|1622621227000|1622621227543|0|0|0|||||||| +3599|4067|content://media/external/images/media/4067|/storage/emulated/0/DCIM/Camera/IMG_20210602_100637.jpg|image/jpeg|4000|2250|90|5010708||1637504342|1622621199000|1622621198998|0|0|0|||||||| +3600|3095|content://media/external/images/media/3095|/storage/emulated/0/DCIM/Camera/IMG_20210602_100557.jpg|image/jpeg|4000|2250|90|6828207||1637501971|1622621158000|1622621158819|0|0|0|||||||| +3601|4326|content://media/external/images/media/4326|/storage/emulated/0/DCIM/Camera/IMG_20210602_100532.jpg|image/jpeg|4000|2250|90|6115236||1637504895|1622621133000|1622621133822|0|0|0|||||||| +3602|3497|content://media/external/images/media/3497|/storage/emulated/0/DCIM/Camera/IMG_20210602_100449.jpg|image/jpeg|4000|2250|0|6034151||1637502870|1622621090000|1622621090713|0|0|0|||||||| +3603|3422|content://media/external/images/media/3422|/storage/emulated/0/DCIM/Camera/IMG_20210602_100428.jpg|image/jpeg|4000|2250|0|7184913||1637502682|1622621070000|1622621070171|0|0|0|||||||| +3604|4782|content://media/external/images/media/4782|/storage/emulated/0/DCIM/Camera/IMG_20210602_100423.jpg|image/jpeg|4000|2250|90|6513468||1637505656|1622621065000|1622621065110|0|0|0|||||||| +3605|6423|content://media/external/images/media/6423|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0005.jpg|image/jpeg|1600|738|0|139179||1637518221|1622619660000|0|0|0|0|||||||| +3606|2748|content://media/external/images/media/2748|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-31-20-04-42-767_com.alltrails.alltrails.jpg|image/jpeg|1080|2340|0|540676||1637500987|1622484282000|0|0|0|0|||||||| +3607|6300|content://media/external/images/media/6300|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0013.jpg|image/jpeg|1600|1197|0|257703||1637518221|1622467853000|0|0|0|0|||||||| +3608|7479|content://media/external/images/media/7479|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0012.jpg|image/jpeg|1600|1197|0|251376||1637518223|1622467853000|0|0|0|0|||||||| +3609|6299|content://media/external/images/media/6299|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0011.jpg|image/jpeg|1600|1197|0|259765||1637518221|1622467852000|0|0|0|0|||||||| +3610|7149|content://media/external/images/media/7149|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0010.jpg|image/jpeg|1600|1197|0|224422||1637518222|1622467852000|0|0|0|0|||||||| +3611|7148|content://media/external/images/media/7148|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0009.jpg|image/jpeg|1600|1197|0|257722||1637518222|1622467851000|0|0|0|0|||||||| +3612|7255|content://media/external/images/media/7255|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0008.jpg|image/jpeg|1600|1197|0|260107||1637518223|1622467850000|0|0|0|0|||||||| +3613|7386|content://media/external/images/media/7386|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0007.jpg|image/jpeg|1600|1197|0|246259||1637518223|1622467849000|0|0|0|0|||||||| +3614|3629|content://media/external/images/media/3629|/storage/emulated/0/DCIM/Camera/IMG_20210531_074942.jpg|image/jpeg|4000|2250|90|6965358||1637503272|1622440185000|1622440185251|0|0|0|||||||| +3615|6533|content://media/external/images/media/6533|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0045.jpg|image/jpeg|1200|1600|0|400295||1637518221|1622399883000|0|0|0|0|||||||| +3616|7303|content://media/external/images/media/7303|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0044.jpg|image/jpeg|1200|1600|0|381864||1637518223|1622399882000|0|0|0|0|||||||| +3617|7478|content://media/external/images/media/7478|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0043.jpg|image/jpeg|1200|1600|0|336846||1637518223|1622399881000|0|0|0|0|||||||| +3618|7115|content://media/external/images/media/7115|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0042.jpg|image/jpeg|1200|1600|0|409890||1637518222|1622399880000|0|0|0|0|||||||| +3619|7147|content://media/external/images/media/7147|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0041.jpg|image/jpeg|1200|1600|0|456283||1637518222|1622399879000|0|0|0|0|||||||| +3620|7444|content://media/external/images/media/7444|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0040.jpg|image/jpeg|1200|1600|0|457452||1637518223|1622399878000|0|0|0|0|||||||| +3621|3773|content://media/external/images/media/3773|/storage/emulated/0/DCIM/Camera/IMG_20210530_115509.jpg|image/jpeg|4000|2250|0|4783422||1637503508|1622368513000|1622368512751|0|0|0|||||||| +3622|2747|content://media/external/images/media/2747|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-30-10-54-34-554_com.brytonsport.active.jpg|image/jpeg|1080|2340|0|453509||1637500987|1622364874000|0|0|0|0|||||||| +3623|2651|content://media/external/images/media/2651|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-30-10-52-33-818_com.brytonsport.active.jpg|image/jpeg|1080|2340|0|381893||1637500870|1622364753000|0|0|0|0|||||||| +3624|2746|content://media/external/images/media/2746|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-30-10-51-47-666_com.brytonsport.active.jpg|image/jpeg|1080|2340|0|686556||1637500987|1622364708000|0|0|0|0|||||||| +3625|3445|content://media/external/images/media/3445|/storage/emulated/0/DCIM/Camera/PANO_20210530_092918.jpg|image/jpeg|7536|3680|0|21235984||1637502783|1622359764000|0|0|0|0|||||||| +3626|4651|content://media/external/images/media/4651|/storage/emulated/0/DCIM/Camera/PANO_20210530_092903.jpg|image/jpeg|7856|3744|0|18617937||1637505414|1622359752000|0|0|0|0|||||||| +3627|4761|content://media/external/images/media/4761|/storage/emulated/0/DCIM/Camera/IMG_20210530_092740.jpg|image/jpeg|4160|2340|0|5171688||1637505639|1622359661000|1622359661595|0|0|0|||||||| +3628|4917|content://media/external/images/media/4917|/storage/emulated/0/DCIM/Camera/IMG_20210530_092732.jpg|image/jpeg|4160|2340|0|4463325||1637505944|1622359656000|1622359655945|0|0|0|||||||| +3629|3666|content://media/external/images/media/3666|/storage/emulated/0/DCIM/Camera/IMG_20210530_075649.jpg|image/jpeg|4000|2250|0|3395419||1637503358|1622354211000|1622354211156|0|0|0|||||||| +3630|4587|content://media/external/images/media/4587|/storage/emulated/0/DCIM/Camera/IMG_20210529_200103.jpg|image/jpeg|4160|2340|0|3021577||1637505278|1622311268000|1622311268267|0|0|0|||||||| +3631|4040|content://media/external/images/media/4040|/storage/emulated/0/DCIM/Camera/IMG_20210529_200046.jpg|image/jpeg|4000|2250|90|3353403||1637504234|1622311248000|1622311248671|0|0|0|||||||| +3632|6532|content://media/external/images/media/6532|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210528-WA0000.jpg|image/jpeg|1200|1600|0|111795||1637518221|1622178656000|0|0|0|0|||||||| +3633|3958|content://media/external/images/media/3958|/storage/emulated/0/DCIM/Camera/IMG_20210526_132754.jpg|image/jpeg|4000|2250|180|5560675||1637503942|1622028476000|1622028476203|0|0|0|||||||| +3634|3474|content://media/external/images/media/3474|/storage/emulated/0/DCIM/Camera/IMG_20210526_132754_1.jpg|image/jpeg|4000|2250|180|4799389||1637502817|1622028475000|1622028475547|0|0|0|||||||| +3635|4781|content://media/external/images/media/4781|/storage/emulated/0/DCIM/Camera/IMG_20210526_132606.jpg|image/jpeg|4000|2250|90|4113684||1637505656|1622028369000|1622028368914|0|0|0|||||||| +3636|6745|content://media/external/images/media/6745|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210523-WA0035.jpg|image/jpeg|2048|1152|0|149972||1637518222|1621788328000|0|0|0|0|||||||| +3637|6298|content://media/external/images/media/6298|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0079.jpg|image/jpeg|1296|970|0|165273||1637518221|1621715796000|0|0|0|0|||||||| +3638|7254|content://media/external/images/media/7254|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0078.jpg|image/jpeg|1296|970|0|144567||1637518223|1621715796000|0|0|0|0|||||||| +3639|6530|content://media/external/images/media/6530|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0077.jpg|image/jpeg|2048|1536|0|527379||1637518221|1621715383000|0|0|0|0|||||||| +3640|7576|content://media/external/images/media/7576|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0076.jpg|image/jpeg|2048|1536|0|432430||1637518223|1621715265000|0|0|0|0|||||||| +3641|7477|content://media/external/images/media/7477|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0075.jpg|image/jpeg|1024|768|0|123825||1637518223|1621715257000|0|0|0|0|||||||| +3642|7253|content://media/external/images/media/7253|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0074.jpg|image/jpeg|768|1024|0|138622||1637518223|1621715256000|0|0|0|0|||||||| +3643|7146|content://media/external/images/media/7146|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0072.jpg|image/jpeg|1200|1600|0|234150||1637518222|1621714141000|0|0|0|0|||||||| +3644|7415|content://media/external/images/media/7415|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0071.jpg|image/jpeg|1600|1200|0|396002||1637518223|1621714104000|0|0|0|0|||||||| +3645|7252|content://media/external/images/media/7252|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0070.jpg|image/jpeg|1200|1600|0|245226||1637518223|1621714103000|0|0|0|0|||||||| +3646|6743|content://media/external/images/media/6743|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0069.jpg|image/jpeg|1200|1600|0|349910||1637518222|1621714102000|0|0|0|0|||||||| +3647|7251|content://media/external/images/media/7251|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0068.jpg|image/jpeg|1600|1200|0|267273||1637518223|1621714102000|0|0|0|0|||||||| +3648|7414|content://media/external/images/media/7414|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0067.jpg|image/jpeg|1600|1200|0|345092||1637518223|1621714101000|0|0|0|0|||||||| +3649|7536|content://media/external/images/media/7536|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0066.jpg|image/jpeg|1200|1600|0|461840||1637518223|1621714101000|0|0|0|0|||||||| +3650|6422|content://media/external/images/media/6422|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0065.jpg|image/jpeg|1200|1600|0|278992||1637518221|1621714100000|0|0|0|0|||||||| +3651|7207|content://media/external/images/media/7207|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0064.jpg|image/jpeg|1600|1200|0|306717||1637518223|1621714099000|0|0|0|0|||||||| +3652|7413|content://media/external/images/media/7413|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0062.jpg|image/jpeg|1600|1200|0|331716||1637518223|1621714098000|0|0|0|0|||||||| +3653|7575|content://media/external/images/media/7575|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0063.jpg|image/jpeg|1600|1200|0|434643||1637518223|1621714098000|0|0|0|0|||||||| +3654|7208|content://media/external/images/media/7208|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0061.jpg|image/jpeg|1600|1200|0|212184||1637518223|1621714097000|0|0|0|0|||||||| +3655|6851|content://media/external/images/media/6851|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0060.jpg|image/jpeg|1600|1200|0|424872||1637518222|1621714096000|0|0|0|0|||||||| +3656|6744|content://media/external/images/media/6744|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0059.jpg|image/jpeg|1600|1200|0|320271||1637518222|1621714095000|0|0|0|0|||||||| +3657|6421|content://media/external/images/media/6421|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0058.jpg|image/jpeg|1600|1200|0|150297||1637518221|1621714081000|0|0|0|0|||||||| +3658|3209|content://media/external/images/media/3209|/storage/emulated/0/DCIM/Camera/IMG_20210522_192118.jpg|image/jpeg|4000|2250|0|5152741||1637502256|1621704080000|1621704080406|0|0|0|||||||| +3659|4270|content://media/external/images/media/4270|/storage/emulated/0/DCIM/Camera/IMG_20210522_192110.jpg|image/jpeg|4000|2250|0|5430040||1637504757|1621704072000|1621704072726|0|0|0|||||||| +3660|4612|content://media/external/images/media/4612|/storage/emulated/0/DCIM/Camera/IMG_20210522_181245.jpg|image/jpeg|4160|2340|0|5141288||1637505308|1621699965000|1621699965474|0|0|0|||||||| +3661|2912|content://media/external/images/media/2912|/storage/emulated/0/DCIM/Camera/IMG_20210522_181217.jpg|image/jpeg|4160|2340|0|3824204||1637501535|1621699937000|1621699937806|0|0|0|||||||| +3662|4737|content://media/external/images/media/4737|/storage/emulated/0/DCIM/Camera/IMG_20210522_181147.jpg|image/jpeg|4160|2340|0|4021022||1637505574|1621699907000|1621699907168|0|0|0|||||||| +3663|4895|content://media/external/images/media/4895|/storage/emulated/0/DCIM/Camera/IMG_20210522_180733.jpg|image/jpeg|4160|2340|0|5942653||1637505920|1621699653000|1621699653179|0|0|0|||||||| +3664|3442|content://media/external/images/media/3442|/storage/emulated/0/DCIM/Camera/IMG_20210522_180729.jpg|image/jpeg|4160|2340|0|5040312||1637502783|1621699649000|1621699649566|0|0|0|||||||| +3665|7250|content://media/external/images/media/7250|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0014.jpg|image/jpeg|1536|2048|0|317100||1637518223|1621672200000|0|0|0|0|||||||| +3666|6420|content://media/external/images/media/6420|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0013.jpg|image/jpeg|2048|1536|0|264442||1637518221|1621672189000|0|0|0|0|||||||| +3667|7574|content://media/external/images/media/7574|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0012.jpg|image/jpeg|1536|2048|0|368723||1637518223|1621672181000|0|0|0|0|||||||| +3668|7249|content://media/external/images/media/7249|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210520-WA0004.jpeg|image/jpeg|3840|2160|90|2188091||1637518223|1621490463000|1621490462949|0|0|0|||||||| +3669|4932|content://media/external/images/media/4932|/storage/emulated/0/DCIM/Camera/IMG_20210517_111932.jpg|image/jpeg|4000|2250|0|6194377||1637506010|1621243175000|1621243174917|0|0|0|||||||| +3670|3539|content://media/external/images/media/3539|/storage/emulated/0/DCIM/Camera/IMG_20210517_105727.jpg|image/jpeg|4000|2250|90|8299048||1637503010|1621241848000|1621241848478|0|0|0|||||||| +3671|3538|content://media/external/images/media/3538|/storage/emulated/0/DCIM/Camera/IMG_20210516_170546.jpg|image/jpeg|4000|2250|90|2864824||1637503010|1621177548000|1621177548243|0|0|0|||||||| +3672|3732|content://media/external/images/media/3732|/storage/emulated/0/DCIM/Camera/IMG_20210516_170523.jpg|image/jpeg|4000|2250|90|4372280||1637503477|1621177525000|1621177525311|0|0|0|||||||| +3673|3402|content://media/external/images/media/3402|/storage/emulated/0/DCIM/Camera/IMG_20210516_170106.jpg|image/jpeg|4000|2250|90|4338238||1637502598|1621177269000|1621177269230|0|0|0|||||||| +3674|4529|content://media/external/images/media/4529|/storage/emulated/0/DCIM/Camera/IMG_20210516_170040.jpg|image/jpeg|4000|2250|90|4643081||1637505165|1621177242000|1621177242381|0|0|0|||||||| +3675|4209|content://media/external/images/media/4209|/storage/emulated/0/DCIM/Camera/IMG_20210516_165921.jpg|image/jpeg|4000|2250|90|4160981||1637504640|1621177163000|1621177163457|0|0|0|||||||| +3676|3473|content://media/external/images/media/3473|/storage/emulated/0/DCIM/Camera/IMG_20210516_165907.jpg|image/jpeg|4000|2250|90|2356843||1637502817|1621177148000|1621177148782|0|0|0|||||||| +3677|4611|content://media/external/images/media/4611|/storage/emulated/0/DCIM/Camera/IMG_20210516_165705.jpg|image/jpeg|4000|2250|90|4632466||1637505308|1621177026000|1621177026815|0|0|0|||||||| +3678|4004|content://media/external/images/media/4004|/storage/emulated/0/DCIM/Camera/IMG_20210515_221432.jpg|image/jpeg|4000|2250|90|4680240||1637504086|1621109675000|1621109675325|0|0|0|||||||| +3679|2745|content://media/external/images/media/2745|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-15-19-40-21-566_com.brytonsport.active.jpg|image/jpeg|1080|2340|0|713289||1637500987|1621100421000|0|0|0|0|||||||| +3680|3610|content://media/external/images/media/3610|/storage/emulated/0/DCIM/Camera/IMG_20210515_151134.jpg|image/jpeg|4000|2250|90|4648032||1637503238|1621084298000|1621084298699|0|0|0|||||||| +3681|2879|content://media/external/images/media/2879|/storage/emulated/0/DCIM/Camera/IMG_20210515_145435.jpg|image/jpeg|4000|2250|0|7935985||1637501460|1621083277000|1621083277326|0|0|0|||||||| +3682|4121|content://media/external/images/media/4121|/storage/emulated/0/DCIM/Camera/IMG_20210515_145429.jpg|image/jpeg|4000|2250|0|7810632||1637504451|1621083272000|1621083272326|0|0|0|||||||| +3683|4080|content://media/external/images/media/4080|/storage/emulated/0/DCIM/Camera/IMG_20210515_125356.jpg|image/jpeg|4000|2250|90|4302598||1637504394|1621076038000|1621076038273|0|0|0|||||||| +3684|4377|content://media/external/images/media/4377|/storage/emulated/0/DCIM/Camera/IMG_20210515_103356.jpg|image/jpeg|4000|2250|0|6358341||1637504982|1621067638000|1621067638246|0|0|0|||||||| +3685|4456|content://media/external/images/media/4456|/storage/emulated/0/DCIM/Camera/IMG_20210515_103321.jpg|image/jpeg|4000|2250|0|7434694||1637505068|1621067604000|1621067604281|0|0|0|||||||| +3686|3385|content://media/external/images/media/3385|/storage/emulated/0/DCIM/Camera/IMG_20210515_103138.jpg|image/jpeg|4160|2340|0|6209952||1637502523|1621067499000|1621067498912|0|0|0|||||||| +3687|3748|content://media/external/images/media/3748|/storage/emulated/0/DCIM/Camera/IMG_20210515_103134.jpg|image/jpeg|4160|2340|0|6341251||1637503488|1621067495000|1621067494840|0|0|0|||||||| +3688|4003|content://media/external/images/media/4003|/storage/emulated/0/DCIM/Camera/IMG_20210515_103112.jpg|image/jpeg|4000|2250|0|6146567||1637504086|1621067475000|1621067475495|0|0|0|||||||| +3689|4325|content://media/external/images/media/4325|/storage/emulated/0/DCIM/Camera/IMG_20210512_232119.jpg|image/jpeg|4000|2250|0|4468066||1637504895|1620854483000|1620854483147|0|0|0|||||||| +3690|3609|content://media/external/images/media/3609|/storage/emulated/0/DCIM/Camera/IMG_20210511_121350.jpg|image/jpeg|4000|2250|90|4259165||1637503238|1620728033000|1620728033339|0|0|0|||||||| +3691|3643|content://media/external/images/media/3643|/storage/emulated/0/DCIM/Camera/IMG_20210511_121256.jpg|image/jpeg|4000|2250|90|4533840||1637503301|1620727978000|1620727978292|0|0|0|||||||| +3692|3878|content://media/external/images/media/3878|/storage/emulated/0/DCIM/Camera/IMG_20210511_121219.jpg|image/jpeg|4000|2250|0|4460000||1637503729|1620727942000|1620727942217|0|0|0|||||||| +3693|3151|content://media/external/images/media/3151|/storage/emulated/0/DCIM/Camera/IMG_20210511_121215.jpg|image/jpeg|4000|2250|0|4399902||1637502130|1620727939000|1620727939505|0|0|0|||||||| +3694|3053|content://media/external/images/media/3053|/storage/emulated/0/DCIM/Camera/IMG_20210511_080342.jpg|image/jpeg|4000|2250|0|7617836||1637501858|1620713026000|1620713026087|0|0|0|||||||| +3695|2744|content://media/external/images/media/2744|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-10-22-52-15-341_com.strava.jpg|image/jpeg|1080|2340|0|629952||1637500987|1620679935000|0|0|0|0|||||||| +3696|2743|content://media/external/images/media/2743|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-10-22-09-47-430_com.brytonsport.active.jpg|image/jpeg|1080|2340|0|618877||1637500987|1620677387000|0|0|0|0|||||||| +3697|4921|content://media/external/images/media/4921|/storage/emulated/0/DCIM/Camera/PANO_20210510_192704.jpg|image/jpeg|5840|3680|0|15158818||1637505944|1620667630000|0|0|0|0|||||||| +3698|3368|content://media/external/images/media/3368|/storage/emulated/0/DCIM/Camera/PANO_20210510_192648.jpg|image/jpeg|6704|3552|0|14600528||1637502451|1620667617000|0|0|0|0|||||||| +3699|3791|content://media/external/images/media/3791|/storage/emulated/0/DCIM/Camera/IMG_20210510_192145.jpg|image/jpeg|4000|2250|0|6878863||1637503558|1620667308000|1620667308372|0|0|0|||||||| +3700|3348|content://media/external/images/media/3348|/storage/emulated/0/DCIM/Camera/IMG_20210510_191400.jpg|image/jpeg|4000|2250|0|6711810||1637502439|1620666843000|1620666842857|0|0|0|||||||| +3701|3158|content://media/external/images/media/3158|/storage/emulated/0/DCIM/Camera/PANO_20210510_183453.jpg|image/jpeg|6160|3680|0|19157435||1637502130|1620664503000|0|0|0|0|||||||| +3702|4425|content://media/external/images/media/4425|/storage/emulated/0/DCIM/Camera/PANO_20210510_182738.jpg|image/jpeg|7056|3360|0|20601930||1637505063|1620664065000|0|0|0|0|||||||| +3703|7248|content://media/external/images/media/7248|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0021.jpg|image/jpeg|1536|2048|0|207397||1637518223|1620655295000|0|0|0|0|||||||| +3704|6531|content://media/external/images/media/6531|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0020.jpg|image/jpeg|1536|2048|0|253237||1637518221|1620655292000|0|0|0|0|||||||| +3705|6742|content://media/external/images/media/6742|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0019.jpg|image/jpeg|2048|1536|0|299510||1637518222|1620655286000|0|0|0|0|||||||| +3706|7412|content://media/external/images/media/7412|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0018.jpg|image/jpeg|2048|1536|0|257270||1637518223|1620655286000|0|0|0|0|||||||| +3707|7144|content://media/external/images/media/7144|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0016.jpg|image/jpeg|1536|2048|0|649124||1637518222|1620655285000|0|0|0|0|||||||| +3708|7145|content://media/external/images/media/7145|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0017.jpg|image/jpeg|1536|2048|0|414928||1637518222|1620655285000|0|0|0|0|||||||| +3709|3712|content://media/external/images/media/3712|/storage/emulated/0/DCIM/Camera/IMG_20210507_214529.jpg|image/jpeg|4000|2250|90|4063891||1637503393|1620416731000|1620416731274|0|0|0|||||||| +3710|3628|content://media/external/images/media/3628|/storage/emulated/0/DCIM/Camera/IMG_20210507_214527.jpg|image/jpeg|4000|2250|90|4125236||1637503272|1620416728000|1620416728695|0|0|0|||||||| +3711|4894|content://media/external/images/media/4894|/storage/emulated/0/DCIM/Camera/IMG_20210507_214446.jpg|image/jpeg|4000|2250|0|4159509||1637505920|1620416688000|1620416688472|0|0|0|||||||| +3712|4208|content://media/external/images/media/4208|/storage/emulated/0/DCIM/Camera/IMG_20210507_112903.jpg|image/jpeg|4000|2250|0|5144404||1637504640|1620379746000|1620379746467|0|0|0|||||||| +3713|3711|content://media/external/images/media/3711|/storage/emulated/0/DCIM/Camera/IMG_20210503_222931.jpg|image/jpeg|4000|2250|90|5312232||1637503393|1620073776000|1620073776638|0|0|0|||||||| +3714|4170|content://media/external/images/media/4170|/storage/emulated/0/DCIM/Camera/IMG_20210503_222924.jpg|image/jpeg|4000|2250|90|5291587||1637504556|1620073769000|1620073769821|0|0|0|||||||| +3715|3401|content://media/external/images/media/3401|/storage/emulated/0/DCIM/Camera/IMG_20210503_222915.jpg|image/jpeg|4000|2250|90|4469376||1637502598|1620073759000|1620073759434|0|0|0|||||||| +3716|7143|content://media/external/images/media/7143|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210502-WA0005.jpg|image/jpeg|2048|1536|0|189587||1637518222|1619948046000|0|0|0|0|||||||| +3717|6297|content://media/external/images/media/6297|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210502-WA0004.jpg|image/jpeg|1024|768|0|93555||1637518221|1619948044000|0|0|0|0|||||||| +3718|7573|content://media/external/images/media/7573|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210502-WA0003.jpg|image/jpeg|768|1024|0|237313||1637518223|1619946489000|0|0|0|0|||||||| +3719|7411|content://media/external/images/media/7411|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0055.jpg|image/jpeg|1200|1600|0|410077||1637518223|1619882814000|0|0|0|0|||||||| +3720|6419|content://media/external/images/media/6419|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0040.jpg|image/jpeg|750|1334|0|119000||1637518221|1619882760000|0|0|0|0|||||||| +3721|6739|content://media/external/images/media/6739|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0007.jpg|image/jpeg|750|1334|0|181992||1637518222|1619882760000|0|0|0|0|||||||| +3722|6850|content://media/external/images/media/6850|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0054.jpg|image/jpeg|768|1024|0|149325||1637518222|1619879780000|0|0|0|0|||||||| +3723|6849|content://media/external/images/media/6849|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0053.jpg|image/jpeg|768|1024|0|152135||1637518222|1619879779000|0|0|0|0|||||||| +3724|6296|content://media/external/images/media/6296|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0045.jpg|image/jpeg|1600|1200|0|360997||1637518221|1619879258000|0|0|0|0|||||||| +3725|6529|content://media/external/images/media/6529|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0044.jpg|image/jpeg|1200|1600|0|257211||1637518221|1619879258000|0|0|0|0|||||||| +3726|6295|content://media/external/images/media/6295|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0041.jpg|image/jpeg|750|1334|0|127775||1637518221|1619879252000|0|0|0|0|||||||| +3727|6418|content://media/external/images/media/6418|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0039.jpg|image/jpeg|1200|1600|0|261800||1637518221|1619879251000|0|0|0|0|||||||| +3728|6848|content://media/external/images/media/6848|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0038.jpg|image/jpeg|1200|1600|0|375379||1637518222|1619879251000|0|0|0|0|||||||| +3729|6741|content://media/external/images/media/6741|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0037.jpg|image/jpeg|1200|1600|0|255127||1637518222|1619879250000|0|0|0|0|||||||| +3730|7247|content://media/external/images/media/7247|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0035.jpg|image/jpeg|1600|1200|0|312427||1637518223|1619879248000|0|0|0|0|||||||| +3731|6528|content://media/external/images/media/6528|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0034.jpg|image/jpeg|1086|1600|0|214207||1637518221|1619879247000|0|0|0|0|||||||| +3732|6847|content://media/external/images/media/6847|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0033.jpg|image/jpeg|1200|1600|0|399104||1637518222|1619879247000|0|0|0|0|||||||| +3733|6527|content://media/external/images/media/6527|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0032.jpg|image/jpeg|408|1600|0|107487||1637518221|1619879246000|0|0|0|0|||||||| +3734|6844|content://media/external/images/media/6844|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0031.jpg|image/jpeg|1200|1600|0|260679||1637518222|1619879246000|0|0|0|0|||||||| +3735|6846|content://media/external/images/media/6846|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0030.jpg|image/jpeg|1200|1600|0|259861||1637518222|1619879245000|0|0|0|0|||||||| +3736|7410|content://media/external/images/media/7410|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0026.jpg|image/jpeg|454|1600|0|118607||1637518223|1619879226000|0|0|0|0|||||||| +3737|6417|content://media/external/images/media/6417|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0024.jpg|image/jpeg|1200|1600|0|236002||1637518221|1619879210000|0|0|0|0|||||||| +3738|6740|content://media/external/images/media/6740|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0021.jpg|image/jpeg|1600|1200|0|359930||1637518222|1619879177000|0|0|0|0|||||||| +3739|6293|content://media/external/images/media/6293|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0019.jpg|image/jpeg|1600|1200|0|357436||1637518221|1619879171000|0|0|0|0|||||||| +3740|4666|content://media/external/images/media/4666|/storage/emulated/0/DCIM/Camera/IMG_20210501_131608.jpg|image/jpeg|4000|2250|0|6892574||1637505418|1619867770000|1619867770269|0|0|0|||||||| +3741|4847|content://media/external/images/media/4847|/storage/emulated/0/DCIM/Camera/IMG_20210501_131607.jpg|image/jpeg|4000|2250|0|6728669||1637505753|1619867768000|1619867768558|0|0|0|||||||| +3742|3308|content://media/external/images/media/3308|/storage/emulated/0/DCIM/Camera/IMG_20210501_131559.jpg|image/jpeg|4000|2250|90|5458200||1637502430|1619867760000|1619867760897|0|0|0|||||||| +3743|4868|content://media/external/images/media/4868|/storage/emulated/0/DCIM/Camera/IMG_20210501_131552.jpg|image/jpeg|4000|2250|90|5916700||1637505831|1619867754000|1619867753943|0|0|0|||||||| +3744|4510|content://media/external/images/media/4510|/storage/emulated/0/DCIM/Camera/IMG_20210501_131530.jpg|image/jpeg|4000|2250|0|6240808||1637505160|1619867731000|1619867731859|0|0|0|||||||| +3745|4490|content://media/external/images/media/4490|/storage/emulated/0/DCIM/Camera/IMG_20210501_131519.jpg|image/jpeg|4000|2250|0|6365439||1637505122|1619867721000|1619867721542|0|0|0|||||||| +3746|4867|content://media/external/images/media/4867|/storage/emulated/0/DCIM/Camera/IMG_20210501_120734.jpg|image/jpeg|4160|2340|0|5381392||1637505831|1619863654000|1619863654465|0|0|0|||||||| +3747|4984|content://media/external/images/media/4984|/storage/emulated/0/DCIM/Camera/IMG_20210501_120339.jpg|image/jpeg|4000|2250|90|6996546||1637506097|1619863420000|1619863420878|0|0|0|||||||| +3748|3496|content://media/external/images/media/3496|/storage/emulated/0/DCIM/Camera/IMG_20210501_120338.jpg|image/jpeg|4000|2250|90|7291707||1637502870|1619863419000|1619863419252|0|0|0|||||||| +3749|4002|content://media/external/images/media/4002|/storage/emulated/0/DCIM/Camera/IMG_20210501_120320.jpg|image/jpeg|4000|2250|90|6947261||1637504086|1619863402000|1619863401894|0|0|0|||||||| +3750|4156|content://media/external/images/media/4156|/storage/emulated/0/DCIM/Camera/IMG_20210501_114114.jpg|image/jpeg|4000|2250|90|6052023||1637504481|1619862076000|1619862076129|0|0|0|||||||| +3751|4312|content://media/external/images/media/4312|/storage/emulated/0/DCIM/Camera/IMG_20210501_113721.jpg|image/jpeg|4160|2340|90|5815782||1637504817|1619861841000|1619861841823|0|0|0|||||||| +3752|3688|content://media/external/images/media/3688|/storage/emulated/0/DCIM/Camera/IMG_20210501_113713.jpg|image/jpeg|4160|2340|90|5881644||1637503390|1619861833000|1619861833644|0|0|0|||||||| +3753|4983|content://media/external/images/media/4983|/storage/emulated/0/DCIM/Camera/IMG_20210501_113649.jpg|image/jpeg|4000|2250|90|5848568||1637506097|1619861811000|1619861811385|0|0|0|||||||| +3754|2931|content://media/external/images/media/2931|/storage/emulated/0/DCIM/Camera/IMG_20210501_113630.jpg|image/jpeg|4000|2250|0|7176339||1637501599|1619861792000|1619861791998|0|0|0|||||||| +3755|3627|content://media/external/images/media/3627|/storage/emulated/0/DCIM/Camera/IMG_20210501_112416.jpg|image/jpeg|4000|2250|90|6209190||1637503272|1619861058000|1619861058625|0|0|0|||||||| +3756|3710|content://media/external/images/media/3710|/storage/emulated/0/DCIM/Camera/IMG_20210501_112246.jpg|image/jpeg|4000|2250|90|5471893||1637503393|1619860971000|1619860970878|0|0|0|||||||| +3757|2930|content://media/external/images/media/2930|/storage/emulated/0/DCIM/Camera/IMG_20210501_111843.jpg|image/jpeg|4000|2250|90|6699184||1637501599|1619860727000|1619860727529|0|0|0|||||||| +3758|2848|content://media/external/images/media/2848|/storage/emulated/0/DCIM/Camera/IMG_20210501_111628.jpg|image/jpeg|2250|4000|0|4155879||1637501431|1619860589000|1619860248923|0|0|0|||||||| +3759|7142|content://media/external/images/media/7142|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0008.jpg|image/jpeg|750|1334|0|136110||1637518222|1619860479000|0|0|0|0|||||||| +3760|4229|content://media/external/images/media/4229|/storage/emulated/0/DCIM/Camera/IMG_20210501_111047.jpg|image/jpeg|4000|2250|90|5296945||1637504726|1619860248000|1619860248923|0|0|0|||||||| +3761|3945|content://media/external/images/media/3945|/storage/emulated/0/DCIM/Camera/IMG_20210501_111041.jpg|image/jpeg|4000|2250|90|5963770||1637503853|1619860242000|1619860242457|0|0|0|||||||| +3762|3495|content://media/external/images/media/3495|/storage/emulated/0/DCIM/Camera/IMG_20210501_110905.jpg|image/jpeg|4000|2250|90|5604992||1637502870|1619860147000|1619860147364|0|0|0|||||||| +3763|3587|content://media/external/images/media/3587|/storage/emulated/0/DCIM/Camera/IMG_20210501_110833.jpg|image/jpeg|4000|2250|0|5067564||1637503154|1619860115000|1619860115213|0|0|0|||||||| +3764|4402|content://media/external/images/media/4402|/storage/emulated/0/DCIM/Camera/IMG_20210501_110828.jpg|image/jpeg|4000|2250|0|5680743||1637505004|1619860109000|1619860109361|0|0|0|||||||| +3765|4357|content://media/external/images/media/4357|/storage/emulated/0/DCIM/Camera/IMG_20210501_110824.jpg|image/jpeg|4000|2250|90|5127929||1637504970|1619860105000|1619860105696|0|0|0|||||||| +3766|3052|content://media/external/images/media/3052|/storage/emulated/0/DCIM/Camera/IMG_20210501_110803.jpg|image/jpeg|4000|2250|90|6160966||1637501858|1619860085000|1619860085096|0|0|0|||||||| +3767|4550|content://media/external/images/media/4550|/storage/emulated/0/DCIM/Camera/IMG_20210501_110724.jpg|image/jpeg|4000|2250|90|4058118||1637505187|1619860045000|1619860045015|0|0|0|||||||| +3768|3626|content://media/external/images/media/3626|/storage/emulated/0/DCIM/Camera/IMG_20210501_110721.jpg|image/jpeg|4000|2250|90|3819312||1637503271|1619860042000|1619860042563|0|0|0|||||||| +3769|4120|content://media/external/images/media/4120|/storage/emulated/0/DCIM/Camera/IMG_20210501_110719.jpg|image/jpeg|4000|2250|90|3850824||1637504451|1619860041000|1619860041319|0|0|0|||||||| +3770|2929|content://media/external/images/media/2929|/storage/emulated/0/DCIM/Camera/IMG_20210501_105959.jpg|image/jpeg|4000|2250|90|5227224||1637501599|1619859602000|1619859602166|0|0|0|||||||| +3771|4635|content://media/external/images/media/4635|/storage/emulated/0/DCIM/Camera/IMG_20210501_105935.jpg|image/jpeg|4000|2250|90|6454547||1637505390|1619859578000|1619859578619|0|0|0|||||||| +3772|3232|content://media/external/images/media/3232|/storage/emulated/0/DCIM/Camera/IMG_20210501_105822.jpg|image/jpeg|4000|2250|0|4830134||1637502258|1619859503000|1619859021615|0|0|0|||||||| +3773|3291|content://media/external/images/media/3291|/storage/emulated/0/DCIM/Camera/IMG_20210501_105537.jpg|image/jpeg|2250|4000|0|6183605||1637502355|1619859338000|1619859209894|0|0|0|||||||| +3774|3665|content://media/external/images/media/3665|/storage/emulated/0/DCIM/Camera/IMG_20210501_105440.jpg|image/jpeg|2250|4000|0|5484491||1637503358|1619859282000|1619859209894|0|0|0|||||||| +3775|4419|content://media/external/images/media/4419|/storage/emulated/0/DCIM/Camera/IMG_20210501_105328.jpg|image/jpeg|4000|2250|90|6738125||1637505063|1619859209000|1619859209894|0|0|0|||||||| +3776|3248|content://media/external/images/media/3248|/storage/emulated/0/DCIM/Camera/IMG_20210501_105019.jpg|image/jpeg|4000|2250|0|5853805||1637502259|1619859021000|1619859021615|0|0|0|||||||| +3777|3009|content://media/external/images/media/3009|/storage/emulated/0/DCIM/Camera/IMG_20210501_101927.jpg|image/jpeg|4000|2250|90|6857991||1637501786|1619857169000|1619857169457|0|0|0|||||||| +3778|3537|content://media/external/images/media/3537|/storage/emulated/0/DCIM/Camera/IMG_20210501_101925.jpg|image/jpeg|4000|2250|90|6752936||1637503010|1619857167000|1619857167167|0|0|0|||||||| +3779|3608|content://media/external/images/media/3608|/storage/emulated/0/DCIM/Camera/IMG_20210501_101926.jpg|image/jpeg|4000|2250|90|6847683||1637503238|1619857167000|1619857166999|0|0|0|||||||| +3780|3900|content://media/external/images/media/3900|/storage/emulated/0/DCIM/Camera/IMG_20210501_101922.jpg|image/jpeg|4000|2250|90|6651366||1637503732|1619857166000|1619857165715|0|0|0|||||||| +3781|7152|content://media/external/images/media/7152|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG_20210426_220825.jpg|image/jpeg|277|412|0|58943||1637518222|1619467705000|0|0|0|0|||||||| +3782|6294|content://media/external/images/media/6294|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0015.jpg|image/jpeg|1024|768|0|156257||1637518221|1619466899000|0|0|0|0|||||||| +3783|6843|content://media/external/images/media/6843|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0016.jpg|image/jpeg|1024|768|0|150627||1637518222|1619466899000|0|0|0|0|||||||| +3784|6845|content://media/external/images/media/6845|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0017.jpg|image/jpeg|768|1024|0|112325||1637518222|1619466899000|0|0|0|0|||||||| +3785|7141|content://media/external/images/media/7141|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0013.jpg|image/jpeg|1024|768|0|149428||1637518222|1619466899000|0|0|0|0|||||||| +3786|7246|content://media/external/images/media/7246|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0014.jpg|image/jpeg|1024|768|0|154189||1637518223|1619466899000|0|0|0|0|||||||| +3787|7245|content://media/external/images/media/7245|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0010.jpg|image/jpeg|738|1600|0|81616||1637518223|1619450974000|0|0|0|0|||||||| +3788|6738|content://media/external/images/media/6738|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0009.jpg|image/jpeg|1200|1600|0|185252||1637518222|1619446060000|0|0|0|0|||||||| +3789|6416|content://media/external/images/media/6416|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0030.jpg|image/jpeg|1200|1600|0|300281||1637518221|1619375982000|0|0|0|0|||||||| +3790|6842|content://media/external/images/media/6842|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0029.jpg|image/jpeg|1200|1600|0|295756||1637518222|1619375981000|0|0|0|0|||||||| +3791|6841|content://media/external/images/media/6841|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0019.jpg|image/jpeg|1536|2048|0|732464||1637518222|1619363135000|0|0|0|0|||||||| +3792|7140|content://media/external/images/media/7140|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0018.jpg|image/jpeg|2048|1536|0|606252||1637518222|1619363078000|0|0|0|0|||||||| +3793|6526|content://media/external/images/media/6526|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0011.jpg|image/jpeg|1024|768|0|127055||1637518221|1619355437000|0|0|0|0|||||||| +3794|2650|content://media/external/images/media/2650|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-04-24-18-00-34-132_com.strava.jpg|image/jpeg|1080|2340|0|578683||1637500870|1619280034000|0|0|0|0|||||||| +3795|6414|content://media/external/images/media/6414|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210421-WA0004.jpg|image/jpeg|1079|980|0|39842||1637518221|1619022492000|0|0|0|0|||||||| +3796|7534|content://media/external/images/media/7534|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210420-WA0002.jpg|image/jpeg|1600|1296|0|210338||1637518223|1618909756000|0|0|0|0|||||||| +3797|7302|content://media/external/images/media/7302|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210420-WA0001.jpg|image/jpeg|1600|1450|0|182443||1637518223|1618909755000|0|0|0|0|||||||| +3798|2705|content://media/external/images/media/2705|/storage/emulated/0/DCIM/Screenshots/IMG_20210418_185707.jpg|image/jpeg|1005|1227|0|226073||1637500987|1618765027000|0|0|0|0|||||||| +3799|2689|content://media/external/images/media/2689|/storage/emulated/0/Pictures/AdobeLightroom/IMG_20210418_142609.jpg|image/jpeg|4160|2340|0|5420450||1637500871|1618748770000|1618748644074|0|0|0|||||||| +3800|2688|content://media/external/images/media/2688|/storage/emulated/0/Pictures/AdobeLightroom/IMG_20210418_105404.jpg|image/jpeg|4160|2340|0|4440803||1637500871|1618748629000|1618748644074|0|0|0|||||||| +3801|2649|content://media/external/images/media/2649|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-04-18-14-12-25-530_com.dopa.android.blevo.jpg|image/jpeg|1080|2340|0|475153||1637500870|1618747945000|0|0|0|0|||||||| +3802|6291|content://media/external/images/media/6291|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0003.jpg|image/jpeg|1500|2000|0|490702||1637518221|1618747783000|0|0|0|0|||||||| +3803|6524|content://media/external/images/media/6524|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0005.jpg|image/jpeg|1500|2000|0|518655||1637518221|1618747783000|0|0|0|0|||||||| +3804|6737|content://media/external/images/media/6737|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0002.jpg|image/jpeg|1536|2048|0|256052||1637518222|1618747783000|0|0|0|0|||||||| +3805|6292|content://media/external/images/media/6292|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0008.jpg|image/jpeg|2000|1500|0|485671||1637518221|1618740969000|0|0|0|0|||||||| +3806|7139|content://media/external/images/media/7139|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0004.jpg|image/jpeg|1500|2000|0|593373||1637518222|1618740966000|0|0|0|0|||||||| +3807|6840|content://media/external/images/media/6840|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0001.jpg|image/jpeg|1536|2048|0|283068||1637518222|1618740961000|0|0|0|0|||||||| +3808|3850|content://media/external/images/media/3850|/storage/emulated/0/DCIM/Camera/IMG_20210418_105404.jpg|image/jpeg|4160|2340|0|5382458||1637503642|1618736044000|1618736044074|0|0|0|||||||| +3809|6736|content://media/external/images/media/6736|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210417-WA0008.jpg|image/jpeg|1536|2048|0|486658||1637518222|1618684799000|0|0|0|0|||||||| +3810|6839|content://media/external/images/media/6839|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210416-WA0010.jpg|image/jpeg|1536|2048|0|249059||1637518222|1618554657000|0|0|0|0|||||||| +3811|4376|content://media/external/images/media/4376|/storage/emulated/0/DCIM/Camera/IMG_20210414_212118.jpg|image/jpeg|5184|2916|0|2954257||1637504982|1618428079000|1618427939500|0|0|0|||||||| +3812|4022|content://media/external/images/media/4022|/storage/emulated/0/DCIM/Camera/IMG_20210414_211935.jpg|image/jpeg|5184|2916|180|4053192||1637504201|1618427977000|1618427977620|0|0|0|||||||| +3813|2993|content://media/external/images/media/2993|/storage/emulated/0/DCIM/Camera/IMG_20210414_211933.jpg|image/jpeg|5184|2916|180|3952800||1637501771|1618427976000|1618427975978|0|0|0|||||||| +3814|3520|content://media/external/images/media/3520|/storage/emulated/0/DCIM/Camera/IMG_20210414_211932.jpg|image/jpeg|5184|2916|180|3988035||1637502970|1618427974000|1618427974062|0|0|0|||||||| +3815|2811|content://media/external/images/media/2811|/storage/emulated/0/DCIM/Camera/IMG_20210414_211900.jpg|image/jpeg|5184|2916|0|4237656||1637501312|1618427942000|1618427942304|0|0|0|||||||| +3816|3899|content://media/external/images/media/3899|/storage/emulated/0/DCIM/Camera/IMG_20210414_211857.jpg|image/jpeg|5184|2916|0|4089503||1637503732|1618427939000|1618427939500|0|0|0|||||||| +3817|3586|content://media/external/images/media/3586|/storage/emulated/0/DCIM/Camera/IMG_20210414_211854.jpg|image/jpeg|5184|2916|0|4345814||1637503154|1618427936000|1618427936582|0|0|0|||||||| +3818|7300|content://media/external/images/media/7300|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210414-WA0000.jpg|image/jpeg|1536|2048|0|719485||1637518223|1618380953000|0|0|0|0|||||||| +3819|2687|content://media/external/images/media/2687|/storage/emulated/0/Pictures/AdobeLightroom/IMG_20210413_213711.jpg|image/jpeg|5184|2916|0|2820729||1637500871|1618343273000|1618343532470|0|0|0|||||||| +3820|4801|content://media/external/images/media/4801|/storage/emulated/0/DCIM/Camera/IMG_20210413_213802.jpg|image/jpeg|5184|2916|0|2830302||1637505663|1618342683000|1618342632470|0|0|0|||||||| +3821|4703|content://media/external/images/media/4703|/storage/emulated/0/DCIM/Camera/IMG_20210413_213711.jpg|image/jpeg|5184|2916|0|3762516||1637505509|1618342632000|1618342632470|0|0|0|||||||| +3822|3094|content://media/external/images/media/3094|/storage/emulated/0/DCIM/Camera/IMG_20210413_213708.jpg|image/jpeg|5184|2916|0|3876842||1637501971|1618342630000|1618342630294|0|0|0|||||||| +3823|4508|content://media/external/images/media/4508|/storage/emulated/0/DCIM/Camera/IMG_20210413_213512.jpg|image/jpeg|4000|2250|180|4526950||1637505160|1618342514000|1618342514067|0|0|0|||||||| +3824|3384|content://media/external/images/media/3384|/storage/emulated/0/DCIM/Camera/IMG_20210413_213409.jpg|image/jpeg|4000|2250|180|4457230||1637502523|1618342450000|1618342450924|0|0|0|||||||| +3825|5022|content://media/external/images/media/5022|/storage/emulated/0/DCIM/Camera/IMG_20210413_213331.jpg|image/jpeg|4000|2250|180|4456419||1637506134|1618342412000|1618342412297|0|0|0|||||||| +3826|4665|content://media/external/images/media/4665|/storage/emulated/0/DCIM/Camera/IMG_20210413_213203.jpg|image/jpeg|4000|2250|180|4594270||1637505418|1618342325000|1618342325329|0|0|0|||||||| +3827|4610|content://media/external/images/media/4610|/storage/emulated/0/DCIM/Camera/IMG_20210413_212344.jpg|image/jpeg|4000|2250|0|4476279||1637505308|1618341826000|1618341826229|0|0|0|||||||| +3828|3268|content://media/external/images/media/3268|/storage/emulated/0/DCIM/Camera/IMG_20210413_074852.jpg|image/jpeg|4000|2250|90|4650758||1637502342|1618292934000|1618292934567|0|0|0|||||||| +3829|2742|content://media/external/images/media/2742|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-04-09-08-27-45-406_com.brytonsport.active.jpg|image/jpeg|1080|2340|0|613861||1637500987|1617949665000|0|0|0|0|||||||| +3830|3231|content://media/external/images/media/3231|/storage/emulated/0/DCIM/Camera/IMG_20210408_201456.jpg|image/jpeg|4000|2250|90|4710120||1637502258|1617905698000|1617905698283|0|0|0|||||||| +3831|4189|content://media/external/images/media/4189|/storage/emulated/0/DCIM/Camera/IMG_20210407_173649.jpg|image/jpeg|4000|2250|90|4594038||1637504558|1617809811000|1617809811228|0|0|0|||||||| +3832|7532|content://media/external/images/media/7532|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210406-WA0011.jpg|image/jpeg|899|1599|0|164529||1637518223|1617720906000|0|0|0|0|||||||| +3833|7533|content://media/external/images/media/7533|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210406-WA0009.jpg|image/jpeg|899|1599|0|246904||1637518223|1617715126000|0|0|0|0|||||||| +3834|6838|content://media/external/images/media/6838|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210406-WA0008.jpg|image/jpeg|899|1599|0|208282||1637518222|1617714180000|0|0|0|0|||||||| +3835|7409|content://media/external/images/media/7409|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210406-WA0007.jpg|image/jpeg|1152|2048|0|515004||1637518223|1617714151000|0|0|0|0|||||||| +3836|2992|content://media/external/images/media/2992|/storage/emulated/0/DCIM/Camera/IMG_20210403_105452.jpg|image/jpeg|4000|2250|90|8192143||1637501771|1617440094000|1617440093982|0|0|0|||||||| +3837|4021|content://media/external/images/media/4021|/storage/emulated/0/DCIM/Camera/IMG_20210403_105441.jpg|image/jpeg|4000|2250|0|8950263||1637504201|1617440084000|1617440083935|0|0|0|||||||| +3838|2648|content://media/external/images/media/2648|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-04-01-18-49-27-951_com.strava.jpg|image/jpeg|1080|2340|0|498472||1637500870|1617295768000|0|0|0|0|||||||| +3839|6735|content://media/external/images/media/6735|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0035.jpeg|image/jpeg|3840|2160|0|2201782||1637518222|1616954224000|1616954224655|0|0|0|||||||| +3840|2741|content://media/external/images/media/2741|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-03-28-19-36-34-272_com.google.android.googlequicksearchbox.jpg|image/jpeg|1080|2340|0|652883||1637500987|1616952994000|0|0|0|0|||||||| +3841|6290|content://media/external/images/media/6290|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0023.jpg|image/jpeg|972|1296|0|104186||1637518221|1616951366000|0|0|0|0|||||||| +3842|6734|content://media/external/images/media/6734|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0022.jpg|image/jpeg|1200|1600|0|108189||1637518222|1616951366000|0|0|0|0|||||||| +3843|6525|content://media/external/images/media/6525|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0021.jpg|image/jpeg|1600|900|0|279990||1637518221|1616951365000|0|0|0|0|||||||| +3844|7531|content://media/external/images/media/7531|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0019.jpg|image/jpeg|1200|1600|0|452339||1637518223|1616950771000|0|0|0|0|||||||| +3845|7572|content://media/external/images/media/7572|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0011.jpg|image/jpeg|1200|1600|0|126582||1637518223|1616931739000|0|0|0|0|||||||| +3846|6733|content://media/external/images/media/6733|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0010.jpg|image/jpeg|901|1600|0|120755||1637518222|1616926582000|0|0|0|0|||||||| +3847|6415|content://media/external/images/media/6415|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0009.jpg|image/jpeg|1600|901|0|109706||1637518221|1616926576000|0|0|0|0|||||||| +3848|3625|content://media/external/images/media/3625|/storage/emulated/0/DCIM/Camera/IMG_20210328_112815.jpg|image/jpeg|4000|2250|0|6648805||1637503271|1616923698000|1616923698353|0|0|0|||||||| +3849|3560|content://media/external/images/media/3560|/storage/emulated/0/DCIM/Camera/PANO_20210328_102259.jpg|image/jpeg|7888|3744|0|20989729||1637503058|1616919790000|0|0|0|0|||||||| +3850|2957|content://media/external/images/media/2957|/storage/emulated/0/DCIM/Camera/PANO_20210328_102247.jpg|image/jpeg|2192|3776|0|5546925||1637501661|1616919769000|0|0|0|0|||||||| +3851|6837|content://media/external/images/media/6837|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210327-WA0003.jpg|image/jpeg|954|2016|0|229343||1637518222|1616836489000|0|0|0|0|||||||| +3852|7530|content://media/external/images/media/7530|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210326-WA0002.jpg|image/jpeg|720|668|0|51923||1637518223|1616744151000|0|0|0|0|||||||| +3853|4549|content://media/external/images/media/4549|/storage/emulated/0/DCIM/Camera/IMG_20210319_182759.jpg|image/jpeg|4000|2250|90|5540599||1637505187|1616174882000|1616174882485|0|0|0|||||||| +3854|3382|content://media/external/images/media/3382|/storage/emulated/0/DCIM/Camera/IMG_20210319_172427.jpg|image/jpeg|4160|2340|0|4933717||1637502523|1616171067000|1616171067290|0|0|0|||||||| +3855|4065|content://media/external/images/media/4065|/storage/emulated/0/DCIM/Camera/IMG_20210319_103315.jpg|image/jpeg|4000|2250|0|4550609||1637504342|1616146397000|1616146397337|0|0|0|||||||| +3856|3381|content://media/external/images/media/3381|/storage/emulated/0/DCIM/Camera/IMG_20210318_172129.jpg|image/jpeg|4000|2250|90|6225566||1637502523|1616084503000|1616084503110|0|0|0|||||||| +3857|3208|content://media/external/images/media/3208|/storage/emulated/0/DCIM/Camera/IMG_20210318_172109.jpg|image/jpeg|4000|2250|90|5137483||1637502256|1616084491000|1616084491402|0|0|0|||||||| +3858|4528|content://media/external/images/media/4528|/storage/emulated/0/DCIM/Camera/IMG_20210318_172058.jpg|image/jpeg|4000|2250|90|4753249||1637505165|1616084460000|1616084460928|0|0|0|||||||| +3859|3664|content://media/external/images/media/3664|/storage/emulated/0/DCIM/Camera/IMG_20210318_172049.jpg|image/jpeg|4000|2250|0|5120823||1637503358|1616084452000|1616084452838|0|0|0|||||||| +3860|4527|content://media/external/images/media/4527|/storage/emulated/0/DCIM/Camera/IMG_20210318_172006.jpg|image/jpeg|4000|2250|90|3044666||1637505165|1616084410000|1616084410487|0|0|0|||||||| +3861|2991|content://media/external/images/media/2991|/storage/emulated/0/DCIM/Camera/IMG_20210318_111751.jpg|image/jpeg|4000|2250|90|5003807||1637501771|1616062674000|1616062674594|0|0|0|||||||| +3862|7301|content://media/external/images/media/7301|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0037.jpg|image/jpeg|720|1600|0|103375||1637518223|1616010302000|0|0|0|0|||||||| +3863|6835|content://media/external/images/media/6835|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0021.jpg|image/jpeg|749|714|0|51638||1637518222|1615977997000|0|0|0|0|||||||| +3864|6289|content://media/external/images/media/6289|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0008.jpg|image/jpeg|1536|2048|0|417453||1637518221|1615974850000|0|0|0|0|||||||| +3865|6523|content://media/external/images/media/6523|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0009.jpg|image/jpeg|1536|2048|0|294662||1637518221|1615974850000|0|0|0|0|||||||| +3866|6288|content://media/external/images/media/6288|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0005.jpg|image/jpeg|1536|2048|0|599484||1637518221|1615974848000|0|0|0|0|||||||| +3867|6413|content://media/external/images/media/6413|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0007.jpg|image/jpeg|946|2048|0|71703||1637518221|1615974848000|0|0|0|0|||||||| +3868|6732|content://media/external/images/media/6732|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0006.jpg|image/jpeg|946|2048|0|70515||1637518222|1615974848000|0|0|0|0|||||||| +3869|6285|content://media/external/images/media/6285|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210316-WA0011.jpg|image/jpeg|1153|2048|0|324879||1637518221|1615914259000|0|0|0|0|||||||| +3870|7244|content://media/external/images/media/7244|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210316-WA0010.jpg|image/jpeg|1536|2048|0|407794||1637518223|1615914235000|0|0|0|0|||||||| +3871|7529|content://media/external/images/media/7529|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210315-WA0012.jpg|image/jpeg|984|2048|0|158090||1637518223|1615845149000|0|0|0|0|||||||| +3872|3943|content://media/external/images/media/3943|/storage/emulated/0/DCIM/Camera/IMG_20210315_101713.jpg|image/jpeg|4000|2250|0|7299756||1637503853|1615799835000|1615799835331|0|0|0|||||||| +3873|6836|content://media/external/images/media/6836|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210314-WA0003.jpg|image/jpeg|1536|2048|0|267793||1637518222|1615714605000|0|0|0|0|||||||| +3874|6731|content://media/external/images/media/6731|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210314-WA0002.jpg|image/jpeg|1080|1920|0|230934||1637518222|1615707219000|0|0|0|0|||||||| +3875|7528|content://media/external/images/media/7528|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210314-WA0001.jpg|image/jpeg|1536|2048|0|227320||1637518223|1615706538000|0|0|0|0|||||||| +3876|6412|content://media/external/images/media/6412|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210313-WA0026.jpg|image/jpeg|1280|720|0|60892||1637518221|1615654321000|0|0|0|0|||||||| +3877|6287|content://media/external/images/media/6287|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210311-WA0008.jpg|image/jpeg|1536|2048|0|568558||1637518221|1615481425000|0|0|0|0|||||||| +3878|6730|content://media/external/images/media/6730|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210311-WA0009.jpg|image/jpeg|1536|2048|0|652273||1637518222|1615481425000|0|0|0|0|||||||| +3879|6410|content://media/external/images/media/6410|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210311-WA0007.jpg|image/jpeg|1536|2048|0|576508||1637518221|1615481423000|0|0|0|0|||||||| +3880|2740|content://media/external/images/media/2740|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-03-10-20-22-16-963_com.stt.android.suunto.jpg|image/jpeg|1080|2340|0|290165||1637500987|1615404137000|0|0|0|0|||||||| +3881|7243|content://media/external/images/media/7243|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210307-WA0024.jpg|image/jpeg|1200|1600|0|217382||1637518223|1615143778000|0|0|0|0|||||||| +3882|2739|content://media/external/images/media/2739|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-03-07-14-15-21-516_com.brytonsport.active.jpg|image/jpeg|1080|2340|0|536896||1637500987|1615122921000|0|0|0|0|||||||| +3883|7242|content://media/external/images/media/7242|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210307-WA0006.jpg|image/jpeg|1200|1600|0|228483||1637518223|1615118376000|0|0|0|0|||||||| +3884|7571|content://media/external/images/media/7571|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210307-WA0004.jpg|image/jpeg|1200|1600|0|305117||1637518223|1615112944000|0|0|0|0|||||||| +3885|3772|content://media/external/images/media/3772|/storage/emulated/0/DCIM/Camera/IMG_20210307_092233.jpg|image/jpeg|4000|2250|90|7709690||1637503508|1615105356000|1615105356002|0|0|0|||||||| +3886|6729|content://media/external/images/media/6729|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210305-WA0012.jpg|image/jpeg|960|720|0|60069||1637518222|1614967772000|0|0|0|0|||||||| +3887|4609|content://media/external/images/media/4609|/storage/emulated/0/DCIM/Camera/IMG_20210305_131155.jpg|image/jpeg|4000|2250|0|5266601||1637505308|1614946319000|1614946319493|0|0|0|||||||| +3888|3535|content://media/external/images/media/3535|/storage/emulated/0/DCIM/Camera/IMG_20210301_115129.jpg|image/jpeg|4000|2250|90|4732635||1637503010|1614595891000|1614595891289|0|0|0|||||||| +3889|4678|content://media/external/images/media/4678|/storage/emulated/0/DCIM/Camera/IMG_20210224_105850.jpg|image/jpeg|4000|2250|90|4634636||1637505480|1614160733000|1614160732882|0|0|0|||||||| +3890|3957|content://media/external/images/media/3957|/storage/emulated/0/DCIM/Camera/IMG_20210221_190603.jpg|image/jpeg|4000|2250|0|5262686||1637503942|1613930766000|1613930766249|0|0|0|||||||| +3891|2738|content://media/external/images/media/2738|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-02-21-08-08-41-976_de.komoot.android.jpg|image/jpeg|1080|2340|0|778868||1637500987|1613891322000|0|0|0|0|||||||| +3892|2647|content://media/external/images/media/2647|/storage/emulated/0/DCIM/Screenshots/Screenshot_2021-02-21-07-58-13-676_de.komoot.android.jpg|image/jpeg|1080|2340|0|329943||1637500870|1613890693000|0|0|0|0|||||||| +3893|4931|content://media/external/images/media/4931|/storage/emulated/0/DCIM/Camera/IMG_20210220_132123.jpg|image/jpeg|4000|2250|90|3951382||1637506010|1613823685000|1613823685419|0|0|0|||||||| +3894|3206|content://media/external/images/media/3206|/storage/emulated/0/DCIM/Camera/IMG_20210220_131626.jpg|image/jpeg|4000|2250|0|5564882||1637502256|1613823387000|1613823387835|0|0|0|||||||| +3895|3607|content://media/external/images/media/3607|/storage/emulated/0/DCIM/Camera/IMG_20210220_131609.jpg|image/jpeg|4160|2340|0|6813600||1637503238|1613823369000|1613823369281|0|0|0|||||||| +3896|6522|content://media/external/images/media/6522|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210220-WA0011.jpg|image/jpeg|1200|1600|0|515802||1637518221|1613822709000|0|0|0|0|||||||| +3897|6411|content://media/external/images/media/6411|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210220-WA0010.jpg|image/jpeg|1200|1600|0|313954||1637518221|1613822708000|0|0|0|0|||||||| +3898|6521|content://media/external/images/media/6521|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210220-WA0009.jpg|image/jpeg|1200|1600|0|505252||1637518221|1613822707000|0|0|0|0|||||||| +3899|6834|content://media/external/images/media/6834|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210220-WA0008.jpg|image/jpeg|1200|1600|0|435872||1637518222|1613822621000|0|0|0|0|||||||| +3900|4567|content://media/external/images/media/4567|/storage/emulated/0/DCIM/Camera/IMG_20210220_125433.jpg|image/jpeg|4000|2250|0|5518083||1637505216|1613822075000|1613822075645|0|0|0|||||||| +3901|3898|content://media/external/images/media/3898|/storage/emulated/0/DCIM/Camera/IMG_20210220_125423.jpg|image/jpeg|4000|2250|0|5579184||1637503732|1613822065000|1613822065085|0|0|0|||||||| +3902|3134|content://media/external/images/media/3134|/storage/emulated/0/DCIM/Camera/PANO_20210220_100341.jpg|image/jpeg|7952|3680|0|21700853||1637502068|1613811829000|0|0|0|0|||||||| +3903|4893|content://media/external/images/media/4893|/storage/emulated/0/DCIM/Camera/IMG_20210220_100335.jpg|image/jpeg|4160|2340|0|6254352||1637505920|1613811815000|1613811815848|0|0|0|||||||| +3904|4633|content://media/external/images/media/4633|/storage/emulated/0/DCIM/Camera/IMG_20210220_100333.jpg|image/jpeg|4160|2340|0|6212418||1637505390|1613811813000|1613811812873|0|0|0|||||||| +3905|3093|content://media/external/images/media/3093|/storage/emulated/0/DCIM/Camera/IMG_20210219_144310.jpg|image/jpeg|428|400|0|121768||1637501971|1613742191000|1613741858719|0|0|0|||||||| +3906|2809|content://media/external/images/media/2809|/storage/emulated/0/DCIM/Camera/IMG_20210219_143734.jpg|image/jpeg|4000|2250|90|3519907||1637501312|1613741858000|1613741858719|0|0|0|||||||| +3907|6728|content://media/external/images/media/6728|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0038.jpg|image/jpeg|1200|1600|0|220852||1637518222|1613243463000|0|0|0|0|||||||| +3908|6520|content://media/external/images/media/6520|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0037.jpg|image/jpeg|1600|900|0|105509||1637518221|1613243462000|0|0|0|0|||||||| +3909|6727|content://media/external/images/media/6727|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0034.jpg|image/jpeg|1600|760|0|127897||1637518222|1613243461000|0|0|0|0|||||||| +3910|2888|content://media/external/images/media/2888|/storage/emulated/0/DCIM/Camera/IMG_20210213_200728.jpg|image/jpeg|4000|2250|0|4846307||1637501516|1613243249000|1613243249472|0|0|0|||||||| +3911|3347|content://media/external/images/media/3347|/storage/emulated/0/DCIM/Camera/IMG_20210213_200724.jpg|image/jpeg|4000|2250|90|5001841||1637502439|1613243245000|1613243245774|0|0|0|||||||| +3912|3189|content://media/external/images/media/3189|/storage/emulated/0/DCIM/Camera/IMG_20210213_200539.jpg|image/jpeg|4160|2340|0|2954130||1637502161|1613243139000|1613243139672|0|0|0|||||||| +3913|3897|content://media/external/images/media/3897|/storage/emulated/0/DCIM/Camera/IMG_20210213_192803.jpg|image/jpeg|4000|2250|90|5008204||1637503732|1613240885000|1613240885036|0|0|0|||||||| +3914|4664|content://media/external/images/media/4664|/storage/emulated/0/DCIM/Camera/IMG_20210213_192744.jpg|image/jpeg|4000|2250|0|5137411||1637505418|1613240866000|1613240866316|0|0|0|||||||| +3915|3307|content://media/external/images/media/3307|/storage/emulated/0/DCIM/Camera/IMG_20210213_191034.jpg|image/jpeg|4160|2340|0|4388509||1637502430|1613239834000|1613239834043|0|0|0|||||||| +3916|6639|content://media/external/images/media/6639|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0032.jpg|image/jpeg|1600|762|0|104591||1637518221|1613239667000|0|0|0|0|||||||| +3917|7527|content://media/external/images/media/7527|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0024.jpg|image/jpeg|1080|1920|0|137024||1637518223|1613238537000|0|0|0|0|||||||| +3918|6638|content://media/external/images/media/6638|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0007.jpg|image/jpeg|1200|1600|0|133121||1637518221|1613222966000|0|0|0|0|||||||| +3919|7570|content://media/external/images/media/7570|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0006.jpg|image/jpeg|1200|1600|0|140061||1637518223|1613205012000|0|0|0|0|||||||| +3920|6726|content://media/external/images/media/6726|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0003.jpg|image/jpeg|777|1599|0|138138||1637518222|1613201617000|0|0|0|0|||||||| +3921|3346|content://media/external/images/media/3346|/storage/emulated/0/DCIM/Camera/IMG_20210213_074728.jpg|image/jpeg|4160|2340|0|6186375||1637502439|1613198848000|1613198848746|0|0|0|||||||| +3922|4824|content://media/external/images/media/4824|/storage/emulated/0/DCIM/Camera/IMG_20210213_074658.jpg|image/jpeg|4160|2340|0|4985762||1637505731|1613198818000|1613198818066|0|0|0|||||||| +3923|4461|content://media/external/images/media/4461|/storage/emulated/0/DCIM/Camera/PANO_20210213_074634.jpg|image/jpeg|6032|3744|0|13324807||1637505068|1613198800000|0|0|0|0|||||||| +3924|4228|content://media/external/images/media/4228|/storage/emulated/0/DCIM/Camera/IMG_20210212_134622.jpg|image/jpeg|4000|2250|0|4604981||1637504726|1613133984000|1613133984544|0|0|0|||||||| +3925|3606|content://media/external/images/media/3606|/storage/emulated/0/DCIM/Camera/IMG_20210209_134202.jpg|image/jpeg|4000|2250|0|4449686||1637503238|1612874525000|1612874525542|0|0|0|||||||| +3926|4566|content://media/external/images/media/4566|/storage/emulated/0/DCIM/Camera/IMG_20210207_111136.jpg|image/jpeg|4000|2250|90|4464093||1637505216|1612692699000|1612692699015|0|0|0|||||||| +3927|7299|content://media/external/images/media/7299|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210205-WA0002.jpg|image/jpeg|1200|1600|0|228332||1637518223|1612530196000|0|0|0|0|||||||| +3928|3345|content://media/external/images/media/3345|/storage/emulated/0/DCIM/Camera/IMG_20210205_073852.jpg|image/jpeg|4000|2250|0|4079502||1637502439|1612507134000|1612507134529|0|0|0|||||||| +3929|2990|content://media/external/images/media/2990|/storage/emulated/0/DCIM/Camera/IMG_20210204_155405.jpg|image/jpeg|4000|2250|90|4874049||1637501771|1612450446000|1612450446205|0|0|0|||||||| +3930|3306|content://media/external/images/media/3306|/storage/emulated/0/DCIM/Camera/IMG_20210204_155356.jpg|image/jpeg|4000|2250|90|5935753||1637502430|1612450438000|1612450438419|0|0|0|||||||| +3931|3130|content://media/external/images/media/3130|/storage/emulated/0/DCIM/Camera/IMG_20210204_122943.jpg|image/jpeg|4000|2250|0|4396607||1637502068|1612438185000|1612438185415|0|0|0|||||||| +3932|3051|content://media/external/images/media/3051|/storage/emulated/0/DCIM/Camera/IMG_20210204_122935.jpg|image/jpeg|4000|2250|0|4365170||1637501858|1612438178000|1612438178641|0|0|0|||||||| +3933|3709|content://media/external/images/media/3709|/storage/emulated/0/DCIM/Camera/IMG_20210204_120229.jpg|image/jpeg|4000|2250|0|5374989||1637503393|1612436552000|1612436552022|0|0|0|||||||| +3934|3344|content://media/external/images/media/3344|/storage/emulated/0/DCIM/Camera/IMG_20210204_103625.jpg|image/jpeg|4000|2250|0|4754777||1637502439|1612431387000|1612431387520|0|0|0|||||||| +3935|4324|content://media/external/images/media/4324|/storage/emulated/0/DCIM/Camera/IMG_20210204_103302.jpg|image/jpeg|4000|2250|0|4887226||1637504895|1612431185000|1612431184980|0|0|0|||||||| +3936|4418|content://media/external/images/media/4418|/storage/emulated/0/DCIM/Camera/IMG_20210204_102710.jpg|image/jpeg|4000|2250|0|5572363||1637505063|1612430832000|1612430832619|0|0|0|||||||| +3937|6833|content://media/external/images/media/6833|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210125-WA0013.jpg|image/jpeg|1200|1600|0|130007||1637518222|1611603300000|0|0|0|0|||||||| +3938|6286|content://media/external/images/media/6286|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210125-WA0012.jpg|image/jpeg|1600|1200|0|180030||1637518221|1611603298000|0|0|0|0|||||||| +3939|7241|content://media/external/images/media/7241|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210125-WA0011.jpg|image/jpeg|1600|1200|0|180097||1637518223|1611603293000|0|0|0|0|||||||| +3940|6408|content://media/external/images/media/6408|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210125-WA0008.jpg|image/jpeg|1200|1600|0|147727||1637518221|1611603228000|0|0|0|0|||||||| +3941|6637|content://media/external/images/media/6637|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210119-WA0007.jpg|image/jpeg|768|1024|0|93945||1637518221|1611091648000|0|0|0|0|||||||| +3942|7297|content://media/external/images/media/7297|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210119-WA0006.jpg|image/jpeg|900|1600|0|200281||1637518223|1611091094000|0|0|0|0|||||||| +3943|6636|content://media/external/images/media/6636|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210118-WA0012.jpg|image/jpeg|900|1599|0|142292||1637518221|1610994680000|0|0|0|0|||||||| +3944|4632|content://media/external/images/media/4632|/storage/emulated/0/DCIM/Camera/IMG_20210116_145718.jpg|image/jpeg|4000|2250|0|4589506||1637505390|1610805441000|1610805441197|0|0|0|||||||| +3945|7298|content://media/external/images/media/7298|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210116-WA0014.jpg|image/jpeg|1600|1202|0|157494||1637518223|1610805105000|0|0|0|0|||||||| +3946|7526|content://media/external/images/media/7526|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210116-WA0013.jpg|image/jpeg|1202|1600|0|170384||1637518223|1610805046000|0|0|0|0|||||||| +3947|3230|content://media/external/images/media/3230|/storage/emulated/0/DCIM/Camera/IMG_20210103_190702.jpg|image/jpeg|4000|2250|0|4079096||1637502258|1609697223000|1609697223495|0|0|0|||||||| +3948|3246|content://media/external/images/media/3246|/storage/emulated/0/DCIM/Camera/IMG_20210103_190658.jpg|image/jpeg|4000|2250|0|4399575||1637502259|1609697220000|1609697220270|0|0|0|||||||| +3949|6283|content://media/external/images/media/6283|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201224-WA0005.jpg|image/jpeg|1200|1600|0|135733||1637518221|1608797352000|0|0|0|0|||||||| +3950|7240|content://media/external/images/media/7240|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201224-WA0004.jpg|image/jpeg|1200|1600|0|213286||1637518223|1608797352000|0|0|0|0|||||||| +3951|3583|content://media/external/images/media/3583|/storage/emulated/0/DCIM/Camera/IMG_20201220_174238.jpg|image/jpeg|4000|2250|0|4794461||1637503154|1608482561000|1608482561588|0|0|0|||||||| +3952|4736|content://media/external/images/media/4736|/storage/emulated/0/DCIM/Camera/IMG_20201220_105634.jpg|image/jpeg|4000|2250|90|7153834||1637505574|1608458198000|1608458198740|0|0|0|||||||| +3953|6957|content://media/external/images/media/6957|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201219-WA0009.jpg|image/jpeg|1200|1600|0|115498||1637518222|1608388136000|0|0|0|0|||||||| +3954|7525|content://media/external/images/media/7525|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201219-WA0008.jpg|image/jpeg|1200|1600|0|125087||1637518223|1608388136000|0|0|0|0|||||||| +3955|6724|content://media/external/images/media/6724|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201219-WA0007.jpg|image/jpeg|1200|1600|0|125162||1637518222|1608388135000|0|0|0|0|||||||| +3956|6409|content://media/external/images/media/6409|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201219-WA0006.jpg|image/jpeg|1200|1600|0|100615||1637518221|1608388134000|0|0|0|0|||||||| +3957|4631|content://media/external/images/media/4631|/storage/emulated/0/DCIM/Camera/IMG_20201219_144250.jpg|image/jpeg|4000|2250|0|3166325||1637505390|1608385371000|1608385248860|0|0|0|||||||| +3958|4117|content://media/external/images/media/4117|/storage/emulated/0/DCIM/Camera/IMG_20201218_182939.jpg|image/jpeg|4000|2250|0|4486406||1637504451|1608312581000|1608312581474|0|0|0|||||||| +3959|4981|content://media/external/images/media/4981|/storage/emulated/0/DCIM/Camera/IMG_20201218_182553.jpg|image/jpeg|4000|2250|0|4887510||1637506097|1608312356000|1608312355964|0|0|0|||||||| +3960|4565|content://media/external/images/media/4565|/storage/emulated/0/DCIM/Camera/IMG_20201218_181327.jpg|image/jpeg|4000|2250|90|7705964||1637505216|1608311609000|1608311609801|0|0|0|||||||| +3961|4702|content://media/external/images/media/4702|/storage/emulated/0/DCIM/Camera/IMG_20201216_075703.jpg|image/jpeg|4000|2250|90|4637415||1637505509|1608101825000|1608101825691|0|0|0|||||||| +3962|4779|content://media/external/images/media/4779|/storage/emulated/0/DCIM/Camera/IMG_20201216_075616.jpg|image/jpeg|4000|2250|90|4119474||1637505656|1608101779000|1608101778747|0|0|0|||||||| +3963|6635|content://media/external/images/media/6635|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0017.jpg|image/jpeg|1600|737|0|68829||1637518221|1608031557000|0|0|0|0|||||||| +3964|6830|content://media/external/images/media/6830|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0018.jpg|image/jpeg|1600|737|0|111669||1637518222|1608031557000|0|0|0|0|||||||| +3965|6832|content://media/external/images/media/6832|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0019.jpg|image/jpeg|1202|918|0|201502||1637518222|1608031557000|0|0|0|0|||||||| +3966|6634|content://media/external/images/media/6634|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0016.jpg|image/jpeg|1600|740|0|233812||1637518221|1608031556000|0|0|0|0|||||||| +3967|6831|content://media/external/images/media/6831|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0015.jpg|image/jpeg|736|1600|0|259084||1637518222|1608031556000|0|0|0|0|||||||| +3968|6284|content://media/external/images/media/6284|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0014.jpg|image/jpeg|1600|736|0|320224||1637518221|1608031555000|0|0|0|0|||||||| +3969|6725|content://media/external/images/media/6725|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0013.jpg|image/jpeg|1600|737|0|115062||1637518222|1608031554000|0|0|0|0|||||||| +3970|6956|content://media/external/images/media/6956|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0012.jpg|image/jpeg|736|1600|0|280201||1637518222|1608031554000|0|0|0|0|||||||| +3971|6519|content://media/external/images/media/6519|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0011.jpg|image/jpeg|1600|736|0|254218||1637518221|1608031553000|0|0|0|0|||||||| +3972|6633|content://media/external/images/media/6633|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0008.jpg|image/jpeg|1600|736|0|206208||1637518221|1608031552000|0|0|0|0|||||||| +3973|6723|content://media/external/images/media/6723|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0009.jpg|image/jpeg|736|1600|0|255349||1637518222|1608031552000|0|0|0|0|||||||| +3974|6829|content://media/external/images/media/6829|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0010.jpg|image/jpeg|1600|740|0|224911||1637518222|1608031552000|0|0|0|0|||||||| +3975|6632|content://media/external/images/media/6632|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0007.jpg|image/jpeg|1600|736|0|278830||1637518221|1608031551000|0|0|0|0|||||||| +3976|6282|content://media/external/images/media/6282|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0005.jpg|image/jpeg|1600|736|0|233902||1637518221|1608031550000|0|0|0|0|||||||| +3977|6630|content://media/external/images/media/6630|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0006.jpg|image/jpeg|1600|737|0|140318||1637518221|1608031550000|0|0|0|0|||||||| +3978|6280|content://media/external/images/media/6280|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0002.jpg|image/jpeg|1202|1318|0|290055||1637518221|1608031549000|0|0|0|0|||||||| +3979|6281|content://media/external/images/media/6281|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0003.jpg|image/jpeg|1600|737|0|119993||1637518221|1608031549000|0|0|0|0|||||||| +3980|6517|content://media/external/images/media/6517|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201215-WA0004.jpg|image/jpeg|736|1600|0|121175||1637518221|1608031549000|0|0|0|0|||||||| +3981|6279|content://media/external/images/media/6279|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201209-WA0003.jpg|image/jpeg|900|1600|0|157229||1637518221|1607517100000|0|0|0|0|||||||| +3982|6407|content://media/external/images/media/6407|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201209-WA0002.jpg|image/jpeg|901|1600|0|164786||1637518221|1607517084000|0|0|0|0|||||||| +3983|6518|content://media/external/images/media/6518|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201209-WA0001.jpg|image/jpeg|1600|900|0|152687||1637518221|1607517078000|0|0|0|0|||||||| +3984|4207|content://media/external/images/media/4207|/storage/emulated/0/DCIM/Camera/IMG_20201207_130204.jpg|image/jpeg|4160|2340|0|4770211||1637504640|1607342524000|1607342524414|0|0|0|||||||| +3985|4952|content://media/external/images/media/4952|/storage/emulated/0/DCIM/Camera/IMG_20201207_130148.jpg|image/jpeg|4000|2250|0|5393162||1637506015|1607342511000|1607342510914|0|0|0|||||||| +3986|4701|content://media/external/images/media/4701|/storage/emulated/0/DCIM/Camera/IMG_20201207_103349.jpg|image/jpeg|4160|2340|0|6549854||1637505509|1607333629000|1607333629587|0|0|0|||||||| +3987|4311|content://media/external/images/media/4311|/storage/emulated/0/DCIM/Camera/IMG_20201205_103531.jpg|image/jpeg|4000|2250|0|4485711||1637504817|1607160933000|1607160933732|0|0|0|||||||| +3988|6963|content://media/external/images/media/6963|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0041.jpg|image/jpeg|1200|1600|0|314436||1637518222|1606598621000|0|0|0|0|||||||| +3989|6278|content://media/external/images/media/6278|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0037.jpg|image/jpeg|768|1024|0|86656||1637518221|1606597785000|0|0|0|0|||||||| +3990|6406|content://media/external/images/media/6406|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0039.jpg|image/jpeg|1024|768|0|84388||1637518221|1606597785000|0|0|0|0|||||||| +3991|6828|content://media/external/images/media/6828|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0040.jpg|image/jpeg|768|1024|0|131436||1637518222|1606597785000|0|0|0|0|||||||| +3992|7569|content://media/external/images/media/7569|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0038.jpg|image/jpeg|1024|768|0|68932||1637518223|1606597785000|0|0|0|0|||||||| +3993|6405|content://media/external/images/media/6405|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0036.jpg|image/jpeg|1024|1024|0|67009||1637518221|1606597784000|0|0|0|0|||||||| +3994|6629|content://media/external/images/media/6629|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0032.jpg|image/jpeg|768|1024|0|148629||1637518221|1606597775000|0|0|0|0|||||||| +3995|6631|content://media/external/images/media/6631|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0033.jpg|image/jpeg|1024|769|0|128218||1637518221|1606597775000|0|0|0|0|||||||| +3996|7296|content://media/external/images/media/7296|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0034.jpg|image/jpeg|1024|768|0|120935||1637518223|1606597775000|0|0|0|0|||||||| +3997|6721|content://media/external/images/media/6721|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0030.jpg|image/jpeg|768|1024|0|111421||1637518222|1606597774000|0|0|0|0|||||||| +3998|6722|content://media/external/images/media/6722|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0031.jpg|image/jpeg|1024|768|0|134486||1637518222|1606597774000|0|0|0|0|||||||| +3999|7295|content://media/external/images/media/7295|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0029.jpg|image/jpeg|768|1024|0|142288||1637518223|1606597774000|0|0|0|0|||||||| +4000|4101|content://media/external/images/media/4101|/storage/emulated/0/DCIM/Camera/IMG_20201128_200651.jpg|image/jpeg|4000|2250|0|5082563||1637504400|1606590414000|1606590414526|0|0|0|||||||| +4001|7294|content://media/external/images/media/7294|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201128-WA0026.jpg|image/jpeg|1504|1128|0|220679||1637518223|1606589384000|0|0|0|0|||||||| +4002|3112|content://media/external/images/media/3112|/storage/emulated/0/DCIM/Camera/IMG_20201128_093706.jpg|image/jpeg|4000|2250|90|4830984||1637502054|1606552628000|1606552628612|0|0|0|||||||| +4003|3019|content://media/external/images/media/3019|/storage/emulated/0/DCIM/Camera/PANO_20201128_093654.jpg|image/jpeg|2192|3776|0|5202927||1637501786|1606552616000|0|0|0|0|||||||| +4004|3707|content://media/external/images/media/3707|/storage/emulated/0/DCIM/Camera/IMG_20201127_124308.jpg|image/jpeg|4000|2250|0|4324782||1637503392|1606477390000|1606477390666|0|0|0|||||||| +4005|3622|content://media/external/images/media/3622|/storage/emulated/0/DCIM/Camera/IMG_20201127_124303.jpg|image/jpeg|4000|2250|0|4379283||1637503271|1606477387000|1606477386850|0|0|0|||||||| +4006|4078|content://media/external/images/media/4078|/storage/emulated/0/DCIM/Camera/IMG_20201122_123922.jpg|image/jpeg|4000|2250|0|4195025||1637504394|1606045164000|1606045164230|0|0|0|||||||| +4007|4822|content://media/external/images/media/4822|/storage/emulated/0/DCIM/Camera/IMG_20201121_194107.jpg|image/jpeg|4000|2250|0|4169192||1637505730|1605984069000|1605984069701|0|0|0|||||||| +4008|3440|content://media/external/images/media/3440|/storage/emulated/0/DCIM/Camera/IMG_20201121_133846.jpg|image/jpeg|4000|2250|90|4824496||1637502783|1605962328000|1605962327849|0|0|0|||||||| +4009|3518|content://media/external/images/media/3518|/storage/emulated/0/DCIM/Camera/IMG_20201121_133840.jpg|image/jpeg|4000|2250|90|4818786||1637502970|1605962324000|1605962324190|0|0|0|||||||| +4010|7293|content://media/external/images/media/7293|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201118-WA0003.jpg|image/jpeg|1152|2048|0|108875||1637518223|1605692799000|0|0|0|0|||||||| +4011|3706|content://media/external/images/media/3706|/storage/emulated/0/DCIM/Camera/IMG_20201118_074730.jpg|image/jpeg|4000|2250|90|4643725||1637503392|1605682051000|1605682051343|0|0|0|||||||| +4012|3188|content://media/external/images/media/3188|/storage/emulated/0/DCIM/Camera/IMG_20201118_074725.jpg|image/jpeg|4000|2250|90|4834408||1637502161|1605682047000|1605682047103|0|0|0|||||||| +4013|3363|content://media/external/images/media/3363|/storage/emulated/0/DCIM/Camera/IMG_20201118_074723.jpg|image/jpeg|4000|2250|90|4674939||1637502451|1605682044000|1605682044648|0|0|0|||||||| +4014|4401|content://media/external/images/media/4401|/storage/emulated/0/DCIM/Camera/IMG_20201118_074721.jpg|image/jpeg|4000|2250|90|4793793||1637505004|1605682042000|1605682042272|0|0|0|||||||| +4015|4980|content://media/external/images/media/4980|/storage/emulated/0/DCIM/Camera/IMG_20201118_074718.jpg|image/jpeg|4000|2250|90|4614884||1637506097|1605682039000|1605682039726|0|0|0|||||||| +4016|3472|content://media/external/images/media/3472|/storage/emulated/0/DCIM/Camera/IMG_20201118_074714.jpg|image/jpeg|4000|2250|90|4854780||1637502817|1605682035000|1605682035289|0|0|0|||||||| +4017|4289|content://media/external/images/media/4289|/storage/emulated/0/DCIM/Camera/IMG_20201118_074710.jpg|image/jpeg|4000|2250|90|4830761||1637504807|1605682031000|1605682031800|0|0|0|||||||| +4018|2887|content://media/external/images/media/2887|/storage/emulated/0/DCIM/Camera/IMG_20201118_074706.jpg|image/jpeg|4000|2250|90|5082038||1637501516|1605682027000|1605682027312|0|0|0|||||||| +4019|3705|content://media/external/images/media/3705|/storage/emulated/0/DCIM/Camera/IMG_20201118_074703.jpg|image/jpeg|4000|2250|90|5062838||1637503392|1605682025000|1605682025167|0|0|0|||||||| +4020|5003|content://media/external/images/media/5003|/storage/emulated/0/DCIM/Camera/IMG_20201118_074701.jpg|image/jpeg|4000|2250|90|4864781||1637506101|1605682022000|1605682022486|0|0|0|||||||| +4021|3050|content://media/external/images/media/3050|/storage/emulated/0/DCIM/Camera/IMG_20201118_074656.jpg|image/jpeg|4000|2250|90|4449966||1637501858|1605682018000|1605682018308|0|0|0|||||||| +4022|4169|content://media/external/images/media/4169|/storage/emulated/0/DCIM/Camera/IMG_20201118_074636.jpg|image/jpeg|4000|2250|0|4655936||1637504556|1605681999000|1605681998817|0|0|0|||||||| +4023|7292|content://media/external/images/media/7292|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201114-WA0008.jpg|image/jpeg|1200|1600|0|166099||1637518223|1605382980000|0|0|0|0|||||||| +4024|6403|content://media/external/images/media/6403|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201112-WA0002.jpg|image/jpeg|1200|1600|0|148866||1637518221|1605169144000|0|0|0|0|||||||| +4025|7291|content://media/external/images/media/7291|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201112-WA0000.jpg|image/jpeg|1202|1600|0|175394||1637518223|1605169143000|0|0|0|0|||||||| +4026|4268|content://media/external/images/media/4268|/storage/emulated/0/DCIM/Camera/IMG_20201101_134619.jpg|image/jpeg|4000|2250|90|6422006||1637504756|1604234781000|1604234781593|0|0|0|||||||| +4027|4979|content://media/external/images/media/4979|/storage/emulated/0/DCIM/Camera/IMG_20201031_140821.jpg|image/jpeg|4000|2250|90|5894617||1637506097|1604149703000|1604149703781|0|0|0|||||||| +4028|2828|content://media/external/images/media/2828|/storage/emulated/0/DCIM/Camera/IMG_20201031_140819.jpg|image/jpeg|4000|2250|90|6126977||1637501369|1604149702000|1604149702289|0|0|0|||||||| +4029|3049|content://media/external/images/media/3049|/storage/emulated/0/DCIM/Camera/IMG_20201031_132852.jpg|image/jpeg|4000|2250|0|5436073||1637501858|1604147334000|1604147334285|0|0|0|||||||| +4030|6516|content://media/external/images/media/6516|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201031-WA0040.jpg|image/jpeg|1024|768|0|100393||1637518221|1604145616000|0|0|0|0|||||||| +4031|6955|content://media/external/images/media/6955|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201031-WA0039.jpg|image/jpeg|768|1024|0|125631||1637518222|1604145615000|0|0|0|0|||||||| +4032|6953|content://media/external/images/media/6953|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201031-WA0038.jpg|image/jpeg|1200|1600|0|227766||1637518222|1604145543000|0|0|0|0|||||||| +4033|6277|content://media/external/images/media/6277|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201031-WA0036.jpg|image/jpeg|1200|1600|0|302857||1637518221|1604143720000|0|0|0|0|||||||| +4034|6515|content://media/external/images/media/6515|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201030-WA0004.jpg|image/jpeg|750|1334|0|77588||1637518221|1604069314000|0|0|0|0|||||||| +4035|6513|content://media/external/images/media/6513|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201022-WA0008.jpg|image/jpeg|901|1600|0|192092||1637518221|1603391160000|0|0|0|0|||||||| +4036|6954|content://media/external/images/media/6954|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201022-WA0006.jpg|image/jpeg|1200|1600|0|154642||1637518222|1603391103000|0|0|0|0|||||||| +4037|7568|content://media/external/images/media/7568|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201019-WA0003.jpg|image/jpeg|1600|1200|0|258990||1637518223|1603096966000|0|0|0|0|||||||| +4038|6404|content://media/external/images/media/6404|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201018-WA0004.jpg|image/jpeg|1200|1600|0|261287||1637518221|1603024568000|0|0|0|0|||||||| +4039|3420|content://media/external/images/media/3420|/storage/emulated/0/DCIM/Camera/IMG_20201018_121930.jpg|image/jpeg|4000|2250|90|4539026||1637502682|1603016373000|1603016373128|0|0|0|||||||| +4040|2827|content://media/external/images/media/2827|/storage/emulated/0/DCIM/Camera/IMG_20201017_232522.jpg|image/jpeg|4000|2250|90|4930229||1637501369|1602969924000|1602969924564|0|0|0|||||||| +4041|2826|content://media/external/images/media/2826|/storage/emulated/0/DCIM/Camera/IMG_20201013_231432.jpg|image/jpeg|4000|2250|0|4433774||1637501369|1602623673000|1602623673861|0|0|0|||||||| +4042|4735|content://media/external/images/media/4735|/storage/emulated/0/DCIM/Camera/IMG_20201013_231403.jpg|image/jpeg|4000|2250|0|4158870||1637505574|1602623645000|1602623645253|0|0|0|||||||| +4043|6628|content://media/external/images/media/6628|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201011-WA0004.jpg|image/jpeg|1600|1200|0|173952||1637518221|1602369237000|0|0|0|0|||||||| +4044|6827|content://media/external/images/media/6827|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201011-WA0003.jpg|image/jpeg|1600|1200|0|155306||1637518222|1602369237000|0|0|0|0|||||||| +4045|7567|content://media/external/images/media/7567|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201011-WA0002.jpg|image/jpeg|1128|1504|0|388166||1637518223|1602369237000|0|0|0|0|||||||| +4046|6951|content://media/external/images/media/6951|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201011-WA0001.jpg|image/jpeg|1600|1200|0|149159||1637518222|1602369236000|0|0|0|0|||||||| +4047|7290|content://media/external/images/media/7290|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201011-WA0000.jpg|image/jpeg|1600|1200|0|167270||1637518223|1602369235000|0|0|0|0|||||||| +4048|6952|content://media/external/images/media/6952|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201009-WA0011.jpeg|image/jpeg|4000|2250|0|842178||1637518222|1602270044000|0|0|0|0|||||||| +4049|6720|content://media/external/images/media/6720|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20201009-WA0004.jpg|image/jpeg|768|1024|0|61621||1637518222|1602245057000|0|0|0|0|||||||| +4050|6818|content://media/external/images/media/6818|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0070.jpg|image/jpeg|900|1600|0|103273||1637518222|1601491402000|0|0|0|0|||||||| +4051|3769|content://media/external/images/media/3769|/storage/emulated/0/DCIM/Camera/IMG_20200927_195211.jpg|image/jpeg|4000|2250|90|5011696||1637503508|1601229133000|1601229133401|0|0|0|||||||| +4052|4206|content://media/external/images/media/4206|/storage/emulated/0/DCIM/Camera/IMG_20200927_195207.jpg|image/jpeg|4000|2250|90|4641818||1637504640|1601229130000|1601229129858|0|0|0|||||||| +4053|4416|content://media/external/images/media/4416|/storage/emulated/0/DCIM/Camera/IMG_20200927_173357.jpg|image/jpeg|4000|2250|0|5084526||1637505063|1601220839000|1601220838941|0|0|0|||||||| +4054|6514|content://media/external/images/media/6514|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200925-WA0001.jpg|image/jpeg|1200|1600|0|133103||1637518221|1601033957000|0|0|0|0|||||||| +4055|6627|content://media/external/images/media/6627|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200921-WA0000.jpg|image/jpeg|1200|1600|0|224645||1637518221|1600666442000|0|0|0|0|||||||| +4056|6276|content://media/external/images/media/6276|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200920-WA0021.jpg|image/jpeg|1600|1201|0|325388||1637518221|1600638894000|0|0|0|0|||||||| +4057|6512|content://media/external/images/media/6512|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200920-WA0020.jpg|image/jpeg|1600|1200|0|262179||1637518221|1600627493000|0|0|0|0|||||||| +4058|6712|content://media/external/images/media/6712|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0061.jpg|image/jpeg|1024|768|0|106987||1637518222|1600627493000|0|0|0|0|||||||| +4059|6275|content://media/external/images/media/6275|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0012.jpg|image/jpeg|1600|1200|0|247032||1637518221|1600542612000|0|0|0|0|||||||| +4060|6511|content://media/external/images/media/6511|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0011.jpg|image/jpeg|1600|1200|0|232265||1637518221|1600542596000|0|0|0|0|||||||| +4061|6950|content://media/external/images/media/6950|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0010.jpg|image/jpeg|768|1024|0|86892||1637518222|1600536844000|0|0|0|0|||||||| +4062|6402|content://media/external/images/media/6402|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0009.jpg|image/jpeg|768|1024|0|86529||1637518221|1600536843000|0|0|0|0|||||||| +4063|6719|content://media/external/images/media/6719|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0008.jpg|image/jpeg|768|1024|0|78354||1637518222|1600536841000|0|0|0|0|||||||| +4064|6626|content://media/external/images/media/6626|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0007.jpg|image/jpeg|768|1024|0|89866||1637518221|1600536840000|0|0|0|0|||||||| +4065|6510|content://media/external/images/media/6510|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0006.jpg|image/jpeg|768|1024|0|117053||1637518221|1600536811000|0|0|0|0|||||||| +4066|6948|content://media/external/images/media/6948|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0005.jpg|image/jpeg|768|1024|0|77125||1637518222|1600536810000|0|0|0|0|||||||| +4067|6826|content://media/external/images/media/6826|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200919-WA0004.jpg|image/jpeg|768|1024|0|86748||1637518222|1600536808000|0|0|0|0|||||||| +4068|6274|content://media/external/images/media/6274|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200916-WA0006.jpg|image/jpeg|900|1600|0|231161||1637518221|1600282270000|0|0|0|0|||||||| +4069|6622|content://media/external/images/media/6622|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0082.jpg|image/jpeg|1024|768|0|149547||1637518221|1600169735000|0|0|0|0|||||||| +4070|6825|content://media/external/images/media/6825|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200915-WA0002.jpg|image/jpeg|576|1024|0|112162||1637518222|1600169735000|0|0|0|0|||||||| +4071|6401|content://media/external/images/media/6401|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200914-WA0010.jpg|image/jpeg|1024|473|0|66681||1637518221|1600107435000|0|0|0|0|||||||| +4072|6273|content://media/external/images/media/6273|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200914-WA0009.jpg|image/jpeg|1024|473|0|57449||1637518221|1600107390000|0|0|0|0|||||||| +4073|6824|content://media/external/images/media/6824|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200914-WA0006.jpg|image/jpeg|1024|768|0|109573||1637518222|1600078105000|0|0|0|0|||||||| +4074|7289|content://media/external/images/media/7289|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200914-WA0005.jpg|image/jpeg|1024|768|0|119718||1637518223|1600078044000|0|0|0|0|||||||| +4075|6823|content://media/external/images/media/6823|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200914-WA0004.jpg|image/jpeg|1024|622|0|99758||1637518222|1600077250000|0|0|0|0|||||||| +4076|6822|content://media/external/images/media/6822|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200914-WA0001.jpg|image/jpeg|768|1024|0|151190||1637518222|1600069295000|0|0|0|0|||||||| +4077|6718|content://media/external/images/media/6718|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200913-WA0028.jpg|image/jpeg|1125|2000|0|254784||1637518222|1600023652000|0|0|0|0|||||||| +4078|6625|content://media/external/images/media/6625|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200913-WA0026.jpg|image/jpeg|1600|900|0|285608||1637518221|1600022726000|0|0|0|0|||||||| +4079|6947|content://media/external/images/media/6947|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0031.jpg|image/jpeg|768|1024|0|156559||1637518222|1600022410000|0|0|0|0|||||||| +4080|6509|content://media/external/images/media/6509|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0075.jpg|image/jpeg|768|1024|0|208473||1637518221|1600021992000|0|0|0|0|||||||| +4081|5020|content://media/external/images/media/5020|/storage/emulated/0/DCIM/Camera/IMG_20200913_152026.jpg|image/jpeg|4000|2250|90|4380146||1637506134|1600003228000|1600003228418|0|0|0|||||||| +4082|3767|content://media/external/images/media/3767|/storage/emulated/0/DCIM/Camera/IMG_20200913_141803.jpg|image/jpeg|4000|2250|0|4703466||1637503508|1599999485000|1599999484962|0|0|0|||||||| +4083|4778|content://media/external/images/media/4778|/storage/emulated/0/DCIM/Camera/IMG_20200913_093624.jpg|image/jpeg|4160|2340|90|5396293||1637505656|1599982584000|1599982584690|0|0|0|||||||| +4084|3730|content://media/external/images/media/3730|/storage/emulated/0/DCIM/Camera/IMG_20200913_093607.jpg|image/jpeg|4160|2340|0|5667580||1637503477|1599982567000|1599982567639|0|0|0|||||||| +4085|6624|content://media/external/images/media/6624|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0038.jpg|image/jpeg|768|1024|0|123285||1637518221|1599943232000|0|0|0|0|||||||| +4086|6949|content://media/external/images/media/6949|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0043.jpg|image/jpeg|1024|768|0|124765||1637518222|1599943215000|0|0|0|0|||||||| +4087|6400|content://media/external/images/media/6400|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0041.jpg|image/jpeg|768|1024|0|113509||1637518221|1599935299000|0|0|0|0|||||||| +4088|6272|content://media/external/images/media/6272|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0040.jpg|image/jpeg|1024|768|0|138820||1637518221|1599935298000|0|0|0|0|||||||| +4089|6821|content://media/external/images/media/6821|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0039.jpg|image/jpeg|1024|768|0|156662||1637518222|1599935296000|0|0|0|0|||||||| +4090|6623|content://media/external/images/media/6623|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0036.jpg|image/jpeg|1024|768|0|134832||1637518221|1599935289000|0|0|0|0|||||||| +4091|6946|content://media/external/images/media/6946|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0035.jpg|image/jpeg|1024|768|0|145181||1637518222|1599935285000|0|0|0|0|||||||| +4092|6944|content://media/external/images/media/6944|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0030.jpg|image/jpeg|1024|768|0|104069||1637518222|1599929918000|0|0|0|0|||||||| +4093|6716|content://media/external/images/media/6716|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200912-WA0029.jpg|image/jpeg|1024|768|0|146465||1637518222|1599929917000|0|0|0|0|||||||| +4094|3986|content://media/external/images/media/3986|/storage/emulated/0/DCIM/Camera/IMG_20200912_183627.jpg|image/jpeg|4000|2250|90|5928221||1637504059|1599928590000|1599928590473|0|0|0|||||||| +4095|4168|content://media/external/images/media/4168|/storage/emulated/0/DCIM/Camera/IMG_20200912_183622.jpg|image/jpeg|4000|2250|90|6647816||1637504556|1599928586000|1599928586683|0|0|0|||||||| +4096|4267|content://media/external/images/media/4267|/storage/emulated/0/DCIM/Camera/IMG_20200912_163244.jpg|image/jpeg|4000|2250|90|4556382||1637504756|1599921166000|1599921165991|0|0|0|||||||| +4097|4020|content://media/external/images/media/4020|/storage/emulated/0/DCIM/Camera/IMG_20200912_155056.jpg|image/jpeg|4000|2250|0|7001124||1637504201|1599918659000|1599918658905|0|0|0|||||||| +4098|3766|content://media/external/images/media/3766|/storage/emulated/0/DCIM/Camera/IMG_20200912_133701.jpg|image/jpeg|4160|2340|0|4099720||1637503508|1599910621000|1599910621207|0|0|0|||||||| +4099|3896|content://media/external/images/media/3896|/storage/emulated/0/DCIM/Camera/IMG_20200912_130949.jpg|image/jpeg|4000|2250|0|4150820||1637503732|1599908990000|1599908990501|0|0|0|||||||| +4100|4227|content://media/external/images/media/4227|/storage/emulated/0/DCIM/Camera/IMG_20200912_125837.jpg|image/jpeg|4000|2250|90|5102174||1637504726|1599908319000|1599908319392|0|0|0|||||||| +4101|3111|content://media/external/images/media/3111|/storage/emulated/0/DCIM/Camera/IMG_20200912_125055.jpg|image/jpeg|4000|2250|90|4699650||1637502054|1599907857000|1599907857216|0|0|0|||||||| +4102|4821|content://media/external/images/media/4821|/storage/emulated/0/DCIM/Camera/IMG_20200912_123811.jpg|image/jpeg|4000|2250|90|4746906||1637505730|1599907093000|1599907093191|0|0|0|||||||| +4103|4400|content://media/external/images/media/4400|/storage/emulated/0/DCIM/Camera/IMG_20200912_114502.jpg|image/jpeg|4000|2250|90|6141771||1637505004|1599903904000|1599903904071|0|0|0|||||||| +4104|4745|content://media/external/images/media/4745|/storage/emulated/0/DCIM/Camera/PANO_20200912_110431.jpg|image/jpeg|7440|3744|0|16039057||1637505574|1599901478000|0|0|0|0|||||||| +4105|4677|content://media/external/images/media/4677|/storage/emulated/0/DCIM/Camera/IMG_20200912_110243.jpg|image/jpeg|4000|2250|90|4834671||1637505480|1599901365000|1599901365572|0|0|0|||||||| +4106|3197|content://media/external/images/media/3197|/storage/emulated/0/DCIM/Camera/PANO_20200912_105827.jpg|image/jpeg|3568|4736|270|9888136||1637502162|1599901115000|0|0|0|0|||||||| +4107|3430|content://media/external/images/media/3430|/storage/emulated/0/DCIM/Camera/PANO_20200912_105813.jpg|image/jpeg|3600|5344|270|9560855||1637502682|1599901104000|0|0|0|0|||||||| +4108|3453|content://media/external/images/media/3453|/storage/emulated/0/DCIM/Camera/IMG_20200912_094627.jpg|image/jpeg|4000|2250|0|5223976||1637502804|1599896789000|1599896789111|0|0|0|||||||| +4109|6399|content://media/external/images/media/6399|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0081.jpg|image/jpeg|1024|768|0|108079||1637518221|1599844765000|0|0|0|0|||||||| +4110|4584|content://media/external/images/media/4584|/storage/emulated/0/DCIM/Camera/IMG_20200911_191111.jpg|image/jpeg|4160|2340|0|4818481||1637505278|1599844271000|1599844271373|0|0|0|||||||| +4111|5001|content://media/external/images/media/5001|/storage/emulated/0/DCIM/Camera/IMG_20200911_191104.jpg|image/jpeg|4160|2340|0|4808116||1637506101|1599844264000|1599844264466|0|0|0|||||||| +4112|6271|content://media/external/images/media/6271|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0076.jpg|image/jpeg|1024|768|0|128428||1637518221|1599836536000|0|0|0|0|||||||| +4113|6508|content://media/external/images/media/6508|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0074.jpg|image/jpeg|768|1024|0|191046||1637518221|1599836473000|0|0|0|0|||||||| +4114|6717|content://media/external/images/media/6717|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0073.jpg|image/jpeg|768|1024|0|142205||1637518222|1599836473000|0|0|0|0|||||||| +4115|6621|content://media/external/images/media/6621|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0071.jpg|image/jpeg|1024|768|0|165786||1637518221|1599836472000|0|0|0|0|||||||| +4116|6713|content://media/external/images/media/6713|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0072.jpg|image/jpeg|1024|768|0|161277||1637518222|1599836472000|0|0|0|0|||||||| +4117|7566|content://media/external/images/media/7566|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0070.jpg|image/jpeg|768|1024|0|142212||1637518223|1599836472000|0|0|0|0|||||||| +4118|6820|content://media/external/images/media/6820|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0068.jpg|image/jpeg|768|1024|0|139743||1637518222|1599836471000|0|0|0|0|||||||| +4119|7288|content://media/external/images/media/7288|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0069.jpg|image/jpeg|768|1024|0|69140||1637518223|1599836471000|0|0|0|0|||||||| +4120|6398|content://media/external/images/media/6398|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0066.jpg|image/jpeg|1024|768|0|201015||1637518221|1599836470000|0|0|0|0|||||||| +4121|6620|content://media/external/images/media/6620|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0067.jpg|image/jpeg|768|1024|0|139947||1637518221|1599836470000|0|0|0|0|||||||| +4122|6945|content://media/external/images/media/6945|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0065.jpg|image/jpeg|1024|768|0|152898||1637518222|1599836467000|0|0|0|0|||||||| +4123|7565|content://media/external/images/media/7565|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200911-WA0006.jpg|image/jpeg|1125|2000|0|607275||1637518223|1599827679000|0|0|0|0|||||||| +4124|4063|content://media/external/images/media/4063|/storage/emulated/0/DCIM/Camera/IMG_20200911_133658.jpg|image/jpeg|1076|821|0|432854||1637504342|1599824218000|1599824143699|0|0|0|||||||| +4125|4001|content://media/external/images/media/4001|/storage/emulated/0/DCIM/Camera/IMG_20200911_133543.jpg|image/jpeg|4000|2250|0|7435508||1637504086|1599824147000|1599824146982|0|0|0|||||||| +4126|3343|content://media/external/images/media/3343|/storage/emulated/0/DCIM/Camera/IMG_20200911_132133.jpg|image/jpeg|4000|2250|0|3271818||1637502439|1599823294000|1599823294603|0|0|0|||||||| +4127|3516|content://media/external/images/media/3516|/storage/emulated/0/DCIM/Camera/IMG_20200911_132120.jpg|image/jpeg|4000|2250|90|3591361||1637502970|1599823281000|1599823281793|0|0|0|||||||| +4128|4700|content://media/external/images/media/4700|/storage/emulated/0/DCIM/Camera/IMG_20200911_132108.jpg|image/jpeg|4000|2250|0|4800832||1637505509|1599823272000|1599823272803|0|0|0|||||||| +4129|3439|content://media/external/images/media/3439|/storage/emulated/0/DCIM/Camera/IMG_20200911_125509.jpg|image/jpeg|4160|2340|90|6088838||1637502783|1599821709000|1599821709850|0|0|0|||||||| +4130|2860|content://media/external/images/media/2860|/storage/emulated/0/DCIM/Camera/IMG_20200911_124343.jpg|image/jpeg|4000|2250|90|7424532||1637501457|1599821025000|1599821024974|0|0|0|||||||| +4131|4266|content://media/external/images/media/4266|/storage/emulated/0/DCIM/Camera/IMG_20200911_124321.jpg|image/jpeg|4000|2250|90|6006088||1637504756|1599821005000|1599821005309|0|0|0|||||||| +4132|4100|content://media/external/images/media/4100|/storage/emulated/0/DCIM/Camera/IMG_20200911_123821.jpg|image/jpeg|4000|2250|90|5343424||1637504400|1599820703000|1599820703082|0|0|0|||||||| +4133|3827|content://media/external/images/media/3827|/storage/emulated/0/DCIM/Camera/IMG_20200911_123730.jpg|image/jpeg|4000|2250|90|6689912||1637503630|1599820653000|1599820653119|0|0|0|||||||| +4134|4758|content://media/external/images/media/4758|/storage/emulated/0/DCIM/Camera/IMG_20200911_120553.jpg|image/jpeg|276|188|0|36151||1637505639|1599818753000|0|0|0|0|||||||| +4135|4140|content://media/external/images/media/4140|/storage/emulated/0/DCIM/Camera/IMG_20200911_120320.jpg|image/jpeg|4160|2340|0|6917934||1637504473|1599818600000|1599818600375|0|0|0|||||||| +4136|4247|content://media/external/images/media/4247|/storage/emulated/0/DCIM/Camera/IMG_20200911_120013.jpg|image/jpeg|4000|2250|0|7687489||1637504734|1599818415000|1599818415436|0|0|0|||||||| +4137|4734|content://media/external/images/media/4734|/storage/emulated/0/DCIM/Camera/IMG_20200911_115504.jpg|image/jpeg|276|188|0|25830||1637505574|1599818104000|0|0|0|0|||||||| +4138|3380|content://media/external/images/media/3380|/storage/emulated/0/DCIM/Camera/IMG_20200911_115357.jpg|image/jpeg|495|390|0|83683||1637502523|1599818037000|0|0|0|0|||||||| +4139|3515|content://media/external/images/media/3515|/storage/emulated/0/DCIM/Camera/IMG_20200911_115239.jpg|image/jpeg|4160|2340|0|7359923||1637502969|1599817959000|1599817959191|0|0|0|||||||| +4140|4356|content://media/external/images/media/4356|/storage/emulated/0/DCIM/Camera/IMG_20200911_115216.jpg|image/jpeg|4000|2250|90|4815173||1637504970|1599817941000|1599817940772|0|0|0|||||||| +4141|3149|content://media/external/images/media/3149|/storage/emulated/0/DCIM/Camera/IMG_20200911_115218.jpg|image/jpeg|720|1280|0|211389||1637502130|1599817939000|0|0|0|0|||||||| +4142|4099|content://media/external/images/media/4099|/storage/emulated/0/DCIM/Camera/IMG_20200911_115147.jpg|image/jpeg|4000|2250|90|6263070||1637504400|1599817908000|1599817908855|0|0|0|||||||| +4143|2972|content://media/external/images/media/2972|/storage/emulated/0/DCIM/Camera/IMG_20200911_115048.jpg|image/jpeg|4000|2250|0|4475768||1637501684|1599817850000|1599817850478|0|0|0|||||||| +4144|4914|content://media/external/images/media/4914|/storage/emulated/0/DCIM/Camera/IMG_20200911_115049.jpg|image/jpeg|4000|2250|0|4647135||1637505944|1599817850000|1599817850613|0|0|0|||||||| +4145|2971|content://media/external/images/media/2971|/storage/emulated/0/DCIM/Camera/IMG_20200911_115045.jpg|image/jpeg|4000|2250|0|4401185||1637501684|1599817847000|1599817847183|0|0|0|||||||| +4146|4415|content://media/external/images/media/4415|/storage/emulated/0/DCIM/Camera/IMG_20200911_115042.jpg|image/jpeg|4000|2250|0|4403118||1637505063|1599817843000|1599817843545|0|0|0|||||||| +4147|4062|content://media/external/images/media/4062|/storage/emulated/0/DCIM/Camera/IMG_20200911_114545.jpg|image/jpeg|4000|2250|90|5090135||1637504342|1599817546000|1599817546650|0|0|0|||||||| +4148|3514|content://media/external/images/media/3514|/storage/emulated/0/DCIM/Camera/IMG_20200911_113918.jpg|image/jpeg|4000|2250|90|5349577||1637502969|1599817162000|1599817162614|0|0|0|||||||| +4149|4929|content://media/external/images/media/4929|/storage/emulated/0/DCIM/Camera/IMG_20200911_113845.jpg|image/jpeg|4000|2250|0|6399373||1637506010|1599817131000|1599817131112|0|0|0|||||||| +4150|4646|content://media/external/images/media/4646|/storage/emulated/0/DCIM/Camera/IMG_20200911_113830.jpg|image/jpeg|4000|2250|90|6706207||1637505414|1599817112000|1599817112241|0|0|0|||||||| +4151|3288|content://media/external/images/media/3288|/storage/emulated/0/DCIM/Camera/IMG_20200911_113023.jpg|image/jpeg|1148|1987|0|1399752||1637502355|1599816623000|1599816296127|0|0|0|||||||| +4152|4546|content://media/external/images/media/4546|/storage/emulated/0/DCIM/Camera/IMG_20200911_112456.jpg|image/jpeg|4000|2250|0|8036775||1637505187|1599816296000|1599816296127|0|0|0|||||||| +4153|3379|content://media/external/images/media/3379|/storage/emulated/0/DCIM/Camera/IMG_20200911_112359.jpg|image/jpeg|4000|2250|0|6224780||1637502523|1599816243000|1599816243515|0|0|0|||||||| +4154|4439|content://media/external/images/media/4439|/storage/emulated/0/DCIM/Camera/IMG_20200911_112353.jpg|image/jpeg|4000|2250|0|6858236||1637505068|1599816235000|1599816235665|0|0|0|||||||| +4155|4950|content://media/external/images/media/4950|/storage/emulated/0/DCIM/Camera/IMG_20200911_111158.jpg|image/jpeg|4000|2250|0|7230358||1637506015|1599815520000|1599815520215|0|0|0|||||||| +4156|4487|content://media/external/images/media/4487|/storage/emulated/0/DCIM/Camera/IMG_20200911_111141.jpg|image/jpeg|4000|2250|0|7525507||1637505122|1599815504000|1599815503851|0|0|0|||||||| +4157|4494|content://media/external/images/media/4494|/storage/emulated/0/DCIM/Camera/PANO_20200910_174031.jpg|image/jpeg|6512|3712|0|14770425||1637505122|1599752439000|0|0|0|0|||||||| +4158|4445|content://media/external/images/media/4445|/storage/emulated/0/DCIM/Camera/PANO_20200910_162350.jpg|image/jpeg|6896|3616|0|16762572||1637505068|1599747839000|0|0|0|0|||||||| +4159|4139|content://media/external/images/media/4139|/storage/emulated/0/DCIM/Camera/IMG_20200910_162340.jpg|image/jpeg|4000|2250|0|6452919||1637504473|1599747822000|1599747822098|0|0|0|||||||| +4160|3342|content://media/external/images/media/3342|/storage/emulated/0/DCIM/Camera/IMG_20200910_162316.jpg|image/jpeg|4000|2250|0|4068888||1637502439|1599747802000|1599747802355|0|0|0|||||||| +4161|4138|content://media/external/images/media/4138|/storage/emulated/0/DCIM/Camera/IMG_20200910_162244.jpg|image/jpeg|4000|2250|90|5967860||1637504473|1599747766000|1599747766563|0|0|0|||||||| +4162|3895|content://media/external/images/media/3895|/storage/emulated/0/DCIM/Camera/IMG_20200910_162234.jpg|image/jpeg|4000|2250|0|6125255||1637503732|1599747757000|1599747757466|0|0|0|||||||| +4163|4928|content://media/external/images/media/4928|/storage/emulated/0/DCIM/Camera/IMG_20200910_153011.jpg|image/jpeg|4160|2340|90|4530148||1637506010|1599744611000|1599744611662|0|0|0|||||||| +4164|7287|content://media/external/images/media/7287|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200910-WA0003.jpg|image/jpeg|900|1600|0|129819||1637518223|1599743099000|0|0|0|0|||||||| +4165|7564|content://media/external/images/media/7564|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200910-WA0002.jpg|image/jpeg|900|1600|0|161415||1637518223|1599743086000|0|0|0|0|||||||| +4166|3965|content://media/external/images/media/3965|/storage/emulated/0/DCIM/Camera/PANO_20200910_125921.jpg|image/jpeg|9872|3648|0|27935219||1637503942|1599735570000|0|0|0|0|||||||| +4167|4927|content://media/external/images/media/4927|/storage/emulated/0/DCIM/Camera/IMG_20200910_124430.jpg|image/jpeg|4000|2250|90|7061698||1637506010|1599734672000|1599734672342|0|0|0|||||||| +4168|3582|content://media/external/images/media/3582|/storage/emulated/0/DCIM/Camera/IMG_20200910_121537.jpg|image/jpeg|4000|2250|90|6816162||1637503154|1599732939000|1599732938969|0|0|0|||||||| +4169|4286|content://media/external/images/media/4286|/storage/emulated/0/DCIM/Camera/IMG_20200910_115222.jpg|image/jpeg|4000|2250|0|5104705||1637504807|1599731545000|1599731545814|0|0|0|||||||| +4170|3826|content://media/external/images/media/3826|/storage/emulated/0/DCIM/Camera/IMG_20200910_114508.jpg|image/jpeg|4000|2250|0|4759962||1637503629|1599731112000|1599731111955|0|0|0|||||||| +4171|5000|content://media/external/images/media/5000|/storage/emulated/0/DCIM/Camera/IMG_20200910_114446.jpg|image/jpeg|4160|2340|0|5332824||1637506101|1599731086000|1599731086695|0|0|0|||||||| +4172|3031|content://media/external/images/media/3031|/storage/emulated/0/DCIM/Camera/IMG_20200910_114231.jpg|image/jpeg|4000|2250|90|5448143||1637501805|1599730956000|1599730956245|0|0|0|||||||| +4173|3229|content://media/external/images/media/3229|/storage/emulated/0/DCIM/Camera/IMG_20200910_112243.jpg|image/jpeg|4000|2250|90|5370069||1637502258|1599729764000|1599729764576|0|0|0|||||||| +4174|3186|content://media/external/images/media/3186|/storage/emulated/0/DCIM/Camera/IMG_20200910_111338.jpg|image/jpeg|4160|2340|0|5279281||1637502161|1599729218000|1599729218215|0|0|0|||||||| +4175|4865|content://media/external/images/media/4865|/storage/emulated/0/DCIM/Camera/IMG_20200910_111235.jpg|image/jpeg|4160|2340|0|5113997||1637505831|1599729155000|1599729155775|0|0|0|||||||| +4176|3811|content://media/external/images/media/3811|/storage/emulated/0/DCIM/Camera/IMG_20200910_103704.jpg|image/jpeg|4000|2250|0|5498723||1637503601|1599727026000|1599727025965|0|0|0|||||||| +4177|4155|content://media/external/images/media/4155|/storage/emulated/0/DCIM/Camera/IMG_20200910_103648.jpg|image/jpeg|4000|2250|90|5750885||1637504481|1599727010000|1599727010347|0|0|0|||||||| +4178|4556|content://media/external/images/media/4556|/storage/emulated/0/DCIM/Camera/PANO_20200910_102007.jpg|image/jpeg|7952|3744|0|25173157||1637505187|1599726019000|0|0|0|0|||||||| +4179|4468|content://media/external/images/media/4468|/storage/emulated/0/DCIM/Camera/IMG_20200910_102002.jpg|image/jpeg|4160|2340|0|5710631||1637505091|1599726002000|1599726002214|0|0|0|||||||| +4180|6715|content://media/external/images/media/6715|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0075.jpg|image/jpeg|1024|313|0|62844||1637518222|1599656915000|0|0|0|0|||||||| +4181|3757|content://media/external/images/media/3757|/storage/emulated/0/DCIM/Camera/PANO_20200909_150529.jpg|image/jpeg|7696|3584|0|21775496||1637503488|1599656735000|0|0|0|0|||||||| +4182|6819|content://media/external/images/media/6819|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0074.jpg|image/jpeg|1024|768|0|125498||1637518222|1599653242000|0|0|0|0|||||||| +4183|6714|content://media/external/images/media/6714|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0073.jpg|image/jpeg|1024|372|0|78118||1637518222|1599653119000|0|0|0|0|||||||| +4184|6397|content://media/external/images/media/6397|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0072.jpg|image/jpeg|900|1600|0|147832||1637518221|1599653078000|0|0|0|0|||||||| +4185|6619|content://media/external/images/media/6619|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0071.jpg|image/jpeg|578|897|0|41239||1637518221|1599653078000|0|0|0|0|||||||| +4186|6507|content://media/external/images/media/6507|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0068.jpg|image/jpeg|900|1600|0|228237||1637518221|1599653077000|0|0|0|0|||||||| +4187|6817|content://media/external/images/media/6817|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0069.jpg|image/jpeg|900|1600|0|193069||1637518222|1599653077000|0|0|0|0|||||||| +4188|6396|content://media/external/images/media/6396|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0065.jpg|image/jpeg|900|1600|0|203432||1637518221|1599653076000|0|0|0|0|||||||| +4189|6942|content://media/external/images/media/6942|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200909-WA0064.jpg|image/jpeg|900|1600|0|268231||1637518222|1599653076000|0|0|0|0|||||||| +4190|3267|content://media/external/images/media/3267|/storage/emulated/0/DCIM/Camera/IMG_20200909_131618.jpg|image/jpeg|4000|2250|0|7608102||1637502342|1599650180000|1599650180051|0|0|0|||||||| +4191|3847|content://media/external/images/media/3847|/storage/emulated/0/DCIM/Camera/IMG_20200909_131155.jpg|image/jpeg|4160|2340|90|4503778||1637503642|1599649915000|1599649914858|0|0|0|||||||| +4192|4399|content://media/external/images/media/4399|/storage/emulated/0/DCIM/Camera/IMG_20200909_123518.jpg|image/jpeg|4000|2250|90|6109036||1637505004|1599647720000|1599647720215|0|0|0|||||||| +4193|4608|content://media/external/images/media/4608|/storage/emulated/0/DCIM/Camera/IMG_20200909_123458.jpg|image/jpeg|4000|2250|90|5758897||1637505308|1599647700000|1599647700283|0|0|0|||||||| +4194|4978|content://media/external/images/media/4978|/storage/emulated/0/DCIM/Camera/IMG_20200909_102546.jpg|image/jpeg|720|1280|0|92769||1637506097|1599639946000|0|0|0|0|||||||| +4195|2910|content://media/external/images/media/2910|/storage/emulated/0/DCIM/Camera/IMG_20200909_102507.jpg|image/jpeg|1669|2488|0|829742||1637501534|1599639908000|1599639849672|0|0|0|||||||| +4196|3148|content://media/external/images/media/3148|/storage/emulated/0/DCIM/Camera/IMG_20200909_102406.jpg|image/jpeg|4000|2250|90|3489763||1637502130|1599639849000|1599639849672|0|0|0|||||||| +4197|4226|content://media/external/images/media/4226|/storage/emulated/0/DCIM/Camera/IMG_20200909_084500.jpg|image/jpeg|4000|2250|0|5302325||1637504726|1599633903000|1599633903054|0|0|0|||||||| +4198|3942|content://media/external/images/media/3942|/storage/emulated/0/DCIM/Camera/IMG_20200909_084419.jpg|image/jpeg|8000|6000|0|22081262||1637503853|1599633862000|1599633862463|0|0|0|||||||| +4199|2845|content://media/external/images/media/2845|/storage/emulated/0/DCIM/Camera/IMG_20200909_084408.jpg|image/jpeg|8000|6000|0|20858216||1637501431|1599633852000|1599633851876|0|0|0|||||||| +4200|2878|content://media/external/images/media/2878|/storage/emulated/0/DCIM/Camera/IMG_20200909_084325.jpg|image/jpeg|4000|2250|0|5191038||1637501460|1599633805000|1599633805207|0|0|0|||||||| +4201|4154|content://media/external/images/media/4154|/storage/emulated/0/DCIM/Camera/IMG_20200909_081531.jpg|image/jpeg|4000|2250|0|5107094||1637504481|1599632133000|1599632133728|0|0|0|||||||| +4202|2787|content://media/external/images/media/2787|/storage/emulated/0/DCIM/Camera/IMG_20200909_075801.jpg|image/jpeg|4160|2340|0|3117309||1637501282|1599631081000|1599631081850|0|0|0|||||||| +4203|3266|content://media/external/images/media/3266|/storage/emulated/0/DCIM/Camera/IMG_20200909_075755.jpg|image/jpeg|4160|2340|0|3126640||1637502342|1599631075000|1599631074966|0|0|0|||||||| +4204|6618|content://media/external/images/media/6618|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200908-WA0024.jpg|image/jpeg|1024|768|0|229098||1637518221|1599597324000|0|0|0|0|||||||| +4205|7563|content://media/external/images/media/7563|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200908-WA0025.jpg|image/jpeg|1024|442|0|100689||1637518223|1599597324000|0|0|0|0|||||||| +4206|6711|content://media/external/images/media/6711|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200908-WA0023.jpg|image/jpeg|1024|417|0|97227||1637518222|1599597323000|0|0|0|0|||||||| +4207|7063|content://media/external/images/media/7063|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200908-WA0022.jpg|image/jpeg|1024|768|0|208148||1637518222|1599597323000|0|0|0|0|||||||| +4208|4285|content://media/external/images/media/4285|/storage/emulated/0/DCIM/Camera/IMG_20200908_155445.jpg|image/jpeg|4000|2250|0|6431824||1637504807|1599573287000|1599573287080|0|0|0|||||||| +4209|4486|content://media/external/images/media/4486|/storage/emulated/0/DCIM/Camera/IMG_20200908_155430.jpg|image/jpeg|4000|2250|0|6071294||1637505122|1599573271000|1599573271513|0|0|0|||||||| +4210|4061|content://media/external/images/media/4061|/storage/emulated/0/DCIM/Camera/IMG_20200908_155424.jpg|image/jpeg|4000|2250|0|6734530||1637504342|1599573265000|1599573265667|0|0|0|||||||| +4211|3494|content://media/external/images/media/3494|/storage/emulated/0/DCIM/Camera/IMG_20200908_134619.jpg|image/jpeg|4160|2340|90|5768616||1637502870|1599565579000|1599565579588|0|0|0|||||||| +4212|3874|content://media/external/images/media/3874|/storage/emulated/0/DCIM/Camera/IMG_20200908_134334.jpg|image/jpeg|4160|2340|0|5297559||1637503729|1599565414000|1599565414083|0|0|0|||||||| +4213|3048|content://media/external/images/media/3048|/storage/emulated/0/DCIM/Camera/IMG_20200908_133547.jpg|image/jpeg|4000|2250|90|6442501||1637501858|1599564949000|1599564949391|0|0|0|||||||| +4214|4820|content://media/external/images/media/4820|/storage/emulated/0/DCIM/Camera/IMG_20200908_132823.jpg|image/jpeg|4160|2340|0|5902199||1637505730|1599564503000|1599564503204|0|0|0|||||||| +4215|3378|content://media/external/images/media/3378|/storage/emulated/0/DCIM/Camera/IMG_20200908_110617.jpg|image/jpeg|4000|2250|0|4586170||1637502523|1599555978000|1599555978499|0|0|0|||||||| +4216|3605|content://media/external/images/media/3605|/storage/emulated/0/DCIM/Camera/IMG_20200908_110615.jpg|image/jpeg|4000|2250|0|4782505||1637503238|1599555977000|1599555977114|0|0|0|||||||| +4217|4757|content://media/external/images/media/4757|/storage/emulated/0/DCIM/Camera/IMG_20200908_110610.jpg|image/jpeg|4000|2250|90|4495179||1637505639|1599555972000|1599555971985|0|0|0|||||||| +4218|2907|content://media/external/images/media/2907|/storage/emulated/0/DCIM/Camera/IMG_20200908_110601.jpg|image/jpeg|4000|2250|90|4537891||1637501534|1599555962000|1599555962849|0|0|0|||||||| +4219|3985|content://media/external/images/media/3985|/storage/emulated/0/DCIM/Camera/IMG_20200908_110602.jpg|image/jpeg|4000|2250|90|5343027||1637504059|1599555962000|1599555962780|0|0|0|||||||| +4220|4733|content://media/external/images/media/4733|/storage/emulated/0/DCIM/Camera/IMG_20200908_110405.jpg|image/jpeg|4000|2250|0|4321721||1637505574|1599555847000|1599555847215|0|0|0|||||||| +4221|2786|content://media/external/images/media/2786|/storage/emulated/0/DCIM/Camera/IMG_20200908_110346.jpg|image/jpeg|4000|2250|0|4375228||1637501282|1599555828000|1599555828785|0|0|0|||||||| +4222|2877|content://media/external/images/media/2877|/storage/emulated/0/DCIM/Camera/IMG_20200908_105721.jpg|image/jpeg|4000|2250|90|4169937||1637501460|1599555443000|1599555443675|0|0|0|||||||| +4223|3873|content://media/external/images/media/3873|/storage/emulated/0/DCIM/Camera/IMG_20200908_105711.jpg|image/jpeg|4000|2250|90|5306332||1637503729|1599555432000|1599555432816|0|0|0|||||||| +4224|3324|content://media/external/images/media/3324|/storage/emulated/0/DCIM/Camera/IMG_20200908_105626.jpg|image/jpeg|4000|2250|90|5156675||1637502438|1599555388000|1599555388519|0|0|0|||||||| +4225|2906|content://media/external/images/media/2906|/storage/emulated/0/DCIM/Camera/IMG_20200908_103130.jpg|image/jpeg|4000|2250|90|4966981||1637501534|1599553891000|1599553891200|0|0|0|||||||| +4226|3091|content://media/external/images/media/3091|/storage/emulated/0/DCIM/Camera/IMG_20200908_103115.jpg|image/jpeg|4000|2250|90|6651067||1637501971|1599553877000|1599553876863|0|0|0|||||||| +4227|3728|content://media/external/images/media/3728|/storage/emulated/0/DCIM/Camera/IMG_20200908_020024.jpg|image/jpeg|4000|2250|0|3211017||1637503477|1599523226000|1599523226576|0|0|0|||||||| +4228|4153|content://media/external/images/media/4153|/storage/emulated/0/DCIM/Camera/IMG_20200908_020014.jpg|image/jpeg|4000|2250|0|4840313||1637504481|1599523216000|1599523216216|0|0|0|||||||| +4229|3400|content://media/external/images/media/3400|/storage/emulated/0/DCIM/Camera/IMG_20200908_011408_BURST1.jpg|image/jpeg|4000|2250|0|1435555||1637502598|1599520447000|1599520447531|0|0|0|||||||| +4230|3789|content://media/external/images/media/3789|/storage/emulated/0/DCIM/Camera/IMG_20200908_011404.jpg|image/jpeg|4000|2250|0|4040170||1637503558|1599520446000|1599520446300|0|0|0|||||||| +4231|4060|content://media/external/images/media/4060|/storage/emulated/0/DCIM/Camera/IMG_20200908_000808.jpg|image/jpeg|4000|2250|90|4438528||1637504342|1599516489000|1599516489777|0|0|0|||||||| +4232|4059|content://media/external/images/media/4059|/storage/emulated/0/DCIM/Camera/IMG_20200908_000745.jpg|image/jpeg|4000|2250|90|4899830||1637504342|1599516467000|1599516467028|0|0|0|||||||| +4233|2785|content://media/external/images/media/2785|/storage/emulated/0/DCIM/Camera/IMG_20200908_000643.jpg|image/jpeg|4160|2340|0|3636701||1637501282|1599516403000|1599516403570|0|0|0|||||||| +4234|2784|content://media/external/images/media/2784|/storage/emulated/0/DCIM/Camera/IMG_20200908_000639.jpg|image/jpeg|4160|2340|0|3134431||1637501282|1599516399000|1599516399635|0|0|0|||||||| +4235|3534|content://media/external/images/media/3534|/storage/emulated/0/DCIM/Camera/IMG_20200908_000608.jpg|image/jpeg|4000|2250|90|4206196||1637503010|1599516369000|1599516369837|0|0|0|||||||| +4236|2925|content://media/external/images/media/2925|/storage/emulated/0/DCIM/Camera/IMG_20200907_231233.jpg|image/jpeg|4000|2250|90|5365935||1637501599|1599513155000|1599513155068|0|0|0|||||||| +4237|3533|content://media/external/images/media/3533|/storage/emulated/0/DCIM/Camera/IMG_20200907_222616.jpg|image/jpeg|4000|2250|0|5256984||1637503010|1599510377000|1599510377242|0|0|0|||||||| +4238|4798|content://media/external/images/media/4798|/storage/emulated/0/DCIM/Camera/IMG_20200907_222611.jpg|image/jpeg|4000|2250|0|4775600||1637505663|1599510372000|1599510372576|0|0|0|||||||| +4239|4507|content://media/external/images/media/4507|/storage/emulated/0/DCIM/Camera/IMG_20200907_222606.jpg|image/jpeg|4000|2250|0|4110885||1637505160|1599510367000|1599510367566|0|0|0|||||||| +4240|4310|content://media/external/images/media/4310|/storage/emulated/0/DCIM/Camera/IMG_20200907_222557.jpg|image/jpeg|4160|2340|0|4172303||1637504817|1599510357000|1599510357362|0|0|0|||||||| +4241|3825|content://media/external/images/media/3825|/storage/emulated/0/DCIM/Camera/IMG_20200907_155711.jpg|image/jpeg|4000|2250|90|7509543||1637503629|1599487036000|1599487036132|0|0|0|||||||| +4242|3788|content://media/external/images/media/3788|/storage/emulated/0/DCIM/Camera/IMG_20200907_155557.jpg|image/jpeg|4000|2250|90|7484674||1637503558|1599486962000|1599486962826|0|0|0|||||||| +4243|2783|content://media/external/images/media/2783|/storage/emulated/0/DCIM/Camera/IMG_20200907_154728.jpg|image/jpeg|4160|2340|0|3969603||1637501282|1599486448000|1599486448877|0|0|0|||||||| +4244|3513|content://media/external/images/media/3513|/storage/emulated/0/DCIM/Camera/IMG_20200907_154700.jpg|image/jpeg|4160|2340|0|6298956||1637502969|1599486420000|1599486420668|0|0|0|||||||| +4245|4526|content://media/external/images/media/4526|/storage/emulated/0/DCIM/Camera/IMG_20200907_154645.jpg|image/jpeg|4000|2250|0|6794667||1637505165|1599486407000|1599486407207|0|0|0|||||||| +4246|3287|content://media/external/images/media/3287|/storage/emulated/0/DCIM/Camera/IMG_20200907_105656.jpg|image/jpeg|4160|2340|0|3614414||1637502355|1599469016000|1599469016354|0|0|0|||||||| +4247|3581|content://media/external/images/media/3581|/storage/emulated/0/DCIM/Camera/IMG_20200907_105616.jpg|image/jpeg|4000|2250|0|4232453||1637503154|1599468978000|1599468977999|0|0|0|||||||| +4248|3147|content://media/external/images/media/3147|/storage/emulated/0/DCIM/Camera/IMG_20200907_105614.jpg|image/jpeg|4000|2250|0|4350740||1637502130|1599468975000|1599468975880|0|0|0|||||||| +4249|3323|content://media/external/images/media/3323|/storage/emulated/0/DCIM/Camera/IMG_20200907_104940.jpg|image/jpeg|4000|2250|0|5295169||1637502438|1599468582000|1599468582421|0|0|0|||||||| +4250|4355|content://media/external/images/media/4355|/storage/emulated/0/DCIM/Camera/IMG_20200907_011245.jpg|image/jpeg|4000|2250|0|2607901||1637504970|1599433967000|1599433967613|0|0|0|||||||| +4251|7062|content://media/external/images/media/7062|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0050.jpg|image/jpeg|1024|769|0|86371||1637518222|1599428484000|0|0|0|0|||||||| +4252|6943|content://media/external/images/media/6943|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0049.jpg|image/jpeg|1024|769|0|81103||1637518222|1599428483000|0|0|0|0|||||||| +4253|7061|content://media/external/images/media/7061|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0048.jpg|image/jpeg|1024|769|0|94510||1637518222|1599428483000|0|0|0|0|||||||| +4254|6617|content://media/external/images/media/6617|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0045.jpg|image/jpeg|768|1024|0|84333||1637518221|1599425378000|0|0|0|0|||||||| +4255|6940|content://media/external/images/media/6940|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0044.jpg|image/jpeg|1024|768|0|101710||1637518222|1599416481000|0|0|0|0|||||||| +4256|6506|content://media/external/images/media/6506|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0042.jpg|image/jpeg|1024|768|0|106356||1637518221|1599416309000|0|0|0|0|||||||| +4257|6270|content://media/external/images/media/6270|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0039.jpg|image/jpeg|1200|1600|0|178152||1637518221|1599411087000|0|0|0|0|||||||| +4258|6710|content://media/external/images/media/6710|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0038.jpg|image/jpeg|1024|768|0|152976||1637518222|1599409744000|0|0|0|0|||||||| +4259|6394|content://media/external/images/media/6394|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0037.jpg|image/jpeg|1024|768|0|160799||1637518221|1599409743000|0|0|0|0|||||||| +4260|6616|content://media/external/images/media/6616|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0035.jpg|image/jpeg|1024|768|0|160229||1637518221|1599409743000|0|0|0|0|||||||| +4261|6941|content://media/external/images/media/6941|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0036.jpg|image/jpeg|1024|768|0|157048||1637518222|1599409743000|0|0|0|0|||||||| +4262|6395|content://media/external/images/media/6395|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0034.jpg|image/jpeg|1024|768|0|163064||1637518221|1599409742000|0|0|0|0|||||||| +4263|6939|content://media/external/images/media/6939|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0032.jpg|image/jpeg|1024|768|0|161796||1637518222|1599409741000|0|0|0|0|||||||| +4264|6709|content://media/external/images/media/6709|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0030.jpg|image/jpeg|768|1024|0|115219||1637518222|1599409587000|0|0|0|0|||||||| +4265|6816|content://media/external/images/media/6816|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0022.jpg|image/jpeg|1600|1200|0|170373||1637518222|1599409489000|0|0|0|0|||||||| +4266|4913|content://media/external/images/media/4913|/storage/emulated/0/DCIM/Camera/IMG_20200906_182317.jpg|image/jpeg|4000|2250|0|3916237||1637505944|1599409401000|1599409401044|0|0|0|||||||| +4267|3787|content://media/external/images/media/3787|/storage/emulated/0/DCIM/Camera/IMG_20200906_182316.jpg|image/jpeg|4000|2250|0|3970710||1637503558|1599409400000|1599409399960|0|0|0|||||||| +4268|3810|content://media/external/images/media/3810|/storage/emulated/0/DCIM/Camera/IMG_20200906_182314.jpg|image/jpeg|4000|2250|0|3972899||1637503601|1599409398000|1599409398830|0|0|0|||||||| +4269|6393|content://media/external/images/media/6393|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0029.jpg|image/jpeg|1600|1200|0|228175||1637518221|1599408726000|0|0|0|0|||||||| +4270|6504|content://media/external/images/media/6504|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0028.jpg|image/jpeg|1600|1200|0|182772||1637518221|1599408699000|0|0|0|0|||||||| +4271|7060|content://media/external/images/media/7060|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0027.jpg|image/jpeg|1600|1200|0|187863||1637518222|1599408699000|0|0|0|0|||||||| +4272|6937|content://media/external/images/media/6937|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0026.jpg|image/jpeg|1600|1200|0|167117||1637518222|1599408698000|0|0|0|0|||||||| +4273|7058|content://media/external/images/media/7058|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0025.jpg|image/jpeg|1600|1200|0|164716||1637518222|1599408698000|0|0|0|0|||||||| +4274|6938|content://media/external/images/media/6938|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0024.jpg|image/jpeg|1600|1200|0|165280||1637518222|1599408697000|0|0|0|0|||||||| +4275|7059|content://media/external/images/media/7059|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0023.jpg|image/jpeg|1600|1200|0|187924||1637518222|1599408697000|0|0|0|0|||||||| +4276|7057|content://media/external/images/media/7057|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0021.jpg|image/jpeg|1600|1200|0|186236||1637518222|1599408695000|0|0|0|0|||||||| +4277|6707|content://media/external/images/media/6707|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0019.jpg|image/jpeg|768|1024|0|143713||1637518222|1599407150000|0|0|0|0|||||||| +4278|7056|content://media/external/images/media/7056|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0018.jpg|image/jpeg|768|1024|0|144251||1637518222|1599407040000|0|0|0|0|||||||| +4279|6815|content://media/external/images/media/6815|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200906-WA0012.jpg|image/jpeg|1200|1600|0|184702||1637518222|1599390853000|0|0|0|0|||||||| +4280|4455|content://media/external/images/media/4455|/storage/emulated/0/DCIM/Camera/IMG_20200906_081546.jpg|image/jpeg|4000|2250|90|4953180||1637505068|1599372949000|1599372949170|0|0|0|||||||| +4281|4467|content://media/external/images/media/4467|/storage/emulated/0/DCIM/Camera/IMG_20200906_073255.jpg|image/jpeg|4160|2340|0|4900454||1637505091|1599370375000|1599370375338|0|0|0|||||||| +4282|4863|content://media/external/images/media/4863|/storage/emulated/0/DCIM/Camera/IMG_20200906_073242.jpg|image/jpeg|4000|2250|0|5190735||1637505831|1599370364000|1599370364741|0|0|0|||||||| +4283|2782|content://media/external/images/media/2782|/storage/emulated/0/DCIM/Camera/IMG_20200905_210348.jpg|image/jpeg|4160|2340|0|1997738||1637501282|1599332628000|1599332628026|0|0|0|||||||| +4284|3329|content://media/external/images/media/3329|/storage/emulated/0/DCIM/Camera/PANO_20200905_210212.jpg|image/jpeg|7056|3680|0|12681069||1637502439|1599332544000|0|0|0|0|||||||| +4285|4246|content://media/external/images/media/4246|/storage/emulated/0/DCIM/Camera/IMG_20200905_210104.jpg|image/jpeg|4000|2250|90|4098841||1637504734|1599332468000|1599332467925|0|0|0|||||||| +4286|3171|content://media/external/images/media/3171|/storage/emulated/0/DCIM/Camera/IMG_20200905_210051.jpg|image/jpeg|4000|2250|0|3516189||1637502143|1599332452000|1599332452660|0|0|0|||||||| +4287|2905|content://media/external/images/media/2905|/storage/emulated/0/DCIM/Camera/IMG_20200905_210040.jpg|image/jpeg|4000|2250|0|4994075||1637501534|1599332442000|1599332442815|0|0|0|||||||| +4288|3924|content://media/external/images/media/3924|/storage/emulated/0/DCIM/Camera/IMG_20200905_205621.jpg|image/jpeg|4160|2340|90|4020203||1637503834|1599332181000|1599332180957|0|0|0|||||||| +4289|3809|content://media/external/images/media/3809|/storage/emulated/0/DCIM/Camera/IMG_20200905_205512.jpg|image/jpeg|4000|2250|90|2819583||1637503601|1599332116000|1599332116479|0|0|0|||||||| +4290|4999|content://media/external/images/media/4999|/storage/emulated/0/DCIM/Camera/IMG_20200905_205221.jpg|image/jpeg|4160|2340|0|2219264||1637506101|1599331941000|1599331941508|0|0|0|||||||| +4291|4354|content://media/external/images/media/4354|/storage/emulated/0/DCIM/Camera/IMG_20200905_205204.jpg|image/jpeg|4000|2250|0|4021746||1637504970|1599331928000|1599331927845|0|0|0|||||||| +4292|3983|content://media/external/images/media/3983|/storage/emulated/0/DCIM/Camera/IMG_20200905_194723.jpg|image/jpeg|4000|2250|0|4010102||1637504059|1599328045000|1599328045385|0|0|0|||||||| +4293|3604|content://media/external/images/media/3604|/storage/emulated/0/DCIM/Camera/IMG_20200905_193457.jpg|image/jpeg|4000|2250|0|3302285||1637503238|1599327303000|1599327302998|0|0|0|||||||| +4294|3286|content://media/external/images/media/3286|/storage/emulated/0/DCIM/Camera/IMG_20200905_193446.jpg|image/jpeg|4000|2250|0|3283150||1637502355|1599327288000|1599327288849|0|0|0|||||||| +4295|3551|content://media/external/images/media/3551|/storage/emulated/0/DCIM/Camera/IMG_20200905_193437.jpg|image/jpeg|4000|2250|0|4312145||1637503058|1599327279000|1599327279238|0|0|0|||||||| +4296|4414|content://media/external/images/media/4414|/storage/emulated/0/DCIM/Camera/IMG_20200905_192950.jpg|image/jpeg|4000|2250|0|3305820||1637505063|1599326993000|1599326993694|0|0|0|||||||| +4297|4098|content://media/external/images/media/4098|/storage/emulated/0/DCIM/Camera/IMG_20200905_192941.jpg|image/jpeg|4000|2250|0|3473208||1637504400|1599326984000|1599326984406|0|0|0|||||||| +4298|4058|content://media/external/images/media/4058|/storage/emulated/0/DCIM/Camera/IMG_20200905_185405.jpg|image/jpeg|4000|2250|0|5216625||1637504342|1599324846000|1599324507388|0|0|0|||||||| +4299|3981|content://media/external/images/media/3981|/storage/emulated/0/DCIM/Camera/IMG_20200905_185258.jpg|image/jpeg|4000|2250|0|4770126||1637504059|1599324780000|1599324780311|0|0|0|||||||| +4300|2781|content://media/external/images/media/2781|/storage/emulated/0/DCIM/Camera/IMG_20200905_185242.jpg|image/jpeg|4160|2340|0|4245106||1637501282|1599324763000|1599324762801|0|0|0|||||||| +4301|3493|content://media/external/images/media/3493|/storage/emulated/0/DCIM/Camera/IMG_20200905_185205.jpg|image/jpeg|4160|2340|0|4852188||1637502870|1599324725000|1599324725486|0|0|0|||||||| +4302|3846|content://media/external/images/media/3846|/storage/emulated/0/DCIM/Camera/IMG_20200905_185153.jpg|image/jpeg|4160|2340|0|5437440||1637503642|1599324713000|1599324713040|0|0|0|||||||| +4303|4284|content://media/external/images/media/4284|/storage/emulated/0/DCIM/Camera/IMG_20200905_185031_1.jpg|image/jpeg|4000|2250|0|5790782||1637504807|1599324631000|1599324631481|0|0|0|||||||| +4304|2904|content://media/external/images/media/2904|/storage/emulated/0/DCIM/Camera/IMG_20200905_185028.jpg|image/jpeg|4000|2250|0|5922338||1637501534|1599324628000|1599324628217|0|0|0|||||||| +4305|4977|content://media/external/images/media/4977|/storage/emulated/0/DCIM/Camera/IMG_20200905_184639.jpg|image/jpeg|4160|2340|0|5787466||1637506097|1599324399000|1599324398887|0|0|0|||||||| +4306|4398|content://media/external/images/media/4398|/storage/emulated/0/DCIM/Camera/IMG_20200905_172717.jpg|image/jpeg|4000|2250|0|5976043||1637505004|1599319640000|1599319640136|0|0|0|||||||| +4307|3663|content://media/external/images/media/3663|/storage/emulated/0/DCIM/Camera/IMG_20200905_172545.jpg|image/jpeg|4000|2250|0|3181741||1637503358|1599319546000|1599318443620|0|0|0|||||||| +4308|4038|content://media/external/images/media/4038|/storage/emulated/0/DCIM/Camera/IMG_20200905_170727.jpg|image/jpeg|4000|2250|180|4194439||1637504234|1599318448000|1599318448487|0|0|0|||||||| +4309|4000|content://media/external/images/media/4000|/storage/emulated/0/DCIM/Camera/IMG_20200905_170722.jpg|image/jpeg|4000|2250|180|4164677||1637504086|1599318443000|1599318443620|0|0|0|||||||| +4310|3377|content://media/external/images/media/3377|/storage/emulated/0/DCIM/Camera/IMG_20200905_165705.jpg|image/jpeg|4000|2250|0|4554192||1637502523|1599317827000|1599317827104|0|0|0|||||||| +4311|3894|content://media/external/images/media/3894|/storage/emulated/0/DCIM/Camera/IMG_20200905_165244.jpg|image/jpeg|4000|2250|0|4701270||1637503732|1599317565000|1599317565664|0|0|0|||||||| +4312|4976|content://media/external/images/media/4976|/storage/emulated/0/DCIM/Camera/IMG_20200905_164958.jpg|image/jpeg|4000|2250|0|5934266||1637506097|1599317400000|1599317400354|0|0|0|||||||| +4313|2903|content://media/external/images/media/2903|/storage/emulated/0/DCIM/Camera/IMG_20200905_153502.jpg|image/jpeg|4000|2250|0|5808790||1637501534|1599312904000|1599312904457|0|0|0|||||||| +4314|4167|content://media/external/images/media/4167|/storage/emulated/0/DCIM/Camera/IMG_20200905_143051.jpg|image/jpeg|4000|2250|0|4270489||1637504556|1599309054000|1599309054166|0|0|0|||||||| +4315|6789|content://media/external/images/media/6789|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200905-WA0005.jpg|image/jpeg|1024|768|0|105921||1637518222|1599295896000|0|0|0|0|||||||| +4316|6489|content://media/external/images/media/6489|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200905-WA0003.jpg|image/jpeg|1024|768|0|90831||1637518221|1599295895000|0|0|0|0|||||||| +4317|6684|content://media/external/images/media/6684|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200905-WA0004.jpg|image/jpeg|1024|768|0|114883||1637518222|1599295895000|0|0|0|0|||||||| +4318|6246|content://media/external/images/media/6246|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200905-WA0002.jpg|image/jpeg|1024|768|0|95516||1637518221|1599295894000|0|0|0|0|||||||| +4319|6488|content://media/external/images/media/6488|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200905-WA0001.jpg|image/jpeg|1024|768|0|95928||1637518221|1599294346000|0|0|0|0|||||||| +4320|6899|content://media/external/images/media/6899|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200904-WA0014.jpg|image/jpeg|900|1600|0|179664||1637518222|1599240926000|0|0|0|0|||||||| +4321|3704|content://media/external/images/media/3704|/storage/emulated/0/DCIM/Camera/IMG_20200904_175534.jpg|image/jpeg|4000|2250|90|9496234||1637503392|1599234938000|1599234937818|0|0|0|||||||| +4322|2780|content://media/external/images/media/2780|/storage/emulated/0/DCIM/Camera/IMG_20200904_175531.jpg|image/jpeg|4000|2250|90|8704835||1637501282|1599234935000|1599234934810|0|0|0|||||||| +4323|6487|content://media/external/images/media/6487|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200904-WA0010.jpg|image/jpeg|900|1600|0|289876||1637518221|1599234729000|0|0|0|0|||||||| +4324|3892|content://media/external/images/media/3892|/storage/emulated/0/DCIM/Camera/IMG_20200904_173827.jpg|image/jpeg|4160|2340|90|5344862||1637503732|1599233907000|1599233907202|0|0|0|||||||| +4325|3980|content://media/external/images/media/3980|/storage/emulated/0/DCIM/Camera/IMG_20200904_173822.jpg|image/jpeg|4160|2340|0|5856258||1637504059|1599233902000|1599233902096|0|0|0|||||||| +4326|6584|content://media/external/images/media/6584|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200904-WA0002.jpg|image/jpeg|1600|1202|0|217031||1637518221|1599202706000|0|0|0|0|||||||| +4327|2924|content://media/external/images/media/2924|/storage/emulated/0/DCIM/Camera/IMG_20200829_080332.jpg|image/jpeg|4160|2340|0|5499305||1637501599|1598681012000|1598681012425|0|0|0|||||||| +4328|2737|content://media/external/images/media/2737|/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-08-29-07-39-05-019_com.brytonsport.active.jpg|image/jpeg|1080|2340|0|649102||1637500987|1598679545000|0|0|0|0|||||||| +4329|2844|content://media/external/images/media/2844|/storage/emulated/0/DCIM/Camera/IMG_20200827_074750.jpg|image/jpeg|4000|2250|0|4173160||1637501431|1598507271000|1598507271317|0|0|0|||||||| +4330|4137|content://media/external/images/media/4137|/storage/emulated/0/DCIM/Camera/IMG_20200827_074745.jpg|image/jpeg|4000|2250|0|4585412||1637504473|1598507267000|1598507267261|0|0|0|||||||| +4331|4188|content://media/external/images/media/4188|/storage/emulated/0/DCIM/Camera/IMG_20200827_074715.jpg|image/jpeg|4000|2250|0|4617053||1637504558|1598507238000|1598507238137|0|0|0|||||||| +4332|6372|content://media/external/images/media/6372|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200825-WA0017.jpg|image/jpeg|2048|1537|0|449031||1637518221|1598377942000|0|0|0|0|||||||| +4333|6898|content://media/external/images/media/6898|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200825-WA0016.jpg|image/jpeg|1599|1200|0|300175||1637518222|1598373854000|0|0|0|0|||||||| +4334|6683|content://media/external/images/media/6683|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200825-WA0002.jpeg|image/jpeg|2250|4000|0|953537||1637518222|1598352682000|0|0|0|0|||||||| +4335|4204|content://media/external/images/media/4204|/storage/emulated/0/DCIM/Camera/IMG_20200823_161310.jpg|image/jpeg|4000|2250|90|3442818||1637504640|1598191990000|1598191990094|0|0|0|||||||| +4336|3362|content://media/external/images/media/3362|/storage/emulated/0/DCIM/Camera/IMG_20200822_204839.jpg|image/jpeg|4000|2250|0|4411391||1637502451|1598122122000|1598122122489|0|0|0|||||||| +4337|3452|content://media/external/images/media/3452|/storage/emulated/0/DCIM/Camera/IMG_20200822_204836.jpg|image/jpeg|4000|2250|0|4421260||1637502804|1598122119000|1598122119468|0|0|0|||||||| +4338|2946|content://media/external/images/media/2946|/storage/emulated/0/DCIM/Camera/IMG_20200822_204820.jpg|image/jpeg|4160|2340|0|3698621||1637501660|1598122100000|1598122100712|0|0|0|||||||| +4339|3438|content://media/external/images/media/3438|/storage/emulated/0/DCIM/Camera/IMG_20200822_201551.jpg|image/jpeg|4000|2250|0|5098531||1637502783|1598120153000|1598120153341|0|0|0|||||||| +4340|2970|content://media/external/images/media/2970|/storage/emulated/0/DCIM/Camera/IMG_20200822_195511.jpg|image/jpeg|4000|2250|90|4919199||1637501684|1598118913000|1598118913288|0|0|0|||||||| +4341|2806|content://media/external/images/media/2806|/storage/emulated/0/DCIM/Camera/IMG_20200822_195140.jpg|image/jpeg|4000|2250|90|4759137||1637501312|1598118706000|1598118706650|0|0|0|||||||| +4342|3322|content://media/external/images/media/3322|/storage/emulated/0/DCIM/Camera/IMG_20200822_193354.jpg|image/jpeg|4000|2250|0|4828086||1637502438|1598117635000|1598117635440|0|0|0|||||||| +4343|4506|content://media/external/images/media/4506|/storage/emulated/0/DCIM/Camera/IMG_20200822_193345.jpg|image/jpeg|4000|2250|0|5434960||1637505160|1598117627000|1598117627093|0|0|0|||||||| +4344|4997|content://media/external/images/media/4997|/storage/emulated/0/DCIM/Camera/IMG_20200822_193344.jpg|image/jpeg|4000|2250|0|5751683||1637506101|1598117627000|1598117627538|0|0|0|||||||| +4345|7025|content://media/external/images/media/7025|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200817-WA0010.jpg|image/jpeg|1202|1600|0|168129||1637518222|1597691194000|0|0|0|0|||||||| +4346|6897|content://media/external/images/media/6897|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0009.jpg|image/jpeg|900|1600|0|193960||1637518222|1597590074000|0|0|0|0|||||||| +4347|7024|content://media/external/images/media/7024|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0008.jpg|image/jpeg|900|1600|0|170983||1637518222|1597590074000|0|0|0|0|||||||| +4348|6245|content://media/external/images/media/6245|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0004.jpg|image/jpeg|900|1600|0|251909||1637518221|1597590073000|0|0|0|0|||||||| +4349|6585|content://media/external/images/media/6585|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0005.jpg|image/jpeg|900|1600|0|185904||1637518221|1597590073000|0|0|0|0|||||||| +4350|6586|content://media/external/images/media/6586|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0006.jpg|image/jpeg|900|1600|0|171264||1637518221|1597590073000|0|0|0|0|||||||| +4351|6787|content://media/external/images/media/6787|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0003.jpg|image/jpeg|900|1600|0|111601||1637518222|1597590072000|0|0|0|0|||||||| +4352|7023|content://media/external/images/media/7023|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0002.jpg|image/jpeg|1600|900|0|253707||1637518222|1597590072000|0|0|0|0|||||||| +4353|6785|content://media/external/images/media/6785|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200816-WA0001.jpg|image/jpeg|900|1600|0|150340||1637518222|1597590071000|0|0|0|0|||||||| +4354|3872|content://media/external/images/media/3872|/storage/emulated/0/DCIM/Camera/IMG_20200816_123401.jpg|image/jpeg|4160|2340|0|7444894||1637503729|1597574041000|1597574041121|0|0|0|||||||| +4355|4525|content://media/external/images/media/4525|/storage/emulated/0/DCIM/Camera/IMG_20200816_121743.jpg|image/jpeg|4000|2250|90|4347226||1637505165|1597573066000|1597573066921|0|0|0|||||||| +4356|4926|content://media/external/images/media/4926|/storage/emulated/0/DCIM/Camera/IMG_20200816_120927.jpg|image/jpeg|4000|2250|90|5057869||1637506010|1597572569000|1597572569133|0|0|0|||||||| +4357|4437|content://media/external/images/media/4437|/storage/emulated/0/DCIM/Camera/IMG_20200816_120808.jpg|image/jpeg|4000|2250|90|5105977||1637505068|1597572489000|1597572489307|0|0|0|||||||| +4358|3321|content://media/external/images/media/3321|/storage/emulated/0/DCIM/Camera/IMG_20200816_120805.jpg|image/jpeg|4000|2250|90|5547202||1637502438|1597572486000|1597572486815|0|0|0|||||||| +4359|3146|content://media/external/images/media/3146|/storage/emulated/0/DCIM/Camera/IMG_20200816_120542.jpg|image/jpeg|3264|1836|90|2930682||1637502130|1597572342000|1597572342172|0|0|0|||||||| +4360|3746|content://media/external/images/media/3746|/storage/emulated/0/DCIM/Camera/IMG_20200816_120518_1.jpg|image/jpeg|4000|2250|90|5740234||1637503488|1597572318000|1597572318797|0|0|0|||||||| +4361|3891|content://media/external/images/media/3891|/storage/emulated/0/DCIM/Camera/IMG_20200816_120326.jpg|image/jpeg|4000|2250|90|2307352||1637503732|1597572206000|1597572206122|0|0|0|||||||| +4362|3265|content://media/external/images/media/3265|/storage/emulated/0/DCIM/Camera/IMG_20200816_120053.jpg|image/jpeg|1280|720|0|217059||1637502342|1597572053000|0|0|0|0|||||||| +4363|3437|content://media/external/images/media/3437|/storage/emulated/0/DCIM/Camera/IMG_20200816_115930.jpg|image/jpeg|720|1280|270|100990||1637502783|1597571971000|0|0|0|0|||||||| +4364|3244|content://media/external/images/media/3244|/storage/emulated/0/DCIM/Camera/IMG_20200816_114104.jpg|image/jpeg|4000|2250|90|4316935||1637502259|1597570867000|1597570867213|0|0|0|||||||| +4365|3890|content://media/external/images/media/3890|/storage/emulated/0/DCIM/Camera/IMG_20200816_114057.jpg|image/jpeg|4000|2250|90|4073357||1637503732|1597570860000|1597570860386|0|0|0|||||||| +4366|3661|content://media/external/images/media/3661|/storage/emulated/0/DCIM/Camera/IMG_20200816_114040.jpg|image/jpeg|4000|2250|90|4829987||1637503358|1597570842000|1597570842433|0|0|0|||||||| +4367|6367|content://media/external/images/media/6367|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0119.jpg|image/jpeg|900|1600|0|166207||1637518221|1597521960000|0|0|0|0|||||||| +4368|6480|content://media/external/images/media/6480|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0118.jpg|image/jpeg|1600|900|0|169029||1637518221|1597521959000|0|0|0|0|||||||| +4369|4116|content://media/external/images/media/4116|/storage/emulated/0/DCIM/Camera/IMG_20200815_205840.jpg|image/jpeg|4160|2340|90|2736470||1637504451|1597517921000|1597517920838|0|0|0|||||||| +4370|3512|content://media/external/images/media/3512|/storage/emulated/0/DCIM/Camera/IMG_20200815_205837.jpg|image/jpeg|4160|2340|90|2936236||1637502969|1597517917000|1597517917594|0|0|0|||||||| +4371|2987|content://media/external/images/media/2987|/storage/emulated/0/DCIM/Camera/IMG_20200815_205744.jpg|image/jpeg|4160|2340|90|3824966||1637501771|1597517864000|1597517863992|0|0|0|||||||| +4372|3765|content://media/external/images/media/3765|/storage/emulated/0/DCIM/Camera/IMG_20200815_205741.jpg|image/jpeg|4160|2340|90|3819901||1637503508|1597517861000|1597517861244|0|0|0|||||||| +4373|2660|content://media/external/images/media/2660|/storage/emulated/0/DCIM/YouCam Perfect/2020-08-15-18-56-42-082.jpg|image/jpeg|1600|900|0|766732||1637500871|1597510602000|0|0|0|0|||||||| +4374|2659|content://media/external/images/media/2659|/storage/emulated/0/DCIM/YouCam Perfect/2020-08-15-18-55-59-343.jpg|image/jpeg|1600|900|0|721992||1637500871|1597510559000|0|0|0|0|||||||| +4375|2658|content://media/external/images/media/2658|/storage/emulated/0/DCIM/YouCam Perfect/2020-08-15-18-52-00-112.jpg|image/jpeg|1600|900|0|686277||1637500871|1597510320000|0|0|0|0|||||||| +4376|2657|content://media/external/images/media/2657|/storage/emulated/0/DCIM/YouCam Perfect/2020-08-15-18-49-44-982.jpg|image/jpeg|1600|1600|0|1070118||1637500871|1597510185000|0|0|0|0|||||||| +4377|2656|content://media/external/images/media/2656|/storage/emulated/0/DCIM/YouCam Perfect/2020-08-15-18-49-38-173.jpg|image/jpeg|1600|1600|0|1070118||1637500871|1597510178000|0|0|0|0|||||||| +4378|6784|content://media/external/images/media/6784|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0115.jpg|image/jpeg|1600|900|0|220660||1637518222|1597509662000|0|0|0|0|||||||| +4379|6682|content://media/external/images/media/6682|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0114.jpg|image/jpeg|900|1600|0|273294||1637518222|1597504529000|0|0|0|0|||||||| +4380|4019|content://media/external/images/media/4019|/storage/emulated/0/DCIM/Camera/IMG_20200815_171349.jpg|image/jpeg|4000|2250|90|4521299||1637504201|1597504430000|1597504429993|0|0|0|||||||| +4381|6366|content://media/external/images/media/6366|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0113.jpg|image/jpeg|1600|900|0|221651||1637518221|1597504102000|0|0|0|0|||||||| +4382|6781|content://media/external/images/media/6781|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0112.jpg|image/jpeg|1600|900|0|222759||1637518222|1597504099000|0|0|0|0|||||||| +4383|7022|content://media/external/images/media/7022|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0111.jpg|image/jpeg|900|1600|0|276773||1637518222|1597504097000|0|0|0|0|||||||| +4384|6477|content://media/external/images/media/6477|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0110.jpg|image/jpeg|1600|900|0|269725||1637518221|1597504096000|0|0|0|0|||||||| +4385|6894|content://media/external/images/media/6894|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0109.jpg|image/jpeg|1600|900|0|191509||1637518222|1597504094000|0|0|0|0|||||||| +4386|6365|content://media/external/images/media/6365|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0108.jpg|image/jpeg|1600|900|0|190755||1637518221|1597504091000|0|0|0|0|||||||| +4387|6778|content://media/external/images/media/6778|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0107.jpg|image/jpeg|1600|900|0|215980||1637518222|1597504087000|0|0|0|0|||||||| +4388|6475|content://media/external/images/media/6475|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0106.jpg|image/jpeg|1600|900|0|307645||1637518221|1597503944000|0|0|0|0|||||||| +4389|7019|content://media/external/images/media/7019|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0105.jpg|image/jpeg|1600|900|0|252803||1637518222|1597503941000|0|0|0|0|||||||| +4390|3145|content://media/external/images/media/3145|/storage/emulated/0/DCIM/Camera/IMG_20200815_144701.jpg|image/jpeg|4000|2250|90|8517195||1637502130|1597495624000|1597495624017|0|0|0|||||||| +4391|7020|content://media/external/images/media/7020|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0103.jpg|image/jpeg|1600|900|0|254554||1637518222|1597493855000|0|0|0|0|||||||| +4392|6473|content://media/external/images/media/6473|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0102.jpg|image/jpeg|900|1600|0|390976||1637518221|1597493120000|0|0|0|0|||||||| +4393|6892|content://media/external/images/media/6892|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0101.jpg|image/jpeg|1600|900|0|161299||1637518222|1597492921000|0|0|0|0|||||||| +4394|7017|content://media/external/images/media/7017|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0100.jpg|image/jpeg|900|1600|0|153012||1637518222|1597492920000|0|0|0|0|||||||| +4395|6582|content://media/external/images/media/6582|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0098.jpg|image/jpeg|900|1600|0|229056||1637518221|1597492919000|0|0|0|0|||||||| +4396|6890|content://media/external/images/media/6890|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0099.jpg|image/jpeg|1600|900|0|103131||1637518222|1597492919000|0|0|0|0|||||||| +4397|6680|content://media/external/images/media/6680|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0095.jpg|image/jpeg|1600|900|0|225433||1637518222|1597492856000|0|0|0|0|||||||| +4398|6240|content://media/external/images/media/6240|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0094.jpg|image/jpeg|1600|900|0|222523||1637518221|1597492855000|0|0|0|0|||||||| +4399|6471|content://media/external/images/media/6471|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0093.jpg|image/jpeg|1600|900|0|260542||1637518221|1597492855000|0|0|0|0|||||||| +4400|6362|content://media/external/images/media/6362|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0092.jpg|image/jpeg|1600|900|0|260814||1637518221|1597492853000|0|0|0|0|||||||| +4401|6678|content://media/external/images/media/6678|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0091.jpg|image/jpeg|1600|900|0|259726||1637518222|1597492852000|0|0|0|0|||||||| +4402|6889|content://media/external/images/media/6889|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0055.jpg|image/jpeg|900|1600|0|208082||1637518222|1597490990000|0|0|0|0|||||||| +4403|6360|content://media/external/images/media/6360|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0054.jpg|image/jpeg|1600|900|0|205745||1637518221|1597490968000|0|0|0|0|||||||| +4404|6677|content://media/external/images/media/6677|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0053.jpg|image/jpeg|1600|900|0|225863||1637518222|1597490966000|0|0|0|0|||||||| +4405|7015|content://media/external/images/media/7015|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0048.jpg|image/jpeg|1600|900|0|146921||1637518222|1597490957000|0|0|0|0|||||||| +4406|6579|content://media/external/images/media/6579|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0047.jpg|image/jpeg|1600|900|0|107444||1637518221|1597490954000|0|0|0|0|||||||| +4407|4562|content://media/external/images/media/4562|/storage/emulated/0/DCIM/Camera/IMG_20200815_122223.jpg|image/jpeg|4160|2340|0|6562250||1637505216|1597486943000|1597486942957|0|0|0|||||||| +4408|4166|content://media/external/images/media/4166|/storage/emulated/0/DCIM/Camera/IMG_20200815_121306.jpg|image/jpeg|4000|2250|90|6785975||1637504556|1597486387000|1597486387418|0|0|0|||||||| +4409|4777|content://media/external/images/media/4777|/storage/emulated/0/DCIM/Camera/IMG_20200815_121300.jpg|image/jpeg|4160|2340|0|6185588||1637505656|1597486380000|1597486380608|0|0|0|||||||| +4410|3070|content://media/external/images/media/3070|/storage/emulated/0/DCIM/Camera/IMG_20200815_121255.jpg|image/jpeg|4160|2340|90|6067401||1637501905|1597486375000|1597486375604|0|0|0|||||||| +4411|6237|content://media/external/images/media/6237|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0026.jpg|image/jpeg|1600|900|0|187364||1637518221|1597485247000|0|0|0|0|||||||| +4412|7014|content://media/external/images/media/7014|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0025.jpg|image/jpeg|1600|900|0|177046||1637518222|1597485243000|0|0|0|0|||||||| +4413|7012|content://media/external/images/media/7012|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0024.jpg|image/jpeg|1600|900|0|152430||1637518222|1597485239000|0|0|0|0|||||||| +4414|6357|content://media/external/images/media/6357|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0023.jpg|image/jpeg|900|1600|0|154608||1637518221|1597485238000|0|0|0|0|||||||| +4415|6578|content://media/external/images/media/6578|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0022.jpg|image/jpeg|1600|900|0|149777||1637518221|1597485236000|0|0|0|0|||||||| +4416|6467|content://media/external/images/media/6467|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0021.jpg|image/jpeg|900|1600|0|142840||1637518221|1597485235000|0|0|0|0|||||||| +4417|6468|content://media/external/images/media/6468|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0020.jpg|image/jpeg|900|1600|0|157108||1637518221|1597485234000|0|0|0|0|||||||| +4418|6676|content://media/external/images/media/6676|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0019.jpg|image/jpeg|1600|900|0|169403||1637518222|1597485228000|0|0|0|0|||||||| +4419|6577|content://media/external/images/media/6577|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0018.jpg|image/jpeg|1600|900|0|231498||1637518221|1597485227000|0|0|0|0|||||||| +4420|6771|content://media/external/images/media/6771|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200815-WA0017.jpg|image/jpeg|900|1600|0|203802||1637518222|1597485180000|0|0|0|0|||||||| +4421|3580|content://media/external/images/media/3580|/storage/emulated/0/DCIM/Camera/IMG_20200815_114238.jpg|image/jpeg|4000|2250|90|5070895||1637503154|1597484559000|1597484559586|0|0|0|||||||| +4422|4283|content://media/external/images/media/4283|/storage/emulated/0/DCIM/Camera/IMG_20200815_114230.jpg|image/jpeg|4000|2250|90|4414706||1637504807|1597484552000|1597484552825|0|0|0|||||||| +4423|4819|content://media/external/images/media/4819|/storage/emulated/0/DCIM/Camera/IMG_20200815_110358.jpg|image/jpeg|4000|2250|0|6510377||1637505730|1597482240000|1597482240257|0|0|0|||||||| +4424|4974|content://media/external/images/media/4974|/storage/emulated/0/DCIM/Camera/IMG_20200815_110135.jpg|image/jpeg|4000|2250|0|4777714||1637506097|1597482097000|1597482096992|0|0|0|||||||| +4425|6353|content://media/external/images/media/6353|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200812-WA0014.jpg|image/jpeg|825|1024|0|98052||1637518221|1597261704000|0|0|0|0|||||||| +4426|6355|content://media/external/images/media/6355|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200812-WA0013.jpg|image/jpeg|824|1024|0|86132||1637518221|1597244603000|0|0|0|0|||||||| +4427|3641|content://media/external/images/media/3641|/storage/emulated/0/DCIM/Camera/IMG_20200809_003753.jpg|image/jpeg|4000|2250|0|3027580||1637503301|1596926278000|1596926277983|0|0|0|||||||| +4428|3871|content://media/external/images/media/3871|/storage/emulated/0/DCIM/Camera/IMG_20200809_003743.jpg|image/jpeg|8000|6000|0|14278054||1637503729|1596926267000|1596926266881|0|0|0|||||||| +4429|2805|content://media/external/images/media/2805|/storage/emulated/0/DCIM/Camera/IMG_20200808_175954.jpg|image/jpeg|4000|2250|90|3952817||1637501312|1596902396000|1596902396848|0|0|0|||||||| +4430|2876|content://media/external/images/media/2876|/storage/emulated/0/DCIM/Camera/IMG_20200807_185621.jpg|image/jpeg|4000|2250|90|4591170||1637501460|1596819383000|1596819383218|0|0|0|||||||| +4431|4057|content://media/external/images/media/4057|/storage/emulated/0/DCIM/Camera/IMG_20200807_185615.jpg|image/jpeg|4000|2250|90|4880256||1637504342|1596819377000|1596819377017|0|0|0|||||||| +4432|3436|content://media/external/images/media/3436|/storage/emulated/0/DCIM/Camera/IMG_20200807_185603.jpg|image/jpeg|4000|2250|90|4734127||1637502783|1596819365000|1596819365703|0|0|0|||||||| +4433|4037|content://media/external/images/media/4037|/storage/emulated/0/DCIM/Camera/IMG_20200807_185526.jpg|image/jpeg|4000|2250|90|4535065||1637504234|1596819328000|1596819328624|0|0|0|||||||| +4434|2704|content://media/external/images/media/2704|/storage/emulated/0/DCIM/Screenshots/IMG_20200806_214057.jpg|image/jpeg|1073|1347|0|110505||1637500987|1596742857000|0|0|0|0|||||||| +4435|2703|content://media/external/images/media/2703|/storage/emulated/0/DCIM/Screenshots/IMG_20200806_213539.jpg|image/jpeg|1064|1355|0|242773||1637500987|1596742539000|0|0|0|0|||||||| +4436|4596|content://media/external/images/media/4596|/storage/emulated/0/DCIM/Camera/PANO_20200806_191039.jpg|image/jpeg|7312|3680|0|16420871||1637505278|1596733848000|0|0|0|0|||||||| +4437|3683|content://media/external/images/media/3683|/storage/emulated/0/DCIM/Camera/IMG_20200806_191033.jpg|image/jpeg|4160|2340|0|5347870||1637503389|1596733833000|1596733833082|0|0|0|||||||| +4438|6885|content://media/external/images/media/6885|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200802-WA0005.jpg|image/jpeg|900|1600|0|272345||1637518222|1596371079000|0|0|0|0|||||||| +4439|7011|content://media/external/images/media/7011|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200802-WA0004.jpg|image/jpeg|900|1600|0|252049||1637518222|1596371078000|0|0|0|0|||||||| +4440|4309|content://media/external/images/media/4309|/storage/emulated/0/DCIM/Camera/IMG_20200730_124821.jpg|image/jpeg|4000|2250|0|4036000||1637504817|1596106103000|1596106103702|0|0|0|||||||| +4441|6354|content://media/external/images/media/6354|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200729-WA0004.jpg|image/jpeg|1200|1600|0|338021||1637518221|1596049471000|0|0|0|0|||||||| +4442|6233|content://media/external/images/media/6233|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200728-WA0008.jpg|image/jpeg|768|1024|0|115646||1637518221|1595949603000|0|0|0|0|||||||| +4443|6573|content://media/external/images/media/6573|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200726-WA0006.jpeg|image/jpeg|4000|2250|0|767868||1637518221|1595790380000|0|0|0|0|||||||| +4444|4845|content://media/external/images/media/4845|/storage/emulated/0/DCIM/Camera/IMG_20200723_191837.jpg|image/jpeg|4000|2250|90|5421296||1637505753|1595524721000|1595524721049|0|0|0|||||||| +4445|4322|content://media/external/images/media/4322|/storage/emulated/0/DCIM/Camera/IMG_20200723_191810.jpg|image/jpeg|4160|2340|90|6108639||1637504895|1595524690000|1595524690559|0|0|0|||||||| +4446|3305|content://media/external/images/media/3305|/storage/emulated/0/DCIM/Camera/IMG_20200723_190834.jpg|image/jpeg|8000|4247|0|14111847||1637502430|1595524116000|1595524093948|0|0|0|||||||| +4447|4396|content://media/external/images/media/4396|/storage/emulated/0/DCIM/Camera/IMG_20200723_190810.jpg|image/jpeg|8000|6000|0|25594094||1637505004|1595524094000|1595524093948|0|0|0|||||||| +4448|3304|content://media/external/images/media/3304|/storage/emulated/0/DCIM/Camera/IMG_20200723_190804.jpg|image/jpeg|4160|2340|0|5488314||1637502430|1595524084000|1595524084728|0|0|0|||||||| +4449|3786|content://media/external/images/media/3786|/storage/emulated/0/DCIM/Camera/IMG_20200723_190624.jpg|image/jpeg|5155|1788|0|3738793||1637503558|1595523985000|0|0|0|0|||||||| +4450|4755|content://media/external/images/media/4755|/storage/emulated/0/DCIM/Camera/IMG_20200723_190550.jpg|image/jpeg|7728|3648|0|13931194||1637505639|1595523952000|0|0|0|0|||||||| +4451|3633|content://media/external/images/media/3633|/storage/emulated/0/DCIM/Camera/PANO_20200723_190501.jpg|image/jpeg|7728|3648|0|16397410||1637503272|1595523908000|0|0|0|0|||||||| +4452|3121|content://media/external/images/media/3121|/storage/emulated/0/DCIM/Camera/PANO_20200723_190242.jpg|image/jpeg|6768|3552|0|17873641||1637502054|1595523767000|0|0|0|0|||||||| +4453|2882|content://media/external/images/media/2882|/storage/emulated/0/DCIM/Camera/PANO_20200723_185540.jpg|image/jpeg|8048|3712|0|25506060||1637501461|1595523346000|0|0|0|0|||||||| +4454|4145|content://media/external/images/media/4145|/storage/emulated/0/DCIM/Camera/PANO_20200723_185532.jpg|image/jpeg|7088|3680|0|18466687||1637504473|1595523336000|0|0|0|0|||||||| +4455|4127|content://media/external/images/media/4127|/storage/emulated/0/DCIM/Camera/PANO_20200723_185507.jpg|image/jpeg|8336|3712|0|22061739||1637504451|1595523316000|0|0|0|0|||||||| +4456|4949|content://media/external/images/media/4949|/storage/emulated/0/DCIM/Camera/IMG_20200723_185457.jpg|image/jpeg|4000|2250|0|5279669||1637506015|1595523299000|1595523299365|0|0|0|||||||| +4457|4676|content://media/external/images/media/4676|/storage/emulated/0/DCIM/Camera/IMG_20200723_185455.jpg|image/jpeg|4000|2250|0|4161163||1637505480|1595523297000|1595523297277|0|0|0|||||||| +4458|6351|content://media/external/images/media/6351|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0026.jpg|image/jpeg|900|1600|0|241803||1637518221|1595357442000|0|0|0|0|||||||| +4459|6574|content://media/external/images/media/6574|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0025.jpg|image/jpeg|1600|900|0|206246||1637518221|1595357439000|0|0|0|0|||||||| +4460|6675|content://media/external/images/media/6675|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0024.jpg|image/jpeg|1600|900|0|280995||1637518222|1595357437000|0|0|0|0|||||||| +4461|6882|content://media/external/images/media/6882|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0023.jpg|image/jpeg|900|1600|0|143108||1637518222|1595357433000|0|0|0|0|||||||| +4462|6880|content://media/external/images/media/6880|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0022.jpg|image/jpeg|1600|900|0|237797||1637518222|1595357432000|0|0|0|0|||||||| +4463|6349|content://media/external/images/media/6349|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0021.jpg|image/jpeg|1600|900|0|269497||1637518221|1595357429000|0|0|0|0|||||||| +4464|6672|content://media/external/images/media/6672|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0020.jpg|image/jpeg|900|1600|0|188236||1637518222|1595357426000|0|0|0|0|||||||| +4465|6563|content://media/external/images/media/6563|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0023.jpg|image/jpeg|1600|900|0|219764||1637518221|1595357423000|0|0|0|0|||||||| +4466|7009|content://media/external/images/media/7009|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0019.jpg|image/jpeg|1600|900|0|249344||1637518222|1595357423000|0|0|0|0|||||||| +4467|6671|content://media/external/images/media/6671|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0018.jpg|image/jpeg|1600|900|0|228644||1637518222|1595357419000|0|0|0|0|||||||| +4468|6670|content://media/external/images/media/6670|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0017.jpg|image/jpeg|1600|900|0|303703||1637518222|1595357412000|0|0|0|0|||||||| +4469|6230|content://media/external/images/media/6230|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0016.jpg|image/jpeg|900|1600|0|288066||1637518221|1595357407000|0|0|0|0|||||||| +4470|6881|content://media/external/images/media/6881|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0015.jpg|image/jpeg|1600|900|0|183738||1637518222|1595357403000|0|0|0|0|||||||| +4471|6773|content://media/external/images/media/6773|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0014.jpg|image/jpeg|1600|900|0|244449||1637518222|1595357400000|0|0|0|0|||||||| +4472|7007|content://media/external/images/media/7007|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0013.jpg|image/jpeg|1600|900|0|269144||1637518222|1595357397000|0|0|0|0|||||||| +4473|6668|content://media/external/images/media/6668|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0012.jpg|image/jpeg|1600|900|0|317356||1637518222|1595357393000|0|0|0|0|||||||| +4474|6878|content://media/external/images/media/6878|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0011.jpg|image/jpeg|1600|900|0|218948||1637518222|1595357384000|0|0|0|0|||||||| +4475|6466|content://media/external/images/media/6466|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0010.jpg|image/jpeg|1600|900|0|282992||1637518221|1595357380000|0|0|0|0|||||||| +4476|6340|content://media/external/images/media/6340|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0025.jpg|image/jpeg|1600|900|0|226940||1637518221|1595357376000|0|0|0|0|||||||| +4477|6875|content://media/external/images/media/6875|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0009.jpg|image/jpeg|1600|900|0|265544||1637518222|1595357376000|0|0|0|0|||||||| +4478|6346|content://media/external/images/media/6346|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0008.jpg|image/jpeg|1600|900|0|193626||1637518221|1595357369000|0|0|0|0|||||||| +4479|7005|content://media/external/images/media/7005|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0007.jpg|image/jpeg|1600|900|0|268910||1637518222|1595357366000|0|0|0|0|||||||| +4480|6667|content://media/external/images/media/6667|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0006.jpg|image/jpeg|1600|900|0|273494||1637518222|1595357361000|0|0|0|0|||||||| +4481|6876|content://media/external/images/media/6876|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0005.jpg|image/jpeg|1600|900|0|291295||1637518222|1595357355000|0|0|0|0|||||||| +4482|6458|content://media/external/images/media/6458|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0026.jpg|image/jpeg|900|1600|0|210842||1637518221|1595357351000|0|0|0|0|||||||| +4483|6570|content://media/external/images/media/6570|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0004.jpg|image/jpeg|1600|900|0|297584||1637518221|1595357351000|0|0|0|0|||||||| +4484|6464|content://media/external/images/media/6464|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0003.jpg|image/jpeg|1600|900|0|147048||1637518221|1595357345000|0|0|0|0|||||||| +4485|6564|content://media/external/images/media/6564|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0024.jpg|image/jpeg|1600|900|0|199664||1637518221|1595357345000|0|0|0|0|||||||| +4486|6666|content://media/external/images/media/6666|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200721-WA0002.jpg|image/jpeg|1600|900|0|253853||1637518222|1595357342000|0|0|0|0|||||||| +4487|6462|content://media/external/images/media/6462|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200720-WA0019.jpg|image/jpeg|1600|900|0|186639||1637518221|1595269272000|0|0|0|0|||||||| +4488|6463|content://media/external/images/media/6463|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200720-WA0018.jpg|image/jpeg|900|1600|0|276124||1637518221|1595269068000|0|0|0|0|||||||| +4489|6663|content://media/external/images/media/6663|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0029.jpg|image/jpeg|900|1600|0|335813||1637518222|1595269068000|0|0|0|0|||||||| +4490|6873|content://media/external/images/media/6873|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0030.jpg|image/jpeg|1600|900|0|216856||1637518222|1595269068000|0|0|0|0|||||||| +4491|6344|content://media/external/images/media/6344|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0031.jpg|image/jpeg|1600|726|0|192765||1637518221|1595269067000|0|0|0|0|||||||| +4492|6768|content://media/external/images/media/6768|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200720-WA0017.jpg|image/jpeg|1200|1600|0|157509||1637518222|1595269067000|0|0|0|0|||||||| +4493|6460|content://media/external/images/media/6460|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200720-WA0015.jpg|image/jpeg|1600|628|0|144878||1637518221|1595269029000|0|0|0|0|||||||| +4494|6459|content://media/external/images/media/6459|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200719-WA0006.jpeg|image/jpeg|2250|4000|0|1908697||1637518221|1595173582000|0|0|0|0|||||||| +4495|6686|content://media/external/images/media/6686|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG_20200719_173850.jpg|image/jpeg|1600|900|0|471664||1637518222|1595173130000|0|0|0|0|||||||| +4496|6664|content://media/external/images/media/6664|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200719-WA0004.jpg|image/jpeg|1600|900|0|193413||1637518222|1595173026000|0|0|0|0|||||||| +4497|4684|content://media/external/images/media/4684|/storage/emulated/0/DCIM/Camera/PANO_20200719_125342.jpg|image/jpeg|7216|3680|0|19180243||1637505480|1595156028000|0|0|0|0|||||||| +4498|3408|content://media/external/images/media/3408|/storage/emulated/0/DCIM/Camera/PANO_20200719_125315.jpg|image/jpeg|7152|3648|0|22522617||1637502598|1595156003000|0|0|0|0|||||||| +4499|4089|content://media/external/images/media/4089|/storage/emulated/0/DCIM/Camera/PANO_20200719_125255.jpg|image/jpeg|7504|3776|0|22070801||1637504394|1595155980000|0|0|0|0|||||||| +4500|4606|content://media/external/images/media/4606|/storage/emulated/0/DCIM/Camera/IMG_20200719_113527.jpg|image/jpeg|4160|2340|0|4889176||1637505308|1595151327000|1595151327454|0|0|0|||||||| +4501|3511|content://media/external/images/media/3511|/storage/emulated/0/DCIM/Camera/IMG_20200719_113514.jpg|image/jpeg|4000|2250|0|3602103||1637502969|1595151316000|1595151316732|0|0|0|||||||| +4502|3603|content://media/external/images/media/3603|/storage/emulated/0/DCIM/Camera/IMG_20200719_105721.jpg|image/jpeg|4000|2250|90|7165394||1637503238|1595149047000|1595149046967|0|0|0|||||||| +4503|3844|content://media/external/images/media/3844|/storage/emulated/0/DCIM/Camera/IMG_20200719_105717.jpg|image/jpeg|4000|2250|90|7031235||1637503642|1595149040000|1595149040909|0|0|0|||||||| +4504|4697|content://media/external/images/media/4697|/storage/emulated/0/DCIM/Camera/IMG_20200719_105713.jpg|image/jpeg|4000|2250|90|6877205||1637505509|1595149037000|1595149037690|0|0|0|||||||| +4505|3703|content://media/external/images/media/3703|/storage/emulated/0/DCIM/Camera/IMG_20200719_105657.jpg|image/jpeg|4000|2250|90|7813163||1637503392|1595149018000|1595149018462|0|0|0|||||||| +4506|4282|content://media/external/images/media/4282|/storage/emulated/0/DCIM/Camera/IMG_20200719_105653.jpg|image/jpeg|4000|2250|90|7861018||1637504807|1595149015000|1595149015466|0|0|0|||||||| +4507|4056|content://media/external/images/media/4056|/storage/emulated/0/DCIM/Camera/IMG_20200719_093940.jpg|image/jpeg|4160|2340|90|6211828||1637504342|1595144380000|1595144380594|0|0|0|||||||| +4508|4097|content://media/external/images/media/4097|/storage/emulated/0/DCIM/Camera/IMG_20200719_093928.jpg|image/jpeg|4000|2250|0|8486802||1637504400|1595144370000|1595144370325|0|0|0|||||||| +4509|6568|content://media/external/images/media/6568|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200719-WA0001.jpg|image/jpeg|1024|768|0|161887||1637518221|1595143188000|0|0|0|0|||||||| +4510|3764|content://media/external/images/media/3764|/storage/emulated/0/DCIM/Camera/IMG_20200719_091913.jpg|image/jpeg|4160|2340|0|7374319||1637503508|1595143153000|1595143153222|0|0|0|||||||| +4511|3243|content://media/external/images/media/3243|/storage/emulated/0/DCIM/Camera/IMG_20200719_091907.jpg|image/jpeg|4160|2340|90|7201134||1637502259|1595143147000|1595143147049|0|0|0|||||||| +4512|3360|content://media/external/images/media/3360|/storage/emulated/0/DCIM/Camera/IMG_20200719_090459.jpg|image/jpeg|4160|2340|0|6500469||1637502451|1595142299000|1595142298893|0|0|0|||||||| +4513|6343|content://media/external/images/media/6343|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0028.jpg|image/jpeg|900|1600|0|278462||1637518221|1595095918000|0|0|0|0|||||||| +4514|3544|content://media/external/images/media/3544|/storage/emulated/0/DCIM/Camera/PANO_20200718_172742.jpg|image/jpeg|8112|3680|0|24352348||1637503010|1595086070000|0|0|0|0|||||||| +4515|2893|content://media/external/images/media/2893|/storage/emulated/0/DCIM/Camera/PANO_20200718_172723.jpg|image/jpeg|9168|3680|0|31479931||1637501516|1595086051000|0|0|0|0|||||||| +4516|4662|content://media/external/images/media/4662|/storage/emulated/0/DCIM/Camera/IMG_20200718_172603.jpg|image/jpeg|4160|2340|0|5836870||1637505417|1595085963000|1595085963648|0|0|0|||||||| +4517|3320|content://media/external/images/media/3320|/storage/emulated/0/DCIM/Camera/IMG_20200718_172553.jpg|image/jpeg|4000|2250|0|6340792||1637502438|1595085954000|1595085954664|0|0|0|||||||| +4518|3999|content://media/external/images/media/3999|/storage/emulated/0/DCIM/Camera/IMG_20200718_152057.jpg|image/jpeg|4000|2250|90|5090063||1637504086|1595078458000|1595078458812|0|0|0|||||||| +4519|3727|content://media/external/images/media/3727|/storage/emulated/0/DCIM/Camera/IMG_20200718_152051.jpg|image/jpeg|4000|2250|90|4653103||1637503477|1595078453000|1595078453390|0|0|0|||||||| +4520|2945|content://media/external/images/media/2945|/storage/emulated/0/DCIM/Camera/IMG_20200718_144548.jpg|image/jpeg|4000|2250|90|6171458||1637501660|1595076349000|1595076349284|0|0|0|||||||| +4521|4912|content://media/external/images/media/4912|/storage/emulated/0/DCIM/Camera/IMG_20200718_144534.jpg|image/jpeg|4000|2250|0|6466946||1637505944|1595076335000|1595076335896|0|0|0|||||||| +4522|4203|content://media/external/images/media/4203|/storage/emulated/0/DCIM/Camera/IMG_20200718_144528.jpg|image/jpeg|4000|2250|90|6377590||1637504640|1595076331000|1595076331629|0|0|0|||||||| +4523|3185|content://media/external/images/media/3185|/storage/emulated/0/DCIM/Camera/IMG_20200718_144447.jpg|image/jpeg|4000|2250|0|5100130||1637502161|1595076290000|1595076289910|0|0|0|||||||| +4524|3660|content://media/external/images/media/3660|/storage/emulated/0/DCIM/Camera/IMG_20200718_144440.jpg|image/jpeg|4000|2250|0|6024033||1637503358|1595076281000|1595076281742|0|0|0|||||||| +4525|3726|content://media/external/images/media/3726|/storage/emulated/0/DCIM/Camera/IMG_20200718_144149.jpg|image/jpeg|4000|2250|90|4539815||1637503477|1595076112000|1595076112894|0|0|0|||||||| +4526|3941|content://media/external/images/media/3941|/storage/emulated/0/DCIM/Camera/IMG_20200718_144144.jpg|image/jpeg|4000|2250|90|4645962||1637503853|1595076107000|1595076107510|0|0|0|||||||| +4527|3492|content://media/external/images/media/3492|/storage/emulated/0/DCIM/Camera/IMG_20200718_144138.jpg|image/jpeg|4000|2250|90|6160486||1637502870|1595076100000|1595076100415|0|0|0|||||||| +4528|4505|content://media/external/images/media/4505|/storage/emulated/0/DCIM/Camera/IMG_20200718_135055.jpg|image/jpeg|4000|2250|90|6271423||1637505160|1595073058000|1595073057957|0|0|0|||||||| +4529|2969|content://media/external/images/media/2969|/storage/emulated/0/DCIM/Camera/IMG_20200718_134841.jpg|image/jpeg|4000|2250|90|6116905||1637501684|1595072926000|1595072926047|0|0|0|||||||| +4530|3170|content://media/external/images/media/3170|/storage/emulated/0/DCIM/Camera/IMG_20200718_134830.jpg|image/jpeg|4000|2250|90|5780926||1637502143|1595072914000|1595072914524|0|0|0|||||||| +4531|4911|content://media/external/images/media/4911|/storage/emulated/0/DCIM/Camera/IMG_20200718_124630.jpg|image/jpeg|4000|2250|0|5728083||1637505944|1595069192000|1595069192113|0|0|0|||||||| +4532|3242|content://media/external/images/media/3242|/storage/emulated/0/DCIM/Camera/IMG_20200718_124625.jpg|image/jpeg|4000|2250|0|5336889||1637502259|1595069187000|1595069187340|0|0|0|||||||| +4533|3659|content://media/external/images/media/3659|/storage/emulated/0/DCIM/Camera/IMG_20200718_122839.jpg|image/jpeg|4000|2250|90|5234800||1637503358|1595068120000|1595068120422|0|0|0|||||||| +4534|4948|content://media/external/images/media/4948|/storage/emulated/0/DCIM/Camera/IMG_20200718_122048.jpg|image/jpeg|4000|2250|90|6106762||1637506015|1595067649000|1595067649523|0|0|0|||||||| +4535|3090|content://media/external/images/media/3090|/storage/emulated/0/DCIM/Camera/IMG_20200718_122001.jpg|image/jpeg|4000|2250|0|6302641||1637501971|1595067603000|1595067603249|0|0|0|||||||| +4536|3491|content://media/external/images/media/3491|/storage/emulated/0/DCIM/Camera/IMG_20200718_121928.jpg|image/jpeg|4000|2250|90|4314079||1637502870|1595067572000|1595067571984|0|0|0|||||||| +4537|4413|content://media/external/images/media/4413|/storage/emulated/0/DCIM/Camera/IMG_20200718_120423.jpg|image/jpeg|720|1280|270|385657||1637505063|1595066663000|0|0|0|0|||||||| +4538|3376|content://media/external/images/media/3376|/storage/emulated/0/DCIM/Camera/IMG_20200718_120346.jpg|image/jpeg|720|1280|270|396153||1637502523|1595066627000|0|0|0|0|||||||| +4539|3808|content://media/external/images/media/3808|/storage/emulated/0/DCIM/Camera/IMG_20200718_120219.jpg|image/jpeg|4000|2250|0|8669778||1637503601|1595066541000|1595066541240|0|0|0|||||||| +4540|3069|content://media/external/images/media/3069|/storage/emulated/0/DCIM/Camera/IMG_20200718_113419.jpg|image/jpeg|4160|2340|0|6138872||1637501905|1595064859000|1595064859017|0|0|0|||||||| +4541|3341|content://media/external/images/media/3341|/storage/emulated/0/DCIM/Camera/IMG_20200718_103706.jpg|image/jpeg|4000|2250|90|7720000||1637502439|1595061428000|1595061428071|0|0|0|||||||| +4542|4645|content://media/external/images/media/4645|/storage/emulated/0/DCIM/Camera/IMG_20200718_103650.jpg|image/jpeg|4000|2250|90|6770543||1637505414|1595061411000|1595061411817|0|0|0|||||||| +4543|3144|content://media/external/images/media/3144|/storage/emulated/0/DCIM/Camera/IMG_20200718_103646.jpg|image/jpeg|4000|2250|90|6601496||1637502130|1595061407000|1595061407869|0|0|0|||||||| +4544|4524|content://media/external/images/media/4524|/storage/emulated/0/DCIM/Camera/IMG_20200718_102917.jpg|image/jpeg|4160|2340|90|6567558||1637505165|1595060957000|1595060957382|0|0|0|||||||| +4545|3725|content://media/external/images/media/3725|/storage/emulated/0/DCIM/Camera/IMG_20200718_102900.jpg|image/jpeg|4000|2250|90|7582595||1637503477|1595060941000|1595060941746|0|0|0|||||||| +4546|3109|content://media/external/images/media/3109|/storage/emulated/0/DCIM/Camera/IMG_20200718_102855.jpg|image/jpeg|4160|2340|90|6672486||1637502054|1595060935000|1595060935058|0|0|0|||||||| +4547|3228|content://media/external/images/media/3228|/storage/emulated/0/DCIM/Camera/IMG_20200718_101945.jpg|image/jpeg|4160|2340|0|6685486||1637502258|1595060385000|1595060385221|0|0|0|||||||| +4548|2875|content://media/external/images/media/2875|/storage/emulated/0/DCIM/Camera/IMG_20200718_101627.jpg|image/jpeg|4000|2250|90|7038597||1637501460|1595060188000|1595060188623|0|0|0|||||||| +4549|4485|content://media/external/images/media/4485|/storage/emulated/0/DCIM/Camera/IMG_20200718_101617.jpg|image/jpeg|4160|2340|90|6776605||1637505122|1595060177000|1595060177708|0|0|0|||||||| +4550|3108|content://media/external/images/media/3108|/storage/emulated/0/DCIM/Camera/IMG_20200718_082107.jpg|image/jpeg|4160|2340|0|5936745||1637502054|1595053267000|1595053267231|0|0|0|||||||| +4551|4661|content://media/external/images/media/4661|/storage/emulated/0/DCIM/Camera/IMG_20200718_082052.jpg|image/jpeg|4000|2250|0|7003884||1637505417|1595053254000|1595053253970|0|0|0|||||||| +4552|6341|content://media/external/images/media/6341|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200718-WA0002.jpg|image/jpeg|1600|1200|0|198446||1637518221|1595053198000|0|0|0|0|||||||| +4553|3658|content://media/external/images/media/3658|/storage/emulated/0/DCIM/Camera/IMG_20200718_081803.jpg|image/jpeg|4000|2250|90|6582432||1637503358|1595053087000|1595053086948|0|0|0|||||||| +4554|3204|content://media/external/images/media/3204|/storage/emulated/0/DCIM/Camera/IMG_20200718_075557.jpg|image/jpeg|4000|2250|90|4815542||1637502256|1595051760000|1595051760032|0|0|0|||||||| +4555|6766|content://media/external/images/media/6766|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200717-WA0002.jpeg|image/jpeg|4000|2250|0|863625||1637518222|1594984695000|0|0|0|0|||||||| +4556|3340|content://media/external/images/media/3340|/storage/emulated/0/DCIM/Camera/IMG_20200715_203937.jpg|image/jpeg|4000|2250|0|4267835||1637502439|1594838379000|1594838379447|0|0|0|||||||| +4557|4925|content://media/external/images/media/4925|/storage/emulated/0/DCIM/Camera/IMG_20200715_203757.jpg|image/jpeg|4000|2250|90|4424446||1637506010|1594838279000|1594838279282|0|0|0|||||||| +4558|3724|content://media/external/images/media/3724|/storage/emulated/0/DCIM/Camera/IMG_20200715_203724.jpg|image/jpeg|4000|2250|90|4243430||1637503477|1594838246000|1594838246446|0|0|0|||||||| +4559|4395|content://media/external/images/media/4395|/storage/emulated/0/DCIM/Camera/IMG_20200715_203710.jpg|image/jpeg|4000|2250|90|4189644||1637505004|1594838231000|1594838231398|0|0|0|||||||| +4560|2986|content://media/external/images/media/2986|/storage/emulated/0/DCIM/Camera/IMG_20200715_203701.jpg|image/jpeg|4000|2250|90|4181010||1637501771|1594838222000|1594838222857|0|0|0|||||||| +4561|6764|content://media/external/images/media/6764|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200712-WA0004.jpg|image/jpeg|1200|1600|0|250133||1637518222|1594577670000|0|0|0|0|||||||| +4562|6763|content://media/external/images/media/6763|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200712-WA0003.jpg|image/jpeg|900|1600|0|196918||1637518222|1594559424000|0|0|0|0|||||||| +4563|3998|content://media/external/images/media/3998|/storage/emulated/0/DCIM/Camera/IMG_20200711_194910.jpg|image/jpeg|4000|2250|0|5500869||1637504086|1594489752000|1594489752600|0|0|0|||||||| +4564|3435|content://media/external/images/media/3435|/storage/emulated/0/DCIM/Camera/IMG_20200711_194845.jpg|image/jpeg|4000|2250|0|4187712||1637502783|1594489727000|1594489727263|0|0|0|||||||| +4565|2902|content://media/external/images/media/2902|/storage/emulated/0/DCIM/Camera/IMG_20200711_192744.jpg|image/jpeg|4000|2250|0|4966094||1637501534|1594488465000|1594488465733|0|0|0|||||||| +4566|4096|content://media/external/images/media/4096|/storage/emulated/0/DCIM/Camera/IMG_20200711_192719.jpg|image/jpeg|4000|2250|0|4985403||1637504400|1594488441000|1594488440986|0|0|0|||||||| +4567|4644|content://media/external/images/media/4644|/storage/emulated/0/DCIM/Camera/IMG_20200711_190831.jpg|image/jpeg|4000|2250|90|4452063||1637505414|1594487312000|1594487312708|0|0|0|||||||| +4568|3339|content://media/external/images/media/3339|/storage/emulated/0/DCIM/Camera/IMG_20200711_190829.jpg|image/jpeg|4000|2250|90|4219149||1637502439|1594487310000|1594487310839|0|0|0|||||||| +4569|4630|content://media/external/images/media/4630|/storage/emulated/0/DCIM/Camera/IMG_20200711_190827.jpg|image/jpeg|4000|2250|90|4300619||1637505390|1594487308000|1594487308116|0|0|0|||||||| +4570|4643|content://media/external/images/media/4643|/storage/emulated/0/DCIM/Camera/IMG_20200711_190826.jpg|image/jpeg|4000|2250|90|3992059||1637505414|1594487308000|1594487308476|0|0|0|||||||| +4571|3889|content://media/external/images/media/3889|/storage/emulated/0/DCIM/Camera/IMG_20200711_190815.jpg|image/jpeg|4000|2250|90|4272139||1637503732|1594487297000|1594487297037|0|0|0|||||||| +4572|4818|content://media/external/images/media/4818|/storage/emulated/0/DCIM/Camera/IMG_20200711_190812.jpg|image/jpeg|4000|2250|90|4222400||1637505730|1594487294000|1594487294847|0|0|0|||||||| +4573|4454|content://media/external/images/media/4454|/storage/emulated/0/DCIM/Camera/IMG_20200711_190804.jpg|image/jpeg|4000|2250|90|5196967||1637505068|1594487286000|1594487286478|0|0|0|||||||| +4574|4436|content://media/external/images/media/4436|/storage/emulated/0/DCIM/Camera/IMG_20200711_190659.jpg|image/jpeg|4000|2250|90|4335230||1637505068|1594487222000|1594487221928|0|0|0|||||||| +4575|4435|content://media/external/images/media/4435|/storage/emulated/0/DCIM/Camera/IMG_20200711_175617.jpg|image/jpeg|4000|2250|0|4083811||1637505068|1594482980000|1594482980107|0|0|0|||||||| +4576|2968|content://media/external/images/media/2968|/storage/emulated/0/DCIM/Camera/IMG_20200711_175613.jpg|image/jpeg|4000|2250|0|3945439||1637501684|1594482977000|1594482976947|0|0|0|||||||| +4577|4375|content://media/external/images/media/4375|/storage/emulated/0/DCIM/Camera/IMG_20200711_161347.jpg|image/jpeg|4000|2250|0|4126937||1637504982|1594476829000|1594476829132|0|0|0|||||||| +4578|6455|content://media/external/images/media/6455|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200711-WA0005.jpg|image/jpeg|1200|1600|0|155213||1637518221|1594476783000|0|0|0|0|||||||| +4579|3143|content://media/external/images/media/3143|/storage/emulated/0/DCIM/Camera/IMG_20200710_205110.jpg|image/jpeg|4000|2250|0|4133328||1637502130|1594407071000|1594407071825|0|0|0|||||||| +4580|3107|content://media/external/images/media/3107|/storage/emulated/0/DCIM/Camera/IMG_20200710_203631.jpg|image/jpeg|4000|2250|0|4287045||1637502054|1594406194000|1594406193924|0|0|0|||||||| +4581|3490|content://media/external/images/media/3490|/storage/emulated/0/DCIM/Camera/IMG_20200710_201853.jpg|image/jpeg|4000|2250|0|4395842||1637502870|1594405136000|1594405136561|0|0|0|||||||| +4582|3106|content://media/external/images/media/3106|/storage/emulated/0/DCIM/Camera/IMG_20200707_173419.jpg|image/jpeg|4000|2250|0|4472943||1637502054|1594136062000|1594136062328|0|0|0|||||||| +4583|2736|content://media/external/images/media/2736|/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-07-07-09-14-54-518_com.stt.android.suunto.jpg|image/jpeg|1080|2340|0|430987||1637500987|1594106094000|0|0|0|0|||||||| +4584|4910|content://media/external/images/media/4910|/storage/emulated/0/DCIM/Camera/IMG_20200705_170712.jpg|image/jpeg|4000|2250|90|4227445||1637505944|1593961633000|1593961633598|0|0|0|||||||| +4585|3640|content://media/external/images/media/3640|/storage/emulated/0/DCIM/Camera/IMG_20200705_170657.jpg|image/jpeg|4000|2250|90|4759691||1637503301|1593961618000|1593961618296|0|0|0|||||||| +4586|4453|content://media/external/images/media/4453|/storage/emulated/0/DCIM/Camera/IMG_20200705_170650.jpg|image/jpeg|4000|2250|90|4512726||1637505068|1593961612000|1593961612432|0|0|0|||||||| +4587|7000|content://media/external/images/media/7000|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200704-WA0016.jpg|image/jpeg|900|1600|0|162629||1637518222|1593895387000|0|0|0|0|||||||| +4588|6228|content://media/external/images/media/6228|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200704-WA0015.jpg|image/jpeg|1200|1600|0|259994||1637518221|1593894027000|0|0|0|0|||||||| +4589|6997|content://media/external/images/media/6997|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200704-WA0014.jpg|image/jpeg|1200|1600|0|257096||1637518222|1593893947000|0|0|0|0|||||||| +4590|6454|content://media/external/images/media/6454|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200704-WA0013.jpg|image/jpeg|1200|1600|0|230923||1637518221|1593893946000|0|0|0|0|||||||| +4591|6761|content://media/external/images/media/6761|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200704-WA0012.jpg|image/jpeg|1200|1600|0|245502||1637518222|1593893945000|0|0|0|0|||||||| +4592|4715|content://media/external/images/media/4715|/storage/emulated/0/DCIM/Camera/IMG_20200704_131555.jpg|image/jpeg|4000|2250|0|4077117||1637505565|1593861356000|1593861356899|0|0|0|||||||| +4593|3657|content://media/external/images/media/3657|/storage/emulated/0/DCIM/Camera/IMG_20200704_131542.jpg|image/jpeg|4000|2250|90|4127858||1637503358|1593861344000|1593861344195|0|0|0|||||||| +4594|2804|content://media/external/images/media/2804|/storage/emulated/0/DCIM/Camera/IMG_20200704_131244.jpg|image/jpeg|5184|3880|0|6245770||1637501312|1593861167000|1593861167386|0|0|0|||||||| +4595|4095|content://media/external/images/media/4095|/storage/emulated/0/DCIM/Camera/IMG_20200704_131246.jpg|image/jpeg|5184|3880|0|6296735||1637504400|1593861167000|1593861167785|0|0|0|||||||| +4596|6658|content://media/external/images/media/6658|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200703-WA0007.jpg|image/jpeg|1600|1200|0|290556||1637518221|1593785659000|0|0|0|0|||||||| +4597|1009|content://media/external/images/media/1009|/storage/emulated/0/PlantNet/1593380918025.JPEG|image/jpeg|506|900|0|108447||1637500139|1593380918000|1593349607127|0|0|0|||||||| +4598|1008|content://media/external/images/media/1008|/storage/emulated/0/PlantNet/1593380863049.JPEG|image/jpeg|506|900|0|108447||1637500139|1593380863000|1593349607127|0|0|0|||||||| +4599|1007|content://media/external/images/media/1007|/storage/emulated/0/PlantNet/1593380820581.JPEG|image/jpeg|506|900|0|108603||1637500139|1593380820000|1593349607127|0|0|0|||||||| +4600|1006|content://media/external/images/media/1006|/storage/emulated/0/PlantNet/1593380794255.JPEG|image/jpeg|506|900|0|108819||1637500139|1593380794000|1593349607127|0|0|0|||||||| +4601|2694|content://media/external/images/media/2694|/storage/emulated/0/Pictures/image-c7ccce40-a92b-46af-ab6a-b02bd55c2b561261348168463100365.jpg|image/jpeg|-1|-1|0|0||1637500871|1593380757000|0|0|0|0|||||||| +4602|1005|content://media/external/images/media/1005|/storage/emulated/0/PlantNet/1593380748955.JPEG|image/jpeg|900|506|0|58367||1637500139|1593380749000|1593376073683|0|0|0|||||||| +4603|3264|content://media/external/images/media/3264|/storage/emulated/0/DCIM/Camera/IMG_20200628_222751.jpg|image/jpeg|4000|2250|0|4344545||1637502342|1593376073000|1593376073683|0|0|0|||||||| +4604|3602|content://media/external/images/media/3602|/storage/emulated/0/DCIM/Camera/IMG_20200628_185936.jpg|image/jpeg|5184|3880|270|8246339||1637503238|1593363579000|1593363579198|0|0|0|||||||| +4605|3579|content://media/external/images/media/3579|/storage/emulated/0/DCIM/Camera/IMG_20200628_182233.jpg|image/jpeg|5184|3880|270|7751109||1637503154|1593361356000|1593361356365|0|0|0|||||||| +4606|3702|content://media/external/images/media/3702|/storage/emulated/0/DCIM/Camera/IMG_20200628_182227.jpg|image/jpeg|5184|3880|270|7615055||1637503392|1593361350000|1593361350294|0|0|0|||||||| +4607|2985|content://media/external/images/media/2985|/storage/emulated/0/DCIM/Camera/IMG_20200628_182118.jpg|image/jpeg|4000|2250|90|4718870||1637501771|1593361281000|1593361280904|0|0|0|||||||| +4608|4996|content://media/external/images/media/4996|/storage/emulated/0/DCIM/Camera/IMG_20200628_182112.jpg|image/jpeg|4000|2250|90|8296965||1637506101|1593361274000|1593361274573|0|0|0|||||||| +4609|3656|content://media/external/images/media/3656|/storage/emulated/0/DCIM/Camera/IMG_20200628_150643.jpg|image/jpeg|4000|2250|90|5633954||1637503358|1593349607000|1593349607127|0|0|0|||||||| +4610|6561|content://media/external/images/media/6561|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200628-WA0007.jpg|image/jpeg|900|1600|0|116043||1637518221|1593342408000|0|0|0|0|||||||| +4611|4265|content://media/external/images/media/4265|/storage/emulated/0/DCIM/Camera/IMG_20200627_101856.jpg|image/jpeg|4160|2340|0|5712600||1637504756|1593245936000|1593245936610|0|0|0|||||||| +4612|3227|content://media/external/images/media/3227|/storage/emulated/0/DCIM/Camera/IMG_20200627_101838.jpg|image/jpeg|4000|2250|0|5914147||1637502258|1593245920000|1593245920228|0|0|0|||||||| +4613|3601|content://media/external/images/media/3601|/storage/emulated/0/DCIM/Camera/IMG_20200627_101827.jpg|image/jpeg|4000|2250|0|4617956||1637503238|1593245909000|1593245909655|0|0|0|||||||| +4614|4055|content://media/external/images/media/4055|/storage/emulated/0/DCIM/Camera/IMG_20200626_080304.jpg|image/jpeg|4000|2250|90|3831653||1637504342|1593151387000|1593151387211|0|0|0|||||||| +4615|6452|content://media/external/images/media/6452|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200625-WA0000.jpg|image/jpeg|1600|900|0|175460||1637518221|1593076419000|0|0|0|0|||||||| +4616|6760|content://media/external/images/media/6760|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200623-WA0005.jpg|image/jpeg|750|1334|0|43425||1637518222|1592917373000|0|0|0|0|||||||| +4617|6338|content://media/external/images/media/6338|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0023.jpg|image/jpeg|1600|901|0|137201||1637518221|1592680126000|0|0|0|0|||||||| +4618|6759|content://media/external/images/media/6759|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0020.jpg|image/jpeg|1600|901|0|148996||1637518222|1592677168000|0|0|0|0|||||||| +4619|6559|content://media/external/images/media/6559|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0018.jpg|image/jpeg|1200|1600|0|174439||1637518221|1592670963000|0|0|0|0|||||||| +4620|6869|content://media/external/images/media/6869|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0017.jpg|image/jpeg|1200|1600|0|167049||1637518222|1592670961000|0|0|0|0|||||||| +4621|4484|content://media/external/images/media/4484|/storage/emulated/0/DCIM/Camera/IMG_20200620_114004.jpg|image/jpeg|4000|2250|90|4940102||1637505122|1592646007000|1592646006954|0|0|0|||||||| +4622|3105|content://media/external/images/media/3105|/storage/emulated/0/DCIM/Camera/IMG_20200620_075817.jpg|image/jpeg|4000|2250|0|4223827||1637502054|1592632700000|1592632700102|0|0|0|||||||| +4623|3127|content://media/external/images/media/3127|/storage/emulated/0/DCIM/Camera/IMG_20200620_075404.jpg|image/jpeg|720|1280|0|118578||1637502068|1592632445000|0|0|0|0|||||||| +4624|6226|content://media/external/images/media/6226|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0007.jpg|image/jpeg|1200|1600|0|122546||1637518221|1592604579000|0|0|0|0|||||||| +4625|6224|content://media/external/images/media/6224|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0006.jpg|image/jpeg|1200|1600|0|177980||1637518221|1592604578000|0|0|0|0|||||||| +4626|6870|content://media/external/images/media/6870|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0005.jpg|image/jpeg|1200|1600|0|115046||1637518222|1592604578000|0|0|0|0|||||||| +4627|6654|content://media/external/images/media/6654|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0003.jpg|image/jpeg|1200|1600|0|145760||1637518221|1592604577000|0|0|0|0|||||||| +4628|6868|content://media/external/images/media/6868|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0004.jpg|image/jpeg|1200|1600|0|119044||1637518222|1592604577000|0|0|0|0|||||||| +4629|6993|content://media/external/images/media/6993|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0002.jpg|image/jpeg|1200|1600|0|174557||1637518222|1592604576000|0|0|0|0|||||||| +4630|6335|content://media/external/images/media/6335|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0001.jpg|image/jpeg|1200|1600|0|125787||1637518221|1592604575000|0|0|0|0|||||||| +4631|6450|content://media/external/images/media/6450|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200620-WA0000.jpg|image/jpeg|1200|1600|0|163636||1637518221|1592604575000|0|0|0|0|||||||| +4632|4844|content://media/external/images/media/4844|/storage/emulated/0/DCIM/Camera/IMG_20200619_201313.jpg|image/jpeg|4000|2250|90|4808088||1637505753|1592590396000|1592590396505|0|0|0|||||||| +4633|4504|content://media/external/images/media/4504|/storage/emulated/0/DCIM/Camera/IMG_20200619_174432.jpg|image/jpeg|4000|2250|0|4925930||1637505160|1592581476000|1592581476395|0|0|0|||||||| +4634|4797|content://media/external/images/media/4797|/storage/emulated/0/DCIM/Camera/IMG_20200619_174427.jpg|image/jpeg|4000|2250|90|5125544||1637505663|1592581471000|1592581471591|0|0|0|||||||| +4635|6864|content://media/external/images/media/6864|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200619-WA0016.jpg|image/jpeg|1080|810|0|65519||1637518222|1592567228000|0|0|0|0|||||||| +4636|6655|content://media/external/images/media/6655|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200618-WA0001.jpg|image/jpeg|960|960|0|110335||1637518221|1592475259000|0|0|0|0|||||||| +4637|6555|content://media/external/images/media/6555|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200617-WA0020.jpg|image/jpeg|1200|1600|0|256399||1637518221|1592417986000|0|0|0|0|||||||| +4638|6756|content://media/external/images/media/6756|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200617-WA0010.jpg|image/jpeg|810|960|0|78319||1637518222|1592394278000|0|0|0|0|||||||| +4639|3303|content://media/external/images/media/3303|/storage/emulated/0/DCIM/Camera/IMG_20200617_072006.jpg|image/jpeg|4000|2250|90|4290179||1637502430|1592371207000|1592371207622|0|0|0|||||||| +4640|3226|content://media/external/images/media/3226|/storage/emulated/0/DCIM/Camera/IMG_20200617_071931.jpg|image/jpeg|4000|2250|90|4680060||1637502258|1592371173000|1592371173483|0|0|0|||||||| +4641|6334|content://media/external/images/media/6334|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200616-WA0003.jpg|image/jpeg|1536|2048|0|188352||1637518221|1592307033000|0|0|0|0|||||||| +4642|6652|content://media/external/images/media/6652|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200614-WA0014.jpg|image/jpeg|899|1599|0|173692||1637518221|1592163811000|0|0|0|0|||||||| +4643|6333|content://media/external/images/media/6333|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200614-WA0012.jpg|image/jpeg|1600|1200|0|266821||1637518221|1592163810000|0|0|0|0|||||||| +4644|6862|content://media/external/images/media/6862|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200614-WA0013.jpg|image/jpeg|1200|1600|0|183847||1637518222|1592163810000|0|0|0|0|||||||| +4645|6332|content://media/external/images/media/6332|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200614-WA0011.jpg|image/jpeg|1200|1600|0|238769||1637518221|1592163809000|0|0|0|0|||||||| +4646|6448|content://media/external/images/media/6448|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200614-WA0010.jpg|image/jpeg|1200|1600|0|250963||1637518221|1592163809000|0|0|0|0|||||||| +4647|6991|content://media/external/images/media/6991|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200614-WA0009.jpg|image/jpeg|1200|1600|0|214237||1637518222|1592163808000|0|0|0|0|||||||| +4648|6990|content://media/external/images/media/6990|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200614-WA0008.jpg|image/jpeg|1200|1600|0|163902||1637518222|1592163807000|0|0|0|0|||||||| +4649|3979|content://media/external/images/media/3979|/storage/emulated/0/DCIM/Camera/IMG_20200614_210201.jpg|image/jpeg|4000|2250|0|4407332||1637504059|1592161323000|1592161323379|0|0|0|||||||| +4650|4088|content://media/external/images/media/4088|/storage/emulated/0/DCIM/Camera/PANO_20200614_174156.jpg|image/jpeg|7344|3712|0|18571996||1637504394|1592149323000|0|0|0|0|||||||| +4651|4650|content://media/external/images/media/4650|/storage/emulated/0/DCIM/Camera/PANO_20200614_173218.jpg|image/jpeg|7664|3744|0|20501233||1637505414|1592148746000|0|0|0|0|||||||| +4652|2984|content://media/external/images/media/2984|/storage/emulated/0/DCIM/Camera/IMG_20200614_173209.jpg|image/jpeg|4160|2340|0|5748120||1637501771|1592148729000|1592148729150|0|0|0|||||||| +4653|3923|content://media/external/images/media/3923|/storage/emulated/0/DCIM/Camera/IMG_20200614_173206.jpg|image/jpeg|4160|2340|0|5450934||1637503834|1592148726000|1592148726461|0|0|0|||||||| +4654|4394|content://media/external/images/media/4394|/storage/emulated/0/DCIM/Camera/IMG_20200614_135430.jpg|image/jpeg|4000|2250|0|4360130||1637505004|1592135671000|1592135671686|0|0|0|||||||| +4655|4036|content://media/external/images/media/4036|/storage/emulated/0/DCIM/Camera/IMG_20200614_135427.jpg|image/jpeg|4000|2250|0|4488144||1637504234|1592135669000|1592135669599|0|0|0|||||||| +4656|6755|content://media/external/images/media/6755|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200613-WA0022.jpeg|image/jpeg|4000|2250|0|736302||1637518222|1592066269000|0|0|0|0|||||||| +4657|6447|content://media/external/images/media/6447|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200613-WA0018.jpeg|image/jpeg|4000|2250|0|685648||1637518221|1592062507000|0|0|0|0|||||||| +4658|2944|content://media/external/images/media/2944|/storage/emulated/0/DCIM/Camera/IMG_20200613_112323.jpg|image/jpeg|4000|2250|0|4755646||1637501660|1592040205000|1592040205075|0|0|0|||||||| +4659|6221|content://media/external/images/media/6221|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200613-WA0004.jpeg|image/jpeg|2250|4000|0|624767||1637518221|1592038900000|0|0|0|0|||||||| +4660|2735|content://media/external/images/media/2735|/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-06-12-20-50-06-812_com.brytonsport.active.jpg|image/jpeg|1080|2340|0|729332||1637500987|1591987806000|0|0|0|0|||||||| +4661|4135|content://media/external/images/media/4135|/storage/emulated/0/DCIM/Camera/IMG_20200612_111344.jpg|image/jpeg|4000|2250|0|5918999||1637504473|1591953228000|1591953227976|0|0|0|||||||| +4662|6650|content://media/external/images/media/6650|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200611-WA0009.jpg|image/jpeg|1600|1200|0|370537||1637518221|1591890782000|0|0|0|0|||||||| +4663|6445|content://media/external/images/media/6445|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200611-WA0008.jpg|image/jpeg|1200|1600|0|402238||1637518221|1591890781000|0|0|0|0|||||||| +4664|6986|content://media/external/images/media/6986|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200611-WA0007.jpg|image/jpeg|1200|1600|0|304505||1637518222|1591890780000|0|0|0|0|||||||| +4665|6444|content://media/external/images/media/6444|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200609-WA0015.jpg|image/jpeg|755|1024|0|79385||1637518221|1591735598000|0|0|0|0|||||||| +4666|4054|content://media/external/images/media/4054|/storage/emulated/0/DCIM/Camera/IMG_20200609_183651.jpg|image/jpeg|4000|2250|90|5779710||1637504342|1591720615000|1591720615502|0|0|0|||||||| +4667|3578|content://media/external/images/media/3578|/storage/emulated/0/DCIM/Camera/IMG_20200607_222212.jpg|image/jpeg|4000|2250|90|4728246||1637503154|1591561335000|1591561335173|0|0|0|||||||| +4668|4308|content://media/external/images/media/4308|/storage/emulated/0/DCIM/Camera/IMG_20200607_143459.jpg|image/jpeg|4000|2250|90|4453964||1637504817|1591533301000|1591533301298|0|0|0|||||||| +4669|3104|content://media/external/images/media/3104|/storage/emulated/0/DCIM/Camera/IMG_20200607_143443.jpg|image/jpeg|4000|2250|90|4549174||1637502054|1591533285000|1591533285153|0|0|0|||||||| +4670|4544|content://media/external/images/media/4544|/storage/emulated/0/DCIM/Camera/IMG_20200607_141718.jpg|image/jpeg|4000|2250|0|5018981||1637505187|1591532240000|1591532239957|0|0|0|||||||| +4671|4483|content://media/external/images/media/4483|/storage/emulated/0/DCIM/Camera/IMG_20200607_141713.jpg|image/jpeg|4000|2250|0|4166849||1637505122|1591532235000|1591532235180|0|0|0|||||||| +4672|3469|content://media/external/images/media/3469|/storage/emulated/0/DCIM/Camera/IMG_20200607_141640.jpg|image/jpeg|4000|2250|0|4429943||1637502817|1591532201000|1591532201692|0|0|0|||||||| +4673|2967|content://media/external/images/media/2967|/storage/emulated/0/DCIM/Camera/IMG_20200607_141634.jpg|image/jpeg|4000|2250|0|4337150||1637501684|1591532195000|1591532195208|0|0|0|||||||| +4674|4115|content://media/external/images/media/4115|/storage/emulated/0/DCIM/Camera/IMG_20200607_141616.jpg|image/jpeg|4000|2250|0|4691292||1637504451|1591532177000|1591532177250|0|0|0|||||||| +4675|3807|content://media/external/images/media/3807|/storage/emulated/0/DCIM/Camera/IMG_20200607_141605.jpg|image/jpeg|4000|2250|90|4132204||1637503601|1591532167000|1591532167612|0|0|0|||||||| +4676|4714|content://media/external/images/media/4714|/storage/emulated/0/DCIM/Camera/IMG_20200606_165852.jpg|image/jpeg|4000|2250|90|5406413||1637505565|1591455535000|1591455535703|0|0|0|||||||| +4677|2734|content://media/external/images/media/2734|/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-06-05-19-52-54-676_com.brytonsport.active.jpg|image/jpeg|1080|2340|0|674799||1637500987|1591379574000|0|0|0|0|||||||| +4678|2692|content://media/external/images/media/2692|/storage/emulated/0/Pictures/Suunto/sportie_a5840624.jpg|image/jpeg|1080|1080|0|168565||1637500871|1591167767000|0|0|0|0|||||||| +4679|2733|content://media/external/images/media/2733|/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-06-03-09-02-03-192_com.stt.android.suunto.jpg|image/jpeg|1080|2340|0|749690||1637500987|1591167723000|0|0|0|0|||||||| +4680|3682|content://media/external/images/media/3682|/storage/emulated/0/DCIM/Camera/IMG_20200602_204528.jpg|image/jpeg|720|1280|0|184373||1637503389|1591123528000|0|0|0|0|||||||| +4681|4393|content://media/external/images/media/4393|/storage/emulated/0/DCIM/Camera/IMG_20200602_204516.jpg|image/jpeg|720|1280|0|123769||1637505004|1591123521000|0|0|0|0|||||||| +4682|6984|content://media/external/images/media/6984|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0032.jpg|image/jpeg|972|1296|0|173269||1637518222|1591123478000|0|0|0|0|||||||| +4683|6552|content://media/external/images/media/6552|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0031.jpg|image/jpeg|1200|1600|0|290197||1637518221|1591123477000|0|0|0|0|||||||| +4684|6754|content://media/external/images/media/6754|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0030.jpg|image/jpeg|1200|1600|0|221240||1637518222|1591123476000|0|0|0|0|||||||| +4685|6983|content://media/external/images/media/6983|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0029.jpg|image/jpeg|1200|1600|0|248947||1637518222|1591123475000|0|0|0|0|||||||| +4686|6222|content://media/external/images/media/6222|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0028.jpg|image/jpeg|1200|1600|0|250257||1637518221|1591123474000|0|0|0|0|||||||| +4687|6982|content://media/external/images/media/6982|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0027.jpg|image/jpeg|1200|1600|0|189014||1637518222|1591123473000|0|0|0|0|||||||| +4688|6549|content://media/external/images/media/6549|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0026.jpg|image/jpeg|972|1296|0|150933||1637518221|1591123472000|0|0|0|0|||||||| +4689|6753|content://media/external/images/media/6753|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0025.jpg|image/jpeg|1296|729|0|146576||1637518222|1591123352000|0|0|0|0|||||||| +4690|6441|content://media/external/images/media/6441|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0024.jpg|image/jpeg|1600|900|0|272607||1637518221|1591121932000|0|0|0|0|||||||| +4691|6328|content://media/external/images/media/6328|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0023.jpg|image/jpeg|1600|900|0|309178||1637518221|1591121931000|0|0|0|0|||||||| +4692|6326|content://media/external/images/media/6326|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0021.jpg|image/jpeg|1600|900|0|212692||1637518221|1591121930000|0|0|0|0|||||||| +4693|6981|content://media/external/images/media/6981|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0022.jpg|image/jpeg|1600|900|0|168951||1637518222|1591121930000|0|0|0|0|||||||| +4694|6547|content://media/external/images/media/6547|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0020.jpg|image/jpeg|1600|900|0|280720||1637518221|1591121929000|0|0|0|0|||||||| +4695|6979|content://media/external/images/media/6979|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0019.jpg|image/jpeg|1600|900|0|242068||1637518222|1591121928000|0|0|0|0|||||||| +4696|6325|content://media/external/images/media/6325|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0015.jpg|image/jpeg|899|1600|0|160757||1637518221|1591104052000|0|0|0|0|||||||| +4697|6545|content://media/external/images/media/6545|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0014.jpg|image/jpeg|1599|1200|0|383727||1637518221|1591100525000|0|0|0|0|||||||| +4698|6978|content://media/external/images/media/6978|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0013.jpg|image/jpeg|1599|1200|0|378001||1637518222|1591100525000|0|0|0|0|||||||| +4699|6219|content://media/external/images/media/6219|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0012.jpg|image/jpeg|1599|1200|0|566877||1637518221|1591100524000|0|0|0|0|||||||| +4700|6323|content://media/external/images/media/6323|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0010.jpg|image/jpeg|1599|1200|0|284198||1637518221|1591100523000|0|0|0|0|||||||| +4701|6440|content://media/external/images/media/6440|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0011.jpg|image/jpeg|1599|1200|0|342186||1637518221|1591100523000|0|0|0|0|||||||| +4702|2966|content://media/external/images/media/2966|/storage/emulated/0/DCIM/Camera/IMG_20200602_132818.jpg|image/jpeg|4000|2250|90|4675914||1637501684|1591097301000|1591097301214|0|0|0|||||||| +4703|4224|content://media/external/images/media/4224|/storage/emulated/0/DCIM/Camera/IMG_20200602_132819.jpg|image/jpeg|4000|2250|90|4661512||1637504726|1591097301000|1591097301088|0|0|0|||||||| +4704|6974|content://media/external/images/media/6974|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0008.jpg|image/jpeg|768|1024|0|131803||1637518222|1591095559000|0|0|0|0|||||||| +4705|6975|content://media/external/images/media/6975|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0009.jpg|image/jpeg|768|1024|0|110627||1637518222|1591095559000|0|0|0|0|||||||| +4706|6546|content://media/external/images/media/6546|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0007.jpg|image/jpeg|768|1024|0|134302||1637518221|1591095558000|0|0|0|0|||||||| +4707|6973|content://media/external/images/media/6973|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200602-WA0006.jpg|image/jpeg|768|1024|0|111507||1637518222|1591095557000|0|0|0|0|||||||| +4708|4152|content://media/external/images/media/4152|/storage/emulated/0/DCIM/Camera/IMG_20200602_104152.jpg|image/jpeg|4000|2250|0|7364586||1637504481|1591087315000|1591087314949|0|0|0|||||||| +4709|3302|content://media/external/images/media/3302|/storage/emulated/0/DCIM/Camera/IMG_20200602_104137.jpg|image/jpeg|4000|2250|90|7339642||1637502430|1591087299000|1591087299030|0|0|0|||||||| +4710|4353|content://media/external/images/media/4353|/storage/emulated/0/DCIM/Camera/IMG_20200602_103744.jpg|image/jpeg|4000|2250|0|7368172||1637504970|1591087067000|1591087067789|0|0|0|||||||| +4711|3577|content://media/external/images/media/3577|/storage/emulated/0/DCIM/Camera/IMG_20200602_103726.jpg|image/jpeg|4160|2340|0|6355425||1637503154|1591087046000|1591087046802|0|0|0|||||||| +4712|4281|content://media/external/images/media/4281|/storage/emulated/0/DCIM/Camera/IMG_20200602_103604.jpg|image/jpeg|4000|2250|90|5737335||1637504807|1591086966000|1591086966839|0|0|0|||||||| +4713|3451|content://media/external/images/media/3451|/storage/emulated/0/DCIM/Camera/IMG_20200602_103552.jpg|image/jpeg|4160|2340|90|6469034||1637502804|1591086952000|1591086952709|0|0|0|||||||| +4714|3088|content://media/external/images/media/3088|/storage/emulated/0/DCIM/Camera/IMG_20200602_103516.jpg|image/jpeg|4000|2250|0|6798601||1637501971|1591086919000|1591086918976|0|0|0|||||||| +4715|3285|content://media/external/images/media/3285|/storage/emulated/0/DCIM/Camera/IMG_20200602_093331.jpg|image/jpeg|5184|3880|270|6939242||1637502355|1591083213000|1591083213758|0|0|0|||||||| +4716|4076|content://media/external/images/media/4076|/storage/emulated/0/DCIM/Camera/IMG_20200602_093318.jpg|image/jpeg|4160|2340|90|6081638||1637504394|1591083198000|1591083197811|0|0|0|||||||| +4717|2693|content://media/external/images/media/2693|/storage/emulated/0/Pictures/Suunto/sportie_d65f2fd9.jpg|image/jpeg|1080|1080|0|173529||1637500871|1590942522000|0|0|0|0|||||||| +4718|6858|content://media/external/images/media/6858|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200531-WA0013.jpg|image/jpeg|900|1600|0|142384||1637518222|1590924065000|0|0|0|0|||||||| +4719|6747|content://media/external/images/media/6747|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200531-WA0011.jpg|image/jpeg|900|1600|0|170137||1637518222|1590920465000|0|0|0|0|||||||| +4720|6971|content://media/external/images/media/6971|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200531-WA0008.jpeg|image/jpeg|4000|2250|0|778050||1637518222|1590920041000|0|0|0|0|||||||| +4721|3922|content://media/external/images/media/3922|/storage/emulated/0/DCIM/Camera/IMG_20200531_121020.jpg|image/jpeg|4000|2250|90|4533926||1637503834|1590919822000|1590919821933|0|0|0|||||||| +4722|2732|content://media/external/images/media/2732|/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-05-30-20-00-03-432_com.brytonsport.active.jpg|image/jpeg|1080|2340|0|483115||1637500987|1590861603000|0|0|0|0|||||||| +4723|2825|content://media/external/images/media/2825|/storage/emulated/0/DCIM/Camera/IMG_20200530_162433.jpg|image/jpeg|4000|2250|90|4495934||1637501369|1590848674000|1590848674858|0|0|0|||||||| +4724|4754|content://media/external/images/media/4754|/storage/emulated/0/DCIM/Camera/IMG_20200530_162426.jpg|image/jpeg|4000|2250|90|4377923||1637505639|1590848668000|1590848668235|0|0|0|||||||| +4725|2731|content://media/external/images/media/2731|/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-05-30-14-16-20-118_com.brytonsport.active.jpg|image/jpeg|1080|2340|0|621039||1637500987|1590840980000|0|0|0|0|||||||| +4726|6543|content://media/external/images/media/6543|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200526-WA0010.jpg|image/jpeg|1080|1350|0|133191||1637518221|1590493313000|0|0|0|0|||||||| +4727|4995|content://media/external/images/media/4995|/storage/emulated/0/DCIM/Camera/IMG_20200524_181131.jpg|image/jpeg|4000|2250|0|5206740||1637506101|1590336692000|1590336692383|0|0|0|||||||| +4728|4434|content://media/external/images/media/4434|/storage/emulated/0/DCIM/Camera/IMG_20200524_181120.jpg|image/jpeg|4000|2250|90|4306390||1637505068|1590336682000|1590336682737|0|0|0|||||||| +4729|4908|content://media/external/images/media/4908|/storage/emulated/0/DCIM/Camera/IMG_20200524_121527.jpg|image/jpeg|5184|3880|0|5272813||1637505944|1590315329000|1590230355241|0|0|0|||||||| +4730|6857|content://media/external/images/media/6857|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200523-WA0013.jpg|image/jpeg|900|1600|0|236318||1637518222|1590254932000|0|0|0|0|||||||| +4731|6647|content://media/external/images/media/6647|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200523-WA0012.jpg|image/jpeg|900|1600|0|265438||1637518221|1590254931000|0|0|0|0|||||||| +4732|6001|content://media/external/images/media/6001|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200523-WA0011.jpg|image/jpeg|900|1600|0|249813||1637518220|1590254930000|0|0|0|0|||||||| +4733|6002|content://media/external/images/media/6002|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200523-WA0010.jpg|image/jpeg|1600|900|0|233007||1637518220|1590254929000|0|0|0|0|||||||| +4734|6434|content://media/external/images/media/6434|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200523-WA0009.jpg|image/jpeg|1600|900|0|192621||1637518221|1590254928000|0|0|0|0|||||||| +4735|3434|content://media/external/images/media/3434|/storage/emulated/0/DCIM/Camera/IMG_20200523_123941.jpg|image/jpeg|4000|2250|90|5101895||1637502783|1590242803000|1590230385816|0|0|0|||||||| +4736|3681|content://media/external/images/media/3681|/storage/emulated/0/DCIM/Camera/IMG_20200523_123905.jpg|image/jpeg|5184|3880|180|5851651||1637503389|1590242803000|1590230347453|0|0|0|||||||| +4737|2874|content://media/external/images/media/2874|/storage/emulated/0/DCIM/Camera/IMG_20200523_145820.jpg|image/jpeg|4000|2250|0|5146040||1637501460|1590238701000|1590238701756|0|0|0|||||||| +4738|4817|content://media/external/images/media/4817|/storage/emulated/0/DCIM/Camera/IMG_20200523_145804.jpg|image/jpeg|4000|2250|90|5600458||1637505730|1590238686000|1590238686192|0|0|0|||||||| +4739|6000|content://media/external/images/media/6000|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200523-WA0007.jpg|image/jpeg|1600|1202|0|200064||1637518220|1590235905000|0|0|0|0|||||||| +4740|6217|content://media/external/images/media/6217|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200523-WA0005.jpg|image/jpeg|1080|1080|0|540682||1637518221|1590230531000|0|0|0|0|||||||| +4741|6855|content://media/external/images/media/6855|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200521-WA0000.jpg|image/jpeg|750|1334|0|93072||1637518222|1590046855000|0|0|0|0|||||||| +4742|3655|content://media/external/images/media/3655|/storage/emulated/0/DCIM/Camera/IMG_20200519_175140.jpg|image/jpeg|4000|2250|90|4840618||1637503358|1589903502000|1589903501930|0|0|0|||||||| +4743|6970|content://media/external/images/media/6970|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200516-WA0015.jpg|image/jpeg|900|1600|0|152344||1637518222|1589699164000|0|0|0|0|||||||| +4744|6969|content://media/external/images/media/6969|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200516-WA0001.jpeg|image/jpeg|2250|4000|0|1043863||1637518222|1589625924000|0|0|0|0|||||||| +4745|6542|content://media/external/images/media/6542|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200510-WA0020.jpg|image/jpeg|1200|1600|0|233492||1637518221|1589121328000|0|0|0|0|||||||| +4746|4776|content://media/external/images/media/4776|/storage/emulated/0/DCIM/Camera/IMG_20200510_120915.jpg|image/jpeg|4000|2250|90|4208383||1637505656|1589105360000|1589105360073|0|0|0|||||||| +4747|4223|content://media/external/images/media/4223|/storage/emulated/0/DCIM/Camera/IMG_20200509_145516.jpg|image/jpeg|5184|3880|0|5882348||1637504726|1589032652000|1589028918677|0|0|0|||||||| +4748|4452|content://media/external/images/media/4452|/storage/emulated/0/DCIM/Camera/IMG_20200509_145832.jpg|image/jpeg|4000|2250|0|6350227||1637505068|1589032652000|1589029115320|0|0|0|||||||| +4749|3619|content://media/external/images/media/3619|/storage/emulated/0/DCIM/Camera/IMG_20200507_191103.jpg|image/jpeg|4000|2250|90|4619129||1637503271|1588871465000|1588871465068|0|0|0|||||||| +4750|4075|content://media/external/images/media/4075|/storage/emulated/0/DCIM/Camera/IMG_20200506_180208.jpg|image/jpeg|4000|2250|0|3385426||1637504394|1588780931000|1588780930863|0|0|0|||||||| +4751|4605|content://media/external/images/media/4605|/storage/emulated/0/DCIM/Camera/IMG_20200506_134800.jpg|image/jpeg|4000|2250|0|4110083||1637505308|1588765682000|1588765681989|0|0|0|||||||| +4752|4862|content://media/external/images/media/4862|/storage/emulated/0/DCIM/Camera/IMG_20200506_134747.jpg|image/jpeg|4000|2250|0|3984697||1637505831|1588765668000|1588765668745|0|0|0|||||||| +4753|2646|content://media/external/images/media/2646|/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-05-01-14-19-34-148_com.orbit.orbitsmarthome.jpg|image/jpeg|1080|2340|0|852693||1637500870|1588335574000|0|0|0|0|||||||| +4754|2645|content://media/external/images/media/2645|/storage/emulated/0/DCIM/Screenshots/Screenshot_2020-04-29-15-08-02-092_com.android.browser.jpg|image/jpeg|1080|2340|0|587897||1637500870|1588165682000|0|0|0|0|||||||| +4755|2843|content://media/external/images/media/2843|/storage/emulated/0/DCIM/Camera/IMG_20200426_133810.jpg|image/jpeg|4000|2250|90|4616959||1637501431|1587901092000|1587901092151|0|0|0|||||||| +4756|3806|content://media/external/images/media/3806|/storage/emulated/0/DCIM/Camera/IMG_20200425_203214.jpg|image/jpeg|4160|2340|0|4166710||1637503601|1587839534000|1587839534209|0|0|0|||||||| +4757|3510|content://media/external/images/media/3510|/storage/emulated/0/DCIM/Camera/IMG_20200425_203209.jpg|image/jpeg|4160|2340|0|4271375||1637502969|1587839529000|1587839529879|0|0|0|||||||| +4758|4542|content://media/external/images/media/4542|/storage/emulated/0/DCIM/Camera/IMG_20200425_203201.jpg|image/jpeg|4160|2340|0|4849016||1637505187|1587839521000|1587839520955|0|0|0|||||||| +4759|3433|content://media/external/images/media/3433|/storage/emulated/0/DCIM/Camera/IMG_20200425_202832.jpg|image/jpeg|4160|2340|0|3355473||1637502783|1587839313000|1587839312896|0|0|0|||||||| +4760|6432|content://media/external/images/media/6432|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200425-WA0071.jpg|image/jpeg|901|1600|0|180340||1637518221|1587838835000|0|0|0|0|||||||| +4761|5996|content://media/external/images/media/5996|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200425-WA0055.jpg|image/jpeg|1200|1600|0|169935||1637518220|1587829202000|0|0|0|0|||||||| +4762|4018|content://media/external/images/media/4018|/storage/emulated/0/DCIM/Camera/IMG_20200425_173659.jpg|image/jpeg|4000|2250|90|5081431||1637504201|1587829022000|1587829022104|0|0|0|||||||| +4763|6854|content://media/external/images/media/6854|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200425-WA0005.jpg|image/jpeg|1512|2016|0|189713||1637518222|1587800995000|0|0|0|0|||||||| +4764|6540|content://media/external/images/media/6540|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200424-WA0038.jpg|image/jpeg|512|512|0|28255||1637518221|1587754225000|0|0|0|0|||||||| +4765|6429|content://media/external/images/media/6429|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0044.jpg|image/jpeg|768|1280|0|88662||1637518221|1587670348000|0|0|0|0|||||||| +4766|6965|content://media/external/images/media/6965|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0043.jpg|image/jpeg|960|1600|0|129377||1637518222|1587670104000|0|0|0|0|||||||| +4767|6966|content://media/external/images/media/6966|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0042.jpg|image/jpeg|1600|960|0|136539||1637518222|1587670011000|0|0|0|0|||||||| +4768|2614|content://media/external/images/media/2614|/storage/emulated/0/DCIM/Facebook/FB_IMG_1587669920344.jpg|image/jpeg|1080|810|0|131574||1637500870|1587669920000|0|0|0|0|||||||| +4769|6642|content://media/external/images/media/6642|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0040.jpg|image/jpeg|1600|960|0|121809||1637518221|1587669598000|0|0|0|0|||||||| +4770|2613|content://media/external/images/media/2613|/storage/emulated/0/DCIM/Facebook/FB_IMG_1587667814505.jpg|image/jpeg|1080|2038|0|146093||1637500870|1587667814000|0|0|0|0|||||||| +4771|5994|content://media/external/images/media/5994|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0023.jpg|image/jpeg|1600|1200|0|271186||1637518220|1587667494000|0|0|0|0|||||||| +4772|6643|content://media/external/images/media/6643|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0024.jpg|image/jpeg|1600|1200|0|244565||1637518221|1587667494000|0|0|0|0|||||||| +4773|5992|content://media/external/images/media/5992|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0022.jpg|image/jpeg|1200|1600|0|200196||1637518220|1587667493000|0|0|0|0|||||||| +4774|2612|content://media/external/images/media/2612|/storage/emulated/0/DCIM/Facebook/FB_IMG_1587666986060.jpg|image/jpeg|960|720|0|56295||1637500870|1587666986000|0|0|0|0|||||||| +4775|2611|content://media/external/images/media/2611|/storage/emulated/0/DCIM/Facebook/FB_IMG_1587666955966.jpg|image/jpeg|542|542|0|52891||1637500870|1587666955000|0|0|0|0|||||||| +4776|6538|content://media/external/images/media/6538|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0013.jpg|image/jpeg|768|1024|0|104574||1637518221|1587662382000|0|0|0|0|||||||| +4777|6962|content://media/external/images/media/6962|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200423-WA0012.jpg|image/jpeg|576|1024|0|79398||1637518222|1587662381000|0|0|0|0|||||||| +4778|2779|content://media/external/images/media/2779|/storage/emulated/0/DCIM/Camera/IMG_20200422_173454.jpg|image/jpeg|4000|2250|90|4562248||1637501282|1587569696000|1587569696421|0|0|0|||||||| +4779|6685|content://media/external/images/media/6685|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG_20200421_194936.jpg|image/jpeg|1600|899|0|380196||1637518222|1587491376000|0|0|0|0|||||||| +4780|6213|content://media/external/images/media/6213|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200307-WA0062.jpg|image/jpeg|768|1024|0|112798||1637518221|1587406448000|0|0|0|0|||||||| +4781|6852|content://media/external/images/media/6852|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200420-WA0026.jpg|image/jpeg|1200|1600|0|283402||1637518222|1587406301000|0|0|0|0|||||||| +4782|4861|content://media/external/images/media/4861|/storage/emulated/0/DCIM/Camera/IMG_20200419_214727.jpg|image/jpeg|2115|3087|0|2585116||1637505831|1587325648000|1584286717363|0|0|0|||||||| +4783|2859|content://media/external/images/media/2859|/storage/emulated/0/DCIM/Camera/IMG_20200418_153505.jpg|image/jpeg|4000|2250|0|4057550||1637501457|1587216907000|1587216907796|0|0|0|||||||| +4784|4151|content://media/external/images/media/4151|/storage/emulated/0/DCIM/Camera/IMG_20200415_145156.jpg|image/jpeg|4000|2250|90|4577363||1637504481|1586955118000|1586955118800|0|0|0|||||||| +4785|4262|content://media/external/images/media/4262|/storage/emulated/0/DCIM/Camera/IMG_20200415_090154.jpg|image/jpeg|4000|2250|0|4880863||1637504756|1586934117000|1586934117333|0|0|0|||||||| +4786|4713|content://media/external/images/media/4713|/storage/emulated/0/DCIM/Camera/IMG_20200415_090137.jpg|image/jpeg|4000|2250|90|5456307||1637505565|1586934101000|1586934101428|0|0|0|||||||| +4787|6428|content://media/external/images/media/6428|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200412-WA0101.jpg|image/jpeg|1200|1600|0|246296||1637518221|1586720254000|0|0|0|0|||||||| +4788|3319|content://media/external/images/media/3319|/storage/emulated/0/DCIM/Camera/IMG_20200412_163922.jpg|image/jpeg|4000|2250|0|5824637||1637502438|1586702364000|1586702364589|0|0|0|||||||| +4789|4202|content://media/external/images/media/4202|/storage/emulated/0/DCIM/Camera/IMG_20200412_163856.jpg|image/jpeg|4000|2250|90|5050067||1637504640|1586702341000|1586702341241|0|0|0|||||||| +4790|4775|content://media/external/images/media/4775|/storage/emulated/0/DCIM/Camera/IMG_20200412_133302.jpg|image/jpeg|4000|2250|90|2907598||1637505656|1586691185000|1586691185281|0|0|0|||||||| +4791|5991|content://media/external/images/media/5991|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200412-WA0076.jpeg|image/jpeg|4000|2250|0|1726363||1637518220|1586689341000|0|0|0|0|||||||| +4792|6109|content://media/external/images/media/6109|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200412-WA0075.jpg|image/jpeg|899|1600|0|127651||1637518220|1586689320000|0|0|0|0|||||||| +4793|4344|content://media/external/images/media/4344|/storage/emulated/0/DCIM/Camera/IMG_20200412_124212.jpg|image/jpeg|4000|2250|0|4675874||1637504906|1586688134000|1586688134124|0|0|0|||||||| +4794|4541|content://media/external/images/media/4541|/storage/emulated/0/DCIM/Camera/IMG_20200412_124045.jpg|image/jpeg|4000|2250|0|5033715||1637505187|1586688047000|1586688047212|0|0|0|||||||| +4795|3744|content://media/external/images/media/3744|/storage/emulated/0/DCIM/Camera/IMG_20200412_122007.jpg|image/jpeg|4000|2250|0|5647330||1637503488|1586686809000|1586686809576|0|0|0|||||||| +4796|2981|content://media/external/images/media/2981|/storage/emulated/0/DCIM/Camera/IMG_20200412_121954.jpg|image/jpeg|4000|2250|0|5679131||1637501771|1586686797000|1586686797289|0|0|0|||||||| +4797|5896|content://media/external/images/media/5896|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200411-WA0010.jpeg|image/jpeg|2250|4000|0|915966||1637518220|1586601949000|0|0|0|0|||||||| +4798|4561|content://media/external/images/media/4561|/storage/emulated/0/DCIM/Camera/IMG_20200408_221839.jpg|image/jpeg|197|140|0|6372||1637505216|1586377119000|1586376666219|0|0|0|||||||| +4799|3870|content://media/external/images/media/3870|/storage/emulated/0/DCIM/Camera/IMG_20200404_190918.jpg|image/jpeg|4000|2250|0|4858940||1637503729|1586020161000|1586020161091|0|0|0|||||||| +4800|3921|content://media/external/images/media/3921|/storage/emulated/0/DCIM/Camera/IMG_20200404_123937.jpg|image/jpeg|4000|2250|0|4385355||1637503834|1585996778000|1585996778466|0|0|0|||||||| +4801|2965|content://media/external/images/media/2965|/storage/emulated/0/DCIM/Camera/IMG_20200404_123911.jpg|image/jpeg|4160|2340|0|4727186||1637501684|1585996751000|1585996751756|0|0|0|||||||| +4802|3066|content://media/external/images/media/3066|/storage/emulated/0/DCIM/Camera/IMG_20200404_110154.jpg|image/jpeg|4000|2250|90|4394520||1637501905|1585990917000|1585990917118|0|0|0|||||||| +4803|3468|content://media/external/images/media/3468|/storage/emulated/0/DCIM/Camera/IMG_20200404_105518.jpg|image/jpeg|4000|2250|90|4014976||1637502817|1585990520000|1585990520561|0|0|0|||||||| +4804|6107|content://media/external/images/media/6107|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200329-WA0046.jpg|image/jpeg|960|1280|0|103983||1637518220|1585511598000|0|0|0|0|||||||| +4805|5989|content://media/external/images/media/5989|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200327-WA0010.jpeg|image/jpeg|4000|2250|0|1204082||1637518220|1585311094000|0|0|0|0|||||||| +4806|6104|content://media/external/images/media/6104|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200327-WA0007.jpeg|image/jpeg|4000|2250|0|1083594||1637518220|1585309682000|0|0|0|0|||||||| +4807|2842|content://media/external/images/media/2842|/storage/emulated/0/DCIM/Camera/IMG_20200322_121826.jpg|image/jpeg|2403|2250|0|1957376||1637501431|1584875906000|1584875873300|0|0|0|||||||| +4808|2841|content://media/external/images/media/2841|/storage/emulated/0/DCIM/Camera/IMG_20200322_121659.jpg|image/jpeg|4000|2250|0|4563620||1637501431|1584875822000|1584875822593|0|0|0|||||||| +4809|4753|content://media/external/images/media/4753|/storage/emulated/0/DCIM/Camera/IMG_20200322_102743.jpg|image/jpeg|4000|2250|0|3423021||1637505639|1584869264000|1584869237674|0|0|0|||||||| +4810|4017|content://media/external/images/media/4017|/storage/emulated/0/DCIM/Camera/IMG_20200321_190755.jpg|image/jpeg|4000|2250|0|4521215||1637504201|1584814078000|1584814078438|0|0|0|||||||| +4811|3888|content://media/external/images/media/3888|/storage/emulated/0/DCIM/Camera/IMG_20200321_165338.jpg|image/jpeg|4000|2250|0|4824561||1637503732|1584806021000|1584806021136|0|0|0|||||||| +4812|3763|content://media/external/images/media/3763|/storage/emulated/0/DCIM/Camera/IMG_20200320_215811.jpg|image/jpeg|4000|2250|0|4741574||1637503508|1584737894000|1584737893887|0|0|0|||||||| +4813|3955|content://media/external/images/media/3955|/storage/emulated/0/DCIM/Camera/IMG_20200318_181430.jpg|image/jpeg|4000|2250|90|2634074||1637503942|1584551672000|1584551672007|0|0|0|||||||| +4814|3262|content://media/external/images/media/3262|/storage/emulated/0/DCIM/Camera/IMG_20200318_181412.jpg|image/jpeg|4000|2250|90|5020313||1637502342|1584551654000|1584551654262|0|0|0|||||||| +4815|4150|content://media/external/images/media/4150|/storage/emulated/0/DCIM/Camera/IMG_20200318_181358.jpg|image/jpeg|4000|2250|90|2597492||1637504481|1584551640000|1584551640315|0|0|0|||||||| +4816|3103|content://media/external/images/media/3103|/storage/emulated/0/DCIM/Camera/IMG_20200318_181352.jpg|image/jpeg|4000|2250|90|2637519||1637502054|1584551634000|1584551634797|0|0|0|||||||| +4817|3338|content://media/external/images/media/3338|/storage/emulated/0/DCIM/Camera/IMG_20200315_182059.jpg|image/jpeg|4000|2250|0|4662485||1637502439|1584292861000|1584292861352|0|0|0|||||||| +4818|5889|content://media/external/images/media/5889|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200307-WA0063.jpg|image/jpeg|768|1024|0|114369||1637518220|1584291088000|0|0|0|0|||||||| +4819|4843|content://media/external/images/media/4843|/storage/emulated/0/DCIM/Camera/IMG_20200315_110555.jpg|image/jpeg|4000|2250|0|4534974||1637505753|1584266757000|1584266757260|0|0|0|||||||| +4820|3722|content://media/external/images/media/3722|/storage/emulated/0/DCIM/Camera/IMG_20200314_210935.jpg|image/jpeg|4000|2250|0|4584736||1637503477|1584216576000|1584216576184|0|0|0|||||||| +4821|2840|content://media/external/images/media/2840|/storage/emulated/0/DCIM/Camera/IMG_20200314_210912.jpg|image/jpeg|4000|2250|0|4840581||1637501431|1584216553000|1584216553889|0|0|0|||||||| +4822|2824|content://media/external/images/media/2824|/storage/emulated/0/DCIM/Camera/IMG_20200314_210902.jpg|image/jpeg|4000|2250|0|4286702||1637501369|1584216543000|1584216543605|0|0|0|||||||| +4823|5937|content://media/external/images/media/5937|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190924-WA0009.jpg|image/jpeg|1600|1200|0|228971||1637518220|1583870715000|0|0|0|0|||||||| +4824|6103|content://media/external/images/media/6103|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0090.jpg|image/jpeg|1280|960|0|141759||1637518220|1583702492000|0|0|0|0|||||||| +4825|6537|content://media/external/images/media/6537|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0088.jpg|image/jpeg|1201|1600|0|135325||1637518221|1583697668000|0|0|0|0|||||||| +4826|5892|content://media/external/images/media/5892|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0040.jpg|image/jpeg|1200|1600|0|290604||1637518220|1583663948000|0|0|0|0|||||||| +4827|6536|content://media/external/images/media/6536|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0039.jpg|image/jpeg|1200|1600|0|384201||1637518221|1583663947000|0|0|0|0|||||||| +4828|5985|content://media/external/images/media/5985|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0037.jpg|image/jpeg|1200|1600|0|215545||1637518220|1583663946000|0|0|0|0|||||||| +4829|6535|content://media/external/images/media/6535|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0038.jpg|image/jpeg|1200|1600|0|211844||1637518221|1583663946000|0|0|0|0|||||||| +4830|6100|content://media/external/images/media/6100|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0036.jpg|image/jpeg|1200|1600|0|264822||1637518220|1583663945000|0|0|0|0|||||||| +4831|6099|content://media/external/images/media/6099|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200308-WA0035.jpg|image/jpeg|1600|1200|0|277137||1637518220|1583663944000|0|0|0|0|||||||| +4832|3467|content://media/external/images/media/3467|/storage/emulated/0/DCIM/Camera/IMG_20200308_112301.jpg|image/jpeg|3419|1322|0|1707478||1637502817|1583662982000|1583662925105|0|0|0|||||||| +4833|4321|content://media/external/images/media/4321|/storage/emulated/0/DCIM/Camera/IMG_20200308_112202.jpg|image/jpeg|4000|2250|0|4839964||1637504895|1583662925000|1583662925105|0|0|0|||||||| +4834|4412|content://media/external/images/media/4412|/storage/emulated/0/DCIM/Camera/IMG_20200308_105340.jpg|image/jpeg|4000|2250|0|6154769||1637505063|1583661221000|1583661221614|0|0|0|||||||| +4835|4320|content://media/external/images/media/4320|/storage/emulated/0/DCIM/Camera/IMG_20200308_105331.jpg|image/jpeg|4160|2340|0|5657459||1637504894|1583661211000|1583661211704|0|0|0|||||||| +4836|2870|content://media/external/images/media/2870|/storage/emulated/0/DCIM/Camera/PANO_20200308_104747.jpg|image/jpeg|9808|3776|0|10235689||1637501458|1583660877000|0|0|0|0|||||||| +4837|3887|content://media/external/images/media/3887|/storage/emulated/0/DCIM/Camera/IMG_20200308_104742.jpg|image/jpeg|4160|2340|0|5740160||1637503732|1583660862000|1583660862440|0|0|0|||||||| +4838|3550|content://media/external/images/media/3550|/storage/emulated/0/DCIM/Camera/IMG_20200308_104720.jpg|image/jpeg|4000|2250|90|5461452||1637503058|1583660843000|1583660843905|0|0|0|||||||| +4839|6534|content://media/external/images/media/6534|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200307-WA0002.jpg|image/jpeg|768|1024|0|160508||1637518221|1583567554000|0|0|0|0|||||||| +4840|4307|content://media/external/images/media/4307|/storage/emulated/0/DCIM/Camera/IMG_20200305_223941.jpg|image/jpeg|4000|2250|0|3806563||1637504817|1583444383000|1583444383460|0|0|0|||||||| +4841|6098|content://media/external/images/media/6098|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200301-WA0007.jpg|image/jpeg|1200|1600|0|129385||1637518220|1583058739000|0|0|0|0|||||||| +4842|3743|content://media/external/images/media/3743|/storage/emulated/0/DCIM/Camera/IMG_20200229_103703.jpg|image/jpeg|4000|2250|0|4315800||1637503488|1582969024000|1582969024205|0|0|0|||||||| +4843|4971|content://media/external/images/media/4971|/storage/emulated/0/DCIM/Camera/IMG_20200229_100539.jpg|image/jpeg|4000|2250|180|4276719||1637506097|1582967141000|1582967141093|0|0|0|||||||| +4844|4035|content://media/external/images/media/4035|/storage/emulated/0/DCIM/Camera/IMG_20200222_211735.jpg|image/jpeg|4000|2250|0|4860476||1637504234|1582402657000|1582402656950|0|0|0|||||||| +4845|3699|content://media/external/images/media/3699|/storage/emulated/0/DCIM/Camera/IMG_20200217_210909.jpg|image/jpeg|4000|2250|0|4695962||1637503392|1581970150000|1581970150912|0|0|0|||||||| +4846|4433|content://media/external/images/media/4433|/storage/emulated/0/DCIM/Camera/IMG_20200216_093111.jpg|image/jpeg|4000|2250|0|4719905||1637505068|1581841872000|1581841872891|0|0|0|||||||| +4847|2801|content://media/external/images/media/2801|/storage/emulated/0/DCIM/Camera/IMG_20200216_093053.jpg|image/jpeg|5184|3880|0|7421209||1637501311|1581841855000|1581841855885|0|0|0|||||||| +4848|2610|content://media/external/images/media/2610|/storage/emulated/0/DCIM/Facebook/FB_IMG_1581761530510.jpg|image/jpeg|1080|763|0|107977||1637500870|1581761530000|0|0|0|0|||||||| +4849|2609|content://media/external/images/media/2609|/storage/emulated/0/DCIM/Facebook/FB_IMG_1581761527395.jpg|image/jpeg|1080|763|0|115535||1637500870|1581761527000|0|0|0|0|||||||| +4850|2702|content://media/external/images/media/2702|/storage/emulated/0/DCIM/Screenshots/IMG_20200209_184433.jpg|image/jpeg|1058|926|0|369519||1637500987|1581270273000|0|0|0|0|||||||| +4851|2701|content://media/external/images/media/2701|/storage/emulated/0/DCIM/Screenshots/IMG_20200209_184413.jpg|image/jpeg|1048|912|0|264183||1637500987|1581270253000|0|0|0|0|||||||| +4852|4343|content://media/external/images/media/4343|/storage/emulated/0/DCIM/Camera/IMG_20200208_162012.jpg|image/jpeg|4160|2340|90|5360476||1637504906|1581175212000|1581175212706|0|0|0|||||||| +4853|3046|content://media/external/images/media/3046|/storage/emulated/0/DCIM/Camera/IMG_20200208_141847.jpg|image/jpeg|4160|2340|90|5328857||1637501858|1581167927000|1581167927141|0|0|0|||||||| +4854|4134|content://media/external/images/media/4134|/storage/emulated/0/DCIM/Camera/IMG_20200208_135407.jpg|image/jpeg|4000|2250|90|4865590||1637504473|1581166450000|1581166450238|0|0|0|||||||| +4855|4583|content://media/external/images/media/4583|/storage/emulated/0/DCIM/Camera/IMG_20200208_124405.jpg|image/jpeg|4160|2340|90|4875402||1637505278|1581162245000|1581162245430|0|0|0|||||||| +4856|5886|content://media/external/images/media/5886|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200208-WA0013.jpg|image/jpeg|1200|1600|0|206904||1637518220|1581161894000|0|0|0|0|||||||| +4857|5887|content://media/external/images/media/5887|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200208-WA0012.jpg|image/jpeg|1200|1600|0|273417||1637518220|1581161892000|0|0|0|0|||||||| +4858|5984|content://media/external/images/media/5984|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200208-WA0011.jpg|image/jpeg|1200|1600|0|360018||1637518220|1581161890000|0|0|0|0|||||||| +4859|6215|content://media/external/images/media/6215|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200208-WA0010.jpg|image/jpeg|1200|1600|0|206335||1637518221|1581161888000|0|0|0|0|||||||| +4860|5885|content://media/external/images/media/5885|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200208-WA0009.jpg|image/jpeg|1200|1600|0|219289||1637518220|1581161886000|0|0|0|0|||||||| +4861|6095|content://media/external/images/media/6095|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200208-WA0008.jpg|image/jpeg|1200|1600|0|245975||1637518220|1581161884000|0|0|0|0|||||||| +4862|4187|content://media/external/images/media/4187|/storage/emulated/0/DCIM/Camera/IMG_20200208_123603.jpg|image/jpeg|4160|2340|90|4529396||1637504558|1581161763000|1581161763562|0|0|0|||||||| +4863|3599|content://media/external/images/media/3599|/storage/emulated/0/DCIM/Camera/IMG_20200208_122942.jpg|image/jpeg|4160|2340|0|5338015||1637503238|1581161382000|1581161382702|0|0|0|||||||| +4864|3869|content://media/external/images/media/3869|/storage/emulated/0/DCIM/Camera/IMG_20200208_122939.jpg|image/jpeg|4160|2340|0|5340499||1637503729|1581161379000|1581161379073|0|0|0|||||||| +4865|4891|content://media/external/images/media/4891|/storage/emulated/0/DCIM/Camera/IMG_20200208_122143.jpg|image/jpeg|4000|2250|90|4403323||1637505920|1581160905000|1581160905474|0|0|0|||||||| +4866|5883|content://media/external/images/media/5883|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200208-WA0003.jpg|image/jpeg|1200|1600|0|221217||1637518220|1581160390000|0|0|0|0|||||||| +4867|4712|content://media/external/images/media/4712|/storage/emulated/0/DCIM/Camera/IMG_20200208_120850.jpg|image/jpeg|4000|2250|90|4338128||1637505565|1581160132000|1581160132647|0|0|0|||||||| +4868|4016|content://media/external/images/media/4016|/storage/emulated/0/DCIM/Camera/IMG_20200208_113307.jpg|image/jpeg|4160|2340|90|4879640||1637504201|1581157987000|1581157987555|0|0|0|||||||| +4869|2900|content://media/external/images/media/2900|/storage/emulated/0/DCIM/Camera/IMG_20200208_113259.jpg|image/jpeg|4160|2340|0|4528287||1637501534|1581157979000|1581157979071|0|0|0|||||||| +4870|3489|content://media/external/images/media/3489|/storage/emulated/0/DCIM/Camera/IMG_20200208_111425.jpg|image/jpeg|4000|2250|90|5172865||1637502870|1581156866000|1581156866358|0|0|0|||||||| +4871|4795|content://media/external/images/media/4795|/storage/emulated/0/DCIM/Camera/IMG_20200208_111424.jpg|image/jpeg|4000|2250|90|5193782||1637505663|1581156865000|1581156865140|0|0|0|||||||| +4872|2823|content://media/external/images/media/2823|/storage/emulated/0/DCIM/Camera/IMG_20200208_111421.jpg|image/jpeg|4000|2250|0|5004557||1637501369|1581156862000|1581156862638|0|0|0|||||||| +4873|5018|content://media/external/images/media/5018|/storage/emulated/0/DCIM/Camera/IMG_20200208_110150.jpg|image/jpeg|4160|2340|0|4271156||1637506134|1581156110000|1581156110115|0|0|0|||||||| +4874|5882|content://media/external/images/media/5882|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200201-WA0006.jpg|image/jpeg|1200|1600|0|216841||1637518220|1580580890000|0|0|0|0|||||||| +4875|3954|content://media/external/images/media/3954|/storage/emulated/0/DCIM/Camera/IMG_20200131_203415.jpg|image/jpeg|4160|2340|0|3371292||1637503942|1580499255000|1580499255528|0|0|0|||||||| +4876|3142|content://media/external/images/media/3142|/storage/emulated/0/DCIM/Camera/IMG_20200131_194920.jpg|image/jpeg|5184|3880|180|5327340||1637502130|1580496563000|1580496563506|0|0|0|||||||| +4877|5981|content://media/external/images/media/5981|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200128-WA0006.jpg|image/jpeg|960|1280|0|147447||1637518220|1580218548000|0|0|0|0|||||||| +4878|3638|content://media/external/images/media/3638|/storage/emulated/0/DCIM/Camera/IMG_20200127_201803.jpg|image/jpeg|4000|2250|0|4295970||1637503301|1580152685000|1580152685633|0|0|0|||||||| +4879|3868|content://media/external/images/media/3868|/storage/emulated/0/DCIM/Camera/IMG_20200118_144853.jpg|image/jpeg|4000|2250|90|4189569||1637503729|1579355336000|1579355336023|0|0|0|||||||| +4880|3184|content://media/external/images/media/3184|/storage/emulated/0/DCIM/Camera/IMG_20200118_124250.jpg|image/jpeg|4000|2250|0|4195863||1637502161|1579347771000|1579347771280|0|0|0|||||||| +4881|3065|content://media/external/images/media/3065|/storage/emulated/0/DCIM/Camera/IMG_20200118_124144.jpg|image/jpeg|4000|2250|0|4459870||1637501905|1579347705000|1579347705335|0|0|0|||||||| +4882|3920|content://media/external/images/media/3920|/storage/emulated/0/DCIM/Camera/IMG_20200118_124122.jpg|image/jpeg|4000|2250|0|4628620||1637503834|1579347683000|1579347683285|0|0|0|||||||| +4883|3045|content://media/external/images/media/3045|/storage/emulated/0/DCIM/Camera/IMG_20200118_124042.jpg|image/jpeg|4000|2250|0|5103933||1637501858|1579347644000|1579347644559|0|0|0|||||||| +4884|6094|content://media/external/images/media/6094|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200112-WA0006.jpg|image/jpeg|1600|1200|0|125032||1637518220|1578821888000|0|0|0|0|||||||| +4885|5978|content://media/external/images/media/5978|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200112-WA0005.jpg|image/jpeg|1600|1202|0|136548||1637518220|1578821887000|0|0|0|0|||||||| +4886|5980|content://media/external/images/media/5980|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200112-WA0004.jpg|image/jpeg|1600|1202|0|177285||1637518220|1578821885000|0|0|0|0|||||||| +4887|6092|content://media/external/images/media/6092|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200112-WA0003.jpg|image/jpeg|1600|1200|0|155353||1637518220|1578821882000|0|0|0|0|||||||| +4888|6209|content://media/external/images/media/6209|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200106-WA0040.jpg|image/jpeg|1600|1200|0|193192||1637518221|1578341724000|0|0|0|0|||||||| +4889|4015|content://media/external/images/media/4015|/storage/emulated/0/DCIM/Camera/IMG_20200106_211118.jpg|image/jpeg|4000|2250|90|3456598||1637504201|1578341480000|1578341480183|0|0|0|||||||| +4890|3397|content://media/external/images/media/3397|/storage/emulated/0/DCIM/Camera/IMG_20200105_201155.jpg|image/jpeg|4000|2250|90|3523439||1637502598|1578251517000|1578251517563|0|0|0|||||||| +4891|4201|content://media/external/images/media/4201|/storage/emulated/0/DCIM/Camera/IMG_20200104_100538.jpg|image/jpeg|4000|2250|0|7179346||1637504640|1578128739000|1578128739737|0|0|0|||||||| +4892|3762|content://media/external/images/media/3762|/storage/emulated/0/DCIM/Camera/IMG_20200104_100508.jpg|image/jpeg|4000|2250|90|6672112||1637503508|1578128709000|1578128709401|0|0|0|||||||| +4893|2778|content://media/external/images/media/2778|/storage/emulated/0/DCIM/Camera/IMG_20200104_100440.jpg|image/jpeg|4160|2340|90|6053410||1637501282|1578128680000|1578128680484|0|0|0|||||||| +4894|4280|content://media/external/images/media/4280|/storage/emulated/0/DCIM/Camera/IMG_20200104_100357.jpg|image/jpeg|4160|2340|0|8111907||1637504807|1578128637000|1578128637566|0|0|0|||||||| +4895|4522|content://media/external/images/media/4522|/storage/emulated/0/DCIM/Camera/IMG_20200104_100305.jpg|image/jpeg|4160|2340|0|6717042||1637505165|1578128585000|1578128585485|0|0|0|||||||| +4896|3919|content://media/external/images/media/3919|/storage/emulated/0/DCIM/Camera/IMG_20200104_100115.jpg|image/jpeg|4160|2340|0|6314736||1637503834|1578128475000|1578128475580|0|0|0|||||||| +4897|4133|content://media/external/images/media/4133|/storage/emulated/0/DCIM/Camera/IMG_20200104_095935.jpg|image/jpeg|4160|2340|0|4695918||1637504473|1578128375000|1578128374905|0|0|0|||||||| +4898|3918|content://media/external/images/media/3918|/storage/emulated/0/DCIM/Camera/IMG_20200104_092244.jpg|image/jpeg|4000|2250|90|4837094||1637503834|1578126166000|1578126165923|0|0|0|||||||| +4899|4675|content://media/external/images/media/4675|/storage/emulated/0/DCIM/Camera/IMG_20200104_091742.jpg|image/jpeg|4160|2340|0|3042839||1637505480|1578125862000|1578125862085|0|0|0|||||||| +4900|4306|content://media/external/images/media/4306|/storage/emulated/0/DCIM/Camera/IMG_20200104_091728.jpg|image/jpeg|4000|2250|90|4248896||1637504817|1578125851000|1578125851153|0|0|0|||||||| +4901|3488|content://media/external/images/media/3488|/storage/emulated/0/DCIM/Camera/IMG_20200103_204329.jpg|image/jpeg|4000|2250|0|4499214||1637502870|1578080610000|1578080610584|0|0|0|||||||| +4902|3698|content://media/external/images/media/3698|/storage/emulated/0/DCIM/Camera/IMG_20200103_194548.jpg|image/jpeg|4000|2250|0|5096837||1637503392|1578077150000|1578077150496|0|0|0|||||||| +4903|3559|content://media/external/images/media/3559|/storage/emulated/0/DCIM/Camera/PANO_20200103_185511.jpg|image/jpeg|6928|3616|0|5696149||1637503058|1578074121000|0|0|0|0|||||||| +4904|5979|content://media/external/images/media/5979|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20200101-WA0034.jpg|image/jpeg|1200|1600|0|167683||1637518220|1577893587000|0|0|0|0|||||||| +4905|3301|content://media/external/images/media/3301|/storage/emulated/0/DCIM/Camera/IMG_20191231_233621.jpg|image/jpeg|4000|2250|90|3099299||1637502430|1577831784000|1577831783991|0|0|0|||||||| +4906|3509|content://media/external/images/media/3509|/storage/emulated/0/DCIM/Camera/IMG_20191231_231940.jpg|image/jpeg|4000|2250|90|4518974||1637502969|1577830781000|1577830781088|0|0|0|||||||| +4907|4924|content://media/external/images/media/4924|/storage/emulated/0/DCIM/Camera/IMG_20191231_225715.jpg|image/jpeg|4000|2250|90|4075836||1637506010|1577829436000|1577829436213|0|0|0|||||||| +4908|4373|content://media/external/images/media/4373|/storage/emulated/0/DCIM/Camera/IMG_20191231_225704.jpg|image/jpeg|4000|2250|90|4704791||1637504982|1577829425000|1577829425407|0|0|0|||||||| +4909|3531|content://media/external/images/media/3531|/storage/emulated/0/DCIM/Camera/IMG_20191231_225630.jpg|image/jpeg|4000|2250|0|4340561||1637503010|1577829392000|1577829392022|0|0|0|||||||| +4910|5880|content://media/external/images/media/5880|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191231-WA0037.jpg|image/jpeg|900|1600|0|93045||1637518220|1577826923000|0|0|0|0|||||||| +4911|4034|content://media/external/images/media/4034|/storage/emulated/0/DCIM/Camera/IMG_20191231_221241.jpg|image/jpeg|4000|2250|90|4687612||1637504234|1577826763000|1577826763050|0|0|0|||||||| +4912|3576|content://media/external/images/media/3576|/storage/emulated/0/DCIM/Camera/IMG_20191231_221221.jpg|image/jpeg|4000|2250|90|4598844||1637503154|1577826743000|1577826743071|0|0|0|||||||| +4913|4503|content://media/external/images/media/4503|/storage/emulated/0/DCIM/Camera/IMG_20191231_220050.jpg|image/jpeg|4000|2250|90|4183079||1637505160|1577826051000|1577826051631|0|0|0|||||||| +4914|3300|content://media/external/images/media/3300|/storage/emulated/0/DCIM/Camera/IMG_20191230_212157.jpg|image/jpeg|4000|2250|0|5191818||1637502430|1577737319000|1577737318955|0|0|0|||||||| +4915|4502|content://media/external/images/media/4502|/storage/emulated/0/DCIM/Camera/IMG_20191230_165559.jpg|image/jpeg|4000|2250|0|6173529||1637505160|1577721361000|1577721361095|0|0|0|||||||| +4916|4582|content://media/external/images/media/4582|/storage/emulated/0/DCIM/Camera/IMG_20191230_165526.jpg|image/jpeg|4000|2250|90|5788193||1637505278|1577721327000|1577721327059|0|0|0|||||||| +4917|3680|content://media/external/images/media/3680|/storage/emulated/0/DCIM/Camera/IMG_20191230_165518.jpg|image/jpeg|4000|2250|90|5702321||1637503389|1577721320000|1577721320091|0|0|0|||||||| +4918|2943|content://media/external/images/media/2943|/storage/emulated/0/DCIM/Camera/IMG_20191230_112019_BURST1.jpg|image/jpeg|4000|2250|90|2021700||1637501660|1577701218000|1577701218830|0|0|0|||||||| +4919|3029|content://media/external/images/media/3029|/storage/emulated/0/DCIM/Camera/IMG_20191230_111708.jpg|image/jpeg|4000|2250|0|5221561||1637501805|1577701029000|1577701029665|0|0|0|||||||| +4920|4860|content://media/external/images/media/4860|/storage/emulated/0/DCIM/Camera/IMG_20191230_111705.jpg|image/jpeg|4000|2250|0|3700536||1637505831|1577701026000|1577701026533|0|0|0|||||||| +4921|4947|content://media/external/images/media/4947|/storage/emulated/0/DCIM/Camera/IMG_20191230_111627.jpg|image/jpeg|4000|2250|0|4352269||1637506015|1577700988000|1577700988416|0|0|0|||||||| +4922|3284|content://media/external/images/media/3284|/storage/emulated/0/DCIM/Camera/IMG_20191230_111611.jpg|image/jpeg|4000|2250|0|7142500||1637502355|1577700972000|1577700972868|0|0|0|||||||| +4923|3396|content://media/external/images/media/3396|/storage/emulated/0/DCIM/Camera/IMG_20191229_144800.jpg|image/jpeg|4000|2250|180|4739194||1637502598|1577627281000|1577627281896|0|0|0|||||||| +4924|3241|content://media/external/images/media/3241|/storage/emulated/0/DCIM/Camera/IMG_20191229_142510.jpg|image/jpeg|4000|2250|90|4520324||1637502259|1577625911000|1577625911708|0|0|0|||||||| +4925|3140|content://media/external/images/media/3140|/storage/emulated/0/DCIM/Camera/IMG_20191229_142341.jpg|image/jpeg|4000|2250|90|4983754||1637502130|1577625823000|1577625823241|0|0|0|||||||| +4926|3028|content://media/external/images/media/3028|/storage/emulated/0/DCIM/Camera/IMG_20191229_141922.jpg|image/jpeg|4000|2250|0|4827852||1637501805|1577625564000|1577625563953|0|0|0|||||||| +4927|2923|content://media/external/images/media/2923|/storage/emulated/0/DCIM/Camera/IMG_20191229_141916.jpg|image/jpeg|4000|2250|90|4711161||1637501599|1577625558000|1577625558276|0|0|0|||||||| +4928|6089|content://media/external/images/media/6089|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191227-WA0005.jpg|image/jpeg|1600|1200|0|259467||1637518220|1577477908000|0|0|0|0|||||||| +4929|5879|content://media/external/images/media/5879|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191225-WA0049.jpg|image/jpeg|868|1156|0|53354||1637518220|1577284981000|0|0|0|0|||||||| +4930|4014|content://media/external/images/media/4014|/storage/emulated/0/DCIM/Camera/IMG_20191225_132409.jpg|image/jpeg|8016|3712|0|10447404||1637504201|1577276650000|0|0|0|0|||||||| +4931|4186|content://media/external/images/media/4186|/storage/emulated/0/DCIM/Camera/IMG_20191225_132320.jpg|image/jpeg|8016|3712|0|8649763||1637504558|1577276604000|0|0|0|0|||||||| +4932|3256|content://media/external/images/media/3256|/storage/emulated/0/DCIM/Camera/PANO_20191224_152141.jpg|image/jpeg|8016|3712|0|7535561||1637502259|1577197309000|0|0|0|0|||||||| +4933|6206|content://media/external/images/media/6206|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191222-WA0010.jpg|image/jpeg|1512|2016|0|266673||1637518221|1577029963000|0|0|0|0|||||||| +4934|5976|content://media/external/images/media/5976|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191222-WA0009.jpg|image/jpeg|2048|1536|0|190899||1637518220|1577029939000|0|0|0|0|||||||| +4935|3006|content://media/external/images/media/3006|/storage/emulated/0/DCIM/Camera/IMG_20191221_164254.jpg|image/jpeg|2148|1099|0|499917||1637501786|1576942975000|1576942917959|0|0|0|||||||| +4936|4752|content://media/external/images/media/4752|/storage/emulated/0/DCIM/Camera/IMG_20191221_164216.jpg|image/jpeg|2470|1379|0|690340||1637505639|1576942937000|1576942917959|0|0|0|||||||| +4937|3867|content://media/external/images/media/3867|/storage/emulated/0/DCIM/Camera/IMG_20191221_164102.jpg|image/jpeg|1365|871|0|277471||1637503729|1576942863000|1576942798129|0|0|0|||||||| +4938|2942|content://media/external/images/media/2942|/storage/emulated/0/DCIM/Camera/IMG_20191214_212249.jpg|image/jpeg|4160|2340|90|4357967||1637501660|1576354969000|1576354969015|0|0|0|||||||| +4939|4391|content://media/external/images/media/4391|/storage/emulated/0/DCIM/Camera/IMG_20191214_195454.jpg|image/jpeg|4160|2340|0|4297747||1637505004|1576349694000|1576349694706|0|0|0|||||||| +4940|4222|content://media/external/images/media/4222|/storage/emulated/0/DCIM/Camera/IMG_20191214_195438.jpg|image/jpeg|4160|2340|0|3280944||1637504726|1576349678000|1576349678616|0|0|0|||||||| +4941|4482|content://media/external/images/media/4482|/storage/emulated/0/DCIM/Camera/IMG_20191214_194254.jpg|image/jpeg|4160|2340|90|3262814||1637505122|1576348974000|1576348974716|0|0|0|||||||| +4942|4970|content://media/external/images/media/4970|/storage/emulated/0/DCIM/Camera/IMG_20191214_194227.jpg|image/jpeg|4160|2340|90|3689335||1637506097|1576348947000|1576348946983|0|0|0|||||||| +4943|4013|content://media/external/images/media/4013|/storage/emulated/0/DCIM/Camera/IMG_20191214_194146.jpg|image/jpeg|4160|2340|90|3840873||1637504201|1576348906000|1576348906093|0|0|0|||||||| +4944|4245|content://media/external/images/media/4245|/storage/emulated/0/DCIM/Camera/IMG_20191214_194113.jpg|image/jpeg|4160|2340|90|3446212||1637504734|1576348873000|1576348873272|0|0|0|||||||| +4945|3761|content://media/external/images/media/3761|/storage/emulated/0/DCIM/Camera/IMG_20191214_194046.jpg|image/jpeg|4160|2340|90|3221482||1637503508|1576348846000|1576348846653|0|0|0|||||||| +4946|3203|content://media/external/images/media/3203|/storage/emulated/0/DCIM/Camera/IMG_20191214_185313.jpg|image/jpeg|4160|2340|0|3898145||1637502256|1576345993000|1576345993409|0|0|0|||||||| +4947|4890|content://media/external/images/media/4890|/storage/emulated/0/DCIM/Camera/IMG_20191214_174319.jpg|image/jpeg|4000|2250|0|5357628||1637505920|1576341800000|1576341800523|0|0|0|||||||| +4948|2899|content://media/external/images/media/2899|/storage/emulated/0/DCIM/Camera/IMG_20191214_174310.jpg|image/jpeg|4000|2250|0|4772196||1637501534|1576341792000|1576341792016|0|0|0|||||||| +4949|4319|content://media/external/images/media/4319|/storage/emulated/0/DCIM/Camera/IMG_20191214_174249.jpg|image/jpeg|4000|2250|90|5000492||1637504894|1576341770000|1576341770398|0|0|0|||||||| +4950|3196|content://media/external/images/media/3196|/storage/emulated/0/DCIM/Camera/PANO_20191214_174001.jpg|image/jpeg|11056|3712|0|7877572||1637502161|1576341611000|0|0|0|0|||||||| +4951|3375|content://media/external/images/media/3375|/storage/emulated/0/DCIM/Camera/IMG_20191214_171916.jpg|image/jpeg|4000|2250|0|5343154||1637502523|1576340357000|1576340357251|0|0|0|||||||| +4952|4260|content://media/external/images/media/4260|/storage/emulated/0/DCIM/Camera/IMG_20191214_170601.jpg|image/jpeg|4000|2250|0|4937318||1637504756|1576339562000|1576339562671|0|0|0|||||||| +4953|3487|content://media/external/images/media/3487|/storage/emulated/0/DCIM/Camera/IMG_20191214_170411.jpg|image/jpeg|4160|2340|0|3769518||1637502870|1576339451000|1576339451433|0|0|0|||||||| +4954|4244|content://media/external/images/media/4244|/storage/emulated/0/DCIM/Camera/IMG_20191214_170322.jpg|image/jpeg|4160|2340|0|4236495||1637504734|1576339402000|1576339402301|0|0|0|||||||| +4955|3169|content://media/external/images/media/3169|/storage/emulated/0/DCIM/Camera/IMG_20191214_152514.jpg|image/jpeg|720|1280|0|194459||1637502143|1576333514000|0|0|0|0|||||||| +4956|4243|content://media/external/images/media/4243|/storage/emulated/0/DCIM/Camera/IMG_20191214_152503.jpg|image/jpeg|4000|2250|0|5340646||1637504734|1576333504000|1576333504873|0|0|0|||||||| +4957|3261|content://media/external/images/media/3261|/storage/emulated/0/DCIM/Camera/IMG_20191214_151914.jpg|image/jpeg|4000|2250|90|5701578||1637502342|1576333156000|1576333156332|0|0|0|||||||| +4958|3139|content://media/external/images/media/3139|/storage/emulated/0/DCIM/Camera/IMG_20191212_191827.jpg|image/jpeg|4000|2250|0|4924431||1637502130|1576174709000|1576174708988|0|0|0|||||||| +4959|4411|content://media/external/images/media/4411|/storage/emulated/0/DCIM/Camera/IMG_20191207_132312.jpg|image/jpeg|4000|2250|0|4576615||1637505063|1575721393000|1575721393757|0|0|0|||||||| +4960|3395|content://media/external/images/media/3395|/storage/emulated/0/DCIM/Camera/IMG_20191207_132148.jpg|image/jpeg|4000|2250|0|4534406||1637502598|1575721309000|1575721309888|0|0|0|||||||| +4961|4012|content://media/external/images/media/4012|/storage/emulated/0/DCIM/Camera/IMG_20191207_132143.jpg|image/jpeg|4000|2250|0|4988528||1637504201|1575721305000|1575721305750|0|0|0|||||||| +4962|3283|content://media/external/images/media/3283|/storage/emulated/0/DCIM/Camera/IMG_20191205_133247.jpg|image/jpeg|4000|2250|90|4112692||1637502355|1575549169000|1575549169748|0|0|0|||||||| +4963|5975|content://media/external/images/media/5975|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0029.jpg|image/jpeg|1600|1200|0|187552||1637518220|1575503262000|0|0|0|0|||||||| +4964|5973|content://media/external/images/media/5973|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0028.jpg|image/jpeg|1600|1200|0|198519||1637518220|1575503260000|0|0|0|0|||||||| +4965|5972|content://media/external/images/media/5972|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0027.jpg|image/jpeg|1600|1200|0|245640||1637518220|1575503257000|0|0|0|0|||||||| +4966|5970|content://media/external/images/media/5970|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0026.jpg|image/jpeg|1600|1200|0|174334||1637518220|1575503254000|0|0|0|0|||||||| +4967|6204|content://media/external/images/media/6204|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0025.jpg|image/jpeg|1600|1200|0|177966||1637518221|1575503246000|0|0|0|0|||||||| +4968|5875|content://media/external/images/media/5875|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0024.jpg|image/jpeg|1600|1200|0|229313||1637518220|1575503244000|0|0|0|0|||||||| +4969|5971|content://media/external/images/media/5971|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0023.jpg|image/jpeg|1600|1200|0|208433||1637518220|1575503242000|0|0|0|0|||||||| +4970|6085|content://media/external/images/media/6085|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0022.jpg|image/jpeg|1600|1200|0|247479||1637518220|1575503240000|0|0|0|0|||||||| +4971|6202|content://media/external/images/media/6202|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0021.jpg|image/jpeg|1200|1600|0|229484||1637518221|1575503238000|0|0|0|0|||||||| +4972|6081|content://media/external/images/media/6081|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0020.jpg|image/jpeg|1600|1200|0|213381||1637518220|1575503191000|0|0|0|0|||||||| +4973|6201|content://media/external/images/media/6201|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0019.jpg|image/jpeg|1600|1200|0|161761||1637518221|1575503189000|0|0|0|0|||||||| +4974|5964|content://media/external/images/media/5964|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0018.jpg|image/jpeg|1600|1200|0|184995||1637518220|1575503155000|0|0|0|0|||||||| +4975|6080|content://media/external/images/media/6080|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0017.jpg|image/jpeg|1600|1200|0|177629||1637518220|1575503134000|0|0|0|0|||||||| +4976|6198|content://media/external/images/media/6198|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0016.jpg|image/jpeg|1600|1200|0|205372||1637518221|1575503132000|0|0|0|0|||||||| +4977|6197|content://media/external/images/media/6197|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0015.jpg|image/jpeg|1600|1202|0|169390||1637518221|1575503118000|0|0|0|0|||||||| +4978|6196|content://media/external/images/media/6196|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0014.jpg|image/jpeg|1600|1200|0|180999||1637518221|1575503116000|0|0|0|0|||||||| +4979|5870|content://media/external/images/media/5870|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0013.jpg|image/jpeg|1600|1200|0|161813||1637518220|1575503115000|0|0|0|0|||||||| +4980|5966|content://media/external/images/media/5966|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0012.jpg|image/jpeg|1200|1600|0|202388||1637518220|1575503113000|0|0|0|0|||||||| +4981|5963|content://media/external/images/media/5963|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0011.jpg|image/jpeg|1600|1202|0|216768||1637518220|1575503112000|0|0|0|0|||||||| +4982|6195|content://media/external/images/media/6195|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0010.jpg|image/jpeg|1600|1200|0|220659||1637518221|1575503110000|0|0|0|0|||||||| +4983|6077|content://media/external/images/media/6077|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0009.jpg|image/jpeg|1200|1600|0|168715||1637518220|1575503109000|0|0|0|0|||||||| +4984|5960|content://media/external/images/media/5960|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0008.jpg|image/jpeg|1600|1200|0|172813||1637518220|1575503107000|0|0|0|0|||||||| +4985|5873|content://media/external/images/media/5873|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0007.jpg|image/jpeg|1600|1200|0|226726||1637518220|1575503105000|0|0|0|0|||||||| +4986|5872|content://media/external/images/media/5872|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0006.jpg|image/jpeg|1600|1202|0|181848||1637518220|1575503104000|0|0|0|0|||||||| +4987|6192|content://media/external/images/media/6192|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0005.jpg|image/jpeg|1600|1200|0|221443||1637518221|1575503102000|0|0|0|0|||||||| +4988|6074|content://media/external/images/media/6074|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0004.jpg|image/jpeg|1600|1200|0|179315||1637518220|1575503101000|0|0|0|0|||||||| +4989|5956|content://media/external/images/media/5956|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0003.jpg|image/jpeg|1600|1200|0|191552||1637518220|1575503099000|0|0|0|0|||||||| +4990|6072|content://media/external/images/media/6072|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0002.jpg|image/jpeg|1600|1200|0|196562||1637518220|1575503097000|0|0|0|0|||||||| +4991|6193|content://media/external/images/media/6193|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191205-WA0001.jpg|image/jpeg|1600|1200|0|196201||1637518221|1575503096000|0|0|0|0|||||||| +4992|4451|content://media/external/images/media/4451|/storage/emulated/0/DCIM/Camera/IMG_20191201_172305.jpg|image/jpeg|4160|2340|90|4796393||1637505068|1575217385000|1575217385742|0|0|0|||||||| +4993|4342|content://media/external/images/media/4342|/storage/emulated/0/DCIM/Camera/IMG_20191201_172213.jpg|image/jpeg|4160|2340|0|4483333||1637504906|1575217333000|1575217333189|0|0|0|||||||| +4994|3374|content://media/external/images/media/3374|/storage/emulated/0/DCIM/Camera/IMG_20191201_110824.jpg|image/jpeg|4000|2250|0|4674995||1637502523|1575194906000|1575194906303|0|0|0|||||||| +4995|6190|content://media/external/images/media/6190|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191130-WA0006.jpg|image/jpeg|1599|1200|0|157799||1637518221|1575123776000|0|0|0|0|||||||| +4996|6189|content://media/external/images/media/6189|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191130-WA0004.jpg|image/jpeg|960|1280|0|110231||1637518221|1575119894000|0|0|0|0|||||||| +4997|3637|content://media/external/images/media/3637|/storage/emulated/0/DCIM/Camera/IMG_20191130_131524.jpg|image/jpeg|4000|2250|90|2859525||1637503301|1575116126000|1575116126158|0|0|0|||||||| +4998|4629|content://media/external/images/media/4629|/storage/emulated/0/DCIM/Camera/IMG_20191130_131458.jpg|image/jpeg|4000|2250|90|2693294||1637505390|1575116100000|1575116100874|0|0|0|||||||| +4999|4994|content://media/external/images/media/4994|/storage/emulated/0/DCIM/Camera/IMG_20191130_131420.jpg|image/jpeg|4000|2250|90|3155058||1637506101|1575116065000|1575116065536|0|0|0|||||||| +5000|6071|content://media/external/images/media/6071|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191127-WA0000.jpg|image/jpeg|750|1334|0|114439||1637518220|1574841063000|0|0|0|0|||||||| +5001|3526|content://media/external/images/media/3526|/storage/emulated/0/DCIM/Camera/PANO_20191125_222540.jpg|image/jpeg|3442|6398|0|2862682||1637502970|1574717219000|1574717219000|0|0|0|||||||| +5002|5507|content://media/external/images/media/5507|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191124-WA0001.jpg|image/jpeg|1200|1600|0|264144||1637518219|1574585731000|0|0|0|0|||||||| +5003|6069|content://media/external/images/media/6069|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191123-WA0016.jpg|image/jpeg|1500|2000|0|192937||1637518220|1574542769000|0|0|0|0|||||||| +5004|6068|content://media/external/images/media/6068|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191123-WA0012.jpg|image/jpeg|1280|960|0|128728||1637518220|1574535173000|0|0|0|0|||||||| +5005|4132|content://media/external/images/media/4132|/storage/emulated/0/DCIM/Camera/IMG_20191123_155733.jpg|image/jpeg|4000|2250|90|4973934||1637504473|1574521055000|1574521055079|0|0|0|||||||| +5006|5867|content://media/external/images/media/5867|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191120-WA0020.jpg|image/jpeg|1156|868|0|105598||1637518220|1574277422000|0|0|0|0|||||||| +5007|5866|content://media/external/images/media/5866|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191116-WA0019.jpg|image/jpeg|960|1280|0|130157||1637518220|1573925081000|0|0|0|0|||||||| +5008|4114|content://media/external/images/media/4114|/storage/emulated/0/DCIM/Camera/IMG_20191116_153602.jpg|image/jpeg|3494|1465|0|1444449||1637504451|1573914962000|1573914935855|0|0|0|||||||| +5009|4842|content://media/external/images/media/4842|/storage/emulated/0/DCIM/Camera/IMG_20191116_153432.jpg|image/jpeg|4160|2340|90|4345319||1637505753|1573914872000|1573914872310|0|0|0|||||||| +5010|4731|content://media/external/images/media/4731|/storage/emulated/0/DCIM/Camera/IMG_20191116_125844.jpg|image/jpeg|4000|2250|0|5325475||1637505574|1573905527000|1573905526963|0|0|0|||||||| +5011|3785|content://media/external/images/media/3785|/storage/emulated/0/DCIM/Camera/IMG_20191116_125512.jpg|image/jpeg|4000|2250|90|3196138||1637503558|1573905314000|1573905314564|0|0|0|||||||| +5012|4603|content://media/external/images/media/4603|/storage/emulated/0/DCIM/Camera/IMG_20191116_125507.jpg|image/jpeg|4000|2250|90|4474185||1637505308|1573905308000|1573905308510|0|0|0|||||||| +5013|4501|content://media/external/images/media/4501|/storage/emulated/0/DCIM/Camera/IMG_20191114_214645.jpg|image/jpeg|4000|2250|0|4696235||1637505160|1573764406000|1573764406761|0|0|0|||||||| +5014|5953|content://media/external/images/media/5953|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191112-WA0012.jpg|image/jpeg|720|720|0|75990||1637518220|1573755850000|0|0|0|0|||||||| +5015|3804|content://media/external/images/media/3804|/storage/emulated/0/DCIM/Camera/IMG_20191110_124356.jpg|image/jpeg|4000|2250|90|4321429||1637503601|1573386240000|1573386240896|0|0|0|||||||| +5016|3940|content://media/external/images/media/3940|/storage/emulated/0/DCIM/Camera/IMG_20191110_124345.jpg|image/jpeg|4000|2250|0|4487304||1637503853|1573386227000|1573386227348|0|0|0|||||||| +5017|3742|content://media/external/images/media/3742|/storage/emulated/0/DCIM/Camera/IMG_20191110_124338.jpg|image/jpeg|4160|2340|0|3411877||1637503488|1573386218000|1573386218659|0|0|0|||||||| +5018|3721|content://media/external/images/media/3721|/storage/emulated/0/DCIM/Camera/IMG_20191109_230155.jpg|image/jpeg|4160|2340|0|4350180||1637503477|1573336915000|1573336915232|0|0|0|||||||| +5019|4660|content://media/external/images/media/4660|/storage/emulated/0/DCIM/Camera/IMG_20191109_230024.jpg|image/jpeg|4160|2340|0|4262188||1637505417|1573336824000|1573336824652|0|0|0|||||||| +5020|4602|content://media/external/images/media/4602|/storage/emulated/0/DCIM/Camera/IMG_20191109_230005.jpg|image/jpeg|4000|2250|90|2764122||1637505308|1573336807000|1573336807214|0|0|0|||||||| +5021|4200|content://media/external/images/media/4200|/storage/emulated/0/DCIM/Camera/IMG_20191106_195611.jpg|image/jpeg|1649|466|0|261437||1637504640|1573066572000|1573066505386|0|0|0|||||||| +5022|2964|content://media/external/images/media/2964|/storage/emulated/0/DCIM/Camera/IMG_20191106_194345.jpg|image/jpeg|4000|2250|0|4978873||1637501684|1573065827000|1573065827090|0|0|0|||||||| +5023|4642|content://media/external/images/media/4642|/storage/emulated/0/DCIM/Camera/IMG_20191105_193351.jpg|image/jpeg|4000|3000|0|6503519||1637505414|1572978833000|1572978832843|0|0|0|||||||| +5024|5952|content://media/external/images/media/5952|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0025.jpg|image/jpeg|1600|900|0|115552||1637518220|1572874014000|0|0|0|0|||||||| +5025|6067|content://media/external/images/media/6067|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0024.jpg|image/jpeg|900|1600|0|161701||1637518220|1572874014000|0|0|0|0|||||||| +5026|6066|content://media/external/images/media/6066|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0023.jpg|image/jpeg|900|1600|0|210673||1637518220|1572874012000|0|0|0|0|||||||| +5027|6064|content://media/external/images/media/6064|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0020.jpg|image/jpeg|1600|900|0|83111||1637518220|1572874011000|0|0|0|0|||||||| +5028|6065|content://media/external/images/media/6065|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0022.jpg|image/jpeg|1600|900|0|100034||1637518220|1572874011000|0|0|0|0|||||||| +5029|6188|content://media/external/images/media/6188|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0021.jpg|image/jpeg|1600|900|0|110780||1637518221|1572874011000|0|0|0|0|||||||| +5030|5951|content://media/external/images/media/5951|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0018.jpg|image/jpeg|1600|900|0|180667||1637518220|1572874010000|0|0|0|0|||||||| +5031|6063|content://media/external/images/media/6063|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0019.jpg|image/jpeg|1600|900|0|78306||1637518220|1572874010000|0|0|0|0|||||||| +5032|5949|content://media/external/images/media/5949|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0016.jpg|image/jpeg|900|1600|0|198604||1637518220|1572874000000|0|0|0|0|||||||| +5033|5950|content://media/external/images/media/5950|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0017.jpg|image/jpeg|1600|900|0|122904||1637518220|1572874000000|0|0|0|0|||||||| +5034|5865|content://media/external/images/media/5865|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0013.jpg|image/jpeg|1600|900|0|139612||1637518220|1572873994000|0|0|0|0|||||||| +5035|6062|content://media/external/images/media/6062|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0015.jpg|image/jpeg|1600|900|0|173046||1637518220|1572873994000|0|0|0|0|||||||| +5036|6187|content://media/external/images/media/6187|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0014.jpg|image/jpeg|1600|900|0|260508||1637518221|1572873994000|0|0|0|0|||||||| +5037|5864|content://media/external/images/media/5864|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0008.jpg|image/jpeg|900|1600|0|258285||1637518220|1572873993000|0|0|0|0|||||||| +5038|5948|content://media/external/images/media/5948|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0010.jpg|image/jpeg|1600|900|0|156254||1637518220|1572873993000|0|0|0|0|||||||| +5039|6060|content://media/external/images/media/6060|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0009.jpg|image/jpeg|1600|900|0|144970||1637518220|1572873993000|0|0|0|0|||||||| +5040|6061|content://media/external/images/media/6061|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0011.jpg|image/jpeg|1600|900|0|137608||1637518220|1572873993000|0|0|0|0|||||||| +5041|6186|content://media/external/images/media/6186|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0012.jpg|image/jpeg|1600|900|0|167893||1637518221|1572873993000|0|0|0|0|||||||| +5042|6185|content://media/external/images/media/6185|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0007.jpg|image/jpeg|900|1600|0|278360||1637518221|1572873992000|0|0|0|0|||||||| +5043|5863|content://media/external/images/media/5863|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0006.jpg|image/jpeg|900|1600|0|172408||1637518220|1572873788000|0|0|0|0|||||||| +5044|5947|content://media/external/images/media/5947|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0005.jpg|image/jpeg|900|1600|0|152429||1637518220|1572873735000|0|0|0|0|||||||| +5045|6184|content://media/external/images/media/6184|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0004.jpg|image/jpeg|900|1600|0|147524||1637518221|1572873733000|0|0|0|0|||||||| +5046|5862|content://media/external/images/media/5862|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0003.jpg|image/jpeg|900|1600|0|146499||1637518220|1572873686000|0|0|0|0|||||||| +5047|6059|content://media/external/images/media/6059|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0002.jpg|image/jpeg|1600|900|0|278659||1637518220|1572873685000|0|0|0|0|||||||| +5048|5861|content://media/external/images/media/5861|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191104-WA0001.jpg|image/jpeg|899|1599|0|150529||1637518220|1572870687000|0|0|0|0|||||||| +5049|4112|content://media/external/images/media/4112|/storage/emulated/0/DCIM/Camera/IMG_20191103_153008.jpg|image/jpeg|4000|2250|90|4293362||1637504451|1572791410000|1572791410176|0|0|0|||||||| +5050|3168|content://media/external/images/media/3168|/storage/emulated/0/DCIM/Camera/IMG_20191103_152802.jpg|image/jpeg|4000|2250|90|6167305||1637502143|1572791284000|1572791283993|0|0|0|||||||| +5051|3337|content://media/external/images/media/3337|/storage/emulated/0/DCIM/Camera/IMG_20191103_152747.jpg|image/jpeg|4160|2340|0|5510293||1637502439|1572791267000|1572791267897|0|0|0|||||||| +5052|4815|content://media/external/images/media/4815|/storage/emulated/0/DCIM/Camera/IMG_20191103_152744.jpg|image/jpeg|4160|2340|0|3840553||1637505730|1572791264000|1572791264696|0|0|0|||||||| +5053|3917|content://media/external/images/media/3917|/storage/emulated/0/DCIM/Camera/IMG_20191103_152732.jpg|image/jpeg|4160|2340|90|5217926||1637503834|1572791252000|1572791252105|0|0|0|||||||| +5054|3005|content://media/external/images/media/3005|/storage/emulated/0/DCIM/Camera/IMG_20191103_152138.jpg|image/jpeg|4000|2250|90|3270535||1637501786|1572790900000|1572790900602|0|0|0|||||||| +5055|3183|content://media/external/images/media/3183|/storage/emulated/0/DCIM/Camera/IMG_20191103_130401.jpg|image/jpeg|4160|2340|0|3266793||1637502161|1572782641000|1572782641767|0|0|0|||||||| +5056|3102|content://media/external/images/media/3102|/storage/emulated/0/DCIM/Camera/IMG_20191103_130355.jpg|image/jpeg|4160|2340|0|4143209||1637502054|1572782635000|1572782635291|0|0|0|||||||| +5057|3336|content://media/external/images/media/3336|/storage/emulated/0/DCIM/Camera/IMG_20191103_124940.jpg|image/jpeg|4160|2340|0|3443886||1637502439|1572781780000|1572781780093|0|0|0|||||||| +5058|4432|content://media/external/images/media/4432|/storage/emulated/0/DCIM/Camera/IMG_20191103_113013.jpg|image/jpeg|4000|2250|90|4541962||1637505068|1572777014000|1572777014451|0|0|0|||||||| +5059|4659|content://media/external/images/media/4659|/storage/emulated/0/DCIM/Camera/IMG_20191103_112916.jpg|image/jpeg|4000|2250|90|4134102||1637505417|1572776961000|1572776961119|0|0|0|||||||| +5060|2839|content://media/external/images/media/2839|/storage/emulated/0/DCIM/Camera/IMG_20191102_185443.jpg|image/jpeg|4000|2250|90|4988023||1637501431|1572717285000|1572717285118|0|0|0|||||||| +5061|4241|content://media/external/images/media/4241|/storage/emulated/0/DCIM/Camera/IMG_20191102_185439.jpg|image/jpeg|4000|2250|90|5036663||1637504734|1572717280000|1572717280784|0|0|0|||||||| +5062|3318|content://media/external/images/media/3318|/storage/emulated/0/DCIM/Camera/IMG_20191102_185331.jpg|image/jpeg|5184|3880|90|7247423||1637502438|1572717218000|1572717218060|0|0|0|||||||| +5063|4466|content://media/external/images/media/4466|/storage/emulated/0/DCIM/Camera/IMG_20191102_185220.jpg|image/jpeg|5184|3880|270|6689013||1637505091|1572717142000|1572717142686|0|0|0|||||||| +5064|5860|content://media/external/images/media/5860|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191102-WA0016.jpg|image/jpeg|1200|1600|0|229978||1637518220|1572712047000|0|0|0|0|||||||| +5065|5859|content://media/external/images/media/5859|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191102-WA0014.jpg|image/jpeg|768|1024|0|72201||1637518220|1572710045000|0|0|0|0|||||||| +5066|3916|content://media/external/images/media/3916|/storage/emulated/0/DCIM/Camera/IMG_20191102_165051.jpg|image/jpeg|4000|2250|0|3464746||1637503834|1572709853000|1572709853033|0|0|0|||||||| +5067|3282|content://media/external/images/media/3282|/storage/emulated/0/DCIM/Camera/IMG_20191102_165041.jpg|image/jpeg|4160|2340|90|4506695||1637502355|1572709841000|1572709841192|0|0|0|||||||| +5068|3549|content://media/external/images/media/3549|/storage/emulated/0/DCIM/Camera/IMG_20191102_164848.jpg|image/jpeg|4160|2340|90|4879984||1637503058|1572709728000|1572709728046|0|0|0|||||||| +5069|6183|content://media/external/images/media/6183|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191102-WA0007.jpg|image/jpeg|900|1600|0|133193||1637518221|1572697871000|0|0|0|0|||||||| +5070|4341|content://media/external/images/media/4341|/storage/emulated/0/DCIM/Camera/IMG_20191102_113505.jpg|image/jpeg|4160|2340|0|3623044||1637504906|1572690905000|1572690905771|0|0|0|||||||| +5071|4352|content://media/external/images/media/4352|/storage/emulated/0/DCIM/Camera/IMG_20191102_113451.jpg|image/jpeg|4160|2340|0|3576181||1637504970|1572690891000|1572690891476|0|0|0|||||||| +5072|4628|content://media/external/images/media/4628|/storage/emulated/0/DCIM/Camera/IMG_20191102_111313.jpg|image/jpeg|4000|2250|0|6019171||1637505390|1572689595000|1572689595215|0|0|0|||||||| +5073|2858|content://media/external/images/media/2858|/storage/emulated/0/DCIM/Camera/IMG_20191102_111304.jpg|image/jpeg|4000|2250|90|6089248||1637501457|1572689586000|1572689586543|0|0|0|||||||| +5074|5858|content://media/external/images/media/5858|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191102-WA0000.jpg|image/jpeg|1200|1600|0|170122||1637518220|1572681902000|0|0|0|0|||||||| +5075|4340|content://media/external/images/media/4340|/storage/emulated/0/DCIM/Camera/IMG_20191101_213706.jpg|image/jpeg|4000|2250|0|4848809||1637504906|1572640627000|1572640627813|0|0|0|||||||| +5076|3654|content://media/external/images/media/3654|/storage/emulated/0/DCIM/Camera/IMG_20191101_213702.jpg|image/jpeg|4000|2250|0|4614830||1637503358|1572640623000|1572640623683|0|0|0|||||||| +5077|4993|content://media/external/images/media/4993|/storage/emulated/0/DCIM/Camera/IMG_20191101_213655.jpg|image/jpeg|4000|2250|0|4762873||1637506101|1572640616000|1572640616223|0|0|0|||||||| +5078|2800|content://media/external/images/media/2800|/storage/emulated/0/DCIM/Camera/IMG_20191101_211659.jpg|image/jpeg|4000|2250|0|4433192||1637501311|1572639420000|1572639420610|0|0|0|||||||| +5079|3240|content://media/external/images/media/3240|/storage/emulated/0/DCIM/Camera/IMG_20191101_211657.jpg|image/jpeg|4000|2250|0|4317493||1637502259|1572639418000|1572639418717|0|0|0|||||||| +5080|4450|content://media/external/images/media/4450|/storage/emulated/0/DCIM/Camera/IMG_20191101_201545.jpg|image/jpeg|4000|2250|0|5029128||1637505068|1572635747000|1572635746999|0|0|0|||||||| +5081|4500|content://media/external/images/media/4500|/storage/emulated/0/DCIM/Camera/IMG_20191101_185629.jpg|image/jpeg|4000|2250|90|2708799||1637505160|1572630991000|1572630991834|0|0|0|||||||| +5082|4696|content://media/external/images/media/4696|/storage/emulated/0/DCIM/Camera/IMG_20191101_185537.jpg|image/jpeg|4000|2250|90|4096857||1637505509|1572630938000|1572630938640|0|0|0|||||||| +5083|3679|content://media/external/images/media/3679|/storage/emulated/0/DCIM/Camera/IMG_20191101_184312.jpg|image/jpeg|4000|2250|0|5141705||1637503389|1572630192000|1572630192041|0|0|0|||||||| +5084|3996|content://media/external/images/media/3996|/storage/emulated/0/DCIM/Camera/IMG_20191101_184226.jpg|image/jpeg|4000|2250|0|4719992||1637504086|1572630147000|1572630147552|0|0|0|||||||| +5085|4033|content://media/external/images/media/4033|/storage/emulated/0/DCIM/Camera/IMG_20191101_184215.jpg|image/jpeg|4000|2250|90|4462928||1637504234|1572630137000|1572630137331|0|0|0|||||||| +5086|4390|content://media/external/images/media/4390|/storage/emulated/0/DCIM/Camera/IMG_20191101_184155.jpg|image/jpeg|4160|2340|0|4302250||1637505004|1572630115000|1572630115748|0|0|0|||||||| +5087|4449|content://media/external/images/media/4449|/storage/emulated/0/DCIM/Camera/IMG_20191101_183923.jpg|image/jpeg|4000|2250|0|5144068||1637505068|1572629963000|1572629963118|0|0|0|||||||| +5088|4351|content://media/external/images/media/4351|/storage/emulated/0/DCIM/Camera/IMG_20191101_183843.jpg|image/jpeg|4160|2340|0|4349270||1637504970|1572629923000|1572629923841|0|0|0|||||||| +5089|3650|content://media/external/images/media/3650|/storage/emulated/0/DCIM/Camera/PANO_20191101_183750.jpg|image/jpeg|9648|3712|0|9435502||1637503301|1572629882000|0|0|0|0|||||||| +5090|3598|content://media/external/images/media/3598|/storage/emulated/0/DCIM/Camera/IMG_20191101_160615.jpg|image/jpeg|4000|2250|0|5880605||1637503238|1572620776000|1572620776025|0|0|0|||||||| +5091|3617|content://media/external/images/media/3617|/storage/emulated/0/DCIM/Camera/IMG_20191101_160613.jpg|image/jpeg|4000|2250|0|5994159||1637503271|1572620774000|1572620774205|0|0|0|||||||| +5092|4601|content://media/external/images/media/4601|/storage/emulated/0/DCIM/Camera/IMG_20191101_160605.jpg|image/jpeg|4000|2250|90|6566431||1637505308|1572620766000|1572620766479|0|0|0|||||||| +5093|4907|content://media/external/images/media/4907|/storage/emulated/0/DCIM/Camera/IMG_20191101_160604.jpg|image/jpeg|4000|2250|90|6426528||1637505944|1572620765000|1572620765177|0|0|0|||||||| +5094|4499|content://media/external/images/media/4499|/storage/emulated/0/DCIM/Camera/IMG_20191101_160546.jpg|image/jpeg|4000|2250|90|6335142||1637505160|1572620747000|1572620747489|0|0|0|||||||| +5095|3696|content://media/external/images/media/3696|/storage/emulated/0/DCIM/Camera/IMG_20191101_145939.jpg|image/jpeg|4160|2340|0|5604859||1637503392|1572616779000|1572616779732|0|0|0|||||||| +5096|3933|content://media/external/images/media/3933|/storage/emulated/0/DCIM/Camera/PANO_20191101_145710.jpg|image/jpeg|7120|3776|0|5423498||1637503834|1572616638000|0|0|0|0|||||||| +5097|3058|content://media/external/images/media/3058|/storage/emulated/0/DCIM/Camera/PANO_20191101_145637.jpg|image/jpeg|7536|3776|0|6286346||1637501858|1572616606000|0|0|0|0|||||||| +5098|4259|content://media/external/images/media/4259|/storage/emulated/0/DCIM/Camera/IMG_20191101_145555.jpg|image/jpeg|4000|2250|0|4959627||1637504756|1572616556000|1572616556412|0|0|0|||||||| +5099|3635|content://media/external/images/media/3635|/storage/emulated/0/DCIM/Camera/IMG_20191101_145423.jpg|image/jpeg|4000|2250|90|4702646||1637503301|1572616464000|1572616464316|0|0|0|||||||| +5100|3335|content://media/external/images/media/3335|/storage/emulated/0/DCIM/Camera/IMG_20191101_145307.jpg|image/jpeg|4000|2250|90|4806479||1637502439|1572616388000|1572616388873|0|0|0|||||||| +5101|4240|content://media/external/images/media/4240|/storage/emulated/0/DCIM/Camera/IMG_20191101_145301.jpg|image/jpeg|4000|2250|90|5031659||1637504734|1572616382000|1572616382210|0|0|0|||||||| +5102|4185|content://media/external/images/media/4185|/storage/emulated/0/DCIM/Camera/IMG_20191101_145107.jpg|image/jpeg|4000|2250|90|4092876||1637504558|1572616270000|1572616269921|0|0|0|||||||| +5103|3125|content://media/external/images/media/3125|/storage/emulated/0/DCIM/Camera/IMG_20191101_145058.jpg|image/jpeg|4000|2250|0|4145636||1637502068|1572616261000|1572616260967|0|0|0|||||||| +5104|4305|content://media/external/images/media/4305|/storage/emulated/0/DCIM/Camera/IMG_20191101_144956.jpg|image/jpeg|4000|2250|0|4282826||1637504817|1572616198000|1572616198233|0|0|0|||||||| +5105|3167|content://media/external/images/media/3167|/storage/emulated/0/DCIM/Camera/IMG_20191101_144939.jpg|image/jpeg|4000|2250|90|4138666||1637502143|1572616182000|1572616182260|0|0|0|||||||| +5106|3530|content://media/external/images/media/3530|/storage/emulated/0/DCIM/Camera/IMG_20191101_144916.jpg|image/jpeg|4000|2250|90|4982705||1637503010|1572616158000|1572616158005|0|0|0|||||||| +5107|3486|content://media/external/images/media/3486|/storage/emulated/0/DCIM/Camera/IMG_20191101_144851.jpg|image/jpeg|4000|2250|90|4371789||1637502870|1572616134000|1572616134421|0|0|0|||||||| +5108|3508|content://media/external/images/media/3508|/storage/emulated/0/DCIM/Camera/IMG_20191101_144530.jpg|image/jpeg|4000|2250|0|4930093||1637502969|1572615934000|1572615934081|0|0|0|||||||| +5109|3480|content://media/external/images/media/3480|/storage/emulated/0/DCIM/Camera/PANO_20191101_144431.jpg|image/jpeg|5040|3776|0|3615101||1637502817|1572615878000|0|0|0|0|||||||| +5110|3450|content://media/external/images/media/3450|/storage/emulated/0/DCIM/Camera/IMG_20191101_135057.jpg|image/jpeg|4000|2250|90|4758357||1637502804|1572612658000|1572612658889|0|0|0|||||||| +5111|3138|content://media/external/images/media/3138|/storage/emulated/0/DCIM/Camera/IMG_20191101_135055.jpg|image/jpeg|4000|2250|90|4878907||1637502130|1572612656000|1572612656769|0|0|0|||||||| +5112|4540|content://media/external/images/media/4540|/storage/emulated/0/DCIM/Camera/IMG_20191101_125538.jpg|image/jpeg|4160|2340|0|4323910||1637505187|1572609338000|1572609338587|0|0|0|||||||| +5113|3373|content://media/external/images/media/3373|/storage/emulated/0/DCIM/Camera/IMG_20191101_125531.jpg|image/jpeg|4160|2340|90|4274833||1637502523|1572609331000|1572609331332|0|0|0|||||||| +5114|4111|content://media/external/images/media/4111|/storage/emulated/0/DCIM/Camera/IMG_20191101_125125.jpg|image/jpeg|5184|3880|0|5569047||1637504451|1572609088000|1572609087979|0|0|0|||||||| +5115|2963|content://media/external/images/media/2963|/storage/emulated/0/DCIM/Camera/IMG_20191101_125124.jpg|image/jpeg|5184|3880|0|5580486||1637501684|1572609087000|1572609087657|0|0|0|||||||| +5116|3407|content://media/external/images/media/3407|/storage/emulated/0/DCIM/Camera/PANO_20191101_124950.jpg|image/jpeg|7408|3616|0|6983003||1637502598|1572608997000|0|0|0|0|||||||| +5117|4431|content://media/external/images/media/4431|/storage/emulated/0/DCIM/Camera/IMG_20191101_124942.jpg|image/jpeg|4160|2340|0|6159433||1637505068|1572608982000|1572608982596|0|0|0|||||||| +5118|3299|content://media/external/images/media/3299|/storage/emulated/0/DCIM/Camera/IMG_20191101_120902.jpg|image/jpeg|4160|2340|90|5620754||1637502430|1572606542000|1572606542534|0|0|0|||||||| +5119|4751|content://media/external/images/media/4751|/storage/emulated/0/DCIM/Camera/IMG_20191101_120842.jpg|image/jpeg|4160|2340|90|5646523||1637505639|1572606522000|1572606522528|0|0|0|||||||| +5120|4131|content://media/external/images/media/4131|/storage/emulated/0/DCIM/Camera/IMG_20191101_120831.jpg|image/jpeg|4160|2340|90|5493734||1637504473|1572606511000|1572606511357|0|0|0|||||||| +5121|4793|content://media/external/images/media/4793|/storage/emulated/0/DCIM/Camera/IMG_20191101_120733.jpg|image/jpeg|4160|2340|90|5400082||1637505663|1572606453000|1572606453134|0|0|0|||||||| +5122|4581|content://media/external/images/media/4581|/storage/emulated/0/DCIM/Camera/IMG_20191101_120720.jpg|image/jpeg|4000|2250|90|5899266||1637505278|1572606441000|1572606441795|0|0|0|||||||| +5123|2857|content://media/external/images/media/2857|/storage/emulated/0/DCIM/Camera/IMG_20191101_120436.jpg|image/jpeg|4160|2340|0|6106908||1637501457|1572606276000|1572606276549|0|0|0|||||||| +5124|4239|content://media/external/images/media/4239|/storage/emulated/0/DCIM/Camera/IMG_20191101_115024.jpg|image/jpeg|4000|2250|90|4567435||1637504734|1572605427000|1572605427750|0|0|0|||||||| +5125|4814|content://media/external/images/media/4814|/storage/emulated/0/DCIM/Camera/IMG_20191101_114329.jpg|image/jpeg|4000|2250|0|6286115||1637505730|1572605010000|1572605010619|0|0|0|||||||| +5126|3449|content://media/external/images/media/3449|/storage/emulated/0/DCIM/Camera/IMG_20191101_114324.jpg|image/jpeg|4000|2250|90|4971316||1637502804|1572605005000|1572605005618|0|0|0|||||||| +5127|4580|content://media/external/images/media/4580|/storage/emulated/0/DCIM/Camera/IMG_20191101_114319.jpg|image/jpeg|4000|2250|90|5626274||1637505278|1572605002000|1572605002493|0|0|0|||||||| +5128|5946|content://media/external/images/media/5946|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191031-WA0021.jpg|image/jpeg|1280|958|0|92257||1637518220|1572556012000|0|0|0|0|||||||| +5129|5857|content://media/external/images/media/5857|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191031-WA0020.jpg|image/jpeg|960|952|0|71095||1637518220|1572554466000|0|0|0|0|||||||| +5130|4674|content://media/external/images/media/4674|/storage/emulated/0/DCIM/Camera/IMG_20191031_212917.jpg|image/jpeg|4000|2250|0|4540358||1637505480|1572553759000|1572553759041|0|0|0|||||||| +5131|5856|content://media/external/images/media/5856|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0021.jpg|image/jpeg|1600|903|0|83160||1637518220|1572444458000|0|0|0|0|||||||| +5132|5945|content://media/external/images/media/5945|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0020.jpg|image/jpeg|1600|903|0|93320||1637518220|1572444457000|0|0|0|0|||||||| +5133|5855|content://media/external/images/media/5855|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0019.jpg|image/jpeg|903|1600|0|66635||1637518220|1572444456000|0|0|0|0|||||||| +5134|6182|content://media/external/images/media/6182|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0018.jpg|image/jpeg|903|1600|0|84227||1637518221|1572444456000|0|0|0|0|||||||| +5135|6181|content://media/external/images/media/6181|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0017.jpg|image/jpeg|1600|903|0|203266||1637518221|1572444455000|0|0|0|0|||||||| +5136|6180|content://media/external/images/media/6180|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0016.jpg|image/jpeg|903|1600|0|108376||1637518221|1572444418000|0|0|0|0|||||||| +5137|5854|content://media/external/images/media/5854|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0015.jpg|image/jpeg|1600|903|0|154348||1637518220|1572444410000|0|0|0|0|||||||| +5138|5853|content://media/external/images/media/5853|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0014.jpg|image/jpeg|903|1600|0|95478||1637518220|1572444403000|0|0|0|0|||||||| +5139|5852|content://media/external/images/media/5852|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0012.jpg|image/jpeg|903|1600|0|102052||1637518220|1572444387000|0|0|0|0|||||||| +5140|5944|content://media/external/images/media/5944|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0013.jpg|image/jpeg|1600|903|0|89830||1637518220|1572444387000|0|0|0|0|||||||| +5141|6179|content://media/external/images/media/6179|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0011.jpg|image/jpeg|1600|903|0|149884||1637518221|1572444386000|0|0|0|0|||||||| +5142|5943|content://media/external/images/media/5943|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0010.jpg|image/jpeg|903|1600|0|159023||1637518220|1572444385000|0|0|0|0|||||||| +5143|6178|content://media/external/images/media/6178|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191030-WA0004.jpg|image/jpeg|768|1024|0|113872||1637518221|1572440021000|0|0|0|0|||||||| +5144|6177|content://media/external/images/media/6177|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0018.jpg|image/jpeg|1448|1448|0|172472||1637518221|1572166013000|0|0|0|0|||||||| +5145|5851|content://media/external/images/media/5851|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0014.jpg|image/jpeg|1200|1600|0|127086||1637518220|1572131660000|0|0|0|0|||||||| +5146|6176|content://media/external/images/media/6176|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0013.jpg|image/jpeg|1200|1600|0|97351||1637518221|1572131656000|0|0|0|0|||||||| +5147|6058|content://media/external/images/media/6058|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0012.jpg|image/jpeg|1200|1600|0|119678||1637518220|1572131655000|0|0|0|0|||||||| +5148|5850|content://media/external/images/media/5850|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0011.jpg|image/jpeg|1200|1600|0|127749||1637518220|1572131652000|0|0|0|0|||||||| +5149|6175|content://media/external/images/media/6175|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0010.jpg|image/jpeg|1200|1600|0|100914||1637518221|1572131650000|0|0|0|0|||||||| +5150|5849|content://media/external/images/media/5849|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0009.jpg|image/jpeg|1200|1600|0|118422||1637518220|1572131646000|0|0|0|0|||||||| +5151|5848|content://media/external/images/media/5848|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0008.jpg|image/jpeg|1200|1600|0|144898||1637518220|1572131643000|0|0|0|0|||||||| +5152|5942|content://media/external/images/media/5942|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0007.jpg|image/jpeg|1200|1600|0|107255||1637518220|1572131639000|0|0|0|0|||||||| +5153|6174|content://media/external/images/media/6174|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0006.jpg|image/jpeg|1200|1600|0|119701||1637518221|1572131633000|0|0|0|0|||||||| +5154|6173|content://media/external/images/media/6173|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0005.jpg|image/jpeg|1200|1600|0|120882||1637518221|1572131625000|0|0|0|0|||||||| +5155|6057|content://media/external/images/media/6057|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0004.jpg|image/jpeg|1200|1600|0|125899||1637518220|1572131623000|0|0|0|0|||||||| +5156|6056|content://media/external/images/media/6056|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0003.jpg|image/jpeg|1200|1600|0|88918||1637518220|1572131617000|0|0|0|0|||||||| +5157|6055|content://media/external/images/media/6055|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0002.jpg|image/jpeg|1200|1600|0|133060||1637518220|1572131609000|0|0|0|0|||||||| +5158|6172|content://media/external/images/media/6172|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0001.jpg|image/jpeg|1200|1600|0|117046||1637518221|1572131609000|0|0|0|0|||||||| +5159|5847|content://media/external/images/media/5847|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191027-WA0000.jpg|image/jpeg|1200|1600|0|90244||1637518220|1572131573000|0|0|0|0|||||||| +5160|6054|content://media/external/images/media/6054|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191026-WA0020.jpg|image/jpeg|1200|1600|0|281791||1637518220|1572105156000|0|0|0|0|||||||| +5161|5846|content://media/external/images/media/5846|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191026-WA0016.jpg|image/jpeg|1200|1600|0|293843||1637518220|1572104221000|0|0|0|0|||||||| +5162|4430|content://media/external/images/media/4430|/storage/emulated/0/DCIM/Camera/IMG_20191026_173655.jpg|image/jpeg|4000|2250|90|4471008||1637505068|1572104216000|1572104216746|0|0|0|||||||| +5163|4774|content://media/external/images/media/4774|/storage/emulated/0/DCIM/Camera/IMG_20191026_173626.jpg|image/jpeg|4000|2250|0|4313356||1637505656|1572104187000|1572104187852|0|0|0|||||||| +5164|6171|content://media/external/images/media/6171|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191022-WA0007.jpg|image/jpeg|1200|1600|0|130032||1637518221|1571738344000|0|0|0|0|||||||| +5165|4258|content://media/external/images/media/4258|/storage/emulated/0/DCIM/Camera/IMG_20191020_203059.jpg|image/jpeg|4160|2340|0|2951455||1637504756|1571596259000|1571596259266|0|0|0|||||||| +5166|2962|content://media/external/images/media/2962|/storage/emulated/0/DCIM/Camera/IMG_20191020_195429.jpg|image/jpeg|4000|2250|90|4706133||1637501684|1571594071000|1571594071175|0|0|0|||||||| +5167|2998|content://media/external/images/media/2998|/storage/emulated/0/DCIM/Camera/PANO_20191020_145306.jpg|image/jpeg|8656|3776|0|7463836||1637501772|1571575999000|0|0|0|0|||||||| +5168|2822|content://media/external/images/media/2822|/storage/emulated/0/DCIM/Camera/IMG_20191017_203050.jpg|image/jpeg|4160|2340|0|4305580||1637501369|1571337050000|1571337049920|0|0|0|||||||| +5169|6170|content://media/external/images/media/6170|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191017-WA0007.jpg|image/jpeg|898|1600|0|140118||1637518221|1571310812000|0|0|0|0|||||||| +5170|5845|content://media/external/images/media/5845|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191013-WA0020.jpg|image/jpeg|1600|1202|0|179236||1637518220|1570986033000|0|0|0|0|||||||| +5171|6052|content://media/external/images/media/6052|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191013-WA0018.jpg|image/jpeg|1600|1200|0|248480||1637518220|1570986009000|0|0|0|0|||||||| +5172|6053|content://media/external/images/media/6053|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191013-WA0019.jpg|image/jpeg|1600|1200|0|287081||1637518220|1570986009000|0|0|0|0|||||||| +5173|5844|content://media/external/images/media/5844|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191013-WA0016.jpg|image/jpeg|1600|1200|0|289228||1637518220|1570986008000|0|0|0|0|||||||| +5174|6051|content://media/external/images/media/6051|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191013-WA0017.jpg|image/jpeg|1600|1200|0|291475||1637518220|1570986008000|0|0|0|0|||||||| +5175|2608|content://media/external/images/media/2608|/storage/emulated/0/DCIM/Facebook/FB_IMG_1570977783947.jpg|image/jpeg|966|966|0|56596||1637500870|1570977783000|0|0|0|0|||||||| +5176|4184|content://media/external/images/media/4184|/storage/emulated/0/DCIM/Camera/IMG_20191012_190328.jpg|image/jpeg|4160|2340|0|4014446||1637504558|1570899808000|1570899808174|0|0|0|||||||| +5177|3225|content://media/external/images/media/3225|/storage/emulated/0/DCIM/Camera/IMG_20191012_173323.jpg|image/jpeg|4160|2340|90|4968212||1637502258|1570894403000|1570894403138|0|0|0|||||||| +5178|4992|content://media/external/images/media/4992|/storage/emulated/0/DCIM/Camera/IMG_20191012_173255.jpg|image/jpeg|4160|2340|90|4124053||1637506101|1570894375000|1570894375788|0|0|0|||||||| +5179|4465|content://media/external/images/media/4465|/storage/emulated/0/DCIM/Camera/IMG_20191012_173126.jpg|image/jpeg|4000|2250|0|4601899||1637505091|1570894287000|1570894287337|0|0|0|||||||| +5180|3939|content://media/external/images/media/3939|/storage/emulated/0/DCIM/Camera/IMG_20191012_173123.jpg|image/jpeg|4000|2250|0|5064820||1637503853|1570894285000|1570894285332|0|0|0|||||||| +5181|5941|content://media/external/images/media/5941|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191011-WA0024.jpg|image/jpeg|989|1024|0|97728||1637518220|1570829415000|0|0|0|0|||||||| +5182|2898|content://media/external/images/media/2898|/storage/emulated/0/DCIM/Camera/IMG_20191010_201512.jpg|image/jpeg|1928|803|0|412375||1637501534|1570731312000|1570476248525|0|0|0|||||||| +5183|6050|content://media/external/images/media/6050|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191010-WA0001.jpg|image/jpeg|1600|1202|0|140626||1637518220|1570684331000|0|0|0|0|||||||| +5184|5940|content://media/external/images/media/5940|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191010-WA0000.jpg|image/jpeg|1600|1200|0|208676||1637518220|1570684330000|0|0|0|0|||||||| +5185|2685|content://media/external/images/media/2685|/storage/emulated/0/Pictures/1570482791224.jpg|image/jpeg|1399|2184|0|169829||1637500871|1570482791000|0|0|0|0|||||||| +5186|2634|content://media/external/images/media/2634|/storage/emulated/0/DCIM/PhotoScan/1570479693994-71928632-f87c-45c2-82a8-7dd9166f427d.jpg|image/jpeg|1333|2000|0|1255016||1637500870|1570479855000|0|0|0|0|||||||| +5187|3760|content://media/external/images/media/3760|/storage/emulated/0/DCIM/Camera/IMG_20191007_214026.jpg|image/jpeg|4000|2250|180|4033192||1637503508|1570477227000|1570477227764|0|0|0|||||||| +5188|4110|content://media/external/images/media/4110|/storage/emulated/0/DCIM/Camera/IMG_20191007_214021.jpg|image/jpeg|4000|2250|180|4616888||1637504451|1570477222000|1570477222475|0|0|0|||||||| +5189|3124|content://media/external/images/media/3124|/storage/emulated/0/DCIM/Camera/IMG_20191007_212406.jpg|image/jpeg|4000|2250|0|4768519||1637502068|1570476248000|1570476248525|0|0|0|||||||| +5190|5843|content://media/external/images/media/5843|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191006-WA0019.jpg|image/jpeg|1200|1599|0|251169||1637518220|1570363836000|0|0|0|0|||||||| +5191|6169|content://media/external/images/media/6169|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191006-WA0011.jpg|image/jpeg|1200|1599|0|226085||1637518221|1570355193000|0|0|0|0|||||||| +5192|3678|content://media/external/images/media/3678|/storage/emulated/0/DCIM/Camera/IMG_20191005_161522.jpg|image/jpeg|3264|1836|90|3213840||1637503389|1570284922000|1570284921957|0|0|0|||||||| +5193|1001|content://media/external/images/media/1001|/storage/emulated/0/JamendoMusic/EmbeddedCover.jpg|image/jpeg|1200|1161|0|432997||1637500139|1570203811000|0|0|0|0|||||||| +5194|1002|content://media/external/images/media/1002|/storage/emulated/0/Music Downloader/EmbeddedCover.jpg|image/jpeg|1200|1200|0|343524||1637500139|1570203811000|0|0|0|0|||||||| +5195|1003|content://media/external/images/media/1003|/storage/emulated/0/Music/EmbeddedCover.jpg|image/jpeg|604|600|0|64468||1637500139|1570203811000|0|0|0|0|||||||| +5196|6049|content://media/external/images/media/6049|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191004-WA0002.jpg|image/jpeg|750|1334|0|88097||1637518220|1570193170000|0|0|0|0|||||||| +5197|5939|content://media/external/images/media/5939|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191002-WA0005.jpg|image/jpeg|1600|1202|0|200849||1637518220|1570053589000|0|0|0|0|||||||| +5198|6048|content://media/external/images/media/6048|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191002-WA0004.jpg|image/jpeg|1600|901|0|155871||1637518220|1570052324000|0|0|0|0|||||||| +5199|5938|content://media/external/images/media/5938|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191002-WA0002.jpg|image/jpeg|1600|901|0|152282||1637518220|1570052323000|0|0|0|0|||||||| +5200|6167|content://media/external/images/media/6167|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191002-WA0001.jpg|image/jpeg|1600|901|0|180352||1637518221|1570052323000|0|0|0|0|||||||| +5201|6168|content://media/external/images/media/6168|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20191002-WA0003.jpg|image/jpeg|1600|901|0|156158||1637518221|1570052323000|0|0|0|0|||||||| +5202|2821|content://media/external/images/media/2821|/storage/emulated/0/DCIM/Camera/IMG_20191001_214352.jpg|image/jpeg|4160|2340|0|3497738||1637501369|1569959032000|1569959032720|0|0|0|||||||| +5203|4130|content://media/external/images/media/4130|/storage/emulated/0/DCIM/Camera/IMG_20190930_181717.jpg|image/jpeg|4000|2250|90|5164304||1637504473|1569860239000|1569860239121|0|0|0|||||||| +5204|3597|content://media/external/images/media/3597|/storage/emulated/0/DCIM/Camera/IMG_20190930_175946.jpg|image/jpeg|4000|2250|0|5201537||1637503238|1569859188000|1569859188852|0|0|0|||||||| +5205|5842|content://media/external/images/media/5842|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190930-WA0001.jpg|image/jpeg|973|624|0|78280||1637518220|1569796036000|0|0|0|0|||||||| +5206|3822|content://media/external/images/media/3822|/storage/emulated/0/DCIM/Camera/IMG_20190928_080615.jpg|image/jpeg|4000|2250|0|4910065||1637503629|1569650776000|1569650776872|0|0|0|||||||| +5207|3004|content://media/external/images/media/3004|/storage/emulated/0/DCIM/Camera/IMG_20190927_230030.jpg|image/jpeg|4160|2340|0|5271203||1637501786|1569618030000|1569618030408|0|0|0|||||||| +5208|2856|content://media/external/images/media/2856|/storage/emulated/0/DCIM/Camera/IMG_20190927_225851.jpg|image/jpeg|4000|2250|90|3847939||1637501457|1569617931000|1569617931289|0|0|0|||||||| +5209|4773|content://media/external/images/media/4773|/storage/emulated/0/DCIM/Camera/IMG_20190927_225610_1.jpg|image/jpeg|4000|3000|90|5427408||1637505656|1569617770000|1569617770772|0|0|0|||||||| +5210|3166|content://media/external/images/media/3166|/storage/emulated/0/DCIM/Camera/IMG_20190926_185603.jpg|image/jpeg|4000|3000|90|6889330||1637502143|1569516965000|1569516965197|0|0|0|||||||| +5211|3529|content://media/external/images/media/3529|/storage/emulated/0/DCIM/Camera/IMG_20190923_203557.jpg|image/jpeg|4000|3000|90|5795300||1637503010|1569263758000|1569263758876|0|0|0|||||||| +5212|2644|content://media/external/images/media/2644|/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-09-21-18-49-48-679_com.brytonsport.active.png|image/png|1080|2340|0|624372||1637500870|1569084589000|0|0|0|0|||||||| +5213|2855|content://media/external/images/media/2855|/storage/emulated/0/DCIM/Camera/IMG_20190921_120845.jpg|image/jpeg|8000|6000|90|22960750||1637501457|1569060527000|1569060527055|0|0|0|||||||| +5214|3165|content://media/external/images/media/3165|/storage/emulated/0/DCIM/Camera/IMG_20190921_120812_1.jpg|image/jpeg|4000|3000|90|7482130||1637502143|1569060493000|1569060493458|0|0|0|||||||| +5215|3372|content://media/external/images/media/3372|/storage/emulated/0/DCIM/Camera/IMG_20190921_120812.jpg|image/jpeg|4000|3000|90|8168234||1637502523|1569060493000|1569060493562|0|0|0|||||||| +5216|3359|content://media/external/images/media/3359|/storage/emulated/0/DCIM/Camera/IMG_20190921_115513.jpg|image/jpeg|4160|3120|0|7039958||1637502451|1569059713000|1569059713225|0|0|0|||||||| +5217|3953|content://media/external/images/media/3953|/storage/emulated/0/DCIM/Camera/IMG_20190921_115507.jpg|image/jpeg|4160|3120|0|6653348||1637503942|1569059708000|1569059707750|0|0|0|||||||| +5218|5935|content://media/external/images/media/5935|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190920-WA0024.jpg|image/jpeg|1200|1600|0|138786||1637518220|1569003829000|0|0|0|0|||||||| +5219|5936|content://media/external/images/media/5936|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190920-WA0025.jpg|image/jpeg|1200|1600|0|174715||1637518220|1569003829000|0|0|0|0|||||||| +5220|5841|content://media/external/images/media/5841|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190920-WA0022.jpg|image/jpeg|1200|1600|0|189335||1637518220|1569003828000|0|0|0|0|||||||| +5221|5934|content://media/external/images/media/5934|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190920-WA0023.jpg|image/jpeg|1200|1600|0|194556||1637518220|1569003828000|0|0|0|0|||||||| +5222|4750|content://media/external/images/media/4750|/storage/emulated/0/DCIM/Camera/IMG_20190920_195613.jpg|image/jpeg|4000|3000|90|5588232||1637505639|1569002175000|1569002174963|0|0|0|||||||| +5223|3087|content://media/external/images/media/3087|/storage/emulated/0/DCIM/Camera/IMG_20190920_195608.jpg|image/jpeg|4000|3000|0|5940569||1637501970|1569002170000|1569002170253|0|0|0|||||||| +5224|2730|content://media/external/images/media/2730|/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-09-18-20-54-35-675_com.android.browser.png|image/png|1080|2340|0|1867455||1637500987|1568832876000|0|0|0|0|||||||| +5225|5933|content://media/external/images/media/5933|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190915-WA0062.jpg|image/jpeg|1600|1200|0|238266||1637518220|1568583570000|0|0|0|0|||||||| +5226|5840|content://media/external/images/media/5840|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190915-WA0061.jpg|image/jpeg|1600|1200|0|261431||1637518220|1568583540000|0|0|0|0|||||||| +5227|6047|content://media/external/images/media/6047|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190915-WA0060.jpg|image/jpeg|1600|1200|0|180532||1637518220|1568583538000|0|0|0|0|||||||| +5228|4032|content://media/external/images/media/4032|/storage/emulated/0/DCIM/Camera/IMG_20190914_202652.jpg|image/jpeg|4000|3000|90|5587977||1637504234|1568485613000|1568485613732|0|0|0|||||||| +5229|2632|content://media/external/images/media/2632|/storage/emulated/0/DCIM/PhotoDirector/2019-09-11-09-58-55.jpg|image/jpeg|2560|1920|0|1073723||1637500870|1568188735000|1567949572590|0|0|0|||||||| +5230|3418|content://media/external/images/media/3418|/storage/emulated/0/DCIM/Camera/IMG_20190911_095015.jpg|image/jpeg|4000|3000|90|5767081||1637502682|1568188217000|1568188217349|0|0|0|||||||| +5231|3086|content://media/external/images/media/3086|/storage/emulated/0/DCIM/Camera/IMG_20190908_153258.jpg|image/jpeg|8000|6000|0|14423230||1637501970|1567949579000|1567949579770|0|0|0|||||||| +5232|3281|content://media/external/images/media/3281|/storage/emulated/0/DCIM/Camera/IMG_20190908_153250.jpg|image/jpeg|8000|6000|0|12444971||1637502355|1567949572000|1567949572590|0|0|0|||||||| +5233|4149|content://media/external/images/media/4149|/storage/emulated/0/DCIM/Camera/IMG_20190908_153239.jpg|image/jpeg|4000|3000|90|5934570||1637504481|1567949559000|1567949559844|0|0|0|||||||| +5234|3003|content://media/external/images/media/3003|/storage/emulated/0/DCIM/Camera/IMG_20190908_142331.jpg|image/jpeg|4000|3000|90|6424583||1637501786|1567945412000|1567945412338|0|0|0|||||||| +5235|4498|content://media/external/images/media/4498|/storage/emulated/0/DCIM/Camera/IMG_20190908_142326.jpg|image/jpeg|4000|3000|90|6493886||1637505160|1567945408000|1567945408192|0|0|0|||||||| +5236|4658|content://media/external/images/media/4658|/storage/emulated/0/DCIM/Camera/IMG_20190908_142327.jpg|image/jpeg|4000|3000|90|6569337||1637505417|1567945408000|1567945408424|0|0|0|||||||| +5237|4641|content://media/external/images/media/4641|/storage/emulated/0/DCIM/Camera/IMG_20190908_140333.jpg|image/jpeg|4000|3000|0|8846228||1637505414|1567944214000|1567944214857|0|0|0|||||||| +5238|4627|content://media/external/images/media/4627|/storage/emulated/0/DCIM/Camera/IMG_20190908_140303.jpg|image/jpeg|4000|3000|0|9185929||1637505390|1567944185000|1567944185053|0|0|0|||||||| +5239|3394|content://media/external/images/media/3394|/storage/emulated/0/DCIM/Camera/IMG_20190908_140254.jpg|image/jpeg|4000|3000|0|8897032||1637502598|1567944176000|1567944175983|0|0|0|||||||| +5240|3843|content://media/external/images/media/3843|/storage/emulated/0/DCIM/Camera/IMG_20190908_140020.jpg|image/jpeg|4000|3000|0|8880191||1637503642|1567944021000|1567944021642|0|0|0|||||||| +5241|3977|content://media/external/images/media/3977|/storage/emulated/0/DCIM/Camera/IMG_20190908_140018.jpg|image/jpeg|4000|3000|0|9255676||1637504059|1567944020000|1567944020111|0|0|0|||||||| +5242|3528|content://media/external/images/media/3528|/storage/emulated/0/DCIM/Camera/IMG_20190907_164309_1.jpg|image/jpeg|4000|3000|90|6163026||1637503010|1567867390000|1567867390354|0|0|0|||||||| +5243|3653|content://media/external/images/media/3653|/storage/emulated/0/DCIM/Camera/IMG_20190907_164309.jpg|image/jpeg|4000|3000|90|7122901||1637503358|1567867390000|1567867390886|0|0|0|||||||| +5244|3485|content://media/external/images/media/3485|/storage/emulated/0/DCIM/Camera/IMG_20190907_164307.jpg|image/jpeg|4000|3000|90|6463181||1637502870|1567867388000|1567867388513|0|0|0|||||||| +5245|4991|content://media/external/images/media/4991|/storage/emulated/0/DCIM/Camera/IMG_20190907_164306.jpg|image/jpeg|4000|3000|90|6719258||1637506101|1567867387000|1567867387349|0|0|0|||||||| +5246|2820|content://media/external/images/media/2820|/storage/emulated/0/DCIM/Camera/IMG_20190907_164132.jpg|image/jpeg|4000|3000|0|8534888||1637501369|1567867293000|1567867293658|0|0|0|||||||| +5247|3842|content://media/external/images/media/3842|/storage/emulated/0/DCIM/Camera/IMG_20190907_164127.jpg|image/jpeg|4160|3120|0|7013962||1637503642|1567867287000|1567867287749|0|0|0|||||||| +5248|3741|content://media/external/images/media/3741|/storage/emulated/0/DCIM/Camera/IMG_20190907_164114.jpg|image/jpeg|4000|3000|90|6764786||1637503488|1567867275000|1567867275632|0|0|0|||||||| +5249|2799|content://media/external/images/media/2799|/storage/emulated/0/DCIM/Camera/IMG_20190907_164111.jpg|image/jpeg|4000|3000|90|6658946||1637501311|1567867272000|1567867272581|0|0|0|||||||| +5250|3202|content://media/external/images/media/3202|/storage/emulated/0/DCIM/Camera/IMG_20190907_164103.jpg|image/jpeg|4000|3000|90|6118985||1637502256|1567867264000|1567867264894|0|0|0|||||||| +5251|3043|content://media/external/images/media/3043|/storage/emulated/0/DCIM/Camera/IMG_20190907_164059.jpg|image/jpeg|4000|3000|90|7257335||1637501858|1567867260000|1567867260207|0|0|0|||||||| +5252|4429|content://media/external/images/media/4429|/storage/emulated/0/DCIM/Camera/IMG_20190907_152114.jpg|image/jpeg|4000|3000|90|5513948||1637505068|1567862476000|1567862476084|0|0|0|||||||| +5253|3841|content://media/external/images/media/3841|/storage/emulated/0/DCIM/Camera/IMG_20190907_152113.jpg|image/jpeg|4000|3000|90|5501124||1637503642|1567862474000|1567862474688|0|0|0|||||||| +5254|4304|content://media/external/images/media/4304|/storage/emulated/0/DCIM/Camera/IMG_20190907_152055.jpg|image/jpeg|4000|3000|90|5726070||1637504817|1567862456000|1567862456349|0|0|0|||||||| +5255|4220|content://media/external/images/media/4220|/storage/emulated/0/DCIM/Camera/IMG_20190907_152052.jpg|image/jpeg|4000|3000|90|5657704||1637504726|1567862454000|1567862454066|0|0|0|||||||| +5256|5839|content://media/external/images/media/5839|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190906-WA0016.jpg|image/jpeg|900|1600|0|175072||1637518220|1567793184000|0|0|0|0|||||||| +5257|4841|content://media/external/images/media/4841|/storage/emulated/0/DCIM/Camera/IMG_20190906_171932.jpg|image/jpeg|4000|3000|90|5973258||1637505753|1567783174000|1567783173942|0|0|0|||||||| +5258|4410|content://media/external/images/media/4410|/storage/emulated/0/DCIM/Camera/IMG_20190906_170234.jpg|image/jpeg|4000|3000|90|5422237||1637505062|1567782156000|1567782156081|0|0|0|||||||| +5259|4031|content://media/external/images/media/4031|/storage/emulated/0/DCIM/Camera/IMG_20190906_163647.jpg|image/jpeg|4000|3000|90|5579793||1637504234|1567780608000|1567780608494|0|0|0|||||||| +5260|2978|content://media/external/images/media/2978|/storage/emulated/0/DCIM/Camera/PANO_20190905_215741.jpg|image/jpeg|4816|3616|0|4407409||1637501685|1567713465000|0|0|0|0|||||||| +5261|4874|content://media/external/images/media/4874|/storage/emulated/0/DCIM/Camera/PANO_20190905_215718.jpg|image/jpeg|7536|3712|0|7244937||1637505831|1567713448000|0|0|0|0|||||||| +5262|3759|content://media/external/images/media/3759|/storage/emulated/0/DCIM/Camera/IMG_20190905_215557.jpg|image/jpeg|4000|3000|0|5399914||1637503508|1567713357000|1567713357393|0|0|0|||||||| +5263|3866|content://media/external/images/media/3866|/storage/emulated/0/DCIM/Camera/IMG_20190905_203324.jpg|image/jpeg|4000|3000|0|5688071||1637503729|1567708406000|1567708406140|0|0|0|||||||| +5264|2729|content://media/external/images/media/2729|/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-09-05-20-23-48-504_com.stt.android.suunto.png|image/png|1080|2340|0|870280||1637500987|1567707828000|0|0|0|0|||||||| +5265|3720|content://media/external/images/media/3720|/storage/emulated/0/DCIM/Camera/IMG_20190905_185333.jpg|image/jpeg|4160|3120|0|9378681||1637503477|1567702413000|1567702413064|0|0|0|||||||| +5266|4195|content://media/external/images/media/4195|/storage/emulated/0/DCIM/Camera/PANO_20190905_182906.jpg|image/jpeg|10352|3712|0|13297337||1637504558|1567700952000|0|0|0|0|||||||| +5267|5838|content://media/external/images/media/5838|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190905-WA0017.jpg|image/jpeg|945|1024|0|233180||1637518220|1567671819000|0|0|0|0|||||||| +5268|2835|content://media/external/images/media/2835|/storage/emulated/0/DCIM/Camera/PANO_20190905_081559.jpg|image/jpeg|9616|3648|0|8222603||1637501370|1567664166000|0|0|0|0|||||||| +5269|3840|content://media/external/images/media/3840|/storage/emulated/0/DCIM/Camera/IMG_20190905_080559.jpg|image/jpeg|4000|3000|0|7557694||1637503642|1567663560000|1567663560667|0|0|0|||||||| +5270|3548|content://media/external/images/media/3548|/storage/emulated/0/DCIM/Camera/IMG_20190905_080542.jpg|image/jpeg|4000|3000|0|7484975||1637503058|1567663543000|1567663543740|0|0|0|||||||| +5271|4889|content://media/external/images/media/4889|/storage/emulated/0/DCIM/Camera/IMG_20190905_075648.jpg|image/jpeg|4000|3000|0|8170619||1637505920|1567663009000|1567663009234|0|0|0|||||||| +5272|4640|content://media/external/images/media/4640|/storage/emulated/0/DCIM/Camera/IMG_20190905_075627.jpg|image/jpeg|4000|3000|0|8457860||1637505414|1567662990000|1567662990379|0|0|0|||||||| +5273|4792|content://media/external/images/media/4792|/storage/emulated/0/DCIM/Camera/IMG_20190905_075124.jpg|image/jpeg|4160|3120|0|8278569||1637505663|1567662684000|1567662684145|0|0|0|||||||| +5274|3719|content://media/external/images/media/3719|/storage/emulated/0/DCIM/Camera/IMG_20190904_180139.jpg|image/jpeg|4160|3120|0|7964378||1637503477|1567612899000|1567612899104|0|0|0|||||||| +5275|4695|content://media/external/images/media/4695|/storage/emulated/0/DCIM/Camera/IMG_20190904_175806.jpg|image/jpeg|4160|3120|0|7285096||1637505509|1567612686000|1567612686094|0|0|0|||||||| +5276|3042|content://media/external/images/media/3042|/storage/emulated/0/DCIM/Camera/IMG_20190904_175758.jpg|image/jpeg|4000|3000|0|8643836||1637501858|1567612679000|1567612679791|0|0|0|||||||| +5277|3952|content://media/external/images/media/3952|/storage/emulated/0/DCIM/Camera/IMG_20190904_175735.jpg|image/jpeg|4000|3000|0|7838328||1637503942|1567612657000|1567612657203|0|0|0|||||||| +5278|3573|content://media/external/images/media/3573|/storage/emulated/0/DCIM/Camera/IMG_20190904_175721.jpg|image/jpeg|4160|3120|0|6680904||1637503154|1567612641000|1567612641201|0|0|0|||||||| +5279|4600|content://media/external/images/media/4600|/storage/emulated/0/DCIM/Camera/IMG_20190904_175707.jpg|image/jpeg|4160|3120|0|6992490||1637505308|1567612627000|1567612627238|0|0|0|||||||| +5280|4129|content://media/external/images/media/4129|/storage/emulated/0/DCIM/Camera/IMG_20190904_175647.jpg|image/jpeg|4000|3000|0|7387842||1637504473|1567612608000|1567612608498|0|0|0|||||||| +5281|4182|content://media/external/images/media/4182|/storage/emulated/0/DCIM/Camera/IMG_20190904_175637.jpg|image/jpeg|4000|3000|0|7659701||1637504558|1567612598000|1567612598560|0|0|0|||||||| +5282|3182|content://media/external/images/media/3182|/storage/emulated/0/DCIM/Camera/IMG_20190904_175635.jpg|image/jpeg|4000|3000|0|7505172||1637502161|1567612596000|1567612596819|0|0|0|||||||| +5283|3371|content://media/external/images/media/3371|/storage/emulated/0/DCIM/Camera/IMG_20190904_175436.jpg|image/jpeg|4000|3000|0|7643213||1637502523|1567612478000|1567612478187|0|0|0|||||||| +5284|3803|content://media/external/images/media/3803|/storage/emulated/0/DCIM/Camera/IMG_20190904_175342.jpg|image/jpeg|4000|3000|90|5067924||1637503601|1567612427000|1567612427052|0|0|0|||||||| +5285|3064|content://media/external/images/media/3064|/storage/emulated/0/DCIM/Camera/IMG_20190904_175340.jpg|image/jpeg|4000|3000|90|5991914||1637501905|1567612424000|1567612424313|0|0|0|||||||| +5286|3416|content://media/external/images/media/3416|/storage/emulated/0/DCIM/Camera/IMG_20190904_175343.jpg|image/jpeg|720|960|0|120226||1637502682|1567612424000|0|0|0|0|||||||| +5287|4497|content://media/external/images/media/4497|/storage/emulated/0/DCIM/Camera/IMG_20190904_175318.jpg|image/jpeg|4160|3120|0|6774044||1637505160|1567612399000|1567612398904|0|0|0|||||||| +5288|4318|content://media/external/images/media/4318|/storage/emulated/0/DCIM/Camera/IMG_20190904_174131.jpg|image/jpeg|4160|3120|0|6428683||1637504894|1567611691000|1567611691603|0|0|0|||||||| +5289|4161|content://media/external/images/media/4161|/storage/emulated/0/DCIM/Camera/PANO_20190904_173619.jpg|image/jpeg|9520|3776|0|10406528||1637504481|1567611388000|0|0|0|0|||||||| +5290|4560|content://media/external/images/media/4560|/storage/emulated/0/DCIM/Camera/IMG_20190904_173611.jpg|image/jpeg|4000|3000|0|7707482||1637505216|1567611372000|1567611372300|0|0|0|||||||| +5291|4859|content://media/external/images/media/4859|/storage/emulated/0/DCIM/Camera/IMG_20190904_170139.jpg|image/jpeg|4000|3000|90|5416241||1637505831|1567609300000|1567609300640|0|0|0|||||||| +5292|5837|content://media/external/images/media/5837|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190902-WA0013.jpg|image/jpeg|1328|747|0|138340||1637518220|1567454693000|0|0|0|0|||||||| +5293|4278|content://media/external/images/media/4278|/storage/emulated/0/DCIM/Camera/IMG_20190901_135056.jpg|image/jpeg|4000|3000|180|5526895||1637504807|1567338657000|1567338657274|0|0|0|||||||| +5294|5016|content://media/external/images/media/5016|/storage/emulated/0/DCIM/Camera/IMG_20190901_121123.jpg|image/jpeg|4000|3000|0|6852134||1637506134|1567332684000|1567332684697|0|0|0|||||||| +5295|2896|content://media/external/images/media/2896|/storage/emulated/0/DCIM/Camera/IMG_20190901_121119.jpg|image/jpeg|4000|3000|0|6859878||1637501534|1567332681000|1567332681360|0|0|0|||||||| +5296|3239|content://media/external/images/media/3239|/storage/emulated/0/DCIM/Camera/IMG_20190831_160601.jpg|image/jpeg|4000|3000|0|6403744||1637502259|1567260362000|1567260362250|0|0|0|||||||| +5297|6046|content://media/external/images/media/6046|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190830-WA0033.jpg|image/jpeg|768|1024|0|99591||1637518220|1567189921000|0|0|0|0|||||||| +5298|6045|content://media/external/images/media/6045|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190830-WA0032.jpg|image/jpeg|768|1024|0|85844||1637518220|1567189769000|0|0|0|0|||||||| +5299|5932|content://media/external/images/media/5932|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190830-WA0031.jpg|image/jpeg|768|1024|0|86498||1637518220|1567189709000|0|0|0|0|||||||| +5300|6044|content://media/external/images/media/6044|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190830-WA0024.jpg|image/jpeg|1600|900|0|165194||1637518220|1567180221000|0|0|0|0|||||||| +5301|4148|content://media/external/images/media/4148|/storage/emulated/0/DCIM/Camera/IMG_20190827_175151.jpg|image/jpeg|4000|3000|0|5370185||1637504481|1566921112000|1566921112009|0|0|0|||||||| +5302|3995|content://media/external/images/media/3995|/storage/emulated/0/DCIM/Camera/IMG_20190827_175017.jpg|image/jpeg|4000|3000|270|5371745||1637504086|1566921018000|1566921017969|0|0|0|||||||| +5303|4181|content://media/external/images/media/4181|/storage/emulated/0/DCIM/Camera/IMG_20190827_174953.jpg|image/jpeg|4000|3000|90|5559902||1637504558|1566920994000|1566920994478|0|0|0|||||||| +5304|3137|content://media/external/images/media/3137|/storage/emulated/0/DCIM/Camera/IMG_20190827_174426.jpg|image/jpeg|4000|3000|180|5774798||1637502130|1566920667000|1566920667517|0|0|0|||||||| +5305|3085|content://media/external/images/media/3085|/storage/emulated/0/DCIM/Camera/IMG_20190827_131321.jpg|image/jpeg|4000|3000|90|6367945||1637501970|1566904402000|1566904402371|0|0|0|||||||| +5306|3224|content://media/external/images/media/3224|/storage/emulated/0/DCIM/Camera/IMG_20190827_130932.jpg|image/jpeg|4000|3000|90|5776311||1637502258|1566904174000|1566904174401|0|0|0|||||||| +5307|6043|content://media/external/images/media/6043|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0031.jpg|image/jpeg|1600|1200|0|301829||1637518220|1566721389000|0|0|0|0|||||||| +5308|5836|content://media/external/images/media/5836|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0030.jpg|image/jpeg|1600|1200|0|347926||1637518220|1566721388000|0|0|0|0|||||||| +5309|6166|content://media/external/images/media/6166|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0029.jpg|image/jpeg|1600|1200|0|383824||1637518221|1566721388000|0|0|0|0|||||||| +5310|5835|content://media/external/images/media/5835|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0027.jpg|image/jpeg|1600|1200|0|291181||1637518220|1566721387000|0|0|0|0|||||||| +5311|6042|content://media/external/images/media/6042|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0028.jpg|image/jpeg|1600|1200|0|376852||1637518220|1566721387000|0|0|0|0|||||||| +5312|5834|content://media/external/images/media/5834|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0025.jpg|image/jpeg|1600|1202|0|253998||1637518220|1566721386000|0|0|0|0|||||||| +5313|5931|content://media/external/images/media/5931|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0026.jpg|image/jpeg|1600|1200|0|355828||1637518220|1566721386000|0|0|0|0|||||||| +5314|5832|content://media/external/images/media/5832|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0022.jpg|image/jpeg|1600|1200|0|228394||1637518220|1566721385000|0|0|0|0|||||||| +5315|5833|content://media/external/images/media/5833|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0023.jpg|image/jpeg|1600|1200|0|295543||1637518220|1566721385000|0|0|0|0|||||||| +5316|6165|content://media/external/images/media/6165|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0024.jpg|image/jpeg|1600|1200|0|230990||1637518221|1566721385000|0|0|0|0|||||||| +5317|5928|content://media/external/images/media/5928|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0018.jpg|image/jpeg|1600|1200|0|368650||1637518220|1566721384000|0|0|0|0|||||||| +5318|5929|content://media/external/images/media/5929|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0019.jpg|image/jpeg|1600|1200|0|350973||1637518220|1566721384000|0|0|0|0|||||||| +5319|5930|content://media/external/images/media/5930|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0020.jpg|image/jpeg|1600|1200|0|295265||1637518220|1566721384000|0|0|0|0|||||||| +5320|6164|content://media/external/images/media/6164|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0021.jpg|image/jpeg|1600|1200|0|255906||1637518221|1566721384000|0|0|0|0|||||||| +5321|6163|content://media/external/images/media/6163|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0017.jpg|image/jpeg|1600|1200|0|344909||1637518221|1566721383000|0|0|0|0|||||||| +5322|5831|content://media/external/images/media/5831|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0016.jpg|image/jpeg|1600|1200|0|348921||1637518220|1566721382000|0|0|0|0|||||||| +5323|5927|content://media/external/images/media/5927|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0015.jpg|image/jpeg|1600|1200|0|343570||1637518220|1566721382000|0|0|0|0|||||||| +5324|5830|content://media/external/images/media/5830|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0014.jpg|image/jpeg|1200|1600|0|442934||1637518220|1566721381000|0|0|0|0|||||||| +5325|5926|content://media/external/images/media/5926|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0013.jpg|image/jpeg|1600|1200|0|269297||1637518220|1566721381000|0|0|0|0|||||||| +5326|6040|content://media/external/images/media/6040|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0010.jpg|image/jpeg|1600|1200|0|275833||1637518220|1566721380000|0|0|0|0|||||||| +5327|6041|content://media/external/images/media/6041|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0011.jpg|image/jpeg|1600|1200|0|319720||1637518220|1566721380000|0|0|0|0|||||||| +5328|6162|content://media/external/images/media/6162|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0012.jpg|image/jpeg|1600|1200|0|281521||1637518221|1566721380000|0|0|0|0|||||||| +5329|5829|content://media/external/images/media/5829|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0008.jpg|image/jpeg|1600|1200|0|340756||1637518220|1566721379000|0|0|0|0|||||||| +5330|5925|content://media/external/images/media/5925|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0009.jpg|image/jpeg|1600|1200|0|343056||1637518220|1566721379000|0|0|0|0|||||||| +5331|6161|content://media/external/images/media/6161|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0007.jpg|image/jpeg|1600|1200|0|321415||1637518221|1566721378000|0|0|0|0|||||||| +5332|6039|content://media/external/images/media/6039|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0006.jpg|image/jpeg|1600|1200|0|191310||1637518220|1566721377000|0|0|0|0|||||||| +5333|6160|content://media/external/images/media/6160|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0005.jpg|image/jpeg|1600|1200|0|262338||1637518220|1566721377000|0|0|0|0|||||||| +5334|5828|content://media/external/images/media/5828|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0004.jpg|image/jpeg|1600|1200|0|223454||1637518220|1566721376000|0|0|0|0|||||||| +5335|5924|content://media/external/images/media/5924|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0003.jpg|image/jpeg|1600|1202|0|284205||1637518220|1566721376000|0|0|0|0|||||||| +5336|6038|content://media/external/images/media/6038|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190825-WA0002.jpg|image/jpeg|1600|898|0|230393||1637518220|1566721376000|0|0|0|0|||||||| +5337|3317|content://media/external/images/media/3317|/storage/emulated/0/DCIM/Camera/IMG_20190824_195143.jpg|image/jpeg|4000|3000|90|5995017||1637502438|1566669104000|1566669104312|0|0|0|||||||| +5338|4238|content://media/external/images/media/4238|/storage/emulated/0/DCIM/Camera/IMG_20190824_154145.jpg|image/jpeg|4000|3000|90|8409961||1637504734|1566654106000|1566654106325|0|0|0|||||||| +5339|3415|content://media/external/images/media/3415|/storage/emulated/0/DCIM/Camera/IMG_20190824_154129.jpg|image/jpeg|4000|3000|90|5777194||1637502682|1566654090000|1566654090860|0|0|0|||||||| +5340|2700|content://media/external/images/media/2700|/storage/emulated/0/Pictures/scanner/scanner_20190824_115851.jpg|image/jpeg|674|1062|0|391785||1637500871|1566640731000|0|0|0|0|||||||| +5341|2699|content://media/external/images/media/2699|/storage/emulated/0/Pictures/scanner/scanner_20190824_115712.jpg|image/jpeg|715|1111|0|422944||1637500871|1566640632000|0|0|0|0|||||||| +5342|2698|content://media/external/images/media/2698|/storage/emulated/0/Pictures/scanner/scanner_20190824_115708.jpg|image/jpeg|715|1111|0|422944||1637500871|1566640628000|0|0|0|0|||||||| +5343|3652|content://media/external/images/media/3652|/storage/emulated/0/DCIM/Camera/IMG_20190822_174537.jpg|image/jpeg|4000|3000|90|6572521||1637503358|1566488739000|1566488738982|0|0|0|||||||| +5344|2728|content://media/external/images/media/2728|/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-08-21-18-43-50-425_com.brytonsport.active.png|image/png|1080|2340|0|452375||1637500987|1566405830000|0|0|0|0|||||||| +5345|4409|content://media/external/images/media/4409|/storage/emulated/0/DCIM/Camera/IMG_20190821_115621.jpg|image/jpeg|4000|3000|90|7884212||1637505062|1566381382000|1566381382556|0|0|0|||||||| +5346|4520|content://media/external/images/media/4520|/storage/emulated/0/DCIM/Camera/IMG_20190821_113736.jpg|image/jpeg|4160|3120|0|9861784||1637505165|1566380256000|1566380256400|0|0|0|||||||| +5347|2936|content://media/external/images/media/2936|/storage/emulated/0/DCIM/Camera/PANO_20190821_112340.jpg|image/jpeg|9776|3744|0|10162158||1637501599|1566379735000|0|0|0|0|||||||| +5348|3123|content://media/external/images/media/3123|/storage/emulated/0/DCIM/Camera/IMG_20190821_112427.jpg|image/jpeg|4160|3120|0|7833126||1637502068|1566379735000|1566379467379|0|0|0|||||||| +5349|3280|content://media/external/images/media/3280|/storage/emulated/0/DCIM/Camera/IMG_20190821_112424.jpg|image/jpeg|4160|3120|0|7607067||1637502355|1566379735000|1566379464440|0|0|0|||||||| +5350|3298|content://media/external/images/media/3298|/storage/emulated/0/DCIM/Camera/IMG_20190821_111415.jpg|image/jpeg|4160|3120|90|8269443||1637502430|1566379735000|1566378855530|0|0|0|||||||| +5351|3466|content://media/external/images/media/3466|/storage/emulated/0/DCIM/Camera/IMG_20190821_111811.jpg|image/jpeg|4160|3120|0|8063393||1637502817|1566379735000|1566379091214|0|0|0|||||||| +5352|4858|content://media/external/images/media/4858|/storage/emulated/0/DCIM/Camera/IMG_20190821_112419.jpg|image/jpeg|4160|3120|0|7694703||1637505831|1566379735000|1566379459650|0|0|0|||||||| +5353|4711|content://media/external/images/media/4711|/storage/emulated/0/DCIM/Camera/IMG_20190821_110931.jpg|image/jpeg|4160|3120|0|10927404||1637505565|1566378571000|1566378570935|0|0|0|||||||| +5354|3572|content://media/external/images/media/3572|/storage/emulated/0/DCIM/Camera/IMG_20190821_095815.jpg|image/jpeg|4000|3000|0|5591172||1637503154|1566374298000|1566374298280|0|0|0|||||||| +5355|4464|content://media/external/images/media/4464|/storage/emulated/0/DCIM/Camera/IMG_20190821_095813.jpg|image/jpeg|4000|3000|0|5570492||1637505091|1566374295000|1566374295882|0|0|0|||||||| +5356|3316|content://media/external/images/media/3316|/storage/emulated/0/DCIM/Camera/IMG_20190821_095809.jpg|image/jpeg|4000|3000|0|4795204||1637502438|1566374292000|1566374292836|0|0|0|||||||| +5357|3223|content://media/external/images/media/3223|/storage/emulated/0/DCIM/Camera/IMG_20190820_155749.jpg|image/jpeg|4000|3000|0|5066376||1637502258|1566309471000|1566309470935|0|0|0|||||||| +5358|5923|content://media/external/images/media/5923|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190820-WA0012.jpg|image/jpeg|1200|1599|0|310524||1637518220|1566307858000|0|0|0|0|||||||| +5359|5015|content://media/external/images/media/5015|/storage/emulated/0/DCIM/Camera/IMG_20190820_115754.jpg|image/jpeg|4000|3000|0|5260412||1637506134|1566295076000|1566295075975|0|0|0|||||||| +5360|3027|content://media/external/images/media/3027|/storage/emulated/0/DCIM/Camera/IMG_20190819_212840.jpg|image/jpeg|4000|3000|90|5625376||1637501805|1566242921000|1566242921659|0|0|0|||||||| +5361|4074|content://media/external/images/media/4074|/storage/emulated/0/DCIM/Camera/IMG_20190819_212745.jpg|image/jpeg|4000|3000|90|5666254||1637504394|1566242866000|1566242866704|0|0|0|||||||| +5362|1012|content://media/external/images/media/1012|/storage/emulated/0/mivideo/images/1566240092755.png|image/png|1080|2259|0|78571||1637500139|1566240093000|0|0|0|0|||||||| +5363|3222|content://media/external/images/media/3222|/storage/emulated/0/DCIM/Camera/IMG_20190819_134805.jpg|image/jpeg|1080|2161|0|524332||1637502258|1566215286000|0|0|0|0|||||||| +5364|6159|content://media/external/images/media/6159|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0026.jpg|image/jpeg|1600|1200|0|165306||1637518220|1566155710000|0|0|0|0|||||||| +5365|6037|content://media/external/images/media/6037|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0025.jpg|image/jpeg|1024|768|0|112159||1637518220|1566155706000|0|0|0|0|||||||| +5366|5827|content://media/external/images/media/5827|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0024.jpg|image/jpeg|1024|768|0|280125||1637518220|1566155704000|0|0|0|0|||||||| +5367|6158|content://media/external/images/media/6158|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0023.jpg|image/jpeg|1280|750|0|118779||1637518220|1566155697000|0|0|0|0|||||||| +5368|6157|content://media/external/images/media/6157|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0022.jpg|image/jpeg|1047|1600|0|410783||1637518220|1566155692000|0|0|0|0|||||||| +5369|6036|content://media/external/images/media/6036|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0021.jpg|image/jpeg|1024|769|0|130515||1637518220|1566155685000|0|0|0|0|||||||| +5370|6156|content://media/external/images/media/6156|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0020.jpg|image/jpeg|1600|1200|0|404440||1637518220|1566155682000|0|0|0|0|||||||| +5371|5922|content://media/external/images/media/5922|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0019.jpg|image/jpeg|1200|1600|0|419914||1637518220|1566155676000|0|0|0|0|||||||| +5372|5921|content://media/external/images/media/5921|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0018.jpg|image/jpeg|1600|1200|0|284234||1637518220|1566155667000|0|0|0|0|||||||| +5373|5826|content://media/external/images/media/5826|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0017.jpg|image/jpeg|1600|1200|0|269047||1637518220|1566155660000|0|0|0|0|||||||| +5374|5825|content://media/external/images/media/5825|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0016.jpg|image/jpeg|1600|1200|0|294300||1637518220|1566155656000|0|0|0|0|||||||| +5375|5920|content://media/external/images/media/5920|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0015.jpg|image/jpeg|1600|1022|0|256233||1637518220|1566155634000|0|0|0|0|||||||| +5376|6035|content://media/external/images/media/6035|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0014.jpg|image/jpeg|1599|899|0|226551||1637518220|1566138178000|0|0|0|0|||||||| +5377|6155|content://media/external/images/media/6155|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0013.jpg|image/jpeg|899|1599|0|153820||1637518220|1566138155000|0|0|0|0|||||||| +5378|6034|content://media/external/images/media/6034|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0012.jpg|image/jpeg|899|1599|0|259736||1637518220|1566138121000|0|0|0|0|||||||| +5379|6033|content://media/external/images/media/6033|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0011.jpg|image/jpeg|899|1599|0|204111||1637518220|1566138116000|0|0|0|0|||||||| +5380|3616|content://media/external/images/media/3616|/storage/emulated/0/DCIM/Camera/IMG_20190818_154043.jpg|image/jpeg|4160|3120|0|5977880||1637503271|1566135643000|1566135643275|0|0|0|||||||| +5381|6154|content://media/external/images/media/6154|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0010.jpg|image/jpeg|966|1288|0|165950||1637518220|1566131053000|0|0|0|0|||||||| +5382|5824|content://media/external/images/media/5824|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0009.jpg|image/jpeg|1040|780|0|46442||1637518220|1566130390000|0|0|0|0|||||||| +5383|3784|content://media/external/images/media/3784|/storage/emulated/0/DCIM/Camera/IMG_20190818_124946.jpg|image/jpeg|4160|3120|90|3731735||1637503558|1566125386000|1566125386681|0|0|0|||||||| +5384|3333|content://media/external/images/media/3333|/storage/emulated/0/DCIM/Camera/IMG_20190818_124942.jpg|image/jpeg|4160|3120|90|3741794||1637502439|1566125382000|1566125382836|0|0|0|||||||| +5385|4791|content://media/external/images/media/4791|/storage/emulated/0/DCIM/Camera/IMG_20190818_124840.jpg|image/jpeg|4000|3000|90|4614609||1637505663|1566125322000|1566125322551|0|0|0|||||||| +5386|4857|content://media/external/images/media/4857|/storage/emulated/0/DCIM/Camera/IMG_20190818_124817.jpg|image/jpeg|4000|3000|90|6511358||1637505830|1566125299000|1566125299265|0|0|0|||||||| +5387|6153|content://media/external/images/media/6153|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0008.jpg|image/jpeg|780|1040|0|48792||1637518220|1566124004000|0|0|0|0|||||||| +5388|6032|content://media/external/images/media/6032|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0007.jpg|image/jpeg|1200|1599|0|158472||1637518220|1566121621000|0|0|0|0|||||||| +5389|6152|content://media/external/images/media/6152|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0004.jpg|image/jpeg|1280|960|0|80270||1637518220|1566119073000|0|0|0|0|||||||| +5390|6031|content://media/external/images/media/6031|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0003.jpg|image/jpeg|780|1040|0|43041||1637518220|1566117241000|0|0|0|0|||||||| +5391|6030|content://media/external/images/media/6030|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0002.jpg|image/jpeg|898|1600|0|309596||1637518220|1566114793000|0|0|0|0|||||||| +5392|5823|content://media/external/images/media/5823|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0001.jpg|image/jpeg|1200|1600|0|153210||1637518220|1566114760000|0|0|0|0|||||||| +5393|2690|content://media/external/images/media/2690|/storage/emulated/0/Pictures/AdobeLightroom/LRM_EXPORT_135862161356858_20190818_090807768.jpeg|image/jpeg|5184|3880|0|4621959||1637500871|1566112093000|0|0|0|0|||||||| +5394|4198|content://media/external/images/media/4198|/storage/emulated/0/DCIM/Camera/IMG_20190818_085745.jpg|image/jpeg|3120|4160|0|4675377||1637504640|1566111467000|1565949430477|0|0|0|||||||| +5395|4481|content://media/external/images/media/4481|/storage/emulated/0/DCIM/Camera/IMG_20190818_085718.jpg|image/jpeg|3120|4160|0|2387862||1637505122|1566111440000|1565949442968|0|0|0|||||||| +5396|5014|content://media/external/images/media/5014|/storage/emulated/0/DCIM/Camera/IMG_20190818_085642.jpg|image/jpeg|3120|4160|0|2338218||1637506134|1566111406000|1565949447079|0|0|0|||||||| +5397|3718|content://media/external/images/media/3718|/storage/emulated/0/DCIM/Camera/IMG_20190818_085612.jpg|image/jpeg|4160|3120|0|2072402||1637503477|1566111373000|1565949459784|0|0|0|||||||| +5398|4428|content://media/external/images/media/4428|/storage/emulated/0/DCIM/Camera/IMG_20190818_085550.jpg|image/jpeg|4160|3120|0|3796505||1637505068|1566111353000|1565949496524|0|0|0|||||||| +5399|4946|content://media/external/images/media/4946|/storage/emulated/0/DCIM/Camera/IMG_20190818_085517.jpg|image/jpeg|4160|3120|0|3003866||1637506015|1566111319000|1565949501797|0|0|0|||||||| +5400|3865|content://media/external/images/media/3865|/storage/emulated/0/DCIM/Camera/IMG_20190818_085448.jpg|image/jpeg|4160|3120|0|2957474||1637503729|1566111290000|1565949501797|0|0|0|||||||| +5401|3002|content://media/external/images/media/3002|/storage/emulated/0/DCIM/Camera/IMG_20190818_085419.jpg|image/jpeg|4160|3120|0|2885367||1637501786|1566111261000|1565949505835|0|0|0|||||||| +5402|4730|content://media/external/images/media/4730|/storage/emulated/0/DCIM/Camera/IMG_20190818_085357.jpg|image/jpeg|4160|3120|0|2895680||1637505574|1566111239000|1565949505835|0|0|0|||||||| +5403|4339|content://media/external/images/media/4339|/storage/emulated/0/DCIM/Camera/IMG_20190818_085337.jpg|image/jpeg|4160|3120|0|2923368||1637504906|1566111219000|1565949505835|0|0|0|||||||| +5404|3063|content://media/external/images/media/3063|/storage/emulated/0/DCIM/Camera/IMG_20190818_085314.jpg|image/jpeg|4160|3120|0|2889119||1637501905|1566111197000|1565949505835|0|0|0|||||||| +5405|3740|content://media/external/images/media/3740|/storage/emulated/0/DCIM/Camera/IMG_20190818_085249.jpg|image/jpeg|4160|3120|0|2886474||1637503488|1566111172000|1565949505835|0|0|0|||||||| +5406|3864|content://media/external/images/media/3864|/storage/emulated/0/DCIM/Camera/IMG_20190818_085226.jpg|image/jpeg|4160|3120|0|2901129||1637503728|1566111148000|1565949505835|0|0|0|||||||| +5407|4389|content://media/external/images/media/4389|/storage/emulated/0/DCIM/Camera/IMG_20190818_085037.jpg|image/jpeg|4160|3120|0|2893597||1637505004|1566111039000|1565949505835|0|0|0|||||||| +5408|4694|content://media/external/images/media/4694|/storage/emulated/0/DCIM/Camera/IMG_20190818_084857.jpg|image/jpeg|4160|3120|0|2908695||1637505509|1566110939000|1565949505835|0|0|0|||||||| +5409|5919|content://media/external/images/media/5919|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190818-WA0000.jpg|image/jpeg|747|1328|0|66025||1637518220|1566110147000|0|0|0|0|||||||| +5410|6029|content://media/external/images/media/6029|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0040.jpg|image/jpeg|1600|1200|0|238655||1637518220|1566067424000|0|0|0|0|||||||| +5411|6151|content://media/external/images/media/6151|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0039.jpg|image/jpeg|899|1599|0|163702||1637518220|1566063591000|0|0|0|0|||||||| +5412|5822|content://media/external/images/media/5822|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0038.jpg|image/jpeg|777|1600|0|91433||1637518220|1566063343000|0|0|0|0|||||||| +5413|6150|content://media/external/images/media/6150|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0037.jpg|image/jpeg|1599|1200|0|565709||1637518220|1566053601000|0|0|0|0|||||||| +5414|6149|content://media/external/images/media/6149|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0036.jpg|image/jpeg|1200|1599|0|283858||1637518220|1566053600000|0|0|0|0|||||||| +5415|6027|content://media/external/images/media/6027|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0034.jpg|image/jpeg|1599|1200|0|528667||1637518220|1566053599000|0|0|0|0|||||||| +5416|6028|content://media/external/images/media/6028|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0035.jpg|image/jpeg|1599|1200|0|450503||1637518220|1566053599000|0|0|0|0|||||||| +5417|5918|content://media/external/images/media/5918|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0033.jpg|image/jpeg|1599|1200|0|638832||1637518220|1566053598000|0|0|0|0|||||||| +5418|5821|content://media/external/images/media/5821|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0032.jpg|image/jpeg|1599|1200|0|541847||1637518220|1566053597000|0|0|0|0|||||||| +5419|6026|content://media/external/images/media/6026|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0031.jpg|image/jpeg|1599|1200|0|487707||1637518220|1566053594000|0|0|0|0|||||||| +5420|6025|content://media/external/images/media/6025|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0030.jpg|image/jpeg|1200|1599|0|543716||1637518220|1566053589000|0|0|0|0|||||||| +5421|5820|content://media/external/images/media/5820|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0029.jpg|image/jpeg|1599|1200|0|241601||1637518220|1566053580000|0|0|0|0|||||||| +5422|6148|content://media/external/images/media/6148|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0028.jpg|image/jpeg|1599|1200|0|248101||1637518220|1566053137000|0|0|0|0|||||||| +5423|5917|content://media/external/images/media/5917|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0027.jpg|image/jpeg|1599|1200|0|144301||1637518220|1566053136000|0|0|0|0|||||||| +5424|7055|content://media/external/images/media/7055|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0025.jpg|image/jpeg|1200|1600|0|266290||1637518222|1566051183000|0|0|0|0|||||||| +5425|6615|content://media/external/images/media/6615|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0023.jpg|image/jpeg|1600|1200|0|180110||1637518221|1566044107000|0|0|0|0|||||||| +5426|6708|content://media/external/images/media/6708|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0024.jpg|image/jpeg|1200|1600|0|227199||1637518222|1566044107000|0|0|0|0|||||||| +5427|6814|content://media/external/images/media/6814|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0022.jpg|image/jpeg|720|1280|0|42792||1637518222|1566040693000|0|0|0|0|||||||| +5428|7054|content://media/external/images/media/7054|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0021.jpg|image/jpeg|899|1600|0|148478||1637518222|1566038612000|0|0|0|0|||||||| +5429|2922|content://media/external/images/media/2922|/storage/emulated/0/DCIM/Camera/IMG_20190817_124132.jpg|image/jpeg|4000|3000|0|7512689||1637501599|1566038494000|1566038494396|0|0|0|||||||| +5430|6269|content://media/external/images/media/6269|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0019.jpg|image/jpeg|1040|780|0|85845||1637518221|1566038340000|0|0|0|0|||||||| +5431|4626|content://media/external/images/media/4626|/storage/emulated/0/DCIM/Camera/IMG_20190817_120830.jpg|image/jpeg|8000|6000|90|37005510||1637505390|1566036513000|1566036512932|0|0|0|||||||| +5432|6268|content://media/external/images/media/6268|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0018.jpg|image/jpeg|1600|1200|0|131723||1637518221|1566035984000|0|0|0|0|||||||| +5433|6813|content://media/external/images/media/6813|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0017.jpg|image/jpeg|1200|1599|0|227663||1637518222|1566035691000|0|0|0|0|||||||| +5434|3358|content://media/external/images/media/3358|/storage/emulated/0/DCIM/Camera/IMG_20190817_114622.jpg|image/jpeg|8000|6000|90|24497988||1637502451|1566035184000|1566035184693|0|0|0|||||||| +5435|4350|content://media/external/images/media/4350|/storage/emulated/0/DCIM/Camera/IMG_20190817_114610.jpg|image/jpeg|4000|3000|90|8896773||1637504970|1566035171000|1566035171565|0|0|0|||||||| +5436|3465|content://media/external/images/media/3465|/storage/emulated/0/DCIM/Camera/IMG_20190817_112410.jpg|image/jpeg|8000|6000|90|21209524||1637502817|1566033852000|1566033852636|0|0|0|||||||| +5437|6267|content://media/external/images/media/6267|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0014.jpg|image/jpeg|1600|898|0|143566||1637518221|1566033255000|0|0|0|0|||||||| +5438|6614|content://media/external/images/media/6614|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0013.jpg|image/jpeg|1040|780|0|93241||1637518221|1566033255000|0|0|0|0|||||||| +5439|6936|content://media/external/images/media/6936|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0012.jpg|image/jpeg|1040|780|0|55947||1637518222|1566033255000|0|0|0|0|||||||| +5440|6706|content://media/external/images/media/6706|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0011.jpg|image/jpeg|1200|1600|0|192432||1637518222|1566033254000|0|0|0|0|||||||| +5441|2980|content://media/external/images/media/2980|/storage/emulated/0/DCIM/Camera/IMG_20190817_111137.jpg|image/jpeg|4000|3000|0|5202576||1637501771|1566033099000|1566033099768|0|0|0|||||||| +5442|4372|content://media/external/images/media/4372|/storage/emulated/0/DCIM/Camera/IMG_20190817_111125.jpg|image/jpeg|4160|3120|0|7769942||1637504982|1566033085000|1566033085325|0|0|0|||||||| +5443|4338|content://media/external/images/media/4338|/storage/emulated/0/DCIM/Camera/IMG_20190817_111115.jpg|image/jpeg|4000|3000|0|8137225||1637504906|1566033076000|1566033076202|0|0|0|||||||| +5444|4371|content://media/external/images/media/4371|/storage/emulated/0/DCIM/Camera/IMG_20190817_110645.jpg|image/jpeg|4000|3000|90|6494681||1637504982|1566032806000|1566032806587|0|0|0|||||||| +5445|3393|content://media/external/images/media/3393|/storage/emulated/0/DCIM/Camera/IMG_20190817_105135.jpg|image/jpeg|4160|3120|90|7705098||1637502598|1566031895000|1566031894987|0|0|0|||||||| +5446|3392|content://media/external/images/media/3392|/storage/emulated/0/DCIM/Camera/IMG_20190817_104656.jpg|image/jpeg|4160|3120|0|7184580||1637502598|1566031616000|1566031616616|0|0|0|||||||| +5447|2873|content://media/external/images/media/2873|/storage/emulated/0/DCIM/Camera/IMG_20190817_104652.jpg|image/jpeg|4160|3120|0|7414571||1637501460|1566031613000|1566031612950|0|0|0|||||||| +5448|4197|content://media/external/images/media/4197|/storage/emulated/0/DCIM/Camera/IMG_20190817_104649.jpg|image/jpeg|4160|3120|0|7951712||1637504640|1566031610000|1566031609907|0|0|0|||||||| +5449|4599|content://media/external/images/media/4599|/storage/emulated/0/DCIM/Camera/IMG_20190817_104611.jpg|image/jpeg|4160|3120|0|4851501||1637505308|1566031571000|1566031571079|0|0|0|||||||| +5450|2838|content://media/external/images/media/2838|/storage/emulated/0/DCIM/Camera/IMG_20190817_104601.jpg|image/jpeg|4160|3120|0|7023136||1637501431|1566031561000|1566031561346|0|0|0|||||||| +5451|6934|content://media/external/images/media/6934|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0009.jpg|image/jpeg|1200|1600|0|525777||1637518222|1566028723000|0|0|0|0|||||||| +5452|3634|content://media/external/images/media/3634|/storage/emulated/0/DCIM/Camera/IMG_20190817_095401.jpg|image/jpeg|8000|6000|90|32108375||1637503301|1566028443000|1566028443434|0|0|0|||||||| +5453|6935|content://media/external/images/media/6935|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0008.jpg|image/jpeg|1200|1599|0|314598||1637518222|1566026879000|0|0|0|0|||||||| +5454|3026|content://media/external/images/media/3026|/storage/emulated/0/DCIM/Camera/IMG_20190817_092610.jpg|image/jpeg|4000|3000|90|11114660||1637501805|1566026771000|1566026771746|0|0|0|||||||| +5455|6392|content://media/external/images/media/6392|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0007.jpg|image/jpeg|1600|497|0|75939||1637518221|1566026649000|0|0|0|0|||||||| +5456|6933|content://media/external/images/media/6933|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0006.jpg|image/jpeg|1600|497|0|79147||1637518222|1566026648000|0|0|0|0|||||||| +5457|6932|content://media/external/images/media/6932|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0004.jpg|image/jpeg|1200|1600|0|208297||1637518222|1566026374000|0|0|0|0|||||||| +5458|7053|content://media/external/images/media/7053|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0005.jpg|image/jpeg|1600|1200|0|123674||1637518222|1566026374000|0|0|0|0|||||||| +5459|7052|content://media/external/images/media/7052|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190817-WA0000.jpg|image/jpeg|747|1328|0|93296||1637518222|1566023816000|0|0|0|0|||||||| +5460|4887|content://media/external/images/media/4887|/storage/emulated/0/DCIM/Camera/IMG_20190816_211432.jpg|image/jpeg|2128|1403|0|807022||1637505920|1565982872000|1565982814282|0|0|0|||||||| +5461|3863|content://media/external/images/media/3863|/storage/emulated/0/DCIM/Camera/IMG_20190816_211333.jpg|image/jpeg|4000|3000|0|6108796||1637503728|1565982814000|1565982814282|0|0|0|||||||| +5462|6812|content://media/external/images/media/6812|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0045.jpg|image/jpeg|1130|1600|0|369056||1637518222|1565980343000|0|0|0|0|||||||| +5463|6811|content://media/external/images/media/6811|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0044.jpg|image/jpeg|747|1328|0|85479||1637518222|1565978630000|0|0|0|0|||||||| +5464|6391|content://media/external/images/media/6391|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0043.jpg|image/jpeg|1080|714|0|35856||1637518221|1565976568000|0|0|0|0|||||||| +5465|7051|content://media/external/images/media/7051|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0042.jpg|image/jpeg|1600|1202|0|253848||1637518222|1565971874000|0|0|0|0|||||||| +5466|6931|content://media/external/images/media/6931|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0041.jpg|image/jpeg|1328|747|0|133768||1637518222|1565970695000|0|0|0|0|||||||| +5467|7050|content://media/external/images/media/7050|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0040.jpg|image/jpeg|747|1328|0|176309||1637518222|1565970647000|0|0|0|0|||||||| +5468|6930|content://media/external/images/media/6930|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0039.jpg|image/jpeg|747|1328|0|118280||1637518222|1565970579000|0|0|0|0|||||||| +5469|6390|content://media/external/images/media/6390|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0011.jpg|image/jpeg|1200|1600|0|228445||1637518221|1565969132000|0|0|0|0|||||||| +5470|6266|content://media/external/images/media/6266|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0010.jpg|image/jpeg|960|1280|0|167449||1637518221|1565968755000|0|0|0|0|||||||| +5471|6613|content://media/external/images/media/6613|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0009.jpg|image/jpeg|800|1600|0|98508||1637518221|1565965951000|0|0|0|0|||||||| +5472|6928|content://media/external/images/media/6928|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0008.jpg|image/jpeg|1600|1202|0|216444||1637518222|1565965950000|0|0|0|0|||||||| +5473|5010|content://media/external/images/media/5010|/storage/emulated/0/DCIM/Camera/PANO_20190816_143658.jpg|image/jpeg|8400|3776|0|6419038||1637506101|1565959029000|0|0|0|0|||||||| +5474|4337|content://media/external/images/media/4337|/storage/emulated/0/DCIM/Camera/IMG_20190816_143313.jpg|image/jpeg|4000|3000|0|7164425||1637504906|1565958794000|1565958794149|0|0|0|||||||| +5475|4559|content://media/external/images/media/4559|/storage/emulated/0/DCIM/Camera/IMG_20190816_143308.jpg|image/jpeg|4000|3000|0|7315737||1637505216|1565958789000|1565958789121|0|0|0|||||||| +5476|4772|content://media/external/images/media/4772|/storage/emulated/0/DCIM/Camera/IMG_20190816_141347.jpg|image/jpeg|4160|3120|0|8170549||1637505656|1565957627000|1565957627337|0|0|0|||||||| +5477|3976|content://media/external/images/media/3976|/storage/emulated/0/DCIM/Camera/IMG_20190816_134543.jpg|image/jpeg|4000|3000|90|6985036||1637504059|1565955944000|1565955944912|0|0|0|||||||| +5478|4639|content://media/external/images/media/4639|/storage/emulated/0/DCIM/Camera/IMG_20190816_134537.jpg|image/jpeg|4000|3000|0|8079921||1637505414|1565955940000|1565955940033|0|0|0|||||||| +5479|4771|content://media/external/images/media/4771|/storage/emulated/0/DCIM/Camera/IMG_20190816_134435.jpg|image/jpeg|4000|3000|90|8011606||1637505656|1565955878000|1565955877913|0|0|0|||||||| +5480|3221|content://media/external/images/media/3221|/storage/emulated/0/DCIM/Camera/IMG_20190816_134430.jpg|image/jpeg|4000|3000|90|8390012||1637502258|1565955871000|1565955871092|0|0|0|||||||| +5481|4237|content://media/external/images/media/4237|/storage/emulated/0/DCIM/Camera/IMG_20190816_134050.jpg|image/jpeg|4160|3120|0|7927384||1637504734|1565955650000|1565955650543|0|0|0|||||||| +5482|3414|content://media/external/images/media/3414|/storage/emulated/0/DCIM/Camera/IMG_20190816_134041.jpg|image/jpeg|4000|3000|0|9347967||1637502682|1565955642000|1565955642674|0|0|0|||||||| +5483|4388|content://media/external/images/media/4388|/storage/emulated/0/DCIM/Camera/IMG_20190816_133538.jpg|image/jpeg|4000|3000|0|8159152||1637505004|1565955341000|1565955341658|0|0|0|||||||| +5484|4277|content://media/external/images/media/4277|/storage/emulated/0/DCIM/Camera/IMG_20190816_133533.jpg|image/jpeg|4000|3000|0|8834850||1637504807|1565955334000|1565955334633|0|0|0|||||||| +5485|2837|content://media/external/images/media/2837|/storage/emulated/0/DCIM/Camera/IMG_20190816_133529.jpg|image/jpeg|4160|3120|0|7937113||1637501431|1565955329000|1565955329419|0|0|0|||||||| +5486|3464|content://media/external/images/media/3464|/storage/emulated/0/DCIM/Camera/IMG_20190816_132127.jpg|image/jpeg|4000|3000|0|8400868||1637502817|1565954488000|1565954488776|0|0|0|||||||| +5487|4303|content://media/external/images/media/4303|/storage/emulated/0/DCIM/Camera/IMG_20190816_132125.jpg|image/jpeg|4000|3000|90|7473268||1637504817|1565954486000|1565954486584|0|0|0|||||||| +5488|3062|content://media/external/images/media/3062|/storage/emulated/0/DCIM/Camera/IMG_20190816_131605.jpg|image/jpeg|4000|3000|90|6521889||1637501905|1565954167000|1565954167170|0|0|0|||||||| +5489|4840|content://media/external/images/media/4840|/storage/emulated/0/DCIM/Camera/IMG_20190816_125930.jpg|image/jpeg|4160|3120|0|7385984||1637505753|1565953170000|1565953170320|0|0|0|||||||| +5490|4444|content://media/external/images/media/4444|/storage/emulated/0/DCIM/Camera/PANO_20190816_125649.jpg|image/jpeg|10160|3776|0|12008020||1637505068|1565953016000|0|0|0|0|||||||| +5491|3802|content://media/external/images/media/3802|/storage/emulated/0/DCIM/Camera/IMG_20190816_125331.jpg|image/jpeg|4000|3000|0|9790231||1637503601|1565952813000|1565952813088|0|0|0|||||||| +5492|4052|content://media/external/images/media/4052|/storage/emulated/0/DCIM/Camera/IMG_20190816_123416.jpg|image/jpeg|4160|3120|0|4694221||1637504342|1565951656000|1565951656864|0|0|0|||||||| +5493|3821|content://media/external/images/media/3821|/storage/emulated/0/DCIM/Camera/IMG_20190816_122615.jpg|image/jpeg|4160|3120|90|5012755||1637503629|1565951175000|1565951175621|0|0|0|||||||| +5494|3484|content://media/external/images/media/3484|/storage/emulated/0/DCIM/Camera/IMG_20190816_122612.jpg|image/jpeg|4160|3120|90|4576229||1637502870|1565951172000|1565951172318|0|0|0|||||||| +5495|4257|content://media/external/images/media/4257|/storage/emulated/0/DCIM/Camera/IMG_20190816_122608.jpg|image/jpeg|4160|3120|90|4555506||1637504756|1565951168000|1565951168528|0|0|0|||||||| +5496|3739|content://media/external/images/media/3739|/storage/emulated/0/DCIM/Camera/IMG_20190816_121025.jpg|image/jpeg|4160|3120|0|4958312||1637503488|1565950225000|1565950225196|0|0|0|||||||| +5497|4302|content://media/external/images/media/4302|/storage/emulated/0/DCIM/Camera/IMG_20190816_120823.jpg|image/jpeg|4000|3000|90|7291746||1637504817|1565950107000|1565950107105|0|0|0|||||||| +5498|5013|content://media/external/images/media/5013|/storage/emulated/0/DCIM/Camera/IMG_20190816_120816.jpg|image/jpeg|4000|3000|0|8674402||1637506134|1565950098000|1565950098149|0|0|0|||||||| +5499|3001|content://media/external/images/media/3001|/storage/emulated/0/DCIM/Camera/IMG_20190816_120812.jpg|image/jpeg|4160|3120|0|8081198||1637501786|1565950092000|1565950092896|0|0|0|||||||| +5500|2941|content://media/external/images/media/2941|/storage/emulated/0/DCIM/Camera/IMG_20190816_120805.jpg|image/jpeg|4160|3120|0|7789236||1637501660|1565950085000|1565950085346|0|0|0|||||||| +5501|3938|content://media/external/images/media/3938|/storage/emulated/0/DCIM/Camera/IMG_20190816_120414.jpg|image/jpeg|4160|3120|0|5070129||1637503853|1565949854000|1565949854311|0|0|0|||||||| +5502|4790|content://media/external/images/media/4790|/storage/emulated/0/DCIM/Camera/IMG_20190816_120410.jpg|image/jpeg|4160|3120|0|7431049||1637505663|1565949850000|1565949849984|0|0|0|||||||| +5503|4856|content://media/external/images/media/4856|/storage/emulated/0/DCIM/Camera/IMG_20190816_115825.jpg|image/jpeg|4160|3120|0|4906503||1637505830|1565949505000|1565949505835|0|0|0|||||||| +5504|4011|content://media/external/images/media/4011|/storage/emulated/0/DCIM/Camera/IMG_20190816_115821.jpg|image/jpeg|4160|3120|0|5065113||1637504201|1565949501000|1565949501797|0|0|0|||||||| +5505|4219|content://media/external/images/media/4219|/storage/emulated/0/DCIM/Camera/IMG_20190816_115816.jpg|image/jpeg|4160|3120|0|6473378||1637504726|1565949496000|1565949496524|0|0|0|||||||| +5506|2940|content://media/external/images/media/2940|/storage/emulated/0/DCIM/Camera/IMG_20190816_115739.jpg|image/jpeg|4160|3120|0|3815722||1637501660|1565949459000|1565949459784|0|0|0|||||||| +5507|2939|content://media/external/images/media/2939|/storage/emulated/0/DCIM/Camera/IMG_20190816_115727.jpg|image/jpeg|4160|3120|90|4069716||1637501660|1565949447000|1565949447079|0|0|0|||||||| +5508|3432|content://media/external/images/media/3432|/storage/emulated/0/DCIM/Camera/IMG_20190816_115723.jpg|image/jpeg|4160|3120|90|4141666||1637502783|1565949443000|1565949442968|0|0|0|||||||| +5509|3357|content://media/external/images/media/3357|/storage/emulated/0/DCIM/Camera/IMG_20190816_115716.jpg|image/jpeg|4160|3120|90|4318786||1637502451|1565949436000|1565949436674|0|0|0|||||||| +5510|3571|content://media/external/images/media/3571|/storage/emulated/0/DCIM/Camera/IMG_20190816_115710.jpg|image/jpeg|4160|3120|90|7562899||1637503154|1565949430000|1565949430477|0|0|0|||||||| +5511|3483|content://media/external/images/media/3483|/storage/emulated/0/DCIM/Camera/IMG_20190816_115638.jpg|image/jpeg|5184|3880|0|5138004||1637502870|1565949399000|1565949399674|0|0|0|||||||| +5512|3915|content://media/external/images/media/3915|/storage/emulated/0/DCIM/Camera/IMG_20190816_113658.jpg|image/jpeg|4160|3120|0|7975083||1637503834|1565948218000|1565948218819|0|0|0|||||||| +5513|3025|content://media/external/images/media/3025|/storage/emulated/0/DCIM/Camera/IMG_20190816_112421.jpg|image/jpeg|4160|3120|0|8004262||1637501805|1565947461000|1565947461602|0|0|0|||||||| +5514|3122|content://media/external/images/media/3122|/storage/emulated/0/DCIM/Camera/IMG_20190816_112358.jpg|image/jpeg|8000|6000|0|29691205||1637502068|1565947441000|1565947440909|0|0|0|||||||| +5515|3061|content://media/external/images/media/3061|/storage/emulated/0/DCIM/Camera/IMG_20190816_112259.jpg|image/jpeg|4160|3120|90|8638623||1637501905|1565947379000|1565947379149|0|0|0|||||||| +5516|3279|content://media/external/images/media/3279|/storage/emulated/0/DCIM/Camera/IMG_20190816_112254.jpg|image/jpeg|4160|3120|0|8655247||1637502355|1565947374000|1565947374640|0|0|0|||||||| +5517|3596|content://media/external/images/media/3596|/storage/emulated/0/DCIM/Camera/IMG_20190816_111351.jpg|image/jpeg|4000|3000|90|8428194||1637503238|1565946833000|1565946833076|0|0|0|||||||| +5518|4370|content://media/external/images/media/4370|/storage/emulated/0/DCIM/Camera/IMG_20190816_104032.jpg|image/jpeg|8000|6000|0|27939021||1637504982|1565944834000|1565944834005|0|0|0|||||||| +5519|4749|content://media/external/images/media/4749|/storage/emulated/0/DCIM/Camera/IMG_20190816_101134.jpg|image/jpeg|8000|6000|90|24987671||1637505639|1565943096000|1565943096504|0|0|0|||||||| +5520|4886|content://media/external/images/media/4886|/storage/emulated/0/DCIM/Camera/IMG_20190816_101128.jpg|image/jpeg|4000|3000|90|7959881||1637505920|1565943091000|1565943091127|0|0|0|||||||| +5521|3547|content://media/external/images/media/3547|/storage/emulated/0/DCIM/Camera/IMG_20190816_095458.jpg|image/jpeg|4000|3000|90|5862589||1637503058|1565942102000|1565942102641|0|0|0|||||||| +5522|4147|content://media/external/images/media/4147|/storage/emulated/0/DCIM/Camera/IMG_20190816_095454.jpg|image/jpeg|4000|3000|90|8044663||1637504481|1565942095000|1565942095828|0|0|0|||||||| +5523|3201|content://media/external/images/media/3201|/storage/emulated/0/DCIM/Camera/IMG_20190816_095449.jpg|image/jpeg|4160|3120|90|7440786||1637502256|1565942089000|1565942089221|0|0|0|||||||| +5524|4693|content://media/external/images/media/4693|/storage/emulated/0/DCIM/Camera/IMG_20190816_094956.jpg|image/jpeg|4160|3120|0|7364771||1637505509|1565941796000|1565941796206|0|0|0|||||||| +5525|3994|content://media/external/images/media/3994|/storage/emulated/0/DCIM/Camera/IMG_20190816_094947.jpg|image/jpeg|4000|3000|0|7308163||1637504086|1565941788000|1565941788154|0|0|0|||||||| +5526|3507|content://media/external/images/media/3507|/storage/emulated/0/DCIM/Camera/IMG_20190816_094943.jpg|image/jpeg|4000|3000|0|7694781||1637502969|1565941786000|1565941786870|0|0|0|||||||| +5527|3463|content://media/external/images/media/3463|/storage/emulated/0/DCIM/Camera/IMG_20190816_092604.jpg|image/jpeg|4000|3000|90|7146573||1637502817|1565940367000|1565940367493|0|0|0|||||||| +5528|4969|content://media/external/images/media/4969|/storage/emulated/0/DCIM/Camera/IMG_20190816_092555.jpg|image/jpeg|4000|3000|90|8411893||1637506097|1565940356000|1565940356074|0|0|0|||||||| +5529|3315|content://media/external/images/media/3315|/storage/emulated/0/DCIM/Camera/IMG_20190816_092523.jpg|image/jpeg|4000|3000|90|6524851||1637502438|1565940327000|1565940327878|0|0|0|||||||| +5530|4839|content://media/external/images/media/4839|/storage/emulated/0/DCIM/Camera/IMG_20190816_092517.jpg|image/jpeg|4160|3120|0|7674867||1637505753|1565940317000|1565940317091|0|0|0|||||||| +5531|4598|content://media/external/images/media/4598|/storage/emulated/0/DCIM/Camera/IMG_20190816_091625.jpg|image/jpeg|4000|3000|0|7517230||1637505308|1565939787000|1565939787174|0|0|0|||||||| +5532|4030|content://media/external/images/media/4030|/storage/emulated/0/DCIM/Camera/IMG_20190816_085444.jpg|image/jpeg|4160|3120|0|6966928||1637504234|1565938484000|1565938484187|0|0|0|||||||| +5533|4301|content://media/external/images/media/4301|/storage/emulated/0/DCIM/Camera/IMG_20190816_084708.jpg|image/jpeg|4000|3000|0|7491854||1637504817|1565938029000|1565938029722|0|0|0|||||||| +5534|4146|content://media/external/images/media/4146|/storage/emulated/0/DCIM/Camera/IMG_20190816_084651.jpg|image/jpeg|8000|6000|0|26845626||1637504481|1565938013000|1565938013061|0|0|0|||||||| +5535|6389|content://media/external/images/media/6389|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0005.jpg|image/jpeg|1200|1600|0|118647||1637518221|1565936979000|0|0|0|0|||||||| +5536|7049|content://media/external/images/media/7049|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0004.jpg|image/jpeg|898|1600|0|85946||1637518222|1565936485000|0|0|0|0|||||||| +5537|7047|content://media/external/images/media/7047|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0003.jpg|image/jpeg|1200|1600|0|138980||1637518222|1565936413000|0|0|0|0|||||||| +5538|6388|content://media/external/images/media/6388|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0002.jpg|image/jpeg|899|1599|0|124868||1637518221|1565936161000|0|0|0|0|||||||| +5539|6705|content://media/external/images/media/6705|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0001.jpg|image/jpeg|1200|1600|0|138980||1637518222|1565935965000|0|0|0|0|||||||| +5540|6612|content://media/external/images/media/6612|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190816-WA0000.jpg|image/jpeg|1040|780|0|47705||1637518221|1565935402000|0|0|0|0|||||||| +5541|6387|content://media/external/images/media/6387|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0092.jpg|image/jpeg|1600|1144|0|198291||1637518221|1565905960000|0|0|0|0|||||||| +5542|6611|content://media/external/images/media/6611|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0091.jpg|image/jpeg|1600|1060|0|147191||1637518221|1565905947000|0|0|0|0|||||||| +5543|6609|content://media/external/images/media/6609|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0090.jpg|image/jpeg|1600|1580|0|435080||1637518221|1565901875000|0|0|0|0|||||||| +5544|6704|content://media/external/images/media/6704|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0089.jpg|image/jpeg|1200|1600|0|162869||1637518222|1565901747000|0|0|0|0|||||||| +5545|6610|content://media/external/images/media/6610|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0088.jpg|image/jpeg|1200|1600|0|208225||1637518221|1565901739000|0|0|0|0|||||||| +5546|7048|content://media/external/images/media/7048|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0087.jpg|image/jpeg|1600|1200|0|340849||1637518222|1565901723000|0|0|0|0|||||||| +5547|6929|content://media/external/images/media/6929|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0086.jpg|image/jpeg|1600|1200|0|185063||1637518222|1565901710000|0|0|0|0|||||||| +5548|6505|content://media/external/images/media/6505|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0085.jpg|image/jpeg|1600|1200|0|269351||1637518221|1565901693000|0|0|0|0|||||||| +5549|6265|content://media/external/images/media/6265|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0084.jpg|image/jpeg|1600|1200|0|176635||1637518221|1565901637000|0|0|0|0|||||||| +5550|6808|content://media/external/images/media/6808|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0083.jpg|image/jpeg|1600|1200|0|250270||1637518222|1565901628000|0|0|0|0|||||||| +5551|6927|content://media/external/images/media/6927|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0082.jpg|image/jpeg|1600|1200|0|299611||1637518222|1565901579000|0|0|0|0|||||||| +5552|6703|content://media/external/images/media/6703|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0081.jpg|image/jpeg|1600|1200|0|136772||1637518222|1565901168000|0|0|0|0|||||||| +5553|6264|content://media/external/images/media/6264|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0080.jpg|image/jpeg|1600|1600|0|207849||1637518221|1565901134000|0|0|0|0|||||||| +5554|6926|content://media/external/images/media/6926|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0079.jpg|image/jpeg|1200|1600|0|300291||1637518222|1565901033000|0|0|0|0|||||||| +5555|6386|content://media/external/images/media/6386|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0045.jpg|image/jpeg|899|1600|0|133146||1637518221|1565893699000|0|0|0|0|||||||| +5556|6608|content://media/external/images/media/6608|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0044.jpg|image/jpeg|1000|1000|0|79779||1637518221|1565892199000|0|0|0|0|||||||| +5557|6810|content://media/external/images/media/6810|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0043.jpg|image/jpeg|1200|1600|0|643292||1637518222|1565892104000|0|0|0|0|||||||| +5558|7045|content://media/external/images/media/7045|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0042.jpg|image/jpeg|805|1280|0|45529||1637518222|1565889223000|0|0|0|0|||||||| +5559|6809|content://media/external/images/media/6809|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0041.jpg|image/jpeg|1200|1600|0|245262||1637518222|1565884605000|0|0|0|0|||||||| +5560|6263|content://media/external/images/media/6263|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0040.jpg|image/jpeg|267|189|0|12431||1637518221|1565883517000|0|0|0|0|||||||| +5561|6385|content://media/external/images/media/6385|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0039.jpg|image/jpeg|1200|1600|0|277684||1637518221|1565882593000|0|0|0|0|||||||| +5562|4256|content://media/external/images/media/4256|/storage/emulated/0/DCIM/Camera/IMG_20190815_171023.jpg|image/jpeg|4000|3000|90|7060789||1637504756|1565881824000|1565881824616|0|0|0|||||||| +5563|6262|content://media/external/images/media/6262|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0038.jpg|image/jpeg|1200|1600|0|230704||1637518221|1565881241000|0|0|0|0|||||||| +5564|6925|content://media/external/images/media/6925|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0036.jpg|image/jpeg|1599|899|0|346260||1637518222|1565878600000|0|0|0|0|||||||| +5565|3041|content://media/external/images/media/3041|/storage/emulated/0/DCIM/Camera/IMG_20190815_160836.jpg|image/jpeg|4000|3000|0|6443286||1637501858|1565878121000|1565878121323|0|0|0|||||||| +5566|3937|content://media/external/images/media/3937|/storage/emulated/0/DCIM/Camera/IMG_20190815_160614.jpg|image/jpeg|8000|6000|90|26344488||1637503853|1565877976000|1565877976750|0|0|0|||||||| +5567|3677|content://media/external/images/media/3677|/storage/emulated/0/DCIM/Camera/IMG_20190815_160601.jpg|image/jpeg|4000|3000|90|7283904||1637503389|1565877962000|1565877962617|0|0|0|||||||| +5568|6606|content://media/external/images/media/6606|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0034.jpg|image/jpeg|780|1040|0|96272||1637518221|1565877426000|0|0|0|0|||||||| +5569|6702|content://media/external/images/media/6702|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0033.jpg|image/jpeg|900|1600|0|242627||1637518222|1565876981000|0|0|0|0|||||||| +5570|3278|content://media/external/images/media/3278|/storage/emulated/0/DCIM/Camera/IMG_20190815_153438.jpg|image/jpeg|4160|3120|0|8370966||1637502355|1565876078000|1565876078244|0|0|0|||||||| +5571|3975|content://media/external/images/media/3975|/storage/emulated/0/DCIM/Camera/IMG_20190815_153424.jpg|image/jpeg|8000|6000|0|25730954||1637504059|1565876066000|1565876065935|0|0|0|||||||| +5572|4463|content://media/external/images/media/4463|/storage/emulated/0/DCIM/Camera/IMG_20190815_153417.jpg|image/jpeg|8000|6000|90|24559468||1637505091|1565876059000|1565876059372|0|0|0|||||||| +5573|3370|content://media/external/images/media/3370|/storage/emulated/0/DCIM/Camera/IMG_20190815_153411.jpg|image/jpeg|4000|3000|90|9139725||1637502523|1565876053000|1565876053326|0|0|0|||||||| +5574|6701|content://media/external/images/media/6701|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0031.jpg|image/jpeg|1200|1600|0|386259||1637518222|1565875603000|0|0|0|0|||||||| +5575|6607|content://media/external/images/media/6607|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0030.jpg|image/jpeg|1600|370|0|128232||1637518221|1565875580000|0|0|0|0|||||||| +5576|6699|content://media/external/images/media/6699|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0027.jpg|image/jpeg|1376|774|0|153812||1637518222|1565875511000|0|0|0|0|||||||| +5577|4729|content://media/external/images/media/4729|/storage/emulated/0/DCIM/Camera/IMG_20190815_151650.jpg|image/jpeg|4000|3000|90|7057538||1637505574|1565875011000|1565875011653|0|0|0|||||||| +5578|3274|content://media/external/images/media/3274|/storage/emulated/0/DCIM/Camera/PANO_20190815_145734.jpg|image/jpeg|10160|3552|0|7637677||1637502343|1565873864000|0|0|0|0|||||||| +5579|2796|content://media/external/images/media/2796|/storage/emulated/0/DCIM/Camera/PANO_20190815_145715.jpg|image/jpeg|9552|3680|0|7741287||1637501282|1565873847000|0|0|0|0|||||||| +5580|4336|content://media/external/images/media/4336|/storage/emulated/0/DCIM/Camera/IMG_20190815_145705.jpg|image/jpeg|4160|3120|0|8729234||1637504906|1565873825000|1565873825664|0|0|0|||||||| +5581|4369|content://media/external/images/media/4369|/storage/emulated/0/DCIM/Camera/IMG_20190815_145702.jpg|image/jpeg|4160|3120|0|6699821||1637504982|1565873822000|1565873822649|0|0|0|||||||| +5582|3200|content://media/external/images/media/3200|/storage/emulated/0/DCIM/Camera/IMG_20190815_145501.jpg|image/jpeg|4160|3120|0|4193252||1637502256|1565873701000|1565873701859|0|0|0|||||||| +5583|3546|content://media/external/images/media/3546|/storage/emulated/0/DCIM/Camera/IMG_20190815_145156.jpg|image/jpeg|4160|3120|0|6808480||1637503058|1565873516000|1565873516430|0|0|0|||||||| +5584|3060|content://media/external/images/media/3060|/storage/emulated/0/DCIM/Camera/IMG_20190815_145125.jpg|image/jpeg|8000|6000|0|22173586||1637501905|1565873488000|1565873487973|0|0|0|||||||| +5585|2921|content://media/external/images/media/2921|/storage/emulated/0/DCIM/Camera/IMG_20190815_145124.jpg|image/jpeg|8000|6000|0|23714193||1637501599|1565873485000|1565873485728|0|0|0|||||||| +5586|4164|content://media/external/images/media/4164|/storage/emulated/0/DCIM/Camera/IMG_20190815_145115.jpg|image/jpeg|8000|6000|90|24818976||1637504556|1565873477000|1565873477440|0|0|0|||||||| +5587|3448|content://media/external/images/media/3448|/storage/emulated/0/DCIM/Camera/IMG_20190815_145112.jpg|image/jpeg|8000|6000|90|25849592||1637502804|1565873474000|1565873474432|0|0|0|||||||| +5588|3163|content://media/external/images/media/3163|/storage/emulated/0/DCIM/Camera/IMG_20190815_145057.jpg|image/jpeg|5184|3880|0|6517720||1637502143|1565873458000|1565873458052|0|0|0|||||||| +5589|3260|content://media/external/images/media/3260|/storage/emulated/0/DCIM/Camera/IMG_20190815_145054.jpg|image/jpeg|5184|3880|0|6067053||1637502342|1565873455000|1565873455715|0|0|0|||||||| +5590|3886|content://media/external/images/media/3886|/storage/emulated/0/DCIM/Camera/IMG_20190815_145052.jpg|image/jpeg|5184|3880|0|6169857||1637503732|1565873454000|1565873453948|0|0|0|||||||| +5591|3951|content://media/external/images/media/3951|/storage/emulated/0/DCIM/Camera/IMG_20190815_144652.jpg|image/jpeg|5184|3880|0|6779108||1637503942|1565873213000|1565873213651|0|0|0|||||||| +5592|3545|content://media/external/images/media/3545|/storage/emulated/0/DCIM/Camera/IMG_20190815_144650.jpg|image/jpeg|5184|3880|0|6982675||1637503058|1565873212000|1565873212500|0|0|0|||||||| +5593|4300|content://media/external/images/media/4300|/storage/emulated/0/DCIM/Camera/IMG_20190815_144629.jpg|image/jpeg|4160|3120|0|8600397||1637504817|1565873189000|1565873189341|0|0|0|||||||| +5594|4770|content://media/external/images/media/4770|/storage/emulated/0/DCIM/Camera/IMG_20190815_144608.jpg|image/jpeg|4160|3120|0|8137131||1637505656|1565873168000|1565873168774|0|0|0|||||||| +5595|2872|content://media/external/images/media/2872|/storage/emulated/0/DCIM/Camera/IMG_20190815_144558.jpg|image/jpeg|4000|3000|0|10120895||1637501460|1565873160000|1565873159884|0|0|0|||||||| +5596|3413|content://media/external/images/media/3413|/storage/emulated/0/DCIM/Camera/IMG_20190815_143756.jpg|image/jpeg|5184|3880|0|7491442||1637502682|1565872678000|1565872678175|0|0|0|||||||| +5597|4094|content://media/external/images/media/4094|/storage/emulated/0/DCIM/Camera/IMG_20190815_142509.jpg|image/jpeg|4000|3000|90|6290462||1637504400|1565871910000|1565871910421|0|0|0|||||||| +5598|3332|content://media/external/images/media/3332|/storage/emulated/0/DCIM/Camera/IMG_20190815_142500.jpg|image/jpeg|4000|3000|90|6037147||1637502439|1565871901000|1565871901719|0|0|0|||||||| +5599|4387|content://media/external/images/media/4387|/storage/emulated/0/DCIM/Camera/IMG_20190815_142357.jpg|image/jpeg|4000|3000|90|6089110||1637505004|1565871838000|1565871838833|0|0|0|||||||| +5600|4335|content://media/external/images/media/4335|/storage/emulated/0/DCIM/Camera/IMG_20190815_142354.jpg|image/jpeg|4000|3000|90|6177449||1637504906|1565871835000|1565871835193|0|0|0|||||||| +5601|2979|content://media/external/images/media/2979|/storage/emulated/0/DCIM/Camera/IMG_20190815_142352.jpg|image/jpeg|4000|3000|90|6261327||1637501771|1565871833000|1565871833449|0|0|0|||||||| +5602|4673|content://media/external/images/media/4673|/storage/emulated/0/DCIM/Camera/IMG_20190815_142350.jpg|image/jpeg|4000|3000|90|6173004||1637505480|1565871831000|1565871831262|0|0|0|||||||| +5603|4728|content://media/external/images/media/4728|/storage/emulated/0/DCIM/Camera/IMG_20190815_140549.jpg|image/jpeg|4000|3000|90|9473109||1637505574|1565870750000|1565870750133|0|0|0|||||||| +5604|4657|content://media/external/images/media/4657|/storage/emulated/0/DCIM/Camera/IMG_20190815_140543.jpg|image/jpeg|4000|3000|90|9159822||1637505417|1565870744000|1565870744762|0|0|0|||||||| +5605|4710|content://media/external/images/media/4710|/storage/emulated/0/DCIM/Camera/IMG_20190815_140337.jpg|image/jpeg|4000|3000|0|9783327||1637505565|1565870618000|1565870618594|0|0|0|||||||| +5606|7046|content://media/external/images/media/7046|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0026.jpg|image/jpeg|720|915|0|77887||1637518222|1565867910000|0|0|0|0|||||||| +5607|4346|content://media/external/images/media/4346|/storage/emulated/0/DCIM/Camera/PANO_20190815_130052.jpg|image/jpeg|7440|3776|0|6605888||1637504907|1565866861000|0|0|0|0|||||||| +5608|3237|content://media/external/images/media/3237|/storage/emulated/0/DCIM/Camera/IMG_20190815_130047.jpg|image/jpeg|4160|3120|0|6808083||1637502259|1565866847000|1565866847089|0|0|0|||||||| +5609|3993|content://media/external/images/media/3993|/storage/emulated/0/DCIM/Camera/IMG_20190815_130035.jpg|image/jpeg|4000|3000|0|6125002||1637504085|1565866840000|1565866840006|0|0|0|||||||| +5610|6384|content://media/external/images/media/6384|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0025.jpg|image/jpeg|777|1599|0|228292||1637518221|1565866773000|0|0|0|0|||||||| +5611|6700|content://media/external/images/media/6700|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0024.jpg|image/jpeg|1202|1600|0|311935||1637518222|1565865666000|0|0|0|0|||||||| +5612|4906|content://media/external/images/media/4906|/storage/emulated/0/DCIM/Camera/IMG_20190815_122813.jpg|image/jpeg|4160|3120|90|7632611||1637505944|1565864894000|1565864893898|0|0|0|||||||| +5613|4855|content://media/external/images/media/4855|/storage/emulated/0/DCIM/Camera/IMG_20190815_122802.jpg|image/jpeg|4160|3120|90|7589326||1637505830|1565864882000|1565864882205|0|0|0|||||||| +5614|4748|content://media/external/images/media/4748|/storage/emulated/0/DCIM/Camera/IMG_20190815_121226.jpg|image/jpeg|5184|3880|270|5762683||1637505639|1565863948000|1565863947980|0|0|0|||||||| +5615|3024|content://media/external/images/media/3024|/storage/emulated/0/DCIM/Camera/IMG_20190815_121149.jpg|image/jpeg|4160|3120|0|6204387||1637501805|1565863909000|1565863909526|0|0|0|||||||| +5616|3259|content://media/external/images/media/3259|/storage/emulated/0/DCIM/Camera/IMG_20190815_121139.jpg|image/jpeg|4000|3000|0|7580614||1637502342|1565863900000|1565863900767|0|0|0|||||||| +5617|6807|content://media/external/images/media/6807|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0022.jpg|image/jpeg|1200|1599|0|471599||1637518222|1565863593000|0|0|0|0|||||||| +5618|6924|content://media/external/images/media/6924|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0020.jpg|image/jpeg|1333|1000|0|156467||1637518222|1565862766000|0|0|0|0|||||||| +5619|7044|content://media/external/images/media/7044|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0019.jpg|image/jpeg|720|1280|0|106156||1637518222|1565862677000|0|0|0|0|||||||| +5620|7042|content://media/external/images/media/7042|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0018.jpg|image/jpeg|1600|900|0|230358||1637518222|1565856738000|0|0|0|0|||||||| +5621|6806|content://media/external/images/media/6806|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0017.jpg|image/jpeg|1600|1198|0|94999||1637518222|1565854218000|0|0|0|0|||||||| +5622|6383|content://media/external/images/media/6383|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0015.jpg|image/jpeg|719|480|0|100555||1637518221|1565853433000|0|0|0|0|||||||| +5623|6698|content://media/external/images/media/6698|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0014.jpg|image/jpeg|1600|1198|0|94999||1637518222|1565852733000|0|0|0|0|||||||| +5624|7043|content://media/external/images/media/7043|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0012.jpg|image/jpeg|1600|901|0|126753||1637518222|1565849863000|0|0|0|0|||||||| +5625|6382|content://media/external/images/media/6382|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0011.jpg|image/jpeg|852|1000|0|159575||1637518221|1565848404000|0|0|0|0|||||||| +5626|6923|content://media/external/images/media/6923|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0009.jpg|image/jpeg|1600|1059|0|289563||1637518222|1565821920000|0|0|0|0|||||||| +5627|6697|content://media/external/images/media/6697|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0008.jpg|image/jpeg|1600|1059|0|307118||1637518222|1565821919000|0|0|0|0|||||||| +5628|6922|content://media/external/images/media/6922|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0007.jpg|image/jpeg|1600|1059|0|270163||1637518222|1565821919000|0|0|0|0|||||||| +5629|6381|content://media/external/images/media/6381|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0005.jpg|image/jpeg|1600|1059|0|278825||1637518221|1565821918000|0|0|0|0|||||||| +5630|6805|content://media/external/images/media/6805|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0006.jpg|image/jpeg|1600|1059|0|281734||1637518222|1565821918000|0|0|0|0|||||||| +5631|6380|content://media/external/images/media/6380|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0003.jpg|image/jpeg|1600|1059|0|233932||1637518221|1565821917000|0|0|0|0|||||||| +5632|6921|content://media/external/images/media/6921|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0002.jpg|image/jpeg|1600|1059|0|209900||1637518222|1565821917000|0|0|0|0|||||||| +5633|7040|content://media/external/images/media/7040|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0001.jpg|image/jpeg|1600|1059|0|298066||1637518222|1565821917000|0|0|0|0|||||||| +5634|7041|content://media/external/images/media/7041|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0004.jpg|image/jpeg|1600|1059|0|298331||1637518222|1565821917000|0|0|0|0|||||||| +5635|6804|content://media/external/images/media/6804|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190815-WA0000.jpg|image/jpeg|1600|1059|0|317622||1637518222|1565821916000|0|0|0|0|||||||| +5636|3431|content://media/external/images/media/3431|/storage/emulated/0/DCIM/Camera/IMG_20190815_000710.jpg|image/jpeg|4000|3000|0|5417438||1637502783|1565820430000|1565820430183|0|0|0|||||||| +5637|6920|content://media/external/images/media/6920|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0017.jpg|image/jpeg|1040|780|0|17615||1637518222|1565808637000|0|0|0|0|||||||| +5638|6605|content://media/external/images/media/6605|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0016.jpg|image/jpeg|1040|780|0|16033||1637518221|1565808634000|0|0|0|0|||||||| +5639|6604|content://media/external/images/media/6604|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0015.jpg|image/jpeg|1040|780|0|44907||1637518221|1565808633000|0|0|0|0|||||||| +5640|6503|content://media/external/images/media/6503|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0014.jpg|image/jpeg|1599|899|0|166228||1637518221|1565805322000|0|0|0|0|||||||| +5641|6919|content://media/external/images/media/6919|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0013.jpg|image/jpeg|768|1024|0|96393||1637518222|1565791182000|0|0|0|0|||||||| +5642|6918|content://media/external/images/media/6918|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0010.jpg|image/jpeg|1600|1200|0|207613||1637518222|1565782931000|0|0|0|0|||||||| +5643|6501|content://media/external/images/media/6501|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0009.jpg|image/jpeg|1200|1600|0|427072||1637518221|1565781788000|0|0|0|0|||||||| +5644|6696|content://media/external/images/media/6696|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0007.jpg|image/jpeg|899|1600|0|87532||1637518222|1565781186000|0|0|0|0|||||||| +5645|6917|content://media/external/images/media/6917|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0006.jpg|image/jpeg|898|1600|0|322122||1637518222|1565781010000|0|0|0|0|||||||| +5646|7039|content://media/external/images/media/7039|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0004.jpg|image/jpeg|898|1600|0|321978||1637518222|1565780091000|0|0|0|0|||||||| +5647|6695|content://media/external/images/media/6695|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0003.jpg|image/jpeg|747|1328|0|173013||1637518222|1565779386000|0|0|0|0|||||||| +5648|6261|content://media/external/images/media/6261|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0002.jpg|image/jpeg|420|416|0|27253||1637518221|1565768899000|0|0|0|0|||||||| +5649|6502|content://media/external/images/media/6502|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0001.jpg|image/jpeg|1200|1600|0|88633||1637518221|1565768789000|0|0|0|0|||||||| +5650|6603|content://media/external/images/media/6603|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190814-WA0000.jpg|image/jpeg|898|1600|0|219176||1637518221|1565764040000|0|0|0|0|||||||| +5651|6916|content://media/external/images/media/6916|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0025.jpg|image/jpeg|1600|800|0|126652||1637518222|1565722388000|0|0|0|0|||||||| +5652|7038|content://media/external/images/media/7038|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0024.jpg|image/jpeg|750|1334|0|109658||1637518222|1565720959000|0|0|0|0|||||||| +5653|7037|content://media/external/images/media/7037|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0023.jpg|image/jpeg|1328|747|0|58578||1637518222|1565718693000|0|0|0|0|||||||| +5654|2727|content://media/external/images/media/2727|/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-08-13-18-24-34-986_com.brytonsport.active.png|image/png|1080|2340|0|906171||1637500987|1565713475000|0|0|0|0|||||||| +5655|3356|content://media/external/images/media/3356|/storage/emulated/0/DCIM/Camera/IMG_20190813_175557.jpg|image/jpeg|4000|3000|90|5395191||1637502451|1565711758000|1565711758316|0|0|0|||||||| +5656|3992|content://media/external/images/media/3992|/storage/emulated/0/DCIM/Camera/IMG_20190813_170826.jpg|image/jpeg|4000|3000|90|6139255||1637504085|1565708907000|1565708907589|0|0|0|||||||| +5657|6694|content://media/external/images/media/6694|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0017.jpg|image/jpeg|750|1334|0|70733||1637518222|1565707338000|0|0|0|0|||||||| +5658|6803|content://media/external/images/media/6803|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0015.jpg|image/jpeg|1040|383|0|42246||1637518222|1565688994000|0|0|0|0|||||||| +5659|2886|content://media/external/images/media/2886|/storage/emulated/0/DCIM/Camera/IMG_20190813_112742.jpg|image/jpeg|4160|3120|0|7893094||1637501516|1565688462000|1565688462202|0|0|0|||||||| +5660|3950|content://media/external/images/media/3950|/storage/emulated/0/DCIM/Camera/IMG_20190813_112712.jpg|image/jpeg|4160|3120|0|7944445||1637503942|1565688432000|1565688432257|0|0|0|||||||| +5661|2684|content://media/external/images/media/2684|/storage/emulated/0/Pictures/1565688389619.4ed2a9eb-1151-402f-99ea-5b44648d2ac9.jpg|image/jpeg|1500|2000|0|2266295||1637500871|1565688414000|1565688402916|0|0|0|||||||| +5662|2683|content://media/external/images/media/2683|/storage/emulated/0/Pictures/1565686896617.c82119bf-6ae3-4765-af56-688f24d58a5d.jpg|image/jpeg|2000|1500|0|862923||1637500871|1565686910000|1565686907254|0|0|0|||||||| +5663|3162|content://media/external/images/media/3162|/storage/emulated/0/DCIM/Camera/IMG_20190813_103753.jpg|image/jpeg|4160|3120|0|7618494||1637502143|1565685473000|1565685473067|0|0|0|||||||| +5664|2682|content://media/external/images/media/2682|/storage/emulated/0/Pictures/1565685438657.ea8a2049-03c5-4c2f-b810-16f0dc039273.jpg|image/jpeg|2080|1560|0|952650||1637500871|1565685458000|1565685451898|0|0|0|||||||| +5665|4051|content://media/external/images/media/4051|/storage/emulated/0/DCIM/Camera/IMG_20190813_095344.jpg|image/jpeg|4000|3000|0|8135601||1637504342|1565682828000|1565682827977|0|0|0|||||||| +5666|6915|content://media/external/images/media/6915|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0010.jpg|image/jpeg|899|1599|0|141959||1637518222|1565682237000|0|0|0|0|||||||| +5667|6693|content://media/external/images/media/6693|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0008.jpg|image/jpeg|1600|1200|0|313989||1637518222|1565681541000|0|0|0|0|||||||| +5668|4656|content://media/external/images/media/4656|/storage/emulated/0/DCIM/Camera/IMG_20190813_092941.jpg|image/jpeg|4000|3000|90|7528951||1637505417|1565681385000|1565681385609|0|0|0|||||||| +5669|6914|content://media/external/images/media/6914|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0007.jpg|image/jpeg|1200|1600|0|135227||1637518222|1565680659000|0|0|0|0|||||||| +5670|6259|content://media/external/images/media/6259|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0004.jpg|image/jpeg|1599|1200|0|124648||1637518221|1565676876000|0|0|0|0|||||||| +5671|6802|content://media/external/images/media/6802|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190813-WA0000.jpg|image/jpeg|836|1600|0|226727||1637518222|1565648341000|0|0|0|0|||||||| +5672|6913|content://media/external/images/media/6913|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0049.jpg|image/jpeg|473|1024|0|50328||1637518222|1565645356000|0|0|0|0|||||||| +5673|6500|content://media/external/images/media/6500|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0047.jpg|image/jpeg|1200|1600|0|230070||1637518221|1565629960000|0|0|0|0|||||||| +5674|6912|content://media/external/images/media/6912|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0046.jpg|image/jpeg|1200|1600|0|273898||1637518222|1565629757000|0|0|0|0|||||||| +5675|4368|content://media/external/images/media/4368|/storage/emulated/0/DCIM/Camera/IMG_20190812_160947.jpg|image/jpeg|4000|3000|0|5041816||1637504982|1565618988000|1565541233431|0|0|0|||||||| +5676|6800|content://media/external/images/media/6800|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0045.jpg|image/jpeg|1066|1599|0|146135||1637518222|1565615057000|0|0|0|0|||||||| +5677|6260|content://media/external/images/media/6260|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0027.jpg|image/jpeg|1600|1200|0|433952||1637518221|1565602984000|0|0|0|0|||||||| +5678|6258|content://media/external/images/media/6258|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0026.jpg|image/jpeg|1230|968|0|114306||1637518221|1565602434000|0|0|0|0|||||||| +5679|6499|content://media/external/images/media/6499|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0023.jpg|image/jpeg|1328|747|0|239391||1637518221|1565596159000|0|0|0|0|||||||| +5680|6498|content://media/external/images/media/6498|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0021.jpeg|image/jpeg|4000|2250|0|642924||1637518221|1565595903000|0|0|0|0|||||||| +5681|6497|content://media/external/images/media/6497|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0019.jpeg|image/jpeg|4000|2250|0|615182||1637518221|1565595396000|0|0|0|0|||||||| +5682|6379|content://media/external/images/media/6379|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0002.jpg|image/jpeg|1040|780|0|74023||1637518221|1565588513000|0|0|0|0|||||||| +5683|6602|content://media/external/images/media/6602|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0001.jpg|image/jpeg|1408|1056|0|99090||1637518221|1565587965000|0|0|0|0|||||||| +5684|6801|content://media/external/images/media/6801|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190812-WA0000.jpg|image/jpeg|1328|747|0|72967||1637518222|1565584987000|0|0|0|0|||||||| +5685|6495|content://media/external/images/media/6495|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0036.jpg|image/jpeg|1080|1080|0|137090||1637518221|1565548722000|0|0|0|0|||||||| +5686|6799|content://media/external/images/media/6799|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0035.jpg|image/jpeg|679|960|0|77870||1637518222|1565546558000|0|0|0|0|||||||| +5687|6496|content://media/external/images/media/6496|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0031.jpg|image/jpeg|282|424|0|13394||1637518221|1565544973000|0|0|0|0|||||||| +5688|6692|content://media/external/images/media/6692|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0030.jpg|image/jpeg|299|306|0|11580||1637518222|1565544969000|0|0|0|0|||||||| +5689|6690|content://media/external/images/media/6690|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0029.jpg|image/jpeg|1600|1088|0|328598||1637518222|1565543619000|0|0|0|0|||||||| +5690|6257|content://media/external/images/media/6257|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0028.jpg|image/jpeg|1600|1200|0|350253||1637518221|1565543545000|0|0|0|0|||||||| +5691|6599|content://media/external/images/media/6599|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0027.jpg|image/jpeg|1200|1600|0|371567||1637518221|1565543517000|0|0|0|0|||||||| +5692|6691|content://media/external/images/media/6691|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0026.jpg|image/jpeg|1200|1600|0|469160||1637518222|1565543502000|0|0|0|0|||||||| +5693|3355|content://media/external/images/media/3355|/storage/emulated/0/DCIM/Camera/IMG_20190811_183350.jpg|image/jpeg|4000|3000|0|10521904||1637502451|1565541233000|1565541233431|0|0|0|||||||| +5694|4769|content://media/external/images/media/4769|/storage/emulated/0/DCIM/Camera/IMG_20190811_183332.jpg|image/jpeg|4000|3000|0|6353539||1637505656|1565541213000|1565541213728|0|0|0|||||||| +5695|2938|content://media/external/images/media/2938|/storage/emulated/0/DCIM/Camera/IMG_20190811_183326.jpg|image/jpeg|8000|6000|0|20981435||1637501660|1565541208000|1565541208693|0|0|0|||||||| +5696|6378|content://media/external/images/media/6378|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0025.jpg|image/jpeg|1600|1331|0|305257||1637518221|1565539428000|0|0|0|0|||||||| +5697|6256|content://media/external/images/media/6256|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0024.jpg|image/jpeg|768|1024|0|178354||1637518221|1565539052000|0|0|0|0|||||||| +5698|6911|content://media/external/images/media/6911|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0023.jpg|image/jpeg|1200|1600|0|314478||1637518222|1565538927000|0|0|0|0|||||||| +5699|6910|content://media/external/images/media/6910|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0022.jpg|image/jpeg|899|1600|0|239554||1637518222|1565536181000|0|0|0|0|||||||| +5700|6689|content://media/external/images/media/6689|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0021.jpg|image/jpeg|900|1600|0|203356||1637518222|1565532498000|0|0|0|0|||||||| +5701|7036|content://media/external/images/media/7036|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0020.jpg|image/jpeg|764|1600|0|146272||1637518222|1565532323000|0|0|0|0|||||||| +5702|6494|content://media/external/images/media/6494|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0018.jpg|image/jpeg|764|1600|0|106459||1637518221|1565526384000|0|0|0|0|||||||| +5703|6601|content://media/external/images/media/6601|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0017.jpg|image/jpeg|898|1600|0|174561||1637518221|1565525181000|0|0|0|0|||||||| +5704|6493|content://media/external/images/media/6493|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0016.jpg|image/jpeg|1600|764|0|232298||1637518221|1565525145000|0|0|0|0|||||||| +5705|6688|content://media/external/images/media/6688|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0015.jpg|image/jpeg|750|1334|0|85915||1637518222|1565524796000|0|0|0|0|||||||| +5706|6798|content://media/external/images/media/6798|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0014.jpg|image/jpeg|764|1600|0|56268||1637518222|1565520380000|0|0|0|0|||||||| +5707|6600|content://media/external/images/media/6600|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0013.jpg|image/jpeg|900|1600|0|142536||1637518221|1565520142000|0|0|0|0|||||||| +5708|7035|content://media/external/images/media/7035|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0012.jpg|image/jpeg|747|1328|0|167787||1637518222|1565519919000|0|0|0|0|||||||| +5709|6597|content://media/external/images/media/6597|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0011.jpg|image/jpeg|780|1040|0|86020||1637518221|1565518455000|0|0|0|0|||||||| +5710|6598|content://media/external/images/media/6598|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0010.jpg|image/jpeg|780|1040|0|108297||1637518221|1565518452000|0|0|0|0|||||||| +5711|6491|content://media/external/images/media/6491|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0009.jpg|image/jpeg|780|1040|0|77706||1637518221|1565518449000|0|0|0|0|||||||| +5712|6909|content://media/external/images/media/6909|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0008.jpg|image/jpeg|780|1040|0|75107||1637518222|1565518446000|0|0|0|0|||||||| +5713|6596|content://media/external/images/media/6596|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0007.jpg|image/jpeg|899|1599|0|302832||1637518221|1565518297000|0|0|0|0|||||||| +5714|6595|content://media/external/images/media/6595|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0006.jpg|image/jpeg|1599|899|0|346260||1637518221|1565517085000|0|0|0|0|||||||| +5715|7034|content://media/external/images/media/7034|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0005.jpg|image/jpeg|1200|1600|0|248635||1637518222|1565515751000|0|0|0|0|||||||| +5716|6594|content://media/external/images/media/6594|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0004.jpg|image/jpeg|780|1040|0|115833||1637518221|1565515392000|0|0|0|0|||||||| +5717|6492|content://media/external/images/media/6492|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0002.jpg|image/jpeg|899|1599|0|386939||1637518221|1565515340000|0|0|0|0|||||||| +5718|6593|content://media/external/images/media/6593|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0001.jpg|image/jpeg|1600|1200|0|314646||1637518221|1565513424000|0|0|0|0|||||||| +5719|2697|content://media/external/images/media/2697|/storage/emulated/0/Pictures/scanner/scanner_20190811_103643.jpg|image/jpeg|459|1112|0|226630||1637500871|1565512603000|0|0|0|0|||||||| +5720|4747|content://media/external/images/media/4747|/storage/emulated/0/DCIM/Camera/IMG_20190811_103608.jpg|image/jpeg|4000|3000|90|5462630||1637505639|1565512570000|1565512570239|0|0|0|||||||| +5721|6907|content://media/external/images/media/6907|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190811-WA0000.jpg|image/jpeg|1202|1600|0|212144||1637518222|1565510932000|0|0|0|0|||||||| +5722|6590|content://media/external/images/media/6590|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190810-WA0045.jpg|image/jpeg|1200|1600|0|123915||1637518221|1565470957000|0|0|0|0|||||||| +5723|6255|content://media/external/images/media/6255|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190810-WA0043.jpg|image/jpeg|1200|1600|0|123915||1637518221|1565470364000|0|0|0|0|||||||| +5724|2681|content://media/external/images/media/2681|/storage/emulated/0/Pictures/1565456889873.bc9c730b-4198-4163-bb9a-78e8dd65f216.jpg|image/jpeg|2080|1560|0|850956||1637500871|1565456904000|1565456900029|0|0|0|||||||| +5725|2680|content://media/external/images/media/2680|/storage/emulated/0/Pictures/1565456863547.697c8854-ed45-4672-9b7a-f73931d58b89.jpg|image/jpeg|2000|1500|0|902579||1637500871|1565456879000|1565456873961|0|0|0|||||||| +5726|2679|content://media/external/images/media/2679|/storage/emulated/0/Pictures/1565455852824.118fe5bc-9ced-4bb7-bf8a-e86d61a9301c.jpg|image/jpeg|2000|1500|0|817836||1637500871|1565455866000|1565455859985|0|0|0|||||||| +5727|7032|content://media/external/images/media/7032|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190810-WA0023.jpg|image/jpeg|1200|1600|0|133196||1637518222|1565434748000|0|0|0|0|||||||| +5728|6376|content://media/external/images/media/6376|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190810-WA0022.jpg|image/jpeg|1200|1600|0|155669||1637518221|1565434747000|0|0|0|0|||||||| +5729|6796|content://media/external/images/media/6796|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190810-WA0014.jpg|image/jpeg|900|1600|0|122644||1637518222|1565425330000|0|0|0|0|||||||| +5730|6254|content://media/external/images/media/6254|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190810-WA0006.jpg|image/jpeg|900|1600|0|114434||1637518221|1565424090000|0|0|0|0|||||||| +5731|7033|content://media/external/images/media/7033|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190810-WA0005.jpg|image/jpeg|1054|1600|0|169214||1637518222|1565422951000|0|0|0|0|||||||| +5732|6797|content://media/external/images/media/6797|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190809-WA0006.jpg|image/jpeg|630|1024|0|67878||1637518222|1565377373000|0|0|0|0|||||||| +5733|2696|content://media/external/images/media/2696|/storage/emulated/0/Pictures/scanner/scanner_20190807_103819.jpg|image/jpeg|718|945|0|286380||1637500871|1565167100000|0|0|0|0|||||||| +5734|6687|content://media/external/images/media/6687|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0096.jpg|image/jpeg|769|1024|0|98525||1637518222|1565159349000|0|0|0|0|||||||| +5735|7031|content://media/external/images/media/7031|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0097.jpg|image/jpeg|1600|1202|0|219622||1637518222|1565159349000|0|0|0|0|||||||| +5736|6253|content://media/external/images/media/6253|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0094.jpg|image/jpeg|1599|1200|0|506169||1637518221|1565159348000|0|0|0|0|||||||| +5737|6592|content://media/external/images/media/6592|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0095.jpg|image/jpeg|1599|1200|0|168144||1637518221|1565159348000|0|0|0|0|||||||| +5738|6795|content://media/external/images/media/6795|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0093.jpg|image/jpeg|1599|1200|0|315481||1637518222|1565159347000|0|0|0|0|||||||| +5739|7030|content://media/external/images/media/7030|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0092.jpg|image/jpeg|1080|1080|0|88433||1637518222|1565159347000|0|0|0|0|||||||| +5740|3084|content://media/external/images/media/3084|/storage/emulated/0/DCIM/Camera/IMG_20190807_081719.jpg|image/jpeg|8000|6000|90|11893771||1637501970|1565158640000|1565158640764|0|0|0|||||||| +5741|7029|content://media/external/images/media/7029|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0080.jpg|image/jpeg|1600|1200|0|186154||1637518222|1565142137000|0|0|0|0|||||||| +5742|6908|content://media/external/images/media/6908|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0076.jpg|image/jpeg|1600|1200|0|175647||1637518222|1565142136000|0|0|0|0|||||||| +5743|6792|content://media/external/images/media/6792|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0070.jpg|image/jpeg|1600|1200|0|189107||1637518222|1565142133000|0|0|0|0|||||||| +5744|6794|content://media/external/images/media/6794|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0071.jpg|image/jpeg|1600|1200|0|166383||1637518222|1565142133000|0|0|0|0|||||||| +5745|6591|content://media/external/images/media/6591|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0067.jpg|image/jpeg|1600|1200|0|179409||1637518221|1565142131000|0|0|0|0|||||||| +5746|6377|content://media/external/images/media/6377|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0065.jpg|image/jpeg|1200|1600|0|168409||1637518221|1565142130000|0|0|0|0|||||||| +5747|6252|content://media/external/images/media/6252|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0063.jpg|image/jpeg|1200|1600|0|131128||1637518221|1565142129000|0|0|0|0|||||||| +5748|6906|content://media/external/images/media/6906|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0064.jpg|image/jpeg|1200|1600|0|166440||1637518222|1565142129000|0|0|0|0|||||||| +5749|6905|content://media/external/images/media/6905|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0057.jpg|image/jpeg|1200|1600|0|141330||1637518222|1565142099000|0|0|0|0|||||||| +5750|6903|content://media/external/images/media/6903|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0054.jpg|image/jpeg|1600|1200|0|155338||1637518222|1565142098000|0|0|0|0|||||||| +5751|6250|content://media/external/images/media/6250|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0048.jpg|image/jpeg|1600|1200|0|163641||1637518221|1565142095000|0|0|0|0|||||||| +5752|6251|content://media/external/images/media/6251|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0049.jpg|image/jpeg|1600|1200|0|177475||1637518221|1565142095000|0|0|0|0|||||||| +5753|6375|content://media/external/images/media/6375|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0047.jpg|image/jpeg|1200|1600|0|138188||1637518221|1565142094000|0|0|0|0|||||||| +5754|6904|content://media/external/images/media/6904|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0042.jpg|image/jpeg|1200|1600|0|173855||1637518222|1565142082000|0|0|0|0|||||||| +5755|6486|content://media/external/images/media/6486|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0040.jpg|image/jpeg|1600|1200|0|180608||1637518221|1565142081000|0|0|0|0|||||||| +5756|6249|content://media/external/images/media/6249|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0033.jpg|image/jpeg|1200|1600|0|154523||1637518221|1565142080000|0|0|0|0|||||||| +5757|6589|content://media/external/images/media/6589|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0032.jpg|image/jpeg|1200|1600|0|178356||1637518221|1565142080000|0|0|0|0|||||||| +5758|6793|content://media/external/images/media/6793|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0034.jpg|image/jpeg|1600|1200|0|197240||1637518222|1565142080000|0|0|0|0|||||||| +5759|6374|content://media/external/images/media/6374|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0029.jpg|image/jpeg|1600|1200|0|177215||1637518221|1565142079000|0|0|0|0|||||||| +5760|6790|content://media/external/images/media/6790|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0028.jpg|image/jpeg|1600|1200|0|190801||1637518222|1565142079000|0|0|0|0|||||||| +5761|7028|content://media/external/images/media/7028|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0031.jpg|image/jpeg|1200|1600|0|170913||1637518222|1565142079000|0|0|0|0|||||||| +5762|6248|content://media/external/images/media/6248|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0024.jpg|image/jpeg|1600|1200|0|145956||1637518221|1565142078000|0|0|0|0|||||||| +5763|6791|content://media/external/images/media/6791|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0025.jpg|image/jpeg|1200|1600|0|196498||1637518222|1565142078000|0|0|0|0|||||||| +5764|7027|content://media/external/images/media/7027|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0027.jpg|image/jpeg|1200|1600|0|160319||1637518222|1565142078000|0|0|0|0|||||||| +5765|6371|content://media/external/images/media/6371|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0020.jpg|image/jpeg|1202|1600|0|165090||1637518221|1565142026000|0|0|0|0|||||||| +5766|6588|content://media/external/images/media/6588|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0019.jpg|image/jpeg|1200|1600|0|142895||1637518221|1565142026000|0|0|0|0|||||||| +5767|6373|content://media/external/images/media/6373|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0013.jpg|image/jpeg|1600|1200|0|149710||1637518221|1565142025000|0|0|0|0|||||||| +5768|6490|content://media/external/images/media/6490|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0018.jpg|image/jpeg|1600|1200|0|146110||1637518221|1565142025000|0|0|0|0|||||||| +5769|6587|content://media/external/images/media/6587|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0014.jpg|image/jpeg|1200|1600|0|129650||1637518221|1565142025000|0|0|0|0|||||||| +5770|6901|content://media/external/images/media/6901|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0017.jpg|image/jpeg|1200|1600|0|125728||1637518222|1565142025000|0|0|0|0|||||||| +5771|6902|content://media/external/images/media/6902|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0015.jpg|image/jpeg|1200|1600|0|142623||1637518222|1565142025000|0|0|0|0|||||||| +5772|6900|content://media/external/images/media/6900|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0010.jpg|image/jpeg|1200|1600|0|136199||1637518222|1565142024000|0|0|0|0|||||||| +5773|7026|content://media/external/images/media/7026|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0012.jpg|image/jpeg|1200|1600|0|130694||1637518222|1565142024000|0|0|0|0|||||||| +5774|6247|content://media/external/images/media/6247|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0009.jpg|image/jpeg|1200|1600|0|151478||1637518221|1565142023000|0|0|0|0|||||||| +5775|6485|content://media/external/images/media/6485|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0005.jpg|image/jpeg|1600|1200|0|187377||1637518221|1565142023000|0|0|0|0|||||||| +5776|6788|content://media/external/images/media/6788|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0008.jpg|image/jpeg|1200|1600|0|146627||1637518222|1565142023000|0|0|0|0|||||||| +5777|6243|content://media/external/images/media/6243|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0004.jpg|image/jpeg|1200|1600|0|202054||1637518221|1565142022000|0|0|0|0|||||||| +5778|6484|content://media/external/images/media/6484|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190807-WA0003.jpg|image/jpeg|1200|1600|0|110286||1637518221|1565142022000|0|0|0|0|||||||| +5779|6786|content://media/external/images/media/6786|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190806-WA0013.jpg|image/jpeg|1599|1200|0|249018||1637518222|1565123776000|0|0|0|0|||||||| +5780|6896|content://media/external/images/media/6896|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190806-WA0012.jpg|image/jpeg|1024|769|0|134781||1637518222|1565123754000|0|0|0|0|||||||| +5781|6483|content://media/external/images/media/6483|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190806-WA0011.jpg|image/jpeg|1600|901|0|218148||1637518221|1565123690000|0|0|0|0|||||||| +5782|6482|content://media/external/images/media/6482|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190806-WA0010.jpg|image/jpeg|1200|1599|0|244673||1637518221|1565123065000|0|0|0|0|||||||| +5783|6481|content://media/external/images/media/6481|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190806-WA0008.jpg|image/jpeg|1600|1200|0|256869||1637518221|1565122103000|0|0|0|0|||||||| +5784|4093|content://media/external/images/media/4093|/storage/emulated/0/DCIM/Camera/IMG_20190804_194823.jpg|image/jpeg|4000|3000|0|6317244||1637504400|1564940903000|1564940903168|0|0|0|||||||| +5785|3783|content://media/external/images/media/3783|/storage/emulated/0/DCIM/Camera/IMG_20190804_115805.jpg|image/jpeg|4000|3000|0|3491716||1637503558|1564912685000|1564912685647|0|0|0|||||||| +5786|4968|content://media/external/images/media/4968|/storage/emulated/0/DCIM/Camera/IMG_20190804_115544.jpg|image/jpeg|4000|3000|90|6709464||1637506097|1564912544000|1564912544655|0|0|0|||||||| +5787|6370|content://media/external/images/media/6370|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190804-WA0014.jpg|image/jpeg|1600|692|0|88943||1637518221|1564903495000|0|0|0|0|||||||| +5788|6478|content://media/external/images/media/6478|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190804-WA0012.jpg|image/jpeg|1600|1200|0|158635||1637518221|1564882539000|0|0|0|0|||||||| +5789|6369|content://media/external/images/media/6369|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190804-WA0009.jpg|image/jpeg|1600|1200|0|152721||1637518221|1564882538000|0|0|0|0|||||||| +5790|6368|content://media/external/images/media/6368|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190804-WA0002.jpg|image/jpeg|1600|1202|0|165474||1637518221|1564882537000|0|0|0|0|||||||| +5791|3949|content://media/external/images/media/3949|/storage/emulated/0/DCIM/Camera/IMG_20190803_185504.jpg|image/jpeg|4000|3000|0|5270374||1637503942|1564851304000|1564851304275|0|0|0|||||||| +5792|4029|content://media/external/images/media/4029|/storage/emulated/0/DCIM/Camera/IMG_20190803_181213.jpg|image/jpeg|4000|3000|90|6487293||1637504234|1564848733000|1564848732894|0|0|0|||||||| +5793|6895|content://media/external/images/media/6895|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190802-WA0014.jpg|image/jpeg|1115|960|0|78817||1637518222|1564778315000|0|0|0|0|||||||| +5794|4179|content://media/external/images/media/4179|/storage/emulated/0/DCIM/Camera/IMG_20190802_212856.jpg|image/jpeg|4000|3000|0|5403658||1637504558|1564774138000|1564773818171|0|0|0|||||||| +5795|6583|content://media/external/images/media/6583|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190802-WA0001.jpg|image/jpeg|1080|1080|0|122115||1637518221|1564729482000|0|0|0|0|||||||| +5796|3258|content://media/external/images/media/3258|/storage/emulated/0/DCIM/Camera/IMG_20190730_205258.jpg|image/jpeg|4160|3120|0|5808282||1637502342|1564512779000|1564512778429|0|0|0|||||||| +5797|4028|content://media/external/images/media/4028|/storage/emulated/0/DCIM/Camera/IMG_20190730_203110.jpg|image/jpeg|4000|3000|90|6344577||1637504234|1564511470000|1564511470794|0|0|0|||||||| +5798|4945|content://media/external/images/media/4945|/storage/emulated/0/DCIM/Camera/IMG_20190730_203108.jpg|image/jpeg|4000|3000|90|6198732||1637506015|1564511468000|1564511468766|0|0|0|||||||| +5799|4092|content://media/external/images/media/4092|/storage/emulated/0/DCIM/Camera/IMG_20190730_201542.jpg|image/jpeg|4000|3000|0|4818138||1637504399|1564510542000|1564510542342|0|0|0|||||||| +5800|3527|content://media/external/images/media/3527|/storage/emulated/0/DCIM/Camera/IMG_20190730_194323.jpg|image/jpeg|4000|3000|90|6922146||1637503010|1564508603000|1564508602924|0|0|0|||||||| +5801|6479|content://media/external/images/media/6479|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190730-WA0019.jpg|image/jpeg|1600|1200|0|247075||1637518221|1564468834000|0|0|0|0|||||||| +5802|7021|content://media/external/images/media/7021|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190730-WA0014.jpg|image/jpeg|1600|1200|0|235947||1637518222|1564468831000|0|0|0|0|||||||| +5803|6783|content://media/external/images/media/6783|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190730-WA0012.jpg|image/jpeg|1600|1200|0|224582||1637518222|1564468830000|0|0|0|0|||||||| +5804|3462|content://media/external/images/media/3462|/storage/emulated/0/DCIM/Camera/IMG_20190729_180407.jpg|image/jpeg|1813|1867|0|909278||1637502817|1564416248000|1564416142809|0|0|0|||||||| +5805|4768|content://media/external/images/media/4768|/storage/emulated/0/DCIM/Camera/IMG_20190729_180317.jpg|image/jpeg|4000|3000|90|6158549||1637505656|1564416197000|1564416197126|0|0|0|||||||| +5806|3974|content://media/external/images/media/3974|/storage/emulated/0/DCIM/Camera/IMG_20190729_174913.jpg|image/jpeg|4000|3000|90|6424332||1637504059|1564415353000|1564415353237|0|0|0|||||||| +5807|4448|content://media/external/images/media/4448|/storage/emulated/0/DCIM/Camera/IMG_20190727_142757_1.jpg|image/jpeg|4000|3000|0|4195356||1637505068|1564230478000|1564230477700|0|0|0|||||||| +5808|4923|content://media/external/images/media/4923|/storage/emulated/0/DCIM/Camera/IMG_20190727_142758.jpg|image/jpeg|4000|3000|0|2358918||1637506010|1564230478000|1564230477967|0|0|0|||||||| +5809|2854|content://media/external/images/media/2854|/storage/emulated/0/DCIM/Camera/IMG_20190727_142756.jpg|image/jpeg|4000|3000|0|3374330||1637501457|1564230476000|1564230476094|0|0|0|||||||| +5810|4838|content://media/external/images/media/4838|/storage/emulated/0/DCIM/Camera/IMG_20190727_142755_1.jpg|image/jpeg|4000|3000|0|5321240||1637505753|1564230476000|1564230475922|0|0|0|||||||| +5811|4837|content://media/external/images/media/4837|/storage/emulated/0/DCIM/Camera/IMG_20190727_142752.jpg|image/jpeg|4000|3000|0|5054952||1637505753|1564230472000|1564230472069|0|0|0|||||||| +5812|4109|content://media/external/images/media/4109|/storage/emulated/0/DCIM/Camera/IMG_20190727_142513.jpg|image/jpeg|4000|3000|0|5381701||1637504451|1564230313000|1564230313516|0|0|0|||||||| +5813|4944|content://media/external/images/media/4944|/storage/emulated/0/DCIM/Camera/IMG_20190727_142445.jpg|image/jpeg|3000|3000|0|2891501||1637506015|1564230286000|1564230285657|0|0|0|||||||| +5814|6782|content://media/external/images/media/6782|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0019.jpg|image/jpeg|1600|900|0|301750||1637518222|1564227307000|0|0|0|0|||||||| +5815|6244|content://media/external/images/media/6244|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0017.jpg|image/jpeg|1600|900|0|201590||1637518221|1564219915000|0|0|0|0|||||||| +5816|6242|content://media/external/images/media/6242|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0016.jpg|image/jpeg|1600|1200|0|143111||1637518221|1564219023000|0|0|0|0|||||||| +5817|6241|content://media/external/images/media/6241|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0013.jpg|image/jpeg|898|1600|0|179420||1637518221|1564217623000|0|0|0|0|||||||| +5818|6476|content://media/external/images/media/6476|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0012.jpg|image/jpeg|898|1600|0|135222||1637518221|1564217551000|0|0|0|0|||||||| +5819|6780|content://media/external/images/media/6780|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0011.jpg|image/jpeg|898|1600|0|81835||1637518222|1564217534000|0|0|0|0|||||||| +5820|6779|content://media/external/images/media/6779|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0010.jpg|image/jpeg|620|921|0|61701||1637518222|1564217187000|0|0|0|0|||||||| +5821|6364|content://media/external/images/media/6364|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0009.jpg|image/jpeg|1200|1600|0|229379||1637518221|1564214299000|0|0|0|0|||||||| +5822|6893|content://media/external/images/media/6893|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0008.jpg|image/jpeg|780|1040|0|89126||1637518222|1564214288000|0|0|0|0|||||||| +5823|6681|content://media/external/images/media/6681|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0007.jpg|image/jpeg|1040|780|0|45745||1637518222|1564213953000|0|0|0|0|||||||| +5824|7018|content://media/external/images/media/7018|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0006.jpg|image/jpeg|1182|838|0|417281||1637518222|1564213169000|0|0|0|0|||||||| +5825|6363|content://media/external/images/media/6363|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0005.jpg|image/jpeg|780|1040|0|98996||1637518221|1564211646000|0|0|0|0|||||||| +5826|6777|content://media/external/images/media/6777|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0003.jpeg|image/jpeg|2250|4000|0|1071992||1637518222|1564209195000|0|0|0|0|||||||| +5827|6891|content://media/external/images/media/6891|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0002.jpg|image/jpeg|1200|1600|0|85198||1637518222|1564208036000|0|0|0|0|||||||| +5828|6474|content://media/external/images/media/6474|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0001.jpg|image/jpeg|1200|1600|0|142530||1637518221|1564208035000|0|0|0|0|||||||| +5829|7016|content://media/external/images/media/7016|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190727-WA0000.jpg|image/jpeg|1200|1600|0|124953||1637518222|1564208035000|0|0|0|0|||||||| +5830|6679|content://media/external/images/media/6679|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0069.jpg|image/jpeg|750|1334|0|112682||1637518222|1564169182000|0|0|0|0|||||||| +5831|6581|content://media/external/images/media/6581|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0068.jpg|image/jpeg|898|1600|0|190392||1637518221|1564169011000|0|0|0|0|||||||| +5832|6239|content://media/external/images/media/6239|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0066.jpg|image/jpeg|898|1600|0|149090||1637518221|1564168611000|0|0|0|0|||||||| +5833|6472|content://media/external/images/media/6472|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0067.jpg|image/jpeg|898|1600|0|53196||1637518221|1564168611000|0|0|0|0|||||||| +5834|6361|content://media/external/images/media/6361|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0065.jpg|image/jpeg|899|1599|0|152947||1637518221|1564168610000|0|0|0|0|||||||| +5835|6238|content://media/external/images/media/6238|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0064.jpg|image/jpeg|780|1040|0|48633||1637518221|1564167164000|0|0|0|0|||||||| +5836|6888|content://media/external/images/media/6888|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0063.jpg|image/jpeg|899|1599|0|138926||1637518222|1564166535000|0|0|0|0|||||||| +5837|6470|content://media/external/images/media/6470|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0062.jpg|image/jpeg|777|1599|0|148058||1637518221|1564165938000|0|0|0|0|||||||| +5838|7013|content://media/external/images/media/7013|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0061.jpg|image/jpeg|1600|898|0|178536||1637518222|1564165740000|0|0|0|0|||||||| +5839|6580|content://media/external/images/media/6580|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0059.jpg|image/jpeg|1200|1600|0|159693||1637518221|1564165663000|0|0|0|0|||||||| +5840|6359|content://media/external/images/media/6359|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0058.jpg|image/jpeg|898|1600|0|146355||1637518221|1564165569000|0|0|0|0|||||||| +5841|6358|content://media/external/images/media/6358|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0056.jpg|image/jpeg|750|1334|0|70917||1637518221|1564165491000|0|0|0|0|||||||| +5842|6469|content://media/external/images/media/6469|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0057.jpg|image/jpeg|750|1334|0|47466||1637518221|1564165491000|0|0|0|0|||||||| +5843|6776|content://media/external/images/media/6776|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0055.jpg|image/jpeg|750|1334|0|56845||1637518222|1564165491000|0|0|0|0|||||||| +5844|6356|content://media/external/images/media/6356|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0054.jpg|image/jpeg|750|1334|0|61055||1637518221|1564165490000|0|0|0|0|||||||| +5845|6775|content://media/external/images/media/6775|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0053.jpg|image/jpeg|750|1334|0|65259||1637518222|1564165490000|0|0|0|0|||||||| +5846|6887|content://media/external/images/media/6887|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0052.jpg|image/jpeg|750|1334|0|62659||1637518222|1564165490000|0|0|0|0|||||||| +5847|7010|content://media/external/images/media/7010|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0051.jpg|image/jpeg|750|1334|0|73637||1637518222|1564165489000|0|0|0|0|||||||| +5848|6774|content://media/external/images/media/6774|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0050.jpg|image/jpeg|1600|898|0|97560||1637518222|1564165187000|0|0|0|0|||||||| +5849|4349|content://media/external/images/media/4349|/storage/emulated/0/DCIM/Camera/IMG_20190726_195948.jpg|image/jpeg|4000|3000|0|5537397||1637504970|1564163989000|1564163988660|0|0|0|||||||| +5850|6886|content://media/external/images/media/6886|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0047.jpg|image/jpeg|899|1599|0|94076||1637518222|1564163651000|0|0|0|0|||||||| +5851|6236|content://media/external/images/media/6236|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0046.jpg|image/jpeg|768|1024|0|83403||1637518221|1564163283000|0|0|0|0|||||||| +5852|6235|content://media/external/images/media/6235|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0044.jpg|image/jpeg|1200|1599|0|89267||1637518221|1564162492000|0|0|0|0|||||||| +5853|6234|content://media/external/images/media/6234|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0043.jpg|image/jpeg|1200|1600|0|485758||1637518221|1564161343000|0|0|0|0|||||||| +5854|6884|content://media/external/images/media/6884|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0042.jpg|image/jpeg|1600|1202|0|116533||1637518222|1564161342000|0|0|0|0|||||||| +5855|6576|content://media/external/images/media/6576|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0041.jpg|image/jpeg|900|1600|0|150087||1637518221|1564161132000|0|0|0|0|||||||| +5856|6575|content://media/external/images/media/6575|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0040_1.jpg|image/jpeg|-1|-1|0|0||1637518221|1564152445000|0|0|0|0|||||||| +5857|6352|content://media/external/images/media/6352|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0040.jpg|image/jpeg|898|1600|0|95706||1637518221|1564147743000|0|0|0|0|||||||| +5858|6883|content://media/external/images/media/6883|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0039.jpg|image/jpeg|1600|901|0|233850||1637518222|1564147715000|0|0|0|0|||||||| +5859|6571|content://media/external/images/media/6571|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0038.jpg|image/jpeg|480|670|0|16905||1637518221|1564147082000|0|0|0|0|||||||| +5860|6674|content://media/external/images/media/6674|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0036.jpg|image/jpeg|1600|898|0|154391||1637518222|1564146739000|0|0|0|0|||||||| +5861|6350|content://media/external/images/media/6350|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0035.jpg|image/jpeg|1600|898|0|192881||1637518221|1564146738000|0|0|0|0|||||||| +5862|6673|content://media/external/images/media/6673|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0033.jpg|image/jpeg|709|646|0|298901||1637518222|1564141815000|0|0|0|0|||||||| +5863|6879|content://media/external/images/media/6879|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0034.jpg|image/jpeg|627|863|0|62698||1637518222|1564141815000|0|0|0|0|||||||| +5864|6348|content://media/external/images/media/6348|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0032.jpg|image/jpeg|780|1040|0|52060||1637518221|1564141814000|0|0|0|0|||||||| +5865|6232|content://media/external/images/media/6232|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0031.jpg|image/jpeg|1600|900|0|160525||1637518221|1564138451000|0|0|0|0|||||||| +5866|6231|content://media/external/images/media/6231|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0030.jpg|image/jpeg|1600|900|0|164644||1637518221|1564138375000|0|0|0|0|||||||| +5867|6669|content://media/external/images/media/6669|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0029.jpg|image/jpeg|1600|900|0|114881||1637518222|1564138372000|0|0|0|0|||||||| +5868|7008|content://media/external/images/media/7008|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0027.jpeg|image/jpeg|2250|4000|0|881583||1637518222|1564138005000|0|0|0|0|||||||| +5869|6772|content://media/external/images/media/6772|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0025.jpeg|image/jpeg|2250|4000|0|834362||1637518222|1564137991000|0|0|0|0|||||||| +5870|6465|content://media/external/images/media/6465|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0023.jpeg|image/jpeg|2250|4000|0|734384||1637518221|1564137982000|0|0|0|0|||||||| +5871|6770|content://media/external/images/media/6770|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0021.jpeg|image/jpeg|2250|4000|0|874747||1637518222|1564137967000|0|0|0|0|||||||| +5872|6347|content://media/external/images/media/6347|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0019.jpg|image/jpeg|1200|1599|0|366842||1637518221|1564133782000|0|0|0|0|||||||| +5873|6877|content://media/external/images/media/6877|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0018.jpg|image/jpeg|1600|898|0|87606||1637518222|1564133510000|0|0|0|0|||||||| +5874|7006|content://media/external/images/media/7006|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0017.jpg|image/jpeg|1599|1200|0|398024||1637518222|1564132940000|0|0|0|0|||||||| +5875|6769|content://media/external/images/media/6769|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0015.jpeg|image/jpeg|4000|2250|0|900076||1637518222|1564130026000|0|0|0|0|||||||| +5876|7004|content://media/external/images/media/7004|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0014.jpg|image/jpeg|1200|1599|0|357419||1637518222|1564129644000|0|0|0|0|||||||| +5877|6572|content://media/external/images/media/6572|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0013.jpg|image/jpeg|1200|1599|0|296405||1637518221|1564129643000|0|0|0|0|||||||| +5878|6874|content://media/external/images/media/6874|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0012.jpg|image/jpeg|1040|780|0|34970||1637518222|1564129112000|0|0|0|0|||||||| +5879|7003|content://media/external/images/media/7003|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0011.jpg|image/jpeg|1040|780|0|51520||1637518222|1564129109000|0|0|0|0|||||||| +5880|6569|content://media/external/images/media/6569|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0010.jpg|image/jpeg|1040|780|0|36037||1637518221|1564129107000|0|0|0|0|||||||| +5881|7002|content://media/external/images/media/7002|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0009.jpg|image/jpeg|780|1040|0|39519||1637518222|1564129104000|0|0|0|0|||||||| +5882|6567|content://media/external/images/media/6567|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0008.jpg|image/jpeg|1040|780|0|47514||1637518221|1564129103000|0|0|0|0|||||||| +5883|6461|content://media/external/images/media/6461|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0007.jpg|image/jpeg|780|1040|0|70341||1637518221|1564129101000|0|0|0|0|||||||| +5884|6665|content://media/external/images/media/6665|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0006.jpg|image/jpeg|780|1040|0|48516||1637518222|1564129096000|0|0|0|0|||||||| +5885|7001|content://media/external/images/media/7001|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0005.jpg|image/jpeg|780|1040|0|16177||1637518222|1564129095000|0|0|0|0|||||||| +5886|6345|content://media/external/images/media/6345|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0004.jpg|image/jpeg|1040|780|0|38893||1637518221|1564129092000|0|0|0|0|||||||| +5887|6765|content://media/external/images/media/6765|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0003.jpg|image/jpeg|1040|780|0|43971||1637518222|1564129089000|0|0|0|0|||||||| +5888|2871|content://media/external/images/media/2871|/storage/emulated/0/DCIM/Camera/IMG_20190726_090824.jpg|image/jpeg|4160|3120|0|8740301||1637501460|1564124904000|1564124903956|0|0|0|||||||| +5889|4789|content://media/external/images/media/4789|/storage/emulated/0/DCIM/Camera/IMG_20190726_084537.jpg|image/jpeg|4000|3000|0|7733167||1637505663|1564123537000|1564123537268|0|0|0|||||||| +5890|6457|content://media/external/images/media/6457|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190726-WA0000.jpg|image/jpeg|1200|1600|0|277228||1637518221|1564120670000|0|0|0|0|||||||| +5891|6565|content://media/external/images/media/6565|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0017.jpg|image/jpeg|750|1334|0|168484||1637518221|1564077592000|0|0|0|0|||||||| +5892|6872|content://media/external/images/media/6872|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0016.jpg|image/jpeg|720|1280|0|48333||1637518222|1564077431000|0|0|0|0|||||||| +5893|6999|content://media/external/images/media/6999|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0015.jpg|image/jpeg|720|1280|0|43337||1637518222|1564077431000|0|0|0|0|||||||| +5894|6566|content://media/external/images/media/6566|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0014.jpg|image/jpeg|900|1600|0|275949||1637518221|1564071222000|0|0|0|0|||||||| +5895|6342|content://media/external/images/media/6342|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0013.jpg|image/jpeg|900|1600|0|133310||1637518221|1564067214000|0|0|0|0|||||||| +5896|6662|content://media/external/images/media/6662|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0012.jpg|image/jpeg|1200|1600|0|185432||1637518222|1564060728000|0|0|0|0|||||||| +5897|6767|content://media/external/images/media/6767|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0011.jpg|image/jpeg|900|1600|0|145542||1637518222|1564060621000|0|0|0|0|||||||| +5898|6562|content://media/external/images/media/6562|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0010.jpg|image/jpeg|780|1040|0|32352||1637518221|1564060613000|0|0|0|0|||||||| +5899|6456|content://media/external/images/media/6456|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0009.jpg|image/jpeg|1200|1600|0|106386||1637518221|1564060320000|0|0|0|0|||||||| +5900|6661|content://media/external/images/media/6661|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0008.jpg|image/jpeg|1040|780|0|36746||1637518221|1564060029000|0|0|0|0|||||||| +5901|6229|content://media/external/images/media/6229|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0006.jpg|image/jpeg|780|1040|0|93690||1637518221|1564057045000|0|0|0|0|||||||| +5902|6660|content://media/external/images/media/6660|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0004.jpg|image/jpeg|1200|1599|0|341703||1637518221|1564048894000|0|0|0|0|||||||| +5903|6659|content://media/external/images/media/6659|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0002.jpg|image/jpeg|780|1040|0|60933||1637518221|1564042159000|0|0|0|0|||||||| +5904|6871|content://media/external/images/media/6871|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190725-WA0000.jpg|image/jpeg|1200|1600|0|215175||1637518222|1564037585000|0|0|0|0|||||||| +5905|4408|content://media/external/images/media/4408|/storage/emulated/0/DCIM/Camera/IMG_20190724_223046.jpg|image/jpeg|4160|3120|0|4491804||1637505062|1564000246000|1564000246108|0|0|0|||||||| +5906|4386|content://media/external/images/media/4386|/storage/emulated/0/DCIM/Camera/IMG_20190724_223040.jpg|image/jpeg|4160|3120|0|4475308||1637505004|1564000240000|1564000240725|0|0|0|||||||| +5907|4655|content://media/external/images/media/4655|/storage/emulated/0/DCIM/Camera/IMG_20190724_223030.jpg|image/jpeg|4000|3000|0|6008820||1637505417|1564000230000|1564000230598|0|0|0|||||||| +5908|6998|content://media/external/images/media/6998|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0334.jpg|image/jpeg|1560|496|0|73362||1637518222|1563998598000|0|0|0|0|||||||| +5909|6762|content://media/external/images/media/6762|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0333.jpg|image/jpeg|780|1040|0|39924||1637518222|1563992783000|0|0|0|0|||||||| +5910|6227|content://media/external/images/media/6227|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0330.jpg|image/jpeg|780|1040|0|80193||1637518221|1563985963000|0|0|0|0|||||||| +5911|6453|content://media/external/images/media/6453|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0328.jpg|image/jpeg|900|1600|0|205746||1637518221|1563984368000|0|0|0|0|||||||| +5912|6339|content://media/external/images/media/6339|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0327.jpg|image/jpeg|780|1040|0|82104||1637518221|1563983839000|0|0|0|0|||||||| +5913|6996|content://media/external/images/media/6996|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0326.jpg|image/jpeg|780|1040|0|53033||1637518222|1563983829000|0|0|0|0|||||||| +5914|6995|content://media/external/images/media/6995|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0325.jpg|image/jpeg|1200|1600|0|232480||1637518222|1563981449000|0|0|0|0|||||||| +5915|6560|content://media/external/images/media/6560|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0324.jpg|image/jpeg|1200|1600|0|165093||1637518221|1563981448000|0|0|0|0|||||||| +5916|6656|content://media/external/images/media/6656|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0323.jpg|image/jpeg|700|700|0|77925||1637518221|1563977745000|0|0|0|0|||||||| +5917|6657|content://media/external/images/media/6657|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0322.jpg|image/jpeg|1600|1202|0|228427||1637518221|1563969484000|0|0|0|0|||||||| +5918|6558|content://media/external/images/media/6558|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0321.jpg|image/jpeg|564|530|0|37040||1637518221|1563967968000|0|0|0|0|||||||| +5919|6758|content://media/external/images/media/6758|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0320.jpg|image/jpeg|898|1600|0|132937||1637518222|1563967333000|0|0|0|0|||||||| +5920|6337|content://media/external/images/media/6337|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0319.jpg|image/jpeg|1600|1200|0|114150||1637518221|1563967206000|0|0|0|0|||||||| +5921|3136|content://media/external/images/media/3136|/storage/emulated/0/DCIM/Camera/IMG_20190724_123840.jpg|image/jpeg|1619|1214|0|464040||1637502130|1563964721000|1563964669296|0|0|0|||||||| +5922|4496|content://media/external/images/media/4496|/storage/emulated/0/DCIM/Camera/IMG_20190724_123749.jpg|image/jpeg|4000|3000|90|5552266||1637505160|1563964669000|1563964669296|0|0|0|||||||| +5923|3101|content://media/external/images/media/3101|/storage/emulated/0/DCIM/Camera/IMG_20190724_122703.jpg|image/jpeg|4000|3000|90|5478442||1637502054|1563964024000|1563964023471|0|0|0|||||||| +5924|6451|content://media/external/images/media/6451|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0318.jpg|image/jpeg|770|1600|0|102707||1637518221|1563963014000|0|0|0|0|||||||| +5925|6336|content://media/external/images/media/6336|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0316.jpg|image/jpeg|1600|1063|0|309289||1637518221|1563955224000|0|0|0|0|||||||| +5926|6757|content://media/external/images/media/6757|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0317.jpg|image/jpeg|1600|1063|0|382062||1637518222|1563955224000|0|0|0|0|||||||| +5927|6866|content://media/external/images/media/6866|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0314.jpg|image/jpeg|1600|1063|0|406452||1637518222|1563955223000|0|0|0|0|||||||| +5928|6867|content://media/external/images/media/6867|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0315.jpg|image/jpeg|1600|1063|0|295034||1637518222|1563955223000|0|0|0|0|||||||| +5929|6994|content://media/external/images/media/6994|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0313.jpg|image/jpeg|1600|1063|0|271479||1637518222|1563955223000|0|0|0|0|||||||| +5930|6865|content://media/external/images/media/6865|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0312.jpg|image/jpeg|1600|1063|0|354115||1637518222|1563955222000|0|0|0|0|||||||| +5931|6557|content://media/external/images/media/6557|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0311.jpg|image/jpeg|1600|1063|0|287912||1637518221|1563955221000|0|0|0|0|||||||| +5932|6556|content://media/external/images/media/6556|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0310.jpg|image/jpeg|1600|1063|0|334096||1637518221|1563955118000|0|0|0|0|||||||| +5933|6225|content://media/external/images/media/6225|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0308.jpg|image/jpeg|1600|1063|0|267041||1637518221|1563955117000|0|0|0|0|||||||| +5934|6653|content://media/external/images/media/6653|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0309.jpg|image/jpeg|1600|1063|0|296916||1637518221|1563955117000|0|0|0|0|||||||| +5935|6863|content://media/external/images/media/6863|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0307.jpg|image/jpeg|1063|1600|0|346898||1637518222|1563955117000|0|0|0|0|||||||| +5936|6861|content://media/external/images/media/6861|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0306.jpg|image/jpeg|1600|1063|0|278994||1637518222|1563955116000|0|0|0|0|||||||| +5937|6992|content://media/external/images/media/6992|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0305.jpg|image/jpeg|1600|1063|0|284014||1637518222|1563955116000|0|0|0|0|||||||| +5938|6331|content://media/external/images/media/6331|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0303.jpg|image/jpeg|1600|1063|0|298674||1637518221|1563955115000|0|0|0|0|||||||| +5939|6449|content://media/external/images/media/6449|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0304.jpg|image/jpeg|1600|1063|0|328637||1637518221|1563955115000|0|0|0|0|||||||| +5940|6553|content://media/external/images/media/6553|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0302.jpg|image/jpeg|1600|1063|0|326319||1637518221|1563955115000|0|0|0|0|||||||| +5941|6223|content://media/external/images/media/6223|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0301.jpg|image/jpeg|1600|1063|0|311406||1637518221|1563955114000|0|0|0|0|||||||| +5942|6554|content://media/external/images/media/6554|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0300.jpg|image/jpeg|1600|1063|0|314149||1637518221|1563955114000|0|0|0|0|||||||| +5943|6446|content://media/external/images/media/6446|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0298.jpg|image/jpeg|1600|1063|0|274160||1637518221|1563955113000|0|0|0|0|||||||| +5944|6651|content://media/external/images/media/6651|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0297.jpg|image/jpeg|1600|1063|0|265273||1637518221|1563955113000|0|0|0|0|||||||| +5945|6989|content://media/external/images/media/6989|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0299.jpg|image/jpeg|1600|1063|0|246877||1637518222|1563955113000|0|0|0|0|||||||| +5946|6988|content://media/external/images/media/6988|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0296.jpg|image/jpeg|1600|1063|0|308847||1637518222|1563955112000|0|0|0|0|||||||| +5947|6985|content://media/external/images/media/6985|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0294.jpg|image/jpeg|1063|1600|0|465416||1637518222|1563954913000|0|0|0|0|||||||| +5948|6987|content://media/external/images/media/6987|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0295.jpg|image/jpeg|1600|1063|0|392976||1637518222|1563954913000|0|0|0|0|||||||| +5949|6860|content://media/external/images/media/6860|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0293.jpg|image/jpeg|1600|1063|0|316709||1637518222|1563954912000|0|0|0|0|||||||| +5950|6330|content://media/external/images/media/6330|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0292.jpg|image/jpeg|1600|1063|0|330080||1637518221|1563954911000|0|0|0|0|||||||| +5951|6551|content://media/external/images/media/6551|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0291.jpg|image/jpeg|1600|1063|0|371000||1637518221|1563954911000|0|0|0|0|||||||| +5952|6443|content://media/external/images/media/6443|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0290.jpg|image/jpeg|1600|1063|0|382886||1637518221|1563954910000|0|0|0|0|||||||| +5953|6550|content://media/external/images/media/6550|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0289.jpg|image/jpeg|1600|1063|0|387792||1637518221|1563954909000|0|0|0|0|||||||| +5954|6751|content://media/external/images/media/6751|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0288.jpg|image/jpeg|1600|1063|0|374314||1637518222|1563954908000|0|0|0|0|||||||| +5955|6329|content://media/external/images/media/6329|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0286.jpg|image/jpeg|1600|1063|0|313983||1637518221|1563954907000|0|0|0|0|||||||| +5956|6442|content://media/external/images/media/6442|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0287.jpg|image/jpeg|1600|1063|0|311176||1637518221|1563954907000|0|0|0|0|||||||| +5957|6548|content://media/external/images/media/6548|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0285.jpg|image/jpeg|1600|1063|0|425955||1637518221|1563954906000|0|0|0|0|||||||| +5958|6752|content://media/external/images/media/6752|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0284.jpg|image/jpeg|1600|1063|0|375405||1637518222|1563954905000|0|0|0|0|||||||| +5959|6220|content://media/external/images/media/6220|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0283.jpg|image/jpeg|1600|1063|0|383492||1637518221|1563954904000|0|0|0|0|||||||| +5960|6649|content://media/external/images/media/6649|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0282.jpg|image/jpeg|1063|1600|0|378608||1637518221|1563954903000|0|0|0|0|||||||| +5961|6327|content://media/external/images/media/6327|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0281.jpg|image/jpeg|1600|1063|0|376057||1637518221|1563954902000|0|0|0|0|||||||| +5962|6750|content://media/external/images/media/6750|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0280.jpg|image/jpeg|1600|1063|0|253318||1637518222|1563954792000|0|0|0|0|||||||| +5963|6980|content://media/external/images/media/6980|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0279.jpg|image/jpeg|1600|1063|0|202068||1637518222|1563954792000|0|0|0|0|||||||| +5964|6324|content://media/external/images/media/6324|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0276.jpg|image/jpeg|1600|1063|0|384685||1637518221|1563954791000|0|0|0|0|||||||| +5965|6746|content://media/external/images/media/6746|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0277.jpg|image/jpeg|1600|1063|0|196137||1637518222|1563954791000|0|0|0|0|||||||| +5966|6749|content://media/external/images/media/6749|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0278.jpg|image/jpeg|1600|1063|0|190890||1637518222|1563954791000|0|0|0|0|||||||| +5967|6439|content://media/external/images/media/6439|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0273.jpg|image/jpeg|1600|1063|0|266734||1637518221|1563954790000|0|0|0|0|||||||| +5968|6748|content://media/external/images/media/6748|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0275.jpg|image/jpeg|1600|1063|0|383430||1637518222|1563954790000|0|0|0|0|||||||| +5969|6977|content://media/external/images/media/6977|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0274.jpg|image/jpeg|1600|1063|0|346732||1637518222|1563954790000|0|0|0|0|||||||| +5970|6859|content://media/external/images/media/6859|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0271.jpg|image/jpeg|1600|1063|0|343494||1637518222|1563954789000|0|0|0|0|||||||| +5971|6976|content://media/external/images/media/6976|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0272.jpg|image/jpeg|1063|1600|0|463440||1637518222|1563954789000|0|0|0|0|||||||| +5972|6218|content://media/external/images/media/6218|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0270.jpg|image/jpeg|1600|1063|0|196041||1637518221|1563954788000|0|0|0|0|||||||| +5973|6322|content://media/external/images/media/6322|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0269.jpg|image/jpeg|1600|1063|0|215681||1637518221|1563954787000|0|0|0|0|||||||| +5974|6438|content://media/external/images/media/6438|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0268.jpg|image/jpeg|1600|1063|0|206930||1637518221|1563954674000|0|0|0|0|||||||| +5975|6544|content://media/external/images/media/6544|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0266.jpg|image/jpeg|1600|1063|0|274043||1637518221|1563954674000|0|0|0|0|||||||| +5976|6648|content://media/external/images/media/6648|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0267.jpg|image/jpeg|1600|1063|0|257313||1637518221|1563954674000|0|0|0|0|||||||| +5977|6003|content://media/external/images/media/6003|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0265.jpg|image/jpeg|1063|1600|0|329137||1637518220|1563954673000|0|0|0|0|||||||| +5978|6437|content://media/external/images/media/6437|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0264.jpg|image/jpeg|1063|1600|0|333519||1637518221|1563954673000|0|0|0|0|||||||| +5979|6436|content://media/external/images/media/6436|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0262.jpg|image/jpeg|1600|1063|0|318421||1637518221|1563954672000|0|0|0|0|||||||| +5980|6646|content://media/external/images/media/6646|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0263.jpg|image/jpeg|1600|1063|0|336132||1637518221|1563954672000|0|0|0|0|||||||| +5981|6856|content://media/external/images/media/6856|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0261.jpg|image/jpeg|1600|1063|0|239959||1637518222|1563954672000|0|0|0|0|||||||| +5982|6435|content://media/external/images/media/6435|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0259.jpg|image/jpeg|1600|1063|0|265639||1637518221|1563954671000|0|0|0|0|||||||| +5983|6972|content://media/external/images/media/6972|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0260.jpg|image/jpeg|1600|1063|0|281517||1637518222|1563954671000|0|0|0|0|||||||| +5984|6433|content://media/external/images/media/6433|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0258.jpg|image/jpeg|1600|1063|0|229052||1637518221|1563954670000|0|0|0|0|||||||| +5985|6853|content://media/external/images/media/6853|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0257.jpg|image/jpeg|1600|1063|0|326424||1637518222|1563954670000|0|0|0|0|||||||| +5986|5998|content://media/external/images/media/5998|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0256.jpg|image/jpeg|1600|1063|0|203425||1637518220|1563954669000|0|0|0|0|||||||| +5987|5999|content://media/external/images/media/5999|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0253.jpg|image/jpeg|1600|1063|0|361305||1637518220|1563954553000|0|0|0|0|||||||| +5988|6541|content://media/external/images/media/6541|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0254.jpg|image/jpeg|1600|1063|0|304392||1637518221|1563954553000|0|0|0|0|||||||| +5989|6968|content://media/external/images/media/6968|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0255.jpg|image/jpeg|1600|1063|0|239569||1637518222|1563954553000|0|0|0|0|||||||| +5990|6216|content://media/external/images/media/6216|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0252.jpg|image/jpeg|1600|1063|0|280316||1637518221|1563954552000|0|0|0|0|||||||| +5991|6645|content://media/external/images/media/6645|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0251.jpg|image/jpeg|1600|1063|0|316634||1637518221|1563954552000|0|0|0|0|||||||| +5992|5997|content://media/external/images/media/5997|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0250.jpg|image/jpeg|1600|1063|0|326408||1637518220|1563954551000|0|0|0|0|||||||| +5993|6431|content://media/external/images/media/6431|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0249.jpg|image/jpeg|1600|1063|0|330591||1637518221|1563954551000|0|0|0|0|||||||| +5994|5995|content://media/external/images/media/5995|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0248.jpg|image/jpeg|1600|1063|0|395378||1637518220|1563954550000|0|0|0|0|||||||| +5995|6967|content://media/external/images/media/6967|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0247.jpg|image/jpeg|1600|1063|0|419725||1637518222|1563954550000|0|0|0|0|||||||| +5996|6430|content://media/external/images/media/6430|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0246.jpg|image/jpeg|1600|1063|0|417564||1637518221|1563954549000|0|0|0|0|||||||| +5997|6644|content://media/external/images/media/6644|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0245.jpg|image/jpeg|1600|1063|0|305459||1637518221|1563954549000|0|0|0|0|||||||| +5998|6539|content://media/external/images/media/6539|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0244.jpg|image/jpeg|1600|1063|0|459061||1637518221|1563954548000|0|0|0|0|||||||| +5999|5897|content://media/external/images/media/5897|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0242.jpg|image/jpeg|1600|1063|0|323399||1637518220|1563954547000|0|0|0|0|||||||| +6000|6641|content://media/external/images/media/6641|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0243.jpg|image/jpeg|1600|1063|0|327002||1637518221|1563954547000|0|0|0|0|||||||| +6001|5993|content://media/external/images/media/5993|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0241.jpg|image/jpeg|1600|1063|0|417631||1637518220|1563954434000|0|0|0|0|||||||| +6002|6640|content://media/external/images/media/6640|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0240.jpg|image/jpeg|1600|1063|0|329406||1637518221|1563954434000|0|0|0|0|||||||| +6003|5893|content://media/external/images/media/5893|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0237.jpg|image/jpeg|1600|1063|0|225858||1637518220|1563954433000|0|0|0|0|||||||| +6004|5990|content://media/external/images/media/5990|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0238.jpg|image/jpeg|1600|1063|0|346403||1637518220|1563954433000|0|0|0|0|||||||| +6005|6108|content://media/external/images/media/6108|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0239.jpg|image/jpeg|1063|1600|0|352996||1637518220|1563954433000|0|0|0|0|||||||| +6006|6105|content://media/external/images/media/6105|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0235.jpg|image/jpeg|1600|1063|0|301008||1637518220|1563954432000|0|0|0|0|||||||| +6007|6106|content://media/external/images/media/6106|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0236.jpg|image/jpeg|1600|1063|0|244652||1637518220|1563954432000|0|0|0|0|||||||| +6008|5895|content://media/external/images/media/5895|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0233.jpg|image/jpeg|1063|1600|0|358115||1637518220|1563954431000|0|0|0|0|||||||| +6009|5988|content://media/external/images/media/5988|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0234.jpg|image/jpeg|1063|1600|0|294308||1637518220|1563954431000|0|0|0|0|||||||| +6010|6102|content://media/external/images/media/6102|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0232.jpg|image/jpeg|1063|1600|0|249321||1637518220|1563954431000|0|0|0|0|||||||| +6011|5894|content://media/external/images/media/5894|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0231.jpg|image/jpeg|1600|1063|0|297690||1637518220|1563954430000|0|0|0|0|||||||| +6012|6964|content://media/external/images/media/6964|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0230.jpg|image/jpeg|1063|1600|0|259764||1637518222|1563954430000|0|0|0|0|||||||| +6013|6101|content://media/external/images/media/6101|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0229.jpg|image/jpeg|1063|1600|0|275225||1637518220|1563954429000|0|0|0|0|||||||| +6014|6960|content://media/external/images/media/6960|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0228.jpg|image/jpeg|1600|1063|0|235694||1637518222|1563954428000|0|0|0|0|||||||| +6015|5891|content://media/external/images/media/5891|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0227.jpg|image/jpeg|1600|1063|0|347216||1637518220|1563954427000|0|0|0|0|||||||| +6016|5890|content://media/external/images/media/5890|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0226.jpg|image/jpeg|1600|1063|0|259673||1637518220|1563954291000|0|0|0|0|||||||| +6017|5987|content://media/external/images/media/5987|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0224.jpg|image/jpeg|1600|1063|0|190888||1637518220|1563954290000|0|0|0|0|||||||| +6018|6961|content://media/external/images/media/6961|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0225.jpg|image/jpeg|1600|1063|0|204247||1637518222|1563954290000|0|0|0|0|||||||| +6019|5986|content://media/external/images/media/5986|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0222.jpg|image/jpeg|1063|1600|0|282876||1637518220|1563954289000|0|0|0|0|||||||| +6020|6959|content://media/external/images/media/6959|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0223.jpg|image/jpeg|1063|1600|0|331927||1637518222|1563954289000|0|0|0|0|||||||| +6021|5888|content://media/external/images/media/5888|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0221.jpg|image/jpeg|1063|1600|0|249288||1637518220|1563954288000|0|0|0|0|||||||| +6022|6096|content://media/external/images/media/6096|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0219.jpg|image/jpeg|1600|1063|0|335160||1637518220|1563954288000|0|0|0|0|||||||| +6023|6097|content://media/external/images/media/6097|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0220.jpg|image/jpeg|1600|1063|0|288151||1637518220|1563954288000|0|0|0|0|||||||| +6024|5982|content://media/external/images/media/5982|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0216.jpg|image/jpeg|1063|1600|0|266861||1637518220|1563954287000|0|0|0|0|||||||| +6025|6093|content://media/external/images/media/6093|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0218.jpg|image/jpeg|1600|1063|0|253375||1637518220|1563954287000|0|0|0|0|||||||| +6026|6958|content://media/external/images/media/6958|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0217.jpg|image/jpeg|1600|1063|0|324911||1637518222|1563954287000|0|0|0|0|||||||| +6027|5884|content://media/external/images/media/5884|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0214.jpg|image/jpeg|1600|1063|0|208268||1637518220|1563954286000|0|0|0|0|||||||| +6028|6214|content://media/external/images/media/6214|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0215.jpg|image/jpeg|1063|1600|0|311131||1637518221|1563954286000|0|0|0|0|||||||| +6029|6212|content://media/external/images/media/6212|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0213.jpg|image/jpeg|1600|1063|0|251801||1637518221|1563954285000|0|0|0|0|||||||| +6030|5983|content://media/external/images/media/5983|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0212.jpg|image/jpeg|1600|1063|0|205356||1637518220|1563954284000|0|0|0|0|||||||| +6031|6210|content://media/external/images/media/6210|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0211.jpg|image/jpeg|1600|1063|0|334545||1637518221|1563954151000|0|0|0|0|||||||| +6032|5881|content://media/external/images/media/5881|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0208.jpg|image/jpeg|1600|1063|0|230285||1637518220|1563954150000|0|0|0|0|||||||| +6033|6207|content://media/external/images/media/6207|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0209.jpg|image/jpeg|1600|1063|0|137324||1637518221|1563954150000|0|0|0|0|||||||| +6034|6211|content://media/external/images/media/6211|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0210.jpg|image/jpeg|1600|1063|0|139202||1637518221|1563954150000|0|0|0|0|||||||| +6035|6091|content://media/external/images/media/6091|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0207.jpg|image/jpeg|1600|1063|0|320700||1637518220|1563954149000|0|0|0|0|||||||| +6036|6208|content://media/external/images/media/6208|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0206.jpg|image/jpeg|1600|1063|0|326640||1637518221|1563954149000|0|0|0|0|||||||| +6037|5878|content://media/external/images/media/5878|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0204.jpg|image/jpeg|1600|1063|0|332809||1637518220|1563954148000|0|0|0|0|||||||| +6038|5977|content://media/external/images/media/5977|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0203.jpg|image/jpeg|1600|1063|0|161952||1637518220|1563954148000|0|0|0|0|||||||| +6039|6090|content://media/external/images/media/6090|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0205.jpg|image/jpeg|1600|1063|0|340395||1637518220|1563954148000|0|0|0|0|||||||| +6040|5877|content://media/external/images/media/5877|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0201.jpg|image/jpeg|1600|1063|0|348422||1637518220|1563954147000|0|0|0|0|||||||| +6041|6088|content://media/external/images/media/6088|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0202.jpg|image/jpeg|1600|1063|0|253069||1637518220|1563954147000|0|0|0|0|||||||| +6042|5974|content://media/external/images/media/5974|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0199.jpg|image/jpeg|1600|1063|0|341616||1637518220|1563954146000|0|0|0|0|||||||| +6043|6087|content://media/external/images/media/6087|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0200.jpg|image/jpeg|1063|1600|0|269712||1637518220|1563954146000|0|0|0|0|||||||| +6044|6086|content://media/external/images/media/6086|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0198.jpg|image/jpeg|1600|1063|0|302119||1637518220|1563954145000|0|0|0|0|||||||| +6045|6205|content://media/external/images/media/6205|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0197.jpg|image/jpeg|1600|1063|0|244917||1637518221|1563954145000|0|0|0|0|||||||| +6046|5876|content://media/external/images/media/5876|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0195.jpg|image/jpeg|1600|1063|0|246673||1637518220|1563954062000|0|0|0|0|||||||| +6047|6083|content://media/external/images/media/6083|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0196.jpg|image/jpeg|1600|1063|0|198057||1637518220|1563954062000|0|0|0|0|||||||| +6048|6084|content://media/external/images/media/6084|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0194.jpg|image/jpeg|1600|1063|0|168873||1637518220|1563954061000|0|0|0|0|||||||| +6049|6200|content://media/external/images/media/6200|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0193.jpg|image/jpeg|1600|1063|0|235881||1637518221|1563954061000|0|0|0|0|||||||| +6050|6203|content://media/external/images/media/6203|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0192.jpg|image/jpeg|1600|1063|0|189029||1637518221|1563954061000|0|0|0|0|||||||| +6051|5969|content://media/external/images/media/5969|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0190.jpg|image/jpeg|1600|1063|0|370182||1637518220|1563954060000|0|0|0|0|||||||| +6052|6082|content://media/external/images/media/6082|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0191.jpg|image/jpeg|1600|1063|0|289646||1637518220|1563954060000|0|0|0|0|||||||| +6053|6199|content://media/external/images/media/6199|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0189.jpg|image/jpeg|1600|1063|0|317542||1637518221|1563954060000|0|0|0|0|||||||| +6054|6079|content://media/external/images/media/6079|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0188.jpg|image/jpeg|1600|1063|0|350255||1637518220|1563954059000|0|0|0|0|||||||| +6055|5968|content://media/external/images/media/5968|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0186.jpg|image/jpeg|1600|1063|0|319737||1637518220|1563954058000|0|0|0|0|||||||| +6056|6078|content://media/external/images/media/6078|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0187.jpg|image/jpeg|1600|1063|0|322690||1637518220|1563954058000|0|0|0|0|||||||| +6057|5967|content://media/external/images/media/5967|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0183.jpg|image/jpeg|1600|1063|0|381248||1637518220|1563954057000|0|0|0|0|||||||| +6058|6075|content://media/external/images/media/6075|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0185.jpg|image/jpeg|1600|1063|0|356149||1637518220|1563954057000|0|0|0|0|||||||| +6059|6194|content://media/external/images/media/6194|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0184.jpg|image/jpeg|1600|1063|0|400882||1637518221|1563954057000|0|0|0|0|||||||| +6060|5874|content://media/external/images/media/5874|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0181.jpg|image/jpeg|1600|1063|0|386250||1637518220|1563954056000|0|0|0|0|||||||| +6061|5965|content://media/external/images/media/5965|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0182.jpg|image/jpeg|1600|1063|0|408812||1637518220|1563954056000|0|0|0|0|||||||| +6062|5962|content://media/external/images/media/5962|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0180.jpg|image/jpeg|1600|1063|0|350573||1637518220|1563954055000|0|0|0|0|||||||| +6063|6076|content://media/external/images/media/6076|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0179.jpg|image/jpeg|1600|1063|0|270701||1637518220|1563954055000|0|0|0|0|||||||| +6064|5961|content://media/external/images/media/5961|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0178.jpg|image/jpeg|1600|1063|0|181596||1637518220|1563954054000|0|0|0|0|||||||| +6065|6070|content://media/external/images/media/6070|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0177.jpg|image/jpeg|1600|1063|0|175129||1637518220|1563954054000|0|0|0|0|||||||| +6066|5958|content://media/external/images/media/5958|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0176.jpg|image/jpeg|1600|1063|0|262013||1637518220|1563953967000|0|0|0|0|||||||| +6067|5959|content://media/external/images/media/5959|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0175.jpg|image/jpeg|1600|1063|0|230741||1637518220|1563953967000|0|0|0|0|||||||| +6068|5871|content://media/external/images/media/5871|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0173.jpg|image/jpeg|1600|1063|0|416356||1637518220|1563953966000|0|0|0|0|||||||| +6069|5957|content://media/external/images/media/5957|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0174.jpg|image/jpeg|1600|1063|0|302619||1637518220|1563953966000|0|0|0|0|||||||| +6070|5869|content://media/external/images/media/5869|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0172.jpg|image/jpeg|1600|1063|0|330576||1637518220|1563953965000|0|0|0|0|||||||| +6071|5955|content://media/external/images/media/5955|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0170.jpg|image/jpeg|1600|1063|0|335538||1637518220|1563953965000|0|0|0|0|||||||| +6072|6191|content://media/external/images/media/6191|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0171.jpg|image/jpeg|1600|1063|0|216855||1637518221|1563953965000|0|0|0|0|||||||| +6073|5954|content://media/external/images/media/5954|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0168.jpg|image/jpeg|1600|1063|0|384841||1637518220|1563953964000|0|0|0|0|||||||| +6074|6073|content://media/external/images/media/6073|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0169.jpg|image/jpeg|1600|1063|0|288235||1637518220|1563953964000|0|0|0|0|||||||| +6075|5819|content://media/external/images/media/5819|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0166.jpg|image/jpeg|1600|1063|0|291252||1637518220|1563953963000|0|0|0|0|||||||| +6076|5868|content://media/external/images/media/5868|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0167.jpg|image/jpeg|1600|1063|0|383092||1637518220|1563953963000|0|0|0|0|||||||| +6077|5817|content://media/external/images/media/5817|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0164.jpg|image/jpeg|1600|1063|0|301846||1637518220|1563953962000|0|0|0|0|||||||| +6078|5818|content://media/external/images/media/5818|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0165.jpg|image/jpeg|1600|1063|0|190164||1637518220|1563953962000|0|0|0|0|||||||| +6079|6147|content://media/external/images/media/6147|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0163.jpg|image/jpeg|1600|1063|0|301545||1637518220|1563953962000|0|0|0|0|||||||| +6080|5916|content://media/external/images/media/5916|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0162.jpg|image/jpeg|1600|1063|0|343611||1637518220|1563953961000|0|0|0|0|||||||| +6081|6146|content://media/external/images/media/6146|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0161.jpg|image/jpeg|1600|1063|0|250259||1637518220|1563953961000|0|0|0|0|||||||| +6082|5815|content://media/external/images/media/5815|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0159.jpg|image/jpeg|1600|1063|0|245710||1637518220|1563953960000|0|0|0|0|||||||| +6083|5816|content://media/external/images/media/5816|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0160.jpg|image/jpeg|1600|1063|0|198792||1637518220|1563953960000|0|0|0|0|||||||| +6084|6024|content://media/external/images/media/6024|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0158.jpg|image/jpeg|1600|1063|0|407420||1637518220|1563953960000|0|0|0|0|||||||| +6085|5814|content://media/external/images/media/5814|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0157.jpg|image/jpeg|1600|1063|0|302107||1637518220|1563953959000|0|0|0|0|||||||| +6086|6145|content://media/external/images/media/6145|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0156.jpg|image/jpeg|1600|1063|0|257810||1637518220|1563953874000|0|0|0|0|||||||| +6087|6143|content://media/external/images/media/6143|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0154.jpg|image/jpeg|1600|1063|0|257141||1637518220|1563953873000|0|0|0|0|||||||| +6088|6144|content://media/external/images/media/6144|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0155.jpg|image/jpeg|1600|1063|0|201570||1637518220|1563953873000|0|0|0|0|||||||| +6089|5813|content://media/external/images/media/5813|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0153.jpg|image/jpeg|1600|1063|0|267168||1637518220|1563953872000|0|0|0|0|||||||| +6090|6023|content://media/external/images/media/6023|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0152.jpg|image/jpeg|1600|1063|0|363801||1637518220|1563953872000|0|0|0|0|||||||| +6091|6142|content://media/external/images/media/6142|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0151.jpg|image/jpeg|1600|1063|0|251854||1637518220|1563953872000|0|0|0|0|||||||| +6092|5812|content://media/external/images/media/5812|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0150.jpg|image/jpeg|1600|1063|0|237846||1637518220|1563953871000|0|0|0|0|||||||| +6093|5915|content://media/external/images/media/5915|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0149.jpg|image/jpeg|1600|1063|0|259915||1637518220|1563953871000|0|0|0|0|||||||| +6094|6141|content://media/external/images/media/6141|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0148.jpg|image/jpeg|1600|1063|0|346624||1637518220|1563953871000|0|0|0|0|||||||| +6095|5811|content://media/external/images/media/5811|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0147.jpg|image/jpeg|1600|1063|0|310737||1637518220|1563953870000|0|0|0|0|||||||| +6096|6022|content://media/external/images/media/6022|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0146.jpg|image/jpeg|1600|1063|0|321465||1637518220|1563953870000|0|0|0|0|||||||| +6097|5809|content://media/external/images/media/5809|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0144.jpg|image/jpeg|1600|1063|0|214554||1637518220|1563953869000|0|0|0|0|||||||| +6098|5810|content://media/external/images/media/5810|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0145.jpg|image/jpeg|1600|1063|0|119315||1637518220|1563953869000|0|0|0|0|||||||| +6099|6021|content://media/external/images/media/6021|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0143.jpg|image/jpeg|1600|1063|0|270460||1637518220|1563953869000|0|0|0|0|||||||| +6100|5914|content://media/external/images/media/5914|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0142.jpg|image/jpeg|1600|1063|0|416011||1637518220|1563953868000|0|0|0|0|||||||| +6101|6020|content://media/external/images/media/6020|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0141.jpg|image/jpeg|1600|1063|0|487686||1637518220|1563953868000|0|0|0|0|||||||| +6102|5913|content://media/external/images/media/5913|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0139.jpg|image/jpeg|1600|1063|0|270008||1637518220|1563953867000|0|0|0|0|||||||| +6103|6140|content://media/external/images/media/6140|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0140.jpg|image/jpeg|1600|1063|0|378068||1637518220|1563953867000|0|0|0|0|||||||| +6104|5912|content://media/external/images/media/5912|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0137.jpg|image/jpeg|1600|1063|0|214802||1637518220|1563953866000|0|0|0|0|||||||| +6105|6019|content://media/external/images/media/6019|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0138.jpg|image/jpeg|1600|1063|0|191332||1637518220|1563953866000|0|0|0|0|||||||| +6106|6139|content://media/external/images/media/6139|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0136.jpg|image/jpeg|1600|1063|0|267067||1637518220|1563953745000|0|0|0|0|||||||| +6107|5808|content://media/external/images/media/5808|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0135.jpg|image/jpeg|1600|1063|0|316746||1637518220|1563953744000|0|0|0|0|||||||| +6108|6018|content://media/external/images/media/6018|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0134.jpg|image/jpeg|1600|1063|0|235178||1637518220|1563953744000|0|0|0|0|||||||| +6109|5807|content://media/external/images/media/5807|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0131.jpg|image/jpeg|1600|1063|0|256005||1637518220|1563953743000|0|0|0|0|||||||| +6110|5911|content://media/external/images/media/5911|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0132.jpg|image/jpeg|1600|1063|0|224397||1637518220|1563953743000|0|0|0|0|||||||| +6111|6017|content://media/external/images/media/6017|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0133.jpg|image/jpeg|1600|1063|0|255532||1637518220|1563953743000|0|0|0|0|||||||| +6112|6016|content://media/external/images/media/6016|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0129.jpg|image/jpeg|1600|1063|0|263159||1637518220|1563953742000|0|0|0|0|||||||| +6113|6138|content://media/external/images/media/6138|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0130.jpg|image/jpeg|1600|1063|0|285928||1637518220|1563953742000|0|0|0|0|||||||| +6114|5806|content://media/external/images/media/5806|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0127.jpg|image/jpeg|1600|1063|0|396186||1637518220|1563953741000|0|0|0|0|||||||| +6115|6136|content://media/external/images/media/6136|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0126.jpg|image/jpeg|1600|1063|0|289420||1637518220|1563953741000|0|0|0|0|||||||| +6116|6137|content://media/external/images/media/6137|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0128.jpg|image/jpeg|1600|1063|0|248216||1637518220|1563953741000|0|0|0|0|||||||| +6117|5910|content://media/external/images/media/5910|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0124.jpg|image/jpeg|1600|1063|0|359877||1637518220|1563953740000|0|0|0|0|||||||| +6118|6015|content://media/external/images/media/6015|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0125.jpg|image/jpeg|1600|1063|0|369672||1637518220|1563953740000|0|0|0|0|||||||| +6119|6014|content://media/external/images/media/6014|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0122.jpg|image/jpeg|1600|1063|0|311080||1637518220|1563953739000|0|0|0|0|||||||| +6120|6134|content://media/external/images/media/6134|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0121.jpg|image/jpeg|1600|1063|0|276346||1637518220|1563953739000|0|0|0|0|||||||| +6121|6135|content://media/external/images/media/6135|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0123.jpg|image/jpeg|1600|1063|0|279053||1637518220|1563953739000|0|0|0|0|||||||| +6122|6132|content://media/external/images/media/6132|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0119.jpg|image/jpeg|1600|1063|0|290290||1637518220|1563953738000|0|0|0|0|||||||| +6123|6133|content://media/external/images/media/6133|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0120.jpg|image/jpeg|1600|1063|0|335775||1637518220|1563953738000|0|0|0|0|||||||| +6124|5909|content://media/external/images/media/5909|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0117.jpg|image/jpeg|1600|1063|0|277759||1637518220|1563953737000|0|0|0|0|||||||| +6125|6013|content://media/external/images/media/6013|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0118.jpg|image/jpeg|1600|1063|0|380762||1637518220|1563953737000|0|0|0|0|||||||| +6126|6131|content://media/external/images/media/6131|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0116.jpg|image/jpeg|1600|1063|0|167279||1637518220|1563953555000|0|0|0|0|||||||| +6127|6012|content://media/external/images/media/6012|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0115.jpg|image/jpeg|1600|1063|0|148326||1637518220|1563953554000|0|0|0|0|||||||| +6128|6130|content://media/external/images/media/6130|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0114.jpg|image/jpeg|1600|1063|0|240070||1637518220|1563953554000|0|0|0|0|||||||| +6129|6127|content://media/external/images/media/6127|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0111.jpg|image/jpeg|1600|1063|0|339792||1637518220|1563953553000|0|0|0|0|||||||| +6130|6128|content://media/external/images/media/6128|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0112.jpg|image/jpeg|1600|1063|0|309169||1637518220|1563953553000|0|0|0|0|||||||| +6131|6129|content://media/external/images/media/6129|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0113.jpg|image/jpeg|1600|1063|0|293839||1637518220|1563953553000|0|0|0|0|||||||| +6132|5805|content://media/external/images/media/5805|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0109.jpg|image/jpeg|1600|1063|0|278356||1637518220|1563953552000|0|0|0|0|||||||| +6133|5908|content://media/external/images/media/5908|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0110.jpg|image/jpeg|1600|1063|0|332355||1637518220|1563953552000|0|0|0|0|||||||| +6134|5804|content://media/external/images/media/5804|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0108.jpg|image/jpeg|1600|1063|0|314581||1637518220|1563953551000|0|0|0|0|||||||| +6135|6011|content://media/external/images/media/6011|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0107.jpg|image/jpeg|1600|1063|0|342990||1637518220|1563953551000|0|0|0|0|||||||| +6136|5803|content://media/external/images/media/5803|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0106.jpg|image/jpeg|1600|1063|0|362629||1637518220|1563953550000|0|0|0|0|||||||| +6137|5907|content://media/external/images/media/5907|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0105.jpg|image/jpeg|1600|1063|0|280186||1637518220|1563953550000|0|0|0|0|||||||| +6138|6010|content://media/external/images/media/6010|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0104.jpg|image/jpeg|1600|1063|0|331322||1637518220|1563953549000|0|0|0|0|||||||| +6139|6126|content://media/external/images/media/6126|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0103.jpg|image/jpeg|1600|1063|0|404496||1637518220|1563953549000|0|0|0|0|||||||| +6140|6125|content://media/external/images/media/6125|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0102.jpg|image/jpeg|1063|1600|0|334155||1637518220|1563953548000|0|0|0|0|||||||| +6141|6009|content://media/external/images/media/6009|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0101.jpg|image/jpeg|1600|1063|0|315770||1637518220|1563953472000|0|0|0|0|||||||| +6142|5802|content://media/external/images/media/5802|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0099.jpg|image/jpeg|1600|1063|0|266771||1637518220|1563953471000|0|0|0|0|||||||| +6143|5906|content://media/external/images/media/5906|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0100.jpg|image/jpeg|1600|1063|0|234817||1637518220|1563953471000|0|0|0|0|||||||| +6144|5904|content://media/external/images/media/5904|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0097.jpg|image/jpeg|1600|1063|0|301350||1637518220|1563953470000|0|0|0|0|||||||| +6145|5905|content://media/external/images/media/5905|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0098.jpg|image/jpeg|1600|1063|0|287294||1637518220|1563953470000|0|0|0|0|||||||| +6146|6008|content://media/external/images/media/6008|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0096.jpg|image/jpeg|1600|1063|0|365229||1637518220|1563953469000|0|0|0|0|||||||| +6147|6124|content://media/external/images/media/6124|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0095.jpg|image/jpeg|1600|1063|0|310162||1637518220|1563953469000|0|0|0|0|||||||| +6148|5902|content://media/external/images/media/5902|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0093.jpg|image/jpeg|1600|1063|0|400504||1637518220|1563953467000|0|0|0|0|||||||| +6149|5903|content://media/external/images/media/5903|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0094.jpg|image/jpeg|1600|1063|0|298495||1637518220|1563953467000|0|0|0|0|||||||| +6150|5801|content://media/external/images/media/5801|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0091.jpg|image/jpeg|1600|1063|0|345338||1637518220|1563953466000|0|0|0|0|||||||| +6151|6007|content://media/external/images/media/6007|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0092.jpg|image/jpeg|1600|1063|0|329872||1637518220|1563953466000|0|0|0|0|||||||| +6152|5800|content://media/external/images/media/5800|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0090.jpg|image/jpeg|1600|1063|0|277614||1637518220|1563953465000|0|0|0|0|||||||| +6153|6006|content://media/external/images/media/6006|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0088.jpg|image/jpeg|1600|1063|0|244696||1637518220|1563953465000|0|0|0|0|||||||| +6154|6123|content://media/external/images/media/6123|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0089.jpg|image/jpeg|1600|1063|0|368367||1637518220|1563953465000|0|0|0|0|||||||| +6155|5798|content://media/external/images/media/5798|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0086.jpg|image/jpeg|1600|1063|0|361205||1637518220|1563953464000|0|0|0|0|||||||| +6156|5799|content://media/external/images/media/5799|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0087.jpg|image/jpeg|1600|1063|0|328936||1637518220|1563953464000|0|0|0|0|||||||| +6157|5796|content://media/external/images/media/5796|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0084.jpg|image/jpeg|1600|1063|0|427672||1637518220|1563953463000|0|0|0|0|||||||| +6158|5797|content://media/external/images/media/5797|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0085.jpg|image/jpeg|1600|1063|0|286046||1637518220|1563953463000|0|0|0|0|||||||| +6159|6005|content://media/external/images/media/6005|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0083.jpg|image/jpeg|1600|1063|0|270140||1637518220|1563953462000|0|0|0|0|||||||| +6160|5901|content://media/external/images/media/5901|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0082.jpg|image/jpeg|1600|1063|0|265287||1637518220|1563953461000|0|0|0|0|||||||| +6161|6122|content://media/external/images/media/6122|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0081.jpg|image/jpeg|1600|1063|0|309547||1637518220|1563953368000|0|0|0|0|||||||| +6162|5795|content://media/external/images/media/5795|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0080.jpg|image/jpeg|1600|1063|0|376810||1637518220|1563953367000|0|0|0|0|||||||| +6163|6004|content://media/external/images/media/6004|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0078.jpg|image/jpeg|1600|1063|0|408991||1637518220|1563953367000|0|0|0|0|||||||| +6164|6121|content://media/external/images/media/6121|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0079.jpg|image/jpeg|1600|1063|0|368338||1637518220|1563953367000|0|0|0|0|||||||| +6165|5794|content://media/external/images/media/5794|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0076.jpg|image/jpeg|1600|1063|0|342310||1637518220|1563953366000|0|0|0|0|||||||| +6166|5900|content://media/external/images/media/5900|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0077.jpg|image/jpeg|1600|1063|0|342425||1637518220|1563953366000|0|0|0|0|||||||| +6167|6120|content://media/external/images/media/6120|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0075.jpg|image/jpeg|1600|1063|0|417138||1637518220|1563953366000|0|0|0|0|||||||| +6168|6118|content://media/external/images/media/6118|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0073.jpg|image/jpeg|1600|1063|0|393123||1637518220|1563953365000|0|0|0|0|||||||| +6169|6119|content://media/external/images/media/6119|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0074.jpg|image/jpeg|1600|1063|0|365989||1637518220|1563953365000|0|0|0|0|||||||| +6170|5793|content://media/external/images/media/5793|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0072.jpg|image/jpeg|1600|1063|0|413497||1637518220|1563953364000|0|0|0|0|||||||| +6171|5684|content://media/external/images/media/5684|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0069.jpg|image/jpeg|1600|1063|0|379029||1637518219|1563953363000|0|0|0|0|||||||| +6172|5685|content://media/external/images/media/5685|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0070.jpg|image/jpeg|1600|1063|0|385707||1637518219|1563953363000|0|0|0|0|||||||| +6173|5792|content://media/external/images/media/5792|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0071.jpg|image/jpeg|1600|1063|0|324080||1637518220|1563953363000|0|0|0|0|||||||| +6174|5899|content://media/external/images/media/5899|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0067.jpg|image/jpeg|1600|1063|0|291492||1637518220|1563953362000|0|0|0|0|||||||| +6175|6117|content://media/external/images/media/6117|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0068.jpg|image/jpeg|1600|1063|0|441415||1637518220|1563953362000|0|0|0|0|||||||| +6176|5683|content://media/external/images/media/5683|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0065.jpg|image/jpeg|1600|1063|0|432457||1637518219|1563953361000|0|0|0|0|||||||| +6177|6116|content://media/external/images/media/6116|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0066.jpg|image/jpeg|1600|1063|0|410758||1637518220|1563953361000|0|0|0|0|||||||| +6178|5682|content://media/external/images/media/5682|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0064.jpg|image/jpeg|1600|1063|0|299755||1637518219|1563953360000|0|0|0|0|||||||| +6179|6115|content://media/external/images/media/6115|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0063.jpg|image/jpeg|1600|1063|0|327956||1637518220|1563953360000|0|0|0|0|||||||| +6180|5898|content://media/external/images/media/5898|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0062.jpg|image/jpeg|1600|1063|0|293261||1637518220|1563953358000|0|0|0|0|||||||| +6181|5681|content://media/external/images/media/5681|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0060.jpg|image/jpeg|1600|1063|0|179197||1637518219|1563953253000|0|0|0|0|||||||| +6182|6114|content://media/external/images/media/6114|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0061.jpg|image/jpeg|1600|1063|0|323370||1637518220|1563953253000|0|0|0|0|||||||| +6183|5680|content://media/external/images/media/5680|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0059.jpg|image/jpeg|1600|1063|0|344578||1637518219|1563953252000|0|0|0|0|||||||| +6184|6113|content://media/external/images/media/6113|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0058.jpg|image/jpeg|1600|1063|0|325288||1637518220|1563953252000|0|0|0|0|||||||| +6185|5678|content://media/external/images/media/5678|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0055.jpg|image/jpeg|1600|1063|0|278777||1637518219|1563953251000|0|0|0|0|||||||| +6186|5679|content://media/external/images/media/5679|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0057.jpg|image/jpeg|1600|1063|0|323309||1637518219|1563953251000|0|0|0|0|||||||| +6187|6112|content://media/external/images/media/6112|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0056.jpg|image/jpeg|1600|1063|0|366833||1637518220|1563953251000|0|0|0|0|||||||| +6188|6110|content://media/external/images/media/6110|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0053.jpg|image/jpeg|1600|1063|0|245335||1637518220|1563953250000|0|0|0|0|||||||| +6189|6111|content://media/external/images/media/6111|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0054.jpg|image/jpeg|1600|1063|0|225284||1637518220|1563953250000|0|0|0|0|||||||| +6190|5677|content://media/external/images/media/5677|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0051.jpg|image/jpeg|1600|1063|0|293864||1637518219|1563953249000|0|0|0|0|||||||| +6191|5790|content://media/external/images/media/5790|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0050.jpg|image/jpeg|1600|1063|0|356533||1637518220|1563953249000|0|0|0|0|||||||| +6192|5791|content://media/external/images/media/5791|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0052.jpg|image/jpeg|1600|1063|0|250223||1637518220|1563953249000|0|0|0|0|||||||| +6193|5676|content://media/external/images/media/5676|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0048.jpg|image/jpeg|1600|1063|0|323339||1637518219|1563953248000|0|0|0|0|||||||| +6194|5789|content://media/external/images/media/5789|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0049.jpg|image/jpeg|1600|1063|0|235369||1637518220|1563953248000|0|0|0|0|||||||| +6195|5675|content://media/external/images/media/5675|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0047.jpg|image/jpeg|1600|1063|0|259400||1637518219|1563953247000|0|0|0|0|||||||| +6196|5673|content://media/external/images/media/5673|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0045.jpg|image/jpeg|1600|1063|0|177906||1637518219|1563953179000|0|0|0|0|||||||| +6197|5674|content://media/external/images/media/5674|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0046.jpg|image/jpeg|1600|1063|0|297230||1637518219|1563953179000|0|0|0|0|||||||| +6198|5670|content://media/external/images/media/5670|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0042.jpg|image/jpeg|1600|1063|0|310986||1637518219|1563953178000|0|0|0|0|||||||| +6199|5671|content://media/external/images/media/5671|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0043.jpg|image/jpeg|1600|1063|0|359323||1637518219|1563953178000|0|0|0|0|||||||| +6200|5672|content://media/external/images/media/5672|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0044.jpg|image/jpeg|1600|1063|0|217665||1637518219|1563953178000|0|0|0|0|||||||| +6201|5668|content://media/external/images/media/5668|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0040.jpg|image/jpeg|1600|1063|0|294968||1637518219|1563953177000|0|0|0|0|||||||| +6202|5669|content://media/external/images/media/5669|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0041.jpg|image/jpeg|1600|1063|0|287901||1637518219|1563953177000|0|0|0|0|||||||| +6203|5787|content://media/external/images/media/5787|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0038.jpg|image/jpeg|1600|1063|0|314493||1637518220|1563953176000|0|0|0|0|||||||| +6204|5788|content://media/external/images/media/5788|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0039.jpg|image/jpeg|1600|1063|0|323038||1637518220|1563953176000|0|0|0|0|||||||| +6205|5786|content://media/external/images/media/5786|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0037.jpg|image/jpeg|1600|1063|0|557188||1637518220|1563953175000|0|0|0|0|||||||| +6206|5784|content://media/external/images/media/5784|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0035.jpg|image/jpeg|1600|1063|0|187149||1637518220|1563953174000|0|0|0|0|||||||| +6207|5785|content://media/external/images/media/5785|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0036.jpg|image/jpeg|1600|1063|0|786201||1637518220|1563953174000|0|0|0|0|||||||| +6208|5667|content://media/external/images/media/5667|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0034.jpg|image/jpeg|1600|1063|0|468278||1637518219|1563953173000|0|0|0|0|||||||| +6209|5666|content://media/external/images/media/5666|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0033.jpg|image/jpeg|1600|1063|0|308362||1637518219|1563953172000|0|0|0|0|||||||| +6210|5783|content://media/external/images/media/5783|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0032.jpg|image/jpeg|1600|1063|0|366036||1637518220|1563953171000|0|0|0|0|||||||| +6211|5665|content://media/external/images/media/5665|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0031.jpg|image/jpeg|1600|1063|0|284047||1637518219|1563953105000|0|0|0|0|||||||| +6212|5781|content://media/external/images/media/5781|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0029.jpg|image/jpeg|1600|1063|0|329727||1637518220|1563953104000|0|0|0|0|||||||| +6213|5782|content://media/external/images/media/5782|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0030.jpg|image/jpeg|1600|1063|0|336000||1637518220|1563953104000|0|0|0|0|||||||| +6214|5664|content://media/external/images/media/5664|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0028.jpg|image/jpeg|1600|1063|0|472465||1637518219|1563953103000|0|0|0|0|||||||| +6215|5779|content://media/external/images/media/5779|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0026.jpg|image/jpeg|1600|1063|0|250267||1637518220|1563953103000|0|0|0|0|||||||| +6216|5780|content://media/external/images/media/5780|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0027.jpg|image/jpeg|1600|1063|0|614619||1637518220|1563953103000|0|0|0|0|||||||| +6217|5663|content://media/external/images/media/5663|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0025.jpg|image/jpeg|1600|1063|0|314845||1637518219|1563953102000|0|0|0|0|||||||| +6218|5662|content://media/external/images/media/5662|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0024.jpg|image/jpeg|1600|1063|0|339086||1637518219|1563953101000|0|0|0|0|||||||| +6219|5778|content://media/external/images/media/5778|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0023.jpg|image/jpeg|1600|1063|0|441251||1637518220|1563953101000|0|0|0|0|||||||| +6220|5777|content://media/external/images/media/5777|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0022.jpg|image/jpeg|1600|1063|0|286280||1637518220|1563953100000|0|0|0|0|||||||| +6221|5774|content://media/external/images/media/5774|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0019.jpg|image/jpeg|1600|1063|0|316180||1637518220|1563953027000|0|0|0|0|||||||| +6222|5775|content://media/external/images/media/5775|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0020.jpg|image/jpeg|1600|1063|0|348093||1637518220|1563953027000|0|0|0|0|||||||| +6223|5776|content://media/external/images/media/5776|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0021.jpg|image/jpeg|1600|1063|0|298799||1637518220|1563953027000|0|0|0|0|||||||| +6224|5772|content://media/external/images/media/5772|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0017.jpg|image/jpeg|1600|1063|0|395576||1637518220|1563953026000|0|0|0|0|||||||| +6225|5773|content://media/external/images/media/5773|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0018.jpg|image/jpeg|1600|1063|0|329417||1637518220|1563953026000|0|0|0|0|||||||| +6226|5659|content://media/external/images/media/5659|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0014.jpg|image/jpeg|1600|1063|0|252601||1637518219|1563953025000|0|0|0|0|||||||| +6227|5660|content://media/external/images/media/5660|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0015.jpg|image/jpeg|1600|1063|0|495224||1637518219|1563953025000|0|0|0|0|||||||| +6228|5661|content://media/external/images/media/5661|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0016.jpg|image/jpeg|1600|1063|0|490006||1637518219|1563953025000|0|0|0|0|||||||| +6229|5658|content://media/external/images/media/5658|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0012.jpg|image/jpeg|1600|1063|0|299749||1637518219|1563953024000|0|0|0|0|||||||| +6230|5771|content://media/external/images/media/5771|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0013.jpg|image/jpeg|1600|1063|0|263546||1637518220|1563953024000|0|0|0|0|||||||| +6231|5657|content://media/external/images/media/5657|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0010.jpg|image/jpeg|1600|1063|0|316478||1637518219|1563953023000|0|0|0|0|||||||| +6232|5770|content://media/external/images/media/5770|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0011.jpg|image/jpeg|1600|1063|0|309899||1637518220|1563953023000|0|0|0|0|||||||| +6233|5656|content://media/external/images/media/5656|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0009.jpg|image/jpeg|1600|1063|0|465241||1637518219|1563953022000|0|0|0|0|||||||| +6234|5655|content://media/external/images/media/5655|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0008.jpg|image/jpeg|480|675|0|47007||1637518219|1563922789000|0|0|0|0|||||||| +6235|5653|content://media/external/images/media/5653|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0006.jpg|image/jpeg|970|885|0|83217||1637518219|1563922387000|0|0|0|0|||||||| +6236|5654|content://media/external/images/media/5654|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0007.jpg|image/jpeg|898|1600|0|141194||1637518219|1563922387000|0|0|0|0|||||||| +6237|5768|content://media/external/images/media/5768|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0003.jpg|image/jpeg|1600|898|0|175979||1637518220|1563922381000|0|0|0|0|||||||| +6238|5769|content://media/external/images/media/5769|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0004.jpg|image/jpeg|898|1600|0|150293||1637518220|1563922381000|0|0|0|0|||||||| +6239|5652|content://media/external/images/media/5652|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0001.jpg|image/jpeg|1024|768|0|97047||1637518219|1563922380000|0|0|0|0|||||||| +6240|5767|content://media/external/images/media/5767|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0002.jpg|image/jpeg|898|1600|0|159870||1637518220|1563922380000|0|0|0|0|||||||| +6241|5766|content://media/external/images/media/5766|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190724-WA0000.jpg|image/jpeg|1024|842|0|124687||1637518220|1563922379000|0|0|0|0|||||||| +6242|3885|content://media/external/images/media/3885|/storage/emulated/0/DCIM/Camera/IMG_20190723_220638.jpg|image/jpeg|4000|3000|0|5601862||1637503732|1563912398000|1563912397980|0|0|0|||||||| +6243|3912|content://media/external/images/media/3912|/storage/emulated/0/DCIM/Camera/IMG_20190723_215950.jpg|image/jpeg|5184|3880|0|7165714||1637503834|1563911990000|1563911990016|0|0|0|||||||| +6244|4943|content://media/external/images/media/4943|/storage/emulated/0/DCIM/Camera/IMG_20190723_210546.jpg|image/jpeg|4160|3120|0|4728126||1637506015|1563908746000|1563908746420|0|0|0|||||||| +6245|3135|content://media/external/images/media/3135|/storage/emulated/0/DCIM/Camera/IMG_20190723_210539.jpg|image/jpeg|4000|3000|0|4307840||1637502130|1563908740000|1563908739932|0|0|0|||||||| +6246|4788|content://media/external/images/media/4788|/storage/emulated/0/DCIM/Camera/IMG_20190723_210510.jpg|image/jpeg|4000|3000|0|4340148||1637505663|1563908710000|1563908710365|0|0|0|||||||| +6247|3615|content://media/external/images/media/3615|/storage/emulated/0/DCIM/Camera/IMG_20190723_204604.jpg|image/jpeg|4000|3000|90|3913122||1637503271|1563907564000|1563907564516|0|0|0|||||||| +6248|3412|content://media/external/images/media/3412|/storage/emulated/0/DCIM/Camera/IMG_20190723_204143.jpg|image/jpeg|4000|3000|90|4530215||1637502682|1563907303000|1563907303427|0|0|0|||||||| +6249|2776|content://media/external/images/media/2776|/storage/emulated/0/DCIM/Camera/IMG_20190723_204137.jpg|image/jpeg|4000|3000|90|7095255||1637501282|1563907297000|1563907297447|0|0|0|||||||| +6250|4518|content://media/external/images/media/4518|/storage/emulated/0/DCIM/Camera/IMG_20190723_203050.jpg|image/jpeg|4000|3000|0|5128641||1637505165|1563906651000|1563906650262|0|0|0|||||||| +6251|5765|content://media/external/images/media/5765|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0022.jpg|image/jpeg|899|1599|0|180160||1637518220|1563903925000|0|0|0|0|||||||| +6252|4625|content://media/external/images/media/4625|/storage/emulated/0/DCIM/Camera/IMG_20190723_192248.jpg|image/jpeg|4000|3000|90|11475566||1637505390|1563902569000|1563902568866|0|0|0|||||||| +6253|4196|content://media/external/images/media/4196|/storage/emulated/0/DCIM/Camera/IMG_20190723_192244.jpg|image/jpeg|4000|3000|90|10569341||1637504640|1563902564000|1563902564257|0|0|0|||||||| +6254|4178|content://media/external/images/media/4178|/storage/emulated/0/DCIM/Camera/IMG_20190723_192225.jpg|image/jpeg|4000|3000|90|7081744||1637504558|1563902545000|1563902545379|0|0|0|||||||| +6255|3161|content://media/external/images/media/3161|/storage/emulated/0/DCIM/Camera/IMG_20190723_192018.jpg|image/jpeg|4000|3000|0|7458860||1637502143|1563902418000|1563902418122|0|0|0|||||||| +6256|3911|content://media/external/images/media/3911|/storage/emulated/0/DCIM/Camera/IMG_20190723_192013.jpg|image/jpeg|4160|3120|0|6979376||1637503834|1563902413000|1563902413139|0|0|0|||||||| +6257|4446|content://media/external/images/media/4446|/storage/emulated/0/DCIM/Camera/IMG_20190723_191855.jpg|image/jpeg|4160|3120|0|6546604||1637505068|1563902335000|1563902335316|0|0|0|||||||| +6258|4091|content://media/external/images/media/4091|/storage/emulated/0/DCIM/Camera/IMG_20190723_191849.jpg|image/jpeg|4160|3120|0|5329587||1637504399|1563902330000|1563902329779|0|0|0|||||||| +6259|4255|content://media/external/images/media/4255|/storage/emulated/0/DCIM/Camera/IMG_20190723_191839.jpg|image/jpeg|4000|3000|0|6754058||1637504756|1563902319000|1563902319764|0|0|0|||||||| +6260|5764|content://media/external/images/media/5764|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0021.jpg|image/jpeg|1600|1200|0|210237||1637518220|1563900323000|0|0|0|0|||||||| +6261|5651|content://media/external/images/media/5651|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0020.jpg|image/jpeg|898|1600|0|155790||1637518219|1563895017000|0|0|0|0|||||||| +6262|5650|content://media/external/images/media/5650|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0019.jpg|image/jpeg|1200|1600|0|238814||1637518219|1563893763000|0|0|0|0|||||||| +6263|5649|content://media/external/images/media/5649|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0017.jpg|image/jpeg|1440|1024|0|194557||1637518219|1563889388000|0|0|0|0|||||||| +6264|5763|content://media/external/images/media/5763|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0016.jpg|image/jpeg|900|1600|0|199431||1637518220|1563888724000|0|0|0|0|||||||| +6265|5762|content://media/external/images/media/5762|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0015.jpg|image/jpeg|900|1600|0|232174||1637518220|1563888703000|0|0|0|0|||||||| +6266|5761|content://media/external/images/media/5761|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0014.jpg|image/jpeg|900|1600|0|141537||1637518220|1563888515000|0|0|0|0|||||||| +6267|5760|content://media/external/images/media/5760|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0013.jpg|image/jpeg|780|1040|0|75775||1637518220|1563888257000|0|0|0|0|||||||| +6268|5759|content://media/external/images/media/5759|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0012.jpg|image/jpeg|822|1074|0|418174||1637518220|1563880239000|0|0|0|0|||||||| +6269|5648|content://media/external/images/media/5648|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0011.jpg|image/jpeg|1600|900|0|255262||1637518219|1563876913000|0|0|0|0|||||||| +6270|5647|content://media/external/images/media/5647|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0010.jpg|image/jpeg|1200|1599|0|93290||1637518219|1563876520000|0|0|0|0|||||||| +6271|5646|content://media/external/images/media/5646|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0009.jpg|image/jpeg|1600|901|0|150029||1637518219|1563873348000|0|0|0|0|||||||| +6272|5758|content://media/external/images/media/5758|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0008.jpg|image/jpeg|899|1600|0|128298||1637518220|1563873216000|0|0|0|0|||||||| +6273|5645|content://media/external/images/media/5645|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0005.jpg|image/jpeg|1600|1200|0|125640||1637518219|1563871493000|0|0|0|0|||||||| +6274|5757|content://media/external/images/media/5757|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0004.jpg|image/jpeg|1600|1200|0|147492||1637518220|1563871493000|0|0|0|0|||||||| +6275|5755|content://media/external/images/media/5755|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0002.jpg|image/jpeg|1200|1600|0|198012||1637518220|1563871492000|0|0|0|0|||||||| +6276|5756|content://media/external/images/media/5756|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0003.jpg|image/jpeg|1200|1600|0|247091||1637518220|1563871492000|0|0|0|0|||||||| +6277|5754|content://media/external/images/media/5754|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0001.jpg|image/jpeg|1200|1600|0|189357||1637518220|1563871491000|0|0|0|0|||||||| +6278|5644|content://media/external/images/media/5644|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190723-WA0000.jpg|image/jpeg|1200|1599|0|311823||1637518219|1563871395000|0|0|0|0|||||||| +6279|5643|content://media/external/images/media/5643|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0020.jpg|image/jpeg|1599|1200|0|128169||1637518219|1563824664000|0|0|0|0|||||||| +6280|5753|content://media/external/images/media/5753|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0019.jpg|image/jpeg|898|1600|0|146837||1637518220|1563821390000|0|0|0|0|||||||| +6281|5642|content://media/external/images/media/5642|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0018.jpg|image/jpeg|1600|898|0|82351||1637518219|1563821161000|0|0|0|0|||||||| +6282|5752|content://media/external/images/media/5752|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0017.jpg|image/jpeg|750|1334|0|78879||1637518220|1563820975000|0|0|0|0|||||||| +6283|5641|content://media/external/images/media/5641|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0016.jpg|image/jpeg|1200|1599|0|188861||1637518219|1563820958000|0|0|0|0|||||||| +6284|5751|content://media/external/images/media/5751|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0014.jpg|image/jpeg|720|1280|0|47891||1637518220|1563810856000|0|0|0|0|||||||| +6285|5750|content://media/external/images/media/5750|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0013.jpg|image/jpeg|780|1040|0|67525||1637518220|1563809772000|0|0|0|0|||||||| +6286|5640|content://media/external/images/media/5640|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0012.jpg|image/jpeg|1200|1599|0|396117||1637518219|1563801465000|0|0|0|0|||||||| +6287|5749|content://media/external/images/media/5749|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0011.jpg|image/jpeg|720|809|0|49181||1637518220|1563796668000|0|0|0|0|||||||| +6288|5639|content://media/external/images/media/5639|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0010.jpg|image/jpeg|1599|1200|0|220904||1637518219|1563796474000|0|0|0|0|||||||| +6289|5748|content://media/external/images/media/5748|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0009.jpg|image/jpeg|539|396|0|39058||1637518220|1563796011000|0|0|0|0|||||||| +6290|5638|content://media/external/images/media/5638|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0006.jpg|image/jpeg|1599|1200|0|358962||1637518219|1563795096000|0|0|0|0|||||||| +6291|5747|content://media/external/images/media/5747|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0007.jpg|image/jpeg|1599|1200|0|449178||1637518220|1563795096000|0|0|0|0|||||||| +6292|5637|content://media/external/images/media/5637|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0005.jpg|image/jpeg|750|455|0|41831||1637518219|1563795094000|0|0|0|0|||||||| +6293|5746|content://media/external/images/media/5746|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0004.jpg|image/jpeg|1600|898|0|192657||1637518220|1563785360000|0|0|0|0|||||||| +6294|5636|content://media/external/images/media/5636|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0001.jpg|image/jpeg|780|1040|0|83523||1637518219|1563781625000|0|0|0|0|||||||| +6295|5635|content://media/external/images/media/5635|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190722-WA0000.jpg|image/jpeg|780|1040|0|69992||1637518219|1563780697000|0|0|0|0|||||||| +6296|5634|content://media/external/images/media/5634|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0034.jpg|image/jpeg|900|1600|0|132014||1637518219|1563739424000|0|0|0|0|||||||| +6297|5633|content://media/external/images/media/5633|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0033.jpg|image/jpeg|1040|780|0|34773||1637518219|1563737838000|0|0|0|0|||||||| +6298|5632|content://media/external/images/media/5632|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0032.jpg|image/jpeg|500|279|0|28105||1637518219|1563736832000|0|0|0|0|||||||| +6299|5631|content://media/external/images/media/5631|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0031.jpg|image/jpeg|1040|780|0|34773||1637518219|1563736317000|0|0|0|0|||||||| +6300|5745|content://media/external/images/media/5745|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0030.jpg|image/jpeg|1600|898|0|115201||1637518220|1563735954000|0|0|0|0|||||||| +6301|5630|content://media/external/images/media/5630|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0028.jpg|image/jpeg|900|1600|0|150620||1637518219|1563734944000|0|0|0|0|||||||| +6302|3023|content://media/external/images/media/3023|/storage/emulated/0/DCIM/Camera/IMG_20190721_204723.jpg|image/jpeg|4160|3120|0|6016463||1637501805|1563734843000|1563734843013|0|0|0|||||||| +6303|5629|content://media/external/images/media/5629|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0025.jpg|image/jpeg|898|1600|0|168436||1637518219|1563733903000|0|0|0|0|||||||| +6304|5628|content://media/external/images/media/5628|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0024.jpg|image/jpeg|1456|1600|0|488883||1637518219|1563733815000|0|0|0|0|||||||| +6305|5627|content://media/external/images/media/5627|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0023.jpg|image/jpeg|900|843|0|163584||1637518219|1563732680000|0|0|0|0|||||||| +6306|5744|content://media/external/images/media/5744|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0022.jpg|image/jpeg|1600|898|0|164547||1637518220|1563731970000|0|0|0|0|||||||| +6307|5626|content://media/external/images/media/5626|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0021.jpg|image/jpeg|1600|1200|0|170443||1637518219|1563729782000|0|0|0|0|||||||| +6308|5625|content://media/external/images/media/5625|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0020.jpg|image/jpeg|660|1280|0|96729||1637518219|1563728490000|0|0|0|0|||||||| +6309|5743|content://media/external/images/media/5743|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0018.jpg|image/jpeg|1600|900|0|154920||1637518220|1563722906000|0|0|0|0|||||||| +6310|5624|content://media/external/images/media/5624|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0017.jpg|image/jpeg|750|1334|0|84552||1637518219|1563722294000|0|0|0|0|||||||| +6311|5742|content://media/external/images/media/5742|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0016.jpg|image/jpeg|1600|900|0|123630||1637518220|1563721836000|0|0|0|0|||||||| +6312|5623|content://media/external/images/media/5623|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0015.jpg|image/jpeg|900|1600|0|143004||1637518219|1563720157000|0|0|0|0|||||||| +6313|5622|content://media/external/images/media/5622|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0014.jpg|image/jpeg|900|1600|0|183140||1637518219|1563720086000|0|0|0|0|||||||| +6314|5621|content://media/external/images/media/5621|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0013.jpg|image/jpeg|1600|1200|0|114555||1637518219|1563718499000|0|0|0|0|||||||| +6315|5741|content://media/external/images/media/5741|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0012.jpg|image/jpeg|720|1280|0|57515||1637518220|1563708152000|0|0|0|0|||||||| +6316|5620|content://media/external/images/media/5620|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0009.jpg|image/jpeg|898|1600|0|97786||1637518219|1563703954000|0|0|0|0|||||||| +6317|5740|content://media/external/images/media/5740|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0008.jpg|image/jpeg|1600|1200|0|220970||1637518220|1563703571000|0|0|0|0|||||||| +6318|5739|content://media/external/images/media/5739|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0006.jpg|image/jpeg|1080|843|0|106245||1637518220|1563699850000|0|0|0|0|||||||| +6319|5619|content://media/external/images/media/5619|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0005.jpg|image/jpeg|1599|788|0|120833||1637518219|1563699397000|0|0|0|0|||||||| +6320|5618|content://media/external/images/media/5618|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0004.jpg|image/jpeg|900|1600|0|62908||1637518219|1563699194000|0|0|0|0|||||||| +6321|5738|content://media/external/images/media/5738|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0003.jpg|image/jpeg|1414|688|0|134083||1637518220|1563697326000|0|0|0|0|||||||| +6322|5617|content://media/external/images/media/5617|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0002.jpg|image/jpeg|768|1024|0|102409||1637518219|1563694747000|0|0|0|0|||||||| +6323|5616|content://media/external/images/media/5616|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190721-WA0001.jpg|image/jpeg|1080|808|0|68799||1637518219|1563691611000|0|0|0|0|||||||| +6324|5737|content://media/external/images/media/5737|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0009.jpg|image/jpeg|480|247|0|13489||1637518220|1563650972000|0|0|0|0|||||||| +6325|5736|content://media/external/images/media/5736|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0008.jpg|image/jpeg|1600|1200|0|312865||1637518220|1563628950000|0|0|0|0|||||||| +6326|5615|content://media/external/images/media/5615|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0007.jpg|image/jpeg|1600|898|0|125139||1637518219|1563626078000|0|0|0|0|||||||| +6327|5614|content://media/external/images/media/5614|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0006.jpg|image/jpeg|770|1600|0|84869||1637518219|1563625233000|0|0|0|0|||||||| +6328|5735|content://media/external/images/media/5735|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0005.jpg|image/jpeg|1223|633|0|191782||1637518220|1563622504000|0|0|0|0|||||||| +6329|5613|content://media/external/images/media/5613|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0004.jpg|image/jpeg|1200|1600|0|248952||1637518219|1563619081000|0|0|0|0|||||||| +6330|5734|content://media/external/images/media/5734|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0002.jpg|image/jpeg|1280|960|0|100845||1637518220|1563616449000|0|0|0|0|||||||| +6331|5733|content://media/external/images/media/5733|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0001.jpg|image/jpeg|1600|1200|0|246964||1637518220|1563611421000|0|0|0|0|||||||| +6332|5732|content://media/external/images/media/5732|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190720-WA0000.jpg|image/jpeg|1280|960|0|72084||1637518220|1563610585000|0|0|0|0|||||||| +6333|5731|content://media/external/images/media/5731|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0019.jpg|image/jpeg|1024|768|0|112555||1637518220|1563566795000|0|0|0|0|||||||| +6334|5730|content://media/external/images/media/5730|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0018.jpg|image/jpeg|1200|1600|0|104826||1637518220|1563564543000|0|0|0|0|||||||| +6335|5612|content://media/external/images/media/5612|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0017.jpg|image/jpeg|1200|1600|0|133631||1637518219|1563564361000|0|0|0|0|||||||| +6336|5611|content://media/external/images/media/5611|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0016.jpg|image/jpeg|1600|1202|0|213173||1637518219|1563564360000|0|0|0|0|||||||| +6337|5729|content://media/external/images/media/5729|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0015.jpg|image/jpeg|1600|764|0|131982||1637518220|1563563559000|0|0|0|0|||||||| +6338|5610|content://media/external/images/media/5610|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0013.jpg|image/jpeg|1600|900|0|107147||1637518219|1563561478000|0|0|0|0|||||||| +6339|2960|content://media/external/images/media/2960|/storage/emulated/0/DCIM/Camera/IMG_20190719_134017.jpg|image/jpeg|5184|3880|270|5347455||1637501684|1563536417000|1563536417534|0|0|0|||||||| +6340|547|content://media/external/images/media/547|/storage/emulated/0/FaceApp/FaceApp_1563536005739.jpg|image/jpeg|1080|2340|0|1716367||1637500132|1563536005000|0|0|0|0|||||||| +6341|5728|content://media/external/images/media/5728|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0011.jpg|image/jpeg|960|1280|0|97909||1637518220|1563534770000|0|0|0|0|||||||| +6342|5727|content://media/external/images/media/5727|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0010.jpg|image/jpeg|1200|1600|0|153376||1637518220|1563534769000|0|0|0|0|||||||| +6343|5726|content://media/external/images/media/5726|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0009.jpg|image/jpeg|720|1280|0|431704||1637518220|1563532954000|0|0|0|0|||||||| +6344|5609|content://media/external/images/media/5609|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0008.jpg|image/jpeg|1600|1200|0|235661||1637518219|1563532765000|0|0|0|0|||||||| +6345|5608|content://media/external/images/media/5608|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0007.jpg|image/jpeg|1189|1600|0|99645||1637518219|1563529024000|0|0|0|0|||||||| +6346|4654|content://media/external/images/media/4654|/storage/emulated/0/DCIM/Camera/IMG_20190719_113507.jpg|image/jpeg|4000|3000|0|11256423||1637505417|1563528907000|1563528907335|0|0|0|||||||| +6347|5607|content://media/external/images/media/5607|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190719-WA0004.jpeg|image/jpeg|4000|2250|0|1036887||1637518219|1563526877000|0|0|0|0|||||||| +6348|5606|content://media/external/images/media/5606|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0023.jpg|image/jpeg|1600|1200|0|128559||1637518219|1563480493000|0|0|0|0|||||||| +6349|5725|content://media/external/images/media/5725|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0024.jpg|image/jpeg|1600|1200|0|85008||1637518220|1563480493000|0|0|0|0|||||||| +6350|5605|content://media/external/images/media/5605|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0022.jpg|image/jpeg|1600|1200|0|91064||1637518219|1563480492000|0|0|0|0|||||||| +6351|5604|content://media/external/images/media/5604|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0021.jpg|image/jpeg|899|1599|0|114150||1637518219|1563476306000|0|0|0|0|||||||| +6352|5724|content://media/external/images/media/5724|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0020.jpg|image/jpeg|899|1599|0|92035||1637518220|1563476166000|0|0|0|0|||||||| +6353|5723|content://media/external/images/media/5723|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0019.jpg|image/jpeg|681|1600|0|300161||1637518220|1563472593000|0|0|0|0|||||||| +6354|5603|content://media/external/images/media/5603|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0018.jpg|image/jpeg|898|1600|0|149574||1637518219|1563472029000|0|0|0|0|||||||| +6355|5722|content://media/external/images/media/5722|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0017.jpg|image/jpeg|1600|1200|0|399716||1637518220|1563466981000|0|0|0|0|||||||| +6356|5721|content://media/external/images/media/5721|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0015.jpg|image/jpeg|898|1600|0|65921||1637518220|1563459672000|0|0|0|0|||||||| +6357|5602|content://media/external/images/media/5602|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0014.jpg|image/jpeg|1599|1200|0|267511||1637518219|1563456494000|0|0|0|0|||||||| +6358|5720|content://media/external/images/media/5720|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0012.jpg|image/jpeg|1200|1599|0|364153||1637518220|1563455523000|0|0|0|0|||||||| +6359|5719|content://media/external/images/media/5719|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0006.jpg|image/jpeg|768|1024|0|95271||1637518220|1563449966000|0|0|0|0|||||||| +6360|5718|content://media/external/images/media/5718|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0005.jpg|image/jpeg|1600|1600|0|216361||1637518220|1563449328000|0|0|0|0|||||||| +6361|5717|content://media/external/images/media/5717|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0004.jpg|image/jpeg|1599|899|0|416655||1637518220|1563448035000|0|0|0|0|||||||| +6362|2726|content://media/external/images/media/2726|/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-07-18-12-40-46-143_com.stt.android.suunto.png|image/png|1080|2340|0|144635||1637500987|1563446446000|0|0|0|0|||||||| +6363|2725|content://media/external/images/media/2725|/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-07-18-12-39-57-207_com.stt.android.suunto.png|image/png|1080|2340|0|430939||1637500987|1563446397000|0|0|0|0|||||||| +6364|5601|content://media/external/images/media/5601|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0001.jpg|image/jpeg|1200|1600|0|192663||1637518219|1563438085000|0|0|0|0|||||||| +6365|5600|content://media/external/images/media/5600|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190718-WA0000.jpg|image/jpeg|1200|1600|0|204537||1637518219|1563438084000|0|0|0|0|||||||| +6366|5716|content://media/external/images/media/5716|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0024.jpg|image/jpeg|1080|1068|0|106930||1637518220|1563395505000|0|0|0|0|||||||| +6367|4692|content://media/external/images/media/4692|/storage/emulated/0/DCIM/Camera/IMG_20190717_214731.jpg|image/jpeg|4000|3000|90|3714230||1637505509|1563392851000|1563392851418|0|0|0|||||||| +6368|5715|content://media/external/images/media/5715|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0023.jpg|image/jpeg|768|1024|0|89019||1637518220|1563387218000|0|0|0|0|||||||| +6369|5599|content://media/external/images/media/5599|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0022.jpg|image/jpeg|720|960|0|128679||1637518219|1563385313000|0|0|0|0|||||||| +6370|5713|content://media/external/images/media/5713|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0019.jpg|image/jpeg|898|1600|0|97501||1637518220|1563379838000|0|0|0|0|||||||| +6371|5714|content://media/external/images/media/5714|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0020.jpg|image/jpeg|898|1600|0|126880||1637518220|1563379838000|0|0|0|0|||||||| +6372|5712|content://media/external/images/media/5712|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0018.jpg|image/jpeg|1200|1600|0|112706||1637518220|1563379439000|0|0|0|0|||||||| +6373|5711|content://media/external/images/media/5711|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0015.jpg|image/jpeg|1080|459|0|66075||1637518220|1563371626000|0|0|0|0|||||||| +6374|5598|content://media/external/images/media/5598|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0014.jpg|image/jpeg|720|690|0|32865||1637518219|1563363567000|0|0|0|0|||||||| +6375|5597|content://media/external/images/media/5597|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0013.jpg|image/jpeg|473|1024|0|56159||1637518219|1563363070000|0|0|0|0|||||||| +6376|5596|content://media/external/images/media/5596|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0012.jpg|image/jpeg|1202|1600|0|207464||1637518219|1563362640000|0|0|0|0|||||||| +6377|5595|content://media/external/images/media/5595|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0011.jpg|image/jpeg|768|1024|0|87739||1637518219|1563361227000|0|0|0|0|||||||| +6378|5710|content://media/external/images/media/5710|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0010.jpg|image/jpeg|1600|900|0|202088||1637518220|1563357622000|0|0|0|0|||||||| +6379|5709|content://media/external/images/media/5709|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0009.jpg|image/jpeg|898|1600|0|96147||1637518220|1563356941000|0|0|0|0|||||||| +6380|5594|content://media/external/images/media/5594|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0008.jpg|image/jpeg|1200|1599|0|313179||1637518219|1563354912000|0|0|0|0|||||||| +6381|5708|content://media/external/images/media/5708|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0007.jpg|image/jpeg|899|1599|0|197430||1637518220|1563353149000|0|0|0|0|||||||| +6382|5707|content://media/external/images/media/5707|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0004.jpg|image/jpeg|1200|1599|0|531708||1637518220|1563351878000|0|0|0|0|||||||| +6383|5593|content://media/external/images/media/5593|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0003.jpg|image/jpeg|1600|1200|0|133687||1637518219|1563351765000|0|0|0|0|||||||| +6384|5706|content://media/external/images/media/5706|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0002.jpg|image/jpeg|1600|1200|0|204288||1637518220|1563344511000|0|0|0|0|||||||| +6385|5705|content://media/external/images/media/5705|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0001.jpg|image/jpeg|898|1600|0|165073||1637518220|1563341957000|0|0|0|0|||||||| +6386|5704|content://media/external/images/media/5704|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190717-WA0000.jpg|image/jpeg|1600|1200|0|181771||1637518219|1563341940000|0|0|0|0|||||||| +6387|5592|content://media/external/images/media/5592|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0017.jpg|image/jpeg|768|1024|0|67912||1637518219|1563309443000|0|0|0|0|||||||| +6388|5591|content://media/external/images/media/5591|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0016.jpg|image/jpeg|1080|1199|0|66142||1637518219|1563307716000|0|0|0|0|||||||| +6389|5590|content://media/external/images/media/5590|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0015.jpg|image/jpeg|899|1599|0|101286||1637518219|1563307569000|0|0|0|0|||||||| +6390|5703|content://media/external/images/media/5703|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0012.jpg|image/jpeg|901|1600|0|153652||1637518219|1563289337000|0|0|0|0|||||||| +6391|5702|content://media/external/images/media/5702|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0006.jpg|image/jpeg|960|952|0|87386||1637518219|1563280388000|0|0|0|0|||||||| +6392|5589|content://media/external/images/media/5589|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0005.jpg|image/jpeg|569|788|0|62336||1637518219|1563279827000|0|0|0|0|||||||| +6393|5588|content://media/external/images/media/5588|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0004.jpg|image/jpeg|1200|1600|0|282301||1637518219|1563278050000|0|0|0|0|||||||| +6394|5587|content://media/external/images/media/5587|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0003.jpg|image/jpeg|1600|1202|0|240001||1637518219|1563275794000|0|0|0|0|||||||| +6395|5701|content://media/external/images/media/5701|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0002.jpg|image/jpeg|1599|899|0|128815||1637518219|1563272970000|0|0|0|0|||||||| +6396|5586|content://media/external/images/media/5586|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190716-WA0001.jpg|image/jpeg|1600|901|0|130705||1637518219|1563270093000|0|0|0|0|||||||| +6397|550|content://media/external/images/media/550|/storage/emulated/0/Pixlr/IMG_20190714_131434.jpg|image/jpeg|2904|3880|0|5663884||1637500132|1563261467000|0|0|0|0|||||||| +6398|2600|content://media/external/images/media/2600|/storage/emulated/0/DCIM/Creative/IMG_20190715_213449.jpg|image/jpeg|2160|2880|0|2550632||1637500870|1563219290000|0|0|0|0|||||||| +6399|2607|content://media/external/images/media/2607|/storage/emulated/0/DCIM/Facebook/FB_IMG_1563210935079.jpg|image/jpeg|2048|1152|0|411680||1637500870|1563210935000|0|0|0|0|||||||| +6400|2606|content://media/external/images/media/2606|/storage/emulated/0/DCIM/Facebook/FB_IMG_1563210928090.jpg|image/jpeg|2048|1152|0|352299||1637500870|1563210928000|0|0|0|0|||||||| +6401|2605|content://media/external/images/media/2605|/storage/emulated/0/DCIM/Facebook/FB_IMG_1563210495296.jpg|image/jpeg|1137|640|0|81523||1637500870|1563210495000|0|0|0|0|||||||| +6402|2604|content://media/external/images/media/2604|/storage/emulated/0/DCIM/Facebook/FB_IMG_1563210488255.jpg|image/jpeg|1137|640|0|80810||1637500870|1563210488000|0|0|0|0|||||||| +6403|2603|content://media/external/images/media/2603|/storage/emulated/0/DCIM/Facebook/FB_IMG_1563210476830.jpg|image/jpeg|1137|640|0|82211||1637500870|1563210476000|0|0|0|0|||||||| +6404|2602|content://media/external/images/media/2602|/storage/emulated/0/DCIM/Facebook/FB_IMG_1563210465124.jpg|image/jpeg|1137|640|0|69746||1637500870|1563210465000|0|0|0|0|||||||| +6405|5585|content://media/external/images/media/5585|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190715-WA0005.jpg|image/jpeg|960|540|0|123357||1637518219|1563188847000|0|0|0|0|||||||| +6406|5700|content://media/external/images/media/5700|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190715-WA0004.jpg|image/jpeg|1024|768|0|95595||1637518219|1563187903000|0|0|0|0|||||||| +6407|5584|content://media/external/images/media/5584|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190715-WA0003.jpg|image/jpeg|1600|1200|0|266620||1637518219|1563187791000|0|0|0|0|||||||| +6408|5699|content://media/external/images/media/5699|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190715-WA0002.jpg|image/jpeg|768|1024|0|29794||1637518219|1563187688000|0|0|0|0|||||||| +6409|5583|content://media/external/images/media/5583|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190715-WA0001.jpg|image/jpeg|762|846|0|75627||1637518219|1563182180000|0|0|0|0|||||||| +6410|5698|content://media/external/images/media/5698|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190715-WA0000.jpg|image/jpeg|1040|780|0|47833||1637518219|1563170620000|0|0|0|0|||||||| +6411|5697|content://media/external/images/media/5697|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0047.jpg|image/jpeg|1200|1599|0|164009||1637518219|1563129610000|0|0|0|0|||||||| +6412|4691|content://media/external/images/media/4691|/storage/emulated/0/DCIM/Camera/IMG_20190714_185942.jpg|image/jpeg|4000|3000|0|6872421||1637505509|1563123582000|1563123582088|0|0|0|||||||| +6413|4690|content://media/external/images/media/4690|/storage/emulated/0/DCIM/Camera/IMG_20190714_185924.jpg|image/jpeg|4000|3000|0|6430521||1637505509|1563123564000|1563123564565|0|0|0|||||||| +6414|3040|content://media/external/images/media/3040|/storage/emulated/0/DCIM/Camera/IMG_20190714_184549.jpg|image/jpeg|4000|3000|90|6013052||1637501858|1563122749000|1563122749692|0|0|0|||||||| +6415|4426|content://media/external/images/media/4426|/storage/emulated/0/DCIM/Camera/IMG_20190714_184537.jpg|image/jpeg|4000|3000|90|5883889||1637505068|1563122737000|1563122737776|0|0|0|||||||| +6416|5696|content://media/external/images/media/5696|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0046.jpg|image/jpeg|1599|1200|0|216103||1637518219|1563121004000|0|0|0|0|||||||| +6417|2599|content://media/external/images/media/2599|/storage/emulated/0/DCIM/Creative/IMG_20190714_181037.jpg|image/jpeg|2160|2880|0|2936798||1637500870|1563120638000|0|0|0|0|||||||| +6418|5695|content://media/external/images/media/5695|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0045.jpg|image/jpeg|1200|1600|0|283023||1637518219|1563115879000|0|0|0|0|||||||| +6419|5692|content://media/external/images/media/5692|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0042.jpg|image/jpeg|1200|1600|0|167084||1637518219|1563115878000|0|0|0|0|||||||| +6420|5693|content://media/external/images/media/5693|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0043.jpg|image/jpeg|1600|1200|0|294856||1637518219|1563115878000|0|0|0|0|||||||| +6421|5694|content://media/external/images/media/5694|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0044.jpg|image/jpeg|1200|1600|0|307172||1637518219|1563115878000|0|0|0|0|||||||| +6422|5690|content://media/external/images/media/5690|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0040.jpg|image/jpeg|1056|1408|0|100754||1637518219|1563115877000|0|0|0|0|||||||| +6423|5691|content://media/external/images/media/5691|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0041.jpg|image/jpeg|1600|1200|0|186265||1637518219|1563115877000|0|0|0|0|||||||| +6424|5582|content://media/external/images/media/5582|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0039.jpg|image/jpeg|1600|1200|0|297665||1637518219|1563113662000|0|0|0|0|||||||| +6425|5581|content://media/external/images/media/5581|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0038.jpg|image/jpeg|1200|1600|0|193723||1637518219|1563113178000|0|0|0|0|||||||| +6426|5580|content://media/external/images/media/5580|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0037.jpg|image/jpeg|900|1600|0|183056||1637518219|1563111943000|0|0|0|0|||||||| +6427|5689|content://media/external/images/media/5689|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0036.jpg|image/jpeg|1599|1200|0|248864||1637518219|1563110105000|0|0|0|0|||||||| +6428|5688|content://media/external/images/media/5688|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0035.jpg|image/jpeg|1200|1599|0|235698||1637518219|1563110104000|0|0|0|0|||||||| +6429|5686|content://media/external/images/media/5686|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0033.jpg|image/jpeg|1599|1200|0|221103||1637518219|1563110103000|0|0|0|0|||||||| +6430|5687|content://media/external/images/media/5687|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0034.jpg|image/jpeg|1200|1599|0|136316||1637518219|1563110103000|0|0|0|0|||||||| +6431|5579|content://media/external/images/media/5579|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0032.jpg|image/jpeg|1328|747|0|12230||1637518219|1563109361000|0|0|0|0|||||||| +6432|5578|content://media/external/images/media/5578|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0031.jpg|image/jpeg|1200|1599|0|314241||1637518219|1563108750000|0|0|0|0|||||||| +6433|5577|content://media/external/images/media/5577|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0030.jpg|image/jpeg|903|1600|0|140654||1637518219|1563108608000|0|0|0|0|||||||| +6434|5576|content://media/external/images/media/5576|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0028.jpg|image/jpeg|747|1328|0|66719||1637518219|1563106772000|0|0|0|0|||||||| +6435|5575|content://media/external/images/media/5575|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0027.jpg|image/jpeg|768|1024|0|98510||1637518219|1563106244000|0|0|0|0|||||||| +6436|5574|content://media/external/images/media/5574|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0024.jpg|image/jpeg|1200|1600|0|220620||1637518219|1563105235000|0|0|0|0|||||||| +6437|5573|content://media/external/images/media/5573|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0023.jpg|image/jpeg|1200|1600|0|477072||1637518219|1563103938000|0|0|0|0|||||||| +6438|5572|content://media/external/images/media/5572|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0022.jpg|image/jpeg|1200|1600|0|429709||1637518219|1563103937000|0|0|0|0|||||||| +6439|3506|content://media/external/images/media/3506|/storage/emulated/0/DCIM/Camera/IMG_20190714_131438.jpg|image/jpeg|5184|3880|270|7775083||1637502969|1563102878000|1563102878807|0|0|0|||||||| +6440|3595|content://media/external/images/media/3595|/storage/emulated/0/DCIM/Camera/IMG_20190714_131434.jpg|image/jpeg|5184|3880|270|6553155||1637503238|1563102874000|1563102874553|0|0|0|||||||| +6441|4177|content://media/external/images/media/4177|/storage/emulated/0/DCIM/Camera/IMG_20190714_131347.jpg|image/jpeg|4160|3120|0|9652142||1637504558|1563102827000|1563102827853|0|0|0|||||||| +6442|4727|content://media/external/images/media/4727|/storage/emulated/0/DCIM/Camera/IMG_20190714_131337.jpg|image/jpeg|4160|3120|0|9512914||1637505574|1563102817000|1563102817819|0|0|0|||||||| +6443|3000|content://media/external/images/media/3000|/storage/emulated/0/DCIM/Camera/IMG_20190714_131330.jpg|image/jpeg|4160|3120|90|9699534||1637501786|1563102810000|1563102810646|0|0|0|||||||| +6444|3717|content://media/external/images/media/3717|/storage/emulated/0/DCIM/Camera/IMG_20190714_122318.jpg|image/jpeg|4160|3120|0|7432560||1637503477|1563099798000|1563099798431|0|0|0|||||||| +6445|4299|content://media/external/images/media/4299|/storage/emulated/0/DCIM/Camera/IMG_20190714_122309.jpg|image/jpeg|4000|3000|0|7149697||1637504817|1563099789000|1563099789721|0|0|0|||||||| +6446|3180|content://media/external/images/media/3180|/storage/emulated/0/DCIM/Camera/IMG_20190714_122029.jpg|image/jpeg|5184|3880|0|5683382||1637502161|1563099629000|1563099629808|0|0|0|||||||| +6447|3837|content://media/external/images/media/3837|/storage/emulated/0/DCIM/Camera/PANO_20190714_121026.jpg|image/jpeg|8336|3808|0|15887761||1637503630|1563099034000|0|0|0|0|||||||| +6448|4653|content://media/external/images/media/4653|/storage/emulated/0/DCIM/Camera/IMG_20190714_120951.jpg|image/jpeg|4160|3120|0|8779099||1637505417|1563098991000|1563098991044|0|0|0|||||||| +6449|3695|content://media/external/images/media/3695|/storage/emulated/0/DCIM/Camera/IMG_20190714_120943.jpg|image/jpeg|4160|3120|0|6839474||1637503392|1563098983000|1563098983216|0|0|0|||||||| +6450|4050|content://media/external/images/media/4050|/storage/emulated/0/DCIM/Camera/IMG_20190714_120940.jpg|image/jpeg|4160|3120|0|7257145||1637504342|1563098980000|1563098980661|0|0|0|||||||| +6451|3505|content://media/external/images/media/3505|/storage/emulated/0/DCIM/Camera/IMG_20190714_120907.jpg|image/jpeg|4160|3120|0|7259450||1637502969|1563098947000|1563098946950|0|0|0|||||||| +6452|3297|content://media/external/images/media/3297|/storage/emulated/0/DCIM/Camera/IMG_20190714_113238.jpg|image/jpeg|4160|3120|0|9930401||1637502430|1563096758000|1563096758517|0|0|0|||||||| +6453|5571|content://media/external/images/media/5571|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0021.jpg|image/jpeg|1600|1200|0|213235||1637518219|1563096751000|0|0|0|0|||||||| +6454|4558|content://media/external/images/media/4558|/storage/emulated/0/DCIM/Camera/IMG_20190714_113021.jpg|image/jpeg|4000|3000|0|8548948||1637505216|1563096621000|1563096621475|0|0|0|||||||| +6455|3199|content://media/external/images/media/3199|/storage/emulated/0/DCIM/Camera/IMG_20190714_112708.jpg|image/jpeg|4000|3000|90|10598934||1637502256|1563096428000|1563096428440|0|0|0|||||||| +6456|5570|content://media/external/images/media/5570|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0017.jpg|image/jpeg|1200|1600|0|447225||1637518219|1563095210000|0|0|0|0|||||||| +6457|5569|content://media/external/images/media/5569|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0015.jpg|image/jpeg|1599|899|0|185648||1637518219|1563092859000|0|0|0|0|||||||| +6458|5568|content://media/external/images/media/5568|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0014.jpg|image/jpeg|1200|1599|0|273672||1637518219|1563092691000|0|0|0|0|||||||| +6459|5567|content://media/external/images/media/5567|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0013.jpg|image/jpeg|1200|1599|0|167700||1637518219|1563092690000|0|0|0|0|||||||| +6460|5566|content://media/external/images/media/5566|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0012.jpg|image/jpeg|898|1600|0|190260||1637518219|1563092142000|0|0|0|0|||||||| +6461|4090|content://media/external/images/media/4090|/storage/emulated/0/DCIM/Camera/IMG_20190714_100251.jpg|image/jpeg|4000|3000|0|6518106||1637504399|1563091371000|1563021224699|0|0|0|||||||| +6462|3862|content://media/external/images/media/3862|/storage/emulated/0/DCIM/Camera/IMG_20190714_100126.jpg|image/jpeg|4160|3120|0|4827872||1637503728|1563091286000|1563018895203|0|0|0|||||||| +6463|5565|content://media/external/images/media/5565|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0002.jpg|image/jpeg|1599|899|0|160881||1637518219|1563090322000|0|0|0|0|||||||| +6464|5564|content://media/external/images/media/5564|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190714-WA0001.jpg|image/jpeg|1200|1599|0|155455||1637518219|1563090091000|0|0|0|0|||||||| +6465|2959|content://media/external/images/media/2959|/storage/emulated/0/DCIM/Camera/IMG_20190713_213645.jpg|image/jpeg|4000|3000|0|5494936||1637501684|1563046605000|1563046604981|0|0|0|||||||| +6466|5563|content://media/external/images/media/5563|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0019.jpg|image/jpeg|1328|747|0|100475||1637518219|1563046072000|0|0|0|0|||||||| +6467|5561|content://media/external/images/media/5561|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0017.jpg|image/jpeg|1200|1600|0|163635||1637518219|1563045560000|0|0|0|0|||||||| +6468|5562|content://media/external/images/media/5562|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0018.jpg|image/jpeg|1200|1600|0|174554||1637518219|1563045560000|0|0|0|0|||||||| +6469|3801|content://media/external/images/media/3801|/storage/emulated/0/DCIM/Camera/IMG_20190713_194617.jpg|image/jpeg|4160|3120|0|6791267||1637503601|1563039977000|1563039977257|0|0|0|||||||| +6470|4163|content://media/external/images/media/4163|/storage/emulated/0/DCIM/Camera/IMG_20190713_194530.jpg|image/jpeg|4160|3120|0|6493198||1637504556|1563039930000|1563039930491|0|0|0|||||||| +6471|3179|content://media/external/images/media/3179|/storage/emulated/0/DCIM/Camera/IMG_20190713_194502.jpg|image/jpeg|4160|3120|0|8810088||1637502161|1563039902000|1563039902876|0|0|0|||||||| +6472|3059|content://media/external/images/media/3059|/storage/emulated/0/DCIM/Camera/IMG_20190713_194416.jpg|image/jpeg|4160|3120|0|7742655||1637501905|1563039856000|1563039856040|0|0|0|||||||| +6473|3800|content://media/external/images/media/3800|/storage/emulated/0/DCIM/Camera/IMG_20190713_194355.jpg|image/jpeg|4160|3120|0|9156199||1637503601|1563039835000|1563039835414|0|0|0|||||||| +6474|4276|content://media/external/images/media/4276|/storage/emulated/0/DCIM/Camera/IMG_20190713_194352.jpg|image/jpeg|4160|3120|0|9807592||1637504807|1563039832000|1563039832051|0|0|0|||||||| +6475|2958|content://media/external/images/media/2958|/storage/emulated/0/DCIM/Camera/IMG_20190713_193544.jpg|image/jpeg|5184|3880|0|6814970||1637501684|1563039344000|1563039344219|0|0|0|||||||| +6476|5011|content://media/external/images/media/5011|/storage/emulated/0/DCIM/Camera/IMG_20190713_193529.jpg|image/jpeg|4000|3000|0|7286622||1637506134|1563039329000|1563039328934|0|0|0|||||||| +6477|2643|content://media/external/images/media/2643|/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-07-13-18-27-07-255_com.miui.gallery.png|image/png|1080|2340|0|3724615||1637500870|1563035228000|0|0|0|0|||||||| +6478|2724|content://media/external/images/media/2724|/storage/emulated/0/DCIM/Screenshots/Screenshot_2019-07-13-18-25-31-386_com.miui.gallery.png|image/png|1080|2340|0|3901287||1637500987|1563035132000|0|0|0|0|||||||| +6479|5560|content://media/external/images/media/5560|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0015.jpg|image/jpeg|1600|898|0|196910||1637518219|1563033393000|0|0|0|0|||||||| +6480|5559|content://media/external/images/media/5559|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0014.jpg|image/jpeg|1600|898|0|185438||1637518219|1563033114000|0|0|0|0|||||||| +6481|5558|content://media/external/images/media/5558|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0013.jpg|image/jpeg|898|1600|0|69758||1637518219|1563032925000|0|0|0|0|||||||| +6482|5557|content://media/external/images/media/5557|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0010.jpg|image/jpeg|1600|1200|0|133265||1637518219|1563030446000|0|0|0|0|||||||| +6483|5556|content://media/external/images/media/5556|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0009.jpg|image/jpeg|1600|1200|0|103037||1637518219|1563030445000|0|0|0|0|||||||| +6484|4010|content://media/external/images/media/4010|/storage/emulated/0/DCIM/Camera/IMG_20190713_155902.jpg|image/jpeg|4000|3000|0|5802753||1637504201|1563026342000|1563026342505|0|0|0|||||||| +6485|3220|content://media/external/images/media/3220|/storage/emulated/0/DCIM/Camera/IMG_20190713_153906.jpg|image/jpeg|4000|3000|0|5812566||1637502258|1563025146000|1563025146105|0|0|0|||||||| +6486|3461|content://media/external/images/media/3461|/storage/emulated/0/DCIM/Camera/IMG_20190713_152225.jpg|image/jpeg|5184|3880|0|3562453||1637502817|1563024147000|1563023693113|0|0|0|||||||| +6487|3447|content://media/external/images/media/3447|/storage/emulated/0/DCIM/Camera/IMG_20190713_151545.jpg|image/jpeg|4160|3120|0|8864889||1637502804|1563023745000|1563023745747|0|0|0|||||||| +6488|4689|content://media/external/images/media/4689|/storage/emulated/0/DCIM/Camera/IMG_20190713_151543.jpg|image/jpeg|4160|3120|0|8568602||1637505509|1563023743000|1563023743024|0|0|0|||||||| +6489|3391|content://media/external/images/media/3391|/storage/emulated/0/DCIM/Camera/IMG_20190713_151540.jpg|image/jpeg|4160|3120|0|8453481||1637502598|1563023740000|1563023740156|0|0|0|||||||| +6490|4407|content://media/external/images/media/4407|/storage/emulated/0/DCIM/Camera/IMG_20190713_151453.jpg|image/jpeg|5184|3880|0|5796379||1637505062|1563023693000|1563023693113|0|0|0|||||||| +6491|5555|content://media/external/images/media/5555|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0005.jpg|image/jpeg|1280|960|0|45186||1637518219|1563023086000|0|0|0|0|||||||| +6492|4811|content://media/external/images/media/4811|/storage/emulated/0/DCIM/Camera/IMG_20190713_143310.jpg|image/jpeg|4000|3000|0|6204334||1637505730|1563021190000|1563021190673|0|0|0|||||||| +6493|3651|content://media/external/images/media/3651|/storage/emulated/0/DCIM/Camera/IMG_20190713_135455.jpg|image/jpeg|4160|3120|0|7382813||1637503358|1563018895000|1563018895203|0|0|0|||||||| +6494|3782|content://media/external/images/media/3782|/storage/emulated/0/DCIM/Camera/IMG_20190713_135437.jpg|image/jpeg|4000|3000|0|8917424||1637503558|1563018877000|1563018877482|0|0|0|||||||| +6495|4578|content://media/external/images/media/4578|/storage/emulated/0/DCIM/Camera/IMG_20190713_135425.jpg|image/jpeg|4000|3000|0|8212644||1637505278|1563018865000|1563018865385|0|0|0|||||||| +6496|5554|content://media/external/images/media/5554|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0003.jpg|image/jpeg|1200|1600|0|251808||1637518219|1563017111000|0|0|0|0|||||||| +6497|5553|content://media/external/images/media/5553|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0002.jpg|image/jpeg|1080|1080|0|539999||1637518219|1563015161000|0|0|0|0|||||||| +6498|4480|content://media/external/images/media/4480|/storage/emulated/0/DCIM/Camera/IMG_20190713_115537.jpg|image/jpeg|4000|3000|90|7334493||1637505122|1563011737000|1563011737662|0|0|0|||||||| +6499|3369|content://media/external/images/media/3369|/storage/emulated/0/DCIM/Camera/IMG_20190713_115536.jpg|image/jpeg|4000|3000|90|7280560||1637502523|1563011736000|1563011736433|0|0|0|||||||| +6500|3991|content://media/external/images/media/3991|/storage/emulated/0/DCIM/Camera/IMG_20190713_115400.jpg|image/jpeg|4000|3000|90|8047203||1637504085|1563011640000|1563011640296|0|0|0|||||||| +6501|5552|content://media/external/images/media/5552|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0001.jpg|image/jpeg|1040|780|0|58363||1637518219|1563005255000|0|0|0|0|||||||| +6502|5551|content://media/external/images/media/5551|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190713-WA0000.jpg|image/jpeg|900|1600|0|159151||1637518219|1563004596000|0|0|0|0|||||||| +6503|5550|content://media/external/images/media/5550|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190712-WA0021.jpg|image/jpeg|899|1599|0|250755||1637518219|1562958690000|0|0|0|0|||||||| +6504|5549|content://media/external/images/media/5549|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190712-WA0020.jpg|image/jpeg|1599|1200|0|185353||1637518219|1562957337000|0|0|0|0|||||||| +6505|5548|content://media/external/images/media/5548|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190712-WA0018.jpg|image/jpeg|1200|1600|0|129871||1637518219|1562950821000|0|0|0|0|||||||| +6506|5547|content://media/external/images/media/5547|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190712-WA0016.jpg|image/jpeg|899|1599|0|140675||1637518219|1562931017000|0|0|0|0|||||||| +6507|5546|content://media/external/images/media/5546|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190712-WA0015.jpg|image/jpeg|1200|1600|0|276276||1637518219|1562930895000|0|0|0|0|||||||| +6508|5545|content://media/external/images/media/5545|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190712-WA0001.jpg|image/jpeg|1600|800|0|132879||1637518219|1562890067000|0|0|0|0|||||||| +6509|5544|content://media/external/images/media/5544|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0016.jpg|image/jpeg|1600|900|0|359673||1637518219|1562862763000|0|0|0|0|||||||| +6510|5543|content://media/external/images/media/5543|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0015.jpg|image/jpeg|310|1107|0|71470||1637518219|1562856253000|0|0|0|0|||||||| +6511|5542|content://media/external/images/media/5542|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0014.jpg|image/jpeg|898|1600|0|126009||1637518219|1562846160000|0|0|0|0|||||||| +6512|5541|content://media/external/images/media/5541|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0013.jpg|image/jpeg|899|1599|0|109448||1637518219|1562837834000|0|0|0|0|||||||| +6513|5540|content://media/external/images/media/5540|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0012.jpg|image/jpeg|899|1599|0|113794||1637518219|1562834432000|0|0|0|0|||||||| +6514|5539|content://media/external/images/media/5539|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0011.jpg|image/jpeg|1600|898|0|94274||1637518219|1562834154000|0|0|0|0|||||||| +6515|5538|content://media/external/images/media/5538|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0010.jpg|image/jpeg|1600|1200|0|165999||1637518219|1562833774000|0|0|0|0|||||||| +6516|5537|content://media/external/images/media/5537|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0009.jpg|image/jpeg|1600|1600|0|530250||1637518219|1562833772000|0|0|0|0|||||||| +6517|5536|content://media/external/images/media/5536|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0008.jpg|image/jpeg|1200|1600|0|219024||1637518219|1562833771000|0|0|0|0|||||||| +6518|5535|content://media/external/images/media/5535|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0007.jpg|image/jpeg|1600|1200|0|282311||1637518219|1562823914000|0|0|0|0|||||||| +6519|5534|content://media/external/images/media/5534|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0006.jpg|image/jpeg|1200|1600|0|329916||1637518219|1562801619000|0|0|0|0|||||||| +6520|5532|content://media/external/images/media/5532|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0003.jpg|image/jpeg|1200|1600|0|208499||1637518219|1562800695000|0|0|0|0|||||||| +6521|5533|content://media/external/images/media/5533|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0004.jpg|image/jpeg|960|1280|0|134236||1637518219|1562800695000|0|0|0|0|||||||| +6522|5531|content://media/external/images/media/5531|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0002.jpg|image/jpeg|1200|1600|0|177205||1637518219|1562800694000|0|0|0|0|||||||| +6523|5529|content://media/external/images/media/5529|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0000.jpg|image/jpeg|1200|1600|0|162636||1637518219|1562800693000|0|0|0|0|||||||| +6524|5530|content://media/external/images/media/5530|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190711-WA0001.jpg|image/jpeg|1600|688|0|115157||1637518219|1562800693000|0|0|0|0|||||||| +6525|5528|content://media/external/images/media/5528|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190710-WA0007.jpg|image/jpeg|640|311|0|29823||1637518219|1562788441000|0|0|0|0|||||||| +6526|4688|content://media/external/images/media/4688|/storage/emulated/0/DCIM/Camera/IMG_20190710_213354.jpg|image/jpeg|4000|3000|90|5797515||1637505509|1562787234000|1562787234871|0|0|0|||||||| +6527|5527|content://media/external/images/media/5527|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190710-WA0006.jpg|image/jpeg|879|596|0|102737||1637518219|1562785647000|0|0|0|0|||||||| +6528|4557|content://media/external/images/media/4557|/storage/emulated/0/DCIM/Camera/IMG_20190710_205009.jpg|image/jpeg|4000|3000|90|5484812||1637505216|1562784609000|1562784609040|0|0|0|||||||| +6529|3839|content://media/external/images/media/3839|/storage/emulated/0/DCIM/Camera/IMG_20190710_205002.jpg|image/jpeg|4000|3000|90|6227777||1637503642|1562784602000|1562784602516|0|0|0|||||||| +6530|5526|content://media/external/images/media/5526|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190710-WA0005.jpg|image/jpeg|750|914|0|67012||1637518219|1562774830000|0|0|0|0|||||||| +6531|5525|content://media/external/images/media/5525|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190710-WA0002.jpg|image/jpeg|898|1600|0|167101||1637518219|1562751269000|0|0|0|0|||||||| +6532|5524|content://media/external/images/media/5524|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190710-WA0001.jpg|image/jpeg|1066|1600|0|111644||1637518219|1562736623000|0|0|0|0|||||||| +6533|5523|content://media/external/images/media/5523|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190710-WA0000.jpg|image/jpeg|1066|1600|0|116060||1637518219|1562736617000|0|0|0|0|||||||| +6534|5522|content://media/external/images/media/5522|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0009.jpg|image/jpeg|1408|1056|0|127764||1637518219|1562695158000|0|0|0|0|||||||| +6535|5521|content://media/external/images/media/5521|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0008.jpg|image/jpeg|1200|1600|0|152461||1637518219|1562695157000|0|0|0|0|||||||| +6536|5520|content://media/external/images/media/5520|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0007.jpg|image/jpeg|1600|1200|0|291412||1637518219|1562695154000|0|0|0|0|||||||| +6537|5519|content://media/external/images/media/5519|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0006.jpg|image/jpeg|1200|1600|0|249763||1637518219|1562695151000|0|0|0|0|||||||| +6538|5518|content://media/external/images/media/5518|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0005.jpg|image/jpeg|1200|1600|0|310118||1637518219|1562695146000|0|0|0|0|||||||| +6539|5517|content://media/external/images/media/5517|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0004.jpg|image/jpeg|1056|1408|0|205484||1637518219|1562695131000|0|0|0|0|||||||| +6540|5516|content://media/external/images/media/5516|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0003.jpg|image/jpeg|1200|1600|0|224439||1637518219|1562665985000|0|0|0|0|||||||| +6541|5515|content://media/external/images/media/5515|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0002.jpg|image/jpeg|898|1600|0|158286||1637518219|1562663586000|0|0|0|0|||||||| +6542|5514|content://media/external/images/media/5514|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0001.jpg|image/jpeg|898|1600|0|152933||1637518219|1562663584000|0|0|0|0|||||||| +6543|5513|content://media/external/images/media/5513|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190709-WA0000.jpg|image/jpeg|898|1600|0|145771||1637518219|1562663582000|0|0|0|0|||||||| +6544|5512|content://media/external/images/media/5512|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190708-WA0007.jpg|image/jpeg|899|1599|0|117539||1637518219|1562611490000|0|0|0|0|||||||| +6545|5511|content://media/external/images/media/5511|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190708-WA0006.jpg|image/jpeg|749|1599|0|101874||1637518219|1562611401000|0|0|0|0|||||||| +6546|5510|content://media/external/images/media/5510|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190708-WA0005.jpg|image/jpeg|750|1334|0|104122||1637518219|1562602932000|0|0|0|0|||||||| +6547|5509|content://media/external/images/media/5509|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190708-WA0004.jpg|image/jpeg|1200|1600|0|157034||1637518219|1562572127000|0|0|0|0|||||||| +6548|5508|content://media/external/images/media/5508|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190708-WA0002.jpeg|image/jpeg|2250|4000|0|569921||1637518219|1562570482000|0|0|0|0|||||||| +6549|5475|content://media/external/images/media/5475|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190708-WA0000.jpeg|image/jpeg|2250|4000|0|535937||1637518219|1562570470000|0|0|0|0|||||||| +6550|5506|content://media/external/images/media/5506|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190707-WA0001.jpg|image/jpeg|720|405|0|52441||1637518219|1562513492000|0|0|0|0|||||||| +6551|5505|content://media/external/images/media/5505|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190707-WA0000.jpg|image/jpeg|1200|1600|0|203401||1637518219|1562483377000|0|0|0|0|||||||| +6552|5504|content://media/external/images/media/5504|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190706-WA0008.jpg|image/jpeg|1600|900|0|187182||1637518219|1562438638000|0|0|0|0|||||||| +6553|5503|content://media/external/images/media/5503|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190706-WA0007.jpg|image/jpeg|640|1136|0|50691||1637518219|1562423607000|0|0|0|0|||||||| +6554|5502|content://media/external/images/media/5502|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190706-WA0006.jpg|image/jpeg|1200|1599|0|219085||1637518219|1562422518000|0|0|0|0|||||||| +6555|5501|content://media/external/images/media/5501|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190706-WA0005.jpg|image/jpeg|899|1599|0|104652||1637518219|1562410837000|0|0|0|0|||||||| +6556|5500|content://media/external/images/media/5500|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190706-WA0004.jpg|image/jpeg|448|302|0|45016||1637518219|1562407006000|0|0|0|0|||||||| +6557|5499|content://media/external/images/media/5499|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190706-WA0002.jpg|image/jpeg|1040|780|0|72359||1637518219|1562400792000|0|0|0|0|||||||| +6558|3504|content://media/external/images/media/3504|/storage/emulated/0/DCIM/Camera/IMG_20190706_092148.jpg|image/jpeg|4000|3000|90|4747617||1637502969|1562397709000|1562397708940|0|0|0|||||||| +6559|4385|content://media/external/images/media/4385|/storage/emulated/0/DCIM/Camera/IMG_20190706_090504.jpg|image/jpeg|4000|3000|90|4543558||1637505004|1562396704000|1562396704310|0|0|0|||||||| +6560|5498|content://media/external/images/media/5498|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190706-WA0001.jpg|image/jpeg|1600|1200|0|313442||1637518219|1562392429000|0|0|0|0|||||||| +6561|5497|content://media/external/images/media/5497|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190705-WA0003.jpg|image/jpeg|1288|972|0|105619||1637518219|1562353465000|0|0|0|0|||||||| +6562|3594|content://media/external/images/media/3594|/storage/emulated/0/DCIM/Camera/IMG_20190705_175033.jpg|image/jpeg|4000|3000|90|4423952||1637503238|1562341834000|1562341833545|0|0|0|||||||| +6563|3758|content://media/external/images/media/3758|/storage/emulated/0/DCIM/Camera/IMG_20190705_175024.jpg|image/jpeg|4000|3000|0|4561908||1637503508|1562341825000|1562341824947|0|0|0|||||||| +6564|2853|content://media/external/images/media/2853|/storage/emulated/0/DCIM/Camera/IMG_20190705_175017.jpg|image/jpeg|4000|3000|90|4876009||1637501457|1562341818000|1562341817397|0|0|0|||||||| +6565|4746|content://media/external/images/media/4746|/storage/emulated/0/DCIM/Camera/IMG_20190705_175010.jpg|image/jpeg|4000|3000|0|5951174||1637505639|1562341811000|1562341810691|0|0|0|||||||| +6566|3022|content://media/external/images/media/3022|/storage/emulated/0/DCIM/Camera/IMG_20190705_175004.jpg|image/jpeg|4000|3000|90|5645208||1637501805|1562341805000|1562341803961|0|0|0|||||||| +6567|5495|content://media/external/images/media/5495|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190705-WA0001.jpg|image/jpeg|1296|864|0|115093||1637518219|1562303290000|0|0|0|0|||||||| +6568|5496|content://media/external/images/media/5496|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190705-WA0002.jpg|image/jpeg|1296|864|0|120945||1637518219|1562303290000|0|0|0|0|||||||| +6569|5494|content://media/external/images/media/5494|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190705-WA0000.jpg|image/jpeg|1296|864|0|105543||1637518219|1562303289000|0|0|0|0|||||||| +6570|5493|content://media/external/images/media/5493|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0014.jpg|image/jpeg|436|650|0|72237||1637518219|1562271635000|0|0|0|0|||||||| +6571|5492|content://media/external/images/media/5492|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0013.jpg|image/jpeg|1200|1600|0|519178||1637518219|1562256252000|0|0|0|0|||||||| +6572|4108|content://media/external/images/media/4108|/storage/emulated/0/DCIM/Camera/IMG_20190704_174633.jpg|image/jpeg|4000|3000|90|4719312||1637504451|1562255193000|1562255193342|0|0|0|||||||| +6573|3936|content://media/external/images/media/3936|/storage/emulated/0/DCIM/Camera/IMG_20190704_174631.jpg|image/jpeg|4000|3000|90|5568486||1637503853|1562255191000|1562255191287|0|0|0|||||||| +6574|4836|content://media/external/images/media/4836|/storage/emulated/0/DCIM/Camera/IMG_20190704_174629.jpg|image/jpeg|4000|3000|90|4393204||1637505753|1562255189000|1562255189095|0|0|0|||||||| +6575|4835|content://media/external/images/media/4835|/storage/emulated/0/DCIM/Camera/IMG_20190704_174624.jpg|image/jpeg|4000|3000|90|4723847||1637505753|1562255184000|1562255184291|0|0|0|||||||| +6576|5491|content://media/external/images/media/5491|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0011.jpg|image/jpeg|622|205|0|24855||1637518219|1562255053000|0|0|0|0|||||||| +6577|5490|content://media/external/images/media/5490|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0010.jpg|image/jpeg|750|1334|0|181281||1637518219|1562251646000|0|0|0|0|||||||| +6578|5489|content://media/external/images/media/5489|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0009.jpg|image/jpeg|750|1334|0|121752||1637518219|1562251645000|0|0|0|0|||||||| +6579|5488|content://media/external/images/media/5488|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0008.jpg|image/jpeg|750|1334|0|100436||1637518219|1562251438000|0|0|0|0|||||||| +6580|5487|content://media/external/images/media/5487|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0007.jpg|image/jpeg|750|1334|0|123546||1637518219|1562251437000|0|0|0|0|||||||| +6581|5486|content://media/external/images/media/5486|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0006.jpg|image/jpeg|1200|1600|0|166475||1637518219|1562242702000|0|0|0|0|||||||| +6582|5485|content://media/external/images/media/5485|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0005.jpg|image/jpeg|898|1600|0|214793||1637518219|1562239343000|0|0|0|0|||||||| +6583|5484|content://media/external/images/media/5484|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0003.jpg|image/jpeg|480|588|0|36334||1637518219|1562236539000|0|0|0|0|||||||| +6584|5483|content://media/external/images/media/5483|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0002.jpg|image/jpeg|1200|1600|0|165133||1637518219|1562230331000|0|0|0|0|||||||| +6585|5482|content://media/external/images/media/5482|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190704-WA0001.jpg|image/jpeg|1200|1600|0|180130||1637518219|1562230328000|0|0|0|0|||||||| +6586|5481|content://media/external/images/media/5481|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190703-WA0004.jpg|image/jpeg|704|960|0|66781||1637518219|1562158244000|0|0|0|0|||||||| +6587|5480|content://media/external/images/media/5480|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190703-WA0003.jpg|image/jpeg|720|672|0|35763||1637518219|1562148120000|0|0|0|0|||||||| +6588|5479|content://media/external/images/media/5479|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190703-WA0002.jpg|image/jpeg|1202|1600|0|103437||1637518219|1562147251000|0|0|0|0|||||||| +6589|5478|content://media/external/images/media/5478|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190703-WA0001.jpg|image/jpeg|681|1600|0|300161||1637518219|1562141462000|0|0|0|0|||||||| +6590|5477|content://media/external/images/media/5477|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190703-WA0000.jpg|image/jpeg|900|1600|0|187770||1637518219|1562138899000|0|0|0|0|||||||| +6591|5476|content://media/external/images/media/5476|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20190702-WA0002.jpg|image/jpeg|750|1334|0|111110||1637518219|1562101453000|0|0|0|0|||||||| +6592|4162|content://media/external/images/media/4162|/storage/emulated/0/DCIM/Camera/IMG_20190628_200511.jpg|image/jpeg|5823|2747|0|1655237||1637504556|1561963473000|0|0|0|0|||||||| +6593|4616|content://media/external/images/media/4616|/storage/emulated/0/DCIM/Camera/PANO_20190628_200406.jpg|image/jpeg|7664|3616|0|4269936||1637505308|1561745052000|0|0|0|0|||||||| +6594|3820|content://media/external/images/media/3820|/storage/emulated/0/DCIM/Camera/IMG_20190628_200259.jpg|image/jpeg|4000|3000|90|8354585||1637503629|1561744980000|1561744979764|0|0|0|||||||| +6595|3276|content://media/external/images/media/3276|/storage/emulated/0/DCIM/Camera/IMG_20190628_195919.jpg|image/jpeg|4160|3120|0|4683391||1637502355|1561744760000|1561744565149|0|0|0|||||||| +6596|3021|content://media/external/images/media/3021|/storage/emulated/0/DCIM/Camera/IMG_20190628_195837.jpg|image/jpeg|4160|3120|0|4580392||1637501805|1561744718000|1561744565149|0|0|0|||||||| +6597|4128|content://media/external/images/media/4128|/storage/emulated/0/DCIM/Camera/IMG_20190628_195605.jpg|image/jpeg|4160|3120|0|4602735||1637504473|1561744565000|1561744565149|0|0|0|||||||| +6598|1000018529|content://media/external/video/media/1000018529|/storage/emulated/0/DCIM/Camera/VID_20250204_104639.mp4|video/mp4|1920|1080|90|122129847||1738662399|1738662449402|1738662447000|46831|0|0|||||||| +6599|1000018528|content://media/external/video/media/1000018528|/storage/emulated/0/DCIM/Camera/VID_20250204_104615.mp4|video/mp4|1920|1080|90|4954519||1738662375|1738662380450|1738662378000|1429|0|0|||||||| +6600|1000017577|content://media/external/video/media/1000017577|/storage/emulated/0/Movies/youcut/YouCut_20230406_115557563.mp4|video/mp4|480|854|0|23088431||1680774974|1680774974529|0|43769|0|0|||||||| +6601|1000017576|content://media/external/video/media/1000017576|/storage/emulated/0/Movies/youcut/YouCut_20230406_115352610.mp4|video/mp4|480|854|0|23106418||1680774876|1680774876501|0|43753|0|0|||||||| +6602|1000017571|content://media/external/video/media/1000017571|/storage/emulated/0/DCIM/Camera/VID_20230406_114322.mp4|video/mp4|1920|1080|90|423510599||1680774202|1680774371872|1680774370000|166241|0|0|||||||| +6603|1000017570|content://media/external/video/media/1000017570|/storage/emulated/0/Movies/youcut/YouCut_20230406_095900058.mp4|video/mp4|640|1138|0|93360590||1680767983|1680767984061|0|104230|0|0|||||||| +6604|1000017569|content://media/external/video/media/1000017569|/storage/emulated/0/DCIM/Camera/VID_20230406_094301.mp4|video/mp4|1920|1080|90|463585431||1680766981|1680767196377|1680767195000|212806|0|0|||||||| +6605|1000017568|content://media/external/video/media/1000017568|/storage/emulated/0/DCIM/Camera/VID_20230406_094058.mp4|video/mp4|1920|1080|90|262535089||1680766858|1680766965037|1680766964000|104221|0|0|||||||| +6606|1000017567|content://media/external/video/media/1000017567|/storage/emulated/0/DCIM/Camera/VID_20230406_093958.mp4|video/mp4|1920|1080|90|104709206||1680766798|1680766856149|1680766855000|55791|0|0|||||||| +6607|1000017566|content://media/external/video/media/1000017566|/storage/emulated/0/DCIM/Camera/VID_20230406_093943.mp4|video/mp4|1920|1080|90|11759440||1680766783|1680766789381|1680766789000|3863|0|0|||||||| +6608|1000017565|content://media/external/video/media/1000017565|/storage/emulated/0/DCIM/Camera/VID_20230406_093928.mp4|video/mp4|1920|1080|90|2058848||1680766768|1680766777597|1680766777000|7327|0|0|||||||| +6609|1000017564|content://media/external/video/media/1000017564|/storage/emulated/0/DCIM/Camera/VID_20230406_093833.mp4|video/mp4|1920|1080|90|41058060||1680766713|1680766730769|1680766730000|15573|0|0|||||||| +6610|1000017563|content://media/external/video/media/1000017563|/storage/emulated/0/DCIM/Camera/VID_20230406_093757.mp4|video/mp4|1920|1080|90|75715258||1680766677|1680766711145|1680766710000|31709|0|0|||||||| +6611|1000017562|content://media/external/video/media/1000017562|/storage/emulated/0/DCIM/Camera/VID_20230406_093744.mp4|video/mp4|1920|1080|90|19372133||1680766664|1680766672869|1680766672000|6528|0|0|||||||| +6612|1000017557|content://media/external/video/media/1000017557|/storage/emulated/0/DCIM/Camera/VID_20230406_092500.mp4|video/mp4|1920|1080|90|409664958||1680765900|1680766104197|1680766103000|200848|0|0|||||||| +6613|1000017555|content://media/external/video/media/1000017555|/storage/emulated/0/DCIM/Camera/VID_20230406_092103.mp4|video/mp4|1920|1080|90|223932873||1680765663|1680765751881|1680765750000|85592|0|0|||||||| +6614|1000017089|content://media/external/video/media/1000017089|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230214-WA0009.mp4|video/mp4|432|640|0|1214691||1676390519|1676390521575|0|13792|0|0|||||||| +6615|1000016883|content://media/external/video/media/1000016883|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230209-WA0013.mp4|video/mp4|640|352|0|18524455||1675981555|1675981562086|0|71981|0|0|||||||| +6616|1000016879|content://media/external/video/media/1000016879|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230209-WA0012.mp4|video/mp4|640|352|0|15117079||1675981506|1675981523703|0|57285|0|0|||||||| +6617|1000016817|content://media/external/video/media/1000016817|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230208-WA0013.mp4|video/mp4|640|352|0|33152637||1675893941|1675897085669|0|168490|0|0|||||||| +6618|1000016602|content://media/external/video/media/1000016602|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230205-WA0003.mp4|video/mp4|224|288|0|63877||1675595349|1675595349713|0|3202|0|0|||||||| +6619|1000016485|content://media/external/video/media/1000016485|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230201-WA0004.mp4|video/mp4|640|352|90|7086727||1675260006|1675260011334|0|25024|0|0|||||||| +6620|1000016404|content://media/external/video/media/1000016404|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230130-WA0002.mp4|video/mp4|576|1024|0|6629921||1675077148|1675077151990|0|22200|0|0|||||||| +6621|1000016342|content://media/external/video/media/1000016342|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230128-WA0010.mp4|video/mp4|320|180|0|11183703||1674925437|1674925443377|0|230063|0|0|||||||| +6622|1000016225|content://media/external/video/media/1000016225|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230125-WA0002.mp4|video/mp4|368|480|0|3238791||1674653930|1674653932324|0|16068|0|0|||||||| +6623|1000016223|content://media/external/video/media/1000016223|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230125-WA0001.mp4|video/mp4|386|386|0|125649||1674647711|1674647711832|0|1640|0|0|||||||| +6624|1000016101|content://media/external/video/media/1000016101|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230123-WA0000.mp4|video/mp4|480|848|0|8394246||1674457555|1674457561061|0|41076|0|0|||||||| +6625|1000016072|content://media/external/video/media/1000016072|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp video/VID-20230122-WA0002.mp4|video/mp4|640|352|90|14859422||1674386242|1674386248003|0|61354|0|0|||||||| +6626|1000016065|content://media/external/video/media/1000016065|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230122-WA0000.mp4|video/mp4|352|640|0|6559639||1674378853|1674378855730|0|25557|0|0|||||||| +6627|1000016053|content://media/external/video/media/1000016053|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230121-WA0018.mp4|video/mp4|640|352|0|31856363||1674313737|1674313754132|0|147517|0|0|||||||| +6628|1000016017|content://media/external/video/media/1000016017|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230121-WA0007.mp4|video/mp4|640|352|180|594378||1674303877|1674303878135|0|3221|0|0|||||||| +6629|1000015928|content://media/external/video/media/1000015928|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230119-WA0006.mp4|video/mp4|848|480|90|1168997||1674154092|1674154093608|0|5456|0|0|||||||| +6630|1000015924|content://media/external/video/media/1000015924|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230119-WA0005.mp4|video/mp4|480|848|0|1246264||1674148581|1674148582720|0|7755|0|0|||||||| +6631|1000015872|content://media/external/video/media/1000015872|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230117-WA0001.mp4|video/mp4|576|1028|0|1096734||1673970844|1673970846126|0|13444|0|0|||||||| +6632|1000015852|content://media/external/video/media/1000015852|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230116-WA0009.mp4|video/mp4|640|352|0|6081845||1673901213|1673901216285|0|75520|0|0|||||||| +6633|1000015848|content://media/external/video/media/1000015848|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230116-WA0008.mp4|video/mp4|640|352|90|10515248||1673892856|1673892860654|0|39853|0|0|||||||| +6634|1000015791|content://media/external/video/media/1000015791|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230115-WA0003.mp4|video/mp4|258|258|0|223602||1673780647|1673780648936|0|2800|0|0|||||||| +6635|1000015734|content://media/external/video/media/1000015734|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230114-WA0016.mp4|video/mp4|640|352|90|17576102||1673691080|1673695630431|0|58922|0|0|||||||| +6636|1000015742|content://media/external/video/media/1000015742|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230114-WA0018.mp4|video/mp4|640|352|90|3170326||1673691465|1673691466537|0|11605|0|0|||||||| +6637|1000015738|content://media/external/video/media/1000015738|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230114-WA0017.mp4|video/mp4|640|352|90|12755127||1673691121|1673691158032|0|41045|0|0|||||||| +6638|1000015697|content://media/external/video/media/1000015697|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp video/VID-20230114-WA0004.mp4|video/mp4|640|352|90|6906775||1673690399|1673690403188|0|21930|0|0|||||||| +6639|1000015635|content://media/external/video/media/1000015635|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230113-WA0001.mp4|video/mp4|160|92|0|44657||1673612396|1673612396729|0|4880|0|0|||||||| +6640|1000015628|content://media/external/video/media/1000015628|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230113-WA0000.mp4|video/mp4|480|480|0|57087||1673594928|1673594928848|0|420|0|0|||||||| +6641|1000015510|content://media/external/video/media/1000015510|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230110-WA0006.mp4|video/mp4|640|352|0|18733759||1673365616|1673365623404|0|71964|0|0|||||||| +6642|1000015504|content://media/external/video/media/1000015504|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230110-WA0004.mp4|video/mp4|640|352|180|17381225||1673364596|1673364602278|0|66944|0|0|||||||| +6643|1000015362|content://media/external/video/media/1000015362|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230106-WA0012.mp4|video/mp4|640|352|90|3987642||1673009630|1673009670736|0|22139|0|0|||||||| +6644|1000015355|content://media/external/video/media/1000015355|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230106-WA0010.mp4|video/mp4|640|352|90|1602686||1673009597|1673009629537|0|8746|0|0|||||||| +6645|1000015345|content://media/external/video/media/1000015345|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230106-WA0007.mp4|video/mp4|640|352|90|2711198||1673009570|1673009596363|0|15168|0|0|||||||| +6646|1000015335|content://media/external/video/media/1000015335|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230106-WA0003.mp4|video/mp4|294|350|0|50023||1673001333|1673001333742|0|2040|0|0|||||||| +6647|1000015242|content://media/external/video/media/1000015242|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230104-WA0006.mp4|video/mp4|640|352|0|15408715||1672870189|1672870199173|0|84074|0|0|||||||| +6648|1000015200|content://media/external/video/media/1000015200|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230103-WA0001.mp4|video/mp4|640|352|90|5190458||1672750731|1672750734092|0|29162|0|0|||||||| +6649|1000015155|content://media/external/video/media/1000015155|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230102-WA0001.mp4|video/mp4|640|352|0|26427520||1672655930|1672655950805|0|120072|0|0|||||||| +6650|1000015130|content://media/external/video/media/1000015130|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0030.mp4|video/mp4|480|848|0|2739789||1672577891|1672577893359|0|12817|0|0|||||||| +6651|1000015126|content://media/external/video/media/1000015126|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0029.mp4|video/mp4|352|640|0|894546||1672575271|1672575309860|0|3370|0|0|||||||| +6652|1000015122|content://media/external/video/media/1000015122|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0028.mp4|video/mp4|480|480|0|5866263||1672574009|1672574011598|0|61509|0|0|||||||| +6653|1000015111|content://media/external/video/media/1000015111|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230101-WA0024.mp4|video/mp4|354|354|0|84318||1672569209|1672569210049|0|1400|0|0|||||||| +6654|1000015089|content://media/external/video/media/1000015089|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0019.mp4|video/mp4|352|640|0|1148426||1672534230|1672534231325|0|4458|0|0|||||||| +6655|1000015085|content://media/external/video/media/1000015085|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0018.mp4|video/mp4|352|640|0|1572747||1672532458|1672532459273|0|5944|0|0|||||||| +6656|1000015066|content://media/external/video/media/1000015066|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0012.mp4|video/mp4|400|304|0|987692||1672530428|1672530430745|0|15000|0|0|||||||| +6657|1000015062|content://media/external/video/media/1000015062|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0011.mp4|video/mp4|640|352|0|30465215||1672529924|1672529951962|0|145498|0|0|||||||| +6658|1000015058|content://media/external/video/media/1000015058|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0010.mp4|video/mp4|576|576|0|5130476||1672529670|1672529678616|0|72006|0|0|||||||| +6659|1000015056|content://media/external/video/media/1000015056|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230101-WA0009.mp4|video/mp4|512|512|0|34140||1672529528|1672529528897|0|450|0|0|||||||| +6660|1000015052|content://media/external/video/media/1000015052|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0008.mp4|video/mp4|544|640|0|1835184||1672528886|1672528887992|0|19760|0|0|||||||| +6661|1000015050|content://media/external/video/media/1000015050|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20230101-WA0007.mp4|video/mp4|192|192|0|74080||1672528821|1672528821260|0|3991|0|0|||||||| +6662|1000015040|content://media/external/video/media/1000015040|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0004.mp4|video/mp4|480|848|0|10628778||1672528124|1672528136340|0|66641|0|0|||||||| +6663|1000015036|content://media/external/video/media/1000015036|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20230101-WA0003.mp4|video/mp4|640|352|0|11787358||1672528027|1672528035188|0|43882|0|0|||||||| +6664|1000014982|content://media/external/video/media/1000014982|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221231-WA0022.mp4|video/mp4|112|144|0|71096||1672510927|1672510927576|0|2250|0|0|||||||| +6665|1000014978|content://media/external/video/media/1000014978|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221231-WA0021.mp4|video/mp4|432|240|0|2691444||1672510301|1672510303149|0|47391|0|0|||||||| +6666|1000014971|content://media/external/video/media/1000014971|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221231-WA0018.mp4|video/mp4|416|256|0|93677||1672506287|1672506287439|0|1805|0|0|||||||| +6667|1000014963|content://media/external/video/media/1000014963|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221231-WA0015.mp4|video/mp4|452|378|0|102601||1672504770|1672504785641|0|1960|0|0|||||||| +6668|1000014927|content://media/external/video/media/1000014927|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221231-WA0001.mp4|video/mp4|432|240|0|2735597||1672491395|1672493179411|0|47391|0|0|||||||| +6669|1000014783|content://media/external/video/media/1000014783|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221228-WA0002.mp4|video/mp4|640|352|90|3682952||1672226652|1672226654186|0|13290|0|0|||||||| +6670|1000014670|content://media/external/video/media/1000014670|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221225-WA0029.mp4|video/mp4|400|400|0|118985||1671984921|1671984921796|0|1682|0|0|||||||| +6671|1000014657|content://media/external/video/media/1000014657|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0025.mp4|video/mp4|640|352|0|924297||1671976523|1671976525692|0|8512|0|0|||||||| +6672|1000014631|content://media/external/video/media/1000014631|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0017.mp4|video/mp4|576|1024|0|1290948||1671962265|1671962268074|0|18134|0|0|||||||| +6673|1000014623|content://media/external/video/media/1000014623|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221225-WA0014.mp4|video/mp4|432|432|0|91851||1671959440|1671959440339|0|1360|0|0|||||||| +6674|1000014619|content://media/external/video/media/1000014619|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0013.mp4|video/mp4|848|480|0|6070972||1671959077|1671959088171|0|29698|0|0|||||||| +6675|1000014613|content://media/external/video/media/1000014613|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0011.mp4|video/mp4|640|352|90|2482890||1671958851|1671958855972|0|9216|0|0|||||||| +6676|1000014605|content://media/external/video/media/1000014605|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221225-WA0009.mp4|video/mp4|480|336|0|49147||1671956919|1671956919583|0|984|0|0|||||||| +6677|1000014597|content://media/external/video/media/1000014597|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221225-WA0006.mp4|video/mp4|224|160|0|35812||1671955348|1671955348509|0|1777|0|0|||||||| +6678|1000014579|content://media/external/video/media/1000014579|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221225-WA0001.mp4|video/mp4|720|1280|0|7947490||1671936654|1671936660930|0|52825|0|0|||||||| +6679|1000014542|content://media/external/video/media/1000014542|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0018.mp4|video/mp4|512|640|0|16769016||1671905903|1671905911632|0|36469|0|0|||||||| +6680|1000014535|content://media/external/video/media/1000014535|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0016.mp4|video/mp4|1280|720|0|20853533||1671904115|1671904125167|0|74005|0|0|||||||| +6681|1000014504|content://media/external/video/media/1000014504|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0008.mp4|video/mp4|720|720|0|6235238||1671886204|1671886210249|0|77763|0|0|||||||| +6682|1000014480|content://media/external/video/media/1000014480|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0001.mp4|video/mp4|480|848|0|16780560||1671869816|1671869824546|0|87701|0|0|||||||| +6683|1000014476|content://media/external/video/media/1000014476|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221224-WA0000.mp4|video/mp4|400|400|0|7059204||1671869211|1671869215230|0|82709|0|0|||||||| +6684|1000014448|content://media/external/video/media/1000014448|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0011.mp4|video/mp4|768|768|0|7199235||1671811977|1671811981740|0|18633|0|0|||||||| +6685|1000014443|content://media/external/video/media/1000014443|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0010.mp4|video/mp4|480|848|0|16910738||1671807629|1671807636585|0|87724|0|0|||||||| +6686|1000014439|content://media/external/video/media/1000014439|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0009.mp4|video/mp4|640|352|90|7981047||1671807385|1671807388678|0|29099|0|0|||||||| +6687|1000014407|content://media/external/video/media/1000014407|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0004.mp4|video/mp4|480|848|0|4368109||1671783017|1671783019924|0|24032|0|0|||||||| +6688|1000014403|content://media/external/video/media/1000014403|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221223-WA0003.mp4|video/mp4|640|480|90|50037036||1671778755|1671778777751|0|84157|0|0|||||||| +6689|1000014345|content://media/external/video/media/1000014345|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221221-WA0011.mp4|video/mp4|640|352|90|65764308||1671650799|1671652515636|0|502976|0|0|||||||| +6690|1000014326|content://media/external/video/media/1000014326|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221221-WA0007.mp4|video/mp4|640|352|90|4808779||1671642416|1671642423664|0|18346|0|0|||||||| +6691|1000014222|content://media/external/video/media/1000014222|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221218-WA0015.mp4|video/mp4|300|170|0|311527||1671400584|1671400585209|0|1200|0|0|||||||| +6692|1000014215|content://media/external/video/media/1000014215|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221218-WA0013.mp4|video/mp4|352|640|0|9079910||1671384842|1671384847799|0|17531|0|0|||||||| +6693|1000014197|content://media/external/video/media/1000014197|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221218-WA0009.mp4|video/mp4|960|540|0|11621486||1671376466|1671376472337|0|40840|0|0|||||||| +6694|1000014188|content://media/external/video/media/1000014188|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221218-WA0007.mp4|video/mp4|640|352|0|14812926||1671370371|1671370377617|0|60117|0|0|||||||| +6695|1000014166|content://media/external/video/media/1000014166|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221218-WA0001.mp4|video/mp4|352|640|0|4967699||1671356575|1671356577446|0|19136|0|0|||||||| +6696|1000014147|content://media/external/video/media/1000014147|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221217-WA0010.mp4|video/mp4|320|174|0|78148||1671306479|1671306479810|0|2000|0|0|||||||| +6697|1000014120|content://media/external/video/media/1000014120|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221217-WA0004.mp4|video/mp4|640|352|90|3918882||1671280491|1671280498133|0|15253|0|0|||||||| +6698|1000014054|content://media/external/video/media/1000014054|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221215-WA0001.mp4|video/mp4|480|544|0|4247367||1671111400|1671111402255|0|30812|0|0|||||||| +6699|1000013850|content://media/external/video/media/1000013850|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221208-WA0022.mp4|video/mp4|640|352|90|8977481||1670522483|1670522517247|0|33130|0|0|||||||| +6700|1000013843|content://media/external/video/media/1000013843|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221208-WA0020.mp4|video/mp4|624|480|0|1351783||1670514482|1670514488886|0|9589|0|0|||||||| +6701|1000013787|content://media/external/video/media/1000013787|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221208-WA0009.mp4|video/mp4|640|640|0|118327||1670457361|1670457362201|0|1123|0|0|||||||| +6702|1000013783|content://media/external/video/media/1000013783|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221208-WA0008.mp4|video/mp4|848|480|0|3014716||1670455715|1670455717020|0|14164|0|0|||||||| +6703|1000013770|content://media/external/video/media/1000013770|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221208-WA0004.mp4|video/mp4|848|480|90|9648120||1670455709|1670455714247|0|47717|0|0|||||||| +6704|1000013735|content://media/external/video/media/1000013735|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221207-WA0007.mp4|video/mp4|640|352|0|67826213||1670424582|1670424606461|0|682218|0|0|||||||| +6705|1000013731|content://media/external/video/media/1000013731|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221207-WA0006.mp4|video/mp4|640|352|0|20376283||1670424175|1670424195010|0|123626|0|0|||||||| +6706|1000013585|content://media/external/video/media/1000013585|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221202-WA0000.mp4|video/mp4|506|360|0|3174196||1669995245|1669995248534|0|71471|0|0|||||||| +6707|1000013568|content://media/external/video/media/1000013568|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221201-WA0000.mp4|video/mp4|136|202|0|96539||1669883811|1669883811817|0|4500|0|0|||||||| +6708|1000013520|content://media/external/video/media/1000013520|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221129-WA0009.mp4|video/mp4|480|320|0|4521215||1669740748|1669740771903|0|28699|0|0|||||||| +6709|1000013368|content://media/external/video/media/1000013368|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221128-WA0000.mp4|video/mp4|848|480|0|30289656||1669590876|1669590890280|0|169203|0|0|||||||| +6710|1000013356|content://media/external/video/media/1000013356|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221127-WA0001.mp4|video/mp4|640|352|90|3817573||1669548716|1669548719358|0|14506|0|0|||||||| +6711|1000013154|content://media/external/video/media/1000013154|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221123-WA0008.mp4|video/mp4|848|480|90|2594336||1669243935|1669243941836|0|12306|0|0|||||||| +6712|1000013083|content://media/external/video/media/1000013083|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221122-WA0001.mp4|video/mp4|352|640|0|8682798||1669123240|1669123243604|0|80576|0|0|||||||| +6713|1000012975|content://media/external/video/media/1000012975|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221120-WA0019.mp4|video/mp4|640|352|0|2571389||1668976606|1668976611726|0|9664|0|0|||||||| +6714|1000012962|content://media/external/video/media/1000012962|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221120-WA0014.mp4|video/mp4|848|480|0|5743455||1668968676|1668968681202|0|27445|0|0|||||||| +6715|1000012948|content://media/external/video/media/1000012948|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221120-WA0010.mp4|video/mp4|640|352|0|6319785||1668966878|1668966881497|0|24320|0|0|||||||| +6716|1000012938|content://media/external/video/media/1000012938|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221120-WA0007.mp4|video/mp4|320|212|0|91795||1668961226|1668961226357|0|2071|0|0|||||||| +6717|1000012911|content://media/external/video/media/1000012911|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221120-WA0000.mp4|video/mp4|640|352|90|4089917||1668931558|1668931563865|0|14794|0|0|||||||| +6718|1000012703|content://media/external/video/media/1000012703|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221115-WA0008.mp4|video/mp4|640|352|90|7442104||1668521044|1668521047266|0|26538|0|0|||||||| +6719|1000012683|content://media/external/video/media/1000012683|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221115-WA0003.mp4|video/mp4|576|1024|0|1984187||1668503045|1668503047619|0|17507|0|0|||||||| +6720|1000012582|content://media/external/video/media/1000012582|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221112-WA0010.mp4|video/mp4|640|304|90|5727832||1668292429|1668292432348|0|22566|0|0|||||||| +6721|1000012525|content://media/external/video/media/1000012525|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221111-WA0001.mp4|video/mp4|224|168|0|129058||1668166061|1668166061746|0|2999|0|0|||||||| +6722|1000012304|content://media/external/video/media/1000012304|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221105-WA0003.mp4|video/mp4|640|352|0|5288928||1667643905|1667643915061|0|29845|0|0|||||||| +6723|1000012247|content://media/external/video/media/1000012247|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221104-WA0002.mp4|video/mp4|848|480|0|10460352||1667550236|1667550241753|0|51803|0|0|||||||| +6724|1000012188|content://media/external/video/media/1000012188|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0010.mp4|video/mp4|640|352|0|14339435||1667427665|1667427673698|0|68650|0|0|||||||| +6725|1000012153|content://media/external/video/media/1000012153|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0007.mp4|video/mp4|1920|1080|0|59296731||1667379194|1667406562737|0|9962|0|0|||||||| +6726|1000012175|content://media/external/video/media/1000012175|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0005.mp4|video/mp4|640|352|90|23362952||1667392322|1667392337162|0|105088|0|0|||||||| +6727|1000012165|content://media/external/video/media/1000012165|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0002.mp4|video/mp4|640|352|90|15177537||1667389216|1667389223313|0|62890|0|0|||||||| +6728|1000012161|content://media/external/video/media/1000012161|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221102-WA0001.mp4|video/mp4|640|352|90|8518757||1667389198|1667389208416|0|33365|0|0|||||||| +6729|1000012105|content://media/external/video/media/1000012105|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221031-WA0035.mp4|video/mp4|640|352|270|3296961||1667255619|1667255632372|0|11584|0|0|||||||| +6730|1000012022|content://media/external/video/media/1000012022|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221031-WA0007.mp4|video/mp4|224|224|0|113433||1667218074|1667218074795|0|5701|0|0|||||||| +6731|1000011945|content://media/external/video/media/1000011945|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221030-WA0003.mp4|video/mp4|288|640|0|315928||1667128961|1667128962036|0|2321|0|0|||||||| +6732|1000011949|content://media/external/video/media/1000011949|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221030-WA0004.mp4|video/mp4|288|640|0|1879220||1667128962|1667128962930|0|16857|0|0|||||||| +6733|1000011941|content://media/external/video/media/1000011941|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221030-WA0002.mp4|video/mp4|288|640|0|2451721||1667128959|1667128961650|0|22616|0|0|||||||| +6734|1000011840|content://media/external/video/media/1000011840|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0012.mp4|video/mp4|480|848|90|35198500||1667004164|1667004180867|0|94505|0|0|||||||| +6735|1000011830|content://media/external/video/media/1000011830|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0011.mp4|video/mp4|848|480|0|37531175||1667000645|1667002731914|0|217803|0|0|||||||| +6736|1000011826|content://media/external/video/media/1000011826|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0010.mp4|video/mp4|848|480|0|44480593||1667000583|1667002718542|0|266077|0|0|||||||| +6737|1000011819|content://media/external/video/media/1000011819|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0008.mp4|video/mp4|848|480|0|13299498||1667000432|1667000439228|0|66989|0|0|||||||| +6738|1000011806|content://media/external/video/media/1000011806|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0004.mp4|video/mp4|848|480|0|5632931||1667000357|1667000361627|0|27051|0|0|||||||| +6739|1000011793|content://media/external/video/media/1000011793|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221029-WA0000.mp4|video/mp4|848|480|90|2196126||1667000322|1667000323825|0|10309|0|0|||||||| +6740|1000011562|content://media/external/video/media/1000011562|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221025-WA0005.mp4|video/mp4|640|352|90|1392891||1666691434|1666691435397|0|4650|0|0|||||||| +6741|1000011179|content://media/external/video/media/1000011179|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20221021-WA0001.mp4|video/mp4|150|150|0|32839||1666372039|1666372039963|0|640|0|0|||||||| +6742|1000011065|content://media/external/video/media/1000011065|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221020-WA0004.mp4|video/mp4|432|240|0|5035580||1666260391|1666260394544|0|87399|0|0|||||||| +6743|1000011031|content://media/external/video/media/1000011031|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221019-WA0008.mp4|video/mp4|848|480|0|26833118||1666213862|1666213877520|0|146819|0|0|||||||| +6744|1000010944|content://media/external/video/media/1000010944|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221017-WA0008.mp4|video/mp4|640|352|0|10036617||1666029205|1666029207909|0|19221|0|0|||||||| +6745|1000010940|content://media/external/video/media/1000010940|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221017-WA0007.mp4|video/mp4|640|352|0|18053710||1666029200|1666029205012|0|35648|0|0|||||||| +6746|1000010894|content://media/external/video/media/1000010894|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221016-WA0015.mp4|video/mp4|640|352|90|8681455||1665929156|1665929179151|0|30720|0|0|||||||| +6747|1000010822|content://media/external/video/media/1000010822|/storage/emulated/0/Download/Patate in padella.mp4|video/mp4|720|1280|0|5704055||1665848946|1665848853124|0|20781|0|0|||||||| +6748|1000010771|content://media/external/video/media/1000010771|/storage/emulated/0/DCIM/Camera/20221014_190106_201.mp4|video/mp4|1440|2560|0|392447466||1665766997|1665766997000|0|38229|0|0|||||||| +6749|1000010770|content://media/external/video/media/1000010770|/storage/emulated/0/DCIM/Camera/20221014_185904_770.mp4|video/mp4|2560|1440|0|320517278||1665766865|1665766865000|0|31296|0|0|||||||| +6750|1000010767|content://media/external/video/media/1000010767|/storage/emulated/0/DCIM/Camera/20221014_185348_840.mp4|video/mp4|1920|1080|0|40783880||1665766429|1665766430448|0|12693|0|0|||||||| +6751|1000010125|content://media/external/video/media/1000010125|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20221007-WA0021.mp4|video/mp4|640|352|0|20225149||1665145116|1665145124250|0|87936|0|0|||||||| +6752|1000009934|content://media/external/video/media/1000009934|/storage/emulated/0/DCIM/Camera/VID_20221005_230418.mp4|video/mp4|1920|1080|0|51489574||1665003858|1665003884893|1665003884000|24048|0|0|||||||| +6753|1000009933|content://media/external/video/media/1000009933|/storage/emulated/0/DCIM/Camera/VID_20221005_230236.mp4|video/mp4|1920|1080|0|189422128||1665003756|1665003857365|1665003856000|98240|0|0|||||||| +6754|1000009643|content://media/external/video/media/1000009643|/storage/emulated/0/Pictures/WeChat/wx_camera_1664620972115.mp4|video/mp4|576|1280|0|1729347||1664620972|1664620972193|0|5620|0|0|||||||| +6755|1000009546|content://media/external/video/media/1000009546|/storage/emulated/0/DCIM/Camera/20220930_214936_763.mp4|video/mp4|1920|1080|0|32824807||1664567377|1664567378004|0|8618|0|0|||||||| +6756|1000009540|content://media/external/video/media/1000009540|/storage/emulated/0/DCIM/Camera/20220930_202158_698.mp4|video/mp4|1920|1080|0|104188103||1664562240|1664562240000|0|26026|0|0|||||||| +6757|1000009539|content://media/external/video/media/1000009539|/storage/emulated/0/DCIM/Camera/20220930_201703_531.mp4|video/mp4|1920|1080|0|57609067||1664561860|1664561860000|0|14101|0|0|||||||| +6758|1000009535|content://media/external/video/media/1000009535|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220930-WA0003.mp4|video/mp4|320|178|0|38511||1664552748|1664552748753|0|750|0|0|||||||| +6759|1000009495|content://media/external/video/media/1000009495|/storage/emulated/0/DCIM/Camera/20220930_105805_646.mp4|video/mp4|1920|1080|0|383938540||1664528937|1664528937000|0|116455|0|0|||||||| +6760|1000009494|content://media/external/video/media/1000009494|/storage/emulated/0/DCIM/Camera/20220930_095757_388.mp4|video/mp4|1920|1080|0|472286429||1664525356|1664525356000|0|145695|0|0|||||||| +6761|1000009427|content://media/external/video/media/1000009427|/storage/emulated/0/DCIM/Camera/VID_20220928_230030.mp4|video/mp4|1920|1080|0|144085539||1664398830|1664398910954|1664398910000|78677|0|0|||||||| +6762|1000009165|content://media/external/video/media/1000009165|/storage/emulated/0/DCIM/Camera/20220928_200243_281.mp4|video/mp4|1920|1080|0|35845075||1664388163|1664388164630|0|10600|0|0|||||||| +6763|1000009164|content://media/external/video/media/1000009164|/storage/emulated/0/DCIM/Camera/20220928_200047_268.mp4|video/mp4|1920|1080|0|36040723||1664388048|1664388048900|0|10600|0|0|||||||| +6764|1000009051|content://media/external/video/media/1000009051|/storage/emulated/0/DCIM/Camera/VID_20220927_103815(0).mp4|video/mp4|1920|1080|0|26334711||1664268022|1664268022000|1664268022000|12400|0|0|||||||| +6765|1000008548|content://media/external/video/media/1000008548|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220919-WA0002.mp4|video/mp4|640|352|90|45530393||1663579867|1663579901141|0|284791|0|0|||||||| +6766|63556|content://media/external/video/media/63556|/storage/emulated/0/DCIM/undefined_1657865629721.mp4|video/mp4|960|540|0|14526678||1657865677|1657865677203|0|50873|0|0|||||||| +6767|63264|content://media/external/video/media/63264|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220710-WA0020.mp4|video/mp4|640|352|90|25768789||1657438046|1657438058289|0|90901|0|0|||||||| +6768|63134|content://media/external/video/media/63134|/storage/emulated/0/Video/FOCACCIA MILLE BOLLE croccante fuori e soffice dentro SENZA SPORCARSI LE MANI_Full-HD.mp4|video/mp4|1920|1080|0|150882716||1657270285|1657270312762|0|610150|0|0|||||||| +6769|62771|content://media/external/video/media/62771|/storage/emulated/0/DCIM/efa55a1cf611be98b21071c4a607f117_bryton_1656698122494.mp4|video/mp4|960|540|0|12450612||1656698223|1656698223831|0|38373|0|0|||||||| +6770|62596|content://media/external/video/media/62596|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220628-WA0000.mp4|video/mp4|848|480|0|9376728||1656406561|1656406568439|0|52273|0|0|||||||| +6771|62411|content://media/external/video/media/62411|/storage/emulated/0/DCIM/0781365561-7757512607_amazfit_1656190184806.mp4|video/mp4|960|540|0|9424634||1656190271|1656190271662|0|56040|0|0|||||||| +6772|62409|content://media/external/video/media/62409|/storage/emulated/0/DCIM/2918695561-7757512607_amazfit_1656189786615.mp4|video/mp4|960|540|0|13184066||1656189873|1656189873674|0|63673|0|0|||||||| +6773|62291|content://media/external/video/media/62291|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220624-WA0020.mp4|video/mp4|640|352|90|5080243||1656088472|1656088480283|0|17094|0|0|||||||| +6774|62287|content://media/external/video/media/62287|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220624-WA0019.mp4|video/mp4|640|352|90|17846429||1656088456|1656088466213|0|61312|0|0|||||||| +6775|62276|content://media/external/video/media/62276|/storage/emulated/0/DCIM/GoPro-Exports/GX010705_1656082665580.MP4|video/mp4|3840|2160|0|72056988||1656082922|1656082923141|1656082556000|9460|0|0|||||||| +6776|62249|content://media/external/video/media/62249|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220624-WA0009.mp4|video/mp4|640|352|90|4710941||1656080018|1656080023857|0|17160|0|0|||||||| +6777|62150|content://media/external/video/media/62150|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Video/VID-20220623-WA0026.mp4|video/mp4|640|352|90|2436282||1655998713|1656001671280|0|12330|0|0|||||||| +6778|61988|content://media/external/video/media/61988|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220623-WA0000.mp4|video/mp4|848|480|180|36244499||1655938437|1655963079240|0|209049|0|0|||||||| +6779|61971|content://media/external/video/media/61971|/storage/emulated/0/DCIM/GoPro-Exports/GH010595_1655894512765.MP4|video/mp4|1920|1080|0|1332932426||1655894664|1655894672559|1655894108000|235460|0|0|||||||| +6780|61970|content://media/external/video/media/61970|/storage/emulated/0/DCIM/GoPro-Exports/GH010594_1655894052790.MP4|video/mp4|1920|1080|0|612270541||1655894461|1655894464783|1655893848000|108080|0|0|||||||| +6781|61855|content://media/external/video/media/61855|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220621-WA0005.mp4|video/mp4|640|352|0|8197836||1655823424|1655823427253|0|25514|0|0|||||||| +6782|61851|content://media/external/video/media/61851|/storage/emulated/0/DCIM/GoPro-Exports/GH010590_1655822870693.MP4|video/mp4|1920|1080|0|357905634||1655822926|1655822929094|1655803018000|63160|0|0|||||||| +6783|61852|content://media/external/video/media/61852|/storage/emulated/0/DCIM/GoPro-Exports/GH010589_1655822870693.MP4|video/mp4|1920|1080|0|48888934||1655822929|1655822929562|1655800068000|8520|0|0|||||||| +6784|61784|content://media/external/video/media/61784|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220620-WA0008.mp4|video/mp4|640|352|0|13124230||1655721301|1655721307755|0|42218|0|0|||||||| +6785|61686|content://media/external/video/media/61686|/storage/emulated/0/DCIM/GoPro-Exports/GH010581_1655643416125.MP4|video/mp4|1920|1080|0|445231224||1655643475|1655643478826|1655469406000|78600|0|0|||||||| +6786|61286|content://media/external/video/media/61286|/storage/emulated/0/DCIM/GoPro-Exports/_.mp4|video/mp4|1920|1080|0|699524818||1655469626|1655469631114|1655468862000|233314|0|0|||||||| +6787|61222|content://media/external/video/media/61222|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220616-WA0005.mp4|video/mp4|640|352|0|6199063||1655384557|1655384570151|0|21504|0|0|||||||| +6788|61202|content://media/external/video/media/61202|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220616-WA0001.mp4|video/mp4|848|480|90|54533403||1655334164|1655334376958|0|335876|0|0|||||||| +6789|61198|content://media/external/video/media/61198|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220616-WA0000.mp4|video/mp4|640|352|0|50831870||1655330206|1655334354988|0|388736|0|0|||||||| +6790|60891|content://media/external/video/media/60891|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220615-WA0017.mp4|video/mp4|480|624|0|2700965||1655303586|1655303588381|0|42771|0|0|||||||| +6791|60890|content://media/external/video/media/60890|/storage/emulated/0/Download/InsMate/post_10000000_890310339038306_5110097143848137540_n.mp4|video/mp4|720|406|0|39495749||1655299976|1655299979902|0|501620|0|0|||||||| +6792|60678|content://media/external/video/media/60678|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220614-WA0016.mp4|video/mp4|640|352|0|4770165||1655227626|1655227629995|0|19242|0|0|||||||| +6793|60671|content://media/external/video/media/60671|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220614-WA0014.mp4|video/mp4|848|480|90|5948513||1655220389|1655220392365|0|28606|0|0|||||||| +6794|60646|content://media/external/video/media/60646|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220614-WA0004.mp4|video/mp4|1920|1088|0|11897229||1655203243|1655203250751|0|204778|0|0|||||||| +6795|60621|content://media/external/video/media/60621|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0063.mp4|video/mp4|848|480|90|6499169||1655157053|1655157058024|0|31393|0|0|||||||| +6796|60617|content://media/external/video/media/60617|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0062.mp4|video/mp4|848|480|90|4230408||1655157037|1655157038685|0|20131|0|0|||||||| +6797|60613|content://media/external/video/media/60613|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0061.mp4|video/mp4|848|480|90|7090968||1655157024|1655157026763|0|34342|0|0|||||||| +6798|60609|content://media/external/video/media/60609|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0060.mp4|video/mp4|640|352|0|29489746||1655156976|1655156992718|0|163946|0|0|||||||| +6799|60602|content://media/external/video/media/60602|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0059.mp4|video/mp4|848|480|0|14111459||1655148115|1655148121356|0|71238|0|0|||||||| +6800|60526|content://media/external/video/media/60526|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0052.mp4|video/mp4|640|352|90|40862448||1655125415|1655134349526|0|198524|0|0|||||||| +6801|60558|content://media/external/video/media/60558|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0051.mp4|video/mp4|640|352|90|42250389||1655125470|1655134331572|0|208999|0|0|||||||| +6802|60578|content://media/external/video/media/60578|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220613-WA0050.mp4|video/mp4|224|320|0|119296||1655133467|1655133467688|0|6002|0|0|||||||| +6803|60562|content://media/external/video/media/60562|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0045.mp4|video/mp4|640|352|90|394734||1655125470|1655125471045|0|1388|0|0|||||||| +6804|60554|content://media/external/video/media/60554|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0044.mp4|video/mp4|640|352|90|17761433||1655125461|1655125469995|0|68649|0|0|||||||| +6805|60550|content://media/external/video/media/60550|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0043.mp4|video/mp4|640|352|90|19786633||1655125453|1655125461152|0|77694|0|0|||||||| +6806|60546|content://media/external/video/media/60546|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0042.mp4|video/mp4|640|352|90|5970320||1655125450|1655125453066|0|21161|0|0|||||||| +6807|60542|content://media/external/video/media/60542|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0041.mp4|video/mp4|640|352|90|18981894||1655125439|1655125450166|0|73940|0|0|||||||| +6808|60538|content://media/external/video/media/60538|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0040.mp4|video/mp4|640|352|90|9994064||1655125435|1655125439829|0|36543|0|0|||||||| +6809|60534|content://media/external/video/media/60534|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0039.mp4|video/mp4|640|352|90|26646582||1655125424|1655125435506|0|110888|0|0|||||||| +6810|60530|content://media/external/video/media/60530|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0038.mp4|video/mp4|640|352|90|21504320||1655125415|1655125424588|0|85652|0|0|||||||| +6811|60516|content://media/external/video/media/60516|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0035.mp4|video/mp4|640|352|90|9085201||1655125410|1655125414596|0|32916|0|0|||||||| +6812|60512|content://media/external/video/media/60512|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0034.mp4|video/mp4|640|352|90|5799775||1655125408|1655125410360|0|20461|0|0|||||||| +6813|60508|content://media/external/video/media/60508|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0033.mp4|video/mp4|640|352|90|25643842||1655125396|1655125408050|0|105747|0|0|||||||| +6814|60489|content://media/external/video/media/60489|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0027.mp4|video/mp4|640|352|90|24299110||1655125385|1655125394539|0|99074|0|0|||||||| +6815|60455|content://media/external/video/media/60455|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0016.mp4|video/mp4|640|352|90|1878624||1655125380|1655125381671|0|6527|0|0|||||||| +6816|60439|content://media/external/video/media/60439|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0011.mp4|video/mp4|640|352|90|26667364||1655125368|1655125378636|0|111016|0|0|||||||| +6817|60399|content://media/external/video/media/60399|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0006.mp4|video/mp4|480|848|0|5098569||1655075299|1655103979534|0|24288|0|0|||||||| +6818|60407|content://media/external/video/media/60407|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0005.mp4|video/mp4|480|848|0|11911492||1655075266|1655103956430|0|59605|0|0|||||||| +6819|60409|content://media/external/video/media/60409|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220613-WA0001.mp4|video/mp4|640|368|0|20269781||1655075234|1655098586801|0|320528|0|0|||||||| +6820|60378|content://media/external/video/media/60378|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220612-WA0003.mp4|video/mp4|640|352|0|37937396||1655041200|1655041229685|0|187966|0|0|||||||| +6821|60277|content://media/external/video/media/60277|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220611-WA0000.mp4|video/mp4|640|352|0|54301319||1654898674|1654898699618|0|301079|0|0|||||||| +6822|60215|content://media/external/video/media/60215|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220610-WA0013.mp4|video/mp4|1072|1920|0|4766223||1654853702|1654853708998|1654853708000|5162|0|0|||||||| +6823|60169|content://media/external/video/media/60169|/storage/emulated/0/DCIM/GoPro-Exports/Nueva_Pandilla.mp4|video/mp4|1920|1080|0|65765636||1654798356|1654798357099|1654797415000|33877|0|0|||||||| +6824|60165|content://media/external/video/media/60165|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220609-WA0045.mp4|video/mp4|640|352|0|45651704||1654794971|1654794995133|0|255095|0|0|||||||| +6825|60033|content://media/external/video/media/60033|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220609-WA0001.mp4|video/mp4|160|118|0|50698||1654754803|1654754803891|0|2459|0|0|||||||| +6826|60021|content://media/external/video/media/60021|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220609-WA0000.mp4|video/mp4|848|480|90|6839153||1654725685|1654725688719|0|33111|0|0|||||||| +6827|60017|content://media/external/video/media/60017|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220608-WA0017.mp4|video/mp4|640|352|0|16802128||1654724292|1654724360220|0|110464|0|0|||||||| +6828|60013|content://media/external/video/media/60013|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220608-WA0016.mp4|video/mp4|848|480|90|16643326||1654724251|1654724261640|0|85658|0|0|||||||| +6829|59912|content://media/external/video/media/59912|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220607-WA0019.mp4|video/mp4|640|352|0|28390608||1654626091|1654626105755|0|151920|0|0|||||||| +6830|59886|content://media/external/video/media/59886|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220607-WA0016.mp4|video/mp4|640|352|0|19827445||1654615264|1654615272837|0|91960|0|0|||||||| +6831|59828|content://media/external/video/media/59828|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220606-WA0025.mp4|video/mp4|848|480|90|15050745||1654551818|1654551825021|0|76858|0|0|||||||| +6832|59824|content://media/external/video/media/59824|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220606-WA0024.mp4|video/mp4|848|480|90|10811439||1654551790|1654551795563|0|53730|0|0|||||||| +6833|59820|content://media/external/video/media/59820|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220606-WA0023.mp4|video/mp4|640|352|0|27596274||1654551248|1654551262028|0|156885|0|0|||||||| +6834|59433|content://media/external/video/media/59433|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0011.mp4|video/mp4|848|480|270|1147568||1654171767|1654171769623|0|5363|0|0|||||||| +6835|48594|content://media/external/video/media/48594|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0005.mp4|video/mp4|848|480|90|17751141||1654121056|1654121063934|0|92020|0|0|||||||| +6836|48590|content://media/external/video/media/48590|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0004.mp4|video/mp4|848|480|90|10176412||1654120923|1654120926518|0|50340|0|0|||||||| +6837|48586|content://media/external/video/media/48586|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0003.mp4|video/mp4|848|480|90|11722101||1654120900|1654120905193|0|58467|0|0|||||||| +6838|48582|content://media/external/video/media/48582|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0002.mp4|video/mp4|848|480|90|12642494||1654120878|1654120882755|0|63436|0|0|||||||| +6839|48578|content://media/external/video/media/48578|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0001.mp4|video/mp4|848|480|90|6059078||1654120842|1654120844673|0|29141|0|0|||||||| +6840|48574|content://media/external/video/media/48574|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220602-WA0000.mp4|video/mp4|848|480|90|29003659||1654120831|1654120842177|0|161169|0|0|||||||| +6841|47954|content://media/external/video/media/47954|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220525-WA0010.mp4|video/mp4|848|480|90|6064636||1653515015|1653515020254|0|29141|0|0|||||||| +6842|47950|content://media/external/video/media/47950|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220525-WA0009.mp4|video/mp4|848|480|90|29005489||1653514973|1653514988430|0|161169|0|0|||||||| +6843|47677|content://media/external/video/media/47677|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220522-WA0000.mp4|video/mp4|848|480|180|31166200||1653174586|1653174602936|0|177841|0|0|||||||| +6844|47670|content://media/external/video/media/47670|/storage/emulated/0/DCIM/Creative/Screenrecorder-2022-05-21-16-15-35-278(0).mp4|video/mp4|1080|2400|0|24975077||1653142687|1653142687000|1653142687000|9766|0|0|||||||| +6845|47669|content://media/external/video/media/47669|/storage/emulated/0/DCIM/ScreenRecorder/Screenrecorder-2022-05-21-16-15-35-278.mp4|video/mp4|1080|2400|0|11824973||1653142535|1653142562543|1653142562000|26059|0|0|||||||| +6846|47666|content://media/external/video/media/47666|/storage/emulated/0/DCIM/Camera/VID_20220521_160634.mp4|video/mp4|1920|1080|0|11765707||1653141994|1653142001759|1653142000000|3712|0|0|||||||| +6847|47665|content://media/external/video/media/47665|/storage/emulated/0/Movies/Whatsapp/VID-20220521-WA0017.mp4|video/mp4|640|352|0|5297470||1653141772|1653141772764|0|28886|0|0|||||||| +6848|47577|content://media/external/video/media/47577|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220520-WA0013.mp4|video/mp4|848|480|180|54345018||1653056822|1653062510342|0|334042|0|0|||||||| +6849|47567|content://media/external/video/media/47567|/storage/emulated/0/DCIM/Camera/VID_20220520_144059.mp4|video/mp4|1920|1080|0|90860657||1653050459|1653050500479|1653050499000|37888|0|0|||||||| +6850|47556|content://media/external/video/media/47556|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220520-WA0008.mp4|video/mp4|240|432|0|901306||1653048483|1653048485839|0|15000|0|0|||||||| +6851|47504|content://media/external/video/media/47504|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220519-WA0020.mp4|video/mp4|640|288|0|5867035||1652982716|1652982720605|0|29648|0|0|||||||| +6852|47491|content://media/external/video/media/47491|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220519-WA0019.mp4|video/mp4|200|200|0|53668||1652976148|1652976148672|0|1200|0|0|||||||| +6853|47487|content://media/external/video/media/47487|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220519-WA0018.mp4|video/mp4|132|154|0|209755||1652973859|1652973859696|0|4920|0|0|||||||| +6854|47476|content://media/external/video/media/47476|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220519-WA0013.mp4|video/mp4|352|640|0|3359134||1652959437|1652959439688|0|12736|0|0|||||||| +6855|47433|content://media/external/video/media/47433|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220519-WA0001.mp4|video/mp4|254|254|0|183028||1652938883|1652938915133|0|3375|0|0|||||||| +6856|47389|content://media/external/video/media/47389|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220518-WA0033.mp4|video/mp4|848|480|0|5508993||1652881874|1652881876560|0|26424|0|0|||||||| +6857|47356|content://media/external/video/media/47356|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220518-WA0022.mp4|video/mp4|848|480|0|13486098||1652873603|1652873611894|0|31486|0|0|||||||| +6858|47347|content://media/external/video/media/47347|/storage/emulated/0/DCIM/Camera/VID_20220518_133018.mp4|video/mp4|1920|1080|0|78032917||1652873418|1652873448373|1652873447000|27545|0|0|||||||| +6859|47344|content://media/external/video/media/47344|/storage/emulated/0/DCIM/Camera/VID_20220518_132554.mp4|video/mp4|1920|1080|90|30039358||1652873154|1652873170772|1652873170000|13845|0|0|||||||| +6860|47217|content://media/external/video/media/47217|/storage/emulated/0/Movies/Whatsapp/VID-20220505-WA0014(1).mp4|video/mp4|640|352|0|11186336||1652718212|1652718212298|0|67456|0|0|||||||| +6861|47216|content://media/external/video/media/47216|/storage/emulated/0/Movies/Whatsapp/VID-20220505-WA0013(1).mp4|video/mp4|640|352|0|14849659||1652718207|1652718207954|0|105386|0|0|||||||| +6862|46941|content://media/external/video/media/46941|/storage/emulated/0/Movies/Whatsapp/VID-20220505-WA0013.mp4|video/mp4|640|352|0|14849659||1652290593|1652290593320|0|105386|0|0|||||||| +6863|46940|content://media/external/video/media/46940|/storage/emulated/0/Movies/Whatsapp/VID-20220505-WA0014.mp4|video/mp4|640|352|0|11186336||1652290586|1652290586592|0|67456|0|0|||||||| +6864|46755|content://media/external/video/media/46755|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220509-WA0002.mp4|video/mp4|640|352|90|7518305||1652078792|1652078795514|0|40704|0|0|||||||| +6865|46734|content://media/external/video/media/46734|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220508-WA0014.mp4|video/mp4|640|352|0|32364202||1652016550|1652016559908|0|167658|0|0|||||||| +6866|46349|content://media/external/video/media/46349|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220508-WA0006.mp4|video/mp4|640|352|90|28943269||1651996989|1651997013342|0|169472|0|0|||||||| +6867|46342|content://media/external/video/media/46342|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220508-WA0005.mp4|video/mp4|480|480|0|88387||1651996475|1651996476452|0|640|0|0|||||||| +6868|46336|content://media/external/video/media/46336|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20220508-WA0003.mp4|video/mp4|224|160|0|25557||1651994543|1651994544184|0|909|0|0|||||||| +6869|46319|content://media/external/video/media/46319|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220508-WA0001.mp4|video/mp4|640|352|90|33287842||1651960963|1651989410193|0|169493|0|0|||||||| +6870|46318|content://media/external/video/media/46318|/storage/emulated/0/DCIM/Camera/VID_20220507_230925.mp4|video/mp4|1920|1080|0|449837489||1651957765|1651957960904|1651957960000|193493|0|0|||||||| +6871|45604|content://media/external/video/media/45604|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220505-WA0014.mp4|video/mp4|640|352|0|11186336||1651748476|1651748488324|0|67456|0|0|||||||| +6872|45600|content://media/external/video/media/45600|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220505-WA0013.mp4|video/mp4|640|352|0|14849659||1651748450|1651748476466|0|105386|0|0|||||||| +6873|44318|content://media/external/video/media/44318|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220428-WA0033.mp4|video/mp4|640|352|90|806621||1651151448|1651151449921|0|2937|0|0|||||||| +6874|44260|content://media/external/video/media/44260|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220428-WA0014.mp4|video/mp4|848|480|90|4529890||1651134551|1651134554457|0|21432|0|0|||||||| +6875|44196|content://media/external/video/media/44196|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220427-WA0010.mp4|video/mp4|576|1024|0|2996481||1651082732|1651082735345|0|52497|0|0|||||||| +6876|44023|content://media/external/video/media/44023|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220424-WA0017.mp4|video/mp4|640|352|90|736870||1650824652|1650824653449|0|3200|0|0|||||||| +6877|43840|content://media/external/video/media/43840|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220421-WA0002.mp4|video/mp4|848|480|0|1191479||1650496249|1650496250578|0|5433|0|0|||||||| +6878|43713|content://media/external/video/media/43713|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220417-WA0046.mp4|video/mp4|640|352|90|5931999||1650194259|1650194365221|0|22890|0|0|||||||| +6879|37425|content://media/external/video/media/37425|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220414-WA0000.mp4|video/mp4|640|352|90|25909873||1649914050|1649915802395|0|135914|0|0|||||||| +6880|37215|content://media/external/video/media/37215|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220411-WA0001.mp4|video/mp4|640|352|0|33570661||1649630122|1649630274588|0|171477|0|0|||||||| +6881|37206|content://media/external/video/media/37206|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220411-WA0000.mp4|video/mp4|640|352|90|33740138||1649626839|1649629017891|0|173013|0|0|||||||| +6882|37202|content://media/external/video/media/37202|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220410-WA0006.mp4|video/mp4|848|480|0|34303348||1649625628|1649625748844|0|196046|0|0|||||||| +6883|37086|content://media/external/video/media/37086|/storage/emulated/0/Download/COLOMBA INTRECCIATA VELOCE ricetta Pasquale casalinga Colomba in versione casalinga intrecciata, senza...fs#colomba #brioche #ricetta #colombaveloce uvetta #canditi #Pasqua #tuttiatavola2016 #cooking #easyrecipe #italiancolomba.mp4|video/mp4|1280|720|0|77934395||1649572035|1649572089397|0|634647|0|0|||||||| +6884|37049|content://media/external/video/media/37049|/storage/emulated/0/DCIM/Camera/63b3c20783ec3a17847e88fea8a8d286.mp4|video/mp4|576|1024|0|4770940||1649449221|1649449221391|0|26167|0|0|||||||| +6885|36693|content://media/external/video/media/36693|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220329-WA0004.mp4|video/mp4|352|640|0|6529876||1648556770|1648556782052|0|12493|0|0|||||||| +6886|35824|content://media/external/video/media/35824|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220313-WA0026.mp4|video/mp4|352|640|0|5096514||1647197438|1647197442679|0|19093|0|0|||||||| +6887|35524|content://media/external/video/media/35524|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220310-WA0000.mp4|video/mp4|640|352|90|9513514||1646867229|1646867252274|0|37845|0|0|||||||| +6888|34863|content://media/external/video/media/34863|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220227-WA0002.mp4|video/mp4|640|352|90|2161415||1645954337|1645954339746|0|21397|0|0|||||||| +6889|34707|content://media/external/video/media/34707|/storage/emulated/0/DCIM/Camera/VID_20220223_165136.mp4|video/mp4|1920|1080|0|74115708||1645631524|1645631524752|1645631524000|25621|0|0|||||||| +6890|34706|content://media/external/video/media/34706|/storage/emulated/0/DCIM/Camera/VID_20220223_164845.mp4|video/mp4|1920|1080|90|175304025||1645631395|1645631396226|1645631395000|67817|0|0|||||||| +6891|33978|content://media/external/video/media/33978|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220217-WA0001.mp4|video/mp4|848|480|90|7351058||1645052407|1645052412015|0|35758|0|0|||||||| +6892|33974|content://media/external/video/media/33974|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220217-WA0000.mp4|video/mp4|848|480|90|7309756||1645052402|1645052407025|0|35549|0|0|||||||| +6893|33402|content://media/external/video/media/33402|/storage/emulated/0/DCIM/Camera/VID_20220212_144114.mp4|video/mp4|1920|1080|0|147489200||1644673334|1644673334912|1644673334000|57898|0|0|||||||| +6894|32793|content://media/external/video/media/32793|/storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Video/VID-20220204-WA0005.mp4|video/mp4|640|352|90|29643950||1643988560|1643988581524|0|143530|0|0|||||||| +6895|32044|content://media/external/video/media/32044|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220130-WA0027.mp4|video/mp4|848|480|90|23854372||1643575629|1643575645621|0|127709|0|0|||||||| +6896|31731|content://media/external/video/media/31731|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220126-WA0015.mp4|video/mp4|848|480|90|3224112||1643234218|1643234222389|0|15232|0|0|||||||| +6897|31727|content://media/external/video/media/31727|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220126-WA0014.mp4|video/mp4|848|480|90|1151178||1643234217|1643234218307|0|5340|0|0|||||||| +6898|31723|content://media/external/video/media/31723|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220126-WA0013.mp4|video/mp4|848|480|90|4303089||1643234211|1643234217156|0|20572|0|0|||||||| +6899|31719|content://media/external/video/media/31719|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20220126-WA0012.mp4|video/mp4|848|480|90|4941683||1643234207|1643234211183|0|23754|0|0|||||||| +6900|20912|content://media/external/video/media/20912|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20211219-WA0018.mp4|video/mp4|848|480|90|21532308||1639935188|1639935200406|0|113266|0|0|||||||| +6901|20898|content://media/external/video/media/20898|/storage/emulated/0/DCIM/Camera/VID_20211219_160629.mp4|video/mp4|1920|1080|90|103475850||1639926430|1639926430385|1639926429000|39274|0|0|||||||| +6902|20891|content://media/external/video/media/20891|/storage/emulated/0/DCIM/Camera/VID_20211219_160257.mp4|video/mp4|1920|1080|90|6748750||1639926182|1639926183052|1639926182000|1798|0|0|||||||| +6903|20890|content://media/external/video/media/20890|/storage/emulated/0/DCIM/Camera/VID_20211219_160204.mp4|video/mp4|1920|1080|90|42426934||1639926141|1639926141861|1639926141000|15658|0|0|||||||| +6904|20687|content://media/external/video/media/20687|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20211215-WA0008.mp4|video/mp4|640|352|0|10890493||1639606003|1639606013123|0|46933|0|0|||||||| +6905|20147|content://media/external/video/media/20147|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20211207-WA0018.mp4|video/mp4|640|352|90|1509998||1638892295|1638898179822|0|7296|0|0|||||||| +6906|20079|content://media/external/video/media/20079|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20211207-WA0000.mp4|video/mp4|640|352|90|37339371||1638865658|1638865803635|0|203882|0|0|||||||| +6907|19884|content://media/external/video/media/19884|/storage/emulated/0/DCIM/Camera/VID_20211206_120640.mp4|video/mp4|1920|1080|0|150973255||1638788859|1638788859857|1638788859000|57044|0|0|||||||| +6908|11277|content://media/external/video/media/11277|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20211125-WA0000.mp4|video/mp4|432|226|0|116900||1637819410|1637819411083|0|3090|0|0|||||||| +6909|9212|content://media/external/video/media/9212|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Animated Gifs/VID-20211120-WA0002.mp4|video/mp4|394|218|0|105959||1637527257|1637527257652|0|2400|0|0|||||||| +6910|5232|content://media/external/video/media/5232|/storage/emulated/0/DCIM/Camera/VID_20211031_105930.mp4|video/mp4|1920|1080|0|34815573||1637508194|1635674385000|1635674384000|13077|0|0|||||||| +6911|5204|content://media/external/video/media/5204|/storage/emulated/0/DCIM/Camera/VID_20210918_105932.mp4|video/mp4|1920|1080|90|152260621||1637507872|1631955633000|1631955632000|59562|0|0|||||||| +6912|5237|content://media/external/video/media/5237|/storage/emulated/0/DCIM/Camera/VID_20210918_103101.mp4|video/mp4|1920|1080|0|36783212||1637508238|1631953877000|1631953876000|13957|0|0|||||||| +6913|5211|content://media/external/video/media/5211|/storage/emulated/0/DCIM/Camera/VID_20210918_103050.mp4|video/mp4|1920|1080|0|19286643||1637507953|1631953858000|1631953858000|6912|0|0|||||||| +6914|5225|content://media/external/video/media/5225|/storage/emulated/0/DCIM/Camera/VID_20210918_103001.mp4|video/mp4|1920|1080|0|19341904||1637508092|1631953809000|1631953809000|6996|0|0|||||||| +6915|5238|content://media/external/video/media/5238|/storage/emulated/0/DCIM/Camera/VID_20210911_092203.mp4|video/mp4|1920|1080|90|123840537||1637508246|1631344973000|1631344972000|48434|0|0|||||||| +6916|5224|content://media/external/video/media/5224|/storage/emulated/0/DCIM/Camera/VID_20210911_091851.mp4|video/mp4|1920|1080|0|53012394||1637508092|1631344753000|1631344752000|20352|0|0|||||||| +6917|5210|content://media/external/video/media/5210|/storage/emulated/0/DCIM/Camera/VID_20210901_143122.mp4|video/mp4|1920|1080|0|13775909||1637507953|1630499488000|1630499488000|4692|0|0|||||||| +6918|5245|content://media/external/video/media/5245|/storage/emulated/0/DCIM/Camera/VID_20210901_143011.mp4|video/mp4|1920|1080|0|13009204||1637508323|1630499417000|1630499416000|4425|0|0|||||||| +6919|5213|content://media/external/video/media/5213|/storage/emulated/0/DCIM/Camera/VID_20210901_114807.mp4|video/mp4|1920|1080|270|43196594||1637507955|1630489705000|1630489705000|16471|0|0|||||||| +6920|5249|content://media/external/video/media/5249|/storage/emulated/0/DCIM/Camera/VID_20210901_102411.mp4|video/mp4|1920|1080|0|41623455||1637508324|1630484669000|1630484668000|15872|0|0|||||||| +6921|5240|content://media/external/video/media/5240|/storage/emulated/0/DCIM/Camera/VID_20210901_102349.mp4|video/mp4|1920|1080|0|25301364||1637508289|1630484641000|1630484640000|9472|0|0|||||||| +6922|5236|content://media/external/video/media/5236|/storage/emulated/0/DCIM/Camera/VID_20210607_172321.mp4|video/mp4|1920|1080|0|64109676||1637508238|1623079428000|1623079427000|24704|0|0|||||||| +6923|5228|content://media/external/video/media/5228|/storage/emulated/0/DCIM/Camera/VID_20210522_181454.mp4|video/mp4|1920|1080|90|134743866||1637508138|1621700148000|1621700148000|53065|0|0|||||||| +6924|5234|content://media/external/video/media/5234|/storage/emulated/0/DCIM/Camera/VID_20210515_102613.mp4|video/mp4|1920|1080|0|30781004||1637508238|1621067186000|1621067186000|11925|0|0|||||||| +6925|5244|content://media/external/video/media/5244|/storage/emulated/0/DCIM/Camera/VID_20210515_102546.mp4|video/mp4|1920|1080|0|27033594||1637508323|1621067157000|1621067157000|10359|0|0|||||||| +6926|5247|content://media/external/video/media/5247|/storage/emulated/0/DCIM/Camera/VID_20210501_122842.mp4|video/mp4|1280|720|90|11624942||1637508324|1619864930000|1619864930000|10000|0|0|||||||| +6927|5223|content://media/external/video/media/5223|/storage/emulated/0/DCIM/Camera/VID_20210501_122821_HSR_240.mp4|video/mp4|1280|720|90|94284966||1637508092|1619864916000|1619864916000|13450|0|0|||||||| +6928|5203|content://media/external/video/media/5203|/storage/emulated/0/DCIM/Camera/VID_20210501_122759.mp4|video/mp4|1280|720|90|11380526||1637507864|1619864888000|1619864888000|10000|0|0|||||||| +6929|5230|content://media/external/video/media/5230|/storage/emulated/0/DCIM/Camera/VID_20210501_122030_HSR_12045926572.mp4|video/mp4|1280|720|90|19814325||1637508194|1619864517000|1619864517000|16937|0|0|||||||| +6930|5235|content://media/external/video/media/5235|/storage/emulated/0/DCIM/Camera/VID_20210501_122030_HSR_120.mp4|video/mp4|1280|720|90|39542524||1637508238|1619864442000|1619864442000|10950|0|0|||||||| +6931|5217|content://media/external/video/media/5217|/storage/emulated/0/DCIM/Camera/VID_20210501_121250_HSR_120.mp4|video/mp4|1280|720|0|40455690||1637507982|1619863983000|1619863983000|11241|0|0|||||||| +6932|5209|content://media/external/video/media/5209|/storage/emulated/0/DCIM/Camera/VID_20210501_121137.mp4|video/mp4|1920|1080|90|4548164||1637507953|1619863902000|1619863902000|1300|0|0|||||||| +6933|5208|content://media/external/video/media/5208|/storage/emulated/0/DCIM/Camera/VID_20210501_121113_HSR_120.mp4|video/mp4|1280|720|90|39843042||1637507953|1619863885000|1619863885000|11103|0|0|||||||| +6934|5229|content://media/external/video/media/5229|/storage/emulated/0/DCIM/Camera/VID_20210501_121104_HSR_120.mp4|video/mp4|1280|720|90|23004725||1637508194|1619863871000|1619863871000|6361|0|0|||||||| +6935|5233|content://media/external/video/media/5233|/storage/emulated/0/DCIM/Camera/VID_20210501_111206.mp4|video/mp4|1920|1080|90|87620333||1637508238|1619860362000|1619860362000|34390|0|0|||||||| +6936|5199|content://media/external/video/media/5199|/storage/emulated/0/DCIM/367262990/VIDEO_20201227_143745341.mp4|video/mp4|2304|1296|0|918876||1637507864|1609076265000|0|8748|0|0|||||||| +6937|5202|content://media/external/video/media/5202|/storage/emulated/0/DCIM/Camera/VID_20201128_093831.mp4|video/mp4|1920|1080|90|16825414||1637507864|1606552718000|1606552718000|6351|0|0|||||||| +6938|5222|content://media/external/video/media/5222|/storage/emulated/0/DCIM/Camera/VID_20200908_105431.mp4|video/mp4|1920|1080|90|33432311||1637508090|1599555285000|1599555285000|13013|0|0|||||||| +6939|5205|content://media/external/video/media/5205|/storage/emulated/0/DCIM/Camera/VID_20200718_120538.mp4|video/mp4|1920|1080|90|123009682||1637507916|1595066788000|1595066788000|48680|0|0|||||||| +6940|5207|content://media/external/video/media/5207|/storage/emulated/0/DCIM/Camera/VID_20200422_173459.mp4|video/mp4|1920|1080|90|3086084||1637507953|1587569702000|1587569702000|1164|0|0|||||||| +6941|5246|content://media/external/video/media/5246|/storage/emulated/0/DCIM/Camera/VID_20200328_211732.mp4|video/mp4|1920|1080|90|12703640||1637508324|1585426658000|1585426658000|4925|0|0|||||||| +6942|5201|content://media/external/video/media/5201|/storage/emulated/0/DCIM/Camera/VID_20200304_221509.mp4|video/mp4|1920|1080|0|103227509||1637507864|1583356551000|1583356551000|40783|0|0|||||||| +6943|5250|content://media/external/video/media/5250|/storage/emulated/0/DCIM/Camera/VID_20200222_211743.mp4|video/mp4|1920|1080|0|745776064||1637508433|1582402959000|1582402959000|295358|0|0|||||||| +6944|5221|content://media/external/video/media/5221|/storage/emulated/0/DCIM/Camera/VID_20200106_215632.mp4|video/mp4|1920|1080|90|65617938||1637508090|1578344219000|1578344219000|25813|0|0|||||||| +6945|5216|content://media/external/video/media/5216|/storage/emulated/0/DCIM/Camera/VID_20200101_000404.mp4|video/mp4|1920|1080|90|70650914||1637507981|1577833473000|1577833473000|27855|0|0|||||||| +6946|5206|content://media/external/video/media/5206|/storage/emulated/0/DCIM/Camera/VID_20191221_162658.mp4|video/mp4|1920|1080|0|87995481||1637507953|1576942054000|1576942054000|34742|0|0|||||||| +6947|7609|content://media/external/video/media/7609|/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Video/VID-20191207-WA0027.mp4|video/mp4|848|480|90|1603686||1637518223|1575733679000|1575726539000|7198|0|0|||||||| +6948|5220|content://media/external/video/media/5220|/storage/emulated/0/DCIM/Camera/VID_20191201_172255.mp4|video/mp4|1920|1080|90|2666010||1637508090|1575217377000|1575217377000|773|0|0|||||||| +6949|5215|content://media/external/video/media/5215|/storage/emulated/0/DCIM/Camera/VID_20191124_094017.mp4|video/mp4|1920|1080|90|6569692||1637507981|1574584820000|1574584820000|2337|0|0|||||||| +6950|5239|content://media/external/video/media/5239|/storage/emulated/0/DCIM/Camera/VID_20191123_175238.mp4|video/mp4|1920|1080|90|53494148||1637508289|1574527981000|1574527981000|21028|0|0|||||||| +6951|5214|content://media/external/video/media/5214|/storage/emulated/0/DCIM/Camera/VID_20191123_175146.mp4|video/mp4|1920|1080|90|15560523||1637507981|1574527913000|1574527913000|6000|0|0|||||||| +6952|5242|content://media/external/video/media/5242|/storage/emulated/0/DCIM/Camera/VID_20191018_183750.mp4|video/mp4|1920|1080|0|249796093||1637508306|1571416770000|1571416770000|98767|0|0|||||||| +6953|5219|content://media/external/video/media/5219|/storage/emulated/0/DCIM/Camera/VID_20190921_124555.mp4|video/mp4|1920|1080|90|56385712||1637508090|1569062779000|1569062779000|22310|0|0|||||||| +6954|5212|content://media/external/video/media/5212|/storage/emulated/0/DCIM/Camera/VID_20190921_121929.mp4|video/mp4|1920|1080|90|64138334||1637507955|1569061196000|1569061196000|25379|0|0|||||||| +6955|5200|content://media/external/video/media/5200|/storage/emulated/0/DCIM/Camera/VID_20190907_163811.mp4|video/mp4|1920|1080|0|41157835||1637507864|1567867108000|1567867108000|16289|0|0|||||||| +6956|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0092.JPG|image/jpeg|4032|3024||3492198|IMG_0092.JPG|1772345058||1503142214000||0|1|json@patachina|58ee63712f451dd7ddce249bb17dfcc21659e1db75435486146c7f102ead3577|photos/Fabio/original/2017Irlanda19-29ago/IMG_0092.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0092_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0092_avg.jpg|44.1768833333333|11.9566694444444|38.8885135135135 +6957|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0099.JPG|image/jpeg|4032|3024||3758888|IMG_0099.JPG|1772345058||1503481740000||0|1|json@patachina|1a1a90831160e7f1daa9c6472399a13a84483779444ebd6817c22c01dec4587a|photos/Fabio/original/2017Irlanda19-29ago/IMG_0099.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0099_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0099_avg.jpg|45.6661194444444|9.70110833333333|229.648888888889 +6958|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0100.JPG|image/jpeg|4032|3024||4131423|IMG_0100.JPG|1772345058||1503481741000||0|1|json@patachina|1a8fc54a85d62e11717888bbbbf5321986ba0b30156cc264c79a5738f3120950|photos/Fabio/original/2017Irlanda19-29ago/IMG_0100.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0100_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0100_avg.jpg|45.6661388888889|9.70108611111111|227.666826003824 +6959|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0102.JPG|image/jpeg|4032|3024||2534029|IMG_0102.JPG|1772345058||1503492270000||0|1|json@patachina|886d8247356abdcbd18c0c491b0e7bc0226950f07eb2221b9d865fda9667f72a|photos/Fabio/original/2017Irlanda19-29ago/IMG_0102.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0102_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0102_avg.jpg|53.3511166666667|-6.25125555555556|38.2533333333333 +6960|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0103.JPG|image/jpeg|4032|3024||3984165|IMG_0103.JPG|1772345058||1503493700000||0|1|json@patachina|f979a69b969f44afe4ad6c59d4efb5237cc4d78376c403f62d77fb4556b1fdb6|photos/Fabio/original/2017Irlanda19-29ago/IMG_0103.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0103_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0103_avg.jpg|53.344925|-6.256825|6.37160120845921 +6961|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0104.JPG|image/jpeg|4032|3024||1918664|IMG_0104.JPG|1772345058||1503494877000||0|1|json@patachina|44caebcb7660bff8b19d178706731fb833377c8ce33c49df18ef87760ba8b9d0|photos/Fabio/original/2017Irlanda19-29ago/IMG_0104.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0104_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0104_avg.jpg|53.3439305555556|-6.248975|10.2334365325077 +6962|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0106.JPG|image/jpeg|5326|3950||4338120|IMG_0106.JPG|1772345058||1503496121000||0|1|json@patachina|0b76d955c63a3be0f777d720f234402700be854ce432cc3621ec1fbb63e4bd02|photos/Fabio/original/2017Irlanda19-29ago/IMG_0106.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0106_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0106_avg.jpg|53.3439416666667|-6.24924722222222|7.3796928327645 +6963|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0107.JPG|image/jpeg|4032|3024||3159006|IMG_0107.JPG|1772345058||1503496785000||0|1|json@patachina|322546fe1e164430806c491e9b006ea208e252b100cf5376580482f5c1535ec4|photos/Fabio/original/2017Irlanda19-29ago/IMG_0107.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0107_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0107_avg.jpg|53.3448611111111|-6.25230555555556|7.89636462289745 +6964|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0108.JPG|image/jpeg|4032|3024||3338305|IMG_0108.JPG|1772345058||1503496787000||0|1|json@patachina|2c86accbf1b0f0c87505f39de11f29bb9c67d54d07ed599f82e68d9485042bf8|photos/Fabio/original/2017Irlanda19-29ago/IMG_0108.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0108_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0108_avg.jpg|53.3447916666667|-6.25231666666667|7.79565096180652 +6965|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0109.JPG|image/jpeg|4032|3024||2815021|IMG_0109.JPG|1772345058||1503496997000||0|1|json@patachina|f959470ad37e5cac6f5dfc8ec11e8075042dc6a3879d0692e421bcc7813d713f|photos/Fabio/original/2017Irlanda19-29ago/IMG_0109.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0109_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0109_avg.jpg|53.3450055555556|-6.25331388888889|8.37461617195496 +6966|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0110.JPG|image/jpeg|4032|3024||3207260|IMG_0110.JPG|1772345058||1503497854000||0|1|json@patachina|e006c1e9ca3f03dd2fe7f00b43f9e95dc513ee6d8bcc52792064202d2a0bc88b|photos/Fabio/original/2017Irlanda19-29ago/IMG_0110.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0110_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0110_avg.jpg|53.3456888888889|-6.26175555555556|11.630410654828 +6967|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0112.JPG|image/jpeg|4032|3024||2674913|IMG_0112.JPG|1772345058||1503497873000||0|1|json@patachina|267607f3ff8de46733b02eff63c966bde5e6717bde4c84467bb58e1ceea82bcb|photos/Fabio/original/2017Irlanda19-29ago/IMG_0112.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0112_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0112_avg.jpg|53.3456805555556|-6.26185555555556|11.9820261437908 +6968|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0113.JPG|image/jpeg|4032|3024||2788605|IMG_0113.JPG|1772345058||1503498970000||0|1|json@patachina|074aca4d9452649c4357b74108dfa5208a59597d4791fe6a5a172bde60d30b14|photos/Fabio/original/2017Irlanda19-29ago/IMG_0113.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0113_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0113_avg.jpg|53.3451777777778|-6.26584166666667|15.9843161856964 +6969|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0114.JPG|image/jpeg|4032|3024||3447883|IMG_0114.JPG|1772345058||1503504834000||0|1|json@patachina|5e966a826c4f14f0689e1ec8731e6c608784a2f7670205dbd59e81313254481a|photos/Fabio/original/2017Irlanda19-29ago/IMG_0114.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0114_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0114_avg.jpg|53.3398666666667|-6.269975|12.4432963058641 +6970|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0116.JPG|image/jpeg|4032|3024||3513469|IMG_0116.JPG|1772345058||1503505103000||0|1|json@patachina|efc2340d1d1201630d53d821708e5614c8a53b9801ea182b670392995ed7fd39|photos/Fabio/original/2017Irlanda19-29ago/IMG_0116.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0116_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0116_avg.jpg|53.3400333333333|-6.27069166666667|11.4195501730104 +6971|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0119.JPG|image/jpeg|4032|3024||2353262|IMG_0119.JPG|1772345058||1503509034000||0|1|json@patachina|cdcb4d0cfb1ca8a676781e595f3bfba0392ef69c0f70a981a651c850c8bd0017|photos/Fabio/original/2017Irlanda19-29ago/IMG_0119.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0119_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0119_avg.jpg|53.3422972222222|-6.28371111111111|20.3343023255814 +6972|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0120.JPG|image/jpeg|4032|3024||2912549|IMG_0120.JPG|1772345058||1503510106000||0|1|json@patachina|b431c8739b36ea07a97b56b9f7ca30ada55ea2f44ef145132db6ddc00e83674d|photos/Fabio/original/2017Irlanda19-29ago/IMG_0120.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0120_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0120_avg.jpg|53.3418194444444|-6.28665|23.0946428571429 +6973|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0122.JPG|image/jpeg|4032|3024||2351855|IMG_0122.JPG|1772345058||1503510129000||0|1|json@patachina|f781b3e1ff270b182192fcb29eedddd720dcc9a0c4843d0fd904927376279c32|photos/Fabio/original/2017Irlanda19-29ago/IMG_0122.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0122_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0122_avg.jpg|53.3417277777778|-6.28651111111111|23.021686746988 +6974|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0123.JPG|image/jpeg|4032|3024||1869483|IMG_0123.JPG|1772345058||1503512829000||0|1|json@patachina|d9fb0263ed0bc9945d2d6fde3822377d63ed7a62df20e2a1339d77a058b0e5a0|photos/Fabio/original/2017Irlanda19-29ago/IMG_0123.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0123_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0123_avg.jpg|53.3419416666667|-6.28671666666667|23.6626344086022 +6975|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0124.JPG|image/jpeg|4032|3024||1800632|IMG_0124.JPG|1772345058||1503512842000||0|1|json@patachina|a48db6ef8efee410190ff59bcb223fece468837d0c39bb408cce911213e5e36c|photos/Fabio/original/2017Irlanda19-29ago/IMG_0124.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0124_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0124_avg.jpg|53.341975|-6.28675277777778|23.8189509306261 +6976|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0125.JPG|image/jpeg|4032|3024||1643315|IMG_0125.JPG|1772345058||1503514391000||0|1|json@patachina|5e75aaa655b0ef9621854692249945cffa94980aeb3a6b4771bc0eaa555d110f|photos/Fabio/original/2017Irlanda19-29ago/IMG_0125.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0125_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0125_avg.jpg|53.3419305555556|-6.28595833333333|22.3709706464974 +6977|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0126.JPG|image/jpeg|4032|3024||1450013|IMG_0126.JPG|1772345058||1503514403000||0|1|json@patachina|a76dd98cbbabeb2493d074e4f3f29e13d6d2ca272f5b2d1796615df85c4e0532|photos/Fabio/original/2017Irlanda19-29ago/IMG_0126.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0126_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0126_avg.jpg|53.3419111111111|-6.286|22.4462081128748 +6978|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0133.JPG|image/jpeg|4032|3024||1606095|IMG_0133.JPG|1772345058||1503514433000||0|1|json@patachina|170535a256521b642797d687c4d444e6da0aee79dcda95eb6b4f8812884d83ab|photos/Fabio/original/2017Irlanda19-29ago/IMG_0133.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0133_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0133_avg.jpg|53.3418416666667|-6.28600833333333|22.6986506746627 +6979|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0134.JPG|image/jpeg|4032|3024||1839090|IMG_0134.JPG|1772345058||1503518935000||0|1|json@patachina|7f971d2e6ddaae2f823e4530653c21d652624229474820eba09ed9102da337c8|photos/Fabio/original/2017Irlanda19-29ago/IMG_0134.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0134_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0134_avg.jpg|53.3432222222222|-6.28155277777778|23.0 +6980|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0135.JPG|image/jpeg|4032|3024||2013689|IMG_0135.JPG|1772345058||1503519976000||0|1|json@patachina|3dd7326f2a56bc30fede93ad496881f8ddc5fc218521b8381e5d56305b605ddc|photos/Fabio/original/2017Irlanda19-29ago/IMG_0135.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0135_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0135_avg.jpg|53.3432805555556|-6.28151666666667|23.0 +6981|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0136.JPG|image/jpeg|3724|2096||1557955|IMG_0136.JPG|1772345058||||0|1|json@patachina|1279f417fc9e4526238fc10ad3e5b2c9421c4c0e2adc783896674e5b57fc0f73|photos/Fabio/original/2017Irlanda19-29ago/IMG_0136.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0136_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0136_avg.jpg||| +6982|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0137.JPG|image/jpeg|4032|3024||2667599|IMG_0137.JPG|1772345058||1503563815000||0|1|json@patachina|f57fa36af9d98b562777b67cd29ebd209dfa6d0e8a067f5e16ff14897b75a309|photos/Fabio/original/2017Irlanda19-29ago/IMG_0137.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0137_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0137_avg.jpg|53.3412944444444|-6.2516|22.9563758389262 +6983|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0138.JPG|image/jpeg|4032|3024||2698118|IMG_0138.JPG|1772345058||1503563819000||0|1|json@patachina|20581982e723f9cb27cc56dfd2620a30197c6ffb4f341c6325f8ad061dc028eb|photos/Fabio/original/2017Irlanda19-29ago/IMG_0138.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0138_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0138_avg.jpg|53.3413555555556|-6.25156111111111|22.9563758389262 +6984|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0139.JPG|image/jpeg|4032|3024||2656457|IMG_0139.JPG|1772345058||1503563838000||0|1|json@patachina|61b0b637cdd57a7d1cec46c47ad29760d7d267239c0e1efcb06d817fc4e6561e|photos/Fabio/original/2017Irlanda19-29ago/IMG_0139.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0139_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0139_avg.jpg|53.3414388888889|-6.25145833333333|22.9818799546999 +6985|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0140.JPG|image/jpeg|4032|3024||4654237|IMG_0140.JPG|1772345058||1503583782000||0|1|json@patachina|7c5d7d56d762a428de859d5a55fe55f102952935f3d5ae1668afda0ff0823310|photos/Fabio/original/2017Irlanda19-29ago/IMG_0140.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0140_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0140_avg.jpg|53.0105055555556|-6.32679722222222|129.976782752902 +6986|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0141.JPG|image/jpeg|4032|3024||3760564|IMG_0141.JPG|1772345058||1503584553000||0|1|json@patachina|de2922d21827aecd1d1a8dfd4b9932dafc24956d05991d8304cb5cd2e5f64eba|photos/Fabio/original/2017Irlanda19-29ago/IMG_0141.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0141_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0141_avg.jpg|53.0095527777778|-6.32451666666667|138.501805054152 +6987|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0143.JPG|image/jpeg|4032|3024||3627847|IMG_0143.JPG|1772345058||1503594928000||0|1|json@patachina|922af63d3adf5761a596d3a993debb1675b94fd7e5063eaa8b7747274d87c979|photos/Fabio/original/2017Irlanda19-29ago/IMG_0143.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0143_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0143_avg.jpg|52.6501722222222|-7.24905|71.8359788359788 +6988|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0145.JPG|image/jpeg|4032|3024||1900418|IMG_0145.JPG|1772345058||1503605922000||0|1|json@patachina|d19071d6e9760190d08e13c38f6c79e31b9cb66572899828c5d8914409548fa9|photos/Fabio/original/2017Irlanda19-29ago/IMG_0145.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0145_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0145_avg.jpg|52.5192833333333|-7.88663611111111|117.002457002457 +6989|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0146.JPG|image/jpeg|4032|3024||1944490|IMG_0146.JPG|1772345058||1503605929000||0|1|json@patachina|bb3d61b3d105aeb78c02253e11150e7288f22db8a41aaa33a168dfce72753aa6|photos/Fabio/original/2017Irlanda19-29ago/IMG_0146.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0146_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0146_avg.jpg|52.5192388888889|-7.88669444444444|118.549618320611 +6990|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0147.JPG|image/jpeg|4032|3024||2020943|IMG_0147.JPG|1772345058||1503606518000||0|1|json@patachina|0031352b2dc180c0a18377b994cc829e0281fe054c01fa9676afc30fa4b2f7ae|photos/Fabio/original/2017Irlanda19-29ago/IMG_0147.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0147_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0147_avg.jpg|52.5192833333333|-7.88663888888889|117.0 +6991|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0148.JPG|image/jpeg|4032|3024||2632829|IMG_0148.JPG|1772345058||1503656054000||0|1|json@patachina|90a5a45c9280636601d12fc247478efb937a81fcaa304f235611d2ee46da17fa|photos/Fabio/original/2017Irlanda19-29ago/IMG_0148.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0148_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0148_avg.jpg|52.5197305555556|-7.88870277777778|111.238961038961 +6992|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0149.JPG|image/jpeg|4032|3024||3300375|IMG_0149.JPG|1772345058||1503656159000||0|1|json@patachina|320e2fc3dd178b244d8edd04a580a64c4afe1df65610ec60eae422a1601ae3a1|photos/Fabio/original/2017Irlanda19-29ago/IMG_0149.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0149_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0149_avg.jpg|52.5197333333333|-7.88949166666667|117.027237354086 +6993|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0150.JPG|image/jpeg|5532|3898||4461504|IMG_0150.JPG|1772345058||1503656554000||0|1|json@patachina|d7b426792161fa3afd7e33d54b627662b9b367712b0ad965a854b43e4e49c508|photos/Fabio/original/2017Irlanda19-29ago/IMG_0150.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0150_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0150_avg.jpg|52.5197305555556|-7.89075833333333|135.530864197531 +6994|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0152.JPG|image/jpeg|5232|3872||4964535|IMG_0152.JPG|1772345058||1503656644000||0|1|json@patachina|e88ce747b4dd0e5e23e49249eb4a44b86667c4d10e87cba179a90414f1464b3a|photos/Fabio/original/2017Irlanda19-29ago/IMG_0152.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0152_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0152_avg.jpg|52.5200611111111|-7.8907|133.491869918699 +6995|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0153.JPG|image/jpeg|5300|3908||4837273|IMG_0153.JPG|1772345058||1503656673000||0|1|json@patachina|ceb29b9da1e7ee1ef841b982a74f0114586e92a14bdec698eb57b8d5dfb83639|photos/Fabio/original/2017Irlanda19-29ago/IMG_0153.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0153_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0153_avg.jpg|52.5200111111111|-7.89067777777778|133.92578125 +6996|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0154.JPG|image/jpeg|4032|3024||1697485|IMG_0154.JPG|1772345058||1503656711000||0|1|json@patachina|e948fde0c1689cba7d2fe2638b4151c9e767d30e51df322fef58a88cd6ca5c79|photos/Fabio/original/2017Irlanda19-29ago/IMG_0154.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0154_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0154_avg.jpg|52.5200666666667|-7.89070833333333|133.53431372549 +6997|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0155.JPG|image/jpeg|4032|3024||1680963|IMG_0155.JPG|1772345058||1503656725000||0|1|json@patachina|cfd7fa73ecd5fe826653200f7480fd04b2d68ef820e1767696e0c95844d66fd7|photos/Fabio/original/2017Irlanda19-29ago/IMG_0155.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0155_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0155_avg.jpg|52.5200361111111|-7.89056666666667|134.34188034188 +6998|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0156.JPG|image/jpeg|3024|4032||1502040|IMG_0156.JPG|1772345058||1503656771000||0|1|json@patachina|9c3e73b3f3f1f8fec2989f58f26a4c77f6d1e6d5c84db0e430ff02ce0b0d22dd|photos/Fabio/original/2017Irlanda19-29ago/IMG_0156.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0156_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0156_avg.jpg|52.5199305555556|-7.89053611111111|133.320014529604 +6999|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0157.JPG|image/jpeg|4032|3024||1520788|IMG_0157.JPG|1772345058||1503656843000||0|1|json@patachina|c47ad95ef2b64b739e0506ade0cd75edf2c36f081c7f71aef18b3086f48437fa|photos/Fabio/original/2017Irlanda19-29ago/IMG_0157.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0157_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0157_avg.jpg|52.5197555555556|-7.89038888888889|130.223546944858 +7000|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0160.JPG|image/jpeg|8178|3754||4954269|IMG_0160.JPG|1772345058||1503657571000||0|1|json@patachina|000af735fda865c0fcf8901b03730ce9ab0e2fd309e32fe7d9a162b872f52bcd|photos/Fabio/original/2017Irlanda19-29ago/IMG_0160.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0160_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0160_avg.jpg|52.5204694444444|-7.89060555555556|129.350974930362 +7001|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0162.JPG|image/jpeg|4032|3024||2747267|IMG_0162.JPG|1772345058||1503666106000||0|1|json@patachina|fe60d488995ace8710290fd90f5a029836ac78a6058d23c693b44a0f0bf0d9c5|photos/Fabio/original/2017Irlanda19-29ago/IMG_0162.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0162_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0162_avg.jpg|51.8977805555556|-8.47415555555555|9.36507605751198 +7002|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0163.JPG|image/jpeg|4032|3024||2808395|IMG_0163.JPG|1772345058||1503666149000||0|1|json@patachina|af50a7aea932744e074401fb1972b225b00d3e33dd84603f042d2750917b4c0f|photos/Fabio/original/2017Irlanda19-29ago/IMG_0163.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0163_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0163_avg.jpg|51.8977388888889|-8.47423888888889|9.51040525739321 +7003|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0164.JPG|image/jpeg|4032|3024||3137643|IMG_0164.JPG|1772345058||1503666179000||0|1|json@patachina|0b4a04fbaf07396b89241cf4fa89b4234e97666a446c0ec7ca9162809ebde4ba|photos/Fabio/original/2017Irlanda19-29ago/IMG_0164.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0164_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0164_avg.jpg|51.8977805555556|-8.47415555555555|8.26983050847458 +7004|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0165.JPG|image/jpeg|4032|3024||2929880|IMG_0165.JPG|1772345058||1503667517000||0|1|json@patachina|f4d0ef5ed969be5016b75571dd26b2a47969eb8115b9b91844729e06e82ea9fc|photos/Fabio/original/2017Irlanda19-29ago/IMG_0165.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0165_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0165_avg.jpg|51.8977388888889|-8.47416666666667|9.73065476190476 +7005|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0166.JPG|image/jpeg|4032|3024||2498451|IMG_0166.JPG|1772345058||1503667524000||0|1|json@patachina|0c047b55f39a3d16dfb6364a930439691ac36b437a1af7b819ecfbe49f9a9ae5|photos/Fabio/original/2017Irlanda19-29ago/IMG_0166.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0166_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0166_avg.jpg|51.8977361111111|-8.47423611111111|9.62190812720848 +7006|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0167.JPG|image/jpeg|4032|3024||3020402|IMG_0167.JPG|1772345058||1503669348000||0|1|json@patachina|f979ead57bf154b48d36a48fdefa2a6f60bb4c5925771d8385d431cef2ff5e1c|photos/Fabio/original/2017Irlanda19-29ago/IMG_0167.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0167_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0167_avg.jpg|51.894675|-8.47927777777778|7.38107416879795 +7007|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0170.JPG|image/jpeg|4032|3024||2161605|IMG_0170.JPG|1772345058||1503671202000||0|1|json@patachina|6a7219d3944504fdfa8458571fd8a47da0078aa8a58b087b091fd96efc8f3148|photos/Fabio/original/2017Irlanda19-29ago/IMG_0170.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0170_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0170_avg.jpg|51.8999472222222|-8.46975833333333|14.0864691753403 +7008|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0171.JPG|image/jpeg|4032|3024||2913137|IMG_0171.JPG|1772345058||1503686951000||0|1|json@patachina|d24daf8323543427fd59cb4c30ae7b67bc99b55f32dd03ecf26aecb7a6c43637|photos/Fabio/original/2017Irlanda19-29ago/IMG_0171.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0171_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0171_avg.jpg|52.0567166666667|-9.93916111111111|23.2950138504155 +7009|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0172.JPG|image/jpeg|4032|3024||3437757|IMG_0172.JPG|1772345058||1503686966000||0|1|json@patachina|2b7b0c4901ed0540ea6f966f7a71310d4b20571c2c9e6804c4bb14b3813ed0cb|photos/Fabio/original/2017Irlanda19-29ago/IMG_0172.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0172_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0172_avg.jpg|52.0567083333333|-9.93916111111111|23.2950138504155 +7010|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0174.JPG|image/jpeg|3724|2096||1668522|IMG_0174.JPG|1772345058||||0|1|json@patachina|3ad5c7661d3cd95b2127726f83c0533506a4f03416f1d719d921c8f548d68f65|photos/Fabio/original/2017Irlanda19-29ago/IMG_0174.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0174_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0174_avg.jpg||| +7011|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0175.JPG|image/jpeg|3724|2096||1781263|IMG_0175.JPG|1772345058||||0|1|json@patachina|be8665dddfdc3506a15d5350b698128d21059f00c93fb81159e58d44ee530ff6|photos/Fabio/original/2017Irlanda19-29ago/IMG_0175.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0175_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0175_avg.jpg||| +7012|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0176.JPG|image/jpeg|3763|1657||973684|IMG_0176.JPG|1772345058||1503695558000||0|1|json@patachina|58125131ee77b1d1771f11ad16783b8733a4b41e7a03da65ebedd8407bbc6251|photos/Fabio/original/2017Irlanda19-29ago/IMG_0176.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0176_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0176_avg.jpg|52.0529444444444|-9.94103888888889|50.2045088566828 +7013|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0177.JPG|image/jpeg|3724|2096||1311890|IMG_0177.JPG|1772345058||||0|1|json@patachina|00b4e48f67fa6cf3064878dc502739685e6e848c45d9ad3a9cd17b81454fb295|photos/Fabio/original/2017Irlanda19-29ago/IMG_0177.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0177_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0177_avg.jpg||| +7014|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0178.JPG|image/jpeg|7506|3870||4612510|IMG_0178.JPG|1772345058||1503734480000||0|1|json@patachina|3f10e880a53775e5511a672bd5853eb934a48b065bacfa18e8916e8118872a67|photos/Fabio/original/2017Irlanda19-29ago/IMG_0178.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0178_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0178_avg.jpg|52.0566777777778|-9.93897777777778|31.5173010380623 +7015|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0179.JPG|image/jpeg|5624|3958||4484747|IMG_0179.JPG|1772345058||1503734933000||0|1|json@patachina|266eaeb775d63a836c96486a4212ad312c433e8b3c4c26e03335ec18ffab379f|photos/Fabio/original/2017Irlanda19-29ago/IMG_0179.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0179_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0179_avg.jpg|52.0566027777778|-9.93912222222222|32.3182108626198 +7016|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0180.JPG|image/jpeg|8968|1560||2873334|IMG_0180.JPG|1772345058||1503743055000||0|1|json@patachina|3692b4fbe904ec2d42578d03f738e84ae257b8bdc2ffc9a2f8fd5269f2e7e56b|photos/Fabio/original/2017Irlanda19-29ago/IMG_0180.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0180_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0180_avg.jpg|51.8562888888889|-10.3671916666667|259.472727272727 +7017|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0182.JPG|image/jpeg|4032|3024||2168733|IMG_0182.JPG|1772345058||1503749114000||0|1|json@patachina|9ff55d442e8ce8c6ac083fb20b03288d87aa27e14b4d474dda92871388292955|photos/Fabio/original/2017Irlanda19-29ago/IMG_0182.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0182_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0182_avg.jpg|51.8378305555556|-9.89884722222222|-1.2328990228013 +7018|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0183.JPG|image/jpeg|4032|3024||1891230|IMG_0183.JPG|1772345058||1503749116000||0|1|json@patachina|2755176957dd02040b27cd17f67d48e81e7648d19fcd746ea8600566e4d8bdc9|photos/Fabio/original/2017Irlanda19-29ago/IMG_0183.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0183_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0183_avg.jpg|51.8378222222222|-9.89883888888889|-5.13778020776381 +7019|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0185.JPG|image/jpeg|4032|3024||1766923|IMG_0185.JPG|1772345058||1503749303000||0|1|json@patachina|43bbefc09ffb1ed198cae4ec272711216529a6c3c3be2169f18d2e18795b5aee|photos/Fabio/original/2017Irlanda19-29ago/IMG_0185.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0185_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0185_avg.jpg|51.8378555555556|-9.89896111111111|13.9998817407758 +7020|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0188.JPG|image/jpeg|4032|3024||2935053|IMG_0188.JPG|1772345058||1503767620000||0|1|json@patachina|e301e12cab9c7a762b4156cb4460f340616fe2262a16ed99a2ef26960a6eec6f|photos/Fabio/original/2017Irlanda19-29ago/IMG_0188.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0188_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0188_avg.jpg|52.9653972222222|-9.43424444444445|159.092122830441 +7021|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0190.JPG|image/jpeg|4032|3024||1852261|IMG_0190.JPG|1772345058||1503767749000||0|1|json@patachina|6c7b9362e26b9842956b52714add6d3f64abe7587fb4fcad92f14b60e1603710|photos/Fabio/original/2017Irlanda19-29ago/IMG_0190.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0190_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0190_avg.jpg|52.9652722222222|-9.434625|165.538258575198 +7022|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0193.JPG|image/jpeg|4032|3024||1936144|IMG_0193.JPG|1772345058||1503767754000||0|1|json@patachina|08a2f32149fe3f3be4d20bfbf0c7a350d31c7c9a20838a71ed319da382714f33|photos/Fabio/original/2017Irlanda19-29ago/IMG_0193.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0193_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0193_avg.jpg|52.9652944444444|-9.434625|167.757575757576 +7023|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0203.JPG|image/jpeg|4032|3024||1843400|IMG_0203.JPG|1772345058||1503768183000||0|1|json@patachina|78c15ebfa83017b4ff9517dee90a3850e40216ff7eb6a918a3c3e8b0fbc48cb4|photos/Fabio/original/2017Irlanda19-29ago/IMG_0203.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0203_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0203_avg.jpg|52.9642138888889|-9.43779444444444|174.479212253829 +7024|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0204.JPG|image/jpeg|4658|3974||4221357|IMG_0204.JPG|1772345058||1503769227000||0|1|json@patachina|5f2e2aa3e1a1393541ee644c45ea1fb72b1f0209bf4b6a5ec410211b8874342c|photos/Fabio/original/2017Irlanda19-29ago/IMG_0204.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0204_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0204_avg.jpg|52.9688222222222|-9.43002777777778|149.953667953668 +7025|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0206.JPG|image/jpeg|7305|2311||4179034|IMG_0206.JPG|1772345058||1503769265000||0|1|json@patachina|7f7662484db48c586a48b061d0fdbee4d4c26673006291453fbc6d229e428bc6|photos/Fabio/original/2017Irlanda19-29ago/IMG_0206.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0206_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0206_avg.jpg|52.9688611111111|-9.42955|162.050561797753 +7026|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0207.JPG|image/jpeg|1680|4030||1750381|IMG_0207.JPG|1772345058||1503769375000||0|1|json@patachina|f0f30da209fc673f970f71e04f295686f4fb90a11b25ee4527cba818b476ff08|photos/Fabio/original/2017Irlanda19-29ago/IMG_0207.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0207_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0207_avg.jpg|52.9689361111111|-9.42912777777778|158.71615720524 +7027|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0208.JPG|image/jpeg|4427|2389||2046548|IMG_0208.JPG|1772345058||1503769385000||0|1|json@patachina|f913487bc12e3aaf475ad69bf384dd0901e59aa540ee9797a8265332a2834d7a|photos/Fabio/original/2017Irlanda19-29ago/IMG_0208.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0208_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0208_avg.jpg|52.9689027777778|-9.42917777777778|159.492574257426 +7028|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0209.JPG|image/jpeg|6438|3900||4328104|IMG_0209.JPG|1772345058||1503769503000||0|1|json@patachina|da703ab0c87a5b2cfae82c0e03c1c06becda9d88a27ce7ee9016bd5b84e1c2b4|photos/Fabio/original/2017Irlanda19-29ago/IMG_0209.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0209_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0209_avg.jpg|52.9694555555556|-9.42878888888889|164.520231213873 +7029|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0211.JPG|image/jpeg|3946|2960||703594|IMG_0211.JPG|1772345058||1503779894000||0|1|json@patachina|cdeb87c1792135ee872aa425d77358b98993edbc95f1330a69dba7be404147b5|photos/Fabio/original/2017Irlanda19-29ago/IMG_0211.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0211_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0211_avg.jpg|53.0089222222222|-9.39038055555556|29.118190212373 +7030|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0212.JPG|image/jpeg|3745|1941||468928|IMG_0212.JPG|1772345058||1503779936000||0|1|json@patachina|0f6a1c1970d653cb859623033e67dd4c8cbe1a62c2f628fc769227f5c01bdf51|photos/Fabio/original/2017Irlanda19-29ago/IMG_0212.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0212_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0212_avg.jpg|53.0088888888889|-9.39027777777778|30.341211225997 +7031|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0214.JPG|image/jpeg|4032|3024||2097953|IMG_0214.JPG|1772345058||1503822184000||0|1|json@patachina|6e2eff73862033f55462dd93debaccaf9c4f82a10b80ebbe0636297b219922d8|photos/Fabio/original/2017Irlanda19-29ago/IMG_0214.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0214_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0214_avg.jpg|53.0133083333333|-9.3872|19.4500978473581 +7032|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0215.JPG|image/jpeg|4032|3024||2489649|IMG_0215.JPG|1772345058||1503823090000||0|1|json@patachina|22c9fa06cbc6202537b068fa81671a02fc95830ea942c9f3bae3f533eb72b639|photos/Fabio/original/2017Irlanda19-29ago/IMG_0215.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0215_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0215_avg.jpg|53.0132|-9.38715|18.4987593052109 +7033|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0216.JPG|image/jpeg|4032|3024||3009764|IMG_0216.JPG|1772345058||1503830851000||0|1|json@patachina|66c41d07cf0d15d30317021a9466d0c91a12fdb23dfeb3f609086531bcc04fd5|photos/Fabio/original/2017Irlanda19-29ago/IMG_0216.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0216_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0216_avg.jpg|53.0483083333333|-9.139725|140.781512605042 +7034|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0217.JPG|image/jpeg|4032|3024||2757600|IMG_0217.JPG|1772345058||1503830943000||0|1|json@patachina|c8fa1c40430848be9c64fdb07037b15ffebf784fa1a265c409c863c89c8a47b6|photos/Fabio/original/2017Irlanda19-29ago/IMG_0217.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0217_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0217_avg.jpg|53.0487777777778|-9.13991944444444|142.048387096774 +7035|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0218.JPG|image/jpeg|4032|3024||3442902|IMG_0218.JPG|1772345058||1503830950000||0|1|json@patachina|b18106ebe50751cdf31cd44ff03e754012ceea076ed4180c8cd5049988f47b33|photos/Fabio/original/2017Irlanda19-29ago/IMG_0218.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0218_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0218_avg.jpg|53.0487888888889|-9.139975|142.04854368932 +7036|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0223.JPG|image/jpeg|4032|3024||3891743|IMG_0223.JPG|1772345058||1503833355000||0|1|json@patachina|4911bd0ea80d995a793de43cb90a038143c1f5f0dd50760201a862c39c6f39c5|photos/Fabio/original/2017Irlanda19-29ago/IMG_0223.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0223_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0223_avg.jpg|53.0764305555556|-9.15987222222222|100.636253041363 +7037|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0227.JPG|image/jpeg|3162|1743||1551495|IMG_0227.JPG|1772345058||1503844208000||0|1|json@patachina|5bb666b95ee159516015833eb5049c9caaa352b59ea2074055253919ff2691fa|photos/Fabio/original/2017Irlanda19-29ago/IMG_0227.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0227_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0227_avg.jpg|53.2715305555556|-9.05381111111111|12.4263322884013 +7038|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0228.JPG|image/jpeg|4032|3024||1257412|IMG_0228.JPG|1772345058||1503857624000||0|1|json@patachina|8ece0f4a10db7728884b59ec1eda9b5397d05a22c05ec8c0d4dc978cb7714e04|photos/Fabio/original/2017Irlanda19-29ago/IMG_0228.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0228_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0228_avg.jpg|53.4840166666667|-9.97761944444444|40.7386888273315 +7039|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0229.JPG|image/jpeg|4032|3024||2405533|IMG_0229.JPG|1772345058||1503862949000||0|1|json@patachina|550ff996c69bce5ac50c763144b89d67533dcc6aa964db261a048eea131ee6c2|photos/Fabio/original/2017Irlanda19-29ago/IMG_0229.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0229_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0229_avg.jpg|53.4887277777778|-10.0223944444444|16.3738959764475 +7040|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0232.JPG|image/jpeg|4032|3024||2066043|IMG_0232.JPG|1772345058||1503909783000||0|1|json@patachina|3569c01fcb910edf029fabdc4bb8594bd09f754ef4934d83f87e181fbd5b4a26|photos/Fabio/original/2017Irlanda19-29ago/IMG_0232.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0232_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0232_avg.jpg|53.4879888888889|-10.0105555555556|17.3643178410795 +7041|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0233.JPG|image/jpeg|4032|3024||4708675|IMG_0233.JPG|1772345058||1503916727000||0|1|json@patachina|e6cfdc49ecf1bdd69442db1af819b34804b8b72bab7be1d89ea81fbf1e121780|photos/Fabio/original/2017Irlanda19-29ago/IMG_0233.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0233_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0233_avg.jpg|53.5616|-9.91743055555555|25.3661417322835 +7042|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0234.JPG|image/jpeg|4032|3024||4888844|IMG_0234.JPG|1772345058||1503916733000||0|1|json@patachina|ba64e2446a85c1b1f5409ed1536519550d4b053a6f1b7055ed5dd24423a811a4|photos/Fabio/original/2017Irlanda19-29ago/IMG_0234.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0234_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0234_avg.jpg|53.5616305555556|-9.91740833333333|25.6041724617524 +7043|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0235.JPG|image/jpeg|4032|3024||4413193|IMG_0235.JPG|1772345058||1503916750000||0|1|json@patachina|a8ad427b74232076f9c7dfab1020e348303dfa637618ac15f09e2254bdf1bf2b|photos/Fabio/original/2017Irlanda19-29ago/IMG_0235.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0235_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0235_avg.jpg|53.5616722222222|-9.91726944444444|25.2461139896373 +7044|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0237.JPG|image/jpeg|3630|3790||3314673|IMG_0237.JPG|1772345058||1503916764000||0|1|json@patachina|08ac1bc5b6950b033083d92190fbe09f7437692f0a9c1c2fd128bf5eb2121b8b|photos/Fabio/original/2017Irlanda19-29ago/IMG_0237.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0237_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0237_avg.jpg|53.5616694444444|-9.91726388888889|25.1903614457831 +7045|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0241.JPG|image/jpeg|4032|3024||1745323|IMG_0241.JPG|1772345058||1504001722000||0|1|json@patachina|734baffdac715fea578e27ab31c3c54cf936503832ab8ed5397f4fc8e81ac919|photos/Fabio/original/2017Irlanda19-29ago/IMG_0241.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0241_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0241_avg.jpg|53.4199361111111|-6.94059722222222|72.5619967793881 +7046|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0242.JPG|image/jpeg|4032|3024||1242828|IMG_0242.JPG|1772345058||1504005466000||0|1|json@patachina|328ddc7c59a977c266984be472a358d2bf1bdb484f44b5e6fe391929dfa3ddd5|photos/Fabio/original/2017Irlanda19-29ago/IMG_0242.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0242_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0242_avg.jpg|53.1860111111111|-6.87943888888889|120.114695340502 +7047|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0243.JPG|image/jpeg|4032|3024||3347118|IMG_0243.JPG|1772345058||1504005486000||0|1|json@patachina|ed277609c661c70e1e957751a2445f4363cb3624cbcd69d4577be2edc3a65867|photos/Fabio/original/2017Irlanda19-29ago/IMG_0243.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0243_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0243_avg.jpg|53.1858|-6.87960833333333|111.824541284404 +7048|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0244.JPG|image/jpeg|4032|3024||4832084|IMG_0244.JPG|1772345058||1504006676000||0|1|json@patachina|9aa59f8ed0683e9d9838c74d77404d55b73a57f9b27a1b85d0c11bdf89f1353a|photos/Fabio/original/2017Irlanda19-29ago/IMG_0244.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0244_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0244_avg.jpg|53.1446416666667|-6.90140833333333|83.1320754716981 +7049|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0245.JPG|image/jpeg|4032|3024||4210606|IMG_0245.JPG|1772345058||1504006732000||0|1|json@patachina|621ff9a11fddb00f9c59745d9691c0c2e59cb5d699f31d2c2d19956b64cc3333|photos/Fabio/original/2017Irlanda19-29ago/IMG_0245.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0245_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0245_avg.jpg|53.1446333333333|-6.90120555555556|104.186679174484 +7050|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0246.JPG|image/jpeg|4032|3024||4047020|IMG_0246.JPG|1772345058||1504006811000||0|1|json@patachina|b868646e27d6d478aff2547e7038655a57a9bef2ee3e4106f11a6d4d9ed7dafb|photos/Fabio/original/2017Irlanda19-29ago/IMG_0246.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0246_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0246_avg.jpg|53.1444083333333|-6.90123888888889|122.443243243243 +7051|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0247.JPG|image/jpeg|4032|3024||3155785|IMG_0247.JPG|1772345058||1504006896000||0|1|json@patachina|529a5b9815daffa1adaea4669df680fa467d9f553d1d4764b455ccee9718e322|photos/Fabio/original/2017Irlanda19-29ago/IMG_0247.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0247_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0247_avg.jpg|53.1444861111111|-6.90139444444444|101.991319444444 +7052|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0248.JPG|image/jpeg|4032|3024||4551844|IMG_0248.JPG|1772345058||1504007112000||0|1|json@patachina|4a036bc7eedd5f4be37808d20fc37c3f4f4ba3e5bbf6f42a0eb073fc6a642ed3|photos/Fabio/original/2017Irlanda19-29ago/IMG_0248.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0248_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0248_avg.jpg|53.1442611111111|-6.90213055555556|117.170491803279 +7053|||photos/Fabio/original/2017Irlanda19-29ago/IMG_0249.JPG|image/jpeg|4032|3024||4772193|IMG_0249.JPG|1772345058||1504007140000||0|1|json@patachina|6d6204b1c1c8db7a1c413cd3198f67930e5608853b7db3c0433bb01f5f5e7267|photos/Fabio/original/2017Irlanda19-29ago/IMG_0249.JPG|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0249_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/IMG_0249_avg.jpg|53.1442083333333|-6.90205555555556|90.4784688995215 +7054|||photos/Fabio/original/2017Irlanda19-29ago/VID_20260221_095917.mp4|video/mp4|1920|1080||12273606|VID_20260221_095917.mp4|1772345058|||5472|0|1|json@patachina|79dfe8902efd7e8c9c5f478848b47f8e45977c3bbb7395a6d095c361de9b60a2|photos/Fabio/original/2017Irlanda19-29ago/VID_20260221_095917.mp4|photos/Fabio/thumbs/2017Irlanda19-29ago/VID_20260221_095917_min.jpg|photos/Fabio/thumbs/2017Irlanda19-29ago/VID_20260221_095917_avg.jpg|44.1816|12.1251| diff --git a/docs/foto2.csv b/docs/foto2.csv new file mode 100644 index 0000000..8b87b75 --- /dev/null +++ b/docs/foto2.csv @@ -0,0 +1 @@ +2|1000019251|content://media/external/images/media/1000019251|/storage/emulated/0/DCIM/Camera/IMG_20250810_121828.jpg|image/jpeg|3472|4640|0|6177515||1754821109|1754821112383|1754821108570|0|0|0|||||||| diff --git a/docs/lines.txt b/docs/lines.txt new file mode 100644 index 0000000..d5897b4 --- /dev/null +++ b/docs/lines.txt @@ -0,0 +1,3 @@ +1577 +1578 +1579 diff --git a/docs/metadata.csv b/docs/metadata.csv new file mode 100644 index 0000000..d11bdc4 --- /dev/null +++ b/docs/metadata.csv @@ -0,0 +1,6957 @@ +id,mimeType,dateMillis,flags,rotationDegrees,xmpSubjects,xmpTitle,latitude,longitude,rating +6957,image/jpeg,0,0,0,"","",,,0 +6958,image/jpeg,0,0,0,"","",,,0 +6959,image/jpeg,1754821108570,0,0,"","",44.2502916666667,12.0827722222222,0 +6960,image/jpeg,1754821103064,0,0,"","",44.2502916666667,12.0827722222222,0 +6961,image/jpeg,1754821097513,0,0,"","",44.2502916666667,12.0827722222222,0 +6962,image/jpeg,1738662344594,0,0,"","",44.2505888888889,12.0828388888889,0 +6963,image/jpeg,1738662328825,0,0,"","",,,0 +6964,image/jpeg,1738134417709,0,0,"","",44.2505805555556,12.0828305555556,0 +6965,image/jpeg,1737797938693,0,0,"","",44.2428222222222,12.0752194444444,0 +6966,image/jpeg,0,0,0,"","",,,0 +6967,image/jpeg,1680766659114,0,0,"","",44.2504888888889,12.0828805555556,0 +6968,image/jpeg,0,0,,"","",,,0 +6969,image/jpeg,0,0,,"","",,,0 +6970,image/jpeg,0,0,,"","",,,0 +6971,image/jpeg,0,0,,"","",,,0 +6972,image/jpeg,0,0,,"","",,,0 +6973,image/jpeg,0,0,,"","",,,0 +6974,image/jpeg,0,0,,"","",,,0 +6975,image/jpeg,0,0,,"","",,,0 +6976,image/jpeg,0,0,,"","",,,0 +6977,image/jpeg,0,0,,"","",,,0 +6978,image/jpeg,0,0,,"","",,,0 +6979,image/jpeg,0,0,,"","",,,0 +6980,image/jpeg,0,0,,"","",,,0 +6981,image/jpeg,0,0,,"","",,,0 +6982,image/jpeg,0,0,,"","",,,0 +6983,image/jpeg,0,0,,"","",,,0 +6984,image/jpeg,0,0,,"","",,,0 +6985,image/jpeg,0,0,,"","",,,0 +6986,image/jpeg,0,0,,"","",,,0 +6987,image/jpeg,0,0,,"","",,,0 +6988,image/jpeg,0,0,,"","",,,0 +6989,image/jpeg,0,0,,"","",,,0 +6990,image/jpeg,0,0,,"","",,,0 +6991,image/jpeg,0,0,,"","",,,0 +6992,image/jpeg,0,0,,"","",,,0 +6993,image/jpeg,0,0,,"","",,,0 +6994,image/jpeg,0,0,,"","",,,0 +6995,image/jpeg,0,0,,"","",,,0 +6996,image/jpeg,0,0,,"","",,,0 +6997,image/jpeg,0,0,,"","",,,0 +6998,image/jpeg,0,0,,"","",,,0 +6999,image/jpeg,0,0,,"","",,,0 +7000,image/jpeg,0,0,,"","",,,0 +7001,image/jpeg,0,0,,"","",,,0 +7002,image/jpeg,0,0,,"","",,,0 +7003,image/jpeg,0,0,,"","",,,0 +7004,image/jpeg,0,0,,"","",,,0 +7005,image/jpeg,0,0,,"","",,,0 +7006,image/jpeg,0,0,,"","",,,0 +7007,image/jpeg,0,0,,"","",,,0 +7008,image/jpeg,0,0,,"","",,,0 +7009,image/jpeg,0,0,,"","",,,0 +7010,image/jpeg,0,0,,"","",,,0 +7011,image/jpeg,0,0,,"","",,,0 +7012,image/jpeg,0,0,,"","",,,0 +7013,image/jpeg,0,0,,"","",,,0 +7014,image/jpeg,0,0,,"","",,,0 +7015,image/jpeg,0,0,,"","",,,0 +7016,image/jpeg,0,0,,"","",,,0 +7017,image/jpeg,0,0,,"","",,,0 +7018,image/jpeg,0,0,,"","",,,0 +7019,image/jpeg,0,0,,"","",,,0 +7020,image/jpeg,0,0,,"","",,,0 +7021,image/jpeg,0,0,,"","",,,0 +7022,image/jpeg,0,0,,"","",,,0 +7023,image/jpeg,0,0,,"","",,,0 +7024,image/jpeg,0,0,,"","",,,0 +7025,image/jpeg,0,0,,"","",,,0 +7026,image/jpeg,0,0,,"","",,,0 +7027,image/jpeg,0,0,,"","",,,0 +7028,image/jpeg,0,0,,"","",,,0 +7029,image/jpeg,0,0,,"","",,,0 +7030,image/jpeg,0,0,,"","",,,0 +7031,image/jpeg,0,0,,"","",,,0 +7032,image/jpeg,0,0,,"","",,,0 +7033,image/jpeg,0,0,,"","",,,0 +7034,image/jpeg,0,0,,"","",,,0 +7035,image/jpeg,0,0,,"","",,,0 +7036,image/jpeg,0,0,,"","",,,0 +7037,image/jpeg,0,0,,"","",,,0 +7038,image/jpeg,0,0,,"","",,,0 +7039,image/jpeg,0,0,,"","",,,0 +7040,image/jpeg,0,0,,"","",,,0 +7041,image/jpeg,0,0,,"","",,,0 +7042,image/jpeg,0,0,,"","",,,0 +7043,image/jpeg,0,0,,"","",,,0 +7044,image/jpeg,0,0,,"","",,,0 +7045,image/jpeg,0,0,,"","",,,0 +7046,image/jpeg,0,0,,"","",,,0 +7047,image/jpeg,0,0,,"","",,,0 +7048,image/jpeg,0,0,,"","",,,0 +7049,image/jpeg,0,0,,"","",,,0 +7050,image/jpeg,0,0,,"","",,,0 +7051,image/jpeg,0,0,,"","",,,0 +7052,image/jpeg,0,0,,"","",,,0 +7053,image/jpeg,0,0,,"","",,,0 +7054,image/jpeg,0,0,,"","",,,0 +7055,image/jpeg,0,0,,"","",,,0 +7056,image/jpeg,0,0,,"","",,,0 +7057,image/jpeg,0,0,,"","",,,0 +7058,image/jpeg,0,0,,"","",,,0 +7059,image/jpeg,0,0,,"","",,,0 +7060,image/jpeg,0,0,,"","",,,0 +7061,image/jpeg,0,0,,"","",,,0 +7062,image/jpeg,0,0,,"","",,,0 +7063,image/jpeg,0,0,,"","",,,0 +7064,image/jpeg,0,0,,"","",,,0 +7065,image/jpeg,0,0,,"","",,,0 +7066,image/jpeg,0,0,,"","",,,0 +7067,image/jpeg,0,0,,"","",,,0 +7068,image/jpeg,0,0,,"","",,,0 +7069,image/jpeg,0,0,,"","",,,0 +7070,image/jpeg,0,0,,"","",,,0 +7071,image/jpeg,0,0,,"","",,,0 +7072,image/jpeg,0,0,,"","",,,0 +7073,image/jpeg,0,0,,"","",,,0 +7074,image/jpeg,0,0,,"","",,,0 +7075,image/jpeg,0,0,,"","",,,0 +7076,image/jpeg,0,0,,"","",,,0 +7077,image/jpeg,0,0,,"","",,,0 +7078,image/jpeg,0,0,,"","",,,0 +7079,image/jpeg,0,0,,"","",,,0 +7080,image/jpeg,0,0,,"","",,,0 +7081,image/jpeg,0,0,,"","",,,0 +7082,image/jpeg,0,0,,"","",,,0 +7083,image/jpeg,0,0,,"","",,,0 +7084,image/jpeg,0,0,,"","",,,0 +7085,image/jpeg,0,0,,"","",,,0 +7086,image/jpeg,0,0,,"","",,,0 +7087,image/jpeg,0,0,,"","",,,0 +7088,image/jpeg,0,0,,"","",,,0 +7089,image/jpeg,0,0,,"","",,,0 +7090,image/jpeg,0,0,,"","",,,0 +7091,image/jpeg,0,0,,"","",,,0 +7092,image/jpeg,0,0,,"","",,,0 +7093,image/jpeg,0,0,,"","",,,0 +7094,image/jpeg,0,0,,"","",,,0 +7095,image/jpeg,0,0,,"","",,,0 +7096,image/jpeg,0,0,,"","",,,0 +7097,image/jpeg,0,0,,"","",,,0 +7098,image/jpeg,0,0,,"","",,,0 +7099,image/jpeg,0,0,,"","",,,0 +7100,image/jpeg,0,0,,"","",,,0 +7101,image/jpeg,0,0,,"","",,,0 +7102,image/jpeg,0,0,,"","",,,0 +7103,image/jpeg,0,0,,"","",,,0 +7104,image/jpeg,0,0,,"","",,,0 +7105,image/jpeg,0,0,,"","",,,0 +7106,image/jpeg,0,0,,"","",,,0 +7107,image/jpeg,0,0,,"","",,,0 +7108,image/jpeg,0,0,,"","",,,0 +7109,image/jpeg,0,0,,"","",,,0 +7110,image/jpeg,0,0,,"","",,,0 +7111,image/jpeg,0,0,,"","",,,0 +7112,image/jpeg,0,0,,"","",,,0 +7113,image/jpeg,0,0,,"","",,,0 +7114,image/jpeg,0,0,,"","",,,0 +7115,image/jpeg,0,0,,"","",,,0 +7116,image/jpeg,0,0,,"","",,,0 +7117,image/jpeg,0,0,,"","",,,0 +7118,image/jpeg,0,0,,"","",,,0 +7119,image/jpeg,0,0,,"","",,,0 +7120,image/jpeg,0,0,,"","",,,0 +7121,image/jpeg,0,0,,"","",,,0 +7122,image/jpeg,0,0,,"","",,,0 +7123,image/jpeg,0,0,,"","",,,0 +7124,image/jpeg,0,0,,"","",,,0 +7125,image/jpeg,0,0,,"","",,,0 +7126,image/jpeg,0,0,,"","",,,0 +7127,image/jpeg,0,0,,"","",,,0 +7128,image/jpeg,0,0,,"","",,,0 +7129,image/jpeg,0,0,,"","",,,0 +7130,image/jpeg,0,0,,"","",,,0 +7131,image/jpeg,0,0,,"","",,,0 +7132,image/jpeg,0,0,,"","",,,0 +7133,image/jpeg,0,0,,"","",,,0 +7134,image/jpeg,0,0,,"","",,,0 +7135,image/jpeg,0,0,,"","",,,0 +7136,image/jpeg,0,0,,"","",,,0 +7137,image/jpeg,0,0,,"","",,,0 +7138,image/jpeg,0,0,,"","",,,0 +7139,image/jpeg,0,0,,"","",,,0 +7140,image/jpeg,0,0,,"","",,,0 +7141,image/jpeg,0,0,,"","",,,0 +7142,image/jpeg,1674564275927,0,0,"","",,,0 +7143,image/jpeg,0,0,,"","",,,0 +7144,image/jpeg,0,0,,"","",,,0 +7145,image/jpeg,0,0,,"","",,,0 +7146,image/jpeg,0,0,,"","",,,0 +7147,image/jpeg,0,0,,"","",,,0 +7148,image/jpeg,0,0,,"","",,,0 +7149,image/jpeg,0,0,,"","",,,0 +7150,image/jpeg,0,0,,"","",,,0 +7151,image/jpeg,0,0,,"","",,,0 +7152,image/jpeg,0,0,,"","",,,0 +7153,image/jpeg,0,0,,"","",,,0 +7154,image/jpeg,0,0,,"","",,,0 +7155,image/jpeg,0,0,,"","",,,0 +7156,image/jpeg,0,0,,"","",,,0 +7157,image/jpeg,0,0,,"","",,,0 +7158,image/jpeg,0,0,,"","",,,0 +7159,image/jpeg,0,0,,"","",,,0 +7160,image/jpeg,0,0,,"","",,,0 +7161,image/jpeg,0,0,,"","",,,0 +7162,image/jpeg,0,0,,"","",,,0 +7163,image/jpeg,0,0,,"","",,,0 +7164,image/jpeg,0,0,,"","",,,0 +7165,image/jpeg,0,0,,"","",,,0 +7166,image/jpeg,0,0,,"","",,,0 +7167,image/jpeg,0,0,,"","",,,0 +7168,image/jpeg,0,0,,"","",,,0 +7169,image/jpeg,0,0,,"","",,,0 +7170,image/jpeg,0,0,,"","",,,0 +7171,image/jpeg,0,0,,"","",,,0 +7172,image/jpeg,0,0,,"","",,,0 +7173,image/jpeg,0,0,,"","",,,0 +7174,image/jpeg,0,0,,"","",,,0 +7175,image/jpeg,0,0,,"","",,,0 +7176,image/jpeg,0,0,,"","",,,0 +7177,image/jpeg,0,0,,"","",,,0 +7178,image/jpeg,0,0,,"","",,,0 +7179,image/jpeg,0,0,,"","",,,0 +7180,image/jpeg,0,0,,"","",,,0 +7181,image/jpeg,0,0,,"","",,,0 +7182,image/jpeg,0,0,,"","",,,0 +7183,image/jpeg,0,0,,"","",,,0 +7184,image/jpeg,0,0,,"","",,,0 +7185,image/jpeg,0,0,,"","",,,0 +7186,image/jpeg,0,0,,"","",,,0 +7187,image/jpeg,0,0,,"","",,,0 +7188,image/jpeg,0,0,,"","",,,0 +7189,image/jpeg,0,0,,"","",,,0 +7190,image/jpeg,0,0,,"","",,,0 +7191,image/jpeg,0,0,,"","",,,0 +7192,image/jpeg,0,0,,"","",,,0 +7193,image/jpeg,0,0,,"","",,,0 +7194,image/jpeg,0,0,,"","",,,0 +7195,image/jpeg,0,0,,"","",,,0 +7196,image/jpeg,0,0,,"","",,,0 +7197,image/jpeg,0,0,,"","",,,0 +7198,image/jpeg,0,0,,"","",,,0 +7199,image/jpeg,0,0,,"","",,,0 +7200,image/jpeg,0,0,,"","",,,0 +7201,image/jpeg,0,0,,"","",,,0 +7202,image/jpeg,0,0,,"","",,,0 +7203,image/jpeg,0,0,,"","",,,0 +7204,image/jpeg,0,0,,"","",,,0 +7205,image/jpeg,0,0,,"","",,,0 +7206,image/jpeg,0,0,,"","",,,0 +7207,image/jpeg,0,0,,"","",,,0 +7208,image/jpeg,0,0,,"","",,,0 +7209,image/jpeg,0,0,,"","",,,0 +7210,image/jpeg,0,0,,"","",,,0 +7211,image/jpeg,0,0,,"","",,,0 +7212,image/jpeg,0,0,,"","",,,0 +7213,image/jpeg,0,0,,"","",,,0 +7214,image/jpeg,0,0,,"","",,,0 +7215,image/jpeg,0,0,,"","",,,0 +7216,image/jpeg,0,0,,"","",,,0 +7217,image/jpeg,0,0,,"","",,,0 +7218,image/jpeg,0,0,,"","",,,0 +7219,image/jpeg,0,0,,"","",,,0 +7220,image/jpeg,0,0,,"","",,,0 +7221,image/jpeg,0,0,,"","",,,0 +7222,image/jpeg,0,0,,"","",,,0 +7223,image/jpeg,0,0,,"","",,,0 +7224,image/jpeg,0,0,,"","",,,0 +7225,image/jpeg,0,0,,"","",,,0 +7226,image/jpeg,0,0,,"","",,,0 +7227,image/jpeg,0,0,,"","",,,0 +7228,image/jpeg,0,0,,"","",,,0 +7229,image/jpeg,0,0,,"","",,,0 +7230,image/jpeg,0,0,,"","",,,0 +7231,image/jpeg,0,0,,"","",,,0 +7232,image/jpeg,0,0,,"","",,,0 +7233,image/jpeg,0,0,,"","",,,0 +7234,image/jpeg,0,0,,"","",,,0 +7235,image/jpeg,0,0,,"","",,,0 +7236,image/jpeg,0,0,,"","",,,0 +7237,image/jpeg,0,0,,"","",,,0 +7238,image/jpeg,0,0,,"","",,,0 +7239,image/jpeg,0,0,,"","",,,0 +7240,image/jpeg,0,0,,"","",,,0 +7241,image/jpeg,0,0,,"","",,,0 +7242,image/jpeg,0,0,,"","",,,0 +7243,image/jpeg,0,0,,"","",,,0 +7244,image/jpeg,0,0,,"","",,,0 +7245,image/jpeg,0,0,,"","",,,0 +7246,image/jpeg,0,0,,"","",,,0 +7247,image/jpeg,0,0,,"","",,,0 +7248,image/jpeg,0,0,,"","",,,0 +7249,image/jpeg,0,0,,"","",,,0 +7250,image/jpeg,0,0,,"","",,,0 +7251,image/jpeg,0,0,,"","",,,0 +7252,image/jpeg,0,0,,"","",,,0 +7253,image/jpeg,0,0,,"","",,,0 +7254,image/jpeg,0,0,,"","",,,0 +7255,image/jpeg,0,0,,"","",,,0 +7256,image/jpeg,0,0,,"","",,,0 +7257,image/jpeg,0,0,,"","",,,0 +7258,image/jpeg,0,0,,"","",,,0 +7259,image/jpeg,0,0,,"","",,,0 +7260,image/jpeg,0,0,,"","",,,0 +7261,image/jpeg,0,0,,"","",,,0 +7262,image/jpeg,0,0,,"","",,,0 +7263,image/jpeg,0,0,,"","",,,0 +7264,image/jpeg,0,0,,"","",,,0 +7265,image/jpeg,0,0,,"","",,,0 +7266,image/jpeg,0,0,,"","",,,0 +7267,image/jpeg,0,0,,"","",,,0 +7268,image/jpeg,0,0,,"","",,,0 +7269,image/jpeg,0,0,,"","",,,0 +7270,image/jpeg,0,0,,"","",,,0 +7271,image/jpeg,0,0,,"","",,,0 +7272,image/jpeg,0,0,,"","",,,0 +7273,image/jpeg,0,0,,"","",,,0 +7274,image/jpeg,0,0,,"","",,,0 +7275,image/jpeg,0,0,,"","",,,0 +7276,image/jpeg,0,0,,"","",,,0 +7277,image/jpeg,0,0,,"","",,,0 +7278,image/jpeg,0,0,,"","",,,0 +7279,image/jpeg,0,0,,"","",,,0 +7280,image/jpeg,0,0,,"","",,,0 +7281,image/jpeg,0,0,,"","",,,0 +7282,image/jpeg,0,0,,"","",,,0 +7283,image/jpeg,0,0,,"","",,,0 +7284,image/jpeg,0,0,,"","",,,0 +7285,image/jpeg,0,0,,"","",,,0 +7286,image/jpeg,0,0,,"","",,,0 +7287,image/jpeg,0,0,,"","",,,0 +7288,image/jpeg,0,0,,"","",,,0 +7289,image/jpeg,0,0,,"","",,,0 +7290,image/jpeg,0,0,,"","",,,0 +7291,image/jpeg,0,0,,"","",,,0 +7292,image/jpeg,0,0,,"","",,,0 +7293,image/jpeg,0,0,,"","",,,0 +7294,image/jpeg,0,0,,"","",,,0 +7295,image/jpeg,0,0,,"","",,,0 +7296,image/jpeg,0,0,,"","",,,0 +7297,image/jpeg,0,0,,"","",,,0 +7298,image/jpeg,0,0,,"","",,,0 +7299,image/jpeg,0,0,,"","",,,0 +7300,image/jpeg,0,0,,"","",,,0 +7301,image/jpeg,0,0,,"","",,,0 +7302,image/jpeg,0,0,,"","",,,0 +7303,image/jpeg,0,0,,"","",,,0 +7304,image/jpeg,0,0,,"","",,,0 +7305,image/jpeg,0,0,,"","",,,0 +7306,image/jpeg,0,0,,"","",,,0 +7307,image/jpeg,0,0,,"","",,,0 +7308,image/jpeg,0,0,,"","",,,0 +7309,image/jpeg,0,0,,"","",,,0 +7310,image/jpeg,0,0,,"","",,,0 +7311,image/jpeg,0,0,,"","",,,0 +7312,image/jpeg,0,0,,"","",,,0 +7313,image/jpeg,0,0,,"","",,,0 +7314,image/jpeg,0,0,,"","",,,0 +7315,image/jpeg,0,0,,"","",,,0 +7316,image/jpeg,0,0,,"","",,,0 +7317,image/jpeg,0,0,,"","",,,0 +7318,image/jpeg,0,0,,"","",,,0 +7319,image/jpeg,0,0,,"","",,,0 +7320,image/jpeg,0,0,,"","",,,0 +7321,image/jpeg,0,0,,"","",,,0 +7322,image/jpeg,0,0,,"","",,,0 +7323,image/jpeg,1672502012254,0,0,"","",,,0 +7324,image/jpeg,0,0,,"","",,,0 +7325,image/jpeg,0,0,,"","",,,0 +7326,image/jpeg,0,0,,"","",,,0 +7327,image/jpeg,0,0,,"","",,,0 +7328,image/jpeg,0,0,,"","",,,0 +7329,image/jpeg,0,0,,"","",,,0 +7330,image/jpeg,0,0,,"","",,,0 +7331,image/jpeg,0,0,,"","",,,0 +7332,image/jpeg,0,0,,"","",,,0 +7333,image/jpeg,0,0,,"","",,,0 +7334,image/jpeg,0,0,,"","",,,0 +7335,image/jpeg,0,0,,"","",,,0 +7336,image/jpeg,0,0,,"","",,,0 +7337,image/jpeg,0,0,,"","",,,0 +7338,image/jpeg,1672393116174,0,0,"","",,,0 +7339,image/jpeg,0,0,,"","",,,0 +7340,image/jpeg,0,0,,"","",,,0 +7341,image/jpeg,0,0,,"","",,,0 +7342,image/jpeg,0,0,,"","",,,0 +7343,image/jpeg,0,0,,"","",,,0 +7344,image/jpeg,0,0,,"","",,,0 +7345,image/jpeg,0,0,,"","",,,0 +7346,image/jpeg,0,0,,"","",,,0 +7347,image/jpeg,0,0,,"","",,,0 +7348,image/jpeg,0,0,,"","",,,0 +7349,image/jpeg,0,0,,"","",,,0 +7350,image/jpeg,0,0,,"","",,,0 +7351,image/jpeg,0,0,,"","",,,0 +7352,image/jpeg,0,0,,"","",,,0 +7353,image/jpeg,0,0,,"","",,,0 +7354,image/jpeg,0,0,,"","",,,0 +7355,image/jpeg,0,0,,"","",,,0 +7356,image/jpeg,0,0,,"","",,,0 +7357,image/jpeg,0,0,,"","",,,0 +7358,image/jpeg,0,0,,"","",,,0 +7359,image/jpeg,0,0,,"","",,,0 +7360,image/jpeg,0,0,,"","",,,0 +7361,image/jpeg,0,0,,"","",,,0 +7362,image/jpeg,0,0,,"","",,,0 +7363,image/jpeg,0,0,,"","",,,0 +7364,image/jpeg,0,0,,"","",,,0 +7365,image/jpeg,0,0,,"","",,,0 +7366,image/jpeg,0,0,,"","",,,0 +7367,image/jpeg,0,0,,"","",,,0 +7368,image/jpeg,0,0,,"","",,,0 +7369,image/jpeg,0,0,,"","",,,0 +7370,image/jpeg,0,0,,"","",,,0 +7371,image/jpeg,0,0,,"","",,,0 +7372,image/jpeg,0,0,,"","",,,0 +7373,image/jpeg,0,0,,"","",,,0 +7374,image/jpeg,0,0,,"","",,,0 +7375,image/jpeg,0,0,,"","",,,0 +7376,image/jpeg,0,0,,"","",,,0 +7377,image/jpeg,0,0,,"","",,,0 +7378,image/jpeg,0,0,,"","",,,0 +7379,image/jpeg,0,0,,"","",,,0 +7380,image/jpeg,0,0,,"","",,,0 +7381,image/jpeg,0,0,,"","",,,0 +7382,image/jpeg,0,0,,"","",,,0 +7383,image/jpeg,0,0,,"","",,,0 +7384,image/jpeg,0,0,,"","",,,0 +7385,image/jpeg,0,0,,"","",,,0 +7386,image/jpeg,0,0,,"","",,,0 +7387,image/jpeg,0,0,,"","",,,0 +7388,image/jpeg,0,0,,"","",,,0 +7389,image/jpeg,0,0,,"","",,,0 +7390,image/jpeg,0,0,,"","",,,0 +7391,image/jpeg,0,0,,"","",,,0 +7392,image/jpeg,0,0,,"","",,,0 +7393,image/jpeg,0,0,,"","",,,0 +7394,image/jpeg,0,0,,"","",,,0 +7395,image/jpeg,0,0,,"","",,,0 +7396,image/jpeg,0,0,,"","",,,0 +7397,image/jpeg,0,0,,"","",,,0 +7398,image/jpeg,0,0,,"","",,,0 +7399,image/jpeg,0,0,,"","",,,0 +7400,image/jpeg,0,0,,"","",,,0 +7401,image/jpeg,0,0,,"","",,,0 +7402,image/jpeg,0,0,,"","",,,0 +7403,image/jpeg,0,0,,"","",,,0 +7404,image/jpeg,0,0,,"","",,,0 +7405,image/jpeg,0,0,,"","",,,0 +7406,image/jpeg,0,0,,"","",,,0 +7407,image/jpeg,0,0,,"","",,,0 +7408,image/jpeg,0,0,,"","",,,0 +7409,image/jpeg,0,0,,"","",,,0 +7410,image/jpeg,0,0,,"","",,,0 +7411,image/jpeg,0,0,,"","",,,0 +7412,image/jpeg,0,0,,"","",,,0 +7413,image/jpeg,0,0,,"","",,,0 +7414,image/jpeg,0,0,,"","",,,0 +7415,image/jpeg,0,0,,"","",,,0 +7416,image/jpeg,0,0,,"","",,,0 +7417,image/jpeg,0,0,,"","",,,0 +7418,image/jpeg,0,0,,"","",,,0 +7419,image/jpeg,0,0,,"","",,,0 +7420,image/jpeg,0,0,,"","",,,0 +7421,image/jpeg,0,0,,"","",,,0 +7422,image/jpeg,0,0,,"","",,,0 +7423,image/jpeg,0,0,,"","",,,0 +7424,image/jpeg,0,0,,"","",,,0 +7425,image/jpeg,0,0,,"","",,,0 +7426,image/jpeg,0,0,,"","",,,0 +7427,image/jpeg,0,0,,"","",,,0 +7428,image/jpeg,0,0,,"","",,,0 +7429,image/jpeg,0,0,,"","",,,0 +7430,image/jpeg,0,0,,"","",,,0 +7431,image/jpeg,0,0,,"","",,,0 +7432,image/jpeg,0,0,,"","",,,0 +7433,image/jpeg,0,0,,"","",,,0 +7434,image/jpeg,0,0,,"","",,,0 +7435,image/jpeg,0,0,,"","",,,0 +7436,image/jpeg,0,0,,"","",,,0 +7437,image/jpeg,0,0,,"","",,,0 +7438,image/jpeg,0,0,,"","",,,0 +7439,image/jpeg,0,0,,"","",,,0 +7440,image/jpeg,0,0,,"","",,,0 +7441,image/jpeg,0,0,,"","",,,0 +7442,image/jpeg,0,0,,"","",,,0 +7443,image/jpeg,0,0,,"","",,,0 +7444,image/jpeg,0,0,,"","",,,0 +7445,image/jpeg,0,0,,"","",,,0 +7446,image/jpeg,0,0,,"","",,,0 +7447,image/jpeg,0,0,,"","",,,0 +7448,image/jpeg,0,0,,"","",,,0 +7449,image/jpeg,0,0,,"","",,,0 +7450,image/jpeg,0,0,,"","",,,0 +7451,image/jpeg,0,0,,"","",,,0 +7452,image/jpeg,0,0,,"","",,,0 +7453,image/jpeg,0,0,,"","",,,0 +7454,image/jpeg,0,0,,"","",,,0 +7455,image/jpeg,0,0,,"","",,,0 +7456,image/jpeg,0,0,,"","",,,0 +7457,image/jpeg,0,0,,"","",,,0 +7458,image/jpeg,0,0,,"","",,,0 +7459,image/jpeg,0,0,,"","",,,0 +7460,image/jpeg,0,0,,"","",,,0 +7461,image/jpeg,0,0,,"","",,,0 +7462,image/jpeg,0,0,,"","",,,0 +7463,image/jpeg,0,0,,"","",,,0 +7464,image/jpeg,0,0,,"","",,,0 +7465,image/jpeg,0,0,,"","",,,0 +7466,image/jpeg,0,0,,"","",,,0 +7467,image/jpeg,0,0,,"","",,,0 +7468,image/jpeg,0,0,,"","",,,0 +7469,image/jpeg,0,0,,"","",,,0 +7470,image/jpeg,0,0,,"","",,,0 +7471,image/jpeg,0,0,,"","",,,0 +7472,image/jpeg,0,0,,"","",,,0 +7473,image/jpeg,0,0,,"","",,,0 +7474,image/jpeg,0,0,,"","",,,0 +7475,image/jpeg,0,0,,"","",,,0 +7476,image/jpeg,0,0,,"","",,,0 +7477,image/jpeg,0,0,,"","",,,0 +7478,image/jpeg,0,0,,"","",,,0 +7479,image/jpeg,0,0,,"","",,,0 +7480,image/jpeg,0,0,,"","",,,0 +7481,image/jpeg,0,0,,"","",,,0 +7482,image/jpeg,0,0,,"","",,,0 +7483,image/jpeg,0,0,,"","",,,0 +7484,image/jpeg,0,0,,"","",,,0 +7485,image/jpeg,0,0,,"","",,,0 +7486,image/jpeg,0,0,,"","",,,0 +7487,image/jpeg,0,0,,"","",,,0 +7488,image/jpeg,0,0,,"","",,,0 +7489,image/jpeg,0,0,,"","",,,0 +7490,image/jpeg,0,0,,"","",,,0 +7491,image/jpeg,0,0,,"","",,,0 +7492,image/jpeg,0,0,,"","",,,0 +7493,image/jpeg,0,0,,"","",,,0 +7494,image/jpeg,0,0,,"","",,,0 +7495,image/jpeg,0,0,,"","",,,0 +7496,image/jpeg,0,0,,"","",,,0 +7497,image/jpeg,0,0,,"","",,,0 +7498,image/jpeg,0,0,,"","",,,0 +7499,image/jpeg,0,0,,"","",,,0 +7500,image/jpeg,0,0,,"","",,,0 +7501,image/jpeg,0,0,,"","",,,0 +7502,image/jpeg,0,0,,"","",,,0 +7503,image/jpeg,0,0,,"","",,,0 +7504,image/jpeg,0,0,,"","",,,0 +7505,image/jpeg,0,0,,"","",,,0 +7506,image/jpeg,0,0,,"","",,,0 +7507,image/jpeg,0,0,,"","",,,0 +7508,image/jpeg,0,0,,"","",,,0 +7509,image/jpeg,0,0,,"","",,,0 +7510,image/jpeg,0,0,,"","",,,0 +7511,image/jpeg,0,0,,"","",,,0 +7512,image/jpeg,0,0,,"","",,,0 +7513,image/jpeg,0,0,,"","",,,0 +7514,image/jpeg,0,0,,"","",,,0 +7515,image/jpeg,0,0,,"","",,,0 +7516,image/jpeg,1670015518328,0,90,"","",,,0 +7517,image/jpeg,1670014520473,0,90,"","",,,0 +7518,image/jpeg,0,0,,"","",,,0 +7519,image/jpeg,0,0,,"","",,,0 +7520,image/jpeg,0,0,,"","",,,0 +7521,image/jpeg,0,0,,"","",,,0 +7522,image/jpeg,0,0,,"","",,,0 +7523,image/jpeg,0,0,,"","",,,0 +7524,image/jpeg,0,0,,"","",,,0 +7525,image/jpeg,0,0,,"","",,,0 +7526,image/jpeg,0,0,,"","",,,0 +7527,image/jpeg,0,0,,"","",,,0 +7528,image/jpeg,0,0,,"","",,,0 +7529,image/jpeg,0,0,,"","",,,0 +7530,image/jpeg,0,0,,"","",,,0 +7531,image/jpeg,0,0,,"","",,,0 +7532,image/jpeg,0,0,,"","",,,0 +7533,image/jpeg,0,0,,"","",,,0 +7534,image/jpeg,0,0,,"","",,,0 +7535,image/jpeg,0,0,,"","",,,0 +7536,image/jpeg,0,0,,"","",,,0 +7537,image/jpeg,0,0,,"","",,,0 +7538,image/jpeg,0,0,,"","",,,0 +7539,image/jpeg,0,0,,"","",,,0 +7540,image/jpeg,0,0,,"","",,,0 +7541,image/jpeg,0,0,,"","",,,0 +7542,image/jpeg,0,0,,"","",,,0 +7543,image/jpeg,0,0,,"","",,,0 +7544,image/jpeg,0,0,,"","",,,0 +7545,image/jpeg,0,0,,"","",,,0 +7546,image/jpeg,0,0,,"","",,,0 +7547,image/jpeg,0,0,,"","",,,0 +7548,image/jpeg,0,0,,"","",,,0 +7549,image/jpeg,0,0,,"","",,,0 +7550,image/jpeg,0,0,,"","",,,0 +7551,image/jpeg,0,0,,"","",,,0 +7552,image/jpeg,0,0,,"","",,,0 +7553,image/jpeg,0,0,,"","",,,0 +7554,image/jpeg,0,0,,"","",,,0 +7555,image/jpeg,0,0,,"","",,,0 +7556,image/jpeg,0,0,,"","",,,0 +7557,image/jpeg,0,0,,"","",,,0 +7558,image/jpeg,0,0,,"","",,,0 +7559,image/jpeg,0,0,,"","",,,0 +7560,image/jpeg,0,0,,"","",,,0 +7561,image/jpeg,0,0,,"","",,,0 +7562,image/jpeg,0,0,,"","",,,0 +7563,image/jpeg,0,0,,"","",,,0 +7564,image/jpeg,0,0,,"","",,,0 +7565,image/jpeg,0,0,,"","",,,0 +7566,image/jpeg,0,0,,"","",,,0 +7567,image/jpeg,0,0,,"","",,,0 +7568,image/jpeg,0,0,,"","",,,0 +7569,image/jpeg,0,0,,"","",,,0 +7570,image/jpeg,0,0,,"","",,,0 +7571,image/jpeg,0,0,,"","",,,0 +7572,image/jpeg,0,0,,"","",,,0 +7573,image/jpeg,0,0,,"","",,,0 +7574,image/jpeg,0,0,,"","",,,0 +7575,image/jpeg,0,0,,"","",,,0 +7576,image/jpeg,0,0,,"","",,,0 +7577,image/jpeg,0,0,,"","",,,0 +7578,image/jpeg,0,0,,"","",,,0 +7579,image/jpeg,0,0,,"","",,,0 +7580,image/jpeg,0,0,,"","",,,0 +7581,image/jpeg,0,0,,"","",,,0 +7582,image/jpeg,0,0,,"","",,,0 +7583,image/jpeg,0,0,,"","",,,0 +7584,image/jpeg,0,0,,"","",,,0 +7585,image/jpeg,0,0,,"","",,,0 +7586,image/jpeg,0,0,,"","",,,0 +7587,image/jpeg,0,0,,"","",,,0 +7588,image/jpeg,0,0,,"","",,,0 +7589,image/jpeg,0,0,,"","",,,0 +7590,image/jpeg,0,0,,"","",,,0 +7591,image/jpeg,0,0,,"","",,,0 +7592,image/jpeg,0,0,,"","",,,0 +7593,image/jpeg,1668765580899,0,90,"","",,,0 +7594,image/jpeg,0,0,,"","",,,0 +7595,image/jpeg,0,0,,"","",,,0 +7596,image/jpeg,0,0,,"","",,,0 +7597,image/jpeg,0,0,,"","",,,0 +7598,image/jpeg,0,0,,"","",,,0 +7599,image/jpeg,0,0,,"","",,,0 +7600,image/jpeg,0,0,,"","",,,0 +7601,image/jpeg,0,0,,"","",,,0 +7602,image/jpeg,0,0,,"","",,,0 +7603,image/jpeg,0,0,,"","",,,0 +7604,image/jpeg,0,0,,"","",,,0 +7605,image/jpeg,0,0,,"","",,,0 +7606,image/jpeg,0,0,,"","",,,0 +7607,image/jpeg,0,0,,"","",,,0 +7608,image/jpeg,0,0,,"","",,,0 +7609,image/jpeg,0,0,,"","",,,0 +7610,image/jpeg,0,0,,"","",,,0 +7611,image/jpeg,0,0,,"","",,,0 +7612,image/jpeg,0,0,,"","",,,0 +7613,image/jpeg,0,0,,"","",,,0 +7614,image/jpeg,0,0,,"","",,,0 +7615,image/jpeg,0,0,,"","",,,0 +7616,image/jpeg,0,0,,"","",,,0 +7617,image/jpeg,0,0,,"","",,,0 +7618,image/jpeg,0,0,,"","",,,0 +7619,image/jpeg,0,0,,"","",,,0 +7620,image/jpeg,0,0,,"","",,,0 +7621,image/jpeg,0,0,,"","",,,0 +7622,image/jpeg,0,0,,"","",,,0 +7623,image/jpeg,0,0,,"","",,,0 +7624,image/jpeg,0,0,,"","",,,0 +7625,image/jpeg,0,0,,"","",,,0 +7626,image/jpeg,0,0,,"","",,,0 +7627,image/jpeg,0,0,,"","",,,0 +7628,image/jpeg,0,0,,"","",,,0 +7629,image/jpeg,1668074178288,0,90,"","",,,0 +7630,image/jpeg,0,0,,"","",,,0 +7631,image/jpeg,0,0,,"","",,,0 +7632,image/jpeg,0,0,,"","",,,0 +7633,image/jpeg,0,0,,"","",,,0 +7634,image/jpeg,0,0,,"","",,,0 +7635,image/jpeg,0,0,,"","",,,0 +7636,image/jpeg,0,0,,"","",,,0 +7637,image/jpeg,0,0,,"","",,,0 +7638,image/jpeg,0,0,,"","",,,0 +7639,image/jpeg,0,0,,"","",,,0 +7640,image/jpeg,0,0,,"","",,,0 +7641,image/jpeg,0,0,,"","",,,0 +7642,image/jpeg,0,0,,"","",,,0 +7643,image/jpeg,0,0,,"","",,,0 +7644,image/jpeg,0,0,,"","",,,0 +7645,image/jpeg,0,0,,"","",,,0 +7646,image/jpeg,0,0,,"","",,,0 +7647,image/jpeg,0,0,,"","",,,0 +7648,image/jpeg,0,0,,"","",,,0 +7649,image/jpeg,0,0,,"","",,,0 +7650,image/jpeg,0,0,,"","",,,0 +7651,image/jpeg,0,0,,"","",,,0 +7652,image/jpeg,0,0,,"","",,,0 +7653,image/jpeg,0,0,,"","",,,0 +7654,image/jpeg,0,0,,"","",,,0 +7655,image/jpeg,0,0,,"","",,,0 +7656,image/jpeg,0,0,,"","",,,0 +7657,image/jpeg,0,0,,"","",,,0 +7658,image/jpeg,0,0,,"","",,,0 +7659,image/jpeg,0,0,,"","",,,0 +7660,image/jpeg,0,0,,"","",,,0 +7661,image/jpeg,0,0,,"","",,,0 +7662,image/jpeg,0,0,,"","",,,0 +7663,image/jpeg,0,0,,"","",,,0 +7664,image/jpeg,0,0,,"","",,,0 +7665,image/jpeg,0,0,,"","",,,0 +7666,image/jpeg,0,0,,"","",,,0 +7667,image/jpeg,0,0,,"","",,,0 +7668,image/jpeg,0,0,,"","",,,0 +7669,image/jpeg,0,0,,"","",,,0 +7670,image/jpeg,0,0,,"","",,,0 +7671,image/jpeg,0,0,,"","",,,0 +7672,image/jpeg,0,0,,"","",,,0 +7673,image/jpeg,0,0,,"","",,,0 +7674,image/jpeg,0,0,,"","",,,0 +7675,image/jpeg,0,0,,"","",,,0 +7676,image/jpeg,0,0,,"","",,,0 +7677,image/jpeg,0,0,,"","",,,0 +7678,image/jpeg,0,0,,"","",,,0 +7679,image/jpeg,0,0,,"","",,,0 +7680,image/jpeg,0,0,,"","",,,0 +7681,image/jpeg,0,0,,"","",,,0 +7682,image/jpeg,0,0,,"","",,,0 +7683,image/jpeg,0,0,,"","",,,0 +7684,image/jpeg,0,0,,"","",,,0 +7685,image/jpeg,0,0,,"","",,,0 +7686,image/jpeg,0,0,,"","",,,0 +7687,image/jpeg,0,0,,"","",,,0 +7688,image/jpeg,0,0,,"","",,,0 +7689,image/jpeg,0,0,,"","",,,0 +7690,image/jpeg,0,0,,"","",,,0 +7691,image/jpeg,0,0,,"","",,,0 +7692,image/jpeg,0,0,,"","",,,0 +7693,image/jpeg,0,0,,"","",,,0 +7694,image/jpeg,0,0,,"","",,,0 +7695,image/jpeg,0,0,,"","",,,0 +7696,image/jpeg,0,0,,"","",,,0 +7697,image/jpeg,0,0,,"","",,,0 +7698,image/jpeg,0,0,,"","",,,0 +7699,image/jpeg,0,0,,"","",,,0 +7700,image/jpeg,0,0,,"","",,,0 +7701,image/jpeg,0,0,,"","",,,0 +7702,image/jpeg,0,0,,"","",,,0 +7703,image/jpeg,0,0,,"","",,,0 +7704,image/jpeg,0,0,,"","",,,0 +7705,image/jpeg,0,0,,"","",,,0 +7706,image/jpeg,0,0,,"","",,,0 +7707,image/jpeg,0,0,,"","",,,0 +7708,image/jpeg,0,0,,"","",,,0 +7709,image/jpeg,0,0,,"","",,,0 +7710,image/jpeg,0,0,,"","",,,0 +7711,image/jpeg,0,0,,"","",,,0 +7712,image/jpeg,0,0,,"","",,,0 +7713,image/jpeg,0,0,,"","",,,0 +7714,image/jpeg,0,0,,"","",,,0 +7715,image/jpeg,0,0,,"","",,,0 +7716,image/jpeg,0,0,,"","",,,0 +7717,image/jpeg,0,0,,"","",,,0 +7718,image/jpeg,0,0,,"","",,,0 +7719,image/jpeg,0,0,,"","",,,0 +7720,image/jpeg,0,0,,"","",,,0 +7721,image/jpeg,0,0,,"","",,,0 +7722,image/jpeg,0,0,,"","",,,0 +7723,image/jpeg,0,0,,"","",,,0 +7724,image/jpeg,0,0,,"","",,,0 +7725,image/jpeg,0,0,,"","",,,0 +7726,image/jpeg,0,0,,"","",,,0 +7727,image/jpeg,0,0,,"","",,,0 +7728,image/jpeg,0,0,,"","",,,0 +7729,image/jpeg,1667146761232,0,0,"","",,,0 +7730,image/jpeg,0,0,,"","",,,0 +7731,image/jpeg,0,0,,"","",,,0 +7732,image/jpeg,0,0,,"","",,,0 +7733,image/jpeg,0,0,,"","",,,0 +7734,image/jpeg,0,0,,"","",,,0 +7735,image/jpeg,0,0,,"","",,,0 +7736,image/jpeg,0,0,,"","",,,0 +7737,image/jpeg,0,0,,"","",,,0 +7738,image/jpeg,0,0,,"","",,,0 +7739,image/jpeg,0,0,,"","",,,0 +7740,image/jpeg,0,0,,"","",,,0 +7741,image/jpeg,0,0,,"","",,,0 +7742,image/jpeg,0,0,,"","",,,0 +7743,image/jpeg,0,0,,"","",,,0 +7744,image/jpeg,0,0,,"","",,,0 +7745,image/jpeg,0,0,,"","",,,0 +7746,image/jpeg,0,0,,"","",,,0 +7747,image/jpeg,0,0,,"","",,,0 +7748,image/jpeg,0,0,,"","",,,0 +7749,image/jpeg,0,0,,"","",,,0 +7750,image/jpeg,0,0,,"","",,,0 +7751,image/jpeg,0,0,,"","",,,0 +7752,image/jpeg,0,0,,"","",,,0 +7753,image/jpeg,0,0,,"","",,,0 +7754,image/jpeg,0,0,,"","",,,0 +7755,image/jpeg,0,0,,"","",,,0 +7756,image/jpeg,0,0,,"","",,,0 +7757,image/jpeg,0,0,,"","",,,0 +7758,image/jpeg,0,0,,"","",,,0 +7759,image/jpeg,0,0,,"","",,,0 +7760,image/jpeg,0,0,,"","",,,0 +7761,image/jpeg,0,0,,"","",,,0 +7762,image/jpeg,0,0,,"","",,,0 +7763,image/jpeg,0,0,,"","",,,0 +7764,image/jpeg,0,0,,"","",,,0 +7765,image/jpeg,0,0,,"","",,,0 +7766,image/jpeg,0,0,,"","",,,0 +7767,image/jpeg,0,0,,"","",,,0 +7768,image/jpeg,0,0,,"","",,,0 +7769,image/jpeg,0,0,,"","",,,0 +7770,image/jpeg,0,0,,"","",,,0 +7771,image/jpeg,0,0,,"","",,,0 +7772,image/jpeg,0,0,,"","",,,0 +7773,image/jpeg,0,0,,"","",,,0 +7774,image/jpeg,0,0,,"","",,,0 +7775,image/jpeg,0,0,,"","",,,0 +7776,image/jpeg,0,0,,"","",,,0 +7777,image/jpeg,1666866810365,0,90,"","",,,0 +7778,image/jpeg,1666866595250,0,90,"","",,,0 +7779,image/jpeg,1666866568366,0,90,"","",,,0 +7780,image/jpeg,0,0,,"","",,,0 +7781,image/jpeg,0,0,,"","",,,0 +7782,image/jpeg,0,0,,"","",,,0 +7783,image/jpeg,0,0,,"","",,,0 +7784,image/jpeg,0,0,,"","",,,0 +7785,image/jpeg,0,0,,"","",,,0 +7786,image/jpeg,0,0,,"","",,,0 +7787,image/jpeg,0,0,,"","",,,0 +7788,image/jpeg,0,0,,"","",,,0 +7789,image/jpeg,0,0,,"","",,,0 +7790,image/jpeg,0,0,,"","",,,0 +7791,image/jpeg,0,0,,"","",,,0 +7792,image/jpeg,0,0,,"","",,,0 +7793,image/jpeg,0,0,,"","",,,0 +7794,image/jpeg,0,0,,"","",,,0 +7795,image/jpeg,0,0,,"","",,,0 +7796,image/jpeg,0,0,,"","",,,0 +7797,image/jpeg,0,0,,"","",,,0 +7798,image/jpeg,0,0,,"","",,,0 +7799,image/jpeg,0,0,,"","",,,0 +7800,image/jpeg,0,0,,"","",,,0 +7801,image/jpeg,0,0,,"","",,,0 +7802,image/jpeg,0,0,,"","",,,0 +7803,image/jpeg,0,0,,"","",,,0 +7804,image/jpeg,0,0,,"","",,,0 +7805,image/jpeg,0,0,,"","",,,0 +7806,image/jpeg,0,0,,"","",,,0 +7807,image/jpeg,0,0,,"","",,,0 +7808,image/jpeg,0,0,,"","",,,0 +7809,image/jpeg,0,0,,"","",,,0 +7810,image/jpeg,0,0,,"","",,,0 +7811,image/jpeg,0,0,,"","",,,0 +7812,image/jpeg,0,0,,"","",,,0 +7813,image/jpeg,0,0,,"","",,,0 +7814,image/jpeg,0,0,,"","",,,0 +7815,image/jpeg,0,0,,"","",,,0 +7816,image/jpeg,0,0,,"","",,,0 +7817,image/jpeg,0,0,,"","",,,0 +7818,image/jpeg,0,0,,"","",,,0 +7819,image/jpeg,0,0,,"","",,,0 +7820,image/jpeg,0,0,,"","",,,0 +7821,image/png,0,0,,"","",,,0 +7822,image/jpeg,0,0,,"","",,,0 +7823,image/jpeg,0,0,,"","",,,0 +7824,image/jpeg,0,0,,"","",,,0 +7825,image/jpeg,0,0,,"","",,,0 +7826,image/jpeg,0,0,,"","",,,0 +7827,image/jpeg,0,0,,"","",,,0 +7828,image/jpeg,0,0,,"","",,,0 +7829,image/jpeg,0,0,,"","",,,0 +7830,image/jpeg,0,0,,"","",,,0 +7831,image/jpeg,0,0,,"","",,,0 +7832,image/jpeg,1666009790669,0,0,"","",44.2505833333333,12.0827888888889,0 +7833,image/jpeg,0,0,,"","",,,0 +7834,image/jpeg,0,0,,"","",,,0 +7835,image/jpeg,0,0,,"","",,,0 +7836,image/jpeg,0,0,,"","",,,0 +7837,image/jpeg,0,0,,"","",,,0 +7838,image/jpeg,0,0,,"","",,,0 +7839,image/jpeg,1665766999000,0,,"","",,,0 +7840,image/jpeg,0,0,,"","",,,0 +7841,image/jpeg,0,0,,"","",,,0 +7842,image/jpeg,0,0,,"","",,,0 +7843,image/jpeg,0,0,,"","",,,0 +7844,image/jpeg,0,0,,"","",,,0 +7845,image/jpeg,0,0,,"","",,,0 +7846,image/jpeg,0,0,,"","",,,0 +7847,image/jpeg,1665754391370,0,0,"","",44.2237277777778,11.7724444444444,0 +7848,image/jpeg,1665754366919,0,0,"","",44.2238638888889,11.7724583333333,0 +7849,image/jpeg,0,0,,"","",,,0 +7850,image/jpeg,1665750982848,0,0,"","",44.2265861111111,11.7633722222222,0 +7851,image/jpeg,1665750981761,0,0,"","",44.2265888888889,11.7633777777778,0 +7852,image/jpeg,1665750979400,0,0,"","",44.2265833333333,11.7633777777778,0 +7853,image/jpeg,1665748983200,0,0,"","",44.2372694444444,11.767575,0 +7854,image/jpeg,1665748983903,0,0,"","",44.2372694444444,11.767575,0 +7855,image/jpeg,1665748979210,0,0,"","",44.2372694444444,11.7675666666667,0 +7856,image/jpeg,1665748972758,0,0,"","",44.2372638888889,11.7675666666667,0 +7857,image/jpeg,1665745332628,0,0,"","",44.2482444444444,11.7840722222222,0 +7858,image/jpeg,1665745316548,0,0,"","",44.2482472222222,11.7840638888889,0 +7859,image/jpeg,1665745287792,0,0,"","",44.2482333333333,11.7840361111111,0 +7860,image/jpeg,1665745283442,0,0,"","",44.248225,11.78405,0 +7861,image/jpeg,1665744735460,0,0,"","",44.2505388888889,11.7854111111111,0 +7862,image/jpeg,1665744731328,0,0,"","",44.2505333333333,11.7854111111111,0 +7863,image/jpeg,1665744722565,0,0,"","",44.2505444444444,11.785425,0 +7864,image/jpeg,1665744691209,0,0,"","",44.2505472222222,11.7854305555556,0 +7865,image/jpeg,1665742791521,0,0,"","",44.2548361111111,11.7848388888889,0 +7866,image/jpeg,1665742702613,0,0,"","",44.2551416666667,11.7851111111111,0 +7867,image/jpeg,1665742296560,0,0,"","",44.2574694444444,11.7834194444444,0 +7868,image/jpeg,1665738559480,0,0,"","",44.2560527777778,11.7600777777778,0 +7869,image/jpeg,1665738357330,0,0,"","",44.2543555555556,11.7587222222222,0 +7870,image/jpeg,1665738349808,0,0,"","",44.2543583333333,11.7587305555556,0 +7871,image/jpeg,1665738326458,0,0,"","",44.2542722222222,11.7587111111111,0 +7872,image/jpeg,1665737979659,0,0,"","",44.2522027777778,11.7576694444444,0 +7873,image/jpeg,1665737973400,0,0,"","",44.2522111111111,11.7576611111111,0 +7874,image/jpeg,1665737971105,0,0,"","",44.2522083333333,11.7576611111111,0 +7875,image/jpeg,1665737337575,0,0,"","",44.2466611111111,11.7552166666667,0 +7876,image/jpeg,1665737334996,0,0,"","",44.2466611111111,11.7552166666667,0 +7877,image/jpeg,1665737305279,0,0,"","",44.2467138888889,11.7552194444444,0 +7878,image/jpeg,1665737299909,0,0,"","",44.2467138888889,11.7552166666667,0 +7879,image/jpeg,1665737290479,0,0,"","",44.2466777777778,11.7551944444444,0 +7880,image/jpeg,1665737251000,0,0,"","",44.2465416666667,11.7552527777778,0 +7881,image/jpeg,1665737244000,0,0,"","",44.2465416666667,11.7552555555556,0 +7882,image/jpeg,1665737173772,0,0,"","",44.2462305555556,11.7546916666667,0 +7883,image/jpeg,1665736422313,0,0,"","",44.2418944444444,11.7532583333333,0 +7884,image/jpeg,1665736409583,0,0,"","",44.2418888888889,11.7532722222222,0 +7885,image/jpeg,1665736398426,0,0,"","",44.2418888888889,11.7532694444444,0 +7886,image/jpeg,1665736017619,0,0,"","",44.2411111111111,11.75375,0 +7887,image/jpeg,1665734414768,0,0,"","",44.2282,11.7534305555556,0 +7888,image/jpeg,1665732449888,0,0,"","",44.2268055555556,11.763525,0 +7889,image/jpeg,0,0,,"","",,,0 +7890,image/jpeg,0,0,,"","",,,0 +7891,image/jpeg,1665677906907,0,0,"","",44.2353138888889,12.0080444444444,0 +7892,image/jpeg,0,0,,"","",,,0 +7893,image/jpeg,0,0,,"","",,,0 +7894,image/jpeg,0,0,,"","",,,0 +7895,image/jpeg,0,0,,"","",,,0 +7896,image/jpeg,0,0,,"","",,,0 +7897,image/jpeg,0,0,,"","",,,0 +7898,image/jpeg,0,0,,"","",,,0 +7899,image/jpeg,0,0,,"","",,,0 +7900,image/jpeg,0,0,,"","",,,0 +7901,image/jpeg,0,0,,"","",,,0 +7902,image/jpeg,0,0,,"","",,,0 +7903,image/jpeg,0,0,,"","",,,0 +7904,image/jpeg,0,0,,"","",,,0 +7905,image/jpeg,0,0,,"","",,,0 +7906,image/jpeg,0,0,,"","",,,0 +7907,image/jpeg,0,0,,"","",,,0 +7908,image/jpeg,0,0,,"","",,,0 +7909,image/jpeg,0,0,,"","",,,0 +7910,image/jpeg,0,0,,"","",,,0 +7911,image/jpeg,1665307357686,0,0,"","",45.6860666666667,13.7466527777778,0 +7912,image/jpeg,1665307354520,0,0,"","",45.6860583333333,13.7466472222222,0 +7913,image/jpeg,0,0,,"","",,,0 +7914,image/jpeg,0,0,,"","",,,0 +7915,image/jpeg,1665303566000,0,0,"","",45.6819638888889,13.7502166666667,0 +7916,image/jpeg,1665303551000,0,0,"","",45.6819666666667,13.7502055555556,0 +7917,image/jpeg,1665303546000,0,0,"","",45.6819666666667,13.7502,0 +7918,image/jpeg,1665303533000,0,0,"","",45.6819694444444,13.7502,0 +7919,image/jpeg,1665254655335,0,0,"","",45.6506194444444,13.7640138888889,0 +7920,image/jpeg,1665254597333,0,0,"","",45.6505055555556,13.7641888888889,0 +7921,image/jpeg,1665254491374,0,0,"","",45.6504138888889,13.7642611111111,0 +7922,image/jpeg,1665254485600,0,0,"","",45.6504138888889,13.7642611111111,0 +7923,image/jpeg,1665254425172,0,0,"","",45.6503,13.7643055555556,0 +7924,image/jpeg,1665254415984,0,0,"","",45.6503,13.7643138888889,0 +7925,image/jpeg,1665254410315,0,0,"","",45.6503,13.7643166666667,0 +7926,image/jpeg,1665254355000,0,0,"","",45.6503444444444,13.7641861111111,0 +7927,image/jpeg,1665254290650,0,0,"","",45.6503888888889,13.7641805555556,0 +7928,image/jpeg,1665254275832,0,0,"","",45.6503722222222,13.7641527777778,0 +7929,image/jpeg,1665254235340,0,0,"","",45.6502861111111,13.7641,0 +7930,image/jpeg,1665254233333,0,0,"","",45.6502861111111,13.7641,0 +7931,image/jpeg,1665254178853,0,0,"","",45.6502944444444,13.7641388888889,0 +7932,image/jpeg,1665253982260,0,0,"","",45.6502527777778,13.7642583333333,0 +7933,image/jpeg,1665253977727,0,0,"","",45.6502527777778,13.7642666666667,0 +7934,image/jpeg,1665253916615,0,0,"","",45.6502583333333,13.7642305555556,0 +7935,image/jpeg,1665253893279,0,0,"","",45.6502777777778,13.764225,0 +7936,image/jpeg,1665253889724,0,0,"","",45.6502833333333,13.7642222222222,0 +7937,image/jpeg,1665253788435,0,0,"","",45.6501666666667,13.7642833333333,0 +7938,image/jpeg,1665253775567,0,0,"","",45.6501527777778,13.7643222222222,0 +7939,image/jpeg,1665253764710,0,0,"","",45.6501333333333,13.7643222222222,0 +7940,image/jpeg,1665253744975,0,0,"","",45.6500666666667,13.7644527777778,0 +7941,image/jpeg,1665253739671,0,0,"","",45.6500583333333,13.7644694444444,0 +7942,image/jpeg,1665253715502,0,0,"","",45.6500638888889,13.7644666666667,0 +7943,image/jpeg,1665253065830,0,0,"","",45.6499666666667,13.764525,0 +7944,image/jpeg,1665253035148,0,0,"","",45.6499694444444,13.7645388888889,0 +7945,image/jpeg,1665253028485,0,0,"","",45.64995,13.7645444444444,0 +7946,image/jpeg,1665253026151,0,0,"","",45.6499527777778,13.7645444444444,0 +7947,image/jpeg,1665252249627,0,0,"","",45.6499138888889,13.7645972222222,0 +7948,image/jpeg,1665252220992,0,0,"","",45.6499138888889,13.7646027777778,0 +7949,image/jpeg,1665252216400,0,0,"","",45.6499083333333,13.7645944444444,0 +7950,image/jpeg,1665251539710,0,0,"","",45.6498611111111,13.7646527777778,0 +7951,image/jpeg,1665251016347,0,0,"","",45.6498555555556,13.7646361111111,0 +7952,image/jpeg,1665250488530,0,0,"","",45.6498416666667,13.7646861111111,0 +7953,image/jpeg,1665250453830,0,0,"","",45.6498527777778,13.7647,0 +7954,image/jpeg,1665250407795,0,0,"","",45.6498305555556,13.7646833333333,0 +7955,image/jpeg,1665250369720,0,0,"","",45.6498444444444,13.7646861111111,0 +7956,image/jpeg,1665250331424,0,0,"","",45.6498472222222,13.7646888888889,0 +7957,image/jpeg,1665249691239,0,0,"","",45.6498083333333,13.7647277777778,0 +7958,image/jpeg,1665249691239,0,0,"","",45.6498083333333,13.7647277777778,0 +7959,image/jpeg,1665249691239,0,0,"","",45.6498083333333,13.7647277777778,0 +7960,image/jpeg,1665249657649,0,0,"","",45.6498111111111,13.7647222222222,0 +7961,image/jpeg,1665249603872,0,0,"","",45.6498083333333,13.7647194444444,0 +7962,image/jpeg,1665249431975,0,0,"","",45.6498277777778,13.7647277777778,0 +7963,image/jpeg,1665249418704,0,0,"","",45.6498138888889,13.764725,0 +7964,image/jpeg,1665249412857,0,0,"","",45.6498138888889,13.7647138888889,0 +7965,image/jpeg,1665249344394,0,0,"","",45.6498194444444,13.7648277777778,0 +7966,image/jpeg,1665249338978,0,0,"","",45.6498333333333,13.7648083333333,0 +7967,image/jpeg,1665249257790,0,0,"","",45.6498,13.7650416666667,0 +7968,image/jpeg,1665249252815,0,0,"","",45.6498027777778,13.7650166666667,0 +7969,image/jpeg,1665249248150,0,0,"","",45.6498111111111,13.7650083333333,0 +7970,image/jpeg,1665249083000,0,0,"","",45.6502694444444,13.765775,0 +7971,image/jpeg,1665249076716,0,0,"","",45.6502861111111,13.7657888888889,0 +7972,image/jpeg,1665238114125,0,0,"","",45.6488194444444,13.7624083333333,0 +7973,image/jpeg,0,0,,"","",,,0 +7974,image/jpeg,0,0,,"","",,,0 +7975,image/jpeg,0,0,,"","",,,0 +7976,image/jpeg,1665237323762,0,0,"","",45.6499027777778,13.7647416666667,0 +7977,image/jpeg,1665237319370,0,0,"","",45.6499055555556,13.7647388888889,0 +7978,image/jpeg,1665237311409,0,0,"","",45.6499111111111,13.764725,0 +7979,image/jpeg,0,0,,"","",,,0 +7980,image/jpeg,1665237202990,0,0,"","",45.6499194444444,13.7647277777778,0 +7981,image/jpeg,1665237192623,0,0,"","",45.6499194444444,13.7647138888889,0 +7982,image/jpeg,1665237185699,0,0,"","",45.6499166666667,13.7647222222222,0 +7983,image/jpeg,1665237181168,0,0,"","",45.6499194444444,13.7647166666667,0 +7984,image/jpeg,1665237175965,0,0,"","",45.6499166666667,13.7647027777778,0 +7985,image/jpeg,1665237168198,0,0,"","",45.6498916666667,13.7646777777778,0 +7986,image/jpeg,0,0,,"","",,,0 +7987,image/jpeg,0,0,,"","",,,0 +7988,image/jpeg,0,0,,"","",,,0 +7989,image/jpeg,1665236827120,0,0,"","",45.6499388888889,13.7646638888889,0 +7990,image/jpeg,1665236813284,0,0,"","",45.6499305555556,13.76465,0 +7991,image/jpeg,1665236799558,0,0,"","",45.6499305555556,13.7646555555556,0 +7992,image/jpeg,1665236681485,0,0,"","",45.6499055555556,13.765175,0 +7993,image/jpeg,1665236675228,0,0,"","",45.6499138888889,13.7651666666667,0 +7994,image/jpeg,1665236526267,0,0,"","",45.6503583333333,13.7659138888889,0 +7995,image/jpeg,1665236513552,0,0,"","",45.6503777777778,13.7659222222222,0 +7996,image/jpeg,1665236508368,0,0,"","",45.6503972222222,13.7659222222222,0 +7997,image/jpeg,1665236364128,0,0,"","",45.6508694444444,13.7667361111111,0 +7998,image/jpeg,1665236349450,0,0,"","",45.6508777777778,13.766725,0 +7999,image/jpeg,0,0,,"","",,,0 +8000,image/jpeg,1665227572000,0,0,"","",45.6883722222222,13.7439916666667,0 +8001,image/jpeg,0,0,,"","",,,0 +8002,image/jpeg,0,0,,"","",,,0 +8003,image/jpeg,1665124961300,0,0,"","",,,0 +8004,image/jpeg,0,0,,"","",,,0 +8005,image/jpeg,0,0,,"","",,,0 +8006,image/jpeg,0,0,,"","",,,0 +8007,image/jpeg,0,0,,"","",,,0 +8008,image/jpeg,0,0,,"","",,,0 +8009,image/jpeg,0,0,,"","",,,0 +8010,image/jpeg,0,0,,"","",,,0 +8011,image/jpeg,0,0,,"","",,,0 +8012,image/jpeg,0,0,,"","",,,0 +8013,image/jpeg,0,0,,"","",,,0 +8014,image/jpeg,0,0,,"","",,,0 +8015,image/jpeg,0,0,,"","",,,0 +8016,image/jpeg,0,0,,"","",,,0 +8017,image/jpeg,0,0,,"","",,,0 +8018,image/jpeg,0,0,,"","",,,0 +8019,image/jpeg,0,0,,"","",,,0 +8020,image/jpeg,0,0,,"","",,,0 +8021,image/jpeg,0,0,,"","",,,0 +8022,image/jpeg,0,0,,"","",,,0 +8023,image/jpeg,0,0,,"","",,,0 +8024,image/jpeg,0,0,,"","",,,0 +8025,image/jpeg,0,0,,"","",,,0 +8026,image/jpeg,0,0,,"","",,,0 +8027,image/jpeg,0,0,,"","",,,0 +8028,image/jpeg,0,0,,"","",,,0 +8029,image/jpeg,1664901399124,0,0,"","",44.2395472222222,12.0649361111111,0 +8030,image/jpeg,1664901343580,0,0,"","",44.2394972222222,12.064925,0 +8031,image/jpeg,1664899987914,0,0,"","",44.2394861111111,12.0649388888889,0 +8032,image/jpeg,1664897360508,0,0,"","",44.2506111111111,12.0829194444444,0 +8033,image/jpeg,0,0,,"","",,,0 +8034,image/jpeg,0,0,,"","",,,0 +8035,image/jpeg,0,0,,"","",,,0 +8036,image/jpeg,0,0,,"","",,,0 +8037,image/jpeg,1664729815600,0,0,"","",44.2505888888889,12.0829694444444,0 +8038,image/jpeg,0,0,,"","",,,0 +8039,image/jpeg,0,0,,"","",,,0 +8040,image/jpeg,0,0,,"","",,,0 +8041,image/jpeg,0,0,,"","",,,0 +8042,image/jpeg,0,0,,"","",,,0 +8043,image/jpeg,0,0,,"","",,,0 +8044,image/jpeg,0,0,,"","",,,0 +8045,image/jpeg,0,0,,"","",,,0 +8046,image/jpeg,0,0,,"","",,,0 +8047,image/jpeg,0,0,,"","",,,0 +8048,image/jpeg,0,0,,"","",,,0 +8049,image/jpeg,0,0,,"","",,,0 +8050,image/jpeg,0,0,,"","",,,0 +8051,image/jpeg,0,0,,"","",,,0 +8052,image/jpeg,0,0,,"","",,,0 +8053,image/jpeg,0,0,,"","",,,0 +8054,image/jpeg,0,0,,"","",,,0 +8055,image/jpeg,0,0,,"","",,,0 +8056,image/jpeg,0,0,,"","",,,0 +8057,image/jpeg,0,0,,"","",,,0 +8058,image/jpeg,0,0,,"","",,,0 +8059,image/jpeg,0,0,,"","",,,0 +8060,image/jpeg,0,0,,"","",,,0 +8061,image/jpeg,0,0,,"","",,,0 +8062,image/jpeg,0,0,,"","",,,0 +8063,image/jpeg,0,0,,"","",,,0 +8064,image/jpeg,0,0,,"","",,,0 +8065,image/jpeg,0,0,,"","",,,0 +8066,image/jpeg,0,0,,"","",,,0 +8067,image/jpeg,0,0,,"","",,,0 +8068,image/jpeg,0,0,,"","",,,0 +8069,image/jpeg,0,0,,"","",,,0 +8070,image/jpeg,0,0,,"","",,,0 +8071,image/jpeg,0,0,,"","",,,0 +8072,image/jpeg,0,0,,"","",,,0 +8073,image/jpeg,0,0,,"","",,,0 +8074,image/jpeg,0,0,,"","",,,0 +8075,image/jpeg,0,0,,"","",,,0 +8076,image/jpeg,0,0,,"","",,,0 +8077,image/jpeg,1664611819000,0,0,"","",44.0380722222222,11.9958583333333,0 +8078,image/jpeg,1664611743000,0,0,"","",44.037875,11.9960833333333,0 +8079,image/jpeg,1664611733000,0,0,"","",44.0378833333333,11.9960444444444,0 +8080,image/jpeg,0,0,,"","",,,0 +8081,image/jpeg,0,0,,"","",,,0 +8082,image/jpeg,0,0,,"","",,,0 +8083,image/jpeg,0,0,,"","",,,0 +8084,image/jpeg,1664541571808,0,0,"","",44.2506444444444,12.0829222222222,0 +8085,image/jpeg,1664541541670,0,0,"","",44.2506333333333,12.0829,0 +8086,image/jpeg,1664541507507,0,0,"","",44.2506222222222,12.0828638888889,0 +8087,image/jpeg,1664541501912,0,0,"","",44.2506166666667,12.0828527777778,0 +8088,image/jpeg,1664541497730,0,0,"","",44.2506166666667,12.0828472222222,0 +8089,image/jpeg,1664541454937,0,0,"","",44.2506111111111,12.0828333333333,0 +8090,image/jpeg,1664538350338,0,,"","",44.2506029722222,12.082807,0 +8091,image/jpeg,1664519901754,0,0,"","",44.2505529722222,12.0828,0 +8092,image/jpeg,1664519901754,0,,"","",44.2505529722222,12.0828,0 +8093,image/jpeg,0,0,,"","",,,0 +8094,image/jpeg,0,0,,"","",,,0 +8095,image/jpeg,0,0,,"","",,,0 +8096,image/jpeg,0,0,,"","",,,0 +8097,image/jpeg,0,0,,"","",,,0 +8098,image/jpeg,0,0,,"","",,,0 +8099,image/jpeg,0,0,,"","",,,0 +8100,image/jpeg,0,0,,"","",,,0 +8101,image/jpeg,0,0,,"","",,,0 +8102,image/jpeg,0,0,,"","",,,0 +8103,image/jpeg,0,0,,"","",,,0 +8104,image/jpeg,0,0,,"","",,,0 +8105,image/jpeg,0,0,,"","",,,0 +8106,image/jpeg,0,0,,"","",,,0 +8107,image/jpeg,1664299755870,0,0,"","",,,0 +8108,image/jpeg,1664295588198,0,0,"","",44.2506833333333,12.0829638888889,0 +8109,image/jpeg,1664291916484,0,0,"","",44.2506138888889,12.0828166666667,0 +8110,image/jpeg,1664291916484,0,0,"","",44.2506138888889,12.0828166666667,0 +8111,image/jpeg,1664291869960,0,90,"","",,,0 +8112,image/jpeg,1664291737298,0,0,"","",44.2505722222222,12.082825,0 +8113,image/jpeg,1664291737298,0,0,"","",44.2505722222222,12.082825,0 +8114,image/jpeg,0,0,,"","",,,0 +8115,image/jpeg,1664282583000,0,0,"","",43.9875361111111,12.6854277777778,0 +8116,image/jpeg,0,0,,"","",,,0 +8117,image/jpeg,1664280748517,0,0,"","",43.9659277777778,12.7529555555556,0 +8118,image/jpeg,1664280710591,0,0,"","",43.9658361111111,12.7532416666667,0 +8119,image/jpeg,1664278712601,0,0,"","",43.967875,12.75015,0 +8120,image/jpeg,1664278071356,0,90,"","",,,0 +8121,image/jpeg,1664277914000,0,0,"","",43.967875,12.7501611111111,0 +8122,image/jpeg,1664277734000,0,0,"","",43.9678638888889,12.7501611111111,0 +8123,image/jpeg,1664277729000,0,0,"","",43.9678583333333,12.7501555555556,0 +8124,image/jpeg,1664277718000,0,0,"","",43.9678527777778,12.7501555555556,0 +8125,image/jpeg,0,0,,"","",,,0 +8126,image/jpeg,1664202378000,0,,"","",,,0 +8127,image/jpeg,0,0,,"","",,,0 +8128,image/jpeg,0,0,,"","",,,0 +8129,image/jpeg,1664088953912,0,0,"","",45.9663194444444,12.6416583333333,0 +8130,image/jpeg,1663782713270,0,0,"","",44.2505916666667,12.0828027777778,0 +8131,image/jpeg,0,0,,"","",,,0 +8132,image/jpeg,0,0,,"","",,,0 +8133,image/jpeg,0,0,,"","",,,0 +8134,image/jpeg,0,0,,"","",,,0 +8135,image/jpeg,0,0,,"","",,,0 +8136,image/jpeg,0,0,,"","",,,0 +8137,image/jpeg,1664088985340,0,0,"","",45.9663666666667,12.6416944444444,0 +8138,image/jpeg,1664088844575,0,0,"","",45.96635,12.6417083333333,0 +8139,image/jpeg,1664088478910,0,0,"","",45.9663388888889,12.6416777777778,0 +8140,image/jpeg,0,0,,"","",,,0 +8141,image/jpeg,0,0,,"","",,,0 +8142,image/jpeg,0,0,,"","",,,0 +8143,image/jpeg,0,0,,"","",,,0 +8144,image/jpeg,1663954205593,0,0,"","",44.037725,11.9964333333333,0 +8145,image/jpeg,1663954200302,0,0,"","",44.0377222222222,11.9964444444444,0 +8146,image/jpeg,1663954162787,0,0,"","",44.0378444444444,11.9961305555556,0 +8147,image/jpeg,1663954154347,0,0,"","",44.037875,11.996075,0 +8148,image/jpeg,1663954135140,0,0,"","",44.0378305555556,11.9958888888889,0 +8149,image/jpeg,1663954114150,0,0,"","",44.0377694444444,11.9957222222222,0 +8150,image/jpeg,1663782713270,0,0,"","",44.2505916666667,12.0828027777778,0 +8151,image/jpeg,1663692158117,0,0,"","",44.2394777777778,12.0649138888889,0 +8152,image/jpeg,0,0,0,"","",,,0 +8153,image/webp,0,0,,"","",,,0 +8154,image/jpeg,0,0,,"","",,,0 +8155,image/jpeg,0,0,,"","",,,0 +8156,image/webp,0,0,,"","",,,0 +8157,image/jpeg,0,0,,"","",,,0 +8158,image/jpeg,0,0,,"","",,,0 +8159,image/webp,0,0,,"","",,,0 +8160,image/jpeg,1663510096325,0,0,"","",44.2337833333333,11.9176861111111,0 +8161,image/jpeg,1663510094906,0,0,"","",44.2337833333333,11.9176888888889,0 +8162,image/jpeg,0,0,,"","",,,0 +8163,image/jpeg,1663506556660,0,0,"","",44.2336777777778,11.9179388888889,0 +8164,image/jpeg,1663506552241,0,0,"","",44.233675,11.9179416666667,0 +8165,image/jpeg,1663493224198,0,0,"","",44.2240944444444,11.9126222222222,0 +8166,image/jpeg,1663493221297,0,0,"","",44.2240944444444,11.9126305555556,0 +8167,image/jpeg,1663493203271,0,0,"","",44.2240944444444,11.9126111111111,0 +8168,image/jpeg,1663400739372,0,,"","",44.2506089722222,12.0827659722222,0 +8169,image/jpeg,1663400732789,0,,"","",44.2506109722222,12.082765,0 +8170,image/jpeg,0,0,,"","",,,0 +8171,image/jpeg,0,0,,"","",,,0 +8172,image/jpeg,0,0,,"","",,,0 +8173,image/jpeg,0,0,,"","",,,0 +8174,image/jpeg,0,0,,"","",,,0 +8175,image/jpeg,0,0,,"","",,,0 +8176,image/jpeg,0,0,,"","",,,0 +8177,image/jpeg,0,0,,"","",,,0 +8178,image/jpeg,0,0,,"","",,,0 +8179,image/jpeg,0,0,,"","",,,0 +8180,image/jpeg,0,0,,"","",,,0 +8181,image/jpeg,0,0,,"","",,,0 +8182,image/jpeg,0,0,,"","",,,0 +8183,image/jpeg,0,0,,"","",,,0 +8184,image/jpeg,0,0,,"","",,,0 +8185,image/jpeg,0,0,,"","",,,0 +8186,image/jpeg,0,0,,"","",,,0 +8187,image/jpeg,0,0,,"","",,,0 +8188,image/jpeg,1662884044582,0,,"","",46.4166969722222,11.6656659722222,0 +8189,image/jpeg,1662883630158,0,0,"","",46.4145166666667,11.6647777777778,0 +8190,image/jpeg,1662883626590,0,0,"","",46.4145222222222,11.6647777777778,0 +8191,image/jpeg,0,0,,"","",,,0 +8192,image/jpeg,1662880605400,0,0,"","",46.41575,11.669325,0 +8193,image/jpeg,1662880601201,0,0,"","",46.41575,11.669325,0 +8194,image/jpeg,1662880525975,0,0,"","",46.4156972222222,11.6693555555556,0 +8195,image/jpeg,1662880518259,0,0,"","",46.4156972222222,11.6693555555556,0 +8196,image/jpeg,1662880509536,0,0,"","",46.4157361111111,11.66935,0 +8197,image/jpeg,1662880506264,0,0,"","",46.4157361111111,11.66935,0 +8198,image/jpeg,1662880502374,0,0,"","",46.4157361111111,11.66935,0 +8199,image/jpeg,0,0,,"","",,,0 +8200,image/jpeg,0,0,,"","",,,0 +8201,image/jpeg,0,0,,"","",,,0 +8202,image/jpeg,0,0,,"","",,,0 +8203,image/jpeg,0,0,,"","",,,0 +8204,image/jpeg,0,0,,"","",,,0 +8205,image/jpeg,0,0,,"","",,,0 +8206,image/jpeg,0,0,,"","",,,0 +8207,image/jpeg,0,0,,"","",,,0 +8208,image/jpeg,0,0,,"","",,,0 +8209,image/jpeg,0,0,,"","",,,0 +8210,image/jpeg,0,0,,"","",,,0 +8211,image/jpeg,0,0,,"","",,,0 +8212,image/jpeg,0,0,,"","",,,0 +8213,image/jpeg,0,0,,"","",,,0 +8214,image/jpeg,0,0,,"","",,,0 +8215,image/jpeg,0,0,,"","",,,0 +8216,image/jpeg,0,0,,"","",,,0 +8217,image/jpeg,0,0,,"","",,,0 +8218,image/jpeg,0,0,,"","",,,0 +8219,image/jpeg,0,0,,"","",,,0 +8220,image/jpeg,0,0,,"","",,,0 +8221,image/jpeg,0,0,,"","",,,0 +8222,image/jpeg,0,0,,"","",,,0 +8223,image/jpeg,0,0,,"","",,,0 +8224,image/jpeg,0,0,,"","",,,0 +8225,image/jpeg,0,0,,"","",,,0 +8226,image/jpeg,0,0,,"","",,,0 +8227,image/jpeg,0,0,,"","",,,0 +8228,image/jpeg,0,0,,"","",,,0 +8229,image/jpeg,0,0,,"","",,,0 +8230,image/jpeg,0,0,,"","",,,0 +8231,image/jpeg,0,0,,"","",,,0 +8232,image/jpeg,0,0,,"","",,,0 +8233,image/jpeg,0,0,,"","",,,0 +8234,image/jpeg,0,0,,"","",,,0 +8235,image/jpeg,0,0,,"","",,,0 +8236,image/jpeg,0,0,,"","",,,0 +8237,image/jpeg,0,0,,"","",,,0 +8238,image/jpeg,0,0,,"","",,,0 +8239,image/jpeg,0,0,,"","",,,0 +8240,image/jpeg,0,0,,"","",,,0 +8241,image/jpeg,0,0,,"","",,,0 +8242,image/jpeg,0,0,,"","",,,0 +8243,image/jpeg,0,0,,"","",,,0 +8244,image/jpeg,0,0,,"","",,,0 +8245,image/jpeg,0,0,,"","",,,0 +8246,image/jpeg,0,0,,"","",,,0 +8247,image/jpeg,0,0,,"","",,,0 +8248,image/jpeg,0,0,,"","",,,0 +8249,image/jpeg,0,0,,"","",,,0 +8250,image/jpeg,0,0,,"","",,,0 +8251,image/jpeg,0,0,,"","",,,0 +8252,image/jpeg,0,0,,"","",,,0 +8253,image/jpeg,0,0,,"","",,,0 +8254,image/jpeg,0,0,,"","",,,0 +8255,image/jpeg,0,0,,"","",,,0 +8256,image/jpeg,0,0,,"","",,,0 +8257,image/jpeg,0,0,,"","",,,0 +8258,image/jpeg,0,0,,"","",,,0 +8259,image/jpeg,0,0,,"","",,,0 +8260,image/jpeg,0,0,,"","",,,0 +8261,image/jpeg,0,0,,"","",,,0 +8262,image/jpeg,0,0,,"","",,,0 +8263,image/jpeg,0,0,,"","",,,0 +8264,image/jpeg,0,0,,"","",,,0 +8265,image/jpeg,0,0,,"","",,,0 +8266,image/jpeg,0,0,,"","",,,0 +8267,image/jpeg,0,0,,"","",,,0 +8268,image/jpeg,0,0,,"","",,,0 +8269,image/jpeg,0,0,,"","",,,0 +8270,image/jpeg,0,0,,"","",,,0 +8271,image/jpeg,0,0,,"","",,,0 +8272,image/jpeg,0,0,,"","",,,0 +8273,image/jpeg,0,0,,"","",,,0 +8274,image/jpeg,0,0,,"","",,,0 +8275,image/jpeg,0,0,,"","",,,0 +8276,image/jpeg,0,0,,"","",,,0 +8277,image/jpeg,0,0,,"","",,,0 +8278,image/jpeg,0,0,,"","",,,0 +8279,image/jpeg,0,0,,"","",,,0 +8280,image/jpeg,0,0,,"","",,,0 +8281,image/jpeg,0,0,,"","",,,0 +8282,image/jpeg,0,0,,"","",,,0 +8283,image/jpeg,0,0,,"","",,,0 +8284,image/jpeg,1662284003511,0,0,"","",,,0 +8285,image/jpeg,0,0,,"","",,,0 +8286,image/jpeg,0,0,,"","",,,0 +8287,image/jpeg,0,0,,"","",,,0 +8288,image/jpeg,1662103170602,0,90,"","",,,0 +8289,image/jpeg,0,0,,"","",,,0 +8290,image/jpeg,0,0,,"","",,,0 +8291,image/jpeg,0,0,,"","",,,0 +8292,image/jpeg,1661884562298,0,0,"","",44.0696916666667,12.3335638888889,0 +8293,image/jpeg,0,0,,"","",,,0 +8294,image/jpeg,0,0,,"","",,,0 +8295,image/jpeg,0,0,,"","",,,0 +8296,image/jpeg,0,0,,"","",,,0 +8297,image/jpeg,0,0,,"","",,,0 +8298,image/jpeg,0,0,,"","",,,0 +8299,image/jpeg,0,0,,"","",,,0 +8300,image/jpeg,0,0,,"","",,,0 +8301,image/jpeg,0,0,,"","",,,0 +8302,image/jpeg,0,0,,"","",,,0 +8303,image/jpeg,0,0,,"","",,,0 +8304,image/jpeg,0,0,,"","",,,0 +8305,image/jpeg,0,0,,"","",,,0 +8306,image/jpeg,0,0,,"","",,,0 +8307,image/jpeg,0,0,,"","",,,0 +8308,image/jpeg,1660472693947,0,0,"","",44.2505861111111,12.0828361111111,0 +8309,image/jpeg,0,0,,"","",,,0 +8310,image/jpeg,1660388902000,0,0,"","",44.1978916666667,11.9226944444444,0 +8311,image/jpeg,1660388891741,0,0,"","",44.1978944444444,11.9227,0 +8312,image/jpeg,1660386406229,0,0,"","",44.1730333333333,11.9481916666667,0 +8313,image/jpeg,1660386395000,0,0,"","",44.1730361111111,11.9481916666667,0 +8314,image/jpeg,1660385484426,0,0,"","",44.1579722222222,11.9568611111111,0 +8315,image/jpeg,1660384853376,0,0,"","",44.1488888888889,11.9436777777778,0 +8316,image/jpeg,1660384309000,0,0,"","",44.1402944444444,11.9450361111111,0 +8317,image/jpeg,1660382623000,0,0,"","",44.1247611111111,11.9494111111111,0 +8318,image/jpeg,1660382623000,0,0,"","",44.1247611111111,11.9494111111111,0 +8319,image/jpeg,1660382599620,0,0,"","",44.1247694444444,11.9494138888889,0 +8320,image/jpeg,1660382484250,0,0,"","",44.1247555555556,11.9494361111111,0 +8321,image/jpeg,0,0,,"","",,,0 +8322,image/jpeg,1660378554477,0,0,"","",44.114775,12.0065972222222,0 +8323,image/jpeg,1660378554477,0,0,"","",44.114775,12.0065972222222,0 +8324,image/jpeg,1660377258000,0,0,"","",44.1288388888889,12.0345611111111,0 +8325,image/jpeg,1660372774836,0,0,"","",44.2001833333333,12.0850444444444,0 +8326,image/jpeg,1660372429808,0,0,"","",44.2063194444444,12.0896222222222,0 +8327,image/jpeg,0,0,,"","",,,0 +8328,image/jpeg,1660232348830,0,0,"","",45.5837388888889,12.8503388888889,0 +8329,image/jpeg,0,0,,"","",,,0 +8330,image/jpeg,1660066176993,0,0,"","",44.2353916666667,12.0080055555556,0 +8331,image/jpeg,0,0,,"","",,,0 +8332,image/jpeg,0,0,,"","",,,0 +8333,image/jpeg,0,0,,"","",,,0 +8334,image/jpeg,1659894932253,0,0,"","",44.2505833333333,12.0829083333333,0 +8335,image/jpeg,1659890831860,0,0,"","",44.2505861111111,12.0828444444444,0 +8336,image/jpeg,0,0,,"","",,,0 +8337,image/jpeg,0,0,,"","",,,0 +8338,image/jpeg,0,0,,"","",,,0 +8339,image/jpeg,1659738030000,0,0,"","",,,0 +8340,image/jpeg,1659738030000,0,0,"","",,,0 +8341,image/jpeg,1659809349126,0,0,"","",44.2596666666667,12.1811722222222,0 +8342,image/jpeg,1659809343333,0,0,"","",44.2596722222222,12.1811777777778,0 +8343,image/jpeg,1659738030000,0,0,"","",,,0 +8344,image/jpeg,1659738030000,0,0,"","",,,0 +8345,image/jpeg,1659738030000,0,0,"","",,,0 +8346,image/jpeg,1659738030000,0,0,"","",,,0 +8347,image/jpeg,1659738030000,0,0,"","",,,0 +8348,image/jpeg,1659738030000,0,0,"","",,,0 +8349,image/jpeg,1659738030000,0,0,"","",,,0 +8350,image/jpeg,1659738030000,0,0,"","",,,0 +8351,image/jpeg,1659738030000,0,0,"","",,,0 +8352,image/jpeg,1659738030000,0,0,"","",,,0 +8353,image/jpeg,1659738030000,0,0,"","",,,0 +8354,image/jpeg,1659738030000,0,0,"","",,,0 +8355,image/jpeg,1659738030000,0,0,"","",,,0 +8356,image/jpeg,1659738030000,0,0,"","",,,0 +8357,image/jpeg,1659738030000,0,0,"","",,,0 +8358,image/jpeg,1659738030000,0,0,"","",,,0 +8359,image/jpeg,1659738030000,0,0,"","",,,0 +8360,image/jpeg,1659738030000,0,0,"","",,,0 +8361,image/jpeg,1659738030000,0,0,"","",,,0 +8362,image/jpeg,1659738030000,0,0,"","",,,0 +8363,image/jpeg,1659738030000,0,0,"","",,,0 +8364,image/jpeg,1659738030000,0,0,"","",,,0 +8365,image/jpeg,1659738030000,0,0,"","",,,0 +8366,image/jpeg,1659738030000,0,0,"","",,,0 +8367,image/jpeg,1659738030000,0,0,"","",,,0 +8368,image/jpeg,1659738030000,0,0,"","",,,0 +8369,image/jpeg,1659738030000,0,0,"","",,,0 +8370,image/jpeg,1659738030000,0,0,"","",,,0 +8371,image/jpeg,1659738030000,0,0,"","",,,0 +8372,image/jpeg,1659738030000,0,0,"","",,,0 +8373,image/jpeg,1659738030000,0,0,"","",,,0 +8374,image/jpeg,1659738030000,0,0,"","",,,0 +8375,image/jpeg,1659738030000,0,0,"","",,,0 +8376,image/jpeg,0,0,,"","",,,0 +8377,image/jpeg,0,0,,"","",,,0 +8378,image/jpeg,0,0,,"","",,,0 +8379,image/jpeg,0,0,,"","",,,0 +8380,image/jpeg,0,0,,"","",,,0 +8381,image/jpeg,0,0,,"","",,,0 +8382,image/jpeg,0,0,,"","",,,0 +8383,image/jpeg,0,0,,"","",,,0 +8384,image/jpeg,0,0,,"","",,,0 +8385,image/jpeg,0,0,,"","",,,0 +8386,image/jpeg,0,0,,"","",,,0 +8387,image/jpeg,0,0,,"","",,,0 +8388,image/jpeg,0,0,,"","",,,0 +8389,image/jpeg,0,0,,"","",,,0 +8390,image/jpeg,0,0,,"","",,,0 +8391,image/jpeg,0,0,,"","",,,0 +8392,image/jpeg,0,0,,"","",,,0 +8393,image/jpeg,0,0,,"","",,,0 +8394,image/jpeg,0,0,,"","",,,0 +8395,image/jpeg,0,0,,"","",,,0 +8396,image/jpeg,0,0,,"","",,,0 +8397,image/jpeg,0,0,,"","",,,0 +8398,image/jpeg,0,0,,"","",,,0 +8399,image/jpeg,0,0,,"","",,,0 +8400,image/jpeg,0,0,,"","",,,0 +8401,image/jpeg,0,0,,"","",,,0 +8402,image/jpeg,0,0,,"","",,,0 +8403,image/jpeg,0,0,,"","",,,0 +8404,image/jpeg,0,0,,"","",,,0 +8405,image/jpeg,0,0,,"","",,,0 +8406,image/jpeg,0,0,,"","",,,0 +8407,image/jpeg,0,0,,"","",,,0 +8408,image/jpeg,0,0,,"","",,,0 +8409,image/jpeg,0,0,,"","",,,0 +8410,image/jpeg,1659182887405,0,0,"","",44.2505972222222,12.0828305555556,0 +8411,image/jpeg,1659182689570,0,0,"","",44.2506694444444,12.0829833333333,0 +8412,image/jpeg,0,0,,"","",,,0 +8413,image/jpeg,0,0,,"","",,,0 +8414,image/jpeg,0,0,,"","",,,0 +8415,image/jpeg,0,0,,"","",,,0 +8416,image/jpeg,0,0,,"","",,,0 +8417,image/jpeg,0,0,,"","",,,0 +8418,image/jpeg,0,0,,"","",,,0 +8419,image/jpeg,0,0,,"","",,,0 +8420,image/jpeg,0,0,,"","",,,0 +8421,image/jpeg,0,0,,"","",,,0 +8422,image/jpeg,0,0,,"","",,,0 +8423,image/jpeg,0,0,,"","",,,0 +8424,image/jpeg,0,0,,"","",,,0 +8425,image/jpeg,0,0,,"","",,,0 +8426,image/jpeg,0,0,,"","",,,0 +8427,image/jpeg,0,0,,"","",,,0 +8428,image/jpeg,0,0,,"","",,,0 +8429,image/jpeg,0,0,,"","",,,0 +8430,image/jpeg,0,0,,"","",,,0 +8431,image/jpeg,0,0,,"","",,,0 +8432,image/jpeg,0,0,,"","",,,0 +8433,image/jpeg,1658946830782,0,0,"","",44.1664916666667,11.9671666666667,0 +8434,image/jpeg,1658946831869,0,0,"","",44.1664916666667,11.9671666666667,0 +8435,image/jpeg,1658946779508,0,0,"","",44.1660361111111,11.9685861111111,0 +8436,image/jpeg,1658944691821,0,0,"","",44.1513333333333,12.0198111111111,0 +8437,image/jpeg,1658944679310,0,0,"","",44.1513333333333,12.0198138888889,0 +8438,image/jpeg,1658944624611,0,0,"","",44.1511472222222,12.0209472222222,0 +8439,image/jpeg,0,0,,"","",,,0 +8440,image/jpeg,0,0,,"","",,,0 +8441,image/jpeg,0,0,,"","",,,0 +8442,image/jpeg,0,0,,"","",,,0 +8443,image/jpeg,0,0,,"","",,,0 +8444,image/jpeg,0,0,,"","",,,0 +8445,image/jpeg,0,0,,"","",,,0 +8446,image/jpeg,0,0,,"","",,,0 +8447,image/jpeg,0,0,,"","",,,0 +8448,image/jpeg,1658745264572,0,0,"","",44.2506277777778,12.0827805555556,0 +8449,image/jpeg,0,0,,"","",,,0 +8450,image/jpeg,0,0,,"","",,,0 +8451,image/jpeg,0,0,,"","",,,0 +8452,image/jpeg,0,0,,"","",,,0 +8453,image/jpeg,0,0,,"","",,,0 +8454,image/jpeg,0,0,,"","",,,0 +8455,image/jpeg,0,0,,"","",,,0 +8456,image/jpeg,0,0,,"","",,,0 +8457,image/jpeg,0,0,,"","",,,0 +8458,image/jpeg,0,0,,"","",,,0 +8459,image/jpeg,0,0,,"","",,,0 +8460,image/jpeg,0,0,,"","",,,0 +8461,image/jpeg,1658561780431,0,0,"","",44.2505944444444,12.0829361111111,0 +8462,image/jpeg,1658561777778,0,0,"","",44.2505944444444,12.0829361111111,0 +8463,image/jpeg,1658561763906,0,0,"","",44.2505916666667,12.0829388888889,0 +8464,image/jpeg,1658561755733,0,0,"","",44.2505916666667,12.0829472222222,0 +8465,image/jpeg,1658561751905,0,0,"","",44.2505861111111,12.0829583333333,0 +8466,image/jpeg,0,0,,"","",,,0 +8467,image/jpeg,0,0,,"","",,,0 +8468,image/jpeg,0,0,,"","",,,0 +8469,image/jpeg,0,0,,"","",,,0 +8470,image/jpeg,0,0,,"","",,,0 +8471,image/jpeg,0,0,,"","",,,0 +8472,image/jpeg,1658419215195,0,0,"","",,,0 +8473,image/jpeg,0,0,,"","",,,0 +8474,image/jpeg,0,0,,"","",,,0 +8475,image/jpeg,1658403892963,0,0,"","",44.242525,11.9959194444444,0 +8476,image/jpeg,0,0,,"","",,,0 +8477,image/jpeg,0,0,,"","",,,0 +8478,image/jpeg,0,0,,"","",,,0 +8479,image/jpeg,0,0,,"","",,,0 +8480,image/jpeg,0,0,,"","",,,0 +8481,image/jpeg,0,0,,"","",,,0 +8482,image/jpeg,0,0,,"","",,,0 +8483,image/jpeg,0,0,,"","",,,0 +8484,image/jpeg,0,0,,"","",,,0 +8485,image/jpeg,0,0,,"","",,,0 +8486,image/jpeg,0,0,,"","",,,0 +8487,image/jpeg,0,0,,"","",,,0 +8488,image/jpeg,0,0,,"","",,,0 +8489,image/jpeg,0,0,,"","",,,0 +8490,image/jpeg,0,0,,"","",,,0 +8491,image/jpeg,0,0,,"","",,,0 +8492,image/jpeg,0,0,,"","",,,0 +8493,image/jpeg,0,0,,"","",,,0 +8494,image/jpeg,0,0,,"","",,,0 +8495,image/jpeg,0,0,,"","",,,0 +8496,image/jpeg,0,0,,"","",,,0 +8497,image/jpeg,0,0,,"","",,,0 +8498,image/jpeg,0,0,,"","",,,0 +8499,image/jpeg,0,0,,"","",,,0 +8500,image/jpeg,0,0,,"","",,,0 +8501,image/jpeg,0,0,,"","",,,0 +8502,image/jpeg,0,0,,"","",,,0 +8503,image/jpeg,0,0,,"","",,,0 +8504,image/jpeg,0,0,,"","",,,0 +8505,image/jpeg,0,0,,"","",,,0 +8506,image/jpeg,0,0,,"","",,,0 +8507,image/jpeg,0,0,,"","",,,0 +8508,image/jpeg,0,0,,"","",,,0 +8509,image/jpeg,0,0,,"","",,,0 +8510,image/jpeg,0,0,,"","",,,0 +8511,image/jpeg,1657824129684,0,0,"","",44.1977138888889,11.9485944444444,0 +8512,image/jpeg,1657824123663,0,0,"","",44.1977138888889,11.9485916666667,0 +8513,image/jpeg,1657817770190,0,0,"","",44.2506472222222,12.0829,0 +8514,image/jpeg,0,0,,"","",,,0 +8515,image/jpeg,0,0,,"","",,,0 +8516,image/jpeg,0,0,,"","",,,0 +8517,image/jpeg,0,0,,"","",,,0 +8518,image/jpeg,1657795843669,0,0,"","",44.4189888888889,11.9325333333333,0 +8519,image/jpeg,1657794609946,0,0,"","",44.4191555555556,11.9326333333333,0 +8520,image/jpeg,0,0,,"","",,,0 +8521,image/jpeg,0,0,,"","",,,0 +8522,image/jpeg,0,0,,"","",,,0 +8523,image/jpeg,0,0,,"","",,,0 +8524,image/jpeg,0,0,,"","",,,0 +8525,image/jpeg,1657729625419,0,0,"","",44.1388083333333,12.2435805555556,0 +8526,image/jpeg,0,0,,"","",,,0 +8527,image/jpeg,0,0,,"","",,,0 +8528,image/jpeg,0,0,,"","",,,0 +8529,image/jpeg,0,0,,"","",,,0 +8530,image/jpeg,0,0,,"","",,,0 +8531,image/jpeg,0,0,,"","",,,0 +8532,image/jpeg,0,0,,"","",,,0 +8533,image/jpeg,0,0,,"","",,,0 +8534,image/jpeg,0,0,,"","",,,0 +8535,image/jpeg,0,0,,"","",,,0 +8536,image/jpeg,1657462047609,0,,"","",44.3265519722222,11.905286,0 +8537,image/jpeg,1657459617100,0,0,"","",,,0 +8538,image/jpeg,0,0,,"","",,,0 +8539,image/jpeg,0,0,,"","",,,0 +8540,image/jpeg,0,0,,"","",,,0 +8541,image/jpeg,0,0,,"","",,,0 +8542,image/jpeg,0,0,,"","",,,0 +8543,image/jpeg,0,0,,"","",,,0 +8544,image/jpeg,0,0,,"","",,,0 +8545,image/jpeg,0,0,,"","",,,0 +8546,image/jpeg,0,0,,"","",,,0 +8547,image/jpeg,0,0,,"","",,,0 +8548,image/jpeg,0,0,,"","",,,0 +8549,image/jpeg,0,0,,"","",,,0 +8550,image/jpeg,0,0,,"","",,,0 +8551,image/jpeg,0,0,,"","",,,0 +8552,image/jpeg,0,0,,"","",,,0 +8553,image/jpeg,0,0,,"","",,,0 +8554,image/jpeg,0,0,,"","",,,0 +8555,image/jpeg,0,0,,"","",,,0 +8556,image/jpeg,0,0,,"","",,,0 +8557,image/jpeg,0,0,,"","",,,0 +8558,image/jpeg,0,0,,"","",,,0 +8559,image/jpeg,0,0,,"","",,,0 +8560,image/jpeg,0,0,,"","",,,0 +8561,image/jpeg,0,0,,"","",,,0 +8562,image/jpeg,0,0,,"","",,,0 +8563,image/jpeg,0,0,,"","",,,0 +8564,image/jpeg,0,0,,"","",,,0 +8565,image/jpeg,0,0,,"","",,,0 +8566,image/jpeg,0,0,,"","",,,0 +8567,image/jpeg,0,0,,"","",,,0 +8568,image/jpeg,0,0,,"","",,,0 +8569,image/jpeg,0,0,,"","",,,0 +8570,image/jpeg,0,0,,"","",,,0 +8571,image/jpeg,0,0,,"","",,,0 +8572,image/jpeg,0,0,,"","",,,0 +8573,image/jpeg,0,0,,"","",,,0 +8574,image/jpeg,0,0,,"","",,,0 +8575,image/jpeg,0,0,,"","",,,0 +8576,image/jpeg,0,0,,"","",,,0 +8577,image/jpeg,0,0,,"","",,,0 +8578,image/jpeg,0,0,,"","",,,0 +8579,image/jpeg,0,0,,"","",,,0 +8580,image/jpeg,0,0,,"","",,,0 +8581,image/jpeg,0,0,,"","",,,0 +8582,image/jpeg,0,0,,"","",,,0 +8583,image/jpeg,0,0,,"","",,,0 +8584,image/jpeg,0,0,,"","",,,0 +8585,image/jpeg,0,0,,"","",,,0 +8586,image/jpeg,0,0,,"","",,,0 +8587,image/jpeg,0,0,,"","",,,0 +8588,image/jpeg,0,0,,"","",,,0 +8589,image/jpeg,0,0,,"","",,,0 +8590,image/jpeg,0,0,,"","",,,0 +8591,image/jpeg,0,0,,"","",,,0 +8592,image/jpeg,1656840604731,0,0,"","",44.4333305555555,11.6072333333333,0 +8593,image/jpeg,1656788729210,0,0,"","",44.3008472222222,12.1462777777778,0 +8594,image/jpeg,1656788575463,0,0,"","",44.3009166666667,12.146325,0 +8595,image/jpeg,1656096489000,0,0,"","",,,0 +8596,image/png,0,0,,"","",,,0 +8597,image/jpeg,1656753557000,0,0,"","",,,0 +8598,image/jpeg,1656753557281,0,0,"","",44.3952555555556,12.1777138888889,0 +8599,image/jpeg,0,0,,"","",,,0 +8600,image/jpeg,1656753557281,0,0,"","",44.3952555555556,12.1777138888889,0 +8601,image/jpeg,1656753091926,0,0,"","",44.3954111111111,12.1772583333333,0 +8602,image/jpeg,0,0,,"","",,,0 +8603,image/jpeg,0,0,,"","",,,0 +8604,image/jpeg,0,0,,"","",,,0 +8605,image/jpeg,0,0,,"","",,,0 +8606,image/jpeg,0,0,,"","",,,0 +8607,image/jpeg,0,0,,"","",,,0 +8608,image/jpeg,1656080514000,0,0,"","",,,0 +8609,image/jpeg,1656080514000,0,0,"","",,,0 +8610,image/jpeg,1656080514000,0,0,"","",,,0 +8611,image/jpeg,1656080514000,0,0,"","",,,0 +8612,image/jpeg,1656080612091,0,0,"","",46.5478819,11.7119301999722,0 +8613,image/jpeg,0,0,,"","",,,0 +8614,image/jpeg,0,0,,"","",,,0 +8615,image/jpeg,0,0,,"","",,,0 +8616,image/jpeg,0,0,,"","",,,0 +8617,image/jpeg,0,0,,"","",,,0 +8618,image/jpeg,0,0,,"","",,,0 +8619,image/jpeg,0,0,,"","",,,0 +8620,image/jpeg,0,0,,"","",,,0 +8621,image/jpeg,0,0,,"","",,,0 +8622,image/jpeg,0,0,,"","",,,0 +8623,image/jpeg,0,0,,"","",,,0 +8624,image/jpeg,0,0,,"","",,,0 +8625,image/jpeg,0,0,,"","",,,0 +8626,image/jpeg,0,0,,"","",,,0 +8627,image/jpeg,0,0,,"","",,,0 +8628,image/jpeg,0,0,,"","",,,0 +8629,image/jpeg,0,0,,"","",,,0 +8630,image/jpeg,0,0,,"","",,,0 +8631,image/jpeg,0,0,,"","",,,0 +8632,image/jpeg,0,0,,"","",,,0 +8633,image/jpeg,0,0,,"","",,,0 +8634,image/jpeg,0,0,,"","",,,0 +8635,image/jpeg,0,0,,"","",,,0 +8636,image/jpeg,0,0,,"","",,,0 +8637,image/jpeg,0,0,,"","",,,0 +8638,image/jpeg,0,0,,"","",,,0 +8639,image/jpeg,0,0,,"","",,,0 +8640,image/jpeg,0,0,,"","",,,0 +8641,image/jpeg,0,0,,"","",,,0 +8642,image/jpeg,0,0,,"","",,,0 +8643,image/jpeg,0,0,,"","",,,0 +8644,image/jpeg,0,0,,"","",,,0 +8645,image/jpeg,0,0,,"","",,,0 +8646,image/jpeg,0,0,,"","",,,0 +8647,image/jpeg,0,0,,"","",,,0 +8648,image/jpeg,0,0,,"","",,,0 +8649,image/jpeg,0,0,,"","",,,0 +8650,image/jpeg,0,0,,"","",,,0 +8651,image/jpeg,0,0,,"","",,,0 +8652,image/jpeg,0,0,,"","",,,0 +8653,image/jpeg,0,0,,"","",,,0 +8654,image/jpeg,0,0,,"","",,,0 +8655,image/jpeg,1655062886000,0,0,"","",44.0584520999722,12.3643243999722,0 +8656,image/jpeg,1655062886074,0,0,"","",44.0584508,12.3643251999722,0 +8657,image/jpeg,1655062886074,0,0,"","",44.0584508,12.3643251999722,0 +8658,image/jpeg,1655062886000,0,0,"","",44.0584520999722,12.3643243999722,0 +8659,image/jpeg,1655062886000,0,0,"","",44.0584520999722,12.3643243999722,0 +8660,image/jpeg,1655062886074,0,0,"","",44.0584508,12.3643251999722,0 +8661,image/jpeg,0,0,,"","",,,0 +8662,image/jpeg,0,0,,"","",,,0 +8663,image/jpeg,0,0,,"","",,,0 +8664,image/jpeg,0,0,,"","",,,0 +8665,image/jpeg,0,0,,"","",,,0 +8666,image/jpeg,0,0,,"","",,,0 +8667,image/jpeg,0,0,,"","",,,0 +8668,image/jpeg,1655384521478,0,0,"","",45.5902111111111,12.8505083333333,0 +8669,image/jpeg,0,0,,"","",,,0 +8670,image/jpeg,0,0,,"","",,,0 +8671,image/jpeg,0,0,,"","",,,0 +8672,image/jpeg,1655317546979,0,0,"","",,,0 +8673,image/jpeg,1655313857106,0,0,"","",44.2505888888889,12.0828388888889,0 +8674,image/jpeg,1655313850750,0,0,"","",44.2505861111111,12.0828388888889,0 +8675,image/jpeg,1655313756274,0,0,"","",44.2505861111111,12.0828277777778,0 +8676,image/jpeg,1655313753267,0,0,"","",44.2505944444444,12.0828388888889,0 +8677,image/jpeg,0,0,,"","",,,0 +8678,image/jpeg,0,0,,"","",,,0 +8679,image/jpeg,0,0,,"","",,,0 +8680,image/jpeg,0,0,,"","",,,0 +8681,image/jpeg,0,0,,"","",,,0 +8682,image/jpeg,0,0,,"","",,,0 +8683,image/jpeg,0,0,,"","",,,0 +8684,image/jpeg,0,0,,"","",,,0 +8685,image/jpeg,0,0,,"","",,,0 +8686,image/jpeg,0,0,,"","",,,0 +8687,image/jpeg,0,0,,"","",,,0 +8688,image/jpeg,0,0,,"","",,,0 +8689,image/jpeg,0,0,,"","",,,0 +8690,image/jpeg,0,0,,"","",,,0 +8691,image/jpeg,0,0,,"","",,,0 +8692,image/jpeg,0,0,,"","",,,0 +8693,image/jpeg,0,0,,"","",,,0 +8694,image/jpeg,0,0,,"","",,,0 +8695,image/jpeg,0,0,,"","",,,0 +8696,image/jpeg,0,0,,"","",,,0 +8697,image/jpeg,0,0,,"","",,,0 +8698,image/jpeg,0,0,,"","",,,0 +8699,image/jpeg,0,0,,"","",,,0 +8700,image/jpeg,0,0,,"","",,,0 +8701,image/jpeg,0,0,,"","",,,0 +8702,image/jpeg,0,0,,"","",,,0 +8703,image/jpeg,0,0,,"","",,,0 +8704,image/jpeg,0,0,,"","",,,0 +8705,image/jpeg,0,0,,"","",,,0 +8706,image/jpeg,0,0,,"","",,,0 +8707,image/jpeg,0,0,,"","",,,0 +8708,image/jpeg,0,0,,"","",,,0 +8709,image/jpeg,0,0,,"","",,,0 +8710,image/jpeg,0,0,,"","",,,0 +8711,image/jpeg,0,0,,"","",,,0 +8712,image/jpeg,0,0,,"","",,,0 +8713,image/jpeg,0,0,,"","",,,0 +8714,image/jpeg,0,0,,"","",,,0 +8715,image/jpeg,0,0,,"","",,,0 +8716,image/jpeg,0,0,,"","",,,0 +8717,image/jpeg,0,0,,"","",,,0 +8718,image/jpeg,0,0,,"","",,,0 +8719,image/jpeg,0,0,,"","",,,0 +8720,image/jpeg,0,0,,"","",,,0 +8721,image/jpeg,0,0,,"","",,,0 +8722,image/jpeg,0,0,,"","",,,0 +8723,image/jpeg,0,0,,"","",,,0 +8724,image/jpeg,0,0,,"","",,,0 +8725,image/jpeg,0,0,,"","",,,0 +8726,image/jpeg,0,0,,"","",,,0 +8727,image/jpeg,1655034387970,0,0,"","",44.2505944444444,12.0828666666667,0 +8728,image/jpeg,0,0,,"","",,,0 +8729,image/jpeg,0,0,,"","",,,0 +8730,image/jpeg,0,0,,"","",,,0 +8731,image/jpeg,1655029847186,0,0,"","",,,0 +8732,image/jpeg,1655027335318,0,0,"","",44.250575,12.0828555555556,0 +8733,image/jpeg,0,0,,"","",,,0 +8734,image/jpeg,0,0,,"","",,,0 +8735,image/jpeg,0,0,,"","",,,0 +8736,image/jpeg,0,0,,"","",,,0 +8737,image/jpeg,0,0,,"","",,,0 +8738,image/jpeg,0,0,,"","",,,0 +8739,image/jpeg,0,0,,"","",,,0 +8740,image/jpeg,0,0,,"","",,,0 +8741,image/jpeg,1654890969285,0,0,"","",44.202575,11.9044472222222,0 +8742,image/jpeg,1654873245523,0,0,"","",44.2506527777778,12.0828666666667,0 +8743,image/jpeg,1654872868408,0,0,"","",44.2506166666667,12.0828722222222,0 +8744,image/jpeg,0,0,,"","",,,0 +8745,image/jpeg,1654855494554,0,90,"","",,,0 +8746,image/jpeg,1654852453485,0,0,"","",44.250557,12.0827679722222,0 +8747,image/jpeg,1654852440563,0,0,"","",44.2505583333333,12.0827694444444,0 +8748,image/jpeg,1654852271683,0,0,"","",,,0 +8749,image/jpeg,1654852037586,0,0,"","",44.2506111111111,12.08275,0 +8750,image/jpeg,1654851967350,0,90,"","",,,0 +8751,image/jpeg,1654791527798,0,,"","",44.2507019722222,12.082758,0 +8752,image/jpeg,1654791477676,0,,"","",44.2507179722222,12.0826809722222,0 +8753,image/jpeg,1654791400755,0,,"","",44.2494739722222,12.0812899722222,0 +8754,image/jpeg,0,0,,"","",,,0 +8755,image/jpeg,0,0,,"","",,,0 +8756,image/jpeg,0,0,,"","",,,0 +8757,image/jpeg,0,0,,"","",,,0 +8758,image/jpeg,0,0,,"","",,,0 +8759,image/jpeg,0,0,,"","",,,0 +8760,image/jpeg,0,0,,"","",,,0 +8761,image/jpeg,0,0,,"","",,,0 +8762,image/jpeg,0,0,,"","",,,0 +8763,image/jpeg,1654693697812,0,,"","",44.250638,12.082757,0 +8764,image/jpeg,0,0,,"","",,,0 +8765,image/jpeg,0,0,,"","",,,0 +8766,image/jpeg,0,0,,"","",,,0 +8767,image/jpeg,0,0,,"","",,,0 +8768,image/jpeg,0,0,,"","",,,0 +8769,image/jpeg,0,0,,"","",,,0 +8770,image/jpeg,0,0,,"","",,,0 +8771,image/jpeg,0,0,,"","",,,0 +8772,image/jpeg,0,0,,"","",,,0 +8773,image/jpeg,1654606140540,0,0,"","",44.2425,11.9956944444444,0 +8774,image/jpeg,1654606095589,0,,"","",44.242595,11.9957189722222,0 +8775,image/jpeg,1653654293717,0,0,"","",45.9662972222222,12.6418194444444,0 +8776,image/jpeg,1654268338189,0,0,"","",43.8512611111111,13.0162361111111,0 +8777,image/jpeg,1654016706807,0,0,"","",44.1489583333333,12.1129833333333,0 +8778,image/jpeg,1654015611523,0,0,"","",44.1788305555556,12.1196888888889,0 +8779,image/jpeg,0,0,,"","",,,0 +8780,image/jpeg,0,0,,"","",,,0 +8781,image/jpeg,0,0,,"","",,,0 +8782,image/jpeg,0,0,,"","",,,0 +8783,image/jpeg,0,0,,"","",,,0 +8784,image/jpeg,0,0,,"","",,,0 +8785,image/jpeg,0,0,,"","",,,0 +8786,image/jpeg,0,0,,"","",,,0 +8787,image/jpeg,0,0,,"","",,,0 +8788,image/jpeg,0,0,,"","",,,0 +8789,image/jpeg,0,0,,"","",,,0 +8790,image/jpeg,0,0,,"","",,,0 +8791,image/jpeg,0,0,,"","",,,0 +8792,image/jpeg,0,0,,"","",,,0 +8793,image/jpeg,0,0,,"","",,,0 +8794,image/jpeg,0,0,,"","",,,0 +8795,image/jpeg,1653830830747,0,0,"","",45.4320972222222,12.3296361111111,0 +8796,image/jpeg,1653830757867,0,0,"","",45.432175,12.3295555555556,0 +8797,image/jpeg,1653830750868,0,0,"","",45.4321777777778,12.3295583333333,0 +8798,image/jpeg,0,0,,"","",,,0 +8799,image/jpeg,0,0,,"","",,,0 +8800,image/jpeg,0,0,,"","",,,0 +8801,image/jpeg,0,0,,"","",,,0 +8802,image/jpeg,1653827553655,0,0,"","",45.4346277777778,12.3416583333333,0 +8803,image/jpeg,1653820008265,0,0,"","",45.4379472222222,12.333,0 +8804,image/jpeg,0,0,,"","",,,0 +8805,image/jpeg,0,0,,"","",,,0 +8806,image/jpeg,1653654325363,0,0,"","",45.9662861111111,12.641775,0 +8807,image/jpeg,1653654320524,0,0,"","",45.9662972222222,12.6417777777778,0 +8808,image/jpeg,1653654293717,0,0,"","",45.9662972222222,12.6418194444444,0 +8809,image/jpeg,0,0,,"","",,,0 +8810,image/jpeg,1640524806000,0,0,"","",,,0 +8811,image/jpeg,1640524794000,0,0,"","",,,0 +8812,image/jpeg,0,0,,"","",,,0 +8813,image/jpeg,0,0,,"","",,,0 +8814,image/jpeg,1653478191896,0,,"","",44.242462,11.995551,0 +8815,image/jpeg,0,0,,"","",,,0 +8816,image/jpeg,0,0,,"","",,,0 +8817,image/jpeg,0,0,,"","",,,0 +8818,image/jpeg,0,0,,"","",,,0 +8819,image/jpeg,0,0,,"","",,,0 +8820,image/jpeg,0,0,,"","",,,0 +8821,image/jpeg,0,0,,"","",,,0 +8822,image/jpeg,0,0,,"","",,,0 +8823,image/jpeg,0,0,,"","",,,0 +8824,image/jpeg,0,0,,"","",,,0 +8825,image/jpeg,0,0,,"","",,,0 +8826,image/jpeg,0,0,,"","",,,0 +8827,image/jpeg,0,0,,"","",,,0 +8828,image/jpeg,0,0,,"","",,,0 +8829,image/jpeg,0,0,,"","",,,0 +8830,image/jpeg,0,0,,"","",,,0 +8831,image/jpeg,0,0,,"","",,,0 +8832,image/jpeg,0,0,,"","",,,0 +8833,image/jpeg,0,0,,"","",,,0 +8834,image/jpeg,0,0,,"","",,,0 +8835,image/jpeg,0,0,,"","",,,0 +8836,image/jpeg,0,0,,"","",,,0 +8837,image/jpeg,0,0,,"","",,,0 +8838,image/jpeg,0,0,,"","",,,0 +8839,image/jpeg,0,0,,"","",,,0 +8840,image/jpeg,0,0,,"","",,,0 +8841,image/jpeg,0,0,,"","",,,0 +8842,image/jpeg,0,0,,"","",,,0 +8843,image/jpeg,0,0,,"","",,,0 +8844,image/jpeg,0,0,,"","",,,0 +8845,image/jpeg,0,0,,"","",,,0 +8846,image/jpeg,0,0,,"","",,,0 +8847,image/jpeg,0,0,,"","",,,0 +8848,image/jpeg,0,0,,"","",,,0 +8849,image/jpeg,0,0,,"","",,,0 +8850,image/jpeg,0,0,,"","",,,0 +8851,image/jpeg,0,0,,"","",,,0 +8852,image/jpeg,0,0,,"","",,,0 +8853,image/jpeg,0,0,,"","",,,0 +8854,image/jpeg,0,0,,"","",,,0 +8855,image/jpeg,0,0,,"","",,,0 +8856,image/jpeg,0,0,,"","",,,0 +8857,image/jpeg,0,0,,"","",,,0 +8858,image/jpeg,1653052019700,0,0,"","",44.3854638888889,12.3193722222222,0 +8859,image/jpeg,0,0,,"","",,,0 +8860,image/jpeg,1653050412303,0,0,"","",44.35605,12.309725,0 +8861,image/jpeg,1653049914700,0,0,"","",44.3564944444444,12.2862138888889,0 +8862,image/jpeg,0,0,,"","",,,0 +8863,image/jpeg,1653045041767,0,0,"","",44.325425,12.3198166666667,0 +8864,image/jpeg,1653044895613,0,0,"","",44.3254277777778,12.3198222222222,0 +8865,image/jpeg,0,0,,"","",,,0 +8866,image/jpeg,0,0,,"","",,,0 +8867,image/jpeg,1653037037300,0,0,"","",44.1332944444444,12.2331694444444,0 +8868,image/jpeg,1652976263512,0,0,"","",44.3255833333333,11.9059777777778,0 +8869,image/jpeg,1652976240230,0,0,"","",44.3256083333333,11.9059888888889,0 +8870,image/jpeg,1652976211416,0,0,"","",44.325625,11.9059722222222,0 +8871,image/jpeg,1652976169730,0,0,"","",44.3256138888889,11.9059888888889,0 +8872,image/jpeg,1652976150866,0,0,"","",44.3256444444444,11.9059472222222,0 +8873,image/jpeg,1652976136916,0,0,"","",44.3256,11.9060111111111,0 +8874,image/jpeg,0,0,,"","",,,0 +8875,image/jpeg,0,0,,"","",,,0 +8876,image/jpeg,0,0,,"","",,,0 +8877,image/jpeg,0,0,,"","",,,0 +8878,image/jpeg,0,0,,"","",,,0 +8879,image/jpeg,0,0,,"","",,,0 +8880,image/jpeg,0,0,,"","",,,0 +8881,image/jpeg,0,0,,"","",,,0 +8882,image/jpeg,0,0,,"","",,,0 +8883,image/jpeg,0,0,,"","",,,0 +8884,image/jpeg,0,0,,"","",,,0 +8885,image/jpeg,1652939873816,0,0,"","",44.2506222222222,12.0828027777778,0 +8886,image/jpeg,0,0,,"","",,,0 +8887,image/jpeg,0,0,,"","",,,0 +8888,image/jpeg,0,0,,"","",,,0 +8889,image/jpeg,0,0,,"","",,,0 +8890,image/jpeg,1652890309166,0,0,"","",44.2482277777778,11.98815,0 +8891,image/jpeg,1652890194354,0,0,"","",44.2482333333333,11.9881277777778,0 +8892,image/jpeg,1652890136838,0,0,"","",44.2482222222222,11.9881611111111,0 +8893,image/jpeg,1652890129378,0,0,"","",44.2482333333333,11.9881527777778,0 +8894,image/jpeg,1652890126467,0,0,"","",44.2482333333333,11.9881472222222,0 +8895,image/jpeg,0,0,,"","",,,0 +8896,image/jpeg,0,0,,"","",,,0 +8897,image/jpeg,0,0,,"","",,,0 +8898,image/jpeg,0,0,,"","",,,0 +8899,image/jpeg,0,0,,"","",,,0 +8900,image/jpeg,0,0,,"","",,,0 +8901,image/jpeg,0,0,,"","",,,0 +8902,image/jpeg,0,0,,"","",,,0 +8903,image/jpeg,0,0,,"","",,,0 +8904,image/jpeg,0,0,,"","",,,0 +8905,image/jpeg,0,0,,"","",,,0 +8906,image/jpeg,0,0,,"","",,,0 +8907,image/jpeg,0,0,,"","",,,0 +8908,image/jpeg,0,0,,"","",,,0 +8909,image/jpeg,0,0,,"","",,,0 +8910,image/jpeg,0,0,,"","",,,0 +8911,image/jpeg,0,0,,"","",,,0 +8912,image/jpeg,0,0,,"","",,,0 +8913,image/jpeg,0,0,,"","",,,0 +8914,image/jpeg,0,0,,"","",,,0 +8915,image/jpeg,0,0,,"","",,,0 +8916,image/jpeg,0,0,,"","",,,0 +8917,image/jpeg,0,0,,"","",,,0 +8918,image/jpeg,0,0,,"","",,,0 +8919,image/jpeg,0,0,,"","",,,0 +8920,image/jpeg,0,0,,"","",,,0 +8921,image/jpeg,0,0,,"","",,,0 +8922,image/jpeg,0,0,,"","",,,0 +8923,image/jpeg,0,0,,"","",,,0 +8924,image/jpeg,0,0,,"","",,,0 +8925,image/jpeg,0,0,,"","",,,0 +8926,image/jpeg,0,0,,"","",,,0 +8927,image/jpeg,0,0,,"","",,,0 +8928,image/jpeg,0,0,,"","",,,0 +8929,image/jpeg,0,0,,"","",,,0 +8930,image/jpeg,0,0,,"","",,,0 +8931,image/jpeg,0,0,,"","",,,0 +8932,image/jpeg,1652724713160,0,0,"","",44.2248166666667,11.6942694444444,0 +8933,image/jpeg,0,0,,"","",,,0 +8934,image/jpeg,0,0,,"","",,,0 +8935,image/jpeg,0,0,,"","",,,0 +8936,image/jpeg,0,0,,"","",,,0 +8937,image/jpeg,0,0,,"","",,,0 +8938,image/jpeg,1652625543274,0,0,"","",44.2673027777778,12.1951166666667,0 +8939,image/jpeg,1652625536444,0,0,"","",44.2672972222222,12.1951083333333,0 +8940,image/jpeg,1652625528640,0,0,"","",44.2672916666667,12.1951027777778,0 +8941,image/jpeg,1652625528969,0,0,"","",44.2672916666667,12.1951027777778,0 +8942,image/jpeg,0,0,,"","",,,0 +8943,image/jpeg,0,0,,"","",,,0 +8944,image/jpeg,0,0,,"","",,,0 +8945,image/jpeg,0,0,,"","",,,0 +8946,image/jpeg,0,0,,"","",,,0 +8947,image/jpeg,0,0,,"","",,,0 +8948,image/jpeg,1652461289122,0,0,"","",44.2506194444444,12.0828333333333,0 +8949,image/jpeg,1652437225093,0,,"","",44.2505549722222,12.0828559722222,0 +8950,image/jpeg,1652437206164,0,,"","",44.2505769722222,12.082815,0 +8951,image/jpeg,1652437099476,0,0,"","",44.2506388888889,12.0827666666667,0 +8952,image/jpeg,1652437084999,0,0,"","",44.2506694444444,12.0827611111111,0 +8953,image/jpeg,0,0,,"","",,,0 +8954,image/jpeg,0,0,,"","",,,0 +8955,image/jpeg,0,0,,"","",,,0 +8956,image/jpeg,0,0,,"","",,,0 +8957,image/jpeg,0,0,,"","",,,0 +8958,image/jpeg,0,0,,"","",,,0 +8959,image/jpeg,0,0,,"","",,,0 +8960,image/jpeg,0,0,,"","",,,0 +8961,image/jpeg,0,0,,"","",,,0 +8962,image/jpeg,0,0,,"","",,,0 +8963,image/jpeg,1652335257149,0,0,"","",44.2506138888889,12.08275,0 +8964,image/jpeg,1652335237792,0,0,"","",44.2506472222222,12.082775,0 +8965,image/jpeg,0,0,,"","",,,0 +8966,image/jpeg,0,0,,"","",,,0 +8967,image/jpeg,0,0,,"","",,,0 +8968,image/jpeg,1652205476417,0,0,"","",44.2505972222222,12.0828277777778,0 +8969,image/jpeg,1652014641558,0,0,"","",44.2277722222222,11.9695805555556,0 +8970,image/jpeg,1651839756000,0,0,"","",,,0 +8971,image/jpeg,0,0,,"","",,,0 +8972,image/jpeg,0,0,,"","",,,0 +8973,image/jpeg,0,0,,"","",,,0 +8974,image/jpeg,0,0,,"","",,,0 +8975,image/jpeg,0,0,,"","",,,0 +8976,image/jpeg,0,0,,"","",,,0 +8977,image/jpeg,0,0,,"","",,,0 +8978,image/jpeg,0,0,,"","",,,0 +8979,image/jpeg,0,0,,"","",,,0 +8980,image/jpeg,0,0,,"","",,,0 +8981,image/jpeg,0,0,,"","",,,0 +8982,image/jpeg,0,0,,"","",,,0 +8983,image/jpeg,0,0,,"","",,,0 +8984,image/jpeg,0,0,,"","",,,0 +8985,image/jpeg,0,0,,"","",,,0 +8986,image/jpeg,0,0,,"","",,,0 +8987,image/jpeg,0,0,,"","",,,0 +8988,image/jpeg,0,0,,"","",,,0 +8989,image/jpeg,0,0,,"","",,,0 +8990,image/jpeg,0,0,,"","",,,0 +8991,image/jpeg,1651171500410,0,0,"","",44.2254194444444,12.0407,0 +8992,image/jpeg,0,0,,"","",,,0 +8993,image/png,0,0,,"","",,,0 +8994,image/jpeg,0,0,,"","",,,0 +8995,image/jpeg,0,0,,"","",,,0 +8996,image/jpeg,1570479693000,0,0,"","",,,0 +8997,image/jpeg,1570479693000,0,0,"","",,,0 +8998,image/jpeg,1650533149158,0,,"","",44.2506083333333,12.0828583333333,0 +8999,image/jpeg,0,0,,"","",,,0 +9000,image/jpeg,0,0,,"","",,,0 +9001,image/jpeg,0,0,,"","",,,0 +9002,image/jpeg,0,0,,"","",,,0 +9003,image/jpeg,0,0,,"","",,,0 +9004,image/jpeg,0,0,,"","",,,0 +9005,image/jpeg,0,0,,"","",,,0 +9006,image/jpeg,0,0,,"","",,,0 +9007,image/jpeg,0,0,,"","",,,0 +9008,image/jpeg,0,0,,"","",,,0 +9009,image/jpeg,0,0,,"","",,,0 +9010,image/jpeg,0,0,,"","",,,0 +9011,image/jpeg,0,0,,"","",,,0 +9012,image/jpeg,0,0,,"","",,,0 +9013,image/jpeg,0,0,,"","",,,0 +9014,image/jpeg,0,0,,"","",,,0 +9015,image/jpeg,0,0,,"","",,,0 +9016,image/jpeg,0,0,,"","",,,0 +9017,image/jpeg,0,0,,"","",,,0 +9018,image/jpeg,0,0,,"","",,,0 +9019,image/jpeg,0,0,,"","",,,0 +9020,image/jpeg,0,0,,"","",,,0 +9021,image/jpeg,0,0,,"","",,,0 +9022,image/jpeg,0,0,,"","",,,0 +9023,image/jpeg,0,0,,"","",,,0 +9024,image/jpeg,0,0,,"","",,,0 +9025,image/jpeg,0,0,,"","",,,0 +9026,image/jpeg,0,0,,"","",,,0 +9027,image/jpeg,0,0,,"","",,,0 +9028,image/jpeg,0,0,,"","",,,0 +9029,image/jpeg,0,0,,"","",,,0 +9030,image/jpeg,0,0,,"","",,,0 +9031,image/jpeg,0,0,,"","",,,0 +9032,image/jpeg,0,0,,"","",,,0 +9033,image/jpeg,0,0,,"","",,,0 +9034,image/jpeg,0,0,,"","",,,0 +9035,image/jpeg,0,0,,"","",,,0 +9036,image/jpeg,0,0,,"","",,,0 +9037,image/jpeg,0,0,,"","",,,0 +9038,image/jpeg,0,0,,"","",,,0 +9039,image/jpeg,0,0,,"","",,,0 +9040,image/jpeg,0,0,,"","",,,0 +9041,image/jpeg,0,0,,"","",,,0 +9042,image/jpeg,0,0,,"","",,,0 +9043,image/jpeg,0,0,,"","",,,0 +9044,image/jpeg,1650127198300,0,0,"","",44.25055,12.0828805555556,0 +9045,image/jpeg,0,0,,"","",,,0 +9046,image/jpeg,0,0,,"","",,,0 +9047,image/jpeg,0,0,,"","",,,0 +9048,image/jpeg,0,0,,"","",,,0 +9049,image/jpeg,0,0,,"","",,,0 +9050,image/jpeg,0,0,,"","",,,0 +9051,image/jpeg,0,0,,"","",,,0 +9052,image/jpeg,0,0,,"","",,,0 +9053,image/jpeg,0,0,,"","",,,0 +9054,image/jpeg,0,0,,"","",,,0 +9055,image/jpeg,0,0,,"","",,,0 +9056,image/jpeg,0,0,,"","",,,0 +9057,image/jpeg,0,0,,"","",,,0 +9058,image/jpeg,0,0,,"","",,,0 +9059,image/jpeg,0,0,,"","",,,0 +9060,image/jpeg,0,0,,"","",,,0 +9061,image/jpeg,0,0,,"","",,,0 +9062,image/jpeg,0,0,,"","",,,0 +9063,image/jpeg,0,0,,"","",,,0 +9064,image/jpeg,0,0,,"","",,,0 +9065,image/jpeg,0,0,,"","",,,0 +9066,image/jpeg,0,0,,"","",,,0 +9067,image/jpeg,0,0,,"","",,,0 +9068,image/jpeg,0,0,,"","",,,0 +9069,image/jpeg,0,0,,"","",,,0 +9070,image/jpeg,0,0,,"","",,,0 +9071,image/jpeg,0,0,,"","",,,0 +9072,image/jpeg,0,0,,"","",,,0 +9073,image/jpeg,0,0,,"","",,,0 +9074,image/jpeg,0,0,,"","",,,0 +9075,image/jpeg,1649504486965,0,0,"","",44.1815722222222,12.1950583333333,0 +9076,image/jpeg,1649502756734,0,0,"","",44.1404027777778,12.160975,0 +9077,image/jpeg,1649501186339,0,0,"","",,,0 +9078,image/jpeg,0,0,,"","",,,0 +9079,image/jpeg,0,0,,"","",,,0 +9080,image/jpeg,0,0,,"","",,,0 +9081,image/jpeg,0,0,,"","",,,0 +9082,image/jpeg,1648825396021,0,0,"","",,,0 +9083,image/jpeg,0,0,,"","",,,0 +9084,image/jpeg,0,0,,"","",,,0 +9085,image/jpeg,1648821500222,0,0,"","",43.9215861111111,12.9058111111111,0 +9086,image/jpeg,1648820490162,0,0,"","",43.9273833333333,12.8770277777778,0 +9087,image/jpeg,1648819368340,0,0,"","",43.939325,12.849975,0 +9088,image/jpeg,1648819174623,0,0,"","",43.9412805555556,12.8482722222222,0 +9089,image/jpeg,1648818716750,0,0,"","",43.9481277777778,12.8298,0 +9090,image/jpeg,1648813956298,0,0,"","",43.9636916666667,12.7719777777778,0 +9091,image/jpeg,1648813267934,0,90,"","",,,0 +9092,image/jpeg,1648812911189,0,0,"","",43.9636916666667,12.77195,0 +9093,image/jpeg,1648809487292,0,0,"","",44.0034833333333,12.6619333333333,0 +9094,image/jpeg,1648807157882,0,0,"","",44.077075,12.5749777777778,0 +9095,image/jpeg,1648803625522,0,0,"","",44.1671333333333,12.4406388888889,0 +9096,image/jpeg,1648802284822,0,0,"","",44.1990833333333,12.3951722222222,0 +9097,image/jpeg,1648800346966,0,0,"","",44.2635777777778,12.3512444444444,0 +9098,image/jpeg,0,0,,"","",,,0 +9099,image/jpeg,1648294562699,0,0,"","",44.2507194444444,12.0828944444444,0 +9100,image/jpeg,1648294541209,0,0,"","",44.2507166666667,12.0827,0 +9101,image/jpeg,1648294536842,0,0,"","",44.2504805555556,12.0826083333333,0 +9102,image/jpeg,1648294532565,0,0,"","",44.2505388888889,12.0827083333333,0 +9103,image/jpeg,1648294529490,0,0,"","",44.2505944444444,12.0828416666667,0 +9104,image/jpeg,1648246226610,0,0,"","",44.2506138888889,12.0827888888889,0 +9105,image/jpeg,1648246221942,0,0,"","",44.2506138888889,12.0827888888889,0 +9106,image/jpeg,1648239086830,0,0,"","",44.2506916666667,12.0828277777778,0 +9107,image/jpeg,1648239082635,0,0,"","",44.2506888888889,12.0828166666667,0 +9108,image/jpeg,1648224283643,0,0,"","",44.2505611111111,12.0827861111111,0 +9109,image/jpeg,1648224278909,0,0,"","",44.2505722222222,12.0827833333333,0 +9110,image/jpeg,0,0,,"","",,,0 +9111,image/jpeg,0,0,,"","",,,0 +9112,image/jpeg,0,0,,"","",,,0 +9113,image/jpeg,0,0,,"","",,,0 +9114,image/jpeg,0,0,,"","",,,0 +9115,image/jpeg,1647713760549,0,0,"","",43.2817805555556,13.6526166666667,0 +9116,image/jpeg,0,0,,"","",,,0 +9117,image/jpeg,0,0,,"","",,,0 +9118,image/jpeg,0,0,,"","",,,0 +9119,image/jpeg,0,0,,"","",,,0 +9120,image/jpeg,0,0,,"","",,,0 +9121,image/jpeg,0,0,,"","",,,0 +9122,image/jpeg,0,0,,"","",,,0 +9123,image/jpeg,0,0,,"","",,,0 +9124,image/jpeg,0,0,,"","",,,0 +9125,image/jpeg,0,0,,"","",,,0 +9126,image/jpeg,0,0,,"","",,,0 +9127,image/jpeg,0,0,,"","",,,0 +9128,image/jpeg,1647240618255,0,0,"","",44.2505888888889,12.0828305555556,0 +9129,image/jpeg,1647240604998,0,0,"","",44.2505861111111,12.0828277777778,0 +9130,image/jpeg,0,0,,"","",,,0 +9131,image/jpeg,0,0,,"","",,,0 +9132,image/jpeg,0,0,,"","",,,0 +9133,image/jpeg,0,0,,"","",,,0 +9134,image/jpeg,0,0,,"","",,,0 +9135,image/jpeg,0,0,,"","",,,0 +9136,image/jpeg,0,0,,"","",,,0 +9137,image/jpeg,0,0,,"","",,,0 +9138,image/jpeg,0,0,,"","",,,0 +9139,image/jpeg,0,0,,"","",,,0 +9140,image/jpeg,0,0,,"","",,,0 +9141,image/jpeg,0,0,,"","",,,0 +9142,image/jpeg,0,0,,"","",,,0 +9143,image/jpeg,0,0,,"","",,,0 +9144,image/jpeg,0,0,,"","",,,0 +9145,image/jpeg,0,0,,"","",,,0 +9146,image/jpeg,0,0,,"","",,,0 +9147,image/jpeg,0,0,,"","",,,0 +9148,image/jpeg,0,0,,"","",,,0 +9149,image/jpeg,0,0,,"","",,,0 +9150,image/jpeg,0,0,,"","",,,0 +9151,image/jpeg,0,0,,"","",,,0 +9152,image/jpeg,0,0,,"","",,,0 +9153,image/jpeg,0,0,,"","",,,0 +9154,image/jpeg,0,0,,"","",,,0 +9155,image/jpeg,0,0,,"","",,,0 +9156,image/jpeg,1646260581979,0,0,"","",44.1137305555556,12.4223361111111,0 +9157,image/jpeg,1646260557236,0,0,"","",44.1136583333333,12.4223333333333,0 +9158,image/jpeg,1646064676829,0,0,"","",44.2420527777778,11.9951305555556,0 +9159,image/jpeg,1645707841998,0,0,"","",45.968527,10.9596739722222,0 +9160,image/jpeg,1645707743304,0,0,"","",45.968527,10.9596739722222,0 +9161,image/jpeg,1645707740935,0,0,"","",45.968527,10.9596739722222,0 +9162,image/jpeg,1645707732892,0,0,"","",,,0 +9163,image/jpeg,1645706256213,0,0,"","",,,0 +9164,image/jpeg,1645706253174,0,0,"","",,,0 +9165,image/jpeg,1645705020913,0,0,"","",45.9613119722222,10.951541,0 +9166,image/jpeg,1645705017321,0,0,"","",45.961283,10.9515449722222,0 +9167,image/jpeg,1645704978738,0,0,"","",45.9614305555556,10.9515527777778,0 +9168,image/jpeg,1645704687296,0,0,"","",,,0 +9169,image/jpeg,1645616459934,0,0,"","",46.5976888888889,11.7245138888889,0 +9170,image/jpeg,1645616429254,0,0,"","",46.5976833333333,11.7244805555556,0 +9171,image/jpeg,0,0,,"","",,,0 +9172,image/jpeg,0,0,,"","",,,0 +9173,image/jpeg,0,0,,"","",,,0 +9174,image/jpeg,0,0,,"","",,,0 +9175,image/jpeg,0,0,,"","",,,0 +9176,image/jpeg,1645612545249,0,0,"","",46.600287,11.726841,0 +9177,image/jpeg,1645612539464,0,0,"","",46.6002859722222,11.726834,0 +9178,image/jpeg,1645529608477,0,0,"","",,,0 +9179,image/jpeg,1645529609600,0,0,"","",,,0 +9180,image/jpeg,1645529576573,0,0,"","",,,0 +9181,image/jpeg,0,0,,"","",,,0 +9182,image/jpeg,1645526924132,0,0,"","",46.369573,11.6435099722222,0 +9183,image/jpeg,1645526705359,0,0,"","",46.3710019722222,11.6447889722222,0 +9184,image/jpeg,1645526590537,0,0,"","",46.3719389722222,11.645172,0 +9185,image/jpeg,1645526587100,0,0,"","",46.371946,11.6451679722222,0 +9186,image/jpeg,1645526585167,0,0,"","",46.371952,11.645175,0 +9187,image/jpeg,1645526564982,0,0,"","",46.3719469722222,11.645174,0 +9188,image/jpeg,1645526549379,0,0,"","",46.3719609722222,11.645194,0 +9189,image/jpeg,1645522689934,0,0,"","",46.4764399722222,11.770882,0 +9190,image/jpeg,1645522671360,0,0,"","",46.476444,11.770841,0 +9191,image/jpeg,1645517163206,0,0,"","",46.4755159722222,11.741479,0 +9192,image/jpeg,1645517033874,0,0,"","",46.475464,11.741144,0 +9193,image/jpeg,0,0,,"","",,,0 +9194,image/jpeg,0,0,,"","",,,0 +9195,image/jpeg,0,0,,"","",,,0 +9196,image/jpeg,0,0,,"","",,,0 +9197,image/jpeg,1645462744948,0,0,"","",46.4769099722222,11.7477809722222,0 +9198,image/jpeg,1645462743429,0,0,"","",46.4769099722222,11.7477809722222,0 +9199,image/jpeg,1645462578986,0,0,"","",46.4769099722222,11.7477809722222,0 +9200,image/jpeg,1645462571219,0,0,"","",46.4752009722222,11.740766,0 +9201,image/jpeg,1645462468460,0,0,"","",46.4752009722222,11.740766,0 +9202,image/jpeg,0,0,,"","",,,0 +9203,image/jpeg,0,0,,"","",,,0 +9204,image/jpeg,0,0,,"","",,,0 +9205,image/jpeg,0,0,,"","",,,0 +9206,image/jpeg,0,0,,"","",,,0 +9207,image/jpeg,0,0,,"","",,,0 +9208,image/jpeg,0,0,,"","",,,0 +9209,image/jpeg,0,0,,"","",,,0 +9210,image/jpeg,1645453845132,0,0,"","",46.488384,11.786861,0 +9211,image/jpeg,1645452610992,0,90,"","",,,0 +9212,image/jpeg,1645439441614,0,0,"","",46.4336899722222,11.8624019722222,0 +9213,image/jpeg,1645439427787,0,0,"","",46.4336899722222,11.8624089722222,0 +9214,image/jpeg,1645439423354,0,0,"","",46.433691,11.8624179722222,0 +9215,image/jpeg,1645439255126,0,0,"","",46.433691,11.8624039722222,0 +9216,image/jpeg,1645439152436,0,0,"","",46.433568,11.862394,0 +9217,image/jpeg,1645439140268,0,0,"","",46.433576,11.8623729722222,0 +9218,image/jpeg,1645439134697,0,0,"","",46.433571,11.8623779722222,0 +9219,image/jpeg,1645439109742,0,0,"","",46.43368,11.862406,0 +9220,image/jpeg,1645439101311,0,0,"","",46.4336729722222,11.862391,0 +9221,image/jpeg,1645439094366,0,0,"","",46.4336279722222,11.8624209722222,0 +9222,image/jpeg,0,0,,"","",,,0 +9223,image/jpeg,1645433390587,0,0,"","",46.4782629722222,11.8127729722222,0 +9224,image/jpeg,1645433388724,0,0,"","",46.478261,11.81277,0 +9225,image/jpeg,1645433387620,0,0,"","",46.478259,11.812768,0 +9226,image/jpeg,1645433384257,0,0,"","",46.478256,11.8127619722222,0 +9227,image/jpeg,1645433346297,0,0,"","",46.478267,11.812791,0 +9228,image/jpeg,1645433326469,0,0,"","",46.4782769722222,11.8127929722222,0 +9229,image/jpeg,1645433322706,0,0,"","",46.478276,11.8127859722222,0 +9230,image/jpeg,1645383183112,0,0,"","",,,0 +9231,image/jpeg,0,0,,"","",,,0 +9232,image/jpeg,1645379492194,0,0,"","",46.4753589722222,11.740902,0 +9233,image/jpeg,1645379486446,0,0,"","",46.4753589722222,11.7409009722222,0 +9234,image/jpeg,1645379441576,0,0,"","",46.475129,11.7411019722222,0 +9235,image/jpeg,1645379430632,0,0,"","",46.4753609722222,11.7409069722222,0 +9236,image/jpeg,1645379422609,0,0,"","",46.4753869722222,11.7409169722222,0 +9237,image/jpeg,1645379417725,0,0,"","",46.475386,11.7409259722222,0 +9238,image/jpeg,1645379380967,0,0,"","",46.475372,11.740961,0 +9239,image/jpeg,1645379363563,0,0,"","",46.4752849722222,11.7411309722222,0 +9240,image/jpeg,1645379352354,0,0,"","",46.4751059722222,11.741272,0 +9241,image/jpeg,0,0,,"","",,,0 +9242,image/jpeg,0,0,,"","",,,0 +9243,image/jpeg,1645361284260,0,0,"","",,,0 +9244,image/jpeg,1645031477932,0,0,"","",,,0 +9245,image/jpeg,0,0,,"","",,,0 +9246,image/jpeg,0,0,,"","",,,0 +9247,image/jpeg,0,0,,"","",,,0 +9248,image/jpeg,0,0,,"","",,,0 +9249,image/jpeg,0,0,,"","",,,0 +9250,image/jpeg,0,0,,"","",,,0 +9251,image/jpeg,0,0,,"","",,,0 +9252,image/jpeg,0,0,,"","",,,0 +9253,image/jpeg,0,0,,"","",,,0 +9254,image/jpeg,0,0,,"","",,,0 +9255,image/jpeg,0,0,,"","",,,0 +9256,image/jpeg,0,0,,"","",,,0 +9257,image/jpeg,0,0,,"","",,,0 +9258,image/jpeg,0,0,,"","",,,0 +9259,image/jpeg,0,0,,"","",,,0 +9260,image/jpeg,0,0,,"","",,,0 +9261,image/jpeg,0,0,,"","",,,0 +9262,image/jpeg,0,0,,"","",,,0 +9263,image/jpeg,0,0,,"","",,,0 +9264,image/jpeg,0,0,,"","",,,0 +9265,image/jpeg,0,0,,"","",,,0 +9266,image/jpeg,1644766199709,0,0,"","",45.430402,12.3226659722222,0 +9267,image/jpeg,1644766150220,0,0,"","",45.430419,12.3226849722222,0 +9268,image/jpeg,0,0,,"","",,,0 +9269,image/jpeg,1644765346542,0,0,"","",45.4304289722222,12.3226729722222,0 +9270,image/jpeg,0,0,,"","",,,0 +9271,image/jpeg,0,0,,"","",,,0 +9272,image/jpeg,0,0,,"","",,,0 +9273,image/jpeg,0,0,,"","",,,0 +9274,image/jpeg,1644763340495,0,0,"","",45.430418,12.322691,0 +9275,image/jpeg,1644763342452,0,0,"","",45.4304169722222,12.3226829722222,0 +9276,image/jpeg,1644760972748,0,0,"","",45.4302139722222,12.326143,0 +9277,image/jpeg,0,0,,"","",,,0 +9278,image/jpeg,0,0,,"","",,,0 +9279,image/jpeg,0,0,,"","",,,0 +9280,image/jpeg,0,0,,"","",,,0 +9281,image/jpeg,0,0,,"","",,,0 +9282,image/jpeg,0,0,,"","",,,0 +9283,image/jpeg,0,0,,"","",,,0 +9284,image/jpeg,0,0,,"","",,,0 +9285,image/jpeg,0,0,,"","",,,0 +9286,image/jpeg,0,0,,"","",,,0 +9287,image/jpeg,0,0,,"","",,,0 +9288,image/jpeg,0,0,,"","",,,0 +9289,image/jpeg,0,0,,"","",,,0 +9290,image/jpeg,0,0,,"","",,,0 +9291,image/jpeg,1644746403659,0,0,"","",45.438763,12.3357919722222,0 +9292,image/jpeg,1644746395710,0,0,"","",,,0 +9293,image/jpeg,0,0,,"","",,,0 +9294,image/jpeg,0,0,,"","",,,0 +9295,image/jpeg,1644741903168,0,0,"","",45.4374299722222,12.31873,0 +9296,image/jpeg,1644741318276,0,0,"","",45.438161,12.3175019722222,0 +9297,image/jpeg,0,0,,"","",,,0 +9298,image/jpeg,0,0,,"","",,,0 +9299,image/jpeg,0,0,,"","",,,0 +9300,image/jpeg,0,0,,"","",,,0 +9301,image/jpeg,0,0,,"","",,,0 +9302,image/jpeg,0,0,,"","",,,0 +9303,image/jpeg,0,0,,"","",,,0 +9304,image/jpeg,0,0,,"","",,,0 +9305,image/jpeg,0,0,,"","",,,0 +9306,image/jpeg,1644683125536,0,0,"","",45.4284139722222,12.3314299722222,0 +9307,image/jpeg,1644680788926,0,0,"","",45.4348629722222,12.3345479722222,0 +9308,image/jpeg,1644680786523,0,0,"","",45.434859,12.3345219722222,0 +9309,image/jpeg,1644680746285,0,0,"","",,,0 +9310,image/jpeg,0,0,,"","",,,0 +9311,image/jpeg,0,0,,"","",,,0 +9312,image/jpeg,0,0,,"","",,,0 +9313,image/jpeg,0,0,,"","",,,0 +9314,image/jpeg,0,0,,"","",,,0 +9315,image/jpeg,0,0,,"","",,,0 +9316,image/jpeg,1644680034387,0,0,"","",45.4348049722222,12.3345649722222,0 +9317,image/jpeg,1644680029755,0,0,"","",45.4348099722222,12.334562,0 +9318,image/jpeg,1644679988117,0,0,"","",45.4348549722222,12.33454,0 +9319,image/jpeg,1644679978587,0,0,"","",45.434868,12.3345579722222,0 +9320,image/jpeg,1644679430737,0,0,"","",45.4347929722222,12.3346049722222,0 +9321,image/jpeg,1644679035833,0,0,"","",45.434778,12.3345909722222,0 +9322,image/jpeg,1644679033333,0,0,"","",45.434766,12.334569,0 +9323,image/jpeg,1644677066966,0,0,"","",45.4383509722222,12.336482,0 +9324,image/jpeg,1644676858125,0,0,"","",45.4384,12.3365589722222,0 +9325,image/jpeg,1644676846195,0,0,"","",45.438389,12.3365519722222,0 +9326,image/jpeg,1644676843332,0,0,"","",45.4383819722222,12.336557,0 +9327,image/jpeg,1644676838731,0,0,"","",45.438383,12.3365589722222,0 +9328,image/jpeg,1644676474903,0,0,"","",45.4384259722222,12.3365489722222,0 +9329,image/jpeg,1644676466920,0,0,"","",45.4384319722222,12.336557,0 +9330,image/jpeg,1644676408867,0,0,"","",45.438352,12.3365019722222,0 +9331,image/jpeg,1644676401154,0,0,"","",45.4383479722222,12.336505,0 +9332,image/jpeg,1644676396751,0,0,"","",45.438341,12.3364949722222,0 +9333,image/jpeg,1644676386474,0,0,"","",45.4383389722222,12.336498,0 +9334,image/jpeg,1644675260725,0,0,"","",45.4390339722222,12.3368369722222,0 +9335,image/jpeg,1644675254701,0,0,"","",45.4390339722222,12.3368369722222,0 +9336,image/jpeg,0,0,,"","",,,0 +9337,image/jpeg,1644673245409,0,0,"","",45.440359,12.3344909722222,0 +9338,image/jpeg,1644673241975,0,0,"","",45.440358,12.3344839722222,0 +9339,image/jpeg,1644673236114,0,0,"","",45.4403539722222,12.3344729722222,0 +9340,image/jpeg,1644673234650,0,0,"","",45.440359,12.334471,0 +9341,image/jpeg,1644673229423,0,0,"","",45.4403489722222,12.334471,0 +9342,image/jpeg,1644673227351,0,0,"","",45.4403509722222,12.334476,0 +9343,image/jpeg,1644673152781,0,0,"","",45.440398,12.334481,0 +9344,image/jpeg,1644673144835,0,0,"","",45.4404749722222,12.334429,0 +9345,image/jpeg,1644673142901,0,0,"","",45.438585,12.3354809722222,0 +9346,image/jpeg,1644672704206,0,0,"","",45.442835,12.3346579722222,0 +9347,image/jpeg,1644672695180,0,0,"","",45.442829,12.334661,0 +9348,image/jpeg,0,0,,"","",,,0 +9349,image/jpeg,0,0,,"","",,,0 +9350,image/jpeg,0,0,,"","",,,0 +9351,image/jpeg,0,0,,"","",,,0 +9352,image/jpeg,0,0,,"","",,,0 +9353,image/jpeg,0,0,,"","",,,0 +9354,image/jpeg,0,0,,"","",,,0 +9355,image/jpeg,0,0,,"","",,,0 +9356,image/jpeg,0,0,,"","",,,0 +9357,image/jpeg,0,0,,"","",,,0 +9358,image/jpeg,0,0,,"","",,,0 +9359,image/jpeg,0,0,,"","",,,0 +9360,image/jpeg,0,0,,"","",,,0 +9361,image/jpeg,0,0,,"","",,,0 +9362,image/jpeg,0,0,,"","",,,0 +9363,image/jpeg,0,0,,"","",,,0 +9364,image/jpeg,0,0,,"","",,,0 +9365,image/jpeg,1644666330239,0,0,"","",45.4379289722222,12.3329839722222,0 +9366,image/jpeg,1644666324545,0,0,"","",45.4379289722222,12.3329839722222,0 +9367,image/jpeg,1644662548792,0,0,"","",45.4358969722222,12.325267,0 +9368,image/jpeg,1644660379981,0,0,"","",45.439737,12.3204709722222,0 +9369,image/jpeg,0,0,,"","",,,0 +9370,image/jpeg,1644532600433,0,0,"","",44.2506739722222,12.082872,0 +9371,image/jpeg,1644532597128,0,0,"","",44.2506869722222,12.082871,0 +9372,image/jpeg,1644532594535,0,0,"","",44.2506979722222,12.0828609722222,0 +9373,image/jpeg,1644532530561,0,0,"","",44.250658,12.0828589722222,0 +9374,image/jpeg,1644324226509,0,0,"","",44.250478,12.082879,0 +9375,image/jpeg,0,0,,"","",,,0 +9376,image/jpeg,0,0,,"","",,,0 +9377,image/jpeg,0,0,,"","",,,0 +9378,image/jpeg,0,0,,"","",,,0 +9379,image/jpeg,0,0,,"","",,,0 +9380,image/jpeg,1644092133150,0,0,"","",44.2506539722222,12.0828269722222,0 +9381,image/jpeg,1644092258146,0,0,"","",44.25063,12.082862,0 +9382,image/jpeg,1644092258146,0,0,"","",44.25063,12.082862,0 +9383,image/jpeg,1644092253339,0,0,"","",44.2506259722222,12.0828779722222,0 +9384,image/jpeg,1644092180833,0,0,"","",44.250641,12.0828419722222,0 +9385,image/jpeg,1644092135779,0,0,"","",44.250655,12.0828349722222,0 +9386,image/jpeg,1644092133150,0,0,"","",44.2506539722222,12.0828269722222,0 +9387,image/jpeg,1644092126760,0,0,"","",44.2506509722222,12.0828179722222,0 +9388,image/jpeg,1644092106817,0,0,"","",44.2506339722222,12.082862,0 +9389,image/jpeg,1644092017761,0,0,"","",44.2506279722222,12.0828699722222,0 +9390,image/jpeg,1644061787186,0,0,"","",44.2359409722222,11.705593,0 +9391,image/jpeg,1644061754425,0,0,"","",44.2359429722222,11.7056079722222,0 +9392,image/jpeg,1644055301345,0,0,"","",44.2487119722222,11.672926,0 +9393,image/jpeg,1644055261141,0,0,"","",44.248721,11.672914,0 +9394,image/jpeg,1644055239413,0,0,"","",44.24871,11.6729179722222,0 +9395,image/jpeg,1644055222590,0,0,"","",44.248713,11.672921,0 +9396,image/jpeg,1644053802798,0,0,"","",44.2481059722222,11.6759609722222,0 +9397,image/jpeg,1644053799226,0,0,"","",44.248103,11.6759579722222,0 +9398,image/jpeg,1644053786272,0,0,"","",44.2481089722222,11.6759609722222,0 +9399,image/jpeg,0,0,,"","",,,0 +9400,image/jpeg,0,0,,"","",,,0 +9401,image/jpeg,0,0,,"","",,,0 +9402,,0,0,,"","",,,0 +9403,image/jpeg,0,0,,"","",,,0 +9404,image/jpeg,0,0,,"","",,,0 +9405,image/jpeg,0,0,,"","",,,0 +9406,image/jpeg,0,0,,"","",,,0 +9407,image/jpeg,0,0,,"","",,,0 +9408,image/jpeg,0,0,,"","",,,0 +9409,image/jpeg,0,0,,"","",,,0 +9410,image/jpeg,0,0,,"","",,,0 +9411,image/jpeg,0,0,,"","",,,0 +9412,image/jpeg,0,0,,"","",,,0 +9413,image/jpeg,0,0,,"","",,,0 +9414,image/jpeg,0,0,,"","",,,0 +9415,image/jpeg,0,0,,"","",,,0 +9416,image/jpeg,0,0,,"","",,,0 +9417,image/jpeg,1642694664658,0,0,"","",44.250616,12.082719,0 +9418,image/jpeg,0,0,,"","",,,0 +9419,image/jpeg,0,0,,"","",,,0 +9420,image/jpeg,0,0,,"","",,,0 +9421,image/jpeg,0,0,,"","",,,0 +9422,image/jpeg,1642333568256,0,0,"","",44.250602,12.082848,0 +9423,image/jpeg,0,0,,"","",,,0 +9424,image/jpeg,0,0,,"","",,,0 +9425,image/jpeg,0,0,,"","",,,0 +9426,image/jpeg,0,0,,"","",,,0 +9427,image/png,0,0,,"","",,,0 +9428,image/jpeg,0,0,,"","",,,0 +9429,image/jpeg,0,0,,"","",,,0 +9430,image/jpeg,0,0,,"","",,,0 +9431,image/jpeg,0,0,,"","",,,0 +9432,image/jpeg,0,0,,"","",,,0 +9433,image/jpeg,0,0,,"","",,,0 +9434,image/jpeg,0,0,,"","",,,0 +9435,image/jpeg,0,0,,"","",,,0 +9436,image/jpeg,0,0,,"","",,,0 +9437,image/jpeg,0,0,,"","",,,0 +9438,image/jpeg,1640591255506,0,0,"","",45.9663859722222,12.641859,0 +9439,image/jpeg,1640439498687,0,0,"","",45.966307,12.6418479722222,0 +9440,image/jpeg,0,0,,"","",,,0 +9441,image/jpeg,0,0,,"","",,,0 +9442,image/jpeg,0,0,,"","",,,0 +9443,image/jpeg,1638443369887,0,,"","",44.2505329722222,12.082769,0 +9444,image/jpeg,0,0,,"","",,,0 +9445,image/jpeg,0,0,,"","",,,0 +9446,image/jpeg,0,0,,"","",,,0 +9447,image/jpeg,0,0,,"","",,,0 +9448,image/jpeg,0,0,,"","",,,0 +9449,image/jpeg,0,0,,"","",,,0 +9450,image/jpeg,1639926485130,0,0,"","",44.276898,12.348551,0 +9451,image/jpeg,1639926484328,0,0,"","",44.276901,12.348556,0 +9452,image/jpeg,1639926482897,0,0,"","",44.2769049722222,12.3485569722222,0 +9453,image/jpeg,1639926481497,0,0,"","",44.276907,12.348551,0 +9454,image/jpeg,1639926226525,0,0,"","",44.276893,12.3485759722222,0 +9455,image/jpeg,1639926225356,0,0,"","",44.276895,12.348582,0 +9456,image/jpeg,1639926193543,0,0,"","",44.2767219722222,12.3486799722222,0 +9457,image/jpeg,1639926118176,0,0,"","",44.2766889722222,12.34875,0 +9458,image/jpeg,1639926115942,0,0,"","",44.2766909722222,12.348755,0 +9459,image/jpeg,1639925921497,0,0,"","",44.276679,12.3487089722222,0 +9460,image/jpeg,1639925904130,0,0,"","",44.2766889722222,12.348738,0 +9461,image/jpeg,1639925891947,0,0,"","",44.2767109722222,12.3488159722222,0 +9462,image/jpeg,0,0,,"","",,,0 +9463,image/jpeg,0,0,,"","",,,0 +9464,image/jpeg,0,0,,"","",,,0 +9465,image/jpeg,0,0,,"","",,,0 +9466,image/jpeg,0,0,,"","",,,0 +9467,image/jpeg,0,0,,"","",,,0 +9468,image/jpeg,0,0,,"","",,,0 +9469,image/jpeg,1639917038932,0,0,"","",44.2841,12.3464329722222,0 +9470,image/jpeg,0,0,,"","",,,0 +9471,image/jpeg,0,0,,"","",,,0 +9472,image/jpeg,0,0,,"","",,,0 +9473,image/jpeg,0,0,,"","",,,0 +9474,image/jpeg,0,0,,"","",,,0 +9475,image/jpeg,0,0,,"","",,,0 +9476,image/jpeg,0,0,,"","",,,0 +9477,image/jpeg,0,0,,"","",,,0 +9478,image/jpeg,0,0,,"","",,,0 +9479,image/jpeg,0,0,,"","",,,0 +9480,image/jpeg,0,0,,"","",,,0 +9481,image/jpeg,0,0,,"","",,,0 +9482,image/jpeg,0,0,,"","",,,0 +9483,image/jpeg,0,0,,"","",,,0 +9484,image/jpeg,0,0,,"","",,,0 +9485,image/jpeg,0,0,,"","",,,0 +9486,image/jpeg,0,0,,"","",,,0 +9487,image/jpeg,0,0,,"","",,,0 +9488,image/jpeg,0,0,,"","",,,0 +9489,image/jpeg,0,0,,"","",,,0 +9490,image/jpeg,0,0,,"","",,,0 +9491,image/jpeg,1638889192547,0,0,"","",45.4096109722222,11.884843,0 +9492,image/jpeg,1638888549142,0,0,"","",45.409393,11.8942979722222,0 +9493,image/jpeg,1638888544347,0,0,"","",45.4093909722222,11.8942929722222,0 +9494,image/jpeg,1638888393934,0,0,"","",45.4092539722222,11.8926379722222,0 +9495,image/jpeg,1638888229141,0,0,"","",45.4080569722222,11.891415,0 +9496,image/jpeg,1638888100112,0,0,"","",45.407077,11.8914489722222,0 +9497,image/jpeg,1638884438600,0,0,"","",45.4118449722222,11.879633,0 +9498,image/jpeg,1638884434422,0,0,"","",45.41181,11.8796149722222,0 +9499,image/jpeg,1638878272281,0,0,"","",45.407189,11.8755699722222,0 +9500,image/jpeg,1638878267931,0,0,"","",45.407189,11.8755699722222,0 +9501,image/jpeg,1638878265101,0,0,"","",45.4072379722222,11.8756219722222,0 +9502,image/jpeg,1638878254660,0,0,"","",45.4072379722222,11.8756219722222,0 +9503,image/jpeg,1638875522455,0,0,"","",45.403404,11.8792639722222,0 +9504,image/jpeg,1638867970177,0,0,"","",45.4074439722222,11.877307,0 +9505,image/jpeg,1638821670200,0,0,"","",45.328988,11.7901469722222,0 +9506,image/jpeg,1638821626355,0,0,"","",45.32898,11.790086,0 +9507,image/jpeg,0,0,,"","",,,0 +9508,image/jpeg,0,0,,"","",,,0 +9509,image/jpeg,0,0,,"","",,,0 +9510,image/jpeg,0,0,,"","",,,0 +9511,image/jpeg,0,0,,"","",,,0 +9512,image/jpeg,0,0,,"","",,,0 +9513,image/jpeg,1638781540829,0,0,"","",45.4437819722222,12.325573,0 +9514,image/jpeg,1638786143511,0,0,"","",45.4446549722222,12.325793,0 +9515,image/jpeg,0,0,,"","",,,0 +9516,image/jpeg,0,0,,"","",,,0 +9517,image/jpeg,0,0,,"","",,,0 +9518,image/jpeg,0,0,,"","",,,0 +9519,image/jpeg,0,0,,"","",,,0 +9520,image/jpeg,1638803110520,0,0,"","",45.437837,12.3330049722222,0 +9521,image/jpeg,1638800457749,0,0,"","",45.438209,12.336916,0 +9522,image/jpeg,1638800451311,0,0,"","",45.438217,12.3368459722222,0 +9523,image/jpeg,1638799762364,0,0,"","",45.438186,12.336531,0 +9524,image/jpeg,1638799672934,0,0,"","",45.4383861111111,12.3365305555556,0 +9525,image/jpeg,1638799607758,0,0,"","",45.438408,12.336532,0 +9526,image/jpeg,1638799565348,0,0,"","",45.438425,12.3365349722222,0 +9527,image/jpeg,1638799552420,0,0,"","",45.4384379722222,12.336539,0 +9528,image/jpeg,1638799337267,0,0,"","",45.4382409722222,12.3364799722222,0 +9529,image/jpeg,1638799332355,0,0,"","",45.4382409722222,12.3364799722222,0 +9530,image/jpeg,1638799322584,0,0,"","",45.4382379722222,12.336475,0 +9531,image/jpeg,1638799308998,0,0,"","",45.438271,12.336496,0 +9532,image/jpeg,1638799131182,0,0,"","",45.4382439722222,12.336736,0 +9533,image/jpeg,1638798695795,0,0,"","",45.4381649722222,12.336812,0 +9534,image/jpeg,1638798696186,0,0,"","",45.4381649722222,12.336812,0 +9535,image/jpeg,1638798689195,0,0,"","",45.4381649722222,12.336812,0 +9536,image/jpeg,1638796787567,0,0,"","",45.4397289722222,12.339358,0 +9537,image/jpeg,1638796767113,0,0,"","",45.439745,12.3393779722222,0 +9538,image/jpeg,1638796757359,0,0,"","",45.439745,12.3393789722222,0 +9539,image/jpeg,1638796541488,0,0,"","",45.441132,12.339271,0 +9540,image/jpeg,1638796482471,0,0,"","",45.4411449722222,12.3393099722222,0 +9541,image/jpeg,1638796476208,0,0,"","",45.4411419722222,12.3393069722222,0 +9542,image/jpeg,1638788700654,0,0,"","",45.4404329722222,12.3345009722222,0 +9543,image/jpeg,1638788649745,0,0,"","",45.4404279722222,12.3344979722222,0 +9544,image/jpeg,1638787755450,0,0,"","",45.444284,12.32966,0 +9545,image/jpeg,1638787744963,0,0,"","",45.444284,12.32966,0 +9546,image/jpeg,1638787676394,0,0,"","",45.443955,12.329273,0 +9547,image/jpeg,1638787386586,0,0,"","",45.4433229722222,12.332178,0 +9548,image/jpeg,1638782939486,0,0,"","",45.444682,12.325331,0 +9549,image/jpeg,1638781538132,0,0,"","",45.443783,12.3255759722222,0 +9550,image/jpeg,1638781507478,0,0,"","",45.443778,12.32557,0 +9551,image/jpeg,1638781502679,0,0,"","",45.443778,12.325587,0 +9552,image/jpeg,1638781503781,0,0,"","",45.4437739722222,12.3255829722222,0 +9553,image/jpeg,1638781475450,0,0,"","",45.443778,12.3255909722222,0 +9554,image/jpeg,1638781434403,0,0,"","",45.4437179722222,12.325466,0 +9555,image/jpeg,1638781422369,0,0,"","",45.443713,12.3254599722222,0 +9556,image/jpeg,1638734092431,0,0,"","",45.3251259722222,11.7920839722222,0 +9557,image/jpeg,1638728830902,0,0,"","",45.3247569722222,11.792255,0 +9558,image/jpeg,1638728829458,0,0,"","",45.3247569722222,11.792255,0 +9559,image/jpeg,1638728825690,0,0,"","",45.3247569722222,11.792255,0 +9560,image/jpeg,1638728824366,0,0,"","",45.3247569722222,11.792255,0 +9561,image/jpeg,0,0,,"","",,,0 +9562,image/jpeg,0,0,,"","",,,0 +9563,image/jpeg,0,0,,"","",,,0 +9564,image/jpeg,1638707414646,0,0,"","",,,0 +9565,image/jpeg,1638443369887,0,0,"","",44.2505329722222,12.082769,0 +9566,image/jpeg,0,0,,"","",,,0 +9567,image/jpeg,0,0,,"","",,,0 +9568,image/jpeg,0,0,,"","",,,0 +9569,image/jpeg,1637837504987,0,0,"","",44.250584,12.082781,0 +9570,image/jpeg,0,0,,"","",,,0 +9571,image/jpeg,0,0,,"","",,,0 +9572,image/jpeg,0,0,,"","",,,0 +9573,image/jpeg,0,0,,"","",,,0 +9574,image/jpeg,0,0,,"","",,,0 +9575,image/jpeg,0,0,,"","",,,0 +9576,image/jpeg,0,0,,"","",,,0 +9577,image/jpeg,0,0,,"","",,,0 +9578,image/jpeg,0,0,,"","",,,0 +9579,image/jpeg,0,0,,"","",,,0 +9580,image/jpeg,0,0,,"","",,,0 +9581,image/jpeg,0,0,,"","",,,0 +9582,image/jpeg,0,0,,"","",,,0 +9583,image/jpeg,0,0,,"","",,,0 +9584,image/jpeg,0,0,,"","",,,0 +9585,image/jpeg,0,0,,"","",,,0 +9586,image/jpeg,0,0,,"","",,,0 +9587,image/jpeg,0,0,,"","",,,0 +9588,image/jpeg,0,0,,"","",,,0 +9589,image/jpeg,0,0,,"","",,,0 +9590,image/jpeg,0,0,,"","",,,0 +9591,image/jpeg,0,0,,"","",,,0 +9592,image/jpeg,0,0,,"","",,,0 +9593,image/jpeg,0,0,,"","",,,0 +9594,image/jpeg,0,0,,"","",,,0 +9595,image/jpeg,0,0,,"","",,,0 +9596,image/jpeg,0,0,,"","",,,0 +9597,image/jpeg,0,0,,"","",,,0 +9598,image/jpeg,0,0,,"","",,,0 +9599,image/jpeg,0,0,,"","",,,0 +9600,image/jpeg,0,0,,"","",,,0 +9601,image/jpeg,0,0,,"","",,,0 +9602,image/jpeg,0,0,,"","",,,0 +9603,image/jpeg,0,0,,"","",,,0 +9604,image/jpeg,0,0,,"","",,,0 +9605,image/jpeg,1635796615150,0,0,"","",40.6328999722222,14.4111429722222,0 +9606,image/jpeg,1635796605393,0,90,"","",40.632913,14.4109599722222,0 +9607,image/jpeg,1635794981436,0,0,"","",40.6329199722222,14.4109879722222,0 +9608,image/jpeg,0,0,,"","",,,0 +9609,image/jpeg,0,0,,"","",,,0 +9610,image/jpeg,0,0,,"","",,,0 +9611,image/jpeg,0,0,,"","",,,0 +9612,image/jpeg,1635775860898,0,90,"","",40.83726,14.245461,0 +9613,image/jpeg,0,0,,"","",,,0 +9614,image/jpeg,0,0,,"","",,,0 +9615,image/jpeg,0,0,,"","",,,0 +9616,image/jpeg,0,0,,"","",,,0 +9617,image/jpeg,0,0,,"","",,,0 +9618,image/jpeg,0,0,,"","",,,0 +9619,image/jpeg,0,0,,"","",,,0 +9620,image/jpeg,0,0,,"","",,,0 +9621,image/jpeg,0,0,,"","",,,0 +9622,image/jpeg,0,0,,"","",,,0 +9623,image/jpeg,0,0,,"","",,,0 +9624,image/jpeg,0,0,,"","",,,0 +9625,image/jpeg,0,0,,"","",,,0 +9626,image/jpeg,0,0,,"","",,,0 +9627,image/jpeg,0,0,,"","",,,0 +9628,image/jpeg,0,0,,"","",,,0 +9629,image/jpeg,0,0,,"","",,,0 +9630,image/jpeg,0,0,,"","",,,0 +9631,image/jpeg,0,0,,"","",,,0 +9632,image/jpeg,0,0,,"","",,,0 +9633,image/jpeg,0,0,,"","",,,0 +9634,image/jpeg,0,0,,"","",,,0 +9635,image/jpeg,0,0,,"","",,,0 +9636,image/jpeg,0,0,,"","",,,0 +9637,image/jpeg,0,0,,"","",,,0 +9638,image/jpeg,0,0,,"","",,,0 +9639,image/jpeg,0,0,,"","",,,0 +9640,image/jpeg,0,0,,"","",,,0 +9641,image/jpeg,0,0,,"","",,,0 +9642,image/jpeg,0,0,,"","",,,0 +9643,image/jpeg,0,0,,"","",,,0 +9644,image/jpeg,0,0,,"","",,,0 +9645,image/jpeg,0,0,,"","",,,0 +9646,image/jpeg,0,0,,"","",,,0 +9647,image/jpeg,0,0,,"","",,,0 +9648,image/jpeg,0,0,,"","",,,0 +9649,image/jpeg,0,0,,"","",,,0 +9650,image/jpeg,0,0,,"","",,,0 +9651,image/jpeg,0,0,,"","",,,0 +9652,image/jpeg,0,0,,"","",,,0 +9653,image/jpeg,0,0,,"","",,,0 +9654,image/jpeg,0,0,,"","",,,0 +9655,image/jpeg,0,0,,"","",,,0 +9656,image/jpeg,0,0,,"","",,,0 +9657,image/jpeg,0,0,,"","",,,0 +9658,image/jpeg,0,0,,"","",,,0 +9659,image/jpeg,0,0,,"","",,,0 +9660,image/jpeg,0,0,,"","",,,0 +9661,image/jpeg,0,0,,"","",,,0 +9662,image/jpeg,0,0,,"","",,,0 +9663,image/jpeg,0,0,,"","",,,0 +9664,image/jpeg,0,0,,"","",,,0 +9665,image/jpeg,0,0,,"","",,,0 +9666,image/jpeg,0,0,,"","",,,0 +9667,image/jpeg,0,0,,"","",,,0 +9668,image/jpeg,0,0,,"","",,,0 +9669,image/jpeg,0,0,,"","",,,0 +9670,image/jpeg,0,0,,"","",,,0 +9671,image/jpeg,0,0,,"","",,,0 +9672,image/jpeg,0,0,,"","",,,0 +9673,image/jpeg,0,0,,"","",,,0 +9674,image/jpeg,0,0,,"","",,,0 +9675,image/jpeg,0,0,,"","",,,0 +9676,image/jpeg,0,0,,"","",,,0 +9677,image/jpeg,0,0,,"","",,,0 +9678,image/jpeg,0,0,,"","",,,0 +9679,image/jpeg,0,0,,"","",,,0 +9680,image/jpeg,0,0,,"","",,,0 +9681,image/jpeg,0,0,,"","",,,0 +9682,image/jpeg,0,0,,"","",,,0 +9683,image/jpeg,0,0,,"","",,,0 +9684,image/jpeg,0,0,,"","",,,0 +9685,image/jpeg,0,0,,"","",,,0 +9686,image/jpeg,0,0,,"","",,,0 +9687,image/jpeg,0,0,,"","",,,0 +9688,image/jpeg,0,0,,"","",,,0 +9689,image/jpeg,0,0,,"","",,,0 +9690,image/jpeg,0,0,,"","",,,0 +9691,image/jpeg,0,0,,"","",,,0 +9692,image/jpeg,0,0,,"","",,,0 +9693,image/jpeg,0,0,,"","",,,0 +9694,image/jpeg,0,0,,"","",,,0 +9695,image/jpeg,0,0,,"","",,,0 +9696,image/jpeg,0,0,,"","",,,0 +9697,image/jpeg,1635696551297,0,90,"","",40.550885,14.2426469722222,0 +9698,image/jpeg,1635696542888,0,90,"","",40.5509029722222,14.242651,0 +9699,image/jpeg,1635694753149,0,0,"","",40.547142,14.2434519722222,0 +9700,image/jpeg,1635694737508,0,90,"","",40.5472609722222,14.2433359722222,0 +9701,image/jpeg,1635694664731,0,0,"","",40.5469509722222,14.243356,0 +9702,image/jpeg,1635687377158,0,90,"","",40.5452539722222,14.255501,0 +9703,image/jpeg,1635687359069,0,0,"","",40.545242,14.255494,0 +9704,image/jpeg,1635686402248,0,0,"","",40.5452666666667,14.2501,0 +9705,image/jpeg,1635677962863,0,0,"","",40.556511,14.2281329722222,0 +9706,image/jpeg,1635677949398,0,0,"","",40.5565229722222,14.2280069722222,0 +9707,image/jpeg,1635676821858,0,90,"","",40.556753,14.234555,0 +9708,image/jpeg,1635674072942,0,0,"","",40.6299899722222,14.374254,0 +9709,image/jpeg,1635619268072,0,90,"","",40.6325629722222,14.4106419722222,0 +9710,image/jpeg,0,0,,"","",,,0 +9711,image/jpeg,0,0,,"","",,,0 +9712,image/jpeg,0,0,,"","",,,0 +9713,image/jpeg,0,0,,"","",,,0 +9714,image/jpeg,0,0,,"","",,,0 +9715,image/jpeg,0,0,,"","",,,0 +9716,image/jpeg,0,0,,"","",,,0 +9717,image/jpeg,0,0,,"","",,,0 +9718,image/jpeg,0,0,,"","",,,0 +9719,image/jpeg,0,0,,"","",,,0 +9720,image/jpeg,0,0,,"","",,,0 +9721,image/jpeg,0,0,,"","",,,0 +9722,image/jpeg,0,0,,"","",,,0 +9723,image/jpeg,0,0,,"","",,,0 +9724,image/jpeg,0,0,,"","",,,0 +9725,image/jpeg,0,0,,"","",,,0 +9726,image/jpeg,0,0,,"","",,,0 +9727,image/jpeg,0,0,,"","",,,0 +9728,image/jpeg,0,0,,"","",,,0 +9729,image/jpeg,0,0,,"","",,,0 +9730,image/jpeg,0,0,,"","",,,0 +9731,image/jpeg,0,0,,"","",,,0 +9732,image/jpeg,0,0,,"","",,,0 +9733,image/jpeg,0,0,,"","",,,0 +9734,image/jpeg,0,0,,"","",,,0 +9735,image/jpeg,0,0,,"","",,,0 +9736,image/jpeg,0,0,,"","",,,0 +9737,image/jpeg,0,0,,"","",,,0 +9738,image/jpeg,0,0,,"","",,,0 +9739,image/jpeg,0,0,,"","",,,0 +9740,image/jpeg,0,0,,"","",,,0 +9741,image/jpeg,0,0,,"","",,,0 +9742,image/jpeg,0,0,,"","",,,0 +9743,image/jpeg,0,0,,"","",,,0 +9744,image/jpeg,0,0,,"","",,,0 +9745,image/jpeg,0,0,,"","",,,0 +9746,image/jpeg,0,0,,"","",,,0 +9747,image/jpeg,0,0,,"","",,,0 +9748,image/jpeg,0,0,,"","",,,0 +9749,image/jpeg,0,0,,"","",,,0 +9750,image/jpeg,0,0,,"","",,,0 +9751,image/jpeg,0,0,,"","",,,0 +9752,image/jpeg,0,0,,"","",,,0 +9753,image/jpeg,0,0,,"","",,,0 +9754,image/jpeg,0,0,,"","",,,0 +9755,image/jpeg,0,0,,"","",,,0 +9756,image/jpeg,0,0,,"","",,,0 +9757,image/jpeg,0,0,,"","",,,0 +9758,image/jpeg,0,0,,"","",,,0 +9759,image/jpeg,0,0,,"","",,,0 +9760,image/jpeg,0,0,,"","",,,0 +9761,image/jpeg,1635604645361,0,0,"","",40.63586,14.39071,0 +9762,image/jpeg,1635604639025,0,0,"","",40.63582,14.3907319722222,0 +9763,image/jpeg,1635604398408,0,0,"","",40.6361729722222,14.3912929722222,0 +9764,image/jpeg,1635604396491,0,0,"","",40.636167,14.3912999722222,0 +9765,image/jpeg,1635599980863,0,0,"","",,,0 +9766,image/jpeg,1635599951579,0,0,"","",,,0 +9767,image/jpeg,0,0,,"","",,,0 +9768,image/jpeg,0,0,,"","",,,0 +9769,image/jpeg,0,0,,"","",,,0 +9770,image/jpeg,1635273872234,0,90,"","",44.2914639722222,12.1701599722222,0 +9771,image/png,0,0,,"","",,,0 +9772,image/jpeg,0,0,,"","",,,0 +9773,image/jpeg,0,0,,"","",,,0 +9774,image/jpeg,1634881697578,0,0,"","",45.966374,12.641681,0 +9775,image/jpeg,0,0,,"","",,,0 +9776,image/jpeg,1634798045284,0,0,"","",45.9661809722222,12.6534189722222,0 +9777,image/jpeg,1634752087492,0,0,"","",45.966355,12.641581,0 +9778,image/jpeg,1634666838575,0,90,"","",44.0636989722222,12.4441509722222,0 +9779,image/jpeg,1633975473140,0,90,"","",44.194015,12.1062779722222,0 +9780,image/jpeg,0,0,,"","",,,0 +9781,image/jpeg,0,0,,"","",,,0 +9782,image/jpeg,0,0,,"","",,,0 +9783,image/jpeg,0,0,,"","",,,0 +9784,image/jpeg,0,0,,"","",,,0 +9785,image/jpeg,0,0,,"","",,,0 +9786,image/jpeg,0,0,,"","",,,0 +9787,image/jpeg,0,0,,"","",,,0 +9788,image/jpeg,0,0,,"","",,,0 +9789,image/jpeg,1633858890015,0,0,"","",44.2506699722222,12.0827,0 +9790,image/jpeg,1633779317035,0,0,"","",44.137377,11.8892559722222,0 +9791,image/jpeg,0,0,,"","",,,0 +9792,image/jpeg,0,0,,"","",,,0 +9793,image/jpeg,0,0,,"","",,,0 +9794,image/jpeg,0,0,,"","",,,0 +9795,image/jpeg,1633246186297,0,0,"","",44.1026529722222,11.9816629722222,0 +9796,image/jpeg,1633245904748,0,0,"","",44.102553,11.9815409722222,0 +9797,image/jpeg,1633245620071,0,0,"","",44.1025149722222,11.981583,0 +9798,image/jpeg,1633245612087,0,0,"","",44.1025119722222,11.981583,0 +9799,image/jpeg,1633244094594,0,0,"","",44.10219,11.981465,0 +9800,image/jpeg,1633241223302,0,0,"","",44.2230429722222,12.041636,0 +9801,image/jpeg,0,0,,"","",,,0 +9802,image/jpeg,0,0,,"","",,,0 +9803,image/jpeg,0,0,,"","",,,0 +9804,image/jpeg,1633176077524,0,0,"","",44.698086,12.174122,0 +9805,image/jpeg,0,0,,"","",,,0 +9806,image/jpeg,0,0,,"","",,,0 +9807,image/jpeg,1633098864346,0,0,"","",44.250576,12.082874,0 +9808,image/jpeg,0,0,,"","",,,0 +9809,image/jpeg,0,0,,"","",,,0 +9810,image/jpeg,1632851595442,0,0,"","",44.2230169722222,12.0412069722222,0 +9811,image/jpeg,1632851560450,0,0,"","",44.2230277777778,12.0412055555556,0 +9812,image/jpeg,1632848897666,0,0,"","",44.2145709722222,11.916626,0 +9813,image/jpeg,1632848892351,0,0,"","",44.2145709722222,11.916626,0 +9814,image/jpeg,1632848836403,0,0,"","",44.214564,11.916624,0 +9815,image/jpeg,1632848641872,0,0,"","",44.2150079722222,11.9108289722222,0 +9816,image/jpeg,1632848398429,0,0,"","",44.202606,11.904483,0 +9817,image/jpeg,1632848347141,0,0,"","",44.2025972222222,11.9044666666667,0 +9818,image/jpeg,1632848156207,0,0,"","",44.197175,11.9037611111111,0 +9819,image/jpeg,1632847920634,0,0,"","",44.1930777777778,11.9109388888889,0 +9820,image/jpeg,0,0,,"","",,,0 +9821,image/jpeg,1632675029711,0,90,"","",44.235995,11.980669,0 +9822,image/jpeg,1632675021031,0,0,"","",44.2360019722222,11.9806969722222,0 +9823,image/jpeg,0,0,,"","",,,0 +9824,image/jpeg,0,0,,"","",,,0 +9825,image/jpeg,0,0,,"","",,,0 +9826,image/jpeg,0,0,,"","",,,0 +9827,image/jpeg,0,0,,"","",,,0 +9828,image/jpeg,0,0,,"","",,,0 +9829,image/jpeg,0,0,,"","",,,0 +9830,image/jpeg,0,0,,"","",,,0 +9831,image/jpeg,1631971288323,0,0,"","",44.147184,12.132206,0 +9832,image/jpeg,1631970080789,0,0,"","",44.146087,12.135716,0 +9833,image/jpeg,1631970039555,0,0,"","",44.146056,12.135797,0 +9834,image/jpeg,1631970030812,0,0,"","",44.1459609722222,12.1355129722222,0 +9835,image/jpeg,1631949968795,0,0,"","",44.1870959722222,12.1259709722222,0 +9836,image/jpeg,1631949959786,0,0,"","",44.1871,12.125987,0 +9837,image/jpeg,1631949672884,0,0,"","",44.1869739722222,12.1259069722222,0 +9838,image/jpeg,0,0,,"","",,,0 +9839,image/jpeg,0,0,,"","",,,0 +9840,image/jpeg,0,0,,"","",,,0 +9841,image/jpeg,0,0,,"","",,,0 +9842,image/jpeg,1631353420158,0,0,"","",42.7928539722222,10.7620719722222,0 +9843,image/jpeg,1631353420158,0,0,"","",42.7928539722222,10.7620719722222,0 +9844,image/jpeg,1631378479128,0,0,"","",42.447467,11.17642,0 +9845,image/jpeg,0,0,,"","",,,0 +9846,image/jpeg,0,0,,"","",,,0 +9847,image/jpeg,0,0,,"","",,,0 +9848,image/jpeg,0,0,,"","",,,0 +9849,image/jpeg,0,0,,"","",,,0 +9850,image/jpeg,0,0,,"","",,,0 +9851,image/jpeg,0,0,,"","",,,0 +9852,image/jpeg,0,0,,"","",,,0 +9853,image/jpeg,0,0,,"","",,,0 +9854,image/jpeg,0,0,,"","",,,0 +9855,image/jpeg,1631423554299,0,0,"","",43.7735089722222,11.254616,0 +9856,image/jpeg,0,0,,"","",,,0 +9857,image/jpeg,0,0,,"","",,,0 +9858,image/jpeg,0,0,,"","",,,0 +9859,image/jpeg,0,0,,"","",,,0 +9860,image/jpeg,0,0,,"","",,,0 +9861,image/jpeg,0,0,,"","",,,0 +9862,image/jpeg,0,0,,"","",,,0 +9863,image/jpeg,0,0,,"","",,,0 +9864,image/jpeg,0,0,,"","",,,0 +9865,image/jpeg,0,0,,"","",,,0 +9866,image/jpeg,0,0,,"","",,,0 +9867,image/jpeg,0,0,,"","",,,0 +9868,image/jpeg,0,0,,"","",,,0 +9869,image/jpeg,0,0,,"","",,,0 +9870,image/jpeg,1631380274856,0,0,"","",42.4357779722222,11.2059029722222,0 +9871,image/jpeg,1631380266488,0,0,"","",42.43578,11.205904,0 +9872,image/jpeg,1631379955198,0,0,"","",42.4314079722222,11.2016329722222,0 +9873,image/jpeg,1631379367844,0,0,"","",42.4326027777778,11.1717833333333,0 +9874,image/jpeg,1631379360451,0,0,"","",42.432614,11.17178,0 +9875,image/jpeg,1631367357620,0,0,"","",42.6682879722222,11.046794,0 +9876,image/jpeg,1631367344073,0,0,"","",42.6682729722222,11.046791,0 +9877,image/jpeg,1631367328344,0,0,"","",42.66837,11.0468379722222,0 +9878,image/jpeg,1631367069890,0,0,"","",42.674509,11.049478,0 +9879,image/jpeg,0,0,,"","",,,0 +9880,image/jpeg,1631365639850,0,0,"","",42.683325,11.087281,0 +9881,image/jpeg,1631357967122,0,0,"","",42.7637929722222,10.8720379722222,0 +9882,image/jpeg,1631357880609,0,0,"","",42.763784,10.872078,0 +9883,image/jpeg,1631354581788,0,0,"","",42.781221,10.7806909722222,0 +9884,image/jpeg,1631354569218,0,0,"","",42.781221,10.7806909722222,0 +9885,image/jpeg,1631353871733,0,0,"","",42.7857229722222,10.771523,0 +9886,image/jpeg,1631353592978,0,0,"","",42.791594,10.7644199722222,0 +9887,image/jpeg,1631353575232,0,0,"","",42.791598,10.7644249722222,0 +9888,image/jpeg,1631353047502,0,0,"","",42.7926799722222,10.7576119722222,0 +9889,image/jpeg,1631353047502,0,0,"","",42.7926799722222,10.7576119722222,0 +9890,image/jpeg,1631352770255,0,0,"","",42.7933049722222,10.7562759722222,0 +9891,image/jpeg,1631352744633,0,90,"","",42.7931379722222,10.7562669722222,0 +9892,image/jpeg,0,0,,"","",,,0 +9893,image/jpeg,0,0,,"","",,,0 +9894,image/jpeg,0,0,,"","",,,0 +9895,image/jpeg,0,0,,"","",,,0 +9896,image/jpeg,1631349455003,0,0,"","",42.813695,10.764013,0 +9897,image/jpeg,1631349410941,0,0,"","",42.813693,10.764032,0 +9898,image/jpeg,1631344294921,0,0,"","",42.8594399722222,10.7713059722222,0 +9899,image/jpeg,1631343484604,0,0,"","",42.868875,10.7696583333333,0 +9900,image/jpeg,1631342761535,0,0,"","",42.8793027777778,10.7780027777778,0 +9901,image/jpeg,0,0,,"","",,,0 +9902,image/jpeg,0,0,,"","",,,0 +9903,image/jpeg,0,0,,"","",,,0 +9904,image/jpeg,0,0,,"","",,,0 +9905,image/jpeg,0,0,,"","",,,0 +9906,image/jpeg,1631302231238,0,0,"","",42.9239999722222,10.758079,0 +9907,image/jpeg,1631292359814,0,90,"","",42.9279399722222,10.7426139722222,0 +9908,image/jpeg,1631292358352,0,90,"","",42.9279399722222,10.7426159722222,0 +9909,image/jpeg,1631282680715,0,0,"","",42.920099,10.52551,0 +9910,image/jpeg,1631282447188,0,90,"","",42.922744,10.527005,0 +9911,image/jpeg,1631270234895,0,0,"","",43.407246,10.408151,0 +9912,image/jpeg,1631270218421,0,0,"","",43.407245,10.408148,0 +9913,image/jpeg,1631252653577,0,0,"","",43.723008,10.3984439722222,0 +9914,image/jpeg,1631252653577,0,90,"","",43.723008,10.3984439722222,0 +9915,image/jpeg,0,0,,"","",,,0 +9916,image/jpeg,0,0,,"","",,,0 +9917,image/jpeg,0,0,,"","",,,0 +9918,image/jpeg,0,0,,"","",,,0 +9919,image/jpeg,0,0,,"","",,,0 +9920,image/jpeg,0,0,,"","",,,0 +9921,image/jpeg,0,0,,"","",,,0 +9922,image/jpeg,0,0,,"","",,,0 +9923,image/jpeg,0,0,,"","",,,0 +9924,image/jpeg,0,0,,"","",,,0 +9925,image/jpeg,0,0,,"","",,,0 +9926,image/jpeg,0,0,,"","",,,0 +9927,image/jpeg,1631220021845,0,90,"","",43.723689,10.396254,0 +9928,image/jpeg,1631219630123,0,90,"","",43.722929,10.3962869722222,0 +9929,image/jpeg,1631219624506,0,90,"","",43.722945,10.3963059722222,0 +9930,image/jpeg,1631219527537,0,90,"","",43.7228539722222,10.396157,0 +9931,image/jpeg,1631219502285,0,90,"","",43.7228369722222,10.3963099722222,0 +9932,image/jpeg,1631219401323,0,90,"","",43.722458,10.3966239722222,0 +9933,image/jpeg,1631213643628,0,0,"","",43.7207679722222,10.3969339722222,0 +9934,image/jpeg,1631213585345,0,0,"","",43.720705,10.3972759722222,0 +9935,image/jpeg,1631212725834,0,90,"","",43.7206979722222,10.3970789722222,0 +9936,image/jpeg,1631207173061,0,180,"","",43.722571,10.3955009722222,0 +9937,image/jpeg,1631207114508,0,0,"","",43.722535,10.395433,0 +9938,image/jpeg,1631207112098,0,0,"","",43.722534,10.3954369722222,0 +9939,image/jpeg,1631207108020,0,0,"","",43.722534,10.395436,0 +9940,image/jpeg,1631207105755,0,0,"","",43.7225329722222,10.395436,0 +9941,image/jpeg,1631207101935,0,0,"","",43.7225329722222,10.3954339722222,0 +9942,image/jpeg,1631207099404,0,0,"","",43.7225309722222,10.3954339722222,0 +9943,image/jpeg,1631207096895,0,0,"","",43.722529,10.3954369722222,0 +9944,image/jpeg,1631207087326,0,0,"","",43.722534,10.395438,0 +9945,image/jpeg,1631206955908,0,0,"","",43.722515,10.3954769722222,0 +9946,image/jpeg,1631206930138,0,0,"","",43.722549,10.3954529722222,0 +9947,image/jpeg,1631206924315,0,0,"","",43.722551,10.3954489722222,0 +9948,image/jpeg,1631206923158,0,0,"","",43.7225529722222,10.3954509722222,0 +9949,image/jpeg,1631206258736,0,0,"","",43.7225729722222,10.3949269722222,0 +9950,image/jpeg,1631206258736,0,0,"","",43.7225729722222,10.3949269722222,0 +9951,image/jpeg,1631206258736,0,90,"","",43.7225729722222,10.3949269722222,0 +9952,image/jpeg,1631206254251,0,90,"","",43.7225869722222,10.3949359722222,0 +9953,image/jpeg,1631206251146,0,90,"","",43.722593,10.394937,0 +9954,image/jpeg,1631206135561,0,90,"","",43.722597,10.3949259722222,0 +9955,image/jpeg,1631205926209,0,90,"","",43.7226059722222,10.3949289722222,0 +9956,image/jpeg,1631205906653,0,90,"","",43.7226259722222,10.394916,0 +9957,image/jpeg,1631205877776,0,90,"","",43.722616,10.3948959722222,0 +9958,image/jpeg,1631205874650,0,90,"","",43.722613,10.394901,0 +9959,image/jpeg,1631205826589,0,90,"","",43.722588,10.394902,0 +9960,image/jpeg,1631205536893,0,0,"","",43.722864,10.3933769722222,0 +9961,image/jpeg,1631205526186,0,0,"","",43.7228649722222,10.3933789722222,0 +9962,image/jpeg,1631205522781,0,0,"","",43.7228619722222,10.393378,0 +9963,image/jpeg,1631205494810,0,0,"","",43.722852,10.39333,0 +9964,image/jpeg,1631205483861,0,0,"","",43.7228479722222,10.393309,0 +9965,image/jpeg,1631205209227,0,0,"","",43.7228789722222,10.393195,0 +9966,image/jpeg,1631205198625,0,90,"","",43.7228569722222,10.393186,0 +9967,image/jpeg,1631205145039,0,0,"","",43.722813,10.392996,0 +9968,image/jpeg,1631205144021,0,0,"","",43.722824,10.392984,0 +9969,image/jpeg,1631205129063,0,0,"","",43.722827,10.392974,0 +9970,image/jpeg,0,0,,"","",,,0 +9971,image/jpeg,1631185504108,0,0,"","",44.008907,10.1015309722222,0 +9972,image/jpeg,1631185426045,0,90,"","",44.008898,10.101527,0 +9973,image/jpeg,1631185423103,0,90,"","",44.008898,10.101527,0 +9974,image/jpeg,0,0,,"","",,,0 +9975,image/jpeg,1631183305513,0,0,"","",44.046987,10.020182,0 +9976,image/jpeg,1631182435908,0,0,"","",44.0639138888889,9.97250277777778,0 +9977,image/jpeg,1631182422938,0,0,"","",44.0638849722222,9.972474,0 +9978,image/jpeg,1631182409383,0,0,"","",44.0638849722222,9.972471,0 +9979,image/jpeg,1631180919816,0,0,"","",44.0845529722222,9.90731397222222,0 +9980,image/jpeg,1631179500457,0,90,"","",44.110571,9.853699,0 +9981,image/jpeg,1631179494758,0,0,"","",44.1105769722222,9.85368397222222,0 +9982,image/jpeg,1631177881957,0,0,"","",44.087662,9.82022597222222,0 +9983,image/jpeg,1631177870653,0,0,"","",44.0876489722222,9.820225,0 +9984,image/jpeg,1631176253776,0,0,"","",44.0593009722222,9.84875397222222,0 +9985,image/jpeg,0,0,,"","",,,0 +9986,image/jpeg,0,0,,"","",,,0 +9987,image/jpeg,1631173914713,0,0,"","",44.0483029722222,9.832302,0 +9988,image/jpeg,1631173849100,0,0,"","",44.048389,9.832297,0 +9989,image/jpeg,1631173828510,0,0,"","",44.0483789722222,9.832311,0 +9990,image/jpeg,1631173800352,0,0,"","",44.048408,9.832309,0 +9991,image/jpeg,1631173668991,0,90,"","",44.048746,9.832841,0 +9992,image/jpeg,1631173650408,0,90,"","",44.048718,9.832864,0 +9993,image/jpeg,1631173441267,0,0,"","",44.048985,9.83295997222222,0 +9994,image/jpeg,1631172412122,0,0,"","",44.0513029722222,9.83548097222222,0 +9995,image/jpeg,1631172088569,0,0,"","",44.051268,9.83540797222222,0 +9996,image/jpeg,1631172037553,0,0,"","",44.051312,9.835426,0 +9997,image/jpeg,1631172024574,0,0,"","",44.0513049722222,9.835421,0 +9998,image/jpeg,1631171618574,0,0,"","",44.0606399722222,9.842259,0 +9999,image/jpeg,1631171611337,0,0,"","",44.060647,9.842254,0 +10000,image/jpeg,1631171383760,0,0,"","",44.0612619722222,9.84371997222222,0 +10001,image/jpeg,1631171383760,0,0,"","",44.0612619722222,9.84371997222222,0 +10002,image/jpeg,1631164678163,0,0,"","",44.1107861111111,9.81361388888889,0 +10003,image/jpeg,1631128466996,0,0,"","",44.1029789722222,9.81859797222222,0 +10004,image/jpeg,1631128347172,0,0,"","",44.102957,9.818675,0 +10005,image/jpeg,1631121409947,0,0,"","",44.098139,9.73760797222222,0 +10006,image/jpeg,1631121398237,0,0,"","",44.0981319722222,9.737602,0 +10007,image/jpeg,1631121373943,0,0,"","",44.098221,9.73765397222222,0 +10008,image/jpeg,1631121359059,0,0,"","",44.098241,9.737629,0 +10009,image/jpeg,1631121355605,0,0,"","",44.09825,9.737633,0 +10010,image/jpeg,1631121270161,0,0,"","",44.098556,9.737555,0 +10011,image/jpeg,1631121139250,0,90,"","",44.098579,9.737379,0 +10012,image/jpeg,1631121067987,0,90,"","",44.0986279722222,9.73737597222222,0 +10013,image/jpeg,1631121060642,0,0,"","",44.0986199722222,9.737346,0 +10014,image/jpeg,1631121021694,0,0,"","",44.0985659722222,9.73750397222222,0 +10015,image/jpeg,1631120939902,0,0,"","",44.0986609722222,9.737648,0 +10016,image/jpeg,1631120909411,0,0,"","",44.098781,9.73783797222222,0 +10017,image/jpeg,1631120903988,0,90,"","",44.098776,9.737845,0 +10018,image/jpeg,1631117587137,0,0,"","",44.107432,9.72556497222222,0 +10019,image/jpeg,1631116045237,0,0,"","",44.1073659722222,9.72565997222222,0 +10020,image/jpeg,1631116032702,0,0,"","",44.1073659722222,9.725682,0 +10021,image/jpeg,1631116013306,0,0,"","",44.1073889722222,9.72571897222222,0 +10022,image/jpeg,1631115751741,0,0,"","",44.1067269722222,9.72716997222222,0 +10023,image/jpeg,1631115739191,0,0,"","",44.1067469722222,9.72722597222222,0 +10024,image/jpeg,1631115734254,0,0,"","",44.106721,9.72726197222222,0 +10025,image/jpeg,1631113432242,0,90,"","",44.119537,9.70672597222222,0 +10026,image/jpeg,1631113427621,0,0,"","",44.1195129722222,9.70679497222222,0 +10027,image/jpeg,1631113139863,0,0,"","",44.119615,9.70790097222222,0 +10028,image/jpeg,0,0,,"","",,,0 +10029,image/jpeg,0,0,,"","",,,0 +10030,image/jpeg,0,0,,"","",,,0 +10031,image/jpeg,0,0,,"","",,,0 +10032,image/jpeg,1631112864517,0,0,"","",44.11957,9.70786497222222,0 +10033,image/jpeg,1631112839414,0,0,"","",44.1195939722222,9.707855,0 +10034,image/jpeg,1631112836714,0,0,"","",44.119596,9.707852,0 +10035,image/jpeg,1631112824643,0,0,"","",44.119599,9.70782497222222,0 +10036,image/jpeg,1631112811679,0,0,"","",44.119627,9.707776,0 +10037,image/jpeg,1631112804816,0,0,"","",44.119643,9.707788,0 +10038,image/jpeg,1631112781418,0,0,"","",44.119655,9.70778497222222,0 +10039,image/jpeg,1631112767157,0,0,"","",44.1196219722222,9.70781797222222,0 +10040,image/jpeg,1631112750213,0,0,"","",44.1196419722222,9.70783497222222,0 +10041,image/jpeg,1631112425644,0,90,"","",44.1202699722222,9.70899,0 +10042,image/jpeg,1631112308986,0,0,"","",44.1205149722222,9.70878697222222,0 +10043,image/jpeg,1631111805674,0,0,"","",44.1201009722222,9.710993,0 +10044,image/jpeg,1631111801748,0,0,"","",44.1201099722222,9.710986,0 +10045,image/jpeg,1631111786064,0,0,"","",44.1201769722222,9.71097197222222,0 +10046,image/jpeg,1631109229766,0,0,"","",44.1349489722222,9.68134,0 +10047,image/jpeg,1631109218778,0,0,"","",44.134959,9.68135097222222,0 +10048,image/jpeg,1631109214398,0,90,"","",44.1349609722222,9.681371,0 +10049,image/jpeg,0,0,270,"","",,,0 +10050,image/jpeg,1631109125424,0,0,"","",44.135254,9.681565,0 +10051,image/jpeg,1631109115114,0,0,"","",44.1353059722222,9.681603,0 +10052,image/jpeg,0,0,,"","",,,0 +10053,image/jpeg,1631108744087,0,0,"","",44.134759,9.68316,0 +10054,image/jpeg,0,0,,"","",,,0 +10055,image/jpeg,1631108744087,0,0,"","",44.134759,9.68316,0 +10056,image/jpeg,1631102800471,0,0,"","",44.1452389722222,9.65423497222222,0 +10057,image/jpeg,1631102776184,0,0,"","",44.145243,9.65425497222222,0 +10058,image/jpeg,1631102145835,0,0,"","",44.1455869722222,9.651922,0 +10059,image/jpeg,1631088174541,0,0,"","",44.159671,9.664118,0 +10060,image/jpeg,1631088163162,0,0,"","",44.1596779722222,9.664111,0 +10061,image/jpeg,1631088126583,0,0,"","",44.159691,9.66411397222222,0 +10062,image/jpeg,1631087569611,0,0,"","",44.160518,9.66338097222222,0 +10063,image/jpeg,1631086855452,0,90,"","",44.164023,9.65655397222222,0 +10064,image/jpeg,1631085913984,0,0,"","",44.16924,9.651652,0 +10065,image/jpeg,1631085910989,0,0,"","",44.16924,9.651652,0 +10066,image/jpeg,1631085895343,0,0,"","",44.16924,9.651652,0 +10067,image/jpeg,1631085310942,0,0,"","",44.1746929722222,9.64370197222222,0 +10068,image/jpeg,0,0,,"","",,,0 +10069,image/jpeg,1631084946361,0,0,"","",44.173149,9.644185,0 +10070,image/jpeg,1631083974621,0,90,"","",44.173278,9.63444297222222,0 +10071,image/jpeg,1631083450407,0,0,"","",44.1760189722222,9.62255097222222,0 +10072,image/jpeg,0,0,,"","",,,0 +10073,image/jpeg,0,0,,"","",,,0 +10074,image/jpeg,0,0,,"","",,,0 +10075,image/jpeg,1631034848566,0,0,"","",44.173143,9.605959,0 +10076,image/jpeg,0,0,,"","",,,0 +10077,image/jpeg,1631034594451,0,0,"","",44.178342,9.60069,0 +10078,image/jpeg,1631033027859,0,90,"","",44.220995,9.588357,0 +10079,image/jpeg,1631032991446,0,0,"","",44.2212249722222,9.58874997222222,0 +10080,image/jpeg,1631032988391,0,0,"","",44.2212239722222,9.588748,0 +10081,image/jpeg,1631031854233,0,0,"","",44.24965,9.568751,0 +10082,image/jpeg,1631031840867,0,0,"","",44.249645,9.56875197222222,0 +10083,image/jpeg,0,0,,"","",,,0 +10084,image/jpeg,1631022323909,0,90,"","",44.239702,9.485791,0 +10085,image/jpeg,1631022296867,0,90,"","",44.239696,9.48581597222222,0 +10086,image/jpeg,1631008420027,0,0,"","",44.3153489722222,9.31905897222222,0 +10087,image/jpeg,1631008412709,0,0,"","",44.3153429722222,9.319046,0 +10088,image/jpeg,1631007243000,0,90,"","",44.327781,9.291249,0 +10089,image/jpeg,1631007185887,0,0,"","",44.32775,9.291223,0 +10090,image/jpeg,1631007181547,0,0,"","",44.3277479722222,9.291221,0 +10091,image/jpeg,1631007175309,0,0,"","",44.3277489722222,9.291225,0 +10092,image/jpeg,0,0,,"","",,,0 +10093,image/jpeg,1631006250114,0,0,"","",44.332067,9.284686,0 +10094,image/jpeg,1631006230004,0,0,"","",44.3320709722222,9.28468297222222,0 +10095,image/jpeg,1631001149395,0,0,"","",44.3024139722222,9.21043097222222,0 +10096,image/jpeg,1631001811359,0,0,"","",44.303223,9.20993797222222,0 +10097,image/jpeg,1631001351918,0,0,"","",44.302399,9.21049497222222,0 +10098,image/jpeg,1631001225180,0,0,"","",44.302415,9.21043597222222,0 +10099,image/jpeg,1631001225005,0,0,"","",44.3024139722222,9.210435,0 +10100,image/jpeg,1631001132799,0,90,"","",44.3023969722222,9.210466,0 +10101,image/jpeg,1631001127983,0,0,"","",44.302385,9.21046697222222,0 +10102,image/jpeg,0,0,,"","",,,0 +10103,image/jpeg,1631000815449,0,0,"","",44.3024527777778,9.21045,0 +10104,image/jpeg,1631000803261,0,0,"","",44.3024388888889,9.21044722222222,0 +10105,image/jpeg,0,0,,"","",,,0 +10106,image/jpeg,0,0,,"","",,,0 +10107,image/jpeg,0,0,,"","",,,0 +10108,image/jpeg,0,0,,"","",,,0 +10109,image/jpeg,0,0,,"","",,,0 +10110,image/jpeg,1631000632497,0,90,"","",44.302393,9.210452,0 +10111,image/jpeg,1631000621372,0,0,"","",44.302416,9.21045797222222,0 +10112,image/jpeg,1631000213526,0,0,"","",44.3068359722222,9.212948,0 +10113,image/jpeg,1631000208984,0,0,"","",44.30689,9.213024,0 +10114,image/jpeg,1630998803684,0,90,"","",44.3339799722222,9.21382597222222,0 +10115,image/jpeg,1630998778307,0,0,"","",44.334029,9.213886,0 +10116,image/jpeg,1630998000230,0,0,"","",44.3443589722222,9.229521,0 +10117,image/jpeg,1630997907767,0,0,"","",44.3443109722222,9.229468,0 +10118,image/jpeg,1630997878802,0,0,"","",44.3443029722222,9.229442,0 +10119,image/jpeg,1630993826307,0,0,"","",44.3481629722222,9.226247,0 +10120,image/jpeg,0,0,,"","",,,0 +10121,image/jpeg,0,0,,"","",,,0 +10122,image/jpeg,0,0,,"","",,,0 +10123,image/jpeg,0,0,,"","",,,0 +10124,image/jpeg,0,0,,"","",,,0 +10125,image/jpeg,0,0,,"","",,,0 +10126,image/jpeg,0,0,,"","",,,0 +10127,image/jpeg,0,0,,"","",,,0 +10128,image/jpeg,0,0,,"","",,,0 +10129,image/jpeg,0,0,,"","",,,0 +10130,image/jpeg,0,0,,"","",,,0 +10131,image/jpeg,1630956489887,0,0,"","",44.3482429722222,9.23413597222222,0 +10132,image/jpeg,1630954341041,0,0,"","",44.3482589722222,9.234151,0 +10133,image/jpeg,1630954336989,0,0,"","",44.3482509722222,9.234159,0 +10134,image/jpeg,1630953648921,0,0,"","",44.3479409722222,9.23501,0 +10135,image/jpeg,1630953036239,0,0,"","",44.3481069722222,9.22974297222222,0 +10136,image/jpeg,1630952898126,0,0,"","",44.347518,9.228623,0 +10137,image/jpeg,1630952747352,0,0,"","",44.3481969722222,9.22715297222222,0 +10138,image/jpeg,1630947869031,0,0,"","",44.341245,9.210255,0 +10139,image/jpeg,1630947865930,0,0,"","",44.341248,9.210255,0 +10140,image/jpeg,1630947853692,0,0,"","",44.341242,9.210278,0 +10141,image/jpeg,1630947844564,0,0,"","",44.3412319722222,9.21028697222222,0 +10142,image/jpeg,1630947297340,0,0,"","",44.338537,9.185752,0 +10143,image/jpeg,1630947267637,0,0,"","",44.3385469722222,9.185736,0 +10144,image/jpeg,1630947208111,0,0,"","",44.3386799722222,9.185914,0 +10145,image/jpeg,0,0,,"","",,,0 +10146,image/jpeg,0,0,,"","",,,0 +10147,image/jpeg,1630945207410,0,0,"","",44.3546589722222,9.15404297222222,0 +10148,image/jpeg,0,0,,"","",,,0 +10149,image/jpeg,1630943052469,0,90,"","",44.3644049722222,9.12414897222222,0 +10150,image/jpeg,1630943046418,0,0,"","",44.364403,9.124155,0 +10151,image/jpeg,1630943037374,0,0,"","",44.3644129722222,9.12414797222222,0 +10152,image/jpeg,0,0,,"","",,,0 +10153,image/jpeg,1630939361638,0,0,"","",44.3882509722222,8.99416397222222,0 +10154,image/jpeg,1630938554880,0,0,"","",44.3927589722222,8.96258897222222,0 +10155,image/jpeg,1630938519367,0,0,"","",44.392822,8.96259397222222,0 +10156,image/jpeg,0,0,,"","",,,0 +10157,image/jpeg,0,0,,"","",,,0 +10158,image/jpeg,0,0,,"","",,,0 +10159,image/jpeg,0,0,,"","",,,0 +10160,image/jpeg,1630936863106,0,0,"","",44.4160249722222,8.951764,0 +10161,image/jpeg,0,0,,"","",,,0 +10162,image/jpeg,1630935149473,0,0,"","",44.407716,8.93086197222222,0 +10163,image/jpeg,1630935126099,0,270,"","",44.407837,8.93082897222222,0 +10164,image/jpeg,0,0,,"","",,,0 +10165,image/jpeg,0,0,,"","",,,0 +10166,image/jpeg,0,0,,"","",,,0 +10167,image/jpeg,0,0,,"","",,,0 +10168,image/jpeg,0,0,,"","",,,0 +10169,image/jpeg,1630934743236,0,0,"","",44.407383,8.93386897222222,0 +10170,image/jpeg,0,0,,"","",,,0 +10171,image/jpeg,1630934686817,0,0,"","",44.407383,8.933839,0 +10172,image/jpeg,0,0,,"","",,,0 +10173,image/jpeg,0,0,,"","",,,0 +10174,image/jpeg,1630933555838,0,0,"","",44.416777,8.92196,0 +10175,image/jpeg,1630933583034,0,0,"","",44.4167759722222,8.92194697222222,0 +10176,image/jpeg,1630933578887,0,0,"","",44.4167649722222,8.92196397222222,0 +10177,image/jpeg,1630933555838,0,270,"","",44.416777,8.92196,0 +10178,image/jpeg,1630925059458,0,0,"","",44.9922189722222,9.00914597222222,0 +10179,image/jpeg,1630925030609,0,0,"","",44.992181,9.009147,0 +10180,image/jpeg,1630924995902,0,0,"","",44.9921399722222,9.00905,0 +10181,image/jpeg,1630924017806,0,0,"","",44.9971809722222,9.008338,0 +10182,image/jpeg,1630917668880,0,0,"","",45.052391,9.693521,0 +10183,image/jpeg,1630917650397,0,0,"","",45.0524369722222,9.693573,0 +10184,image/jpeg,0,0,,"","",,,0 +10185,image/jpeg,1630908947624,0,180,"","",44.452477,11.522617,0 +10186,image/jpeg,1630905747675,0,0,"","",44.2415409722222,11.999549,0 +10187,image/jpeg,1630905235863,0,0,"","",44.2244439722222,12.0544119722222,0 +10188,image/jpeg,1630820815848,0,90,"","",44.2505329722222,12.0828089722222,0 +10189,image/jpeg,0,0,,"","",,,0 +10190,image/jpeg,0,0,,"","",,,0 +10191,image/jpeg,0,0,,"","",,,0 +10192,image/jpeg,0,0,,"","",,,0 +10193,image/jpeg,0,0,,"","",,,0 +10194,image/jpeg,1630756488628,0,,"","",44.2505829722222,12.0828729722222,0 +10195,image/jpeg,0,0,,"","",,,0 +10196,image/jpeg,0,0,,"","",,,0 +10197,image/jpeg,0,0,,"","",,,0 +10198,image/jpeg,1630508743887,0,0,"","",43.746231,13.1734209722222,0 +10199,image/jpeg,1630495845675,0,0,"","",43.9637579722222,12.771967,0 +10200,image/jpeg,1630495484336,0,90,"","",43.963754,12.7719789722222,0 +10201,image/jpeg,1630495009623,0,0,"","",43.9637529722222,12.7719959722222,0 +10202,image/jpeg,1630423567381,0,90,"","",,,0 +10203,image/jpeg,0,0,,"","",,,0 +10204,image/jpeg,0,0,,"","",,,0 +10205,image/jpeg,0,0,,"","",,,0 +10206,image/jpeg,0,0,,"","",,,0 +10207,image/jpeg,0,0,,"","",,,0 +10208,image/jpeg,0,0,,"","",,,0 +10209,image/jpeg,0,0,,"","",,,0 +10210,image/jpeg,0,0,,"","",,,0 +10211,image/jpeg,0,0,,"","",,,0 +10212,image/jpeg,0,0,,"","",,,0 +10213,image/jpeg,0,0,,"","",,,0 +10214,image/jpeg,0,0,,"","",,,0 +10215,image/jpeg,1630255595539,0,0,"","",44.250584,12.0828269722222,0 +10216,image/jpeg,0,0,,"","",,,0 +10217,image/jpeg,1630227244679,0,0,"","",44.1677049722222,11.9667309722222,0 +10218,image/jpeg,0,0,,"","",,,0 +10219,image/jpeg,1630227246841,0,0,"","",44.167703,11.9667399722222,0 +10220,image/jpeg,1630227237226,0,0,"","",44.1676769722222,11.966692,0 +10221,image/jpeg,1630227219510,0,0,"","",44.167676,11.966689,0 +10222,image/jpeg,0,0,,"","",,,0 +10223,image/jpeg,0,0,,"","",,,0 +10224,image/jpeg,0,0,,"","",,,0 +10225,image/jpeg,1630005090535,0,90,"","",44.184618,12.0356529722222,0 +10226,image/jpeg,0,0,,"","",,,0 +10227,image/jpeg,0,0,,"","",,,0 +10228,image/jpeg,0,0,,"","",,,0 +10229,image/jpeg,0,0,,"","",,,0 +10230,image/jpeg,0,0,,"","",,,0 +10231,image/jpeg,1629461261230,0,90,"","",44.145372,12.136934,0 +10232,image/jpeg,1629452497200,0,0,"","",44.0714583333333,12.1208388888889,0 +10233,image/jpeg,1629446968540,0,0,"","",44.1147,12.0041138888889,0 +10234,image/jpeg,1629446260756,0,90,"","",44.1136309722222,11.9982469722222,0 +10235,image/jpeg,1629443970981,0,0,"","",44.1022194444444,11.9502277777778,0 +10236,image/jpeg,0,0,,"","",,,0 +10237,image/jpeg,1629303009170,0,90,"","",44.2505459722222,12.082862,0 +10238,image/jpeg,1629280956470,0,0,"","",44.242255,11.9951819722222,0 +10239,image/jpeg,1629280626323,0,0,"","",44.2422109722222,11.995207,0 +10240,image/jpeg,1629268189801,0,0,"","",44.242144,11.9952089722222,0 +10241,image/jpeg,1629137552291,0,0,"","",44.184044,12.0355109722222,0 +10242,image/jpeg,1629137510641,0,90,"","",44.1846659722222,12.0369939722222,0 +10243,image/jpeg,0,0,,"","",,,0 +10244,image/jpeg,1629043170154,0,0,"","",44.200006,12.0184569722222,0 +10245,image/jpeg,1629025788474,0,0,"","",44.2000609722222,12.0184069722222,0 +10246,image/jpeg,1629025783307,0,0,"","",44.2000529722222,12.018402,0 +10247,image/jpeg,1629025775480,0,90,"","",44.200043,12.0184149722222,0 +10248,image/jpeg,1629025772321,0,0,"","",44.200042,12.0184289722222,0 +10249,image/jpeg,1629007285421,0,0,"","",44.250433,12.0832219722222,0 +10250,image/jpeg,1628858074884,0,0,"","",44.2505409722222,12.082855,0 +10251,image/jpeg,1628858074884,0,180,"","",44.2505409722222,12.082855,0 +10252,image/png,0,0,,"","",,,0 +10253,image/png,0,0,,"","",,,0 +10254,image/png,0,0,,"","",,,0 +10255,image/png,0,0,,"","",,,0 +10256,image/png,0,0,,"","",,,0 +10257,image/png,0,0,,"","",,,0 +10258,image/png,0,0,,"","",,,0 +10259,image/png,0,0,,"","",,,0 +10260,image/png,0,0,,"","",,,0 +10261,image/png,0,0,,"","",,,0 +10262,image/png,0,0,,"","",,,0 +10263,image/png,0,0,,"","",,,0 +10264,image/png,0,0,,"","",,,0 +10265,image/png,0,0,,"","",,,0 +10266,image/png,0,0,,"","",,,0 +10267,image/png,0,0,,"","",,,0 +10268,image/png,0,0,,"","",,,0 +10269,image/png,0,0,,"","",,,0 +10270,image/png,0,0,,"","",,,0 +10271,image/png,0,0,,"","",,,0 +10272,image/png,0,0,,"","",,,0 +10273,image/png,0,0,,"","",,,0 +10274,image/png,0,0,,"","",,,0 +10275,image/png,0,0,,"","",,,0 +10276,image/png,0,0,,"","",,,0 +10277,image/png,0,0,,"","",,,0 +10278,image/png,0,0,,"","",,,0 +10279,image/png,0,0,,"","",,,0 +10280,image/png,0,0,,"","",,,0 +10281,image/png,0,0,,"","",,,0 +10282,image/png,0,0,,"","",,,0 +10283,image/png,0,0,,"","",,,0 +10284,image/png,0,0,,"","",,,0 +10285,image/png,0,0,,"","",,,0 +10286,image/png,0,0,,"","",,,0 +10287,image/png,0,0,,"","",,,0 +10288,image/jpeg,0,0,,"","",,,0 +10289,image/jpeg,0,0,,"","",,,0 +10290,image/jpeg,0,0,,"","",,,0 +10291,image/jpeg,0,0,,"","",,,0 +10292,image/jpeg,0,0,,"","",,,0 +10293,image/jpeg,0,0,,"","",,,0 +10294,image/jpeg,0,0,,"","",,,0 +10295,image/jpeg,0,0,,"","",,,0 +10296,image/jpeg,0,0,,"","",,,0 +10297,image/jpeg,0,0,,"","",,,0 +10298,image/jpeg,0,0,,"","",,,0 +10299,image/jpeg,0,0,,"","",,,0 +10300,image/jpeg,0,0,,"","",,,0 +10301,image/jpeg,0,0,,"","",,,0 +10302,image/jpeg,0,0,,"","",,,0 +10303,image/jpeg,0,0,,"","",,,0 +10304,image/jpeg,0,0,,"","",,,0 +10305,image/jpeg,0,0,,"","",,,0 +10306,image/jpeg,0,0,,"","",,,0 +10307,image/jpeg,0,0,,"","",,,0 +10308,image/jpeg,0,0,,"","",,,0 +10309,image/jpeg,0,0,,"","",,,0 +10310,image/jpeg,0,0,,"","",,,0 +10311,image/jpeg,0,0,,"","",,,0 +10312,image/jpeg,0,0,,"","",,,0 +10313,image/jpeg,0,0,,"","",,,0 +10314,image/jpeg,0,0,,"","",,,0 +10315,image/jpeg,0,0,,"","",,,0 +10316,image/jpeg,0,0,,"","",,,0 +10317,image/jpeg,0,0,,"","",,,0 +10318,image/jpeg,0,0,,"","",,,0 +10319,image/jpeg,0,0,,"","",,,0 +10320,image/jpeg,0,0,,"","",,,0 +10321,image/jpeg,0,0,,"","",,,0 +10322,image/jpeg,0,0,,"","",,,0 +10323,image/jpeg,0,0,,"","",,,0 +10324,image/jpeg,1628573613480,0,90,"","",44.250559,12.083004,0 +10325,image/jpeg,1628573548466,0,0,"","",44.2505889722222,12.0830629722222,0 +10326,image/jpeg,0,0,,"","",,,0 +10327,image/jpeg,0,0,,"","",,,0 +10328,image/jpeg,0,0,,"","",,,0 +10329,image/jpeg,1628403372637,0,0,"","",44.197693,12.1295219722222,0 +10330,image/jpeg,1628403361377,0,0,"","",44.197693,12.129549,0 +10331,image/jpeg,0,0,,"","",,,0 +10332,image/jpeg,1628320930061,0,0,"","",44.173112,11.9481509722222,0 +10333,image/jpeg,1628320648513,0,0,"","",44.1729569722222,11.948121,0 +10334,image/jpeg,1628270102951,0,0,"","",44.2506849722222,12.0831049722222,0 +10335,image/jpeg,1628146227755,0,0,"","",44.2446059722222,11.9949689722222,0 +10336,image/jpeg,1628146218055,0,0,"","",44.2446139722222,11.99493,0 +10337,image/jpeg,1628146204175,0,0,"","",44.2444509722222,11.994854,0 +10338,image/jpeg,1628107276219,0,90,"","",44.4923929722222,12.2749089722222,0 +10339,image/jpeg,1628107193930,0,90,"","",44.492404,12.274888,0 +10340,image/jpeg,0,0,,"","",,,0 +10341,image/jpeg,0,0,,"","",,,0 +10342,image/jpeg,0,0,,"","",,,0 +10343,image/jpeg,0,0,,"","",,,0 +10344,image/jpeg,0,0,,"","",,,0 +10345,image/jpeg,0,0,,"","",,,0 +10346,image/jpeg,0,0,,"","",,,0 +10347,image/jpeg,0,0,,"","",,,0 +10348,image/jpeg,1627753478948,0,90,"","",43.934766,12.4499879722222,0 +10349,image/jpeg,1627752341347,0,0,"","",43.934817,12.449866,0 +10350,image/jpeg,1627752339876,0,0,"","",43.934817,12.449866,0 +10351,image/jpeg,1627752233396,0,0,"","",43.9348409722222,12.449832,0 +10352,image/jpeg,1627752220594,0,0,"","",43.934837,12.449816,0 +10353,image/jpeg,0,0,,"","",,,0 +10354,image/jpeg,0,0,,"","",,,0 +10355,image/jpeg,1627318145132,0,0,"","",44.250584,12.0828439722222,0 +10356,image/jpeg,1627218447550,0,0,"","",44.250576,12.0828459722222,0 +10357,image/jpeg,1627218399385,0,90,"","",44.250568,12.082852,0 +10358,image/jpeg,1627218324560,0,0,"","",44.2505829722222,12.0828469722222,0 +10359,image/jpeg,1627120852071,0,90,"","",44.250582,12.0828469722222,0 +10360,image/jpeg,1627120809442,0,0,"","",,,0 +10361,image/jpeg,1626963746436,0,90,"","",44.243245,11.9965469722222,0 +10362,image/jpeg,1626802481681,0,0,"","",,,0 +10363,image/jpeg,0,0,,"","",,,0 +10364,image/jpeg,0,0,,"","",,,0 +10365,image/jpeg,0,0,,"","",,,0 +10366,image/jpeg,0,0,,"","",,,0 +10367,image/jpeg,0,0,,"","",,,0 +10368,image/jpeg,0,0,,"","",,,0 +10369,image/jpeg,0,0,,"","",,,0 +10370,image/jpeg,0,0,,"","",,,0 +10371,image/jpeg,0,0,,"","",,,0 +10372,image/jpeg,0,0,,"","",,,0 +10373,image/jpeg,0,0,,"","",,,0 +10374,image/jpeg,0,0,,"","",,,0 +10375,image/jpeg,0,0,,"","",,,0 +10376,image/jpeg,0,0,,"","",,,0 +10377,image/jpeg,0,0,,"","",,,0 +10378,image/jpeg,0,0,,"","",,,0 +10379,image/jpeg,0,0,,"","",,,0 +10380,image/jpeg,0,0,,"","",,,0 +10381,image/jpeg,0,0,,"","",,,0 +10382,image/jpeg,0,0,,"","",,,0 +10383,image/jpeg,0,0,,"","",,,0 +10384,image/jpeg,0,0,,"","",,,0 +10385,image/jpeg,0,0,,"","",,,0 +10386,image/jpeg,0,0,,"","",,,0 +10387,image/jpeg,0,0,,"","",,,0 +10388,image/jpeg,0,0,,"","",,,0 +10389,image/jpeg,0,0,,"","",,,0 +10390,image/jpeg,0,0,,"","",,,0 +10391,image/jpeg,1626733830028,0,0,"","",43.9410359722222,12.773917,0 +10392,image/jpeg,1626108084387,0,0,"","",44.250554,12.0828319722222,0 +10393,image/jpeg,1626012222358,0,0,"","",43.9848861111111,12.3835888888889,0 +10394,image/jpeg,1626012214681,0,0,"","",43.9849049722222,12.3835549722222,0 +10395,image/jpeg,1626012211305,0,0,"","",43.9849209722222,12.3835529722222,0 +10396,image/jpeg,1625942958014,0,90,"","",43.945776,12.836807,0 +10397,image/jpeg,1625942802855,0,90,"","",43.9457519722222,12.8368169722222,0 +10398,image/jpeg,1625942161801,0,0,"","",43.945734,12.836842,0 +10399,image/jpeg,1625761098240,0,90,"","",44.2506279722222,12.0828279722222,0 +10400,image/jpeg,1625593279764,0,0,"","",44.1322729722222,12.1232679722222,0 +10401,image/jpeg,1625593205629,0,0,"","",44.1326609722222,12.122977,0 +10402,image/jpeg,1625593138974,0,0,"","",44.1326583333333,12.1229972222222,0 +10403,image/jpeg,1625593117440,0,0,"","",44.1326222222222,12.1230416666667,0 +10404,image/jpeg,1625586468362,0,90,"","",44.2359319722222,11.980681,0 +10405,image/jpeg,0,0,,"","",,,0 +10406,image/jpeg,0,0,,"","",,,0 +10407,image/jpeg,0,0,,"","",,,0 +10408,image/jpeg,0,0,,"","",,,0 +10409,image/jpeg,0,0,,"","",,,0 +10410,image/jpeg,0,0,,"","",,,0 +10411,image/jpeg,0,0,,"","",,,0 +10412,image/jpeg,0,0,,"","",,,0 +10413,image/jpeg,0,0,,"","",,,0 +10414,image/jpeg,0,0,,"","",,,0 +10415,image/jpeg,0,0,,"","",,,0 +10416,image/jpeg,0,0,,"","",,,0 +10417,image/jpeg,0,0,,"","",,,0 +10418,image/jpeg,0,0,,"","",,,0 +10419,image/jpeg,0,0,,"","",,,0 +10420,image/jpeg,0,0,,"","",,,0 +10421,image/jpeg,0,0,,"","",,,0 +10422,image/jpeg,0,0,,"","",,,0 +10423,image/jpeg,0,0,,"","",,,0 +10424,image/jpeg,0,0,,"","",,,0 +10425,image/jpeg,0,0,,"","",,,0 +10426,image/jpeg,0,0,,"","",,,0 +10427,image/jpeg,0,0,,"","",,,0 +10428,image/jpeg,0,0,,"","",,,0 +10429,image/jpeg,0,0,,"","",,,0 +10430,image/jpeg,0,0,,"","",,,0 +10431,image/jpeg,0,0,,"","",,,0 +10432,image/jpeg,0,0,,"","",,,0 +10433,image/jpeg,0,0,,"","",,,0 +10434,image/jpeg,0,0,,"","",,,0 +10435,image/jpeg,0,0,,"","",,,0 +10436,image/jpeg,0,0,,"","",,,0 +10437,image/jpeg,1624692776612,0,0,"","",46.476877,11.7709589722222,0 +10438,image/jpeg,0,0,,"","",,,0 +10439,image/jpeg,0,0,,"","",,,0 +10440,image/jpeg,0,0,,"","",,,0 +10441,image/jpeg,0,0,,"","",,,0 +10442,image/jpeg,0,0,,"","",,,0 +10443,image/jpeg,0,0,,"","",,,0 +10444,image/jpeg,0,0,,"","",,,0 +10445,image/jpeg,0,0,,"","",,,0 +10446,image/jpeg,0,0,,"","",,,0 +10447,image/jpeg,0,0,,"","",,,0 +10448,image/jpeg,0,0,,"","",,,0 +10449,image/jpeg,0,0,,"","",,,0 +10450,image/jpeg,0,0,,"","",,,0 +10451,image/jpeg,0,0,,"","",,,0 +10452,image/jpeg,0,0,,"","",,,0 +10453,image/jpeg,0,0,,"","",,,0 +10454,image/jpeg,0,0,,"","",,,0 +10455,image/jpeg,1624354937315,0,0,"","",46.4272769722222,11.81671,0 +10456,image/jpeg,0,0,,"","",,,0 +10457,image/jpeg,0,0,,"","",,,0 +10458,image/jpeg,0,0,,"","",,,0 +10459,image/jpeg,0,0,,"","",,,0 +10460,image/jpeg,0,0,,"","",,,0 +10461,image/jpeg,0,0,,"","",,,0 +10462,image/jpeg,0,0,,"","",,,0 +10463,image/jpeg,1624265077853,0,90,"","",46.451484,11.636081,0 +10464,image/jpeg,0,0,,"","",,,0 +10465,image/jpeg,0,0,,"","",,,0 +10466,image/jpeg,0,0,,"","",,,0 +10467,image/jpeg,0,0,,"","",,,0 +10468,image/jpeg,0,0,,"","",,,0 +10469,image/jpeg,0,0,,"","",,,0 +10470,image/jpeg,0,0,,"","",,,0 +10471,image/jpeg,1624184018082,0,90,"","",46.426143,11.6412669722222,0 +10472,image/jpeg,0,0,,"","",,,0 +10473,image/jpeg,1624108621731,0,90,"","",,,0 +10474,image/jpeg,0,0,,"","",,,0 +10475,image/jpeg,0,0,,"","",,,0 +10476,image/jpeg,0,0,,"","",,,0 +10477,image/jpeg,0,0,,"","",,,0 +10478,image/jpeg,0,0,,"","",,,0 +10479,image/jpeg,1623952865692,0,90,"","",44.1439579722222,12.1363839722222,0 +10480,image/png,0,0,,"","",,,0 +10481,image/png,0,0,,"","",,,0 +10482,image/png,0,0,,"","",,,0 +10483,image/png,0,0,,"","",,,0 +10484,image/png,0,0,,"","",,,0 +10485,image/png,0,0,,"","",,,0 +10486,image/png,0,0,,"","",,,0 +10487,image/png,0,0,,"","",,,0 +10488,image/jpeg,1623694666783,0,90,"","",44.156781,12.431789,0 +10489,image/jpeg,1623694663218,0,90,"","",44.156781,12.431789,0 +10490,image/jpeg,1623694237114,0,90,"","",44.162792,12.4249829722222,0 +10491,image/jpeg,1623572653359,0,0,"","",43.9511839722222,12.8283039722222,0 +10492,image/jpeg,1623572716927,0,0,"","",43.95121,12.828348,0 +10493,image/jpeg,1623572653359,0,180,"","",43.9511839722222,12.8283039722222,0 +10494,image/jpeg,0,0,,"","",,,0 +10495,image/jpeg,0,0,,"","",,,0 +10496,image/jpeg,0,0,,"","",,,0 +10497,image/jpeg,0,0,,"","",,,0 +10498,image/jpeg,0,0,,"","",,,0 +10499,image/jpeg,0,0,,"","",,,0 +10500,image/jpeg,0,0,,"","",,,0 +10501,image/jpeg,0,0,,"","",,,0 +10502,image/jpeg,0,0,,"","",,,0 +10503,image/jpeg,0,0,,"","",,,0 +10504,image/jpeg,0,0,,"","",,,0 +10505,image/jpeg,0,0,,"","",,,0 +10506,image/jpeg,1622965530087,0,90,"","",44.0790769722222,12.1506959722222,0 +10507,image/jpeg,1622965294645,0,0,"","",44.080528,12.1481429722222,0 +10508,image/jpeg,1622964783734,0,0,"","",44.08065,12.1401305555556,0 +10509,image/jpeg,1622964756890,0,0,"","",44.0806277777778,12.1401444444444,0 +10510,image/jpeg,1622964304893,0,0,"","",44.0917388888889,12.1473722222222,0 +10511,image/jpeg,0,0,,"","",,,0 +10512,image/jpeg,0,0,,"","",,,0 +10513,image/jpeg,1622905453067,0,0,"","",44.2505269722222,12.0827489722222,0 +10514,image/jpeg,0,0,,"","",,,0 +10515,image/jpeg,0,0,,"","",,,0 +10516,image/jpeg,0,0,,"","",,,0 +10517,image/jpeg,0,0,,"","",,,0 +10518,image/jpeg,1622650236835,0,0,"","",44.054633,12.4795379722222,0 +10519,image/jpeg,0,0,,"","",,,0 +10520,image/jpeg,1622650214396,0,0,"","",44.0546509722222,12.4795139722222,0 +10521,image/jpeg,0,0,,"","",,,0 +10522,image/jpeg,1622650048802,0,0,"","",44.054689,12.4795259722222,0 +10523,image/jpeg,1622650032143,0,0,"","",44.05467,12.47952,0 +10524,image/jpeg,1622650015130,0,0,"","",44.0546459722222,12.47953,0 +10525,image/jpeg,0,0,,"","",,,0 +10526,image/jpeg,0,0,,"","",,,0 +10527,image/jpeg,0,0,,"","",,,0 +10528,image/jpeg,0,0,,"","",,,0 +10529,image/jpeg,0,0,,"","",,,0 +10530,image/jpeg,0,0,,"","",,,0 +10531,image/jpeg,0,0,,"","",,,0 +10532,image/jpeg,0,0,,"","",,,0 +10533,image/jpeg,0,0,,"","",,,0 +10534,image/jpeg,0,0,,"","",,,0 +10535,image/jpeg,0,0,,"","",,,0 +10536,image/jpeg,0,0,,"","",,,0 +10537,image/jpeg,0,0,,"","",,,0 +10538,image/jpeg,0,0,,"","",,,0 +10539,image/jpeg,0,0,,"","",,,0 +10540,image/jpeg,0,0,,"","",,,0 +10541,image/jpeg,0,0,,"","",,,0 +10542,image/jpeg,1622648365459,0,0,"","",44.0630529722222,12.562461,0 +10543,image/jpeg,1622648346017,0,0,"","",44.063017,12.562424,0 +10544,image/jpeg,0,0,,"","",,,0 +10545,image/jpeg,0,0,,"","",,,0 +10546,image/jpeg,0,0,,"","",,,0 +10547,image/jpeg,1622635281814,0,0,"","",43.9637919722222,12.7720179722222,0 +10548,image/jpeg,1622635281814,0,0,"","",43.9637919722222,12.7720179722222,0 +10549,image/jpeg,1622635281814,0,0,"","",43.9637919722222,12.7720179722222,0 +10550,image/jpeg,1622635279921,0,0,"","",43.963791,12.772016,0 +10551,image/jpeg,1622635252060,0,0,"","",43.963791,12.772057,0 +10552,image/jpeg,1622623486684,0,90,"","",44.0651769722222,12.55109,0 +10553,image/jpeg,1622623483092,0,90,"","",44.0651769722222,12.55109,0 +10554,image/jpeg,1622621259541,0,90,"","",44.0501399722222,12.459367,0 +10555,image/jpeg,1622621227543,0,0,"","",44.050012,12.4592729722222,0 +10556,image/jpeg,1622621198998,0,90,"","",44.0499829722222,12.4590619722222,0 +10557,image/jpeg,1622621158819,0,90,"","",44.049866,12.458329,0 +10558,image/jpeg,1622621133822,0,90,"","",44.0497599722222,12.4581949722222,0 +10559,image/jpeg,1622621090713,0,0,"","",44.0498449722222,12.4577469722222,0 +10560,image/jpeg,1622621070171,0,0,"","",44.049799,12.4578089722222,0 +10561,image/jpeg,1622621065110,0,90,"","",44.04981,12.4578,0 +10562,image/jpeg,0,0,,"","",,,0 +10563,image/jpeg,0,0,,"","",,,0 +10564,image/jpeg,0,0,,"","",,,0 +10565,image/jpeg,0,0,,"","",,,0 +10566,image/jpeg,0,0,,"","",,,0 +10567,image/jpeg,0,0,,"","",,,0 +10568,image/jpeg,0,0,,"","",,,0 +10569,image/jpeg,0,0,,"","",,,0 +10570,image/jpeg,0,0,,"","",,,0 +10571,image/jpeg,1622440185251,0,90,"","",44.2505829722222,12.0828699722222,0 +10572,image/jpeg,0,0,,"","",,,0 +10573,image/jpeg,0,0,,"","",,,0 +10574,image/jpeg,0,0,,"","",,,0 +10575,image/jpeg,0,0,,"","",,,0 +10576,image/jpeg,0,0,,"","",,,0 +10577,image/jpeg,0,0,,"","",,,0 +10578,image/jpeg,1622368512751,0,0,"","",44.2507099722222,12.0829369722222,0 +10579,image/jpeg,0,0,,"","",,,0 +10580,image/jpeg,0,0,,"","",,,0 +10581,image/jpeg,0,0,,"","",,,0 +10582,image/jpeg,1622359758583,0,0,"","",44.1494055555556,12.1337166666667,0 +10583,image/jpeg,1622359743190,0,0,"","",44.1494277777778,12.1336805555556,0 +10584,image/jpeg,1622359661595,0,0,"","",44.149393,12.133724,0 +10585,image/jpeg,1622359655945,0,0,"","",44.149383,12.1337089722222,0 +10586,image/jpeg,1622354211156,0,0,"","",44.250498,12.0826709722222,0 +10587,image/jpeg,1622311268267,0,0,"","",44.4905219722222,12.2816489722222,0 +10588,image/jpeg,1622311248671,0,90,"","",44.4905109722222,12.281639,0 +10589,image/jpeg,0,0,,"","",,,0 +10590,image/jpeg,1622028476203,0,180,"","",44.2157189722222,12.0320219722222,0 +10591,image/jpeg,1622028475547,0,180,"","",44.2166199722222,12.0307689722222,0 +10592,image/jpeg,1622028368914,0,90,"","",44.216822,12.0308869722222,0 +10593,image/jpeg,0,0,,"","",,,0 +10594,image/jpeg,0,0,,"","",,,0 +10595,image/jpeg,0,0,,"","",,,0 +10596,image/jpeg,0,0,,"","",,,0 +10597,image/jpeg,0,0,,"","",,,0 +10598,image/jpeg,0,0,,"","",,,0 +10599,image/jpeg,0,0,,"","",,,0 +10600,image/jpeg,0,0,,"","",,,0 +10601,image/jpeg,0,0,,"","",,,0 +10602,image/jpeg,0,0,,"","",,,0 +10603,image/jpeg,0,0,,"","",,,0 +10604,image/jpeg,0,0,,"","",,,0 +10605,image/jpeg,0,0,,"","",,,0 +10606,image/jpeg,0,0,,"","",,,0 +10607,image/jpeg,0,0,,"","",,,0 +10608,image/jpeg,0,0,,"","",,,0 +10609,image/jpeg,0,0,,"","",,,0 +10610,image/jpeg,0,0,,"","",,,0 +10611,image/jpeg,0,0,,"","",,,0 +10612,image/jpeg,0,0,,"","",,,0 +10613,image/jpeg,0,0,,"","",,,0 +10614,image/jpeg,0,0,,"","",,,0 +10615,image/jpeg,1621704080406,0,0,"","",44.2255609722222,11.9055959722222,0 +10616,image/jpeg,1621704072726,0,0,"","",44.2255579722222,11.905597,0 +10617,image/jpeg,1621699965474,0,0,"","",44.2402999722222,11.911789,0 +10618,image/jpeg,1621699937806,0,0,"","",44.2407049722222,11.912981,0 +10619,image/jpeg,1621699907168,0,0,"","",44.241359,11.9142159722222,0 +10620,image/jpeg,1621699653179,0,0,"","",44.243712,11.911927,0 +10621,image/jpeg,1621699649566,0,0,"","",44.243693,11.9119639722222,0 +10622,image/jpeg,0,0,,"","",,,0 +10623,image/jpeg,0,0,,"","",,,0 +10624,image/jpeg,0,0,,"","",,,0 +10625,image/jpeg,1621490462949,0,90,"","",,,0 +10626,image/jpeg,1621243174917,0,0,"","",43.776741,12.29166,0 +10627,image/jpeg,1621241848478,0,90,"","",43.7797139722222,12.2951209722222,0 +10628,image/jpeg,1621177548243,0,90,"","",44.250647,12.0827659722222,0 +10629,image/jpeg,1621177525311,0,90,"","",44.250742,12.0828159722222,0 +10630,image/jpeg,1621177269230,0,90,"","",44.2506119722222,12.082774,0 +10631,image/jpeg,1621177242381,0,90,"","",44.249726,12.0823049722222,0 +10632,image/jpeg,1621177163457,0,90,"","",44.2507519722222,12.0828159722222,0 +10633,image/jpeg,1621177148782,0,90,"","",44.2507299722222,12.0828009722222,0 +10634,image/jpeg,1621177026815,0,90,"","",44.250669,12.0827989722222,0 +10635,image/jpeg,1621109675325,0,90,"","",44.250579,12.0828199722222,0 +10636,image/jpeg,0,0,,"","",,,0 +10637,image/jpeg,1621084298699,0,90,"","",44.239181,11.8242069722222,0 +10638,image/jpeg,1621083277326,0,0,"","",44.2389149722222,11.82398,0 +10639,image/jpeg,1621083272326,0,0,"","",44.238948,11.824016,0 +10640,image/jpeg,1621076038273,0,90,"","",44.2390559722222,11.824341,0 +10641,image/jpeg,1621067638246,0,0,"","",44.249788,11.7108539722222,0 +10642,image/jpeg,1621067604281,0,0,"","",44.2497869722222,11.710845,0 +10643,image/jpeg,1621067498912,0,0,"","",44.2481879722222,11.713283,0 +10644,image/jpeg,1621067494840,0,0,"","",44.2481879722222,11.713283,0 +10645,image/jpeg,1621067475495,0,0,"","",44.2481879722222,11.713286,0 +10646,image/jpeg,1620854483147,0,0,"","",44.1136729722222,12.4224739722222,0 +10647,image/jpeg,1620728033339,0,90,"","",44.250798,12.082874,0 +10648,image/jpeg,1620727978292,0,90,"","",44.2508199722222,12.082845,0 +10649,image/jpeg,1620727942217,0,0,"","",44.2508619722222,12.0828589722222,0 +10650,image/jpeg,1620727939505,0,0,"","",44.2508649722222,12.0828609722222,0 +10651,image/jpeg,1620713026087,0,0,"","",44.250458,12.082952,0 +10652,image/jpeg,0,0,,"","",,,0 +10653,image/jpeg,0,0,,"","",,,0 +10654,image/jpeg,1620667624871,0,0,"","",44.0796833333333,12.1387166666667,0 +10655,image/jpeg,1620667608162,0,0,"","",44.0796805555556,12.1386972222222,0 +10656,image/jpeg,1620667308372,0,0,"","",44.0884599722222,12.1417699722222,0 +10657,image/jpeg,1620666842857,0,0,"","",44.092897,12.148911,0 +10658,image/jpeg,1620664493252,0,0,"","",44.1369805555556,12.1206166666667,0 +10659,image/jpeg,1620664058128,0,0,"","",44.1487583333333,12.1131694444444,0 +10660,image/jpeg,0,0,,"","",,,0 +10661,image/jpeg,0,0,,"","",,,0 +10662,image/jpeg,0,0,,"","",,,0 +10663,image/jpeg,0,0,,"","",,,0 +10664,image/jpeg,0,0,,"","",,,0 +10665,image/jpeg,0,0,,"","",,,0 +10666,image/jpeg,1620416731274,0,90,"","",45.96631,12.641792,0 +10667,image/jpeg,1620416728695,0,90,"","",45.96631,12.641792,0 +10668,image/jpeg,1620416688472,0,0,"","",45.9662069722222,12.6420929722222,0 +10669,image/jpeg,1620379746467,0,0,"","",45.9661749722222,12.642034,0 +10670,image/jpeg,1620073776638,0,90,"","",44.250633,12.082881,0 +10671,image/jpeg,1620073769821,0,90,"","",44.25063,12.082881,0 +10672,image/jpeg,1620073759434,0,90,"","",44.250613,12.082888,0 +10673,image/jpeg,0,0,,"","",,,0 +10674,image/jpeg,0,0,,"","",,,0 +10675,image/jpeg,0,0,,"","",,,0 +10676,image/jpeg,0,0,,"","",,,0 +10677,image/jpeg,0,0,,"","",,,0 +10678,image/jpeg,0,0,,"","",,,0 +10679,image/jpeg,0,0,,"","",,,0 +10680,image/jpeg,0,0,,"","",,,0 +10681,image/jpeg,0,0,,"","",,,0 +10682,image/jpeg,0,0,,"","",,,0 +10683,image/jpeg,0,0,,"","",,,0 +10684,image/jpeg,0,0,,"","",,,0 +10685,image/jpeg,0,0,,"","",,,0 +10686,image/jpeg,0,0,,"","",,,0 +10687,image/jpeg,0,0,,"","",,,0 +10688,image/jpeg,0,0,,"","",,,0 +10689,image/jpeg,0,0,,"","",,,0 +10690,image/jpeg,0,0,,"","",,,0 +10691,image/jpeg,0,0,,"","",,,0 +10692,image/jpeg,0,0,,"","",,,0 +10693,image/jpeg,0,0,,"","",,,0 +10694,image/jpeg,0,0,,"","",,,0 +10695,image/jpeg,0,0,,"","",,,0 +10696,image/jpeg,0,0,,"","",,,0 +10697,image/jpeg,1619867770269,0,0,"","",42.5515729722222,12.714088,0 +10698,image/jpeg,1619867768558,0,0,"","",42.551568,12.7140869722222,0 +10699,image/jpeg,1619867760897,0,90,"","",42.5515579722222,12.7140959722222,0 +10700,image/jpeg,1619867753943,0,90,"","",42.551555,12.7141029722222,0 +10701,image/jpeg,1619867731859,0,0,"","",42.551541,12.7141219722222,0 +10702,image/jpeg,1619867721542,0,0,"","",42.5515159722222,12.7141339722222,0 +10703,image/jpeg,1619863654465,0,0,"","",42.5528499722222,12.714102,0 +10704,image/jpeg,1619863420878,0,90,"","",42.552827,12.713779,0 +10705,image/jpeg,1619863419252,0,90,"","",42.552827,12.7137799722222,0 +10706,image/jpeg,1619863401894,0,90,"","",42.5528309722222,12.713755,0 +10707,image/jpeg,1619862076129,0,90,"","",42.5537309722222,12.713445,0 +10708,image/jpeg,1619861841823,0,90,"","",42.5533429722222,12.7139419722222,0 +10709,image/jpeg,1619861833644,0,90,"","",42.5533649722222,12.713969,0 +10710,image/jpeg,1619861811385,0,90,"","",42.5534949722222,12.7140679722222,0 +10711,image/jpeg,1619861791998,0,0,"","",42.553522,12.7140869722222,0 +10712,image/jpeg,1619861058625,0,90,"","",42.555075,12.715253,0 +10713,image/jpeg,1619860970878,0,90,"","",42.5549949722222,12.715408,0 +10714,image/jpeg,1619860727529,0,90,"","",42.553966,12.7141269722222,0 +10715,image/jpeg,1619860248923,0,0,"","",42.553783,12.7141199722222,0 +10716,image/jpeg,0,0,,"","",,,0 +10717,image/jpeg,1619860248923,0,90,"","",42.553783,12.7141199722222,0 +10718,image/jpeg,1619860242457,0,90,"","",42.553794,12.7141339722222,0 +10719,image/jpeg,1619860147364,0,90,"","",42.553879,12.7139699722222,0 +10720,image/jpeg,1619860115213,0,0,"","",42.5538129722222,12.7140529722222,0 +10721,image/jpeg,1619860109361,0,0,"","",42.553817,12.714055,0 +10722,image/jpeg,1619860105696,0,90,"","",42.5538079722222,12.714048,0 +10723,image/jpeg,1619860085096,0,90,"","",42.5537869722222,12.714073,0 +10724,image/jpeg,1619860045015,0,90,"","",42.5537679722222,12.7140339722222,0 +10725,image/jpeg,1619860042563,0,90,"","",42.5537649722222,12.71404,0 +10726,image/jpeg,1619860041319,0,90,"","",42.5537679722222,12.714048,0 +10727,image/jpeg,1619859602166,0,90,"","",42.553789,12.7140839722222,0 +10728,image/jpeg,1619859578619,0,90,"","",42.553809,12.714048,0 +10729,image/jpeg,1619859021615,0,0,"","",42.5537569722222,12.713998,0 +10730,image/jpeg,1619859209894,0,0,"","",42.5538079722222,12.7140489722222,0 +10731,image/jpeg,1619859209894,0,0,"","",42.5538079722222,12.7140489722222,0 +10732,image/jpeg,1619859209894,0,90,"","",42.5538079722222,12.7140489722222,0 +10733,image/jpeg,1619859021615,0,0,"","",42.5537569722222,12.713998,0 +10734,image/jpeg,1619857169457,0,90,"","",42.556525,12.719424,0 +10735,image/jpeg,1619857167167,0,90,"","",42.556541,12.7194219722222,0 +10736,image/jpeg,1619857166999,0,90,"","",42.5565349722222,12.7194269722222,0 +10737,image/jpeg,1619857165715,0,90,"","",42.5565539722222,12.719407,0 +10738,image/jpeg,0,0,,"","",,,0 +10739,image/jpeg,0,0,,"","",,,0 +10740,image/jpeg,0,0,,"","",,,0 +10741,image/jpeg,0,0,,"","",,,0 +10742,image/jpeg,0,0,,"","",,,0 +10743,image/jpeg,0,0,,"","",,,0 +10744,image/jpeg,0,0,,"","",,,0 +10745,image/jpeg,0,0,,"","",,,0 +10746,image/jpeg,0,0,,"","",,,0 +10747,image/jpeg,0,0,,"","",,,0 +10748,image/jpeg,0,0,,"","",,,0 +10749,image/jpeg,0,0,,"","",,,0 +10750,image/jpeg,0,0,,"","",,,0 +10751,image/jpeg,0,0,,"","",,,0 +10752,image/jpeg,0,0,,"","",,,0 +10753,image/jpeg,0,0,,"","",,,0 +10754,image/jpeg,0,0,,"","",,,0 +10755,image/jpeg,0,0,,"","",,,0 +10756,image/jpeg,1618736044074,0,0,"","",,,0 +10757,image/jpeg,1618736044074,0,,"","",,,0 +10758,image/jpeg,0,0,,"","",,,0 +10759,image/jpeg,0,0,,"","",,,0 +10760,image/jpeg,0,0,,"","",,,0 +10761,image/jpeg,0,0,,"","",,,0 +10762,image/jpeg,0,0,,"","",,,0 +10763,image/jpeg,0,0,,"","",,,0 +10764,image/jpeg,0,0,,"","",,,0 +10765,image/jpeg,1618736044074,0,0,"","",44.2323469722222,11.844891,0 +10766,image/jpeg,0,0,,"","",,,0 +10767,image/jpeg,0,0,,"","",,,0 +10768,image/jpeg,1618427939500,0,0,"","",44.2505359722222,12.083,0 +10769,image/jpeg,1618427977620,0,180,"","",44.2505359722222,12.083002,0 +10770,image/jpeg,1618427975978,0,180,"","",44.2505359722222,12.083002,0 +10771,image/jpeg,1618427974062,0,180,"","",44.2505359722222,12.0830009722222,0 +10772,image/jpeg,1618427942304,0,0,"","",44.2505359722222,12.083,0 +10773,image/jpeg,1618427939500,0,0,"","",44.2505359722222,12.083,0 +10774,image/jpeg,1618427936582,0,0,"","",44.2505359722222,12.083,0 +10775,image/jpeg,0,0,,"","",,,0 +10776,image/jpeg,1618342632470,0,,"","",,,0 +10777,image/jpeg,1618342632470,0,0,"","",44.2505519722222,12.0829869722222,0 +10778,image/jpeg,1618342632470,0,0,"","",44.2505519722222,12.0829869722222,0 +10779,image/jpeg,1618342630294,0,0,"","",44.2505529722222,12.082986,0 +10780,image/jpeg,1618342514067,0,180,"","",44.250559,12.082962,0 +10781,image/jpeg,1618342450924,0,180,"","",44.2505779722222,12.082969,0 +10782,image/jpeg,1618342412297,0,180,"","",44.250585,12.0829369722222,0 +10783,image/jpeg,1618342325329,0,180,"","",44.25057,12.0829389722222,0 +10784,image/jpeg,1618341826229,0,0,"","",44.2506139722222,12.0828799722222,0 +10785,image/jpeg,1618292934567,0,90,"","",44.250511,12.0828109722222,0 +10786,image/jpeg,0,0,,"","",,,0 +10787,image/jpeg,1617905698283,0,90,"","",44.2505359722222,12.082954,0 +10788,image/jpeg,1617809811228,0,90,"","",44.250489,12.0825359722222,0 +10789,image/jpeg,0,0,,"","",,,0 +10790,image/jpeg,0,0,,"","",,,0 +10791,image/jpeg,0,0,,"","",,,0 +10792,image/jpeg,0,0,,"","",,,0 +10793,image/jpeg,1617440093982,0,90,"","",44.249701,12.0817139722222,0 +10794,image/jpeg,1617440083935,0,0,"","",44.24974,12.0817209722222,0 +10795,image/jpeg,0,0,,"","",,,0 +10796,image/jpeg,1616954224655,0,0,"","",,,0 +10797,image/jpeg,0,0,,"","",,,0 +10798,image/jpeg,0,0,,"","",,,0 +10799,image/jpeg,0,0,,"","",,,0 +10800,image/jpeg,0,0,,"","",,,0 +10801,image/jpeg,0,0,,"","",,,0 +10802,image/jpeg,0,0,,"","",,,0 +10803,image/jpeg,0,0,,"","",,,0 +10804,image/jpeg,0,0,,"","",,,0 +10805,image/jpeg,1616923698353,0,0,"","",44.163885,12.152711,0 +10806,image/jpeg,1616919779612,0,0,"","",44.1493888888889,12.1337833333333,0 +10807,image/jpeg,1616919767876,0,0,"","",44.1493694444444,12.1337416666667,0 +10808,image/jpeg,0,0,,"","",,,0 +10809,image/jpeg,0,0,,"","",,,0 +10810,image/jpeg,1616174882485,0,90,"","",44.245184,12.0830149722222,0 +10811,image/jpeg,1616171067290,0,0,"","",44.2444449722222,12.082893,0 +10812,image/jpeg,1616146397337,0,0,"","",44.2505979722222,12.082691,0 +10813,image/jpeg,1616084503110,0,90,"","",44.2506139722222,12.082781,0 +10814,image/jpeg,1616084491402,0,90,"","",44.2506139722222,12.082781,0 +10815,image/jpeg,1616084460928,0,90,"","",44.250613,12.0827799722222,0 +10816,image/jpeg,1616084452838,0,0,"","",44.2506119722222,12.082779,0 +10817,image/jpeg,1616084410487,0,90,"","",44.250591,12.082765,0 +10818,image/jpeg,1616062674594,0,90,"","",44.25065,12.082819,0 +10819,image/jpeg,0,0,,"","",,,0 +10820,image/jpeg,0,0,,"","",,,0 +10821,image/jpeg,0,0,,"","",,,0 +10822,image/jpeg,0,0,,"","",,,0 +10823,image/jpeg,0,0,,"","",,,0 +10824,image/jpeg,0,0,,"","",,,0 +10825,image/jpeg,0,0,,"","",,,0 +10826,image/jpeg,0,0,,"","",,,0 +10827,image/jpeg,0,0,,"","",,,0 +10828,image/jpeg,0,0,,"","",,,0 +10829,image/jpeg,1615799835331,0,0,"","",44.2505629722222,12.082902,0 +10830,image/jpeg,0,0,,"","",,,0 +10831,image/jpeg,0,0,,"","",,,0 +10832,image/jpeg,0,0,,"","",,,0 +10833,image/jpeg,0,0,,"","",,,0 +10834,image/jpeg,0,0,,"","",,,0 +10835,image/jpeg,0,0,,"","",,,0 +10836,image/jpeg,0,0,,"","",,,0 +10837,image/jpeg,0,0,,"","",,,0 +10838,image/jpeg,0,0,,"","",,,0 +10839,image/jpeg,0,0,,"","",,,0 +10840,image/jpeg,0,0,,"","",,,0 +10841,image/jpeg,0,0,,"","",,,0 +10842,image/jpeg,1615105356002,0,90,"","",44.409978,11.9205149722222,0 +10843,image/jpeg,0,0,,"","",,,0 +10844,image/jpeg,1614946319493,0,0,"","",44.2504619722222,12.0827939722222,0 +10845,image/jpeg,1614595891289,0,90,"","",44.2506139722222,12.082843,0 +10846,image/jpeg,1614160732882,0,90,"","",44.250768,12.083057,0 +10847,image/jpeg,1613930766249,0,0,"","",,,0 +10848,image/jpeg,0,0,,"","",,,0 +10849,image/jpeg,0,0,,"","",,,0 +10850,image/jpeg,1613823685419,0,90,"","",44.2143129722222,11.918093,0 +10851,image/jpeg,1613823387835,0,0,"","",44.2144589722222,11.9179189722222,0 +10852,image/jpeg,1613823369281,0,0,"","",44.214458,11.9179019722222,0 +10853,image/jpeg,0,0,,"","",,,0 +10854,image/jpeg,0,0,,"","",,,0 +10855,image/jpeg,0,0,,"","",,,0 +10856,image/jpeg,0,0,,"","",,,0 +10857,image/jpeg,1613822075645,0,0,"","",44.2144389722222,11.9179169722222,0 +10858,image/jpeg,1613822065085,0,0,"","",44.214441,11.917929,0 +10859,image/jpeg,1613811821933,0,0,"","",44.2593611111111,11.7882666666667,0 +10860,image/jpeg,1613811815848,0,0,"","",44.2593689722222,11.788259,0 +10861,image/jpeg,1613811812873,0,0,"","",44.2593669722222,11.7882599722222,0 +10862,image/jpeg,1613741858719,0,0,"","",44.250311,12.082283,0 +10863,image/jpeg,1613741858719,0,90,"","",44.250311,12.082283,0 +10864,image/jpeg,0,0,,"","",,,0 +10865,image/jpeg,0,0,,"","",,,0 +10866,image/jpeg,0,0,,"","",,,0 +10867,image/jpeg,1613243249472,0,0,"","",43.836154,11.961061,0 +10868,image/jpeg,1613243245774,0,90,"","",43.836134,11.9610489722222,0 +10869,image/jpeg,1613243139672,0,0,"","",43.836081,11.961,0 +10870,image/jpeg,1613240885036,0,90,"","",43.8363299722222,11.96081,0 +10871,image/jpeg,1613240866316,0,0,"","",43.836367,11.9609079722222,0 +10872,image/jpeg,1613239834043,0,0,"","",43.836226,11.9609609722222,0 +10873,image/jpeg,0,0,,"","",,,0 +10874,image/jpeg,0,0,,"","",,,0 +10875,image/jpeg,0,0,,"","",,,0 +10876,image/jpeg,0,0,,"","",,,0 +10877,image/jpeg,0,0,,"","",,,0 +10878,image/jpeg,1613198848746,0,0,"","",44.250635,12.0828629722222,0 +10879,image/jpeg,1613198818066,0,0,"","",44.2504879722222,12.083111,0 +10880,image/jpeg,1613198794281,0,0,"","",44.2504916666667,12.083025,0 +10881,image/jpeg,1613133984544,0,0,"","",44.2420699722222,11.995416,0 +10882,image/jpeg,1612874525542,0,0,"","",44.2457929722222,12.0802189722222,0 +10883,image/jpeg,1612692699015,0,90,"","",44.236108,11.980971,0 +10884,image/jpeg,0,0,,"","",,,0 +10885,image/jpeg,1612507134529,0,0,"","",44.250568,12.082815,0 +10886,image/jpeg,1612450446205,0,90,"","",44.2505439722222,12.0828729722222,0 +10887,image/jpeg,1612450438419,0,90,"","",44.2483689722222,12.0834329722222,0 +10888,image/jpeg,1612438185415,0,0,"","",44.136592,12.215113,0 +10889,image/jpeg,1612438178641,0,0,"","",44.136457,12.215116,0 +10890,image/jpeg,1612436552022,0,0,"","",44.1390609722222,12.2297019722222,0 +10891,image/jpeg,1612431387520,0,0,"","",44.435101,11.59721,0 +10892,image/jpeg,1612431184980,0,0,"","",44.435073,11.597265,0 +10893,image/jpeg,1612430832619,0,0,"","",44.435119,11.597257,0 +10894,image/jpeg,0,0,,"","",,,0 +10895,image/jpeg,0,0,,"","",,,0 +10896,image/jpeg,0,0,,"","",,,0 +10897,image/jpeg,0,0,,"","",,,0 +10898,image/jpeg,0,0,,"","",,,0 +10899,image/jpeg,0,0,,"","",,,0 +10900,image/jpeg,0,0,,"","",,,0 +10901,image/jpeg,1610805441197,0,0,"","",44.250467,12.083622,0 +10902,image/jpeg,0,0,,"","",,,0 +10903,image/jpeg,0,0,,"","",,,0 +10904,image/jpeg,1609697223495,0,0,"","",,,0 +10905,image/jpeg,1609697220270,0,0,"","",,,0 +10906,image/jpeg,0,0,,"","",,,0 +10907,image/jpeg,0,0,,"","",,,0 +10908,image/jpeg,1608482561588,0,0,"","",44.250816,12.083346,0 +10909,image/jpeg,1608458198740,0,90,"","",46.069543,12.5116219722222,0 +10910,image/jpeg,0,0,,"","",,,0 +10911,image/jpeg,0,0,,"","",,,0 +10912,image/jpeg,0,0,,"","",,,0 +10913,image/jpeg,0,0,,"","",,,0 +10914,image/jpeg,1608385248860,0,0,"","",45.966321,12.641759,0 +10915,image/jpeg,1608312581474,0,0,"","",44.250605,12.082933,0 +10916,image/jpeg,1608312355964,0,0,"","",44.2505469722222,12.0829579722222,0 +10917,image/jpeg,1608311609801,0,90,"","",44.250387,12.082698,0 +10918,image/jpeg,1608101825691,0,90,"","",44.2505629722222,12.082843,0 +10919,image/jpeg,1608101778747,0,90,"","",44.250562,12.0828349722222,0 +10920,image/jpeg,0,0,,"","",,,0 +10921,image/jpeg,0,0,,"","",,,0 +10922,image/jpeg,0,0,,"","",,,0 +10923,image/jpeg,0,0,,"","",,,0 +10924,image/jpeg,0,0,,"","",,,0 +10925,image/jpeg,0,0,,"","",,,0 +10926,image/jpeg,0,0,,"","",,,0 +10927,image/jpeg,0,0,,"","",,,0 +10928,image/jpeg,0,0,,"","",,,0 +10929,image/jpeg,0,0,,"","",,,0 +10930,image/jpeg,0,0,,"","",,,0 +10931,image/jpeg,0,0,,"","",,,0 +10932,image/jpeg,0,0,,"","",,,0 +10933,image/jpeg,0,0,,"","",,,0 +10934,image/jpeg,0,0,,"","",,,0 +10935,image/jpeg,0,0,,"","",,,0 +10936,image/jpeg,0,0,,"","",,,0 +10937,image/jpeg,0,0,,"","",,,0 +10938,image/jpeg,0,0,,"","",,,0 +10939,image/jpeg,0,0,,"","",,,0 +10940,image/jpeg,0,0,,"","",,,0 +10941,image/jpeg,1607342524414,0,0,"","",44.0517669722222,11.5043299722222,0 +10942,image/jpeg,1607342510914,0,0,"","",44.0517639722222,11.5043369722222,0 +10943,image/jpeg,1607333629587,0,0,"","",44.071148,11.528142,0 +10944,image/jpeg,1607160933732,0,0,"","",44.2504309722222,12.0835679722222,0 +10945,image/jpeg,0,0,,"","",,,0 +10946,image/jpeg,0,0,,"","",,,0 +10947,image/jpeg,0,0,,"","",,,0 +10948,image/jpeg,0,0,,"","",,,0 +10949,image/jpeg,0,0,,"","",,,0 +10950,image/jpeg,0,0,,"","",,,0 +10951,image/jpeg,0,0,,"","",,,0 +10952,image/jpeg,0,0,,"","",,,0 +10953,image/jpeg,0,0,,"","",,,0 +10954,image/jpeg,0,0,,"","",,,0 +10955,image/jpeg,0,0,,"","",,,0 +10956,image/jpeg,0,0,,"","",,,0 +10957,image/jpeg,1606590414526,0,0,"","",44.2505769722222,12.082874,0 +10958,image/jpeg,0,0,,"","",,,0 +10959,image/jpeg,1606552628612,0,90,"","",44.250666,12.0825899722222,0 +10960,image/jpeg,1606552614931,0,0,"","",44.250675,12.0823638888889,0 +10961,image/jpeg,1606477390666,0,0,"","",44.250599,12.0829299722222,0 +10962,image/jpeg,1606477386850,0,0,"","",44.2508029722222,12.0835989722222,0 +10963,image/jpeg,1606045164230,0,0,"","",44.2476839722222,12.081647,0 +10964,image/jpeg,1605984069701,0,0,"","",44.2505829722222,12.082888,0 +10965,image/jpeg,1605962327849,0,90,"","",44.23584,11.980831,0 +10966,image/jpeg,1605962324190,0,90,"","",,,0 +10967,image/jpeg,0,0,,"","",,,0 +10968,image/jpeg,1605682051343,0,90,"","",44.250722,12.082888,0 +10969,image/jpeg,1605682047103,0,90,"","",44.250723,12.0828889722222,0 +10970,image/jpeg,1605682044648,0,90,"","",44.250722,12.0828889722222,0 +10971,image/jpeg,1605682042272,0,90,"","",44.250723,12.0828889722222,0 +10972,image/jpeg,1605682039726,0,90,"","",44.250723,12.08289,0 +10973,image/jpeg,1605682035289,0,90,"","",44.2507189722222,12.082886,0 +10974,image/jpeg,1605682031800,0,90,"","",44.250722,12.0828819722222,0 +10975,image/jpeg,1605682027312,0,90,"","",44.250706,12.0828799722222,0 +10976,image/jpeg,1605682025167,0,90,"","",44.2507129722222,12.082879,0 +10977,image/jpeg,1605682022486,0,90,"","",44.250728,12.0828889722222,0 +10978,image/jpeg,1605682018308,0,90,"","",44.250711,12.0828989722222,0 +10979,image/jpeg,1605681998817,0,0,"","",44.250579,12.082888,0 +10980,image/jpeg,0,0,,"","",,,0 +10981,image/jpeg,0,0,,"","",,,0 +10982,image/jpeg,0,0,,"","",,,0 +10983,image/jpeg,1604234781593,0,90,"","",44.235747,11.9809,0 +10984,image/jpeg,1604149703781,0,90,"","",43.9510409722222,12.821244,0 +10985,image/jpeg,1604149702289,0,90,"","",43.9510459722222,12.821274,0 +10986,image/jpeg,1604147334285,0,0,"","",43.951039,12.8213259722222,0 +10987,image/jpeg,0,0,,"","",,,0 +10988,image/jpeg,0,0,,"","",,,0 +10989,image/jpeg,0,0,,"","",,,0 +10990,image/jpeg,0,0,,"","",,,0 +10991,image/jpeg,0,0,,"","",,,0 +10992,image/jpeg,0,0,,"","",,,0 +10993,image/jpeg,0,0,,"","",,,0 +10994,image/jpeg,0,0,,"","",,,0 +10995,image/jpeg,0,0,,"","",,,0 +10996,image/jpeg,1603016373128,0,90,"","",44.0585659722222,12.364195,0 +10997,image/jpeg,1602969924564,0,90,"","",44.2391399722222,11.824351,0 +10998,image/jpeg,1602623673861,0,0,"","",,,0 +10999,image/jpeg,1602623645253,0,0,"","",,,0 +11000,image/jpeg,0,0,,"","",,,0 +11001,image/jpeg,0,0,,"","",,,0 +11002,image/jpeg,0,0,,"","",,,0 +11003,image/jpeg,0,0,,"","",,,0 +11004,image/jpeg,0,0,,"","",,,0 +11005,image/jpeg,0,0,,"","",,,0 +11006,image/jpeg,0,0,,"","",,,0 +11007,image/jpeg,0,0,,"","",,,0 +11008,image/jpeg,1601229133401,0,90,"","",44.879728,11.569129,0 +11009,image/jpeg,1601229129858,0,90,"","",44.879728,11.569129,0 +11010,image/jpeg,1601220838941,0,0,"","",45.966324,12.6417959722222,0 +11011,image/jpeg,0,0,,"","",,,0 +11012,image/jpeg,0,0,,"","",,,0 +11013,image/jpeg,0,0,,"","",,,0 +11014,image/jpeg,0,0,,"","",,,0 +11015,image/jpeg,0,0,,"","",,,0 +11016,image/jpeg,0,0,,"","",,,0 +11017,image/jpeg,0,0,,"","",,,0 +11018,image/jpeg,0,0,,"","",,,0 +11019,image/jpeg,0,0,,"","",,,0 +11020,image/jpeg,0,0,,"","",,,0 +11021,image/jpeg,0,0,,"","",,,0 +11022,image/jpeg,0,0,,"","",,,0 +11023,image/jpeg,0,0,,"","",,,0 +11024,image/jpeg,0,0,,"","",,,0 +11025,image/jpeg,0,0,,"","",,,0 +11026,image/jpeg,0,0,,"","",,,0 +11027,image/jpeg,0,0,,"","",,,0 +11028,image/jpeg,0,0,,"","",,,0 +11029,image/jpeg,0,0,,"","",,,0 +11030,image/jpeg,0,0,,"","",,,0 +11031,image/jpeg,0,0,,"","",,,0 +11032,image/jpeg,0,0,,"","",,,0 +11033,image/jpeg,0,0,,"","",,,0 +11034,image/jpeg,0,0,,"","",,,0 +11035,image/jpeg,0,0,,"","",,,0 +11036,image/jpeg,0,0,,"","",,,0 +11037,image/jpeg,0,0,,"","",,,0 +11038,image/jpeg,1600003228418,0,90,"","",42.3783829722222,12.439128,0 +11039,image/jpeg,1599999484962,0,0,"","",,,0 +11040,image/jpeg,1599982584690,0,90,"","",40.689385,14.4621899722222,0 +11041,image/jpeg,1599982567639,0,0,"","",40.689418,14.4622989722222,0 +11042,image/jpeg,0,0,,"","",,,0 +11043,image/jpeg,0,0,,"","",,,0 +11044,image/jpeg,0,0,,"","",,,0 +11045,image/jpeg,0,0,,"","",,,0 +11046,image/jpeg,0,0,,"","",,,0 +11047,image/jpeg,0,0,,"","",,,0 +11048,image/jpeg,0,0,,"","",,,0 +11049,image/jpeg,0,0,,"","",,,0 +11050,image/jpeg,0,0,,"","",,,0 +11051,image/jpeg,1599928590473,0,90,"","",,,0 +11052,image/jpeg,1599928586683,0,90,"","",,,0 +11053,image/jpeg,1599921165991,0,90,"","",40.828951,14.2476219722222,0 +11054,image/jpeg,1599918658905,0,0,"","",40.835776,14.248756,0 +11055,image/jpeg,1599910621207,0,0,"","",,,0 +11056,image/jpeg,1599908990501,0,0,"","",,,0 +11057,image/jpeg,1599908319392,0,90,"","",40.8510059722222,14.25665,0 +11058,image/jpeg,1599907857216,0,90,"","",40.851005,14.2566389722222,0 +11059,image/jpeg,1599907093191,0,90,"","",,,0 +11060,image/jpeg,1599903904071,0,90,"","",40.8510619722222,14.2566389722222,0 +11061,image/jpeg,1599901471200,0,0,"","",40.8524861111111,14.2594527777778,0 +11062,image/jpeg,1599901365572,0,90,"","",40.8525149722222,14.2594829722222,0 +11063,image/jpeg,1599901107852,0,270,"","",40.8522333333333,14.2591555555556,0 +11064,image/jpeg,1599901093526,0,270,"","",40.8522305555556,14.2591472222222,0 +11065,image/jpeg,1599896789111,0,0,"","",40.761172,14.461512,0 +11066,image/jpeg,0,0,,"","",,,0 +11067,image/jpeg,1599844271373,0,0,"","",40.785387,14.0835799722222,0 +11068,image/jpeg,1599844264466,0,0,"","",40.785395,14.083564,0 +11069,image/jpeg,0,0,,"","",,,0 +11070,image/jpeg,0,0,,"","",,,0 +11071,image/jpeg,0,0,,"","",,,0 +11072,image/jpeg,0,0,,"","",,,0 +11073,image/jpeg,0,0,,"","",,,0 +11074,image/jpeg,0,0,,"","",,,0 +11075,image/jpeg,0,0,,"","",,,0 +11076,image/jpeg,0,0,,"","",,,0 +11077,image/jpeg,0,0,,"","",,,0 +11078,image/jpeg,0,0,,"","",,,0 +11079,image/jpeg,0,0,,"","",,,0 +11080,image/jpeg,0,0,,"","",,,0 +11081,image/jpeg,1599824143699,0,0,"","",41.0979689722222,14.328519,0 +11082,image/jpeg,1599824146982,0,0,"","",41.0979719722222,14.3285319722222,0 +11083,image/jpeg,1599823294603,0,0,"","",41.0946039722222,14.3308269722222,0 +11084,image/jpeg,1599823281793,0,90,"","",41.094608,14.3308339722222,0 +11085,image/jpeg,1599823272803,0,0,"","",41.094607,14.330835,0 +11086,image/jpeg,1599821709850,0,90,"","",41.0971979722222,14.331191,0 +11087,image/jpeg,1599821024974,0,90,"","",41.097371,14.3318899722222,0 +11088,image/jpeg,1599821005309,0,90,"","",41.097413,14.331875,0 +11089,image/jpeg,1599820703082,0,90,"","",41.09769,14.3309809722222,0 +11090,image/jpeg,1599820653119,0,90,"","",41.097678,14.330754,0 +11091,image/jpeg,0,0,0,"","",,,0 +11092,image/jpeg,1599818600375,0,0,"","",41.097996,14.329344,0 +11093,image/jpeg,1599818415436,0,0,"","",41.0971499722222,14.3291479722222,0 +11094,image/jpeg,0,0,0,"","",,,0 +11095,image/jpeg,0,0,0,"","",,,0 +11096,image/jpeg,1599817959191,0,0,"","",41.0936409722222,14.328841,0 +11097,image/jpeg,1599817940772,0,90,"","",41.09362,14.328841,0 +11098,image/jpeg,0,0,0,"","",,,0 +11099,image/jpeg,1599817908855,0,90,"","",41.0936,14.328832,0 +11100,image/jpeg,1599817850478,0,0,"","",41.0932919722222,14.328818,0 +11101,image/jpeg,1599817850613,0,0,"","",41.093293,14.328817,0 +11102,image/jpeg,1599817847183,0,0,"","",41.0932949722222,14.328808,0 +11103,image/jpeg,1599817843545,0,0,"","",41.093299,14.32881,0 +11104,image/jpeg,1599817546650,0,90,"","",41.091203,14.328666,0 +11105,image/jpeg,1599817162614,0,90,"","",41.0905849722222,14.32882,0 +11106,image/jpeg,1599817131112,0,0,"","",41.090581,14.328789,0 +11107,image/jpeg,1599817112241,0,90,"","",41.090578,14.3287929722222,0 +11108,image/jpeg,1599816296127,0,0,"","",41.0860699722222,14.3282279722222,0 +11109,image/jpeg,1599816296127,0,0,"","",41.0860699722222,14.3282279722222,0 +11110,image/jpeg,1599816243515,0,0,"","",41.0858819722222,14.3282659722222,0 +11111,image/jpeg,1599816235665,0,0,"","",41.0858819722222,14.328267,0 +11112,image/jpeg,1599815520215,0,0,"","",41.081322,14.327768,0 +11113,image/jpeg,1599815503851,0,0,"","",41.0812859722222,14.3278379722222,0 +11114,image/jpeg,1599752431175,0,0,"","",40.6279055555556,14.4872555555556,0 +11115,image/jpeg,1599747830547,0,0,"","",40.6503638888889,14.4106527777778,0 +11116,image/jpeg,1599747822098,0,0,"","",40.6503879722222,14.410626,0 +11117,image/jpeg,1599747802355,0,0,"","",40.6504329722222,14.4106539722222,0 +11118,image/jpeg,1599747766563,0,90,"","",40.650514,14.4106079722222,0 +11119,image/jpeg,1599747757466,0,0,"","",40.650536,14.4106529722222,0 +11120,image/jpeg,1599744611662,0,90,"","",40.747782,14.500676,0 +11121,image/jpeg,0,0,,"","",,,0 +11122,image/jpeg,0,0,,"","",,,0 +11123,image/jpeg,1599735561801,0,0,"","",40.7510833333333,14.4953444444444,0 +11124,image/jpeg,1599734672342,0,90,"","",40.7505129722222,14.489217,0 +11125,image/jpeg,1599732938969,0,90,"","",40.750188,14.484598,0 +11126,image/jpeg,1599731545814,0,0,"","",40.749651,14.4843939722222,0 +11127,image/jpeg,1599731111955,0,0,"","",40.749051,14.485148,0 +11128,image/jpeg,1599731086695,0,0,"","",40.74906,14.4851779722222,0 +11129,image/jpeg,1599730956245,0,90,"","",40.74931,14.486081,0 +11130,image/jpeg,1599729764576,0,90,"","",40.74987,14.4880499722222,0 +11131,image/jpeg,1599729218215,0,0,"","",40.749737,14.489864,0 +11132,image/jpeg,1599729155775,0,0,"","",40.7496689722222,14.4898779722222,0 +11133,image/jpeg,1599727025965,0,0,"","",40.748927,14.489271,0 +11134,image/jpeg,1599727010347,0,90,"","",40.748882,14.4892819722222,0 +11135,image/jpeg,1599726007795,0,0,"","",40.7481333333333,14.489,0 +11136,image/jpeg,1599726002214,0,0,"","",40.748206,14.489003,0 +11137,image/jpeg,0,0,,"","",,,0 +11138,image/jpeg,1599656729253,0,0,"","",40.6323277777778,14.6030583333333,0 +11139,image/jpeg,0,0,,"","",,,0 +11140,image/jpeg,0,0,,"","",,,0 +11141,image/jpeg,0,0,,"","",,,0 +11142,image/jpeg,0,0,,"","",,,0 +11143,image/jpeg,0,0,,"","",,,0 +11144,image/jpeg,0,0,,"","",,,0 +11145,image/jpeg,0,0,,"","",,,0 +11146,image/jpeg,0,0,,"","",,,0 +11147,image/jpeg,1599650180051,0,0,"","",40.636544,14.602102,0 +11148,image/jpeg,1599649914858,0,90,"","",40.636335,14.601943,0 +11149,image/jpeg,1599647720215,0,90,"","",40.6347019722222,14.6028149722222,0 +11150,image/jpeg,1599647700283,0,90,"","",40.634816,14.603092,0 +11151,image/jpeg,0,0,0,"","",,,0 +11152,image/jpeg,1599639849672,0,0,"","",40.6484129722222,14.62706,0 +11153,image/jpeg,1599639849672,0,90,"","",40.6484129722222,14.62706,0 +11154,image/jpeg,1599633903054,0,0,"","",40.689613,14.461887,0 +11155,image/jpeg,1599633862463,0,0,"","",40.689478,14.462123,0 +11156,image/jpeg,1599633851876,0,0,"","",40.689492,14.462115,0 +11157,image/jpeg,1599633805207,0,0,"","",40.689537,14.462073,0 +11158,image/jpeg,1599632133728,0,0,"","",40.6893069722222,14.4624769722222,0 +11159,image/jpeg,1599631081850,0,0,"","",40.6892319722222,14.462583,0 +11160,image/jpeg,1599631074966,0,0,"","",40.6892709722222,14.462612,0 +11161,image/jpeg,0,0,,"","",,,0 +11162,image/jpeg,0,0,,"","",,,0 +11163,image/jpeg,0,0,,"","",,,0 +11164,image/jpeg,0,0,,"","",,,0 +11165,image/jpeg,1599573287080,0,0,"","",40.423675,15.006391,0 +11166,image/jpeg,1599573271513,0,0,"","",40.423799,15.0063689722222,0 +11167,image/jpeg,1599573265667,0,0,"","",40.4238209722222,15.0063569722222,0 +11168,image/jpeg,1599565579588,0,90,"","",40.4199389722222,15.0049559722222,0 +11169,image/jpeg,1599565414083,0,0,"","",40.420082,15.0057899722222,0 +11170,image/jpeg,1599564949391,0,90,"","",40.419656,15.006617,0 +11171,image/jpeg,1599564503204,0,0,"","",40.4193029722222,15.0067839722222,0 +11172,image/jpeg,1599555978499,0,0,"","",,,0 +11173,image/jpeg,1599555977114,0,0,"","",,,0 +11174,image/jpeg,1599555971985,0,90,"","",,,0 +11175,image/jpeg,1599555962849,0,90,"","",,,0 +11176,image/jpeg,1599555962780,0,90,"","",,,0 +11177,image/jpeg,1599555847215,0,0,"","",,,0 +11178,image/jpeg,1599555828785,0,0,"","",,,0 +11179,image/jpeg,1599555443675,0,90,"","",,,0 +11180,image/jpeg,1599555432816,0,90,"","",,,0 +11181,image/jpeg,1599555388519,0,90,"","",,,0 +11182,image/jpeg,1599553891200,0,90,"","",,,0 +11183,image/jpeg,1599553876863,0,90,"","",,,0 +11184,image/jpeg,1599523226576,0,0,"","",,,0 +11185,image/jpeg,1599523216216,0,0,"","",,,0 +11186,image/jpeg,1599520447531,0,0,"","",40.1827889722222,15.0629439722222,0 +11187,image/jpeg,1599520446300,0,0,"","",40.1827699722222,15.0629449722222,0 +11188,image/jpeg,1599516489777,0,90,"","",40.182816,15.062905,0 +11189,image/jpeg,1599516467028,0,90,"","",40.182817,15.062905,0 +11190,image/jpeg,1599516403570,0,0,"","",40.182678,15.0629089722222,0 +11191,image/jpeg,1599516399635,0,0,"","",40.182698,15.062898,0 +11192,image/jpeg,1599516369837,0,90,"","",40.182734,15.062874,0 +11193,image/jpeg,1599513155068,0,90,"","",,,0 +11194,image/jpeg,1599510377242,0,0,"","",40.1827309722222,15.0629249722222,0 +11195,image/jpeg,1599510372576,0,0,"","",40.182729,15.0629419722222,0 +11196,image/jpeg,1599510367566,0,0,"","",40.182755,15.062962,0 +11197,image/jpeg,1599510357362,0,0,"","",40.182796,15.0629889722222,0 +11198,image/jpeg,1599487036132,0,90,"","",40.0059559722222,15.3471499722222,0 +11199,image/jpeg,1599486962826,0,90,"","",40.0059169722222,15.347127,0 +11200,image/jpeg,1599486448877,0,0,"","",40.0058119722222,15.345278,0 +11201,image/jpeg,1599486420668,0,0,"","",40.005791,15.3452599722222,0 +11202,image/jpeg,1599486407207,0,0,"","",40.0057329722222,15.3452929722222,0 +11203,image/jpeg,1599469016354,0,0,"","",40.034379,15.283668,0 +11204,image/jpeg,1599468977999,0,0,"","",40.034379,15.283668,0 +11205,image/jpeg,1599468975880,0,0,"","",40.034379,15.283668,0 +11206,image/jpeg,1599468582421,0,0,"","",40.0310279722222,15.2769949722222,0 +11207,image/jpeg,1599433967613,0,0,"","",40.182952,15.063003,0 +11208,image/jpeg,0,0,,"","",,,0 +11209,image/jpeg,0,0,,"","",,,0 +11210,image/jpeg,0,0,,"","",,,0 +11211,image/jpeg,0,0,,"","",,,0 +11212,image/jpeg,0,0,,"","",,,0 +11213,image/jpeg,0,0,,"","",,,0 +11214,image/jpeg,0,0,,"","",,,0 +11215,image/jpeg,0,0,,"","",,,0 +11216,image/jpeg,0,0,,"","",,,0 +11217,image/jpeg,0,0,,"","",,,0 +11218,image/jpeg,0,0,,"","",,,0 +11219,image/jpeg,0,0,,"","",,,0 +11220,image/jpeg,0,0,,"","",,,0 +11221,image/jpeg,0,0,,"","",,,0 +11222,image/jpeg,0,0,,"","",,,0 +11223,image/jpeg,1599409401044,0,0,"","",40.254221,14.9056779722222,0 +11224,image/jpeg,1599409399960,0,0,"","",40.254221,14.9056779722222,0 +11225,image/jpeg,1599409398830,0,0,"","",40.254224,14.9056779722222,0 +11226,image/jpeg,0,0,,"","",,,0 +11227,image/jpeg,0,0,,"","",,,0 +11228,image/jpeg,0,0,,"","",,,0 +11229,image/jpeg,0,0,,"","",,,0 +11230,image/jpeg,0,0,,"","",,,0 +11231,image/jpeg,0,0,,"","",,,0 +11232,image/jpeg,0,0,,"","",,,0 +11233,image/jpeg,0,0,,"","",,,0 +11234,image/jpeg,0,0,,"","",,,0 +11235,image/jpeg,0,0,,"","",,,0 +11236,image/jpeg,0,0,,"","",,,0 +11237,image/jpeg,1599372949170,0,90,"","",40.182678,15.062858,0 +11238,image/jpeg,1599370375338,0,0,"","",40.182884,15.062988,0 +11239,image/jpeg,1599370364741,0,0,"","",40.1828969722222,15.0629799722222,0 +11240,image/jpeg,1599332628026,0,0,"","",40.2796289722222,14.9518389722222,0 +11241,image/jpeg,1599332532260,0,0,"","",40.279625,14.9518027777778,0 +11242,image/jpeg,1599332467925,0,90,"","",40.279434,14.952099,0 +11243,image/jpeg,1599332452660,0,0,"","",40.2793849722222,14.952042,0 +11244,image/jpeg,1599332442815,0,0,"","",40.2793229722222,14.952108,0 +11245,image/jpeg,1599332180957,0,90,"","",40.2788019722222,14.95265,0 +11246,image/jpeg,1599332116479,0,90,"","",40.2789069722222,14.952733,0 +11247,image/jpeg,1599331941508,0,0,"","",40.278849,14.9526679722222,0 +11248,image/jpeg,1599331927845,0,0,"","",40.278857,14.952721,0 +11249,image/jpeg,1599328045385,0,0,"","",40.1829389722222,15.063007,0 +11250,image/jpeg,1599327302998,0,0,"","",40.1827729722222,15.0628949722222,0 +11251,image/jpeg,1599327288849,0,0,"","",40.182768,15.0628949722222,0 +11252,image/jpeg,1599327279238,0,0,"","",40.182765,15.062874,0 +11253,image/jpeg,1599326993694,0,0,"","",40.182867,15.0629159722222,0 +11254,image/jpeg,1599326984406,0,0,"","",40.1828689722222,15.0629299722222,0 +11255,image/jpeg,1599324507388,0,0,"","",40.182844,15.0630059722222,0 +11256,image/jpeg,1599324780311,0,0,"","",40.18289,15.0629449722222,0 +11257,image/jpeg,1599324762801,0,0,"","",40.1828939722222,15.0629439722222,0 +11258,image/jpeg,1599324725486,0,0,"","",40.1828989722222,15.062993,0 +11259,image/jpeg,1599324713040,0,0,"","",40.182898,15.062993,0 +11260,image/jpeg,1599324631481,0,0,"","",40.182949,15.0629889722222,0 +11261,image/jpeg,1599324628217,0,0,"","",40.182946,15.062979,0 +11262,image/jpeg,1599324398887,0,0,"","",40.1828939722222,15.062979,0 +11263,image/jpeg,1599319640136,0,0,"","",40.1825529722222,15.0631129722222,0 +11264,image/jpeg,1599318443620,0,0,"","",40.182765,15.0630009722222,0 +11265,image/jpeg,1599318448487,0,180,"","",40.182765,15.063,0 +11266,image/jpeg,1599318443620,0,180,"","",40.182765,15.0630009722222,0 +11267,image/jpeg,1599317827104,0,0,"","",40.182741,15.0629489722222,0 +11268,image/jpeg,1599317565664,0,0,"","",40.182743,15.0630109722222,0 +11269,image/jpeg,1599317400354,0,0,"","",40.1828149722222,15.0629159722222,0 +11270,image/jpeg,1599312904457,0,0,"","",40.3613659722222,14.9996869722222,0 +11271,image/jpeg,1599309054166,0,0,"","",40.3614329722222,14.99993,0 +11272,image/jpeg,0,0,,"","",,,0 +11273,image/jpeg,0,0,,"","",,,0 +11274,image/jpeg,0,0,,"","",,,0 +11275,image/jpeg,0,0,,"","",,,0 +11276,image/jpeg,0,0,,"","",,,0 +11277,image/jpeg,0,0,,"","",,,0 +11278,image/jpeg,1599234937818,0,90,"","",44.250464,12.0829559722222,0 +11279,image/jpeg,1599234934810,0,90,"","",44.250461,12.0829599722222,0 +11280,image/jpeg,0,0,,"","",,,0 +11281,image/jpeg,1599233907202,0,90,"","",44.2505039722222,12.082857,0 +11282,image/jpeg,1599233902096,0,0,"","",44.2505099722222,12.0828439722222,0 +11283,image/jpeg,0,0,,"","",,,0 +11284,image/jpeg,1598681012425,0,0,"","",44.2505669722222,12.0829079722222,0 +11285,image/jpeg,0,0,,"","",,,0 +11286,image/jpeg,1598507271317,0,0,"","",44.250605,12.0828839722222,0 +11287,image/jpeg,1598507267261,0,0,"","",44.2506229722222,12.0828129722222,0 +11288,image/jpeg,1598507238137,0,0,"","",44.250602,12.0828889722222,0 +11289,image/jpeg,0,0,,"","",,,0 +11290,image/jpeg,0,0,,"","",,,0 +11291,image/jpeg,0,0,,"","",,,0 +11292,image/jpeg,1598191990094,0,90,"","",44.250661,12.0827779722222,0 +11293,image/jpeg,1598122122489,0,0,"","",44.1495719722222,12.1336119722222,0 +11294,image/jpeg,1598122119468,0,0,"","",44.149562,12.1336019722222,0 +11295,image/jpeg,1598122100712,0,0,"","",44.149559,12.133604,0 +11296,image/jpeg,1598120153341,0,0,"","",44.1496959722222,12.1338749722222,0 +11297,image/jpeg,1598118913288,0,90,"","",44.149273,12.13367,0 +11298,image/jpeg,1598118706650,0,90,"","",44.149303,12.1336689722222,0 +11299,image/jpeg,1598117635440,0,0,"","",44.149422,12.133696,0 +11300,image/jpeg,1598117627093,0,0,"","",44.1494649722222,12.1336879722222,0 +11301,image/jpeg,1598117627538,0,0,"","",44.1494649722222,12.1336879722222,0 +11302,image/jpeg,0,0,,"","",,,0 +11303,image/jpeg,0,0,,"","",,,0 +11304,image/jpeg,0,0,,"","",,,0 +11305,image/jpeg,0,0,,"","",,,0 +11306,image/jpeg,0,0,,"","",,,0 +11307,image/jpeg,0,0,,"","",,,0 +11308,image/jpeg,0,0,,"","",,,0 +11309,image/jpeg,0,0,,"","",,,0 +11310,image/jpeg,0,0,,"","",,,0 +11311,image/jpeg,1597574041121,0,0,"","",42.733322,12.742528,0 +11312,image/jpeg,1597573066921,0,90,"","",42.7339399722222,12.739684,0 +11313,image/jpeg,1597572569133,0,90,"","",42.734309,12.738072,0 +11314,image/jpeg,1597572489307,0,90,"","",42.734292,12.7378949722222,0 +11315,image/jpeg,1597572486815,0,90,"","",42.73429,12.737901,0 +11316,image/jpeg,1597572342172,0,90,"","",42.7343109722222,12.7375509722222,0 +11317,image/jpeg,1597572318797,0,90,"","",42.734292,12.7375469722222,0 +11318,image/jpeg,1597572206122,0,90,"","",42.734352,12.737545,0 +11319,image/jpeg,0,0,0,"","",,,0 +11320,image/jpeg,0,0,270,"","",,,0 +11321,image/jpeg,1597570867213,0,90,"","",42.7358959722222,12.7365189722222,0 +11322,image/jpeg,1597570860386,0,90,"","",42.735905,12.73656,0 +11323,image/jpeg,1597570842433,0,90,"","",42.736192,12.736643,0 +11324,image/jpeg,0,0,,"","",,,0 +11325,image/jpeg,0,0,,"","",,,0 +11326,image/jpeg,1597517920838,0,90,"","",42.956135,12.7040729722222,0 +11327,image/jpeg,1597517917594,0,90,"","",42.956141,12.704057,0 +11328,image/jpeg,1597517863992,0,90,"","",42.95613,12.704105,0 +11329,image/jpeg,1597517861244,0,90,"","",42.956138,12.7041109722222,0 +11330,image/jpeg,0,0,,"","",,,0 +11331,image/jpeg,0,0,,"","",,,0 +11332,image/jpeg,0,0,,"","",,,0 +11333,image/jpeg,0,0,,"","",,,0 +11334,image/jpeg,0,0,,"","",,,0 +11335,image/jpeg,0,0,,"","",,,0 +11336,image/jpeg,0,0,,"","",,,0 +11337,image/jpeg,1597504429993,0,90,"","",42.8939289722222,12.652613,0 +11338,image/jpeg,0,0,,"","",,,0 +11339,image/jpeg,0,0,,"","",,,0 +11340,image/jpeg,0,0,,"","",,,0 +11341,image/jpeg,0,0,,"","",,,0 +11342,image/jpeg,0,0,,"","",,,0 +11343,image/jpeg,0,0,,"","",,,0 +11344,image/jpeg,0,0,,"","",,,0 +11345,image/jpeg,0,0,,"","",,,0 +11346,image/jpeg,0,0,,"","",,,0 +11347,image/jpeg,1597495624017,0,90,"","",42.9595729722222,12.861772,0 +11348,image/jpeg,0,0,,"","",,,0 +11349,image/jpeg,0,0,,"","",,,0 +11350,image/jpeg,0,0,,"","",,,0 +11351,image/jpeg,0,0,,"","",,,0 +11352,image/jpeg,0,0,,"","",,,0 +11353,image/jpeg,0,0,,"","",,,0 +11354,image/jpeg,0,0,,"","",,,0 +11355,image/jpeg,0,0,,"","",,,0 +11356,image/jpeg,0,0,,"","",,,0 +11357,image/jpeg,0,0,,"","",,,0 +11358,image/jpeg,0,0,,"","",,,0 +11359,image/jpeg,0,0,,"","",,,0 +11360,image/jpeg,0,0,,"","",,,0 +11361,image/jpeg,0,0,,"","",,,0 +11362,image/jpeg,0,0,,"","",,,0 +11363,image/jpeg,0,0,,"","",,,0 +11364,image/jpeg,1597486942957,0,0,"","",42.9947519722222,12.670502,0 +11365,image/jpeg,1597486387418,0,90,"","",42.9958529722222,12.6713,0 +11366,image/jpeg,1597486380608,0,0,"","",42.9958489722222,12.6712989722222,0 +11367,image/jpeg,1597486375604,0,90,"","",42.9958469722222,12.6713029722222,0 +11368,image/jpeg,0,0,,"","",,,0 +11369,image/jpeg,0,0,,"","",,,0 +11370,image/jpeg,0,0,,"","",,,0 +11371,image/jpeg,0,0,,"","",,,0 +11372,image/jpeg,0,0,,"","",,,0 +11373,image/jpeg,0,0,,"","",,,0 +11374,image/jpeg,0,0,,"","",,,0 +11375,image/jpeg,0,0,,"","",,,0 +11376,image/jpeg,0,0,,"","",,,0 +11377,image/jpeg,0,0,,"","",,,0 +11378,image/jpeg,1597484559586,0,90,"","",42.990779,12.6724029722222,0 +11379,image/jpeg,1597484552825,0,90,"","",42.9907899722222,12.67242,0 +11380,image/jpeg,1597482240257,0,0,"","",42.989443,12.6723099722222,0 +11381,image/jpeg,1597482096992,0,0,"","",42.989403,12.6728159722222,0 +11382,image/jpeg,0,0,,"","",,,0 +11383,image/jpeg,0,0,,"","",,,0 +11384,image/jpeg,1596926277983,0,0,"","",43.8917789722222,12.8834099722222,0 +11385,image/jpeg,1596926266881,0,0,"","",43.8917649722222,12.8833769722222,0 +11386,image/jpeg,1596902396848,0,90,"","",44.2506029722222,12.0828679722222,0 +11387,image/jpeg,1596819383218,0,90,"","",44.2508089722222,12.082955,0 +11388,image/jpeg,1596819377017,0,90,"","",44.250677,12.082955,0 +11389,image/jpeg,1596819365703,0,90,"","",44.2505969722222,12.082843,0 +11390,image/jpeg,1596819328624,0,90,"","",44.2507519722222,12.08304,0 +11391,image/jpeg,0,0,,"","",,,0 +11392,image/jpeg,0,0,,"","",,,0 +11393,image/jpeg,1596733839588,0,0,"","",44.1494444444444,12.1336416666667,0 +11394,image/jpeg,1596733833082,0,0,"","",44.1494569722222,12.1336359722222,0 +11395,image/jpeg,0,0,,"","",,,0 +11396,image/jpeg,0,0,,"","",,,0 +11397,image/jpeg,1596106103702,0,0,"","",44.250607,12.082897,0 +11398,image/jpeg,0,0,,"","",,,0 +11399,image/jpeg,0,0,,"","",,,0 +11400,image/jpeg,0,0,,"","",,,0 +11401,image/jpeg,1595524721049,0,90,"","",44.179366,11.924713,0 +11402,image/jpeg,1595524690559,0,90,"","",44.1793499722222,11.924716,0 +11403,image/jpeg,1595524093948,0,0,"","",44.170684,11.9114459722222,0 +11404,image/jpeg,1595524093948,0,0,"","",44.170684,11.9114459722222,0 +11405,image/jpeg,1595524084728,0,0,"","",44.1706829722222,11.9114419722222,0 +11406,image/jpeg,1595523901752,0,0,"","",44.170675,11.9114388888889,0 +11407,image/jpeg,1595523901752,0,0,"","",44.170675,11.9114388888889,0 +11408,image/jpeg,1595523901752,0,0,"","",44.170675,11.9114388888889,0 +11409,image/jpeg,1595523762940,0,0,"","",44.1682861111111,11.9085055555556,0 +11410,image/jpeg,1595523340529,0,0,"","",44.1623583333333,11.9142388888889,0 +11411,image/jpeg,1595523332189,0,0,"","",44.1623638888889,11.9142472222222,0 +11412,image/jpeg,1595523307659,0,0,"","",44.1623722222222,11.9142333333333,0 +11413,image/jpeg,1595523299365,0,0,"","",44.162373,11.9142349722222,0 +11414,image/jpeg,1595523297277,0,0,"","",44.162373,11.914232,0 +11415,image/jpeg,0,0,,"","",,,0 +11416,image/jpeg,0,0,,"","",,,0 +11417,image/jpeg,0,0,,"","",,,0 +11418,image/jpeg,0,0,,"","",,,0 +11419,image/jpeg,0,0,,"","",,,0 +11420,image/jpeg,0,0,,"","",,,0 +11421,image/jpeg,0,0,,"","",,,0 +11422,image/jpeg,0,0,,"","",,,0 +11423,image/jpeg,0,0,,"","",,,0 +11424,image/jpeg,0,0,,"","",,,0 +11425,image/jpeg,0,0,,"","",,,0 +11426,image/jpeg,0,0,,"","",,,0 +11427,image/jpeg,0,0,,"","",,,0 +11428,image/jpeg,0,0,,"","",,,0 +11429,image/jpeg,0,0,,"","",,,0 +11430,image/jpeg,0,0,,"","",,,0 +11431,image/jpeg,0,0,,"","",,,0 +11432,image/jpeg,0,0,,"","",,,0 +11433,image/jpeg,0,0,,"","",,,0 +11434,image/jpeg,0,0,,"","",,,0 +11435,image/jpeg,0,0,,"","",,,0 +11436,image/jpeg,0,0,,"","",,,0 +11437,image/jpeg,0,0,,"","",,,0 +11438,image/jpeg,0,0,,"","",,,0 +11439,image/jpeg,0,0,,"","",,,0 +11440,image/jpeg,0,0,,"","",,,0 +11441,image/jpeg,0,0,,"","",,,0 +11442,image/jpeg,0,0,,"","",,,0 +11443,image/jpeg,0,0,,"","",,,0 +11444,image/jpeg,0,0,,"","",,,0 +11445,image/jpeg,0,0,,"","",,,0 +11446,image/jpeg,0,0,,"","",,,0 +11447,image/jpeg,0,0,,"","",,,0 +11448,image/jpeg,0,0,,"","",,,0 +11449,image/jpeg,0,0,,"","",,,0 +11450,image/jpeg,0,0,,"","",,,0 +11451,image/jpeg,0,0,,"","",,,0 +11452,image/jpeg,0,0,,"","",,,0 +11453,image/jpeg,0,0,,"","",,,0 +11454,image/jpeg,1595156022678,0,0,"","",46.5209166666667,12.2243472222222,0 +11455,image/jpeg,1595155995965,0,0,"","",46.5209444444444,12.2243333333333,0 +11456,image/jpeg,1595155975304,0,0,"","",46.5209388888889,12.2243416666667,0 +11457,image/jpeg,1595151327454,0,0,"","",,,0 +11458,image/jpeg,1595151316732,0,0,"","",,,0 +11459,image/jpeg,1595149046967,0,90,"","",46.5293229722222,12.2284089722222,0 +11460,image/jpeg,1595149040909,0,90,"","",46.529335,12.228398,0 +11461,image/jpeg,1595149037690,0,90,"","",46.5293399722222,12.2284009722222,0 +11462,image/jpeg,1595149018462,0,90,"","",46.5293319722222,12.228376,0 +11463,image/jpeg,1595149015466,0,90,"","",46.5293279722222,12.228369,0 +11464,image/jpeg,1595144380594,0,90,"","",46.5461409722222,12.214622,0 +11465,image/jpeg,1595144370325,0,0,"","",46.545977,12.214603,0 +11466,image/jpeg,0,0,,"","",,,0 +11467,image/jpeg,1595143153222,0,0,"","",46.551949,12.208679,0 +11468,image/jpeg,1595143147049,0,90,"","",46.552058,12.208693,0 +11469,image/jpeg,1595142298893,0,0,"","",46.556674,12.2029409722222,0 +11470,image/jpeg,0,0,,"","",,,0 +11471,image/jpeg,1595086062490,0,0,"","",46.6239777777778,12.2894527777778,0 +11472,image/jpeg,1595086043830,0,0,"","",46.6240027777778,12.2894527777778,0 +11473,image/jpeg,1595085963648,0,0,"","",46.624084,12.289602,0 +11474,image/jpeg,1595085954664,0,0,"","",46.6240799722222,12.289592,0 +11475,image/jpeg,1595078458812,0,90,"","",46.634967,12.312836,0 +11476,image/jpeg,1595078453390,0,90,"","",,,0 +11477,image/jpeg,1595076349284,0,90,"","",46.6350699722222,12.317154,0 +11478,image/jpeg,1595076335896,0,0,"","",46.635103,12.3171959722222,0 +11479,image/jpeg,1595076331629,0,90,"","",46.635071,12.3171789722222,0 +11480,image/jpeg,1595076289910,0,0,"","",46.634914,12.3175139722222,0 +11481,image/jpeg,1595076281742,0,0,"","",46.6346169722222,12.3175019722222,0 +11482,image/jpeg,1595076112894,0,90,"","",46.634776,12.3194639722222,0 +11483,image/jpeg,1595076107510,0,90,"","",46.6347779722222,12.3194879722222,0 +11484,image/jpeg,1595076100415,0,90,"","",,,0 +11485,image/jpeg,1595073057957,0,90,"","",46.6283209722222,12.343213,0 +11486,image/jpeg,1595072926047,0,90,"","",46.628743,12.342902,0 +11487,image/jpeg,1595072914524,0,90,"","",46.6287469722222,12.3428129722222,0 +11488,image/jpeg,1595069192113,0,0,"","",,,0 +11489,image/jpeg,1595069187340,0,0,"","",,,0 +11490,image/jpeg,1595068120422,0,90,"","",,,0 +11491,image/jpeg,1595067649523,0,90,"","",46.630805,12.3399339722222,0 +11492,image/jpeg,1595067603249,0,0,"","",46.6310179722222,12.3395759722222,0 +11493,image/jpeg,1595067571984,0,90,"","",46.63103,12.3395799722222,0 +11494,image/jpeg,0,0,270,"","",,,0 +11495,image/jpeg,0,0,270,"","",,,0 +11496,image/jpeg,1595066541240,0,0,"","",46.629657,12.3399059722222,0 +11497,image/jpeg,1595064859017,0,0,"","",46.6250009722222,12.3386659722222,0 +11498,image/jpeg,1595061428071,0,90,"","",46.6209059722222,12.316024,0 +11499,image/jpeg,1595061411817,0,90,"","",46.6208949722222,12.3160399722222,0 +11500,image/jpeg,1595061407869,0,90,"","",46.620896,12.3160399722222,0 +11501,image/jpeg,1595060957382,0,90,"","",46.620877,12.3145889722222,0 +11502,image/jpeg,1595060941746,0,90,"","",46.620882,12.314619,0 +11503,image/jpeg,1595060935058,0,90,"","",46.620874,12.314652,0 +11504,image/jpeg,1595060385221,0,0,"","",46.618498,12.3120759722222,0 +11505,image/jpeg,1595060188623,0,90,"","",46.6181219722222,12.312084,0 +11506,image/jpeg,1595060177708,0,90,"","",46.618141,12.312077,0 +11507,image/jpeg,1595053267231,0,0,"","",46.4729779722222,12.2034719722222,0 +11508,image/jpeg,1595053253970,0,0,"","",46.4727729722222,12.2033319722222,0 +11509,image/jpeg,0,0,,"","",,,0 +11510,image/jpeg,1595053086948,0,90,"","",46.4730509722222,12.203457,0 +11511,image/jpeg,1595051760032,0,90,"","",46.460559,12.2049869722222,0 +11512,image/jpeg,0,0,,"","",,,0 +11513,image/jpeg,1594838379447,0,0,"","",44.2505609722222,12.0827139722222,0 +11514,image/jpeg,1594838279282,0,90,"","",44.2506589722222,12.0827349722222,0 +11515,image/jpeg,1594838246446,0,90,"","",44.2506929722222,12.0826489722222,0 +11516,image/jpeg,1594838231398,0,90,"","",44.2504309722222,12.0827819722222,0 +11517,image/jpeg,1594838222857,0,90,"","",44.250618,12.0828989722222,0 +11518,image/jpeg,0,0,,"","",,,0 +11519,image/jpeg,0,0,,"","",,,0 +11520,image/jpeg,1594489752600,0,0,"","",44.250525,12.0828079722222,0 +11521,image/jpeg,1594489727263,0,0,"","",44.2506109722222,12.0828939722222,0 +11522,image/jpeg,1594488465733,0,0,"","",44.2505659722222,12.082957,0 +11523,image/jpeg,1594488440986,0,0,"","",44.2506119722222,12.082898,0 +11524,image/jpeg,1594487312708,0,90,"","",44.250832,12.0829649722222,0 +11525,image/jpeg,1594487310839,0,90,"","",44.2508279722222,12.082964,0 +11526,image/jpeg,1594487308116,0,90,"","",44.250829,12.082964,0 +11527,image/jpeg,1594487308476,0,90,"","",44.2508339722222,12.082966,0 +11528,image/jpeg,1594487297037,0,90,"","",44.2508189722222,12.0829489722222,0 +11529,image/jpeg,1594487294847,0,90,"","",44.2508249722222,12.08295,0 +11530,image/jpeg,1594487286478,0,90,"","",44.2508479722222,12.0829579722222,0 +11531,image/jpeg,1594487221928,0,90,"","",44.2506119722222,12.082897,0 +11532,image/jpeg,1594482980107,0,0,"","",44.2462999722222,12.0809329722222,0 +11533,image/jpeg,1594482976947,0,0,"","",44.2462999722222,12.0809329722222,0 +11534,image/jpeg,1594476829132,0,0,"","",44.250663,12.0828989722222,0 +11535,image/jpeg,0,0,,"","",,,0 +11536,image/jpeg,1594407071825,0,0,"","",44.263277,11.5727139722222,0 +11537,image/jpeg,1594406193924,0,0,"","",44.263209,11.5727879722222,0 +11538,image/jpeg,1594405136561,0,0,"","",44.263229,11.572736,0 +11539,image/jpeg,1594136062328,0,0,"","",44.2507459722222,12.082579,0 +11540,image/jpeg,0,0,,"","",,,0 +11541,image/jpeg,1593961633598,0,90,"","",44.2504559722222,12.0827709722222,0 +11542,image/jpeg,1593961618296,0,90,"","",44.250624,12.082841,0 +11543,image/jpeg,1593961612432,0,90,"","",44.2506339722222,12.0828869722222,0 +11544,image/jpeg,0,0,,"","",,,0 +11545,image/jpeg,0,0,,"","",,,0 +11546,image/jpeg,0,0,,"","",,,0 +11547,image/jpeg,0,0,,"","",,,0 +11548,image/jpeg,0,0,,"","",,,0 +11549,image/jpeg,1593861356899,0,0,"","",43.8871589722222,11.753268,0 +11550,image/jpeg,1593861344195,0,90,"","",43.8871619722222,11.7533969722222,0 +11551,image/jpeg,1593861167386,0,0,"","",43.887148,11.7531499722222,0 +11552,image/jpeg,1593861167785,0,0,"","",43.887148,11.7531499722222,0 +11553,image/jpeg,0,0,,"","",,,0 +11554,image/jpeg,1593349607127,0,0,"","",44.241179,11.7096459722222,0 +11555,image/jpeg,1593349607127,0,0,"","",44.241179,11.7096459722222,0 +11556,image/jpeg,1593349607127,0,0,"","",44.241179,11.7096459722222,0 +11557,image/jpeg,1593349607127,0,0,"","",44.241179,11.7096459722222,0 +11558,,0,0,,"","",,,0 +11559,image/jpeg,1593376073683,0,0,"","",44.286763,11.8399889722222,0 +11560,image/jpeg,1593376073683,0,0,"","",44.286763,11.8399889722222,0 +11561,image/jpeg,1593363579198,0,270,"","",44.273394,11.720489,0 +11562,image/jpeg,1593361356365,0,270,"","",44.235329,11.709402,0 +11563,image/jpeg,1593361350294,0,270,"","",44.235329,11.709402,0 +11564,image/jpeg,1593361280904,0,90,"","",44.2353299722222,11.7093969722222,0 +11565,image/jpeg,1593361274573,0,90,"","",44.2353299722222,11.7093969722222,0 +11566,image/jpeg,1593349607127,0,90,"","",44.241179,11.7096459722222,0 +11567,image/jpeg,0,0,,"","",,,0 +11568,image/jpeg,1593245936610,0,0,"","",44.3715779722222,11.7318079722222,0 +11569,image/jpeg,1593245920228,0,0,"","",44.3715699722222,11.7317929722222,0 +11570,image/jpeg,1593245909655,0,0,"","",44.371631,11.7318999722222,0 +11571,image/jpeg,1593151387211,0,90,"","",44.2505519722222,12.082954,0 +11572,image/jpeg,0,0,,"","",,,0 +11573,image/jpeg,0,0,,"","",,,0 +11574,image/jpeg,0,0,,"","",,,0 +11575,image/jpeg,0,0,,"","",,,0 +11576,image/jpeg,0,0,,"","",,,0 +11577,image/jpeg,0,0,,"","",,,0 +11578,image/jpeg,1592646006954,0,90,"","",45.6012169722222,12.873302,0 +11579,image/jpeg,1592632700102,0,0,"","",45.9662409722222,12.641652,0 +11580,image/jpeg,0,0,0,"","",,,0 +11581,image/jpeg,0,0,,"","",,,0 +11582,image/jpeg,0,0,,"","",,,0 +11583,image/jpeg,0,0,,"","",,,0 +11584,image/jpeg,0,0,,"","",,,0 +11585,image/jpeg,0,0,,"","",,,0 +11586,image/jpeg,0,0,,"","",,,0 +11587,image/jpeg,0,0,,"","",,,0 +11588,image/jpeg,0,0,,"","",,,0 +11589,image/jpeg,1592590396505,0,90,"","",45.9663529722222,12.641738,0 +11590,image/jpeg,1592581476395,0,0,"","",44.392246,11.7100639722222,0 +11591,image/jpeg,1592581471591,0,90,"","",44.3916719722222,11.711551,0 +11592,image/jpeg,0,0,,"","",,,0 +11593,image/jpeg,0,0,,"","",,,0 +11594,image/jpeg,0,0,,"","",,,0 +11595,image/jpeg,0,0,,"","",,,0 +11596,image/jpeg,1592371207622,0,90,"","",44.2505779722222,12.0828129722222,0 +11597,image/jpeg,1592371173483,0,90,"","",44.2505949722222,12.082843,0 +11598,image/jpeg,0,0,,"","",,,0 +11599,image/jpeg,0,0,,"","",,,0 +11600,image/jpeg,0,0,,"","",,,0 +11601,image/jpeg,0,0,,"","",,,0 +11602,image/jpeg,0,0,,"","",,,0 +11603,image/jpeg,0,0,,"","",,,0 +11604,image/jpeg,0,0,,"","",,,0 +11605,image/jpeg,0,0,,"","",,,0 +11606,image/jpeg,1592161323379,0,0,"","",,,0 +11607,image/jpeg,1592149316233,0,0,"","",44.2242277777778,11.7735027777778,0 +11608,image/jpeg,1592148738175,0,0,"","",44.2241916666667,11.7737916666667,0 +11609,image/jpeg,1592148729150,0,0,"","",44.2241939722222,11.7737949722222,0 +11610,image/jpeg,1592148726461,0,0,"","",44.2241959722222,11.773806,0 +11611,image/jpeg,1592135671686,0,0,"","",44.2504879722222,12.0829629722222,0 +11612,image/jpeg,1592135669599,0,0,"","",44.250613,12.0828649722222,0 +11613,image/jpeg,0,0,,"","",,,0 +11614,image/jpeg,0,0,,"","",,,0 +11615,image/jpeg,1592040205075,0,0,"","",44.2505039722222,12.082503,0 +11616,image/jpeg,0,0,,"","",,,0 +11617,image/jpeg,0,0,,"","",,,0 +11618,image/jpeg,1591953227976,0,0,"","",44.25061,12.082843,0 +11619,image/jpeg,0,0,,"","",,,0 +11620,image/jpeg,0,0,,"","",,,0 +11621,image/jpeg,0,0,,"","",,,0 +11622,image/jpeg,0,0,,"","",,,0 +11623,image/jpeg,1591720615502,0,90,"","",44.2284879722222,12.0430159722222,0 +11624,image/jpeg,1591561335173,0,90,"","",44.250528,12.0828469722222,0 +11625,image/jpeg,1591533301298,0,90,"","",44.2505979722222,12.082691,0 +11626,image/jpeg,1591533285153,0,90,"","",44.250602,12.0827259722222,0 +11627,image/jpeg,1591532239957,0,0,"","",44.2506199722222,12.082758,0 +11628,image/jpeg,1591532235180,0,0,"","",44.250615,12.0827589722222,0 +11629,image/jpeg,1591532201692,0,0,"","",44.250627,12.0827519722222,0 +11630,image/jpeg,1591532195208,0,0,"","",44.250635,12.08276,0 +11631,image/jpeg,1591532177250,0,0,"","",44.2506589722222,12.082781,0 +11632,image/jpeg,1591532167612,0,90,"","",44.250607,12.0827639722222,0 +11633,image/jpeg,1591455535703,0,90,"","",44.250647,12.0827229722222,0 +11634,image/jpeg,0,0,,"","",,,0 +11635,image/jpeg,0,0,,"","",,,0 +11636,image/jpeg,0,0,,"","",,,0 +11637,image/jpeg,0,0,0,"","",,,0 +11638,image/jpeg,0,0,0,"","",,,0 +11639,image/jpeg,0,0,,"","",,,0 +11640,image/jpeg,0,0,,"","",,,0 +11641,image/jpeg,0,0,,"","",,,0 +11642,image/jpeg,0,0,,"","",,,0 +11643,image/jpeg,0,0,,"","",,,0 +11644,image/jpeg,0,0,,"","",,,0 +11645,image/jpeg,0,0,,"","",,,0 +11646,image/jpeg,0,0,,"","",,,0 +11647,image/jpeg,0,0,,"","",,,0 +11648,image/jpeg,0,0,,"","",,,0 +11649,image/jpeg,0,0,,"","",,,0 +11650,image/jpeg,0,0,,"","",,,0 +11651,image/jpeg,0,0,,"","",,,0 +11652,image/jpeg,0,0,,"","",,,0 +11653,image/jpeg,0,0,,"","",,,0 +11654,image/jpeg,0,0,,"","",,,0 +11655,image/jpeg,0,0,,"","",,,0 +11656,image/jpeg,0,0,,"","",,,0 +11657,image/jpeg,0,0,,"","",,,0 +11658,image/jpeg,0,0,,"","",,,0 +11659,image/jpeg,1591097301214,0,90,"","",43.999858,12.45664,0 +11660,image/jpeg,1591097301088,0,90,"","",43.9998459722222,12.456656,0 +11661,image/jpeg,0,0,,"","",,,0 +11662,image/jpeg,0,0,,"","",,,0 +11663,image/jpeg,0,0,,"","",,,0 +11664,image/jpeg,0,0,,"","",,,0 +11665,image/jpeg,1591087314949,0,0,"","",43.9488309722222,12.2793449722222,0 +11666,image/jpeg,1591087299030,0,90,"","",43.9488249722222,12.279363,0 +11667,image/jpeg,1591087067789,0,0,"","",43.9486849722222,12.2800659722222,0 +11668,image/jpeg,1591087046802,0,0,"","",43.9487269722222,12.2801059722222,0 +11669,image/jpeg,1591086966839,0,90,"","",43.948731,12.2801249722222,0 +11670,image/jpeg,1591086952709,0,90,"","",43.9487359722222,12.2801069722222,0 +11671,image/jpeg,1591086918976,0,0,"","",43.948728,12.280084,0 +11672,image/jpeg,1591083213758,0,270,"","",43.957537,12.2824229722222,0 +11673,image/jpeg,1591083197811,0,90,"","",43.957526,12.282429,0 +11674,image/jpeg,0,0,,"","",,,0 +11675,image/jpeg,0,0,,"","",,,0 +11676,image/jpeg,0,0,,"","",,,0 +11677,image/jpeg,0,0,,"","",,,0 +11678,image/jpeg,1590919821933,0,90,"","",,,0 +11679,image/jpeg,0,0,,"","",,,0 +11680,image/jpeg,1590848674858,0,90,"","",44.194146,12.222424,0 +11681,image/jpeg,1590848668235,0,90,"","",44.194048,12.2224719722222,0 +11682,image/jpeg,0,0,,"","",,,0 +11683,image/jpeg,0,0,,"","",,,0 +11684,image/jpeg,1590336692383,0,0,"","",44.250543,12.08366,0 +11685,image/jpeg,1590336682737,0,90,"","",44.2503829722222,12.0836469722222,0 +11686,image/jpeg,1590230355241,0,0,"","",44.199986,12.3959799722222,0 +11687,image/jpeg,0,0,,"","",,,0 +11688,image/jpeg,0,0,,"","",,,0 +11689,image/jpeg,0,0,,"","",,,0 +11690,image/jpeg,0,0,,"","",,,0 +11691,image/jpeg,0,0,,"","",,,0 +11692,image/jpeg,1590230385816,0,90,"","",44.1999769722222,12.395998,0 +11693,image/jpeg,1590230347453,0,180,"","",44.199995,12.395958,0 +11694,image/jpeg,1590238701756,0,0,"","",44.2081739722222,12.4042989722222,0 +11695,image/jpeg,1590238686192,0,90,"","",44.20817,12.404303,0 +11696,image/jpeg,0,0,,"","",,,0 +11697,image/jpeg,0,0,,"","",,,0 +11698,image/jpeg,0,0,,"","",,,0 +11699,image/jpeg,1589903501930,0,90,"","",44.2506219722222,12.0835109722222,0 +11700,image/jpeg,0,0,,"","",,,0 +11701,image/jpeg,0,0,,"","",,,0 +11702,image/jpeg,0,0,,"","",,,0 +11703,image/jpeg,1589105360073,0,90,"","",,,0 +11704,image/jpeg,1589028918677,0,0,"","",44.179397,12.1256149722222,0 +11705,image/jpeg,1589029115320,0,0,"","",44.181604,12.124719,0 +11706,image/jpeg,1588871465068,0,90,"","",44.250714,12.083099,0 +11707,image/jpeg,1588780930863,0,0,"","",44.250599,12.0828939722222,0 +11708,image/jpeg,1588765681989,0,0,"","",44.250515,12.082387,0 +11709,image/jpeg,1588765668745,0,0,"","",44.250601,12.082898,0 +11710,image/jpeg,0,0,,"","",,,0 +11711,image/jpeg,0,0,,"","",,,0 +11712,image/jpeg,1587901092151,0,90,"","",44.250605,12.0828199722222,0 +11713,image/jpeg,1587839534209,0,0,"","",44.2505779722222,12.0830559722222,0 +11714,image/jpeg,1587839529879,0,0,"","",44.2505529722222,12.083773,0 +11715,image/jpeg,1587839520955,0,0,"","",44.2505939722222,12.0828729722222,0 +11716,image/jpeg,1587839312896,0,0,"","",,,0 +11717,image/jpeg,0,0,,"","",,,0 +11718,image/jpeg,0,0,,"","",,,0 +11719,image/jpeg,1587829022104,0,90,"","",44.250475,12.082625,0 +11720,image/jpeg,0,0,,"","",,,0 +11721,image/jpeg,0,0,,"","",,,0 +11722,image/jpeg,0,0,,"","",,,0 +11723,image/jpeg,0,0,,"","",,,0 +11724,image/jpeg,0,0,,"","",,,0 +11725,image/jpeg,0,0,,"","",,,0 +11726,image/jpeg,0,0,,"","",,,0 +11727,image/jpeg,0,0,,"","",,,0 +11728,image/jpeg,0,0,,"","",,,0 +11729,image/jpeg,0,0,,"","",,,0 +11730,image/jpeg,0,0,,"","",,,0 +11731,image/jpeg,0,0,,"","",,,0 +11732,image/jpeg,0,0,,"","",,,0 +11733,image/jpeg,0,0,,"","",,,0 +11734,image/jpeg,0,0,,"","",,,0 +11735,image/jpeg,1587569696421,0,90,"","",44.2505159722222,12.0828059722222,0 +11736,image/jpeg,0,0,,"","",,,0 +11737,image/jpeg,0,0,,"","",,,0 +11738,image/jpeg,0,0,,"","",,,0 +11739,image/jpeg,1584286717363,0,0,"","",44.250542,12.0827559722222,0 +11740,image/jpeg,1587216907796,0,0,"","",44.2505809722222,12.0828769722222,0 +11741,image/jpeg,1586955118800,0,90,"","",44.250596,12.083952,0 +11742,image/jpeg,1586934117333,0,0,"","",44.250574,12.0828539722222,0 +11743,image/jpeg,1586934101428,0,90,"","",44.250593,12.0828559722222,0 +11744,image/jpeg,0,0,,"","",,,0 +11745,image/jpeg,1586702364589,0,0,"","",44.2505919722222,12.082829,0 +11746,image/jpeg,1586702341241,0,90,"","",44.250582,12.0828729722222,0 +11747,image/jpeg,1586691185281,0,90,"","",44.250551,12.0829299722222,0 +11748,image/jpeg,0,0,,"","",,,0 +11749,image/jpeg,0,0,,"","",,,0 +11750,image/jpeg,1586688134124,0,0,"","",44.250584,12.082852,0 +11751,image/jpeg,1586688047212,0,0,"","",44.250646,12.082928,0 +11752,image/jpeg,1586686809576,0,0,"","",44.250506,12.082897,0 +11753,image/jpeg,1586686797289,0,0,"","",44.250526,12.0831169722222,0 +11754,image/jpeg,0,0,,"","",,,0 +11755,image/jpeg,1586376666219,0,0,"","",44.250537,12.082966,0 +11756,image/jpeg,1586020161091,0,0,"","",44.2505329722222,12.0829789722222,0 +11757,image/jpeg,1585996778466,0,0,"","",44.250483,12.082746,0 +11758,image/jpeg,1585996751756,0,0,"","",44.25056,12.082722,0 +11759,image/jpeg,1585990917118,0,90,"","",44.250579,12.0828939722222,0 +11760,image/jpeg,1585990520561,0,90,"","",44.250497,12.0828399722222,0 +11761,image/jpeg,0,0,,"","",,,0 +11762,image/jpeg,0,0,,"","",,,0 +11763,image/jpeg,0,0,,"","",,,0 +11764,image/jpeg,1584875873300,0,0,"","",44.2506699722222,12.0827659722222,0 +11765,image/jpeg,1584875822593,0,0,"","",44.250677,12.0827709722222,0 +11766,image/jpeg,1584869237674,0,0,"","",44.250605,12.082781,0 +11767,image/jpeg,1584814078438,0,0,"","",44.2506539722222,12.0828769722222,0 +11768,image/jpeg,1584806021136,0,0,"","",44.250588,12.082921,0 +11769,image/jpeg,1584737893887,0,0,"","",44.2506679722222,12.08337,0 +11770,image/jpeg,1584551672007,0,90,"","",44.250528,12.0829629722222,0 +11771,image/jpeg,1584551654262,0,90,"","",44.250529,12.082955,0 +11772,image/jpeg,1584551640315,0,90,"","",44.2505299722222,12.08294,0 +11773,image/jpeg,1584551634797,0,90,"","",44.2505329722222,12.0829249722222,0 +11774,image/jpeg,1584292861352,0,0,"","",44.250574,12.0829199722222,0 +11775,image/jpeg,0,0,,"","",,,0 +11776,image/jpeg,1584266757260,0,0,"","",44.2505779722222,12.082919,0 +11777,image/jpeg,1584216576184,0,0,"","",44.2502959722222,12.082776,0 +11778,image/jpeg,1584216553889,0,0,"","",44.250588,12.082921,0 +11779,image/jpeg,1584216543605,0,0,"","",44.250588,12.082921,0 +11780,image/jpeg,0,0,,"","",,,0 +11781,image/jpeg,0,0,,"","",,,0 +11782,image/jpeg,0,0,,"","",,,0 +11783,image/jpeg,0,0,,"","",,,0 +11784,image/jpeg,0,0,,"","",,,0 +11785,image/jpeg,0,0,,"","",,,0 +11786,image/jpeg,0,0,,"","",,,0 +11787,image/jpeg,0,0,,"","",,,0 +11788,image/jpeg,0,0,,"","",,,0 +11789,image/jpeg,1583662925105,0,0,"","",46.1755909722222,11.830552,0 +11790,image/jpeg,1583662925105,0,0,"","",46.1755909722222,11.830552,0 +11791,image/jpeg,1583661221614,0,0,"","",46.1743949722222,11.826453,0 +11792,image/jpeg,1583661211704,0,0,"","",46.1743459722222,11.8264089722222,0 +11793,image/jpeg,1583660867000,0,0,"","",46.1743341666667,11.82646,0 +11794,image/jpeg,1583660862440,0,0,"","",46.174294,11.826465,0 +11795,image/jpeg,1583660843905,0,90,"","",46.174348,11.8264289722222,0 +11796,image/jpeg,0,0,,"","",,,0 +11797,image/jpeg,1583444383460,0,0,"","",46.178431,11.832674,0 +11798,image/jpeg,0,0,,"","",,,0 +11799,image/jpeg,1582969024205,0,0,"","",44.378666,11.736463,0 +11800,image/jpeg,1582967141093,0,180,"","",44.307321,11.8950239722222,0 +11801,image/jpeg,1582402656950,0,0,"","",44.157299,11.9999059722222,0 +11802,image/jpeg,1581970150912,0,0,"","",44.2505969722222,12.0829179722222,0 +11803,image/jpeg,1581841872891,0,0,"","",44.4222729722222,12.22972,0 +11804,image/jpeg,1581841855885,0,0,"","",44.422232,12.2297799722222,0 +11805,image/jpeg,0,0,,"","",,,0 +11806,image/jpeg,0,0,,"","",,,0 +11807,image/jpeg,0,0,,"","",,,0 +11808,image/jpeg,0,0,,"","",,,0 +11809,image/jpeg,1581175212706,0,90,"","",45.4359639722222,12.325074,0 +11810,image/jpeg,1581167927141,0,90,"","",45.434871,12.3486159722222,0 +11811,image/jpeg,1581166450238,0,90,"","",45.434395,12.3392619722222,0 +11812,image/jpeg,1581162245430,0,90,"","",45.4388849722222,12.3397559722222,0 +11813,image/jpeg,0,0,,"","",,,0 +11814,image/jpeg,0,0,,"","",,,0 +11815,image/jpeg,0,0,,"","",,,0 +11816,image/jpeg,0,0,,"","",,,0 +11817,image/jpeg,0,0,,"","",,,0 +11818,image/jpeg,0,0,,"","",,,0 +11819,image/jpeg,1581161763562,0,90,"","",45.438487,12.337046,0 +11820,image/jpeg,1581161382702,0,0,"","",45.4384159722222,12.3360579722222,0 +11821,image/jpeg,1581161379073,0,0,"","",45.438414,12.3361239722222,0 +11822,image/jpeg,1581160905474,0,90,"","",45.438724,12.3351179722222,0 +11823,image/jpeg,0,0,,"","",,,0 +11824,image/jpeg,1581160132647,0,90,"","",45.4393689722222,12.3331269722222,0 +11825,image/jpeg,1581157987555,0,90,"","",45.4379279722222,12.3329679722222,0 +11826,image/jpeg,1581157979071,0,0,"","",45.4379279722222,12.3329679722222,0 +11827,image/jpeg,1581156866358,0,90,"","",45.4359409722222,12.3252299722222,0 +11828,image/jpeg,1581156865140,0,90,"","",45.4359409722222,12.3252299722222,0 +11829,image/jpeg,1581156862638,0,0,"","",45.4359499722222,12.325238,0 +11830,image/jpeg,1581156110115,0,0,"","",45.438284,12.319781,0 +11831,image/jpeg,0,0,,"","",,,0 +11832,image/jpeg,1580499255528,0,0,"","",44.184736,12.0357749722222,0 +11833,image/jpeg,1580496563506,0,180,"","",44.184713,12.0357869722222,0 +11834,image/jpeg,0,0,,"","",,,0 +11835,image/jpeg,1580152685633,0,0,"","",44.224141,12.0477299722222,0 +11836,image/jpeg,1579355336023,0,90,"","",43.8937919722222,12.8794559722222,0 +11837,image/jpeg,1579347771280,0,0,"","",44.2507179722222,12.0827899722222,0 +11838,image/jpeg,1579347705335,0,0,"","",44.2505069722222,12.0828699722222,0 +11839,image/jpeg,1579347683285,0,0,"","",44.2505299722222,12.0827629722222,0 +11840,image/jpeg,1579347644559,0,0,"","",44.2506569722222,12.0828399722222,0 +11841,image/jpeg,0,0,,"","",,,0 +11842,image/jpeg,0,0,,"","",,,0 +11843,image/jpeg,0,0,,"","",,,0 +11844,image/jpeg,0,0,,"","",,,0 +11845,image/jpeg,0,0,,"","",,,0 +11846,image/jpeg,1578341480183,0,90,"","",44.013437,12.6432369722222,0 +11847,image/jpeg,1578251517563,0,90,"","",44.284956,11.88273,0 +11848,image/jpeg,1578128739737,0,0,"","",44.137498,11.88906,0 +11849,image/jpeg,1578128709401,0,90,"","",44.1375469722222,11.8890279722222,0 +11850,image/jpeg,1578128680484,0,90,"","",44.1375699722222,11.889044,0 +11851,image/jpeg,1578128637566,0,0,"","",44.1375889722222,11.888901,0 +11852,image/jpeg,1578128585485,0,0,"","",44.1375,11.889086,0 +11853,image/jpeg,1578128475580,0,0,"","",44.1373519722222,11.889245,0 +11854,image/jpeg,1578128374905,0,0,"","",44.137349,11.88926,0 +11855,image/jpeg,1578126165923,0,90,"","",44.1373389722222,11.8892269722222,0 +11856,image/jpeg,1578125862085,0,0,"","",44.1374479722222,11.889072,0 +11857,image/jpeg,1578125851153,0,90,"","",,,0 +11858,image/jpeg,1578080610584,0,0,"","",44.137329,11.88944,0 +11859,image/jpeg,1578077150496,0,0,"","",44.1373099722222,11.8891869722222,0 +11860,image/jpeg,1578074111000,0,0,"","",,,0 +11861,image/jpeg,0,0,,"","",,,0 +11862,image/jpeg,1577831783991,0,90,"","",44.250588,12.0828839722222,0 +11863,image/jpeg,1577830781088,0,90,"","",44.2505889722222,12.08289,0 +11864,image/jpeg,1577829436213,0,90,"","",44.2505009722222,12.082641,0 +11865,image/jpeg,1577829425407,0,90,"","",44.2505009722222,12.0826399722222,0 +11866,image/jpeg,1577829392022,0,0,"","",44.250591,12.082895,0 +11867,image/jpeg,0,0,,"","",,,0 +11868,image/jpeg,1577826763050,0,90,"","",44.2506089722222,12.082871,0 +11869,image/jpeg,1577826743071,0,90,"","",44.2505889722222,12.08289,0 +11870,image/jpeg,1577826051631,0,90,"","",44.2505889722222,12.08289,0 +11871,image/jpeg,1577737318955,0,0,"","",44.250737,12.083489,0 +11872,image/jpeg,1577721361095,0,0,"","",44.2449689722222,12.083721,0 +11873,image/jpeg,1577721327059,0,90,"","",44.2449349722222,12.083636,0 +11874,image/jpeg,1577721320091,0,90,"","",44.2448899722222,12.083645,0 +11875,image/jpeg,1577701218830,0,90,"","",43.802154,11.1952599722222,0 +11876,image/jpeg,1577701029665,0,0,"","",43.8026679722222,11.1949369722222,0 +11877,image/jpeg,1577701026533,0,0,"","",43.8026679722222,11.194943,0 +11878,image/jpeg,1577700988416,0,0,"","",43.8026759722222,11.1949339722222,0 +11879,image/jpeg,1577700972868,0,0,"","",43.802666,11.194969,0 +11880,image/jpeg,1577627281896,0,180,"","",44.0798119722222,12.4759729722222,0 +11881,image/jpeg,1577625911708,0,90,"","",44.07967,12.476307,0 +11882,image/jpeg,1577625823241,0,90,"","",44.0798509722222,12.476347,0 +11883,image/jpeg,1577625563953,0,0,"","",44.079532,12.476506,0 +11884,image/jpeg,1577625558276,0,90,"","",44.079532,12.476506,0 +11885,image/jpeg,0,0,,"","",,,0 +11886,image/jpeg,0,0,,"","",,,0 +11887,image/jpeg,1577197301000,0,0,"","",45.9018822222222,12.0323647222222,0 +11888,image/jpeg,1577197301000,0,0,"","",45.9018822222222,12.0323647222222,0 +11889,image/jpeg,1577197301000,0,0,"","",45.9018822222222,12.0323647222222,0 +11890,image/jpeg,0,0,,"","",,,0 +11891,image/jpeg,0,0,,"","",,,0 +11892,image/jpeg,1576942917959,0,0,"","",44.2906339722222,12.1790129722222,0 +11893,image/jpeg,1576942917959,0,0,"","",44.2906339722222,12.1790129722222,0 +11894,image/jpeg,1576942798129,0,0,"","",44.290474,12.179185,0 +11895,image/jpeg,1576354969015,0,90,"","",43.7262249722222,12.6363509722222,0 +11896,image/jpeg,1576349694706,0,0,"","",43.7247559722222,12.6370179722222,0 +11897,image/jpeg,1576349678616,0,0,"","",43.7247559722222,12.6370179722222,0 +11898,image/jpeg,1576348974716,0,90,"","",43.7247559722222,12.6370179722222,0 +11899,image/jpeg,1576348946983,0,90,"","",43.7247559722222,12.6370179722222,0 +11900,image/jpeg,1576348906093,0,90,"","",43.7247559722222,12.6370179722222,0 +11901,image/jpeg,1576348873272,0,90,"","",43.7247559722222,12.6370179722222,0 +11902,image/jpeg,1576348846653,0,90,"","",43.7247559722222,12.6370179722222,0 +11903,image/jpeg,1576345993409,0,0,"","",,,0 +11904,image/jpeg,1576341800523,0,0,"","",43.7270419722222,12.635789,0 +11905,image/jpeg,1576341792016,0,0,"","",43.7210359722222,12.641178,0 +11906,image/jpeg,1576341770398,0,90,"","",43.727055,12.635806,0 +11907,image/jpeg,1576341601000,0,0,"","",43.7269836111111,12.6358369444444,0 +11908,image/jpeg,1576340357251,0,0,"","",43.7263469722222,12.636535,0 +11909,image/jpeg,1576339562671,0,0,"","",43.7244379722222,12.6359849722222,0 +11910,image/jpeg,1576339451433,0,0,"","",43.724387,12.635816,0 +11911,image/jpeg,1576339402301,0,0,"","",43.724409,12.63587,0 +11912,image/jpeg,0,0,0,"","",,,0 +11913,image/jpeg,1576333504873,0,0,"","",43.7246039722222,12.6366709722222,0 +11914,image/jpeg,1576333156332,0,90,"","",43.7268299722222,12.636715,0 +11915,image/jpeg,1576174708988,0,0,"","",44.184598,12.035648,0 +11916,image/jpeg,1575721393757,0,0,"","",44.250562,12.0829319722222,0 +11917,image/jpeg,1575721309888,0,0,"","",44.2505609722222,12.083099,0 +11918,image/jpeg,1575721305750,0,0,"","",44.2509879722222,12.0830289722222,0 +11919,image/jpeg,1575549169748,0,90,"","",,,0 +11920,image/jpeg,0,0,,"","",,,0 +11921,image/jpeg,0,0,,"","",,,0 +11922,image/jpeg,0,0,,"","",,,0 +11923,image/jpeg,0,0,,"","",,,0 +11924,image/jpeg,0,0,,"","",,,0 +11925,image/jpeg,0,0,,"","",,,0 +11926,image/jpeg,0,0,,"","",,,0 +11927,image/jpeg,0,0,,"","",,,0 +11928,image/jpeg,0,0,,"","",,,0 +11929,image/jpeg,0,0,,"","",,,0 +11930,image/jpeg,0,0,,"","",,,0 +11931,image/jpeg,0,0,,"","",,,0 +11932,image/jpeg,0,0,,"","",,,0 +11933,image/jpeg,0,0,,"","",,,0 +11934,image/jpeg,0,0,,"","",,,0 +11935,image/jpeg,0,0,,"","",,,0 +11936,image/jpeg,0,0,,"","",,,0 +11937,image/jpeg,0,0,,"","",,,0 +11938,image/jpeg,0,0,,"","",,,0 +11939,image/jpeg,0,0,,"","",,,0 +11940,image/jpeg,0,0,,"","",,,0 +11941,image/jpeg,0,0,,"","",,,0 +11942,image/jpeg,0,0,,"","",,,0 +11943,image/jpeg,0,0,,"","",,,0 +11944,image/jpeg,0,0,,"","",,,0 +11945,image/jpeg,0,0,,"","",,,0 +11946,image/jpeg,0,0,,"","",,,0 +11947,image/jpeg,0,0,,"","",,,0 +11948,image/jpeg,0,0,,"","",,,0 +11949,image/jpeg,1575217385742,0,90,"","",44.2505359722222,12.082902,0 +11950,image/jpeg,1575217333189,0,0,"","",44.250455,12.082957,0 +11951,image/jpeg,1575194906303,0,0,"","",44.250629,12.082874,0 +11952,image/jpeg,0,0,,"","",,,0 +11953,image/jpeg,0,0,,"","",,,0 +11954,image/jpeg,1575116126158,0,90,"","",44.435071,11.6073859722222,0 +11955,image/jpeg,1575116100874,0,90,"","",44.435062,11.607245,0 +11956,image/jpeg,1575116065536,0,90,"","",44.435057,11.6074789722222,0 +11957,image/jpeg,0,0,,"","",,,0 +11958,image/jpeg,1574717219000,8,0,"","",44.2505833333333,12.0830972222222,0 +11959,image/jpeg,0,0,,"","",,,0 +11960,image/jpeg,0,0,,"","",,,0 +11961,image/jpeg,0,0,,"","",,,0 +11962,image/jpeg,1574521055079,0,90,"","",44.2448019722222,12.0812899722222,0 +11963,image/jpeg,0,0,,"","",,,0 +11964,image/jpeg,0,0,,"","",,,0 +11965,image/jpeg,1573914935855,0,0,"","",44.2506619722222,12.0828229722222,0 +11966,image/jpeg,1573914872310,0,90,"","",44.2504649722222,12.0821079722222,0 +11967,image/jpeg,1573905526963,0,0,"","",43.981216,11.216167,0 +11968,image/jpeg,1573905314564,0,90,"","",43.981219,11.2161749722222,0 +11969,image/jpeg,1573905308510,0,90,"","",43.981219,11.2161749722222,0 +11970,image/jpeg,1573764406761,0,0,"","",44.2505809722222,12.082921,0 +11971,image/jpeg,0,0,,"","",,,0 +11972,image/jpeg,1573386240896,0,90,"","",44.2295289722222,12.02599,0 +11973,image/jpeg,1573386227348,0,0,"","",44.2295429722222,12.02598,0 +11974,image/jpeg,1573386218659,0,0,"","",44.2296929722222,12.02593,0 +11975,image/jpeg,1573336915232,0,0,"","",44.157966,12.184801,0 +11976,image/jpeg,1573336824652,0,0,"","",44.157893,12.184893,0 +11977,image/jpeg,1573336807214,0,90,"","",44.157873,12.184908,0 +11978,image/jpeg,1573066505386,0,0,"","",44.250802,12.083225,0 +11979,image/jpeg,1573065827090,0,0,"","",44.2507179722222,12.0830339722222,0 +11980,image/jpeg,1572978832843,0,0,"","",44.250602,12.0827989722222,0 +11981,image/jpeg,0,0,,"","",,,0 +11982,image/jpeg,0,0,,"","",,,0 +11983,image/jpeg,0,0,,"","",,,0 +11984,image/jpeg,0,0,,"","",,,0 +11985,image/jpeg,0,0,,"","",,,0 +11986,image/jpeg,0,0,,"","",,,0 +11987,image/jpeg,0,0,,"","",,,0 +11988,image/jpeg,0,0,,"","",,,0 +11989,image/jpeg,0,0,,"","",,,0 +11990,image/jpeg,0,0,,"","",,,0 +11991,image/jpeg,0,0,,"","",,,0 +11992,image/jpeg,0,0,,"","",,,0 +11993,image/jpeg,0,0,,"","",,,0 +11994,image/jpeg,0,0,,"","",,,0 +11995,image/jpeg,0,0,,"","",,,0 +11996,image/jpeg,0,0,,"","",,,0 +11997,image/jpeg,0,0,,"","",,,0 +11998,image/jpeg,0,0,,"","",,,0 +11999,image/jpeg,0,0,,"","",,,0 +12000,image/jpeg,0,0,,"","",,,0 +12001,image/jpeg,0,0,,"","",,,0 +12002,image/jpeg,0,0,,"","",,,0 +12003,image/jpeg,0,0,,"","",,,0 +12004,image/jpeg,0,0,,"","",,,0 +12005,image/jpeg,0,0,,"","",,,0 +12006,image/jpeg,1572791410176,0,90,"","",41.9021729722222,12.4593749722222,0 +12007,image/jpeg,1572791283993,0,90,"","",41.899777,12.4561499722222,0 +12008,image/jpeg,1572791267897,0,0,"","",41.899777,12.4561499722222,0 +12009,image/jpeg,1572791264696,0,0,"","",41.899777,12.4561499722222,0 +12010,image/jpeg,1572791252105,0,90,"","",41.899214,12.4529259722222,0 +12011,image/jpeg,1572790900602,0,90,"","",41.901985,12.4582999722222,0 +12012,image/jpeg,1572782641767,0,0,"","",41.888925,12.4707419722222,0 +12013,image/jpeg,1572782635291,0,0,"","",41.888925,12.4707419722222,0 +12014,image/jpeg,1572781780093,0,0,"","",41.8889199722222,12.470662,0 +12015,image/jpeg,1572777014451,0,90,"","",41.895085,12.4827989722222,0 +12016,image/jpeg,1572776961119,0,90,"","",41.8953079722222,12.482824,0 +12017,image/jpeg,1572717285118,0,90,"","",41.8996989722222,12.4537919722222,0 +12018,image/jpeg,1572717280784,0,90,"","",41.899686,12.4537899722222,0 +12019,image/jpeg,1572717218060,0,90,"","",41.8996819722222,12.4537759722222,0 +12020,image/jpeg,1572717142686,0,270,"","",41.899664,12.453763,0 +12021,image/jpeg,0,0,,"","",,,0 +12022,image/jpeg,0,0,,"","",,,0 +12023,image/jpeg,1572709853033,0,0,"","",41.9043029722222,12.4542549722222,0 +12024,image/jpeg,1572709841192,0,90,"","",41.9044269722222,12.454342,0 +12025,image/jpeg,1572709728046,0,90,"","",41.9045759722222,12.454292,0 +12026,image/jpeg,0,0,,"","",,,0 +12027,image/jpeg,1572690905771,0,0,"","",41.909457,12.4802219722222,0 +12028,image/jpeg,1572690891476,0,0,"","",41.909489,12.4802549722222,0 +12029,image/jpeg,1572689595215,0,0,"","",41.906483,12.4830109722222,0 +12030,image/jpeg,1572689586543,0,90,"","",41.90648,12.4829989722222,0 +12031,image/jpeg,0,0,,"","",,,0 +12032,image/jpeg,1572640627813,0,0,"","",,,0 +12033,image/jpeg,1572640623683,0,0,"","",,,0 +12034,image/jpeg,1572640616223,0,0,"","",,,0 +12035,image/jpeg,1572639420610,0,0,"","",,,0 +12036,image/jpeg,1572639418717,0,0,"","",,,0 +12037,image/jpeg,1572635746999,0,0,"","",41.902231,12.466414,0 +12038,image/jpeg,1572630991834,0,90,"","",41.900491,12.4552859722222,0 +12039,image/jpeg,1572630938640,0,90,"","",41.900742,12.455232,0 +12040,image/jpeg,1572630192041,0,0,"","",41.9016379722222,12.4573739722222,0 +12041,image/jpeg,1572630147552,0,0,"","",41.901727,12.457423,0 +12042,image/jpeg,1572630137331,0,90,"","",41.901724,12.4573979722222,0 +12043,image/jpeg,1572630115748,0,0,"","",41.9018069722222,12.45738,0 +12044,image/jpeg,1572629963118,0,0,"","",41.9018909722222,12.458099,0 +12045,image/jpeg,1572629923841,0,0,"","",41.9019639722222,12.45805,0 +12046,image/jpeg,1572629870000,0,0,"","",41.9019338888889,12.4580775,0 +12047,image/jpeg,1572620776025,0,0,"","",41.885741,12.4848549722222,0 +12048,image/jpeg,1572620774205,0,0,"","",41.885742,12.484854,0 +12049,image/jpeg,1572620766479,0,90,"","",41.885728,12.4848549722222,0 +12050,image/jpeg,1572620765177,0,90,"","",41.885733,12.484856,0 +12051,image/jpeg,1572620747489,0,90,"","",41.885722,12.484847,0 +12052,image/jpeg,1572616779732,0,0,"","",41.894727,12.4833189722222,0 +12053,image/jpeg,1572616630000,0,0,"","",41.8946852777778,12.4833677777778,0 +12054,image/jpeg,1572616597000,0,0,"","",41.8946897222222,12.48332,0 +12055,image/jpeg,1572616556412,0,0,"","",41.89466,12.4833619722222,0 +12056,image/jpeg,1572616464316,0,90,"","",41.894747,12.483601,0 +12057,image/jpeg,1572616388873,0,90,"","",41.8946929722222,12.4837969722222,0 +12058,image/jpeg,1572616382210,0,90,"","",41.8947029722222,12.483809,0 +12059,image/jpeg,1572616269921,0,90,"","",41.8944929722222,12.4838599722222,0 +12060,image/jpeg,1572616260967,0,0,"","",41.894497,12.483855,0 +12061,image/jpeg,1572616198233,0,0,"","",41.8944559722222,12.4839099722222,0 +12062,image/jpeg,1572616182260,0,90,"","",41.8944639722222,12.4838959722222,0 +12063,image/jpeg,1572616158005,0,90,"","",41.8944059722222,12.4839289722222,0 +12064,image/jpeg,1572616134421,0,90,"","",41.8944649722222,12.4838679722222,0 +12065,image/jpeg,1572615934081,0,0,"","",41.894247,12.4839859722222,0 +12066,image/jpeg,1572615871000,0,0,"","",41.8942980555556,12.4838663888889,0 +12067,image/jpeg,1572612658889,0,90,"","",41.895301,12.4834929722222,0 +12068,image/jpeg,1572612656769,0,90,"","",41.895301,12.4834929722222,0 +12069,image/jpeg,1572609338587,0,0,"","",41.9008109722222,12.4832249722222,0 +12070,image/jpeg,1572609331332,0,90,"","",41.900812,12.4832199722222,0 +12071,image/jpeg,1572609087979,0,0,"","",41.9008419722222,12.4831819722222,0 +12072,image/jpeg,1572609087657,0,0,"","",41.9008419722222,12.4831819722222,0 +12073,image/jpeg,1572608990000,0,0,"","",41.9008052777778,12.4831691666667,0 +12074,image/jpeg,1572608982596,0,0,"","",41.900803,12.483166,0 +12075,image/jpeg,1572606542534,0,90,"","",41.898901,12.472891,0 +12076,image/jpeg,1572606522528,0,90,"","",41.898901,12.472922,0 +12077,image/jpeg,1572606511357,0,90,"","",41.898907,12.472939,0 +12078,image/jpeg,1572606453134,0,90,"","",41.8990239722222,12.4730849722222,0 +12079,image/jpeg,1572606441795,0,90,"","",41.8990179722222,12.4730769722222,0 +12080,image/jpeg,1572606276549,0,0,"","",41.899771,12.472894,0 +12081,image/jpeg,1572605427750,0,90,"","",41.9014439722222,12.4665269722222,0 +12082,image/jpeg,1572605010619,0,0,"","",41.901595,12.464009,0 +12083,image/jpeg,1572605005618,0,90,"","",41.9016039722222,12.4640149722222,0 +12084,image/jpeg,1572605002493,0,90,"","",41.9016209722222,12.464028,0 +12085,image/jpeg,0,0,,"","",,,0 +12086,image/jpeg,0,0,,"","",,,0 +12087,image/jpeg,1572553759041,0,0,"","",43.066163,12.54906,0 +12088,image/jpeg,0,0,,"","",,,0 +12089,image/jpeg,0,0,,"","",,,0 +12090,image/jpeg,0,0,,"","",,,0 +12091,image/jpeg,0,0,,"","",,,0 +12092,image/jpeg,0,0,,"","",,,0 +12093,image/jpeg,0,0,,"","",,,0 +12094,image/jpeg,0,0,,"","",,,0 +12095,image/jpeg,0,0,,"","",,,0 +12096,image/jpeg,0,0,,"","",,,0 +12097,image/jpeg,0,0,,"","",,,0 +12098,image/jpeg,0,0,,"","",,,0 +12099,image/jpeg,0,0,,"","",,,0 +12100,image/jpeg,0,0,,"","",,,0 +12101,image/jpeg,0,0,,"","",,,0 +12102,image/jpeg,0,0,,"","",,,0 +12103,image/jpeg,0,0,,"","",,,0 +12104,image/jpeg,0,0,,"","",,,0 +12105,image/jpeg,0,0,,"","",,,0 +12106,image/jpeg,0,0,,"","",,,0 +12107,image/jpeg,0,0,,"","",,,0 +12108,image/jpeg,0,0,,"","",,,0 +12109,image/jpeg,0,0,,"","",,,0 +12110,image/jpeg,0,0,,"","",,,0 +12111,image/jpeg,0,0,,"","",,,0 +12112,image/jpeg,0,0,,"","",,,0 +12113,image/jpeg,0,0,,"","",,,0 +12114,image/jpeg,0,0,,"","",,,0 +12115,image/jpeg,0,0,,"","",,,0 +12116,image/jpeg,0,0,,"","",,,0 +12117,image/jpeg,0,0,,"","",,,0 +12118,image/jpeg,0,0,,"","",,,0 +12119,image/jpeg,1572104216746,0,90,"","",46.051084,12.49544,0 +12120,image/jpeg,1572104187852,0,0,"","",46.05107,12.495537,0 +12121,image/jpeg,0,0,,"","",,,0 +12122,image/jpeg,1571596259266,0,0,"","",44.1999279722222,12.395946,0 +12123,image/jpeg,1571594071175,0,90,"","",44.199927,12.3959499722222,0 +12124,image/jpeg,1571575986000,0,0,"","",43.865225,12.2068475,0 +12125,image/jpeg,1571337049920,0,0,"","",44.2063229722222,12.076375,0 +12126,image/jpeg,0,0,,"","",,,0 +12127,image/jpeg,0,0,,"","",,,0 +12128,image/jpeg,0,0,,"","",,,0 +12129,image/jpeg,0,0,,"","",,,0 +12130,image/jpeg,0,0,,"","",,,0 +12131,image/jpeg,0,0,,"","",,,0 +12132,image/jpeg,0,0,,"","",,,0 +12133,image/jpeg,1570899808174,0,0,"","",44.25059,12.082888,0 +12134,image/jpeg,1570894403138,0,90,"","",44.2505639722222,12.0828919722222,0 +12135,image/jpeg,1570894375788,0,90,"","",44.250635,12.0829579722222,0 +12136,image/jpeg,1570894287337,0,0,"","",44.2508309722222,12.082902,0 +12137,image/jpeg,1570894285332,0,0,"","",44.251094,12.0827709722222,0 +12138,image/jpeg,0,0,,"","",,,0 +12139,image/jpeg,1570476248525,0,0,"","",44.25063,12.0828679722222,0 +12140,image/jpeg,0,0,,"","",,,0 +12141,image/jpeg,0,0,,"","",,,0 +12142,image/jpeg,0,0,,"","",,,0 +12143,image/jpeg,1570479693000,0,,"","",,,0 +12144,image/jpeg,1570477227764,0,180,"","",44.250084,12.0832779722222,0 +12145,image/jpeg,1570477222475,0,180,"","",44.2500459722222,12.083351,0 +12146,image/jpeg,1570476248525,0,0,"","",44.25063,12.0828679722222,0 +12147,image/jpeg,0,0,,"","",,,0 +12148,image/jpeg,0,0,,"","",,,0 +12149,image/jpeg,1570284921957,0,90,"","",45.9662519722222,12.6417369722222,0 +12150,image/jpeg,0,0,,"","",,,0 +12151,image/jpeg,0,0,,"","",,,0 +12152,image/jpeg,0,0,,"","",,,0 +12153,image/jpeg,0,0,,"","",,,0 +12154,image/jpeg,0,0,,"","",,,0 +12155,image/jpeg,0,0,,"","",,,0 +12156,image/jpeg,0,0,,"","",,,0 +12157,image/jpeg,0,0,,"","",,,0 +12158,image/jpeg,0,0,,"","",,,0 +12159,image/jpeg,1569959032720,0,0,"","",44.2505069722222,12.083016,0 +12160,image/jpeg,1569860239121,0,90,"","",44.2506219722222,12.082857,0 +12161,image/jpeg,1569859188852,0,0,"","",44.250739,12.082893,0 +12162,image/jpeg,0,0,,"","",,,0 +12163,image/jpeg,1569650776872,0,0,"","",44.2238979722222,12.0361489722222,0 +12164,image/jpeg,1569618030408,0,0,"","",44.113702,12.4223759722222,0 +12165,image/jpeg,1569617931289,0,90,"","",44.1136959722222,12.4223809722222,0 +12166,image/jpeg,1569617770772,0,90,"","",44.1136759722222,12.422408,0 +12167,image/jpeg,1569516965197,0,90,"","",44.2307599722222,12.067923,0 +12168,image/jpeg,1569263758876,0,90,"","",44.2505949722222,12.0828729722222,0 +12169,image/png,0,0,,"","",,,0 +12170,image/jpeg,1569060527055,0,90,"","",44.149515,12.1355789722222,0 +12171,image/jpeg,1569060493458,0,90,"","",44.149509,12.135564,0 +12172,image/jpeg,1569060493562,0,90,"","",44.1495129722222,12.135564,0 +12173,image/jpeg,1569059713225,0,0,"","",44.149393,12.1335929722222,0 +12174,image/jpeg,1569059707750,0,0,"","",44.149391,12.13357,0 +12175,image/jpeg,0,0,,"","",,,0 +12176,image/jpeg,0,0,,"","",,,0 +12177,image/jpeg,0,0,,"","",,,0 +12178,image/jpeg,0,0,,"","",,,0 +12179,image/jpeg,1569002174963,0,90,"","",44.1846299722222,12.0356989722222,0 +12180,image/jpeg,1569002170253,0,0,"","",44.1846299722222,12.0356989722222,0 +12181,image/png,0,0,,"","",,,0 +12182,image/jpeg,0,0,,"","",,,0 +12183,image/jpeg,0,0,,"","",,,0 +12184,image/jpeg,0,0,,"","",,,0 +12185,image/jpeg,1568485613732,0,90,"","",44.2293629722222,12.0258789722222,0 +12186,image/jpeg,1567949572590,0,,"","",43.400587,12.9627639722222,0 +12187,image/jpeg,1568188217349,0,90,"","",44.24213,11.9953099722222,0 +12188,image/jpeg,1567949579770,0,0,"","",43.400587,12.9627639722222,0 +12189,image/jpeg,1567949572590,0,0,"","",43.400587,12.9627639722222,0 +12190,image/jpeg,1567949559844,0,90,"","",43.402765,12.9759779722222,0 +12191,image/jpeg,1567945412338,0,90,"","",43.4028279722222,12.9750189722222,0 +12192,image/jpeg,1567945408192,0,90,"","",43.4028059722222,12.975151,0 +12193,image/jpeg,1567945408424,0,90,"","",43.4027949722222,12.97513,0 +12194,image/jpeg,1567944214857,0,0,"","",43.4025779722222,12.975186,0 +12195,image/jpeg,1567944185053,0,0,"","",43.4025999722222,12.975186,0 +12196,image/jpeg,1567944175983,0,0,"","",43.402594,12.9751949722222,0 +12197,image/jpeg,1567944021642,0,0,"","",43.4025669722222,12.9752469722222,0 +12198,image/jpeg,1567944020111,0,0,"","",43.402566,12.975246,0 +12199,image/jpeg,1567867390354,0,90,"","",44.216757,12.03039,0 +12200,image/jpeg,1567867390886,0,90,"","",44.216757,12.03039,0 +12201,image/jpeg,1567867388513,0,90,"","",44.2167209722222,12.030405,0 +12202,image/jpeg,1567867387349,0,90,"","",44.216332,12.030281,0 +12203,image/jpeg,1567867293658,0,0,"","",44.216805,12.030298,0 +12204,image/jpeg,1567867287749,0,0,"","",44.2168149722222,12.030291,0 +12205,image/jpeg,1567867275632,0,90,"","",44.2168199722222,12.0302579722222,0 +12206,image/jpeg,1567867272581,0,90,"","",44.2168089722222,12.0302559722222,0 +12207,image/jpeg,1567867264894,0,90,"","",44.2168119722222,12.0302869722222,0 +12208,image/jpeg,1567867260207,0,90,"","",44.2167469722222,12.030236,0 +12209,image/jpeg,1567862476084,0,90,"","",44.25063,12.0828649722222,0 +12210,image/jpeg,1567862474688,0,90,"","",44.25063,12.0828649722222,0 +12211,image/jpeg,1567862456349,0,90,"","",44.25063,12.0828649722222,0 +12212,image/jpeg,1567862454066,0,90,"","",44.25063,12.0828649722222,0 +12213,image/jpeg,0,0,,"","",,,0 +12214,image/jpeg,1567783173942,0,90,"","",44.913079,11.5758449722222,0 +12215,image/jpeg,1567782156081,0,90,"","",45.1529469722222,11.775408,0 +12216,image/jpeg,1567780608494,0,90,"","",45.443483,12.060558,0 +12217,image/jpeg,1567713461000,0,0,"","",45.8604519444444,12.2488719444444,0 +12218,image/jpeg,1567713438000,0,0,"","",45.8604158333333,12.2489327777778,0 +12219,image/jpeg,1567713357393,0,0,"","",45.860415,12.2489019722222,0 +12220,image/jpeg,1567708406140,0,0,"","",45.8665499722222,12.248808,0 +12221,image/png,0,0,,"","",,,0 +12222,image/jpeg,1567702413064,0,0,"","",45.8661079722222,12.196956,0 +12223,image/jpeg,1567700946000,0,0,"","",45.8592008333333,12.2207922222222,0 +12224,image/jpeg,0,0,,"","",,,0 +12225,image/jpeg,1567664159000,0,0,"","",45.8605413888889,12.2487997222222,0 +12226,image/jpeg,1567663560667,0,0,"","",45.8605019722222,12.2487829722222,0 +12227,image/jpeg,1567663543740,0,0,"","",45.8605009722222,12.24878,0 +12228,image/jpeg,1567663009234,0,0,"","",45.86081,12.248177,0 +12229,image/jpeg,1567662990379,0,0,"","",45.860798,12.248157,0 +12230,image/jpeg,1567662684145,0,0,"","",45.860829,12.2490939722222,0 +12231,image/jpeg,1567612899104,0,0,"","",45.901251,12.031688,0 +12232,image/jpeg,1567612686094,0,0,"","",45.9012249722222,12.031408,0 +12233,image/jpeg,1567612679791,0,0,"","",45.9012239722222,12.031406,0 +12234,image/jpeg,1567612657203,0,0,"","",45.9012389722222,12.031385,0 +12235,image/jpeg,1567612641201,0,0,"","",45.901248,12.0313809722222,0 +12236,image/jpeg,1567612627238,0,0,"","",45.9012499722222,12.031397,0 +12237,image/jpeg,1567612608498,0,0,"","",45.9013429722222,12.0314589722222,0 +12238,image/jpeg,1567612598560,0,0,"","",45.901349,12.031446,0 +12239,image/jpeg,1567612596819,0,0,"","",45.901363,12.031435,0 +12240,image/jpeg,1567612478187,0,0,"","",45.901412,12.0318179722222,0 +12241,image/jpeg,1567612427052,0,90,"","",45.901457,12.0317699722222,0 +12242,image/jpeg,1567612424313,0,90,"","",45.901457,12.031783,0 +12243,image/jpeg,0,0,0,"","",,,0 +12244,image/jpeg,1567612398904,0,0,"","",45.901608,12.032007,0 +12245,image/jpeg,1567611691603,0,0,"","",45.9018799722222,12.03231,0 +12246,image/jpeg,1567611379000,0,0,"","",45.9018747222222,12.0323430555556,0 +12247,image/jpeg,1567611372300,0,0,"","",45.901836,12.0323349722222,0 +12248,image/jpeg,1567609300640,0,90,"","",,,0 +12249,image/jpeg,0,0,,"","",,,0 +12250,image/jpeg,1567338657274,0,180,"","",45.3490919722222,11.787356,0 +12251,image/jpeg,1567332684697,0,0,"","",45.3487969722222,11.7879939722222,0 +12252,image/jpeg,1567332681360,0,0,"","",45.348683,11.7878229722222,0 +12253,image/jpeg,1567260362250,0,0,"","",45.3490159722222,11.787971,0 +12254,image/jpeg,0,0,,"","",,,0 +12255,image/jpeg,0,0,,"","",,,0 +12256,image/jpeg,0,0,,"","",,,0 +12257,image/jpeg,0,0,,"","",,,0 +12258,image/jpeg,1566921112009,0,0,"","",44.2238169722222,12.028759,0 +12259,image/jpeg,1566921017969,0,270,"","",44.223855,12.0287369722222,0 +12260,image/jpeg,1566920994478,0,90,"","",44.223866,12.028717,0 +12261,image/jpeg,1566920667517,0,180,"","",44.2237849722222,12.028722,0 +12262,image/jpeg,1566904402371,0,90,"","",44.2247249722222,12.0822939722222,0 +12263,image/jpeg,1566904174401,0,90,"","",44.2246999722222,12.0821699722222,0 +12264,image/jpeg,0,0,,"","",,,0 +12265,image/jpeg,0,0,,"","",,,0 +12266,image/jpeg,0,0,,"","",,,0 +12267,image/jpeg,0,0,,"","",,,0 +12268,image/jpeg,0,0,,"","",,,0 +12269,image/jpeg,0,0,,"","",,,0 +12270,image/jpeg,0,0,,"","",,,0 +12271,image/jpeg,0,0,,"","",,,0 +12272,image/jpeg,0,0,,"","",,,0 +12273,image/jpeg,0,0,,"","",,,0 +12274,image/jpeg,0,0,,"","",,,0 +12275,image/jpeg,0,0,,"","",,,0 +12276,image/jpeg,0,0,,"","",,,0 +12277,image/jpeg,0,0,,"","",,,0 +12278,image/jpeg,0,0,,"","",,,0 +12279,image/jpeg,0,0,,"","",,,0 +12280,image/jpeg,0,0,,"","",,,0 +12281,image/jpeg,0,0,,"","",,,0 +12282,image/jpeg,0,0,,"","",,,0 +12283,image/jpeg,0,0,,"","",,,0 +12284,image/jpeg,0,0,,"","",,,0 +12285,image/jpeg,0,0,,"","",,,0 +12286,image/jpeg,0,0,,"","",,,0 +12287,image/jpeg,0,0,,"","",,,0 +12288,image/jpeg,0,0,,"","",,,0 +12289,image/jpeg,0,0,,"","",,,0 +12290,image/jpeg,0,0,,"","",,,0 +12291,image/jpeg,0,0,,"","",,,0 +12292,image/jpeg,0,0,,"","",,,0 +12293,image/jpeg,0,0,,"","",,,0 +12294,image/jpeg,1566669104312,0,90,"","",44.2506569722222,12.083068,0 +12295,image/jpeg,1566654106325,0,90,"","",43.9140149722222,12.57118,0 +12296,image/jpeg,1566654090860,0,90,"","",43.9140099722222,12.571189,0 +12297,image/jpeg,0,0,,"","",,,0 +12298,image/jpeg,0,0,,"","",,,0 +12299,image/jpeg,0,0,,"","",,,0 +12300,image/jpeg,1566488738982,0,90,"","",44.250554,12.0827519722222,0 +12301,image/png,0,0,,"","",,,0 +12302,image/jpeg,1566381382556,0,90,"","",43.944965,12.8361359722222,0 +12303,image/jpeg,1566380256400,0,0,"","",43.9561139722222,12.809046,0 +12304,image/jpeg,1566379420000,0,0,"","",43.9611602777778,12.7985125,0 +12305,image/jpeg,1566379467379,0,0,"","",43.9611969722222,12.7985249722222,0 +12306,image/jpeg,1566379464440,0,0,"","",43.961196,12.798526,0 +12307,image/jpeg,1566378855530,0,90,"","",43.963799,12.794581,0 +12308,image/jpeg,1566379091214,0,0,"","",43.9630969722222,12.7958619722222,0 +12309,image/jpeg,1566379459650,0,0,"","",43.9611909722222,12.798533,0 +12310,image/jpeg,1566378570935,0,0,"","",43.963746,12.7930089722222,0 +12311,image/jpeg,1566374298280,0,0,"","",43.95617,12.7313679722222,0 +12312,image/jpeg,1566374295882,0,0,"","",43.956175,12.73136,0 +12313,image/jpeg,1566374292836,0,0,"","",43.9561759722222,12.7313469722222,0 +12314,image/jpeg,1566309470935,0,0,"","",44.2506109722222,12.082902,0 +12315,image/jpeg,0,0,,"","",,,0 +12316,image/jpeg,1566295075975,0,0,"","",44.2506059722222,12.082895,0 +12317,image/jpeg,1566242921659,0,90,"","",44.1638329722222,12.152751,0 +12318,image/jpeg,1566242866704,0,90,"","",44.163812,12.1527569722222,0 +12319,image/png,0,0,,"","",,,0 +12320,image/jpeg,0,0,,"","",,,0 +12321,image/jpeg,0,0,,"","",,,0 +12322,image/jpeg,0,0,,"","",,,0 +12323,image/jpeg,0,0,,"","",,,0 +12324,image/jpeg,0,0,,"","",,,0 +12325,image/jpeg,0,0,,"","",,,0 +12326,image/jpeg,0,0,,"","",,,0 +12327,image/jpeg,0,0,,"","",,,0 +12328,image/jpeg,0,0,,"","",,,0 +12329,image/jpeg,0,0,,"","",,,0 +12330,image/jpeg,0,0,,"","",,,0 +12331,image/jpeg,0,0,,"","",,,0 +12332,image/jpeg,0,0,,"","",,,0 +12333,image/jpeg,0,0,,"","",,,0 +12334,image/jpeg,0,0,,"","",,,0 +12335,image/jpeg,0,0,,"","",,,0 +12336,image/jpeg,0,0,,"","",,,0 +12337,image/jpeg,1566135643275,0,0,"","",44.241678,12.143083,0 +12338,image/jpeg,0,0,,"","",,,0 +12339,image/jpeg,0,0,,"","",,,0 +12340,image/jpeg,1566125386681,0,90,"","",44.3142679722222,12.137408,0 +12341,image/jpeg,1566125382836,0,90,"","",44.31427,12.137408,0 +12342,image/jpeg,1566125322551,0,90,"","",44.3142629722222,12.1374309722222,0 +12343,image/jpeg,1566125299265,0,90,"","",44.314255,12.1374119722222,0 +12344,image/jpeg,0,0,,"","",,,0 +12345,image/jpeg,0,0,,"","",,,0 +12346,image/jpeg,0,0,,"","",,,0 +12347,image/jpeg,0,0,,"","",,,0 +12348,image/jpeg,0,0,,"","",,,0 +12349,image/jpeg,0,0,,"","",,,0 +12350,image/jpeg,1565949399674,0,,"","",,,0 +12351,image/jpeg,1565949430477,0,0,"","",46.629333,12.3377359722222,0 +12352,image/jpeg,1565949442968,0,0,"","",46.629334,12.337747,0 +12353,image/jpeg,1565949447079,0,0,"","",46.629339,12.3377339722222,0 +12354,image/jpeg,1565949459784,0,0,"","",46.629342,12.3377259722222,0 +12355,image/jpeg,1565949496524,0,0,"","",46.6293349722222,12.3377219722222,0 +12356,image/jpeg,1565949501797,0,0,"","",46.629333,12.3377149722222,0 +12357,image/jpeg,1565949501797,0,0,"","",46.629333,12.3377149722222,0 +12358,image/jpeg,1565949505835,0,0,"","",46.629327,12.337716,0 +12359,image/jpeg,1565949505835,0,0,"","",46.629327,12.337716,0 +12360,image/jpeg,1565949505835,0,0,"","",46.629327,12.337716,0 +12361,image/jpeg,1565949505835,0,0,"","",46.629327,12.337716,0 +12362,image/jpeg,1565949505835,0,0,"","",46.629327,12.337716,0 +12363,image/jpeg,1565949505835,0,0,"","",46.629327,12.337716,0 +12364,image/jpeg,1565949505835,0,0,"","",46.629327,12.337716,0 +12365,image/jpeg,1565949505835,0,0,"","",46.629327,12.337716,0 +12366,image/jpeg,0,0,,"","",,,0 +12367,image/jpeg,0,0,,"","",,,0 +12368,image/jpeg,0,0,,"","",,,0 +12369,image/jpeg,0,0,,"","",,,0 +12370,image/jpeg,0,0,,"","",,,0 +12371,image/jpeg,0,0,,"","",,,0 +12372,image/jpeg,0,0,,"","",,,0 +12373,image/jpeg,0,0,,"","",,,0 +12374,image/jpeg,0,0,,"","",,,0 +12375,image/jpeg,0,0,,"","",,,0 +12376,image/jpeg,0,0,,"","",,,0 +12377,image/jpeg,0,0,,"","",,,0 +12378,image/jpeg,0,0,,"","",,,0 +12379,image/jpeg,0,0,,"","",,,0 +12380,image/jpeg,0,0,,"","",,,0 +12381,image/jpeg,0,0,,"","",,,0 +12382,image/jpeg,0,0,,"","",,,0 +12383,image/jpeg,0,0,,"","",,,0 +12384,image/jpeg,0,0,,"","",,,0 +12385,image/jpeg,0,0,,"","",,,0 +12386,image/jpeg,1566038494396,0,0,"","",46.571069,12.26675,0 +12387,image/jpeg,0,0,,"","",,,0 +12388,image/jpeg,1566036512932,0,90,"","",46.5668119722222,12.2686589722222,0 +12389,image/jpeg,0,0,,"","",,,0 +12390,image/jpeg,0,0,,"","",,,0 +12391,image/jpeg,1566035184693,0,90,"","",46.560965,12.2775409722222,0 +12392,image/jpeg,1566035171565,0,90,"","",46.561162,12.277585,0 +12393,image/jpeg,1566033852636,0,90,"","",46.560332,12.2855279722222,0 +12394,image/jpeg,0,0,,"","",,,0 +12395,image/jpeg,0,0,,"","",,,0 +12396,image/jpeg,0,0,,"","",,,0 +12397,image/jpeg,0,0,,"","",,,0 +12398,image/jpeg,1566033099768,0,0,"","",46.5628209722222,12.29086,0 +12399,image/jpeg,1566033085325,0,0,"","",46.562797,12.290848,0 +12400,image/jpeg,1566033076202,0,0,"","",46.56284,12.2908089722222,0 +12401,image/jpeg,1566032806587,0,90,"","",46.562317,12.2909,0 +12402,image/jpeg,1566031894987,0,90,"","",46.562336,12.290865,0 +12403,image/jpeg,1566031616616,0,0,"","",46.561815,12.2909319722222,0 +12404,image/jpeg,1566031612950,0,0,"","",46.56181,12.290914,0 +12405,image/jpeg,1566031609907,0,0,"","",46.561691,12.290903,0 +12406,image/jpeg,1566031571079,0,0,"","",46.561635,12.290891,0 +12407,image/jpeg,1566031561346,0,0,"","",46.5616709722222,12.2907399722222,0 +12408,image/jpeg,0,0,,"","",,,0 +12409,image/jpeg,1566028443434,0,90,"","",46.566873,12.26894,0 +12410,image/jpeg,0,0,,"","",,,0 +12411,image/jpeg,1566026771746,0,90,"","",46.570745,12.2668339722222,0 +12412,image/jpeg,0,0,,"","",,,0 +12413,image/jpeg,0,0,,"","",,,0 +12414,image/jpeg,0,0,,"","",,,0 +12415,image/jpeg,0,0,,"","",,,0 +12416,image/jpeg,0,0,,"","",,,0 +12417,image/jpeg,1565982814282,0,0,"","",46.5368819722222,12.137641,0 +12418,image/jpeg,1565982814282,0,0,"","",46.5368819722222,12.137641,0 +12419,image/jpeg,0,0,,"","",,,0 +12420,image/jpeg,0,0,,"","",,,0 +12421,image/jpeg,0,0,,"","",,,0 +12422,image/jpeg,0,0,,"","",,,0 +12423,image/jpeg,0,0,,"","",,,0 +12424,image/jpeg,0,0,,"","",,,0 +12425,image/jpeg,0,0,,"","",,,0 +12426,image/jpeg,0,0,,"","",,,0 +12427,image/jpeg,0,0,,"","",,,0 +12428,image/jpeg,0,0,,"","",,,0 +12429,image/jpeg,0,0,,"","",,,0 +12430,image/jpeg,1565959018000,0,0,"","",46.63677,12.3105630555556,0 +12431,image/jpeg,1565958794149,0,0,"","",46.6367809722222,12.3105679722222,0 +12432,image/jpeg,1565958789121,0,0,"","",46.6368059722222,12.310594,0 +12433,image/jpeg,1565957627337,0,0,"","",46.636955,12.3111139722222,0 +12434,image/jpeg,1565955944912,0,90,"","",46.631813,12.32737,0 +12435,image/jpeg,1565955940033,0,0,"","",46.63179,12.3274279722222,0 +12436,image/jpeg,1565955877913,0,90,"","",46.631739,12.3275609722222,0 +12437,image/jpeg,1565955871092,0,90,"","",46.6317349722222,12.3275629722222,0 +12438,image/jpeg,1565955650543,0,0,"","",46.632615,12.3300059722222,0 +12439,image/jpeg,1565955642674,0,0,"","",46.632998,12.329746,0 +12440,image/jpeg,1565955341658,0,0,"","",46.632564,12.3328839722222,0 +12441,image/jpeg,1565955334633,0,0,"","",46.632556,12.332881,0 +12442,image/jpeg,1565955329419,0,0,"","",46.6325599722222,12.33289,0 +12443,image/jpeg,1565954488776,0,0,"","",46.630271,12.336308,0 +12444,image/jpeg,1565954486584,0,90,"","",46.6302659722222,12.3363069722222,0 +12445,image/jpeg,1565954167170,0,90,"","",46.6293599722222,12.337203,0 +12446,image/jpeg,1565953170320,0,0,"","",46.6308549722222,12.342076,0 +12447,image/jpeg,1565953009000,0,0,"","",46.6019452777778,12.2736780555556,0 +12448,image/jpeg,1565952813088,0,0,"","",46.631484,12.341374,0 +12449,image/jpeg,1565951656864,0,0,"","",46.6315159722222,12.3412369722222,0 +12450,image/jpeg,1565951175621,0,90,"","",46.631577,12.341286,0 +12451,image/jpeg,1565951172318,0,90,"","",46.6315329722222,12.34126,0 +12452,image/jpeg,1565951168528,0,90,"","",46.631478,12.3412389722222,0 +12453,image/jpeg,1565950225196,0,0,"","",46.630834,12.340467,0 +12454,image/jpeg,1565950107105,0,90,"","",46.6309409722222,12.339674,0 +12455,image/jpeg,1565950098149,0,0,"","",46.63094,12.3396609722222,0 +12456,image/jpeg,1565950092896,0,0,"","",46.6309499722222,12.3396629722222,0 +12457,image/jpeg,1565950085346,0,0,"","",46.630979,12.339624,0 +12458,image/jpeg,1565949854311,0,0,"","",46.6303339722222,12.338699,0 +12459,image/jpeg,1565949849984,0,0,"","",,,0 +12460,image/jpeg,1565949505835,0,0,"","",46.629327,12.337716,0 +12461,image/jpeg,1565949501797,0,0,"","",46.629333,12.3377149722222,0 +12462,image/jpeg,1565949496524,0,0,"","",46.6293349722222,12.3377219722222,0 +12463,image/jpeg,1565949459784,0,0,"","",46.629342,12.3377259722222,0 +12464,image/jpeg,1565949447079,0,90,"","",46.629339,12.3377339722222,0 +12465,image/jpeg,1565949442968,0,90,"","",46.629334,12.337747,0 +12466,image/jpeg,1565949436674,0,90,"","",46.62933,12.3377359722222,0 +12467,image/jpeg,1565949430477,0,90,"","",46.629333,12.3377359722222,0 +12468,image/jpeg,1565949399674,0,0,"","",46.6293599722222,12.3378019722222,0 +12469,image/jpeg,1565948218819,0,0,"","",46.62675,12.3421599722222,0 +12470,image/jpeg,1565947461602,0,0,"","",46.625053,12.34022,0 +12471,image/jpeg,1565947440909,0,0,"","",46.6250769722222,12.340151,0 +12472,image/jpeg,1565947379149,0,90,"","",46.6250679722222,12.340182,0 +12473,image/jpeg,1565947374640,0,0,"","",46.625103,12.34023,0 +12474,image/jpeg,1565946833076,0,90,"","",46.6244209722222,12.3353319722222,0 +12475,image/jpeg,1565944834005,0,0,"","",46.6197769722222,12.3201459722222,0 +12476,image/jpeg,1565943096504,0,90,"","",46.616869,12.3101289722222,0 +12477,image/jpeg,1565943091127,0,90,"","",46.6168979722222,12.3100769722222,0 +12478,image/jpeg,1565942102641,0,90,"","",46.6137099722222,12.299193,0 +12479,image/jpeg,1565942095828,0,90,"","",46.61372,12.299208,0 +12480,image/jpeg,1565942089221,0,90,"","",46.613798,12.2991569722222,0 +12481,image/jpeg,1565941796206,0,0,"","",46.6120799722222,12.2961379722222,0 +12482,image/jpeg,1565941788154,0,0,"","",46.612076,12.2961399722222,0 +12483,image/jpeg,1565941786870,0,0,"","",46.612073,12.2961329722222,0 +12484,image/jpeg,1565940367493,0,90,"","",46.5971639722222,12.268843,0 +12485,image/jpeg,1565940356074,0,90,"","",46.597144,12.268432,0 +12486,image/jpeg,1565940327878,0,90,"","",46.596854,12.268715,0 +12487,image/jpeg,1565940317091,0,0,"","",46.5968179722222,12.268712,0 +12488,image/jpeg,1565939787174,0,0,"","",46.5943159722222,12.264053,0 +12489,image/jpeg,1565938484187,0,0,"","",46.5839039722222,12.2536369722222,0 +12490,image/jpeg,1565938029722,0,0,"","",46.583908,12.253963,0 +12491,image/jpeg,1565938013061,0,0,"","",46.583933,12.253965,0 +12492,image/jpeg,0,0,,"","",,,0 +12493,image/jpeg,0,0,,"","",,,0 +12494,image/jpeg,0,0,,"","",,,0 +12495,image/jpeg,0,0,,"","",,,0 +12496,image/jpeg,0,0,,"","",,,0 +12497,image/jpeg,0,0,,"","",,,0 +12498,image/jpeg,0,0,,"","",,,0 +12499,image/jpeg,0,0,,"","",,,0 +12500,image/jpeg,0,0,,"","",,,0 +12501,image/jpeg,0,0,,"","",,,0 +12502,image/jpeg,0,0,,"","",,,0 +12503,image/jpeg,0,0,,"","",,,0 +12504,image/jpeg,0,0,,"","",,,0 +12505,image/jpeg,0,0,,"","",,,0 +12506,image/jpeg,0,0,,"","",,,0 +12507,image/jpeg,0,0,,"","",,,0 +12508,image/jpeg,0,0,,"","",,,0 +12509,image/jpeg,0,0,,"","",,,0 +12510,image/jpeg,0,0,,"","",,,0 +12511,image/jpeg,0,0,,"","",,,0 +12512,image/jpeg,0,0,,"","",,,0 +12513,image/jpeg,0,0,,"","",,,0 +12514,image/jpeg,0,0,,"","",,,0 +12515,image/jpeg,0,0,,"","",,,0 +12516,image/jpeg,0,0,,"","",,,0 +12517,image/jpeg,0,0,,"","",,,0 +12518,image/jpeg,0,0,,"","",,,0 +12519,image/jpeg,1565881824616,0,90,"","",46.554721,12.205139,0 +12520,image/jpeg,0,0,,"","",,,0 +12521,image/jpeg,0,0,,"","",,,0 +12522,image/jpeg,1565878121323,0,0,"","",46.5354269722222,12.227614,0 +12523,image/jpeg,1565877976750,0,90,"","",46.535324,12.2274899722222,0 +12524,image/jpeg,1565877962617,0,90,"","",46.5352979722222,12.2274689722222,0 +12525,image/jpeg,0,0,,"","",,,0 +12526,image/jpeg,0,0,,"","",,,0 +12527,image/jpeg,1565876078244,0,0,"","",46.5291229722222,12.2284939722222,0 +12528,image/jpeg,1565876065935,0,0,"","",46.529128,12.228471,0 +12529,image/jpeg,1565876059372,0,90,"","",46.529065,12.228495,0 +12530,image/jpeg,1565876053326,0,90,"","",46.5417449722222,12.3110409722222,0 +12531,image/jpeg,0,0,,"","",,,0 +12532,image/jpeg,0,0,,"","",,,0 +12533,image/jpeg,0,0,,"","",,,0 +12534,image/jpeg,1565875011653,0,90,"","",46.554298,12.2371639722222,0 +12535,image/jpeg,1565873854000,0,0,"","",46.5208680555556,12.2244844444444,0 +12536,image/jpeg,1565873835000,0,0,"","",46.5208461111111,12.2244952777778,0 +12537,image/jpeg,1565873825664,0,0,"","",46.5208719722222,12.2244879722222,0 +12538,image/jpeg,1565873822649,0,0,"","",46.5208889722222,12.224489,0 +12539,image/jpeg,1565873701859,0,0,"","",46.5208209722222,12.2248359722222,0 +12540,image/jpeg,1565873516430,0,0,"","",46.520794,12.224818,0 +12541,image/jpeg,1565873487973,0,0,"","",46.5208179722222,12.224837,0 +12542,image/jpeg,1565873485728,0,0,"","",46.5208179722222,12.2248339722222,0 +12543,image/jpeg,1565873477440,0,90,"","",46.5208069722222,12.224835,0 +12544,image/jpeg,1565873474432,0,90,"","",46.5207989722222,12.2248339722222,0 +12545,image/jpeg,1565873458052,0,0,"","",46.520791,12.2248269722222,0 +12546,image/jpeg,1565873455715,0,0,"","",46.520791,12.2248269722222,0 +12547,image/jpeg,1565873453948,0,0,"","",46.520791,12.2248269722222,0 +12548,image/jpeg,1565873213651,0,0,"","",46.5208939722222,12.2248689722222,0 +12549,image/jpeg,1565873212500,0,0,"","",46.5208969722222,12.2248719722222,0 +12550,image/jpeg,1565873189341,0,0,"","",46.5209759722222,12.224887,0 +12551,image/jpeg,1565873168774,0,0,"","",46.5209929722222,12.2248859722222,0 +12552,image/jpeg,1565873159884,0,0,"","",46.5209919722222,12.2248789722222,0 +12553,image/jpeg,1565872678175,0,0,"","",46.5217859722222,12.226646,0 +12554,image/jpeg,1565871910421,0,90,"","",,,0 +12555,image/jpeg,1565871901719,0,90,"","",,,0 +12556,image/jpeg,1565871838833,0,90,"","",,,0 +12557,image/jpeg,1565871835193,0,90,"","",,,0 +12558,image/jpeg,1565871833449,0,90,"","",,,0 +12559,image/jpeg,1565871831262,0,90,"","",,,0 +12560,image/jpeg,1565870750133,0,90,"","",46.5217779722222,12.2265359722222,0 +12561,image/jpeg,1565870744762,0,90,"","",46.521706,12.226573,0 +12562,image/jpeg,1565870618594,0,0,"","",46.5216849722222,12.2256669722222,0 +12563,image/jpeg,0,0,,"","",,,0 +12564,image/jpeg,1565866852000,0,0,"","",46.5366569444444,12.2272397222222,0 +12565,image/jpeg,1565866847089,0,0,"","",46.536647,12.227239,0 +12566,image/jpeg,1565866840006,0,0,"","",46.5367099722222,12.2272429722222,0 +12567,image/jpeg,0,0,,"","",,,0 +12568,image/jpeg,0,0,,"","",,,0 +12569,image/jpeg,1565864893898,0,90,"","",46.546022,12.2147489722222,0 +12570,image/jpeg,1565864882205,0,90,"","",46.546019,12.214724,0 +12571,image/jpeg,1565863947980,0,270,"","",46.551209,12.210553,0 +12572,image/jpeg,1565863909526,0,0,"","",46.5512129722222,12.210544,0 +12573,image/jpeg,1565863900767,0,0,"","",46.5511979722222,12.2105099722222,0 +12574,image/jpeg,0,0,,"","",,,0 +12575,image/jpeg,0,0,,"","",,,0 +12576,image/jpeg,0,0,,"","",,,0 +12577,image/jpeg,0,0,,"","",,,0 +12578,image/jpeg,0,0,,"","",,,0 +12579,image/jpeg,0,0,,"","",,,0 +12580,image/jpeg,0,0,,"","",,,0 +12581,image/jpeg,0,0,,"","",,,0 +12582,image/jpeg,0,0,,"","",,,0 +12583,image/jpeg,0,0,,"","",,,0 +12584,image/jpeg,0,0,,"","",,,0 +12585,image/jpeg,0,0,,"","",,,0 +12586,image/jpeg,0,0,,"","",,,0 +12587,image/jpeg,0,0,,"","",,,0 +12588,image/jpeg,0,0,,"","",,,0 +12589,image/jpeg,0,0,,"","",,,0 +12590,image/jpeg,0,0,,"","",,,0 +12591,image/jpeg,0,0,,"","",,,0 +12592,image/jpeg,0,0,,"","",,,0 +12593,image/jpeg,1565820430183,0,0,"","",45.997942,12.2911889722222,0 +12594,image/jpeg,0,0,,"","",,,0 +12595,image/jpeg,0,0,,"","",,,0 +12596,image/jpeg,0,0,,"","",,,0 +12597,image/jpeg,0,0,,"","",,,0 +12598,image/jpeg,0,0,,"","",,,0 +12599,image/jpeg,0,0,,"","",,,0 +12600,image/jpeg,0,0,,"","",,,0 +12601,image/jpeg,0,0,,"","",,,0 +12602,image/jpeg,0,0,,"","",,,0 +12603,image/jpeg,0,0,,"","",,,0 +12604,image/jpeg,0,0,,"","",,,0 +12605,image/jpeg,0,0,,"","",,,0 +12606,image/jpeg,0,0,,"","",,,0 +12607,image/jpeg,0,0,,"","",,,0 +12608,image/jpeg,0,0,,"","",,,0 +12609,image/jpeg,0,0,,"","",,,0 +12610,image/jpeg,0,0,,"","",,,0 +12611,image/png,0,0,,"","",,,0 +12612,image/jpeg,1565711758316,0,90,"","",44.2506789722222,12.0828649722222,0 +12613,image/jpeg,1565708907589,0,90,"","",44.186821,12.124093,0 +12614,image/jpeg,0,0,,"","",,,0 +12615,image/jpeg,0,0,,"","",,,0 +12616,image/jpeg,1565688462202,0,0,"","",44.197391,11.923225,0 +12617,image/jpeg,1565688432257,0,0,"","",44.1974289722222,11.9232049722222,0 +12618,image/jpeg,1565688402916,0,0,"","",44.197434,11.923204,0 +12619,image/jpeg,1565686907254,0,0,"","",44.230656,11.928292,0 +12620,image/jpeg,1565685473067,0,0,"","",44.210303,11.9243459722222,0 +12621,image/jpeg,1565685451898,0,0,"","",44.210321,11.924359,0 +12622,image/jpeg,1565682827977,0,0,"","",44.215479,11.910488,0 +12623,image/jpeg,0,0,,"","",,,0 +12624,image/jpeg,0,0,,"","",,,0 +12625,image/jpeg,1565681385609,0,90,"","",44.237009,11.921003,0 +12626,image/jpeg,0,0,,"","",,,0 +12627,image/jpeg,0,0,,"","",,,0 +12628,image/jpeg,0,0,,"","",,,0 +12629,image/jpeg,0,0,,"","",,,0 +12630,image/jpeg,0,0,,"","",,,0 +12631,image/jpeg,0,0,,"","",,,0 +12632,image/jpeg,1565541233431,0,0,"","",43.716591,13.2262439722222,0 +12633,image/jpeg,0,0,,"","",,,0 +12634,image/jpeg,0,0,,"","",,,0 +12635,image/jpeg,0,0,,"","",,,0 +12636,image/jpeg,0,0,,"","",,,0 +12637,image/jpeg,0,0,,"","",,,0 +12638,image/jpeg,0,0,,"","",,,0 +12639,image/jpeg,0,0,,"","",,,0 +12640,image/jpeg,0,0,,"","",,,0 +12641,image/jpeg,0,0,,"","",,,0 +12642,image/jpeg,0,0,,"","",,,0 +12643,image/jpeg,0,0,,"","",,,0 +12644,image/jpeg,0,0,,"","",,,0 +12645,image/jpeg,0,0,,"","",,,0 +12646,image/jpeg,0,0,,"","",,,0 +12647,image/jpeg,0,0,,"","",,,0 +12648,image/jpeg,0,0,,"","",,,0 +12649,image/jpeg,0,0,,"","",,,0 +12650,image/jpeg,1565541233431,0,0,"","",43.716591,13.2262439722222,0 +12651,image/jpeg,1565541213728,0,0,"","",43.7165639722222,13.2262839722222,0 +12652,image/jpeg,1565541208693,0,0,"","",43.7165639722222,13.2262859722222,0 +12653,image/jpeg,0,0,,"","",,,0 +12654,image/jpeg,0,0,,"","",,,0 +12655,image/jpeg,0,0,,"","",,,0 +12656,image/jpeg,0,0,,"","",,,0 +12657,image/jpeg,0,0,,"","",,,0 +12658,image/jpeg,0,0,,"","",,,0 +12659,image/jpeg,0,0,,"","",,,0 +12660,image/jpeg,0,0,,"","",,,0 +12661,image/jpeg,0,0,,"","",,,0 +12662,image/jpeg,0,0,,"","",,,0 +12663,image/jpeg,0,0,,"","",,,0 +12664,image/jpeg,0,0,,"","",,,0 +12665,image/jpeg,0,0,,"","",,,0 +12666,image/jpeg,0,0,,"","",,,0 +12667,image/jpeg,0,0,,"","",,,0 +12668,image/jpeg,0,0,,"","",,,0 +12669,image/jpeg,0,0,,"","",,,0 +12670,image/jpeg,0,0,,"","",,,0 +12671,image/jpeg,0,0,,"","",,,0 +12672,image/jpeg,0,0,,"","",,,0 +12673,image/jpeg,0,0,,"","",,,0 +12674,image/jpeg,0,0,,"","",,,0 +12675,image/jpeg,0,0,,"","",,,0 +12676,image/jpeg,0,0,,"","",,,0 +12677,image/jpeg,1565512570239,0,90,"","",44.2504729722222,12.083066,0 +12678,image/jpeg,0,0,,"","",,,0 +12679,image/jpeg,0,0,,"","",,,0 +12680,image/jpeg,0,0,,"","",,,0 +12681,image/jpeg,1565456900029,0,0,"","",44.193646,11.9399689722222,0 +12682,image/jpeg,1565456873961,0,0,"","",44.1936529722222,11.9399599722222,0 +12683,image/jpeg,1565455859985,0,0,"","",44.2043529722222,11.9290679722222,0 +12684,image/jpeg,0,0,,"","",,,0 +12685,image/jpeg,0,0,,"","",,,0 +12686,image/jpeg,0,0,,"","",,,0 +12687,image/jpeg,0,0,,"","",,,0 +12688,image/jpeg,0,0,,"","",,,0 +12689,image/jpeg,0,0,,"","",,,0 +12690,image/jpeg,0,0,,"","",,,0 +12691,image/jpeg,0,0,,"","",,,0 +12692,image/jpeg,0,0,,"","",,,0 +12693,image/jpeg,0,0,,"","",,,0 +12694,image/jpeg,0,0,,"","",,,0 +12695,image/jpeg,0,0,,"","",,,0 +12696,image/jpeg,0,0,,"","",,,0 +12697,image/jpeg,1565158640764,0,90,"","",44.2423789722222,11.9954059722222,0 +12698,image/jpeg,0,0,,"","",,,0 +12699,image/jpeg,0,0,,"","",,,0 +12700,image/jpeg,0,0,,"","",,,0 +12701,image/jpeg,0,0,,"","",,,0 +12702,image/jpeg,0,0,,"","",,,0 +12703,image/jpeg,0,0,,"","",,,0 +12704,image/jpeg,0,0,,"","",,,0 +12705,image/jpeg,0,0,,"","",,,0 +12706,image/jpeg,0,0,,"","",,,0 +12707,image/jpeg,0,0,,"","",,,0 +12708,image/jpeg,0,0,,"","",,,0 +12709,image/jpeg,0,0,,"","",,,0 +12710,image/jpeg,0,0,,"","",,,0 +12711,image/jpeg,0,0,,"","",,,0 +12712,image/jpeg,0,0,,"","",,,0 +12713,image/jpeg,0,0,,"","",,,0 +12714,image/jpeg,0,0,,"","",,,0 +12715,image/jpeg,0,0,,"","",,,0 +12716,image/jpeg,0,0,,"","",,,0 +12717,image/jpeg,0,0,,"","",,,0 +12718,image/jpeg,0,0,,"","",,,0 +12719,image/jpeg,0,0,,"","",,,0 +12720,image/jpeg,0,0,,"","",,,0 +12721,image/jpeg,0,0,,"","",,,0 +12722,image/jpeg,0,0,,"","",,,0 +12723,image/jpeg,0,0,,"","",,,0 +12724,image/jpeg,0,0,,"","",,,0 +12725,image/jpeg,0,0,,"","",,,0 +12726,image/jpeg,0,0,,"","",,,0 +12727,image/jpeg,0,0,,"","",,,0 +12728,image/jpeg,0,0,,"","",,,0 +12729,image/jpeg,0,0,,"","",,,0 +12730,image/jpeg,0,0,,"","",,,0 +12731,image/jpeg,0,0,,"","",,,0 +12732,image/jpeg,0,0,,"","",,,0 +12733,image/jpeg,0,0,,"","",,,0 +12734,image/jpeg,0,0,,"","",,,0 +12735,image/jpeg,0,0,,"","",,,0 +12736,image/jpeg,0,0,,"","",,,0 +12737,image/jpeg,0,0,,"","",,,0 +12738,image/jpeg,0,0,,"","",,,0 +12739,image/jpeg,0,0,,"","",,,0 +12740,image/jpeg,0,0,,"","",,,0 +12741,image/jpeg,1564940903168,0,0,"","",44.226309,12.115235,0 +12742,image/jpeg,1564912685647,0,0,"","",44.2505019722222,12.0828269722222,0 +12743,image/jpeg,1564912544655,0,90,"","",44.2481289722222,12.0802189722222,0 +12744,image/jpeg,0,0,,"","",,,0 +12745,image/jpeg,0,0,,"","",,,0 +12746,image/jpeg,0,0,,"","",,,0 +12747,image/jpeg,0,0,,"","",,,0 +12748,image/jpeg,1564851304275,0,0,"","",44.250605,12.0829059722222,0 +12749,image/jpeg,1564848732894,0,90,"","",44.2505769722222,12.08291,0 +12750,image/jpeg,0,0,,"","",,,0 +12751,image/jpeg,1564773818171,0,0,"","",44.25056,12.082888,0 +12752,image/jpeg,0,0,,"","",,,0 +12753,image/jpeg,1564512778429,0,0,"","",44.147683,12.13258,0 +12754,image/jpeg,1564511470794,0,90,"","",44.1807349722222,12.090415,0 +12755,image/jpeg,1564511468766,0,90,"","",44.1807489722222,12.0904089722222,0 +12756,image/jpeg,1564510542342,0,0,"","",44.1807939722222,12.0894499722222,0 +12757,image/jpeg,1564508602924,0,90,"","",44.180782,12.08943,0 +12758,image/jpeg,0,0,,"","",,,0 +12759,image/jpeg,0,0,,"","",,,0 +12760,image/jpeg,0,0,,"","",,,0 +12761,image/jpeg,1564416142809,0,0,"","",44.250826,12.082862,0 +12762,image/jpeg,1564416197126,0,90,"","",44.2507179722222,12.0828589722222,0 +12763,image/jpeg,1564415353237,0,90,"","",44.2505319722222,12.0828659722222,0 +12764,image/jpeg,1564230477700,0,0,"","",45.636557,12.7015969722222,0 +12765,image/jpeg,1564230477967,0,0,"","",45.6365539722222,12.7014309722222,0 +12766,image/jpeg,1564230476094,0,0,"","",45.636561,12.70176,0 +12767,image/jpeg,1564230475922,0,0,"","",45.6365559722222,12.701926,0 +12768,image/jpeg,1564230472069,0,0,"","",45.6365559722222,12.702567,0 +12769,image/jpeg,1564230313516,0,0,"","",45.6361009722222,12.7365209722222,0 +12770,image/jpeg,1564230285657,0,0,"","",45.6360269722222,12.741502,0 +12771,image/jpeg,0,0,,"","",,,0 +12772,image/jpeg,0,0,,"","",,,0 +12773,image/jpeg,0,0,,"","",,,0 +12774,image/jpeg,0,0,,"","",,,0 +12775,image/jpeg,0,0,,"","",,,0 +12776,image/jpeg,0,0,,"","",,,0 +12777,image/jpeg,0,0,,"","",,,0 +12778,image/jpeg,0,0,,"","",,,0 +12779,image/jpeg,0,0,,"","",,,0 +12780,image/jpeg,0,0,,"","",,,0 +12781,image/jpeg,0,0,,"","",,,0 +12782,image/jpeg,0,0,,"","",,,0 +12783,image/jpeg,0,0,,"","",,,0 +12784,image/jpeg,0,0,,"","",,,0 +12785,image/jpeg,0,0,,"","",,,0 +12786,image/jpeg,0,0,,"","",,,0 +12787,image/jpeg,0,0,,"","",,,0 +12788,image/jpeg,0,0,,"","",,,0 +12789,image/jpeg,0,0,,"","",,,0 +12790,image/jpeg,0,0,,"","",,,0 +12791,image/jpeg,0,0,,"","",,,0 +12792,image/jpeg,0,0,,"","",,,0 +12793,image/jpeg,0,0,,"","",,,0 +12794,image/jpeg,0,0,,"","",,,0 +12795,image/jpeg,0,0,,"","",,,0 +12796,image/jpeg,0,0,,"","",,,0 +12797,image/jpeg,0,0,,"","",,,0 +12798,image/jpeg,0,0,,"","",,,0 +12799,image/jpeg,0,0,,"","",,,0 +12800,image/jpeg,0,0,,"","",,,0 +12801,image/jpeg,0,0,,"","",,,0 +12802,image/jpeg,0,0,,"","",,,0 +12803,image/jpeg,0,0,,"","",,,0 +12804,image/jpeg,0,0,,"","",,,0 +12805,image/jpeg,0,0,,"","",,,0 +12806,image/jpeg,1564163988660,0,0,"","",45.586938,12.8506859722222,0 +12807,image/jpeg,0,0,,"","",,,0 +12808,image/jpeg,0,0,,"","",,,0 +12809,image/jpeg,0,0,,"","",,,0 +12810,image/jpeg,0,0,,"","",,,0 +12811,image/jpeg,0,0,,"","",,,0 +12812,image/jpeg,0,0,,"","",,,0 +12813,,0,0,,"","",,,0 +12814,image/jpeg,0,0,,"","",,,0 +12815,image/jpeg,0,0,,"","",,,0 +12816,image/jpeg,0,0,,"","",,,0 +12817,image/jpeg,0,0,,"","",,,0 +12818,image/jpeg,0,0,,"","",,,0 +12819,image/jpeg,0,0,,"","",,,0 +12820,image/jpeg,0,0,,"","",,,0 +12821,image/jpeg,0,0,,"","",,,0 +12822,image/jpeg,0,0,,"","",,,0 +12823,image/jpeg,0,0,,"","",,,0 +12824,image/jpeg,0,0,,"","",,,0 +12825,image/jpeg,0,0,,"","",,,0 +12826,image/jpeg,0,0,,"","",,,0 +12827,image/jpeg,0,0,,"","",,,0 +12828,image/jpeg,0,0,,"","",,,0 +12829,image/jpeg,0,0,,"","",,,0 +12830,image/jpeg,0,0,,"","",,,0 +12831,image/jpeg,0,0,,"","",,,0 +12832,image/jpeg,0,0,,"","",,,0 +12833,image/jpeg,0,0,,"","",,,0 +12834,image/jpeg,0,0,,"","",,,0 +12835,image/jpeg,0,0,,"","",,,0 +12836,image/jpeg,0,0,,"","",,,0 +12837,image/jpeg,0,0,,"","",,,0 +12838,image/jpeg,0,0,,"","",,,0 +12839,image/jpeg,0,0,,"","",,,0 +12840,image/jpeg,0,0,,"","",,,0 +12841,image/jpeg,0,0,,"","",,,0 +12842,image/jpeg,0,0,,"","",,,0 +12843,image/jpeg,0,0,,"","",,,0 +12844,image/jpeg,0,0,,"","",,,0 +12845,image/jpeg,1564124903956,0,0,"","",44.25066,12.083038,0 +12846,image/jpeg,1564123537268,0,0,"","",44.2273179722222,12.079703,0 +12847,image/jpeg,0,0,,"","",,,0 +12848,image/jpeg,0,0,,"","",,,0 +12849,image/jpeg,0,0,,"","",,,0 +12850,image/jpeg,0,0,,"","",,,0 +12851,image/jpeg,0,0,,"","",,,0 +12852,image/jpeg,0,0,,"","",,,0 +12853,image/jpeg,0,0,,"","",,,0 +12854,image/jpeg,0,0,,"","",,,0 +12855,image/jpeg,0,0,,"","",,,0 +12856,image/jpeg,0,0,,"","",,,0 +12857,image/jpeg,0,0,,"","",,,0 +12858,image/jpeg,0,0,,"","",,,0 +12859,image/jpeg,0,0,,"","",,,0 +12860,image/jpeg,0,0,,"","",,,0 +12861,image/jpeg,0,0,,"","",,,0 +12862,image/jpeg,1564000246108,0,0,"","",44.2505639722222,12.0829979722222,0 +12863,image/jpeg,1564000240725,0,0,"","",44.2505719722222,12.0830199722222,0 +12864,image/jpeg,1564000230598,0,0,"","",44.250559,12.083011,0 +12865,image/jpeg,0,0,,"","",,,0 +12866,image/jpeg,0,0,,"","",,,0 +12867,image/jpeg,0,0,,"","",,,0 +12868,image/jpeg,0,0,,"","",,,0 +12869,image/jpeg,0,0,,"","",,,0 +12870,image/jpeg,0,0,,"","",,,0 +12871,image/jpeg,0,0,,"","",,,0 +12872,image/jpeg,0,0,,"","",,,0 +12873,image/jpeg,0,0,,"","",,,0 +12874,image/jpeg,0,0,,"","",,,0 +12875,image/jpeg,0,0,,"","",,,0 +12876,image/jpeg,0,0,,"","",,,0 +12877,image/jpeg,0,0,,"","",,,0 +12878,image/jpeg,1563964669296,0,0,"","",44.242311,11.9953909722222,0 +12879,image/jpeg,1563964669296,0,90,"","",44.242311,11.9953909722222,0 +12880,image/jpeg,1563964023471,0,90,"","",44.2422729722222,11.9953739722222,0 +12881,image/jpeg,0,0,,"","",,,0 +12882,image/jpeg,0,0,,"","",,,0 +12883,image/jpeg,0,0,,"","",,,0 +12884,image/jpeg,0,0,,"","",,,0 +12885,image/jpeg,0,0,,"","",,,0 +12886,image/jpeg,0,0,,"","",,,0 +12887,image/jpeg,0,0,,"","",,,0 +12888,image/jpeg,0,0,,"","",,,0 +12889,image/jpeg,0,0,,"","",,,0 +12890,image/jpeg,0,0,,"","",,,0 +12891,image/jpeg,0,0,,"","",,,0 +12892,image/jpeg,0,0,,"","",,,0 +12893,image/jpeg,0,0,,"","",,,0 +12894,image/jpeg,0,0,,"","",,,0 +12895,image/jpeg,0,0,,"","",,,0 +12896,image/jpeg,0,0,,"","",,,0 +12897,image/jpeg,0,0,,"","",,,0 +12898,image/jpeg,0,0,,"","",,,0 +12899,image/jpeg,0,0,,"","",,,0 +12900,image/jpeg,0,0,,"","",,,0 +12901,image/jpeg,0,0,,"","",,,0 +12902,image/jpeg,0,0,,"","",,,0 +12903,image/jpeg,0,0,,"","",,,0 +12904,image/jpeg,0,0,,"","",,,0 +12905,image/jpeg,0,0,,"","",,,0 +12906,image/jpeg,0,0,,"","",,,0 +12907,image/jpeg,0,0,,"","",,,0 +12908,image/jpeg,0,0,,"","",,,0 +12909,image/jpeg,0,0,,"","",,,0 +12910,image/jpeg,0,0,,"","",,,0 +12911,image/jpeg,0,0,,"","",,,0 +12912,image/jpeg,0,0,,"","",,,0 +12913,image/jpeg,0,0,,"","",,,0 +12914,image/jpeg,0,0,,"","",,,0 +12915,image/jpeg,0,0,,"","",,,0 +12916,image/jpeg,0,0,,"","",,,0 +12917,image/jpeg,0,0,,"","",,,0 +12918,image/jpeg,0,0,,"","",,,0 +12919,image/jpeg,0,0,,"","",,,0 +12920,image/jpeg,0,0,,"","",,,0 +12921,image/jpeg,0,0,,"","",,,0 +12922,image/jpeg,0,0,,"","",,,0 +12923,image/jpeg,0,0,,"","",,,0 +12924,image/jpeg,0,0,,"","",,,0 +12925,image/jpeg,0,0,,"","",,,0 +12926,image/jpeg,0,0,,"","",,,0 +12927,image/jpeg,0,0,,"","",,,0 +12928,image/jpeg,0,0,,"","",,,0 +12929,image/jpeg,0,0,,"","",,,0 +12930,image/jpeg,0,0,,"","",,,0 +12931,image/jpeg,0,0,,"","",,,0 +12932,image/jpeg,0,0,,"","",,,0 +12933,image/jpeg,0,0,,"","",,,0 +12934,image/jpeg,0,0,,"","",,,0 +12935,image/jpeg,0,0,,"","",,,0 +12936,image/jpeg,0,0,,"","",,,0 +12937,image/jpeg,0,0,,"","",,,0 +12938,image/jpeg,0,0,,"","",,,0 +12939,image/jpeg,0,0,,"","",,,0 +12940,image/jpeg,0,0,,"","",,,0 +12941,image/jpeg,0,0,,"","",,,0 +12942,image/jpeg,0,0,,"","",,,0 +12943,image/jpeg,0,0,,"","",,,0 +12944,image/jpeg,0,0,,"","",,,0 +12945,image/jpeg,0,0,,"","",,,0 +12946,image/jpeg,0,0,,"","",,,0 +12947,image/jpeg,0,0,,"","",,,0 +12948,image/jpeg,0,0,,"","",,,0 +12949,image/jpeg,0,0,,"","",,,0 +12950,image/jpeg,0,0,,"","",,,0 +12951,image/jpeg,0,0,,"","",,,0 +12952,image/jpeg,0,0,,"","",,,0 +12953,image/jpeg,0,0,,"","",,,0 +12954,image/jpeg,0,0,,"","",,,0 +12955,image/jpeg,0,0,,"","",,,0 +12956,image/jpeg,0,0,,"","",,,0 +12957,image/jpeg,0,0,,"","",,,0 +12958,image/jpeg,0,0,,"","",,,0 +12959,image/jpeg,0,0,,"","",,,0 +12960,image/jpeg,0,0,,"","",,,0 +12961,image/jpeg,0,0,,"","",,,0 +12962,image/jpeg,0,0,,"","",,,0 +12963,image/jpeg,0,0,,"","",,,0 +12964,image/jpeg,0,0,,"","",,,0 +12965,image/jpeg,0,0,,"","",,,0 +12966,image/jpeg,0,0,,"","",,,0 +12967,image/jpeg,0,0,,"","",,,0 +12968,image/jpeg,0,0,,"","",,,0 +12969,image/jpeg,0,0,,"","",,,0 +12970,image/jpeg,0,0,,"","",,,0 +12971,image/jpeg,0,0,,"","",,,0 +12972,image/jpeg,0,0,,"","",,,0 +12973,image/jpeg,0,0,,"","",,,0 +12974,image/jpeg,0,0,,"","",,,0 +12975,image/jpeg,0,0,,"","",,,0 +12976,image/jpeg,0,0,,"","",,,0 +12977,image/jpeg,0,0,,"","",,,0 +12978,image/jpeg,0,0,,"","",,,0 +12979,image/jpeg,0,0,,"","",,,0 +12980,image/jpeg,0,0,,"","",,,0 +12981,image/jpeg,0,0,,"","",,,0 +12982,image/jpeg,0,0,,"","",,,0 +12983,image/jpeg,0,0,,"","",,,0 +12984,image/jpeg,0,0,,"","",,,0 +12985,image/jpeg,0,0,,"","",,,0 +12986,image/jpeg,0,0,,"","",,,0 +12987,image/jpeg,0,0,,"","",,,0 +12988,image/jpeg,0,0,,"","",,,0 +12989,image/jpeg,0,0,,"","",,,0 +12990,image/jpeg,0,0,,"","",,,0 +12991,image/jpeg,0,0,,"","",,,0 +12992,image/jpeg,0,0,,"","",,,0 +12993,image/jpeg,0,0,,"","",,,0 +12994,image/jpeg,0,0,,"","",,,0 +12995,image/jpeg,0,0,,"","",,,0 +12996,image/jpeg,0,0,,"","",,,0 +12997,image/jpeg,0,0,,"","",,,0 +12998,image/jpeg,0,0,,"","",,,0 +12999,image/jpeg,0,0,,"","",,,0 +13000,image/jpeg,0,0,,"","",,,0 +13001,image/jpeg,0,0,,"","",,,0 +13002,image/jpeg,0,0,,"","",,,0 +13003,image/jpeg,0,0,,"","",,,0 +13004,image/jpeg,0,0,,"","",,,0 +13005,image/jpeg,0,0,,"","",,,0 +13006,image/jpeg,0,0,,"","",,,0 +13007,image/jpeg,0,0,,"","",,,0 +13008,image/jpeg,0,0,,"","",,,0 +13009,image/jpeg,0,0,,"","",,,0 +13010,image/jpeg,0,0,,"","",,,0 +13011,image/jpeg,0,0,,"","",,,0 +13012,image/jpeg,0,0,,"","",,,0 +13013,image/jpeg,0,0,,"","",,,0 +13014,image/jpeg,0,0,,"","",,,0 +13015,image/jpeg,0,0,,"","",,,0 +13016,image/jpeg,0,0,,"","",,,0 +13017,image/jpeg,0,0,,"","",,,0 +13018,image/jpeg,0,0,,"","",,,0 +13019,image/jpeg,0,0,,"","",,,0 +13020,image/jpeg,0,0,,"","",,,0 +13021,image/jpeg,0,0,,"","",,,0 +13022,image/jpeg,0,0,,"","",,,0 +13023,image/jpeg,0,0,,"","",,,0 +13024,image/jpeg,0,0,,"","",,,0 +13025,image/jpeg,0,0,,"","",,,0 +13026,image/jpeg,0,0,,"","",,,0 +13027,image/jpeg,0,0,,"","",,,0 +13028,image/jpeg,0,0,,"","",,,0 +13029,image/jpeg,0,0,,"","",,,0 +13030,image/jpeg,0,0,,"","",,,0 +13031,image/jpeg,0,0,,"","",,,0 +13032,image/jpeg,0,0,,"","",,,0 +13033,image/jpeg,0,0,,"","",,,0 +13034,image/jpeg,0,0,,"","",,,0 +13035,image/jpeg,0,0,,"","",,,0 +13036,image/jpeg,0,0,,"","",,,0 +13037,image/jpeg,0,0,,"","",,,0 +13038,image/jpeg,0,0,,"","",,,0 +13039,image/jpeg,0,0,,"","",,,0 +13040,image/jpeg,0,0,,"","",,,0 +13041,image/jpeg,0,0,,"","",,,0 +13042,image/jpeg,0,0,,"","",,,0 +13043,image/jpeg,0,0,,"","",,,0 +13044,image/jpeg,0,0,,"","",,,0 +13045,image/jpeg,0,0,,"","",,,0 +13046,image/jpeg,0,0,,"","",,,0 +13047,image/jpeg,0,0,,"","",,,0 +13048,image/jpeg,0,0,,"","",,,0 +13049,image/jpeg,0,0,,"","",,,0 +13050,image/jpeg,0,0,,"","",,,0 +13051,image/jpeg,0,0,,"","",,,0 +13052,image/jpeg,0,0,,"","",,,0 +13053,image/jpeg,0,0,,"","",,,0 +13054,image/jpeg,0,0,,"","",,,0 +13055,image/jpeg,0,0,,"","",,,0 +13056,image/jpeg,0,0,,"","",,,0 +13057,image/jpeg,0,0,,"","",,,0 +13058,image/jpeg,0,0,,"","",,,0 +13059,image/jpeg,0,0,,"","",,,0 +13060,image/jpeg,0,0,,"","",,,0 +13061,image/jpeg,0,0,,"","",,,0 +13062,image/jpeg,0,0,,"","",,,0 +13063,image/jpeg,0,0,,"","",,,0 +13064,image/jpeg,0,0,,"","",,,0 +13065,image/jpeg,0,0,,"","",,,0 +13066,image/jpeg,0,0,,"","",,,0 +13067,image/jpeg,0,0,,"","",,,0 +13068,image/jpeg,0,0,,"","",,,0 +13069,image/jpeg,0,0,,"","",,,0 +13070,image/jpeg,0,0,,"","",,,0 +13071,image/jpeg,0,0,,"","",,,0 +13072,image/jpeg,0,0,,"","",,,0 +13073,image/jpeg,0,0,,"","",,,0 +13074,image/jpeg,0,0,,"","",,,0 +13075,image/jpeg,0,0,,"","",,,0 +13076,image/jpeg,0,0,,"","",,,0 +13077,image/jpeg,0,0,,"","",,,0 +13078,image/jpeg,0,0,,"","",,,0 +13079,image/jpeg,0,0,,"","",,,0 +13080,image/jpeg,0,0,,"","",,,0 +13081,image/jpeg,0,0,,"","",,,0 +13082,image/jpeg,0,0,,"","",,,0 +13083,image/jpeg,0,0,,"","",,,0 +13084,image/jpeg,0,0,,"","",,,0 +13085,image/jpeg,0,0,,"","",,,0 +13086,image/jpeg,0,0,,"","",,,0 +13087,image/jpeg,0,0,,"","",,,0 +13088,image/jpeg,0,0,,"","",,,0 +13089,image/jpeg,0,0,,"","",,,0 +13090,image/jpeg,0,0,,"","",,,0 +13091,image/jpeg,0,0,,"","",,,0 +13092,image/jpeg,0,0,,"","",,,0 +13093,image/jpeg,0,0,,"","",,,0 +13094,image/jpeg,0,0,,"","",,,0 +13095,image/jpeg,0,0,,"","",,,0 +13096,image/jpeg,0,0,,"","",,,0 +13097,image/jpeg,0,0,,"","",,,0 +13098,image/jpeg,0,0,,"","",,,0 +13099,image/jpeg,0,0,,"","",,,0 +13100,image/jpeg,0,0,,"","",,,0 +13101,image/jpeg,0,0,,"","",,,0 +13102,image/jpeg,0,0,,"","",,,0 +13103,image/jpeg,0,0,,"","",,,0 +13104,image/jpeg,0,0,,"","",,,0 +13105,image/jpeg,0,0,,"","",,,0 +13106,image/jpeg,0,0,,"","",,,0 +13107,image/jpeg,0,0,,"","",,,0 +13108,image/jpeg,0,0,,"","",,,0 +13109,image/jpeg,0,0,,"","",,,0 +13110,image/jpeg,0,0,,"","",,,0 +13111,image/jpeg,0,0,,"","",,,0 +13112,image/jpeg,0,0,,"","",,,0 +13113,image/jpeg,0,0,,"","",,,0 +13114,image/jpeg,0,0,,"","",,,0 +13115,image/jpeg,0,0,,"","",,,0 +13116,image/jpeg,0,0,,"","",,,0 +13117,image/jpeg,0,0,,"","",,,0 +13118,image/jpeg,0,0,,"","",,,0 +13119,image/jpeg,0,0,,"","",,,0 +13120,image/jpeg,0,0,,"","",,,0 +13121,image/jpeg,0,0,,"","",,,0 +13122,image/jpeg,0,0,,"","",,,0 +13123,image/jpeg,0,0,,"","",,,0 +13124,image/jpeg,0,0,,"","",,,0 +13125,image/jpeg,0,0,,"","",,,0 +13126,image/jpeg,0,0,,"","",,,0 +13127,image/jpeg,0,0,,"","",,,0 +13128,image/jpeg,0,0,,"","",,,0 +13129,image/jpeg,0,0,,"","",,,0 +13130,image/jpeg,0,0,,"","",,,0 +13131,image/jpeg,0,0,,"","",,,0 +13132,image/jpeg,0,0,,"","",,,0 +13133,image/jpeg,0,0,,"","",,,0 +13134,image/jpeg,0,0,,"","",,,0 +13135,image/jpeg,0,0,,"","",,,0 +13136,image/jpeg,0,0,,"","",,,0 +13137,image/jpeg,0,0,,"","",,,0 +13138,image/jpeg,0,0,,"","",,,0 +13139,image/jpeg,0,0,,"","",,,0 +13140,image/jpeg,0,0,,"","",,,0 +13141,image/jpeg,0,0,,"","",,,0 +13142,image/jpeg,0,0,,"","",,,0 +13143,image/jpeg,0,0,,"","",,,0 +13144,image/jpeg,0,0,,"","",,,0 +13145,image/jpeg,0,0,,"","",,,0 +13146,image/jpeg,0,0,,"","",,,0 +13147,image/jpeg,0,0,,"","",,,0 +13148,image/jpeg,0,0,,"","",,,0 +13149,image/jpeg,0,0,,"","",,,0 +13150,image/jpeg,0,0,,"","",,,0 +13151,image/jpeg,0,0,,"","",,,0 +13152,image/jpeg,0,0,,"","",,,0 +13153,image/jpeg,0,0,,"","",,,0 +13154,image/jpeg,0,0,,"","",,,0 +13155,image/jpeg,0,0,,"","",,,0 +13156,image/jpeg,0,0,,"","",,,0 +13157,image/jpeg,0,0,,"","",,,0 +13158,image/jpeg,0,0,,"","",,,0 +13159,image/jpeg,0,0,,"","",,,0 +13160,image/jpeg,0,0,,"","",,,0 +13161,image/jpeg,0,0,,"","",,,0 +13162,image/jpeg,0,0,,"","",,,0 +13163,image/jpeg,0,0,,"","",,,0 +13164,image/jpeg,0,0,,"","",,,0 +13165,image/jpeg,0,0,,"","",,,0 +13166,image/jpeg,0,0,,"","",,,0 +13167,image/jpeg,0,0,,"","",,,0 +13168,image/jpeg,0,0,,"","",,,0 +13169,image/jpeg,0,0,,"","",,,0 +13170,image/jpeg,0,0,,"","",,,0 +13171,image/jpeg,0,0,,"","",,,0 +13172,image/jpeg,0,0,,"","",,,0 +13173,image/jpeg,0,0,,"","",,,0 +13174,image/jpeg,0,0,,"","",,,0 +13175,image/jpeg,0,0,,"","",,,0 +13176,image/jpeg,0,0,,"","",,,0 +13177,image/jpeg,0,0,,"","",,,0 +13178,image/jpeg,0,0,,"","",,,0 +13179,image/jpeg,0,0,,"","",,,0 +13180,image/jpeg,0,0,,"","",,,0 +13181,image/jpeg,0,0,,"","",,,0 +13182,image/jpeg,0,0,,"","",,,0 +13183,image/jpeg,0,0,,"","",,,0 +13184,image/jpeg,0,0,,"","",,,0 +13185,image/jpeg,0,0,,"","",,,0 +13186,image/jpeg,0,0,,"","",,,0 +13187,image/jpeg,0,0,,"","",,,0 +13188,image/jpeg,0,0,,"","",,,0 +13189,image/jpeg,0,0,,"","",,,0 +13190,image/jpeg,0,0,,"","",,,0 +13191,image/jpeg,0,0,,"","",,,0 +13192,image/jpeg,0,0,,"","",,,0 +13193,image/jpeg,0,0,,"","",,,0 +13194,image/jpeg,0,0,,"","",,,0 +13195,image/jpeg,0,0,,"","",,,0 +13196,image/jpeg,0,0,,"","",,,0 +13197,image/jpeg,0,0,,"","",,,0 +13198,image/jpeg,0,0,,"","",,,0 +13199,image/jpeg,1563912397980,0,0,"","",43.9509619722222,12.821291,0 +13200,image/jpeg,1563911990016,0,0,"","",43.950937,12.821322,0 +13201,image/jpeg,1563908746420,0,0,"","",43.945903,12.837153,0 +13202,image/jpeg,1563908739932,0,0,"","",43.945905,12.837151,0 +13203,image/jpeg,1563908710365,0,0,"","",43.9458819722222,12.8371279722222,0 +13204,image/jpeg,1563907564516,0,90,"","",43.9458109722222,12.8370999722222,0 +13205,image/jpeg,1563907303427,0,90,"","",43.945813,12.8371309722222,0 +13206,image/jpeg,1563907297447,0,90,"","",43.9458089722222,12.8371359722222,0 +13207,image/jpeg,1563906650262,0,0,"","",43.9458479722222,12.837122,0 +13208,image/jpeg,0,0,,"","",,,0 +13209,image/jpeg,1563902568866,0,90,"","",43.9458369722222,12.8371139722222,0 +13210,image/jpeg,1563902564257,0,90,"","",43.9458569722222,12.8371139722222,0 +13211,image/jpeg,1563902545379,0,90,"","",43.9459099722222,12.8371619722222,0 +13212,image/jpeg,1563902418122,0,0,"","",43.9459019722222,12.8371919722222,0 +13213,image/jpeg,1563902413139,0,0,"","",43.945903,12.8371929722222,0 +13214,image/jpeg,1563902335316,0,0,"","",43.9457949722222,12.8370719722222,0 +13215,image/jpeg,1563902329779,0,0,"","",43.9457939722222,12.8370669722222,0 +13216,image/jpeg,1563902319764,0,0,"","",43.945793,12.8370789722222,0 +13217,image/jpeg,0,0,,"","",,,0 +13218,image/jpeg,0,0,,"","",,,0 +13219,image/jpeg,0,0,,"","",,,0 +13220,image/jpeg,0,0,,"","",,,0 +13221,image/jpeg,0,0,,"","",,,0 +13222,image/jpeg,0,0,,"","",,,0 +13223,image/jpeg,0,0,,"","",,,0 +13224,image/jpeg,0,0,,"","",,,0 +13225,image/jpeg,0,0,,"","",,,0 +13226,image/jpeg,0,0,,"","",,,0 +13227,image/jpeg,0,0,,"","",,,0 +13228,image/jpeg,0,0,,"","",,,0 +13229,image/jpeg,0,0,,"","",,,0 +13230,image/jpeg,0,0,,"","",,,0 +13231,image/jpeg,0,0,,"","",,,0 +13232,image/jpeg,0,0,,"","",,,0 +13233,image/jpeg,0,0,,"","",,,0 +13234,image/jpeg,0,0,,"","",,,0 +13235,image/jpeg,0,0,,"","",,,0 +13236,image/jpeg,0,0,,"","",,,0 +13237,image/jpeg,0,0,,"","",,,0 +13238,image/jpeg,0,0,,"","",,,0 +13239,image/jpeg,0,0,,"","",,,0 +13240,image/jpeg,0,0,,"","",,,0 +13241,image/jpeg,0,0,,"","",,,0 +13242,image/jpeg,0,0,,"","",,,0 +13243,image/jpeg,0,0,,"","",,,0 +13244,image/jpeg,0,0,,"","",,,0 +13245,image/jpeg,0,0,,"","",,,0 +13246,image/jpeg,0,0,,"","",,,0 +13247,image/jpeg,0,0,,"","",,,0 +13248,image/jpeg,0,0,,"","",,,0 +13249,image/jpeg,0,0,,"","",,,0 +13250,image/jpeg,0,0,,"","",,,0 +13251,image/jpeg,0,0,,"","",,,0 +13252,image/jpeg,0,0,,"","",,,0 +13253,image/jpeg,0,0,,"","",,,0 +13254,image/jpeg,0,0,,"","",,,0 +13255,image/jpeg,0,0,,"","",,,0 +13256,image/jpeg,0,0,,"","",,,0 +13257,image/jpeg,0,0,,"","",,,0 +13258,image/jpeg,0,0,,"","",,,0 +13259,image/jpeg,1563734843013,0,0,"","",44.1405749722222,12.005573,0 +13260,image/jpeg,0,0,,"","",,,0 +13261,image/jpeg,0,0,,"","",,,0 +13262,image/jpeg,0,0,,"","",,,0 +13263,image/jpeg,0,0,,"","",,,0 +13264,image/jpeg,0,0,,"","",,,0 +13265,image/jpeg,0,0,,"","",,,0 +13266,image/jpeg,0,0,,"","",,,0 +13267,image/jpeg,0,0,,"","",,,0 +13268,image/jpeg,0,0,,"","",,,0 +13269,image/jpeg,0,0,,"","",,,0 +13270,image/jpeg,0,0,,"","",,,0 +13271,image/jpeg,0,0,,"","",,,0 +13272,image/jpeg,0,0,,"","",,,0 +13273,image/jpeg,0,0,,"","",,,0 +13274,image/jpeg,0,0,,"","",,,0 +13275,image/jpeg,0,0,,"","",,,0 +13276,image/jpeg,0,0,,"","",,,0 +13277,image/jpeg,0,0,,"","",,,0 +13278,image/jpeg,0,0,,"","",,,0 +13279,image/jpeg,0,0,,"","",,,0 +13280,image/jpeg,0,0,,"","",,,0 +13281,image/jpeg,0,0,,"","",,,0 +13282,image/jpeg,0,0,,"","",,,0 +13283,image/jpeg,0,0,,"","",,,0 +13284,image/jpeg,0,0,,"","",,,0 +13285,image/jpeg,0,0,,"","",,,0 +13286,image/jpeg,0,0,,"","",,,0 +13287,image/jpeg,0,0,,"","",,,0 +13288,image/jpeg,0,0,,"","",,,0 +13289,image/jpeg,0,0,,"","",,,0 +13290,image/jpeg,0,0,,"","",,,0 +13291,image/jpeg,0,0,,"","",,,0 +13292,image/jpeg,0,0,,"","",,,0 +13293,image/jpeg,0,0,,"","",,,0 +13294,image/jpeg,0,0,,"","",,,0 +13295,image/jpeg,0,0,,"","",,,0 +13296,image/jpeg,1563536417534,0,270,"","",44.249693,12.082608,0 +13297,image/jpeg,0,0,,"","",,,0 +13298,image/jpeg,0,0,,"","",,,0 +13299,image/jpeg,0,0,,"","",,,0 +13300,image/jpeg,0,0,,"","",,,0 +13301,image/jpeg,0,0,,"","",,,0 +13302,image/jpeg,0,0,,"","",,,0 +13303,image/jpeg,1563528907335,0,0,"","",44.211233,12.0661599722222,0 +13304,image/jpeg,0,0,,"","",,,0 +13305,image/jpeg,0,0,,"","",,,0 +13306,image/jpeg,0,0,,"","",,,0 +13307,image/jpeg,0,0,,"","",,,0 +13308,image/jpeg,0,0,,"","",,,0 +13309,image/jpeg,0,0,,"","",,,0 +13310,image/jpeg,0,0,,"","",,,0 +13311,image/jpeg,0,0,,"","",,,0 +13312,image/jpeg,0,0,,"","",,,0 +13313,image/jpeg,0,0,,"","",,,0 +13314,image/jpeg,0,0,,"","",,,0 +13315,image/jpeg,0,0,,"","",,,0 +13316,image/jpeg,0,0,,"","",,,0 +13317,image/jpeg,0,0,,"","",,,0 +13318,image/jpeg,0,0,,"","",,,0 +13319,image/png,0,0,,"","",,,0 +13320,image/png,0,0,,"","",,,0 +13321,image/jpeg,0,0,,"","",,,0 +13322,image/jpeg,0,0,,"","",,,0 +13323,image/jpeg,0,0,,"","",,,0 +13324,image/jpeg,1563392851418,0,90,"","",44.302669,12.145842,0 +13325,image/jpeg,0,0,,"","",,,0 +13326,image/jpeg,0,0,,"","",,,0 +13327,image/jpeg,0,0,,"","",,,0 +13328,image/jpeg,0,0,,"","",,,0 +13329,image/jpeg,0,0,,"","",,,0 +13330,image/jpeg,0,0,,"","",,,0 +13331,image/jpeg,0,0,,"","",,,0 +13332,image/jpeg,0,0,,"","",,,0 +13333,image/jpeg,0,0,,"","",,,0 +13334,image/jpeg,0,0,,"","",,,0 +13335,image/jpeg,0,0,,"","",,,0 +13336,image/jpeg,0,0,,"","",,,0 +13337,image/jpeg,0,0,,"","",,,0 +13338,image/jpeg,0,0,,"","",,,0 +13339,image/jpeg,0,0,,"","",,,0 +13340,image/jpeg,0,0,,"","",,,0 +13341,image/jpeg,0,0,,"","",,,0 +13342,image/jpeg,0,0,,"","",,,0 +13343,image/jpeg,0,0,,"","",,,0 +13344,image/jpeg,0,0,,"","",,,0 +13345,image/jpeg,0,0,,"","",,,0 +13346,image/jpeg,0,0,,"","",,,0 +13347,image/jpeg,0,0,,"","",,,0 +13348,image/jpeg,0,0,,"","",,,0 +13349,image/jpeg,0,0,,"","",,,0 +13350,image/jpeg,0,0,,"","",,,0 +13351,image/jpeg,0,0,,"","",,,0 +13352,image/jpeg,0,0,,"","",,,0 +13353,image/jpeg,0,0,,"","",,,0 +13354,image/jpeg,0,0,0,"","",,,0 +13355,image/jpeg,0,0,,"","",,,0 +13356,image/jpeg,0,0,,"","",,,0 +13357,image/jpeg,0,0,,"","",,,0 +13358,image/jpeg,0,0,,"","",,,0 +13359,image/jpeg,0,0,,"","",,,0 +13360,image/jpeg,0,0,,"","",,,0 +13361,image/jpeg,0,0,,"","",,,0 +13362,image/jpeg,0,0,,"","",,,0 +13363,image/jpeg,0,0,,"","",,,0 +13364,image/jpeg,0,0,,"","",,,0 +13365,image/jpeg,0,0,,"","",,,0 +13366,image/jpeg,0,0,,"","",,,0 +13367,image/jpeg,0,0,,"","",,,0 +13368,image/jpeg,0,0,,"","",,,0 +13369,image/jpeg,1563123582088,0,0,"","",44.250565,12.0835249722222,0 +13370,image/jpeg,1563123564565,0,0,"","",44.2507189722222,12.0835629722222,0 +13371,image/jpeg,1563122749692,0,90,"","",44.2506429722222,12.0831879722222,0 +13372,image/jpeg,1563122737776,0,90,"","",44.2505129722222,12.083323,0 +13373,image/jpeg,0,0,,"","",,,0 +13374,image/jpeg,0,0,,"","",,,0 +13375,image/jpeg,0,0,,"","",,,0 +13376,image/jpeg,0,0,,"","",,,0 +13377,image/jpeg,0,0,,"","",,,0 +13378,image/jpeg,0,0,,"","",,,0 +13379,image/jpeg,0,0,,"","",,,0 +13380,image/jpeg,0,0,,"","",,,0 +13381,image/jpeg,0,0,,"","",,,0 +13382,image/jpeg,0,0,,"","",,,0 +13383,image/jpeg,0,0,,"","",,,0 +13384,image/jpeg,0,0,,"","",,,0 +13385,image/jpeg,0,0,,"","",,,0 +13386,image/jpeg,0,0,,"","",,,0 +13387,image/jpeg,0,0,,"","",,,0 +13388,image/jpeg,0,0,,"","",,,0 +13389,image/jpeg,0,0,,"","",,,0 +13390,image/jpeg,0,0,,"","",,,0 +13391,image/jpeg,0,0,,"","",,,0 +13392,image/jpeg,0,0,,"","",,,0 +13393,image/jpeg,0,0,,"","",,,0 +13394,image/jpeg,0,0,,"","",,,0 +13395,image/jpeg,0,0,,"","",,,0 +13396,image/jpeg,1563102878807,0,270,"","",43.851699,12.0735019722222,0 +13397,image/jpeg,1563102874553,0,270,"","",43.8517009722222,12.073503,0 +13398,image/jpeg,1563102827853,0,0,"","",43.8517399722222,12.07357,0 +13399,image/jpeg,1563102817819,0,0,"","",43.851787,12.073546,0 +13400,image/jpeg,1563102810646,0,90,"","",43.85179,12.073536,0 +13401,image/jpeg,1563099798431,0,0,"","",43.843232,12.004751,0 +13402,image/jpeg,1563099789721,0,0,"","",43.843259,12.004818,0 +13403,image/jpeg,1563099629808,0,0,"","",43.842851,12.0053119722222,0 +13404,image/jpeg,1563099026000,0,0,"","",43.8432444444444,12.0033211111111,0 +13405,image/jpeg,1563098991044,0,0,"","",43.8433139722222,12.0032139722222,0 +13406,image/jpeg,1563098983216,0,0,"","",43.84337,12.003242,0 +13407,image/jpeg,1563098980661,0,0,"","",43.843403,12.0032759722222,0 +13408,image/jpeg,1563098946950,0,0,"","",43.8435119722222,12.0031239722222,0 +13409,image/jpeg,1563096758517,0,0,"","",43.833339,11.961842,0 +13410,image/jpeg,0,0,,"","",,,0 +13411,image/jpeg,1563096621475,0,0,"","",43.833269,11.9618999722222,0 +13412,image/jpeg,1563096428440,0,90,"","",43.83279,11.961705,0 +13413,image/jpeg,0,0,,"","",,,0 +13414,image/jpeg,0,0,,"","",,,0 +13415,image/jpeg,0,0,,"","",,,0 +13416,image/jpeg,0,0,,"","",,,0 +13417,image/jpeg,0,0,,"","",,,0 +13418,image/jpeg,1563021224699,0,0,"","",43.8551519722222,12.034843,0 +13419,image/jpeg,1563018895203,0,0,"","",43.859799,12.0319129722222,0 +13420,image/jpeg,0,0,,"","",,,0 +13421,image/jpeg,0,0,,"","",,,0 +13422,image/jpeg,1563046604981,0,0,"","",43.8629419722222,12.0527809722222,0 +13423,image/jpeg,0,0,,"","",,,0 +13424,image/jpeg,0,0,,"","",,,0 +13425,image/jpeg,0,0,,"","",,,0 +13426,image/jpeg,1563039977257,0,0,"","",43.8632149722222,12.052943,0 +13427,image/jpeg,1563039930491,0,0,"","",43.8631949722222,12.053024,0 +13428,image/jpeg,1563039902876,0,0,"","",43.8631249722222,12.0529829722222,0 +13429,image/jpeg,1563039856040,0,0,"","",43.862906,12.052742,0 +13430,image/jpeg,1563039835414,0,0,"","",43.862785,12.052692,0 +13431,image/jpeg,1563039832051,0,0,"","",43.8627719722222,12.052668,0 +13432,image/jpeg,1563039344219,0,0,"","",43.862867,12.0526959722222,0 +13433,image/jpeg,1563039328934,0,0,"","",43.862859,12.0527169722222,0 +13434,image/png,0,0,,"","",,,0 +13435,image/png,0,0,,"","",,,0 +13436,image/jpeg,0,0,,"","",,,0 +13437,image/jpeg,0,0,,"","",,,0 +13438,image/jpeg,0,0,,"","",,,0 +13439,image/jpeg,0,0,,"","",,,0 +13440,image/jpeg,0,0,,"","",,,0 +13441,image/jpeg,1563026342505,0,0,"","",43.8533279722222,12.0340179722222,0 +13442,image/jpeg,1563025146105,0,0,"","",43.850312,12.0405289722222,0 +13443,image/jpeg,1563023693113,0,0,"","",43.8435059722222,12.041002,0 +13444,image/jpeg,1563023745747,0,0,"","",43.8434979722222,12.041016,0 +13445,image/jpeg,1563023743024,0,0,"","",43.843501,12.041017,0 +13446,image/jpeg,1563023740156,0,0,"","",43.843504,12.0410149722222,0 +13447,image/jpeg,1563023693113,0,0,"","",43.8435059722222,12.041002,0 +13448,image/jpeg,0,0,,"","",,,0 +13449,image/jpeg,1563021190673,0,0,"","",43.85511,12.034898,0 +13450,image/jpeg,1563018895203,0,0,"","",43.859799,12.0319129722222,0 +13451,image/jpeg,1563018877482,0,0,"","",43.859797,12.031935,0 +13452,image/jpeg,1563018865385,0,0,"","",43.8598539722222,12.031973,0 +13453,image/jpeg,0,0,,"","",,,0 +13454,image/jpeg,0,0,,"","",,,0 +13455,image/jpeg,1563011737662,0,90,"","",43.8343699722222,11.9593009722222,0 +13456,image/jpeg,1563011736433,0,90,"","",43.8343699722222,11.9593009722222,0 +13457,image/jpeg,1563011640296,0,90,"","",43.835121,11.9595009722222,0 +13458,image/jpeg,0,0,,"","",,,0 +13459,image/jpeg,0,0,,"","",,,0 +13460,image/jpeg,0,0,,"","",,,0 +13461,image/jpeg,0,0,,"","",,,0 +13462,image/jpeg,0,0,,"","",,,0 +13463,image/jpeg,0,0,,"","",,,0 +13464,image/jpeg,0,0,,"","",,,0 +13465,image/jpeg,0,0,,"","",,,0 +13466,image/jpeg,0,0,,"","",,,0 +13467,image/jpeg,0,0,,"","",,,0 +13468,image/jpeg,0,0,,"","",,,0 +13469,image/jpeg,0,0,,"","",,,0 +13470,image/jpeg,0,0,,"","",,,0 +13471,image/jpeg,0,0,,"","",,,0 +13472,image/jpeg,0,0,,"","",,,0 +13473,image/jpeg,0,0,,"","",,,0 +13474,image/jpeg,0,0,,"","",,,0 +13475,image/jpeg,0,0,,"","",,,0 +13476,image/jpeg,0,0,,"","",,,0 +13477,image/jpeg,0,0,,"","",,,0 +13478,image/jpeg,0,0,,"","",,,0 +13479,image/jpeg,0,0,,"","",,,0 +13480,image/jpeg,0,0,,"","",,,0 +13481,image/jpeg,0,0,,"","",,,0 +13482,image/jpeg,0,0,,"","",,,0 +13483,image/jpeg,1562787234871,0,90,"","",44.2505499722222,12.083192,0 +13484,image/jpeg,0,0,,"","",,,0 +13485,image/jpeg,1562784609040,0,90,"","",44.2506399722222,12.0828009722222,0 +13486,image/jpeg,1562784602516,0,90,"","",44.2506259722222,12.0828109722222,0 +13487,image/jpeg,0,0,,"","",,,0 +13488,image/jpeg,0,0,,"","",,,0 +13489,image/jpeg,0,0,,"","",,,0 +13490,image/jpeg,0,0,,"","",,,0 +13491,image/jpeg,0,0,,"","",,,0 +13492,image/jpeg,0,0,,"","",,,0 +13493,image/jpeg,0,0,,"","",,,0 +13494,image/jpeg,0,0,,"","",,,0 +13495,image/jpeg,0,0,,"","",,,0 +13496,image/jpeg,0,0,,"","",,,0 +13497,image/jpeg,0,0,,"","",,,0 +13498,image/jpeg,0,0,,"","",,,0 +13499,image/jpeg,0,0,,"","",,,0 +13500,image/jpeg,0,0,,"","",,,0 +13501,image/jpeg,0,0,,"","",,,0 +13502,image/jpeg,0,0,,"","",,,0 +13503,image/jpeg,0,0,,"","",,,0 +13504,image/jpeg,0,0,,"","",,,0 +13505,image/jpeg,0,0,,"","",,,0 +13506,image/jpeg,0,0,,"","",,,0 +13507,image/jpeg,0,0,,"","",,,0 +13508,image/jpeg,0,0,,"","",,,0 +13509,image/jpeg,0,0,,"","",,,0 +13510,image/jpeg,0,0,,"","",,,0 +13511,image/jpeg,0,0,,"","",,,0 +13512,image/jpeg,0,0,,"","",,,0 +13513,image/jpeg,0,0,,"","",,,0 +13514,image/jpeg,0,0,,"","",,,0 +13515,image/jpeg,1562397708940,0,90,"","",44.22791,12.0437969722222,0 +13516,image/jpeg,1562396704310,0,90,"","",44.2277739722222,12.0436189722222,0 +13517,image/jpeg,0,0,,"","",,,0 +13518,image/jpeg,0,0,,"","",,,0 +13519,image/jpeg,1562341833545,0,90,"","",44.22771,12.043651,0 +13520,image/jpeg,1562341824947,0,0,"","",44.2277059722222,12.043649,0 +13521,image/jpeg,1562341817397,0,90,"","",44.227716,12.043623,0 +13522,image/jpeg,1562341810691,0,0,"","",44.227715,12.043615,0 +13523,image/jpeg,1562341803961,0,90,"","",44.227696,12.0436049722222,0 +13524,image/jpeg,0,0,,"","",,,0 +13525,image/jpeg,0,0,,"","",,,0 +13526,image/jpeg,0,0,,"","",,,0 +13527,image/jpeg,0,0,,"","",,,0 +13528,image/jpeg,0,0,,"","",,,0 +13529,image/jpeg,1562255193342,0,90,"","",44.232418,12.008585,0 +13530,image/jpeg,1562255191287,0,90,"","",44.2326059722222,12.0086469722222,0 +13531,image/jpeg,1562255189095,0,90,"","",44.23245,12.0087689722222,0 +13532,image/jpeg,1562255184291,0,90,"","",44.2325179722222,12.0087559722222,0 +13533,image/jpeg,0,0,,"","",,,0 +13534,image/jpeg,0,0,,"","",,,0 +13535,image/jpeg,0,0,,"","",,,0 +13536,image/jpeg,0,0,,"","",,,0 +13537,image/jpeg,0,0,,"","",,,0 +13538,image/jpeg,0,0,,"","",,,0 +13539,image/jpeg,0,0,,"","",,,0 +13540,image/jpeg,0,0,,"","",,,0 +13541,image/jpeg,0,0,,"","",,,0 +13542,image/jpeg,0,0,,"","",,,0 +13543,image/jpeg,0,0,,"","",,,0 +13544,image/jpeg,0,0,,"","",,,0 +13545,image/jpeg,0,0,,"","",,,0 +13546,image/jpeg,0,0,,"","",,,0 +13547,image/jpeg,0,0,,"","",,,0 +13548,image/jpeg,0,0,,"","",,,0 +13549,image/jpeg,1561963473000,0,0,"","",44.2505886111111,12.0829002777778,0 +13550,image/jpeg,1561745046000,0,0,"","",44.2505886111111,12.0829002777778,0 +13551,image/jpeg,1561744979764,0,90,"","",44.2505769722222,12.082916,0 +13552,image/jpeg,1561744565149,0,0,"","",44.2505749722222,12.083322,0 +13553,image/jpeg,1561744565149,0,0,"","",44.2505749722222,12.083322,0 +13554,image/jpeg,1561744565149,0,0,"","",44.2505749722222,12.083322,0 +13555,video/mp4,1738662447000,0,90,"","",44.2506,12.0828,0 +13556,video/mp4,1738662378000,0,90,"","",44.2507,12.083,0 +13557,video/mp4,0,0,0,"","",,,0 +13558,video/mp4,0,0,0,"","",,,0 +13559,video/mp4,1680774370000,0,90,"","",44.2505,12.0828,0 +13560,video/mp4,0,0,0,"","",,,0 +13561,video/mp4,1680767195000,0,90,"","",44.2505,12.0831,0 +13562,video/mp4,1680766964000,0,90,"","",44.2506,12.0828,0 +13563,video/mp4,1680766855000,0,90,"","",44.2506,12.0828,0 +13564,video/mp4,1680766789000,0,90,"","",44.2505,12.0828,0 +13565,video/mp4,1680766777000,0,90,"","",44.2505,12.0828,0 +13566,video/mp4,1680766730000,0,90,"","",44.2506,12.0828,0 +13567,video/mp4,1680766710000,0,90,"","",44.2505,12.0829,0 +13568,video/mp4,1680766672000,0,90,"","",44.2505,12.0829,0 +13569,video/mp4,1680766103000,0,90,"","",44.2506,12.0828,0 +13570,video/mp4,1680765750000,0,90,"","",44.2506,12.0828,0 +13571,video/mp4,0,0,0,"","",,,0 +13572,video/mp4,0,0,0,"","",,,0 +13573,video/mp4,0,0,0,"","",,,0 +13574,video/mp4,0,0,0,"","",,,0 +13575,,0,0,0,"","",,,0 +13576,video/mp4,0,0,90,"","",,,0 +13577,video/mp4,0,0,0,"","",,,0 +13578,video/mp4,0,0,0,"","",,,0 +13579,video/mp4,0,0,0,"","",,,0 +13580,,0,0,0,"","",,,0 +13581,video/mp4,0,0,0,"","",,,0 +13582,video/mp4,0,0,90,"","",,,0 +13583,video/mp4,0,0,0,"","",,,0 +13584,video/mp4,0,0,0,"","",,,0 +13585,video/mp4,0,0,180,"","",,,0 +13586,video/mp4,0,0,90,"","",,,0 +13587,video/mp4,0,0,0,"","",,,0 +13588,video/mp4,0,0,0,"","",,,0 +13589,video/mp4,0,0,0,"","",,,0 +13590,video/mp4,0,0,90,"","",,,0 +13591,,0,0,0,"","",,,0 +13592,video/mp4,0,0,90,"","",,,0 +13593,video/mp4,0,0,90,"","",,,0 +13594,video/mp4,0,0,90,"","",,,0 +13595,video/mp4,0,0,90,"","",,,0 +13596,,0,0,0,"","",,,0 +13597,,0,0,0,"","",,,0 +13598,video/mp4,0,0,0,"","",,,0 +13599,video/mp4,0,0,180,"","",,,0 +13600,video/mp4,0,0,90,"","",,,0 +13601,video/mp4,0,0,90,"","",,,0 +13602,video/mp4,0,0,90,"","",,,0 +13603,,0,0,0,"","",,,0 +13604,video/mp4,0,0,0,"","",,,0 +13605,video/mp4,0,0,90,"","",,,0 +13606,video/mp4,0,0,0,"","",,,0 +13607,video/mp4,0,0,0,"","",,,0 +13608,video/mp4,0,0,0,"","",,,0 +13609,video/mp4,0,0,0,"","",,,0 +13610,,0,0,0,"","",,,0 +13611,video/mp4,0,0,0,"","",,,0 +13612,video/mp4,0,0,0,"","",,,0 +13613,video/mp4,0,0,0,"","",,,0 +13614,video/mp4,0,0,0,"","",,,0 +13615,video/mp4,0,0,0,"","",,,0 +13616,,0,0,0,"","",,,0 +13617,video/mp4,0,0,0,"","",,,0 +13618,,0,0,0,"","",,,0 +13619,video/mp4,0,0,0,"","",,,0 +13620,video/mp4,0,0,0,"","",,,0 +13621,,0,0,0,"","",,,0 +13622,video/mp4,0,0,0,"","",,,0 +13623,,0,0,0,"","",,,0 +13624,,0,0,0,"","",,,0 +13625,video/mp4,0,0,0,"","",,,0 +13626,video/mp4,0,0,90,"","",,,0 +13627,,0,0,0,"","",,,0 +13628,video/mp4,0,0,0,"","",,,0 +13629,video/mp4,0,0,0,"","",,,0 +13630,,0,0,0,"","",,,0 +13631,video/mp4,0,0,0,"","",,,0 +13632,video/mp4,0,0,90,"","",,,0 +13633,,0,0,0,"","",,,0 +13634,,0,0,0,"","",,,0 +13635,video/mp4,0,0,0,"","",,,0 +13636,video/mp4,0,0,0,"","",,,0 +13637,video/mp4,0,0,0,"","",,,0 +13638,video/mp4,0,0,0,"","",,,0 +13639,video/mp4,0,0,0,"","",,,0 +13640,video/mp4,0,0,0,"","",,,0 +13641,,0,0,0,"","",,,0 +13642,video/mp4,0,0,0,"","",,,0 +13643,video/mp4,0,0,90,"","",,,0 +13644,video/mp4,0,0,0,"","",,,0 +13645,video/mp4,0,0,90,"","",,,0 +13646,video/mp4,0,0,90,"","",,,0 +13647,video/mp4,0,0,90,"","",,,0 +13648,,0,0,0,"","",,,0 +13649,video/mp4,0,0,0,"","",,,0 +13650,,0,0,0,"","",,,0 +13651,video/mp4,0,0,0,"","",,,0 +13652,video/mp4,0,0,0,"","",,,0 +13653,,0,0,0,"","",,,0 +13654,video/mp4,0,0,90,"","",,,0 +13655,video/mp4,0,0,0,"","",,,0 +13656,video/mp4,0,0,90,"","",,,0 +13657,video/mp4,0,0,0,"","",,,0 +13658,,0,0,0,"","",,,0 +13659,video/mp4,0,0,0,"","",,,0 +13660,video/mp4,0,0,90,"","",,,0 +13661,video/mp4,0,0,0,"","",,,0 +13662,video/mp4,0,0,0,"","",,,0 +13663,video/mp4,0,0,0,"","",,,0 +13664,,0,0,0,"","",,,0 +13665,video/mp4,0,0,0,"","",,,0 +13666,video/mp4,0,0,0,"","",,,0 +13667,video/mp4,0,0,90,"","",,,0 +13668,video/mp4,0,0,90,"","",,,0 +13669,video/mp4,0,0,0,"","",,,0 +13670,video/mp4,0,0,0,"","",,,0 +13671,video/mp4,0,0,0,"","",,,0 +13672,video/mp4,0,0,0,"","",,,0 +13673,,0,0,0,"","",,,0 +13674,video/mp4,0,0,90,"","",,,0 +13675,video/mp4,0,0,90,"","",,,0 +13676,video/mp4,0,0,0,"","",,,0 +13677,video/mp4,0,0,90,"","",,,0 +13678,,0,0,0,"","",,,0 +13679,video/mp4,0,0,0,"","",,,0 +13680,video/mp4,0,0,0,"","",,,0 +13681,video/mp4,0,0,0,"","",,,0 +13682,video/mp4,0,0,0,"","",,,0 +13683,video/mp4,0,0,90,"","",,,0 +13684,video/mp4,0,0,90,"","",,,0 +13685,video/mp4,0,0,90,"","",,,0 +13686,video/mp4,0,0,270,"","",,,0 +13687,,0,0,0,"","",,,0 +13688,video/mp4,0,0,0,"","",,,0 +13689,video/mp4,0,0,0,"","",,,0 +13690,video/mp4,0,0,0,"","",,,0 +13691,video/mp4,0,0,90,"","",,,0 +13692,video/mp4,0,0,0,"","",,,0 +13693,video/mp4,0,0,0,"","",,,0 +13694,video/mp4,0,0,0,"","",,,0 +13695,video/mp4,0,0,0,"","",,,0 +13696,video/mp4,0,0,90,"","",,,0 +13697,video/mp4,0,0,90,"","",,,0 +13698,,0,0,0,"","",,,0 +13699,video/mp4,0,0,0,"","",,,0 +13700,video/mp4,0,0,0,"","",,,0 +13701,video/mp4,0,0,0,"","",,,0 +13702,video/mp4,0,0,0,"","",,,0 +13703,video/mp4,0,0,90,"","",,,0 +13704,video/mp4,0,0,0,"","",,,0 +13705,video/mp4,0,0,0,"","",,,0 +13706,video/mp4,0,0,0,"","",,,0 +13707,video/mp4,0,0,0,"","",,,0 +13708,video/mp4,0,0,0,"","",,,0 +13709,video/mp4,1665003884000,0,0,"","",44.1137,12.4224,0 +13710,video/mp4,1665003856000,0,0,"","",44.1137,12.4224,0 +13711,video/mp4,0,0,0,"","",,,0 +13712,video/mp4,0,0,0,"","",,,0 +13713,video/mp4,0,0,0,"","",,,0 +13714,video/mp4,0,0,0,"","",,,0 +13715,video/mp4,0,0,0,"","",,,0 +13716,video/mp4,0,0,0,"","",,,0 +13717,video/mp4,0,0,0,"","",,,0 +13718,video/mp4,1664398910000,0,0,"","",44.1137,12.4224,0 +13719,video/mp4,0,0,0,"","",,,0 +13720,video/mp4,0,0,0,"","",,,0 +13721,video/mp4,1664268022000,0,0,"","",,,0 +13722,video/mp4,0,0,90,"","",,,0 +13723,video/mp4,0,0,0,"","",,,0 +13724,video/mp4,0,0,90,"","",,,0 +13725,video/mp4,0,0,0,"","",,,0 +13726,video/mp4,0,0,0,"","",,,0 +13727,,0,0,0,"","",,,0 +13728,video/mp4,0,0,0,"","",,,0 +13729,video/mp4,0,0,0,"","",,,0 +13730,video/mp4,0,0,90,"","",,,0 +13731,video/mp4,0,0,90,"","",,,0 +13732,video/mp4,1656082556000,0,0,"","",46.549,11.7136,0 +13733,video/mp4,0,0,90,"","",,,0 +13734,video/mp4,0,0,90,"","",,,0 +13735,video/mp4,0,0,180,"","",,,0 +13736,video/mp4,1655894108000,0,0,"","",,,0 +13737,video/mp4,1655893848000,0,0,"","",,,0 +13738,video/mp4,0,0,0,"","",,,0 +13739,video/mp4,1655803018000,0,0,"","",,,0 +13740,video/mp4,1655800068000,0,0,"","",46.4387,11.6635,0 +13741,video/mp4,0,0,0,"","",,,0 +13742,video/mp4,1655469406000,0,0,"","",,,0 +13743,video/mp4,1655468862000,0,0,"","",,,0 +13744,video/mp4,0,0,0,"","",,,0 +13745,video/mp4,0,0,90,"","",,,0 +13746,video/mp4,0,0,0,"","",,,0 +13747,video/mp4,0,0,0,"","",,,0 +13748,video/mp4,0,0,0,"","",,,0 +13749,video/mp4,0,0,0,"","",,,0 +13750,video/mp4,0,0,90,"","",,,0 +13751,video/mp4,0,0,0,"","",,,0 +13752,video/mp4,0,0,90,"","",,,0 +13753,video/mp4,0,0,90,"","",,,0 +13754,video/mp4,0,0,90,"","",,,0 +13755,video/mp4,0,0,0,"","",,,0 +13756,video/mp4,0,0,0,"","",,,0 +13757,video/mp4,0,0,90,"","",,,0 +13758,video/mp4,0,0,90,"","",,,0 +13759,,0,0,0,"","",,,0 +13760,video/mp4,0,0,90,"","",,,0 +13761,video/mp4,0,0,90,"","",,,0 +13762,video/mp4,0,0,90,"","",,,0 +13763,video/mp4,0,0,90,"","",,,0 +13764,video/mp4,0,0,90,"","",,,0 +13765,video/mp4,0,0,90,"","",,,0 +13766,video/mp4,0,0,90,"","",,,0 +13767,video/mp4,0,0,90,"","",,,0 +13768,video/mp4,0,0,90,"","",,,0 +13769,video/mp4,0,0,90,"","",,,0 +13770,video/mp4,0,0,90,"","",,,0 +13771,video/mp4,0,0,90,"","",,,0 +13772,video/mp4,0,0,90,"","",,,0 +13773,video/mp4,0,0,90,"","",,,0 +13774,video/mp4,0,0,0,"","",,,0 +13775,video/mp4,0,0,0,"","",,,0 +13776,video/mp4,0,0,0,"","",,,0 +13777,video/mp4,0,0,0,"","",,,0 +13778,video/mp4,0,0,0,"","",,,0 +13779,video/mp4,1654853708000,0,0,"","",,,0 +13780,video/mp4,1654797415000,0,0,"","",,,0 +13781,video/mp4,0,0,0,"","",,,0 +13782,,0,0,0,"","",,,0 +13783,video/mp4,0,0,90,"","",,,0 +13784,video/mp4,0,0,0,"","",,,0 +13785,video/mp4,0,0,90,"","",,,0 +13786,video/mp4,0,0,0,"","",,,0 +13787,,0,0,0,"","",,,0 +13788,video/mp4,0,0,90,"","",,,0 +13789,video/mp4,0,0,90,"","",,,0 +13790,video/mp4,0,0,0,"","",,,0 +13791,video/mp4,0,0,270,"","",,,0 +13792,video/mp4,0,0,90,"","",,,0 +13793,video/mp4,0,0,90,"","",,,0 +13794,video/mp4,0,0,90,"","",,,0 +13795,video/mp4,0,0,90,"","",,,0 +13796,video/mp4,0,0,90,"","",,,0 +13797,video/mp4,0,0,90,"","",,,0 +13798,video/mp4,0,0,90,"","",,,0 +13799,video/mp4,0,0,90,"","",,,0 +13800,video/mp4,0,0,180,"","",,,0 +13801,video/mp4,1653142687000,0,0,"","",,,0 +13802,video/mp4,1653142562000,0,0,"","",,,0 +13803,video/mp4,1653142000000,0,0,"","",44.2506,12.0828,0 +13804,video/mp4,0,0,0,"","",,,0 +13805,video/mp4,0,0,180,"","",,,0 +13806,video/mp4,1653050499000,0,0,"","",44.356,12.3098,0 +13807,video/mp4,0,0,0,"","",,,0 +13808,video/mp4,0,0,0,"","",,,0 +13809,,0,0,0,"","",,,0 +13810,video/mp4,0,0,0,"","",,,0 +13811,video/mp4,0,0,0,"","",,,0 +13812,,0,0,0,"","",,,0 +13813,video/mp4,0,0,0,"","",,,0 +13814,video/mp4,0,0,0,"","",,,0 +13815,video/mp4,1652873447000,0,0,"","",44.2405,11.9954,0 +13816,video/mp4,1652873170000,0,90,"","",44.2404,11.9954,0 +13817,video/mp4,0,0,0,"","",,,0 +13818,video/mp4,0,0,0,"","",,,0 +13819,video/mp4,0,0,0,"","",,,0 +13820,video/mp4,0,0,0,"","",,,0 +13821,video/mp4,0,0,90,"","",,,0 +13822,video/mp4,0,0,0,"","",,,0 +13823,video/mp4,0,0,90,"","",,,0 +13824,,0,0,0,"","",,,0 +13825,,0,0,0,"","",,,0 +13826,video/mp4,0,0,90,"","",,,0 +13827,video/mp4,1651957960000,0,0,"","",44.2826,12.3503,0 +13828,video/mp4,0,0,0,"","",,,0 +13829,video/mp4,0,0,0,"","",,,0 +13830,video/mp4,0,0,90,"","",,,0 +13831,video/mp4,0,0,90,"","",,,0 +13832,video/mp4,0,0,0,"","",,,0 +13833,video/mp4,0,0,90,"","",,,0 +13834,video/mp4,0,0,0,"","",,,0 +13835,video/mp4,0,0,90,"","",,,0 +13836,video/mp4,0,0,90,"","",,,0 +13837,video/mp4,0,0,0,"","",,,0 +13838,video/mp4,0,0,90,"","",,,0 +13839,video/mp4,0,0,0,"","",,,0 +13840,video/mp4,0,0,0,"","",,,0 +13841,video/mp4,0,0,0,"","",,,0 +13842,video/mp4,0,0,0,"","",,,0 +13843,video/mp4,0,0,0,"","",,,0 +13844,video/mp4,0,0,90,"","",,,0 +13845,video/mp4,0,0,90,"","",,,0 +13846,video/mp4,1645631524000,0,0,"","",46.4966,11.7516,0 +13847,video/mp4,1645631395000,0,90,"","",46.4966,11.7516,0 +13848,video/mp4,0,0,90,"","",,,0 +13849,video/mp4,0,0,90,"","",,,0 +13850,video/mp4,1644673334000,0,0,"","",45.4403,12.3345,0 +13851,video/mp4,0,0,90,"","",,,0 +13852,video/mp4,0,0,90,"","",,,0 +13853,video/mp4,0,0,90,"","",,,0 +13854,video/mp4,0,0,90,"","",,,0 +13855,video/mp4,0,0,90,"","",,,0 +13856,video/mp4,0,0,90,"","",,,0 +13857,video/mp4,0,0,90,"","",,,0 +13858,video/mp4,1639926429000,0,90,"","",44.277,12.3485,0 +13859,video/mp4,1639926182000,0,90,"","",44.2767,12.3487,0 +13860,video/mp4,1639926141000,0,90,"","",44.2767,12.3487,0 +13861,video/mp4,0,0,0,"","",,,0 +13862,video/mp4,0,0,90,"","",,,0 +13863,video/mp4,0,0,90,"","",,,0 +13864,video/mp4,1638788859000,0,0,"","",45.4404,12.3345,0 +13865,,0,0,0,"","",,,0 +13866,,0,0,0,"","",,,0 +13867,video/mp4,1635674384000,0,0,"","",40.6317,14.3698,0 +13868,video/mp4,1631955632000,0,90,"","",44.1515,12.133,0 +13869,video/mp4,1631953876000,0,0,"","",44.179,12.1195,0 +13870,video/mp4,1631953858000,0,0,"","",44.179,12.1195,0 +13871,video/mp4,1631953809000,0,0,"","",44.1792,12.1196,0 +13872,video/mp4,1631344972000,0,90,"","",42.8573,10.7743,0 +13873,video/mp4,1631344752000,0,0,"","",42.8573,10.7743,0 +13874,video/mp4,1630499488000,0,0,"","",43.9514,12.8223,0 +13875,video/mp4,1630499416000,0,0,"","",43.9514,12.8223,0 +13876,video/mp4,1630489705000,0,270,"","",44.0771,12.5749,0 +13877,video/mp4,1630484668000,0,0,"","",44.2076,12.4035,0 +13878,video/mp4,1630484640000,0,0,"","",44.2076,12.4035,0 +13879,video/mp4,1623079427000,0,0,"","",44.2507,12.0829,0 +13880,video/mp4,1621700148000,0,90,"","",44.2427,11.9104,0 +13881,video/mp4,1621067186000,0,0,"","",44.2485,11.7164,0 +13882,video/mp4,1621067157000,0,0,"","",44.2485,11.7164,0 +13883,video/mp4,1619864930000,0,90,"","",,,0 +13884,video/mp4,1619864916000,0,90,"","",42.5537,12.7124,0 +13885,video/mp4,1619864888000,0,90,"","",,,0 +13886,video/mp4,1619864517000,0,90,"","",,,0 +13887,video/mp4,1619864442000,0,90,"","",42.5532,12.7129,0 +13888,video/mp4,1619863983000,0,0,"","",42.5532,12.7139,0 +13889,video/mp4,1619863902000,0,90,"","",42.553,12.7141,0 +13890,video/mp4,1619863885000,0,90,"","",42.553,12.7141,0 +13891,video/mp4,1619863871000,0,90,"","",42.553,12.7141,0 +13892,video/mp4,1619860362000,0,90,"","",42.5539,12.714,0 +13893,video/mp4,0,0,0,"","",,,0 +13894,video/mp4,1606552718000,0,90,"","",44.2506,12.0829,0 +13895,video/mp4,1599555285000,0,90,"","",,,0 +13896,video/mp4,1595066788000,0,90,"","",46.6297,12.3401,0 +13897,video/mp4,1587569702000,0,90,"","",44.2506,12.0828,0 +13898,video/mp4,1585426658000,0,90,"","",,,0 +13899,video/mp4,1583356551000,0,0,"","",44.1137,12.4224,0 +13900,video/mp4,1582402959000,0,0,"","",44.1498,11.9931,0 +13901,video/mp4,1578344219000,0,90,"","",44.0134,12.6432,0 +13902,video/mp4,1577833473000,0,90,"","",44.2506,12.0829,0 +13903,video/mp4,1576942054000,0,0,"","",44.2905,12.1793,0 +13904,video/mp4,1575726539000,0,90,"","",,,0 +13905,video/mp4,1575217377000,0,90,"","",44.2505,12.0829,0 +13906,video/mp4,1574584820000,0,90,"","",44.2509,12.083,0 +13907,video/mp4,1574527981000,0,90,"","",44.2507,12.0829,0 +13908,video/mp4,1574527913000,0,90,"","",44.2506,12.0831,0 +13909,video/mp4,1571416770000,0,0,"","",44.2505,12.083,0 +13910,video/mp4,1569062779000,0,90,"","",44.1496,12.1354,0 +13911,video/mp4,1569061196000,0,90,"","",44.1495,12.1355,0 +13912,video/mp4,1567867108000,0,0,"","",44.2168,12.0303,0 diff --git a/docs/metadata_schema.txt b/docs/metadata_schema.txt new file mode 100644 index 0000000..ca9dfff --- /dev/null +++ b/docs/metadata_schema.txt @@ -0,0 +1,10 @@ +0|id|INTEGER|0||1 +1|mimeType|TEXT|0||0 +2|dateMillis|INTEGER|0||0 +3|flags|INTEGER|0||0 +4|rotationDegrees|INTEGER|0||0 +5|xmpSubjects|TEXT|0||0 +6|xmpTitle|TEXT|0||0 +7|latitude|REAL|0||0 +8|longitude|REAL|0||0 +9|rating|INTEGER|0||0 diff --git a/docs/output.txt b/docs/output.txt new file mode 100644 index 0000000..a6ddcd7 --- /dev/null +++ b/docs/output.txt @@ -0,0 +1,16053 @@ + +┌─────────────────────────────────────────────────────────┐ +│ A new version of Flutter is available! │ +│ │ +│ To update to the latest version, run "flutter upgrade". │ +└─────────────────────────────────────────────────────────┘ +No devices found yet. Checking for wireless devices... +Resolving dependencies... +Downloading packages... + _fe_analyzer_shared 85.0.0 (97.0.0 available) + analyzer 7.7.1 (11.0.0 available) + characters 1.4.0 (1.4.1 available) + csv 6.0.0 (7.2.0 available) + flex_color_picker 3.7.2 (3.8.0 available) + flex_seed_scheme 3.6.1 (4.0.1 available) + flutter_secure_storage 9.2.4 (10.0.0 available) + flutter_secure_storage_linux 1.2.3 (3.0.0 available) + flutter_secure_storage_macos 3.1.3 (4.0.0 available) + flutter_secure_storage_platform_interface 1.1.2 (2.0.1 available) + flutter_secure_storage_web 1.2.1 (2.1.0 available) + flutter_secure_storage_windows 3.1.2 (4.1.0 available) + google_maps_flutter 2.14.2 (2.15.0 available) + google_maps_flutter_ios 2.17.4 (2.18.0 available) + google_maps_flutter_web 0.5.14+3 (0.6.1 available) + idb_shim 2.6.7+1 (2.8.2+4 available) + image 4.5.4 (4.8.0 available) + js 0.6.7 (0.7.2 available) + local_auth_darwin 2.0.1 (2.0.3 available) + matcher 0.12.17 (0.12.19 available) + material_color_utilities 0.11.1 (0.13.0 available) + meta 1.16.0 (1.18.1 available) + mgrs_dart 2.0.0 (3.0.0 available) + palette_generator 0.3.3+7 (discontinued) + path_provider_foundation 2.5.1 (2.6.0 available) + pin_code_fields 8.0.1 (9.1.0 available) + proj4dart 2.1.0 (3.0.0 available) + protobuf 3.1.0 (6.0.0 available) + sembast 3.8.5+2 (3.8.6 available) +! shared_preferences_android 2.4.18 (overridden) (2.4.21 available) + sqflite_android 2.4.2+2 (2.4.2+3 available) + test 1.26.2 (1.30.0 available) + test_api 0.7.6 (0.7.10 available) + test_core 0.6.11 (0.6.16 available) + unicode 0.3.1 (1.1.9 available) + url_launcher_ios 6.3.6 (6.4.1 available) + url_launcher_web 2.4.1 (2.4.2 available) + vector_map_tiles 9.0.0-beta.8 (10.0.0-beta.2 available) + vector_tile 2.0.1 (3.0.1 available) + video_player 2.10.1 (2.11.1 available) + video_player_avfoundation 2.8.9 (2.9.4 available) + win32 5.15.0 (6.0.0 available) + win32_registry 2.1.0 (3.0.2 available) +Got dependencies! +1 package is discontinued. +42 packages have newer versions incompatible with dependency constraints. +Try `flutter pub outdated` for more information. +"az": 668 untranslated message(s). +"be": 42 untranslated message(s). +"bg": 2 untranslated message(s). +"bn": 699 untranslated message(s). +"ca": 2 untranslated message(s). +"ckb": 257 untranslated message(s). +"da": 2 untranslated message(s). +"el": 3 untranslated message(s). +"en_Shaw": 3 untranslated message(s). +"eu": 40 untranslated message(s). +"fa": 2 untranslated message(s). +"fi": 2 untranslated message(s). +"he": 643 untranslated message(s). +"hi": 219 untranslated message(s). +"hr": 724 untranslated message(s). +"hu": 3 untranslated message(s). +"id": 3 untranslated message(s). +"it": 3 untranslated message(s). +"ja": 35 untranslated message(s). +"kmr": 407 untranslated message(s). +"lt": 3 untranslated message(s). +"ml": 722 untranslated message(s). +"my": 157 untranslated message(s). +"nb": 80 untranslated message(s). +"ne": 724 untranslated message(s). +"nn": 96 untranslated message(s). +"or": 651 untranslated message(s). +"pt": 3 untranslated message(s). +"ro": 1 untranslated message(s). +"sat": 722 untranslated message(s). +"sk": 21 untranslated message(s). +"sl": 720 untranslated message(s). +"sr": 721 untranslated message(s). +"th": 448 untranslated message(s). +"tr": 1 untranslated message(s). +"ur": 724 untranslated message(s). +"vi": 31 untranslated message(s). +"zh_Hant": 2 untranslated message(s). +To see a detailed report, use the untranslated-messages-file +option in the l10n.yaml file: +untranslated-messages-file: desiredFileName.txt +<other option>: <other selection> + + +This will generate a JSON format file containing all messages that +need to be translated. +Launching lib/main_play.dart on 2109119DG (wireless) in debug mode... +Running Gradle task 'assemblePlayDebug'... +Tasks=[assemblePlayDebug] +Extra= + android.enableR8.fullMode=false + android.useAndroidX=true + aves.useCrashlytics=true + base-application-name=android.app.Application + dart-defines=RkxVVFRFUl9BUFBfRkxBVk9SPXBsYXk=,RkxVVFRFUl9WRVJTSU9OPTMuMzUuNw==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049YWRjOTAxMDYyNQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDM1MzE2NTY1YQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My45LjI= + dart-obfuscation=false + filesystem-scheme=org-dartlang-root + gradleKotlinDsl.stage1AccessorsClassPath=AccessorsClassPath(bin=[/Users/fabio/.gradle/caches/8.14.4/kotlin-dsl/accessors/5e5b7043d8bc55144d9a87ab691144b7-VC/classes, /Users/fabio/.gradle/caches/8.14.4/kotlin-dsl/accessors/5e5b7043d8bc55144d9a87ab691144b7-PS/classes], src=[/Users/fabio/.gradle/caches/8.14.4/kotlin-dsl/accessors/5e5b7043d8bc55144d9a87ab691144b7-VC/sources, /Users/fabio/.gradle/caches/8.14.4/kotlin-dsl/accessors/5e5b7043d8bc55144d9a87ab691144b7-PS/sources]) + kotlin.code.style=official + org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError + target-platform=android-arm64 + target=/Volumes/terrain/aves_mio5/lib/main_play.dart + track-widget-creation=true + tree-shake-icons=false +Load keystore props from file=/Volumes/terrain/aves_mio5/android/key.properties +Create signing config for release using file=../keystore/release.jks +Building flavor with Crashlytics plugin +Application variant applicationId=deckers.thibault.aves.debug name=playDebug +Application variant applicationId=deckers.thibault.aves.debug name=izzyDebug +Application variant applicationId=deckers.thibault.aves.libre.debug name=libreDebug +Application variant applicationId=deckers.thibault.aves.libre.debug name=libre_romDebug +Application variant applicationId=deckers.thibault.aves name=playRelease +Application variant applicationId=deckers.thibault.aves name=izzyRelease +Application variant applicationId=deckers.thibault.aves.libre name=libreRelease +Application variant applicationId=deckers.thibault.aves.libre name=libre_romRelease +Application variant applicationId=deckers.thibault.aves name=playProfile +Application variant applicationId=deckers.thibault.aves name=izzyProfile +Application variant applicationId=deckers.thibault.aves.libre name=libreProfile +Application variant applicationId=deckers.thibault.aves.libre name=libre_romProfile +Running Gradle task 'assemblePlayDebug'... 149,7s +✓ Built build/app/outputs/flutter-apk/app-play-debug.apk +Installing build/app/outputs/flutter-apk/app-play-debug.apk... 19,1s +D/FlutterJNI(26629): Beginning load of flutter... +D/FlutterJNI(26629): flutter (null) was loaded normally! +I/flutter (26629): [IMPORTANT:flutter/shell/platform/android/android_context_vk_impeller.cc(62)] Using the Impeller rendering backend (Vulkan). +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/accessibility method=shouldUseBoldFont arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/window method=getCutoutInsets arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/window method=isInPictureInPictureMode arguments=null +I/flutter (26629): start listening to app lifecycle +Syncing files to device 2109119DG (wireless)... 229ms +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getFirstDayOfWeek arguments=null + +Flutter run key commands. +r Hot reload. 🔥🔥🔥 +R Hot restart. +h List all available interactive commands. +d Detach (terminate "flutter run" but leave application running). +c Clear the screen +q Quit (terminate the application on the device). + +A Dart VM Service on 2109119DG (wireless) is available at: http://127.0.0.1:63367/Ys8EG9mCb1Y=/ +I/flutter (26629): leak_tracker: 0 memory leak(s): not disposed: 0, not GCed: 0, GCed late: 0 +E/FileUtils(26629): err write to mi_exception_log +The Flutter DevTools debugger and profiler on 2109119DG (wireless) is available at: http://127.0.0.1:9101?uri=http://127.0.0.1:63367/Ys8EG9mCb1Y=/ +I/Choreographer(26629): Skipped 307 frames! The application may be doing too much work on its main thread. +I/ault.aves.debug(26629): Compiler allocated 4568KB to compile void android.view.ViewRootImpl.performTraversals() +W/ault.aves.debug(26629): type=1400 audit(0.0:276196): avc: denied { read } for name="u:object_r:vendor_display_prop:s0" dev="tmpfs" ino=2548 scontext=u:r:untrusted_app:s0:c144,c258,c512,c768 tcontext=u:object_r:vendor_display_prop:s0 tclass=file permissive=0 app=deckers.thibault.aves.debug +W/libc (26629): Access denied finding property "vendor.display.enable_optimal_refresh_rate" +D/VRI[MainActivity](26629): vri.reportNextDraw android.view.ViewRootImpl.performTraversals:4411 android.view.ViewRootImpl.doTraversal:3040 android.view.ViewRootImpl$TraversalRunnable.run:10429 android.view.Choreographer$CallbackRecord.run:1654 android.view.Choreographer$CallbackRecord.run:1663 +D/SurfaceView(26629): UPDATE null, mIsCastMode = false +W/ault.aves.debug(26629): type=1400 audit(0.0:276197): avc: denied { read } for name="u:object_r:vendor_display_prop:s0" dev="tmpfs" ino=2548 scontext=u:r:untrusted_app:s0:c144,c258,c512,c768 tcontext=u:object_r:vendor_display_prop:s0 tclass=file permissive=0 app=deckers.thibault.aves.debug +W/libc (26629): Access denied finding property "vendor.display.enable_optimal_refresh_rate" +E/OpenGLRenderer(26629): Unable to match the desired swap behavior. +E/qdgralloc(26629): GetGpuPixelFormat: No map for format: 0x38 +E/AdrenoUtils(26629): <validate_memory_layout_input_parmas:1970>: Unknown Format 0 +E/AdrenoUtils(26629): <adreno_init_memory_layout:4720>: Memory Layout input parameter validation failed! +E/qdgralloc(26629): GetGpuResourceSizeAndDimensions Graphics metadata init failed +E/Gralloc4(26629): isSupported(1, 1, 56, 1, ...) failed with 1 +E/GraphicBufferAllocator(26629): Failed to allocate (4 x 4) layerCount 1 format 56 usage b00: 1 +E/AHardwareBuffer(26629): GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0 +E/qdgralloc(26629): GetGpuPixelFormat: No map for format: 0x3b +E/AdrenoUtils(26629): <validate_memory_layout_input_parmas:1970>: Unknown Format 0 +E/AdrenoUtils(26629): <adreno_init_memory_layout:4720>: Memory Layout input parameter validation failed! +E/qdgralloc(26629): GetGpuResourceSizeAndDimensions Graphics metadata init failed +E/Gralloc4(26629): isSupported(1, 1, 59, 1, ...) failed with 1 +E/GraphicBufferAllocator(26629): Failed to allocate (4 x 4) layerCount 1 format 59 usage b00: 1 +E/AHardwareBuffer(26629): GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0 +E/qdgralloc(26629): GetGpuPixelFormat: No map for format: 0x38 +E/AdrenoUtils(26629): <validate_memory_layout_input_parmas:1970>: Unknown Format 0 +E/AdrenoUtils(26629): <adreno_init_memory_layout:4720>: Memory Layout input parameter validation failed! +E/qdgralloc(26629): GetGpuResourceSizeAndDimensions Graphics metadata init failed +E/Gralloc4(26629): isSupported(1, 1, 56, 1, ...) failed with 1 +E/GraphicBufferAllocator(26629): Failed to allocate (4 x 4) layerCount 1 format 56 usage b00: 1 +E/AHardwareBuffer(26629): GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0 +E/qdgralloc(26629): GetGpuPixelFormat: No map for format: 0x3b +E/AdrenoUtils(26629): <validate_memory_layout_input_parmas:1970>: Unknown Format 0 +E/AdrenoUtils(26629): <adreno_init_memory_layout:4720>: Memory Layout input parameter validation failed! +E/qdgralloc(26629): GetGpuResourceSizeAndDimensions Graphics metadata init failed +E/Gralloc4(26629): isSupported(1, 1, 59, 1, ...) failed with 1 +E/GraphicBufferAllocator(26629): Failed to allocate (4 x 4) layerCount 1 format 59 usage b00: 1 +E/AHardwareBuffer(26629): GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0 +E/FileUtils(26629): err write to mi_exception_log +E/FileUtils(26629): err write to mi_exception_log +I/flutter (26629): dynamic_color: Core palette detected. +E/LB (26629): fail to open node: No such file or directory +I/Choreographer(26629): Skipped 47 frames! The application may be doing too much work on its main thread. +D/VRI[MainActivity](26629): vri.reportNextDraw android.view.ViewRootImpl.performTraversals:4411 android.view.ViewRootImpl.doTraversal:3040 android.view.ViewRootImpl$TraversalRunnable.run:10429 android.view.Choreographer$CallbackRecord.run:1654 android.view.Choreographer$CallbackRecord.run:1663 +D/SurfaceView(26629): UPDATE Surface(name=SurfaceView[deckers.thibault.aves.debug/deckers.thibault.aves.MainActivity]#34672)/@0xaab1fed, mIsProjectionMode = false +D/VRI[MainActivity](26629): vri.Setup new sync=wmsSync-VRI[MainActivity]#1 +D/OpenGLRenderer(26629): makeCurrent grContext:0xb400007e7a635640 reset mTextureAvailable +D/ault.aves.debug(26629): MiuiProcessManagerServiceStub setSchedFifo +I/MiuiProcessManagerImpl(26629): setSchedFifo pid:26629, mode:3 +D/VRI[MainActivity](26629): vri.reportDrawFinished +E/FileUtils(26629): err write to mi_exception_log +E/FileUtils(26629): err write to mi_exception_log +I/OpenGLRenderer(26629): Davey! duration=846ms; Flags=1, FrameTimelineVsyncId=103265351, IntendedVsync=246146062778775, Vsync=246146839736762, InputEventId=0, HandleInputStart=246146856058964, AnimationStart=246146856060370, PerformTraversalsStart=246146856061412, DrawStart=246146869454953, FrameDeadline=246146079445441, FrameInterval=246146855545995, FrameStartTime=16531021, FlingPosition=0, SyncQueued=246146874811568, SyncStart=246146877991568, IssueDrawCommandsStart=246146885646568, SwapBuffers=246146910219537, FrameCompleted=246146912147506, DequeueBufferDuration=4842344, QueueBufferDuration=390886, GpuCompleted=246146912147506, SwapBuffersCompleted=246146911293912, DisplayPresentTime=0, CommandSubmissionCompleted=246146910219537, +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/window method=isInMultiWindowMode arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getCapabilities arguments=null +I/HandWritingStubImpl(26629): refreshLastKeyboardType: 1 +I/HandWritingStubImpl(26629): getCurrentKeyboardType: 1 +W/MIUIScout App(26629): Enter APP_SCOUT_SLOW state +I/HandWritingStubImpl(26629): getCurrentKeyboardType: 1 +I/flutter (26629): Device has Google Play Services=true +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/window method=isRotationLocked arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/accessibility method=getLongPressTimeout arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/accessibility method=areAnimationsRemoved arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/window method=requestOrientation arguments={orientation: -1} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/window method=isActivity arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/window method=keepScreenOn arguments={on: false} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/window method=requestOrientation arguments={orientation: -1} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=setLocaleConfig arguments={locales: [en, ar, be, bg, ca, cs, da, de, el, en-Shaw, es, et, eu, fa, fi, fr, gl, hu, id, is, it, ja, kn, ko, lt, nb, nl, nn, pl, pt, ro, ru, sk, sv, ta, tr, uk, vi, zh, zh-Hant]} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/storage method=deleteTempDirectory arguments=null +I/flutter (26629): App setup in 2745ms +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/window method=isActivity arguments=null +I/flutter (26629): media_kit: NativeReferenceHolder: Allocated -5476376605270937600 +I/flutter (26629): Apply display refresh rate: auto +I/flutter (26629): enable Firebase & Crashlytics collection +E/qdgralloc(26629): GetGpuPixelFormat: No map for format: 0x38 +E/AdrenoUtils(26629): <validate_memory_layout_input_parmas:1970>: Unknown Format 0 +E/AdrenoUtils(26629): <adreno_init_memory_layout:4720>: Memory Layout input parameter validation failed! +E/qdgralloc(26629): GetGpuResourceSizeAndDimensions Graphics metadata init failed +E/Gralloc4(26629): isSupported(1, 1, 56, 1, ...) failed with 1 +E/GraphicBufferAllocator(26629): Failed to allocate (4 x 4) layerCount 1 format 56 usage b00: 1 +E/AHardwareBuffer(26629): GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0 +E/qdgralloc(26629): GetGpuPixelFormat: No map for format: 0x3b +E/AdrenoUtils(26629): <validate_memory_layout_input_parmas:1970>: Unknown Format 0 +E/AdrenoUtils(26629): <adreno_init_memory_layout:4720>: Memory Layout input parameter validation failed! +E/qdgralloc(26629): GetGpuResourceSizeAndDimensions Graphics metadata init failed +E/Gralloc4(26629): isSupported(1, 1, 59, 1, ...) failed with 1 +E/GraphicBufferAllocator(26629): Failed to allocate (4 x 4) layerCount 1 format 59 usage b00: 1 +E/AHardwareBuffer(26629): GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0 +E/qdgralloc(26629): GetGpuPixelFormat: No map for format: 0x38 +E/AdrenoUtils(26629): <validate_memory_layout_input_parmas:1970>: Unknown Format 0 +E/AdrenoUtils(26629): <adreno_init_memory_layout:4720>: Memory Layout input parameter validation failed! +E/qdgralloc(26629): GetGpuResourceSizeAndDimensions Graphics metadata init failed +E/Gralloc4(26629): isSupported(1, 1, 56, 1, ...) failed with 1 +E/GraphicBufferAllocator(26629): Failed to allocate (4 x 4) layerCount 1 format 56 usage b00: 1 +E/AHardwareBuffer(26629): GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0 +E/qdgralloc(26629): GetGpuPixelFormat: No map for format: 0x3b +E/AdrenoUtils(26629): <validate_memory_layout_input_parmas:1970>: Unknown Format 0 +E/AdrenoUtils(26629): <adreno_init_memory_layout:4720>: Memory Layout input parameter validation failed! +E/qdgralloc(26629): GetGpuResourceSizeAndDimensions Graphics metadata init failed +E/Gralloc4(26629): isSupported(1, 1, 59, 1, ...) failed with 1 +E/GraphicBufferAllocator(26629): Failed to allocate (4 x 4) layerCount 1 format 59 usage b00: 1 +E/AHardwareBuffer(26629): GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0 +E/Surface (26629): freeAllBuffers: 1 buffers were freed while being dequeued! +D/permissions_handler(26629): No permissions found in manifest for: []15 +E/BinderMonitor(26629): err open binder_delay errno=2 +E/FileUtils(26629): err write to mi_exception_log +E/FileUtils(26629): err write to mi_exception_log +D/FirebaseSessions(26629): App backgrounded on deckers.thibault.aves.debug +I/flutter (26629): Report log=Lifecycle inactive +I/flutter (26629): Report log=Launch +D/CompatibilityChangeReporter(26629): Compat change id reported: 78294732; UID 10656; state: ENABLED +D/FirebaseSessions(26629): App foregrounded on deckers.thibault.aves.debug +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/intent method=getIntentData arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=isLocked arguments=null +I/flutter (26629): Report log=Lifecycle resumed +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/media_store method=getGeneration arguments=null +I/HandWritingStubImpl(26629): refreshLastKeyboardType: 1 +I/HandWritingStubImpl(26629): getCurrentKeyboardType: 1 +I/flutter (26629): Device is connected=true +I/flutter (26629): Device is locked=false +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/storage method=getStorageVolumes arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/storage method=getVaultRoot arguments=null +I/flutter (26629): Access installed app inventory +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/app method=getPackages arguments=null +I/flutter (26629): App mode set to AppMode.main +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/global_search method=registerCallback arguments={callbackHandle: 1758071314359097928} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis method=registerCallback arguments={callbackHandle: 229794993780259166} +I/flutter (26629): Report log=Initialize source to start app with mode=AppMode.main, loaded scope=null +I/flutter (26629): Report log=MediaStoreSource init target scope={} +I/flutter (26629): [localMediaDb] opened db path=/data/user/0/deckers.thibault.aves.debug/databases/metadata.db +I/flutter (26629): MediaStoreSource load essentials complete in 205ms +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/media_store method=getGeneration arguments=null +I/flutter (26629): Report log=MediaStoreSource load (known) start +I/flutter (26629): [startup] source.init done in 222ms +I/flutter (26629): [localMediaDb] loadEntries(origin=1, directory=null) +I/flutter (26629): [localMediaDb] SQL(queryCursor) WHERE="origin = ?" args=[1] +I/flutter (26629): [cleanup][pre] remoti in DB = 0 +I/flutter (26629): [localMediaDb] rows read=0 kept=0 +I/flutter (26629): MediaStoreSource load 0:00:00.006646 clear local entries deleted 0 rows +I/flutter (26629): [localMediaDb][diag] check COUNT(origin=1)=0 +I/flutter (26629): [remote-append] candidati=0 +I/flutter (26629): [remote-append] visibili=0 +I/flutter (26629): [remote-append] appese=0 (prima=0 -> dopo=0) +I/flutter (26629): [startup] appendRemoteEntries (pre-sync) in 19ms +I/flutter (26629): Home setup complete in 3767ms +I/flutter (26629): Report log=Nav push to /collection +I/flutter (26629): Report log=Nav remove to unnamed null +I/flutter (26629): [cleanup][post] remoti in DB = 0 (Δ=0) +I/flutter (26629): MediaStoreSource load 0:00:00.066191 load 0 top entries +I/flutter (26629): MediaStoreSource load 0:00:00.066879 fetch known entries +I/flutter (26629): [localMediaDb] loadEntries(origin=0, directory=null) +I/flutter (26629): [localMediaDb] SQL(queryCursor) WHERE="origin = ?" args=[0] +I/flutter (26629): [localMediaDb] rows read=0 kept=0 +I/flutter (26629): Report log=MediaStoreSource found 0 known entries +I/flutter (26629): MediaStoreSource load 0:00:00.070745 check obsolete entries +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/media_store method=checkObsoleteContentIds arguments={knownContentIds: []} +E/StorageCipher18Impl(26629): unwrap key failed +E/StorageCipher18Impl(26629): java.security.InvalidKeyException: Failed to unwrap key +E/StorageCipher18Impl(26629): at android.security.keystore2.AndroidKeyStoreCipherSpiBase.engineUnwrap(AndroidKeyStoreCipherSpiBase.java:807) +E/StorageCipher18Impl(26629): at javax.crypto.Cipher.unwrap(Cipher.java:2459) +E/StorageCipher18Impl(26629): at com.it_nomads.fluttersecurestorage.ciphers.RSACipher18Implementation.unwrap(RSACipher18Implementation.java:58) +E/StorageCipher18Impl(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.<init>(StorageCipher18Implementation.java:39) +E/StorageCipher18Impl(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipherAlgorithm$$ExternalSyntheticLambda0.apply(D8$$SyntheticClass:0) +E/StorageCipher18Impl(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipherFactory.getSavedStorageCipher(StorageCipherFactory.java:78) +E/StorageCipher18Impl(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.initStorageCipher(FlutterSecureStorage.java:185) +E/StorageCipher18Impl(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:162) +E/StorageCipher18Impl(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/StorageCipher18Impl(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/StorageCipher18Impl(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/StorageCipher18Impl(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/StorageCipher18Impl(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/StorageCipher18Impl(26629): at android.os.Looper.loop(Looper.java:314) +E/StorageCipher18Impl(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/StorageCipher18Impl(26629): Caused by: javax.crypto.IllegalBlockSizeException +E/StorageCipher18Impl(26629): at android.security.keystore2.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:628) +E/StorageCipher18Impl(26629): at android.security.keystore2.AndroidKeyStoreCipherSpiBase.engineUnwrap(AndroidKeyStoreCipherSpiBase.java:805) +E/StorageCipher18Impl(26629): ... 14 more +E/StorageCipher18Impl(26629): Caused by: android.security.KeyStoreException: Unknown error (internal Keystore code: -1000 message: system/security/keystore2/src/operation.rs:850: KeystoreOperation::finish +E/StorageCipher18Impl(26629): +E/StorageCipher18Impl(26629): Caused by: +E/StorageCipher18Impl(26629): 0: system/security/keystore2/src/operation.rs:426: Finish failed. +E/StorageCipher18Impl(26629): 1: Error::Km(r#UNKNOWN_ERROR)) (public error code: 10 internal Keystore code: -1000) +E/StorageCipher18Impl(26629): at android.security.KeyStore2.getKeyStoreException(KeyStore2.java:386) +E/StorageCipher18Impl(26629): at android.security.KeyStoreOperation.handleExceptions(KeyStoreOperation.java:78) +E/StorageCipher18Impl(26629): at android.security.KeyStoreOperation.finish(KeyStoreOperation.java:128) +E/StorageCipher18Impl(26629): at android.security.keystore2.KeyStoreCryptoOperationChunkedStreamer$MainDataStream.finish(KeyStoreCryptoOperationChunkedStreamer.java:228) +E/StorageCipher18Impl(26629): at android.security.keystore2.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:181) +E/StorageCipher18Impl(26629): at android.security.keystore2.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:618) +E/StorageCipher18Impl(26629): ... 15 more +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/ault.aves.debug(26629): FrameInsert open fail: No such file or directory +I/flutter (26629): [startup] analysis re-enabled in background +I/flutter (26629): MediaStoreSource load 0:00:01.168465 add known entries +I/flutter (26629): [localMediaDb] loadEntries(origin=3, directory=null) +I/flutter (26629): [localMediaDb] SQL(queryCursor) WHERE="origin = ?" args=[3] +I/flutter (26629): [localMediaDb] rows read=0 kept=0 +I/flutter (26629): MediaStoreSource load 0:00:01.176974 load metadata +D/ProfileInstaller(26629): Installing profile for deckers.thibault.aves.debug +I/flutter (26629): Report log=MediaStoreSource load (known) done in 1s for 0 known, 0 removed +I/flutter (26629): Report log=MediaStoreSource load (new) start +I/flutter (26629): MediaStoreSource load 0:00:00.000034 recover untracked entries +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/storage method=getUntrackedTrashPaths arguments={knownPaths: []} +W/WindowOnBackDispatcher(26629): sendCancelIfRunning: isInProgress=falsecallback=androidx.activity.OnBackPressedDispatcher$Api34Impl$createOnBackAnimationCallback$1@66f261e +I/flutter (26629): MediaStoreSource load 0:00:00.066719 check obsolete paths +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/media_store method=checkObsoletePaths arguments={knownPathById: {}} +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +I/flutter (26629): MediaStoreSource load 0:00:00.143151 fetch new entries +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_store_stream arguments={knownEntries: {}, directory: null} +D/d.t.a.m.p.MSIP(26629): fetching all media store items for 0 known entries, directory=null +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.write(FlutterSecureStorage.java:107) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:137) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.write(FlutterSecureStorage.java:107) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:137) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +I/flutter (26629): leak_tracker: 33 memory leak(s): not disposed: 0, not GCed: 1, GCed late: 32 +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.write(FlutterSecureStorage.java:107) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:137) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.write(FlutterSecureStorage.java:107) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:137) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.write(FlutterSecureStorage.java:107) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:137) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +I/flutter (26629): [startup] remote headers warm-up done (safe) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +D/OpenGLRenderer(26629): --- Failed to create image decoder with message 'unimplemented' +I/flutter (26629): leak_tracker: 49 memory leak(s): not disposed: 0, not GCed: 1, GCed late: 48 +D/OpenGLRenderer(26629): --- Failed to create image decoder with message 'unimplemented' +D/OpenGLRenderer(26629): --- Failed to create image decoder with message 'unimplemented' +I/flutter (26629): MediaStoreSource load 0:00:07.663722 save 6956 new entries +I/flutter (26629): SqfliteLocalMediaDb saveEntries inserting slice of [1, 6956] entries +I/flutter (26629): leak_tracker: 65 memory leak(s): not disposed: 0, not GCed: 1, GCed late: 64 +I/flutter (26629): SqfliteLocalMediaDb saveEntries complete in 759ms for 6956 entries +I/flutter (26629): MediaStoreSource load 0:00:08.823326 analyze +I/flutter (26629): analyze 6956 entries, force=false, starting service=true +I/flutter (26629): Report log=Start analysis service +I/flutter (26629): leak_tracker: 81 memory leak(s): not disposed: 0, not GCed: 1, GCed late: 80 +E/FileUtils(26629): err write to mi_exception_log +E/FileUtils(26629): err write to mi_exception_log +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000020101, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1773318480157, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000019657, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1761595919841, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000019251, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1754821112383, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000019250, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1754821110847, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +E/FileUtils(26629): err write to mi_exception_log +D/FirebaseSessions(26629): App backgrounded on deckers.thibault.aves.debug +I/flutter (26629): Report log=Lifecycle inactive +E/FileUtils(26629): err write to mi_exception_log +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis method=startAnalysis arguments={entryIds: null, force: false} +I/flutter (26629): Report log=MediaStoreSource load (new) done in 9s for 6956 new entries +D/d.t.a.d.TF(26629): rescale thumbnail for mimeType=image/jpeg uri=content://media/external/images/media/1000019251 width=176 height=176, with bitmap byteCount=307200 size=240x320, to target=176x235 +D/d.t.a.d.TF(26629): rescale thumbnail for mimeType=image/jpeg uri=content://media/external/images/media/1000019250 width=176 height=176, with bitmap byteCount=307200 size=240x320, to target=176x235 +D/WM-SystemJobScheduler(26629): Scheduling work ID c7124144-9182-40b2-9ae5-745f18d08f9eJob ID 0 +D/WM-GreedyScheduler(26629): Starting work for c7124144-9182-40b2-9ae5-745f18d08f9e +D/WM-Processor(26629): Processor: processing WorkGenerationalId(workSpecId=c7124144-9182-40b2-9ae5-745f18d08f9e, generation=0) +D/CompatibilityChangeReporter(26629): Compat change id reported: 263076149; UID 10656; state: ENABLED +D/WM-PackageManagerHelper(26629): androidx.work.impl.background.systemalarm.RescheduleReceiver enabled +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000019249, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1754821105143, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000018527, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1738662354782, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000018526, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1738662338250, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000018523, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1738134421104, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +D/WM-WorkerWrapper(26629): Starting work for deckers.thibault.aves.AnalysisWorker +I/d.t.a.AnalysisWorker(26629): Start analysis worker c7124144-9182-40b2-9ae5-745f18d08f9e +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +I/flutter (26629): [remote-sync] START (scheduled=true) +I/flutter (26629): [remote-sync][pre] count origin=1 = 0 +D/WM-SystemJobService(26629): onStartJob for WorkGenerationalId(workSpecId=c7124144-9182-40b2-9ae5-745f18d08f9e, generation=0) +D/WM-Processor(26629): Work WorkGenerationalId(workSpecId=c7124144-9182-40b2-9ae5-745f18d08f9e, generation=0) is already enqueued for processing +D/d.t.a.d.TF(26629): rescale thumbnail for mimeType=image/jpeg uri=content://media/external/images/media/1000018526 width=176 height=176, with bitmap byteCount=307200 size=240x320, to target=176x235 +I/WM-SystemFgDispatcher(26629): Started foreground service Intent { act=ACTION_START_FOREGROUND cmp=deckers.thibault.aves.debug/androidx.work.impl.foreground.SystemForegroundService (has extras) } +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/d.t.a.d.TF(26629): rescale thumbnail for mimeType=image/jpeg uri=content://media/external/images/media/1000018527 width=176 height=176, with bitmap byteCount=307200 size=240x320, to target=176x235 +D/d.t.a.d.TF(26629): rescale thumbnail for mimeType=image/jpeg uri=content://media/external/images/media/1000019249 width=176 height=176, with bitmap byteCount=307200 size=240x320, to target=176x235 +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +W/EpFrameworkFactory(26629): activated: false jar exist: false +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000018486, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1737797944240, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000018374, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1735806799595, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000018529, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1738662449402, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/media_kit(26629): package:media_kit_libs_android_video attached. +I/media_kit(26629): Saved application context. +I/AdrenoVK-0(26629): QUALCOMM build : 4bbe300fc3, Ie69fc1c69b +I/AdrenoVK-0(26629): Build Date : 05/19/25 +I/AdrenoVK-0(26629): Shader Compiler Version : EV031.35.01.12 +I/AdrenoVK-0(26629): Local Branch : +I/AdrenoVK-0(26629): Remote Branch : refs/tags/AU_LINUX_ANDROID_LA.UM.9.14.11.00.00.571.148 +I/AdrenoVK-0(26629): Remote Branch : NONE +I/AdrenoVK-0(26629): Reconstruct Branch : NOTHING +I/AdrenoVK-0(26629): Build Config : S P 10.0.7 AArch64 +I/AdrenoVK-0(26629): Driver Path : /vendor/lib64/hw/vulkan.adreno.so +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +I/flutter (26629): [IMPORTANT:flutter/shell/platform/android/android_context_vk_impeller.cc(62)] Using the Impeller rendering backend (Vulkan). +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/FileUtils(26629): err write to mi_exception_log +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/storage method=getStorageVolumes arguments=null +I/flutter (26629): leak_tracker: 133 memory leak(s): not disposed: 52, not GCed: 1, GCed late: 80 +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000018528, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1738662380450, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000017577, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1680774974529, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/storage method=getVaultRoot arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000017576, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1680774876501, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +D/d.t.a.g.AAGM(26629): Glide disk cache size=262 MB, memory cache size=19.46 MB, bitmap pool size=9.73 MB, array pool size=4.19 MB +I/flutter (26629): [localMediaDb] opened db path=/data/user/0/deckers.thibault.aves.debug/databases/metadata.db +W/ault.aves.debug(26629): Long monitor contention with owner DefaultDispatcher-worker-4 (27361) at com.bumptech.glide.Glide com.bumptech.glide.Glide.get(android.content.Context)(Glide.java:137) waiters=0 in com.bumptech.glide.Glide com.bumptech.glide.Glide.get(android.content.Context) for 130ms +W/ault.aves.debug(26629): Long monitor contention with owner DefaultDispatcher-worker-4 (27361) at com.bumptech.glide.Glide com.bumptech.glide.Glide.get(android.content.Context)(Glide.java:137) waiters=1 in com.bumptech.glide.Glide com.bumptech.glide.Glide.get(android.content.Context) for 131ms +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getCapabilities arguments=null +I/flutter (26629): Device has Google Play Services=true +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +I/flutter (26629): Analyzer create +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=initialized arguments=null +I/flutter (26629): Report log=Analyzer start for all entries +D/d.t.a.AnalysisWorker(26629): Analysis background channel is ready +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getLocales arguments=null +I/flutter (26629): media_kit: NativeReferenceHolder: Located -5476376605270937600 +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +I/flutter (26629): Report log=MediaStoreSource init target scope={} +D/FirebaseSessions(26629): App foregrounded on deckers.thibault.aves.debug +I/flutter (26629): Report log=Lifecycle resumed +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/media_store method=getChangedUris arguments={sinceGeneration: 468776} +I/HandWritingStubImpl(26629): refreshLastKeyboardType: 1 +I/HandWritingStubImpl(26629): getCurrentKeyboardType: 1 +I/flutter (26629): [localMediaDb] opened db path=/data/user/0/deckers.thibault.aves.debug/databases/metadata.db +I/flutter (26629): MediaStoreSource load essentials complete in 77ms +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/media_store method=getGeneration arguments=null +I/flutter (26629): Report log=MediaStoreSource load (known) start +I/flutter (26629): [cleanup][pre] remoti in DB = 0 +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +I/flutter (26629): MediaStoreSource load 0:00:00.067267 clear local entries deleted 6956 rows +I/flutter (26629): [cleanup][post] remoti in DB = 0 (Δ=0) +I/flutter (26629): MediaStoreSource load 0:00:00.086974 fetch known entries +I/flutter (26629): [localMediaDb] loadEntries(origin=0, directory=null) +I/flutter (26629): [localMediaDb] SQL(queryCursor) WHERE="origin = ?" args=[0] +I/flutter (26629): [localMediaDb] rows read=0 kept=0 +I/flutter (26629): Report log=MediaStoreSource found 0 known entries +I/flutter (26629): MediaStoreSource load 0:00:00.097409 check obsolete entries +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/media_store method=checkObsoleteContentIds arguments={knownContentIds: []} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/media_store method=getGeneration arguments=null +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +I/flutter (26629): MediaStoreSource load 0:00:00.177920 add known entries +I/flutter (26629): [localMediaDb] loadEntries(origin=3, directory=null) +I/flutter (26629): [localMediaDb] SQL(queryCursor) WHERE="origin = ?" args=[3] +I/flutter (26629): [localMediaDb] rows read=0 kept=0 +I/flutter (26629): MediaStoreSource load 0:00:00.197238 load metadata +I/flutter (26629): Report log=MediaStoreSource load (known) done in 0s for 0 known, 0 removed +I/flutter (26629): Report log=MediaStoreSource load (new) start +I/flutter (26629): MediaStoreSource load 0:00:00.000026 recover untracked entries +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/storage method=getUntrackedTrashPaths arguments={knownPaths: []} +I/flutter (26629): MediaStoreSource load 0:00:00.020417 check obsolete paths +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/media_store method=checkObsoletePaths arguments={knownPathById: {}} +I/flutter (26629): [remote-client] GET https://prova.patachina.it/photos/ +I/flutter (26629): MediaStoreSource load 0:00:00.076581 fetch new entries +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_store_stream arguments={knownEntries: {}, directory: null} +D/d.t.a.m.p.MSIP(26629): fetching all media store items for 0 known entries, directory=null +I/flutter (26629): [remote-client] SERVER paths: withOriginal=101 withoutOriginal=0 leadingSlash=101 noLeadingSlash=0 +I/flutter (26629): [remote-sync][fetch] fetched 101 items from https://prova.patachina.it +I/flutter (26629): [remote-sync] fetchAll done, items=101 +I/flutter (26629): RemoteRepository.upsertAll: items=101 +I/flutter (26629): [RemoteRepository] ensured UNIQUE index on entry(remoteId) for origin=1 +I/flutter (26629): [RemoteRepository] ensured UNIQUE index on entry(remotePath) for origin=1 +I/flutter (26629): [repo-upsert] in: rid=b3cda38a name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0099.JPG" +I/flutter (26629): [repo-upsert] in: rid=09ef919f name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0103.JPG" +I/flutter (26629): [repo-upsert] in: rid=dba1de0e name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0106.JPG" +I/flutter (26629): [repo-upsert] in: rid=751d8a15 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0107.JPG" +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000017571, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1680774371872, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): [repo-upsert] in: rid=73dfd75d name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0108.JPG" +I/flutter (26629): [repo-upsert] in: rid=f32173d4 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0109.JPG" +I/flutter (26629): [repo-upsert] in: rid=90c0a093 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0110.JPG" +I/flutter (26629): [repo-upsert] in: rid=4d74430a name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0112.JPG" +I/flutter (26629): [repo-upsert] in: rid=1955c91d name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0113.JPG" +I/flutter (26629): [repo-upsert] in: rid=14616f64 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0114.JPG" +I/flutter (26629): [repo-upsert] in: rid=7668b4a6 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0116.JPG" +I/flutter (26629): [repo-upsert] in: rid=4a10ae72 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0119.JPG" +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +I/flutter (26629): [repo-upsert] in: rid=490631b5 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0120.JPG" +I/flutter (26629): [repo-upsert] in: rid=1a975960 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0122.JPG" +I/flutter (26629): [repo-upsert] in: rid=486d095f name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0123.JPG" +I/flutter (26629): [repo-upsert] in: rid=69eb9113 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0124.JPG" +I/flutter (26629): [repo-upsert] in: rid=1da97cbc name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0125.JPG" +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Loading, message: null} +I/flutter (26629): [repo-upsert] in: rid=7fbc8546 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0126.JPG" +I/flutter (26629): [repo-upsert] in: rid=35772196 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0133.JPG" +I/flutter (26629): [repo-upsert] in: rid=48b26b6f name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0134.JPG" +I/flutter (26629): [repo-upsert] in: rid=10ca45bc name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0135.JPG" +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000017570, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1680767984061, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): [repo-upsert] in: rid=c6b58236 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0136.JPG" +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +I/flutter (26629): [repo-upsert] in: rid=1d494550 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0137.JPG" +I/flutter (26629): [repo-upsert] in: rid=bf2f60a2 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0138.JPG" +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): [repo-upsert] in: rid=7d753539 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0139.JPG" +I/flutter (26629): [repo-upsert] in: rid=29eb6ed3 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0140.JPG" +I/flutter (26629): [repo-upsert] in: rid=ebaf024e name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0141.JPG" +I/flutter (26629): [repo-upsert] in: rid=c782108a name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0143.JPG" +I/flutter (26629): [repo-upsert] in: rid=f56db159 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0145.JPG" +I/flutter (26629): [repo-upsert] in: rid=5d03b5d0 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0146.JPG" +I/flutter (26629): [repo-upsert] in: rid=dd715de9 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0147.JPG" +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +I/flutter (26629): [repo-upsert] in: rid=8e1a2d2a name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0148.JPG" +I/flutter (26629): [repo-upsert] in: rid=46412728 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0149.JPG" +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000020101, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1773318480157, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): [repo-upsert] in: rid=999cc099 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0150.JPG" +I/flutter (26629): [repo-upsert] in: rid=7ed0d636 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0152.JPG" +I/flutter (26629): [repo-upsert] in: rid=4025ea19 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0153.JPG" +I/flutter (26629): [repo-upsert] in: rid=d91b81a3 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0154.JPG" +I/flutter (26629): [repo-upsert] in: rid=49a20985 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0155.JPG" +I/flutter (26629): [repo-upsert] in: rid=a856fcea name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0156.JPG" +I/flutter (26629): [repo-upsert] in: rid=fd3df96d name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0157.JPG" +I/flutter (26629): [repo-upsert] in: rid=c8ada02d name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0160.JPG" +D/CompatibilityChangeReporter(26629): Compat change id reported: 149924527; UID 10656; state: ENABLED +D/CompatibilityChangeReporter(26629): Compat change id reported: 132649864; UID 10656; state: DISABLED +I/flutter (26629): [repo-upsert] in: rid=7351a37b name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0162.JPG" +I/flutter (26629): [repo-upsert] in: rid=23852fb0 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0163.JPG" +I/flutter (26629): [repo-upsert] in: rid=0ed7a1b6 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0164.JPG" +I/flutter (26629): [repo-upsert] in: rid=64ec16eb name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0165.JPG" +I/flutter (26629): [repo-upsert] in: rid=8fa73c5a name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0166.JPG" +I/flutter (26629): [repo-upsert] in: rid=ddab26be name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0167.JPG" +I/flutter (26629): [repo-upsert] in: rid=a07cfd0d name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0170.JPG" +I/flutter (26629): [repo-upsert] in: rid=7a938279 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0171.JPG" +I/flutter (26629): [repo-upsert] in: rid=9e8eb495 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0172.JPG" +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000019251, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1754821112383, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): [repo-upsert] in: rid=df20d33d name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0174.JPG" +I/flutter (26629): [repo-upsert] in: rid=f46da4f2 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0175.JPG" +I/flutter (26629): [repo-upsert] in: rid=68c6d643 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0176.JPG" +I/flutter (26629): [repo-upsert] in: rid=6b4d4396 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0177.JPG" +I/flutter (26629): [repo-upsert] in: rid=dc17f07d name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0178.JPG" +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000019250, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1754821110847, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): [repo-upsert] in: rid=4f041976 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0179.JPG" +I/flutter (26629): [repo-upsert] in: rid=4a125c92 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0180.JPG" +I/flutter (26629): [repo-upsert] in: rid=0bd35f8c name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0182.JPG" +I/flutter (26629): [repo-upsert] in: rid=4065f86b name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0183.JPG" +I/flutter (26629): [repo-upsert] in: rid=76ea19c9 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0185.JPG" +I/flutter (26629): [repo-upsert] in: rid=065a8086 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0188.JPG" +I/flutter (26629): [repo-upsert] in: rid=e30a1427 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0190.JPG" +I/flutter (26629): [repo-upsert] in: rid=c584bb41 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0193.JPG" +I/flutter (26629): [repo-upsert] in: rid=77b82213 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0203.JPG" +I/flutter (26629): [repo-upsert] in: rid=be834d76 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0204.JPG" +I/flutter (26629): [repo-upsert] in: rid=6750d21d name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0206.JPG" +I/flutter (26629): [repo-upsert] in: rid=ea8ae33c name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0207.JPG" +I/flutter (26629): [repo-upsert] in: rid=3be96205 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0208.JPG" +I/flutter (26629): [repo-upsert] in: rid=3041f044 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0209.JPG" +I/flutter (26629): [repo-upsert] in: rid=50c16b24 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0211.JPG" +I/flutter (26629): [repo-upsert] in: rid=df606e3b name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0212.JPG" +I/flutter (26629): [repo-upsert] in: rid=2454c04d name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0214.JPG" +I/flutter (26629): [repo-upsert] in: rid=bc0155f7 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0215.JPG" +I/flutter (26629): [repo-upsert] in: rid=a99f57f0 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0216.JPG" +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000019657, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1761595919841, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): [repo-upsert] in: rid=915492fb name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0217.JPG" +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000018526, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1738662338250, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): [repo-upsert] in: rid=0c2e99aa name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0218.JPG" +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000019249, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1754821105143, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): [repo-upsert] in: rid=a80cdc2f name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0223.JPG" +I/flutter (26629): [repo-upsert] in: rid=308808d7 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0227.JPG" +I/flutter (26629): [repo-upsert] in: rid=20bdd8d0 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0228.JPG" +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000018527, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1738662354782, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): [repo-upsert] in: rid=37df228c name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0229.JPG" +I/flutter (26629): [repo-upsert] in: rid=1a4313d5 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0232.JPG" +I/flutter (26629): [repo-upsert] in: rid=6ab20a65 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0233.JPG" +I/flutter (26629): [repo-upsert] in: rid=6cf11109 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0234.JPG" +I/flutter (26629): [repo-upsert] in: rid=e8306919 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0235.JPG" +I/flutter (26629): [repo-upsert] in: rid=9fabc411 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0237.JPG" +I/flutter (26629): [repo-upsert] in: rid=3846bf7e name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0241.JPG" +I/flutter (26629): [repo-upsert] in: rid=b4fec847 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0242.JPG" +I/flutter (26629): [repo-upsert] in: rid=b864196e name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0243.JPG" +I/flutter (26629): [repo-upsert] in: rid=b1f9d25d name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0244.JPG" +I/flutter (26629): [repo-upsert] in: rid=e9549aa2 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0245.JPG" +I/flutter (26629): [repo-upsert] in: rid=b8013a96 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0246.JPG" +I/flutter (26629): [repo-upsert] in: rid=d32b08d4 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0247.JPG" +I/flutter (26629): [repo-upsert] in: rid=0402bf83 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0248.JPG" +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000018523, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1738134421104, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): [repo-upsert] in: rid=10e4a1c6 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_0249.JPG" +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Loading, message: null} +I/flutter (26629): [repo-upsert] in: rid=a570da3c name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20210602_100637.jpg" +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +I/flutter (26629): [repo-upsert] in: rid=5c59ae93 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20210602_173903.jpg" +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000018486, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1737797944240, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +E/FileUtils(26629): err write to mi_exception_log +E/FileUtils(26629): err write to mi_exception_log +I/flutter (26629): [repo-upsert] in: rid=283c973a name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135543.jpg" +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000018374, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1735806799595, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): [repo-upsert] in: rid=11ce5c19 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135641.jpg" +I/flutter (26629): [repo-upsert] in: rid=87f69b97 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135744.jpg" +I/flutter (26629): [repo-upsert] in: rid=f084723d name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135745.jpg" +I/flutter (26629): [repo-upsert] in: rid=e18affb3 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/VID_20260221_095917.mp4" +I/flutter (26629): [RemoteRepository] deduplicateRemotes deleted=0 +I/flutter (26629): [RemoteRepository] deduplicateByRemotePath deleted=0 +I/flutter (26629): [RemoteRepository] ensured UNIQUE index on entry(remoteId) for origin=1 +I/flutter (26629): [RemoteRepository] ensured UNIQUE index on entry(remotePath) for origin=1 +I/flutter (26629): [RemoteRepository] backfill URIs via SQL (remoteId) updated=0 +I/flutter (26629): [RemoteRepository] backfill dateModifiedMillis updated=0 +I/flutter (26629): [remote-sync] upsert+sanitize completed in 1858ms +I/flutter (26629): [remote-sync][post] count origin=1 = 101 +I/flutter (26629): [remote-sync][post] sample origin=1 = [{id: 101, remoteId: e18affb38f030e3bc631457f0ff2ecaf041b0e150d0e87dd8a23c7bb068ca7c1, provider: json@patachina, uri: aves-remote://rid/e18affb38f030e3bc631457f0ff2ecaf041b0e150d0e87dd8a23c7bb068ca7c1, trashed: 0, dateModifiedMillis: 1773483741544}, {id: 100, remoteId: f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488, provider: json@patachina, uri: aves-remote://rid/f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488, trashed: 0, dateModifiedMillis: 1655647065000}, {id: 99, remoteId: 87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968, provider: json@patachina, uri: aves-remote://rid/87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968, trashed: 0, dateModifiedMillis: 1655647064000}] +I/flutter (26629): [remote-sync] completed in 4205ms, imported=101 +I/flutter (26629): [remote-sync] END (active=false) +E/SQLiteLog(26629): (5) statement aborts at 2: [PRAGMA journal_mode=PERSIST] database is locked +W/SQLiteConnection(26629): Could not change the database journal mode of '/data/user/0/deckers.thibault.aves.debug/databases/metadata.db' from 'wal' to 'PERSIST' because the database is locked. This usually means that there are other open connections to the database which prevents the database from enabling or disabling write-ahead logging mode. Proceeding without changing the journal mode. +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Loading, message: null} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +I/flutter (26629): Report log=Nav push to unnamed MaterialPageRoute<dynamic> +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Loading, message: null} +D/OpenGLRenderer(26629): --- Failed to create image decoder with message 'unimplemented' +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +I/flutter (26629): leak_tracker: 153 memory leak(s): not disposed: 52, not GCed: 1, GCed late: 100 +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Loading, message: null} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.containsKey(FlutterSecureStorage.java:64) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:147) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +E/SecureStorageAndroid(26629): Data migration failed +E/SecureStorageAndroid(26629): javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:154) +E/SecureStorageAndroid(26629): at com.android.org.conscrypt.OpenSSLEvpCipher.engineDoFinal(OpenSSLEvpCipher.java:192) +E/SecureStorageAndroid(26629): at javax.crypto.Cipher.doFinal(Cipher.java:2074) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.decrypt(StorageCipher18Implementation.java:93) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.decodeRawValue(FlutterSecureStorage.java:262) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.checkAndMigrateToEncrypted(FlutterSecureStorage.java:225) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.ensureInitialized(FlutterSecureStorage.java:171) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStorage.read(FlutterSecureStorage.java:73) +E/SecureStorageAndroid(26629): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin$MethodRunner.run(FlutterSecureStoragePlugin.java:148) +E/SecureStorageAndroid(26629): at android.os.Handler.handleCallback(Handler.java:958) +E/SecureStorageAndroid(26629): at android.os.Handler.dispatchMessage(Handler.java:99) +E/SecureStorageAndroid(26629): at android.os.Looper.loopOnce(Looper.java:222) +E/SecureStorageAndroid(26629): at android.os.Looper.loop(Looper.java:314) +E/SecureStorageAndroid(26629): at android.os.HandlerThread.run(HandlerThread.java:67) +W/SQLiteLog(26629): (28) double-quoted string literal: "json@patachina" +D/OpenGLRenderer(26629): --- Failed to create image decoder with message 'unimplemented' +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Loading, message: null} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/OpenGLRenderer(26629): --- Failed to create image decoder with message 'unimplemented' +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Loading, message: null} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): MediaStoreSource load 0:00:07.195931 save 6956 new entries +I/flutter (26629): SqfliteLocalMediaDb saveEntries inserting slice of [1, 6956] entries +I/flutter (26629): Report log=Nav pop to /collection +W/WindowOnBackDispatcher(26629): sendCancelIfRunning: isInProgress=falsecallback=androidx.activity.OnBackPressedDispatcher$Api34Impl$createOnBackAnimationCallback$1@66f261e +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Loading, message: null} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): SqfliteLocalMediaDb saveEntries complete in 757ms for 6956 entries +I/flutter (26629): MediaStoreSource load 0:00:08.249568 analyze +I/flutter (26629): analyze 6956 entries, force=false, starting service=false +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=requestGarbageCollection arguments=null +I/ault.aves.debug(26629): Explicit concurrent copying GC freed 17MB AllocSpace bytes, 1(44KB) LOS objects, 75% free, 8171KB/31MB, paused 69us,1.270ms total 25.169ms +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000020101, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2026-03-12-13-28-00-079_deckers.thibault.aves.debug.jpg, sizeBytes: 780252} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000017569, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1680767196377, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000017568, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1680766965037, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000017567, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1680766856149, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000017566, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1680766789381, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000019657, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2025-10-27-21-11-59-581_com.example.webauthn_flutter.jpg, sizeBytes: 184918} +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000019251, path: /storage/emulated/0/DCIM/Camera/IMG_20250810_121828.jpg, sizeBytes: 6177515} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 2/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000019250, path: /storage/emulated/0/DCIM/Camera/IMG_20250810_121822.jpg, sizeBytes: 3773772} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017561, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1680766661753, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000019249, path: /storage/emulated/0/DCIM/Camera/IMG_20250810_121817.jpg, sizeBytes: 4270621} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017199, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676472922362, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017196, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676472921761, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000018527, path: /storage/emulated/0/DCIM/Camera/IMG_20250204_104544.jpg, sizeBytes: 6799176} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017192, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676470460661, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017190, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676469427922, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017189, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676469417102, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000018526, path: /storage/emulated/0/DCIM/Camera/IMG_20250204_104528.jpg, sizeBytes: 4551647} +D/d.t.a.d.TF(26629): rescale thumbnail for mimeType=image/jpeg uri=content://media/external/images/media/1000017190 width=176 height=176, with bitmap byteCount=161588 size=203x199, to target=180x176 +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017176, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676469326243, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017173, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676469325891, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000018523, path: /storage/emulated/0/DCIM/Camera/IMG_20250129_080657.jpg, sizeBytes: 4161293} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017168, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676465766018, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017165, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676465765517, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017162, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676465765067, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017159, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676465764429, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000018486, path: /storage/emulated/0/DCIM/Camera/IMG_20250125_103858.jpg, sizeBytes: 4403217} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017156, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676465764033, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017153, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676465763780, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017150, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676465763299, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017147, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676465762413, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000018374, path: /storage/emulated/0/Pictures/IMG_0206.jpg, sizeBytes: 268463} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017140, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676463420986, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017137, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676462770138, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017134, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676461676535, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017131, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676460193906, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017561, path: /storage/emulated/0/DCIM/Camera/IMG_20230406_093739.jpg, sizeBytes: 4581800} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017128, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676457920859, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017121, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676445735288, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017199, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0023.jpg, sizeBytes: 100057} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017115, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676444230359, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017112, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676444229460, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017109, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1676443038434, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000017565, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1680766777597, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017196, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0022.jpg, sizeBytes: 102459} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000017564, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1680766730769, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000017563, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1680766711145, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017192, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0021.jpg, sizeBytes: 150438} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017190, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-15-14-56-56-555_com.google.android.apps.docs-edit.jpg, sizeBytes: 289800} +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017189, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-15-14-56-56-555_com.google.android.apps.docs.jpg, sizeBytes: 654556} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017176, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0019.jpg, sizeBytes: 254051} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000017562, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1680766672869, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017173, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0018.jpg, sizeBytes: 234955} +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017168, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0017.jpg, sizeBytes: 417289} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017162, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0015.jpg, sizeBytes: 480560} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017165, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0016.jpg, sizeBytes: 365348} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017156, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0013.jpg, sizeBytes: 261621} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000017557, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1680766104197, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017159, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0014.jpg, sizeBytes: 343535} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017150, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0011.jpg, sizeBytes: 224870} +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017153, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0012.jpg, sizeBytes: 250785} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017147, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0010.jpg, sizeBytes: 250725} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017140, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0009.jpg, sizeBytes: 151431} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 26/6956} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017137, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0008.jpg, sizeBytes: 280768} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017134, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0007.jpg, sizeBytes: 186948} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017131, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0006.jpg, sizeBytes: 643220} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017128, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0005.jpg, sizeBytes: 280447} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017121, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0004.jpg, sizeBytes: 169269} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/video/media/1000017555, pageId: null, mimeType: video/mp4, dateModifiedMillis: 1680765751881, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): leak_tracker: 169 memory leak(s): not disposed: 68, not GCed: 1, GCed late: 100 +E/MediaMetadataRetrieverJNI(26629): getEmbeddedPicture: Call to getEmbeddedPicture failed. +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/1000017561, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1680766661753, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +E/FileUtils(26629): err write to mi_exception_log +I/MiInputConsumer(26629): optimized resample latency: 466211288 ns +E/FileUtils(26629): err write to mi_exception_log +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/60009, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1654720095860, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017115, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0003.jpg, sizeBytes: 133330} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017112, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0002.jpg, sizeBytes: 167765} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017109, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0001.jpg, sizeBytes: 246704} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017099, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230215-WA0000.jpg, sizeBytes: 121328} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017096, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0010.jpg, sizeBytes: 203460} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017087, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0008.jpg, sizeBytes: 56841} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017081, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0006.jpg, sizeBytes: 61761} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017084, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0007.jpg, sizeBytes: 56259} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017078, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0005.jpg, sizeBytes: 104603} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 40/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): leak_tracker: 277 memory leak(s): not disposed: 70, not GCed: 1, GCed late: 206 +E/FileUtils(26629): err write to mi_exception_log +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/59992, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1654707477877, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/59987, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1654693698546, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/59986, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1654693495129, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 40/6956} +D/d.t.a.d.TF(26629): rescale thumbnail for mimeType=image/jpeg uri=content://media/external/images/media/60009 width=176 height=176, with bitmap byteCount=157176 size=177x222, to target=176x221 +I/flutter (26629): leak_tracker: 623 memory leak(s): not disposed: 390, not GCed: 23, GCed late: 210 +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/2853, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562341818000, rotationDegrees: 90, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017072, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0004.jpg, sizeBytes: 149717} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4746, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562341811000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3022, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562341805000, rotationDegrees: 90, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5496, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562303290000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5495, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562303290000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5494, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562303289000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5493, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562271635000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5492, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562256252000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4108, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562255193000, rotationDegrees: 90, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3936, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562255191000, rotationDegrees: 90, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4836, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562255189000, rotationDegrees: 90, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4835, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562255184000, rotationDegrees: 90, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5491, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562255053000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017070, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0003.jpg, sizeBytes: 169100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5490, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562251646000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5489, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562251645000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5488, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562251438000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5487, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562251437000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017068, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0002.jpg, sizeBytes: 113876} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5486, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562242702000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5485, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562239343000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5484, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562236539000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5483, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562230331000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5482, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562230328000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5481, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562158244000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5480, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562148120000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5479, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562147251000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5478, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562141462000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017065, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0001.jpg, sizeBytes: 67796} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5477, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562138899000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5476, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562101453000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4162, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1561963473000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4616, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1561745052000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3820, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1561744980000, rotationDegrees: 90, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3276, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1561744760000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3021, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1561744718000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4128, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1561744565000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/2853, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562341818000, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3022, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562341805000, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017062, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230214-WA0000.jpg, sizeBytes: 101131} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4746, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562341811000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5495, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562303290000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017052, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0004.jpg, sizeBytes: 194676} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017049, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0003.jpg, sizeBytes: 310678} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017046, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0002.jpg, sizeBytes: 218853} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5496, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562303290000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017044, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-13-12-08-26-323_com.miui.home.jpg, sizeBytes: 794984} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5494, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562303289000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5493, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562271635000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017041, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230213-WA0000.jpg, sizeBytes: 39706} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5492, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562256252000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4108, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562255193000, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017040, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-13-10-07-09-365_com.miui.home.jpg, sizeBytes: 807932} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017015, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230212-WA0005.jpg, sizeBytes: 615150} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017008, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230212-WA0004.jpg, sizeBytes: 115959} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017006, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-12-14-17-21-917_com.instagram.android.jpg, sizeBytes: 801141} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000017003, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230212-WA0002.jpg, sizeBytes: 266459} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016999, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-12-08-21-46-596_com.whatsapp.jpg, sizeBytes: 876809} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 56/6956} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016989, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0014.jpg, sizeBytes: 106154} +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016973, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-18-05-12-024_com.google.android.gm.jpg, sizeBytes: 615455} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016971, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-17-33-02-236_com.whatsapp.jpg, sizeBytes: 828351} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016968, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0009.jpg, sizeBytes: 60850} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016965, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0008.jpg, sizeBytes: 74140} +I/flutter (26629): leak_tracker: 738 memory leak(s): not disposed: 502, not GCed: 23, GCed late: 213 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016960, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-12-29-01-111_com.whatsapp.jpg, sizeBytes: 828986} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016958, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-11-12-28-39-912_com.whatsapp.jpg, sizeBytes: 724062} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016945, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0001.jpg, sizeBytes: 271535} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4835, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562255184000, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3936, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562255191000, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4836, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562255189000, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5491, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562255053000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5490, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562251646000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5488, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562251438000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5487, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562251437000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5489, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562251645000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5486, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562242702000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5485, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562239343000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5484, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562236539000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5483, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562230331000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5482, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562230328000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5479, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562147251000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5478, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562141462000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5481, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562158244000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5480, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562148120000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5476, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562101453000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4162, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1561963473000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4616, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1561745052000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5477, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562138899000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3820, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1561744980000, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3276, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1561744760000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4128, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1561744565000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3021, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1561744718000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): leak_tracker: 775 memory leak(s): not disposed: 502, not GCed: 23, GCed late: 250 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016942, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230211-WA0000.jpg, sizeBytes: 126235} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016926, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0006.jpg, sizeBytes: 137403} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016924, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-10-17-31-10-634_com.google.android.googlequicksearchbox-edit.jpg, sizeBytes: 272112} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016922, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0004.jpg, sizeBytes: 129533} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016920, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-10-15-57-09-170_com.miui.home.jpg, sizeBytes: 625585} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016917, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0003.jpg, sizeBytes: 64094} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016914, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0002.jpg, sizeBytes: 318779} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016911, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230210-WA0001.jpg, sizeBytes: 42122} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016890, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0014.jpg, sizeBytes: 155891} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016876, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0011.jpg, sizeBytes: 192046} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016851, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230209-WA0006.jpg, sizeBytes: 67535} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016812, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0010.jpg, sizeBytes: 371772} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016806, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0008.jpg, sizeBytes: 382274} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016809, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0009.jpg, sizeBytes: 439268} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016798, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0006.jpg, sizeBytes: 422064} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016795, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0005.jpg, sizeBytes: 338082} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016789, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0003.jpg, sizeBytes: 279930} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016792, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0004.jpg, sizeBytes: 190775} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016786, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0002.jpg, sizeBytes: 289841} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016778, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230208-WA0000.jpg, sizeBytes: 409315} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016765, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230207-WA0001.jpg, sizeBytes: 216388} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016762, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230207-WA0000.jpg, sizeBytes: 213350} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016738, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-07-16-13-05-638_com.shazam.android.jpg, sizeBytes: 941691} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016707, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230206-WA0000.jpg, sizeBytes: 193385} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016692, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0032.jpg, sizeBytes: 215636} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016689, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0031.jpg, sizeBytes: 279947} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016686, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0030.jpg, sizeBytes: 331013} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016683, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0029.jpg, sizeBytes: 328680} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016680, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0028.jpg, sizeBytes: 337417} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016677, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0027.jpg, sizeBytes: 294504} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016674, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0026.jpg, sizeBytes: 358036} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016668, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0024.jpg, sizeBytes: 333838} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016671, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0025.jpg, sizeBytes: 347022} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016665, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0023.jpg, sizeBytes: 324751} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016659, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0021.jpg, sizeBytes: 240105} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016662, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0022.jpg, sizeBytes: 353403} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016656, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0020.jpg, sizeBytes: 382894} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016653, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0019.jpg, sizeBytes: 385053} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016650, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0018.jpg, sizeBytes: 398987} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016599, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0002.jpg, sizeBytes: 340368} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016646, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0017.jpg, sizeBytes: 330573} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016643, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0016.jpg, sizeBytes: 391092} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016640, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0015.jpg, sizeBytes: 354548} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016634, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0013.jpg, sizeBytes: 386698} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016637, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0014.jpg, sizeBytes: 370078} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016628, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0011.jpg, sizeBytes: 370664} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016631, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0012.jpg, sizeBytes: 280670} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 111/6956} +D/CompatibilityChangeReporter(26629): Compat change id reported: 150939131; UID 10656; state: ENABLED +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016622, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0009.jpg, sizeBytes: 318984} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016625, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0010.jpg, sizeBytes: 302076} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016619, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0008.jpg, sizeBytes: 339385} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016613, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0006.jpg, sizeBytes: 341430} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016616, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0007.jpg, sizeBytes: 348511} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016610, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0005.jpg, sizeBytes: 351561} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016607, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0004.jpg, sizeBytes: 361860} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016596, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230205-WA0001.jpg, sizeBytes: 115084} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016586, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-49-15-733_com.android.chrome.jpg, sizeBytes: 621329} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016585, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-48-21-380_com.android.chrome.jpg, sizeBytes: 746568} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016584, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-48-15-501_com.android.chrome.jpg, sizeBytes: 618906} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016581, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-04-17-15-21-802_com.google.android.googlequicksearchbox.jpg, sizeBytes: 605874} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016572, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230204-WA0000.jpg, sizeBytes: 193943} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016545, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-03-19-56-29-319_com.whatsapp.jpg, sizeBytes: 836985} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016536, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0003.jpg, sizeBytes: 345525} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016539, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0004.jpg, sizeBytes: 501543} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016533, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0002.jpg, sizeBytes: 591603} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016527, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0001.jpg, sizeBytes: 143731} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016524, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230203-WA0000.jpg, sizeBytes: 85831} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016513, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230202-WA0004.jpg, sizeBytes: 136481} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016511, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-02-18-13-19-852_ch.publisheria.bring.jpg, sizeBytes: 496941} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016505, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-02-02-16-34-54-238_com.google.android.googlequicksearchbox-edit.jpg, sizeBytes: 588438} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016497, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230202-WA0000.jpg, sizeBytes: 430669} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5498, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562392429000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5497, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562353465000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3594, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562341834000, rotationDegrees: 90, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3758, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562341825000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5500, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562407006000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5499, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562400792000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3504, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562397709000, rotationDegrees: 90, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4385, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562396704000, rotationDegrees: 90, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5504, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562438638000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5503, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562423607000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5502, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562422518000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5501, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562410837000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5508, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562570482000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5475, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562570470000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5506, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562513492000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5505, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562483377000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016477, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230201-WA0003.jpg, sizeBytes: 395349} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016474, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230201-WA0002.jpg, sizeBytes: 605187} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016470, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230201-WA0000.jpg, sizeBytes: 197092} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016454, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230131-WA0006.jpg, sizeBytes: 260899} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016451, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230131-WA0005.jpg, sizeBytes: 228335} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016449, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-12-21-22-297_com.momondo.flightsearch.jpg, sizeBytes: 557143} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016447, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-12-10-40-642_com.momondo.flightsearch.jpg, sizeBytes: 563187} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016446, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-12-10-30-976_com.momondo.flightsearch.jpg, sizeBytes: 562512} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016444, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-31-10-54-37-729_com.google.android.gm.jpg, sizeBytes: 616113} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016430, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0007.jpg, sizeBytes: 224338} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016412, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0005.jpg, sizeBytes: 135044} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016409, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0004.jpg, sizeBytes: 38680} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016402, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-30-12-01-39-334_com.google.android.gm.jpg, sizeBytes: 329317} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016399, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230130-WA0000.jpg, sizeBytes: 307208} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016388, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230129-WA0000.jpg, sizeBytes: 141167} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016361, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0014.jpg, sizeBytes: 65570} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016358, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0013.jpg, sizeBytes: 98011} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016348, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0012.jpg, sizeBytes: 159464} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016346, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0011.jpg, sizeBytes: 42987} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016339, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0009.jpg, sizeBytes: 34057} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016336, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230128-WA0008.jpg, sizeBytes: 171339} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016334, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20230128-WA0007.jpg, sizeBytes: 117378} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016315, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20230128-WA0000.jpg, sizeBytes: 180716} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016301, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230127-WA0003.jpg, sizeBytes: 37123} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5512, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562611490000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5511, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562611401000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5510, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562602932000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5509, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562572127000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5516, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562665985000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5515, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562663586000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5514, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562663584000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5513, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562663582000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3594, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562341834000, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5520, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562695154000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5519, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562695151000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5518, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562695146000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5517, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562695131000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3758, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562341825000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5497, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562353465000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5498, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562392429000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5524, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562736623000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5523, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562736617000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5522, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562695158000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5521, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562695157000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): leak_tracker: 1523 memory leak(s): not disposed: 532, not GCed: 1, GCed late: 990 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016297, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230127-WA0002.jpg, sizeBytes: 205318} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016287, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230127-WA0001.jpg, sizeBytes: 150683} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016284, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230127-WA0000.jpg, sizeBytes: 135021} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016263, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0004.jpg, sizeBytes: 84795} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016260, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0003.jpg, sizeBytes: 116557} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016257, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0002.jpg, sizeBytes: 107879} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016254, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0001.jpg, sizeBytes: 118007} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016251, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230126-WA0000.jpg, sizeBytes: 114224} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016235, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230125-WA0005.jpg, sizeBytes: 112834} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016232, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230125-WA0004.jpg, sizeBytes: 62208} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016221, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-25-10-06-47-076_com.google.android.gm.jpg, sizeBytes: 662053} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016211, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0023.jpg, sizeBytes: 143005} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016209, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0022.jpg, sizeBytes: 152046} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016200, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0019.jpg, sizeBytes: 57323} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016203, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0020.jpg, sizeBytes: 55983} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016206, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0021.jpg, sizeBytes: 68543} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016188, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0015.jpg, sizeBytes: 70398} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016191, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0016.jpg, sizeBytes: 64017} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016194, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0017.jpg, sizeBytes: 51157} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016197, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0018.jpg, sizeBytes: 60792} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016176, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0011.jpg, sizeBytes: 57904} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016179, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0012.jpg, sizeBytes: 53017} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 180/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016182, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0013.jpg, sizeBytes: 54181} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5500, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562407006000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4557, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562784609000, rotationDegrees: 90, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3839, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562784602000, rotationDegrees: 90, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5526, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562774830000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5525, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562751269000, rotationDegrees: 0, isFlipped: false, widthDip: 0.0, heightDip: 0.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4385, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562396704000, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3504, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562397709000, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5499, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562400792000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5501, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562410837000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5502, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562422518000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5503, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562423607000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5504, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562438638000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5508, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562570482000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5475, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562570470000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5506, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562513492000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5505, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562483377000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5510, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562602932000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5512, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562611490000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5511, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562611401000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5509, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562572127000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5516, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562665985000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5515, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562663586000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5514, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562663584000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5513, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562663582000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5520, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562695154000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5518, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562695146000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5519, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562695151000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5517, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562695131000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5524, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562736623000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5523, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562736617000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5522, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562695158000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5521, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562695157000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/4557, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562784609000, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/3839, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562784602000, rotationDegrees: 90, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5525, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562751269000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/flutter (26629): AvesStreamsChannel invokeMethod name=deckers.thibault/aves/media_byte_stream arguments={op: getThumbnail, decoded: false, uri: content://media/external/images/media/5526, pageId: null, mimeType: image/jpeg, dateModifiedMillis: 1562774830000, rotationDegrees: 0, isFlipped: false, widthDip: 96.0, heightDip: 96.0, defaultSizeDip: 64.0, quality: 100} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): leak_tracker: 1549 memory leak(s): not disposed: 532, not GCed: 1, GCed late: 1016 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016185, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0014.jpg, sizeBytes: 47111} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016173, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0010.jpg, sizeBytes: 70258} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016167, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0008.jpg, sizeBytes: 56798} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016165, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0006.jpeg, sizeBytes: 2138355} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016162, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0005.jpg, sizeBytes: 82663} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016145, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0004.jpg, sizeBytes: 167291} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016137, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-24-09-46-03-144-edit_net.skyscanner.android.main.jpg, sizeBytes: 477710} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016134, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0002.jpg, sizeBytes: 59816} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016132, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0001.jpg, sizeBytes: 82997} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016130, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230124-WA0000.jpg, sizeBytes: 88615} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016120, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230123-WA0001.jpg, sizeBytes: 75681} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016088, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230122-WA0007.jpg, sizeBytes: 164842} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016085, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230122-WA0006.jpg, sizeBytes: 163800} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016079, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230122-WA0004.jpg, sizeBytes: 263187} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016050, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0017.jpg, sizeBytes: 62271} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016033, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0012.jpg, sizeBytes: 267537} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016036, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0013.jpg, sizeBytes: 268094} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016039, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0014.jpg, sizeBytes: 267684} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016042, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0015.jpg, sizeBytes: 268618} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016045, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0016.jpg, sizeBytes: 344154} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016021, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0008.jpg, sizeBytes: 154562} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016024, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0009.jpg, sizeBytes: 139737} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016027, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0010.jpg, sizeBytes: 150605} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016030, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0011.jpg, sizeBytes: 267627} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016006, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230121-WA0002.jpg, sizeBytes: 221225} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000016002, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-21-08-12-20-427_com.whatsapp.jpg, sizeBytes: 877542} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015992, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0014.jpg, sizeBytes: 176257} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015979, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-20-17-03-25-750_com.google.android.googlequicksearchbox.jpg, sizeBytes: 538677} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015977, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-20-16-58-30-737_com.google.android.googlequicksearchbox.jpg, sizeBytes: 697657} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015975, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0011.jpg, sizeBytes: 97381} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015969, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0010.jpg, sizeBytes: 210277} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015963, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0008.jpg, sizeBytes: 250782} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015966, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0009.jpg, sizeBytes: 137968} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015958, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0007.jpg, sizeBytes: 170289} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015952, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0005.jpg, sizeBytes: 155415} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015955, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0006.jpg, sizeBytes: 186524} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015949, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0004.jpg, sizeBytes: 221434} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015946, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0003.jpg, sizeBytes: 523700} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015943, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0002.jpg, sizeBytes: 232799} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015932, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230120-WA0000.jpg, sizeBytes: 394567} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015922, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-19-17-45-28-381_com.whatsapp.jpg, sizeBytes: 782571} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015918, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230119-WA0003.jpg, sizeBytes: 130525} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015915, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230119-WA0002.jpg, sizeBytes: 89542} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015906, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230119-WA0001.jpg, sizeBytes: 1935346} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015904, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230119-WA0000.jpg, sizeBytes: 1701010} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015902, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230118-WA0003.jpg, sizeBytes: 101401} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015900, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230118-WA0002.jpg, sizeBytes: 90568} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015892, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230118-WA0001.jpg, sizeBytes: 265395} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015889, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230118-WA0000.jpg, sizeBytes: 171611} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015864, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230117-WA0000.jpg, sizeBytes: 47401} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015841, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0007.jpg, sizeBytes: 114070} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015838, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0006.jpg, sizeBytes: 149168} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015833, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0004.jpg, sizeBytes: 32481} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015830, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0003.jpg, sizeBytes: 207521} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015827, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0002.jpg, sizeBytes: 1886351} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015824, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0001.jpg, sizeBytes: 212262} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015821, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230116-WA0000.jpg, sizeBytes: 285702} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015790, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-15-11-15-38-814_lockscreen.jpg, sizeBytes: 368060} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015789, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-15-11-15-33-576_com.google.android.apps.maps.jpg, sizeBytes: 429185} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015786, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230115-WA0002.jpg, sizeBytes: 212868} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015781, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230115-WA0001.jpg, sizeBytes: 11468} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015768, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0026.jpg, sizeBytes: 180495} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015763, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0025.jpg, sizeBytes: 100880} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015760, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0024.jpg, sizeBytes: 214915} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015756, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0023.jpg, sizeBytes: 85090} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015753, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0022.jpg, sizeBytes: 241557} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 247/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015731, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0015.jpg, sizeBytes: 111857} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015728, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0014.jpg, sizeBytes: 97514} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015725, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0013.jpg, sizeBytes: 116731} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015722, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0012.jpg, sizeBytes: 111985} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015716, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0010.jpg, sizeBytes: 90745} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015719, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0011.jpg, sizeBytes: 83709} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015713, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0009.jpg, sizeBytes: 88981} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015710, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0008.jpg, sizeBytes: 361105} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015707, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0007.jpg, sizeBytes: 380536} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015704, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0006.jpg, sizeBytes: 349570} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015701, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0005.jpg, sizeBytes: 327878} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015690, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230114-WA0002.jpg, sizeBytes: 8333} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015645, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230113-WA0005.jpg, sizeBytes: 125408} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015640, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230113-WA0003.jpg, sizeBytes: 312660} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015637, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230113-WA0002.jpg, sizeBytes: 281020} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015610, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0009.jpg, sizeBytes: 99632} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015607, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0008.jpg, sizeBytes: 85837} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015604, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0007.jpg, sizeBytes: 126465} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015601, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0006.jpg, sizeBytes: 138509} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015598, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0005.jpg, sizeBytes: 53171} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015593, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-12-15-52-44-667_com.google.android.googlequicksearchbox.jpg, sizeBytes: 589252} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015590, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-12-14-08-03-210-edit_com.android.chrome.jpg, sizeBytes: 267846} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015582, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0003.jpg, sizeBytes: 107940} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015572, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230112-WA0000.jpg, sizeBytes: 112624} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015556, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0006.jpg, sizeBytes: 114956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015559, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0007.jpg, sizeBytes: 161006} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015550, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0004.jpg, sizeBytes: 236227} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015553, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0005.jpg, sizeBytes: 193297} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015544, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0002.jpg, sizeBytes: 134382} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015547, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0003.jpg, sizeBytes: 195002} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015542, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-11-18-10-31-171-edit_com.booking.jpg, sizeBytes: 516270} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015536, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230111-WA0000.jpg, sizeBytes: 63176} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015524, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0009.jpg, sizeBytes: 85625} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015237, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0004.jpg, sizeBytes: 114900} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015501, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0003.jpg, sizeBytes: 294160} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015495, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0001.jpg, sizeBytes: 348185} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015498, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0002.jpg, sizeBytes: 95236} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015492, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230110-WA0000.jpg, sizeBytes: 195564} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015483, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230109-WA0001.jpg, sizeBytes: 159019} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015479, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230109-WA0000.jpg, sizeBytes: 209363} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015464, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-08-20-58-56-462_de.komoot.android.jpg, sizeBytes: 753527} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015462, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-08-20-52-51-133_de.komoot.android.jpg, sizeBytes: 880629} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015456, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0004.jpg, sizeBytes: 122148} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015459, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0005.jpg, sizeBytes: 117862} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015453, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0003.jpg, sizeBytes: 155022} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015448, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0002.jpg, sizeBytes: 111220} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015445, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230108-WA0001.jpg, sizeBytes: 279472} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015444, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-08-09-33-12-038_com.android.chrome.jpg, sizeBytes: 257771} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015443, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-08-09-30-35-652-edit_com.android.chrome.jpg, sizeBytes: 308340} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015375, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0016.jpg, sizeBytes: 183299} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015372, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0015.jpg, sizeBytes: 166318} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015369, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0014.jpg, sizeBytes: 89756} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015366, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0013.jpg, sizeBytes: 77586} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015359, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0011.jpg, sizeBytes: 103485} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015349, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0008.jpg, sizeBytes: 42584} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015352, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0009.jpg, sizeBytes: 37003} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015340, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0005.jpg, sizeBytes: 402875} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015337, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0004.jpg, sizeBytes: 338076} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015332, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0002.jpg, sizeBytes: 86508} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015329, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0001.jpg, sizeBytes: 229541} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015304, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230106-WA0000.jpg, sizeBytes: 60937} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015292, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0005.jpg, sizeBytes: 109452} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015275, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0004.jpg, sizeBytes: 80140} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015272, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0003.jpg, sizeBytes: 137176} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015269, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0002.jpg, sizeBytes: 135954} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015255, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0001.jpg, sizeBytes: 181580} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015252, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230105-WA0000.jpg, sizeBytes: 75092} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015239, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0005.jpg, sizeBytes: 146520} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015231, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0003.jpg, sizeBytes: 47987} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015227, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0002.jpg, sizeBytes: 40001} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 317/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015223, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0001.jpg, sizeBytes: 229030} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015220, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230104-WA0000.jpg, sizeBytes: 397129} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015214, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0005.jpg, sizeBytes: 140508} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015211, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0004.jpg, sizeBytes: 24978} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015208, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0003.jpg, sizeBytes: 125898} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015206, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0002.jpg, sizeBytes: 54633} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015191, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230103-WA0000.jpg, sizeBytes: 33377} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015172, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230102-WA0005.jpg, sizeBytes: 52673} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015169, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230102-WA0004.jpg, sizeBytes: 1894216} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015166, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230102-WA0003.jpg, sizeBytes: 141671} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015163, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230102-WA0002.jpg, sizeBytes: 203734} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015152, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-02-11-37-41-731_com.android.chrome.jpg, sizeBytes: 841332} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015140, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0032.jpg, sizeBytes: 396780} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015137, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2023-01-01-15-04-25-479_com.mi.globalbrowser.jpg, sizeBytes: 470363} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015134, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0031.jpg, sizeBytes: 81350} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015119, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0027.jpg, sizeBytes: 155176} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015116, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0026.jpg, sizeBytes: 153881} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 334/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015113, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0025.jpg, sizeBytes: 182344} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015108, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0023.jpg, sizeBytes: 38324} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015105, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0022.jpg, sizeBytes: 81549} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015102, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0021.jpg, sizeBytes: 73308} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015099, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0020.jpg, sizeBytes: 168435} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015070, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0013.jpg, sizeBytes: 186362} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015082, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0017.jpg, sizeBytes: 82952} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015080, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0016.jpg, sizeBytes: 1538653} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015078, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0015.jpg, sizeBytes: 107396} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015075, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0014.jpg, sizeBytes: 141479} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015047, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0006.jpg, sizeBytes: 176672} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015044, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0005.jpg, sizeBytes: 173579} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015033, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0002.jpg, sizeBytes: 272743} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015030, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0001.jpg, sizeBytes: 335547} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015027, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20230101-WA0000.jpg, sizeBytes: 316669} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015011, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0030.jpg, sizeBytes: 341538} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015020, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0033.jpg, sizeBytes: 540860} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015017, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0032.jpg, sizeBytes: 217530} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015014, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0031.jpg, sizeBytes: 314835} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015008, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0029.jpg, sizeBytes: 368255} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015005, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0028.jpg, sizeBytes: 325031} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000015002, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0027.jpg, sizeBytes: 346769} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014999, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0026.jpg, sizeBytes: 336779} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014992, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0025.jpg, sizeBytes: 209109} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014989, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0024.jpg, sizeBytes: 6330} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014986, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0023.jpg, sizeBytes: 188547} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014973, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0019.jpg, sizeBytes: 17220} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014968, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0017.jpg, sizeBytes: 19862} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014965, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0016.jpg, sizeBytes: 92739} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014960, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0014.jpg, sizeBytes: 76057} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014959, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-31-17-12-33-972_com.google.android.youtube.jpg, sizeBytes: 624537} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014957, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0012.jpeg, sizeBytes: 1074065} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014954, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0011.jpg, sizeBytes: 233454} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014952, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0010.jpg, sizeBytes: 155144} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014949, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0009.jpg, sizeBytes: 191683} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014947, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0008.jpg, sizeBytes: 245318} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014945, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0007.jpg, sizeBytes: 53268} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014941, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0005.jpg, sizeBytes: 116054} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014938, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0004.jpg, sizeBytes: 59554} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014935, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0003.jpg, sizeBytes: 123709} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014932, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0002.jpg, sizeBytes: 128631} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014924, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221231-WA0000.jpg, sizeBytes: 306019} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014911, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221230-WA0012.jpg, sizeBytes: 103903} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014908, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221230-WA0011.jpg, sizeBytes: 227194} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014881, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20221230-WA0005.jpg, sizeBytes: 412362} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014878, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20221230-WA0004.jpg, sizeBytes: 435222} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014864, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20221230-WA0002.jpeg, sizeBytes: 957552} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014858, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221230-WA0000.jpg, sizeBytes: 288245} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014844, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221229-WA0001.jpg, sizeBytes: 63535} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014805, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0007.jpg, sizeBytes: 57520} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014799, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0006.jpg, sizeBytes: 139770} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014796, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0005.jpg, sizeBytes: 268827} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014793, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0004.jpg, sizeBytes: 247435} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014790, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0003.jpg, sizeBytes: 180625} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 388/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014779, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221228-WA0000.jpg, sizeBytes: 200472} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014770, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0009.jpg, sizeBytes: 288437} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014767, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0008.jpg, sizeBytes: 202247} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014764, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0007.jpg, sizeBytes: 293742} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014761, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0006.jpg, sizeBytes: 103357} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014758, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0005.jpg, sizeBytes: 159910} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014755, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0004.jpg, sizeBytes: 120734} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014752, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0003.jpg, sizeBytes: 195221} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014749, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0002.jpg, sizeBytes: 106103} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014746, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0001.jpg, sizeBytes: 86010} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014744, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221227-WA0000.jpg, sizeBytes: 86266} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): SqfliteLocalMediaDb saveMetadata complete in 34ms for 400 entries +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013665, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221205-WA0002.jpg, sizeBytes: 58541} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014723, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0009.jpg, sizeBytes: 352754} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014725, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0010.jpg, sizeBytes: 316915} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014713, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0002.jpg, sizeBytes: 263179} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014710, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0001.jpg, sizeBytes: 244777} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014707, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221226-WA0000.jpg, sizeBytes: 69787} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014680, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0033.jpg, sizeBytes: 110283} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014677, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0032.jpg, sizeBytes: 16349} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014672, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0030.jpg, sizeBytes: 33777} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014667, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0028.jpg, sizeBytes: 183880} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014664, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0027.jpg, sizeBytes: 3732} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014661, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0026.jpg, sizeBytes: 44439} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014653, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0024.jpg, sizeBytes: 185747} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014651, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0023.jpg, sizeBytes: 59196} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014648, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0022.jpg, sizeBytes: 217045} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014645, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0021.jpg, sizeBytes: 64203} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014637, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0019.jpg, sizeBytes: 391600} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014635, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0018.jpg, sizeBytes: 45613} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014628, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0016.jpg, sizeBytes: 22570} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014625, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0015.jpg, sizeBytes: 205575} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014617, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0012.jpg, sizeBytes: 148420} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014610, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0010.jpg, sizeBytes: 16471} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014602, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0008.jpg, sizeBytes: 1424198} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014594, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0005.jpg, sizeBytes: 134430} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014592, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0004.jpg, sizeBytes: 157385} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014586, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0002.jpg, sizeBytes: 39618} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014567, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221225-WA0000.jpg, sizeBytes: 141075} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014564, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0023.jpg, sizeBytes: 229870} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014561, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0022.jpg, sizeBytes: 192700} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014558, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0021.jpg, sizeBytes: 96391} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014549, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0020.jpg, sizeBytes: 216290} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014546, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0019.jpg, sizeBytes: 259288} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014539, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0017.jpg, sizeBytes: 265795} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014532, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0015.jpg, sizeBytes: 73335} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014529, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0014.jpg, sizeBytes: 94783} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014523, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0011.jpg, sizeBytes: 63063} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014520, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0010.jpg, sizeBytes: 214874} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014508, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0009.jpg, sizeBytes: 24637} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014501, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0007.jpg, sizeBytes: 120018} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014491, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0005.jpg, sizeBytes: 109677} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014486, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221224-WA0003.jpg, sizeBytes: 305040} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014484, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-24-09-28-28-235_com.booking.jpg, sizeBytes: 797646} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014460, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0013.jpg, sizeBytes: 53692} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014457, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0012.jpg, sizeBytes: 2664485} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014435, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0008.jpg, sizeBytes: 29840} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014418, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0006.jpg, sizeBytes: 76259} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014415, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0005.jpg, sizeBytes: 147305} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014397, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0002.jpg, sizeBytes: 2042448} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014395, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0001.jpg, sizeBytes: 1997527} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014392, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221223-WA0000.jpg, sizeBytes: 247914} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014377, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-22-10-29-44-242_com.whatsapp.jpg, sizeBytes: 707617} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014373, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221222-WA0003.jpg, sizeBytes: 137283} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014371, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221222-WA0002.jpg, sizeBytes: 1796251} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014358, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221222-WA0000.jpg, sizeBytes: 1767770} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014363, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221222-WA0001.jpg, sizeBytes: 110717} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014323, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221221-WA0006.jpg, sizeBytes: 369231} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014320, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221221-WA0005.jpg, sizeBytes: 615210} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014317, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221221-WA0004.jpg, sizeBytes: 191010} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014315, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-25-47-884_com.whatsapp.jpg, sizeBytes: 315004} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014313, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-25-26-051_it.caitalia.apphub.jpg, sizeBytes: 369785} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014311, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-24-12-629_it.caitalia.apphub.jpg, sizeBytes: 367741} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014310, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-24-01-666_it.caitalia.apphub.jpg, sizeBytes: 368592} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 461/6956} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014308, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-21-08-23-37-066_com.whatsapp.jpg, sizeBytes: 350409} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014263, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221220-WA0003.jpg, sizeBytes: 71326} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014259, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1671532011809.jpg, sizeBytes: 44198} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014258, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1671531982691.jpg, sizeBytes: 53820} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014257, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1671531893046.jpg, sizeBytes: 40848} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014238, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221219-WA0003.jpg, sizeBytes: 190119} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014227, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221219-WA0001.jpg, sizeBytes: 2158972} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014229, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221219-WA0002.jpg, sizeBytes: 1816669} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014224, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221219-WA0000.jpg, sizeBytes: 208605} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014219, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0014.jpg, sizeBytes: 15744} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014206, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0012.jpg, sizeBytes: 23780} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014203, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0011.jpg, sizeBytes: 119855} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014195, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0008.jpg, sizeBytes: 663946} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014182, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0006.jpg, sizeBytes: 631241} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014179, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0005.jpg, sizeBytes: 152348} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014173, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0003.jpg, sizeBytes: 279432} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014176, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0004.jpg, sizeBytes: 146271} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014170, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0002.jpg, sizeBytes: 274305} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014163, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221218-WA0000.jpg, sizeBytes: 68733} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014149, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0011.jpg, sizeBytes: 229941} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014143, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-17-16-45-06-683_com.whatsapp.jpg, sizeBytes: 792848} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014135, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0008.jpg, sizeBytes: 157077} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014138, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0009.jpg, sizeBytes: 137012} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014130, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0007.jpg, sizeBytes: 133796} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014124, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0005.jpg, sizeBytes: 141543} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014127, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0006.jpg, sizeBytes: 114106} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014117, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0003.jpg, sizeBytes: 46082} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014114, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0002.jpg, sizeBytes: 26894} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014111, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0001.jpg, sizeBytes: 63326} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014108, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221217-WA0000.jpg, sizeBytes: 108386} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014099, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221216-WA0004.jpg, sizeBytes: 85678} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014093, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221216-WA0003.jpg, sizeBytes: 39912} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014088, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-16-12-15-09-354_com.google.android.gm.jpg, sizeBytes: 384085} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014072, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221216-WA0001.jpg, sizeBytes: 108715} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014070, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-16-08-44-41-276_com.ebay.mobile.jpg, sizeBytes: 366996} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014069, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-16-08-43-19-381_com.ebay.mobile.jpg, sizeBytes: 477958} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014049, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221215-WA0000.jpg, sizeBytes: 271228} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014027, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-14-16-43-16-707-edit_com.whatsapp.jpg, sizeBytes: 702513} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000014026, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-14-16-43-01-341_com.whatsapp.jpg, sizeBytes: 670514} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013993, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0007.jpg, sizeBytes: 141187} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013990, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0006.jpg, sizeBytes: 75636} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013986, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0005.jpg, sizeBytes: 217247} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013983, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0004.jpg, sizeBytes: 346389} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013975, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0003.jpg, sizeBytes: 480336} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013972, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0002.jpg, sizeBytes: 166614} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013969, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0001.jpg, sizeBytes: 67602} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013966, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221213-WA0000.jpg, sizeBytes: 75245} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013952, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221212-WA0002.jpg, sizeBytes: 163585} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013955, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221212-WA0003.jpg, sizeBytes: 289560} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013949, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221212-WA0001.jpg, sizeBytes: 193583} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013946, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221212-WA0000.jpg, sizeBytes: 309775} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013931, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221211-WA0001.jpg, sizeBytes: 148188} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013918, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221211-WA0000.jpg, sizeBytes: 148536} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013910, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221210-WA0003.jpg, sizeBytes: 114866} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013898, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221210-WA0001.jpg, sizeBytes: 241255} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013895, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221210-WA0000.jpg, sizeBytes: 217276} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013847, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0021.jpg, sizeBytes: 14922} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013840, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0019.jpg, sizeBytes: 155147} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013816, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0016.jpg, sizeBytes: 65384} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013819, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0017.jpg, sizeBytes: 21270} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013822, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0018.jpg, sizeBytes: 39580} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013807, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0013.jpg, sizeBytes: 45283} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013810, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0014.jpg, sizeBytes: 90968} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013813, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0015.jpg, sizeBytes: 43948} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013804, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0012.jpg, sizeBytes: 40710} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013801, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0011.jpg, sizeBytes: 95492} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013798, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0010.jpg, sizeBytes: 84678} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013777, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0006.jpg, sizeBytes: 444563} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013780, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0007.jpg, sizeBytes: 393308} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013774, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0005.jpg, sizeBytes: 508881} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013764, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0002.jpg, sizeBytes: 396961} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013767, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0003.jpg, sizeBytes: 436756} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013758, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0000.jpg, sizeBytes: 494155} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013761, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221208-WA0001.jpg, sizeBytes: 455648} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013752, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0011.jpg, sizeBytes: 53499} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013746, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0010.jpg, sizeBytes: 116824} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013740, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0008.jpg, sizeBytes: 183374} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013728, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0005.jpg, sizeBytes: 159116} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013725, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0004.jpg, sizeBytes: 139938} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013722, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0003.jpg, sizeBytes: 121163} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013718, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0001.jpg, sizeBytes: 506915} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013720, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0002.jpg, sizeBytes: 297772} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013716, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221207-WA0000.jpg, sizeBytes: 400013} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013701, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221206-WA0001.jpg, sizeBytes: 257126} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 545/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013695, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221206-WA0000.jpg, sizeBytes: 534312} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013685, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-05-19-44-12-953_com.android.chrome.jpg, sizeBytes: 515000} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013668, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221205-WA0003.jpg, sizeBytes: 123427} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013664, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-12-05-14-15-29-274_lockscreen.jpg, sizeBytes: 847083} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013659, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221205-WA0001.jpg, sizeBytes: 145569} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013656, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221205-WA0000.jpg, sizeBytes: 113780} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013648, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0009.jpg, sizeBytes: 242159} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013645, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0008.jpg, sizeBytes: 161536} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013642, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0007.jpg, sizeBytes: 144759} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013638, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0005.jpg, sizeBytes: 176400} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013633, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0003.jpg, sizeBytes: 82956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013628, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0001.jpg, sizeBytes: 107368} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013625, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221204-WA0000.jpg, sizeBytes: 128926} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013602, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221202-WA0007.jpeg, sizeBytes: 1485067} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013600, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221202-WA0005.jpeg, sizeBytes: 1599136} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013593, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221202-WA0002.jpg, sizeBytes: 156593} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013572, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221201-WA0001.jpg, sizeBytes: 149974} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013545, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221130-WA0000.jpg, sizeBytes: 124304} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013533, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0013.jpg, sizeBytes: 233055} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013530, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0012.jpg, sizeBytes: 42991} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013527, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0011.jpg, sizeBytes: 435625} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013524, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0010.jpg, sizeBytes: 414373} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013518, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0008.jpg, sizeBytes: 77580} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013512, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0006.jpg, sizeBytes: 139243} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013515, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0007.jpg, sizeBytes: 68987} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013506, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0004.jpg, sizeBytes: 19721} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013509, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0005.jpg, sizeBytes: 21532} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013503, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0003.jpg, sizeBytes: 101253} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013500, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0002.jpg, sizeBytes: 100183} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013498, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0001.jpg, sizeBytes: 94218} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013495, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221129-WA0000.jpg, sizeBytes: 101551} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013366, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-27-14-28-51-460_com.huami.watch.hmwatchmanager.jpg, sizeBytes: 567482} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013347, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221127-WA0000.jpg, sizeBytes: 426106} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013340, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221126-WA0002.jpg, sizeBytes: 145883} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013334, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221126-WA0001.jpg, sizeBytes: 59711} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013330, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-26-13-30-23-962_com.android.chrome.jpg, sizeBytes: 283153} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013328, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-26-12-35-15-162-edit_com.google.android.apps.docs.editors.sheets.jpg, sizeBytes: 127727} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012631, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221114-WA0000.jpg, sizeBytes: 8881} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013308, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221125-WA0000.jpg, sizeBytes: 136874} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013289, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0013.jpg, sizeBytes: 400052} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013285, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0011.jpg, sizeBytes: 362182} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013287, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0012.jpg, sizeBytes: 387692} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013278, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-24-19-52-48-646-edit_com.google.android.googlequicksearchbox.jpg, sizeBytes: 582226} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013213, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0009.jpg, sizeBytes: 89231} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013207, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0008.jpg, sizeBytes: 486101} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013204, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0007.jpg, sizeBytes: 389238} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013198, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0005.jpg, sizeBytes: 298583} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013201, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0006.jpg, sizeBytes: 317813} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013192, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0003.jpg, sizeBytes: 322671} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013195, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0004.jpg, sizeBytes: 306012} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013189, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0002.jpg, sizeBytes: 316870} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013186, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0001.jpg, sizeBytes: 307336} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013180, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221124-WA0000.jpg, sizeBytes: 42548} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013164, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0011.jpg, sizeBytes: 267728} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013158, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0009.jpg, sizeBytes: 218646} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013161, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0010.jpg, sizeBytes: 276379} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013167, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0012.jpg, sizeBytes: 270717} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013141, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0007.jpg, sizeBytes: 111575} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013129, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0003.jpg, sizeBytes: 178339} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013132, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0004.jpg, sizeBytes: 113406} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013135, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0005.jpg, sizeBytes: 131041} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013138, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0006.jpg, sizeBytes: 88819} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013120, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0000.jpg, sizeBytes: 122145} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013123, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0001.jpg, sizeBytes: 104050} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013126, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221123-WA0002.jpg, sizeBytes: 158897} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013087, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221122-WA0002.jpg, sizeBytes: 302185} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013081, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221122-WA0000.jpg, sizeBytes: 40345} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013023, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0010.jpg, sizeBytes: 108452} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013017, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0008.jpg, sizeBytes: 91952} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013020, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0009.jpg, sizeBytes: 35048} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012766, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0000.jpg, sizeBytes: 195675} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013010, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0007.jpg, sizeBytes: 119927} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013005, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0005.jpg, sizeBytes: 448026} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000013002, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0004.jpg, sizeBytes: 14221} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012999, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0003.jpg, sizeBytes: 171198} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012996, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0002.jpg, sizeBytes: 682408} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012993, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221121-WA0001.jpg, sizeBytes: 56006} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012966, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0015.jpg, sizeBytes: 155843} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012959, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0013.jpg, sizeBytes: 485349} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012934, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0005.jpg, sizeBytes: 220856} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012952, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0011.jpg, sizeBytes: 539055} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012956, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0012.jpg, sizeBytes: 457000} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012946, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0009.jpg, sizeBytes: 11924} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 628/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012940, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0008.jpg, sizeBytes: 131444} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012925, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0004.jpg, sizeBytes: 316670} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012918, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221120-WA0001.jpg, sizeBytes: 330794} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012902, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221119-WA0002.jpg, sizeBytes: 148487} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012891, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221119-WA0000.jpg, sizeBytes: 92531} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012816, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221118-WA0005.jpg, sizeBytes: 179933} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012813, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221118-WA0004.jpg, sizeBytes: 215410} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012811, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221118-WA0002.jpeg, sizeBytes: 1396084} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012799, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221118-WA0000.jpg, sizeBytes: 80702} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012793, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0005.jpg, sizeBytes: 149296} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012796, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0006.jpg, sizeBytes: 120564} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012789, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0004.jpg, sizeBytes: 73175} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012778, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0002.jpg, sizeBytes: 154011} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012772, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221117-WA0001.jpg, sizeBytes: 143855} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012726, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-16-09-11-04-106-edit_com.strava.jpg, sizeBytes: 107020} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012720, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-16-09-08-11-012_com.miui.gallery.jpg, sizeBytes: 544134} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012709, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0010.jpg, sizeBytes: 101561} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012707, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0009.jpg, sizeBytes: 107466} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012696, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0007.jpg, sizeBytes: 141400} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012690, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0005.jpg, sizeBytes: 261614} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012693, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0006.jpg, sizeBytes: 335829} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012687, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0004.jpg, sizeBytes: 413622} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012680, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0002.jpg, sizeBytes: 245442} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012677, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0001.jpg, sizeBytes: 333478} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012674, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221115-WA0000.jpg, sizeBytes: 277983} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012665, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221114-WA0002.jpg, sizeBytes: 119700} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012661, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-14-13-43-01-262-edit_cn.wps.moffice_eng.jpg, sizeBytes: 86717} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012617, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0005.jpg, sizeBytes: 121587} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012614, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0004.jpg, sizeBytes: 11910} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012611, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0003.jpg, sizeBytes: 530589} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012608, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0002.jpg, sizeBytes: 553549} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012605, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0001.jpg, sizeBytes: 361702} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012602, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221113-WA0000.jpg, sizeBytes: 375591} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012576, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221112-WA0008.jpg, sizeBytes: 350896} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012579, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221112-WA0009.jpg, sizeBytes: 345422} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012573, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221112-WA0007.jpg, sizeBytes: 362583} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012570, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221112-WA0006.jpg, sizeBytes: 232186} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012541, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-11-19-27-22-128-edit_com.strava.jpg, sizeBytes: 485763} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012523, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221111-WA0000.jpg, sizeBytes: 44278} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012485, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0009.jpg, sizeBytes: 305654} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012480, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0008.jpg, sizeBytes: 106687} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012478, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0007.jpg, sizeBytes: 46645} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012475, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0006.jpg, sizeBytes: 13972} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012473, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0004.jpeg, sizeBytes: 760823} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012467, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0002.jpg, sizeBytes: 79258} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012470, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0003.jpg, sizeBytes: 139875} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012464, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0001.jpg, sizeBytes: 130673} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012459, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221110-WA0000.jpg, sizeBytes: 227385} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012450, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0005.jpg, sizeBytes: 191139} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012447, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0004.jpg, sizeBytes: 216015} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012444, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0003.jpg, sizeBytes: 110105} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012441, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0002.jpg, sizeBytes: 107790} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012438, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0001.jpg, sizeBytes: 201361} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012435, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221109-WA0000.jpg, sizeBytes: 697305} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012427, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0007.jpg, sizeBytes: 72871} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012420, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0006.jpg, sizeBytes: 122016} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012417, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0005.jpg, sizeBytes: 70758} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012414, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0004.jpg, sizeBytes: 300602} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012408, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0002.jpg, sizeBytes: 575949} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012411, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0003.jpg, sizeBytes: 562824} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012405, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0001.jpg, sizeBytes: 365952} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012402, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221108-WA0000.jpg, sizeBytes: 353218} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012401, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-08-08-04-08-999_com.google.android.dialer.jpg, sizeBytes: 175417} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012392, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0013.jpg, sizeBytes: 394301} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012375, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0007.jpg, sizeBytes: 222099} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012378, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0008.jpg, sizeBytes: 313223} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012381, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0009.jpg, sizeBytes: 166728} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012384, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0010.jpg, sizeBytes: 146250} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +W/d.t.a.c.c.MFH(26629): failed to read metadata by metadata-extractor for mimeType=image/jpeg uri=content://media/external/images/media/32380 +W/d.t.a.c.c.MFH(26629): com.drew.imaging.ImageProcessingException: File format could not be determined +W/d.t.a.c.c.MFH(26629): at com.drew.imaging.ImageMetadataReader.readMetadata(ImageMetadataReader.java:185) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.metadata.metadataextractor.Helper.safeRead(Helper.kt:89) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadataByMetadataExtractor(MetadataFetchHandler.kt:637) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadata(MetadataFetchHandler.kt:537) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.access$getCatalogMetadata(MetadataFetchHandler.kt:115) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.Coresult$Companion.safe(Coresult.kt:52) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2.invokeSuspend(MetadataFetchHandler.kt:121) +W/d.t.a.c.c.MFH(26629): at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:820) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012372, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0006.jpg, sizeBytes: 138195} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012369, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0005.jpg, sizeBytes: 232774} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012362, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0004.jpg, sizeBytes: 220312} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012359, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0003.jpg, sizeBytes: 71503} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012354, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0002.jpg, sizeBytes: 527090} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012352, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-07-08-39-50-826_it.subito.jpg, sizeBytes: 453997} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012349, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221107-WA0000.jpg, sizeBytes: 89611} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012341, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221106-WA0001.jpg, sizeBytes: 146177} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012338, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221106-WA0000.jpg, sizeBytes: 308752} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012329, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0009.jpg, sizeBytes: 307746} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012322, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0008.jpg, sizeBytes: 58466} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012317, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0007.jpg, sizeBytes: 88207} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012314, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0006.jpg, sizeBytes: 198098} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012311, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0005.jpg, sizeBytes: 104268} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012308, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0004.jpg, sizeBytes: 501061} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012299, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221105-WA0002.jpg, sizeBytes: 86668} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012281, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0011.jpg, sizeBytes: 149668} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012272, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0010.jpg, sizeBytes: 235005} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 714/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012270, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0009.jpg, sizeBytes: 188237} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012268, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0008.jpg, sizeBytes: 103086} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012265, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0007.jpg, sizeBytes: 46445} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012263, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0006.jpg, sizeBytes: 307388} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012257, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0005.jpg, sizeBytes: 30644} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012254, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0004.jpg, sizeBytes: 131607} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012251, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0003.jpg, sizeBytes: 116928} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012244, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0001.jpg, sizeBytes: 266106} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012241, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221104-WA0000.jpg, sizeBytes: 258788} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012229, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0005.jpg, sizeBytes: 59466} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012226, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0004.jpg, sizeBytes: 58611} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012223, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0003.jpg, sizeBytes: 104082} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012218, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0001.jpg, sizeBytes: 134125} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012215, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221103-WA0000.jpg, sizeBytes: 74726} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012186, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-02-19-34-23-959-edit_com.strava.jpg, sizeBytes: 88136} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012183, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-02-19-33-31-938-edit_com.strava.jpg, sizeBytes: 383909} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012182, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-11-02-19-33-16-551_com.strava.jpg, sizeBytes: 568349} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012179, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221102-WA0006.jpg, sizeBytes: 145761} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012172, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221102-WA0004.jpg, sizeBytes: 207713} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012169, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221102-WA0003.jpg, sizeBytes: 214664} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012160, path: /storage/emulated/0/DCIM/Creative/IMG_20221102_122030.jpg, sizeBytes: 789564} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012157, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221102-WA0000.jpg, sizeBytes: 280095} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012138, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0006.jpg, sizeBytes: 67080} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012135, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0005.jpg, sizeBytes: 67807} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012132, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0004.jpg, sizeBytes: 173027} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012129, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0003.jpg, sizeBytes: 426940} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012126, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0002.jpg, sizeBytes: 172133} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012123, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0001.jpg, sizeBytes: 513101} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012120, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221101-WA0000.jpg, sizeBytes: 307353} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012102, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0034.jpg, sizeBytes: 252162} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012099, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0033.jpg, sizeBytes: 80233} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012096, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0032.jpg, sizeBytes: 70097} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012090, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0030.jpg, sizeBytes: 82503} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012093, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0031.jpg, sizeBytes: 70283} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012084, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0028.jpg, sizeBytes: 56499} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012087, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0029.jpg, sizeBytes: 89847} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012081, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0027.jpg, sizeBytes: 55486} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012078, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0026.jpg, sizeBytes: 82369} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012075, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0025.jpg, sizeBytes: 84113} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012072, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0024.jpg, sizeBytes: 140486} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012069, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0023.jpg, sizeBytes: 121319} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012066, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20221031-WA0022.jpg, sizeBytes: 375780} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012057, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20221031-WA0017.jpg, sizeBytes: 255071} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012044, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-31-19-49-48-927_com.google.android.apps.maps.jpg, sizeBytes: 352971} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012042, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0014.jpg, sizeBytes: 102217} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012035, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0012.jpg, sizeBytes: 134550} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012032, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0011.jpg, sizeBytes: 181795} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012030, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0010.jpg, sizeBytes: 40998} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012027, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0009.jpg, sizeBytes: 155709} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012024, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0008.jpg, sizeBytes: 93802} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012019, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0006.jpg, sizeBytes: 44760} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000012016, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0005.jpg, sizeBytes: 35126} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011998, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0002.jpg, sizeBytes: 395992} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011985, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0001.jpg, sizeBytes: 75212} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011976, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221031-WA0000.jpg, sizeBytes: 219523} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011974, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0012.jpg, sizeBytes: 56645} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011967, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0011.jpg, sizeBytes: 67441} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011965, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0009.jpeg, sizeBytes: 1000510} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011962, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0008.jpg, sizeBytes: 96091} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011959, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0007.jpg, sizeBytes: 82996} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011956, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0006.jpg, sizeBytes: 109214} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011953, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0005.jpg, sizeBytes: 81048} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011936, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-30-11-35-43-323_ch.publisheria.bring.jpg, sizeBytes: 441019} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011933, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221030-WA0000.jpg, sizeBytes: 574503} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011924, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0039.jpg, sizeBytes: 181781} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011921, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0038.jpg, sizeBytes: 104722} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011918, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0037.jpg, sizeBytes: 169461} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011915, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0036.jpg, sizeBytes: 152863} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011912, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0035.jpg, sizeBytes: 84178} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011909, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0034.jpg, sizeBytes: 732031} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011906, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0033.jpg, sizeBytes: 300180} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011903, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0032.jpg, sizeBytes: 448319} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011900, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0031.jpg, sizeBytes: 246717} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011897, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0030.jpg, sizeBytes: 772407} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011895, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0029.jpg, sizeBytes: 414046} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011892, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0028.jpg, sizeBytes: 809201} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011889, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0027.jpg, sizeBytes: 475353} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011886, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0026.jpg, sizeBytes: 315211} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011880, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0024.jpg, sizeBytes: 417868} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011883, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0025.jpg, sizeBytes: 300916} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011874, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0022.jpg, sizeBytes: 236697} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011877, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0023.jpg, sizeBytes: 435815} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011868, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0020.jpg, sizeBytes: 277750} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 797/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011871, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0021.jpg, sizeBytes: 119062} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011862, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0018.jpg, sizeBytes: 147718} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): SqfliteLocalMediaDb saveMetadata complete in 27ms for 400 entries +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011865, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0019.jpg, sizeBytes: 89881} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011859, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0017.jpg, sizeBytes: 118840} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011856, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0016.jpg, sizeBytes: 80633} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011853, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0015.jpg, sizeBytes: 152550} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011850, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0014.jpg, sizeBytes: 366468} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011847, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0013.jpg, sizeBytes: 335383} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011823, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0009.jpg, sizeBytes: 226744} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011813, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0006.jpg, sizeBytes: 409330} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011816, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0007.jpg, sizeBytes: 427333} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011810, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0005.jpg, sizeBytes: 411959} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011803, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0003.jpg, sizeBytes: 417348} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011797, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0001.jpg, sizeBytes: 404364} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011800, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221029-WA0002.jpg, sizeBytes: 504975} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011791, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0005.jpg, sizeBytes: 49159} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011778, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0004.jpg, sizeBytes: 228661} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011772, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0002.jpg, sizeBytes: 62583} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011769, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0001.jpg, sizeBytes: 172732} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011766, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221028-WA0000.jpg, sizeBytes: 80977} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011745, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0010.jpg, sizeBytes: 92387} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011733, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0008.jpg, sizeBytes: 136089} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011624, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0006.jpeg, sizeBytes: 1565691} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011622, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0004.jpeg, sizeBytes: 1532752} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011620, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0002.jpeg, sizeBytes: 1931762} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011617, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0001.jpg, sizeBytes: 210382} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011614, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221027-WA0000.jpg, sizeBytes: 840141} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011611, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0005.jpg, sizeBytes: 260654} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011605, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0004.jpg, sizeBytes: 27036} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011602, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0003.jpg, sizeBytes: 10373} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011599, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0002.jpg, sizeBytes: 11067} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011596, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0001.jpg, sizeBytes: 10570} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010935, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0005.jpg, sizeBytes: 198155} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011590, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221026-WA0000.jpg, sizeBytes: 417661} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011581, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0011.jpg, sizeBytes: 15278} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011579, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-25-19-09-58-201_com.huami.watch.hmwatchmanager.jpg, sizeBytes: 501246} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011576, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0009.jpg, sizeBytes: 166705} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011572, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0008.jpg, sizeBytes: 190905} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011569, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0007.jpg, sizeBytes: 269746} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011566, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0006.jpg, sizeBytes: 385940} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011556, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0003.jpg, sizeBytes: 158985} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011559, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0004.jpg, sizeBytes: 119902} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011549, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-25-09-41-21-279_com.whatsapp.jpg, sizeBytes: 659666} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011535, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221025-WA0000.jpg, sizeBytes: 119690} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011515, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0010.jpg, sizeBytes: 242199} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011518, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0011.jpg, sizeBytes: 248861} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011512, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0009.jpg, sizeBytes: 272820} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011506, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0007.jpg, sizeBytes: 183907} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011509, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221024-WA0008.jpg, sizeBytes: 347362} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011436, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0024.jpg, sizeBytes: 391439} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011434, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0023.jpg, sizeBytes: 30287} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011431, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0022.jpg, sizeBytes: 194392} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011428, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0021.jpg, sizeBytes: 132667} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011425, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0020.jpg, sizeBytes: 221853} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011401, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0012.jpg, sizeBytes: 226610} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011365, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221023-WA0000.jpg, sizeBytes: 571791} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011353, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221022-WA0011.jpg, sizeBytes: 127388} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011278, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221021-WA0003.jpg, sizeBytes: 84963} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011149, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221021-WA0000.jpg, sizeBytes: 569057} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011134, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0024.jpg, sizeBytes: 86790} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011112, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0019.jpg, sizeBytes: 124792} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011103, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0017.jpg, sizeBytes: 144725} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011101, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0016.jpg, sizeBytes: 812683} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011097, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0014.jpg, sizeBytes: 35541} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011099, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0015.jpg, sizeBytes: 7642} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011090, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221020-WA0011.jpg, sizeBytes: 115222} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/1000011041, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-20-08-10-45-855_com.google.android.dialer.png, sizeBytes: 14929} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011023, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0007.jpg, sizeBytes: 98085} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011020, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0006.jpg, sizeBytes: 110513} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011018, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0005.jpg, sizeBytes: 83243} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011006, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-19-08-56-18-501_com.google.android.googlequicksearchbox.jpg, sizeBytes: 563831} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000011003, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0001.jpg, sizeBytes: 116417} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010997, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221019-WA0000.jpg, sizeBytes: 338387} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010985, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-18-19-34-52-397_com.huami.watch.hmwatchmanager.jpg, sizeBytes: 493920} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010948, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0009.jpg, sizeBytes: 131117} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010938, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0006.jpg, sizeBytes: 41107} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010929, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0004.jpg, sizeBytes: 211493} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010921, path: /storage/emulated/0/DCIM/Camera/IMG_20221017_142950.jpg, sizeBytes: 5041227} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010914, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0003.jpg, sizeBytes: 116964} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010912, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221017-WA0002.jpg, sizeBytes: 65284} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010880, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221016-WA0011.jpg, sizeBytes: 175719} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010877, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221016-WA0010.jpg, sizeBytes: 157129} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010810, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221015-WA0000.jpg, sizeBytes: 284766} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 880/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010773, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0038.jpg, sizeBytes: 97812} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010772, path: /storage/emulated/0/DCIM/Camera/20221014_190318_886.jpg, sizeBytes: 2494631} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010752, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0024.jpg, sizeBytes: 50820} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010749, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0023.jpg, sizeBytes: 377113} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010740, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0020.jpg, sizeBytes: 243891} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010743, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0021.jpg, sizeBytes: 275621} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010746, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0022.jpg, sizeBytes: 181227} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010737, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0019.jpg, sizeBytes: 386488} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010734, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221014-WA0018.jpg, sizeBytes: 360587} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010729, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_153311.jpg, sizeBytes: 2276965} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010727, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_153246.jpg, sizeBytes: 2278488} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010718, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-14-14-43-25-330_com.huami.watch.hmwatchmanager.jpg, sizeBytes: 569264} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010704, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_143622.jpg, sizeBytes: 5112300} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010703, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_143621.jpg, sizeBytes: 5148327} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010701, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_143618.jpg, sizeBytes: 5073501} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010697, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_140302.jpg, sizeBytes: 5994257} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010698, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_140303.jpg, sizeBytes: 5672971} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010695, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_140258.jpg, sizeBytes: 5591203} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010693, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_140252.jpg, sizeBytes: 7207541} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010688, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_130212.jpg, sizeBytes: 9015380} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010686, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_130156.jpg, sizeBytes: 8498699} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010684, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_130127.jpg, sizeBytes: 7241852} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010682, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_130123.jpg, sizeBytes: 7853513} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010680, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_125215.jpg, sizeBytes: 7733087} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010678, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_125211.jpg, sizeBytes: 7001236} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010676, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_125202.jpg, sizeBytes: 7919815} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010674, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_125130.jpg, sizeBytes: 8731676} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010669, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_121951.jpg, sizeBytes: 5496419} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010667, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_121822.jpg, sizeBytes: 8319332} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010662, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_121135.jpg, sizeBytes: 3992254} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010659, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_110919.jpg, sizeBytes: 5368507} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010657, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_110557.jpg, sizeBytes: 3407197} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010655, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_110549.jpg, sizeBytes: 7096292} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010653, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_110526.jpg, sizeBytes: 6650799} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010649, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_105939.jpg, sizeBytes: 4109652} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010647, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_105933.jpg, sizeBytes: 3791151} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010645, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_105930.jpg, sizeBytes: 3799983} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010641, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_104857.jpg, sizeBytes: 7639315} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010639, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_104854.jpg, sizeBytes: 8392178} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010637, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_104825.jpg, sizeBytes: 3282143} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010635, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_104819.jpg, sizeBytes: 8534289} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010633, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_104810.jpg, sizeBytes: 8796953} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010632, path: /storage/emulated/0/DCIM/Camera/PANO_20221014_104731.jpg, sizeBytes: 54543472} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010631, path: /storage/emulated/0/DCIM/Camera/PANO_20221014_104724.jpg, sizeBytes: 51080844} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010629, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_104613.jpg, sizeBytes: 7250654} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010627, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_103342.jpg, sizeBytes: 3346492} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010625, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_103329.jpg, sizeBytes: 4323902} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010623, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_103318.jpg, sizeBytes: 4007257} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010618, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_102657.jpg, sizeBytes: 7838982} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010616, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_100014.jpg, sizeBytes: 5030307} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010614, path: /storage/emulated/0/DCIM/Camera/IMG_20221014_092729.jpg, sizeBytes: 4641587} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010602, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0014.jpg, sizeBytes: 77415} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010599, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0013.jpg, sizeBytes: 92208} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010594, path: /storage/emulated/0/DCIM/Camera/IMG_20221013_181826.jpg, sizeBytes: 5347170} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010589, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0010.jpg, sizeBytes: 86837} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010581, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0009.jpg, sizeBytes: 212229} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010564, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0003.jpg, sizeBytes: 75736} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010561, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0001.jpg, sizeBytes: 24349} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010557, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221013-WA0000.jpg, sizeBytes: 41474} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010511, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221011-WA0011.jpg, sizeBytes: 77570} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010508, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221011-WA0010.jpg, sizeBytes: 110007} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010499, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221011-WA0007.jpg, sizeBytes: 105531} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010486, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-11-19-02-32-361_com.huami.watch.hmwatchmanager.jpg, sizeBytes: 492394} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010476, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221011-WA0001.jpg, sizeBytes: 163198} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010461, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221010-WA0006.jpg, sizeBytes: 147840} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010455, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221010-WA0004.jpg, sizeBytes: 321995} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010445, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221010-WA0002.jpg, sizeBytes: 586720} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010436, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221010-WA0000.jpg, sizeBytes: 130127} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010420, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0010.jpg, sizeBytes: 188568} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010417, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0009.jpg, sizeBytes: 220723} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010411, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0008.jpg, sizeBytes: 215023} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010408, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0007.jpg, sizeBytes: 172153} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010405, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0006.jpg, sizeBytes: 274459} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010402, path: /storage/emulated/0/DCIM/Camera/IMG_20221009_112237.jpg, sizeBytes: 5683776} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010401, path: /storage/emulated/0/DCIM/Camera/IMG_20221009_112234.jpg, sizeBytes: 6031061} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010398, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0005.jpg, sizeBytes: 273463} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010395, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221009-WA0004.jpg, sizeBytes: 279739} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010394, path: /storage/emulated/0/DCIM/Camera/PANO_20221009_101926.jpg, sizeBytes: 23919625} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010393, path: /storage/emulated/0/DCIM/Camera/PANO_20221009_101911.jpg, sizeBytes: 19122500} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010392, path: /storage/emulated/0/DCIM/Camera/PANO_20221009_101906.jpg, sizeBytes: 10393651} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010391, path: /storage/emulated/0/DCIM/Camera/PANO_20221009_101853.jpg, sizeBytes: 22719276} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010360, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_204414.jpg, sizeBytes: 2841528} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010358, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_204317.jpg, sizeBytes: 5280985} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010356, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_204131.jpg, sizeBytes: 5544662} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010354, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_204125.jpg, sizeBytes: 3302384} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010352, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_204025.jpg, sizeBytes: 2439147} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010350, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_204015.jpg, sizeBytes: 9509937} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010348, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_204010.jpg, sizeBytes: 8624280} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010347, path: /storage/emulated/0/DCIM/Camera/PANO_20221008_203915.jpg, sizeBytes: 19277752} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010345, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_203809.jpg, sizeBytes: 2006093} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010343, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_203755.jpg, sizeBytes: 5716400} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010341, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_203714.jpg, sizeBytes: 4670429} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010339, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_203713.jpg, sizeBytes: 4529002} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010337, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_203618.jpg, sizeBytes: 5425679} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010335, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_203302.jpg, sizeBytes: 4731923} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010333, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_203257.jpg, sizeBytes: 4993631} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010331, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_203156.jpg, sizeBytes: 4823709} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010329, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_203132.jpg, sizeBytes: 4350676} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010327, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_203129.jpg, sizeBytes: 3778635} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010325, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_202948.jpg, sizeBytes: 2359176} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010323, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_202935.jpg, sizeBytes: 3019439} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010321, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_202923.jpg, sizeBytes: 2859899} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010319, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_202904.jpg, sizeBytes: 2681628} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010317, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_202859.jpg, sizeBytes: 2563967} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010311, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_202835.jpg, sizeBytes: 5413290} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010309, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_201745.jpg, sizeBytes: 5095913} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 986/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010307, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_201714.jpg, sizeBytes: 4756363} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010305, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_201708.jpg, sizeBytes: 4608058} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010303, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_201705.jpg, sizeBytes: 4611229} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010301, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_200409.jpg, sizeBytes: 4247381} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010299, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_200340.jpg, sizeBytes: 3018916} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010297, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_200335.jpg, sizeBytes: 4396971} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010295, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_195219.jpg, sizeBytes: 3274287} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010293, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_194336.jpg, sizeBytes: 5088470} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010291, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_193448.jpg, sizeBytes: 3536028} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010289, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_193412.jpg, sizeBytes: 3908486} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010287, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_193327.jpg, sizeBytes: 3992791} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010285, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_193248.jpg, sizeBytes: 4012753} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010283, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_193211.jpg, sizeBytes: 4230246} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010281, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_192319.jpg, sizeBytes: 1497896} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010280, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_192237.jpg, sizeBytes: 2562035} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010278, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_192131.jpg, sizeBytes: 4106871} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010276, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_192057.jpg, sizeBytes: 4223553} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010274, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_192003.jpg, sizeBytes: 3892155} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010269, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_191711.jpg, sizeBytes: 3885607} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010267, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_191658.jpg, sizeBytes: 4491017} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010265, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_191652.jpg, sizeBytes: 4222165} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010263, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_191543.jpg, sizeBytes: 4165301} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010261, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_191538.jpg, sizeBytes: 3523978} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010259, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_191416.jpg, sizeBytes: 4280896} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010257, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_191412.jpg, sizeBytes: 4201873} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010255, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_191407.jpg, sizeBytes: 4204177} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010245, path: /storage/emulated/0/DCIM/Camera/PANO_20221008_191123.jpg, sizeBytes: 20403174} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010243, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_191116.jpg, sizeBytes: 2751081} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010241, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_160833.jpg, sizeBytes: 4051464} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010238, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0010.jpg, sizeBytes: 369058} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010235, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0009.jpg, sizeBytes: 176945} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010232, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0008.jpg, sizeBytes: 526280} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010230, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_155523.jpg, sizeBytes: 6112795} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010228, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_155519.jpg, sizeBytes: 6296161} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010226, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_155511.jpg, sizeBytes: 6236860} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010223, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0007.jpg, sizeBytes: 350591} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010221, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_155322.jpg, sizeBytes: 6317875} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010219, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_155312.jpg, sizeBytes: 5861661} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010217, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_155305.jpg, sizeBytes: 7353049} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010215, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_155301.jpg, sizeBytes: 5982422} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010213, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_155255.jpg, sizeBytes: 5339159} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010211, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_155247.jpg, sizeBytes: 6250172} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010206, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0005.jpg, sizeBytes: 398864} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010203, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0004.jpg, sizeBytes: 494789} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010199, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0003.jpg, sizeBytes: 411206} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010197, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_154706.jpg, sizeBytes: 5899107} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010195, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_154653.jpg, sizeBytes: 5671143} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010193, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_154639.jpg, sizeBytes: 5999929} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010191, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_154441.jpg, sizeBytes: 5657323} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010189, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_154435.jpg, sizeBytes: 5209120} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010187, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_154206.jpg, sizeBytes: 2028241} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010185, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_154153.jpg, sizeBytes: 5328501} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010183, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_154148.jpg, sizeBytes: 5160276} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010181, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_153923.jpg, sizeBytes: 2702002} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010179, path: /storage/emulated/0/DCIM/Camera/IMG_20221008_153909.jpg, sizeBytes: 2749495} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010176, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221008-WA0002.jpg, sizeBytes: 135673} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010175, path: /storage/emulated/0/DCIM/Camera/PANO_20221008_131252.jpg, sizeBytes: 32047394} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010120, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221007-WA0020.jpg, sizeBytes: 60693} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010105, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-07-09-54-14-402_com.android.vending.jpg, sizeBytes: 178005} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010103, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221007-WA0018.jpeg, sizeBytes: 2459004} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000010042, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0029.jpg, sizeBytes: 127925} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009982, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0014.jpg, sizeBytes: 248156} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009980, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0013.jpg, sizeBytes: 289449} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009977, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0012.jpg, sizeBytes: 43233} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009975, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0011.jpg, sizeBytes: 27930} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009973, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0010.jpg, sizeBytes: 23126} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009971, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-06-11-11-59-972_com.lynxspa.prontotreno.jpg, sizeBytes: 1659044} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009969, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-06-11-03-46-449_com.lynxspa.prontotreno.jpg, sizeBytes: 848520} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009954, path: /storage/emulated/0/Download/Picture (Device Independent Bitmap) 1.jpg, sizeBytes: 81639} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009955, path: /storage/emulated/0/Download/Picture (Device Independent Bitmap) 2.jpg, sizeBytes: 135065} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009951, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0004.jpg, sizeBytes: 135969} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009948, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0003.jpg, sizeBytes: 127590} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009945, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0002.jpg, sizeBytes: 142264} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009944, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221006-WA0001.jpg, sizeBytes: 266992} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009930, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0009.jpg, sizeBytes: 95397} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009924, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0008.jpg, sizeBytes: 89888} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009921, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0007.jpg, sizeBytes: 102122} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009902, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0002.jpg, sizeBytes: 35462} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009905, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0003.jpg, sizeBytes: 39160} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009901, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-05-08-54-25-024_com.google.android.documentsui.jpg, sizeBytes: 260649} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009900, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-05-08-54-16-223_com.google.android.documentsui.jpg, sizeBytes: 260972} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009899, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-05-08-54-07-339_com.google.android.documentsui.jpg, sizeBytes: 258878} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009898, path: /storage/emulated/0/Pictures/insta360_official_weixin_1664952669207.jpg, sizeBytes: 50380} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009895, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0001.jpg, sizeBytes: 83686} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009892, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221005-WA0000.jpg, sizeBytes: 401118} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009884, path: /storage/emulated/0/DCIM/Camera/IMG_20221004_183638.jpg, sizeBytes: 5370143} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009882, path: /storage/emulated/0/DCIM/Camera/IMG_20221004_183543.jpg, sizeBytes: 3647530} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009880, path: /storage/emulated/0/DCIM/Camera/IMG_20221004_181307.jpg, sizeBytes: 5640745} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009877, path: /storage/emulated/0/DCIM/Camera/IMG_20221004_172920.jpg, sizeBytes: 6587792} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009857, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221003-WA0007.jpg, sizeBytes: 10679} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009854, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221003-WA0006.jpg, sizeBytes: 64635} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009852, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-03-20-13-15-048_com.huami.watch.hmwatchmanager.jpg, sizeBytes: 484880} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009849, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221003-WA0004.jpg, sizeBytes: 97068} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009812, path: /storage/emulated/0/DCIM/Camera/IMG_20221002_185655.jpg, sizeBytes: 2977988} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009794, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221002-WA0004.jpg, sizeBytes: 49210} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009791, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221002-WA0003.jpg, sizeBytes: 110618} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009788, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221002-WA0002.jpg, sizeBytes: 242222} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009782, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221002-WA0000.jpg, sizeBytes: 179055} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009767, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0068.jpg, sizeBytes: 160826} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009770, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0069.jpg, sizeBytes: 147737} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009773, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0070.jpg, sizeBytes: 268733} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 1088/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009761, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0066.jpg, sizeBytes: 243546} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009764, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0067.jpg, sizeBytes: 272951} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009755, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0064.jpg, sizeBytes: 236824} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009758, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0065.jpg, sizeBytes: 478915} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009743, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0060.jpg, sizeBytes: 420024} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009746, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0061.jpg, sizeBytes: 284401} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009749, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0062.jpg, sizeBytes: 210447} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009752, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0063.jpg, sizeBytes: 389056} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009737, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0058.jpg, sizeBytes: 316428} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009740, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0059.jpg, sizeBytes: 434185} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009734, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0057.jpg, sizeBytes: 264811} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009731, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0056.jpg, sizeBytes: 77365} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009722, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0053.jpg, sizeBytes: 246075} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009725, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0054.jpg, sizeBytes: 231572} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009719, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0052.jpg, sizeBytes: 218017} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009716, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0051.jpg, sizeBytes: 234747} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009708, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0048.jpg, sizeBytes: 438720} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009711, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0049.jpg, sizeBytes: 383405} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009705, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0047.jpg, sizeBytes: 260396} +I/TRuntime.CctTransportBackend(26629): Making request to: https://firebaselogging-pa.googleapis.com/v1/firelog/legacy/batchlog +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009699, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0045.jpg, sizeBytes: 262108} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009702, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0046.jpg, sizeBytes: 242647} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009690, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0042.jpg, sizeBytes: 247516} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009693, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0043.jpg, sizeBytes: 252444} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009696, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0044.jpg, sizeBytes: 244386} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009684, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0040.jpg, sizeBytes: 421078} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009687, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0041.jpg, sizeBytes: 433683} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009681, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0039.jpg, sizeBytes: 353885} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009645, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0027.jpg, sizeBytes: 168552} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009648, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0028.jpg, sizeBytes: 85472} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009641, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-10-01-12-26-43-727_com.arashivision.insta360akiko.jpg, sizeBytes: 501747} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009611, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0017.jpg, sizeBytes: 714656} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009608, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0016.jpg, sizeBytes: 607050} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009607, path: /storage/emulated/0/DCIM/Camera/PANO_20221001_101019.jpg, sizeBytes: 33795058} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009606, path: /storage/emulated/0/DCIM/Camera/PANO_20221001_100903.jpg, sizeBytes: 31636657} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009605, path: /storage/emulated/0/DCIM/Camera/PANO_20221001_100853.jpg, sizeBytes: 35559963} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009594, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0013.jpg, sizeBytes: 379911} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009562, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20221001-WA0002.jpg, sizeBytes: 136557} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009545, path: /storage/emulated/0/Pictures/insta360_official_weixin_1664566464837.jpg, sizeBytes: 50380} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009543, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220930-WA0004.jpg, sizeBytes: 67825} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009510, path: /storage/emulated/0/DCIM/Camera/IMG_20220930_143931.jpg, sizeBytes: 4430993} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009508, path: /storage/emulated/0/DCIM/Camera/IMG_20220930_143901.jpg, sizeBytes: 5380389} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009506, path: /storage/emulated/0/DCIM/Camera/IMG_20220930_143827.jpg, sizeBytes: 5488287} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009504, path: /storage/emulated/0/DCIM/Camera/IMG_20220930_143821.jpg, sizeBytes: 6007507} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009502, path: /storage/emulated/0/DCIM/Camera/IMG_20220930_143817.jpg, sizeBytes: 5581139} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009500, path: /storage/emulated/0/DCIM/Camera/IMG_20220930_143734.jpg, sizeBytes: 5484543} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009498, path: /storage/emulated/0/DCIM/Camera/IMG_20220930_134548.jpg, sizeBytes: 2369868} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009493, path: /storage/emulated/0/DCIM/Camera/IMG_20220930_083842.jpg, sizeBytes: 998424} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009491, path: /storage/emulated/0/DCIM/Camera/IMG_20220930_083819.jpg, sizeBytes: 2693023} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009466, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220929-WA0009.jpg, sizeBytes: 314555} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009463, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220929-WA0008.jpg, sizeBytes: 301806} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009442, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-29-12-12-45-830_com.google.android.googlequicksearchbox.jpg, sizeBytes: 420409} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009154, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0012.jpg, sizeBytes: 77173} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009152, path: /storage/emulated/0/DCIM/Creative/IMG_20220928_144848.jpg, sizeBytes: 180214} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009149, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220928-WA0010.jpg, sizeBytes: 76333} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009143, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0008.jpg, sizeBytes: 54745} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009140, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0007.jpg, sizeBytes: 81893} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009137, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0006.jpg, sizeBytes: 66433} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009134, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0005.jpg, sizeBytes: 150835} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009131, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0004.jpg, sizeBytes: 379628} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009128, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0003.jpg, sizeBytes: 208529} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009125, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220928-WA0002.jpg, sizeBytes: 103926} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009120, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-28-07-44-59-635_it.caitalia.apphub.jpg, sizeBytes: 325443} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009101, path: /storage/emulated/0/DCIM/Camera/IMG_20220927_192915.jpg, sizeBytes: 4234171} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009096, path: /storage/emulated/0/DCIM/Camera/IMG_20220927_181947.jpg, sizeBytes: 3641456} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009094, path: /storage/emulated/0/DCIM/Camera/IMG_20220927_171852.jpg, sizeBytes: 5155139} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009092, path: /storage/emulated/0/DCIM/Camera/IMG_20220927_171836.jpg, sizeBytes: 5699962} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009090, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220927-WA0016.jpeg, sizeBytes: 1243555} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/TRuntime.CctTransportBackend(26629): Status Code: 200 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009088, path: /storage/emulated/0/DCIM/Camera/IMG_20220927_171601.jpg, sizeBytes: 4054676} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009086, path: /storage/emulated/0/DCIM/Camera/IMG_20220927_171537.jpg, sizeBytes: 4502724} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009084, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-27-15-35-12-729_com.brytonsport.active.jpg, sizeBytes: 485155} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009080, path: /storage/emulated/0/DCIM/Camera/PANO_20220927_144303.jpg, sizeBytes: 24200909} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009077, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220927-WA0011.jpg, sizeBytes: 44345} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009074, path: /storage/emulated/0/DCIM/Camera/IMG_20220927_141228.jpg, sizeBytes: 4973876} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009072, path: /storage/emulated/0/DCIM/Camera/IMG_20220927_141150.jpg, sizeBytes: 6503266} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009067, path: /storage/emulated/0/DCIM/Camera/IMG_20220927_133832.jpg, sizeBytes: 2728258} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009065, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220927-WA0005.jpeg, sizeBytes: 1005669} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009063, path: /storage/emulated/0/DCIM/Camera/PANO_20220927_132514.jpg, sizeBytes: 27465059} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009062, path: /storage/emulated/0/DCIM/Camera/PANO_20220927_132214.jpg, sizeBytes: 36401975} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009061, path: /storage/emulated/0/DCIM/Camera/PANO_20220927_132209.jpg, sizeBytes: 17571362} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009060, path: /storage/emulated/0/DCIM/Camera/PANO_20220927_132158.jpg, sizeBytes: 26208576} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009048, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220927-WA0000.jpg, sizeBytes: 147855} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009035, path: /storage/emulated/0/DCIM/Camera/1664202377932.jpg, sizeBytes: 4245459} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009030, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220926-WA0004.jpg, sizeBytes: 64305} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009026, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-26-12-38-14-676_com.mi.globalbrowser.jpg, sizeBytes: 390750} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009025, path: /storage/emulated/0/DCIM/Camera/IMG_20220926_120403.jpg, sizeBytes: 4886532} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009024, path: /storage/emulated/0/DCIM/Camera/IMG_20220926_120030.jpg, sizeBytes: 380741} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000009005, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0012.jpg, sizeBytes: 81483} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008974, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0007.jpg, sizeBytes: 251491} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008965, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0004.jpg, sizeBytes: 207449} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008956, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0002.jpg, sizeBytes: 59433} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008953, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0001.jpg, sizeBytes: 154388} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008947, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220925-WA0000.jpg, sizeBytes: 86718} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008945, path: /storage/emulated/0/DCIM/Camera/IMG_20220925_085624.jpg, sizeBytes: 4338691} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008941, path: /storage/emulated/0/DCIM/Camera/IMG_20220925_085404.jpg, sizeBytes: 4448429} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008939, path: /storage/emulated/0/DCIM/Camera/IMG_20220925_084757.jpg, sizeBytes: 4416218} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008926, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220924-WA0008.jpg, sizeBytes: 49819} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008902, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220924-WA0002.jpg, sizeBytes: 109586} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 1184/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008899, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220924-WA0001.jpg, sizeBytes: 144474} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008896, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220924-WA0000.jpg, sizeBytes: 148439} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008877, path: /storage/emulated/0/DCIM/Camera/IMG_20220923_193005.jpg, sizeBytes: 2215028} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008875, path: /storage/emulated/0/DCIM/Camera/IMG_20220923_192959.jpg, sizeBytes: 2673939} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008873, path: /storage/emulated/0/DCIM/Camera/IMG_20220923_192922.jpg, sizeBytes: 5066184} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008871, path: /storage/emulated/0/DCIM/Camera/IMG_20220923_192914.jpg, sizeBytes: 5855215} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008869, path: /storage/emulated/0/DCIM/Camera/IMG_20220923_192854.jpg, sizeBytes: 5140011} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008867, path: /storage/emulated/0/DCIM/Camera/IMG_20220923_192833.jpg, sizeBytes: 4350257} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008719, path: /storage/emulated/0/DCIM/Camera/IMG_20220921_195153.jpg, sizeBytes: 1697726} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008673, path: /storage/emulated/0/DCIM/Camera/IMG_20220920_184315.jpg, sizeBytes: 3459940} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000008541, path: /storage/emulated/0/Pictures/my_stickers_images/IMG_20220919_095303.jpg, sizeBytes: 64947} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/webp, uri: content://media/external/images/media/1000000201, path: /storage/emulated/0/Pictures/my_stickers_images/sp_ayjluwu_z1663526402.webp, sizeBytes: 47438} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000000197, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220918-WA0020.jpg, sizeBytes: 306946} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64548, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0011.jpg, sizeBytes: 341822} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/webp, uri: content://media/external/images/media/1000000195, path: /storage/emulated/0/Pictures/my_stickers_images/sp_arnhqri_z1663526310.webp, sizeBytes: 46416} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): SqfliteLocalMediaDb saveMetadata complete in 33ms for 400 entries +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000000194, path: /storage/emulated/0/DCIM/Creative/IMG_20220918_203704.jpg, sizeBytes: 89127} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000000191, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220918-WA0018.jpg, sizeBytes: 174006} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/webp, uri: content://media/external/images/media/1000000189, path: /storage/emulated/0/Pictures/my_stickers_images/sp_arspfti_z1663525312.webp, sizeBytes: 45596} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000000162, path: /storage/emulated/0/DCIM/Camera/IMG_20220918_160816.jpg, sizeBytes: 4927543} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000000161, path: /storage/emulated/0/DCIM/Camera/IMG_20220918_160814.jpg, sizeBytes: 5176101} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000000160, path: /storage/emulated/0/DCIM/Creative/IMG_20220918_160520.jpg, sizeBytes: 1213807} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000000151, path: /storage/emulated/0/DCIM/Camera/IMG_20220918_150916.jpg, sizeBytes: 4800705} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000000149, path: /storage/emulated/0/DCIM/Camera/IMG_20220918_150912.jpg, sizeBytes: 5406584} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000000133, path: /storage/emulated/0/DCIM/Camera/IMG_20220918_112703.jpg, sizeBytes: 10030007} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000000131, path: /storage/emulated/0/DCIM/Camera/IMG_20220918_112701.jpg, sizeBytes: 9993662} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000000129, path: /storage/emulated/0/DCIM/Camera/IMG_20220918_112642.jpg, sizeBytes: 9864863} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000000021, path: /storage/emulated/0/DCIM/Camera/IMG_20220917_094537.jpg, sizeBytes: 2565544} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/1000000019, path: /storage/emulated/0/DCIM/Camera/IMG_20220917_094530.jpg, sizeBytes: 2170806} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68711, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220913-WA0012.jpg, sizeBytes: 218150} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68714, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220913-WA0013.jpg, sizeBytes: 79512} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68708, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220913-WA0011.jpg, sizeBytes: 180261} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68688, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-13-11-51-53-713_com.strava.jpg, sizeBytes: 796082} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68685, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220913-WA0003.jpg, sizeBytes: 139136} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68682, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-09-13-11-42-37-357_com.strava.jpg, sizeBytes: 801076} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68555, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0059.jpg, sizeBytes: 34200} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68551, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0057.jpg, sizeBytes: 33888} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68547, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0055.jpg, sizeBytes: 38713} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68543, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0053.jpg, sizeBytes: 25140} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68506, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0041.jpg, sizeBytes: 76818} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68509, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0042.jpg, sizeBytes: 100458} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68503, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0040.jpg, sizeBytes: 54004} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68500, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0039.jpg, sizeBytes: 370481} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68492, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0035.jpg, sizeBytes: 84200} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68496, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0037.jpg, sizeBytes: 68858} +W/d.t.a.c.c.MFH(26629): failed to read metadata by metadata-extractor for mimeType=image/jpeg uri=content://media/external/images/media/2694 +W/d.t.a.c.c.MFH(26629): com.drew.imaging.ImageProcessingException: File format could not be determined +W/d.t.a.c.c.MFH(26629): at com.drew.imaging.ImageMetadataReader.readMetadata(ImageMetadataReader.java:185) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.metadata.metadataextractor.Helper.safeRead(Helper.kt:89) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadataByMetadataExtractor(MetadataFetchHandler.kt:637) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadata(MetadataFetchHandler.kt:537) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.access$getCatalogMetadata(MetadataFetchHandler.kt:115) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.Coresult$Companion.safe(Coresult.kt:52) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2.invokeSuspend(MetadataFetchHandler.kt:121) +W/d.t.a.c.c.MFH(26629): at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:820) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704) +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68484, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0031.jpg, sizeBytes: 96462} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68488, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0033.jpg, sizeBytes: 102199} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68463, path: /storage/emulated/0/DCIM/Camera/IMG_20220911_101402.jpg, sizeBytes: 5323574} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68457, path: /storage/emulated/0/DCIM/Camera/IMG_20220911_100709.jpg, sizeBytes: 9934040} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68456, path: /storage/emulated/0/DCIM/Camera/IMG_20220911_100706.jpg, sizeBytes: 10075006} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68455, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0026.jpg, sizeBytes: 32992} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68444, path: /storage/emulated/0/DCIM/Camera/IMG_20220911_091644.jpg, sizeBytes: 5165350} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68442, path: /storage/emulated/0/DCIM/Camera/IMG_20220911_091641.jpg, sizeBytes: 5405839} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68440, path: /storage/emulated/0/DCIM/Camera/IMG_20220911_091525.jpg, sizeBytes: 1908222} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68438, path: /storage/emulated/0/DCIM/Camera/IMG_20220911_091518.jpg, sizeBytes: 2067999} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68435, path: /storage/emulated/0/DCIM/Camera/IMG_20220911_091509.jpg, sizeBytes: 2105916} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68433, path: /storage/emulated/0/DCIM/Camera/IMG_20220911_091506.jpg, sizeBytes: 2095243} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68432, path: /storage/emulated/0/DCIM/Camera/IMG_20220911_091501.jpg, sizeBytes: 2015282} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68087, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0032.jpg, sizeBytes: 602830} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68204, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0071.jpg, sizeBytes: 248772} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68240, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0083.jpg, sizeBytes: 449034} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68309, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0104.jpg, sizeBytes: 73252} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68360, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0116.jpg, sizeBytes: 87214} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68252, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0087.jpg, sizeBytes: 347794} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68420, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220911-WA0022.jpg, sizeBytes: 268928} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68367, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0119.jpg, sizeBytes: 91895} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68328, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0113.jpg, sizeBytes: 337625} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68325, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0112.jpg, sizeBytes: 243242} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68321, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0110.jpg, sizeBytes: 209633} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68316, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0108.jpg, sizeBytes: 36097} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68313, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0106.jpg, sizeBytes: 57533} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68305, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0102.jpg, sizeBytes: 59181} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68300, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0100.jpg, sizeBytes: 34910} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68261, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0090.jpg, sizeBytes: 218001} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68258, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0089.jpg, sizeBytes: 172733} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68255, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0088.jpg, sizeBytes: 430222} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68249, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0086.jpg, sizeBytes: 421159} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68246, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0085.jpg, sizeBytes: 476648} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68243, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0084.jpg, sizeBytes: 543670} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68237, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0082.jpg, sizeBytes: 354965} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68234, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0081.jpg, sizeBytes: 287932} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68231, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0080.jpg, sizeBytes: 470258} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68228, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0079.jpg, sizeBytes: 497040} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68225, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0078.jpg, sizeBytes: 422648} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68222, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0077.jpg, sizeBytes: 525628} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68219, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0076.jpg, sizeBytes: 552140} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68216, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0075.jpg, sizeBytes: 509908} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68213, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0074.jpg, sizeBytes: 240911} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68210, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0073.jpg, sizeBytes: 473311} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 1272/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68207, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0072.jpg, sizeBytes: 566704} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68200, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0069.jpg, sizeBytes: 69963} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68197, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0068.jpg, sizeBytes: 281738} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68194, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0067.jpg, sizeBytes: 274653} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68188, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0065.jpg, sizeBytes: 171620} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68185, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0064.jpg, sizeBytes: 271792} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68181, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0062.jpg, sizeBytes: 67679} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68175, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0060.jpg, sizeBytes: 61490} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68167, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0056.jpg, sizeBytes: 48548} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68170, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0058.jpg, sizeBytes: 50781} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68160, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0053.jpg, sizeBytes: 45721} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68150, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0051.jpg, sizeBytes: 81399} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68139, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0049.jpg, sizeBytes: 332074} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68135, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0047.jpg, sizeBytes: 26572} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68123, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0044.jpg, sizeBytes: 83295} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68120, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0043.jpg, sizeBytes: 507537} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68117, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0042.jpg, sizeBytes: 502020} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68114, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0041.jpg, sizeBytes: 561016} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68111, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0040.jpg, sizeBytes: 563386} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68108, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0039.jpg, sizeBytes: 602483} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68105, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0038.jpg, sizeBytes: 652457} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68102, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0037.jpg, sizeBytes: 669929} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68099, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0036.jpg, sizeBytes: 595224} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68096, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0035.jpg, sizeBytes: 561258} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68093, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0034.jpg, sizeBytes: 597732} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68090, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0033.jpg, sizeBytes: 646637} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68084, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0031.jpg, sizeBytes: 595393} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68081, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0030.jpg, sizeBytes: 572834} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68073, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0028.jpg, sizeBytes: 81148} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68066, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0027.jpg, sizeBytes: 327643} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68063, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0026.jpg, sizeBytes: 295555} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68060, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0025.jpg, sizeBytes: 282254} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68056, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0023.jpg, sizeBytes: 52380} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68053, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0022.jpg, sizeBytes: 74021} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68024, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0010.jpg, sizeBytes: 96960} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68028, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0012.jpg, sizeBytes: 82695} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68046, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0020.jpg, sizeBytes: 61980} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68036, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0016.jpg, sizeBytes: 70416} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68041, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0018.jpg, sizeBytes: 22437} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68033, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0014.jpg, sizeBytes: 85984} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68013, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0004.jpg, sizeBytes: 49452} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68016, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0006.jpg, sizeBytes: 47209} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68020, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0008.jpg, sizeBytes: 104156} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68004, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0001.jpg, sizeBytes: 48903} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68007, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0002.jpg, sizeBytes: 36199} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/68010, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220910-WA0003.jpg, sizeBytes: 59410} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67949, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0037.jpg, sizeBytes: 210831} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67946, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0036.jpg, sizeBytes: 267487} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67925, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0028.jpg, sizeBytes: 124821} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67922, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0027.jpg, sizeBytes: 97526} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67910, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0023.jpg, sizeBytes: 46274} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67885, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0015.jpg, sizeBytes: 203579} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67882, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220909-WA0014.jpg, sizeBytes: 187428} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67288, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220903-WA0010.jpg, sizeBytes: 308662} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67412, path: /storage/emulated/0/DCIM/Camera/IMG_20220904_113323.jpg, sizeBytes: 4387599} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67291, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220903-WA0011.jpg, sizeBytes: 278801} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67294, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220903-WA0012.jpg, sizeBytes: 310113} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67240, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220902-WA0013.jpg, sizeBytes: 235236} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67150, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220902-WA0000.jpeg, sizeBytes: 1278366} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67133, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220901-WA0007.jpg, sizeBytes: 329962} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67130, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220901-WA0006.jpg, sizeBytes: 326442} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67127, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220901-WA0005.jpg, sizeBytes: 418462} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/67050, path: /storage/emulated/0/DCIM/Camera/IMG_20220830_203602.jpg, sizeBytes: 5545670} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/66861, path: /storage/emulated/0/DCIM/Screenshots/IMG_20220826_173419.jpg, sizeBytes: 351691} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/66641, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220821-WA0004.jpg, sizeBytes: 158164} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/66644, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220821-WA0005.jpg, sizeBytes: 150216} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/66647, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220821-WA0006.jpg, sizeBytes: 145679} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/66638, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220821-WA0003.jpg, sizeBytes: 168830} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/66056, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220818-WA0005.jpg, sizeBytes: 198274} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/66029, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220818-WA0001.jpg, sizeBytes: 118438} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65942, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220815-WA0040.jpg, sizeBytes: 319624} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65939, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220815-WA0039.jpg, sizeBytes: 334672} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65772, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0033.jpg, sizeBytes: 101175} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65703, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0010.jpg, sizeBytes: 79131} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65697, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0008.jpg, sizeBytes: 77201} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65700, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0009.jpg, sizeBytes: 71876} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65691, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0006.jpg, sizeBytes: 79866} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65694, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220814-WA0007.jpg, sizeBytes: 115255} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65681, path: /storage/emulated/0/DCIM/Camera/IMG_20220814_122453.jpg, sizeBytes: 4763091} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65631, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-13-15-11-42-247_com.brytonsport.active.jpg, sizeBytes: 518897} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65623, path: /storage/emulated/0/DCIM/Camera/PANO_20220813_130822.jpg, sizeBytes: 30635896} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65621, path: /storage/emulated/0/DCIM/Camera/IMG_20220813_130811.jpg, sizeBytes: 7666894} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65618, path: /storage/emulated/0/DCIM/Camera/IMG_20220813_122646.jpg, sizeBytes: 2702424} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65617, path: /storage/emulated/0/DCIM/Camera/PANO_20220813_122635.jpg, sizeBytes: 8818024} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65615, path: /storage/emulated/0/DCIM/Camera/IMG_20220813_121124.jpg, sizeBytes: 7093971} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65612, path: /storage/emulated/0/DCIM/Camera/IMG_20220813_120053.jpg, sizeBytes: 3850048} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65610, path: /storage/emulated/0/DCIM/Camera/PANO_20220813_115149.jpg, sizeBytes: 30604067} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65608, path: /storage/emulated/0/DCIM/Camera/IMG_20220813_112422.jpg, sizeBytes: 12456026} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65607, path: /storage/emulated/0/DCIM/Camera/PANO_20220813_112343.jpg, sizeBytes: 29941622} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65605, path: /storage/emulated/0/DCIM/Camera/IMG_20220813_112319.jpg, sizeBytes: 5734843} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 1363/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65603, path: /storage/emulated/0/DCIM/Camera/IMG_20220813_112123.jpg, sizeBytes: 10462742} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65600, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220813-WA0006.jpg, sizeBytes: 144017} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65598, path: /storage/emulated/0/DCIM/Camera/IMG_20220813_101616.jpg, sizeBytes: 2443491} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65596, path: /storage/emulated/0/DCIM/Camera/IMG_20220813_101554.jpg, sizeBytes: 9377681} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65587, path: /storage/emulated/0/DCIM/Camera/PANO_20220813_095418.jpg, sizeBytes: 29569132} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65580, path: /storage/emulated/0/DCIM/Camera/IMG_20220813_083934.jpg, sizeBytes: 8722462} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65577, path: /storage/emulated/0/DCIM/Camera/IMG_20220813_083349.jpg, sizeBytes: 7331172} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65566, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220812-WA0011.jpg, sizeBytes: 264181} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65482, path: /storage/emulated/0/DCIM/Camera/IMG_20220811_173908.jpg, sizeBytes: 2812132} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65445, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-11-11-00-35-707_de.komoot.android.jpg, sizeBytes: 809898} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65325, path: /storage/emulated/0/DCIM/Camera/IMG_20220809_192936.jpg, sizeBytes: 4214473} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65242, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220808-WA0013.jpg, sizeBytes: 57094} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65231, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220808-WA0010.jpg, sizeBytes: 537190} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65213, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220808-WA0002.jpg, sizeBytes: 54807} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65188, path: /storage/emulated/0/DCIM/Camera/IMG_20220807_195532.jpg, sizeBytes: 4020584} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65186, path: /storage/emulated/0/DCIM/Camera/IMG_20220807_184711.jpg, sizeBytes: 4938602} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65183, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220807-WA0010.jpg, sizeBytes: 74448} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65171, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220807-WA0006.jpg, sizeBytes: 211109} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65119, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220806-WA0070.jpg, sizeBytes: 26787} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65116, path: /storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_205718.jpg, sizeBytes: 209275} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65114, path: /storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_205520.jpg, sizeBytes: 187666} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65112, path: /storage/emulated/0/DCIM/Camera/IMG_20220806_200909.jpg, sizeBytes: 5432680} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65110, path: /storage/emulated/0/DCIM/Camera/IMG_20220806_200903.jpg, sizeBytes: 5461245} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65074, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659803997289.jpg, sizeBytes: 260104} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65073, path: /storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_183758.jpg, sizeBytes: 252797} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65071, path: /storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_183524.jpg, sizeBytes: 502373} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65070, path: /storage/emulated/0/DCIM/GoPro-Exports/IMG_20220806_183433.jpg, sizeBytes: 235635} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65065, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659803278076.jpg, sizeBytes: 233213} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65060, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659803202400.jpg, sizeBytes: 208335} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65059, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659803180304.jpg, sizeBytes: 237923} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65058, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659803156553.jpg, sizeBytes: 230439} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65057, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659803142382.jpg, sizeBytes: 214629} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65056, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659803133394.jpg, sizeBytes: 206446} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65055, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659803089637.jpg, sizeBytes: 236453} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65054, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659803075094.jpg, sizeBytes: 221905} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65053, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659803065132.jpg, sizeBytes: 185377} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65052, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659803049397.jpg, sizeBytes: 200023} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65051, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659803017449.jpg, sizeBytes: 239186} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65050, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802928948.jpg, sizeBytes: 197828} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65049, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802895515.jpg, sizeBytes: 257717} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65048, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802878320.jpg, sizeBytes: 232179} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65047, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802854254.jpg, sizeBytes: 242638} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65046, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802792419.jpg, sizeBytes: 250515} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65045, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802774233.jpg, sizeBytes: 254426} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65044, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802760807.jpg, sizeBytes: 227792} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65043, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802742718.jpg, sizeBytes: 228522} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65042, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802673097.jpg, sizeBytes: 247042} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65041, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802598338.jpg, sizeBytes: 211428} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65040, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802490053.jpg, sizeBytes: 225672} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65039, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802401681.jpg, sizeBytes: 265130} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65038, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802359461.jpg, sizeBytes: 268561} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65037, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802313187.jpg, sizeBytes: 259866} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65036, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802271415.jpg, sizeBytes: 257983} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65035, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802218131.jpg, sizeBytes: 257076} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65034, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802183156.jpg, sizeBytes: 245102} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/65033, path: /storage/emulated/0/DCIM/GoPro-Exports/64932_1659802138784.jpg, sizeBytes: 205522} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64936, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220806-WA0002.jpg, sizeBytes: 40501} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64894, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220805-WA0003.jpg, sizeBytes: 14201} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64819, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220804-WA0016.jpg, sizeBytes: 278372} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64814, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220804-WA0014.jpg, sizeBytes: 103477} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64808, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220804-WA0012.jpg, sizeBytes: 239602} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64765, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220804-WA0000.jpg, sizeBytes: 84939} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64755, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220803-WA0010.jpg, sizeBytes: 141015} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64743, path: /storage/emulated/0/DCIM/Screenshots/IMG_20220803_163733.jpg, sizeBytes: 274309} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64736, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220803-WA0005.jpg, sizeBytes: 58820} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64722, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220803-WA0001.jpg, sizeBytes: 167981} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64715, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220803-WA0000.jpg, sizeBytes: 138623} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64698, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-02-15-15-28-283_it.subito.jpg, sizeBytes: 453944} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64691, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-02-12-09-32-492_it.subito.jpg, sizeBytes: 587852} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64689, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-02-12-09-12-808_it.subito.jpg, sizeBytes: 552853} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64682, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220802-WA0002.jpg, sizeBytes: 137277} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64680, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-08-02-08-55-44-581_com.whatsapp.jpg, sizeBytes: 728107} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64654, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1659383396599.jpg, sizeBytes: 71124} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64653, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1659383367309.jpg, sizeBytes: 69144} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64652, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1659383340679.jpg, sizeBytes: 69450} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64651, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1659383329248.jpg, sizeBytes: 71040} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64649, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1659383276845.jpg, sizeBytes: 54014} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64648, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1659383271090.jpg, sizeBytes: 73323} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64626, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220801-WA0016.jpg, sizeBytes: 197459} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64561, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220801-WA0000.jpg, sizeBytes: 130388} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64554, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0013.jpg, sizeBytes: 75671} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64551, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0012.jpg, sizeBytes: 364575} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64546, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0010.jpg, sizeBytes: 31412} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64528, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220731-WA0006.jpg, sizeBytes: 240908} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64500, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0025.jpg, sizeBytes: 582569} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64497, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0024.jpg, sizeBytes: 280082} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64487, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0021.jpg, sizeBytes: 125716} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64482, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0019.jpg, sizeBytes: 45177} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64485, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0020.jpg, sizeBytes: 290214} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64453, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0010.jpg, sizeBytes: 229268} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64446, path: /storage/emulated/0/DCIM/Camera/IMG_20220730_140807.jpg, sizeBytes: 5542340} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64444, path: /storage/emulated/0/DCIM/Camera/IMG_20220730_140449.jpg, sizeBytes: 4634389} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64438, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220730-WA0005.jpg, sizeBytes: 427858} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64356, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0026.jpg, sizeBytes: 106523} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64350, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0024.jpg, sizeBytes: 324717} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64353, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0025.jpg, sizeBytes: 146034} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64341, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0021.jpg, sizeBytes: 109032} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64334, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0018.jpg, sizeBytes: 197522} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64331, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0017.jpg, sizeBytes: 292588} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64315, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0013.jpg, sizeBytes: 180259} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64318, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0014.jpg, sizeBytes: 191323} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64312, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0012.jpg, sizeBytes: 204969} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64309, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0011.jpg, sizeBytes: 184782} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64306, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0010.jpg, sizeBytes: 178501} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 1466/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64303, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0009.jpg, sizeBytes: 180893} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64300, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0008.jpg, sizeBytes: 339210} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64296, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0007.jpg, sizeBytes: 359811} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64293, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220729-WA0006.jpg, sizeBytes: 415853} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64267, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220728-WA0007.jpg, sizeBytes: 252039} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64254, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220728-WA0004.jpg, sizeBytes: 123217} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64246, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220728-WA0003.jpg, sizeBytes: 89435} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64226, path: /storage/emulated/0/DCIM/Screenshots/IMG_20220727_231710.jpg, sizeBytes: 262600} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64222, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0010.jpg, sizeBytes: 77153} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64214, path: /storage/emulated/0/DCIM/Camera/IMG_20220727_203350.jpg, sizeBytes: 6111730} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64215, path: /storage/emulated/0/DCIM/Camera/IMG_20220727_203351.jpg, sizeBytes: 6082607} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64212, path: /storage/emulated/0/DCIM/Camera/IMG_20220727_203259.jpg, sizeBytes: 6691261} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64210, path: /storage/emulated/0/DCIM/Camera/IMG_20220727_195811.jpg, sizeBytes: 7095072} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64208, path: /storage/emulated/0/DCIM/Camera/IMG_20220727_195759.jpg, sizeBytes: 2655734} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64206, path: /storage/emulated/0/DCIM/Camera/IMG_20220727_195704.jpg, sizeBytes: 6054986} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64195, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0006.jpg, sizeBytes: 313592} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64192, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0005.jpg, sizeBytes: 396309} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64189, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0004.jpg, sizeBytes: 456721} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64186, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0003.jpg, sizeBytes: 64166} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64183, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220727-WA0002.jpg, sizeBytes: 66473} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64144, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-26-07-59-40-201_com.instagram.android.jpg, sizeBytes: 1350009} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64143, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-26-07-45-45-793_com.instagram.android.jpg, sizeBytes: 1029225} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64123, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220725-WA0005.jpg, sizeBytes: 87314} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64120, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220725-WA0004.jpg, sizeBytes: 160664} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64109, path: /storage/emulated/0/DCIM/Camera/IMG_20220725_123424.jpg, sizeBytes: 5373135} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64101, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220725-WA0001.jpg, sizeBytes: 380625} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64098, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220725-WA0000.jpg, sizeBytes: 276398} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64085, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220724-WA0008.jpg, sizeBytes: 364292} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64082, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220724-WA0007.jpg, sizeBytes: 86390} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64061, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220724-WA0000.jpg, sizeBytes: 227199} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64053, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220723-WA0011.jpg, sizeBytes: 169018} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64050, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220723-WA0010.jpg, sizeBytes: 117123} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64032, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-23-16-09-36-988_io.homeassistant.companion.android.jpg, sizeBytes: 176704} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64031, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-23-16-09-01-912_io.homeassistant.companion.android.jpg, sizeBytes: 188383} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64029, path: /storage/emulated/0/DCIM/Screenshots/IMG_20220723_141411.jpg, sizeBytes: 50764} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64028, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-23-14-13-34-769_io.homeassistant.companion.android.jpg, sizeBytes: 268081} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64025, path: /storage/emulated/0/DCIM/Screenshots/IMG_20220723_130403.jpg, sizeBytes: 488716} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64019, path: /storage/emulated/0/DCIM/Camera/IMG_20220723_093620.jpg, sizeBytes: 4970479} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64017, path: /storage/emulated/0/DCIM/Camera/IMG_20220723_093617.jpg, sizeBytes: 5055250} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64015, path: /storage/emulated/0/DCIM/Camera/IMG_20220723_093603.jpg, sizeBytes: 4513383} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64013, path: /storage/emulated/0/DCIM/Camera/IMG_20220723_093555.jpg, sizeBytes: 6642269} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64011, path: /storage/emulated/0/DCIM/Camera/IMG_20220723_093551.jpg, sizeBytes: 6880092} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/64001, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0008.jpg, sizeBytes: 228397} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63999, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-22-15-13-01-212_com.android.chrome.jpg, sizeBytes: 681311} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63996, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0006.jpg, sizeBytes: 172558} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63993, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0005.jpg, sizeBytes: 529892} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63984, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0004.jpg, sizeBytes: 186105} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63969, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220722-WA0002.jpg, sizeBytes: 173133} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63953, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220721-WA0013.jpeg, sizeBytes: 1074058} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63921, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-21-15-34-56-433_com.brightstripe.parcels.jpg, sizeBytes: 416845} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63893, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220721-WA0005.jpg, sizeBytes: 162565} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63891, path: /storage/emulated/0/DCIM/Camera/IMG_20220721_134452.jpg, sizeBytes: 4551011} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63886, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220721-WA0003.jpg, sizeBytes: 139480} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +W/d.t.a.c.c.MFH(26629): failed to read metadata by metadata-extractor for mimeType=image/jpeg uri=content://media/external/images/media/6575 +W/d.t.a.c.c.MFH(26629): com.drew.imaging.ImageProcessingException: File format could not be determined +W/d.t.a.c.c.MFH(26629): at com.drew.imaging.ImageMetadataReader.readMetadata(ImageMetadataReader.java:185) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.metadata.metadataextractor.Helper.safeRead(Helper.kt:89) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadataByMetadataExtractor(MetadataFetchHandler.kt:637) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadata(MetadataFetchHandler.kt:537) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.access$getCatalogMetadata(MetadataFetchHandler.kt:115) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.Coresult$Companion.safe(Coresult.kt:52) +W/d.t.a.c.c.MFH(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2.invokeSuspend(MetadataFetchHandler.kt:121) +W/d.t.a.c.c.MFH(26629): at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:820) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717) +W/d.t.a.c.c.MFH(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63880, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220721-WA0002.jpg, sizeBytes: 176041} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63872, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-21-09-27-07-109_com.google.android.apps.messaging.jpg, sizeBytes: 408504} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63864, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-20-21-06-07-538_lockscreen.jpg, sizeBytes: 494029} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63708, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220718-WA0000.jpg, sizeBytes: 223530} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63861, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0007.jpg, sizeBytes: 114783} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63855, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0006.jpg, sizeBytes: 40931} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63853, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220218-WA0005.jpg, sizeBytes: 74087} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63850, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0005.jpg, sizeBytes: 128767} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63847, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0004.jpg, sizeBytes: 228116} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63816, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0002.jpg, sizeBytes: 49788} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63795, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220720-WA0000.jpg, sizeBytes: 74543} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63787, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-19-11-18-39-818_com.whatsapp.jpg, sizeBytes: 701656} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63785, path: /storage/emulated/0/DCIM/Screenshots/IMG_20220719_111659.jpg, sizeBytes: 142592} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63779, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-19-09-55-44-155_it.subito.jpg, sizeBytes: 410537} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63768, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-19-09-29-50-754_com.google.android.gm.jpg, sizeBytes: 369026} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63752, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220718-WA0009.jpg, sizeBytes: 325107} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63739, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-18-20-18-52-236_com.facebook.katana.jpg, sizeBytes: 781284} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63690, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-17-10-52-20-354_com.dopa.android.blevo.jpg, sizeBytes: 452704} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63619, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0010.jpg, sizeBytes: 119407} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63616, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0009.jpg, sizeBytes: 113780} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63610, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0007.jpg, sizeBytes: 429108} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63613, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0008.jpg, sizeBytes: 431554} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63604, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0005.jpg, sizeBytes: 426303} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63607, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0006.jpg, sizeBytes: 433873} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63601, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0004.jpg, sizeBytes: 430588} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63595, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0002.jpg, sizeBytes: 404374} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63598, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0003.jpg, sizeBytes: 227828} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63592, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220716-WA0001.jpg, sizeBytes: 368394} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63590, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-16-09-27-20-603_com.android.chrome.jpg, sizeBytes: 738100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63580, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220715-WA0009.jpg, sizeBytes: 345017} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63558, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220715-WA0003.jpg, sizeBytes: 66398} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63552, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220715-WA0000.jpg, sizeBytes: 120583} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63542, path: /storage/emulated/0/DCIM/Screenshots/IMG_20220714_232212.jpg, sizeBytes: 228685} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63541, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-14-23-21-35-283_com.strava.jpg, sizeBytes: 654507} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63521, path: /storage/emulated/0/DCIM/Camera/IMG_20220714_204209.jpg, sizeBytes: 3482352} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63519, path: /storage/emulated/0/DCIM/Camera/IMG_20220714_204203.jpg, sizeBytes: 3390532} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63508, path: /storage/emulated/0/DCIM/Camera/IMG_20220714_185609.jpg, sizeBytes: 4935049} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63504, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0008.jpg, sizeBytes: 168195} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63502, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-14-16-48-23-243_com.whatsapp.jpg, sizeBytes: 785767} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 1558/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63497, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0006.jpg, sizeBytes: 318125} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63494, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0005.jpg, sizeBytes: 206271} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63491, path: /storage/emulated/0/DCIM/Camera/IMG_20220714_125043.jpg, sizeBytes: 4571221} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63488, path: /storage/emulated/0/DCIM/Camera/IMG_20220714_123009.jpg, sizeBytes: 4332548} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63482, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0001.jpg, sizeBytes: 92539} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63485, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0002.jpg, sizeBytes: 86875} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63479, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220714-WA0000.jpg, sizeBytes: 163807} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63466, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0018.jpg, sizeBytes: 165258} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63461, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0016.jpg, sizeBytes: 84478} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63448, path: /storage/emulated/0/DCIM/Camera/IMG_20220713_182705.jpg, sizeBytes: 5185367} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63441, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-13-16-25-35-102_com.whatsapp.jpg, sizeBytes: 898523} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63435, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0009.jpg, sizeBytes: 300698} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63421, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0002.jpg, sizeBytes: 210884} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63418, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0001.jpg, sizeBytes: 270642} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63406, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220713-WA0000.jpg, sizeBytes: 167382} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63396, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220712-WA0008.jpg, sizeBytes: 362107} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63383, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220712-WA0006.jpg, sizeBytes: 413373} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63349, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220711-WA0003.jpg, sizeBytes: 78347} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63343, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220711-WA0000.jpg, sizeBytes: 89692} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63332, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220710-WA0042.jpg, sizeBytes: 46139} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63330, path: /storage/emulated/0/DCIM/Camera/IMG_20220710_160725.jpg, sizeBytes: 2430478} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63328, path: /storage/emulated/0/DCIM/Camera/IMG_20220710_152656.jpg, sizeBytes: 4775694} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63325, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0041.jpg, sizeBytes: 175808} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63313, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0036.jpg, sizeBytes: 807045} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63310, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0035.jpg, sizeBytes: 759851} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63307, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0034.jpg, sizeBytes: 700811} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63301, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0032.jpg, sizeBytes: 491818} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63304, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0033.jpg, sizeBytes: 251534} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63298, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0031.jpg, sizeBytes: 660021} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63292, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0029.jpg, sizeBytes: 393126} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63295, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0030.jpg, sizeBytes: 723412} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63289, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0028.jpg, sizeBytes: 179176} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63286, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0027.jpg, sizeBytes: 367718} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63277, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0024.jpg, sizeBytes: 219244} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63280, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0025.jpg, sizeBytes: 237428} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63283, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0026.jpg, sizeBytes: 419492} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63271, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0022.jpg, sizeBytes: 381988} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63274, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0023.jpg, sizeBytes: 161506} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63268, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0021.jpg, sizeBytes: 213725} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63261, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0019.jpg, sizeBytes: 346579} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63258, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0018.jpg, sizeBytes: 400237} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): SqfliteLocalMediaDb saveMetadata complete in 26ms for 400 entries +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63252, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0016.jpg, sizeBytes: 358171} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63255, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0017.jpg, sizeBytes: 462910} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63249, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0015.jpg, sizeBytes: 314818} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63246, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0014.jpg, sizeBytes: 297397} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63243, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0013.jpg, sizeBytes: 852877} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63240, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0012.jpg, sizeBytes: 597255} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63234, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0010.jpg, sizeBytes: 690395} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63237, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0011.jpg, sizeBytes: 584181} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63231, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0009.jpg, sizeBytes: 646909} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63228, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0008.jpg, sizeBytes: 669504} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63225, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220710-WA0007.jpg, sizeBytes: 333534} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63176, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220709-WA0000.jpg, sizeBytes: 259968} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63167, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-08-22-30-37-842_com.google.android.gm.jpg, sizeBytes: 377328} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63164, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220708-WA0004.jpg, sizeBytes: 102071} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63161, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220708-WA0003.jpg, sizeBytes: 65583} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63150, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-08-14-23-00-679_com.google.android.gm.jpg, sizeBytes: 337318} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63106, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0007.jpg, sizeBytes: 173956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63096, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0005.jpg, sizeBytes: 82110} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63084, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0003.jpg, sizeBytes: 571201} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63081, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0002.jpg, sizeBytes: 207176} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63078, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0001.jpg, sizeBytes: 301900} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63075, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220707-WA0000.jpg, sizeBytes: 124368} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63069, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220706-WA0021.jpg, sizeBytes: 127459} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63046, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220706-WA0014.jpg, sizeBytes: 63078} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63023, path: /storage/emulated/0/DCIM/Screenshots/IMG_20220706_145016.jpg, sizeBytes: 361982} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/63020, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-06-14-48-52-324_com.google.android.gm.jpg, sizeBytes: 298987} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62982, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220705-WA0006.jpg, sizeBytes: 128240} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62979, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220705-WA0005.jpg, sizeBytes: 129928} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62976, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220705-WA0004.jpg, sizeBytes: 67677} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62970, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220705-WA0003.jpg, sizeBytes: 80631} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62940, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220704-WA0006.jpg, sizeBytes: 689259} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62921, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220704-WA0000.jpg, sizeBytes: 60959} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62917, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-04-09-12-29-636_lockscreen.jpg, sizeBytes: 805073} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62907, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220703-WA0016.jpg, sizeBytes: 648210} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62868, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220703-WA0003.jpg, sizeBytes: 85497} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62858, path: /storage/emulated/0/DCIM/Camera/IMG_20220703_113004.jpg, sizeBytes: 4154051} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62848, path: /storage/emulated/0/DCIM/Camera/IMG_20220702_210527.jpg, sizeBytes: 4905148} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62845, path: /storage/emulated/0/DCIM/Camera/IMG_20220702_210253.jpg, sizeBytes: 5228053} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62812, path: /storage/emulated/0/Download/Soduto/1656768165956.jpg, sizeBytes: 4539056} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/62811, path: /storage/emulated/0/Download/Soduto/greg diploma 2.png, sizeBytes: 2102678} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62810, path: /storage/emulated/0/Download/Soduto/1656763946908.jpg, sizeBytes: 313422} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62803, path: /storage/emulated/0/DCIM/Camera/IMG_20220702_135617.jpg, sizeBytes: 317969} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62800, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220702-WA0003.jpg, sizeBytes: 106819} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62798, path: /storage/emulated/0/DCIM/Camera/IMG_20220702_111917.jpg, sizeBytes: 3290399} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62794, path: /storage/emulated/0/DCIM/Camera/IMG_20220702_111131.jpg, sizeBytes: 3882924} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62793, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220702-WA0002.jpg, sizeBytes: 330845} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62790, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220702-WA0001.jpg, sizeBytes: 781474} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 1646/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62770, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-07-01-19-26-35-778_com.android.chrome.jpg, sizeBytes: 679381} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62769, path: /storage/emulated/0/DCIM/Creative/IMG_20220701_190239.jpg, sizeBytes: 535389} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62728, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220630-WA0004.jpg, sizeBytes: 124538} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62351, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220625-WA0000.jpg, sizeBytes: 193423} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62334, path: /storage/emulated/0/DCIM/GoPro-Exports/IMG_20220624_192804.jpg, sizeBytes: 476162} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62333, path: /storage/emulated/0/DCIM/GoPro-Exports/IMG_20220624_192520.jpg, sizeBytes: 432709} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62332, path: /storage/emulated/0/DCIM/GoPro-Exports/IMG_20220624_192415.jpg, sizeBytes: 789838} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62331, path: /storage/emulated/0/DCIM/GoPro-Exports/G0070646_1656090860527.jpg, sizeBytes: 423019} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62329, path: /storage/emulated/0/DCIM/GoPro-Exports/IMG_20220624_190120.jpg, sizeBytes: 2061851} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62246, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0008.jpg, sizeBytes: 427050} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62273, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0014.jpg, sizeBytes: 452470} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62267, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0012.jpg, sizeBytes: 433984} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62270, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0013.jpg, sizeBytes: 439929} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62264, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0011.jpg, sizeBytes: 465347} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62261, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0010.jpg, sizeBytes: 449187} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62243, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0007.jpg, sizeBytes: 353627} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62240, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220624-WA0006.jpg, sizeBytes: 400098} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62154, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0027.jpg, sizeBytes: 274332} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62147, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0025.jpg, sizeBytes: 514855} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62144, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0024.jpg, sizeBytes: 241535} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62109, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0019.jpg, sizeBytes: 119040} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62104, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0018.jpg, sizeBytes: 123463} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62054, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0010.jpg, sizeBytes: 132546} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/62051, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0009.jpg, sizeBytes: 359319} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61998, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220623-WA0002.jpg, sizeBytes: 232979} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61944, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220621-WA0008.jpg, sizeBytes: 289515} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61848, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220621-WA0002.jpg, sizeBytes: 94273} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61721, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220619-WA0026.jpg, sizeBytes: 277732} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61718, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220619-WA0025.jpg, sizeBytes: 176855} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61681, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220619-WA0009.jpg, sizeBytes: 288164} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61676, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220619-WA0007.jpg, sizeBytes: 389489} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61673, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220619-WA0006.jpg, sizeBytes: 276899} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61625, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220619-WA0000.jpg, sizeBytes: 516584} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61585, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0032.jpg, sizeBytes: 386116} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61588, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0033.jpg, sizeBytes: 308992} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61591, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0034.jpg, sizeBytes: 355413} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61579, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0030.jpg, sizeBytes: 332780} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61582, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0031.jpg, sizeBytes: 331155} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61594, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0035.jpg, sizeBytes: 351278} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61524, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0013.jpg, sizeBytes: 231059} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61488, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220618-WA0002.jpg, sizeBytes: 87378} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61471, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0021.jpg, sizeBytes: 217484} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61468, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0020.jpg, sizeBytes: 246258} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61465, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0019.jpg, sizeBytes: 136121} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61464, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0018.jpg, sizeBytes: 237681} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61458, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0016.jpg, sizeBytes: 129013} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61455, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0015.jpg, sizeBytes: 244987} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61449, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0013.jpg, sizeBytes: 171832} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61452, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0014.jpg, sizeBytes: 175244} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61442, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0011.jpg, sizeBytes: 46041} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61439, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220617-WA0010.jpg, sizeBytes: 189340} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61297, path: /storage/emulated/0/DCIM/GoPro-Exports/G0040555_1655467634509_2.JPG, sizeBytes: 2377689} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61295, path: /storage/emulated/0/DCIM/GoPro-Exports/IMG_20220617_150655.jpg, sizeBytes: 3957577} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61294, path: /storage/emulated/0/DCIM/GoPro-Exports/IMG_20220617_150442.jpg, sizeBytes: 3884808} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61293, path: /storage/emulated/0/DCIM/GoPro-Exports/IMG_20220617_150336.jpg, sizeBytes: 4158657} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61292, path: /storage/emulated/0/DCIM/GoPro-Exports/G0040555_1655467634509.JPG, sizeBytes: 2377689} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61289, path: /storage/emulated/0/DCIM/GoPro-Exports/G0040551_1655467634509.JPG, sizeBytes: 2327671} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61244, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0012.jpg, sizeBytes: 405354} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61241, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0011.jpg, sizeBytes: 413807} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61238, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0010.jpg, sizeBytes: 424635} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61235, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0009.jpg, sizeBytes: 420395} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61232, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0008.jpg, sizeBytes: 303016} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61229, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0007.jpg, sizeBytes: 379397} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61226, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0006.jpg, sizeBytes: 405977} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61220, path: /storage/emulated/0/DCIM/Camera/IMG_20220616_150201.jpg, sizeBytes: 3866827} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61217, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0004.jpg, sizeBytes: 101194} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61214, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220616-WA0003.jpg, sizeBytes: 135104} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61178, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220615-WA0105.jpg, sizeBytes: 53299} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61176, path: /storage/emulated/0/DCIM/Camera/IMG_20220615_202546.jpg, sizeBytes: 6224167} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61162, path: /storage/emulated/0/DCIM/Camera/IMG_20220615_192417.jpg, sizeBytes: 4198440} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61160, path: /storage/emulated/0/DCIM/Camera/IMG_20220615_192410.jpg, sizeBytes: 4271626} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61158, path: /storage/emulated/0/DCIM/Camera/IMG_20220615_192236.jpg, sizeBytes: 5796562} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/61156, path: /storage/emulated/0/DCIM/Camera/IMG_20220615_192233.jpg, sizeBytes: 5809399} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60596, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0057.jpg, sizeBytes: 127568} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60599, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0058.jpg, sizeBytes: 124780} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60888, path: /storage/emulated/0/Download/InsMate/profile_42403120_1176292779190197_5464748050482200576_n.jpg, sizeBytes: 5082} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60889, path: /storage/emulated/0/Download/InsMate/cover_286287402_169236282177023_8220648733451645970_n.jpg, sizeBytes: 41871} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60885, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220615-WA0016.jpg, sizeBytes: 149007} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60880, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-15-12-39-09-254_com.ilmeteo.android.ilmeteo.jpg, sizeBytes: 881234} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60848, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220615-WA0003.jpg, sizeBytes: 155200} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60844, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220615-WA0001.jpg, sizeBytes: 159597} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60842, path: /storage/emulated/0/DCIM/Screenshots/IMG_20220615_082301.jpg, sizeBytes: 379915} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60816, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0062.jpg, sizeBytes: 122212} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60684, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0018.jpg, sizeBytes: 73852} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60682, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0017.jpg, sizeBytes: 22548} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60675, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0015.jpg, sizeBytes: 894067} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60669, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-14-16-25-50-730_com.mi.globalbrowser.jpg, sizeBytes: 1268243} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60658, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0008.jpg, sizeBytes: 115691} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60656, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-14-14-03-44-739_com.ilmeteo.android.ilmeteo.jpg, sizeBytes: 1005604} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000018529 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 199 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60653, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-14-14-02-55-494_com.ilmeteo.android.ilmeteo.jpg, sizeBytes: 1019494} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60650, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0005.jpg, sizeBytes: 111342} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60643, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0003.jpg, sizeBytes: 120724} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 1738/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60640, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220614-WA0002.jpg, sizeBytes: 191818} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60639, path: /storage/emulated/0/DCIM/Screenshots/IMG_20220614_082140.jpg, sizeBytes: 482494} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60586, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0055.jpg, sizeBytes: 12953} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60523, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0037.jpg, sizeBytes: 259838} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60520, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0036.jpg, sizeBytes: 280548} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60505, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0032.jpg, sizeBytes: 254770} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60496, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0029.jpg, sizeBytes: 311601} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60499, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0030.jpg, sizeBytes: 277853} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60502, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0031.jpg, sizeBytes: 243271} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60493, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0028.jpg, sizeBytes: 351030} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60486, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0026.jpg, sizeBytes: 271437} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60477, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0023.jpg, sizeBytes: 275708} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60480, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0024.jpg, sizeBytes: 275433} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60483, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0025.jpg, sizeBytes: 285767} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60468, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0020.jpg, sizeBytes: 273543} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60471, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0021.jpg, sizeBytes: 300431} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60474, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0022.jpg, sizeBytes: 308966} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60459, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0017.jpg, sizeBytes: 262803} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60462, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0018.jpg, sizeBytes: 315037} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60465, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0019.jpg, sizeBytes: 284329} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60452, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0015.jpg, sizeBytes: 279791} +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/1000018529, mimeType=video/mp4, size=122129847 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/1000018529 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000018528 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 215 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017577 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 222 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017576 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 224 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017571 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 232 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/1000017571, mimeType=video/mp4, size=423510599 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/1000017571 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60446, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0013.jpg, sizeBytes: 301234} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60449, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0014.jpg, sizeBytes: 333123} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60443, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0012.jpg, sizeBytes: 292650} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60436, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-13-13-54-39-970_com.whatsapp.jpg, sizeBytes: 877524} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60430, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0008.jpg, sizeBytes: 71305} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60394, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220612-WA0006.jpg, sizeBytes: 175795} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60401, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0002.jpg, sizeBytes: 317227} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60403, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0003.jpg, sizeBytes: 384617} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60405, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0004.jpg, sizeBytes: 482298} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60397, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220613-WA0007.jpg, sizeBytes: 173562} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60376, path: /storage/emulated/0/DCIM/Camera/IMG_20220612_134626.jpg, sizeBytes: 4680280} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60375, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-12-13-00-10-850_com.instagram.android.jpg, sizeBytes: 1020560} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60374, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-12-12-59-18-222_com.shazam.android.jpg, sizeBytes: 818294} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60370, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220612-WA0002.jpg, sizeBytes: 36322} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60368, path: /storage/emulated/0/DCIM/Camera/IMG_20220612_123046.jpg, sizeBytes: 5129811} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60366, path: /storage/emulated/0/DCIM/Camera/IMG_20220612_114855.jpg, sizeBytes: 5302932} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60363, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220612-WA0001.jpg, sizeBytes: 196756} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60361, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220612-WA0000.jpg, sizeBytes: 106302} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60353, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-11-18-25-23-269_com.google.android.apps.maps.jpg, sizeBytes: 972485} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60336, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-11-14-59-25-713_com.huami.watch.hmwatchmanager.jpg, sizeBytes: 655183} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60304, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220611-WA0007.jpg, sizeBytes: 295696} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60302, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220611-WA0006.jpg, sizeBytes: 336809} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60295, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220611-WA0004.jpg, sizeBytes: 174483} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60289, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220611-WA0002.jpg, sizeBytes: 164515} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017570 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 233 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017569 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 238 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/1000017569, mimeType=video/mp4, size=463585431 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/1000017569 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017568 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 242 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/1000017568, mimeType=video/mp4, size=262535089 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/1000017568 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017567 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 245 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017566 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 246 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60269, path: /storage/emulated/0/DCIM/Camera/IMG_20220610_215608.jpg, sizeBytes: 4404940} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60243, path: /storage/emulated/0/DCIM/Camera/IMG_20220610_170045.jpg, sizeBytes: 3602205} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60241, path: /storage/emulated/0/DCIM/Camera/IMG_20220610_165428.jpg, sizeBytes: 2968458} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60231, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220610-WA0023.jpg, sizeBytes: 379094} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60217, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220610-WA0015.jpeg, sizeBytes: 1644514} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60214, path: /storage/emulated/0/DCIM/Camera/IMG_20220610_111729.jpg, sizeBytes: 117338} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60210, path: /storage/emulated/0/DCIM/Camera/IMG_20220610_111400.jpg, sizeBytes: 4908382} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60208, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220610-WA0011.jpeg, sizeBytes: 1384497} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60205, path: /storage/emulated/0/DCIM/Camera/IMG_20220610_110716.jpg, sizeBytes: 3903160} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60203, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220610-WA0008.jpeg, sizeBytes: 1417320} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60163, path: /storage/emulated/0/DCIM/Camera/IMG_20220609_181845.jpg, sizeBytes: 3141619} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60161, path: /storage/emulated/0/DCIM/Camera/IMG_20220609_181754.jpg, sizeBytes: 2694019} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60159, path: /storage/emulated/0/DCIM/Camera/IMG_20220609_181638.jpg, sizeBytes: 3661670} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60143, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0039.jpg, sizeBytes: 118259} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60141, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0038.jpg, sizeBytes: 65885} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60139, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0037.jpg, sizeBytes: 245270} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60137, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0036.jpg, sizeBytes: 144148} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60135, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220609-WA0035.jpg, sizeBytes: 307868} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60040, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-09-08-55-02-938_com.android.chrome.jpg, sizeBytes: 385812} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60035, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220531-WA0020.jpg, sizeBytes: 118660} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/60009, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220608-WA0015.jpg, sizeBytes: 317921} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59992, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-08-18-57-57-457_com.ilmeteo.android.ilmeteo.jpg, sizeBytes: 1030055} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59987, path: /storage/emulated/0/DCIM/Camera/IMG_20220608_150812.jpg, sizeBytes: 5733796} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59986, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-08-15-04-55-029_com.google.android.apps.photos.jpg, sizeBytes: 1529751} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017565 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 247 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017564 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 248 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017563 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 249 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017562 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 250 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017557 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 251 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/1000017557, mimeType=video/mp4, size=409664958 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/1000017557 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017555 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 252 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59985, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-08-15-04-46-742_com.google.android.apps.photos.jpg, sizeBytes: 1444078} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59982, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220608-WA0009.jpg, sizeBytes: 170007} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59951, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220608-WA0002.jpg, sizeBytes: 176974} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59930, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-06-08-09-11-03-950_it.caitalia.apphub.jpg, sizeBytes: 653439} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59919, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220607-WA0021.jpg, sizeBytes: 306577} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59916, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220607-WA0020.jpg, sizeBytes: 41734} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59911, path: /storage/emulated/0/Pictures/Whatsapp/IMG-20220607-WA0018.jpg, sizeBytes: 312905} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59883, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220607-WA0015.jpg, sizeBytes: 147539} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59879, path: /storage/emulated/0/DCIM/Camera/IMG_20220607_144859.jpg, sizeBytes: 4473680} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59877, path: /storage/emulated/0/DCIM/Camera/IMG_20220607_144813.jpg, sizeBytes: 2161977} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59873, path: /storage/emulated/0/DCIM/Camera/IMG_20220607_143507.jpg, sizeBytes: 4139679} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/59519, path: /storage/emulated/0/DCIM/Camera/IMG_20220603_165858.jpg, sizeBytes: 2700423} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48523, path: /storage/emulated/0/DCIM/Camera/IMG_20220531_190506.jpg, sizeBytes: 3176332} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48521, path: /storage/emulated/0/DCIM/Camera/IMG_20220531_184651.jpg, sizeBytes: 6141148} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48374, path: /storage/emulated/0/Pictures/Whatsapp/IMG-20220529-WA0028.jpg, sizeBytes: 273406} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48326, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0028.jpg, sizeBytes: 273406} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48336, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220530-WA0001.jpg, sizeBytes: 108983} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48332, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220530-WA0000.jpg, sizeBytes: 87535} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48321, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0026.jpg, sizeBytes: 285505} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48288, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0016.jpg, sizeBytes: 235476} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48286, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0015.jpg, sizeBytes: 297995} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48284, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0014.jpg, sizeBytes: 165322} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48282, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0013.jpg, sizeBytes: 269255} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48290, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0012.jpg, sizeBytes: 304809} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48279, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0011.jpg, sizeBytes: 199236} +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/1000017555, mimeType=video/mp4, size=223932873 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/1000017555 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000017089 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 253 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000016883 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 254 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000016879 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 256 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000016817 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 258 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000016602 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 259 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000016485 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 260 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000016404 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 261 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48276, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0010.jpg, sizeBytes: 220274} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 1833/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48273, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0009.jpg, sizeBytes: 234273} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48270, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0008.jpg, sizeBytes: 254041} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48267, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0007.jpg, sizeBytes: 175580} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48264, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0006.jpg, sizeBytes: 343052} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48262, path: /storage/emulated/0/DCIM/Camera/IMG_20220529_152710.jpg, sizeBytes: 4857590} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48260, path: /storage/emulated/0/DCIM/Camera/IMG_20220529_152557.jpg, sizeBytes: 5506638} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48258, path: /storage/emulated/0/DCIM/Camera/IMG_20220529_152550.jpg, sizeBytes: 5093604} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48255, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0005.jpg, sizeBytes: 372196} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48252, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0004.jpg, sizeBytes: 224822} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48246, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0002.jpg, sizeBytes: 242151} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48249, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220529-WA0003.jpg, sizeBytes: 208934} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48243, path: /storage/emulated/0/DCIM/Camera/IMG_20220529_143233.jpg, sizeBytes: 2371231} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48237, path: /storage/emulated/0/DCIM/Camera/IMG_20220529_122648.jpg, sizeBytes: 2952897} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48200, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220528-WA0009.jpg, sizeBytes: 191104} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48203, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220528-WA0010.jpg, sizeBytes: 172648} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48116, path: /storage/emulated/0/DCIM/Camera/IMG_20220527_142525.jpg, sizeBytes: 5163939} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48114, path: /storage/emulated/0/DCIM/Camera/IMG_20220527_142520.jpg, sizeBytes: 4773250} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48112, path: /storage/emulated/0/DCIM/Camera/IMG_20220527_142453.jpg, sizeBytes: 4716700} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48082, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220527-WA0008.jpg, sizeBytes: 148516} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48001, path: /storage/emulated/0/Download/Soduto/retro.jpg, sizeBytes: 501289} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/48000, path: /storage/emulated/0/Download/Soduto/fronte.jpg, sizeBytes: 500503} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47946, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0008.jpg, sizeBytes: 123374} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47945, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-25-15-09-16-661_com.instagram.android.jpg, sizeBytes: 953606} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000016342 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 262 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000016225 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 263 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000016223 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 264 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000016101 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 265 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000016072 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 266 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000016065 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 267 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000016053 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 268 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47944, path: /storage/emulated/0/DCIM/PlantNet/2022-05-25T13_30_00+02_00.JPEG, sizeBytes: 5053627} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47941, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0007.jpg, sizeBytes: 197598} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47938, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0006.jpg, sizeBytes: 130334} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47935, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0005.jpg, sizeBytes: 132733} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47932, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0004.jpg, sizeBytes: 64583} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47929, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0003.jpg, sizeBytes: 72940} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47917, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220525-WA0000.jpg, sizeBytes: 90145} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47899, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220524-WA0002.jpg, sizeBytes: 113208} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47896, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220524-WA0001.jpg, sizeBytes: 138191} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47877, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220523-WA0009.jpg, sizeBytes: 112821} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47852, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-23-10-41-42-885_it.subito.jpg, sizeBytes: 1031151} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47850, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220523-WA0002.jpg, sizeBytes: 219920} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47847, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220523-WA0001.jpg, sizeBytes: 249290} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47840, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220523-WA0000.jpg, sizeBytes: 177774} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47834, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0047.jpg, sizeBytes: 127728} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47787, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0034.jpg, sizeBytes: 374736} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47784, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0033.jpg, sizeBytes: 127369} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47778, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0031.jpg, sizeBytes: 202145} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47781, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0032.jpg, sizeBytes: 147011} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47775, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0030.jpg, sizeBytes: 162459} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47772, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0029.jpg, sizeBytes: 151834} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47766, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0027.jpg, sizeBytes: 422731} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47769, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0028.jpg, sizeBytes: 151284} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47763, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0026.jpg, sizeBytes: 513130} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000016017 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 269 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015928 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 270 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015924 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 271 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015872 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 272 +W/d.t.a.m.x.XMP(26629): failed to get XMP by MP4 parser for mimeType=video/mp4 uri=content://media/external/video/media/1000015872 +W/d.t.a.m.x.XMP(26629): deckers.thibault.aves.metadata.Mp4TooLargeException: box (type=ZZZZ size=1515870802) is too large +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.metadataBoxParser$lambda$0$0(Mp4ParserHelper.kt:326) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.$r8$lambda$EQ8bFzT6vWIUuqqzsbetNamYpHQ(Unknown Source:0) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper$$ExternalSyntheticLambda0.skip(D8$$SyntheticClass:0) +W/d.t.a.m.x.XMP(26629): at org.mp4parser.AbstractBoxParser.parseBox(AbstractBoxParser.java:110) +W/d.t.a.m.x.XMP(26629): at org.mp4parser.BasicContainer.initContainer(BasicContainer.java:107) +W/d.t.a.m.x.XMP(26629): at org.mp4parser.IsoFile.<init>(IsoFile.java:58) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.consumeIso(Mp4ParserHelper.kt:68) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.xmp.XMP.checkMp4(XMP.kt:100) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadataByMetadataExtractor(MetadataFetchHandler.kt:826) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadata(MetadataFetchHandler.kt:537) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.access$getCatalogMetadata(MetadataFetchHandler.kt:115) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.Coresult$Companion.safe(Coresult.kt:52) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2.invokeSuspend(MetadataFetchHandler.kt:121) +W/d.t.a.m.x.XMP(26629): at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:820) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704) +W/d.t.a.m.Mp4ParserHelper(26629): failed to get User Data box by MP4 parser for mimeType=video/mp4 uri=content://media/external/video/media/1000015872 +W/d.t.a.m.Mp4ParserHelper(26629): deckers.thibault.aves.metadata.Mp4TooLargeException: box (type=ZZZZ size=1515870802) is too large +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.metadataBoxParser$lambda$0$0(Mp4ParserHelper.kt:326) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.$r8$lambda$EQ8bFzT6vWIUuqqzsbetNamYpHQ(Unknown Source:0) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper$$ExternalSyntheticLambda0.skip(D8$$SyntheticClass:0) +W/d.t.a.m.Mp4ParserHelper(26629): at org.mp4parser.AbstractBoxParser.parseBox(AbstractBoxParser.java:110) +W/d.t.a.m.Mp4ParserHelper(26629): at org.mp4parser.BasicContainer.initContainer(BasicContainer.java:107) +W/d.t.a.m.Mp4ParserHelper(26629): at org.mp4parser.IsoFile.<init>(IsoFile.java:58) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.consumeIso(Mp4ParserHelper.kt:68) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.getUserDataBox(Mp4ParserHelper.kt:339) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadata(MetadataFetchHandler.kt:545) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.access$getCatalogMetadata(MetadataFetchHandler.kt:115) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.Coresult$Companion.safe(Coresult.kt:52) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2.invokeSuspend(MetadataFetchHandler.kt:121) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:820) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015852 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 273 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015848 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 274 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015791 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 275 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015734 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 276 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47760, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0025.jpg, sizeBytes: 505037} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47757, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0024.jpg, sizeBytes: 337955} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47754, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0023.jpg, sizeBytes: 347650} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47751, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0022.jpg, sizeBytes: 232229} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47745, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0020.jpg, sizeBytes: 234016} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47748, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0021.jpg, sizeBytes: 215028} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47742, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0019.jpg, sizeBytes: 421970} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47705, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0008.jpg, sizeBytes: 501565} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47702, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0007.jpg, sizeBytes: 521375} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47699, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0006.jpg, sizeBytes: 543721} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47696, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0005.jpg, sizeBytes: 208543} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47693, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0004.jpg, sizeBytes: 199489} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47690, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220522-WA0003.jpg, sizeBytes: 192409} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47674, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-21-18-11-51-414_com.google.android.apps.maps.jpg, sizeBytes: 671008} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47614, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220521-WA0002.jpg, sizeBytes: 288125} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47610, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-21-09-14-25-272_com.outdooractive.Outdooractive.jpg, sizeBytes: 587786} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47598, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-20-20-43-30-851_com.huami.watch.hmwatchmanager.jpg, sizeBytes: 667662} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47596, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-20-20-42-57-534_com.brytonsport.active.jpg, sizeBytes: 569625} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47587, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-20-18-52-55-038_com.whatsapp.jpg, sizeBytes: 815009} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47581, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-20-18-34-31-372_de.komoot.android.jpg, sizeBytes: 750021} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47575, path: /storage/emulated/0/DCIM/Camera/IMG_20220520_150658.jpg, sizeBytes: 4060560} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47572, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220520-WA0012.jpg, sizeBytes: 292953} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47565, path: /storage/emulated/0/DCIM/Camera/IMG_20220520_144012.jpg, sizeBytes: 8039432} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47563, path: /storage/emulated/0/DCIM/Camera/IMG_20220520_143153.jpg, sizeBytes: 8837297} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015742 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 277 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015738 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 278 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015697 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 279 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015635 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 280 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015628 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 281 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47560, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220520-WA0009.jpg, sizeBytes: 136762} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47550, path: /storage/emulated/0/DCIM/Camera/IMG_20220520_131041.jpg, sizeBytes: 2422586} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47547, path: /storage/emulated/0/DCIM/Camera/IMG_20220520_130814.jpg, sizeBytes: 2639771} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47544, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220520-WA0004.jpg, sizeBytes: 255430} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47541, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220520-WA0003.jpg, sizeBytes: 11043} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47535, path: /storage/emulated/0/DCIM/Camera/IMG_20220520_105716.jpg, sizeBytes: 5478039} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47501, path: /storage/emulated/0/DCIM/Camera/IMG_20220519_180423.jpg, sizeBytes: 5029788} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47499, path: /storage/emulated/0/DCIM/Camera/IMG_20220519_180400.jpg, sizeBytes: 4838157} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47497, path: /storage/emulated/0/DCIM/Camera/IMG_20220519_180331.jpg, sizeBytes: 5284619} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47495, path: /storage/emulated/0/DCIM/Camera/IMG_20220519_180249.jpg, sizeBytes: 4705962} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47493, path: /storage/emulated/0/DCIM/Camera/IMG_20220519_180230.jpg, sizeBytes: 4561585} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47489, path: /storage/emulated/0/DCIM/Camera/IMG_20220519_180216.jpg, sizeBytes: 4454490} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47467, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0010.jpg, sizeBytes: 383398} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47464, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0009.jpg, sizeBytes: 358049} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47461, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0008.jpg, sizeBytes: 449485} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47454, path: /storage/emulated/0/Pictures/Whatsapp/IMG-20220519-WA0003.jpg, sizeBytes: 139245} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47453, path: /storage/emulated/0/Pictures/Whatsapp/IMG-20220519-WA0004.jpg, sizeBytes: 94979} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47452, path: /storage/emulated/0/Pictures/Whatsapp/IMG-20220519-WA0005.jpg, sizeBytes: 135274} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47451, path: /storage/emulated/0/Pictures/Whatsapp/IMG-20220519-WA0002.jpg, sizeBytes: 139611} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47448, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0005.jpg, sizeBytes: 135274} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47442, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0003.jpg, sizeBytes: 139245} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 1925/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47445, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0004.jpg, sizeBytes: 94979} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47439, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0002.jpg, sizeBytes: 139611} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47437, path: /storage/emulated/0/DCIM/Camera/IMG_20220519_075753.jpg, sizeBytes: 5190001} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015510 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 282 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015504 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 283 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015362 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 284 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015355 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 285 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015345 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 286 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015335 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 287 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47430, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220519-WA0000.jpg, sizeBytes: 41511} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47418, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0042.jpg, sizeBytes: 79825} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47386, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0032.jpg, sizeBytes: 145294} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47414, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0041.jpg, sizeBytes: 265733} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47411, path: /storage/emulated/0/DCIM/Camera/IMG_20220518_181149.jpg, sizeBytes: 5137687} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47405, path: /storage/emulated/0/DCIM/Camera/IMG_20220518_180954.jpg, sizeBytes: 4918229} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47403, path: /storage/emulated/0/DCIM/Camera/IMG_20220518_180856.jpg, sizeBytes: 4276907} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47400, path: /storage/emulated/0/DCIM/Camera/IMG_20220518_180849.jpg, sizeBytes: 4832278} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47399, path: /storage/emulated/0/DCIM/Camera/IMG_20220518_180846.jpg, sizeBytes: 4800522} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47396, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0035.jpg, sizeBytes: 374006} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47393, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0034.jpg, sizeBytes: 119555} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47378, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0029.jpg, sizeBytes: 76921} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47369, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0027.jpg, sizeBytes: 56776} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47366, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0026.jpg, sizeBytes: 58467} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47363, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0025.jpg, sizeBytes: 60521} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47360, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0023.jpg, sizeBytes: 142812} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47354, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0021.jpg, sizeBytes: 123306} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47348, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0019.jpg, sizeBytes: 125806} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37310, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220411-WA0030.jpg, sizeBytes: 125665} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47340, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0017.jpg, sizeBytes: 97647} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47338, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0016.jpg, sizeBytes: 480907} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47335, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0015.jpg, sizeBytes: 127540} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47332, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0014.jpg, sizeBytes: 66821} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47329, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0013.jpg, sizeBytes: 234273} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015242 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 288 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015200 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 289 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +E/FileUtils(26629): err write to mi_exception_log +E/FileUtils(26629): err write to mi_exception_log +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015155 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 290 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015130 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 291 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015126 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 292 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47327, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0012.jpg, sizeBytes: 193159} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47324, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0011.jpg, sizeBytes: 108118} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47322, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0010.jpg, sizeBytes: 134680} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47319, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0009.jpg, sizeBytes: 91227} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47316, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0008.jpg, sizeBytes: 134623} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47313, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0007.jpg, sizeBytes: 89902} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47310, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0006.jpg, sizeBytes: 127202} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47308, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0005.jpg, sizeBytes: 53692} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47305, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0004.jpg, sizeBytes: 370125} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47302, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0003.jpg, sizeBytes: 176965} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47299, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0002.jpg, sizeBytes: 286429} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47293, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220518-WA0001.jpg, sizeBytes: 120723} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47277, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220517-WA0014.jpg, sizeBytes: 78912} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47271, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220517-WA0012.jpg, sizeBytes: 118304} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47269, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-17-13-36-30-294_com.whatsapp.jpg, sizeBytes: 1017217} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47267, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-17-13-12-45-999_com.whatsapp.jpg, sizeBytes: 823361} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47259, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-17-12-07-26-386_com.whatsapp.jpg, sizeBytes: 830204} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47251, path: /storage/emulated/0/DCIM/Screenshots/IMG_20220517_100932.jpg, sizeBytes: 342121} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47248, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-17-10-04-57-964_com.whatsapp.jpg, sizeBytes: 939372} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47242, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220517-WA0001.jpg, sizeBytes: 54960} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47230, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220516-WA0005.jpg, sizeBytes: 140050} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47223, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220516-WA0003.jpg, sizeBytes: 73984} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47225, path: /storage/emulated/0/DCIM/Camera/IMG_20220516_201153.jpg, sizeBytes: 5102459} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47218, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220516-WA0001.jpg, sizeBytes: 104834} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015122 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 293 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015111 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 294 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015089 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 295 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015085 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 296 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015066 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 297 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015062 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 298 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015058 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 299 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015056 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 300 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47207, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220516-WA0000.jpg, sizeBytes: 106998} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47194, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220515-WA0011.jpg, sizeBytes: 240793} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47191, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220515-WA0010.jpg, sizeBytes: 314563} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47188, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220515-WA0009.jpg, sizeBytes: 185999} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47173, path: /storage/emulated/0/DCIM/Camera/IMG_20220515_163903.jpg, sizeBytes: 2688717} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47171, path: /storage/emulated/0/DCIM/Camera/IMG_20220515_163856.jpg, sizeBytes: 6446685} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47167, path: /storage/emulated/0/DCIM/Camera/IMG_20220515_163847.jpg, sizeBytes: 6277320} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47168, path: /storage/emulated/0/DCIM/Camera/IMG_20220515_163848.jpg, sizeBytes: 5832916} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47152, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-15-08-31-02-971_com.android.chrome.jpg, sizeBytes: 625396} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47142, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0011.jpg, sizeBytes: 218584} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47118, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0004.jpg, sizeBytes: 271220} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47109, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0002.jpg, sizeBytes: 187688} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47112, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0003.jpg, sizeBytes: 115909} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47106, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220514-WA0001.jpg, sizeBytes: 134812} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47094, path: /storage/emulated/0/DCIM/Camera/IMG_20220513_190129.jpg, sizeBytes: 5598053} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47071, path: /storage/emulated/0/DCIM/Camera/IMG_20220513_122021.jpg, sizeBytes: 4043497} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47069, path: /storage/emulated/0/DCIM/Camera/IMG_20220513_122003.jpg, sizeBytes: 3542972} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47063, path: /storage/emulated/0/DCIM/Camera/IMG_20220513_121819.jpg, sizeBytes: 4884368} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47061, path: /storage/emulated/0/DCIM/Camera/IMG_20220513_121804.jpg, sizeBytes: 5492185} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47058, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220513-WA0004.jpg, sizeBytes: 243991} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47056, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220513-WA0003.jpg, sizeBytes: 103629} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47043, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220513-WA0000.jpg, sizeBytes: 94855} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47035, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220512-WA0019.jpg, sizeBytes: 295249} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): SqfliteLocalMediaDb saveMetadata complete in 25ms for 400 entries +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47023, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220512-WA0016.jpg, sizeBytes: 265185} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015052 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 301 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015050 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 302 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015040 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 303 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000015036 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 304 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014982 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 305 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014978 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 306 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014971 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 307 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014963 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 308 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47012, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220512-WA0012.jpg, sizeBytes: 63031} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/47004, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220512-WA0010.jpg, sizeBytes: 115697} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/46999, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-12-10-16-07-708_it.subito.jpg, sizeBytes: 534638} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/46997, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-12-10-08-18-626_it.subito.jpg, sizeBytes: 507067} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/46995, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-12-08-39-52-303_it.sda.mobile.jpg, sizeBytes: 803000} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/46973, path: /storage/emulated/0/DCIM/Camera/IMG_20220512_080057.jpg, sizeBytes: 5212290} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/46971, path: /storage/emulated/0/DCIM/Camera/IMG_20220512_080037.jpg, sizeBytes: 4851262} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/46969, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-12-07-47-16-660_com.google.android.gm.jpg, sizeBytes: 404863} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/46942, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220511-WA0014.jpg, sizeBytes: 54712} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/46876, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-05-10-21-15-31-002_com.google.android.googlequicksearchbox.jpg, sizeBytes: 552581} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/46874, path: /storage/emulated/0/DCIM/Camera/IMG_20220510_195756.jpg, sizeBytes: 4708990} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/46732, path: /storage/emulated/0/DCIM/Camera/IMG_20220508_145721.jpg, sizeBytes: 5081700} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/45848, path: /storage/emulated/0/Download/MiShare/1651841771728.jpg, sizeBytes: 10751726} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/45839, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220506-WA0023.jpg, sizeBytes: 132311} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/45598, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220505-WA0018.jpg, sizeBytes: 125657} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 2015/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/45298, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0047.jpg, sizeBytes: 444669} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/45292, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0045.jpg, sizeBytes: 321000} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/45295, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0046.jpg, sizeBytes: 283681} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/45289, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0044.jpg, sizeBytes: 124166} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/45286, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0043.jpg, sizeBytes: 368662} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/45283, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220503-WA0042.jpg, sizeBytes: 245692} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/45262, path: /storage/emulated/0/DCIM/Screenshots/IMG_20220503_175820.jpg, sizeBytes: 332820} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/45114, path: /storage/emulated/0/DCIM/Creative/IMG_20220503_102929.jpg, sizeBytes: 279496} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/44806, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220501-WA0030.jpg, sizeBytes: 231247} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014927 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 309 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014783 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 310 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014670 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 311 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014657 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 312 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014631 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 313 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014623 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 314 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014619 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 315 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014613 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 316 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/44800, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220501-WA0028.jpg, sizeBytes: 237176} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/44803, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220501-WA0029.jpg, sizeBytes: 249891} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/44365, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0044.jpg, sizeBytes: 215743} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/44368, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0045.jpg, sizeBytes: 248536} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/44359, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0042.jpg, sizeBytes: 217712} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/44362, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0043.jpg, sizeBytes: 217822} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/44353, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0040.jpg, sizeBytes: 264469} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/44356, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0041.jpg, sizeBytes: 207762} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/44350, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220428-WA0039.jpg, sizeBytes: 229718} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/44342, path: /storage/emulated/0/DCIM/Camera/IMG_20220428_204500.jpg, sizeBytes: 4967592} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/44125, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-26-13-55-25-149_com.whatsapp.jpg, sizeBytes: 922495} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/44080, path: /storage/emulated/0/DCIM/Certificazione verde COVID-19.png, sizeBytes: 423885} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43992, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-24-14-05-30-791_com.google.android.apps.docs.jpg, sizeBytes: 380657} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43986, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220424-WA0007.jpg, sizeBytes: 124458} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43972, path: /storage/emulated/0/DCIM/PhotoScan/IMG_20220424_131312.jpg, sizeBytes: 231277} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43967, path: /storage/emulated/0/DCIM/PhotoScan/IMG_20220424_131235.jpg, sizeBytes: 376316} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43858, path: /storage/emulated/0/DCIM/Camera/IMG_20220421_112818.jpg, sizeBytes: 450605} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43834, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220421-WA0000.jpg, sizeBytes: 461199} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43828, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220420-WA0000.jpg, sizeBytes: 49341} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43810, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220419-WA0008.jpg, sizeBytes: 39839} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43789, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220419-WA0001.jpg, sizeBytes: 77021} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43786, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220419-WA0000.jpg, sizeBytes: 119602} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43776, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0007.jpg, sizeBytes: 118190} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43774, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0006.jpg, sizeBytes: 93903} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014605 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 317 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014597 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 318 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014579 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 319 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014542 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 320 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014535 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 321 +W/d.t.a.m.x.XMP(26629): failed to get XMP by MP4 parser for mimeType=video/mp4 uri=content://media/external/video/media/1000014535 +W/d.t.a.m.x.XMP(26629): deckers.thibault.aves.metadata.Mp4TooLargeException: box (type=��Á���� size=12451832) is too large +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.metadataBoxParser$lambda$0$0(Mp4ParserHelper.kt:326) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.$r8$lambda$EQ8bFzT6vWIUuqqzsbetNamYpHQ(Unknown Source:0) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper$$ExternalSyntheticLambda0.skip(D8$$SyntheticClass:0) +W/d.t.a.m.x.XMP(26629): at org.mp4parser.AbstractBoxParser.parseBox(AbstractBoxParser.java:110) +W/d.t.a.m.x.XMP(26629): at org.mp4parser.BasicContainer.initContainer(BasicContainer.java:107) +W/d.t.a.m.x.XMP(26629): at org.mp4parser.IsoFile.<init>(IsoFile.java:58) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.consumeIso(Mp4ParserHelper.kt:68) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.xmp.XMP.checkMp4(XMP.kt:100) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadataByMetadataExtractor(MetadataFetchHandler.kt:826) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadata(MetadataFetchHandler.kt:537) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.access$getCatalogMetadata(MetadataFetchHandler.kt:115) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.Coresult$Companion.safe(Coresult.kt:52) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2.invokeSuspend(MetadataFetchHandler.kt:121) +W/d.t.a.m.x.XMP(26629): at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:820) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704) +W/d.t.a.m.Mp4ParserHelper(26629): failed to get User Data box by MP4 parser for mimeType=video/mp4 uri=content://media/external/video/media/1000014535 +W/d.t.a.m.Mp4ParserHelper(26629): deckers.thibault.aves.metadata.Mp4TooLargeException: box (type=��Á���� size=12451832) is too large +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.metadataBoxParser$lambda$0$0(Mp4ParserHelper.kt:326) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.$r8$lambda$EQ8bFzT6vWIUuqqzsbetNamYpHQ(Unknown Source:0) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper$$ExternalSyntheticLambda0.skip(D8$$SyntheticClass:0) +W/d.t.a.m.Mp4ParserHelper(26629): at org.mp4parser.AbstractBoxParser.parseBox(AbstractBoxParser.java:110) +W/d.t.a.m.Mp4ParserHelper(26629): at org.mp4parser.BasicContainer.initContainer(BasicContainer.java:107) +W/d.t.a.m.Mp4ParserHelper(26629): at org.mp4parser.IsoFile.<init>(IsoFile.java:58) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.consumeIso(Mp4ParserHelper.kt:68) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.getUserDataBox(Mp4ParserHelper.kt:339) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadata(MetadataFetchHandler.kt:545) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.access$getCatalogMetadata(MetadataFetchHandler.kt:115) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.Coresult$Companion.safe(Coresult.kt:52) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2.invokeSuspend(MetadataFetchHandler.kt:121) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:820) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014504 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 322 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014480 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 323 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43771, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0005.jpg, sizeBytes: 111696} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43768, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220418-WA0004.jpg, sizeBytes: 144659} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43759, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0002.jpg, sizeBytes: 117212} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43756, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220418-WA0001.jpg, sizeBytes: 124493} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43737, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0054.jpg, sizeBytes: 69567} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43731, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0052.jpg, sizeBytes: 48725} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43726, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0050.jpg, sizeBytes: 292882} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43723, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0049.jpg, sizeBytes: 215783} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43710, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0045.jpg, sizeBytes: 232612} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43707, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0044.jpg, sizeBytes: 264064} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43696, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0041.jpg, sizeBytes: 195745} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43699, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0042.jpg, sizeBytes: 275496} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43693, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0040.jpg, sizeBytes: 278324} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43690, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0039.jpg, sizeBytes: 275035} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43681, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0036.jpg, sizeBytes: 26681} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43675, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0034.jpg, sizeBytes: 93106} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43672, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0033.jpg, sizeBytes: 72228} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43669, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0032.jpg, sizeBytes: 13856} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43666, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0031.jpg, sizeBytes: 392720} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43661, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0029.jpg, sizeBytes: 149942} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43655, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0027.jpg, sizeBytes: 88855} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43658, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0028.jpg, sizeBytes: 99050} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43653, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0026.jpg, sizeBytes: 75255} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43650, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0025.jpg, sizeBytes: 14585} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014476 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 324 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014448 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 325 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014443 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 326 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014439 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 327 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014407 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 328 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014403 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 329 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43647, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0024.jpg, sizeBytes: 206338} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43644, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0023.jpg, sizeBytes: 91899} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43630, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0017.jpg, sizeBytes: 15223} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43627, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0016.jpg, sizeBytes: 43747} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43625, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0015.jpg, sizeBytes: 90464} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43621, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0013.jpg, sizeBytes: 219159} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43614, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0011.jpg, sizeBytes: 414927} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43611, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0010.jpg, sizeBytes: 162167} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43608, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0009.jpg, sizeBytes: 108955} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43605, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0008.jpg, sizeBytes: 45340} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43603, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0007.jpg, sizeBytes: 42171} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43593, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0003.jpg, sizeBytes: 8774} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43590, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0002.jpg, sizeBytes: 98671} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43588, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220417-WA0001.jpg, sizeBytes: 16752} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43570, path: /storage/emulated/0/DCIM/Camera/IMG_20220416_183958.jpg, sizeBytes: 5261469} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43569, path: /storage/emulated/0/Pictures/Telegram/IMG_20220416_181451_197.jpg, sizeBytes: 252214} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43568, path: /storage/emulated/0/Pictures/Telegram/IMG_20220416_181445_996.jpg, sizeBytes: 296101} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43567, path: /storage/emulated/0/Pictures/Telegram/IMG_20220416_181442_321.jpg, sizeBytes: 252040} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43566, path: /storage/emulated/0/Pictures/Telegram/IMG_20220416_181439_852.jpg, sizeBytes: 226602} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43550, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220416-WA0002.jpg, sizeBytes: 625792} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43548, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220416-WA0001.jpg, sizeBytes: 136820} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43545, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220416-WA0000.jpg, sizeBytes: 172995} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/43530, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0011.jpg, sizeBytes: 214843} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37532, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0009.jpg, sizeBytes: 362960} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014345 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 330 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014326 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 331 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014222 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 332 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014215 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 333 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014197 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 334 +W/d.t.a.m.x.XMP(26629): failed to get XMP by MP4 parser for mimeType=video/mp4 uri=content://media/external/video/media/1000014197 +W/d.t.a.m.x.XMP(26629): deckers.thibault.aves.metadata.Mp4TooLargeException: box (type=���� size=4259381240) is too large +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.metadataBoxParser$lambda$0$0(Mp4ParserHelper.kt:326) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.$r8$lambda$EQ8bFzT6vWIUuqqzsbetNamYpHQ(Unknown Source:0) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper$$ExternalSyntheticLambda0.skip(D8$$SyntheticClass:0) +W/d.t.a.m.x.XMP(26629): at org.mp4parser.AbstractBoxParser.parseBox(AbstractBoxParser.java:110) +W/d.t.a.m.x.XMP(26629): at org.mp4parser.BasicContainer.initContainer(BasicContainer.java:107) +W/d.t.a.m.x.XMP(26629): at org.mp4parser.IsoFile.<init>(IsoFile.java:58) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.consumeIso(Mp4ParserHelper.kt:68) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.xmp.XMP.checkMp4(XMP.kt:100) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadataByMetadataExtractor(MetadataFetchHandler.kt:826) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadata(MetadataFetchHandler.kt:537) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.access$getCatalogMetadata(MetadataFetchHandler.kt:115) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.Coresult$Companion.safe(Coresult.kt:52) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2.invokeSuspend(MetadataFetchHandler.kt:121) +W/d.t.a.m.x.XMP(26629): at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:820) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704) +W/d.t.a.m.Mp4ParserHelper(26629): failed to get User Data box by MP4 parser for mimeType=video/mp4 uri=content://media/external/video/media/1000014197 +W/d.t.a.m.Mp4ParserHelper(26629): deckers.thibault.aves.metadata.Mp4TooLargeException: box (type=���� size=4259381240) is too large +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.metadataBoxParser$lambda$0$0(Mp4ParserHelper.kt:326) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.$r8$lambda$EQ8bFzT6vWIUuqqzsbetNamYpHQ(Unknown Source:0) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper$$ExternalSyntheticLambda0.skip(D8$$SyntheticClass:0) +W/d.t.a.m.Mp4ParserHelper(26629): at org.mp4parser.AbstractBoxParser.parseBox(AbstractBoxParser.java:110) +W/d.t.a.m.Mp4ParserHelper(26629): at org.mp4parser.BasicContainer.initContainer(BasicContainer.java:107) +W/d.t.a.m.Mp4ParserHelper(26629): at org.mp4parser.IsoFile.<init>(IsoFile.java:58) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.consumeIso(Mp4ParserHelper.kt:68) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.getUserDataBox(Mp4ParserHelper.kt:339) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadata(MetadataFetchHandler.kt:545) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.access$getCatalogMetadata(MetadataFetchHandler.kt:115) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.Coresult$Companion.safe(Coresult.kt:52) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2.invokeSuspend(MetadataFetchHandler.kt:121) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:820) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014188 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 335 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014166 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 336 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37518, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0007.jpg, sizeBytes: 50201} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37512, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0006.jpg, sizeBytes: 198644} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 2098/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37510, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-15-09-34-57-599_com.instagram.android.jpg, sizeBytes: 971947} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37508, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-15-08-13-19-821_com.google.android.gm.jpg, sizeBytes: 412628} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37506, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-15-08-11-43-214_com.google.android.gm.jpg, sizeBytes: 388803} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37500, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-15-08-06-35-522_com.instagram.android.jpg, sizeBytes: 1057211} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37498, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220415-WA0000.jpg, sizeBytes: 382817} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37481, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0017.jpg, sizeBytes: 233239} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37484, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0018.jpg, sizeBytes: 432979} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37475, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0015.jpg, sizeBytes: 369122} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37472, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0014.jpg, sizeBytes: 287506} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37466, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0012.jpg, sizeBytes: 365111} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37469, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0013.jpg, sizeBytes: 300439} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37460, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0010.jpg, sizeBytes: 572735} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37463, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0011.jpg, sizeBytes: 170058} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37457, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0009.jpg, sizeBytes: 403211} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37454, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220414-WA0008.jpg, sizeBytes: 297171} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37418, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220413-WA0008.jpg, sizeBytes: 126701} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37375, path: /storage/emulated/0/Download/maxresdefault.jpg, sizeBytes: 135761} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37319, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220411-WA0033.jpg, sizeBytes: 139359} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37307, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220411-WA0029.jpg, sizeBytes: 104999} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37076, path: /storage/emulated/0/DCIM/Camera/IMG_20220409_134126.jpg, sizeBytes: 2540357} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37065, path: /storage/emulated/0/DCIM/Camera/IMG_20220409_131236.jpg, sizeBytes: 2893029} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37063, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220409-WA0002.jpeg, sizeBytes: 2639071} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014147 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 337 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014120 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 338 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000014054 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 339 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000013850 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 340 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000013843 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 341 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000013787 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 342 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000013783 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 343 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000013770 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 344 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/37006, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220407-WA0006.jpg, sizeBytes: 66173} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36990, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220407-WA0001.jpg, sizeBytes: 381538} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36987, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220407-WA0000.jpg, sizeBytes: 434324} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36897, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220403-WA0004.jpg, sizeBytes: 532400} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36805, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220401-WA0020.jpeg, sizeBytes: 2197823} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36802, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-01-16-59-22-124_com.brytonsport.active.jpg, sizeBytes: 453046} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36801, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-04-01-16-59-08-036_com.brytonsport.active.jpg, sizeBytes: 460853} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36798, path: /storage/emulated/0/DCIM/Camera/IMG_20220401_155820.jpg, sizeBytes: 3599677} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36795, path: /storage/emulated/0/DCIM/Camera/IMG_20220401_154130.jpg, sizeBytes: 6789485} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36792, path: /storage/emulated/0/DCIM/Camera/IMG_20220401_152248.jpg, sizeBytes: 9245028} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36789, path: /storage/emulated/0/DCIM/Camera/IMG_20220401_151934.jpg, sizeBytes: 3029166} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36786, path: /storage/emulated/0/DCIM/Camera/IMG_20220401_151155.jpg, sizeBytes: 6251759} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36776, path: /storage/emulated/0/DCIM/Camera/IMG_20220401_135236.jpg, sizeBytes: 4956838} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36773, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220401-WA0008.jpeg, sizeBytes: 1077125} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36770, path: /storage/emulated/0/DCIM/Camera/IMG_20220401_133510.jpg, sizeBytes: 4535622} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36767, path: /storage/emulated/0/DCIM/Camera/IMG_20220401_123807.jpg, sizeBytes: 4269087} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36764, path: /storage/emulated/0/DCIM/Camera/IMG_20220401_115917.jpg, sizeBytes: 2213434} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36758, path: /storage/emulated/0/DCIM/Camera/IMG_20220401_110025.jpg, sizeBytes: 4285225} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36752, path: /storage/emulated/0/DCIM/Camera/IMG_20220401_103804.jpg, sizeBytes: 2479857} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36749, path: /storage/emulated/0/DCIM/Camera/IMG_20220401_100545.jpg, sizeBytes: 2614847} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36529, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-03-26-19-25-46-048_com.strava.jpg, sizeBytes: 648921} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36514, path: /storage/emulated/0/DCIM/Camera/IMG_20220326_123602.jpg, sizeBytes: 4193057} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36512, path: /storage/emulated/0/DCIM/Camera/IMG_20220326_123541.jpg, sizeBytes: 3951755} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36510, path: /storage/emulated/0/DCIM/Camera/IMG_20220326_123536.jpg, sizeBytes: 3994389} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36508, path: /storage/emulated/0/DCIM/Camera/IMG_20220326_123532.jpg, sizeBytes: 3700818} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000013735 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 345 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000013731 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 346 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000013585 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 347 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000013568 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 348 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000013520 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 349 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000013368 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 350 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000013356 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 351 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36506, path: /storage/emulated/0/DCIM/Camera/IMG_20220326_123528.jpg, sizeBytes: 3754046} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36474, path: /storage/emulated/0/DCIM/Camera/IMG_20220325_231026.jpg, sizeBytes: 4208483} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36472, path: /storage/emulated/0/DCIM/Camera/IMG_20220325_231021.jpg, sizeBytes: 4067058} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36470, path: /storage/emulated/0/DCIM/Camera/IMG_20220325_211126.jpg, sizeBytes: 3756237} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36468, path: /storage/emulated/0/DCIM/Camera/IMG_20220325_211122.jpg, sizeBytes: 4273626} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36461, path: /storage/emulated/0/DCIM/Camera/IMG_20220325_170441.jpg, sizeBytes: 4255688} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36459, path: /storage/emulated/0/DCIM/Camera/IMG_20220325_170437.jpg, sizeBytes: 4756792} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36260, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-03-20-19-26-21-628_com.brytonsport.active.jpg, sizeBytes: 412334} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36259, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-03-20-19-26-06-837_com.brytonsport.active.jpg, sizeBytes: 541851} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36244, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220320-WA0009.jpg, sizeBytes: 219298} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36203, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220319-WA0010.jpg, sizeBytes: 221047} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36200, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220319-WA0009.jpg, sizeBytes: 251040} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36198, path: /storage/emulated/0/DCIM/Camera/IMG_20220319_191600.jpg, sizeBytes: 1914414} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36177, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220319-WA0002.jpg, sizeBytes: 326969} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36029, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0009.jpg, sizeBytes: 344326} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36023, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0007.jpg, sizeBytes: 460448} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36026, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0008.jpg, sizeBytes: 412597} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36017, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0005.jpg, sizeBytes: 413455} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36020, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0006.jpg, sizeBytes: 465153} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36011, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0003.jpg, sizeBytes: 394657} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36014, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0004.jpg, sizeBytes: 409071} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36005, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0001.jpg, sizeBytes: 454208} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36008, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0002.jpg, sizeBytes: 342868} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/36002, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220317-WA0000.jpg, sizeBytes: 378262} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000013154 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 352 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000013083 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 353 +W/d.t.a.m.x.XMP(26629): failed to get XMP by MP4 parser for mimeType=video/mp4 uri=content://media/external/video/media/1000013083 +W/d.t.a.m.x.XMP(26629): deckers.thibault.aves.metadata.Mp4TooLargeException: box (type=��æ���� size=15138808) is too large +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.metadataBoxParser$lambda$0$0(Mp4ParserHelper.kt:326) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.$r8$lambda$EQ8bFzT6vWIUuqqzsbetNamYpHQ(Unknown Source:0) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper$$ExternalSyntheticLambda0.skip(D8$$SyntheticClass:0) +W/d.t.a.m.x.XMP(26629): at org.mp4parser.AbstractBoxParser.parseBox(AbstractBoxParser.java:110) +W/d.t.a.m.x.XMP(26629): at org.mp4parser.BasicContainer.initContainer(BasicContainer.java:107) +W/d.t.a.m.x.XMP(26629): at org.mp4parser.IsoFile.<init>(IsoFile.java:58) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.consumeIso(Mp4ParserHelper.kt:68) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.metadata.xmp.XMP.checkMp4(XMP.kt:100) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadataByMetadataExtractor(MetadataFetchHandler.kt:826) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadata(MetadataFetchHandler.kt:537) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.access$getCatalogMetadata(MetadataFetchHandler.kt:115) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.Coresult$Companion.safe(Coresult.kt:52) +W/d.t.a.m.x.XMP(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2.invokeSuspend(MetadataFetchHandler.kt:121) +W/d.t.a.m.x.XMP(26629): at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:820) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717) +W/d.t.a.m.x.XMP(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704) +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +W/d.t.a.m.Mp4ParserHelper(26629): failed to get User Data box by MP4 parser for mimeType=video/mp4 uri=content://media/external/video/media/1000013083 +W/d.t.a.m.Mp4ParserHelper(26629): deckers.thibault.aves.metadata.Mp4TooLargeException: box (type=��æ���� size=15138808) is too large +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.metadataBoxParser$lambda$0$0(Mp4ParserHelper.kt:326) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.$r8$lambda$EQ8bFzT6vWIUuqqzsbetNamYpHQ(Unknown Source:0) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper$$ExternalSyntheticLambda0.skip(D8$$SyntheticClass:0) +W/d.t.a.m.Mp4ParserHelper(26629): at org.mp4parser.AbstractBoxParser.parseBox(AbstractBoxParser.java:110) +W/d.t.a.m.Mp4ParserHelper(26629): at org.mp4parser.BasicContainer.initContainer(BasicContainer.java:107) +W/d.t.a.m.Mp4ParserHelper(26629): at org.mp4parser.IsoFile.<init>(IsoFile.java:58) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.consumeIso(Mp4ParserHelper.kt:68) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.metadata.Mp4ParserHelper.getUserDataBox(Mp4ParserHelper.kt:339) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.getCatalogMetadata(MetadataFetchHandler.kt:545) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler.access$getCatalogMetadata(MetadataFetchHandler.kt:115) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2$1.invoke(MetadataFetchHandler.kt:121) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.Coresult$Companion.safe(Coresult.kt:52) +W/d.t.a.m.Mp4ParserHelper(26629): at deckers.thibault.aves.channel.calls.MetadataFetchHandler$onMethodCall$2.invokeSuspend(MetadataFetchHandler.kt:121) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:820) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717) +W/d.t.a.m.Mp4ParserHelper(26629): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012975 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 354 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012962 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 355 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012948 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 356 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012938 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 357 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012911 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 358 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012703 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 359 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35858, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220314-WA0004.jpg, sizeBytes: 97375} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35854, path: /storage/emulated/0/DCIM/Camera/IMG_20220314_075018.jpg, sizeBytes: 5561975} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35852, path: /storage/emulated/0/DCIM/Camera/IMG_20220314_075004.jpg, sizeBytes: 4789090} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35332, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0008.jpg, sizeBytes: 144446} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35335, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0009.jpg, sizeBytes: 146664} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35326, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0006.jpg, sizeBytes: 145332} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35329, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0007.jpg, sizeBytes: 143787} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35323, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0005.jpg, sizeBytes: 184393} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35320, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0004.jpg, sizeBytes: 106311} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35309, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0001.jpg, sizeBytes: 139728} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35312, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0002.jpg, sizeBytes: 143838} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35315, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0003.jpg, sizeBytes: 110241} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35306, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220306-WA0000.jpg, sizeBytes: 381277} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35293, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220305-WA0006.jpg, sizeBytes: 280215} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35283, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220305-WA0003.jpg, sizeBytes: 205843} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35078, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0013.jpg, sizeBytes: 106611} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35074, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0012.jpg, sizeBytes: 308073} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35071, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0011.jpg, sizeBytes: 309758} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35068, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0010.jpg, sizeBytes: 272891} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35065, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0009.jpg, sizeBytes: 435631} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35062, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0008.jpg, sizeBytes: 262799} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35056, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0006.jpg, sizeBytes: 384053} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35059, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0007.jpg, sizeBytes: 272540} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35053, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0005.jpg, sizeBytes: 314726} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012683 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 360 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012582 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 361 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012525 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 362 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012304 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 363 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012247 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 364 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012188 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 365 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012153 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 366 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35050, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0004.jpg, sizeBytes: 292492} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35047, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0003.jpg, sizeBytes: 328616} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 2195/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35044, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0002.jpg, sizeBytes: 259912} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35041, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0001.jpg, sizeBytes: 357570} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35038, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220303-WA0000.jpg, sizeBytes: 456394} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35035, path: /storage/emulated/0/DCIM/Camera/IMG_20220302_233621.jpg, sizeBytes: 4072844} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/35033, path: /storage/emulated/0/DCIM/Camera/IMG_20220302_233557.jpg, sizeBytes: 4589797} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34925, path: /storage/emulated/0/DCIM/Camera/IMG_20220228_171116.jpg, sizeBytes: 5598854} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34761, path: /storage/emulated/0/DCIM/Camera/IMG_20220224_140401.jpg, sizeBytes: 4539108} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34759, path: /storage/emulated/0/DCIM/Camera/IMG_20220224_140223.jpg, sizeBytes: 4381862} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34757, path: /storage/emulated/0/DCIM/Camera/IMG_20220224_140220.jpg, sizeBytes: 4443193} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34755, path: /storage/emulated/0/DCIM/Camera/IMG_20220224_140212.jpg, sizeBytes: 4097973} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34753, path: /storage/emulated/0/DCIM/Camera/IMG_20220224_133735.jpg, sizeBytes: 3690649} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34751, path: /storage/emulated/0/DCIM/Camera/IMG_20220224_133732.jpg, sizeBytes: 4794275} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34749, path: /storage/emulated/0/DCIM/Camera/IMG_20220224_131700.jpg, sizeBytes: 1795114} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34747, path: /storage/emulated/0/DCIM/Camera/IMG_20220224_131656.jpg, sizeBytes: 1876064} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34746, path: /storage/emulated/0/DCIM/Camera/PANO_20220224_131618.jpg, sizeBytes: 22879655} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34739, path: /storage/emulated/0/DCIM/Camera/IMG_20220224_131127.jpg, sizeBytes: 4791719} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34696, path: /storage/emulated/0/DCIM/Camera/PANO_20220223_124059.jpg, sizeBytes: 31160356} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34694, path: /storage/emulated/0/DCIM/Camera/PANO_20220223_124029.jpg, sizeBytes: 30739071} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34678, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0007.jpg, sizeBytes: 204987} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34681, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0008.jpg, sizeBytes: 188152} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34684, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0009.jpg, sizeBytes: 184685} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34675, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0006.jpg, sizeBytes: 203174} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34672, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220223-WA0005.jpg, sizeBytes: 211192} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012175 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 367 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012165 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 368 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012161 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 369 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34667, path: /storage/emulated/0/DCIM/Camera/IMG_20220223_113545.jpg, sizeBytes: 2376439} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34665, path: /storage/emulated/0/DCIM/Camera/IMG_20220223_113539.jpg, sizeBytes: 2416884} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34597, path: /storage/emulated/0/DCIM/Camera/IMG_20220222_123328.jpg, sizeBytes: 1936666} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34598, path: /storage/emulated/0/DCIM/Camera/IMG_20220222_123328_1.jpg, sizeBytes: 1818229} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34595, path: /storage/emulated/0/DCIM/Camera/IMG_20220222_123256.jpg, sizeBytes: 2021106} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34592, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220222-WA0005.jpg, sizeBytes: 344942} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34590, path: /storage/emulated/0/DCIM/Camera/IMG_20220222_114843.jpg, sizeBytes: 2712229} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34588, path: /storage/emulated/0/DCIM/Camera/IMG_20220222_114505.jpg, sizeBytes: 8167715} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34586, path: /storage/emulated/0/DCIM/Camera/IMG_20220222_114310.jpg, sizeBytes: 3379094} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34584, path: /storage/emulated/0/DCIM/Camera/IMG_20220222_114306.jpg, sizeBytes: 3446774} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34582, path: /storage/emulated/0/DCIM/Camera/IMG_20220222_114304.jpg, sizeBytes: 3416597} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34580, path: /storage/emulated/0/DCIM/Camera/IMG_20220222_114244.jpg, sizeBytes: 3453187} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34578, path: /storage/emulated/0/DCIM/Camera/IMG_20220222_114229.jpg, sizeBytes: 7158247} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34572, path: /storage/emulated/0/DCIM/Camera/IMG_20220222_103809.jpg, sizeBytes: 4327767} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34570, path: /storage/emulated/0/DCIM/Camera/IMG_20220222_103750.jpg, sizeBytes: 2549600} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34566, path: /storage/emulated/0/DCIM/Camera/IMG_20220222_090602.jpg, sizeBytes: 4624591} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34563, path: /storage/emulated/0/DCIM/Camera/IMG_20220222_090353.jpg, sizeBytes: 5559291} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34527, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220221-WA0042.jpg, sizeBytes: 92542} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34516, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220221-WA0033.jpg, sizeBytes: 107404} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34504, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220221-WA0027.jpg, sizeBytes: 251416} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34501, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220221-WA0026.jpg, sizeBytes: 199621} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34499, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_175904.jpg, sizeBytes: 1678970} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34497, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_175902.jpg, sizeBytes: 1634904} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34493, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_175618.jpg, sizeBytes: 2144821} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34491, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_175610.jpg, sizeBytes: 1922611} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012105 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 370 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000012022 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 371 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000011945 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 372 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000011949 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 373 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000011941 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 374 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000011840 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 375 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000011830 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 376 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000011826 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 377 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34489, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_175427.jpg, sizeBytes: 1857282} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34485, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0022.jpg, sizeBytes: 288615} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34482, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0021.jpg, sizeBytes: 286537} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34476, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0019.jpg, sizeBytes: 67481} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34479, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0020.jpg, sizeBytes: 342683} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34430, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0004.jpg, sizeBytes: 141043} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34469, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0017.jpg, sizeBytes: 80966} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34473, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0018.jpg, sizeBytes: 78618} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34466, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220221-WA0016.jpg, sizeBytes: 257358} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34439, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_153044.jpg, sizeBytes: 3024039} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34437, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220221-WA0008.jpeg, sizeBytes: 1499517} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34428, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_113041.jpg, sizeBytes: 3443044} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34426, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_113027.jpg, sizeBytes: 2679421} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34424, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_113023.jpg, sizeBytes: 2895483} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34422, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_112734.jpg, sizeBytes: 4001292} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34420, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_112552.jpg, sizeBytes: 2107413} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34418, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_112539.jpg, sizeBytes: 5143946} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34416, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_112534.jpg, sizeBytes: 2492328} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34414, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_112509.jpg, sizeBytes: 2305076} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34412, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_112501.jpg, sizeBytes: 4704482} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34410, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_112454.jpg, sizeBytes: 4514158} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34407, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220221-WA0003.jpg, sizeBytes: 390050} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34405, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_094950.jpg, sizeBytes: 2932569} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34403, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_094948.jpg, sizeBytes: 2858051} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34401, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_094947.jpg, sizeBytes: 2832335} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000011819 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 378 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000011806 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 379 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000011793 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 380 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000011562 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 381 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000011179 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 382 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000011065 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 383 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000011031 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 384 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34399, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_094943.jpg, sizeBytes: 2937601} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34397, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_094906.jpg, sizeBytes: 2659514} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34395, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_094846.jpg, sizeBytes: 2543800} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34393, path: /storage/emulated/0/DCIM/Camera/IMG_20220221_094842.jpg, sizeBytes: 2596983} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34368, path: /storage/emulated/0/DCIM/Camera/IMG_20220220_195302.jpg, sizeBytes: 5082629} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34362, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220220-WA0022.jpg, sizeBytes: 167685} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34348, path: /storage/emulated/0/DCIM/Camera/IMG_20220220_185131.jpg, sizeBytes: 1675028} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34346, path: /storage/emulated/0/DCIM/Camera/IMG_20220220_185126.jpg, sizeBytes: 2207904} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34344, path: /storage/emulated/0/DCIM/Camera/IMG_20220220_185041.jpg, sizeBytes: 2071367} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34342, path: /storage/emulated/0/DCIM/Camera/IMG_20220220_185030.jpg, sizeBytes: 1889223} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34340, path: /storage/emulated/0/DCIM/Camera/IMG_20220220_185022.jpg, sizeBytes: 1958398} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34338, path: /storage/emulated/0/DCIM/Camera/IMG_20220220_185017.jpg, sizeBytes: 2056081} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34336, path: /storage/emulated/0/DCIM/Camera/IMG_20220220_184940.jpg, sizeBytes: 2142092} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34334, path: /storage/emulated/0/DCIM/Camera/IMG_20220220_184923.jpg, sizeBytes: 2127253} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34332, path: /storage/emulated/0/DCIM/Camera/IMG_20220220_184911.jpg, sizeBytes: 2052933} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34317, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220220-WA0010.jpg, sizeBytes: 127247} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34305, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220220-WA0007.jpg, sizeBytes: 181070} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/34299, path: /storage/emulated/0/DCIM/Camera/IMG_20220220_134803.jpg, sizeBytes: 2381823} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33964, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220216-WA0016.jpeg, sizeBytes: 1470483} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33812, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0034.jpg, sizeBytes: 295345} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33805, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0032.jpg, sizeBytes: 111114} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33759, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0017.jpg, sizeBytes: 415772} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33756, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0016.jpg, sizeBytes: 318674} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33753, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0015.jpg, sizeBytes: 403051} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33750, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0014.jpg, sizeBytes: 449880} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000010944 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 385 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000010940 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 386 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000010894 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 387 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000010822 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 388 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000010771 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 389 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/1000010771, mimeType=video/mp4, size=392447466 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/1000010771 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33747, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0013.jpg, sizeBytes: 400934} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33741, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0011.jpg, sizeBytes: 361221} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33744, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0012.jpg, sizeBytes: 331500} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33738, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0010.jpg, sizeBytes: 307625} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33732, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0008.jpg, sizeBytes: 373787} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33735, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0009.jpg, sizeBytes: 268648} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33726, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0006.jpg, sizeBytes: 274276} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33729, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0007.jpg, sizeBytes: 260005} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33720, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0004.jpg, sizeBytes: 490144} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33723, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0005.jpg, sizeBytes: 270303} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33717, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0003.jpg, sizeBytes: 364400} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 2304/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33711, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0001.jpg, sizeBytes: 294651} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33708, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220214-WA0000.jpg, sizeBytes: 382816} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33683, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220213-WA0072.jpg, sizeBytes: 243883} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33680, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220213-WA0071.jpg, sizeBytes: 201985} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33669, path: /storage/emulated/0/DCIM/Camera/IMG_20220213_162959.jpg, sizeBytes: 3892753} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33667, path: /storage/emulated/0/DCIM/Camera/IMG_20220213_162909.jpg, sizeBytes: 4551623} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33659, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220213-WA0065.jpg, sizeBytes: 164792} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33656, path: /storage/emulated/0/DCIM/Camera/IMG_20220213_161546.jpg, sizeBytes: 4937367} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33653, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0063.jpg, sizeBytes: 477901} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33650, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0062.jpg, sizeBytes: 386546} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33647, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0061.jpg, sizeBytes: 447968} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33644, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0060.jpg, sizeBytes: 479560} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33640, path: /storage/emulated/0/DCIM/Camera/IMG_20220213_154220.jpg, sizeBytes: 2101402} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000010770 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 390 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/1000010770, mimeType=video/mp4, size=320517278 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/1000010770 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000010767 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 391 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000010125 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 392 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33641, path: /storage/emulated/0/DCIM/Camera/IMG_20220213_154222.jpg, sizeBytes: 2109630} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33638, path: /storage/emulated/0/DCIM/Camera/IMG_20220213_150252.jpg, sizeBytes: 2538619} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33620, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0054.jpg, sizeBytes: 351614} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33611, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0051.jpg, sizeBytes: 347704} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33614, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0052.jpg, sizeBytes: 94867} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33617, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0053.jpg, sizeBytes: 112271} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33602, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0048.jpg, sizeBytes: 226521} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33605, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0049.jpg, sizeBytes: 313488} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33608, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0050.jpg, sizeBytes: 266704} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33599, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0047.jpg, sizeBytes: 478269} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33318, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220212-WA0015.jpg, sizeBytes: 196334} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33372, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220212-WA0033.jpg, sizeBytes: 234676} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33406, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220212-WA0036.jpg, sizeBytes: 179489} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33591, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0045.jpg, sizeBytes: 245247} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33595, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0046.jpg, sizeBytes: 188221} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33534, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/media/whatsapp images/IMG-20220213-WA0004.jpg, sizeBytes: 434639} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33589, path: /storage/emulated/0/DCIM/Camera/IMG_20220213_110003.jpg, sizeBytes: 6757574} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33587, path: /storage/emulated/0/DCIM/Camera/IMG_20220213_105955.jpg, sizeBytes: 6891502} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33537, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220213-WA0005.jpg, sizeBytes: 406715} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33531, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220213-WA0003.jpg, sizeBytes: 423800} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33529, path: /storage/emulated/0/DCIM/Camera/IMG_20220213_094502.jpg, sizeBytes: 5364359} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33527, path: /storage/emulated/0/DCIM/Camera/IMG_20220213_093517.jpg, sizeBytes: 2209734} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33521, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220213-WA0001.jpg, sizeBytes: 349396} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33524, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220213-WA0002.jpg, sizeBytes: 353520} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000009934 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 393 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000009933 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 394 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/1000009933, mimeType=video/mp4, size=189422128 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/1000009933 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000009643 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 395 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000009546 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 396 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000009540 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 397 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33518, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20220213-WA0000.jpg, sizeBytes: 339284} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33504, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0052.jpg, sizeBytes: 268850} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33498, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0050.jpg, sizeBytes: 331545} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33501, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0051.jpg, sizeBytes: 280796} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33495, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0049.jpg, sizeBytes: 365368} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33492, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0048.jpg, sizeBytes: 266506} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33489, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0047.jpg, sizeBytes: 319110} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33484, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_172525.jpg, sizeBytes: 5207763} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33479, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_164628.jpg, sizeBytes: 5878043} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33477, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_164626.jpg, sizeBytes: 6005172} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33475, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_164545.jpg, sizeBytes: 5990279} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33472, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0045.jpg, sizeBytes: 362785} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33469, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0044.jpg, sizeBytes: 344531} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33466, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0043.jpg, sizeBytes: 422205} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33463, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0042.jpg, sizeBytes: 424205} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33460, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0041.jpg, sizeBytes: 328311} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33457, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220212-WA0040.jpg, sizeBytes: 361036} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33455, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_163354.jpg, sizeBytes: 2402062} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33453, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_163349.jpg, sizeBytes: 2459787} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33451, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_163307.jpg, sizeBytes: 2700046} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33449, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_163258.jpg, sizeBytes: 2636558} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33447, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_162350.jpg, sizeBytes: 2919123} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33444, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_161715.jpg, sizeBytes: 6340317} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33443, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_161713.jpg, sizeBytes: 6564824} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33441, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_154426.jpg, sizeBytes: 2516675} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000009539 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 398 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000009535 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 399 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000009495 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 400 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/1000009495, mimeType=video/mp4, size=383938540 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/1000009495 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33439, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_154057.jpg, sizeBytes: 5855432} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33437, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_154045.jpg, sizeBytes: 5160236} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33435, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_154043.jpg, sizeBytes: 5223571} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33433, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_154038.jpg, sizeBytes: 4336169} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33428, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_153434.jpg, sizeBytes: 4863829} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33426, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_153425.jpg, sizeBytes: 2199290} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33424, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_153328.jpg, sizeBytes: 3015226} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33422, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_153320.jpg, sizeBytes: 5706616} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33420, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_153316.jpg, sizeBytes: 5188150} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33418, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_153306.jpg, sizeBytes: 5771513} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33413, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_151420.jpg, sizeBytes: 2123904} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33411, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_151414.jpg, sizeBytes: 2170427} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33403, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0035.jpg, sizeBytes: 202476} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33400, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_144045.jpg, sizeBytes: 2508098} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33398, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_144041.jpg, sizeBytes: 2490331} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33396, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_144035.jpg, sizeBytes: 2484454} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33394, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_144034.jpg, sizeBytes: 2531151} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33392, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_144029.jpg, sizeBytes: 2549622} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33390, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_144027.jpg, sizeBytes: 2522682} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33388, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_143912.jpg, sizeBytes: 2399990} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33385, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_143904.jpg, sizeBytes: 2635674} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33384, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_143902.jpg, sizeBytes: 2586412} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33382, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_143143.jpg, sizeBytes: 2524997} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33380, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_143134.jpg, sizeBytes: 6210555} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33369, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0032.jpg, sizeBytes: 333125} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33366, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0031.jpg, sizeBytes: 272407} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000009494 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 401 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/1000009494, mimeType=video/mp4, size=472286429 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/1000009494 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000009427 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 402 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/1000009427, mimeType=video/mp4, size=144085539 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/1000009427 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000009165 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 403 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000009164 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 404 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33360, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0029.jpg, sizeBytes: 282708} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33363, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0030.jpg, sizeBytes: 409181} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33357, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0028.jpg, sizeBytes: 287120} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33354, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0027.jpg, sizeBytes: 378265} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33348, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0025.jpg, sizeBytes: 429379} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33351, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0026.jpg, sizeBytes: 421652} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33345, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0024.jpg, sizeBytes: 461888} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): SqfliteLocalMediaDb saveMetadata complete in 27ms for 400 entries +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33342, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0023.jpg, sizeBytes: 270344} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33339, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0022.jpg, sizeBytes: 355126} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33336, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0021.jpg, sizeBytes: 474886} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 2402/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33327, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0018.jpg, sizeBytes: 198810} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33330, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0019.jpg, sizeBytes: 259869} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33321, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0016.jpg, sizeBytes: 202967} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33324, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0017.jpg, sizeBytes: 304463} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33315, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220212-WA0014.jpg, sizeBytes: 257141} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33302, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_124529.jpg, sizeBytes: 2406668} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33300, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_124524.jpg, sizeBytes: 2499722} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33296, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_114228.jpg, sizeBytes: 4706106} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33283, path: /storage/emulated/0/DCIM/Camera/IMG_20220212_110619.jpg, sizeBytes: 5437106} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33231, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220211-WA0000.jpg, sizeBytes: 156368} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33225, path: /storage/emulated/0/DCIM/Camera/IMG_20220210_233640.jpg, sizeBytes: 4817972} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33223, path: /storage/emulated/0/DCIM/Camera/IMG_20220210_233636.jpg, sizeBytes: 5271474} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33221, path: /storage/emulated/0/DCIM/Camera/IMG_20220210_233634.jpg, sizeBytes: 5208552} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33219, path: /storage/emulated/0/DCIM/Camera/IMG_20220210_233530.jpg, sizeBytes: 3328339} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000009051 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 405 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/1000008548 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 406 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/63556 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 407 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/63264 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 408 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/63134 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 409 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/63134, mimeType=video/mp4, size=150882716 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/63134 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/62771 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 410 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33090, path: /storage/emulated/0/DCIM/Camera/IMG_20220208_134346.jpg, sizeBytes: 5405034} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33024, path: /storage/emulated/0/DCIM/Screenshots/IMG_20220206_195232.jpg, sizeBytes: 383244} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33022, path: /storage/emulated/0/DCIM/Screenshots/IMG_20220206_195144.jpg, sizeBytes: 382859} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/33013, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-02-06-15-41-58-289_com.google.android.gm.jpg, sizeBytes: 487046} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32996, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220206-WA0010.jpg, sizeBytes: 142703} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32985, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220206-WA0006.jpg, sizeBytes: 203496} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32914, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_220932.jpg, sizeBytes: 3138267} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32904, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_215634.jpg, sizeBytes: 3323726} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32893, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_211737.jpg, sizeBytes: 3408383} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32891, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_211732.jpg, sizeBytes: 3200773} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32889, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_211620.jpg, sizeBytes: 4221411} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32887, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_211535.jpg, sizeBytes: 3053216} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32885, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_211532.jpg, sizeBytes: 3089613} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32883, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_211526.jpg, sizeBytes: 5332086} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32881, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_211506.jpg, sizeBytes: 5400197} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32879, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_211337.jpg, sizeBytes: 5452996} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32841, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_124947.jpg, sizeBytes: 3155943} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32839, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_124914.jpg, sizeBytes: 4423297} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32837, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_110141.jpg, sizeBytes: 4395321} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32835, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_110100.jpg, sizeBytes: 3537173} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32833, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_110039.jpg, sizeBytes: 1960870} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32831, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_110021.jpg, sizeBytes: 2215620} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32829, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_103642.jpg, sizeBytes: 2238809} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32827, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_103638.jpg, sizeBytes: 2206389} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32825, path: /storage/emulated/0/DCIM/Camera/IMG_20220205_103626.jpg, sizeBytes: 5227731} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/62596 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 411 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/62411 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 412 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/62409 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 413 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/62291 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 414 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/62287 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 415 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/62276 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 416 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32803, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220204-WA0009.jpg, sizeBytes: 91480} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32789, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/WhatsApp Images/IMG-20220204-WA0004.jpg, sizeBytes: 397015} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32374, path: /storage/emulated/0/Pictures/Remini20220201223000490.jpg, sizeBytes: 690212} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32380, path: /storage/emulated/0/Pictures/_.thumbnails/1643751000623.jpg, sizeBytes: 0} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32060, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0032.jpg, sizeBytes: 198749} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32057, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0031.jpg, sizeBytes: 222691} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32054, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0030.jpg, sizeBytes: 269902} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32051, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0029.jpg, sizeBytes: 236432} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32048, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0028.jpg, sizeBytes: 195151} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32038, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0025.jpg, sizeBytes: 243957} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/32010, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220130-WA0009.jpg, sizeBytes: 155840} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/31892, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220129-WA0000.jpg, sizeBytes: 88441} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/31712, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220126-WA0010.jpg, sizeBytes: 93783} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/31603, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220125-WA0000.jpg, sizeBytes: 134711} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/31606, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220125-WA0001.jpg, sizeBytes: 132548} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/31609, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220125-WA0002.jpg, sizeBytes: 145215} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/31503, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220123-WA0002.jpg, sizeBytes: 588830} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/31418, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2022-01-21-23-20-58-379_com.android.chrome.jpg, sizeBytes: 399435} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/31349, path: /storage/emulated/0/DCIM/Camera/IMG_20220120_170424.jpg, sizeBytes: 5133311} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/31245, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220118-WA0002.jpg, sizeBytes: 148479} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/31226, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220117-WA0016.jpg, sizeBytes: 218381} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/31223, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220117-WA0015.jpg, sizeBytes: 214602} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/31180, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220117-WA0004.jpg, sizeBytes: 431713} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/31136, path: /storage/emulated/0/DCIM/Camera/IMG_20220116_124608.jpg, sizeBytes: 5524649} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/62249 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 417 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/62150 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 418 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/61988 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 419 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/61971 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 420 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/31003, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220115-WA0019.jpg, sizeBytes: 419816} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/30653, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220109-WA0021.jpg, sizeBytes: 70927} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/30656, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220109-WA0022.jpg, sizeBytes: 84904} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/30647, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220109-WA0019.jpg, sizeBytes: 63546} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/30607, path: /storage/emulated/0/DCIM/ReactNative-snapshot-image2335675742430269525.png, sizeBytes: 278259} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/30213, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220104-WA0002.jpg, sizeBytes: 181956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/30210, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220104-WA0001.jpg, sizeBytes: 188031} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/30207, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220104-WA0000.jpg, sizeBytes: 163395} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/30064, path: /storage/emulated/0/android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20220101-WA0029.jpg, sizeBytes: 156887} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/29978, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220101-WA0028.jpg, sizeBytes: 159386} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/29939, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220101-WA0017.jpg, sizeBytes: 796504} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/29916, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20220101-WA0012.jpg, sizeBytes: 113982} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/29712, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211231-WA0012.jpg, sizeBytes: 185806} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/29715, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211231-WA0013.jpg, sizeBytes: 121098} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/29311, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211227-WA0005.jpg, sizeBytes: 317875} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/29298, path: /storage/emulated/0/DCIM/Camera/IMG_20211227_084735.jpg, sizeBytes: 4852891} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/29151, path: /storage/emulated/0/DCIM/Camera/IMG_20211225_143846.jpg, sizeBytes: 1122400} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/28865, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211224-WA0014.jpg, sizeBytes: 208900} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/28862, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211224-WA0013.jpg, sizeBytes: 268166} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/28859, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211224-WA0012.jpg, sizeBytes: 322883} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/28814, path: /storage/emulated/0/DCIM/Camera/IMG_20211223_223433.jpg, sizeBytes: 907598} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/28802, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0033.jpg, sizeBytes: 171724} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/28779, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0027.jpg, sizeBytes: 173944} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/28713, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0016.jpg, sizeBytes: 123524} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/61971, mimeType=video/mp4, size=1332932426 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/61971 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/61970 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 421 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/61970, mimeType=video/mp4, size=612270541 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/61970 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/61855 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 422 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/61851 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 423 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/61851, mimeType=video/mp4, size=357905634 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/61851 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/61852 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 424 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/61784 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 425 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/61686 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 426 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/28711, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0015.jpg, sizeBytes: 343394} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/28704, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211223-WA0012.jpg, sizeBytes: 136022} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20909, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20211219-WA0017.jpg, sizeBytes: 192238} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20904, path: /storage/emulated/0/DCIM/Camera/IMG_20211219_160804_1.jpg, sizeBytes: 4576388} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20902, path: /storage/emulated/0/DCIM/Camera/IMG_20211219_160804.jpg, sizeBytes: 4347123} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20900, path: /storage/emulated/0/DCIM/Camera/IMG_20211219_160802.jpg, sizeBytes: 5132815} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20899, path: /storage/emulated/0/DCIM/Camera/IMG_20211219_160801.jpg, sizeBytes: 5088597} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20895, path: /storage/emulated/0/DCIM/Camera/IMG_20211219_160346.jpg, sizeBytes: 5096585} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20894, path: /storage/emulated/0/DCIM/Camera/IMG_20211219_160345.jpg, sizeBytes: 5079473} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20892, path: /storage/emulated/0/DCIM/Camera/IMG_20211219_160313.jpg, sizeBytes: 4765984} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20888, path: /storage/emulated/0/DCIM/Camera/IMG_20211219_160157.jpg, sizeBytes: 2530067} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20886, path: /storage/emulated/0/DCIM/Camera/IMG_20211219_160155.jpg, sizeBytes: 2631687} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20882, path: /storage/emulated/0/DCIM/Camera/IMG_20211219_155841.jpg, sizeBytes: 5494433} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20880, path: /storage/emulated/0/DCIM/Camera/IMG_20211219_155823.jpg, sizeBytes: 5445175} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20878, path: /storage/emulated/0/DCIM/Camera/IMG_20211219_155811.jpg, sizeBytes: 4896114} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 2504/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20875, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0012.jpg, sizeBytes: 679965} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20867, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0010.jpg, sizeBytes: 418669} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20864, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0009.jpg, sizeBytes: 279483} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20858, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0007.jpg, sizeBytes: 97173} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20861, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0008.jpg, sizeBytes: 88189} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20852, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0005.jpg, sizeBytes: 150811} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20855, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211219-WA0006.jpg, sizeBytes: 157442} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20849, path: /storage/emulated/0/DCIM/Camera/IMG_20211219_133038.jpg, sizeBytes: 1897384} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20748, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211216-WA0014.jpg, sizeBytes: 156876} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20343, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211209-WA0005.jpg, sizeBytes: 119039} +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/61686, mimeType=video/mp4, size=445231224 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/61686 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/61286 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 427 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/61286, mimeType=video/mp4, size=699524818 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/61286 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/61222 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 428 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/61202 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 429 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/61198 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 430 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20300, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211208-WA0021.jpg, sizeBytes: 181199} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20132, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0013.jpg, sizeBytes: 276147} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20135, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0014.jpg, sizeBytes: 329110} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20141, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0016.jpg, sizeBytes: 312384} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20144, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0017.jpg, sizeBytes: 243102} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20088, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0002.jpg, sizeBytes: 185087} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20193, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0037.jpg, sizeBytes: 323348} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20190, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0036.jpg, sizeBytes: 135458} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20085, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0001.jpg, sizeBytes: 192104} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20170, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0025.jpg, sizeBytes: 277874} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20173, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0026.jpg, sizeBytes: 287537} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20163, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0023.jpg, sizeBytes: 479876} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20160, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0022.jpg, sizeBytes: 281673} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20157, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0021.jpg, sizeBytes: 275096} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20154, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0020.jpg, sizeBytes: 445528} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20151, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0019.jpg, sizeBytes: 441798} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20138, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0015.jpg, sizeBytes: 339570} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20129, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0012.jpg, sizeBytes: 332998} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20126, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211207-WA0011.jpg, sizeBytes: 116527} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20116, path: /storage/emulated/0/DCIM/Camera/IMG_20211207_155952.jpg, sizeBytes: 5716113} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20114, path: /storage/emulated/0/DCIM/Camera/IMG_20211207_154908.jpg, sizeBytes: 2637611} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20112, path: /storage/emulated/0/DCIM/Camera/IMG_20211207_154904.jpg, sizeBytes: 4876675} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20110, path: /storage/emulated/0/DCIM/Camera/IMG_20211207_154633.jpg, sizeBytes: 5674702} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20108, path: /storage/emulated/0/DCIM/Camera/IMG_20211207_154348.jpg, sizeBytes: 2567812} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60891 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 431 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60890 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 432 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60678 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 433 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60671 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 434 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60646 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 435 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60621 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 436 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60617 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 437 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20106, path: /storage/emulated/0/DCIM/Camera/IMG_20211207_154139.jpg, sizeBytes: 4765770} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20105, path: /storage/emulated/0/DCIM/Camera/IMG_20211207_144037.jpg, sizeBytes: 4094805} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20103, path: /storage/emulated/0/DCIM/Camera/IMG_20211207_144034.jpg, sizeBytes: 4720660} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20100, path: /storage/emulated/0/DCIM/Camera/IMG_20211207_125751.jpg, sizeBytes: 5657817} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20098, path: /storage/emulated/0/DCIM/Camera/IMG_20211207_125747.jpg, sizeBytes: 2235303} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20096, path: /storage/emulated/0/DCIM/Camera/IMG_20211207_125744.jpg, sizeBytes: 2313731} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20094, path: /storage/emulated/0/DCIM/Camera/IMG_20211207_125733.jpg, sizeBytes: 5670664} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20091, path: /storage/emulated/0/DCIM/Camera/IMG_20211207_121202.jpg, sizeBytes: 5091399} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20083, path: /storage/emulated/0/DCIM/Camera/IMG_20211207_100609.jpg, sizeBytes: 5346204} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20061, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_211429.jpg, sizeBytes: 3209639} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20059, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_211346.jpg, sizeBytes: 6305014} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19982, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0016.jpg, sizeBytes: 273368} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20048, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0059.jpg, sizeBytes: 109895} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20052, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0060.jpg, sizeBytes: 210560} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20055, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0061.jpg, sizeBytes: 148697} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20045, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0058.jpg, sizeBytes: 278557} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19891, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/whatsapp images/IMG-20211206-WA0004.jpg, sizeBytes: 233066} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20037, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_203646.jpg, sizeBytes: 1343971} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/20036, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_203454.jpg, sizeBytes: 4131388} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19991, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0018.jpg, sizeBytes: 84813} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19985, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0017.jpg, sizeBytes: 118393} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19976, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0014.jpg, sizeBytes: 183445} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19979, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0015.jpg, sizeBytes: 105609} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19973, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211206-WA0013.jpg, sizeBytes: 159064} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19971, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_160510.jpg, sizeBytes: 7183965} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60613 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 438 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60609 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 439 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60602 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 440 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60526 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 441 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60558 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 442 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60578 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 443 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60562 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 444 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19963, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_152057.jpg, sizeBytes: 1515529} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19961, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_152051.jpg, sizeBytes: 4920744} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19959, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_150922.jpg, sizeBytes: 4812559} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19958, path: /storage/emulated/0/DCIM/Camera/PANO_20211206_150752.jpg, sizeBytes: 30058063} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19955, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_150647.jpg, sizeBytes: 5558042} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19953, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_150605.jpg, sizeBytes: 6299877} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19951, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_150551.jpg, sizeBytes: 5608528} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19949, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_150216.jpg, sizeBytes: 1896393} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19947, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_150212.jpg, sizeBytes: 5228928} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19945, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_150202.jpg, sizeBytes: 4361325} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19943, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_150148.jpg, sizeBytes: 4221835} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19941, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_145850.jpg, sizeBytes: 2614160} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19937, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_145135.jpg, sizeBytes: 2299341} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19938, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_145135_1.jpg, sizeBytes: 2092646} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19935, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_145128.jpg, sizeBytes: 2533480} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19916, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_141947.jpg, sizeBytes: 2616657} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19914, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_141926.jpg, sizeBytes: 2632826} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19912, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_141917.jpg, sizeBytes: 5459240} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19910, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_141541.jpg, sizeBytes: 5525842} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19900, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_141442.jpg, sizeBytes: 5060157} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19898, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_141435.jpg, sizeBytes: 4984744} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19882, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_120500.jpg, sizeBytes: 2716285} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19880, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_120409.jpg, sizeBytes: 5721332} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19878, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_114914.jpg, sizeBytes: 2780405} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19876, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_114904.jpg, sizeBytes: 5049476} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19874, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_114756.jpg, sizeBytes: 2735559} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60554 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 445 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60550 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 446 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60546 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 447 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60542 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 448 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60538 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 449 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60534 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 450 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60530 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 451 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19872, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_114306.jpg, sizeBytes: 5239629} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19865, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_102859.jpg, sizeBytes: 2817708} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19860, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_100537.jpg, sizeBytes: 6377492} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19858, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_100507.jpg, sizeBytes: 6551911} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19854, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_100502.jpg, sizeBytes: 6438226} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19855, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_100503.jpg, sizeBytes: 6398307} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19852, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_100434.jpg, sizeBytes: 5096663} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19850, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_100354.jpg, sizeBytes: 5824790} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19848, path: /storage/emulated/0/DCIM/Camera/IMG_20211206_100342.jpg, sizeBytes: 6198435} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19830, path: /storage/emulated/0/DCIM/Camera/IMG_20211205_205452.jpg, sizeBytes: 5222180} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19823, path: /storage/emulated/0/DCIM/Camera/IMG_20211205_192710.jpg, sizeBytes: 4047109} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19821, path: /storage/emulated/0/DCIM/Camera/IMG_20211205_192709.jpg, sizeBytes: 4122591} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19818, path: /storage/emulated/0/DCIM/Camera/IMG_20211205_192705.jpg, sizeBytes: 4389483} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19817, path: /storage/emulated/0/DCIM/Camera/IMG_20211205_192704.jpg, sizeBytes: 4501878} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19814, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211205-WA0024.jpg, sizeBytes: 141961} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19802, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20211205-WA0021.jpg, sizeBytes: 156818} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19799, path: /storage/emulated/0/Android/media/com.whatsapp/whatsapp/media/whatsapp images/IMG-20211205-WA0020.jpg, sizeBytes: 176240} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19770, path: /storage/emulated/0/DCIM/Camera/IMG_20211205_133014.jpg, sizeBytes: 4626061} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19558, path: /storage/emulated/0/DCIM/Camera/IMG_20211202_120929.jpg, sizeBytes: 5184558} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19526, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211201-WA0006.jpg, sizeBytes: 194115} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/19292, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211128-WA0006.jpg, sizeBytes: 481698} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/11726, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-11-26-21-35-40-219_com.google.android.apps.photos.jpg, sizeBytes: 1367240} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/11628, path: /storage/emulated/0/DCIM/Camera/IMG_20211125_115144.jpg, sizeBytes: 3765558} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/11196, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211124-WA0019.jpg, sizeBytes: 496107} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 2613/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/11155, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-11-24-14-38-59-101_com.google.android.gm.jpg, sizeBytes: 365934} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60516 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 452 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60512 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 453 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60508 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 454 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60489 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 455 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60455 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 456 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60439 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 457 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60399 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 458 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/11124, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211124-WA0001.jpg, sizeBytes: 555244} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/11093, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211123-WA0005.jpg, sizeBytes: 90900} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7443, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211121-WA0008.jpg, sizeBytes: 186270} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7476, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211120-WA0005.jpg, sizeBytes: 299392} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7175, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211118-WA0017.jpg, sizeBytes: 18543} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2763, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-11-17-19-32-05-781_it.subito.jpg, sizeBytes: 403835} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7114, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211107-WA0009.jpg, sizeBytes: 227969} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7079, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211107-WA0007.jpg, sizeBytes: 438473} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7562, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0030.jpg, sizeBytes: 309654} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7348, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0029.jpg, sizeBytes: 286381} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7523, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0024.jpg, sizeBytes: 406742} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7475, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0023.jpg, sizeBytes: 255027} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7204, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0022.jpg, sizeBytes: 230532} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7470, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0021.jpg, sizeBytes: 463648} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7282, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0019.jpg, sizeBytes: 353747} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7517, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0020.jpg, sizeBytes: 225325} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7078, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0017.jpg, sizeBytes: 288103} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7236, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0018.jpg, sizeBytes: 276512} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7235, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0016.jpg, sizeBytes: 361926} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7515, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0015.jpg, sizeBytes: 367313} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7234, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0014.jpg, sizeBytes: 405436} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7110, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0013.jpg, sizeBytes: 389496} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7203, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0012.jpg, sizeBytes: 392602} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7383, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0011.jpg, sizeBytes: 301627} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60407 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 459 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60409 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 460 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60378 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 461 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60277 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 462 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60215 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 463 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60169 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 464 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7137, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0010.jpg, sizeBytes: 333548} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7233, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0009.jpg, sizeBytes: 184599} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7330, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0008.jpg, sizeBytes: 204388} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7202, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0007.jpg, sizeBytes: 183687} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7516, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211102-WA0006.jpg, sizeBytes: 167469} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7441, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0052.jpg, sizeBytes: 292779} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7238, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0051.jpg, sizeBytes: 373903} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7347, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0050.jpg, sizeBytes: 333073} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7384, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0049.jpg, sizeBytes: 298965} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3756, path: /storage/emulated/0/DCIM/Camera/IMG_20211101_205653.jpg, sizeBytes: 3889002} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4810, path: /storage/emulated/0/DCIM/Camera/IMG_20211101_205642.jpg, sizeBytes: 4144346} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2795, path: /storage/emulated/0/DCIM/Camera/IMG_20211101_202935.jpg, sizeBytes: 3191232} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7561, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0048.jpg, sizeBytes: 268107} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7346, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0047.jpg, sizeBytes: 185720} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7605, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0043.jpg, sizeBytes: 246389} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7169, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0038.jpg, sizeBytes: 287415} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4683, path: /storage/emulated/0/DCIM/Camera/IMG_20211101_151059.jpg, sizeBytes: 3219524} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7201, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0031.jpg, sizeBytes: 465009} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7557, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0032.jpg, sizeBytes: 328270} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7111, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0030.jpg, sizeBytes: 510231} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7077, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0029.jpg, sizeBytes: 284613} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7603, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0028.jpg, sizeBytes: 329939} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7380, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0027.jpg, sizeBytes: 576713} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7136, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0026.jpg, sizeBytes: 296058} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60165 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 465 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60033 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 466 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60021 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 467 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60017 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 468 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/60013 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 469 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/59912 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 470 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/59886 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 471 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7381, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0025.jpg, sizeBytes: 249437} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7405, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0024.jpg, sizeBytes: 295855} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7379, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0023.jpg, sizeBytes: 303650} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7514, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0022.jpg, sizeBytes: 275000} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7439, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0021.jpg, sizeBytes: 339837} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7401, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0019.jpg, sizeBytes: 313822} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7403, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0020.jpg, sizeBytes: 316515} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7076, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0018.jpg, sizeBytes: 294407} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7402, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0017.jpg, sizeBytes: 305123} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7281, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0016.jpg, sizeBytes: 275106} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7200, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0015.jpg, sizeBytes: 378053} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7513, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0014.jpg, sizeBytes: 358125} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7328, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0013.jpg, sizeBytes: 351139} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7168, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0012.jpg, sizeBytes: 286766} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7469, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0011.jpg, sizeBytes: 286018} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7468, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0010.jpg, sizeBytes: 166833} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7467, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0009.jpg, sizeBytes: 184845} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7280, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211101-WA0008.jpg, sizeBytes: 127646} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7108, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0062.jpg, sizeBytes: 249405} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7329, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0100.jpg, sizeBytes: 324264} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7438, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0099.jpg, sizeBytes: 232311} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7556, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0098.jpg, sizeBytes: 261490} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7197, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0074.jpg, sizeBytes: 458024} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7555, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0097.jpg, sizeBytes: 327107} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/59828 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 472 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/59824 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 473 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/59820 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 474 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/59433 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 475 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/48594 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 476 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/48590 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 477 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/48586 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 478 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7378, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0096.jpg, sizeBytes: 300042} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7198, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0088.jpg, sizeBytes: 258495} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7512, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0094.jpg, sizeBytes: 174689} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7074, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0093.jpg, sizeBytes: 354554} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7199, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0092.jpg, sizeBytes: 369976} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7109, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0091.jpg, sizeBytes: 387528} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7341, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0090.jpg, sizeBytes: 331753} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7602, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0089.jpg, sizeBytes: 440113} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7075, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0066.jpg, sizeBytes: 408915} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7135, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0087.jpg, sizeBytes: 363296} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7326, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0086.jpg, sizeBytes: 336733} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7340, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0085.jpg, sizeBytes: 585858} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7377, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0084.jpg, sizeBytes: 267325} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7134, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0083.jpg, sizeBytes: 265527} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7339, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0082.jpg, sizeBytes: 540054} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7376, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0081.jpg, sizeBytes: 400253} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7232, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0080.jpg, sizeBytes: 343566} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 2703/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7466, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0078.jpg, sizeBytes: 172435} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7374, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0076.jpg, sizeBytes: 231366} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7231, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0075.jpg, sizeBytes: 397788} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7437, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0065.jpg, sizeBytes: 485432} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7196, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0064.jpg, sizeBytes: 534112} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7436, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0063.jpg, sizeBytes: 519042} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/48582 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 479 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/48578 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 480 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/48574 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 481 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47954 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 482 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47950 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 483 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47677 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 484 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47670 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 485 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7195, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0061.jpg, sizeBytes: 393708} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7073, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0060.jpg, sizeBytes: 212489} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7337, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0059.jpg, sizeBytes: 549669} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7601, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0058.jpg, sizeBytes: 136520} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7194, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0057.jpg, sizeBytes: 188353} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7552, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0056.jpg, sizeBytes: 299249} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7554, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0055.jpg, sizeBytes: 186570} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7434, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0054.jpg, sizeBytes: 322595} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7230, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0053.jpg, sizeBytes: 372431} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7107, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0052.jpg, sizeBytes: 337100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7375, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0051.jpg, sizeBytes: 232249} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7106, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0050.jpg, sizeBytes: 281362} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7133, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0049.jpg, sizeBytes: 338447} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7167, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0048.jpg, sizeBytes: 286172} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7104, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0047.jpg, sizeBytes: 266956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7132, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0046.jpg, sizeBytes: 348612} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7435, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0045.jpg, sizeBytes: 256041} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7338, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0044.jpg, sizeBytes: 163496} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7553, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0043.jpg, sizeBytes: 302638} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7511, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0042.jpg, sizeBytes: 186313} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7072, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0041.jpg, sizeBytes: 228313} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7327, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0040.jpg, sizeBytes: 282403} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7600, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0035.jpg, sizeBytes: 226546} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7465, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0034.jpg, sizeBytes: 235746} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47669 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 486 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47666 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 487 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47665 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 488 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47577 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 489 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47567 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 490 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47556 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 491 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47504 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 492 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47491 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 493 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7071, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0033.jpg, sizeBytes: 118025} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7325, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0031.jpg, sizeBytes: 180168} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7433, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0030.jpg, sizeBytes: 220019} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7279, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0029.jpg, sizeBytes: 325024} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7464, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0028.jpg, sizeBytes: 203675} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7105, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211031-WA0027.jpg, sizeBytes: 201117} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3632, path: /storage/emulated/0/DCIM/Camera/IMG_20211031_170909.jpg, sizeBytes: 2593956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3835, path: /storage/emulated/0/DCIM/Camera/IMG_20211031_170859.jpg, sizeBytes: 3990956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4517, path: /storage/emulated/0/DCIM/Camera/IMG_20211031_163910.jpg, sizeBytes: 4517505} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3018, path: /storage/emulated/0/DCIM/Camera/IMG_20211031_163853.jpg, sizeBytes: 4697604} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2794, path: /storage/emulated/0/DCIM/Camera/IMG_20211031_163736.jpg, sizeBytes: 4903490} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3990, path: /storage/emulated/0/DCIM/Camera/IMG_20211031_143613.jpg, sizeBytes: 4665859} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4595, path: /storage/emulated/0/DCIM/Camera/IMG_20211031_143557.jpg, sizeBytes: 5147331} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3330, path: /storage/emulated/0/DCIM/Camera/PANO_20211031_142002.jpg, sizeBytes: 20118670} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3235, path: /storage/emulated/0/DCIM/Camera/IMG_20211031_115920.jpg, sizeBytes: 7142215} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3429, path: /storage/emulated/0/DCIM/Camera/IMG_20211031_115905.jpg, sizeBytes: 5748898} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3219, path: /storage/emulated/0/DCIM/Camera/IMG_20211031_114017.jpg, sizeBytes: 4523383} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3755, path: /storage/emulated/0/DCIM/Camera/IMG_20211031_105430.jpg, sizeBytes: 4276958} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3989, path: /storage/emulated/0/DCIM/Camera/IMG_20211030_204105.jpg, sizeBytes: 3456868} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7432, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0089.jpg, sizeBytes: 439497} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7373, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0088.jpg, sizeBytes: 218388} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7599, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0087.jpg, sizeBytes: 222329} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7103, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0086.jpg, sizeBytes: 461492} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7463, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0065.jpg, sizeBytes: 350399} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7431, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0085.jpg, sizeBytes: 255448} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47487 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 494 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47476 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 495 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47433 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 496 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47389 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 497 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47356 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 498 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47347 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 499 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47344 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 500 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7510, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0084.jpg, sizeBytes: 254110} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7324, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0083.jpg, sizeBytes: 297696} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7070, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0075.jpg, sizeBytes: 136578} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7166, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0074.jpg, sizeBytes: 205145} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7131, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0073.jpg, sizeBytes: 243133} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7509, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0072.jpg, sizeBytes: 229053} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7336, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0071.jpg, sizeBytes: 169596} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7229, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0070.jpg, sizeBytes: 342573} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7598, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0069.jpg, sizeBytes: 120058} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7130, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0068.jpg, sizeBytes: 371602} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7372, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0067.jpg, sizeBytes: 541686} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7277, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0066.jpg, sizeBytes: 264918} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7462, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0064.jpg, sizeBytes: 473694} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7507, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0063.jpg, sizeBytes: 496198} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7461, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0062.jpg, sizeBytes: 397457} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7278, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0061.jpg, sizeBytes: 489939} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7102, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0060.jpg, sizeBytes: 294762} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7400, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0059.jpg, sizeBytes: 306344} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7551, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0058.jpg, sizeBytes: 288378} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7399, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0057.jpg, sizeBytes: 377221} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7193, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0056.jpg, sizeBytes: 441537} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7129, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0055.jpg, sizeBytes: 578704} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7322, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0054.jpg, sizeBytes: 505864} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7192, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0052.jpg, sizeBytes: 189747} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47217 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 501 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/47216 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 502 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/46941 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 503 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/46940 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 504 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/46755 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 505 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/46734 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 506 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7323, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0051.jpg, sizeBytes: 303310} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7508, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0050.jpg, sizeBytes: 488070} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7276, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0049.jpg, sizeBytes: 508953} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7335, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0048.jpg, sizeBytes: 237530} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7275, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0047.jpg, sizeBytes: 490454} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7398, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0046.jpg, sizeBytes: 444458} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7128, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0045.jpg, sizeBytes: 444992} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7321, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0044.jpg, sizeBytes: 204076} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7165, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0043.jpg, sizeBytes: 288413} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7397, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0042.jpg, sizeBytes: 143339} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7506, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0041.jpg, sizeBytes: 266207} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7505, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0040.jpg, sizeBytes: 176475} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7396, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0039.jpg, sizeBytes: 158968} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7320, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0038.jpg, sizeBytes: 269479} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 2796/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7164, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0037.jpg, sizeBytes: 158202} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7069, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0036.jpg, sizeBytes: 179784} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7319, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0035.jpg, sizeBytes: 121850} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): SqfliteLocalMediaDb saveMetadata complete in 27ms for 400 entries +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7228, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0034.jpg, sizeBytes: 164286} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7274, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0033.jpg, sizeBytes: 454692} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7068, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0032.jpg, sizeBytes: 418846} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7191, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0031.jpg, sizeBytes: 158571} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3218, path: /storage/emulated/0/DCIM/Camera/IMG_20211030_163724.jpg, sizeBytes: 3981688} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3834, path: /storage/emulated/0/DCIM/Camera/IMG_20211030_163714.jpg, sizeBytes: 3953000} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/46349 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 507 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/46342 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 508 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/46336 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 509 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/46319 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 510 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/46318 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 511 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/46318, mimeType=video/mp4, size=449837489 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/46318 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/45604 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 512 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/45600 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 513 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4594, path: /storage/emulated/0/DCIM/Camera/IMG_20211030_163315.jpg, sizeBytes: 4547184} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4638, path: /storage/emulated/0/DCIM/Camera/IMG_20211030_163313.jpg, sizeBytes: 5073033} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4809, path: /storage/emulated/0/DCIM/Camera/IMG_20211030_151937.jpg, sizeBytes: 2783517} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3367, path: /storage/emulated/0/DCIM/Camera/IMG_20211030_151909.jpg, sizeBytes: 4109127} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7395, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211030-WA0004.jpg, sizeBytes: 97235} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/21, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-10-27-19-17-18-101_com.android.provision.jpg, sizeBytes: 349077} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/22, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-10-27-18-41-56-131_com.android.provision.jpg, sizeBytes: 122167} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3459, path: /storage/emulated/0/DCIM/Camera/IMG_20211026_204429.jpg, sizeBytes: 4128069} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2597, path: /storage/emulated/0/DCIM/00 greenpass_20211025_220007_986.png, sizeBytes: 303178} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2762, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-10-24-08-22-26-563_com.android.chrome.jpg, sizeBytes: 479557} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2761, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-10-22-15-59-52-850_com.facebook.katana.jpg, sizeBytes: 1111581} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3613, path: /storage/emulated/0/DCIM/Camera/IMG_20211022_074847.jpg, sizeBytes: 808906} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7189, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211022-WA0000.jpg, sizeBytes: 159606} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3039, path: /storage/emulated/0/DCIM/Camera/IMG_20211021_083402.jpg, sizeBytes: 3934985} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2881, path: /storage/emulated/0/DCIM/Camera/IMG_20211020_195025.jpg, sizeBytes: 1217636} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4316, path: /storage/emulated/0/DCIM/Camera/IMG_20211019_200716.jpg, sizeBytes: 3340398} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3017, path: /storage/emulated/0/DCIM/Camera/IMG_20211011_200431.jpg, sizeBytes: 3907432} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7504, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0018.jpg, sizeBytes: 498808} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7550, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0017.jpg, sizeBytes: 476289} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7597, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0016.jpg, sizeBytes: 377509} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7596, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0015.jpg, sizeBytes: 377890} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7394, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0014.jpg, sizeBytes: 385390} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7273, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0012.jpg, sizeBytes: 138409} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7393, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0011.jpg, sizeBytes: 155720} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7318, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0010.jpg, sizeBytes: 166935} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/44318 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 514 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/44260 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 515 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/44196 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 516 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/44023 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 517 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/43840 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 518 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/43713 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 519 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/37425 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 520 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/37215 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 521 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7227, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211010-WA0009.jpg, sizeBytes: 140641} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3671, path: /storage/emulated/0/DCIM/Camera/IMG_20211010_114126.jpg, sizeBytes: 4069161} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4364, path: /storage/emulated/0/DCIM/Camera/IMG_20211009_133514.jpg, sizeBytes: 3683181} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7226, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211004-WA0021.jpg, sizeBytes: 94070} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7316, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211004-WA0020.jpg, sizeBytes: 90118} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2723, path: /storage/emulated/0/DCIM/Screenshots/IMG_20211003_123512.jpg, sizeBytes: 315165} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2722, path: /storage/emulated/0/DCIM/Screenshots/IMG_20211003_122627.jpg, sizeBytes: 271228} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2920, path: /storage/emulated/0/DCIM/Camera/IMG_20211003_092944.jpg, sizeBytes: 5258102} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4808, path: /storage/emulated/0/DCIM/Camera/IMG_20211003_092501.jpg, sizeBytes: 5573567} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3273, path: /storage/emulated/0/DCIM/Camera/IMG_20211003_092018.jpg, sizeBytes: 6045294} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3525, path: /storage/emulated/0/DCIM/Camera/IMG_20211003_092010.jpg, sizeBytes: 5292149} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4555, path: /storage/emulated/0/DCIM/Camera/IMG_20211003_085449.jpg, sizeBytes: 4689146} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4046, path: /storage/emulated/0/DCIM/Camera/IMG_20211003_080654.jpg, sizeBytes: 4513479} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7331, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211002-WA0024.jpg, sizeBytes: 146045} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7518, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211002-WA0023.jpg, sizeBytes: 176004} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7112, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211002-WA0022.jpg, sizeBytes: 250678} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3016, path: /storage/emulated/0/DCIM/Camera/IMG_20211002_140114.jpg, sizeBytes: 3648810} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2721, path: /storage/emulated/0/DCIM/Screenshots/IMG_20211002_101634.jpg, sizeBytes: 245287} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7101, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20211001-WA0019.jpg, sizeBytes: 572976} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3499, path: /storage/emulated/0/DCIM/Camera/IMG_20211001_163421.jpg, sizeBytes: 3416362} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2720, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210929_073140.jpg, sizeBytes: 339395} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2719, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210928_205840.jpg, sizeBytes: 80423} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3543, path: /storage/emulated/0/DCIM/Camera/IMG_20210928_195315.jpg, sizeBytes: 3006849} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2883, path: /storage/emulated/0/DCIM/Camera/PANO_20210928_195240.jpg, sizeBytes: 15812054} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3354, path: /storage/emulated/0/DCIM/Camera/IMG_20210928_190815.jpg, sizeBytes: 3316560} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/37206 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 522 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/37202 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 523 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/37086 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 524 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/37049 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 525 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/36693 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 526 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3428, path: /storage/emulated/0/DCIM/Camera/IMG_20210928_190810.jpg, sizeBytes: 2713134} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4873, path: /storage/emulated/0/DCIM/Camera/IMG_20210928_190714.jpg, sizeBytes: 5226266} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4649, path: /storage/emulated/0/DCIM/Camera/IMG_20210928_190420.jpg, sizeBytes: 3537104} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4384, path: /storage/emulated/0/DCIM/Camera/IMG_20210928_185956.jpg, sizeBytes: 4262759} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3275, path: /storage/emulated/0/DCIM/Camera/PANO_20210928_185907.jpg, sizeBytes: 22747465} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4922, path: /storage/emulated/0/DCIM/Camera/PANO_20210928_185556.jpg, sizeBytes: 18527720} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4575, path: /storage/emulated/0/DCIM/Camera/PANO_20210928_185200.jpg, sizeBytes: 12491663} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2718, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210927_102714.jpg, sizeBytes: 258548} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/5025, path: /storage/emulated/0/DCIM/Camera/IMG_20210926_185026.jpg, sizeBytes: 2625293} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4554, path: /storage/emulated/0/DCIM/Camera/IMG_20210926_185019.jpg, sizeBytes: 4514525} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2717, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210926_105850.jpg, sizeBytes: 300878} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7100, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210925-WA0025.jpg, sizeBytes: 210056} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7225, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210925-WA0024.jpg, sizeBytes: 216376} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7272, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210925-WA0021.jpg, sizeBytes: 237069} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7127, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210925-WA0020.jpg, sizeBytes: 149108} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7503, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210924-WA0014.jpg, sizeBytes: 188223} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7317, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210924-WA0012.jpg, sizeBytes: 75902} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2630, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1632381337969.jpg, sizeBytes: 74573} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4460, path: /storage/emulated/0/DCIM/Camera/IMG_20210918_152125.jpg, sizeBytes: 6813703} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4724, path: /storage/emulated/0/DCIM/Camera/IMG_20210918_150116.jpg, sizeBytes: 3381837} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4294, path: /storage/emulated/0/DCIM/Camera/IMG_20210918_150036.jpg, sizeBytes: 3215053} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3988, path: /storage/emulated/0/DCIM/Camera/IMG_20210918_150025.jpg, sizeBytes: 4516254} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4009, path: /storage/emulated/0/DCIM/Camera/IMG_20210918_092608.jpg, sizeBytes: 3706173} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3694, path: /storage/emulated/0/DCIM/Camera/IMG_20210918_092557.jpg, sizeBytes: 4758950} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3038, path: /storage/emulated/0/DCIM/Camera/IMG_20210918_092106.jpg, sizeBytes: 4406559} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/35824 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 527 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/35524 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 528 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/34863 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 529 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/34707 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 530 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/34706 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 531 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/34706, mimeType=video/mp4, size=175304025 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/34706 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/33978 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 532 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7190, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210916-WA0011.jpg, sizeBytes: 177555} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7430, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210915-WA0002.jpg, sizeBytes: 318307} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7392, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210915-WA0001.jpg, sizeBytes: 499466} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7460, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210913-WA0000.jpg, sizeBytes: 713859} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3524, path: /storage/emulated/0/DCIM/Camera/IMG_20210912_075418.jpg, sizeBytes: 2971740} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4493, path: /storage/emulated/0/DCIM/Camera/IMG_20210912_075402.jpg, sizeBytes: 3050744} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4637, path: /storage/emulated/0/DCIM/Camera/IMG_20210912_075225.jpg, sizeBytes: 3506965} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7391, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0009.jpg, sizeBytes: 124093} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7271, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0008.jpg, sizeBytes: 150994} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7595, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0007.jpg, sizeBytes: 160566} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7067, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0006.jpg, sizeBytes: 236620} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7502, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0005.jpg, sizeBytes: 151523} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7334, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0002.jpg, sizeBytes: 169162} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7549, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0001.jpg, sizeBytes: 158948} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7188, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0003.jpg, sizeBytes: 168967} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7429, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0004.jpg, sizeBytes: 198202} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7501, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210912-WA0000.jpg, sizeBytes: 140582} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3860, path: /storage/emulated/0/DCIM/Camera/IMG_20210912_071234.jpg, sizeBytes: 3312162} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 2898/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7270, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0064.jpg, sizeBytes: 273317} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7606, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0063.jpg, sizeBytes: 130204} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7285, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0062.jpg, sizeBytes: 221779} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7345, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0061.jpg, sizeBytes: 204808} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7206, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0002.jpg, sizeBytes: 170675} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7406, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0060.jpg, sizeBytes: 151268} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/33974 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 533 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/33402 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 534 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/33402, mimeType=video/mp4, size=147489200 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/33402 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/32793 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 535 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/32044 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 536 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/31731 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 537 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/31727 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 538 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7522, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0020.jpg, sizeBytes: 339106} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7559, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0003.jpg, sizeBytes: 305779} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7473, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0058.jpg, sizeBytes: 235488} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7474, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0059.jpg, sizeBytes: 94156} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7560, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0018.jpg, sizeBytes: 370101} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7174, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0057.jpg, sizeBytes: 160593} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7344, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0056.jpg, sizeBytes: 153953} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7099, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0055.jpg, sizeBytes: 54906} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3177, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_191111.jpg, sizeBytes: 3499471} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/5009, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_191104.jpg, sizeBytes: 4168555} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3716, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_190552.jpg, sizeBytes: 4122128} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4462, path: /storage/emulated/0/DCIM/Camera/PANO_20210911_185607.jpg, sizeBytes: 16259766} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4405, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_185556.jpg, sizeBytes: 4599638} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2834, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_153553.jpg, sizeBytes: 6579888} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3558, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_153539.jpg, sizeBytes: 6730796} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4615, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_153523.jpg, sizeBytes: 5568172} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4492, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_153104.jpg, sizeBytes: 3360650} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7173, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0038.jpg, sizeBytes: 243087} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4708, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_150710.jpg, sizeBytes: 5333292} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4553, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_125920.jpg, sizeBytes: 4536502} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3405, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_125757.jpg, sizeBytes: 3291337} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4479, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_120252.jpg, sizeBytes: 4659922} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3444, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_120245.jpg, sizeBytes: 6313676} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3987, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_115105.jpg, sizeBytes: 5123958} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4807, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_114626.jpg, sizeBytes: 4134692} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/31723 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 539 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/31719 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 540 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/20912 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 541 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/20898 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 542 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/20891 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 543 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/20890 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 544 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3542, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_114612.jpg, sizeBytes: 5974959} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3948, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_113835.jpg, sizeBytes: 4767794} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3798, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_113724.jpg, sizeBytes: 5330080} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3328, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_113248.jpg, sizeBytes: 5847287} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4363, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_113221.jpg, sizeBytes: 6529016} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7205, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0021.jpg, sizeBytes: 332325} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7382, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0019.jpg, sizeBytes: 119442} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7440, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0015.jpg, sizeBytes: 129324} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7519, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210911-WA0014.jpg, sizeBytes: 258191} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4216, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_103805.jpg, sizeBytes: 4858378} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4806, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_103648.jpg, sizeBytes: 4715865} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4787, path: /storage/emulated/0/DCIM/Camera/IMG_20210911_091127.jpg, sizeBytes: 4685670} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2836, path: /storage/emulated/0/DCIM/Camera/PANO_20210911_085804.jpg, sizeBytes: 20679566} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4686, path: /storage/emulated/0/DCIM/Camera/PANO_20210911_084601.jpg, sizeBytes: 26123583} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7163, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0049.jpg, sizeBytes: 227045} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7500, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0048.jpg, sizeBytes: 160171} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7098, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0047.jpg, sizeBytes: 251463} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7066, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0046.jpg, sizeBytes: 209145} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7499, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0016.jpg, sizeBytes: 276015} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3693, path: /storage/emulated/0/DCIM/Camera/IMG_20210910_213028.jpg, sizeBytes: 3792686} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3590, path: /storage/emulated/0/DCIM/Camera/IMG_20210910_184557.jpg, sizeBytes: 4854027} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3217, path: /storage/emulated/0/DCIM/Camera/IMG_20210910_184556.jpg, sizeBytes: 4923420} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3905, path: /storage/emulated/0/DCIM/Camera/IMG_20210910_160438.jpg, sizeBytes: 3462406} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4767, path: /storage/emulated/0/DCIM/Camera/IMG_20210910_160044.jpg, sizeBytes: 4468380} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4960, path: /storage/emulated/0/DCIM/Camera/IMG_20210910_123711.jpg, sizeBytes: 4559345} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/20687 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 545 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/20147 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 546 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/20079 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 547 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/19884 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 548 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/19884, mimeType=video/mp4, size=150973255 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/19884 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/11277 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 549 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/9212 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 550 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4573, path: /storage/emulated/0/DCIM/Camera/IMG_20210910_123653.jpg, sizeBytes: 5056283} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3390, path: /storage/emulated/0/DCIM/Camera/IMG_20210910_080341.jpg, sizeBytes: 1968955} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3458, path: /storage/emulated/0/DCIM/Camera/IMG_20210910_074411.jpg, sizeBytes: 4356581} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7269, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0012.jpg, sizeBytes: 593968} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7283, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG_20210910_070932.jpg, sizeBytes: 142580} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7428, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0013.jpg, sizeBytes: 597882} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7126, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0010.jpg, sizeBytes: 403502} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7097, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0009.jpg, sizeBytes: 108654} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7458, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0003.jpg, sizeBytes: 199246} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7268, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0008.jpg, sizeBytes: 334155} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7224, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0007.jpg, sizeBytes: 201551} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7427, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0006.jpg, sizeBytes: 206182} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7459, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0005.jpg, sizeBytes: 221772} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7594, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210910-WA0004.jpg, sizeBytes: 289632} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7125, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210909-WA0040.jpg, sizeBytes: 285826} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2892, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_224019.jpg, sizeBytes: 3436548} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3157, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_223348.jpg, sizeBytes: 3720195} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3015, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_223342.jpg, sizeBytes: 2297086} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4940, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_223205.jpg, sizeBytes: 3836075} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4144, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_223138.jpg, sizeBytes: 2925148} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4459, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_223001.jpg, sizeBytes: 2760066} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2955, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_205358.jpg, sizeBytes: 3923410} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4901, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_205300.jpg, sizeBytes: 3921425} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3541, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_203845.jpg, sizeBytes: 2643222} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/5024, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_190610.jpg, sizeBytes: 3533042} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5232 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 551 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5204 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 552 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/5204, mimeType=video/mp4, size=152260621 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/5204 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5237 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 553 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5211 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 554 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5225 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 555 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5238 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 556 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/5238, mimeType=video/mp4, size=123840537 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/5238 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3859, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_190512.jpg, sizeBytes: 4862388} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2833, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_190509.jpg, sizeBytes: 4739655} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3670, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_190506.jpg, sizeBytes: 4381529} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4648, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_190504.jpg, sizeBytes: 4299371} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3754, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_190500.jpg, sizeBytes: 4320074} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4424, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_190457.jpg, sizeBytes: 4303752} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3649, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_190455.jpg, sizeBytes: 4319722} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4766, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_190445.jpg, sizeBytes: 4220082} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3648, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_190234.jpg, sizeBytes: 4265662} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4215, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_190209.jpg, sizeBytes: 4272182} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4516, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_190202.jpg, sizeBytes: 4188155} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3037, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_190200.jpg, sizeBytes: 4214189} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4682, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_185330.jpg, sizeBytes: 1939617} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3692, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_185117.jpg, sizeBytes: 1937059} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4071, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_185057.jpg, sizeBytes: 4239679} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4744, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_185052.jpg, sizeBytes: 4226263} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3932, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_185049.jpg, sizeBytes: 4282244} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4939, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_184853.jpg, sizeBytes: 3777464} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3314, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_184524.jpg, sizeBytes: 4108862} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4274, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_184505.jpg, sizeBytes: 4051728} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3964, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_184435.jpg, sizeBytes: 3316785} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3255, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_184430.jpg, sizeBytes: 3513138} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4478, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_184345.jpg, sizeBytes: 4515821} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2851, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_183851.jpg, sizeBytes: 4429647} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/5023, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_183844.jpg, sizeBytes: 4220984} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3498, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_183841.jpg, sizeBytes: 4543364} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5224 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 557 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5210 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 558 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5245 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 559 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5213 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 560 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5249 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 561 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5240 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 562 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5236 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 563 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3327, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_183813.jpg, sizeBytes: 4479162} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3931, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_183758.jpg, sizeBytes: 4666663} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4872, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_183327.jpg, sizeBytes: 4445001} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4593, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_183314.jpg, sizeBytes: 4678898} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4920, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_183222.jpg, sizeBytes: 4252151} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2793, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_183220.jpg, sizeBytes: 4241327} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4125, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_183206.jpg, sizeBytes: 4384669} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7604, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG_20210909_132354.jpg, sizeBytes: 672459} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2832, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_130504.jpg, sizeBytes: 3049698} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2850, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_130344.jpg, sizeBytes: 4096217} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4194, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_130340.jpg, sizeBytes: 3929764} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7343, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210909-WA0026.jpg, sizeBytes: 276625} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 3017/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4919, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_122820.jpg, sizeBytes: 4613555} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3460, path: /storage/emulated/0/DCIM/Camera/PANO_20210909_121355.jpg, sizeBytes: 15954804} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4707, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_121335.jpg, sizeBytes: 5157499} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3557, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_121324.jpg, sizeBytes: 6873328} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4723, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_114835.jpg, sizeBytes: 5334614} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4871, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_112455.jpg, sizeBytes: 3836202} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3313, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_112446.jpg, sizeBytes: 4246152} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4515, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_105758.jpg, sizeBytes: 4650326} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4361, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_105747.jpg, sizeBytes: 5226280} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3797, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_103050.jpg, sizeBytes: 5560677} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7457, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210909-WA0020.jpg, sizeBytes: 181144} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7593, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210909-WA0021.jpg, sizeBytes: 217160} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3479, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_095150.jpg, sizeBytes: 5370716} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5228 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 564 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/5228, mimeType=video/mp4, size=134743866 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/5228 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5234 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 565 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5244 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 566 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5247 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 567 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5223 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 568 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4477, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_095041.jpg, sizeBytes: 4887323} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3156, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_095026.jpg, sizeBytes: 5552255} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3691, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_094956.jpg, sizeBytes: 4955497} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4087, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_094744.jpg, sizeBytes: 5939961} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4458, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_094727.jpg, sizeBytes: 4788384} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3389, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_094355.jpg, sizeBytes: 4882568} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4592, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_092650.jpg, sizeBytes: 4570390} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4706, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_092122.jpg, sizeBytes: 4763634} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3884, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_092032.jpg, sizeBytes: 4092156} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4214, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_092021.jpg, sizeBytes: 4856270} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2954, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_091336.jpg, sizeBytes: 4207864} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2869, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_091325.jpg, sizeBytes: 4932501} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/5008, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_091035.jpg, sizeBytes: 4038609} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2997, path: /storage/emulated/0/DCIM/Camera/IMG_20210909_090941.jpg, sizeBytes: 3780440} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4047, path: /storage/emulated/0/DCIM/Camera/PANO_20210909_071758.jpg, sizeBytes: 17703205} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4236, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_211424.jpg, sizeBytes: 4216032} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3523, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_211223.jpg, sizeBytes: 3794076} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4423, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_191646.jpg, sizeBytes: 4216915} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4086, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_191638.jpg, sizeBytes: 3260706} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4938, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_191607.jpg, sizeBytes: 4651455} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3404, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_191555.jpg, sizeBytes: 4537260} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3858, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_191550.jpg, sizeBytes: 3957911} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4805, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_191425.jpg, sizeBytes: 3139470} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4273, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_191216.jpg, sizeBytes: 3936495} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2792, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_191102.jpg, sizeBytes: 5007726} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3857, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_191100.jpg, sizeBytes: 4074886} +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5203 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 569 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5230 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 570 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5235 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 571 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5217 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 572 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5209 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 573 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5208 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 574 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5229 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 575 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4235, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_191015.jpg, sizeBytes: 5044599} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3930, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_190853.jpg, sizeBytes: 4719631} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2977, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_190825.jpg, sizeBytes: 4420185} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3234, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_190818.jpg, sizeBytes: 4152287} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3326, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_181304.jpg, sizeBytes: 5006219} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3833, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_174722.jpg, sizeBytes: 5856581} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3176, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_174709.jpg, sizeBytes: 5799162} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3427, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_174650.jpg, sizeBytes: 5925237} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4536, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_174227.jpg, sizeBytes: 4514069} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2919, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_174217.jpg, sizeBytes: 4791830} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3120, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_174211.jpg, sizeBytes: 4506332} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3478, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_170350.jpg, sizeBytes: 5796887} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4234, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_170345.jpg, sizeBytes: 7378175} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2935, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_165857.jpg, sizeBytes: 3710096} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7333, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0039.jpg, sizeBytes: 217040} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7592, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0038.jpg, sizeBytes: 183524} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7371, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0037.jpg, sizeBytes: 167613} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7124, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0036.jpg, sizeBytes: 192613} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4045, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_165419.jpg, sizeBytes: 3819133} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4331, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_165357.jpg, sizeBytes: 20349276} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4900, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_165354.jpg, sizeBytes: 20562938} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3690, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_165342.jpg, sizeBytes: 23855021} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4959, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_165329.jpg, sizeBytes: 22522566} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2818, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_165321.jpg, sizeBytes: 21185185} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4743, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_165259.jpg, sizeBytes: 2623746} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5233 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 576 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5199 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 577 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5202 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 578 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5222 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 579 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5205 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 580 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/5205, mimeType=video/mp4, size=123009682 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/5205 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3781, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_165245.jpg, sizeBytes: 2259934} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4786, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_165228.jpg, sizeBytes: 1795379} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4958, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_164702.jpg, sizeBytes: 4596232} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3689, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_164504.jpg, sizeBytes: 5328642} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4330, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_163644.jpg, sizeBytes: 2326035} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4457, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_163640.jpg, sizeBytes: 2210587} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4252, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_163623.jpg, sizeBytes: 6051087} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4025, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_155348.jpg, sizeBytes: 5218302} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3904, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_155336.jpg, sizeBytes: 5539379} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3294, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_155330.jpg, sizeBytes: 5413535} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3426, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_155206.jpg, sizeBytes: 192844} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4551, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_155201.jpg, sizeBytes: 5500403} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4833, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_155152.jpg, sizeBytes: 6171498} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7591, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0032.jpg, sizeBytes: 247577} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4832, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_154814.jpg, sizeBytes: 831377} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7267, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0031.jpg, sizeBytes: 263868} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3014, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_154538.jpg, sizeBytes: 4438121} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3736, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_140637.jpg, sizeBytes: 1726798} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3195, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_140609.jpg, sizeBytes: 5647476} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3272, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_135538.jpg, sizeBytes: 5135722} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2849, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_100253.jpg, sizeBytes: 3293524} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3540, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_100240.jpg, sizeBytes: 2872784} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4104, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_100204.jpg, sizeBytes: 5294375} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4360, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_095247.jpg, sizeBytes: 5459558} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3119, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_094052.jpg, sizeBytes: 5515566} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2996, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_092511.jpg, sizeBytes: 4988034} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5207 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 581 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5246 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 582 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5201 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 583 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5250 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 584 +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/5250, mimeType=video/mp4, size=745776064 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/5250 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5221 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 585 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5216 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 586 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4382, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_092506.jpg, sizeBytes: 4972500} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3457, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_092451.jpg, sizeBytes: 5415191} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3312, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_091508.jpg, sizeBytes: 4063969} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7096, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0016.jpg, sizeBytes: 188724} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/5006, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_090903.jpg, sizeBytes: 4802907} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4381, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_085250.jpg, sizeBytes: 4098977} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4160, path: /storage/emulated/0/DCIM/Camera/IMG_20210908_084445.jpg, sizeBytes: 4021731} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7315, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0011.jpg, sizeBytes: 699661} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7266, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0009.jpg, sizeBytes: 177219} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7548, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210908-WA0000.jpg, sizeBytes: 146772} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3194, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_191432.jpg, sizeBytes: 4605888} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7332, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0054.jpg, sizeBytes: 170825} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4475, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_190951.jpg, sizeBytes: 4492651} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4681, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_184344.jpg, sizeBytes: 4103854} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3057, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_184309.jpg, sizeBytes: 4478823} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4671, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_184304.jpg, sizeBytes: 4210132} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4742, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_182410.jpg, sizeBytes: 5107573} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4173, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_182358.jpg, sizeBytes: 5676378} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7404, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0044.jpg, sizeBytes: 221024} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4192, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_154522.jpg, sizeBytes: 4834328} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4292, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_154452.jpg, sizeBytes: 5460218} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2995, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_115338.jpg, sizeBytes: 4472841} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3819, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_115328.jpg, sizeBytes: 4215049} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3647, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_113401.jpg, sizeBytes: 4408669} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3832, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_113304.jpg, sizeBytes: 4612946} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5206 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 587 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/7609 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 588 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5220 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 589 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5215 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 590 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5239 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 591 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5214 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 592 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5242 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 593 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4765, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_113300.jpg, sizeBytes: 4426133} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3056, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_113251.jpg, sizeBytes: 3544647} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7471, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0035.jpg, sizeBytes: 174149} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4831, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_111723.jpg, sizeBytes: 5213436} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3780, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_111707.jpg, sizeBytes: 4761431} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2891, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_100747.jpg, sizeBytes: 3952761} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3012, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_100321.jpg, sizeBytes: 5230996} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3425, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_095543.jpg, sizeBytes: 5253451} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3753, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_095342.jpg, sizeBytes: 4956086} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4474, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_095343.jpg, sizeBytes: 4424600} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3963, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_095210.jpg, sizeBytes: 5891972} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2953, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_095204.jpg, sizeBytes: 5705334} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7521, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0030.jpg, sizeBytes: 229244} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4685, path: /storage/emulated/0/DCIM/Camera/PANO_20210907_094655.jpg, sizeBytes: 17770257} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 3146/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4348, path: /storage/emulated/0/DCIM/Camera/PANO_20210907_094643.jpg, sizeBytes: 21130271} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7065, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0028.jpg, sizeBytes: 211999} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7370, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0027.jpg, sizeBytes: 151089} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7237, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0026.jpg, sizeBytes: 269429} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7123, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0025.jpg, sizeBytes: 270805} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7284, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0024.jpg, sizeBytes: 267732} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3353, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_094348.jpg, sizeBytes: 6733815} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4741, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_094341.jpg, sizeBytes: 3332467} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4722, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_093650.jpg, sizeBytes: 3920531} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4591, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_093641.jpg, sizeBytes: 3955212} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3818, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_091321.jpg, sizeBytes: 5245808} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +D/d.t.a.m.Metadata(26629): Dangerously large file with uri=content://media/external/video/media/5242, mimeType=video/mp4, size=249796093 +D/d.t.a.m.Metadata(26629): create preview of size=5242880 for uri=content://media/external/video/media/5242 +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5219 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 594 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5212 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 595 +D/media_kit(26629): MediaKitAndroidHelperOpenFileDescriptor: content://media/external/video/media/5200 +D/media_kit(26629): get_env_result = -1 +D/media_kit(26629): JavaVM::AttachCurrentThread Success +D/media_kit(26629): file_descriptor = 596 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4764, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_091255.jpg, sizeBytes: 4764258} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3175, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_085958.jpg, sizeBytes: 4495246} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3929, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_085825.jpg, sizeBytes: 4964613} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4272, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_085754.jpg, sizeBytes: 4463010} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3271, path: /storage/emulated/0/DCIM/Camera/IMG_20210907_075022.jpg, sizeBytes: 3549185} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7162, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0013.jpg, sizeBytes: 202862} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7223, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0011.jpg, sizeBytes: 113725} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7498, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0010.jpg, sizeBytes: 167854} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7369, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0009.jpg, sizeBytes: 143687} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7222, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0008.jpg, sizeBytes: 103051} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7161, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0007.jpg, sizeBytes: 181836} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7456, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0005.jpg, sizeBytes: 124058} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7122, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0004.jpg, sizeBytes: 169256} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7497, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0003.jpg, sizeBytes: 142957} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7221, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0002.jpg, sizeBytes: 95911} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7368, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210907-WA0001.jpg, sizeBytes: 111757} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4721, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_212806.jpg, sizeBytes: 3933047} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4851, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_205221.jpg, sizeBytes: 2853909} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4251, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_205217.jpg, sizeBytes: 2873510} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4404, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_204046.jpg, sizeBytes: 3317693} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2952, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_203033.jpg, sizeBytes: 2256039} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4442, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_202814.jpg, sizeBytes: 2542668} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3752, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_202541.jpg, sizeBytes: 2486601} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4380, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_190427.jpg, sizeBytes: 4595428} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3556, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_190421.jpg, sizeBytes: 4819837} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4008, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_190410.jpg, sizeBytes: 5161307} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2934, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_190402.jpg, sizeBytes: 5087462} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2880, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_185455.jpg, sizeBytes: 4205085} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4763, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_185423.jpg, sizeBytes: 4774913} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3735, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_185325.jpg, sizeBytes: 3938163} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7590, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0057.jpg, sizeBytes: 117528} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7390, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0053.jpg, sizeBytes: 193872} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2951, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_182004.jpg, sizeBytes: 5065696} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7389, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0052.jpg, sizeBytes: 158753} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4785, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_174410.jpg, sizeBytes: 5139973} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2831, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_174404.jpg, sizeBytes: 5020255} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4850, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_174354.jpg, sizeBytes: 4211276} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7367, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0051.jpg, sizeBytes: 109241} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3669, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_164239.jpg, sizeBytes: 4542810} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4514, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_162909.jpg, sizeBytes: 4999021} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3856, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_162837.jpg, sizeBytes: 5409498} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7366, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0050.jpg, sizeBytes: 192564} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): SqfliteLocalMediaDb saveMetadata complete in 31ms for 400 entries +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7455, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0049.jpg, sizeBytes: 149518} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7547, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0048.jpg, sizeBytes: 180068} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7314, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0047.jpg, sizeBytes: 168851} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3254, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_160056.jpg, sizeBytes: 5609395} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7472, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0044.jpg, sizeBytes: 112920} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3036, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_153222.jpg, sizeBytes: 5286509} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3882, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_153202.jpg, sizeBytes: 4830196} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7171, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0039.jpg, sizeBytes: 239439} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +E/FileUtils(26629): err write to mi_exception_log +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7172, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0041.jpg, sizeBytes: 246106} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7520, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0040.jpg, sizeBytes: 245658} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7342, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0038.jpg, sizeBytes: 239984} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7170, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0037.jpg, sizeBytes: 251228} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3796, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_152540.jpg, sizeBytes: 4450056} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7187, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0036.jpg, sizeBytes: 204266} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4143, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_152443.jpg, sizeBytes: 5338684} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7558, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0034.jpg, sizeBytes: 139617} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7113, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210906-WA0033.jpg, sizeBytes: 165974} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3477, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_150831.jpg, sizeBytes: 2196698} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4007, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_150619.jpg, sizeBytes: 4888096} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4232, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_150613.jpg, sizeBytes: 5043441} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4085, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_150551.jpg, sizeBytes: 4799354} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4670, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_124416.jpg, sizeBytes: 4529542} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4250, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_124346.jpg, sizeBytes: 4278154} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4084, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_124312.jpg, sizeBytes: 2372640} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3456, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_122651.jpg, sizeBytes: 5696392} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4403, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_104105.jpg, sizeBytes: 4598710} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3646, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_104044.jpg, sizeBytes: 4658267} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2760, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-09-06-08-57-13-029_com.android.chrome.jpg, sizeBytes: 539381} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2918, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_081538.jpg, sizeBytes: 4355891} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3351, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_072222.jpg, sizeBytes: 4210302} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4957, path: /storage/emulated/0/DCIM/Camera/IMG_20210906_071351.jpg, sizeBytes: 4638883} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2817, path: /storage/emulated/0/DCIM/Camera/IMG_20210905_074649.jpg, sizeBytes: 4211123} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2716, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210904_173937.jpg, sizeBytes: 151139} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): Report log=Lifecycle inactive +E/FileUtils(26629): err write to mi_exception_log +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +D/FirebaseSessions(26629): App backgrounded on deckers.thibault.aves.debug +E/FileUtils(26629): err write to mi_exception_log +I/d.t.a.MainActivity(26629): onStop +W/WindowOnBackDispatcher(26629): sendCancelIfRunning: isInProgress=falsecallback=androidx.activity.OnBackPressedDispatcher$Api34Impl$createOnBackAnimationCallback$1@66f261e +I/flutter (26629): Report log=Lifecycle hidden +I/flutter (26629): Report log=Lifecycle paused +D/ActivityThread(26629): Fail to check app heapsize due to java.lang.NoSuchMethodException: dalvik.system.VMRuntime.getBlockingGcCountForAlloc [] +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7496, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210904-WA0014.jpg, sizeBytes: 691366} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2642, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210904_150136.jpg, sizeBytes: 156384} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2715, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210904_150030.jpg, sizeBytes: 148997} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2714, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210904_145936.jpg, sizeBytes: 122367} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3155, path: /storage/emulated/0/DCIM/Camera/IMG_20210904_135507.jpg, sizeBytes: 963316} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2759, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-09-03-08-53-49-361_com.strava.jpg, sizeBytes: 584562} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7186, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210902-WA0012.jpg, sizeBytes: 384517} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7064, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210902-WA0011.jpg, sizeBytes: 178668} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3589, path: /storage/emulated/0/DCIM/Camera/IMG_20210901_170612.jpg, sizeBytes: 3813342} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4473, path: /storage/emulated/0/DCIM/Camera/IMG_20210901_133041.jpg, sizeBytes: 4235092} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3270, path: /storage/emulated/0/DCIM/Camera/IMG_20210901_132439.jpg, sizeBytes: 4011793} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4937, path: /storage/emulated/0/DCIM/Camera/IMG_20210901_131642.jpg, sizeBytes: 4430754} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2791, path: /storage/emulated/0/DCIM/Camera/IMG_20210831_172602.jpg, sizeBytes: 3485294} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6321, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0014.jpg, sizeBytes: 480317} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7454, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0013.jpg, sizeBytes: 456568} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7094, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0012.jpg, sizeBytes: 494982} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7185, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0011.jpg, sizeBytes: 376141} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7426, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0010.jpg, sizeBytes: 438995} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7452, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0008.jpg, sizeBytes: 457996} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7160, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0007.jpg, sizeBytes: 234916} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7159, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0005.jpg, sizeBytes: 468403} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7365, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0004.jpg, sizeBytes: 378656} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 3254/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7155, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0001.jpg, sizeBytes: 727128} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7157, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0000.jpg, sizeBytes: 700098} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): leak_tracker: 1583 memory leak(s): not disposed: 532, not GCed: 1, GCed late: 1050 +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7158, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210830-WA0002.jpg, sizeBytes: 410271} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4680, path: /storage/emulated/0/DCIM/Camera/IMG_20210829_184632.jpg, sizeBytes: 5194817} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2654, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-29-14-33-58-187_com.stt.android.suunto.jpg, sizeBytes: 633514} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4989, path: /storage/emulated/0/DCIM/Camera/IMG_20210829_142823.jpg, sizeBytes: 3625619} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2713, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210829_142138.jpg, sizeBytes: 303734} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3011, path: /storage/emulated/0/DCIM/Camera/IMG_20210829_105404.jpg, sizeBytes: 4468393} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2830, path: /storage/emulated/0/DCIM/Camera/IMG_20210829_105353.jpg, sizeBytes: 4561466} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4006, path: /storage/emulated/0/DCIM/Camera/IMG_20210829_105333.jpg, sizeBytes: 5846949} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2758, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-27-15-44-09-039_de.komoot.android.jpg, sizeBytes: 1461501} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7364, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210827-WA0000.jpg, sizeBytes: 78064} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7589, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210826-WA0007.jpg, sizeBytes: 197692} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3645, path: /storage/emulated/0/DCIM/Camera/IMG_20210826_211130.jpg, sizeBytes: 2980157} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7425, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210824-WA0001.jpg, sizeBytes: 235905} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7363, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210824-WA0000.jpg, sizeBytes: 204181} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2641, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210823_221635.jpg, sizeBytes: 269985} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2712, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210820_174703.jpg, sizeBytes: 109156} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2711, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210820_174628.jpg, sizeBytes: 459305} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3830, path: /storage/emulated/0/DCIM/Camera/IMG_20210820_140736.jpg, sizeBytes: 4249676} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4941, path: /storage/emulated/0/DCIM/Camera/PANO_20210820_114137.jpg, sizeBytes: 24673924} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4253, path: /storage/emulated/0/DCIM/Camera/PANO_20210820_100928.jpg, sizeBytes: 23419825} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3903, path: /storage/emulated/0/DCIM/Camera/IMG_20210820_095734.jpg, sizeBytes: 7715453} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3098, path: /storage/emulated/0/DCIM/Camera/PANO_20210820_091930.jpg, sizeBytes: 22201318} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7453, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210818-WA0011.jpg, sizeBytes: 182195} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4082, path: /storage/emulated/0/DCIM/Camera/IMG_20210818_181006.jpg, sizeBytes: 3583111} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4988, path: /storage/emulated/0/DCIM/Camera/IMG_20210818_120234.jpg, sizeBytes: 6670884} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3795, path: /storage/emulated/0/DCIM/Camera/IMG_20210818_115703.jpg, sizeBytes: 7443383} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4956, path: /storage/emulated/0/DCIM/Camera/IMG_20210818_082947.jpg, sizeBytes: 6428763} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3476, path: /storage/emulated/0/DCIM/Camera/IMG_20210816_201230.jpg, sizeBytes: 4389773} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3388, path: /storage/emulated/0/DCIM/Camera/IMG_20210816_201146.jpg, sizeBytes: 3489236} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7494, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210816-WA0011.jpg, sizeBytes: 527020} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3325, path: /storage/emulated/0/DCIM/Camera/IMG_20210815_175925.jpg, sizeBytes: 3899611} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4044, path: /storage/emulated/0/DCIM/Camera/IMG_20210815_130946.jpg, sizeBytes: 4810253} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3118, path: /storage/emulated/0/DCIM/Camera/IMG_20210815_130941.jpg, sizeBytes: 5087345} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3035, path: /storage/emulated/0/DCIM/Camera/IMG_20210815_130931.jpg, sizeBytes: 4934404} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4472, path: /storage/emulated/0/DCIM/Camera/IMG_20210815_130927.jpg, sizeBytes: 5329432} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3928, path: /storage/emulated/0/DCIM/Camera/IMG_20210815_080123.jpg, sizeBytes: 2618622} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2866, path: /storage/emulated/0/DCIM/Camera/IMG_20210813_144114.jpg, sizeBytes: 248289} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3778, path: /storage/emulated/0/DCIM/Camera/IMG_20210813_143432.jpg, sizeBytes: 3602526} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2555, path: /storage/emulated/0/Android/services/picto_services_2461.png, sizeBytes: 5058} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2522, path: /storage/emulated/0/Android/nearby/picto_nearby_100.png, sizeBytes: 4129} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2537, path: /storage/emulated/0/Android/nearby/picto_nearby_33.png, sizeBytes: 5745} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2538, path: /storage/emulated/0/Android/nearby/picto_nearby_37.png, sizeBytes: 4592} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2547, path: /storage/emulated/0/Android/services/picto_services_11.png, sizeBytes: 3075} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2540, path: /storage/emulated/0/Android/nearby/picto_nearby_43.png, sizeBytes: 5059} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2523, path: /storage/emulated/0/Android/nearby/picto_nearby_103.png, sizeBytes: 4178} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2529, path: /storage/emulated/0/Android/nearby/picto_nearby_174.png, sizeBytes: 4747} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2530, path: /storage/emulated/0/Android/nearby/picto_nearby_20.png, sizeBytes: 3362} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2548, path: /storage/emulated/0/Android/services/picto_services_12.png, sizeBytes: 3674} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2549, path: /storage/emulated/0/Android/services/picto_services_14.png, sizeBytes: 4289} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2550, path: /storage/emulated/0/Android/services/picto_services_15.png, sizeBytes: 3259} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2551, path: /storage/emulated/0/Android/services/picto_services_1624.png, sizeBytes: 4153} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2552, path: /storage/emulated/0/Android/services/picto_services_1731.png, sizeBytes: 4515} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2556, path: /storage/emulated/0/Android/services/picto_services_64.png, sizeBytes: 3704} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2558, path: /storage/emulated/0/Android/tarifs/picto_tarifs_1320.png, sizeBytes: 4101} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2536, path: /storage/emulated/0/Android/nearby/picto_nearby_32.png, sizeBytes: 3217} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2539, path: /storage/emulated/0/Android/nearby/picto_nearby_40.png, sizeBytes: 3450} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2541, path: /storage/emulated/0/Android/nearby/picto_nearby_55.png, sizeBytes: 4657} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2544, path: /storage/emulated/0/Android/nearby/picto_nearby_89.png, sizeBytes: 3700} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2553, path: /storage/emulated/0/Android/services/picto_services_18.png, sizeBytes: 3320} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2524, path: /storage/emulated/0/Android/nearby/picto_nearby_110.png, sizeBytes: 6084} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2525, path: /storage/emulated/0/Android/nearby/picto_nearby_122.png, sizeBytes: 6442} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2526, path: /storage/emulated/0/Android/nearby/picto_nearby_158.png, sizeBytes: 4153} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2527, path: /storage/emulated/0/Android/nearby/picto_nearby_1589.png, sizeBytes: 5885} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2528, path: /storage/emulated/0/Android/nearby/picto_nearby_1634.png, sizeBytes: 5711} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2531, path: /storage/emulated/0/Android/nearby/picto_nearby_21.png, sizeBytes: 4016} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2532, path: /storage/emulated/0/Android/nearby/picto_nearby_2174.png, sizeBytes: 5711} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2533, path: /storage/emulated/0/Android/nearby/picto_nearby_23.png, sizeBytes: 3455} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2534, path: /storage/emulated/0/Android/nearby/picto_nearby_2313.png, sizeBytes: 5711} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2535, path: /storage/emulated/0/Android/nearby/picto_nearby_25.png, sizeBytes: 3726} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2542, path: /storage/emulated/0/Android/nearby/picto_nearby_58.png, sizeBytes: 3208} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2543, path: /storage/emulated/0/Android/nearby/picto_nearby_74.png, sizeBytes: 4219} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2545, path: /storage/emulated/0/Android/nearby/picto_nearby_90.png, sizeBytes: 4123} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2554, path: /storage/emulated/0/Android/services/picto_services_2198.png, sizeBytes: 5711} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2567, path: /storage/emulated/0/offlineSearch/ac_city.png, sizeBytes: 2204} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7220, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0022.jpg, sizeBytes: 439004} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7588, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0020.jpg, sizeBytes: 396967} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7587, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0019.jpg, sizeBytes: 384380} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6320, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0018.jpg, sizeBytes: 416386} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7121, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0017.jpg, sizeBytes: 437496} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7095, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0016.jpg, sizeBytes: 152467} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7093, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0015.jpg, sizeBytes: 307330} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6319, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0014.jpg, sizeBytes: 217301} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7120, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0010.jpg, sizeBytes: 625201} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7546, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0009.jpg, sizeBytes: 448526} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7265, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0008.jpg, sizeBytes: 202666} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7586, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0007.jpg, sizeBytes: 197072} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7092, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0006.jpg, sizeBytes: 192539} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7091, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210811-WA0005.jpg, sizeBytes: 167569} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7424, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0022.jpg, sizeBytes: 346358} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7119, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0021.jpg, sizeBytes: 362239} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7156, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0020.jpg, sizeBytes: 376053} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6318, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0019.jpg, sizeBytes: 380261} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7312, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0018.jpg, sizeBytes: 351746} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7090, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0017.jpg, sizeBytes: 374427} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7313, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0016.jpg, sizeBytes: 384821} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7264, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0015.jpg, sizeBytes: 387003} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7219, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0014.jpg, sizeBytes: 615528} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 3353/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7362, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0013.jpg, sizeBytes: 592614} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7545, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0012.jpg, sizeBytes: 370557} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7423, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0011.jpg, sizeBytes: 721427} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7361, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0010.jpg, sizeBytes: 704200} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7311, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0009.jpg, sizeBytes: 711457} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7118, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0008.jpg, sizeBytes: 715786} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7360, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0007.jpg, sizeBytes: 293792} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7495, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0006.jpg, sizeBytes: 688181} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7218, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0005.jpg, sizeBytes: 175121} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7544, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0003.jpg, sizeBytes: 692293} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7451, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0002.jpg, sizeBytes: 774960} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7543, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0001.jpg, sizeBytes: 702918} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7089, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210810-WA0000.jpg, sizeBytes: 977771} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3630, path: /storage/emulated/0/DCIM/Camera/IMG_20210810_073329.jpg, sizeBytes: 5614096} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3154, path: /storage/emulated/0/DCIM/Camera/IMG_20210810_073225.jpg, sizeBytes: 5078332} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7184, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210809-WA0002.jpg, sizeBytes: 208266} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2757, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-08-15-14-10-804_com.strava.jpg, sizeBytes: 855366} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2756, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-08-14-37-51-662_com.brytonsport.active.jpg, sizeBytes: 523821} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3947, path: /storage/emulated/0/DCIM/Camera/IMG_20210808_081610.jpg, sizeBytes: 4209222} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4291, path: /storage/emulated/0/DCIM/Camera/IMG_20210808_081556.jpg, sizeBytes: 3358575} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2755, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-07-13-10-09-898_com.strava.jpg, sizeBytes: 528558} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3794, path: /storage/emulated/0/DCIM/Camera/IMG_20210807_092208.jpg, sizeBytes: 4482364} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4422, path: /storage/emulated/0/DCIM/Camera/IMG_20210807_091725.jpg, sizeBytes: 4775489} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4918, path: /storage/emulated/0/DCIM/Camera/IMG_20210806_191501.jpg, sizeBytes: 2994010} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3350, path: /storage/emulated/0/DCIM/Camera/IMG_20210805_085026.jpg, sizeBytes: 3203232} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3555, path: /storage/emulated/0/DCIM/Camera/IMG_20210805_085016.jpg, sizeBytes: 3311677} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3034, path: /storage/emulated/0/DCIM/Camera/IMG_20210805_085001.jpg, sizeBytes: 3773247} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2637, path: /storage/emulated/0/DCIM/PlantNet/2021-08-04T22_01_19+02_00.JPEG, sizeBytes: 2158517} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2636, path: /storage/emulated/0/DCIM/PlantNet/2021-08-04T22_00_00+02_00.JPEG, sizeBytes: 4922986} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2754, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-03-14-59-27-525_com.miui.gallery.jpg, sizeBytes: 179005} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2710, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210803_145857.jpg, sizeBytes: 79146} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2640, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210803_075113.jpg, sizeBytes: 114078} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2639, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210803_075039.jpg, sizeBytes: 418911} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2753, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-03-07-49-51-860_com.stt.android.suunto.jpg, sizeBytes: 288082} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2709, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210802_083956.jpg, sizeBytes: 351626} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2752, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-08-02-08-39-07-791_com.strava.jpg, sizeBytes: 694030} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7493, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210801-WA0002.jpg, sizeBytes: 195624} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2816, path: /storage/emulated/0/DCIM/Camera/IMG_20210731_194436.jpg, sizeBytes: 1395356} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3253, path: /storage/emulated/0/DCIM/Camera/IMG_20210731_192540.jpg, sizeBytes: 1742178} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4803, path: /storage/emulated/0/DCIM/Camera/IMG_20210731_192538.jpg, sizeBytes: 1745887} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3522, path: /storage/emulated/0/DCIM/Camera/IMG_20210731_192351.jpg, sizeBytes: 1702871} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4124, path: /storage/emulated/0/DCIM/Camera/IMG_20210731_192337.jpg, sizeBytes: 3381397} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7183, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210731-WA0012.jpg, sizeBytes: 354581} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6317, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210726-WA0018.jpg, sizeBytes: 190700} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3854, path: /storage/emulated/0/DCIM/Camera/IMG_20210726_184901.jpg, sizeBytes: 2651437} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4720, path: /storage/emulated/0/DCIM/Camera/IMG_20210725_150753.jpg, sizeBytes: 2688725} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3213, path: /storage/emulated/0/DCIM/Camera/IMG_20210725_150637.jpg, sizeBytes: 2397700} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3961, path: /storage/emulated/0/DCIM/Camera/IMG_20210725_150601.jpg, sizeBytes: 2685201} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3387, path: /storage/emulated/0/DCIM/Camera/IMG_20210724_120047.jpg, sizeBytes: 4231364} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4636, path: /storage/emulated/0/DCIM/Camera/IMG_20210724_120007.jpg, sizeBytes: 3741544} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3076, path: /storage/emulated/0/DCIM/Camera/IMG_20210722_162217.jpg, sizeBytes: 4793012} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3714, path: /storage/emulated/0/DCIM/Camera/IMG_20210720_193438.jpg, sizeBytes: 4685708} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2629, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1626786468044.jpg, sizeBytes: 67827} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2628, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1626786457385.jpg, sizeBytes: 59367} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2627, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1626786400784.jpg, sizeBytes: 54367} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2626, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1626786395070.jpg, sizeBytes: 66095} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2625, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1626786360083.jpg, sizeBytes: 64299} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2624, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1626786356869.jpg, sizeBytes: 69211} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2623, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1626786354371.jpg, sizeBytes: 65310} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2622, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1626786321974.jpg, sizeBytes: 78552} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2621, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1626784990030.jpg, sizeBytes: 88118} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2620, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1626784981067.jpg, sizeBytes: 50201} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2619, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1626784972521.jpg, sizeBytes: 86307} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2618, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1626784969026.jpg, sizeBytes: 86472} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7585, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0028.jpg, sizeBytes: 87192} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6316, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0018.jpg, sizeBytes: 471906} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7153, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0016.jpg, sizeBytes: 496685} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7154, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0017.jpg, sizeBytes: 497273} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7088, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0015.jpg, sizeBytes: 518927} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7584, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0014.jpg, sizeBytes: 498750} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7087, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0013.jpg, sizeBytes: 435024} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7310, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0012.jpg, sizeBytes: 491427} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7217, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0011.jpg, sizeBytes: 529173} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7216, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0010.jpg, sizeBytes: 519851} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6314, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0009.jpg, sizeBytes: 456695} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6315, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0008.jpg, sizeBytes: 458018} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7263, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0007.jpg, sizeBytes: 370809} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7583, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0006.jpg, sizeBytes: 317948} +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7182, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0005.jpg, sizeBytes: 307061} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7262, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210720-WA0004.jpg, sizeBytes: 332058} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4987, path: /storage/emulated/0/DCIM/Camera/IMG_20210720_003027.jpg, sizeBytes: 3916983} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4005, path: /storage/emulated/0/DCIM/Camera/IMG_20210712_184122.jpg, sizeBytes: 4278389} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4026, path: /storage/emulated/0/DCIM/Camera/PANO_20210711_160342.jpg, sizeBytes: 21877666} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4191, path: /storage/emulated/0/DCIM/Camera/IMG_20210711_160332.jpg, sizeBytes: 4673958} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3269, path: /storage/emulated/0/DCIM/Camera/IMG_20210711_160325.jpg, sizeBytes: 4602509} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4849, path: /storage/emulated/0/DCIM/Camera/IMG_20210710_204916.jpg, sizeBytes: 1448694} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2814, path: /storage/emulated/0/DCIM/Camera/IMG_20210710_204639.jpg, sizeBytes: 1964295} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4103, path: /storage/emulated/0/DCIM/Camera/IMG_20210710_203559.jpg, sizeBytes: 4088660} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4231, path: /storage/emulated/0/DCIM/Camera/IMG_20210708_181815.jpg, sizeBytes: 5045693} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4740, path: /storage/emulated/0/DCIM/Camera/IMG_20210706_194117.jpg, sizeBytes: 4545085} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4358, path: /storage/emulated/0/DCIM/Camera/IMG_20210706_193958.jpg, sizeBytes: 6764696} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4365, path: /storage/emulated/0/DCIM/Camera/PANO_20210706_193858.jpg, sizeBytes: 31790400} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4726, path: /storage/emulated/0/DCIM/Camera/PANO_20210706_193837.jpg, sizeBytes: 23079435} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4249, path: /storage/emulated/0/DCIM/Camera/IMG_20210706_174743.jpg, sizeBytes: 3720248} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2617, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1625521144640.jpg, sizeBytes: 57135} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2616, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1625509616896.jpg, sizeBytes: 84069} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2615, path: /storage/emulated/0/DCIM/Facebook/FB_IMG_1625509609173.jpg, sizeBytes: 71895} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6313, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210705-WA0004.jpg, sizeBytes: 65590} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7422, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210705-WA0003.jpg, sizeBytes: 96161} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7086, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210705-WA0000.jpg, sizeBytes: 378976} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7359, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210704-WA0028.jpg, sizeBytes: 148331} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7117, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210704-WA0026.jpg, sizeBytes: 132903} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7181, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210704-WA0027.jpg, sizeBytes: 144261} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7421, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210704-WA0025.jpg, sizeBytes: 141257} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 3457/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7309, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0016.jpg, sizeBytes: 125499} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7358, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0015.jpg, sizeBytes: 131380} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7492, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0014.jpg, sizeBytes: 121029} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7085, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0013.jpg, sizeBytes: 107464} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7491, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0012.jpg, sizeBytes: 108473} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6312, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0011.jpg, sizeBytes: 109887} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7215, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0010.jpg, sizeBytes: 107744} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7490, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0009.jpg, sizeBytes: 112343} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7582, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0008.jpg, sizeBytes: 116504} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7357, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0006.jpg, sizeBytes: 76779} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7581, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0007.jpg, sizeBytes: 62070} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7388, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210702-WA0005.jpg, sizeBytes: 96328} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7308, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210701-WA0030.jpg, sizeBytes: 152972} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7084, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210701-WA0028.jpg, sizeBytes: 171857} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7116, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210701-WA0011.jpg, sizeBytes: 543195} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7420, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210629-WA0000.jpg, sizeBytes: 84190} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7286, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210628-WA0007.jpg, sizeBytes: 99019} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2653, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-27-18-14-13-292_com.strava.jpg, sizeBytes: 773737} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6311, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210627-WA0005.jpg, sizeBytes: 393437} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7450, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210627-WA0004.jpg, sizeBytes: 386379} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7261, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210627-WA0003.jpg, sizeBytes: 396873} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7356, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210626-WA0003.jpg, sizeBytes: 332316} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3310, path: /storage/emulated/0/DCIM/Camera/IMG_20210626_093254.jpg, sizeBytes: 6512662} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7449, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0026.jpg, sizeBytes: 146468} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7489, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0025.jpg, sizeBytes: 227161} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7418, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0022.jpg, sizeBytes: 162953} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2708, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210625_201921.jpg, sizeBytes: 408927} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7488, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0021.jpg, sizeBytes: 373164} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7355, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0010.jpg, sizeBytes: 204825} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7542, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0007.jpg, sizeBytes: 176604} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7487, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210625-WA0006.jpg, sizeBytes: 83864} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7260, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0035.jpg, sizeBytes: 631714} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7448, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0034.jpg, sizeBytes: 643695} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7580, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0033.jpg, sizeBytes: 454809} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7486, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0032.jpg, sizeBytes: 466838} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6310, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0030.jpg, sizeBytes: 466223} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7083, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0031.jpg, sizeBytes: 435082} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7419, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0029.jpg, sizeBytes: 658932} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7180, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0028.jpg, sizeBytes: 334396} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2751, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-22-18-16-22-477_com.strava.jpg, sizeBytes: 805203} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4827, path: /storage/emulated/0/DCIM/Camera/IMG_20210622_114213.jpg, sizeBytes: 5540629} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7354, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0015.jpg, sizeBytes: 212402} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7541, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210622-WA0014.jpg, sizeBytes: 335713} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2638, path: /storage/emulated/0/DCIM/ReactNative-snapshot-image866497803399468491.jpg, sizeBytes: 737773} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6427, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210621-WA0017.jpg, sizeBytes: 503975} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7579, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210621-WA0014.jpg, sizeBytes: 247595} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7214, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210621-WA0013.jpg, sizeBytes: 263113} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6426, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210621-WA0010.jpg, sizeBytes: 114365} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3074, path: /storage/emulated/0/DCIM/Camera/IMG_20210621_104436.jpg, sizeBytes: 6915533} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7578, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0043.jpg, sizeBytes: 146355} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7259, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0042.jpg, sizeBytes: 213586} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7307, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0040.jpg, sizeBytes: 262066} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7540, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0041.jpg, sizeBytes: 181998} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7306, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0038.jpg, sizeBytes: 295954} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7539, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0039.jpg, sizeBytes: 245057} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6309, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210620-WA0037.jpg, sizeBytes: 207727} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3192, path: /storage/emulated/0/DCIM/Camera/IMG_20210620_121336.jpg, sizeBytes: 7314220} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7258, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0010.jpg, sizeBytes: 227643} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7305, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0008.jpeg, sizeBytes: 1452657} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6307, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0007.jpg, sizeBytes: 242391} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7213, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0006.jpg, sizeBytes: 235568} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7485, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210619-WA0005.jpg, sizeBytes: 221798} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7212, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210618-WA0011.jpg, sizeBytes: 269814} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7178, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210618-WA0010.jpg, sizeBytes: 234492} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4511, path: /storage/emulated/0/DCIM/Camera/IMG_20210617_200103.jpg, sizeBytes: 4222625} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2663, path: /storage/emulated/0/Download/montagna/Da Campitello di Fassa al Rifugio Alpe di Tires percorrendo la spettacolare Val Duron/Da Campitello di Fassa al Rifugio Alpe di Tires percorrendo la spettacolare Val Duron.rtfd/Schermata 2021-06-17 alle 12.36.29.png, sizeBytes: 53556} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2662, path: /storage/emulated/0/Download/montagna/Da Alba di Canazei ai rifugi Contrin e Passo San Nicolò/Da Alba di Canazei ai rifugi Contrin e Passo San Nicolò.rtfd/Schermata 2021-06-17 alle 12.33.32.png, sizeBytes: 52282} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2664, path: /storage/emulated/0/Download/montagna/Dal Rifugio Gardeccia al Rifugio Antermoia un giro ad anello sul Catinaccio/Dal Rifugio Gardeccia al Rifugio Antermoia un giro ad anello sul Catinaccio.rtfd/Schermata 2021-06-17 alle 12.30.28.png, sizeBytes: 51940} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2661, path: /storage/emulated/0/Download/montagna/Ciclabile della Val di Fiemme e Fassa/Ciclabile della Val di Fiemme e Fassa.rtfd/Schermata 2021-06-17 alle 12.26.05.png, sizeBytes: 47980} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2668, path: /storage/emulated/0/Download/montagna/Rifugio Re Alberto I° da Pera di Fassa/Rifugio Re Alberto I° da Pera di Fassa.rtfd/Schermata 2021-06-17 alle 12.23.29.png, sizeBytes: 52561} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2666, path: /storage/emulated/0/Download/montagna/Giro ad anello sul Catinaccio passando per i rifugi Roda di Vael, Fronza e Paolina/Roda di Vael, Fronza e Paolina.rtfd/Schermata 2021-06-17 alle 11.54.53.png, sizeBytes: 47749} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2665, path: /storage/emulated/0/Download/montagna/Giro ad anello alla Malga Vaèl e al Rifugio Ciampedie/Giro ad anello alla Malga Vaèl e al Rifugio Ciampedie.rtfd/Schermata 2021-06-17 alle 11.51.12.png, sizeBytes: 51800} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/png, uri: content://media/external/images/media/2667, path: /storage/emulated/0/Download/montagna/Mazzin - Rifugio Antermoia - Rifugio Dona -Mazzin/Mazzin - Rifugio Antermoia - Rifugio Dona.rtfd/Schermata 2021-06-17 alle 11.47.19.png, sizeBytes: 52755} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4102, path: /storage/emulated/0/DCIM/Camera/IMG_20210614_201745.jpg, sizeBytes: 3525981} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4230, path: /storage/emulated/0/DCIM/Camera/IMG_20210614_201741.jpg, sizeBytes: 3265503} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4420, path: /storage/emulated/0/DCIM/Camera/IMG_20210614_201035.jpg, sizeBytes: 3511387} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3349, path: /storage/emulated/0/DCIM/Camera/IMG_20210613_173905.jpg, sizeBytes: 964427} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3828, path: /storage/emulated/0/DCIM/Camera/IMG_20210613_102514.jpg, sizeBytes: 4986359} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3960, path: /storage/emulated/0/DCIM/Camera/IMG_20210613_102411.jpg, sizeBytes: 4004416} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7151, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210611-WA0001.jpg, sizeBytes: 90006} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7484, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210609-WA0003.jpg, sizeBytes: 587148} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7483, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210609-WA0002.jpg, sizeBytes: 535363} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7538, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210609-WA0001.jpg, sizeBytes: 497383} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7211, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210608-WA0021.jpg, sizeBytes: 281910} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6425, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210608-WA0020.jpg, sizeBytes: 181936} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7387, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210608-WA0015.jpg, sizeBytes: 489941} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7304, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210608-WA0000.jpg, sizeBytes: 251150} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2707, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210606_190023.jpg, sizeBytes: 100781} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2706, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210606_185954.jpg, sizeBytes: 239034} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2750, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-06-18-58-30-908_com.strava.jpg, sizeBytes: 279307} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2749, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-06-18-58-05-990_com.strava.jpg, sizeBytes: 635184} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4171, path: /storage/emulated/0/DCIM/Camera/IMG_20210606_094520.jpg, sizeBytes: 6030474} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2863, path: /storage/emulated/0/DCIM/Camera/IMG_20210606_094128.jpg, sizeBytes: 6277932} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3446, path: /storage/emulated/0/DCIM/Camera/PANO_20210606_093303.jpg, sizeBytes: 25582964} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4332, path: /storage/emulated/0/DCIM/Camera/PANO_20210606_093236.jpg, sizeBytes: 18972135} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4652, path: /storage/emulated/0/DCIM/Camera/PANO_20210606_092504.jpg, sizeBytes: 21608334} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7150, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210606-WA0003.jpg, sizeBytes: 677448} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 3554/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7257, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210606-WA0001.jpg, sizeBytes: 436012} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3249, path: /storage/emulated/0/DCIM/Camera/IMG_20210605_170411.jpg, sizeBytes: 3623437} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6308, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210603-WA0001.jpg, sizeBytes: 131616} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2652, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-06-02-19-16-06-101_com.strava.jpg, sizeBytes: 488957} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7179, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0049.jpg, sizeBytes: 223671} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7417, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0048.jpg, sizeBytes: 145517} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4569, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_181034.jpg, sizeBytes: 5050478} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6306, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0047.jpg, sizeBytes: 229115} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4668, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_181011.jpg, sizeBytes: 5136444} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7447, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0046.jpg, sizeBytes: 156771} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4738, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_180723.jpg, sizeBytes: 5190488} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2949, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_180710.jpg, sizeBytes: 5066649} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4530, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_180652.jpg, sizeBytes: 7473092} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6305, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0044.jpg, sizeBytes: 323103} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6304, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0043.jpg, sizeBytes: 346247} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7446, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0042.jpg, sizeBytes: 517442} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7177, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0041.jpg, sizeBytes: 410277} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7577, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0040.jpg, sizeBytes: 455963} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6303, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0038.jpg, sizeBytes: 545500} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6424, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0039.jpg, sizeBytes: 453964} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7537, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0037.jpg, sizeBytes: 527344} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7210, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0036.jpg, sizeBytes: 460139} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7256, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0034.jpg, sizeBytes: 565685} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7482, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0035.jpg, sizeBytes: 756422} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6302, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0033.jpg, sizeBytes: 332439} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7445, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0032.jpg, sizeBytes: 770943} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7416, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0030.jpg, sizeBytes: 298731} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7481, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0031.jpg, sizeBytes: 449431} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6301, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0029.jpg, sizeBytes: 428582} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7480, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0028.jpg, sizeBytes: 333370} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3774, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_173923.jpg, sizeBytes: 5624149} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4041, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_173903.jpg, sizeBytes: 5153318} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7176, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0026.jpg, sizeBytes: 172853} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7209, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0027.jpg, sizeBytes: 133944} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7535, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0010.jpg, sizeBytes: 181082} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4068, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_140246.jpg, sizeBytes: 3970564} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3443, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_140215.jpg, sizeBytes: 3670328} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3210, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_140120.jpg, sizeBytes: 3905851} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4667, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_140118.jpg, sizeBytes: 3903186} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3959, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_140046.jpg, sizeBytes: 2634799} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4271, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_104444.jpg, sizeBytes: 4049446} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4378, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_104441.jpg, sizeBytes: 4599769} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3190, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_100736.jpg, sizeBytes: 5298753} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4718, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_100703.jpg, sizeBytes: 6811202} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4067, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_100637.jpg, sizeBytes: 5010708} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): SqfliteLocalMediaDb saveMetadata complete in 27ms for 400 entries +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3095, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_100557.jpg, sizeBytes: 6828207} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4326, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_100532.jpg, sizeBytes: 6115236} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3497, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_100449.jpg, sizeBytes: 6034151} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3422, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_100428.jpg, sizeBytes: 7184913} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4782, path: /storage/emulated/0/DCIM/Camera/IMG_20210602_100423.jpg, sizeBytes: 6513468} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6423, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210602-WA0005.jpg, sizeBytes: 139179} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2748, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-31-20-04-42-767_com.alltrails.alltrails.jpg, sizeBytes: 540676} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6300, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0013.jpg, sizeBytes: 257703} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7479, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0012.jpg, sizeBytes: 251376} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6299, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0011.jpg, sizeBytes: 259765} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7149, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0010.jpg, sizeBytes: 224422} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7148, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0009.jpg, sizeBytes: 257722} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7255, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0008.jpg, sizeBytes: 260107} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7386, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210531-WA0007.jpg, sizeBytes: 246259} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3629, path: /storage/emulated/0/DCIM/Camera/IMG_20210531_074942.jpg, sizeBytes: 6965358} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6533, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0045.jpg, sizeBytes: 400295} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7303, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0044.jpg, sizeBytes: 381864} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7478, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0043.jpg, sizeBytes: 336846} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7115, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0042.jpg, sizeBytes: 409890} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7147, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0041.jpg, sizeBytes: 456283} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7444, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210530-WA0040.jpg, sizeBytes: 457452} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3773, path: /storage/emulated/0/DCIM/Camera/IMG_20210530_115509.jpg, sizeBytes: 4783422} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2747, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-30-10-54-34-554_com.brytonsport.active.jpg, sizeBytes: 453509} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2651, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-30-10-52-33-818_com.brytonsport.active.jpg, sizeBytes: 381893} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2746, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-30-10-51-47-666_com.brytonsport.active.jpg, sizeBytes: 686556} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3445, path: /storage/emulated/0/DCIM/Camera/PANO_20210530_092918.jpg, sizeBytes: 21235984} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4651, path: /storage/emulated/0/DCIM/Camera/PANO_20210530_092903.jpg, sizeBytes: 18617937} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4761, path: /storage/emulated/0/DCIM/Camera/IMG_20210530_092740.jpg, sizeBytes: 5171688} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4917, path: /storage/emulated/0/DCIM/Camera/IMG_20210530_092732.jpg, sizeBytes: 4463325} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3666, path: /storage/emulated/0/DCIM/Camera/IMG_20210530_075649.jpg, sizeBytes: 3395419} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4587, path: /storage/emulated/0/DCIM/Camera/IMG_20210529_200103.jpg, sizeBytes: 3021577} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4040, path: /storage/emulated/0/DCIM/Camera/IMG_20210529_200046.jpg, sizeBytes: 3353403} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6532, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210528-WA0000.jpg, sizeBytes: 111795} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3958, path: /storage/emulated/0/DCIM/Camera/IMG_20210526_132754.jpg, sizeBytes: 5560675} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3474, path: /storage/emulated/0/DCIM/Camera/IMG_20210526_132754_1.jpg, sizeBytes: 4799389} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4781, path: /storage/emulated/0/DCIM/Camera/IMG_20210526_132606.jpg, sizeBytes: 4113684} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6745, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210523-WA0035.jpg, sizeBytes: 149972} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6298, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0079.jpg, sizeBytes: 165273} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7254, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0078.jpg, sizeBytes: 144567} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6530, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0077.jpg, sizeBytes: 527379} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7576, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0076.jpg, sizeBytes: 432430} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7477, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0075.jpg, sizeBytes: 123825} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7253, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0074.jpg, sizeBytes: 138622} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7146, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0072.jpg, sizeBytes: 234150} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7415, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0071.jpg, sizeBytes: 396002} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7252, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0070.jpg, sizeBytes: 245226} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6743, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0069.jpg, sizeBytes: 349910} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7251, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0068.jpg, sizeBytes: 267273} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7414, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0067.jpg, sizeBytes: 345092} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7536, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0066.jpg, sizeBytes: 461840} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6422, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0065.jpg, sizeBytes: 278992} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7207, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0064.jpg, sizeBytes: 306717} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7413, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0062.jpg, sizeBytes: 331716} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7575, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0063.jpg, sizeBytes: 434643} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7208, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0061.jpg, sizeBytes: 212184} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 3654/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6851, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0060.jpg, sizeBytes: 424872} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6744, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0059.jpg, sizeBytes: 320271} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6421, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0058.jpg, sizeBytes: 150297} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3209, path: /storage/emulated/0/DCIM/Camera/IMG_20210522_192118.jpg, sizeBytes: 5152741} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4270, path: /storage/emulated/0/DCIM/Camera/IMG_20210522_192110.jpg, sizeBytes: 5430040} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4612, path: /storage/emulated/0/DCIM/Camera/IMG_20210522_181245.jpg, sizeBytes: 5141288} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2912, path: /storage/emulated/0/DCIM/Camera/IMG_20210522_181217.jpg, sizeBytes: 3824204} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4737, path: /storage/emulated/0/DCIM/Camera/IMG_20210522_181147.jpg, sizeBytes: 4021022} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4895, path: /storage/emulated/0/DCIM/Camera/IMG_20210522_180733.jpg, sizeBytes: 5942653} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3442, path: /storage/emulated/0/DCIM/Camera/IMG_20210522_180729.jpg, sizeBytes: 5040312} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7250, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0014.jpg, sizeBytes: 317100} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6420, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0013.jpg, sizeBytes: 264442} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7574, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210522-WA0012.jpg, sizeBytes: 368723} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7249, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210520-WA0004.jpeg, sizeBytes: 2188091} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4932, path: /storage/emulated/0/DCIM/Camera/IMG_20210517_111932.jpg, sizeBytes: 6194377} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3539, path: /storage/emulated/0/DCIM/Camera/IMG_20210517_105727.jpg, sizeBytes: 8299048} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3538, path: /storage/emulated/0/DCIM/Camera/IMG_20210516_170546.jpg, sizeBytes: 2864824} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3732, path: /storage/emulated/0/DCIM/Camera/IMG_20210516_170523.jpg, sizeBytes: 4372280} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3402, path: /storage/emulated/0/DCIM/Camera/IMG_20210516_170106.jpg, sizeBytes: 4338238} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4529, path: /storage/emulated/0/DCIM/Camera/IMG_20210516_170040.jpg, sizeBytes: 4643081} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4209, path: /storage/emulated/0/DCIM/Camera/IMG_20210516_165921.jpg, sizeBytes: 4160981} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3473, path: /storage/emulated/0/DCIM/Camera/IMG_20210516_165907.jpg, sizeBytes: 2356843} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4611, path: /storage/emulated/0/DCIM/Camera/IMG_20210516_165705.jpg, sizeBytes: 4632466} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4004, path: /storage/emulated/0/DCIM/Camera/IMG_20210515_221432.jpg, sizeBytes: 4680240} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2745, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-15-19-40-21-566_com.brytonsport.active.jpg, sizeBytes: 713289} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3610, path: /storage/emulated/0/DCIM/Camera/IMG_20210515_151134.jpg, sizeBytes: 4648032} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2879, path: /storage/emulated/0/DCIM/Camera/IMG_20210515_145435.jpg, sizeBytes: 7935985} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4121, path: /storage/emulated/0/DCIM/Camera/IMG_20210515_145429.jpg, sizeBytes: 7810632} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4080, path: /storage/emulated/0/DCIM/Camera/IMG_20210515_125356.jpg, sizeBytes: 4302598} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4377, path: /storage/emulated/0/DCIM/Camera/IMG_20210515_103356.jpg, sizeBytes: 6358341} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4456, path: /storage/emulated/0/DCIM/Camera/IMG_20210515_103321.jpg, sizeBytes: 7434694} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3385, path: /storage/emulated/0/DCIM/Camera/IMG_20210515_103138.jpg, sizeBytes: 6209952} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3748, path: /storage/emulated/0/DCIM/Camera/IMG_20210515_103134.jpg, sizeBytes: 6341251} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4003, path: /storage/emulated/0/DCIM/Camera/IMG_20210515_103112.jpg, sizeBytes: 6146567} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4325, path: /storage/emulated/0/DCIM/Camera/IMG_20210512_232119.jpg, sizeBytes: 4468066} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3609, path: /storage/emulated/0/DCIM/Camera/IMG_20210511_121350.jpg, sizeBytes: 4259165} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3643, path: /storage/emulated/0/DCIM/Camera/IMG_20210511_121256.jpg, sizeBytes: 4533840} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3878, path: /storage/emulated/0/DCIM/Camera/IMG_20210511_121219.jpg, sizeBytes: 4460000} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3151, path: /storage/emulated/0/DCIM/Camera/IMG_20210511_121215.jpg, sizeBytes: 4399902} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3053, path: /storage/emulated/0/DCIM/Camera/IMG_20210511_080342.jpg, sizeBytes: 7617836} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2744, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-10-22-52-15-341_com.strava.jpg, sizeBytes: 629952} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2743, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-05-10-22-09-47-430_com.brytonsport.active.jpg, sizeBytes: 618877} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4921, path: /storage/emulated/0/DCIM/Camera/PANO_20210510_192704.jpg, sizeBytes: 15158818} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3368, path: /storage/emulated/0/DCIM/Camera/PANO_20210510_192648.jpg, sizeBytes: 14600528} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3791, path: /storage/emulated/0/DCIM/Camera/IMG_20210510_192145.jpg, sizeBytes: 6878863} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3348, path: /storage/emulated/0/DCIM/Camera/IMG_20210510_191400.jpg, sizeBytes: 6711810} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3158, path: /storage/emulated/0/DCIM/Camera/PANO_20210510_183453.jpg, sizeBytes: 19157435} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4425, path: /storage/emulated/0/DCIM/Camera/PANO_20210510_182738.jpg, sizeBytes: 20601930} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7248, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0021.jpg, sizeBytes: 207397} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6531, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0020.jpg, sizeBytes: 253237} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6742, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0019.jpg, sizeBytes: 299510} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7412, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0018.jpg, sizeBytes: 257270} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7144, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0016.jpg, sizeBytes: 649124} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7145, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210510-WA0017.jpg, sizeBytes: 414928} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3712, path: /storage/emulated/0/DCIM/Camera/IMG_20210507_214529.jpg, sizeBytes: 4063891} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3628, path: /storage/emulated/0/DCIM/Camera/IMG_20210507_214527.jpg, sizeBytes: 4125236} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4894, path: /storage/emulated/0/DCIM/Camera/IMG_20210507_214446.jpg, sizeBytes: 4159509} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4208, path: /storage/emulated/0/DCIM/Camera/IMG_20210507_112903.jpg, sizeBytes: 5144404} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3711, path: /storage/emulated/0/DCIM/Camera/IMG_20210503_222931.jpg, sizeBytes: 5312232} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4170, path: /storage/emulated/0/DCIM/Camera/IMG_20210503_222924.jpg, sizeBytes: 5291587} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3401, path: /storage/emulated/0/DCIM/Camera/IMG_20210503_222915.jpg, sizeBytes: 4469376} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7143, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210502-WA0005.jpg, sizeBytes: 189587} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6297, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210502-WA0004.jpg, sizeBytes: 93555} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7573, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210502-WA0003.jpg, sizeBytes: 237313} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7411, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0055.jpg, sizeBytes: 410077} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6419, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0040.jpg, sizeBytes: 119000} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6739, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0007.jpg, sizeBytes: 181992} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6850, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0054.jpg, sizeBytes: 149325} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6849, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0053.jpg, sizeBytes: 152135} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6296, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0045.jpg, sizeBytes: 360997} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6529, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0044.jpg, sizeBytes: 257211} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6295, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0041.jpg, sizeBytes: 127775} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6418, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0039.jpg, sizeBytes: 261800} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6848, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0038.jpg, sizeBytes: 375379} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6741, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0037.jpg, sizeBytes: 255127} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7247, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0035.jpg, sizeBytes: 312427} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6528, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0034.jpg, sizeBytes: 214207} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6847, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0033.jpg, sizeBytes: 399104} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6527, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0032.jpg, sizeBytes: 107487} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6844, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0031.jpg, sizeBytes: 260679} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6846, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0030.jpg, sizeBytes: 259861} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7410, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0026.jpg, sizeBytes: 118607} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6417, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0024.jpg, sizeBytes: 236002} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6740, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0021.jpg, sizeBytes: 359930} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6293, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0019.jpg, sizeBytes: 357436} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4666, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_131608.jpg, sizeBytes: 6892574} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4847, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_131607.jpg, sizeBytes: 6728669} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3308, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_131559.jpg, sizeBytes: 5458200} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4868, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_131552.jpg, sizeBytes: 5916700} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4510, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_131530.jpg, sizeBytes: 6240808} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4490, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_131519.jpg, sizeBytes: 6365439} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4867, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_120734.jpg, sizeBytes: 5381392} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4984, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_120339.jpg, sizeBytes: 6996546} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3496, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_120338.jpg, sizeBytes: 7291707} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4002, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_120320.jpg, sizeBytes: 6947261} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4156, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_114114.jpg, sizeBytes: 6052023} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4312, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_113721.jpg, sizeBytes: 5815782} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3688, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_113713.jpg, sizeBytes: 5881644} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4983, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_113649.jpg, sizeBytes: 5848568} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2931, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_113630.jpg, sizeBytes: 7176339} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 3754/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3627, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_112416.jpg, sizeBytes: 6209190} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3710, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_112246.jpg, sizeBytes: 5471893} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2930, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_111843.jpg, sizeBytes: 6699184} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2848, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_111628.jpg, sizeBytes: 4155879} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7142, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210501-WA0008.jpg, sizeBytes: 136110} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4229, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_111047.jpg, sizeBytes: 5296945} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3945, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_111041.jpg, sizeBytes: 5963770} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3495, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_110905.jpg, sizeBytes: 5604992} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3587, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_110833.jpg, sizeBytes: 5067564} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4402, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_110828.jpg, sizeBytes: 5680743} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4357, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_110824.jpg, sizeBytes: 5127929} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3052, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_110803.jpg, sizeBytes: 6160966} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4550, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_110724.jpg, sizeBytes: 4058118} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3626, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_110721.jpg, sizeBytes: 3819312} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4120, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_110719.jpg, sizeBytes: 3850824} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2929, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_105959.jpg, sizeBytes: 5227224} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4635, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_105935.jpg, sizeBytes: 6454547} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3232, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_105822.jpg, sizeBytes: 4830134} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3291, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_105537.jpg, sizeBytes: 6183605} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3665, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_105440.jpg, sizeBytes: 5484491} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4419, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_105328.jpg, sizeBytes: 6738125} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3248, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_105019.jpg, sizeBytes: 5853805} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3009, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_101927.jpg, sizeBytes: 6857991} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3537, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_101925.jpg, sizeBytes: 6752936} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3608, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_101926.jpg, sizeBytes: 6847683} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3900, path: /storage/emulated/0/DCIM/Camera/IMG_20210501_101922.jpg, sizeBytes: 6651366} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7152, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG_20210426_220825.jpg, sizeBytes: 58943} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6294, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0015.jpg, sizeBytes: 156257} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6843, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0016.jpg, sizeBytes: 150627} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6845, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0017.jpg, sizeBytes: 112325} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7141, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0013.jpg, sizeBytes: 149428} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7246, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0014.jpg, sizeBytes: 154189} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7245, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0010.jpg, sizeBytes: 81616} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6738, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210426-WA0009.jpg, sizeBytes: 185252} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6416, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0030.jpg, sizeBytes: 300281} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6842, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0029.jpg, sizeBytes: 295756} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6841, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0019.jpg, sizeBytes: 732464} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7140, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0018.jpg, sizeBytes: 606252} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6526, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210425-WA0011.jpg, sizeBytes: 127055} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2650, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-04-24-18-00-34-132_com.strava.jpg, sizeBytes: 578683} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6414, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210421-WA0004.jpg, sizeBytes: 39842} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7534, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210420-WA0002.jpg, sizeBytes: 210338} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7302, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210420-WA0001.jpg, sizeBytes: 182443} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2705, path: /storage/emulated/0/DCIM/Screenshots/IMG_20210418_185707.jpg, sizeBytes: 226073} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2689, path: /storage/emulated/0/Pictures/AdobeLightroom/IMG_20210418_142609.jpg, sizeBytes: 5420450} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2688, path: /storage/emulated/0/Pictures/AdobeLightroom/IMG_20210418_105404.jpg, sizeBytes: 4440803} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2649, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-04-18-14-12-25-530_com.dopa.android.blevo.jpg, sizeBytes: 475153} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6291, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0003.jpg, sizeBytes: 490702} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6524, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0005.jpg, sizeBytes: 518655} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6737, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0002.jpg, sizeBytes: 256052} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6292, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0008.jpg, sizeBytes: 485671} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7139, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0004.jpg, sizeBytes: 593373} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6840, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210418-WA0001.jpg, sizeBytes: 283068} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3850, path: /storage/emulated/0/DCIM/Camera/IMG_20210418_105404.jpg, sizeBytes: 5382458} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6736, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210417-WA0008.jpg, sizeBytes: 486658} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6839, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210416-WA0010.jpg, sizeBytes: 249059} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4376, path: /storage/emulated/0/DCIM/Camera/IMG_20210414_212118.jpg, sizeBytes: 2954257} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4022, path: /storage/emulated/0/DCIM/Camera/IMG_20210414_211935.jpg, sizeBytes: 4053192} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2993, path: /storage/emulated/0/DCIM/Camera/IMG_20210414_211933.jpg, sizeBytes: 3952800} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3520, path: /storage/emulated/0/DCIM/Camera/IMG_20210414_211932.jpg, sizeBytes: 3988035} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2811, path: /storage/emulated/0/DCIM/Camera/IMG_20210414_211900.jpg, sizeBytes: 4237656} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3899, path: /storage/emulated/0/DCIM/Camera/IMG_20210414_211857.jpg, sizeBytes: 4089503} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3586, path: /storage/emulated/0/DCIM/Camera/IMG_20210414_211854.jpg, sizeBytes: 4345814} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7300, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210414-WA0000.jpg, sizeBytes: 719485} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2687, path: /storage/emulated/0/Pictures/AdobeLightroom/IMG_20210413_213711.jpg, sizeBytes: 2820729} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4801, path: /storage/emulated/0/DCIM/Camera/IMG_20210413_213802.jpg, sizeBytes: 2830302} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4703, path: /storage/emulated/0/DCIM/Camera/IMG_20210413_213711.jpg, sizeBytes: 3762516} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3094, path: /storage/emulated/0/DCIM/Camera/IMG_20210413_213708.jpg, sizeBytes: 3876842} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4508, path: /storage/emulated/0/DCIM/Camera/IMG_20210413_213512.jpg, sizeBytes: 4526950} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3384, path: /storage/emulated/0/DCIM/Camera/IMG_20210413_213409.jpg, sizeBytes: 4457230} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/5022, path: /storage/emulated/0/DCIM/Camera/IMG_20210413_213331.jpg, sizeBytes: 4456419} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4665, path: /storage/emulated/0/DCIM/Camera/IMG_20210413_213203.jpg, sizeBytes: 4594270} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4610, path: /storage/emulated/0/DCIM/Camera/IMG_20210413_212344.jpg, sizeBytes: 4476279} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3268, path: /storage/emulated/0/DCIM/Camera/IMG_20210413_074852.jpg, sizeBytes: 4650758} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2742, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-04-09-08-27-45-406_com.brytonsport.active.jpg, sizeBytes: 613861} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3231, path: /storage/emulated/0/DCIM/Camera/IMG_20210408_201456.jpg, sizeBytes: 4710120} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4189, path: /storage/emulated/0/DCIM/Camera/IMG_20210407_173649.jpg, sizeBytes: 4594038} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7532, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210406-WA0011.jpg, sizeBytes: 164529} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7533, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210406-WA0009.jpg, sizeBytes: 246904} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6838, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210406-WA0008.jpg, sizeBytes: 208282} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7409, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210406-WA0007.jpg, sizeBytes: 515004} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2992, path: /storage/emulated/0/DCIM/Camera/IMG_20210403_105452.jpg, sizeBytes: 8192143} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4021, path: /storage/emulated/0/DCIM/Camera/IMG_20210403_105441.jpg, sizeBytes: 8950263} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2648, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-04-01-18-49-27-951_com.strava.jpg, sizeBytes: 498472} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6735, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0035.jpeg, sizeBytes: 2201782} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2741, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-03-28-19-36-34-272_com.google.android.googlequicksearchbox.jpg, sizeBytes: 652883} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6290, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0023.jpg, sizeBytes: 104186} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6734, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0022.jpg, sizeBytes: 108189} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6525, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0021.jpg, sizeBytes: 279990} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7531, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0019.jpg, sizeBytes: 452339} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7572, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0011.jpg, sizeBytes: 126582} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6733, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0010.jpg, sizeBytes: 120755} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6415, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210328-WA0009.jpg, sizeBytes: 109706} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3625, path: /storage/emulated/0/DCIM/Camera/IMG_20210328_112815.jpg, sizeBytes: 6648805} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Cataloguing, message: 3848/6956} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3560, path: /storage/emulated/0/DCIM/Camera/PANO_20210328_102259.jpg, sizeBytes: 20989729} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2957, path: /storage/emulated/0/DCIM/Camera/PANO_20210328_102247.jpg, sizeBytes: 5546925} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6837, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210327-WA0003.jpg, sizeBytes: 229343} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7530, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210326-WA0002.jpg, sizeBytes: 51923} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4549, path: /storage/emulated/0/DCIM/Camera/IMG_20210319_182759.jpg, sizeBytes: 5540599} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3382, path: /storage/emulated/0/DCIM/Camera/IMG_20210319_172427.jpg, sizeBytes: 4933717} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4065, path: /storage/emulated/0/DCIM/Camera/IMG_20210319_103315.jpg, sizeBytes: 4550609} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3381, path: /storage/emulated/0/DCIM/Camera/IMG_20210318_172129.jpg, sizeBytes: 6225566} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3208, path: /storage/emulated/0/DCIM/Camera/IMG_20210318_172109.jpg, sizeBytes: 5137483} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4528, path: /storage/emulated/0/DCIM/Camera/IMG_20210318_172058.jpg, sizeBytes: 4753249} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3664, path: /storage/emulated/0/DCIM/Camera/IMG_20210318_172049.jpg, sizeBytes: 5120823} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4527, path: /storage/emulated/0/DCIM/Camera/IMG_20210318_172006.jpg, sizeBytes: 3044666} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2991, path: /storage/emulated/0/DCIM/Camera/IMG_20210318_111751.jpg, sizeBytes: 5003807} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7301, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0037.jpg, sizeBytes: 103375} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6835, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0021.jpg, sizeBytes: 51638} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6289, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0008.jpg, sizeBytes: 417453} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6523, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0009.jpg, sizeBytes: 294662} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6288, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0005.jpg, sizeBytes: 599484} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6413, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0007.jpg, sizeBytes: 71703} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6732, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210317-WA0006.jpg, sizeBytes: 70515} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6285, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210316-WA0011.jpg, sizeBytes: 324879} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7244, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210316-WA0010.jpg, sizeBytes: 407794} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7529, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210315-WA0012.jpg, sizeBytes: 158090} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3943, path: /storage/emulated/0/DCIM/Camera/IMG_20210315_101713.jpg, sizeBytes: 7299756} +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6836, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210314-WA0003.jpg, sizeBytes: 267793} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6731, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210314-WA0002.jpg, sizeBytes: 230934} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7528, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210314-WA0001.jpg, sizeBytes: 227320} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6412, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210313-WA0026.jpg, sizeBytes: 60892} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6287, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210311-WA0008.jpg, sizeBytes: 568558} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6730, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210311-WA0009.jpg, sizeBytes: 652273} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6410, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210311-WA0007.jpg, sizeBytes: 576508} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2740, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-03-10-20-22-16-963_com.stt.android.suunto.jpg, sizeBytes: 290165} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7243, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210307-WA0024.jpg, sizeBytes: 217382} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2739, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-03-07-14-15-21-516_com.brytonsport.active.jpg, sizeBytes: 536896} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7242, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210307-WA0006.jpg, sizeBytes: 228483} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7571, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210307-WA0004.jpg, sizeBytes: 305117} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3772, path: /storage/emulated/0/DCIM/Camera/IMG_20210307_092233.jpg, sizeBytes: 7709690} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6729, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210305-WA0012.jpg, sizeBytes: 60069} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4609, path: /storage/emulated/0/DCIM/Camera/IMG_20210305_131155.jpg, sizeBytes: 5266601} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3535, path: /storage/emulated/0/DCIM/Camera/IMG_20210301_115129.jpg, sizeBytes: 4732635} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4678, path: /storage/emulated/0/DCIM/Camera/IMG_20210224_105850.jpg, sizeBytes: 4634636} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3957, path: /storage/emulated/0/DCIM/Camera/IMG_20210221_190603.jpg, sizeBytes: 5262686} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2738, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-02-21-08-08-41-976_de.komoot.android.jpg, sizeBytes: 778868} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2647, path: /storage/emulated/0/DCIM/Screenshots/Screenshot_2021-02-21-07-58-13-676_de.komoot.android.jpg, sizeBytes: 329943} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4931, path: /storage/emulated/0/DCIM/Camera/IMG_20210220_132123.jpg, sizeBytes: 3951382} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3206, path: /storage/emulated/0/DCIM/Camera/IMG_20210220_131626.jpg, sizeBytes: 5564882} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3607, path: /storage/emulated/0/DCIM/Camera/IMG_20210220_131609.jpg, sizeBytes: 6813600} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6522, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210220-WA0011.jpg, sizeBytes: 515802} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6411, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210220-WA0010.jpg, sizeBytes: 313954} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6521, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210220-WA0009.jpg, sizeBytes: 505252} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6834, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210220-WA0008.jpg, sizeBytes: 435872} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4567, path: /storage/emulated/0/DCIM/Camera/IMG_20210220_125433.jpg, sizeBytes: 5518083} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3898, path: /storage/emulated/0/DCIM/Camera/IMG_20210220_125423.jpg, sizeBytes: 5579184} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3134, path: /storage/emulated/0/DCIM/Camera/PANO_20210220_100341.jpg, sizeBytes: 21700853} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4893, path: /storage/emulated/0/DCIM/Camera/IMG_20210220_100335.jpg, sizeBytes: 6254352} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4633, path: /storage/emulated/0/DCIM/Camera/IMG_20210220_100333.jpg, sizeBytes: 6212418} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3093, path: /storage/emulated/0/DCIM/Camera/IMG_20210219_144310.jpg, sizeBytes: 121768} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2809, path: /storage/emulated/0/DCIM/Camera/IMG_20210219_143734.jpg, sizeBytes: 3519907} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6728, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0038.jpg, sizeBytes: 220852} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6520, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0037.jpg, sizeBytes: 105509} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6727, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0034.jpg, sizeBytes: 127897} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/2888, path: /storage/emulated/0/DCIM/Camera/IMG_20210213_200728.jpg, sizeBytes: 4846307} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3347, path: /storage/emulated/0/DCIM/Camera/IMG_20210213_200724.jpg, sizeBytes: 5001841} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3189, path: /storage/emulated/0/DCIM/Camera/IMG_20210213_200539.jpg, sizeBytes: 2954130} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3897, path: /storage/emulated/0/DCIM/Camera/IMG_20210213_192803.jpg, sizeBytes: 5008204} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/4664, path: /storage/emulated/0/DCIM/Camera/IMG_20210213_192744.jpg, sizeBytes: 5137411} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3307, path: /storage/emulated/0/DCIM/Camera/IMG_20210213_191034.jpg, sizeBytes: 4388509} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6639, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0032.jpg, sizeBytes: 104591} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7527, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0024.jpg, sizeBytes: 137024} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6638, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0007.jpg, sizeBytes: 133121} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/7570, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0006.jpg, sizeBytes: 140061} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/6726, path: /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Images/IMG-20210213-WA0003.jpg, sizeBytes: 138138} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/metadata_fetch method=getCatalogMetadata arguments={mimeType: image/jpeg, uri: content://media/external/images/media/3346, path: /storage/emulated/0/DCIM/Camera/IMG_20210213_074728.jpg, sizeBytes: 6186375} +I/flutter (26629): AvesMethodChannel invokeMethod name=deckers.thibault/aves/device method=getAvailableHeapSize arguments=null +I/WM-Processor(26629): Moving WorkSpec (c7124144-9182-40b2-9ae5-745f18d08f9e) to the foreground +D/WM-SystemFgDispatcher(26629): Notifying with (id:1, workSpecId: c7124144-9182-40b2-9ae5-745f18d08f9e, notificationType :1) +I/d.t.a.AnalysisWorker(26629): Clean analysis worker c7124144-9182-40b2-9ae5-745f18d08f9e +I/media_kit(26629): package:media_kit_libs_android_video detached. +W/FlutterJNI(26629): Tried to send a platform message response, but FlutterJNI was detached from native C++. Could not send. Response ID: 22689 +I/WM-WorkerWrapper(26629): Worker result SUCCESS for Work [ id=c7124144-9182-40b2-9ae5-745f18d08f9e, tags={ deckers.thibault.aves.AnalysisWorker } ] +D/WM-Processor(26629): Processor c7124144-9182-40b2-9ae5-745f18d08f9e executed; reschedule = false +D/WM-SystemJobService(26629): c7124144-9182-40b2-9ae5-745f18d08f9e executed on JobScheduler +D/WM-SystemFgDispatcher(26629): Removing Notification (id: 1, workSpecId: WorkGenerationalId(workSpecId=c7124144-9182-40b2-9ae5-745f18d08f9e, generation=0), notificationType: 1 +I/WM-SystemFgDispatcher(26629): Stopping foreground service +D/WM-SystemFgService(26629): Shutting down. +D/WM-PackageManagerHelper(26629): androidx.work.impl.background.systemalarm.RescheduleReceiver disabled +D/WM-GreedyScheduler(26629): Cancelling work ID c7124144-9182-40b2-9ae5-745f18d08f9e +D/WM-SystemJobService(26629): onStopJob for WorkGenerationalId(workSpecId=c7124144-9182-40b2-9ae5-745f18d08f9e, generation=0) +E/FileUtils(26629): err write to mi_exception_log diff --git a/docs/queued_ids.txt b/docs/queued_ids.txt new file mode 100644 index 0000000..6d220b5 --- /dev/null +++ b/docs/queued_ids.txt @@ -0,0 +1,101 @@ +b3cda38a2fdee7ba9bdd2ea07d936b2fa5361baa21be2b2c29f1ad8ebcc4c31e +09ef919ff2a105ad75d2e7631b9c02228c1784df5048c98276fd379f1533360b +dba1de0e187650e62118279beb2d83e8759a6d4fb8a5412a6a18cdc4e01a33d7 +751d8a15766bf2686bc87e60b33b4a8c38befe454428e6a5a82b00f26026c0e0 +73dfd75dd639da9c7c0d4a6244f189a833d543bfdd4059b06f9f98e49f83c937 +f32173d43d16b47eda3e7a32257ec956287d60b0516a5f6e46a8d1d433f53fd8 +90c0a0932fdfa3eefb64156dec5b366c4af5245def4cc619d8eee29ca72cd7fe +4d74430aa1fbc45154ad4e8bf43bff334065ebd2757367806d4b8c165c9a7935 +1955c91d411219c131c210b97fe38eb78df83be6ca12cdc845b952bcb78abc6f +14616f6446b0ffc01895f24db1656fa0b7a33da3b9e8c8e24065647faa2138f2 +7668b4a6cf960b548a0bd1480444a3a039a4ca59d16656d2a1a3ca80a11eaa41 +4a10ae72b84c6e205c8295dc1f94b5407d78f25576707fba0f3bb9093e70ce1c +490631b5d03e797f7ca50b5e42be1cdabafd54b20804b51d2c9565aef18de750 +1a9759607a60387b7ff383fce2fce32f5e5aba91c0b0d3e09c1c2763c40334be +486d095f85a006800b9d3760e2ef4ac7ba909d82ba1347800a273d99395962a3 +69eb91132640feeb561e94bb3258ca69c41e27ca711cb814c2ac33270599167a +1da97cbc6e7914cbd33e4dbd51729cd45f1c77116c1f5be9531adeb6424eb6e2 +7fbc8546424236f94107681a69ed37fa94159377cf378a44f9d0e907a2afd31a +35772196ab28b9fd957199f81b267c9b99097055bfdcf1749e0c772241681cac +48b26b6f9aaf835dd90e6098194dedfbee75b85c20429d939188e70873dd4274 +10ca45bc5aab42b5ba08da7d6a15d7f942478ca5e052f89054097c93d3dd6134 +c6b58236822fab393b8793af2991115182afaf13b26a27394c4d5d6a799d0969 +1d4945502b8686c4f4dc3ea94bfb37db7587d505e6c411bdf11976402c000e90 +bf2f60a20771c3647d605a7cc192b95a7e078b7c6530ad30462ee6a2794c9df0 +7d753539885cd882a1fdf04241eda6bfb8332ba1ed32bfc078dbadb3e5eb321f +29eb6ed3cd8e3d85e0803d091291b75677e6de2702918a286047894e444d669b +ebaf024e4df7764c2c458484d6e6eef1ced76611dd70b84f82af46337ba13839 +c782108a839231c6dda63924f0b855747f98a4f56d8e93390f70877d4a452db6 +f56db1595a3b822e1e5cc119c101904285dca3f3f1b8edbf0bfa42999583cc2f +5d03b5d0866a5cce0b6a12b78173c1f77eef5b1e5bfc5a4fd8e2cfd1c53a2b8e +dd715de9995fd11a23fee1df7c1561ea45bd215e765e9e93b2efc3f2ca59c39c +8e1a2d2abbd36803ec8670f56869ae723c4c8c8fcd5e634ada9f988c942df1b8 +46412728d6155abe53abfec76c97898aad60e36322a46f4a4da280fba8c7c0cc +999cc0997f51584fef2627c5c9bd87d2f41cd9fe52d930fdc85f791c6adc328e +7ed0d6366274f3cadfc4caa618847c9c6c250e6b55127367d4ad1e3ca8322436 +4025ea19107cf40d092576e4aaa122bdfb027dc90592a50dd6fa8131838dae69 +d91b81a39d72056b2b7eb5bbf6058cf5b5df85cd5d9ca7e2a1bc7e9b897ebfb4 +49a2098503bd07db18c869b17419352a0a2232389b3cad98cbb013ad42882600 +a856fcea4cade1ed9c59dab96f180c06f18bc97a39654301ad623aed4a4979d7 +fd3df96d42b300c66332b98ce7639a79ae07aa0cbadf6ebbd283901bcca510c6 +c8ada02d1e1b7155607e905de25546c0a079c39528fe6df0b601a9c7b5f5df93 +7351a37b3092015b6dee6e2911581ce590043619497ca84240b71e5ee37a0d2d +23852fb024f46c21667b30107942c40d57429b37c0df1549ab32004a739d792f +0ed7a1b65e9181db517fc4b75dcb3c8f398b7c3cd880ebc6d345886d070dc843 +64ec16ebc0611619d7c397453119ffe1f80f211b7bc9c428f65f8d761c6aa61f +8fa73c5ac88c878b12ec926377f54e4d01187d92cc150730c514284d34581b39 +ddab26bedbe3287cb210d46a2397336f879655c99224f90f8da1646ee111fee8 +a07cfd0dfca3d9377ea2f4fea5501c6403f90f4a42a5732bde8b5d31214a2a7a +7a9382798ebaa67e80804165044390a2fded193ec5aa9753e75b62d9d54ce39a +9e8eb4959ed23f9dc3f8722bca1c5dd5a13ff7a6b95a0f0bf8df430d0e2ee9c3 +df20d33dc73c45e9832c4a83fa5e4fd625c58518dfab5e3465d55959539cf57a +f46da4f2e78a8428eda4ea3a0363878cd50dd1d4b3798e4c858a34a217cc53d6 +68c6d643cbe16143e9255bd3c84576e943b60412d506c090f4a7b93de3e9fd56 +6b4d4396b06a0513b53fa9d088c1a95bbfacb99ede015addb9e34ad973fd77f4 +dc17f07d88bdd90f4e439911484a2a31f91acb15fcb1201115f16157eec70e66 +4f041976518502b14f0520489ac932cfd3f9e4e9226e38b09b483327b34ad3bf +4a125c9271159191ab923bc14fb5398d08aef6ee5ba313a2f6b1599a52e4e0cc +0bd35f8c46fa2ec4979d977d13bab6b8e0dc18365a0f25a7d87d81c5336c0378 +4065f86b9af59235a5727abaaccb54a9a91fa585b464da2c592db5ed300d8836 +76ea19c9ae626658b75942ad3fb9cf4caae2b2a4b845103dac42c006a3af3984 +065a80861c5452dd07586b786aad63e9d74a822cbf10913201658c54023e63cd +e30a1427708cfc8d63a66d369781b15ac6a07b43e13550b1a7625003914503ed +c584bb41bc73b6b452c6964622ea7e4ccfddc741ed6e1d3757ed6015b59cf65f +77b822134129d751070d73441dda90996dab21186c50be2ce79064e22bba94bd +be834d7663441134af0e4fc6619b1c3ae06b5ce0856beac123ac6972c5b270d7 +6750d21dec9eb3436ce6c821b40e344ef0fb280e43081cbc5e584310711417b7 +ea8ae33ca15f21e84d75f5b853a88ca78d722b4f461478bdccfa9c059f6b69db +3be962052af0da265a1bd9cb69ed6868798f47343a2e1dc774c77568c20139bf +3041f044b86b8888937659a1c691db34f0c8b52b6dec6a7db023c18e9cd24722 +50c16b24a37a6d76da00bc64b0a6f96ae858ba386dd5750ce0187a7cc3402027 +df606e3b1a55f9f2c90e333bd113a0af2beb83a319aac9619b5b9cd729b13b0e +2454c04dd9067d2b5288dcca99c5c3eac85660779a97d6165a08ca7c37481070 +bc0155f7235dc0ede6921f43debb8ebe8ca44fb1db57447d26a63f6904f38bba +a99f57f0bea2cb9b6caf3d0e60c3719e379d3d5bc2bbe37d1044c764214dd0b9 +915492fbf9fc1769985e4f5684d42728b5ee63092b148b887c6d07d1fb66fe8f +0c2e99aa7c89c4a124019241d0131a03877d49bef2e409be8421b93d0f15ed82 +a80cdc2fe8bfed0bddc25931f17f5f263ea273cca34558d9e190effa5fcc7bc9 +308808d70076dd738c2d8d7703332dd000fb5592084ff292e2e7d2e43cac75df +20bdd8d0c71b2e1b6a55586e2def4db18152371efbd966b98f055ba340bf471a +37df228c1e983e94e3abea8800b04660e647034fca4948ef45ed6ec69d468687 +1a4313d5086018efcd689dbca06040d99a75f7b331798b0fa2ced0d25dea95b7 +6ab20a650288559438d81881ade44773873472c54d4d8cbbe69aaf2337c9d92b +6cf111099d98f97b09cf7a397d9ef6c849693e8273bf6026e0af0f257c0240bc +e830691975e126ad19891ea10585409a551791e8d0e8c6eda7e9d5e7878ce6a2 +9fabc411f90e2a1452f4880b21ee6cdfb14c1274ce8c7a9a23c30444f07b370b +3846bf7e160007e43c6de5a612b3384ad4235276b7ac86284fd2a7e45a3b0a27 +b4fec8470cd605882c09ec97558d3a737d25a43488adfb903c3573f8b1fb5ebc +b864196e118aa2b40142438c2e28df587c53fb27e6d4e24fa9b98a00cecccdc9 +b1f9d25d6d7217c01a3a67f59176d54ce73b1bb626a687d1447a5354e5cad020 +e9549aa2bb21ad70ff35ad1626cf15f6cb62a321e25e3e7ab832bd9e7430e186 +b8013a96d80b1a6c3b39384f0910ff1f4507fcbf6936b90472d066f75772e751 +d32b08d40cee22365e0193a7372cf85e997501d1e5e6d67b80aaddd569ee7030 +0402bf83d35731c94314d6333cea4350e725209307a45fe6fe548ae04bf2e763 +10e4a1c655829f11ad8f465cfc1e105e7430b9c0bf36f5589624cd5932c50457 +a570da3c838dfd9f3035b658b8d7e873baf6399cf5d39674b37fb4ae4961879e +5c59ae9398c232eaa2f9e472df32691eb55b335bf07eb4e873d374b4144dbc72 +283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1 +11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1 +87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968 +f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488 +e18affb38f030e3bc631457f0ff2ecaf041b0e150d0e87dd8a23c7bb068ca7c1 diff --git a/docs/remote_paths.txt b/docs/remote_paths.txt new file mode 100644 index 0000000..e24159e --- /dev/null +++ b/docs/remote_paths.txt @@ -0,0 +1,99 @@ +photos/Fabio/original/2017Irlanda19-29ago/IMG_0092.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0099.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0100.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0102.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0103.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0104.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0106.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0107.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0108.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0109.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0110.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0112.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0113.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0114.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0116.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0119.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0120.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0122.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0123.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0124.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0125.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0126.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0133.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0134.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0135.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0136.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0137.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0138.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0139.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0140.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0141.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0143.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0145.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0146.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0147.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0148.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0149.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0150.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0152.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0153.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0154.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0155.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0156.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0157.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0160.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0162.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0163.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0164.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0165.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0166.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0167.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0170.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0171.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0172.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0174.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0175.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0176.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0177.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0178.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0179.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0180.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0182.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0183.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0185.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0188.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0190.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0193.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0203.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0204.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0206.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0207.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0208.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0209.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0211.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0212.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0214.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0215.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0216.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0217.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0218.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0223.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0227.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0228.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0229.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0232.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0233.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0234.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0235.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0237.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0241.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0242.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0243.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0244.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0245.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0246.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0247.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0248.JPG +photos/Fabio/original/2017Irlanda19-29ago/IMG_0249.JPG +photos/Fabio/original/2017Irlanda19-29ago/VID_20260221_095917.mp4 diff --git a/docs/repo_rids_unique.txt b/docs/repo_rids_unique.txt new file mode 100644 index 0000000..ea69490 --- /dev/null +++ b/docs/repo_rids_unique.txt @@ -0,0 +1,101 @@ +b3cda38a +09ef919f +dba1de0e +751d8a15 +73dfd75d +f32173d4 +90c0a093 +4d74430a +1955c91d +14616f64 +7668b4a6 +4a10ae72 +490631b5 +1a975960 +486d095f +69eb9113 +1da97cbc +7fbc8546 +35772196 +48b26b6f +10ca45bc +c6b58236 +1d494550 +bf2f60a2 +7d753539 +29eb6ed3 +ebaf024e +c782108a +f56db159 +5d03b5d0 +dd715de9 +8e1a2d2a +46412728 +999cc099 +7ed0d636 +4025ea19 +d91b81a3 +49a20985 +a856fcea +fd3df96d +c8ada02d +7351a37b +23852fb0 +0ed7a1b6 +64ec16eb +8fa73c5a +ddab26be +a07cfd0d +7a938279 +9e8eb495 +df20d33d +f46da4f2 +68c6d643 +6b4d4396 +dc17f07d +4f041976 +4a125c92 +0bd35f8c +4065f86b +76ea19c9 +065a8086 +e30a1427 +c584bb41 +77b82213 +be834d76 +6750d21d +ea8ae33c +3be96205 +3041f044 +50c16b24 +df606e3b +2454c04d +bc0155f7 +a99f57f0 +915492fb +0c2e99aa +a80cdc2f +308808d7 +20bdd8d0 +37df228c +1a4313d5 +6ab20a65 +6cf11109 +e8306919 +9fabc411 +3846bf7e +b4fec847 +b864196e +b1f9d25d +e9549aa2 +b8013a96 +d32b08d4 +0402bf83 +10e4a1c6 +a570da3c +5c59ae93 +283c973a +11ce5c19 +87f69b97 +f084723d +e18affb3 diff --git a/docs/rid_history.txt b/docs/rid_history.txt new file mode 100644 index 0000000..6081377 --- /dev/null +++ b/docs/rid_history.txt @@ -0,0 +1,66 @@ +I/flutter ( 2891): [repo-upsert] batch.insert queued remoteId=5c59ae9398c232eaa2f9e472df32691eb55b335bf07eb4e873d374b4144dbc72 +I/flutter ( 2891): [repo-upsert] in: rid=283c973a name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135543.jpg" +I/flutter ( 2891): [repo-upsert] about to insert remoteId=283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1 name= +I/flutter ( 2891): [repo-upsert] row remoteId=283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1 keys=id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedMillis,sourceDateTakenMillis,durationMillis,trashed,origin,provider,latitude,longitude,altitude,remoteId,remotePath,remoteThumb1,remoteThumb2,remoteRotation,remoteWidth,remoteHeight size=27 +D/OpenGLRenderer( 2891): --- Failed to create image decoder with message 'unimplemented' +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Loading, message: null} +I/WM-Processor( 2891): Moving WorkSpec (03037187-348b-4f75-8601-aab27a012776) to the foreground +D/WM-SystemFgDispatcher( 2891): Notifying with (id:1, workSpecId: 03037187-348b-4f75-8601-aab27a012776, notificationType :1) +I/flutter ( 2891): [repo-upsert] batch.insert queued remoteId=283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1 +I/flutter ( 2891): [repo-upsert] in: rid=11ce5c19 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135641.jpg" +I/flutter ( 2891): [repo-upsert] about to insert remoteId=11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1 name= +I/flutter ( 2891): [repo-upsert] row remoteId=11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1 keys=id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedMillis,sourceDateTakenMillis,durationMillis,trashed,origin,provider,latitude,longitude,altitude,remoteId,remotePath,remoteThumb1,remoteThumb2,remoteRotation,remoteWidth,remoteHeight size=27 +I/flutter ( 2891): [repo-upsert] batch.insert queued remoteId=11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1 +I/flutter ( 2891): [repo-upsert] in: rid=87f69b97 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135744.jpg" +I/flutter ( 2891): [repo-upsert] about to insert remoteId=87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968 name= +I/flutter ( 2891): [repo-upsert] row remoteId=87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968 keys=id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedMillis,sourceDateTakenMillis,durationMillis,trashed,origin,provider,latitude,longitude,altitude,remoteId,remotePath,remoteThumb1,remoteThumb2,remoteRotation,remoteWidth,remoteHeight size=27 +I/flutter ( 2891): [repo-upsert] batch.insert queued remoteId=87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968 +I/flutter ( 2891): [repo-upsert] in: rid=f084723d name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135745.jpg" +I/flutter ( 2891): [repo-upsert] about to insert remoteId=f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488 name= +I/flutter ( 2891): [repo-upsert] row remoteId=f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488 keys=id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedMillis,sourceDateTakenMillis,durationMillis,trashed,origin,provider,latitude,longitude,altitude,remoteId,remotePath,remoteThumb1,remoteThumb2,remoteRotation,remoteWidth,remoteHeight size=27 +I/flutter ( 2891): [repo-upsert] batch.insert queued remoteId=f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488 +---- +I/flutter ( 2891): [repo-upsert] in: rid=283c973a name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135543.jpg" +I/flutter ( 2891): [repo-upsert] about to insert remoteId=283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1 name= +I/flutter ( 2891): [repo-upsert] row remoteId=283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1 keys=id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedMillis,sourceDateTakenMillis,durationMillis,trashed,origin,provider,latitude,longitude,altitude,remoteId,remotePath,remoteThumb1,remoteThumb2,remoteRotation,remoteWidth,remoteHeight size=27 +D/OpenGLRenderer( 2891): --- Failed to create image decoder with message 'unimplemented' +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Loading, message: null} +I/WM-Processor( 2891): Moving WorkSpec (03037187-348b-4f75-8601-aab27a012776) to the foreground +D/WM-SystemFgDispatcher( 2891): Notifying with (id:1, workSpecId: 03037187-348b-4f75-8601-aab27a012776, notificationType :1) +I/flutter ( 2891): [repo-upsert] batch.insert queued remoteId=283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1 +I/flutter ( 2891): [repo-upsert] in: rid=11ce5c19 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135641.jpg" +I/flutter ( 2891): [repo-upsert] about to insert remoteId=11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1 name= +I/flutter ( 2891): [repo-upsert] row remoteId=11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1 keys=id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedMillis,sourceDateTakenMillis,durationMillis,trashed,origin,provider,latitude,longitude,altitude,remoteId,remotePath,remoteThumb1,remoteThumb2,remoteRotation,remoteWidth,remoteHeight size=27 +I/flutter ( 2891): [repo-upsert] batch.insert queued remoteId=11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1 +I/flutter ( 2891): [repo-upsert] in: rid=87f69b97 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135744.jpg" +I/flutter ( 2891): [repo-upsert] about to insert remoteId=87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968 name= +I/flutter ( 2891): [repo-upsert] row remoteId=87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968 keys=id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedMillis,sourceDateTakenMillis,durationMillis,trashed,origin,provider,latitude,longitude,altitude,remoteId,remotePath,remoteThumb1,remoteThumb2,remoteRotation,remoteWidth,remoteHeight size=27 +I/flutter ( 2891): [repo-upsert] batch.insert queued remoteId=87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968 +I/flutter ( 2891): [repo-upsert] in: rid=f084723d name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135745.jpg" +I/flutter ( 2891): [repo-upsert] about to insert remoteId=f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488 name= +I/flutter ( 2891): [repo-upsert] row remoteId=f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488 keys=id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedMillis,sourceDateTakenMillis,durationMillis,trashed,origin,provider,latitude,longitude,altitude,remoteId,remotePath,remoteThumb1,remoteThumb2,remoteRotation,remoteWidth,remoteHeight size=27 +I/flutter ( 2891): [repo-upsert] batch.insert queued remoteId=f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488 +I/flutter ( 2891): [repo-upsert] in: rid=e18affb3 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/VID_20260221_095917.mp4" +---- +I/flutter ( 2891): [repo-upsert] about to insert remoteId=283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1 name= +I/flutter ( 2891): [repo-upsert] row remoteId=283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1 keys=id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedMillis,sourceDateTakenMillis,durationMillis,trashed,origin,provider,latitude,longitude,altitude,remoteId,remotePath,remoteThumb1,remoteThumb2,remoteRotation,remoteWidth,remoteHeight size=27 +D/OpenGLRenderer( 2891): --- Failed to create image decoder with message 'unimplemented' +I/flutter ( 2891): AvesMethodChannel invokeMethod name=deckers.thibault/aves/analysis_service_background method=updateNotification arguments={title: Loading, message: null} +I/WM-Processor( 2891): Moving WorkSpec (03037187-348b-4f75-8601-aab27a012776) to the foreground +D/WM-SystemFgDispatcher( 2891): Notifying with (id:1, workSpecId: 03037187-348b-4f75-8601-aab27a012776, notificationType :1) +I/flutter ( 2891): [repo-upsert] batch.insert queued remoteId=283c973acf706e13a30216305b18833107ddaa420824dca4411c8d00870907b1 +I/flutter ( 2891): [repo-upsert] in: rid=11ce5c19 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135641.jpg" +I/flutter ( 2891): [repo-upsert] about to insert remoteId=11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1 name= +I/flutter ( 2891): [repo-upsert] row remoteId=11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1 keys=id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedMillis,sourceDateTakenMillis,durationMillis,trashed,origin,provider,latitude,longitude,altitude,remoteId,remotePath,remoteThumb1,remoteThumb2,remoteRotation,remoteWidth,remoteHeight size=27 +I/flutter ( 2891): [repo-upsert] batch.insert queued remoteId=11ce5c198063ed0c30460e66e49a654560cb477e104f783f0f521bc363a21ce1 +I/flutter ( 2891): [repo-upsert] in: rid=87f69b97 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135744.jpg" +I/flutter ( 2891): [repo-upsert] about to insert remoteId=87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968 name= +I/flutter ( 2891): [repo-upsert] row remoteId=87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968 keys=id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedMillis,sourceDateTakenMillis,durationMillis,trashed,origin,provider,latitude,longitude,altitude,remoteId,remotePath,remoteThumb1,remoteThumb2,remoteRotation,remoteWidth,remoteHeight size=27 +I/flutter ( 2891): [repo-upsert] batch.insert queued remoteId=87f69b9734668eb0e7bd00cdb9b27b8f46d2105a77fbd750cb80cf14d5f14968 +I/flutter ( 2891): [repo-upsert] in: rid=f084723d name= raw="/photos/Fabio/original/2017Irlanda19-29ago/IMG_20220619_135745.jpg" +I/flutter ( 2891): [repo-upsert] about to insert remoteId=f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488 name= +I/flutter ( 2891): [repo-upsert] row remoteId=f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488 keys=id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedMillis,sourceDateTakenMillis,durationMillis,trashed,origin,provider,latitude,longitude,altitude,remoteId,remotePath,remoteThumb1,remoteThumb2,remoteRotation,remoteWidth,remoteHeight size=27 +I/flutter ( 2891): [repo-upsert] batch.insert queued remoteId=f084723d77c75764a1d23f6ef625f569c1825b36d66b5b2b5df798924602b488 +I/flutter ( 2891): [repo-upsert] in: rid=e18affb3 name= raw="/photos/Fabio/original/2017Irlanda19-29ago/VID_20260221_095917.mp4" +I/flutter ( 2891): [repo-upsert] about to insert remoteId=e18affb38f030e3bc631457f0ff2ecaf041b0e150d0e87dd8a23c7bb068ca7c1 name= +---- diff --git a/docs/trash.csv b/docs/trash.csv new file mode 100644 index 0000000..e69de29 diff --git a/docs/vaults.csv b/docs/vaults.csv new file mode 100644 index 0000000..e69de29 diff --git a/docs/videoPlayback.csv b/docs/videoPlayback.csv new file mode 100644 index 0000000..e69de29 diff --git a/fabio_readme.md b/fabio_readme.md new file mode 100644 index 0000000..7766de2 --- /dev/null +++ b/fabio_readme.md @@ -0,0 +1,23 @@ + +keytool -genkeypair -v -storetype PKCS12 \ + -keystore my-upload-key.keystore \ + -alias my-key-alias \ + -keyalg RSA -keysize 2048 -validity 10000 + +mkdir -p keystore +keytool -genkeypair -v -storetype PKCS12 \ + -keystore keystore/release.jks \ + -alias my-key-alias \ + -keyalg RSA -keysize 2048 -validity 10000 + +Google Cloud Console APIs & Services Credentials + +nano android/key.properties + +storeFile=../keystore/release.jks +storePassword=master66 +keyAlias=my-key-alias +keyPassword=master66 +googleApiKey=AIzaSyBcRtED3WqXOix6PIHtMOXuBF6lOTlUv6E + +./flutterw run -t lib/main_play.dart --flavor play diff --git a/fastlane/metadata/android/ar/full_description.txt b/fastlane/metadata/android/ar/full_description.txt new file mode 100644 index 0000000..d1c5e57 --- /dev/null +++ b/fastlane/metadata/android/ar/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> يمكنه التعامل مع جميع أنواع الصور ومقاطع الفيديو ، بما في ذلك ملفات JPEG و MP4 النموذجية ، ولكن أيضًا أشياء أكثر غرابة مثل <b>ملفات TIFF و SVG و AVI القديمة متعددة الصفحات والمزيد</b>! يقوم بمسح مجموعة الوسائط الخاصة بك لتحديد <b> الصور المتحركة</b>, <b>الإستعراضات</b> (المعروف أيضًا باسم الصور البانورامية), <b>360 درجة مقاطع الفيديو</b>, إلى جانب <b>GeoTIFF</b> الملفات. + +<b>الملاحة والبحث</b> جزء مهم من <i>Aves</i>الهدف هو أن يكون بإمكان المستخدمين التنقل بسهولة من الألبومات إلى الصور إلى الوسوم إلى الخرائط، وما إلى ذلك.. + +<i>Aves</i>تتكامل مع نظام Android (بما في ذلك Android TV) مع ميزات مثلs <b>الودجتس</b>, <b>اختصارات التطبيق</b>, <b>حافظة الشاشة</b> و<b>البحث العالمي</b> التعامل معه. كما أنه يعمل كـ <b>عارض الوسائط ومنتقيها</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/ar/images/featureGraphic.png b/fastlane/metadata/android/ar/images/featureGraphic.png new file mode 100644 index 0000000..9bc5c99 Binary files /dev/null and b/fastlane/metadata/android/ar/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/ar/images/phoneScreenshots/1.png b/fastlane/metadata/android/ar/images/phoneScreenshots/1.png new file mode 100644 index 0000000..0ea4a68 Binary files /dev/null and b/fastlane/metadata/android/ar/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/ar/images/phoneScreenshots/2.png b/fastlane/metadata/android/ar/images/phoneScreenshots/2.png new file mode 100644 index 0000000..7a112f0 Binary files /dev/null and b/fastlane/metadata/android/ar/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/ar/images/phoneScreenshots/3.png b/fastlane/metadata/android/ar/images/phoneScreenshots/3.png new file mode 100644 index 0000000..dca23f7 Binary files /dev/null and b/fastlane/metadata/android/ar/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/ar/images/phoneScreenshots/4.png b/fastlane/metadata/android/ar/images/phoneScreenshots/4.png new file mode 100644 index 0000000..aa29bf4 Binary files /dev/null and b/fastlane/metadata/android/ar/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/ar/images/phoneScreenshots/5.png b/fastlane/metadata/android/ar/images/phoneScreenshots/5.png new file mode 100644 index 0000000..fd8b181 Binary files /dev/null and b/fastlane/metadata/android/ar/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/ar/images/phoneScreenshots/6.png b/fastlane/metadata/android/ar/images/phoneScreenshots/6.png new file mode 100644 index 0000000..107964a Binary files /dev/null and b/fastlane/metadata/android/ar/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/ar/images/phoneScreenshots/7.png b/fastlane/metadata/android/ar/images/phoneScreenshots/7.png new file mode 100644 index 0000000..c65cf3a Binary files /dev/null and b/fastlane/metadata/android/ar/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/ar/short_description.txt b/fastlane/metadata/android/ar/short_description.txt new file mode 100644 index 0000000..24ef326 --- /dev/null +++ b/fastlane/metadata/android/ar/short_description.txt @@ -0,0 +1 @@ +مستعرض الصور والبيانات \ No newline at end of file diff --git a/fastlane/metadata/android/az/full_description.txt b/fastlane/metadata/android/az/full_description.txt new file mode 100644 index 0000000..49801b4 --- /dev/null +++ b/fastlane/metadata/android/az/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/az/short_description.txt b/fastlane/metadata/android/az/short_description.txt new file mode 100644 index 0000000..8c9445b --- /dev/null +++ b/fastlane/metadata/android/az/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/fastlane/metadata/android/be/full_description.txt b/fastlane/metadata/android/be/full_description.txt new file mode 100644 index 0000000..84207d5 --- /dev/null +++ b/fastlane/metadata/android/be/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> можа апрацоўваць разнастайныя выявы і відэа, у тым ліку звычайныя файлы JPEG і MP4, а таксама больш экзатычныя рэчы, такія як <b>шматстаронкавыя файлы TIFF, SVG, старыя файлы AVI і іншае</b>! Ён скануе вашу калекцыю мультымедыя для ідэнтыфікацыі <b>фотаздымкаў з рухам</b>, <b>панарам</b> (ён жа панарам), <b>360° відэа</b>, а таксама <b>GeoTIFF</b> файлы. + +<b>Навігацыя і пошук</b> з'яўляюцца важнай часткай <i>Aves</i>. Мэта складаецца ў тым, каб карыстальнікі лёгка пераходзілі ад альбомаў да фатаграфій да тэгаў да карт і г.д. + +<i>Aves</i> інтэгруецца з Android (уключаючы Android TV) з такімі функцыямі, як <b>віджэты</b>, <b>ярлыкі праграм</b>, <b>застаўка</b> і апрацоўка <b>глабальнага пошуку</b>. Ён таксама працуе як <b>сродак прагляду і выбару мультымедыя</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/be/images/featureGraphic.png b/fastlane/metadata/android/be/images/featureGraphic.png new file mode 100644 index 0000000..24e0a97 Binary files /dev/null and b/fastlane/metadata/android/be/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/be/images/phoneScreenshots/1.png b/fastlane/metadata/android/be/images/phoneScreenshots/1.png new file mode 100644 index 0000000..fe2638e Binary files /dev/null and b/fastlane/metadata/android/be/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/be/images/phoneScreenshots/2.png b/fastlane/metadata/android/be/images/phoneScreenshots/2.png new file mode 100644 index 0000000..ae7a968 Binary files /dev/null and b/fastlane/metadata/android/be/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/be/images/phoneScreenshots/3.png b/fastlane/metadata/android/be/images/phoneScreenshots/3.png new file mode 100644 index 0000000..ebccc86 Binary files /dev/null and b/fastlane/metadata/android/be/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/be/images/phoneScreenshots/4.png b/fastlane/metadata/android/be/images/phoneScreenshots/4.png new file mode 100644 index 0000000..1b3bc0f Binary files /dev/null and b/fastlane/metadata/android/be/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/be/images/phoneScreenshots/5.png b/fastlane/metadata/android/be/images/phoneScreenshots/5.png new file mode 100644 index 0000000..100e207 Binary files /dev/null and b/fastlane/metadata/android/be/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/be/images/phoneScreenshots/6.png b/fastlane/metadata/android/be/images/phoneScreenshots/6.png new file mode 100644 index 0000000..6139cf7 Binary files /dev/null and b/fastlane/metadata/android/be/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/be/images/phoneScreenshots/7.png b/fastlane/metadata/android/be/images/phoneScreenshots/7.png new file mode 100644 index 0000000..736c760 Binary files /dev/null and b/fastlane/metadata/android/be/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/be/short_description.txt b/fastlane/metadata/android/be/short_description.txt new file mode 100644 index 0000000..8bab46b --- /dev/null +++ b/fastlane/metadata/android/be/short_description.txt @@ -0,0 +1 @@ +Галерэя і правадыр метададзеных \ No newline at end of file diff --git a/fastlane/metadata/android/bg/full_description.txt b/fastlane/metadata/android/bg/full_description.txt new file mode 100644 index 0000000..8fd1a5a --- /dev/null +++ b/fastlane/metadata/android/bg/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> може да обработва всякакви изображения и видеоклипове, включително вашите типични JPEG и MP4 файлове, но също и по-екзотични неща като <b>многостранични TIFF файлове, SVG файлове, стари AVI файлове и други</b>! Той сканира медийната ви колекция, за да идентифицира <b>снимки с движение</b>, <b>панорами</b> (известни още като фото 360°), <b>360° видеоклипове</b>, както и <b>GeoTIFF</b> файлове. + +<b>Навигация и търсене</b> са важна част от <i>Aves</i>. Целта е потребителите лесно да преминават от албуми към снимки, към етикети, към карти и т.н. + +<i>Aves</i> се интегрира с Android (включително Android TV) с функции като <b>джаджи</b>, <b>преки пътища за приложения</b>, <b>скрийнсейвър </b> и обработка на <b>глобално търсене</b>. Работи и като диалогов прозорец за <b>преглед и избор на медии</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/bg/images/featureGraphic.png b/fastlane/metadata/android/bg/images/featureGraphic.png new file mode 100644 index 0000000..1aa6138 Binary files /dev/null and b/fastlane/metadata/android/bg/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/bg/images/phoneScreenshots/1.png b/fastlane/metadata/android/bg/images/phoneScreenshots/1.png new file mode 100644 index 0000000..de2ac38 Binary files /dev/null and b/fastlane/metadata/android/bg/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/bg/images/phoneScreenshots/2.png b/fastlane/metadata/android/bg/images/phoneScreenshots/2.png new file mode 100644 index 0000000..78ffdd8 Binary files /dev/null and b/fastlane/metadata/android/bg/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/bg/images/phoneScreenshots/3.png b/fastlane/metadata/android/bg/images/phoneScreenshots/3.png new file mode 100644 index 0000000..e33481f Binary files /dev/null and b/fastlane/metadata/android/bg/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/bg/images/phoneScreenshots/4.png b/fastlane/metadata/android/bg/images/phoneScreenshots/4.png new file mode 100644 index 0000000..8ccd61b Binary files /dev/null and b/fastlane/metadata/android/bg/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/bg/images/phoneScreenshots/5.png b/fastlane/metadata/android/bg/images/phoneScreenshots/5.png new file mode 100644 index 0000000..b9040a6 Binary files /dev/null and b/fastlane/metadata/android/bg/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/bg/images/phoneScreenshots/6.png b/fastlane/metadata/android/bg/images/phoneScreenshots/6.png new file mode 100644 index 0000000..65962df Binary files /dev/null and b/fastlane/metadata/android/bg/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/bg/images/phoneScreenshots/7.png b/fastlane/metadata/android/bg/images/phoneScreenshots/7.png new file mode 100644 index 0000000..23a2f16 Binary files /dev/null and b/fastlane/metadata/android/bg/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/bg/short_description.txt b/fastlane/metadata/android/bg/short_description.txt new file mode 100644 index 0000000..aa3da96 --- /dev/null +++ b/fastlane/metadata/android/bg/short_description.txt @@ -0,0 +1 @@ +Галерия и мениджър на данни \ No newline at end of file diff --git a/fastlane/metadata/android/bn/full_description.txt b/fastlane/metadata/android/bn/full_description.txt new file mode 100644 index 0000000..b28141d --- /dev/null +++ b/fastlane/metadata/android/bn/full_description.txt @@ -0,0 +1,5 @@ +<i>আভেস</i> সব ধরণের ছবি এবং ভিডিও পরিচালনা করতে পারে, সাধারণ JPEG এবং MP4 সহ আরও বিরল জিনিস যেমন <b>মাল্টি-পেজ TIFF, SVG, পুরানো AVI এবং আরও অনেক কিছু</b>! এটি আপনার মিডিয়া সংগ্রহ স্ক্যান করে <b>মোশন ফটো</b>, <b>প্যানোরামা</b> (ফটো স্ফিয়ার), <b>360° ভিডিও</b>, এবং <b>GeoTIFF</b> খুঁজে বের করে। + +<b>নেভিগেশন এবং সার্চ</b> <i>আভেস</i> এর একটি গুরুত্বপূর্ণ অংশ। লক্ষ্য হল ইউসার যাতে সহজেই অ্যালবাম, ফটো, ট্যাগ, ম্যাপ ইত্যাদিতে স্থানান্তর করতে পারে। + +<b>উইজেট</b>, <b>অ্যাপ শর্টকাট</b>, <b>স্ক্রিন সেভারের</b> এবং <b>গ্লোবাল সার্চ</b> এর মতো বৈশিষ্ট্য সহ, <i>আভেস</i> অ্যান্ড্রয়েড এর সাথে সংহত হতে পারে (অ্যান্ড্রয়েড টিভি সহ)। এটি একটি <b>মিডিয়া উপস্থাপক এবং বাছাইকারী</b> হিসেবেও কাজ করে। \ No newline at end of file diff --git a/fastlane/metadata/android/bn/short_description.txt b/fastlane/metadata/android/bn/short_description.txt new file mode 100644 index 0000000..f950693 --- /dev/null +++ b/fastlane/metadata/android/bn/short_description.txt @@ -0,0 +1 @@ +গ্যালারি এবং মেটাডেটা অনুসন্ধানকারী \ No newline at end of file diff --git a/fastlane/metadata/android/ca/full_description.txt b/fastlane/metadata/android/ca/full_description.txt new file mode 100644 index 0000000..a25959d --- /dev/null +++ b/fastlane/metadata/android/ca/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> pot gestionar tot tipus d'imatges i vídeos, inclosos els típics JPEG i MP4, però també coses més exòtiques com <b>multi-pàgina TIFFs, SVG, AVI antics i més</b>! Escaneja la col·lecció multimèdia per identificar <b>fotos en moviment</b>, <b>panoràmiques</b>(àlies esferes de fotos), <b>vídeos 360.</b>, així com fitxers <b>GeoTIFF</b>. + +<b>Navegació i cerca</b> és una part important de <i>Aves</i>. L'objectiu és que els usuaris puguin fluir fàcilment d'àlbums a fotos, etiquetes a mapes, etc. + +<i>Aves</i> s'integra amb Android (incloent Android TV) amb funcions com <b>ginys</b>, <b>dreceres d'aplicació</b>, <b>estalvi de pantalla</b>i gestió de<b> la cerca global</b>. També funciona com a <b>visor i selector multimèdia</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/ca/images/featureGraphic.png b/fastlane/metadata/android/ca/images/featureGraphic.png new file mode 100755 index 0000000..405897a Binary files /dev/null and b/fastlane/metadata/android/ca/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/ca/images/phoneScreenshots/1.png b/fastlane/metadata/android/ca/images/phoneScreenshots/1.png new file mode 100644 index 0000000..6c453d2 Binary files /dev/null and b/fastlane/metadata/android/ca/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/ca/images/phoneScreenshots/2.png b/fastlane/metadata/android/ca/images/phoneScreenshots/2.png new file mode 100644 index 0000000..9afb5d0 Binary files /dev/null and b/fastlane/metadata/android/ca/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/ca/images/phoneScreenshots/3.png b/fastlane/metadata/android/ca/images/phoneScreenshots/3.png new file mode 100644 index 0000000..29ea290 Binary files /dev/null and b/fastlane/metadata/android/ca/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/ca/images/phoneScreenshots/4.png b/fastlane/metadata/android/ca/images/phoneScreenshots/4.png new file mode 100644 index 0000000..7b5dd1f Binary files /dev/null and b/fastlane/metadata/android/ca/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/ca/images/phoneScreenshots/5.png b/fastlane/metadata/android/ca/images/phoneScreenshots/5.png new file mode 100644 index 0000000..04dc226 Binary files /dev/null and b/fastlane/metadata/android/ca/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/ca/images/phoneScreenshots/6.png b/fastlane/metadata/android/ca/images/phoneScreenshots/6.png new file mode 100644 index 0000000..f41d9d3 Binary files /dev/null and b/fastlane/metadata/android/ca/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/ca/images/phoneScreenshots/7.png b/fastlane/metadata/android/ca/images/phoneScreenshots/7.png new file mode 100644 index 0000000..2645948 Binary files /dev/null and b/fastlane/metadata/android/ca/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/ca/short_description.txt b/fastlane/metadata/android/ca/short_description.txt new file mode 100644 index 0000000..88082cb --- /dev/null +++ b/fastlane/metadata/android/ca/short_description.txt @@ -0,0 +1 @@ +Galeria i explorador de metadades \ No newline at end of file diff --git a/fastlane/metadata/android/ckb/full_description.txt b/fastlane/metadata/android/ckb/full_description.txt new file mode 100644 index 0000000..49801b4 --- /dev/null +++ b/fastlane/metadata/android/ckb/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/ckb/short_description.txt b/fastlane/metadata/android/ckb/short_description.txt new file mode 100644 index 0000000..6c27cde --- /dev/null +++ b/fastlane/metadata/android/ckb/short_description.txt @@ -0,0 +1 @@ +گەڕاڵی وێنە و زانیارییەکان \ No newline at end of file diff --git a/fastlane/metadata/android/cs/full_description.txt b/fastlane/metadata/android/cs/full_description.txt new file mode 100644 index 0000000..c8f83bc --- /dev/null +++ b/fastlane/metadata/android/cs/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> může pracovat se všemi typy obrázků a videí, jako jsou běžné formáty JPEG a MP4, ale také více exotické jako <b>vícestránkový TIFF, SVG, starý AVI a mnohem více</b>! Prohledává vaši sbírku médií kvůli rozpoznání <b>pohyblivých fotografií</b>, <b>panoramatických snímků</b> (čili fotosféry), <b>360° videí</b>, nebo souborů <b>GeoTIFF</b>. + +<b>Navigace a vyhledávání</b> jsou důležitou součástí aplikace <i>Aves</i>. Cílem je, aby uživatelé jednoduše přecházeli z alb k fotografiím, albům, mapám, atd. + +<i>Aves</i> podporuje Android (včetně Android TV) s funkcemi jako jsou <b>widgety</b>, <b>zkratky aplikací</b>, <b>spořič displeje</b> a <b>globální vyhledávání</b>. Rovněž jej lze použít pro <b>prohlížení a výběr médií</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/cs/images/featureGraphic.png b/fastlane/metadata/android/cs/images/featureGraphic.png new file mode 100755 index 0000000..c18ccc0 Binary files /dev/null and b/fastlane/metadata/android/cs/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/cs/images/phoneScreenshots/1.png b/fastlane/metadata/android/cs/images/phoneScreenshots/1.png new file mode 100644 index 0000000..dc2ae74 Binary files /dev/null and b/fastlane/metadata/android/cs/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/cs/images/phoneScreenshots/2.png b/fastlane/metadata/android/cs/images/phoneScreenshots/2.png new file mode 100644 index 0000000..4e3c005 Binary files /dev/null and b/fastlane/metadata/android/cs/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/cs/images/phoneScreenshots/3.png b/fastlane/metadata/android/cs/images/phoneScreenshots/3.png new file mode 100644 index 0000000..543729f Binary files /dev/null and b/fastlane/metadata/android/cs/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/cs/images/phoneScreenshots/4.png b/fastlane/metadata/android/cs/images/phoneScreenshots/4.png new file mode 100644 index 0000000..2dadb1b Binary files /dev/null and b/fastlane/metadata/android/cs/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/cs/images/phoneScreenshots/5.png b/fastlane/metadata/android/cs/images/phoneScreenshots/5.png new file mode 100644 index 0000000..ed50e95 Binary files /dev/null and b/fastlane/metadata/android/cs/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/cs/images/phoneScreenshots/6.png b/fastlane/metadata/android/cs/images/phoneScreenshots/6.png new file mode 100644 index 0000000..1508e91 Binary files /dev/null and b/fastlane/metadata/android/cs/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/cs/images/phoneScreenshots/7.png b/fastlane/metadata/android/cs/images/phoneScreenshots/7.png new file mode 100644 index 0000000..f469959 Binary files /dev/null and b/fastlane/metadata/android/cs/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/cs/short_description.txt b/fastlane/metadata/android/cs/short_description.txt new file mode 100644 index 0000000..48cbd55 --- /dev/null +++ b/fastlane/metadata/android/cs/short_description.txt @@ -0,0 +1 @@ +Galerie a prohlížeč metadat \ No newline at end of file diff --git a/fastlane/metadata/android/da/full_description.txt b/fastlane/metadata/android/da/full_description.txt new file mode 100644 index 0000000..0d1bb74 --- /dev/null +++ b/fastlane/metadata/android/da/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> kan håndtere alle slags billeder og videoer, inklusive de typiske JPEG'er og MP4'er, men også mere usædvanlige ting som <b>flersidede TIFF'er, SVG'er, gamle AVI'er og mere</b>! Den scanner din mediesamling for at identificere <b>bevægelsesfotos</b>, <b>panoramaer</b> (også kaldet fotosfærer), <b>360° videoer</b> samt <b>GeoTIFF</b>-filer. + +<b>Navigation og søgning</b> er en vigtig del af <i>Aves</i>. Målet er, at brugerne nemt kan gå fra album til fotos til tags til kort osv. + +<i>Aves</i> integreres med Android (inklusive Android TV) med funktioner som <b>widgets</b>, <b>app-genveje</b>, <b>pauseskærm</b> og håndtering af <b>global søgning</b>. Den fungerer også som <b>medieviser og -vælger</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/da/images/featureGraphic.png b/fastlane/metadata/android/da/images/featureGraphic.png new file mode 100644 index 0000000..2d8ec07 Binary files /dev/null and b/fastlane/metadata/android/da/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/da/images/phoneScreenshots/1.png b/fastlane/metadata/android/da/images/phoneScreenshots/1.png new file mode 100644 index 0000000..dd1b605 Binary files /dev/null and b/fastlane/metadata/android/da/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/da/images/phoneScreenshots/2.png b/fastlane/metadata/android/da/images/phoneScreenshots/2.png new file mode 100644 index 0000000..6b1b56e Binary files /dev/null and b/fastlane/metadata/android/da/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/da/images/phoneScreenshots/3.png b/fastlane/metadata/android/da/images/phoneScreenshots/3.png new file mode 100644 index 0000000..69f825a Binary files /dev/null and b/fastlane/metadata/android/da/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/da/images/phoneScreenshots/4.png b/fastlane/metadata/android/da/images/phoneScreenshots/4.png new file mode 100644 index 0000000..42dde78 Binary files /dev/null and b/fastlane/metadata/android/da/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/da/images/phoneScreenshots/5.png b/fastlane/metadata/android/da/images/phoneScreenshots/5.png new file mode 100644 index 0000000..0bf0165 Binary files /dev/null and b/fastlane/metadata/android/da/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/da/images/phoneScreenshots/6.png b/fastlane/metadata/android/da/images/phoneScreenshots/6.png new file mode 100644 index 0000000..5b9ad96 Binary files /dev/null and b/fastlane/metadata/android/da/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/da/images/phoneScreenshots/7.png b/fastlane/metadata/android/da/images/phoneScreenshots/7.png new file mode 100644 index 0000000..e6a9f85 Binary files /dev/null and b/fastlane/metadata/android/da/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/da/short_description.txt b/fastlane/metadata/android/da/short_description.txt new file mode 100644 index 0000000..15e6a01 --- /dev/null +++ b/fastlane/metadata/android/da/short_description.txt @@ -0,0 +1 @@ +Galleri og metadataudforsker \ No newline at end of file diff --git a/fastlane/metadata/android/de/full_description.txt b/fastlane/metadata/android/de/full_description.txt new file mode 100644 index 0000000..95af152 --- /dev/null +++ b/fastlane/metadata/android/de/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> kann alle Arten von Bildern und Videos verarbeiten, einschließlich Ihrer typischen JPEGs und MP4s, aber auch exotischere Dinge wie <b>mehrseitige TIFFs, SVGs, alte AVIs und mehr</b>! Es scannt Ihre Mediensammlung, um <b>Bewegungsfotos</b>, <b>Panoramen</b> (auch bekannt als Panoramaaufnahmen), <b>360°-Videos</b> sowie <b>GeoTIFF-Dateien</b> zu identifizieren. + +<b>Navigation und Suche</b> ist ein wichtiger Bestandteil von <i>Aves</i>. Das Ziel besteht darin, dass Benutzer problemlos von Alben zu Fotos zu Tags zu Karten usw. wechseln können. + +<i>Aves</i> integriert sich in Android (einschließlich Android TV) mit Funktionen wie <b>Widgets</b>, <b>App-Shortcuts</b>, <b>Bildschirmschoner</b> und der <b>globalen Suche</b> integrieren. Sie funktioniert auch als <b>Medienbetrachter und -Picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/de/images/featureGraphic.png b/fastlane/metadata/android/de/images/featureGraphic.png new file mode 100755 index 0000000..c18ccc0 Binary files /dev/null and b/fastlane/metadata/android/de/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/de/images/phoneScreenshots/1.png b/fastlane/metadata/android/de/images/phoneScreenshots/1.png new file mode 100644 index 0000000..a62d3ab Binary files /dev/null and b/fastlane/metadata/android/de/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/de/images/phoneScreenshots/2.png b/fastlane/metadata/android/de/images/phoneScreenshots/2.png new file mode 100644 index 0000000..2f13cff Binary files /dev/null and b/fastlane/metadata/android/de/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/de/images/phoneScreenshots/3.png b/fastlane/metadata/android/de/images/phoneScreenshots/3.png new file mode 100644 index 0000000..fd47a58 Binary files /dev/null and b/fastlane/metadata/android/de/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/de/images/phoneScreenshots/4.png b/fastlane/metadata/android/de/images/phoneScreenshots/4.png new file mode 100644 index 0000000..9804028 Binary files /dev/null and b/fastlane/metadata/android/de/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/de/images/phoneScreenshots/5.png b/fastlane/metadata/android/de/images/phoneScreenshots/5.png new file mode 100644 index 0000000..2e6b2c6 Binary files /dev/null and b/fastlane/metadata/android/de/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/de/images/phoneScreenshots/6.png b/fastlane/metadata/android/de/images/phoneScreenshots/6.png new file mode 100644 index 0000000..c4c844e Binary files /dev/null and b/fastlane/metadata/android/de/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/de/images/phoneScreenshots/7.png b/fastlane/metadata/android/de/images/phoneScreenshots/7.png new file mode 100644 index 0000000..3689bbb Binary files /dev/null and b/fastlane/metadata/android/de/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/de/short_description.txt b/fastlane/metadata/android/de/short_description.txt new file mode 100644 index 0000000..66ef723 --- /dev/null +++ b/fastlane/metadata/android/de/short_description.txt @@ -0,0 +1 @@ +Galerie und Metadaten Explorer \ No newline at end of file diff --git a/fastlane/metadata/android/el/full_description.txt b/fastlane/metadata/android/el/full_description.txt new file mode 100644 index 0000000..6d99222 --- /dev/null +++ b/fastlane/metadata/android/el/full_description.txt @@ -0,0 +1,5 @@ +Η εφαρμογή <i>Aves</i> μπορεί να διαχειριστεί όλα τα είδη εικόνων και βίντεο, συμπεριλαμβανομένων των κλασσικών JPEG και MP4, αλλά και πιο προχωρημένα πράγματα όπως <b>multi-page TIFFs, SVGs, old AVIs και ακόμα περισσότερα</b>! Σαρώνει τη συλλογή των πολυμέσων σας για να αναγνωρίσει <b>Φωτογραφίες με κίνηση</b>, <b>Πανοραμικές</b> (aka photo spheres), <b>Βίντεο 360°</b>, καθώς και <b>GeoTIFF</b> αρχεία. + +<b>Η πλοήγηση και η αναζήτηση</b> αποτελούν σημαντικό μέρος της εφαρμογής <i>Aves</i>. Ο στόχος της εφαρμογής είναι να παρέχει στους χρήστες εύκολη και γρήγορη πρόσβαση στα άλμπουμ, σε φωτογραφίες, ετικέτες, χάρτες κ.λπ. + +Η εφαρμογή <i>Aves</i> εγκαθίσταται στο λογισμικό Android με δυνατότητες όπως <b>γραφικά στοιχεία</b>, <b>συντομεύσεις</b>, <b>προφύλαξη οθόνης</b> και <b>global search</b>. Μπορεί επίσης να χρησιμοποιηθεί ως <b>εφαρμογή προβολής και επιλογής πολυμέσων</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/el/images/featureGraphic.png b/fastlane/metadata/android/el/images/featureGraphic.png new file mode 100644 index 0000000..e5664dd Binary files /dev/null and b/fastlane/metadata/android/el/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/el/images/phoneScreenshots/1.png b/fastlane/metadata/android/el/images/phoneScreenshots/1.png new file mode 100644 index 0000000..170e537 Binary files /dev/null and b/fastlane/metadata/android/el/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/el/images/phoneScreenshots/2.png b/fastlane/metadata/android/el/images/phoneScreenshots/2.png new file mode 100644 index 0000000..ba99a0b Binary files /dev/null and b/fastlane/metadata/android/el/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/el/images/phoneScreenshots/3.png b/fastlane/metadata/android/el/images/phoneScreenshots/3.png new file mode 100644 index 0000000..7a7e147 Binary files /dev/null and b/fastlane/metadata/android/el/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/el/images/phoneScreenshots/4.png b/fastlane/metadata/android/el/images/phoneScreenshots/4.png new file mode 100644 index 0000000..2278d11 Binary files /dev/null and b/fastlane/metadata/android/el/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/el/images/phoneScreenshots/5.png b/fastlane/metadata/android/el/images/phoneScreenshots/5.png new file mode 100644 index 0000000..f949ffc Binary files /dev/null and b/fastlane/metadata/android/el/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/el/images/phoneScreenshots/6.png b/fastlane/metadata/android/el/images/phoneScreenshots/6.png new file mode 100644 index 0000000..0519a0e Binary files /dev/null and b/fastlane/metadata/android/el/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/el/images/phoneScreenshots/7.png b/fastlane/metadata/android/el/images/phoneScreenshots/7.png new file mode 100644 index 0000000..9922f10 Binary files /dev/null and b/fastlane/metadata/android/el/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/el/short_description.txt b/fastlane/metadata/android/el/short_description.txt new file mode 100644 index 0000000..f1ebd1f --- /dev/null +++ b/fastlane/metadata/android/el/short_description.txt @@ -0,0 +1 @@ +Συλλογή φωτογραφιών και εξερεύνηση των μεταδεδομένων \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/160.txt b/fastlane/metadata/android/en-US/changelogs/160.txt new file mode 100644 index 0000000..40706bc --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/160.txt @@ -0,0 +1,5 @@ +In v1.13.9: +- drag and drop media in multi-window mode +- select new shapes for your widgets +- enjoy the app in Finnish +Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/16001.txt b/fastlane/metadata/android/en-US/changelogs/16001.txt new file mode 100644 index 0000000..40706bc --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/16001.txt @@ -0,0 +1,5 @@ +In v1.13.9: +- drag and drop media in multi-window mode +- select new shapes for your widgets +- enjoy the app in Finnish +Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/161.txt b/fastlane/metadata/android/en-US/changelogs/161.txt new file mode 100644 index 0000000..558d957 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/161.txt @@ -0,0 +1,3 @@ +In v1.13.10: +- catalog AVIF images like never before +Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/16101.txt b/fastlane/metadata/android/en-US/changelogs/16101.txt new file mode 100644 index 0000000..558d957 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/16101.txt @@ -0,0 +1,3 @@ +In v1.13.10: +- catalog AVIF images like never before +Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/162.txt b/fastlane/metadata/android/en-US/changelogs/162.txt new file mode 100644 index 0000000..5ca5ab9 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/162.txt @@ -0,0 +1,3 @@ +In v1.13.11: +- catalog AVIF images like never before +Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/16201.txt b/fastlane/metadata/android/en-US/changelogs/16201.txt new file mode 100644 index 0000000..5ca5ab9 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/16201.txt @@ -0,0 +1,3 @@ +In v1.13.11: +- catalog AVIF images like never before +Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/163.txt b/fastlane/metadata/android/en-US/changelogs/163.txt new file mode 100644 index 0000000..393dae3 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/163.txt @@ -0,0 +1,3 @@ +In v1.13.12: +- catalog AVIF images like never before +Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/16301.txt b/fastlane/metadata/android/en-US/changelogs/16301.txt new file mode 100644 index 0000000..393dae3 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/16301.txt @@ -0,0 +1,3 @@ +In v1.13.12: +- catalog AVIF images like never before +Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/164.txt b/fastlane/metadata/android/en-US/changelogs/164.txt new file mode 100644 index 0000000..7015092 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/164.txt @@ -0,0 +1,5 @@ +In v1.14.0: +- stat export +- regex search +- predictive back gesture +Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/16401.txt b/fastlane/metadata/android/en-US/changelogs/16401.txt new file mode 100644 index 0000000..7015092 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/16401.txt @@ -0,0 +1,5 @@ +In v1.14.0: +- stat export +- regex search +- predictive back gesture +Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt new file mode 100644 index 0000000..23a3d62 --- /dev/null +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.png b/fastlane/metadata/android/en-US/images/featureGraphic.png new file mode 100755 index 0000000..1ccb769 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png new file mode 100644 index 0000000..2e75b00 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/icon.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png new file mode 100644 index 0000000..b35cbb6 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png new file mode 100644 index 0000000..4f0a9af Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png new file mode 100644 index 0000000..ac5d0b7 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png new file mode 100644 index 0000000..c429f8a Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png new file mode 100644 index 0000000..dd7cb20 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png new file mode 100644 index 0000000..4f1052e Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png new file mode 100644 index 0000000..2d763d6 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt new file mode 100644 index 0000000..8c9445b --- /dev/null +++ b/fastlane/metadata/android/en-US/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/fastlane/metadata/android/en-XW-Shaw/full_description.txt b/fastlane/metadata/android/en-XW-Shaw/full_description.txt new file mode 100644 index 0000000..ab3c50d --- /dev/null +++ b/fastlane/metadata/android/en-XW-Shaw/full_description.txt @@ -0,0 +1,5 @@ +¡<i>·𐑱𐑝𐑰𐑟</i> 𐑒𐑨𐑯 𐑣𐑨𐑯𐑛𐑩𐑤 𐑷𐑤 𐑕𐑹𐑑𐑕 𐑝 𐑦𐑥𐑦𐑡𐑩𐑟 𐑯 𐑝𐑦𐑛𐑦𐑴𐑟, 𐑦𐑯𐑒𐑤𐑵𐑛𐑦𐑙 𐑘𐑹 𐑑𐑦𐑐𐑦𐑒𐑩𐑤 ⸰𐑡𐑓𐑧𐑜'𐑟 𐑯 ⸰𐑥𐑐4'𐑟, 𐑚𐑳𐑑 𐑷𐑤𐑕𐑴 𐑥𐑹 𐑦𐑜𐑟𐑪𐑑𐑦𐑒 𐑔𐑦𐑙𐑟 𐑤𐑲𐑒 <b>𐑥𐑳𐑤𐑑𐑦-𐑐𐑱𐑡 ⸰𐑑𐑦𐑓𐑓'𐑕, ⸰𐑕𐑝𐑜'𐑟, 𐑴𐑤𐑛 ⸰𐑷𐑝𐑦'𐑟 𐑯 𐑥𐑹</b>! 𐑦𐑑 𐑕𐑒𐑨𐑯𐑟 𐑘𐑹 𐑥𐑰𐑛𐑾 𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯 𐑑 𐑲𐑛𐑧𐑯𐑑𐑦𐑓𐑲 <b>𐑥𐑴𐑖𐑩𐑯 𐑓𐑴𐑑𐑴𐑟</b>, <b>𐑐𐑨𐑯𐑼𐑭𐑥𐑩𐑟</b> (⸰𐑷𐑯𐑨 𐑓𐑴𐑑𐑴 𐑕𐑓𐑽𐑟), <b>360° 𐑝𐑦𐑛𐑦𐑴𐑟</b>, 𐑨𐑟 𐑢𐑧𐑤 𐑨𐑟 <b>⸰𐑡𐑰𐑴𐑑𐑦𐑓𐑓</b> 𐑓𐑲𐑤𐑟. + +<b>𐑯𐑨𐑝𐑦𐑜𐑱𐑖𐑩𐑯 𐑯 𐑕𐑻𐑗</b> 𐑦𐑟 𐑩𐑯 𐑦𐑥𐑐𐑹𐑑𐑩𐑯𐑑 𐑐𐑸𐑑 𐑝 <i>·𐑱𐑝𐑰𐑟</i>. 𐑞 𐑜𐑴𐑤 𐑦𐑟 𐑓 𐑿𐑟𐑼𐑟 𐑑 𐑰𐑟𐑦𐑤𐑦 𐑓𐑤𐑴 𐑓𐑮𐑪𐑥 𐑨𐑤𐑚𐑩𐑥𐑟 𐑑 𐑓𐑴𐑑𐑴𐑟 𐑑 𐑑𐑨𐑜𐑟 𐑑 𐑥𐑨𐑐𐑕, 𐑯𐑯𐑯. + +<i>·𐑱𐑝𐑰𐑟</i> 𐑦𐑯𐑑𐑦𐑜𐑮𐑱𐑑𐑕 𐑢𐑦𐑞 ·𐑨𐑯𐑛𐑮𐑶𐑛 (𐑦𐑯𐑒𐑤𐑵𐑛𐑦𐑙 ·𐑨𐑯𐑛𐑮𐑶𐑛 ⸰𐑑𐑝) 𐑢𐑦𐑞 𐑓𐑰𐑗𐑼𐑟 𐑕𐑳𐑗 𐑨𐑟 <b>𐑢𐑦𐑡𐑩𐑑𐑕</b>, <b>𐑨𐑐 𐑖𐑹𐑑𐑒𐑳𐑑𐑕</b>, <b>𐑕𐑒𐑮𐑰𐑯 𐑕𐑱𐑝𐑼</b> 𐑯 <b>𐑜𐑤𐑴𐑚𐑩𐑤 𐑕𐑻𐑗</b> 𐑣𐑨𐑯𐑛𐑤𐑦𐑙. 𐑦𐑑 𐑷𐑤𐑕𐑴 𐑢𐑻𐑒𐑕 𐑨𐑟 𐑩 <b>𐑥𐑰𐑛𐑾 𐑝𐑿𐑼 𐑯 𐑐𐑦𐑒𐑼</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/en-XW-Shaw/images/featureGraphic.png b/fastlane/metadata/android/en-XW-Shaw/images/featureGraphic.png new file mode 100644 index 0000000..c12acf8 Binary files /dev/null and b/fastlane/metadata/android/en-XW-Shaw/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/1.png b/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/1.png new file mode 100644 index 0000000..60f84b6 Binary files /dev/null and b/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/2.png b/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/2.png new file mode 100644 index 0000000..6800dfe Binary files /dev/null and b/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/3.png b/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/3.png new file mode 100644 index 0000000..1d8b402 Binary files /dev/null and b/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/4.png b/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/4.png new file mode 100644 index 0000000..92b6075 Binary files /dev/null and b/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/5.png b/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/5.png new file mode 100644 index 0000000..a862897 Binary files /dev/null and b/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/6.png b/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/6.png new file mode 100644 index 0000000..33c147f Binary files /dev/null and b/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/7.png b/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/7.png new file mode 100644 index 0000000..6bbe64f Binary files /dev/null and b/fastlane/metadata/android/en-XW-Shaw/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/en-XW-Shaw/short_description.txt b/fastlane/metadata/android/en-XW-Shaw/short_description.txt new file mode 100644 index 0000000..9c2b68f --- /dev/null +++ b/fastlane/metadata/android/en-XW-Shaw/short_description.txt @@ -0,0 +1 @@ +𐑜𐑨𐑤𐑼𐑦 𐑯 𐑥𐑧𐑑𐑩𐑛𐑱𐑑𐑩 𐑦𐑒𐑕𐑐𐑤𐑹𐑼 \ No newline at end of file diff --git a/fastlane/metadata/android/es-MX/full_description.txt b/fastlane/metadata/android/es-MX/full_description.txt new file mode 100644 index 0000000..094e2e1 --- /dev/null +++ b/fastlane/metadata/android/es-MX/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> puede manejar todo tipo de imágenes y videos, incluyendo los típicos JPEG y MP4, pero además cosas mas exóticas como <b>TIFF multipágina, SVG, viejos AVI y más</b>! Inspecciona su colección multimedia para identificar <b>fotos en movimiento</b>, <b>panoramas</b> (conocidas como fotos esféricas), <b>videos en 360°</b> y también archivos <b>GeoTIFF</b>. + +La <b>navegación y búsqueda</b> son las partes más importantes de <i>Aves</i>. Su propósito es que los usuarios puedan fácilmente ir de álbumes a fotos, etiquetas, mapas, etc. + +<i>Aves</i> se integra con Android (incluido Android TV) con funciones como <b>complementos</b>, <b>accesos directos a aplicaciones</b>, <b>protector de pantalla</b> y <b>búsqueda global</b>. También funciona como un <b>visor y selector de medios</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/es-MX/images/featureGraphic.png b/fastlane/metadata/android/es-MX/images/featureGraphic.png new file mode 100755 index 0000000..be1a1f7 Binary files /dev/null and b/fastlane/metadata/android/es-MX/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/es-MX/images/phoneScreenshots/1.png b/fastlane/metadata/android/es-MX/images/phoneScreenshots/1.png new file mode 100644 index 0000000..c6f3450 Binary files /dev/null and b/fastlane/metadata/android/es-MX/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/es-MX/images/phoneScreenshots/2.png b/fastlane/metadata/android/es-MX/images/phoneScreenshots/2.png new file mode 100644 index 0000000..cb2f98b Binary files /dev/null and b/fastlane/metadata/android/es-MX/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/es-MX/images/phoneScreenshots/3.png b/fastlane/metadata/android/es-MX/images/phoneScreenshots/3.png new file mode 100644 index 0000000..fb5ae75 Binary files /dev/null and b/fastlane/metadata/android/es-MX/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/es-MX/images/phoneScreenshots/4.png b/fastlane/metadata/android/es-MX/images/phoneScreenshots/4.png new file mode 100644 index 0000000..39164dc Binary files /dev/null and b/fastlane/metadata/android/es-MX/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/es-MX/images/phoneScreenshots/5.png b/fastlane/metadata/android/es-MX/images/phoneScreenshots/5.png new file mode 100644 index 0000000..9944c20 Binary files /dev/null and b/fastlane/metadata/android/es-MX/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/es-MX/images/phoneScreenshots/6.png b/fastlane/metadata/android/es-MX/images/phoneScreenshots/6.png new file mode 100644 index 0000000..08cf946 Binary files /dev/null and b/fastlane/metadata/android/es-MX/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/es-MX/images/phoneScreenshots/7.png b/fastlane/metadata/android/es-MX/images/phoneScreenshots/7.png new file mode 100644 index 0000000..b56ebd4 Binary files /dev/null and b/fastlane/metadata/android/es-MX/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/es-MX/short_description.txt b/fastlane/metadata/android/es-MX/short_description.txt new file mode 100644 index 0000000..03b729c --- /dev/null +++ b/fastlane/metadata/android/es-MX/short_description.txt @@ -0,0 +1 @@ +Galería y visor de metadatos \ No newline at end of file diff --git a/fastlane/metadata/android/et/full_description.txt b/fastlane/metadata/android/et/full_description.txt new file mode 100644 index 0000000..cdf8112 --- /dev/null +++ b/fastlane/metadata/android/et/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> oskab kasutada eri sorti pildi- ja videofaile, alates tavalistest JPEG-piltidest kuni MP4-videoteni, aga samuti harvaesinevaid <b>mitmelehelisi TIFF-faile, SVG-graafikafaile, vanu AVI-videoid ja palju muud</b>! Skaneerides sinu meediakogu tuvastab ta <b>animeeritud pildifailid</b>, <b>panoraamfotod</b>, <b>360° videod</b>, aga ka <b>GeoTIFF</b>i-failid. + +<b>Meedias liikumine ja otsing</b> on oluline osa <i>Avesest</i>. Meie eesmärgiks on see, et rakenduses liikumine oleks sujuv - alates albumitest kuni fotode, siltide, kaartideni jne. + +<i>Aves</i> lõimub sujuvalt Androidiga (sh Android TV) kasutades muu hulgas võimalusi nagu <b>vidinad</b>, <b>rakenduse viited</b>, <b>ekraanisäästja</b> ja <b>üldotsing</b>. Ta toimib ka <b>meediaesitajana ja -valijana</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/et/images/featureGraphic.png b/fastlane/metadata/android/et/images/featureGraphic.png new file mode 100644 index 0000000..338dc15 Binary files /dev/null and b/fastlane/metadata/android/et/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/et/images/phoneScreenshots/1.png b/fastlane/metadata/android/et/images/phoneScreenshots/1.png new file mode 100644 index 0000000..91e46b8 Binary files /dev/null and b/fastlane/metadata/android/et/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/et/images/phoneScreenshots/2.png b/fastlane/metadata/android/et/images/phoneScreenshots/2.png new file mode 100644 index 0000000..2a9b2fd Binary files /dev/null and b/fastlane/metadata/android/et/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/et/images/phoneScreenshots/3.png b/fastlane/metadata/android/et/images/phoneScreenshots/3.png new file mode 100644 index 0000000..71246d2 Binary files /dev/null and b/fastlane/metadata/android/et/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/et/images/phoneScreenshots/4.png b/fastlane/metadata/android/et/images/phoneScreenshots/4.png new file mode 100644 index 0000000..e722316 Binary files /dev/null and b/fastlane/metadata/android/et/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/et/images/phoneScreenshots/5.png b/fastlane/metadata/android/et/images/phoneScreenshots/5.png new file mode 100644 index 0000000..35b3c38 Binary files /dev/null and b/fastlane/metadata/android/et/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/et/images/phoneScreenshots/6.png b/fastlane/metadata/android/et/images/phoneScreenshots/6.png new file mode 100644 index 0000000..543f42a Binary files /dev/null and b/fastlane/metadata/android/et/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/et/images/phoneScreenshots/7.png b/fastlane/metadata/android/et/images/phoneScreenshots/7.png new file mode 100644 index 0000000..ba4d16e Binary files /dev/null and b/fastlane/metadata/android/et/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/et/short_description.txt b/fastlane/metadata/android/et/short_description.txt new file mode 100644 index 0000000..9900c32 --- /dev/null +++ b/fastlane/metadata/android/et/short_description.txt @@ -0,0 +1 @@ +Galerii ja metainfo kuvaja \ No newline at end of file diff --git a/fastlane/metadata/android/eu/full_description.txt b/fastlane/metadata/android/eu/full_description.txt new file mode 100644 index 0000000..67340b2 --- /dev/null +++ b/fastlane/metadata/android/eu/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> aplikazioak mota guztitako irudi eta bideoak, nahiz zure ohiko JPEG eta MP4 fitxategiak, eta exotikoagoak diren <b>orri ugaritako TIFF, SVG, AVI zaharrak eta are gehiago</b> maneiatzen ditu! Zure media-bilduma eskaneatzen du <b>mugimendu-argazkiak</b>, <b>panoramikak</b> (argazki esferikoak bezala ere ezagunak), <b>360°-ko bideoak</b>, baita <b>GeoTIFF</b> fitxategiak ere. + +<b>Nabigazioa eta bilaketa</b> <i>Aves</i> aplikazioaren zati garrantzitsu bat da. Helburua, erabiltzaileek albumetatik argazkietara, etiketetara, mapetara, etab. modu errazean mugi ahal izatea da. + +<i>Aves</i> Androidera (Android TV barne) egiten da ezaugarri ugarirekin: <b>widgetak</b>, <b>aplikazioko lasterbideak</b>, <b>pantaila-babeslea</b> eta <b>bilaketa globala</b>. Baita ere, <b>media-bisore edo -hautagailu</b> bezala erabil daiteke. \ No newline at end of file diff --git a/fastlane/metadata/android/eu/images/featureGraphic.png b/fastlane/metadata/android/eu/images/featureGraphic.png new file mode 100755 index 0000000..405897a Binary files /dev/null and b/fastlane/metadata/android/eu/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/eu/images/phoneScreenshots/1.png b/fastlane/metadata/android/eu/images/phoneScreenshots/1.png new file mode 100644 index 0000000..a4a7b43 Binary files /dev/null and b/fastlane/metadata/android/eu/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/eu/images/phoneScreenshots/2.png b/fastlane/metadata/android/eu/images/phoneScreenshots/2.png new file mode 100644 index 0000000..3a4016f Binary files /dev/null and b/fastlane/metadata/android/eu/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/eu/images/phoneScreenshots/3.png b/fastlane/metadata/android/eu/images/phoneScreenshots/3.png new file mode 100644 index 0000000..43d9613 Binary files /dev/null and b/fastlane/metadata/android/eu/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/eu/images/phoneScreenshots/4.png b/fastlane/metadata/android/eu/images/phoneScreenshots/4.png new file mode 100644 index 0000000..d9563ef Binary files /dev/null and b/fastlane/metadata/android/eu/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/eu/images/phoneScreenshots/5.png b/fastlane/metadata/android/eu/images/phoneScreenshots/5.png new file mode 100644 index 0000000..b8e06cd Binary files /dev/null and b/fastlane/metadata/android/eu/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/eu/images/phoneScreenshots/6.png b/fastlane/metadata/android/eu/images/phoneScreenshots/6.png new file mode 100644 index 0000000..4ea10db Binary files /dev/null and b/fastlane/metadata/android/eu/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/eu/images/phoneScreenshots/7.png b/fastlane/metadata/android/eu/images/phoneScreenshots/7.png new file mode 100644 index 0000000..4601ced Binary files /dev/null and b/fastlane/metadata/android/eu/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/eu/short_description.txt b/fastlane/metadata/android/eu/short_description.txt new file mode 100644 index 0000000..b2d28aa --- /dev/null +++ b/fastlane/metadata/android/eu/short_description.txt @@ -0,0 +1 @@ +Galeria eta metadatuen nabigatzailea \ No newline at end of file diff --git a/fastlane/metadata/android/fa/full_description.txt b/fastlane/metadata/android/fa/full_description.txt new file mode 100644 index 0000000..2a23d01 --- /dev/null +++ b/fastlane/metadata/android/fa/full_description.txt @@ -0,0 +1,5 @@ +<i>اِیوْز</i> می تواند انواع تصاویر و ویدیوها، از جمله JPEG ها و MP4 های عادی شما را مدیریت کند، اما همچنین چیزهای عجیب و غریب تری مانند <b> TIFF های چند صفحه ای، SVG ها، AVI های قدیمی و بیشتر</b>! این مجموعه رسانه های شما را بررسی می کند تا پرونده های <b>تصویر متحرک</b>، <b>پانوراما</b> (معروف به تصاویر کروی)، <b>360° ویدیو ها</b>، و همچنین <b>geoTIFF</b> را شناسایی کند. + +<b>پیمایش و جستجو</b>یک بخش مهم از <i>اِیوْز</i> است. هدف این است که کاربران به راحتی از آلبوم ها به عکس ها به برچسب ها به نقشه ها و غیره دست پیدا کنند. + +<i>اِیوْز</i> با اندروید سازگار است (شامل تلوزیون اندرویدی) با قابلیت هایی مانند <b>ابزارک ها</b>, <b>میانبر ها</b>, <b>ذخیره نیرو</b> و <b>جستجو عمومی</b> و همچنین میتوان از آن به عنوان <b>نمایشگر و انتخابگر رسانه</b> استفاده کرد. \ No newline at end of file diff --git a/fastlane/metadata/android/fa/images/featureGraphic.png b/fastlane/metadata/android/fa/images/featureGraphic.png new file mode 100644 index 0000000..7dcf923 Binary files /dev/null and b/fastlane/metadata/android/fa/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/1.png b/fastlane/metadata/android/fa/images/phoneScreenshots/1.png new file mode 100644 index 0000000..62c4f52 Binary files /dev/null and b/fastlane/metadata/android/fa/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/2.png b/fastlane/metadata/android/fa/images/phoneScreenshots/2.png new file mode 100644 index 0000000..512bdb2 Binary files /dev/null and b/fastlane/metadata/android/fa/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/3.png b/fastlane/metadata/android/fa/images/phoneScreenshots/3.png new file mode 100644 index 0000000..7e6bc6c Binary files /dev/null and b/fastlane/metadata/android/fa/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/4.png b/fastlane/metadata/android/fa/images/phoneScreenshots/4.png new file mode 100644 index 0000000..542432d Binary files /dev/null and b/fastlane/metadata/android/fa/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/5.png b/fastlane/metadata/android/fa/images/phoneScreenshots/5.png new file mode 100644 index 0000000..f8feef9 Binary files /dev/null and b/fastlane/metadata/android/fa/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/6.png b/fastlane/metadata/android/fa/images/phoneScreenshots/6.png new file mode 100644 index 0000000..fd4ac3a Binary files /dev/null and b/fastlane/metadata/android/fa/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/7.png b/fastlane/metadata/android/fa/images/phoneScreenshots/7.png new file mode 100644 index 0000000..76e7408 Binary files /dev/null and b/fastlane/metadata/android/fa/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/fa/short_description.txt b/fastlane/metadata/android/fa/short_description.txt new file mode 100644 index 0000000..0cebfe9 --- /dev/null +++ b/fastlane/metadata/android/fa/short_description.txt @@ -0,0 +1 @@ +پویشگر گالری و فراداده \ No newline at end of file diff --git a/fastlane/metadata/android/fi/full_description.txt b/fastlane/metadata/android/fi/full_description.txt new file mode 100644 index 0000000..2b77936 --- /dev/null +++ b/fastlane/metadata/android/fi/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> pystyy käsittelemään kaikenlaisia kuvia ja videoita, mukaan lukien tyypillisiä JPEG- ja MP4-tiedostoja, mutta myös eksoottisempia asioita, kuten <b>monisivuisia TIFF-, SVG- ja vanhoja AVI-tiedostoja</b>! Se skannaa mediakokoelmasi tunnistaakseen <b>liikevalokuvia</b>, <b>panoraamakuvia</b> (eli valokuvasfäärejä), <b>360°-videoita</b> sekä <b>GeoTIFF</b>-tiedostoja. + +<b>Navigointi ja haku</b> ovat tärkeä osa <i>Aves</i>ia. Tavoitteena on, että käyttäjät voivat helposti siirtyä albumeista valokuviin, tunnisteisiin, karttoihin jne. + +<i>Aves</i> integroituu Androidiin (mukaan lukien Android TV) ja sisältää ominaisuuksia, kuten <b>widgetit</b>, <b>sovellusten pikakuvakkeet</b>, <b>näytönsäästäjä</b> ja <b>järjestelmänlaajuisen haun</b> käsittelyn. Se toimii myös <b>median katseluohjelmana sekä valitsijana.</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/fi/images/featureGraphic.png b/fastlane/metadata/android/fi/images/featureGraphic.png new file mode 100644 index 0000000..6afae6d Binary files /dev/null and b/fastlane/metadata/android/fi/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/fi/images/phoneScreenshots/1.png b/fastlane/metadata/android/fi/images/phoneScreenshots/1.png new file mode 100644 index 0000000..f2cad4f Binary files /dev/null and b/fastlane/metadata/android/fi/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/fi/images/phoneScreenshots/2.png b/fastlane/metadata/android/fi/images/phoneScreenshots/2.png new file mode 100644 index 0000000..32ac0f4 Binary files /dev/null and b/fastlane/metadata/android/fi/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/fi/images/phoneScreenshots/3.png b/fastlane/metadata/android/fi/images/phoneScreenshots/3.png new file mode 100644 index 0000000..8d693eb Binary files /dev/null and b/fastlane/metadata/android/fi/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/fi/images/phoneScreenshots/4.png b/fastlane/metadata/android/fi/images/phoneScreenshots/4.png new file mode 100644 index 0000000..6413f8c Binary files /dev/null and b/fastlane/metadata/android/fi/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/fi/images/phoneScreenshots/5.png b/fastlane/metadata/android/fi/images/phoneScreenshots/5.png new file mode 100644 index 0000000..fb71c9d Binary files /dev/null and b/fastlane/metadata/android/fi/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/fi/images/phoneScreenshots/6.png b/fastlane/metadata/android/fi/images/phoneScreenshots/6.png new file mode 100644 index 0000000..510ad68 Binary files /dev/null and b/fastlane/metadata/android/fi/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/fi/images/phoneScreenshots/7.png b/fastlane/metadata/android/fi/images/phoneScreenshots/7.png new file mode 100644 index 0000000..1c51553 Binary files /dev/null and b/fastlane/metadata/android/fi/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/fi/short_description.txt b/fastlane/metadata/android/fi/short_description.txt new file mode 100644 index 0000000..2c8c7f4 --- /dev/null +++ b/fastlane/metadata/android/fi/short_description.txt @@ -0,0 +1 @@ +Galleria ja metatietojen selain \ No newline at end of file diff --git a/fastlane/metadata/android/fr/full_description.txt b/fastlane/metadata/android/fr/full_description.txt new file mode 100644 index 0000000..55fa045 --- /dev/null +++ b/fastlane/metadata/android/fr/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> supporte toutes sortes d’images et de vidéos comme les JPEG et les MP4 typiques, mais aussi des formats plus exotiques comme <b>les TIFF multipages, les SVG, les vieux AVI et bien plus encore</b> ! Votre collection multimédia est analysée pour identifier les <b>photos animées</b>, les <b>panoramas</b> (alias sphères photo), les <b>vidéos à 360°</b> ainsi que les fichiers <b>GeoTIFF</b>. + +<b>La navigation et la recherche</b> sont une partie importante d’<i>Aves</i>. Le but est que les utilisateurs puissent passer facilement des albums aux photos, des photos aux tags, des tags aux cartes, etc. + +<i>Aves</i> s’intègre avec Android (y compris Android TV) avec des fonctionnalités telles que les <b>widgets</b>, les <b>raccourcis d’application</b>, <b>économiseur d’écran</b> et la <b>recherche globale</b>. Il est également possible de l’utiliser comme <b>visionneuse et sélecteur de médias</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/fr/images/featureGraphic.png b/fastlane/metadata/android/fr/images/featureGraphic.png new file mode 100755 index 0000000..c18ccc0 Binary files /dev/null and b/fastlane/metadata/android/fr/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/1.png b/fastlane/metadata/android/fr/images/phoneScreenshots/1.png new file mode 100644 index 0000000..874d367 Binary files /dev/null and b/fastlane/metadata/android/fr/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/2.png b/fastlane/metadata/android/fr/images/phoneScreenshots/2.png new file mode 100644 index 0000000..2c79284 Binary files /dev/null and b/fastlane/metadata/android/fr/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/3.png b/fastlane/metadata/android/fr/images/phoneScreenshots/3.png new file mode 100644 index 0000000..6ff68b0 Binary files /dev/null and b/fastlane/metadata/android/fr/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/4.png b/fastlane/metadata/android/fr/images/phoneScreenshots/4.png new file mode 100644 index 0000000..5c88eb2 Binary files /dev/null and b/fastlane/metadata/android/fr/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/5.png b/fastlane/metadata/android/fr/images/phoneScreenshots/5.png new file mode 100644 index 0000000..6da2968 Binary files /dev/null and b/fastlane/metadata/android/fr/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/6.png b/fastlane/metadata/android/fr/images/phoneScreenshots/6.png new file mode 100644 index 0000000..85b043a Binary files /dev/null and b/fastlane/metadata/android/fr/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/7.png b/fastlane/metadata/android/fr/images/phoneScreenshots/7.png new file mode 100644 index 0000000..02700e1 Binary files /dev/null and b/fastlane/metadata/android/fr/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/fr/short_description.txt b/fastlane/metadata/android/fr/short_description.txt new file mode 100644 index 0000000..717eb41 --- /dev/null +++ b/fastlane/metadata/android/fr/short_description.txt @@ -0,0 +1 @@ +Galerie et explorateur de métadonnées \ No newline at end of file diff --git a/fastlane/metadata/android/gl/full_description.txt b/fastlane/metadata/android/gl/full_description.txt new file mode 100644 index 0000000..cae333e --- /dev/null +++ b/fastlane/metadata/android/gl/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> pode xestionar todo tipo de imaxes e vídeos, incluídos os teus JPEG e MP4 típicos, pero tamén cousas máis exóticas como <b>TIFF de varias páxinas, SVG, AVI antigos e moito máis</b>. Analiza a túa colección multimedia para identificar <b>fotos en movemento</b>, <b>panoramas</b> (tamén coñecidos como fotografías esféricas), <b>vídeos de 360°</b>, así como <b>GeoTIFF</b> ficheiros. + +A <b>navegación e busca</b> é unha parte importante de <i>Aves</i>. O obxectivo é que os usuarios poidan fluír facilmente de álbums a fotos, a etiquetas a mapas, etc. + +<i>Aves</i> intégrase con Android (incluíndo Android TV) con funcións como <b>complementos</b>, <b>atallos de aplicacións</b>, <b>salvapantallas</b> e <b>busca global</b>. Tamén funciona como <b>visor e selector de medios</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/gl/images/featureGraphic.png b/fastlane/metadata/android/gl/images/featureGraphic.png new file mode 100755 index 0000000..be1a1f7 Binary files /dev/null and b/fastlane/metadata/android/gl/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/gl/images/phoneScreenshots/1.png b/fastlane/metadata/android/gl/images/phoneScreenshots/1.png new file mode 100644 index 0000000..b30e957 Binary files /dev/null and b/fastlane/metadata/android/gl/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/gl/images/phoneScreenshots/2.png b/fastlane/metadata/android/gl/images/phoneScreenshots/2.png new file mode 100644 index 0000000..934befe Binary files /dev/null and b/fastlane/metadata/android/gl/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/gl/images/phoneScreenshots/3.png b/fastlane/metadata/android/gl/images/phoneScreenshots/3.png new file mode 100644 index 0000000..3ab853d Binary files /dev/null and b/fastlane/metadata/android/gl/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/gl/images/phoneScreenshots/4.png b/fastlane/metadata/android/gl/images/phoneScreenshots/4.png new file mode 100644 index 0000000..8230807 Binary files /dev/null and b/fastlane/metadata/android/gl/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/gl/images/phoneScreenshots/5.png b/fastlane/metadata/android/gl/images/phoneScreenshots/5.png new file mode 100644 index 0000000..3d67e4c Binary files /dev/null and b/fastlane/metadata/android/gl/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/gl/images/phoneScreenshots/6.png b/fastlane/metadata/android/gl/images/phoneScreenshots/6.png new file mode 100644 index 0000000..f43d968 Binary files /dev/null and b/fastlane/metadata/android/gl/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/gl/images/phoneScreenshots/7.png b/fastlane/metadata/android/gl/images/phoneScreenshots/7.png new file mode 100644 index 0000000..d29b331 Binary files /dev/null and b/fastlane/metadata/android/gl/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/gl/short_description.txt b/fastlane/metadata/android/gl/short_description.txt new file mode 100644 index 0000000..f691b66 --- /dev/null +++ b/fastlane/metadata/android/gl/short_description.txt @@ -0,0 +1 @@ +Galería e explorador de metadatos \ No newline at end of file diff --git a/fastlane/metadata/android/he/full_description.txt b/fastlane/metadata/android/he/full_description.txt new file mode 100644 index 0000000..d8441c3 --- /dev/null +++ b/fastlane/metadata/android/he/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> יכול להתמודד עם כל מיני תמונות וסרטונים, כולל קובצי JPEG ו-MP4 הטיפוסיים שלך, אבל גם דברים אקזוטיים יותר כמו <b>TIFF מרובי עמודים, SVGs, AVI ישנים ועוד</b>! הוא סורק את אוסף המדיה שלך כדי לזהות <b>תמונות תנועה</b>, <b>פנורמות</b> (הידוע גם בתמונות פנורמיות), <b>סרטוני 360°</b>, וכן קבצי <b>GeoTIFF</b>. + +<b>ניווט וחיפוש</b> הם חלק חשוב ב-<i>Aves</i>. המטרה היא שהמשתמשים יזרמו בקלות מאלבומים לתמונות לתגים למפות וכו'. + +<i>Aves</i> משתלב עם Android (כולל Android TV) עם תכונות כגון <b>ווידג'טים</b>, <b>קיצורי אפליקציות</b>, <b>שומר מסך</b> וטיפול ב<b>חיפוש גלובלי</b>. הוא פועל גם כ<b>מציג ובוחר מדיה</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/he/short_description.txt b/fastlane/metadata/android/he/short_description.txt new file mode 100644 index 0000000..e419023 --- /dev/null +++ b/fastlane/metadata/android/he/short_description.txt @@ -0,0 +1 @@ +סייר גלריה ומטא נתונים \ No newline at end of file diff --git a/fastlane/metadata/android/hi/full_description.txt b/fastlane/metadata/android/hi/full_description.txt new file mode 100644 index 0000000..0a5ea36 --- /dev/null +++ b/fastlane/metadata/android/hi/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> आपके ठेठ JPEGs और MP4s सम्मिलित करते हुए, लगभग सभी प्रकार के Photos और Videos को सम्भाल सकता है, साथ के साथ यह <b>multi-page TIFFs, SVGs, old AVIs और भी बहुत कुछ संभालता है </b>! यह आपके Media संग्रह की जाँच करता है, ताकि यह <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, और <b>GeoTIFF</b> files की पहचान कर सके । + +<b>नेविगेशन और खोज</b> <i>एव्ज </i>का एक महत्वपूर्ण हिस्सा है। लक्ष्य यह है कि उपयोगकर्ता एल्बम से फ़ोटो, टैग से मानचित्र आदि तक आसानी से पहुच सकें। + +<i>एव्ज</i> एंड्रॉइड (एंड्रॉइड टीवी सहित) के साथ <b>विजेट्स</b>, <b>ऐप शॉर्टकट</b>, <b>स्क्रीन सेवर</b> और <b>ग्लोबल सर्च</b> हैंडलिंग जैसी सुविधाओं के साथ एकीकृत होता है। यह <b>मीडिया व्यूअर और पिकर</b> के रूप में भी काम करता है। \ No newline at end of file diff --git a/fastlane/metadata/android/hi/short_description.txt b/fastlane/metadata/android/hi/short_description.txt new file mode 100644 index 0000000..ba793e5 --- /dev/null +++ b/fastlane/metadata/android/hi/short_description.txt @@ -0,0 +1 @@ +गैलरी और मोटाडेटा एक्स्प्लोरर \ No newline at end of file diff --git a/fastlane/metadata/android/hr/full_description.txt b/fastlane/metadata/android/hr/full_description.txt new file mode 100644 index 0000000..d22ecc8 --- /dev/null +++ b/fastlane/metadata/android/hr/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> može upravljati svim vrstama slika i videa, uključujući tipčne JPEG i PNG, ali takošer i egzotičnije formate kao <b>višestranične TIFF-ove, SVGove, stare AVI-jeve, i još toga</b>! Skenira tvoju medijsku zbirku kako bi prepoznao <b>fotografije s pokretom</b>, <b>panorame</b> (tzv. foto-sfere), <b>360° videozapise</b>, kao i <b>GeoTIFF</b> datoteke. + +<b>Navigacija i pretraživanje</b> važan su dio <i>Avesa</i>. Cilj je da korisnici mogu lako i prirodno prelaziti s albuma na fotografije, zatim na oznake, karte i ostalo. + +<i>Aves</i> se integrira s Androidom (uključujući Android TV) uz značajke poput <b>widgeta</b>, <b>prečaca aplikacije</b>, <b>zaslonskog čuvara</b> i <b>globalnog pretraživanja</b>. Također radi kao <b>preglednik i birač medija</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/hr/short_description.txt b/fastlane/metadata/android/hr/short_description.txt new file mode 100644 index 0000000..d377038 --- /dev/null +++ b/fastlane/metadata/android/hr/short_description.txt @@ -0,0 +1 @@ +Galerija i preglednik metapodataka \ No newline at end of file diff --git a/fastlane/metadata/android/hu/full_description.txt b/fastlane/metadata/android/hu/full_description.txt new file mode 100644 index 0000000..ac7e42d --- /dev/null +++ b/fastlane/metadata/android/hu/full_description.txt @@ -0,0 +1,5 @@ +Az <i>Aves</i> mindenféle képet és videót képes kezelni, beleértve a tipikus JPEG és MP4 fájlokat, de egzotikusabb dolgokat is, mint például a <b>többoldalas TIFF, SVG, régi AVI és még sok minden mást</b>! Beolvassa a médiagyűjteményed, hogy azonosítsa a <b>mozgóképeket</b>, <b>panorámaképeket</b> (más néven fotógömbök), <b> 360 °-os videókat</b>, valamint <b>GeoTIFF</b> fájlokat. + +A <b>navigáció és a keresés</b> fontos része az <i>Aves</i>-nek. A cél, hogy a felhasználók egyszerűen tudjanak váltani az albumokról a fotókra, címkézni vagy helyadatokkal ellátni az elemeket, stb. + +Az <i>Aves</i> beépül az Android-ba (beleértve az Android TV-t) olyan funkciókkal, mint a <b>widgetek</b>, <b>alkalmazás parancsikonok</b>, <b>képernyővédő</b> és <b>globális keresés</b> kezelése. <b>Média fájlok megnyitására és kezelésére</b> is használható. \ No newline at end of file diff --git a/fastlane/metadata/android/hu/images/featureGraphic.png b/fastlane/metadata/android/hu/images/featureGraphic.png new file mode 100644 index 0000000..f3a5ff2 Binary files /dev/null and b/fastlane/metadata/android/hu/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/hu/images/phoneScreenshots/1.png b/fastlane/metadata/android/hu/images/phoneScreenshots/1.png new file mode 100644 index 0000000..5ac53e8 Binary files /dev/null and b/fastlane/metadata/android/hu/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/hu/images/phoneScreenshots/2.png b/fastlane/metadata/android/hu/images/phoneScreenshots/2.png new file mode 100644 index 0000000..0994067 Binary files /dev/null and b/fastlane/metadata/android/hu/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/hu/images/phoneScreenshots/3.png b/fastlane/metadata/android/hu/images/phoneScreenshots/3.png new file mode 100644 index 0000000..ea8180c Binary files /dev/null and b/fastlane/metadata/android/hu/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/hu/images/phoneScreenshots/4.png b/fastlane/metadata/android/hu/images/phoneScreenshots/4.png new file mode 100644 index 0000000..1b1734e Binary files /dev/null and b/fastlane/metadata/android/hu/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/hu/images/phoneScreenshots/5.png b/fastlane/metadata/android/hu/images/phoneScreenshots/5.png new file mode 100644 index 0000000..21117ac Binary files /dev/null and b/fastlane/metadata/android/hu/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/hu/images/phoneScreenshots/6.png b/fastlane/metadata/android/hu/images/phoneScreenshots/6.png new file mode 100644 index 0000000..cbe8f4c Binary files /dev/null and b/fastlane/metadata/android/hu/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/hu/images/phoneScreenshots/7.png b/fastlane/metadata/android/hu/images/phoneScreenshots/7.png new file mode 100644 index 0000000..dbf9d06 Binary files /dev/null and b/fastlane/metadata/android/hu/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/hu/short_description.txt b/fastlane/metadata/android/hu/short_description.txt new file mode 100644 index 0000000..ac60a42 --- /dev/null +++ b/fastlane/metadata/android/hu/short_description.txt @@ -0,0 +1 @@ +Galéria és metaadat böngésző \ No newline at end of file diff --git a/fastlane/metadata/android/id/full_description.txt b/fastlane/metadata/android/id/full_description.txt new file mode 100644 index 0000000..40e0e62 --- /dev/null +++ b/fastlane/metadata/android/id/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> dapat menangani semua jenis gambar dan video, termasuk JPEG dan MP4, tetapi juga hal-hal yang lebih eksotis seperti <b>TIFF halaman-multi, SVG, AVI lama, dan lainnya</b>! Ini memindai koleksi media Anda untuk mengidentifikasi <b>foto bergerak</b>, <b>panorama</b> (foto 360), <b>video 360°</b>, dan file <b>GeoTIFF</b>. + +<b>Navigasi dan pencarian</b> merupakan bagian penting dari <i>Aves</i>. Tujuannya adalah agar pengguna dengan mudah mengalir dari album ke foto ke tag ke peta, dll. + +<i>Aves</i> mengintegrasi dengan Android dengan fitur-fitur seperti <b>pintasan aplikasi</b>, <b>jalan pintas aplikasi</b>, <b>screen saver</b> dan <b>pencarian global</b> penanganan. Ini juga berfungsi sebagai <b>penampil dan pemilih media</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/id/images/featureGraphic.png b/fastlane/metadata/android/id/images/featureGraphic.png new file mode 100644 index 0000000..2936322 Binary files /dev/null and b/fastlane/metadata/android/id/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/id/images/phoneScreenshots/1.png b/fastlane/metadata/android/id/images/phoneScreenshots/1.png new file mode 100644 index 0000000..bc30b5c Binary files /dev/null and b/fastlane/metadata/android/id/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/id/images/phoneScreenshots/2.png b/fastlane/metadata/android/id/images/phoneScreenshots/2.png new file mode 100644 index 0000000..6781dd9 Binary files /dev/null and b/fastlane/metadata/android/id/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/id/images/phoneScreenshots/3.png b/fastlane/metadata/android/id/images/phoneScreenshots/3.png new file mode 100644 index 0000000..9dc2dba Binary files /dev/null and b/fastlane/metadata/android/id/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/id/images/phoneScreenshots/4.png b/fastlane/metadata/android/id/images/phoneScreenshots/4.png new file mode 100644 index 0000000..af64d78 Binary files /dev/null and b/fastlane/metadata/android/id/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/id/images/phoneScreenshots/5.png b/fastlane/metadata/android/id/images/phoneScreenshots/5.png new file mode 100644 index 0000000..1bd4f16 Binary files /dev/null and b/fastlane/metadata/android/id/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/id/images/phoneScreenshots/6.png b/fastlane/metadata/android/id/images/phoneScreenshots/6.png new file mode 100644 index 0000000..7489260 Binary files /dev/null and b/fastlane/metadata/android/id/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/id/images/phoneScreenshots/7.png b/fastlane/metadata/android/id/images/phoneScreenshots/7.png new file mode 100644 index 0000000..7fc59e5 Binary files /dev/null and b/fastlane/metadata/android/id/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/id/short_description.txt b/fastlane/metadata/android/id/short_description.txt new file mode 100644 index 0000000..0dc05cd --- /dev/null +++ b/fastlane/metadata/android/id/short_description.txt @@ -0,0 +1 @@ +Galeri dan penjelajah metadata \ No newline at end of file diff --git a/fastlane/metadata/android/is/full_description.txt b/fastlane/metadata/android/is/full_description.txt new file mode 100644 index 0000000..b3214f5 --- /dev/null +++ b/fastlane/metadata/android/is/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> getur meðhöndlað allar algengar gerðir mynda og myndskeiða, þar með talið JPEG og MP4, en einnig sjaldgæfari skrár á borð við <b>marg-síðna TIFF-myndir, SVG-línuteikningar, eldri gerðir AVI-skráa og margt fleira</b>! Forritið skannar safnið þitt til að greina <b>hreyfiljósmyndir</b>, <b>víðmyndir</b> (t.d. myndahnetti), <b>360° myndskeið</b>, auk <b>GeoTIFF-skráa</b>. + +<b>Flakk og leit</b> eru mikilvægir hlutar <i>Aves</i>. Markmiðið er að notendur eigi auðvelt með að flæða úr albúmum yfir í ljósmyndir yfir í merki eða landakort, o.s.frv. + +<i>Aves</i> samtvinnast við Android (að meðtöldu Android TV) með eiginleikum á borð við <b>viðmótshluta</b>, <b>flýtileiðir í forrit</b>, <b>skjáhvílu</b> og <b>víðværa leit</b>. Það virkar einnig sem <b>margmiðlunarskoðari og veljari</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/is/images/featureGraphic.png b/fastlane/metadata/android/is/images/featureGraphic.png new file mode 100644 index 0000000..2b65e24 Binary files /dev/null and b/fastlane/metadata/android/is/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/is/images/phoneScreenshots/1.png b/fastlane/metadata/android/is/images/phoneScreenshots/1.png new file mode 100644 index 0000000..4de3416 Binary files /dev/null and b/fastlane/metadata/android/is/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/is/images/phoneScreenshots/2.png b/fastlane/metadata/android/is/images/phoneScreenshots/2.png new file mode 100644 index 0000000..f9dc74e Binary files /dev/null and b/fastlane/metadata/android/is/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/is/images/phoneScreenshots/3.png b/fastlane/metadata/android/is/images/phoneScreenshots/3.png new file mode 100644 index 0000000..47e870e Binary files /dev/null and b/fastlane/metadata/android/is/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/is/images/phoneScreenshots/4.png b/fastlane/metadata/android/is/images/phoneScreenshots/4.png new file mode 100644 index 0000000..198b33a Binary files /dev/null and b/fastlane/metadata/android/is/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/is/images/phoneScreenshots/5.png b/fastlane/metadata/android/is/images/phoneScreenshots/5.png new file mode 100644 index 0000000..751506e Binary files /dev/null and b/fastlane/metadata/android/is/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/is/images/phoneScreenshots/6.png b/fastlane/metadata/android/is/images/phoneScreenshots/6.png new file mode 100644 index 0000000..81ed9cd Binary files /dev/null and b/fastlane/metadata/android/is/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/is/images/phoneScreenshots/7.png b/fastlane/metadata/android/is/images/phoneScreenshots/7.png new file mode 100644 index 0000000..b307d2c Binary files /dev/null and b/fastlane/metadata/android/is/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/is/short_description.txt b/fastlane/metadata/android/is/short_description.txt new file mode 100644 index 0000000..c47534b --- /dev/null +++ b/fastlane/metadata/android/is/short_description.txt @@ -0,0 +1 @@ +Myndasafn og skoðun lýsigagna \ No newline at end of file diff --git a/fastlane/metadata/android/it/full_description.txt b/fastlane/metadata/android/it/full_description.txt new file mode 100644 index 0000000..053682d --- /dev/null +++ b/fastlane/metadata/android/it/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> può gestire tutti i tipi di immagini e video, compresi i tipici JPEG e MP4, ma anche cose più esotiche come <b>TIFF multipagina, SVG, vecchi AVI e molto di più</b>! Scansiona la tua collezione di media per identificare <b>foto in movimento</b>, <b>panorami</b> (le foto sferiche), <b>video a 360°</b>, così come i file <b>GeoTIFF</b>. + +<b>Navigazione e ricerca</b> sono una parte importante di <i>Aves</i>. L'obiettivo è che gli utenti passino facilmente dagli album alle foto, ai tag, alle mappe, ecc. + +<i>Aves</i> si integra con Android (anche Android TV) con funzionalità come <b>widget</b>, <b>scorciatoie app</b>, <b>salvaschermo</b> e gestione della <b>ricerca globale</b>. Funziona anche come <b>visualizzazione e raccolta di media</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/it/images/featureGraphic.png b/fastlane/metadata/android/it/images/featureGraphic.png new file mode 100644 index 0000000..6afae6d Binary files /dev/null and b/fastlane/metadata/android/it/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/it/images/phoneScreenshots/1.png b/fastlane/metadata/android/it/images/phoneScreenshots/1.png new file mode 100644 index 0000000..3c813e0 Binary files /dev/null and b/fastlane/metadata/android/it/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/it/images/phoneScreenshots/2.png b/fastlane/metadata/android/it/images/phoneScreenshots/2.png new file mode 100644 index 0000000..2f09c29 Binary files /dev/null and b/fastlane/metadata/android/it/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/it/images/phoneScreenshots/3.png b/fastlane/metadata/android/it/images/phoneScreenshots/3.png new file mode 100644 index 0000000..a0465d5 Binary files /dev/null and b/fastlane/metadata/android/it/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/it/images/phoneScreenshots/4.png b/fastlane/metadata/android/it/images/phoneScreenshots/4.png new file mode 100644 index 0000000..90fbeb7 Binary files /dev/null and b/fastlane/metadata/android/it/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/it/images/phoneScreenshots/5.png b/fastlane/metadata/android/it/images/phoneScreenshots/5.png new file mode 100644 index 0000000..54cc52b Binary files /dev/null and b/fastlane/metadata/android/it/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/it/images/phoneScreenshots/6.png b/fastlane/metadata/android/it/images/phoneScreenshots/6.png new file mode 100644 index 0000000..ee26fdb Binary files /dev/null and b/fastlane/metadata/android/it/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/it/images/phoneScreenshots/7.png b/fastlane/metadata/android/it/images/phoneScreenshots/7.png new file mode 100644 index 0000000..4a3173d Binary files /dev/null and b/fastlane/metadata/android/it/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/it/short_description.txt b/fastlane/metadata/android/it/short_description.txt new file mode 100644 index 0000000..9eb3e64 --- /dev/null +++ b/fastlane/metadata/android/it/short_description.txt @@ -0,0 +1 @@ +Galleria e esploratore di metadati \ No newline at end of file diff --git a/fastlane/metadata/android/ja/full_description.txt b/fastlane/metadata/android/ja/full_description.txt new file mode 100644 index 0000000..7166ecc --- /dev/null +++ b/fastlane/metadata/android/ja/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i>はあらゆる画像や動画を扱うことができ、一般的なJPEGやMP4はもちろん、 <b>マルチページTIFF、SVG、古いAVIなどの珍しい形式にも対応</b>しています! メディアコレクションをスキャンして、<b>モーションフォト</b>、<b>パノラマ</b>(Photo Sphere)、<b>360°動画</b>、<b>GeoTIFF</b>ファイルなどを識別します。 + +<b>ナビゲーションと検索</b>は、<i>Aves</i>の重要な部分です。アルバムから写真、タグ、地図などへ簡単に移動できます。 + +<i>Aves</i>は、<b>アプリショートカット</b>や<b>グローバル検索</b>などの機能を、Androidと統合しています。また、<b>メディアビューワー</b>や<b>メディアピッカー</b>としても機能します。 \ No newline at end of file diff --git a/fastlane/metadata/android/ja/images/featureGraphic.png b/fastlane/metadata/android/ja/images/featureGraphic.png new file mode 100644 index 0000000..1d72a07 Binary files /dev/null and b/fastlane/metadata/android/ja/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/ja/images/phoneScreenshots/1.png b/fastlane/metadata/android/ja/images/phoneScreenshots/1.png new file mode 100644 index 0000000..c12907f Binary files /dev/null and b/fastlane/metadata/android/ja/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/ja/images/phoneScreenshots/2.png b/fastlane/metadata/android/ja/images/phoneScreenshots/2.png new file mode 100644 index 0000000..5d06cc3 Binary files /dev/null and b/fastlane/metadata/android/ja/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/ja/images/phoneScreenshots/3.png b/fastlane/metadata/android/ja/images/phoneScreenshots/3.png new file mode 100644 index 0000000..b262c64 Binary files /dev/null and b/fastlane/metadata/android/ja/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/ja/images/phoneScreenshots/4.png b/fastlane/metadata/android/ja/images/phoneScreenshots/4.png new file mode 100644 index 0000000..c88922e Binary files /dev/null and b/fastlane/metadata/android/ja/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/ja/images/phoneScreenshots/5.png b/fastlane/metadata/android/ja/images/phoneScreenshots/5.png new file mode 100644 index 0000000..2c9b771 Binary files /dev/null and b/fastlane/metadata/android/ja/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/ja/images/phoneScreenshots/6.png b/fastlane/metadata/android/ja/images/phoneScreenshots/6.png new file mode 100644 index 0000000..5db6398 Binary files /dev/null and b/fastlane/metadata/android/ja/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/ja/images/phoneScreenshots/7.png b/fastlane/metadata/android/ja/images/phoneScreenshots/7.png new file mode 100644 index 0000000..9ada59f Binary files /dev/null and b/fastlane/metadata/android/ja/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/ja/short_description.txt b/fastlane/metadata/android/ja/short_description.txt new file mode 100644 index 0000000..205b242 --- /dev/null +++ b/fastlane/metadata/android/ja/short_description.txt @@ -0,0 +1 @@ +ギャラリーとメタデータエクスプローラー \ No newline at end of file diff --git a/fastlane/metadata/android/kmr/full_description.txt b/fastlane/metadata/android/kmr/full_description.txt new file mode 100644 index 0000000..a423f58 --- /dev/null +++ b/fastlane/metadata/android/kmr/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navîgasyon û lêgerin</b> beşeke girîng e ji <i>Aves</i>. Armanc ew e ku bikarhêner bi hêsanî ji elbuman derbasî wêneyan , nîşankan û nexşeyan bibe. + +<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/kmr/short_description.txt b/fastlane/metadata/android/kmr/short_description.txt new file mode 100644 index 0000000..5c49eb5 --- /dev/null +++ b/fastlane/metadata/android/kmr/short_description.txt @@ -0,0 +1 @@ +Wênegeh û gervanê metadata \ No newline at end of file diff --git a/fastlane/metadata/android/kn/full_description.txt b/fastlane/metadata/android/kn/full_description.txt new file mode 100644 index 0000000..9b6e041 --- /dev/null +++ b/fastlane/metadata/android/kn/full_description.txt @@ -0,0 +1,5 @@ +<i>ಏವೀಸ್</i> ನಿಮ್ಮ JPEG ಗಳು ಮತ್ತು MP4 ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ಎಲ್ಲಾ ರೀತಿಯ ಚಿತ್ರಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳನ್ನು ನಿಭಾಯಿಸಬಲ್ಲದು, ಅಲ್ಲದೆ ವಿಶಿಷ್ಟವಾದ <b>ಬಹು-ಪುಟ TIFFಗಳು, SVGಗಳು, ಹಳೆಯ AVIಗಳು ಮತ್ತು ಹಲವು ಪ್ರಕಾರಗಳನ್ನು ಕೂಡ ಬೆಂಬಲಿಸುತ್ತದೆ</b> ಇದು <b>ಚಲನೆಯ ಫೋಟೋಗಳು</b>, <b>ಪನೋರಮಾಗಳು</b> (ಫೋಟೋ ಗೋಳಗಳು) <b>360° ವೀಡಿಯೊಗಳು</b>, ಹಾಗೆಯೇ <b>GeoTIFF</b> ಕಡತಗಳನ್ನು ಗುರುತಿಸಲು ನಿಮ್ಮ ಮಾಧ್ಯಮ ಸಂಗ್ರಹವನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡುತ್ತದೆ. + +<b>ನ್ಯಾವಿಗೇಷನ್ ಮತ್ತು ಹುಡುಕಾಟ</b> <i>ಏವೀಸ್</i>ನ ಒಂದು ಪ್ರಮುಖ ಭಾಗವಾಗಿದೆ. ಬಳಕೆದಾರರು ಆಲ್ಬಮ್‌ಗಳಿಂದ ಫೋಟೋಗಳಿಂದ ಟ್ಯಾಗ್‌ಗಳಿಗೆ ನಕ್ಷೆಗಳಿಗೆ ಸುಲಭವಾಗಿ ಹರಿಯುವುದು ಗುರಿಯಾಗಿದೆ. + +<i>ಎವೀಸ್</i> ಆಂಡ್ರಾಯ್ಡ್ (ಟಿವಿ ಸೇರಿದಂತೆ) ನೊಂದಿಗೆ ಸಂಯೋಜಿಸುತ್ತದೆ, ಉದಾಹರಣೆಗೆ <b>ವಿಜೆಟ್‌ಗಳು</b>, <b>ಆ್ಯಪ್ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು</b>, <b>ಸ್ಕ್ರೀನ್ ಸೇವರ್</b> ಮತ್ತು <b>ಜಾಗತಿಕ ಹುಡುಕಾಟ</b> ನಿರ್ವಹಣೆ. ಇದು <b>ಮೀಡಿಯಾ ವೀಕ್ಷಕ ಮತ್ತು ಪಿಕ್ಕರ್</b> ಆಗಿಯೂ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ. \ No newline at end of file diff --git a/fastlane/metadata/android/kn/images/featureGraphic.png b/fastlane/metadata/android/kn/images/featureGraphic.png new file mode 100644 index 0000000..d6714f2 Binary files /dev/null and b/fastlane/metadata/android/kn/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/kn/images/phoneScreenshots/1.png b/fastlane/metadata/android/kn/images/phoneScreenshots/1.png new file mode 100644 index 0000000..a12312a Binary files /dev/null and b/fastlane/metadata/android/kn/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/kn/images/phoneScreenshots/2.png b/fastlane/metadata/android/kn/images/phoneScreenshots/2.png new file mode 100644 index 0000000..cccbd60 Binary files /dev/null and b/fastlane/metadata/android/kn/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/kn/images/phoneScreenshots/3.png b/fastlane/metadata/android/kn/images/phoneScreenshots/3.png new file mode 100644 index 0000000..0e0c38f Binary files /dev/null and b/fastlane/metadata/android/kn/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/kn/images/phoneScreenshots/4.png b/fastlane/metadata/android/kn/images/phoneScreenshots/4.png new file mode 100644 index 0000000..ac11ae1 Binary files /dev/null and b/fastlane/metadata/android/kn/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/kn/images/phoneScreenshots/5.png b/fastlane/metadata/android/kn/images/phoneScreenshots/5.png new file mode 100644 index 0000000..757313f Binary files /dev/null and b/fastlane/metadata/android/kn/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/kn/images/phoneScreenshots/6.png b/fastlane/metadata/android/kn/images/phoneScreenshots/6.png new file mode 100644 index 0000000..c11d4dd Binary files /dev/null and b/fastlane/metadata/android/kn/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/kn/images/phoneScreenshots/7.png b/fastlane/metadata/android/kn/images/phoneScreenshots/7.png new file mode 100644 index 0000000..639e15a Binary files /dev/null and b/fastlane/metadata/android/kn/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/kn/short_description.txt b/fastlane/metadata/android/kn/short_description.txt new file mode 100644 index 0000000..c32edfc --- /dev/null +++ b/fastlane/metadata/android/kn/short_description.txt @@ -0,0 +1 @@ +ಗ್ಯಾಲರಿ ಮತ್ತು ಮೆಟಾಡೇಟಾ ಎಕ್ಸ್‌ಪ್ಲೋರರ್ \ No newline at end of file diff --git a/fastlane/metadata/android/ko/full_description.txt b/fastlane/metadata/android/ko/full_description.txt new file mode 100644 index 0000000..9eeee55 --- /dev/null +++ b/fastlane/metadata/android/ko/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i>는 일반적인 JPEG 및 MP4를 포함한 모든 종류의 사진과 비디오를 처리할 수 있지만, <b>다중 페이지 TIFF, SVG, 오래된 AVI 등</b>과 같은 보다 이국적인 것도 처리할 수 있습니다! 미디어 컬렉션을 스캔하여 <b>모션 사진</b>, <b>파노라마</b>, <b>360° 비디오</b> 및 <b>GeoTIFF</b> 파일을 식별합니다. + +<b>네비게이션과 검색</b>은 <i>Aves</i>의 중요한 부분입니다. 사용자가 앨범에서 사진, 태그에서 지도 등으로 쉽게 흘러갈 수 있도록 하는 것이 목표입니다. + +<i>Aves</i>는 Android(Android TV 포함)에서 사용할 수 있습니다. <b>앱 바로 가기</b> 및 <b>글로벌 검색</b>과 같은 기능과 통합됩니다. 또한 <b>미디어 뷰어 및 선택기</b>로도 작동합니다. \ No newline at end of file diff --git a/fastlane/metadata/android/ko/images/featureGraphic.png b/fastlane/metadata/android/ko/images/featureGraphic.png new file mode 100755 index 0000000..a926db4 Binary files /dev/null and b/fastlane/metadata/android/ko/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/ko/images/phoneScreenshots/1.png b/fastlane/metadata/android/ko/images/phoneScreenshots/1.png new file mode 100644 index 0000000..59422c7 Binary files /dev/null and b/fastlane/metadata/android/ko/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/ko/images/phoneScreenshots/2.png b/fastlane/metadata/android/ko/images/phoneScreenshots/2.png new file mode 100644 index 0000000..b98d21d Binary files /dev/null and b/fastlane/metadata/android/ko/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/ko/images/phoneScreenshots/3.png b/fastlane/metadata/android/ko/images/phoneScreenshots/3.png new file mode 100644 index 0000000..451b0f5 Binary files /dev/null and b/fastlane/metadata/android/ko/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/ko/images/phoneScreenshots/4.png b/fastlane/metadata/android/ko/images/phoneScreenshots/4.png new file mode 100644 index 0000000..ed6d731 Binary files /dev/null and b/fastlane/metadata/android/ko/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/ko/images/phoneScreenshots/5.png b/fastlane/metadata/android/ko/images/phoneScreenshots/5.png new file mode 100644 index 0000000..fa8da79 Binary files /dev/null and b/fastlane/metadata/android/ko/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/ko/images/phoneScreenshots/6.png b/fastlane/metadata/android/ko/images/phoneScreenshots/6.png new file mode 100644 index 0000000..e96f34e Binary files /dev/null and b/fastlane/metadata/android/ko/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/ko/images/phoneScreenshots/7.png b/fastlane/metadata/android/ko/images/phoneScreenshots/7.png new file mode 100644 index 0000000..6b5b58b Binary files /dev/null and b/fastlane/metadata/android/ko/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/ko/short_description.txt b/fastlane/metadata/android/ko/short_description.txt new file mode 100644 index 0000000..f52d03c --- /dev/null +++ b/fastlane/metadata/android/ko/short_description.txt @@ -0,0 +1 @@ +갤러리 및 메타데이터 탐색기 \ No newline at end of file diff --git a/fastlane/metadata/android/lt/full_description.txt b/fastlane/metadata/android/lt/full_description.txt new file mode 100644 index 0000000..612b5d4 --- /dev/null +++ b/fastlane/metadata/android/lt/full_description.txt @@ -0,0 +1,5 @@ +<i>„Aves”</i> gali tvarkyti įvairius vaizdus ir vaizdo įrašus, įskaitant įprastus JPEG ir MP4, o taip pat ir egzotiškesnius, pvz., <b>kelių puslapių TIFF, SVG, senus AVI ir dar daugiau</b>! Ji nuskaito jūsų medijos kolekciją, kad nustatytų <b>judančių nuotraukų</b>, <b>panoramų</b> (dar žinomų kaip nuotraukų-sferomis), <b>360° vaizdo įrašų</b>, taip pat <b>GeoTIFF</b> failus. + +<b>Naršymas ir paieška</b> yra svarbi <i>„Aves”</i> dalis. Tikslas yra, kad vartotojai galėtų lengvai pereiti nuo albumų prie nuotraukų, žymų, žemėlapių ir kt. + +<i>„Aves”</i> integruojasi su „Android” su tokiomis funkcijomis kaip <b>valdiklių</b>, <b>programėlių nuorodų</b> , <b>ekrano užsklandų</b> ir <b>globalios paieškos</b> palaikymu. Ji taip pat veikia kaip <b>medijos peržiūros priemonė ir rinkiklis</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/lt/images/featureGraphic.png b/fastlane/metadata/android/lt/images/featureGraphic.png new file mode 100644 index 0000000..d14be1c Binary files /dev/null and b/fastlane/metadata/android/lt/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/lt/images/phoneScreenshots/1.png b/fastlane/metadata/android/lt/images/phoneScreenshots/1.png new file mode 100644 index 0000000..f57e870 Binary files /dev/null and b/fastlane/metadata/android/lt/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/lt/images/phoneScreenshots/2.png b/fastlane/metadata/android/lt/images/phoneScreenshots/2.png new file mode 100644 index 0000000..3524f71 Binary files /dev/null and b/fastlane/metadata/android/lt/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/lt/images/phoneScreenshots/3.png b/fastlane/metadata/android/lt/images/phoneScreenshots/3.png new file mode 100644 index 0000000..64ad02a Binary files /dev/null and b/fastlane/metadata/android/lt/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/lt/images/phoneScreenshots/4.png b/fastlane/metadata/android/lt/images/phoneScreenshots/4.png new file mode 100644 index 0000000..bd96232 Binary files /dev/null and b/fastlane/metadata/android/lt/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/lt/images/phoneScreenshots/5.png b/fastlane/metadata/android/lt/images/phoneScreenshots/5.png new file mode 100644 index 0000000..3a29282 Binary files /dev/null and b/fastlane/metadata/android/lt/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/lt/images/phoneScreenshots/6.png b/fastlane/metadata/android/lt/images/phoneScreenshots/6.png new file mode 100644 index 0000000..3777126 Binary files /dev/null and b/fastlane/metadata/android/lt/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/lt/images/phoneScreenshots/7.png b/fastlane/metadata/android/lt/images/phoneScreenshots/7.png new file mode 100644 index 0000000..75c0fb6 Binary files /dev/null and b/fastlane/metadata/android/lt/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/lt/short_description.txt b/fastlane/metadata/android/lt/short_description.txt new file mode 100644 index 0000000..c16ab63 --- /dev/null +++ b/fastlane/metadata/android/lt/short_description.txt @@ -0,0 +1 @@ +Galerijos ir metaduomenų naršyklė \ No newline at end of file diff --git a/fastlane/metadata/android/ml/full_description.txt b/fastlane/metadata/android/ml/full_description.txt new file mode 100644 index 0000000..49801b4 --- /dev/null +++ b/fastlane/metadata/android/ml/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/ml/short_description.txt b/fastlane/metadata/android/ml/short_description.txt new file mode 100644 index 0000000..01da5bc --- /dev/null +++ b/fastlane/metadata/android/ml/short_description.txt @@ -0,0 +1 @@ +ഗാലറിയും മെറ്റാഡാറ്റ എക്സ്പ്ലോററും \ No newline at end of file diff --git a/fastlane/metadata/android/my/full_description.txt b/fastlane/metadata/android/my/full_description.txt new file mode 100644 index 0000000..edbe091 --- /dev/null +++ b/fastlane/metadata/android/my/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> ဟာ သာမန် JPEG နှင့် MP4 ဖိုင်တွေအပါအဝင် ဓာတ်ပုံနဲ့ ဗီဒီယိုမျိုးစုံကို ကိုင်တွယ်နိုင်တဲ့အပြင် တွေ့ရခဲတဲ့အရာတွေဖြစ်တဲ့ <b>စာမျက်နှာများစွာပါဝင်တဲ့ TIFF ဖိုင်တွေ၊ အရင်က AVI ဗီဒီယိုဖိုင်တွေ၊ အစရှိတာတွေကိုလည်း ကိုင်တွယ်နိုင်ပါတယ်။</b> <b> လှုပ်ရှားမှုပါတဲ့ပုံတွေ</b>၊ <b>မြင်ကွင်းကျယ်ဓာတ်ပုံတွေ</b>၊ <b>၃၆၀° ဗီဒီယိုတွေ</b>နဲ့ <b>GeoTIFF</b> ဖိုင်တွေကို ဖော်ထုတ်ဖို့အတွက် သင့်မီဒီယာစုစည်းမှုကို စကင်ဖတ်မှာပါ။ + +<b>အလွယ်တကူ ရှာဖွေကြည့်ရှုနိုင်တာက</b> <i>Aves</i> ရဲ့ အဓိကကျတဲ့အစိတ်အပိုင်းတစ်ခုဖြစ်ပါတယ်။ အသုံးပြုသူတွေကို အယ်လ်ဘမ်တွေကနေ ပုံတွေ၊ ပုံတွေကနေ tag တွေ၊ tag တွေကနေ မြေပုံတွေ၊ အစရှိသဖြင့် အလွယ်လေးကူးပြောင်းနိုင်စေဖို့က <i>Aves</i> ရဲ့ ပန်းတိုင်ဖြစ်ပါတယ်။ + +<i>Aves</i> ဟာ Android (Android တီဗီအပါအဝင်) ဖြင့်ပေါင်းစပ်ပြီး <b>ဝစ်ဂျက်တွေ</b>၊ <b>အက်ပ်ဖြတ်လမ်းတိုတွေ</b>၊ <b>screen saver တွေ</b>နဲ့ <b>နေရာအနှံ့ရှာဖွေမှုတွေကိုပါ</b> ကိုင်တွယ်နိုင်ပါတယ်။ ဒါ့အပြင် <b>မီဒီယာကြည့်ဖို့၊ မီဒီယာရွေးချယ်ဖို့</b>အတွက်လည်း သုံးလို့ရပါသေးတယ်။ \ No newline at end of file diff --git a/fastlane/metadata/android/my/short_description.txt b/fastlane/metadata/android/my/short_description.txt new file mode 100644 index 0000000..0a5c271 --- /dev/null +++ b/fastlane/metadata/android/my/short_description.txt @@ -0,0 +1 @@ +ပုံကြည့်ခြင်းနှင့် မက်တာဒေတာကြည့်ရှုခြင်းအတွက် \ No newline at end of file diff --git a/fastlane/metadata/android/nb-NO/full_description.txt b/fastlane/metadata/android/nb-NO/full_description.txt new file mode 100644 index 0000000..813dbaa --- /dev/null +++ b/fastlane/metadata/android/nb-NO/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> kan håndtere alle slags bilder og videoer, inkludert JPEG og MP4, men også mer eksotiske formater som <b>TIFF-filer over flere sider, SVG-er, gamle AVI-er, med mer</b>! Det skanner mediasamlingen din for å identifisere <b>bevegelige bilder</b>, <b>panoramaer</b> (også kjent som bildesirkler), <b>360°-videoer</b>, og også <b>GeoTIFF</b>-filer. + +<b>Navigasjon og søk</b> er en viktig del av <i>Aves</i>. Målet er at brukere enkelt skal kunne ta seg fra album, til bilder, til etiketter, til kart, osv. + +<i>Aves</i> integrerer seg med Android med funksjoner som f.eks. <b>miniprogrammer</b>, <b>programsnarveier</b>, <b>skjermsparer</b> og <b>søk i hele programmet</b>. Det fungerer også som <b>mediaviser og utvelger</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/nb-NO/images/featureGraphic.png b/fastlane/metadata/android/nb-NO/images/featureGraphic.png new file mode 100644 index 0000000..2d8ec07 Binary files /dev/null and b/fastlane/metadata/android/nb-NO/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/nb-NO/images/phoneScreenshots/1.png b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/1.png new file mode 100644 index 0000000..b6c1564 Binary files /dev/null and b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/nb-NO/images/phoneScreenshots/2.png b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/2.png new file mode 100644 index 0000000..26686ac Binary files /dev/null and b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/nb-NO/images/phoneScreenshots/3.png b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/3.png new file mode 100644 index 0000000..9baff32 Binary files /dev/null and b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/nb-NO/images/phoneScreenshots/4.png b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/4.png new file mode 100644 index 0000000..d0e2fae Binary files /dev/null and b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/nb-NO/images/phoneScreenshots/5.png b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/5.png new file mode 100644 index 0000000..8a2f71a Binary files /dev/null and b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/nb-NO/images/phoneScreenshots/6.png b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/6.png new file mode 100644 index 0000000..0c8988e Binary files /dev/null and b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/nb-NO/images/phoneScreenshots/7.png b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/7.png new file mode 100644 index 0000000..feeee34 Binary files /dev/null and b/fastlane/metadata/android/nb-NO/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/nb-NO/short_description.txt b/fastlane/metadata/android/nb-NO/short_description.txt new file mode 100644 index 0000000..487ce5b --- /dev/null +++ b/fastlane/metadata/android/nb-NO/short_description.txt @@ -0,0 +1 @@ +Galleri- og metadatautforsker \ No newline at end of file diff --git a/fastlane/metadata/android/ne/full_description.txt b/fastlane/metadata/android/ne/full_description.txt new file mode 100644 index 0000000..49801b4 --- /dev/null +++ b/fastlane/metadata/android/ne/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/ne/short_description.txt b/fastlane/metadata/android/ne/short_description.txt new file mode 100644 index 0000000..8c9445b --- /dev/null +++ b/fastlane/metadata/android/ne/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/fastlane/metadata/android/nl/full_description.txt b/fastlane/metadata/android/nl/full_description.txt new file mode 100644 index 0000000..39836d0 --- /dev/null +++ b/fastlane/metadata/android/nl/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> kan allerlei soorten afbeeldingen en video's aan, waaronder de veelgebruikte JPEG's en MP4's, maar ook minder gangbare formaten zoals <b>multi-pagina TIFF's, SVG's, oude AVI's en meer</b>! Het scant jouw mediacollectie om <b>bewegende foto's</b>, <b>panorama's</b>, <b>360° video's</b>, evenals <b>GeoTIFF</b>-bestanden te herkennen. + +<b>Navigatie en zoeken</b> is een belangrijk onderdeel van <i>Aves</i>. Het doel is dat gebruikers eenvoudig kunnen wisselen van albums naar foto's naar labels naar kaarten enz. + +<i>Aves</i> integreert met Android (inclusief Android TV) met functies zoals <b>widgets</b>, <b>app-snelkoppelingen</b>, <b>screensaver</b> en <b>algemene zoekopdrachten</b>. Het werkt ook als een <b>mediaviewer en -kiezer</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/nl/images/featureGraphic.png b/fastlane/metadata/android/nl/images/featureGraphic.png new file mode 100644 index 0000000..e692101 Binary files /dev/null and b/fastlane/metadata/android/nl/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/nl/images/phoneScreenshots/1.png b/fastlane/metadata/android/nl/images/phoneScreenshots/1.png new file mode 100644 index 0000000..5425083 Binary files /dev/null and b/fastlane/metadata/android/nl/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/nl/images/phoneScreenshots/2.png b/fastlane/metadata/android/nl/images/phoneScreenshots/2.png new file mode 100644 index 0000000..205fc65 Binary files /dev/null and b/fastlane/metadata/android/nl/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/nl/images/phoneScreenshots/3.png b/fastlane/metadata/android/nl/images/phoneScreenshots/3.png new file mode 100644 index 0000000..9e0da9e Binary files /dev/null and b/fastlane/metadata/android/nl/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/nl/images/phoneScreenshots/4.png b/fastlane/metadata/android/nl/images/phoneScreenshots/4.png new file mode 100644 index 0000000..2722076 Binary files /dev/null and b/fastlane/metadata/android/nl/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/nl/images/phoneScreenshots/5.png b/fastlane/metadata/android/nl/images/phoneScreenshots/5.png new file mode 100644 index 0000000..1afc7d9 Binary files /dev/null and b/fastlane/metadata/android/nl/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/nl/images/phoneScreenshots/6.png b/fastlane/metadata/android/nl/images/phoneScreenshots/6.png new file mode 100644 index 0000000..fada644 Binary files /dev/null and b/fastlane/metadata/android/nl/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/nl/images/phoneScreenshots/7.png b/fastlane/metadata/android/nl/images/phoneScreenshots/7.png new file mode 100644 index 0000000..5a32c12 Binary files /dev/null and b/fastlane/metadata/android/nl/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/nl/short_description.txt b/fastlane/metadata/android/nl/short_description.txt new file mode 100644 index 0000000..368d932 --- /dev/null +++ b/fastlane/metadata/android/nl/short_description.txt @@ -0,0 +1 @@ +Galerij en metagegevensverkenner \ No newline at end of file diff --git a/fastlane/metadata/android/nn/full_description.txt b/fastlane/metadata/android/nn/full_description.txt new file mode 100644 index 0000000..72f7adb --- /dev/null +++ b/fastlane/metadata/android/nn/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> kan handsama alle slags bileter og videoar, medteken JPEG og MP4, men au meir uvane ting som <b>fleirsida TIFF-ar, SVG-ar, gamle AVI-ar med meir</b>! Aves ser igjennom mediasamlinga di for å gjenkjenne <b>rørslebilete</b>, <b>panorama</b> (bilete med vidt oversyn), <b>360° videoar</b>, og au <b>GeoTIFF</b>-filer. + +<b>Navigering og søk</b> har mykje å sei i <i>Aves</i>. Målet er at ein skal lett kunne gå ifrå album, til bilete, til merkelappar, til kart, osv. + +<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/nn/images/featureGraphic.png b/fastlane/metadata/android/nn/images/featureGraphic.png new file mode 100644 index 0000000..2d8ec07 Binary files /dev/null and b/fastlane/metadata/android/nn/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/nn/images/phoneScreenshots/1.png b/fastlane/metadata/android/nn/images/phoneScreenshots/1.png new file mode 100644 index 0000000..12d3837 Binary files /dev/null and b/fastlane/metadata/android/nn/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/nn/images/phoneScreenshots/2.png b/fastlane/metadata/android/nn/images/phoneScreenshots/2.png new file mode 100644 index 0000000..9b15ba3 Binary files /dev/null and b/fastlane/metadata/android/nn/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/nn/images/phoneScreenshots/3.png b/fastlane/metadata/android/nn/images/phoneScreenshots/3.png new file mode 100644 index 0000000..3734eee Binary files /dev/null and b/fastlane/metadata/android/nn/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/nn/images/phoneScreenshots/4.png b/fastlane/metadata/android/nn/images/phoneScreenshots/4.png new file mode 100644 index 0000000..32a15cf Binary files /dev/null and b/fastlane/metadata/android/nn/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/nn/images/phoneScreenshots/5.png b/fastlane/metadata/android/nn/images/phoneScreenshots/5.png new file mode 100644 index 0000000..7053f53 Binary files /dev/null and b/fastlane/metadata/android/nn/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/nn/images/phoneScreenshots/6.png b/fastlane/metadata/android/nn/images/phoneScreenshots/6.png new file mode 100644 index 0000000..5583cec Binary files /dev/null and b/fastlane/metadata/android/nn/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/nn/images/phoneScreenshots/7.png b/fastlane/metadata/android/nn/images/phoneScreenshots/7.png new file mode 100644 index 0000000..2c17b13 Binary files /dev/null and b/fastlane/metadata/android/nn/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/nn/short_description.txt b/fastlane/metadata/android/nn/short_description.txt new file mode 100644 index 0000000..f60e77f --- /dev/null +++ b/fastlane/metadata/android/nn/short_description.txt @@ -0,0 +1 @@ +Galleri- og metadatagranskar \ No newline at end of file diff --git a/fastlane/metadata/android/or/full_description.txt b/fastlane/metadata/android/or/full_description.txt new file mode 100644 index 0000000..49801b4 --- /dev/null +++ b/fastlane/metadata/android/or/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/or/short_description.txt b/fastlane/metadata/android/or/short_description.txt new file mode 100644 index 0000000..8c9445b --- /dev/null +++ b/fastlane/metadata/android/or/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/fastlane/metadata/android/pl/full_description.txt b/fastlane/metadata/android/pl/full_description.txt new file mode 100644 index 0000000..0e6fbde --- /dev/null +++ b/fastlane/metadata/android/pl/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> obsługuje wszelkiego rodzaju obrazy i filmy, w tym typowe pliki JPEG i MP4, ale także bardziej egzotyczne formaty, takie jak <b>wielostronicowe pliki TIFF, SVG, stare pliki AVI i wiele innych</b>! Skanuje twoją kolekcję multimediów, aby zidentyfikować <b>ruchome zdjęcia</b>, <b>zdjęcia panoramiczne</b> (inaczej zdjęcia sferyczne), <b>wideo 360°</b>, a także pliki <b>GeoTIFF</b>. + +<b>Nawigacja i wyszukiwanie</b> jest ważną częścią <i>Aves</i>. Celem jest aby użytkownicy mogli łatwo przechodzić od albumów do zdjęć, tagów, map itd. + +<i>Aves</i> integruje się z Androidem (włączając Android TV) z funkcjami takimi jak <b>widżety</b>, <b>skróty do aplikacji</b>, <b>wygaszacz ekranu</b> i <b>obsługa globalnego wyszukiwania</b>. Działa również jako <b>przeglądarka i selektor mediów</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/pl/images/featureGraphic.png b/fastlane/metadata/android/pl/images/featureGraphic.png new file mode 100755 index 0000000..405897a Binary files /dev/null and b/fastlane/metadata/android/pl/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/pl/images/phoneScreenshots/1.png b/fastlane/metadata/android/pl/images/phoneScreenshots/1.png new file mode 100644 index 0000000..f81eda6 Binary files /dev/null and b/fastlane/metadata/android/pl/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/pl/images/phoneScreenshots/2.png b/fastlane/metadata/android/pl/images/phoneScreenshots/2.png new file mode 100644 index 0000000..9326138 Binary files /dev/null and b/fastlane/metadata/android/pl/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/pl/images/phoneScreenshots/3.png b/fastlane/metadata/android/pl/images/phoneScreenshots/3.png new file mode 100644 index 0000000..7f27ac6 Binary files /dev/null and b/fastlane/metadata/android/pl/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/pl/images/phoneScreenshots/4.png b/fastlane/metadata/android/pl/images/phoneScreenshots/4.png new file mode 100644 index 0000000..54b2114 Binary files /dev/null and b/fastlane/metadata/android/pl/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/pl/images/phoneScreenshots/5.png b/fastlane/metadata/android/pl/images/phoneScreenshots/5.png new file mode 100644 index 0000000..4c1803c Binary files /dev/null and b/fastlane/metadata/android/pl/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/pl/images/phoneScreenshots/6.png b/fastlane/metadata/android/pl/images/phoneScreenshots/6.png new file mode 100644 index 0000000..c8dd4d4 Binary files /dev/null and b/fastlane/metadata/android/pl/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/pl/images/phoneScreenshots/7.png b/fastlane/metadata/android/pl/images/phoneScreenshots/7.png new file mode 100644 index 0000000..4ff8caa Binary files /dev/null and b/fastlane/metadata/android/pl/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/pl/short_description.txt b/fastlane/metadata/android/pl/short_description.txt new file mode 100644 index 0000000..5c80f20 --- /dev/null +++ b/fastlane/metadata/android/pl/short_description.txt @@ -0,0 +1 @@ +Galeria i przeglądarka metadanych \ No newline at end of file diff --git a/fastlane/metadata/android/pt-BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt new file mode 100644 index 0000000..8245607 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> pode lidar com todos os tipos de imagens e vídeos, incluindo seus típicos JPEGs e MP4s, mas também coisas mais exóticas como <b>páginas múltiplas TIFFs, SVGs, AVIs antigos e muito mais</b>! Ele verifica sua coleção de mídia para identificar <b>fotos em movimento</b>, <b>panoramas</b> (aka photo spheres), <b>vídeos em 360°</b>, assim como <b>GeoTIFF</b> arquivos. + +<b>Navegação e pesquisa</b> é uma parte importante do <i>Aves</i>. O objetivo é que os usuários fluam facilmente de álbuns para fotos, etiquetas, mapas, etc. + +<i>Aves</i> integra com Android (incluindo TVs Android) com recursos como <b>widgets</b>, <b>atalhos de apps</b>, <b>protetor de tela</b> e <b>pesquisa global</b>. Também funciona como um <b>visualizador e selecionador de mídia</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/pt-BR/images/featureGraphic.png b/fastlane/metadata/android/pt-BR/images/featureGraphic.png new file mode 100755 index 0000000..405897a Binary files /dev/null and b/fastlane/metadata/android/pt-BR/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/1.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/1.png new file mode 100644 index 0000000..fbca03b Binary files /dev/null and b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/2.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/2.png new file mode 100644 index 0000000..f3357c4 Binary files /dev/null and b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/3.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/3.png new file mode 100644 index 0000000..6fd4e36 Binary files /dev/null and b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/4.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/4.png new file mode 100644 index 0000000..2c3c922 Binary files /dev/null and b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/5.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/5.png new file mode 100644 index 0000000..dfcb60e Binary files /dev/null and b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/6.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/6.png new file mode 100644 index 0000000..367bd47 Binary files /dev/null and b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/7.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/7.png new file mode 100644 index 0000000..0f97d71 Binary files /dev/null and b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/pt-BR/short_description.txt b/fastlane/metadata/android/pt-BR/short_description.txt new file mode 100644 index 0000000..ddf48df --- /dev/null +++ b/fastlane/metadata/android/pt-BR/short_description.txt @@ -0,0 +1 @@ +Galeria e explorador de metadados \ No newline at end of file diff --git a/fastlane/metadata/android/ro/full_description.txt b/fastlane/metadata/android/ro/full_description.txt new file mode 100644 index 0000000..8823557 --- /dev/null +++ b/fastlane/metadata/android/ro/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> poate gestiona tot felul de imagini și videoclipuri, inclusiv JPEG și MP4-uri tipice, dar și lucruri mai exotice, cum ar fi <b>TIFF-uri cu mai multe pagini, SVG, AVI vechi și multe altele</b>! Acesta scanează colecția dvs. media pentru a identifica <b>fotografii în mișcare</b>, <b>panorame</b> (alias foto sferice), <b>videoclipuri la 360°</b>, precum și <b>GeoTIFF</b> fișiere. + +<b>Navigația și căutarea</b> sunt o parte importantă a <i>Aves</i>. Scopul este ca utilizatorii să treacă cu ușurință de la albume la fotografii la etichete la hărți etc. + +<i>Aves</i> se integrează cu Android cu funcții precum <b>widget-uri</b>, <b>comenzi rapide pentru aplicații</b>, <b>protector de ecran</b> și gestionarea <b>căutării globale</b>. De asemenea, funcționează ca <b>vizionator și selector de conținut media</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/ro/images/featureGraphic.png b/fastlane/metadata/android/ro/images/featureGraphic.png new file mode 100755 index 0000000..405897a Binary files /dev/null and b/fastlane/metadata/android/ro/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/ro/images/phoneScreenshots/1.png b/fastlane/metadata/android/ro/images/phoneScreenshots/1.png new file mode 100644 index 0000000..ecc6a98 Binary files /dev/null and b/fastlane/metadata/android/ro/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/ro/images/phoneScreenshots/2.png b/fastlane/metadata/android/ro/images/phoneScreenshots/2.png new file mode 100644 index 0000000..763a123 Binary files /dev/null and b/fastlane/metadata/android/ro/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/ro/images/phoneScreenshots/3.png b/fastlane/metadata/android/ro/images/phoneScreenshots/3.png new file mode 100644 index 0000000..6244cb9 Binary files /dev/null and b/fastlane/metadata/android/ro/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/ro/images/phoneScreenshots/4.png b/fastlane/metadata/android/ro/images/phoneScreenshots/4.png new file mode 100644 index 0000000..1d22f0d Binary files /dev/null and b/fastlane/metadata/android/ro/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/ro/images/phoneScreenshots/5.png b/fastlane/metadata/android/ro/images/phoneScreenshots/5.png new file mode 100644 index 0000000..9de6df6 Binary files /dev/null and b/fastlane/metadata/android/ro/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/ro/images/phoneScreenshots/6.png b/fastlane/metadata/android/ro/images/phoneScreenshots/6.png new file mode 100644 index 0000000..91c3b66 Binary files /dev/null and b/fastlane/metadata/android/ro/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/ro/images/phoneScreenshots/7.png b/fastlane/metadata/android/ro/images/phoneScreenshots/7.png new file mode 100644 index 0000000..d52ec9a Binary files /dev/null and b/fastlane/metadata/android/ro/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/ro/short_description.txt b/fastlane/metadata/android/ro/short_description.txt new file mode 100644 index 0000000..01fa13f --- /dev/null +++ b/fastlane/metadata/android/ro/short_description.txt @@ -0,0 +1 @@ +Galeria și exploratorul de metadate \ No newline at end of file diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru/full_description.txt new file mode 100644 index 0000000..8d587f6 --- /dev/null +++ b/fastlane/metadata/android/ru/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> умеет работать со всеми типами изображений и видео, начиная от обычных JPEG и MP4, заканчивая такими экзотическими штуками как <b>многостраничные TIFF, SVG, старые AVI и многими другими</b>! Он сканирует вашу медиа коллекцию, определяя <b>моушн фото</b>, <b>панорамы</b> (aka фото сферы), <b>360° видео</b>, <b>GeoTIFF</b> файлы. + +<b>Навигация и поиск</b> важные части <i>Aves</i>. Пользователи могут легко переходить от альбомов к фотографиям, тэгам, картам и т.д. + +<i>Aves</i> интегрируется с Android (включая Android TV) предлагая такие возможности как <b>виджеты</b>, <b>пользовательские ярлыки</b>, <b>скринсейвер</b> и поддержку <b>глобального поиска</b>. Он так же работает как диалоговое окно для <b>просмотра и выбора медиа</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/ru/images/featureGraphic.png b/fastlane/metadata/android/ru/images/featureGraphic.png new file mode 100755 index 0000000..ada0f60 Binary files /dev/null and b/fastlane/metadata/android/ru/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/1.png b/fastlane/metadata/android/ru/images/phoneScreenshots/1.png new file mode 100644 index 0000000..b47bba5 Binary files /dev/null and b/fastlane/metadata/android/ru/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/2.png b/fastlane/metadata/android/ru/images/phoneScreenshots/2.png new file mode 100644 index 0000000..2b38855 Binary files /dev/null and b/fastlane/metadata/android/ru/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/3.png b/fastlane/metadata/android/ru/images/phoneScreenshots/3.png new file mode 100644 index 0000000..a3ffa26 Binary files /dev/null and b/fastlane/metadata/android/ru/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/4.png b/fastlane/metadata/android/ru/images/phoneScreenshots/4.png new file mode 100644 index 0000000..ef9ad96 Binary files /dev/null and b/fastlane/metadata/android/ru/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/5.png b/fastlane/metadata/android/ru/images/phoneScreenshots/5.png new file mode 100644 index 0000000..1f02f51 Binary files /dev/null and b/fastlane/metadata/android/ru/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/6.png b/fastlane/metadata/android/ru/images/phoneScreenshots/6.png new file mode 100644 index 0000000..72a8b28 Binary files /dev/null and b/fastlane/metadata/android/ru/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/7.png b/fastlane/metadata/android/ru/images/phoneScreenshots/7.png new file mode 100644 index 0000000..5cd09a0 Binary files /dev/null and b/fastlane/metadata/android/ru/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/ru/short_description.txt b/fastlane/metadata/android/ru/short_description.txt new file mode 100644 index 0000000..6c579b7 --- /dev/null +++ b/fastlane/metadata/android/ru/short_description.txt @@ -0,0 +1 @@ +Медиа галерея с навигацией по метаданным \ No newline at end of file diff --git a/fastlane/metadata/android/sat/full_description.txt b/fastlane/metadata/android/sat/full_description.txt new file mode 100644 index 0000000..49801b4 --- /dev/null +++ b/fastlane/metadata/android/sat/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/sat/short_description.txt b/fastlane/metadata/android/sat/short_description.txt new file mode 100644 index 0000000..8c9445b --- /dev/null +++ b/fastlane/metadata/android/sat/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/fastlane/metadata/android/sk/full_description.txt b/fastlane/metadata/android/sk/full_description.txt new file mode 100644 index 0000000..4661093 --- /dev/null +++ b/fastlane/metadata/android/sk/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> aplikácia je schopná si poradiť s veľkým množstvom rôznych formátov obrázkov a videí, ako napríklad typickými JPEG a MP4, ale aj s exotickejšími <b> TIFF, SVG, AVI a mnoho iných</b>! Aplikácia skenuje média v zariadení a identifikje <b>fotky v pohybe</b>, <b>panorámy</b> , <b>360° videá</b>, ako aj <b>GeoTIFF</b> súbory. + +<b>Navigácia a vyhľadávanie</b> je dôležitou súčasťou aplikácie <i>Aves</i>. Jej cieľom je poskytnúť užívateľom jednoduchý prechod z albumov, do fotiek, tagov, máp, atď. + +<i>Aves</i> je schopný pracovať s Android (včetne Android TV) a ponúka rozšírenia ako <b>miniaplikácie (widgety)</b>, <b>skratky aplikácie</b>, <b>šetrič obrazovky</b> a <b>globálne vyhľadávanie</b>. Rovnako poskytuje <b>prehľadávnie médií</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/sk/images/featureGraphic.png b/fastlane/metadata/android/sk/images/featureGraphic.png new file mode 100644 index 0000000..f3a5ff2 Binary files /dev/null and b/fastlane/metadata/android/sk/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/sk/images/phoneScreenshots/1.png b/fastlane/metadata/android/sk/images/phoneScreenshots/1.png new file mode 100644 index 0000000..2d80b5f Binary files /dev/null and b/fastlane/metadata/android/sk/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/sk/images/phoneScreenshots/2.png b/fastlane/metadata/android/sk/images/phoneScreenshots/2.png new file mode 100644 index 0000000..a57f7f9 Binary files /dev/null and b/fastlane/metadata/android/sk/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/sk/images/phoneScreenshots/3.png b/fastlane/metadata/android/sk/images/phoneScreenshots/3.png new file mode 100644 index 0000000..404ecea Binary files /dev/null and b/fastlane/metadata/android/sk/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/sk/images/phoneScreenshots/4.png b/fastlane/metadata/android/sk/images/phoneScreenshots/4.png new file mode 100644 index 0000000..cdcb1e7 Binary files /dev/null and b/fastlane/metadata/android/sk/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/sk/images/phoneScreenshots/5.png b/fastlane/metadata/android/sk/images/phoneScreenshots/5.png new file mode 100644 index 0000000..876d55e Binary files /dev/null and b/fastlane/metadata/android/sk/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/sk/images/phoneScreenshots/6.png b/fastlane/metadata/android/sk/images/phoneScreenshots/6.png new file mode 100644 index 0000000..38fda63 Binary files /dev/null and b/fastlane/metadata/android/sk/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/sk/images/phoneScreenshots/7.png b/fastlane/metadata/android/sk/images/phoneScreenshots/7.png new file mode 100644 index 0000000..524cca8 Binary files /dev/null and b/fastlane/metadata/android/sk/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/sk/short_description.txt b/fastlane/metadata/android/sk/short_description.txt new file mode 100644 index 0000000..fa44ffa --- /dev/null +++ b/fastlane/metadata/android/sk/short_description.txt @@ -0,0 +1 @@ +Prehliadač galérie a metadát \ No newline at end of file diff --git a/fastlane/metadata/android/sl/full_description.txt b/fastlane/metadata/android/sl/full_description.txt new file mode 100644 index 0000000..49801b4 --- /dev/null +++ b/fastlane/metadata/android/sl/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/sl/short_description.txt b/fastlane/metadata/android/sl/short_description.txt new file mode 100644 index 0000000..8c9445b --- /dev/null +++ b/fastlane/metadata/android/sl/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/fastlane/metadata/android/sr/full_description.txt b/fastlane/metadata/android/sr/full_description.txt new file mode 100644 index 0000000..49801b4 --- /dev/null +++ b/fastlane/metadata/android/sr/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/sr/short_description.txt b/fastlane/metadata/android/sr/short_description.txt new file mode 100644 index 0000000..8c9445b --- /dev/null +++ b/fastlane/metadata/android/sr/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/fastlane/metadata/android/sv/full_description.txt b/fastlane/metadata/android/sv/full_description.txt new file mode 100644 index 0000000..1adbbad --- /dev/null +++ b/fastlane/metadata/android/sv/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> kan hantera alla typer av bilder och videor, inklusive dina vanliga JPEG- och MP4-filer, men även mer exotiska filer som <b>flersidiga TIFF-filer, SVG-filer, gamla AVI-filer och mycket mer</b>! Den skannar din mediasamling för att identifiera <b>rörelsefoton</b>, <b>panoramabilder</b> (även kallade fotosfärer), <b>360° videor</b>, samt <b>GeoTIFF</b> filer. + +<b>Navigering och sökhantering</b> är än viktigt del av <i>Aves</i>. Målet är att användarna på ett smidigt sätt ska kunna gå från album till foton till etiketter till kartor, osv. + +<i>Aves</i> integrerar med Android (inklusive Android TV) med funktioner som <b>widgetar</b>, <b>appgenvägar</b>, <b>skärmsläckare</b> och <b>global sökhantering.</b> Den fungerar också som en <b>mediavisare och mediaväljare</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/sv/images/featureGraphic.png b/fastlane/metadata/android/sv/images/featureGraphic.png new file mode 100644 index 0000000..2d8ec07 Binary files /dev/null and b/fastlane/metadata/android/sv/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/sv/images/phoneScreenshots/1.png b/fastlane/metadata/android/sv/images/phoneScreenshots/1.png new file mode 100644 index 0000000..bdfadda Binary files /dev/null and b/fastlane/metadata/android/sv/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/sv/images/phoneScreenshots/2.png b/fastlane/metadata/android/sv/images/phoneScreenshots/2.png new file mode 100644 index 0000000..738489d Binary files /dev/null and b/fastlane/metadata/android/sv/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/sv/images/phoneScreenshots/3.png b/fastlane/metadata/android/sv/images/phoneScreenshots/3.png new file mode 100644 index 0000000..4129ac6 Binary files /dev/null and b/fastlane/metadata/android/sv/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/sv/images/phoneScreenshots/4.png b/fastlane/metadata/android/sv/images/phoneScreenshots/4.png new file mode 100644 index 0000000..3f811f0 Binary files /dev/null and b/fastlane/metadata/android/sv/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/sv/images/phoneScreenshots/5.png b/fastlane/metadata/android/sv/images/phoneScreenshots/5.png new file mode 100644 index 0000000..8fe7152 Binary files /dev/null and b/fastlane/metadata/android/sv/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/sv/images/phoneScreenshots/6.png b/fastlane/metadata/android/sv/images/phoneScreenshots/6.png new file mode 100644 index 0000000..b6aff64 Binary files /dev/null and b/fastlane/metadata/android/sv/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/sv/images/phoneScreenshots/7.png b/fastlane/metadata/android/sv/images/phoneScreenshots/7.png new file mode 100644 index 0000000..f17c055 Binary files /dev/null and b/fastlane/metadata/android/sv/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/sv/short_description.txt b/fastlane/metadata/android/sv/short_description.txt new file mode 100644 index 0000000..9a702b9 --- /dev/null +++ b/fastlane/metadata/android/sv/short_description.txt @@ -0,0 +1 @@ +Galleri och metadatautforskare \ No newline at end of file diff --git a/fastlane/metadata/android/ta/full_description.txt b/fastlane/metadata/android/ta/full_description.txt new file mode 100644 index 0000000..a4f601b --- /dev/null +++ b/fastlane/metadata/android/ta/full_description.txt @@ -0,0 +1,5 @@ +<i>ஏவ்ச்</i> உங்கள் வழக்கமான செபிஇசிகள் மற்றும் எம்பி4கள் உட்பட அனைத்து வகையான படங்கள் மற்றும் காணொளிகளைக் கையாள முடியும், ஆனால் <b> பல பக்க TIFFs, SVGs, பழைய AVIs மற்றும் மேலும் </b> போன்ற கவர்ச்சியான உருப்படிகளையும் கையாள முடியும்! <b> இயக்கபுகைப்படங்கள் </b>, <b> பனோரமாகள் </b> (புகைப்படக் கோளங்கள்), <b> 360 ° காணொளிகள் </b>, அத்துடன் <b> GeoTIFF</b> கோப்புகள். + +<b> வழிசெலுத்தல் மற்றும் தேடல் </b> <i> ஏவ்ச் </i> இன் ஒரு முக்கிய பகுதியாகும். பயனர்கள் ஆல்பங்களிலிருந்து புகைப்படங்கள்வரை குறிச்சொற்களுக்கு வரைபடங்கள் போன்றவற்றுக்கு எளிதாகப் பாய வேண்டும். + +<i>ஏவ்ச்</i> ஆனது ஆண்ட்ராய்டு உடன் (ஆண்ட்ராய்டு தொலைக்காட்சி உட்பட) ஒருங்கிணைக்கிறது, இதில் <b>நிரல்பலகைகள்</b>, <b>பயன்பாட்டு குறுக்குவழிகள்</b>, <b>திரை காப்பான்</b> மற்றும் <b>உலகளாவிய தேடல்</b> கையாளுதல் போன்ற நற்பண்புகள் உள்ளன. இது ஒரு <b>ஊடக காட்டி மற்றும் தேர்வியாகவும்</b> செயல்படுகிறது. \ No newline at end of file diff --git a/fastlane/metadata/android/ta/images/featureGraphic.png b/fastlane/metadata/android/ta/images/featureGraphic.png new file mode 100644 index 0000000..6517292 Binary files /dev/null and b/fastlane/metadata/android/ta/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/ta/images/phoneScreenshots/1.png b/fastlane/metadata/android/ta/images/phoneScreenshots/1.png new file mode 100644 index 0000000..96df345 Binary files /dev/null and b/fastlane/metadata/android/ta/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/ta/images/phoneScreenshots/2.png b/fastlane/metadata/android/ta/images/phoneScreenshots/2.png new file mode 100644 index 0000000..2ba90ff Binary files /dev/null and b/fastlane/metadata/android/ta/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/ta/images/phoneScreenshots/3.png b/fastlane/metadata/android/ta/images/phoneScreenshots/3.png new file mode 100644 index 0000000..70e67a4 Binary files /dev/null and b/fastlane/metadata/android/ta/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/ta/images/phoneScreenshots/4.png b/fastlane/metadata/android/ta/images/phoneScreenshots/4.png new file mode 100644 index 0000000..7a1bedc Binary files /dev/null and b/fastlane/metadata/android/ta/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/ta/images/phoneScreenshots/5.png b/fastlane/metadata/android/ta/images/phoneScreenshots/5.png new file mode 100644 index 0000000..7d75135 Binary files /dev/null and b/fastlane/metadata/android/ta/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/ta/images/phoneScreenshots/6.png b/fastlane/metadata/android/ta/images/phoneScreenshots/6.png new file mode 100644 index 0000000..5c052f1 Binary files /dev/null and b/fastlane/metadata/android/ta/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/ta/images/phoneScreenshots/7.png b/fastlane/metadata/android/ta/images/phoneScreenshots/7.png new file mode 100644 index 0000000..8cecb63 Binary files /dev/null and b/fastlane/metadata/android/ta/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/ta/short_description.txt b/fastlane/metadata/android/ta/short_description.txt new file mode 100644 index 0000000..1f72a7c --- /dev/null +++ b/fastlane/metadata/android/ta/short_description.txt @@ -0,0 +1 @@ +தொகுப்பு மற்றும் தரவுத்தகவல் உலாவி \ No newline at end of file diff --git a/fastlane/metadata/android/th/full_description.txt b/fastlane/metadata/android/th/full_description.txt new file mode 100644 index 0000000..49801b4 --- /dev/null +++ b/fastlane/metadata/android/th/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/th/short_description.txt b/fastlane/metadata/android/th/short_description.txt new file mode 100644 index 0000000..8c9445b --- /dev/null +++ b/fastlane/metadata/android/th/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/fastlane/metadata/android/tr/full_description.txt b/fastlane/metadata/android/tr/full_description.txt new file mode 100644 index 0000000..6e116e8 --- /dev/null +++ b/fastlane/metadata/android/tr/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> tipik JPEG ve MP4'lerin yanı sıra <b>çok sayfalı TIFF'ler, SVG'ler, eski AVI'ler ve daha fazlası</b> gibi daha egzotik şeyler de dahil olmak üzere her türlü görüntü ve videoyu işleyebilir! <b>Hareketli fotoğrafları</b>, <b>panoramaları</b> (fotoğraf küreleri olarak da bilinir), <b>360° videoları</b> ve <b>GeoTIFF</b> dosyalarını tanımlamak için medya koleksiyonunuzu tarar. + +<b>Gezinme ve arama</b> <i>Aves'in</i> önemli bir parçasıdır. Amaç, kullanıcıların albümlerden fotoğraflara, etiketlerden haritalara vb. kolayca geçmesini sağlamaktır. + +<i>Aves</i>, Android (Android TV dahil) <b>araçlar</b>ı, <b>uygulama kısayolları</b>, <b>ekran koruyucu</b> ve <b>genel arama</b> işlemi gibi özelliklerle birlikte çalışır. Ayrıca <b>medya görüntüleyici ve seçici</b> olarak da çalışır. \ No newline at end of file diff --git a/fastlane/metadata/android/tr/images/featureGraphic.png b/fastlane/metadata/android/tr/images/featureGraphic.png new file mode 100644 index 0000000..2936322 Binary files /dev/null and b/fastlane/metadata/android/tr/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/tr/images/phoneScreenshots/1.png b/fastlane/metadata/android/tr/images/phoneScreenshots/1.png new file mode 100644 index 0000000..f32b33d Binary files /dev/null and b/fastlane/metadata/android/tr/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/tr/images/phoneScreenshots/2.png b/fastlane/metadata/android/tr/images/phoneScreenshots/2.png new file mode 100644 index 0000000..ff9f5b7 Binary files /dev/null and b/fastlane/metadata/android/tr/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/tr/images/phoneScreenshots/3.png b/fastlane/metadata/android/tr/images/phoneScreenshots/3.png new file mode 100644 index 0000000..f920847 Binary files /dev/null and b/fastlane/metadata/android/tr/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/tr/images/phoneScreenshots/4.png b/fastlane/metadata/android/tr/images/phoneScreenshots/4.png new file mode 100644 index 0000000..40a9ec1 Binary files /dev/null and b/fastlane/metadata/android/tr/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/tr/images/phoneScreenshots/5.png b/fastlane/metadata/android/tr/images/phoneScreenshots/5.png new file mode 100644 index 0000000..febf645 Binary files /dev/null and b/fastlane/metadata/android/tr/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/tr/images/phoneScreenshots/6.png b/fastlane/metadata/android/tr/images/phoneScreenshots/6.png new file mode 100644 index 0000000..e7ae223 Binary files /dev/null and b/fastlane/metadata/android/tr/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/tr/images/phoneScreenshots/7.png b/fastlane/metadata/android/tr/images/phoneScreenshots/7.png new file mode 100644 index 0000000..547bbb7 Binary files /dev/null and b/fastlane/metadata/android/tr/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/tr/short_description.txt b/fastlane/metadata/android/tr/short_description.txt new file mode 100644 index 0000000..0736246 --- /dev/null +++ b/fastlane/metadata/android/tr/short_description.txt @@ -0,0 +1 @@ +Galeri ve meta veri gezgini \ No newline at end of file diff --git a/fastlane/metadata/android/uk/full_description.txt b/fastlane/metadata/android/uk/full_description.txt new file mode 100644 index 0000000..f69d801 --- /dev/null +++ b/fastlane/metadata/android/uk/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> може обробляти всі види зображень і відео, включаючи типові JPEG та MP4, а також більш екзотичні речі, такі як <b>багатосторінкові TIFF, SVG, старі AVI тощо</b>! Він сканує вашу медіа-колекцію, щоб визначити <b>фотографії з рухом</b>, <b>панорами</b> (так звані фото сфери), <b>360° відео</b>, а також <b>GeoTIFF</b> файли. + +<b>Навігація та пошук</b> є важливою частиною <i>Aves</i>. Мета полягає в тому, щоб користувачі легко переходили від альбомів до фотографій, від тегів до карт тощо. + +<i>Aves</i> інтегрується з Android (включаючи Android TV) пропонуючи такі можливості як <b>віджети</b>, <b>ярлики додатка</b>, <b>заставка екрану</b> та работа з <b>глобальним пошуком</b>. Він також працює як <b>переглядач і засоб вибору медіа</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/uk/images/featureGraphic.png b/fastlane/metadata/android/uk/images/featureGraphic.png new file mode 100755 index 0000000..ada0f60 Binary files /dev/null and b/fastlane/metadata/android/uk/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/uk/images/phoneScreenshots/1.png b/fastlane/metadata/android/uk/images/phoneScreenshots/1.png new file mode 100644 index 0000000..f2e9779 Binary files /dev/null and b/fastlane/metadata/android/uk/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/uk/images/phoneScreenshots/2.png b/fastlane/metadata/android/uk/images/phoneScreenshots/2.png new file mode 100644 index 0000000..47deec7 Binary files /dev/null and b/fastlane/metadata/android/uk/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/uk/images/phoneScreenshots/3.png b/fastlane/metadata/android/uk/images/phoneScreenshots/3.png new file mode 100644 index 0000000..51bd150 Binary files /dev/null and b/fastlane/metadata/android/uk/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/uk/images/phoneScreenshots/4.png b/fastlane/metadata/android/uk/images/phoneScreenshots/4.png new file mode 100644 index 0000000..ea7842f Binary files /dev/null and b/fastlane/metadata/android/uk/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/uk/images/phoneScreenshots/5.png b/fastlane/metadata/android/uk/images/phoneScreenshots/5.png new file mode 100644 index 0000000..54cef8e Binary files /dev/null and b/fastlane/metadata/android/uk/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/uk/images/phoneScreenshots/6.png b/fastlane/metadata/android/uk/images/phoneScreenshots/6.png new file mode 100644 index 0000000..414480e Binary files /dev/null and b/fastlane/metadata/android/uk/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/uk/images/phoneScreenshots/7.png b/fastlane/metadata/android/uk/images/phoneScreenshots/7.png new file mode 100644 index 0000000..db8150a Binary files /dev/null and b/fastlane/metadata/android/uk/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/uk/short_description.txt b/fastlane/metadata/android/uk/short_description.txt new file mode 100644 index 0000000..c5ec30d --- /dev/null +++ b/fastlane/metadata/android/uk/short_description.txt @@ -0,0 +1 @@ +Галерея та провідник метаданих \ No newline at end of file diff --git a/fastlane/metadata/android/ur/full_description.txt b/fastlane/metadata/android/ur/full_description.txt new file mode 100644 index 0000000..49801b4 --- /dev/null +++ b/fastlane/metadata/android/ur/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/ur/short_description.txt b/fastlane/metadata/android/ur/short_description.txt new file mode 100644 index 0000000..8c9445b --- /dev/null +++ b/fastlane/metadata/android/ur/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/fastlane/metadata/android/vi/full_description.txt b/fastlane/metadata/android/vi/full_description.txt new file mode 100644 index 0000000..eca56d7 --- /dev/null +++ b/fastlane/metadata/android/vi/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> có thể xử lý tất cả các loại hình ảnh và video, bao gồm cả JPEG và MP4 thông thường của bạn, cũng như những thứ kỳ lạ hơn như <b>TIFF nhiều trang, SVG, AVI cũ và hơn thế nữa</b>! Nó quét bộ sưu tập phương tiện của bạn để xác định <b>ảnh chuyển động</b>, <b>ảnh toàn cảnh</b> (còn gọi là ảnh toàn cảnh 360 độ), <b>video 360 độ</b> cũng như các tập tin <b>GeoTIFF</b>. + +<b>Điều hướng và tìm kiếm</b> là một phần quan trọng của <i>Aves</i>. Mục tiêu là để người dùng dễ dàng chuyển từ album sang ảnh sang thẻ sang bản đồ, v.v. + +<i>Aves</i> tương thích với Android (bao gồm cả Android TV) với các tính năng như <b>widget</b>, <b>phím tắt ứng dụng</b>, <b>trình bảo vệ màn hình</b> và xử lý <b>tìm kiếm toàn hệ thống</b>. Nó cũng hoạt động như một <b>trình xem và lựa chọn phương tiện</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/vi/images/featureGraphic.png b/fastlane/metadata/android/vi/images/featureGraphic.png new file mode 100644 index 0000000..8529af7 Binary files /dev/null and b/fastlane/metadata/android/vi/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/vi/images/phoneScreenshots/1.png b/fastlane/metadata/android/vi/images/phoneScreenshots/1.png new file mode 100644 index 0000000..5a10537 Binary files /dev/null and b/fastlane/metadata/android/vi/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/vi/images/phoneScreenshots/2.png b/fastlane/metadata/android/vi/images/phoneScreenshots/2.png new file mode 100644 index 0000000..ae6457a Binary files /dev/null and b/fastlane/metadata/android/vi/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/vi/images/phoneScreenshots/3.png b/fastlane/metadata/android/vi/images/phoneScreenshots/3.png new file mode 100644 index 0000000..cc1f9f8 Binary files /dev/null and b/fastlane/metadata/android/vi/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/vi/images/phoneScreenshots/4.png b/fastlane/metadata/android/vi/images/phoneScreenshots/4.png new file mode 100644 index 0000000..9e0c4c9 Binary files /dev/null and b/fastlane/metadata/android/vi/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/vi/images/phoneScreenshots/5.png b/fastlane/metadata/android/vi/images/phoneScreenshots/5.png new file mode 100644 index 0000000..fa441d4 Binary files /dev/null and b/fastlane/metadata/android/vi/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/vi/images/phoneScreenshots/6.png b/fastlane/metadata/android/vi/images/phoneScreenshots/6.png new file mode 100644 index 0000000..4647a9c Binary files /dev/null and b/fastlane/metadata/android/vi/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/vi/images/phoneScreenshots/7.png b/fastlane/metadata/android/vi/images/phoneScreenshots/7.png new file mode 100644 index 0000000..a68b7ec Binary files /dev/null and b/fastlane/metadata/android/vi/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/vi/short_description.txt b/fastlane/metadata/android/vi/short_description.txt new file mode 100644 index 0000000..8e5d6f8 --- /dev/null +++ b/fastlane/metadata/android/vi/short_description.txt @@ -0,0 +1 @@ +Trình khám phá thư viện và siêu dữ liệu \ No newline at end of file diff --git a/fastlane/metadata/android/zh-CN/full_description.txt b/fastlane/metadata/android/zh-CN/full_description.txt new file mode 100644 index 0000000..f01b6e3 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> 可以处理各种图像和视频,包括常见的 JPEG 和 MP4 格式,也包括不常见的格式,比如<b>多页 TIFF、SVG 和旧式 AVI 等等</b>!它会扫描你的媒体库以识别<b>动态照片</b>、<b>全景照片</b>(又称球体照片)、<b>360° 视频</b>以及 <b>GeoTIFF</b> 文件。 + +<b>导航与搜索</b>是 <i>Aves</i> 的核心功能之一,旨在帮助用户在相册、照片、标签、地图等之间轻松切换。 + +<i>Aves</i> 与 Android(包括Android TV)相集成,具备 <b>小部件</b>、<b>应用快捷方式</b>、<b>屏幕保护程序</b> 及 <b>全局搜索</b> 等功能。它还可充当 <b>媒体查看器与选择器</b>。 \ No newline at end of file diff --git a/fastlane/metadata/android/zh-CN/images/featureGraphic.png b/fastlane/metadata/android/zh-CN/images/featureGraphic.png new file mode 100644 index 0000000..2194bc4 Binary files /dev/null and b/fastlane/metadata/android/zh-CN/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/zh-CN/images/phoneScreenshots/1.png b/fastlane/metadata/android/zh-CN/images/phoneScreenshots/1.png new file mode 100644 index 0000000..d7fe61f Binary files /dev/null and b/fastlane/metadata/android/zh-CN/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/zh-CN/images/phoneScreenshots/2.png b/fastlane/metadata/android/zh-CN/images/phoneScreenshots/2.png new file mode 100644 index 0000000..698015c Binary files /dev/null and b/fastlane/metadata/android/zh-CN/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/zh-CN/images/phoneScreenshots/3.png b/fastlane/metadata/android/zh-CN/images/phoneScreenshots/3.png new file mode 100644 index 0000000..0910dfb Binary files /dev/null and b/fastlane/metadata/android/zh-CN/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/zh-CN/images/phoneScreenshots/4.png b/fastlane/metadata/android/zh-CN/images/phoneScreenshots/4.png new file mode 100644 index 0000000..600ecea Binary files /dev/null and b/fastlane/metadata/android/zh-CN/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/zh-CN/images/phoneScreenshots/5.png b/fastlane/metadata/android/zh-CN/images/phoneScreenshots/5.png new file mode 100644 index 0000000..7648f85 Binary files /dev/null and b/fastlane/metadata/android/zh-CN/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/zh-CN/images/phoneScreenshots/6.png b/fastlane/metadata/android/zh-CN/images/phoneScreenshots/6.png new file mode 100644 index 0000000..50b62eb Binary files /dev/null and b/fastlane/metadata/android/zh-CN/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/zh-CN/images/phoneScreenshots/7.png b/fastlane/metadata/android/zh-CN/images/phoneScreenshots/7.png new file mode 100644 index 0000000..dea40fe Binary files /dev/null and b/fastlane/metadata/android/zh-CN/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/zh-CN/short_description.txt b/fastlane/metadata/android/zh-CN/short_description.txt new file mode 100644 index 0000000..0837be9 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/short_description.txt @@ -0,0 +1 @@ +相册和元数据浏览器 \ No newline at end of file diff --git a/fastlane/metadata/android/zh-Hant/full_description.txt b/fastlane/metadata/android/zh-Hant/full_description.txt new file mode 100644 index 0000000..cf0c804 --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> 能夠操作所有種類的圖片和影片, 包括典型的 JPEGs 和 MP4s, 而且更多奇特的類型像 <b>multi-page TIFFs, SVGs, old AVIs 等等</b>! 他掃描你的媒體收藏以識別出 <b>動態相片</b>, <b>全景圖</b> (又稱球體照片), <b>360° 影片</b>, 和<b>GeoTIFF</b> 檔案. + +<b>瀏覽和搜尋</b> 是 <i>Aves</i>重要的一部份. 目的是為了讓使用者能夠輕易的從相簿, 相片, 標籤, 地圖, 等等之間順暢切換. + +<i>Aves</i> 與 Android (包括 Android TV) 整合, 具有特色像是 <b>小工具</b>, <b>app 捷徑</b>, <b>螢幕保護程式</b> 和 <b>全域搜尋</b> 等功能. 還可以當成 <b>媒體檢視和選擇器</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/zh-Hant/images/featureGraphic.png b/fastlane/metadata/android/zh-Hant/images/featureGraphic.png new file mode 100644 index 0000000..e5a223f Binary files /dev/null and b/fastlane/metadata/android/zh-Hant/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/1.png b/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/1.png new file mode 100644 index 0000000..47d7666 Binary files /dev/null and b/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/2.png b/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/2.png new file mode 100644 index 0000000..fa05e9e Binary files /dev/null and b/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/3.png b/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/3.png new file mode 100644 index 0000000..e038cf9 Binary files /dev/null and b/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/4.png b/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/4.png new file mode 100644 index 0000000..01106a7 Binary files /dev/null and b/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/5.png b/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/5.png new file mode 100644 index 0000000..44047ca Binary files /dev/null and b/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/6.png b/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/6.png new file mode 100644 index 0000000..8d8faa3 Binary files /dev/null and b/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/7.png b/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/7.png new file mode 100644 index 0000000..109407b Binary files /dev/null and b/fastlane/metadata/android/zh-Hant/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/zh-Hant/short_description.txt b/fastlane/metadata/android/zh-Hant/short_description.txt new file mode 100644 index 0000000..96576eb --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/short_description.txt @@ -0,0 +1 @@ +圖庫和元資料瀏覽器 \ No newline at end of file diff --git a/flutterdip.py b/flutterdip.py new file mode 100644 index 0000000..f552b8b --- /dev/null +++ b/flutterdip.py @@ -0,0 +1,72 @@ +import os +import re +from collections import defaultdict, deque + +ROOT = "lib" + +IMPORT_RE = re.compile(r"import\s+'package:[^/]+/(.+?)';") + +def list_dart_files(): + files = [] + for root, _, filenames in os.walk(ROOT): + for f in filenames: + if f.endswith(".dart"): + files.append(os.path.join(root, f)) + return files + +def normalize(path): + return path.replace("\\", "/") + +def build_graph(files): + graph = defaultdict(list) + reverse_graph = defaultdict(list) + + for f in files: + rel = normalize(f) + with open(f, "r", encoding="utf-8") as fh: + content = fh.read() + + for m in IMPORT_RE.findall(content): + imported = normalize(os.path.join(ROOT, m)) + if imported in files: + graph[rel].append(imported) + reverse_graph[imported].append(rel) + + return graph, reverse_graph + +def reachable_from_main(graph): + start = "lib/main.dart" + visited = set() + queue = deque([start]) + + while queue: + node = queue.popleft() + if node in visited: + continue + visited.add(node) + for nxt in graph.get(node, []): + queue.append(nxt) + + return visited + +files = list_dart_files() +files = [normalize(f) for f in files] + +graph, reverse_graph = build_graph(files) +reachable = reachable_from_main(graph) + +unused = sorted(set(files) - reachable) + +print("\n=== FILE NON USATI ===") +for f in unused: + print(f) + +print("\n=== DIPENDENZE ===") +for f in sorted(files): + print(f"\n{f}") + print(" importa:") + for dep in graph[f]: + print(" -", dep) + print(" importato da:") + for dep in reverse_graph[f]: + print(" -", dep) diff --git a/full_build_log.txt b/full_build_log.txt new file mode 100644 index 0000000..3343f5d --- /dev/null +++ b/full_build_log.txt @@ -0,0 +1,1225 @@ +[ +46 ms] executing: sysctl hw.optional.arm64 +[ +7 ms] Exit code 1 from: sysctl hw.optional.arm64 +[ ] sysctl: unknown oid 'hw.optional.arm64' +[ +11 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update. +[ ] Artifact Instance of 'GradleWrapper' is not required, skipping update. +[ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ +2 ms] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ ] Artifact Instance of 'FlutterSdk' is not required, skipping update. +[ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'PubDependencies' is not required, skipping update. +[ +48 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update. +[ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ +2 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ +61 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update. +[ ] Artifact Instance of 'GradleWrapper' is not required, skipping update. +[ +2 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update. +[ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ ] Artifact Instance of 'FlutterSdk' is not required, skipping update. +[ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'PubDependencies' is not required, skipping update. +[ +89 ms] executing: [/Volumes/terrain/aves_mio54/] /Users/fabio/fvm/versions/3.35.7/bin/cache/dart-sdk/bin/dart pub --suppress-analytics --directory . get --example +Resolving dependencies... +Downloading packages... + _fe_analyzer_shared 85.0.0 (100.0.0 available) + analyzer 7.7.1 (13.0.0 available) + characters 1.4.0 (1.4.1 available) + csv 6.0.0 (8.0.0 available) + dchs_motion_sensors 2.0.1 (2.0.2 available) + device_info_plus 12.4.0 (13.1.0 available) + device_info_plus_platform_interface 7.0.3 (8.1.0 available) + flex_color_picker 3.7.2 (3.8.0 available) + flex_seed_scheme 3.6.1 (4.0.1 available) + flutter_secure_storage 9.2.4 (10.1.0 available) + flutter_secure_storage_linux 1.2.3 (3.0.0 available) + flutter_secure_storage_macos 3.1.3 (4.0.0 available) + flutter_secure_storage_platform_interface 1.1.2 (2.0.1 available) + flutter_secure_storage_web 1.2.1 (2.1.1 available) + flutter_secure_storage_windows 3.1.2 (4.1.0 available) + google_maps_flutter 2.14.2 (2.17.0 available) + google_maps_flutter_ios 2.17.4 (2.18.1 available) + google_maps_flutter_web 0.5.14+3 (0.6.2+1 available) + idb_shim 2.6.7+1 (2.9.1 available) + js 0.6.7 (0.7.2 available) + latlong2 0.9.1 (0.10.1 available) + local_auth_darwin 2.0.1 (2.0.3 available) + matcher 0.12.17 (0.12.20 available) + material_color_utilities 0.11.1 (0.13.0 available) + meta 1.16.0 (1.18.2 available) + network_info_plus 7.0.0 (8.1.0 available) + network_info_plus_platform_interface 2.0.2 (3.1.0 available) + package_info_plus 9.0.1 (10.1.0 available) + package_info_plus_platform_interface 3.2.1 (4.1.0 available) + palette_generator 0.3.3+7 (discontinued) + path_provider_foundation 2.5.1 (2.6.0 available) + pin_code_fields 8.0.1 (9.3.0 available) + protobuf 3.1.0 (6.0.0 available) + sembast 3.8.5+2 (3.8.6 available) +! shared_preferences_android 2.4.18 (overridden) (2.4.23 available) + sqflite 2.4.2 (2.4.2+1 available) + sqflite_android 2.4.2+2 (2.4.2+3 available) + sqflite_common 2.5.6 (2.5.7 available) + synchronized 3.4.0 (3.4.0+1 available) + test 1.26.2 (1.31.1 available) + test_api 0.7.6 (0.7.12 available) + test_core 0.6.11 (0.6.18 available) + url_launcher_ios 6.3.6 (6.4.1 available) + url_launcher_web 2.4.1 (2.4.3 available) + vector_map_tiles 9.0.0-beta.8 (10.0.0-beta.2 available) + vector_math 2.2.0 (2.3.0 available) + vector_tile 2.0.1 (4.0.0 available) + video_player 2.10.1 (2.11.1 available) + video_player_avfoundation 2.8.9 (2.9.4 available) + wakelock_plus 1.4.0 (1.6.0 available) + wakelock_plus_platform_interface 1.3.0 (1.5.0 available) + win32 5.15.0 (6.1.0 available) + win32_registry 2.1.0 (3.0.3 available) + xml 6.6.1 (7.0.1 available) +Got dependencies! +1 package is discontinued. +53 packages have newer versions incompatible with dependency constraints. +Try `flutter pub outdated` for more information. +[+12522 ms] Found plugin volume_controller at /Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/ +[ +10 ms] Found plugin video_player at /Users/fabio/.pub-cache/hosted/pub.dev/video_player-2.10.1/ +[ +2 ms] Found plugin video_player_web at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_web-2.4.0/ +[ +5 ms] Found plugin video_player_avfoundation at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.8.9/ +[ +2 ms] Found plugin video_player_android at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_android-2.9.5/ +[ +22 ms] Found plugin path_provider at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider-2.1.5/ +[ +1 ms] Found plugin path_provider_windows at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/ +[ +3 ms] Found plugin path_provider_linux at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/ +[ +4 ms] Found plugin path_provider_foundation at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_foundation-2.5.1/ +[ +1 ms] Found plugin path_provider_android at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/ +[ +2 ms] Found plugin jni_flutter at /Users/fabio/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/ +[ +2 ms] Found plugin jni at /Users/fabio/.pub-cache/hosted/pub.dev/jni-1.0.0/ +[ +24 ms] Found plugin url_launcher at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher-6.3.2/ +[ +2 ms] Found plugin url_launcher_windows at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.5/ +[ +5 ms] Found plugin url_launcher_web at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_web-2.4.1/ +[ +2 ms] Found plugin url_launcher_macos at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.5/ +[ +2 ms] Found plugin url_launcher_linux at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.2/ +[ +2 ms] Found plugin url_launcher_ios at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.6/ +[ +2 ms] Found plugin url_launcher_android at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.29/ +[ +2 ms] Found plugin streams_channel at /Users/fabio/.pub-cache/git/aves_streams_channel-35a9b0fcc0e97f756756c0010fb223129c2d832c/ +[ +3 ms] Found plugin sqflite at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite-2.4.2/ +[ +6 ms] Found plugin sqflite_darwin at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/ +[ +2 ms] Found plugin sqflite_android at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+2/ +[ +2 ms] Found plugin shared_preferences at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences-2.5.5/ +[ +1 ms] Found plugin shared_preferences_windows at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/ +[ +1 ms] Found plugin shared_preferences_web at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3/ +[ +1 ms] Found plugin shared_preferences_linux at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/ +[ +1 ms] Found plugin shared_preferences_foundation at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/ +[ +1 ms] Found plugin shared_preferences_android at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.18/ +[ +2 ms] Found plugin screen_brightness at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness-2.1.7/ +[ +1 ms] Found plugin screen_brightness_windows at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_windows-2.1.0/ +[ +2 ms] Found plugin screen_brightness_ohos at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_ohos-2.1.2/ +[ +1 ms] Found plugin screen_brightness_macos at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_macos-2.1.1/ +[ +1 ms] Found plugin screen_brightness_ios at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_ios-2.1.2/ +[ +1 ms] Found plugin screen_brightness_android at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/ +[ +3 ms] Found plugin printing at /Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/ +[ +7 ms] Found plugin permission_handler at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler-12.0.1/ +[ +1 ms] Found plugin permission_handler_windows at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_windows-0.2.1/ +[ +2 ms] Found plugin permission_handler_html at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_html-0.1.3+5/ +[ +1 ms] Found plugin permission_handler_apple at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_apple-9.4.7/ +[ +1 ms] Found plugin permission_handler_android at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_android-13.0.1/ +[ +5 ms] Found plugin dchs_motion_sensors at /Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/ +[ +2 ms] Found plugin package_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/ +[ +4 ms] Found plugin network_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/ +[ +8 ms] Found plugin local_auth at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth-3.0.1/ +[ +1 ms] Found plugin local_auth_windows at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_windows-2.0.1/ +[ +2 ms] Found plugin local_auth_darwin at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_darwin-2.0.1/ +[ +1 ms] Found plugin local_auth_android at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_android-2.0.8/ +[ +1 ms] Found plugin flutter_plugin_android_lifecycle at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.34/ +[ +4 ms] Found plugin google_cast at /Volumes/terrain/aves_mio54/plugins/google_cast/ +[ +3 ms] Found plugin flutter_secure_storage at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/ +[ +1 ms] Found plugin flutter_secure_storage_windows at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_windows-3.1.2/ +[ +1 ms] Found plugin flutter_secure_storage_web at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_web-1.2.1/ +[ ] Found plugin flutter_secure_storage_macos at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_macos-3.1.3/ +[ ] Found plugin flutter_secure_storage_linux at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_linux-1.2.3/ +[ +5 ms] Found plugin flutter_displaymode at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_displaymode-0.7.0/ +[ +2 ms] Found plugin floating at /Users/fabio/.pub-cache/hosted/pub.dev/floating-6.0.0/ +[ +7 ms] Found plugin dynamic_color at /Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/ +[ +2 ms] Found plugin device_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/ +[ +5 ms] Found plugin connectivity_plus at /Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/ +[ +6 ms] Found plugin media_kit_video at /Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/ +[ +1 ms] Found plugin wakelock_plus at /Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/ +[ +5 ms] Found plugin media_kit_libs_android_video at /Users/fabio/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8/ +[ +6 ms] Found plugin google_maps_flutter_android at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_android-2.19.8/ +[ +1 ms] Found plugin google_maps_flutter at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter-2.14.2/ +[ +1 ms] Found plugin google_maps_flutter_web at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_web-0.5.14+3/ +[ +2 ms] Found plugin google_maps_flutter_ios at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_ios-2.17.4/ +[ ] Found plugin google_api_availability at /Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability-5.0.1/ +[ +1 ms] Found plugin google_api_availability_android at /Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability_android-1.1.1/ +[ +3 ms] Found plugin aves_screen_state at /Volumes/terrain/aves_mio54/plugins/aves_screen_state/ +[ +1 ms] Found plugin firebase_crashlytics at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_crashlytics-5.2.0/ +[ +1 ms] Found plugin firebase_core at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/ +[ ] Found plugin firebase_core_web at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_core_web-3.6.0/ +[ +87 ms] Found plugin volume_controller at /Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/ +[ ] Found plugin video_player at /Users/fabio/.pub-cache/hosted/pub.dev/video_player-2.10.1/ +[ ] Found plugin video_player_web at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_web-2.4.0/ +[ +1 ms] Found plugin video_player_avfoundation at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.8.9/ +[ ] Found plugin video_player_android at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_android-2.9.5/ +[ +8 ms] Found plugin path_provider at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider-2.1.5/ +[ ] Found plugin path_provider_windows at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/ +[ +1 ms] Found plugin path_provider_linux at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/ +[ +1 ms] Found plugin path_provider_foundation at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_foundation-2.5.1/ +[ ] Found plugin path_provider_android at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/ +[ ] Found plugin jni_flutter at /Users/fabio/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/ +[ ] Found plugin jni at /Users/fabio/.pub-cache/hosted/pub.dev/jni-1.0.0/ +[ +9 ms] Found plugin url_launcher at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher-6.3.2/ +[ ] Found plugin url_launcher_windows at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.5/ +[ +1 ms] Found plugin url_launcher_web at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_web-2.4.1/ +[ ] Found plugin url_launcher_macos at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.5/ +[ ] Found plugin url_launcher_linux at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.2/ +[ ] Found plugin url_launcher_ios at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.6/ +[ ] Found plugin url_launcher_android at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.29/ +[ ] Found plugin streams_channel at /Users/fabio/.pub-cache/git/aves_streams_channel-35a9b0fcc0e97f756756c0010fb223129c2d832c/ +[ ] Found plugin sqflite at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite-2.4.2/ +[ +1 ms] Found plugin sqflite_darwin at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/ +[ ] Found plugin sqflite_android at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+2/ +[ +1 ms] Found plugin shared_preferences at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences-2.5.5/ +[ ] Found plugin shared_preferences_windows at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/ +[ ] Found plugin shared_preferences_web at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3/ +[ ] Found plugin shared_preferences_linux at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/ +[ ] Found plugin shared_preferences_foundation at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/ +[ ] Found plugin shared_preferences_android at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.18/ +[ ] Found plugin screen_brightness at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness-2.1.7/ +[ ] Found plugin screen_brightness_windows at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_windows-2.1.0/ +[ +1 ms] Found plugin screen_brightness_ohos at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_ohos-2.1.2/ +[ ] Found plugin screen_brightness_macos at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_macos-2.1.1/ +[ ] Found plugin screen_brightness_ios at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_ios-2.1.2/ +[ ] Found plugin screen_brightness_android at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/ +[ +2 ms] Found plugin printing at /Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/ +[ +4 ms] Found plugin permission_handler at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler-12.0.1/ +[ ] Found plugin permission_handler_windows at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_windows-0.2.1/ +[ +1 ms] Found plugin permission_handler_html at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_html-0.1.3+5/ +[ ] Found plugin permission_handler_apple at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_apple-9.4.7/ +[ ] Found plugin permission_handler_android at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_android-13.0.1/ +[ +3 ms] Found plugin dchs_motion_sensors at /Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/ +[ +1 ms] Found plugin package_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/ +[ +3 ms] Found plugin network_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/ +[ +4 ms] Found plugin local_auth at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth-3.0.1/ +[ ] Found plugin local_auth_windows at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_windows-2.0.1/ +[ +1 ms] Found plugin local_auth_darwin at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_darwin-2.0.1/ +[ ] Found plugin local_auth_android at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_android-2.0.8/ +[ ] Found plugin flutter_plugin_android_lifecycle at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.34/ +[ +2 ms] Found plugin google_cast at /Volumes/terrain/aves_mio54/plugins/google_cast/ +[ +2 ms] Found plugin flutter_secure_storage at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/ +[ ] Found plugin flutter_secure_storage_windows at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_windows-3.1.2/ +[ +1 ms] Found plugin flutter_secure_storage_web at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_web-1.2.1/ +[ ] Found plugin flutter_secure_storage_macos at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_macos-3.1.3/ +[ +1 ms] Found plugin flutter_secure_storage_linux at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_linux-1.2.3/ +[ +4 ms] Found plugin flutter_displaymode at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_displaymode-0.7.0/ +[ +1 ms] Found plugin floating at /Users/fabio/.pub-cache/hosted/pub.dev/floating-6.0.0/ +[ +4 ms] Found plugin dynamic_color at /Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/ +[ +2 ms] Found plugin device_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/ +[ +5 ms] Found plugin connectivity_plus at /Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/ +[ +4 ms] Found plugin media_kit_video at /Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/ +[ +1 ms] Found plugin wakelock_plus at /Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/ +[ +4 ms] Found plugin media_kit_libs_android_video at /Users/fabio/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8/ +[+2079 ms] Found plugin google_maps_flutter_android at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_android-2.19.8/ +[ +1 ms] Found plugin google_maps_flutter at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter-2.14.2/ +[ ] Found plugin google_maps_flutter_web at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_web-0.5.14+3/ +[ +2 ms] Found plugin google_maps_flutter_ios at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_ios-2.17.4/ +[ ] Found plugin google_api_availability at /Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability-5.0.1/ +[ +1 ms] Found plugin google_api_availability_android at /Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability_android-1.1.1/ +[ +3 ms] Found plugin aves_screen_state at /Volumes/terrain/aves_mio54/plugins/aves_screen_state/ +[ +1 ms] Found plugin firebase_crashlytics at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_crashlytics-5.2.0/ +[ +1 ms] Found plugin firebase_core at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/ +[ ] Found plugin firebase_core_web at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_core_web-3.6.0/ +[ +19 ms] Generating /Volumes/terrain/aves_mio54/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java +[ +16 ms] Skipping generating GeneratedPluginRegistrant.java because it is up-to-date. +[+11252 ms] executing: /usr/bin/plutil -convert xml1 -o - /Applications/Android Studio.app/Contents/Info.plist +[+2446 ms] Exit code 0 from: /usr/bin/plutil -convert xml1 -o - /Applications/Android Studio.app/Contents/Info.plist +[ ] <?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> + <plist version="1.0"> + <dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleDocumentTypes</key> + <array> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>ipr</string> + </array> + <key>CFBundleTypeIconFile</key> + <string>studio.icns</string> + <key>CFBundleTypeName</key> + <string>Android Studio Project File</string> + <key>CFBundleTypeRole</key> + <string>Editor</string> + </dict> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>*</string> + </array> + <key>CFBundleTypeName</key> + <string>All documents</string> + <key>CFBundleTypeOSTypes</key> + <array> + <string>****</string> + </array> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>LSTypeIsPackage</key> + <false/> + </dict> + </array> + <key>CFBundleExecutable</key> + <string>studio</string> + <key>CFBundleGetInfoString</key> + <string>Android Studio 2024.3, build AI-243.26053.27.2432.13536105. Copyright JetBrains s.r.o., (c) 2000-2025</string> + <key>CFBundleIconFile</key> + <string>studio.icns</string> + <key>CFBundleIdentifier</key> + <string>com.google.android.studio</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>Android Studio</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>2024.3</string> + <key>CFBundleURLTypes</key> + <array> + <dict> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>CFBundleURLName</key> + <string>Stacktrace</string> + <key>CFBundleURLSchemes</key> + <array> + <string>idea</string> + </array> + </dict> + </array> + <key>CFBundleVersion</key> + <string>AI-243.26053.27.2432.13536105</string> + <key>LSApplicationCategoryType</key> + <string>public.app-category.developer-tools</string> + <key>LSArchitecturePriority</key> + <array> + <string>x86_64</string> + </array> + <key>LSMinimumSystemVersion</key> + <string>10.13</string> + <key>LSRequiresNativeExecution</key> + <string>YES</string> + <key>NSAppleEventsUsageDescription</key> + <string>An application in Android Studio requests the ability to send Apple events.</string> + <key>NSBluetoothAlwaysUsageDescription</key> + <string>An application in Android Studio requests access to Bluetooth.</string> + <key>NSCameraUsageDescription</key> + <string>An application in Android Studio requests access to the device's camera.</string> + <key>NSDesktopFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Desktop folder.</string> + <key>NSDocumentsFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Documents folder.</string> + <key>NSDownloadsFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Downloads folder.</string> + <key>NSHighResolutionCapable</key> + <true/> + <key>NSLocalNetworkUsageDescription</key> + <string>Android Studio's features, such as SSH and database connectivity, require permissions for accessing the local network and sending broadcast requests.</string> + <key>NSLocationUsageDescription</key> + <string>An application in Android Studio requests access to the user's location information.</string> + <key>NSMicrophoneUsageDescription</key> + <string>An application in Android Studio requests access to the device's microphone.</string> + <key>NSNetworkVolumesUsageDescription</key> + <string>An application in Android Studio requests access to files on a network volume.</string> + <key>NSRemovableVolumesUsageDescription</key> + <string>An application in Android Studio requests access to files on a removable volume.</string> + <key>NSSupportsAutomaticGraphicsSwitching</key> + <true/> + </dict> + </plist> +[ +13 ms] executing: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java -version +[ +100 ms] Exit code 0 from: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java -version +[ +510 ms] openjdk version "21.0.6" 2025-01-21 + OpenJDK Runtime Environment (build 21.0.6+-13368085-b895.109) + OpenJDK 64-Bit Server VM (build 21.0.6+-13368085-b895.109, mixed mode) +[ +2 ms] executing: /usr/bin/plutil -convert xml1 -o - /Volumes/MacHD/Applications/Android Studio.app/Contents/Info.plist +[ +16 ms] Exit code 0 from: /usr/bin/plutil -convert xml1 -o - /Volumes/MacHD/Applications/Android Studio.app/Contents/Info.plist +[ +133 ms] <?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> + <plist version="1.0"> + <dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleDocumentTypes</key> + <array> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>ipr</string> + </array> + <key>CFBundleTypeIconFile</key> + <string>studio.icns</string> + <key>CFBundleTypeName</key> + <string>Android Studio Project File</string> + <key>CFBundleTypeRole</key> + <string>Editor</string> + </dict> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>*</string> + </array> + <key>CFBundleTypeName</key> + <string>All documents</string> + <key>CFBundleTypeOSTypes</key> + <array> + <string>****</string> + </array> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>LSTypeIsPackage</key> + <false/> + </dict> + </array> + <key>CFBundleExecutable</key> + <string>studio</string> + <key>CFBundleGetInfoString</key> + <string>Android Studio 4.1, build AI-201.8743.12.41.6858069. Copyright JetBrains s.r.o., (c) 2000-2020</string> + <key>CFBundleIconFile</key> + <string>studio.icns</string> + <key>CFBundleIdentifier</key> + <string>com.google.android.studio</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>Android Studio</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>4.1</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleURLTypes</key> + <array> + <dict> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>CFBundleURLName</key> + <string>Stacktrace</string> + <key>CFBundleURLSchemes</key> + <array> + <string>idea</string> + </array> + </dict> + </array> + <key>CFBundleVersion</key> + <string>AI-201.8743.12.41.6858069</string> + <key>JVMOptions</key> + <dict> + <key>ClassPath</key> + <string>$APP_PACKAGE/Contents/lib/bootstrap.jar:$APP_PACKAGE/Contents/lib/extensions.jar:$APP_PACKAGE/Contents/lib/util.jar:$APP_PACKAGE/Contents/lib/jdom.jar:$APP_PACKAGE/Contents/lib/log4j.jar:$APP_PACKAGE/Contents/lib/trove4j.jar:$APP_PACKAGE/Contents/lib/jna.jar</string> + <key>JVMVersion</key> + <string>1.8*,1.8+</string> + <key>MainClass</key> + <string>com.intellij.idea.Main</string> + <key>Properties</key> + <dict> + <key>idea.executable</key> + <string>studio</string> + <key>idea.home.path</key> + <string>$APP_PACKAGE/Contents</string> + <key>idea.paths.selector</key> + <string>AndroidStudio4.1</string> + <key>idea.platform.prefix</key> + <string>AndroidStudio</string> + <key>idea.vendor.name</key> + <string>Google</string> + </dict> + </dict> + <key>LSApplicationCategoryType</key> + <string>public.app-category.developer-tools</string> + <key>LSArchitecturePriority</key> + <array> + <string>x86_64</string> + </array> + <key>LSMinimumSystemVersion</key> + <string>10.8</string> + <key>LSRequiresNativeExecution</key> + <string>YES</string> + <key>NSCameraUsageDescription</key> + <string>An application in Android Studio requests access to the device's camera.</string> + <key>NSDesktopFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Desktop folder.</string> + <key>NSDocumentsFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Documents folder.</string> + <key>NSDownloadsFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Downloads folder.</string> + <key>NSHighResolutionCapable</key> + <true/> + <key>NSLocationUsageDescription</key> + <string>An application in Android Studio requests access to the user's location information.</string> + <key>NSMicrophoneUsageDescription</key> + <string>An application in Android Studio requests access to the device's microphone.</string> + <key>NSNetworkVolumesUsageDescription</key> + <string>An application in Android Studio requests access to files on a network volume.</string> + <key>NSRemovableVolumesUsageDescription</key> + <string>An application in Android Studio requests access to files on a removable volume.</string> + <key>NSSupportsAutomaticGraphicsSwitching</key> + <true/> + </dict> + </plist> +[ +7 ms] executing: /Volumes/MacHD/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java -version +[ +361 ms] Exit code 0 from: /Volumes/MacHD/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java -version +[ +176 ms] openjdk version "1.8.0_242-release" + OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593) + OpenJDK 64-Bit Server VM (build 25.242-b3-6222593, mixed mode) +[ +15 ms] Top-level Gradle build file not found, skipping migration of task "clean". +[ +264 ms] executing: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java --version +[ +96 ms] Exit code 0 from: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java --version +[ +331 ms] openjdk 21.0.6 2025-01-21 + OpenJDK Runtime Environment (build 21.0.6+-13368085-b895.109) + OpenJDK 64-Bit Server VM (build 21.0.6+-13368085-b895.109, mixed mode) +[ +5 ms] Version of Java is different than impacted version, no migration attempted. +[ +15 ms] CMake project not found, skipping support Android 15 16k page size migration. +[ +98 ms] Using gradle from /Volumes/terrain/aves_mio54/android/gradlew. +[ +81 ms] LocalFile: '/Volumes/terrain/aves_mio54/android/build.gradle.kts' doesn't provide an AGP version. Checking settings. +[ +12 ms] LocalFile: '/Volumes/terrain/aves_mio54/android/settings.gradle.kts' provides AGP version: 8.13.2 +[ +28 ms] Running Gradle task 'assemblePlayDebug'... +[ +1 ms] executing: [/Volumes/terrain/aves_mio54/android/] /Volumes/terrain/aves_mio54/android/gradlew --full-stacktrace --info -Pverbose=true -Ptarget-platform=android-arm,android-arm64,android-x64 -Ptarget=lib/main_play.dart -Pbase-application-name=android.app.Application -Pdart-defines=RkxVVFRFUl9BUFBfRkxBVk9SPXBsYXk=,RkxVVFRFUl9WRVJTSU9OPTMuMzUuNw==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049YWRjOTAxMDYyNQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDM1MzE2NTY1YQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My45LjI= -Pdart-obfuscation=false -Ptrack-widget-creation=true -Ptree-shake-icons=false assemblePlayDebug +[+1017 ms] Initialized native services in: /Users/fabio/.gradle/native +[ ] Initialized jansi services in: /Users/fabio/.gradle/native +[ +418 ms] The client will now receive all logging from the daemon (pid: 27645). The daemon log file: /Users/fabio/.gradle/daemon/8.14.4/daemon-27645.out.log +[ ] Starting 13th build in daemon [uptime: 56 mins 10.911 secs, performance: 100%, GC rate: 0.00/s, heap usage: 0% of 8 GiB, non-heap usage: 12% of 4 GiB] +[ ] Using 4 worker leases. +[ ] Now considering [/Volumes/terrain/aves_mio54/android, /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle] as hierarchies to watch +[ ] Watching the file system is configured to be enabled if available +[ ] File system watching is active +[ ] Starting Build +[ ] Now considering [/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle, /Volumes/terrain/aves_mio54/android] as hierarchies to watch +[ +104 ms] > Configure project :gradle +[ ] Evaluating project ':gradle' using build file '/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/build.gradle.kts'. +[ ] Resolved plugin [id: 'org.gradle.java-gradle-plugin'] +[ ] Resolved plugin [id: 'org.gradle.groovy'] +[ ] Resolved plugin [id: 'org.gradle.kotlin.kotlin-dsl', version: '5.2.0'] +[ ] Resolved plugin [id: 'org.jetbrains.kotlin.jvm', version: '1.9.20'] +[ ] Using Kotlin Gradle Plugin gradle85 variant +[ ] kotlin scripting plugin: created the scripting discovery configuration: kotlinScriptDef +[ ] kotlin scripting plugin: created the scripting discovery configuration: testKotlinScriptDef +[ ] file or directory '/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/java', not found +[ ] Resolved plugin [id: 'dev.flutter.flutter-plugin-loader', version: '1.0.0'] +[ ] Resolved plugin [id: 'org.gradle.toolchains.foojay-resolver-convention', version: '1.0.0'] +[ ] Resolved plugin [id: 'com.android.application', version: '8.13.2', apply: false] +[ ] Resolved plugin [id: 'org.jetbrains.kotlin.android', version: '2.3.0', apply: false] +[ +91 ms] Resolve mutations for :gradle:checkKotlinGradlePluginConfigurationErrors (Thread[#1179,Execution worker,5,main]) started. +[ ] :gradle:checkKotlinGradlePluginConfigurationErrors (Thread[#1178,included builds,5,main]) started. +[ ] > Task :gradle:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':gradle:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :gradle:compileKotlin (Thread[#1178,included builds,5,main]) started. +[ ] :gradle:compileKotlin (Thread[#1178,included builds,5,main]) started. +[ ] > Task :gradle:compileKotlin UP-TO-DATE +[ ] Caching disabled for task ':gradle:compileKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':gradle:compileKotlin' as it is up-to-date. +[ ] Resolve mutations for :gradle:compileJava (Thread[#1178,included builds,5,main]) started. +[ ] :gradle:compileJava (Thread[#1178,included builds,5,main]) started. +[ ] > Task :gradle:compileJava NO-SOURCE +[ ] Skipping task ':gradle:compileJava' as it has no source files and no previous output files. +[ ] Resolve mutations for :gradle:compileGroovy (Thread[#1178,included builds,5,main]) started. +[ ] :gradle:compileGroovy (Thread[#1178,included builds,5,main]) started. +[ ] > Task :gradle:compileGroovy NO-SOURCE +[ ] Skipping task ':gradle:compileGroovy' as it has no source files and no previous output files. +[ ] Resolve mutations for :gradle:pluginDescriptors (Thread[#1178,included builds,5,main]) started. +[ ] :gradle:pluginDescriptors (Thread[#1178,included builds,5,main]) started. +[ ] > Task :gradle:pluginDescriptors UP-TO-DATE +[ ] Caching disabled for task ':gradle:pluginDescriptors' because: +[ ] Build cache is disabled +[ ] Not worth caching +[ ] Skipping task ':gradle:pluginDescriptors' as it is up-to-date. +[ ] Resolve mutations for :gradle:processResources (Thread[#1178,included builds,5,main]) started. +[ ] :gradle:processResources (Thread[#1178,included builds,5,main]) started. +[ ] > Task :gradle:processResources UP-TO-DATE +[ ] Caching disabled for task ':gradle:processResources' because: +[ ] Build cache is disabled +[ ] Not worth caching +[ ] Skipping task ':gradle:processResources' as it is up-to-date. +[ ] Resolve mutations for :gradle:classes (Thread[#1178,included builds,5,main]) started. +[ ] :gradle:classes (Thread[#1178,included builds,5,main]) started. +[ ] > Task :gradle:classes UP-TO-DATE +[ ] Skipping task ':gradle:classes' as it has no actions. +[ ] Resolve mutations for :gradle:jar (Thread[#1178,included builds,5,main]) started. +[ ] :gradle:jar (Thread[#1178,included builds,5,main]) started. +[ +93 ms] > Task :gradle:jar UP-TO-DATE +[ ] Caching disabled for task ':gradle:jar' because: +[ ] Build cache is disabled +[ ] Not worth caching +[ ] Skipping task ':gradle:jar' as it is up-to-date. +[ +100 ms] Settings evaluated using settings file '/Volumes/terrain/aves_mio54/android/settings.gradle.kts'. +[ +79 ms] Projects loaded. Root project using build file '/Volumes/terrain/aves_mio54/android/build.gradle.kts'. +[ +1 ms] Included projects: [root project 'android', project ':app', project ':aves_screen_state', project ':connectivity_plus', project ':dchs_motion_sensors', project ':device_info_plus', project ':dynamic_color', project ':exifinterface', project ':firebase_core', project ':firebase_crashlytics', project ':floating', project ':flutter_displaymode', project ':flutter_plugin_android_lifecycle', project ':flutter_secure_storage', project ':google_api_availability_android', project ':google_cast', project ':google_maps_flutter_android', project ':jni', project ':jni_flutter', project ':local_auth_android', project ':media_kit_libs_android_video', project ':media_kit_video', project ':network_info_plus', project ':package_info_plus', project ':permission_handler_android', project ':printing', project ':screen_brightness_android', project ':shared_preferences_android', project ':sqflite_android', project ':streams_channel', project ':url_launcher_android', project ':video_player_android', project ':volume_controller', project ':wakelock_plus'] +[ +519 ms] > Configure project :app +[+1151 ms] Evaluating project ':app' using build file '/Volumes/terrain/aves_mio54/android/app/build.gradle.kts'. +[ ] Resolved plugin [id: 'com.android.application', version: '8.13.2'] +[ ] Resolved plugin [id: 'com.google.devtools.ksp', version: '2.3.5'] +[ ] Resolved plugin [id: 'kotlin-android'] +[ ] Resolved plugin [id: 'dev.flutter.flutter-gradle-plugin'] +[ ] Using default execution profile +[ ] Build f1f31889-41f0-4caa-9b72-b9e34fe8779f is started +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ ] Load keystore props from file=/Volumes/terrain/aves_mio54/android/key.properties +[ ] Create signing config for release using file=../keystore/release.jks +[ ] Building flavor with Crashlytics plugin +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ +1 ms] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ +3 ms] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ +1 ms] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ +2 ms] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ +1 ms] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ +2 ms] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ +2 ms] C/C++: android.ndkPath from module build.gradle is not set +[ +1 ms] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] Application variant applicationId=deckers.thibault.aves.debug name=playDebug +[ ] Application variant applicationId=deckers.thibault.aves.debug name=izzyDebug +[ ] Application variant applicationId=deckers.thibault.aves.libre.debug name=libreDebug +[ ] Application variant applicationId=deckers.thibault.aves.libre.debug name=libre_romDebug +[ ] Application variant applicationId=deckers.thibault.aves name=playRelease +[ ] Application variant applicationId=deckers.thibault.aves name=izzyRelease +[ ] Application variant applicationId=deckers.thibault.aves.libre name=libreRelease +[ ] Application variant applicationId=deckers.thibault.aves.libre name=libre_romRelease +[ ] Application variant applicationId=deckers.thibault.aves name=playProfile +[ ] Application variant applicationId=deckers.thibault.aves name=izzyProfile +[ ] Application variant applicationId=deckers.thibault.aves.libre name=libreProfile +[ ] Application variant applicationId=deckers.thibault.aves.libre name=libre_romProfile +[ ] > Configure project : +[ ] Evaluating root project 'android' using build file '/Volumes/terrain/aves_mio54/android/build.gradle.kts'. +[ ] Tasks=[assemblePlayDebug] +[ ] Extra= +[ ] android.enableR8.fullMode=false +[ ] android.useAndroidX=true +[ ] aves.useCrashlytics=true +[ ] base-application-name=android.app.Application +[ ] dart-defines=RkxVVFRFUl9BUFBfRkxBVk9SPXBsYXk=,RkxVVFRFUl9WRVJTSU9OPTMuMzUuNw==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049YWRjOTAxMDYyNQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDM1MzE2NTY1YQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My45LjI= +[ ] dart-obfuscation=false +[ ] kotlin.code.style=official +[ ] kotlin.jvm.target.validation.mode=IGNORE +[ ] org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +[ ] target-platform=android-arm,android-arm64,android-x64 +[ ] target=lib/main_play.dart +[ ] track-widget-creation=true +[ ] tree-shake-icons=false +[ ] verbose=true +[ ] Resolved plugin [id: 'org.gradlex.reproducible-builds', version: '1.1'] +[ ] > Configure project :aves_screen_state +[ ] Evaluating project ':aves_screen_state' using build file '/Volumes/terrain/aves_mio54/plugins/aves_screen_state/android/build.gradle.kts'. +[ ] Resolved plugin [id: 'com.android.library'] +[ ] Resolved plugin [id: 'kotlin-android'] +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ ] > Configure project :connectivity_plus +[ ] Evaluating project ':connectivity_plus' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/android/build.gradle'. +[ ] Using default execution profile +[ ] > Configure project :dchs_motion_sensors +[ ] Evaluating project ':dchs_motion_sensors' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/android/build.gradle'. +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ ] > Configure project :device_info_plus +[ ] Evaluating project ':device_info_plus' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/android/build.gradle'. +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ ] > Configure project :dynamic_color +[ ] Evaluating project ':dynamic_color' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/android/build.gradle'. +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ ] > Configure project :exifinterface +[ ] Evaluating project ':exifinterface' using build file '/Volumes/terrain/aves_mio54/android/exifinterface/build.gradle.kts'. +[ ] Resolved plugin [id: 'com.android.library'] +[ ] Using default execution profile +[ ] > Configure project :firebase_core +[ ] Evaluating project ':firebase_core' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/android/build.gradle'. +[ ] Using default execution profile +[ ] > Configure project :firebase_crashlytics +[ ] Evaluating project ':firebase_crashlytics' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/firebase_crashlytics-5.2.0/android/build.gradle'. +[ ] Using default execution profile +[ ] > Configure project :floating +[ ] Evaluating project ':floating' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/floating-6.0.0/android/build.gradle'. +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ ] > Configure project :flutter_displaymode +[ ] Evaluating project ':flutter_displaymode' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_displaymode-0.7.0/android/build.gradle'. +[ ] Resolved plugin [id: 'com.android.library'] +[ ] Using default execution profile +[ ] > Configure project :flutter_plugin_android_lifecycle +[ ] Evaluating project ':flutter_plugin_android_lifecycle' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.34/android/build.gradle.kts'. +[ ] Resolved plugin [id: 'com.android.library'] +[ ] Using default execution profile +[ ] > Configure project :flutter_secure_storage +[ ] Evaluating project ':flutter_secure_storage' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/android/build.gradle'. +[ ] Using default execution profile +[ ] > Configure project :google_api_availability_android +[ ] Evaluating project ':google_api_availability_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability_android-1.1.1/android/build.gradle'. +[ ] Using default execution profile +[ ] > Configure project :google_cast +[ ] Evaluating project ':google_cast' using build file '/Volumes/terrain/aves_mio54/plugins/google_cast/android/build.gradle'. +[ ] Using default execution profile +[ ] > Configure project :google_maps_flutter_android +[ ] Evaluating project ':google_maps_flutter_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_android-2.19.8/android/build.gradle.kts'. +[ ] Resolved plugin [id: 'com.android.library'] +[ ] Resolved plugin [id: 'kotlin-android'] +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ +3 ms] > Configure project :jni +[ ] Evaluating project ':jni' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/jni-1.0.0/android/build.gradle'. +[ ] Using default execution profile +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ ] C/C++: android.ndkVersion from module build.gradle is [27.0.12077973] +[ ] C/C++: android.ndkPath from module build.gradle is not set +[ ] C/C++: ndk.dir in local.properties is not set +[ ] C/C++: Not considering ANDROID_NDK_HOME because support was removed after deprecation period. +[ ] C/C++: sdkFolder is /Users/fabio/Library/Android/sdk +[ +52 ms] > Configure project :jni_flutter +[ ] Evaluating project ':jni_flutter' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/android/build.gradle'. +[ ] Using default execution profile +[ +99 ms] > Configure project :local_auth_android +[+1816 ms] Evaluating project ':local_auth_android' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/local_auth_android-2.0.8/android/build.gradle.kts'. +[ ] Resolved plugin [id: 'com.android.library'] +[ ] Resolved plugin [id: 'kotlin-android'] +[ ] Using default execution profile +[ ] Using Kotlin Gradle Plugin gradle813 variant +[ +181 ms] > Configure project :media_kit_libs_android_video +[ ] Evaluating project ':media_kit_libs_android_video' using build file '/Users/fabio/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8/android/build.gradle'. +[ ] Using default execution profile +[ ] Downloading file from: https://github.com/media-kit/libmpv-android-video-build/releases/download/v1.1.7/default-arm64-v8a.jar +[+1100 ms] Downloading file from: https://github.com/media-kit/libmpv-android-video-build/releases/download/v1.1.7/default-armeabi-v7a.jar +[+1699 ms] Downloading file from: https://github.com/media-kit/libmpv-android-video-build/releases/download/v1.1.7/default-x86_64.jar +[+5496 ms] executing: sw_vers -productName +[ +823 ms] Exit code 0 from: sw_vers -productName +[ ] macOS +[ ] executing: sw_vers -productVersion +[ +19 ms] Exit code 0 from: sw_vers -productVersion +[ ] 13.7.7 +[ ] executing: sw_vers -buildVersion +[ +18 ms] Exit code 0 from: sw_vers -buildVersion +[ +20 ms] 22H722 +[ ] executing: uname -m +[ +9 ms] Exit code 0 from: uname -m +[ ] x86_64 +[ +96 ms] Running 1 shutdown hook +[ ] Shutdown hooks complete +[ +2 ms] Running Gradle task 'assemblePlayDebug'... (completed in 15,1s) +[ +129 ms] "flutter apk" took 46.503ms. +[ +128 ms] Gradle task assemblePlayDebug failed with exit code 130 +[ +18 ms] + #0 throwToolExit (package:flutter_tools/src/base/common.dart:34:3) + #1 AndroidGradleBuilder.buildGradleApp (package:flutter_tools/src/android/gradle.dart:600:7) + <asynchronous suspension> + #2 AndroidGradleBuilder.buildApk (package:flutter_tools/src/android/gradle.dart:239:5) + <asynchronous suspension> + #3 BuildApkCommand.runCommand (package:flutter_tools/src/commands/build_apk.dart:131:5) + <asynchronous suspension> + #4 FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:1581:27) + <asynchronous suspension> + #5 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:154:19) + <asynchronous suspension> + #6 CommandRunner.runCommand (package:args/command_runner.dart:212:13) + <asynchronous suspension> + #7 FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:503:9) + <asynchronous suspension> + #8 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:154:19) + <asynchronous suspension> + #9 FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:438:5) + <asynchronous suspension> + #10 run.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:98:11) + <asynchronous suspension> + #11 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:154:19) + <asynchronous suspension> + #12 main (package:flutter_tools/executable.dart:101:3) + <asynchronous suspension> + + +[ ] Running 1 shutdown hook +[ +2 ms] Shutdown hooks complete +[ +14 ms] exiting with code 0 diff --git a/full_log.txt b/full_log.txt new file mode 100644 index 0000000..858ebc1 --- /dev/null +++ b/full_log.txt @@ -0,0 +1,875 @@ +[ +46 ms] executing: sysctl hw.optional.arm64 +[ +7 ms] Exit code 1 from: sysctl hw.optional.arm64 +[ ] sysctl: unknown oid 'hw.optional.arm64' +[ +11 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update. +[ ] Artifact Instance of 'GradleWrapper' is not required, skipping update. +[ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ +2 ms] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ ] Artifact Instance of 'FlutterSdk' is not required, skipping update. +[ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'PubDependencies' is not required, skipping update. +[ +49 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update. +[ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ +2 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ +64 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update. +[ ] Artifact Instance of 'GradleWrapper' is not required, skipping update. +[ +1 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update. +[ ] Artifact Instance of 'FlutterEngineStamp' is not required, skipping update. +[ ] Artifact Instance of 'LegacyCanvasKitRemover' is not required, skipping update. +[ ] Artifact Instance of 'FlutterSdk' is not required, skipping update. +[ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update. +[ ] Artifact Instance of 'PubDependencies' is not required, skipping update. +[ +84 ms] executing: [/Volumes/terrain/aves_mio54/] /Users/fabio/fvm/versions/3.35.7/bin/cache/dart-sdk/bin/dart pub --suppress-analytics --directory . get --example +Resolving dependencies... +Downloading packages... + _fe_analyzer_shared 85.0.0 (100.0.0 available) + analyzer 7.7.1 (13.0.0 available) + characters 1.4.0 (1.4.1 available) + csv 6.0.0 (8.0.0 available) + dchs_motion_sensors 2.0.1 (2.0.2 available) + device_info_plus 12.4.0 (13.1.0 available) + device_info_plus_platform_interface 7.0.3 (8.1.0 available) + flex_color_picker 3.7.2 (3.8.0 available) + flex_seed_scheme 3.6.1 (4.0.1 available) + flutter_secure_storage 9.2.4 (10.1.0 available) + flutter_secure_storage_linux 1.2.3 (3.0.0 available) + flutter_secure_storage_macos 3.1.3 (4.0.0 available) + flutter_secure_storage_platform_interface 1.1.2 (2.0.1 available) + flutter_secure_storage_web 1.2.1 (2.1.1 available) + flutter_secure_storage_windows 3.1.2 (4.1.0 available) + google_maps_flutter 2.14.2 (2.17.0 available) + google_maps_flutter_ios 2.17.4 (2.18.1 available) + google_maps_flutter_web 0.5.14+3 (0.6.2+1 available) + idb_shim 2.6.7+1 (2.9.1 available) + js 0.6.7 (0.7.2 available) + latlong2 0.9.1 (0.10.1 available) + local_auth_darwin 2.0.1 (2.0.3 available) + matcher 0.12.17 (0.12.20 available) + material_color_utilities 0.11.1 (0.13.0 available) + meta 1.16.0 (1.18.2 available) + network_info_plus 7.0.0 (8.1.0 available) + network_info_plus_platform_interface 2.0.2 (3.1.0 available) + package_info_plus 9.0.1 (10.1.0 available) + package_info_plus_platform_interface 3.2.1 (4.1.0 available) + palette_generator 0.3.3+7 (discontinued) + path_provider_foundation 2.5.1 (2.6.0 available) + pin_code_fields 8.0.1 (9.3.0 available) + protobuf 3.1.0 (6.0.0 available) + sembast 3.8.5+2 (3.8.6 available) +! shared_preferences_android 2.4.18 (overridden) (2.4.23 available) + sqflite 2.4.2 (2.4.2+1 available) + sqflite_android 2.4.2+2 (2.4.2+3 available) + sqflite_common 2.5.6 (2.5.7 available) + synchronized 3.4.0 (3.4.0+1 available) + test 1.26.2 (1.31.1 available) + test_api 0.7.6 (0.7.12 available) + test_core 0.6.11 (0.6.18 available) + url_launcher_ios 6.3.6 (6.4.1 available) + url_launcher_web 2.4.1 (2.4.3 available) + vector_map_tiles 9.0.0-beta.8 (10.0.0-beta.2 available) + vector_math 2.2.0 (2.3.0 available) + vector_tile 2.0.1 (4.0.0 available) + video_player 2.10.1 (2.11.1 available) + video_player_avfoundation 2.8.9 (2.9.4 available) + wakelock_plus 1.4.0 (1.6.0 available) + wakelock_plus_platform_interface 1.3.0 (1.5.0 available) + win32 5.15.0 (6.1.0 available) + win32_registry 2.1.0 (3.0.3 available) + xml 6.6.1 (7.0.1 available) +Got dependencies! +1 package is discontinued. +53 packages have newer versions incompatible with dependency constraints. +Try `flutter pub outdated` for more information. +[+2146 ms] Found plugin volume_controller at /Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/ +[ +9 ms] Found plugin video_player at /Users/fabio/.pub-cache/hosted/pub.dev/video_player-2.10.1/ +[ +1 ms] Found plugin video_player_web at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_web-2.4.0/ +[ +4 ms] Found plugin video_player_avfoundation at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.8.9/ +[ +2 ms] Found plugin video_player_android at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_android-2.9.5/ +[ +18 ms] Found plugin path_provider at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider-2.1.5/ +[ +1 ms] Found plugin path_provider_windows at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/ +[ +2 ms] Found plugin path_provider_linux at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/ +[ +3 ms] Found plugin path_provider_foundation at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_foundation-2.5.1/ +[ +1 ms] Found plugin path_provider_android at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/ +[ +1 ms] Found plugin jni_flutter at /Users/fabio/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/ +[ +2 ms] Found plugin jni at /Users/fabio/.pub-cache/hosted/pub.dev/jni-1.0.0/ +[ +20 ms] Found plugin url_launcher at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher-6.3.2/ +[ +1 ms] Found plugin url_launcher_windows at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.5/ +[ +2 ms] Found plugin url_launcher_web at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_web-2.4.1/ +[ +1 ms] Found plugin url_launcher_macos at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.5/ +[ +1 ms] Found plugin url_launcher_linux at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.2/ +[ +2 ms] Found plugin url_launcher_ios at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.6/ +[ +1 ms] Found plugin url_launcher_android at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.29/ +[ +2 ms] Found plugin streams_channel at /Users/fabio/.pub-cache/git/aves_streams_channel-35a9b0fcc0e97f756756c0010fb223129c2d832c/ +[ +2 ms] Found plugin sqflite at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite-2.4.2/ +[ +5 ms] Found plugin sqflite_darwin at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/ +[ +2 ms] Found plugin sqflite_android at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+2/ +[ +3 ms] Found plugin shared_preferences at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences-2.5.5/ +[ +1 ms] Found plugin shared_preferences_windows at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/ +[ +1 ms] Found plugin shared_preferences_web at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3/ +[ +1 ms] Found plugin shared_preferences_linux at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/ +[ +1 ms] Found plugin shared_preferences_foundation at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/ +[ +1 ms] Found plugin shared_preferences_android at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.18/ +[ +1 ms] Found plugin screen_brightness at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness-2.1.7/ +[ +1 ms] Found plugin screen_brightness_windows at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_windows-2.1.0/ +[ +2 ms] Found plugin screen_brightness_ohos at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_ohos-2.1.2/ +[ +1 ms] Found plugin screen_brightness_macos at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_macos-2.1.1/ +[ +1 ms] Found plugin screen_brightness_ios at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_ios-2.1.2/ +[ +1 ms] Found plugin screen_brightness_android at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/ +[ +2 ms] Found plugin printing at /Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/ +[ +7 ms] Found plugin permission_handler at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler-12.0.1/ +[ +1 ms] Found plugin permission_handler_windows at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_windows-0.2.1/ +[ +1 ms] Found plugin permission_handler_html at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_html-0.1.3+5/ +[ +1 ms] Found plugin permission_handler_apple at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_apple-9.4.7/ +[ ] Found plugin permission_handler_android at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_android-13.0.1/ +[ +4 ms] Found plugin dchs_motion_sensors at /Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/ +[ +2 ms] Found plugin package_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/ +[ +4 ms] Found plugin network_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/ +[ +6 ms] Found plugin local_auth at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth-3.0.1/ +[ +1 ms] Found plugin local_auth_windows at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_windows-2.0.1/ +[ +2 ms] Found plugin local_auth_darwin at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_darwin-2.0.1/ +[ +1 ms] Found plugin local_auth_android at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_android-2.0.8/ +[ +1 ms] Found plugin flutter_plugin_android_lifecycle at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.34/ +[ +3 ms] Found plugin google_cast at /Volumes/terrain/aves_mio54/plugins/google_cast/ +[ +4 ms] Found plugin flutter_secure_storage at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/ +[ +1 ms] Found plugin flutter_secure_storage_windows at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_windows-3.1.2/ +[ +1 ms] Found plugin flutter_secure_storage_web at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_web-1.2.1/ +[ ] Found plugin flutter_secure_storage_macos at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_macos-3.1.3/ +[ ] Found plugin flutter_secure_storage_linux at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_linux-1.2.3/ +[ +5 ms] Found plugin flutter_displaymode at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_displaymode-0.7.0/ +[ +1 ms] Found plugin floating at /Users/fabio/.pub-cache/hosted/pub.dev/floating-6.0.0/ +[ +6 ms] Found plugin dynamic_color at /Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/ +[ +2 ms] Found plugin device_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/ +[ +8 ms] Found plugin connectivity_plus at /Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/ +[ +5 ms] Found plugin media_kit_video at /Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/ +[ +1 ms] Found plugin wakelock_plus at /Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/ +[ +5 ms] Found plugin media_kit_libs_android_video at /Users/fabio/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8/ +[ +5 ms] Found plugin google_maps_flutter_android at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_android-2.19.8/ +[ +1 ms] Found plugin google_maps_flutter at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter-2.14.2/ +[ +1 ms] Found plugin google_maps_flutter_web at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_web-0.5.14+3/ +[ +2 ms] Found plugin google_maps_flutter_ios at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_ios-2.17.4/ +[ ] Found plugin google_api_availability at /Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability-5.0.1/ +[ +1 ms] Found plugin google_api_availability_android at /Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability_android-1.1.1/ +[ +3 ms] Found plugin aves_screen_state at /Volumes/terrain/aves_mio54/plugins/aves_screen_state/ +[ +1 ms] Found plugin firebase_crashlytics at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_crashlytics-5.2.0/ +[ +2 ms] Found plugin firebase_core at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/ +[ +1 ms] Found plugin firebase_core_web at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_core_web-3.6.0/ +[ +75 ms] Found plugin volume_controller at /Users/fabio/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/ +[ ] Found plugin video_player at /Users/fabio/.pub-cache/hosted/pub.dev/video_player-2.10.1/ +[ ] Found plugin video_player_web at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_web-2.4.0/ +[ +1 ms] Found plugin video_player_avfoundation at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.8.9/ +[ ] Found plugin video_player_android at /Users/fabio/.pub-cache/hosted/pub.dev/video_player_android-2.9.5/ +[ +8 ms] Found plugin path_provider at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider-2.1.5/ +[ ] Found plugin path_provider_windows at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/ +[ +1 ms] Found plugin path_provider_linux at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/ +[ +1 ms] Found plugin path_provider_foundation at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_foundation-2.5.1/ +[ ] Found plugin path_provider_android at /Users/fabio/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/ +[ ] Found plugin jni_flutter at /Users/fabio/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/ +[ ] Found plugin jni at /Users/fabio/.pub-cache/hosted/pub.dev/jni-1.0.0/ +[ +8 ms] Found plugin url_launcher at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher-6.3.2/ +[ +1 ms] Found plugin url_launcher_windows at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.5/ +[ +1 ms] Found plugin url_launcher_web at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_web-2.4.1/ +[ ] Found plugin url_launcher_macos at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.5/ +[ ] Found plugin url_launcher_linux at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.2/ +[ ] Found plugin url_launcher_ios at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.6/ +[ ] Found plugin url_launcher_android at /Users/fabio/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.29/ +[ ] Found plugin streams_channel at /Users/fabio/.pub-cache/git/aves_streams_channel-35a9b0fcc0e97f756756c0010fb223129c2d832c/ +[ ] Found plugin sqflite at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite-2.4.2/ +[ +1 ms] Found plugin sqflite_darwin at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/ +[ ] Found plugin sqflite_android at /Users/fabio/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+2/ +[ +1 ms] Found plugin shared_preferences at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences-2.5.5/ +[ ] Found plugin shared_preferences_windows at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/ +[ ] Found plugin shared_preferences_web at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3/ +[ ] Found plugin shared_preferences_linux at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/ +[ ] Found plugin shared_preferences_foundation at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/ +[ ] Found plugin shared_preferences_android at /Users/fabio/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.18/ +[ ] Found plugin screen_brightness at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness-2.1.7/ +[ ] Found plugin screen_brightness_windows at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_windows-2.1.0/ +[ +1 ms] Found plugin screen_brightness_ohos at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_ohos-2.1.2/ +[ ] Found plugin screen_brightness_macos at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_macos-2.1.1/ +[ ] Found plugin screen_brightness_ios at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_ios-2.1.2/ +[ ] Found plugin screen_brightness_android at /Users/fabio/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/ +[ +1 ms] Found plugin printing at /Users/fabio/.pub-cache/hosted/pub.dev/printing-5.14.3/ +[ +4 ms] Found plugin permission_handler at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler-12.0.1/ +[ ] Found plugin permission_handler_windows at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_windows-0.2.1/ +[ +1 ms] Found plugin permission_handler_html at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_html-0.1.3+5/ +[ ] Found plugin permission_handler_apple at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_apple-9.4.7/ +[ ] Found plugin permission_handler_android at /Users/fabio/.pub-cache/hosted/pub.dev/permission_handler_android-13.0.1/ +[ +2 ms] Found plugin dchs_motion_sensors at /Users/fabio/.pub-cache/hosted/pub.dev/dchs_motion_sensors-2.0.1/ +[ +1 ms] Found plugin package_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/package_info_plus-9.0.1/ +[ +3 ms] Found plugin network_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/network_info_plus-7.0.0/ +[ +5 ms] Found plugin local_auth at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth-3.0.1/ +[ +1 ms] Found plugin local_auth_windows at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_windows-2.0.1/ +[ +1 ms] Found plugin local_auth_darwin at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_darwin-2.0.1/ +[ +1 ms] Found plugin local_auth_android at /Users/fabio/.pub-cache/hosted/pub.dev/local_auth_android-2.0.8/ +[ ] Found plugin flutter_plugin_android_lifecycle at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.34/ +[ +2 ms] Found plugin google_cast at /Volumes/terrain/aves_mio54/plugins/google_cast/ +[ +2 ms] Found plugin flutter_secure_storage at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/ +[ +1 ms] Found plugin flutter_secure_storage_windows at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_windows-3.1.2/ +[ +1 ms] Found plugin flutter_secure_storage_web at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_web-1.2.1/ +[ ] Found plugin flutter_secure_storage_macos at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_macos-3.1.3/ +[ +1 ms] Found plugin flutter_secure_storage_linux at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_secure_storage_linux-1.2.3/ +[ +4 ms] Found plugin flutter_displaymode at /Users/fabio/.pub-cache/hosted/pub.dev/flutter_displaymode-0.7.0/ +[ +1 ms] Found plugin floating at /Users/fabio/.pub-cache/hosted/pub.dev/floating-6.0.0/ +[ +3 ms] Found plugin dynamic_color at /Users/fabio/.pub-cache/hosted/pub.dev/dynamic_color-1.8.1/ +[ +1 ms] Found plugin device_info_plus at /Users/fabio/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0/ +[ +3 ms] Found plugin connectivity_plus at /Users/fabio/.pub-cache/hosted/pub.dev/connectivity_plus-7.1.1/ +[ +4 ms] Found plugin media_kit_video at /Users/fabio/.pub-cache/hosted/pub.dev/media_kit_video-2.0.1/ +[ +1 ms] Found plugin wakelock_plus at /Users/fabio/.pub-cache/hosted/pub.dev/wakelock_plus-1.4.0/ +[ +3 ms] Found plugin media_kit_libs_android_video at /Users/fabio/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8/ +[ +4 ms] Found plugin google_maps_flutter_android at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_android-2.19.8/ +[ ] Found plugin google_maps_flutter at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter-2.14.2/ +[ ] Found plugin google_maps_flutter_web at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_web-0.5.14+3/ +[ +1 ms] Found plugin google_maps_flutter_ios at /Users/fabio/.pub-cache/hosted/pub.dev/google_maps_flutter_ios-2.17.4/ +[ ] Found plugin google_api_availability at /Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability-5.0.1/ +[ +1 ms] Found plugin google_api_availability_android at /Users/fabio/.pub-cache/hosted/pub.dev/google_api_availability_android-1.1.1/ +[ +2 ms] Found plugin aves_screen_state at /Volumes/terrain/aves_mio54/plugins/aves_screen_state/ +[ +1 ms] Found plugin firebase_crashlytics at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_crashlytics-5.2.0/ +[ +1 ms] Found plugin firebase_core at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_core-4.7.0/ +[ ] Found plugin firebase_core_web at /Users/fabio/.pub-cache/hosted/pub.dev/firebase_core_web-3.6.0/ +[ +15 ms] Generating /Volumes/terrain/aves_mio54/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java +[ +14 ms] Skipping generating GeneratedPluginRegistrant.java because it is up-to-date. +[ +181 ms] executing: /usr/bin/plutil -convert xml1 -o - /Applications/Android Studio.app/Contents/Info.plist +[ +11 ms] Exit code 0 from: /usr/bin/plutil -convert xml1 -o - /Applications/Android Studio.app/Contents/Info.plist +[ ] <?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> + <plist version="1.0"> + <dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleDocumentTypes</key> + <array> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>ipr</string> + </array> + <key>CFBundleTypeIconFile</key> + <string>studio.icns</string> + <key>CFBundleTypeName</key> + <string>Android Studio Project File</string> + <key>CFBundleTypeRole</key> + <string>Editor</string> + </dict> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>*</string> + </array> + <key>CFBundleTypeName</key> + <string>All documents</string> + <key>CFBundleTypeOSTypes</key> + <array> + <string>****</string> + </array> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>LSTypeIsPackage</key> + <false/> + </dict> + </array> + <key>CFBundleExecutable</key> + <string>studio</string> + <key>CFBundleGetInfoString</key> + <string>Android Studio 2024.3, build AI-243.26053.27.2432.13536105. Copyright JetBrains s.r.o., (c) 2000-2025</string> + <key>CFBundleIconFile</key> + <string>studio.icns</string> + <key>CFBundleIdentifier</key> + <string>com.google.android.studio</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>Android Studio</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>2024.3</string> + <key>CFBundleURLTypes</key> + <array> + <dict> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>CFBundleURLName</key> + <string>Stacktrace</string> + <key>CFBundleURLSchemes</key> + <array> + <string>idea</string> + </array> + </dict> + </array> + <key>CFBundleVersion</key> + <string>AI-243.26053.27.2432.13536105</string> + <key>LSApplicationCategoryType</key> + <string>public.app-category.developer-tools</string> + <key>LSArchitecturePriority</key> + <array> + <string>x86_64</string> + </array> + <key>LSMinimumSystemVersion</key> + <string>10.13</string> + <key>LSRequiresNativeExecution</key> + <string>YES</string> + <key>NSAppleEventsUsageDescription</key> + <string>An application in Android Studio requests the ability to send Apple events.</string> + <key>NSBluetoothAlwaysUsageDescription</key> + <string>An application in Android Studio requests access to Bluetooth.</string> + <key>NSCameraUsageDescription</key> + <string>An application in Android Studio requests access to the device's camera.</string> + <key>NSDesktopFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Desktop folder.</string> + <key>NSDocumentsFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Documents folder.</string> + <key>NSDownloadsFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Downloads folder.</string> + <key>NSHighResolutionCapable</key> + <true/> + <key>NSLocalNetworkUsageDescription</key> + <string>Android Studio's features, such as SSH and database connectivity, require permissions for accessing the local network and sending broadcast requests.</string> + <key>NSLocationUsageDescription</key> + <string>An application in Android Studio requests access to the user's location information.</string> + <key>NSMicrophoneUsageDescription</key> + <string>An application in Android Studio requests access to the device's microphone.</string> + <key>NSNetworkVolumesUsageDescription</key> + <string>An application in Android Studio requests access to files on a network volume.</string> + <key>NSRemovableVolumesUsageDescription</key> + <string>An application in Android Studio requests access to files on a removable volume.</string> + <key>NSSupportsAutomaticGraphicsSwitching</key> + <true/> + </dict> + </plist> +[ +10 ms] executing: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java -version +[ +88 ms] Exit code 0 from: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java -version +[ ] openjdk version "21.0.6" 2025-01-21 + OpenJDK Runtime Environment (build 21.0.6+-13368085-b895.109) + OpenJDK 64-Bit Server VM (build 21.0.6+-13368085-b895.109, mixed mode) +[ +1 ms] executing: /usr/bin/plutil -convert xml1 -o - /Volumes/MacHD/Applications/Android Studio.app/Contents/Info.plist +[ +10 ms] Exit code 0 from: /usr/bin/plutil -convert xml1 -o - /Volumes/MacHD/Applications/Android Studio.app/Contents/Info.plist +[ ] <?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> + <plist version="1.0"> + <dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleDocumentTypes</key> + <array> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>ipr</string> + </array> + <key>CFBundleTypeIconFile</key> + <string>studio.icns</string> + <key>CFBundleTypeName</key> + <string>Android Studio Project File</string> + <key>CFBundleTypeRole</key> + <string>Editor</string> + </dict> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>*</string> + </array> + <key>CFBundleTypeName</key> + <string>All documents</string> + <key>CFBundleTypeOSTypes</key> + <array> + <string>****</string> + </array> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>LSTypeIsPackage</key> + <false/> + </dict> + </array> + <key>CFBundleExecutable</key> + <string>studio</string> + <key>CFBundleGetInfoString</key> + <string>Android Studio 4.1, build AI-201.8743.12.41.6858069. Copyright JetBrains s.r.o., (c) 2000-2020</string> + <key>CFBundleIconFile</key> + <string>studio.icns</string> + <key>CFBundleIdentifier</key> + <string>com.google.android.studio</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>Android Studio</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>4.1</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleURLTypes</key> + <array> + <dict> + <key>CFBundleTypeRole</key> + <string>Editor</string> + <key>CFBundleURLName</key> + <string>Stacktrace</string> + <key>CFBundleURLSchemes</key> + <array> + <string>idea</string> + </array> + </dict> + </array> + <key>CFBundleVersion</key> + <string>AI-201.8743.12.41.6858069</string> + <key>JVMOptions</key> + <dict> + <key>ClassPath</key> + <string>$APP_PACKAGE/Contents/lib/bootstrap.jar:$APP_PACKAGE/Contents/lib/extensions.jar:$APP_PACKAGE/Contents/lib/util.jar:$APP_PACKAGE/Contents/lib/jdom.jar:$APP_PACKAGE/Contents/lib/log4j.jar:$APP_PACKAGE/Contents/lib/trove4j.jar:$APP_PACKAGE/Contents/lib/jna.jar</string> + <key>JVMVersion</key> + <string>1.8*,1.8+</string> + <key>MainClass</key> + <string>com.intellij.idea.Main</string> + <key>Properties</key> + <dict> + <key>idea.executable</key> + <string>studio</string> + <key>idea.home.path</key> + <string>$APP_PACKAGE/Contents</string> + <key>idea.paths.selector</key> + <string>AndroidStudio4.1</string> + <key>idea.platform.prefix</key> + <string>AndroidStudio</string> + <key>idea.vendor.name</key> + <string>Google</string> + </dict> + </dict> + <key>LSApplicationCategoryType</key> + <string>public.app-category.developer-tools</string> + <key>LSArchitecturePriority</key> + <array> + <string>x86_64</string> + </array> + <key>LSMinimumSystemVersion</key> + <string>10.8</string> + <key>LSRequiresNativeExecution</key> + <string>YES</string> + <key>NSCameraUsageDescription</key> + <string>An application in Android Studio requests access to the device's camera.</string> + <key>NSDesktopFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Desktop folder.</string> + <key>NSDocumentsFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Documents folder.</string> + <key>NSDownloadsFolderUsageDescription</key> + <string>An application in Android Studio requests access to the user's Downloads folder.</string> + <key>NSHighResolutionCapable</key> + <true/> + <key>NSLocationUsageDescription</key> + <string>An application in Android Studio requests access to the user's location information.</string> + <key>NSMicrophoneUsageDescription</key> + <string>An application in Android Studio requests access to the device's microphone.</string> + <key>NSNetworkVolumesUsageDescription</key> + <string>An application in Android Studio requests access to files on a network volume.</string> + <key>NSRemovableVolumesUsageDescription</key> + <string>An application in Android Studio requests access to files on a removable volume.</string> + <key>NSSupportsAutomaticGraphicsSwitching</key> + <true/> + </dict> + </plist> +[ +5 ms] executing: /Volumes/MacHD/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java -version +[ +80 ms] Exit code 0 from: /Volumes/MacHD/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java -version +[ ] openjdk version "1.8.0_242-release" + OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593) + OpenJDK 64-Bit Server VM (build 25.242-b3-6222593, mixed mode) +[ +12 ms] Top-level Gradle build file not found, skipping migration of task "clean". +[ +3 ms] executing: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java --version +[ +90 ms] Exit code 0 from: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java --version +[ ] openjdk 21.0.6 2025-01-21 + OpenJDK Runtime Environment (build 21.0.6+-13368085-b895.109) + OpenJDK 64-Bit Server VM (build 21.0.6+-13368085-b895.109, mixed mode) +[ +2 ms] Version of Java is different than impacted version, no migration attempted. +[ +13 ms] CMake project not found, skipping support Android 15 16k page size migration. +[ +4 ms] Using gradle from /Volumes/terrain/aves_mio54/android/gradlew. +[ +68 ms] LocalFile: '/Volumes/terrain/aves_mio54/android/build.gradle.kts' doesn't provide an AGP version. Checking settings. +[ +7 ms] LocalFile: '/Volumes/terrain/aves_mio54/android/settings.gradle.kts' provides AGP version: 8.13.2 +[ +23 ms] Running Gradle task 'assemblePlayDebug'... +[ +1 ms] executing: [/Volumes/terrain/aves_mio54/android/] /Volumes/terrain/aves_mio54/android/gradlew --full-stacktrace --info -Pverbose=true -Ptarget-platform=android-arm,android-arm64,android-x64 -Ptarget=lib/main_play.dart -Pbase-application-name=android.app.Application -Pdart-defines=RkxVVFRFUl9BUFBfRkxBVk9SPXBsYXk=,RkxVVFRFUl9WRVJTSU9OPTMuMzUuNw==,RkxVVFRFUl9DSEFOTkVMPXN0YWJsZQ==,RkxVVFRFUl9HSVRfVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9mbHV0dGVyL2ZsdXR0ZXIuZ2l0,RkxVVFRFUl9GUkFNRVdPUktfUkVWSVNJT049YWRjOTAxMDYyNQ==,RkxVVFRFUl9FTkdJTkVfUkVWSVNJT049MDM1MzE2NTY1YQ==,RkxVVFRFUl9EQVJUX1ZFUlNJT049My45LjI= -Pdart-obfuscation=false -Ptrack-widget-creation=true -Ptree-shake-icons=false assemblePlayDebug +[ +611 ms] Initialized native services in: /Users/fabio/.gradle/native +[ ] Initialized jansi services in: /Users/fabio/.gradle/native +[ +320 ms] The client will now receive all logging from the daemon (pid: 36361). The daemon log file: /Users/fabio/.gradle/daemon/8.14.4/daemon-36361.out.log +[ ] Starting 5th build in daemon [uptime: 36 mins 43.428 secs, performance: 100%, GC rate: 0.00/s, heap usage: 0% of 8 GiB, non-heap usage: 8% of 4 GiB] +[ ] Using 4 worker leases. +[ ] Now considering [/Volumes/terrain/aves_mio54/android, /Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle] as hierarchies to watch +[ ] Watching the file system is configured to be enabled if available +[ ] File system watching is active +[ ] Starting Build +[ ] Now considering [/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle, /Volumes/terrain/aves_mio54/android] as hierarchies to watch +[ +94 ms] > Configure project :gradle +[ ] Evaluating project ':gradle' using build file '/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/build.gradle.kts'. +[ ] Resolved plugin [id: 'org.gradle.java-gradle-plugin'] +[ ] Resolved plugin [id: 'org.gradle.groovy'] +[ ] Resolved plugin [id: 'org.gradle.kotlin.kotlin-dsl', version: '5.2.0'] +[ ] Resolved plugin [id: 'org.jetbrains.kotlin.jvm', version: '1.9.20'] +[ ] Using Kotlin Gradle Plugin gradle85 variant +[ ] kotlin scripting plugin: created the scripting discovery configuration: kotlinScriptDef +[ ] kotlin scripting plugin: created the scripting discovery configuration: testKotlinScriptDef +[ ] file or directory '/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/src/main/java', not found +[ ] Resolved plugin [id: 'dev.flutter.flutter-plugin-loader', version: '1.0.0'] +[ ] Resolved plugin [id: 'org.gradle.toolchains.foojay-resolver-convention', version: '1.0.0'] +[ ] Resolved plugin [id: 'com.android.application', version: '8.13.2', apply: false] +[ ] Resolved plugin [id: 'org.jetbrains.kotlin.android', version: '2.3.0', apply: false] +[ ] Resolve mutations for :gradle:checkKotlinGradlePluginConfigurationErrors (Thread[#469,Execution worker,5,main]) started. +[ ] :gradle:checkKotlinGradlePluginConfigurationErrors (Thread[#469,Execution worker,5,main]) started. +[ ] > Task :gradle:checkKotlinGradlePluginConfigurationErrors SKIPPED +[ ] Skipping task ':gradle:checkKotlinGradlePluginConfigurationErrors' as task onlyIf 'errorDiagnostics are present' is false. +[ ] Resolve mutations for :gradle:compileKotlin (Thread[#469,Execution worker,5,main]) started. +[ ] :gradle:compileKotlin (Thread[#469,Execution worker,5,main]) started. +[ +104 ms] > Task :gradle:compileKotlin UP-TO-DATE +[ ] Caching disabled for task ':gradle:compileKotlin' because: +[ ] Build cache is disabled +[ ] Skipping task ':gradle:compileKotlin' as it is up-to-date. +[ ] Resolve mutations for :gradle:compileJava (Thread[#469,Execution worker,5,main]) started. +[ ] :gradle:compileJava (Thread[#469,Execution worker,5,main]) started. +[ ] > Task :gradle:compileJava NO-SOURCE +[ ] Skipping task ':gradle:compileJava' as it has no source files and no previous output files. +[ ] Resolve mutations for :gradle:compileGroovy (Thread[#469,Execution worker,5,main]) started. +[ ] :gradle:compileGroovy (Thread[#469,Execution worker,5,main]) started. +[ ] > Task :gradle:compileGroovy NO-SOURCE +[ ] Skipping task ':gradle:compileGroovy' as it has no source files and no previous output files. +[ ] Resolve mutations for :gradle:pluginDescriptors (Thread[#469,Execution worker,5,main]) started. +[ ] :gradle:pluginDescriptors (Thread[#469,Execution worker,5,main]) started. +[ ] > Task :gradle:pluginDescriptors UP-TO-DATE +[ ] Caching disabled for task ':gradle:pluginDescriptors' because: +[ ] Build cache is disabled +[ ] Not worth caching +[ ] Skipping task ':gradle:pluginDescriptors' as it is up-to-date. +[ ] Resolve mutations for :gradle:processResources (Thread[#469,Execution worker,5,main]) started. +[ ] :gradle:processResources (Thread[#469,Execution worker,5,main]) started. +[ ] > Task :gradle:processResources UP-TO-DATE +[ ] Caching disabled for task ':gradle:processResources' because: +[ ] Build cache is disabled +[ ] Not worth caching +[ ] Skipping task ':gradle:processResources' as it is up-to-date. +[ ] Resolve mutations for :gradle:classes (Thread[#469,Execution worker,5,main]) started. +[ ] :gradle:classes (Thread[#469,Execution worker,5,main]) started. +[ ] > Task :gradle:classes UP-TO-DATE +[ ] Skipping task ':gradle:classes' as it has no actions. +[ ] Resolve mutations for :gradle:jar (Thread[#469,Execution worker,5,main]) started. +[ ] :gradle:jar (Thread[#469,Execution worker,5,main]) started. +[ ] > Task :gradle:jar UP-TO-DATE +[ ] Caching disabled for task ':gradle:jar' because: +[ ] Build cache is disabled +[ ] Not worth caching +[ ] Skipping task ':gradle:jar' as it is up-to-date. +[ +194 ms] FAILURE: Build failed with an exception. +[ +1 ms] * Where: +[ ] Settings file '/Volumes/terrain/aves_mio54/android/settings.gradle.kts' line: 26 +[ ] * What went wrong: +[ ] A problem occurred evaluating script. +[ ] > A problem occurred evaluating script. +[ ] > You are applying Flutter's app_plugin_loader Gradle plugin imperatively using the apply script method, which is not possible anymore. Migrate to applying Gradle plugins with the declarative plugins block: https://flutter.dev/to/flutter-gradle-plugin-apply +[ ] * Try: +[ ] > Run with --debug option to get more log output. +[ ] > Run with --scan to get full insights. +[ ] > Get more help at https://help.gradle.org. +[ ] * Exception is: +[ ] org.gradle.api.GradleScriptException: A problem occurred evaluating script. +[ ] at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:93) +[ ] at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.lambda$apply$1(DefaultScriptPluginFactory.java:141) +[ ] at org.gradle.configuration.DefaultScriptTarget.addConfiguration(DefaultScriptTarget.java:74) +[ ] at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:144) +[ ] at org.gradle.configuration.BuildOperationScriptPlugin$1.run(BuildOperationScriptPlugin.java:68) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:30) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:27) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:48) +[ ] at org.gradle.configuration.BuildOperationScriptPlugin.lambda$apply$0(BuildOperationScriptPlugin.java:65) +[ ] at org.gradle.internal.code.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:44) +[ ] at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:65) +[ ] at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.applyScript(DefaultObjectConfigurationAction.java:151) +[ ] at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.access$000(DefaultObjectConfigurationAction.java:44) +[ ] at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction$1.run(DefaultObjectConfigurationAction.java:77) +[ ] at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.execute(DefaultObjectConfigurationAction.java:185) +[ ] at org.gradle.kotlin.dsl.support.KotlinScriptHost.applyObjectConfigurationAction$kotlin_dsl(KotlinScriptHost.kt:137) +[ ] at org.gradle.kotlin.dsl.support.PluginAwareScript.apply(PluginAwareScript.kt:38) +[ ] at org.gradle.kotlin.dsl.support.CompiledKotlinSettingsScript.apply(CompiledKotlinSettingsScript.kt) +[ ] at org.gradle.kotlin.dsl.PluginAwareExtensionsKt.apply(PluginAwareExtensions.kt:33) +[ ] at org.gradle.kotlin.dsl.PluginAwareExtensionsKt.apply$default(PluginAwareExtensions.kt:31) +[ ] at Settings_gradle.<init>(settings.gradle.kts:26) +[ ] at Program.execute(Unknown Source) +[ ] at org.gradle.kotlin.dsl.execution.Interpreter$ProgramHost.eval(Interpreter.kt:516) +[ ] at org.gradle.kotlin.dsl.execution.Interpreter$ProgramHost.evaluateSecondStageOf(Interpreter.kt:428) +[ ] at Program.execute(Unknown Source) +[ ] at org.gradle.kotlin.dsl.execution.Interpreter$ProgramHost.eval(Interpreter.kt:516) +[ ] at org.gradle.kotlin.dsl.execution.Interpreter.eval(Interpreter.kt:194) +[ ] at org.gradle.kotlin.dsl.provider.StandardKotlinScriptEvaluator.evaluate(KotlinScriptEvaluator.kt:133) +[ ] at org.gradle.kotlin.dsl.provider.KotlinScriptPluginFactory$create$1.invoke(KotlinScriptPluginFactory.kt:61) +[ ] at org.gradle.kotlin.dsl.provider.KotlinScriptPluginFactory$create$1.invoke(KotlinScriptPluginFactory.kt:52) +[ ] at org.gradle.kotlin.dsl.provider.KotlinScriptPlugin.apply(KotlinScriptPlugin.kt:35) +[ ] at org.gradle.configuration.BuildOperationScriptPlugin$1.run(BuildOperationScriptPlugin.java:68) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:30) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:27) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:48) +[ ] at org.gradle.configuration.BuildOperationScriptPlugin.lambda$apply$0(BuildOperationScriptPlugin.java:65) +[ ] at org.gradle.internal.code.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:44) +[ ] at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:65) +[ ] at org.gradle.initialization.ScriptEvaluatingSettingsProcessor.applySettingsScript(ScriptEvaluatingSettingsProcessor.java:75) +[ +1 ms] at org.gradle.initialization.ScriptEvaluatingSettingsProcessor.process(ScriptEvaluatingSettingsProcessor.java:68) +[ ] at org.gradle.initialization.SettingsEvaluatedCallbackFiringSettingsProcessor.process(SettingsEvaluatedCallbackFiringSettingsProcessor.java:34) +[ ] at org.gradle.initialization.RootBuildCacheControllerSettingsProcessor.process(RootBuildCacheControllerSettingsProcessor.java:47) +[ ] at org.gradle.initialization.BuildOperationSettingsProcessor$2.call(BuildOperationSettingsProcessor.java:49) +[ ] at org.gradle.initialization.BuildOperationSettingsProcessor$2.call(BuildOperationSettingsProcessor.java:46) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54) +[ ] at org.gradle.initialization.BuildOperationSettingsProcessor.process(BuildOperationSettingsProcessor.java:46) +[ ] at org.gradle.initialization.DefaultSettingsLoader.findSettingsAndLoadIfAppropriate(DefaultSettingsLoader.java:183) +[ ] at org.gradle.initialization.DefaultSettingsLoader.findAndLoadSettings(DefaultSettingsLoader.java:86) +[ ] at org.gradle.initialization.SettingsAttachingSettingsLoader.findAndLoadSettings(SettingsAttachingSettingsLoader.java:33) +[ ] at org.gradle.internal.composite.CommandLineIncludedBuildSettingsLoader.findAndLoadSettings(CommandLineIncludedBuildSettingsLoader.java:35) +[ ] at org.gradle.internal.composite.ChildBuildRegisteringSettingsLoader.findAndLoadSettings(ChildBuildRegisteringSettingsLoader.java:44) +[ ] at org.gradle.internal.composite.CompositeBuildSettingsLoader.findAndLoadSettings(CompositeBuildSettingsLoader.java:35) +[ ] at org.gradle.initialization.InitScriptHandlingSettingsLoader.findAndLoadSettings(InitScriptHandlingSettingsLoader.java:33) +[ ] at org.gradle.api.internal.initialization.CacheConfigurationsHandlingSettingsLoader.findAndLoadSettings(CacheConfigurationsHandlingSettingsLoader.java:36) +[ ] at org.gradle.initialization.GradlePropertiesHandlingSettingsLoader.findAndLoadSettings(GradlePropertiesHandlingSettingsLoader.java:38) +[ ] at org.gradle.initialization.DefaultSettingsPreparer.prepareSettings(DefaultSettingsPreparer.java:31) +[ ] at org.gradle.initialization.BuildOperationFiringSettingsPreparer$LoadBuild.doLoadBuild(BuildOperationFiringSettingsPreparer.java:71) +[ ] at org.gradle.initialization.BuildOperationFiringSettingsPreparer$LoadBuild.run(BuildOperationFiringSettingsPreparer.java:66) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:30) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:27) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:48) +[ ] at org.gradle.initialization.BuildOperationFiringSettingsPreparer.prepareSettings(BuildOperationFiringSettingsPreparer.java:54) +[ ] at org.gradle.initialization.VintageBuildModelController.lambda$prepareSettings$1(VintageBuildModelController.java:80) +[ ] at org.gradle.internal.model.StateTransitionController.lambda$doTransition$14(StateTransitionController.java:255) +[ ] at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266) +[ ] at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:254) +[ ] at org.gradle.internal.model.StateTransitionController.lambda$transitionIfNotPreviously$11(StateTransitionController.java:213) +[ ] at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:36) +[ ] at org.gradle.internal.model.StateTransitionController.transitionIfNotPreviously(StateTransitionController.java:209) +[ ] at org.gradle.initialization.VintageBuildModelController.prepareSettings(VintageBuildModelController.java:80) +[ ] at org.gradle.initialization.VintageBuildModelController.prepareToScheduleTasks(VintageBuildModelController.java:70) +[ ] at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$prepareToScheduleTasks$6(DefaultBuildLifecycleController.java:175) +[ ] at org.gradle.internal.model.StateTransitionController.lambda$doTransition$14(StateTransitionController.java:255) +[ ] at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266) +[ ] at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:254) +[ ] at org.gradle.internal.model.StateTransitionController.lambda$maybeTransition$9(StateTransitionController.java:190) +[ ] at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:36) +[ ] at org.gradle.internal.model.StateTransitionController.maybeTransition(StateTransitionController.java:186) +[ ] at org.gradle.internal.build.DefaultBuildLifecycleController.prepareToScheduleTasks(DefaultBuildLifecycleController.java:173) +[ ] at org.gradle.internal.buildtree.DefaultBuildTreeWorkPreparer.scheduleRequestedTasks(DefaultBuildTreeWorkPreparer.java:36) +[ ] at org.gradle.internal.cc.impl.VintageBuildTreeWorkController$scheduleAndRunRequestedTasks$1.apply(VintageBuildTreeWorkController.kt:36) +[ ] at org.gradle.internal.cc.impl.VintageBuildTreeWorkController$scheduleAndRunRequestedTasks$1.apply(VintageBuildTreeWorkController.kt:35) +[ ] at org.gradle.composite.internal.DefaultIncludedBuildTaskGraph.withNewWorkGraph(DefaultIncludedBuildTaskGraph.java:112) +[ ] at org.gradle.internal.cc.impl.VintageBuildTreeWorkController.scheduleAndRunRequestedTasks(VintageBuildTreeWorkController.kt:35) +[ ] at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$scheduleAndRunTasks$1(DefaultBuildTreeLifecycleController.java:77) +[ ] at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$runBuild$4(DefaultBuildTreeLifecycleController.java:120) +[ ] at org.gradle.internal.model.StateTransitionController.lambda$transition$6(StateTransitionController.java:169) +[ ] at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266) +[ ] at org.gradle.internal.model.StateTransitionController.lambda$transition$7(StateTransitionController.java:169) +[ ] at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:46) +[ ] at org.gradle.internal.model.StateTransitionController.transition(StateTransitionController.java:169) +[ ] at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.runBuild(DefaultBuildTreeLifecycleController.java:117) +[ ] at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:77) +[ ] at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:72) +[ ] at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:31) +[ ] at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35) +[ ] at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:49) +[ ] at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:71) +[ ] at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:135) +[ ] at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41) +[ ] at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:54) +[ ] at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:130) +[ ] at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:54) +[ ] at org.gradle.internal.buildtree.InitDeprecationLoggingActionExecutor.execute(InitDeprecationLoggingActionExecutor.java:62) +[ ] at org.gradle.internal.buildtree.InitProblems.execute(InitProblems.java:36) +[ ] at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40) +[ ] at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:71) +[ ] at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:60) +[ ] at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:71) +[ ] at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$2.call(RunAsBuildOperationBuildActionExecutor.java:67) +[ ] at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$2.call(RunAsBuildOperationBuildActionExecutor.java:63) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54) +[ ] at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:63) +[ ] at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0(RunAsWorkerThreadBuildActionExecutor.java:36) +[ ] at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263) +[ +1 ms] at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127) +[ ] at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute(RunAsWorkerThreadBuildActionExecutor.java:36) +[ ] at org.gradle.tooling.internal.provider.continuous.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:110) +[ ] at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64) +[ ] at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:46) +[ ] at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor$ActionImpl.apply(BuildSessionLifecycleBuildActionExecutor.java:92) +[ ] at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor$ActionImpl.apply(BuildSessionLifecycleBuildActionExecutor.java:80) +[ ] at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:73) +[ ] at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor.execute(BuildSessionLifecycleBuildActionExecutor.java:62) +[ ] at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor.execute(BuildSessionLifecycleBuildActionExecutor.java:41) +[ ] at org.gradle.internal.buildprocess.execution.StartParamsValidatingActionExecutor.execute(StartParamsValidatingActionExecutor.java:64) +[ ] at org.gradle.internal.buildprocess.execution.StartParamsValidatingActionExecutor.execute(StartParamsValidatingActionExecutor.java:32) +[ ] at org.gradle.internal.buildprocess.execution.SessionFailureReportingActionExecutor.execute(SessionFailureReportingActionExecutor.java:51) +[ ] at org.gradle.internal.buildprocess.execution.SessionFailureReportingActionExecutor.execute(SessionFailureReportingActionExecutor.java:39) +[ ] at org.gradle.internal.buildprocess.execution.SetupLoggingActionExecutor.execute(SetupLoggingActionExecutor.java:47) +[ ] at org.gradle.internal.buildprocess.execution.SetupLoggingActionExecutor.execute(SetupLoggingActionExecutor.java:31) +[ ] at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:70) +[ ] at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37) +[ ] at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) +[ ] at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39) +[ ] at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) +[ ] at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29) +[ ] at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) +[ ] at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35) +[ ] at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) +[ ] at org.gradle.launcher.daemon.server.exec.ForwardClientInput.lambda$execute$0(ForwardClientInput.java:40) +[ ] at org.gradle.internal.daemon.clientinput.ClientInputForwarder.forwardInput(ClientInputForwarder.java:80) +[ ] at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:37) +[ ] at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) +[ ] at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:64) +[ ] at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) +[ ] at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63) +[ ] at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37) +[ ] at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) +[ ] at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84) +[ ] at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37) +[ ] at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) +[ ] at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52) +[ ] at org.gradle.launcher.daemon.server.DaemonStateCoordinator.lambda$runCommand$0(DaemonStateCoordinator.java:321) +[ ] at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) +[ ] at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) +[ ] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) +[ ] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) +[ ] at java.base/java.lang.Thread.run(Unknown Source) +[ ] Caused by: org.gradle.api.GradleScriptException: A problem occurred evaluating script. +[ ] at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:93) +[ ] at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.lambda$apply$1(DefaultScriptPluginFactory.java:141) +[ ] at org.gradle.configuration.DefaultScriptTarget.addConfiguration(DefaultScriptTarget.java:74) +[ ] at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:144) +[ ] at org.gradle.configuration.BuildOperationScriptPlugin$1.run(BuildOperationScriptPlugin.java:68) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:30) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:27) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) +[ ] at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:48) +[ ] at org.gradle.configuration.BuildOperationScriptPlugin.lambda$apply$0(BuildOperationScriptPlugin.java:65) +[ ] at org.gradle.internal.code.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:44) +[ ] at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:65) +[ ] at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.applyScript(DefaultObjectConfigurationAction.java:151) +[ ] at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.access$000(DefaultObjectConfigurationAction.java:44) +[ ] at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction$1.run(DefaultObjectConfigurationAction.java:77) +[ ] at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.execute(DefaultObjectConfigurationAction.java:185) +[ ] at org.gradle.groovy.scripts.DefaultScript.apply(DefaultScript.java:134) +[ ] at org.gradle.api.Script$apply$0.callCurrent(Unknown Source) +[ ] at flutter_settings_azsvy1ytuwjm01097vc7z448c.run(/Volumes/terrain/aves_mio54/android/flutter_settings.gradle:6) +[ ] at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:91) +[ ] ... 182 more +[ ] Caused by: org.gradle.api.GradleException: You are applying Flutter's app_plugin_loader Gradle plugin imperatively using the apply script method, which is not possible anymore. Migrate to applying Gradle plugins with the declarative plugins block: https://flutter.dev/to/flutter-gradle-plugin-apply +[ ] at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(Unknown Source) +[ ] at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Unknown Source) +[ ] at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source) +[ ] at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:72) +[ ] at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:105) +[ ] at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:277) +[ ] at app_plugin_loader_1xc0vsotg1vmxjzl0uyvst1j5.run(/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle/app_plugin_loader.gradle:9) +[ ] at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:91) +[ ] ... 204 more +[ ] BUILD FAILED in 1s +[ ] 4 actionable tasks: 4 up-to-date +[ ] Watched directory hierarchies: [/Users/fabio/fvm/versions/3.35.7/packages/flutter_tools/gradle, /Volumes/terrain/aves_mio54/android] +[ +1 ms] Running Gradle task 'assemblePlayDebug'... (completed in 1.369ms) +[ +85 ms] "flutter apk" took 4.844ms. +[ +10 ms] executing: sw_vers -productName +[ +17 ms] Exit code 0 from: sw_vers -productName +[ ] macOS +[ ] executing: sw_vers -productVersion +[ +17 ms] Exit code 0 from: sw_vers -productVersion +[ ] 13.7.7 +[ ] executing: sw_vers -buildVersion +[ +18 ms] Exit code 0 from: sw_vers -buildVersion +[ ] 22H722 +[ ] executing: uname -m +[ +7 ms] Exit code 0 from: uname -m +[ ] x86_64 +[ +89 ms] Gradle task assemblePlayDebug failed with exit code 1 +[ ] + #0 throwToolExit (package:flutter_tools/src/base/common.dart:34:3) + #1 AndroidGradleBuilder.buildGradleApp (package:flutter_tools/src/android/gradle.dart:600:7) + <asynchronous suspension> + #2 AndroidGradleBuilder.buildApk (package:flutter_tools/src/android/gradle.dart:239:5) + <asynchronous suspension> + #3 BuildApkCommand.runCommand (package:flutter_tools/src/commands/build_apk.dart:131:5) + <asynchronous suspension> + #4 FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:1581:27) + <asynchronous suspension> + #5 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:154:19) + <asynchronous suspension> + #6 CommandRunner.runCommand (package:args/command_runner.dart:212:13) + <asynchronous suspension> + #7 FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:503:9) + <asynchronous suspension> + #8 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:154:19) + <asynchronous suspension> + #9 FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:438:5) + <asynchronous suspension> + #10 run.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:98:11) + <asynchronous suspension> + #11 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:154:19) + <asynchronous suspension> + #12 main (package:flutter_tools/executable.dart:101:3) + <asynchronous suspension> + + +[ ] Running 1 shutdown hook +[ +1 ms] Shutdown hooks complete +[ +102 ms] exiting with code 1 diff --git a/kotlin_errors.txt b/kotlin_errors.txt new file mode 100644 index 0000000..8a18132 --- /dev/null +++ b/kotlin_errors.txt @@ -0,0 +1,18 @@ +[ +70 ms] LocalFile: '/Volumes/terrain/aves_mio54/android/build.gradle.kts' doesn't provide an AGP version. Checking settings. +[ +10 ms] LocalFile: '/Volumes/terrain/aves_mio54/android/settings.gradle.kts' provides AGP version: 8.13.2 +[ +201 ms] The client will now receive all logging from the daemon (pid: 27645). The daemon log file: /Users/fabio/.gradle/daemon/8.14.4/daemon-27645.out.log +[ ] Starting 3rd build in daemon [uptime: 24 mins 38.561 secs, performance: 100%, GC rate: 0.00/s, heap usage: 0% of 8 GiB, non-heap usage: 8% of 4 GiB] +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:75:29 Unresolved reference 'app'. +[ +1 ms] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:76:46 Unresolved reference 'CastButtonFactory'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:78:46 Unresolved reference 'CastContext'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:81:29 Unresolved reference 'CastActivityProvider'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:82:29 Unresolved reference 'FlutterCastFrameworkPlugin'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:98:29 Unresolved reference 'MediaRouteButton'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:108:9 Unresolved reference 'CastContext'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:115:18 Unresolved reference 'MediaRouteButton'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:115:41 Cannot infer type for type parameter 'T'. Specify it explicitly. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:115:47 Cannot infer type for type parameter 'T'. Specify it explicitly. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:116:9 Unresolved reference 'CastButtonFactory'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:116:68 Cannot infer type for type parameter 'T'. Specify it explicitly. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:147:27 Unresolved reference 'FlutterCastFrameworkPlugin'. +[ ] e: file:///Volumes/terrain/aves_mio54/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt:150:48 Unresolved reference 'CastActivityProvider'. diff --git a/l10n.yaml b/l10n.yaml new file mode 100644 index 0000000..4250f8a --- /dev/null +++ b/l10n.yaml @@ -0,0 +1,10 @@ +# cf guides: +# http://flutter.dev/go/i18n-user-guide +# https://docs.flutter.dev/development/accessibility-and-localization/internationalization + +arb-dir: lib/l10n +output-dir: lib/l10ngen +template-arb-file: app_en.arb +output-localization-file: app_localizations.dart +preferred-supported-locales: + - en diff --git a/lib/app_flavor.dart b/lib/app_flavor.dart new file mode 100644 index 0000000..461f979 --- /dev/null +++ b/lib/app_flavor.dart @@ -0,0 +1,23 @@ +enum AppFlavor { play, izzy, libre } + +extension ExtraAppFlavor on AppFlavor { + bool get canEnableErrorReporting { + switch (this) { + case AppFlavor.play: + return true; + case AppFlavor.izzy: + case AppFlavor.libre: + return false; + } + } + + bool get hasMapStyleDefault { + switch (this) { + case AppFlavor.play: + return true; + case AppFlavor.izzy: + case AppFlavor.libre: + return false; + } + } +} diff --git a/lib/app_mode.dart b/lib/app_mode.dart new file mode 100644 index 0000000..61ee931 --- /dev/null +++ b/lib/app_mode.dart @@ -0,0 +1,52 @@ +enum AppMode { + initialization, + main, + pickCollectionFiltersExternal, + pickSingleMediaExternal, + pickMultipleMediaExternal, + pickFilteredMediaInternal, + pickUnfilteredMediaInternal, + pickFilterInternal, + previewMap, + screenSaver, + setWallpaper, + slideshow, + view, + edit, +} + +extension ExtraAppMode on AppMode { + bool get canNavigate => { + AppMode.main, + AppMode.pickCollectionFiltersExternal, + AppMode.pickSingleMediaExternal, + AppMode.pickMultipleMediaExternal, + }.contains(this); + + bool get canEditEntry => { + AppMode.main, + AppMode.view, + }.contains(this); + + bool get canSelectMedia => { + AppMode.main, + AppMode.pickMultipleMediaExternal, + }.contains(this); + + bool get canSelectFilter => { + AppMode.main, + AppMode.pickCollectionFiltersExternal, + }.contains(this); + + bool get canCreateFilter => { + AppMode.main, + AppMode.pickFilterInternal, + }.contains(this); + + bool get isPickingMedia => { + AppMode.pickSingleMediaExternal, + AppMode.pickMultipleMediaExternal, + AppMode.pickFilteredMediaInternal, + AppMode.pickUnfilteredMediaInternal, + }.contains(this); +} diff --git a/lib/convert/convert.dart b/lib/convert/convert.dart new file mode 100644 index 0000000..43780fc --- /dev/null +++ b/lib/convert/convert.dart @@ -0,0 +1,3 @@ +export 'metadata/date_field_source.dart'; +export 'metadata/fields.dart'; +export 'metadata/metadata_type.dart'; diff --git a/lib/convert/metadata/date_field_source.dart b/lib/convert/metadata/date_field_source.dart new file mode 100644 index 0000000..1bc1ee1 --- /dev/null +++ b/lib/convert/metadata/date_field_source.dart @@ -0,0 +1,18 @@ +import 'package:aves_model/aves_model.dart'; + +extension ExtraDateFieldSourceConvert on DateFieldSource { + MetadataField? toMetadataField() { + switch (this) { + case DateFieldSource.fileModifiedDate: + return null; + case DateFieldSource.exifDate: + return MetadataField.exifDate; + case DateFieldSource.exifDateOriginal: + return MetadataField.exifDateOriginal; + case DateFieldSource.exifDateDigitized: + return MetadataField.exifDateDigitized; + case DateFieldSource.exifGpsDate: + return MetadataField.exifGpsDatestamp; + } + } +} diff --git a/lib/convert/metadata/fields.dart b/lib/convert/metadata/fields.dart new file mode 100644 index 0000000..659f6bc --- /dev/null +++ b/lib/convert/metadata/fields.dart @@ -0,0 +1,167 @@ +import 'package:aves_model/aves_model.dart'; + +extension ExtraMetadataSyntheticFieldConvert on MetadataSyntheticField { + String? get toPlatform => name; +} + +extension ExtraMetadataFieldConvert on MetadataField { + MetadataType get type { + switch (this) { + case MetadataField.exifDate: + case MetadataField.exifDateOriginal: + case MetadataField.exifDateDigitized: + case MetadataField.exifGpsAltitude: + case MetadataField.exifGpsAltitudeRef: + case MetadataField.exifGpsAreaInformation: + case MetadataField.exifGpsDatestamp: + case MetadataField.exifGpsDestBearing: + case MetadataField.exifGpsDestBearingRef: + case MetadataField.exifGpsDestDistance: + case MetadataField.exifGpsDestDistanceRef: + case MetadataField.exifGpsDestLatitude: + case MetadataField.exifGpsDestLatitudeRef: + case MetadataField.exifGpsDestLongitude: + case MetadataField.exifGpsDestLongitudeRef: + case MetadataField.exifGpsDifferential: + case MetadataField.exifGpsDOP: + case MetadataField.exifGpsHPositioningError: + case MetadataField.exifGpsImgDirection: + case MetadataField.exifGpsImgDirectionRef: + case MetadataField.exifGpsLatitude: + case MetadataField.exifGpsLatitudeRef: + case MetadataField.exifGpsLongitude: + case MetadataField.exifGpsLongitudeRef: + case MetadataField.exifGpsMapDatum: + case MetadataField.exifGpsMeasureMode: + case MetadataField.exifGpsProcessingMethod: + case MetadataField.exifGpsSatellites: + case MetadataField.exifGpsSpeed: + case MetadataField.exifGpsSpeedRef: + case MetadataField.exifGpsStatus: + case MetadataField.exifGpsTimestamp: + case MetadataField.exifGpsTrack: + case MetadataField.exifGpsTrackRef: + case MetadataField.exifGpsVersionId: + case MetadataField.exifImageDescription: + case MetadataField.exifMake: + case MetadataField.exifModel: + case MetadataField.exifUserComment: + return MetadataType.exif; + case MetadataField.mp4GpsCoordinates: + case MetadataField.mp4RotationDegrees: + case MetadataField.mp4Xmp: + return MetadataType.mp4; + case MetadataField.xmpXmpCreateDate: + return MetadataType.xmp; + case MetadataField.hashMd5: + case MetadataField.hashSha1: + case MetadataField.hashSha256: + return MetadataType.file; + } + } + + String? get toPlatform { + switch (type) { + case MetadataType.exif: + return _toExifInterfaceTag(); + case MetadataType.file: + return name; + default: + switch (this) { + case MetadataField.mp4GpsCoordinates: + return 'gpsCoordinates'; + case MetadataField.mp4RotationDegrees: + return 'rotationDegrees'; + case MetadataField.mp4Xmp: + return 'xmp'; + default: + return null; + } + } + } + + String? _toExifInterfaceTag() { + switch (this) { + case MetadataField.exifDate: + return 'DateTime'; + case MetadataField.exifDateOriginal: + return 'DateTimeOriginal'; + case MetadataField.exifDateDigitized: + return 'DateTimeDigitized'; + case MetadataField.exifGpsAltitude: + return 'GPSAltitude'; + case MetadataField.exifGpsAltitudeRef: + return 'GPSAltitudeRef'; + case MetadataField.exifGpsAreaInformation: + return 'GPSAreaInformation'; + case MetadataField.exifGpsDatestamp: + return 'GPSDateStamp'; + case MetadataField.exifGpsDestBearing: + return 'GPSDestBearing'; + case MetadataField.exifGpsDestBearingRef: + return 'GPSDestBearingRef'; + case MetadataField.exifGpsDestDistance: + return 'GPSDestDistance'; + case MetadataField.exifGpsDestDistanceRef: + return 'GPSDestDistanceRef'; + case MetadataField.exifGpsDestLatitude: + return 'GPSDestLatitude'; + case MetadataField.exifGpsDestLatitudeRef: + return 'GPSDestLatitudeRef'; + case MetadataField.exifGpsDestLongitude: + return 'GPSDestLongitude'; + case MetadataField.exifGpsDestLongitudeRef: + return 'GPSDestLongitudeRef'; + case MetadataField.exifGpsDifferential: + return 'GPSDifferential'; + case MetadataField.exifGpsDOP: + return 'GPSDOP'; + case MetadataField.exifGpsHPositioningError: + return 'GPSHPositioningError'; + case MetadataField.exifGpsImgDirection: + return 'GPSImgDirection'; + case MetadataField.exifGpsImgDirectionRef: + return 'GPSImgDirectionRef'; + case MetadataField.exifGpsLatitude: + return 'GPSLatitude'; + case MetadataField.exifGpsLatitudeRef: + return 'GPSLatitudeRef'; + case MetadataField.exifGpsLongitude: + return 'GPSLongitude'; + case MetadataField.exifGpsLongitudeRef: + return 'GPSLongitudeRef'; + case MetadataField.exifGpsMapDatum: + return 'GPSMapDatum'; + case MetadataField.exifGpsMeasureMode: + return 'GPSMeasureMode'; + case MetadataField.exifGpsProcessingMethod: + return 'GPSProcessingMethod'; + case MetadataField.exifGpsSatellites: + return 'GPSSatellites'; + case MetadataField.exifGpsSpeed: + return 'GPSSpeed'; + case MetadataField.exifGpsSpeedRef: + return 'GPSSpeedRef'; + case MetadataField.exifGpsStatus: + return 'GPSStatus'; + case MetadataField.exifGpsTimestamp: + return 'GPSTimeStamp'; + case MetadataField.exifGpsTrack: + return 'GPSTrack'; + case MetadataField.exifGpsTrackRef: + return 'GPSTrackRef'; + case MetadataField.exifGpsVersionId: + return 'GPSVersionID'; + case MetadataField.exifImageDescription: + return 'ImageDescription'; + case MetadataField.exifMake: + return 'Make'; + case MetadataField.exifModel: + return 'Model'; + case MetadataField.exifUserComment: + return 'UserComment'; + default: + return null; + } + } +} diff --git a/lib/convert/metadata/metadata_type.dart b/lib/convert/metadata/metadata_type.dart new file mode 100644 index 0000000..5c7f408 --- /dev/null +++ b/lib/convert/metadata/metadata_type.dart @@ -0,0 +1,30 @@ +import 'package:aves_model/aves_model.dart'; + +extension ExtraMetadataTypeConvert on MetadataType { + String get toPlatform { + switch (this) { + case MetadataType.comment: + return 'comment'; + case MetadataType.exif: + return 'exif'; + case MetadataType.iccProfile: + return 'icc_profile'; + case MetadataType.iptc: + return 'iptc'; + case MetadataType.jfif: + return 'jfif'; + case MetadataType.jpegAdobe: + return 'jpeg_adobe'; + case MetadataType.jpegDucky: + return 'jpeg_ducky'; + case MetadataType.mp4: + return 'mp4'; + case MetadataType.photoshopIrb: + return 'photoshop_irb'; + case MetadataType.xmp: + return 'xmp'; + case MetadataType.file: + return 'file'; + } + } +} diff --git a/lib/geo/countries.dart b/lib/geo/countries.dart new file mode 100644 index 0000000..929755a --- /dev/null +++ b/lib/geo/countries.dart @@ -0,0 +1,97 @@ +import 'dart:async'; +import 'dart:isolate'; + +import 'package:aves/geo/topojson.dart'; +import 'package:collection/collection.dart'; +import 'package:country_code/country_code.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:latlong2/latlong.dart'; + +final CountryTopology countryTopology = CountryTopology._private(); + +class CountryTopology { + static const topoJsonAsset = 'assets/countries-50m.json'; + + CountryTopology._private(); + + Topology? _topology; + + Future<Topology?> getTopology() => _topology != null ? SynchronousFuture(_topology) : rootBundle.loadString(topoJsonAsset).then(TopoJson().parse); + + // returns the country containing given coordinates + Future<CountryCode?> countryCode(LatLng position) async { + return _countryOfNumeric(await numericCode(position)); + } + + // returns the ISO 3166-1 numeric code of the country containing given coordinates + Future<int?> numericCode(LatLng position) async { + final topology = await getTopology(); + if (topology == null) return null; + + final countries = (topology.objects['countries'] as GeometryCollection).geometries; + return _getNumeric(topology, countries, position); + } + + // returns a map of the given positions by country + Future<Map<CountryCode, Set<LatLng>>> countryCodeMap(Set<LatLng> positions) async { + final numericMap = await numericCodeMap(positions); + if (numericMap == null) return {}; + + return Map.fromEntries( + numericMap.entries.map((kv) { + final code = _countryOfNumeric(kv.key); + return code != null ? MapEntry(code, kv.value) : null; + }).nonNulls, + ); + } + + // returns a map of the given positions by the ISO 3166-1 numeric code of the country containing them + Future<Map<int, Set<LatLng>>?> numericCodeMap(Set<LatLng> positions) async { + final topology = await getTopology(); + if (topology == null) return null; + + try { + return Isolate.run<Map<int, Set<LatLng>>>(() { + final countries = (topology.objects['countries'] as GeometryCollection).geometries; + final byCode = <int, Set<LatLng>>{}; + for (final position in positions) { + final code = _getNumeric(topology, countries, position); + if (code != null) { + byCode[code] = (byCode[code] ?? {})..add(position); + } + } + return byCode; + }); + } catch (error, stack) { + debugPrint('failed to get country codes with error=$error\n$stack'); + return null; + } + } + + static int? _getNumeric(Topology topology, List<Geometry> mruCountries, LatLng position) { + final point = [position.longitude, position.latitude]; + final hit = mruCountries.firstWhereOrNull((country) => country.containsPoint(topology, point)); + if (hit == null) return null; + + // promote hit countries, assuming given positions are likely to come from the same countries + if (mruCountries.first != hit) { + mruCountries.remove(hit); + mruCountries.insert(0, hit); + } + + final idString = (hit.id as String?); + final code = idString == null ? null : int.tryParse(idString); + return code; + } + + static CountryCode? _countryOfNumeric(int? numeric) { + if (numeric == null) return null; + try { + return CountryCode.ofNumeric(numeric); + } catch (error) { + debugPrint('failed to find country for numeric=$numeric with error=$error'); + } + return null; + } +} diff --git a/lib/geo/states.dart b/lib/geo/states.dart new file mode 100644 index 0000000..ea74179 --- /dev/null +++ b/lib/geo/states.dart @@ -0,0 +1,179 @@ +import 'package:aves/ref/unicode.dart'; +import 'package:country_code/country_code.dart'; + +class GeoStates { + static final aus = CountryCode.AU.alpha2; + static final gbr = CountryCode.GB.alpha2; + static final ind = CountryCode.IN.alpha2; + static final mex = CountryCode.MX.alpha2; + static final usa = CountryCode.US.alpha2; + + static final Set<String> stateCountryCodes = { + aus, + gbr, + ind, + mex, + usa, + }; + + static final stateCodesByCountryCode = { + aus: EmojiStateCodes.aus, + gbr: EmojiStateCodes.gbr, + ind: EmojiStateCodes.ind, + mex: EmojiStateCodes.mex, + usa: EmojiStateCodes.usa, + }; + + static const stateCodeByName = { + ..._australiaEnglish, + ..._indiaEnglish, + ..._mexicoSpanish, + ..._unitedKingdomEnglish, + ..._unitedStatesEnglish, + }; + + static const _mexicoSpanish = { + 'Aguascalientes': EmojiStateCodes.mxAguascalientes, + 'Baja California': EmojiStateCodes.mxBajaCalifornia, + 'Baja California Sur': EmojiStateCodes.mxBajaCaliforniaSur, + 'Campeche': EmojiStateCodes.mxCampeche, + 'Chiapas': EmojiStateCodes.mxChiapas, + 'Chihuahua': EmojiStateCodes.mxChihuahua, + 'Ciudad de México': EmojiStateCodes.mxCiudadDeMexico, + 'Coahuila': EmojiStateCodes.mxCoahuila, + 'Colima': EmojiStateCodes.mxColima, + 'Durango': EmojiStateCodes.mxDurango, + 'Guanajuato': EmojiStateCodes.mxGuanajuato, + 'Guerrero': EmojiStateCodes.mxGuerrero, + 'Hidalgo': EmojiStateCodes.mxHidalgo, + 'Jalisco': EmojiStateCodes.mxJalisco, + 'Estado de México': EmojiStateCodes.mxMexicoState, + 'Michoacán': EmojiStateCodes.mxMichoacan, + 'Morelos': EmojiStateCodes.mxMorelos, + 'Nayarit': EmojiStateCodes.mxNayarit, + 'Nuevo León': EmojiStateCodes.mxNuevoLeon, + 'Oaxaca': EmojiStateCodes.mxOaxaca, + 'Puebla': EmojiStateCodes.mxPuebla, + 'Querétaro': EmojiStateCodes.mxQueretaro, + 'Quintana Roo': EmojiStateCodes.mxQuintanaRoo, + 'San Luis Potosí': EmojiStateCodes.mxSanLuisPotosi, + 'Sinaloa': EmojiStateCodes.mxSinaloa, + 'Sonora': EmojiStateCodes.mxSonora, + 'Tabasco': EmojiStateCodes.mxTabasco, + 'Tamaulipas': EmojiStateCodes.mxTamaulipas, + 'Tlaxcala': EmojiStateCodes.mxTlaxcala, + 'Veracruz': EmojiStateCodes.mxVeracruz, + 'Yucatán': EmojiStateCodes.mxYucatan, + 'Zacatecas': EmojiStateCodes.mxZacatecas, + }; + + static const _australiaEnglish = { + 'Australian Capital Territory': EmojiStateCodes.auAustralianCapitalTerritory, + 'New South Wales': EmojiStateCodes.auNewSouthWales, + 'Northern Territory': EmojiStateCodes.auNorthernTerritory, + 'Queensland': EmojiStateCodes.auQueensland, + 'South Australia': EmojiStateCodes.auSouthAustralia, + 'Tasmania': EmojiStateCodes.auTasmania, + 'Victoria': EmojiStateCodes.auVictoria, + 'Western Australia': EmojiStateCodes.auWesternAustralia, + }; + + static const _indiaEnglish = { + 'Andaman and Nicobar Islands': EmojiStateCodes.inAndamanAndNicobarIslands, + 'Andhra Pradesh': EmojiStateCodes.inAndhraPradesh, + 'Arunachal Pradesh': EmojiStateCodes.inArunachalPradesh, + 'Assam': EmojiStateCodes.inAssam, + 'Bihar': EmojiStateCodes.inBihar, + 'Chandigarh': EmojiStateCodes.inChandigarh, + 'Chhattisgarh': EmojiStateCodes.inChhattisgarh, + 'Daman and Diu': EmojiStateCodes.inDamanAndDiu, + 'Delhi': EmojiStateCodes.inDelhi, + 'Dadra and Nagar Haveli': EmojiStateCodes.inDadraAndNagarHaveli, + 'Goa': EmojiStateCodes.inGoa, + 'Gujarat': EmojiStateCodes.inGujarat, + 'Himachal Pradesh': EmojiStateCodes.inHimachalPradesh, + 'Haryana': EmojiStateCodes.inHaryana, + 'Jharkhand': EmojiStateCodes.inJharkhand, + 'Jammu and Kashmir': EmojiStateCodes.inJammuAndKashmir, + 'Karnataka': EmojiStateCodes.inKarnataka, + 'Kerala': EmojiStateCodes.inKerala, + 'Lakshadweep': EmojiStateCodes.inLakshadweep, + 'Maharashtra': EmojiStateCodes.inMaharashtra, + 'Meghalaya': EmojiStateCodes.inMeghalaya, + 'Manipur': EmojiStateCodes.inManipur, + 'Madhya Pradesh': EmojiStateCodes.inMadhyaPradesh, + 'Mizoram': EmojiStateCodes.inMizoram, + 'Nagaland': EmojiStateCodes.inNagaland, + 'Odisha': EmojiStateCodes.inOdisha, + 'Punjab': EmojiStateCodes.inPunjab, + 'Puducherry': EmojiStateCodes.inPuducherry, + 'Rajasthan': EmojiStateCodes.inRajasthan, + 'Sikkim': EmojiStateCodes.inSikkim, + 'Telangana': EmojiStateCodes.inTelangana, + 'Tamil Nadu': EmojiStateCodes.inTamilNadu, + 'Tripura': EmojiStateCodes.inTripura, + 'Uttar Pradesh': EmojiStateCodes.inUttarPradesh, + 'Uttarakhand': EmojiStateCodes.inUttarakhand, + 'West Bengal': EmojiStateCodes.inWestBengal, + }; + + static const _unitedKingdomEnglish = { + 'England': EmojiStateCodes.gbEngland, + 'Northern Ireland': EmojiStateCodes.gbNorthernIreland, + 'Scotland': EmojiStateCodes.gbScotland, + 'Wales': EmojiStateCodes.gbWales, + }; + + static const _unitedStatesEnglish = { + 'Alabama': EmojiStateCodes.usAlabama, + 'Alaska': EmojiStateCodes.usAlaska, + 'Arizona': EmojiStateCodes.usArizona, + 'Arkansas': EmojiStateCodes.usArkansas, + 'California': EmojiStateCodes.usCalifornia, + 'Colorado': EmojiStateCodes.usColorado, + 'Connecticut': EmojiStateCodes.usConnecticut, + 'Delaware': EmojiStateCodes.usDelaware, + 'Florida': EmojiStateCodes.usFlorida, + 'Georgia': EmojiStateCodes.usGeorgia, + 'Hawaii': EmojiStateCodes.usHawaii, + 'Idaho': EmojiStateCodes.usIdaho, + 'Illinois': EmojiStateCodes.usIllinois, + 'Indiana': EmojiStateCodes.usIndiana, + 'Iowa': EmojiStateCodes.usIowa, + 'Kansas': EmojiStateCodes.usKansas, + 'Kentucky': EmojiStateCodes.usKentucky, + 'Louisiana': EmojiStateCodes.usLouisiana, + 'Maine': EmojiStateCodes.usMaine, + 'Maryland': EmojiStateCodes.usMaryland, + 'Massachusetts': EmojiStateCodes.usMassachusetts, + 'Michigan': EmojiStateCodes.usMichigan, + 'Minnesota': EmojiStateCodes.usMinnesota, + 'Mississippi': EmojiStateCodes.usMississippi, + 'Missouri': EmojiStateCodes.usMissouri, + 'Montana': EmojiStateCodes.usMontana, + 'Nebraska': EmojiStateCodes.usNebraska, + 'Nevada': EmojiStateCodes.usNevada, + 'New Hampshire': EmojiStateCodes.usNewHampshire, + 'New Jersey': EmojiStateCodes.usNewJersey, + 'New Mexico': EmojiStateCodes.usNewMexico, + 'New York': EmojiStateCodes.usNewYork, + 'North Carolina': EmojiStateCodes.usNorthCarolina, + 'North Dakota': EmojiStateCodes.usNorthDakota, + 'Ohio': EmojiStateCodes.usOhio, + 'Oklahoma': EmojiStateCodes.usOklahoma, + 'Oregon': EmojiStateCodes.usOregon, + 'Pennsylvania': EmojiStateCodes.usPennsylvania, + 'Rhode Island': EmojiStateCodes.usRhodeIsland, + 'South Carolina': EmojiStateCodes.usSouthCarolina, + 'South Dakota': EmojiStateCodes.usSouthDakota, + 'Tennessee': EmojiStateCodes.usTennessee, + 'Utah': EmojiStateCodes.usUtah, + 'Vermont': EmojiStateCodes.usVermont, + 'Virginia': EmojiStateCodes.usVirginia, + 'Washington': EmojiStateCodes.usWashington, + 'Washington DC': EmojiStateCodes.usWashingtonDC, + 'West Virginia': EmojiStateCodes.usWestVirginia, + 'Wisconsin': EmojiStateCodes.usWisconsin, + 'Wyoming': EmojiStateCodes.usWyoming, + }; +} diff --git a/lib/geo/topojson.dart b/lib/geo/topojson.dart new file mode 100644 index 0000000..ec36395 --- /dev/null +++ b/lib/geo/topojson.dart @@ -0,0 +1,230 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:isolate'; + +import 'package:flutter/foundation.dart'; + +// cf https://github.com/topojson/topojson-specification +class TopoJson { + Future<Topology?> parse(String jsonData) async { + try { + return Isolate.run<Topology>(() { + final data = jsonDecode(jsonData) as Map<String, dynamic>; + return Topology.parse(data); + }); + } catch (error, stack) { + debugPrint('failed to parse TopoJSON with error=$error\n$stack'); + return null; + } + } +} + +enum TopoJsonObjectType { topology, point, multipoint, linestring, multilinestring, polygon, multipolygon, geometrycollection } + +TopoJsonObjectType? _parseTopoJsonObjectType(String? data) { + switch (data) { + case 'Topology': + return TopoJsonObjectType.topology; + case 'Point': + return TopoJsonObjectType.point; + case 'MultiPoint': + return TopoJsonObjectType.multipoint; + case 'LineString': + return TopoJsonObjectType.linestring; + case 'MultiLineString': + return TopoJsonObjectType.multilinestring; + case 'Polygon': + return TopoJsonObjectType.polygon; + case 'MultiPolygon': + return TopoJsonObjectType.multipolygon; + case 'GeometryCollection': + return TopoJsonObjectType.geometrycollection; + } + return null; +} + +class TopologyJsonObject { + final List<num>? bbox; + + TopologyJsonObject.parse(Map<String, dynamic> data) : bbox = data.containsKey('bbox') ? (data['bbox'] as List).cast<num>().toList() : null; +} + +class Topology extends TopologyJsonObject { + final Map<String, Geometry> objects; + final List<List<List<num>>> arcs; + final Transform? transform; + + Topology.parse(super.data) + : objects = Map.fromEntries( + (data['objects'] as Map).cast<String, dynamic>().entries.map((kv) { + final name = kv.key; + final geometry = Geometry.build(kv.value); + return geometry != null ? MapEntry(name, geometry) : null; + }).nonNulls, + ), + arcs = (data['arcs'] as List).cast<List>().map((arc) => arc.cast<List>().map((position) => position.cast<num>()).toList()).toList(), + transform = data.containsKey('transform') ? Transform.parse((data['transform'] as Map).cast<String, dynamic>()) : null, + super.parse(); + + List<List<num>> _arcAt(int index) { + var arc = arcs[index < 0 ? ~index : index]; + + if (transform != null) { + var x = 0, y = 0; + arc = arc.map((quantized) { + final absolute = List.of(quantized); + absolute[0] = (x += quantized[0] as int) * transform!.scale[0] + transform!.translate[0]; + absolute[1] = (y += quantized[1] as int) * transform!.scale[1] + transform!.translate[1]; + return absolute; + }).toList(); + } + + return index < 0 ? arc.reversed.toList() : arc; + } + + List<List<num>> _toLine(List<List<List<num>>> arcs) { + return arcs.fold(<List<num>>[], (prev, arc) => [...prev, ...prev.isEmpty ? arc : arc.skip(1)]); + } + + List<List<num>> _decodeRingArcs(List<int> ringArcs) { + return _toLine(ringArcs.map(_arcAt).toList()); + } + + List<List<List<num>>> _decodePolygonArcs(List<List<int>> polyArcs) { + return polyArcs.map(_decodeRingArcs).toList(); + } + + List<List<List<List<num>>>> _decodeMultiPolygonArcs(List<List<List<int>>> multiPolyArcs) { + return multiPolyArcs.map(_decodePolygonArcs).toList(); + } + + // cf https://en.wikipedia.org/wiki/Even%E2%80%93odd_rule + bool _pointInRing(List<num> point, List<List<num>> poly) { + final x = point[0]; + final y = point[1]; + final length = poly.length; + var j = length - 1; + var c = false; + for (var i = 0; i < length; i++) { + if (((poly[i][1] > y) != (poly[j][1] > y)) && (x < poly[i][0] + (poly[j][0] - poly[i][0]) * (y - poly[i][1]) / (poly[j][1] - poly[i][1]))) { + c = !c; + } + j = i; + } + return c; + } + + bool _pointInRings(List<num> point, List<List<List<num>>> rings) { + return rings.any((ring) => _pointInRing(point, ring)); + } +} + +class Transform { + final List<num> scale; + final List<num> translate; + + Transform.parse(Map<String, dynamic> data) : scale = (data['scale'] as List).cast<num>(), translate = (data['translate'] as List).cast<num>(); +} + +abstract class Geometry extends TopologyJsonObject { + final dynamic id; + final Map<String, dynamic>? properties; + + Geometry.parse(super.data) : id = data.containsKey('id') ? data['id'] : null, properties = data.containsKey('properties') ? data['properties'] as Map<String, dynamic>? : null, super.parse(); + + static Geometry? build(Map<String, dynamic> data) { + final type = _parseTopoJsonObjectType(data['type'] as String?); + switch (type) { + case TopoJsonObjectType.topology: + case null: + return null; + case TopoJsonObjectType.point: + return Point.parse(data); + case TopoJsonObjectType.multipoint: + return MultiPoint.parse(data); + case TopoJsonObjectType.linestring: + return LineString.parse(data); + case TopoJsonObjectType.multilinestring: + return MultiLineString.parse(data); + case TopoJsonObjectType.polygon: + return Polygon.parse(data); + case TopoJsonObjectType.multipolygon: + return MultiPolygon.parse(data); + case TopoJsonObjectType.geometrycollection: + return GeometryCollection.parse(data); + } + } + + bool containsPoint(Topology topology, List<num> point) => false; +} + +class Point extends Geometry { + final List<num> coordinates; + + Point.parse(super.data) : coordinates = (data['coordinates'] as List).cast<num>(), super.parse(); +} + +class MultiPoint extends Geometry { + final List<List<num>> coordinates; + + MultiPoint.parse(super.data) : coordinates = (data['coordinates'] as List).cast<List>().map((position) => position.cast<num>()).toList(), super.parse(); +} + +class LineString extends Geometry { + final List<int> arcs; + + LineString.parse(super.data) : arcs = (data['arcs'] as List).cast<int>(), super.parse(); +} + +class MultiLineString extends Geometry { + final List<List<int>> arcs; + + MultiLineString.parse(super.data) : arcs = (data['arcs'] as List).cast<List>().map((arc) => arc.cast<int>()).toList(), super.parse(); +} + +class Polygon extends Geometry { + final List<List<int>> arcs; + + Polygon.parse(super.data) : arcs = (data['arcs'] as List).cast<List>().map((arc) => arc.cast<int>()).toList(), super.parse(); + + List<List<List<num>>>? _rings; + + List<List<List<num>>> rings(Topology topology) { + _rings ??= topology._decodePolygonArcs(arcs); + return _rings!; + } + + @override + bool containsPoint(Topology topology, List<num> point) { + return topology._pointInRings(point, rings(topology)); + } +} + +class MultiPolygon extends Geometry { + final List<List<List<int>>> arcs; + + MultiPolygon.parse(super.data) : arcs = (data['arcs'] as List).cast<List>().map((polygon) => polygon.cast<List>().map((arc) => arc.cast<int>()).toList()).toList(), super.parse(); + + List<List<List<List<num>>>>? _polygons; + + List<List<List<List<num>>>> polygons(Topology topology) { + _polygons ??= topology._decodeMultiPolygonArcs(arcs); + return _polygons!; + } + + @override + bool containsPoint(Topology topology, List<num> point) { + return polygons(topology).any((polygon) => topology._pointInRings(point, polygon)); + } +} + +class GeometryCollection extends Geometry { + final List<Geometry> geometries; + + GeometryCollection.parse(super.data) : geometries = (data['geometries'] as List).cast<Map<String, dynamic>>().map(Geometry.build).nonNulls.toList(), super.parse(); + + @override + bool containsPoint(Topology topology, List<num> point) { + return geometries.any((geometry) => geometry.containsPoint(topology, point)); + } +} diff --git a/lib/geo/uri.dart b/lib/geo/uri.dart new file mode 100644 index 0000000..3241d0a --- /dev/null +++ b/lib/geo/uri.dart @@ -0,0 +1,37 @@ +import 'package:aves/utils/math_utils.dart'; +import 'package:latlong2/latlong.dart'; + +// e.g. `geo:44.4361283,26.1027248?z=4.0(Bucharest)` +// cf https://en.wikipedia.org/wiki/Geo_URI_scheme +// cf https://developer.android.com/guide/components/intents-common#ViewMap +(LatLng, double?)? parseGeoUri(String? uri) { + if (uri != null) { + final geoUri = Uri.tryParse(uri); + if (geoUri != null) { + final coordinates = geoUri.path.split(','); + if (coordinates.length == 2) { + final lat = double.tryParse(coordinates[0]); + final lon = double.tryParse(coordinates[1]); + if (lat != null && lon != null) { + double? zoom; + final zoomString = geoUri.queryParameters['z']; + if (zoomString != null) { + zoom = double.tryParse(zoomString); + } + return (LatLng(lat, lon), zoom); + } + } + } + } + return null; +} + +String toGeoUri(LatLng latLng, {double? zoom}) { + final latitude = roundToPrecision(latLng.latitude, decimals: 6); + final longitude = roundToPrecision(latLng.longitude, decimals: 6); + var uri = 'geo:$latitude,$longitude?q=$latitude,$longitude'; + if (zoom != null) { + uri += '&z=$zoom'; + } + return uri; +} diff --git a/lib/image_providers/app_icon_image_provider.dart b/lib/image_providers/app_icon_image_provider.dart new file mode 100644 index 0000000..9992be6 --- /dev/null +++ b/lib/image_providers/app_icon_image_provider.dart @@ -0,0 +1,70 @@ +import 'dart:ui' as ui; + +import 'package:aves/services/common/services.dart'; +import 'package:aves_report/aves_report.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +class AppIconImage extends ImageProvider<AppIconImageKey> { + const AppIconImage({ + required this.packageName, + required this.size, + this.scale = 1.0, + }); + + final String packageName; + final double size; + final double scale; + + @override + Future<AppIconImageKey> obtainKey(ImageConfiguration configuration) { + return SynchronousFuture<AppIconImageKey>( + AppIconImageKey( + packageName: packageName, + size: size, + scale: scale, + ), + ); + } + + @override + ImageStreamCompleter loadImage(AppIconImageKey key, ImageDecoderCallback decode) { + return MultiFrameImageStreamCompleter( + codec: _loadAsync(key, decode), + scale: key.scale, + informationCollector: () sync* { + yield ErrorDescription('packageName=$packageName, size=$size'); + }, + ); + } + + Future<ui.Codec> _loadAsync(AppIconImageKey key, ImageDecoderCallback decode) async { + try { + final descriptor = await appService.getAppIcon(key.packageName, key.size); + if (descriptor == null) { + throw UnreportedStateError('$packageName app icon decoding failed'); + } + return descriptor.instantiateCodec(); + } catch (error) { + debugPrint('$runtimeType _loadAsync failed with packageName=$packageName, error=$error'); + throw UnreportedStateError('$packageName app icon decoding failed'); + } + } +} + +@immutable +class AppIconImageKey extends Equatable { + final String packageName; + final double size; + final double scale; + + @override + List<Object?> get props => [packageName, size, scale]; + + const AppIconImageKey({ + required this.packageName, + required this.size, + this.scale = 1.0, + }); +} diff --git a/lib/image_providers/descriptor_provider.dart b/lib/image_providers/descriptor_provider.dart new file mode 100644 index 0000000..75f6d93 --- /dev/null +++ b/lib/image_providers/descriptor_provider.dart @@ -0,0 +1,45 @@ +import 'dart:ui' as ui; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +@immutable +class DescriptorImageProvider extends ImageProvider<DescriptorImageProvider> { + const DescriptorImageProvider(this.descriptor, {this.scale = 1.0}); + + final ui.ImageDescriptor descriptor; + final double scale; + + @override + Future<DescriptorImageProvider> obtainKey(ImageConfiguration configuration) { + return SynchronousFuture<DescriptorImageProvider>(this); + } + + @override + ImageStreamCompleter loadImage(DescriptorImageProvider key, ImageDecoderCallback decode) { + return MultiFrameImageStreamCompleter( + codec: _loadAsync(key, decode: decode), + scale: key.scale, + debugLabel: 'DescriptorImageProvider(${describeIdentity(key.descriptor)})', + ); + } + + Future<ui.Codec> _loadAsync(DescriptorImageProvider key, {required ImageDecoderCallback decode}) async { + assert(key == this); + return descriptor.instantiateCodec(); + } + + @override + bool operator ==(Object other) { + if (other.runtimeType != runtimeType) { + return false; + } + return other is DescriptorImageProvider && other.descriptor == descriptor && other.scale == scale; + } + + @override + int get hashCode => Object.hash(descriptor.hashCode, scale); + + @override + String toString() => '${objectRuntimeType(this, 'DescriptorImageProvider')}(${describeIdentity(descriptor)}, scale: ${scale.toStringAsFixed(1)})'; +} diff --git a/lib/image_providers/full_image_provider.dart b/lib/image_providers/full_image_provider.dart new file mode 100644 index 0000000..812fdc0 --- /dev/null +++ b/lib/image_providers/full_image_provider.dart @@ -0,0 +1,83 @@ +import 'dart:async'; +import 'dart:ui' as ui; + +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/media/media_fetch_service.dart'; +import 'package:aves_report/aves_report.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +@immutable +class FullImage extends ImageProvider<FullImage> with EquatableMixin { + final String uri, mimeType; + final int? pageId, rotationDegrees, sizeBytes; + final bool isFlipped, isAnimated; + final double scale; + + @override + List<Object?> get props => [uri, pageId, rotationDegrees, isFlipped, isAnimated, scale]; + + const FullImage({ + required this.uri, + required this.mimeType, + required this.pageId, + required this.rotationDegrees, + required this.isFlipped, + required this.isAnimated, + this.sizeBytes, + this.scale = 1.0, + }); + + @override + Future<FullImage> obtainKey(ImageConfiguration configuration) { + return SynchronousFuture<FullImage>(this); + } + + @override + ImageStreamCompleter loadImage(FullImage key, ImageDecoderCallback decode) { + final chunkEvents = StreamController<ImageChunkEvent>(); + + return MultiFrameImageStreamCompleter( + codec: _loadAsync(key, decode, chunkEvents), + scale: key.scale, + chunkEvents: chunkEvents.stream, + informationCollector: () sync* { + yield ErrorDescription('uri=$uri, pageId=$pageId, mimeType=$mimeType'); + }, + ); + } + + Future<ui.Codec> _loadAsync(FullImage key, ImageDecoderCallback decode, StreamController<ImageChunkEvent> chunkEvents) async { + assert(key == this); + + final request = ImageRequest( + uri, + mimeType, + rotationDegrees: rotationDegrees, + isFlipped: isFlipped, + isAnimated: isAnimated, + pageId: pageId, + sizeBytes: sizeBytes, + onBytesReceived: (cumulative, total) { + chunkEvents.add( + ImageChunkEvent( + cumulativeBytesLoaded: cumulative, + expectedTotalBytes: total, + ), + ); + }, + ); + + try { + // get original media bytes from platform, and rely on a codec instantiated by `ImageProvider` + return await mediaFetchService.getFullImage(decoded: false, request: request, decode: decode); + } catch (error) { + // loading may fail if the provided MIME type is incorrect (e.g. the Media Store may report a JPEG as a TIFF) + debugPrint('$runtimeType _loadAsync failed with mimeType=$mimeType, uri=$uri, error=$error'); + throw UnreportedStateError('$mimeType decoding failed (page $pageId)'); + } finally { + unawaited(chunkEvents.close()); + } + } +} diff --git a/lib/image_providers/region_provider.dart b/lib/image_providers/region_provider.dart new file mode 100644 index 0000000..2166fe1 --- /dev/null +++ b/lib/image_providers/region_provider.dart @@ -0,0 +1,84 @@ +import 'dart:async'; +import 'dart:math'; +import 'dart:ui' as ui; + +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves_report/aves_report.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +class RegionProvider extends ImageProvider<RegionProviderKey> { + final RegionProviderKey key; + + RegionProvider(this.key); + + @override + Future<RegionProviderKey> obtainKey(ImageConfiguration configuration) { + return SynchronousFuture<RegionProviderKey>(key); + } + + @override + ImageStreamCompleter loadImage(RegionProviderKey key, ImageDecoderCallback decode) { + return MultiFrameImageStreamCompleter( + codec: _loadAsync(key, decode), + scale: 1.0, + informationCollector: () sync* { + yield ErrorDescription('uri=${key.uri}, pageId=${key.pageId}, mimeType=${key.mimeType}, regionRect=${key.regionRect}'); + }, + ); + } + + bool _shouldFetchRawBytes(RegionProviderKey key) => key.mimeType != MimeTypes.svg; + + Future<ui.Codec> _loadAsync(RegionProviderKey key, ImageDecoderCallback decode) async { + try { + return await mediaFetchService.getRegion( + decoded: _shouldFetchRawBytes(key), + request: key, + decode: decode, + taskKey: key, + ); + } catch (error) { + // loading may fail if the provided MIME type is incorrect (e.g. the Media Store may report a JPEG as a TIFF) + debugPrint('$runtimeType _loadAsync failed for key=$key, error=$error'); + throw UnreportedStateError('region decoding failed for key=$key, error=$error'); + } + } + + @override + void resolveStreamForKey(ImageConfiguration configuration, ImageStream stream, RegionProviderKey key, ImageErrorListener handleError) { + mediaFetchService.resumeLoading(key); + super.resolveStreamForKey(configuration, stream, key, handleError); + } + + void pause() => mediaFetchService.cancelRegion(key); +} + +@immutable +class RegionProviderKey extends Equatable { + // do not store the entry as it is, because the key should be constant + // but the entry attributes may change over time + final String uri, mimeType; + final int? pageId, sizeBytes; + final int rotationDegrees, sampleSize; + final bool isFlipped; + final Rectangle<int> regionRect; + final Size imageSize; + + @override + List<Object?> get props => [uri, mimeType, pageId, sizeBytes, rotationDegrees, isFlipped, sampleSize, regionRect, imageSize]; + + const RegionProviderKey({ + required this.uri, + required this.mimeType, + required this.pageId, + required this.sizeBytes, + required this.rotationDegrees, + required this.isFlipped, + required this.sampleSize, + required this.regionRect, + required this.imageSize, + }); +} diff --git a/lib/image_providers/thumbnail_provider.dart b/lib/image_providers/thumbnail_provider.dart new file mode 100644 index 0000000..51a9eea --- /dev/null +++ b/lib/image_providers/thumbnail_provider.dart @@ -0,0 +1,84 @@ +import 'dart:ui' as ui; + +import 'package:aves/services/common/services.dart'; +import 'package:aves_report/aves_report.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +class ThumbnailProvider extends ImageProvider<ThumbnailProviderKey> { + final ThumbnailProviderKey key; + + ThumbnailProvider(this.key); + + @override + Future<ThumbnailProviderKey> obtainKey(ImageConfiguration configuration) { + // configuration can be empty (e.g. when obtaining key for eviction) + // so we do not compute the target width/height here + // and pass it to the key, to use it later for image loading + return SynchronousFuture<ThumbnailProviderKey>(key); + } + + @override + ImageStreamCompleter loadImage(ThumbnailProviderKey key, ImageDecoderCallback decode) { + return MultiFrameImageStreamCompleter( + codec: _loadAsync(key, decode), + scale: 1.0, + debugLabel: kReleaseMode ? null : [key.uri, key.extent].join('-'), + informationCollector: () sync* { + yield ErrorDescription('uri=${key.uri}, pageId=${key.pageId}, mimeType=${key.mimeType}, extent=${key.extent}'); + }, + ); + } + + Future<ui.Codec> _loadAsync(ThumbnailProviderKey key, ImageDecoderCallback decode) async { + try { + return await mediaFetchService.getThumbnail( + decoded: false, + request: key, + decode: decode, + taskKey: key, + ); + } catch (error) { + // loading may fail if the provided MIME type is incorrect (e.g. the Media Store may report a JPEG as a TIFF) + debugPrint('$runtimeType _loadAsync failed for key=$key, error=$error'); + throw UnreportedStateError('thumbnail decoding failed for key=$key, error=$error'); + } + } + + @override + void resolveStreamForKey(ImageConfiguration configuration, ImageStream stream, ThumbnailProviderKey key, ImageErrorListener handleError) { + mediaFetchService.resumeLoading(key); + super.resolveStreamForKey(configuration, stream, key, handleError); + } + + void pause() => mediaFetchService.cancelThumbnail(key); +} + +@immutable +class ThumbnailProviderKey extends Equatable { + // do not store the entry as it is, because the key should be constant + // but the entry attributes may change over time + final String uri, mimeType; + final int? pageId; + final int rotationDegrees; + final bool isFlipped; + final int dateModifiedMillis; + final double extent; + + @override + List<Object?> get props => [uri, pageId, dateModifiedMillis, extent]; + + const ThumbnailProviderKey({ + required this.uri, + required this.mimeType, + required this.pageId, + required this.rotationDegrees, + required this.isFlipped, + required this.dateModifiedMillis, + this.extent = 0, + }); + + @override + String toString() => '$runtimeType#${shortHash(this)}{uri=$uri, mimeType=$mimeType, pageId=$pageId, rotationDegrees=$rotationDegrees, isFlipped=$isFlipped, dateModifiedMillis=$dateModifiedMillis, extent=$extent}'; +} diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb new file mode 100644 index 0000000..a2e4be8 --- /dev/null +++ b/lib/l10n/app_ar.arb @@ -0,0 +1,952 @@ +{ + "tagPlaceholderPlace": "المكان", + "tagPlaceholderCountry": "البلد", + "sourceViewerPageTitle": "المصدر", + "panoramaDisableSensorControl": "تعطيل التحكم في المستشعر", + "panoramaEnableSensorControl": "تمكين التحكم في المستشعر", + "saveTooltip": "حفظ", + "continueButtonLabel": "إستمرار", + "resetTooltip": "إعادة", + "doNotAskAgain": "عدم السؤال مرة أخرى", + "welcomeTermsToggle": "أوافق على الشروط", + "doubleBackExitMessage": "اضغط على «رجوع» مرة أخرى للخروج.", + "hideButtonLabel": "إخفاء", + "showTooltip": "إظهار", + "clearTooltip": "تنظيف", + "changeTooltip": "تغيير", + "actionRemove": "إزالة", + "appName": "Aves", + "welcomeOptional": "اختياري", + "deleteButtonLabel": "حذف", + "nextTooltip": "التالي", + "cancelTooltip": "إلغاء", + "previousTooltip": "السابق", + "welcomeMessage": "مرحبا بكم في Aves", + "applyButtonLabel": "تأكيد", + "nextButtonLabel": "التالي", + "showButtonLabel": "إظهار", + "tagEditorSectionRecent": "الأخيرة", + "tagEditorSectionPlaceholders": "العناصر النائبة", + "hideTooltip": "إخفاء", + "tagEditorPageAddTagTooltip": "إضافة علامة", + "albumScreenRecordings": "تسجيل الشاشة", + "chipActionSetCover": "تعيين كغلاف", + "saveCopyButtonLabel": "حفظ نسخة", + "chipActionFilterOut": "تصفية أو استبعاد", + "chipActionHide": "إخفاء", + "sourceStateCataloguing": "تصنيف", + "chipActionDelete": "حَذف", + "sourceStateLoading": "تحميل", + "sourceStateLocatingCountries": "تحديد مواقع الدول", + "chipActionFilterIn": "تصفية أو اختيار", + "chipActionPin": "تثبيت في الأعلى", + "chipActionRename": "إعادة تسمية", + "chipActionGoToPlacePage": "عرض في الأماكن", + "chipActionGoToAlbumPage": "عرض في الألبومات", + "chipActionLock": "قَفل", + "pickTooltip": "اختيار", + "chipActionGoToCountryPage": "عرض في الدول", + "applyTooltip": "تأكيد", + "chipActionUnpin": "إلغاء التثبيت في الأعلى", + "chipActionGoToTagPage": "عرض في الوسوم", + "sourceStateLocatingPlaces": "تحديد المواقع", + "aboutCreditsWorldAtlas2": "بموجب ترخيص ISC.", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{هل تريد نقل هذا العنصر إلى سلة المحذوفات؟} other{حرك هذه {count}العناصر إلى سلة المحذوفات؟}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsNavigationDrawerAddAlbum": "إضافة ألبوم", + "settingsPrivacySectionTitle": "الخصوصية", + "settingsEnableBinSubtitle": "الاحتفاظ بالعناصر المحذوفة لمدة 30 يومًا", + "viewerInfoPageTitle": "معلومات", + "mapAttributionStamen": "البلاط بواسطة [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "widgetOpenPageViewer": "افتح العارض", + "setCoverDialogLatest": "أحدث عنصر", + "settingsThumbnailShowRating": "عرض التقييم", + "editEntryRatingDialogTitle": "تقييم", + "entryInfoActionExportMetadata": "تصدير البيانات الوصفية", + "aboutDataUsageMisc": "منوعات", + "editorActionTransform": "تحويل", + "collectionExportFailureFeedback": "{count, plural, =1{فشل تصدير صفحة واحدة} other{فشل التصدير {count} pages}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "vaultDialogLockModeWhenScreenOff": "القفل عند إيقاف تشغيل الشاشة", + "videoResumeDialogMessage": "هل ترغب في استئناف التشغيل في {time}؟", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "albumVideoCaptures": "الفيديوهات الملتقطة", + "wallpaperUseScrollEffect": "استخدم تأثير التمرير على الشاشة الرئيسية", + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "editEntryDateDialogSetCustom": "تحديد تاريخ مخصص", + "mapStyleGoogleTerrain": "خرائط جوجل (التضاريس)", + "statsTopTagsSectionTitle": "أهم العلامات", + "settingsSubtitleThemeTextAlignmentDialogTitle": "مُحاذاة النص", + "settingsSearchEmpty": "لا يوجد إعداد مطابق", + "removeEntryMetadataDialogMore": "أكثر", + "viewerActionLock": "قفل المعاينة", + "pinDialogConfirm": "تأكيد الرمز السري", + "settingsViewerSlideshowPageTitle": "عرض الشرائح", + "tooManyItemsErrorDialogMessage": "حاول مرة أخرى باستخدام عدد أقل من العناصر.", + "collectionActionEdit": "تحرير", + "viewerInfoSearchSuggestionResolution": "الدقة", + "viewerTransitionSlide": "الإنزلاق", + "sortOrderLargestFirst": "الأكبر أولاً", + "viewerTransitionParallax": "تأثير الشبكية", + "settingsViewerSectionTitle": "المعرض", + "mapStyleStamenWatercolor": "ستايمن بالألوان المائية", + "editEntryDateDialogSourceFileModifiedDate": "تاريخ تعديل الملف", + "editorTransformRotate": "تدوير", + "collectionEmptyFavourites": "لا يوجد مفضلة", + "albumTierNew": "جديد", + "removeEntryMetadataDialogTitle": "ازالة البيانات الوصفية", + "settingsLanguageTile": "اللغة", + "drawerCollectionVideos": "الفيديوهات", + "videoResumptionModeNever": "أبداً", + "countryEmpty": "لا توجد دول", + "collectionSelectSectionTooltip": "اختر القسم", + "settingsAllowInstalledAppAccessSubtitle": "يستخدم لتحسين عرض الألبوم", + "aboutLicensesBanner": "يستخدم هذا التطبيق الحزم والمكتبات مفتوحة المصدر التالية.", + "moveUndatedConfirmationDialogSetDate": "حفظ التواريخ", + "coordinateDmsNorth": "شمال", + "dateYesterday": "أمس", + "viewerInfoLabelDate": "التاريخ", + "nameConflictStrategyReplace": "إستبدال", + "aboutDataUsageDatabase": "قاعدة البيانات", + "collectionMoveFailureFeedback": "{count, plural, =1{فشل في نقل عنصر واحد} other{فشل في النقل {count} items}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoLoopModeAlways": "دائماً", + "settingsRemoveAnimationsDialogTitle": "ازالة الرسوم المتحركة", + "tileLayoutMosaic": "فسيفساء", + "settingsSubtitleThemeTextColor": "لون الخط", + "collectionDeselectSectionTooltip": "قم بإلغاء تحديد القسم", + "settingsKeepScreenOnTile": "إبقاء الشاشة قيد التشغيل", + "tileLayoutGrid": "شبكة", + "settingsDisplayUseTvInterface": "واجهة أندرويد TV", + "settingsTimeToTakeActionTile": "وقت إتخاذ الإجراءات", + "aboutCreditsWorldAtlas1": "يستخدم هذا التطبيق ملف TopoJSON من", + "nameConflictDialogMultipleSourceMessage": "بعض الملفات لها نفس الاسم.", + "settingsVideoSectionTitle": "الفيديو", + "appExportCovers": "أغلفة", + "viewerOpenPanoramaButtonLabel": "فتح البانوراما", + "createAlbumButtonLabel": "إنشاء", + "newAlbumDialogStorageLabel": "تخزين:", + "settingsSubtitleThemeBackgroundColor": "لون الخلفية", + "menuActionSlideshow": "عرض الشرائح", + "vaultLockTypePassword": "كلمة سر", + "settingsThumbnailOverlayTile": "التراكب", + "settingsNavigationDrawerTabPages": "الصفحات", + "settingsConfirmationDialogTitle": "نوافذ تأكيد الحوار", + "videoStreamSelectionDialogText": "ترجمات", + "settingsVideoAutoPlay": "تشغيل تلقائي", + "settingsVideoEnableHardwareAcceleration": "تسريع الأجهزة", + "editEntryDateDialogShift": "تغيير", + "viewerInfoLabelCoordinates": "الإحداثيات", + "nameConflictDialogSingleSourceMessage": "بعض الملفات الموجودة في مجلد الوجهة لها نفس الاسم.", + "exportEntryDialogFormat": "شكل:", + "widgetOpenPageHome": "إفتح الرئيسية", + "keepScreenOnAlways": "دائما", + "appExportSettings": "إعدادات", + "exportEntryDialogQuality": "جودة", + "searchPlacesSectionTitle": "الأماكن", + "settingsCollectionSelectionQuickActionEditorBanner": "المس مع الاستمرار لتحريك الأزرار وتحديد الإجراءات التي يتم عرضها عند تحديد العناصر.", + "settingsSlideshowShuffle": "تشغيل عشوائي", + "settingsThumbnailSectionTitle": "الصور المصغرة", + "videoStreamSelectionDialogAudio": "صوت", + "videoSpeedDialogLabel": "سرعة التشغيل", + "openMapPageTooltip": "عرض على صفحة الخريطة", + "videoActionSkip10": "تقدم إلى الأمام لمدة 10 ثوانٍ", + "editEntryLocationDialogSetCustom": "تعيين الموقع المخصص", + "viewerInfoUnknown": "مَجهول", + "displayRefreshRatePreferHighest": "أعلى معدل", + "settingsVideoShowVideos": "عرض الفيديوهات", + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{هل تريد حذف هذا العنصر؟} other{احذف هذه {count} أغراض؟}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsViewerShowInformation": "مزيد من المعلومات", + "placeEmpty": "لا توجد أماكن", + "settingsCollectionQuickActionsTile": "إجراءات سريعة", + "editEntryDateDialogExtractFromTitle": "استخراج من العنوان", + "settingsViewerOverlayTile": "تراكب", + "albumTierRegular": "آخرون", + "settingsThumbnailShowFavouriteIcon": "إظهار الأيقونة المفضلة", + "aboutLinkLicense": "رخصة", + "albumScreenshots": "لقطات الشاشة", + "editEntryDateDialogTitle": "التاريخ والوقت", + "settingsSubtitleThemeTextPositionDialogTitle": "موضع النَص", + "viewerInfoLabelOwner": "المالك", + "editEntryLocationDialogLongitude": "خط الطول", + "setCoverDialogCustom": "مخصص", + "searchCountriesSectionTitle": "البلدان", + "settingsSlideshowIntervalTile": "فاصلة", + "settingsAskEverytime": "اسأل كل مرة", + "editEntryDateDialogCopyField": "نسخة من تاريخ آخر", + "searchTagsSectionTitle": "العلامات", + "displayRefreshRatePreferLowest": "أدنى معدل", + "filterNoAddressLabel": "لا يوجد عنوان", + "settingsModificationWarningDialogMessage": "سيتم تعديل الإعدادات الأخرى.", + "videoStartOverButtonLabel": "ابدأ من جديد", + "accessibilityAnimationsKeep": "الحفاظ على تأثيرات الشاشة", + "settingsCollectionQuickActionEditorPageTitle": "اجراءات سريعة", + "policyPageTitle": "سياسة الخصوصية", + "tileLayoutList": "قائمة", + "settingsStorageAccessRevokeTooltip": "إبطال", + "settingsSubtitleThemeTile": "ترجمات", + "widgetDisplayedItemMostRecent": "الأحدث", + "videoActionUnmute": "إلغاء كتم الصوت", + "appPickDialogNone": "لاشيء", + "filterMimeImageLabel": "صورة", + "settingsVideoGestureVerticalDragBrightnessVolume": "اسحب لأعلى أو لأسفل لضبط مستوى السطوع/الصوت", + "settingsAccessibilitySectionTitle": "إمكانية الوصول", + "settingsActionExport": "تصدير", + "aboutBugCopyInfoInstruction": "نسخ معلومات النظام", + "filterNoTagLabel": "بدون علامات", + "missingSystemFilePickerDialogMessage": "منتقي ملفات النظام مفقود أو معطل. يرجى تمكينه والمحاولة مرة أخرى.", + "viewerInfoViewXmlLinkText": "عرض ملف XML", + "sortOrderOldestFirst": "الأقدم أولا", + "collectionRenameFailureFeedback": "{count, plural, =1{فشلت إعادة تسمية عنصر واحد} other{فشلت إعادة التسمية {count} items}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoResumptionModeAlways": "دائماً", + "tagEditorDiscardDialogMessage": "هل تريد تجاهل التغييرات؟", + "collectionEditSuccessFeedback": "{count, plural, =1{تم تحريرعنصر واحد} other{تحرير {count} عناصر}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "wallpaperTargetLock": "شاشة القفل", + "coverDialogTabApp": "التطبيق", + "settingsThumbnailShowMotionPhotoIcon": "إظهار أيقونة الصورة المتحركة", + "accessibilityAnimationsRemove": "منع تأثيرات الشاشة", + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "مطلوب XMP لتشغيل الفيديو داخل الصورة المتحركة.\n\nهل أنت متأكد أنك تريد إزالته؟", + "nameConflictStrategyRename": "إعادة تسمية", + "settingsThumbnailShowRawIcon": "إظهار أيقونة الخام", + "vaultLockTypePattern": "نمط", + "tagPageTitle": "العلامات", + "collectionEmptyVideos": "لا توجد فيديوهات", + "entryActionRemoveFavourite": "إزالة من المفضلة", + "aboutCreditsSectionTitle": "الاعتمادات", + "drawerAlbumPage": "الألبومات", + "statsTopCountriesSectionTitle": "أهم الدول", + "settingsActionImport": "إستيراد", + "viewerInfoLabelSize": "الحجم", + "locationPickerUseThisLocationButton": "استخدم هذا الموقع", + "settingsSlideshowFillScreen": "ملء الشاشة", + "settingsHiddenFiltersBanner": "لن تظهر الصور ومقاطع الفيديو المطابقة للمرشحات المخفية في مجموعتك.", + "albumTierVaults": "خزائن", + "viewerSetWallpaperButtonLabel": "تعيين خلفية", + "settingsVideoResumptionModeTile": "استئناف التشغيل", + "searchRatingSectionTitle": "التقييمات", + "vaultBinUsageDialogMessage": "تستخدم بعض الخزائن سلة المحذوفات.", + "collectionCopyFailureFeedback": "{count, plural, =1{فشل نسخ عنصر واحد} other{فشل النسخ {count} items}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsDisabled": "غير مفعل", + "settingsVideoGestureDoubleTapTogglePlay": "انقر نقرًا مزدوجًا للتشغيل/الإيقاف", + "coordinateFormatDecimal": "الدرجات العشرية", + "overlayHistogramLuminance": "الانارة", + "coordinateDmsEast": "شرق", + "filterAspectRatioLandscapeLabel": "طبيعي", + "albumTierApps": "تطبيقات", + "filterAspectRatioPortraitLabel": "لوحة", + "settingsWidgetDisplayedItem": "العنصر المعروض", + "aboutBugSaveLogInstruction": "حفظ سجلات التطبيق في ملف", + "settingsActionImportDialogTitle": "يستورد", + "filterTypeGeotiffLabel": "GeoTIFF", + "entryActionRotateScreen": "تدوير الشاشة", + "albumGroupTier": "حسب الطبقة", + "aboutBugReportInstruction": "تقرير على GitHub مع السجلات ومعلومات النظام", + "videoActionCaptureFrame": "التقاط الإطار", + "patternDialogEnter": "أدخل النمط", + "settingsEnableBin": "استخدم سلة المحذوفات", + "entryActionViewMotionPhotoVideo": "فتح الفيديو", + "otherDirectoryDescription": "دليل «{name}»", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "viewerTransitionZoomIn": "تكبير", + "drawerCollectionAll": "كافة الوسائط", + "collectionMoveSuccessFeedback": "{count, plural, =1{تم نقل عنصر واحد} other{نقل {count} عناصر}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSubtitleThemeTextAlignmentLeft": "يسار", + "settingsVideoGestureSideDoubleTapSeek": "انقر نقرًا مزدوجًا على حواف الشاشة للتقدم للأمام/للخلف", + "sortByItemCount": "حسب عدد العناصر", + "sectionUnknown": "مجهول", + "dateToday": "اليوم", + "filterNoTitleLabel": "بدون عنوان", + "videoStreamSelectionDialogNoSelection": "لا توجد مسارات أخرى.", + "searchRecentSectionTitle": "مؤخرًا", + "albumPickPageTitlePick": "اختر الألبوم", + "videoPlaybackMuted": "تشغيل بدون صوت", + "settingsSubtitleThemeTextAlignmentRight": "يمين", + "menuActionMap": "خريطة", + "entryInfoActionRemoveMetadata": "إزالة البيانات الوصفية", + "collectionActionMove": "نقل إلى الألبوم", + "searchAlbumsSectionTitle": "الألبومات", + "settingsLanguagePageTitle": "اللغة", + "rootDirectoryDescription": "دليل الجذر", + "viewDialogGroupSectionTitle": "الأقسام", + "maxBrightnessAlways": "دائماً", + "settingsAllowMediaManagement": "السماح بإدارة الوسائط", + "aboutDataUsageSectionTitle": "استخدام البيانات", + "durationDialogSeconds": "ثواني", + "themeBrightnessLight": "مضيء", + "unitSystemImperial": "النظام الإنشي", + "filterMimeVideoLabel": "فيديو", + "albumEmpty": "لا توجد ألبومات", + "editEntryLocationDialogChooseOnMap": "اختر على الخريطة", + "settingsCollectionBrowsingQuickActionEditorBanner": "المس مع الاستمرار لتحريك الأزرار وتحديد الإجراءات التي يتم عرضها عند تصفح العناصر.", + "settingsConfirmationBeforeDeleteItems": "اسأل قبل حذف العناصر إلى الأبد", + "sortByName": "حسب الإسم", + "settingsHomeDialogTitle": "الرئيسية", + "searchDateSectionTitle": "تاريخ", + "viewerErrorUnknown": "آسف!", + "storageAccessDialogMessage": "يرجى تحديد {directory} لـ «{volume}» في الشاشة التالية لمنح هذا التطبيق حق الوصول إليه.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "themeBrightnessDark": "مظلم", + "entryActionConvertMotionPhotoToStillImage": "تحويل إلى صورة ثابتة", + "entryActionCast": "البث", + "entryInfoActionEditTitleDescription": "تحرير العنوان والوصف", + "collectionSearchTitlesHintText": "عناوين البحث", + "entryInfoActionEditLocation": "تحديد الوجهة", + "viewerInfoSearchSuggestionDate": "التَاريخ والوقت", + "videoPlaybackWithSound": "تشغيل بالصوت", + "viewerInfoLabelTitle": "العنوان", + "searchCollectionFieldHint": "البحث في المجموعة", + "viewerActionUnlock": "إلغاء قفل المعاينة", + "settingsDoubleBackExit": "اضغط على «رجوع» مرتين للخروج", + "entryActionShare": "مشاركة", + "drawerCollectionSphericalVideos": "فيديوهات 360 درجة", + "moveUndatedConfirmationDialogMessage": "هل تريد حفظ تواريخ العناصر قبل المتابعة؟", + "collectionEditFailureFeedback": "{count, plural, =1{فشل تحرير عنصر واحد} other{فشل التحرير {count} items}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoActionPause": "إيقاف مؤقت", + "noMatchingAppDialogMessage": "لا توجد تطبيقات يمكنها التعامل مع هذا.", + "settingsThumbnailOverlayPageTitle": "التراكب", + "settingsViewerShowInformationSubtitle": "إظهار العنوان والتاريخ والموقع وما إلى ذلك.", + "searchMetadataSectionTitle": "البيانات الوصفية", + "widgetOpenPageCollection": "فتح المجموعة", + "settingsWidgetOpenPage": "عند النقر على الويدجت", + "renameProcessorName": "اسم", + "viewerInfoSearchFieldLabel": "البحث في البيانات الوصفية", + "viewerInfoLabelDescription": "وصف", + "nameConflictStrategySkip": "تخطي", + "addShortcutButtonLabel": "إضافة", + "exportEntryDialogHeight": "ارتفاع", + "collectionActionEmptyBin": "سلة فارغة", + "settingsSlideshowRepeat": "تكرار", + "settingsViewerQuickActionEditorPageTitle": "اجراءات سريعة", + "sortOrderAtoZ": "من الألف إلى الياء", + "settingsVideoPageTitle": "اعدادات الفيديو", + "setCoverDialogAuto": "آلي", + "tagEditorPageNewTagFieldLabel": "علامة جديدة", + "exportEntryDialogWidth": "عرض", + "newAlbumDialogTitle": "البوم جديد", + "collectionRenameSuccessFeedback": "{count, plural, =1{تمت إعادة تسمية عنصر واحد} other{أعادة تسمية {count} عناصر}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoStreamSelectionDialogTrack": "مسار", + "settingsViewerUseCutout": "استخدام منطقة القص", + "tagEditorPageTitle": "تحريرالعلامات", + "settingsWidgetShowOutline": "الخطوط العريضة", + "settingsHomeTile": "الرئيسية", + "entryActionOpenMap": "عرض في تطبيق الخرائط", + "hideFilterConfirmationDialogMessage": "سيتم إخفاء الصور ومقاطع الفيديو المطابقة من مجموعتك. ويمكنك إظهارها مرة أخرى من إعدادات «الخصوصية».\n\nهل أنت متأكد أنك تريد إخفاءهم؟", + "settingsViewerGestureSideTapNext": "اضغط على حواف الشاشة لإظهار العنصر السابق/التالي", + "collectionGroupDay": "حسب اليوم", + "collectionGroupAlbum": "حسب الألبوم", + "newFilterBanner": "الجديد", + "drawerCollectionFavourites": "المفضلة", + "filterTypeRawLabel": "خام", + "settingsSubtitleThemeTextAlignmentCenter": "وسط", + "keepScreenOnVideoPlayback": "أثناء تشغيل الفيديو", + "vaultLockTypePin": "رمز سري", + "settingsSubtitleThemeTextAlignmentTile": "محاذاة النص", + "editorTransformCrop": "قص", + "aboutLicensesFlutterPackagesSectionTitle": "حزم إضافية", + "settingsCollectionQuickActionTabSelecting": "إختيار", + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "filterTaggedLabel": "الموسومة", + "statePageTitle": "الولايات", + "drawerTagPage": "العلامات", + "newAlbumDialogNameLabelAlreadyExistsHelper": "الدليل موجود بالفعل", + "patternDialogConfirm": "تأكيد النمط", + "restrictedAccessDialogMessage": "لا يُسمح لهذا التطبيق بتعديل الملفات في {directory} لـ «{volume}»\n\nالرجاء استخدام مدير الملفات أو تطبيق المعرض المثبت مسبقًا لنقل العناصر إلى دليل آخر.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "durationDialogMinutes": "دقائق", + "settingsAllowErrorReporting": "السماح بالإبلاغ عن الأخطاء المجهولة", + "settingsVideoLoopModeTile": "وضع التكرار", + "unsupportedTypeDialogMessage": "{count, plural, =1{هذه العملية غير مدعومة للعناصر من النوع التالي: {types}.} other{هذه العملية غير معتمدة لعناصر الأنواع التالية: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "settingsScreenSaverPageTitle": "شاشة التوقف", + "settingsNavigationDrawerEditorPageTitle": "قائمة التنقل", + "settingsConfirmationBeforeMoveUndatedItems": "اسأل قبل نقل العناصر غير المؤرخة", + "albumPageTitle": "الألبومات", + "editEntryLocationDialogTitle": "موقع", + "statsWithGps": "{count, plural, =1{1 عنصر مع الموقع} other{{count} العناصر مع الموقع}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsVideoResumptionModeDialogTitle": "إستئناف التشغيل", + "albumTierPinned": "مثبت", + "mapStyleDialogTitle": "نمط الخريطة", + "entryActionRotateCCW": "تدوير عكس عقارب الساعة", + "settingsVideoBackgroundMode": "وضع الخلفية", + "chipActionCreateVault": "إنشاء خزنة", + "albumPickPageTitleCopy": "نسخ إلى ألبوم", + "collectionActionCopy": "نسخ إلى الألبوم", + "entryActionPrint": "طباعة", + "settingsAllowInstalledAppAccess": "السماح بالوصول إلى مخزون التطبيق", + "entryActionShowGeoTiffOnMap": "عرض كتراكب على الخريطة", + "viewDialogReverseSortOrder": "عكس ترتيب الفرز", + "menuActionConfigureView": "العرض", + "aboutLicensesDartPackagesSectionTitle": "حزم البرمجة", + "drawerCollectionMotionPhotos": "صور متحركة", + "settingsDefault": "افتراضي", + "settingsSlideshowAnimatedZoomEffect": "تأثير التكبير المتحرك", + "viewerActionSettings": "الإعدادات", + "placePageTitle": "أماكن", + "filterOnThisDayLabel": "في هذا اليوم", + "columnCount": "{count, plural, =1{{count} عمود} other{{count} أعمدة}}{count}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "viewerTransitionNone": "لا شيء", + "settingsDisplayRefreshRateModeTile": "عرض معدل التحديث", + "addShortcutDialogLabel": "تسمية الاختصار", + "settingsViewerOverlayPageTitle": "تراكب", + "tagEmpty": "لا توجد العلامات", + "pinDialogEnter": "أدخل الرمز السري", + "videoControlsPlayOutside": "فتح في مشغل آخر", + "settingsCoordinateFormatDialogTitle": "تنسيق الاحداثيات", + "authenticateToUnlockVault": "المصادقة لفتح الخزنة", + "collectionActionShowTitleSearch": "إظهار مرشح العنوان", + "lengthUnitPercent": "%", + "settingsNavigationDrawerTabTypes": "أنواع", + "menuActionSelectAll": "تحديد الكل", + "settingsHiddenItemsTile": "العناصر المخفية", + "maxBrightnessNever": "أبداً", + "aboutDataUsageCache": "التخزين المؤقت", + "settingsConfirmationTile": "نوافذ التأكيد", + "coordinateDmsSouth": "جنوب", + "settingsThumbnailShowVideoDuration": "عرض مدة الفيديو", + "passwordDialogConfirm": "تأكيد كلمة السر", + "videoActionReplay10": "الرجوع للخلف لمدة 10 ثوانٍ", + "settingsCollectionBurstPatternsNone": "لا شيء", + "albumMimeTypeMixed": "مختلط", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "الأزرار المتاحة", + "itemCount": "{count, plural, =1{{count} عنصر} other{{count} عناصر}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "widgetTapUpdateWidget": "تحديث الويدجت", + "settingsViewerShowDescription": "إظهار الوصف", + "viewerTransitionFade": "تلاشي", + "chipActionConfigureVault": "تكوين الخزنة", + "cropAspectRatioFree": "حر", + "aboutLinkPolicy": "سياسة الخصوصية", + "filterTypeSphericalVideoLabel": "فيديو 360 درجة", + "slideshowActionShowInCollection": "عرض في المجموعة", + "notEnoughSpaceDialogMessage": "تحتاج هذه العملية إلى {neededSize} من المساحة الحرة على «{volume}» لإكمالها، ولكن لم يتبق سوى {freeSize}.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "filterNoRatingLabel": "غير مصنف", + "settingsUnitSystemTile": "الوحدات", + "entryActionOpen": "فتح باستخدام", + "settingsCoordinateFormatTile": "تنسيق الإحداثيات", + "newVaultWarningDialogMessage": "العناصر الموجودة في الخزائن متاحة فقط لهذا التطبيق وليس للتطبيقات الأخرى.\n\nإذا قمت بإلغاء تثبيت هذا التطبيق، أو قمت بحذف بيانات هذا التطبيق، فسوف تفقد كل هذه العناصر.", + "settingsViewerQuickActionEditorBanner": "المس مع الاستمرار لتحريك الأزرار وتحديد الإجراءات التي سيتم عرضها في العارض.", + "themeBrightnessBlack": "أسود", + "filterNoLocationLabel": "غير محدد", + "mapZoomInTooltip": "تكبير", + "viewerInfoOpenLinkText": "فتح", + "storageVolumeDescriptionFallbackNonPrimary": "بطاقة الذاكرة", + "renameEntrySetPagePatternFieldLabel": "نمط التسمية", + "renameAlbumDialogLabel": "إسم جديد", + "videoActionPlay": "تشغيل", + "settingsDisablingBinWarningDialogMessage": "سيتم حذف العناصر الموجودة في سلة المحذوفات إلى الأبد.", + "entryActionSetAs": "تعيين كـ", + "sortOrderLowestFirst": "الأدنى أولاً", + "statsTopStatesSectionTitle": "أهم الولايات", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "الأزرار المعروضة", + "settingsVideoPlaybackPageTitle": "التشغيل", + "filterLocatedLabel": "متواجد", + "videoPlaybackSkip": "تخطي", + "mapStyleTooltip": "حدد نمط الخريطة", + "countryPageTitle": "دول", + "albumGroupType": "حسب النوع", + "entryActionInfo": "معلومات", + "viewerErrorDoesNotExist": "الملف لم يعد موجودا.", + "albumCamera": "الكاميرا", + "settingsNavigationSectionTitle": "التنقل", + "settingsDisplayRefreshRateModeDialogTitle": "معدل التحديث", + "viewerInfoLabelUri": "URI", + "entryActionViewSource": "عرض المصدر", + "entryActionShareVideoOnly": "مشاركة الفيديوهات فقط", + "filterTypePanoramaLabel": "بانوراما", + "coordinateFormatDms": "نظام إدارة الوجهة", + "passwordDialogEnter": "أدخل كلمة السر", + "mapZoomOutTooltip": "تصغير", + "entryInfoActionEditTags": "تعديل العلامات", + "collectionActionHideTitleSearch": "إخفاء مرشح العنوان", + "mapAttributionOsmHot": "البلاط بواسطة [HOT](https://www.hotosm.org/) • استضافة بواسطة [OSM France](https://openstreetmap.fr/)", + "settingsNavigationDrawerTile": "قائمة تنقل", + "drawerCollectionAnimated": "متحرك", + "renameAlbumDialogLabelAlreadyExistsHelper": "الدليل موجود بالفعل", + "settingsHiddenItemsPageTitle": "العناصر المَخفية", + "keepScreenOnViewerOnly": "صفحة المشاهدة فقط", + "durationDialogHours": "ساعات", + "settingsKeepScreenOnDialogTitle": "ابقاء الشَاشة قيد التشغيل", + "wallpaperTargetHome": "الشاشة الرئيسية", + "settingsViewerShowOverlayOnOpening": "عرض عند الفتح", + "settingsAccessibilityShowPinchGestureAlternatives": "عرض بدائل إيماءات اللمس المتعدد", + "videoActionSelectStreams": "اختيار المسارات", + "settingsViewerShowShootingDetails": "عرض تفاصيل التصوير", + "settingsConfirmationAfterMoveToBinItems": "إظهار الرسالة بعد نقل العناصر إلى سلة المحذوفات", + "widgetDisplayedItemRandom": "عشوائي", + "settingsLanguageSectionTitle": "اللغة والتنسيقات", + "drawerPlacePage": "الأماكن", + "menuActionSelect": "تحديد", + "drawerCollectionPanoramas": "لقطات بانورامية", + "renameEntrySetPagePreviewSectionTitle": "معاينة", + "filterBinLabel": "سلة المَحذوفات", + "settingsDisplaySectionTitle": "عَرض", + "settingsConfirmationVaultDataLoss": "إظهار تحذير فقدان بيانات المخزن", + "settingsSlideshowTransitionTile": "انتقال", + "settingsPageTitle": "إعدادات", + "subtitlePositionTop": "أعلى", + "menuActionSelectNone": "لا تحدد شيء", + "entryActionConvert": "تحويل", + "aboutDataUsageClearCache": "مسح ذاكرة التخزين المؤقت", + "settingsSearchFieldLabel": "إعدادات البحث", + "appExportFavourites": "المفضلة", + "collectionEmptyImages": "لا توجد صور", + "settingsViewerMaximumBrightness": "أقصى سطوع", + "albumPickPageTitleExport": "تصدير إلى الألبوم", + "settingsThumbnailShowTagIcon": "إظهار رمز العلامة", + "settingsStorageAccessEmpty": "عدم منح الوصول", + "settingsRemoveAnimationsTile": "إزالة الرسوم المتحركة", + "settingsStorageAccessBanner": "تتطلب بعض المسارات منح وصول صريح لتعديل الملفات الموجودة فيها. يمكنك هنا مراجعة المسارات التي منحتها حق الوصول إليها مسبقًا.", + "authenticateToConfigureVault": "قم بالمصادقة لتكوين الخزنة", + "settingsActionExportDialogTitle": "تصدير", + "genericDangerWarningDialogMessage": "هل أنت متأكد؟", + "lengthUnitPixel": "بكسل", + "vaultDialogLockTypeLabel": "نوع القفل", + "aboutDataUsageExternal": "خارجي", + "collectionSelectPageTitle": "اختيار العناصر", + "entryInfoActionEditDate": "تعديل التاريخ والوقت", + "editEntryLocationDialogLatitude": "خط العرض", + "slideshowActionResume": "استئناف", + "cropAspectRatioSquare": "مربع", + "collectionActionRescan": "إعادة المسح", + "collectionCopySuccessFeedback": "{count, plural, =1{تم نسخ عنصر واحد} other{نسخ {count} أغراض}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsNavigationDrawerBanner": "إلمس مع الاستمرار لنقل عناصر القائمة وإعادة ترتيبها.", + "settingsWidgetPageTitle": "إطار الصورة", + "viewDialogSortSectionTitle": "نوع", + "collectionPageTitle": "مجموعة بيانات", + "unitSystemMetric": "النظام المتري", + "overlayHistogramNone": "لا شيء", + "chipActionShowCountryStates": "عرض الولايات", + "filterRecentlyAddedLabel": "أضيف مؤخرا", + "editEntryDialogTargetFieldsHeader": "الحقول المراد تعديلها", + "storageVolumeDescriptionFallbackPrimary": "التخزين الداخلي", + "collectionActionAddShortcut": "إضافة اختصار", + "settingsViewerShowMinimap": "إظهار الخريطة المصغرة", + "settingsCollectionBurstPatternsTile": "أنماط الصور المتتابعة", + "viewerInfoLabelPath": "المسار", + "albumGroupVolume": "حسب حجم التخزين", + "collectionGroupMonth": "حسب الشهر", + "viewerInfoLabelResolution": "الدقة", + "renameProcessorCounter": "عداد", + "settingsImageBackground": "خلفية الصورة", + "newAlbumDialogNameLabel": "اسم الألبوم", + "cropAspectRatioOriginal": "الأصل", + "sortByDate": "حسب التاريخ", + "statsTopAlbumsSectionTitle": "أهم الألبومات", + "configureVaultDialogTitle": "تكوين خزنة", + "entryActionRename": "إعادة تسمية", + "viewerInfoLabelDuration": "المدة", + "sortOrderZtoA": "من الياء إلى الألف", + "keepScreenOnNever": "أبداً", + "statsPageTitle": "احصائيات", + "viewerInfoSearchSuggestionDimensions": "الأبعاد", + "mapStyleOsmHot": "خرائط OSM", + "drawerAboutButton": "حول", + "aboutTranslatorsSectionTitle": "المترجمين", + "statsTopPlacesSectionTitle": "أهم المواقع", + "videoStreamSelectionDialogOff": "ايقاف", + "settingsVideoLoopModeDialogTitle": "وضع التَكرار", + "drawerCollectionImages": "الصور", + "sortOrderSmallestFirst": "الأصغر أولاً", + "timeSeconds": "{count, plural, =1{{count} ثانية} other{{count} ثواني}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "sortBySize": "حسب الحجم", + "viewerInfoSearchSuggestionDescription": "الوصف", + "settingsViewerShowOverlayThumbnails": "عرض الصور المصغرة", + "collectionPickPageTitle": "اختيار", + "settingsVideoControlsPageTitle": "ضوابط", + "aboutBugReportButton": "تقرير", + "collectionEmptyGrantAccessButtonLabel": "منح الوصول", + "filterTypeMotionPhotoLabel": "الصور المتحركة", + "mapStyleGoogleNormal": "خرائط جوجل", + "videoStreamSelectionDialogVideo": "فيديو", + "viewDialogLayoutSectionTitle": "تخطيط", + "searchStatesSectionTitle": "الولايات", + "filterTypeAnimatedLabel": "متحرك", + "videoLoopModeNever": "أبداً", + "settingsUnitSystemDialogTitle": "الوحدات", + "videoActionSetSpeed": "سرعة التشغيل", + "dateThisMonth": "هذا الشهر", + "renameEntrySetPageTitle": "إعادة تسمية", + "settingsConfirmationBeforeMoveToBinItems": "اسأل قبل نقل العناصر إلى سلة المحذوفات", + "settingsSlideshowVideoPlaybackTile": "تشغيل الفيديو", + "settingsHiddenFiltersEmpty": "لا يوجد مرشحات مخفية", + "aboutPageTitle": "حول", + "sortByRating": "حسب التصنيف", + "stateEmpty": "لا توجد ولايات", + "viewerInfoSearchEmpty": "لا توجد مفاتيح مطابقة", + "filterFavouriteLabel": "مفضل", + "drawerCountryPage": "البلدان", + "aboutBugSectionTitle": "تقرير الأخطاء", + "filterRatingRejectedLabel": "مرفوض", + "settingsThumbnailShowLocationIcon": "إظهار رمز الموقع", + "editEntryDialogCopyFromItem": "نسخ من عنصر آخر", + "settingsStorageAccessPageTitle": "الوصُول إلى التخزين", + "genericFailureFeedback": "فشل", + "aboutDataUsageData": "بيانات", + "settingsThemeEnableDynamicColor": "اللون الديناميكي", + "viewerInfoOpenEmbeddedFailureFeedback": "فشل في استخراج البيانات المضمنة", + "aboutDataUsageInternal": "داخلي", + "albumDownload": "التحميل", + "coverDialogTabColor": "اللون", + "coordinateDmsWest": "غرب", + "genericSuccessFeedback": "إنتهى!", + "videoActionMute": "كتم الصوت", + "renameEntryDialogLabel": "اسم جديد", + "renameEntrySetPageInsertTooltip": "أدخل الحقل", + "aboutLicensesShowAllButtonLabel": "عرض كافة التراخيص", + "settingsSubtitleThemeBackgroundOpacity": "عتامة الخلفية", + "settingsStorageAccessTile": "الوصول إلى التخزين", + "entryActionDelete": "حذف", + "settingsThemeBrightnessTile": "السمَة", + "settingsViewerQuickActionEmpty": "لا يوجد أزرار", + "viewerInfoBackToViewerTooltip": "العودة إلى العارض", + "settingsSystemDefault": "الإعداد الافتراضي للنظام", + "settingsViewerSlideshowTile": "عرض الشرائح", + "settingsCollectionTile": "مجمُوعة", + "entryActionRotateCW": "تدوير في اتجاه عقارب الساعة", + "settingsSubtitleThemeTextOpacity": "عتامة النص", + "sortOrderNewestFirst": "الأحدث أولاً", + "settingsViewerShowRatingTags": "عرض التصنيف والعلامات", + "drawerSettingsButton": "إعدادات", + "entryActionFlip": "عكس أفقيًا", + "drawerCollectionRaws": "الصور الخام", + "settingsViewerEnableOverlayBlurEffect": "تأثير الضبابية", + "settingsMotionPhotoAutoPlay": "التشغيل التلقائي للصور المتحركة", + "overlayHistogramRGB": "RGB", + "settingsVideoControlsTile": "ضوابط", + "settingsSlideshowVideoPlaybackDialogTitle": "تَشغيل الفيديو", + "settingsSubtitleThemeShowOutline": "إظهار الخطوط العريضة والظل", + "settingsNavigationDrawerTabAlbums": "الألبومات", + "subtitlePositionBottom": "أسفل", + "castDialogTitle": "أجهزة البث", + "timeDays": "{count, plural, =1{{count} يوم} other{{count} أيام}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "videoResumeButtonLabel": "إستئناف", + "entryActionExport": "المزيد", + "mapEmptyRegion": "لا توجد صور في هذه المنطقة", + "settingsVideoEnablePip": "صورة في صورة", + "settingsThemeBrightnessDialogTitle": "السمة", + "aboutLicensesFlutterPluginsSectionTitle": "مكونات إضافية", + "sortOrderHighestFirst": "الاعلى اولا", + "aboutLicensesAndroidLibrariesSectionTitle": "مكتبات أندرويد", + "settingsViewerQuickActionsTile": "إجراءات سريعة", + "entryActionAddFavourite": "إضافة إلى المفضلة", + "entryActionEdit": "تحرير", + "newVaultDialogTitle": "خزنة جديدة", + "entryInfoActionEditRating": "تحرير التقييم", + "timeMinutes": "{count, plural, =1{{count} دقيقة} other{{count} دقائق}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "albumTierSpecial": "شائع", + "settingsSubtitleThemePageTitle": "ترجمات", + "settingsSubtitleThemeTextPositionTile": "موضع النص", + "entryActionRestore": "استعادة", + "entryActionCopyToClipboard": "نسخ إلى الحافظة", + "viewerInfoLabelAddress": "العنوان", + "settingsVideoBackgroundModeDialogTitle": "وضع الخلـفية", + "binPageTitle": "سلة المحذوفات", + "tagPlaceholderState": "الولاية", + "sortByAlbumFileName": "حسب عنوان الألبوم والعنصر", + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{هل تريد حذف هذه الألبومات والعنصر الموجود فيها؟} other{احذف هذه الألبومات و {count} العناصر فيها؟}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSubtitleThemeTextSize": "حجم الخط", + "aboutLicensesSectionTitle": "تراخيص مفتوحة المصدر", + "menuActionStats": "احصائيات", + "settingsCollectionQuickActionTabBrowsing": "التصفح", + "chipActionCreateAlbum": "إنشاء ألبوم", + "videoLoopModeShortOnly": "فيديوهات قصيرة فقط", + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{هل تريد حذف هذا الألبوم والعنصر الموجود فيه؟} other{احذف هذا الألبوم و {count} العناصر فيه؟}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsThemeColorHighlights": "تحديد الألوان", + "appPickDialogTitle": "اختر التطبيق", + "viewerInfoSearchSuggestionRights": "الحقوق", + "mapPointNorthUpTooltip": "نقطة الشمال لأعلى", + "entryInfoActionRemoveLocation": "إزالة الموقع", + "collectionDeleteFailureFeedback": "{count, plural, =1{فشل حذف عنصر واحد} other{فشل الحذف {count} items}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "entryActionShareImageOnly": "مشاركة الصورة فقط", + "settingsVideoButtonsTile": "أزرار", + "settingsSubtitleThemeSample": "هذه عينة بسيطة.", + "albumPickPageTitleMove": "انتقل إلى الألبوم", + "settingsSaveSearchHistory": "حفظ سجل البحث", + "settingsViewerShowHistogram": "إظهار الرسم البياني", + "aboutBugCopyInfoButton": "نسخ", + "mapStyleGoogleHybrid": "خرائط جوجل (الهجينة)", + "wallpaperTargetHomeLock": "الشاشة الرئيسية وشاشة القفل", + "coverDialogTabCover": "غلاف", + "settingsVideoPlaybackTile": "التشغيل", + "filterNoDateLabel": "غير مؤرخ", + "exportEntryDialogWriteMetadata": "كتابة البيانات الوصفية", + "settingsThumbnailShowHdrIcon": "إظهار أيقونة HDR", + "collectionActionSetHome": "تعيين كخلفية", + "videoActionABRepeat": "تكرار A-B", + "videoRepeatActionSetEnd": "تعيين نهاية التشغيل", + "stopTooltip": "توقف", + "videoRepeatActionSetStart": "تعيين بداية التشغيل", + "settingsForceWesternArabicNumeralsTile": "فرض الأرقام العربية", + "renameProcessorHash": "تجزئة", + "chipActionShowCollection": "عرض في المجموعة", + "chipActionGoToExplorerPage": "عرض في المستكشف", + "explorerPageTitle": "المستكشف", + "explorerActionSelectStorageVolume": "حدد التخزين", + "setHomeCustom": "مخصص", + "selectStorageVolumeDialogTitle": "حدد التَخزين", + "sortOrderShortestFirst": "الأقصر أولاً", + "sortOrderLongestFirst": "الأطول أولاً", + "sortByDuration": "حسب المدة", + "mapStyleOpenTopoMap": "الخريطة الطبوغرافية المفتوحة", + "mapAttributionOsmData": "بيانات الخريطة © [OpenStreetMap](https://www.openstreetmap.org/copyright) المساهمين", + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | البلاط بواسطة [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "mapStyleOsmLiberty": "حرية خرائط OSM", + "mapAttributionOsmLiberty": "البلاط بواسطة [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • مُستضاف بواسطة [OSM Americana](https://tile.ourmap.us)", + "videoActionShowPreviousFrame": "إظهار الإطار السابق", + "videoActionShowNextFrame": "إظهار الإطار التالي", + "newAlbumDialogAlbumAlreadyExistsHelper": "الألبوم موجود بالفعل", + "albumTierDynamic": "ديناميكي", + "collectionActionAddDynamicAlbum": "إضافة ألبوم ديناميكي", + "chipActionRemove": "إزالة", + "dynamicAlbumAlreadyExists": "الألبوم الديناميكي موجود بالفعل", + "appExportDynamicAlbums": "الألبومات الديناميكية", + "newDynamicAlbumDialogTitle": "ألبوم ديناميكي جديد", + "chipActionDecompose": "فصل", + "coordinateFormatDdm": "DDM", + "editEntryLocationDialogImportGpx": "استيراد GPX", + "editEntryLocationDialogTimeShift": "التحول الزمني", + "removeEntryMetadataDialogAll": "الكل", + "sortByPath": "حسب المسار", + "searchFormatSectionTitle": "التنسيقات", + "chipActionGroup": "تغيير التجميع", + "createButtonLabel": "خلق", + "sectionNone": "لا يوجد أقسام", + "chipActionCreateGroup": "إنشاء مجموعة", + "albumTierGroups": "المجموعات", + "newGroupDialogTitle": "مجموعة جديدة", + "newGroupDialogNameLabel": "اسم المجموعة", + "groupAlreadyExists": "المجموعة موجودة بالفعل", + "groupEmpty": "لا توجد مجموعات", + "ungrouped": "غير مجمعة", + "groupPickerTitle": "اختر المجموعة", + "groupPickerUseThisGroupButton": "استخدم هذه المجموعة", + "mapStyleDialogAddStyle": "إضافة نمط", + "mapStyleEditorDialogName": "اسم", + "mapStyleEditorDialogUrl": "URL", + "mapStyleEditorDialogSubdomains": "المجالات الفرعية", + "mapStyleEditorDialogUserAgent": "وكيل المستخدم", + "settingsNavigationBottomActionsTile": "شريط التنقل السفلي", + "settingsNavigationBottomActionEditorPageTitle": "شريط التنقل السفلي", + "settingsNavigationBottomActionEditorBanner": "المس باستمرار لتحريك الأزرار وتحديد الإجراءات التي يتم عرضها في شريط التنقل السفلي.", + "tagPickPageTitle": "اختر الوسم", + "settingsViewerShowZoomLevel": "إظهار مستوى التكبير", + "settingsEnabled": "مُفعّل", + "settingsForced": "قسري" +} diff --git a/lib/l10n/app_az.arb b/lib/l10n/app_az.arb new file mode 100644 index 0000000..920c5e3 --- /dev/null +++ b/lib/l10n/app_az.arb @@ -0,0 +1,156 @@ +{ + "columnCount": "{count, plural, =1{{count} sütun} other{{count} sütun}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeSeconds": "{count, plural, =1{{count} saniyə} other{{count} saniyə}}", + "@timeSeconds": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "hideTooltip": "Gizlət", + "@hideTooltip": {}, + "chipActionGoToAlbumPage": "Albomlarda Göstər", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Ölkələrdə Göstər", + "@chipActionGoToCountryPage": {}, + "welcomeOptional": "Zəruri deyil", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Mən hökm və şərtlərlə razıyam", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, =1{{count} element}\n other{{count} element}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeMinutes": "{count, plural, =1{{count} dəqiqə} other{{count} dəqiqə}}", + "@timeMinutes": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeDays": "{count, plural, =1{{count} gün} other{{count} gün}}", + "@timeDays": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "applyButtonLabel": "TƏTBİQ ET", + "@applyButtonLabel": {}, + "deleteButtonLabel": "SİL", + "@deleteButtonLabel": {}, + "nextButtonLabel": "NÖVBƏTİ", + "@nextButtonLabel": {}, + "showButtonLabel": "GÖSTƏR", + "@showButtonLabel": {}, + "hideButtonLabel": "GİZLƏT", + "@hideButtonLabel": {}, + "continueButtonLabel": "DAVAM ET", + "@continueButtonLabel": {}, + "saveCopyButtonLabel": "NÜSXƏNİ SAXLA", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Tətbiq et", + "@applyTooltip": {}, + "cancelTooltip": "Ləğv et", + "@cancelTooltip": {}, + "changeTooltip": "Dəyişdir", + "@changeTooltip": {}, + "clearTooltip": "Təmizlə", + "@clearTooltip": {}, + "previousTooltip": "Əvvəlki", + "@previousTooltip": {}, + "nextTooltip": "Növbəti", + "@nextTooltip": {}, + "showTooltip": "Göstər", + "@showTooltip": {}, + "actionRemove": "Təmizlə", + "@actionRemove": {}, + "resetTooltip": "Sıfırla", + "@resetTooltip": {}, + "saveTooltip": "Saxla", + "@saveTooltip": {}, + "stopTooltip": "Dayandır", + "@stopTooltip": {}, + "pickTooltip": "Seçin", + "@pickTooltip": {}, + "doubleBackExitMessage": "Çıxmaq üçün təkrar “geri”-yə kliklə.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "Təkrar soruşma", + "@doNotAskAgain": {}, + "sourceStateLoading": "Yüklənilir", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Sənədləşdirmə", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Ölkələr yerləşdirilir", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Yerlər müəyyənləşdirilir", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Sil", + "@chipActionDelete": {}, + "chipActionShowCollection": "Kolleksiyada Göstər", + "@chipActionShowCollection": {}, + "chipActionGoToPlacePage": "Yerlərdə Göstər", + "@chipActionGoToPlacePage": {}, + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Aves-ə Xoş Gəlmisiniz", + "@welcomeMessage": {}, + "chipActionRemove": "Təmizlə", + "@chipActionRemove": {}, + "chipActionGoToTagPage": "Etiketlərdə Göstər", + "@chipActionGoToTagPage": {}, + "chipActionGoToExplorerPage": "Nəticədə Göstər", + "@chipActionGoToExplorerPage": {}, + "chipActionFilterOut": "Ayırın", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Qoyun", + "@chipActionFilterIn": {}, + "chipActionHide": "Gizlət", + "@chipActionHide": {}, + "chipActionLock": "Kilidlə", + "@chipActionLock": {}, + "chipActionPin": "Yuxarıya sabitlə", + "@chipActionPin": {}, + "chipActionUnpin": "Sabitləməyin", + "@chipActionUnpin": {}, + "chipActionRename": "Bir də adlandır", + "@chipActionRename": {}, + "chipActionDecompose": "Böl", + "@chipActionDecompose": {}, + "chipActionCreateAlbum": "Albom yarat", + "@chipActionCreateAlbum": {}, + "createButtonLabel": "YARAT", + "@createButtonLabel": {}, + "chipActionGroup": "Qruplandırmanı dəyişdir", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Qrup yarat", + "@chipActionCreateGroup": {} +} diff --git a/lib/l10n/app_be.arb b/lib/l10n/app_be.arb new file mode 100644 index 0000000..9718bea --- /dev/null +++ b/lib/l10n/app_be.arb @@ -0,0 +1,1564 @@ +{ + "appName": "Aves", + "@appName": {}, + "welcomeTermsToggle": "Я згодны з умовамі", + "@welcomeTermsToggle": {}, + "welcomeOptional": "Неабавязковыя", + "@welcomeOptional": {}, + "welcomeMessage": "Сардэчна запрашаем у Aves", + "@welcomeMessage": {}, + "itemCount": "{count, plural, =1{{count} элемент} other{{count} элементаў}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chipActionPin": "Прышпіліць да вяршыні", + "@chipActionPin": {}, + "saveCopyButtonLabel": "ЗАХАВАЦЬ КОПІЮ", + "@saveCopyButtonLabel": {}, + "focalLength": "{length} мм", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "applyButtonLabel": "УЖЫВАЦЬ", + "@applyButtonLabel": {}, + "deleteButtonLabel": "ВЫДАЛІЦЬ", + "@deleteButtonLabel": {}, + "applyTooltip": "Ужыць", + "@applyTooltip": {}, + "sourceStateLoading": "Загрузка", + "@sourceStateLoading": {}, + "saveTooltip": "Захаваць", + "@saveTooltip": {}, + "doNotAskAgain": "Больш не пытайся", + "@doNotAskAgain": {}, + "chipActionGoToCountryPage": "Паказаць у Краінах", + "@chipActionGoToCountryPage": {}, + "chipActionFilterOut": "Адфільтраваць", + "@chipActionFilterOut": {}, + "doubleBackExitMessage": "Яшчэ раз націсніце «назад», каб выйсці.", + "@doubleBackExitMessage": {}, + "sourceStateLocatingCountries": "Размяшчэнне краін", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Размяшчэнне месцаў", + "@sourceStateLocatingPlaces": {}, + "chipActionFilterIn": "Фільтраваць", + "@chipActionFilterIn": {}, + "pickTooltip": "Выбраць", + "@pickTooltip": {}, + "sourceStateCataloguing": "Каталагізацыя", + "@sourceStateCataloguing": {}, + "chipActionDelete": "Выдаліць", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Паказаць у Альбомах", + "@chipActionGoToAlbumPage": {}, + "chipActionHide": "Схаваць", + "@chipActionHide": {}, + "chipActionCreateVault": "Стварыце сховішча", + "@chipActionCreateVault": {}, + "chipActionGoToPlacePage": "Паказаць у Лакацыях", + "@chipActionGoToPlacePage": {}, + "chipActionUnpin": "Адмацаваць зверху", + "@chipActionUnpin": {}, + "chipActionGoToTagPage": "Паказаць у Тэгах", + "@chipActionGoToTagPage": {}, + "chipActionLock": "Заблакаваць", + "@chipActionLock": {}, + "chipActionSetCover": "Усталяваць вокладку", + "@chipActionSetCover": {}, + "chipActionRename": "Перайменаваць", + "@chipActionRename": {}, + "chipActionConfigureVault": "Наладзіць сховішча", + "@chipActionConfigureVault": {}, + "entryActionCopyToClipboard": "Скапіяваць у буфер абмену", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "Выдаліць", + "@entryActionDelete": {}, + "nextButtonLabel": "ДАЛЕЙ", + "@nextButtonLabel": {}, + "showButtonLabel": "ПАКАЗАЦЬ", + "@showButtonLabel": {}, + "hideButtonLabel": "ХАВАЦЬ", + "@hideButtonLabel": {}, + "continueButtonLabel": "ПРАЦЯГВАЦЬ", + "@continueButtonLabel": {}, + "cancelTooltip": "Адмена", + "@cancelTooltip": {}, + "changeTooltip": "Змяніць", + "@changeTooltip": {}, + "clearTooltip": "Ачысціць", + "@clearTooltip": {}, + "previousTooltip": "Папярэдні", + "@previousTooltip": {}, + "nextTooltip": "Наступны", + "@nextTooltip": {}, + "showTooltip": "Паказаць", + "@showTooltip": {}, + "hideTooltip": "Схаваць", + "@hideTooltip": {}, + "actionRemove": "Выдаліць", + "@actionRemove": {}, + "resetTooltip": "Скінуць", + "@resetTooltip": {}, + "chipActionShowCountryStates": "Паказаць дзяржавы", + "@chipActionShowCountryStates": {}, + "chipActionCreateAlbum": "Стварыць альбом", + "@chipActionCreateAlbum": {}, + "entryActionConvert": "Канвертаваць", + "@entryActionConvert": {}, + "entryActionRotateCCW": "Круціць супраць гадзінны стрэлкі", + "@entryActionRotateCCW": {}, + "entryActionRestore": "Аднавіць", + "@entryActionRestore": {}, + "entryActionRotateScreen": "Паварот экрана", + "@entryActionRotateScreen": {}, + "entryActionViewSource": "Паглядзець крыніцу", + "@entryActionViewSource": {}, + "entryActionConvertMotionPhotoToStillImage": "Канвертаваць у статычны малюнак", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Адкрыць відэа", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionSetAs": "Усталяваць як", + "@entryActionSetAs": {}, + "entryActionAddFavourite": "Дадаць у абранае", + "@entryActionAddFavourite": {}, + "videoActionUnmute": "Уключыць гук", + "@videoActionUnmute": {}, + "videoActionCaptureFrame": "Захоп кадра", + "@videoActionCaptureFrame": {}, + "viewerActionSettings": "Налады", + "@viewerActionSettings": {}, + "videoActionSkip10": "Перамотка наперад на 10 секунд", + "@videoActionSkip10": {}, + "videoActionReplay10": "Перамотка назад на 10 секунд", + "@videoActionReplay10": {}, + "entryInfoActionEditTitleDescription": "Рэдагаваць назву і апісанне", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionRemoveMetadata": "Выдаліць метададзеныя", + "@entryInfoActionRemoveMetadata": {}, + "editorTransformRotate": "Павярнуць", + "@editorTransformRotate": {}, + "editorTransformCrop": "Абрэзаць", + "@editorTransformCrop": {}, + "entryActionShowGeoTiffOnMap": "Паказаць як накладанне на карту", + "@entryActionShowGeoTiffOnMap": {}, + "videoActionSelectStreams": "Выберыце трэкі", + "@videoActionSelectStreams": {}, + "entryInfoActionEditLocation": "Рэдагаваць месцазнаходжанне", + "@entryInfoActionEditLocation": {}, + "entryActionRemoveFavourite": "Выдаліць з абранага", + "@entryActionRemoveFavourite": {}, + "videoActionPause": "Паўза", + "@videoActionPause": {}, + "videoActionPlay": "Прайграць", + "@videoActionPlay": {}, + "videoActionSetSpeed": "Хуткасць прайгравання", + "@videoActionSetSpeed": {}, + "viewerActionLock": "Блакіроўка прагляду", + "@viewerActionLock": {}, + "slideshowActionResume": "Аднавіць", + "@slideshowActionResume": {}, + "viewerActionUnlock": "Разблакіроўка прагляду", + "@viewerActionUnlock": {}, + "entryActionExport": "Экспарт", + "@entryActionExport": {}, + "entryActionInfo": "Інфармацыя", + "@entryActionInfo": {}, + "entryActionRename": "Перайменаваць", + "@entryActionRename": {}, + "entryActionRotateCW": "Круціць па гадзіннікавай стрэлцы", + "@entryActionRotateCW": {}, + "entryActionFlip": "Перавярнуць па гарызанталі", + "@entryActionFlip": {}, + "entryActionPrint": "Друк", + "@entryActionPrint": {}, + "entryActionShare": "Падзяліцца", + "@entryActionShare": {}, + "entryActionShareImageOnly": "Падзяліцца толькі выявай", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "Падзяліцца толькі відэа", + "@entryActionShareVideoOnly": {}, + "entryActionEdit": "Рэдагаваць", + "@entryActionEdit": {}, + "entryActionOpen": "Адкрыць з дапамогай", + "@entryActionOpen": {}, + "entryActionOpenMap": "Паказаць у праграме карты", + "@entryActionOpenMap": {}, + "videoActionMute": "Адключыць гук", + "@videoActionMute": {}, + "slideshowActionShowInCollection": "Паказаць у Калекцыі", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Рэдагаваць дату і час", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditRating": "Рэдагаваць рэйтынг", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Рэдагаваць тэгі", + "@entryInfoActionEditTags": {}, + "entryInfoActionExportMetadata": "Экспарт метададзеных", + "@entryInfoActionExportMetadata": {}, + "entryInfoActionRemoveLocation": "Выдаліць месцазнаходжанне", + "@entryInfoActionRemoveLocation": {}, + "editorActionTransform": "Трансфармаваць", + "@editorActionTransform": {}, + "cropAspectRatioFree": "Свабодныя", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Першапачатковае", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Квадратнае", + "@cropAspectRatioSquare": {}, + "coordinateDmsNorth": "Пн", + "@coordinateDmsNorth": {}, + "filterAspectRatioPortraitLabel": "Партрэтныя", + "@filterAspectRatioPortraitLabel": {}, + "filterTypeMotionPhotoLabel": "Фота з рухам", + "@filterTypeMotionPhotoLabel": {}, + "filterRecentlyAddedLabel": "Нядаўна дададзены", + "@filterRecentlyAddedLabel": {}, + "filterTypeAnimatedLabel": "Аніміраваныя", + "@filterTypeAnimatedLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "Відэа 360°", + "@filterTypeSphericalVideoLabel": {}, + "filterNoTitleLabel": "Без назвы", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "У гэты дзень", + "@filterOnThisDayLabel": {}, + "filterRatingRejectedLabel": "Адхілена", + "@filterRatingRejectedLabel": {}, + "albumTierRegular": "Іншыя", + "@albumTierRegular": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateFormatDms": "Градусы, хвіліны і секунды", + "@coordinateFormatDms": {}, + "mapStyleGoogleHybrid": "Карты Google (гібрыд)", + "@mapStyleGoogleHybrid": {}, + "coordinateFormatDecimal": "Дзесятковы градус", + "@coordinateFormatDecimal": {}, + "subtitlePositionBottom": "Ніз", + "@subtitlePositionBottom": {}, + "nameConflictStrategyReplace": "Замяніць", + "@nameConflictStrategyReplace": {}, + "filterAspectRatioLandscapeLabel": "Ландшафтныя", + "@filterAspectRatioLandscapeLabel": {}, + "filterBinLabel": "Сметніца", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Выбранае", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Без даты", + "@filterNoDateLabel": {}, + "filterNoAddressLabel": "Без адрасу", + "@filterNoAddressLabel": {}, + "filterLocatedLabel": "Размешчаны", + "@filterLocatedLabel": {}, + "filterNoLocationLabel": "Без месцазнаходжання", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Без рэйтынгу", + "@filterNoRatingLabel": {}, + "filterTaggedLabel": "З тэгамі", + "@filterTaggedLabel": {}, + "filterNoTagLabel": "Без тэгаў", + "@filterNoTagLabel": {}, + "filterTypePanoramaLabel": "Панарама", + "@filterTypePanoramaLabel": {}, + "filterMimeImageLabel": "Малюнак", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Відэа", + "@filterMimeVideoLabel": {}, + "accessibilityAnimationsRemove": "Прадухіленне экранных эфектаў", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Захаваць экранныя эфекты", + "@accessibilityAnimationsKeep": {}, + "albumTierNew": "Новы", + "@albumTierNew": {}, + "albumTierPinned": "Замацаваны", + "@albumTierPinned": {}, + "albumTierApps": "Праграмы", + "@albumTierApps": {}, + "albumTierVaults": "Сховішчы", + "@albumTierVaults": {}, + "albumTierSpecial": "Стандартныя", + "@albumTierSpecial": {}, + "coordinateDmsSouth": "Пд", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "У", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "З", + "@coordinateDmsWest": {}, + "displayRefreshRatePreferHighest": "Найвышэйшая частата", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Найменшая частата", + "@displayRefreshRatePreferLowest": {}, + "keepScreenOnNever": "Ніколі", + "@keepScreenOnNever": {}, + "keepScreenOnVideoPlayback": "Падчас прайгравання відэа", + "@keepScreenOnVideoPlayback": {}, + "keepScreenOnViewerOnly": "Толькі ў праглядніку", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Заўсёды", + "@keepScreenOnAlways": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "mapStyleGoogleNormal": "Карты Google", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleTerrain": "Карты Google (Рэльеф мясцовасці)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "Гуманітарная ОСМ", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Тычынка Акварэль", + "@mapStyleStamenWatercolor": {}, + "maxBrightnessNever": "Ніколі", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "Заўсёды", + "@maxBrightnessAlways": {}, + "nameConflictStrategyRename": "Перайменаваць", + "@nameConflictStrategyRename": {}, + "nameConflictStrategySkip": "Прапусціць", + "@nameConflictStrategySkip": {}, + "subtitlePositionTop": "Верх", + "@subtitlePositionTop": {}, + "themeBrightnessLight": "Светлая", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Цёмная", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Чорная", + "@themeBrightnessBlack": {}, + "unitSystemMetric": "Метрычныя", + "@unitSystemMetric": {}, + "unitSystemImperial": "Англійскія", + "@unitSystemImperial": {}, + "vaultLockTypePattern": "Шаблон", + "@vaultLockTypePattern": {}, + "vaultLockTypePin": "PIN-код", + "@vaultLockTypePin": {}, + "vaultLockTypePassword": "Пароль", + "@vaultLockTypePassword": {}, + "settingsVideoEnablePip": "Карцінка ў карцінцы", + "@settingsVideoEnablePip": {}, + "videoControlsPlayOutside": "Адкрыць у іншым прайгравальніку", + "@videoControlsPlayOutside": {}, + "videoLoopModeNever": "Ніколі", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "Толькі для кароткіх відэа", + "@videoLoopModeShortOnly": {}, + "videoPlaybackSkip": "Прапусціць", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Прайграваць без гуку", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Прайграваць з гукам", + "@videoPlaybackWithSound": {}, + "videoResumptionModeNever": "Ніколі", + "@videoResumptionModeNever": {}, + "videoResumptionModeAlways": "Заўсёды", + "@videoResumptionModeAlways": {}, + "viewerTransitionParallax": "Паралакс", + "@viewerTransitionParallax": {}, + "videoLoopModeAlways": "Заўсёды", + "@videoLoopModeAlways": {}, + "widgetDisplayedItemMostRecent": "Самы апошні", + "@widgetDisplayedItemMostRecent": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD-карта", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "каранёвы каталог", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "Каталог «{name}»", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "storageAccessDialogMessage": "Калі ласка, выберыце {directory} «{volume}» на наступным экране, каб даць гэтай праграме доступ да яго.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "notEnoughSpaceDialogMessage": "Для завяршэння гэтай аперацыі патрабуецца {neededSize} вольнага месца на «{volume}», але засталося толькі {freeSize}.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "nameConflictDialogSingleSourceMessage": "Некаторыя файлы ў тэчцы прызначэння маюць аднолькавыя назвы.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "Некаторыя файлы маюць аднолькавыя назвы.", + "@nameConflictDialogMultipleSourceMessage": {}, + "setCoverDialogLatest": "Апошні элемент", + "@setCoverDialogLatest": {}, + "vaultDialogLockModeWhenScreenOff": "Блакіроўка пры выключэнні экрана", + "@vaultDialogLockModeWhenScreenOff": {}, + "wallpaperTargetHome": "Галоўны экран", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "Экран блакіроўкі", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "На абодва экраны", + "@wallpaperTargetHomeLock": {}, + "widgetTapUpdateWidget": "Абнавіць віджэт", + "@widgetTapUpdateWidget": {}, + "storageVolumeDescriptionFallbackPrimary": "Унутраная памяць", + "@storageVolumeDescriptionFallbackPrimary": {}, + "restrictedAccessDialogMessage": "Гэтай праграме забаронена змяняць файлы ў {directory} «{volume}».\n\nКаб перамясціць элементы ў іншую дырэкторыю, выкарыстоўвайце папярэдне ўсталяваны дыспетчар файлаў або праграму галерэі.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "missingSystemFilePickerDialogMessage": "Сістэмная праграма выбару файлаў адсутнічае ці адключана. Калі ласка, уключыце яе і паспрабуйце яшчэ раз.", + "@missingSystemFilePickerDialogMessage": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Гэта аперацыя не падтрымліваецца для элементаў наступнага тыпу: {types}.} other{Гэта аперацыя не падтрымліваецца для элементаў наступных тыпаў: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "addShortcutDialogLabel": "Назва ярлыка", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "ДАДАЦЬ", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "Няма праграм, якія б з гэтым справіліся.", + "@noMatchingAppDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "Захаваць даты элементаў, перш чым працягнуць?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Захаваць даты", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Вы хочаце аднавіць прайграванне на {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "videoStartOverButtonLabel": "ПАЧАЦЬ НАНАВА", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "АДНАВІЦЬ", + "@videoResumeButtonLabel": {}, + "setCoverDialogAuto": "Аўто", + "@setCoverDialogAuto": {}, + "newAlbumDialogTitle": "Новы альбом", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Назва альбома", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Каталог ўжо існуе", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Захоўванне:", + "@newAlbumDialogStorageLabel": {}, + "newVaultDialogTitle": "Новае сховішча", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "Наладзьце сховішча", + "@configureVaultDialogTitle": {}, + "vaultDialogLockTypeLabel": "Тып блакіроўкі", + "@vaultDialogLockTypeLabel": {}, + "pinDialogEnter": "Увядзіце PIN-код", + "@pinDialogEnter": {}, + "patternDialogEnter": "Увядзіце ключ", + "@patternDialogEnter": {}, + "patternDialogConfirm": "Пацвердзіце графічны ключ", + "@patternDialogConfirm": {}, + "pinDialogConfirm": "Пацвердзіце PIN-код", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "Увядзіце пароль", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Пацвердзіце пароль", + "@passwordDialogConfirm": {}, + "authenticateToConfigureVault": "Прайдзіце аўтэнтыфікацыю, каб наладзіць сховішча", + "@authenticateToConfigureVault": {}, + "authenticateToUnlockVault": "Прайдзіце аўтэнтыфікацыю, каб разблакіраваць сховішча", + "@authenticateToUnlockVault": {}, + "statsTopTagsSectionTitle": "Лепшыя тэгі", + "@statsTopTagsSectionTitle": {}, + "statsTopPlacesSectionTitle": "Лепшыя месцы", + "@statsTopPlacesSectionTitle": {}, + "viewerInfoSearchSuggestionDescription": "Апісанне", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDate": "Дата і час", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoViewXmlLinkText": "Прагляд XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoOpenLinkText": "Адкрыць", + "@viewerInfoOpenLinkText": {}, + "mapAttributionStamen": "Пліткі ад [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "mapPointNorthUpTooltip": "Пакажыце поўнач уверх", + "@mapPointNorthUpTooltip": {}, + "viewerInfoLabelCoordinates": "Каардынаты", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelOwner": "Уладальнік", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelDuration": "Працягласць", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelPath": "Шлях", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelResolution": "Разрозненне", + "@viewerInfoLabelResolution": {}, + "viewerInfoBackToViewerTooltip": "Вярнуцца да аглядальніка", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoPageTitle": "Інфармацыя", + "@viewerInfoPageTitle": {}, + "viewerErrorDoesNotExist": "Файл больш не існуе.", + "@viewerErrorDoesNotExist": {}, + "sourceViewerPageTitle": "Крыніца", + "@sourceViewerPageTitle": {}, + "panoramaDisableSensorControl": "Адключыць сэнсарнае кіраванне", + "@panoramaDisableSensorControl": {}, + "panoramaEnableSensorControl": "Уключыць сэнсарнае кіраванне", + "@panoramaEnableSensorControl": {}, + "tagPlaceholderPlace": "Месца", + "@tagPlaceholderPlace": {}, + "tagPlaceholderState": "Дзяржава", + "@tagPlaceholderState": {}, + "tagEditorSectionPlaceholders": "Запаўняльнікі", + "@tagEditorSectionPlaceholders": {}, + "tagEditorSectionRecent": "Апошнія", + "@tagEditorSectionRecent": {}, + "tagEditorPageAddTagTooltip": "Дадаць тэг", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorPageNewTagFieldLabel": "Новы тэг", + "@tagEditorPageNewTagFieldLabel": {}, + "wallpaperUseScrollEffect": "Выкарыстоўвайце эфект пракруткі на галоўным экране", + "@wallpaperUseScrollEffect": {}, + "viewerInfoSearchSuggestionResolution": "Разрозненне", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionDimensions": "Памеры", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerErrorUnknown": "Ой!", + "@viewerErrorUnknown": {}, + "viewerSetWallpaperButtonLabel": "УСТАНАВІЦЬ ШПАЛЕРЫ", + "@viewerSetWallpaperButtonLabel": {}, + "statsTopAlbumsSectionTitle": "Лепшыя альбомы", + "@statsTopAlbumsSectionTitle": {}, + "viewerInfoUnknown": "невядома", + "@viewerInfoUnknown": {}, + "viewerInfoLabelTitle": "Назва", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDescription": "Апісанне", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelDate": "Дата", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelAddress": "Адрас", + "@viewerInfoLabelAddress": {}, + "mapZoomInTooltip": "Павелічэнне", + "@mapZoomInTooltip": {}, + "mapStyleTooltip": "Выберыце стыль карты", + "@mapStyleTooltip": {}, + "mapStyleDialogTitle": "Стыль карты", + "@mapStyleDialogTitle": {}, + "mapZoomOutTooltip": "Змяншэння", + "@mapZoomOutTooltip": {}, + "openMapPageTooltip": "Паглядзець на старонцы карты", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "Няма малюнкаў у гэтым рэгіёне", + "@mapEmptyRegion": {}, + "viewerInfoSearchEmpty": "Няма адпаведных ключоў", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchFieldLabel": "Пошук метададзеных", + "@viewerInfoSearchFieldLabel": {}, + "tagEditorPageTitle": "Рэдагаваць тэгі", + "@tagEditorPageTitle": {}, + "tagEditorDiscardDialogMessage": "Вы хочаце адмяніць змены?", + "@tagEditorDiscardDialogMessage": {}, + "tagPlaceholderCountry": "Краіна", + "@tagPlaceholderCountry": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Не ўдалося атрымаць убудаваныя даныя", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "mapAttributionOsmHot": "Пліткі ад [HOT](https://www.hotosm.org/) • Арганізаваны [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "viewerInfoLabelSize": "Памер", + "@viewerInfoLabelSize": {}, + "viewerTransitionSlide": "Слізгаценне", + "@viewerTransitionSlide": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "overlayHistogramNone": "Не", + "@overlayHistogramNone": {}, + "overlayHistogramLuminance": "Яркасць", + "@overlayHistogramLuminance": {}, + "widgetOpenPageViewer": "Адкрыйце аглядальнік", + "@widgetOpenPageViewer": {}, + "widgetOpenPageHome": "Адкрыйце галоўную старонку", + "@widgetOpenPageHome": {}, + "viewerTransitionZoomIn": "Павялічыць", + "@viewerTransitionZoomIn": {}, + "widgetOpenPageCollection": "Адкрыць калекцыю", + "@widgetOpenPageCollection": {}, + "viewerTransitionNone": "Нічога", + "@viewerTransitionNone": {}, + "viewerTransitionFade": "Згасанне", + "@viewerTransitionFade": {}, + "widgetDisplayedItemRandom": "Выпадковы", + "@widgetDisplayedItemRandom": {}, + "viewerOpenPanoramaButtonLabel": "АДКРЫЦЬ ПАНАРАМУ", + "@viewerOpenPanoramaButtonLabel": {}, + "aboutDataUsageCache": "Кэш", + "@aboutDataUsageCache": {}, + "statsTopStatesSectionTitle": "Топ краін", + "@statsTopStatesSectionTitle": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "aboutDataUsageClearCache": "Ачысціць кэш", + "@aboutDataUsageClearCache": {}, + "viewerInfoSearchSuggestionRights": "Правы", + "@viewerInfoSearchSuggestionRights": {}, + "setCoverDialogCustom": "Свая", + "@setCoverDialogCustom": {}, + "aboutBugCopyInfoInstruction": "Скапіяваць сістэмную інфармацыю", + "@aboutBugCopyInfoInstruction": {}, + "vaultBinUsageDialogMessage": "Некаторыя сховішчы выкарыстоўваюць сметніцу.", + "@vaultBinUsageDialogMessage": {}, + "aboutBugSaveLogInstruction": "Захавайце логі праграмы ў файл", + "@aboutBugSaveLogInstruction": {}, + "aboutBugReportInstruction": "Адправіць справаздачу аб памылцы на GitHub разам з журналамі і сістэмнай інфармацыяй", + "@aboutBugReportInstruction": {}, + "entryActionCast": "Трансляцыя", + "@entryActionCast": {}, + "hideFilterConfirmationDialogMessage": "Адпаведныя фота і відэа будуць схаваны з вашай калекцыі. Вы можаце паказаць іх зноў у наладах «Прыватнасць».\n\nВы ўпэўнены, што хочаце іх схаваць?", + "@hideFilterConfirmationDialogMessage": {}, + "renameEntrySetPagePatternFieldLabel": "Шаблон наймення", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameAlbumDialogLabel": "Новая назва", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Каталог ужо існуе", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "aboutBugReportButton": "Адправіць справаздачу", + "@aboutBugReportButton": {}, + "renameEntrySetPageTitle": "Перайменаваць", + "@renameEntrySetPageTitle": {}, + "aboutBugSectionTitle": "Паведаміць пра памылку", + "@aboutBugSectionTitle": {}, + "aboutBugCopyInfoButton": "Скапіяваць", + "@aboutBugCopyInfoButton": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Перамясціць гэты элемент у сметніцу?} few{Перамясціць гэтыя {count} элемента ў сметніцу?} other{Перамясціць гэтыя {count} элементаў у сметніцу?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsLanguageTile": "Мова", + "@settingsLanguageTile": {}, + "settingsRemoveAnimationsDialogTitle": "Выдаліць анімацыі", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsDisplayUseTvInterface": "Інтэрфейс Android TV", + "@settingsDisplayUseTvInterface": {}, + "settingsTimeToTakeActionTile": "Час выканання", + "@settingsTimeToTakeActionTile": {}, + "exportEntryDialogFormat": "Фармат:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogQuality": "Якасць", + "@exportEntryDialogQuality": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Выдаліць гэты элемент?} few{Выдаліць гэтыя {count} элемента?} other{Выдаліць гэтыя {count} элементаў?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editEntryDateDialogTitle": "Дата і час", + "@editEntryDateDialogTitle": {}, + "statsTopCountriesSectionTitle": "Топ Краін", + "@statsTopCountriesSectionTitle": {}, + "settingsWidgetDisplayedItem": "Адлюстраваны элемент", + "@settingsWidgetDisplayedItem": {}, + "settingsLanguagePageTitle": "Мова", + "@settingsLanguagePageTitle": {}, + "settingsWidgetOpenPage": "Пры націску на віджэт", + "@settingsWidgetOpenPage": {}, + "renameProcessorName": "Імя", + "@renameProcessorName": {}, + "exportEntryDialogHeight": "Вышыня", + "@exportEntryDialogHeight": {}, + "exportEntryDialogWidth": "Шырыня", + "@exportEntryDialogWidth": {}, + "settingsWidgetShowOutline": "Вылучэнне", + "@settingsWidgetShowOutline": {}, + "settingsScreenSaverPageTitle": "Застаўка на экран", + "@settingsScreenSaverPageTitle": {}, + "settingsDisplayRefreshRateModeTile": "Частата абнаўлення экрана", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsCoordinateFormatDialogTitle": "Фармат каардынат", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Адзінкі вымярэння", + "@settingsUnitSystemTile": {}, + "settingsCoordinateFormatTile": "Фармат каардынат", + "@settingsCoordinateFormatTile": {}, + "newVaultWarningDialogMessage": "Элементы ў сховішчах даступныя толькі гэтай праграме і нікому больш.\n\nКалі вы выдаліце гэту праграму або ачысціце даныя праграмы, вы страціце ўсе гэтыя элементы.", + "@newVaultWarningDialogMessage": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Частата абнаўлення", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Паказваць альтэрнатывы мультисенсорным жэстам", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsLanguageSectionTitle": "Мова і фарматы", + "@settingsLanguageSectionTitle": {}, + "renameEntrySetPagePreviewSectionTitle": "Папярэдні прагляд", + "@renameEntrySetPagePreviewSectionTitle": {}, + "settingsDisplaySectionTitle": "Адлюстраванне", + "@settingsDisplaySectionTitle": {}, + "settingsWidgetPageTitle": "Фотарамка", + "@settingsWidgetPageTitle": {}, + "editEntryDialogTargetFieldsHeader": "Поля для рэдагавання", + "@editEntryDialogTargetFieldsHeader": {}, + "renameProcessorCounter": "Лічыльнік", + "@renameProcessorCounter": {}, + "statsPageTitle": "Статыстыка", + "@statsPageTitle": {}, + "settingsUnitSystemDialogTitle": "Адзінкі вымярэння", + "@settingsUnitSystemDialogTitle": {}, + "editEntryDialogCopyFromItem": "Скапіяваць з іншага элемента", + "@editEntryDialogCopyFromItem": {}, + "settingsThemeEnableDynamicColor": "Дынамічны колер", + "@settingsThemeEnableDynamicColor": {}, + "renameEntryDialogLabel": "Новая назва", + "@renameEntryDialogLabel": {}, + "renameEntrySetPageInsertTooltip": "Поле для ўстаўкі", + "@renameEntrySetPageInsertTooltip": {}, + "settingsThemeBrightnessTile": "Тэма", + "@settingsThemeBrightnessTile": {}, + "settingsSystemDefault": "Як ў сістэме", + "@settingsSystemDefault": {}, + "settingsCollectionTile": "Калекцыя", + "@settingsCollectionTile": {}, + "settingsThemeBrightnessDialogTitle": "Тэма", + "@settingsThemeBrightnessDialogTitle": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Выдаліць гэты альбом і элемент у ім?} few{Выдаліць гэты альбом і {count} элементы ў ім?} other{Выдаліць гэты альбом і {count} элементаў у ім?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsThemeColorHighlights": "Каляровыя акцэнты", + "@settingsThemeColorHighlights": {}, + "exportEntryDialogWriteMetadata": "Запісаць метададзеныя", + "@exportEntryDialogWriteMetadata": {}, + "aboutCreditsWorldAtlas2": "пад ліцэнзіяй ISC.", + "@aboutCreditsWorldAtlas2": {}, + "settingsPrivacySectionTitle": "Канфідэнцыяльнасць", + "@settingsPrivacySectionTitle": {}, + "albumScreenRecordings": "Запісы экрана", + "@albumScreenRecordings": {}, + "editEntryRatingDialogTitle": "Рэйтынг", + "@editEntryRatingDialogTitle": {}, + "aboutDataUsageMisc": "Розныя", + "@aboutDataUsageMisc": {}, + "albumVideoCaptures": "Відэазапісы", + "@albumVideoCaptures": {}, + "editEntryDateDialogSetCustom": "Устанавіць дату", + "@editEntryDateDialogSetCustom": {}, + "settingsSearchEmpty": "Няма адпаведнай налады", + "@settingsSearchEmpty": {}, + "removeEntryMetadataDialogMore": "Больш", + "@removeEntryMetadataDialogMore": {}, + "tooManyItemsErrorDialogMessage": "Паўтарыце спробу з меншай колькасцю элементаў.", + "@tooManyItemsErrorDialogMessage": {}, + "collectionActionEdit": "Рэдагаваць", + "@collectionActionEdit": {}, + "sortOrderLargestFirst": "Спачатку вялікія", + "@sortOrderLargestFirst": {}, + "editEntryDateDialogSourceFileModifiedDate": "Дата змены файла", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "collectionEmptyFavourites": "Няма абраных", + "@collectionEmptyFavourites": {}, + "removeEntryMetadataDialogTitle": "Выдаленне метададзеных", + "@removeEntryMetadataDialogTitle": {}, + "drawerCollectionVideos": "Відэа", + "@drawerCollectionVideos": {}, + "countryEmpty": "Няма краін", + "@countryEmpty": {}, + "collectionSelectSectionTooltip": "Выбраць раздзел", + "@collectionSelectSectionTooltip": {}, + "aboutLicensesBanner": "Гэта праграма выкарыстоўвае наступныя пакеты і бібліятэкі з адкрытым зыходным кодам.", + "@aboutLicensesBanner": {}, + "dateYesterday": "Учора", + "@dateYesterday": {}, + "aboutDataUsageDatabase": "База дадзеных", + "@aboutDataUsageDatabase": {}, + "tileLayoutMosaic": "Мазаіка", + "@tileLayoutMosaic": {}, + "collectionDeselectSectionTooltip": "Адмяніць выбар раздзела", + "@collectionDeselectSectionTooltip": {}, + "settingsKeepScreenOnTile": "Трымаць экран уключаным", + "@settingsKeepScreenOnTile": {}, + "tileLayoutGrid": "Сетка", + "@tileLayoutGrid": {}, + "aboutCreditsWorldAtlas1": "Гэта праграма выкарыстоўвае файл TopoJSON з", + "@aboutCreditsWorldAtlas1": {}, + "appExportCovers": "Вокладкі", + "@appExportCovers": {}, + "createAlbumButtonLabel": "СТВАРЫЦЬ", + "@createAlbumButtonLabel": {}, + "menuActionSlideshow": "Слайд-шоў", + "@menuActionSlideshow": {}, + "settingsConfirmationDialogTitle": "Дыялогі пацверджання", + "@settingsConfirmationDialogTitle": {}, + "videoStreamSelectionDialogText": "Субтытры", + "@videoStreamSelectionDialogText": {}, + "editEntryDateDialogShift": "Зрух", + "@editEntryDateDialogShift": {}, + "appExportSettings": "Налады", + "@appExportSettings": {}, + "searchPlacesSectionTitle": "Месцы", + "@searchPlacesSectionTitle": {}, + "videoStreamSelectionDialogAudio": "Аўдыё", + "@videoStreamSelectionDialogAudio": {}, + "videoSpeedDialogLabel": "Хуткасць прайгравання", + "@videoSpeedDialogLabel": {}, + "editEntryLocationDialogSetCustom": "Рэдагаваць месцазнаходжанне", + "@editEntryLocationDialogSetCustom": {}, + "placeEmpty": "Няма месцаў", + "@placeEmpty": {}, + "editEntryDateDialogExtractFromTitle": "Выняць з назвы", + "@editEntryDateDialogExtractFromTitle": {}, + "aboutLinkLicense": "Ліцэнзія", + "@aboutLinkLicense": {}, + "albumScreenshots": "Скрыншоты", + "@albumScreenshots": {}, + "editEntryLocationDialogLongitude": "Даўгата", + "@editEntryLocationDialogLongitude": {}, + "searchCountriesSectionTitle": "Краіны", + "@searchCountriesSectionTitle": {}, + "settingsAskEverytime": "Пытацца кожны раз", + "@settingsAskEverytime": {}, + "editEntryDateDialogCopyField": "Скапіяваць з іншай даты", + "@editEntryDateDialogCopyField": {}, + "searchTagsSectionTitle": "Тэгі", + "@searchTagsSectionTitle": {}, + "settingsModificationWarningDialogMessage": "Іншыя налады будуць зменены.", + "@settingsModificationWarningDialogMessage": {}, + "policyPageTitle": "Палітыка канфідэнцыяльнасці", + "@policyPageTitle": {}, + "tileLayoutList": "Спіс", + "@tileLayoutList": {}, + "appPickDialogNone": "Нічога", + "@appPickDialogNone": {}, + "settingsActionExport": "Экспарт", + "@settingsActionExport": {}, + "sortOrderOldestFirst": "Спачатку самы стары", + "@sortOrderOldestFirst": {}, + "coverDialogTabApp": "Праграма", + "@coverDialogTabApp": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP патрабуецца для прайгравання відэа ўнутры фота з рухам.\n\nВы ўпэўнены, што хочаце выдаліць яго?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "tagPageTitle": "Тэгі", + "@tagPageTitle": {}, + "collectionEmptyVideos": "Няма відэа", + "@collectionEmptyVideos": {}, + "aboutCreditsSectionTitle": "Падзякі", + "@aboutCreditsSectionTitle": {}, + "drawerAlbumPage": "Альбомы", + "@drawerAlbumPage": {}, + "settingsActionImport": "Імпарт", + "@settingsActionImport": {}, + "locationPickerUseThisLocationButton": "Выкарыстоўваць гэтае месцазнаходжанне", + "@locationPickerUseThisLocationButton": {}, + "searchRatingSectionTitle": "Рэйтынгі", + "@searchRatingSectionTitle": {}, + "settingsDisabled": "Адкл.", + "@settingsDisabled": {}, + "settingsActionImportDialogTitle": "Імпарт", + "@settingsActionImportDialogTitle": {}, + "albumGroupTier": "Па ўзроўні", + "@albumGroupTier": {}, + "drawerCollectionAll": "Уся калекцыя", + "@drawerCollectionAll": {}, + "sortByItemCount": "Па колькасці элементаў", + "@sortByItemCount": {}, + "sectionUnknown": "Невядома", + "@sectionUnknown": {}, + "dateToday": "Сёння", + "@dateToday": {}, + "videoStreamSelectionDialogNoSelection": "Іншых трэкаў няма.", + "@videoStreamSelectionDialogNoSelection": {}, + "searchRecentSectionTitle": "Апошнія", + "@searchRecentSectionTitle": {}, + "albumPickPageTitlePick": "Выбраць Альбом", + "@albumPickPageTitlePick": {}, + "menuActionMap": "Карта", + "@menuActionMap": {}, + "collectionActionMove": "Перамясціць у альбом", + "@collectionActionMove": {}, + "searchAlbumsSectionTitle": "Альбомы", + "@searchAlbumsSectionTitle": {}, + "viewDialogGroupSectionTitle": "Групоўка", + "@viewDialogGroupSectionTitle": {}, + "aboutDataUsageSectionTitle": "Выкарыстанне дадзеных", + "@aboutDataUsageSectionTitle": {}, + "durationDialogSeconds": "Секунды", + "@durationDialogSeconds": {}, + "albumEmpty": "Няма альбомаў", + "@albumEmpty": {}, + "editEntryLocationDialogChooseOnMap": "Выбраць на карце", + "@editEntryLocationDialogChooseOnMap": {}, + "sortByName": "Па назве", + "@sortByName": {}, + "settingsHomeDialogTitle": "Галоўная", + "@settingsHomeDialogTitle": {}, + "searchDateSectionTitle": "Дата", + "@searchDateSectionTitle": {}, + "collectionSearchTitlesHintText": "Пошук загалоўкаў", + "@collectionSearchTitlesHintText": {}, + "searchCollectionFieldHint": "Пошук калекцый", + "@searchCollectionFieldHint": {}, + "settingsDoubleBackExit": "Двойчы націсніце «назад», каб выйсці", + "@settingsDoubleBackExit": {}, + "drawerCollectionSphericalVideos": "360° Відэа", + "@drawerCollectionSphericalVideos": {}, + "searchMetadataSectionTitle": "Метададзеныя", + "@searchMetadataSectionTitle": {}, + "collectionActionEmptyBin": "Ачысціць сметніцу", + "@collectionActionEmptyBin": {}, + "sortOrderAtoZ": "Ад А да Я", + "@sortOrderAtoZ": {}, + "videoStreamSelectionDialogTrack": "Трэк", + "@videoStreamSelectionDialogTrack": {}, + "settingsHomeTile": "Галоўная", + "@settingsHomeTile": {}, + "collectionGroupDay": "Па днях", + "@collectionGroupDay": {}, + "collectionGroupAlbum": "Па альбоме", + "@collectionGroupAlbum": {}, + "newFilterBanner": "новы", + "@newFilterBanner": {}, + "drawerCollectionFavourites": "Абраныя", + "@drawerCollectionFavourites": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Пакеты Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "statePageTitle": "Штаты", + "@statePageTitle": {}, + "drawerTagPage": "Тэгі", + "@drawerTagPage": {}, + "durationDialogMinutes": "Хвіліны", + "@durationDialogMinutes": {}, + "albumPageTitle": "Альбомы", + "@albumPageTitle": {}, + "editEntryLocationDialogTitle": "Месцазнаходжанне", + "@editEntryLocationDialogTitle": {}, + "albumPickPageTitleCopy": "Капіяваць у альбом", + "@albumPickPageTitleCopy": {}, + "collectionActionCopy": "Скапіяваць у альбом", + "@collectionActionCopy": {}, + "viewDialogReverseSortOrder": "Адваротны парадак сартавання", + "@viewDialogReverseSortOrder": {}, + "menuActionConfigureView": "Выгляд", + "@menuActionConfigureView": {}, + "aboutLicensesDartPackagesSectionTitle": "Пакеты Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, + "drawerCollectionMotionPhotos": "Фота з рухам", + "@drawerCollectionMotionPhotos": {}, + "settingsDefault": "Па змаўчанні", + "@settingsDefault": {}, + "placePageTitle": "Месцы", + "@placePageTitle": {}, + "tagEmpty": "Няма тэгаў", + "@tagEmpty": {}, + "collectionActionShowTitleSearch": "Паказаць фільтр загалоўка", + "@collectionActionShowTitleSearch": {}, + "menuActionSelectAll": "Выбраць усе", + "@menuActionSelectAll": {}, + "settingsConfirmationTile": "Дыялогі пацверджання", + "@settingsConfirmationTile": {}, + "albumMimeTypeMixed": "Змешаны", + "@albumMimeTypeMixed": {}, + "aboutLinkPolicy": "Палітыка канфідэнцыяльнасці", + "@aboutLinkPolicy": {}, + "sortOrderLowestFirst": "Спачатку з нізкім", + "@sortOrderLowestFirst": {}, + "countryPageTitle": "Краіны", + "@countryPageTitle": {}, + "albumGroupType": "Па тыпу", + "@albumGroupType": {}, + "albumCamera": "Камера", + "@albumCamera": {}, + "settingsNavigationSectionTitle": "Навігацыя", + "@settingsNavigationSectionTitle": {}, + "collectionActionHideTitleSearch": "Схаваць фільтр загалоўка", + "@collectionActionHideTitleSearch": {}, + "drawerCollectionAnimated": "Анімацыі", + "@drawerCollectionAnimated": {}, + "durationDialogHours": "Гадзіны", + "@durationDialogHours": {}, + "settingsKeepScreenOnDialogTitle": "Трымаць экран уключаным", + "@settingsKeepScreenOnDialogTitle": {}, + "drawerPlacePage": "Месцы", + "@drawerPlacePage": {}, + "menuActionSelect": "Выбраць", + "@menuActionSelect": {}, + "drawerCollectionPanoramas": "Панарамы", + "@drawerCollectionPanoramas": {}, + "settingsPageTitle": "Налады", + "@settingsPageTitle": {}, + "menuActionSelectNone": "Зняць вылучэнне", + "@menuActionSelectNone": {}, + "settingsSearchFieldLabel": "Пошук налад", + "@settingsSearchFieldLabel": {}, + "appExportFavourites": "Абранае", + "@appExportFavourites": {}, + "collectionEmptyImages": "Няма выяў", + "@collectionEmptyImages": {}, + "albumPickPageTitleExport": "Экспарт у альбом", + "@albumPickPageTitleExport": {}, + "settingsActionExportDialogTitle": "Экспарт", + "@settingsActionExportDialogTitle": {}, + "genericDangerWarningDialogMessage": "Вы ўпэўнены?", + "@genericDangerWarningDialogMessage": {}, + "aboutDataUsageExternal": "Знешні", + "@aboutDataUsageExternal": {}, + "collectionSelectPageTitle": "Выбраць элементы", + "@collectionSelectPageTitle": {}, + "editEntryLocationDialogLatitude": "Шырата", + "@editEntryLocationDialogLatitude": {}, + "collectionActionRescan": "Паўторнае сканаванне", + "@collectionActionRescan": {}, + "viewDialogSortSectionTitle": "Сартаваць", + "@viewDialogSortSectionTitle": {}, + "collectionPageTitle": "Калекцыя", + "@collectionPageTitle": {}, + "collectionActionAddShortcut": "Дадаць ярлык", + "@collectionActionAddShortcut": {}, + "albumGroupVolume": "Па аб'ёме захоўвання", + "@albumGroupVolume": {}, + "collectionGroupMonth": "Па месяцу", + "@collectionGroupMonth": {}, + "sortByDate": "Па даце", + "@sortByDate": {}, + "sortOrderZtoA": "Ад Я да А", + "@sortOrderZtoA": {}, + "drawerAboutButton": "Пра нас", + "@drawerAboutButton": {}, + "aboutTranslatorsSectionTitle": "Перакладчыкі", + "@aboutTranslatorsSectionTitle": {}, + "videoStreamSelectionDialogOff": "Адкл.", + "@videoStreamSelectionDialogOff": {}, + "drawerCollectionImages": "Выявы", + "@drawerCollectionImages": {}, + "sortOrderSmallestFirst": "Спачатку маленькі", + "@sortOrderSmallestFirst": {}, + "sortBySize": "Па памеры", + "@sortBySize": {}, + "collectionPickPageTitle": "Выбраць", + "@collectionPickPageTitle": {}, + "collectionEmptyGrantAccessButtonLabel": "Даць доступ", + "@collectionEmptyGrantAccessButtonLabel": {}, + "videoStreamSelectionDialogVideo": "Відэа", + "@videoStreamSelectionDialogVideo": {}, + "viewDialogLayoutSectionTitle": "Макет", + "@viewDialogLayoutSectionTitle": {}, + "searchStatesSectionTitle": "Штаты", + "@searchStatesSectionTitle": {}, + "dateThisMonth": "У гэтым месяцы", + "@dateThisMonth": {}, + "aboutPageTitle": "Пра нас", + "@aboutPageTitle": {}, + "sortByRating": "Па рэйтынгу", + "@sortByRating": {}, + "stateEmpty": "Няма штатаў", + "@stateEmpty": {}, + "drawerCountryPage": "Краіны", + "@drawerCountryPage": {}, + "genericFailureFeedback": "Не атрымалася", + "@genericFailureFeedback": {}, + "aboutDataUsageData": "Дадзеныя", + "@aboutDataUsageData": {}, + "aboutDataUsageInternal": "Унутранае", + "@aboutDataUsageInternal": {}, + "albumDownload": "Загрузкі", + "@albumDownload": {}, + "coverDialogTabColor": "Колер", + "@coverDialogTabColor": {}, + "genericSuccessFeedback": "Гатова!", + "@genericSuccessFeedback": {}, + "aboutLicensesShowAllButtonLabel": "Паказаць усе ліцэнзіі", + "@aboutLicensesShowAllButtonLabel": {}, + "sortOrderNewestFirst": "Спачатку самае новае", + "@sortOrderNewestFirst": {}, + "drawerSettingsButton": "Налады", + "@drawerSettingsButton": {}, + "drawerCollectionRaws": "Raw фатаграфіі", + "@drawerCollectionRaws": {}, + "castDialogTitle": "Прылады трансляцыі", + "@castDialogTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Плагіны Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "sortOrderHighestFirst": "Спачатку з высокім", + "@sortOrderHighestFirst": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Бібліятэкі Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "binPageTitle": "Сметніца", + "@binPageTitle": {}, + "sortByAlbumFileName": "Па назве альбома і файла", + "@sortByAlbumFileName": {}, + "aboutLicensesSectionTitle": "Ліцэнзіі з адкрытым зыходным кодам", + "@aboutLicensesSectionTitle": {}, + "menuActionStats": "Статыстыка", + "@menuActionStats": {}, + "appPickDialogTitle": "Выбраць праграму", + "@appPickDialogTitle": {}, + "albumPickPageTitleMove": "Перамясціць у альбом", + "@albumPickPageTitleMove": {}, + "coverDialogTabCover": "Вокладка", + "@coverDialogTabCover": {}, + "settingsConfirmationBeforeDeleteItems": "Спытаць, перш чым выдаляць элементы назаўжды", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Спытаць, перш чым перамяшчаць прадметы без даты", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Паказваць паведамленне пасля перамяшчэння элементаў у сметніцу", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "Спытаць перад тым, як пераносіць элементы ў сметніцу", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsNavigationDrawerAddAlbum": "Дадаць альбом", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsEnableBinSubtitle": "Захоўвае выдаленыя элементы на працягу 30 дзён", + "@settingsEnableBinSubtitle": {}, + "settingsThumbnailShowRating": "Паказаць рэйтынг", + "@settingsThumbnailShowRating": {}, + "collectionExportFailureFeedback": "{count, plural, =1{Не атрымалася экспартаваць 1 старонку} few{Не атрымалася экспартаваць {count} старонкі} other{Не атрымалася экспартаваць {count} старонак}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Выраўноўванне тэксту", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsViewerSlideshowPageTitle": "Слайд-шоў", + "@settingsViewerSlideshowPageTitle": {}, + "settingsViewerSectionTitle": "Прагляднік", + "@settingsViewerSectionTitle": {}, + "settingsAllowInstalledAppAccessSubtitle": "Выкарыстоўваецца для паляпшэння адлюстравання альбомаў", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{Немагчыма перанесці 1 элемент} few{Немагчыма перанесці {count} элементы} other{Немагчыма перанесці {count} элементаў}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSubtitleThemeTextColor": "Колер тэксту", + "@settingsSubtitleThemeTextColor": {}, + "settingsVideoSectionTitle": "Відэа", + "@settingsVideoSectionTitle": {}, + "settingsSubtitleThemeBackgroundColor": "Колер фону", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsThumbnailOverlayTile": "Навязванне", + "@settingsThumbnailOverlayTile": {}, + "settingsNavigationDrawerTabPages": "Старонкі", + "@settingsNavigationDrawerTabPages": {}, + "settingsVideoAutoPlay": "Аўтапрайграванне", + "@settingsVideoAutoPlay": {}, + "settingsVideoEnableHardwareAcceleration": "Апаратнае паскарэнне", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Націсніце і ўтрымлівайце, каб перамясціць кнопкі і выбраць дзеянні, якія будуць адлюстроўвацца пры выбары элементаў.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsSlideshowShuffle": "Ператасаваць", + "@settingsSlideshowShuffle": {}, + "settingsThumbnailSectionTitle": "Мініяцюры", + "@settingsThumbnailSectionTitle": {}, + "settingsVideoShowVideos": "Паказаць відэа", + "@settingsVideoShowVideos": {}, + "settingsViewerShowInformation": "Паказаць інфармацыю", + "@settingsViewerShowInformation": {}, + "settingsCollectionQuickActionsTile": "Хуткія дзеянні", + "@settingsCollectionQuickActionsTile": {}, + "settingsViewerOverlayTile": "Навязванне", + "@settingsViewerOverlayTile": {}, + "settingsThumbnailShowFavouriteIcon": "Паказаць значок абранага", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Палажэнне тэксту", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSlideshowIntervalTile": "Інтэрвал", + "@settingsSlideshowIntervalTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Хуткія дзеянні", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsStorageAccessRevokeTooltip": "Адклікаць", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsSubtitleThemeTile": "Субтытры", + "@settingsSubtitleThemeTile": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Правядзіце пальцам уверх ці ўніз, каб наладзіць яркасць/гучнасць", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsAccessibilitySectionTitle": "Спецыяльныя магчымасці", + "@settingsAccessibilitySectionTitle": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{Не атрымалася перайменаваць 1 элемент} few{Не атрымалася перайменаваць {count} элементы} other{Не атрымалася перайменаваць {count} элементаў}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{1 элемент адрэдагаваны} few{{count} элементы адрэдагаваны} other{{count} элементаў адрэдагаваны}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsThumbnailShowMotionPhotoIcon": "Паказаць значок фота з рухам", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRawIcon": "Паказаць значок raw", + "@settingsThumbnailShowRawIcon": {}, + "settingsSlideshowFillScreen": "Запоўніць экран", + "@settingsSlideshowFillScreen": {}, + "settingsHiddenFiltersBanner": "Фота і відэа, якія адпавядаюць схаваным фільтрам, не будуць адлюстроўвацца ў вашай калекцыі.", + "@settingsHiddenFiltersBanner": {}, + "settingsVideoResumptionModeTile": "Працягнуць прайграванне", + "@settingsVideoResumptionModeTile": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{Не атрымалася скапіюваць 1 элемент} few{Не атрымалася скапіюваць {count} элементы} other{Не атрымалася скапіюваць {count} элементаў}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsVideoGestureDoubleTapTogglePlay": "Двойчы націсніце, каб прайграць/прыпыніць", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsEnableBin": "Выкарыстоўваць сметніцу", + "@settingsEnableBin": {}, + "collectionMoveSuccessFeedback": "{count, plural, =1{Перамяшчаны 1 элемент} few{Перамяшчаны {count} элементы} other{Перамяшчаны {count} элементаў}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSubtitleThemeTextAlignmentLeft": "Злева", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsVideoGestureSideDoubleTapSeek": "Двойчы націсніце на край экрана, каб перайсці назад/наперад", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsSubtitleThemeTextAlignmentRight": "Справа", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsAllowMediaManagement": "Дазволіць кіраванне мультымедыя", + "@settingsAllowMediaManagement": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Націсніце і ўтрымлівайце, каб перамясціць кнопкі і выбраць дзеянні, якія будуць адлюстроўвацца пры праглядзе элементаў.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "collectionEditFailureFeedback": "{count, plural, =1{Немагчыма адрэдагаваць 1 элемент} few{Немагчыма адрэдагаваць {count} элементы} other{Немагчыма адрэдагаваць {count} элементаў}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsThumbnailOverlayPageTitle": "Навязванне", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsViewerShowInformationSubtitle": "Паказаць назву, дату, месцазнаходжанне і г.д.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsSlideshowRepeat": "Паўтарэнне", + "@settingsSlideshowRepeat": {}, + "settingsViewerQuickActionEditorPageTitle": "Хуткія дзеянні", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsVideoPageTitle": "Налады відэа", + "@settingsVideoPageTitle": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{Перайменаваны 1 элемент} few{Перайменаваны {count} элементы} other{Перайменаваны {count} элементаў}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsViewerUseCutout": "Выкарыстоўваць вобласць выраза", + "@settingsViewerUseCutout": {}, + "settingsViewerGestureSideTapNext": "Дакраніцеся да краёў экрана, каб паказаць папярэдні/наступны элемент", + "@settingsViewerGestureSideTapNext": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Па цэнтры", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentTile": "Выраўноўванне тэксту", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsCollectionQuickActionTabSelecting": "Выбар", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsAllowErrorReporting": "Дазволіць ананімнае паведамленне пра памылкі", + "@settingsAllowErrorReporting": {}, + "settingsVideoLoopModeTile": "Цыклічны рэжым", + "@settingsVideoLoopModeTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Меню навігацыі", + "@settingsNavigationDrawerEditorPageTitle": {}, + "statsWithGps": "{count, plural, =1{1 элемент з месцазнаходжаннем} few{{count} элементы з месцазнаходжаннем} other{{count} элементаў з месцазнаходжаннем}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsVideoResumptionModeDialogTitle": "Працягнуць прайграванне", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsVideoBackgroundMode": "Фонавы рэжым", + "@settingsVideoBackgroundMode": {}, + "settingsAllowInstalledAppAccess": "Дазволіць доступ да інвентара праграм", + "@settingsAllowInstalledAppAccess": {}, + "settingsSlideshowAnimatedZoomEffect": "Аніміраваны эфект маштабавання", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsViewerOverlayPageTitle": "Навязванне", + "@settingsViewerOverlayPageTitle": {}, + "settingsNavigationDrawerTabTypes": "Тыпы", + "@settingsNavigationDrawerTabTypes": {}, + "settingsHiddenItemsTile": "Схаваныя элементы", + "@settingsHiddenItemsTile": {}, + "settingsThumbnailShowVideoDuration": "Паказаць працягласць відэа", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionBurstPatternsNone": "Без ўспышкі", + "@settingsCollectionBurstPatternsNone": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Даступныя кнопкі", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerShowDescription": "Паказаць апісанне", + "@settingsViewerShowDescription": {}, + "settingsViewerQuickActionEditorBanner": "Націсніце і ўтрымлівайце, каб перамяшчаць кнопкі і выбіраць дзеянні для адлюстравання ў праглядніку.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsDisablingBinWarningDialogMessage": "Элементы ў сметніцы будуць выдалены назаўсёды.", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Адлюстраваныя кнопкі", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsVideoPlaybackPageTitle": "Прайграванне", + "@settingsVideoPlaybackPageTitle": {}, + "settingsNavigationDrawerTile": "Меню навігацыі", + "@settingsNavigationDrawerTile": {}, + "settingsHiddenItemsPageTitle": "Схаваныя элементы", + "@settingsHiddenItemsPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "Паказаць на адкрыцці", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowShootingDetails": "Паказаць дэталі здымкі", + "@settingsViewerShowShootingDetails": {}, + "settingsConfirmationVaultDataLoss": "Паказаць папярэджанне аб страце даных сховішча", + "@settingsConfirmationVaultDataLoss": {}, + "settingsSlideshowTransitionTile": "Пераход", + "@settingsSlideshowTransitionTile": {}, + "settingsViewerMaximumBrightness": "Максімальная яркасць", + "@settingsViewerMaximumBrightness": {}, + "settingsThumbnailShowTagIcon": "Паказаць значок тэга", + "@settingsThumbnailShowTagIcon": {}, + "settingsStorageAccessEmpty": "Доступ не прадстаўлены", + "@settingsStorageAccessEmpty": {}, + "settingsRemoveAnimationsTile": "Выдаліць анімацыі", + "@settingsRemoveAnimationsTile": {}, + "settingsStorageAccessBanner": "Некаторыя каталогі патрабуюць відавочнага дазволу на змяненне файлаў у іх. Тут вы можаце прагледзець каталогі, да якіх вы раней далі доступ.", + "@settingsStorageAccessBanner": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{1 элемент скапіяваны} few{{count} элементы скапіявана} other{{count} элементаў скапіявана}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsNavigationDrawerBanner": "Націсніце і ўтрымлівайце для перамяшчэння і змены парадку пунктаў меню.", + "@settingsNavigationDrawerBanner": {}, + "settingsViewerShowMinimap": "Паказаць мінікарту", + "@settingsViewerShowMinimap": {}, + "settingsCollectionBurstPatternsTile": "Шаблоны ўспышкі", + "@settingsCollectionBurstPatternsTile": {}, + "settingsImageBackground": "Фон выявы", + "@settingsImageBackground": {}, + "settingsVideoLoopModeDialogTitle": "Цыклічны рэжым", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsViewerShowOverlayThumbnails": "Паказаць мініяцюры", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsVideoControlsPageTitle": "Элементы кіравання", + "@settingsVideoControlsPageTitle": {}, + "settingsSlideshowVideoPlaybackTile": "Прайграванне відэа", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsHiddenFiltersEmpty": "Няма схаваных фільтраў", + "@settingsHiddenFiltersEmpty": {}, + "settingsThumbnailShowLocationIcon": "Паказаць значок месцазнаходжання", + "@settingsThumbnailShowLocationIcon": {}, + "settingsStorageAccessPageTitle": "Доступ да сховішча", + "@settingsStorageAccessPageTitle": {}, + "settingsSubtitleThemeBackgroundOpacity": "Непразрыстасць фону", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsStorageAccessTile": "Доступ да сховішча", + "@settingsStorageAccessTile": {}, + "settingsViewerQuickActionEmpty": "Няма кнопак", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerSlideshowTile": "Слайд-шоў", + "@settingsViewerSlideshowTile": {}, + "settingsSubtitleThemeTextOpacity": "Непразрыстасць тэксту", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsViewerShowRatingTags": "Паказаць рэйтынг і тэгі", + "@settingsViewerShowRatingTags": {}, + "settingsViewerEnableOverlayBlurEffect": "Эфект размыцця", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsMotionPhotoAutoPlay": "Аўтаматычнае прайграванне фатаграфій з рухам", + "@settingsMotionPhotoAutoPlay": {}, + "settingsVideoControlsTile": "Элементы кіравання", + "@settingsVideoControlsTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Прайграванне відэа", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsSubtitleThemeShowOutline": "Паказаць контур і цень", + "@settingsSubtitleThemeShowOutline": {}, + "settingsNavigationDrawerTabAlbums": "Альбомы", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsViewerQuickActionsTile": "Хуткія дзеянні", + "@settingsViewerQuickActionsTile": {}, + "settingsSubtitleThemePageTitle": "Субтытры", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeTextPositionTile": "Палажэнне тэксту", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsVideoBackgroundModeDialogTitle": "Фонавы рэжым", + "@settingsVideoBackgroundModeDialogTitle": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Выдаліць гэтыя альбомы і элемент у іх?} few{Выдаліць гэтыя альбомы і {count} элементы ў іх?} other{Выдаліць гэтыя альбомы і {count} элементаў у іх?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSubtitleThemeTextSize": "Памер тэксту", + "@settingsSubtitleThemeTextSize": {}, + "settingsCollectionQuickActionTabBrowsing": "Прагляд", + "@settingsCollectionQuickActionTabBrowsing": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Не атрымалася выдаліць 1 элемент} few{Не атрымалася выдаліць {count} элементы} other{Не атрымалася выдаліць {count} элементаў}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsVideoButtonsTile": "Кнопкі", + "@settingsVideoButtonsTile": {}, + "settingsSubtitleThemeSample": "Гэта ўзор.", + "@settingsSubtitleThemeSample": {}, + "settingsSaveSearchHistory": "Захаваць гісторыю пошуку", + "@settingsSaveSearchHistory": {}, + "settingsViewerShowHistogram": "Паказаць гістаграму", + "@settingsViewerShowHistogram": {}, + "settingsVideoPlaybackTile": "Прайграванне", + "@settingsVideoPlaybackTile": {}, + "columnCount": "{count, plural, =1{{count} слупок} few{{count} слупкі} other{{count} слупкоў}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeSeconds": "{count, plural, =1{{count} секунда} few{{count} секунды} other{{count} секунд}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "timeDays": "{count, plural, =1{{count} дзень} few{{count} дні} other{{count} дзён}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "timeMinutes": "{count, plural, =1{{count} хвіліна} few{{count} хвіліны} other{{count} хвілін}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "collectionActionSetHome": "Усталяваць як галоўную", + "@collectionActionSetHome": {}, + "settingsThumbnailShowHdrIcon": "Паказаць значок HDR", + "@settingsThumbnailShowHdrIcon": {}, + "videoRepeatActionSetEnd": "Усталяваць канец", + "@videoRepeatActionSetEnd": {}, + "stopTooltip": "Спыніць", + "@stopTooltip": {}, + "videoActionABRepeat": "Паўтарыць ад А да Б", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "Усталяваць пачатак", + "@videoRepeatActionSetStart": {}, + "renameProcessorHash": "Хэш", + "@renameProcessorHash": {}, + "settingsForceWesternArabicNumeralsTile": "Прымусовыя арабскія лічбы", + "@settingsForceWesternArabicNumeralsTile": {}, + "chipActionShowCollection": "Паказаць у Калекцыі", + "@chipActionShowCollection": {}, + "chipActionGoToExplorerPage": "Паказаць у Правадыру", + "@chipActionGoToExplorerPage": {}, + "explorerPageTitle": "Правадыр", + "@explorerPageTitle": {}, + "sortByDuration": "Па працягласці", + "@sortByDuration": {}, + "sortOrderShortestFirst": "Спачатку самы кароткі", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "Спачатку самы доўгі", + "@sortOrderLongestFirst": {}, + "explorerActionSelectStorageVolume": "Выбраць сховішча", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "Выбраць сховішча", + "@selectStorageVolumeDialogTitle": {}, + "setHomeCustom": "Па-свойму", + "@setHomeCustom": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Пліткі ад [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "mapAttributionOsmData": "Даныя карты © [OpenStreetMap](https://www.openstreetmap.org/copyright) удзельнікі", + "@mapAttributionOsmData": {} +} diff --git a/lib/l10n/app_bg.arb b/lib/l10n/app_bg.arb new file mode 100644 index 0000000..4fa4242 --- /dev/null +++ b/lib/l10n/app_bg.arb @@ -0,0 +1,1670 @@ +{ + "nameConflictStrategyReplace": "Замени", + "@nameConflictStrategyReplace": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "subtitlePositionBottom": "Отдолу", + "@subtitlePositionBottom": {}, + "subtitlePositionTop": "Най-отгоре", + "@subtitlePositionTop": {}, + "vaultLockTypePassword": "Парола", + "@vaultLockTypePassword": {}, + "videoLoopModeShortOnly": "Само за кратки видеа", + "@videoLoopModeShortOnly": {}, + "videoResumptionModeAlways": "Винаги", + "@videoResumptionModeAlways": {}, + "viewerTransitionZoomIn": "Приближения", + "@viewerTransitionZoomIn": {}, + "viewerTransitionNone": "Не", + "@viewerTransitionNone": {}, + "widgetOpenPageCollection": "Отвори колекция", + "@widgetOpenPageCollection": {}, + "restrictedAccessDialogMessage": "На това приложение не се дава достъп до {directory} на „{volume}“.\n\nМоля използвайте системно инсталиран файлов мениджър или Галерия за преместване на елементи в друга директория.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "missingSystemFilePickerDialogMessage": "Системното файлово приложение е изключено или липсва. Моля разрешете го и опитайте отново.", + "@missingSystemFilePickerDialogMessage": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Тази операция не се поддържа за елементи от следния тип: {types}.} other{Тази операция не се поддържа за елементи от следните типове: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "nameConflictDialogMultipleSourceMessage": "Някои файлове имат еднакво име.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutButtonLabel": "ДОБАВИ", + "@addShortcutButtonLabel": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Преместване на този елемент в кошчето?} other{Преместване на тези {count} елемента в кошчето?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "moveUndatedConfirmationDialogMessage": "Запазвам ли датите на елементите преди продължаване?", + "@moveUndatedConfirmationDialogMessage": {}, + "setCoverDialogAuto": "Авто", + "@setCoverDialogAuto": {}, + "hideFilterConfirmationDialogMessage": "Съответстващите снимки и видеоклипове ще бъдат скрити от вашата колекция. Можете да ги покажете отново от настройките „Поверителност“.\n\nСигурни ли сте, че искате да ги скриете?", + "@hideFilterConfirmationDialogMessage": {}, + "newVaultWarningDialogMessage": "Елементите в трезорите са достъпни само за това приложение и за никое друго.\n\nАко деинсталирате или изчистите данните на това приложение, ще загубите цялото съдържание на трезора.", + "@newVaultWarningDialogMessage": {}, + "authenticateToConfigureVault": "Удостоверете се, за да конфигурирате трезора", + "@authenticateToConfigureVault": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Съществуваща директория", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Преименувай", + "@renameEntrySetPageTitle": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Изтриване на този албум и елемента в него?} other{Изтриване на този албум и {count} елементите в него?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Изтриване на тези албуми и елемента в тях?} other{Изтриване на тези албуми и {count} елементите в тях?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "editEntryDateDialogSourceFileModifiedDate": "Дата на промяна на файла", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "editEntryRatingDialogTitle": "Рейтинг", + "@editEntryRatingDialogTitle": {}, + "editEntryLocationDialogLatitude": "Широчина", + "@editEntryLocationDialogLatitude": {}, + "locationPickerUseThisLocationButton": "Използвай това местоположение", + "@locationPickerUseThisLocationButton": {}, + "videoStreamSelectionDialogText": "Субтитри", + "@videoStreamSelectionDialogText": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP е необходим за възпроизвеждане на видеоклипа в снимка с движение.\n\nСигурни ли сте, че искате да го премахнете?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "videoStreamSelectionDialogVideo": "Видео", + "@videoStreamSelectionDialogVideo": {}, + "menuActionSelect": "Избери", + "@menuActionSelect": {}, + "menuActionSelectAll": "Избери всички", + "@menuActionSelectAll": {}, + "menuActionMap": "Карта", + "@menuActionMap": {}, + "menuActionStats": "Статистика", + "@menuActionStats": {}, + "viewDialogGroupSectionTitle": "Групиране", + "@viewDialogGroupSectionTitle": {}, + "appPickDialogNone": "Нищо", + "@appPickDialogNone": {}, + "aboutBugCopyInfoButton": "Копирай", + "@aboutBugCopyInfoButton": {}, + "aboutDataUsageSectionTitle": "Използване на данни", + "@aboutDataUsageSectionTitle": {}, + "aboutTranslatorsSectionTitle": "Преводачи", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesBanner": "Това приложение използва следните пакети и библиотеки с отворен код.", + "@aboutLicensesBanner": {}, + "collectionPageTitle": "Колекция", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "Избери", + "@collectionPickPageTitle": {}, + "collectionActionHideTitleSearch": "Скрий филтъра на заглавието", + "@collectionActionHideTitleSearch": {}, + "collectionActionSetHome": "Задай като начален", + "@collectionActionSetHome": {}, + "collectionActionRescan": "Сканирай наново", + "@collectionActionRescan": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Неуспешно изтриване на 1 елемент} other{Неуспешно изтриване на {count} елемента}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "dateThisMonth": "Този месец", + "@dateThisMonth": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{Неуспешно копиране на 1 елемент} other{Неуспешно копиране на {count} елемента}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{Неуспешно преместване на 1 елемент} other{Неуспешно преместване на {count} елемента}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{Редактиран 1 елемент} other{Редактирани{count} елемента}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{Неуспешно редактиране на 1 елемент} other{Неуспешно редактиране на {count} елемента}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{Неуспешно експортиране на 1 страница} other{Неуспешно експортиране на {count} страници}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "drawerCollectionVideos": "Видео", + "@drawerCollectionVideos": {}, + "collectionMoveSuccessFeedback": "{count, plural, =1{Преместен 1 елемент} other{Преместени{count} елемента}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "drawerCollectionSphericalVideos": "360° видео", + "@drawerCollectionSphericalVideos": {}, + "drawerCountryPage": "Държави", + "@drawerCountryPage": {}, + "newFilterBanner": "Нов", + "@newFilterBanner": {}, + "sortOrderShortestFirst": "Първо най-кратките", + "@sortOrderShortestFirst": {}, + "albumGroupTier": "По нива", + "@albumGroupTier": {}, + "explorerPageTitle": "Файлов мениджър", + "@explorerPageTitle": {}, + "explorerActionSelectStorageVolume": "Избери място за съхранение", + "@explorerActionSelectStorageVolume": {}, + "settingsAskEverytime": "Питай всеки път", + "@settingsAskEverytime": {}, + "settingsDefault": "По подразбиране", + "@settingsDefault": {}, + "settingsModificationWarningDialogMessage": "Другите настройки ще бъдат модифицирани.", + "@settingsModificationWarningDialogMessage": {}, + "settingsActionExport": "Експортиране", + "@settingsActionExport": {}, + "appExportCovers": "Тапети", + "@appExportCovers": {}, + "settingsNavigationSectionTitle": "Навигация", + "@settingsNavigationSectionTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Попитай преди изтриване завинаги", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationVaultDataLoss": "Показване на предупреждение за загуба на данни от трезора", + "@settingsConfirmationVaultDataLoss": {}, + "videoActionSkip10": "Превъртане 10 секунди напред", + "@videoActionSkip10": {}, + "entryActionRotateScreen": "Завъртане на екрана", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Добави в любими", + "@entryActionAddFavourite": {}, + "videoActionPause": "Пауза", + "@videoActionPause": {}, + "videoActionPlay": "Възпроизведи", + "@videoActionPlay": {}, + "videoActionCaptureFrame": "Кадър за заснемане", + "@videoActionCaptureFrame": {}, + "hideButtonLabel": "СКРИЙ", + "@hideButtonLabel": {}, + "videoActionUnmute": "Включи звук", + "@videoActionUnmute": {}, + "continueButtonLabel": "ПРОДЪЛЖИ", + "@continueButtonLabel": {}, + "clearTooltip": "Изчисти", + "@clearTooltip": {}, + "videoActionReplay10": "Превъртане 10 секунди назад", + "@videoActionReplay10": {}, + "saveCopyButtonLabel": "ЗАПАЗВАНЕ НА КОПИЕ", + "@saveCopyButtonLabel": {}, + "videoActionShowNextFrame": "Покажи следващия кадър", + "@videoActionShowNextFrame": {}, + "welcomeMessage": "Добре дошли в Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Опционално", + "@welcomeOptional": {}, + "itemCount": "{count, plural, =1{{count} елемент} few{{count} елемента} other{{count} елемента}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "focalLength": "{length} мм", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "applyButtonLabel": "ПРИЕМАМ", + "@applyButtonLabel": {}, + "nextButtonLabel": "СЛЕДВАЩ", + "@nextButtonLabel": {}, + "showButtonLabel": "ПОКАЗВАНЕ", + "@showButtonLabel": {}, + "applyTooltip": "Приеми", + "@applyTooltip": {}, + "cancelTooltip": "Отмяна", + "@cancelTooltip": {}, + "changeTooltip": "Промени", + "@changeTooltip": {}, + "previousTooltip": "Предишен", + "@previousTooltip": {}, + "showTooltip": "Покажи", + "@showTooltip": {}, + "pickTooltip": "Изберете", + "@pickTooltip": {}, + "sourceStateLoading": "Зареждане", + "@sourceStateLoading": {}, + "sourceStateLocatingPlaces": "Местоположение на места", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Изтрий", + "@chipActionDelete": {}, + "chipActionShowCollection": "Показване в колекцията", + "@chipActionShowCollection": {}, + "chipActionGoToCountryPage": "Показване в държави", + "@chipActionGoToCountryPage": {}, + "chipActionGoToPlacePage": "Покажи в места", + "@chipActionGoToPlacePage": {}, + "chipActionGoToExplorerPage": "Показване в Експлорър", + "@chipActionGoToExplorerPage": {}, + "chipActionFilterOut": "Изключи", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Включи", + "@chipActionFilterIn": {}, + "chipActionLock": "Заключи", + "@chipActionLock": {}, + "chipActionUnpin": "Откачи от закачени", + "@chipActionUnpin": {}, + "chipActionSetCover": "Задайте тапет", + "@chipActionSetCover": {}, + "chipActionShowCountryStates": "Показване на държава", + "@chipActionShowCountryStates": {}, + "chipActionCreateAlbum": "Създайте албум", + "@chipActionCreateAlbum": {}, + "chipActionCreateVault": "Създаване на трезор", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "Настройване на трезор", + "@chipActionConfigureVault": {}, + "entryActionCopyToClipboard": "Копирайте в клипборд", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "Изтриване", + "@entryActionDelete": {}, + "entryActionExport": "Експортиране", + "@entryActionExport": {}, + "entryActionInfo": "Информация", + "@entryActionInfo": {}, + "entryActionRestore": "Възстановяване", + "@entryActionRestore": {}, + "entryActionRotateCCW": "Завъртете обратно на часовниковата стрелка", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Завъртете по посока на часовниковата стрелка", + "@entryActionRotateCW": {}, + "entryActionFlip": "Хоризонтално превъртане", + "@entryActionFlip": {}, + "entryActionPrint": "Печат", + "@entryActionPrint": {}, + "entryActionShare": "Споделяне", + "@entryActionShare": {}, + "entryActionShareImageOnly": "Споделете само изображение", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "Сооделяне само на видео", + "@entryActionShareVideoOnly": {}, + "entryActionViewSource": "Вижте източника", + "@entryActionViewSource": {}, + "entryActionViewMotionPhotoVideo": "Отвори видео", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Редактиране", + "@entryActionEdit": {}, + "entryActionOpen": "Отвори с", + "@entryActionOpen": {}, + "entryActionSetAs": "Задай като", + "@entryActionSetAs": {}, + "entryActionCast": "Излъчване", + "@entryActionCast": {}, + "entryActionOpenMap": "Покажи в приложение за карти", + "@entryActionOpenMap": {}, + "entryActionRemoveFavourite": "Премахни от любими", + "@entryActionRemoveFavourite": {}, + "videoActionMute": "Изключи звук", + "@videoActionMute": {}, + "videoActionShowPreviousFrame": "Покажи предишния кадър", + "@videoActionShowPreviousFrame": {}, + "videoActionSelectStreams": "Изберете песни", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Скорост на възпроизвеждане", + "@videoActionSetSpeed": {}, + "videoActionABRepeat": "Повторете от А до Б", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "Задайте начало", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "Задайте край", + "@videoRepeatActionSetEnd": {}, + "viewerActionSettings": "Настройки", + "@viewerActionSettings": {}, + "viewerActionLock": "Блокирай визуализатора", + "@viewerActionLock": {}, + "viewerActionUnlock": "Отблокирай визуализатора", + "@viewerActionUnlock": {}, + "slideshowActionResume": "Продължи", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Покажи в Колекции", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Променете дата и час", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Променете местоположение", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditRating": "Променяте рейтинга", + "@entryInfoActionEditRating": {}, + "entryInfoActionRemoveMetadata": "Изтриване на метаданни", + "@entryInfoActionRemoveMetadata": {}, + "entryInfoActionExportMetadata": "Експортиране на метаданни", + "@entryInfoActionExportMetadata": {}, + "entryInfoActionRemoveLocation": "Премахване на местоположение", + "@entryInfoActionRemoveLocation": {}, + "editorActionTransform": "Трансформиране", + "@editorActionTransform": {}, + "editorTransformCrop": "Изрязване", + "@editorTransformCrop": {}, + "editorTransformRotate": "Завъртане", + "@editorTransformRotate": {}, + "cropAspectRatioOriginal": "Оригинал", + "@cropAspectRatioOriginal": {}, + "filterAspectRatioLandscapeLabel": "Хоризонтално", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "Вертикално", + "@filterAspectRatioPortraitLabel": {}, + "filterBinLabel": "Кошче", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Любими", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Без дата", + "@filterNoDateLabel": {}, + "filterNoAddressLabel": "Без адрес", + "@filterNoAddressLabel": {}, + "filterLocatedLabel": "С местоположение", + "@filterLocatedLabel": {}, + "filterNoRatingLabel": "Без рейтинг", + "@filterNoRatingLabel": {}, + "filterTaggedLabel": "С тагове", + "@filterTaggedLabel": {}, + "filterNoTagLabel": "Без тагове", + "@filterNoTagLabel": {}, + "filterOnThisDayLabel": "Днес", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Наскоро добавени", + "@filterRecentlyAddedLabel": {}, + "filterRatingRejectedLabel": "Отхвърлени", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Анимирани", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "Снимка с движение", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Панорама", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "RAW", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° Видео", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Изображение", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Видео", + "@filterMimeVideoLabel": {}, + "accessibilityAnimationsRemove": "Предотвратяване ефектите на екрана", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Запазване на екранните ефекти", + "@accessibilityAnimationsKeep": {}, + "albumTierPinned": "Закачени", + "@albumTierPinned": {}, + "albumTierSpecial": "Стандартни", + "@albumTierSpecial": {}, + "albumTierApps": "Приложения", + "@albumTierApps": {}, + "albumTierRegular": "Други", + "@albumTierRegular": {}, + "coordinateFormatDms": "Градуси, минути и секунди", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Десетични градуси", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsEast": "Изток", + "@coordinateDmsEast": {}, + "coordinateDmsNorth": "Север", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "Юг", + "@coordinateDmsSouth": {}, + "coordinateDmsWest": "Запад", + "@coordinateDmsWest": {}, + "displayRefreshRatePreferHighest": "Висока честота", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Ниска честота", + "@displayRefreshRatePreferLowest": {}, + "keepScreenOnNever": "Никога", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "Само във визуализатора", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Винаги", + "@keepScreenOnAlways": {}, + "lengthUnitPixel": "Пиксели", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "mapStyleGoogleHybrid": "Google Карти (хибрид)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Карти (терен)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Акварел", + "@mapStyleStamenWatercolor": {}, + "maxBrightnessAlways": "Винаги", + "@maxBrightnessAlways": {}, + "nameConflictStrategyRename": "Преименувай", + "@nameConflictStrategyRename": {}, + "nameConflictStrategySkip": "Пропусни", + "@nameConflictStrategySkip": {}, + "overlayHistogramNone": "Нищо", + "@overlayHistogramNone": {}, + "overlayHistogramLuminance": "Яркост", + "@overlayHistogramLuminance": {}, + "themeBrightnessLight": "Светла", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Тъмна", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Черна", + "@themeBrightnessBlack": {}, + "unitSystemMetric": "Метрични", + "@unitSystemMetric": {}, + "unitSystemImperial": "Имперски", + "@unitSystemImperial": {}, + "vaultLockTypePattern": "Графичен ключ", + "@vaultLockTypePattern": {}, + "vaultLockTypePin": "PIN-код", + "@vaultLockTypePin": {}, + "settingsVideoEnablePip": "Картина в картината", + "@settingsVideoEnablePip": {}, + "videoControlsPlayOutside": "Отвори с друг видео плеър", + "@videoControlsPlayOutside": {}, + "videoLoopModeNever": "Никога", + "@videoLoopModeNever": {}, + "videoLoopModeAlways": "Винаги", + "@videoLoopModeAlways": {}, + "videoPlaybackSkip": "Пропусни", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Пусни без звук", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Пусни със звук", + "@videoPlaybackWithSound": {}, + "videoResumptionModeNever": "Никога", + "@videoResumptionModeNever": {}, + "viewerTransitionSlide": "Слайд", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Паралакс", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "Избледняване на прехода", + "@viewerTransitionFade": {}, + "wallpaperTargetHome": "Начален екран", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "Заключен екран", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Начален и заключен екран", + "@wallpaperTargetHomeLock": {}, + "widgetDisplayedItemRandom": "Произволни", + "@widgetDisplayedItemRandom": {}, + "widgetDisplayedItemMostRecent": "Чести", + "@widgetDisplayedItemMostRecent": {}, + "widgetOpenPageHome": "Отвори начален екран", + "@widgetOpenPageHome": {}, + "widgetOpenPageViewer": "Преглед на текущия", + "@widgetOpenPageViewer": {}, + "widgetTapUpdateWidget": "Обнови Уиджет", + "@widgetTapUpdateWidget": {}, + "storageVolumeDescriptionFallbackPrimary": "Вътрешна памет", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD карта", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "Основна директория", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "„{name}“ директория", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "storageAccessDialogMessage": "Моля изберете {directory} на „{volume}“ на следващия екран за да дадете достъп на приложението до него.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "notEnoughSpaceDialogMessage": "Тази операция изисква {neededSize} свободно място на „{volume}“ за да завърши, но тук има само {freeSize} оставащо.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "nameConflictDialogSingleSourceMessage": "Някои файлове в целевата папка имат същото име.", + "@nameConflictDialogSingleSourceMessage": {}, + "addShortcutDialogLabel": "Етикет за пряк път", + "@addShortcutDialogLabel": {}, + "noMatchingAppDialogMessage": "Няма приложения, които да могат да се справят с това.", + "@noMatchingAppDialogMessage": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Изтриване на този елемент?} other{Изтриване на тези {count} елемента?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "moveUndatedConfirmationDialogSetDate": "Запазване дата", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Да възобновени възпроизвеждането от {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "videoStartOverButtonLabel": "ЗАПОЧНИ ОТНАЧАЛО", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "ПРОДЪЛЖИ", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Последен елемент", + "@setCoverDialogLatest": {}, + "setCoverDialogCustom": "Персонален", + "@setCoverDialogCustom": {}, + "newAlbumDialogTitle": "Нов албум", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Име на албума", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Албумът вече съществува", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Директорията вече съществува", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Хранилище:", + "@newAlbumDialogStorageLabel": {}, + "newVaultDialogTitle": "Нов трезор", + "@newVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "Заключване при изключен екран", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "Вид заключване", + "@vaultDialogLockTypeLabel": {}, + "patternDialogEnter": "Въведете шаблон", + "@patternDialogEnter": {}, + "patternDialogConfirm": "Потвърдете шаблон", + "@patternDialogConfirm": {}, + "pinDialogEnter": "Въведете пин-код", + "@pinDialogEnter": {}, + "pinDialogConfirm": "Потвърдете PIN", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "Въведете парола", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Потвърдете парола", + "@passwordDialogConfirm": {}, + "authenticateToUnlockVault": "Удостоверете се, за да отключите трезора", + "@authenticateToUnlockVault": {}, + "vaultBinUsageDialogMessage": "Някой от трезорите използват кошче.", + "@vaultBinUsageDialogMessage": {}, + "renameAlbumDialogLabel": "Ново име", + "@renameAlbumDialogLabel": {}, + "renameEntrySetPagePatternFieldLabel": "Шаблон наименуван", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Вмъкване на поле", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Преглед", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Брояч", + "@renameProcessorCounter": {}, + "renameProcessorHash": "Хеш", + "@renameProcessorHash": {}, + "renameProcessorName": "Име", + "@renameProcessorName": {}, + "exportEntryDialogFormat": "Формат:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Ширина", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Височина", + "@exportEntryDialogHeight": {}, + "exportEntryDialogQuality": "Качество", + "@exportEntryDialogQuality": {}, + "exportEntryDialogWriteMetadata": "Запис на метаданни", + "@exportEntryDialogWriteMetadata": {}, + "renameEntryDialogLabel": "Ново име", + "@renameEntryDialogLabel": {}, + "editEntryDialogCopyFromItem": "Копиране от друг елемент", + "@editEntryDialogCopyFromItem": {}, + "editEntryDialogTargetFieldsHeader": "Полета за промяна", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Дата и час", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Задайте персонализирана дата", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Копирайте от друга дата", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogExtractFromTitle": "Извличане от заглавието", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Преместване с", + "@editEntryDateDialogShift": {}, + "durationDialogHours": "Часове", + "@durationDialogHours": {}, + "durationDialogMinutes": "Минути", + "@durationDialogMinutes": {}, + "durationDialogSeconds": "Секунди", + "@durationDialogSeconds": {}, + "editEntryLocationDialogTitle": "Местоположение", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogSetCustom": "Редактиране на местоположение", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogChooseOnMap": "Избери на картата", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLongitude": "Дължина", + "@editEntryLocationDialogLongitude": {}, + "removeEntryMetadataDialogTitle": "Премахване на метаданни", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "Още", + "@removeEntryMetadataDialogMore": {}, + "videoSpeedDialogLabel": "Скорост на възпроизвеждане", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogAudio": "Аудио", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogOff": "Изключено", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Пътечка", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "Няма други пътечки.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "Готово!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Неуспешно", + "@genericFailureFeedback": {}, + "tooManyItemsErrorDialogMessage": "Опитай отново с по-малко елементи.", + "@tooManyItemsErrorDialogMessage": {}, + "menuActionConfigureView": "Изглед", + "@menuActionConfigureView": {}, + "menuActionSelectNone": "Не избирай нищо", + "@menuActionSelectNone": {}, + "menuActionSlideshow": "Слайд-шоу", + "@menuActionSlideshow": {}, + "viewDialogSortSectionTitle": "Сортиране", + "@viewDialogSortSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Оформление", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "Сортиране в обратен ред", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "Мозайка", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "Решетка", + "@tileLayoutGrid": {}, + "tileLayoutList": "Списък", + "@tileLayoutList": {}, + "castDialogTitle": "Устройство за излъчване", + "@castDialogTitle": {}, + "coverDialogTabCover": "Тапет", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "Приложение", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Цвят", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Изберете приложение", + "@appPickDialogTitle": {}, + "aboutPageTitle": "За нас", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Лицензи", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Политика за личните данни", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Съобщи за грешка", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Запазете лог във файл", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Копирай системата информация", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugReportInstruction": "Изпратете съобщение за грешка на GitHub, заедно с лог и системна информация", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "Изпрати", + "@aboutBugReportButton": {}, + "aboutDataUsageData": "Данни", + "@aboutDataUsageData": {}, + "aboutDataUsageCache": "Кеш", + "@aboutDataUsageCache": {}, + "aboutDataUsageDatabase": "База данни", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageMisc": "Разни", + "@aboutDataUsageMisc": {}, + "aboutDataUsageInternal": "Вътрешни", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "Външни", + "@aboutDataUsageExternal": {}, + "aboutDataUsageClearCache": "Изчисти кеш", + "@aboutDataUsageClearCache": {}, + "aboutCreditsSectionTitle": "Благодарности", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "Това приложение използва файл TopoJSON от", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "под ISC License.", + "@aboutCreditsWorldAtlas2": {}, + "aboutLicensesSectionTitle": "Лиценз с отворен код", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Библиотеки Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter плъгини", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter пакети", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart пакети", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Покажи всички лицензи", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "Политика за конфиденциалност", + "@policyPageTitle": {}, + "collectionSelectPageTitle": "Изберете елементи", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Покажи филтър на заглавията", + "@collectionActionShowTitleSearch": {}, + "collectionActionAddShortcut": "Добави кратък път", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "Изпразни кошчето", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Копирай в албум", + "@collectionActionCopy": {}, + "collectionActionMove": "Премести в албум", + "@collectionActionMove": {}, + "collectionActionEdit": "Редактиране", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Търси заглавия", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "По албум", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "По месец", + "@collectionGroupMonth": {}, + "collectionGroupDay": "По дни", + "@collectionGroupDay": {}, + "sectionUnknown": "Неизвестно", + "@sectionUnknown": {}, + "dateToday": "Днес", + "@dateToday": {}, + "dateYesterday": "Вчера", + "@dateYesterday": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{Неуспешно преименуване на 1 елемент} other{Неуспешно преименуване на {count} елемента}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, =1{Копира 1 елемент} other{Копира {count} елемента}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{Преименуван 1 елемент} other{Преименувани {count} елемента}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEmptyFavourites": "Няма любими", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "Няма видеа", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "Няма изображения", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Упълномощете достъп", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Изберете раздел", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Премахнете избрания раздел", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "За нас", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Настройки", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "Цялата колекция", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Любими", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Изображения", + "@drawerCollectionImages": {}, + "drawerCollectionAnimated": "Анимиран", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Снимки с движения", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "Панорами", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "RAW", + "@drawerCollectionRaws": {}, + "drawerAlbumPage": "Албуми", + "@drawerAlbumPage": {}, + "drawerTagPage": "Тагове", + "@drawerTagPage": {}, + "sortByDate": "По дати", + "@sortByDate": {}, + "sortByName": "По имена", + "@sortByName": {}, + "sortByItemCount": "По брой елементи", + "@sortByItemCount": {}, + "sortBySize": "По размер", + "@sortBySize": {}, + "sortByAlbumFileName": "По име на албум и елемент", + "@sortByAlbumFileName": {}, + "sortByRating": "По рейтинг", + "@sortByRating": {}, + "sortByDuration": "По продължителност", + "@sortByDuration": {}, + "sortOrderNewestFirst": "Първо най-новите", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Първо най-старите", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "От А до Я", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "От Я до А", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "Първо най-високите", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Първо най-ниските", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Първо най-големите", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "Първо най-малките", + "@sortOrderSmallestFirst": {}, + "sortOrderLongestFirst": "Първо най-дългите", + "@sortOrderLongestFirst": {}, + "albumGroupType": "По тип", + "@albumGroupType": {}, + "albumGroupVolume": "По обем на съхранение", + "@albumGroupVolume": {}, + "albumMimeTypeMixed": "Разни", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "Копирай в албум", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Експортирай в албум", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Премести в албум", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "Избери албум", + "@albumPickPageTitlePick": {}, + "albumCamera": "Камера", + "@albumCamera": {}, + "albumDownload": "Изтеглени", + "@albumDownload": {}, + "albumScreenshots": "Екранни снимки", + "@albumScreenshots": {}, + "albumScreenRecordings": "Екранни записи", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Видеозаписи", + "@albumVideoCaptures": {}, + "albumPageTitle": "Албуми", + "@albumPageTitle": {}, + "albumEmpty": "Няма албуми", + "@albumEmpty": {}, + "createAlbumButtonLabel": "СЪЗДАЙ", + "@createAlbumButtonLabel": {}, + "countryPageTitle": "Държави", + "@countryPageTitle": {}, + "countryEmpty": "Няма държави", + "@countryEmpty": {}, + "statePageTitle": "Региони", + "@statePageTitle": {}, + "stateEmpty": "Няма региони", + "@stateEmpty": {}, + "placePageTitle": "Места", + "@placePageTitle": {}, + "placeEmpty": "Няма места", + "@placeEmpty": {}, + "tagPageTitle": "Тагове", + "@tagPageTitle": {}, + "tagEmpty": "Без тагове", + "@tagEmpty": {}, + "binPageTitle": "Кошче", + "@binPageTitle": {}, + "selectStorageVolumeDialogTitle": "Избери място за съхранение", + "@selectStorageVolumeDialogTitle": {}, + "searchCollectionFieldHint": "Търсене по колекции", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "Скорошни", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Дата", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "Албуми", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "Държави", + "@searchCountriesSectionTitle": {}, + "searchStatesSectionTitle": "Региони", + "@searchStatesSectionTitle": {}, + "searchPlacesSectionTitle": "Места", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Тагове", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "Рейтинги", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "Метаданни", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Настройки", + "@settingsPageTitle": {}, + "settingsSystemDefault": "По подразбиране", + "@settingsSystemDefault": {}, + "settingsDisabled": "Изключено", + "@settingsDisabled": {}, + "settingsSearchFieldLabel": "Търсене настройки", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Не са открити настройки", + "@settingsSearchEmpty": {}, + "settingsActionExportDialogTitle": "Експорт", + "@settingsActionExportDialogTitle": {}, + "settingsActionImportDialogTitle": "Внасяне", + "@settingsActionImportDialogTitle": {}, + "appExportFavourites": "Любими", + "@appExportFavourites": {}, + "appExportSettings": "Настройки", + "@appExportSettings": {}, + "settingsHomeTile": "Начален екран", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Начален екран", + "@settingsHomeDialogTitle": {}, + "setHomeCustom": "Персонализиран", + "@setHomeCustom": {}, + "settingsKeepScreenOnTile": "Запази екрана включен", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Запази екрана включен", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Два пъти „назад“ за изход", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "Диалог за потвърждение", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "Диалогови прозорци за потвърждение", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeMoveToBinItems": "Попитай преди преместване в кошчето", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Показване на съобщение след преместване на елементи в кошчето", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerTile": "Навигационно меню", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Навигационно меню", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "Докоснете и задръжте, за да преместите и пренаредите елементи от менюто.", + "@settingsNavigationDrawerBanner": {}, + "appName": "Aves", + "@appName": {}, + "nextTooltip": "Следващ", + "@nextTooltip": {}, + "entryInfoActionEditTitleDescription": "Променете заглавието и описанието", + "@entryInfoActionEditTitleDescription": {}, + "albumTierVaults": "Трезори", + "@albumTierVaults": {}, + "keepScreenOnVideoPlayback": "По време на възпроизвеждане на видео", + "@keepScreenOnVideoPlayback": {}, + "mapStyleGoogleNormal": "Google Карти", + "@mapStyleGoogleNormal": {}, + "maxBrightnessNever": "Никога", + "@maxBrightnessNever": {}, + "entryInfoActionEditTags": "Променяне на тагове", + "@entryInfoActionEditTags": {}, + "filterNoTitleLabel": "Наименувани", + "@filterNoTitleLabel": {}, + "filterNoLocationLabel": "Без местоположение", + "@filterNoLocationLabel": {}, + "albumTierNew": "Нови", + "@albumTierNew": {}, + "chipActionRename": "Преименувайте", + "@chipActionRename": {}, + "hideTooltip": "Скрий", + "@hideTooltip": {}, + "saveTooltip": "Запишете", + "@saveTooltip": {}, + "actionRemove": "Премахване", + "@actionRemove": {}, + "resetTooltip": "Нулиране", + "@resetTooltip": {}, + "stopTooltip": "Стоп", + "@stopTooltip": {}, + "chipActionPin": "Закачете отгоре", + "@chipActionPin": {}, + "doubleBackExitMessage": "Натиснете отново „Назад“, за да излезете.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "Не питай отново", + "@doNotAskAgain": {}, + "sourceStateLocatingCountries": "Местоположение на държави", + "@sourceStateLocatingCountries": {}, + "chipActionGoToTagPage": "Показване в тагове", + "@chipActionGoToTagPage": {}, + "sourceStateCataloguing": "Каталогизация", + "@sourceStateCataloguing": {}, + "chipActionHide": "Скрий", + "@chipActionHide": {}, + "entryActionConvert": "Конвертиране", + "@entryActionConvert": {}, + "entryActionRename": "Преименуване", + "@entryActionRename": {}, + "welcomeTermsToggle": "Съгласявам се с правилата и условията", + "@welcomeTermsToggle": {}, + "entryActionShowGeoTiffOnMap": "Покажи на картата", + "@entryActionShowGeoTiffOnMap": {}, + "columnCount": "{count, plural, =1{{count} колона} other{{count} колони}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeSeconds": "{count, plural, =1{{count} секунда} few{{count} секунди} other{{count} секунди}}", + "@timeSeconds": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeMinutes": "{count, plural, =1{{count} минута} few{{count} минути} other{{count} минути}}", + "@timeMinutes": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "entryActionConvertMotionPhotoToStillImage": "Конвертиране в статично изображение", + "@entryActionConvertMotionPhotoToStillImage": {}, + "deleteButtonLabel": "ИЗТРИЙ", + "@deleteButtonLabel": {}, + "timeDays": "{count, plural, =1{{count} ден} few{{count} дни} other{{count} дни}}", + "@timeDays": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "cropAspectRatioFree": "Свободни", + "@cropAspectRatioFree": {}, + "cropAspectRatioSquare": "Квадратно", + "@cropAspectRatioSquare": {}, + "settingsNavigationDrawerTabPages": "Страници", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Добави албум", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "Миниатюри", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "Повече информация", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Повече информация", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowHdrIcon": "Показване на HDR икона", + "@settingsThumbnailShowHdrIcon": {}, + "settingsThumbnailShowFavouriteIcon": "Показване на любима икона", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Показване на иконата за таг", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Показване на иконата за местоположение", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Показване на иконата на снимка с движение", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRawIcon": "Показване на необработена икона", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Показване на продължителността на видеоклипа", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "Бързи действия", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Бързи действия", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Сърфиране", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Избиране", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBurstPatternsTile": "Шаблон серийни снимки", + "@settingsCollectionBurstPatternsTile": {}, + "settingsCollectionBurstPatternsNone": "Няма", + "@settingsCollectionBurstPatternsNone": {}, + "settingsViewerSectionTitle": "Визуализатор", + "@settingsViewerSectionTitle": {}, + "settingsViewerGestureSideTapNext": "Докоснете краищата на екрана, за да покажете предишен/следващ елемент", + "@settingsViewerGestureSideTapNext": {}, + "settingsNavigationDrawerTabAlbums": "Албуми", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabTypes": "Типове", + "@settingsNavigationDrawerTabTypes": {}, + "settingsThumbnailShowRating": "Покажи рейтинг", + "@settingsThumbnailShowRating": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Докоснете и задръжте, за да преместите бутоните и избор кои действия да се показват при разглеждане на елементи.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Докоснете и задръжте, за да преместите бутоните и да изберете кои действия да се показват при избиране на елементи.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "chipActionGoToAlbumPage": "Покажи в албуми", + "@chipActionGoToAlbumPage": {}, + "configureVaultDialogTitle": "Конфигурирайте Трезор", + "@configureVaultDialogTitle": {}, + "genericDangerWarningDialogMessage": "Сигурен ли сте?", + "@genericDangerWarningDialogMessage": {}, + "drawerPlacePage": "Места", + "@drawerPlacePage": {}, + "settingsActionImport": "Внасяне", + "@settingsActionImport": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Попитай, преди преместване на елементи без дата", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsViewerUseCutout": "Използвай зоната на изрязване", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Максимална яркост", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Автоматично възпроизвеждане на снимки с движение", + "@settingsMotionPhotoAutoPlay": {}, + "settingsViewerOverlayPageTitle": "Повече информация", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowHistogram": "Показвай хистограма", + "@settingsViewerShowHistogram": {}, + "settingsViewerShowOverlayOnOpening": "Показване при отваряне", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "Показване на миникарта", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Показване на информация", + "@settingsViewerShowInformation": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Налични бутони", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Без бутони", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "Повече информация", + "@settingsViewerOverlayTile": {}, + "settingsViewerShowRatingTags": "Показване на рейтинг и тагове", + "@settingsViewerShowRatingTags": {}, + "settingsViewerShowInformationSubtitle": "Показване на заглавие, дата, местоположение и др.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerSlideshowPageTitle": "Слайд-шоу", + "@settingsViewerSlideshowPageTitle": {}, + "settingsViewerSlideshowTile": "Слайд-шоу", + "@settingsViewerSlideshowTile": {}, + "settingsVideoSectionTitle": "Видео", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "Покажи видеа", + "@settingsVideoShowVideos": {}, + "settingsVideoPlaybackTile": "Възпроизвеждане", + "@settingsVideoPlaybackTile": {}, + "settingsVideoPlaybackPageTitle": "Възпроизвеждане", + "@settingsVideoPlaybackPageTitle": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Възпроизвеждане на видео", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "Видео настройки", + "@settingsVideoPageTitle": {}, + "settingsVideoLoopModeTile": "Цикличен режим", + "@settingsVideoLoopModeTile": {}, + "settingsVideoAutoPlay": "Автоматично възпроизвеждане", + "@settingsVideoAutoPlay": {}, + "settingsVideoBackgroundMode": "Фонов режим", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "Фонов режим", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsSubtitleThemeTile": "Субтитри", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Субтитри", + "@settingsSubtitleThemePageTitle": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Плъзнете нагоре или надолу, за да регулирате яркостта/силата на звука", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Подравняване на текст", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeBackgroundColor": "Цвят на фона", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsAllowInstalledAppAccessSubtitle": "Използва се за подобряване на показването на албума", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsHiddenFiltersBanner": "Снимките и видеоклиповете, съответстващи на скрити филтри, няма да се показват във вашата колекция.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "Няма скрити филтри", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Достъп до хранилището", + "@settingsStorageAccessTile": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Показване на алтернативи за жестове с мултитъч", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsDisplaySectionTitle": "Изглед", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Тема", + "@settingsThemeBrightnessTile": {}, + "settingsRemoveAnimationsDialogTitle": "Премахване анимации", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Време на изпълнение на действието", + "@settingsTimeToTakeActionTile": {}, + "settingsThemeBrightnessDialogTitle": "Тема", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "Цветни акценти", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Динамични цветове", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Честота на обновление на дисплея", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsWidgetPageTitle": "Фоторамка", + "@settingsWidgetPageTitle": {}, + "settingsScreenSaverPageTitle": "Скрийнсейвър", + "@settingsScreenSaverPageTitle": {}, + "statsPageTitle": "Статистика", + "@statsPageTitle": {}, + "settingsCollectionTile": "Колекция", + "@settingsCollectionTile": {}, + "statsTopPlacesSectionTitle": "Топ локации", + "@statsTopPlacesSectionTitle": {}, + "statsTopStatesSectionTitle": "Топ региони", + "@statsTopStatesSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Топ албуми", + "@statsTopAlbumsSectionTitle": {}, + "viewerInfoLabelDescription": "Описание", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Заглавие", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelOwner": "Собственик", + "@viewerInfoLabelOwner": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Плочки от [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "mapEmptyRegion": "Няма изображения в този регион", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Неуспешно извличане на вградени данни", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "Отвори", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Преглед на XML", + "@viewerInfoViewXmlLinkText": {}, + "tagEditorSectionRecent": "Скорошни", + "@tagEditorSectionRecent": {}, + "tagEditorPageNewTagFieldLabel": "Нов таг", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Добави таг", + "@tagEditorPageAddTagTooltip": {}, + "panoramaEnableSensorControl": "Активирайте сензорния контрол", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Изключете сензорния контрол", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Источник", + "@sourceViewerPageTitle": {}, + "tagPlaceholderState": "Регион", + "@tagPlaceholderState": {}, + "tagPlaceholderPlace": "Локация", + "@tagPlaceholderPlace": {}, + "chipActionRemove": "Премахване", + "@chipActionRemove": {}, + "albumTierDynamic": "Динамични", + "@albumTierDynamic": {}, + "collectionActionAddDynamicAlbum": "Добави динамичен албум", + "@collectionActionAddDynamicAlbum": {}, + "settingsImageBackground": "Фоново изображения", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Бързи действия", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Бързи действия", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "Докоснете и задръжте, за да преместите бутоните и да изберете кои действия да се показват във визуализатора.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Показани бутони", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerShowShootingDetails": "Показване на подробности за снимане", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerEnableOverlayBlurEffect": "Blur ефект", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsSlideshowRepeat": "Повтори слайдшоу", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Разбъркайте", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowAnimatedZoomEffect": "Анимиран ефект на увеличение", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "Преход ефекти", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowVideoPlaybackTile": "Възпроизвеждане на видео", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsVideoEnableHardwareAcceleration": "Хардуерно ускорение", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoResumptionModeTile": "Възобновяване на възпроизвеждането", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoControlsTile": "Настройки видео", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "Настройки видео", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "Бутони", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Докоснете два пъти за възпроизвеждане/пауза", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsSubtitleThemeSample": "Това е примерен текст.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "Подравняване на текст", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextPositionTile": "Позиция на текст", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Позиция на текст", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Размер на текст", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeBackgroundOpacity": "Непрозрачност на фона", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Подравняване отляво", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentRight": "Подравняване от дясно", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Подравняване по центъра", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsPrivacySectionTitle": "Поверителност", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Разрешете достъп до библиотеките на приложението", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowErrorReporting": "Разрешаване на анонимно докладване на грешки", + "@settingsAllowErrorReporting": {}, + "settingsEnableBin": "Използвайте кошчето", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "Съхранявайте изтритите елементи за 30 дни", + "@settingsEnableBinSubtitle": {}, + "settingsAllowMediaManagement": "Разрешаване на управление на медиите", + "@settingsAllowMediaManagement": {}, + "settingsHiddenItemsTile": "Скрити елементи", + "@settingsHiddenItemsTile": {}, + "settingsStorageAccessPageTitle": "Достъп до хранилището", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessEmpty": "Няма права за достъп", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Отмени", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Достъпност", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Премахване анимация", + "@settingsRemoveAnimationsTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Честота на опресняване", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsDisplayUseTvInterface": "Интерфейс Android TV", + "@settingsDisplayUseTvInterface": {}, + "settingsLanguageSectionTitle": "Език и формати", + "@settingsLanguageSectionTitle": {}, + "settingsCoordinateFormatTile": "Формат на координати", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "Формат на координати", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Единици за измерване", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "Единици за измерване", + "@settingsUnitSystemDialogTitle": {}, + "settingsForceWesternArabicNumeralsTile": "Принудителни арабски цифри", + "@settingsForceWesternArabicNumeralsTile": {}, + "settingsWidgetShowOutline": "Контур", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "При докосване на джаджата", + "@settingsWidgetOpenPage": {}, + "settingsWidgetDisplayedItem": "Показан артикул", + "@settingsWidgetDisplayedItem": {}, + "statsWithGps": "{count, plural, =1{1 елемент с местоположение} other{{count} елемента с местоположение}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "statsTopCountriesSectionTitle": "Топ страни", + "@statsTopCountriesSectionTitle": {}, + "statsTopTagsSectionTitle": "Топ тагове", + "@statsTopTagsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "ОТВОРИ ПАНОРАМА", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "ЗАДАЙ КАТО ТАПЕТ", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Опс!", + "@viewerErrorUnknown": {}, + "viewerInfoPageTitle": "Информация", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "Обратно към визуализатор", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "Неизвестен", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDate": "Дата", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "Резолюция", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Размер", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "Идентификатор", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Път", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Продължителност", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelCoordinates": "Координати", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Адрес", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Стиль карта", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Избирате стил на карта", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Увеличете мащаба", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Намаляване", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Север нагоре", + "@mapPointNorthUpTooltip": {}, + "mapAttributionOsmHot": "Плочки от[HOT](https://www.hotosm.org/) • Хоствано от [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "Плочки от [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "openMapPageTooltip": "Преглед на страницата с карта", + "@openMapPageTooltip": {}, + "viewerInfoSearchFieldLabel": "Търсене на метаданни", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Няма съответстващи ключове", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Дата и час", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Описание", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Размери", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Резолюция", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Права", + "@viewerInfoSearchSuggestionRights": {}, + "wallpaperUseScrollEffect": "Използвайте ефекта на превъртане на началния екран", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageTitle": "Променете тагове", + "@tagEditorPageTitle": {}, + "tagEditorSectionPlaceholders": "Заместители", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "Държава", + "@tagPlaceholderCountry": {}, + "settingsVideoGestureSideDoubleTapSeek": "Докоснете два пъти краищата на екрана, за превъртане назад/напред", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsSaveSearchHistory": "Запазване на историята на търсенето", + "@settingsSaveSearchHistory": {}, + "settingsStorageAccessBanner": "Някои директории изискват изрично разрешение за достъп за модифициране на файлове в тях. Тук можете да прегледате директории, до които преди това сте дали достъп.", + "@settingsStorageAccessBanner": {}, + "settingsViewerShowDescription": "Показване описание", + "@settingsViewerShowDescription": {}, + "dynamicAlbumAlreadyExists": "Динамични албум вече съществува", + "@dynamicAlbumAlreadyExists": {}, + "settingsSlideshowFillScreen": "Цял екран", + "@settingsSlideshowFillScreen": {}, + "appExportDynamicAlbums": "Динамични албуми", + "@appExportDynamicAlbums": {}, + "settingsViewerShowOverlayThumbnails": "Показване на миниатюри", + "@settingsViewerShowOverlayThumbnails": {}, + "mapAttributionOsmLiberty": "Предварително генерирани плочки от [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • • Хоствано от [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "settingsDisablingBinWarningDialogMessage": "Елементите в кошчето ще бъдат изтрити завинаги.", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsLanguagePageTitle": "Език", + "@settingsLanguagePageTitle": {}, + "settingsSlideshowIntervalTile": "Интервал", + "@settingsSlideshowIntervalTile": {}, + "settingsVideoLoopModeDialogTitle": "Цикличен режим", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsVideoResumptionModeDialogTitle": "Възобновяване на възпроизвеждането", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsSubtitleThemeShowOutline": "Покажете контур и сянка", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Цвят на текст", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Непрозрачност на текста", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsHiddenItemsPageTitle": "Скрити елементи", + "@settingsHiddenItemsPageTitle": {}, + "settingsLanguageTile": "Език", + "@settingsLanguageTile": {}, + "viewerErrorDoesNotExist": "Файлът не съществува.", + "@viewerErrorDoesNotExist": {}, + "mapAttributionOsmData": "Данни карта © [OpenStreetMap](https://www.openstreetmap.org/copyright) участници", + "@mapAttributionOsmData": {}, + "newDynamicAlbumDialogTitle": "Нов динамичен албум", + "@newDynamicAlbumDialogTitle": {}, + "tagEditorDiscardDialogMessage": "Искате ли да отхвърлите промените?", + "@tagEditorDiscardDialogMessage": {}, + "chipActionDecompose": "Раздели", + "@chipActionDecompose": {}, + "coordinateFormatDdm": "Градуси, десетични минути", + "@coordinateFormatDdm": {}, + "editEntryLocationDialogImportGpx": "Импортиране на GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "Изместване на времето", + "@editEntryLocationDialogTimeShift": {}, + "removeEntryMetadataDialogAll": "Всички", + "@removeEntryMetadataDialogAll": {}, + "sortByPath": "Според пътя", + "@sortByPath": {}, + "searchFormatSectionTitle": "Формати", + "@searchFormatSectionTitle": {}, + "chipActionCreateGroup": "Създайте група", + "@chipActionCreateGroup": {}, + "chipActionGroup": "Прегрупиране", + "@chipActionGroup": {}, + "newGroupDialogTitle": "Нова Група", + "@newGroupDialogTitle": {}, + "groupAlreadyExists": "Групата вече съществува", + "@groupAlreadyExists": {}, + "albumTierGroups": "Групи", + "@albumTierGroups": {}, + "groupPickerUseThisGroupButton": "Използвайте тази група", + "@groupPickerUseThisGroupButton": {}, + "newGroupDialogNameLabel": "Име на групата", + "@newGroupDialogNameLabel": {}, + "sectionNone": "Без раздели", + "@sectionNone": {}, + "groupEmpty": "Без група", + "@groupEmpty": {}, + "ungrouped": "Негрупирани", + "@ungrouped": {}, + "groupPickerTitle": "Избор Група", + "@groupPickerTitle": {}, + "mapStyleEditorDialogName": "Име", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "settingsNavigationBottomActionEditorBanner": "Докоснете и задръжте, за да местите бутони и да избирате кои действия да се показват в долната навигационна лента.", + "@settingsNavigationBottomActionEditorBanner": {}, + "settingsViewerShowZoomLevel": "Показване на нивото на мащабиране", + "@settingsViewerShowZoomLevel": {}, + "mapStyleDialogAddStyle": "Добавяне на стил", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogSubdomains": "Поддомейни", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "User-Agent", + "@mapStyleEditorDialogUserAgent": {}, + "createButtonLabel": "СЪЗДАЙ", + "@createButtonLabel": {}, + "tagPickPageTitle": "Избери Таг", + "@tagPickPageTitle": {}, + "settingsNavigationBottomActionsTile": "Долна навигация", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Долна навигация", + "@settingsNavigationBottomActionEditorPageTitle": {} +} diff --git a/lib/l10n/app_bn.arb b/lib/l10n/app_bn.arb new file mode 100644 index 0000000..cda8572 --- /dev/null +++ b/lib/l10n/app_bn.arb @@ -0,0 +1,52 @@ +{ + "welcomeMessage": "আভেস-এ স্বাগতম", + "@welcomeMessage": {}, + "hideButtonLabel": "লুকান", + "@hideButtonLabel": {}, + "continueButtonLabel": "এগিয়ে যান", + "@continueButtonLabel": {}, + "cancelTooltip": "বাতিল করুন", + "@cancelTooltip": {}, + "changeTooltip": "পরিবর্তন করুন", + "@changeTooltip": {}, + "clearTooltip": "মুছে ফেলুন", + "@clearTooltip": {}, + "hideTooltip": "লুকান", + "@hideTooltip": {}, + "actionRemove": "অপসারণ করুন", + "@actionRemove": {}, + "saveTooltip": "সংরক্ষণ করুন", + "@saveTooltip": {}, + "pickTooltip": "বাছাই করুন", + "@pickTooltip": {}, + "doNotAskAgain": "আবার জিঙ্গাসা করবেন না", + "@doNotAskAgain": {}, + "welcomeOptional": "বাধ্যতামূলক নয়", + "@welcomeOptional": {}, + "welcomeTermsToggle": "আমি সর্তাবলিগুলোতে একমত", + "@welcomeTermsToggle": {}, + "appName": "আভেস", + "@appName": {}, + "applyButtonLabel": "প্রয়োগ করুন", + "@applyButtonLabel": {}, + "deleteButtonLabel": "ডিলিট", + "@deleteButtonLabel": {}, + "nextButtonLabel": "পরবর্তী", + "@nextButtonLabel": {}, + "showButtonLabel": "দেখান", + "@showButtonLabel": {}, + "saveCopyButtonLabel": "কপি সংরক্ষণ করুন", + "@saveCopyButtonLabel": {}, + "applyTooltip": "প্রয়োগ করুন", + "@applyTooltip": {}, + "previousTooltip": "পূর্ববর্তী", + "@previousTooltip": {}, + "nextTooltip": "পরবর্তী", + "@nextTooltip": {}, + "showTooltip": "প্রদর্শন করুন", + "@showTooltip": {}, + "sourceStateCataloguing": "তালিকা প্রস্তুত করা হচ্ছে", + "@sourceStateCataloguing": {}, + "sourceStateLoading": "লোড হচ্ছে", + "@sourceStateLoading": {} +} diff --git a/lib/l10n/app_ca.arb b/lib/l10n/app_ca.arb new file mode 100644 index 0000000..2ec0345 --- /dev/null +++ b/lib/l10n/app_ca.arb @@ -0,0 +1,1644 @@ +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Benvingut a Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Opcional", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Estic d’acord amb els termes i condicions", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, =1{{count} element} other{{count} elements}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "columnCount": "{count, plural, =1{{count} columna} other{{count} columnes}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cancelTooltip": "Canceŀlar", + "@cancelTooltip": {}, + "changeTooltip": "Canviar", + "@changeTooltip": {}, + "actionRemove": "Eliminar", + "@actionRemove": {}, + "resetTooltip": "Restableix", + "@resetTooltip": {}, + "saveTooltip": "Desa", + "@saveTooltip": {}, + "pickTooltip": "Escollir", + "@pickTooltip": {}, + "doubleBackExitMessage": "Torneu a tocar «enrere» per sortir.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "No tornis a preguntar", + "@doNotAskAgain": {}, + "sourceStateLoading": "Carregant", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Catalogant", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Localitzant països", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Localitzant llocs", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Suprimeix", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Mostra als Àlbums", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToPlacePage": "Mostra als Llocs", + "@chipActionGoToPlacePage": {}, + "chipActionGoToTagPage": "Mostra a les etiquetes", + "@chipActionGoToTagPage": {}, + "chipActionLock": "Bloquejar", + "@chipActionLock": {}, + "chipActionPin": "Ancora a dalt", + "@chipActionPin": {}, + "chipActionUnpin": "Desancora de dalt", + "@chipActionUnpin": {}, + "chipActionSetCover": "Escollir coberta", + "@chipActionSetCover": {}, + "chipActionShowCountryStates": "Mostrar estats", + "@chipActionShowCountryStates": {}, + "chipActionCreateAlbum": "Crear àlbum", + "@chipActionCreateAlbum": {}, + "chipActionCreateVault": "Crear una caixa forta", + "@chipActionCreateVault": {}, + "entryActionCopyToClipboard": "Copiar al porta-retalls", + "@entryActionCopyToClipboard": {}, + "chipActionRename": "Canviar nom", + "@chipActionRename": {}, + "entryActionConvert": "Convertir", + "@entryActionConvert": {}, + "entryActionInfo": "Informació", + "@entryActionInfo": {}, + "entryActionRename": "Canviar nom", + "@entryActionRename": {}, + "entryActionRestore": "Restaurar", + "@entryActionRestore": {}, + "entryActionFlip": "Voltar horitzontalment", + "@entryActionFlip": {}, + "entryActionPrint": "Imprimir", + "@entryActionPrint": {}, + "entryActionShare": "Compartir", + "@entryActionShare": {}, + "entryActionShareImageOnly": "Compartir només imatge", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "Compartir només vídeo", + "@entryActionShareVideoOnly": {}, + "entryActionViewSource": "Veure font", + "@entryActionViewSource": {}, + "entryActionViewMotionPhotoVideo": "Obrir vídeo", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Editar", + "@entryActionEdit": {}, + "entryActionOpenMap": "Mostrar en aplicació de mapes", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Girar pantalla", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Afegir a preferits", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Treure de preferits", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Capturar fotograma", + "@videoActionCaptureFrame": {}, + "videoActionUnmute": "Activar so", + "@videoActionUnmute": {}, + "videoActionPlay": "Reproduir", + "@videoActionPlay": {}, + "videoActionReplay10": "Retrocedeix 10 segons", + "@videoActionReplay10": {}, + "videoActionSkip10": "Avança 10 segons", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Seleccionar pista", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Velocitat de reproducció", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "Configuració", + "@viewerActionSettings": {}, + "viewerActionUnlock": "Desbloquejar visualitzador", + "@viewerActionUnlock": {}, + "entryInfoActionRemoveLocation": "Esborrar localització", + "@entryInfoActionRemoveLocation": {}, + "editorActionTransform": "Transformar", + "@editorActionTransform": {}, + "editorTransformCrop": "Retallar", + "@editorTransformCrop": {}, + "editorTransformRotate": "Girar", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Lliure", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Original", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Quadrat", + "@cropAspectRatioSquare": {}, + "filterAspectRatioLandscapeLabel": "Paisatge", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "Retrat", + "@filterAspectRatioPortraitLabel": {}, + "filterBinLabel": "Paperera de reciclatge", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Preferida", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Sense data", + "@filterNoDateLabel": {}, + "filterNoAddressLabel": "Sense adreça", + "@filterNoAddressLabel": {}, + "filterLocatedLabel": "Localitzat", + "@filterLocatedLabel": {}, + "filterNoLocationLabel": "Deslocalitzat", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Sense valoració", + "@filterNoRatingLabel": {}, + "filterNoTitleLabel": "Sense títol", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "D’avui", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Afegit recentment", + "@filterRecentlyAddedLabel": {}, + "filterTypeMotionPhotoLabel": "Foto en moviment", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Panoràmica", + "@filterTypePanoramaLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "accessibilityAnimationsRemove": "Evitar efectes de pantalla", + "@accessibilityAnimationsRemove": {}, + "albumTierNew": "Nou", + "@albumTierNew": {}, + "albumTierPinned": "Fixat", + "@albumTierPinned": {}, + "albumTierSpecial": "Comú", + "@albumTierSpecial": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "E", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "O", + "@coordinateDmsWest": {}, + "displayRefreshRatePreferHighest": "Taxa més alta", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Taxa més baixa", + "@displayRefreshRatePreferLowest": {}, + "keepScreenOnNever": "Mai", + "@keepScreenOnNever": {}, + "keepScreenOnVideoPlayback": "Durant la reproducció de vídeo", + "@keepScreenOnVideoPlayback": {}, + "keepScreenOnViewerOnly": "Només la pàgina del visualitzador", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Sempre", + "@keepScreenOnAlways": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (Híbrid)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (Terreny)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor", + "@mapStyleStamenWatercolor": {}, + "maxBrightnessNever": "Mai", + "@maxBrightnessNever": {}, + "nameConflictStrategyRename": "Canviar nom", + "@nameConflictStrategyRename": {}, + "overlayHistogramNone": "Cap", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "subtitlePositionTop": "A dalt", + "@subtitlePositionTop": {}, + "unitSystemMetric": "Mètric", + "@unitSystemMetric": {}, + "unitSystemImperial": "Imperial", + "@unitSystemImperial": {}, + "vaultLockTypePattern": "Patró", + "@vaultLockTypePattern": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "vaultLockTypePassword": "Contrasenya", + "@vaultLockTypePassword": {}, + "settingsVideoEnablePip": "Imatge-en-imatge", + "@settingsVideoEnablePip": {}, + "viewerTransitionZoomIn": "Ampliar", + "@viewerTransitionZoomIn": {}, + "viewerTransitionNone": "Cap", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Pàgina principal", + "@wallpaperTargetHome": {}, + "widgetDisplayedItemRandom": "Aleatori", + "@widgetDisplayedItemRandom": {}, + "widgetDisplayedItemMostRecent": "Més recent", + "@widgetDisplayedItemMostRecent": {}, + "storageVolumeDescriptionFallbackPrimary": "Espai intern", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "Targeta SD", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "Directori arrel", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "«{name}» directori", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "storageAccessDialogMessage": "Si us plau, selecciona el {directory} a «{volume}» a la següent pantalla per donar-li accés a aquesta aplicació.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "missingSystemFilePickerDialogMessage": "Falta el selector de fitxers del sistema o està desactivat. Si us plau, activeu-lo i torneu-ho a provar.", + "@missingSystemFilePickerDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "Alguns fitxers de la carpeta de destinació tenen el mateix nom.", + "@nameConflictDialogSingleSourceMessage": {}, + "addShortcutButtonLabel": "AFEGEIX", + "@addShortcutButtonLabel": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Esborrar aquest element?} other{Esborrar aquests {count} elements?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "moveUndatedConfirmationDialogMessage": "Desar les dates dels elements abans de continuar?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Guardar dates", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Vols continuar reproduint a {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "videoStartOverButtonLabel": "TORNAR A COMENÇAR", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "REPRENDRE", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Últim element", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Automàtic", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Personalitzat", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "Les fotos i els vídeos coincidents s’amagaran de la teva coŀlecció. Podeu tornar-los a mostrar des de la configuració de «Privadesa».\n\nEsteu segur que voleu amagar-los?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "Àlbum nou", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Nom de l’Àlbum", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogStorageLabel": "Emmagatzematge:", + "@newAlbumDialogStorageLabel": {}, + "newVaultDialogTitle": "Caixa forta nova", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "Configura caixa forta", + "@configureVaultDialogTitle": {}, + "patternDialogEnter": "Introdueix patró", + "@patternDialogEnter": {}, + "passwordDialogEnter": "Introdueix contrasenya", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Confirma contrasenya", + "@passwordDialogConfirm": {}, + "authenticateToUnlockVault": "Autentifica per desbloquejar caixa forta", + "@authenticateToUnlockVault": {}, + "renameAlbumDialogLabel": "Nom nou", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "El directori ja existeix", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameProcessorCounter": "Comptador", + "@renameProcessorCounter": {}, + "renameProcessorName": "Nom", + "@renameProcessorName": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Eliminar aquest àlbum i l’element que conté?} other{Eliminar aquests àlbums i els {count} elements que contenen?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "exportEntryDialogQuality": "Qualitat", + "@exportEntryDialogQuality": {}, + "editEntryDialogCopyFromItem": "Copiar d’un altre element", + "@editEntryDialogCopyFromItem": {}, + "editEntryDialogTargetFieldsHeader": "Camps a modificar", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogSetCustom": "Defineix data personalitzada", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Copiar d’una altra data", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogExtractFromTitle": "Extreu del títol", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Desplaça", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "Data del fitxer modificat", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogMinutes": "Minuts", + "@durationDialogMinutes": {}, + "editEntryLocationDialogTitle": "Localització", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogSetCustom": "Defineix localització personalitzada", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogChooseOnMap": "Escull al mapa", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLongitude": "Longitud", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "Utilitza aquesta localització", + "@locationPickerUseThisLocationButton": {}, + "removeEntryMetadataDialogMore": "Més", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Es necessita XMP per reproduir el vídeo dins una foto en moviment.\n\nEstàs segur que ho vols esborrar?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Velocitat de reproducció", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogAudio": "Àudio", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Subtítols", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "Desactivat", + "@videoStreamSelectionDialogOff": {}, + "genericSuccessFeedback": "Fet!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Fallit", + "@genericFailureFeedback": {}, + "tooManyItemsErrorDialogMessage": "Torna-ho a provar amb menys elements.", + "@tooManyItemsErrorDialogMessage": {}, + "menuActionSelectAll": "Selecciona tots", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "Selecciona’n cap", + "@menuActionSelectNone": {}, + "menuActionSlideshow": "Presentació de diapositives", + "@menuActionSlideshow": {}, + "viewDialogSortSectionTitle": "Ordena", + "@viewDialogSortSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Disposició", + "@viewDialogLayoutSectionTitle": {}, + "tileLayoutMosaic": "Mosaic", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "Quadrícula", + "@tileLayoutGrid": {}, + "tileLayoutList": "Llista", + "@tileLayoutList": {}, + "castDialogTitle": "Dispositius d’emissió", + "@castDialogTitle": {}, + "coverDialogTabCover": "Coberta", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "Aplicació", + "@coverDialogTabApp": {}, + "appPickDialogTitle": "Tria l’aplicació", + "@appPickDialogTitle": {}, + "aboutPageTitle": "Sobre", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Llicència", + "@aboutLinkLicense": {}, + "aboutBugSectionTitle": "Informe d’error", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Desa els registres de l’aplicació en un fitxer", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Copia la informació del sistema", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "Copia", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "Reporta a GitHub amb els logs i la informació del sistema", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "Informe", + "@aboutBugReportButton": {}, + "aboutDataUsageSectionTitle": "Ús de dades", + "@aboutDataUsageSectionTitle": {}, + "aboutLinkPolicy": "Política de Privacitat", + "@aboutLinkPolicy": {}, + "aboutDataUsageCache": "Cache", + "@aboutDataUsageCache": {}, + "aboutDataUsageDatabase": "Base de dades", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageInternal": "Intern", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "Extern", + "@aboutDataUsageExternal": {}, + "aboutDataUsageClearCache": "Netejar Cache", + "@aboutDataUsageClearCache": {}, + "aboutCreditsWorldAtlas1": "Aquesta aplicació utilitza el format de fitxers TopoJSON", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "sota llicència ISC.", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Traductors", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Llicències de codi obert", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "Aquesta aplicació utilitza els següents paquets i biblioteques de codi obert.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Llibreries Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Plugins de Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Paquets de Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Mostra Totes les Llicències", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "Política de Privacitat", + "@policyPageTitle": {}, + "collectionPageTitle": "Coŀlecció", + "@collectionPageTitle": {}, + "timeSeconds": "{count, plural, =1{{count} segon} other{{count} segons}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "timeMinutes": "{count, plural, =1{{count} minut} other{{count} minuts}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "timeDays": "{count, plural, =1{{count} dia} other{{count} dies}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "deleteButtonLabel": "SUPRIMEIX", + "@deleteButtonLabel": {}, + "applyButtonLabel": "APLICAR", + "@applyButtonLabel": {}, + "nextButtonLabel": "SEGÜENT", + "@nextButtonLabel": {}, + "showButtonLabel": "MOSTRAR", + "@showButtonLabel": {}, + "hideButtonLabel": "AMAGAR", + "@hideButtonLabel": {}, + "continueButtonLabel": "CONTINUAR", + "@continueButtonLabel": {}, + "saveCopyButtonLabel": "GUARDAR CÒPIA", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Aplicar", + "@applyTooltip": {}, + "clearTooltip": "Netejar", + "@clearTooltip": {}, + "previousTooltip": "Anterior", + "@previousTooltip": {}, + "nextTooltip": "Següent", + "@nextTooltip": {}, + "hideTooltip": "Amagar", + "@hideTooltip": {}, + "showTooltip": "Mostrar", + "@showTooltip": {}, + "chipActionFilterOut": "Filtrar", + "@chipActionFilterOut": {}, + "chipActionGoToCountryPage": "Mostra als Països", + "@chipActionGoToCountryPage": {}, + "chipActionFilterIn": "Filtrar", + "@chipActionFilterIn": {}, + "chipActionHide": "Amagar", + "@chipActionHide": {}, + "entryActionDelete": "Esborrar", + "@entryActionDelete": {}, + "entryActionExport": "Exportar", + "@entryActionExport": {}, + "chipActionConfigureVault": "Configurar caixa forta", + "@chipActionConfigureVault": {}, + "entryActionRotateCCW": "Girar en sentit antihorari", + "@entryActionRotateCCW": {}, + "entryActionShowGeoTiffOnMap": "Mostra com a mapa superposat", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Convertir a imatge fixa", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionRotateCW": "Girar en sentit horari", + "@entryActionRotateCW": {}, + "entryActionOpen": "Obrir amb", + "@entryActionOpen": {}, + "videoActionMute": "Silencia", + "@videoActionMute": {}, + "videoActionPause": "Pausa", + "@videoActionPause": {}, + "entryActionSetAs": "Definir com", + "@entryActionSetAs": {}, + "viewerActionLock": "Bloquejar visualitzador", + "@viewerActionLock": {}, + "slideshowActionResume": "Reprèn", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Mostrar a Coŀlecció", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Edita la data i l’hora", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Editar localització", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditRating": "Editar valoració", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Editar etiquetes", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Esborrar metadades", + "@entryInfoActionRemoveMetadata": {}, + "entryInfoActionEditTitleDescription": "Editar títol i descripció", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionExportMetadata": "Exportar metadades", + "@entryInfoActionExportMetadata": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Aquesta operació no és compatible amb elements del següent format: {types}.} other{Aquesta operació no és compatible amb elements dels següents formats: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "nameConflictDialogMultipleSourceMessage": "Alguns fitxers tenen el mateix nom.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "Etiqueta de la drecera", + "@addShortcutDialogLabel": {}, + "noMatchingAppDialogMessage": "No hi ha aplicacions que puguin gestionar-ho.", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Moure aquest element a la paperera de reciclatge?} other{Moure aquests {count} elements a la paperera de reciclatge?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "newAlbumDialogNameLabelAlreadyExistsHelper": "El directori ja existeix", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newVaultWarningDialogMessage": "Els elements en caixes fortes només son disponibles des d’aquesta aplicació.\n\nSi desinstaŀles aquesta aplicació o en borres les dades, perdràs aquests elements.", + "@newVaultWarningDialogMessage": {}, + "vaultDialogLockModeWhenScreenOff": "Bloqueja quan la pantalla s’apagui", + "@vaultDialogLockModeWhenScreenOff": {}, + "patternDialogConfirm": "Confirma patró", + "@patternDialogConfirm": {}, + "pinDialogEnter": "Introdueix PIN", + "@pinDialogEnter": {}, + "pinDialogConfirm": "Confirma PIN", + "@pinDialogConfirm": {}, + "authenticateToConfigureVault": "Autentifica la configuració de la caixa forta", + "@authenticateToConfigureVault": {}, + "renameEntrySetPagePatternFieldLabel": "Patró de nomenament", + "@renameEntrySetPagePatternFieldLabel": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Eliminar aquest àlbum i l’element que conté?} other{Eliminar aquest àlbum i els {count} elements que conté?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "vaultBinUsageDialogMessage": "Algunes caixes fortes fan servir la paperera de reciclatge.", + "@vaultBinUsageDialogMessage": {}, + "renameEntrySetPageTitle": "Canviar nom", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPageInsertTooltip": "Insereix camp", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Previsualitza", + "@renameEntrySetPagePreviewSectionTitle": {}, + "exportEntryDialogFormat": "Format:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Amplada", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Alçada", + "@exportEntryDialogHeight": {}, + "exportEntryDialogWriteMetadata": "Escriu metadades", + "@exportEntryDialogWriteMetadata": {}, + "renameEntryDialogLabel": "Nom nou", + "@renameEntryDialogLabel": {}, + "editEntryDateDialogTitle": "Data i Hora", + "@editEntryDateDialogTitle": {}, + "durationDialogHours": "Hores", + "@durationDialogHours": {}, + "durationDialogSeconds": "Segons", + "@durationDialogSeconds": {}, + "editEntryRatingDialogTitle": "Valoració", + "@editEntryRatingDialogTitle": {}, + "editEntryLocationDialogLatitude": "Latitud", + "@editEntryLocationDialogLatitude": {}, + "removeEntryMetadataDialogTitle": "Esborra metadades", + "@removeEntryMetadataDialogTitle": {}, + "genericDangerWarningDialogMessage": "Estàs segur?", + "@genericDangerWarningDialogMessage": {}, + "videoStreamSelectionDialogVideo": "Vídeo", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogTrack": "Pista", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "No hi ha altres pistes.", + "@videoStreamSelectionDialogNoSelection": {}, + "menuActionConfigureView": "Vista", + "@menuActionConfigureView": {}, + "menuActionSelect": "Selecciona", + "@menuActionSelect": {}, + "menuActionMap": "Mapa", + "@menuActionMap": {}, + "viewDialogGroupSectionTitle": "Agrupa", + "@viewDialogGroupSectionTitle": {}, + "menuActionStats": "Estadístiques", + "@menuActionStats": {}, + "viewDialogReverseSortOrder": "Inverteix l’ordre", + "@viewDialogReverseSortOrder": {}, + "coverDialogTabColor": "Color", + "@coverDialogTabColor": {}, + "appPickDialogNone": "Cap", + "@appPickDialogNone": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Paquets de Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutDataUsageData": "Dades", + "@aboutDataUsageData": {}, + "aboutDataUsageMisc": "Misc", + "@aboutDataUsageMisc": {}, + "aboutCreditsSectionTitle": "Crèdits", + "@aboutCreditsSectionTitle": {}, + "filterTaggedLabel": "Etiquetat", + "@filterTaggedLabel": {}, + "albumTierApps": "Aplicacions", + "@albumTierApps": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "filterNoTagLabel": "Sense etiqueta", + "@filterNoTagLabel": {}, + "albumTierVaults": "Caixes fortes", + "@albumTierVaults": {}, + "coordinateFormatDecimal": "Graus decimals", + "@coordinateFormatDecimal": {}, + "albumTierRegular": "Altres", + "@albumTierRegular": {}, + "filterRatingRejectedLabel": "Rebutjat", + "@filterRatingRejectedLabel": {}, + "vaultDialogLockTypeLabel": "Tipus de bloqueig", + "@vaultDialogLockTypeLabel": {}, + "filterTypeAnimatedLabel": "Animat", + "@filterTypeAnimatedLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° Vídeo", + "@filterTypeSphericalVideoLabel": {}, + "filterMimeImageLabel": "Imatge", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Vídeo", + "@filterMimeVideoLabel": {}, + "maxBrightnessAlways": "Sempre", + "@maxBrightnessAlways": {}, + "accessibilityAnimationsKeep": "Mantenir efectes de pantalla", + "@accessibilityAnimationsKeep": {}, + "nameConflictStrategyReplace": "Substituir", + "@nameConflictStrategyReplace": {}, + "overlayHistogramLuminance": "Lluminància", + "@overlayHistogramLuminance": {}, + "videoControlsPlayOutside": "Obrir amb un altre reproductor", + "@videoControlsPlayOutside": {}, + "videoLoopModeNever": "Mai", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "Només vídeos curts", + "@videoLoopModeShortOnly": {}, + "videoPlaybackSkip": "Saltar", + "@videoPlaybackSkip": {}, + "videoResumptionModeNever": "Mai", + "@videoResumptionModeNever": {}, + "nameConflictStrategySkip": "Saltar", + "@nameConflictStrategySkip": {}, + "viewerTransitionSlide": "Lliscar", + "@viewerTransitionSlide": {}, + "viewerTransitionFade": "Esvair", + "@viewerTransitionFade": {}, + "wallpaperTargetLock": "Pàgina de bloqueig", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Pàgina principal i de bloqueig", + "@wallpaperTargetHomeLock": {}, + "widgetOpenPageHome": "Obrir casa", + "@widgetOpenPageHome": {}, + "widgetOpenPageViewer": "Obrir visualitzador", + "@widgetOpenPageViewer": {}, + "widgetTapUpdateWidget": "Actualitzar giny", + "@widgetTapUpdateWidget": {}, + "restrictedAccessDialogMessage": "Aquesta aplicació no té permís per modificar arxius de {directory} a «{volume}».\n\nSi us plau, feu servir un gestor d’arxius o l’aplicació de galeria preinstaŀlada per moure els elements a un altre directori.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "notEnoughSpaceDialogMessage": "Aquesta operació necessita {neededSize} d’espai lliure a «{volume}» per completar-se, però només hi ha {freeSize} lliure.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "subtitlePositionBottom": "A baix", + "@subtitlePositionBottom": {}, + "videoPlaybackMuted": "Reproduir sense so", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Reproduir amb so", + "@videoPlaybackWithSound": {}, + "videoResumptionModeAlways": "Sempre", + "@videoResumptionModeAlways": {}, + "viewerTransitionParallax": "Paraŀlaxi", + "@viewerTransitionParallax": {}, + "widgetOpenPageCollection": "Obrir coŀlecció", + "@widgetOpenPageCollection": {}, + "themeBrightnessLight": "Llum", + "@themeBrightnessLight": {}, + "videoLoopModeAlways": "Sempre", + "@videoLoopModeAlways": {}, + "themeBrightnessDark": "Fosc", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Negre", + "@themeBrightnessBlack": {}, + "entryActionCast": "Transmetre", + "@entryActionCast": {}, + "collectionPickPageTitle": "Escollir", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "Escollir elements", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Mostra filtres de títol", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Amaga filtres de títol", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Afegeix drecera", + "@collectionActionAddShortcut": {}, + "collectionActionSetHome": "Defineix com inici", + "@collectionActionSetHome": {}, + "collectionActionEmptyBin": "Buidar paperera", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Copiar a àlbum", + "@collectionActionCopy": {}, + "collectionActionMove": "Moure a àlbum", + "@collectionActionMove": {}, + "collectionActionRescan": "Tornar a buscar", + "@collectionActionRescan": {}, + "collectionActionEdit": "Editar", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Buscar títols", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "Per àlbum", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Per mes", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Per dia", + "@collectionGroupDay": {}, + "dateToday": "Avui", + "@dateToday": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Error en esborrar 1 element} other{Error en esborrar {count} elements}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopyFailureFeedback": "{count, plural, =1{Error en copiar 1 element} other{Error en copiar {count} elements}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameFailureFeedback": "{count, plural, =1{Error en canviar el nom a 1 element} other{Error en canviar el nom a {count} elements}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{Error en editar 1 element} other{Error en editar {count} elements}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, =1{Un element copiat} other{{count} elements copiats}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{Un element mogut} other{{count} elements moguts}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyFavourites": "Sense preferits", + "@collectionEmptyFavourites": {}, + "collectionEmptyImages": "Sense imatges", + "@collectionEmptyImages": {}, + "collectionDeselectSectionTooltip": "Desseleccionar secció", + "@collectionDeselectSectionTooltip": {}, + "drawerCollectionMotionPhotos": "Fotos en moviment", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "Panoràmiques", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Fotos Raw", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "Vídeos 360º", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Àlbums", + "@drawerAlbumPage": {}, + "drawerCountryPage": "Països", + "@drawerCountryPage": {}, + "drawerPlacePage": "Llocs", + "@drawerPlacePage": {}, + "drawerTagPage": "Etiquetes", + "@drawerTagPage": {}, + "sortByDate": "Per data", + "@sortByDate": {}, + "sortByName": "Per nom", + "@sortByName": {}, + "sortByItemCount": "Per nombre d’elements", + "@sortByItemCount": {}, + "sortBySize": "Per mida", + "@sortBySize": {}, + "sortByAlbumFileName": "Per àlbum i nom d’arxiu", + "@sortByAlbumFileName": {}, + "sortByRating": "Per valoració", + "@sortByRating": {}, + "sortOrderNewestFirst": "Primer el més nou", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Primer el més antic", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "De A a Z", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "De Z a A", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "Primer el més alt", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Primer el més baix", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Primer el més gran", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "Primer el més petit", + "@sortOrderSmallestFirst": {}, + "albumGroupTier": "Per nivell", + "@albumGroupTier": {}, + "albumGroupType": "Per tipus", + "@albumGroupType": {}, + "albumGroupVolume": "Per volum d’emmagatzematge", + "@albumGroupVolume": {}, + "albumMimeTypeMixed": "Barrejat", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "Copiar a Àlbum", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Exportar a Àlbum", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Moure a Àlbum", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "Escollir Àlbum", + "@albumPickPageTitlePick": {}, + "albumDownload": "Baixades", + "@albumDownload": {}, + "albumScreenshots": "Captures de pantalla", + "@albumScreenshots": {}, + "albumScreenRecordings": "Gravacions de pantalla", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Captures de Vídeo", + "@albumVideoCaptures": {}, + "albumPageTitle": "Àlbums", + "@albumPageTitle": {}, + "createAlbumButtonLabel": "CREAR", + "@createAlbumButtonLabel": {}, + "countryPageTitle": "Països", + "@countryPageTitle": {}, + "statePageTitle": "Estats", + "@statePageTitle": {}, + "stateEmpty": "Sense estats", + "@stateEmpty": {}, + "placePageTitle": "Llocs", + "@placePageTitle": {}, + "placeEmpty": "Sense llocs", + "@placeEmpty": {}, + "tagPageTitle": "Etiquetes", + "@tagPageTitle": {}, + "tagEmpty": "Sense etiquetes", + "@tagEmpty": {}, + "binPageTitle": "Paperera de Reciclatge", + "@binPageTitle": {}, + "searchCollectionFieldHint": "Buscar a coŀlecció", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "Recent", + "@searchRecentSectionTitle": {}, + "settingsNavigationSectionTitle": "Navegació", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Inici", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Inici", + "@settingsHomeDialogTitle": {}, + "settingsKeepScreenOnTile": "Mantenir pantalla encesa", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Mantenir la Pantalla Encesa", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Toqueu «enrere» dues vegades per sortir", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "Diàlegs de confirmació", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "Diàlegs de Confirmació", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Pregunta abans d’esborrar elements per sempre", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Pregunta abans de moure elements sense data", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Mostra missatge després de moure elements a la paperera de reciclatge", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsConfirmationVaultDataLoss": "Mostra l’avís de pèrdua de dades d’una caixa forta", + "@settingsConfirmationVaultDataLoss": {}, + "settingsNavigationDrawerTile": "Menú de navegació", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Menú de Navegació", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsThumbnailOverlayTile": "Incrustacions", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Incrustacions", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowHdrIcon": "Mostra icona de HDR", + "@settingsThumbnailShowHdrIcon": {}, + "settingsThumbnailShowFavouriteIcon": "Mostra icona de preferits", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Mostra icona d’etiqueta", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Mostra icona de localització", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Mostra icona de foto en moviment", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "Mostra valoració", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Mostra icona raw", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Mostra duració de vídeo", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "Accions ràpides", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Accions Ràpides", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabSelecting": "Selecció", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Manté premut per moure botons i seleccionar quines accions es mostren en els articles de navegació.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionQuickActionTabBrowsing": "Navegació", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Manté premut per moure botons i seleccionar quines accions es mostren en seleccionar elements.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsCollectionBurstPatternsTile": "Patrons de ràfega", + "@settingsCollectionBurstPatternsTile": {}, + "settingsCollectionBurstPatternsNone": "Cap", + "@settingsCollectionBurstPatternsNone": {}, + "settingsViewerGestureSideTapNext": "Toqueu les vores de la pantalla per mostrar l’anterior/el següent element", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerUseCutout": "Utilitzeu l’àrea de tall", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Brillantor màxima", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Reprodueix automàticament fotos en moviment", + "@settingsMotionPhotoAutoPlay": {}, + "settingsViewerQuickActionsTile": "Accions ràpides", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Accions Ràpides", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "Manté premut per moure botons i seleccionar quines accions es mostren al visualitzador.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Botons Mostrats", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerShowMinimap": "Mostra mapa en miniatura", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Mostra informació", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "Mostra títol, data, localització, etc.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowRatingTags": "Mostra valoració i etiquetes", + "@settingsViewerShowRatingTags": {}, + "settingsViewerShowShootingDetails": "Mostra detalls de la foto", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowDescription": "Mostra descripció", + "@settingsViewerShowDescription": {}, + "settingsViewerShowOverlayThumbnails": "Mostra miniatures", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "Efecte borrós", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "Presentació de diapositives", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "Presentació de diapositives", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Repeteix", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Barreja", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Emplenar pantalla", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowAnimatedZoomEffect": "Efecte de zoom animat", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "Transició", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Interval", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "Reproducció de vídeo", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Reproducció de Vídeo", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "Configuració de Vídeo", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Vídeo", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "Mostra vídeos", + "@settingsVideoShowVideos": {}, + "settingsVideoPlaybackTile": "Reproducció", + "@settingsVideoPlaybackTile": {}, + "settingsVideoAutoPlay": "Reproducció automàtica", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "Mode en bucle", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Mode en Bucle", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsVideoResumptionModeTile": "Reprèn reproducció", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoResumptionModeDialogTitle": "Reprèn Reproducció", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsVideoBackgroundMode": "Mode de fons", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "Mode de Fons", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsVideoControlsTile": "Controls", + "@settingsVideoControlsTile": {}, + "settingsVideoButtonsTile": "Botons", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Fes doble toc per reproduir/aturar", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "Fes doble toc a la vora de la pantalla per retrocedir/avançar", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Llisca cap amunt o cap avall per ajustar la brillantor/volum", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsSubtitleThemeTile": "Subtítols", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Subtítols", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Això és un exemple.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "Ajustament de text", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextPositionTile": "Posició de text", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Posició de Text", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Mida del text", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "Mostra el contorn i l’ombra", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Color del text", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Opacitat del text", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Color de fons", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Esquerra", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Centre", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsAllowInstalledAppAccess": "Permet accés a la llista d’aplicacions", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowErrorReporting": "Permet enviar errors anònims", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Guarda historial de cerca", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "Utilitzar paperera de reciclatge", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "Manté elements eliminats durant 30 dies", + "@settingsEnableBinSubtitle": {}, + "settingsDisablingBinWarningDialogMessage": "Els elements de la paperera de reciclatge seran eliminats per sempre.", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsAllowMediaManagement": "Permet la gestió dels mitjans", + "@settingsAllowMediaManagement": {}, + "settingsHiddenItemsTile": "Elements amagats", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Elements Amagats", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "Les fotos i els vídeos que coincideixin amb filtres amagats no apareixeran a la teva coŀlecció.", + "@settingsHiddenFiltersBanner": {}, + "settingsStorageAccessBanner": "Alguns directoris requereixen permís explícit per modificar-hi fitxers. Podeu revisar aquí els directoris als quals heu donat accés anteriorment.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Cap permís d’accés", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Revocar", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Accessibilitat", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Treure animacions", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "Treure Animacions", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Retard per executar una acció", + "@settingsTimeToTakeActionTile": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Mostra alternatives amb gestos multitàctils", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsDisplaySectionTitle": "Pantalla", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "Colors per ressaltar", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Color dinàmic", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Taxa de refresc de pantalla", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Taxa de refresc", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsDisplayUseTvInterface": "Interfície d’Android TV", + "@settingsDisplayUseTvInterface": {}, + "settingsLanguageSectionTitle": "Llengua i Formats", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "Idioma", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "Idioma", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "Format de coordenades", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "Format de Coordenades", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Unitats", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "Unitats", + "@settingsUnitSystemDialogTitle": {}, + "settingsScreenSaverPageTitle": "Protector de Pantalla", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "Marc de Foto", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Contorn", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "En tocar un giny", + "@settingsWidgetOpenPage": {}, + "settingsWidgetDisplayedItem": "Element mostrat", + "@settingsWidgetDisplayedItem": {}, + "settingsCollectionTile": "Coŀlecció", + "@settingsCollectionTile": {}, + "statsPageTitle": "Estadístiques", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, =1{1 element amb localització} other{{count} elements amb localització}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "statsTopStatesSectionTitle": "Estats Principals", + "@statsTopStatesSectionTitle": {}, + "statsTopCountriesSectionTitle": "Països Principals", + "@statsTopCountriesSectionTitle": {}, + "statsTopTagsSectionTitle": "Etiquetes Principals", + "@statsTopTagsSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Àlbums Principals", + "@statsTopAlbumsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "OBRIR PANORÀMICA", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "DEFINEIX FONS DE PANTALLA", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Vaja!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "El fitxer ja no existeix.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Informació", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "Torna al visualitzador", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoLabelDescription": "Descripció", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Títol", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelResolution": "Resolució", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Mida", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Ruta", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Duració", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Propietari", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Coordenades", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Adreça", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Estil de mapa", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Selecciona tipus de mapa", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Ampliar", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Allunyar", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Apuntar el nord cap amunt", + "@mapPointNorthUpTooltip": {}, + "mapAttributionStamen": "Rajoles per [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "openMapPageTooltip": "Veure a la pàgina de mapa", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "Sense imatges a aquesta regió", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Error en extreure les dades incrustades", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "Obrir", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Veure XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "Buscar metadades", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Sense claus coincidents", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Data i hora", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionResolution": "Resolució", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Drets", + "@viewerInfoSearchSuggestionRights": {}, + "wallpaperUseScrollEffect": "Utilitza l’efecte de desplaçament a la pantalla d’inici", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageNewTagFieldLabel": "Nova etiqueta", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorSectionPlaceholders": "Marcadors de posició", + "@tagEditorSectionPlaceholders": {}, + "tagEditorDiscardDialogMessage": "Vols descartar els canvis?", + "@tagEditorDiscardDialogMessage": {}, + "tagPlaceholderCountry": "País", + "@tagPlaceholderCountry": {}, + "panoramaEnableSensorControl": "Activa el control del sensor", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Desactiva el control del sensor", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Font", + "@sourceViewerPageTitle": {}, + "settingsVideoControlsPageTitle": "Controls", + "@settingsVideoControlsPageTitle": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Ajustament de Text", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeBackgroundOpacity": "Opacitat del fons", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentRight": "Dreta", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsPrivacySectionTitle": "Privacitat", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccessSubtitle": "Utilitzat per millorar la visualització dels àlbums", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsHiddenFiltersEmpty": "Cap filtre amagat", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Accés d’emmagatzematge", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "Accés d’Emmagatzematge", + "@settingsStorageAccessPageTitle": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{Nom canviat a 1 element} other{Nom canviat a {count} elements}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{Un element editat} other{{count} elements editats}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyVideos": "Sense vídeos", + "@collectionEmptyVideos": {}, + "collectionEmptyGrantAccessButtonLabel": "Donar accés", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Seleccionar secció", + "@collectionSelectSectionTooltip": {}, + "drawerAboutButton": "Sobre", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Configuració", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "Tota la coŀlecció", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Preferits", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Imatges", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Vídeos", + "@drawerCollectionVideos": {}, + "statsTopPlacesSectionTitle": "Llocs Principals", + "@statsTopPlacesSectionTitle": {}, + "viewerInfoUnknown": "desconegut", + "@viewerInfoUnknown": {}, + "drawerCollectionAnimated": "Animacions", + "@drawerCollectionAnimated": {}, + "viewerInfoLabelDate": "Data", + "@viewerInfoLabelDate": {}, + "albumCamera": "Càmera", + "@albumCamera": {}, + "albumEmpty": "Sense àlbums", + "@albumEmpty": {}, + "newFilterBanner": "nou", + "@newFilterBanner": {}, + "countryEmpty": "Sense països", + "@countryEmpty": {}, + "searchDateSectionTitle": "Data", + "@searchDateSectionTitle": {}, + "searchStatesSectionTitle": "Estats", + "@searchStatesSectionTitle": {}, + "searchAlbumsSectionTitle": "Àlbums", + "@searchAlbumsSectionTitle": {}, + "searchPlacesSectionTitle": "Llocs", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Etiquetes", + "@searchTagsSectionTitle": {}, + "searchCountriesSectionTitle": "Països", + "@searchCountriesSectionTitle": {}, + "searchRatingSectionTitle": "Valoracions", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "Metadades", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Configuració", + "@settingsPageTitle": {}, + "settingsSystemDefault": "Per defecte al sistema", + "@settingsSystemDefault": {}, + "settingsDefault": "Per defecte", + "@settingsDefault": {}, + "settingsDisabled": "Desactivat", + "@settingsDisabled": {}, + "settingsAskEverytime": "Preguntar cada vegada", + "@settingsAskEverytime": {}, + "settingsModificationWarningDialogMessage": "Altres configuracions es modificaran.", + "@settingsModificationWarningDialogMessage": {}, + "settingsSearchFieldLabel": "Busca configuracions", + "@settingsSearchFieldLabel": {}, + "settingsActionExport": "Exportar", + "@settingsActionExport": {}, + "settingsSearchEmpty": "Cap coincidència", + "@settingsSearchEmpty": {}, + "settingsActionExportDialogTitle": "Exportar", + "@settingsActionExportDialogTitle": {}, + "appExportSettings": "Configuracions", + "@appExportSettings": {}, + "settingsActionImport": "Importar", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Importar", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "Cobertes", + "@appExportCovers": {}, + "appExportFavourites": "Preferits", + "@appExportFavourites": {}, + "mapAttributionOsmHot": "Rajoles de [HOT](https://www.hotosm.org/) • Allotjat a [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "viewerInfoSearchSuggestionDescription": "Descripció", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Dimensions", + "@viewerInfoSearchSuggestionDimensions": {}, + "tagEditorPageAddTagTooltip": "Afegir etiqueta", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorPageTitle": "Editar Etiquetes", + "@tagEditorPageTitle": {}, + "tagEditorSectionRecent": "Recent", + "@tagEditorSectionRecent": {}, + "tagPlaceholderState": "Estat", + "@tagPlaceholderState": {}, + "tagPlaceholderPlace": "Lloc", + "@tagPlaceholderPlace": {}, + "settingsConfirmationBeforeMoveToBinItems": "Pregunta abans de moure elements a la paperera de reciclatge", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsNavigationDrawerBanner": "Mantén premut per moure i reordenar els elements del menú.", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "Tipus", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "Àlbums", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Pàgines", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Afegeix àlbum", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "Miniatures", + "@settingsThumbnailSectionTitle": {}, + "settingsViewerSectionTitle": "Visualitzador", + "@settingsViewerSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Botons Disponibles", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Sense botons", + "@settingsViewerQuickActionEmpty": {}, + "settingsImageBackground": "Fons d’imatge", + "@settingsImageBackground": {}, + "settingsViewerOverlayPageTitle": "Incrustacions", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerOverlayTile": "Incrustacions", + "@settingsViewerOverlayTile": {}, + "settingsViewerShowOverlayOnOpening": "Mostra a l’obrir", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowHistogram": "Mostra histograma", + "@settingsViewerShowHistogram": {}, + "settingsVideoPlaybackPageTitle": "Reproducció", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoEnableHardwareAcceleration": "Acceleració per maquinari", + "@settingsVideoEnableHardwareAcceleration": {}, + "sectionUnknown": "Desconegut", + "@sectionUnknown": {}, + "dateYesterday": "Ahir", + "@dateYesterday": {}, + "dateThisMonth": "Aquest mes", + "@dateThisMonth": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{Error en moure 1 element} other{Error en moure {count} elements}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{Error en exportar una pàgina} other{Error en exportar {count} pàgines}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chipActionShowCollection": "Mostrar a Coŀlecció", + "@chipActionShowCollection": {}, + "mapAttributionOsmData": "Dades de mapa © [OpenStreetMap](https://www.openstreetmap.org/copyright) contribuïdors", + "@mapAttributionOsmData": {}, + "renameProcessorHash": "Hash", + "@renameProcessorHash": {}, + "editEntryLocationDialogImportGpx": "Importar GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "Desplaçament de l’hora", + "@editEntryLocationDialogTimeShift": {}, + "collectionActionAddDynamicAlbum": "Afegir un àlbum dinàmic", + "@collectionActionAddDynamicAlbum": {}, + "videoActionShowPreviousFrame": "Mostrar el marc anterior", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "Mostrar el següent fotograma", + "@videoActionShowNextFrame": {}, + "chipActionDecompose": "Dividir", + "@chipActionDecompose": {}, + "videoActionABRepeat": "Repetir A-B", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "Establir l’inici", + "@videoRepeatActionSetStart": {}, + "newDynamicAlbumDialogTitle": "Nou àlbum dinàmic", + "@newDynamicAlbumDialogTitle": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "L’àlbum ja existeix", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "selectStorageVolumeDialogTitle": "Seleccionar Emmagatzematge", + "@selectStorageVolumeDialogTitle": {}, + "appExportDynamicAlbums": "Àlbums dinàmics", + "@appExportDynamicAlbums": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "sortOrderLongestFirst": "El més llarg primer", + "@sortOrderLongestFirst": {}, + "chipActionRemove": "Eliminar", + "@chipActionRemove": {}, + "videoRepeatActionSetEnd": "Establir el final", + "@videoRepeatActionSetEnd": {}, + "albumTierDynamic": "Dinàmic", + "@albumTierDynamic": {}, + "removeEntryMetadataDialogAll": "Tot", + "@removeEntryMetadataDialogAll": {}, + "explorerPageTitle": "Explorador", + "@explorerPageTitle": {}, + "explorerActionSelectStorageVolume": "Seleccionar emmagatzematge", + "@explorerActionSelectStorageVolume": {}, + "setHomeCustom": "Personalitzat", + "@setHomeCustom": {}, + "mapAttributionOsmLiberty": "Tessel·les per [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hostatjat per [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tesel·les per [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "settingsForceWesternArabicNumeralsTile": "Forçar els números aràbics", + "@settingsForceWesternArabicNumeralsTile": {}, + "sortByDuration": "Per durada", + "@sortByDuration": {}, + "stopTooltip": "Parar", + "@stopTooltip": {}, + "chipActionGoToExplorerPage": "Mostrar a l’Explorador", + "@chipActionGoToExplorerPage": {}, + "dynamicAlbumAlreadyExists": "L’àlbum dinàmic ja existeix", + "@dynamicAlbumAlreadyExists": {}, + "sortOrderShortestFirst": "El més curt primer", + "@sortOrderShortestFirst": {}, + "sortByPath": "Per ruta", + "@sortByPath": {}, + "searchFormatSectionTitle": "Formats", + "@searchFormatSectionTitle": {}, + "createButtonLabel": "CREAR", + "@createButtonLabel": {}, + "chipActionGroup": "Canviar grup", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Crear grup", + "@chipActionCreateGroup": {}, + "albumTierGroups": "Grups", + "@albumTierGroups": {}, + "newGroupDialogTitle": "Grup nou", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Nom del grup", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "El grup ja existeix", + "@groupAlreadyExists": {}, + "groupEmpty": "No hi ha grups", + "@groupEmpty": {}, + "ungrouped": "Desagrupats", + "@ungrouped": {}, + "groupPickerTitle": "Tria grup", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Fes servir aquest grup", + "@groupPickerUseThisGroupButton": {}, + "sectionNone": "Sense seccions", + "@sectionNone": {}, + "tagPickPageTitle": "Tria etiqueta", + "@tagPickPageTitle": {}, + "settingsNavigationBottomActionsTile": "Barra de navegació inferior", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Barra de navegació inferior", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Toca i mantén per moure botons i sel·leccionar quines accions es mostraran a la barra de navegació inferior.", + "@settingsNavigationBottomActionEditorBanner": {}, + "mapStyleDialogAddStyle": "Afegeix estil", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogName": "Nom", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogSubdomains": "Subdominis", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "User-Agent", + "@mapStyleEditorDialogUserAgent": {}, + "settingsViewerShowZoomLevel": "Mostra el nivell de zoom", + "@settingsViewerShowZoomLevel": {} +} diff --git a/lib/l10n/app_ckb.arb b/lib/l10n/app_ckb.arb new file mode 100644 index 0000000..490bc51 --- /dev/null +++ b/lib/l10n/app_ckb.arb @@ -0,0 +1,993 @@ +{ + "@@locale": "ckb", + "welcomeOptional": "ئارەزومەندانە", + "@welcomeOptional": {}, + "welcomeTermsToggle": "ڕازیم بە مەرج و یاساکانی بەکارهێنان", + "@welcomeTermsToggle": {}, + "columnCount": "{count, plural, other{ڕیز {count}}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeSeconds": "{count, plural, other{چرکە {count}}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "applyButtonLabel": "چەسپاندن", + "@applyButtonLabel": {}, + "deleteButtonLabel": "سڕینەوە", + "@deleteButtonLabel": {}, + "nextButtonLabel": "دواتر", + "@nextButtonLabel": {}, + "hideButtonLabel": "شاردنەوە", + "@hideButtonLabel": {}, + "continueButtonLabel": "بەردەوامبون", + "@continueButtonLabel": {}, + "cancelTooltip": "پاشگەزبوونەوە", + "@cancelTooltip": {}, + "changeTooltip": "گۆڕین", + "@changeTooltip": {}, + "clearTooltip": "لابردن", + "@clearTooltip": {}, + "previousTooltip": "پێشوتر", + "@previousTooltip": {}, + "showTooltip": "پیشاندان", + "@showTooltip": {}, + "hideTooltip": "شاردنەوە", + "@hideTooltip": {}, + "actionRemove": "لابردن", + "@actionRemove": {}, + "resetTooltip": "سفرکردنەوە", + "@resetTooltip": {}, + "saveTooltip": "پاشەکەوتکردن", + "@saveTooltip": {}, + "pickTooltip": "هەڵبژاردن", + "@pickTooltip": {}, + "doubleBackExitMessage": "بۆ دەرچوون، پەنجە لە «گەڕانەوە» بدەوە.", + "@doubleBackExitMessage": {}, + "sourceStateLoading": "باردەکا", + "@sourceStateLoading": {}, + "sourceStateLocatingCountries": "دۆزینەوەی ووڵات", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "دۆزینەوەی شوێن", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "سڕینەوە", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "بینین لە ئەلبومدا", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToTagPage": "پیشاندانی نیشانەکراوەکان", + "@chipActionGoToTagPage": {}, + "chipActionFilterOut": "کاریگەرییەکان", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "کاریگەرییەکان", + "@chipActionFilterIn": {}, + "chipActionHide": "شاردنەوە", + "@chipActionHide": {}, + "chipActionPin": "جێگیرکردن لە سەرەوە", + "@chipActionPin": {}, + "chipActionUnpin": "لابردنی جێگیری", + "@chipActionUnpin": {}, + "chipActionRename": "ناوگۆڕین", + "@chipActionRename": {}, + "chipActionSetCover": "وێنەی بەرگ", + "@chipActionSetCover": {}, + "chipActionCreateVault": "دروستکردنی تایبەت", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "ڕێکخستنی قفڵکراو", + "@chipActionConfigureVault": {}, + "entryActionCopyToClipboard": "لەبەرگرتنەوە", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "سڕینەوە", + "@entryActionDelete": {}, + "entryActionConvert": "گۆڕینی جۆر", + "@entryActionConvert": {}, + "entryActionExport": "هەڵگرتن", + "@entryActionExport": {}, + "entryActionInfo": "زانیاری", + "@entryActionInfo": {}, + "entryActionRestore": "گێڕانەوە", + "@entryActionRestore": {}, + "timeDays": "{count, plural, other{ڕۆژ {count}}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "focalLength": "{length} مم", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "entryActionPrint": "چاپکردن", + "@entryActionPrint": {}, + "entryActionShare": "بڵاوکردنەوە", + "@entryActionShare": {}, + "entryActionViewSource": "بینینی سەرچاوە", + "@entryActionViewSource": {}, + "entryActionEdit": "دەستکاریکردن", + "@entryActionEdit": {}, + "entryActionOpen": "کردنەوە لەڕێی", + "@entryActionOpen": {}, + "entryActionRotateScreen": "سوڕانەوەی خۆکار", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "زیادکردن بۆ دڵخواز", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "لابردن لە دڵخواز", + "@entryActionRemoveFavourite": {}, + "videoActionMute": "بێدەنگکردن", + "@videoActionMute": {}, + "videoActionUnmute": "کاراکردنی دەنگ", + "@videoActionUnmute": {}, + "videoActionPause": "ڕاگرتن", + "@videoActionPause": {}, + "videoActionPlay": "لێدان", + "@videoActionPlay": {}, + "itemCount": "{count, plural, other{دانە {count}}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "appName": "ئاڤیس", + "@appName": {}, + "welcomeMessage": "بەخێربێی بۆ ئاڤێس", + "@welcomeMessage": {}, + "nextTooltip": "دواتر", + "@nextTooltip": {}, + "showButtonLabel": "پیشاندان", + "@showButtonLabel": {}, + "doNotAskAgain": "مەپرسەوە", + "@doNotAskAgain": {}, + "chipActionGoToCountryPage": "پیشاندان لە وڵاتەکاندا", + "@chipActionGoToCountryPage": {}, + "chipActionLock": "قفڵکردن", + "@chipActionLock": {}, + "chipActionCreateAlbum": "دروستکردنی ئەلبوم", + "@chipActionCreateAlbum": {}, + "entryActionRename": "ناوگۆڕین", + "@entryActionRename": {}, + "timeMinutes": "{count, plural, other{خولەک {count}}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "entryActionSetAs": "دانان وەک", + "@entryActionSetAs": {}, + "saveCopyButtonLabel": "وێنەکی لێ پاشەکەوت بکە", + "@saveCopyButtonLabel": {}, + "editorActionTransform": "گواستنەوە", + "@editorActionTransform": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "editorTransformRotate": "سوڕاندن", + "@editorTransformRotate": {}, + "albumTierNew": "نوێ", + "@albumTierNew": {}, + "videoResumptionModeNever": "هەرگیز", + "@videoResumptionModeNever": {}, + "coordinateDmsNorth": "باکوور", + "@coordinateDmsNorth": {}, + "nameConflictStrategyReplace": "جێگرتنەوە", + "@nameConflictStrategyReplace": {}, + "videoLoopModeAlways": "بەردەوام", + "@videoLoopModeAlways": {}, + "nameConflictDialogMultipleSourceMessage": "هەندێک لە پەڕگەکان هەمان ناویان هەیە.", + "@nameConflictDialogMultipleSourceMessage": {}, + "vaultLockTypePassword": "تێپەڕەوشە", + "@vaultLockTypePassword": {}, + "keepScreenOnAlways": "بەردەوام", + "@keepScreenOnAlways": {}, + "videoActionSkip10": "١٠ چرکە بیبە پێش", + "@videoActionSkip10": {}, + "albumTierRegular": "هی دیکە", + "@albumTierRegular": {}, + "filterNoAddressLabel": "بێ ناونیشان", + "@filterNoAddressLabel": {}, + "filterMimeImageLabel": "وێنە", + "@filterMimeImageLabel": {}, + "videoResumptionModeAlways": "بەردەوام", + "@videoResumptionModeAlways": {}, + "nameConflictStrategyRename": "ناونانەوە", + "@nameConflictStrategyRename": {}, + "coordinateDmsEast": "ڕۆژهەڵات", + "@coordinateDmsEast": {}, + "filterAspectRatioLandscapeLabel": "لاکێشە", + "@filterAspectRatioLandscapeLabel": {}, + "albumTierApps": "نەرمەواڵەکان", + "@albumTierApps": {}, + "entryActionViewMotionPhotoVideo": "کردنەوەی ڤیدیۆ", + "@entryActionViewMotionPhotoVideo": {}, + "filterNoTitleLabel": "بێ سەرناو", + "@filterNoTitleLabel": {}, + "videoPlaybackMuted": "بەبێ دەنگی لێبدە", + "@videoPlaybackMuted": {}, + "maxBrightnessAlways": "بەردەوام", + "@maxBrightnessAlways": {}, + "themeBrightnessLight": "ڕوون", + "@themeBrightnessLight": {}, + "filterMimeVideoLabel": "ڤیدیۆ", + "@filterMimeVideoLabel": {}, + "themeBrightnessDark": "تاریک", + "@themeBrightnessDark": {}, + "entryInfoActionEditTitleDescription": "دەستکاری کردنی سەرناو و پێناس", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditLocation": "دەستکاری کردنی شوێن", + "@entryInfoActionEditLocation": {}, + "videoPlaybackWithSound": "بە دەنگەوە لێبدە", + "@videoPlaybackWithSound": {}, + "nameConflictStrategySkip": "بازدان", + "@nameConflictStrategySkip": {}, + "addShortcutButtonLabel": "زیادکردن", + "@addShortcutButtonLabel": {}, + "entryActionOpenMap": "لە نەرمەواڵەی نەخشە پیشانی بدە", + "@entryActionOpenMap": {}, + "entryActionRotateCCW": "سوڕاندن بە پێچەوانەی میلی کاتژمێر", + "@entryActionRotateCCW": {}, + "viewerActionSettings": "ڕێکخستنەکان", + "@viewerActionSettings": {}, + "filterOnThisDayLabel": "لەم ڕۆژەدا", + "@filterOnThisDayLabel": {}, + "viewerTransitionNone": "هیچیان", + "@viewerTransitionNone": {}, + "videoControlsPlayOutside": "کردنەوە بە لێدەرێکی تر", + "@videoControlsPlayOutside": {}, + "lengthUnitPercent": "٪", + "@lengthUnitPercent": {}, + "maxBrightnessNever": "هەرگیز", + "@maxBrightnessNever": {}, + "coordinateDmsSouth": "باشوور", + "@coordinateDmsSouth": {}, + "videoActionReplay10": "١٠ چرکە بیبە پاش", + "@videoActionReplay10": {}, + "cropAspectRatioFree": "ئازادانە", + "@cropAspectRatioFree": {}, + "filterTypeSphericalVideoLabel": "ڤیدیۆی سێ ڕەهەندی", + "@filterTypeSphericalVideoLabel": {}, + "filterNoRatingLabel": "هەڵنەسەنگێنراو", + "@filterNoRatingLabel": {}, + "themeBrightnessBlack": "ڕەش", + "@themeBrightnessBlack": {}, + "videoPlaybackSkip": "بازدان", + "@videoPlaybackSkip": {}, + "entryActionShareVideoOnly": "بە تەنیا ڤیدیۆ هاوبەش بکە", + "@entryActionShareVideoOnly": {}, + "applyTooltip": "جێبەجێ کردن", + "@applyTooltip": {}, + "widgetDisplayedItemRandom": "هەڕەمەکی", + "@widgetDisplayedItemRandom": {}, + "subtitlePositionTop": "سەرەوە", + "@subtitlePositionTop": {}, + "lengthUnitPixel": "وێنەخاڵ", + "@lengthUnitPixel": {}, + "entryInfoActionEditDate": "دەستکاری کردنی کات و ڕێکەوت", + "@entryInfoActionEditDate": {}, + "cropAspectRatioSquare": "چوارگۆشە", + "@cropAspectRatioSquare": {}, + "unitSystemMetric": "مەتری", + "@unitSystemMetric": {}, + "overlayHistogramNone": "هیچیان", + "@overlayHistogramNone": {}, + "filterRecentlyAddedLabel": "بەم دواییە زیاد کراو", + "@filterRecentlyAddedLabel": {}, + "storageVolumeDescriptionFallbackPrimary": "بیرگەی ناوەکی", + "@storageVolumeDescriptionFallbackPrimary": {}, + "keepScreenOnNever": "هەرگیز", + "@keepScreenOnNever": {}, + "filterTypeMotionPhotoLabel": "وێنەی جوڵاو", + "@filterTypeMotionPhotoLabel": {}, + "mapStyleGoogleNormal": "نەخشەی گۆگڵ", + "@mapStyleGoogleNormal": {}, + "videoLoopModeNever": "هەرگیز", + "@videoLoopModeNever": {}, + "videoActionSetSpeed": "خێرایی لێدان", + "@videoActionSetSpeed": {}, + "filterFavouriteLabel": "دڵخواز", + "@filterFavouriteLabel": {}, + "coordinateDmsWest": "ڕۆژاوا", + "@coordinateDmsWest": {}, + "entryActionRotateCW": "سوڕاندن بە ئاڕاستەی میلی کاتژمێر", + "@entryActionRotateCW": {}, + "subtitlePositionBottom": "خوارەوە", + "@subtitlePositionBottom": {}, + "settingsVideoEnablePip": "وێنە لە وێنە", + "@settingsVideoEnablePip": {}, + "entryInfoActionEditRating": "دەستکاری کردنی هەڵسەنگاندن", + "@entryInfoActionEditRating": {}, + "albumTierSpecial": "باو", + "@albumTierSpecial": {}, + "videoLoopModeShortOnly": "تەنیا ڤیدیۆ کورتەکان", + "@videoLoopModeShortOnly": {}, + "entryInfoActionRemoveLocation": "سڕینەوەی شوێن", + "@entryInfoActionRemoveLocation": {}, + "entryActionShareImageOnly": "بە تەنیا وێنە هاوبەش بکە", + "@entryActionShareImageOnly": {}, + "filterNoDateLabel": "بەڕۆژ کراوەتەوە", + "@filterNoDateLabel": {}, + "createButtonLabel": "دروستکردن", + "@createButtonLabel": {}, + "stopTooltip": "وەستاندن", + "@stopTooltip": {}, + "chipActionRemove": "لابردن", + "@chipActionRemove": {}, + "chipActionShowCollection": "نیشاندان بە کۆمەڵە", + "@chipActionShowCollection": {}, + "chipActionGoToExplorerPage": "پیشاندان لە دۆزەر", + "@chipActionGoToExplorerPage": {}, + "chipActionGroup": "گۆڕینی پۆلێن", + "@chipActionGroup": {}, + "chipActionShowCountryStates": "پیشاندانی وڵاتەکان", + "@chipActionShowCountryStates": {}, + "chipActionCreateGroup": "دروستکردنی گرۆ", + "@chipActionCreateGroup": {}, + "entryActionFlip": "ئاسۆییانە هەڵیبخەوە", + "@entryActionFlip": {}, + "entryActionConvertMotionPhotoToStillImage": "گۆڕین بۆ وێنەی جێگیر", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionCast": "پەخش", + "@entryActionCast": {}, + "videoRepeatActionSetStart": "دانانی دەستپێکردن", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "دانانی کۆتایی", + "@videoRepeatActionSetEnd": {}, + "viewerActionLock": "کڵۆمدانی پێشاندەر", + "@viewerActionLock": {}, + "viewerActionUnlock": "کردنەوەی پێشاندەر", + "@viewerActionUnlock": {}, + "slideshowActionResume": "بەردەوامبوونەوە", + "@slideshowActionResume": {}, + "editorTransformCrop": "بڕین", + "@editorTransformCrop": {}, + "cropAspectRatioOriginal": "ڕەسەن", + "@cropAspectRatioOriginal": {}, + "filterBinLabel": "گلێشدان", + "@filterBinLabel": {}, + "albumTierGroups": "گرۆکان", + "@albumTierGroups": {}, + "albumTierVaults": "گاسنووق", + "@albumTierVaults": {}, + "albumTierDynamic": "بزۆک", + "@albumTierDynamic": {}, + "coordinateFormatDecimal": "ژمارەی دەیی", + "@coordinateFormatDecimal": {}, + "displayRefreshRatePreferHighest": "بڵندترین ڕادە", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "نزمترین ڕادە", + "@displayRefreshRatePreferLowest": {}, + "keepScreenOnVideoPlayback": "لەکاتی لێدانی ڤیدیۆ", + "@keepScreenOnVideoPlayback": {}, + "keepScreenOnViewerOnly": "تەنیا پەڕەی بینین", + "@keepScreenOnViewerOnly": {}, + "mapStyleGoogleHybrid": "نەخشەی گۆگڵ (چەندڕەگەز)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "نەخشەی گۆگڵ (هەرد)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmLiberty": "نەخشەی ئازادی OSM", + "@mapStyleOsmLiberty": {}, + "mapStyleOpenTopoMap": "نەخشەی کراوەی نەخشەکێشی", + "@mapStyleOpenTopoMap": {}, + "mapStyleOsmHot": "نەخشەی مرۆڤدۆستانەی OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "ستەیمنی وێنەی ئاویی", + "@mapStyleStamenWatercolor": {}, + "overlayHistogramRGB": "س.ک.ش", + "@overlayHistogramRGB": {}, + "vaultLockTypePattern": "داڕێژە", + "@vaultLockTypePattern": {}, + "setCoverDialogAuto": "خۆکارانە", + "@setCoverDialogAuto": {}, + "newAlbumDialogTitle": "ئەلبومی نوێ", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "ناوی ئەلبوم", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "ئەم ئەلبومە هەیە", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "بیرگە:", + "@newAlbumDialogStorageLabel": {}, + "newDynamicAlbumDialogTitle": "ئەلبومێکی بزۆکی نوێ", + "@newDynamicAlbumDialogTitle": {}, + "dynamicAlbumAlreadyExists": "ئەلبومە بزۆکەکە هەیە", + "@dynamicAlbumAlreadyExists": {}, + "newGroupDialogTitle": "گرۆی نوێ", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "ناوی گرۆ", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "گرۆکە هەیە", + "@groupAlreadyExists": {}, + "groupEmpty": "گرۆ نییە", + "@groupEmpty": {}, + "ungrouped": "گرۆ نەکراو", + "@ungrouped": {}, + "groupPickerTitle": "گرۆیەک هەڵبژێرە", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "ئەم گرۆیە بەکاربێنە", + "@groupPickerUseThisGroupButton": {}, + "newVaultWarningDialogMessage": "شتەکانی ناو ئەم گاسنووقە تەنیا بۆ ئەم کاربەرنامەیە بەردەستە نەک هی تر.\n\nئەگەر ئەم کاربەرنامەیە بسڕیتەوە یان دراوەکانی نەهێڵیت، هەموو شتەکانی ناویشی دەفەوتێن.", + "@newVaultWarningDialogMessage": {}, + "newVaultDialogTitle": "گاسنووقێکی نوێ", + "@newVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "کە مۆبایلەکە داخرا کڵۆمی بدە", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "جۆری کڵۆمدان", + "@vaultDialogLockTypeLabel": {}, + "passwordDialogEnter": "تێپەڕەوشەیەک بنووسە", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "تێپەڕەوشەکە بنووسەوە", + "@passwordDialogConfirm": {}, + "vaultBinUsageDialogMessage": "هەندێک لە گاسنووقەکان گلێشدان بەکاردەینن.", + "@vaultBinUsageDialogMessage": {}, + "renameAlbumDialogLabel": "ناوێکی نوێ", + "@renameAlbumDialogLabel": {}, + "renameEntrySetPageTitle": "ناولێنانەوە", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPageInsertTooltip": "خانەی تێخستن", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "پێشبینین", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "ژمێرەر", + "@renameProcessorCounter": {}, + "renameProcessorHash": "وردکردن", + "@renameProcessorHash": {}, + "renameProcessorName": "ناو", + "@renameProcessorName": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{ئەلبومەکە و ئەو شتانەشی لەناویەتی دەسڕێتەوە؟} other{ئەلبومەکە و ئەو {count} شتانەشی لەناویەتی دەسڕێتەوە؟}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{ئەلبومەکان و ئەو شتانەشی لەناویەتی دەسڕێتەوە؟} other{ئەلبومەکان و ئەو {count} شتانەشی لەناویەتی دەسڕێتەوە؟}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "exportEntryDialogWidth": "پانی", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "بڵندی", + "@exportEntryDialogHeight": {}, + "exportEntryDialogQuality": "جۆرایەتی", + "@exportEntryDialogQuality": {}, + "exportEntryDialogWriteMetadata": "نووسینی مێتاداتا", + "@exportEntryDialogWriteMetadata": {}, + "renameEntryDialogLabel": "ناوێکی نوێ", + "@renameEntryDialogLabel": {}, + "editEntryDateDialogTitle": "کات و ڕێکەوت", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "ڕێکەوتێکی دیاریکراو دابنێ", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "لە ڕێکەوتی ترەوە وەریگرە", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogExtractFromTitle": "لە ناونیشانەکەوە دەریکێشە", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogSourceFileModifiedDate": "ڕێکەوتی دەستکاریکراوی پەڕگە", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "کاژێر", + "@durationDialogHours": {}, + "durationDialogMinutes": "خولەک", + "@durationDialogMinutes": {}, + "durationDialogSeconds": "چرکە", + "@durationDialogSeconds": {}, + "editEntryLocationDialogTitle": "شوون", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogSetCustom": "شوونێکی تایبەت دابنێ", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogChooseOnMap": "لەسەر نەخشە هەڵیبژێرە", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogImportGpx": "هاوردنی GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogLatitude": "پانەهێڵ", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "درێژەهێڵ", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "ئەم شوونە بەکاربێنە", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "هەڵسەنگاندن", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "لابردنی مێتاداتا", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogAll": "هەمووی", + "@removeEntryMetadataDialogAll": {}, + "removeEntryMetadataDialogMore": "زێتر", + "@removeEntryMetadataDialogMore": {}, + "videoSpeedDialogLabel": "خێرایی لێدان", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "ڤیدیۆ", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "دەنگ", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "ژێرنووس", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "ناکارا", + "@videoStreamSelectionDialogOff": {}, + "genericSuccessFeedback": "کرا!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "نەکرا", + "@genericFailureFeedback": {}, + "genericDangerWarningDialogMessage": "دڵنیایت؟", + "@genericDangerWarningDialogMessage": {}, + "tooManyItemsErrorDialogMessage": "بە بڕگەی کمترەوە هەوڵدەوە.", + "@tooManyItemsErrorDialogMessage": {}, + "menuActionConfigureView": "بینین", + "@menuActionConfigureView": {}, + "menuActionSelect": "دیاریکردن", + "@menuActionSelect": {}, + "menuActionSelectAll": "گشتی دیار بکە", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "هیچی دیار مەکە", + "@menuActionSelectNone": {}, + "menuActionMap": "نەخشە", + "@menuActionMap": {}, + "menuActionStats": "ئامارەکان", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "ڕیز", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "بەش", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "کڵێشە", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "ئاوەژوو کردنەوەی ڕیز", + "@viewDialogReverseSortOrder": {}, + "tileLayoutGrid": "خانەخانەیی", + "@tileLayoutGrid": {}, + "tileLayoutList": "پێڕستی", + "@tileLayoutList": {}, + "coverDialogTabCover": "بەرگ", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "کاربەرنامە", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "ڕەنگ", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "کاربەرنامەیەک هەڵبژێرە", + "@appPickDialogTitle": {}, + "appPickDialogNone": "هیچیان", + "@appPickDialogNone": {}, + "aboutPageTitle": "دەربارە", + "@aboutPageTitle": {}, + "aboutLinkLicense": "مۆڵەت", + "@aboutLinkLicense": {}, + "aboutBugSectionTitle": "هەواڵدان لە چەوتی", + "@aboutBugSectionTitle": {}, + "aboutBugCopyInfoInstruction": "لەبەرگرتنەوەی زانیارییەکانی سیستەم", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "لەبەرگرتنەوە", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportButton": "هەواڵدان", + "@aboutBugReportButton": {}, + "aboutDataUsageData": "دراوە", + "@aboutDataUsageData": {}, + "aboutDataUsageDatabase": "بنکەدراوە", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageInternal": "ناوەکی", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "دەرەکی", + "@aboutDataUsageExternal": {}, + "aboutCreditsWorldAtlas1": "ئەم کاربەرنامەیە پەڕگەی TopoJSON بەکاردەینێت لە", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "لەبن مۆڵەتی .ISC", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "وەرگێڕەکان", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "مۆڵەتەکانی سەرچاوە کراوە", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "ئەم کاربەرنامەیە گورزە و ژێدەرگە سەرچاوە کراوەکانی خوارەوە بەکاردەهێنێت.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "ژێدەرگەکانی ئەندرۆید", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "پێوەکراوەکانی فلەتەر", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "گورزەکانی فلەتەر", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "گورزەکانی دارت", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "گشت مۆڵەتەکان پیشان بدە", + "@aboutLicensesShowAllButtonLabel": {}, + "collectionPickPageTitle": "هەڵبژێرە", + "@collectionPickPageTitle": {}, + "collectionActionAddDynamicAlbum": "زیادکردنی ئەلبومی بزۆک", + "@collectionActionAddDynamicAlbum": {}, + "collectionActionAddShortcut": "زیادکردنی قەدبڕ", + "@collectionActionAddShortcut": {}, + "collectionActionCopy": "لەبەریبگرەوە بۆ ئەلبوم", + "@collectionActionCopy": {}, + "collectionActionMove": "بیگوازەوە بۆ ئەلبوم", + "@collectionActionMove": {}, + "collectionActionRescan": "پشکنینەوە", + "@collectionActionRescan": {}, + "collectionActionEdit": "دەستکاری", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "گەڕان لە ناونیشان", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "بە ئەلبوم", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "بە مانگ", + "@collectionGroupMonth": {}, + "collectionGroupDay": "بە ڕۆژ", + "@collectionGroupDay": {}, + "sectionUnknown": "نەناسراو", + "@sectionUnknown": {}, + "dateToday": "ئەمڕۆ", + "@dateToday": {}, + "dateYesterday": "دونێ", + "@dateYesterday": {}, + "dateThisMonth": "ئەم مانگە", + "@dateThisMonth": {}, + "drawerAboutButton": "دەربارە", + "@drawerAboutButton": {}, + "drawerSettingsButton": "ڕێکخستنەکان", + "@drawerSettingsButton": {}, + "drawerCollectionFavourites": "دڵخوازەکان", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "وێنەکان", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "ڤیدیۆکان", + "@drawerCollectionVideos": {}, + "drawerCollectionMotionPhotos": "وێنە جولاوەکان", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionSphericalVideos": "ڤیدیۆی ٣٦٠°", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "ئەلبومەکان", + "@drawerAlbumPage": {}, + "drawerCountryPage": "وڵات", + "@drawerCountryPage": {}, + "drawerPlacePage": "شوێنەکان", + "@drawerPlacePage": {}, + "sortByDate": "بە ڕێکەوت", + "@sortByDate": {}, + "sortByName": "بە ناو", + "@sortByName": {}, + "sortBySize": "بە قەبارە", + "@sortBySize": {}, + "sortByAlbumFileName": "بە ئەلبوم و ناوی بڕگە", + "@sortByAlbumFileName": {}, + "sortByRating": "بە هەڵسەنگاندن", + "@sortByRating": {}, + "sortByDuration": "بە ماوە", + "@sortByDuration": {}, + "sortByPath": "بە ڕێڕەو", + "@sortByPath": {}, + "sortOrderNewestFirst": "نوێیەکان لە پێشەوە", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "کۆنەکان لە پێشەوە", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "ئ بۆ ی", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "ی بۆ ئ", + "@sortOrderZtoA": {}, + "sourceViewerPageTitle": "سەرچاوە", + "@sourceViewerPageTitle": {}, + "aboutDataUsageSectionTitle": "دراوەی بەکارهێنان", + "@aboutDataUsageSectionTitle": {}, + "collectionActionEmptyBin": "گلێشدان بەتاڵە", + "@collectionActionEmptyBin": {}, + "collectionEmptyVideos": "ڤیدیۆی تێدا نییە", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "وێنەی تێدا نییە", + "@collectionEmptyImages": {}, + "albumCamera": "کامێرە", + "@albumCamera": {}, + "albumDownload": "داگرتنەکان", + "@albumDownload": {}, + "albumPageTitle": "ئەلبومەکان", + "@albumPageTitle": {}, + "albumEmpty": "ئەلبوم نییە", + "@albumEmpty": {}, + "createAlbumButtonLabel": "دروستکردن", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "نوێ", + "@newFilterBanner": {}, + "countryPageTitle": "وڵاتەکان", + "@countryPageTitle": {}, + "countryEmpty": "هیچ وڵاتێک نییە", + "@countryEmpty": {}, + "albumMimeTypeMixed": "تێکەڵاو", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "بۆ ئەلبوم لەبەریبگرەوە", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "بۆ ئەلبومی بنێرە", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "گواستنەوە بۆ ئەلبوم", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "ئەلبومێک دیاریکە", + "@albumPickPageTitlePick": {}, + "sourceStateCataloguing": "پۆلێن کردن", + "@sourceStateCataloguing": {}, + "filterRatingRejectedLabel": "ڕەتکراوە", + "@filterRatingRejectedLabel": {}, + "filterTypePanoramaLabel": "پانۆراما", + "@filterTypePanoramaLabel": {}, + "unitSystemImperial": "شاهانەیی", + "@unitSystemImperial": {}, + "widgetDisplayedItemMostRecent": "نوێترین", + "@widgetDisplayedItemMostRecent": {}, + "moveUndatedConfirmationDialogSetDate": "ڕێکەوتەکە پاشەکەوت بکە", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoStartOverButtonLabel": "لە سەرەتاوە", + "@videoStartOverButtonLabel": {}, + "castDialogTitle": "ئامێرەکانی پەخش", + "@castDialogTitle": {}, + "aboutCreditsSectionTitle": "ڕاپەڕموون", + "@aboutCreditsSectionTitle": {}, + "aboutDataUsageMisc": "جۆراوجۆر", + "@aboutDataUsageMisc": {}, + "collectionEmptyGrantAccessButtonLabel": "ڕێدان", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "بەشێک هەڵبژێرە", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "بەشێک لاببە", + "@collectionDeselectSectionTooltip": {}, + "albumScreenRecordings": "تۆمارەکانی ڕوونما", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "گرتە ڤیدیۆییەکان", + "@albumVideoCaptures": {}, + "drawerCollectionPanoramas": "پانۆراماکان", + "@drawerCollectionPanoramas": {}, + "sortOrderHighestFirst": "بڵندترین لە پێشەوە", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "نەویترین لە یەکەم", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "گەورەترین لە یەکەم", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "گچکەترین لە یەکەم", + "@sortOrderSmallestFirst": {}, + "sortOrderShortestFirst": "کورتترین لە یەکەم", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "درێژترین لە پێشەوە", + "@sortOrderLongestFirst": {}, + "collectionEmptyFavourites": "دڵخوازت نییە", + "@collectionEmptyFavourites": {}, + "albumGroupTier": "بە چین", + "@albumGroupTier": {}, + "albumGroupType": "بە جۆر", + "@albumGroupType": {}, + "albumGroupVolume": "بە گوێرەی قەبارەی پاشەکەوتی", + "@albumGroupVolume": {}, + "placePageTitle": "شوێنەکان", + "@placePageTitle": {}, + "placeEmpty": "هیچ شوێنێک نییە", + "@placeEmpty": {}, + "statePageTitle": "هەرێمەکان", + "@statePageTitle": {}, + "stateEmpty": "هەرێمی تێدا نییە", + "@stateEmpty": {}, + "binPageTitle": "گلێشدان", + "@binPageTitle": {}, + "searchRecentSectionTitle": "دوایین", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "ڕێکەوت", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "ئەلبومەکان", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "وڵات", + "@searchCountriesSectionTitle": {}, + "searchStatesSectionTitle": "هەرێم", + "@searchStatesSectionTitle": {}, + "searchPlacesSectionTitle": "شوێن", + "@searchPlacesSectionTitle": {}, + "searchRatingSectionTitle": "هەڵسەنگاندن", + "@searchRatingSectionTitle": {}, + "settingsPageTitle": "ڕێکخستنەکان", + "@settingsPageTitle": {}, + "settingsSystemDefault": "بنەڕەتی سیستەم", + "@settingsSystemDefault": {}, + "settingsDefault": "بنەڕەت", + "@settingsDefault": {}, + "settingsDisabled": "ناکاراکراو", + "@settingsDisabled": {}, + "settingsAskEverytime": "هەموو جارێ بپرسە", + "@settingsAskEverytime": {}, + "settingsModificationWarningDialogMessage": "ڕێکخستنەکانی تر دەستکاری دەکرێن.", + "@settingsModificationWarningDialogMessage": {}, + "settingsSearchFieldLabel": "گەڕانی لە ڕێکخستنەکان", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "هیچ ڕێکخستنێکی هاوشێوە نییە", + "@settingsSearchEmpty": {}, + "settingsActionExport": "هەناردن", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "هەناردن", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "هاوردن", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "هاوردن", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "بەرگ", + "@appExportCovers": {}, + "appExportDynamicAlbums": "ئەلبومی بزۆک", + "@appExportDynamicAlbums": {}, + "appExportFavourites": "دڵخوازەکان", + "@appExportFavourites": {}, + "appExportSettings": "ڕێکخستنەکان", + "@appExportSettings": {}, + "settingsDoubleBackExit": "دووجار \"گەڕانەوە\" داگرە بۆ دەرچوون", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "پەنجەرەی پەسەندکردن", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "پەنجەرەکانی پەسەندکردن", + "@settingsConfirmationDialogTitle": {}, + "settingsNavigationDrawerTabTypes": "جۆر", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "ئەلبوم", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "پەڕە", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "زیادکردنی ئەلبوم", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailShowFavouriteIcon": "وێنۆچکەی دڵخوازیی پیشاندە", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowLocationIcon": "وێنۆچکەی شوون پیشان بدە", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "وێنۆچکەی وێنەی جولاو پیشاندە", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "هەڵسەنگاندن پیشان بدە", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowVideoDuration": "ماوەی ڤیدیۆ پیشاندە", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionBurstPatternsNone": "هیچیان", + "@settingsCollectionBurstPatternsNone": {}, + "settingsVideoPageTitle": "ڕێکخستنەکانی ڤیدیۆ", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "ڤیدیۆ", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "پیشاندانی ڤیدیۆ", + "@settingsVideoShowVideos": {}, + "settingsViewerMaximumBrightness": "ئەوپەڕی ڕوونی", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "خۆکارانە وێنە جولاوەکان لێبدە", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "پاشبنەمای وێنە", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "فرمانە خێراکان", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "فرمانە خێراکان", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "دوگمە بەردەستەکان", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "دوگمە دانەندرایە", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerShowOverlayOnOpening": "لەگەڵ کردنەوە پیشان بدە", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "نەخشە گچکەکرایەکە پیشان بدە", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "پیشاندانی زانیاری", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "پیشاندانی سەرناو و ڕێکەوت و شوون و ئی تر.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowShootingDetails": "پیشاندانی وردەکارییەکانی وێنەگرتن", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowDescription": "پیشاندانی پەسن", + "@settingsViewerShowDescription": {}, + "settingsViewerEnableOverlayBlurEffect": "کاریگەری لێڵی", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsSlideshowRepeat": "پاتەکردنەوە", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "هەڕەمەکی", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowVideoPlaybackTile": "لێدانی ڤیدیۆ", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "لێدانی ڤیدیۆ", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsSubtitleThemeTile": "ژێرنووس", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "ژێرنووس", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "ئەمە نموونەیە.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextSize": "قەبارەی دەق", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeTextColor": "ڕەنگی دەق", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeBackgroundColor": "ڕەنگی پاشبنەما", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeTextAlignmentLeft": "چەپ", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "ناوەڕاست", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "ڕاست", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsSaveSearchHistory": "پاشەکەوتکردنی مێژووی گەڕان", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "گلێشدان بەکاربێنە", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "بابەتە سڕاوەکان بۆ ٣٠ ڕۆژ بهێڵەوە", + "@settingsEnableBinSubtitle": {}, + "settingsDisablingBinWarningDialogMessage": "بابەتەکانی ناو گلێشدان بۆ هەمیشە دەسڕێنەوە.", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsLanguageTile": "زمان", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "زمان", + "@settingsLanguagePageTitle": {}, + "settingsUnitSystemTile": "یەکە", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "یەکە", + "@settingsUnitSystemDialogTitle": {}, + "statsPageTitle": "ئامارەکان", + "@statsPageTitle": {}, + "statsTopCountriesSectionTitle": "سەرتۆپی وڵاتان", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "سەرتۆپی شوێنەکان", + "@statsTopPlacesSectionTitle": {}, + "statsTopAlbumsSectionTitle": "سەرتۆپی ئەلبومەکان", + "@statsTopAlbumsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "کردنەوەی پانۆراما", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "دانانی وەک پاشبنەما", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "بەداخەوە!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "ئەم پەڕگەیە چیتر بەردەست نییە.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "زانیاری", + "@viewerInfoPageTitle": {}, + "viewerInfoUnknown": "نەناسرای", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "پێناس", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "سەرناو", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "ڕێکەوت", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelSize": "قەبارە", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelPath": "ڕێڕەو", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "ماوە", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "خاوەن", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "پۆتان", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "ناونیشان", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "شێوازی نەخشە", + "@mapStyleDialogTitle": {}, + "mapStyleDialogAddStyle": "زیادکردنی شێواز", + "@mapStyleDialogAddStyle": {}, + "mapStyleTooltip": "شێوازێکی نەخشە دیاری بکە", + "@mapStyleTooltip": {}, + "mapStyleEditorDialogName": "ناو", + "@mapStyleEditorDialogName": {}, + "openMapPageTooltip": "لە پەڕەی نەخشە بیبینە", + "@openMapPageTooltip": {}, + "viewerInfoOpenLinkText": "کردنەوە", + "@viewerInfoOpenLinkText": {}, + "viewerInfoSearchSuggestionDate": "کات و ڕێکەوت", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "پێناس", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "ڕەهەند", + "@viewerInfoSearchSuggestionDimensions": {}, + "tagEditorSectionRecent": "دوایین", + "@tagEditorSectionRecent": {}, + "tagPlaceholderCountry": "وڵات", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "شوێن", + "@tagPlaceholderPlace": {} +} diff --git a/lib/l10n/app_cs.arb b/lib/l10n/app_cs.arb new file mode 100644 index 0000000..96c1d08 --- /dev/null +++ b/lib/l10n/app_cs.arb @@ -0,0 +1,952 @@ +{ + "welcomeOptional": "Volitelné", + "welcomeTermsToggle": "Souhlasím s podmínkami použivání", + "appName": "Aves", + "welcomeMessage": "Vítá tě Aves", + "applyButtonLabel": "POUŽÍT", + "deleteButtonLabel": "SMAZAT", + "nextButtonLabel": "DALŠÍ", + "showButtonLabel": "ZOBRAZIT", + "continueButtonLabel": "POKRAČOVAT", + "cancelTooltip": "Zrušit", + "changeTooltip": "Upravit", + "clearTooltip": "Vyčistit", + "previousTooltip": "Předchozí", + "nextTooltip": "Další", + "showTooltip": "Zobrazit", + "actionRemove": "Odstranit", + "resetTooltip": "Resetovat", + "saveTooltip": "Uložit", + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "timeDays": "{count, plural, =1{{count} den} few{{count} dny} other{{count} dnů}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "itemCount": "{count, plural, =1{{count} položka} few{{count} položky} other{{count} položek}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "columnCount": "{count, plural, =1{{count} sloupec} few{{count} sloupce} other{{count} sloupců}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "hideButtonLabel": "SKRÝT", + "hideTooltip": "Skrýt", + "doNotAskAgain": "Znovu nezobrazovat", + "sourceStateLoading": "Nahrávání", + "sourceStateCataloguing": "Katalogizace", + "sourceStateLocatingCountries": "Vyhledání zemí", + "sourceStateLocatingPlaces": "Vyhledávání míst", + "chipActionDelete": "Smazat", + "chipActionGoToAlbumPage": "Zobrazit v albech", + "chipActionGoToCountryPage": "Zobrazit v zemích", + "chipActionGoToTagPage": "Zobrazit ve štítcích", + "chipActionFilterOut": "Odfiltrovat", + "chipActionFilterIn": "Filtrovat", + "chipActionPin": "Připnout nahoru", + "chipActionUnpin": "Odepnout seshora", + "chipActionHide": "Skrýt", + "chipActionRename": "Přejmenovat", + "chipActionCreateAlbum": "Vytvořit album", + "entryActionCopyToClipboard": "Kopírovat do paměti", + "entryActionDelete": "Smazat", + "entryActionConvert": "Konvertovat", + "entryActionExport": "Exportovat", + "entryActionInfo": "Informace", + "entryActionRename": "Přejmenovat", + "entryActionRestore": "Obnovit", + "entryActionRotateCCW": "Otočit doleva", + "entryActionRotateCW": "Otočit doprava", + "entryActionFlip": "Převrátit vodorovně", + "entryActionPrint": "Tisknout", + "entryActionShare": "Sdílet", + "entryActionShareImageOnly": "Sdílet pouze obrázek", + "entryActionShareVideoOnly": "Sdílet pouze video", + "entryActionViewSource": "Zobrazit zdroj", + "entryActionShowGeoTiffOnMap": "Zobrazit jako překryv mapy", + "entryActionConvertMotionPhotoToStillImage": "Konvertovat na statický obrázek", + "entryActionViewMotionPhotoVideo": "Otevřít video", + "entryActionEdit": "Upravit", + "entryActionOpen": "Otevřít s", + "entryActionSetAs": "Nastavit jako", + "entryActionOpenMap": "Zobrazit na mapě", + "entryActionRotateScreen": "Otočit obrazovku", + "entryActionAddFavourite": "Přidat do oblíbených", + "entryActionRemoveFavourite": "Odebrat z oblíbených", + "videoActionCaptureFrame": "Zachytit rámeček", + "videoActionMute": "Ztlumit", + "videoActionUnmute": "Zrušit ztlumení", + "chipActionSetCover": "Nastavit přebal", + "videoActionPlay": "Spustit", + "videoActionPause": "Pozastavit", + "videoActionReplay10": "Přetočit zpět o 10 sekund", + "videoActionSkip10": "Posunout vpřed o 10 sekund", + "videoActionSelectStreams": "Vybrat stopy", + "videoActionSetSpeed": "Rychlost přehrávání", + "viewerActionSettings": "Nastavení", + "slideshowActionResume": "Pokračovat", + "slideshowActionShowInCollection": "Zobrazit ve sbírce", + "entryInfoActionEditDate": "Upravit datum a čas", + "entryInfoActionEditLocation": "Upravit polohu", + "entryInfoActionEditTitleDescription": "Upravit název a popis", + "entryInfoActionEditRating": "Upravit hodnocení", + "entryInfoActionEditTags": "Upravit štítky", + "entryInfoActionRemoveMetadata": "Odstranit metadata", + "entryInfoActionExportMetadata": "Exportovat metadata", + "entryInfoActionRemoveLocation": "Odstranit polohu", + "filterAspectRatioPortraitLabel": "Na výšku", + "filterAspectRatioLandscapeLabel": "Na šířku", + "filterBinLabel": "Koš", + "filterFavouriteLabel": "Oblíbené", + "filterNoDateLabel": "Bez data", + "filterNoAddressLabel": "Bez adresy", + "filterNoLocationLabel": "Bez polohy", + "filterNoRatingLabel": "Nehodnocený", + "filterNoTagLabel": "Bez štítků", + "filterNoTitleLabel": "Bez názvu", + "filterOnThisDayLabel": "V tento den", + "filterRecentlyAddedLabel": "Naposled přidané", + "filterRatingRejectedLabel": "Zamítnutý", + "filterTypeAnimatedLabel": "Animovaný", + "filterTypeMotionPhotoLabel": "Pohyblivá fotografie", + "filterTypePanoramaLabel": "Panoráma", + "filterTypeRawLabel": "Raw", + "filterTypeSphericalVideoLabel": "360° video", + "filterTypeGeotiffLabel": "GeoTIFF", + "filterMimeImageLabel": "Obrázek", + "filterMimeVideoLabel": "Video", + "coordinateDmsNorth": "S", + "coordinateDmsSouth": "J", + "coordinateDmsEast": "V", + "coordinateDmsWest": "Z", + "unitSystemMetric": "Metrická soustava", + "unitSystemImperial": "Imperiální jednotky", + "videoLoopModeNever": "Nikdy", + "videoLoopModeShortOnly": "Pouze krátká videa", + "videoLoopModeAlways": "Vždy", + "videoControlsPlayOutside": "Otevřít jiným přehrávačem", + "coordinateFormatDms": "Stupně, minuty, vteřiny", + "coordinateFormatDecimal": "Stupně s desetinnými místy", + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "mapStyleGoogleTerrain": "Mapy Google (terén)", + "mapStyleOsmHot": "Humanitární OSM", + "mapStyleStamenWatercolor": "Stamen Watercolor (vodové barvy)", + "nameConflictStrategyRename": "Přejmenovat", + "nameConflictStrategyReplace": "Nahradit", + "keepScreenOnVideoPlayback": "Při přehrávání videa", + "keepScreenOnAlways": "Vždy", + "accessibilityAnimationsRemove": "Zakázat vizuální efekty", + "accessibilityAnimationsKeep": "Povolit vizuální efekty", + "displayRefreshRatePreferHighest": "Nejvyšší", + "subtitlePositionTop": "Nahoře", + "keepScreenOnViewerOnly": "Pouze v zobrazení prohlížeče", + "subtitlePositionBottom": "Dole", + "videoPlaybackSkip": "Přeskočit", + "videoPlaybackMuted": "Přehrát ztlumené", + "videoPlaybackWithSound": "Přehrát se zvukem", + "themeBrightnessLight": "Světlé", + "themeBrightnessDark": "Tmavé", + "themeBrightnessBlack": "Černé", + "viewerTransitionSlide": "Posun", + "viewerTransitionParallax": "Parallax", + "viewerTransitionFade": "Zeslábnutí", + "viewerTransitionZoomIn": "Přiblížení", + "viewerTransitionNone": "Žádný", + "wallpaperTargetHome": "Domovská obrazovka", + "wallpaperTargetLock": "Zamykací obrazovka", + "wallpaperTargetHomeLock": "Domovská i zamykací obrazovka", + "widgetDisplayedItemRandom": "Náhodně", + "widgetDisplayedItemMostRecent": "Nejnovější", + "widgetOpenPageHome": "Otevřít domovskou stránku", + "widgetOpenPageCollection": "Otevřít sbírku", + "widgetOpenPageViewer": "Otevřít prohlížeč", + "albumTierNew": "Nové", + "albumTierPinned": "Připnuté", + "albumTierSpecial": "Společné", + "albumTierApps": "Aplikace", + "albumTierRegular": "Ostatní", + "storageVolumeDescriptionFallbackPrimary": "Interní úložiště", + "storageVolumeDescriptionFallbackNonPrimary": "SD karta", + "rootDirectoryDescription": "kořenový adresář", + "otherDirectoryDescription": "„{name}“ adresář", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "storageAccessDialogMessage": "Prosím zvolte adresář {directory} v „{volume}“ na další obrazovce, abyste k němu povolili aplikaci přístup.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "restrictedAccessDialogMessage": "Tato aplikace nemá povolené úpravy souborů v adresáři {directory} v „{volume}“.\n\nPro přesun položek do jiného adresáře prosím použijte předinstalovaného správce souborů nebo galerii.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "notEnoughSpaceDialogMessage": "Pro dokončení této operace je vyžadováno {neededSize} volného místa na „{volume}“, ale k dispozici je pouze {freeSize}.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "unsupportedTypeDialogMessage": "{count, plural, =1{Tato operace není dostupná pro položky tohoto typu: {types}.} other{Tato operace není dostupná pro položky těchto typů: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "nameConflictDialogSingleSourceMessage": "Některé soubory v cílovém umístění mají stejný název.", + "nameConflictDialogMultipleSourceMessage": "Některé soubory mají stejný název.", + "addShortcutButtonLabel": "PŘIDAT", + "noMatchingAppDialogMessage": "Pro tuto operaci není k dispozici žádná aplikace.", + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Smazat tuto položku?} few{Smazat tyto {count} položky?} other{Smazat těchto {count} položek?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "moveUndatedConfirmationDialogMessage": "Uložit data položek, než budete pokračovat?", + "missingSystemFilePickerDialogMessage": "Systémový nástroj pro výběr souborů chybí nebo je zakázaný. Prosím povolte jej a zkuste to znovu.", + "addShortcutDialogLabel": "Název zástupce", + "moveUndatedConfirmationDialogSetDate": "Uložit tada", + "videoResumeDialogMessage": "Chcete obnovit přehrávání v čase {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "videoStartOverButtonLabel": "SPUSTIT ZNOVU", + "videoResumeButtonLabel": "POKRAČOVAT", + "setCoverDialogLatest": "Poslední položka", + "newAlbumDialogNameLabel": "Název alba", + "newAlbumDialogNameLabelAlreadyExistsHelper": "Adresář již existuje", + "newAlbumDialogStorageLabel": "Úložiště:", + "renameAlbumDialogLabel": "Nový název", + "renameAlbumDialogLabelAlreadyExistsHelper": "Adresář již existuje", + "renameEntrySetPageTitle": "Přejmenovat", + "renameEntrySetPagePatternFieldLabel": "Vzor názvu", + "renameEntrySetPageInsertTooltip": "Vložit pole", + "renameEntrySetPagePreviewSectionTitle": "Náhled", + "renameProcessorName": "Název", + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Smazat toto album a v něm obsaženou položku?} few{Smazat toto album a v něm obsažené {count} položky?} other{Smazat toto album a v něm obsažených {count} položek?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Smazat tato alba a v nich obsaženou položku?} few{Smazat tato alba a v nich obsažené {count} položky?} other{Smazat tato alba a v nich obsažených {count} položek?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "exportEntryDialogFormat": "Formát:", + "exportEntryDialogWidth": "Šířka", + "exportEntryDialogHeight": "Výška", + "renameEntryDialogLabel": "Nový název", + "editEntryDialogCopyFromItem": "Kopírovat z jiné položky", + "editEntryDialogTargetFieldsHeader": "Pole k úpravě", + "editEntryDateDialogCopyField": "Kopírovat z jiného data", + "editEntryDateDialogExtractFromTitle": "Odvodit z názvu", + "editEntryDateDialogShift": "Posun", + "editEntryDateDialogSourceFileModifiedDate": "Datum úpravy souboru", + "durationDialogHours": "Hodiny", + "durationDialogMinutes": "Minuty", + "durationDialogSeconds": "Sekundy", + "renameProcessorCounter": "Počítadlo", + "editEntryLocationDialogTitle": "Poloha", + "editEntryLocationDialogSetCustom": "Nastavit vlastní polohu", + "editEntryLocationDialogChooseOnMap": "Vybrat na mapě", + "editEntryLocationDialogLatitude": "Zeměpisná šířka", + "editEntryLocationDialogLongitude": "Zeměpisná délka", + "locationPickerUseThisLocationButton": "Použít tuto polohu", + "editEntryRatingDialogTitle": "Hodnocení", + "removeEntryMetadataDialogTitle": "Odstranění metadat", + "removeEntryMetadataDialogMore": "Zobrazit více", + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Pro přehrávání videa v pohyblivé fotografii je vyžadováno XMP.\n\nOpravdu jej chcete odstranit?", + "videoSpeedDialogLabel": "Rychlost přehrávání", + "videoStreamSelectionDialogVideo": "Video", + "videoStreamSelectionDialogAudio": "Audio", + "videoStreamSelectionDialogText": "Titulky", + "videoStreamSelectionDialogOff": "Vypnuto", + "videoStreamSelectionDialogTrack": "Stopa", + "videoStreamSelectionDialogNoSelection": "Nejsou k dispozici žádné další stopy.", + "genericSuccessFeedback": "Hotovo!", + "genericFailureFeedback": "Selhání", + "genericDangerWarningDialogMessage": "Jste si jisti?", + "menuActionConfigureView": "Zobrazení", + "menuActionSelect": "Výběr", + "menuActionSelectAll": "Vybrat vše", + "menuActionSelectNone": "Zrušit výběr", + "menuActionMap": "Mapa", + "menuActionSlideshow": "Slideshow", + "menuActionStats": "Statistiky", + "viewDialogGroupSectionTitle": "Sekce", + "viewDialogLayoutSectionTitle": "Rozložení", + "viewDialogReverseSortOrder": "Obrátit řazení", + "tileLayoutGrid": "Mřížka", + "tileLayoutList": "Seznam", + "drawerCollectionVideos": "Videa", + "drawerCollectionAnimated": "Animované", + "drawerCollectionMotionPhotos": "Pohyblivé fotografie", + "sortByAlbumFileName": "Podle alba a názvu souboru", + "sortByRating": "Podle hodnocení", + "settingsPageTitle": "Nastavení", + "settingsSystemDefault": "Výchozí nastavení systému", + "settingsDefault": "Výchozí", + "settingsDisabled": "Zakázáno", + "settingsSearchFieldLabel": "Prohledat nastavení", + "settingsSearchEmpty": "Žádné odpovídající položky", + "settingsActionExport": "Export", + "settingsActionExportDialogTitle": "Export", + "settingsActionImport": "Import", + "settingsActionImportDialogTitle": "Import", + "appExportCovers": "Přebaly", + "appExportFavourites": "Oblíbené", + "appExportSettings": "Nastavení", + "settingsHomeTile": "Domů", + "settingsNavigationSectionTitle": "Navigace", + "settingsHomeDialogTitle": "Domů", + "settingsKeepScreenOnTile": "Ponechat obrazovku zapnutou", + "settingsKeepScreenOnDialogTitle": "Ponechat obrazovku zapnutou", + "albumGroupTier": "Podle úrovně", + "albumMimeTypeMixed": "Smíšené", + "settingsNavigationDrawerTabTypes": "Typy", + "settingsNavigationDrawerTabAlbums": "Alba", + "settingsNavigationDrawerTabPages": "Stránky", + "settingsNavigationDrawerAddAlbum": "Přidat album", + "settingsThumbnailSectionTitle": "Náhledy", + "settingsThumbnailShowFavouriteIcon": "Zobrazit ikonu oblíbených", + "settingsThumbnailShowTagIcon": "Zobrazit ikonu štítků", + "settingsThumbnailShowLocationIcon": "Zobrazit ikonu polohy", + "settingsCollectionQuickActionTabSelecting": "Výběr", + "settingsCollectionBrowsingQuickActionEditorBanner": "Stiskněte a podržte pro přesun tlačítek a vyberte, které akce budou zobrazeny při procházení položek.", + "settingsCollectionSelectionQuickActionEditorBanner": "Stiskněte a podržte pro přesun tlačítek a vyberte, které akce budou zobrazeny při výběru položek.", + "settingsViewerSectionTitle": "Prohlížeč", + "settingsViewerGestureSideTapNext": "Stisknout v rozích obrazovky pro zobrazení předcházející/následující položky", + "settingsViewerUseCutout": "Použít oblast výřezu", + "settingsViewerMaximumBrightness": "Nejvyšší jas", + "settingsMotionPhotoAutoPlay": "Automatické přehrávání pohyblivých fotografií", + "settingsImageBackground": "Pozadí obrázku", + "settingsViewerQuickActionsTile": "Rychlé akce", + "settingsViewerQuickActionEditorPageTitle": "Rychlé akce", + "settingsViewerQuickActionEditorBanner": "Stiskněte a podržte pro přesun tlačítek a vyberte, které akce budou zobrazeny při prohlížení položek.", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Zobrazená tlačítka", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Dostupná tlačítka", + "settingsViewerQuickActionEmpty": "Žádná tlačítka", + "settingsViewerOverlayTile": "Souhrn", + "settingsViewerOverlayPageTitle": "Souhrn", + "settingsThumbnailOverlayTile": "Zobrazené detaily", + "settingsThumbnailOverlayPageTitle": "Zobrazené detaily", + "settingsViewerShowMinimap": "Zobrazit minimapu", + "settingsViewerShowInformationSubtitle": "Zobrazit název, datum, polohu apod.", + "settingsViewerShowShootingDetails": "Zobrazit podrobnosti o pořízené fogotrafii", + "settingsViewerShowOverlayThumbnails": "Zobrazit náhledy", + "settingsViewerEnableOverlayBlurEffect": "Efekt rozostření", + "settingsViewerSlideshowTile": "Prezentace", + "settingsViewerSlideshowPageTitle": "Prezentace", + "settingsSlideshowTransitionTile": "Přechod", + "settingsSlideshowVideoPlaybackTile": "Přehrávání videa", + "settingsSlideshowVideoPlaybackDialogTitle": "Přehrávání videa", + "settingsVideoPageTitle": "Nastavení videa", + "settingsVideoSectionTitle": "Video", + "settingsVideoShowVideos": "Zobrazovat videa", + "settingsVideoEnableHardwareAcceleration": "Hardwarová akcelerace", + "settingsVideoAutoPlay": "Automatické přehrávání", + "settingsVideoLoopModeTile": "Režim smyčky", + "settingsVideoLoopModeDialogTitle": "Režim smyčky", + "settingsSubtitleThemeTile": "Titulky", + "settingsSubtitleThemeTextAlignmentTile": "Zarovnání textu", + "settingsSubtitleThemeTextAlignmentDialogTitle": "Zarovnání textu", + "settingsSubtitleThemeShowOutline": "Zobrazovat obrys a stín", + "settingsSubtitleThemeTextColor": "Barva textu", + "settingsSubtitleThemeTextOpacity": "Průhlednost textu", + "settingsSubtitleThemeBackgroundColor": "Barva pozadí", + "settingsSubtitleThemeBackgroundOpacity": "Průhlednost pozadí", + "settingsSubtitleThemeTextAlignmentLeft": "Doleva", + "settingsSubtitleThemeTextAlignmentCenter": "Na střed", + "settingsSubtitleThemeTextAlignmentRight": "Doprava", + "settingsVideoControlsTile": "Ovládání", + "settingsVideoGestureDoubleTapTogglePlay": "Dvojité stisknutí pro spuštění / pauzu", + "settingsVideoGestureSideDoubleTapSeek": "Dvojití stisknutí v rozích obrazovky pro posun vzad / vpřed", + "settingsAllowInstalledAppAccess": "Povolit přístup do aplikačního inventáře", + "settingsAllowInstalledAppAccessSubtitle": "Používá se pro zlepšení zobrazení alb", + "settingsAllowErrorReporting": "Povolit anonymní chybová hlášení", + "settingsSaveSearchHistory": "Uložit historii vyhledávání", + "settingsEnableBin": "Používat koš", + "settingsEnableBinSubtitle": "Ponechat v koši smazané položky po dobu 30 dní", + "settingsAllowMediaManagement": "Povolit správu médií", + "settingsHiddenItemsTile": "Skryté položky", + "settingsHiddenItemsPageTitle": "Skryté položky", + "settingsHiddenFiltersBanner": "Fotografie a videa odpovídající filtrům skrytých položek nebudou zobrazeny ve vaši sbírce.", + "settingsHiddenFiltersEmpty": "Žádné filtry skrytých položek", + "settingsStorageAccessTile": "Přístup k úložišti", + "settingsStorageAccessPageTitle": "Přístup k úložišti", + "settingsStorageAccessEmpty": "Žádné povolené přístupy", + "settingsStorageAccessRevokeTooltip": "Odvolat", + "settingsAccessibilitySectionTitle": "Přístupnost", + "settingsRemoveAnimationsTile": "Zakázat animace", + "settingsRemoveAnimationsDialogTitle": "Zakázat animace", + "settingsTimeToTakeActionTile": "Čas k provedení akce", + "settingsAccessibilityShowPinchGestureAlternatives": "Zobrazit alternativy vícedotykových gest", + "settingsDisplaySectionTitle": "Zobrazení", + "settingsThemeBrightnessTile": "Vzhled", + "settingsThemeBrightnessDialogTitle": "Vzhled", + "settingsThemeColorHighlights": "Zvýraznění barev", + "settingsThemeEnableDynamicColor": "Dynamické barvy", + "settingsDisplayRefreshRateModeTile": "Obnovovací frekvence displeje", + "settingsDisplayRefreshRateModeDialogTitle": "Obnovovací frekvence", + "settingsLanguageSectionTitle": "Jazyk a formáty", + "settingsLanguageTile": "Jazyk", + "settingsLanguagePageTitle": "Jazyk", + "settingsCoordinateFormatTile": "Formát souřadnic", + "settingsCoordinateFormatDialogTitle": "Formát souřadnic", + "settingsUnitSystemDialogTitle": "Jednotky", + "settingsScreenSaverPageTitle": "Spořič displeje", + "settingsWidgetPageTitle": "Rámeček fotografie", + "settingsWidgetShowOutline": "Obrys", + "settingsWidgetOpenPage": "Při stisknutí widgetu", + "settingsWidgetDisplayedItem": "Zobrazená položka", + "settingsCollectionTile": "Sbírka", + "statsPageTitle": "Statistiky", + "statsTopCountriesSectionTitle": "Nejčastější země", + "statsTopPlacesSectionTitle": "Nejčastější místa", + "statsTopTagsSectionTitle": "Nejčastější štítky", + "statsTopAlbumsSectionTitle": "Nejčastější alba", + "viewerOpenPanoramaButtonLabel": "OTEVŘÍT PANORAMA", + "viewerSetWallpaperButtonLabel": "NASTAVIT POZADÍ", + "viewerErrorUnknown": "Jejda!", + "viewerErrorDoesNotExist": "Soubor již neexistuje.", + "viewerInfoPageTitle": "Detaily", + "viewerInfoBackToViewerTooltip": "Zpět k prohlížení", + "viewerInfoUnknown": "neznámý", + "viewerInfoLabelDescription": "Popis", + "viewerInfoLabelTitle": "Název", + "viewerInfoLabelResolution": "Rozlišení", + "viewerInfoLabelSize": "Velikost", + "viewerInfoLabelUri": "URI", + "viewerInfoLabelPath": "Umístění", + "viewerInfoLabelDuration": "Délka", + "viewerInfoLabelCoordinates": "Souřadnice", + "viewerInfoLabelAddress": "Adresa", + "mapStyleDialogTitle": "Styl mapy", + "mapStyleTooltip": "Vyberte styl mapy", + "mapZoomInTooltip": "Přiblížit", + "mapZoomOutTooltip": "Oddálit", + "mapPointNorthUpTooltip": "Sever nahoře", + "openMapPageTooltip": "Zobrazit na mapě", + "mapEmptyRegion": "Žádné obrázky v této oblasti", + "viewerInfoOpenEmbeddedFailureFeedback": "Nepodařilo se extrahovat vložená data", + "viewerInfoOpenLinkText": "Otevřít", + "viewerInfoSearchFieldLabel": "Prohledat metadata", + "viewerInfoSearchEmpty": "Žádné odpovídající klíče", + "viewerInfoSearchSuggestionDate": "Datum a čas", + "viewerInfoSearchSuggestionDescription": "Popis", + "viewerInfoSearchSuggestionResolution": "Rozlišení", + "wallpaperUseScrollEffect": "Použít rolovací efekt na domovské obrazovce", + "tagEditorPageTitle": "Upravit štítky", + "mapAttributionOsmHot": "Dlaždice z [HOT](https://www.hotosm.org/) • Hostováno na [OSM France](https://openstreetmap.fr/)", + "viewerInfoSearchSuggestionRights": "Práva", + "tagEditorSectionPlaceholders": "Umístění", + "tagPlaceholderCountry": "Země", + "tagPlaceholderPlace": "Místo", + "panoramaEnableSensorControl": "Povolit ovládání senzorem", + "sourceViewerPageTitle": "Zdroj", + "pickTooltip": "Vybrat", + "doubleBackExitMessage": "Pro ukončení klepněte znovu na „zpět“.", + "mapStyleGoogleNormal": "Mapy Google", + "mapStyleGoogleHybrid": "Mapy Google (satelitní)", + "displayRefreshRatePreferLowest": "Nejnižší", + "nameConflictStrategySkip": "Přeskočit", + "keepScreenOnNever": "Nikdy", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Přesunout tuto položku do koše?} few{Přesunout tyto {count} položky do koše?} other{Přesunout těchto {count} položek do koše?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "setCoverDialogCustom": "Vlastní", + "appPickDialogTitle": "Vybrat aplikaci", + "setCoverDialogAuto": "Automaticky", + "hideFilterConfirmationDialogMessage": "Odpovídající fotografie a videa budou ve vaší sbírce schovány. Můžete je znovu zobrazit v nastavení \"Soukromí\".\n\nOpravdu je chcete skrýt?", + "newAlbumDialogTitle": "Nové album", + "editEntryDateDialogTitle": "Datum a čas", + "editEntryDateDialogSetCustom": "Nastavit vlastní datum", + "aboutBugCopyInfoButton": "Kopírovat", + "viewDialogSortSectionTitle": "Řazení", + "coverDialogTabColor": "Barva", + "tileLayoutMosaic": "Mozaika", + "coverDialogTabCover": "Přebal", + "coverDialogTabApp": "Aplikace", + "aboutPageTitle": "O aplikaci", + "aboutBugSectionTitle": "Hlášení chyb", + "aboutLinkLicense": "Licence", + "appPickDialogNone": "Žádný", + "aboutLinkPolicy": "Zásady ochrany osobních údajů", + "aboutBugSaveLogInstruction": "Uložte aplikační logy do souboru", + "aboutBugReportInstruction": "Nahlásit na GitHub s logy a informacemi o systému", + "aboutBugReportButton": "Nahlásit", + "aboutCreditsWorldAtlas2": "pod ISC licencí.", + "collectionEmptyFavourites": "Žádné oblíbené položky", + "albumScreenRecordings": "Nahrávky obrazovky", + "aboutCreditsSectionTitle": "Zásluhy", + "aboutBugCopyInfoInstruction": "Zkopírujte informace o systému", + "collectionMoveFailureFeedback": "{count, plural, =1{Chyba při přesouvání 1 položky} other{Chyba při přesouvání {count} položek}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameFailureFeedback": "{count, plural, =1{Chyba přejmenování 1 položky} other{Chyba přejmenování {count} položek}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{Chyba při exportu 1 stránky} other{Chyba při exportu {count} stránek}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "drawerCollectionRaws": "Fotografie Raw", + "drawerTagPage": "Štítky", + "aboutCreditsWorldAtlas1": "Tato aplikace využívá soubor TopoJSON od", + "drawerCollectionSphericalVideos": "360° videa", + "aboutLicensesBanner": "Tato aplikace využívá tyto open-source baličky a knihovny.", + "aboutLicensesSectionTitle": "Licence open-source", + "collectionActionHideTitleSearch": "Skrýt filtr dle názvu", + "aboutTranslatorsSectionTitle": "Překladatalé", + "aboutLicensesAndroidLibrariesSectionTitle": "Knihovny Androidu", + "aboutLicensesFlutterPackagesSectionTitle": "Baličky Flutteru", + "policyPageTitle": "Zásady ochrany osobních údajů", + "collectionPageTitle": "Sbírky", + "collectionPickPageTitle": "Výběr", + "collectionActionShowTitleSearch": "Filtrovat dle názvu", + "collectionSelectPageTitle": "Vybrat položky", + "aboutLicensesFlutterPluginsSectionTitle": "Pluginy Flutteru", + "aboutLicensesDartPackagesSectionTitle": "Balíčky Dartu", + "aboutLicensesShowAllButtonLabel": "Zobrazit všechny licence", + "collectionActionEmptyBin": "Vysypat koš", + "collectionActionCopy": "Kopírovat do alba", + "collectionActionMove": "Přesunout do alba", + "collectionActionEdit": "Upravit", + "collectionCopyFailureFeedback": "{count, plural, =1{Chyba při kopírování 1 položky} other{Chyba při kopírování {count} položek}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionActionAddShortcut": "Vytvořit zástupce", + "collectionGroupDay": "Podle dne", + "collectionSelectSectionTooltip": "Vybrat sekci", + "drawerAboutButton": "O aplikaci", + "collectionActionRescan": "Znovu prohledat", + "collectionSearchTitlesHintText": "Hledat názvy", + "collectionGroupAlbum": "Podle alba", + "collectionGroupMonth": "Podle měsíce", + "sectionUnknown": "Neznámý", + "dateToday": "Dnes", + "dateYesterday": "Včera", + "dateThisMonth": "Tento měsíc", + "collectionDeleteFailureFeedback": "{count, plural, =1{Chyba při mazání 1 položky} other{Chyba při mazání {count} položek}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sortOrderLowestFirst": "Od nejnižšího", + "collectionEditFailureFeedback": "{count, plural, =1{Chyba při úpravě 1 položky} other{Chyba při úpravě {count} položek}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, =1{Zkopírována 1 položka} few{Zkopírovány {count} položky} other{Zkopírováno {count} položek}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{Přesunuta 1 položka} few{Přesunuty {count} položky} other{Přesunuto {count} položek}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{Přejmenována 1 položka} few{Přejmenovány {count} položky} other{Přejmenováno {count} položek}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{Upravena 1 položka} few{Upraveny {count} položky} other{Upraveno {count} položek}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyVideos": "Žádná videa", + "collectionDeselectSectionTooltip": "Zrušit výběr sekce", + "drawerSettingsButton": "Nastavení", + "drawerCollectionFavourites": "Oblíbené", + "drawerCollectionPanoramas": "Panoramata", + "drawerCountryPage": "Země", + "sortByDate": "Podle data", + "sortByName": "Abecedně", + "sortByItemCount": "Podle počtu položek", + "sortBySize": "Podle velikosti", + "albumGroupVolume": "Podle úložiště", + "drawerCollectionAll": "Celá sbírka", + "collectionEmptyImages": "Žádné obrázky", + "collectionEmptyGrantAccessButtonLabel": "Povolit přístup", + "drawerCollectionImages": "Obrázky", + "drawerAlbumPage": "Alba", + "sortOrderZtoA": "Od Z do A", + "sortOrderHighestFirst": "Od nejvyššího", + "albumGroupType": "Podle typu", + "sortOrderNewestFirst": "Od nejnovějšího", + "sortOrderAtoZ": "Od A do Z", + "sortOrderOldestFirst": "Od nejstaršího", + "albumPickPageTitleExport": "Exportovat do alba", + "albumCamera": "Fotoaparát", + "albumPageTitle": "Alba", + "albumEmpty": "Žádná alba", + "createAlbumButtonLabel": "VYTVOŘIT", + "searchPlacesSectionTitle": "Místa", + "sortOrderLargestFirst": "Od nejširšího", + "sortOrderSmallestFirst": "Od nejužšího", + "albumVideoCaptures": "Snímky videa", + "countryPageTitle": "Země", + "searchCollectionFieldHint": "Prohledat sbírky", + "albumPickPageTitleCopy": "Kopírovat do alba", + "tagPageTitle": "Štítky", + "albumPickPageTitleMove": "Přesunout do alba", + "albumPickPageTitlePick": "Vybrat album", + "albumDownload": "Stažené", + "albumScreenshots": "Snímky obrazovky", + "newFilterBanner": "nový", + "countryEmpty": "Žádné země", + "tagEmpty": "Žádné štítky", + "binPageTitle": "Koš", + "searchMetadataSectionTitle": "Metadata", + "searchRatingSectionTitle": "Hodnocení", + "settingsDoubleBackExit": "Klepnout dvakrát na „zpět“ pro ukončení", + "settingsConfirmationTile": "Potvrzovací dialogy", + "settingsConfirmationBeforeDeleteItems": "Zeptat se před smazáním položek navždy", + "settingsConfirmationAfterMoveToBinItems": "Zobrazit zprávu po přesunu položek do koše", + "searchRecentSectionTitle": "Nedávné", + "searchDateSectionTitle": "Datum", + "searchAlbumsSectionTitle": "Alba", + "searchCountriesSectionTitle": "Země", + "searchTagsSectionTitle": "Štítky", + "settingsNavigationDrawerTile": "Navigační menu", + "settingsNavigationDrawerEditorPageTitle": "Navigační menu", + "settingsCollectionQuickActionEditorPageTitle": "Rychlé akce", + "settingsConfirmationDialogTitle": "Potvrzovací dialogy", + "settingsConfirmationBeforeMoveUndatedItems": "Zeptat se před přesunem položek bez data", + "settingsConfirmationBeforeMoveToBinItems": "Zeptat se před přesunem položek do koše", + "settingsNavigationDrawerBanner": "Stiskněte a podržte pro přesun položek a změnu jejich pořadí.", + "settingsCollectionQuickActionTabBrowsing": "Procházení", + "settingsThumbnailShowMotionPhotoIcon": "Zobrazit ikonu pohyblivých fotografií", + "settingsThumbnailShowRating": "Zobrazit hodnocení", + "settingsThumbnailShowRawIcon": "Zobrazit ikonu RAW", + "settingsThumbnailShowVideoDuration": "Zobrazit délku videa", + "settingsCollectionQuickActionsTile": "Rychlé akce", + "timeMinutes": "{count, plural, =1{{count} minuta} few{{count} minuty} other{{count} minut}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "timeSeconds": "{count, plural, =1{{count} sekunda} few{{count} sekundy} other{{count} sekund}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "settingsViewerShowOverlayOnOpening": "Zobrazit při otevření", + "settingsViewerShowInformation": "Zobrazit informace", + "settingsViewerShowRatingTags": "Zobrazit hodnocení a štítky", + "settingsSlideshowRepeat": "Opakovat", + "settingsSubtitleThemeTextPositionTile": "Pozice textu", + "settingsSlideshowFillScreen": "Vyplnit obrazovku", + "settingsSlideshowShuffle": "Náhodně", + "settingsSlideshowAnimatedZoomEffect": "Animovaný efekt přiblížení", + "settingsSlideshowIntervalTile": "Prodleva", + "settingsSubtitleThemeSample": "Toto je příklad.", + "settingsSubtitleThemeTextSize": "Velikost textu", + "settingsSubtitleThemePageTitle": "Titulky", + "settingsSubtitleThemeTextPositionDialogTitle": "Pozice textu", + "settingsVideoButtonsTile": "Tlačítka", + "settingsVideoControlsPageTitle": "Ovládání", + "settingsPrivacySectionTitle": "Soukromí", + "settingsStorageAccessBanner": "Některé adresáře vyžadují explicitní udělení přístupu k úpravě jejich souborů. Zde si můžete prohlédnout adresáře, ke kterým jste dříve udělili přístup.", + "settingsUnitSystemTile": "Jednotky", + "statsWithGps": "{count, plural, =1{1 položka s polohou} few{{count} položky s polohou} other{{count} položek s polohou}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "viewerInfoLabelDate": "Datum", + "viewerInfoLabelOwner": "Vlastník", + "tagEditorPageAddTagTooltip": "Přidat štítek", + "viewerInfoViewXmlLinkText": "Zobrazit XML", + "viewerInfoSearchSuggestionDimensions": "Rozměry", + "tagEditorPageNewTagFieldLabel": "Nový štítek", + "tagEditorSectionRecent": "Nedávné", + "mapAttributionStamen": "Dlaždice z [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "panoramaDisableSensorControl": "Zakázat ovládání senzorem", + "filterLocatedLabel": "S polohou", + "filterTaggedLabel": "Se štítky", + "settingsDisplayUseTvInterface": "Rozhraní Android TV", + "tooManyItemsErrorDialogMessage": "Zkuste znovu s několika dalšími položkami.", + "settingsModificationWarningDialogMessage": "Ostatní nastavení budou upravena.", + "settingsViewerShowDescription": "Zobrazit popis", + "settingsVideoGestureVerticalDragBrightnessVolume": "Potáhnout nahoru či dolů pro úpravu jasu/hlasitosti", + "settingsDisablingBinWarningDialogMessage": "Položky v koši budou navždy odstraněny.", + "chipActionLock": "Uzamknout", + "chipActionGoToPlacePage": "Zobrazit v místech", + "vaultLockTypePassword": "Heslo", + "settingsConfirmationVaultDataLoss": "Zobrazit varování o možnosti ztráty dat trezorů", + "lengthUnitPercent": "%", + "albumTierVaults": "Trezory", + "lengthUnitPixel": "px", + "vaultLockTypePin": "PIN", + "chipActionCreateVault": "Vytvořit trezor", + "chipActionConfigureVault": "Upravit trezor", + "newVaultWarningDialogMessage": "Položky v trezorech jsou přístupné pouze této aplikaci a žádné jiné.\n\nPokud tuto aplikaci odinstalujete, nebo smažete její data, o všechny tyto položky přijdete.", + "vaultLockTypePattern": "Vzor", + "vaultDialogLockTypeLabel": "Typ uzamčení", + "pinDialogEnter": "Zadejte PIN", + "patternDialogConfirm": "Potvrďte gesto", + "patternDialogEnter": "Zadejte gesto", + "pinDialogConfirm": "Potvrďte PIN", + "passwordDialogEnter": "Zadejte heslo", + "passwordDialogConfirm": "Potvrďte heslo", + "exportEntryDialogWriteMetadata": "Zapsat metadata", + "drawerPlacePage": "Místa", + "placePageTitle": "Místa", + "placeEmpty": "Žádná místa", + "authenticateToConfigureVault": "Pro úpravu teroru se ověřte", + "authenticateToUnlockVault": "Ověřte se pro otevření trezoru", + "newVaultDialogTitle": "Nový trezor", + "configureVaultDialogTitle": "Nastavit trezor", + "vaultDialogLockModeWhenScreenOff": "Uzamknout při vypnutí displeje", + "vaultBinUsageDialogMessage": "Některé trezory používají koš.", + "settingsVideoBackgroundMode": "Režim na pozadí", + "settingsCollectionBurstPatternsNone": "Žádný", + "chipActionShowCountryStates": "Zobrazit země", + "viewerActionLock": "Uzamknout prohlížení", + "viewerActionUnlock": "Odemknout prohlížení", + "settingsVideoEnablePip": "Obraz v obraze", + "statePageTitle": "Státy", + "stateEmpty": "Žádné státy", + "searchStatesSectionTitle": "Státy", + "settingsCollectionBurstPatternsTile": "Vzory dávek", + "statsTopStatesSectionTitle": "Nejčastější státy", + "tagPlaceholderState": "Stát", + "settingsVideoBackgroundModeDialogTitle": "Režim na pozadí", + "saveCopyButtonLabel": "ULOŽIT KOPII", + "applyTooltip": "Použít", + "editorTransformCrop": "Oříznout", + "editorTransformRotate": "Otočit", + "cropAspectRatioOriginal": "Originál", + "widgetTapUpdateWidget": "Aktualizovat widget", + "settingsVideoResumptionModeDialogTitle": "Obnovit přehrávání", + "settingsAskEverytime": "Vždy se zeptat", + "tagEditorDiscardDialogMessage": "Chcete zrušit změny?", + "maxBrightnessNever": "Nikdy", + "maxBrightnessAlways": "Vždy", + "videoResumptionModeNever": "Nikdy", + "videoResumptionModeAlways": "Vždy", + "exportEntryDialogQuality": "Kvalita", + "settingsVideoPlaybackTile": "Přehrávání", + "settingsVideoPlaybackPageTitle": "Přehrávání", + "settingsVideoResumptionModeTile": "Obnovit přehrávání", + "editorActionTransform": "Transformovat", + "cropAspectRatioSquare": "Čtverec", + "cropAspectRatioFree": "Volný", + "aboutDataUsageSectionTitle": "Využitý prostor", + "aboutDataUsageData": "Data", + "aboutDataUsageCache": "Mezipaměť", + "aboutDataUsageDatabase": "Databáze", + "aboutDataUsageMisc": "Různé", + "aboutDataUsageInternal": "Interní", + "aboutDataUsageExternal": "Externí", + "overlayHistogramNone": "Žádný", + "overlayHistogramRGB": "RGB", + "settingsViewerShowHistogram": "Zobrazit histogram", + "overlayHistogramLuminance": "Světelnost", + "aboutDataUsageClearCache": "Vymazat mezipaměť", + "entryActionCast": "Promítat", + "castDialogTitle": "Zařízení pro promítání", + "settingsThumbnailShowHdrIcon": "Zobrazit ikonu HDR", + "settingsForceWesternArabicNumeralsTile": "Vynutit arabské číslice", + "stopTooltip": "Zastavit", + "videoRepeatActionSetStart": "Nastavit začátek", + "videoRepeatActionSetEnd": "Nastavit konec", + "videoActionABRepeat": "Opakování A-B", + "chipActionShowCollection": "Zobrazit ve sbírce", + "mapAttributionOsmData": "Mapová data © [OpenStreetMap](https://www.openstreetmap.org/copyright) přispěvatelé", + "videoActionShowNextFrame": "Zobrazit další snímek", + "newAlbumDialogAlbumAlreadyExistsHelper": "Album již existuje", + "renameProcessorHash": "Hash", + "albumTierDynamic": "Dynamické", + "collectionActionAddDynamicAlbum": "Přidat dynamické album", + "sortOrderShortestFirst": "Nejkratší první", + "sortOrderLongestFirst": "Nejdelší první", + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Dlaždice z [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "collectionActionSetHome": "Nastavit jako domov", + "chipActionRemove": "Odstranit", + "videoActionShowPreviousFrame": "Zobrazit předchozí snímek", + "dynamicAlbumAlreadyExists": "Dynamické album již existuje", + "newDynamicAlbumDialogTitle": "Nové dynamické album", + "selectStorageVolumeDialogTitle": "Vyberte úložiště", + "explorerActionSelectStorageVolume": "Vyberte úložiště", + "mapStyleOsmLiberty": "OSM Liberty", + "mapAttributionOsmLiberty": "Dlaždice z [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hostované na [OSM Americana](https://tile.ourmap.us)", + "setHomeCustom": "Vlastní", + "sortByDuration": "Podle trvání", + "chipActionGoToExplorerPage": "Zobrazit v průzkumníku", + "explorerPageTitle": "Průzkumník", + "chipActionDecompose": "Rozdělit", + "appExportDynamicAlbums": "Dynamická alba", + "mapStyleOpenTopoMap": "OpenTopoMap", + "editEntryLocationDialogImportGpx": "Importovat GPX", + "editEntryLocationDialogTimeShift": "Časový posun", + "coordinateFormatDdm": "DDM", + "removeEntryMetadataDialogAll": "Vše", + "chipActionCreateGroup": "Vytvořit skupinu", + "albumTierGroups": "Skupiny", + "newGroupDialogTitle": "Nová skupina", + "newGroupDialogNameLabel": "Název skupiny", + "groupAlreadyExists": "Skupina již existuje", + "groupEmpty": "Žádné skupiny", + "ungrouped": "Bez skupiny", + "groupPickerTitle": "Vybrat skupinu", + "groupPickerUseThisGroupButton": "Použít tuto skupinu", + "sectionNone": "Žádné sekce", + "sortByPath": "Podle umístění", + "tagPickPageTitle": "Vybrat štítek", + "searchFormatSectionTitle": "Formáty", + "settingsNavigationBottomActionsTile": "Spodní navigace", + "settingsNavigationBottomActionEditorPageTitle": "Spodní navigace", + "settingsNavigationBottomActionEditorBanner": "Přidržte přesouvací tlačítka a vyberte, které akce budou zobrazeny ve spodním navigačním panelu.", + "mapStyleDialogAddStyle": "Přidat styl", + "mapStyleEditorDialogName": "Jméno", + "mapStyleEditorDialogUrl": "URL", + "mapStyleEditorDialogSubdomains": "Poddomény", + "mapStyleEditorDialogUserAgent": "User-Agent", + "chipActionGroup": "Změnit seskupení", + "createButtonLabel": "VYTVOŘIT", + "settingsViewerShowZoomLevel": "Zobrazit úroveň přiblížení", + "settingsEnabled": "Povoleno", + "settingsForced": "Vynuceno" +} diff --git a/lib/l10n/app_da.arb b/lib/l10n/app_da.arb new file mode 100644 index 0000000..545da42 --- /dev/null +++ b/lib/l10n/app_da.arb @@ -0,0 +1,1670 @@ +{ + "welcomeMessage": "Velkommen til Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Valgfri", + "@welcomeOptional": {}, + "appName": "Aves", + "@appName": {}, + "welcomeTermsToggle": "Jeg accepterer vilkårene og betingelserne", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, =1{{count} element} other{{count} elementer}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "columnCount": "{count, plural, =1{{count} kolonne} other{{count} kolonner}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeMinutes": "{count, plural, =1{{count} minut} other{{count} minutter}}", + "@timeMinutes": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeDays": "{count, plural, =1{{count} dag} other{{count} dage}}", + "@timeDays": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "applyButtonLabel": "ANVEND", + "@applyButtonLabel": {}, + "deleteButtonLabel": "SLET", + "@deleteButtonLabel": {}, + "nextButtonLabel": "NÆSTE", + "@nextButtonLabel": {}, + "showButtonLabel": "VIS", + "@showButtonLabel": {}, + "hideButtonLabel": "SKJUL", + "@hideButtonLabel": {}, + "saveCopyButtonLabel": "GEM KOPI", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Anvend", + "@applyTooltip": {}, + "cancelTooltip": "Annuller", + "@cancelTooltip": {}, + "nextTooltip": "Næste", + "@nextTooltip": {}, + "showTooltip": "Vis", + "@showTooltip": {}, + "hideTooltip": "Skjul", + "@hideTooltip": {}, + "actionRemove": "Fjern", + "@actionRemove": {}, + "resetTooltip": "Nulstil", + "@resetTooltip": {}, + "saveTooltip": "Gem", + "@saveTooltip": {}, + "chipActionDelete": "Slet", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Vis i album", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Vis i lande", + "@chipActionGoToCountryPage": {}, + "chipActionGoToPlacePage": "Vis i steder", + "@chipActionGoToPlacePage": {}, + "chipActionGoToTagPage": "Vis i tags", + "@chipActionGoToTagPage": {}, + "timeSeconds": "{count, plural, =1{{count} sekund} other{{count} sekunder}}", + "@timeSeconds": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "continueButtonLabel": "FORTSÆT", + "@continueButtonLabel": {}, + "clearTooltip": "Ryd", + "@clearTooltip": {}, + "previousTooltip": "Forrige", + "@previousTooltip": {}, + "stopTooltip": "Stop", + "@stopTooltip": {}, + "pickTooltip": "Vælg", + "@pickTooltip": {}, + "chipActionShowCollection": "Vis i samling", + "@chipActionShowCollection": {}, + "doubleBackExitMessage": "Tryk på “tilbage” igen for at afslutte.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "Spørg ikke igen", + "@doNotAskAgain": {}, + "sourceStateLoading": "Indlæser", + "@sourceStateLoading": {}, + "sourceStateLocatingCountries": "Lokaliserer lande", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Lokaliserer steder", + "@sourceStateLocatingPlaces": {}, + "filterAspectRatioPortraitLabel": "Portræt", + "@filterAspectRatioPortraitLabel": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "maxBrightnessNever": "Aldrig", + "@maxBrightnessNever": {}, + "videoLoopModeNever": "Aldrig", + "@videoLoopModeNever": {}, + "wallpaperTargetHomeLock": "Startskærm og låseskærm", + "@wallpaperTargetHomeLock": {}, + "changeTooltip": "Ændr", + "@changeTooltip": {}, + "chipActionLock": "Lås", + "@chipActionLock": {}, + "chipActionPin": "Fastgør til toppen", + "@chipActionPin": {}, + "chipActionUnpin": "Frigør fra toppen", + "@chipActionUnpin": {}, + "chipActionRename": "Omdøb", + "@chipActionRename": {}, + "chipActionCreateAlbum": "Opret album", + "@chipActionCreateAlbum": {}, + "entryActionDelete": "Slet", + "@entryActionDelete": {}, + "entryActionInfo": "Info", + "@entryActionInfo": {}, + "entryActionRename": "Omdøb", + "@entryActionRename": {}, + "entryActionRestore": "Gendan", + "@entryActionRestore": {}, + "entryActionFlip": "Vend det vandret", + "@entryActionFlip": {}, + "entryActionPrint": "Udskriv", + "@entryActionPrint": {}, + "entryActionShareVideoOnly": "Del kun video", + "@entryActionShareVideoOnly": {}, + "entryActionViewSource": "Se kilde", + "@entryActionViewSource": {}, + "entryActionOpen": "Åbn med", + "@entryActionOpen": {}, + "entryActionSetAs": "Indstil som", + "@entryActionSetAs": {}, + "entryActionRemoveFavourite": "Fjern fra favoritter", + "@entryActionRemoveFavourite": {}, + "videoActionPlay": "Afspil", + "@videoActionPlay": {}, + "videoActionReplay10": "Spol 10 sekunder tilbage", + "@videoActionReplay10": {}, + "viewerActionSettings": "Indstillinger", + "@viewerActionSettings": {}, + "slideshowActionShowInCollection": "Vis i samling", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Rediger dato og tid", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditRating": "Rediger bedømmelse", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Rediger tags", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Fjern metadata", + "@entryInfoActionRemoveMetadata": {}, + "entryInfoActionExportMetadata": "Eksportér metadata", + "@entryInfoActionExportMetadata": {}, + "editorTransformRotate": "Roter", + "@editorTransformRotate": {}, + "filterRecentlyAddedLabel": "Nyligt tilføjet", + "@filterRecentlyAddedLabel": {}, + "albumTierNew": "Ny", + "@albumTierNew": {}, + "keepScreenOnNever": "Aldrig", + "@keepScreenOnNever": {}, + "keepScreenOnVideoPlayback": "Under videoafspilning", + "@keepScreenOnVideoPlayback": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "nameConflictStrategyReplace": "Erstat", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Spring over", + "@nameConflictStrategySkip": {}, + "subtitlePositionBottom": "Nederst", + "@subtitlePositionBottom": {}, + "videoPlaybackMuted": "Afspil uden lyd", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Afspil med lyd", + "@videoPlaybackWithSound": {}, + "widgetDisplayedItemRandom": "Tilfældig", + "@widgetDisplayedItemRandom": {}, + "videoControlsPlayOutside": "Åbn med en anden afspiller", + "@videoControlsPlayOutside": {}, + "filterAspectRatioLandscapeLabel": "Landskab", + "@filterAspectRatioLandscapeLabel": {}, + "filterNoAddressLabel": "Ingen adresse", + "@filterNoAddressLabel": {}, + "filterTypeAnimatedLabel": "Animeret", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "Bevægelsesfoto", + "@filterTypeMotionPhotoLabel": {}, + "maxBrightnessAlways": "Altid", + "@maxBrightnessAlways": {}, + "overlayHistogramNone": "Ingen", + "@overlayHistogramNone": {}, + "nameConflictStrategyRename": "Omdøb", + "@nameConflictStrategyRename": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "chipActionRemove": "Fjern", + "@chipActionRemove": {}, + "chipActionHide": "Skjul", + "@chipActionHide": {}, + "entryActionShareImageOnly": "Del kun billede", + "@entryActionShareImageOnly": {}, + "entryActionViewMotionPhotoVideo": "Åbn video", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionCast": "Cast", + "@entryActionCast": {}, + "entryActionAddFavourite": "Føj til favoritter", + "@entryActionAddFavourite": {}, + "entryInfoActionRemoveLocation": "Fjern placering", + "@entryInfoActionRemoveLocation": {}, + "filterTypeSphericalVideoLabel": "360° video", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "albumTierSpecial": "Almindelig", + "@albumTierSpecial": {}, + "albumTierDynamic": "Dynamisk", + "@albumTierDynamic": {}, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "overlayHistogramLuminance": "Luminans", + "@overlayHistogramLuminance": {}, + "themeBrightnessLight": "Lys", + "@themeBrightnessLight": {}, + "themeBrightnessBlack": "Sort", + "@themeBrightnessBlack": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "vaultLockTypePassword": "Adgangskode", + "@vaultLockTypePassword": {}, + "settingsVideoEnablePip": "Billede-i-Billede", + "@settingsVideoEnablePip": {}, + "subtitlePositionTop": "Øverst", + "@subtitlePositionTop": {}, + "themeBrightnessDark": "Mørk", + "@themeBrightnessDark": {}, + "vaultLockTypePattern": "Mønster", + "@vaultLockTypePattern": {}, + "entryActionEdit": "Rediger", + "@entryActionEdit": {}, + "entryActionConvert": "Konverter", + "@entryActionConvert": {}, + "entryActionExport": "Eksportér", + "@entryActionExport": {}, + "entryActionRotateCCW": "Roter mod uret", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Roter med uret", + "@entryActionRotateCW": {}, + "entryActionShare": "Del", + "@entryActionShare": {}, + "entryActionRotateScreen": "Roter skærm", + "@entryActionRotateScreen": {}, + "editorTransformCrop": "Beskær", + "@editorTransformCrop": {}, + "filterBinLabel": "Papirkurv", + "@filterBinLabel": {}, + "filterRatingRejectedLabel": "Afvist", + "@filterRatingRejectedLabel": {}, + "videoLoopModeAlways": "Altid", + "@videoLoopModeAlways": {}, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "filterMimeImageLabel": "Billede", + "@filterMimeImageLabel": {}, + "albumTierApps": "Apps", + "@albumTierApps": {}, + "widgetOpenPageHome": "Åbn hjem", + "@widgetOpenPageHome": {}, + "entryActionCopyToClipboard": "Kopiér til udklipsholder", + "@entryActionCopyToClipboard": {}, + "drawerCollectionSphericalVideos": "360° videoer", + "@drawerCollectionSphericalVideos": {}, + "albumTierPinned": "Fastgjort", + "@albumTierPinned": {}, + "albumTierRegular": "Andre", + "@albumTierRegular": {}, + "videoLoopModeShortOnly": "Kun korte videoer", + "@videoLoopModeShortOnly": {}, + "storageVolumeDescriptionFallbackPrimary": "Internt lager", + "@storageVolumeDescriptionFallbackPrimary": {}, + "sourceStateCataloguing": "Katalogisering", + "@sourceStateCataloguing": {}, + "videoActionMute": "Slå lyden fra", + "@videoActionMute": {}, + "videoActionUnmute": "Slå lyden til", + "@videoActionUnmute": {}, + "videoActionPause": "Sæt på pause", + "@videoActionPause": {}, + "videoActionSkip10": "Spol 10 sekunder frem", + "@videoActionSkip10": {}, + "videoActionSetSpeed": "Afspilningshastighed", + "@videoActionSetSpeed": {}, + "entryInfoActionEditLocation": "Rediger placering", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "Rediger titel og beskrivelse", + "@entryInfoActionEditTitleDescription": {}, + "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsEast": "Ø", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "V", + "@coordinateDmsWest": {}, + "keepScreenOnAlways": "Altid", + "@keepScreenOnAlways": {}, + "viewerTransitionZoomIn": "Zoom ind", + "@viewerTransitionZoomIn": {}, + "viewerTransitionNone": "Ingen", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Startskærm", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "Låseskærm", + "@wallpaperTargetLock": {}, + "widgetDisplayedItemMostRecent": "Nyeste", + "@widgetDisplayedItemMostRecent": {}, + "videoPlaybackSkip": "Spring over", + "@videoPlaybackSkip": {}, + "videoResumptionModeNever": "Aldrig", + "@videoResumptionModeNever": {}, + "videoResumptionModeAlways": "Altid", + "@videoResumptionModeAlways": {}, + "widgetOpenPageCollection": "Åbn samling", + "@widgetOpenPageCollection": {}, + "widgetTapUpdateWidget": "Opdater widget", + "@widgetTapUpdateWidget": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD-kort", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "rodmappe", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "“{name}”-mappe", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "filterOnThisDayLabel": "På denne dag", + "@filterOnThisDayLabel": {}, + "unitSystemImperial": "Imperial", + "@unitSystemImperial": {}, + "addShortcutButtonLabel": "TILFØJ", + "@addShortcutButtonLabel": {}, + "setCoverDialogCustom": "Brugerdefineret", + "@setCoverDialogCustom": {}, + "menuActionStats": "Statistikker", + "@menuActionStats": {}, + "drawerTagPage": "Tags", + "@drawerTagPage": {}, + "chipActionSetCover": "Indstil cover", + "@chipActionSetCover": {}, + "chipActionShowCountryStates": "Vis stater", + "@chipActionShowCountryStates": {}, + "chipActionConfigureVault": "Konfigurer boks", + "@chipActionConfigureVault": {}, + "entryActionShowGeoTiffOnMap": "Vis som kortoverlejring", + "@entryActionShowGeoTiffOnMap": {}, + "editorActionTransform": "Transformer", + "@editorActionTransform": {}, + "cropAspectRatioFree": "Frit", + "@cropAspectRatioFree": {}, + "filterTaggedLabel": "Tagget", + "@filterTaggedLabel": {}, + "accessibilityAnimationsKeep": "Behold skærmeffekter", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferLowest": "Laveste hastighed", + "@displayRefreshRatePreferLowest": {}, + "viewerTransitionParallax": "Parallakse", + "@viewerTransitionParallax": {}, + "restrictedAccessDialogMessage": "Denne app har ikke tilladelse til at ændre filer i {directory} for “{volume}”.\n\nBrug venligst en forudinstalleret filhåndtering eller galleriapp til at flytte elementerne til en anden mappe.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "notEnoughSpaceDialogMessage": "Denne handling kræver {neededSize} ledig plads på “{volume}” for at blive fuldført, men der er kun {freeSize} tilbage.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "nameConflictDialogMultipleSourceMessage": "Nogle filer har samme navn.", + "@nameConflictDialogMultipleSourceMessage": {}, + "videoStartOverButtonLabel": "START FORFRA", + "@videoStartOverButtonLabel": {}, + "videoResumeDialogMessage": "Vil du genoptage afspilningen på {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "newAlbumDialogTitle": "Nyt album", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Albumnavn", + "@newAlbumDialogNameLabel": {}, + "newVaultDialogTitle": "Ny boks", + "@newVaultDialogTitle": {}, + "patternDialogEnter": "Indtast mønster", + "@patternDialogEnter": {}, + "pinDialogConfirm": "Bekræft PIN", + "@pinDialogConfirm": {}, + "editEntryLocationDialogTitle": "Placering", + "@editEntryLocationDialogTitle": {}, + "genericSuccessFeedback": "Færdig!", + "@genericSuccessFeedback": {}, + "viewDialogSortSectionTitle": "Sortér", + "@viewDialogSortSectionTitle": {}, + "aboutPageTitle": "Om", + "@aboutPageTitle": {}, + "aboutDataUsageClearCache": "Ryd cache", + "@aboutDataUsageClearCache": {}, + "drawerAboutButton": "Om", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Indstillinger", + "@drawerSettingsButton": {}, + "drawerCollectionPanoramas": "Panoramaer", + "@drawerCollectionPanoramas": {}, + "countryPageTitle": "Lande", + "@countryPageTitle": {}, + "countryEmpty": "Ingen lande", + "@countryEmpty": {}, + "tagPageTitle": "Tags", + "@tagPageTitle": {}, + "searchRecentSectionTitle": "Seneste", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Dato", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "Album", + "@searchAlbumsSectionTitle": {}, + "settingsThumbnailShowRating": "Vis bedømmelse", + "@settingsThumbnailShowRating": {}, + "settingsViewerGestureSideTapNext": "Tryk på skærmkanterne for at vise forrige/næste element", + "@settingsViewerGestureSideTapNext": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "settingsVideoLoopModeDialogTitle": "Loop-tilstand", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsHiddenFiltersBanner": "Billeder og videoer, der matcher skjulte filtre, vises ikke i din samling.", + "@settingsHiddenFiltersBanner": {}, + "settingsStorageAccessTile": "Lageradgang", + "@settingsStorageAccessTile": {}, + "settingsRemoveAnimationsDialogTitle": "Fjern animationer", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Tid til at handle", + "@settingsTimeToTakeActionTile": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Vis alternativer til multi-touch-bevægelser", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, + "settingsDisplayUseTvInterface": "Android TV-grænseflade", + "@settingsDisplayUseTvInterface": {}, + "settingsLanguageSectionTitle": "Sprog og Formater", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "Sprog", + "@settingsLanguageTile": {}, + "settingsCoordinateFormatDialogTitle": "Koordinatformat", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Enheder", + "@settingsUnitSystemTile": {}, + "statsTopTagsSectionTitle": "Top tags", + "@statsTopTagsSectionTitle": {}, + "viewerInfoLabelCoordinates": "Koordinater", + "@viewerInfoLabelCoordinates": {}, + "mapAttributionOsmHot": "Fliser af [HOT](https://www.hotosm.org/) • Hostet af [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapEmptyRegion": "Ingen billeder i denne region", + "@mapEmptyRegion": {}, + "viewerInfoSearchSuggestionDate": "Dato og tid", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Beskrivelse", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionResolution": "Opløsning", + "@viewerInfoSearchSuggestionResolution": {}, + "tagEditorPageTitle": "Rediger Tags", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Nyt tag", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Tilføj tag", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Seneste", + "@tagEditorSectionRecent": {}, + "tagEditorDiscardDialogMessage": "Vil du kassere ændringerne?", + "@tagEditorDiscardDialogMessage": {}, + "panoramaEnableSensorControl": "Aktivér sensorstyring", + "@panoramaEnableSensorControl": {}, + "authenticateToUnlockVault": "Godkend for at oplåse boks", + "@authenticateToUnlockVault": {}, + "exportEntryDialogFormat": "Format:", + "@exportEntryDialogFormat": {}, + "editEntryRatingDialogTitle": "Bedømmelse", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Fjernelse af metadata", + "@removeEntryMetadataDialogTitle": {}, + "videoStreamSelectionDialogText": "Undertekster", + "@videoStreamSelectionDialogText": {}, + "viewDialogReverseSortOrder": "Omvendt sorteringsrækkefølge", + "@viewDialogReverseSortOrder": {}, + "aboutLinkPolicy": "Privatlivspolitik", + "@aboutLinkPolicy": {}, + "aboutDataUsageCache": "Cache", + "@aboutDataUsageCache": {}, + "collectionPickPageTitle": "Vælg", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "Vælg elementer", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Vis titelfilter", + "@collectionActionShowTitleSearch": {}, + "dateThisMonth": "Denne måned", + "@dateThisMonth": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{Kunne ikke flytte 1 element} other{Kunne ikke flytte {count} elementer}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{Flyttede 1 element} other{Flyttede {count} elementer}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "sortByDate": "Efter dato", + "@sortByDate": {}, + "sortOrderLargestFirst": "Største først", + "@sortOrderLargestFirst": {}, + "albumPickPageTitlePick": "Vælg album", + "@albumPickPageTitlePick": {}, + "albumScreenshots": "Skærmbilleder", + "@albumScreenshots": {}, + "albumPickPageTitleExport": "Eksportér til album", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Flyt til album", + "@albumPickPageTitleMove": {}, + "albumVideoCaptures": "Videooptagelser", + "@albumVideoCaptures": {}, + "settingsSearchFieldLabel": "Søg i indstillinger", + "@settingsSearchFieldLabel": {}, + "settingsModificationWarningDialogMessage": "Andre indstillinger bliver ændret.", + "@settingsModificationWarningDialogMessage": {}, + "settingsAskEverytime": "Spørg hver gang", + "@settingsAskEverytime": {}, + "settingsActionExportDialogTitle": "Eksport", + "@settingsActionExportDialogTitle": {}, + "settingsActionImportDialogTitle": "Import", + "@settingsActionImportDialogTitle": {}, + "settingsHomeTile": "Hjem", + "@settingsHomeTile": {}, + "setHomeCustom": "Tilpasset", + "@setHomeCustom": {}, + "settingsKeepScreenOnDialogTitle": "Hold skærmen tændt", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsNavigationDrawerTabAlbums": "Album", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerEditorPageTitle": "Navigationsmenu", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerTabPages": "Sider", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Tilføj album", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Videoafspilning", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsSubtitleThemeTextPositionTile": "Tekstposition", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSubtitleThemeTextAlignmentTile": "Tekstjustering", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsStorageAccessBanner": "Nogle mapper kræver en eksplicit adgangstilladelse for at ændre filer i dem. Her kan du se de mapper, som du tidligere har givet adgang til.", + "@settingsStorageAccessBanner": {}, + "settingsCoordinateFormatTile": "Koordinatformat", + "@settingsCoordinateFormatTile": {}, + "settingsForceWesternArabicNumeralsTile": "Fremtving arabiske tal", + "@settingsForceWesternArabicNumeralsTile": {}, + "viewerSetWallpaperButtonLabel": "INDSTIL BAGGRUND", + "@viewerSetWallpaperButtonLabel": {}, + "viewerOpenPanoramaButtonLabel": "ÅBN PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, + "mapZoomOutTooltip": "Zoom ud", + "@mapZoomOutTooltip": {}, + "viewerInfoLabelOwner": "Ejer", + "@viewerInfoLabelOwner": {}, + "viewerInfoViewXmlLinkText": "Se XML", + "@viewerInfoViewXmlLinkText": {}, + "filterLocatedLabel": "Placeret", + "@filterLocatedLabel": {}, + "filterNoDateLabel": "Udateret", + "@filterNoDateLabel": {}, + "filterNoLocationLabel": "Ikke placeret", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Ikke bedømt", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Ikke tagget", + "@filterNoTagLabel": {}, + "sortByName": "Efter navn", + "@sortByName": {}, + "statePageTitle": "Stater", + "@statePageTitle": {}, + "tagEmpty": "Ingen tags", + "@tagEmpty": {}, + "searchCountriesSectionTitle": "Lande", + "@searchCountriesSectionTitle": {}, + "settingsPageTitle": "Indstillinger", + "@settingsPageTitle": {}, + "settingsThumbnailShowFavouriteIcon": "Vis favorit-ikon", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsImageBackground": "Billedbaggrund", + "@settingsImageBackground": {}, + "settingsViewerShowShootingDetails": "Vis fotograferingsdetaljer", + "@settingsViewerShowShootingDetails": {}, + "settingsVideoPageTitle": "Videoindstillinger", + "@settingsVideoPageTitle": {}, + "settingsVideoAutoPlay": "Afspil automatisk", + "@settingsVideoAutoPlay": {}, + "settingsSubtitleThemeTextSize": "Tekststørrelse", + "@settingsSubtitleThemeTextSize": {}, + "settingsPrivacySectionTitle": "Privatliv", + "@settingsPrivacySectionTitle": {}, + "settingsLanguagePageTitle": "Sprog", + "@settingsLanguagePageTitle": {}, + "mapStyleTooltip": "Vælg kortstil", + "@mapStyleTooltip": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Fliser af [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "renameAlbumDialogLabel": "Nyt navn", + "@renameAlbumDialogLabel": {}, + "renameEntrySetPagePatternFieldLabel": "Navngivningsmønster", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameProcessorName": "Navn", + "@renameProcessorName": {}, + "passwordDialogConfirm": "Bekræft adgangskode", + "@passwordDialogConfirm": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Mappe findes allerede", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageInsertTooltip": "Indsætningsfelt", + "@renameEntrySetPageInsertTooltip": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter-plugins", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "collectionActionHideTitleSearch": "Skjul titelfilter", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Tilføj genvej", + "@collectionActionAddShortcut": {}, + "policyPageTitle": "Privatlivspolitik", + "@policyPageTitle": {}, + "collectionPageTitle": "Samling", + "@collectionPageTitle": {}, + "collectionActionEmptyBin": "Tøm papirkurv", + "@collectionActionEmptyBin": {}, + "sectionUnknown": "Ukendt", + "@sectionUnknown": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{Kunne ikke kopiere 1 element} other{Kunne ikke kopiere {count} elementer}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "aboutDataUsageMisc": "Diverse", + "@aboutDataUsageMisc": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{Kopierede 1 element} other{Kopierede {count} elementer}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEmptyVideos": "Ingen videoer", + "@collectionEmptyVideos": {}, + "sortOrderNewestFirst": "Nyeste først", + "@sortOrderNewestFirst": {}, + "settingsConfirmationAfterMoveToBinItems": "Vis besked efter elementer flyttes til papirkurven", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerTile": "Navigationsmenu", + "@settingsNavigationDrawerTile": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Spørg før udaterede elementer flyttes", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Tryk og hold for at flytte knapper og vælge, hvilke handlinger der vises, når du gennemser elementer.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionQuickActionEditorPageTitle": "Hurtighandlinger", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionBurstPatternsNone": "Ingen", + "@settingsCollectionBurstPatternsNone": {}, + "settingsViewerQuickActionsTile": "Hurtighandlinger", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Hurtighandlinger", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerUseCutout": "Brug udskæringsområde", + "@settingsViewerUseCutout": {}, + "settingsViewerShowDescription": "Vis beskrivelse", + "@settingsViewerShowDescription": {}, + "settingsSlideshowFillScreen": "Udfyld skærm", + "@settingsSlideshowFillScreen": {}, + "settingsVideoResumptionModeDialogTitle": "Genoptag afspilning", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsSubtitleThemeShowOutline": "Vis omrids og skygge", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeBackgroundOpacity": "Baggrundsopacitet", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Tekstposition", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsDisablingBinWarningDialogMessage": "Elementer i papirkurven slettes for altid.", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsAllowMediaManagement": "Tillad mediehåndtering", + "@settingsAllowMediaManagement": {}, + "settingsStorageAccessPageTitle": "Lageradgang", + "@settingsStorageAccessPageTitle": {}, + "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsCollectionTile": "Samling", + "@settingsCollectionTile": {}, + "settingsWidgetPageTitle": "Fotoramme", + "@settingsWidgetPageTitle": {}, + "statsPageTitle": "Statistikker", + "@statsPageTitle": {}, + "settingsWidgetDisplayedItem": "Vist element", + "@settingsWidgetDisplayedItem": {}, + "statsWithGps": "{count, plural, =1{1 element med placering} other{{count} elementer med placering}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "mapZoomInTooltip": "Zoom ind", + "@mapZoomInTooltip": {}, + "viewerInfoPageTitle": "Info", + "@viewerInfoPageTitle": {}, + "viewerInfoLabelTitle": "Titel", + "@viewerInfoLabelTitle": {}, + "tagEditorSectionPlaceholders": "Pladsholdere", + "@tagEditorSectionPlaceholders": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Slet dette album og elementet i det?} other{Slet dette album og de {count} elementer i det?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "coverDialogTabColor": "Farve", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Vælg app", + "@appPickDialogTitle": {}, + "aboutDataUsageDatabase": "Database", + "@aboutDataUsageDatabase": {}, + "aboutLicensesShowAllButtonLabel": "Vis alle licenser", + "@aboutLicensesShowAllButtonLabel": {}, + "collectionGroupAlbum": "Efter album", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Efter måned", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Efter dag", + "@collectionGroupDay": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Kunne ikke slette 1 element} other{Kunne ikke slette {count} elementer}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEmptyFavourites": "Ingen favoritter", + "@collectionEmptyFavourites": {}, + "drawerCollectionRaws": "Rå billeder", + "@drawerCollectionRaws": {}, + "sortByRating": "Efter bedømmelse", + "@sortByRating": {}, + "sortByAlbumFileName": "Efter album og elementtitel", + "@sortByAlbumFileName": {}, + "albumGroupVolume": "Efter lagervolume", + "@albumGroupVolume": {}, + "albumGroupType": "Efter type", + "@albumGroupType": {}, + "searchCollectionFieldHint": "Søg i samling", + "@searchCollectionFieldHint": {}, + "settingsActionExport": "Eksportér", + "@settingsActionExport": {}, + "settingsActionImport": "Importér", + "@settingsActionImport": {}, + "settingsKeepScreenOnTile": "Hold skærmen tændt", + "@settingsKeepScreenOnTile": {}, + "settingsThumbnailOverlayTile": "Overlejring", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailShowHdrIcon": "Vis HDR-ikon", + "@settingsThumbnailShowHdrIcon": {}, + "settingsThumbnailOverlayPageTitle": "Overlejring", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowLocationIcon": "Vis placeringsikon", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Vis bevægelsesfoto-ikon", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRawIcon": "Vis RAW-ikon", + "@settingsThumbnailShowRawIcon": {}, + "settingsCollectionQuickActionsTile": "Hurtighandlinger", + "@settingsCollectionQuickActionsTile": {}, + "settingsViewerMaximumBrightness": "Maksimal lysstyrke", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Afspil bevægelsesfotos automatisk", + "@settingsMotionPhotoAutoPlay": {}, + "settingsViewerOverlayPageTitle": "Overlejring", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowInformationSubtitle": "Vis titel, dato, placering osv.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowOverlayThumbnails": "Vis miniaturebilleder", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsSlideshowAnimatedZoomEffect": "Animeret zoomeffekt", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsViewerSlideshowTile": "Diasshow", + "@settingsViewerSlideshowTile": {}, + "settingsSlideshowRepeat": "Gentag", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Bland", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowVideoPlaybackTile": "Videoafspilning", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSubtitleThemePageTitle": "Undertekster", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Dette er et eksempel.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Midten", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Højre", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsAllowInstalledAppAccessSubtitle": "Bruges til at forbedre albumvisning", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsHiddenItemsPageTitle": "Skjulte Elementer", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersEmpty": "Ingen skjulte filtre", + "@settingsHiddenFiltersEmpty": {}, + "settingsAccessibilitySectionTitle": "Tilgængelighed", + "@settingsAccessibilitySectionTitle": {}, + "chipActionCreateVault": "Opret boks", + "@chipActionCreateVault": {}, + "chipActionFilterIn": "Filtrer ind", + "@chipActionFilterIn": {}, + "entryActionConvertMotionPhotoToStillImage": "Konverter til stillbillede", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionOpenMap": "Vis i kort-app", + "@entryActionOpenMap": {}, + "cropAspectRatioOriginal": "Original", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Firkant", + "@cropAspectRatioSquare": {}, + "filterNoTitleLabel": "Uden titel", + "@filterNoTitleLabel": {}, + "albumTierVaults": "Bokse", + "@albumTierVaults": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Album findes allerede", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "dynamicAlbumAlreadyExists": "Dynamisk album findes allerede", + "@dynamicAlbumAlreadyExists": {}, + "newDynamicAlbumDialogTitle": "Nyt dynamisk album", + "@newDynamicAlbumDialogTitle": {}, + "renameEntryDialogLabel": "Nyt navn", + "@renameEntryDialogLabel": {}, + "vaultBinUsageDialogMessage": "Nogle bokse bruger papirkurven.", + "@vaultBinUsageDialogMessage": {}, + "editEntryDialogCopyFromItem": "Kopiér fra et andet element", + "@editEntryDialogCopyFromItem": {}, + "durationDialogHours": "Timer", + "@durationDialogHours": {}, + "durationDialogMinutes": "Minutter", + "@durationDialogMinutes": {}, + "removeEntryMetadataDialogMore": "Mere", + "@removeEntryMetadataDialogMore": {}, + "videoStreamSelectionDialogAudio": "Lyd", + "@videoStreamSelectionDialogAudio": {}, + "menuActionMap": "Kort", + "@menuActionMap": {}, + "menuActionSlideshow": "Diasshow", + "@menuActionSlideshow": {}, + "appPickDialogNone": "Ingen", + "@appPickDialogNone": {}, + "aboutBugSaveLogInstruction": "Gem app-logs i en fil", + "@aboutBugSaveLogInstruction": {}, + "menuActionConfigureView": "Visning", + "@menuActionConfigureView": {}, + "aboutBugReportButton": "Rapportér", + "@aboutBugReportButton": {}, + "aboutDataUsageExternal": "Eksternt", + "@aboutDataUsageExternal": {}, + "aboutCreditsWorldAtlas1": "Denne app bruger en TopoJSON-fil fra", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "under ISC-licens.", + "@aboutCreditsWorldAtlas2": {}, + "collectionActionAddDynamicAlbum": "Tilføj dynamisk album", + "@collectionActionAddDynamicAlbum": {}, + "collectionEmptyImages": "Ingen billeder", + "@collectionEmptyImages": {}, + "drawerCollectionFavourites": "Favoritter", + "@drawerCollectionFavourites": {}, + "drawerCollectionAnimated": "Animeret", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Bevægelsesfotos", + "@drawerCollectionMotionPhotos": {}, + "sortOrderSmallestFirst": "Mindste først", + "@sortOrderSmallestFirst": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "newFilterBanner": "ny", + "@newFilterBanner": {}, + "stateEmpty": "Ingen stater", + "@stateEmpty": {}, + "searchStatesSectionTitle": "Stater", + "@searchStatesSectionTitle": {}, + "albumDownload": "Download", + "@albumDownload": {}, + "searchRatingSectionTitle": "Bedømmelser", + "@searchRatingSectionTitle": {}, + "settingsSystemDefault": "Systemstandard", + "@settingsSystemDefault": {}, + "settingsSearchEmpty": "Ingen matchende indstilling", + "@settingsSearchEmpty": {}, + "appExportFavourites": "Favoritter", + "@appExportFavourites": {}, + "appExportSettings": "Indstillinger", + "@appExportSettings": {}, + "settingsHomeDialogTitle": "Hjem", + "@settingsHomeDialogTitle": {}, + "settingsDoubleBackExit": "Tryk på “tilbage” to gange for at afslutte", + "@settingsDoubleBackExit": {}, + "appExportCovers": "Covers", + "@appExportCovers": {}, + "settingsConfirmationDialogTitle": "Bekræftelsesdialogbokse", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Spørg før elementer slettes permanent", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsNavigationDrawerBanner": "Tryk og hold for at flytte og omarrangere menuelementer.", + "@settingsNavigationDrawerBanner": {}, + "settingsConfirmationVaultDataLoss": "Vis advarsel om datatab i bokse", + "@settingsConfirmationVaultDataLoss": {}, + "settingsThumbnailShowTagIcon": "Vis tag-ikon", + "@settingsThumbnailShowTagIcon": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Viste knapper", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerShowHistogram": "Vis histogram", + "@settingsViewerShowHistogram": {}, + "settingsViewerShowMinimap": "Vis minikort", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowRatingTags": "Vis bedømmelse og tags", + "@settingsViewerShowRatingTags": {}, + "settingsSlideshowTransitionTile": "Overgang", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Interval", + "@settingsSlideshowIntervalTile": {}, + "settingsVideoPlaybackTile": "Afspilning", + "@settingsVideoPlaybackTile": {}, + "settingsViewerOverlayTile": "Overlejring", + "@settingsViewerOverlayTile": {}, + "settingsViewerShowOverlayOnOpening": "Vis ved åbning", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsVideoBackgroundMode": "Baggrundstilstand", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "Baggrundstilstand", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsSubtitleThemeTile": "Undertekster", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Tekstjustering", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsEnableBin": "Brug papirkurv", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "Opbevar slettede elementer i 30 dage", + "@settingsEnableBinSubtitle": {}, + "settingsScreenSaverPageTitle": "Pauseskærm", + "@settingsScreenSaverPageTitle": {}, + "viewerErrorUnknown": "Ups!", + "@viewerErrorUnknown": {}, + "statsTopAlbumsSectionTitle": "Top album", + "@statsTopAlbumsSectionTitle": {}, + "viewerInfoSearchSuggestionDimensions": "Dimensioner", + "@viewerInfoSearchSuggestionDimensions": {}, + "tagPlaceholderCountry": "Land", + "@tagPlaceholderCountry": {}, + "sourceViewerPageTitle": "Kilde", + "@sourceViewerPageTitle": {}, + "statsTopPlacesSectionTitle": "Top steder", + "@statsTopPlacesSectionTitle": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "missingSystemFilePickerDialogMessage": "Systemfilvælgeren mangler eller er deaktiveret. Aktiver den, og prøv igen.", + "@missingSystemFilePickerDialogMessage": {}, + "newAlbumDialogStorageLabel": "Lager:", + "@newAlbumDialogStorageLabel": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Slet disse album og elementet i dem?} other{Slet disse album og de {count} elementer i dem?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "exportEntryDialogWidth": "Bredde", + "@exportEntryDialogWidth": {}, + "editEntryDateDialogExtractFromTitle": "Udtræk fra titel", + "@editEntryDateDialogExtractFromTitle": {}, + "locationPickerUseThisLocationButton": "Brug denne placering", + "@locationPickerUseThisLocationButton": {}, + "menuActionSelect": "Vælg", + "@menuActionSelect": {}, + "menuActionSelectAll": "Vælg alle", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "Vælg ingen", + "@menuActionSelectNone": {}, + "aboutBugSectionTitle": "Fejlrapport", + "@aboutBugSectionTitle": {}, + "aboutBugCopyInfoButton": "Kopiér", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "Rapportér på GitHub med logfiler og systemoplysninger", + "@aboutBugReportInstruction": {}, + "aboutLicensesBanner": "Denne app bruger følgende open source-pakker og -biblioteker.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android-biblioteker", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter-pakker", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart-pakker", + "@aboutLicensesDartPackagesSectionTitle": {}, + "collectionActionCopy": "Kopiér til album", + "@collectionActionCopy": {}, + "dateToday": "I dag", + "@dateToday": {}, + "collectionSearchTitlesHintText": "Søg i titler", + "@collectionSearchTitlesHintText": {}, + "collectionEditFailureFeedback": "{count, plural, =1{Kunne ikke redigere 1 element} other{Kunne ikke redigere {count} elementer}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{Kunne ikke eksportere 1 side} other{Kunne ikke eksportere {count} sider}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEmptyGrantAccessButtonLabel": "Giv adgang", + "@collectionEmptyGrantAccessButtonLabel": {}, + "drawerCollectionImages": "Billeder", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Videoer", + "@drawerCollectionVideos": {}, + "drawerCountryPage": "Lande", + "@drawerCountryPage": {}, + "sortByItemCount": "Efter antal elementer", + "@sortByItemCount": {}, + "sortBySize": "Efter størrelse", + "@sortBySize": {}, + "sortOrderOldestFirst": "Ældste først", + "@sortOrderOldestFirst": {}, + "sortOrderZtoA": "Å til A", + "@sortOrderZtoA": {}, + "sortOrderLowestFirst": "Laveste først", + "@sortOrderLowestFirst": {}, + "selectStorageVolumeDialogTitle": "Vælg lager", + "@selectStorageVolumeDialogTitle": {}, + "sortOrderShortestFirst": "Korteste først", + "@sortOrderShortestFirst": {}, + "albumPickPageTitleCopy": "Kopiér til album", + "@albumPickPageTitleCopy": {}, + "albumScreenRecordings": "Skærmoptagelser", + "@albumScreenRecordings": {}, + "binPageTitle": "Papirkurv", + "@binPageTitle": {}, + "explorerActionSelectStorageVolume": "Vælg lager", + "@explorerActionSelectStorageVolume": {}, + "settingsSubtitleThemeTextColor": "Tekstfarve", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Tekstopacitet", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Baggrundsfarve", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsHiddenItemsTile": "Skjulte elementer", + "@settingsHiddenItemsTile": {}, + "viewerInfoUnknown": "ukendt", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "Beskrivelse", + "@viewerInfoLabelDescription": {}, + "unitSystemMetric": "Metrisk", + "@unitSystemMetric": {}, + "durationDialogSeconds": "Sekunder", + "@durationDialogSeconds": {}, + "editEntryLocationDialogSetCustom": "Indstil brugerdefineret placering", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogChooseOnMap": "Vælg på kort", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "Breddegrad", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "Længdegrad", + "@editEntryLocationDialogLongitude": {}, + "genericFailureFeedback": "Mislykkedes", + "@genericFailureFeedback": {}, + "tileLayoutList": "Liste", + "@tileLayoutList": {}, + "coverDialogTabCover": "Cover", + "@coverDialogTabCover": {}, + "aboutDataUsageInternal": "Internt", + "@aboutDataUsageInternal": {}, + "aboutDataUsageSectionTitle": "Dataforbrug", + "@aboutDataUsageSectionTitle": {}, + "aboutTranslatorsSectionTitle": "Oversættere", + "@aboutTranslatorsSectionTitle": {}, + "nameConflictDialogSingleSourceMessage": "Nogle filer i destinationsmappen har samme navn.", + "@nameConflictDialogSingleSourceMessage": {}, + "noMatchingAppDialogMessage": "Der er ingen apps, der kan håndtere dette.", + "@noMatchingAppDialogMessage": {}, + "setCoverDialogLatest": "Seneste element", + "@setCoverDialogLatest": {}, + "renameProcessorCounter": "Tæller", + "@renameProcessorCounter": {}, + "exportEntryDialogQuality": "Kvalitet", + "@exportEntryDialogQuality": {}, + "renameEntrySetPagePreviewSectionTitle": "Forhåndsvisning", + "@renameEntrySetPagePreviewSectionTitle": {}, + "editEntryDateDialogSetCustom": "Indstil brugerdefineret dato", + "@editEntryDateDialogSetCustom": {}, + "viewDialogLayoutSectionTitle": "Layout", + "@viewDialogLayoutSectionTitle": {}, + "tileLayoutMosaic": "Mosaik", + "@tileLayoutMosaic": {}, + "castDialogTitle": "Cast-enheder", + "@castDialogTitle": {}, + "aboutLinkLicense": "Licens", + "@aboutLinkLicense": {}, + "aboutLicensesSectionTitle": "Open source-licenser", + "@aboutLicensesSectionTitle": {}, + "settingsNavigationDrawerTabTypes": "Typer", + "@settingsNavigationDrawerTabTypes": {}, + "settingsViewerSlideshowPageTitle": "Diasshow", + "@settingsViewerSlideshowPageTitle": {}, + "settingsStorageAccessEmpty": "Ingen adgangstilladelser", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Tilbagekald", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsRemoveAnimationsTile": "Fjern animationer", + "@settingsRemoveAnimationsTile": {}, + "settingsUnitSystemDialogTitle": "Enheder", + "@settingsUnitSystemDialogTitle": {}, + "settingsWidgetOpenPage": "Ved tryk på widgetten", + "@settingsWidgetOpenPage": {}, + "mapPointNorthUpTooltip": "Peg nord op", + "@mapPointNorthUpTooltip": {}, + "viewerInfoLabelDate": "Dato", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelDuration": "Varighed", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelPath": "Sti", + "@viewerInfoLabelPath": {}, + "mapAttributionStamen": "Fliser af [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "viewerInfoOpenLinkText": "Åbn", + "@viewerInfoOpenLinkText": {}, + "viewerInfoSearchFieldLabel": "Søg i metadata", + "@viewerInfoSearchFieldLabel": {}, + "tagPlaceholderState": "Stat", + "@tagPlaceholderState": {}, + "dateYesterday": "I går", + "@dateYesterday": {}, + "setCoverDialogAuto": "Auto", + "@setCoverDialogAuto": {}, + "renameProcessorHash": "Hash", + "@renameProcessorHash": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Denne handling understøttes ikke for elementer af følgende type: {types}.} other{Denne handling understøttes ikke for elementer af følgende typer: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "exportEntryDialogHeight": "Højde", + "@exportEntryDialogHeight": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Mappe findes allerede", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "videoResumeButtonLabel": "GENOPTAG", + "@videoResumeButtonLabel": {}, + "genericDangerWarningDialogMessage": "Er du sikker?", + "@genericDangerWarningDialogMessage": {}, + "tileLayoutGrid": "Gitter", + "@tileLayoutGrid": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP er påkrævet for at afspille videoen i et bevægelsesfoto.\n\nEr du sikker på, at du vil fjerne den?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "viewDialogGroupSectionTitle": "Sektioner", + "@viewDialogGroupSectionTitle": {}, + "hideFilterConfirmationDialogMessage": "Matchende fotos og videoer skjules fra din samling. Du kan vise dem igen i indstillingerne “Privatliv”.\n\nEr du sikker på, at du vil skjule dem?", + "@hideFilterConfirmationDialogMessage": {}, + "pinDialogEnter": "Indtast PIN", + "@pinDialogEnter": {}, + "tooManyItemsErrorDialogMessage": "Prøv igen med færre elementer.", + "@tooManyItemsErrorDialogMessage": {}, + "videoStreamSelectionDialogOff": "Fra", + "@videoStreamSelectionDialogOff": {}, + "collectionEditSuccessFeedback": "{count, plural, =1{Redigerede 1 element} other{Redigerede {count} elementer}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "settingsNavigationSectionTitle": "Navigation", + "@settingsNavigationSectionTitle": {}, + "searchMetadataSectionTitle": "Metadata", + "@searchMetadataSectionTitle": {}, + "settingsConfirmationBeforeMoveToBinItems": "Spørg før elementer flyttes til papirkurven", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "renameEntrySetPageTitle": "Omdøb", + "@renameEntrySetPageTitle": {}, + "editEntryDialogTargetFieldsHeader": "Felter at ændre", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Dato og Tid", + "@editEntryDateDialogTitle": {}, + "videoSpeedDialogLabel": "Afspilningshastighed", + "@videoSpeedDialogLabel": {}, + "aboutDataUsageData": "Data", + "@aboutDataUsageData": {}, + "collectionActionSetHome": "Indstil som hjem", + "@collectionActionSetHome": {}, + "coverDialogTabApp": "App", + "@coverDialogTabApp": {}, + "aboutBugCopyInfoInstruction": "Kopiér systemoplysninger", + "@aboutBugCopyInfoInstruction": {}, + "settingsConfirmationTile": "Bekræftelsesdialogbokse", + "@settingsConfirmationTile": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Tryk og hold for at flytte knapper og vælge, hvilke handlinger der vises, når du vælger elementer.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "drawerAlbumPage": "Album", + "@drawerAlbumPage": {}, + "drawerPlacePage": "Steder", + "@drawerPlacePage": {}, + "sortByDuration": "Efter varighed", + "@sortByDuration": {}, + "settingsVideoResumptionModeTile": "Genoptag afspilning", + "@settingsVideoResumptionModeTile": {}, + "sortOrderAtoZ": "A til Å", + "@sortOrderAtoZ": {}, + "searchTagsSectionTitle": "Tags", + "@searchTagsSectionTitle": {}, + "settingsViewerShowInformation": "Vis oplysninger", + "@settingsViewerShowInformation": {}, + "sortOrderHighestFirst": "Højeste først", + "@sortOrderHighestFirst": {}, + "sortOrderLongestFirst": "Længste først", + "@sortOrderLongestFirst": {}, + "searchPlacesSectionTitle": "Steder", + "@searchPlacesSectionTitle": {}, + "appExportDynamicAlbums": "Dynamiske album", + "@appExportDynamicAlbums": {}, + "settingsThumbnailSectionTitle": "Miniaturebilleder", + "@settingsThumbnailSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Tilgængelige knapper", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsVideoShowVideos": "Vis videoer", + "@settingsVideoShowVideos": {}, + "settingsViewerEnableOverlayBlurEffect": "Sløringseffekt", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsVideoPlaybackPageTitle": "Afspilning", + "@settingsVideoPlaybackPageTitle": {}, + "viewerInfoLabelSize": "Størrelse", + "@viewerInfoLabelSize": {}, + "statsTopCountriesSectionTitle": "Top lande", + "@statsTopCountriesSectionTitle": {}, + "newVaultWarningDialogMessage": "Elementer i bokse er kun tilgængelige for denne app og ingen andre.\n\nHvis du afinstallerer appen eller rydder dens data, mister du alle disse elementer.", + "@newVaultWarningDialogMessage": {}, + "authenticateToConfigureVault": "Godkend for at konfigurere boks", + "@authenticateToConfigureVault": {}, + "settingsAllowErrorReporting": "Tillad anonym fejlrapportering", + "@settingsAllowErrorReporting": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Dobbelttryk for at afspille/pause", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "Dobbelttryk på skærmkanterne for at gå frem/tilbage", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Venstre", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSaveSearchHistory": "Gem søgehistorik", + "@settingsSaveSearchHistory": {}, + "settingsVideoLoopModeTile": "Loop-tilstand", + "@settingsVideoLoopModeTile": {}, + "settingsVideoControlsPageTitle": "Styring", + "@settingsVideoControlsPageTitle": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Opdateringshastighed", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelAddress": "Adresse", + "@viewerInfoLabelAddress": {}, + "mapAttributionOsmLiberty": "Fliser af [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hostet af [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "settingsDisplayRefreshRateModeTile": "Skærmens opdateringshastighed", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsVideoButtonsTile": "Knapper", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Stryg op eller ned for at justere lysstyrke/lydstyrke", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsVideoControlsTile": "Styring", + "@settingsVideoControlsTile": {}, + "settingsWidgetShowOutline": "Omrids", + "@settingsWidgetShowOutline": {}, + "settingsThemeEnableDynamicColor": "Dynamisk farve", + "@settingsThemeEnableDynamicColor": {}, + "statsTopStatesSectionTitle": "Top stater", + "@statsTopStatesSectionTitle": {}, + "viewerErrorDoesNotExist": "Filen findes ikke længere.", + "@viewerErrorDoesNotExist": {}, + "settingsDisplaySectionTitle": "Visning", + "@settingsDisplaySectionTitle": {}, + "viewerInfoLabelResolution": "Opløsning", + "@viewerInfoLabelResolution": {}, + "mapStyleDialogTitle": "Kortstil", + "@mapStyleDialogTitle": {}, + "panoramaDisableSensorControl": "Deaktiver sensorstyring", + "@panoramaDisableSensorControl": {}, + "mapAttributionOsmData": "Kortdata © [OpenStreetMap](https://www.openstreetmap.org/copyright) bidragsydere", + "@mapAttributionOsmData": {}, + "viewerInfoSearchSuggestionRights": "Rettigheder", + "@viewerInfoSearchSuggestionRights": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Kunne ikke udtrække indlejrede data", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "tagPlaceholderPlace": "Sted", + "@tagPlaceholderPlace": {}, + "exportEntryDialogWriteMetadata": "Skriv metadata", + "@exportEntryDialogWriteMetadata": {}, + "editEntryDateDialogCopyField": "Kopiér fra en anden dato", + "@editEntryDateDialogCopyField": {}, + "albumEmpty": "Ingen album", + "@albumEmpty": {}, + "albumPageTitle": "Album", + "@albumPageTitle": {}, + "createAlbumButtonLabel": "OPRET", + "@createAlbumButtonLabel": {}, + "chipActionGoToExplorerPage": "Vis i stifinder", + "@chipActionGoToExplorerPage": {}, + "videoRepeatActionSetStart": "Sæt start", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "Sæt slut", + "@videoRepeatActionSetEnd": {}, + "slideshowActionResume": "Genoptag", + "@slideshowActionResume": {}, + "coordinateFormatDecimal": "Decimalgrader", + "@coordinateFormatDecimal": {}, + "filterFavouriteLabel": "Favorit", + "@filterFavouriteLabel": {}, + "filterTypeRawLabel": "Rå", + "@filterTypeRawLabel": {}, + "accessibilityAnimationsRemove": "Undgå skærmeffekter", + "@accessibilityAnimationsRemove": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "displayRefreshRatePreferHighest": "Højeste hastighed", + "@displayRefreshRatePreferHighest": {}, + "mapStyleGoogleHybrid": "Google Maps (Hybrid)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (Terræn)", + "@mapStyleGoogleTerrain": {}, + "viewerTransitionSlide": "Glide", + "@viewerTransitionSlide": {}, + "viewerTransitionFade": "Fade", + "@viewerTransitionFade": {}, + "storageAccessDialogMessage": "Vælg {directory} for “{volume}” på den næste skærm for at give appen adgang til den.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "moveUndatedConfirmationDialogSetDate": "Gem datoer", + "@moveUndatedConfirmationDialogSetDate": {}, + "vaultDialogLockTypeLabel": "Låsetype", + "@vaultDialogLockTypeLabel": {}, + "patternDialogConfirm": "Bekræft mønster", + "@patternDialogConfirm": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Flyt dette element til papirkurven?} other{Flyt {count} elementer til papirkurven?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Slet dette element?} other{Slet {count} elementer?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "configureVaultDialogTitle": "Konfigurer boks", + "@configureVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "Lås når skærmen slukkes", + "@vaultDialogLockModeWhenScreenOff": {}, + "passwordDialogEnter": "Indtast adgangskode", + "@passwordDialogEnter": {}, + "collectionActionRescan": "Scan igen", + "@collectionActionRescan": {}, + "collectionActionEdit": "Rediger", + "@collectionActionEdit": {}, + "collectionActionMove": "Flyt til album", + "@collectionActionMove": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{Kunne ikke omdøbe 1 element} other{Kunne ikke omdøbe {count} elementer}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{Omdøbte 1 element} other{Omdøbte {count} elementer}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "placePageTitle": "Steder", + "@placePageTitle": {}, + "placeEmpty": "Ingen steder", + "@placeEmpty": {}, + "explorerPageTitle": "Stifinder", + "@explorerPageTitle": {}, + "settingsDisabled": "Deaktiveret", + "@settingsDisabled": {}, + "settingsDefault": "Standard", + "@settingsDefault": {}, + "settingsViewerQuickActionEmpty": "Ingen knapper", + "@settingsViewerQuickActionEmpty": {}, + "chipActionFilterOut": "Filtrer ud", + "@chipActionFilterOut": {}, + "mapStyleOsmHot": "Humanitært OSM", + "@mapStyleOsmHot": {}, + "collectionDeselectSectionTooltip": "Fravælg sektion", + "@collectionDeselectSectionTooltip": {}, + "editEntryLocationDialogImportGpx": "Importér GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "Tidsskift", + "@editEntryLocationDialogTimeShift": {}, + "videoStreamSelectionDialogTrack": "Spor", + "@videoStreamSelectionDialogTrack": {}, + "albumGroupTier": "Efter kategori", + "@albumGroupTier": {}, + "settingsVideoEnableHardwareAcceleration": "Hardwareacceleration", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsViewerSectionTitle": "Fremviser", + "@settingsViewerSectionTitle": {}, + "openMapPageTooltip": "Se på kortside", + "@openMapPageTooltip": {}, + "settingsCollectionBurstPatternsTile": "Filnavnmønstre", + "@settingsCollectionBurstPatternsTile": {}, + "wallpaperUseScrollEffect": "Brug rulleeffekt på startside", + "@wallpaperUseScrollEffect": {}, + "editEntryDateDialogSourceFileModifiedDate": "Filens ændringsdato", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "editEntryDateDialogShift": "Skift", + "@editEntryDateDialogShift": {}, + "chipActionDecompose": "Split", + "@chipActionDecompose": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "videoActionShowNextFrame": "Vis næste frame", + "@videoActionShowNextFrame": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor", + "@mapStyleStamenWatercolor": {}, + "drawerCollectionAll": "Alle samlinger", + "@drawerCollectionAll": {}, + "settingsThumbnailShowVideoDuration": "Vis videovarighed", + "@settingsThumbnailShowVideoDuration": {}, + "settingsThemeColorHighlights": "Farvemarkeringer", + "@settingsThemeColorHighlights": {}, + "viewerInfoSearchEmpty": "Ingen matchende nøgler", + "@viewerInfoSearchEmpty": {}, + "removeEntryMetadataDialogAll": "Alle", + "@removeEntryMetadataDialogAll": {}, + "aboutCreditsSectionTitle": "Kreditering", + "@aboutCreditsSectionTitle": {}, + "settingsCollectionQuickActionTabSelecting": "Valg", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionQuickActionTabBrowsing": "Browsing", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsViewerQuickActionEditorBanner": "Tryk og hold for at flytte knapper og vælge, hvilke handlinger der vises i fremviseren.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsAllowInstalledAppAccess": "Tillad adgang til app-lager", + "@settingsAllowInstalledAppAccess": {}, + "viewerInfoBackToViewerTooltip": "Tilbage til fremviser", + "@viewerInfoBackToViewerTooltip": {}, + "videoActionShowPreviousFrame": "Vis forrige frame", + "@videoActionShowPreviousFrame": {}, + "collectionSelectSectionTooltip": "Vælg sektion", + "@collectionSelectSectionTooltip": {}, + "videoStreamSelectionDialogNoSelection": "Der er ingen andre spor.", + "@videoStreamSelectionDialogNoSelection": {}, + "addShortcutDialogLabel": "Genvejsetiket", + "@addShortcutDialogLabel": {}, + "moveUndatedConfirmationDialogMessage": "Gem elementdatoer, før du fortsætter?", + "@moveUndatedConfirmationDialogMessage": {}, + "albumMimeTypeMixed": "Blandet", + "@albumMimeTypeMixed": {}, + "videoActionCaptureFrame": "Tag billede af frame", + "@videoActionCaptureFrame": {}, + "videoActionSelectStreams": "Vælg spor", + "@videoActionSelectStreams": {}, + "videoActionABRepeat": "A-B gentagelse", + "@videoActionABRepeat": {}, + "viewerActionLock": "Lås fremviser", + "@viewerActionLock": {}, + "viewerActionUnlock": "Oplås fremviser", + "@viewerActionUnlock": {}, + "keepScreenOnViewerOnly": "Kun fremvisningsside", + "@keepScreenOnViewerOnly": {}, + "widgetOpenPageViewer": "Åbn fremviser", + "@widgetOpenPageViewer": {}, + "sortByPath": "Efter sti", + "@sortByPath": {}, + "searchFormatSectionTitle": "Formater", + "@searchFormatSectionTitle": {}, + "createButtonLabel": "OPRET", + "@createButtonLabel": {}, + "chipActionGroup": "Ændr gruppering", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Opret gruppe", + "@chipActionCreateGroup": {}, + "albumTierGroups": "Grupper", + "@albumTierGroups": {}, + "newGroupDialogTitle": "Ny gruppe", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Gruppenavn", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "Gruppen findes allerede", + "@groupAlreadyExists": {}, + "groupEmpty": "Ingen grupper", + "@groupEmpty": {}, + "groupPickerTitle": "Vælg gruppe", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Brug denne gruppe", + "@groupPickerUseThisGroupButton": {}, + "ungrouped": "Gruppe opløst", + "@ungrouped": {}, + "sectionNone": "Ingen sektioner", + "@sectionNone": {}, + "mapStyleDialogAddStyle": "Tilføj stil", + "@mapStyleDialogAddStyle": {}, + "settingsViewerShowZoomLevel": "Vis zoomniveau", + "@settingsViewerShowZoomLevel": {}, + "mapStyleEditorDialogName": "Navn", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogSubdomains": "Underdomæner", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "Brugeragent", + "@mapStyleEditorDialogUserAgent": {}, + "tagPickPageTitle": "Vælg tag", + "@tagPickPageTitle": {}, + "settingsNavigationBottomActionsTile": "Nederste navigation", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Nederste navigation", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Tryk og hold for at flytte knapper og vælge, hvilke handlinger der vises i den nederste navigationslinje.", + "@settingsNavigationBottomActionEditorBanner": {} +} diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb new file mode 100644 index 0000000..360eb47 --- /dev/null +++ b/lib/l10n/app_de.arb @@ -0,0 +1,1456 @@ +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Willkommen bei Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Optional", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Ich stimme den Bedingungen und Konditionen zu", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, =1{{count} Element} other{{count} Elemente}}", + "@itemCount": {}, + "timeSeconds": "{count, plural, =1{{count} Sekunde} other{{count} Sekunde}}", + "@timeSeconds": {}, + "timeMinutes": "{count, plural, =1{{count} Minute} other{{count} Minuten}}", + "@timeMinutes": {}, + "timeDays": "{count, plural, =1{{count} Tag} other{{count} Tage}}", + "@timeDays": {}, + "focalLength": "{length} mm", + "@focalLength": {}, + "applyButtonLabel": "ANWENDEN", + "@applyButtonLabel": {}, + "deleteButtonLabel": "LÖSCHEN", + "@deleteButtonLabel": {}, + "nextButtonLabel": "NÄCHSTE", + "@nextButtonLabel": {}, + "showButtonLabel": "ANZEIGEN", + "@showButtonLabel": {}, + "hideButtonLabel": "VERBERGEN", + "@hideButtonLabel": {}, + "continueButtonLabel": "WEITER", + "@continueButtonLabel": {}, + "cancelTooltip": "Abbrechen", + "@cancelTooltip": {}, + "changeTooltip": "Ändern", + "@changeTooltip": {}, + "clearTooltip": "Aufräumen", + "@clearTooltip": {}, + "previousTooltip": "Vorherige", + "@previousTooltip": {}, + "nextTooltip": "Nächste", + "@nextTooltip": {}, + "showTooltip": "Anzeigen", + "@showTooltip": {}, + "hideTooltip": "Ausblenden", + "@hideTooltip": {}, + "actionRemove": "Entfernen", + "@actionRemove": {}, + "resetTooltip": "Zurücksetzen", + "@resetTooltip": {}, + "saveTooltip": "Speichern", + "@saveTooltip": {}, + "pickTooltip": "Wähle", + "@pickTooltip": {}, + "doubleBackExitMessage": "Zum Verlassen erneut auf „Zurück“ tippen.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "Nicht noch einmal fragen", + "@doNotAskAgain": {}, + "sourceStateLoading": "Laden", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Katalogisierung", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Länder lokalisieren", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Lokalisierung von Orten", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Löschen", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Anzeigen in Alben", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Anzeigen in Ländern", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "Zeige in Tags", + "@chipActionGoToTagPage": {}, + "chipActionFilterOut": "Filtern ohne", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Filtern mit", + "@chipActionFilterIn": {}, + "chipActionHide": "Ausblenden", + "@chipActionHide": {}, + "chipActionPin": "Oben Anpinnen", + "@chipActionPin": {}, + "chipActionUnpin": "Nicht mehr Anpinen", + "@chipActionUnpin": {}, + "chipActionRename": "Umbenennen", + "@chipActionRename": {}, + "chipActionSetCover": "Titelbild bestimmen", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "Album erstellen", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "In die Zwischenablage kopieren", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "Löschen", + "@entryActionDelete": {}, + "entryActionConvert": "Konvertieren", + "@entryActionConvert": {}, + "entryActionExport": "Exportieren", + "@entryActionExport": {}, + "entryActionInfo": "Info", + "@entryActionInfo": {}, + "entryActionRename": "Umbenennen", + "@entryActionRename": {}, + "entryActionRestore": "Wiederherstellen", + "@entryActionRestore": {}, + "entryActionRotateCCW": "Gegen den Uhrzeigersinn drehen", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Im Uhrzeigersinn drehen", + "@entryActionRotateCW": {}, + "entryActionFlip": "Horizontal spiegeln", + "@entryActionFlip": {}, + "entryActionPrint": "Drucken", + "@entryActionPrint": {}, + "entryActionShare": "Teilen", + "@entryActionShare": {}, + "entryActionViewSource": "Quelle anzeigen", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "Als Karten-Overlay anzeigen", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "In ein Standbild umwandeln", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Video öffnen", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Bearbeiten", + "@entryActionEdit": {}, + "entryActionOpen": "Öffnen mit", + "@entryActionOpen": {}, + "entryActionSetAs": "Einstellen als", + "@entryActionSetAs": {}, + "entryActionOpenMap": "In der Karten-App anzeigen", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Bildschirm rotieren", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Zu Favoriten hinzufügen", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Aus Favoriten entfernen", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Frame aufnehmen", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Audio deaktivieren", + "@videoActionMute": {}, + "videoActionUnmute": "Audio aktiveren", + "@videoActionUnmute": {}, + "videoActionPause": "Pause", + "@videoActionPause": {}, + "videoActionPlay": "Spielen", + "@videoActionPlay": {}, + "videoActionReplay10": "10 Sekunden rückwärts springen", + "@videoActionReplay10": {}, + "videoActionSkip10": "10 Sekunden vorwärts springen", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Titel auswählen", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Wiedergabegeschwindigkeit", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "Einstellungen", + "@viewerActionSettings": {}, + "slideshowActionResume": "Wiedergabe", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "In Sammlung anzeigen", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Datum & Uhrzeit bearbeiten", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Standort bearbeiten", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "Titel und Beschreibung bearbeiten", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Bewertung bearbeiten", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Tags bearbeiten", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Metadaten entfernen", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "Papierkorb", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Favorit", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Undatiert", + "@filterNoDateLabel": {}, + "filterNoLocationLabel": "Ungeortet", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Nicht bewertet", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Unmarkiert", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Unbenannt", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "Am heutigen Tag", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Kürzlich hinzugefügt", + "@filterRecentlyAddedLabel": {}, + "filterRatingRejectedLabel": "Verworfen", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Animationen", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "Bewegtes Foto", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Rohdaten", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° Video", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Bild", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "GMS", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Dezimalgrad", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "s", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "O", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "W", + "@coordinateDmsWest": {}, + "unitSystemMetric": "Metrisch", + "@unitSystemMetric": {}, + "unitSystemImperial": "Imperiale", + "@unitSystemImperial": {}, + "videoLoopModeNever": "Niemals", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "Nur kurze Videos", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "Immer", + "@videoLoopModeAlways": {}, + "videoControlsPlayOutside": "Mit anderem Video-Player öffnen", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (Hybrid)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (Gelände)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "Humanitäres OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (Aquarell)", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyRename": "Umbenennen", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Ersetzen", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Überspringen", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "Niemals", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "Nur bei Bildbetrachtung", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Immer", + "@keepScreenOnAlways": {}, + "accessibilityAnimationsRemove": "Verhinderung von Bildschirmeffekten", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Bildschirmeffekte beibehalten", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferHighest": "Höchste Rate", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Niedrigste Rate", + "@displayRefreshRatePreferLowest": {}, + "videoPlaybackSkip": "Überspringen", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Stumm abspielen", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Mit Ton abspielen", + "@videoPlaybackWithSound": {}, + "themeBrightnessLight": "Hell", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Dunkel", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Schwarz", + "@themeBrightnessBlack": {}, + "viewerTransitionSlide": "Dia", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Parallaxe", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "Ausblenden", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "Heranzoomen", + "@viewerTransitionZoomIn": {}, + "viewerTransitionNone": "Keine", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Startbildschirm", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "Sperrbildschirm", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Start- und Sperrbildschirm", + "@wallpaperTargetHomeLock": {}, + "widgetOpenPageHome": "Startseite öffnen", + "@widgetOpenPageHome": {}, + "widgetOpenPageViewer": "Betrachter öffnen", + "@widgetOpenPageViewer": {}, + "albumTierNew": "Neu", + "@albumTierNew": {}, + "albumTierPinned": "Angeheftet", + "@albumTierPinned": {}, + "albumTierSpecial": "Häufig verwendet", + "@albumTierSpecial": {}, + "albumTierApps": "Apps", + "@albumTierApps": {}, + "albumTierRegular": "Andere", + "@albumTierRegular": {}, + "storageVolumeDescriptionFallbackPrimary": "Interner Speicher", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD-Karte", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "Hauptverzeichnis", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "„{name}“ Verzeichnis", + "@otherDirectoryDescription": {}, + "storageAccessDialogMessage": "Bitte den {directory} von „{volume}“ auf dem nächsten Bildschirm auswählen, um dieser App Zugriff darauf zu geben.", + "@storageAccessDialogMessage": {}, + "restrictedAccessDialogMessage": "Diese Anwendung darf keine Dateien im {directory} von „{volume}“ verändern.\n\nBitte einen vorinstallierten Dateimanager verwenden oder eine Galerie-App, um die Objekte in ein anderes Verzeichnis zu verschieben.", + "@restrictedAccessDialogMessage": {}, + "notEnoughSpaceDialogMessage": "Diese Operation benötigt {neededSize} freien Platz auf „{volume}“, um abgeschlossen zu werden, aber es ist nur noch {freeSize} übrig.", + "@notEnoughSpaceDialogMessage": {}, + "missingSystemFilePickerDialogMessage": "Der System-Dateiauswahldialog fehlt oder ist deaktiviert. Bitte aktivieren und es erneut versuchen.", + "@missingSystemFilePickerDialogMessage": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Dieser Vorgang wird für Elemente des folgenden Typs nicht unterstützt: {types}.} other{Dieser Vorgang wird für Elemente der folgenden Typen nicht unterstützt: {types}.}}", + "@unsupportedTypeDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "Einige Dateien im Zielordner haben den gleichen Namen.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "Einige Dateien haben denselben Namen.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "Shortcut-Etikett", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "Hinzufügen", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "Es gibt keine Anwendungen, die dies bewältigen können.", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Dieses Element in den Papierkorb verschieben?} other{Diese {count} Elemente in den Papierkorb verschieben?}}", + "@binEntriesConfirmationDialogMessage": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Sicher, dass dieses Element gelöscht werden soll?} other{Sicher, dass diese {count} Elemente gelöscht werden sollen?}}", + "@deleteEntriesConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "Daten speichern, bevor es weitergeht?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Datum einstellen", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Soll bei {time} weiter abspielt werden?", + "@videoResumeDialogMessage": {}, + "videoStartOverButtonLabel": "NEU BEGINNEN", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "FORTSETZTEN", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Letzter Artikel", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Auto", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Benutzerdefiniert", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "Passende Fotos und Videos werden aus Ihrer Sammlung ausgeblendet. Dies kann in den „Datenschutz“-Einstellungen wieder eingeblendet werden.\n\nSicher, dass diese ausblendet werden sollen?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "Neues Album", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Album Name", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Verzeichnis existiert bereits", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Speicher:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "Neuer Name", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Verzeichnis existiert bereits", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Umbenennen", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "Benennungsmuster", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Feld einfügen", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Vorschau", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Zähler", + "@renameProcessorCounter": {}, + "renameProcessorName": "Name", + "@renameProcessorName": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Das Album und das darin enthaltene Element löschen?} other{Das Album und die {count} darin enthaltenen Elemente löschen?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Diese Alben und die darin enthaltenen Elemente löschen?} other{Diese Alben und die darin enthaltenen {count} Objekte löschen?}}", + "@deleteMultiAlbumConfirmationDialogMessage": {}, + "exportEntryDialogFormat": "Format:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Breite", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Höhe", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "Neuer Name", + "@renameEntryDialogLabel": {}, + "editEntryDialogTargetFieldsHeader": "Zu ändernde Felder", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Datum & Uhrzeit", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Datum einstellen", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Von anderem Datum kopieren", + "@editEntryDateDialogCopyField": {}, + "editEntryDialogCopyFromItem": "Von einem anderen Element kopieren", + "@editEntryDialogCopyFromItem": {}, + "editEntryDateDialogExtractFromTitle": "Auszug aus dem Titel", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Verschieben", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "Änderungsdatum der Datei", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "Stunden", + "@durationDialogHours": {}, + "durationDialogMinutes": "Minuten", + "@durationDialogMinutes": {}, + "editEntryLocationDialogTitle": "Standort", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogChooseOnMap": "Auf Karte wählen", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "Breitengrad", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "Längengrad", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "Diesen Standort verwenden", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "Bewertung", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Entfernung von Metadaten", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "Mehr", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP ist erforderlich, um das Video innerhalb eines bewegten Bildes abzuspielen.\n\nSicher, dass es entfernt werden soll?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "genericDangerWarningDialogMessage": "Sicher?", + "@genericDangerWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Wiedergabegeschwindigkeit", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Audio", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Untertitel", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "Aus", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Spur", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "Es gibt keine anderen Spuren.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "Erledigt!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Gescheitert", + "@genericFailureFeedback": {}, + "menuActionConfigureView": "Sortierung", + "@menuActionConfigureView": {}, + "menuActionSelect": "Auswahl", + "@menuActionSelect": {}, + "menuActionSelectAll": "Alle auswählen", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "Keine auswählen", + "@menuActionSelectNone": {}, + "menuActionMap": "Karte", + "@menuActionMap": {}, + "menuActionSlideshow": "Diashow", + "@menuActionSlideshow": {}, + "menuActionStats": "Statistiken", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "Sortieren", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "Abschnitte", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Layout", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "Umgekehrte Sortierung", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "Mosaik", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "Kacheln", + "@tileLayoutGrid": {}, + "tileLayoutList": "Liste", + "@tileLayoutList": {}, + "coverDialogTabCover": "Titelbild", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "App", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Farbe", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Wähle App", + "@appPickDialogTitle": {}, + "appPickDialogNone": "Nichts", + "@appPickDialogNone": {}, + "aboutPageTitle": "Über", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Lizenz", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Datenschutzrichtlinie", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Fehlerbericht", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Anwendungsprotokolle in einer Datei speichern", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Systeminformationen kopieren", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "Kopieren", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "Bericht auf GitHub mit den Protokollen und Systeminformationen", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "Bericht", + "@aboutBugReportButton": {}, + "aboutCreditsSectionTitle": "Kredite", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "Diese Anwendung verwendet eine TopoJSON-Datei von", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "unter ISC-Lizenz.", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Übersetzer", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Open-Source-Lizenzen", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "Diese Anwendung verwendet die folgenden Open-Source-Pakete und -Bibliotheken.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android-Bibliotheken", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter-Plugins", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flatter-Pakete", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart-Pakete", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Alle Lizenzen anzeigen", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "Datenschutzrichtlinie", + "@policyPageTitle": {}, + "collectionPageTitle": "Sammlung", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "Wähle", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "Elemente auswählen", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Titelfilter anzeigen", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Titelfilter ausblenden", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Verknüpfung hinzufügen", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "Papierkorb leeren", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "In Album kopieren", + "@collectionActionCopy": {}, + "collectionActionMove": "Zum Album verschieben", + "@collectionActionMove": {}, + "collectionActionRescan": "Neu scannen", + "@collectionActionRescan": {}, + "collectionActionEdit": "Bearbeiten", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Titel suchen", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "Nach Album", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Nach Monat", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Nach Tag", + "@collectionGroupDay": {}, + "sectionUnknown": "Unbekannt", + "@sectionUnknown": {}, + "dateToday": "Heute", + "@dateToday": {}, + "dateYesterday": "Gestern", + "@dateYesterday": {}, + "dateThisMonth": "Diesen Monat", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{1 Element konnte nicht gelöscht werden} other{{count} Elemente konnten nicht gelöscht werden}}", + "@collectionDeleteFailureFeedback": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{1 Element konnte nicht kopiert werden} other{{count} Element konnten nicht kopiert werden}}", + "@collectionCopyFailureFeedback": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{1 Element konnte nicht verschoben werden} other{{count} Elemente konnten nicht verschoben werden}}", + "@collectionMoveFailureFeedback": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{Fehler beim Umbenennen eines Elements} other{Fehler beim Umbenennen {count} Elemente}}", + "@collectionRenameFailureFeedback": {}, + "collectionEditFailureFeedback": "{count, plural, =1{1 Element konnte nicht bearbeitet werden} other{{count} 1 Elemente konnten nicht bearbeitet werden}}", + "@collectionEditFailureFeedback": {}, + "collectionExportFailureFeedback": "{count, plural, =1{1 Seite konnte nicht exportiert werden} other{{count} Seiten konnten nicht exportiert werden}}", + "@collectionExportFailureFeedback": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{1 Element kopier} other{ {count} Elemente kopiert}}", + "@collectionCopySuccessFeedback": {}, + "collectionMoveSuccessFeedback": "{count, plural, =1{1 Element verschoben} other{{count} Elemente verschoben}}", + "@collectionMoveSuccessFeedback": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{1 Element umbenannt} other{{count} Elemente umbenannt}}", + "@collectionRenameSuccessFeedback": {}, + "collectionEditSuccessFeedback": "{count, plural, =1{1 Element bearbeitet} other{ {count} Elemente bearbeitet}}", + "@collectionEditSuccessFeedback": {}, + "collectionEmptyFavourites": "Keine Favoriten", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "Keine Videos", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "Keine Bilder", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Zugriff gewähren", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Bereich auswählen", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Bereich abwählen", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "Über", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Einstellungen", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "Alle Bilder", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Favoriten", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Bilder", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Videos", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "Animationen", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Bewegte Fotos", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "Panoramen", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Rohdaten Fotos", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "360°-Videos", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Alben", + "@drawerAlbumPage": {}, + "drawerCountryPage": "Länder", + "@drawerCountryPage": {}, + "drawerTagPage": "Tags", + "@drawerTagPage": {}, + "sortByDate": "Nach Datum", + "@sortByDate": {}, + "sortByName": "Nach Name", + "@sortByName": {}, + "sortByItemCount": "Nach Anzahl", + "@sortByItemCount": {}, + "sortBySize": "Nach Größe", + "@sortBySize": {}, + "sortByAlbumFileName": "Nach Album- und Elementtitel", + "@sortByAlbumFileName": {}, + "sortByRating": "Nach Bewertung", + "@sortByRating": {}, + "sortOrderNewestFirst": "Neueste zuerst", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Älteste zuerst", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "A zu Z", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Z zu A", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "Höchste zuerst", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Niedrigste zuerst", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Größtes zuerst", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "Kleinste zuerst", + "@sortOrderSmallestFirst": {}, + "albumGroupTier": "Nach Ebene", + "@albumGroupTier": {}, + "albumGroupType": "Nach Typ", + "@albumGroupType": {}, + "albumGroupVolume": "Nach Speichervolumen", + "@albumGroupVolume": {}, + "albumMimeTypeMixed": "Gemischt", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "In Album kopieren", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "In Album exportieren", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Zum Album verschieben", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "Album auswählen", + "@albumPickPageTitlePick": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "albumDownload": "Heruntergeladen", + "@albumDownload": {}, + "albumScreenshots": "Bildschirmfotos", + "@albumScreenshots": {}, + "albumScreenRecordings": "Bildschirmaufnahmen", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Video-Aufnahmen", + "@albumVideoCaptures": {}, + "albumPageTitle": "Alben", + "@albumPageTitle": {}, + "albumEmpty": "Keine Alben", + "@albumEmpty": {}, + "createAlbumButtonLabel": "ERSTELLE", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "Neu", + "@newFilterBanner": {}, + "countryPageTitle": "Länder", + "@countryPageTitle": {}, + "countryEmpty": "Keine Länder", + "@countryEmpty": {}, + "tagPageTitle": "Tags", + "@tagPageTitle": {}, + "tagEmpty": "Keine Tags", + "@tagEmpty": {}, + "binPageTitle": "Papierkorb", + "@binPageTitle": {}, + "searchCollectionFieldHint": "Sammlung durchsuchen", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "Neueste", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Datum", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "Alben", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "Länder", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "Orte", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Tags", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "Bewertungen", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "Metadaten", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Einstellungen", + "@settingsPageTitle": {}, + "settingsSystemDefault": "System", + "@settingsSystemDefault": {}, + "settingsDefault": "Standard", + "@settingsDefault": {}, + "settingsDisabled": "Deaktiviert", + "@settingsDisabled": {}, + "settingsSearchFieldLabel": "Einstellungen durchsuchen", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Keine passende Einstellung", + "@settingsSearchEmpty": {}, + "settingsActionExport": "Exportieren", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "Exportieren", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "Importieren", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Importieren", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "Titelbilder", + "@appExportCovers": {}, + "appExportFavourites": "Favoriten", + "@appExportFavourites": {}, + "appExportSettings": "Einstellungen", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "Navigation", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Startseite", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Startseite", + "@settingsHomeDialogTitle": {}, + "settingsKeepScreenOnTile": "Bildschirm eingeschaltet lassen", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Bildschirm eingeschaltet lassen", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Zum Verlassen zweimal „zurück“ tippen", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "Bestätigungsdialoge", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "Bestätigungsdialoge", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Vor dem endgültigen Löschen von Elementen fragen", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "Vor dem Verschieben von Elementen in den Papierkorb fragen", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Vor Verschiebung von Objekten ohne Metadaten-Datum fragen", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Nachricht nach dem Verschieben von Elementen in den Papierkorb anzeigen", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerTile": "Menü Navigation", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Menü Navigation", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "Die Taste berühren und halten, um Menüpunkte zu verschieben und neu anzuordnen.", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "Typen", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "Alben", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Seiten", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Album hinzufügen", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "Vorschaubilder", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "Überlagerung", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Überlagerung", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowFavouriteIcon": "Favoriten-Symbol anzeigen", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Tag-Symbol anzeigen", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Standort-Symbol anzeigen", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Bewegungsfoto-Symbol anzeigen", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "Bewertung anzeigen", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Rohdaten-Symbol anzeigen", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Videodauer anzeigen", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "Schnelle Aktionen", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Schnelle Aktionen", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Durchsuchen", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Auswahl", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Die Taste gedrückt halten, um die Schaltflächen zu bewegen und auszuwählen, welche Aktionen beim Durchsuchen von Elementen angezeigt werden.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Die Taste gedrückt halten, um die Schaltflächen zu bewegen und auszuwählen, welche Aktionen beim Durchsuchen von Elementen angezeigt werden.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsViewerSectionTitle": "Anzeige", + "@settingsViewerSectionTitle": {}, + "settingsViewerGestureSideTapNext": "Tippen auf den Bildschirmrand, um das vorheriges/nächstes Element anzuzeigen", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerUseCutout": "Ausgeschnittenen Bereich verwenden", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Maximale Helligkeit", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Automatische Wiedergabe bewegter Fotos", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "Bild-Hintergrund", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Schnelle Aktionen", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Schnelle Aktionen", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "Die Taste gedrückt halten, um die Schaltflächen zu bewegen und auszuwählen, welche Aktionen im Viewer angezeigt werden sollen.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Angezeigte Schaltflächen", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Verfügbare Schaltflächen", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Keine Tasten", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "Überlagerung", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "Überlagerung", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "Bei Eröffnung anzeigen", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "Minimap anzeigen", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Informationen anzeigen", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "Titel, Datum, Ort, etc. anzeigen.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowShootingDetails": "Aufnahmedetails anzeigen", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowOverlayThumbnails": "Vorschaubilder anzeigen", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "Unschärfe-Effekt", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "Diashow", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "Diashow", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Wiederholung", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Mischen", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Bildschirm ausfüllen", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowAnimatedZoomEffect": "Animierter Zoomeffekt", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "Übergang", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Intervall", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "Videowiedergabe", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Videowiedergabe", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "Video-Einstellungen", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "Videos anzeigen", + "@settingsVideoShowVideos": {}, + "settingsVideoEnableHardwareAcceleration": "Hardware-Beschleunigung", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "Automatische Wiedergabe", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "Schleifen-Modus", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Schleifen-Modus", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "Untertitel", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Untertitel", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Dies ist ein Beispiel.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "Textausrichtung", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Textausrichtung", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Textgröße", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "Umriss und Schatten anzeigen", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Textfarbe", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Opazität des Textes", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Hintergrundfarbe", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Hintergrund-Opazität", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Links", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Zentrum", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Rechts", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoControlsTile": "Steuerung", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "Steuerung", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "Schaltflächen", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Doppeltippen zum Abspielen/Pausieren", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "Doppeltippen auf die Bildschirmränder zum Rückwärts-/Vorwärtsspringen", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsPrivacySectionTitle": "Datenschutz", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Zugriff auf die Liste der installierten Apps", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "zur Gruppierung von Bildern nach Apps", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "Anonyme Fehlermeldungen zulassen", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Suchverlauf speichern", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "Papierkorb verwenden", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "Gelöschte Elemente 30 Tage lang aufbewahren", + "@settingsEnableBinSubtitle": {}, + "settingsHiddenItemsTile": "Versteckte Elemente", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Versteckte Elemente", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "Fotos und Videos, die versteckten Filtern entsprechen, werden nicht in Ihrer Sammlung angezeigt.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "Keine versteckten Filter", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Speicherzugriff", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "Speicherzugriff", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessBanner": "Einige Verzeichnisse erfordern eine explizite Zugriffsberechtigung, um Dateien darin zu ändern. Hier können Verzeichnisse überprüft werden, auf die zuvor Zugriff gewährt wurde.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Keine Zugangsberechtigungen", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Widerrufen", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Barrierefreiheit", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Animationen entfernen", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "Animationen entfernen", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Zeit zum Reagieren", + "@settingsTimeToTakeActionTile": {}, + "settingsDisplaySectionTitle": "Darstellung", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Thema", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "Thema", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "Farbige Highlights", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Dynamische Farben", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Bildwiederholrate der Anzeige", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Bildwiederholrate", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageSectionTitle": "Sprache & Formate", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "Sprache", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "Sprache", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "Koordinatenformat", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "Koordinatenformat", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Einheiten", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "Einheiten", + "@settingsUnitSystemDialogTitle": {}, + "settingsScreenSaverPageTitle": "Bildschirmschoner", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "Bilderrahmen", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Umrandung", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "Beim Tippen auf das Widget", + "@settingsWidgetOpenPage": {}, + "settingsCollectionTile": "Sammlung", + "@settingsCollectionTile": {}, + "statsPageTitle": "Statistiken", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, =1{1 Element mit Standort} other{{count} Elemente mit Standort}}", + "@statsWithGps": {}, + "statsTopCountriesSectionTitle": "Top-Länder", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Top-Plätze", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Top-Tags", + "@statsTopTagsSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Top-Alben", + "@statsTopAlbumsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "ÖFFNE PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "HINTERGRUNDBILD EINSTELLEN", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Ups!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "Die Datei existiert nicht mehr.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Info", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "Zurück zum Betrachter", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "Unbekannt", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "Beschreibung", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Titel", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "Datum", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "Auflösung", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Größe", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URL", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Pfad", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Dauer", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Im Besitz von", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Koordinaten", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Adresse", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Kartenstil", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Kartenstil auswählen", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Vergrößern", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Verkleinern", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Richtung Norden aufwärts", + "@mapPointNorthUpTooltip": {}, + "mapAttributionOsmHot": "Kacheln von [HOT](https://www.hotosm.org/) • Gehostet von [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "Kacheln von [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "openMapPageTooltip": "Auf der Karte anzeigen", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "Keine Bilder in dieser Region", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Eingebettete Daten konnten nicht extrahiert werden", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "Öffnen", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Ansicht XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "Metadaten suchen", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Keine passenden Schlüssel", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Datum & Uhrzeit", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Beschreibung", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Abmessungen", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Auflösung", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Rechte", + "@viewerInfoSearchSuggestionRights": {}, + "wallpaperUseScrollEffect": "Scroll-Effekt auf dem Startbildschirm verwenden", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageTitle": "Tags bearbeiten", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Neuer Tag", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Tag hinzufügen", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Neueste", + "@tagEditorSectionRecent": {}, + "panoramaEnableSensorControl": "Aktivieren der Sensorsteuerung", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Sensorsteuerung deaktivieren", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Quelle", + "@sourceViewerPageTitle": {}, + "widgetOpenPageCollection": "Sammlung öffnen", + "@widgetOpenPageCollection": {}, + "durationDialogSeconds": "Sekunden", + "@durationDialogSeconds": {}, + "settingsAllowMediaManagement": "Medienverwaltung zulassen", + "@settingsAllowMediaManagement": {}, + "tagEditorSectionPlaceholders": "Platzhalter", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "Land", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "Ort", + "@tagPlaceholderPlace": {}, + "editEntryLocationDialogSetCustom": "Benutzerdefinierten Standort festlegen", + "@editEntryLocationDialogSetCustom": {}, + "entryInfoActionExportMetadata": "Metadaten exportieren", + "@entryInfoActionExportMetadata": {}, + "subtitlePositionTop": "Oben", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "Unten", + "@subtitlePositionBottom": {}, + "settingsSubtitleThemeTextPositionTile": "Textposition", + "@settingsSubtitleThemeTextPositionTile": {}, + "filterNoAddressLabel": "Keine Adresse", + "@filterNoAddressLabel": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Textposition", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsWidgetDisplayedItem": "Angezeigtes Element", + "@settingsWidgetDisplayedItem": {}, + "widgetDisplayedItemRandom": "Zufällig", + "@widgetDisplayedItemRandom": {}, + "widgetDisplayedItemMostRecent": "Neueste", + "@widgetDisplayedItemMostRecent": {}, + "settingsViewerShowRatingTags": "Bewertung & Tags anzeigen", + "@settingsViewerShowRatingTags": {}, + "filterAspectRatioPortraitLabel": "Hochformat", + "@filterAspectRatioPortraitLabel": {}, + "filterAspectRatioLandscapeLabel": "Querformat", + "@filterAspectRatioLandscapeLabel": {}, + "entryActionShareImageOnly": "Nur das Bild teilen", + "@entryActionShareImageOnly": {}, + "keepScreenOnVideoPlayback": "Während der Videowiedergabe", + "@keepScreenOnVideoPlayback": {}, + "entryInfoActionRemoveLocation": "Standort entfernen", + "@entryInfoActionRemoveLocation": {}, + "entryActionShareVideoOnly": "Nur das Video teilen", + "@entryActionShareVideoOnly": {}, + "filterLocatedLabel": "Mit Standort", + "@filterLocatedLabel": {}, + "filterTaggedLabel": "Getaggt", + "@filterTaggedLabel": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Alternativen für Multi-Touch-Gesten anzeigen", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsDisplayUseTvInterface": "Android-TV Oberfläche", + "@settingsDisplayUseTvInterface": {}, + "columnCount": "{count, plural, =1{{count} Spalte} other{{count} Spalten}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsVideoGestureVerticalDragBrightnessVolume": "Nach oben oder unten wischen, um die Helligkeit/Lautstärke einzustellen", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "tooManyItemsErrorDialogMessage": "Noch einmal mit weniger Elementen versuchen.", + "@tooManyItemsErrorDialogMessage": {}, + "settingsModificationWarningDialogMessage": "Andere Einstellungen werden angepasst.", + "@settingsModificationWarningDialogMessage": {}, + "settingsViewerShowDescription": "Beschreibung anzeigen", + "@settingsViewerShowDescription": {}, + "chipActionGoToPlacePage": "In Orten anzeigen", + "@chipActionGoToPlacePage": {}, + "chipActionLock": "Sperren", + "@chipActionLock": {}, + "chipActionCreateVault": "Tresor anlegen", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "Tresor konfigurieren", + "@chipActionConfigureVault": {}, + "settingsCollectionBurstPatternsTile": "Berstmuster", + "@settingsCollectionBurstPatternsTile": {}, + "settingsVideoEnablePip": "Bild-in-Bild", + "@settingsVideoEnablePip": {}, + "patternDialogEnter": "Muster eingeben", + "@patternDialogEnter": {}, + "tagPlaceholderState": "Staat", + "@tagPlaceholderState": {}, + "settingsDisablingBinWarningDialogMessage": "Die Elemente im Papierkorb werden für immer gelöscht.", + "@settingsDisablingBinWarningDialogMessage": {}, + "chipActionShowCountryStates": "Staaten anzeigen", + "@chipActionShowCountryStates": {}, + "viewerActionLock": "Anzeige sperren", + "@viewerActionLock": {}, + "viewerActionUnlock": "Anzeige entsperren", + "@viewerActionUnlock": {}, + "albumTierVaults": "Tresore", + "@albumTierVaults": {}, + "patternDialogConfirm": "Muster bestätigen", + "@patternDialogConfirm": {}, + "exportEntryDialogWriteMetadata": "Metadaten schreiben", + "@exportEntryDialogWriteMetadata": {}, + "drawerPlacePage": "Orte", + "@drawerPlacePage": {}, + "statePageTitle": "Staaten", + "@statePageTitle": {}, + "stateEmpty": "Keine Staaten", + "@stateEmpty": {}, + "placePageTitle": "Orte", + "@placePageTitle": {}, + "placeEmpty": "Keine Orte", + "@placeEmpty": {}, + "settingsCollectionBurstPatternsNone": "Nichts", + "@settingsCollectionBurstPatternsNone": {}, + "settingsVideoBackgroundMode": "Hintergrund-Modus", + "@settingsVideoBackgroundMode": {}, + "searchStatesSectionTitle": "Staaten", + "@searchStatesSectionTitle": {}, + "settingsConfirmationVaultDataLoss": "Warnung vor Tresordatenverlust anzeigen", + "@settingsConfirmationVaultDataLoss": {}, + "settingsVideoBackgroundModeDialogTitle": "Hintergrund-Modus", + "@settingsVideoBackgroundModeDialogTitle": {}, + "statsTopStatesSectionTitle": "Top Staaten", + "@statsTopStatesSectionTitle": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "vaultLockTypePattern": "Muster", + "@vaultLockTypePattern": {}, + "vaultLockTypePassword": "Passwort", + "@vaultLockTypePassword": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "passwordDialogEnter": "Passwort eingeben", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Passwort bestätigen", + "@passwordDialogConfirm": {}, + "authenticateToConfigureVault": "Authentifizierung zum Konfigurieren des Tresors", + "@authenticateToConfigureVault": {}, + "newVaultWarningDialogMessage": "Elemente in Tresoren sind nur für diese App verfügbar und nicht in anderen.\n\nWenn Sie diese App deinstallieren oder die Daten dieser App löschen, gehen alle diese Elemente verloren.", + "@newVaultWarningDialogMessage": {}, + "newVaultDialogTitle": "Neuer Tresor", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "Tresor konfigurieren", + "@configureVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "Sperren beim Ausschalten des Bildschirms", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "Schloss-Typ", + "@vaultDialogLockTypeLabel": {}, + "pinDialogConfirm": "PIN bestätigen", + "@pinDialogConfirm": {}, + "authenticateToUnlockVault": "Authentifizierung zum Entsperren des Tresors", + "@authenticateToUnlockVault": {}, + "vaultBinUsageDialogMessage": "Einige Tresore verwenden den Papierkorb.", + "@vaultBinUsageDialogMessage": {}, + "pinDialogEnter": "PIN eingeben", + "@pinDialogEnter": {}, + "maxBrightnessNever": "Nie", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "Immer", + "@maxBrightnessAlways": {}, + "videoResumptionModeNever": "Nie", + "@videoResumptionModeNever": {}, + "videoResumptionModeAlways": "Immer", + "@videoResumptionModeAlways": {}, + "exportEntryDialogQuality": "Qualität", + "@exportEntryDialogQuality": {}, + "settingsAskEverytime": "Jedes Mal nachfragen", + "@settingsAskEverytime": {}, + "settingsVideoPlaybackTile": "Wiedergabe", + "@settingsVideoPlaybackTile": {}, + "settingsVideoPlaybackPageTitle": "Wiedergabe", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoResumptionModeTile": "Wiedergabe fortsetzen", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoResumptionModeDialogTitle": "Wiedergabe fortsetzen", + "@settingsVideoResumptionModeDialogTitle": {}, + "tagEditorDiscardDialogMessage": "Möchten Sie die Änderungen verwerfen?", + "@tagEditorDiscardDialogMessage": {}, + "saveCopyButtonLabel": "KOPIE SPEICHERN", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Anwenden", + "@applyTooltip": {}, + "editorActionTransform": "Umwandeln", + "@editorActionTransform": {}, + "editorTransformCrop": "Zuschneiden", + "@editorTransformCrop": {}, + "editorTransformRotate": "Drehen", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Frei", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Original", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Quadrat", + "@cropAspectRatioSquare": {}, + "widgetTapUpdateWidget": "Widget aktualisieren", + "@widgetTapUpdateWidget": {}, + "aboutDataUsageSectionTitle": "Datennutzung", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageData": "Daten", + "@aboutDataUsageData": {}, + "aboutDataUsageCache": "Cache", + "@aboutDataUsageCache": {}, + "aboutDataUsageMisc": "Sonstiges", + "@aboutDataUsageMisc": {}, + "aboutDataUsageInternal": "Intern", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "Extern", + "@aboutDataUsageExternal": {}, + "aboutDataUsageDatabase": "Datenbank", + "@aboutDataUsageDatabase": {}, + "overlayHistogramLuminance": "Leuchtdichte", + "@overlayHistogramLuminance": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "aboutDataUsageClearCache": "Cache leeren", + "@aboutDataUsageClearCache": {}, + "settingsViewerShowHistogram": "Histogramm anzeigen", + "@settingsViewerShowHistogram": {}, + "overlayHistogramNone": "Keines", + "@overlayHistogramNone": {}, + "collectionActionSetHome": "Als Startseite setzen", + "@collectionActionSetHome": {}, + "settingsThumbnailShowHdrIcon": "HDR-Symbol anzeigen", + "@settingsThumbnailShowHdrIcon": {}, + "entryActionCast": "Übertragen", + "@entryActionCast": {}, + "castDialogTitle": "Geräte zur Übertragung", + "@castDialogTitle": {}, + "renameProcessorHash": "Raute", + "@renameProcessorHash": {}, + "settingsForceWesternArabicNumeralsTile": "Arabische Ziffern erzwingen", + "@settingsForceWesternArabicNumeralsTile": {}, + "videoActionABRepeat": "A-B-Wiederholung", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "Start festlegen", + "@videoRepeatActionSetStart": {}, + "stopTooltip": "Stoppen", + "@stopTooltip": {}, + "videoRepeatActionSetEnd": "Ende festlegen", + "@videoRepeatActionSetEnd": {}, + "chipActionShowCollection": "In Sammlung anzeigen", + "@chipActionShowCollection": {}, + "sortByDuration": "Nach Dauer", + "@sortByDuration": {}, + "sortOrderShortestFirst": "Kurze zuerst", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "Lange zuerst", + "@sortOrderLongestFirst": {}, + "explorerActionSelectStorageVolume": "Speicher auswählen", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "Speicher auswählen", + "@selectStorageVolumeDialogTitle": {}, + "setHomeCustom": "Benutzerdefiniert", + "@setHomeCustom": {}, + "chipActionGoToExplorerPage": "Im Explorer anzeigen", + "@chipActionGoToExplorerPage": {}, + "explorerPageTitle": "Explorer", + "@explorerPageTitle": {}, + "mapAttributionOsmData": "Kartendaten © [OpenStreetMap](https://www.openstreetmap.org/copyright) Mitwirkende", + "@mapAttributionOsmData": {}, + "videoActionShowPreviousFrame": "Vorigen Frame zeigen", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "Nächsten Frame zeigen", + "@videoActionShowNextFrame": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapAttributionOsmLiberty": "Kacheln von [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Gehostet von [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Kacheln von [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Album existiert bereits", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "appExportDynamicAlbums": "Dynamische Alben", + "@appExportDynamicAlbums": {}, + "dynamicAlbumAlreadyExists": "Dynamisches Album existiert bereits", + "@dynamicAlbumAlreadyExists": {}, + "chipActionRemove": "Entfernen", + "@chipActionRemove": {}, + "newDynamicAlbumDialogTitle": "Neues Dynamisches Album", + "@newDynamicAlbumDialogTitle": {}, + "collectionActionAddDynamicAlbum": "Dynamisches Album hinzufügen", + "@collectionActionAddDynamicAlbum": {}, + "albumTierDynamic": "Dynamisch", + "@albumTierDynamic": {}, + "chipActionDecompose": "Aufschlüsseln", + "@chipActionDecompose": {}, + "editEntryLocationDialogImportGpx": "GPX importieren", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "Zeitverschiebung", + "@editEntryLocationDialogTimeShift": {}, + "removeEntryMetadataDialogAll": "Alle", + "@removeEntryMetadataDialogAll": {}, + "searchFormatSectionTitle": "Formate", + "@searchFormatSectionTitle": {}, + "sortByPath": "Nach Pfad", + "@sortByPath": {}, + "groupEmpty": "Keine Gruppen", + "@groupEmpty": {}, + "newGroupDialogTitle": "Neue Gruppe", + "@newGroupDialogTitle": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "createButtonLabel": "ERSTELLEN", + "@createButtonLabel": {}, + "chipActionGroup": "Gruppierung ändern", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Gruppe erstellen", + "@chipActionCreateGroup": {}, + "albumTierGroups": "Gruppen", + "@albumTierGroups": {}, + "sectionNone": "Keine Abschnitte", + "@sectionNone": {}, + "newGroupDialogNameLabel": "Gruppenname", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "Gruppe existiert bereits", + "@groupAlreadyExists": {}, + "ungrouped": "Nicht gruppiert", + "@ungrouped": {}, + "groupPickerTitle": "Gruppe auswählen", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Diese Gruppe verwenden", + "@groupPickerUseThisGroupButton": {}, + "mapStyleDialogAddStyle": "Stil hinzufügen", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogName": "Name", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "tagPickPageTitle": "Tag auswählen", + "@tagPickPageTitle": {}, + "settingsNavigationBottomActionsTile": "Untere Navigation", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Untere Navigation", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Tippen und halten Sie um die Elemente der unteren Navigationsleiste zu verschieben und anzupassen.", + "@settingsNavigationBottomActionEditorBanner": {}, + "settingsViewerShowZoomLevel": "Vergrößerungsgrad anzeigen", + "@settingsViewerShowZoomLevel": {}, + "mapStyleEditorDialogSubdomains": "Subdomains", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "User-Agent", + "@mapStyleEditorDialogUserAgent": {}, + "settingsForced": "Erzwungen", + "@settingsForced": {}, + "settingsEnabled": "Aktiviert", + "@settingsEnabled": {} +} diff --git a/lib/l10n/app_el.arb b/lib/l10n/app_el.arb new file mode 100644 index 0000000..9e34d53 --- /dev/null +++ b/lib/l10n/app_el.arb @@ -0,0 +1,1450 @@ +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Καλωσορίσατε στην εφαρμογή Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Προαιρετικό", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Συμφωνώ με τους όρους και τις προυποθέσεις", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, =1{{count} στοιχείο} other{{count} στοιχεία}}", + "@itemCount": {}, + "timeSeconds": "{count, plural, =1{{count} δευτερόλεπτο} other{{count} δευτερόλεπτα}}", + "@timeSeconds": {}, + "timeMinutes": "{count, plural, =1{{count} λεπτό} other{{count} λεπτά}}", + "@timeMinutes": {}, + "timeDays": "{count, plural, =1{{count} ημέρα} other{{count} ημέρες}}", + "@timeDays": {}, + "focalLength": "{length} mm", + "@focalLength": {}, + "applyButtonLabel": "ΕΦΑΡΜΟΓΗ", + "@applyButtonLabel": {}, + "deleteButtonLabel": "ΔΙΑΓΡΑΦΗ", + "@deleteButtonLabel": {}, + "nextButtonLabel": "ΕΠΟΜΕΝΟ", + "@nextButtonLabel": {}, + "showButtonLabel": "ΕΜΦΑΝΙΣΗ", + "@showButtonLabel": {}, + "hideButtonLabel": "ΑΠΟΚΡΥΨΗ", + "@hideButtonLabel": {}, + "continueButtonLabel": "ΣΥΝΕΧΕΙΑ", + "@continueButtonLabel": {}, + "cancelTooltip": "Ακύρωση", + "@cancelTooltip": {}, + "changeTooltip": "Αλλαγή", + "@changeTooltip": {}, + "clearTooltip": "Εκκαθάριση", + "@clearTooltip": {}, + "previousTooltip": "Προηγούμενο", + "@previousTooltip": {}, + "nextTooltip": "Επόμενο", + "@nextTooltip": {}, + "showTooltip": "Εμφάνιση", + "@showTooltip": {}, + "hideTooltip": "Απόκρυψη", + "@hideTooltip": {}, + "actionRemove": "Αφαίρεση", + "@actionRemove": {}, + "resetTooltip": "Επαναφορά", + "@resetTooltip": {}, + "saveTooltip": "Αποθήκευση", + "@saveTooltip": {}, + "pickTooltip": "Διαλέξτε", + "@pickTooltip": {}, + "doubleBackExitMessage": "Αγγίξτε ξανά το «πίσω» για έξοδο.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "Να μην ερωτηθώ ξανά", + "@doNotAskAgain": {}, + "sourceStateLoading": "Φόρτωση", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Καταλογογράφηση", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Εντοπισμός χωρών", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Εντοπισμός τοποθεσιών", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Διαγραφή", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Εμφάνιση στα Άλμπουμ", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Εμφάνιση στις χώρες", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "Εμφάνιση στις ετικέτες", + "@chipActionGoToTagPage": {}, + "chipActionFilterOut": "Χωρίς φιλτράρισμα", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Με φιλτράρισμα", + "@chipActionFilterIn": {}, + "chipActionHide": "Απόκρυψη", + "@chipActionHide": {}, + "chipActionPin": "Καρφίτσωμα στην κορυφή", + "@chipActionPin": {}, + "chipActionUnpin": "Ξέκαρφίτσωμα από την κορυφή", + "@chipActionUnpin": {}, + "chipActionRename": "Μετονομασία", + "@chipActionRename": {}, + "chipActionSetCover": "Ορισμός ως εξώφυλλο", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "Δημιουργία άλμπουμ", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "Αντιγραφή στο πρόχειρο", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "Διαγραφή", + "@entryActionDelete": {}, + "entryActionConvert": "Μετατροπή", + "@entryActionConvert": {}, + "entryActionExport": "Εξαγωγή", + "@entryActionExport": {}, + "entryActionInfo": "Λεπτομέρειες", + "@entryActionInfo": {}, + "entryActionRename": "Μετονομασία", + "@entryActionRename": {}, + "entryActionRestore": "Επαναφορά", + "@entryActionRestore": {}, + "entryActionRotateCCW": "Περιστροφή προς τα αριστερά", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Περιστροφή προς τα δεξιά", + "@entryActionRotateCW": {}, + "entryActionFlip": "Αντανάκλαση καθρέφτη", + "@entryActionFlip": {}, + "entryActionPrint": "Εκτύπωση", + "@entryActionPrint": {}, + "entryActionShare": "Κοινοποίηση", + "@entryActionShare": {}, + "entryActionViewSource": "Προβολή πηγής", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "Εμφάνιση ως επικάλυψη στον χάρτη", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Μετατροπή σε στατική εικόνα", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Άνοιγμα του βίντεο", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Επεξεργασία", + "@entryActionEdit": {}, + "entryActionOpen": "Άνοιγμα με", + "@entryActionOpen": {}, + "entryActionSetAs": "Ορισμός ως", + "@entryActionSetAs": {}, + "entryActionOpenMap": "Εμφάνιση στην εφαρμογή χάρτες", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Περιστροφή οθόνης", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Προσθήκη στα αγαπημένα", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Αφαίρεση από τα αγαπημένα", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Λήψη στιγμιότυπου", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Σίγαση", + "@videoActionMute": {}, + "videoActionUnmute": "Αναίρεση σίγασης", + "@videoActionUnmute": {}, + "videoActionPause": "Παύση", + "@videoActionPause": {}, + "videoActionPlay": "Αναπαραγωγή", + "@videoActionPlay": {}, + "videoActionReplay10": "10 δευτερόλεπτα πίσω", + "@videoActionReplay10": {}, + "videoActionSkip10": "10 δευτερόλεπτα μπροστά", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Επιλογή γλώσσας", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Ταχύτητα αναπαραγωγής", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "Ρυθμίσεις", + "@viewerActionSettings": {}, + "slideshowActionResume": "Συνέχιση", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Εμφάνιση στη Συλλογή", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Επεξεργασία ημερομηνίας και ώρας", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Επεξεργασία τοποθεσίας", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "Επεξεργασία ονομασίας & περιγραφής", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Επεξεργασία βαθμολογίας", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Επεξεργασία ετικετών", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Κατάργηση μεταδεδομένων", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "Κάδος ανακύκλωσης", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Αγαπημένα", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Χωρίς ημερομηνία", + "@filterNoDateLabel": {}, + "filterNoLocationLabel": "Χωρίς τοποθεσία", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Χωρίς βαθμολογία", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Χωρίς ετικέτα", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Χωρίς ονομασία", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "Αυτή τη μέρα", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Προστέθηκαν πρόσφατα", + "@filterRecentlyAddedLabel": {}, + "filterRatingRejectedLabel": "Απορριφθέντα", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Κινούμενα", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "Φωτογραφίες με κίνηση", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Πανοραμικές", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "Βίντεο 360°", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Εικόνα", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Βίντεο", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Δεκαδικές μοίρες", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, + "coordinateDmsNorth": "Β", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "Ν", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "Α", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "Δ", + "@coordinateDmsWest": {}, + "unitSystemMetric": "Μετρικό", + "@unitSystemMetric": {}, + "unitSystemImperial": "Aγγλοσαξονικό", + "@unitSystemImperial": {}, + "videoLoopModeNever": "Ποτέ", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "Μόνο για βίντεο σύντομης διάρκειας", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "Πάντα", + "@videoLoopModeAlways": {}, + "videoControlsPlayOutside": "Άνοιγμα με άλλη εφαρμογή", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (Hybrid)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (Terrain)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyRename": "Μετονομασία", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Αντικατάσταση", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Παράλειψη", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "Ποτέ", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "Μόνο όταν πραγματοποιείται προβολή στοιχείων", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Πάντα", + "@keepScreenOnAlways": {}, + "accessibilityAnimationsRemove": "Απενεργοποίηση εφέ οθόνης", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Διατήρηση εφέ οθόνης", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferHighest": "Υψηλότερος ρυθμός", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Χαμηλότερος ρυθμός", + "@displayRefreshRatePreferLowest": {}, + "videoPlaybackSkip": "Παράλειψη", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Αναπαραγωγή σε σίγαση", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Αναπαραγωγή με ήχο", + "@videoPlaybackWithSound": {}, + "themeBrightnessLight": "Φωτεινό", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Σκούρο", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Μαύρο", + "@themeBrightnessBlack": {}, + "viewerTransitionSlide": "Ολίσθηση", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Παράλλαξη", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "Ξεθώριασμα", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "Μεγέθυνση", + "@viewerTransitionZoomIn": {}, + "viewerTransitionNone": "Καμία", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Αρχική οθόνη", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "Οθόνη κλειδώματος", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Αρχική οθόνη και οθόνη κλειδώματος", + "@wallpaperTargetHomeLock": {}, + "widgetOpenPageHome": "Άνοιγμα αρχικής σελίδας", + "@widgetOpenPageHome": {}, + "widgetOpenPageViewer": "Άνοιγμα προβολέα αρχείων", + "@widgetOpenPageViewer": {}, + "albumTierNew": "Νέα", + "@albumTierNew": {}, + "albumTierPinned": "Καρφιτσωμένα", + "@albumTierPinned": {}, + "albumTierSpecial": "Συστήματος", + "@albumTierSpecial": {}, + "albumTierApps": "Εφαρμογές", + "@albumTierApps": {}, + "albumTierRegular": "Προσωπικά", + "@albumTierRegular": {}, + "storageVolumeDescriptionFallbackPrimary": "Εσωτερικός χώρος αποθήκευσης", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD card/Εξωτερικός χώρος αποθήκευσης", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "Κατάλογος ρίζας", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "«{name}» κατάλογος", + "@otherDirectoryDescription": {}, + "storageAccessDialogMessage": "Παρακαλώ επιλέξτε τον {directory} του «{volume}» στην επόμενη οθόνη για να δώσετε πρόσβαση στην εφαρμογή.", + "@storageAccessDialogMessage": {}, + "restrictedAccessDialogMessage": "Αυτή η εφαρμογή δεν επιτρέπεται να τροποποιεί αρχεία στο {directory} του «{volume}».\n\nΠαρακαλώ χρησιμοποιήστε μια άλλη εφαρμογή διαχείρισης αρχείων ή συλλογή φωτογραφιών για να μετακινήσετε τα στοιχεία αλλού.", + "@restrictedAccessDialogMessage": {}, + "notEnoughSpaceDialogMessage": "Αυτή η λειτουργία χρειάζεται {neededSize} ελεύθερου χώρου στο «{volume}» για να ολοκληρωθεί, αλλά μόνο {freeSize} απομένουν ελεύθερα.", + "@notEnoughSpaceDialogMessage": {}, + "missingSystemFilePickerDialogMessage": "Η εφαρμογή επιλογής αρχείων του δεν βρέθηκε ή είναι απενεργοποιημένη. Ενεργοποιήστε την και δοκιμάστε ξανά.", + "@missingSystemFilePickerDialogMessage": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Αυτή η λειτουργία δεν υποστηρίζεται για το ακόλουθο αρχείο: {types}.} other{Αυτή η λειτουργία δεν υποστηρίζεται για τα ακόλουθα αρχεία: {types}.}}", + "@unsupportedTypeDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "Ορισμένα αρχεία στον φάκελο προορισμού έχουν το ίδιο όνομα.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "Ορισμένα αρχεία έχουν το ίδιο όνομα.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "Ετικέτα συντόμευσης", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "ΠΡΟΣΘΗΚΗ", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "Δεν βρέθηκαν εγκατεστημένες εφαρμογές που μπορούν να το κάνουν αυτό.", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Μετακίνηση αυτού του στοιχείου στον κάδο ανακύκλωσης;} other{Μετακίνηση αυτών των {count} στοιχείων στον κάδο ανακύκλωσης;}}", + "@binEntriesConfirmationDialogMessage": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Διαγραφή αυτού του στοιχείου;} other{Διαγραφή αυτών των {count} στοιχείων;}}", + "@deleteEntriesConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "Αποθήκευση ημερομηνιών στοιχείων πριν συνεχίσετε;", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Αποθήκευση ημερομηνιών", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Συνέχεια αναπαραγωγής από {time}?", + "@videoResumeDialogMessage": {}, + "videoStartOverButtonLabel": "ΑΝΑΠΑΡΑΓΩΓΗ ΑΠΟ ΤΗΝ ΑΡΧΗ", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "ΣΥΝΕΧΙΣΗ ΑΝΑΠΑΡΑΓΩΓΗΣ", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Πιο πρόσφατο στοιχείο", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Αυτόματο", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Προσαρμοσμένο", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "Οι φωτογραφίες και τα βίντεο που ταιριάζουν θα κρυφτούν από τη συλλογή σας. Μπορείτε να τα εμφανίσετε ξανά από τις ρυθμίσεις «Απόρρητο».\n\nΕίστε σίγουροι ότι θέλετε να τα κρύψετε;", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "Νεο αλμπουμ", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Όνομα άλμπουμ", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Η ονομασία υπάρχει ήδη", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Aποθηκευτικός χώρος:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "Νέο όνομα", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Ο κατάλογος υπάρχει ήδη", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Μετονομασια", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "Μοτίβο ονομασίας", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Εισαγωγή πεδίου", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Προεπισκοπηση", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Μετρητής", + "@renameProcessorCounter": {}, + "renameProcessorName": "Όνομα", + "@renameProcessorName": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Διαγράψτε αυτό το άλμπουμ και το αντικείμενο σε αυτό;} other{Διαγράψτε αυτό το άλμπουμ και τα {count} αντικείμενα σε αυτό;}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Διαγράψτε αυτά τα άλμπουμ και τα αντικείμενα σε αυτά;} other{Διαγράψτε αυτά τα άλμπουμ και τα {count} αντικείμενα σε αυτά;}}", + "@deleteMultiAlbumConfirmationDialogMessage": {}, + "exportEntryDialogFormat": "Μορφή:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Πλάτος", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Ύψος", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "Νέο όνομα", + "@renameEntryDialogLabel": {}, + "editEntryDialogTargetFieldsHeader": "Πεδία προς τροποποίηση", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Ημερομηνια & Ώρα", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Ορισμός προσαρμοσμένης ημερομηνίας", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Αντιγραφή από άλλη ημερομηνία", + "@editEntryDateDialogCopyField": {}, + "editEntryDialogCopyFromItem": "Αντιγραφή από άλλο στοιχείο", + "@editEntryDialogCopyFromItem": {}, + "editEntryDateDialogExtractFromTitle": "Εξαγωγή από το όνομα του κάθε αρχείου", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Μετατόπιση", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "Ημερομηνία τροποποίησης αρχείου", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "Ώρες", + "@durationDialogHours": {}, + "durationDialogMinutes": "Λεπτά", + "@durationDialogMinutes": {}, + "editEntryLocationDialogTitle": "Τοποθεσια", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogChooseOnMap": "Επιλογή στο χάρτη", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "Γεωγραφικό πλάτος", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "Γεωγραφικό μήκος", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "Χρησιμοποίηση της τοποθεσίας", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "Βαθμολογια", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Αφαιρεση μεταδεδομενων", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "Περισσότερα", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Απαιτείται XMP για την αναπαραγωγή του βίντεο μέσα σε μια κινούμενη φωτογραφία.\n\nΕίστε βέβαιοι ότι θέλετε να αφαιρεθεί;", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "genericDangerWarningDialogMessage": "Είστε βέβαιοι;", + "@genericDangerWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Ταχύτητα αναπαραγωγής", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "Βίντεο", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Ήχος", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Υπότιτλοι", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "Απενεργοποίηση", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Κομμάτι", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "Δεν υπάρχουν άλλα κομμάτια.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "Ολοκληρώθηκε!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Απέτυχε", + "@genericFailureFeedback": {}, + "menuActionConfigureView": "Προβολή", + "@menuActionConfigureView": {}, + "menuActionSelect": "Επιλογή", + "@menuActionSelect": {}, + "menuActionSelectAll": "Επιλογή όλων", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "Να μην επιλεγεί κανένα", + "@menuActionSelectNone": {}, + "menuActionMap": "Χάρτης", + "@menuActionMap": {}, + "menuActionSlideshow": "Παρουσίαση φωτογραφιών", + "@menuActionSlideshow": {}, + "menuActionStats": "Στατιστικά", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "Ταξινομηση", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "Τμήματα", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Διαταξη", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "Αντίστροφη σειρά ταξινόμησης", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "Ψηφιδωτό", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "Πλέγμα", + "@tileLayoutGrid": {}, + "tileLayoutList": "Λίστα", + "@tileLayoutList": {}, + "coverDialogTabCover": "Εξώφυλλο", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "Εφαρμογή", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Χρώμα", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Επιλογη εφαρμογης", + "@appPickDialogTitle": {}, + "appPickDialogNone": "Καμία επιλογή", + "@appPickDialogNone": {}, + "aboutPageTitle": "Διαφορα", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Άδειες", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Πολιτική Απορρήτου", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Αναφορα σφαλματος", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Αποθήκευση των αρχείων καταγραφής της εφαρμογής σε ένα ξεχωριστό αρχείο", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Αντιγραφή πληροφοριών του συστήματος", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "Αντιγραφή", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "Αναφορά στο GitHub με τα αρχεία καταγραφής και τις πληροφορίες του συστήματος", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "Αναφορά", + "@aboutBugReportButton": {}, + "aboutCreditsSectionTitle": "Αναφορες", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "Αυτή η εφαρμογή χρησιμοποιεί ένα αρχείο TopoJSON από", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "υπό την άδεια ISC.", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Μεταφραστες", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Αδειες ανοιχτου κωδικα", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "Αυτή η εφαρμογή χρησιμοποιεί τα ακόλουθα πακέτα και βιβλιοθήκες ανοιχτού κώδικα.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Βιβλιοθηκες Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Προσθετα Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Πακετα Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Πακετα Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Εμφάνιση όλων των αδειών", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "Πολιτικη απορρητου", + "@policyPageTitle": {}, + "collectionPageTitle": "Συλλογη", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "Διαλεξτε", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "Επιλογη στοιχειων", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Εμφάνιση φίλτρου τίτλου", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Απόκρυψη φίλτρου τίτλου", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Προσθήκη συντόμευσης", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "Καθαρισμός του κάδου ανακύκλωσης", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Αντιγραφή στο άλμπουμ", + "@collectionActionCopy": {}, + "collectionActionMove": "Μετακίνηση στο άλμπουμ", + "@collectionActionMove": {}, + "collectionActionRescan": "Εκ νέου σάρωση", + "@collectionActionRescan": {}, + "collectionActionEdit": "Επεξεργασία", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Αναζήτηση τίτλων", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "Ανά άλμπουμ", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Ανά μήνα", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Ανά ημέρα", + "@collectionGroupDay": {}, + "sectionUnknown": "Χωρίς λεπτομέρειες", + "@sectionUnknown": {}, + "dateToday": "Σήμερα", + "@dateToday": {}, + "dateYesterday": "Εχθές", + "@dateYesterday": {}, + "dateThisMonth": "Αυτό το μήνα", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Αποτυχία διαγραφής του στοιχείου} other{Αποτυχία διαγραφής των {count} στοιχείων}}", + "@collectionDeleteFailureFeedback": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{Αποτυχία αντιγραφής του στοιχείου} other{Αποτυχία αντιγραφής των {count} στοιχείων}}", + "@collectionCopyFailureFeedback": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{Αποτυχία μετακίνησης του στοιχείου} other{Αποτυχία μετακίνησης των {count} στοιχείων}}", + "@collectionMoveFailureFeedback": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{Αποτυχία μετονομασίας του στοιχείου} other{Αποτυχία μετονομασίας των {count} στοιχείων}}", + "@collectionRenameFailureFeedback": {}, + "collectionEditFailureFeedback": "{count, plural, =1{Απέτυχε η επεξεργασία του στοιχείου} other{Απέτυχε η επεξεργασία των {count} στοιχείων}}", + "@collectionEditFailureFeedback": {}, + "collectionExportFailureFeedback": "{count, plural, =1{Απέτυχε η εξαγωγή της σελίδας} other{Απέτυχε η εξαγωγή των {count} σελίδων}}", + "@collectionExportFailureFeedback": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{Αντιγράφηκε το στοιχείο} other{Αντιγράφηκαν τα {count} στοιχεία}}", + "@collectionCopySuccessFeedback": {}, + "collectionMoveSuccessFeedback": "{count, plural, =1{Μετακινήθηκε το στοιχείο} other{Μετακινήθηκαν τα {count} στοιχεία}}", + "@collectionMoveSuccessFeedback": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{Μετονομάστηκε το στοιχείο} other{Μετονομάστηκαν τα {count} στοιχεία}}", + "@collectionRenameSuccessFeedback": {}, + "collectionEditSuccessFeedback": "{count, plural, =1{Επεξεργάστηκε το στοιχείο} other{Επεξεργάστηκαν τα {count} στοιχεία}}", + "@collectionEditSuccessFeedback": {}, + "collectionEmptyFavourites": "Δεν έχουν καταχωρηθεί αγαπημένα στοιχεία", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "Δεν υπάρχουν βίντεο", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "Δεν υπάρχουν εικόνες", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Παραχώρηση πρόσβασης", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Επιλέξτε ενότητα", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Αφαιρέστε ενότητα", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "Διάφορα", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Ρυθμίσεις", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "Όλη η συλλογή", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Αγαπημένα", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Εικόνες", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Βίντεο", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "Κινούμενα", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Φωτογραφίες με κίνηση", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "Πανοραμικές", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Raw φωτογραφίες", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "Βίντεο 360°", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Άλμπουμ", + "@drawerAlbumPage": {}, + "drawerCountryPage": "Χώρες", + "@drawerCountryPage": {}, + "drawerTagPage": "Ετικέτες", + "@drawerTagPage": {}, + "sortByDate": "Ανά ημερομηνία", + "@sortByDate": {}, + "sortByName": "Ανά όνομα", + "@sortByName": {}, + "sortByItemCount": "Ανά μέτρηση στοιχείων", + "@sortByItemCount": {}, + "sortBySize": "Ανά μέγεθος", + "@sortBySize": {}, + "sortByAlbumFileName": "Ανά τίτλο άλμπουμ και αντικειμένου", + "@sortByAlbumFileName": {}, + "sortByRating": "Ανά βαθμολογία", + "@sortByRating": {}, + "sortOrderNewestFirst": "Τα πιο πρόσφατα πρώτα", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Τα παλαιότερα πρώτα", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "Α έως Ω", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Ω έως Α", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "Υψηλότερη βαθμολογία πρώτα", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Χαμηλότερη βαθμολογία πρώτα", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Τα μεγαλύτερα πρώτα", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "Τα μικρότερα πρώτα", + "@sortOrderSmallestFirst": {}, + "albumGroupTier": "Ανά βαθμίδα", + "@albumGroupTier": {}, + "albumGroupType": "Ανά τύπο", + "@albumGroupType": {}, + "albumGroupVolume": "Ανά αποθηκευτική μονάδα", + "@albumGroupVolume": {}, + "albumMimeTypeMixed": "Μικτα", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "Αντιγραφή στο άλμπουμ", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Εξαγωγή στο άλμπουμ", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Μετακίνηση στο άλμπουμ", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "Επιλογή άλμπουμ", + "@albumPickPageTitlePick": {}, + "albumCamera": "Κάμερα", + "@albumCamera": {}, + "albumDownload": "Λήψεις", + "@albumDownload": {}, + "albumScreenshots": "Στιγμιότυπα οθόνης", + "@albumScreenshots": {}, + "albumScreenRecordings": "Εγγραφές οθόνης", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Στιγμιότυπα οθόνης από βίντεο", + "@albumVideoCaptures": {}, + "albumPageTitle": "Άλμπουμ", + "@albumPageTitle": {}, + "albumEmpty": "Δεν υπάρχουν άλμπουμ", + "@albumEmpty": {}, + "createAlbumButtonLabel": "ΔΗΜΙΟΥΡΓΙΑ", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "Νέα", + "@newFilterBanner": {}, + "countryPageTitle": "Χωρες", + "@countryPageTitle": {}, + "countryEmpty": "Δεν έχουν καταχωρηθεί χώρες", + "@countryEmpty": {}, + "tagPageTitle": "Ετικετες", + "@tagPageTitle": {}, + "tagEmpty": "Δεν έχουν καταχωρηθεί ετικέτες", + "@tagEmpty": {}, + "binPageTitle": "Καδος ανακυκλωσης", + "@binPageTitle": {}, + "searchCollectionFieldHint": "Αναζήτηση στην συλλογή", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "Προσφατα", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Ημερομηνια", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "Άλμπουμ", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "Χωρες", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "Μερη", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Ετικετες", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "Βαθμολογιες", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "Μεταδεδομενα", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Ρυθμισεις", + "@settingsPageTitle": {}, + "settingsSystemDefault": "Σύστημα", + "@settingsSystemDefault": {}, + "settingsDefault": "Προεπιλογή", + "@settingsDefault": {}, + "settingsDisabled": "Απενεργοποιημένο", + "@settingsDisabled": {}, + "settingsSearchFieldLabel": "Αναζήτηση ρυθμίσεων", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Δεν υπάρχει αντίστοιχη ρύθμιση", + "@settingsSearchEmpty": {}, + "settingsActionExport": "Εξαγωγή", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "Εξαγωγη", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "Εισαγωγή", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Εισαγωγη", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "Εξώφυλλα", + "@appExportCovers": {}, + "appExportFavourites": "Αγαπημένα", + "@appExportFavourites": {}, + "appExportSettings": "Ρυθμίσεις", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "Πλοηγηση", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Αρχική σελίδα της εφαρμογής", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Αρχικη σελιδα της εφαρμογης", + "@settingsHomeDialogTitle": {}, + "settingsKeepScreenOnTile": "Διατήρηση της οθόνης ενεργοποιημένη", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Διατηρηση της Οθονης Ενεργοποιημενη", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Αγγίξτε το «πίσω» δύο φορές για έξοδο", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "Παράθυρα επιβεβαίωσης", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "Παραθυρα Επιβεβαιωσης", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Ερώτηση πριν διαγραφούν στοιχεία οριστικά", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "Ερώτηση πριν μεταφερθούν στοιχεία στον κάδο ανακύκλωσης", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Ερώτηση πριν μεταφερθούν στοιχεία χωρίς ημερομηνία", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Εμφάνιση μηνύματος μετά τη μεταφορά στοιχείων στον κάδο ανακύκλωσης", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerTile": "Μενού πλοήγησης", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Μενου Πλοηγησης", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "Αγγίξτε παρατεταμένα για να μετακινήσετε και να αναδιατάξετε τα στοιχεία του μενού.", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "Τύποι", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "Άλμπουμ", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Σελίδες", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Προσθήκη άλμπουμ", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "Μικρογραφιες", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "Βοηθητικές πληροφορίες", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Βοηθητικές πληροφοριες", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowFavouriteIcon": "Εμφάνιση εικονιδίου για αγαπημένο", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Εμφάνιση εικονιδίου για ετικέτα", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Εμφάνιση εικονιδίου για τοποθεσία", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Εμφάνιση εικονιδίου για φωτογραφία με κίνηση", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "Εμφάνιση βαθμολογίας", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Εμφάνιση εικονιδίου για raw στοιχεία", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Εμφάνιση διάρκειας βίντεο", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "Γρήγορες ενέργειες", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Γρηγορες Ενεργειες", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Περιήγηση", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Επιλογή", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Αγγίξτε παρατεταμένα για να μετακινήσετε τα κουμπιά και επιλέξτε ποιες ενέργειες θα εμφανίζονται κατά την περιήγηση στοιχείων.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Αγγίξτε παρατεταμένα για να μετακινήσετε τα κουμπιά και επιλέξτε ποιες ενέργειες θα εμφανίζονται κατά την επιλογή στοιχείων.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsViewerSectionTitle": "Προβολη", + "@settingsViewerSectionTitle": {}, + "settingsViewerGestureSideTapNext": "Πατήστε στις άκρες της οθόνης για να εμφανίσετε το προηγούμενο/επόμενο στοιχείο", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerUseCutout": "Χρησιμοποιήστε την περιοχή αποκοπής", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Μέγιστη φωτεινότητα", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Αυτόματη αναπαραγωγή φωτογραφιών κίνησης", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "Φόντο κατά την προβολή στοιχείων", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Γρήγορες ενέργειες", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Γρηγορες Ενεργειες", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "Αγγίξτε παρατεταμένα για να μετακινήσετε τα κουμπιά και επιλέξτε ποιες ενέργειες θα εμφανίζονται κατά την προβολή.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Εμφανιζομενα κουμπια", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Διαθεσιμα κουμπια", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Χωρίς κουμπιά", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "Επικάλυψη", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "Επικαλυψη", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "Εμφάνιση κατά το άνοιγμα", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "Εμφάνιση μικρού χάρτη", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Εμφάνιση πληροφοριών", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "Εμφάνιση ονομασίας, ημερομηνίας, τοποθεσίας κ.λπ.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowShootingDetails": "Εμφάνιση λεπτομερειών λήψης", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowOverlayThumbnails": "Εμφάνιση μικρογραφιών", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "Εφέ θαμπώματος", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "Παρουσίαση φωτογραφιών", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "Παρουσιαση φωτογραφιων", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Επανάληψη", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Τυχαία σειρά", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Χρησιμοποίηση πλήρης οθόνης", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowAnimatedZoomEffect": "Εφέ κινούμενου ζουμ", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "Μετάβαση", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Διάστημα", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "Αναπαραγωγή βίντεο", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Αναπαραγωγη Βιντεο", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "Ρυθμισεις Βιντεο", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Βιντεο", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "Εμφάνιση των βίντεο στη συλλογή", + "@settingsVideoShowVideos": {}, + "settingsVideoEnableHardwareAcceleration": "Επιτάχυνση υλισμικού", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "Αυτόματη αναπαραγωγή κατά το άνοιγμα", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "Επανάληψη αυτόματα στο τέλος κάθε βίντεο", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Επαναληψη Αυτοματα στο Τελος Καθε Βιντεο", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "Υπότιτλοι", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Υποτιτλοι", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Αυτό είναι ένα δείγμα.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "Στοίχιση κειμένου", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Στοιχιση Κειμενου", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Μέγεθος κειμένου", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "Εμφάνιση περιγράμματος και σκιάς", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Χρώμα κειμένου", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Αδιαφάνεια κειμένου", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Χρώμα του φόντου", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Αδιαφάνεια φόντου", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Αριστερά", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Κέντρο", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Δεξιά", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoControlsTile": "Έλεγχος", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "Ελεγχος", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "Κουμπιά", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Αγγίξτε την οθόνη δύο φορές για αναπαραγωγή/παύση", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "Αγγίξτε δύο φορές τις άκρες της οθόνης για να πάτε πίσω/εμπρός", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsPrivacySectionTitle": "Απορρητο", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Να επιτρέπεται η πρόσβαση στον κατάλογο εγκατεστημένων εφαρμογών της συσκευής", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "Χρησιμοποιείται για τη βελτίωση της εμφάνισης των στοιχείων από τα άλμπουμ", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "Να επιτρέπεται η ανώνυμη αναφορά σφαλμάτων", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Αποθήκευση ιστορικού αναζήτησης", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "Χρησιμοποίηση κάδου ανακύκλωσης", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "Διατήρηση των διαγραμμένων στοιχείων για 30 ημέρες", + "@settingsEnableBinSubtitle": {}, + "settingsHiddenItemsTile": "Κρυφά στοιχεία", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Κρυφα Στοιχεια", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "Οι φωτογραφίες και τα βίντεο που είναι κρυφά δεν θα εμφανίζονται στη συλλογή σας.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "Χωρίς κρυφά φίλτρα", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Πρόσβαση στον χώρο αποθήκευσης", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "Προσβαση στον Χωρο Αποθηκευσης", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessBanner": "Ορισμένοι κατάλογοι απαιτούν ρητή άδεια πρόσβασης για την τροποποίηση των αρχείων που βρίσκονται σε αυτούς. Μπορείτε να δείτε εδώ τους καταλόγους στους οποίους έχετε ήδη χορηγήσει πρόσβαση.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Δεν έχει χορηγηθεί πρόσβαση", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Ανάκληση χορήγησης πρόσβασης", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Προσβασιμοτητα", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Κατάργηση κινούμενων εικόνων", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "Καταργηση Κινουμενων Εικονων", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Χρόνος λήψης ενεργειών", + "@settingsTimeToTakeActionTile": {}, + "settingsDisplaySectionTitle": "Οθονη", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Θέμα", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "Θεμα", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "Χρωματιστά εικονίδια", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Έντονο χρώμα", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Εμφάνιση ρυθμού ανανέωσης", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Ρυθμος ανανεωσης", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageSectionTitle": "Γλωσσα & Μορφες", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "Γλώσσα", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "Γλωσσα", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "Μορφή συντεταγμένων", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "Μορφη Συντεταγμενων", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Σύστημα μέτρησης", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "Συστημα μετρησης", + "@settingsUnitSystemDialogTitle": {}, + "settingsScreenSaverPageTitle": "Προφυλαξη οθονης", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "Κορνιζα", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Περίγραμμα", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "Όταν πατάτε στο γραφικό στοιχείο", + "@settingsWidgetOpenPage": {}, + "settingsCollectionTile": "Συλλογή", + "@settingsCollectionTile": {}, + "statsPageTitle": "Στατιστικα", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, =1{1 στοιχείο με τοποθεσία} other{{count} στοιχεία με τοποθεσία}}", + "@statsWithGps": {}, + "statsTopCountriesSectionTitle": "Κορυφαιες Χωρες", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Κορυφαια Μερη", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Κορυφαιες Ετικετες", + "@statsTopTagsSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Κορυφαια Αλμπουμ", + "@statsTopAlbumsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "Άνοιγμα πανοραμικών", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "ΟΡΙΣΜΟΣ ΤΑΠΕΤΣΑΡΙΑΣ", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Ωχ!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "Το αρχείο δεν υπάρχει πλέον.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Πληροφοριες", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "Επιστροφή στην προβολή", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "Άγνωστο", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "Περιγραφή", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Όνομα", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "Ημερομηνία", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "Ανάλυση", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Μέγεθος", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Διαδρομή", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Διάρκεια", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Κάτοχος", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Συντεταγμένες", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Διεύθυνση", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Στυλ χαρτη", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Επιλέξτε στυλ χάρτη", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Μεγέθυνση", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Σμίκρυνση", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Εμφάνιση του βορρά στην κορυφή", + "@mapPointNorthUpTooltip": {}, + "openMapPageTooltip": "Προβολή στη σελίδα του χάρτη", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "Δεν υπάρχουν εικόνες σε αυτήν την περιοχή", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Αποτυχία εξαγωγής ενσωματωμένων δεδομένων", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "Άνοιγμα", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Προβολή του αρχείου XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "Αναζήτηση μεταδεδομένων", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Δεν ταιριάζουν τα κλειδιά", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Ημερομηνία & Ώρα", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Περιγραφή", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Διαστάσεις", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Ανάλυση", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Δικαιώματα", + "@viewerInfoSearchSuggestionRights": {}, + "wallpaperUseScrollEffect": "Εφέ κύλισης στην αρχική οθόνη", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageTitle": "Επεξεργασια Ετικετων", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Νέα ετικέτα", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Προσθήκη ετικέτας", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Πρόσφατα", + "@tagEditorSectionRecent": {}, + "panoramaEnableSensorControl": "Ενεργοποίηση ελέγχου αισθητήρα", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Απενεργοποίηση ελέγχου αισθητήρα", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Πηγη", + "@sourceViewerPageTitle": {}, + "widgetOpenPageCollection": "Ανοιχτή συλλογή", + "@widgetOpenPageCollection": {}, + "durationDialogSeconds": "Δευτερόλεπτα", + "@durationDialogSeconds": {}, + "settingsAllowMediaManagement": "Επιτρέψτε την πλήρη διαχείριση των αρχείων σας", + "@settingsAllowMediaManagement": {}, + "editEntryLocationDialogSetCustom": "Ορισμός προσαρμοσμένης τοποθεσίας", + "@editEntryLocationDialogSetCustom": {}, + "tagPlaceholderCountry": "Χώρα", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "Μέρος", + "@tagPlaceholderPlace": {}, + "settingsWidgetDisplayedItem": "Εμφανιζόμενο αρχείο", + "@settingsWidgetDisplayedItem": {}, + "tagEditorSectionPlaceholders": "Καταχώρηση τοποθεσίας", + "@tagEditorSectionPlaceholders": {}, + "subtitlePositionBottom": "Κάτω", + "@subtitlePositionBottom": {}, + "settingsSubtitleThemeTextPositionTile": "Θέση κειμένου", + "@settingsSubtitleThemeTextPositionTile": {}, + "subtitlePositionTop": "Πάνω", + "@subtitlePositionTop": {}, + "widgetDisplayedItemRandom": "Τυχαίο", + "@widgetDisplayedItemRandom": {}, + "widgetDisplayedItemMostRecent": "Πιο πρόσφατο", + "@widgetDisplayedItemMostRecent": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Θεση κειμενου", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "entryInfoActionExportMetadata": "Εξαγωγή μεταδεδομένων", + "@entryInfoActionExportMetadata": {}, + "columnCount": "{count, plural, =1{{count} στήλη} other{{count} στήλες}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "keepScreenOnVideoPlayback": "Κατά την αναπαραγωγή βίντεο", + "@keepScreenOnVideoPlayback": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Εμφάνιση χειρονομιών πολλαπλής αφής", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "entryActionShareImageOnly": "Κοινοποίηση μόνο την εικόνα", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "Κοινοποίηση μόνο το βίντεο", + "@entryActionShareVideoOnly": {}, + "entryInfoActionRemoveLocation": "Αφαίρεση τοποθεσίας", + "@entryInfoActionRemoveLocation": {}, + "filterAspectRatioLandscapeLabel": "Oριζόντιες εικόνες", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "Κατακόρυφες εικόνες", + "@filterAspectRatioPortraitLabel": {}, + "filterNoAddressLabel": "Χωρίς διεύθυνση", + "@filterNoAddressLabel": {}, + "settingsViewerShowRatingTags": "Εμφάνιση βαθμολογίας & ετικετών", + "@settingsViewerShowRatingTags": {}, + "filterLocatedLabel": "Με τοποθεσία", + "@filterLocatedLabel": {}, + "filterTaggedLabel": "Με ετικέτα", + "@filterTaggedLabel": {}, + "settingsModificationWarningDialogMessage": "Άλλες ρυθμίσεις θα τροποποιηθούν.", + "@settingsModificationWarningDialogMessage": {}, + "settingsDisplayUseTvInterface": "Χρήση του Android TV περιβάλλον", + "@settingsDisplayUseTvInterface": {}, + "settingsViewerShowDescription": "Εμφάνιση περιγραφής", + "@settingsViewerShowDescription": {}, + "chipActionLock": "Κλείδωμα", + "@chipActionLock": {}, + "chipActionCreateVault": "Δημιουργήστε θησαυροφυλάκιο", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "Διαμορφώστε το θησαυροφυλάκιο", + "@chipActionConfigureVault": {}, + "albumTierVaults": "Θησαυροφυλακια", + "@albumTierVaults": {}, + "vaultLockTypePassword": "Κωδικός πρόσβασης", + "@vaultLockTypePassword": {}, + "newVaultDialogTitle": "Νεο Θησαυροφυλακιο", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "Διαμορφωστε το θησαυροφυλακιο", + "@configureVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "Κλείδωμα όταν σβήνει η οθόνη", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "Τύπος κλειδώματος", + "@vaultDialogLockTypeLabel": {}, + "pinDialogConfirm": "Επιβεβαιώστε το PIN", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "Εισάγετε τον κωδικό πρόσβασης", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Επιβεβαιώστε τον κωδικό πρόσβασης", + "@passwordDialogConfirm": {}, + "authenticateToUnlockVault": "Πιστοποίηση ταυτότητας για να ξεκλειδώσετε το θησαυροφυλάκιο", + "@authenticateToUnlockVault": {}, + "settingsConfirmationVaultDataLoss": "Εμφάνιση προειδοποίησης απώλειας δεδομένων θησαυροφυλακίου", + "@settingsConfirmationVaultDataLoss": {}, + "authenticateToConfigureVault": "Πιστοποίηση ταυτότητας για τη διαμόρφωση του θησαυροφυλακίου", + "@authenticateToConfigureVault": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "newVaultWarningDialogMessage": "Τα αρχεία στα θησαυροφυλάκια είναι διαθέσιμα μόνο σε αυτή την εφαρμογή και σε καμία άλλη.\n\nΑν απεγκαταστήσετε την εφαρμογή ή έστω διαγράψετε τα δεδομένα της εφαρμογής, θα χάσετε όλα σας τα κρυφά αρχεία.", + "@newVaultWarningDialogMessage": {}, + "pinDialogEnter": "Εισάγετε το PIN", + "@pinDialogEnter": {}, + "vaultBinUsageDialogMessage": "Ορισμένα θησαυροφυλάκια χρησιμοποιούν τον κάδο ανακύκλωσης.", + "@vaultBinUsageDialogMessage": {}, + "settingsDisablingBinWarningDialogMessage": "Τα αρχεία στον κάδο ανακύκλωσης θα διαγραφούν για πάντα.", + "@settingsDisablingBinWarningDialogMessage": {}, + "tooManyItemsErrorDialogMessage": "Δοκιμάστε ξανά με λιγότερα αρχεία.", + "@tooManyItemsErrorDialogMessage": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Σύρετε προς τα πάνω ή προς τα κάτω για να ρυθμίσετε τη φωτεινότητα/την ένταση του ήχου", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "chipActionGoToPlacePage": "Εμφάνιση στα μέρη", + "@chipActionGoToPlacePage": {}, + "patternDialogConfirm": "Επιβεβαιώστε το μοτίβο", + "@patternDialogConfirm": {}, + "drawerPlacePage": "Μέρη", + "@drawerPlacePage": {}, + "settingsVideoBackgroundMode": "Αναπαραγωγή στο παρασκήνιο", + "@settingsVideoBackgroundMode": {}, + "chipActionShowCountryStates": "Εμφάνιση πολιτειών", + "@chipActionShowCountryStates": {}, + "viewerActionLock": "Κλείδωμα προβολής", + "@viewerActionLock": {}, + "patternDialogEnter": "Εισάγετε το μοτίβο", + "@patternDialogEnter": {}, + "statePageTitle": "Πολιτειες", + "@statePageTitle": {}, + "stateEmpty": "Χωρίς πολιτεία", + "@stateEmpty": {}, + "searchStatesSectionTitle": "Πολιτειες", + "@searchStatesSectionTitle": {}, + "settingsCollectionBurstPatternsTile": "Εμφάνιση μοτίβων", + "@settingsCollectionBurstPatternsTile": {}, + "settingsCollectionBurstPatternsNone": "Χωρίς", + "@settingsCollectionBurstPatternsNone": {}, + "settingsVideoBackgroundModeDialogTitle": "Αναπαραγωγη στο παρασκηνιο", + "@settingsVideoBackgroundModeDialogTitle": {}, + "statsTopStatesSectionTitle": "Κορυφαιες Πολιτειες", + "@statsTopStatesSectionTitle": {}, + "tagPlaceholderState": "Πολιτεία", + "@tagPlaceholderState": {}, + "exportEntryDialogWriteMetadata": "Εγγραφή μεταδεδομένων", + "@exportEntryDialogWriteMetadata": {}, + "placePageTitle": "Μερη", + "@placePageTitle": {}, + "placeEmpty": "Χωρίς μέρος", + "@placeEmpty": {}, + "settingsVideoEnablePip": "Picture-in-picture", + "@settingsVideoEnablePip": {}, + "viewerActionUnlock": "Ξεκλείδωμα προβολής", + "@viewerActionUnlock": {}, + "vaultLockTypePattern": "Μοτίβο", + "@vaultLockTypePattern": {}, + "settingsVideoResumptionModeTile": "Συνέχιση αναπαραγωγής", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoPlaybackPageTitle": "Αναπαραγωγη", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoResumptionModeDialogTitle": "Συνεχιση αναπαραγωγης", + "@settingsVideoResumptionModeDialogTitle": {}, + "tagEditorDiscardDialogMessage": "Θέλετε να απορρίψετε τις αλλαγές;", + "@tagEditorDiscardDialogMessage": {}, + "maxBrightnessNever": "Ποτέ", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "Πάντα", + "@maxBrightnessAlways": {}, + "settingsVideoPlaybackTile": "Αναπαραγωγή", + "@settingsVideoPlaybackTile": {}, + "exportEntryDialogQuality": "Ποιότητα", + "@exportEntryDialogQuality": {}, + "videoResumptionModeNever": "Ποτέ", + "@videoResumptionModeNever": {}, + "videoResumptionModeAlways": "Πάντα", + "@videoResumptionModeAlways": {}, + "settingsAskEverytime": "Ρωτήστε με κάθε φορά", + "@settingsAskEverytime": {}, + "saveCopyButtonLabel": "ΑΠΟΘΗΚΕΥΣΗ ΑΝΤΙΓΡΑΦΟΥ", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Εφαρμογή", + "@applyTooltip": {}, + "editorActionTransform": "Μετατροπή", + "@editorActionTransform": {}, + "editorTransformCrop": "Περικοπή", + "@editorTransformCrop": {}, + "editorTransformRotate": "Περιστροφή", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Ελεύθερη μορφή", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Αρχικό", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Τετράγωνο", + "@cropAspectRatioSquare": {}, + "widgetTapUpdateWidget": "Ενημέρωση γραφικού στοιχείου", + "@widgetTapUpdateWidget": {}, + "overlayHistogramNone": "Τίποτα", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "overlayHistogramLuminance": "Φωτεινότητα", + "@overlayHistogramLuminance": {}, + "chipActionShowCollection": "Εμφάνιση στη Συλλογή", + "@chipActionShowCollection": {}, + "mapAttributionOsmHot": "Πλακάκια από [HOT](https://www.hotosm.org/) • Φιλοξενείται από [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "Πλακάκια από [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "editEntryLocationDialogImportGpx": "Εισαγωγή GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "Χρονική μετατόπιση", + "@editEntryLocationDialogTimeShift": {}, + "aboutDataUsageData": "Δεδομένα", + "@aboutDataUsageData": {}, + "collectionActionAddDynamicAlbum": "Προσθήκη δυναμικού άλμπουμ", + "@collectionActionAddDynamicAlbum": {}, + "collectionActionSetHome": "Ορίστε ως σπίτι", + "@collectionActionSetHome": {}, + "sortByPath": "Από τη διαδρομή", + "@sortByPath": {}, + "explorerPageTitle": "Εξερεύνηση", + "@explorerPageTitle": {}, + "searchFormatSectionTitle": "Μορφές", + "@searchFormatSectionTitle": {}, + "settingsViewerShowHistogram": "Εμφάνιση ιστογράμματος", + "@settingsViewerShowHistogram": {}, + "settingsForceWesternArabicNumeralsTile": "Δύναμη αραβικών αριθμών", + "@settingsForceWesternArabicNumeralsTile": {}, + "mapAttributionOsmData": "Δεδομένα χάρτη © [OpenStreetMap](https://www.openstreetmap.org/copyright) συνεισφέροντες", + "@mapAttributionOsmData": {}, + "mapAttributionOsmLiberty": "Πλακάκια από [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Φιλοξενείται από [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "aboutDataUsageMisc": "Διάφορα στοιχεία", + "@aboutDataUsageMisc": {}, + "selectStorageVolumeDialogTitle": "Επιλέξτε Αποθήκευση", + "@selectStorageVolumeDialogTitle": {}, + "renameProcessorHash": "Κατακερματισμός", + "@renameProcessorHash": {}, + "aboutDataUsageSectionTitle": "Χρήση δεδομένων", + "@aboutDataUsageSectionTitle": {}, + "chipActionDecompose": "Διάσπαση", + "@chipActionDecompose": {}, + "entryActionCast": "Εκτέλεση", + "@entryActionCast": {}, + "videoActionShowPreviousFrame": "Εμφάνιση προηγούμενου καρέ", + "@videoActionShowPreviousFrame": {}, + "videoActionABRepeat": "Επανάληψη A-B", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "Ορισμός έναρξης", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "Ορισμός τέλους", + "@videoRepeatActionSetEnd": {}, + "albumTierDynamic": "Δυναμικό", + "@albumTierDynamic": {}, + "newDynamicAlbumDialogTitle": "Νέο δυναμικό άλμπουμ", + "@newDynamicAlbumDialogTitle": {}, + "dynamicAlbumAlreadyExists": "Το δυναμικό άλμπουμ υπάρχει ήδη", + "@dynamicAlbumAlreadyExists": {}, + "setHomeCustom": "Προσαρμοσμένο", + "@setHomeCustom": {}, + "settingsThumbnailShowHdrIcon": "Εμφάνιση εικονιδίου HDR", + "@settingsThumbnailShowHdrIcon": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "chipActionRemove": "Αφαίρεση", + "@chipActionRemove": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Το άλμπουμ υπάρχει ήδη", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "explorerActionSelectStorageVolume": "Επιλέξτε αποθηκευτικό χώρο", + "@explorerActionSelectStorageVolume": {}, + "removeEntryMetadataDialogAll": "Όλα", + "@removeEntryMetadataDialogAll": {}, + "aboutDataUsageCache": "Κρυφή μνήμη", + "@aboutDataUsageCache": {}, + "castDialogTitle": "Συσκευές Απεικόνισης", + "@castDialogTitle": {}, + "aboutDataUsageDatabase": "Βάση δεδομένων", + "@aboutDataUsageDatabase": {}, + "sortByDuration": "Με διάρκεια", + "@sortByDuration": {}, + "appExportDynamicAlbums": "Δυναμικά άλμπουμ", + "@appExportDynamicAlbums": {}, + "mapStyleOsmLiberty": "OSM Ελευθερία", + "@mapStyleOsmLiberty": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "aboutDataUsageInternal": "Εσωτερικά", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "Εξωτερικά", + "@aboutDataUsageExternal": {}, + "aboutDataUsageClearCache": "Εκκαθάριση μνήμης", + "@aboutDataUsageClearCache": {}, + "videoActionShowNextFrame": "Εμφάνιση επόμενου καρέ", + "@videoActionShowNextFrame": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Πλακάκια από [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "sortOrderShortestFirst": "Ο συντομότερος πρώτος", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "Μακρύτερο πρώτο", + "@sortOrderLongestFirst": {}, + "stopTooltip": "Σταμάτησε", + "@stopTooltip": {}, + "chipActionGoToExplorerPage": "Εμφάνιση στην Εξερεύνηση", + "@chipActionGoToExplorerPage": {}, + "chipActionCreateGroup": "Δημιουργία ομάδας", + "@chipActionCreateGroup": {}, + "newGroupDialogNameLabel": "Όνομα ομάδας", + "@newGroupDialogNameLabel": {}, + "groupPickerUseThisGroupButton": "Χρησιμοποιήστε αυτή την ομάδα", + "@groupPickerUseThisGroupButton": {}, + "sectionNone": "Όχι τμήματα", + "@sectionNone": {}, + "createButtonLabel": "ΔΗΜΙΟΥΡΓΙΑ", + "@createButtonLabel": {}, + "chipActionGroup": "Αλλαγή ομαδοποίησης", + "@chipActionGroup": {}, + "albumTierGroups": "Ομάδες", + "@albumTierGroups": {}, + "newGroupDialogTitle": "Νέα Ομάδα", + "@newGroupDialogTitle": {}, + "groupAlreadyExists": "Η ομάδα υπάρχει ήδη", + "@groupAlreadyExists": {}, + "groupEmpty": "Όχι ομάδες", + "@groupEmpty": {}, + "ungrouped": "Μη ομαδοποιημένο", + "@ungrouped": {}, + "groupPickerTitle": "Επιλογή ομάδας", + "@groupPickerTitle": {}, + "tagPickPageTitle": "Επιλογή ετικέτας", + "@tagPickPageTitle": {}, + "settingsNavigationBottomActionsTile": "Κάτω πλοήγηση", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Κάτω Πλοήγηση", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Πατήστε και κρατήστε πατημένο για να μετακινήσετε τα κουμπιά και να επιλέξετε ποιες ενέργειες θα εμφανίζονται στην κάτω γραμμή πλοήγησης.", + "@settingsNavigationBottomActionEditorBanner": {}, + "settingsViewerShowZoomLevel": "Εμφάνιση επιπέδου μεγέθυνσης", + "@settingsViewerShowZoomLevel": {}, + "mapStyleDialogAddStyle": "Προσθέστε στυλ", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogName": "Όνομα", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogUserAgent": "Πρόγραμμα-χρήστη", + "@mapStyleEditorDialogUserAgent": {} +} diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb new file mode 100644 index 0000000..403ab85 --- /dev/null +++ b/lib/l10n/app_en.arb @@ -0,0 +1,1128 @@ +{ + "appName": "Aves", + "welcomeMessage": "Welcome to Aves", + "welcomeOptional": "Optional", + "welcomeTermsToggle": "I agree to the terms and conditions", + "itemCount": "{count, plural, =1{{count} item} other{{count} items}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "columnCount": "{count, plural, =1{{count} column} other{{count} columns}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + + "timeSeconds": "{count, plural, =1{{count} second} other{{count} seconds}}", + "@timeSeconds": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeMinutes": "{count, plural, =1{{count} minute} other{{count} minutes}}", + "@timeMinutes": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeDays": "{count, plural, =1{{count} day} other{{count} days}}", + "@timeDays": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + + "applyButtonLabel": "APPLY", + "createButtonLabel": "CREATE", + "deleteButtonLabel": "DELETE", + "nextButtonLabel": "NEXT", + "showButtonLabel": "SHOW", + "hideButtonLabel": "HIDE", + "continueButtonLabel": "CONTINUE", + "saveCopyButtonLabel": "SAVE COPY", + + "applyTooltip": "Apply", + "cancelTooltip": "Cancel", + "changeTooltip": "Change", + "clearTooltip": "Clear", + "previousTooltip": "Previous", + "nextTooltip": "Next", + "showTooltip": "Show", + "hideTooltip": "Hide", + "actionRemove": "Remove", + "resetTooltip": "Reset", + "saveTooltip": "Save", + "stopTooltip": "Stop", + "pickTooltip": "Pick", + + "doubleBackExitMessage": "Tap “back” again to exit.", + "doNotAskAgain": "Do not ask again", + + "sourceStateLoading": "Loading", + "sourceStateCataloguing": "Cataloguing", + "sourceStateLocatingCountries": "Locating countries", + "sourceStateLocatingPlaces": "Locating places", + + "chipActionDelete": "Delete", + "chipActionRemove": "Remove", + "chipActionShowCollection": "Show in Collection", + "chipActionGoToAlbumPage": "Show in Albums", + "chipActionGoToCountryPage": "Show in Countries", + "chipActionGoToPlacePage": "Show in Places", + "chipActionGoToTagPage": "Show in Tags", + "chipActionGoToExplorerPage": "Show in Explorer", + "chipActionDecompose": "Split", + "chipActionFilterOut": "Filter out", + "chipActionFilterIn": "Filter in", + "chipActionHide": "Hide", + "chipActionLock": "Lock", + "chipActionPin": "Pin to top", + "chipActionUnpin": "Unpin from top", + "chipActionGroup": "Change grouping", + "chipActionRename": "Rename", + "chipActionSetCover": "Set cover", + "chipActionShowCountryStates": "Show states", + "chipActionCreateGroup": "Create group", + "chipActionCreateAlbum": "Create album", + "chipActionCreateVault": "Create vault", + "chipActionConfigureVault": "Configure vault", + + "entryActionCopyToClipboard": "Copy to clipboard", + "entryActionDelete": "Delete", + "entryActionConvert": "Convert", + "entryActionExport": "Export", + "entryActionInfo": "Info", + "entryActionRename": "Rename", + "entryActionRestore": "Restore", + "entryActionRotateCCW": "Rotate counterclockwise", + "entryActionRotateCW": "Rotate clockwise", + "entryActionFlip": "Flip horizontally", + "entryActionPrint": "Print", + "entryActionShare": "Share", + "entryActionShareImageOnly": "Share image only", + "entryActionShareVideoOnly": "Share video only", + "entryActionViewSource": "View source", + "entryActionShowGeoTiffOnMap": "Show as map overlay", + "entryActionConvertMotionPhotoToStillImage": "Convert to still image", + "entryActionViewMotionPhotoVideo": "Open video", + "entryActionEdit": "Edit", + "entryActionOpen": "Open with", + "entryActionSetAs": "Set as", + "entryActionCast": "Cast", + "entryActionOpenMap": "Show in map app", + "entryActionRotateScreen": "Rotate screen", + "entryActionAddFavourite": "Add to favorites", + "entryActionRemoveFavourite": "Remove from favorites", + + "videoActionCaptureFrame": "Capture frame", + "videoActionMute": "Mute", + "videoActionUnmute": "Unmute", + "videoActionPause": "Pause", + "videoActionPlay": "Play", + "videoActionReplay10": "Seek backward 10 seconds", + "videoActionSkip10": "Seek forward 10 seconds", + "videoActionShowPreviousFrame": "Show previous frame", + "videoActionShowNextFrame": "Show next frame", + "videoActionSelectStreams": "Select tracks", + "videoActionSetSpeed": "Playback speed", + "videoActionABRepeat": "A-B repeat", + + "videoRepeatActionSetStart": "Set start", + "videoRepeatActionSetEnd": "Set end", + + "viewerActionSettings": "Settings", + "viewerActionLock": "Lock viewer", + "viewerActionUnlock": "Unlock viewer", + + "slideshowActionResume": "Resume", + "slideshowActionShowInCollection": "Show in Collection", + + "entryInfoActionEditDate": "Edit date & time", + "entryInfoActionEditLocation": "Edit location", + "entryInfoActionEditTitleDescription": "Edit title & description", + "entryInfoActionEditRating": "Edit rating", + "entryInfoActionEditTags": "Edit tags", + "entryInfoActionRemoveMetadata": "Remove metadata", + "entryInfoActionExportMetadata": "Export metadata", + "entryInfoActionRemoveLocation": "Remove location", + + "editorActionTransform": "Transform", + + "editorTransformCrop": "Crop", + "editorTransformRotate": "Rotate", + + "cropAspectRatioFree": "Free", + "cropAspectRatioOriginal": "Original", + "cropAspectRatioSquare": "Square", + + "filterAspectRatioLandscapeLabel": "Landscape", + "filterAspectRatioPortraitLabel": "Portrait", + "filterBinLabel": "Recycle bin", + "filterFavouriteLabel": "Favorite", + "filterNoDateLabel": "Undated", + "filterNoAddressLabel": "No address", + "filterLocatedLabel": "Located", + "filterNoLocationLabel": "Unlocated", + "filterNoRatingLabel": "Unrated", + "filterTaggedLabel": "Tagged", + "filterNoTagLabel": "Untagged", + "filterNoTitleLabel": "Untitled", + "filterOnThisDayLabel": "On this day", + "filterRecentlyAddedLabel": "Recently added", + "filterRatingRejectedLabel": "Rejected", + "filterTypeAnimatedLabel": "Animated", + "filterTypeMotionPhotoLabel": "Motion Photo", + "filterTypePanoramaLabel": "Panorama", + "filterTypeRawLabel": "Raw", + "filterTypeSphericalVideoLabel": "360° Video", + "filterTypeGeotiffLabel": "GeoTIFF", + "filterMimeImageLabel": "Image", + "filterMimeVideoLabel": "Video", + + "accessibilityAnimationsRemove": "Prevent screen effects", + "accessibilityAnimationsKeep": "Keep screen effects", + + "albumTierNew": "New", + "albumTierPinned": "Pinned", + "albumTierGroups": "Groups", + "albumTierSpecial": "Common", + "albumTierApps": "Apps", + "albumTierVaults": "Vaults", + "albumTierDynamic": "Dynamic", + "albumTierRegular": "Others", + + "coordinateFormatDms": "DMS", + "coordinateFormatDdm": "DDM", + "coordinateFormatDecimal": "Decimal degrees", + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsNorth": "N", + "coordinateDmsSouth": "S", + "coordinateDmsEast": "E", + "coordinateDmsWest": "W", + + "displayRefreshRatePreferHighest": "Highest rate", + "displayRefreshRatePreferLowest": "Lowest rate", + + "keepScreenOnNever": "Never", + "keepScreenOnVideoPlayback": "During video playback", + "keepScreenOnViewerOnly": "Viewer page only", + "keepScreenOnAlways": "Always", + + "lengthUnitPixel": "px", + "lengthUnitPercent": "%", + + "mapStyleGoogleNormal": "Google Maps", + "mapStyleGoogleHybrid": "Google Maps (Hybrid)", + "mapStyleGoogleTerrain": "Google Maps (Terrain)", + "mapStyleOsmLiberty": "OSM Liberty", + "mapStyleOpenTopoMap": "OpenTopoMap", + "mapStyleOsmHot": "Humanitarian OSM", + "mapStyleStamenWatercolor": "Stamen Watercolor", + + "maxBrightnessNever": "Never", + "maxBrightnessAlways": "Always", + + "nameConflictStrategyRename": "Rename", + "nameConflictStrategyReplace": "Replace", + "nameConflictStrategySkip": "Skip", + + "overlayHistogramNone": "None", + "overlayHistogramRGB": "RGB", + "overlayHistogramLuminance": "Luminance", + + "subtitlePositionTop": "Top", + "subtitlePositionBottom": "Bottom", + + "themeBrightnessLight": "Light", + "themeBrightnessDark": "Dark", + "themeBrightnessBlack": "Black", + + "unitSystemMetric": "Metric", + "unitSystemImperial": "Imperial", + + "vaultLockTypePattern": "Pattern", + "vaultLockTypePin": "PIN", + "vaultLockTypePassword": "Password", + + "settingsVideoEnablePip": "Picture-in-picture", + + "videoControlsPlayOutside": "Open with other player", + + "videoLoopModeNever": "Never", + "videoLoopModeShortOnly": "Short videos only", + "videoLoopModeAlways": "Always", + + "videoPlaybackSkip": "Skip", + "videoPlaybackMuted": "Play muted", + "videoPlaybackWithSound": "Play with sound", + + "videoResumptionModeNever": "Never", + "videoResumptionModeAlways": "Always", + + "viewerTransitionSlide": "Slide", + "viewerTransitionParallax": "Parallax", + "viewerTransitionFade": "Fade", + "viewerTransitionZoomIn": "Zoom in", + "viewerTransitionNone": "None", + + "wallpaperTargetHome": "Home screen", + "wallpaperTargetLock": "Lock screen", + "wallpaperTargetHomeLock": "Home and lock screens", + + "widgetDisplayedItemRandom": "Random", + "widgetDisplayedItemMostRecent": "Most recent", + + "widgetOpenPageHome": "Open home", + "widgetOpenPageCollection": "Open collection", + "widgetOpenPageViewer": "Open viewer", + "widgetTapUpdateWidget": "Update widget", + + "storageVolumeDescriptionFallbackPrimary": "Internal storage", + "storageVolumeDescriptionFallbackNonPrimary": "SD card", + "rootDirectoryDescription": "root directory", + "otherDirectoryDescription": "“{name}” directory", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "storageAccessDialogMessage": "Please select the {directory} of “{volume}” in the next screen to give this app access to it.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "restrictedAccessDialogMessage": "This app is not allowed to modify files in the {directory} of “{volume}”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "notEnoughSpaceDialogMessage": "This operation needs {neededSize} of free space on “{volume}” to complete, but there is only {freeSize} left.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "missingSystemFilePickerDialogMessage": "The system file picker is missing or disabled. Please enable it and try again.", + + "unsupportedTypeDialogMessage": "{count, plural, =1{This operation is not supported for items of the following type: {types}.} other{This operation is not supported for items of the following types: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + + "nameConflictDialogSingleSourceMessage": "Some files in the destination folder have the same name.", + "nameConflictDialogMultipleSourceMessage": "Some files have the same name.", + + "addShortcutDialogLabel": "Shortcut label", + "addShortcutButtonLabel": "ADD", + + "noMatchingAppDialogMessage": "There are no apps that can handle this.", + + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Move this item to the recycle bin?} other{Move these {count} items to the recycle bin?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Delete this item?} other{Delete these {count} items?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "moveUndatedConfirmationDialogMessage": "Save item dates before proceeding?", + "moveUndatedConfirmationDialogSetDate": "Save dates", + + "videoResumeDialogMessage": "Do you want to resume playing at {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "videoStartOverButtonLabel": "START OVER", + "videoResumeButtonLabel": "RESUME", + + "setCoverDialogLatest": "Latest item", + "setCoverDialogAuto": "Auto", + "setCoverDialogCustom": "Custom", + + "hideFilterConfirmationDialogMessage": "Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?", + + "newAlbumDialogTitle": "New Album", + "newAlbumDialogNameLabel": "Album name", + "newAlbumDialogAlbumAlreadyExistsHelper": "Album already exists", + "newAlbumDialogNameLabelAlreadyExistsHelper": "Directory already exists", + "newAlbumDialogStorageLabel": "Storage:", + + "newDynamicAlbumDialogTitle": "New Dynamic Album", + "dynamicAlbumAlreadyExists": "Dynamic album already exists", + + "newGroupDialogTitle": "New Group", + "newGroupDialogNameLabel": "Group name", + "groupAlreadyExists": "Group already exists", + "groupEmpty": "No groups", + "ungrouped": "Ungrouped", + "groupPickerTitle": "Pick Group", + "groupPickerUseThisGroupButton": "Use this group", + + "newVaultWarningDialogMessage": "Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.", + "newVaultDialogTitle": "New Vault", + "configureVaultDialogTitle": "Configure Vault", + "vaultDialogLockModeWhenScreenOff": "Lock when screen turns off", + "vaultDialogLockTypeLabel": "Lock type", + + "patternDialogEnter": "Enter pattern", + "patternDialogConfirm": "Confirm pattern", + + "pinDialogEnter": "Enter PIN", + "pinDialogConfirm": "Confirm PIN", + + "passwordDialogEnter": "Enter password", + "passwordDialogConfirm": "Confirm password", + + "authenticateToConfigureVault": "Authenticate to configure vault", + "authenticateToUnlockVault": "Authenticate to unlock vault", + + "vaultBinUsageDialogMessage": "Some vaults are using the recycle bin.", + + "renameAlbumDialogLabel": "New name", + "renameAlbumDialogLabelAlreadyExistsHelper": "Directory already exists", + + "renameEntrySetPageTitle": "Rename", + "renameEntrySetPagePatternFieldLabel": "Naming pattern", + "renameEntrySetPageInsertTooltip": "Insert field", + "renameEntrySetPagePreviewSectionTitle": "Preview", + + "renameProcessorCounter": "Counter", + "renameProcessorHash": "Hash", + "renameProcessorName": "Name", + + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Delete this album and the item in it?} other{Delete this album and the {count} items in it?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Delete these albums and the item in them?} other{Delete these albums and the {count} items in them?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + + "exportEntryDialogFormat": "Format:", + "exportEntryDialogWidth": "Width", + "exportEntryDialogHeight": "Height", + "exportEntryDialogQuality": "Quality", + "exportEntryDialogWriteMetadata": "Write metadata", + + "renameEntryDialogLabel": "New name", + + "editEntryDialogCopyFromItem": "Copy from other item", + "editEntryDialogTargetFieldsHeader": "Fields to modify", + + "editEntryDateDialogTitle": "Date & Time", + "editEntryDateDialogSetCustom": "Set custom date", + "editEntryDateDialogCopyField": "Copy from other date", + "editEntryDateDialogExtractFromTitle": "Extract from title", + "editEntryDateDialogShift": "Shift", + "editEntryDateDialogSourceFileModifiedDate": "File modified date", + + "durationDialogHours": "Hours", + "durationDialogMinutes": "Minutes", + "durationDialogSeconds": "Seconds", + + "editEntryLocationDialogTitle": "Location", + "editEntryLocationDialogSetCustom": "Set custom location", + "editEntryLocationDialogChooseOnMap": "Choose on map", + "editEntryLocationDialogImportGpx": "Import GPX", + "editEntryLocationDialogLatitude": "Latitude", + "editEntryLocationDialogLongitude": "Longitude", + "editEntryLocationDialogTimeShift": "Time shift", + + "locationPickerUseThisLocationButton": "Use this location", + + "editEntryRatingDialogTitle": "Rating", + + "removeEntryMetadataDialogTitle": "Metadata Removal", + "removeEntryMetadataDialogAll": "All", + "removeEntryMetadataDialogMore": "More", + + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?", + + "videoSpeedDialogLabel": "Playback speed", + + "videoStreamSelectionDialogVideo": "Video", + "videoStreamSelectionDialogAudio": "Audio", + "videoStreamSelectionDialogText": "Subtitles", + "videoStreamSelectionDialogOff": "Off", + "videoStreamSelectionDialogTrack": "Track", + "videoStreamSelectionDialogNoSelection": "There are no other tracks.", + + "genericSuccessFeedback": "Done!", + "genericFailureFeedback": "Failed", + "genericDangerWarningDialogMessage": "Are you sure?", + + "tooManyItemsErrorDialogMessage": "Try again with fewer items.", + + "menuActionConfigureView": "View", + "menuActionSelect": "Select", + "menuActionSelectAll": "Select all", + "menuActionSelectNone": "Select none", + "menuActionMap": "Map", + "menuActionSlideshow": "Slideshow", + "menuActionStats": "Stats", + + "viewDialogSortSectionTitle": "Sort", + "viewDialogGroupSectionTitle": "Sections", + "viewDialogLayoutSectionTitle": "Layout", + "viewDialogReverseSortOrder": "Reverse sort order", + + "tileLayoutMosaic": "Mosaic", + "tileLayoutGrid": "Grid", + "tileLayoutList": "List", + + "castDialogTitle": "Cast Devices", + + "coverDialogTabCover": "Cover", + "coverDialogTabApp": "App", + "coverDialogTabColor": "Color", + + "appPickDialogTitle": "Pick App", + "appPickDialogNone": "None", + + "aboutPageTitle": "About", + "aboutLinkLicense": "License", + "aboutLinkPolicy": "Privacy Policy", + + "aboutBugSectionTitle": "Bug Report", + "aboutBugSaveLogInstruction": "Save app logs to a file", + "aboutBugCopyInfoInstruction": "Copy system information", + "aboutBugCopyInfoButton": "Copy", + "aboutBugReportInstruction": "Report on GitHub with the logs and system information", + "aboutBugReportButton": "Report", + + "aboutDataUsageSectionTitle": "Data Usage", + "aboutDataUsageData": "Data", + "aboutDataUsageCache": "Cache", + "aboutDataUsageDatabase": "Database", + "aboutDataUsageMisc": "Misc", + "aboutDataUsageInternal": "Internal", + "aboutDataUsageExternal": "External", + "aboutDataUsageClearCache": "Clear Cache", + + "aboutCreditsSectionTitle": "Credits", + "aboutCreditsWorldAtlas1": "This app uses a TopoJSON file from", + "aboutCreditsWorldAtlas2": "under ISC License.", + "aboutTranslatorsSectionTitle": "Translators", + + "aboutLicensesSectionTitle": "Open-Source Licenses", + "aboutLicensesBanner": "This app uses the following open-source packages and libraries.", + "aboutLicensesAndroidLibrariesSectionTitle": "Android Libraries", + "aboutLicensesFlutterPluginsSectionTitle": "Flutter Plugins", + "aboutLicensesFlutterPackagesSectionTitle": "Flutter Packages", + "aboutLicensesDartPackagesSectionTitle": "Dart Packages", + "aboutLicensesShowAllButtonLabel": "Show All Licenses", + + "policyPageTitle": "Privacy Policy", + + "collectionPageTitle": "Collection", + "collectionPickPageTitle": "Pick", + "collectionSelectPageTitle": "Select items", + + "collectionActionShowTitleSearch": "Show title filter", + "collectionActionHideTitleSearch": "Hide title filter", + "collectionActionAddDynamicAlbum": "Add dynamic album", + "collectionActionAddShortcut": "Add shortcut", + "collectionActionSetHome": "Set as home", + "collectionActionEmptyBin": "Empty bin", + "collectionActionCopy": "Copy to album", + "collectionActionMove": "Move to album", + "collectionActionRescan": "Rescan", + "collectionActionEdit": "Edit", + + "collectionSearchTitlesHintText": "Search titles", + + "collectionGroupAlbum": "By album", + "collectionGroupMonth": "By month", + "collectionGroupDay": "By day", + + "sectionNone": "No sections", + "sectionUnknown": "Unknown", + "dateToday": "Today", + "dateYesterday": "Yesterday", + "dateThisMonth": "This month", + "collectionDeleteFailureFeedback": "{count, plural, =1{Failed to delete 1 item} other{Failed to delete {count} items}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionCopyFailureFeedback": "{count, plural, =1{Failed to copy 1 item} other{Failed to copy {count} items}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{Failed to move 1 item} other{Failed to move {count} items}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionRenameFailureFeedback": "{count, plural, =1{Failed to rename 1 item} other{Failed to rename {count} items}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{Failed to edit 1 item} other{Failed to edit {count} items}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{Failed to export 1 page} other{Failed to export {count} pages}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, =1{Copied 1 item} other{Copied {count} items}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{Moved 1 item} other{Moved {count} items}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{Renamed 1 item} other{Renamed {count} items}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{Edited 1 item} other{Edited {count} items}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + + "collectionEmptyFavourites": "No favorites", + "collectionEmptyVideos": "No videos", + "collectionEmptyImages": "No images", + "collectionEmptyGrantAccessButtonLabel": "Grant access", + + "collectionSelectSectionTooltip": "Select section", + "collectionDeselectSectionTooltip": "Deselect section", + + "drawerAboutButton": "About", + "drawerSettingsButton": "Settings", + "drawerCollectionAll": "All collection", + "drawerCollectionFavourites": "Favorites", + "drawerCollectionImages": "Images", + "drawerCollectionVideos": "Videos", + "drawerCollectionAnimated": "Animated", + "drawerCollectionMotionPhotos": "Motion photos", + "drawerCollectionPanoramas": "Panoramas", + "drawerCollectionRaws": "Raw photos", + "drawerCollectionSphericalVideos": "360° Videos", + "drawerAlbumPage": "Albums", + "drawerCountryPage": "Countries", + "drawerPlacePage": "Places", + "drawerTagPage": "Tags", + + "sortByDate": "By date", + "sortByName": "By name", + "sortByItemCount": "By item count", + "sortBySize": "By size", + "sortByAlbumFileName": "By album & item title", + "sortByRating": "By rating", + "sortByDuration": "By duration", + "sortByPath": "By path", + + "sortOrderNewestFirst": "Newest first", + "sortOrderOldestFirst": "Oldest first", + "sortOrderAtoZ": "A to Z", + "sortOrderZtoA": "Z to A", + "sortOrderHighestFirst": "Highest first", + "sortOrderLowestFirst": "Lowest first", + "sortOrderLargestFirst": "Largest first", + "sortOrderSmallestFirst": "Smallest first", + "sortOrderShortestFirst": "Shortest first", + "sortOrderLongestFirst": "Longest first", + + "albumGroupTier": "By tier", + "albumGroupType": "By type", + "albumGroupVolume": "By storage volume", + + "albumMimeTypeMixed": "Mixed", + + "albumPickPageTitleCopy": "Copy to Album", + "albumPickPageTitleExport": "Export to Album", + "albumPickPageTitleMove": "Move to Album", + "albumPickPageTitlePick": "Pick Album", + + "albumCamera": "Camera", + "albumDownload": "Download", + "albumScreenshots": "Screenshots", + "albumScreenRecordings": "Screen recordings", + "albumVideoCaptures": "Video Captures", + + "albumPageTitle": "Albums", + "albumEmpty": "No albums", + "createAlbumButtonLabel": "CREATE", + "newFilterBanner": "new", + + "countryPageTitle": "Countries", + "countryEmpty": "No countries", + + "statePageTitle": "States", + "stateEmpty": "No states", + + "placePageTitle": "Places", + "placeEmpty": "No places", + + "tagPageTitle": "Tags", + "tagEmpty": "No tags", + "tagPickPageTitle": "Pick Tag", + + "binPageTitle": "Recycle Bin", + + "explorerPageTitle": "Explorer", + "explorerActionSelectStorageVolume": "Select storage", + + "selectStorageVolumeDialogTitle": "Select Storage", + + "searchCollectionFieldHint": "Search collection", + "searchRecentSectionTitle": "Recent", + "searchDateSectionTitle": "Date", + "searchFormatSectionTitle": "Formats", + "searchAlbumsSectionTitle": "Albums", + "searchCountriesSectionTitle": "Countries", + "searchStatesSectionTitle": "States", + "searchPlacesSectionTitle": "Places", + "searchTagsSectionTitle": "Tags", + "searchRatingSectionTitle": "Ratings", + "searchMetadataSectionTitle": "Metadata", + + "settingsPageTitle": "Settings", + "settingsSystemDefault": "System default", + "settingsDefault": "Default", + "settingsDisabled": "Disabled", + "settingsEnabled": "Enabled", + "settingsForced": "Forced", + "settingsAskEverytime": "Ask everytime", + "settingsModificationWarningDialogMessage": "Other settings will be modified.", + + "settingsSearchFieldLabel": "Search settings", + "settingsSearchEmpty": "No matching setting", + "settingsActionExport": "Export", + "settingsActionExportDialogTitle": "Export", + "settingsActionImport": "Import", + "settingsActionImportDialogTitle": "Import", + + "appExportCovers": "Covers", + "appExportDynamicAlbums": "Dynamic albums", + "appExportFavourites": "Favorites", + "appExportSettings": "Settings", + + "settingsNavigationSectionTitle": "Navigation", + "settingsHomeTile": "Home", + "settingsHomeDialogTitle": "Home", + "setHomeCustom": "Custom", + "settingsKeepScreenOnTile": "Keep screen on", + "settingsKeepScreenOnDialogTitle": "Keep Screen On", + "settingsDoubleBackExit": "Tap “back” twice to exit", + + "settingsConfirmationTile": "Confirmation dialogs", + "settingsConfirmationDialogTitle": "Confirmation Dialogs", + "settingsConfirmationBeforeDeleteItems": "Ask before deleting items forever", + "settingsConfirmationBeforeMoveToBinItems": "Ask before moving items to the recycle bin", + "settingsConfirmationBeforeMoveUndatedItems": "Ask before moving undated items", + "settingsConfirmationAfterMoveToBinItems": "Show message after moving items to the recycle bin", + "settingsConfirmationVaultDataLoss": "Show vault data loss warning", + + "settingsNavigationDrawerTile": "Navigation menu", + "settingsNavigationDrawerEditorPageTitle": "Navigation Menu", + "settingsNavigationDrawerBanner": "Touch and hold to move and reorder menu items.", + "settingsNavigationDrawerTabTypes": "Types", + "settingsNavigationDrawerTabAlbums": "Albums", + "settingsNavigationDrawerTabPages": "Pages", + "settingsNavigationDrawerAddAlbum": "Add album", + + "settingsNavigationBottomActionsTile": "Bottom navigation", + "settingsNavigationBottomActionEditorPageTitle": "Bottom Navigation", + "settingsNavigationBottomActionEditorBanner": "Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.", + + "settingsThumbnailSectionTitle": "Thumbnails", + "settingsThumbnailOverlayTile": "Overlay", + "settingsThumbnailOverlayPageTitle": "Overlay", + "settingsThumbnailShowHdrIcon": "Show HDR icon", + "settingsThumbnailShowFavouriteIcon": "Show favorite icon", + "settingsThumbnailShowTagIcon": "Show tag icon", + "settingsThumbnailShowLocationIcon": "Show location icon", + "settingsThumbnailShowMotionPhotoIcon": "Show motion photo icon", + "settingsThumbnailShowRating": "Show rating", + "settingsThumbnailShowRawIcon": "Show raw icon", + "settingsThumbnailShowVideoDuration": "Show video duration", + + "settingsCollectionQuickActionsTile": "Quick actions", + "settingsCollectionQuickActionEditorPageTitle": "Quick Actions", + "settingsCollectionQuickActionTabBrowsing": "Browsing", + "settingsCollectionQuickActionTabSelecting": "Selecting", + "settingsCollectionBrowsingQuickActionEditorBanner": "Touch and hold to move buttons and select which actions are displayed when browsing items.", + "settingsCollectionSelectionQuickActionEditorBanner": "Touch and hold to move buttons and select which actions are displayed when selecting items.", + + "settingsCollectionBurstPatternsTile": "Burst patterns", + "settingsCollectionBurstPatternsNone": "None", + + "settingsViewerSectionTitle": "Viewer", + "settingsViewerGestureSideTapNext": "Tap on screen edges to show previous/next item", + "settingsViewerUseCutout": "Use cutout area", + "settingsViewerMaximumBrightness": "Maximum brightness", + "settingsMotionPhotoAutoPlay": "Auto play motion photos", + "settingsImageBackground": "Image background", + + "settingsViewerQuickActionsTile": "Quick actions", + "settingsViewerQuickActionEditorPageTitle": "Quick Actions", + "settingsViewerQuickActionEditorBanner": "Touch and hold to move buttons and select which actions are displayed in the viewer.", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Displayed Buttons", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Available Buttons", + "settingsViewerQuickActionEmpty": "No buttons", + + "settingsViewerOverlayTile": "Overlay", + "settingsViewerOverlayPageTitle": "Overlay", + "settingsViewerShowOverlayOnOpening": "Show on opening", + "settingsViewerShowHistogram": "Show histogram", + "settingsViewerShowMinimap": "Show minimap", + "settingsViewerShowZoomLevel": "Show zoom level", + "settingsViewerShowInformation": "Show information", + "settingsViewerShowInformationSubtitle": "Show title, date, location, etc.", + "settingsViewerShowRatingTags": "Show rating & tags", + "settingsViewerShowShootingDetails": "Show shooting details", + "settingsViewerShowDescription": "Show description", + "settingsViewerShowOverlayThumbnails": "Show thumbnails", + "settingsViewerEnableOverlayBlurEffect": "Blur effect", + + "settingsViewerSlideshowTile": "Slideshow", + "settingsViewerSlideshowPageTitle": "Slideshow", + "settingsSlideshowRepeat": "Repeat", + "settingsSlideshowShuffle": "Shuffle", + "settingsSlideshowFillScreen": "Fill screen", + "settingsSlideshowAnimatedZoomEffect": "Animated zoom effect", + "settingsSlideshowTransitionTile": "Transition", + "settingsSlideshowIntervalTile": "Interval", + "settingsSlideshowVideoPlaybackTile": "Video playback", + "settingsSlideshowVideoPlaybackDialogTitle": "Video Playback", + + "settingsVideoPageTitle": "Video Settings", + "settingsVideoSectionTitle": "Video", + "settingsVideoShowVideos": "Show videos", + + "settingsVideoPlaybackTile": "Playback", + "settingsVideoPlaybackPageTitle": "Playback", + "settingsVideoEnableHardwareAcceleration": "Hardware acceleration", + "settingsVideoAutoPlay": "Auto play", + "settingsVideoLoopModeTile": "Loop mode", + "settingsVideoLoopModeDialogTitle": "Loop Mode", + "settingsVideoResumptionModeTile": "Resume playback", + "settingsVideoResumptionModeDialogTitle": "Resume Playback", + "settingsVideoBackgroundMode": "Background mode", + "settingsVideoBackgroundModeDialogTitle": "Background Mode", + + "settingsVideoControlsTile": "Controls", + "settingsVideoControlsPageTitle": "Controls", + "settingsVideoButtonsTile": "Buttons", + "settingsVideoGestureDoubleTapTogglePlay": "Double tap to play/pause", + "settingsVideoGestureSideDoubleTapSeek": "Double tap on screen edges to seek backward/forward", + "settingsVideoGestureVerticalDragBrightnessVolume": "Swipe up or down to adjust brightness/volume", + + "settingsSubtitleThemeTile": "Subtitles", + "settingsSubtitleThemePageTitle": "Subtitles", + "settingsSubtitleThemeSample": "This is a sample.", + "settingsSubtitleThemeTextAlignmentTile": "Text alignment", + "settingsSubtitleThemeTextAlignmentDialogTitle": "Text Alignment", + "settingsSubtitleThemeTextPositionTile": "Text position", + "settingsSubtitleThemeTextPositionDialogTitle": "Text Position", + "settingsSubtitleThemeTextSize": "Text size", + "settingsSubtitleThemeShowOutline": "Show outline and shadow", + "settingsSubtitleThemeTextColor": "Text color", + "settingsSubtitleThemeTextOpacity": "Text opacity", + "settingsSubtitleThemeBackgroundColor": "Background color", + "settingsSubtitleThemeBackgroundOpacity": "Background opacity", + "settingsSubtitleThemeTextAlignmentLeft": "Left", + "settingsSubtitleThemeTextAlignmentCenter": "Center", + "settingsSubtitleThemeTextAlignmentRight": "Right", + + "settingsPrivacySectionTitle": "Privacy", + "settingsAllowInstalledAppAccess": "Allow access to app inventory", + "settingsAllowInstalledAppAccessSubtitle": "Used to improve album display", + "settingsAllowErrorReporting": "Allow anonymous error reporting", + "settingsSaveSearchHistory": "Save search history", + "settingsEnableBin": "Use recycle bin", + "settingsEnableBinSubtitle": "Keep deleted items for 30 days", + "settingsDisablingBinWarningDialogMessage": "Items in the recycle bin will be deleted forever.", + "settingsAllowMediaManagement": "Allow media management", + + "settingsHiddenItemsTile": "Hidden items", + "settingsHiddenItemsPageTitle": "Hidden Items", + + "settingsHiddenFiltersBanner": "Photos and videos matching hidden filters will not appear in your collection.", + "settingsHiddenFiltersEmpty": "No hidden filters", + + "settingsStorageAccessTile": "Storage access", + "settingsStorageAccessPageTitle": "Storage Access", + "settingsStorageAccessBanner": "Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.", + "settingsStorageAccessEmpty": "No access grants", + "settingsStorageAccessRevokeTooltip": "Revoke", + + "settingsAccessibilitySectionTitle": "Accessibility", + "settingsRemoveAnimationsTile": "Remove animations", + "settingsRemoveAnimationsDialogTitle": "Remove Animations", + "settingsTimeToTakeActionTile": "Time to take action", + "settingsAccessibilityShowPinchGestureAlternatives": "Show multi-touch gesture alternatives", + + "settingsDisplaySectionTitle": "Display", + "settingsThemeBrightnessTile": "Theme", + "settingsThemeBrightnessDialogTitle": "Theme", + "settingsThemeColorHighlights": "Color highlights", + "settingsThemeEnableDynamicColor": "Dynamic color", + "settingsDisplayRefreshRateModeTile": "Display refresh rate", + "settingsDisplayRefreshRateModeDialogTitle": "Refresh Rate", + "settingsDisplayUseTvInterface": "Android TV interface", + + "settingsLanguageSectionTitle": "Language & Formats", + "settingsLanguageTile": "Language", + "settingsLanguagePageTitle": "Language", + "settingsCoordinateFormatTile": "Coordinate format", + "settingsCoordinateFormatDialogTitle": "Coordinate Format", + "settingsUnitSystemTile": "Units", + "settingsUnitSystemDialogTitle": "Units", + "settingsForceWesternArabicNumeralsTile": "Force Arabic numerals", + + "settingsScreenSaverPageTitle": "Screen Saver", + + "settingsWidgetPageTitle": "Photo Frame", + "settingsWidgetShowOutline": "Outline", + "settingsWidgetOpenPage": "When tapping on the widget", + "settingsWidgetDisplayedItem": "Displayed item", + + "settingsCollectionTile": "Collection", + + "statsPageTitle": "Stats", + "statsWithGps": "{count, plural, =1{1 item with location} other{{count} items with location}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "statsTopCountriesSectionTitle": "Top Countries", + "statsTopStatesSectionTitle": "Top States", + "statsTopPlacesSectionTitle": "Top Places", + "statsTopTagsSectionTitle": "Top Tags", + "statsTopAlbumsSectionTitle": "Top Albums", + + "viewerOpenPanoramaButtonLabel": "OPEN PANORAMA", + "viewerSetWallpaperButtonLabel": "SET WALLPAPER", + "viewerErrorUnknown": "Oops!", + "viewerErrorDoesNotExist": "The file no longer exists.", + + "viewerInfoPageTitle": "Info", + "viewerInfoBackToViewerTooltip": "Back to viewer", + + "viewerInfoUnknown": "unknown", + "viewerInfoLabelDescription": "Description", + "viewerInfoLabelTitle": "Title", + "viewerInfoLabelDate": "Date", + "viewerInfoLabelResolution": "Resolution", + "viewerInfoLabelSize": "Size", + "viewerInfoLabelUri": "URI", + "viewerInfoLabelPath": "Path", + "viewerInfoLabelDuration": "Duration", + "viewerInfoLabelOwner": "Owner", + "viewerInfoLabelCoordinates": "Coordinates", + "viewerInfoLabelAddress": "Address", + + "mapStyleDialogTitle": "Map Style", + "mapStyleDialogAddStyle": "Add style", + "mapStyleTooltip": "Select map style", + "mapStyleEditorDialogName": "Name", + "mapStyleEditorDialogUrl": "URL", + "mapStyleEditorDialogSubdomains": "Subdomains", + "mapStyleEditorDialogUserAgent": "User-Agent", + "mapZoomInTooltip": "Zoom in", + "mapZoomOutTooltip": "Zoom out", + "mapPointNorthUpTooltip": "Point north up", + "mapAttributionOsmData": "Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors", + "mapAttributionOsmLiberty": "Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)", + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "mapAttributionOsmHot": "Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)", + "mapAttributionStamen": "Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "openMapPageTooltip": "View on Map page", + "mapEmptyRegion": "No images in this region", + + "viewerInfoOpenEmbeddedFailureFeedback": "Failed to extract embedded data", + "viewerInfoOpenLinkText": "Open", + "viewerInfoViewXmlLinkText": "View XML", + + "viewerInfoSearchFieldLabel": "Search metadata", + "viewerInfoSearchEmpty": "No matching keys", + "viewerInfoSearchSuggestionDate": "Date & time", + "viewerInfoSearchSuggestionDescription": "Description", + "viewerInfoSearchSuggestionDimensions": "Dimensions", + "viewerInfoSearchSuggestionResolution": "Resolution", + "viewerInfoSearchSuggestionRights": "Rights", + + "wallpaperUseScrollEffect": "Use scroll effect on home screen", + + "tagEditorPageTitle": "Edit Tags", + "tagEditorPageNewTagFieldLabel": "New tag", + "tagEditorPageAddTagTooltip": "Add tag", + "tagEditorSectionRecent": "Recent", + "tagEditorSectionPlaceholders": "Placeholders", + "tagEditorDiscardDialogMessage": "Do you want to discard changes?", + + "tagPlaceholderCountry": "Country", + "tagPlaceholderState": "State", + "tagPlaceholderPlace": "Place", + + "panoramaEnableSensorControl": "Enable sensor control", + "panoramaDisableSensorControl": "Disable sensor control", + + "sourceViewerPageTitle": "Source" +} diff --git a/lib/l10n/app_en_Shaw.arb b/lib/l10n/app_en_Shaw.arb new file mode 100644 index 0000000..430bfdb --- /dev/null +++ b/lib/l10n/app_en_Shaw.arb @@ -0,0 +1,1669 @@ +{ + "@@locale": "en_Shaw", + "appName": "𐑱𐑝𐑰𐑟", + "@appName": {}, + "welcomeOptional": "𐑪𐑐𐑖𐑩𐑯𐑩𐑤", + "@welcomeOptional": {}, + "welcomeTermsToggle": "𐑲 𐑩𐑜𐑮𐑰 𐑑 𐑞 𐑑𐑻𐑥𐑟 𐑯 𐑒𐑩𐑯𐑛𐑦𐑖𐑩𐑯𐑟", + "@welcomeTermsToggle": {}, + "welcomeMessage": "𐑢𐑧𐑤𐑒𐑩𐑥 𐑑 ·𐑱𐑝𐑰𐑟", + "@welcomeMessage": {}, + "timeSeconds": "{count, plural, =1{{count} 𐑕𐑧𐑒𐑩𐑯𐑛} other{{count} 𐑕𐑧𐑒𐑩𐑯𐑛𐑟}}", + "@timeSeconds": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "itemCount": "{count, plural, =1{{count} 𐑲𐑑𐑩𐑥} other{{count} 𐑲𐑑𐑩𐑥𐑟}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "columnCount": "{count, plural, =1{{count} 𐑒𐑪𐑤𐑩𐑥} other{{count} 𐑒𐑪𐑤𐑩𐑥𐑟}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeMinutes": "{count, plural, =1{{count} 𐑥𐑦𐑯𐑦𐑑} other{{count} 𐑥𐑦𐑯𐑦𐑑𐑕}}", + "@timeMinutes": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeDays": "{count, plural, =1{{count} 𐑛𐑱} other{{count} 𐑛𐑱𐑟}}", + "@timeDays": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "focalLength": "{length} 𐑥𐑥", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "applyButtonLabel": "𐑩𐑐𐑤𐑲", + "@applyButtonLabel": {}, + "deleteButtonLabel": "𐑛𐑦𐑤𐑰𐑑", + "@deleteButtonLabel": {}, + "nextButtonLabel": "𐑯𐑧𐑒𐑕𐑑", + "@nextButtonLabel": {}, + "showButtonLabel": "𐑖𐑴", + "@showButtonLabel": {}, + "hideButtonLabel": "𐑣𐑲𐑛", + "@hideButtonLabel": {}, + "continueButtonLabel": "𐑒𐑩𐑯𐑑𐑦𐑯𐑿", + "@continueButtonLabel": {}, + "saveCopyButtonLabel": "𐑕𐑱𐑝 𐑒𐑪𐑐𐑦", + "@saveCopyButtonLabel": {}, + "applyTooltip": "𐑩𐑐𐑤𐑲", + "@applyTooltip": {}, + "cancelTooltip": "𐑒𐑨𐑯𐑕𐑩𐑤", + "@cancelTooltip": {}, + "changeTooltip": "𐑗𐑱𐑯𐑡", + "@changeTooltip": {}, + "clearTooltip": "𐑒𐑤𐑽", + "@clearTooltip": {}, + "previousTooltip": "𐑐𐑮𐑰𐑝𐑾𐑕", + "@previousTooltip": {}, + "nextTooltip": "𐑯𐑧𐑒𐑕𐑑", + "@nextTooltip": {}, + "showTooltip": "𐑖𐑴", + "@showTooltip": {}, + "hideTooltip": "𐑣𐑲𐑛", + "@hideTooltip": {}, + "actionRemove": "𐑮𐑦𐑥𐑵𐑝", + "@actionRemove": {}, + "resetTooltip": "𐑮𐑰𐑕𐑧𐑑", + "@resetTooltip": {}, + "saveTooltip": "𐑕𐑱𐑝", + "@saveTooltip": {}, + "stopTooltip": "𐑕𐑑𐑪𐑐", + "@stopTooltip": {}, + "pickTooltip": "𐑐𐑦𐑒", + "@pickTooltip": {}, + "doubleBackExitMessage": "𐑑𐑨𐑐 «𐑚𐑨𐑒» 𐑩𐑜𐑧𐑯 𐑑 𐑧𐑒𐑕𐑦𐑑.", + "@doubleBackExitMessage": {}, + "chipActionGoToAlbumPage": "𐑖𐑴 𐑦𐑯 ·𐑨𐑤𐑚𐑩𐑥𐑟", + "@chipActionGoToAlbumPage": {}, + "chipActionShowCollection": "𐑖𐑴 𐑦𐑯 ·𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯", + "@chipActionShowCollection": {}, + "videoActionPlay": "𐑐𐑤𐑱", + "@videoActionPlay": {}, + "viewerActionSettings": "𐑕𐑧𐑑𐑦𐑙𐑟", + "@viewerActionSettings": {}, + "slideshowActionResume": "𐑮𐑦𐑟𐑿𐑥", + "@slideshowActionResume": {}, + "entryInfoActionEditLocation": "𐑧𐑛𐑦𐑑 𐑤𐑴𐑒𐑱𐑖𐑩𐑯", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "𐑧𐑛𐑦𐑑 𐑑𐑲𐑑𐑩𐑤 𐑯 𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯", + "@entryInfoActionEditTitleDescription": {}, + "doNotAskAgain": "𐑛𐑵 𐑯𐑪𐑑 𐑭𐑕𐑒 𐑩𐑜𐑧𐑯", + "@doNotAskAgain": {}, + "sourceStateLoading": "𐑤𐑴𐑛𐑦𐑙", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "𐑒𐑨𐑑𐑩𐑤𐑪𐑜𐑦𐑙", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "𐑤𐑴𐑒𐑱𐑑𐑦𐑙 𐑒𐑳𐑯𐑑𐑮𐑦𐑟", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "𐑤𐑴𐑒𐑱𐑑𐑦𐑙 𐑐𐑤𐑱𐑕𐑩𐑟", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "𐑛𐑦𐑤𐑰𐑑", + "@chipActionDelete": {}, + "chipActionGoToExplorerPage": "𐑖𐑴 𐑦𐑯 ·𐑦𐑒𐑕𐑐𐑤𐑹𐑼", + "@chipActionGoToExplorerPage": {}, + "chipActionGoToTagPage": "𐑖𐑴 𐑦𐑯 ·𐑑𐑨𐑜𐑟", + "@chipActionGoToTagPage": {}, + "chipActionGoToPlacePage": "𐑖𐑴 𐑦𐑯 ·𐑐𐑤𐑱𐑕𐑩𐑟", + "@chipActionGoToPlacePage": {}, + "chipActionGoToCountryPage": "𐑖𐑴 𐑦𐑯 ·𐑒𐑳𐑯𐑑𐑮𐑦𐑟", + "@chipActionGoToCountryPage": {}, + "chipActionFilterOut": "𐑓𐑦𐑤𐑑𐑼 𐑬𐑑", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "𐑓𐑦𐑤𐑑𐑼 𐑦𐑯", + "@chipActionFilterIn": {}, + "chipActionHide": "𐑣𐑲𐑛", + "@chipActionHide": {}, + "chipActionLock": "𐑤𐑪𐑒", + "@chipActionLock": {}, + "chipActionPin": "𐑐𐑦𐑯 𐑑 𐑑𐑪𐑐", + "@chipActionPin": {}, + "chipActionUnpin": "𐑳𐑯𐑐𐑦𐑯 𐑑 𐑑𐑪𐑐", + "@chipActionUnpin": {}, + "chipActionRename": "𐑮𐑰𐑯𐑱𐑥", + "@chipActionRename": {}, + "chipActionSetCover": "𐑕𐑧𐑑 𐑒𐑳𐑝𐑼", + "@chipActionSetCover": {}, + "chipActionShowCountryStates": "𐑖𐑴 𐑕𐑑𐑱𐑑𐑕", + "@chipActionShowCountryStates": {}, + "chipActionCreateAlbum": "𐑒𐑮𐑦𐑱𐑑 𐑨𐑤𐑚𐑩𐑥", + "@chipActionCreateAlbum": {}, + "chipActionCreateVault": "𐑒𐑮𐑦𐑱𐑑 𐑝𐑷𐑤𐑑", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "𐑒𐑩𐑯𐑓𐑦𐑜𐑼 𐑝𐑷𐑤𐑑", + "@chipActionConfigureVault": {}, + "entryActionCopyToClipboard": "𐑒𐑪𐑐𐑦 𐑑 𐑒𐑤𐑦𐑐𐑚𐑹𐑛", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "𐑛𐑦𐑤𐑰𐑑", + "@entryActionDelete": {}, + "entryActionConvert": "𐑒𐑪𐑯𐑝𐑻𐑑", + "@entryActionConvert": {}, + "entryActionExport": "𐑦𐑒𐑕𐑐𐑹𐑑", + "@entryActionExport": {}, + "entryActionInfo": "𐑦𐑯𐑓𐑴", + "@entryActionInfo": {}, + "entryActionRename": "𐑮𐑰𐑯𐑱𐑥", + "@entryActionRename": {}, + "entryActionRestore": "𐑮𐑦𐑕𐑑𐑹", + "@entryActionRestore": {}, + "entryActionRotateCCW": "𐑮𐑴𐑑𐑱𐑑 𐑒𐑬𐑯𐑑𐑼𐑒𐑤𐑪𐑒𐑢𐑲𐑟", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "𐑮𐑴𐑑𐑱𐑑 𐑒𐑤𐑪𐑒𐑢𐑲𐑟", + "@entryActionRotateCW": {}, + "entryActionFlip": "𐑓𐑤𐑦𐑐 𐑣𐑪𐑮𐑦𐑟𐑪𐑯𐑑𐑩𐑤𐑦", + "@entryActionFlip": {}, + "entryActionPrint": "𐑐𐑮𐑦𐑯𐑑", + "@entryActionPrint": {}, + "entryActionShare": "𐑖𐑺", + "@entryActionShare": {}, + "entryActionShareImageOnly": "𐑖𐑺 𐑦𐑥𐑦𐑡 𐑴𐑯𐑤𐑦", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "𐑖𐑺 𐑝𐑦𐑛𐑦𐑴 𐑴𐑯𐑤𐑦", + "@entryActionShareVideoOnly": {}, + "entryActionViewSource": "𐑝𐑿 𐑕𐑹𐑕", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "𐑖𐑴 𐑨𐑟 𐑥𐑨𐑐 𐑴𐑝𐑼𐑤𐑱", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "𐑒𐑪𐑯𐑝𐑻𐑑 𐑑 𐑕𐑑𐑦𐑤 𐑦𐑥𐑦𐑡", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "𐑴𐑐𐑩𐑯 𐑝𐑦𐑛𐑦𐑴", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "𐑧𐑛𐑦𐑑", + "@entryActionEdit": {}, + "entryActionOpen": "𐑴𐑐𐑩𐑯 𐑢𐑦𐑞", + "@entryActionOpen": {}, + "entryActionSetAs": "𐑕𐑧𐑑 𐑨𐑟", + "@entryActionSetAs": {}, + "entryActionCast": "𐑒𐑭𐑕𐑑", + "@entryActionCast": {}, + "entryActionOpenMap": "𐑖𐑴 𐑦𐑯 𐑥𐑨𐑐 𐑨𐑐", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "𐑮𐑴𐑑𐑱𐑑 𐑕𐑒𐑮𐑰𐑯", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "𐑨𐑛 𐑑 𐑓𐑱𐑝𐑼𐑦𐑑𐑕", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "𐑮𐑦𐑥𐑵𐑝 𐑓𐑮𐑪𐑥 𐑓𐑱𐑝𐑼𐑦𐑑𐑕", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "𐑒𐑨𐑐𐑗𐑼 𐑓𐑮𐑱𐑥", + "@videoActionCaptureFrame": {}, + "videoActionMute": "𐑥𐑿𐑑", + "@videoActionMute": {}, + "videoActionUnmute": "𐑳𐑯𐑥𐑿𐑑", + "@videoActionUnmute": {}, + "videoActionPause": "𐑐𐑷𐑟", + "@videoActionPause": {}, + "videoActionReplay10": "𐑕𐑰𐑒 𐑚𐑨𐑒𐑢𐑼𐑛 10 𐑕𐑧𐑒𐑩𐑯𐑛𐑟", + "@videoActionReplay10": {}, + "videoActionSkip10": "𐑕𐑰𐑒 𐑓𐑹𐑢𐑼𐑛 10 𐑕𐑧𐑒𐑩𐑯𐑛𐑟", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "𐑕𐑦𐑤𐑧𐑒𐑑 𐑑𐑮𐑨𐑒𐑕", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "𐑐𐑤𐑱𐑚𐑨𐑒 𐑕𐑐𐑰𐑛", + "@videoActionSetSpeed": {}, + "videoActionABRepeat": "𐑐–𐑚 𐑮𐑦𐑐𐑰𐑑", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "𐑕𐑧𐑑 𐑕𐑑𐑸𐑑", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "𐑕𐑧𐑑 𐑧𐑯𐑛", + "@videoRepeatActionSetEnd": {}, + "viewerActionLock": "𐑤𐑪𐑒 𐑝𐑿𐑼", + "@viewerActionLock": {}, + "viewerActionUnlock": "𐑳𐑯𐑤𐑪𐑒 𐑝𐑿𐑼", + "@viewerActionUnlock": {}, + "slideshowActionShowInCollection": "𐑖𐑴 𐑦𐑯 ·𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "𐑧𐑛𐑦𐑑 𐑛𐑱𐑑 𐑯 𐑑𐑲𐑥", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditRating": "𐑧𐑛𐑦𐑑 𐑮𐑱𐑑𐑦𐑙", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "𐑧𐑛𐑦𐑑 𐑑𐑨𐑜𐑟", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "𐑮𐑦𐑥𐑵𐑝 𐑥𐑧𐑑𐑩𐑛𐑱𐑑𐑩", + "@entryInfoActionRemoveMetadata": {}, + "entryInfoActionExportMetadata": "𐑦𐑒𐑕𐑐𐑹𐑑 𐑥𐑧𐑑𐑩𐑛𐑱𐑑𐑩", + "@entryInfoActionExportMetadata": {}, + "entryInfoActionRemoveLocation": "𐑮𐑦𐑥𐑵𐑝 𐑤𐑴𐑒𐑱𐑖𐑩𐑯", + "@entryInfoActionRemoveLocation": {}, + "editorActionTransform": "𐑑𐑮𐑨𐑯𐑕𐑓𐑹𐑥", + "@editorActionTransform": {}, + "editorTransformCrop": "𐑒𐑮𐑪𐑐", + "@editorTransformCrop": {}, + "editorTransformRotate": "𐑮𐑴𐑑𐑱𐑑", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "𐑓𐑮𐑰", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "𐑼𐑦𐑡𐑦𐑯𐑩𐑤", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "𐑕𐑒𐑢𐑺", + "@cropAspectRatioSquare": {}, + "filterAspectRatioLandscapeLabel": "𐑤𐑨𐑯𐑛𐑕𐑒𐑱𐑐", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "𐑐𐑹𐑑𐑮𐑦𐑑", + "@filterAspectRatioPortraitLabel": {}, + "filterBinLabel": "𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯", + "@filterBinLabel": {}, + "filterFavouriteLabel": "𐑓𐑱𐑝𐑼𐑦𐑑", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "𐑳𐑯𐑛𐑱𐑑𐑩𐑛", + "@filterNoDateLabel": {}, + "filterNoAddressLabel": "𐑯𐑴 𐑩𐑛𐑮𐑧𐑕", + "@filterNoAddressLabel": {}, + "filterLocatedLabel": "𐑤𐑴𐑒𐑱𐑑𐑩𐑛", + "@filterLocatedLabel": {}, + "filterNoLocationLabel": "𐑳𐑯𐑤𐑴𐑒𐑱𐑑𐑩𐑛", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "𐑳𐑯𐑮𐑱𐑑𐑩𐑛", + "@filterNoRatingLabel": {}, + "filterTaggedLabel": "𐑑𐑨𐑜𐑛", + "@filterTaggedLabel": {}, + "filterNoTagLabel": "𐑳𐑯𐑑𐑨𐑜𐑛", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "𐑳𐑯𐑑𐑲𐑑𐑩𐑤𐑛", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "𐑪𐑯 𐑞𐑦𐑕 𐑛𐑱", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "𐑮𐑰𐑕𐑩𐑯𐑑𐑤𐑦 𐑨𐑛𐑩𐑛", + "@filterRecentlyAddedLabel": {}, + "filterRatingRejectedLabel": "𐑮𐑦𐑡𐑧𐑒𐑑𐑩𐑛", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "𐑨𐑯𐑦𐑥𐑱𐑑𐑩𐑛", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "𐑥𐑴𐑖𐑩𐑯 𐑓𐑴𐑑𐑴", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "𐑐𐑨𐑯𐑼𐑭𐑥𐑩", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "𐑮𐑷", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° 𐑝𐑦𐑛𐑦𐑴", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "⸰𐑡𐑰𐑴𐑑𐑦𐑓𐑓", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "𐑦𐑥𐑦𐑡", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "𐑝𐑦𐑛𐑦𐑴", + "@filterMimeVideoLabel": {}, + "accessibilityAnimationsRemove": "𐑐𐑮𐑦𐑝𐑧𐑯𐑑 𐑕𐑒𐑮𐑰𐑯 𐑦𐑓𐑧𐑒𐑑𐑕", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "𐑒𐑰𐑐 𐑕𐑒𐑮𐑰𐑯 𐑦𐑓𐑧𐑒𐑑𐑕", + "@accessibilityAnimationsKeep": {}, + "albumTierNew": "𐑯𐑿", + "@albumTierNew": {}, + "albumTierPinned": "𐑐𐑦𐑯𐑛", + "@albumTierPinned": {}, + "albumTierSpecial": "𐑒𐑪𐑥𐑩𐑯", + "@albumTierSpecial": {}, + "albumTierApps": "𐑨𐑐𐑕", + "@albumTierApps": {}, + "albumTierVaults": "𐑝𐑷𐑤𐑑𐑕", + "@albumTierVaults": {}, + "albumTierRegular": "𐑳𐑞𐑼𐑟", + "@albumTierRegular": {}, + "coordinateFormatDms": "⸰𐑛𐑥𐑕", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "𐑛𐑧𐑕𐑦𐑥𐑩𐑤 𐑛𐑦𐑜𐑮𐑰𐑟", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsNorth": "𐑯", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "𐑕", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "𐑰", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "𐑢", + "@coordinateDmsWest": {}, + "displayRefreshRatePreferHighest": "𐑣𐑲𐑩𐑕𐑑 𐑮𐑱𐑑", + "@displayRefreshRatePreferHighest": {}, + "keepScreenOnVideoPlayback": "𐑛𐑘𐑫𐑼𐑦𐑙 𐑝𐑦𐑛𐑦𐑴 𐑐𐑤𐑱𐑚𐑨𐑒", + "@keepScreenOnVideoPlayback": {}, + "keepScreenOnViewerOnly": "𐑝𐑿𐑼 𐑐𐑱𐑡 𐑴𐑯𐑤𐑦", + "@keepScreenOnViewerOnly": {}, + "lengthUnitPixel": "𐑐𐑒𐑕", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "mapStyleGoogleNormal": "·𐑜𐑵𐑜𐑩𐑤 𐑥𐑨𐑐𐑕", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "·𐑜𐑵𐑜𐑩𐑤 𐑥𐑨𐑐𐑕 (𐑣𐑲𐑚𐑮𐑦𐑛)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "·𐑜𐑵𐑜𐑩𐑤 𐑥𐑨𐑐𐑕 (𐑑𐑼𐑱𐑯)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmLiberty": "⸰𐑴𐑕𐑥 ·𐑤𐑦𐑚𐑼𐑑𐑦", + "@mapStyleOsmLiberty": {}, + "mapStyleOpenTopoMap": "·𐑴𐑐𐑩𐑯𐑑𐑪𐑐𐑩𐑥𐑨𐑐", + "@mapStyleOpenTopoMap": {}, + "mapStyleOsmHot": "·𐑣𐑿𐑥𐑨𐑯𐑦𐑑𐑺𐑾𐑯 ⸰𐑴𐑕𐑥", + "@mapStyleOsmHot": {}, + "maxBrightnessAlways": "𐑷𐑤𐑢𐑱𐑟", + "@maxBrightnessAlways": {}, + "mapStyleStamenWatercolor": "·𐑕𐑑𐑱𐑥𐑩𐑯 𐑢𐑷𐑑𐑼𐑒𐑳𐑤𐑼", + "@mapStyleStamenWatercolor": {}, + "maxBrightnessNever": "𐑯𐑧𐑝𐑼", + "@maxBrightnessNever": {}, + "nameConflictStrategyRename": "𐑮𐑰𐑯𐑱𐑥", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "𐑮𐑦𐑐𐑤𐑱𐑕", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "𐑕𐑒𐑦𐑐", + "@nameConflictStrategySkip": {}, + "overlayHistogramNone": "𐑯𐑳𐑯", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "⸰𐑮𐑜𐑚", + "@overlayHistogramRGB": {}, + "overlayHistogramLuminance": "𐑤𐑵𐑥𐑦𐑯𐑩𐑯𐑕", + "@overlayHistogramLuminance": {}, + "subtitlePositionTop": "𐑑𐑪𐑐", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "𐑚𐑪𐑑𐑩𐑥", + "@subtitlePositionBottom": {}, + "themeBrightnessLight": "𐑤𐑲𐑑", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "𐑛𐑸𐑒", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "𐑚𐑤𐑨𐑒", + "@themeBrightnessBlack": {}, + "unitSystemMetric": "𐑥𐑧𐑑𐑮𐑦𐑒", + "@unitSystemMetric": {}, + "unitSystemImperial": "𐑦𐑥𐑐𐑽𐑾𐑤", + "@unitSystemImperial": {}, + "vaultLockTypePattern": "𐑐𐑨𐑑𐑼𐑯", + "@vaultLockTypePattern": {}, + "vaultLockTypePin": "⸰𐑐𐑲𐑯", + "@vaultLockTypePin": {}, + "vaultLockTypePassword": "𐑐𐑭𐑕𐑢𐑻𐑛", + "@vaultLockTypePassword": {}, + "settingsVideoEnablePip": "𐑐𐑦𐑒𐑗𐑼-𐑦𐑯-𐑐𐑦𐑒𐑗𐑼", + "@settingsVideoEnablePip": {}, + "videoControlsPlayOutside": "𐑴𐑐𐑩𐑯 𐑢𐑦𐑞 𐑳𐑞𐑼 𐑐𐑤𐑱𐑼", + "@videoControlsPlayOutside": {}, + "videoLoopModeNever": "𐑯𐑧𐑝𐑼", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "𐑖𐑹𐑑 𐑝𐑦𐑛𐑦𐑴𐑟 𐑴𐑯𐑤𐑦", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "𐑷𐑤𐑢𐑱𐑟", + "@videoLoopModeAlways": {}, + "videoPlaybackSkip": "𐑕𐑒𐑦𐑐", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "𐑐𐑤𐑱 𐑥𐑿𐑑𐑩𐑛", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "𐑐𐑤𐑱 𐑢𐑦𐑞 𐑕𐑬𐑯𐑛", + "@videoPlaybackWithSound": {}, + "videoResumptionModeNever": "𐑯𐑧𐑝𐑼", + "@videoResumptionModeNever": {}, + "videoResumptionModeAlways": "𐑷𐑤𐑢𐑱𐑟", + "@videoResumptionModeAlways": {}, + "viewerTransitionSlide": "𐑕𐑤𐑲𐑛", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "𐑐𐑨𐑮𐑩𐑤𐑨𐑒𐑕", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "𐑓𐑱𐑛", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "𐑟𐑵𐑥 𐑦𐑯", + "@viewerTransitionZoomIn": {}, + "viewerTransitionNone": "𐑯𐑳𐑯", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "𐑣𐑴𐑥 𐑕𐑒𐑮𐑰𐑯", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "𐑤𐑪𐑒 𐑕𐑒𐑮𐑰𐑯", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "𐑣𐑴𐑥 𐑯 𐑤𐑪𐑒 𐑕𐑒𐑮𐑰𐑯𐑟", + "@wallpaperTargetHomeLock": {}, + "widgetDisplayedItemRandom": "𐑮𐑨𐑯𐑛𐑩𐑥", + "@widgetDisplayedItemRandom": {}, + "widgetDisplayedItemMostRecent": "𐑥𐑴𐑕𐑑 𐑮𐑰𐑕𐑩𐑯𐑑", + "@widgetDisplayedItemMostRecent": {}, + "widgetOpenPageHome": "𐑴𐑐𐑩𐑯 𐑣𐑴𐑥", + "@widgetOpenPageHome": {}, + "widgetOpenPageCollection": "𐑴𐑐𐑩𐑯 𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯", + "@widgetOpenPageCollection": {}, + "widgetOpenPageViewer": "𐑴𐑐𐑩𐑯 𐑝𐑿𐑼", + "@widgetOpenPageViewer": {}, + "widgetTapUpdateWidget": "𐑳𐑐𐑛𐑱𐑑 𐑢𐑦𐑡𐑩𐑑", + "@widgetTapUpdateWidget": {}, + "storageVolumeDescriptionFallbackPrimary": "𐑦𐑯𐑑𐑻𐑯𐑩𐑤 𐑕𐑑𐑹𐑦𐑡", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "⸰𐑕𐑛 𐑒𐑸𐑛", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "𐑮𐑵𐑑 𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "«{name}» 𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "storageAccessDialogMessage": "𐑐𐑤𐑰𐑟 𐑕𐑦𐑤𐑧𐑒𐑑 𐑞 {directory} 𐑝 «{volume}» 𐑦𐑯 𐑞 𐑯𐑧𐑒𐑕𐑑 𐑕𐑒𐑮𐑰𐑯 𐑑 𐑜𐑦𐑝 𐑞𐑦𐑕 𐑨𐑐 𐑨𐑒𐑕𐑧𐑕 𐑑 𐑦𐑑.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "restrictedAccessDialogMessage": "𐑞𐑦𐑕 𐑨𐑐 𐑦𐑟 𐑯𐑪𐑑 𐑩𐑤𐑬𐑛 𐑑 𐑥𐑪𐑛𐑦𐑓𐑲 𐑓𐑲𐑤𐑟 𐑦𐑯 𐑞 {directory} 𐑝 «{volume}».\n\n𐑐𐑤𐑰𐑟 𐑿𐑟 𐑩 𐑐𐑮𐑰-𐑦𐑯𐑕𐑑𐑷𐑤𐑛 𐑓𐑲𐑤 𐑥𐑨𐑯𐑦𐑡𐑼 𐑹 𐑜𐑨𐑤𐑼𐑦 𐑨𐑐 𐑑 𐑥𐑵𐑝 𐑞 𐑲𐑑𐑩𐑥𐑟 𐑑 𐑩𐑯𐑳𐑞𐑼 𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "keepScreenOnNever": "𐑯𐑧𐑝𐑼", + "@keepScreenOnNever": {}, + "displayRefreshRatePreferLowest": "𐑤𐑴𐑩𐑕𐑑 𐑮𐑱𐑑", + "@displayRefreshRatePreferLowest": {}, + "keepScreenOnAlways": "𐑷𐑤𐑢𐑱𐑟", + "@keepScreenOnAlways": {}, + "notEnoughSpaceDialogMessage": "𐑞𐑦𐑕 𐑪𐑐𐑼𐑱𐑖𐑩𐑯 𐑯𐑰𐑛𐑟 {neededSize} 𐑝 𐑓𐑮𐑰 𐑕𐑐𐑱𐑕 𐑪𐑯 «{volume}» 𐑑 𐑒𐑩𐑥𐑐𐑤𐑰𐑑, 𐑚𐑳𐑑 𐑞𐑺 𐑦𐑟 𐑴𐑯𐑤𐑦 {freeSize} 𐑤𐑧𐑓𐑑.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "missingSystemFilePickerDialogMessage": "𐑞 𐑕𐑦𐑕𐑑𐑩𐑥 𐑓𐑲𐑤 𐑐𐑦𐑒𐑼 𐑦𐑟 𐑥𐑦𐑕𐑦𐑙 𐑹 𐑛𐑦𐑕𐑱𐑚𐑩𐑤𐑛. 𐑐𐑤𐑰𐑟 𐑦𐑯𐑱𐑚𐑩𐑤 𐑦𐑑 𐑯 𐑑𐑮𐑲 𐑩𐑜𐑧𐑯.", + "@missingSystemFilePickerDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "𐑕𐑳𐑥 𐑓𐑲𐑤𐑟 𐑦𐑯 𐑞 𐑛𐑧𐑕𐑑𐑦𐑯𐑱𐑖𐑩𐑯 𐑓𐑴𐑤𐑛𐑼 𐑣𐑨𐑝 𐑞 𐑕𐑱𐑥 𐑯𐑱𐑥.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "𐑕𐑳𐑥 𐑓𐑲𐑤𐑟 𐑣𐑨𐑝 𐑞 𐑕𐑱𐑥 𐑯𐑱𐑥.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "𐑖𐑹𐑑𐑒𐑳𐑑 𐑤𐑱𐑚𐑩𐑤", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "𐑨𐑛", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "𐑞𐑺 𐑸 𐑯𐑴 𐑨𐑐𐑕 𐑞𐑨𐑑 𐑒𐑨𐑯 𐑣𐑨𐑯𐑛𐑩𐑤 𐑞𐑦𐑕.", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{¿𐑥𐑵𐑝 𐑞𐑦𐑕 𐑲𐑑𐑩𐑥 𐑑 𐑞 𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯?} other{¿𐑥𐑵𐑝 𐑞𐑰𐑟 {count} 𐑲𐑑𐑩𐑥𐑟 𐑑 𐑞 𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{¿𐑛𐑦𐑤𐑰𐑑 𐑞𐑦𐑕 𐑲𐑑𐑩𐑥?} other{¿𐑛𐑦𐑤𐑰𐑑 𐑞𐑰𐑟 {count} 𐑲𐑑𐑩𐑥𐑟?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "moveUndatedConfirmationDialogMessage": "¿𐑕𐑱𐑝 𐑲𐑑𐑩𐑥 𐑛𐑱𐑑𐑕 𐑚𐑦𐑓𐑹 𐑐𐑮𐑩𐑕𐑰𐑛𐑦𐑙?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "𐑕𐑱𐑝 𐑛𐑱𐑑𐑕", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "¿𐑛𐑵 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑮𐑦𐑟𐑿𐑥 𐑨𐑑 {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "videoStartOverButtonLabel": "𐑕𐑑𐑸𐑑 𐑴𐑝𐑼", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "𐑮𐑦𐑟𐑿𐑥", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "𐑤𐑱𐑑𐑩𐑕𐑑 𐑲𐑑𐑩𐑥", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "𐑷𐑑𐑴", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "𐑒𐑳𐑕𐑑𐑩𐑥", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "𐑥𐑨𐑗𐑦𐑙 𐑓𐑴𐑑𐑴𐑟 𐑯 𐑝𐑦𐑛𐑦𐑴𐑟 𐑢𐑦𐑤 𐑚𐑰 𐑣𐑦𐑛𐑩𐑯 𐑓𐑮𐑪𐑥 𐑘𐑹 𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯. 𐑿 𐑒𐑨𐑯 𐑖𐑴 𐑞𐑧𐑥 𐑩𐑜𐑧𐑯 𐑓𐑮𐑪𐑥 𐑞 «𐑐𐑮𐑦𐑝𐑩𐑕𐑦» 𐑕𐑧𐑑𐑦𐑙𐑟.\n\n¿𐑸 𐑿 𐑖𐑫𐑼 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑣𐑲𐑛 𐑞𐑧𐑥?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "𐑯𐑿 𐑨𐑤𐑚𐑩𐑥", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "𐑨𐑤𐑚𐑩𐑥 𐑯𐑱𐑥", + "@newAlbumDialogNameLabel": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{𐑞𐑦𐑕 𐑪𐑐𐑼𐑱𐑖𐑩𐑯 𐑦𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑓 𐑲𐑑𐑩𐑥𐑟 𐑝 𐑞 𐑓𐑪𐑤𐑴𐑦𐑙 𐑑𐑲𐑐: {types}.} other{𐑞𐑦𐑕 𐑪𐑐𐑼𐑱𐑖𐑩𐑯 𐑦𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑓 𐑲𐑑𐑩𐑥𐑟 𐑝 𐑞 𐑓𐑪𐑤𐑴𐑦𐑙 𐑑𐑲𐑐𐑕: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "newAlbumDialogNameLabelAlreadyExistsHelper": "𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦 𐑷𐑤𐑮𐑧𐑛𐑦 𐑦𐑜𐑟𐑦𐑕𐑑𐑕", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "𐑕𐑑𐑹𐑦𐑡:", + "@newAlbumDialogStorageLabel": {}, + "newVaultWarningDialogMessage": "𐑲𐑑𐑩𐑥𐑟 𐑦𐑯 𐑝𐑷𐑤𐑑𐑕 𐑸 𐑴𐑯𐑤𐑦 𐑩𐑝𐑱𐑤𐑩𐑚𐑩𐑤 𐑑 𐑞𐑦𐑕 𐑨𐑐 𐑯 𐑯𐑴 𐑳𐑞𐑼𐑟.\n\n𐑦𐑓 𐑿 𐑳𐑯𐑦𐑯𐑕𐑑𐑷𐑤 𐑞𐑦𐑕 𐑨𐑐, 𐑹 𐑒𐑤𐑽 𐑞𐑦𐑕 𐑨𐑐 𐑛𐑱𐑑𐑩, 𐑿 𐑢𐑦𐑤 𐑤𐑵𐑟 𐑷𐑤 𐑞𐑰𐑟 𐑲𐑑𐑩𐑥𐑟.", + "@newVaultWarningDialogMessage": {}, + "newVaultDialogTitle": "𐑯𐑿 𐑝𐑷𐑤𐑑", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "𐑒𐑩𐑯𐑓𐑦𐑜𐑼 𐑝𐑷𐑤𐑑", + "@configureVaultDialogTitle": {}, + "exportEntryDialogQuality": "𐑒𐑢𐑪𐑤𐑦𐑑𐑦", + "@exportEntryDialogQuality": {}, + "exportEntryDialogHeight": "𐑣𐑲𐑑", + "@exportEntryDialogHeight": {}, + "durationDialogSeconds": "𐑕𐑧𐑒𐑩𐑯𐑛𐑟", + "@durationDialogSeconds": {}, + "editEntryLocationDialogChooseOnMap": "𐑗𐑵𐑟 𐑪𐑯 𐑥𐑨𐑐", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "𐑤𐑨𐑑𐑦𐑑𐑿𐑛", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "𐑤𐑪𐑯𐑡𐑦𐑑𐑿𐑛", + "@editEntryLocationDialogLongitude": {}, + "videoStreamSelectionDialogAudio": "𐑷𐑛𐑦𐑴", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "𐑕𐑳𐑚𐑑𐑲𐑑𐑩𐑤𐑟", + "@videoStreamSelectionDialogText": {}, + "aboutDataUsageExternal": "𐑦𐑒𐑕𐑑𐑻𐑯𐑩𐑤", + "@aboutDataUsageExternal": {}, + "aboutTranslatorsSectionTitle": "𐑑𐑮𐑨𐑯𐑟𐑤𐑱𐑑𐑼𐑟", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "𐑴𐑐𐑩𐑯-𐑕𐑹𐑕 𐑤𐑲𐑕𐑩𐑯𐑕𐑩𐑟", + "@aboutLicensesSectionTitle": {}, + "policyPageTitle": "𐑐𐑮𐑦𐑝𐑩𐑕𐑦 𐑐𐑪𐑤𐑩𐑕𐑦", + "@policyPageTitle": {}, + "collectionPageTitle": "𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯", + "@collectionPageTitle": {}, + "collectionActionEmptyBin": "𐑧𐑥𐑐𐑑𐑦 𐑚𐑦𐑯", + "@collectionActionEmptyBin": {}, + "collectionGroupAlbum": "𐑚𐑲 𐑨𐑤𐑚𐑩𐑥", + "@collectionGroupAlbum": {}, + "collectionActionEdit": "𐑧𐑛𐑦𐑑", + "@collectionActionEdit": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{𐑓𐑱𐑤𐑛 𐑑 𐑛𐑦𐑤𐑰𐑑 1 𐑲𐑑𐑩𐑥} other{𐑓𐑱𐑤𐑛 𐑑 𐑛𐑦𐑤𐑰𐑑 {count} 𐑲𐑑𐑩𐑥𐑟}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{𐑥𐑵𐑝𐑛 1 𐑲𐑑𐑩𐑥} other{𐑥𐑵𐑝𐑛 {count} 𐑲𐑑𐑩𐑥𐑟}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "searchCollectionFieldHint": "𐑕𐑻𐑗 𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯", + "@searchCollectionFieldHint": {}, + "searchDateSectionTitle": "𐑛𐑱𐑑", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "𐑨𐑤𐑚𐑩𐑥𐑟", + "@searchAlbumsSectionTitle": {}, + "searchStatesSectionTitle": "𐑕𐑑𐑱𐑑𐑕", + "@searchStatesSectionTitle": {}, + "searchRatingSectionTitle": "𐑮𐑱𐑑𐑦𐑙𐑟", + "@searchRatingSectionTitle": {}, + "settingsActionExport": "𐑦𐑒𐑕𐑐𐑹𐑑", + "@settingsActionExport": {}, + "appExportFavourites": "𐑓𐑱𐑝𐑼𐑦𐑑𐑕", + "@appExportFavourites": {}, + "setHomeCustom": "𐑒𐑳𐑕𐑑𐑩𐑥", + "@setHomeCustom": {}, + "settingsKeepScreenOnDialogTitle": "𐑒𐑰𐑐 𐑕𐑒𐑮𐑰𐑯 𐑪𐑯", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsConfirmationDialogTitle": "𐑒𐑪𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯 𐑛𐑲𐑩𐑤𐑪𐑜𐑟", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationAfterMoveToBinItems": "𐑖𐑴 𐑥𐑧𐑕𐑦𐑡 𐑭𐑓𐑑𐑼 𐑥𐑵𐑝𐑦𐑙 𐑲𐑑𐑩𐑥𐑟 𐑑 𐑞 𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerEditorPageTitle": "𐑯𐑨𐑝𐑦𐑜𐑱𐑖𐑩𐑯 𐑥𐑧𐑯𐑿", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsThumbnailShowMotionPhotoIcon": "𐑖𐑴 𐑥𐑴𐑖𐑩𐑯 𐑓𐑴𐑑𐑴 𐑲𐑒𐑪𐑯", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailOverlayTile": "𐑴𐑝𐑼𐑤𐑱", + "@settingsThumbnailOverlayTile": {}, + "vaultDialogLockModeWhenScreenOff": "𐑤𐑪𐑒 𐑢𐑧𐑯 𐑕𐑒𐑮𐑰𐑯 𐑑𐑻𐑯𐑟 𐑪𐑓", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "𐑤𐑪𐑒 𐑑𐑲𐑐", + "@vaultDialogLockTypeLabel": {}, + "patternDialogEnter": "𐑧𐑯𐑑𐑼 𐑐𐑨𐑑𐑼𐑯", + "@patternDialogEnter": {}, + "patternDialogConfirm": "𐑒𐑩𐑯𐑓𐑻𐑥 𐑐𐑨𐑑𐑼𐑯", + "@patternDialogConfirm": {}, + "pinDialogEnter": "𐑧𐑯𐑑𐑼 ⸰𐑐𐑲𐑯", + "@pinDialogEnter": {}, + "pinDialogConfirm": "𐑒𐑩𐑯𐑓𐑻𐑥 ⸰𐑐𐑲𐑯", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "𐑧𐑯𐑑𐑼 𐑐𐑭𐑕𐑢𐑻𐑛", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "𐑒𐑩𐑯𐑓𐑻𐑥 𐑐𐑭𐑕𐑢𐑻𐑛", + "@passwordDialogConfirm": {}, + "authenticateToConfigureVault": "𐑷𐑔𐑧𐑯𐑑𐑦𐑒𐑱𐑑 𐑑 𐑒𐑩𐑯𐑓𐑦𐑜𐑼 𐑝𐑷𐑤𐑑", + "@authenticateToConfigureVault": {}, + "authenticateToUnlockVault": "𐑷𐑔𐑧𐑯𐑑𐑦𐑒𐑱𐑑 𐑑 𐑳𐑯𐑤𐑪𐑒 𐑝𐑷𐑤𐑑", + "@authenticateToUnlockVault": {}, + "vaultBinUsageDialogMessage": "𐑕𐑳𐑥 𐑝𐑷𐑤𐑑𐑕 𐑸 𐑿𐑟𐑦𐑙 𐑞 𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯.", + "@vaultBinUsageDialogMessage": {}, + "renameAlbumDialogLabel": "𐑯𐑿 𐑯𐑱𐑥", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦 𐑷𐑤𐑮𐑧𐑛𐑦 𐑦𐑜𐑟𐑦𐑕𐑑𐑕", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "𐑮𐑰𐑯𐑱𐑥", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "𐑯𐑱𐑥𐑦𐑙 𐑐𐑨𐑑𐑼𐑯", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "𐑦𐑯𐑕𐑻𐑑 𐑓𐑰𐑤𐑛", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "𐑐𐑮𐑰𐑝𐑿", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "𐑒𐑬𐑯𐑑𐑼", + "@renameProcessorCounter": {}, + "renameProcessorHash": "𐑣𐑨𐑖", + "@renameProcessorHash": {}, + "renameProcessorName": "𐑯𐑱𐑥", + "@renameProcessorName": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{¿𐑛𐑦𐑤𐑰𐑑 𐑞𐑦𐑕 𐑨𐑤𐑚𐑩𐑥 𐑯 𐑞 𐑲𐑑𐑩𐑥 𐑦𐑯 𐑦𐑑?} other{¿𐑛𐑦𐑤𐑰𐑑 𐑞𐑦𐑕 𐑨𐑤𐑚𐑩𐑥 𐑯 𐑞 {count} 𐑲𐑑𐑩𐑥𐑟 𐑦𐑯 𐑦𐑑?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{¿𐑛𐑦𐑤𐑰𐑑 𐑞𐑰𐑟 𐑨𐑤𐑚𐑩𐑥𐑟 𐑯 𐑞 𐑲𐑑𐑩𐑥 𐑦𐑯 𐑞𐑧𐑥?} other{¿𐑛𐑦𐑤𐑰𐑑 𐑞𐑰𐑟 𐑨𐑤𐑚𐑩𐑥𐑟 𐑯 𐑞 {count} 𐑲𐑑𐑩𐑥𐑟 𐑦𐑯 𐑞𐑧𐑥?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "exportEntryDialogFormat": "𐑓𐑹𐑥𐑨𐑑:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "𐑢𐑦𐑛𐑔", + "@exportEntryDialogWidth": {}, + "exportEntryDialogWriteMetadata": "𐑮𐑲𐑑 𐑥𐑧𐑑𐑩𐑛𐑱𐑑𐑩", + "@exportEntryDialogWriteMetadata": {}, + "renameEntryDialogLabel": "𐑯𐑿 𐑯𐑱𐑥", + "@renameEntryDialogLabel": {}, + "editEntryDialogCopyFromItem": "𐑒𐑪𐑐𐑦 𐑓𐑮𐑪𐑥 𐑳𐑞𐑼 𐑲𐑑𐑩𐑥", + "@editEntryDialogCopyFromItem": {}, + "editEntryDialogTargetFieldsHeader": "𐑓𐑰𐑤𐑛𐑟 𐑑 𐑥𐑪𐑛𐑦𐑓𐑲", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "𐑛𐑱𐑑 𐑯 𐑑𐑲𐑥", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "𐑕𐑧𐑑 𐑒𐑳𐑕𐑑𐑩𐑥 𐑛𐑱𐑑", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "𐑒𐑪𐑐𐑦 𐑓𐑮𐑪𐑥 𐑳𐑞𐑼 𐑛𐑱𐑑", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogExtractFromTitle": "𐑦𐑒𐑕𐑑𐑮𐑨𐑒𐑑 𐑓𐑮𐑪𐑥 𐑑𐑲𐑑𐑩𐑤", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "𐑖𐑦𐑓𐑑", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "𐑓𐑲𐑤 𐑥𐑪𐑛𐑦𐑓𐑲𐑛 𐑛𐑱𐑑", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "𐑬𐑼𐑟", + "@durationDialogHours": {}, + "durationDialogMinutes": "𐑥𐑦𐑯𐑦𐑑𐑕", + "@durationDialogMinutes": {}, + "editEntryLocationDialogTitle": "𐑤𐑴𐑒𐑱𐑖𐑩𐑯", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogSetCustom": "𐑕𐑧𐑑 𐑒𐑳𐑕𐑑𐑩𐑥 𐑤𐑴𐑒𐑱𐑖𐑩𐑯", + "@editEntryLocationDialogSetCustom": {}, + "locationPickerUseThisLocationButton": "𐑿𐑟 𐑞𐑦𐑕 𐑤𐑴𐑒𐑱𐑖𐑩𐑯", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "𐑮𐑱𐑑𐑦𐑙", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "𐑥𐑧𐑑𐑩𐑛𐑱𐑑𐑩 𐑮𐑦𐑥𐑵𐑝𐑩𐑤", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "𐑥𐑹", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "⸰𐑦𐑥𐑐 𐑦𐑟 𐑮𐑦𐑒𐑢𐑲𐑼𐑛 𐑑 𐑐𐑤𐑱 𐑞 𐑝𐑦𐑛𐑦𐑴 𐑦𐑯𐑕𐑲𐑛 𐑩 𐑥𐑴𐑖𐑩𐑯 𐑓𐑴𐑑𐑴.\n\n¿𐑸 𐑿 𐑖𐑫𐑼 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑮𐑦𐑥𐑵𐑝 𐑦𐑑?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "videoSpeedDialogLabel": "𐑐𐑤𐑱𐑚𐑨𐑒 𐑕𐑐𐑰𐑛", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "𐑝𐑦𐑛𐑦𐑴", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogOff": "𐑪𐑓", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "𐑑𐑮𐑨𐑒", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "𐑞𐑺 𐑸 𐑯𐑴 𐑳𐑞𐑼 𐑑𐑮𐑨𐑒𐑕.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "¡𐑛𐑳𐑯!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "𐑓𐑱𐑤𐑛", + "@genericFailureFeedback": {}, + "genericDangerWarningDialogMessage": "¿𐑸 𐑿 𐑖𐑫𐑼?", + "@genericDangerWarningDialogMessage": {}, + "tooManyItemsErrorDialogMessage": "𐑑𐑮𐑲 𐑩𐑜𐑧𐑯 𐑢𐑦𐑞 𐑓𐑿𐑼 𐑲𐑑𐑩𐑥𐑟.", + "@tooManyItemsErrorDialogMessage": {}, + "menuActionConfigureView": "𐑝𐑿", + "@menuActionConfigureView": {}, + "menuActionSelect": "𐑕𐑦𐑤𐑧𐑒𐑑", + "@menuActionSelect": {}, + "menuActionSelectAll": "𐑕𐑦𐑤𐑧𐑒𐑑 𐑷𐑤", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "𐑕𐑦𐑤𐑧𐑒𐑑 𐑯𐑳𐑯", + "@menuActionSelectNone": {}, + "menuActionMap": "𐑥𐑨𐑐", + "@menuActionMap": {}, + "menuActionSlideshow": "𐑕𐑤𐑲𐑛𐑖𐑴", + "@menuActionSlideshow": {}, + "menuActionStats": "𐑕𐑑𐑨𐑑𐑕", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "𐑕𐑹𐑑", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "𐑕𐑦𐑤𐑧𐑒𐑖𐑩𐑯𐑟", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "𐑤𐑱𐑬𐑑", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "𐑮𐑦𐑝𐑻𐑕 𐑕𐑹𐑑 𐑹𐑛𐑼", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "𐑥𐑴𐑟𐑱𐑦𐑒", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "𐑜𐑮𐑦𐑛", + "@tileLayoutGrid": {}, + "tileLayoutList": "𐑤𐑦𐑕𐑑", + "@tileLayoutList": {}, + "castDialogTitle": "𐑒𐑭𐑕𐑑 𐑛𐑦𐑝𐑲𐑕𐑩𐑟", + "@castDialogTitle": {}, + "coverDialogTabCover": "𐑒𐑳𐑝𐑼", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "𐑨𐑐", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "𐑒𐑳𐑤𐑼", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "𐑐𐑦𐑒 𐑨𐑐", + "@appPickDialogTitle": {}, + "appPickDialogNone": "𐑯𐑳𐑯", + "@appPickDialogNone": {}, + "aboutPageTitle": "𐑩𐑚𐑬𐑑", + "@aboutPageTitle": {}, + "aboutLinkLicense": "𐑤𐑲𐑕𐑩𐑯𐑕", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "𐑐𐑮𐑦𐑝𐑩𐑕𐑦 𐑐𐑪𐑤𐑩𐑕𐑦", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "𐑚𐑳𐑜 𐑮𐑦𐑐𐑹𐑑", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "𐑕𐑱𐑝 𐑨𐑐 𐑤𐑪𐑜𐑟 𐑑 𐑩 𐑓𐑲𐑤", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "𐑒𐑪𐑐𐑦 𐑕𐑦𐑕𐑑𐑩𐑥 𐑦𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "𐑒𐑪𐑐𐑦", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "𐑮𐑦𐑐𐑹𐑑 𐑪𐑯 ·𐑜𐑦𐑑𐑣𐑳𐑚 𐑢𐑦𐑞 𐑞 𐑤𐑪𐑜𐑟 𐑯 𐑕𐑦𐑕𐑑𐑩𐑥 𐑦𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "𐑮𐑦𐑐𐑹𐑑", + "@aboutBugReportButton": {}, + "aboutDataUsageSectionTitle": "𐑛𐑱𐑑𐑩 𐑿𐑕𐑦𐑡", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageData": "𐑛𐑱𐑑𐑩", + "@aboutDataUsageData": {}, + "aboutDataUsageCache": "𐑒𐑨𐑖", + "@aboutDataUsageCache": {}, + "aboutDataUsageDatabase": "𐑛𐑱𐑑𐑩𐑚𐑱𐑕", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageMisc": "𐑥𐑦𐑕𐑤.", + "@aboutDataUsageMisc": {}, + "aboutDataUsageInternal": "𐑦𐑯𐑑𐑻𐑯𐑩𐑤", + "@aboutDataUsageInternal": {}, + "aboutDataUsageClearCache": "𐑒𐑤𐑽 𐑒𐑨𐑖", + "@aboutDataUsageClearCache": {}, + "aboutCreditsSectionTitle": "𐑒𐑮𐑧𐑛𐑦𐑑𐑕", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "𐑞𐑦𐑕 𐑨𐑐 𐑿𐑟𐑩𐑟 𐑩 ⸰𐑑𐑪𐑐𐑩𐑡𐑕𐑪𐑯 𐑓𐑲𐑤 𐑓𐑮𐑪𐑥", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "𐑳𐑯𐑛𐑼 ⸰𐑦𐑕𐑒 𐑤𐑲𐑕𐑩𐑯𐑕.", + "@aboutCreditsWorldAtlas2": {}, + "aboutLicensesBanner": "𐑞𐑦𐑕 𐑨𐑐 𐑿𐑟𐑩𐑟 𐑞 𐑓𐑪𐑤𐑴𐑦𐑙 𐑴𐑐𐑩𐑯-𐑕𐑹𐑕 𐑐𐑨𐑒𐑦𐑡𐑩𐑟 𐑯 𐑤𐑲𐑚𐑮𐑼𐑦𐑟.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "·𐑨𐑯𐑛𐑮𐑶𐑛 𐑤𐑲𐑚𐑮𐑼𐑦𐑟", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "·𐑓𐑤𐑳𐑑𐑼 𐑐𐑤𐑳𐑜𐑦𐑯𐑟", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "·𐑓𐑤𐑳𐑑𐑼 𐑐𐑨𐑒𐑦𐑡𐑩𐑟", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "·𐑛𐑸𐑑 𐑐𐑨𐑒𐑦𐑡𐑩𐑟", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "𐑖𐑴 𐑷𐑤 𐑤𐑲𐑕𐑩𐑯𐑕𐑩𐑟", + "@aboutLicensesShowAllButtonLabel": {}, + "collectionPickPageTitle": "𐑐𐑦𐑒", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "𐑕𐑦𐑤𐑧𐑒𐑑 𐑲𐑑𐑩𐑥𐑟", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "𐑖𐑴 𐑑𐑲𐑑𐑩𐑤 𐑓𐑦𐑤𐑑𐑼", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "𐑣𐑲𐑛 𐑑𐑲𐑑𐑩𐑤 𐑓𐑦𐑤𐑑𐑼", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "𐑨𐑛 𐑖𐑹𐑑𐑒𐑳𐑑", + "@collectionActionAddShortcut": {}, + "collectionActionSetHome": "𐑕𐑧𐑑 𐑨𐑟 𐑣𐑴𐑥", + "@collectionActionSetHome": {}, + "collectionActionCopy": "𐑒𐑪𐑐𐑦 𐑑 𐑨𐑤𐑚𐑩𐑥", + "@collectionActionCopy": {}, + "collectionActionMove": "𐑥𐑵𐑝 𐑑 𐑨𐑤𐑚𐑩𐑥", + "@collectionActionMove": {}, + "collectionActionRescan": "𐑮𐑰𐑕𐑒𐑨𐑯", + "@collectionActionRescan": {}, + "collectionSearchTitlesHintText": "𐑕𐑻𐑗 𐑑𐑲𐑑𐑩𐑤𐑟", + "@collectionSearchTitlesHintText": {}, + "collectionGroupMonth": "𐑚𐑲 𐑥𐑳𐑯𐑔", + "@collectionGroupMonth": {}, + "collectionGroupDay": "𐑚𐑲 𐑛𐑱", + "@collectionGroupDay": {}, + "sectionUnknown": "𐑳𐑯𐑯𐑴𐑯", + "@sectionUnknown": {}, + "dateToday": "𐑑𐑫𐑛𐑱", + "@dateToday": {}, + "dateYesterday": "𐑘𐑧𐑕𐑑𐑼𐑛𐑱", + "@dateYesterday": {}, + "dateThisMonth": "𐑞𐑦𐑕 𐑥𐑳𐑯𐑔", + "@dateThisMonth": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{𐑓𐑱𐑤𐑛 𐑑 𐑒𐑪𐑐𐑦 1 𐑲𐑑𐑩𐑥} other{𐑓𐑱𐑤𐑛 𐑑 𐑒𐑪𐑐𐑦 {count} 𐑲𐑑𐑩𐑥𐑟}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{𐑓𐑱𐑤𐑛 𐑑 𐑥𐑵𐑝 1 𐑲𐑑𐑩𐑥} other{𐑓𐑱𐑤𐑛 𐑑 𐑥𐑵𐑝 {count} 𐑲𐑑𐑩𐑥𐑟}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionRenameFailureFeedback": "{count, plural, =1{𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑯𐑱𐑥 1 𐑲𐑑𐑩𐑥} other{𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑯𐑱𐑥 {count} 𐑲𐑑𐑩𐑥𐑟}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{𐑓𐑱𐑤𐑛 𐑑 𐑧𐑛𐑦𐑑 1 𐑲𐑑𐑩𐑥} other{𐑓𐑱𐑤𐑛 𐑑 𐑧𐑛𐑦𐑑 {count} 𐑲𐑑𐑩𐑥𐑟}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{𐑓𐑱𐑤𐑛 𐑑 𐑦𐑒𐑕𐑐𐑹𐑑 1 𐑐𐑱𐑡} other{𐑓𐑱𐑤𐑛 𐑑 𐑦𐑒𐑕𐑐𐑹𐑑 {count} 𐑐𐑱𐑡𐑩𐑟}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, =1{𐑒𐑪𐑐𐑦𐑛 1 𐑲𐑑𐑩𐑥} other{𐑒𐑪𐑐𐑦𐑛 {count} 𐑲𐑑𐑩𐑥𐑟}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{𐑮𐑰𐑯𐑱𐑥𐑛 1 𐑲𐑑𐑩𐑥} other{𐑮𐑰𐑯𐑱𐑥𐑛 {count} 𐑲𐑑𐑩𐑥𐑟}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{𐑧𐑛𐑦𐑑𐑩𐑛 1 𐑲𐑑𐑩𐑥} other{𐑧𐑛𐑦𐑑𐑩𐑛 {count} 𐑲𐑑𐑩𐑥𐑟}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEmptyFavourites": "𐑯𐑴 𐑓𐑱𐑝𐑼𐑦𐑑𐑕", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "𐑯𐑴 𐑝𐑦𐑛𐑦𐑴𐑟", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "𐑯𐑴 𐑦𐑥𐑦𐑡𐑩𐑟", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "𐑜𐑮𐑭𐑯𐑑 𐑨𐑒𐑕𐑧𐑕", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "𐑕𐑦𐑤𐑧𐑒𐑑 𐑕𐑧𐑒𐑖𐑩𐑯", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "𐑛𐑰𐑕𐑦𐑤𐑧𐑒𐑑 𐑕𐑧𐑒𐑖𐑩𐑯", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "𐑩𐑚𐑬𐑑", + "@drawerAboutButton": {}, + "drawerSettingsButton": "𐑕𐑧𐑑𐑦𐑙𐑟", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "𐑷𐑤 𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "𐑓𐑱𐑝𐑼𐑦𐑑𐑕", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "𐑦𐑥𐑦𐑡𐑩𐑟", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "𐑝𐑦𐑛𐑦𐑴𐑟", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "𐑨𐑯𐑦𐑥𐑱𐑑𐑩𐑛", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "𐑥𐑴𐑖𐑩𐑯 𐑓𐑴𐑑𐑴𐑟", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "𐑐𐑨𐑯𐑼𐑭𐑥𐑩𐑟", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "𐑮𐑷 𐑓𐑴𐑑𐑴𐑟", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "360° 𐑝𐑦𐑛𐑦𐑴𐑟", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "𐑨𐑤𐑚𐑩𐑥𐑟", + "@drawerAlbumPage": {}, + "drawerCountryPage": "𐑒𐑳𐑯𐑑𐑮𐑦𐑟", + "@drawerCountryPage": {}, + "drawerPlacePage": "𐑐𐑤𐑱𐑕𐑩𐑟", + "@drawerPlacePage": {}, + "drawerTagPage": "𐑑𐑨𐑜𐑟", + "@drawerTagPage": {}, + "sortByDate": "𐑚𐑲 𐑛𐑱𐑑", + "@sortByDate": {}, + "sortByName": "𐑚𐑲 𐑯𐑱𐑥", + "@sortByName": {}, + "sortByItemCount": "𐑚𐑲 𐑲𐑑𐑩𐑥 𐑒𐑬𐑯𐑑", + "@sortByItemCount": {}, + "sortBySize": "𐑚𐑲 𐑕𐑲𐑟", + "@sortBySize": {}, + "sortByAlbumFileName": "𐑚𐑲 𐑨𐑤𐑚𐑩𐑥 𐑯 𐑲𐑑𐑩𐑥 𐑑𐑲𐑑𐑩𐑤", + "@sortByAlbumFileName": {}, + "sortByRating": "𐑚𐑲 𐑮𐑱𐑑𐑦𐑙", + "@sortByRating": {}, + "sortByDuration": "𐑚𐑲 𐑛𐑘𐑫𐑼𐑱𐑖𐑩𐑯", + "@sortByDuration": {}, + "sortOrderNewestFirst": "𐑯𐑿𐑩𐑕𐑑 𐑓𐑻𐑕𐑑", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "𐑴𐑤𐑛𐑩𐑕𐑑 𐑓𐑻𐑕𐑑", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "·𐑐 𐑑 ·𐑿", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "·𐑿 𐑑 ·𐑐", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "𐑣𐑲𐑩𐑕𐑑 𐑓𐑻𐑕𐑑", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "𐑤𐑴𐑩𐑕𐑑 𐑓𐑻𐑕𐑑", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "𐑤𐑸𐑡𐑩𐑕𐑑 𐑓𐑻𐑕𐑑", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "𐑕𐑥𐑷𐑤𐑩𐑕𐑑 𐑓𐑻𐑕𐑑", + "@sortOrderSmallestFirst": {}, + "sortOrderShortestFirst": "𐑖𐑹𐑑𐑩𐑕𐑑 𐑓𐑻𐑕𐑑", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "𐑤𐑪𐑙𐑜𐑩𐑕𐑑 𐑓𐑻𐑕𐑑", + "@sortOrderLongestFirst": {}, + "albumGroupTier": "𐑚𐑲 𐑑𐑽", + "@albumGroupTier": {}, + "albumGroupType": "𐑚𐑲 𐑑𐑲𐑐", + "@albumGroupType": {}, + "albumGroupVolume": "𐑚𐑲 𐑕𐑑𐑹𐑦𐑡 𐑝𐑪𐑤𐑿𐑥", + "@albumGroupVolume": {}, + "albumMimeTypeMixed": "𐑥𐑦𐑒𐑕𐑑", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "𐑒𐑪𐑐𐑦 𐑑 𐑨𐑤𐑚𐑩𐑥", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "𐑦𐑒𐑕𐑐𐑹𐑑 𐑑 𐑨𐑤𐑚𐑩𐑥", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "𐑥𐑵𐑝 𐑑 𐑨𐑤𐑚𐑩𐑥", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "𐑐𐑦𐑒 𐑨𐑤𐑚𐑩𐑥", + "@albumPickPageTitlePick": {}, + "albumCamera": "𐑒𐑨𐑥𐑼𐑩", + "@albumCamera": {}, + "albumDownload": "𐑛𐑬𐑯𐑤𐑴𐑛", + "@albumDownload": {}, + "albumScreenshots": "𐑕𐑒𐑮𐑰𐑯𐑖𐑪𐑑𐑕", + "@albumScreenshots": {}, + "albumScreenRecordings": "𐑕𐑒𐑮𐑰𐑯 𐑮𐑦𐑒𐑹𐑛𐑦𐑙𐑟", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "𐑝𐑦𐑛𐑦𐑴 𐑒𐑨𐑐𐑗𐑼𐑟", + "@albumVideoCaptures": {}, + "albumPageTitle": "𐑨𐑤𐑚𐑩𐑥𐑟", + "@albumPageTitle": {}, + "albumEmpty": "𐑯𐑴 𐑨𐑤𐑚𐑩𐑥𐑟", + "@albumEmpty": {}, + "createAlbumButtonLabel": "𐑒𐑮𐑦𐑱𐑑", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "𐑯𐑿", + "@newFilterBanner": {}, + "countryPageTitle": "𐑒𐑳𐑯𐑑𐑮𐑦𐑟", + "@countryPageTitle": {}, + "countryEmpty": "𐑯𐑴 𐑒𐑳𐑯𐑑𐑮𐑦𐑟", + "@countryEmpty": {}, + "statePageTitle": "𐑕𐑑𐑱𐑑𐑕", + "@statePageTitle": {}, + "stateEmpty": "𐑯𐑴 𐑕𐑑𐑱𐑑𐑕", + "@stateEmpty": {}, + "placePageTitle": "𐑐𐑤𐑱𐑕𐑩𐑟", + "@placePageTitle": {}, + "placeEmpty": "𐑯𐑴 𐑐𐑤𐑱𐑕𐑩𐑟", + "@placeEmpty": {}, + "tagPageTitle": "𐑑𐑨𐑜𐑟", + "@tagPageTitle": {}, + "tagEmpty": "𐑯𐑴 𐑑𐑨𐑜𐑟", + "@tagEmpty": {}, + "binPageTitle": "𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯", + "@binPageTitle": {}, + "explorerPageTitle": "𐑦𐑒𐑕𐑐𐑤𐑹𐑼", + "@explorerPageTitle": {}, + "explorerActionSelectStorageVolume": "𐑕𐑦𐑤𐑧𐑒𐑑 𐑕𐑑𐑹𐑦𐑡", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "𐑕𐑦𐑤𐑧𐑒𐑑 𐑕𐑑𐑹𐑦𐑡", + "@selectStorageVolumeDialogTitle": {}, + "searchRecentSectionTitle": "𐑮𐑰𐑕𐑩𐑯𐑑", + "@searchRecentSectionTitle": {}, + "searchCountriesSectionTitle": "𐑒𐑳𐑯𐑑𐑮𐑦𐑟", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "𐑐𐑤𐑱𐑕𐑩𐑟", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "𐑑𐑨𐑜𐑟", + "@searchTagsSectionTitle": {}, + "searchMetadataSectionTitle": "𐑥𐑧𐑑𐑩𐑛𐑱𐑑𐑩", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "𐑕𐑧𐑑𐑦𐑙𐑟", + "@settingsPageTitle": {}, + "settingsSystemDefault": "𐑕𐑦𐑕𐑑𐑩𐑥 𐑛𐑦𐑓𐑷𐑤𐑑", + "@settingsSystemDefault": {}, + "settingsDefault": "𐑛𐑦𐑓𐑷𐑤𐑑", + "@settingsDefault": {}, + "settingsDisabled": "𐑛𐑦𐑕𐑱𐑚𐑩𐑤𐑛", + "@settingsDisabled": {}, + "settingsAskEverytime": "𐑭𐑕𐑒 𐑧𐑝𐑮𐑦𐑑𐑲𐑥", + "@settingsAskEverytime": {}, + "settingsModificationWarningDialogMessage": "𐑳𐑞𐑼 𐑕𐑧𐑑𐑦𐑙𐑟 𐑢𐑦𐑤 𐑚𐑰 𐑥𐑪𐑛𐑦𐑓𐑲𐑛.", + "@settingsModificationWarningDialogMessage": {}, + "settingsSearchFieldLabel": "𐑕𐑻𐑗 𐑕𐑧𐑑𐑦𐑙𐑟", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "𐑯𐑴 𐑥𐑨𐑗𐑦𐑙 𐑕𐑧𐑑𐑦𐑙", + "@settingsSearchEmpty": {}, + "settingsActionExportDialogTitle": "𐑦𐑒𐑕𐑐𐑹𐑑", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "𐑦𐑥𐑐𐑹𐑑", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "𐑦𐑥𐑐𐑹𐑑", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "𐑒𐑳𐑝𐑼𐑟", + "@appExportCovers": {}, + "appExportSettings": "𐑕𐑧𐑑𐑦𐑙𐑟", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "𐑯𐑨𐑝𐑦𐑜𐑱𐑖𐑩𐑯", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "𐑣𐑴𐑥", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "𐑣𐑴𐑥", + "@settingsHomeDialogTitle": {}, + "settingsKeepScreenOnTile": "𐑒𐑰𐑐 𐑕𐑒𐑮𐑰𐑯 𐑪𐑯", + "@settingsKeepScreenOnTile": {}, + "settingsDoubleBackExit": "𐑑𐑨𐑐 «𐑚𐑨𐑒» 𐑑𐑢𐑲𐑕 𐑑 𐑧𐑒𐑕𐑦𐑑", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "𐑒𐑪𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯 𐑛𐑲𐑩𐑤𐑪𐑜𐑟", + "@settingsConfirmationTile": {}, + "settingsConfirmationBeforeDeleteItems": "𐑭𐑕𐑒 𐑚𐑦𐑓𐑹 𐑛𐑦𐑤𐑰𐑑𐑦𐑙 𐑲𐑑𐑩𐑥𐑟 𐑓𐑼𐑧𐑝𐑼", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "𐑭𐑕𐑒 𐑚𐑦𐑓𐑹 𐑥𐑵𐑝𐑦𐑙 𐑲𐑑𐑩𐑥𐑟 𐑑 𐑞 𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "𐑭𐑕𐑒 𐑚𐑦𐑓𐑹 𐑥𐑵𐑝𐑦𐑙 𐑳𐑯𐑛𐑱𐑑𐑩𐑛 𐑲𐑑𐑩𐑥𐑟", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationVaultDataLoss": "𐑖𐑴 𐑝𐑷𐑤𐑑 𐑛𐑱𐑑𐑩 𐑤𐑪𐑕 𐑢𐑹𐑯𐑦𐑙", + "@settingsConfirmationVaultDataLoss": {}, + "settingsNavigationDrawerTile": "𐑯𐑨𐑝𐑦𐑜𐑱𐑖𐑩𐑯 𐑥𐑧𐑯𐑿", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerBanner": "𐑑𐑳𐑗 𐑯 𐑣𐑴𐑤𐑛 𐑑 𐑥𐑵𐑝 𐑯 𐑮𐑰𐑹𐑛𐑼 𐑥𐑧𐑯𐑿 𐑲𐑑𐑩𐑥𐑟.", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "𐑑𐑲𐑐𐑕", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "𐑨𐑤𐑚𐑩𐑥𐑟", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "𐑐𐑱𐑡𐑩𐑟", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "𐑨𐑛 𐑨𐑤𐑚𐑩𐑥", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "𐑔𐑳𐑥𐑯𐑱𐑤𐑟", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayPageTitle": "𐑴𐑝𐑼𐑤𐑱", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowHdrIcon": "𐑖𐑴 ⸰𐑣𐑛𐑮 𐑲𐑒𐑪𐑯", + "@settingsThumbnailShowHdrIcon": {}, + "settingsThumbnailShowFavouriteIcon": "𐑖𐑴 𐑓𐑱𐑝𐑼𐑦𐑑 𐑲𐑒𐑪𐑯", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "𐑖𐑴 𐑑𐑨𐑜 𐑲𐑒𐑪𐑯", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "𐑖𐑴 𐑤𐑴𐑒𐑱𐑖𐑩𐑯 𐑲𐑒𐑪𐑯", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowRating": "𐑖𐑴 𐑮𐑱𐑑𐑦𐑙", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "𐑖𐑴 𐑮𐑷 𐑲𐑒𐑪𐑯", + "@settingsThumbnailShowRawIcon": {}, + "settingsCollectionQuickActionEditorPageTitle": "𐑒𐑢𐑦𐑒 𐑨𐑒𐑖𐑩𐑯𐑟", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "𐑚𐑮𐑬𐑟𐑦𐑙", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "𐑕𐑦𐑤𐑧𐑒𐑑𐑦𐑙", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "𐑑𐑳𐑗 𐑯 𐑣𐑴𐑤𐑛 𐑑 𐑥𐑵𐑝 𐑚𐑳𐑑𐑩𐑯𐑟 𐑯 𐑕𐑦𐑤𐑧𐑒𐑑 𐑢𐑦𐑗 𐑨𐑒𐑖𐑩𐑯𐑟 𐑸 𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑢𐑧𐑯 𐑚𐑮𐑬𐑟𐑦𐑙 𐑲𐑑𐑩𐑥𐑟.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsThumbnailShowVideoDuration": "𐑖𐑴 𐑝𐑦𐑛𐑦𐑴 𐑛𐑘𐑫𐑼𐑱𐑖𐑩𐑯", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "𐑒𐑢𐑦𐑒 𐑨𐑒𐑖𐑩𐑯𐑟", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "𐑑𐑳𐑗 𐑯 𐑣𐑴𐑤𐑛 𐑑 𐑥𐑵𐑝 𐑚𐑳𐑑𐑩𐑯𐑟 𐑯 𐑕𐑦𐑤𐑧𐑒𐑑 𐑢𐑦𐑗 𐑨𐑒𐑖𐑩𐑯𐑟 𐑸 𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑢𐑧𐑯 𐑕𐑦𐑤𐑧𐑒𐑑𐑦𐑙 𐑲𐑑𐑩𐑥𐑟.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsCollectionBurstPatternsTile": "𐑚𐑻𐑕𐑑 𐑐𐑨𐑑𐑼𐑯𐑟", + "@settingsCollectionBurstPatternsTile": {}, + "settingsCollectionBurstPatternsNone": "𐑯𐑳𐑯", + "@settingsCollectionBurstPatternsNone": {}, + "settingsViewerSectionTitle": "𐑝𐑿𐑼", + "@settingsViewerSectionTitle": {}, + "settingsViewerGestureSideTapNext": "𐑑𐑨𐑐 𐑪𐑯 𐑕𐑒𐑮𐑰𐑯 𐑧𐑡𐑩𐑟 𐑑 𐑖𐑴 𐑐𐑮𐑰𐑝𐑾𐑕/𐑯𐑧𐑒𐑕𐑑 𐑲𐑑𐑩𐑥", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerUseCutout": "𐑿𐑟 𐑒𐑳𐑑𐑬𐑑 𐑺𐑾", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "𐑥𐑨𐑒𐑕𐑦𐑥𐑩𐑥 𐑚𐑮𐑲𐑑𐑯𐑩𐑕", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "𐑷𐑑𐑴 𐑐𐑤𐑱 𐑥𐑴𐑖𐑩𐑯 𐑓𐑴𐑑𐑴𐑟", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "𐑦𐑥𐑦𐑡 𐑚𐑨𐑒𐑜𐑮𐑬𐑯𐑛", + "@settingsImageBackground": {}, + "settingsViewerQuickActionEditorBanner": "𐑑𐑳𐑗 𐑯 𐑣𐑴𐑤𐑛 𐑑 𐑥𐑵𐑝 𐑚𐑳𐑑𐑩𐑯𐑟 𐑯 𐑕𐑦𐑤𐑧𐑒𐑑 𐑢𐑦𐑗 𐑨𐑒𐑖𐑩𐑯𐑟 𐑸 𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑦𐑯 𐑞 𐑝𐑿𐑼.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑚𐑳𐑑𐑩𐑯𐑟", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionsTile": "𐑒𐑢𐑦𐑒 𐑨𐑒𐑖𐑩𐑯𐑟", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "𐑒𐑢𐑦𐑒 𐑨𐑒𐑖𐑩𐑯𐑟", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "𐑩𐑝𐑱𐑤𐑩𐑚𐑩𐑤 𐑚𐑳𐑑𐑩𐑯𐑟", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "𐑯𐑴 𐑚𐑳𐑑𐑩𐑯𐑟", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "𐑴𐑝𐑼𐑤𐑱", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "𐑴𐑝𐑼𐑤𐑱", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "𐑖𐑴 𐑪𐑯 𐑴𐑐𐑩𐑯𐑦𐑙", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowHistogram": "𐑖𐑴 𐑣𐑦𐑕𐑑𐑩𐑜𐑮𐑨𐑥", + "@settingsViewerShowHistogram": {}, + "settingsViewerShowMinimap": "𐑖𐑴 𐑥𐑦𐑯𐑦𐑥𐑨𐑐", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "𐑖𐑴 𐑦𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "𐑖𐑴 𐑑𐑲𐑑𐑩𐑤, 𐑛𐑱𐑑, 𐑤𐑴𐑒𐑱𐑖𐑩𐑯, 𐑯𐑯𐑯", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowOverlayThumbnails": "𐑖𐑴 𐑔𐑳𐑥𐑯𐑱𐑤𐑟", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "𐑚𐑤𐑻 𐑦𐑓𐑧𐑒𐑑", + "@settingsViewerEnableOverlayBlurEffect": {}, + "statsTopStatesSectionTitle": "𐑑𐑪𐑐 𐑕𐑑𐑱𐑑𐑕", + "@statsTopStatesSectionTitle": {}, + "statsTopTagsSectionTitle": "𐑑𐑪𐑐 𐑑𐑨𐑜𐑟", + "@statsTopTagsSectionTitle": {}, + "viewerErrorDoesNotExist": "𐑞 𐑓𐑲𐑤 𐑯𐑴 𐑤𐑪𐑙𐑜𐑼 𐑦𐑜𐑟𐑦𐑕𐑑𐑕.", + "@viewerErrorDoesNotExist": {}, + "statsTopAlbumsSectionTitle": "𐑑𐑪𐑐 𐑨𐑤𐑚𐑩𐑥𐑟", + "@statsTopAlbumsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "𐑴𐑐𐑩𐑯 𐑐𐑨𐑯𐑼𐑭𐑥𐑩", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "𐑕𐑧𐑑 𐑢𐑷𐑤𐑐𐑱𐑐𐑼", + "@viewerSetWallpaperButtonLabel": {}, + "viewerInfoPageTitle": "𐑦𐑯𐑓𐑴", + "@viewerInfoPageTitle": {}, + "mapAttributionOpenTopoMap": "[⸰𐑖𐑮𐑑𐑥](https://www.earthdata.nasa.gov/sensors/srtm) | 𐑑𐑲𐑤𐑟 𐑚𐑲 [·𐑴𐑐𐑩𐑯𐑑𐑪𐑐𐑩𐑥𐑨𐑐](https://opentopomap.org), [⸰𐑒𐑒 𐑚𐑲-𐑖𐑩](https://creativecommons.org/licenses/by-sa/3.0)", + "@mapAttributionOpenTopoMap": {}, + "mapAttributionOsmHot": "𐑑𐑲𐑤𐑟 𐑚𐑲 [⸰𐑣𐑴𐑑](https://www.hotosm.org) • 𐑣𐑴𐑕𐑑𐑩𐑛 𐑚𐑲 [⸰𐑴𐑕𐑥 ·𐑓𐑮𐑭𐑯𐑕](https://openstreetmap.fr)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "𐑑𐑲𐑤𐑟 𐑚𐑲 [·𐑕𐑑𐑱𐑥𐑩𐑯 𐑛𐑦𐑟𐑲𐑯](https://stamen.com), [⸰𐑒𐑒 𐑚𐑲 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "settingsViewerShowShootingDetails": "𐑖𐑴 𐑖𐑵𐑑𐑦𐑙 𐑛𐑰𐑑𐑱𐑤𐑟", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowDescription": "𐑖𐑴 𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯", + "@settingsViewerShowDescription": {}, + "settingsViewerSlideshowTile": "𐑕𐑤𐑲𐑛𐑖𐑴", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "𐑕𐑤𐑲𐑛𐑖𐑴", + "@settingsViewerSlideshowPageTitle": {}, + "settingsViewerShowRatingTags": "𐑖𐑴 𐑮𐑱𐑑𐑦𐑙 𐑯 𐑑𐑨𐑜𐑟", + "@settingsViewerShowRatingTags": {}, + "settingsSlideshowRepeat": "𐑮𐑦𐑐𐑰𐑑", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "𐑖𐑳𐑓𐑩𐑤", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "𐑓𐑦𐑤 𐑕𐑒𐑮𐑰𐑯", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowAnimatedZoomEffect": "𐑨𐑯𐑦𐑥𐑱𐑑𐑩𐑛 𐑟𐑵𐑥 𐑦𐑓𐑧𐑒𐑑", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "𐑑𐑮𐑨𐑯𐑟𐑦𐑖𐑩𐑯", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "𐑦𐑯𐑑𐑼𐑝𐑩𐑤", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "𐑝𐑦𐑛𐑦𐑴 𐑐𐑤𐑱𐑚𐑨𐑒", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "𐑝𐑦𐑛𐑦𐑴 𐑐𐑤𐑱𐑚𐑨𐑒", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "𐑝𐑦𐑛𐑦𐑴 𐑕𐑧𐑑𐑦𐑙𐑟", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "𐑝𐑦𐑛𐑦𐑴", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "𐑖𐑴 𐑝𐑦𐑛𐑦𐑴𐑟", + "@settingsVideoShowVideos": {}, + "settingsVideoPlaybackTile": "𐑐𐑤𐑱𐑚𐑨𐑒", + "@settingsVideoPlaybackTile": {}, + "settingsVideoPlaybackPageTitle": "𐑐𐑤𐑱𐑚𐑨𐑒", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoEnableHardwareAcceleration": "𐑣𐑸𐑛𐑢𐑺 𐑩𐑒𐑕𐑧𐑤𐑼𐑱𐑖𐑩𐑯", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "𐑷𐑑𐑴 𐑐𐑤𐑱", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "𐑤𐑵𐑐 𐑥𐑴𐑛", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "𐑤𐑵𐑐 𐑥𐑴𐑛", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsVideoResumptionModeTile": "𐑮𐑦𐑟𐑿𐑥 𐑐𐑤𐑱𐑚𐑨𐑒", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoResumptionModeDialogTitle": "𐑮𐑦𐑟𐑿𐑥 𐑐𐑤𐑱𐑚𐑨𐑒", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsVideoBackgroundMode": "𐑚𐑨𐑒𐑜𐑮𐑬𐑯𐑛 𐑥𐑴𐑛", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "𐑚𐑨𐑒𐑜𐑮𐑬𐑯𐑛 𐑥𐑴𐑛", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsVideoControlsTile": "𐑒𐑩𐑯𐑑𐑮𐑴𐑤𐑟", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "𐑒𐑩𐑯𐑑𐑮𐑴𐑤𐑟", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "𐑚𐑳𐑑𐑩𐑯𐑟", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "𐑛𐑳𐑚𐑩𐑤 𐑑𐑨𐑐 𐑑 𐑐𐑤𐑱/𐑐𐑷𐑟", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "𐑛𐑳𐑚𐑩𐑤 𐑑𐑨𐑐 𐑪𐑯 𐑕𐑒𐑮𐑰𐑯 𐑧𐑡𐑩𐑟 𐑑 𐑕𐑰𐑒 𐑚𐑨𐑒𐑢𐑼𐑛/𐑓𐑹𐑢𐑼𐑛", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "𐑕𐑢𐑲𐑐 𐑳𐑐 𐑹 𐑛𐑬𐑯 𐑑 𐑩𐑡𐑳𐑕𐑑 𐑚𐑮𐑲𐑑𐑯𐑩𐑕/𐑝𐑪𐑤𐑿𐑥", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsSubtitleThemeTile": "𐑕𐑳𐑚𐑑𐑲𐑑𐑩𐑤𐑟", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "𐑕𐑳𐑚𐑑𐑲𐑑𐑩𐑤𐑟", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "𐑞𐑦𐑕 𐑦𐑟 𐑩 𐑕𐑭𐑥𐑐𐑩𐑤.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "𐑑𐑧𐑒𐑕𐑑 𐑩𐑤𐑲𐑯𐑥𐑩𐑯𐑑", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "𐑑𐑧𐑒𐑕𐑑 𐑩𐑤𐑲𐑯𐑥𐑩𐑯𐑑", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextPositionTile": "𐑑𐑧𐑒𐑕𐑑 𐑐𐑩𐑟𐑦𐑖𐑩𐑯", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "𐑑𐑧𐑒𐑕𐑑 𐑐𐑩𐑟𐑦𐑖𐑩𐑯", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSubtitleThemeTextSize": "𐑑𐑧𐑒𐑕𐑑 𐑕𐑲𐑟", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "𐑖𐑴 𐑬𐑑𐑤𐑲𐑯 𐑯 𐑖𐑨𐑛𐑴", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "𐑑𐑧𐑒𐑕𐑑 𐑒𐑳𐑤𐑼", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "𐑑𐑧𐑒𐑕𐑑 𐑴𐑐𐑨𐑕𐑦𐑑𐑦", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "𐑚𐑨𐑒𐑜𐑮𐑬𐑯𐑛 𐑒𐑳𐑤𐑼", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "𐑚𐑨𐑒𐑜𐑮𐑬𐑯𐑛 𐑴𐑐𐑨𐑕𐑦𐑑𐑦", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "𐑤𐑧𐑓𐑑", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "𐑕𐑧𐑯𐑑𐑼", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "𐑮𐑲𐑑", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsPrivacySectionTitle": "𐑐𐑮𐑦𐑝𐑩𐑕𐑦", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "𐑩𐑤𐑬 𐑨𐑒𐑕𐑧𐑕 𐑑 𐑨𐑐 𐑦𐑯𐑝𐑩𐑯𐑑𐑼𐑦", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "𐑿𐑟𐑛 𐑑 𐑦𐑥𐑐𐑮𐑵𐑝 𐑨𐑤𐑚𐑩𐑥 𐑛𐑦𐑕𐑐𐑤𐑱", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "𐑩𐑤𐑬 𐑩𐑯𐑪𐑯𐑦𐑥𐑩𐑕 𐑧𐑮𐑼 𐑮𐑦𐑐𐑹𐑑𐑦𐑙", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "𐑕𐑱𐑝 𐑕𐑻𐑗 𐑣𐑦𐑕𐑑𐑼𐑦", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "𐑿𐑟 𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "𐑒𐑰𐑐 𐑛𐑦𐑤𐑰𐑑𐑩𐑛 𐑲𐑑𐑩𐑥𐑟 𐑓 30 𐑛𐑱𐑟", + "@settingsEnableBinSubtitle": {}, + "settingsDisablingBinWarningDialogMessage": "𐑲𐑑𐑩𐑥𐑟 𐑦𐑯 𐑞 𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯 𐑢𐑦𐑤 𐑚𐑰 𐑛𐑦𐑤𐑰𐑑𐑩𐑛 𐑓𐑼𐑧𐑝𐑼.", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsAllowMediaManagement": "𐑩𐑤𐑬 𐑥𐑰𐑛𐑾 𐑥𐑨𐑯𐑦𐑡𐑥𐑩𐑯𐑑", + "@settingsAllowMediaManagement": {}, + "settingsHiddenItemsTile": "𐑣𐑦𐑛𐑩𐑯 𐑲𐑑𐑩𐑥𐑟", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "𐑣𐑦𐑛𐑩𐑯 𐑲𐑑𐑩𐑥𐑟", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "𐑓𐑴𐑑𐑴𐑟 𐑯 𐑝𐑦𐑛𐑦𐑴𐑟 𐑥𐑨𐑗𐑦𐑙 𐑣𐑦𐑛𐑩𐑯 𐑓𐑦𐑤𐑑𐑼𐑟 𐑢𐑦𐑤 𐑯𐑪𐑑 𐑩𐑐𐑽 𐑦𐑯 𐑘𐑹 𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "𐑯𐑴 𐑣𐑦𐑛𐑩𐑯 𐑓𐑦𐑤𐑑𐑼𐑟", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "𐑕𐑑𐑹𐑦𐑡 𐑨𐑒𐑕𐑧𐑕", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "𐑕𐑑𐑹𐑦𐑡 𐑨𐑒𐑕𐑧𐑕", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessEmpty": "𐑯𐑴 𐑨𐑒𐑕𐑧𐑕 𐑜𐑮𐑭𐑯𐑑𐑕", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "𐑮𐑦𐑝𐑴𐑒", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "𐑩𐑒𐑕𐑧𐑕𐑩𐑚𐑦𐑤𐑦𐑑𐑦", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "𐑮𐑦𐑥𐑵𐑝 𐑨𐑯𐑦𐑥𐑱𐑖𐑩𐑯𐑟", + "@settingsRemoveAnimationsTile": {}, + "settingsStorageAccessBanner": "𐑕𐑳𐑥 𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦𐑟 𐑮𐑦𐑒𐑢𐑲𐑼 𐑩𐑯 𐑦𐑒𐑕𐑐𐑤𐑦𐑕𐑦𐑑 𐑨𐑒𐑕𐑧𐑕 𐑜𐑮𐑭𐑯𐑑 𐑑 𐑥𐑪𐑛𐑦𐑓𐑲 𐑓𐑲𐑤𐑟 𐑦𐑯 𐑞𐑧𐑥. 𐑿 𐑒𐑨𐑯 𐑮𐑦𐑝𐑿 𐑣𐑽 𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦𐑟 𐑑 𐑢𐑦𐑗 𐑿 𐑐𐑮𐑰𐑝𐑾𐑕𐑤𐑦 𐑜𐑱𐑝 𐑨𐑒𐑕𐑧𐑕.", + "@settingsStorageAccessBanner": {}, + "settingsRemoveAnimationsDialogTitle": "𐑮𐑦𐑥𐑵𐑝 𐑨𐑯𐑦𐑥𐑱𐑖𐑩𐑯𐑟", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "𐑑𐑲𐑥 𐑑 𐑑𐑱𐑒 𐑨𐑒𐑖𐑩𐑯", + "@settingsTimeToTakeActionTile": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "𐑖𐑴 𐑥𐑳𐑤𐑑𐑦-𐑑𐑳𐑗 𐑡𐑧𐑕𐑗𐑼 𐑷𐑤𐑑𐑻𐑯𐑩𐑑𐑦𐑝𐑟", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsDisplaySectionTitle": "𐑛𐑦𐑕𐑐𐑤𐑱", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "𐑔𐑰𐑥", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "𐑔𐑰𐑥", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "𐑒𐑳𐑤𐑼 𐑣𐑲𐑤𐑲𐑑𐑕", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "𐑛𐑲𐑯𐑨𐑥𐑦𐑒 𐑒𐑳𐑤𐑼", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "𐑛𐑦𐑕𐑐𐑤𐑱 𐑮𐑦𐑓𐑮𐑧𐑖 𐑮𐑱𐑑", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "𐑮𐑦𐑓𐑮𐑧𐑖 𐑮𐑱𐑑", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsDisplayUseTvInterface": "·𐑨𐑯𐑛𐑮𐑶𐑛 ⸰𐑑𐑝 𐑦𐑯𐑑𐑼𐑓𐑱𐑕", + "@settingsDisplayUseTvInterface": {}, + "settingsLanguageTile": "𐑤𐑨𐑙𐑜𐑢𐑦𐑡", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "𐑤𐑨𐑙𐑜𐑢𐑦𐑡", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "𐑒𐑴𐑹𐑛𐑦𐑯𐑩𐑑 𐑓𐑹𐑥𐑨𐑑", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "𐑒𐑴𐑹𐑛𐑦𐑯𐑩𐑑 𐑓𐑹𐑥𐑨𐑑", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "𐑿𐑯𐑦𐑑𐑕", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "𐑿𐑯𐑦𐑑𐑕", + "@settingsUnitSystemDialogTitle": {}, + "settingsForceWesternArabicNumeralsTile": "𐑓𐑹𐑕 ·𐑨𐑮𐑩𐑚𐑦𐑒 𐑯𐑿𐑥𐑼𐑩𐑤𐑟", + "@settingsForceWesternArabicNumeralsTile": {}, + "settingsScreenSaverPageTitle": "𐑕𐑒𐑮𐑰𐑯 𐑕𐑱𐑝𐑼", + "@settingsScreenSaverPageTitle": {}, + "settingsLanguageSectionTitle": "𐑤𐑨𐑙𐑜𐑢𐑦𐑡 𐑯 𐑓𐑹𐑥𐑨𐑑𐑕", + "@settingsLanguageSectionTitle": {}, + "settingsWidgetPageTitle": "𐑓𐑴𐑑𐑴 𐑓𐑮𐑱𐑥", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "𐑬𐑑𐑤𐑲𐑯", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "𐑢𐑧𐑯 𐑑𐑨𐑐𐑦𐑙 𐑪𐑯 𐑞 𐑢𐑦𐑡𐑩𐑑", + "@settingsWidgetOpenPage": {}, + "settingsWidgetDisplayedItem": "𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑲𐑑𐑩𐑥", + "@settingsWidgetDisplayedItem": {}, + "settingsCollectionTile": "𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯", + "@settingsCollectionTile": {}, + "statsPageTitle": "𐑕𐑑𐑨𐑑𐑕", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, =1{1 𐑲𐑑𐑩𐑥 𐑢𐑦𐑞 𐑤𐑴𐑒𐑱𐑖𐑩𐑯} other{{count} 𐑲𐑑𐑩𐑥𐑟 𐑢𐑦𐑞 𐑤𐑴𐑒𐑱𐑖𐑩𐑯}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "statsTopCountriesSectionTitle": "𐑑𐑪𐑐 𐑒𐑳𐑯𐑑𐑮𐑦𐑟", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "𐑑𐑪𐑐 𐑐𐑤𐑱𐑕𐑩𐑟", + "@statsTopPlacesSectionTitle": {}, + "viewerErrorUnknown": "¡𐑵𐑐𐑕!", + "@viewerErrorUnknown": {}, + "viewerInfoBackToViewerTooltip": "𐑚𐑨𐑒 𐑑 𐑝𐑿𐑼", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "𐑳𐑯𐑯𐑴𐑯", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "𐑑𐑲𐑑𐑩𐑤", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "𐑛𐑱𐑑", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "𐑮𐑧𐑟𐑩𐑤𐑵𐑖𐑩𐑯", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "𐑕𐑲𐑟", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "⸰𐑿𐑮𐑲", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "𐑐𐑭𐑔", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "𐑛𐑘𐑫𐑼𐑱𐑖𐑩𐑯", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "𐑴𐑯𐑼", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "𐑒𐑴𐑹𐑛𐑦𐑯𐑩𐑑𐑕", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "𐑩𐑛𐑮𐑧𐑕", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "𐑥𐑨𐑐 𐑕𐑑𐑲𐑤", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "𐑕𐑦𐑤𐑧𐑒𐑑 𐑥𐑨𐑐 𐑕𐑑𐑲𐑤", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "𐑟𐑵𐑥 𐑦𐑯", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "𐑟𐑵𐑥 𐑬𐑑", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "𐑐𐑶𐑯𐑑 𐑯𐑹𐑔 𐑳𐑐", + "@mapPointNorthUpTooltip": {}, + "mapAttributionOsmData": "𐑥𐑨𐑐 𐑛𐑱𐑑𐑩 © [·𐑴𐑐𐑩𐑯𐑕𐑑𐑮𐑰𐑑𐑥𐑨𐑐](https://www.openstreetmap.org/copyright) 𐑒𐑩𐑯𐑑𐑮𐑦𐑚𐑘𐑩𐑑𐑼𐑟", + "@mapAttributionOsmData": {}, + "mapAttributionOsmLiberty": "𐑑𐑲𐑤𐑟 𐑚𐑲 [·𐑴𐑐𐑩𐑯𐑥𐑨𐑐𐑑𐑲𐑤𐑟](https://www.openmaptiles.org), [⸰𐑒𐑒 𐑚𐑲](https://creativecommons.org/licenses/by/4.0) • 𐑣𐑴𐑕𐑑𐑩𐑛 𐑚𐑲 [⸰𐑴𐑕𐑥 ·𐑩𐑥𐑧𐑮𐑦𐑒𐑭𐑯𐑩](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "openMapPageTooltip": "𐑝𐑿 𐑪𐑯 ·𐑥𐑨𐑐 𐑐𐑱𐑡", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "𐑯𐑴 𐑦𐑥𐑦𐑡𐑩𐑟 𐑦𐑯 𐑞𐑦𐑕 𐑮𐑰𐑡𐑩𐑯", + "@mapEmptyRegion": {}, + "viewerInfoOpenLinkText": "𐑴𐑐𐑩𐑯", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "𐑝𐑿 ⸰𐑦𐑥𐑤", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "𐑕𐑻𐑗 𐑥𐑧𐑑𐑩𐑛𐑱𐑑𐑩", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "𐑓𐑱𐑤𐑛 𐑑 𐑦𐑒𐑕𐑑𐑮𐑨𐑒𐑑 𐑦𐑥𐑚𐑧𐑛𐑩𐑛 𐑛𐑱𐑑𐑩", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoSearchEmpty": "𐑯𐑴 𐑥𐑨𐑗𐑦𐑙 𐑒𐑰𐑟", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDescription": "𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "𐑛𐑦𐑥𐑧𐑯𐑖𐑩𐑯𐑟", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "𐑮𐑧𐑟𐑩𐑤𐑵𐑖𐑩𐑯", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionDate": "𐑛𐑱𐑑 𐑯 𐑑𐑲𐑥", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionRights": "𐑮𐑲𐑑𐑕", + "@viewerInfoSearchSuggestionRights": {}, + "wallpaperUseScrollEffect": "𐑿𐑟 𐑕𐑒𐑮𐑴𐑤 𐑦𐑓𐑧𐑒𐑑 𐑪𐑯 𐑣𐑴𐑥 𐑕𐑒𐑮𐑰𐑯", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageTitle": "𐑧𐑛𐑦𐑑 𐑑𐑨𐑜𐑟", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "𐑯𐑿 𐑑𐑨𐑜", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "𐑨𐑛 𐑑𐑨𐑜", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "𐑮𐑰𐑕𐑩𐑯𐑑", + "@tagEditorSectionRecent": {}, + "tagEditorSectionPlaceholders": "𐑐𐑤𐑱𐑕𐑣𐑴𐑤𐑛𐑼𐑟", + "@tagEditorSectionPlaceholders": {}, + "tagEditorDiscardDialogMessage": "¿𐑛𐑵 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑛𐑦𐑕𐑒𐑸𐑛 𐑗𐑱𐑯𐑡𐑩𐑟?", + "@tagEditorDiscardDialogMessage": {}, + "tagPlaceholderCountry": "𐑒𐑳𐑯𐑑𐑮𐑦", + "@tagPlaceholderCountry": {}, + "tagPlaceholderState": "𐑕𐑑𐑱𐑑", + "@tagPlaceholderState": {}, + "tagPlaceholderPlace": "𐑐𐑤𐑱𐑕", + "@tagPlaceholderPlace": {}, + "panoramaEnableSensorControl": "𐑦𐑯𐑱𐑚𐑩𐑤 𐑕𐑧𐑯𐑕𐑼 𐑒𐑩𐑯𐑑𐑮𐑴𐑤", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "𐑛𐑦𐑕𐑱𐑚𐑩𐑤 𐑕𐑧𐑯𐑕𐑼 𐑒𐑩𐑯𐑑𐑮𐑴𐑤", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "𐑕𐑹𐑕", + "@sourceViewerPageTitle": {}, + "videoActionShowPreviousFrame": "𐑖𐑴 𐑐𐑮𐑰𐑝𐑾𐑕 𐑓𐑮𐑱𐑥", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "𐑖𐑴 𐑯𐑧𐑒𐑕𐑑 𐑓𐑮𐑱𐑥", + "@videoActionShowNextFrame": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "𐑨𐑤𐑚𐑩𐑥 𐑷𐑤𐑮𐑧𐑛𐑦 𐑦𐑜𐑟𐑦𐑕𐑑𐑕", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "createButtonLabel": "𐑒𐑮𐑦𐑱𐑑", + "@createButtonLabel": {}, + "chipActionRemove": "𐑮𐑦𐑥𐑵𐑝", + "@chipActionRemove": {}, + "chipActionDecompose": "𐑕𐑐𐑤𐑦𐑑", + "@chipActionDecompose": {}, + "chipActionGroup": "𐑗𐑱𐑯𐑡 𐑜𐑮𐑵𐑐𐑦𐑙", + "@chipActionGroup": {}, + "chipActionCreateGroup": "𐑒𐑮𐑦𐑱𐑑 𐑜𐑮𐑵𐑐", + "@chipActionCreateGroup": {}, + "albumTierGroups": "𐑜𐑮𐑵𐑐𐑕", + "@albumTierGroups": {}, + "albumTierDynamic": "𐑛𐑲𐑯𐑨𐑥𐑦𐑒", + "@albumTierDynamic": {}, + "newDynamicAlbumDialogTitle": "𐑯𐑿 𐑛𐑲𐑯𐑨𐑥𐑦𐑒 𐑨𐑤𐑚𐑩𐑥", + "@newDynamicAlbumDialogTitle": {}, + "dynamicAlbumAlreadyExists": "𐑛𐑲𐑯𐑨𐑥𐑦𐑒 𐑨𐑤𐑚𐑩𐑥 𐑷𐑤𐑮𐑧𐑛𐑦 𐑦𐑜𐑟𐑦𐑕𐑑𐑕", + "@dynamicAlbumAlreadyExists": {}, + "newGroupDialogTitle": "𐑯𐑿 𐑜𐑮𐑵𐑐", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "𐑜𐑮𐑵𐑐 𐑯𐑱𐑥", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "𐑜𐑮𐑵𐑐 𐑷𐑤𐑮𐑧𐑛𐑦 𐑦𐑜𐑟𐑦𐑕𐑑𐑕", + "@groupAlreadyExists": {}, + "groupEmpty": "𐑯𐑴 𐑜𐑮𐑵𐑐𐑕", + "@groupEmpty": {}, + "ungrouped": "𐑳𐑯𐑜𐑮𐑵𐑐𐑑", + "@ungrouped": {}, + "groupPickerTitle": "𐑐𐑦𐑒 𐑜𐑮𐑵𐑐", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "𐑿𐑟 𐑞𐑦𐑕 𐑜𐑮𐑵𐑐", + "@groupPickerUseThisGroupButton": {}, + "editEntryLocationDialogImportGpx": "𐑦𐑥𐑐𐑹𐑑 GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "𐑑𐑲𐑥𐑖𐑦𐑐𐑑", + "@editEntryLocationDialogTimeShift": {}, + "removeEntryMetadataDialogAll": "𐑷𐑤", + "@removeEntryMetadataDialogAll": {}, + "collectionActionAddDynamicAlbum": "𐑨𐑛 𐑛𐑲𐑯𐑨𐑥𐑦𐑒 𐑨𐑤𐑚𐑩𐑥", + "@collectionActionAddDynamicAlbum": {}, + "sectionNone": "𐑯𐑴 𐑕𐑧𐑒𐑖𐑩𐑯𐑟", + "@sectionNone": {}, + "sortByPath": "𐑚𐑲 𐑐𐑭𐑔", + "@sortByPath": {}, + "searchFormatSectionTitle": "𐑓𐑹𐑥𐑨𐑑𐑕", + "@searchFormatSectionTitle": {}, + "appExportDynamicAlbums": "𐑛𐑲𐑯𐑨𐑥𐑦𐑒 𐑨𐑤𐑚𐑩𐑥𐑟", + "@appExportDynamicAlbums": {}, + "settingsNavigationBottomActionsTile": "𐑚𐑪𐑑𐑩𐑥 𐑯𐑨𐑝𐑦𐑜𐑱𐑖𐑩𐑯", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "𐑚𐑪𐑑𐑩𐑥 𐑯𐑨𐑝𐑦𐑜𐑱𐑖𐑩𐑯", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "𐑑𐑳𐑗 𐑯 𐑣𐑴𐑤𐑛 𐑑 𐑥𐑵𐑝 𐑚𐑳𐑑𐑩𐑯𐑟 𐑯 𐑕𐑦𐑤𐑧𐑒𐑑 𐑢𐑦𐑗 𐑨𐑒𐑖𐑩𐑯𐑟 𐑸 𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑦𐑯 𐑞 𐑚𐑪𐑑𐑩𐑥 𐑯𐑨𐑝𐑦𐑜𐑱𐑖𐑩𐑯 𐑚𐑸.", + "@settingsNavigationBottomActionEditorBanner": {}, + "mapStyleDialogAddStyle": "𐑨𐑛 𐑕𐑑𐑲𐑤", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogName": "𐑯𐑱𐑥", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "∘𐑿𐑮𐑤", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogSubdomains": "𐑕𐑳𐑚𐑛𐑴𐑥𐑱𐑯𐑟", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "𐑿𐑟𐑼𐑱𐑡𐑩𐑯𐑑", + "@mapStyleEditorDialogUserAgent": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "tagPickPageTitle": "𐑐𐑦𐑒 𐑑𐑨𐑜", + "@tagPickPageTitle": {} +} diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb new file mode 100644 index 0000000..8efbd8a --- /dev/null +++ b/lib/l10n/app_es.arb @@ -0,0 +1,1456 @@ +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Bienvenido a Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Opcional", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Acepto los términos y condiciones", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, =1{{count} elemento} other{{count} elementos}}", + "@itemCount": {}, + "timeSeconds": "{count, plural, =1{{count} segundo} other{{count} segundos}}", + "@timeSeconds": {}, + "timeMinutes": "{count, plural, =1{{count} minuto} other{{count} minutos}}", + "@timeMinutes": {}, + "timeDays": "{count, plural, =1{{count} día} other{{count} días}}", + "@timeDays": {}, + "focalLength": "{length} mm", + "@focalLength": {}, + "applyButtonLabel": "APLICAR", + "@applyButtonLabel": {}, + "deleteButtonLabel": "BORRAR", + "@deleteButtonLabel": {}, + "nextButtonLabel": "SIGUIENTE", + "@nextButtonLabel": {}, + "showButtonLabel": "MOSTRAR", + "@showButtonLabel": {}, + "hideButtonLabel": "OCULTAR", + "@hideButtonLabel": {}, + "continueButtonLabel": "CONTINUAR", + "@continueButtonLabel": {}, + "cancelTooltip": "Cancelar", + "@cancelTooltip": {}, + "changeTooltip": "Cambiar", + "@changeTooltip": {}, + "clearTooltip": "Limpiar", + "@clearTooltip": {}, + "previousTooltip": "Anterior", + "@previousTooltip": {}, + "nextTooltip": "Siguiente", + "@nextTooltip": {}, + "showTooltip": "Mostrar", + "@showTooltip": {}, + "hideTooltip": "Ocultar", + "@hideTooltip": {}, + "actionRemove": "Remover", + "@actionRemove": {}, + "resetTooltip": "Restablecer", + "@resetTooltip": {}, + "saveTooltip": "Guardar", + "@saveTooltip": {}, + "pickTooltip": "Elegir", + "@pickTooltip": {}, + "doubleBackExitMessage": "Presione «atrás» nuevamente para salir.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "No preguntar nuevamente", + "@doNotAskAgain": {}, + "sourceStateLoading": "Cargando", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Catalogando", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Ubicando países", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Ubicando lugares", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Borrar", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Mostrar en Álbumes", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Mostrar en Países", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "Mostrar en Etiquetas", + "@chipActionGoToTagPage": {}, + "chipActionHide": "Esconder", + "@chipActionHide": {}, + "chipActionPin": "Fijar", + "@chipActionPin": {}, + "chipActionUnpin": "Dejar de fijar", + "@chipActionUnpin": {}, + "chipActionRename": "Renombrar", + "@chipActionRename": {}, + "chipActionSetCover": "Elegir carátula", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "Crear álbum", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "Copiar al portapapeles", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "Borrar", + "@entryActionDelete": {}, + "entryActionConvert": "Convertir", + "@entryActionConvert": {}, + "entryActionExport": "Exportar", + "@entryActionExport": {}, + "entryActionInfo": "Información", + "@entryActionInfo": {}, + "entryActionRename": "Renombrar", + "@entryActionRename": {}, + "entryActionRestore": "Restaurar", + "@entryActionRestore": {}, + "entryActionRotateCCW": "Rotar en sentido antihorario", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Rotar en sentido horario", + "@entryActionRotateCW": {}, + "entryActionFlip": "Voltear horizontalmente", + "@entryActionFlip": {}, + "entryActionPrint": "Imprimir", + "@entryActionPrint": {}, + "entryActionShare": "Compartir", + "@entryActionShare": {}, + "entryActionViewSource": "Ver fuente", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "Mostrar como mapa superpuesto", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Convertir a imagen fija", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Abrir video", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Editar", + "@entryActionEdit": {}, + "entryActionOpen": "Abrir con", + "@entryActionOpen": {}, + "entryActionSetAs": "Establecer como", + "@entryActionSetAs": {}, + "entryActionOpenMap": "Mostrar en aplicación de mapa", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Rotar pantalla", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Agregar a favoritos", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Quitar de favoritos", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Capturar fotograma", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Silenciar", + "@videoActionMute": {}, + "videoActionUnmute": "Dejar de silenciar", + "@videoActionUnmute": {}, + "videoActionPause": "Pausa", + "@videoActionPause": {}, + "videoActionPlay": "Reproducir", + "@videoActionPlay": {}, + "videoActionReplay10": "Retroceder 10 segundos", + "@videoActionReplay10": {}, + "videoActionSkip10": "Adelantar 10 segundos", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Seleccionar pistas", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Velocidad de reproducción", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "Ajustes", + "@viewerActionSettings": {}, + "slideshowActionResume": "Reanudar", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Mostrar en Colección", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Editar fecha y hora", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Editar ubicación", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditRating": "Editar clasificación", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Editar etiquetas", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Eliminar metadatos", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "Cesto de basura", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Favorito", + "@filterFavouriteLabel": {}, + "filterNoLocationLabel": "No localizado", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Sin clasificar", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Sin etiquetar", + "@filterNoTagLabel": {}, + "filterOnThisDayLabel": "De este día", + "@filterOnThisDayLabel": {}, + "filterRatingRejectedLabel": "Rechazado", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Animado", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "Foto en movimiento", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Panorámica", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "Video en 360°", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Imagen", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "GMS", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Grados decimales", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "E", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "O", + "@coordinateDmsWest": {}, + "unitSystemMetric": "Métrico", + "@unitSystemMetric": {}, + "unitSystemImperial": "Imperial", + "@unitSystemImperial": {}, + "videoLoopModeNever": "Nunca", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "Sólo videos cortos", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "Siempre", + "@videoLoopModeAlways": {}, + "videoControlsPlayOutside": "Reproducir externamente", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (Híbrido)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (Relieve)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "OSM Humanitario", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (Acuarela)", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyRename": "Renombrar", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Reemplazar", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Saltear", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "Nunca", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "Sólo en el visor", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Siempre", + "@keepScreenOnAlways": {}, + "accessibilityAnimationsRemove": "Prevenir efectos en pantalla", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Mantener efectos en pantalla", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferHighest": "Alta tasa", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Baja tasa", + "@displayRefreshRatePreferLowest": {}, + "videoPlaybackSkip": "Saltear", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Reproducir sin sonido", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Reproducir con sonido", + "@videoPlaybackWithSound": {}, + "themeBrightnessLight": "Claro", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Obscuro", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Negro", + "@themeBrightnessBlack": {}, + "viewerTransitionSlide": "Diapositiva", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Paralaje", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "Desvanecer", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "Acercar", + "@viewerTransitionZoomIn": {}, + "wallpaperTargetHome": "Pantalla de inicio", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "Pantalla de bloqueo", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Pantallas de inicio y bloqueo", + "@wallpaperTargetHomeLock": {}, + "albumTierNew": "Nuevo", + "@albumTierNew": {}, + "albumTierPinned": "Fijado", + "@albumTierPinned": {}, + "albumTierSpecial": "Común", + "@albumTierSpecial": {}, + "albumTierApps": "Aplicaciones", + "@albumTierApps": {}, + "albumTierRegular": "Otros", + "@albumTierRegular": {}, + "storageVolumeDescriptionFallbackPrimary": "Almacenamiento interno", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "Tarjeta de memoria", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "el directorio raíz", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "el directorio «{name}»", + "@otherDirectoryDescription": {}, + "storageAccessDialogMessage": "Por favor seleccione {directory} en «{volume}» en la siguiente pantalla para permitir a esta aplicación tener acceso.", + "@storageAccessDialogMessage": {}, + "restrictedAccessDialogMessage": "Esta aplicación no tiene permiso para modificar archivos de {directory} en «{volume}».\n\nPor favor use un gestor de archivos o la aplicación de galería preinstalada para mover los elementos a otro directorio.", + "@restrictedAccessDialogMessage": {}, + "notEnoughSpaceDialogMessage": "Esta operación necesita {neededSize} de espacio libre en «{volume}» para completarse, pero sólo hay {freeSize} disponible.", + "@notEnoughSpaceDialogMessage": {}, + "missingSystemFilePickerDialogMessage": "El selector de archivos del sistema no se encuentra disponible o fue deshabilitado. Por favor habilítelo e intente nuevamente.", + "@missingSystemFilePickerDialogMessage": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Esta operación no está disponible para un elemento del siguiente tipo: {types}.} other{Esta operación no está disponible para elementos de los siguientes tipos: {types}.}}", + "@unsupportedTypeDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "Algunos archivos en el directorio de destino tienen el mismo nombre.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "Algunos archivos tienen el mismo nombre.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "Etiqueta del atajo", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "AGREGAR", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "No se encontraron aplicaciones para manejar esto.", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{¿Mover este elemento al cesto de basura?} other{¿Mover estos {count} elementos al cesto de basura?}}", + "@binEntriesConfirmationDialogMessage": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{¿Está seguro de borrar este elemento?} other{¿Está seguro de querer borrar {count} elementos?}}", + "@deleteEntriesConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "¿Guardar las fechas de los elementos antes de proceder?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Fijar fecha", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "¿Desea reanudar la reproducción a las {time}?", + "@videoResumeDialogMessage": {}, + "videoStartOverButtonLabel": "VOLVER A EMPEZAR", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "REANUDAR", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Elemento más reciente", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Automático", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Personalizado", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "Fotos y videos que concuerden serán ocultados de su colección. Puede volver a mostrarlos desde los ajustes de «Privacidad».\n\n¿Está seguro de que desea ocultarlos?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "Álbum nuevo", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Nombre del álbum", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "El directorio ya existe", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Almacenamiento:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "Renombrar", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "El directorio ya existe", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Renombrar", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "Patrón de nombramiento", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Insertar campo", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Vista previa", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Contador", + "@renameProcessorCounter": {}, + "renameProcessorName": "Nombre", + "@renameProcessorName": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{¿Eliminar este álbum y el elemento que contiene?} other{¿Eliminar este álbum y los {count} elementos que contiene?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{¿Eliminar estos álbumes y el elemento que contienen?} other{¿Eliminar estos álbumes y los {count} elementos que contienen?}}", + "@deleteMultiAlbumConfirmationDialogMessage": {}, + "exportEntryDialogFormat": "Formato:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Anchura", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Altura", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "Renombrar", + "@renameEntryDialogLabel": {}, + "editEntryDialogTargetFieldsHeader": "Campos a modificar", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Fecha y hora", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Establecer fecha personalizada", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Copiar de otra fecha", + "@editEntryDateDialogCopyField": {}, + "editEntryDialogCopyFromItem": "Copiar de otro elemento", + "@editEntryDialogCopyFromItem": {}, + "editEntryDateDialogExtractFromTitle": "Extraer del título", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Cambiar", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "Fecha de modificación del archivo", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "Horas", + "@durationDialogHours": {}, + "durationDialogMinutes": "Minutos", + "@durationDialogMinutes": {}, + "editEntryLocationDialogTitle": "Ubicación", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogChooseOnMap": "Elegir en el mapa", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "Latitud", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "Longitud", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "Usar esta ubicación", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "Clasificación", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Eliminación de metadatos", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "Más", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP es necesario para reproducir la animación de una foto en movimiento.\n\n¿Está seguro de que desea removerlo?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "genericDangerWarningDialogMessage": "¿Está seguro?", + "@genericDangerWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Velocidad de reproducción", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Audio", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Subtítulos", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "Desactivado", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Pista", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "No hay otras pistas.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "¡Completado!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Falló", + "@genericFailureFeedback": {}, + "menuActionConfigureView": "Ver", + "@menuActionConfigureView": {}, + "menuActionSelect": "Seleccionar", + "@menuActionSelect": {}, + "menuActionSelectAll": "Seleccionar todo", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "Deseleccionar", + "@menuActionSelectNone": {}, + "menuActionMap": "Mapa", + "@menuActionMap": {}, + "menuActionSlideshow": "Presentación", + "@menuActionSlideshow": {}, + "menuActionStats": "Estadísticas", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "Ordenar", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "Secciones", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Disposición", + "@viewDialogLayoutSectionTitle": {}, + "tileLayoutGrid": "Cuadrícula", + "@tileLayoutGrid": {}, + "tileLayoutList": "Lista", + "@tileLayoutList": {}, + "coverDialogTabCover": "Carátula", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "Aplicación", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Color", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Escoger aplicación", + "@appPickDialogTitle": {}, + "appPickDialogNone": "Ninguna", + "@appPickDialogNone": {}, + "aboutPageTitle": "Acerca de", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Licencia", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Política de privacidad", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Reporte de errores", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Guardar registros de la aplicación a un archivo", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Copiar información del sistema", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "Copiar", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "Reportar en GitHub con los registros y la información del sistema", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "Reportar", + "@aboutBugReportButton": {}, + "aboutCreditsSectionTitle": "Créditos", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "Esta aplicación usa un archivo TopoJSON de", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "bajo licencia ISC.", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Traductores", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Licencias de código abierto", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "Esta aplicación usa los siguientes paquetes y librerías de código abierto.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Librerías de Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Añadidos de Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Paquetes de Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Paquetes de Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Mostrar todas las licencias", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "Política de privacidad", + "@policyPageTitle": {}, + "collectionPageTitle": "Colección", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "Elegir", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "Seleccionar", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Mostrar filtros de títulos", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Ocultar filtros de títulos", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Agregar atajo", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "Vaciar cesto", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Copiar a álbum", + "@collectionActionCopy": {}, + "collectionActionMove": "Mover a álbum", + "@collectionActionMove": {}, + "collectionActionRescan": "Volver a buscar", + "@collectionActionRescan": {}, + "collectionActionEdit": "Editar", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Buscar títulos", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "Por álbum", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Por mes", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Por día", + "@collectionGroupDay": {}, + "sectionUnknown": "Desconocido", + "@sectionUnknown": {}, + "dateToday": "Hoy", + "@dateToday": {}, + "dateYesterday": "Ayer", + "@dateYesterday": {}, + "dateThisMonth": "Este mes", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Error al borrar 1 elemento} other{Error al borrar {count} elementos}}", + "@collectionDeleteFailureFeedback": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{Error al copiar 1 item} other{Error al copiar {count} elementos}}", + "@collectionCopyFailureFeedback": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{Error al mover 1 elemento} other{Error al mover {count} elementos}}", + "@collectionMoveFailureFeedback": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{Error al renombrar 1 elemento} other{Error al renombrar {count} elementos}}", + "@collectionRenameFailureFeedback": {}, + "collectionEditFailureFeedback": "{count, plural, =1{Error al editar 1 elemento} other{Error al editar {count} elementos}}", + "@collectionEditFailureFeedback": {}, + "collectionExportFailureFeedback": "{count, plural, =1{Error al exportar 1 página} other{Error al exportar {count} páginas}}", + "@collectionExportFailureFeedback": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{1 elemento copiado} other{Copiados{count} elementos}}", + "@collectionCopySuccessFeedback": {}, + "collectionMoveSuccessFeedback": "{count, plural, =1{1 elemento movido} other{Movidos {count} elementos}}", + "@collectionMoveSuccessFeedback": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{1 elemento renombrado} other{Renombrados {count} elementos}}", + "@collectionRenameSuccessFeedback": {}, + "collectionEditSuccessFeedback": "{count, plural, =1{1 elemento editado} other{Editados {count} elementos}}", + "@collectionEditSuccessFeedback": {}, + "collectionEmptyFavourites": "Sin favoritos", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "Sin videos", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "Sin imágenes", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Otorgar accceso", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Seleccionar sección", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Deseleccionar sección", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "Acerca de", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Ajustes", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "Toda la colección", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Favoritos", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Imágenes", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Vídeos", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "Animaciones", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Fotos en movimiento", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "Panorámicas", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Fotos Raw", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "Videos en 360°", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Álbumes", + "@drawerAlbumPage": {}, + "drawerCountryPage": "Países", + "@drawerCountryPage": {}, + "drawerTagPage": "Etiquetas", + "@drawerTagPage": {}, + "sortByDate": "Por fecha", + "@sortByDate": {}, + "sortByName": "Por nombre", + "@sortByName": {}, + "sortByItemCount": "Por número de elementos", + "@sortByItemCount": {}, + "sortBySize": "Por tamaño", + "@sortBySize": {}, + "sortByAlbumFileName": "Por nombre de álbum y título", + "@sortByAlbumFileName": {}, + "sortByRating": "Por clasificación", + "@sortByRating": {}, + "albumGroupTier": "Por nivel", + "@albumGroupTier": {}, + "albumGroupVolume": "Por volumen de almacenamiento", + "@albumGroupVolume": {}, + "albumPickPageTitleCopy": "Copiar a álbum", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Exportar a álbum", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Mover a álbum", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "Elegir álbum", + "@albumPickPageTitlePick": {}, + "albumCamera": "Cámara", + "@albumCamera": {}, + "albumDownload": "Descargas", + "@albumDownload": {}, + "albumScreenshots": "Capturas de pantalla", + "@albumScreenshots": {}, + "albumScreenRecordings": "Grabaciones de pantalla", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Capturas en video", + "@albumVideoCaptures": {}, + "albumPageTitle": "Álbumes", + "@albumPageTitle": {}, + "albumEmpty": "Sin álbumes", + "@albumEmpty": {}, + "createAlbumButtonLabel": "CREAR", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "nuevo", + "@newFilterBanner": {}, + "countryPageTitle": "Países", + "@countryPageTitle": {}, + "countryEmpty": "Sin países", + "@countryEmpty": {}, + "tagPageTitle": "Etiquetas", + "@tagPageTitle": {}, + "tagEmpty": "Sin etiquetas", + "@tagEmpty": {}, + "binPageTitle": "Cesto de basura", + "@binPageTitle": {}, + "searchCollectionFieldHint": "Buscar en colección", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "Reciente", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Fecha", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "Álbumes", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "Países", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "Lugares", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Etiquetas", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "Clasificaciones", + "@searchRatingSectionTitle": {}, + "settingsPageTitle": "Ajustes", + "@settingsPageTitle": {}, + "settingsSystemDefault": "Sistema", + "@settingsSystemDefault": {}, + "settingsDefault": "Restablecer", + "@settingsDefault": {}, + "settingsSearchFieldLabel": "Buscar ajustes", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Sin coincidencias", + "@settingsSearchEmpty": {}, + "settingsActionExport": "Exportar", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "Exportar", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "Importar", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Importar", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "Carátulas", + "@appExportCovers": {}, + "appExportFavourites": "Favoritos", + "@appExportFavourites": {}, + "appExportSettings": "Ajustes", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "Navegación", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Inicio", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Inicio", + "@settingsHomeDialogTitle": {}, + "settingsKeepScreenOnTile": "Mantener la pantalla encendida", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Mantener la pantalla encendida", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Presione «atrás» dos veces para salir", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "Diálogos de confirmación", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "Diálogos de confirmación", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Preguntar antes de eliminar elementos permanentemente", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "Preguntar antes de mover elementos al cesto de basura", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Preguntar antes de mover elementos sin una fecha de metadatos", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsNavigationDrawerTile": "Menú de navegación", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Menú de navegación", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "Toque y mantenga para mover y reordenar elementos del menú.", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "Tipos", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "Álbumes", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Páginas", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Agregar álbum", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "Miniaturas", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "Incrustaciones", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Incrustaciones", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowFavouriteIcon": "Mostrar icono de favoritos", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Mostrar ícono de etiqueta", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Mostrar icono de ubicación", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Mostrar icono de foto en movimiento", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "Mostrar clasificación", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Mostrar icono Raw", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Mostrar duración de video", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "Acciones rápidas", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Acciones rápidas", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Búsqueda", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Selección", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Toque y mantenga para mover botones y seleccionar cuáles acciones se muestran mientras busca elementos.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Toque y mantenga para mover botones y seleccionar cuáles acciones se muestran mientras selecciona elementos.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsViewerSectionTitle": "Visor", + "@settingsViewerSectionTitle": {}, + "settingsViewerGestureSideTapNext": "Toque en los bordes de la pantalla para mostrar el elemento anterior/siguiente", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerUseCutout": "Usar área recortada", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Brillo máximo", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Reproducir automáticamente fotos en movimiento", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "Imagen de fondo", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Acciones rápidas", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Acciones rápidas", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "Toque y mantenga para mover botones y seleccionar cuáles acciones se muestran en el visor.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Botones mostrados", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Botones disponibles", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Sin botones", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "Incrustaciones", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "Incrustaciones", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "Mostrar durante apertura", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "Mostrar mapa en miniatura", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Mostrar información", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "Mostrar título, fecha, ubicación, etc.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowShootingDetails": "Mostrar detalles de toma", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowOverlayThumbnails": "Mostrar miniaturas", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "Efecto de difuminado", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "Presentación", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "Presentación", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Repetir", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Mezclar", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Llenar pantalla", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowTransitionTile": "Transición", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Intervalo", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "Reproducción de video", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Reproducción de video", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "Ajustes de video", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "Mostrar videos", + "@settingsVideoShowVideos": {}, + "settingsVideoEnableHardwareAcceleration": "Aceleración por hardware", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "Reproducción automática", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "Modo bucle", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Modo bucle", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "Subtítulos", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Subtítulos", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Esto es un ejemplo.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "Alineación de texto", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Alineación de texto", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Tamaño de texto", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "Mostrar contorno y sombra", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Color de texto", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Opacidad de texto", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Color de fondo", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Opacidad de fondo", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Izquierda", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Centro", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Derecha", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoControlsTile": "Controles", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "Controles", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "Botones", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Doble toque para reproducir/pausar", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "Doble toque en los bordes de la pantalla para buscar atrás/adelante", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsPrivacySectionTitle": "Privacidad", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Permita el acceso a lista de aplicaciones", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "Usado para mejorar los álbumes mostrados", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "Permitir reporte de errores anónimo", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Guardar historial de búsqueda", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "Usar cesto de basura", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "Guardar los elementos eliminados por 30 días", + "@settingsEnableBinSubtitle": {}, + "settingsHiddenItemsTile": "Elementos ocultos", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Elementos ocultos", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "Fotos y videos que concuerden con los filtros no aparecerán en su colección.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "Sin filtros", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Acceso al almacenamiento", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "Acceso al almacenamiento", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessBanner": "Algunos directorios requieren un permiso de acceso explícito para que sea posible modificar los archivos que contienen. Puede revisar los directorios con permiso aquí.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Sin permisos de acceso", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Revocar", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Accesibilidad", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Remover animaciones", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "Remover animaciones", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Retraso para ejecutar una acción", + "@settingsTimeToTakeActionTile": {}, + "settingsDisplaySectionTitle": "Pantalla", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "Acentos de color", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Color dinámico", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Tasa de refresco de la pantalla", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Tasa de refresco", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageSectionTitle": "Idioma y formatos", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "Idioma", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "Idioma", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "Formato de coordenadas", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "Formato de coordenadas", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Unidades", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "Unidades", + "@settingsUnitSystemDialogTitle": {}, + "settingsScreenSaverPageTitle": "Protector de pantalla", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "Marco de foto", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Borde", + "@settingsWidgetShowOutline": {}, + "settingsCollectionTile": "Colección", + "@settingsCollectionTile": {}, + "statsPageTitle": "Stats", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, =1{1 elemento con ubicación} other{{count} elementos con ubicación}}", + "@statsWithGps": {}, + "statsTopCountriesSectionTitle": "Países principales", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Lugares principales", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Etiquetas principales", + "@statsTopTagsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "ABRIR PANORÁMICA", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "ESTABLECER FONDO", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "¡Ups!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "El archivo no existe.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Información", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "Regresar al visor", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "Desconocido", + "@viewerInfoUnknown": {}, + "viewerInfoLabelTitle": "Título", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "Fecha", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "Resolución", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Tamaño", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Ubicación", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Duración", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Propiedad de", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Coordinadas", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Dirección", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Estilo de mapa", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Selección de estilo de mapa", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Acercar", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Alejar", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Apuntar el Norte hacia arriba", + "@mapPointNorthUpTooltip": {}, + "mapAttributionOsmHot": "Mosaicos por [HOT](https://www.hotosm.org/) • Alojado por [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "Mosaicos por [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "openMapPageTooltip": "Ver en página del mapa", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "Sin imágenes en esta región", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Fallo al extraer datos embutidos", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "Abrir", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Ver XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "Buscar metadatos", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Sin claves concordantes", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Fecha y hora", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Descripción", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Dimensiones", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Resolución", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Derechos", + "@viewerInfoSearchSuggestionRights": {}, + "tagEditorPageTitle": "Editar Etiquetas", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Nueva etiqueta", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Añadir etiqueta", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Reciente", + "@tagEditorSectionRecent": {}, + "panoramaEnableSensorControl": "Activar control de sensores", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Desactivar control de sensores", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Fuente", + "@sourceViewerPageTitle": {}, + "chipActionFilterOut": "Filtrar", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Filtrar en", + "@chipActionFilterIn": {}, + "entryInfoActionEditTitleDescription": "Editar título y descripción", + "@entryInfoActionEditTitleDescription": {}, + "filterNoDateLabel": "Sin fecha", + "@filterNoDateLabel": {}, + "filterNoTitleLabel": "Sin título", + "@filterNoTitleLabel": {}, + "filterRecentlyAddedLabel": "Recientemente añadido", + "@filterRecentlyAddedLabel": {}, + "viewerTransitionNone": "Ninguno", + "@viewerTransitionNone": {}, + "durationDialogSeconds": "Segundos", + "@durationDialogSeconds": {}, + "viewDialogReverseSortOrder": "Invertir la forma de ordenar", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "Mosaico", + "@tileLayoutMosaic": {}, + "sortOrderNewestFirst": "El más nuevo primero", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "El más viejo primero", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "De la A a la Z", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "De la Z a la A", + "@sortOrderZtoA": {}, + "albumGroupType": "Por tipo", + "@albumGroupType": {}, + "albumMimeTypeMixed": "Mezclado", + "@albumMimeTypeMixed": {}, + "searchMetadataSectionTitle": "Metadatos", + "@searchMetadataSectionTitle": {}, + "settingsDisabled": "Desactivado", + "@settingsDisabled": {}, + "settingsConfirmationAfterMoveToBinItems": "Mostrar mensaje después de mover elementos a la papelera de reciclaje", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsSlideshowAnimatedZoomEffect": "Efecto de zoom animado", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsWidgetOpenPage": "Al pulsar sobre el widget", + "@settingsWidgetOpenPage": {}, + "statsTopAlbumsSectionTitle": "Álbumes principales", + "@statsTopAlbumsSectionTitle": {}, + "viewerInfoLabelDescription": "Descripción", + "@viewerInfoLabelDescription": {}, + "wallpaperUseScrollEffect": "Usar el efecto de desplazamiento en la pantalla de inicio", + "@wallpaperUseScrollEffect": {}, + "sortOrderHighestFirst": "El más alto primero", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "El más bajo primero", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "El más grande primero", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "El más pequeño primero", + "@sortOrderSmallestFirst": {}, + "widgetOpenPageViewer": "Abrir el visor", + "@widgetOpenPageViewer": {}, + "widgetOpenPageHome": "Abrir la pantalla de inicio", + "@widgetOpenPageHome": {}, + "widgetOpenPageCollection": "Abrir colección", + "@widgetOpenPageCollection": {}, + "editEntryLocationDialogSetCustom": "Establecer la ubicación personalizada", + "@editEntryLocationDialogSetCustom": {}, + "tagPlaceholderCountry": "País", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "Lugar", + "@tagPlaceholderPlace": {}, + "tagEditorSectionPlaceholders": "Marcadores de la posición", + "@tagEditorSectionPlaceholders": {}, + "settingsAllowMediaManagement": "Permitir la gestión de medios", + "@settingsAllowMediaManagement": {}, + "entryInfoActionExportMetadata": "Exportar los metadatos", + "@entryInfoActionExportMetadata": {}, + "subtitlePositionTop": "Parte superior", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "Inferior", + "@subtitlePositionBottom": {}, + "settingsSubtitleThemeTextPositionTile": "Posición del texto", + "@settingsSubtitleThemeTextPositionTile": {}, + "widgetDisplayedItemMostRecent": "Más reciente", + "@widgetDisplayedItemMostRecent": {}, + "widgetDisplayedItemRandom": "Aleatorio", + "@widgetDisplayedItemRandom": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Posición del texto", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsWidgetDisplayedItem": "Elemento para mostrar", + "@settingsWidgetDisplayedItem": {}, + "filterNoAddressLabel": "Sin dirección", + "@filterNoAddressLabel": {}, + "filterAspectRatioLandscapeLabel": "Paisaje", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "Retrato", + "@filterAspectRatioPortraitLabel": {}, + "settingsViewerShowRatingTags": "Mostrar la valoración y las etiquetas", + "@settingsViewerShowRatingTags": {}, + "entryInfoActionRemoveLocation": "Eliminar la ubicación", + "@entryInfoActionRemoveLocation": {}, + "entryActionShareVideoOnly": "Compartir sólo el vídeo", + "@entryActionShareVideoOnly": {}, + "entryActionShareImageOnly": "Compartir sólo la imagen", + "@entryActionShareImageOnly": {}, + "keepScreenOnVideoPlayback": "Durante la reproducción de vídeo", + "@keepScreenOnVideoPlayback": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Mostrar alternativas a gestos multitáctiles", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "columnCount": "{count, plural, =1{{count} columna} other{{count} columnas}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsViewerShowDescription": "Mostrar la descripción", + "@settingsViewerShowDescription": {}, + "settingsModificationWarningDialogMessage": "Otras configuraciones serán modificadas.", + "@settingsModificationWarningDialogMessage": {}, + "settingsDisplayUseTvInterface": "Interfaz de Android TV", + "@settingsDisplayUseTvInterface": {}, + "filterLocatedLabel": "Localizado", + "@filterLocatedLabel": {}, + "filterTaggedLabel": "Etiquetado", + "@filterTaggedLabel": {}, + "tooManyItemsErrorDialogMessage": "Vuelva a intentarlo con menos elementos.", + "@tooManyItemsErrorDialogMessage": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Deslice hacia arriba o hacia abajo para ajustar el brillo o el volumen", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "chipActionLock": "Bloquear", + "@chipActionLock": {}, + "chipActionConfigureVault": "Configurar la caja fuerte", + "@chipActionConfigureVault": {}, + "albumTierVaults": "Caja fuerte", + "@albumTierVaults": {}, + "vaultLockTypePin": "Pin", + "@vaultLockTypePin": {}, + "vaultLockTypePassword": "Contraseña", + "@vaultLockTypePassword": {}, + "newVaultDialogTitle": "Nueva caja fuerte", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "Configurar la caja fuerte", + "@configureVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "Bloquear al apagar la pantalla", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "Tipo de bloqueo", + "@vaultDialogLockTypeLabel": {}, + "pinDialogEnter": "Introducir el código pin", + "@pinDialogEnter": {}, + "pinDialogConfirm": "Confirmar el código pin", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "Introducir la contraseña", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Confirmar la contraseña", + "@passwordDialogConfirm": {}, + "authenticateToConfigureVault": "Autenticarse para configurar la caja fuerte", + "@authenticateToConfigureVault": {}, + "vaultBinUsageDialogMessage": "Algunas cajas fuertes utilizan la papelera de reciclaje.", + "@vaultBinUsageDialogMessage": {}, + "settingsDisablingBinWarningDialogMessage": "Los elementos de la papelera de reciclaje se borrarán para siempre.", + "@settingsDisablingBinWarningDialogMessage": {}, + "chipActionCreateVault": "Crear una caja fuerte", + "@chipActionCreateVault": {}, + "newVaultWarningDialogMessage": "Los elementos de la caja fuerte sólo están disponibles para esta aplicación y no para otras.\n\nSi desinstalas esta aplicación o borras sus datos, perderás todos estos elementos.", + "@newVaultWarningDialogMessage": {}, + "authenticateToUnlockVault": "Autentificarse para desbloquear la caja fuerte", + "@authenticateToUnlockVault": {}, + "settingsConfirmationVaultDataLoss": "Mostrar un aviso de pérdida de datos de la caja fuerte", + "@settingsConfirmationVaultDataLoss": {}, + "drawerPlacePage": "Lugares", + "@drawerPlacePage": {}, + "placePageTitle": "Lugares", + "@placePageTitle": {}, + "placeEmpty": "Ningún lugar", + "@placeEmpty": {}, + "chipActionGoToPlacePage": "Mostrar en lugares", + "@chipActionGoToPlacePage": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "exportEntryDialogWriteMetadata": "Escribir metadatos", + "@exportEntryDialogWriteMetadata": {}, + "vaultLockTypePattern": "Patrón", + "@vaultLockTypePattern": {}, + "patternDialogEnter": "Introduzca el patrón", + "@patternDialogEnter": {}, + "patternDialogConfirm": "Confirme el patrón", + "@patternDialogConfirm": {}, + "settingsVideoEnablePip": "Imagen-en-imagen", + "@settingsVideoEnablePip": {}, + "settingsVideoBackgroundMode": "Reproducción de fondo", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "Reproducción de fondo", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsCollectionBurstPatternsTile": "Modelos de ráfaga", + "@settingsCollectionBurstPatternsTile": {}, + "settingsCollectionBurstPatternsNone": "Ninguno", + "@settingsCollectionBurstPatternsNone": {}, + "tagPlaceholderState": "Estado", + "@tagPlaceholderState": {}, + "viewerActionUnlock": "Desbloquear visor", + "@viewerActionUnlock": {}, + "stateEmpty": "Sin estados", + "@stateEmpty": {}, + "chipActionShowCountryStates": "Mostrar los estados", + "@chipActionShowCountryStates": {}, + "statePageTitle": "Estados", + "@statePageTitle": {}, + "viewerActionLock": "Bloquear visor", + "@viewerActionLock": {}, + "searchStatesSectionTitle": "Estados", + "@searchStatesSectionTitle": {}, + "statsTopStatesSectionTitle": "Estados principales", + "@statsTopStatesSectionTitle": {}, + "settingsVideoPlaybackTile": "Reproducción", + "@settingsVideoPlaybackTile": {}, + "settingsAskEverytime": "Pregunta cuando quieras", + "@settingsAskEverytime": {}, + "settingsVideoResumptionModeDialogTitle": "Reanudar la reproducción", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsVideoResumptionModeTile": "Reanudar la reproducción", + "@settingsVideoResumptionModeTile": {}, + "tagEditorDiscardDialogMessage": "¿Quieres descartar los cambios?", + "@tagEditorDiscardDialogMessage": {}, + "settingsVideoPlaybackPageTitle": "Reproducir", + "@settingsVideoPlaybackPageTitle": {}, + "maxBrightnessAlways": "Siempre", + "@maxBrightnessAlways": {}, + "videoResumptionModeAlways": "Siempre", + "@videoResumptionModeAlways": {}, + "maxBrightnessNever": "Nunca", + "@maxBrightnessNever": {}, + "videoResumptionModeNever": "Nunca", + "@videoResumptionModeNever": {}, + "exportEntryDialogQuality": "Calidad", + "@exportEntryDialogQuality": {}, + "saveCopyButtonLabel": "GUARDAR UNA COPIA", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Aplicar", + "@applyTooltip": {}, + "editorTransformCrop": "Recortar", + "@editorTransformCrop": {}, + "editorTransformRotate": "Girar", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Libre", + "@cropAspectRatioFree": {}, + "cropAspectRatioSquare": "Cuadrado", + "@cropAspectRatioSquare": {}, + "editorActionTransform": "Transformar", + "@editorActionTransform": {}, + "cropAspectRatioOriginal": "Original", + "@cropAspectRatioOriginal": {}, + "widgetTapUpdateWidget": "Actualizar el widget", + "@widgetTapUpdateWidget": {}, + "aboutDataUsageData": "Datos", + "@aboutDataUsageData": {}, + "aboutDataUsageCache": "Cache", + "@aboutDataUsageCache": {}, + "aboutDataUsageDatabase": "Base de datos", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageInternal": "Interno", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "Exterior", + "@aboutDataUsageExternal": {}, + "aboutDataUsageSectionTitle": "Uso de los datos", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageMisc": "Varios", + "@aboutDataUsageMisc": {}, + "overlayHistogramLuminance": "Luminancia", + "@overlayHistogramLuminance": {}, + "overlayHistogramNone": "Ninguna", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "settingsViewerShowHistogram": "Mostrar el histograma", + "@settingsViewerShowHistogram": {}, + "aboutDataUsageClearCache": "Borrar la cache", + "@aboutDataUsageClearCache": {}, + "entryActionCast": "Echar", + "@entryActionCast": {}, + "castDialogTitle": "Dispositivos Cast", + "@castDialogTitle": {}, + "settingsThumbnailShowHdrIcon": "Mostrar el icono del HDR", + "@settingsThumbnailShowHdrIcon": {}, + "collectionActionSetHome": "Fijar como inicio", + "@collectionActionSetHome": {}, + "videoRepeatActionSetStart": "Fijar el inicio", + "@videoRepeatActionSetStart": {}, + "stopTooltip": "Parar", + "@stopTooltip": {}, + "videoActionABRepeat": "Repetir de A a B", + "@videoActionABRepeat": {}, + "videoRepeatActionSetEnd": "Fijar el fin", + "@videoRepeatActionSetEnd": {}, + "settingsForceWesternArabicNumeralsTile": "Forzar números arábigos", + "@settingsForceWesternArabicNumeralsTile": {}, + "renameProcessorHash": "Hash", + "@renameProcessorHash": {}, + "chipActionShowCollection": "Mostrar en Colección", + "@chipActionShowCollection": {}, + "explorerPageTitle": "Explorar", + "@explorerPageTitle": {}, + "chipActionGoToExplorerPage": "Mostrar en el explorador", + "@chipActionGoToExplorerPage": {}, + "selectStorageVolumeDialogTitle": "Seleccionar almacenamiento", + "@selectStorageVolumeDialogTitle": {}, + "setHomeCustom": "Personalizado", + "@setHomeCustom": {}, + "explorerActionSelectStorageVolume": "Seleccionar almacenamiento", + "@explorerActionSelectStorageVolume": {}, + "sortByDuration": "Por duración", + "@sortByDuration": {}, + "sortOrderShortestFirst": "El más corto primero", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "El más largo primero", + "@sortOrderLongestFirst": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Mosaicos por [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "mapAttributionOsmData": "Datos de mapas © [OpenStreetMap](https://www.openstreetmap.org/copyright) contribuidores", + "@mapAttributionOsmData": {}, + "mapAttributionOsmLiberty": "Mosaicos por [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Alojado por [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "videoActionShowPreviousFrame": "Mostrar fotograma anterior", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "Mostrar fotograma siguiente", + "@videoActionShowNextFrame": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "El álbum ya existe", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "chipActionRemove": "Remover", + "@chipActionRemove": {}, + "dynamicAlbumAlreadyExists": "El álbum dinámico ya existe", + "@dynamicAlbumAlreadyExists": {}, + "collectionActionAddDynamicAlbum": "Añadir álbum dinámico", + "@collectionActionAddDynamicAlbum": {}, + "appExportDynamicAlbums": "Álbumes dinámicos", + "@appExportDynamicAlbums": {}, + "albumTierDynamic": "Dinámico", + "@albumTierDynamic": {}, + "newDynamicAlbumDialogTitle": "Nuevo álbum dinámico", + "@newDynamicAlbumDialogTitle": {}, + "chipActionDecompose": "Separar", + "@chipActionDecompose": {}, + "editEntryLocationDialogImportGpx": "Importar GPX", + "@editEntryLocationDialogImportGpx": {}, + "removeEntryMetadataDialogAll": "Todo", + "@removeEntryMetadataDialogAll": {}, + "editEntryLocationDialogTimeShift": "Desplazamiento de tiempo", + "@editEntryLocationDialogTimeShift": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "sortByPath": "Por ruta", + "@sortByPath": {}, + "searchFormatSectionTitle": "Formatos", + "@searchFormatSectionTitle": {}, + "newGroupDialogTitle": "Nuevo grupo", + "@newGroupDialogTitle": {}, + "ungrouped": "No agrupado", + "@ungrouped": {}, + "albumTierGroups": "Grupos", + "@albumTierGroups": {}, + "groupEmpty": "Sin grupos", + "@groupEmpty": {}, + "newGroupDialogNameLabel": "Nombre del grupo", + "@newGroupDialogNameLabel": {}, + "createButtonLabel": "CREAR", + "@createButtonLabel": {}, + "chipActionGroup": "Cambiar agrupamiento", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Crear grupo", + "@chipActionCreateGroup": {}, + "groupAlreadyExists": "Ya existe el grupo", + "@groupAlreadyExists": {}, + "groupPickerTitle": "Seleccionar grupo", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Usar este grupo", + "@groupPickerUseThisGroupButton": {}, + "sectionNone": "Sin secciones", + "@sectionNone": {}, + "mapStyleDialogAddStyle": "Añadir estilo", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogName": "Nombre", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogSubdomains": "Subdominios", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "User-Agent", + "@mapStyleEditorDialogUserAgent": {}, + "tagPickPageTitle": "Escoger etiqueta", + "@tagPickPageTitle": {}, + "settingsNavigationBottomActionsTile": "Barra de navegación inferior", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Barra de navegación inferior", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Toque y mantenga para mover botones y seleccionar qué acciones se mostrarán en la barra de navegación inferior.", + "@settingsNavigationBottomActionEditorBanner": {}, + "settingsViewerShowZoomLevel": "Mostrar nivel de zoom", + "@settingsViewerShowZoomLevel": {}, + "settingsEnabled": "Activado", + "@settingsEnabled": {}, + "settingsForced": "Forzado", + "@settingsForced": {} +} diff --git a/lib/l10n/app_et.arb b/lib/l10n/app_et.arb new file mode 100644 index 0000000..6b9f22d --- /dev/null +++ b/lib/l10n/app_et.arb @@ -0,0 +1,1674 @@ +{ + "welcomeMessage": "Tere tulemast kasutama Avest", + "@welcomeMessage": {}, + "welcomeOptional": "Pole kohustuslik", + "@welcomeOptional": {}, + "itemCount": "{count, plural, =1{{count} objekt} other{{count} objekti}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeSeconds": "{count, plural, =1{{count} sekund} other{{count} sekundit}}", + "@timeSeconds": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeMinutes": "{count, plural, =1{{count} minut} other{{count} minutit}}", + "@timeMinutes": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeDays": "{count, plural, =1{{count} päev} other{{count} päeva}}", + "@timeDays": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "applyTooltip": "Rakenda", + "@applyTooltip": {}, + "cancelTooltip": "Katkesta", + "@cancelTooltip": {}, + "changeTooltip": "Muuda", + "@changeTooltip": {}, + "nextTooltip": "Järgmine", + "@nextTooltip": {}, + "showTooltip": "Näita", + "@showTooltip": {}, + "hideTooltip": "Peida", + "@hideTooltip": {}, + "actionRemove": "Eemalda", + "@actionRemove": {}, + "resetTooltip": "Lähtesta", + "@resetTooltip": {}, + "saveTooltip": "Salvesta", + "@saveTooltip": {}, + "pickTooltip": "Vali", + "@pickTooltip": {}, + "doubleBackExitMessage": "Väljumiseks klõpsi uuesti nuppu „Tagasi“.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "Ära küsi enam uuesti", + "@doNotAskAgain": {}, + "sourceStateLoading": "Laadime andmeid", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Katalogiseerime", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Tuvastame riike", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Tuvastame asukohti", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Kustuta", + "@chipActionDelete": {}, + "applyButtonLabel": "RAKENDA", + "@applyButtonLabel": {}, + "deleteButtonLabel": "KUSTUTA", + "@deleteButtonLabel": {}, + "nextButtonLabel": "JÄRGMINE", + "@nextButtonLabel": {}, + "showButtonLabel": "NÄITA", + "@showButtonLabel": {}, + "continueButtonLabel": "JÄTKA", + "@continueButtonLabel": {}, + "saveCopyButtonLabel": "SALVESTA KOOPIA", + "@saveCopyButtonLabel": {}, + "chipActionShowCollection": "Näita kogumikus", + "@chipActionShowCollection": {}, + "chipActionGoToAlbumPage": "Näita albumites", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Näita riikides", + "@chipActionGoToCountryPage": {}, + "chipActionGoToPlacePage": "Näita asukohtades", + "@chipActionGoToPlacePage": {}, + "chipActionGoToTagPage": "Näita siltides", + "@chipActionGoToTagPage": {}, + "chipActionGoToExplorerPage": "Näita sirvijas", + "@chipActionGoToExplorerPage": {}, + "chipActionFilterOut": "Sõelu välja", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Sõelu sisse", + "@chipActionFilterIn": {}, + "chipActionHide": "Peida", + "@chipActionHide": {}, + "chipActionLock": "Lukusta", + "@chipActionLock": {}, + "chipActionPin": "Kinnita üles äärde", + "@chipActionPin": {}, + "stopTooltip": "Lõpeta", + "@stopTooltip": {}, + "entryActionOpenMap": "Näita kaardirakenduses", + "@entryActionOpenMap": {}, + "chipActionUnpin": "Eemalda ülalt äärest", + "@chipActionUnpin": {}, + "chipActionRename": "Muuda nime", + "@chipActionRename": {}, + "chipActionShowCountryStates": "Näita osariike", + "@chipActionShowCountryStates": {}, + "chipActionCreateAlbum": "Loo album", + "@chipActionCreateAlbum": {}, + "chipActionCreateVault": "Loo turvaruum", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "Seadista turvaruumi", + "@chipActionConfigureVault": {}, + "entryActionCopyToClipboard": "Kopeeri lõikelauale", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "Kustuta", + "@entryActionDelete": {}, + "entryActionConvert": "Konverteeri", + "@entryActionConvert": {}, + "entryActionExport": "Ekspordi", + "@entryActionExport": {}, + "entryActionInfo": "Teave", + "@entryActionInfo": {}, + "entryActionRename": "Muuda nime", + "@entryActionRename": {}, + "entryActionRotateCCW": "Pööra vastupäeva", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Pööra päripäeva", + "@entryActionRotateCW": {}, + "entryActionFlip": "Pööra ümber horisontaalselt", + "@entryActionFlip": {}, + "entryActionPrint": "Prindi", + "@entryActionPrint": {}, + "entryActionShareImageOnly": "Jaga vaid pilti", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "Jaga vaid videot", + "@entryActionShareVideoOnly": {}, + "entryActionViewSource": "Vaata allikat", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "Näita kaardi ülekattena", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Muuda stoppkaadriks", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Ava video", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Muuda", + "@entryActionEdit": {}, + "entryActionOpen": "Ava rakendusega", + "@entryActionOpen": {}, + "entryActionSetAs": "Seadista kui", + "@entryActionSetAs": {}, + "entryActionRotateScreen": "Pööra ekraani", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Lisa lemmikuks", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Eemalda lemmikute hulgast", + "@entryActionRemoveFavourite": {}, + "videoActionMute": "Summuta", + "@videoActionMute": {}, + "videoActionUnmute": "Eemalda summutamine", + "@videoActionUnmute": {}, + "videoActionPause": "Peata", + "@videoActionPause": {}, + "videoActionPlay": "Esita", + "@videoActionPlay": {}, + "videoActionReplay10": "Keri tagasi 10 sekundit", + "@videoActionReplay10": {}, + "videoActionSkip10": "Keri edasi 10 sekundit", + "@videoActionSkip10": {}, + "videoActionShowPreviousFrame": "Näita eelmist kaadrit", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "Näita järgmist kaadrit", + "@videoActionShowNextFrame": {}, + "videoActionSelectStreams": "Vali meediavood", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Taasesituse kiirus", + "@videoActionSetSpeed": {}, + "videoRepeatActionSetStart": "Määra algus", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "Määra lõpp", + "@videoRepeatActionSetEnd": {}, + "viewerActionSettings": "Seadistused", + "@viewerActionSettings": {}, + "configureVaultDialogTitle": "Seadista turvaruumi", + "@configureVaultDialogTitle": {}, + "vaultDialogLockTypeLabel": "Lukustuse tüüp", + "@vaultDialogLockTypeLabel": {}, + "authenticateToConfigureVault": "Turvaruumi seadistamiseks autendi", + "@authenticateToConfigureVault": {}, + "authenticateToUnlockVault": "Turvaruumi lukustuse eemaldamiseks autendi", + "@authenticateToUnlockVault": {}, + "vaultBinUsageDialogMessage": "Mõned turvaruumid kasutavad prügikasti.", + "@vaultBinUsageDialogMessage": {}, + "settingsConfirmationVaultDataLoss": "Näita turvaruumi andmekao hoiatust", + "@settingsConfirmationVaultDataLoss": {}, + "statsTopPlacesSectionTitle": "Populaarsemad kohad", + "@statsTopPlacesSectionTitle": {}, + "statsTopCountriesSectionTitle": "Populaarsemad riigid", + "@statsTopCountriesSectionTitle": {}, + "appName": "Aves", + "@appName": {}, + "welcomeTermsToggle": "Nõustun kasutustingimustega", + "@welcomeTermsToggle": {}, + "columnCount": "{count, plural, =1{{count} veerg} other{{count} veergu}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "clearTooltip": "Tühjenda", + "@clearTooltip": {}, + "previousTooltip": "Eelmine", + "@previousTooltip": {}, + "hideButtonLabel": "PEIDA", + "@hideButtonLabel": {}, + "chipActionSetCover": "Määra kaanepildiks", + "@chipActionSetCover": {}, + "vaultLockTypePattern": "Muster", + "@vaultLockTypePattern": {}, + "vaultLockTypePin": "PIN-kood", + "@vaultLockTypePin": {}, + "newVaultDialogTitle": "Uus turvaruum", + "@newVaultDialogTitle": {}, + "albumTierVaults": "Turvaruumid", + "@albumTierVaults": {}, + "vaultLockTypePassword": "Salasõna", + "@vaultLockTypePassword": {}, + "vaultDialogLockModeWhenScreenOff": "Ekraani väljalülitumisel lukusta turvaruum", + "@vaultDialogLockModeWhenScreenOff": {}, + "newVaultWarningDialogMessage": "Turvaruumis asuvad objektid on nähtavad vaid sellele rakendusele ja mitte ühelgi muul viisil.\n\nKui sa eemaldad nutiseadmest selle rakenduse või kustutad rakenduse andmed, siis kaob igasugune ligipääs nendele objektidele.", + "@newVaultWarningDialogMessage": {}, + "entryActionRestore": "Taasta", + "@entryActionRestore": {}, + "entryActionShare": "Jaga", + "@entryActionShare": {}, + "statsTopTagsSectionTitle": "Populaarsemad sildid", + "@statsTopTagsSectionTitle": {}, + "statsTopStatesSectionTitle": "Populaarsemad osariigid", + "@statsTopStatesSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Populaarsemad albumid", + "@statsTopAlbumsSectionTitle": {}, + "videoActionABRepeat": "A-B kordus", + "@videoActionABRepeat": {}, + "viewerActionLock": "Lukusta vaade", + "@viewerActionLock": {}, + "viewerActionUnlock": "Eemalda vaate lukustus", + "@viewerActionUnlock": {}, + "slideshowActionResume": "Jätka", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Näita kogumikus", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Muuda kuupäeva ja kellaaega", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Muuda asukohta", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "Muuda pealkirja ja kirjeldust", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Muuda hinnangut", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Muuda silte", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Eemalda metainfo", + "@entryInfoActionRemoveMetadata": {}, + "videoActionCaptureFrame": "Tee stoppkaader", + "@videoActionCaptureFrame": {}, + "entryInfoActionExportMetadata": "Ekspordi metainfo", + "@entryInfoActionExportMetadata": {}, + "entryInfoActionRemoveLocation": "Eemalda asukoht", + "@entryInfoActionRemoveLocation": {}, + "editorActionTransform": "Muuda", + "@editorActionTransform": {}, + "editorTransformCrop": "Kadreeri", + "@editorTransformCrop": {}, + "editorTransformRotate": "Pööra", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Vaba", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Algne", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Ruut", + "@cropAspectRatioSquare": {}, + "filterAspectRatioLandscapeLabel": "Rõhtloodis", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "Püstloodis", + "@filterAspectRatioPortraitLabel": {}, + "filterBinLabel": "Prügikast", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Lemmik", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Kuupäevata", + "@filterNoDateLabel": {}, + "filterNoAddressLabel": "Aadressita", + "@filterNoAddressLabel": {}, + "filterNoTagLabel": "Sildistamata", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Ilma nimeta", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "Täna", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Hiljuti lisatud", + "@filterRecentlyAddedLabel": {}, + "filterRatingRejectedLabel": "Tagasilükatud", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Animeeritud", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "Liikuv foto", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Panoraam", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw-vorming", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° video", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "accessibilityAnimationsRemove": "Eemalda ekraanieffektid", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Jäta ekraanieffektid alles", + "@accessibilityAnimationsKeep": {}, + "albumTierNew": "Uus", + "@albumTierNew": {}, + "albumTierPinned": "Esiletõstetud", + "@albumTierPinned": {}, + "albumTierSpecial": "Üldised", + "@albumTierSpecial": {}, + "albumTierApps": "Rakendused", + "@albumTierApps": {}, + "albumTierRegular": "Muud", + "@albumTierRegular": {}, + "coordinateFormatDms": "KMS", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Kümnendsüsteem", + "@coordinateFormatDecimal": {}, + "coordinateDmsWest": "W", + "@coordinateDmsWest": {}, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "coordinateDmsEast": "E", + "@coordinateDmsEast": {}, + "displayRefreshRatePreferLowest": "Madalaim sagedus", + "@displayRefreshRatePreferLowest": {}, + "displayRefreshRatePreferHighest": "Kõrgeim sagedus", + "@displayRefreshRatePreferHighest": {}, + "keepScreenOnVideoPlayback": "Video taasesitusel", + "@keepScreenOnVideoPlayback": {}, + "keepScreenOnViewerOnly": "Vaid vaate lehel", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Alati", + "@keepScreenOnAlways": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (hübriidkaart)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (maastik)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapStyleOsmHot": "OSMi humanitaarkaart", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor", + "@mapStyleStamenWatercolor": {}, + "maxBrightnessNever": "Mitte kunagi", + "@maxBrightnessNever": {}, + "subtitlePositionTop": "Üleval", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "All", + "@subtitlePositionBottom": {}, + "themeBrightnessLight": "Hele kujundus", + "@themeBrightnessLight": {}, + "settingsVideoEnablePip": "Pilt pildis", + "@settingsVideoEnablePip": {}, + "videoControlsPlayOutside": "Ava välises meediamängijas", + "@videoControlsPlayOutside": {}, + "videoLoopModeShortOnly": "Vaid lühivideod", + "@videoLoopModeShortOnly": {}, + "videoPlaybackSkip": "Jäta vahele", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Esita summutatuna", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Esita heliga", + "@videoPlaybackWithSound": {}, + "videoResumptionModeNever": "Mitte kunagi", + "@videoResumptionModeNever": {}, + "videoResumptionModeAlways": "Alati", + "@videoResumptionModeAlways": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Värskendussagedus", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsDisplayRefreshRateModeTile": "Ekraani värskendussagedus", + "@settingsDisplayRefreshRateModeTile": {}, + "filterLocatedLabel": "Asukoht tuvastatud", + "@filterLocatedLabel": {}, + "filterNoLocationLabel": "Asukoht tuvastamata", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Pole hinnatud", + "@filterNoRatingLabel": {}, + "filterTaggedLabel": "Sildistatud", + "@filterTaggedLabel": {}, + "filterMimeImageLabel": "Pilt", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "nameConflictStrategySkip": "Jäta vahele", + "@nameConflictStrategySkip": {}, + "overlayHistogramLuminance": "Heledus", + "@overlayHistogramLuminance": {}, + "maxBrightnessAlways": "Alati", + "@maxBrightnessAlways": {}, + "overlayHistogramNone": "Määratlemata", + "@overlayHistogramNone": {}, + "nameConflictStrategyRename": "Muuda nime", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Asenda", + "@nameConflictStrategyReplace": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "keepScreenOnNever": "Mitte kunagi", + "@keepScreenOnNever": {}, + "videoLoopModeNever": "Mitte kunagi", + "@videoLoopModeNever": {}, + "themeBrightnessDark": "Tume kujundus", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Süsimust kujundus", + "@themeBrightnessBlack": {}, + "videoLoopModeAlways": "Alati", + "@videoLoopModeAlways": {}, + "unitSystemMetric": "Meetermõõdustik", + "@unitSystemMetric": {}, + "viewerTransitionZoomIn": "Sissesuumimine", + "@viewerTransitionZoomIn": {}, + "wallpaperTargetLock": "Lukustusvaade", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Avaleht ja lukustusvaade", + "@wallpaperTargetHomeLock": {}, + "widgetDisplayedItemRandom": "Juhuslik", + "@widgetDisplayedItemRandom": {}, + "widgetDisplayedItemMostRecent": "Viimane", + "@widgetDisplayedItemMostRecent": {}, + "widgetOpenPageHome": "Mine avalehele", + "@widgetOpenPageHome": {}, + "widgetOpenPageCollection": "Ava kogumik", + "@widgetOpenPageCollection": {}, + "widgetOpenPageViewer": "Ava pildivaataja", + "@widgetOpenPageViewer": {}, + "widgetTapUpdateWidget": "Värskenda vidinat", + "@widgetTapUpdateWidget": {}, + "storageVolumeDescriptionFallbackPrimary": "Sisemine andmehoidla", + "@storageVolumeDescriptionFallbackPrimary": {}, + "rootDirectoryDescription": "juurkaust", + "@rootDirectoryDescription": {}, + "viewerTransitionNone": "Määratlemata", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Avaleht", + "@wallpaperTargetHome": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD-kaart", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "unitSystemImperial": "Inglise mõõdustik", + "@unitSystemImperial": {}, + "viewerTransitionSlide": "Äraliuglemine", + "@viewerTransitionSlide": {}, + "viewerTransitionFade": "Hajumine", + "@viewerTransitionFade": {}, + "viewerTransitionParallax": "Parallaks", + "@viewerTransitionParallax": {}, + "otherDirectoryDescription": "„{name}“ kaust", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "notEnoughSpaceDialogMessage": "See tegevus vajab „{volume}“ andmeruumis {neededSize} vaba andmemahtu, kuid alles on vaid {freeSize}.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "missingSystemFilePickerDialogMessage": "Süsteemi failihaldur/failivalija on puudu või kasutuselt eemaldatud. Palun pane ta tööle ja proovi siis uuesti.", + "@missingSystemFilePickerDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "Mõnedel sihtkausta failidel on sama nimi.", + "@nameConflictDialogSingleSourceMessage": {}, + "videoStartOverButtonLabel": "ALUSTA UUESTI", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "JÄTKA", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Viimane objekt", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Automaatne", + "@setCoverDialogAuto": {}, + "nameConflictDialogMultipleSourceMessage": "Mõnedel failidel on sama nimi.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "Kiirnupu silt", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "LISA", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "Pole rakendusi, mis oskaks seda kasutada.", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Kas viskame selle objekti prügikasti?} other{Kas viskame need {count} objekti prügikasti?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "moveUndatedConfirmationDialogMessage": "Kas enne jätkamist salvestame objekti kuupäevad?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Salvesta kuupäevad", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Kas sa soovid jätkata esitamist {time} kohalt?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "patternDialogEnter": "Sisesta viipemuster", + "@patternDialogEnter": {}, + "patternDialogConfirm": "Korda viipemustrit", + "@patternDialogConfirm": {}, + "pinDialogEnter": "Sisesta PIN-kood", + "@pinDialogEnter": {}, + "pinDialogConfirm": "Korda PIN-koodi", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "Sisesta salasõna", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Korda salasõna", + "@passwordDialogConfirm": {}, + "renameAlbumDialogLabel": "Uus nimi", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Selline kaust on juba olemas", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Muuda nime", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "Failide nimemuster", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Lisa väli", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Eelvaade", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Loendur", + "@renameProcessorCounter": {}, + "renameProcessorHash": "Räsi", + "@renameProcessorHash": {}, + "renameProcessorName": "Nimi", + "@renameProcessorName": {}, + "storageAccessDialogMessage": "Palun anna sellele rakendusele järgmises ekraanivaates õigused {directory} kaustale „{volume}“ andmekogus.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "restrictedAccessDialogMessage": "Sellel rakendusel pole õigusi muuta faile „{volume}“ andmekogu {directory} kaustas.\n\nPalun kasuta failihaldurit või galeriirakendust failide tõstmiseks muude asukohta.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "setCoverDialogCustom": "Sinu valik", + "@setCoverDialogCustom": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Kas kustutame selle objekti?} other{Kas kustutame need {count} objekti?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "newDynamicAlbumDialogTitle": "Uus dünaamiline album", + "@newDynamicAlbumDialogTitle": {}, + "dynamicAlbumAlreadyExists": "Selline dünaamiline album on juba olemas", + "@dynamicAlbumAlreadyExists": {}, + "editEntryDialogCopyFromItem": "Kopi teisest objektist", + "@editEntryDialogCopyFromItem": {}, + "editEntryDialogTargetFieldsHeader": "Muudetavad väljad", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Kuupäev ja kellaaeg", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Määra soovitud kuupäev", + "@editEntryDateDialogSetCustom": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{See tegevus pole toetatud antud tüüpi objekti puhul: {types}.} other{See tegevus pole toetatud antud tüüpi objektide puhul: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "newAlbumDialogTitle": "Uus album", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Albumi nimi", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Sellise nimega album on juba olemas", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Selline kaust on juba olemas", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Andmeruum:", + "@newAlbumDialogStorageLabel": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Kas kustutame need albumis koos seal leiduva ühe objektiga?} other{Kas kustutame need albumis koos seal leiduva {count} objektiga?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "exportEntryDialogWriteMetadata": "Salvesta metainfo", + "@exportEntryDialogWriteMetadata": {}, + "renameEntryDialogLabel": "Uus nimi", + "@renameEntryDialogLabel": {}, + "editEntryDateDialogCopyField": "Kopeeri muust kuupäevast", + "@editEntryDateDialogCopyField": {}, + "exportEntryDialogHeight": "Kõrgus", + "@exportEntryDialogHeight": {}, + "exportEntryDialogQuality": "Kvaliteet", + "@exportEntryDialogQuality": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Kas kustutame selle albumi koos seal leiduva ühe objektiga?} other{Kas kustutame selle albumi koos seal leiduva {count} objektiga?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "exportEntryDialogFormat": "Vorming:", + "@exportEntryDialogFormat": {}, + "chipActionRemove": "Eemalda", + "@chipActionRemove": {}, + "exportEntryDialogWidth": "Laius", + "@exportEntryDialogWidth": {}, + "albumTierDynamic": "Dünaamiline", + "@albumTierDynamic": {}, + "durationDialogSeconds": "Sekundid", + "@durationDialogSeconds": {}, + "editEntryLocationDialogTitle": "Asukoht", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogSetCustom": "Määra asukoht ise", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogChooseOnMap": "Vali kaardilt", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "Laiuskraad", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "Pikkuskraad", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "Kasuta seda asukohta", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "Hinnang", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Metainfo eemaldamine", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP on vajalik video esitamisel foto sees.\n\nKas oled kindel, et soovid selle metainfo eemaldada?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "videoStreamSelectionDialogAudio": "Heliriba", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Subtiitrid", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "Välja lülitatud", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Videoriba", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "Rohkem meediaribasid failis pole.", + "@videoStreamSelectionDialogNoSelection": {}, + "viewDialogSortSectionTitle": "Järjesta", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "Rubriigid", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Paiguta", + "@viewDialogLayoutSectionTitle": {}, + "tileLayoutMosaic": "Mosaiik", + "@tileLayoutMosaic": {}, + "castDialogTitle": "Seadmed peegeldamiseks", + "@castDialogTitle": {}, + "coverDialogTabCover": "Kaanepilt", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "Rakenduse", + "@coverDialogTabApp": {}, + "aboutPageTitle": "Rakenduse teave", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Litsents", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Privaatsuspoliitika", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Veateated", + "@aboutBugSectionTitle": {}, + "aboutBugCopyInfoInstruction": "Kopeeri süsteemiteave", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugReportInstruction": "Teata GitHubis koos logide ja süsteemiteabega", + "@aboutBugReportInstruction": {}, + "aboutDataUsageSectionTitle": "Andmekasutus", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageCache": "Vahemälu", + "@aboutDataUsageCache": {}, + "aboutDataUsageClearCache": "Tühjenda vahemälu", + "@aboutDataUsageClearCache": {}, + "aboutCreditsWorldAtlas1": "See rakendus kasutab TopoJSONi faili, mille on koostanud", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": ", avaldatud ISC Litsentsi alusel.", + "@aboutCreditsWorldAtlas2": {}, + "aboutLicensesSectionTitle": "Avatud lähtekoodiga tarkvara litsentsid", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutteri paketid", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Darti paketid", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Näita kõiki litsentse", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "Andmekaitsepõhimõtted", + "@policyPageTitle": {}, + "collectionPageTitle": "Meediakogu", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "Vali", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "Vali objektid", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Näita pealkirjade filtrit", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Peida pealkirjade filter", + "@collectionActionHideTitleSearch": {}, + "collectionActionCopy": "Kopeeri albumisse", + "@collectionActionCopy": {}, + "dateThisMonth": "Sel kuul", + "@dateThisMonth": {}, + "entryActionCast": "Peegelda välisseadmesse", + "@entryActionCast": {}, + "hideFilterConfirmationDialogMessage": "Filtrile vastavad fotod ja videod on sinu meediakogust peidetud. Kui soovid neid uuesti kuvada, siis seadistuste alajaotusest „Privaatsus“ saad seda lubada.\n\nKas sa oled kindel, et soovid neid peita?", + "@hideFilterConfirmationDialogMessage": {}, + "editEntryDateDialogExtractFromTitle": "Tuvasta pealkirjast", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Nihuta ajatemplit", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "Faili muutmisaeg", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "Tunnid", + "@durationDialogHours": {}, + "durationDialogMinutes": "Minutid", + "@durationDialogMinutes": {}, + "genericSuccessFeedback": "Valmis!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Ei õnnestunud", + "@genericFailureFeedback": {}, + "genericDangerWarningDialogMessage": "Kas sa oled kindel?", + "@genericDangerWarningDialogMessage": {}, + "tooManyItemsErrorDialogMessage": "Proovi uuesti, aga väiksema arvu objektidega.", + "@tooManyItemsErrorDialogMessage": {}, + "menuActionConfigureView": "Vaata", + "@menuActionConfigureView": {}, + "menuActionSelect": "Vali", + "@menuActionSelect": {}, + "menuActionSelectAll": "Vali kõik", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "Ära vali midagi", + "@menuActionSelectNone": {}, + "menuActionMap": "Kaart", + "@menuActionMap": {}, + "menuActionSlideshow": "Slaidiesitlus", + "@menuActionSlideshow": {}, + "menuActionStats": "Statistika", + "@menuActionStats": {}, + "aboutDataUsageInternal": "Sisemine", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "Väline", + "@aboutDataUsageExternal": {}, + "aboutLicensesBanner": "See rakendus kasutab järgmiseid avatud lähtekoodiga pakette ja teeke.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Androidi teegid", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutteri lisamoodulid", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "collectionActionMove": "Teisalda albumisse", + "@collectionActionMove": {}, + "collectionActionRescan": "Skaneeri uuesti", + "@collectionActionRescan": {}, + "collectionActionEdit": "Muuda", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Otsi pealkirju", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "Albumi alusel", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Kuude kaupa", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Päevade kaupa", + "@collectionGroupDay": {}, + "sectionUnknown": "Teadmata", + "@sectionUnknown": {}, + "dateToday": "Täna", + "@dateToday": {}, + "dateYesterday": "Eile", + "@dateYesterday": {}, + "videoSpeedDialogLabel": "Taasesituse kiirus", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "viewDialogReverseSortOrder": "Tagurpidi järjestus", + "@viewDialogReverseSortOrder": {}, + "removeEntryMetadataDialogMore": "Veel", + "@removeEntryMetadataDialogMore": {}, + "tileLayoutList": "Loend", + "@tileLayoutList": {}, + "appPickDialogTitle": "Vali rakendus", + "@appPickDialogTitle": {}, + "coverDialogTabColor": "Värv", + "@coverDialogTabColor": {}, + "tileLayoutGrid": "Ruudustik", + "@tileLayoutGrid": {}, + "appPickDialogNone": "Määratlemata", + "@appPickDialogNone": {}, + "aboutBugSaveLogInstruction": "Salvesta rakenduse logid faili", + "@aboutBugSaveLogInstruction": {}, + "aboutDataUsageMisc": "Varia", + "@aboutDataUsageMisc": {}, + "aboutDataUsageDatabase": "Andmebaas", + "@aboutDataUsageDatabase": {}, + "aboutCreditsSectionTitle": "Tänuavaldused", + "@aboutCreditsSectionTitle": {}, + "aboutBugCopyInfoButton": "Kopeeri", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportButton": "Teata veast", + "@aboutBugReportButton": {}, + "collectionActionEmptyBin": "Tühjenda prügikast", + "@collectionActionEmptyBin": {}, + "aboutTranslatorsSectionTitle": "Tõlkijad", + "@aboutTranslatorsSectionTitle": {}, + "aboutDataUsageData": "Andmed", + "@aboutDataUsageData": {}, + "collectionActionAddShortcut": "Lisa viide", + "@collectionActionAddShortcut": {}, + "collectionActionAddDynamicAlbum": "Lisa dünaamiline album", + "@collectionActionAddDynamicAlbum": {}, + "collectionActionSetHome": "Märgi avaleheks", + "@collectionActionSetHome": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{1 objekti kustutamine ei õnnestunud} other{{count} objekti kustutamine ei õnnestunud}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{1 objekti teisaldamine ei õnnestunud} other{{count} objekti teisaldamine ei õnnestunud}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, =1{Kopeerisime 1 objekti} other{Kopeerisime {count} objekti}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{Muutsime 1 objekti nime} other{Muutsime {count} objekti nime}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEmptyImages": "Pilte pole", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Luba juurdepääs", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Vali lõik", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Eemalda lõigu valik", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "Teave", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Seadistused", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "Kõik kogumikud", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Lemmikud", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Pildid", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Videod", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "Animeeritud", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Liikuvad fotod", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "Panoraamfotod", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Raw-vormingus fotod", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "360° videod", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Albumid", + "@drawerAlbumPage": {}, + "drawerCountryPage": "Riigid", + "@drawerCountryPage": {}, + "drawerPlacePage": "Kohad", + "@drawerPlacePage": {}, + "drawerTagPage": "Sildid", + "@drawerTagPage": {}, + "sortOrderHighestFirst": "Esmalt kõrgemad", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Esmalt madalamad", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Esmalt suuremad", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "Esmalt väiksemad", + "@sortOrderSmallestFirst": {}, + "sortOrderShortestFirst": "Esmalt lühemad", + "@sortOrderShortestFirst": {}, + "albumPickPageTitlePick": "Vali album", + "@albumPickPageTitlePick": {}, + "albumPickPageTitleExport": "Ekspordi albumisse", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Teisalda albumisse", + "@albumPickPageTitleMove": {}, + "albumCamera": "Kaamera", + "@albumCamera": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{1 objekti nime muutmine ei õnnestunud} other{{count} objekti nime muutmine ei õnnestunud}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{1 objekti muutmine ei õnnestunud} other{{count} objekti muutmine ei õnnestunud}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "sortOrderAtoZ": "A kuni Z", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Z kuni A", + "@sortOrderZtoA": {}, + "sortByDate": "Kuupäeva alusel", + "@sortByDate": {}, + "sortByItemCount": "Objektide arvu järgi", + "@sortByItemCount": {}, + "sortBySize": "Suuruse alusel", + "@sortBySize": {}, + "sortByName": "Nime alusel", + "@sortByName": {}, + "sortByAlbumFileName": "Albumi ja objekti nime alusel", + "@sortByAlbumFileName": {}, + "sortByRating": "Hinnangu alusel", + "@sortByRating": {}, + "sortByDuration": "Kestuse järgi", + "@sortByDuration": {}, + "sortOrderNewestFirst": "Esmalt uuemad", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Esmalt vanemad", + "@sortOrderOldestFirst": {}, + "sortOrderLongestFirst": "Esmalt pikemad", + "@sortOrderLongestFirst": {}, + "albumGroupTier": "Taseme järgi", + "@albumGroupTier": {}, + "albumGroupType": "Tüübi järgi", + "@albumGroupType": {}, + "albumGroupVolume": "Andmemahu alusel", + "@albumGroupVolume": {}, + "albumMimeTypeMixed": "Erinev sisu", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "Kopeeri albumisse", + "@albumPickPageTitleCopy": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{1 objekti kopeerimine ei õnnestunud} other{{count} objekti kopeerimine ei õnnestunud}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEmptyFavourites": "Sul pole veel lemmikud", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "Videoid pole", + "@collectionEmptyVideos": {}, + "collectionExportFailureFeedback": "{count, plural, =1{1 lehe eksportimine ei õnnestunud} other{{count} lehe eksportimine ei õnnestunud}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{Muutsime 1 objekti} other{Muutsime {count} objekti}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{Teisaldasime 1 objekti} other{Teisaldasime {count} objekti}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "albumDownload": "Laadi alla", + "@albumDownload": {}, + "albumScreenshots": "Ekraanitõmmised", + "@albumScreenshots": {}, + "albumScreenRecordings": "Ekraanisalvestused", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Videosalvestused", + "@albumVideoCaptures": {}, + "albumPageTitle": "Albumid", + "@albumPageTitle": {}, + "albumEmpty": "Albumeid ei leidu", + "@albumEmpty": {}, + "createAlbumButtonLabel": "LOO", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "uus", + "@newFilterBanner": {}, + "countryPageTitle": "Riigid", + "@countryPageTitle": {}, + "countryEmpty": "Riike pole", + "@countryEmpty": {}, + "statePageTitle": "Osariigid", + "@statePageTitle": {}, + "stateEmpty": "Osariike pole", + "@stateEmpty": {}, + "placePageTitle": "Asukohad", + "@placePageTitle": {}, + "placeEmpty": "Asukohti pole", + "@placeEmpty": {}, + "tagPageTitle": "Sildid", + "@tagPageTitle": {}, + "tagEmpty": "Silte pole", + "@tagEmpty": {}, + "binPageTitle": "Prügikast", + "@binPageTitle": {}, + "explorerPageTitle": "Sirvija", + "@explorerPageTitle": {}, + "explorerActionSelectStorageVolume": "Vali andmeruum", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "Vali andmeruum", + "@selectStorageVolumeDialogTitle": {}, + "searchDateSectionTitle": "Kuupäevad", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "Albumid", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "Riigid", + "@searchCountriesSectionTitle": {}, + "searchStatesSectionTitle": "Osariigid", + "@searchStatesSectionTitle": {}, + "searchPlacesSectionTitle": "Asukohad", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Sildid", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "Hinnagud", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "Metainfo", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Seadistused", + "@settingsPageTitle": {}, + "settingsSystemDefault": "Süsteemi vaikeseadistused", + "@settingsSystemDefault": {}, + "settingsDefault": "Vaikimisi", + "@settingsDefault": {}, + "settingsDisabled": "Pole kasutusel", + "@settingsDisabled": {}, + "settingsAskEverytime": "Küsi iga kord", + "@settingsAskEverytime": {}, + "settingsModificationWarningDialogMessage": "Muud seadistused kuuluvad muutmisele.", + "@settingsModificationWarningDialogMessage": {}, + "settingsSearchFieldLabel": "Otsi seadistustest", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Sellist seadistust ei leidu", + "@settingsSearchEmpty": {}, + "settingsActionExport": "Ekspordi", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "Eksport", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "Impordi", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Import", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "Kaanepildid", + "@appExportCovers": {}, + "appExportDynamicAlbums": "Dünaamilised albumid", + "@appExportDynamicAlbums": {}, + "appExportFavourites": "Lemmikud", + "@appExportFavourites": {}, + "appExportSettings": "Seadistused", + "@appExportSettings": {}, + "settingsHomeTile": "Avavaade", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Avavaade", + "@settingsHomeDialogTitle": {}, + "settingsNavigationSectionTitle": "Põhivaated", + "@settingsNavigationSectionTitle": {}, + "setHomeCustom": "Sinu valitud", + "@setHomeCustom": {}, + "settingsKeepScreenOnTile": "Hoia ekraan sisselülitatuna", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Hoia ekraan sisselülitatuna", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Väljumiseks klõpsi „Tagasi“ nuppu kaks korda", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "Kinnitused", + "@settingsConfirmationTile": {}, + "settingsConfirmationBeforeMoveToBinItems": "Küsi kinnitust enne objektide viskamist prügikasti", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Küsi kinnitust enne kuupäevadeta objektide teisaldamist", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsNavigationDrawerTile": "Ikooniriba", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerBanner": "Menüüobjektide teisaldamiseks ja järjekorra muutmiseks vajuta ja hoia all.", + "@settingsNavigationDrawerBanner": {}, + "settingsThumbnailSectionTitle": "Pisipildid", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "Ülekate", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailShowHdrIcon": "Näita HDR-ikooni", + "@settingsThumbnailShowHdrIcon": {}, + "settingsThumbnailShowFavouriteIcon": "Näita lemmikute ikooni", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Näita siltide ikooni", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Näita asukoha ikooni", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Näita liikuva foto ikooni", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "Näita hinnangute ikooni", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Näita Raw-vormingu ikooni", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Näita videote kestust", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "Kiirtoimingud", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Kiirtoimingud", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Sirvimine", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Valimine", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Kui soovid valida, mis tegevused on saadaval objektide sirvimisel, siis vajuta ning hoia soovitud ikooni ning lohista ta vajalikku vaatesse.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Kui soovid valida, mis tegevused on saadaval objektide valimisel, siis vajuta ning hoia soovitud ikooni ning lohista ta vajalikku vaatesse.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsCollectionBurstPatternsTile": "Laienda mustreid", + "@settingsCollectionBurstPatternsTile": {}, + "settingsCollectionBurstPatternsNone": "Määratlemata", + "@settingsCollectionBurstPatternsNone": {}, + "settingsViewerSectionTitle": "Pildivaataja", + "@settingsViewerSectionTitle": {}, + "searchCollectionFieldHint": "Otsi kogumikku", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "Hiljutised", + "@searchRecentSectionTitle": {}, + "settingsNavigationDrawerTabTypes": "Tüübid", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "Albumid", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Lehed", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Lisa album", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsConfirmationDialogTitle": "Kinnitused", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationAfterMoveToBinItems": "Näita teadet peale objektide viskamist prügikasti", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsConfirmationBeforeDeleteItems": "Küsi kinnitust enne objektide lõplikku kustutamist", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsThumbnailOverlayPageTitle": "Ülekate", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsNavigationDrawerEditorPageTitle": "Ikooniriba", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsViewerSlideshowPageTitle": "Slaidiesitlus", + "@settingsViewerSlideshowPageTitle": {}, + "settingsMotionPhotoAutoPlay": "Esita liikuivaid fotosid automaatselt", + "@settingsMotionPhotoAutoPlay": {}, + "settingsViewerShowInformation": "Näita teavet", + "@settingsViewerShowInformation": {}, + "settingsVideoEnableHardwareAcceleration": "Raudvaraline kiirendus", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsViewerQuickActionEmpty": "Sa pole ühtegi nuppu siia lisanud", + "@settingsViewerQuickActionEmpty": {}, + "settingsVideoPageTitle": "Video seadistused", + "@settingsVideoPageTitle": {}, + "settingsViewerShowRatingTags": "Näita hinnangut ja silte", + "@settingsViewerShowRatingTags": {}, + "viewerInfoLabelSize": "Suurus", + "@viewerInfoLabelSize": {}, + "settingsViewerMaximumBrightness": "Maksimaalne heledus", + "@settingsViewerMaximumBrightness": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Video taasesitus", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPlaybackPageTitle": "Taasesitus", + "@settingsVideoPlaybackPageTitle": {}, + "settingsSubtitleThemePageTitle": "Subtiitrid", + "@settingsSubtitleThemePageTitle": {}, + "settingsEnableBinSubtitle": "Hoia kustutatud objekte 30 päeva", + "@settingsEnableBinSubtitle": {}, + "settingsHiddenFiltersBanner": "Peidetuse filtritele vastavad fotod ja videod ei saa olema nähtavad sinu meediakogus.", + "@settingsHiddenFiltersBanner": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "panoramaDisableSensorControl": "Lülita anduripõhine kontroll välja", + "@panoramaDisableSensorControl": {}, + "settingsViewerUseCutout": "Kasuta väljalõigatud ala", + "@settingsViewerUseCutout": {}, + "settingsImageBackground": "Pildi taust", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Kiirtoimingud", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerGestureSideTapNext": "Eelmise ja järgmise meediafaili vaatamiseks puuduta ekraani ääri", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerQuickActionEditorPageTitle": "Kiirtoimingud", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Kuvatavad nupud", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Saadaval olevad nupud", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerOverlayTile": "Ülekate", + "@settingsViewerOverlayTile": {}, + "settingsViewerShowOverlayOnOpening": "Näita avamisel", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowHistogram": "Näita histogrammi", + "@settingsViewerShowHistogram": {}, + "settingsViewerShowMinimap": "Näita minikaarti", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformationSubtitle": "Näita nime, kuupäeva, asukohta jne.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowShootingDetails": "Näita pildistamise üksikasju", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowDescription": "Näita kirjeldust", + "@settingsViewerShowDescription": {}, + "settingsViewerShowOverlayThumbnails": "Näita pisipilte", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "Hägustamisefekt", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "Slaidiesitlus", + "@settingsViewerSlideshowTile": {}, + "settingsSlideshowShuffle": "Sega järjestust", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Täida kogu ekraan", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowAnimatedZoomEffect": "Animeeritud suumiefekt", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "Üleminekud meedia vahetamisel", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Välp meedia vahetamisel", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "Video taasesitus", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsVideoShowVideos": "Näita videoid", + "@settingsVideoShowVideos": {}, + "settingsVideoPlaybackTile": "Taasesitus", + "@settingsVideoPlaybackTile": {}, + "settingsVideoResumptionModeTile": "Jätka taasesitust", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoResumptionModeDialogTitle": "Jätka taasesitust", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsVideoBackgroundMode": "Esitus taustal", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "Esitus taustal", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsVideoControlsTile": "Juhtnupud", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "Juhtnupud", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "Nupud", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Esita või peata esitus topeltpuudutusega", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "Topeltpuudutus ekraani äärtel kerib edasi või tagasi", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Üles või alla viipamine muudab eredust ja helivaljust", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsSubtitleThemeTile": "Subtiitrid", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemeSample": "See on üks lihtne näide.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "Teksti joondumine", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Teksti joondumine", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextPositionTile": "Teksti asukoht", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Teksti asukoht", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Teksti suurus", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "Näite äärejoont ja varju", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Teksti värv", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Teksti läbipaistmatus", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Taustavärv", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Tausta läbipaistmatus", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Vasakul", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Keskel", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Paremal", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsPrivacySectionTitle": "Privaatsus", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Luba ligipääs rakenduse andmekogule", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowErrorReporting": "Luba anonüümset veateavitust", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Salvesta otsingute ajalugu", + "@settingsSaveSearchHistory": {}, + "settingsDisablingBinWarningDialogMessage": "Prügikastis olevad objektid kustutatakse jäädavalt.", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsAllowMediaManagement": "Kasuta meediahaldust", + "@settingsAllowMediaManagement": {}, + "settingsHiddenItemsTile": "Peidetud objektid", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Peidetud objektid", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersEmpty": "Peidetuse filtreid ei ole", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Ligipääs andmeruumile", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessBanner": "Mõned kaustad vajavad eraldi lubamist seal asuvate failide muutmiseks. Siin näed kaustu, millele sa varem oled sellised õigused jaganud.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Ligipääsuõigusi pole määratud", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Eemalda õigused", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Ligipääsetavus", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Eemalda animatsioonid", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "Eemalda animatsioonid", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Viivitus enne toiminguid", + "@settingsTimeToTakeActionTile": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Näita alternatiive mitmikpuutele", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsDisplaySectionTitle": "Ekraan", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Kujundus", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "Kujundus", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "Esiletõstetud värvid", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Dünaamilised värvid", + "@settingsThemeEnableDynamicColor": {}, + "settingsCoordinateFormatTile": "Koordinaatide vorming", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "Koordinaatide vorming", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemDialogTitle": "Ühikud", + "@settingsUnitSystemDialogTitle": {}, + "settingsForceWesternArabicNumeralsTile": "Jõusta araabia numbrite kasutus", + "@settingsForceWesternArabicNumeralsTile": {}, + "settingsWidgetPageTitle": "Fotoraam", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Piirjoon", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "Vidinal klõpsides", + "@settingsWidgetOpenPage": {}, + "settingsWidgetDisplayedItem": "Kuvatav objekt", + "@settingsWidgetDisplayedItem": {}, + "settingsCollectionTile": "Meediakogu", + "@settingsCollectionTile": {}, + "statsWithGps": "{count, plural, =1{1 asukohaga objekt} other{{count} asukohaga objekti}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "viewerSetWallpaperButtonLabel": "MÄÄRA TAUSTAPILDIKS", + "@viewerSetWallpaperButtonLabel": {}, + "viewerOpenPanoramaButtonLabel": "AVA PANORAAM", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerErrorUnknown": "Oih, vabandust!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "Seda faili pole enam olemas.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Meedia teave", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "Tagasi pildivaataja juurde", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "teadmata", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "Kirjeldus", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelDate": "Kuupäev", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "Resolutsioon", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Asukoht", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Kestus", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelCoordinates": "Koordinaadid", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Aadress", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Kaardi stiil", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Vali kaardi stiil", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Suumi sisse", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Suumi välja", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Põhjasuund ülal", + "@mapPointNorthUpTooltip": {}, + "mapAttributionOsmLiberty": "Kaardipaanid: [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Kaardiserver: [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "mapAttributionOsmHot": "Kaardipaanid: [HOT](https://www.hotosm.org/) • Kaardiserver: [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapEmptyRegion": "Sellest piirkonnast ei leidu pilte", + "@mapEmptyRegion": {}, + "viewerInfoSearchFieldLabel": "Otsi metainfot", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Vastavaid võtmeid ei leidu", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Kuupäev ja kellaaeg", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Kirjeldus", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Mõõdud", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Resolutsioon", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Õigused", + "@viewerInfoSearchSuggestionRights": {}, + "wallpaperUseScrollEffect": "Kasuta avalehel kerimisefekti", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageTitle": "Muuda silte", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Uus silt", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Lisa silt", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Hiljutised", + "@tagEditorSectionRecent": {}, + "tagEditorSectionPlaceholders": "Asukohanäitajad", + "@tagEditorSectionPlaceholders": {}, + "tagEditorDiscardDialogMessage": "Kas sa soovid muudatustest loobuda?", + "@tagEditorDiscardDialogMessage": {}, + "tagPlaceholderCountry": "Riik", + "@tagPlaceholderCountry": {}, + "tagPlaceholderState": "Osariik", + "@tagPlaceholderState": {}, + "tagPlaceholderPlace": "Asukoht", + "@tagPlaceholderPlace": {}, + "panoramaEnableSensorControl": "Lülita anduripõhine kontroll sisse", + "@panoramaEnableSensorControl": {}, + "sourceViewerPageTitle": "Allikas", + "@sourceViewerPageTitle": {}, + "settingsSlideshowRepeat": "Korda", + "@settingsSlideshowRepeat": {}, + "settingsVideoAutoPlay": "Automaatne taasesitus", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "Korda videoid", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Korda videoid", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsDisplayUseTvInterface": "Android TV-liidestus", + "@settingsDisplayUseTvInterface": {}, + "settingsLanguageSectionTitle": "Keeled ja vormingud", + "@settingsLanguageSectionTitle": {}, + "settingsUnitSystemTile": "Ühikud", + "@settingsUnitSystemTile": {}, + "settingsLanguageTile": "Keel", + "@settingsLanguageTile": {}, + "viewerInfoOpenLinkText": "Ava", + "@viewerInfoOpenLinkText": {}, + "openMapPageTooltip": "Vaata kaardilehel", + "@openMapPageTooltip": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Lõimitud andmete lugemine ei õnnestunud", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoLabelOwner": "Omanik", + "@viewerInfoLabelOwner": {}, + "settingsScreenSaverPageTitle": "Ekraanisäästja", + "@settingsScreenSaverPageTitle": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Kaardipaanid: [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "statsPageTitle": "Statistika", + "@statsPageTitle": {}, + "mapAttributionStamen": "Kaardipaanid: [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "viewerInfoLabelTitle": "Pealkiri", + "@viewerInfoLabelTitle": {}, + "mapAttributionOsmData": "Kaardiandmed © [OpenStreetMap](https://www.openstreetmap.org/copyright) kaasautorid", + "@mapAttributionOsmData": {}, + "settingsViewerQuickActionEditorBanner": "Nuppude/ikoonide valimiseks ja kahe vaate vahel teisaldamiseks puuduta ja all hoides lohista uude kohta.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerOverlayPageTitle": "Ülekate", + "@settingsViewerOverlayPageTitle": {}, + "settingsAllowInstalledAppAccessSubtitle": "Seda kasutatakse albumite kuvamise parandamiseks", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsEnableBin": "Kasuta prügikasti", + "@settingsEnableBin": {}, + "settingsStorageAccessPageTitle": "Ligipääs andmeruumile", + "@settingsStorageAccessPageTitle": {}, + "settingsLanguagePageTitle": "Keel", + "@settingsLanguagePageTitle": {}, + "viewerInfoViewXmlLinkText": "Vaata XMLi", + "@viewerInfoViewXmlLinkText": {}, + "chipActionDecompose": "Poolita", + "@chipActionDecompose": {}, + "coordinateFormatDdm": "KKM", + "@coordinateFormatDdm": {}, + "editEntryLocationDialogTimeShift": "Ajanihe", + "@editEntryLocationDialogTimeShift": {}, + "editEntryLocationDialogImportGpx": "Impordi GPX-fail", + "@editEntryLocationDialogImportGpx": {}, + "removeEntryMetadataDialogAll": "Kõik", + "@removeEntryMetadataDialogAll": {}, + "sortByPath": "Asukoha alusel", + "@sortByPath": {}, + "searchFormatSectionTitle": "Vormingud", + "@searchFormatSectionTitle": {}, + "chipActionCreateGroup": "Loo grupp", + "@chipActionCreateGroup": {}, + "albumTierGroups": "Grupid", + "@albumTierGroups": {}, + "newGroupDialogTitle": "Uus grupp", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Grupi nimi", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "Selline grupp on juba olemas", + "@groupAlreadyExists": {}, + "groupEmpty": "Gruppe pole", + "@groupEmpty": {}, + "ungrouped": "Grupeerimata", + "@ungrouped": {}, + "groupPickerTitle": "Vali grupp", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Kasuta seda gruppi", + "@groupPickerUseThisGroupButton": {}, + "createButtonLabel": "LOO", + "@createButtonLabel": {}, + "chipActionGroup": "Muuda grupeerimist", + "@chipActionGroup": {}, + "sectionNone": "Rubriike pole", + "@sectionNone": {}, + "mapStyleDialogAddStyle": "Lisa stiil", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogUrl": "Võrguaadress", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogName": "Nimi", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogSubdomains": "Alamdomeenid", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "Rakenduse nimi võrgus", + "@mapStyleEditorDialogUserAgent": {}, + "settingsNavigationBottomActionsTile": "Alumine ikooniriba", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Alumine ikooniriba", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Nuppude/ikoonide teisaldamiseks hoia neid all ja lohista uude kohta ning vali, mis tegevusi tahad ikooniribalt teha.", + "@settingsNavigationBottomActionEditorBanner": {}, + "tagPickPageTitle": "Vali silt", + "@tagPickPageTitle": {}, + "settingsViewerShowZoomLevel": "Näita kasutusel suumi", + "@settingsViewerShowZoomLevel": {}, + "settingsEnabled": "Kasutusel", + "@settingsEnabled": {}, + "settingsForced": "Jõustatud", + "@settingsForced": {} +} diff --git a/lib/l10n/app_eu.arb b/lib/l10n/app_eu.arb new file mode 100644 index 0000000..09b4ad6 --- /dev/null +++ b/lib/l10n/app_eu.arb @@ -0,0 +1,1568 @@ +{ + "saveTooltip": "Gorde", + "@saveTooltip": {}, + "columnCount": "{count, plural, =1{zutabe {count}} other{{count} zutabe}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeSeconds": "{count, plural, =1{segundu {count}} other{{count} segundu}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "timeMinutes": "{count, plural, =1{minutu {count}} other{{count} minutu}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "timeDays": "{count, plural, =1{egun {count}} other{{count} egun}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "applyButtonLabel": "APLIKATU", + "@applyButtonLabel": {}, + "deleteButtonLabel": "EZABATU", + "@deleteButtonLabel": {}, + "nextButtonLabel": "HURRENGOA", + "@nextButtonLabel": {}, + "showButtonLabel": "ERAKUTSI", + "@showButtonLabel": {}, + "hideButtonLabel": "EZKUTATU", + "@hideButtonLabel": {}, + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Ongi etorri", + "@welcomeMessage": {}, + "welcomeOptional": "Aukerazkoa", + "@welcomeOptional": {}, + "itemCount": "{count, plural, =1{elementu {count}} other{{count} elementu}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "welcomeTermsToggle": "Termino eta baldintzekin ados nago", + "@welcomeTermsToggle": {}, + "cancelTooltip": "Utzi", + "@cancelTooltip": {}, + "continueButtonLabel": "JARRAITU", + "@continueButtonLabel": {}, + "nextTooltip": "Hurrengoa", + "@nextTooltip": {}, + "changeTooltip": "Aldatu", + "@changeTooltip": {}, + "clearTooltip": "Garbitu", + "@clearTooltip": {}, + "previousTooltip": "Aurrekoa", + "@previousTooltip": {}, + "showTooltip": "Erakutsi", + "@showTooltip": {}, + "actionRemove": "Ezabatu", + "@actionRemove": {}, + "resetTooltip": "Berrezarri", + "@resetTooltip": {}, + "hideTooltip": "Ezkutatu", + "@hideTooltip": {}, + "doubleBackExitMessage": "Sakatu «itzuli» berriro irteteko.", + "@doubleBackExitMessage": {}, + "pickTooltip": "Aukeratu", + "@pickTooltip": {}, + "chipActionGoToAlbumPage": "Erakutsi albumetan", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToTagPage": "Erakutsi etiketetan", + "@chipActionGoToTagPage": {}, + "entryActionRotateCW": "Biratu erlojuaren orratzen noranzkoan", + "@entryActionRotateCW": {}, + "entryActionPrint": "Inprimatu", + "@entryActionPrint": {}, + "entryActionConvertMotionPhotoToStillImage": "Bihurtu irudi finko batean", + "@entryActionConvertMotionPhotoToStillImage": {}, + "coordinateDmsSouth": "H", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "E", + "@coordinateDmsEast": {}, + "nameConflictStrategyRename": "Berrizendatu", + "@nameConflictStrategyRename": {}, + "videoPlaybackSkip": "Jauzi", + "@videoPlaybackSkip": {}, + "videoPlaybackWithSound": "Soinuarekin erreproduzitu", + "@videoPlaybackWithSound": {}, + "viewerTransitionFade": "Desagertu", + "@viewerTransitionFade": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD txartela", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "Erro-karpeta", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "«{name}» karpeta", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "doNotAskAgain": "Ez galdetu berriro", + "@doNotAskAgain": {}, + "chipActionDelete": "Ezabatu", + "@chipActionDelete": {}, + "sourceStateLoading": "Kargatzen", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Katalogatzen", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Herrialdeak kokatzen", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Lekuak kokatzen", + "@sourceStateLocatingPlaces": {}, + "chipActionGoToCountryPage": "Erakutsi herrialdeetan", + "@chipActionGoToCountryPage": {}, + "chipActionFilterIn": "Iragazi", + "@chipActionFilterIn": {}, + "chipActionFilterOut": "Ez iragazi", + "@chipActionFilterOut": {}, + "chipActionHide": "Ezkutatu", + "@chipActionHide": {}, + "chipActionPin": "Finkatu goran", + "@chipActionPin": {}, + "entryInfoActionRemoveMetadata": "Kendu metadatuak", + "@entryInfoActionRemoveMetadata": {}, + "slideshowActionResume": "Jarraitu", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Erakutsi bilduman", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditTags": "Editatu etiketak", + "@entryInfoActionEditTags": {}, + "entryInfoActionEditLocation": "Editatu kokapena", + "@entryInfoActionEditLocation": {}, + "entryInfoActionExportMetadata": "Esportatu metadatuak", + "@entryInfoActionExportMetadata": {}, + "filterAspectRatioPortraitLabel": "Formatu bertikala", + "@filterAspectRatioPortraitLabel": {}, + "entryInfoActionRemoveLocation": "Ezabatu kokapena", + "@entryInfoActionRemoveLocation": {}, + "filterAspectRatioLandscapeLabel": "Formatu horizontala", + "@filterAspectRatioLandscapeLabel": {}, + "filterBinLabel": "Zakarrontzia", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Gogokoa", + "@filterFavouriteLabel": {}, + "filterNoAddressLabel": "Helbiderik ez", + "@filterNoAddressLabel": {}, + "filterNoDateLabel": "Datarik gabe", + "@filterNoDateLabel": {}, + "entryActionExport": "Esportatu", + "@entryActionExport": {}, + "chipActionUnpin": "Desfinkatu goitik", + "@chipActionUnpin": {}, + "entryActionRename": "Aldatu izena", + "@entryActionRename": {}, + "chipActionRename": "Aldatu izena", + "@chipActionRename": {}, + "entryActionDelete": "Ezabatu", + "@entryActionDelete": {}, + "entryActionInfo": "Informazioa", + "@entryActionInfo": {}, + "chipActionSetCover": "Ezarri azala", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "Sortu albuma", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "Kopiatu arbelera", + "@entryActionCopyToClipboard": {}, + "entryActionConvert": "Bihurtu", + "@entryActionConvert": {}, + "entryActionFlip": "Buelta eman horizontalki", + "@entryActionFlip": {}, + "entryActionRestore": "Berrezarri", + "@entryActionRestore": {}, + "entryActionRotateCCW": "Biratu erlojuaren orratzen kontrako noranzkoan", + "@entryActionRotateCCW": {}, + "entryActionShare": "Partekatu", + "@entryActionShare": {}, + "filterNoRatingLabel": "Kalifikaziorik gabe", + "@filterNoRatingLabel": {}, + "filterTaggedLabel": "Etiketatua", + "@filterTaggedLabel": {}, + "filterNoTitleLabel": "Izenbururik gabe", + "@filterNoTitleLabel": {}, + "filterLocatedLabel": "Kokatua", + "@filterLocatedLabel": {}, + "filterNoTagLabel": "Etiketatu gabe", + "@filterNoTagLabel": {}, + "filterTypeAnimatedLabel": "Animatua", + "@filterTypeAnimatedLabel": {}, + "filterNoLocationLabel": "Kokatu gabe", + "@filterNoLocationLabel": {}, + "filterRatingRejectedLabel": "Baztertua", + "@filterRatingRejectedLabel": {}, + "filterRecentlyAddedLabel": "Duela gutxi gehitua", + "@filterRecentlyAddedLabel": {}, + "filterOnThisDayLabel": "Egun honetan", + "@filterOnThisDayLabel": {}, + "filterTypeMotionPhotoLabel": "Argazki-mugikorra", + "@filterTypeMotionPhotoLabel": {}, + "filterTypeSphericalVideoLabel": "360°-ko bideoa", + "@filterTypeSphericalVideoLabel": {}, + "filterMimeImageLabel": "Irudi", + "@filterMimeImageLabel": {}, + "filterTypePanoramaLabel": "Panoramika", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeVideoLabel": "Bideo", + "@filterMimeVideoLabel": {}, + "entryActionShareImageOnly": "Partekatu irudia soilik", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "Partekatu bideoa soilik", + "@entryActionShareVideoOnly": {}, + "entryActionViewSource": "Ikusi iturria", + "@entryActionViewSource": {}, + "unitSystemMetric": "Metriko", + "@unitSystemMetric": {}, + "entryActionShowGeoTiffOnMap": "Erakutsi gainjarritako mapa bezala", + "@entryActionShowGeoTiffOnMap": {}, + "coordinateFormatDms": "DMS (Dokumentuak kudeatzeko sistema)", + "@coordinateFormatDms": {}, + "coordinateDmsNorth": "I", + "@coordinateDmsNorth": {}, + "coordinateDmsWest": "M", + "@coordinateDmsWest": {}, + "coordinateFormatDecimal": "Gradu hamartarrak", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "unitSystemImperial": "Inperial", + "@unitSystemImperial": {}, + "videoLoopModeAlways": "Beti", + "@videoLoopModeAlways": {}, + "videoControlsPlayOutside": "Ireki beste erreproduzitzaile batekin", + "@videoControlsPlayOutside": {}, + "videoLoopModeNever": "Inoiz", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "Bideo laburrak soilik", + "@videoLoopModeShortOnly": {}, + "nameConflictStrategySkip": "Jauzi", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "Inoiz", + "@keepScreenOnNever": {}, + "nameConflictStrategyReplace": "Ordezkatu", + "@nameConflictStrategyReplace": {}, + "keepScreenOnVideoPlayback": "Bideoa erreproduzitzean", + "@keepScreenOnVideoPlayback": {}, + "keepScreenOnAlways": "Beti", + "@keepScreenOnAlways": {}, + "keepScreenOnViewerOnly": "Bisorea soilik", + "@keepScreenOnViewerOnly": {}, + "subtitlePositionTop": "Goran", + "@subtitlePositionTop": {}, + "accessibilityAnimationsKeep": "Pantaila-efektuak mantendu", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferLowest": "Kalifikazio baxuena", + "@displayRefreshRatePreferLowest": {}, + "accessibilityAnimationsRemove": "Pantaila-efektuak ekidin", + "@accessibilityAnimationsRemove": {}, + "displayRefreshRatePreferHighest": "Kalifikazio gorena", + "@displayRefreshRatePreferHighest": {}, + "entryActionViewMotionPhotoVideo": "Ireki bideoa", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Editatu", + "@entryActionEdit": {}, + "entryActionOpenMap": "Erakutsi mapako aplikazioan", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Biratu pantaila", + "@entryActionRotateScreen": {}, + "entryActionOpen": "Ireki honekin", + "@entryActionOpen": {}, + "entryActionSetAs": "Ezarri hau bezala", + "@entryActionSetAs": {}, + "subtitlePositionBottom": "Behean", + "@subtitlePositionBottom": {}, + "themeBrightnessLight": "Argi", + "@themeBrightnessLight": {}, + "videoPlaybackMuted": "Mutututa erreproduzitu", + "@videoPlaybackMuted": {}, + "themeBrightnessBlack": "Beltz", + "@themeBrightnessBlack": {}, + "themeBrightnessDark": "Ilun", + "@themeBrightnessDark": {}, + "viewerTransitionSlide": "Diapositiba", + "@viewerTransitionSlide": {}, + "entryActionAddFavourite": "Gehitu gogokoetara", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Kendu gogokoetatik", + "@entryActionRemoveFavourite": {}, + "viewerTransitionParallax": "Paralaxi", + "@viewerTransitionParallax": {}, + "viewerTransitionNone": "Bat ere ez", + "@viewerTransitionNone": {}, + "viewerTransitionZoomIn": "Hurbildu", + "@viewerTransitionZoomIn": {}, + "wallpaperTargetHome": "Hasierako pantaila", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "Blokeo-pantaila", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Hasiera- eta blokeo-pantaila", + "@wallpaperTargetHomeLock": {}, + "widgetDisplayedItemRandom": "Ausazko", + "@widgetDisplayedItemRandom": {}, + "widgetDisplayedItemMostRecent": "Berrienak", + "@widgetDisplayedItemMostRecent": {}, + "albumTierRegular": "Besteak", + "@albumTierRegular": {}, + "videoActionUnmute": "Ez mututu", + "@videoActionUnmute": {}, + "widgetOpenPageHome": "Ireki hasierako pantaila", + "@widgetOpenPageHome": {}, + "widgetOpenPageCollection": "Ireki bilduma", + "@widgetOpenPageCollection": {}, + "widgetOpenPageViewer": "Ireki bisorea", + "@widgetOpenPageViewer": {}, + "albumTierNew": "Berria", + "@albumTierNew": {}, + "albumTierPinned": "Finkatua", + "@albumTierPinned": {}, + "albumTierSpecial": "Ohiko", + "@albumTierSpecial": {}, + "albumTierApps": "Aplikazioak", + "@albumTierApps": {}, + "storageVolumeDescriptionFallbackPrimary": "Barne-biltegiratzea", + "@storageVolumeDescriptionFallbackPrimary": {}, + "videoActionCaptureFrame": "Atzitu fotograma", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Mututu", + "@videoActionMute": {}, + "videoActionSelectStreams": "Hautatu pistak", + "@videoActionSelectStreams": {}, + "entryInfoActionEditRating": "Editatu balorazioa", + "@entryInfoActionEditRating": {}, + "videoActionSkip10": "Aurrera 10 segundu egin", + "@videoActionSkip10": {}, + "videoActionPause": "Eten", + "@videoActionPause": {}, + "videoActionPlay": "Erreproduzitu", + "@videoActionPlay": {}, + "videoActionReplay10": "Atzera 10 segundu egin", + "@videoActionReplay10": {}, + "viewerActionSettings": "Ezarpenak", + "@viewerActionSettings": {}, + "entryInfoActionEditDate": "Editatu data eta ordua", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditTitleDescription": "Editatu izenburua eta deskribapena", + "@entryInfoActionEditTitleDescription": {}, + "videoActionSetSpeed": "Erreproduzitze-abiadura", + "@videoActionSetSpeed": {}, + "storageAccessDialogMessage": "Mesedez, «{volume}»-(e)n {directory} aukera ezazu hurrengo pantailan aplikazio honi sarrera baimentzeko.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "restrictedAccessDialogMessage": "Aplikazio honek ez du baimenik «{volume}»-(e)ko {directory}-(e)n fitxategiak aldatzeko.\n\nMesedez, aurreinstalatutako fitxategi-kudeatzaile edo galeriaren aplikazio bat erabili itemak beste karpeta batera mugitzeko.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "nameConflictDialogSingleSourceMessage": "Helburuko karpetan dauden fitxategi batzuek izen bera dute.", + "@nameConflictDialogSingleSourceMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Elementu hau zakarrontzira bidali nahi al duzu?} other{{count} elementu hauek zakarrontzira bidali nahi al dituzu?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "addShortcutDialogLabel": "Laster-bidearen etiketa", + "@addShortcutDialogLabel": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Eragiketa hau ez da bateragarria aukeratutako hurrengo elementu-motarentzako: {types}.} other{Eragiketa hau ez da bateragarria aukeratutako hurrengo elementu-motentzako: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "moveUndatedConfirmationDialogMessage": "Elementuen datak gorde nahi al dituzu aurrera egin aurretik?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Gorde datak", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Erreprodukzioa {time} denboran jarraitzea nahi al duzu?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "nameConflictDialogMultipleSourceMessage": "Fitxategi batzuek izen bera dute.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutButtonLabel": "GEHITU", + "@addShortcutButtonLabel": {}, + "videoStartOverButtonLabel": "BERRIRO HASI", + "@videoStartOverButtonLabel": {}, + "missingSystemFilePickerDialogMessage": "Sistemako fitxategien bilatzailea falta da edo desaktibatua dago. Mesedez, aktiba ezazu eta saia zaitez berriro.", + "@missingSystemFilePickerDialogMessage": {}, + "noMatchingAppDialogMessage": "Hau maneiatu dezakeen aplikaziorik ez dago.", + "@noMatchingAppDialogMessage": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Elementu hau ezaba nahi al duzu?} other{{count} elementu hauek ezaba nahi al dituzu?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoResumeButtonLabel": "JARRAITU", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Azkeneko elementua", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Automatikoa", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Pertsonalizatua", + "@setCoverDialogCustom": {}, + "newAlbumDialogTitle": "Album berria", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Albumaren izena", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Karpeta jada badago", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Biltegiratzea:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "Izen berria", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Direktorioa jada badago", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Aldatu izena", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "Izendapen-eredua", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Txertatu eremua", + "@renameEntrySetPageInsertTooltip": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Album hauek eta hauetan dagoen elementua ezaba nahi al dituzu?} other{Album hauek eta hauetan dauden {count} elementuak ezaba nahi al dituzu?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "exportEntryDialogFormat": "Formatua:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Zabalera", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Altuera", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "Izen berria", + "@renameEntryDialogLabel": {}, + "editEntryDialogCopyFromItem": "Kopiatu beste elementu batetik", + "@editEntryDialogCopyFromItem": {}, + "editEntryDialogTargetFieldsHeader": "Aldatzeko eremuak", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Data eta ordua", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Ezarri data pertsonalizatua", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Kopiatu beste data batetik", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogExtractFromTitle": "Atera izenburutik", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Aldatu", + "@editEntryDateDialogShift": {}, + "editEntryLocationDialogLongitude": "Longitudea", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "Erabili kokapen hau", + "@locationPickerUseThisLocationButton": {}, + "hideFilterConfirmationDialogMessage": "Bat-etortzen diren argazki eta bideoak zure bildumatik ezkutatuko dira. Berriro agerrarazi ditzakezu «Pribatutasuna» ezarpenetatik.\n\nZiur al zaude ezkuta nahi al dituzula?", + "@hideFilterConfirmationDialogMessage": {}, + "notEnoughSpaceDialogMessage": "Eragiketa hau burutzeko {neededSize}-eko leku librea behar da «{volume}»-(e)n, baina, {freeSize}-eko lekua dago soilik.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Album hau eta bertako elementua ezaba nahi al dituzu?} other{Album hau eta bertako {count} elementuak ezaba nahi al dituzu?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editEntryLocationDialogTitle": "Kokapena", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogChooseOnMap": "Aukeratu mapan", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryRatingDialogTitle": "Balorazioa", + "@editEntryRatingDialogTitle": {}, + "durationDialogHours": "Orduak", + "@durationDialogHours": {}, + "renameEntrySetPagePreviewSectionTitle": "Aurrebista", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Kontagailu", + "@renameProcessorCounter": {}, + "renameProcessorName": "Izena", + "@renameProcessorName": {}, + "editEntryLocationDialogSetCustom": "Ezarri kokapen pertsonalizatua", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogLatitude": "Latitudea", + "@editEntryLocationDialogLatitude": {}, + "editEntryDateDialogSourceFileModifiedDate": "Fitxategia aldatu zeneko data", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogMinutes": "Minutuak", + "@durationDialogMinutes": {}, + "durationDialogSeconds": "Segunduak", + "@durationDialogSeconds": {}, + "videoStreamSelectionDialogAudio": "Audioa", + "@videoStreamSelectionDialogAudio": {}, + "viewDialogSortSectionTitle": "Ordenatu", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "Taldea", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Diseinua", + "@viewDialogLayoutSectionTitle": {}, + "tileLayoutMosaic": "Mosaikoa", + "@tileLayoutMosaic": {}, + "coverDialogTabCover": "Azala", + "@coverDialogTabCover": {}, + "aboutLinkPolicy": "Pribatutasun-politika", + "@aboutLinkPolicy": {}, + "videoStreamSelectionDialogTrack": "Pista", + "@videoStreamSelectionDialogTrack": {}, + "removeEntryMetadataDialogTitle": "Metadatuen ezabapena", + "@removeEntryMetadataDialogTitle": {}, + "videoStreamSelectionDialogOff": "Desgaitua", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogVideo": "Bideoa", + "@videoStreamSelectionDialogVideo": {}, + "removeEntryMetadataDialogMore": "Gehiago", + "@removeEntryMetadataDialogMore": {}, + "genericSuccessFeedback": "Egina!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Huts egin du", + "@genericFailureFeedback": {}, + "genericDangerWarningDialogMessage": "Ziur al zaude?", + "@genericDangerWarningDialogMessage": {}, + "menuActionSelect": "Hautatu", + "@menuActionSelect": {}, + "menuActionSelectAll": "Guztiak hautatu", + "@menuActionSelectAll": {}, + "menuActionMap": "Mapa", + "@menuActionMap": {}, + "coverDialogTabApp": "Aplikazioa", + "@coverDialogTabApp": {}, + "appPickDialogTitle": "Aplikazioa aukeratu", + "@appPickDialogTitle": {}, + "appPickDialogNone": "Bat ere ez", + "@appPickDialogNone": {}, + "aboutPageTitle": "Honi buruz", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Lizentzia", + "@aboutLinkLicense": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Mugimendu-argazkiko bideoa erreproduzitzeko XMP behar da.\n\nZiur al zaude ezabatu nahi duzula?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Erreprodukzio-abiadura", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogText": "Azpitituluak", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogNoSelection": "Ez dago pista gehiagorik.", + "@videoStreamSelectionDialogNoSelection": {}, + "tooManyItemsErrorDialogMessage": "Elementu gutxiagorekin saia zaitez berriro.", + "@tooManyItemsErrorDialogMessage": {}, + "menuActionConfigureView": "Ikusi", + "@menuActionConfigureView": {}, + "menuActionSlideshow": "Aurkezpena", + "@menuActionSlideshow": {}, + "menuActionSelectNone": "Bat ere ez hautatu", + "@menuActionSelectNone": {}, + "viewDialogReverseSortOrder": "Sailkapen-ordena alderantzikatu", + "@viewDialogReverseSortOrder": {}, + "menuActionStats": "Estatistikak", + "@menuActionStats": {}, + "tileLayoutGrid": "Sareta", + "@tileLayoutGrid": {}, + "tileLayoutList": "Zerrenda", + "@tileLayoutList": {}, + "coverDialogTabColor": "Kolorea", + "@coverDialogTabColor": {}, + "aboutBugSectionTitle": "Akatsen berri eman", + "@aboutBugSectionTitle": {}, + "aboutBugCopyInfoButton": "Kopiatu", + "@aboutBugCopyInfoButton": {}, + "aboutBugSaveLogInstruction": "Aplikazioaren erregistroak fitxategi batean gorde", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Sistemako informazioa kopiatu", + "@aboutBugCopyInfoInstruction": {}, + "aboutTranslatorsSectionTitle": "Itzultzaileak", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesBanner": "Aplikazio honek hurrengo kode-irekiko pakete eta liburutegiak erabiltzen ditu.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Androideko liburutegiak", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "collectionActionEdit": "Editatu", + "@collectionActionEdit": {}, + "aboutBugReportInstruction": "GitHubera txostena erregistro eta sistemako informazioarekin bidali", + "@aboutBugReportInstruction": {}, + "aboutCreditsSectionTitle": "Kredituak", + "@aboutCreditsSectionTitle": {}, + "aboutBugReportButton": "Txostena bidali", + "@aboutBugReportButton": {}, + "aboutCreditsWorldAtlas1": "Aplikazio honek TopoJSON fitxategi bat erabiltzen du", + "@aboutCreditsWorldAtlas1": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutterreko pluginak", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutCreditsWorldAtlas2": "ISC lizentziapekoa.", + "@aboutCreditsWorldAtlas2": {}, + "collectionSelectPageTitle": "Elementuak hautatu", + "@collectionSelectPageTitle": {}, + "collectionActionHideTitleSearch": "Izenburuen iragazkiak ezkutatu", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Lasterbidea gehitu", + "@collectionActionAddShortcut": {}, + "collectionActionCopy": "Kopiatu albumera", + "@collectionActionCopy": {}, + "aboutLicensesSectionTitle": "Kode-irekiko lizentziak", + "@aboutLicensesSectionTitle": {}, + "collectionActionMove": "Albumera mugitu", + "@collectionActionMove": {}, + "collectionActionRescan": "Berreskaneatu", + "@collectionActionRescan": {}, + "collectionActionShowTitleSearch": "Izenburuen iragazkiak erakutsi", + "@collectionActionShowTitleSearch": {}, + "collectionActionEmptyBin": "Zakarrontzia hustu", + "@collectionActionEmptyBin": {}, + "collectionGroupAlbum": "Albumaren arabera", + "@collectionGroupAlbum": {}, + "collectionGroupDay": "Egunaren arabera", + "@collectionGroupDay": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutterreko paketeak", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "collectionPickPageTitle": "Aukeratu", + "@collectionPickPageTitle": {}, + "collectionSearchTitlesHintText": "Izenburuak bilatu", + "@collectionSearchTitlesHintText": {}, + "collectionGroupMonth": "Hilabetearen arabera", + "@collectionGroupMonth": {}, + "sectionUnknown": "Ezezaguna", + "@sectionUnknown": {}, + "dateThisMonth": "Hilabete honetan", + "@dateThisMonth": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{Akatsa elementu 1 kopiatzean} other{Akatsa {count} elementu kopiatzean}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{Akatsa elementu 1 mugitzean} other{Akatsa {count} elementu mugitzean}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameFailureFeedback": "{count, plural, =1{Akatsa elementu 1 berrizendatzean} other{Akatsa {count} elementu berrizendatzean}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyFavourites": "Gogokorik ez", + "@collectionEmptyFavourites": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{Elementu 1 kopiatuta} other{{count} elementu kopiatuta}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{Elementu 1 mugituta} other{{count} elementu mugituta}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{Elementu 1 berrizendatuta} other{{count} elementu berrizendatuta}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{Elementu 1 editatuta} other{{count} elementu editatuta}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyImages": "Irudirik ez", + "@collectionEmptyImages": {}, + "collectionEmptyVideos": "Bideorik ez", + "@collectionEmptyVideos": {}, + "aboutLicensesDartPackagesSectionTitle": "Darteko paketeak", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Lizentzia guztiak erakutsi", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "Pribatutasun-politika", + "@policyPageTitle": {}, + "collectionPageTitle": "Bilduma", + "@collectionPageTitle": {}, + "dateToday": "Gaur", + "@dateToday": {}, + "dateYesterday": "Atzo", + "@dateYesterday": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Akatsa elementu 1 ezabatzean} other{Akatsa {count} elementu ezabatzean}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{Akatsa elementu 1 editatzean} other{Akatsa {count} elementu editatzean}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{Akatsa orri 1 esportatzean} other{Akatsa {count} orri esportatzean}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sortByRating": "Balorazioaren arabera", + "@sortByRating": {}, + "drawerSettingsButton": "Ezarpenak", + "@drawerSettingsButton": {}, + "drawerCountryPage": "Herrialdeak", + "@drawerCountryPage": {}, + "drawerCollectionPanoramas": "Panoramikak", + "@drawerCollectionPanoramas": {}, + "drawerAlbumPage": "Albumak", + "@drawerAlbumPage": {}, + "sortByItemCount": "Elementuen kopuruaren arabera", + "@sortByItemCount": {}, + "sortByAlbumFileName": "Album eta fitxategien izenaren arabera", + "@sortByAlbumFileName": {}, + "drawerCollectionAll": "Bilduma osoa", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Gogokoak", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Irudiak", + "@drawerCollectionImages": {}, + "drawerCollectionAnimated": "Animazioak", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Mugimendu-argazkiak", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionRaws": "Raw argazkiak", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "360°-ko bideoak", + "@drawerCollectionSphericalVideos": {}, + "drawerTagPage": "Etiketak", + "@drawerTagPage": {}, + "sortByDate": "Dataren arabera", + "@sortByDate": {}, + "sortOrderNewestFirst": "Berriena lehenengo", + "@sortOrderNewestFirst": {}, + "drawerCollectionVideos": "Bideoak", + "@drawerCollectionVideos": {}, + "sortByName": "Izenaren arabera", + "@sortByName": {}, + "sortBySize": "Tamainaren arabera", + "@sortBySize": {}, + "collectionEmptyGrantAccessButtonLabel": "Sarrera baimendu", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Atala aukeratu", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Atala baztertu", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "Honi buruz", + "@drawerAboutButton": {}, + "sortOrderAtoZ": "Atik Zra", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Ztik Ara", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "Altuena lehenengo", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Baxuena lehenengo", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Handiena lehenengo", + "@sortOrderLargestFirst": {}, + "sortOrderOldestFirst": "Zaharrena lehenengo", + "@sortOrderOldestFirst": {}, + "sortOrderSmallestFirst": "Txikiena lehenengo", + "@sortOrderSmallestFirst": {}, + "albumGroupTier": "Mailaren arabera", + "@albumGroupTier": {}, + "albumGroupType": "Motaren arabera", + "@albumGroupType": {}, + "albumPickPageTitleCopy": "Kopiatu albumera", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Albumera esportatu", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Albumera mugitu", + "@albumPickPageTitleMove": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "albumScreenRecordings": "Pantaila-grabaketak", + "@albumScreenRecordings": {}, + "albumGroupVolume": "Biltegiratze-tamainaren arabera", + "@albumGroupVolume": {}, + "albumDownload": "Deskargatu", + "@albumDownload": {}, + "albumMimeTypeMixed": "Nahastua", + "@albumMimeTypeMixed": {}, + "albumPickPageTitlePick": "Albuma aukeratu", + "@albumPickPageTitlePick": {}, + "albumScreenshots": "Pantaila-argazkiak", + "@albumScreenshots": {}, + "albumVideoCaptures": "Bideotako argazkiak", + "@albumVideoCaptures": {}, + "albumPageTitle": "Albumak", + "@albumPageTitle": {}, + "createAlbumButtonLabel": "SORTU", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "berria", + "@newFilterBanner": {}, + "countryPageTitle": "Herrialdeak", + "@countryPageTitle": {}, + "tagPageTitle": "Etiketak", + "@tagPageTitle": {}, + "tagEmpty": "Etiketarik ez", + "@tagEmpty": {}, + "binPageTitle": "Zakarrontzia", + "@binPageTitle": {}, + "searchCollectionFieldHint": "Bilduman bilatu", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "Berria", + "@searchRecentSectionTitle": {}, + "searchCountriesSectionTitle": "Herrialdeak", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "Lekuak", + "@searchPlacesSectionTitle": {}, + "searchRatingSectionTitle": "Balorazioak", + "@searchRatingSectionTitle": {}, + "settingsSystemDefault": "Sistemakoa", + "@settingsSystemDefault": {}, + "settingsDisabled": "Desgaitua", + "@settingsDisabled": {}, + "settingsModificationWarningDialogMessage": "Beste ezarpenak aldatuko dira.", + "@settingsModificationWarningDialogMessage": {}, + "settingsSearchFieldLabel": "Bilaketaren ezarpenak", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Kointzidentziarik gabe", + "@settingsSearchEmpty": {}, + "settingsActionImport": "Inportatu", + "@settingsActionImport": {}, + "appExportFavourites": "Gogokoak", + "@appExportFavourites": {}, + "settingsNavigationSectionTitle": "Nabigazio", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Hasiera", + "@settingsHomeTile": {}, + "settingsKeepScreenOnDialogTitle": "Mantendu pantaila piztuta", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Sakatu «atzera» bi aldiz irteteko", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "Baieztapen-leihoak", + "@settingsConfirmationTile": {}, + "settingsConfirmationBeforeDeleteItems": "Galdetu elementuak betirako ezabatu aurretik", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "Galdetu elementuak zakarrontzira bidali aurretik", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Galdetu data ez duten elementuak mugitu aurretik", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Mezua erakutsi elementuak zakarrontzira bidali ondoren", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerEditorPageTitle": "Nabigazio-menua", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "Sakatu eta mantendu menuko elementuak mugitu edo berrordenatzeko.", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "Motak", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabPages": "Orriak", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Albuma gehitu", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "Miniaturak", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailShowFavouriteIcon": "Erakutsi gogokoen ikonoa", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Erakutsi etiketaren ikonoa", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Erakutsi mugimendu-argazkiaren ikonoa", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRawIcon": "Erakutsi raw ikonoa", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Erakutsi bideoaren iraupena", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionEditorPageTitle": "Ekintza azkarrak", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Araketa", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsThumbnailOverlayPageTitle": "Inkrustazioak", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowLocationIcon": "Erakutsi kokalekuaren ikonoa", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowRating": "Erakutsi balorazioa", + "@settingsThumbnailShowRating": {}, + "settingsCollectionQuickActionsTile": "Ekintza azkarrak", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionTabSelecting": "Hautapena", + "@settingsCollectionQuickActionTabSelecting": {}, + "searchMetadataSectionTitle": "Metadatuak", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Ezarpenak", + "@settingsPageTitle": {}, + "countryEmpty": "Herrialderik ez", + "@countryEmpty": {}, + "albumEmpty": "Albumik ez", + "@albumEmpty": {}, + "searchTagsSectionTitle": "Etiketak", + "@searchTagsSectionTitle": {}, + "searchDateSectionTitle": "Data", + "@searchDateSectionTitle": {}, + "settingsActionExport": "Esportatu", + "@settingsActionExport": {}, + "searchAlbumsSectionTitle": "Albumak", + "@searchAlbumsSectionTitle": {}, + "settingsDefault": "Lehenetsia", + "@settingsDefault": {}, + "settingsActionExportDialogTitle": "Esportazio", + "@settingsActionExportDialogTitle": {}, + "settingsKeepScreenOnTile": "Mantendu pantaila piztuta", + "@settingsKeepScreenOnTile": {}, + "settingsActionImportDialogTitle": "Inportazio", + "@settingsActionImportDialogTitle": {}, + "settingsHomeDialogTitle": "Hasiera", + "@settingsHomeDialogTitle": {}, + "appExportCovers": "Azalak", + "@appExportCovers": {}, + "appExportSettings": "Ezarpenak", + "@appExportSettings": {}, + "settingsNavigationDrawerTile": "Nabigazio-menua", + "@settingsNavigationDrawerTile": {}, + "settingsConfirmationDialogTitle": "Baieztapen-leihoak", + "@settingsConfirmationDialogTitle": {}, + "settingsNavigationDrawerTabAlbums": "Albumak", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsThumbnailOverlayTile": "Inkrustazioak", + "@settingsThumbnailOverlayTile": {}, + "settingsViewerSectionTitle": "Bisorea", + "@settingsViewerSectionTitle": {}, + "settingsViewerGestureSideTapNext": "Pantailaren ertzetan sakatu aurreko/hurrengo elementua bistaratzeko", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerUseCutout": "Erabili moztutako eremua", + "@settingsViewerUseCutout": {}, + "settingsImageBackground": "Atzeko irudia", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Ekintza azkarrak", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Ekintza azkarrak", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "Sakatu eta luze mantendu botoiak mugitzeko eta bisorean zein ekintza bistaratuko diren aukeratzeko.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Bistaratutako botoiak", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Botoi erabilgarriak", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Botoirik ez", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayPageTitle": "Inkrustazioak", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowMinimap": "Erakutsi minimapa", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Erakutsi informazioa", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "Erakutsi izenburua, data, kokalekua, etab.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowDescription": "Erakutsi azalpena", + "@settingsViewerShowDescription": {}, + "settingsViewerShowOverlayThumbnails": "Erakutsi miniaturak", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsSlideshowTransitionTile": "Trantsizioa", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Tartea", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Bideo-erreprodukzioa", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoAutoPlay": "Autoerreprodukzioa", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "Begizta modua", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Begizta modua", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "Azpitituluak", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Azpitituluak", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Hau adibide bat da.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Testuaren lerrokatzea", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextAlignmentTile": "Testuaren lerrokatzea", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextSize": "Testuaren tamaina", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "Bistaratu ingerada eta itzala", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Testuaren kolorea", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Testuaren opakutasuna", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Atzeko kolorea", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Atzeko opakutasuna", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Ezkerra", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Erdigune", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Eskuina", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoGestureSideDoubleTapSeek": "Pantailaren ertzetan bi aldiz sakatu aurrera/atzera egiteko", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Gora edo behera irristatu distira/bolumena egokitzeko", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsPrivacySectionTitle": "Pribatutasuna", + "@settingsPrivacySectionTitle": {}, + "settingsAllowErrorReporting": "Onartu akatsen txosten anonimoa", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Gorde bilaketen historia", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "Erabili zakarrontzia", + "@settingsEnableBin": {}, + "settingsAllowMediaManagement": "Baimendu mediaren kudeaketa", + "@settingsAllowMediaManagement": {}, + "settingsHiddenItemsTile": "Ezkutuko elementuak", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Ezkutuko elementuak", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "Iragazkiekin bat datozen argazki eta bideoak ez dira zure bilduman agertuko.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "Ezkutuko iragazkirik ez", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Biltegiratzerako sarrera", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessBanner": "Karpeta batzuek baimen berezi bat behar dute bertak fitxategiak edita ahal izateko. Hemen, lehendik baimena eman diezun karpetak ikus ditzakezu.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessRevokeTooltip": "Ezeztatu", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Irisgarritasuna", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Kendu animazioak", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "Kendu animazioak", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Ekintza aurretik igarotako denbora", + "@settingsTimeToTakeActionTile": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Sakatu eta luze mantendu botoiak mugitzeko eta elementuak aukeratzerakoan zein ekintza bistaratuko diren aukeratzeko.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Sakatu eta luze mantendu botoiak mugitzeko eta elementuak arakatzean zein ekintza bistaratuko diren aukeratzeko.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsViewerMaximumBrightness": "Gehienezko distira", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Automatikoki erreproduzitu mugimendu-argazkiak", + "@settingsMotionPhotoAutoPlay": {}, + "settingsViewerOverlayTile": "Inkrustazioak", + "@settingsViewerOverlayTile": {}, + "settingsViewerShowOverlayOnOpening": "Erakutsi irekitzean", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowRatingTags": "Erakutsi balorazioa eta etiketak", + "@settingsViewerShowRatingTags": {}, + "settingsViewerEnableOverlayBlurEffect": "Lausotze efektua", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerShowShootingDetails": "Erakutsi hartualdiaren xehetasunak", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerSlideshowPageTitle": "Aurkezpena", + "@settingsViewerSlideshowPageTitle": {}, + "settingsViewerSlideshowTile": "Aurkezpena", + "@settingsViewerSlideshowTile": {}, + "settingsSlideshowShuffle": "Nahastu", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Bete pantaila", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowRepeat": "Errepikatu", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowAnimatedZoomEffect": "Zoom animatuaren efektua", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowVideoPlaybackTile": "Bideo-erreprodukzioa", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSubtitleThemeTextPositionTile": "Testuaren posizioa", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsVideoShowVideos": "Erakutsi bideoak", + "@settingsVideoShowVideos": {}, + "settingsVideoPageTitle": "Bideoaren ezarpenak", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Bideoa", + "@settingsVideoSectionTitle": {}, + "settingsVideoEnableHardwareAcceleration": "Hardwarearen azelerazioa", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoButtonsTile": "Botoiak", + "@settingsVideoButtonsTile": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Testuaren posizioa", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsVideoControlsTile": "Aginteak", + "@settingsVideoControlsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Bi aldiz sakatu erreproduzitzeko/gelditzeko", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoControlsPageTitle": "Aginteak", + "@settingsVideoControlsPageTitle": {}, + "settingsAllowInstalledAppAccess": "Aplikazioen zerrendarako sarrera baimendu", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "Albumen bistaratzea hobetzeko erabilia", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsEnableBinSubtitle": "Mantendu ezabatutako elementuak 30 egunez", + "@settingsEnableBinSubtitle": {}, + "settingsStorageAccessPageTitle": "Biltegiratzerako sarrera", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessEmpty": "Baimenik ez", + "@settingsStorageAccessEmpty": {}, + "settingsCollectionTile": "Bilduma", + "@settingsCollectionTile": {}, + "statsPageTitle": "Estatistikak", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, =1{Elementu 1 kokapenarekin} other{{count} elementu kokapenarekin}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "statsTopCountriesSectionTitle": "Herrialde nagusiak", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Leku nagusiak", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Etiketa nagusiak", + "@statsTopTagsSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Album nagusiak", + "@statsTopAlbumsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "IREKI PANORAMIKA", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "EZARRI HORMA-PAPERA", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Ui!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "Fitxategia jada ez da existitzen.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Informazioa", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "Itzuli bisorera", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "ezezaguna", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "Deskribapena", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Izenburua", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "Data", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "Bereizmena", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Tamaina", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Bidea", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Iraupena", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Jabea", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Koordenatuak", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Helbidea", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Maparen estiloa", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Hautatu maparen estiloa", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Hurreratu", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Aldendu", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Zuzendu iparra gorantz", + "@mapPointNorthUpTooltip": {}, + "openMapPageTooltip": "Ikusi maparen gunean", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "Irudirik ez eskualde honetan", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Huts egitea erantsitako data ateratzean", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "Ireki", + "@viewerInfoOpenLinkText": {}, + "viewerInfoSearchEmpty": "Bat datozen gakorik ez", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Data eta ordua", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Deskribapena", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Dimentsioak", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Bereizmena", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Eskubideak", + "@viewerInfoSearchSuggestionRights": {}, + "tagEditorPageTitle": "Editatu etiketak", + "@tagEditorPageTitle": {}, + "tagPlaceholderCountry": "Herrialdea", + "@tagPlaceholderCountry": {}, + "tagEditorSectionPlaceholders": "Leku-markak", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderPlace": "Lekua", + "@tagPlaceholderPlace": {}, + "panoramaEnableSensorControl": "Gaitu sentsoreen agintea", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Desgaitu sentsoreen agintea", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Iturria", + "@sourceViewerPageTitle": {}, + "settingsThemeBrightnessTile": "Gaia", + "@settingsThemeBrightnessTile": {}, + "settingsDisplayUseTvInterface": "Android TV interfazea", + "@settingsDisplayUseTvInterface": {}, + "settingsThemeBrightnessDialogTitle": "Gaia", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Ukimen ugariko keinu alternatiboak erakutsi", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsDisplaySectionTitle": "Pantaila", + "@settingsDisplaySectionTitle": {}, + "settingsThemeColorHighlights": "Nabarmen koloreak", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Kolore dinamikoa", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Pantailaren freskatze-maiztasuna", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsCoordinateFormatTile": "Koordenatuen formatua", + "@settingsCoordinateFormatTile": {}, + "settingsLanguageSectionTitle": "Hizkuntza eta formatuak", + "@settingsLanguageSectionTitle": {}, + "settingsLanguagePageTitle": "Hizkuntza", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatDialogTitle": "Koordenatuen formatua", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Unitateak", + "@settingsUnitSystemTile": {}, + "settingsScreenSaverPageTitle": "Pantaila-babeslea", + "@settingsScreenSaverPageTitle": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Freskatze-maiztasuna", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageTile": "Hizkuntza", + "@settingsLanguageTile": {}, + "settingsUnitSystemDialogTitle": "Unitateak", + "@settingsUnitSystemDialogTitle": {}, + "settingsWidgetPageTitle": "Argazki-markoa", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Ingerada", + "@settingsWidgetShowOutline": {}, + "settingsWidgetDisplayedItem": "Bistaratutako elementua", + "@settingsWidgetDisplayedItem": {}, + "tagEditorPageNewTagFieldLabel": "Etiketa berria", + "@tagEditorPageNewTagFieldLabel": {}, + "viewerInfoSearchFieldLabel": "Bilatu metadatuak", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoViewXmlLinkText": "Ikusi XML", + "@viewerInfoViewXmlLinkText": {}, + "wallpaperUseScrollEffect": "Erabili lekualdatze-efektua hasierako pantailan", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageAddTagTooltip": "Gehitu etiketa", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Berrienak", + "@tagEditorSectionRecent": {}, + "settingsWidgetOpenPage": "Widgetan sakatzean", + "@settingsWidgetOpenPage": {}, + "exportEntryDialogWriteMetadata": "Idatzi metadatuak", + "@exportEntryDialogWriteMetadata": {}, + "configureVaultDialogTitle": "Konfiguratu kutxa gotorra", + "@configureVaultDialogTitle": {}, + "newVaultDialogTitle": "Kutxa gotor berria", + "@newVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "Blokeatu pantaila itzaltzean", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "Blokeatze modua", + "@vaultDialogLockTypeLabel": {}, + "pinDialogEnter": "Sartu PINa", + "@pinDialogEnter": {}, + "chipActionGoToPlacePage": "Erakutsi lekuetan", + "@chipActionGoToPlacePage": {}, + "chipActionLock": "Blokeatu", + "@chipActionLock": {}, + "chipActionCreateVault": "Sortu kutxa gotorra", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "Konfiguratu kutxa gotorra", + "@chipActionConfigureVault": {}, + "albumTierVaults": "Kutxa gotorrak", + "@albumTierVaults": {}, + "placePageTitle": "Lekuak", + "@placePageTitle": {}, + "placeEmpty": "Lekurik ez", + "@placeEmpty": {}, + "settingsConfirmationVaultDataLoss": "Erakutsi kutxa gotorreko datuen galeraren inguruko abisua", + "@settingsConfirmationVaultDataLoss": {}, + "newVaultWarningDialogMessage": "Kutxa gotorreko elementuak aplikazio honetarako soilik daude eskuragarri eta ez beste edozeinetarako.\n\nAplikazio hau desinstalatzen baduzu, edo aplikazio honen datuak garbitu, elementu guzti hauek galduko dituzu.", + "@newVaultWarningDialogMessage": {}, + "settingsDisablingBinWarningDialogMessage": "Zakarrontziko elementuak betirako ezabatuko dira.", + "@settingsDisablingBinWarningDialogMessage": {}, + "pinDialogConfirm": "Konfirmatu PINa", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "Sartu pasahitza", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Berretsi pasahitza", + "@passwordDialogConfirm": {}, + "authenticateToConfigureVault": "Autentifikatu kutxa gotorra konfiguratzeko", + "@authenticateToConfigureVault": {}, + "authenticateToUnlockVault": "Autentifikatu kutxa gotorra desblokeatzeko", + "@authenticateToUnlockVault": {}, + "vaultBinUsageDialogMessage": "Kutxa gotor batzuk zakarrontzia erabiltzen ari dira.", + "@vaultBinUsageDialogMessage": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "vaultLockTypePin": "PIN kodea", + "@vaultLockTypePin": {}, + "vaultLockTypePassword": "Pasahitza", + "@vaultLockTypePassword": {}, + "drawerPlacePage": "Lekuak", + "@drawerPlacePage": {}, + "vaultLockTypePattern": "Patroia", + "@vaultLockTypePattern": {}, + "patternDialogEnter": "Sartu patroia", + "@patternDialogEnter": {}, + "patternDialogConfirm": "Konfirmatu patroia", + "@patternDialogConfirm": {}, + "settingsVideoEnablePip": "Bideoa leihotxoan", + "@settingsVideoEnablePip": {}, + "settingsVideoBackgroundMode": "Atzeko planoko modua", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "Atzeko planoko modua", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsCollectionBurstPatternsNone": "Bat ere ez", + "@settingsCollectionBurstPatternsNone": {}, + "settingsCollectionBurstPatternsTile": "Segida ereduak", + "@settingsCollectionBurstPatternsTile": {}, + "tagPlaceholderState": "Egoera", + "@tagPlaceholderState": {}, + "viewerActionUnlock": "Deskblokeatu bisorea", + "@viewerActionUnlock": {}, + "stateEmpty": "Egoerarik ez", + "@stateEmpty": {}, + "chipActionShowCountryStates": "Erakutsi egoerak", + "@chipActionShowCountryStates": {}, + "statePageTitle": "Egoerak", + "@statePageTitle": {}, + "viewerActionLock": "Blokeatu bisorea", + "@viewerActionLock": {}, + "searchStatesSectionTitle": "Egoerak", + "@searchStatesSectionTitle": {}, + "statsTopStatesSectionTitle": "Egoera Nagusiak", + "@statsTopStatesSectionTitle": {}, + "settingsAskEverytime": "Galdetu aldi oro", + "@settingsAskEverytime": {}, + "settingsVideoPlaybackTile": "Erreprodukzioa", + "@settingsVideoPlaybackTile": {}, + "maxBrightnessNever": "Inoiz", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "Beti", + "@maxBrightnessAlways": {}, + "videoResumptionModeAlways": "Beti", + "@videoResumptionModeAlways": {}, + "exportEntryDialogQuality": "Kalitatea", + "@exportEntryDialogQuality": {}, + "settingsVideoPlaybackPageTitle": "Erreprodukzioa", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoResumptionModeTile": "Jarraitu erreprodukzioa", + "@settingsVideoResumptionModeTile": {}, + "tagEditorDiscardDialogMessage": "Aldaketak baztertu nahi dituzu?", + "@tagEditorDiscardDialogMessage": {}, + "videoResumptionModeNever": "Inoiz", + "@videoResumptionModeNever": {}, + "settingsVideoResumptionModeDialogTitle": "Jarraitu erreprodukzioa", + "@settingsVideoResumptionModeDialogTitle": {}, + "saveCopyButtonLabel": "GORDE KOPIA", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Aplikatu", + "@applyTooltip": {}, + "editorActionTransform": "Eraldatu", + "@editorActionTransform": {}, + "editorTransformCrop": "Moztu", + "@editorTransformCrop": {}, + "editorTransformRotate": "Biratu", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Librea", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Jatorrizkoa", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Karratua", + "@cropAspectRatioSquare": {}, + "widgetTapUpdateWidget": "Eguneratu widgeta", + "@widgetTapUpdateWidget": {}, + "aboutDataUsageSectionTitle": "Datuen erabilera", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageData": "Datuak", + "@aboutDataUsageData": {}, + "aboutDataUsageDatabase": "Datu-basea", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageMisc": "Askotariko", + "@aboutDataUsageMisc": {}, + "aboutDataUsageInternal": "Barnekoa", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "Kanpokoa", + "@aboutDataUsageExternal": {}, + "aboutDataUsageCache": "Cachea", + "@aboutDataUsageCache": {}, + "overlayHistogramLuminance": "Luminantzia", + "@overlayHistogramLuminance": {}, + "overlayHistogramNone": "Bat ere ez", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "settingsViewerShowHistogram": "Erakutsi histograma", + "@settingsViewerShowHistogram": {}, + "aboutDataUsageClearCache": "Garbitu cachea", + "@aboutDataUsageClearCache": {}, + "entryActionCast": "Igorri", + "@entryActionCast": {}, + "castDialogTitle": "Igortzeko gailuak", + "@castDialogTitle": {}, + "settingsThumbnailShowHdrIcon": "Erakutsi HDR ikonoa", + "@settingsThumbnailShowHdrIcon": {}, + "collectionActionSetHome": "Ezarri hasiera gisa", + "@collectionActionSetHome": {}, + "renameProcessorHash": "Hash-a", + "@renameProcessorHash": {}, + "settingsForceWesternArabicNumeralsTile": "Behartu arabiar zifrak", + "@settingsForceWesternArabicNumeralsTile": {}, + "videoRepeatActionSetStart": "Ezarri hasiera", + "@videoRepeatActionSetStart": {}, + "stopTooltip": "Gelditu", + "@stopTooltip": {}, + "videoActionABRepeat": "Atik Brako errepikapena", + "@videoActionABRepeat": {}, + "videoRepeatActionSetEnd": "Ezarri amaiera", + "@videoRepeatActionSetEnd": {}, + "chipActionShowCollection": "Erakutsi bilduman", + "@chipActionShowCollection": {}, + "sortByDuration": "Iraupenaren arabera", + "@sortByDuration": {}, + "sortOrderShortestFirst": "Laburrena lehenik", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "Luzeena lehenik", + "@sortOrderLongestFirst": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (higikorra)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (lurra)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "OSM humanitarioa", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (akuarela)", + "@mapStyleStamenWatercolor": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapAttributionOsmData": "Maparen datuak © [OpenStreetMap](https://www.openstreetmap.org/copyright)-en laguntzaileak", + "@mapAttributionOsmData": {}, + "mapAttributionStamen": "Lauzak: [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "mapAttributionOsmHot": "Lauzak: [HOT](https://www.hotosm.org/) • Ostalaria: [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Lauzak: [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "mapAttributionOsmLiberty": "Lauzak: [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Ostalaria: [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "explorerActionSelectStorageVolume": "Hautatu biltegia", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "Hautatu biltegia", + "@selectStorageVolumeDialogTitle": {}, + "explorerPageTitle": "Arakatzailea", + "@explorerPageTitle": {}, + "setHomeCustom": "Pertsonalizatua", + "@setHomeCustom": {}, + "chipActionGoToExplorerPage": "Erakutsi arakatzailean", + "@chipActionGoToExplorerPage": {} +} diff --git a/lib/l10n/app_fa.arb b/lib/l10n/app_fa.arb new file mode 100644 index 0000000..775063c --- /dev/null +++ b/lib/l10n/app_fa.arb @@ -0,0 +1,1644 @@ +{ + "entryActionSetAs": "قرار دادن به عنوان", + "@entryActionSetAs": {}, + "chipActionSetCover": "گذاشتن به عنوان سرپوش", + "@chipActionSetCover": {}, + "chipActionRename": "تغییر نام فایل", + "@chipActionRename": {}, + "sourceStateCataloguing": "در حال فهرست سازی", + "@sourceStateCataloguing": {}, + "chipActionDelete": "پاک‌کردن", + "@chipActionDelete": {}, + "chipActionHide": "پنهان کردن", + "@chipActionHide": {}, + "showTooltip": "نمایش", + "@showTooltip": {}, + "showButtonLabel": "نمایش", + "@showButtonLabel": {}, + "nextTooltip": "بعدی", + "@nextTooltip": {}, + "videoActionReplay10": "برگشت 10 ثانیه به عقب", + "@videoActionReplay10": {}, + "cancelTooltip": "لغو", + "@cancelTooltip": {}, + "entryActionPrint": "چاپ", + "@entryActionPrint": {}, + "slideshowActionShowInCollection": "نمایش در مجموعه", + "@slideshowActionShowInCollection": {}, + "nextButtonLabel": "بعدی", + "@nextButtonLabel": {}, + "pickTooltip": "انتخاب", + "@pickTooltip": {}, + "actionRemove": "برداشتن", + "@actionRemove": {}, + "chipActionGoToTagPage": "نمایش در برچسب‌ها", + "@chipActionGoToTagPage": {}, + "applyButtonLabel": "اعمال", + "@applyButtonLabel": {}, + "entryActionRename": "تغییر نام", + "@entryActionRename": {}, + "welcomeMessage": "به اِیوْز خوش آمدید", + "@welcomeMessage": {}, + "welcomeTermsToggle": "من با شرایط و مقررات استفاده از خدمات موافق هستم", + "@welcomeTermsToggle": {}, + "chipActionPin": "سنجاق به بالا", + "@chipActionPin": {}, + "entryActionExport": "خروجی", + "@entryActionExport": {}, + "continueButtonLabel": "ادامه", + "@continueButtonLabel": {}, + "welcomeOptional": "اختیاری", + "@welcomeOptional": {}, + "previousTooltip": "قبلی", + "@previousTooltip": {}, + "chipActionUnpin": "برداشتن سنجاق از بالا", + "@chipActionUnpin": {}, + "resetTooltip": "بازنشانی", + "@resetTooltip": {}, + "sourceStateLocatingCountries": "در حال مکان یابی کشور ها", + "@sourceStateLocatingCountries": {}, + "entryActionConvert": "تبدیل فایل", + "@entryActionConvert": {}, + "hideButtonLabel": "پنهان", + "@hideButtonLabel": {}, + "hideTooltip": "پنهان", + "@hideTooltip": {}, + "chipActionCreateAlbum": "ساخت البوم", + "@chipActionCreateAlbum": {}, + "filterNoRatingLabel": "بدون امتیاز", + "@filterNoRatingLabel": {}, + "timeSeconds": "{count, plural, =1{{count} ثانیع} other{{count} ثانیه}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "deleteButtonLabel": "پاک کردن", + "@deleteButtonLabel": {}, + "itemCount": "{count, plural, =1{{count} فایل} other{{count} فایل}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chipActionGoToAlbumPage": "نمایش در البوم‌ها", + "@chipActionGoToAlbumPage": {}, + "filterNoTagLabel": "بدون برچسب", + "@filterNoTagLabel": {}, + "appName": "اِیوز", + "@appName": {}, + "entryActionRestore": "برگرداندن", + "@entryActionRestore": {}, + "sourceStateLocatingPlaces": "در حال مکان یابی", + "@sourceStateLocatingPlaces": {}, + "saveTooltip": "ذخیره", + "@saveTooltip": {}, + "sourceStateLoading": "در حال بارگیری", + "@sourceStateLoading": {}, + "doNotAskAgain": "دوباره نپرس", + "@doNotAskAgain": {}, + "entryActionDelete": "پاک‌کردن", + "@entryActionDelete": {}, + "timeMinutes": "{count, plural, other{{count} دقیقه}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "entryActionInfo": "اطلاعات", + "@entryActionInfo": {}, + "entryActionRotateCCW": "چرخش پادساعت‌گرد", + "@entryActionRotateCCW": {}, + "chipActionGoToCountryPage": "نمایش در کشورها", + "@chipActionGoToCountryPage": {}, + "entryActionConvertMotionPhotoToStillImage": "تبدیل به عکس ثابت", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "باز کردن ویدئو", + "@entryActionViewMotionPhotoVideo": {}, + "videoActionSetSpeed": "سرعت پخش", + "@videoActionSetSpeed": {}, + "entryInfoActionEditTitleDescription": "ویرایش عنوان و توضیحات", + "@entryInfoActionEditTitleDescription": {}, + "entryActionRotateCW": "چرخش ساعت‌گرد", + "@entryActionRotateCW": {}, + "entryInfoActionEditLocation": "ویرایش مکان", + "@entryInfoActionEditLocation": {}, + "entryActionFlip": "آینه کردن افقی", + "@entryActionFlip": {}, + "entryActionShare": "اشتراک گذاری", + "@entryActionShare": {}, + "entryActionViewSource": "مشاهده منبع", + "@entryActionViewSource": {}, + "entryActionOpen": "باز کردن با برنامه ای دیگر", + "@entryActionOpen": {}, + "entryActionOpenMap": "نمایش در برنامه نقشه", + "@entryActionOpenMap": {}, + "videoActionCaptureFrame": "ذخیره فریم", + "@videoActionCaptureFrame": {}, + "entryInfoActionEditDate": "ویرایش تاریخ", + "@entryInfoActionEditDate": {}, + "filterBinLabel": "سطل اشغال", + "@filterBinLabel": {}, + "filterNoDateLabel": "بدون تاریخ", + "@filterNoDateLabel": {}, + "timeDays": "{count, plural, other{{count} روز}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "changeTooltip": "تغییر", + "@changeTooltip": {}, + "doubleBackExitMessage": "دوباره «عقب» را فشار دهید تا خارج شوید.", + "@doubleBackExitMessage": {}, + "entryActionShareImageOnly": "فقط اشتراک گذاری عکس", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "فقط اشتراک گذاری ویدئو", + "@entryActionShareVideoOnly": {}, + "videoActionMute": "بی صدا کردن", + "@videoActionMute": {}, + "videoActionUnmute": "با صدا کردن", + "@videoActionUnmute": {}, + "videoActionSkip10": "جلو رفتن 10 ثانیه", + "@videoActionSkip10": {}, + "viewerActionSettings": "تنظیمات", + "@viewerActionSettings": {}, + "entryInfoActionEditRating": "ویرایش امتیاز", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "ویرایش برچسب ها", + "@entryInfoActionEditTags": {}, + "filterNoAddressLabel": "بدون نشانی", + "@filterNoAddressLabel": {}, + "entryInfoActionRemoveLocation": "پاک‌کردن مکان", + "@entryInfoActionRemoveLocation": {}, + "filterNoLocationLabel": "بدون مکان", + "@filterNoLocationLabel": {}, + "viewDialogGroupSectionTitle": "گروه بندی‌ها", + "@viewDialogGroupSectionTitle": {}, + "coverDialogTabApp": "برنامه", + "@coverDialogTabApp": {}, + "appPickDialogTitle": "انتخاب برنامه", + "@appPickDialogTitle": {}, + "aboutLinkPolicy": "سیاست حفظ حریم خصوصی", + "@aboutLinkPolicy": {}, + "collectionExportFailureFeedback": "{count, plural, =1{استخراج صفحه ناموفق} other{استخراج {count} صفحه ناموفق}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsActionExport": "خروجی گرفتن", + "@settingsActionExport": {}, + "filterNoTitleLabel": "بدون نام", + "@filterNoTitleLabel": {}, + "coverDialogTabColor": "رنگ", + "@coverDialogTabColor": {}, + "filterTypePanoramaLabel": "پاناروما", + "@filterTypePanoramaLabel": {}, + "unitSystemMetric": "متری", + "@unitSystemMetric": {}, + "videoLoopModeAlways": "همیشه", + "@videoLoopModeAlways": {}, + "menuActionSlideshow": "نمایش اسلایدی", + "@menuActionSlideshow": {}, + "entryActionRemoveFavourite": "پاک‌کردن از برگزیده‌ها", + "@entryActionRemoveFavourite": {}, + "videoLoopModeNever": "هیچ وقت", + "@videoLoopModeNever": {}, + "chipActionFilterIn": "اضافه به فیلتر", + "@chipActionFilterIn": {}, + "settingsActionExportDialogTitle": "خروجی گرفتن", + "@settingsActionExportDialogTitle": {}, + "aboutBugSectionTitle": "گزارشات خرابی", + "@aboutBugSectionTitle": {}, + "filterRecentlyAddedLabel": "تازه اضافه شده", + "@filterRecentlyAddedLabel": {}, + "filterTypeSphericalVideoLabel": "ویدئو 360°", + "@filterTypeSphericalVideoLabel": {}, + "focalLength": "{length} میلی‌متر", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "albumPickPageTitleExport": "خروجی گرفتن به البوم", + "@albumPickPageTitleExport": {}, + "filterMimeVideoLabel": "ویدئو", + "@filterMimeVideoLabel": {}, + "filterTypeMotionPhotoLabel": "تصویر متحرک", + "@filterTypeMotionPhotoLabel": {}, + "unitSystemImperial": "مایلی", + "@unitSystemImperial": {}, + "videoControlsPlayOutside": "باز کردن با برنامه‌ای دیگر", + "@videoControlsPlayOutside": {}, + "videoLoopModeShortOnly": "فقط برای ویدئوهای کوتاه", + "@videoLoopModeShortOnly": {}, + "entryActionEdit": "ویرایش", + "@entryActionEdit": {}, + "entryActionAddFavourite": "افزودن به برگزیده‌ها", + "@entryActionAddFavourite": {}, + "filterFavouriteLabel": "برگزیده", + "@filterFavouriteLabel": {}, + "mapZoomOutTooltip": "کوچک نمایی", + "@mapZoomOutTooltip": {}, + "entryInfoActionRemoveMetadata": "پاک‌کردن فراداده", + "@entryInfoActionRemoveMetadata": {}, + "menuActionStats": "آمار", + "@menuActionStats": {}, + "exportEntryDialogWidth": "عرض", + "@exportEntryDialogWidth": {}, + "mapZoomInTooltip": "بزرگ نمایی", + "@mapZoomInTooltip": {}, + "chipActionFilterOut": "پاک‌کردن از پالایش", + "@chipActionFilterOut": {}, + "entryActionRotateScreen": "چرخش صفحه", + "@entryActionRotateScreen": {}, + "drawerCollectionFavourites": "برگزیده‌ها", + "@drawerCollectionFavourites": {}, + "filterMimeImageLabel": "عکس", + "@filterMimeImageLabel": {}, + "menuActionMap": "نقشه", + "@menuActionMap": {}, + "aboutPageTitle": "درباره", + "@aboutPageTitle": {}, + "entryInfoActionExportMetadata": "خروجی گرفتن از فراداده", + "@entryInfoActionExportMetadata": {}, + "exportEntryDialogFormat": "فرمت:", + "@exportEntryDialogFormat": {}, + "collectionEmptyFavourites": "هیچ برگزیده‌ای نیست", + "@collectionEmptyFavourites": {}, + "appExportSettings": "تنظیمات", + "@appExportSettings": {}, + "appExportFavourites": "برگزیده‌ها", + "@appExportFavourites": {}, + "exportEntryDialogHeight": "طول", + "@exportEntryDialogHeight": {}, + "aboutTranslatorsSectionTitle": "مترجم ها", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "کتابخانه‌های اندروید", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "بسته‌های Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutBugReportButton": "گزارش", + "@aboutBugReportButton": {}, + "aboutLicensesFlutterPluginsSectionTitle": "افزونه‌های Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutBugCopyInfoButton": "کپی", + "@aboutBugCopyInfoButton": {}, + "aboutLicensesDartPackagesSectionTitle": "بسته‌های Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, + "policyPageTitle": "سیاست حفظ حریم خصوصی", + "@policyPageTitle": {}, + "collectionPickPageTitle": "انتخاب", + "@collectionPickPageTitle": {}, + "videoResumeDialogMessage": "ادامه پخش از زمان {time}؟", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "storageVolumeDescriptionFallbackNonPrimary": "کارت حافظه", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "videoPlaybackWithSound": "پخش با صدا", + "@videoPlaybackWithSound": {}, + "entryActionCopyToClipboard": "کپی به کلیپ بورد", + "@entryActionCopyToClipboard": {}, + "entryActionShowGeoTiffOnMap": "نمایش بر روی نقشه", + "@entryActionShowGeoTiffOnMap": {}, + "filterOnThisDayLabel": "در امروز", + "@filterOnThisDayLabel": {}, + "mapStyleGoogleNormal": "نقشه گوگل", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleTerrain": "نقشه گوگل (نمایش زمین)", + "@mapStyleGoogleTerrain": {}, + "mapStyleGoogleHybrid": "نقشه گوگل (نمایش هیبریدی)", + "@mapStyleGoogleHybrid": {}, + "subtitlePositionTop": "بالا", + "@subtitlePositionTop": {}, + "mapStyleStamenWatercolor": "استامن (نمایش نقشه کشیده شده)", + "@mapStyleStamenWatercolor": {}, + "displayRefreshRatePreferLowest": "کمترین مقدار", + "@displayRefreshRatePreferLowest": {}, + "videoPlaybackMuted": "پخش بی صدا", + "@videoPlaybackMuted": {}, + "storageVolumeDescriptionFallbackPrimary": "حافظه داخلی", + "@storageVolumeDescriptionFallbackPrimary": {}, + "columnCount": "{count, plural, other{{count} ستون}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "mapStyleOsmHot": "اوپن‌استریت‌مپ بشردوستانه", + "@mapStyleOsmHot": {}, + "subtitlePositionBottom": "پایین", + "@subtitlePositionBottom": {}, + "themeBrightnessLight": "روشن", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "تاریک", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "سیاه", + "@themeBrightnessBlack": {}, + "videoStartOverButtonLabel": "شروع از اول", + "@videoStartOverButtonLabel": {}, + "albumTierApps": "برنامه ها", + "@albumTierApps": {}, + "nameConflictStrategyRename": "تغییر نام", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "جایگزین کردن", + "@nameConflictStrategyReplace": {}, + "displayRefreshRatePreferHighest": "بیشترین مقدار", + "@displayRefreshRatePreferHighest": {}, + "storageAccessDialogMessage": "لطفا شاخهٔ {directory} در «{volume}» را در صفحه بعد انتخاب کنید و به برنامه اجازه بدهید.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "widgetOpenPageViewer": "باز کردن مشاهده‌گر", + "@widgetOpenPageViewer": {}, + "saveCopyButtonLabel": "ذخیرهٔ رونوشت", + "@saveCopyButtonLabel": {}, + "editorActionTransform": "تبدیل", + "@editorActionTransform": {}, + "viewerActionLock": "قفل پخش‌کننده", + "@viewerActionLock": {}, + "viewerTransitionSlide": "اسلاید", + "@viewerTransitionSlide": {}, + "editorTransformRotate": "چرخش", + "@editorTransformRotate": {}, + "albumTierNew": "جدید", + "@albumTierNew": {}, + "videoResumptionModeNever": "هیچ‌وقت", + "@videoResumptionModeNever": {}, + "vaultLockTypePassword": "گذرواژه", + "@vaultLockTypePassword": {}, + "widgetOpenPageHome": "باز کردن خانه", + "@widgetOpenPageHome": {}, + "keepScreenOnAlways": "همیشه", + "@keepScreenOnAlways": {}, + "albumTierRegular": "دیگری‌ها", + "@albumTierRegular": {}, + "accessibilityAnimationsKeep": "نمایش از جلوه‌های نمایشگر", + "@accessibilityAnimationsKeep": {}, + "widgetDisplayedItemMostRecent": "جدید‌ترین", + "@widgetDisplayedItemMostRecent": {}, + "videoResumptionModeAlways": "همیشه", + "@videoResumptionModeAlways": {}, + "wallpaperTargetLock": "صفحهٔ قفل", + "@wallpaperTargetLock": {}, + "accessibilityAnimationsRemove": "جلوگیری از جلوه‌های نمایشگر", + "@accessibilityAnimationsRemove": {}, + "vaultLockTypePattern": "الگو", + "@vaultLockTypePattern": {}, + "albumTierVaults": "گاوصندوق‌ها", + "@albumTierVaults": {}, + "filterAspectRatioLandscapeLabel": "افقی", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "عمودی", + "@filterAspectRatioPortraitLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "otherDirectoryDescription": "شاخهٔ «{name}»", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "viewerTransitionZoomIn": "زوم‌پیش", + "@viewerTransitionZoomIn": {}, + "rootDirectoryDescription": "شاخهٔ ریشه", + "@rootDirectoryDescription": {}, + "maxBrightnessAlways": "همیشه", + "@maxBrightnessAlways": {}, + "entryActionCast": "بازتاب", + "@entryActionCast": {}, + "viewerActionUnlock": "باز کردن قفل پخش‌کننده", + "@viewerActionUnlock": {}, + "videoActionPause": "ایست", + "@videoActionPause": {}, + "widgetOpenPageCollection": "باز کردن مجموعه", + "@widgetOpenPageCollection": {}, + "clearTooltip": "پاک‌کردن", + "@clearTooltip": {}, + "nameConflictStrategySkip": "رد شدن", + "@nameConflictStrategySkip": {}, + "filterTypeRawLabel": "خام", + "@filterTypeRawLabel": {}, + "keepScreenOnVideoPlayback": "هنگام پخش ویدیو", + "@keepScreenOnVideoPlayback": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "editorTransformCrop": "برش", + "@editorTransformCrop": {}, + "restrictedAccessDialogMessage": "این برنامه اجازهٔ ویرایش پرونده‌ها ی پوشه {directory} در «{volume}» را ندارد.\n\nلطفا از یک برنامهٔ نگارخانه یا مدیر پروندهٔ از پیش نصب شده استفاده کنید.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "albumTierPinned": "سنجاق شده", + "@albumTierPinned": {}, + "chipActionCreateVault": "ساخت گاوصندوق", + "@chipActionCreateVault": {}, + "chipActionGoToPlacePage": "نمایش در مکان‌ها", + "@chipActionGoToPlacePage": {}, + "viewerTransitionNone": "هیچ‌کدام", + "@viewerTransitionNone": {}, + "lengthUnitPercent": "٪", + "@lengthUnitPercent": {}, + "maxBrightnessNever": "هرگز", + "@maxBrightnessNever": {}, + "widgetTapUpdateWidget": "به‌روز رسانی ابزارک", + "@widgetTapUpdateWidget": {}, + "viewerTransitionFade": "محو شدن", + "@viewerTransitionFade": {}, + "chipActionConfigureVault": "پیکربندی گاوصندوق", + "@chipActionConfigureVault": {}, + "cropAspectRatioFree": "آزاد", + "@cropAspectRatioFree": {}, + "chipActionLock": "قفل", + "@chipActionLock": {}, + "notEnoughSpaceDialogMessage": "این کار برای کامل شدن به {neededSize} فضای خالی در «{volume}» نیاز دارد اما فقط {freeSize} وجود دارد.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "videoActionPlay": "پخش", + "@videoActionPlay": {}, + "applyTooltip": "اعمال", + "@applyTooltip": {}, + "keepScreenOnViewerOnly": "فقط در صفحهٔ مشاهده‌ٔ تصویر", + "@keepScreenOnViewerOnly": {}, + "wallpaperTargetHome": "صفحهٔ خانه", + "@wallpaperTargetHome": {}, + "videoActionSelectStreams": "انتخاب صوت‌ها", + "@videoActionSelectStreams": {}, + "widgetDisplayedItemRandom": "تصادفی", + "@widgetDisplayedItemRandom": {}, + "lengthUnitPixel": "پیکسل", + "@lengthUnitPixel": {}, + "slideshowActionResume": "ادامه", + "@slideshowActionResume": {}, + "cropAspectRatioSquare": "مربع", + "@cropAspectRatioSquare": {}, + "chipActionShowCountryStates": "نمایش شهر‌ها", + "@chipActionShowCountryStates": {}, + "cropAspectRatioOriginal": "اصلی", + "@cropAspectRatioOriginal": {}, + "keepScreenOnNever": "هیچ‌وقت", + "@keepScreenOnNever": {}, + "filterTypeAnimatedLabel": "متحرک", + "@filterTypeAnimatedLabel": {}, + "settingsVideoEnablePip": "تصویر در تصویر", + "@settingsVideoEnablePip": {}, + "wallpaperTargetHomeLock": "صفحهٔ خانه و صفحهٔ قفل", + "@wallpaperTargetHomeLock": {}, + "viewDialogSortSectionTitle": "ترتیب بندی", + "@viewDialogSortSectionTitle": {}, + "filterRatingRejectedLabel": "رد شده", + "@filterRatingRejectedLabel": {}, + "filterLocatedLabel": "واقع شده", + "@filterLocatedLabel": {}, + "setCoverDialogAuto": "خودکار", + "@setCoverDialogAuto": {}, + "albumTierSpecial": "مشترک", + "@albumTierSpecial": {}, + "viewerTransitionParallax": "انطباق", + "@viewerTransitionParallax": {}, + "coordinateFormatDecimal": "درجه‌های اعشاری", + "@coordinateFormatDecimal": {}, + "videoResumeButtonLabel": "ادامه", + "@videoResumeButtonLabel": {}, + "addShortcutDialogLabel": "عنوان میانبر", + "@addShortcutDialogLabel": {}, + "overlayHistogramNone": "هیچکدام", + "@overlayHistogramNone": {}, + "overlayHistogramLuminance": "درخشش", + "@overlayHistogramLuminance": {}, + "videoPlaybackSkip": "رد کردن", + "@videoPlaybackSkip": {}, + "setCoverDialogCustom": "شخصی", + "@setCoverDialogCustom": {}, + "nameConflictDialogSingleSourceMessage": "برخی از پرونده‌های موجود در پوشه مقصد به همین نام هستند.", + "@nameConflictDialogSingleSourceMessage": {}, + "missingSystemFilePickerDialogMessage": "انتخابگر پرونده سامانه وجود ندارد یا غیرفعال است. لطفا آن را فعال کنید و دوباره امتحان کنید.", + "@missingSystemFilePickerDialogMessage": {}, + "nameConflictDialogMultipleSourceMessage": "برخی پرونده ها نام های یکسانی دارند.", + "@nameConflictDialogMultipleSourceMessage": {}, + "noMatchingAppDialogMessage": "هیچ کاره ای وجود ندارد که بتواند این موضوع را مدیریت کند.", + "@noMatchingAppDialogMessage": {}, + "filterTaggedLabel": "نشان شده", + "@filterTaggedLabel": {}, + "coordinateDmsSouth": "جنوب", + "@coordinateDmsSouth": {}, + "dateYesterday": "دیروز", + "@dateYesterday": {}, + "renameEntrySetPagePreviewSectionTitle": "پیش‌نمایش", + "@renameEntrySetPagePreviewSectionTitle": {}, + "drawerAboutButton": "درباره", + "@drawerAboutButton": {}, + "collectionSelectSectionTooltip": "انتخاب بخش", + "@collectionSelectSectionTooltip": {}, + "newAlbumDialogStorageLabel": "حافظه:", + "@newAlbumDialogStorageLabel": {}, + "authenticateToConfigureVault": "احرازهویت برای پیکربندی گاو صندوق", + "@authenticateToConfigureVault": {}, + "exportEntryDialogWriteMetadata": "نوشتن فراداده", + "@exportEntryDialogWriteMetadata": {}, + "editEntryDateDialogExtractFromTitle": "استخراج از عنوان", + "@editEntryDateDialogExtractFromTitle": {}, + "sectionUnknown": "ناشناس", + "@sectionUnknown": {}, + "drawerCollectionRaws": "تصاویر خام", + "@drawerCollectionRaws": {}, + "drawerAlbumPage": "آلبوم ها", + "@drawerAlbumPage": {}, + "drawerTagPage": "برچسب ها", + "@drawerTagPage": {}, + "sortByRating": "با امتیازبندی", + "@sortByRating": {}, + "sortByAlbumFileName": "با آلبوم و سرتیتر پرونده", + "@sortByAlbumFileName": {}, + "searchDateSectionTitle": "تاریخ", + "@searchDateSectionTitle": {}, + "searchCountriesSectionTitle": "کشور ها", + "@searchCountriesSectionTitle": {}, + "settingsConfirmationDialogTitle": "درخواست‌های‌ تایید", + "@settingsConfirmationDialogTitle": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "دکمه‌های نمایش داده شده", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "دکمه‌های در دسترس", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "بدون دکمه", + "@settingsViewerQuickActionEmpty": {}, + "settingsSlideshowVideoPlaybackTile": "پخش ویدیو", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "پخش ویدیو", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoResumptionModeTile": "ادامه پخش", + "@settingsVideoResumptionModeTile": {}, + "settingsPrivacySectionTitle": "حریم خصوصی", + "@settingsPrivacySectionTitle": {}, + "settingsHiddenItemsPageTitle": "موارد پنهان", + "@settingsHiddenItemsPageTitle": {}, + "settingsRemoveAnimationsTile": "بدون پویانمایی", + "@settingsRemoveAnimationsTile": {}, + "viewerSetWallpaperButtonLabel": "تنظیم کاغذدیواری", + "@viewerSetWallpaperButtonLabel": {}, + "viewerInfoSearchSuggestionDate": "تاریخ و زمان", + "@viewerInfoSearchSuggestionDate": {}, + "settingsSlideshowShuffle": "در هم", + "@settingsSlideshowShuffle": {}, + "settingsVideoPlaybackTile": "پخش", + "@settingsVideoPlaybackTile": {}, + "settingsVideoPlaybackPageTitle": "پخش", + "@settingsVideoPlaybackPageTitle": {}, + "viewerInfoLabelResolution": "وضوح", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "اندازه", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelTitle": "عنوان", + "@viewerInfoLabelTitle": {}, + "coordinateDmsNorth": "شمال", + "@coordinateDmsNorth": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "settingsViewerSlideshowPageTitle": "تصاویر گردان", + "@settingsViewerSlideshowPageTitle": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "moveUndatedConfirmationDialogSetDate": "نگه‌داری تاریخ ها", + "@moveUndatedConfirmationDialogSetDate": {}, + "editEntryLocationDialogLongitude": "طول جغرافیایی", + "@editEntryLocationDialogLongitude": {}, + "viewerOpenPanoramaButtonLabel": "بازکردن پانوراما", + "@viewerOpenPanoramaButtonLabel": {}, + "statsTopAlbumsSectionTitle": "آلبوم‌های ممتاز", + "@statsTopAlbumsSectionTitle": {}, + "settingsSubtitleThemeTextColor": "رنگ متن", + "@settingsSubtitleThemeTextColor": {}, + "mapStyleTooltip": "انتخاب حالت نقشه", + "@mapStyleTooltip": {}, + "viewerInfoSearchFieldLabel": "جستجو فراداده", + "@viewerInfoSearchFieldLabel": {}, + "tagEmpty": "بدون برچسب ها", + "@tagEmpty": {}, + "binPageTitle": "سطل زباله", + "@binPageTitle": {}, + "settingsViewerShowOverlayThumbnails": "نمایش ریزعکس ها", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsStorageAccessEmpty": "دسترسی اهدا نشد", + "@settingsStorageAccessEmpty": {}, + "settingsThemeBrightnessDialogTitle": "پوسته", + "@settingsThemeBrightnessDialogTitle": {}, + "tagEditorSectionPlaceholders": "جایگاه متن", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderState": "آمار", + "@tagPlaceholderState": {}, + "settingsThumbnailOverlayTile": "روکش", + "@settingsThumbnailOverlayTile": {}, + "sourceViewerPageTitle": "منبع", + "@sourceViewerPageTitle": {}, + "panoramaDisableSensorControl": "خاموش کردن هدایت حسگر", + "@panoramaDisableSensorControl": {}, + "setCoverDialogLatest": "آخرین مورد", + "@setCoverDialogLatest": {}, + "configureVaultDialogTitle": "پیکربندی گاوصندوق", + "@configureVaultDialogTitle": {}, + "sortOrderLowestFirst": "اول پایین‌ترین", + "@sortOrderLowestFirst": {}, + "sortOrderSmallestFirst": "اول کوچکترین", + "@sortOrderSmallestFirst": {}, + "albumMimeTypeMixed": "ترکیبی", + "@albumMimeTypeMixed": {}, + "newFilterBanner": "جدید", + "@newFilterBanner": {}, + "albumScreenshots": "تصاویر از صفحه", + "@albumScreenshots": {}, + "countryPageTitle": "کشور ها", + "@countryPageTitle": {}, + "countryEmpty": "بدون کشور ها", + "@countryEmpty": {}, + "placePageTitle": "مکان ها", + "@placePageTitle": {}, + "settingsAskEverytime": "هر بار پرسیده شود", + "@settingsAskEverytime": {}, + "settingsSearchFieldLabel": "تنظیمات جستجو", + "@settingsSearchFieldLabel": {}, + "settingsThumbnailShowVideoDuration": "نمایش مدت زمان ویدیو", + "@settingsThumbnailShowVideoDuration": {}, + "settingsViewerOverlayTile": "روکش", + "@settingsViewerOverlayTile": {}, + "settingsVideoSectionTitle": "ویدیو", + "@settingsVideoSectionTitle": {}, + "settingsVideoPageTitle": "تنظیمات ویدیو", + "@settingsVideoPageTitle": {}, + "settingsSubtitleThemeTextPositionTile": "موقعیت متن", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSaveSearchHistory": "نگهداری تاریخچه جستجو", + "@settingsSaveSearchHistory": {}, + "settingsAllowMediaManagement": "اجازه مدیریت محتوا", + "@settingsAllowMediaManagement": {}, + "statsPageTitle": "آمار", + "@statsPageTitle": {}, + "menuActionSelectNone": "انتخاب هیچکدام", + "@menuActionSelectNone": {}, + "collectionEmptyImages": "بدون تصویر", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "گرفتن دسترسی", + "@collectionEmptyGrantAccessButtonLabel": {}, + "drawerCollectionAll": "تمام مجموعه", + "@drawerCollectionAll": {}, + "settingsNavigationDrawerAddAlbum": "افزودن آلبوم", + "@settingsNavigationDrawerAddAlbum": {}, + "tileLayoutList": "فهرست", + "@tileLayoutList": {}, + "coordinateDmsEast": "شرق", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "غرب", + "@coordinateDmsWest": {}, + "durationDialogHours": "ساعت", + "@durationDialogHours": {}, + "settingsViewerShowMinimap": "نمایش نقشه‌کوچک", + "@settingsViewerShowMinimap": {}, + "tileLayoutGrid": "شبکه", + "@tileLayoutGrid": {}, + "settingsViewerShowInformation": "نمایش درباره", + "@settingsViewerShowInformation": {}, + "videoStreamSelectionDialogVideo": "ویدیو", + "@videoStreamSelectionDialogVideo": {}, + "tileLayoutMosaic": "موزائیک", + "@tileLayoutMosaic": {}, + "collectionPageTitle": "مجموعه", + "@collectionPageTitle": {}, + "searchPlacesSectionTitle": "مکان ها", + "@searchPlacesSectionTitle": {}, + "settingsDefault": "پیشفرض", + "@settingsDefault": {}, + "settingsNavigationDrawerTabPages": "صفحات", + "@settingsNavigationDrawerTabPages": {}, + "tagPlaceholderPlace": "مکان", + "@tagPlaceholderPlace": {}, + "aboutDataUsageData": "داده", + "@aboutDataUsageData": {}, + "aboutDataUsageSectionTitle": "مصرف داده", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageMisc": "متفرقه", + "@aboutDataUsageMisc": {}, + "sortByDate": "با تاریخ", + "@sortByDate": {}, + "sortByName": "با نام", + "@sortByName": {}, + "stateEmpty": "داده‌ای نیست", + "@stateEmpty": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "برای جابجایی دکمه ها لمس کنید و نگه دارید و انتخاب کنید که کدام اقدامات هنگام مرور موارد نمایش داده شوند.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCoordinateFormatDialogTitle": "قالب مختصات‌", + "@settingsCoordinateFormatDialogTitle": {}, + "statsTopStatesSectionTitle": "آمارهای ممتاز", + "@statsTopStatesSectionTitle": {}, + "statsTopTagsSectionTitle": "برچسب‌های ممتاز", + "@statsTopTagsSectionTitle": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "settingsVideoLoopModeTile": "حالت حلقه", + "@settingsVideoLoopModeTile": {}, + "settingsStorageAccessPageTitle": "دسترسی حافظه", + "@settingsStorageAccessPageTitle": {}, + "settingsRemoveAnimationsDialogTitle": "بدون پویانمایی‌", + "@settingsRemoveAnimationsDialogTitle": {}, + "tagEditorPageTitle": "ویرایش برچسب ها‌", + "@tagEditorPageTitle": {}, + "newVaultDialogTitle": "گاوصندوق جدید", + "@newVaultDialogTitle": {}, + "vaultDialogLockTypeLabel": "نوع قفل", + "@vaultDialogLockTypeLabel": {}, + "pinDialogConfirm": "تایید PIN", + "@pinDialogConfirm": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "پوشه از پیش موجود است", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "settingsThumbnailShowMotionPhotoIcon": "نمایش نماد تصویر متحرک", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "authenticateToUnlockVault": "احرازهویت برای قفل گشایی گاو صندوق", + "@authenticateToUnlockVault": {}, + "sortByItemCount": "با تعداد موارد", + "@sortByItemCount": {}, + "settingsKeepScreenOnTile": "صفحه را روشن نگه دار", + "@settingsKeepScreenOnTile": {}, + "settingsViewerGestureSideTapNext": "روی لبه‌های صفحه ضربه بزنید تا مورد قبلی/بعدی نشان داده شود", + "@settingsViewerGestureSideTapNext": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{این آلبوم ها و مورد موجود در آنها پاک شود؟} other{این آلبوم ها و {count} مورد موجود در آنها پاک شود؟}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP برای پخش ویدیو در داخل یک عکس متحرک مورد نیاز است.\n\nار پاک‌سازی آن اطمینان دارید?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "newVaultWarningDialogMessage": "موارد موجود در گاوصندوق تنها برای این برنامه در دسترس هستند و در هیچ برنامه دیگری وجود ندارد.\n\nاگر این برنامه را پاک کنید، یا داده‌های برنامه را پاک کنید، همه این موارد را از دست خواهید داد.", + "@newVaultWarningDialogMessage": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{این مورد پاک شود؟} other{این {count} مورد پاک شوند؟}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "unsupportedTypeDialogMessage": "{count, plural, =1{این عملکرد برای موارد از این نوع ممکن نیست: {types}.} other{این عملکرد برای موارد از این نوع پشتیبانی نمیشود: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "settingsConfirmationBeforeMoveToBinItems": "پیش از هدایت موارد به سطل زباله بپرسید", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "pinDialogEnter": "وارد کردن PIN", + "@pinDialogEnter": {}, + "collectionGroupDay": "با روز", + "@collectionGroupDay": {}, + "renameEntrySetPagePatternFieldLabel": "الگو نام گذاری", + "@renameEntrySetPagePatternFieldLabel": {}, + "durationDialogMinutes": "دقیقه", + "@durationDialogMinutes": {}, + "renameEntryDialogLabel": "نام جدید", + "@renameEntryDialogLabel": {}, + "settingsStorageAccessTile": "دسترسی حافظه", + "@settingsStorageAccessTile": {}, + "settingsHomeDialogTitle": "خانه", + "@settingsHomeDialogTitle": {}, + "settingsThumbnailShowRating": "نمایش امتیازبندی", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowTagIcon": "نمایش نماد برچسب", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowRawIcon": "نمایش نماد خامی", + "@settingsThumbnailShowRawIcon": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "برای جابجایی دکمه ها لمس کنید و نگه دارید و انتخاب کنید که کدام اقدامات هنگام انتخاب موارد نمایش داده شوند.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsImageBackground": "پس‌زمینه تصاویر", + "@settingsImageBackground": {}, + "settingsVideoBackgroundMode": "حالت پس‌زمینه", + "@settingsVideoBackgroundMode": {}, + "tagEditorDiscardDialogMessage": "آیا می خواهید تغییرات را نادیده بگیرید?", + "@tagEditorDiscardDialogMessage": {}, + "renameAlbumDialogLabel": "نام جدید", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "پوشه از پیش موجود است", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{این آلبوم و مورد موجود در آن پاک شود؟} other{این آلبوم و {count} مورد موجود در آن پاک شود؟}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "genericFailureFeedback": "ناموفق", + "@genericFailureFeedback": {}, + "dateToday": "امروز", + "@dateToday": {}, + "sortBySize": "با اندازه", + "@sortBySize": {}, + "sortOrderOldestFirst": "اول قدیمی‌ترین", + "@sortOrderOldestFirst": {}, + "settingsSlideshowFillScreen": "پر کردن صفحه", + "@settingsSlideshowFillScreen": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "نمایش جایگزین‌های چند لمس همزمان", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "viewerInfoLabelDate": "تاریخ", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelDuration": "مدت", + "@viewerInfoLabelDuration": {}, + "mapStyleDialogTitle": "حالت نقشه", + "@mapStyleDialogTitle": {}, + "tagPlaceholderCountry": "کشور", + "@tagPlaceholderCountry": {}, + "settingsStorageAccessRevokeTooltip": "لغو", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "دسترسی پذیری", + "@settingsAccessibilitySectionTitle": {}, + "settingsDisplaySectionTitle": "نمایش", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "پوسته", + "@settingsThemeBrightnessTile": {}, + "viewerInfoLabelOwner": "مالک", + "@viewerInfoLabelOwner": {}, + "viewerInfoSearchSuggestionRights": "حقوق", + "@viewerInfoSearchSuggestionRights": {}, + "viewerInfoBackToViewerTooltip": "بازگشت به نمایش‌گر", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoSearchSuggestionResolution": "وضوح", + "@viewerInfoSearchSuggestionResolution": {}, + "settingsDisabled": "خاموش", + "@settingsDisabled": {}, + "settingsHomeTile": "خانه", + "@settingsHomeTile": {}, + "settingsSlideshowAnimatedZoomEffect": "جلوه بزرگنمایی پویانمایی شده", + "@settingsSlideshowAnimatedZoomEffect": {}, + "statsTopCountriesSectionTitle": "کشور‌های ممتاز", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "مکان‌های ممتاز", + "@statsTopPlacesSectionTitle": {}, + "editEntryDateDialogTitle": "تاریخ و زمان", + "@editEntryDateDialogTitle": {}, + "albumDownload": "دریافت", + "@albumDownload": {}, + "searchCollectionFieldHint": "جستجو مجموعه", + "@searchCollectionFieldHint": {}, + "renameProcessorHash": "هش", + "@renameProcessorHash": {}, + "exportEntryDialogQuality": "کیفیت", + "@exportEntryDialogQuality": {}, + "editEntryDialogTargetFieldsHeader": "قسمت هایی برای تغییر", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogSetCustom": "تنظیم تاریخ سفارشی", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogSourceFileModifiedDate": "تاریخ تغییر پرونده", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "editEntryDialogCopyFromItem": "هم‌مانند دیگر مورد کن", + "@editEntryDialogCopyFromItem": {}, + "durationDialogSeconds": "ثانیه", + "@durationDialogSeconds": {}, + "editEntryLocationDialogTitle": "مکان", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogLatitude": "عرض جغرافیایی", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogSetCustom": "تنظیم موقعیت سفارشی", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogChooseOnMap": "انتخاب در نقشه", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryRatingDialogTitle": "امتیاز", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogMore": "بیشتر", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataDialogTitle": "پاک‌کردن فراداده", + "@removeEntryMetadataDialogTitle": {}, + "locationPickerUseThisLocationButton": "استفاده از این مکان", + "@locationPickerUseThisLocationButton": {}, + "videoStreamSelectionDialogAudio": "صدا", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "زیرنویس", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "خاموش", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "صوت", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "هیچ صدا دیگری وجود ندارد.", + "@videoStreamSelectionDialogNoSelection": {}, + "menuActionConfigureView": "تماشا", + "@menuActionConfigureView": {}, + "menuActionSelect": "انتخاب", + "@menuActionSelect": {}, + "genericDangerWarningDialogMessage": "اطمینان دارید؟", + "@genericDangerWarningDialogMessage": {}, + "coverDialogTabCover": "جلد", + "@coverDialogTabCover": {}, + "castDialogTitle": "پخش دستگاه ها", + "@castDialogTitle": {}, + "appPickDialogNone": "هیچکدام", + "@appPickDialogNone": {}, + "aboutLinkLicense": "مجوز", + "@aboutLinkLicense": {}, + "aboutBugSaveLogInstruction": "ذخیره گزارش‌های برنامه در یک پرونده", + "@aboutBugSaveLogInstruction": {}, + "aboutDataUsageDatabase": "پایگاه داده", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageCache": "حافظه پنهان", + "@aboutDataUsageCache": {}, + "aboutDataUsageInternal": "داخلی", + "@aboutDataUsageInternal": {}, + "aboutCreditsSectionTitle": "سپاس‌نامه", + "@aboutCreditsSectionTitle": {}, + "aboutDataUsageExternal": "خارجی", + "@aboutDataUsageExternal": {}, + "aboutLicensesSectionTitle": "مجوز متن-باز", + "@aboutLicensesSectionTitle": {}, + "aboutDataUsageClearCache": "پاک ساری حافظه موقت", + "@aboutDataUsageClearCache": {}, + "aboutCreditsWorldAtlas2": "زیر مجوز ISC.", + "@aboutCreditsWorldAtlas2": {}, + "aboutLicensesBanner": "این برنامه بسته‌ها و کتابخانه‌های آزاد زیر به‌کار می‌برد.", + "@aboutLicensesBanner": {}, + "collectionSelectPageTitle": "انتخاب موارد", + "@collectionSelectPageTitle": {}, + "collectionSearchTitlesHintText": "جستجو عناوین", + "@collectionSearchTitlesHintText": {}, + "collectionActionHideTitleSearch": "پنهان سازی پالایش عنوان", + "@collectionActionHideTitleSearch": {}, + "collectionActionCopy": "رونوشت به آلبوم", + "@collectionActionCopy": {}, + "collectionActionSetHome": "تنظیم به عنوان خانه", + "@collectionActionSetHome": {}, + "collectionActionMove": "هدایت به آلبوم", + "@collectionActionMove": {}, + "collectionGroupAlbum": "با آلبوم", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "با ماه", + "@collectionGroupMonth": {}, + "dateThisMonth": "این ماه", + "@dateThisMonth": {}, + "collectionEmptyVideos": "بدون ویدیو", + "@collectionEmptyVideos": {}, + "drawerCollectionImages": "تصاویر", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "ویدیوها", + "@drawerCollectionVideos": {}, + "drawerCollectionPanoramas": "پانوراما", + "@drawerCollectionPanoramas": {}, + "drawerCollectionMotionPhotos": "تصاویر متحرک", + "@drawerCollectionMotionPhotos": {}, + "drawerCountryPage": "کشور ها", + "@drawerCountryPage": {}, + "drawerPlacePage": "مکان ها", + "@drawerPlacePage": {}, + "sortOrderNewestFirst": "اول جدیدترین", + "@sortOrderNewestFirst": {}, + "albumGroupTier": "با امتیاز", + "@albumGroupTier": {}, + "sortOrderZtoA": "ی تا ا", + "@sortOrderZtoA": {}, + "albumCamera": "دوربین", + "@albumCamera": {}, + "albumPageTitle": "آلبوم ها", + "@albumPageTitle": {}, + "createAlbumButtonLabel": "ساخت", + "@createAlbumButtonLabel": {}, + "albumGroupType": "با نوع", + "@albumGroupType": {}, + "albumPickPageTitlePick": "انتخاب آلبوم", + "@albumPickPageTitlePick": {}, + "albumScreenRecordings": "ضبط‌های از صفحه", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "ویدیو‌های ضبط شده", + "@albumVideoCaptures": {}, + "albumEmpty": "بدون آلبوم", + "@albumEmpty": {}, + "placeEmpty": "مکانی نیست", + "@placeEmpty": {}, + "albumGroupVolume": "با حجم ذخیره سازی", + "@albumGroupVolume": {}, + "albumPickPageTitleMove": "هدایت به آلبوم", + "@albumPickPageTitleMove": {}, + "searchTagsSectionTitle": "برچسب ها", + "@searchTagsSectionTitle": {}, + "settingsPageTitle": "تنظیمات", + "@settingsPageTitle": {}, + "settingsActionImport": "وارد کردن", + "@settingsActionImport": {}, + "settingsSystemDefault": "پیشفرض سامانه", + "@settingsSystemDefault": {}, + "settingsConfirmationTile": "درخواست‌های تایید", + "@settingsConfirmationTile": {}, + "settingsKeepScreenOnDialogTitle": "صفحه را روشن نگه دار", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "برای خروج دوبار روی «بازگشت» ضربه بزنید", + "@settingsDoubleBackExit": {}, + "settingsNavigationDrawerEditorPageTitle": "گزینه‌های پیمایش", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsConfirmationBeforeMoveUndatedItems": "پیش از جابجایی موارد بدون تاریخ بپرسید", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsNavigationDrawerBanner": "برای جابجایی و مرتب کردن دوباره موارد، لمس کنید و نگه دارید.", + "@settingsNavigationDrawerBanner": {}, + "settingsConfirmationVaultDataLoss": "نمایش هشدار از دست دادن داده‌های گاوصندوق", + "@settingsConfirmationVaultDataLoss": {}, + "settingsNavigationDrawerTabAlbums": "آلبوم ها", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsThumbnailShowFavouriteIcon": "نمایش نماد برگزیدن", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowLocationIcon": "نمایش نماد مکان", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowHdrIcon": "نمایش نماد HDR", + "@settingsThumbnailShowHdrIcon": {}, + "settingsCollectionQuickActionTabBrowsing": "مرور کردن", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionEditorPageTitle": "کنش‌های سریع", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabSelecting": "انتخاب کردن", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsViewerOverlayPageTitle": "روکش", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerMaximumBrightness": "روشنایی حداکثری", + "@settingsViewerMaximumBrightness": {}, + "settingsViewerShowOverlayOnOpening": "پس از باز شدن نمایش داده شود", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsMotionPhotoAutoPlay": "پخش خودکار تصویر متحرک", + "@settingsMotionPhotoAutoPlay": {}, + "settingsViewerSlideshowTile": "تصاویر گردان", + "@settingsViewerSlideshowTile": {}, + "settingsViewerEnableOverlayBlurEffect": "جلوه محو", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerShowDescription": "نمایش ریزگان", + "@settingsViewerShowDescription": {}, + "settingsViewerShowRatingTags": "نمایش امتیازات و برچسب ها", + "@settingsViewerShowRatingTags": {}, + "settingsSlideshowTransitionTile": "هدایت", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "فاصله", + "@settingsSlideshowIntervalTile": {}, + "settingsVideoEnableHardwareAcceleration": "شتاب سخت‌افزاری", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "پخش خودکار", + "@settingsVideoAutoPlay": {}, + "settingsVideoResumptionModeDialogTitle": "ادامه پخش", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsVideoControlsPageTitle": "هدایت کننده ها", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoBackgroundModeDialogTitle": "حالت پس‌زمینه‌", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsVideoGestureDoubleTapTogglePlay": "برای پخش/ایست دوبار ضربه زدن", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "روی لبه‌های صفحه دوبار ضربه بزنید تا به عقب/جلو بروید", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsSubtitleThemePageTitle": "زیرنویس ها", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeTextAlignmentTile": "تراز متن", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "تراز متن", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeSample": "این یک نمونه است.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentCenter": "مرکز", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "راست", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsSubtitleThemeTextSize": "اندازه متن", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeTextOpacity": "شفافیت متن", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsHiddenItemsTile": "موارد پنهان", + "@settingsHiddenItemsTile": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "موقعیت متن‌", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsAllowErrorReporting": "اجازه به گزارش خطا ناشناس", + "@settingsAllowErrorReporting": {}, + "settingsThemeColorHighlights": "رنگ متون برجسته", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "رنگ‌های پویا", + "@settingsThemeEnableDynamicColor": {}, + "settingsHiddenFiltersEmpty": "پالایشی پنهان نیست", + "@settingsHiddenFiltersEmpty": {}, + "settingsLanguageSectionTitle": "زبان و قالب ها", + "@settingsLanguageSectionTitle": {}, + "settingsWidgetShowOutline": "نوار حاشیه", + "@settingsWidgetShowOutline": {}, + "settingsScreenSaverPageTitle": "ذخیره کننده صفحه", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "قاب تصویر", + "@settingsWidgetPageTitle": {}, + "settingsForceWesternArabicNumeralsTile": "اجبار به اعداد عربی", + "@settingsForceWesternArabicNumeralsTile": {}, + "settingsCollectionTile": "مجموعه", + "@settingsCollectionTile": {}, + "settingsWidgetOpenPage": "هنگام ضربه زدن بر روی ابزارک", + "@settingsWidgetOpenPage": {}, + "viewerErrorUnknown": "اوه!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "پرونده دیگر موجود نیست.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoLabelDescription": "پاورقی", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelCoordinates": "مختصات", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoSearchEmpty": "کلیدی منطبق نشد", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDescription": "پاورقی", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "ابعاد", + "@viewerInfoSearchSuggestionDimensions": {}, + "tagEditorSectionRecent": "اخیر", + "@tagEditorSectionRecent": {}, + "panoramaEnableSensorControl": "روشن کردن هدایت حسگر", + "@panoramaEnableSensorControl": {}, + "wallpaperUseScrollEffect": "استفاده از جلوه پیمایش در صفحه اصلی", + "@wallpaperUseScrollEffect": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{این مورد به سطل زباله منتقل شود؟} other{این {count}مورد به سطل زباله منتقل شوند؟}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "hideFilterConfirmationDialogMessage": "تطبیق عکس ها و فیلم ها از مجموعه شما پنهان خواهد ماند. می توانید دوباره آنها را از تنظیمات «حریم خصوصی» نشان دهید.\n\nاز پنهان سازی آنها اطمینان دارید?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogNameLabel": "نام آلبوم", + "@newAlbumDialogNameLabel": {}, + "passwordDialogEnter": "وارد کردن گذرواژه", + "@passwordDialogEnter": {}, + "vaultBinUsageDialogMessage": "برخی از خزانه ها از سطل زباله استفاده می کنند.", + "@vaultBinUsageDialogMessage": {}, + "renameEntrySetPageInsertTooltip": "قسمتی وارد کنید", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPageTitle": "تغییرنام", + "@renameEntrySetPageTitle": {}, + "videoSpeedDialogLabel": "سرعت پخش", + "@videoSpeedDialogLabel": {}, + "collectionActionAddShortcut": "افزودن میانبر", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "سطل خالی", + "@collectionActionEmptyBin": {}, + "sortOrderHighestFirst": "اول بالاترین", + "@sortOrderHighestFirst": {}, + "statePageTitle": "آمار ها", + "@statePageTitle": {}, + "settingsUnitSystemDialogTitle": "واحد ها", + "@settingsUnitSystemDialogTitle": {}, + "editEntryDateDialogCopyField": "رونوشت از تاریخی دیگر", + "@editEntryDateDialogCopyField": {}, + "settingsActionImportDialogTitle": "وارد کردن", + "@settingsActionImportDialogTitle": {}, + "settingsSubtitleThemeTextAlignmentLeft": "چپ", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsVideoControlsTile": "هدایت کننده ها", + "@settingsVideoControlsTile": {}, + "settingsVideoButtonsTile": "دکمه ها", + "@settingsVideoButtonsTile": {}, + "passwordDialogConfirm": "تایید گذرواژه", + "@passwordDialogConfirm": {}, + "renameProcessorCounter": "شمارنده", + "@renameProcessorCounter": {}, + "renameProcessorName": "نام", + "@renameProcessorName": {}, + "searchStatesSectionTitle": "آمار ها", + "@searchStatesSectionTitle": {}, + "settingsNavigationSectionTitle": "پیمایش", + "@settingsNavigationSectionTitle": {}, + "settingsNavigationDrawerTabTypes": "انواع", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTile": "گزینه‌های پیمایش", + "@settingsNavigationDrawerTile": {}, + "settingsSearchEmpty": "تنظیمی منطبق نشد", + "@settingsSearchEmpty": {}, + "settingsCollectionBurstPatternsTile": "الگوهای تصاویر چندتایی", + "@settingsCollectionBurstPatternsTile": {}, + "settingsCollectionBurstPatternsNone": "هیچکدام", + "@settingsCollectionBurstPatternsNone": {}, + "settingsCollectionQuickActionsTile": "کنش‌های سریع", + "@settingsCollectionQuickActionsTile": {}, + "settingsUnitSystemTile": "واحد ها", + "@settingsUnitSystemTile": {}, + "collectionActionRescan": "بررسی مجدد", + "@collectionActionRescan": {}, + "collectionActionEdit": "ویرایش", + "@collectionActionEdit": {}, + "sortOrderAtoZ": "ا تا ی", + "@sortOrderAtoZ": {}, + "albumPickPageTitleCopy": "رونوشت به آلبوم", + "@albumPickPageTitleCopy": {}, + "settingsModificationWarningDialogMessage": "دیگر تنظیمات اصلاح خواهد شد.", + "@settingsModificationWarningDialogMessage": {}, + "settingsThumbnailSectionTitle": "ریز عکس ها", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayPageTitle": "روکش", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsViewerSectionTitle": "بیننده", + "@settingsViewerSectionTitle": {}, + "settingsViewerShowInformationSubtitle": "نمایش عنوان، تاریخ، مکان، و...", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerQuickActionsTile": "کنش‌های سریع", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "کنش‌های سریع", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "لمس کنید و نگه دارید تا دکمه ها را حرکت دهید و انتخاب کنید که کدام کنش ها در بیننده نمایش داده می شود.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsSlideshowRepeat": "تکرار", + "@settingsSlideshowRepeat": {}, + "settingsTimeToTakeActionTile": "زمان اقدام", + "@settingsTimeToTakeActionTile": {}, + "settingsLanguagePageTitle": "زبان", + "@settingsLanguagePageTitle": {}, + "settingsDisplayUseTvInterface": "رابط تلویزیون اندروید", + "@settingsDisplayUseTvInterface": {}, + "settingsWidgetDisplayedItem": "موارد نمایش داده شده", + "@settingsWidgetDisplayedItem": {}, + "viewerInfoPageTitle": "ریزگان", + "@viewerInfoPageTitle": {}, + "viewerInfoUnknown": "ناشناخته", + "@viewerInfoUnknown": {}, + "mapPointNorthUpTooltip": "نقطه شمال در بالا", + "@mapPointNorthUpTooltip": {}, + "viewerInfoViewXmlLinkText": "نمایش XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "هیچ تصویری در این منطقه وجود ندارد", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "بازکردن", + "@viewerInfoOpenLinkText": {}, + "tagEditorPageAddTagTooltip": "افزودن برچسب", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorPageNewTagFieldLabel": "برسب جدید", + "@tagEditorPageNewTagFieldLabel": {}, + "searchRatingSectionTitle": "امتیازات", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "فراداده", + "@searchMetadataSectionTitle": {}, + "settingsConfirmationBeforeDeleteItems": "همیشه پیش از پاک‌سازی موارد بپرس", + "@settingsConfirmationBeforeDeleteItems": {}, + "genericSuccessFeedback": "انجام شد!", + "@genericSuccessFeedback": {}, + "aboutLicensesShowAllButtonLabel": "نمایش تمام مجوز ها", + "@aboutLicensesShowAllButtonLabel": {}, + "drawerCollectionSphericalVideos": "ویدیو‌های 360°", + "@drawerCollectionSphericalVideos": {}, + "searchAlbumsSectionTitle": "آلبوم ها", + "@searchAlbumsSectionTitle": {}, + "tagPageTitle": "برچسب ها", + "@tagPageTitle": {}, + "settingsEnableBin": "به‌کارگیری سطل زباله", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "موارد پاک شده را به مدت 30 روز نگه دارید", + "@settingsEnableBinSubtitle": {}, + "settingsDisplayRefreshRateModeDialogTitle": "نرخ تازه‌سازی", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "collectionDeselectSectionTooltip": "عدم‌انتخاب بخش", + "@collectionDeselectSectionTooltip": {}, + "drawerCollectionAnimated": "پویانمایی شده", + "@drawerCollectionAnimated": {}, + "sortOrderLargestFirst": "اول بزرگترین", + "@sortOrderLargestFirst": {}, + "searchRecentSectionTitle": "اخیر", + "@searchRecentSectionTitle": {}, + "appExportCovers": "جلد ها", + "@appExportCovers": {}, + "settingsConfirmationAfterMoveToBinItems": "نمایش پیام پس از هدایت موارد به سطل زباله", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsVideoLoopModeDialogTitle": "حالت حلقه", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "زیرنویس ها", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemeBackgroundColor": "رنگ پس‌زمینه", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "شفافیت پس‌زمینه", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "menuActionSelectAll": "انتخاب همه", + "@menuActionSelectAll": {}, + "tooManyItemsErrorDialogMessage": "دوباره با موارد کمتر تلاش کنید.", + "@tooManyItemsErrorDialogMessage": {}, + "viewDialogLayoutSectionTitle": "چیدمان", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "ترتیب مرتب‌سازی معکوس", + "@viewDialogReverseSortOrder": {}, + "aboutBugCopyInfoInstruction": "رونوشت اطلاعات سامانه", + "@aboutBugCopyInfoInstruction": {}, + "settingsLanguageTile": "زبان", + "@settingsLanguageTile": {}, + "settingsVideoShowVideos": "نمایش ویدیو ها", + "@settingsVideoShowVideos": {}, + "settingsCoordinateFormatTile": "قالب مختصات", + "@settingsCoordinateFormatTile": {}, + "collectionActionShowTitleSearch": "نمایش پالایش عنوان", + "@collectionActionShowTitleSearch": {}, + "openMapPageTooltip": "نمایش در صفحه نقشه", + "@openMapPageTooltip": {}, + "viewerInfoLabelPath": "مسیر", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelAddress": "نشانی", + "@viewerInfoLabelAddress": {}, + "drawerSettingsButton": "تنظیمات", + "@drawerSettingsButton": {}, + "stopTooltip": "ایست", + "@stopTooltip": {}, + "videoRepeatActionSetStart": "تنظیم آغاز", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "تنظیم پایان", + "@videoRepeatActionSetEnd": {}, + "videoActionABRepeat": "آ-ب تکرار", + "@videoActionABRepeat": {}, + "newAlbumDialogTitle": "آلبوم جدید", + "@newAlbumDialogTitle": {}, + "patternDialogEnter": "وارد کردن الگو", + "@patternDialogEnter": {}, + "patternDialogConfirm": "تایید الگو", + "@patternDialogConfirm": {}, + "vaultDialogLockModeWhenScreenOff": "وقتی دستگاه خاموش شد قفل شود", + "@vaultDialogLockModeWhenScreenOff": {}, + "settingsDisplayRefreshRateModeTile": "نمایش نرخ تازه‌سازی", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsSubtitleThemeShowOutline": "نمایش نوار حاشیه و سایه", + "@settingsSubtitleThemeShowOutline": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{۱ مورد رونوشت شد} other{{count} مورد رونوشت شد}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "statsWithGps": "{count, plural, =1{1 مورد دارای مکان} other{{count} مورد دارای مکان}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editEntryDateDialogShift": "جابه‌جایی", + "@editEntryDateDialogShift": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{پاک‌کردن ۱ مورد ناموفق بود} other{پاک‌کردن {count} مورد ناموفق بود}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsDisablingBinWarningDialogMessage": "موارد موجود در سطل زباله برای همیشه نابود خواهند شد.", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsAllowInstalledAppAccessSubtitle": "برای بهبود نمایش آلبوم به‌کارگرفته میشود", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsStorageAccessBanner": "برخی پوشه ها برای اصلاح پرونده‌های موجود در آنها به یک مجوز دسترسی نیاز دارند. در اینجا می توانید پوشه هایی را که قبلاً به آنها دسترسی داشته اید، مرور کنید.", + "@settingsStorageAccessBanner": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{هدایت ۱ مورد ناموفق بود} other{هدایت {count} مورد ناموفق بود}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameFailureFeedback": "{count, plural, =1{تغییرنام ۱ مورد ناموفق بود} other{تغییرنام {count} مورد ناموفق بود}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "aboutCreditsWorldAtlas1": "این برنامه یک پرونده TopoJSON استفاده میکند از", + "@aboutCreditsWorldAtlas1": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{رونوشت ۱ مورد ناموفق بود} other{رونوشت {count} مورد ناموفق بود}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{۱ مورد هدایت شد} other{{count} مورد هدایت شد}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{۱ مورد تغییرنام یافت} other{{count} مورد تغییرنام یافت}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{۱ مورد ویرایش شد} other{{count} مورد ویرایش شد}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsViewerUseCutout": "ناحیه برش را بکار بگیر", + "@settingsViewerUseCutout": {}, + "settingsViewerShowHistogram": "نمایش نمودار", + "@settingsViewerShowHistogram": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "برای تنظیم نور/صدا به بالا و پایین بکشید", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "mapEmptyRegion": "تصویری در این ناحیه وجود ندارد", + "@mapEmptyRegion": {}, + "mapAttributionOsmHot": "کاشی ها توسط [HOT](https:www.hotosm.org) • میزبانی شده به دست [OSM France](https:openstreetmap.fr)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "کاشی ها بدست [Stamen Design](https:stamen.com)، [CC BY 3.0](https:creativecommons.orglicensesby3.0)", + "@mapAttributionStamen": {}, + "addShortcutButtonLabel": "افزودن", + "@addShortcutButtonLabel": {}, + "aboutBugReportInstruction": "در گیت‌هاب با گزارش ها و ریزگان دستگاه گزارش کنید", + "@aboutBugReportInstruction": {}, + "settingsViewerShowShootingDetails": "نمایش ریزگان تصویربرداری", + "@settingsViewerShowShootingDetails": {}, + "settingsHiddenFiltersBanner": "تصاویر و ویدیوهایی که با پالایش‌های مخفی سازگار نیستند در مجموعه شما دیده نمیشوند.", + "@settingsHiddenFiltersBanner": {}, + "moveUndatedConfirmationDialogMessage": "پیش از ادامه دادن تاریخ موارد نگه‌داری شود؟", + "@moveUndatedConfirmationDialogMessage": {}, + "settingsAllowInstalledAppAccess": "اجازه دسترسی به دارایی برنامه", + "@settingsAllowInstalledAppAccess": {}, + "collectionEditFailureFeedback": "{count, plural, =1{ویرایش ۱ مورد ناموفق بود} other{ویرایش {count} مورد ناموفق بود}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chipActionShowCollection": "نمایش در مجموعه", + "@chipActionShowCollection": {}, + "mapAttributionOsmData": "داده‌های نقشه © [OpenStreetMap](https:www.openstreetmap.org/copyright) مشارکت‌کنندگان", + "@mapAttributionOsmData": {}, + "chipActionRemove": "برداشتن", + "@chipActionRemove": {}, + "mapStyleOpenTopoMap": "اوپن‌توپومپ", + "@mapStyleOpenTopoMap": {}, + "editEntryLocationDialogImportGpx": "وارد کردن GPX", + "@editEntryLocationDialogImportGpx": {}, + "sortByPath": "بر پایه مسیر", + "@sortByPath": {}, + "setHomeCustom": "سفارشی", + "@setHomeCustom": {}, + "videoActionShowPreviousFrame": "نمایش قاب پیشین", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "نمایش قاب بعدی", + "@videoActionShowNextFrame": {}, + "sortOrderShortestFirst": "اول کوتاه‌ترین", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "اول بلندترین", + "@sortOrderLongestFirst": {}, + "editEntryLocationDialogTimeShift": "تغییر زمان", + "@editEntryLocationDialogTimeShift": {}, + "searchFormatSectionTitle": "قالب‌ها", + "@searchFormatSectionTitle": {}, + "appExportDynamicAlbums": "آلبوم‌های پویا", + "@appExportDynamicAlbums": {}, + "mapAttributionOsmLiberty": "کاشی‌ها به‌دست [OpenMapTiles](https://www.openmaptiles.org/)، [CC BY](http://creativecommons.org/licenses/by/4.0) • میزبانی‌شده به‌دست [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "chipActionDecompose": "جداکردن", + "@chipActionDecompose": {}, + "albumTierDynamic": "پویا", + "@albumTierDynamic": {}, + "newDynamicAlbumDialogTitle": "آلبوم پویای جدید", + "@newDynamicAlbumDialogTitle": {}, + "dynamicAlbumAlreadyExists": "آلبوم پویا از پیش موجود است", + "@dynamicAlbumAlreadyExists": {}, + "sortByDuration": "بر پایه مدت", + "@sortByDuration": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "آلبوم از پیش موجود است", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "collectionActionAddDynamicAlbum": "افزودن آلبوم پویا", + "@collectionActionAddDynamicAlbum": {}, + "selectStorageVolumeDialogTitle": "گزینش حافظه", + "@selectStorageVolumeDialogTitle": {}, + "removeEntryMetadataDialogAll": "همه", + "@removeEntryMetadataDialogAll": {}, + "explorerPageTitle": "کاوشگر", + "@explorerPageTitle": {}, + "explorerActionSelectStorageVolume": "گزینش حافظه", + "@explorerActionSelectStorageVolume": {}, + "mapStyleOsmLiberty": "اواس‌ام لیبریتی", + "@mapStyleOsmLiberty": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | کاشی‌ها به‌دست [OpenTopoMap](https://opentopomap.org/)، [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "chipActionGoToExplorerPage": "نمایش در کاوشگر", + "@chipActionGoToExplorerPage": {}, + "createButtonLabel": "ایجاد", + "@createButtonLabel": {}, + "chipActionGroup": "تغییر گروه‌بندی", + "@chipActionGroup": {}, + "chipActionCreateGroup": "ایجاد گروه", + "@chipActionCreateGroup": {}, + "albumTierGroups": "گروه‌ها", + "@albumTierGroups": {}, + "newGroupDialogTitle": "گروه جدید", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "نام گروه", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "گروه در حال حاضر وجود دارد", + "@groupAlreadyExists": {}, + "groupEmpty": "بدون گروه", + "@groupEmpty": {}, + "ungrouped": "جدا شده از گروه", + "@ungrouped": {}, + "groupPickerTitle": "انتخاب گروه", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "استفاده از این گروه", + "@groupPickerUseThisGroupButton": {}, + "sectionNone": "بدون دسته", + "@sectionNone": {}, + "tagPickPageTitle": "انتخاب برچسب", + "@tagPickPageTitle": {}, + "settingsNavigationBottomActionsTile": "مسیریابی زیرین", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "مسیریابی زیرین", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "لمس کنید و نگه دارید تا دکمه‌ها را حرکت داده و انتخاب کنید کدام عمل‌ها در کادر مسیریابی زیرین نمایش داده شوند.", + "@settingsNavigationBottomActionEditorBanner": {}, + "mapStyleDialogAddStyle": "افزودن حالت", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogName": "نام", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogSubdomains": "زیربخش‌ها", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "نماینده کاربر", + "@mapStyleEditorDialogUserAgent": {}, + "settingsViewerShowZoomLevel": "نمایش سطح بزرگنمایی", + "@settingsViewerShowZoomLevel": {} +} diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb new file mode 100644 index 0000000..f803445 --- /dev/null +++ b/lib/l10n/app_fi.arb @@ -0,0 +1,1659 @@ +{ + "chipActionSetCover": "Aseta kansikuvaksi", + "@chipActionSetCover": {}, + "saveCopyButtonLabel": "TALLENNA KOPIO", + "@saveCopyButtonLabel": {}, + "entryInfoActionExportMetadata": "Vie metatiedot", + "@entryInfoActionExportMetadata": {}, + "editorActionTransform": "Muunna", + "@editorActionTransform": {}, + "mapStyleGoogleTerrain": "Google Maps (Maasto)", + "@mapStyleGoogleTerrain": {}, + "viewerActionLock": "Lukitse katselu", + "@viewerActionLock": {}, + "editorTransformRotate": "Kierrä", + "@editorTransformRotate": {}, + "albumTierNew": "Uusi", + "@albumTierNew": {}, + "chipActionFilterOut": "Suodata pois", + "@chipActionFilterOut": {}, + "nameConflictStrategyReplace": "Korvaa", + "@nameConflictStrategyReplace": {}, + "chipActionHide": "Piilota", + "@chipActionHide": {}, + "welcomeTermsToggle": "Hyväksyn säännöt ja ehdot", + "@welcomeTermsToggle": {}, + "doubleBackExitMessage": "Poistu painamalla ”takaisin” uudelleen.", + "@doubleBackExitMessage": {}, + "showTooltip": "Näytä", + "@showTooltip": {}, + "sourceStateCataloguing": "Luetteloidaan", + "@sourceStateCataloguing": {}, + "keepScreenOnAlways": "Aina", + "@keepScreenOnAlways": {}, + "videoActionSkip10": "Siirry eteenpäin 10 sekuntia", + "@videoActionSkip10": {}, + "displayRefreshRatePreferHighest": "Korkein päivitysnopeus", + "@displayRefreshRatePreferHighest": {}, + "chipActionDelete": "Poista", + "@chipActionDelete": {}, + "albumTierRegular": "Muut", + "@albumTierRegular": {}, + "changeTooltip": "Muuta", + "@changeTooltip": {}, + "displayRefreshRatePreferLowest": "Matalin virkistystaajuus", + "@displayRefreshRatePreferLowest": {}, + "filterNoAddressLabel": "Ei osoitetta", + "@filterNoAddressLabel": {}, + "accessibilityAnimationsKeep": "Säilytä näytön tehosteet", + "@accessibilityAnimationsKeep": {}, + "filterMimeImageLabel": "Kuva", + "@filterMimeImageLabel": {}, + "filterNoTagLabel": "Tunnisteella merkitsemätön", + "@filterNoTagLabel": {}, + "appName": "Aves", + "@appName": {}, + "sourceStateLoading": "Ladataan", + "@sourceStateLoading": {}, + "sourceStateLocatingCountries": "Paikantaa maita", + "@sourceStateLocatingCountries": {}, + "accessibilityAnimationsRemove": "Estä näytön tehosteet", + "@accessibilityAnimationsRemove": {}, + "nameConflictStrategyRename": "Nimeä uudelleen", + "@nameConflictStrategyRename": {}, + "applyButtonLabel": "KÄYTÄ", + "@applyButtonLabel": {}, + "entryActionRemoveFavourite": "Poista suosikeista", + "@entryActionRemoveFavourite": {}, + "albumTierVaults": "Holvit", + "@albumTierVaults": {}, + "coordinateFormatDecimal": "Desimaaliasteet", + "@coordinateFormatDecimal": {}, + "filterAspectRatioLandscapeLabel": "Vaakakuvat", + "@filterAspectRatioLandscapeLabel": {}, + "albumTierApps": "Sovellukset", + "@albumTierApps": {}, + "filterAspectRatioPortraitLabel": "Pystykuvat", + "@filterAspectRatioPortraitLabel": {}, + "entryActionRotateScreen": "Kierrä näyttöä", + "@entryActionRotateScreen": {}, + "videoActionCaptureFrame": "Kaappaa kuva", + "@videoActionCaptureFrame": {}, + "entryActionViewMotionPhotoVideo": "Avaa video", + "@entryActionViewMotionPhotoVideo": {}, + "filterNoTitleLabel": "Nimetön", + "@filterNoTitleLabel": {}, + "entryInfoActionRemoveMetadata": "Poista metatiedot", + "@entryInfoActionRemoveMetadata": {}, + "maxBrightnessAlways": "Aina", + "@maxBrightnessAlways": {}, + "chipActionPin": "Kiinnitä ylös", + "@chipActionPin": {}, + "doNotAskAgain": "Älä kysy uudestaan", + "@doNotAskAgain": {}, + "entryActionConvertMotionPhotoToStillImage": "Muunna still-kuvaksi", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryInfoActionEditTitleDescription": "Muokkaa otsikkoa & kuvausta", + "@entryInfoActionEditTitleDescription": {}, + "nextTooltip": "Seuraava", + "@nextTooltip": {}, + "entryInfoActionEditLocation": "Muokkaa sijaintia", + "@entryInfoActionEditLocation": {}, + "viewerActionUnlock": "Avaa katselun lukitus", + "@viewerActionUnlock": {}, + "entryActionShare": "Jaa", + "@entryActionShare": {}, + "videoActionPause": "Tauko", + "@videoActionPause": {}, + "saveTooltip": "Tallenna", + "@saveTooltip": {}, + "nameConflictStrategySkip": "Ohita", + "@nameConflictStrategySkip": {}, + "entryActionOpenMap": "Näytä karttasovelluksessa", + "@entryActionOpenMap": {}, + "keepScreenOnVideoPlayback": "Videon toiston aikana", + "@keepScreenOnVideoPlayback": {}, + "editorTransformCrop": "Rajaa", + "@editorTransformCrop": {}, + "chipActionRename": "Nimeä uudelleen", + "@chipActionRename": {}, + "filterTaggedLabel": "Tunnisteella merkitty", + "@filterTaggedLabel": {}, + "hideTooltip": "Piilota", + "@hideTooltip": {}, + "albumTierPinned": "Kiinnitetty", + "@albumTierPinned": {}, + "entryActionRotateCCW": "Kierrä vastapäivään", + "@entryActionRotateCCW": {}, + "chipActionCreateVault": "Luo holvi", + "@chipActionCreateVault": {}, + "chipActionGoToPlacePage": "Näytä paikoissa", + "@chipActionGoToPlacePage": {}, + "entryActionPrint": "Tulosta", + "@entryActionPrint": {}, + "entryActionShowGeoTiffOnMap": "Näytä kartan peittokuvana", + "@entryActionShowGeoTiffOnMap": {}, + "viewerActionSettings": "Asetukset", + "@viewerActionSettings": {}, + "filterOnThisDayLabel": "Tänään", + "@filterOnThisDayLabel": {}, + "columnCount": "{count, plural, =1{{count} sarake} other{{count} saraketta}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chipActionGoToAlbumPage": "Näytä albumeissa", + "@chipActionGoToAlbumPage": {}, + "maxBrightnessNever": "Ei koskaan", + "@maxBrightnessNever": {}, + "videoActionReplay10": "Kelaa taaksepäin 10 sekuntia", + "@videoActionReplay10": {}, + "itemCount": "{count, plural, =1{{count} kohde} other{{count} kohdetta}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chipActionConfigureVault": "Määritä holvi", + "@chipActionConfigureVault": {}, + "actionRemove": "Poista", + "@actionRemove": {}, + "cropAspectRatioFree": "Vapaa", + "@cropAspectRatioFree": {}, + "slideshowActionShowInCollection": "Näytä kokoelmassa", + "@slideshowActionShowInCollection": {}, + "chipActionLock": "Lukitse", + "@chipActionLock": {}, + "filterNoRatingLabel": "Luokittelematon", + "@filterNoRatingLabel": {}, + "entryActionOpen": "Avaa sovelluksessa", + "@entryActionOpen": {}, + "pickTooltip": "Valitse", + "@pickTooltip": {}, + "filterNoLocationLabel": "Paikantomaton", + "@filterNoLocationLabel": {}, + "videoActionPlay": "Toista", + "@videoActionPlay": {}, + "chipActionGoToCountryPage": "Näytä maissa", + "@chipActionGoToCountryPage": {}, + "deleteButtonLabel": "POISTA", + "@deleteButtonLabel": {}, + "filterLocatedLabel": "Paikannettu", + "@filterLocatedLabel": {}, + "entryActionInfo": "Tiedot", + "@entryActionInfo": {}, + "entryActionViewSource": "Näytä lähde", + "@entryActionViewSource": {}, + "entryActionShareVideoOnly": "Jaa vain video", + "@entryActionShareVideoOnly": {}, + "filterTypePanoramaLabel": "Panoraamakuva", + "@filterTypePanoramaLabel": {}, + "applyTooltip": "Käytä", + "@applyTooltip": {}, + "entryInfoActionEditTags": "Muokkaa tunnisteita", + "@entryInfoActionEditTags": {}, + "keepScreenOnViewerOnly": "Vain katselusivulla", + "@keepScreenOnViewerOnly": {}, + "nextButtonLabel": "SEURAAVA", + "@nextButtonLabel": {}, + "filterBinLabel": "Roskakori", + "@filterBinLabel": {}, + "welcomeMessage": "Tervetuloa Avesiin", + "@welcomeMessage": {}, + "showButtonLabel": "NÄYTÄ", + "@showButtonLabel": {}, + "entryActionConvert": "Muunna", + "@entryActionConvert": {}, + "entryInfoActionEditDate": "Muokkaa päivämäärää & aikaa", + "@entryInfoActionEditDate": {}, + "hideButtonLabel": "PIILOTA", + "@hideButtonLabel": {}, + "slideshowActionResume": "Jatka", + "@slideshowActionResume": {}, + "cropAspectRatioSquare": "Neliö", + "@cropAspectRatioSquare": {}, + "continueButtonLabel": "JATKA", + "@continueButtonLabel": {}, + "overlayHistogramNone": "Ei mitään", + "@overlayHistogramNone": {}, + "chipActionShowCountryStates": "Näytä maanosat", + "@chipActionShowCountryStates": {}, + "filterRecentlyAddedLabel": "Viimeksi lisätyt", + "@filterRecentlyAddedLabel": {}, + "previousTooltip": "Edellinen", + "@previousTooltip": {}, + "cropAspectRatioOriginal": "Alkuperäinen", + "@cropAspectRatioOriginal": {}, + "entryActionRename": "Nimeä uudelleen", + "@entryActionRename": {}, + "keepScreenOnNever": "Ei koskaan", + "@keepScreenOnNever": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "timeSeconds": "{count, plural, =1{{count} sekunti} other{{count} sekuntia}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "welcomeOptional": "Valinnainen", + "@welcomeOptional": {}, + "filterTypeMotionPhotoLabel": "Liikevalokuva", + "@filterTypeMotionPhotoLabel": {}, + "resetTooltip": "Nollaa", + "@resetTooltip": {}, + "chipActionUnpin": "Irrota kiinnitys ylhäältä", + "@chipActionUnpin": {}, + "chipActionGoToTagPage": "Näytä tunnisteissa", + "@chipActionGoToTagPage": {}, + "filterTypeAnimatedLabel": "Animoitu", + "@filterTypeAnimatedLabel": {}, + "videoActionSetSpeed": "Toistonopeus", + "@videoActionSetSpeed": {}, + "filterFavouriteLabel": "Suosikki", + "@filterFavouriteLabel": {}, + "filterRatingRejectedLabel": "Hylätyt", + "@filterRatingRejectedLabel": {}, + "sourceStateLocatingPlaces": "Paikantaa paikkoja", + "@sourceStateLocatingPlaces": {}, + "videoActionMute": "Mykistä", + "@videoActionMute": {}, + "entryActionDelete": "Poista", + "@entryActionDelete": {}, + "entryActionRotateCW": "Kierrä myötäpäivään", + "@entryActionRotateCW": {}, + "entryActionFlip": "Käännä vaakasuorassa", + "@entryActionFlip": {}, + "timeDays": "{count, plural, =1{{count} päivä} other{{count} päivää}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "entryActionExport": "Vie", + "@entryActionExport": {}, + "entryActionAddFavourite": "Lisää suosikkeihin", + "@entryActionAddFavourite": {}, + "entryActionEdit": "Muokkaa", + "@entryActionEdit": {}, + "entryInfoActionEditRating": "Muokkaa arviota", + "@entryInfoActionEditRating": {}, + "timeMinutes": "{count, plural, =1{{count} minuutti} other{{count} minuuttia}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "albumTierSpecial": "Yleiset", + "@albumTierSpecial": {}, + "entryActionRestore": "Palauta", + "@entryActionRestore": {}, + "entryActionCopyToClipboard": "Kopioi leikepöydälle", + "@entryActionCopyToClipboard": {}, + "chipActionCreateAlbum": "Luo albumi", + "@chipActionCreateAlbum": {}, + "cancelTooltip": "Peruuta", + "@cancelTooltip": {}, + "entryInfoActionRemoveLocation": "Poista sijainti", + "@entryInfoActionRemoveLocation": {}, + "entryActionShareImageOnly": "Jaa vain kuva", + "@entryActionShareImageOnly": {}, + "filterNoDateLabel": "Päiväämätön", + "@filterNoDateLabel": {}, + "chipActionShowCollection": "Näytä kokoelmassa", + "@chipActionShowCollection": {}, + "widgetDisplayedItemMostRecent": "Viimeisin", + "@widgetDisplayedItemMostRecent": {}, + "otherDirectoryDescription": "”{name}” hakemisto", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "videoActionABRepeat": "A-B toisto", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "Aseta alku", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "Aseta loppu", + "@videoRepeatActionSetEnd": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° Video", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsNorth": "P", + "@coordinateDmsNorth": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "subtitlePositionTop": "Ylhäällä", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "Alhaalla", + "@subtitlePositionBottom": {}, + "themeBrightnessLight": "Vaalea", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Tumma", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Musta", + "@themeBrightnessBlack": {}, + "unitSystemMetric": "Metrijärjestelmä", + "@unitSystemMetric": {}, + "unitSystemImperial": "Mailijärjestelmä", + "@unitSystemImperial": {}, + "vaultLockTypePattern": "Kuvio", + "@vaultLockTypePattern": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "vaultLockTypePassword": "Salasana", + "@vaultLockTypePassword": {}, + "settingsVideoEnablePip": "Kuva kuvassa", + "@settingsVideoEnablePip": {}, + "videoControlsPlayOutside": "Avaa toisella soittimella", + "@videoControlsPlayOutside": {}, + "videoLoopModeNever": "Ei koskaan", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "Vain lyhyet videot", + "@videoLoopModeShortOnly": {}, + "videoPlaybackSkip": "Ohita", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Toista mykistettynä", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Toista äänillä", + "@videoPlaybackWithSound": {}, + "videoResumptionModeAlways": "Aina", + "@videoResumptionModeAlways": {}, + "wallpaperTargetLock": "Lukitusnäyttö", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Koti- ja lukitusnäyttö", + "@wallpaperTargetHomeLock": {}, + "widgetDisplayedItemRandom": "Satunnainen", + "@widgetDisplayedItemRandom": {}, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "videoActionUnmute": "Poista mykistys", + "@videoActionUnmute": {}, + "coordinateDmsWest": "L", + "@coordinateDmsWest": {}, + "coordinateDmsSouth": "E", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "I", + "@coordinateDmsEast": {}, + "videoLoopModeAlways": "Aina", + "@videoLoopModeAlways": {}, + "videoResumptionModeNever": "Ei koskaan", + "@videoResumptionModeNever": {}, + "viewerTransitionNone": "Ei mitään", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Kotinäyttö", + "@wallpaperTargetHome": {}, + "storageVolumeDescriptionFallbackPrimary": "Sisäinen tallennustila", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD-kortti", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "aboutCreditsSectionTitle": "Krediitit", + "@aboutCreditsSectionTitle": {}, + "createButtonLabel": "LUO", + "@createButtonLabel": {}, + "clearTooltip": "Tyhjennä", + "@clearTooltip": {}, + "stopTooltip": "Lopeta", + "@stopTooltip": {}, + "chipActionRemove": "Poista", + "@chipActionRemove": {}, + "chipActionGoToExplorerPage": "Näytä tiedostoissa", + "@chipActionGoToExplorerPage": {}, + "chipActionDecompose": "Jaa osiin", + "@chipActionDecompose": {}, + "chipActionFilterIn": "Sisällytä", + "@chipActionFilterIn": {}, + "chipActionGroup": "Vaihda ryhmittäytymistä", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Luo ryhmä", + "@chipActionCreateGroup": {}, + "entryActionSetAs": "Aseta", + "@entryActionSetAs": {}, + "entryActionCast": "Peilaa", + "@entryActionCast": {}, + "videoActionShowPreviousFrame": "Näytä aikaisempi kuvaruutu", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "Näytä seuraava kuvaruutu", + "@videoActionShowNextFrame": {}, + "videoActionSelectStreams": "Valitse kieliraita", + "@videoActionSelectStreams": {}, + "albumTierGroups": "Ryhmät", + "@albumTierGroups": {}, + "albumTierDynamic": "Dynaamiset albumit", + "@albumTierDynamic": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "mapStyleGoogleHybrid": "Google Maps (Satelliitti+kadut )", + "@mapStyleGoogleHybrid": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (akvarelli)", + "@mapStyleStamenWatercolor": {}, + "overlayHistogramLuminance": "Luminanssi", + "@overlayHistogramLuminance": {}, + "viewerTransitionSlide": "Liu’uta", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Parallaksi", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "Häivytä", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "Suurenna", + "@viewerTransitionZoomIn": {}, + "widgetOpenPageHome": "Avaa aloitussivu", + "@widgetOpenPageHome": {}, + "widgetOpenPageCollection": "Avaa kokoelma", + "@widgetOpenPageCollection": {}, + "widgetOpenPageViewer": "Avaa katseluohjelma", + "@widgetOpenPageViewer": {}, + "widgetTapUpdateWidget": "Päivitä widgetti", + "@widgetTapUpdateWidget": {}, + "rootDirectoryDescription": "juurihakemisto", + "@rootDirectoryDescription": {}, + "storageAccessDialogMessage": "Valitse ”{volume}” muistin {directory} hakemisto seuraavassa ruudussa antaaksesi tälle sovellukselle luvan käyttää sitä.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "restrictedAccessDialogMessage": "Tälle sovellukselle ei ole sallittu tiedostojen muuttamista ”{volume}” muistin {directory} hakemistossa.\n\nKäytä toista tiedostonhallinta tai galleria sovellusta siirtääksesi tiedostot toiseen hakemistoon.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "notEnoughSpaceDialogMessage": "Tämä operaatio vaatii {neededSize} vapaata tilaa muistissa ”{volume}” suoriutuakseen, mutta tilaa on vain {freeSize} jäljellä.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "missingSystemFilePickerDialogMessage": "Järjestelmän tiedostonvalitsin puuttuu tai on poistettu käytöstä. Aktivoi se ja yritä uudelleen.", + "@missingSystemFilePickerDialogMessage": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Tämä toiminto ei ole tuettu tämän tyyppisille objekteille: {types}.} other{Tätä toimintoa ei tueta seuraavan tyyppisille objekteille: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "nameConflictDialogSingleSourceMessage": "Joillakin kohdekansion tiedostoilla on sama nimi.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "Joillakin tiedostoilla on sama nimi.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "Pikakuvakkeen nimi", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "LISÄÄ", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "Ei löydy sovelluksia jotka voisivat tehdä tämän.", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Siirrä tämä tiedosto roskakoriin?} other{Siirretäänkö nämä {count} tiedostoa roskakoriin?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Poista tämä tiedosto pysyvästi?} other{Poista nämä {count} tiedostoa pysyvästi?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "moveUndatedConfirmationDialogMessage": "Tallennetaanko tiedoston päivämäärä(t) ennen jatkamista?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Tallenna päivämäärät", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Haluatko jatkaa toistamista kohdasta {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "videoStartOverButtonLabel": "ALOITA ALUSTA", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "JATKA", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Viimeisin kohde", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Auto", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Mukautettu", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "Vastaavat kuvat ja videot piilotetaan kokoelmastasi. Voit saada ne näkymään uudestaan ”Yksityisyys” asetuksista.\n\nHaluatko varmasti piilottaa ne?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "Uusi Albumi", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Albumin nimi", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Albumi on jo olemassa", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Hakemisto on jo olemassa", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Muisti:", + "@newAlbumDialogStorageLabel": {}, + "newDynamicAlbumDialogTitle": "Uusi Dynaaminen Albumi", + "@newDynamicAlbumDialogTitle": {}, + "dynamicAlbumAlreadyExists": "Dynaaminen albumi on jo olemassa", + "@dynamicAlbumAlreadyExists": {}, + "newGroupDialogTitle": "Uusi Ryhmä", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Ryhmän nimi", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "Ryhmä on jo olemassa", + "@groupAlreadyExists": {}, + "groupEmpty": "Ei ryhmiä", + "@groupEmpty": {}, + "ungrouped": "Ryhmittelemättömät", + "@ungrouped": {}, + "groupPickerTitle": "Valitse Ryhmä", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Käytä tätä ryhmää", + "@groupPickerUseThisGroupButton": {}, + "newVaultWarningDialogMessage": "Kuvat ja videot holveissa on saatavilla ainoastaan tässä sovelluksessa.\n\nJos poistat tämän sovelluksen, tai poistat sovelluksen tiedot, menetät kaikki nämä kohteet.", + "@newVaultWarningDialogMessage": {}, + "newVaultDialogTitle": "Uusi Holvi", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "Määrittele Holvi", + "@configureVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "Lukitse kun näyttö sammuu", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "Lukitustyyppi", + "@vaultDialogLockTypeLabel": {}, + "patternDialogEnter": "Syötä kuvio", + "@patternDialogEnter": {}, + "patternDialogConfirm": "Vahvista kuvio", + "@patternDialogConfirm": {}, + "pinDialogEnter": "Syötä PIN", + "@pinDialogEnter": {}, + "pinDialogConfirm": "Vahvista PIN", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "Syötä salasana", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Vahvista salasana", + "@passwordDialogConfirm": {}, + "authenticateToConfigureVault": "Todenna määrittääksesi holvin", + "@authenticateToConfigureVault": {}, + "authenticateToUnlockVault": "Todenna avataksesi holvin", + "@authenticateToUnlockVault": {}, + "vaultBinUsageDialogMessage": "Jotkut holveistä käyttää roskakoria.", + "@vaultBinUsageDialogMessage": {}, + "renameAlbumDialogLabel": "Uusi nimi", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Hakemisto on jo olemassa", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Nimeä uudelleen", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "Nimeämismalli", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Lisää kenttä", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Esikatselu", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Laskin", + "@renameProcessorCounter": {}, + "renameProcessorHash": "Hash", + "@renameProcessorHash": {}, + "renameProcessorName": "Nimi", + "@renameProcessorName": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Poista tämä albumi ja kohteet sen sisällä?} other{Poista tämä albumi ja {count} kohdetta sen sisällä?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Poista nämä albumit ja kohteet niiden sisällä?} other{Poista nämä albumit ja {count} kohdetta niiden sisällä?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "exportEntryDialogFormat": "Formaatti:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Leveys", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Korkeus", + "@exportEntryDialogHeight": {}, + "exportEntryDialogQuality": "Laatu", + "@exportEntryDialogQuality": {}, + "exportEntryDialogWriteMetadata": "Kirjoita metadata", + "@exportEntryDialogWriteMetadata": {}, + "renameEntryDialogLabel": "Uusi nimi", + "@renameEntryDialogLabel": {}, + "editEntryDialogCopyFromItem": "Kopioi toisesta kohteesta", + "@editEntryDialogCopyFromItem": {}, + "editEntryDialogTargetFieldsHeader": "Muutettavat kentät", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Päivä & Aika", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Aseta mukautettu päivä", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Kopioi toisesta päivästä", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogExtractFromTitle": "Kopioi otsikosta", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Vaihda", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "Kohteen muokkauspäivä", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "Tunnit", + "@durationDialogHours": {}, + "durationDialogMinutes": "Minuutit", + "@durationDialogMinutes": {}, + "durationDialogSeconds": "Sekuntit", + "@durationDialogSeconds": {}, + "editEntryLocationDialogTitle": "Sijainti", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogSetCustom": "Aseta mukautettu sijainti", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogChooseOnMap": "Valitse kartalta", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogImportGpx": "Tuo GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogLatitude": "Leveyspiiri", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "Pituuspiiri", + "@editEntryLocationDialogLongitude": {}, + "editEntryLocationDialogTimeShift": "Aikasiirto", + "@editEntryLocationDialogTimeShift": {}, + "locationPickerUseThisLocationButton": "Käytä tätä sijaintia", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "Arvio", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Metadatan Poisto", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogAll": "Kaikki", + "@removeEntryMetadataDialogAll": {}, + "removeEntryMetadataDialogMore": "Lisää", + "@removeEntryMetadataDialogMore": {}, + "aboutBugSectionTitle": "Ohjelmointivirhe raportti", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Tallenna sovelluksen lokitiedot", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Kopioi järjestelmän tiedot", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "Kopioi", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "Raportoi GitHub:issa sovelluksen lokitiedoilla ja järjestelmän tiedoilla", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "Raportoi", + "@aboutBugReportButton": {}, + "aboutDataUsageSectionTitle": "Datan Käyttö", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageData": "Data", + "@aboutDataUsageData": {}, + "aboutDataUsageCache": "Välimuisti", + "@aboutDataUsageCache": {}, + "aboutDataUsageDatabase": "Tietokanta", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageMisc": "Muut", + "@aboutDataUsageMisc": {}, + "aboutDataUsageInternal": "Sisäinen", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "Ulkoinen", + "@aboutDataUsageExternal": {}, + "aboutDataUsageClearCache": "Tyhjennä Välimuisti", + "@aboutDataUsageClearCache": {}, + "aboutCreditsWorldAtlas1": "Tämä sovellus käyttää TopoJSON tiedostoa lähteestä", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "ISC-lisenssillä.", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Kääntäjät", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Avoimen Lähdekoodin Lisenssit", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "Tämä sovellus käyttää seuraavia avoimen lähdekoodin paketteja ja kirjastoja.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android Kirjastot", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter Lisäosat", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter Paketit", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart Paketit", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Näytä Kaikki Lisenssit", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "Yksityisyyskäytäntö", + "@policyPageTitle": {}, + "collectionPageTitle": "Kokoelma", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "Valitse", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "Valitse kohteet", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Näytä otsikko suodatin", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Piilota otsikko suodatin", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddDynamicAlbum": "Luo dynaaminen albumi", + "@collectionActionAddDynamicAlbum": {}, + "collectionActionAddShortcut": "Luo pikakuvake", + "@collectionActionAddShortcut": {}, + "collectionActionSetHome": "Aseta aloitussivuksi", + "@collectionActionSetHome": {}, + "collectionActionEmptyBin": "Tyhjennä roskakori", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Kopioi albumiin", + "@collectionActionCopy": {}, + "collectionActionMove": "Siirrä albumiin", + "@collectionActionMove": {}, + "collectionActionRescan": "Skannaa uudestaan", + "@collectionActionRescan": {}, + "collectionActionEdit": "Muokkaa", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Etsi otsikoita", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "Albumien mukaan", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Kuukauden mukaan", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Päivän mukaan", + "@collectionGroupDay": {}, + "sectionNone": "Ei osioita", + "@sectionNone": {}, + "sectionUnknown": "Tuntematon", + "@sectionUnknown": {}, + "dateToday": "Tänään", + "@dateToday": {}, + "dateYesterday": "Eilen", + "@dateYesterday": {}, + "dateThisMonth": "Tässä kuussa", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{1 kohteen poisto epäonnistui} other{{count} kohteen poisto epäonnistui}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionCopyFailureFeedback": "{count, plural, =1{1 kohteen kopiointi epäonnistui} other{{count} kohteen kopiointi epäonnistui}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{1 kohteen siirto epäonnistui} other{{count} kohteen siirto epäonnistui}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionRenameFailureFeedback": "{count, plural, =1{1 kohteen uudelleennimeäminen epäonnistui} other{{count} kohteen uudelleennimeäminen epäonnistui}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{1 kohteen muokkaaminen epäonnistui} other{{count} kohteen muokkaaminen epäonnistui}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{1 sivun vienti epäonnistui} other{{count} sivun vienti epäonnistui}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, =1{1 kohde kopioitu} other{{count} kohdetta kopioitu}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{1 kohde siirretty} other{{count} kohdetta siirretty}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{1 kohde nimetty uudelleen} other{{count} kohdetta nimetty uudelleen}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{1 kohde muokattu} other{{count} kohdetta muokattu}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEmptyFavourites": "Ei suosikkeja", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "Ei videoita", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "Ei kuvia", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Myönnä käyttöoikeus", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Valitse osa", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Poista osan valinta", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "Tietoa", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Asetukset", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "Kaikki kokoelmat", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Suosikit", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Kuvat", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Videot", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "Animaatiot", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Liikevalokuvat", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "Panoraamat", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Raw kuvat", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "360° Videot", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Albumit", + "@drawerAlbumPage": {}, + "drawerCountryPage": "Maat", + "@drawerCountryPage": {}, + "drawerPlacePage": "Paikat", + "@drawerPlacePage": {}, + "drawerTagPage": "Tunnisteet", + "@drawerTagPage": {}, + "sortByDate": "Päivyksen mukaan", + "@sortByDate": {}, + "sortByName": "Nimen mukaan", + "@sortByName": {}, + "sortByItemCount": "Kohteiden määrän mukaan", + "@sortByItemCount": {}, + "sortBySize": "Koon mukaan", + "@sortBySize": {}, + "sortByAlbumFileName": "Albumin & otsikon mukaan", + "@sortByAlbumFileName": {}, + "sortByRating": "Arvion mukaan", + "@sortByRating": {}, + "sortByDuration": "Keston mukaan", + "@sortByDuration": {}, + "sortByPath": "Polun mukaan", + "@sortByPath": {}, + "sortOrderNewestFirst": "Uusin ensin", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Vanhin ensin", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "A:sta Z:aan", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Z:sta A:han", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "Korkein ensin", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Matalin ensin", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Suurin ensin", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "Pienin ensin", + "@sortOrderSmallestFirst": {}, + "sortOrderShortestFirst": "Lyhyin ensin", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "Pisin ensin", + "@sortOrderLongestFirst": {}, + "albumGroupTier": "Tason mukaan", + "@albumGroupTier": {}, + "albumGroupType": "Tyypin mukaan", + "@albumGroupType": {}, + "albumGroupVolume": "Muistin koon mukaan", + "@albumGroupVolume": {}, + "albumMimeTypeMixed": "Sekoitettu", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "Kopioi Albumiin", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Vie Albumiin", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Siirrä Albumiin", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "Valitse Albumi", + "@albumPickPageTitlePick": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "albumDownload": "Lataa", + "@albumDownload": {}, + "albumScreenshots": "Kuvakaappaukset", + "@albumScreenshots": {}, + "albumScreenRecordings": "Näyttötallenteet", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Video Tallenteet", + "@albumVideoCaptures": {}, + "albumPageTitle": "Albumit", + "@albumPageTitle": {}, + "albumEmpty": "Ei albumeita", + "@albumEmpty": {}, + "createAlbumButtonLabel": "LUO", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "uusi", + "@newFilterBanner": {}, + "countryPageTitle": "Maat", + "@countryPageTitle": {}, + "countryEmpty": "Ei maita", + "@countryEmpty": {}, + "statePageTitle": "Maanosat", + "@statePageTitle": {}, + "stateEmpty": "Ei maanosia", + "@stateEmpty": {}, + "placePageTitle": "Paikat", + "@placePageTitle": {}, + "placeEmpty": "Ei paikkoja", + "@placeEmpty": {}, + "tagPageTitle": "Tunnisteet", + "@tagPageTitle": {}, + "tagEmpty": "Ei tunnisteita", + "@tagEmpty": {}, + "tagPickPageTitle": "Valitse Tunniste", + "@tagPickPageTitle": {}, + "binPageTitle": "Roskakori", + "@binPageTitle": {}, + "explorerPageTitle": "Tiedostot", + "@explorerPageTitle": {}, + "explorerActionSelectStorageVolume": "Valitse tallennustila", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "Valitse Tallennustila", + "@selectStorageVolumeDialogTitle": {}, + "searchCollectionFieldHint": "Etsi kokoelmasta", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "Viimeaikaiset", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Päiväys", + "@searchDateSectionTitle": {}, + "searchFormatSectionTitle": "Formaatit", + "@searchFormatSectionTitle": {}, + "searchAlbumsSectionTitle": "Albumit", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "Maat", + "@searchCountriesSectionTitle": {}, + "searchStatesSectionTitle": "Maanosat", + "@searchStatesSectionTitle": {}, + "searchPlacesSectionTitle": "Paikat", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Tunnisteet", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "Arviot", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "Metatiedot", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Asetukset", + "@settingsPageTitle": {}, + "settingsSystemDefault": "Järjestelmän oletus", + "@settingsSystemDefault": {}, + "settingsDefault": "Oletus", + "@settingsDefault": {}, + "settingsDisabled": "Poistettu käytöstä", + "@settingsDisabled": {}, + "settingsAskEverytime": "Kysy joka kerta", + "@settingsAskEverytime": {}, + "settingsModificationWarningDialogMessage": "Muita asetuksia tullaan muuttamaan.", + "@settingsModificationWarningDialogMessage": {}, + "settingsSearchFieldLabel": "Etsi asetuksista", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Ei vastaavia asetuksia", + "@settingsSearchEmpty": {}, + "settingsActionExport": "Vie", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "Vie", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "Tuo", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Tuo", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "Kansikuvat", + "@appExportCovers": {}, + "appExportDynamicAlbums": "Dynaamiset albumit", + "@appExportDynamicAlbums": {}, + "appExportFavourites": "Suosikit", + "@appExportFavourites": {}, + "appExportSettings": "Asetukset", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "Navigaatio", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Aloitussivu", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Aloitussivu", + "@settingsHomeDialogTitle": {}, + "setHomeCustom": "Mukautettu", + "@setHomeCustom": {}, + "settingsKeepScreenOnTile": "Pidä näyttö päällä", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Pidä Näyttö Päällä", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Paina ”takaisin” kahdesti poistuaksesi", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "Vahvistusikkunat", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "Vahvistusikkunat", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Kysy ennen kohteiden poistoa pysyvästi", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "Kysy ennen kohteiden siirtämistä roskakoriin", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Kysy ennen päiväämättömien kohteiden siirtämistä", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Näytä viesti kohteiden roskakoriin siirtämisen jälkeen", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsConfirmationVaultDataLoss": "Näytä holvin datan menettämisen varoitus", + "@settingsConfirmationVaultDataLoss": {}, + "settingsNavigationDrawerTile": "Navigaatiovalikko", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Navigaatiovalikko", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "Kosketa ja pidä pohjassa siirtääksesi ja uudelleen järjestelläksesi valikon kohteita.", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "Lajit", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "Albumit", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Sivut", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Lisää albumi", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsNavigationBottomActionsTile": "Alapalkin painikkeet", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Alapalkin Painikkeet", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Kosketa ja pidä pohjassa liikuttaaksesi painikkeita ja valitse mitkä toiminnot näytetään alapalkissa.", + "@settingsNavigationBottomActionEditorBanner": {}, + "settingsThumbnailSectionTitle": "Pienet näytekuvat", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "Peitekuvakkeet", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Peitekuvakkeet", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowHdrIcon": "Näytä HDR kuvake", + "@settingsThumbnailShowHdrIcon": {}, + "settingsThumbnailShowFavouriteIcon": "Näytä suosikki kuvake", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Näytä tunniste kuvake", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Näytä sijainti kuvake", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Näytä liikevalokuva kuvake", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "Näytä arvio", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Näytä raw kuvake", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Näytä videon kesto", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "Pikatoiminnot", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Pikatoiminnot", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Selaaminen", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Valitseminen", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Koske ja pidä pohjassa liikuttaaksesi painikkeita ja valitse mitkä toiminnot näytetään kohteita selatessa.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Koske ja pidä pohjassa liikuttaaksesi painikkeita ja valitaksesi mitkä toiminnot näytetään kun valitaan kohteita.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsCollectionBurstPatternsTile": "Monikuvien kuviot", + "@settingsCollectionBurstPatternsTile": {}, + "settingsCollectionBurstPatternsNone": "Ei mitään", + "@settingsCollectionBurstPatternsNone": {}, + "settingsViewerSectionTitle": "Kuvaselain", + "@settingsViewerSectionTitle": {}, + "settingsViewerGestureSideTapNext": "Paina näytön reunasta näyttääksesi edellisen/seuraavan kohteen", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerUseCutout": "Käytä tilapalkin aluetta", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Ylin kirkkaustaso", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Automaattisesti toista liikevalokuvat", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "Kuvien taustaväri", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Pikatoiminnot", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Pikatoiminnot", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "Kosketa ja pidä pohjassa liikuttaaksesi painikkeita ja valitaksesi mitkä toiminnot näytetään kuvaselaimessa.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Käytössä olevat painikkeet", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Saatavilla olevat painikkeet", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Ei painikkeita", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "Peitekuvakkeet", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "Peitekuvakkeet", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "Näytä avatessa", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowHistogram": "Näytä histogrammi", + "@settingsViewerShowHistogram": {}, + "settingsViewerShowMinimap": "Näytä pienoiskartta", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Näytä tiedot", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "Näytä otsikko, päiväys, sijainti, jne.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowRatingTags": "Näytä arvio & tunnisteet", + "@settingsViewerShowRatingTags": {}, + "settingsViewerShowShootingDetails": "Näytä valokuvaus tiedot", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowDescription": "Näytä kuvaus", + "@settingsViewerShowDescription": {}, + "settingsViewerShowOverlayThumbnails": "Näytä pienet näytekuvat", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "Sumennus efekti", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "Kuvakarusellit", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "Kuvakaruselli", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Toista", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Sekoita", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Täytä näyttö", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowAnimatedZoomEffect": "Animoitu zoom-efekti", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "Siirtymät", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Aikaväli", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "Videon toisto", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Videon Toisto", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "Video Asetukset", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "Näytä videot", + "@settingsVideoShowVideos": {}, + "settingsVideoPlaybackTile": "Toisto", + "@settingsVideoPlaybackTile": {}, + "settingsVideoPlaybackPageTitle": "Toisto", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoEnableHardwareAcceleration": "Laitteistokiihdytys", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "Automaattinen toisto", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "Jatkuva toisto", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Jatkuva Toisto", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsVideoResumptionModeTile": "Jatka toistamista", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoResumptionModeDialogTitle": "Jatka Toistamista", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsVideoBackgroundMode": "Taustalla-tila", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "Taustalla-tila", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsVideoControlsTile": "Kontrollit", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "Kontrollit", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "Painikkeet", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Tuplanapauta toistaaksesi/pysäyttääksesi", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "Tuplanapauta näytön reunaa siirtyäksesi taaksepäin/eteenpäin", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Vedä ylös tai alas muuttaksesi kirkkautta/äänenvoimakkuutta", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsSubtitleThemeTile": "Tekstitys", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Tekstitys", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Tässä on esimerkki.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "Tekstin kohdistus", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Tekstin Kohdistus", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextPositionTile": "Tekstin sijainti", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Tekstin Sijainti", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Tekstin koko", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "Näytä reunukset ja varjo", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Tekstin väri", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Tekstin läpinäkyvyys", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Taustan väri", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Taustan läpinäkyvyys", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Vasemmalla", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Keskellä", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Oikealla", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsPrivacySectionTitle": "Yksityisyys", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Salli pääsy sovellusluetteloon", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "Käytetään albumi näkymän parantamiseen", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "Salli anonyymi virhetietojen raportointi", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Tallenna hakuhistoria", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "Käytä roskakoria", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "Säilytä poistetut tiedostot 30 päivän ajan", + "@settingsEnableBinSubtitle": {}, + "settingsDisablingBinWarningDialogMessage": "Kohteet roskakorissa poistetaan pysyvästi.", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsAllowMediaManagement": "Salli median hallinta", + "@settingsAllowMediaManagement": {}, + "settingsHiddenItemsTile": "Piilotetut kohteet", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Piilotetut Kohteet", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "Piilotettuja suodattimia vastaavat kuvat ja videot eivät näy kokoelmassasi.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "Ei piilotettuja suodattimia", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Tallennustilan käyttöoikeudet", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "Tallennustilan Käyttöoikeudet", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessBanner": "Jotkut kansiot vaativat erillisen käyttöluvan jotta niiden sisältöä voidaan muokata. Tässä voit tarkastella kansioita joiden kohdalla olet käyttöluvan antanut.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Ei annettuja käyttölupia", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Peruuta", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Helppokäyttöisyys", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Poista animaatiot", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "Poista Animaatiot", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Aikaraja toimien tekemiselle", + "@settingsTimeToTakeActionTile": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Näytä vaihtoehdot monikosketuseleille", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsDisplaySectionTitle": "Näyttö", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Teema", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "Teema", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "Värilliset korostukset", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Dynaaminen väritys", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Näytön virkistystaajuus", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Virkistystaajuus", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsDisplayUseTvInterface": "Android TV käyttöliittymä", + "@settingsDisplayUseTvInterface": {}, + "settingsLanguageSectionTitle": "Kieli & Muodot", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "Kieli", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "Kieli", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "Koordinaattimuoto", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "Koordinaattimuoto", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Yksiköt", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "Yksiköt", + "@settingsUnitSystemDialogTitle": {}, + "settingsForceWesternArabicNumeralsTile": "Pakota Arabialaiset numerot", + "@settingsForceWesternArabicNumeralsTile": {}, + "settingsScreenSaverPageTitle": "Näytönsäästäjä", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "Kuvakehys", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Siluetti", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "Kun painat widgettia", + "@settingsWidgetOpenPage": {}, + "settingsWidgetDisplayedItem": "Näytetty kohde", + "@settingsWidgetDisplayedItem": {}, + "settingsCollectionTile": "Kokoelma", + "@settingsCollectionTile": {}, + "statsPageTitle": "Tilastot", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, =1{1 kohde sijainnilla} other{{count} kohdetta sijainnilla}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "statsTopCountriesSectionTitle": "Suosituimmat Maat", + "@statsTopCountriesSectionTitle": {}, + "statsTopStatesSectionTitle": "Suosituimmat Maanosat", + "@statsTopStatesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Suosituimmat Paikat", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Suosituimmat Tunnisteet", + "@statsTopTagsSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Suosituimmat Albumit", + "@statsTopAlbumsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "AVAA PANORAAMA", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "ASETA TAUSTAKUVA", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Hupsis!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "Kohdetta ei ole enään olemassa.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Tiedot", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "Takaisin katseluun", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "tuntematon", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "Kuvaus", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Otsikko", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "Päiväys", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "Resoluutio", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Koko", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Polku", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Kesto", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Omistaja", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Koordinaatit", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Osoite", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Kartan Tyyli", + "@mapStyleDialogTitle": {}, + "mapStyleDialogAddStyle": "Lisää tyyli", + "@mapStyleDialogAddStyle": {}, + "mapStyleTooltip": "Valitse kartan tyyli", + "@mapStyleTooltip": {}, + "mapStyleEditorDialogName": "Nimi", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogSubdomains": "Aliverkkotunnukset", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "Käyttäjäagentti", + "@mapStyleEditorDialogUserAgent": {}, + "mapZoomInTooltip": "Suurenna", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Loitonna", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Osoita pohjoinen ylöspäin", + "@mapPointNorthUpTooltip": {}, + "mapAttributionOsmData": "Karttatiedot © [OpenStreetMap](https://www.openstreetmap.org/copyright) osallistujat", + "@mapAttributionOsmData": {}, + "mapAttributionOsmLiberty": "Karttatiilit tekijältä [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Ylläpitäjä [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Karttatiilit tekijältä [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "mapAttributionOsmHot": "Karttatiilit tekijältä [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "Karttatiilit tekijältä [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "openMapPageTooltip": "Näytä Karttasivulla", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "Ei kuvia tällä alueella", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Upotettujen tietojen kopiointi epäonnistui", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "Avaa", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Näytä XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "Etsi metatiedoista", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Ei vastaavia avaimia", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Päivä & aika", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Kuvaus", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Mitat", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Resoluutio", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Oikeudet", + "@viewerInfoSearchSuggestionRights": {}, + "wallpaperUseScrollEffect": "Käytä vieritys-efektiä kotinäytöllä", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageTitle": "Muokkaa Tunnisteita", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Uusi tunniste", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Lisää tunniste", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Viimeaikaiset", + "@tagEditorSectionRecent": {}, + "tagEditorSectionPlaceholders": "Paikkamerkit", + "@tagEditorSectionPlaceholders": {}, + "tagEditorDiscardDialogMessage": "Haluatko peruuttaa muutokset?", + "@tagEditorDiscardDialogMessage": {}, + "tagPlaceholderCountry": "Maa", + "@tagPlaceholderCountry": {}, + "tagPlaceholderState": "Maanosa", + "@tagPlaceholderState": {}, + "tagPlaceholderPlace": "Paikka", + "@tagPlaceholderPlace": {}, + "panoramaEnableSensorControl": "Ota käyttöön sensoriohjaus", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Poista käytöstä sensoriohjaus", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Lähde", + "@sourceViewerPageTitle": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP vaaditaan videon toistamiseen liikevalokuvassa.\n\nOletko varma että haluat poistaa sen?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Toistonopeus", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Ääni", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Tekstitys", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "Pois", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Ääniraita", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "Ei löydy muita ääniraitoja.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "Tehty!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Epäonnistui", + "@genericFailureFeedback": {}, + "genericDangerWarningDialogMessage": "Oletko varma?", + "@genericDangerWarningDialogMessage": {}, + "tooManyItemsErrorDialogMessage": "Yritä uudestaan pienemmällä määrällä kohteita.", + "@tooManyItemsErrorDialogMessage": {}, + "menuActionConfigureView": "Näytä", + "@menuActionConfigureView": {}, + "menuActionSelect": "Valitse", + "@menuActionSelect": {}, + "menuActionSelectAll": "Valitse kaikki", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "Älä valitse mitään", + "@menuActionSelectNone": {}, + "menuActionMap": "Kartta", + "@menuActionMap": {}, + "menuActionSlideshow": "Kuvakaruselli", + "@menuActionSlideshow": {}, + "menuActionStats": "Tilastot", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "Järjestä", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "Osiot", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Asettelu", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "Käänteinen järjestys", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "Mosaiikki", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "Ruudukko", + "@tileLayoutGrid": {}, + "tileLayoutList": "Lista", + "@tileLayoutList": {}, + "castDialogTitle": "Suoratoistolaitteet", + "@castDialogTitle": {}, + "coverDialogTabCover": "Kansi", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "Sovellus", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Väri", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Valitse Sovellus", + "@appPickDialogTitle": {}, + "appPickDialogNone": "Ei mitään", + "@appPickDialogNone": {}, + "aboutPageTitle": "Tietoa", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Lisenssi", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Yksityisyyskäytäntö", + "@aboutLinkPolicy": {}, + "settingsViewerShowZoomLevel": "Näytä suurennuksen taso", + "@settingsViewerShowZoomLevel": {} +} diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb new file mode 100644 index 0000000..0db8184 --- /dev/null +++ b/lib/l10n/app_fr.arb @@ -0,0 +1,733 @@ +{ + "appName": "Aves", + "welcomeMessage": "Bienvenue", + "welcomeOptional": "Option", + "welcomeTermsToggle": "J’accepte les conditions d’utilisation", + "itemCount": "{count, plural, =1{{count} élément} other{{count} éléments}}", + "timeSeconds": "{count, plural, =0{{count} seconde} =1{{count} seconde} other{{count} secondes}}", + "timeMinutes": "{count, plural, =0{{count} minute} =1{{count} minute} other{{count} minutes}}", + "timeDays": "{count, plural, =0{{count} jour} =1{{count} jour} other{{count} jours}}", + "focalLength": "{length} mm", + "applyButtonLabel": "APPLIQUER", + "deleteButtonLabel": "SUPPRIMER", + "nextButtonLabel": "SUIVANT", + "showButtonLabel": "AFFICHER", + "hideButtonLabel": "MASQUER", + "continueButtonLabel": "CONTINUER", + "cancelTooltip": "Annuler", + "changeTooltip": "Modifier", + "clearTooltip": "Effacer", + "previousTooltip": "Précédent", + "nextTooltip": "Suivant", + "showTooltip": "Afficher", + "hideTooltip": "Masquer", + "actionRemove": "Supprimer", + "resetTooltip": "Réinitialiser", + "saveTooltip": "Sauvegarder", + "pickTooltip": "Sélectionner", + "doubleBackExitMessage": "Pressez « retour » à nouveau pour quitter.", + "doNotAskAgain": "Ne pas demander de nouveau", + "sourceStateLoading": "Chargement", + "sourceStateCataloguing": "Classification", + "sourceStateLocatingCountries": "Identification des pays", + "sourceStateLocatingPlaces": "Identification des lieux", + "chipActionDelete": "Supprimer", + "chipActionGoToAlbumPage": "Afficher dans Albums", + "chipActionGoToCountryPage": "Afficher dans Pays", + "chipActionGoToTagPage": "Afficher dans Étiquettes", + "chipActionFilterOut": "Exclure", + "chipActionFilterIn": "Inclure", + "chipActionHide": "Masquer", + "chipActionPin": "Épingler", + "chipActionUnpin": "Retirer", + "chipActionRename": "Renommer", + "chipActionSetCover": "Modifier la couverture", + "chipActionCreateAlbum": "Créer un album", + "entryActionCopyToClipboard": "Copier dans presse-papier", + "entryActionDelete": "Supprimer", + "entryActionConvert": "Convertir", + "entryActionExport": "Exporter", + "entryActionInfo": "Détails", + "entryActionRename": "Renommer", + "entryActionRestore": "Restaurer", + "entryActionRotateCCW": "Pivoter à gauche", + "entryActionRotateCW": "Pivoter à droite", + "entryActionFlip": "Retourner horizontalement", + "entryActionPrint": "Imprimer", + "entryActionShare": "Partager", + "entryActionViewSource": "Voir le code", + "entryActionShowGeoTiffOnMap": "Superposer sur la carte", + "entryActionConvertMotionPhotoToStillImage": "Convertir en image fixe", + "entryActionViewMotionPhotoVideo": "Ouvrir la vidéo", + "entryActionEdit": "Modifier", + "entryActionOpen": "Ouvrir avec", + "entryActionSetAs": "Utiliser comme", + "entryActionOpenMap": "Localiser avec", + "entryActionRotateScreen": "Pivoter l’écran", + "entryActionAddFavourite": "Ajouter aux favoris", + "entryActionRemoveFavourite": "Retirer des favoris", + "videoActionCaptureFrame": "Capturer l’image", + "videoActionMute": "Couper le son", + "videoActionUnmute": "Rétablir le son", + "videoActionPause": "Pause", + "videoActionPlay": "Lire", + "videoActionReplay10": "Reculer de 10 secondes", + "videoActionSkip10": "Avancer de 10 secondes", + "videoActionSelectStreams": "Choisir les pistes", + "videoActionSetSpeed": "Vitesse de lecture", + "viewerActionSettings": "Préférences", + "slideshowActionResume": "Reprendre", + "slideshowActionShowInCollection": "Afficher dans Collection", + "entryInfoActionEditDate": "Modifier la date", + "entryInfoActionEditLocation": "Modifier le lieu", + "entryInfoActionEditTitleDescription": "Modifier titre et description", + "entryInfoActionEditRating": "Modifier la notation", + "entryInfoActionEditTags": "Modifier les étiquettes", + "entryInfoActionRemoveMetadata": "Retirer les métadonnées", + "filterBinLabel": "Corbeille", + "filterFavouriteLabel": "Favori", + "filterNoDateLabel": "Sans date", + "filterNoLocationLabel": "Sans lieu", + "filterNoRatingLabel": "Sans notation", + "filterNoTagLabel": "Sans étiquette", + "filterNoTitleLabel": "Sans titre", + "filterOnThisDayLabel": "Ce jour-là", + "filterRecentlyAddedLabel": "Ajouté récemment", + "filterRatingRejectedLabel": "Rejeté", + "filterTypeAnimatedLabel": "Animation", + "filterTypeMotionPhotoLabel": "Photo animée", + "filterTypePanoramaLabel": "Panorama", + "filterTypeRawLabel": "Raw", + "filterTypeSphericalVideoLabel": "Vidéo à 360°", + "filterTypeGeotiffLabel": "GeoTIFF", + "filterMimeImageLabel": "Image", + "filterMimeVideoLabel": "Vidéo", + "coordinateFormatDms": "DMS", + "coordinateFormatDecimal": "Degrés décimaux", + "coordinateDms": "{coordinate} {direction}", + "coordinateDmsNorth": "N", + "coordinateDmsSouth": "S", + "coordinateDmsEast": "E", + "coordinateDmsWest": "O", + "unitSystemMetric": "SI", + "unitSystemImperial": "anglo-saxonnes", + "videoLoopModeNever": "Jamais", + "videoLoopModeShortOnly": "Courtes vidéos seulement", + "videoLoopModeAlways": "Toujours", + "videoControlsPlayOutside": "Ouvrir avec un autre lecteur", + "mapStyleGoogleNormal": "Google Maps", + "mapStyleGoogleHybrid": "Google Maps (Satellite)", + "mapStyleGoogleTerrain": "Google Maps (Relief)", + "mapStyleOsmHot": "OSM Humanitaire", + "mapStyleStamenWatercolor": "Stamen Watercolor (Aquarelle)", + "nameConflictStrategyRename": "Renommer", + "nameConflictStrategyReplace": "Remplacer", + "nameConflictStrategySkip": "Ignorer", + "keepScreenOnNever": "Jamais", + "keepScreenOnViewerOnly": "Visionneuse seulement", + "keepScreenOnAlways": "Toujours", + "accessibilityAnimationsRemove": "Empêchez certains effets de l’écran", + "accessibilityAnimationsKeep": "Conserver les effets de l’écran", + "displayRefreshRatePreferHighest": "Fréquence maximale", + "displayRefreshRatePreferLowest": "Fréquence minimale", + "videoPlaybackSkip": "Passer", + "videoPlaybackMuted": "Jouer sans son", + "videoPlaybackWithSound": "Jouer avec son", + "themeBrightnessLight": "Clair", + "themeBrightnessDark": "Sombre", + "themeBrightnessBlack": "Noir", + "viewerTransitionSlide": "Défilement", + "viewerTransitionParallax": "Parallaxe", + "viewerTransitionFade": "Fondu", + "viewerTransitionZoomIn": "Zoom", + "viewerTransitionNone": "Aucune", + "wallpaperTargetHome": "Écran d’accueil", + "wallpaperTargetLock": "Écran de verrouillage", + "wallpaperTargetHomeLock": "Écrans accueil et verrouillage", + "widgetOpenPageHome": "Ouvrir la page d’accueil", + "widgetOpenPageCollection": "Ouvrir la collection", + "widgetOpenPageViewer": "Ouvrir la visionneuse", + "albumTierNew": "Nouveaux", + "albumTierPinned": "Épinglés", + "albumTierSpecial": "Standards", + "albumTierApps": "Apps", + "albumTierRegular": "Autres", + "storageVolumeDescriptionFallbackPrimary": "Stockage interne", + "storageVolumeDescriptionFallbackNonPrimary": "Carte SD", + "rootDirectoryDescription": "dossier racine", + "otherDirectoryDescription": "dossier « {name} »", + "storageAccessDialogMessage": "Veuillez sélectionner le {directory} de « {volume} » à l’écran suivant, pour que l’app puisse modifier son contenu.", + "restrictedAccessDialogMessage": "Cette app ne peut pas modifier les fichiers du {directory} de « {volume} ».\n\nVeuillez utiliser une app pré-installée pour déplacer les fichiers vers un autre dossier.", + "notEnoughSpaceDialogMessage": "Cette opération nécessite {neededSize} d’espace disponible sur « {volume} », mais il ne reste que {freeSize}.", + "missingSystemFilePickerDialogMessage": "Le sélecteur de fichiers du système est absent ou désactivé. Veuillez le réactiver et réessayer.", + "unsupportedTypeDialogMessage": "{count, plural, =1{Cette opération n’est pas disponible pour les fichiers au format suivant : {types}.} other{Cette opération n’est pas disponible pour les fichiers aux formats suivants : {types}.}}", + "nameConflictDialogSingleSourceMessage": "Certains fichiers dans le dossier de destination ont le même nom.", + "nameConflictDialogMultipleSourceMessage": "Certains fichiers ont le même nom.", + "addShortcutDialogLabel": "Nom du raccourci", + "addShortcutButtonLabel": "AJOUTER", + "noMatchingAppDialogMessage": "Aucune app ne peut effectuer cette opération.", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Mettre cet élément à la corbeille ?} other{Mettre ces {count} éléments à la corbeille ?}}", + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Supprimer cet élément ?} other{Supprimer ces {count} éléments ?}}", + "moveUndatedConfirmationDialogMessage": "Sauvegarder les dates des éléments avant de continuer ?", + "moveUndatedConfirmationDialogSetDate": "Sauvegarder les dates", + "videoResumeDialogMessage": "Voulez-vous reprendre la lecture à {time} ?", + "videoStartOverButtonLabel": "RECOMMENCER", + "videoResumeButtonLabel": "REPRENDRE", + "setCoverDialogLatest": "dernier élément", + "setCoverDialogAuto": "automatique", + "setCoverDialogCustom": "personnalisé", + "hideFilterConfirmationDialogMessage": "Les images et vidéos correspondantes n’apparaîtront plus dans votre collection. Vous pouvez les montrer à nouveau via les réglages de « Confidentialité ».\n\nVoulez-vous vraiment les masquer ?", + "newAlbumDialogTitle": "Nouvel album", + "newAlbumDialogNameLabel": "Nom de l’album", + "newAlbumDialogNameLabelAlreadyExistsHelper": "Le dossier existe déjà", + "newAlbumDialogStorageLabel": "Volume de stockage :", + "renameAlbumDialogLabel": "Nouveau nom", + "renameAlbumDialogLabelAlreadyExistsHelper": "Le dossier existe déjà", + "renameEntrySetPageTitle": "Renommage", + "renameEntrySetPagePatternFieldLabel": "Modèle de nommage", + "renameEntrySetPageInsertTooltip": "Ajouter un champ", + "renameEntrySetPagePreviewSectionTitle": "Aperçu", + "renameProcessorCounter": "Compteur", + "renameProcessorName": "Nom", + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Supprimer cet album et l’élément dedans ?} other{Supprimer cet album et les {count} éléments dedans ?}}", + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Supprimer ces albums et l’élément dedans ?} other{Supprimer ces albums et les {count} éléments dedans ?}}", + "exportEntryDialogFormat": "Format :", + "exportEntryDialogWidth": "Largeur", + "exportEntryDialogHeight": "Hauteur", + "renameEntryDialogLabel": "Nouveau nom", + "editEntryDialogTargetFieldsHeader": "Champs à modifier", + "editEntryDateDialogTitle": "Date & Heure", + "editEntryDateDialogSetCustom": "Régler une date personnalisée", + "editEntryDateDialogCopyField": "Copier d’une autre date", + "editEntryDialogCopyFromItem": "Copier d’un autre élément", + "editEntryDateDialogExtractFromTitle": "Extraire du titre", + "editEntryDateDialogShift": "Décaler", + "editEntryDateDialogSourceFileModifiedDate": "Date de modification du fichier", + "durationDialogHours": "Heures", + "durationDialogMinutes": "Minutes", + "durationDialogSeconds": "Secondes", + "editEntryLocationDialogTitle": "Lieu", + "editEntryLocationDialogChooseOnMap": "Sélectionner sur la carte", + "editEntryLocationDialogLatitude": "Latitude", + "editEntryLocationDialogLongitude": "Longitude", + "locationPickerUseThisLocationButton": "Utiliser ce lieu", + "editEntryRatingDialogTitle": "Notation", + "removeEntryMetadataDialogTitle": "Retrait de métadonnées", + "removeEntryMetadataDialogMore": "Voir plus", + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Les métadonnées XMP sont nécessaires pour lire la vidéo d’une photo animée.\n\nVoulez-vous vraiment les supprimer ?", + "genericDangerWarningDialogMessage": "Êtes-vous sûr ?", + "videoSpeedDialogLabel": "Vitesse de lecture", + "videoStreamSelectionDialogVideo": "Vidéo", + "videoStreamSelectionDialogAudio": "Audio", + "videoStreamSelectionDialogText": "Sous-titres", + "videoStreamSelectionDialogOff": "Désactivé", + "videoStreamSelectionDialogTrack": "Piste", + "videoStreamSelectionDialogNoSelection": "Il n’y a pas d’autre piste.", + "genericSuccessFeedback": "Succès !", + "genericFailureFeedback": "Échec", + "menuActionConfigureView": "Vue", + "menuActionSelect": "Sélectionner", + "menuActionSelectAll": "Tout sélectionner", + "menuActionSelectNone": "Tout désélectionner", + "menuActionMap": "Carte", + "menuActionSlideshow": "Diaporama", + "menuActionStats": "Statistiques", + "viewDialogSortSectionTitle": "Tri", + "viewDialogGroupSectionTitle": "Sections", + "viewDialogLayoutSectionTitle": "Vue", + "viewDialogReverseSortOrder": "Inverser l’ordre", + "tileLayoutMosaic": "Mosaïque", + "tileLayoutGrid": "Grille", + "tileLayoutList": "Liste", + "coverDialogTabCover": "Image", + "coverDialogTabApp": "App", + "coverDialogTabColor": "Couleur", + "appPickDialogTitle": "Sélection", + "appPickDialogNone": "Aucune", + "aboutPageTitle": "À propos", + "aboutLinkLicense": "Licence", + "aboutLinkPolicy": "Politique de confidentialité", + "aboutBugSectionTitle": "Rapports d’erreur", + "aboutBugSaveLogInstruction": "Sauvegarder les logs de l’app vers un fichier", + "aboutBugCopyInfoInstruction": "Copier les informations d’environnement", + "aboutBugCopyInfoButton": "Copier", + "aboutBugReportInstruction": "Créer une « issue » sur GitHub en attachant les logs et informations d’environnement", + "aboutBugReportButton": "Créer", + "aboutCreditsSectionTitle": "Remerciements", + "aboutCreditsWorldAtlas1": "Cette app utilise un fichier TopoJSON de", + "aboutCreditsWorldAtlas2": "sous licence ISC.", + "aboutTranslatorsSectionTitle": "Traducteurs", + "aboutLicensesSectionTitle": "Licences open-source", + "aboutLicensesBanner": "Cette app utilise ces librairies et packages open-source.", + "aboutLicensesAndroidLibrariesSectionTitle": "Librairies Android", + "aboutLicensesFlutterPluginsSectionTitle": "Plugins Flutter", + "aboutLicensesFlutterPackagesSectionTitle": "Packages Flutter", + "aboutLicensesDartPackagesSectionTitle": "Packages Dart", + "aboutLicensesShowAllButtonLabel": "Afficher toutes les licences", + "policyPageTitle": "Politique de confidentialité", + "collectionPageTitle": "Collection", + "collectionPickPageTitle": "Sélection", + "collectionSelectPageTitle": "Sélection", + "collectionActionShowTitleSearch": "Filtrer les titres", + "collectionActionHideTitleSearch": "Masquer le filtre", + "collectionActionAddShortcut": "Créer un raccourci", + "collectionActionEmptyBin": "Vider la corbeille", + "collectionActionCopy": "Copier vers l’album", + "collectionActionMove": "Déplacer vers l’album", + "collectionActionRescan": "Réanalyser", + "collectionActionEdit": "Modifier", + "collectionSearchTitlesHintText": "Recherche de titres", + "collectionGroupAlbum": "par album", + "collectionGroupMonth": "par mois", + "collectionGroupDay": "par jour", + "sectionUnknown": "Inconnu", + "dateToday": "Aujourd’hui", + "dateYesterday": "Hier", + "dateThisMonth": "Ce mois-ci", + "collectionDeleteFailureFeedback": "{count, plural, =1{Échec de la suppression d’1 élément} other{Échec de la suppression de {count} éléments}}", + "collectionCopyFailureFeedback": "{count, plural, =1{Échec de la copie d’1 élément} other{Échec de la copie de {count} éléments}}", + "collectionMoveFailureFeedback": "{count, plural, =1{Échec du déplacement d’1 élément} other{Échec du déplacement de {count} éléments}}", + "collectionRenameFailureFeedback": "{count, plural, =1{Échec du renommage d’1 élément} other{Échec du renommage de {count} éléments}}", + "collectionEditFailureFeedback": "{count, plural, =1{Échec de la modification d’1 élément} other{Échec de la modification de {count} éléments}}", + "collectionExportFailureFeedback": "{count, plural, =1{Échec de l’export d’1 page} other{Échec de l’export de {count} pages}}", + "collectionCopySuccessFeedback": "{count, plural, =1{1 élément copié} other{{count} éléments copiés}}", + "collectionMoveSuccessFeedback": "{count, plural, =1{1 élément déplacé} other{{count} éléments déplacés}}", + "collectionRenameSuccessFeedback": "{count, plural, =1{1 élément renommé} other{{count} éléments renommés}}", + "collectionEditSuccessFeedback": "{count, plural, =1{1 élément modifié} other{{count} éléments modifiés}}", + "collectionEmptyFavourites": "Aucun favori", + "collectionEmptyVideos": "Aucune vidéo", + "collectionEmptyImages": "Aucune image", + "collectionEmptyGrantAccessButtonLabel": "Autoriser l’accès", + "collectionSelectSectionTooltip": "Sélectionner la section", + "collectionDeselectSectionTooltip": "Désélectionner la section", + "drawerAboutButton": "À propos", + "drawerSettingsButton": "Réglages", + "drawerCollectionAll": "Toute la collection", + "drawerCollectionFavourites": "Favoris", + "drawerCollectionImages": "Images", + "drawerCollectionVideos": "Vidéos", + "drawerCollectionAnimated": "Animations", + "drawerCollectionMotionPhotos": "Photos animées", + "drawerCollectionPanoramas": "Panoramas", + "drawerCollectionRaws": "Photos Raw", + "drawerCollectionSphericalVideos": "Vidéos à 360°", + "drawerAlbumPage": "Albums", + "drawerCountryPage": "Pays", + "drawerTagPage": "Étiquettes", + "sortByDate": "par date", + "sortByName": "alphabétique", + "sortByItemCount": "par nombre d’éléments", + "sortBySize": "par taille", + "sortByAlbumFileName": "par titre d’album et élément", + "sortByRating": "par notation", + "sortOrderNewestFirst": "Plus récents d’abord", + "sortOrderOldestFirst": "Plus anciens d’abord", + "sortOrderAtoZ": "De A à Z", + "sortOrderZtoA": "De Z à A", + "sortOrderHighestFirst": "Meilleurs d’abord", + "sortOrderLowestFirst": "Moins bons d’abord", + "sortOrderLargestFirst": "Plus larges d’abord", + "sortOrderSmallestFirst": "Moins larges d’abord", + "albumGroupTier": "par importance", + "albumGroupType": "par type", + "albumGroupVolume": "par volume de stockage", + "albumMimeTypeMixed": "Mixte", + "albumPickPageTitleCopy": "Copie", + "albumPickPageTitleExport": "Export", + "albumPickPageTitleMove": "Déplacement", + "albumPickPageTitlePick": "Sélection", + "albumCamera": "Appareil photo", + "albumDownload": "Téléchargements", + "albumScreenshots": "Captures d’écran", + "albumScreenRecordings": "Enregistrements d’écran", + "albumVideoCaptures": "Captures de vidéo", + "albumPageTitle": "Albums", + "albumEmpty": "Aucun album", + "createAlbumButtonLabel": "CRÉER", + "newFilterBanner": "nouveau", + "countryPageTitle": "Pays", + "countryEmpty": "Aucun pays", + "tagPageTitle": "Étiquettes", + "tagEmpty": "Aucune étiquette", + "binPageTitle": "Corbeille", + "searchCollectionFieldHint": "Recherche", + "searchRecentSectionTitle": "Historique", + "searchDateSectionTitle": "Date", + "searchAlbumsSectionTitle": "Albums", + "searchCountriesSectionTitle": "Pays", + "searchPlacesSectionTitle": "Lieux", + "searchTagsSectionTitle": "Étiquettes", + "searchRatingSectionTitle": "Notations", + "searchMetadataSectionTitle": "Métadonnées", + "settingsPageTitle": "Réglages", + "settingsSystemDefault": "Système", + "settingsDefault": "Par défaut", + "settingsDisabled": "Désactivé", + "settingsSearchFieldLabel": "Recherche de réglages", + "settingsSearchEmpty": "Aucun réglage correspondant", + "settingsActionExport": "Exporter", + "settingsActionExportDialogTitle": "Exporter", + "settingsActionImport": "Importer", + "settingsActionImportDialogTitle": "Importer", + "appExportCovers": "Couvertures", + "appExportFavourites": "Favoris", + "appExportSettings": "Réglages", + "settingsNavigationSectionTitle": "Navigation", + "settingsHomeTile": "Page d’accueil", + "settingsHomeDialogTitle": "Page d’accueil", + "settingsKeepScreenOnTile": "Maintenir l’écran allumé", + "settingsKeepScreenOnDialogTitle": "Allumage de l’écran", + "settingsDoubleBackExit": "Presser « retour » 2 fois pour quitter", + "settingsConfirmationTile": "Demandes de confirmation", + "settingsConfirmationDialogTitle": "Demandes de confirmation", + "settingsConfirmationBeforeDeleteItems": "Suppression définitive d’éléments", + "settingsConfirmationBeforeMoveToBinItems": "Mise d’éléments à la corbeille", + "settingsConfirmationBeforeMoveUndatedItems": "Déplacement d’éléments non datés", + "settingsConfirmationAfterMoveToBinItems": "Confirmation après mise d’éléments à la corbeille", + "settingsNavigationDrawerTile": "Menu de navigation", + "settingsNavigationDrawerEditorPageTitle": "Menu de navigation", + "settingsNavigationDrawerBanner": "Maintenez votre doigt appuyé pour déplacer et réorganiser les éléments de menu.", + "settingsNavigationDrawerTabTypes": "Types", + "settingsNavigationDrawerTabAlbums": "Albums", + "settingsNavigationDrawerTabPages": "Pages", + "settingsNavigationDrawerAddAlbum": "Ajouter un album", + "settingsThumbnailSectionTitle": "Vignettes", + "settingsThumbnailOverlayTile": "Incrustations", + "settingsThumbnailOverlayPageTitle": "Incrustations", + "settingsThumbnailShowFavouriteIcon": "Afficher l’icône de favori", + "settingsThumbnailShowTagIcon": "Afficher l’icône d’étiquette", + "settingsThumbnailShowLocationIcon": "Afficher l’icône de lieu", + "settingsThumbnailShowMotionPhotoIcon": "Afficher l’icône de photo animée", + "settingsThumbnailShowRating": "Afficher la notation", + "settingsThumbnailShowRawIcon": "Afficher l’icône de photo raw", + "settingsThumbnailShowVideoDuration": "Afficher la durée de la vidéo", + "settingsCollectionQuickActionsTile": "Actions rapides", + "settingsCollectionQuickActionEditorPageTitle": "Actions rapides", + "settingsCollectionQuickActionTabBrowsing": "Navigation", + "settingsCollectionQuickActionTabSelecting": "Sélection", + "settingsCollectionBrowsingQuickActionEditorBanner": "Maintenez votre doigt appuyé pour déplacer les boutons et choisir les actions affichées lors de la navigation.", + "settingsCollectionSelectionQuickActionEditorBanner": "Maintenez votre doigt appuyé pour déplacer les boutons et choisir les actions affichées lors de la sélection d’éléments.", + "settingsViewerSectionTitle": "Visionneuse", + "settingsViewerGestureSideTapNext": "Appuyer sur les bords de l’écran pour passer à l’élément précédent/suivant", + "settingsViewerUseCutout": "Utiliser la zone d’encoche", + "settingsViewerMaximumBrightness": "Luminosité maximale", + "settingsMotionPhotoAutoPlay": "Lecture automatique des photos animées", + "settingsImageBackground": "Arrière-plan de l’image", + "settingsViewerQuickActionsTile": "Actions rapides", + "settingsViewerQuickActionEditorPageTitle": "Actions rapides", + "settingsViewerQuickActionEditorBanner": "Maintenez votre doigt appuyé pour déplacer les boutons et choisir les actions affichées sur la visionneuse.", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Boutons affichés", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Boutons disponibles", + "settingsViewerQuickActionEmpty": "Aucun bouton", + "settingsViewerOverlayTile": "Incrustations", + "settingsViewerOverlayPageTitle": "Incrustations", + "settingsViewerShowOverlayOnOpening": "Afficher à l’ouverture", + "settingsViewerShowMinimap": "Afficher la mini-carte", + "settingsViewerShowInformation": "Afficher les détails", + "settingsViewerShowInformationSubtitle": "Afficher les titre, date, lieu, etc.", + "settingsViewerShowShootingDetails": "Afficher les détails de prise de vue", + "settingsViewerShowOverlayThumbnails": "Afficher les vignettes", + "settingsViewerEnableOverlayBlurEffect": "Effets de flou", + "settingsViewerSlideshowTile": "Diaporama", + "settingsViewerSlideshowPageTitle": "Diaporama", + "settingsSlideshowRepeat": "Répéter", + "settingsSlideshowShuffle": "Aléatoire", + "settingsSlideshowFillScreen": "Remplir l’écran", + "settingsSlideshowAnimatedZoomEffect": "Effet de zoom animé", + "settingsSlideshowTransitionTile": "Transition", + "settingsSlideshowIntervalTile": "Intervalle", + "settingsSlideshowVideoPlaybackTile": "Lecture de vidéos", + "settingsSlideshowVideoPlaybackDialogTitle": "Lecture de vidéos", + "settingsVideoPageTitle": "Réglages vidéo", + "settingsVideoSectionTitle": "Vidéo", + "settingsVideoShowVideos": "Afficher les vidéos", + "settingsVideoEnableHardwareAcceleration": "Accélération matérielle", + "settingsVideoAutoPlay": "Lecture automatique", + "settingsVideoLoopModeTile": "Lecture répétée", + "settingsVideoLoopModeDialogTitle": "Lecture répétée", + "settingsSubtitleThemeTile": "Sous-titres", + "settingsSubtitleThemePageTitle": "Sous-titres", + "settingsSubtitleThemeSample": "Ceci est un exemple.", + "settingsSubtitleThemeTextAlignmentTile": "Alignement du texte", + "settingsSubtitleThemeTextAlignmentDialogTitle": "Alignement du texte", + "settingsSubtitleThemeTextSize": "Taille du texte", + "settingsSubtitleThemeShowOutline": "Afficher les contours et ombres", + "settingsSubtitleThemeTextColor": "Couleur du texte", + "settingsSubtitleThemeTextOpacity": "Transparence du texte", + "settingsSubtitleThemeBackgroundColor": "Couleur d’arrière-plan", + "settingsSubtitleThemeBackgroundOpacity": "Transparence de l’arrière-plan", + "settingsSubtitleThemeTextAlignmentLeft": "gauche", + "settingsSubtitleThemeTextAlignmentCenter": "centré", + "settingsSubtitleThemeTextAlignmentRight": "droite", + "settingsVideoControlsTile": "Contrôles", + "settingsVideoControlsPageTitle": "Contrôles", + "settingsVideoButtonsTile": "Boutons", + "settingsVideoGestureDoubleTapTogglePlay": "Appuyer deux fois pour lire ou mettre en pause", + "settingsVideoGestureSideDoubleTapSeek": "Appuyer deux fois sur les bords de l’écran pour reculer ou avancer", + "settingsPrivacySectionTitle": "Confidentialité", + "settingsAllowInstalledAppAccess": "Autoriser l’accès à l’inventaire des apps", + "settingsAllowInstalledAppAccessSubtitle": "Pour un affichage amélioré des albums", + "settingsAllowErrorReporting": "Autoriser l’envoi de rapports d’erreur", + "settingsSaveSearchHistory": "Maintenir un historique des recherches", + "settingsEnableBin": "Utiliser la corbeille", + "settingsEnableBinSubtitle": "Conserver les éléments supprimés pendant 30 jours", + "settingsHiddenItemsTile": "Éléments masqués", + "settingsHiddenItemsPageTitle": "Éléments masqués", + "settingsHiddenFiltersBanner": "Les images et vidéos correspondantes aux filtres masqués n’apparaîtront pas dans votre collection.", + "settingsHiddenFiltersEmpty": "Aucun filtre masqué", + "settingsStorageAccessTile": "Accès au stockage", + "settingsStorageAccessPageTitle": "Accès au stockage", + "settingsStorageAccessBanner": "Une autorisation d’accès au stockage est nécessaire pour modifier le contenu de certains dossiers. Voici la liste des autorisations couramment en vigueur.", + "settingsStorageAccessEmpty": "Aucune autorisation d’accès", + "settingsStorageAccessRevokeTooltip": "Retirer", + "settingsAccessibilitySectionTitle": "Accessibilité", + "settingsRemoveAnimationsTile": "Suppression des animations", + "settingsRemoveAnimationsDialogTitle": "Suppression des animations", + "settingsTimeToTakeActionTile": "Délai pour effectuer une action", + "settingsDisplaySectionTitle": "Affichage", + "settingsThemeBrightnessTile": "Thème", + "settingsThemeBrightnessDialogTitle": "Thème", + "settingsThemeColorHighlights": "Surlignages colorés", + "settingsThemeEnableDynamicColor": "Couleur dynamique", + "settingsDisplayRefreshRateModeTile": "Fréquence d’actualisation de l’écran", + "settingsDisplayRefreshRateModeDialogTitle": "Fréquence d’actualisation", + "settingsLanguageSectionTitle": "Langue & Formats", + "settingsLanguageTile": "Langue", + "settingsLanguagePageTitle": "Langue", + "settingsCoordinateFormatTile": "Format de coordonnées", + "settingsCoordinateFormatDialogTitle": "Format de coordonnées", + "settingsUnitSystemTile": "Unités", + "settingsUnitSystemDialogTitle": "Unités", + "settingsScreenSaverPageTitle": "Économiseur d’écran", + "settingsWidgetPageTitle": "Cadre photo", + "settingsWidgetShowOutline": "Contours", + "settingsWidgetOpenPage": "Quand vous appuyez sur le widget", + "settingsCollectionTile": "Collection", + "statsPageTitle": "Statistiques", + "statsWithGps": "{count, plural, =1{1 élément localisé} other{{count} éléments localisés}}", + "statsTopCountriesSectionTitle": "Top pays", + "statsTopPlacesSectionTitle": "Top lieux", + "statsTopTagsSectionTitle": "Top étiquettes", + "statsTopAlbumsSectionTitle": "Top albums", + "viewerOpenPanoramaButtonLabel": "OUVRIR LE PANORAMA", + "viewerSetWallpaperButtonLabel": "APPLIQUER", + "viewerErrorUnknown": "Zut !", + "viewerErrorDoesNotExist": "Le fichier n’existe plus.", + "viewerInfoPageTitle": "Détails", + "viewerInfoBackToViewerTooltip": "Retour à la visionneuse", + "viewerInfoUnknown": "inconnu", + "viewerInfoLabelDescription": "Description", + "viewerInfoLabelTitle": "Titre", + "viewerInfoLabelDate": "Date", + "viewerInfoLabelResolution": "Résolution", + "viewerInfoLabelSize": "Taille", + "viewerInfoLabelUri": "URI", + "viewerInfoLabelPath": "Chemin", + "viewerInfoLabelDuration": "Durée", + "viewerInfoLabelOwner": "Propriétaire", + "viewerInfoLabelCoordinates": "Coordonnées", + "viewerInfoLabelAddress": "Adresse", + "mapStyleDialogTitle": "Type de carte", + "mapStyleTooltip": "Sélectionner le type de carte", + "mapZoomInTooltip": "Zoomer", + "mapZoomOutTooltip": "Dézoomer", + "mapPointNorthUpTooltip": "Placer le nord en haut", + "mapAttributionOsmHot": "Fond de carte par [HOT](https://www.hotosm.org/) • Hébergé par [OSM France](https://openstreetmap.fr/)", + "mapAttributionStamen": "Fond de carte par [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "openMapPageTooltip": "Ouvrir la page Carte", + "mapEmptyRegion": "Aucune image dans cette région", + "viewerInfoOpenEmbeddedFailureFeedback": "Échec de l’extraction des données", + "viewerInfoOpenLinkText": "Ouvrir", + "viewerInfoViewXmlLinkText": "Afficher le XML", + "viewerInfoSearchFieldLabel": "Recherche de métadonnées", + "viewerInfoSearchEmpty": "Aucune clé correspondante", + "viewerInfoSearchSuggestionDate": "Date & heure", + "viewerInfoSearchSuggestionDescription": "Description", + "viewerInfoSearchSuggestionDimensions": "Dimensions", + "viewerInfoSearchSuggestionResolution": "Résolution", + "viewerInfoSearchSuggestionRights": "Droits", + "wallpaperUseScrollEffect": "Utiliser l’effet de défilement sur l’écran d’accueil", + "tagEditorPageTitle": "Modifier les étiquettes", + "tagEditorPageNewTagFieldLabel": "Nouvelle étiquette", + "tagEditorPageAddTagTooltip": "Ajouter l’étiquette", + "tagEditorSectionRecent": "Ajouts récents", + "panoramaEnableSensorControl": "Activer le contrôle par capteurs", + "panoramaDisableSensorControl": "Désactiver le contrôle par capteurs", + "sourceViewerPageTitle": "Code source", + "editEntryLocationDialogSetCustom": "Définir un lieu personnalisé", + "tagEditorSectionPlaceholders": "Étiquettes de substitution", + "tagPlaceholderPlace": "Lieu", + "tagPlaceholderCountry": "Pays", + "settingsAllowMediaManagement": "Autoriser la gestion des médias", + "subtitlePositionTop": "Haut", + "subtitlePositionBottom": "Bas", + "settingsSubtitleThemeTextPositionTile": "Position du texte", + "widgetDisplayedItemMostRecent": "Le plus récent", + "settingsWidgetDisplayedItem": "Élément affiché", + "widgetDisplayedItemRandom": "Aléatoire", + "settingsSubtitleThemeTextPositionDialogTitle": "Position du texte", + "entryInfoActionExportMetadata": "Exporter les métadonnées", + "filterNoAddressLabel": "Sans adresse", + "filterAspectRatioPortraitLabel": "Portrait", + "filterAspectRatioLandscapeLabel": "Paysage", + "settingsViewerShowRatingTags": "Afficher la notation et les étiquettes", + "entryActionShareImageOnly": "Partager l’image seulement", + "entryActionShareVideoOnly": "Partager la vidéo seulement", + "entryInfoActionRemoveLocation": "Retirer le lieu", + "keepScreenOnVideoPlayback": "Pendant la lecture de vidéos", + "columnCount": "{count, plural, =1{{count} colonne} other{{count} colonnes}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsAccessibilityShowPinchGestureAlternatives": "Afficher des alternatives aux interactions multitactiles", + "settingsViewerShowDescription": "Afficher la description", + "settingsModificationWarningDialogMessage": "D’autres réglages seront modifiés.", + "settingsDisplayUseTvInterface": "Interface Android TV", + "filterTaggedLabel": "Étiqueté", + "filterLocatedLabel": "Localisé", + "tooManyItemsErrorDialogMessage": "Réessayez avec moins d’éléments.", + "settingsVideoGestureVerticalDragBrightnessVolume": "Balayer verticalement pour ajuster la luminosité et le volume", + "chipActionLock": "Verrouiller", + "chipActionCreateVault": "Créer un coffre-fort", + "chipActionConfigureVault": "Configurer le coffre-fort", + "albumTierVaults": "Coffres-forts", + "vaultLockTypePin": "Code PIN", + "vaultLockTypePassword": "Mot de passe", + "newVaultWarningDialogMessage": "Les éléments dans les coffres-forts ne sont visibles que dans cette app et nulle autre.\n\nSi vous désinstallez cette app, ou que vous supprimez ses données, vous perdrez tous ces éléments.", + "newVaultDialogTitle": "Nouveau coffre-fort", + "vaultDialogLockTypeLabel": "Verrouillage", + "pinDialogEnter": "Entrez votre code PIN", + "pinDialogConfirm": "Confirmez votre code PIN", + "passwordDialogConfirm": "Confirmez votre mot de passe", + "authenticateToConfigureVault": "Authentification pour configurer le coffre-fort", + "vaultBinUsageDialogMessage": "Des coffres-forts utilisent la corbeille.", + "vaultDialogLockModeWhenScreenOff": "Verrouiller quand l’écran s’éteint", + "settingsConfirmationVaultDataLoss": "Afficher l’avertissement sur la perte de données avec les coffres-forts", + "configureVaultDialogTitle": "Configuration du coffre-fort", + "passwordDialogEnter": "Entrez votre mot de passe", + "authenticateToUnlockVault": "Authentification pour déverrouiller le coffre-fort", + "settingsDisablingBinWarningDialogMessage": "Les éléments dans la corbeille seront supprimés définitivement.", + "drawerPlacePage": "Lieux", + "placePageTitle": "Lieux", + "chipActionGoToPlacePage": "Afficher dans Lieux", + "placeEmpty": "Aucun lieu", + "lengthUnitPixel": "px", + "lengthUnitPercent": "%", + "exportEntryDialogWriteMetadata": "Écrire les métadonnées", + "patternDialogEnter": "Entrez votre modèle", + "patternDialogConfirm": "Confirmez votre modèle", + "vaultLockTypePattern": "Modèle", + "settingsVideoEnablePip": "Picture-in-picture", + "settingsVideoBackgroundMode": "Lecture en arrière-plan", + "settingsVideoBackgroundModeDialogTitle": "Arrière-plan", + "settingsCollectionBurstPatternsNone": "Aucun", + "settingsCollectionBurstPatternsTile": "Modèles de rafale", + "tagPlaceholderState": "État", + "chipActionShowCountryStates": "Afficher les États", + "stateEmpty": "Aucun État", + "searchStatesSectionTitle": "États", + "statePageTitle": "États", + "statsTopStatesSectionTitle": "Top États", + "viewerActionLock": "Verrouiller la visionneuse", + "viewerActionUnlock": "Déverrouiller la visionneuse", + "settingsAskEverytime": "Demander chaque fois", + "settingsVideoPlaybackTile": "Lecture", + "settingsVideoPlaybackPageTitle": "Lecture", + "settingsVideoResumptionModeDialogTitle": "Reprise de lecture", + "settingsVideoResumptionModeTile": "Reprise de lecture", + "tagEditorDiscardDialogMessage": "Voulez-vous ignorer les changements ?", + "maxBrightnessNever": "Jamais", + "maxBrightnessAlways": "Toujours", + "videoResumptionModeNever": "Jamais", + "videoResumptionModeAlways": "Toujours", + "exportEntryDialogQuality": "Qualité", + "saveCopyButtonLabel": "ENREGISTRER UNE COPIE", + "applyTooltip": "Appliquer", + "editorActionTransform": "Transformation", + "editorTransformCrop": "Recadrage", + "editorTransformRotate": "Rotation", + "cropAspectRatioSquare": "Carré", + "cropAspectRatioFree": "Personnalisé", + "cropAspectRatioOriginal": "Photo d’origine", + "widgetTapUpdateWidget": "Mettre à jour le widget", + "aboutDataUsageDatabase": "Base de données", + "aboutDataUsageMisc": "Divers", + "aboutDataUsageInternal": "Interne", + "aboutDataUsageExternal": "Externe", + "aboutDataUsageSectionTitle": "Espace utilisé", + "aboutDataUsageData": "Données", + "aboutDataUsageCache": "Cache", + "overlayHistogramRGB": "RVB", + "overlayHistogramLuminance": "Luminance", + "settingsViewerShowHistogram": "Afficher l’histogramme", + "overlayHistogramNone": "Aucun", + "aboutDataUsageClearCache": "Vider le cache", + "entryActionCast": "Caster", + "castDialogTitle": "Appareils", + "collectionActionSetHome": "Définir comme page d’accueil", + "settingsThumbnailShowHdrIcon": "Afficher l’icône HDR", + "videoRepeatActionSetEnd": "Définir la fin", + "stopTooltip": "Arrêter", + "videoActionABRepeat": "Lecture répétée A-B", + "videoRepeatActionSetStart": "Définir le début", + "renameProcessorHash": "Hash", + "settingsForceWesternArabicNumeralsTile": "Toujours utiliser les chiffres arabes", + "chipActionShowCollection": "Afficher dans Collection", + "explorerPageTitle": "Explorateur", + "chipActionGoToExplorerPage": "Afficher dans Explorateur", + "setHomeCustom": "Personnalisé", + "explorerActionSelectStorageVolume": "Choisir le stockage", + "selectStorageVolumeDialogTitle": "Volumes de stockage", + "sortByDuration": "par durée", + "sortOrderShortestFirst": "Plus courts d’abord", + "sortOrderLongestFirst": "Plus longs d’abord", + "mapStyleOpenTopoMap": "OpenTopoMap", + "mapStyleOsmLiberty": "OSM Liberty", + "mapAttributionOsmLiberty": "Fond de carte par [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hébergé par [OSM Americana](https://tile.ourmap.us)", + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Fond de carte par [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "mapAttributionOsmData": "Données © les contributeurs d’[OpenStreetMap](https://www.openstreetmap.org/copyright)", + "videoActionShowNextFrame": "Montrer l’image suivante", + "videoActionShowPreviousFrame": "Montrer l’image précédente", + "newAlbumDialogAlbumAlreadyExistsHelper": "L’album existe déjà", + "chipActionRemove": "Retirer", + "albumTierDynamic": "Dynamique", + "newDynamicAlbumDialogTitle": "Nouvel album dynamique", + "dynamicAlbumAlreadyExists": "L’album dynamique existe déjà", + "appExportDynamicAlbums": "Albums dynamiques", + "collectionActionAddDynamicAlbum": "Ajouter un album dynamique", + "chipActionDecompose": "Scinder", + "coordinateFormatDdm": "DDM", + "editEntryLocationDialogTimeShift": "Décalage temporel", + "editEntryLocationDialogImportGpx": "Importer un fichier GPX", + "removeEntryMetadataDialogAll": "Tout", + "sortByPath": "par chemin", + "searchFormatSectionTitle": "Formats", + "chipActionGroup": "Modifier groupement", + "createButtonLabel": "CRÉER", + "chipActionCreateGroup": "Créer un groupe", + "newGroupDialogTitle": "Nouveau groupe", + "groupAlreadyExists": "Le groupe existe déjà", + "groupEmpty": "Aucun groupe", + "groupPickerUseThisGroupButton": "Utiliser ce groupe", + "groupPickerTitle": "Sélection", + "ungrouped": "Non groupé", + "sectionNone": "Aucune section", + "newGroupDialogNameLabel": "Nom du groupe", + "albumTierGroups": "Groupes", + "mapStyleDialogAddStyle": "Ajouter un style", + "mapStyleEditorDialogName": "Nom", + "mapStyleEditorDialogUrl": "URL", + "mapStyleEditorDialogSubdomains": "Sous-domaines", + "mapStyleEditorDialogUserAgent": "User-Agent", + "settingsNavigationBottomActionEditorBanner": "Maintenez votre doigt appuyé pour déplacer les boutons et sélectionner les actions à afficher dans la barre de navigation inférieure.", + "settingsNavigationBottomActionsTile": "Barre de navigation inférieure", + "settingsNavigationBottomActionEditorPageTitle": "Barre de navigation inférieure", + "tagPickPageTitle": "Sélection", + "settingsViewerShowZoomLevel": "Afficher le niveau de zoom", + "settingsEnabled": "Activé", + "settingsForced": "Forcé" +} diff --git a/lib/l10n/app_gl.arb b/lib/l10n/app_gl.arb new file mode 100644 index 0000000..ebfae7e --- /dev/null +++ b/lib/l10n/app_gl.arb @@ -0,0 +1,1664 @@ +{ + "entryActionConvert": "Converter", + "@entryActionConvert": {}, + "entryActionExport": "Exportar", + "@entryActionExport": {}, + "entryActionRotateCCW": "Xirar no sentido antihorario", + "@entryActionRotateCCW": {}, + "entryActionInfo": "Información", + "@entryActionInfo": {}, + "entryActionRename": "Cambiar o nome", + "@entryActionRename": {}, + "chipActionCreateAlbum": "Crear álbum", + "@chipActionCreateAlbum": {}, + "entryActionDelete": "Eliminar", + "@entryActionDelete": {}, + "entryActionCopyToClipboard": "Copiar ao portapapeis", + "@entryActionCopyToClipboard": {}, + "entryActionRestore": "Restaurar", + "@entryActionRestore": {}, + "entryActionRotateCW": "Xirar no sentido horario", + "@entryActionRotateCW": {}, + "entryActionFlip": "Voltear horizontalmente", + "@entryActionFlip": {}, + "entryActionPrint": "Imprimir", + "@entryActionPrint": {}, + "entryActionViewSource": "Ver fonte", + "@entryActionViewSource": {}, + "entryActionShare": "Compartir", + "@entryActionShare": {}, + "entryActionShowGeoTiffOnMap": "Amosar como superposición de mapa", + "@entryActionShowGeoTiffOnMap": {}, + "filterNoTitleLabel": "Sen título", + "@filterNoTitleLabel": {}, + "entryActionConvertMotionPhotoToStillImage": "Converter a imaxe fixa", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Abrir vídeo", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Editar", + "@entryActionEdit": {}, + "entryInfoActionEditLocation": "Editar localización", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTags": "Editar etiquetas", + "@entryInfoActionEditTags": {}, + "filterRecentlyAddedLabel": "Engadido recentemente", + "@filterRecentlyAddedLabel": {}, + "filterTypeSphericalVideoLabel": "Vídeo 360°", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeMotionPhotoLabel": "Foto en movemento", + "@filterTypeMotionPhotoLabel": {}, + "filterMimeImageLabel": "Imaxe", + "@filterMimeImageLabel": {}, + "welcomeOptional": "Opcional", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Acepto os termos e condicións", + "@welcomeTermsToggle": {}, + "nextButtonLabel": "SEGUINTE", + "@nextButtonLabel": {}, + "showButtonLabel": "AMOSAR", + "@showButtonLabel": {}, + "hideButtonLabel": "AGOCHAR", + "@hideButtonLabel": {}, + "continueButtonLabel": "PROSEGUIR", + "@continueButtonLabel": {}, + "cancelTooltip": "Cancelar", + "@cancelTooltip": {}, + "sourceStateLocatingCountries": "Localizando países", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Localizando lugares", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Eliminar", + "@chipActionDelete": {}, + "chipActionGoToTagPage": "Amosar en etiquetas", + "@chipActionGoToTagPage": {}, + "chipActionGoToCountryPage": "Amosar en países", + "@chipActionGoToCountryPage": {}, + "chipActionGoToAlbumPage": "Amosar en álbums", + "@chipActionGoToAlbumPage": {}, + "chipActionFilterOut": "Excluír", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Incluír", + "@chipActionFilterIn": {}, + "chipActionHide": "Agochar", + "@chipActionHide": {}, + "chipActionPin": "Fixar na parte superior", + "@chipActionPin": {}, + "chipActionUnpin": "Desbloquear dende arriba", + "@chipActionUnpin": {}, + "chipActionRename": "Cambiar o nome", + "@chipActionRename": {}, + "chipActionSetCover": "Definir cuberta", + "@chipActionSetCover": {}, + "entryActionOpen": "Abrir con", + "@entryActionOpen": {}, + "entryActionSetAs": "Definir como", + "@entryActionSetAs": {}, + "entryActionOpenMap": "Amosar na aplicación de mapas", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Rotar pantalla", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Engadir a favoritos", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Eliminar dos favoritos", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Cadro de captura", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Silenciar", + "@videoActionMute": {}, + "videoActionUnmute": "Activar son", + "@videoActionUnmute": {}, + "videoActionPause": "Pausa", + "@videoActionPause": {}, + "videoActionPlay": "Reproducir", + "@videoActionPlay": {}, + "videoActionReplay10": "Cear 10 segundos", + "@videoActionReplay10": {}, + "videoActionSkip10": "Avanzar 10 segundos", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Seleccionar pistas", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Velocidade de reprodución", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "Configuración", + "@viewerActionSettings": {}, + "slideshowActionResume": "Retomar", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Amosar na colección", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Editar data e hora", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditTitleDescription": "Editar título e descrición", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Editar valoración", + "@entryInfoActionEditRating": {}, + "entryInfoActionRemoveMetadata": "Eliminar metadatos", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "Lixo", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Favorito", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Sen data", + "@filterNoDateLabel": {}, + "filterNoLocationLabel": "Sen localizar", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Sen clasificar", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Sen etiquetar", + "@filterNoTagLabel": {}, + "filterOnThisDayLabel": "Neste día", + "@filterOnThisDayLabel": {}, + "filterRatingRejectedLabel": "Rexeitado", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Animado", + "@filterTypeAnimatedLabel": {}, + "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeVideoLabel": "Vídeo", + "@filterMimeVideoLabel": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (acuarela)", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyRename": "Trocar nome", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Trocar", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Saltar", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "Nunca", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "Só páxina do visor", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Sempre", + "@keepScreenOnAlways": {}, + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Benvido a Aves", + "@welcomeMessage": {}, + "itemCount": "{count, plural, =1{{count} elemento} other{{count} elementos}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeSeconds": "{count, plural, =1{{count} segundo} other{{count} segundos}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "timeMinutes": "{count, plural, =1{{count} minuto} other{{count} minutos}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "timeDays": "{count, plural, =1{{count} día} other{{count} días}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "applyButtonLabel": "APLICAR", + "@applyButtonLabel": {}, + "deleteButtonLabel": "ELIMINAR", + "@deleteButtonLabel": {}, + "changeTooltip": "Trocar", + "@changeTooltip": {}, + "clearTooltip": "Limpar", + "@clearTooltip": {}, + "previousTooltip": "Anterior", + "@previousTooltip": {}, + "saveTooltip": "Gardar", + "@saveTooltip": {}, + "nextTooltip": "Seguinte", + "@nextTooltip": {}, + "showTooltip": "Amosar", + "@showTooltip": {}, + "hideTooltip": "Agochar", + "@hideTooltip": {}, + "resetTooltip": "Restituír", + "@resetTooltip": {}, + "doNotAskAgain": "Non preguntar de novo", + "@doNotAskAgain": {}, + "actionRemove": "Retirar", + "@actionRemove": {}, + "pickTooltip": "Escoller", + "@pickTooltip": {}, + "sourceStateCataloguing": "Catalogando", + "@sourceStateCataloguing": {}, + "doubleBackExitMessage": "Prema «atrás» de novo para saír.", + "@doubleBackExitMessage": {}, + "sourceStateLoading": "Cargando", + "@sourceStateLoading": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Graos decimais", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "mapStyleGoogleTerrain": "Google Maps (Terreo)", + "@mapStyleGoogleTerrain": {}, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "L", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "O", + "@coordinateDmsWest": {}, + "unitSystemMetric": "Métrico", + "@unitSystemMetric": {}, + "unitSystemImperial": "Imperial", + "@unitSystemImperial": {}, + "videoLoopModeNever": "Nunca", + "@videoLoopModeNever": {}, + "videoLoopModeAlways": "Sempre", + "@videoLoopModeAlways": {}, + "videoControlsPlayOutside": "Abrir con outro reproductor", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "videoLoopModeShortOnly": "Só vídeos curtos", + "@videoLoopModeShortOnly": {}, + "mapStyleGoogleHybrid": "Google Maps (Híbrido)", + "@mapStyleGoogleHybrid": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "chipActionShowCollection": "Amosar na colección", + "@chipActionShowCollection": {}, + "chipActionLock": "Bloquear", + "@chipActionLock": {}, + "chipActionCreateVault": "Crear cofre", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "Configurar cofre", + "@chipActionConfigureVault": {}, + "entryActionShareVideoOnly": "Só compartir vídeo", + "@entryActionShareVideoOnly": {}, + "saveCopyButtonLabel": "GARDAR COPIA", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Aplicar", + "@applyTooltip": {}, + "chipActionGoToPlacePage": "Amosar en lugares", + "@chipActionGoToPlacePage": {}, + "viewerActionLock": "Bloquear visor", + "@viewerActionLock": {}, + "viewerActionUnlock": "Desbloquear visor", + "@viewerActionUnlock": {}, + "editorActionTransform": "Transformar", + "@editorActionTransform": {}, + "filterTaggedLabel": "Etiquetado", + "@filterTaggedLabel": {}, + "columnCount": "{count, plural, =1{{count} columna} other{{count} columnas}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "entryActionShareImageOnly": "Só compartir imaxe", + "@entryActionShareImageOnly": {}, + "videoActionShowNextFrame": "Amosar fotograma seguinte", + "@videoActionShowNextFrame": {}, + "videoActionShowPreviousFrame": "Amosar fotograma anterior", + "@videoActionShowPreviousFrame": {}, + "entryInfoActionExportMetadata": "Exportar metadatos", + "@entryInfoActionExportMetadata": {}, + "filterAspectRatioLandscapeLabel": "Paisaxe", + "@filterAspectRatioLandscapeLabel": {}, + "albumTierNew": "Novo", + "@albumTierNew": {}, + "chipActionDecompose": "Separar", + "@chipActionDecompose": {}, + "chipActionShowCountryStates": "Amosar estados", + "@chipActionShowCountryStates": {}, + "entryActionCast": "Transmitir", + "@entryActionCast": {}, + "videoRepeatActionSetStart": "Definir inicio", + "@videoRepeatActionSetStart": {}, + "videoActionABRepeat": "Repetir A-B", + "@videoActionABRepeat": {}, + "entryInfoActionRemoveLocation": "Retirar localización", + "@entryInfoActionRemoveLocation": {}, + "filterAspectRatioPortraitLabel": "Retrato", + "@filterAspectRatioPortraitLabel": {}, + "filterNoAddressLabel": "Sen enderezo", + "@filterNoAddressLabel": {}, + "filterLocatedLabel": "Localizado", + "@filterLocatedLabel": {}, + "accessibilityAnimationsKeep": "Manter efectos de pantalla", + "@accessibilityAnimationsKeep": {}, + "chipActionRemove": "Retirar", + "@chipActionRemove": {}, + "accessibilityAnimationsRemove": "Evitar efectos de pantalla", + "@accessibilityAnimationsRemove": {}, + "stopTooltip": "Deter", + "@stopTooltip": {}, + "chipActionGoToExplorerPage": "Amosar no explorador", + "@chipActionGoToExplorerPage": {}, + "videoRepeatActionSetEnd": "Definir final", + "@videoRepeatActionSetEnd": {}, + "editorTransformCrop": "Recortar", + "@editorTransformCrop": {}, + "editorTransformRotate": "Xirar", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Libre", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Orixinal", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Cadrado", + "@cropAspectRatioSquare": {}, + "viewerTransitionSlide": "Diapositiva", + "@viewerTransitionSlide": {}, + "albumTierRegular": "Outros", + "@albumTierRegular": {}, + "exportEntryDialogHeight": "Alto", + "@exportEntryDialogHeight": {}, + "albumTierPinned": "Fixado", + "@albumTierPinned": {}, + "settingsVideoEnablePip": "Imaxe-en-imaxe", + "@settingsVideoEnablePip": {}, + "wallpaperTargetLock": "Pantalla de bloqueo", + "@wallpaperTargetLock": {}, + "newVaultDialogTitle": "Novo cofre", + "@newVaultDialogTitle": {}, + "displayRefreshRatePreferHighest": "Taxa máis alta", + "@displayRefreshRatePreferHighest": {}, + "patternDialogConfirm": "Confirmar padrón", + "@patternDialogConfirm": {}, + "subtitlePositionTop": "Parte superior", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "Fondo", + "@subtitlePositionBottom": {}, + "newAlbumDialogNameLabel": "Nome do álbum", + "@newAlbumDialogNameLabel": {}, + "removeEntryMetadataDialogTitle": "Supresión de metadatos", + "@removeEntryMetadataDialogTitle": {}, + "addShortcutDialogLabel": "Etiqueta do atallo", + "@addShortcutDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Xa existe o directorio", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "editEntryDateDialogCopyField": "Copiar dende outra data", + "@editEntryDateDialogCopyField": {}, + "durationDialogHours": "Horas", + "@durationDialogHours": {}, + "editEntryLocationDialogImportGpx": "Importar GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogLatitude": "Latitude", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogTimeShift": "Cambio de tempo", + "@editEntryLocationDialogTimeShift": {}, + "genericFailureFeedback": "Fallou", + "@genericFailureFeedback": {}, + "tooManyItemsErrorDialogMessage": "Tente de novo con menos elementos.", + "@tooManyItemsErrorDialogMessage": {}, + "menuActionConfigureView": "Vista", + "@menuActionConfigureView": {}, + "rootDirectoryDescription": "directorio raiz", + "@rootDirectoryDescription": {}, + "themeBrightnessLight": "Claro", + "@themeBrightnessLight": {}, + "renameEntrySetPageTitle": "Trocar nome", + "@renameEntrySetPageTitle": {}, + "durationDialogSeconds": "Segundos", + "@durationDialogSeconds": {}, + "exportEntryDialogQuality": "Calidade", + "@exportEntryDialogQuality": {}, + "editEntryDateDialogTitle": "Data e hora", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Definir data personalizada", + "@editEntryDateDialogSetCustom": {}, + "locationPickerUseThisLocationButton": "Usar esta localización", + "@locationPickerUseThisLocationButton": {}, + "durationDialogMinutes": "Minutos", + "@durationDialogMinutes": {}, + "overlayHistogramNone": "Ningún", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "noMatchingAppDialogMessage": "Non hai aplicacións que poidan manexar isto.", + "@noMatchingAppDialogMessage": {}, + "videoResumeButtonLabel": "RETOMAR", + "@videoResumeButtonLabel": {}, + "editEntryDateDialogExtractFromTitle": "Extraer do título", + "@editEntryDateDialogExtractFromTitle": {}, + "albumTierVaults": "Cofres", + "@albumTierVaults": {}, + "pinDialogConfirm": "Confirmar PIN", + "@pinDialogConfirm": {}, + "authenticateToConfigureVault": "Autenticarse para configurar o cofre", + "@authenticateToConfigureVault": {}, + "albumTierSpecial": "Común", + "@albumTierSpecial": {}, + "albumTierDynamic": "Dinámico", + "@albumTierDynamic": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "videoPlaybackSkip": "Saltar", + "@videoPlaybackSkip": {}, + "viewerTransitionParallax": "Paralaxe", + "@viewerTransitionParallax": {}, + "viewerTransitionNone": "Ningún", + "@viewerTransitionNone": {}, + "viewerTransitionZoomIn": "Achegar", + "@viewerTransitionZoomIn": {}, + "wallpaperTargetHomeLock": "Pantallas de inicio e bloqueo", + "@wallpaperTargetHomeLock": {}, + "otherDirectoryDescription": "directorio «{name}»", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "setCoverDialogLatest": "Último elemento", + "@setCoverDialogLatest": {}, + "dynamicAlbumAlreadyExists": "Xa existe o álbum dinámico", + "@dynamicAlbumAlreadyExists": {}, + "newDynamicAlbumDialogTitle": "Novo álbum dinámico", + "@newDynamicAlbumDialogTitle": {}, + "renameProcessorHash": "Hash", + "@renameProcessorHash": {}, + "exportEntryDialogWriteMetadata": "Escribir metadatos", + "@exportEntryDialogWriteMetadata": {}, + "editEntryDateDialogShift": "Mover", + "@editEntryDateDialogShift": {}, + "editEntryLocationDialogChooseOnMap": "Escoller no mapa", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryDateDialogSourceFileModifiedDate": "Data de modificación do arquivo", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "videoStreamSelectionDialogAudio": "Audio", + "@videoStreamSelectionDialogAudio": {}, + "menuActionSelectNone": "Non escolmar ningún", + "@menuActionSelectNone": {}, + "menuActionMap": "Mapa", + "@menuActionMap": {}, + "videoSpeedDialogLabel": "Velocidade de reproducción", + "@videoSpeedDialogLabel": {}, + "widgetOpenPageHome": "Abrir inicio", + "@widgetOpenPageHome": {}, + "nameConflictDialogSingleSourceMessage": "Algúns arquivos do directorio de destiño teñen o mesmo nome.", + "@nameConflictDialogSingleSourceMessage": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "keepScreenOnVideoPlayback": "Durante a reproducción de vídeo", + "@keepScreenOnVideoPlayback": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "overlayHistogramLuminance": "Luminancia", + "@overlayHistogramLuminance": {}, + "themeBrightnessDark": "Escuro", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Negro", + "@themeBrightnessBlack": {}, + "vaultLockTypePattern": "Padrón", + "@vaultLockTypePattern": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "viewerTransitionFade": "Esvaecer", + "@viewerTransitionFade": {}, + "storageVolumeDescriptionFallbackNonPrimary": "Tarxeta SD", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "missingSystemFilePickerDialogMessage": "O selector de arquivos falta ou está desactivado. Por favor, actíveo e tente de novo.", + "@missingSystemFilePickerDialogMessage": {}, + "setCoverDialogAuto": "Auto", + "@setCoverDialogAuto": {}, + "restrictedAccessDialogMessage": "Esta apliación non ten permiso para modificar arquivos no {directory} de «{volume}».\n\nPor favor, empregue un xestor de arquivos ou galería preinstalados para mover os elementos a outro directorio.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "newAlbumDialogTitle": "Novo álbum", + "@newAlbumDialogTitle": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Xa existe o álbum", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Xa existe o directorio", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "vaultDialogLockModeWhenScreenOff": "Bloquear ao se apagar a pantalla", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "Tipo de bloqueo", + "@vaultDialogLockTypeLabel": {}, + "pinDialogEnter": "Inserir PIN", + "@pinDialogEnter": {}, + "vaultBinUsageDialogMessage": "Algúns cofres están a utilizar o lixo.", + "@vaultBinUsageDialogMessage": {}, + "renameEntrySetPageInsertTooltip": "Inserir campo", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntryDialogLabel": "Nome novo", + "@renameEntryDialogLabel": {}, + "editEntryDialogCopyFromItem": "Copiar dende outro elemento", + "@editEntryDialogCopyFromItem": {}, + "editEntryDialogTargetFieldsHeader": "Campos a modificar", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryLocationDialogLongitude": "Lonxitude", + "@editEntryLocationDialogLongitude": {}, + "editEntryRatingDialogTitle": "Valoración", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogMore": "Máis", + "@removeEntryMetadataDialogMore": {}, + "videoStreamSelectionDialogVideo": "Vídeo", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogOff": "Desactivado", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogText": "Subtítulos", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogTrack": "Pista", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "Non hai outras pistas.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "Feito!", + "@genericSuccessFeedback": {}, + "genericDangerWarningDialogMessage": "Está certo?", + "@genericDangerWarningDialogMessage": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "moveUndatedConfirmationDialogSetDate": "Gardar datas", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Desexa continuar a reproducción dende {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "patternDialogEnter": "Inserir padrón", + "@patternDialogEnter": {}, + "menuActionSelect": "Escolmar", + "@menuActionSelect": {}, + "menuActionSelectAll": "Escolmar todo", + "@menuActionSelectAll": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "videoPlaybackWithSound": "Reproducir con son", + "@videoPlaybackWithSound": {}, + "videoResumptionModeAlways": "Sempre", + "@videoResumptionModeAlways": {}, + "widgetOpenPageCollection": "Abrir colección", + "@widgetOpenPageCollection": {}, + "notEnoughSpaceDialogMessage": "Esta operación precisa {neededSize} de espazo libre en «{volume}» para se completar, pero só hai {freeSize} dispoñible.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "videoStartOverButtonLabel": "RECOMEZAR", + "@videoStartOverButtonLabel": {}, + "wallpaperTargetHome": "Pantalla de inicio", + "@wallpaperTargetHome": {}, + "widgetOpenPageViewer": "Abrir visor", + "@widgetOpenPageViewer": {}, + "storageAccessDialogMessage": "Por favor, seleccione o {directory} de «{volume}» na seguinte pantalla para lle fornecer acceso a esta aplicación.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "renameEntrySetPagePreviewSectionTitle": "Vista previa", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Contador", + "@renameProcessorCounter": {}, + "renameProcessorName": "Nome", + "@renameProcessorName": {}, + "exportEntryDialogWidth": "Largo", + "@exportEntryDialogWidth": {}, + "maxBrightnessNever": "Nunca", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "Sempre", + "@maxBrightnessAlways": {}, + "setCoverDialogCustom": "Personalizado", + "@setCoverDialogCustom": {}, + "authenticateToUnlockVault": "Autenticarse para despechar cofre", + "@authenticateToUnlockVault": {}, + "renameEntrySetPagePatternFieldLabel": "Padrón de nomeamento", + "@renameEntrySetPagePatternFieldLabel": {}, + "exportEntryDialogFormat": "Formato:", + "@exportEntryDialogFormat": {}, + "removeEntryMetadataDialogAll": "Todo", + "@removeEntryMetadataDialogAll": {}, + "vaultLockTypePassword": "Contrasinal", + "@vaultLockTypePassword": {}, + "addShortcutButtonLabel": "ENGADIR", + "@addShortcutButtonLabel": {}, + "configureVaultDialogTitle": "Configurar cofre", + "@configureVaultDialogTitle": {}, + "newAlbumDialogStorageLabel": "Almacenaxe:", + "@newAlbumDialogStorageLabel": {}, + "videoPlaybackMuted": "Reproducir sen son", + "@videoPlaybackMuted": {}, + "videoResumptionModeNever": "Nunca", + "@videoResumptionModeNever": {}, + "widgetTapUpdateWidget": "Actualizar widget", + "@widgetTapUpdateWidget": {}, + "storageVolumeDescriptionFallbackPrimary": "Almacenaxe interna", + "@storageVolumeDescriptionFallbackPrimary": {}, + "nameConflictDialogMultipleSourceMessage": "Algúns arquivos teñen o mesmo nome.", + "@nameConflictDialogMultipleSourceMessage": {}, + "moveUndatedConfirmationDialogMessage": "Gardar as datas dos elementos antes de continuar?", + "@moveUndatedConfirmationDialogMessage": {}, + "passwordDialogEnter": "Inserir contrasinal", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Confirmar contrasinal", + "@passwordDialogConfirm": {}, + "renameAlbumDialogLabel": "Nome novo", + "@renameAlbumDialogLabel": {}, + "displayRefreshRatePreferLowest": "Taxa máis baixa", + "@displayRefreshRatePreferLowest": {}, + "albumTierApps": "Aplicacións", + "@albumTierApps": {}, + "widgetDisplayedItemMostRecent": "Máis recente", + "@widgetDisplayedItemMostRecent": {}, + "widgetDisplayedItemRandom": "Aleatorio", + "@widgetDisplayedItemRandom": {}, + "editEntryLocationDialogSetCustom": "Establecer localización personalizada", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogTitle": "Localización", + "@editEntryLocationDialogTitle": {}, + "collectionActionMove": "Mover a álbum", + "@collectionActionMove": {}, + "aboutCreditsSectionTitle": "Créditos", + "@aboutCreditsSectionTitle": {}, + "searchTagsSectionTitle": "Etiquetas", + "@searchTagsSectionTitle": {}, + "aboutBugCopyInfoButton": "Copiar", + "@aboutBugCopyInfoButton": {}, + "statePageTitle": "Estados", + "@statePageTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Plugins de Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "drawerAlbumPage": "Álbums", + "@drawerAlbumPage": {}, + "aboutLinkLicense": "Licenza", + "@aboutLinkLicense": {}, + "collectionActionCopy": "Copiar a álbum", + "@collectionActionCopy": {}, + "albumScreenRecordings": "Gravacións de pantalla", + "@albumScreenRecordings": {}, + "searchRecentSectionTitle": "Recente", + "@searchRecentSectionTitle": {}, + "aboutCreditsWorldAtlas2": "baixo licenza ISC.", + "@aboutCreditsWorldAtlas2": {}, + "sectionUnknown": "Descoñecido", + "@sectionUnknown": {}, + "collectionSelectPageTitle": "Escolmar elementos", + "@collectionSelectPageTitle": {}, + "collectionSelectSectionTooltip": "Escolmar sección", + "@collectionSelectSectionTooltip": {}, + "drawerCollectionAll": "Toda a colección", + "@drawerCollectionAll": {}, + "drawerCollectionMotionPhotos": "Fotos en movemento", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "Panoramas", + "@drawerCollectionPanoramas": {}, + "sortOrderShortestFirst": "Máis curtos primeiro", + "@sortOrderShortestFirst": {}, + "albumMimeTypeMixed": "Mesturado", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleMove": "Mover a álbum", + "@albumPickPageTitleMove": {}, + "albumScreenshots": "Capturas de pantalla", + "@albumScreenshots": {}, + "countryEmpty": "Sen países", + "@countryEmpty": {}, + "explorerActionSelectStorageVolume": "Escolmar almacenaxe", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "Escolmar almacenaxe", + "@selectStorageVolumeDialogTitle": {}, + "collectionPickPageTitle": "Escolmar", + "@collectionPickPageTitle": {}, + "collectionEmptyGrantAccessButtonLabel": "Dar acceso", + "@collectionEmptyGrantAccessButtonLabel": {}, + "drawerCollectionImages": "Imaxes", + "@drawerCollectionImages": {}, + "searchMetadataSectionTitle": "Metadatos", + "@searchMetadataSectionTitle": {}, + "searchRatingSectionTitle": "Valoracións", + "@searchRatingSectionTitle": {}, + "collectionActionSetHome": "Fixar como inicio", + "@collectionActionSetHome": {}, + "drawerCollectionFavourites": "Favoritos", + "@drawerCollectionFavourites": {}, + "drawerCollectionVideos": "Vídeos", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "Animacións", + "@drawerCollectionAnimated": {}, + "createAlbumButtonLabel": "CREAR", + "@createAlbumButtonLabel": {}, + "aboutBugCopyInfoInstruction": "Copiar a información do sistema", + "@aboutBugCopyInfoInstruction": {}, + "coverDialogTabApp": "Aplicación", + "@coverDialogTabApp": {}, + "appPickDialogNone": "Ningún", + "@appPickDialogNone": {}, + "aboutPageTitle": "Verbo de", + "@aboutPageTitle": {}, + "aboutLinkPolicy": "Política de privacidade", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Informe de erros", + "@aboutBugSectionTitle": {}, + "aboutDataUsageData": "Datos", + "@aboutDataUsageData": {}, + "albumPageTitle": "Álbums", + "@albumPageTitle": {}, + "tagEmpty": "Sen etiquetas", + "@tagEmpty": {}, + "binPageTitle": "Lixo", + "@binPageTitle": {}, + "searchCollectionFieldHint": "Procurar en colección", + "@searchCollectionFieldHint": {}, + "settingsAskEverytime": "Preguntar sempre", + "@settingsAskEverytime": {}, + "placePageTitle": "Lugares", + "@placePageTitle": {}, + "collectionGroupAlbum": "Por álbum", + "@collectionGroupAlbum": {}, + "albumGroupTier": "Por nivel", + "@albumGroupTier": {}, + "albumVideoCaptures": "Capturas de vídeo", + "@albumVideoCaptures": {}, + "searchCountriesSectionTitle": "Países", + "@searchCountriesSectionTitle": {}, + "collectionActionEmptyBin": "Baleirar lixo", + "@collectionActionEmptyBin": {}, + "menuActionSlideshow": "Presentación", + "@menuActionSlideshow": {}, + "menuActionStats": "Estatísticas", + "@menuActionStats": {}, + "viewDialogGroupSectionTitle": "Seccións", + "@viewDialogGroupSectionTitle": {}, + "castDialogTitle": "Dispositivos de emisión", + "@castDialogTitle": {}, + "aboutDataUsageCache": "Caché", + "@aboutDataUsageCache": {}, + "aboutDataUsageDatabase": "Base de datos", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageMisc": "Varios", + "@aboutDataUsageMisc": {}, + "aboutTranslatorsSectionTitle": "Tradutores", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Amosar todas as licenzas", + "@aboutLicensesShowAllButtonLabel": {}, + "collectionActionShowTitleSearch": "Amosar filtro de título", + "@collectionActionShowTitleSearch": {}, + "collectionActionAddDynamicAlbum": "Engadir álbum dinámico", + "@collectionActionAddDynamicAlbum": {}, + "collectionActionRescan": "Ler de novo", + "@collectionActionRescan": {}, + "collectionActionEdit": "Editar", + "@collectionActionEdit": {}, + "dateToday": "Hoxe", + "@dateToday": {}, + "collectionEmptyImages": "Sen imaxes", + "@collectionEmptyImages": {}, + "dateThisMonth": "Este mes", + "@dateThisMonth": {}, + "drawerCollectionSphericalVideos": "Vídeos 360°", + "@drawerCollectionSphericalVideos": {}, + "drawerCountryPage": "Países", + "@drawerCountryPage": {}, + "drawerPlacePage": "Lugares", + "@drawerPlacePage": {}, + "sortByDate": "Por data", + "@sortByDate": {}, + "sortByName": "Por nome", + "@sortByName": {}, + "sortByItemCount": "Por número de elementos", + "@sortByItemCount": {}, + "sortBySize": "Por tamaño", + "@sortBySize": {}, + "sortByAlbumFileName": "Por nome de álbum e título", + "@sortByAlbumFileName": {}, + "sortByRating": "Por valoración", + "@sortByRating": {}, + "sortOrderOldestFirst": "Vellos primeiro", + "@sortOrderOldestFirst": {}, + "sortOrderLongestFirst": "Máis longos primeiro", + "@sortOrderLongestFirst": {}, + "sortOrderSmallestFirst": "Máis pequenos primeiro", + "@sortOrderSmallestFirst": {}, + "albumGroupVolume": "Por volume de almacenaxe", + "@albumGroupVolume": {}, + "albumPickPageTitleCopy": "Copiar a álbum", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Exportar a álbum", + "@albumPickPageTitleExport": {}, + "albumCamera": "Cámara", + "@albumCamera": {}, + "albumDownload": "Descargas", + "@albumDownload": {}, + "newFilterBanner": "novo", + "@newFilterBanner": {}, + "placeEmpty": "Sen lugares", + "@placeEmpty": {}, + "explorerPageTitle": "Explorador", + "@explorerPageTitle": {}, + "searchDateSectionTitle": "Data", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "Álbums", + "@searchAlbumsSectionTitle": {}, + "searchStatesSectionTitle": "Estados", + "@searchStatesSectionTitle": {}, + "searchPlacesSectionTitle": "Lugares", + "@searchPlacesSectionTitle": {}, + "settingsSystemDefault": "Sistema", + "@settingsSystemDefault": {}, + "settingsDefault": "Por defecto", + "@settingsDefault": {}, + "settingsDisabled": "Desactivado", + "@settingsDisabled": {}, + "countryPageTitle": "Países", + "@countryPageTitle": {}, + "albumEmpty": "Sen álbums", + "@albumEmpty": {}, + "viewDialogSortSectionTitle": "Ordenar", + "@viewDialogSortSectionTitle": {}, + "tileLayoutMosaic": "Mosaico", + "@tileLayoutMosaic": {}, + "tileLayoutList": "Lista", + "@tileLayoutList": {}, + "coverDialogTabColor": "Cor", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Escoller aplicación", + "@appPickDialogTitle": {}, + "aboutDataUsageSectionTitle": "Uso de datos", + "@aboutDataUsageSectionTitle": {}, + "dateYesterday": "Onte", + "@dateYesterday": {}, + "collectionEmptyFavourites": "Sen favoritos", + "@collectionEmptyFavourites": {}, + "collectionDeselectSectionTooltip": "Desescolmar sección", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "Verbo de", + "@drawerAboutButton": {}, + "drawerCollectionRaws": "Fotos Raw", + "@drawerCollectionRaws": {}, + "sortOrderZtoA": "Z ao A", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "Máis altos primeiro", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Máis baixos primeiro", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Máis grandes primeiro", + "@sortOrderLargestFirst": {}, + "stateEmpty": "Sen estados", + "@stateEmpty": {}, + "tagPageTitle": "Etiquetas", + "@tagPageTitle": {}, + "settingsPageTitle": "Axustes", + "@settingsPageTitle": {}, + "albumPickPageTitlePick": "Escolmar álbum", + "@albumPickPageTitlePick": {}, + "collectionEmptyVideos": "Sen vídeos", + "@collectionEmptyVideos": {}, + "aboutDataUsageInternal": "Interno", + "@aboutDataUsageInternal": {}, + "aboutDataUsageClearCache": "Limpar caché", + "@aboutDataUsageClearCache": {}, + "aboutBugSaveLogInstruction": "Gardar rexistros da aplicación nun arquivo", + "@aboutBugSaveLogInstruction": {}, + "aboutCreditsWorldAtlas1": "Esta apliación usa un arquivo TopoJSON de", + "@aboutCreditsWorldAtlas1": {}, + "aboutBugReportInstruction": "Informar en GitHub cos rexistros e información do sistema", + "@aboutBugReportInstruction": {}, + "aboutDataUsageExternal": "Externo", + "@aboutDataUsageExternal": {}, + "aboutLicensesBanner": "Esta aplicación usa os paquetes e bibliotecas de código aberto que seguen.", + "@aboutLicensesBanner": {}, + "collectionPageTitle": "Colección", + "@collectionPageTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Paquetes de Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "policyPageTitle": "Política de privacidade", + "@policyPageTitle": {}, + "collectionSearchTitlesHintText": "Procurar títulos", + "@collectionSearchTitlesHintText": {}, + "collectionGroupMonth": "Por mes", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Por día", + "@collectionGroupDay": {}, + "drawerSettingsButton": "Axustes", + "@drawerSettingsButton": {}, + "sortOrderNewestFirst": "Novos primeiro", + "@sortOrderNewestFirst": {}, + "sortByDuration": "Por duración", + "@sortByDuration": {}, + "sortOrderAtoZ": "A ao Z", + "@sortOrderAtoZ": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Bibliotecas de Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesSectionTitle": "Licenzas de código aberto", + "@aboutLicensesSectionTitle": {}, + "albumGroupType": "Por tipo", + "@albumGroupType": {}, + "aboutLicensesDartPackagesSectionTitle": "Paquetes de Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, + "collectionActionHideTitleSearch": "Agochar filtro de título", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Engadir atallo", + "@collectionActionAddShortcut": {}, + "viewDialogLayoutSectionTitle": "Disposición", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "Invertir ordenación", + "@viewDialogReverseSortOrder": {}, + "tileLayoutGrid": "Cuadrícula", + "@tileLayoutGrid": {}, + "coverDialogTabCover": "Cuberta", + "@coverDialogTabCover": {}, + "aboutBugReportButton": "Informar", + "@aboutBugReportButton": {}, + "drawerTagPage": "Etiquetas", + "@drawerTagPage": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Operación non soportada para elementos deste tipo: {types}.} other{Operación non soportada para elementos destes tipos: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Mover este elemento ao lixo?} other{Mover estes {count} elementos ao lixo?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Borrar este elemento?} other{Borrar estes {count} elementos?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "hideFilterConfirmationDialogMessage": "Agocharánse da súa colección as fotos e vídeos que concorden. Pódense amosar de novo dende os axustes de «Privacidade».\n\nEstá certo de querer agochalos?", + "@hideFilterConfirmationDialogMessage": {}, + "newVaultWarningDialogMessage": "Os elementos en cofres só están dispoñibles para esta aplicación.\n\nPerderanse ao desinstalala ou ao borrar os seus datos.", + "@newVaultWarningDialogMessage": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Eliminar estes álbums e os seus elementos?} other{Eliminar estes álbums e os seus {count} elementos?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Eliminar este álbum e o seu elemento?} other{Eliminar este álbum e os seus {count} elementos?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "settingsSearchEmpty": "Sen coincidencia", + "@settingsSearchEmpty": {}, + "settingsActionImport": "Importar", + "@settingsActionImport": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Preguntar antes de mover elementos sen data", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsActionImportDialogTitle": "Importar", + "@settingsActionImportDialogTitle": {}, + "settingsCollectionQuickActionTabSelecting": "Escolmando", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsConfirmationVaultDataLoss": "Amosar aviso de perda de datos en cofre", + "@settingsConfirmationVaultDataLoss": {}, + "settingsConfirmationTile": "Diálogos de confirmación", + "@settingsConfirmationTile": {}, + "settingsThumbnailShowLocationIcon": "Amosar icona de localización", + "@settingsThumbnailShowLocationIcon": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{Trocado o nome dun elemento} other{Trocado o nome de {count} elementos}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "settingsActionExport": "Exportar", + "@settingsActionExport": {}, + "settingsCollectionQuickActionsTile": "Accións rápidas", + "@settingsCollectionQuickActionsTile": {}, + "settingsConfirmationAfterMoveToBinItems": "Amosar mensaxe tras mover elementos ao lixo", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsThumbnailShowMotionPhotoIcon": "Amosar icona de foto en movemento", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Precísase XMP para reproducir a animación dunha foto en movemento.\n\nEstá certo de querer eliminalo?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "collectionEditFailureFeedback": "{count, plural, =1{Erro ao editar un elemento} other{Erro ao editar {count} elementos}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{Editado un elemento} other{Editados {count} elementos}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, =1{Copiado un elemento} other{Copiados {count} elementos}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "settingsModificationWarningDialogMessage": "Modificaranse outros axustes.", + "@settingsModificationWarningDialogMessage": {}, + "settingsSearchFieldLabel": "Procurar axustes", + "@settingsSearchFieldLabel": {}, + "settingsActionExportDialogTitle": "Exportar", + "@settingsActionExportDialogTitle": {}, + "appExportCovers": "Cubertas", + "@appExportCovers": {}, + "appExportDynamicAlbums": "Álbums dinámicos", + "@appExportDynamicAlbums": {}, + "appExportFavourites": "Favoritos", + "@appExportFavourites": {}, + "appExportSettings": "Axustes", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "Navegación", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Inicio", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Inicio", + "@settingsHomeDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Preguntar antes de borrar elementos para sempre", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "Preguntar antes de enviar elementos ao lixo", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsNavigationDrawerTabTypes": "Tipos", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerEditorPageTitle": "Menú de navegación", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerTabAlbums": "Álbums", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Páxinas", + "@settingsNavigationDrawerTabPages": {}, + "settingsThumbnailShowFavouriteIcon": "Amosar icona de favorito", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowRating": "Amosar valoración", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowTagIcon": "Amosar icona de etiqueta", + "@settingsThumbnailShowTagIcon": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{Erro ao trocar o nome dun elemento} other{Erro ao trocar o nome de {count} elementos}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{Movido un elemento} other{Movidos {count} elementos}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "settingsConfirmationDialogTitle": "Diálogos de confirmación", + "@settingsConfirmationDialogTitle": {}, + "settingsNavigationDrawerBanner": "Premer e manter para mover e reordenar elementos do menú.", + "@settingsNavigationDrawerBanner": {}, + "settingsThumbnailOverlayTile": "Superposición", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailShowHdrIcon": "Amosar icona de HDR", + "@settingsThumbnailShowHdrIcon": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Erro ao borrar un elemento} other{Erro ao borrar {count} elementos}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{Erro ao exportar unha páxina} other{Erro ao exportar {count} páxinas}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "settingsKeepScreenOnTile": "Manter pantalla acesa", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Manter pantalla acesa", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Premer «atrás» dúas veces para saír", + "@settingsDoubleBackExit": {}, + "settingsNavigationDrawerTile": "Menú de navegación", + "@settingsNavigationDrawerTile": {}, + "settingsThumbnailShowVideoDuration": "Amosar duración de vídeo", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionEditorPageTitle": "Accións rápidas", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{Erro ao copiar un elemento} other{Erro ao copiar {count} elementos}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{Erro ao mover un elemento} other{Erro ao mover {count} elementos}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "setHomeCustom": "Personalizado", + "@setHomeCustom": {}, + "settingsThumbnailOverlayPageTitle": "Superposición", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsNavigationDrawerAddAlbum": "Engadir álbum", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailShowRawIcon": "Amosar icona de RAW", + "@settingsThumbnailShowRawIcon": {}, + "settingsCollectionQuickActionTabBrowsing": "Navegando", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsThumbnailSectionTitle": "Miniaturas", + "@settingsThumbnailSectionTitle": {}, + "wallpaperUseScrollEffect": "Usar efecto de desprazamento en pantalla de inicio", + "@wallpaperUseScrollEffect": {}, + "settingsHiddenItemsTile": "Elementos ocultos", + "@settingsHiddenItemsTile": {}, + "settingsAllowMediaManagement": "Permitir xestión de medios", + "@settingsAllowMediaManagement": {}, + "mapPointNorthUpTooltip": "Apuntar o norte cara arriba", + "@mapPointNorthUpTooltip": {}, + "viewerInfoSearchSuggestionDate": "Data e hora", + "@viewerInfoSearchSuggestionDate": {}, + "settingsImageBackground": "Fondo de imaxe", + "@settingsImageBackground": {}, + "settingsViewerQuickActionEditorPageTitle": "Accións rápidas", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Botóns amosados", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsVideoPlaybackTile": "Reprodución", + "@settingsVideoPlaybackTile": {}, + "settingsVideoPlaybackPageTitle": "Reprodución", + "@settingsVideoPlaybackPageTitle": {}, + "settingsSubtitleThemePageTitle": "Subtítulos", + "@settingsSubtitleThemePageTitle": {}, + "settingsCollectionBurstPatternsNone": "Ningún", + "@settingsCollectionBurstPatternsNone": {}, + "settingsViewerQuickActionsTile": "Accións rápidas", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerShowDescription": "Amosar descrición", + "@settingsViewerShowDescription": {}, + "settingsSubtitleThemeTextAlignmentTile": "Aliñamento do texto", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Aliñamento do texto", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeBackgroundOpacity": "Opacidade do fondo", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsEnableBin": "Usar lixo", + "@settingsEnableBin": {}, + "viewerInfoSearchSuggestionRights": "Dereitos", + "@viewerInfoSearchSuggestionRights": {}, + "tagEditorPageNewTagFieldLabel": "Nova etiqueta", + "@tagEditorPageNewTagFieldLabel": {}, + "settingsViewerSectionTitle": "Visor", + "@settingsViewerSectionTitle": {}, + "settingsViewerShowInformation": "Amosar información", + "@settingsViewerShowInformation": {}, + "settingsViewerShowRatingTags": "Amosar valoración e etiquetas", + "@settingsViewerShowRatingTags": {}, + "settingsViewerSlideshowTile": "Presentación", + "@settingsViewerSlideshowTile": {}, + "statsPageTitle": "Estatísticas", + "@statsPageTitle": {}, + "settingsEnableBinSubtitle": "Mantén os elementos borrados por 30 días", + "@settingsEnableBinSubtitle": {}, + "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, + "settingsCoordinateFormatTile": "Formato de coordenadas", + "@settingsCoordinateFormatTile": {}, + "settingsUnitSystemTile": "Unidades", + "@settingsUnitSystemTile": {}, + "viewerInfoLabelPath": "Ruta", + "@viewerInfoLabelPath": {}, + "viewerInfoSearchFieldLabel": "Procurar metadatos", + "@viewerInfoSearchFieldLabel": {}, + "settingsLanguageSectionTitle": "Idioma e formatos", + "@settingsLanguageSectionTitle": {}, + "settingsDisablingBinWarningDialogMessage": "Os elementos no lixo borraranse para sempre.", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsSubtitleThemeTile": "Subtítulos", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemeTextSize": "Tamaño do texto", + "@settingsSubtitleThemeTextSize": {}, + "viewerInfoBackToViewerTooltip": "Tornar ao visor", + "@viewerInfoBackToViewerTooltip": {}, + "mapAttributionOsmHot": "Mosaicos de [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "tagEditorDiscardDialogMessage": "Quere descartar os cambios?", + "@tagEditorDiscardDialogMessage": {}, + "settingsViewerSlideshowPageTitle": "Presentación", + "@settingsViewerSlideshowPageTitle": {}, + "settingsVideoResumptionModeDialogTitle": "Retomar reprodución", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsVideoBackgroundMode": "Modo do fondo", + "@settingsVideoBackgroundMode": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Posición do texto", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Esquerda", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentRight": "Dereita", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsStorageAccessEmpty": "Sen permisos de acceso", + "@settingsStorageAccessEmpty": {}, + "settingsRemoveAnimationsTile": "Eliminar animacións", + "@settingsRemoveAnimationsTile": {}, + "settingsThemeColorHighlights": "Realces de cor", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Cor dinámica", + "@settingsThemeEnableDynamicColor": {}, + "settingsWidgetOpenPage": "Ao tocar no widget", + "@settingsWidgetOpenPage": {}, + "statsTopAlbumsSectionTitle": "Álbums principais", + "@statsTopAlbumsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "ABRIR PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "DEFINIR FONDO", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Epa!", + "@viewerErrorUnknown": {}, + "viewerInfoPageTitle": "Información", + "@viewerInfoPageTitle": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelSize": "Tamaño", + "@viewerInfoLabelSize": {}, + "mapStyleTooltip": "Seleccione estilo do mapa", + "@mapStyleTooltip": {}, + "viewerInfoLabelCoordinates": "Coordenadas", + "@viewerInfoLabelCoordinates": {}, + "mapStyleDialogTitle": "Estilo do mapa", + "@mapStyleDialogTitle": {}, + "mapEmptyRegion": "Sen imaxes nesta rexión", + "@mapEmptyRegion": {}, + "tagEditorSectionRecent": "Recente", + "@tagEditorSectionRecent": {}, + "tagPlaceholderPlace": "Lugar", + "@tagPlaceholderPlace": {}, + "viewerInfoLabelAddress": "Enderezo", + "@viewerInfoLabelAddress": {}, + "settingsVideoPageTitle": "Axustes de vídeo", + "@settingsVideoPageTitle": {}, + "settingsSubtitleThemeSample": "Este é un exemplo.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextOpacity": "Opacidade do texto", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsAllowInstalledAppAccessSubtitle": "Usado para mellorar a visualización dos álbums", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "Permitir informes de erros anónimos", + "@settingsAllowErrorReporting": {}, + "settingsDisplaySectionTitle": "Pantalla", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, + "statsTopPlacesSectionTitle": "Lugares principais", + "@statsTopPlacesSectionTitle": {}, + "viewerInfoLabelDate": "Data", + "@viewerInfoLabelDate": {}, + "mapZoomOutTooltip": "Afastar", + "@mapZoomOutTooltip": {}, + "viewerInfoSearchEmpty": "Sen claves concordantes", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDimensions": "Dimensións", + "@viewerInfoSearchSuggestionDimensions": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Prema e manteña para mover botóns e escoller que accións se amosarán ao navegar polo elementos.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Centro", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsRemoveAnimationsDialogTitle": "Eliminar animacións", + "@settingsRemoveAnimationsDialogTitle": {}, + "tagEditorPageAddTagTooltip": "Engadir etiqueta", + "@tagEditorPageAddTagTooltip": {}, + "settingsViewerShowOverlayOnOpening": "Amosar ao abrir", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsSlideshowShuffle": "Barallar", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowAnimatedZoomEffect": "Efecto de zoom animado", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowVideoPlaybackTile": "Reprodución de vídeo", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Reprodución de vídeo", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Dobre toque para reproducir/pausar", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoShowVideos": "Amosar vídeos", + "@settingsVideoShowVideos": {}, + "settingsVideoEnableHardwareAcceleration": "Aceleración por hardware", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Esvarar para riba ou para abaixo para axustar brillo/volume", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsSubtitleThemeTextPositionTile": "Posición do texto", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSaveSearchHistory": "Gardar historial de procura", + "@settingsSaveSearchHistory": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Amosar alternativas de xestos multitoque", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsDisplayRefreshRateModeTile": "Taxa de refresco da pantalla", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Taxa de refresco", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsDisplayUseTvInterface": "Interface Android TV", + "@settingsDisplayUseTvInterface": {}, + "settingsLanguageTile": "Idioma", + "@settingsLanguageTile": {}, + "settingsCoordinateFormatDialogTitle": "Formato de coordenadas", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsWidgetDisplayedItem": "Elemento amosado", + "@settingsWidgetDisplayedItem": {}, + "settingsCollectionTile": "Colección", + "@settingsCollectionTile": {}, + "statsTopCountriesSectionTitle": "Países principais", + "@statsTopCountriesSectionTitle": {}, + "statsTopStatesSectionTitle": "Estados principais", + "@statsTopStatesSectionTitle": {}, + "statsTopTagsSectionTitle": "Etiquetas principais", + "@statsTopTagsSectionTitle": {}, + "viewerErrorDoesNotExist": "Xa non existe o arquivo.", + "@viewerErrorDoesNotExist": {}, + "mapAttributionOsmLiberty": "Mosaicos de [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hospedado por [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "openMapPageTooltip": "Ver na páxina do mapa", + "@openMapPageTooltip": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Fallo ao extraer datos incrustados", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoSearchSuggestionResolution": "Resolución", + "@viewerInfoSearchSuggestionResolution": {}, + "tagPlaceholderCountry": "País", + "@tagPlaceholderCountry": {}, + "tagPlaceholderState": "Estado", + "@tagPlaceholderState": {}, + "settingsTimeToTakeActionTile": "Retardo para executar unha acción", + "@settingsTimeToTakeActionTile": {}, + "settingsSubtitleThemeBackgroundColor": "Cor de fondo", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsViewerUseCutout": "Usar a área recortada", + "@settingsViewerUseCutout": {}, + "settingsViewerShowHistogram": "Amosar histograma", + "@settingsViewerShowHistogram": {}, + "settingsViewerShowOverlayThumbnails": "Amosar miniaturas", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsSlideshowRepeat": "Repetir", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowFillScreen": "Encher pantalla", + "@settingsSlideshowFillScreen": {}, + "settingsVideoSectionTitle": "Vídeo", + "@settingsVideoSectionTitle": {}, + "settingsVideoAutoPlay": "Reprodución automática", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeDialogTitle": "Modo bucle", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsVideoResumptionModeTile": "Retomar reprodución", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoControlsTile": "Controis", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "Controis", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoGestureSideDoubleTapSeek": "Dobre toque nos bordes da pantalla para buscar atrás/adiante", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsSubtitleThemeShowOutline": "Amosar contorno e sombra", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Cor do texto", + "@settingsSubtitleThemeTextColor": {}, + "settingsPrivacySectionTitle": "Privacidade", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Permitir acceso á lista de aplicacións", + "@settingsAllowInstalledAppAccess": {}, + "settingsHiddenItemsPageTitle": "Elementos ocultos", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersEmpty": "Sen filtros ocultos", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessPageTitle": "Acceso á almacenaxe", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessRevokeTooltip": "Revogar", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Accesibilidade", + "@settingsAccessibilitySectionTitle": {}, + "settingsUnitSystemDialogTitle": "Unidades", + "@settingsUnitSystemDialogTitle": {}, + "settingsForceWesternArabicNumeralsTile": "Forzar números arábigos", + "@settingsForceWesternArabicNumeralsTile": {}, + "settingsWidgetShowOutline": "Contorno", + "@settingsWidgetShowOutline": {}, + "statsWithGps": "{count, plural, =1{1 elemento con localización} other{{count} elementos con localización}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "viewerInfoUnknown": "descoñecido", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "Descrición", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelDuration": "Duración", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Propietario", + "@viewerInfoLabelOwner": {}, + "mapAttributionStamen": "Mosaicos de [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "viewerInfoOpenLinkText": "Abrir", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Ver XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchSuggestionDescription": "Descrición", + "@viewerInfoSearchSuggestionDescription": {}, + "tagEditorPageTitle": "Editar etiquetas", + "@tagEditorPageTitle": {}, + "tagEditorSectionPlaceholders": "Marcadores de posición", + "@tagEditorSectionPlaceholders": {}, + "panoramaEnableSensorControl": "Activar control do sensor", + "@panoramaEnableSensorControl": {}, + "settingsViewerMaximumBrightness": "Brillo máximo", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Reproducir automáticamente fotos en movemento", + "@settingsMotionPhotoAutoPlay": {}, + "settingsCollectionBurstPatternsTile": "Patróns de refacho", + "@settingsCollectionBurstPatternsTile": {}, + "settingsViewerGestureSideTapNext": "Tocar nos bordes da pantalla para amosar o elemento anterior/seguinte", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Botóns dispoñibles", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Sen botóns", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "Superposición", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "Superposición", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowMinimap": "Amosar minimapa", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowShootingDetails": "Amosar detalles da toma", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerEnableOverlayBlurEffect": "Efecto de desenfoque", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsSlideshowTransitionTile": "Transición", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Intervalo", + "@settingsSlideshowIntervalTile": {}, + "settingsStorageAccessTile": "Acceso á almacenaxe", + "@settingsStorageAccessTile": {}, + "settingsViewerQuickActionEditorBanner": "Prema e manteña para mover botóns e escoller que accións se amosarán no visor.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerShowInformationSubtitle": "Amosar título, data, localización, etc.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsVideoLoopModeTile": "Modo bucle", + "@settingsVideoLoopModeTile": {}, + "settingsVideoBackgroundModeDialogTitle": "Modo do fondo", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Prema e manteña para mover botóns e escoller que accións se amosarán ao navegar polos elementos.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsStorageAccessBanner": "Algúns directorios precisan permiso explícito de acceso para modificar os arquivos que conteñen. Aquí pode revisar a que directorios lles tera dado acceso.", + "@settingsStorageAccessBanner": {}, + "settingsLanguagePageTitle": "Idioma", + "@settingsLanguagePageTitle": {}, + "settingsScreenSaverPageTitle": "Protector de pantalla", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "Marco de foto", + "@settingsWidgetPageTitle": {}, + "settingsVideoButtonsTile": "Botóns", + "@settingsVideoButtonsTile": {}, + "sourceViewerPageTitle": "Fonte", + "@sourceViewerPageTitle": {}, + "mapZoomInTooltip": "Achegar", + "@mapZoomInTooltip": {}, + "viewerInfoLabelTitle": "Título", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelResolution": "Resolución", + "@viewerInfoLabelResolution": {}, + "mapAttributionOsmData": "Datos de mapa © os colaboradores de [OpenStreetMap](https://www.openstreetmap.org/copyright)", + "@mapAttributionOsmData": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Mosaicos de [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "panoramaDisableSensorControl": "Desactivar control do sensor", + "@panoramaDisableSensorControl": {}, + "settingsHiddenFiltersBanner": "As fotos e vídeos que cadren cos filtros ocultos non se amosarán na súa colección.", + "@settingsHiddenFiltersBanner": {}, + "createButtonLabel": "CREAR", + "@createButtonLabel": {}, + "chipActionGroup": "Cambiar agrupamento", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Crear grupo", + "@chipActionCreateGroup": {}, + "albumTierGroups": "Grupos", + "@albumTierGroups": {}, + "newGroupDialogTitle": "Novo grupo", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Nome do grupo", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "Xa existe o grupo", + "@groupAlreadyExists": {}, + "groupEmpty": "Sen grupos", + "@groupEmpty": {}, + "ungrouped": "Non agrupado", + "@ungrouped": {}, + "groupPickerTitle": "Escolmar grupo", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Usar este grupo", + "@groupPickerUseThisGroupButton": {}, + "sectionNone": "Sen seccións", + "@sectionNone": {}, + "sortByPath": "Por ruta", + "@sortByPath": {}, + "searchFormatSectionTitle": "Formatos", + "@searchFormatSectionTitle": {}, + "mapStyleDialogAddStyle": "Engadir estilo", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogName": "Nome", + "@mapStyleEditorDialogName": {}, + "tagPickPageTitle": "Escoller etiqueta", + "@tagPickPageTitle": {}, + "settingsNavigationBottomActionsTile": "Barra de navegación inferior", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Barra de navegación inferior", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Prema e manteña para mover botóns e escolmar que accións se amosarán na barra de navegación inferior.", + "@settingsNavigationBottomActionEditorBanner": {}, + "mapStyleEditorDialogSubdomains": "Subdominios", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "User-Agent", + "@mapStyleEditorDialogUserAgent": {}, + "settingsViewerShowZoomLevel": "Amosar nivel de zoom", + "@settingsViewerShowZoomLevel": {}, + "settingsEnabled": "Activado", + "@settingsEnabled": {}, + "settingsForced": "Forzado", + "@settingsForced": {} +} diff --git a/lib/l10n/app_he.arb b/lib/l10n/app_he.arb new file mode 100644 index 0000000..1b44569 --- /dev/null +++ b/lib/l10n/app_he.arb @@ -0,0 +1,206 @@ +{ + "appName": "אייבז", + "@appName": {}, + "welcomeMessage": "ברוך הבא לאייבז", + "@welcomeMessage": {}, + "welcomeOptional": "אופציונלי", + "@welcomeOptional": {}, + "welcomeTermsToggle": "אני מסכימ/ה לתנאים", + "@welcomeTermsToggle": {}, + "chipActionShowCollection": "הצג באוסף", + "@chipActionShowCollection": {}, + "chipActionGoToAlbumPage": "הצג באלבום", + "@chipActionGoToAlbumPage": {}, + "chipActionFilterIn": "סנן לבתוך", + "@chipActionFilterIn": {}, + "chipActionFilterOut": "סנן החוצה", + "@chipActionFilterOut": {}, + "chipActionPin": "הצמד למעלה", + "@chipActionPin": {}, + "chipActionUnpin": "בטל הצמד למעלה", + "@chipActionUnpin": {}, + "chipActionRename": "שנה שם", + "@chipActionRename": {}, + "applyTooltip": "החל", + "@applyTooltip": {}, + "changeTooltip": "שינוי", + "@changeTooltip": {}, + "clearTooltip": "ניקוי", + "@clearTooltip": {}, + "previousTooltip": "הקודם", + "@previousTooltip": {}, + "nextTooltip": "הבא", + "@nextTooltip": {}, + "resetTooltip": "אפס", + "@resetTooltip": {}, + "saveTooltip": "שמור", + "@saveTooltip": {}, + "pickTooltip": "בחר", + "@pickTooltip": {}, + "chipActionGoToPlacePage": "הצג במקומות", + "@chipActionGoToPlacePage": {}, + "chipActionGoToTagPage": "הצג בתגיות", + "@chipActionGoToTagPage": {}, + "chipActionDecompose": "פיצול", + "@chipActionDecompose": {}, + "chipActionHide": "הסתר", + "@chipActionHide": {}, + "chipActionLock": "נעל", + "@chipActionLock": {}, + "applyButtonLabel": "החל", + "@applyButtonLabel": {}, + "nextButtonLabel": "הבא", + "@nextButtonLabel": {}, + "showButtonLabel": "הצג", + "@showButtonLabel": {}, + "hideButtonLabel": "הסתר", + "@hideButtonLabel": {}, + "continueButtonLabel": "המשך", + "@continueButtonLabel": {}, + "cancelTooltip": "ביטול", + "@cancelTooltip": {}, + "columnCount": "{count, plural, =1{{count} עמודה} other{{count} עמודות}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "itemCount": "{count, plural, =1{{count} פריט} other{{count} פריטים}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "deleteButtonLabel": "מחק", + "@deleteButtonLabel": {}, + "doubleBackExitMessage": "כדי לצאת הקש שוב על \"חזרה\".", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "אל תשאל שוב", + "@doNotAskAgain": {}, + "sourceStateLocatingPlaces": "טוען מקומות", + "@sourceStateLocatingPlaces": {}, + "chipActionRemove": "הסר", + "@chipActionRemove": {}, + "timeSeconds": "{count, plural, =1{{count} שניה} other{{count} שניות}}", + "@timeSeconds": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeMinutes": "{count, plural, =1{{count} דקה} other{{count} דקות}}", + "@timeMinutes": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeDays": "{count, plural, =1{{count} יום} other{{count} ימים}}", + "@timeDays": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "saveCopyButtonLabel": "שמור עותק", + "@saveCopyButtonLabel": {}, + "chipActionGoToCountryPage": "הצג במדינות", + "@chipActionGoToCountryPage": {}, + "chipActionDelete": "מחק", + "@chipActionDelete": {}, + "hideTooltip": "הסתר", + "@hideTooltip": {}, + "showTooltip": "הצג", + "@showTooltip": {}, + "sourceStateLoading": "טוען", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "מקטלג", + "@sourceStateCataloguing": {}, + "actionRemove": "הסרה", + "@actionRemove": {}, + "sourceStateLocatingCountries": "טוען מדינות", + "@sourceStateLocatingCountries": {}, + "stopTooltip": "עצור", + "@stopTooltip": {}, + "chipActionGoToExplorerPage": "הצג בסייר", + "@chipActionGoToExplorerPage": {}, + "chipActionSetCover": "הגדר עטיפה", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "צור אלבום", + "@chipActionCreateAlbum": {}, + "chipActionShowCountryStates": "הצג סטטיסטיקות", + "@chipActionShowCountryStates": {}, + "createButtonLabel": "צור", + "@createButtonLabel": {}, + "chipActionGroup": "קבוצה", + "@chipActionGroup": {}, + "chipActionCreateGroup": "צור קבוצה", + "@chipActionCreateGroup": {}, + "chipActionCreateVault": "צור כספת", + "@chipActionCreateVault": {}, + "newGroupDialogTitle": "קבוצה חדשה", + "@newGroupDialogTitle": {}, + "groupAlreadyExists": "הקבוצה כבר קיימת", + "@groupAlreadyExists": {}, + "entryActionDelete": "מחיקה", + "@entryActionDelete": {}, + "entryActionConvert": "המרה", + "@entryActionConvert": {}, + "entryActionRotateCCW": "סובב נגד כיוון השעון", + "@entryActionRotateCCW": {}, + "entryActionShare": "שיתוף", + "@entryActionShare": {}, + "entryActionShareVideoOnly": "שיתוף וידיאו בלבד‍", + "@entryActionShareVideoOnly": {}, + "videoActionSelectStreams": "בחר מסלולים", + "@videoActionSelectStreams": {}, + "videoActionShowPreviousFrame": "הצג פריים קודם", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "הצג פריים הבא", + "@videoActionShowNextFrame": {}, + "chipActionConfigureVault": "הגדרת כספת", + "@chipActionConfigureVault": {}, + "entryActionCopyToClipboard": "הועתק ללוח", + "@entryActionCopyToClipboard": {}, + "entryActionShareImageOnly": "שיתוף תמונה בלבד", + "@entryActionShareImageOnly": {}, + "entryActionRotateCW": "סובב עם כיוון השעון", + "@entryActionRotateCW": {}, + "entryActionFlip": "הפוך אופקית", + "@entryActionFlip": {}, + "entryActionPrint": "הדפסה", + "@entryActionPrint": {}, + "entryActionViewSource": "מקור וידאו", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "הצג כשכבת מפה", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionInfo": "מידע", + "@entryActionInfo": {}, + "entryActionExport": "ייצוא", + "@entryActionExport": {}, + "entryActionRename": "שינוי שם", + "@entryActionRename": {}, + "entryActionRestore": "שחזור", + "@entryActionRestore": {} +} diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb new file mode 100644 index 0000000..a1e0c15 --- /dev/null +++ b/lib/l10n/app_hi.arb @@ -0,0 +1,1218 @@ +{ + "welcomeOptional": "वैकल्पिक", + "@welcomeOptional": {}, + "welcomeTermsToggle": "मैं नियमों और शर्तों से सहमत हूं", + "@welcomeTermsToggle": {}, + "columnCount": "{count, plural, other{{count} कॉलम}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeSeconds": "{count, plural, =1{{count} सेकंड} other{{count} सेकंडस}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "timeDays": "{count, plural, other{{count} दिन}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "applyButtonLabel": "लगाऐ", + "@applyButtonLabel": {}, + "nextButtonLabel": "आगे", + "@nextButtonLabel": {}, + "showButtonLabel": "देखे", + "@showButtonLabel": {}, + "hideButtonLabel": "छिपाए", + "@hideButtonLabel": {}, + "continueButtonLabel": "जारी रखे", + "@continueButtonLabel": {}, + "clearTooltip": "मिटाएं", + "@clearTooltip": {}, + "actionRemove": "हटाएं", + "@actionRemove": {}, + "itemCount": "{count, plural, =1{{count} चीज} other{{count} चीजे}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "deleteButtonLabel": "मिटाए", + "@deleteButtonLabel": {}, + "timeMinutes": "{count, plural, other{{count} मिनट}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "focalLength": "{length} एम एम", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "nextTooltip": "आगे", + "@nextTooltip": {}, + "appName": "ऐवीज", + "@appName": {}, + "welcomeMessage": "ऐवीज मे आपका स्वागत है", + "@welcomeMessage": {}, + "previousTooltip": "पिछे", + "@previousTooltip": {}, + "hideTooltip": "छिपाए", + "@hideTooltip": {}, + "cancelTooltip": "रद्द करें", + "@cancelTooltip": {}, + "changeTooltip": "बदलें", + "@changeTooltip": {}, + "showTooltip": "देखें", + "@showTooltip": {}, + "applyTooltip": "लगाए", + "@applyTooltip": {}, + "chipActionGoToPlacePage": "स्थानों में दिखाएं", + "@chipActionGoToPlacePage": {}, + "saveCopyButtonLabel": "सेव कॉपी", + "@saveCopyButtonLabel": {}, + "doubleBackExitMessage": "बाहर जाने के लिए दोबारा \"पीछे\" पर टैप करें", + "@doubleBackExitMessage": {}, + "sourceStateLoading": "लोड हो रहा है", + "@sourceStateLoading": {}, + "chipActionGoToTagPage": "टैग्स में दिखाएं", + "@chipActionGoToTagPage": {}, + "resetTooltip": "रिसेट", + "@resetTooltip": {}, + "saveTooltip": "सहेजें", + "@saveTooltip": {}, + "pickTooltip": "चुनें", + "@pickTooltip": {}, + "doNotAskAgain": "दोबारा मत पूछो", + "@doNotAskAgain": {}, + "chipActionDelete": "मिटाएं", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "एल्बम में दिखाए", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "देशों में दिखाएं", + "@chipActionGoToCountryPage": {}, + "chipActionHide": "छिपाए", + "@chipActionHide": {}, + "chipActionShowCollection": "कोलेक्शन में दिखाए", + "@chipActionShowCollection": {}, + "chipActionFilterOut": "फिल्टर करें", + "@chipActionFilterOut": {}, + "chipActionLock": "लॉक", + "@chipActionLock": {}, + "chipActionPin": "शीर्ष पर पिन करें", + "@chipActionPin": {}, + "chipActionGoToExplorerPage": "एक्सप्लोरर में दिखाए", + "@chipActionGoToExplorerPage": {}, + "entryActionRotateCW": "दक्षिणावर्त घुमाएं", + "@entryActionRotateCW": {}, + "entryActionViewSource": "सोर्स देखें", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "मैप ओवरले के रूप में देखे", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionViewMotionPhotoVideo": "वीडियो खोलें", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionOpen": "के साथ खोलें", + "@entryActionOpen": {}, + "entryActionRemoveFavourite": "पसंदीदा से निकालें", + "@entryActionRemoveFavourite": {}, + "entryInfoActionRemoveMetadata": "मेटाडाटा हटाएं", + "@entryInfoActionRemoveMetadata": {}, + "entryInfoActionRemoveLocation": "लोकेशन हटाएं", + "@entryInfoActionRemoveLocation": {}, + "entryActionFlip": "क्षैतिज फ्लिप करे", + "@entryActionFlip": {}, + "entryActionShareVideoOnly": "केवल वीडियो शेयर करें", + "@entryActionShareVideoOnly": {}, + "entryActionConvertMotionPhotoToStillImage": "स्थिर छवि में परिवर्तित करें", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionOpenMap": "मैप एप में दिखाएं", + "@entryActionOpenMap": {}, + "entryActionSetAs": "के रूप में सेट करें", + "@entryActionSetAs": {}, + "entryActionRotateScreen": "स्क्रीन घुमाएँ", + "@entryActionRotateScreen": {}, + "videoActionCaptureFrame": "फ्रेम कैप्चर करें", + "@videoActionCaptureFrame": {}, + "chipActionCreateAlbum": "एल्बम बनाएं", + "@chipActionCreateAlbum": {}, + "chipActionCreateVault": "वॉल्ट बनाएं", + "@chipActionCreateVault": {}, + "videoActionPlay": "चलाएं", + "@videoActionPlay": {}, + "videoActionReplay10": "10 सेकंड्स पीछे ले", + "@videoActionReplay10": {}, + "videoActionSkip10": "10 सेकंड्स आगे लें", + "@videoActionSkip10": {}, + "videoActionUnmute": "अनम्यूट करे", + "@videoActionUnmute": {}, + "slideshowActionShowInCollection": "संग्रह में दिखाएं", + "@slideshowActionShowInCollection": {}, + "slideshowActionResume": "रिज्यूम करें", + "@slideshowActionResume": {}, + "filterTypeAnimatedLabel": "एनिमेटेड", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "मोशन फोटो", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "पैनोरमा", + "@filterTypePanoramaLabel": {}, + "sourceStateLocatingCountries": "देश खोज रहे हैं", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "स्थान खोज रहें हैं", + "@sourceStateLocatingPlaces": {}, + "chipActionFilterIn": "में फिल्टर करें", + "@chipActionFilterIn": {}, + "chipActionRename": "नाम बदले", + "@chipActionRename": {}, + "chipActionUnpin": "शीर्ष से अनपिन करें", + "@chipActionUnpin": {}, + "entryActionEdit": "एडिट करें", + "@entryActionEdit": {}, + "videoActionMute": "म्यूट करे", + "@videoActionMute": {}, + "videoActionPause": "रोके", + "@videoActionPause": {}, + "entryInfoActionEditTags": "टैग्स एडिट करे", + "@entryInfoActionEditTags": {}, + "filterOnThisDayLabel": "इस दिन पर", + "@filterOnThisDayLabel": {}, + "filterTypeSphericalVideoLabel": "360° वीडियो", + "@filterTypeSphericalVideoLabel": {}, + "filterMimeVideoLabel": "वीडियो", + "@filterMimeVideoLabel": {}, + "viewerActionSettings": "सैटिंग", + "@viewerActionSettings": {}, + "entryActionCast": "कास्ट करें", + "@entryActionCast": {}, + "entryInfoActionExportMetadata": "मेटाडाटा एक्सपोर्ट करें", + "@entryInfoActionExportMetadata": {}, + "chipActionSetCover": "कवर सेट करें", + "@chipActionSetCover": {}, + "entryActionCopyToClipboard": "क्लिपबोर्ड पर कॉपी करें", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "मिटाएं", + "@entryActionDelete": {}, + "entryActionExport": "एक्सपोर्ट करें", + "@entryActionExport": {}, + "entryActionInfo": "जानकारी", + "@entryActionInfo": {}, + "entryActionConvert": "बदले", + "@entryActionConvert": {}, + "entryActionRename": "नाम बदलें", + "@entryActionRename": {}, + "entryActionRestore": "रिस्टोर करे", + "@entryActionRestore": {}, + "entryActionRotateCCW": "वामावर्त स्थिति में घुमाएं", + "@entryActionRotateCCW": {}, + "entryActionPrint": "प्रिंट करे", + "@entryActionPrint": {}, + "entryActionShare": "शेयर करे", + "@entryActionShare": {}, + "entryActionShareImageOnly": "केवल इमेज शेयर करें", + "@entryActionShareImageOnly": {}, + "entryActionAddFavourite": "पसंदीदा में जोड़े", + "@entryActionAddFavourite": {}, + "videoActionSelectStreams": "ट्रैक्स को चुने", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "चलाने की गति", + "@videoActionSetSpeed": {}, + "entryInfoActionEditDate": "दिनांक व समय एडिट करे", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "लोकेशन एडिट करे", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditRating": "रेटिंग एडिट करे", + "@entryInfoActionEditRating": {}, + "editorTransformRotate": "घुमाएं", + "@editorTransformRotate": {}, + "cropAspectRatioOriginal": "ओरिजनल", + "@cropAspectRatioOriginal": {}, + "filterFavouriteLabel": "पसंदीदा", + "@filterFavouriteLabel": {}, + "filterRecentlyAddedLabel": "हाल ही में शामिल की गई", + "@filterRecentlyAddedLabel": {}, + "filterMimeImageLabel": "इमेज", + "@filterMimeImageLabel": {}, + "keepScreenOnVideoPlayback": "वीडियो प्लेबैक के दौरान", + "@keepScreenOnVideoPlayback": {}, + "displayRefreshRatePreferLowest": "न्यूनतम दर", + "@displayRefreshRatePreferLowest": {}, + "nameConflictStrategyRename": "नाम बदलें", + "@nameConflictStrategyRename": {}, + "unitSystemMetric": "मात्रिक", + "@unitSystemMetric": {}, + "viewerTransitionSlide": "स्लाइड", + "@viewerTransitionSlide": {}, + "viewerTransitionFade": "फेड", + "@viewerTransitionFade": {}, + "newAlbumDialogStorageLabel": "स्टोरेज:", + "@newAlbumDialogStorageLabel": {}, + "newVaultDialogTitle": "नया वॉल्ट", + "@newVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "लॉक करे,जब स्क्रीन बंद हो जाती है", + "@vaultDialogLockModeWhenScreenOff": {}, + "filterTaggedLabel": "टैग किया गया", + "@filterTaggedLabel": {}, + "mapStyleGoogleTerrain": "गूगल मैप्स (टेरेन)", + "@mapStyleGoogleTerrain": {}, + "themeBrightnessDark": "डार्क", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "काला", + "@themeBrightnessBlack": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "filterAspectRatioPortraitLabel": "पोर्ट्रेट", + "@filterAspectRatioPortraitLabel": {}, + "filterNoAddressLabel": "एड्रेस रहित", + "@filterNoAddressLabel": {}, + "filterNoRatingLabel": "रेट नहीं किया गया", + "@filterNoRatingLabel": {}, + "filterRatingRejectedLabel": "अस्वीकृत", + "@filterRatingRejectedLabel": {}, + "mapStyleGoogleNormal": "गूगल मैप्स", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "गूगल मैप्स (हाइब्रिड)", + "@mapStyleGoogleHybrid": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor", + "@mapStyleStamenWatercolor": {}, + "unitSystemImperial": "इम्पीरियल", + "@unitSystemImperial": {}, + "passwordDialogEnter": "पासवर्ड दर्ज करें", + "@passwordDialogEnter": {}, + "filterBinLabel": "रीसाइकल बिन", + "@filterBinLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "albumTierVaults": "संदूक", + "@albumTierVaults": {}, + "albumTierRegular": "अन्य", + "@albumTierRegular": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "दशमलव डिग्री", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsSouth": "द", + "@coordinateDmsSouth": {}, + "coordinateDmsWest": "प", + "@coordinateDmsWest": {}, + "displayRefreshRatePreferHighest": "उच्चतम दर", + "@displayRefreshRatePreferHighest": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "subtitlePositionTop": "शीर्ष", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "नीचे", + "@subtitlePositionBottom": {}, + "videoLoopModeNever": "कभी नहीं", + "@videoLoopModeNever": {}, + "videoPlaybackMuted": "बिना ध्वनि के चलाएं", + "@videoPlaybackMuted": {}, + "viewerTransitionNone": "कोई नहीं", + "@viewerTransitionNone": {}, + "nameConflictDialogSingleSourceMessage": "गंतव्य फ़ोल्डर में कुछ फ़ाइलों का नाम समान है।।", + "@nameConflictDialogSingleSourceMessage": {}, + "noMatchingAppDialogMessage": "इसमें कोई ऐप नहीं है जो इसे संभाल सकता है।।", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{इस आइटम को रीसायकल बिन में ले जाएं?} other{इन {count} आइटम को रीसायकल बिन में ले जाएं?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{इस आइटम को हटाए?} other{इन {count} आइटमो को हटाएं?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "newAlbumDialogTitle": "नया एल्बम", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "एल्बम का नाम", + "@newAlbumDialogNameLabel": {}, + "pinDialogEnter": "पिन दर्ज करें", + "@pinDialogEnter": {}, + "pinDialogConfirm": "पिन कन्फर्म करें", + "@pinDialogConfirm": {}, + "passwordDialogConfirm": "पासवर्ड कन्फर्म करें", + "@passwordDialogConfirm": {}, + "videoLoopModeAlways": "हमेशा", + "@videoLoopModeAlways": {}, + "videoPlaybackSkip": "छोड़े", + "@videoPlaybackSkip": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "डायरेक्टरी पहले से मौजूद", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "coordinateDmsEast": "पू", + "@coordinateDmsEast": {}, + "moveUndatedConfirmationDialogSetDate": "तारीख सहेजें", + "@moveUndatedConfirmationDialogSetDate": {}, + "notEnoughSpaceDialogMessage": "इस ऑपरेशन को पूरा करने के लिए \"{volume}\" पर “{neededSize}” खाली जगह की आवश्यकता है, लेकिन केवल {freeSize} जगह है।।", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "renameAlbumDialogLabel": "नया नाम", + "@renameAlbumDialogLabel": {}, + "wallpaperTargetLock": "लॉक स्क्रीन", + "@wallpaperTargetLock": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{यह ऑपरेशन निम्न प्रकार के आइटम के लिए समर्थित नहीं है: {types}.} other{यह ऑपरेशन निम्न प्रकार के आइटम के लिए समर्थित नहीं है: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "restrictedAccessDialogMessage": "इस एप्लिकेशन को \"{volume}\" की {directory} में फ़ाइलों को संशोधित करने की अनुमति नहीं है।\n\nकृपया किसी अन्य directory में आइटम स्थानांतरित करने के लिए एक पूर्व-स्थापित फ़ाइल प्रबंधक या गैलरी ऐप का उपयोग करें।।", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "videoResumeDialogMessage": "क्या आप {time} पर पुन: चलाना चाहते हैं?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "videoStartOverButtonLabel": "पुन: प्रारंभ करें", + "@videoStartOverButtonLabel": {}, + "vaultDialogLockTypeLabel": "लॉक प्रकार", + "@vaultDialogLockTypeLabel": {}, + "patternDialogConfirm": "पैटर्न कन्फर्म करे", + "@patternDialogConfirm": {}, + "patternDialogEnter": "पैटर्न दर्ज करें", + "@patternDialogEnter": {}, + "authenticateToUnlockVault": "वॉल्ट को अनलॉक करने के लिए प्रमाणीकरण करें", + "@authenticateToUnlockVault": {}, + "settingsVideoEnablePip": "पिक्चर-इन-पिक्चर", + "@settingsVideoEnablePip": {}, + "videoControlsPlayOutside": "अन्य प्लेयर के साथ खोलें", + "@videoControlsPlayOutside": {}, + "videoLoopModeShortOnly": "केवल लघु वीडियो", + "@videoLoopModeShortOnly": {}, + "videoPlaybackWithSound": "ध्वनि के साथ चलाए", + "@videoPlaybackWithSound": {}, + "viewerTransitionParallax": "पैरालैक्स", + "@viewerTransitionParallax": {}, + "viewerTransitionZoomIn": "ज़ूम इन", + "@viewerTransitionZoomIn": {}, + "wallpaperTargetHome": "होम स्क्रीन", + "@wallpaperTargetHome": {}, + "widgetDisplayedItemRandom": "यादृच्छिक", + "@widgetDisplayedItemRandom": {}, + "videoResumeButtonLabel": "पुन: चलाएं", + "@videoResumeButtonLabel": {}, + "filterNoTitleLabel": "शीर्षकहीन", + "@filterNoTitleLabel": {}, + "stopTooltip": "रोके", + "@stopTooltip": {}, + "vaultLockTypePin": "पिन", + "@vaultLockTypePin": {}, + "wallpaperTargetHomeLock": "होम और लॉक स्क्रीन", + "@wallpaperTargetHomeLock": {}, + "widgetDisplayedItemMostRecent": "हाल ही के", + "@widgetDisplayedItemMostRecent": {}, + "filterAspectRatioLandscapeLabel": "लैंडस्केप", + "@filterAspectRatioLandscapeLabel": {}, + "filterNoDateLabel": "अदिनांकित", + "@filterNoDateLabel": {}, + "filterNoTagLabel": "टैग नहीं किया गया", + "@filterNoTagLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "accessibilityAnimationsKeep": "स्क्रीन प्रभाव रखें", + "@accessibilityAnimationsKeep": {}, + "vaultLockTypePattern": "पैटर्न", + "@vaultLockTypePattern": {}, + "coordinateDmsNorth": "उ", + "@coordinateDmsNorth": {}, + "albumTierNew": "नया", + "@albumTierNew": {}, + "albumTierApps": "ऐप्स", + "@albumTierApps": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "nameConflictStrategyReplace": "बदलें", + "@nameConflictStrategyReplace": {}, + "themeBrightnessLight": "लाइट", + "@themeBrightnessLight": {}, + "vaultLockTypePassword": "पासवर्ड", + "@vaultLockTypePassword": {}, + "storageVolumeDescriptionFallbackNonPrimary": "एसडी कार्ड", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "storageAccessDialogMessage": "अगले स्क्रीन में \"{volume}\" के {directory} का चयन करें ताकि यह ऐप इसके लिए पहुंच सके।।", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "rootDirectoryDescription": "root directory", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "“{name}” directory", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "missingSystemFilePickerDialogMessage": "सिस्टम फ़ाइल पिकर लापता या अक्षम है। कृपया इसे सक्षम करें और फिर से प्रयास करें।।", + "@missingSystemFilePickerDialogMessage": {}, + "nameConflictDialogMultipleSourceMessage": "कुछ फ़ाइलों का नाम समान है।।", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "शॉर्टकट लेबल", + "@addShortcutDialogLabel": {}, + "newVaultWarningDialogMessage": "वॉल्ट में आइटम केवल इस ऐप के लिए व अन्य के लिए नहीं उपलब्ध हैं।\n\nयदि आप इस ऐप को अनइंस्टॉल करते हैं, या इस ऐप डेटा को साफ़ करते हैं, तो आप इन सभी आइटम को खो देंगे।।", + "@newVaultWarningDialogMessage": {}, + "configureVaultDialogTitle": "वॉल्ट को कॉन्फ़िगर करना", + "@configureVaultDialogTitle": {}, + "moveUndatedConfirmationDialogMessage": "आगे बढ़ने से पहले आइटम की तारीख सेव करे?", + "@moveUndatedConfirmationDialogMessage": {}, + "setCoverDialogLatest": "नवीनतम आइटम", + "@setCoverDialogLatest": {}, + "hideFilterConfirmationDialogMessage": "मैचिंग तस्वीरें और वीडियो आपके कलेक्शन से छिपे होंगे। आप उन्हें फिर से \"गोपनीयता\" सेटिंग्स से दिखा सकते हैं।\n\nक्या आप उन्हें छिपाना चाहते हैं?", + "@hideFilterConfirmationDialogMessage": {}, + "renameEntrySetPageTitle": "नाम बदलें", + "@renameEntrySetPageTitle": {}, + "authenticateToConfigureVault": "वॉल्ट को कॉन्फ़िगर करने के लिए प्रमाणीकरण करें", + "@authenticateToConfigureVault": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "डायरेक्टरी पहले से मौजूद", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "videoRepeatActionSetEnd": "एण्ड सेट करे", + "@videoRepeatActionSetEnd": {}, + "chipActionShowCountryStates": "राज्यों को दिखाएं", + "@chipActionShowCountryStates": {}, + "chipActionConfigureVault": "वॉल्ट को कॉन्फ़िगर करें", + "@chipActionConfigureVault": {}, + "videoActionABRepeat": "A-B दोहराव", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "स्टार्ट सेट करे", + "@videoRepeatActionSetStart": {}, + "keepScreenOnNever": "कभी नहीं", + "@keepScreenOnNever": {}, + "editEntryDialogCopyFromItem": "अन्य आइटम से कॉपी करें", + "@editEntryDialogCopyFromItem": {}, + "durationDialogSeconds": "सेकंड", + "@durationDialogSeconds": {}, + "entryInfoActionEditTitleDescription": "शीर्षक और विवरण संपादित करें", + "@entryInfoActionEditTitleDescription": {}, + "widgetOpenPageCollection": "संग्रह खोलें", + "@widgetOpenPageCollection": {}, + "vaultBinUsageDialogMessage": "कुछ वॉल्ट्स रीसायकल बिन का उपयोग कर रहे हैं।।", + "@vaultBinUsageDialogMessage": {}, + "editEntryLocationDialogSetCustom": "कस्टम स्थान सेट करें", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogChooseOnMap": "मानचित्र पर चुनें", + "@editEntryLocationDialogChooseOnMap": {}, + "sourceStateCataloguing": "Cataloguing", + "@sourceStateCataloguing": {}, + "editEntryLocationDialogLongitude": "देशांतर", + "@editEntryLocationDialogLongitude": {}, + "videoStreamSelectionDialogVideo": "वीडियो", + "@videoStreamSelectionDialogVideo": {}, + "keepScreenOnViewerOnly": "केवल व्यूअर पेज", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "हमेशा", + "@keepScreenOnAlways": {}, + "renameEntrySetPageInsertTooltip": "फ़ील्ड डालें", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "पूर्वावलोकन", + "@renameEntrySetPagePreviewSectionTitle": {}, + "setCoverDialogAuto": "ऑटो", + "@setCoverDialogAuto": {}, + "exportEntryDialogWidth": "चौड़ाई", + "@exportEntryDialogWidth": {}, + "editEntryDialogTargetFieldsHeader": "संशोधित करने के लिए फ़ील्ड", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "तारीख और समय", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "कस्टम तिथि सेट करें", + "@editEntryDateDialogSetCustom": {}, + "durationDialogHours": "घंटे", + "@durationDialogHours": {}, + "editEntryLocationDialogTitle": "स्थान", + "@editEntryLocationDialogTitle": {}, + "renameProcessorHash": "हैश", + "@renameProcessorHash": {}, + "renameProcessorName": "नाम", + "@renameProcessorName": {}, + "exportEntryDialogFormat": "फॉर्मेट:", + "@exportEntryDialogFormat": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "मोशन फोटो के अंदर वीडियो चलाने के लिए XMP की जरूरत है\n\nक्या आप वास्तव में इसे हटाना चाहते हैं?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "videoSpeedDialogLabel": "चलाने की गति", + "@videoSpeedDialogLabel": {}, + "editEntryLocationDialogLatitude": "अक्षांश", + "@editEntryLocationDialogLatitude": {}, + "removeEntryMetadataDialogTitle": "मेटाडाटा हटाना", + "@removeEntryMetadataDialogTitle": {}, + "filterNoLocationLabel": "लॉकेट नही किया गया", + "@filterNoLocationLabel": {}, + "accessibilityAnimationsRemove": "स्क्रीन प्रभाव को रोकें", + "@accessibilityAnimationsRemove": {}, + "maxBrightnessNever": "कभी नहीं", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "हमेशा", + "@maxBrightnessAlways": {}, + "widgetTapUpdateWidget": "विजेट अपडेट करें", + "@widgetTapUpdateWidget": {}, + "storageVolumeDescriptionFallbackPrimary": "आंतरिक भंडारण", + "@storageVolumeDescriptionFallbackPrimary": {}, + "editEntryDateDialogExtractFromTitle": "शीर्षक से निकालें", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryRatingDialogTitle": "रेटिंग", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogMore": "अधिक", + "@removeEntryMetadataDialogMore": {}, + "filterLocatedLabel": "लोकेट किया गया", + "@filterLocatedLabel": {}, + "locationPickerUseThisLocationButton": "इस स्थान का उपयोग करें", + "@locationPickerUseThisLocationButton": {}, + "viewerActionLock": "व्यूअर को लॉक करे", + "@viewerActionLock": {}, + "renameEntrySetPagePatternFieldLabel": "नामकरण पैटर्न", + "@renameEntrySetPagePatternFieldLabel": {}, + "videoResumptionModeNever": "कभी नहीं", + "@videoResumptionModeNever": {}, + "videoResumptionModeAlways": "हमेशा", + "@videoResumptionModeAlways": {}, + "renameProcessorCounter": "काउंटर", + "@renameProcessorCounter": {}, + "editEntryDateDialogCopyField": "अन्य तारीख से कॉपी करें", + "@editEntryDateDialogCopyField": {}, + "viewerActionUnlock": "व्यूअर को अनलॉक करे", + "@viewerActionUnlock": {}, + "editorTransformCrop": "क्रॉप", + "@editorTransformCrop": {}, + "cropAspectRatioFree": "फ्री", + "@cropAspectRatioFree": {}, + "nameConflictStrategySkip": "छोड़े", + "@nameConflictStrategySkip": {}, + "albumTierPinned": "पिन किया गया", + "@albumTierPinned": {}, + "albumTierSpecial": "कॉमन", + "@albumTierSpecial": {}, + "overlayHistogramNone": "कोई नहीं", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "overlayHistogramLuminance": "चमक", + "@overlayHistogramLuminance": {}, + "widgetOpenPageViewer": "व्यूअर खोलें", + "@widgetOpenPageViewer": {}, + "addShortcutButtonLabel": "ADD", + "@addShortcutButtonLabel": {}, + "setCoverDialogCustom": "कस्टम", + "@setCoverDialogCustom": {}, + "exportEntryDialogHeight": "ऊंचाई", + "@exportEntryDialogHeight": {}, + "exportEntryDialogQuality": "गुणवत्ता", + "@exportEntryDialogQuality": {}, + "exportEntryDialogWriteMetadata": "मेटाडाटा लिखें", + "@exportEntryDialogWriteMetadata": {}, + "renameEntryDialogLabel": "नया नाम", + "@renameEntryDialogLabel": {}, + "editEntryDateDialogShift": "शिफ्ट", + "@editEntryDateDialogShift": {}, + "durationDialogMinutes": "मिनट", + "@durationDialogMinutes": {}, + "videoStreamSelectionDialogText": "उपशीर्षक", + "@videoStreamSelectionDialogText": {}, + "genericFailureFeedback": "असफल", + "@genericFailureFeedback": {}, + "menuActionSlideshow": "स्लाइड शो", + "@menuActionSlideshow": {}, + "viewDialogReverseSortOrder": "क्रम उलटा करे", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "मौज़ेक", + "@tileLayoutMosaic": {}, + "cropAspectRatioSquare": "वर्ग", + "@cropAspectRatioSquare": {}, + "widgetOpenPageHome": "घर खोलें", + "@widgetOpenPageHome": {}, + "viewDialogSortSectionTitle": "क्रम से लगाए", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "समूह में रखे", + "@viewDialogGroupSectionTitle": {}, + "videoStreamSelectionDialogAudio": "ऑडियो", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogTrack": "ट्रैक", + "@videoStreamSelectionDialogTrack": {}, + "genericSuccessFeedback": "हो गया!", + "@genericSuccessFeedback": {}, + "menuActionMap": "मैप", + "@menuActionMap": {}, + "aboutLinkLicense": "लाइसेंस", + "@aboutLinkLicense": {}, + "editEntryDateDialogSourceFileModifiedDate": "फ़ाइल संशोधित दिनांक", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "coverDialogTabApp": "ऐप", + "@coverDialogTabApp": {}, + "coverDialogTabCover": "ढखें", + "@coverDialogTabCover": {}, + "aboutBugReportButton": "रिपोर्ट दे", + "@aboutBugReportButton": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{यह एल्बम और इसमें मौजूद आइटम हटाएं?} other{यह एल्बम और इसमें मौजूद {count} हटाएं?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{ये एल्बम और उनमें मौजूद आइटम हटाएं?} other{ये एल्बम और उनमें मौजूद {count} आइटम हटाएं?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "menuActionSelect": "चूने", + "@menuActionSelect": {}, + "genericDangerWarningDialogMessage": "क्या आपको यकीन है?", + "@genericDangerWarningDialogMessage": {}, + "tooManyItemsErrorDialogMessage": "कम आइटम के साथ पुनः प्रयास करें।", + "@tooManyItemsErrorDialogMessage": {}, + "menuActionSelectAll": "सभी चुने", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "कुछ मत चुने", + "@menuActionSelectNone": {}, + "tileLayoutGrid": "ग्रिड", + "@tileLayoutGrid": {}, + "tileLayoutList": "सूची", + "@tileLayoutList": {}, + "castDialogTitle": "कास्ट डिवाइस", + "@castDialogTitle": {}, + "coverDialogTabColor": "रंग", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "ऐप चुनें", + "@appPickDialogTitle": {}, + "aboutBugCopyInfoButton": "कोपी", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "लॉग और सिस्टम जानकारी के साथ GitHub पर रिपोर्ट करें", + "@aboutBugReportInstruction": {}, + "aboutBugCopyInfoInstruction": "सिस्टम जानकारी कॉपी करें", + "@aboutBugCopyInfoInstruction": {}, + "videoStreamSelectionDialogOff": "बंद", + "@videoStreamSelectionDialogOff": {}, + "aboutBugSectionTitle": "बग रिपोर्ट", + "@aboutBugSectionTitle": {}, + "aboutLinkPolicy": "गोपनीयता नीति", + "@aboutLinkPolicy": {}, + "menuActionConfigureView": "देखें", + "@menuActionConfigureView": {}, + "menuActionStats": "आँकड़े", + "@menuActionStats": {}, + "aboutBugSaveLogInstruction": "ऐप लॉग को फ़ाइल में सहेजें", + "@aboutBugSaveLogInstruction": {}, + "aboutDataUsageSectionTitle": "डेटा उपयोग", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageData": "डेटा", + "@aboutDataUsageData": {}, + "aboutDataUsageCache": "कैश", + "@aboutDataUsageCache": {}, + "aboutDataUsageDatabase": "डेटाबेस", + "@aboutDataUsageDatabase": {}, + "editorActionTransform": "परिवर्तन", + "@editorActionTransform": {}, + "videoStreamSelectionDialogNoSelection": "कोई अन्य ट्रैक नहीं हैं।", + "@videoStreamSelectionDialogNoSelection": {}, + "viewDialogLayoutSectionTitle": "लेआउट", + "@viewDialogLayoutSectionTitle": {}, + "appPickDialogNone": "कोई नहीं", + "@appPickDialogNone": {}, + "aboutPageTitle": "बारे में", + "@aboutPageTitle": {}, + "collectionEditFailureFeedback": "{count, plural, =1{1 आइटम एडिट करने में विफल} other{{count} आइटम एडिट करने में विफल}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "drawerCollectionVideos": "वीडियो", + "@drawerCollectionVideos": {}, + "collectionActionSetHome": "घर के रूप में सेट करें", + "@collectionActionSetHome": {}, + "collectionActionMove": "एल्बम पर जाएँ", + "@collectionActionMove": {}, + "collectionActionRescan": "पुन: स्कैन करे", + "@collectionActionRescan": {}, + "collectionGroupDay": "दिन के अनुसार", + "@collectionGroupDay": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{1 आइटम कॉपी किया गया} other{{count} आइटम कॉपी किए गए}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEmptyImages": "कोई इमेज नहीं", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "पहुंच प्रदान करें", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionActionAddShortcut": "शॉर्टकट जोड़ें", + "@collectionActionAddShortcut": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{1 आइटम का नाम बदलने में विफल} other{{count} आइटम का नाम बदलने में विफल}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "drawerCollectionAnimated": "एनिमेटेड", + "@drawerCollectionAnimated": {}, + "aboutCreditsSectionTitle": "क्रेडिट", + "@aboutCreditsSectionTitle": {}, + "aboutLicensesSectionTitle": "ओपन सोर्स लाइसेंस", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "फ्लटर पैकेज", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "सभी लाइसेंस दिखाएं", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "गोपनीयता नीति", + "@policyPageTitle": {}, + "collectionActionEmptyBin": "बीन खाली करे", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "एल्बम में कॉपी करें", + "@collectionActionCopy": {}, + "collectionGroupAlbum": "एल्बम के अनुसार", + "@collectionGroupAlbum": {}, + "aboutCreditsWorldAtlas1": "यह ऐप TopoJSON फ़ाइल का उपयोग करता है", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "आईएससी लाइसेंस के तहत।", + "@aboutCreditsWorldAtlas2": {}, + "collectionPageTitle": "संग्रह", + "@collectionPageTitle": {}, + "collectionGroupMonth": "महीने के अनुसार", + "@collectionGroupMonth": {}, + "sectionUnknown": "अज्ञात", + "@sectionUnknown": {}, + "dateYesterday": "कल", + "@dateYesterday": {}, + "dateThisMonth": "इस महीने", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{1 आइटम हटाने में विफल} other{{count} आइटम हटाने में विफल}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{1 पन्ना निर्यात करने में विफल} other{{count} पन्ने निर्यात करने में विफल}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{1 आइटम का नाम बदला गया} other{{count} आइटम का नाम बदला गया}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "aboutLicensesAndroidLibrariesSectionTitle": "एंड्रॉइड लाइब्रेरीज़", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "dateToday": "आज", + "@dateToday": {}, + "collectionActionHideTitleSearch": "शीर्षक फ़िल्टर छुपाएं", + "@collectionActionHideTitleSearch": {}, + "drawerCollectionFavourites": "पसंदीदा", + "@drawerCollectionFavourites": {}, + "drawerCollectionMotionPhotos": "मोशन तस्वीरें", + "@drawerCollectionMotionPhotos": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{1 आइटम ले जाने में विफल} other{{count} आइटम ले जाने में विफल}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{1 आइटम संपादित किया गया} other{{count} आइटम संपादित किए गए}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEmptyFavourites": "कोई पसंदीदा नहीं", + "@collectionEmptyFavourites": {}, + "aboutDataUsageClearCache": "कैश साफ़ करें", + "@aboutDataUsageClearCache": {}, + "aboutTranslatorsSectionTitle": "अनुवादक", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesBanner": "यह ऐप निम्नलिखित ओपन सोर्स पैकेज और पुस्तकालयों का उपयोग करता है।", + "@aboutLicensesBanner": {}, + "aboutLicensesFlutterPluginsSectionTitle": "फ्लटर प्लगइन्स", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "डार्ट पैकेज", + "@aboutLicensesDartPackagesSectionTitle": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{1 आइटम कॉपी करने में विफल} other{{count} आइटम कॉपी करने में विफल}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "aboutDataUsageInternal": "आंतरिक", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "बाहरी", + "@aboutDataUsageExternal": {}, + "collectionSelectPageTitle": "आइटम चुनें", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "शीर्षक फ़िल्टर दिखाएं", + "@collectionActionShowTitleSearch": {}, + "collectionActionEdit": "एडिट करे", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "शीर्षक खोजें", + "@collectionSearchTitlesHintText": {}, + "collectionMoveSuccessFeedback": "{count, plural, =1{1 आइटम स्थानांतरित किया गया} other{{count} आइटम स्थानांतरित किए गए}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEmptyVideos": "कोई वीडियो नहीं", + "@collectionEmptyVideos": {}, + "collectionSelectSectionTooltip": "अनुभाग चुनें", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "अनुभाग का चयन रद्द करें", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "के बारे में", + "@drawerAboutButton": {}, + "drawerSettingsButton": "सेटिंग्स", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "सभी संग्रह", + "@drawerCollectionAll": {}, + "drawerCollectionImages": "इमेजेस", + "@drawerCollectionImages": {}, + "aboutDataUsageMisc": "विविध", + "@aboutDataUsageMisc": {}, + "sortByName": "नाम से", + "@sortByName": {}, + "sortByDate": "दिनांक से", + "@sortByDate": {}, + "videoActionShowPreviousFrame": "पिछला फ्रेम दिखाए", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "अगला फ्रेम दिखाए", + "@videoActionShowNextFrame": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "एल्बम पहले से उपलब्ध हैं", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "drawerCountryPage": "देश", + "@drawerCountryPage": {}, + "collectionPickPageTitle": "चुने", + "@collectionPickPageTitle": {}, + "drawerCollectionPanoramas": "पैनोरामा", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "रॉ फ़ोटो", + "@drawerCollectionRaws": {}, + "drawerAlbumPage": "एल्बम", + "@drawerAlbumPage": {}, + "drawerCollectionSphericalVideos": "360⁰ वीडियो", + "@drawerCollectionSphericalVideos": {}, + "drawerPlacePage": "स्थान", + "@drawerPlacePage": {}, + "drawerTagPage": "टैग्स", + "@drawerTagPage": {}, + "albumMimeTypeMixed": "मिक्सड", + "@albumMimeTypeMixed": {}, + "countryEmpty": "कोई देश नहीं", + "@countryEmpty": {}, + "settingsNavigationDrawerAddAlbum": "एल्बम जोड़े", + "@settingsNavigationDrawerAddAlbum": {}, + "albumGroupTier": "टियर से", + "@albumGroupTier": {}, + "searchStatesSectionTitle": "राज्य/देश", + "@searchStatesSectionTitle": {}, + "mapStyleOpenTopoMap": "ओपनटॉपोमैप", + "@mapStyleOpenTopoMap": {}, + "sortOrderShortestFirst": "छोटा पहले", + "@sortOrderShortestFirst": {}, + "settingsNavigationDrawerEditorPageTitle": "नेविगेशन मेनू", + "@settingsNavigationDrawerEditorPageTitle": {}, + "editEntryLocationDialogImportGpx": "GPX इंपोर्ट करे", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "टाइम शिफ्ट", + "@editEntryLocationDialogTimeShift": {}, + "searchRatingSectionTitle": "रेटिंग", + "@searchRatingSectionTitle": {}, + "searchDateSectionTitle": "दिनांक", + "@searchDateSectionTitle": {}, + "searchPlacesSectionTitle": "स्थान", + "@searchPlacesSectionTitle": {}, + "settingsDefault": "डिफॉल्ट", + "@settingsDefault": {}, + "appExportDynamicAlbums": "डायनेमिक एल्बम", + "@appExportDynamicAlbums": {}, + "albumScreenRecordings": "स्क्रीन रिकॉर्डिंग", + "@albumScreenRecordings": {}, + "sortOrderHighestFirst": "उच्चतम पहले", + "@sortOrderHighestFirst": {}, + "albumGroupType": "टाइप द्वारा", + "@albumGroupType": {}, + "albumGroupVolume": "स्टोरेज मात्रा के अनुसार", + "@albumGroupVolume": {}, + "placePageTitle": "स्थान", + "@placePageTitle": {}, + "searchAlbumsSectionTitle": "एल्बम", + "@searchAlbumsSectionTitle": {}, + "tagPageTitle": "टैग्स", + "@tagPageTitle": {}, + "tagEmpty": "कोई टैग नहीं", + "@tagEmpty": {}, + "searchMetadataSectionTitle": "मेटाडाटा", + "@searchMetadataSectionTitle": {}, + "settingsConfirmationBeforeDeleteItems": "आइटम को हमेशा के लिए डीलीट करने से पहले पूछे", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationAfterMoveToBinItems": "आइटम को रिसाइकिल बिन में ले जाने के बाद संदेश दिखाए", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerBanner": "मेनू आइटम को ले जाने व रिआर्डर करने के लिए टच और होल्ड करें", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "टाइप्स", + "@settingsNavigationDrawerTabTypes": {}, + "dynamicAlbumAlreadyExists": "डायनेमिक एल्बम पहले से ही मौजूद है", + "@dynamicAlbumAlreadyExists": {}, + "newDynamicAlbumDialogTitle": "नया डायनेमिक एल्बम", + "@newDynamicAlbumDialogTitle": {}, + "albumPageTitle": "एल्बम", + "@albumPageTitle": {}, + "chipActionDecompose": "स्प्लिट करे", + "@chipActionDecompose": {}, + "albumTierDynamic": "डायनेमिक", + "@albumTierDynamic": {}, + "albumPickPageTitleMove": "एल्बम में स्थानांतरित करे", + "@albumPickPageTitleMove": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "sortByItemCount": "आइटम गणना के द्वारा", + "@sortByItemCount": {}, + "sortBySize": "साइज से", + "@sortBySize": {}, + "sortByRating": "रेटिंग से", + "@sortByRating": {}, + "sortByDuration": "समय के अनुसार", + "@sortByDuration": {}, + "albumPickPageTitleCopy": "एल्बम में कॉपी करे", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "एल्बम में एक्सपोर्ट करे", + "@albumPickPageTitleExport": {}, + "statePageTitle": "राज्य/देश", + "@statePageTitle": {}, + "stateEmpty": "कौन राज्य नहीं", + "@stateEmpty": {}, + "placeEmpty": "कोई स्थान नहीं", + "@placeEmpty": {}, + "binPageTitle": "रिसाइकल बिन", + "@binPageTitle": {}, + "searchCountriesSectionTitle": "देशों", + "@searchCountriesSectionTitle": {}, + "settingsPageTitle": "सेटिंग्स", + "@settingsPageTitle": {}, + "setHomeCustom": "कस्टम", + "@setHomeCustom": {}, + "settingsHomeTile": "होम", + "@settingsHomeTile": {}, + "settingsConfirmationVaultDataLoss": "वोल्ट (संदूक) के डाटा लॉस की चेतावनी दिखाए", + "@settingsConfirmationVaultDataLoss": {}, + "settingsNavigationDrawerTabAlbums": "एल्बम", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsKeepScreenOnDialogTitle": "स्क्रीन को चालू रखें", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsConfirmationDialogTitle": "पुष्टीकरण डायलॉग", + "@settingsConfirmationDialogTitle": {}, + "chipActionRemove": "हटाएं", + "@chipActionRemove": {}, + "albumPickPageTitlePick": "एल्बम चुने", + "@albumPickPageTitlePick": {}, + "explorerPageTitle": "एक्सप्लोरर", + "@explorerPageTitle": {}, + "settingsKeepScreenOnTile": "स्क्रीन को चालू रखें", + "@settingsKeepScreenOnTile": {}, + "settingsConfirmationBeforeMoveToBinItems": "आइटम को रिसाइकल बिन में ले जाने से पहले पूछे", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "removeEntryMetadataDialogAll": "सभी", + "@removeEntryMetadataDialogAll": {}, + "collectionActionAddDynamicAlbum": "डायनेमिक एल्बम जोड़े", + "@collectionActionAddDynamicAlbum": {}, + "sortByAlbumFileName": "एल्बम और फाइल नाम से", + "@sortByAlbumFileName": {}, + "sortOrderNewestFirst": "नए पहले", + "@sortOrderNewestFirst": {}, + "sortOrderZtoA": "Z से A", + "@sortOrderZtoA": {}, + "sortOrderLongestFirst": "सबसे लंबा पहले", + "@sortOrderLongestFirst": {}, + "albumVideoCaptures": "वीडियो कैप्चर", + "@albumVideoCaptures": {}, + "albumEmpty": "कोई एल्बम नहीं l", + "@albumEmpty": {}, + "createAlbumButtonLabel": "बनाए", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "नया", + "@newFilterBanner": {}, + "countryPageTitle": "देशों", + "@countryPageTitle": {}, + "explorerActionSelectStorageVolume": "स्टोरेज चुने", + "@explorerActionSelectStorageVolume": {}, + "searchCollectionFieldHint": "कलेक्शन खोजें", + "@searchCollectionFieldHint": {}, + "selectStorageVolumeDialogTitle": "स्टोरेज", + "@selectStorageVolumeDialogTitle": {}, + "searchRecentSectionTitle": "हाल ही का", + "@searchRecentSectionTitle": {}, + "searchTagsSectionTitle": "टैग", + "@searchTagsSectionTitle": {}, + "settingsSearchFieldLabel": "सेटिंग्स खोजें", + "@settingsSearchFieldLabel": {}, + "settingsAskEverytime": "हर बार पूछे", + "@settingsAskEverytime": {}, + "settingsModificationWarningDialogMessage": "अन्य सेटिंग्स परिवर्तित की जाएगी", + "@settingsModificationWarningDialogMessage": {}, + "settingsSearchEmpty": "कोई सेटिंग्स नहीं मिली", + "@settingsSearchEmpty": {}, + "settingsActionExport": "एक्सपोर्ट", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "एक्सपोर्ट", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "इंपोर्ट", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "इंपोर्ट", + "@settingsActionImportDialogTitle": {}, + "appExportSettings": "सेटिंग्स", + "@appExportSettings": {}, + "appExportCovers": "कवर", + "@appExportCovers": {}, + "appExportFavourites": "पसंदीदा", + "@appExportFavourites": {}, + "settingsNavigationSectionTitle": "नेविगेशन", + "@settingsNavigationSectionTitle": {}, + "settingsHomeDialogTitle": "होम", + "@settingsHomeDialogTitle": {}, + "settingsConfirmationBeforeMoveUndatedItems": "अदिनांकित आइटम को ले जाने से पहले पूछे", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsNavigationDrawerTile": "नेविगेशन मेनू", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerTabPages": "पेज़", + "@settingsNavigationDrawerTabPages": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "sortOrderOldestFirst": "पूराने पहले", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "A से Z", + "@sortOrderAtoZ": {}, + "sortOrderLowestFirst": "निम्नतम पहले", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "सबसे बड़ा पहले", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "सबसे छोटा पहले", + "@sortOrderSmallestFirst": {}, + "albumCamera": "कैमरा", + "@albumCamera": {}, + "albumDownload": "डाउनलोड", + "@albumDownload": {}, + "albumScreenshots": "स्क्रीनशॉट", + "@albumScreenshots": {}, + "settingsDisabled": "डिसेबल किया गया", + "@settingsDisabled": {}, + "settingsSystemDefault": "सिस्टम डिफॉल्ट", + "@settingsSystemDefault": {}, + "settingsConfirmationTile": "पुष्टीकरण डायलॉग", + "@settingsConfirmationTile": {}, + "settingsDoubleBackExit": "बाहर जाने के लिए \"पीछे\" दो बार दबाए", + "@settingsDoubleBackExit": {} +} diff --git a/lib/l10n/app_hr.arb b/lib/l10n/app_hr.arb new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/lib/l10n/app_hr.arb @@ -0,0 +1 @@ +{} diff --git a/lib/l10n/app_hu.arb b/lib/l10n/app_hu.arb new file mode 100644 index 0000000..7491b87 --- /dev/null +++ b/lib/l10n/app_hu.arb @@ -0,0 +1,1642 @@ +{ + "applyButtonLabel": "ALKALMAZ", + "@applyButtonLabel": {}, + "deleteButtonLabel": "TÖRLÉS", + "@deleteButtonLabel": {}, + "nextButtonLabel": "KÖVETKEZŐ", + "@nextButtonLabel": {}, + "continueButtonLabel": "FOLYTAT", + "@continueButtonLabel": {}, + "previousTooltip": "Előző", + "@previousTooltip": {}, + "nextTooltip": "Következő", + "@nextTooltip": {}, + "saveTooltip": "Mentés", + "@saveTooltip": {}, + "sourceStateLoading": "Betöltés", + "@sourceStateLoading": {}, + "doNotAskAgain": "Ne kérdezd újra", + "@doNotAskAgain": {}, + "chipActionDelete": "Törlés", + "@chipActionDelete": {}, + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Üdvözöl az Aves", + "@welcomeMessage": {}, + "cancelTooltip": "Mégse", + "@cancelTooltip": {}, + "chipActionCreateAlbum": "Új album", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "Vágolapra másolás", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "Törlés", + "@entryActionDelete": {}, + "entryActionExport": "Exportálás", + "@entryActionExport": {}, + "entryActionInfo": "Infó", + "@entryActionInfo": {}, + "entryActionShare": "Megosztás", + "@entryActionShare": {}, + "entryActionPrint": "Nyomtatás", + "@entryActionPrint": {}, + "entryActionEdit": "Szerkesztés", + "@entryActionEdit": {}, + "entryActionRotateScreen": "Képernyő forgatása", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Kedvencekhez adás", + "@entryActionAddFavourite": {}, + "videoActionMute": "Némítás", + "@videoActionMute": {}, + "viewerActionSettings": "Beállítások", + "@viewerActionSettings": {}, + "entryInfoActionEditDate": "Dátum és idő szerkesztése", + "@entryInfoActionEditDate": {}, + "filterNoTitleLabel": "Névtelen", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "Ezen a napon", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Nemrég hozzáadva", + "@filterRecentlyAddedLabel": {}, + "filterTypePanoramaLabel": "Panoráma", + "@filterTypePanoramaLabel": {}, + "filterMimeVideoLabel": "Videó", + "@filterMimeVideoLabel": {}, + "albumTierNew": "Új", + "@albumTierNew": {}, + "themeBrightnessDark": "Sötét", + "@themeBrightnessDark": {}, + "vaultLockTypePassword": "Jelszó", + "@vaultLockTypePassword": {}, + "videoLoopModeAlways": "Mindig", + "@videoLoopModeAlways": {}, + "viewerTransitionNone": "Nincs", + "@viewerTransitionNone": {}, + "storageVolumeDescriptionFallbackPrimary": "Belső tárhely", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD kártya", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "newAlbumDialogTitle": "Új album", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Album neve", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "A mappa már létezik", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Tárhely:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "Új név", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "A mappa már létezik", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Átnevezés", + "@renameEntrySetPageTitle": {}, + "renameProcessorName": "Név", + "@renameProcessorName": {}, + "renameEntryDialogLabel": "Új név", + "@renameEntryDialogLabel": {}, + "editEntryDateDialogTitle": "Dátum és idő", + "@editEntryDateDialogTitle": {}, + "videoStreamSelectionDialogText": "Feliratok", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "Ki", + "@videoStreamSelectionDialogOff": {}, + "genericSuccessFeedback": "Kész!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Sikertelen", + "@genericFailureFeedback": {}, + "genericDangerWarningDialogMessage": "Biztos benne?", + "@genericDangerWarningDialogMessage": {}, + "menuActionSlideshow": "Diavetités", + "@menuActionSlideshow": {}, + "coverDialogTabCover": "Borító", + "@coverDialogTabCover": {}, + "appPickDialogNone": "Nincs", + "@appPickDialogNone": {}, + "aboutPageTitle": "Névjegy", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Licensz", + "@aboutLinkLicense": {}, + "aboutBugSectionTitle": "Hibajelentés", + "@aboutBugSectionTitle": {}, + "aboutBugCopyInfoButton": "Másolás", + "@aboutBugCopyInfoButton": {}, + "aboutTranslatorsSectionTitle": "Fordítók", + "@aboutTranslatorsSectionTitle": {}, + "collectionActionEdit": "Szerkesztés", + "@collectionActionEdit": {}, + "dateToday": "Ma", + "@dateToday": {}, + "dateThisMonth": "Ebben a hónapban", + "@dateThisMonth": {}, + "drawerAboutButton": "Névjegy", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Beállítások", + "@drawerSettingsButton": {}, + "drawerCollectionFavourites": "Kedvencek", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Képek", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Videók", + "@drawerCollectionVideos": {}, + "drawerCollectionPanoramas": "Panorámák", + "@drawerCollectionPanoramas": {}, + "albumDownload": "Letöltés", + "@albumDownload": {}, + "albumScreenshots": "Képernyőképek", + "@albumScreenshots": {}, + "albumPageTitle": "Albumok", + "@albumPageTitle": {}, + "newFilterBanner": "új", + "@newFilterBanner": {}, + "chipActionRename": "Átnevezés", + "@chipActionRename": {}, + "entryActionRename": "Átnevezés", + "@entryActionRename": {}, + "keepScreenOnNever": "Soha", + "@keepScreenOnNever": {}, + "videoLoopModeNever": "Soha", + "@videoLoopModeNever": {}, + "videoActionPlay": "Lejátszás", + "@videoActionPlay": {}, + "entryInfoActionRemoveMetadata": "Metaadat eltávolítása", + "@entryInfoActionRemoveMetadata": {}, + "albumTierRegular": "Egyebek", + "@albumTierRegular": {}, + "keepScreenOnAlways": "Mindig", + "@keepScreenOnAlways": {}, + "nameConflictStrategyRename": "Átnevezés", + "@nameConflictStrategyRename": {}, + "themeBrightnessBlack": "Fekete", + "@themeBrightnessBlack": {}, + "menuActionMap": "Térkép", + "@menuActionMap": {}, + "collectionPageTitle": "Gyűjtemény", + "@collectionPageTitle": {}, + "sectionUnknown": "Ismeretlen", + "@sectionUnknown": {}, + "dateYesterday": "Tegnap", + "@dateYesterday": {}, + "drawerAlbumPage": "Albumok", + "@drawerAlbumPage": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "actionRemove": "Eltávolítás", + "@actionRemove": {}, + "chipActionHide": "Elrejtés", + "@chipActionHide": {}, + "chipActionLock": "Zárolás", + "@chipActionLock": {}, + "chipActionSetCover": "Borító beállítása", + "@chipActionSetCover": {}, + "entryActionConvert": "Átalakítás", + "@entryActionConvert": {}, + "entryActionRestore": "Visszaállítás", + "@entryActionRestore": {}, + "entryActionRotateCCW": "Forgatás balra", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Forgatás jobbra", + "@entryActionRotateCW": {}, + "entryActionViewMotionPhotoVideo": "Videó megnyitása", + "@entryActionViewMotionPhotoVideo": {}, + "videoActionPause": "Szünet", + "@videoActionPause": {}, + "videoActionSetSpeed": "Lejátszás sebessége", + "@videoActionSetSpeed": {}, + "slideshowActionResume": "Folytatás", + "@slideshowActionResume": {}, + "entryInfoActionEditLocation": "Hely szerkesztése", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTags": "Címke szerkesztése", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveLocation": "Hely eltávolítása", + "@entryInfoActionRemoveLocation": {}, + "filterBinLabel": "Kuka", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Kedvenc", + "@filterFavouriteLabel": {}, + "filterNoAddressLabel": "Nincs cím", + "@filterNoAddressLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° videó", + "@filterTypeSphericalVideoLabel": {}, + "filterMimeImageLabel": "Kép", + "@filterMimeImageLabel": {}, + "albumTierApps": "Alkalmazások", + "@albumTierApps": {}, + "coordinateDmsNorth": "É", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "D", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "K", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "Ny", + "@coordinateDmsWest": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "mapStyleGoogleNormal": "Google térkép", + "@mapStyleGoogleNormal": {}, + "nameConflictStrategySkip": "Átugrik", + "@nameConflictStrategySkip": {}, + "unitSystemMetric": "Metrikus", + "@unitSystemMetric": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "settingsVideoEnablePip": "Kép a képben", + "@settingsVideoEnablePip": {}, + "videoPlaybackSkip": "Átugrik", + "@videoPlaybackSkip": {}, + "wallpaperTargetHome": "Kezdőképernyő", + "@wallpaperTargetHome": {}, + "widgetDisplayedItemMostRecent": "Legutóbbi", + "@widgetDisplayedItemMostRecent": {}, + "videoResumeButtonLabel": "FOLYTATÁS", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Legutóbbi elem", + "@setCoverDialogLatest": {}, + "setCoverDialogCustom": "Egyéni", + "@setCoverDialogCustom": {}, + "passwordDialogConfirm": "Jelszó megerősítése", + "@passwordDialogConfirm": {}, + "passwordDialogEnter": "Jelszó megadása", + "@passwordDialogEnter": {}, + "pinDialogConfirm": "PIN megerősítése", + "@pinDialogConfirm": {}, + "pinDialogEnter": "PIN megadása", + "@pinDialogEnter": {}, + "editEntryRatingDialogTitle": "Értékelés", + "@editEntryRatingDialogTitle": {}, + "editEntryLocationDialogTitle": "Hely", + "@editEntryLocationDialogTitle": {}, + "exportEntryDialogWidth": "Szélesség", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Magasság", + "@exportEntryDialogHeight": {}, + "exportEntryDialogFormat": "Formátum:", + "@exportEntryDialogFormat": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android könyvtárak", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesSectionTitle": "Nyílt forrású licenszek", + "@aboutLicensesSectionTitle": {}, + "aboutBugReportButton": "Jelentés", + "@aboutBugReportButton": {}, + "coverDialogTabColor": "Szín", + "@coverDialogTabColor": {}, + "tileLayoutList": "Lista", + "@tileLayoutList": {}, + "viewDialogLayoutSectionTitle": "Elrendezés", + "@viewDialogLayoutSectionTitle": {}, + "tileLayoutMosaic": "Mozaik", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "Rács", + "@tileLayoutGrid": {}, + "viewDialogGroupSectionTitle": "Szekciók", + "@viewDialogGroupSectionTitle": {}, + "menuActionStats": "Statisztikák", + "@menuActionStats": {}, + "menuActionConfigureView": "Nézet", + "@menuActionConfigureView": {}, + "menuActionSelect": "Kiválasztás", + "@menuActionSelect": {}, + "menuActionSelectAll": "Összes kijelölése", + "@menuActionSelectAll": {}, + "videoStreamSelectionDialogVideo": "Videó", + "@videoStreamSelectionDialogVideo": {}, + "removeEntryMetadataDialogMore": "Továbbiak", + "@removeEntryMetadataDialogMore": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter beépülők", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter csomagok", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart csomagok", + "@aboutLicensesDartPackagesSectionTitle": {}, + "drawerTagPage": "Címkék", + "@drawerTagPage": {}, + "drawerPlacePage": "Helyek", + "@drawerPlacePage": {}, + "drawerCountryPage": "Országok", + "@drawerCountryPage": {}, + "drawerCollectionSphericalVideos": "360° videó", + "@drawerCollectionSphericalVideos": {}, + "drawerCollectionAll": "Összes gyűjtemény", + "@drawerCollectionAll": {}, + "collectionEmptyImages": "Nincsenek képek", + "@collectionEmptyImages": {}, + "collectionEmptyVideos": "Nincsenek videók", + "@collectionEmptyVideos": {}, + "collectionEmptyFavourites": "Nincsenek kedvencek", + "@collectionEmptyFavourites": {}, + "searchCountriesSectionTitle": "Országok", + "@searchCountriesSectionTitle": {}, + "searchAlbumsSectionTitle": "Albumok", + "@searchAlbumsSectionTitle": {}, + "searchDateSectionTitle": "Dátum", + "@searchDateSectionTitle": {}, + "searchRecentSectionTitle": "Legutóbbi", + "@searchRecentSectionTitle": {}, + "binPageTitle": "Kuka", + "@binPageTitle": {}, + "tagPageTitle": "Címkék", + "@tagPageTitle": {}, + "placePageTitle": "Helyek", + "@placePageTitle": {}, + "countryPageTitle": "Országok", + "@countryPageTitle": {}, + "sortOrderAtoZ": "A-Z", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Z-A", + "@sortOrderZtoA": {}, + "settingsNavigationDrawerTabAlbums": "Albumok", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsHomeDialogTitle": "Kezdőlap", + "@settingsHomeDialogTitle": {}, + "settingsHomeTile": "Kezdőlap", + "@settingsHomeTile": {}, + "appExportSettings": "Beállítások", + "@appExportSettings": {}, + "appExportFavourites": "Kedvencek", + "@appExportFavourites": {}, + "settingsDisabled": "Letiltva", + "@settingsDisabled": {}, + "settingsPageTitle": "Beállítások", + "@settingsPageTitle": {}, + "searchTagsSectionTitle": "Címkék", + "@searchTagsSectionTitle": {}, + "searchPlacesSectionTitle": "Helyek", + "@searchPlacesSectionTitle": {}, + "settingsViewerSlideshowTile": "Diavetités", + "@settingsViewerSlideshowTile": {}, + "settingsViewerMaximumBrightness": "Maximális fényerő", + "@settingsViewerMaximumBrightness": {}, + "settingsCollectionBurstPatternsNone": "Nincs", + "@settingsCollectionBurstPatternsNone": {}, + "settingsSlideshowRepeat": "Ismétlés", + "@settingsSlideshowRepeat": {}, + "settingsViewerSlideshowPageTitle": "Diavetités", + "@settingsViewerSlideshowPageTitle": {}, + "settingsVideoButtonsTile": "Gombok", + "@settingsVideoButtonsTile": {}, + "settingsSubtitleThemePageTitle": "Feliratok", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Ez egy minta.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTile": "Feliratok", + "@settingsSubtitleThemeTile": {}, + "settingsVideoEnableHardwareAcceleration": "Hardveres gyorsítás", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoSectionTitle": "Videó", + "@settingsVideoSectionTitle": {}, + "settingsEnableBin": "Kuka használata", + "@settingsEnableBin": {}, + "viewerInfoPageTitle": "Infó", + "@viewerInfoPageTitle": {}, + "viewerErrorUnknown": "Hoppá!", + "@viewerErrorUnknown": {}, + "statsPageTitle": "Statisztikák", + "@statsPageTitle": {}, + "settingsCollectionTile": "Gyűjtemény", + "@settingsCollectionTile": {}, + "settingsLanguagePageTitle": "Nyelv", + "@settingsLanguagePageTitle": {}, + "settingsLanguageTile": "Nyelv", + "@settingsLanguageTile": {}, + "settingsThemeBrightnessDialogTitle": "Téma", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeBrightnessTile": "Téma", + "@settingsThemeBrightnessTile": {}, + "settingsDisplaySectionTitle": "Kijelző", + "@settingsDisplaySectionTitle": {}, + "viewerInfoSearchSuggestionDate": "Dátum és idő", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoOpenLinkText": "Megnyitás", + "@viewerInfoOpenLinkText": {}, + "mapZoomOutTooltip": "Kicsinyítés", + "@mapZoomOutTooltip": {}, + "mapZoomInTooltip": "Nagyítás", + "@mapZoomInTooltip": {}, + "viewerInfoLabelAddress": "Cím", + "@viewerInfoLabelAddress": {}, + "viewerInfoLabelCoordinates": "Koordináták", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelOwner": "Tulajdonos", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelDuration": "Hossz", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelPath": "Hely", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelSize": "Méret", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelResolution": "Felbontás", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelDate": "Dátum", + "@viewerInfoLabelDate": {}, + "viewerInfoUnknown": "ismeretlen", + "@viewerInfoUnknown": {}, + "sourceViewerPageTitle": "Forrás", + "@sourceViewerPageTitle": {}, + "tagPlaceholderPlace": "Hely", + "@tagPlaceholderPlace": {}, + "tagPlaceholderCountry": "Ország", + "@tagPlaceholderCountry": {}, + "tagEditorSectionRecent": "Legutóbbi", + "@tagEditorSectionRecent": {}, + "viewerInfoSearchSuggestionResolution": "Felbontás", + "@viewerInfoSearchSuggestionResolution": {}, + "tagPlaceholderState": "Megye", + "@tagPlaceholderState": {}, + "tagEditorPageAddTagTooltip": "Címke hozzáadása", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorPageNewTagFieldLabel": "Új címke", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageTitle": "Címkék szerkesztése", + "@tagEditorPageTitle": {}, + "settingsThumbnailSectionTitle": "Miniatűrök", + "@settingsThumbnailSectionTitle": {}, + "settingsVideoControlsPageTitle": "Vezérlők", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoControlsTile": "Vezérlők", + "@settingsVideoControlsTile": {}, + "settingsSubtitleThemeTextAlignmentRight": "Jobbra", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Középen", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Balra", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeBackgroundColor": "Háttér szín", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeTextColor": "Szöveg színe", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextSize": "Szöveg mérete", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Szöveg pozíciója", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSubtitleThemeTextPositionTile": "Szöveg pozíciója", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsVideoShowVideos": "Videók mutatása", + "@settingsVideoShowVideos": {}, + "settingsVideoAutoPlay": "Automatikus lejátszás", + "@settingsVideoAutoPlay": {}, + "settingsVideoPageTitle": "Videó beállítások", + "@settingsVideoPageTitle": {}, + "settingsHiddenItemsPageTitle": "Rejtett elemek", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenItemsTile": "Rejtett elemek", + "@settingsHiddenItemsTile": {}, + "viewerErrorDoesNotExist": "A fájl már nem létezik.", + "@viewerErrorDoesNotExist": {}, + "settingsWidgetPageTitle": "Fotó keret", + "@settingsWidgetPageTitle": {}, + "settingsScreenSaverPageTitle": "Képernyővédő", + "@settingsScreenSaverPageTitle": {}, + "settingsUnitSystemDialogTitle": "Mértékegységek", + "@settingsUnitSystemDialogTitle": {}, + "settingsUnitSystemTile": "Mértékegységek", + "@settingsUnitSystemTile": {}, + "settingsLanguageSectionTitle": "Nyelv és formátumok", + "@settingsLanguageSectionTitle": {}, + "settingsRemoveAnimationsDialogTitle": "Animációk eltávolítása", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsRemoveAnimationsTile": "Animációk eltávolítása", + "@settingsRemoveAnimationsTile": {}, + "viewerInfoSearchFieldLabel": "Metaadat keresése", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoViewXmlLinkText": "XML megtekintése", + "@viewerInfoViewXmlLinkText": {}, + "mapEmptyRegion": "Nincsenek képek ebben a régióban", + "@mapEmptyRegion": {}, + "openMapPageTooltip": "Megtekintés a térképen", + "@openMapPageTooltip": {}, + "mapStyleTooltip": "Térkép stílus választása", + "@mapStyleTooltip": {}, + "mapStyleDialogTitle": "Térkép stílus", + "@mapStyleDialogTitle": {}, + "viewerInfoLabelTitle": "Cím", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDescription": "Leírás", + "@viewerInfoLabelDescription": {}, + "viewerInfoSearchSuggestionDescription": "Leírás", + "@viewerInfoSearchSuggestionDescription": {}, + "welcomeOptional": "Nem kötelező", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Elfogadom a felhasználási feltételeket", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, other{{count} elem}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "showButtonLabel": "MUTAT", + "@showButtonLabel": {}, + "hideButtonLabel": "ELREJTÉS", + "@hideButtonLabel": {}, + "hideTooltip": "Elrejtés", + "@hideTooltip": {}, + "doubleBackExitMessage": "Nyomd meg a „visszát” még egyszer a kilépéshez.", + "@doubleBackExitMessage": {}, + "chipActionGoToAlbumPage": "Megjelenítés az albumokban", + "@chipActionGoToAlbumPage": {}, + "chipActionCreateVault": "Széf készítése", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "Széf beállítása", + "@chipActionConfigureVault": {}, + "chipActionUnpin": "Kitűzés megszüntetése", + "@chipActionUnpin": {}, + "entryActionFlip": "Forgatás vízszintesen", + "@entryActionFlip": {}, + "entryActionViewSource": "Forrás megtekintése", + "@entryActionViewSource": {}, + "entryActionConvertMotionPhotoToStillImage": "Átalakítás állóképpé", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionOpen": "Megnyitás ezzel", + "@entryActionOpen": {}, + "entryActionSetAs": "Beállit, mint", + "@entryActionSetAs": {}, + "entryActionRemoveFavourite": "Eltávolítás a kedvencekből", + "@entryActionRemoveFavourite": {}, + "slideshowActionShowInCollection": "Megjelenítés a gyűjteményekben", + "@slideshowActionShowInCollection": {}, + "chipActionShowCountryStates": "Megyék megjelenítése", + "@chipActionShowCountryStates": {}, + "entryInfoActionEditTitleDescription": "Cím és leírás szerkesztése", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Értékelés szerkesztése", + "@entryInfoActionEditRating": {}, + "entryInfoActionExportMetadata": "Metaadat exportálása", + "@entryInfoActionExportMetadata": {}, + "keepScreenOnVideoPlayback": "Videólejátszás alatt", + "@keepScreenOnVideoPlayback": {}, + "mapStyleGoogleHybrid": "Google térkép (Hibrid)", + "@mapStyleGoogleHybrid": {}, + "filterTaggedLabel": "Cimkézett", + "@filterTaggedLabel": {}, + "filterNoTagLabel": "Cimkézetlen", + "@filterNoTagLabel": {}, + "filterTypeMotionPhotoLabel": "Mozgó fotók", + "@filterTypeMotionPhotoLabel": {}, + "albumTierVaults": "Széfek", + "@albumTierVaults": {}, + "displayRefreshRatePreferHighest": "Legmagasabb érték", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Legalacsonyabb érték", + "@displayRefreshRatePreferLowest": {}, + "filterAspectRatioPortraitLabel": "Álló", + "@filterAspectRatioPortraitLabel": {}, + "filterAspectRatioLandscapeLabel": "Fekvő", + "@filterAspectRatioLandscapeLabel": {}, + "filterNoRatingLabel": "Nincs értékelés", + "@filterNoRatingLabel": {}, + "filterTypeAnimatedLabel": "Animált", + "@filterTypeAnimatedLabel": {}, + "mapStyleGoogleTerrain": "Google térkép (Domborzat)", + "@mapStyleGoogleTerrain": {}, + "nameConflictStrategyReplace": "Kicserél", + "@nameConflictStrategyReplace": {}, + "subtitlePositionTop": "Felül", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "Alul", + "@subtitlePositionBottom": {}, + "themeBrightnessLight": "Világos", + "@themeBrightnessLight": {}, + "vaultLockTypePattern": "Minta", + "@vaultLockTypePattern": {}, + "videoPlaybackMuted": "Lejátszás némítva", + "@videoPlaybackMuted": {}, + "rootDirectoryDescription": "gyökér mappa", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "„{name}” mappa", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "addShortcutButtonLabel": "HOZZÁAD", + "@addShortcutButtonLabel": {}, + "renameEntrySetPagePreviewSectionTitle": "Előnézet", + "@renameEntrySetPagePreviewSectionTitle": {}, + "moveUndatedConfirmationDialogSetDate": "Dátumok mentése", + "@moveUndatedConfirmationDialogSetDate": {}, + "newVaultDialogTitle": "Új széf", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "Széf konfigurálása", + "@configureVaultDialogTitle": {}, + "vaultDialogLockTypeLabel": "Zárolás típusa", + "@vaultDialogLockTypeLabel": {}, + "patternDialogEnter": "Minta megadása", + "@patternDialogEnter": {}, + "patternDialogConfirm": "Minta megerősítése", + "@patternDialogConfirm": {}, + "vaultDialogLockModeWhenScreenOff": "Zárolás képernyő kikapcsoláskor", + "@vaultDialogLockModeWhenScreenOff": {}, + "renameEntrySetPagePatternFieldLabel": "Elnevezési minta", + "@renameEntrySetPagePatternFieldLabel": {}, + "removeEntryMetadataDialogTitle": "Metaadat eltávolítása", + "@removeEntryMetadataDialogTitle": {}, + "editEntryLocationDialogLongitude": "Hosszúság", + "@editEntryLocationDialogLongitude": {}, + "editEntryLocationDialogLatitude": "Szélesség", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogChooseOnMap": "Kijelölés térképen", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogSetCustom": "Egyéni hely beállítása", + "@editEntryLocationDialogSetCustom": {}, + "durationDialogSeconds": "Másodperc", + "@durationDialogSeconds": {}, + "durationDialogMinutes": "Perc", + "@durationDialogMinutes": {}, + "durationDialogHours": "Óra", + "@durationDialogHours": {}, + "editEntryDateDialogSetCustom": "Egyéni dátum beállítása", + "@editEntryDateDialogSetCustom": {}, + "renameProcessorCounter": "Számláló", + "@renameProcessorCounter": {}, + "editEntryDateDialogSourceFileModifiedDate": "Fájl módosítás dátuma", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "aboutLicensesBanner": "Használt nyílt forrású csomagok és könyvtárak.", + "@aboutLicensesBanner": {}, + "aboutBugCopyInfoInstruction": "Rendszer információ másolása", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugSaveLogInstruction": "Naplófájlok mentése", + "@aboutBugSaveLogInstruction": {}, + "aboutLinkPolicy": "Adatvédelmi irányelvek", + "@aboutLinkPolicy": {}, + "coverDialogTabApp": "Alkalmazás", + "@coverDialogTabApp": {}, + "viewDialogSortSectionTitle": "Rendezés", + "@viewDialogSortSectionTitle": {}, + "tooManyItemsErrorDialogMessage": "Próbáld újra kevesebb elemmel.", + "@tooManyItemsErrorDialogMessage": {}, + "videoStreamSelectionDialogAudio": "Audió", + "@videoStreamSelectionDialogAudio": {}, + "videoSpeedDialogLabel": "Lejátszás sebessége", + "@videoSpeedDialogLabel": {}, + "collectionSelectPageTitle": "Elemek kiválasztása", + "@collectionSelectPageTitle": {}, + "policyPageTitle": "Adatvédelmi irányelvek", + "@policyPageTitle": {}, + "aboutLicensesShowAllButtonLabel": "Minden licensz megjelenítése", + "@aboutLicensesShowAllButtonLabel": {}, + "collectionEmptyGrantAccessButtonLabel": "Hozzáférés biztosítása", + "@collectionEmptyGrantAccessButtonLabel": {}, + "drawerCollectionAnimated": "Animált", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Mozgó fotók", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionRaws": "Raw fotók", + "@drawerCollectionRaws": {}, + "sortByDate": "Dátum", + "@sortByDate": {}, + "sortBySize": "Méret", + "@sortBySize": {}, + "sortByName": "Név", + "@sortByName": {}, + "sortByItemCount": "Elemek száma", + "@sortByItemCount": {}, + "sortByAlbumFileName": "Album és cím szerint", + "@sortByAlbumFileName": {}, + "sortByRating": "Értékelés", + "@sortByRating": {}, + "sortOrderNewestFirst": "Legújabb legelöl", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Legrégebbi legelöl", + "@sortOrderOldestFirst": {}, + "sortOrderLargestFirst": "Legnagyobb legelöl", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "Legkisebb legelöl", + "@sortOrderSmallestFirst": {}, + "albumGroupType": "Típus szerint", + "@albumGroupType": {}, + "albumPickPageTitleCopy": "Másolás albumba", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Exportálás albumba", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Áthelyezés albumba", + "@albumPickPageTitleMove": {}, + "albumScreenRecordings": "Képernyőfelvételek", + "@albumScreenRecordings": {}, + "albumEmpty": "Nincsenek albumok", + "@albumEmpty": {}, + "createAlbumButtonLabel": "LÉTREHOZÁS", + "@createAlbumButtonLabel": {}, + "countryEmpty": "Nincsenek országok", + "@countryEmpty": {}, + "statePageTitle": "Megyék", + "@statePageTitle": {}, + "stateEmpty": "Nincsenek megyék", + "@stateEmpty": {}, + "placeEmpty": "Nincsenek helyek", + "@placeEmpty": {}, + "tagEmpty": "Nincsenek címkék", + "@tagEmpty": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Videó lejátszás", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsSlideshowVideoPlaybackTile": "Videó lejátszás", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Szöveg pozíciója", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextAlignmentTile": "Szöveg pozíciója", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsVideoLoopModeDialogTitle": "Ismétlés", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsVideoLoopModeTile": "Ismétlés", + "@settingsVideoLoopModeTile": {}, + "viewerSetWallpaperButtonLabel": "BEÁLLÍTÁS HÁTTÉRKÉPNEK", + "@viewerSetWallpaperButtonLabel": {}, + "statsTopAlbumsSectionTitle": "Legjobb albumok", + "@statsTopAlbumsSectionTitle": {}, + "statsTopTagsSectionTitle": "Legjobb címkék", + "@statsTopTagsSectionTitle": {}, + "statsTopPlacesSectionTitle": "Legjobb helyek", + "@statsTopPlacesSectionTitle": {}, + "statsTopStatesSectionTitle": "Legjobb megyék", + "@statsTopStatesSectionTitle": {}, + "statsTopCountriesSectionTitle": "Legjobb országok", + "@statsTopCountriesSectionTitle": {}, + "settingsCoordinateFormatDialogTitle": "Koordináták formátuma", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsCoordinateFormatTile": "Koordináták formátuma", + "@settingsCoordinateFormatTile": {}, + "chipActionPin": "Kitűzés felülre", + "@chipActionPin": {}, + "videoControlsPlayOutside": "Megnyitás másik lejátszóval", + "@videoControlsPlayOutside": {}, + "videoPlaybackWithSound": "Lejátszás hanggal", + "@videoPlaybackWithSound": {}, + "videoLoopModeShortOnly": "Csak rövid videók", + "@videoLoopModeShortOnly": {}, + "wallpaperUseScrollEffect": "Görgetés használata kezdőképernyőn", + "@wallpaperUseScrollEffect": {}, + "editEntryDialogCopyFromItem": "Másolás másik elemről", + "@editEntryDialogCopyFromItem": {}, + "exportEntryDialogWriteMetadata": "Metaadat írása", + "@exportEntryDialogWriteMetadata": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Frissítési ráta", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsThemeEnableDynamicColor": "Dinamikus szín", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Képernyőfrissítési ráta", + "@settingsDisplayRefreshRateModeTile": {}, + "showTooltip": "Megjelenítés", + "@showTooltip": {}, + "wallpaperTargetLock": "Lezárási képernyő", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Kezdő és lezárási képernyő", + "@wallpaperTargetHomeLock": {}, + "widgetDisplayedItemRandom": "Véletlenszerű", + "@widgetDisplayedItemRandom": {}, + "widgetOpenPageCollection": "Gyűjtemény megnyitása", + "@widgetOpenPageCollection": {}, + "renameEntrySetPageInsertTooltip": "Mező beszúrása", + "@renameEntrySetPageInsertTooltip": {}, + "timeDays": "{count, plural, other{{count} nap}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "changeTooltip": "Változtat", + "@changeTooltip": {}, + "clearTooltip": "Töröl", + "@clearTooltip": {}, + "resetTooltip": "Visszaállít", + "@resetTooltip": {}, + "columnCount": "{count, plural, other{{count} oszlop}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeSeconds": "{count, plural, other{{count} másodperc}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "timeMinutes": "{count, plural, other{{count} perc}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "sourceStateLocatingCountries": "Országok meghatározása", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Helyek meghatározása", + "@sourceStateLocatingPlaces": {}, + "chipActionGoToCountryPage": "Megjelenítés az országokban", + "@chipActionGoToCountryPage": {}, + "chipActionGoToPlacePage": "Megjelenítés a helyekben", + "@chipActionGoToPlacePage": {}, + "chipActionGoToTagPage": "Megjelenítés a címkékben", + "@chipActionGoToTagPage": {}, + "sourceStateCataloguing": "Katalógus", + "@sourceStateCataloguing": {}, + "pickTooltip": "Kiválaszt", + "@pickTooltip": {}, + "entryActionShareImageOnly": "Csak kép megosztása", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "Csak videó megosztása", + "@entryActionShareVideoOnly": {}, + "entryActionOpenMap": "Megjelenítés térkép alkalmazásban", + "@entryActionOpenMap": {}, + "videoActionReplay10": "Ugrás vissza 10 másodpercet", + "@videoActionReplay10": {}, + "videoActionSkip10": "Ugrás előre 10 másodpercet", + "@videoActionSkip10": {}, + "viewerActionLock": "Megtekintő zárolása", + "@viewerActionLock": {}, + "viewerActionUnlock": "Megtekintő feloldása", + "@viewerActionUnlock": {}, + "videoActionUnmute": "Némítás feloldása", + "@videoActionUnmute": {}, + "videoActionSelectStreams": "Sávok kiválasztása", + "@videoActionSelectStreams": {}, + "filterNoDateLabel": "Nincs dátum", + "@filterNoDateLabel": {}, + "filterLocatedLabel": "Hely információval rendelkezők", + "@filterLocatedLabel": {}, + "filterNoLocationLabel": "Hely információ nélküliek", + "@filterNoLocationLabel": {}, + "filterRatingRejectedLabel": "Elutasított", + "@filterRatingRejectedLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "albumTierPinned": "Kitűzött", + "@albumTierPinned": {}, + "albumTierSpecial": "Gyakori", + "@albumTierSpecial": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Tizedes fokok", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "accessibilityAnimationsRemove": "Animációk mellőzése", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Animációk megtartása", + "@accessibilityAnimationsKeep": {}, + "keepScreenOnViewerOnly": "Csak a megtekintőnél", + "@keepScreenOnViewerOnly": {}, + "viewerTransitionSlide": "Csúsztatás", + "@viewerTransitionSlide": {}, + "viewerTransitionFade": "Áttünés", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "Nagyítás", + "@viewerTransitionZoomIn": {}, + "widgetOpenPageHome": "Kezdőlap megnyitása", + "@widgetOpenPageHome": {}, + "widgetOpenPageViewer": "Megtekintő megnyitása", + "@widgetOpenPageViewer": {}, + "storageAccessDialogMessage": "Válaszd ki a {directory} mappát a „{volume}” tárhelyen a következő képernyőn, hogy az Aves hozzáférjen.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "restrictedAccessDialogMessage": "Az Avesnek nincs engedélyezve, hogy módosításokat végezzen a {directory} mappában a „{volume}” tárhelyen.\n\nHasználd a telefon fájlkezelőjét vagy galériáját az elemek másik mappába helyezéséhez.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "missingSystemFilePickerDialogMessage": "A rendszer fájlkezelője hiányzik vagy letiltott. Engedélyezd és próbáld újra.", + "@missingSystemFilePickerDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "Néhány fájl neve ugyanaz a cél mappában.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "Néhány fájl neve ugyanaz.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "Parancsikon címke", + "@addShortcutDialogLabel": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Törlöd ezt az elemet?} other{Törlöd ezt a {count} elemet?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "moveUndatedConfirmationDialogMessage": "Mented az elemek dátumait a végrehajtás előtt?", + "@moveUndatedConfirmationDialogMessage": {}, + "videoStartOverButtonLabel": "KEZDÉS ELÖLRŐL", + "@videoStartOverButtonLabel": {}, + "setCoverDialogAuto": "Automatikus", + "@setCoverDialogAuto": {}, + "noMatchingAppDialogMessage": "Nincs alkalmazás ami elboldogul ezzel.", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Áthelyezed a kukába?} other{Áthelyezed a {count} elemet a kukába?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoResumeDialogMessage": "Folytatod a lejátszást innen: {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "vaultBinUsageDialogMessage": "Néhány széf használja a kukát.", + "@vaultBinUsageDialogMessage": {}, + "newVaultWarningDialogMessage": "A széfben lévő elemek csak ebben az alkalmazásban érhetőek el.\n\nHa eltávolítod az alkalmazást vagy törlöd az adatokat, ezeket az elemeket is elveszíted.", + "@newVaultWarningDialogMessage": {}, + "authenticateToConfigureVault": "Azonosítás a széf beállításához", + "@authenticateToConfigureVault": {}, + "authenticateToUnlockVault": "Azonosítás a széf feloldásához", + "@authenticateToUnlockVault": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Törlöd ezt az albumot és az egy elemet benne ?} other{Törlöd ezt az albumot és a benne levő {count} elemet?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Törlöd ezt az albumot és az egy elemet benne ?} other{Törlöd ezt az albumot és a benne levő {count} elemet?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editEntryDateDialogCopyField": "Másolás másik dátumról", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogExtractFromTitle": "Kibontás a címből", + "@editEntryDateDialogExtractFromTitle": {}, + "locationPickerUseThisLocationButton": "Használd ezt a helyet", + "@locationPickerUseThisLocationButton": {}, + "editEntryDialogTargetFieldsHeader": "Módosítandó mezők", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogShift": "Csúsztatás", + "@editEntryDateDialogShift": {}, + "aboutBugReportInstruction": "Jelentés GitHub-on naplófájlokkal és rendszer információval", + "@aboutBugReportInstruction": {}, + "aboutCreditsSectionTitle": "Készítők", + "@aboutCreditsSectionTitle": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Az XMP szükséges a mozgó fotókban lévő videó lejátszásához.\n\nBiztosan eltávolítod?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "videoStreamSelectionDialogTrack": "Sáv", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "Nincsenek más sávok.", + "@videoStreamSelectionDialogNoSelection": {}, + "menuActionSelectNone": "Kijelölés megszüntetése", + "@menuActionSelectNone": {}, + "viewDialogReverseSortOrder": "Fordított sorrend", + "@viewDialogReverseSortOrder": {}, + "appPickDialogTitle": "Alkalmazás választása", + "@appPickDialogTitle": {}, + "collectionPickPageTitle": "Választ", + "@collectionPickPageTitle": {}, + "collectionActionAddShortcut": "Parancsikon készítése", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "A kuka üres", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Másolás albumba", + "@collectionActionCopy": {}, + "collectionActionMove": "Áthelyezés albumba", + "@collectionActionMove": {}, + "collectionActionRescan": "Újraolvasás", + "@collectionActionRescan": {}, + "collectionSearchTitlesHintText": "Címek keresése", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "Albumok szerint", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Hónapok szerint", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Napok szerint", + "@collectionGroupDay": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Elem törlése sikertelen} other{{count} elem törlése sikertelen}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopyFailureFeedback": "{count, plural, =1{Elem másolása sikertelen} other{{count} elem másolása sikertelen}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{Elem áthelyezése sikertelen} other{{count} elem áthelyezése sikertelen}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameFailureFeedback": "{count, plural, =1{Elem átnevezése sikertelen} other{{count} elem átnevezése sikertelen}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{Elem szerkesztése sikertelen} other{{count} elem szerkesztése sikertelen}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{1 elem áthelyezve} other{{count} elem áthelyezve}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{1 elem átnevezve} other{{count} elem átnevezve}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{1 elem szerkesztve} other{{count} elem szerkesztve}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, =1{1 elem másolva} other{{count} elem másolva}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sortOrderHighestFirst": "Legmagasabb legelöl", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Legalacsonyabb legelöl", + "@sortOrderLowestFirst": {}, + "albumPickPageTitlePick": "Album választása", + "@albumPickPageTitlePick": {}, + "searchCollectionFieldHint": "Gyűjtemény keresése", + "@searchCollectionFieldHint": {}, + "searchStatesSectionTitle": "Megyék", + "@searchStatesSectionTitle": {}, + "settingsNavigationDrawerEditorPageTitle": "Navigációs menü", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerTile": "Navigációs menü", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerTabTypes": "Típusok", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabPages": "Oldalak", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Album hozzáadása", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailShowFavouriteIcon": "Kedvenc ikon mutatása", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Címke ikon mutatása", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Hely ikon mutatása", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Mozgó fotó ikon mutatása", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "Értékelés mutatása", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Raw ikon mutatása", + "@settingsThumbnailShowRawIcon": {}, + "searchRatingSectionTitle": "Értékelések", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "Metaadat", + "@searchMetadataSectionTitle": {}, + "settingsSystemDefault": "Rendszer alapértéke", + "@settingsSystemDefault": {}, + "settingsDefault": "Alapértelmezett", + "@settingsDefault": {}, + "settingsSearchFieldLabel": "Keresési beállítások", + "@settingsSearchFieldLabel": {}, + "settingsActionExport": "Exportálás", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "Exportálás", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "Importálás", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Importálás", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "Borítóképek", + "@appExportCovers": {}, + "settingsNavigationSectionTitle": "Navigáció", + "@settingsNavigationSectionTitle": {}, + "settingsKeepScreenOnTile": "Kijelző bekapcsolva tartása", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Kijelző bekapcsolva tartása", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsConfirmationTile": "Megerősítési kérdések", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "Megerősítési kérdések", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Kérdés az elemek végleges törlése előtt", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "Kérdés az elemek kukába helyezése előtt", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Kérdés a dátum nélküli elemek áthelyezése előtt", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Üzenet az elemek kukába helyezése után", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsThumbnailOverlayTile": "Átfedés", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Átfedés", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsModificationWarningDialogMessage": "Egyéb beállítások is módosítva lesznek.", + "@settingsModificationWarningDialogMessage": {}, + "settingsSearchEmpty": "Nincs egyező beállítás", + "@settingsSearchEmpty": {}, + "settingsConfirmationVaultDataLoss": "Széf adatvesztési figyelmeztetés mutatása", + "@settingsConfirmationVaultDataLoss": {}, + "settingsCollectionQuickActionTabSelecting": "Kiválasztás", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsThumbnailShowVideoDuration": "Videó hosszának mutatása", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionTabBrowsing": "Böngészés", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsMotionPhotoAutoPlay": "Mozgó fotók lejátszása", + "@settingsMotionPhotoAutoPlay": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Megjelenített gombok", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Elérhető gombok", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Nincsenek gombok", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerShowMinimap": "Mini térkép mutatása", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Információ mutatása", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "Cím, dátum, hely, stb. mutatása", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowRatingTags": "Értékelés és címkék mutatása", + "@settingsViewerShowRatingTags": {}, + "settingsViewerShowDescription": "Leírás mutatása", + "@settingsViewerShowDescription": {}, + "settingsViewerShowOverlayThumbnails": "Miniatűrök mutatása", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsCollectionQuickActionsTile": "Gyors műveletek", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Gyors műveletek", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsViewerSectionTitle": "Megtekintő", + "@settingsViewerSectionTitle": {}, + "settingsViewerUseCutout": "Képernyő kivágási terület használata", + "@settingsViewerUseCutout": {}, + "settingsImageBackground": "Fénykép háttere", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Gyors műveletek", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Gyors műveletek", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerOverlayTile": "Átfedés", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "Átfedés", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "Megjelenítés megnyitáskor", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerEnableOverlayBlurEffect": "Elmosódási hatás", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsSlideshowShuffle": "Keverés", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Képernyő kitöltése", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowAnimatedZoomEffect": "Animált nagyítási hatás", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "Áttünés", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Hossz", + "@settingsSlideshowIntervalTile": {}, + "settingsVideoBackgroundMode": "Lejátszás háttérben", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "Lejátszás háttérben", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsPrivacySectionTitle": "Adatvédelem", + "@settingsPrivacySectionTitle": {}, + "settingsSubtitleThemeShowOutline": "Körvonal és árnyék megjelenítése", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextOpacity": "Szöveg átlátszósága", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundOpacity": "Háttér átlátszósága", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Lejátszás/szünet dupla koppintással", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Fényerő/hangerő módosítása fel vagy lefelé csúsztatással", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsAllowErrorReporting": "Névtelen hibajelentés engedélyezése", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Keresési előzmény mentése", + "@settingsSaveSearchHistory": {}, + "settingsEnableBinSubtitle": "Törölt elemek megőrzése 30 napig", + "@settingsEnableBinSubtitle": {}, + "settingsAllowMediaManagement": "Média kezelés engedélyezése", + "@settingsAllowMediaManagement": {}, + "settingsHiddenFiltersEmpty": "Nincsenek rejtett szűrők", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Tárhely hozzáférés", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "Tárhely hozzáférés", + "@settingsStorageAccessPageTitle": {}, + "settingsDisablingBinWarningDialogMessage": "A kukában lévő elemek örökre törlésre kerülnek.", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsStorageAccessRevokeTooltip": "Megvonás", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Kisegítő lehetőségek", + "@settingsAccessibilitySectionTitle": {}, + "settingsDisplayUseTvInterface": "Android TV felület", + "@settingsDisplayUseTvInterface": {}, + "settingsWidgetShowOutline": "Körvonal", + "@settingsWidgetShowOutline": {}, + "settingsWidgetDisplayedItem": "Megjelenített elem", + "@settingsWidgetDisplayedItem": {}, + "viewerOpenPanoramaButtonLabel": "PANORÁMA MEGNYITÁSA", + "@viewerOpenPanoramaButtonLabel": {}, + "statsWithGps": "{count, plural, other{{count} elem helyadatokkal}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsStorageAccessEmpty": "Nincsenek jogok megadva", + "@settingsStorageAccessEmpty": {}, + "settingsWidgetOpenPage": "Widgetre koppintáskor", + "@settingsWidgetOpenPage": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Sikertelen a metaadatok kicsomagolása", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoBackToViewerTooltip": "Vissza a megtekintőhöz", + "@viewerInfoBackToViewerTooltip": {}, + "mapPointNorthUpTooltip": "Mindig észak felé", + "@mapPointNorthUpTooltip": {}, + "viewerInfoSearchSuggestionDimensions": "Méretek", + "@viewerInfoSearchSuggestionDimensions": {}, + "panoramaDisableSensorControl": "Szenzoros vezérlés letiltása", + "@panoramaDisableSensorControl": {}, + "panoramaEnableSensorControl": "Szenzoros vezérlés engedélyezése", + "@panoramaEnableSensorControl": {}, + "collectionActionShowTitleSearch": "Cím szűrő mutatása", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Cím szűrő elrejtése", + "@collectionActionHideTitleSearch": {}, + "albumGroupVolume": "Tárhely alapján", + "@albumGroupVolume": {}, + "tagEditorSectionPlaceholders": "Helyszűrők", + "@tagEditorSectionPlaceholders": {}, + "entryActionShowGeoTiffOnMap": "Térképre helyezve", + "@entryActionShowGeoTiffOnMap": {}, + "videoActionCaptureFrame": "Képkocka mentése", + "@videoActionCaptureFrame": {}, + "unitSystemImperial": "Angolszász", + "@unitSystemImperial": {}, + "notEnoughSpaceDialogMessage": "Ehhez a művelethez {neededSize} szabad helyre van szükség itt: „{volume}”, de csak {freeSize} szabad.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Akvarell", + "@mapStyleStamenWatercolor": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Ez a művelet nem támogatott a következő típusú elemnél: {types}.} other{Ez a művelet nem támogatott a következő típusú elemeknél: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "hideFilterConfirmationDialogMessage": "Az egyező képek és videók el lesznek rejtve a gyűjteményedből. Újra megjelenítheted ezeket az „Adatvédelem” beállításokban.\n\nBiztosan el akarod rejteni őket?", + "@hideFilterConfirmationDialogMessage": {}, + "aboutCreditsWorldAtlas1": "Ez az app egy TopoJSON fájlt használ", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "oldalról ISC Licenccel.", + "@aboutCreditsWorldAtlas2": {}, + "collectionExportFailureFeedback": "{count, plural, =1{Nem sikerült exportálni 1 oldalt} other{Nem sikerült exportálni {count} oldalt}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionDeselectSectionTooltip": "Szakasz kijelölésének megszüntetése", + "@collectionDeselectSectionTooltip": {}, + "collectionSelectSectionTooltip": "Szakasz kijelölése", + "@collectionSelectSectionTooltip": {}, + "albumMimeTypeMixed": "Vegyesen", + "@albumMimeTypeMixed": {}, + "albumGroupTier": "Szint szerint", + "@albumGroupTier": {}, + "settingsNavigationDrawerBanner": "Érintsd és tartsd lenyomva a menü elemek mozgatásához és átrendezéshez.", + "@settingsNavigationDrawerBanner": {}, + "settingsDoubleBackExit": "Nyomd meg a „visszát” kétszer a kilépéshez", + "@settingsDoubleBackExit": {}, + "settingsViewerShowShootingDetails": "Fényképezés részleteinek mutatása", + "@settingsViewerShowShootingDetails": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Érintsd és tartsd lenyomva a gombok mozgatásához, válaszd ki az elemek böngészésekor megjelenő műveleteket.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Érintsd és tartsd lenyomva a gombok mozgatásához, válaszd ki az elemek kiválasztásakor megjelenő műveleteket.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsCollectionBurstPatternsTile": "Sorozatfelvételi minták", + "@settingsCollectionBurstPatternsTile": {}, + "settingsViewerGestureSideTapNext": "Koppints a képernyő szélein az előző/következő elemhez", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerQuickActionEditorBanner": "Érintsd és tartsd lenyomva a gombok mozgatásához, válaszd ki a megtekintőben megjelenő műveleteket.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsVideoGestureSideDoubleTapSeek": "Előre/hátra tekerés dupla koppintással a képernyő szélein", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsAllowInstalledAppAccessSubtitle": "Az album megjelenítésének javítására szolgál", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowInstalledAppAccess": "Hozzáférés engedélyezése az app leltárhoz", + "@settingsAllowInstalledAppAccess": {}, + "settingsHiddenFiltersBanner": "A rejtett szűrőknek megfelelő képek és videók nem jelennek meg a gyűjteményében.", + "@settingsHiddenFiltersBanner": {}, + "settingsTimeToTakeActionTile": "Ideje cselekedni", + "@settingsTimeToTakeActionTile": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Mutasson alternatív többujjas kézmozdulatokat", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsStorageAccessBanner": "Egyes könyvtárak kifejezett hozzáférési engedélyt igényelnek a benne lévő fájlok módosításához. Itt áttekintheted a könyvtárakat, amelyekhez korábban hozzáférést adtál.", + "@settingsStorageAccessBanner": {}, + "viewerInfoSearchEmpty": "Nincs egyező kulcs", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionRights": "Jogok", + "@viewerInfoSearchSuggestionRights": {}, + "albumVideoCaptures": "Képkocka mentések", + "@albumVideoCaptures": {}, + "chipActionFilterOut": "Nem tartalmazza", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Tartalmazza", + "@chipActionFilterIn": {}, + "viewerTransitionParallax": "Parallaxis", + "@viewerTransitionParallax": {}, + "settingsThemeColorHighlights": "Szín kiemelés", + "@settingsThemeColorHighlights": {}, + "settingsAskEverytime": "Mindig rákérdez", + "@settingsAskEverytime": {}, + "maxBrightnessNever": "Soha", + "@maxBrightnessNever": {}, + "settingsVideoPlaybackPageTitle": "Lejátszás", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoResumptionModeTile": "Lejátszás folytatása", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoResumptionModeDialogTitle": "Lejátszás folytatása", + "@settingsVideoResumptionModeDialogTitle": {}, + "tagEditorDiscardDialogMessage": "Elveted a változtatásokat?", + "@tagEditorDiscardDialogMessage": {}, + "videoResumptionModeNever": "Soha", + "@videoResumptionModeNever": {}, + "maxBrightnessAlways": "Mindig", + "@maxBrightnessAlways": {}, + "videoResumptionModeAlways": "Mindig", + "@videoResumptionModeAlways": {}, + "settingsVideoPlaybackTile": "Visszajátszás", + "@settingsVideoPlaybackTile": {}, + "exportEntryDialogQuality": "Minőség", + "@exportEntryDialogQuality": {}, + "editorActionTransform": "Alakítás", + "@editorActionTransform": {}, + "cropAspectRatioOriginal": "Eredeti", + "@cropAspectRatioOriginal": {}, + "applyTooltip": "Alkalmaz", + "@applyTooltip": {}, + "saveCopyButtonLabel": "MÁSOLAT MENTÉSE", + "@saveCopyButtonLabel": {}, + "editorTransformCrop": "Vágás", + "@editorTransformCrop": {}, + "editorTransformRotate": "Forgatás", + "@editorTransformRotate": {}, + "cropAspectRatioSquare": "Négyzet", + "@cropAspectRatioSquare": {}, + "cropAspectRatioFree": "Kötetlen", + "@cropAspectRatioFree": {}, + "widgetTapUpdateWidget": "Widget frissítése", + "@widgetTapUpdateWidget": {}, + "aboutDataUsageData": "Adat", + "@aboutDataUsageData": {}, + "aboutDataUsageDatabase": "Adatbázis", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageMisc": "Egyéb", + "@aboutDataUsageMisc": {}, + "aboutDataUsageInternal": "Belső", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "Külső", + "@aboutDataUsageExternal": {}, + "aboutDataUsageSectionTitle": "Adatforgalom", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageCache": "Gyorsítótár", + "@aboutDataUsageCache": {}, + "overlayHistogramNone": "Nincs", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "overlayHistogramLuminance": "Fényerő", + "@overlayHistogramLuminance": {}, + "settingsViewerShowHistogram": "Hisztogram megjelenítése", + "@settingsViewerShowHistogram": {}, + "aboutDataUsageClearCache": "Gyorsítótár törlése", + "@aboutDataUsageClearCache": {}, + "entryActionCast": "Kivetítés", + "@entryActionCast": {}, + "castDialogTitle": "Kivetítő eszközök", + "@castDialogTitle": {}, + "settingsThumbnailShowHdrIcon": "HDR ikon megjelenítése", + "@settingsThumbnailShowHdrIcon": {}, + "collectionActionSetHome": "Kezdőlapnak beállít", + "@collectionActionSetHome": {}, + "stopTooltip": "Állj", + "@stopTooltip": {}, + "videoRepeatActionSetStart": "Kezdőpont beállítása", + "@videoRepeatActionSetStart": {}, + "videoActionABRepeat": "A-B ismétlés", + "@videoActionABRepeat": {}, + "videoRepeatActionSetEnd": "Végpont beállítása", + "@videoRepeatActionSetEnd": {}, + "chipActionShowCollection": "Megjelenítés a gyűjteményekben", + "@chipActionShowCollection": {}, + "sortByDuration": "Hossz szerint", + "@sortByDuration": {}, + "explorerActionSelectStorageVolume": "Tároló kiválasztása", + "@explorerActionSelectStorageVolume": {}, + "setHomeCustom": "Egyéni", + "@setHomeCustom": {}, + "sortOrderShortestFirst": "Legrövidebb legelöl", + "@sortOrderShortestFirst": {}, + "explorerPageTitle": "Böngésző", + "@explorerPageTitle": {}, + "sortOrderLongestFirst": "Leghosszabb legelöl", + "@sortOrderLongestFirst": {}, + "selectStorageVolumeDialogTitle": "Tároló Kiválasztása", + "@selectStorageVolumeDialogTitle": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapAttributionOsmData": "Térképadatok © [OpenStreetMap](https://www.openstreetmap.org/copyright) közreműködők", + "@mapAttributionOsmData": {}, + "mapAttributionOsmHot": "Csempék: [HOT](https://www.hotosm.org/) • Kiszolgálja: [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "Csempék: [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Csempék: [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "mapAttributionOsmLiberty": "Csempék: [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Kiszolgálja: [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "renameProcessorHash": "Hash-kulcs", + "@renameProcessorHash": {}, + "settingsForceWesternArabicNumeralsTile": "Arab számok használata", + "@settingsForceWesternArabicNumeralsTile": {}, + "chipActionGoToExplorerPage": "Mutatás a böngészőben", + "@chipActionGoToExplorerPage": {}, + "videoActionShowNextFrame": "Következő képkocka mutatása", + "@videoActionShowNextFrame": {}, + "videoActionShowPreviousFrame": "Előző képkocka mutatása", + "@videoActionShowPreviousFrame": {}, + "dynamicAlbumAlreadyExists": "A dinamikus album már létezik", + "@dynamicAlbumAlreadyExists": {}, + "collectionActionAddDynamicAlbum": "Dinamikus album hozzáadása", + "@collectionActionAddDynamicAlbum": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Az album már létezik", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "chipActionRemove": "Eltávolítás", + "@chipActionRemove": {}, + "albumTierDynamic": "Dinamikus", + "@albumTierDynamic": {}, + "newDynamicAlbumDialogTitle": "Új Dinamikus Album", + "@newDynamicAlbumDialogTitle": {}, + "appExportDynamicAlbums": "Dinamikus albumok", + "@appExportDynamicAlbums": {}, + "chipActionDecompose": "Felosztás", + "@chipActionDecompose": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "editEntryLocationDialogImportGpx": "GPX importálás", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "Időeltolódás", + "@editEntryLocationDialogTimeShift": {}, + "removeEntryMetadataDialogAll": "Összes", + "@removeEntryMetadataDialogAll": {}, + "sortByPath": "Útvonal szerint", + "@sortByPath": {}, + "chipActionCreateGroup": "Csoport létrehozása", + "@chipActionCreateGroup": {}, + "albumTierGroups": "Csoportok", + "@albumTierGroups": {}, + "chipActionGroup": "Csoportosítás módosítása", + "@chipActionGroup": {}, + "createButtonLabel": "LÉTREHOZÁS", + "@createButtonLabel": {}, + "newGroupDialogTitle": "Új csoport", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Csoport neve", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "Csoport már létezik", + "@groupAlreadyExists": {}, + "groupEmpty": "Nincsenek csoportok", + "@groupEmpty": {}, + "ungrouped": "Csoportosítatlan", + "@ungrouped": {}, + "groupPickerTitle": "Válassza ki a csoportot", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Használja ezt a csoportot", + "@groupPickerUseThisGroupButton": {}, + "searchFormatSectionTitle": "Formátumok", + "@searchFormatSectionTitle": {}, + "sectionNone": "Semmi szerint", + "@sectionNone": {}, + "tagPickPageTitle": "Címke kiválasztása", + "@tagPickPageTitle": {}, + "settingsNavigationBottomActionsTile": "Alsó navigáció", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Alsó Navigáció", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Érintsd meg és tartsd lenyomva a gombokat, majd válaszd ki, mely műveletek jelenjenek meg az alsó navigációs sávban.", + "@settingsNavigationBottomActionEditorBanner": {}, + "mapStyleDialogAddStyle": "Stílus hozzáadása", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogName": "Név", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL-cím", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogSubdomains": "Aldomainek", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "Böngésző-Azonosító", + "@mapStyleEditorDialogUserAgent": {} +} diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb new file mode 100644 index 0000000..ed4e92b --- /dev/null +++ b/lib/l10n/app_id.arb @@ -0,0 +1,1450 @@ +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Selamat datang di Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Opsional", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Saya menyetujui syarat dan ketentuan", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, other{{count} benda}}", + "@itemCount": {}, + "timeSeconds": "{count, plural, other{{count} detik}}", + "@timeSeconds": {}, + "timeMinutes": "{count, plural, other{{count} menit}}", + "@timeMinutes": {}, + "timeDays": "{count, plural, other{{count} hari}}", + "@timeDays": {}, + "focalLength": "{length} mm", + "@focalLength": {}, + "applyButtonLabel": "TERAPKAN", + "@applyButtonLabel": {}, + "deleteButtonLabel": "BUANG", + "@deleteButtonLabel": {}, + "nextButtonLabel": "SELANJUTNYA", + "@nextButtonLabel": {}, + "showButtonLabel": "TAMPILKAN", + "@showButtonLabel": {}, + "hideButtonLabel": "SEMBUNYIKAN", + "@hideButtonLabel": {}, + "continueButtonLabel": "SELANJUTNYA", + "@continueButtonLabel": {}, + "cancelTooltip": "Batal", + "@cancelTooltip": {}, + "changeTooltip": "Ganti", + "@changeTooltip": {}, + "clearTooltip": "Hapus", + "@clearTooltip": {}, + "previousTooltip": "Sebelumnya", + "@previousTooltip": {}, + "nextTooltip": "Selanjutnya", + "@nextTooltip": {}, + "showTooltip": "Tampilkan", + "@showTooltip": {}, + "hideTooltip": "Sembunyikan", + "@hideTooltip": {}, + "actionRemove": "Hapus", + "@actionRemove": {}, + "resetTooltip": "Ulang", + "@resetTooltip": {}, + "saveTooltip": "Simpan", + "@saveTooltip": {}, + "pickTooltip": "Pilih", + "@pickTooltip": {}, + "doubleBackExitMessage": "Ketuk “kembali” lagi untuk keluar.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "Jangan tanya lagi", + "@doNotAskAgain": {}, + "sourceStateLoading": "Memuat", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Mengkataloging", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Mencari negara", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Mencari tempat", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Hapus", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Tampilkan di Album", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Tampilkan di Negara", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "Tampilkan di Label", + "@chipActionGoToTagPage": {}, + "chipActionHide": "Sembunyikan", + "@chipActionHide": {}, + "chipActionPin": "Sematkan ke atas", + "@chipActionPin": {}, + "chipActionUnpin": "Lepas sematan dari atas", + "@chipActionUnpin": {}, + "chipActionRename": "Ganti nama", + "@chipActionRename": {}, + "chipActionSetCover": "Setel sampul", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "Buat album", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "Salin ke papan klip", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "Hapus", + "@entryActionDelete": {}, + "entryActionConvert": "Ubah", + "@entryActionConvert": {}, + "entryActionExport": "Ekspor", + "@entryActionExport": {}, + "entryActionInfo": "Info", + "@entryActionInfo": {}, + "entryActionRename": "Ganti nama", + "@entryActionRename": {}, + "entryActionRestore": "Pulihkan", + "@entryActionRestore": {}, + "entryActionRotateCCW": "Putar berlawanan arah jarum jam", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Putar searah jarum jam", + "@entryActionRotateCW": {}, + "entryActionFlip": "Balik secara horisontal", + "@entryActionFlip": {}, + "entryActionPrint": "Cetak", + "@entryActionPrint": {}, + "entryActionShare": "Bagikan", + "@entryActionShare": {}, + "entryActionViewSource": "Lihat sumber", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "Tampilkan sebagai hamparan peta", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Ubah ke gambar tetap", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Buka video", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Ubah", + "@entryActionEdit": {}, + "entryActionOpen": "Buka dengan", + "@entryActionOpen": {}, + "entryActionSetAs": "Tetapkan sebagai", + "@entryActionSetAs": {}, + "entryActionOpenMap": "Tampilkan di peta", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Putar layar", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Tambahkan ke favorit", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Hapus dari favorit", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Tangkap bingkai", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Matikan Suara", + "@videoActionMute": {}, + "videoActionUnmute": "Hidupkan Suara", + "@videoActionUnmute": {}, + "videoActionPause": "Hentikan", + "@videoActionPause": {}, + "videoActionPlay": "Mainkan", + "@videoActionPlay": {}, + "videoActionReplay10": "Mundurkan 10 detik", + "@videoActionReplay10": {}, + "videoActionSkip10": "Majukan 10 detik", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Pilih trek", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Kecepatan pemutaran", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "Pengaturan", + "@viewerActionSettings": {}, + "slideshowActionResume": "Lanjutkan", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Tampilkan di Koleksi", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Ubah tanggal & waktu", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Ubah lokasi", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "Ubah judul & deskripsi", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Ubah nilai", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Ubah label", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Hapus metadata", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "Tong sampah", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Favorit", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Tak ada tanggal", + "@filterNoDateLabel": {}, + "filterNoLocationLabel": "Lokasi yang tidak ditemukan", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Belum diberi nilai", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Tidak dilabel", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Tak ada judul", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "Di hari ini", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Baru-baru ini ditambahkan", + "@filterRecentlyAddedLabel": {}, + "filterRatingRejectedLabel": "Ditolak", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Teranimasi", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "Foto bergerak", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "Vidio 360°", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Gambar", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Derajat desimal", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "E", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "W", + "@coordinateDmsWest": {}, + "unitSystemMetric": "Metrik", + "@unitSystemMetric": {}, + "unitSystemImperial": "Imperial", + "@unitSystemImperial": {}, + "videoLoopModeNever": "Jangan pernah", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "Hanya video pendek", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "Selalu", + "@videoLoopModeAlways": {}, + "videoControlsPlayOutside": "Buka dengan pemutar lain", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (Hybrid)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (Terrain)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyRename": "Ganti nama", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Ganti", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Lewati", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "Jangan pernah", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "Hanya halaman penampil", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Selalu", + "@keepScreenOnAlways": {}, + "accessibilityAnimationsRemove": "Cegah efek layar", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Simpan efek layar", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferHighest": "Penyegaran tertinggi", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Penyegaran terendah", + "@displayRefreshRatePreferLowest": {}, + "videoPlaybackSkip": "Lewati", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Mainkan bisu", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Mainkan dengan suara", + "@videoPlaybackWithSound": {}, + "themeBrightnessLight": "Terang", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Gelap", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Hitam", + "@themeBrightnessBlack": {}, + "viewerTransitionSlide": "Menggeser", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Paralaks", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "Memudar", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "Membesar", + "@viewerTransitionZoomIn": {}, + "wallpaperTargetHome": "Tampilan depan", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "Tampilan kunci", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Tampilan depan dan kunci", + "@wallpaperTargetHomeLock": {}, + "albumTierNew": "Baru", + "@albumTierNew": {}, + "albumTierPinned": "Disemat", + "@albumTierPinned": {}, + "albumTierSpecial": "Biasa", + "@albumTierSpecial": {}, + "albumTierApps": "Aplikasi", + "@albumTierApps": {}, + "albumTierRegular": "Lainnya", + "@albumTierRegular": {}, + "storageVolumeDescriptionFallbackPrimary": "Penyimpanan internal", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "kartu SD", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "direktori root", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "direktori “{name}”", + "@otherDirectoryDescription": {}, + "storageAccessDialogMessage": "Silahkan pilih {directory} dari “{volume}” di layar berikutnya untuk memberikan akses aplikasi ini ke sana.", + "@storageAccessDialogMessage": {}, + "restrictedAccessDialogMessage": "Aplikasi ini tidak diizinkan untuk mengubah file di {directory} dari “{volume}”.\n\nSilahkan pakai aplikasi Manager File atau aplikasi gallery untuk gerakkan benda ke direktori lain.", + "@restrictedAccessDialogMessage": {}, + "notEnoughSpaceDialogMessage": "Operasi ini memerlukan {neededSize} ruang kosong di “{volume}” untuk menyelesaikan, tetapi hanya ada {freeSize} tersisa.", + "@notEnoughSpaceDialogMessage": {}, + "missingSystemFilePickerDialogMessage": "Pemilih file sistem tidak ada atau dinonaktifkan. Harap aktifkan dan coba lagi.", + "@missingSystemFilePickerDialogMessage": {}, + "unsupportedTypeDialogMessage": "{count, plural, other{Operasi ini tidak didukung untuk benda dari jenis berikut: {types}.}}", + "@unsupportedTypeDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "Beberapa file di folder tujuan memiliki nama yang sama.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "Beberapa file memiliki nama yang sama.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "Label pintasan", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "TAMBAH", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "Tidak ada aplikasi yang cocok untuk menangani ini.", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Pindahkan benda ini ke tong sampah?} other{Pindahkan {count} benda ke tempat sampah?}}", + "@binEntriesConfirmationDialogMessage": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Anda yakin ingin menghapus benda ini?} other{Apakah Anda yakin ingin menghapus {count} benda?}}", + "@deleteEntriesConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "Simpan tanggal benda sebelum melanjutkan?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Atur tanggal", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Apakah Anda ingin melanjutkan di {time}?", + "@videoResumeDialogMessage": {}, + "videoStartOverButtonLabel": "ULANG DARI AWAL", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "LANJUT", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Benda terbaru", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Otomatis", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Kustom", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "Foto dan video yang cocok akan disembunyikan dari koleksi Anda. Anda dapat menampilkannya lagi dari pengaturan “Privasi”.\n\nApakah Anda yakin ingin menyembunyikannya?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "Album Baru", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Nama album", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Direktori sudah ada", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Penyimpanan:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "Nama baru", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Direktori sudah ada", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Ganti nama", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "Pola penamaan", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Masukkan bidang", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Pratinjau", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Penghitungan", + "@renameProcessorCounter": {}, + "renameProcessorName": "Nama", + "@renameProcessorName": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Hapus album ini dan item yang ada di dalam?} other{Hapus album ini dan {count} item yang ada di dalam?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Hapus album ini dan item yang ada di dalam?} other{Hapus album ini dan {count} item yang ada di dalam?}}", + "@deleteMultiAlbumConfirmationDialogMessage": {}, + "exportEntryDialogFormat": "Format:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Lebar", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Tinggi", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "Nama baru", + "@renameEntryDialogLabel": {}, + "editEntryDialogTargetFieldsHeader": "Bidang untuk dimodifikasikan", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Tanggal & Waktu", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Atur tanggal khusus", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Salin dari tanggal lain", + "@editEntryDateDialogCopyField": {}, + "editEntryDialogCopyFromItem": "Salin dari benda lain", + "@editEntryDialogCopyFromItem": {}, + "editEntryDateDialogExtractFromTitle": "Ekstrak dari judul", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Geser", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "Tanggal modifikasi file", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "Jam", + "@durationDialogHours": {}, + "durationDialogMinutes": "Menit", + "@durationDialogMinutes": {}, + "editEntryLocationDialogTitle": "Lokasi", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogChooseOnMap": "Pilih di peta", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "Garis lintang", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "Garis bujur", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "Gunakan lokasi ini", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "Nilai", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Penghapusan Metadata", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "Lebih Banyak", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP diperlukan untuk memutar video di dalam Foto bergerak.\n\nAnda yakin ingin menghapusnya?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "genericDangerWarningDialogMessage": "Apakah kamu yakin?", + "@genericDangerWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Kecepatan pemutaran", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Audio", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Subjudul", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "Mati", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Trek", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "Tidak ada Trek yang lain.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "Selesai!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Gagal", + "@genericFailureFeedback": {}, + "menuActionConfigureView": "Tata letak", + "@menuActionConfigureView": {}, + "menuActionSelect": "Pilih", + "@menuActionSelect": {}, + "menuActionSelectAll": "Pilih semua", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "Pilih tidak ada", + "@menuActionSelectNone": {}, + "menuActionMap": "Peta", + "@menuActionMap": {}, + "menuActionSlideshow": "Tampilan slide", + "@menuActionSlideshow": {}, + "menuActionStats": "Statistik", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "Sortir", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "Bagian", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Tata letak", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "Urutan pengurutan terbalik", + "@viewDialogReverseSortOrder": {}, + "tileLayoutGrid": "Grid", + "@tileLayoutGrid": {}, + "tileLayoutList": "Daftar", + "@tileLayoutList": {}, + "coverDialogTabCover": "Kover", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "Aplikasi", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Warna", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Pilih Aplikasi", + "@appPickDialogTitle": {}, + "appPickDialogNone": "Tidak ada", + "@appPickDialogNone": {}, + "aboutPageTitle": "Tentang", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Lisensi", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Aturan Privasi", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Lapor Bug", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Simpan log aplikasi ke file", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Salin informasi sistem", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "Salin", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "Laporkan ke GitHub dengan log dan informasi sistem", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "Rapor", + "@aboutBugReportButton": {}, + "aboutCreditsSectionTitle": "Kredit", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "Aplikasi ini menggunakan file TopoJSON dari", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "dibawah Lisensi ISC.", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Penerjemah", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Lisensi Sumber Terbuka", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "Aplikasi ini menggunakan paket dan perpustakaan sumber terbuka berikut.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Perpustakaan Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Plugin Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Paket Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Paket Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Tampilkan Semua Lisensi", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "Aturan Privasi", + "@policyPageTitle": {}, + "collectionPageTitle": "Koleksi", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "Pilih", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "Pilih benda", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Tampilkan filter judul", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Sembunyikan filter judul", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Tambahkan pintasan", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "Kosongkan tong sampah", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Salin ke album", + "@collectionActionCopy": {}, + "collectionActionMove": "Pindah ke album", + "@collectionActionMove": {}, + "collectionActionRescan": "Pindai ulang", + "@collectionActionRescan": {}, + "collectionActionEdit": "Ubah", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Cari judul", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "Lewat album", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Lewat bulan", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Lewat hari", + "@collectionGroupDay": {}, + "sectionUnknown": "Tidak dikenal", + "@sectionUnknown": {}, + "dateToday": "Hari ini", + "@dateToday": {}, + "dateYesterday": "Kemaren", + "@dateYesterday": {}, + "dateThisMonth": "Bulan ini", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, other{Gagal untuk menghapus {count} benda}}", + "@collectionDeleteFailureFeedback": {}, + "collectionCopyFailureFeedback": "{count, plural, other{Gagal untuk menyalin {count} benda}}", + "@collectionCopyFailureFeedback": {}, + "collectionMoveFailureFeedback": "{count, plural, other{Gagal untuk menggerakkan {count} benda}}", + "@collectionMoveFailureFeedback": {}, + "collectionRenameFailureFeedback": "{count, plural, other{Gagal untuk menggantikan nama {count} benda}}", + "@collectionRenameFailureFeedback": {}, + "collectionEditFailureFeedback": "{count, plural, other{Gagal untuk mengubah {count} benda}}", + "@collectionEditFailureFeedback": {}, + "collectionExportFailureFeedback": "{count, plural, other{Gagal untuk mengekspor {count} halaman}}", + "@collectionExportFailureFeedback": {}, + "collectionCopySuccessFeedback": "{count, plural, other{Menyalin {count} benda}}", + "@collectionCopySuccessFeedback": {}, + "collectionMoveSuccessFeedback": "{count, plural, other{{count} benda terpindah}}", + "@collectionMoveSuccessFeedback": {}, + "collectionRenameSuccessFeedback": "{count, plural, other{Tergantikan nama untuk {count} benda}}", + "@collectionRenameSuccessFeedback": {}, + "collectionEditSuccessFeedback": "{count, plural, other{Mengubah {count} benda}}", + "@collectionEditSuccessFeedback": {}, + "collectionEmptyFavourites": "Tidak ada favorit", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "Tidak ada video", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "Tidak ada gambar", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Berikan akses", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Pilih bagian", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Batalkan pilihan bagian", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "Tentang", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Pengaturan", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "Semua koleksi", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Favorit", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Gambar", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Video", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "Teranimasi", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Foto bergerak", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "Panorama", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Foto Raw", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "Video 360°", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Album", + "@drawerAlbumPage": {}, + "drawerCountryPage": "Negara", + "@drawerCountryPage": {}, + "drawerTagPage": "Label", + "@drawerTagPage": {}, + "sortByDate": "Lewat tanggal", + "@sortByDate": {}, + "sortByName": "Lewat nama", + "@sortByName": {}, + "sortByItemCount": "Lewat jumlah benda", + "@sortByItemCount": {}, + "sortBySize": "Lewat ukuran", + "@sortBySize": {}, + "sortByAlbumFileName": "Berdasarkan nama album & judul item", + "@sortByAlbumFileName": {}, + "sortByRating": "Lewat nilai", + "@sortByRating": {}, + "sortOrderNewestFirst": "Terbaru pertama", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Tertua pertama", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "A ke Z", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Z ke A", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "Tertinggi pertama", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Terendah pertama", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Terbesar pertama", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "Terkecil pertama", + "@sortOrderSmallestFirst": {}, + "albumGroupTier": "Lewat tingkat", + "@albumGroupTier": {}, + "albumGroupVolume": "Lewat volume penyimpanan", + "@albumGroupVolume": {}, + "albumPickPageTitleCopy": "Salin ke Album", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Ekspor ke Album", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Pindah ke Album", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "Pilih Album", + "@albumPickPageTitlePick": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "albumDownload": "Download", + "@albumDownload": {}, + "albumScreenshots": "Tangkapan layar", + "@albumScreenshots": {}, + "albumScreenRecordings": "Rekaman layar", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Tangkapan Video", + "@albumVideoCaptures": {}, + "albumPageTitle": "Album", + "@albumPageTitle": {}, + "albumEmpty": "Tidak ada album", + "@albumEmpty": {}, + "createAlbumButtonLabel": "BUAT", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "baru", + "@newFilterBanner": {}, + "countryPageTitle": "Negara", + "@countryPageTitle": {}, + "countryEmpty": "Tidak ada negara", + "@countryEmpty": {}, + "tagPageTitle": "Label", + "@tagPageTitle": {}, + "tagEmpty": "Tidak ada label", + "@tagEmpty": {}, + "binPageTitle": "Tong Sampah", + "@binPageTitle": {}, + "searchCollectionFieldHint": "Cari koleksi", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "Terkini", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Tanggal", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "Album", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "Negara", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "Tempat", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Label", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "Nilai", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "Metadata", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Pengaturan", + "@settingsPageTitle": {}, + "settingsSystemDefault": "Sistem", + "@settingsSystemDefault": {}, + "settingsDefault": "Default", + "@settingsDefault": {}, + "settingsSearchFieldLabel": "Cari peraturan", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Tidak ada peraturan yang cocok", + "@settingsSearchEmpty": {}, + "settingsActionExport": "Ekspor", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "Ekspor", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "Impor", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Impor", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "Sampul", + "@appExportCovers": {}, + "appExportFavourites": "Favorit", + "@appExportFavourites": {}, + "appExportSettings": "Pengaturan", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "Navigasi", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Beranda", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Beranda", + "@settingsHomeDialogTitle": {}, + "settingsKeepScreenOnTile": "Biarkan layarnya menyala", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Biarkan Layarnya Menyala", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Ketuk “kembali” dua kali untuk keluar", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "Dialog konfirmasi", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "Dialog Konfirmasi", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Tanya sebelum menghapus benda selamanya", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "Tanya sebelum memindahkan benda ke tong sampah", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Tanyakan sebelum memindahkan barang tanpa metadata tanggal", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Tampilkan pesan setelah menggerakkan barang ke tong sampah", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerTile": "Menu navigasi", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Menu Navigasi", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "Sentuh dan tahan untuk memindahkan dan menyusun ulang benda menu.", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "Tipe", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "Album", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Halaman", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Tambahkan album", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "Thumbnail", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "Hamparan", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Hamparan", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowFavouriteIcon": "Tampilkan ikon favorit", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Tampilkan ikon label", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Tampilkan ikon lokasi", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Tampilkan ikon Foto bergerak", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "Tampilkan nilai", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Tampilkan ikon raw", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Tampilkan durasi video", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "Aksi cepat", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Aksi Cepat", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Menjelajah", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Memilih", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Sentuh dan tahan untuk memindahkan tombol dan memilih tindakan yang ditampilkan saat menelusuri benda.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Sentuh dan tahan untuk memindahkan tombol dan memilih tindakan yang ditampilkan saat memilih benda.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsViewerSectionTitle": "Penampil", + "@settingsViewerSectionTitle": {}, + "settingsViewerGestureSideTapNext": "Ketuk tepi layar untuk menampilkan benda sebelumnya/berikutnya", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerUseCutout": "Gunakan area potongan", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Kecerahan maksimum", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Putar foto bergerak otomatis", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "Latar belakang gambar", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Aksi cepat", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Aksi Cepat", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "Sentuh dan tahan untuk memindahkan tombol dan memilih tindakan yang ditampilkan di penampil.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Tombol yang Ditampilkan", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Tombol yang tersedia", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Tidak ada tombol", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "Hamparan", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "Hamparan", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "Tampilkan saat pembukaan", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "Tampilkan minimap", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Tampilkan informasi", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "Tampilkan judul, tanggal, lokasi, dll.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowShootingDetails": "Tampilkan detail pemotretan", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowOverlayThumbnails": "Tampilkan thumbnail", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "Efek Kabur", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "Tampilan slide", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "Tampilan Slide", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Ulangi", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Acak", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Isi layar", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowTransitionTile": "Transisi", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Jarak waktu", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "Putaran ulang video", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Putaran Ulang Video", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "Pengaturan Video", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "Tampilkan video", + "@settingsVideoShowVideos": {}, + "settingsVideoEnableHardwareAcceleration": "Akselerasi perangkat keras", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "Putar otomatis", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "Putar ulang", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Putar Ulang", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "Subjudul", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Subjudul", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Ini adalah sampel.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "Perataan teks", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Perataan Teks", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Ukuran teks", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "Tampilkan garis besar dan bayangan", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Warna teks", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Opasitas teks", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Warna latar belakang", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Opasitas latar belakang", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Kiri", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Tengah", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Kanan", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoControlsTile": "Kontrol", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "Kontrol", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "Tombol", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Ketuk dua kali untuk mainkan/hentikan", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "Ketuk dua kali di tepi layar untuk mencari kebelakang/kedepan", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsPrivacySectionTitle": "Privasi", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Izinkan akses ke inventori aplikasi", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "Digunakan untuk meningkatkan tampilan album", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "Izinkan pelaporan kesalahan secara anonim", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Simpan riwayat pencarian", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "Gunakan tong sampah", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "Simpan benda yang dihapus selama 30 hari", + "@settingsEnableBinSubtitle": {}, + "settingsHiddenItemsTile": "Benda tersembunyi", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Benda Tersembunyi", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "Foto dan video filter tersembunyi yang cocok tidak akan muncul di koleksi Anda.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "Tidak ada filter tersembunyi", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Akses penyimpanan", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "Akses Penyimpanan", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessBanner": "Beberapa direktori memerlukan pemberian akses eksplisit untuk memodifikasi file di dalamnya. Anda dapat meninjau direktori yang anda beri akses sebelumnya di sini.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Tidak ada akses", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Tarik kembali", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Aksesibilitas", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Hapus animasi", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "Hapus Animasi", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Waktu untuk mengambil tindakan", + "@settingsTimeToTakeActionTile": {}, + "settingsDisplaySectionTitle": "Tampilan", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "Highlight warna", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Warna dinamis", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Tingkat penyegaran tampilan", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Tingkat Penyegaran", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageSectionTitle": "Bahasa & Format", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "Bahasa", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "Bahasa", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "Format koordinat", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "Format Koordinat", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Unit", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "Unit", + "@settingsUnitSystemDialogTitle": {}, + "settingsScreenSaverPageTitle": "Screensaver", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "Bingkai Foto", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Garis luar", + "@settingsWidgetShowOutline": {}, + "settingsCollectionTile": "Koleksi", + "@settingsCollectionTile": {}, + "statsPageTitle": "Statistik", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, other{{count} benda dengan lokasi}}", + "@statsWithGps": {}, + "statsTopCountriesSectionTitle": "Negara Teratas", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Tempat Teratas", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Label Teratas", + "@statsTopTagsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "BUKA PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "TETAPKAN SEBAGAI WALLPAPER", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Ups!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "File tidak ada lagi.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Info", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "Kembali ke penampil", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "tidak dikenal", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "Deskripsi", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Judul", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "Tanggal", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "Resolusi", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Ukuran", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Jalan", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Durasi", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Dimiliki oleh", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Koordinat", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Alamat", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Gaya Peta", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Pilih gaya peta", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Perbesar", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Perkecil", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Arahkan ke utara ke atas", + "@mapPointNorthUpTooltip": {}, + "mapAttributionOsmHot": "Tile oleh [HOT](https://www.hotosm.org/) • Diselenggarakan oleh [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "Tile oleh [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "openMapPageTooltip": "Lihat di halaman Peta", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "Tidak ada gambar di wilayah ini", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Gagal mengekstrak data yang disematkan", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "Buka", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Tampilkan XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "Cari metadata", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Tidak ada kata kunci yang cocok", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Tanggal & waktu", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Deskripsi", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Dimensi", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Resolusi", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Hak", + "@viewerInfoSearchSuggestionRights": {}, + "tagEditorPageTitle": "Ubah Label", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Label baru", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Tambah label", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Terkini", + "@tagEditorSectionRecent": {}, + "panoramaEnableSensorControl": "Aktifkan kontrol sensor", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Nonaktifkan kontrol sensor", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Sumber", + "@sourceViewerPageTitle": {}, + "viewerTransitionNone": "Tidak ada", + "@viewerTransitionNone": {}, + "widgetOpenPageHome": "Buka beranda", + "@widgetOpenPageHome": {}, + "widgetOpenPageCollection": "Buka koleksi", + "@widgetOpenPageCollection": {}, + "widgetOpenPageViewer": "Buka penampil", + "@widgetOpenPageViewer": {}, + "durationDialogSeconds": "Detik", + "@durationDialogSeconds": {}, + "tileLayoutMosaic": "Mosaik", + "@tileLayoutMosaic": {}, + "albumMimeTypeMixed": "Tercampur", + "@albumMimeTypeMixed": {}, + "settingsDisabled": "Nonaktif", + "@settingsDisabled": {}, + "settingsAllowMediaManagement": "Izinkan pengelolaan media", + "@settingsAllowMediaManagement": {}, + "statsTopAlbumsSectionTitle": "Album Teratas", + "@statsTopAlbumsSectionTitle": {}, + "albumGroupType": "Berdasarkan tipe", + "@albumGroupType": {}, + "settingsSlideshowAnimatedZoomEffect": "Efek zoom bergerak", + "@settingsSlideshowAnimatedZoomEffect": {}, + "chipActionFilterIn": "Filter masuk", + "@chipActionFilterIn": {}, + "wallpaperUseScrollEffect": "Gunakan efek scroll di layar beranda", + "@wallpaperUseScrollEffect": {}, + "tagPlaceholderCountry": "Negara", + "@tagPlaceholderCountry": {}, + "chipActionFilterOut": "Filter keluar", + "@chipActionFilterOut": {}, + "settingsWidgetOpenPage": "Saat mengetuk di sebuah widget", + "@settingsWidgetOpenPage": {}, + "tagEditorSectionPlaceholders": "Placeholder", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderPlace": "Tempat", + "@tagPlaceholderPlace": {}, + "editEntryLocationDialogSetCustom": "Terapkan lokasi kustom", + "@editEntryLocationDialogSetCustom": {}, + "subtitlePositionTop": "Teratas", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "Bawah", + "@subtitlePositionBottom": {}, + "widgetDisplayedItemRandom": "Acak", + "@widgetDisplayedItemRandom": {}, + "entryActionShareImageOnly": "Bagikan gambar saja", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "Bagikan video saja", + "@entryActionShareVideoOnly": {}, + "entryInfoActionRemoveLocation": "Hapus lokasi", + "@entryInfoActionRemoveLocation": {}, + "filterAspectRatioLandscapeLabel": "Lanskap", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "Potret", + "@filterAspectRatioPortraitLabel": {}, + "settingsSubtitleThemeTextPositionTile": "Posisi teks", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Posisi Teks", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "filterNoAddressLabel": "Tidak ada alamat", + "@filterNoAddressLabel": {}, + "widgetDisplayedItemMostRecent": "Terkini", + "@widgetDisplayedItemMostRecent": {}, + "settingsViewerShowRatingTags": "Tampilkan peringkat & tag", + "@settingsViewerShowRatingTags": {}, + "keepScreenOnVideoPlayback": "Saat pemutaran video", + "@keepScreenOnVideoPlayback": {}, + "entryInfoActionExportMetadata": "Ekspor metadata", + "@entryInfoActionExportMetadata": {}, + "settingsWidgetDisplayedItem": "Barang yang ditampilkan", + "@settingsWidgetDisplayedItem": {}, + "columnCount": "{count, plural, other{{count} kolom}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsAccessibilityShowPinchGestureAlternatives": "Tampilkan alternatif gestur multisentuh", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsViewerShowDescription": "Tampilkan deskripsi", + "@settingsViewerShowDescription": {}, + "settingsModificationWarningDialogMessage": "Pengaturan lain akan diubah.", + "@settingsModificationWarningDialogMessage": {}, + "settingsDisplayUseTvInterface": "Antarmuka Android TV", + "@settingsDisplayUseTvInterface": {}, + "filterLocatedLabel": "Terletak", + "@filterLocatedLabel": {}, + "filterTaggedLabel": "Dilabel", + "@filterTaggedLabel": {}, + "tooManyItemsErrorDialogMessage": "Coba lagi dengan item yang lebih sedikit.", + "@tooManyItemsErrorDialogMessage": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Usap ke atas atau bawah untuk mengatur kecerahan/volume", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "chipActionConfigureVault": "Atur brankas", + "@chipActionConfigureVault": {}, + "albumTierVaults": "Brankas", + "@albumTierVaults": {}, + "newVaultDialogTitle": "Brankas Baru", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "Atur Brankas", + "@configureVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "Kunci ketika layar mati", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "Jenis penguncian", + "@vaultDialogLockTypeLabel": {}, + "pinDialogEnter": "Masukkan pin", + "@pinDialogEnter": {}, + "pinDialogConfirm": "Konfirmasi pin", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "Masukkan kata sandi", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Konfirmasi kata sandi", + "@passwordDialogConfirm": {}, + "authenticateToConfigureVault": "Autentikasi untuk mengatur brankas", + "@authenticateToConfigureVault": {}, + "authenticateToUnlockVault": "Autentikasi untuk membuka brankas", + "@authenticateToUnlockVault": {}, + "vaultBinUsageDialogMessage": "Beberapa brankas menggunakan tong sampah.", + "@vaultBinUsageDialogMessage": {}, + "settingsDisablingBinWarningDialogMessage": "Item dalam tong sampah akan hilang selamanya.", + "@settingsDisablingBinWarningDialogMessage": {}, + "chipActionLock": "Kunci", + "@chipActionLock": {}, + "vaultLockTypePassword": "Kata sandi", + "@vaultLockTypePassword": {}, + "chipActionCreateVault": "Buat brankas", + "@chipActionCreateVault": {}, + "vaultLockTypePin": "Pin", + "@vaultLockTypePin": {}, + "newVaultWarningDialogMessage": "Item dalam brankas hanya tersedia untuk aplikasi ini dan bukan yang lain.\n\nJika Anda menghapus aplikasi ini, atau menghapus data aplikasi ini, Anda akan kehilangan semua item tersebut.", + "@newVaultWarningDialogMessage": {}, + "settingsConfirmationVaultDataLoss": "Tampilkan peringatan kehilangan data brankas", + "@settingsConfirmationVaultDataLoss": {}, + "chipActionGoToPlacePage": "Tampilkan di Tempat", + "@chipActionGoToPlacePage": {}, + "placePageTitle": "Tempat", + "@placePageTitle": {}, + "placeEmpty": "Tidak ada tempat", + "@placeEmpty": {}, + "drawerPlacePage": "Tempat", + "@drawerPlacePage": {}, + "exportEntryDialogWriteMetadata": "Tulis metadata", + "@exportEntryDialogWriteMetadata": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "vaultLockTypePattern": "Pola", + "@vaultLockTypePattern": {}, + "patternDialogConfirm": "Konfirmasi pola", + "@patternDialogConfirm": {}, + "patternDialogEnter": "Masukkan pola", + "@patternDialogEnter": {}, + "settingsVideoEnablePip": "Gambar dalam gambar", + "@settingsVideoEnablePip": {}, + "settingsVideoBackgroundMode": "Mode latar belakang", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "Mode Latar Belakang", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsCollectionBurstPatternsTile": "Pola semburan", + "@settingsCollectionBurstPatternsTile": {}, + "settingsCollectionBurstPatternsNone": "Tidak ada", + "@settingsCollectionBurstPatternsNone": {}, + "chipActionShowCountryStates": "Tampilkan wilayah", + "@chipActionShowCountryStates": {}, + "viewerActionUnlock": "Buka kunci penampil", + "@viewerActionUnlock": {}, + "statePageTitle": "Wilayah", + "@statePageTitle": {}, + "stateEmpty": "Tidak ada wilayah", + "@stateEmpty": {}, + "tagPlaceholderState": "Wilayah", + "@tagPlaceholderState": {}, + "viewerActionLock": "Kunci penampil", + "@viewerActionLock": {}, + "searchStatesSectionTitle": "Wilayah", + "@searchStatesSectionTitle": {}, + "statsTopStatesSectionTitle": "Wilayah Teratas", + "@statsTopStatesSectionTitle": {}, + "settingsAskEverytime": "Ta za", + "@settingsAskEverytime": {}, + "maxBrightnessNever": "Tidak pernah", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "Selalu", + "@maxBrightnessAlways": {}, + "videoResumptionModeNever": "Tidak pernah", + "@videoResumptionModeNever": {}, + "videoResumptionModeAlways": "Selalu", + "@videoResumptionModeAlways": {}, + "settingsVideoResumptionModeTile": "Lanjutkan pemutaran", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoResumptionModeDialogTitle": "Lanjutkan Pemutaran", + "@settingsVideoResumptionModeDialogTitle": {}, + "tagEditorDiscardDialogMessage": "Apakah Anda ingin membuang perubahan?", + "@tagEditorDiscardDialogMessage": {}, + "exportEntryDialogQuality": "Kualitas", + "@exportEntryDialogQuality": {}, + "settingsVideoPlaybackTile": "Pemutaran", + "@settingsVideoPlaybackTile": {}, + "settingsVideoPlaybackPageTitle": "Pemutaran", + "@settingsVideoPlaybackPageTitle": {}, + "cropAspectRatioOriginal": "Asli", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Kotak", + "@cropAspectRatioSquare": {}, + "saveCopyButtonLabel": "SIMPAN SALINAN", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Terapkan", + "@applyTooltip": {}, + "editorActionTransform": "Transformasi", + "@editorActionTransform": {}, + "editorTransformCrop": "Potong", + "@editorTransformCrop": {}, + "editorTransformRotate": "Putar", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Bebas", + "@cropAspectRatioFree": {}, + "widgetTapUpdateWidget": "Perbarui widget", + "@widgetTapUpdateWidget": {}, + "aboutDataUsageData": "Data", + "@aboutDataUsageData": {}, + "aboutDataUsageDatabase": "Basis Data", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageSectionTitle": "Penggunaan Data", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageCache": "Tembolok", + "@aboutDataUsageCache": {}, + "aboutDataUsageExternal": "Eksternal", + "@aboutDataUsageExternal": {}, + "aboutDataUsageMisc": "Lainnya", + "@aboutDataUsageMisc": {}, + "aboutDataUsageInternal": "Internal", + "@aboutDataUsageInternal": {}, + "overlayHistogramNone": "Tidak ada", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "overlayHistogramLuminance": "Kecerahan", + "@overlayHistogramLuminance": {}, + "settingsViewerShowHistogram": "Tampilkan histogram", + "@settingsViewerShowHistogram": {}, + "aboutDataUsageClearCache": "Bersihkan cache", + "@aboutDataUsageClearCache": {}, + "entryActionCast": "Siarkan", + "@entryActionCast": {}, + "collectionActionSetHome": "Tetapkan sebagai beranda", + "@collectionActionSetHome": {}, + "settingsThumbnailShowHdrIcon": "Tampilkan ikon HDR", + "@settingsThumbnailShowHdrIcon": {}, + "castDialogTitle": "Siarkan Perangkat", + "@castDialogTitle": {}, + "stopTooltip": "Berhenti", + "@stopTooltip": {}, + "videoActionABRepeat": "Ulang A-B", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "Tetapkan awal", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "Tetapkan akhir", + "@videoRepeatActionSetEnd": {}, + "settingsForceWesternArabicNumeralsTile": "Paksa angka Arab", + "@settingsForceWesternArabicNumeralsTile": {}, + "renameProcessorHash": "Hash", + "@renameProcessorHash": {}, + "chipActionShowCollection": "Tampilkan di Koleksi", + "@chipActionShowCollection": {}, + "explorerActionSelectStorageVolume": "Pilih penyimpanan", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "Pilih Penyimpanan", + "@selectStorageVolumeDialogTitle": {}, + "setHomeCustom": "Kustom", + "@setHomeCustom": {}, + "explorerPageTitle": "Penjelajah", + "@explorerPageTitle": {}, + "sortOrderLongestFirst": "Yang terpanjang dulu", + "@sortOrderLongestFirst": {}, + "sortByDuration": "Berdasarkan durasi", + "@sortByDuration": {}, + "sortOrderShortestFirst": "Yang terpendek dulu", + "@sortOrderShortestFirst": {}, + "chipActionGoToExplorerPage": "Tampilkan di Penjelajah", + "@chipActionGoToExplorerPage": {}, + "mapAttributionOsmData": "Data peta © [OpenStreetMap](https://www.openstreetmap.org/copyright) kontributor", + "@mapAttributionOsmData": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Ubin oleh [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapAttributionOsmLiberty": "Ubin oleh [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Disediakan oleh [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "videoActionShowPreviousFrame": "Tampilkan bingkai sebelumnya", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "Tampilkan bingkai berikutnya", + "@videoActionShowNextFrame": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Album sudah ada", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "chipActionRemove": "Hapus", + "@chipActionRemove": {}, + "collectionActionAddDynamicAlbum": "Tambahkan album dinamis", + "@collectionActionAddDynamicAlbum": {}, + "appExportDynamicAlbums": "Album dinamis", + "@appExportDynamicAlbums": {}, + "albumTierDynamic": "Dinamis", + "@albumTierDynamic": {}, + "dynamicAlbumAlreadyExists": "Album dinamis sudah ada", + "@dynamicAlbumAlreadyExists": {}, + "newDynamicAlbumDialogTitle": "Album Dinamis Baru", + "@newDynamicAlbumDialogTitle": {}, + "chipActionDecompose": "Pisah", + "@chipActionDecompose": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "editEntryLocationDialogImportGpx": "Impor GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "Pergeseran waktu", + "@editEntryLocationDialogTimeShift": {}, + "removeEntryMetadataDialogAll": "Semua", + "@removeEntryMetadataDialogAll": {}, + "sortByPath": "Melalui lokasi", + "@sortByPath": {}, + "searchFormatSectionTitle": "Format", + "@searchFormatSectionTitle": {}, + "sectionNone": "Tidak ada bagian", + "@sectionNone": {}, + "albumTierGroups": "Kelompok", + "@albumTierGroups": {}, + "createButtonLabel": "BUAT", + "@createButtonLabel": {}, + "chipActionGroup": "Ubah pengelompokan", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Buat kelompok", + "@chipActionCreateGroup": {}, + "ungrouped": "Tidak dikelompokkan", + "@ungrouped": {}, + "newGroupDialogTitle": "Kelompok Baru", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Nama kelompok", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "Kelompok sudah ada", + "@groupAlreadyExists": {}, + "groupEmpty": "Tidak ada kelompok", + "@groupEmpty": {}, + "groupPickerTitle": "Pilih Kelompok", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Gunakan kelompok ini", + "@groupPickerUseThisGroupButton": {}, + "mapStyleDialogAddStyle": "Tambahkan gaya", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogName": "Nama", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogSubdomains": "Subdomain", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "Agen Pengguna", + "@mapStyleEditorDialogUserAgent": {}, + "tagPickPageTitle": "Pilih Tagar", + "@tagPickPageTitle": {}, + "settingsNavigationBottomActionsTile": "Navigasi bawah", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Navigasi Bawah", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Sentuh dan tahan untuk memindahkan tombol dan pilih tindakan apa saja yang ditampilkan dalam bilah navigasi bawah.", + "@settingsNavigationBottomActionEditorBanner": {} +} diff --git a/lib/l10n/app_is.arb b/lib/l10n/app_is.arb new file mode 100644 index 0000000..1a03cce --- /dev/null +++ b/lib/l10n/app_is.arb @@ -0,0 +1,1648 @@ +{ + "aboutCreditsWorldAtlas2": "með ISC-notkunarleyfi.", + "@aboutCreditsWorldAtlas2": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Færa þetta atriði í ruslmöppuna?} other{Færa þessi {count} atriði í ruslmöppuna?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsNavigationDrawerAddAlbum": "Bæta við albúmi", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsPrivacySectionTitle": "Persónuvernd", + "@settingsPrivacySectionTitle": {}, + "settingsEnableBinSubtitle": "Halda eyddum atriðum í 30 daga", + "@settingsEnableBinSubtitle": {}, + "viewerInfoPageTitle": "Upplýsingar", + "@viewerInfoPageTitle": {}, + "mapAttributionStamen": "Kortatíglar frá [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "widgetOpenPageViewer": "Opna skoðara", + "@widgetOpenPageViewer": {}, + "saveCopyButtonLabel": "VISTA AFRIT", + "@saveCopyButtonLabel": {}, + "setCoverDialogLatest": "Síðasta atriðið", + "@setCoverDialogLatest": {}, + "settingsThumbnailShowRating": "Birta einkunn", + "@settingsThumbnailShowRating": {}, + "albumScreenRecordings": "Skjáupptökur", + "@albumScreenRecordings": {}, + "editEntryRatingDialogTitle": "Einkunn", + "@editEntryRatingDialogTitle": {}, + "entryInfoActionExportMetadata": "Flytja út lýsigögn", + "@entryInfoActionExportMetadata": {}, + "aboutDataUsageMisc": "Ýmislegt", + "@aboutDataUsageMisc": {}, + "editorActionTransform": "Ummyndun", + "@editorActionTransform": {}, + "collectionExportFailureFeedback": "{count, plural, =1{Mistókst að flytja út 1 atriði} other{Mistókst að flytja út {count} atriðum}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "vaultDialogLockModeWhenScreenOff": "Læsa þegar skjárinn slekkur á sér", + "@vaultDialogLockModeWhenScreenOff": {}, + "videoResumeDialogMessage": "Viltu halda afspilun áfram frá {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "albumVideoCaptures": "Upptökur myndskeiða", + "@albumVideoCaptures": {}, + "wallpaperUseScrollEffect": "Nota skrunbrellur á upphafsskjá", + "@wallpaperUseScrollEffect": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "editEntryDateDialogSetCustom": "Stilla sérsniðna dagsetningu", + "@editEntryDateDialogSetCustom": {}, + "mapStyleGoogleTerrain": "Google Maps (yfirborð)", + "@mapStyleGoogleTerrain": {}, + "statsTopTagsSectionTitle": "Algengustu merki", + "@statsTopTagsSectionTitle": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Jöfnun texta", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSearchEmpty": "Engin samsvarandi stilling", + "@settingsSearchEmpty": {}, + "removeEntryMetadataDialogMore": "Meira", + "@removeEntryMetadataDialogMore": {}, + "viewerActionLock": "Læsa skoðara", + "@viewerActionLock": {}, + "pinDialogConfirm": "Staðfestu PIN-númer", + "@pinDialogConfirm": {}, + "settingsViewerSlideshowPageTitle": "Skyggnusýning", + "@settingsViewerSlideshowPageTitle": {}, + "tooManyItemsErrorDialogMessage": "Reyndu aftur með færri atriðum.", + "@tooManyItemsErrorDialogMessage": {}, + "collectionActionEdit": "Breyta", + "@collectionActionEdit": {}, + "viewerInfoSearchSuggestionResolution": "Upplausn", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerTransitionSlide": "Renna", + "@viewerTransitionSlide": {}, + "sortOrderLargestFirst": "Stærst fyrst", + "@sortOrderLargestFirst": {}, + "viewerTransitionParallax": "Hliðrun", + "@viewerTransitionParallax": {}, + "settingsViewerSectionTitle": "Skoðari", + "@settingsViewerSectionTitle": {}, + "mapStyleStamenWatercolor": "Stamen-vatnslitir", + "@mapStyleStamenWatercolor": {}, + "tagPlaceholderCountry": "Land", + "@tagPlaceholderCountry": {}, + "editEntryDateDialogSourceFileModifiedDate": "Breytingardagsetning skráar", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "editorTransformRotate": "Snúa", + "@editorTransformRotate": {}, + "collectionEmptyFavourites": "Engin eftirlæti", + "@collectionEmptyFavourites": {}, + "albumTierNew": "Nýtt", + "@albumTierNew": {}, + "removeEntryMetadataDialogTitle": "Fjarlæging lýsigagna", + "@removeEntryMetadataDialogTitle": {}, + "settingsLanguageTile": "Tungumál", + "@settingsLanguageTile": {}, + "drawerCollectionVideos": "Myndskeið", + "@drawerCollectionVideos": {}, + "videoResumptionModeNever": "Aldrei", + "@videoResumptionModeNever": {}, + "countryEmpty": "Engin lönd", + "@countryEmpty": {}, + "collectionSelectSectionTooltip": "Velja hluta", + "@collectionSelectSectionTooltip": {}, + "settingsAllowInstalledAppAccessSubtitle": "Notað til að bæta birtingu albúma", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "aboutLicensesBanner": "Þetta forrit notar eftirfarandi pakka og aðgerðasöfn með opnum grunnkóða.", + "@aboutLicensesBanner": {}, + "moveUndatedConfirmationDialogSetDate": "Vista dagsetningar", + "@moveUndatedConfirmationDialogSetDate": {}, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "dateYesterday": "Í gær", + "@dateYesterday": {}, + "viewerInfoLabelDate": "Dagsetning", + "@viewerInfoLabelDate": {}, + "nameConflictStrategyReplace": "Skipta út", + "@nameConflictStrategyReplace": {}, + "chipActionHide": "Fela", + "@chipActionHide": {}, + "aboutDataUsageDatabase": "Gagnagrunnur", + "@aboutDataUsageDatabase": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{Mistókst að flytja 1 atriði} other{Mistókst að flytja {count} atriðum}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoLoopModeAlways": "Alltaf", + "@videoLoopModeAlways": {}, + "settingsRemoveAnimationsDialogTitle": "Fjarlægja hreyfimyndir", + "@settingsRemoveAnimationsDialogTitle": {}, + "tileLayoutMosaic": "Mósaík", + "@tileLayoutMosaic": {}, + "settingsSubtitleThemeTextColor": "Litur texta", + "@settingsSubtitleThemeTextColor": {}, + "collectionDeselectSectionTooltip": "Afvelja hluta", + "@collectionDeselectSectionTooltip": {}, + "settingsKeepScreenOnTile": "Halda skjá í gangi", + "@settingsKeepScreenOnTile": {}, + "tileLayoutGrid": "Reitir", + "@tileLayoutGrid": {}, + "settingsDisplayUseTvInterface": "Android TV viðmót", + "@settingsDisplayUseTvInterface": {}, + "settingsTimeToTakeActionTile": "Tími til að grípa til aðgerða", + "@settingsTimeToTakeActionTile": {}, + "aboutCreditsWorldAtlas1": "Þetta forrit notar TopoJSON-skrá frá", + "@aboutCreditsWorldAtlas1": {}, + "tagEditorSectionRecent": "Nýlegt", + "@tagEditorSectionRecent": {}, + "nameConflictDialogMultipleSourceMessage": "Einhverjar skrár eru með sama heiti.", + "@nameConflictDialogMultipleSourceMessage": {}, + "settingsVideoSectionTitle": "Myndskeið", + "@settingsVideoSectionTitle": {}, + "appExportCovers": "Umslög", + "@appExportCovers": {}, + "viewerOpenPanoramaButtonLabel": "OPNA VÍÐMYND", + "@viewerOpenPanoramaButtonLabel": {}, + "createAlbumButtonLabel": "BÚA TIL", + "@createAlbumButtonLabel": {}, + "welcomeTermsToggle": "Ég samþykki skilmálana og kvaðir", + "@welcomeTermsToggle": {}, + "newAlbumDialogStorageLabel": "Geymslurými:", + "@newAlbumDialogStorageLabel": {}, + "doubleBackExitMessage": "Ýttu aftur á „Til baka“ til að hætta.", + "@doubleBackExitMessage": {}, + "settingsSubtitleThemeBackgroundColor": "Litur bakgrunns", + "@settingsSubtitleThemeBackgroundColor": {}, + "menuActionSlideshow": "Skyggnusýning", + "@menuActionSlideshow": {}, + "vaultLockTypePassword": "Lykilorð", + "@vaultLockTypePassword": {}, + "settingsThumbnailOverlayTile": "Yfirlag", + "@settingsThumbnailOverlayTile": {}, + "showTooltip": "Birta", + "@showTooltip": {}, + "settingsNavigationDrawerTabPages": "Síður", + "@settingsNavigationDrawerTabPages": {}, + "settingsConfirmationDialogTitle": "Staðfestingargluggar", + "@settingsConfirmationDialogTitle": {}, + "videoStreamSelectionDialogText": "Skjátextar", + "@videoStreamSelectionDialogText": {}, + "settingsVideoAutoPlay": "Sjálfvirk spilun", + "@settingsVideoAutoPlay": {}, + "settingsVideoEnableHardwareAcceleration": "Vélbúnaðarhröðun", + "@settingsVideoEnableHardwareAcceleration": {}, + "editEntryDateDialogShift": "Hliðra", + "@editEntryDateDialogShift": {}, + "viewerInfoLabelCoordinates": "Hnit", + "@viewerInfoLabelCoordinates": {}, + "nameConflictDialogSingleSourceMessage": "Sumar skrár í móttökumöppunni eru með sama heiti.", + "@nameConflictDialogSingleSourceMessage": {}, + "exportEntryDialogFormat": "Snið:", + "@exportEntryDialogFormat": {}, + "widgetOpenPageHome": "Opna upphafsskjá", + "@widgetOpenPageHome": {}, + "keepScreenOnAlways": "Alltaf", + "@keepScreenOnAlways": {}, + "appExportSettings": "Stillingar", + "@appExportSettings": {}, + "exportEntryDialogQuality": "Gæði", + "@exportEntryDialogQuality": {}, + "searchPlacesSectionTitle": "Staðir", + "@searchPlacesSectionTitle": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Ýttu og haltu niðri til að færa hnappa og velja hvaða aðgerðir séu birtar þegar verið er að velja atriði.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsSlideshowShuffle": "Stokka", + "@settingsSlideshowShuffle": {}, + "settingsThumbnailSectionTitle": "Smámyndir", + "@settingsThumbnailSectionTitle": {}, + "videoStreamSelectionDialogAudio": "Hljóð", + "@videoStreamSelectionDialogAudio": {}, + "videoSpeedDialogLabel": "Afspilunarhraði", + "@videoSpeedDialogLabel": {}, + "openMapPageTooltip": "Skoða á kortasíðu", + "@openMapPageTooltip": {}, + "videoActionSkip10": "Fara áfram um 10 sekúndur", + "@videoActionSkip10": {}, + "editEntryLocationDialogSetCustom": "Stilla sérsniðna staðsetningu", + "@editEntryLocationDialogSetCustom": {}, + "tagPlaceholderPlace": "Staður", + "@tagPlaceholderPlace": {}, + "viewerInfoUnknown": "óþekkt", + "@viewerInfoUnknown": {}, + "panoramaDisableSensorControl": "Gera skynjarastýringu óvirka", + "@panoramaDisableSensorControl": {}, + "displayRefreshRatePreferHighest": "Hæsti hraði", + "@displayRefreshRatePreferHighest": {}, + "settingsVideoShowVideos": "Sýna myndskeið", + "@settingsVideoShowVideos": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Eyða þessu atriði?} other{Eyða þessum {count} atriðum?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsViewerShowInformation": "Birta upplýsingar", + "@settingsViewerShowInformation": {}, + "placeEmpty": "Engir staðir", + "@placeEmpty": {}, + "settingsCollectionQuickActionsTile": "Flýtiaðgerðir", + "@settingsCollectionQuickActionsTile": {}, + "editEntryDateDialogExtractFromTitle": "Veiða úr titli", + "@editEntryDateDialogExtractFromTitle": {}, + "chipActionDelete": "Eyða", + "@chipActionDelete": {}, + "settingsViewerOverlayTile": "Yfirlag", + "@settingsViewerOverlayTile": {}, + "albumTierRegular": "Annað", + "@albumTierRegular": {}, + "settingsThumbnailShowFavouriteIcon": "Birta tákn fyrir eftirlæti", + "@settingsThumbnailShowFavouriteIcon": {}, + "aboutLinkLicense": "Notkunarleyfi", + "@aboutLinkLicense": {}, + "albumScreenshots": "Skjámyndir", + "@albumScreenshots": {}, + "editEntryDateDialogTitle": "Dagsetning og tími", + "@editEntryDateDialogTitle": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Textastaða", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "viewerInfoLabelOwner": "Eigandi", + "@viewerInfoLabelOwner": {}, + "changeTooltip": "Breyta", + "@changeTooltip": {}, + "editEntryLocationDialogLongitude": "Lengdargráða", + "@editEntryLocationDialogLongitude": {}, + "setCoverDialogCustom": "Sérsniðið", + "@setCoverDialogCustom": {}, + "searchCountriesSectionTitle": "Lönd", + "@searchCountriesSectionTitle": {}, + "settingsSlideshowIntervalTile": "Millibil", + "@settingsSlideshowIntervalTile": {}, + "settingsAskEverytime": "Spyrja í hvert skipti", + "@settingsAskEverytime": {}, + "editEntryDateDialogCopyField": "Afrita úr annarri dagsetningu", + "@editEntryDateDialogCopyField": {}, + "searchTagsSectionTitle": "Merki", + "@searchTagsSectionTitle": {}, + "displayRefreshRatePreferLowest": "Lægsti hraði", + "@displayRefreshRatePreferLowest": {}, + "tagEditorPageAddTagTooltip": "Bæta við merki", + "@tagEditorPageAddTagTooltip": {}, + "filterNoAddressLabel": "Ekkert heimilisfang", + "@filterNoAddressLabel": {}, + "settingsModificationWarningDialogMessage": "Aðrar stillingar munu breytast.", + "@settingsModificationWarningDialogMessage": {}, + "videoStartOverButtonLabel": "BYRJA AFTUR", + "@videoStartOverButtonLabel": {}, + "accessibilityAnimationsKeep": "Halda skjábrellum", + "@accessibilityAnimationsKeep": {}, + "settingsCollectionQuickActionEditorPageTitle": "Flýtiaðgerðir", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "policyPageTitle": "Meðferð persónuupplýsinga", + "@policyPageTitle": {}, + "tileLayoutList": "Listi", + "@tileLayoutList": {}, + "settingsStorageAccessRevokeTooltip": "Afturkalla", + "@settingsStorageAccessRevokeTooltip": {}, + "panoramaEnableSensorControl": "Virkja skynjarastýringu", + "@panoramaEnableSensorControl": {}, + "settingsSubtitleThemeTile": "Skjátextar", + "@settingsSubtitleThemeTile": {}, + "widgetDisplayedItemMostRecent": "Nýlegast", + "@widgetDisplayedItemMostRecent": {}, + "videoActionUnmute": "Hljóð á", + "@videoActionUnmute": {}, + "appPickDialogNone": "Ekkert", + "@appPickDialogNone": {}, + "filterMimeImageLabel": "Mynd", + "@filterMimeImageLabel": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Strjúktu upp/niður til að breyta birtustigi/hljóðstyrk", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsAccessibilitySectionTitle": "Auðveldað aðgengi", + "@settingsAccessibilitySectionTitle": {}, + "settingsActionExport": "Flytja út", + "@settingsActionExport": {}, + "aboutBugCopyInfoInstruction": "Afrita kerfisupplýsingar", + "@aboutBugCopyInfoInstruction": {}, + "filterNoTagLabel": "Ómerkt", + "@filterNoTagLabel": {}, + "viewerInfoViewXmlLinkText": "Skoða XML", + "@viewerInfoViewXmlLinkText": {}, + "appName": "Aves", + "@appName": {}, + "sortOrderOldestFirst": "Elsta fyrst", + "@sortOrderOldestFirst": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{Mistókst að endurnefna 1 atriði} other{Mistókst að endurnefna {count} atriðum}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoResumptionModeAlways": "Alltaf", + "@videoResumptionModeAlways": {}, + "tagEditorDiscardDialogMessage": "Viltu henda breytingum?", + "@tagEditorDiscardDialogMessage": {}, + "collectionEditSuccessFeedback": "{count, plural, =1{Breytti 1 atriði} other{Breytti {count} atriðum}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sourceStateLoading": "Innhleðsla", + "@sourceStateLoading": {}, + "sourceStateLocatingCountries": "Staðset lönd", + "@sourceStateLocatingCountries": {}, + "wallpaperTargetLock": "Læsa skjá", + "@wallpaperTargetLock": {}, + "coverDialogTabApp": "Forrit", + "@coverDialogTabApp": {}, + "settingsThumbnailShowMotionPhotoIcon": "Birta tákn fyrir hreyfiljósmyndir", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "accessibilityAnimationsRemove": "Koma í veg fyrir skjábrellur", + "@accessibilityAnimationsRemove": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP er nauðsynlegt til að geta spilað myndskeið inni í hreyfiljósmynd.\n\nErtu viss um að þú viljir fjarlægja það?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "nameConflictStrategyRename": "Endurnefna", + "@nameConflictStrategyRename": {}, + "settingsThumbnailShowRawIcon": "Birta tákn fyrir RAW", + "@settingsThumbnailShowRawIcon": {}, + "vaultLockTypePattern": "Mynstur", + "@vaultLockTypePattern": {}, + "tagPageTitle": "Merki", + "@tagPageTitle": {}, + "collectionEmptyVideos": "Engin myndskeið", + "@collectionEmptyVideos": {}, + "applyButtonLabel": "VIRKJA", + "@applyButtonLabel": {}, + "entryActionRemoveFavourite": "Fjarlægja úr eftirlætum", + "@entryActionRemoveFavourite": {}, + "aboutCreditsSectionTitle": "Framlög", + "@aboutCreditsSectionTitle": {}, + "drawerAlbumPage": "Albúm", + "@drawerAlbumPage": {}, + "statsTopCountriesSectionTitle": "Algengustu lönd", + "@statsTopCountriesSectionTitle": {}, + "settingsActionImport": "Flytja inn", + "@settingsActionImport": {}, + "viewerInfoLabelSize": "Stærð", + "@viewerInfoLabelSize": {}, + "locationPickerUseThisLocationButton": "Nota þessa staðsetningu", + "@locationPickerUseThisLocationButton": {}, + "settingsSlideshowFillScreen": "Fylla skjá", + "@settingsSlideshowFillScreen": {}, + "settingsHiddenFiltersBanner": "Myndir og myndskeið sem samsvara felusíum, munu ekki birtast í safninu þínu.", + "@settingsHiddenFiltersBanner": {}, + "viewerSetWallpaperButtonLabel": "SETJA BAKGRUNN", + "@viewerSetWallpaperButtonLabel": {}, + "settingsVideoResumptionModeTile": "Halda afspilun áfram", + "@settingsVideoResumptionModeTile": {}, + "searchRatingSectionTitle": "Einkunnir", + "@searchRatingSectionTitle": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{Mistókst að afrita 1 atriði} other{Mistókst að afrita {count} atriðum}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsDisabled": "Óvirkt", + "@settingsDisabled": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Tvíbankaðu til að spila/setja í bið", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "coordinateFormatDecimal": "Gráður í tugakerfi", + "@coordinateFormatDecimal": {}, + "overlayHistogramLuminance": "Ljómi", + "@overlayHistogramLuminance": {}, + "coordinateDmsEast": "A", + "@coordinateDmsEast": {}, + "filterAspectRatioLandscapeLabel": "Lárétt", + "@filterAspectRatioLandscapeLabel": {}, + "albumTierApps": "Forrit", + "@albumTierApps": {}, + "filterAspectRatioPortraitLabel": "Lóðrétt", + "@filterAspectRatioPortraitLabel": {}, + "settingsWidgetDisplayedItem": "Birt atriði", + "@settingsWidgetDisplayedItem": {}, + "aboutBugSaveLogInstruction": "Vista atvikaskráningu forrits í skrá", + "@aboutBugSaveLogInstruction": {}, + "settingsActionImportDialogTitle": "Flytja inn", + "@settingsActionImportDialogTitle": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "entryActionRotateScreen": "Snúa skjánum", + "@entryActionRotateScreen": {}, + "albumGroupTier": "Eftir flokki", + "@albumGroupTier": {}, + "aboutBugReportInstruction": "Tilkynna á GitHub með atvikaskrám og kerfisupplýsingum", + "@aboutBugReportInstruction": {}, + "videoActionCaptureFrame": "Taka ramma", + "@videoActionCaptureFrame": {}, + "patternDialogEnter": "Settu inn mynstur", + "@patternDialogEnter": {}, + "settingsEnableBin": "Nota ruslmöppu", + "@settingsEnableBin": {}, + "entryActionViewMotionPhotoVideo": "Opna myndskeið", + "@entryActionViewMotionPhotoVideo": {}, + "otherDirectoryDescription": "„{name}“ möppu", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "viewerTransitionZoomIn": "Renna að", + "@viewerTransitionZoomIn": {}, + "drawerCollectionAll": "Allt safnið", + "@drawerCollectionAll": {}, + "collectionMoveSuccessFeedback": "{count, plural, =1{Færði 1 atriði} other{Færði {count} atriðum}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSubtitleThemeTextAlignmentLeft": "Vinstri", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsVideoGestureSideDoubleTapSeek": "Tvíbankaðu á skjájaðra leita afturábak/áfram", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "sortByItemCount": "Eftir fjölda atriða", + "@sortByItemCount": {}, + "sectionUnknown": "Óþekkt", + "@sectionUnknown": {}, + "dateToday": "Í dag", + "@dateToday": {}, + "filterNoTitleLabel": "Án titils", + "@filterNoTitleLabel": {}, + "videoStreamSelectionDialogNoSelection": "Það eru engir aðrir ferlar.", + "@videoStreamSelectionDialogNoSelection": {}, + "searchRecentSectionTitle": "Nýlegt", + "@searchRecentSectionTitle": {}, + "albumPickPageTitlePick": "Veldu albúm", + "@albumPickPageTitlePick": {}, + "videoPlaybackMuted": "Afspilun án hljóðs", + "@videoPlaybackMuted": {}, + "settingsSubtitleThemeTextAlignmentRight": "Hægri", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "menuActionMap": "Kort", + "@menuActionMap": {}, + "entryInfoActionRemoveMetadata": "Fjarlægja lýsigögn", + "@entryInfoActionRemoveMetadata": {}, + "collectionActionMove": "Færa í albúm", + "@collectionActionMove": {}, + "searchAlbumsSectionTitle": "Albúm", + "@searchAlbumsSectionTitle": {}, + "settingsLanguagePageTitle": "Tungumál", + "@settingsLanguagePageTitle": {}, + "rootDirectoryDescription": "rótarmöppu", + "@rootDirectoryDescription": {}, + "viewDialogGroupSectionTitle": "Hlutar", + "@viewDialogGroupSectionTitle": {}, + "maxBrightnessAlways": "Alltaf", + "@maxBrightnessAlways": {}, + "settingsAllowMediaManagement": "Leyfa stýringu gagnamiðla", + "@settingsAllowMediaManagement": {}, + "aboutDataUsageSectionTitle": "Gagnanotkun", + "@aboutDataUsageSectionTitle": {}, + "durationDialogSeconds": "Sekúndur", + "@durationDialogSeconds": {}, + "themeBrightnessLight": "Ljóst", + "@themeBrightnessLight": {}, + "unitSystemImperial": "Breskt Imperial kerfi", + "@unitSystemImperial": {}, + "filterMimeVideoLabel": "Myndskeið", + "@filterMimeVideoLabel": {}, + "chipActionPin": "Festa efst", + "@chipActionPin": {}, + "albumEmpty": "Engin albúm", + "@albumEmpty": {}, + "editEntryLocationDialogChooseOnMap": "Velja á korti", + "@editEntryLocationDialogChooseOnMap": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Ýttu og haltu niðri til að færa hnappa og velja hvaða aðgerðir séu birtar þegar verið er að fletta í gegnum atriði.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsConfirmationBeforeDeleteItems": "Spyrja áður en atriðum er endanlega eytt", + "@settingsConfirmationBeforeDeleteItems": {}, + "sortByName": "Eftir nafni", + "@sortByName": {}, + "settingsHomeDialogTitle": "Heim", + "@settingsHomeDialogTitle": {}, + "searchDateSectionTitle": "Dagsetning", + "@searchDateSectionTitle": {}, + "viewerErrorUnknown": "Úbbs!", + "@viewerErrorUnknown": {}, + "themeBrightnessDark": "Dökkt", + "@themeBrightnessDark": {}, + "doNotAskAgain": "Ekki spyrja aftur", + "@doNotAskAgain": {}, + "entryActionConvertMotionPhotoToStillImage": "Umbreyta í kyrrmynd", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionCast": "Leikarar", + "@entryActionCast": {}, + "entryInfoActionEditTitleDescription": "Breyta titli og lýsingu", + "@entryInfoActionEditTitleDescription": {}, + "nextTooltip": "Næsta", + "@nextTooltip": {}, + "collectionSearchTitlesHintText": "Leita í lagatitlum", + "@collectionSearchTitlesHintText": {}, + "entryInfoActionEditLocation": "Breyta staðsetningu", + "@entryInfoActionEditLocation": {}, + "viewerInfoSearchSuggestionDate": "Dagsetning og tími", + "@viewerInfoSearchSuggestionDate": {}, + "videoPlaybackWithSound": "Afspilun með hljóði", + "@videoPlaybackWithSound": {}, + "viewerInfoLabelTitle": "Titill", + "@viewerInfoLabelTitle": {}, + "searchCollectionFieldHint": "Leita í safni", + "@searchCollectionFieldHint": {}, + "viewerActionUnlock": "Aflæsa skoðara", + "@viewerActionUnlock": {}, + "settingsDoubleBackExit": "Ýttu tvisvar á „Til baka“ til að hætta", + "@settingsDoubleBackExit": {}, + "entryActionShare": "Deila", + "@entryActionShare": {}, + "drawerCollectionSphericalVideos": "360° myndskeið", + "@drawerCollectionSphericalVideos": {}, + "moveUndatedConfirmationDialogMessage": "Vista dagsetningar atriðis áður en haldið er áfram?", + "@moveUndatedConfirmationDialogMessage": {}, + "collectionEditFailureFeedback": "{count, plural, =1{Mistókst að breyta 1 atriði} other{Mistókst að breyta {count} atriðum}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoActionPause": "Í bið", + "@videoActionPause": {}, + "noMatchingAppDialogMessage": "Ekkert forrit fannst sem getur meðhöndlað þessa aðgerð.", + "@noMatchingAppDialogMessage": {}, + "settingsThumbnailOverlayPageTitle": "Yfirlag", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsViewerShowInformationSubtitle": "Birta titil, dagsetningu, staðsetningu, o.s.frv.", + "@settingsViewerShowInformationSubtitle": {}, + "saveTooltip": "Vista", + "@saveTooltip": {}, + "searchMetadataSectionTitle": "Lýsigögn", + "@searchMetadataSectionTitle": {}, + "widgetOpenPageCollection": "Opna myndasafn", + "@widgetOpenPageCollection": {}, + "clearTooltip": "Hreinsa", + "@clearTooltip": {}, + "settingsWidgetOpenPage": "Þegar ýtt er á viðmótshlutann", + "@settingsWidgetOpenPage": {}, + "renameProcessorName": "Heiti", + "@renameProcessorName": {}, + "viewerInfoSearchFieldLabel": "Leita í lýsigögnum", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoLabelDescription": "Lýsing", + "@viewerInfoLabelDescription": {}, + "nameConflictStrategySkip": "Sleppa", + "@nameConflictStrategySkip": {}, + "addShortcutButtonLabel": "BÆTA VIÐ", + "@addShortcutButtonLabel": {}, + "exportEntryDialogHeight": "Hæð", + "@exportEntryDialogHeight": {}, + "collectionActionEmptyBin": "Tæma ruslið", + "@collectionActionEmptyBin": {}, + "settingsSlideshowRepeat": "Endurtaka", + "@settingsSlideshowRepeat": {}, + "settingsViewerQuickActionEditorPageTitle": "Flýtiaðgerðir", + "@settingsViewerQuickActionEditorPageTitle": {}, + "sortOrderAtoZ": "A til Ö", + "@sortOrderAtoZ": {}, + "settingsVideoPageTitle": "Myndstillingar", + "@settingsVideoPageTitle": {}, + "setCoverDialogAuto": "Sjálfvirkt", + "@setCoverDialogAuto": {}, + "tagEditorPageNewTagFieldLabel": "Nýtt merki", + "@tagEditorPageNewTagFieldLabel": {}, + "exportEntryDialogWidth": "Breidd", + "@exportEntryDialogWidth": {}, + "newAlbumDialogTitle": "Nýtt albúm", + "@newAlbumDialogTitle": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{Endurnefndi 1 atriði} other{Endurnefndi {count} atriðum}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoStreamSelectionDialogTrack": "Ferill", + "@videoStreamSelectionDialogTrack": {}, + "settingsViewerUseCutout": "Nota útklippt svæði", + "@settingsViewerUseCutout": {}, + "tagEditorPageTitle": "Breyta merkjum", + "@tagEditorPageTitle": {}, + "settingsWidgetShowOutline": "Útlínur", + "@settingsWidgetShowOutline": {}, + "settingsHomeTile": "Heim", + "@settingsHomeTile": {}, + "entryActionOpenMap": "Birta í landakortaforriti", + "@entryActionOpenMap": {}, + "collectionGroupDay": "Eftir dögum", + "@collectionGroupDay": {}, + "collectionGroupAlbum": "Eftir albúmum", + "@collectionGroupAlbum": {}, + "newFilterBanner": "nýtt", + "@newFilterBanner": {}, + "drawerCollectionFavourites": "Eftirlæti", + "@drawerCollectionFavourites": {}, + "filterTypeRawLabel": "RAW", + "@filterTypeRawLabel": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Miðjað", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "keepScreenOnVideoPlayback": "Á meðan myndskeið er í spilun", + "@keepScreenOnVideoPlayback": {}, + "vaultLockTypePin": "PIN-númer", + "@vaultLockTypePin": {}, + "settingsSubtitleThemeTextAlignmentTile": "Jöfnun texta", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "editorTransformCrop": "Utansníða", + "@editorTransformCrop": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter-pakkar", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "settingsCollectionQuickActionTabSelecting": "Val", + "@settingsCollectionQuickActionTabSelecting": {}, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "chipActionRename": "Endurnefna", + "@chipActionRename": {}, + "filterTaggedLabel": "Merkt", + "@filterTaggedLabel": {}, + "statePageTitle": "Héruð", + "@statePageTitle": {}, + "drawerTagPage": "Merki", + "@drawerTagPage": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Mappa er þegar til staðar", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "patternDialogConfirm": "Staðfestu mynstrið", + "@patternDialogConfirm": {}, + "durationDialogMinutes": "Mínútur", + "@durationDialogMinutes": {}, + "settingsAllowErrorReporting": "Leyfa nafnlausar villutilkynningar", + "@settingsAllowErrorReporting": {}, + "settingsVideoLoopModeTile": "Endurtekningarhamur", + "@settingsVideoLoopModeTile": {}, + "hideTooltip": "Fela", + "@hideTooltip": {}, + "settingsScreenSaverPageTitle": "Skjáhvíla", + "@settingsScreenSaverPageTitle": {}, + "settingsNavigationDrawerEditorPageTitle": "Flakkvalmynd", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Spyrja áður en ódagsett atriði eru færð", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "albumPageTitle": "Albúm", + "@albumPageTitle": {}, + "editEntryLocationDialogTitle": "Staðsetning", + "@editEntryLocationDialogTitle": {}, + "statsWithGps": "{count, plural, =1{1 atriði með staðsetningu} other{{count} atriði með staðsetningum}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsVideoResumptionModeDialogTitle": "Halda afspilun áfram", + "@settingsVideoResumptionModeDialogTitle": {}, + "albumTierPinned": "Fest", + "@albumTierPinned": {}, + "mapStyleDialogTitle": "Stíll korts", + "@mapStyleDialogTitle": {}, + "entryActionRotateCCW": "Snúa rangsælis", + "@entryActionRotateCCW": {}, + "settingsVideoBackgroundMode": "Bakgrunnshamur", + "@settingsVideoBackgroundMode": {}, + "chipActionGoToPlacePage": "Birta í Staðir", + "@chipActionGoToPlacePage": {}, + "albumPickPageTitleCopy": "Afrita í albúm", + "@albumPickPageTitleCopy": {}, + "collectionActionCopy": "Afrita í albúm", + "@collectionActionCopy": {}, + "entryActionPrint": "Prenta", + "@entryActionPrint": {}, + "settingsAllowInstalledAppAccess": "Leyfa aðgang að forritaskrá", + "@settingsAllowInstalledAppAccess": {}, + "entryActionShowGeoTiffOnMap": "Birta sem yfirlag á korti", + "@entryActionShowGeoTiffOnMap": {}, + "viewDialogReverseSortOrder": "Öfug röð", + "@viewDialogReverseSortOrder": {}, + "menuActionConfigureView": "Skoða", + "@menuActionConfigureView": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart-pakkar", + "@aboutLicensesDartPackagesSectionTitle": {}, + "drawerCollectionMotionPhotos": "Hreyfiljósmyndir", + "@drawerCollectionMotionPhotos": {}, + "settingsDefault": "Sjálfgefið", + "@settingsDefault": {}, + "settingsSlideshowAnimatedZoomEffect": "Aðdráttur með hreyfingu", + "@settingsSlideshowAnimatedZoomEffect": {}, + "viewerActionSettings": "Stillingar", + "@viewerActionSettings": {}, + "placePageTitle": "Staðir", + "@placePageTitle": {}, + "filterOnThisDayLabel": "Á þessum degi", + "@filterOnThisDayLabel": {}, + "columnCount": "{count, plural, =1{{count} dálkur} other{{count} dálkar}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "viewerTransitionNone": "Ekkert", + "@viewerTransitionNone": {}, + "chipActionGoToAlbumPage": "Birta í Albúm", + "@chipActionGoToAlbumPage": {}, + "settingsDisplayRefreshRateModeTile": "Birta uppfærslutíðni", + "@settingsDisplayRefreshRateModeTile": {}, + "addShortcutDialogLabel": "Skýring flýtilykils", + "@addShortcutDialogLabel": {}, + "settingsViewerOverlayPageTitle": "Yfirlag", + "@settingsViewerOverlayPageTitle": {}, + "tagEmpty": "Engin merki", + "@tagEmpty": {}, + "pinDialogEnter": "Settu inn PIN-númer", + "@pinDialogEnter": {}, + "videoControlsPlayOutside": "Opna með öðrum spilara", + "@videoControlsPlayOutside": {}, + "settingsCoordinateFormatDialogTitle": "Snið hnita", + "@settingsCoordinateFormatDialogTitle": {}, + "collectionActionShowTitleSearch": "Birta titilsíu", + "@collectionActionShowTitleSearch": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "settingsNavigationDrawerTabTypes": "Tegundir", + "@settingsNavigationDrawerTabTypes": {}, + "menuActionSelectAll": "Velja allt", + "@menuActionSelectAll": {}, + "settingsHiddenItemsTile": "Falin atriði", + "@settingsHiddenItemsTile": {}, + "maxBrightnessNever": "Aldrei", + "@maxBrightnessNever": {}, + "aboutDataUsageCache": "Skyndiminni", + "@aboutDataUsageCache": {}, + "settingsConfirmationTile": "Staðfestingargluggar", + "@settingsConfirmationTile": {}, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "settingsThumbnailShowVideoDuration": "Birta tímalengd myndskeiða", + "@settingsThumbnailShowVideoDuration": {}, + "passwordDialogConfirm": "Staðfestu lykilorð", + "@passwordDialogConfirm": {}, + "videoActionReplay10": "Fara afturábak um 10 sekúndur", + "@videoActionReplay10": {}, + "settingsCollectionBurstPatternsNone": "Ekkert", + "@settingsCollectionBurstPatternsNone": {}, + "albumMimeTypeMixed": "Blandað", + "@albumMimeTypeMixed": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Tiltækir hnappar", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "itemCount": "{count, plural, =1{{count} atriði} other{{count} atriðum}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "widgetTapUpdateWidget": "Uppfæra viðmótshluta", + "@widgetTapUpdateWidget": {}, + "settingsViewerShowDescription": "Birta lýsingu", + "@settingsViewerShowDescription": {}, + "viewerTransitionFade": "Deyfing", + "@viewerTransitionFade": {}, + "actionRemove": "Fjarlægja", + "@actionRemove": {}, + "cropAspectRatioFree": "Frjálst", + "@cropAspectRatioFree": {}, + "aboutLinkPolicy": "Meðferð persónuupplýsinga", + "@aboutLinkPolicy": {}, + "filterTypeSphericalVideoLabel": "360° myndskeið", + "@filterTypeSphericalVideoLabel": {}, + "slideshowActionShowInCollection": "Sýna í safni", + "@slideshowActionShowInCollection": {}, + "chipActionLock": "Læsa", + "@chipActionLock": {}, + "filterNoRatingLabel": "Án einkunnar", + "@filterNoRatingLabel": {}, + "settingsUnitSystemTile": "Einingar", + "@settingsUnitSystemTile": {}, + "entryActionOpen": "Opna með", + "@entryActionOpen": {}, + "pickTooltip": "Veldu", + "@pickTooltip": {}, + "settingsCoordinateFormatTile": "Snið hnita", + "@settingsCoordinateFormatTile": {}, + "settingsViewerQuickActionEditorBanner": "Ýttu og haltu niðri til að færa hnappa og velja hvaða aðgerðir séu birtar í skoðaranum.", + "@settingsViewerQuickActionEditorBanner": {}, + "themeBrightnessBlack": "Svart", + "@themeBrightnessBlack": {}, + "filterNoLocationLabel": "Óstaðsett", + "@filterNoLocationLabel": {}, + "mapZoomInTooltip": "Renna að", + "@mapZoomInTooltip": {}, + "viewerInfoOpenLinkText": "Opna", + "@viewerInfoOpenLinkText": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD-minniskorti", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "renameEntrySetPagePatternFieldLabel": "Nefningarmynstur", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameAlbumDialogLabel": "Nýtt heiti", + "@renameAlbumDialogLabel": {}, + "videoActionPlay": "Afspilun", + "@videoActionPlay": {}, + "chipActionGoToCountryPage": "Birta í Lönd", + "@chipActionGoToCountryPage": {}, + "deleteButtonLabel": "EYÐA", + "@deleteButtonLabel": {}, + "settingsDisablingBinWarningDialogMessage": "Atriðum í ruslinu verður endanlega eytt.", + "@settingsDisablingBinWarningDialogMessage": {}, + "entryActionSetAs": "Setja sem", + "@entryActionSetAs": {}, + "sortOrderLowestFirst": "Lægsta fyrst", + "@sortOrderLowestFirst": {}, + "statsTopStatesSectionTitle": "Algengustu héruð", + "@statsTopStatesSectionTitle": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Birtir hnappar", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsVideoPlaybackPageTitle": "Afspilun", + "@settingsVideoPlaybackPageTitle": {}, + "filterLocatedLabel": "Staðsett", + "@filterLocatedLabel": {}, + "videoPlaybackSkip": "Sleppa", + "@videoPlaybackSkip": {}, + "mapStyleTooltip": "Veldu stíl korts", + "@mapStyleTooltip": {}, + "countryPageTitle": "Lönd", + "@countryPageTitle": {}, + "albumGroupType": "Eftir gerð", + "@albumGroupType": {}, + "entryActionInfo": "Upplýsingar", + "@entryActionInfo": {}, + "viewerErrorDoesNotExist": "Skráin er ekki lengur til.", + "@viewerErrorDoesNotExist": {}, + "albumCamera": "Myndavél", + "@albumCamera": {}, + "settingsNavigationSectionTitle": "Flakk", + "@settingsNavigationSectionTitle": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Uppfærslutíðni", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "viewerInfoLabelUri": "Vefslóð", + "@viewerInfoLabelUri": {}, + "entryActionViewSource": "Skoða uppruna", + "@entryActionViewSource": {}, + "entryActionShareVideoOnly": "Deila einungis myndskeiði", + "@entryActionShareVideoOnly": {}, + "filterTypePanoramaLabel": "Víðmynd", + "@filterTypePanoramaLabel": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "passwordDialogEnter": "Settu inn lykilorð", + "@passwordDialogEnter": {}, + "applyTooltip": "Virkja", + "@applyTooltip": {}, + "mapZoomOutTooltip": "Renna frá", + "@mapZoomOutTooltip": {}, + "entryInfoActionEditTags": "Breyta merkjum", + "@entryInfoActionEditTags": {}, + "collectionActionHideTitleSearch": "Fela titilsíu", + "@collectionActionHideTitleSearch": {}, + "mapAttributionOsmHot": "Kortatíglar frá [HOT](https://www.hotosm.org/) • Hýst af [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "settingsNavigationDrawerTile": "Leiðsagnarval", + "@settingsNavigationDrawerTile": {}, + "drawerCollectionAnimated": "Með hreyfingu", + "@drawerCollectionAnimated": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Mappa er þegar til staðar", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "settingsHiddenItemsPageTitle": "Falin atriði", + "@settingsHiddenItemsPageTitle": {}, + "durationDialogHours": "Klukkustundir", + "@durationDialogHours": {}, + "settingsKeepScreenOnDialogTitle": "Halda skjá í gangi", + "@settingsKeepScreenOnDialogTitle": {}, + "wallpaperTargetHome": "Upphafsskjár", + "@wallpaperTargetHome": {}, + "settingsViewerShowOverlayOnOpening": "Birta við opnun", + "@settingsViewerShowOverlayOnOpening": {}, + "nextButtonLabel": "NÆSTA", + "@nextButtonLabel": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Sýna aðra valkosti með mörgum bendingum", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "videoActionSelectStreams": "Veldu ferla", + "@videoActionSelectStreams": {}, + "settingsViewerShowShootingDetails": "Sýna ítarlegri upplýsingar um myndatöku", + "@settingsViewerShowShootingDetails": {}, + "settingsConfirmationAfterMoveToBinItems": "Sýna skilaboð eftir að atriði eru færð í ruslmöppuna", + "@settingsConfirmationAfterMoveToBinItems": {}, + "widgetDisplayedItemRandom": "Handahóf", + "@widgetDisplayedItemRandom": {}, + "settingsLanguageSectionTitle": "Tungumál og snið", + "@settingsLanguageSectionTitle": {}, + "drawerPlacePage": "Staðir", + "@drawerPlacePage": {}, + "menuActionSelect": "Velja", + "@menuActionSelect": {}, + "drawerCollectionPanoramas": "Víðmyndir", + "@drawerCollectionPanoramas": {}, + "renameEntrySetPagePreviewSectionTitle": "Forskoðun", + "@renameEntrySetPagePreviewSectionTitle": {}, + "filterBinLabel": "Ruslmappa", + "@filterBinLabel": {}, + "settingsDisplaySectionTitle": "Birting", + "@settingsDisplaySectionTitle": {}, + "settingsSlideshowTransitionTile": "Millifærsla", + "@settingsSlideshowTransitionTile": {}, + "settingsPageTitle": "Stillingar", + "@settingsPageTitle": {}, + "welcomeMessage": "Velkomin í Aves", + "@welcomeMessage": {}, + "subtitlePositionTop": "Efst", + "@subtitlePositionTop": {}, + "menuActionSelectNone": "Velja ekkert", + "@menuActionSelectNone": {}, + "showButtonLabel": "BIRTA", + "@showButtonLabel": {}, + "entryActionConvert": "Umbreyta", + "@entryActionConvert": {}, + "sourceViewerPageTitle": "Uppruni", + "@sourceViewerPageTitle": {}, + "aboutDataUsageClearCache": "Hreinsa skyndiminni", + "@aboutDataUsageClearCache": {}, + "settingsSearchFieldLabel": "Leita í stillingum", + "@settingsSearchFieldLabel": {}, + "appExportFavourites": "Eftirlæti", + "@appExportFavourites": {}, + "collectionEmptyImages": "Engar myndir", + "@collectionEmptyImages": {}, + "settingsViewerMaximumBrightness": "Hámarksbirtustig", + "@settingsViewerMaximumBrightness": {}, + "albumPickPageTitleExport": "Flytja út í albúm", + "@albumPickPageTitleExport": {}, + "settingsThumbnailShowTagIcon": "Birta tákn fyrir merki", + "@settingsThumbnailShowTagIcon": {}, + "settingsStorageAccessEmpty": "Engiar aðgangsheimildir", + "@settingsStorageAccessEmpty": {}, + "settingsRemoveAnimationsTile": "Fjarlægja hreyfimyndir", + "@settingsRemoveAnimationsTile": {}, + "settingsActionExportDialogTitle": "Flytja út", + "@settingsActionExportDialogTitle": {}, + "genericDangerWarningDialogMessage": "Ertu viss?", + "@genericDangerWarningDialogMessage": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "vaultDialogLockTypeLabel": "Tegund læsingar", + "@vaultDialogLockTypeLabel": {}, + "aboutDataUsageExternal": "Utanaðkomandi", + "@aboutDataUsageExternal": {}, + "collectionSelectPageTitle": "Veldu atriði", + "@collectionSelectPageTitle": {}, + "entryInfoActionEditDate": "Breyta dagsetningu og tíma", + "@entryInfoActionEditDate": {}, + "hideButtonLabel": "FELA", + "@hideButtonLabel": {}, + "editEntryLocationDialogLatitude": "Breiddargráða", + "@editEntryLocationDialogLatitude": {}, + "slideshowActionResume": "Halda áfram", + "@slideshowActionResume": {}, + "cropAspectRatioSquare": "Ferningur", + "@cropAspectRatioSquare": {}, + "collectionActionRescan": "Endurskanna", + "@collectionActionRescan": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{Afritaði 1 atriði} other{Afritaði {count} atriðum}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsNavigationDrawerBanner": "Ýttu og haltu niðri til að endurraða valmyndaratriðum.", + "@settingsNavigationDrawerBanner": {}, + "settingsWidgetPageTitle": "Myndarammi", + "@settingsWidgetPageTitle": {}, + "viewDialogSortSectionTitle": "Raða", + "@viewDialogSortSectionTitle": {}, + "continueButtonLabel": "HALDA ÁFRAM", + "@continueButtonLabel": {}, + "collectionPageTitle": "Safn", + "@collectionPageTitle": {}, + "unitSystemMetric": "Metrakerfi", + "@unitSystemMetric": {}, + "overlayHistogramNone": "Ekkert", + "@overlayHistogramNone": {}, + "filterRecentlyAddedLabel": "Nýlega bætt við", + "@filterRecentlyAddedLabel": {}, + "editEntryDialogTargetFieldsHeader": "Gagnasvið sem á að breyta", + "@editEntryDialogTargetFieldsHeader": {}, + "storageVolumeDescriptionFallbackPrimary": "innbyggðri geymslu", + "@storageVolumeDescriptionFallbackPrimary": {}, + "collectionActionAddShortcut": "Bæta við flýtileið", + "@collectionActionAddShortcut": {}, + "settingsViewerShowMinimap": "Birta smákort", + "@settingsViewerShowMinimap": {}, + "previousTooltip": "Fyrra", + "@previousTooltip": {}, + "viewerInfoLabelPath": "Slóð", + "@viewerInfoLabelPath": {}, + "albumGroupVolume": "Eftir gagnageymslu", + "@albumGroupVolume": {}, + "collectionGroupMonth": "Eftir mánuðum", + "@collectionGroupMonth": {}, + "viewerInfoLabelResolution": "Upplausn", + "@viewerInfoLabelResolution": {}, + "renameProcessorCounter": "Teljari", + "@renameProcessorCounter": {}, + "settingsImageBackground": "Bakgrunnur mynda", + "@settingsImageBackground": {}, + "newAlbumDialogNameLabel": "Heiti albúms", + "@newAlbumDialogNameLabel": {}, + "cropAspectRatioOriginal": "Upprunaleg", + "@cropAspectRatioOriginal": {}, + "sortByDate": "Eftir dagsetningu", + "@sortByDate": {}, + "statsTopAlbumsSectionTitle": "Vinsælustu albúm", + "@statsTopAlbumsSectionTitle": {}, + "entryActionRename": "Endurnefna", + "@entryActionRename": {}, + "viewerInfoLabelDuration": "Tímalengd", + "@viewerInfoLabelDuration": {}, + "sortOrderZtoA": "Ö til A", + "@sortOrderZtoA": {}, + "keepScreenOnNever": "Aldrei", + "@keepScreenOnNever": {}, + "statsPageTitle": "Tölfræði", + "@statsPageTitle": {}, + "viewerInfoSearchSuggestionDimensions": "Stærðir", + "@viewerInfoSearchSuggestionDimensions": {}, + "mapStyleOsmHot": "OSM fyrir hjálparstarf", + "@mapStyleOsmHot": {}, + "drawerAboutButton": "Um hugbúnaðinn", + "@drawerAboutButton": {}, + "aboutTranslatorsSectionTitle": "Þýðendur", + "@aboutTranslatorsSectionTitle": {}, + "statsTopPlacesSectionTitle": "Algengustu staðir", + "@statsTopPlacesSectionTitle": {}, + "videoStreamSelectionDialogOff": "Slökkt", + "@videoStreamSelectionDialogOff": {}, + "settingsVideoLoopModeDialogTitle": "Endurtekningarhamur", + "@settingsVideoLoopModeDialogTitle": {}, + "drawerCollectionImages": "Myndir", + "@drawerCollectionImages": {}, + "sortOrderSmallestFirst": "Minnsta fyrst", + "@sortOrderSmallestFirst": {}, + "timeSeconds": "{count, plural, =1{{count} sekúnda} other{{count} sekúndur}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "sortBySize": "Eftir stærð", + "@sortBySize": {}, + "viewerInfoSearchSuggestionDescription": "Lýsing", + "@viewerInfoSearchSuggestionDescription": {}, + "settingsViewerShowOverlayThumbnails": "Birta smámyndir", + "@settingsViewerShowOverlayThumbnails": {}, + "collectionPickPageTitle": "Veldu", + "@collectionPickPageTitle": {}, + "settingsVideoControlsPageTitle": "Stýringar", + "@settingsVideoControlsPageTitle": {}, + "welcomeOptional": "Valfrjálst", + "@welcomeOptional": {}, + "aboutBugReportButton": "Tilkynna", + "@aboutBugReportButton": {}, + "collectionEmptyGrantAccessButtonLabel": "Veita aðgang", + "@collectionEmptyGrantAccessButtonLabel": {}, + "filterTypeMotionPhotoLabel": "Hreyfiljósmynd", + "@filterTypeMotionPhotoLabel": {}, + "resetTooltip": "Endurstilla", + "@resetTooltip": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "videoStreamSelectionDialogVideo": "Myndskeið", + "@videoStreamSelectionDialogVideo": {}, + "viewDialogLayoutSectionTitle": "Framsetning", + "@viewDialogLayoutSectionTitle": {}, + "chipActionUnpin": "Losa af efri hluta", + "@chipActionUnpin": {}, + "searchStatesSectionTitle": "Héruð", + "@searchStatesSectionTitle": {}, + "chipActionGoToTagPage": "Birta í Merki", + "@chipActionGoToTagPage": {}, + "filterTypeAnimatedLabel": "Með hreyfingu", + "@filterTypeAnimatedLabel": {}, + "videoLoopModeNever": "Aldrei", + "@videoLoopModeNever": {}, + "settingsUnitSystemDialogTitle": "Einingar", + "@settingsUnitSystemDialogTitle": {}, + "videoActionSetSpeed": "Afspilunarhraði", + "@videoActionSetSpeed": {}, + "dateThisMonth": "Í þessum mánuði", + "@dateThisMonth": {}, + "renameEntrySetPageTitle": "Endurnefna", + "@renameEntrySetPageTitle": {}, + "settingsConfirmationBeforeMoveToBinItems": "Spyrja áður en atriði eru færð í ruslmöppuna", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsSlideshowVideoPlaybackTile": "Afspilun myndskeiða", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsHiddenFiltersEmpty": "Engar felusíur", + "@settingsHiddenFiltersEmpty": {}, + "aboutPageTitle": "Um hugbúnaðinn", + "@aboutPageTitle": {}, + "sortByRating": "Eftir einkunn", + "@sortByRating": {}, + "stateEmpty": "Engin héruð", + "@stateEmpty": {}, + "viewerInfoSearchEmpty": "Engir samsvarandi lyklar", + "@viewerInfoSearchEmpty": {}, + "filterFavouriteLabel": "Eftirlæti", + "@filterFavouriteLabel": {}, + "drawerCountryPage": "Lönd", + "@drawerCountryPage": {}, + "aboutBugSectionTitle": "Villuskýrsla", + "@aboutBugSectionTitle": {}, + "filterRatingRejectedLabel": "Hafnað", + "@filterRatingRejectedLabel": {}, + "sourceStateLocatingPlaces": "Staðset staði", + "@sourceStateLocatingPlaces": {}, + "settingsThumbnailShowLocationIcon": "Birta tákn fyrir staðsetningu", + "@settingsThumbnailShowLocationIcon": {}, + "editEntryDialogCopyFromItem": "Afrita úr öðru atriði", + "@editEntryDialogCopyFromItem": {}, + "settingsStorageAccessPageTitle": "Aðgengi geymslu", + "@settingsStorageAccessPageTitle": {}, + "genericFailureFeedback": "Mistókst", + "@genericFailureFeedback": {}, + "aboutDataUsageData": "Gögn", + "@aboutDataUsageData": {}, + "settingsThemeEnableDynamicColor": "Breytilegur litur", + "@settingsThemeEnableDynamicColor": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Mistókst að ná í ívafin gögn", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "aboutDataUsageInternal": "Innri", + "@aboutDataUsageInternal": {}, + "albumDownload": "Sækja", + "@albumDownload": {}, + "coverDialogTabColor": "Litur", + "@coverDialogTabColor": {}, + "coordinateDmsWest": "V", + "@coordinateDmsWest": {}, + "genericSuccessFeedback": "Lokið!", + "@genericSuccessFeedback": {}, + "videoActionMute": "Hljóð af", + "@videoActionMute": {}, + "renameEntryDialogLabel": "Nýtt heiti", + "@renameEntryDialogLabel": {}, + "renameEntrySetPageInsertTooltip": "Setja inn gagnasvið", + "@renameEntrySetPageInsertTooltip": {}, + "aboutLicensesShowAllButtonLabel": "Sýna öll notkunarleyfi", + "@aboutLicensesShowAllButtonLabel": {}, + "settingsSubtitleThemeBackgroundOpacity": "Ógegnsæi bakgrunns", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsStorageAccessTile": "Aðgengi geymslu", + "@settingsStorageAccessTile": {}, + "entryActionDelete": "Eyða", + "@entryActionDelete": {}, + "settingsThemeBrightnessTile": "Þema", + "@settingsThemeBrightnessTile": {}, + "settingsViewerQuickActionEmpty": "Engir hnappar", + "@settingsViewerQuickActionEmpty": {}, + "viewerInfoBackToViewerTooltip": "Til baka í skoðara", + "@viewerInfoBackToViewerTooltip": {}, + "settingsSystemDefault": "Sjálfgefið í kerfinu", + "@settingsSystemDefault": {}, + "settingsViewerSlideshowTile": "Skyggnusýning", + "@settingsViewerSlideshowTile": {}, + "settingsCollectionTile": "Safn", + "@settingsCollectionTile": {}, + "entryActionRotateCW": "Snúa réttsælis", + "@entryActionRotateCW": {}, + "settingsSubtitleThemeTextOpacity": "Ógegnsæi texta", + "@settingsSubtitleThemeTextOpacity": {}, + "sortOrderNewestFirst": "Nýjast fyrst", + "@sortOrderNewestFirst": {}, + "settingsViewerShowRatingTags": "Birta einkunn og merki", + "@settingsViewerShowRatingTags": {}, + "drawerSettingsButton": "Stillingar", + "@drawerSettingsButton": {}, + "entryActionFlip": "Fletta lárétt", + "@entryActionFlip": {}, + "drawerCollectionRaws": "RAW-myndir", + "@drawerCollectionRaws": {}, + "settingsViewerEnableOverlayBlurEffect": "Móðunarbrella", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsMotionPhotoAutoPlay": "Spila hreyfiljósmyndir sjálfkrafa", + "@settingsMotionPhotoAutoPlay": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "settingsVideoControlsTile": "Stýringar", + "@settingsVideoControlsTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Afspilun myndskeiða", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsSubtitleThemeShowOutline": "Sýna útlínur og skugga", + "@settingsSubtitleThemeShowOutline": {}, + "settingsNavigationDrawerTabAlbums": "Albúm", + "@settingsNavigationDrawerTabAlbums": {}, + "subtitlePositionBottom": "Neðst", + "@subtitlePositionBottom": {}, + "castDialogTitle": "Útvörpunartæki", + "@castDialogTitle": {}, + "timeDays": "{count, plural, =1{{count} dagur} other{{count} dagar}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "videoResumeButtonLabel": "HALDA ÁFRAM", + "@videoResumeButtonLabel": {}, + "entryActionExport": "Flytja út", + "@entryActionExport": {}, + "mapEmptyRegion": "Engar myndir á þessu svæði", + "@mapEmptyRegion": {}, + "settingsVideoEnablePip": "Mynd-í-mynd", + "@settingsVideoEnablePip": {}, + "settingsThemeBrightnessDialogTitle": "Þema", + "@settingsThemeBrightnessDialogTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter-viðbætur", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "sortOrderHighestFirst": "Hæsta fyrst", + "@sortOrderHighestFirst": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android-aðgerðasöfn", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "settingsViewerQuickActionsTile": "Flýtiaðgerðir", + "@settingsViewerQuickActionsTile": {}, + "entryActionAddFavourite": "Bæta í eftirlæti", + "@entryActionAddFavourite": {}, + "entryActionEdit": "Breyta", + "@entryActionEdit": {}, + "entryInfoActionEditRating": "Breyta einkunn", + "@entryInfoActionEditRating": {}, + "timeMinutes": "{count, plural, =1{{count} mínúta} other{{count} mínútur}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "albumTierSpecial": "Algengt", + "@albumTierSpecial": {}, + "settingsSubtitleThemePageTitle": "Skjátextar", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeTextPositionTile": "Textastaðsetning", + "@settingsSubtitleThemeTextPositionTile": {}, + "entryActionRestore": "Endurheimta", + "@entryActionRestore": {}, + "entryActionCopyToClipboard": "Afrita á klippispjald", + "@entryActionCopyToClipboard": {}, + "tagEditorSectionPlaceholders": "Ígildisbreytur", + "@tagEditorSectionPlaceholders": {}, + "viewerInfoLabelAddress": "Heimilisfang", + "@viewerInfoLabelAddress": {}, + "settingsVideoBackgroundModeDialogTitle": "Bakgrunnshamur", + "@settingsVideoBackgroundModeDialogTitle": {}, + "binPageTitle": "Ruslmappa", + "@binPageTitle": {}, + "tagPlaceholderState": "Hérað", + "@tagPlaceholderState": {}, + "sortByAlbumFileName": "Eftir heiti albúma og atriða", + "@sortByAlbumFileName": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Eyða þessum albúmum og atriðinu í þeim?} other{Eyða þessum albúmum og {count} atriðum í þeim??}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSubtitleThemeTextSize": "Stærð texta", + "@settingsSubtitleThemeTextSize": {}, + "aboutLicensesSectionTitle": "Notkunarleyfi opins hugbúnaðar", + "@aboutLicensesSectionTitle": {}, + "menuActionStats": "Tölfræði", + "@menuActionStats": {}, + "settingsCollectionQuickActionTabBrowsing": "Vafur", + "@settingsCollectionQuickActionTabBrowsing": {}, + "chipActionCreateAlbum": "Búa til albúm", + "@chipActionCreateAlbum": {}, + "videoLoopModeShortOnly": "Einungis stutt myndskeið", + "@videoLoopModeShortOnly": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Eyða þessu albúmi og atriðinu í því?} other{Eyða þessu albúmi og {count} atriðum í því??}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsThemeColorHighlights": "Hátónalitun", + "@settingsThemeColorHighlights": {}, + "appPickDialogTitle": "Veldu forrit", + "@appPickDialogTitle": {}, + "cancelTooltip": "Hætta við", + "@cancelTooltip": {}, + "viewerInfoSearchSuggestionRights": "Réttindi", + "@viewerInfoSearchSuggestionRights": {}, + "mapPointNorthUpTooltip": "Norður beint upp", + "@mapPointNorthUpTooltip": {}, + "entryInfoActionRemoveLocation": "Fjarlægja staðsetningu", + "@entryInfoActionRemoveLocation": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Mistókst að eyða 1 atriði} other{Mistókst að eyða {count} atriðum}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "entryActionShareImageOnly": "Deila einungis mynd", + "@entryActionShareImageOnly": {}, + "settingsVideoButtonsTile": "Hnappar", + "@settingsVideoButtonsTile": {}, + "settingsSubtitleThemeSample": "Þetta er dæmi.", + "@settingsSubtitleThemeSample": {}, + "albumPickPageTitleMove": "Færa í albúm", + "@albumPickPageTitleMove": {}, + "settingsSaveSearchHistory": "Vista leitarferil", + "@settingsSaveSearchHistory": {}, + "settingsViewerShowHistogram": "Birta litatíðnirit", + "@settingsViewerShowHistogram": {}, + "aboutBugCopyInfoButton": "Afrita", + "@aboutBugCopyInfoButton": {}, + "mapStyleGoogleHybrid": "Google Maps (blandað)", + "@mapStyleGoogleHybrid": {}, + "wallpaperTargetHomeLock": "Upphafs- og lásskjáir", + "@wallpaperTargetHomeLock": {}, + "coverDialogTabCover": "Umslag", + "@coverDialogTabCover": {}, + "settingsVideoPlaybackTile": "Afspilun", + "@settingsVideoPlaybackTile": {}, + "filterNoDateLabel": "Ódagsett", + "@filterNoDateLabel": {}, + "exportEntryDialogWriteMetadata": "Skrifa lýsigögn", + "@exportEntryDialogWriteMetadata": {}, + "chipActionSetCover": "Setja umslag", + "@chipActionSetCover": {}, + "chipActionFilterOut": "Sía út", + "@chipActionFilterOut": {}, + "sourceStateCataloguing": "Gerð efnisyfirlits", + "@sourceStateCataloguing": {}, + "chipActionFilterIn": "Sía inn", + "@chipActionFilterIn": {}, + "albumTierVaults": "Öryggisgeymslur", + "@albumTierVaults": {}, + "vaultBinUsageDialogMessage": "Sumar öryggisgeymslur nota ruslmöppuna.", + "@vaultBinUsageDialogMessage": {}, + "chipActionCreateVault": "Búa til öryggisgeymslu", + "@chipActionCreateVault": {}, + "authenticateToUnlockVault": "Auðkenndu til að aflæsa öryggisgeymslu", + "@authenticateToUnlockVault": {}, + "chipActionConfigureVault": "Stilla öryggisgeymslu", + "@chipActionConfigureVault": {}, + "newVaultWarningDialogMessage": "Atriði í öryggisgeymslum eru einungis aðgengileg í þessu forriti og engum öðrum.\n\nEf þú fjarlægir þetta forrit, eða hreinsar gögn forritsins, muntu tapa öllum þessum atriðum.", + "@newVaultWarningDialogMessage": {}, + "keepScreenOnViewerOnly": "Aðeins síða skoðara", + "@keepScreenOnViewerOnly": {}, + "settingsConfirmationVaultDataLoss": "Birta aðvörun um gagnatap öryggisgeymslu", + "@settingsConfirmationVaultDataLoss": {}, + "authenticateToConfigureVault": "Auðkenndu til að stilla öryggisgeymslu", + "@authenticateToConfigureVault": {}, + "chipActionShowCountryStates": "Birta héruð", + "@chipActionShowCountryStates": {}, + "configureVaultDialogTitle": "Stilla öryggisgeymslu", + "@configureVaultDialogTitle": {}, + "newVaultDialogTitle": "Ný öryggisgeymsla", + "@newVaultDialogTitle": {}, + "missingSystemFilePickerDialogMessage": "Skráaveljari kerfisins er óvirkur eða hann vantar. Virkjaðu hann og reydu síðan aftur.", + "@missingSystemFilePickerDialogMessage": {}, + "storageAccessDialogMessage": "Veldu {directory} á „{volume}“ í næsta skjá til að gefa forritinu aðgang að henni.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "hideFilterConfirmationDialogMessage": "Samsvarandi ljósmyndir og myndskeið verða falin frá safninu þínu. Þú getur látið þetta birtast aftur með því að fara í „Persónuvernd“-stillingarnar.\n\nErtu viss um að þú viljir fela þetta?", + "@hideFilterConfirmationDialogMessage": {}, + "settingsViewerGestureSideTapNext": "Ýttu á skjájaðra til að birta fyrra/næsta atriði", + "@settingsViewerGestureSideTapNext": {}, + "restrictedAccessDialogMessage": "Þessu forriti er ekki heimilt að breyta skrám í {directory} á „{volume}“.\n\nNotaðu for-uppsettan skráastjóra eða myndasafnsforrit til að færa atriðin í aðra möppu.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "unsupportedTypeDialogMessage": "{count, plural, =1{Þessi aðgerð er ekki studd fyrir atriði af tegundinni: {types}.} other{Þessi aðgerð er ekki studd fyrir atriði af eftirfarandi tegundum: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "notEnoughSpaceDialogMessage": "Þessi aðgerð þarfnast {neededSize} af lausu plássi á „{volume}“ til að geta klárað, en einungis {freeSize} eru eftir.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "settingsStorageAccessBanner": "Sumar möppur krefjast þess að gefin sé sérstök heimild til að breyta skrám í þeim. Þú getur yfirfarið hér þær möppur sem þú hefur gefið aðgangaheimildir fyrir.", + "@settingsStorageAccessBanner": {}, + "settingsCollectionBurstPatternsTile": "Mynstur runu", + "@settingsCollectionBurstPatternsTile": {}, + "settingsThumbnailShowHdrIcon": "Birta HDR-táknmynd", + "@settingsThumbnailShowHdrIcon": {}, + "collectionActionSetHome": "Setja sem upphafsskjá", + "@collectionActionSetHome": {}, + "renameProcessorHash": "Tætigildi", + "@renameProcessorHash": {}, + "videoRepeatActionSetStart": "Stilla byrjun", + "@videoRepeatActionSetStart": {}, + "stopTooltip": "Stöðva", + "@stopTooltip": {}, + "settingsForceWesternArabicNumeralsTile": "Þvinga arabískar tölur", + "@settingsForceWesternArabicNumeralsTile": {}, + "videoActionABRepeat": "Endurtekning A-B", + "@videoActionABRepeat": {}, + "videoRepeatActionSetEnd": "Stilla endi", + "@videoRepeatActionSetEnd": {}, + "chipActionShowCollection": "Sýna í safni", + "@chipActionShowCollection": {}, + "mapAttributionOsmData": "Kortagögn frá © [OpenStreetMap](https://www.openstreetmap.org/copyright) þátttakendum", + "@mapAttributionOsmData": {}, + "explorerActionSelectStorageVolume": "Veldu geymslu", + "@explorerActionSelectStorageVolume": {}, + "chipActionDecompose": "Skipta upp", + "@chipActionDecompose": {}, + "newDynamicAlbumDialogTitle": "Nýtt breytilegt albúm", + "@newDynamicAlbumDialogTitle": {}, + "collectionActionAddDynamicAlbum": "Bæta við breytilegu albúmi", + "@collectionActionAddDynamicAlbum": {}, + "sortOrderShortestFirst": "Stysta fyrst", + "@sortOrderShortestFirst": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "chipActionRemove": "Fjarlægja", + "@chipActionRemove": {}, + "albumTierDynamic": "Breytilegt", + "@albumTierDynamic": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Albúm er þegar til staðar", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "dynamicAlbumAlreadyExists": "Breytilegt albúm er þegar til staðar", + "@dynamicAlbumAlreadyExists": {}, + "selectStorageVolumeDialogTitle": "Veldu geymslu", + "@selectStorageVolumeDialogTitle": {}, + "appExportDynamicAlbums": "Breytileg albúm", + "@appExportDynamicAlbums": {}, + "mapAttributionOsmLiberty": "Kortaflísar frá [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hýst hjá [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "videoActionShowNextFrame": "Sýna næsta ramma", + "@videoActionShowNextFrame": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Kortaflísar frá [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "videoActionShowPreviousFrame": "Sýna fyrri ramma", + "@videoActionShowPreviousFrame": {}, + "setHomeCustom": "Sérsniðið", + "@setHomeCustom": {}, + "sortByDuration": "Eftir tímalengd", + "@sortByDuration": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "sortOrderLongestFirst": "Lengsta fyrst", + "@sortOrderLongestFirst": {}, + "chipActionGoToExplorerPage": "Sýna í skráastjóra", + "@chipActionGoToExplorerPage": {}, + "explorerPageTitle": "Skráastjóri", + "@explorerPageTitle": {}, + "editEntryLocationDialogImportGpx": "Flytja inn GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "Tímahliðrun", + "@editEntryLocationDialogTimeShift": {}, + "removeEntryMetadataDialogAll": "Allt", + "@removeEntryMetadataDialogAll": {}, + "searchFormatSectionTitle": "Snið", + "@searchFormatSectionTitle": {}, + "sortByPath": "Eftir slóð", + "@sortByPath": {}, + "groupEmpty": "Engir hópar", + "@groupEmpty": {}, + "newGroupDialogTitle": "Nýr hópur", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Heiti hóps", + "@newGroupDialogNameLabel": {}, + "createButtonLabel": "BÚA TIL", + "@createButtonLabel": {}, + "chipActionGroup": "Breyta hópun", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Útbúa hóp", + "@chipActionCreateGroup": {}, + "albumTierGroups": "Hópar", + "@albumTierGroups": {}, + "sectionNone": "Engir hlutar", + "@sectionNone": {}, + "groupAlreadyExists": "Hópur er þegar til", + "@groupAlreadyExists": {}, + "ungrouped": "Óhópað", + "@ungrouped": {}, + "groupPickerTitle": "Veldu hóp", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Nota þennan hóp", + "@groupPickerUseThisGroupButton": {}, + "mapStyleDialogAddStyle": "Bæta við stíl", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogName": "Heiti", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "Vefslóð", + "@mapStyleEditorDialogUrl": {}, + "settingsNavigationBottomActionsTile": "Flakkstika neðst", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Flakkstika neðst", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "mapStyleEditorDialogSubdomains": "Undirlén", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "Kennistrengur vafra", + "@mapStyleEditorDialogUserAgent": {}, + "settingsNavigationBottomActionEditorBanner": "Ýttu og haltu niðri til að færa hnappa og velja hvaða aðgerðir eiga að birtast á flakkstikunni neðst.", + "@settingsNavigationBottomActionEditorBanner": {}, + "tagPickPageTitle": "Veldu merki", + "@tagPickPageTitle": {}, + "settingsViewerShowZoomLevel": "Birta aðdráttarstig", + "@settingsViewerShowZoomLevel": {}, + "settingsEnabled": "Virkt", + "@settingsEnabled": {}, + "settingsForced": "Þvingað", + "@settingsForced": {} +} diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb new file mode 100644 index 0000000..f057b25 --- /dev/null +++ b/lib/l10n/app_it.arb @@ -0,0 +1,1450 @@ +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Benvenuto in Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Opzionale", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Accetto i termini e le condizioni", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, =1{{count} elemento} other{{count} elementi}}", + "@itemCount": {}, + "timeSeconds": "{count, plural, =1{{count} secondo} other{{count} secondi}}", + "@timeSeconds": {}, + "timeMinutes": "{count, plural, =1{{count} minuto} other{{count} minuti}}", + "@timeMinutes": {}, + "timeDays": "{count, plural, =1{{count} giorno} other{{count} giorni}}", + "@timeDays": {}, + "focalLength": "{length} mm", + "@focalLength": {}, + "applyButtonLabel": "APPLICA", + "@applyButtonLabel": {}, + "deleteButtonLabel": "ELIMINA", + "@deleteButtonLabel": {}, + "nextButtonLabel": "AVANTI", + "@nextButtonLabel": {}, + "showButtonLabel": "VISUALIZZA", + "@showButtonLabel": {}, + "hideButtonLabel": "NASCONDI", + "@hideButtonLabel": {}, + "continueButtonLabel": "CONTINUA", + "@continueButtonLabel": {}, + "cancelTooltip": "Annulla", + "@cancelTooltip": {}, + "changeTooltip": "Cambia", + "@changeTooltip": {}, + "clearTooltip": "Cancella", + "@clearTooltip": {}, + "previousTooltip": "Precedente", + "@previousTooltip": {}, + "nextTooltip": "Successivo", + "@nextTooltip": {}, + "showTooltip": "Visualizza", + "@showTooltip": {}, + "hideTooltip": "Nascondi", + "@hideTooltip": {}, + "actionRemove": "Rimuovi", + "@actionRemove": {}, + "resetTooltip": "Ripristina", + "@resetTooltip": {}, + "saveTooltip": "Salva", + "@saveTooltip": {}, + "pickTooltip": "Seleziona", + "@pickTooltip": {}, + "doubleBackExitMessage": "Tocca di nuovo «indietro» per uscire.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "Non chiedere di nuovo", + "@doNotAskAgain": {}, + "sourceStateLoading": "Caricamento", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Catalogazione", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Individuazione paesi", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Individuazione luoghi", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Elimina", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Visualizza negli Album", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Mostra nei Paesi", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "Visualizza nelle Etichette", + "@chipActionGoToTagPage": {}, + "chipActionFilterOut": "Escludi", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Includi", + "@chipActionFilterIn": {}, + "chipActionHide": "Nascondi", + "@chipActionHide": {}, + "chipActionPin": "Aggancia in alto", + "@chipActionPin": {}, + "chipActionUnpin": "Rimuovi dall’alto", + "@chipActionUnpin": {}, + "chipActionRename": "Rinomina", + "@chipActionRename": {}, + "chipActionSetCover": "Imposta copertina", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "Crea album", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "Copia negli appunti", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "Elimina", + "@entryActionDelete": {}, + "entryActionConvert": "Converti", + "@entryActionConvert": {}, + "entryActionExport": "Esporta", + "@entryActionExport": {}, + "entryActionInfo": "Info", + "@entryActionInfo": {}, + "entryActionRename": "Rinomina", + "@entryActionRename": {}, + "entryActionRestore": "Ripristina", + "@entryActionRestore": {}, + "entryActionRotateCCW": "Ruota in senso antiorario", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Ruota in senso orario", + "@entryActionRotateCW": {}, + "entryActionFlip": "Capovolgi orizzontalmente", + "@entryActionFlip": {}, + "entryActionPrint": "Stampa", + "@entryActionPrint": {}, + "entryActionShare": "Condividi", + "@entryActionShare": {}, + "entryActionViewSource": "Visualizza sorgente", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "Visualizza sopra la mappa", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Converti in immagine fissa", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Apri video", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Modifica", + "@entryActionEdit": {}, + "entryActionOpen": "Apri con", + "@entryActionOpen": {}, + "entryActionSetAs": "Imposta come", + "@entryActionSetAs": {}, + "entryActionOpenMap": "Visualizza in app mappa", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Ruota schermo", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Aggiungi ai preferiti", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Rimuovi dai preferiti", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Cattura fotogramma", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Disattiva audio", + "@videoActionMute": {}, + "videoActionUnmute": "Attiva audio", + "@videoActionUnmute": {}, + "videoActionPause": "Pausa", + "@videoActionPause": {}, + "videoActionPlay": "Riproduci", + "@videoActionPlay": {}, + "videoActionReplay10": "Cerca indietro di 10 secondi", + "@videoActionReplay10": {}, + "videoActionSkip10": "Cerca in avanti di 10 secondi", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Seleziona tracce", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Velocità riproduzione", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "Impostazioni", + "@viewerActionSettings": {}, + "slideshowActionResume": "Riprendi", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Visualizza nella Collezione", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Modifica data e ora", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Modifica posizione", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "Modifica titolo e descrizione", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Modifica valutazione", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Modifica etichette", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Rimuovi metadati", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "Cestino", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Preferito", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Senza data", + "@filterNoDateLabel": {}, + "filterNoLocationLabel": "Senza posizione", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Non valutato", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Senza etichetta", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Senza titolo", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "In questo giorno", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Aggiunto di recente", + "@filterRecentlyAddedLabel": {}, + "filterRatingRejectedLabel": "Rifiutato", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Animato", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "Foto in movimento", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "Video a 360°", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Immagine", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Gradi decimali", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "E", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "O", + "@coordinateDmsWest": {}, + "unitSystemMetric": "Metrico", + "@unitSystemMetric": {}, + "unitSystemImperial": "Imperiale", + "@unitSystemImperial": {}, + "videoLoopModeNever": "Mai", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "Solo video brevi", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "Sempre", + "@videoLoopModeAlways": {}, + "videoControlsPlayOutside": "Apri con un altro lettore", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (Ibrido)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (Terreno)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "OSM umanitario", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (Acquerello)", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyRename": "Rinomina", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Sostituisci", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Salta", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "Mai", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "Solo pagina visualizzazione", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Sempre", + "@keepScreenOnAlways": {}, + "accessibilityAnimationsRemove": "Evita effetti schermo", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Mantieni effetti schermo", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferHighest": "Frequenza massima", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Frequenza minima", + "@displayRefreshRatePreferLowest": {}, + "videoPlaybackSkip": "Salta", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Riproduci senza audio", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Riproduci con audio", + "@videoPlaybackWithSound": {}, + "themeBrightnessLight": "Chiaro", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Scuro", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Nero", + "@themeBrightnessBlack": {}, + "viewerTransitionSlide": "Diapositiva", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Parallasse", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "Dissolvenza", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "Ingrandisci", + "@viewerTransitionZoomIn": {}, + "viewerTransitionNone": "Nessuna", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Schermata iniziale", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "Schermata di blocco", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Schermata iniziale e di blocco", + "@wallpaperTargetHomeLock": {}, + "widgetOpenPageHome": "Apri pagina iniziale", + "@widgetOpenPageHome": {}, + "widgetOpenPageViewer": "Apri visualizzazione", + "@widgetOpenPageViewer": {}, + "albumTierNew": "Nuovo", + "@albumTierNew": {}, + "albumTierPinned": "Fissati", + "@albumTierPinned": {}, + "albumTierSpecial": "Frequenti", + "@albumTierSpecial": {}, + "albumTierApps": "Applicazioni", + "@albumTierApps": {}, + "albumTierRegular": "Altri", + "@albumTierRegular": {}, + "storageVolumeDescriptionFallbackPrimary": "Archiviazione interna", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "Scheda SD", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "cartella root", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "cartella «{name}»", + "@otherDirectoryDescription": {}, + "storageAccessDialogMessage": "Per dare accesso a questa applicazione nella prossima schermata seleziona la {directory} di «{volume}».", + "@storageAccessDialogMessage": {}, + "restrictedAccessDialogMessage": "Questa applicazione non è autorizzata a modificare i file nella {directory} di «{volume}».\n\nPer spostare gli elementi in un’altra cartella usa un gestore file o un’app galleria preinstallata.", + "@restrictedAccessDialogMessage": {}, + "notEnoughSpaceDialogMessage": "Per essere completata questa operazione ha bisogno di {neededSize} di spazio libero in «{volume}», ma sono rimasti solo {freeSize}.", + "@notEnoughSpaceDialogMessage": {}, + "missingSystemFilePickerDialogMessage": "Il selezionatore file di sistema è mancante o disabilitato. Abilitalo e riprova.", + "@missingSystemFilePickerDialogMessage": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Questa operazione non è supportata per elementi del seguente tipo: {types}.} other{Questa operazione non è supportata per elementi dei seguenti tipi: {types}.}}", + "@unsupportedTypeDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "Alcuni file nella cartella destinazione hanno lo stesso nome.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "Alcuni file hanno lo stesso nome.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "Etichetta scorciatoia", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "AGGIUNGI", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "Non ci sono app che possono gestire questo.", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Vuoi sposta questo elemento nel cestino?} other{Vuoi spostare questi {count} elementi nel cestino?}}", + "@binEntriesConfirmationDialogMessage": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Vuoi eliminare questo elemento?} other{Vuoi eliminare questi {count} elementi?}}", + "@deleteEntriesConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "Prima di procedere vuoi salvare le date degli elementi?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Salva date", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Vuoi riprendere la riproduzione a {time}?", + "@videoResumeDialogMessage": {}, + "videoStartOverButtonLabel": "RICOMINCIA", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "RIPRENDI", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Ultimo elemento", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Automatico", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Personalizzato", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "Le foto e i video corrispondenti saranno nascosti dalla collezione. Puoi visualizarli di nuovo dalle impostazioni della «Privacy».\n\nVuoi nascondere le foto e i video corrispodenti?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "Nuovo album", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Nome album", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "La cartella esiste già", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Archiviazione:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "Nuovo nome", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "La cartella esiste già", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Rinomina", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "Schema nomi", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Inserisci campo", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Anteprima", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Contatore", + "@renameProcessorCounter": {}, + "renameProcessorName": "Nome", + "@renameProcessorName": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Vuoi eliminare questo album e il relativo elemento?} other{Vuoi eliminare questo album e i relativi {count} elementi?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Vuoi eliminare questi album e il relativo elemento?} other{Vuoi eliminare questi album e i relativi {count} elementi?}}", + "@deleteMultiAlbumConfirmationDialogMessage": {}, + "exportEntryDialogFormat": "Formato:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Larghezza", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Altezza", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "Nuovo nome", + "@renameEntryDialogLabel": {}, + "editEntryDialogTargetFieldsHeader": "Campi da modificare", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Data e ora", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Imposta data personalizzata", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Copia da un’altra data", + "@editEntryDateDialogCopyField": {}, + "editEntryDialogCopyFromItem": "Copia da un altro elemento", + "@editEntryDialogCopyFromItem": {}, + "editEntryDateDialogExtractFromTitle": "Estrai dal titolo", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Sfasamento", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "Data modifica file", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "Ore", + "@durationDialogHours": {}, + "durationDialogMinutes": "Minuti", + "@durationDialogMinutes": {}, + "editEntryLocationDialogTitle": "Posizione", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogChooseOnMap": "Scegli sulla mappa", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "Latitudine", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "Longitudine", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "Usa questa posizione", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "Valutazione", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Rimozione metadati", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "Altro", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Per riprodurre il video all’interno di una foto in movimento è richiesto XMP .\n\nSei sicuro di volerlo rimuovere?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "genericDangerWarningDialogMessage": "Sei sicuro?", + "@genericDangerWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Velocità riproduzione", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Audio", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Sottotitoli", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "Spento", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Traccia", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "Non ci sono altre tracce.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "Fatto!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Fallito", + "@genericFailureFeedback": {}, + "menuActionConfigureView": "Vista", + "@menuActionConfigureView": {}, + "menuActionSelect": "Seleziona", + "@menuActionSelect": {}, + "menuActionSelectAll": "Seleziona tutto", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "Deseleziona tutto", + "@menuActionSelectNone": {}, + "menuActionMap": "Mappa", + "@menuActionMap": {}, + "menuActionSlideshow": "Presentazione", + "@menuActionSlideshow": {}, + "menuActionStats": "Statistiche", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "Ordina", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "Sezioni", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Layout", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "Inverti ordinamento", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "Mosaico", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "Griglia", + "@tileLayoutGrid": {}, + "tileLayoutList": "Elenco", + "@tileLayoutList": {}, + "coverDialogTabCover": "Copertina", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "App", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Colore", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Seleziona app", + "@appPickDialogTitle": {}, + "appPickDialogNone": "Nessuna", + "@appPickDialogNone": {}, + "aboutPageTitle": "Informazioni", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Licenza", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Informativa sulla privacy", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Segnalazione bug", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Salva registri app in un file", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Copia informazioni sistema", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "Copia", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "Segnala su GitHub con i registri e le info di sistema", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "Segnala", + "@aboutBugReportButton": {}, + "aboutCreditsSectionTitle": "Ringraziamenti", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "Questa applicazione usa un file TopoJSON di", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "sotto licenza ISC.", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Traduttori", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Licenze open-source", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "Questa applicazione usa i seguenti pacchetti e librerie open-source.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Librerie Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Plugin Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Pacchetti Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Pacchetti Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Visualizza tutte le licenze", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "Informativa sulla privacy", + "@policyPageTitle": {}, + "collectionPageTitle": "Collezione", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "Seleziona", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "Seleziona elementi", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Visualizza filtro titoli", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Nascondi filtro titoli", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Aggiungi collegamento", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "Svuota cestino", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Copia nell’album", + "@collectionActionCopy": {}, + "collectionActionMove": "Sposta nell’album", + "@collectionActionMove": {}, + "collectionActionRescan": "Riscansiona", + "@collectionActionRescan": {}, + "collectionActionEdit": "Modifica", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Cerca titoli", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "Per album", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Per mese", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Per giorno", + "@collectionGroupDay": {}, + "sectionUnknown": "Sconosciuto", + "@sectionUnknown": {}, + "dateToday": "Oggi", + "@dateToday": {}, + "dateYesterday": "Ieri", + "@dateYesterday": {}, + "dateThisMonth": "Questo mese", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Impossibile eliminare 1 elemento} other{Impossibile eliminare {count} elementi}}", + "@collectionDeleteFailureFeedback": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{Impossibile copiare 1 elemento} other{Impossibile copiare {count} elementi}}", + "@collectionCopyFailureFeedback": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{Impossibile spostare 1 elemento} other{Impossibile spostare {count} elementi}}", + "@collectionMoveFailureFeedback": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{Impossibile rinominare 1 elemento} other{Impossibile rinominare {count} elementi}}", + "@collectionRenameFailureFeedback": {}, + "collectionEditFailureFeedback": "{count, plural, =1{Impossibile modificare 1 elemento} other{Impossibile modificare {count} elementi}}", + "@collectionEditFailureFeedback": {}, + "collectionExportFailureFeedback": "{count, plural, =1{Impossibile esportare 1 elemento} other{Impossibile esportare {count} elementi}}", + "@collectionExportFailureFeedback": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{Copiato 1 elemento} other{Copiati {count} elementi}}", + "@collectionCopySuccessFeedback": {}, + "collectionMoveSuccessFeedback": "{count, plural, =1{Spostato 1 elemento} other{Spostati {count} elementi}}", + "@collectionMoveSuccessFeedback": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{Rinominato 1 elemento} other{Rinominati {count} elementi}}", + "@collectionRenameSuccessFeedback": {}, + "collectionEditSuccessFeedback": "{count, plural, =1{Modificato 1 elemento} other{Modificati {count} elementi}}", + "@collectionEditSuccessFeedback": {}, + "collectionEmptyFavourites": "Nessun preferito", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "Nessun video", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "Nessuna immagine", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Consenti accesso", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Seleziona sezione", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Deseleziona sezione", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "Info", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Impostazioni", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "Tutte le collezioni", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Preferiti", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Immagini", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Video", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "Animazioni", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Foto in movimento", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "Panorami", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Foto raw", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "Video a 360°", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Album", + "@drawerAlbumPage": {}, + "drawerCountryPage": "Paesi", + "@drawerCountryPage": {}, + "drawerTagPage": "Etichette", + "@drawerTagPage": {}, + "sortByDate": "Per data", + "@sortByDate": {}, + "sortByName": "Per nome", + "@sortByName": {}, + "sortByItemCount": "Per numero elementi", + "@sortByItemCount": {}, + "sortBySize": "Per dimensione", + "@sortBySize": {}, + "sortByAlbumFileName": "Per album e nome file", + "@sortByAlbumFileName": {}, + "sortByRating": "Per valutazione", + "@sortByRating": {}, + "sortOrderNewestFirst": "Dal più nuovo", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Dal più vecchio", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "Dalla A alla Z", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Dalla Z alla A", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "Dalla più alta", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Dalla più bassa", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Dal più grande", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "Dal più piccolo", + "@sortOrderSmallestFirst": {}, + "albumGroupTier": "Per importanza", + "@albumGroupTier": {}, + "albumGroupType": "Per tipo", + "@albumGroupType": {}, + "albumGroupVolume": "Per volume archiviazione", + "@albumGroupVolume": {}, + "albumMimeTypeMixed": "Misto", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "Copia nell’album", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Esporta nell’album", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Sposta nell’album", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "Seleziona album", + "@albumPickPageTitlePick": {}, + "albumCamera": "Fotocamera", + "@albumCamera": {}, + "albumDownload": "Scaricati", + "@albumDownload": {}, + "albumScreenshots": "Schermate", + "@albumScreenshots": {}, + "albumScreenRecordings": "Registrazioni schermo", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Catture video", + "@albumVideoCaptures": {}, + "albumPageTitle": "Album", + "@albumPageTitle": {}, + "albumEmpty": "Nessun album", + "@albumEmpty": {}, + "createAlbumButtonLabel": "CREA", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "nuovo", + "@newFilterBanner": {}, + "countryPageTitle": "Paesi", + "@countryPageTitle": {}, + "countryEmpty": "Nessun paese", + "@countryEmpty": {}, + "tagPageTitle": "Etichette", + "@tagPageTitle": {}, + "tagEmpty": "Nessuna etichetta", + "@tagEmpty": {}, + "binPageTitle": "Cestino", + "@binPageTitle": {}, + "searchCollectionFieldHint": "Cerca collezione", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "Recenti", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Data", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "Album", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "Paesi", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "Luoghi", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Etichette", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "Valutazioni", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "Metadati", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Impostazioni", + "@settingsPageTitle": {}, + "settingsSystemDefault": "Predefinito sistema", + "@settingsSystemDefault": {}, + "settingsDefault": "Predefinito", + "@settingsDefault": {}, + "settingsDisabled": "Disabilitato", + "@settingsDisabled": {}, + "settingsSearchFieldLabel": "Ricerca impostazioni", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Nessuna impostazione corrispondente", + "@settingsSearchEmpty": {}, + "settingsActionExport": "Esporta", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "Esporta", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "Importa", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Importa", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "Copertine", + "@appExportCovers": {}, + "appExportFavourites": "Preferiti", + "@appExportFavourites": {}, + "appExportSettings": "Impostazioni", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "Navigazione", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Pagina iniziale", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Pagina iniziale", + "@settingsHomeDialogTitle": {}, + "settingsKeepScreenOnTile": "Mantieni acceso lo schermo", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Mantieni schermo acceso", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Tocca «indietro» due volte per uscire", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "Richieste conferma", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "Richieste conferma", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Chiedi prima di eliminare gli elementi definitivamente", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "Chiedi prima di spostare gli elementi nel cestino", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Chiedi prima di spostare gli elementi senza data", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Visualizza un messaggio dopo aver spostato gli elementi nel cestino", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerTile": "Menu navigazione", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Menu navigazione", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "Tocca e tieni premuto per spostare e riordinare gli elementi del menu.", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "Tipi", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "Album", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Pagine", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Aggiungi album", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "Miniature", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "Sovrapposizione", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Sovrapposizione", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowFavouriteIcon": "Visualizza icona Preferiti", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Visualizza icona Etichetta", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Visualizza icona Posizione", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Viusalizza icona Foto in movimento", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "Visualizza Valutazione", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Visualizza icona Raw", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Visualizza durata video", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "Azioni rapide", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Azioni rapide", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Navigazione", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Selezione", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono visualizzate durante la navigazione degli elementi.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono visualizzate quando si selezionano gli elementi.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsViewerSectionTitle": "Visualizzazione", + "@settingsViewerSectionTitle": {}, + "settingsViewerGestureSideTapNext": "Tocca i bordi dello schermo per visualizzare l’elemento precedente/successivo", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerUseCutout": "Usa area ritagliata", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Luminosità massima", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Riproduzione automatica foto in movimento", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "Sfondo immagine", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Azioni rapide", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Azioni rapide", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono visualizzate nel visualizzatore.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Pulsanti visualizzati", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Pulsanti disponibili", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Nessun pulsante", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "Sovrapposizione", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "Sovrapposizione", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "Visualizza all’apertura", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "Visualizza minimappa", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Visualizza informazioni", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "Visualizza titolo, data, posizione, ecc.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowShootingDetails": "Visualizza dettagli scatto", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowOverlayThumbnails": "Visualizza miniature", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "Effetto sfocatura", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "Presentazione", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "Presentazione", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Ripeti", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Ordine casuale", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Riempi schermo", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowAnimatedZoomEffect": "Effetto ingrandimento animato", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "Transizione", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Intervallo", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "Riproduzione video", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Riproduzione video", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "Impostazioni video", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "Visualizza video", + "@settingsVideoShowVideos": {}, + "settingsVideoEnableHardwareAcceleration": "Accelerazione hardware", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "Riproduzione automatica", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "Modalità loop", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Modalità loop", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "Sottotitoli", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Sottotitoli", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Questo è un campione.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "Allineamento testo", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Allineamento testo", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Dimensione testo", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "Visualizza contorno e ombra", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Colore testo", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Opacità testo", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Colore sfondo", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Opacità sfondo", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Sinistra", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Centro", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Destra", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoControlsTile": "Controlli", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "Controlli", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "Pulsanti", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Doppio tocco riproduci/pausa", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "Doppio tocco sui bordi dello schermo per cercare avanti/indietro", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsPrivacySectionTitle": "Privacy", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Consenti l’accesso all’inventario app", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "Usato per migliorare la visualizzazione album", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "Consenti segnalazione anonima errori", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Salva cronologia ricerche", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "Usa cestino", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "Conserva elementi eliminati per 30 giorni", + "@settingsEnableBinSubtitle": {}, + "settingsHiddenItemsTile": "Elementi nascosti", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Elementi nascosti", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "Le foto e i video che corrispondono ai filtri nascosti non appariranno nella collezione.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "Nessun filtro nascosto", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Accesso a tutti i file", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "Accesso a tutti i file", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessBanner": "Alcune cartelle per modificare i file al loro interno richiedono una concessione di accesso esplicita. Puoi rivedere qui le cartelle a cui hai dato accesso in precedenza.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Nessuna autorizzazione concessa", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Rifiuta autorizzazione", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Accessibilità", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Rimuovi animazioni", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "Rimuovi animazioni", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Tempo reazione", + "@settingsTimeToTakeActionTile": {}, + "settingsDisplaySectionTitle": "Schermo", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "Colori evidenziati", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Colori dinamici", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Frequenza aggiornamento schermo", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Frequenza aggiornamento", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageSectionTitle": "Lingua e formati", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "Lingua", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "Lingua", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "Formato coordinate", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "Formato coordinate", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Unità", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "Unità", + "@settingsUnitSystemDialogTitle": {}, + "settingsScreenSaverPageTitle": "Salvaschermo", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "Cornice foto", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Contorno", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "Quando tocchi il widget", + "@settingsWidgetOpenPage": {}, + "settingsCollectionTile": "Collezione", + "@settingsCollectionTile": {}, + "statsPageTitle": "Statistiche", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, =1{1 elemento con posizione} other{{count} elementi con posizione}}", + "@statsWithGps": {}, + "statsTopCountriesSectionTitle": "Paesi più frequenti", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Luoghi più frequenti", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Etichette più frequenti", + "@statsTopTagsSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Album più frequenti", + "@statsTopAlbumsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "APRI PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "IMPOSTA SFONDO", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Ops!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "Il file non esiste più.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Info", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "Torna alla visualizzazione", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "sconosciuto", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "Descrizione", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Titolo", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "Data", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "Risoluzione", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Dimensione", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Percorso", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Durata", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Proprietario", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Coordinate", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Indirizzo", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Stile mappa", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Seleziona stile mappa", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Ingrandisci", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Riduci", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Punta a nord verso l’alto", + "@mapPointNorthUpTooltip": {}, + "mapAttributionOsmHot": "Tasselli di [HOT](https://www.hotosm.org/) • Ospitato da [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "Titoli di [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "openMapPageTooltip": "Visualizza nella pagina della mappa", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "Nessuna immagine in questa regione", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Estrazione dati incorporati fallita", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "Apri", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Visualizza XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "Ricerca metadati", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Nessuna chiave corrispondente", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Data e ora", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Descrizione", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Dimensioni", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Risoluzione", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Diritti", + "@viewerInfoSearchSuggestionRights": {}, + "wallpaperUseScrollEffect": "Usa effetto di scorrimento nella schermata iniziale", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageTitle": "Modifica etichette", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Nuova etichetta", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Aggiungi etichetta", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Recenti", + "@tagEditorSectionRecent": {}, + "panoramaEnableSensorControl": "Abilita controllo sensore", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Disabilita controllo sensore", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Codice sorgente", + "@sourceViewerPageTitle": {}, + "durationDialogSeconds": "Secondi", + "@durationDialogSeconds": {}, + "settingsAllowMediaManagement": "Consenti gestione media", + "@settingsAllowMediaManagement": {}, + "tagEditorSectionPlaceholders": "Segnaposti", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "Paese", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "Luogo", + "@tagPlaceholderPlace": {}, + "widgetOpenPageCollection": "Apri collezione", + "@widgetOpenPageCollection": {}, + "editEntryLocationDialogSetCustom": "Imposta posizione personalizzata", + "@editEntryLocationDialogSetCustom": {}, + "entryInfoActionExportMetadata": "Esporta metadati", + "@entryInfoActionExportMetadata": {}, + "subtitlePositionTop": "In alto", + "@subtitlePositionTop": {}, + "widgetDisplayedItemMostRecent": "Più recente", + "@widgetDisplayedItemMostRecent": {}, + "widgetDisplayedItemRandom": "Casuale", + "@widgetDisplayedItemRandom": {}, + "settingsSubtitleThemeTextPositionTile": "Posizione testo", + "@settingsSubtitleThemeTextPositionTile": {}, + "subtitlePositionBottom": "In basso", + "@subtitlePositionBottom": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Posizione testo", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsWidgetDisplayedItem": "Elemento visualizzato", + "@settingsWidgetDisplayedItem": {}, + "settingsViewerShowRatingTags": "Visualizza valutazione e etichette", + "@settingsViewerShowRatingTags": {}, + "columnCount": "{count, plural, =1{{count} colonna} other{{count} colonne}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "entryInfoActionRemoveLocation": "Rimuovi posizione", + "@entryInfoActionRemoveLocation": {}, + "filterAspectRatioLandscapeLabel": "Orizzontale", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "Verticale", + "@filterAspectRatioPortraitLabel": {}, + "keepScreenOnVideoPlayback": "Durante riproduzione video", + "@keepScreenOnVideoPlayback": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Visualizza gesti multi touch alternativi", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "entryActionShareImageOnly": "Condividi solo immagine", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "Condividi solo video", + "@entryActionShareVideoOnly": {}, + "filterNoAddressLabel": "Senza indirizzo", + "@filterNoAddressLabel": {}, + "filterLocatedLabel": "Posizionato", + "@filterLocatedLabel": {}, + "filterTaggedLabel": "Etichettato", + "@filterTaggedLabel": {}, + "settingsModificationWarningDialogMessage": "Saranno modificate le altre impostazioni.", + "@settingsModificationWarningDialogMessage": {}, + "settingsDisplayUseTvInterface": "Interfaccia Android TV", + "@settingsDisplayUseTvInterface": {}, + "settingsViewerShowDescription": "Visualizza descrizione", + "@settingsViewerShowDescription": {}, + "tooManyItemsErrorDialogMessage": "Riprova con meno elementi.", + "@tooManyItemsErrorDialogMessage": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Trascina su o giù per regolare luminosità/volume", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "vaultDialogLockModeWhenScreenOff": "Blocca allo spegnimento dello schermo", + "@vaultDialogLockModeWhenScreenOff": {}, + "chipActionCreateVault": "Crea cassaforte", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "Configura cassaforte", + "@chipActionConfigureVault": {}, + "chipActionLock": "Proteggi", + "@chipActionLock": {}, + "albumTierVaults": "Casseforti", + "@albumTierVaults": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "vaultLockTypePassword": "Password", + "@vaultLockTypePassword": {}, + "newVaultWarningDialogMessage": "Gli elementi nelle cassaforti sono disponibili solo per questa app e non per altre.\n\nSe disinstalli l’app o cancelli i relativi dati, perderai tutti questi elementi.", + "@newVaultWarningDialogMessage": {}, + "newVaultDialogTitle": "Nuova Cassaforte", + "@newVaultDialogTitle": {}, + "vaultDialogLockTypeLabel": "Tipo di protezione", + "@vaultDialogLockTypeLabel": {}, + "authenticateToConfigureVault": "Accedi per configurare la cassaforte", + "@authenticateToConfigureVault": {}, + "authenticateToUnlockVault": "Accedi per sbloccare la cassaforte", + "@authenticateToUnlockVault": {}, + "vaultBinUsageDialogMessage": "Alcune casseforti stanno usando il cestino.", + "@vaultBinUsageDialogMessage": {}, + "pinDialogEnter": "Inserisci PIN", + "@pinDialogEnter": {}, + "pinDialogConfirm": "Conferma PIN", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "Inserisci password", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Conferma password", + "@passwordDialogConfirm": {}, + "settingsConfirmationVaultDataLoss": "Visualizza avviso perdita dati delle casseforti", + "@settingsConfirmationVaultDataLoss": {}, + "settingsDisablingBinWarningDialogMessage": "Gli elementi nel cestino verranno eliminati permanentemente.", + "@settingsDisablingBinWarningDialogMessage": {}, + "configureVaultDialogTitle": "Configura Cassaforte", + "@configureVaultDialogTitle": {}, + "exportEntryDialogWriteMetadata": "Scrivi metadati", + "@exportEntryDialogWriteMetadata": {}, + "chipActionGoToPlacePage": "Visualizza nei Luoghi", + "@chipActionGoToPlacePage": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "patternDialogEnter": "Inserisci sequenza", + "@patternDialogEnter": {}, + "patternDialogConfirm": "Conferma sequenza", + "@patternDialogConfirm": {}, + "drawerPlacePage": "Luoghi", + "@drawerPlacePage": {}, + "placeEmpty": "Nessun luogo", + "@placeEmpty": {}, + "placePageTitle": "Luoghi", + "@placePageTitle": {}, + "settingsVideoBackgroundMode": "Modalità sottofondo", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "Modalità sottofondo", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsVideoEnablePip": "Picture-in-picture", + "@settingsVideoEnablePip": {}, + "vaultLockTypePattern": "Sequenza", + "@vaultLockTypePattern": {}, + "viewerActionLock": "Blocca visualizzazione", + "@viewerActionLock": {}, + "viewerActionUnlock": "Sblocca visualizzazione", + "@viewerActionUnlock": {}, + "statsTopStatesSectionTitle": "Stati più frequenti", + "@statsTopStatesSectionTitle": {}, + "tagPlaceholderState": "Stato", + "@tagPlaceholderState": {}, + "settingsCollectionBurstPatternsNone": "Nessuno", + "@settingsCollectionBurstPatternsNone": {}, + "chipActionShowCountryStates": "Visualizza stati", + "@chipActionShowCountryStates": {}, + "statePageTitle": "Stati", + "@statePageTitle": {}, + "stateEmpty": "Nessuno stato", + "@stateEmpty": {}, + "searchStatesSectionTitle": "Stati", + "@searchStatesSectionTitle": {}, + "settingsAskEverytime": "Chiedi sempre", + "@settingsAskEverytime": {}, + "settingsVideoResumptionModeTile": "Riprendi riproduzione", + "@settingsVideoResumptionModeTile": {}, + "maxBrightnessNever": "Mai", + "@maxBrightnessNever": {}, + "videoResumptionModeNever": "Mai", + "@videoResumptionModeNever": {}, + "videoResumptionModeAlways": "Sempre", + "@videoResumptionModeAlways": {}, + "settingsVideoResumptionModeDialogTitle": "Riprendi riproduzione", + "@settingsVideoResumptionModeDialogTitle": {}, + "tagEditorDiscardDialogMessage": "Vuoi scartare le modifiche?", + "@tagEditorDiscardDialogMessage": {}, + "exportEntryDialogQuality": "Qualità", + "@exportEntryDialogQuality": {}, + "settingsVideoPlaybackPageTitle": "Riproduzione", + "@settingsVideoPlaybackPageTitle": {}, + "maxBrightnessAlways": "Sempre", + "@maxBrightnessAlways": {}, + "settingsVideoPlaybackTile": "Riproduzione", + "@settingsVideoPlaybackTile": {}, + "settingsCollectionBurstPatternsTile": "Modelli burst", + "@settingsCollectionBurstPatternsTile": {}, + "saveCopyButtonLabel": "SALVA COPIA", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Applica", + "@applyTooltip": {}, + "editorActionTransform": "Trasforma", + "@editorActionTransform": {}, + "editorTransformCrop": "Ritaglia", + "@editorTransformCrop": {}, + "editorTransformRotate": "Ruota", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Liberi", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Originale", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Quadrato", + "@cropAspectRatioSquare": {}, + "widgetTapUpdateWidget": "Aggiorna widget", + "@widgetTapUpdateWidget": {}, + "aboutDataUsageCache": "Cache", + "@aboutDataUsageCache": {}, + "aboutDataUsageMisc": "Varie", + "@aboutDataUsageMisc": {}, + "aboutDataUsageDatabase": "Database", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageSectionTitle": "Uso dati", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageData": "Dati", + "@aboutDataUsageData": {}, + "aboutDataUsageInternal": "Interno", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "Esterno", + "@aboutDataUsageExternal": {}, + "overlayHistogramNone": "Nessuno", + "@overlayHistogramNone": {}, + "overlayHistogramLuminance": "Luminanza", + "@overlayHistogramLuminance": {}, + "settingsViewerShowHistogram": "Visualizza istogramma", + "@settingsViewerShowHistogram": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "entryActionCast": "Cast", + "@entryActionCast": {}, + "aboutDataUsageClearCache": "Svuota cache", + "@aboutDataUsageClearCache": {}, + "castDialogTitle": "Dispositivi Cast", + "@castDialogTitle": {}, + "stopTooltip": "Ferma", + "@stopTooltip": {}, + "videoActionABRepeat": "Ripeti A-B", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "Imposta inizio", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "Imposta fine", + "@videoRepeatActionSetEnd": {}, + "settingsThumbnailShowHdrIcon": "Visualizza icona HDR", + "@settingsThumbnailShowHdrIcon": {}, + "collectionActionSetHome": "Imposta come pagina iniziale", + "@collectionActionSetHome": {}, + "chipActionShowCollection": "Visualizza nella Collezione", + "@chipActionShowCollection": {}, + "renameProcessorHash": "Hash", + "@renameProcessorHash": {}, + "settingsForceWesternArabicNumeralsTile": "Forza numeri arabi", + "@settingsForceWesternArabicNumeralsTile": {}, + "sortByDuration": "Per durata", + "@sortByDuration": {}, + "sortOrderLongestFirst": "Dal più lungo", + "@sortOrderLongestFirst": {}, + "sortOrderShortestFirst": "Dal più corto", + "@sortOrderShortestFirst": {}, + "explorerPageTitle": "Gestione file", + "@explorerPageTitle": {}, + "explorerActionSelectStorageVolume": "Seleziona supporto", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "Seleziona supporto", + "@selectStorageVolumeDialogTitle": {}, + "setHomeCustom": "Personalizzato", + "@setHomeCustom": {}, + "chipActionGoToExplorerPage": "Mostra in Gestione file", + "@chipActionGoToExplorerPage": {}, + "mapAttributionOsmData": "Dati della mappa © collaboratori di [OpenStreetMap](https://www.openstreetmap.org/copyright)", + "@mapAttributionOsmData": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Album già esistente", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "chipActionRemove": "Rimuovi", + "@chipActionRemove": {}, + "videoActionShowPreviousFrame": "Visualizza fotogramma precedente", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "Visualizza fotogramma successivo", + "@videoActionShowNextFrame": {}, + "albumTierDynamic": "Dinamico", + "@albumTierDynamic": {}, + "newDynamicAlbumDialogTitle": "Nuovo album dinamico", + "@newDynamicAlbumDialogTitle": {}, + "collectionActionAddDynamicAlbum": "Aggiungi album dinamico", + "@collectionActionAddDynamicAlbum": {}, + "appExportDynamicAlbums": "Album dinamici", + "@appExportDynamicAlbums": {}, + "dynamicAlbumAlreadyExists": "Album dinamico già esistente", + "@dynamicAlbumAlreadyExists": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tasselli di [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapAttributionOsmLiberty": "Tasselli di [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Ospitato da [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "chipActionDecompose": "Dividi", + "@chipActionDecompose": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "editEntryLocationDialogTimeShift": "Scostamento tempo", + "@editEntryLocationDialogTimeShift": {}, + "editEntryLocationDialogImportGpx": "Importa GPX", + "@editEntryLocationDialogImportGpx": {}, + "newGroupDialogTitle": "Nuovo gruppo", + "@newGroupDialogTitle": {}, + "groupEmpty": "Nessun gruppo", + "@groupEmpty": {}, + "newGroupDialogNameLabel": "Nome gruppo", + "@newGroupDialogNameLabel": {}, + "sortByPath": "Per percorso", + "@sortByPath": {}, + "searchFormatSectionTitle": "Formati", + "@searchFormatSectionTitle": {}, + "removeEntryMetadataDialogAll": "Tutti", + "@removeEntryMetadataDialogAll": {}, + "createButtonLabel": "CREA", + "@createButtonLabel": {}, + "chipActionGroup": "Cambia raggruppamento", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Crea gruppo", + "@chipActionCreateGroup": {}, + "albumTierGroups": "Gruppi", + "@albumTierGroups": {}, + "groupAlreadyExists": "Gruppo già esistente", + "@groupAlreadyExists": {}, + "ungrouped": "Non raggruppato", + "@ungrouped": {}, + "groupPickerTitle": "Scegli gruppo", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Usa questo gruppo", + "@groupPickerUseThisGroupButton": {}, + "sectionNone": "Nessuna sezione", + "@sectionNone": {}, + "mapStyleDialogAddStyle": "Aggiungi stile", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogName": "Nome", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogSubdomains": "Sottodomini", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "User-Agent", + "@mapStyleEditorDialogUserAgent": {}, + "settingsNavigationBottomActionsTile": "Navigazione in basso", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Navigazione in basso", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono visualizzate nella barra di navigazione in basso.", + "@settingsNavigationBottomActionEditorBanner": {}, + "tagPickPageTitle": "Seleziona etichetta", + "@tagPickPageTitle": {} +} diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb new file mode 100644 index 0000000..e9f6976 --- /dev/null +++ b/lib/l10n/app_ja.arb @@ -0,0 +1,1386 @@ +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Avesへようこそ", + "@welcomeMessage": {}, + "welcomeOptional": "オプション", + "@welcomeOptional": {}, + "welcomeTermsToggle": "利用規約に同意する", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, other{{count} 件のアイテム}}", + "@itemCount": {}, + "timeSeconds": "{count, plural, other{{count} 秒}}", + "@timeSeconds": {}, + "timeMinutes": "{count, plural, other{{count} 分}}", + "@timeMinutes": {}, + "timeDays": "{count, plural, other{{count} 日}}", + "@timeDays": {}, + "focalLength": "{length} mm", + "@focalLength": {}, + "applyButtonLabel": "適用", + "@applyButtonLabel": {}, + "deleteButtonLabel": "削除", + "@deleteButtonLabel": {}, + "nextButtonLabel": "次へ", + "@nextButtonLabel": {}, + "showButtonLabel": "表示", + "@showButtonLabel": {}, + "hideButtonLabel": "非表示", + "@hideButtonLabel": {}, + "continueButtonLabel": "続ける", + "@continueButtonLabel": {}, + "cancelTooltip": "キャンセル", + "@cancelTooltip": {}, + "changeTooltip": "変更", + "@changeTooltip": {}, + "clearTooltip": "クリア", + "@clearTooltip": {}, + "previousTooltip": "前へ", + "@previousTooltip": {}, + "nextTooltip": "次へ", + "@nextTooltip": {}, + "showTooltip": "表示する", + "@showTooltip": {}, + "hideTooltip": "非表示にする", + "@hideTooltip": {}, + "actionRemove": "削除", + "@actionRemove": {}, + "resetTooltip": "リセット", + "@resetTooltip": {}, + "saveTooltip": "保存", + "@saveTooltip": {}, + "pickTooltip": "ピック", + "@pickTooltip": {}, + "doubleBackExitMessage": "終了するには「戻る」をもう一度タップしてください。", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "今後このメッセージを表示しない", + "@doNotAskAgain": {}, + "sourceStateLoading": "読み込み中", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "分類中", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "国、地域を確認中", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "場所を確認中", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "削除", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "アルバム別に表示", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "国地域別に表示", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "タグ別に表示", + "@chipActionGoToTagPage": {}, + "chipActionHide": "非表示", + "@chipActionHide": {}, + "chipActionPin": "一番上に固定", + "@chipActionPin": {}, + "chipActionUnpin": "一番上への固定を解除", + "@chipActionUnpin": {}, + "chipActionRename": "名前を変更", + "@chipActionRename": {}, + "chipActionSetCover": "カバーを設定", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "アルバムを作成", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "クリップボードにコピー", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "削除", + "@entryActionDelete": {}, + "entryActionConvert": "変換", + "@entryActionConvert": {}, + "entryActionExport": "エクスポート", + "@entryActionExport": {}, + "entryActionInfo": "情報", + "@entryActionInfo": {}, + "entryActionRename": "名前を変更", + "@entryActionRename": {}, + "entryActionRestore": "元に戻す", + "@entryActionRestore": {}, + "entryActionRotateCCW": "反時計回りに回転", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "時計回りに回転", + "@entryActionRotateCW": {}, + "entryActionFlip": "水平方向に反転", + "@entryActionFlip": {}, + "entryActionPrint": "印刷", + "@entryActionPrint": {}, + "entryActionShare": "共有", + "@entryActionShare": {}, + "entryActionViewSource": "ソースを表示", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "地図のオーバーレイとして表示", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "静止画に変換", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "動画を開く", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "編集", + "@entryActionEdit": {}, + "entryActionOpen": "アプリで開く", + "@entryActionOpen": {}, + "entryActionSetAs": "登録", + "@entryActionSetAs": {}, + "entryActionOpenMap": "地図アプリで表示", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "画面を回転", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "お気に入りに追加", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "お気に入りから削除", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "フレームをキャプチャ", + "@videoActionCaptureFrame": {}, + "videoActionMute": "ミュート", + "@videoActionMute": {}, + "videoActionUnmute": "ミュート解除", + "@videoActionUnmute": {}, + "videoActionPause": "一時停止", + "@videoActionPause": {}, + "videoActionPlay": "再生", + "@videoActionPlay": {}, + "videoActionReplay10": "10 秒前に戻る", + "@videoActionReplay10": {}, + "videoActionSkip10": "10 秒前に進む", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "トラックを選択", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "再生速度", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "設定", + "@viewerActionSettings": {}, + "slideshowActionResume": "再開", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "コレクションで表示", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "日時を編集", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "位置情報を編集", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditRating": "評価を編集", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "タグを編集", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "メタデータを削除", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "ごみ箱", + "@filterBinLabel": {}, + "filterFavouriteLabel": "お気に入り", + "@filterFavouriteLabel": {}, + "filterNoLocationLabel": "位置情報なし", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "評価情報なし", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "タグ情報なし", + "@filterNoTagLabel": {}, + "filterOnThisDayLabel": "過去のこの日", + "@filterOnThisDayLabel": {}, + "filterRatingRejectedLabel": "拒否", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "アニメーション", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "モーションフォト", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "パノラマ", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° 動画", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "画像", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "動画", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "度分秒", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "十進角", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{direction}{coordinate}", + "@coordinateDms": {}, + "coordinateDmsNorth": "北緯", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "南緯", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "東経", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "西経", + "@coordinateDmsWest": {}, + "unitSystemMetric": "メートル法", + "@unitSystemMetric": {}, + "unitSystemImperial": "ヤード・ポンド法", + "@unitSystemImperial": {}, + "videoLoopModeNever": "ループ再生しない", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "短い動画のみ", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "常にループ再生", + "@videoLoopModeAlways": {}, + "videoControlsPlayOutside": "他のプレイヤーで開く", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google マップ", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google マップ(ハイブリッド)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google マップ(地形)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyRename": "名前を変更", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "置換", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "スキップ", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "自動オフ", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "ビューアー表示中のみ", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "常にオン", + "@keepScreenOnAlways": {}, + "accessibilityAnimationsRemove": "画面効果を表示しない", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "画面効果を表示", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferHighest": "高レート", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "低レート", + "@displayRefreshRatePreferLowest": {}, + "videoPlaybackSkip": "スキップ", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "ミュート再生", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "音声あり再生", + "@videoPlaybackWithSound": {}, + "themeBrightnessLight": "ライト", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "ダーク", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "ブラック", + "@themeBrightnessBlack": {}, + "viewerTransitionSlide": "スライド", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "パララックス", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "フェード", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "ズームイン", + "@viewerTransitionZoomIn": {}, + "wallpaperTargetHome": "ホーム画面", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "ロック画面", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "ホームおよびロック画面", + "@wallpaperTargetHomeLock": {}, + "albumTierNew": "新規", + "@albumTierNew": {}, + "albumTierPinned": "固定", + "@albumTierPinned": {}, + "albumTierSpecial": "全体", + "@albumTierSpecial": {}, + "albumTierApps": "アプリ", + "@albumTierApps": {}, + "albumTierRegular": "その他", + "@albumTierRegular": {}, + "storageVolumeDescriptionFallbackPrimary": "内蔵ストレージ", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD カード", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "ルート ディレクトリ", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "“{name}” ディレクトリ", + "@otherDirectoryDescription": {}, + "storageAccessDialogMessage": "このアプリにアクセスを許可するために次の画面で {directory} の “{volume}” を選択してください。", + "@storageAccessDialogMessage": {}, + "restrictedAccessDialogMessage": "このアプリは {directory} の “{volume}” にあるファイルを変更できません。\n\nプリインストールされているファイル マネージャまたはギャラリー アプリを使用して他のディレクトリに移動してください。", + "@restrictedAccessDialogMessage": {}, + "notEnoughSpaceDialogMessage": "この操作には “{volume}” に {neededSize} の容量が必要ですが、 残り {freeSize} のみ利用可能です。", + "@notEnoughSpaceDialogMessage": {}, + "missingSystemFilePickerDialogMessage": "システム ファイル ピッカーが見つからないか、利用できません。利用可能にしてから再度お試しください。", + "@missingSystemFilePickerDialogMessage": {}, + "unsupportedTypeDialogMessage": "{count, plural, other{この操作は次のタイプのアイテムには対応していません: {types}.}}", + "@unsupportedTypeDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "目的フォルダに同じ名前のファイルが存在しています。", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "同じ名前のファイルが存在しています。", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "ショートカット ラベル", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "追加", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "処理できるアプリが見つかりません。", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{このアイテムをごみ箱に移動しますか?} other{{count} 件のアイテムをごみ箱に移動しますか?}}", + "@binEntriesConfirmationDialogMessage": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{このアイテムを削除しますか?} other{{count} 件のアイテムを削除しますか?}}", + "@deleteEntriesConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "続行する前にアイテムの日付を保存しますか?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "日付を設定", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "{time} の時点から再生を再開しますか?", + "@videoResumeDialogMessage": {}, + "videoStartOverButtonLabel": "最初から再生", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "再開", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "最新のアイテム", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "自動", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "カスタム", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "一致する写真と動画はコレクションに表示されなくなります。「プライバシー」設定からいつでもアイテムを表示できます。\n\nこれらのアイテムを非表示にしますか?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "新規アルバム", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "アルバム名", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "ディレクトリが既に存在します", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "ストレージ:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "新しい名前", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "ディレクトリが既に存在します", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "名前を変更", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "名前付けのパターン", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "フィールドを挿入", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "プレビュー", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "連番", + "@renameProcessorCounter": {}, + "renameProcessorName": "名前", + "@renameProcessorName": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{このアルバムとアルバム内のアイテムを削除しますか?} other{このアルバムとアルバム内の {count} 件のアイテムを削除しますか?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{これらのアルバムとアルバム内のアイテムを削除しますか?} other{これらのアルバムとアルバム内の {count} 件のアイテムを削除しますか?}}", + "@deleteMultiAlbumConfirmationDialogMessage": {}, + "exportEntryDialogFormat": "形式:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "幅", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "高さ", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "新しい名前", + "@renameEntryDialogLabel": {}, + "editEntryDialogTargetFieldsHeader": "更新するフィールド", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "日時", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "日を設定する", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "他の日からコピーする", + "@editEntryDateDialogCopyField": {}, + "editEntryDialogCopyFromItem": "他のアイテムからコピーする", + "@editEntryDialogCopyFromItem": {}, + "editEntryDateDialogExtractFromTitle": "タイトルから抽出する", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "シフト", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "ファイル更新日", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "時", + "@durationDialogHours": {}, + "durationDialogMinutes": "分", + "@durationDialogMinutes": {}, + "editEntryLocationDialogTitle": "位置情報", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogChooseOnMap": "地図上で選択", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "緯度", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "経度", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "この位置情報を使用", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "評価", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "メタデータの削除", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "もっと見る", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "モーションフォト内の動画を再生するには XMP が必要です。\n\n削除しますか?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "genericDangerWarningDialogMessage": "適用しますか?", + "@genericDangerWarningDialogMessage": {}, + "videoSpeedDialogLabel": "再生速度", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "動画", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "音声", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "字幕", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "オフ", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "トラック", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "他にトラックはありません。", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "完了しました!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "エラー", + "@genericFailureFeedback": {}, + "menuActionConfigureView": "表示", + "@menuActionConfigureView": {}, + "menuActionSelect": "選択", + "@menuActionSelect": {}, + "menuActionSelectAll": "すべて選択", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "選択を解除", + "@menuActionSelectNone": {}, + "menuActionMap": "地図", + "@menuActionMap": {}, + "menuActionSlideshow": "スライドショー", + "@menuActionSlideshow": {}, + "menuActionStats": "統計", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "並べ替え", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "グループ", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "レイアウト", + "@viewDialogLayoutSectionTitle": {}, + "tileLayoutGrid": "グリッド表示", + "@tileLayoutGrid": {}, + "tileLayoutList": "リスト表示", + "@tileLayoutList": {}, + "coverDialogTabCover": "カバー", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "アプリ", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "カラー", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "アプリを選ぶ", + "@appPickDialogTitle": {}, + "appPickDialogNone": "なし", + "@appPickDialogNone": {}, + "aboutPageTitle": "アプリについて", + "@aboutPageTitle": {}, + "aboutLinkLicense": "ライセンス", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "プライバシー ポリシー", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "バグの報告", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "アプリのログをファイルに保存", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "システム情報をコピー", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "コピー", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "ログとシステム情報とともに GitHub で報告", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "報告", + "@aboutBugReportButton": {}, + "aboutCreditsSectionTitle": "クレジット", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "このアプリは TopoJSON ファイルを", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "ISC License の下使用しています。", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "翻訳", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "オープンソース ライセンス", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "このアプリは下記のオープンソース パッケージおよびライブラリを使用しています。", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android ライブラリ", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter プラグイン", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter パッケージ", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart パッケージ", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "すべてのライセンスを表示", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "プライバシー ポリシー", + "@policyPageTitle": {}, + "collectionPageTitle": "コレクション", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "ピック", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "アイテムを選択", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "タイトル名フィルターを表示", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "タイトル名フィルターを非表示", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "ショートカットを追加", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "ごみ箱を空にする", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "アルバムにコピー", + "@collectionActionCopy": {}, + "collectionActionMove": "アルバムに移動", + "@collectionActionMove": {}, + "collectionActionRescan": "再スキャン", + "@collectionActionRescan": {}, + "collectionActionEdit": "編集", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "タイトルを検索", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "アルバム別", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "月別", + "@collectionGroupMonth": {}, + "collectionGroupDay": "日別", + "@collectionGroupDay": {}, + "sectionUnknown": "不明", + "@sectionUnknown": {}, + "dateToday": "今日", + "@dateToday": {}, + "dateYesterday": "昨日", + "@dateYesterday": {}, + "dateThisMonth": "今月", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, other{{count} 件のアイテムを削除できませんでした}}", + "@collectionDeleteFailureFeedback": {}, + "collectionCopyFailureFeedback": "{count, plural, other{{count} 件のアイテムをコピーできませんでした}}", + "@collectionCopyFailureFeedback": {}, + "collectionMoveFailureFeedback": "{count, plural, other{{count} 件のアイテムを移動できませんでした}}", + "@collectionMoveFailureFeedback": {}, + "collectionRenameFailureFeedback": "{count, plural, other{{count} 件のアイテム名を変更できませんでした}}", + "@collectionRenameFailureFeedback": {}, + "collectionEditFailureFeedback": "{count, plural, other{{count} 件のアイテムを編集できませんでした}}", + "@collectionEditFailureFeedback": {}, + "collectionExportFailureFeedback": "{count, plural, other{{count} ページをエクスポートできませんでした}}", + "@collectionExportFailureFeedback": {}, + "collectionCopySuccessFeedback": "{count, plural, other{{count} 件のアイテムをコピーしました}}", + "@collectionCopySuccessFeedback": {}, + "collectionMoveSuccessFeedback": "{count, plural, other{{count} 件のアイテムを移動しました}}", + "@collectionMoveSuccessFeedback": {}, + "collectionRenameSuccessFeedback": "{count, plural, other{{count} 件のアイテム名を変更しました}}", + "@collectionRenameSuccessFeedback": {}, + "collectionEditSuccessFeedback": "{count, plural, other{{count} 件のアイテムを編集しました}}", + "@collectionEditSuccessFeedback": {}, + "collectionEmptyFavourites": "お気に入りはありません", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "動画はありません", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "画像はありません", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "アクセスを許可", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "セクションを選択", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "セクションの選択を解除", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "アプリについて", + "@drawerAboutButton": {}, + "drawerSettingsButton": "設定", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "すべてのコレクション", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "お気に入り", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "画像", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "動画", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "アニメーション", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "モーションフォト", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "パノラマ", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Raw 写真", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "360° 動画", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "アルバム", + "@drawerAlbumPage": {}, + "drawerCountryPage": "国", + "@drawerCountryPage": {}, + "drawerTagPage": "タグ", + "@drawerTagPage": {}, + "sortByDate": "日付", + "@sortByDate": {}, + "sortByName": "名前", + "@sortByName": {}, + "sortByItemCount": "アイテム件数", + "@sortByItemCount": {}, + "sortBySize": "サイズ", + "@sortBySize": {}, + "sortByAlbumFileName": "アルバムとファイル名", + "@sortByAlbumFileName": {}, + "sortByRating": "評価", + "@sortByRating": {}, + "albumGroupTier": "階層別", + "@albumGroupTier": {}, + "albumGroupVolume": "ストレージ ボリューム別", + "@albumGroupVolume": {}, + "albumPickPageTitleCopy": "アルバムにコピー", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "アルバムにエクスポート", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "アルバムに移動", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "アルバムを選択", + "@albumPickPageTitlePick": {}, + "albumCamera": "カメラ", + "@albumCamera": {}, + "albumDownload": "ダウンロード", + "@albumDownload": {}, + "albumScreenshots": "スクリーンショット", + "@albumScreenshots": {}, + "albumScreenRecordings": "画面録画", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "動画キャプチャ", + "@albumVideoCaptures": {}, + "albumPageTitle": "アルバム", + "@albumPageTitle": {}, + "albumEmpty": "アルバムはありません", + "@albumEmpty": {}, + "createAlbumButtonLabel": "作成", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "新規", + "@newFilterBanner": {}, + "countryPageTitle": "国", + "@countryPageTitle": {}, + "countryEmpty": "国はありません", + "@countryEmpty": {}, + "tagPageTitle": "タグ", + "@tagPageTitle": {}, + "tagEmpty": "タグはありません", + "@tagEmpty": {}, + "binPageTitle": "ごみ箱", + "@binPageTitle": {}, + "searchCollectionFieldHint": "コレクションを検索", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "最近", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "日付", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "アルバム", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "国", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "場所", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "タグ", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "評価", + "@searchRatingSectionTitle": {}, + "settingsPageTitle": "設定", + "@settingsPageTitle": {}, + "settingsSystemDefault": "システム", + "@settingsSystemDefault": {}, + "settingsDefault": "デフォルト", + "@settingsDefault": {}, + "settingsSearchFieldLabel": "検索設定", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "一致する設定なし", + "@settingsSearchEmpty": {}, + "settingsActionExport": "エクスポート", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "エクスポート", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "インポート", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "インポート", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "カバー", + "@appExportCovers": {}, + "appExportFavourites": "お気に入り", + "@appExportFavourites": {}, + "appExportSettings": "設定", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "ナビゲーション", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "ホーム", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "ホーム", + "@settingsHomeDialogTitle": {}, + "settingsKeepScreenOnTile": "画面をオンのままにする", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "画面をオンのままにする", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "「戻る」を2回タップして終了", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "確認メッセージ", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "確認メッセージ", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "アイテムを完全に削除する前に確認", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "アイテムをごみ箱に移動する前に確認", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "メタデータ上に日付のないアイテムを移動する前に確認", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsNavigationDrawerTile": "ナビゲーション メニュー", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "ナビゲーション メニュー", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "メニュー項目を長押しして、移動および並べ替え", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "タイプ", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "アルバム", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "ページ", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "アルバムを追加", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "サムネイル", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "オーバーレイ", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "オーバーレイ", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowFavouriteIcon": "お気に入りアイコンを表示", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "タグアイコンを表示", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "位置情報アイコンを表示", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "モーションフォトアイコンを表示", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "評価情報を表示", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Raw アイコンを表示", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "動画の再生時間を表示", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "クイック アクション", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "クイック アクション", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "ブラウズ中", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "選択中", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "長押ししてボタンを移動しアイテムを閲覧中に表示されるアクションを選択します。", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "長押ししてボタンを移動しアイテムを選択中に表示されるアクションを選択します。", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsViewerSectionTitle": "ビューアー", + "@settingsViewerSectionTitle": {}, + "settingsViewerUseCutout": "切り取り領域を使用", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "明るさ最大", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "モーションフォトを自動再生", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "画像の背景", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "クイックアクション", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "クイックアクション", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "長押ししてボタンを移動しビューアーで表示されるアクションを選択します。", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "表示ボタン", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "利用可能なボタン", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "ボタンなし", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "オーバーレイ", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "オーバーレイ", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "起動時に表示", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "小さな地図を表示", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "情報を表示", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "タイトル、日付、位置情報、その他を表示", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowShootingDetails": "撮影詳細を表示", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowOverlayThumbnails": "サムネイルを表示", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "ぼかし効果", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "スライドショー", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "スライドショー", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "繰り返し", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "シャッフル", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "画面いっぱいに表示", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowTransitionTile": "トランジション", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "間隔", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "動画を再生", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "動画再生", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "動画設定", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "動画", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "動画を表示", + "@settingsVideoShowVideos": {}, + "settingsVideoEnableHardwareAcceleration": "ハードウェア アクセラレーション", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "自動再生", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "ループ モード", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "ループ モード", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "字幕", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "字幕", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "これはサンプルです。", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "テキストの配置", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "テキストの配置", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextSize": "テキストのサイズ", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "アウトラインと影を表示", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "テキストの色", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "テキストの不透明度", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "背景色", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "背景の不透明度", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "左揃え", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "中央揃え", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "右揃え", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoControlsTile": "操作", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "操作", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "ボタン", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "2回タップして再生/一時停止", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "画面の角を2回タップして早送り/早戻し", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsPrivacySectionTitle": "プライバシー", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "アプリのインベントリへのアクセスを許可する", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "アルバム表示の改善に使用されます", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "匿名でのエラー報告を許可する", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "検索履歴を保存", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "ごみ箱を使用", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "削除したアイテムを30日間保持します", + "@settingsEnableBinSubtitle": {}, + "settingsHiddenItemsTile": "非表示アイテム", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "非表示アイテム", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "非表示のフィルターに一致する写真と動画は、コレクションに表示されません。", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "非表示フィルターがありません", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "ストレージへのアクセス", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "ストレージへのアクセス", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessBanner": "ディレクトリによっては、ファイルの編集のためにアクセス許可が必要です。ここには、これまでにアクセスを許可したディレクトリが表示されます。", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "許可したアクセスはありません", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "許可を取り消し", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "アクセシビリティ", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "アニメーションの削除", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "アニメーションの削除", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "操作までの時間", + "@settingsTimeToTakeActionTile": {}, + "settingsDisplaySectionTitle": "ディスプレイ", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "テーマ", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "テーマ", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "カラー強調表示", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "ダイナミックカラー", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "ディスプレイ リフレッシュ レート", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "リフレッシュ レート", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageSectionTitle": "言語と形式", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "言語", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "言語", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "座標形式", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "座標形式", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "単位", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "単位", + "@settingsUnitSystemDialogTitle": {}, + "settingsScreenSaverPageTitle": "スクリーンセーバー", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "フォトフレーム", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "枠", + "@settingsWidgetShowOutline": {}, + "settingsCollectionTile": "コレクション", + "@settingsCollectionTile": {}, + "statsPageTitle": "統計", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, other{位置情報のあるアイテム {count} 件}}", + "@statsWithGps": {}, + "statsTopCountriesSectionTitle": "上位の国", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "上位の場所", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "上位のタグ", + "@statsTopTagsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "パノラマを開く", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "壁紙設定", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "エラー!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "ファイルが存在しません。", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "情報", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "ビューアーに戻る", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "不明", + "@viewerInfoUnknown": {}, + "viewerInfoLabelTitle": "タイトル", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "日付", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "解像度", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "サイズ", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "パス", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "再生時間", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "所有者", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "座標", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "アドレス", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "地図のスタイル", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "地図のスタイルを選択", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "ズームイン", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "ズームアウト", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "北が上になるように表示", + "@mapPointNorthUpTooltip": {}, + "openMapPageTooltip": "地図ページで表示", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "この地域の画像はありません", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "埋め込みデータを抽出できませんでした", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "開く", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "XML を表示", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "メタデータを検索", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "一致するキーはありません", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "日時", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "説明", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "寸法", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "解像度", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "権限", + "@viewerInfoSearchSuggestionRights": {}, + "tagEditorPageTitle": "タグの編集", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "新しいタグ", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "タグを追加", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "最近", + "@tagEditorSectionRecent": {}, + "panoramaEnableSensorControl": "センサー制御を有効にする", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "センサー制御を無効にする", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "ソース", + "@sourceViewerPageTitle": {}, + "entryInfoActionEditTitleDescription": "タイトルと説明を編集", + "@entryInfoActionEditTitleDescription": {}, + "filterNoDateLabel": "日付なし", + "@filterNoDateLabel": {}, + "filterNoTitleLabel": "タイトルなし", + "@filterNoTitleLabel": {}, + "filterRecentlyAddedLabel": "最近追加", + "@filterRecentlyAddedLabel": {}, + "viewerTransitionNone": "なし", + "@viewerTransitionNone": {}, + "widgetOpenPageViewer": "ビューワーを開く", + "@widgetOpenPageViewer": {}, + "durationDialogSeconds": "秒", + "@durationDialogSeconds": {}, + "viewDialogReverseSortOrder": "並び順を反転", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "モザイク", + "@tileLayoutMosaic": {}, + "sortOrderNewestFirst": "新しいものから表示", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "古いものから表示", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "AからZ", + "@sortOrderAtoZ": {}, + "sortOrderHighestFirst": "高いものから表示", + "@sortOrderHighestFirst": {}, + "sortOrderLargestFirst": "大きいものから表示", + "@sortOrderLargestFirst": {}, + "searchMetadataSectionTitle": "メタデータ", + "@searchMetadataSectionTitle": {}, + "settingsSlideshowAnimatedZoomEffect": "アニメーション付きのズーム効果", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsWidgetOpenPage": "ウィジェットをタップしたとき", + "@settingsWidgetOpenPage": {}, + "viewerInfoLabelDescription": "説明", + "@viewerInfoLabelDescription": {}, + "wallpaperUseScrollEffect": "ホーム画面でスクロール効果を使う", + "@wallpaperUseScrollEffect": {}, + "settingsAllowMediaManagement": "メディア管理を許可", + "@settingsAllowMediaManagement": {}, + "widgetOpenPageHome": "ホームを開く", + "@widgetOpenPageHome": {}, + "settingsDisabled": "無効", + "@settingsDisabled": {}, + "settingsViewerGestureSideTapNext": "画面の端をタップして進む/戻る", + "@settingsViewerGestureSideTapNext": {}, + "widgetOpenPageCollection": "コレクションを開く", + "@widgetOpenPageCollection": {}, + "sortOrderSmallestFirst": "小さいものから表示", + "@sortOrderSmallestFirst": {}, + "settingsConfirmationAfterMoveToBinItems": "ゴミ箱に移動したらメッセージを表示", + "@settingsConfirmationAfterMoveToBinItems": {}, + "tagPlaceholderPlace": "場所", + "@tagPlaceholderPlace": {}, + "tagEditorSectionPlaceholders": "プレースホルダー", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "国", + "@tagPlaceholderCountry": {}, + "sortOrderZtoA": "ZからA", + "@sortOrderZtoA": {}, + "sortOrderLowestFirst": "低いものから表示", + "@sortOrderLowestFirst": {}, + "chipActionFilterOut": "除外する", + "@chipActionFilterOut": {}, + "albumGroupType": "タイプ別", + "@albumGroupType": {}, + "albumMimeTypeMixed": "混合", + "@albumMimeTypeMixed": {}, + "statsTopAlbumsSectionTitle": "トップアルバム", + "@statsTopAlbumsSectionTitle": {}, + "editEntryLocationDialogSetCustom": "カスタムの場所を設定する", + "@editEntryLocationDialogSetCustom": {}, + "widgetDisplayedItemRandom": "ランダム", + "@widgetDisplayedItemRandom": {}, + "entryActionShareImageOnly": "画像のみ共有", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "動画のみ共有", + "@entryActionShareVideoOnly": {}, + "entryInfoActionRemoveLocation": "位置情報を削除", + "@entryInfoActionRemoveLocation": {}, + "widgetDisplayedItemMostRecent": "最新", + "@widgetDisplayedItemMostRecent": {}, + "settingsViewerShowRatingTags": "評価とタグを表示", + "@settingsViewerShowRatingTags": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "テキストの位置", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSubtitleThemeTextPositionTile": "テキストの位置", + "@settingsSubtitleThemeTextPositionTile": {}, + "entryInfoActionExportMetadata": "メタデータをエクスポート", + "@entryInfoActionExportMetadata": {}, + "subtitlePositionTop": "トップ", + "@subtitlePositionTop": {}, + "configureVaultDialogTitle": "保管庫の設定", + "@configureVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "画面オフ時にロック", + "@vaultDialogLockModeWhenScreenOff": {}, + "newVaultDialogTitle": "新しい保管庫", + "@newVaultDialogTitle": {}, + "authenticateToConfigureVault": "認証して保管庫を設定", + "@authenticateToConfigureVault": {}, + "vaultDialogLockTypeLabel": "ロックの種類", + "@vaultDialogLockTypeLabel": {}, + "pinDialogEnter": "PINを入力", + "@pinDialogEnter": {}, + "patternDialogEnter": "パターンを入力", + "@patternDialogEnter": {}, + "pinDialogConfirm": "PINの確認", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "パスワードを入力", + "@passwordDialogEnter": {}, + "authenticateToUnlockVault": "認証して保管庫を解除", + "@authenticateToUnlockVault": {}, + "passwordDialogConfirm": "パスワードの確認", + "@passwordDialogConfirm": {}, + "chipActionFilterIn": "フィルター", + "@chipActionFilterIn": {}, + "filterAspectRatioPortraitLabel": "縦向き", + "@filterAspectRatioPortraitLabel": {}, + "filterNoAddressLabel": "アドレスなし", + "@filterNoAddressLabel": {}, + "keepScreenOnVideoPlayback": "動画再生時", + "@keepScreenOnVideoPlayback": {}, + "chipActionGoToPlacePage": "場所別に表示", + "@chipActionGoToPlacePage": {}, + "tagPlaceholderState": "州", + "@tagPlaceholderState": {}, + "vaultLockTypePassword": "パスワード", + "@vaultLockTypePassword": {}, + "tooManyItemsErrorDialogMessage": "少ないアイテムで再度試してください。", + "@tooManyItemsErrorDialogMessage": {}, + "statePageTitle": "州", + "@statePageTitle": {}, + "drawerPlacePage": "場所", + "@drawerPlacePage": {}, + "chipActionLock": "ロック", + "@chipActionLock": {}, + "filterAspectRatioLandscapeLabel": "横向き", + "@filterAspectRatioLandscapeLabel": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "newVaultWarningDialogMessage": "保管庫のアイテムはアプリ内のみで保存しているため、他のアプリでは利用できません。\n\nこのアプリをアンインストールしたり、データを消去したりすると、これらのアイテムはすべて失われます。", + "@newVaultWarningDialogMessage": {}, + "patternDialogConfirm": "パターンの確認", + "@patternDialogConfirm": {}, + "placePageTitle": "場所", + "@placePageTitle": {}, + "settingsVideoEnablePip": "ピクチャインピクチャ", + "@settingsVideoEnablePip": {}, + "vaultLockTypePattern": "パターン", + "@vaultLockTypePattern": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "saveCopyButtonLabel": "コピーを保存", + "@saveCopyButtonLabel": {}, + "columnCount": "{count, plural, other{{count} 列}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chipActionShowCountryStates": "地域を表示", + "@chipActionShowCountryStates": {}, + "entryActionCast": "キャスト", + "@entryActionCast": {}, + "editorTransformRotate": "回転", + "@editorTransformRotate": {}, + "settingsVideoResumptionModeTile": "前回の位置からの再生", + "@settingsVideoResumptionModeTile": {}, + "settingsAskEverytime": "都度選択", + "@settingsAskEverytime": {}, + "maxBrightnessNever": "無効", + "@maxBrightnessNever": {}, + "settingsVideoResumptionModeDialogTitle": "前回の位置からの再生", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsVideoBackgroundMode": "バックグラウンド再生", + "@settingsVideoBackgroundMode": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "左右で上下にスワイプして輝度と音量を調節", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsViewerShowHistogram": "ヒストグラムを表示", + "@settingsViewerShowHistogram": {}, + "settingsVideoBackgroundModeDialogTitle": "バックグラウンド再生", + "@settingsVideoBackgroundModeDialogTitle": {}, + "maxBrightnessAlways": "常時有効", + "@maxBrightnessAlways": {}, + "chipActionShowCollection": "コレクションで表示", + "@chipActionShowCollection": {}, + "aboutDataUsageData": "データ", + "@aboutDataUsageData": {}, + "searchStatesSectionTitle": "地域", + "@searchStatesSectionTitle": {}, + "settingsViewerShowDescription": "説明を表示", + "@settingsViewerShowDescription": {}, + "chipActionConfigureVault": "保管庫を設定", + "@chipActionConfigureVault": {}, + "videoActionABRepeat": "A-B リピート", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "開始点を設定", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "終点を設定", + "@videoRepeatActionSetEnd": {}, + "cropAspectRatioSquare": "正方形", + "@cropAspectRatioSquare": {}, + "filterTaggedLabel": "タグ付き", + "@filterTaggedLabel": {}, + "albumTierVaults": "保管庫", + "@albumTierVaults": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "subtitlePositionBottom": "下", + "@subtitlePositionBottom": {}, + "statsTopStatesSectionTitle": "トップ地域", + "@statsTopStatesSectionTitle": {}, + "applyTooltip": "適用する", + "@applyTooltip": {}, + "viewerActionUnlock": "ビューをアンロック", + "@viewerActionUnlock": {}, + "editorActionTransform": "変換", + "@editorActionTransform": {}, + "settingsVideoPlaybackPageTitle": "再生", + "@settingsVideoPlaybackPageTitle": {}, + "editorTransformCrop": "切り取り", + "@editorTransformCrop": {}, + "exportEntryDialogWriteMetadata": "メタデータを書き込む", + "@exportEntryDialogWriteMetadata": {}, + "videoResumptionModeNever": "無効", + "@videoResumptionModeNever": {}, + "aboutDataUsageSectionTitle": "データ使用量", + "@aboutDataUsageSectionTitle": {}, + "videoResumptionModeAlways": "常にオン", + "@videoResumptionModeAlways": {}, + "settingsCollectionBurstPatternsTile": "バーストパターン", + "@settingsCollectionBurstPatternsTile": {}, + "settingsDisplayUseTvInterface": "Android TV インターフェイス", + "@settingsDisplayUseTvInterface": {}, + "tagEditorDiscardDialogMessage": "変更を破棄しますか?", + "@tagEditorDiscardDialogMessage": {}, + "widgetTapUpdateWidget": "ウィジェットを更新", + "@widgetTapUpdateWidget": {}, + "vaultBinUsageDialogMessage": "ゴミ箱を使用している保管庫があります。", + "@vaultBinUsageDialogMessage": {}, + "settingsConfirmationVaultDataLoss": "保管庫のデータ損失警告を表示する", + "@settingsConfirmationVaultDataLoss": {}, + "settingsWidgetDisplayedItem": "表示アイテム", + "@settingsWidgetDisplayedItem": {}, + "renameProcessorHash": "ハッシュ", + "@renameProcessorHash": {}, + "exportEntryDialogQuality": "画質", + "@exportEntryDialogQuality": {}, + "castDialogTitle": "キャストデバイス", + "@castDialogTitle": {}, + "aboutDataUsageCache": "キャッシュ", + "@aboutDataUsageCache": {}, + "aboutDataUsageMisc": "その他", + "@aboutDataUsageMisc": {}, + "aboutDataUsageInternal": "内部ストレージ", + "@aboutDataUsageInternal": {}, + "aboutDataUsageDatabase": "データベース", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageExternal": "外部ストレージ", + "@aboutDataUsageExternal": {}, + "collectionActionSetHome": "ホームに設定", + "@collectionActionSetHome": {}, + "placeEmpty": "場所なし", + "@placeEmpty": {}, + "settingsThumbnailShowHdrIcon": "HDRアイコンを表示", + "@settingsThumbnailShowHdrIcon": {}, + "settingsCollectionBurstPatternsNone": "なし", + "@settingsCollectionBurstPatternsNone": {}, + "settingsVideoPlaybackTile": "再生", + "@settingsVideoPlaybackTile": {}, + "settingsDisablingBinWarningDialogMessage": "ごみ箱の中のアイテムは永久に削除されます。", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsForceWesternArabicNumeralsTile": "アラビア数字を強制する", + "@settingsForceWesternArabicNumeralsTile": {}, + "overlayHistogramNone": "なし", + "@overlayHistogramNone": {}, + "overlayHistogramLuminance": "明るさ", + "@overlayHistogramLuminance": {}, + "settingsModificationWarningDialogMessage": "他の設定は変更されます。", + "@settingsModificationWarningDialogMessage": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "マルチタッチジェスチャーの選択肢を表示する", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "chipActionCreateVault": "保管庫を作成", + "@chipActionCreateVault": {}, + "aboutDataUsageClearCache": "キャッシュを削除", + "@aboutDataUsageClearCache": {}, + "viewerActionLock": "ビューをロック", + "@viewerActionLock": {}, + "cropAspectRatioFree": "フリー", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "オリジナル", + "@cropAspectRatioOriginal": {}, + "stopTooltip": "停止", + "@stopTooltip": {}, + "explorerPageTitle": "エクスプローラー", + "@explorerPageTitle": {}, + "chipActionGoToExplorerPage": "エクスプローラーで表示", + "@chipActionGoToExplorerPage": {}, + "filterLocatedLabel": "位置情報あり", + "@filterLocatedLabel": {}, + "mapAttributionOsmData": "地図データ © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors", + "@mapAttributionOsmData": {}, + "sortByDuration": "期間順", + "@sortByDuration": {}, + "explorerActionSelectStorageVolume": "ストレージを選択", + "@explorerActionSelectStorageVolume": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "アルバムはすでに存在します", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "videoActionShowPreviousFrame": "前のフレームを表示", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "次のフレームを表示", + "@videoActionShowNextFrame": {}, + "albumTierDynamic": "ダイナミック", + "@albumTierDynamic": {}, + "dynamicAlbumAlreadyExists": "ダイナミックアルバムはすでに存在します", + "@dynamicAlbumAlreadyExists": {}, + "stateEmpty": "州なし", + "@stateEmpty": {}, + "appExportDynamicAlbums": "ダイナミックアルバム", + "@appExportDynamicAlbums": {}, + "chipActionRemove": "削除", + "@chipActionRemove": {}, + "newDynamicAlbumDialogTitle": "新規ダイナミックアルバム", + "@newDynamicAlbumDialogTitle": {}, + "setHomeCustom": "カスタム", + "@setHomeCustom": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "selectStorageVolumeDialogTitle": "ストレージを選択", + "@selectStorageVolumeDialogTitle": {}, + "sortOrderShortestFirst": "短いものから表示", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "長いものから表示", + "@sortOrderLongestFirst": {}, + "collectionActionAddDynamicAlbum": "ダイナミックアルバムを追加", + "@collectionActionAddDynamicAlbum": {} +} diff --git a/lib/l10n/app_kmr.arb b/lib/l10n/app_kmr.arb new file mode 100644 index 0000000..5533079 --- /dev/null +++ b/lib/l10n/app_kmr.arb @@ -0,0 +1,690 @@ +{ + "@@locale": "kmr", + "appName": "Aves", + "@appName": {}, + "settingsLanguageSectionTitle": "Ziman û awa", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "Ziman", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "Ziman", + "@settingsLanguagePageTitle": {}, + "welcomeMessage": "Tu bi xêr hatî Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Vebijêrkî", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Ez merc û rewşan dipejirînim", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, =1{{count} hêman} other{{count} hêman}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "columnCount": "{count, plural, =1{{count} stûn} other{{count} stûn}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeSeconds": "{count, plural, =1{{count} çirke} other{{count} çirke}}", + "@timeSeconds": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeMinutes": "{count, plural, =1{{count} xulek} other{{count} xulek}}", + "@timeMinutes": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeDays": "{count, plural, =1{{count} roj} other{{count} roj}}", + "@timeDays": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "applyButtonLabel": "BISEPÎNE", + "@applyButtonLabel": {}, + "createButtonLabel": "BIAFIRÎNE", + "@createButtonLabel": {}, + "nextButtonLabel": "JÊ BIBE", + "@nextButtonLabel": {}, + "showButtonLabel": "NÎŞAN BIDE", + "@showButtonLabel": {}, + "hideButtonLabel": "VEŞÊRE", + "@hideButtonLabel": {}, + "continueButtonLabel": "BIDOMÎNE", + "@continueButtonLabel": {}, + "saveCopyButtonLabel": "JÊGIRTINÊ TOMAR BIKE", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Bisepîne", + "@applyTooltip": {}, + "cancelTooltip": "Têk bibe", + "@cancelTooltip": {}, + "changeTooltip": "Biguherîne", + "@changeTooltip": {}, + "clearTooltip": "Pak bike", + "@clearTooltip": {}, + "previousTooltip": "Paş", + "@previousTooltip": {}, + "nextTooltip": "Pêş", + "@nextTooltip": {}, + "showTooltip": "Nişan bide", + "@showTooltip": {}, + "hideTooltip": "Veşêre", + "@hideTooltip": {}, + "actionRemove": "Rake", + "@actionRemove": {}, + "resetTooltip": "Ji nû be saz bike", + "@resetTooltip": {}, + "saveTooltip": "Tomar bike", + "@saveTooltip": {}, + "stopTooltip": "Rawestîne", + "@stopTooltip": {}, + "pickTooltip": "Hilbijêre", + "@pickTooltip": {}, + "deleteButtonLabel": "JÊ BIBE", + "@deleteButtonLabel": {}, + "doubleBackExitMessage": "“Vegere” dîsa bitikîne da ku derkevî.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "Dîsa pirs neke", + "@doNotAskAgain": {}, + "sourceStateLoading": "Tê barkirin", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Beş", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Dîtina welatan", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Dîtina cihan", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Jê bibe", + "@chipActionDelete": {}, + "chipActionRemove": "Rake", + "@chipActionRemove": {}, + "chipActionShowCollection": "Di komê de nîşan bide", + "@chipActionShowCollection": {}, + "chipActionGoToAlbumPage": "Di elbumê de nîşan bide", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Di welatan de nîşan bide", + "@chipActionGoToCountryPage": {}, + "chipActionGoToPlacePage": "Di cihan de nîşan bide", + "@chipActionGoToPlacePage": {}, + "chipActionCreateGroup": "Komê biafirîne", + "@chipActionCreateGroup": {}, + "chipActionCreateAlbum": "Elbumê biafirîne", + "@chipActionCreateAlbum": {}, + "chipActionCreateVault": "Nirxê biafirîne", + "@chipActionCreateVault": {}, + "chipActionGoToTagPage": "Di nîşankan de nîşan bide", + "@chipActionGoToTagPage": {}, + "chipActionGoToExplorerPage": "Di gervanê de nîşan bide", + "@chipActionGoToExplorerPage": {}, + "chipActionHide": "Veşêre", + "@chipActionHide": {}, + "chipActionLock": "Kilît bike", + "@chipActionLock": {}, + "chipActionGroup": "Komkirinê biguherîne", + "@chipActionGroup": {}, + "chipActionRename": "Navê biguherîne", + "@chipActionRename": {}, + "chipActionShowCountryStates": "Amaran nîşan bide", + "@chipActionShowCountryStates": {}, + "entryActionDelete": "Jê bibe", + "@entryActionDelete": {}, + "entryActionConvert": "Mezinahiyê biguherîne", + "@entryActionConvert": {}, + "entryActionExport": "Derxîne", + "@entryActionExport": {}, + "entryActionInfo": "Zanyarî", + "@entryActionInfo": {}, + "entryActionRename": "Navê biguherîne", + "@entryActionRename": {}, + "entryActionRestore": "Vegerîne", + "@entryActionRestore": {}, + "entryActionPrint": "Çap bike", + "@entryActionPrint": {}, + "entryActionShare": "Parve bike", + "@entryActionShare": {}, + "entryActionEdit": "Biguherîne", + "@entryActionEdit": {}, + "albumTierSpecial": "Hevpar", + "@albumTierSpecial": {}, + "albumTierApps": "Sepan", + "@albumTierApps": {}, + "albumTierDynamic": "Dynamîk", + "@albumTierDynamic": {}, + "albumTierRegular": "Ên din", + "@albumTierRegular": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "coordinateDmsNorth": "BK", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "BŞ", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "RT", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "RA", + "@coordinateDmsWest": {}, + "keepScreenOnNever": "Ti carî", + "@keepScreenOnNever": {}, + "keepScreenOnAlways": "Her dem", + "@keepScreenOnAlways": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "maxBrightnessNever": "Ti carî", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "Her dem", + "@maxBrightnessAlways": {}, + "nameConflictStrategyRename": "Navê biguherîne", + "@nameConflictStrategyRename": {}, + "nameConflictStrategySkip": "Derbas bike", + "@nameConflictStrategySkip": {}, + "overlayHistogramNone": "Ne yek", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "overlayHistogramLuminance": "Ronahî", + "@overlayHistogramLuminance": {}, + "subtitlePositionTop": "Jor", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "Jêr", + "@subtitlePositionBottom": {}, + "themeBrightnessLight": "Ronahî", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Tarî", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Reş", + "@themeBrightnessBlack": {}, + "unitSystemMetric": "Metrî", + "@unitSystemMetric": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "vaultLockTypePassword": "Borînpeyv", + "@vaultLockTypePassword": {}, + "videoLoopModeNever": "Ti carî", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "Vîdyo yên kin tenê", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "Her dem", + "@videoLoopModeAlways": {}, + "videoPlaybackSkip": "Derbas bike", + "@videoPlaybackSkip": {}, + "videoResumptionModeNever": "Ti carî", + "@videoResumptionModeNever": {}, + "videoResumptionModeAlways": "Her dem", + "@videoResumptionModeAlways": {}, + "viewerTransitionSlide": "Bişemtîne", + "@viewerTransitionSlide": {}, + "entryActionCast": "Weşan", + "@entryActionCast": {}, + "videoActionMute": "Bêdeng bike", + "@videoActionMute": {}, + "videoActionUnmute": "Bêdeng neke", + "@videoActionUnmute": {}, + "videoActionPause": "Rawestîne", + "@videoActionPause": {}, + "videoActionPlay": "Vêxe", + "@videoActionPlay": {}, + "viewerActionSettings": "Sazkarî", + "@viewerActionSettings": {}, + "slideshowActionResume": "Bidomîne", + "@slideshowActionResume": {}, + "editorActionTransform": "Biguherîne", + "@editorActionTransform": {}, + "editorTransformCrop": "Jê bike", + "@editorTransformCrop": {}, + "editorTransformRotate": "Bizivirîne", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Belaş", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Resen", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Çargoşe", + "@cropAspectRatioSquare": {}, + "filterNoDateLabel": "Rojekirî", + "@filterNoDateLabel": {}, + "filterLocatedLabel": "Bicihkirî", + "@filterLocatedLabel": {}, + "filterNoLocationLabel": "Bicihnekirî", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Nenirxandî", + "@filterNoRatingLabel": {}, + "filterTaggedLabel": "Nîşankirî", + "@filterTaggedLabel": {}, + "filterNoTagLabel": "Nenîşankirî", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Bêsernav", + "@filterNoTitleLabel": {}, + "filterRatingRejectedLabel": "Dûrixistî", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Anîmasyon", + "@filterTypeAnimatedLabel": {}, + "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Xav", + "@filterTypeRawLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Wêne", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Vîdyo", + "@filterMimeVideoLabel": {}, + "albumTierNew": "Nû", + "@albumTierNew": {}, + "albumTierGroups": "Kom", + "@albumTierGroups": {}, + "renameProcessorName": "Nav", + "@renameProcessorName": {}, + "exportEntryDialogFormat": "Awa:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Ferehî", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Dirêjî", + "@exportEntryDialogHeight": {}, + "exportEntryDialogQuality": "Kalîte", + "@exportEntryDialogQuality": {}, + "durationDialogHours": "Demjimêr", + "@durationDialogHours": {}, + "durationDialogMinutes": "Xulek", + "@durationDialogMinutes": {}, + "durationDialogSeconds": "Çirke", + "@durationDialogSeconds": {}, + "editEntryLocationDialogTitle": "Cih", + "@editEntryLocationDialogTitle": {}, + "removeEntryMetadataDialogAll": "Hemû", + "@removeEntryMetadataDialogAll": {}, + "removeEntryMetadataDialogMore": "Bêtir", + "@removeEntryMetadataDialogMore": {}, + "videoStreamSelectionDialogVideo": "Vîdyo", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Deng", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Jêrnivîs", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "Vemirî", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Herik", + "@videoStreamSelectionDialogTrack": {}, + "genericSuccessFeedback": "Qediya!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Têkçûyî", + "@genericFailureFeedback": {}, + "menuActionConfigureView": "Nîşan bide", + "@menuActionConfigureView": {}, + "menuActionSelect": "Hilbijêre", + "@menuActionSelect": {}, + "menuActionMap": "Nexşe", + "@menuActionMap": {}, + "menuActionStats": "Amar", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "Rêzkirin", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "Beş", + "@viewDialogGroupSectionTitle": {}, + "tileLayoutMosaic": "Mozaîk", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "Tor", + "@tileLayoutGrid": {}, + "tileLayoutList": "Rêz", + "@tileLayoutList": {}, + "coverDialogTabApp": "Sepan", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Reng", + "@coverDialogTabColor": {}, + "appPickDialogNone": "Ne yek", + "@appPickDialogNone": {}, + "aboutPageTitle": "Derbar", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Lîsans", + "@aboutLinkLicense": {}, + "aboutBugCopyInfoButton": "Jê bigire", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportButton": "Ragihîne", + "@aboutBugReportButton": {}, + "aboutDataUsageData": "Dane", + "@aboutDataUsageData": {}, + "aboutDataUsageCache": "Bîrdanka demkî", + "@aboutDataUsageCache": {}, + "aboutDataUsageInternal": "Hindrîn", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "Derveyî", + "@aboutDataUsageExternal": {}, + "aboutTranslatorsSectionTitle": "Wergêr", + "@aboutTranslatorsSectionTitle": {}, + "collectionActionEdit": "Biguherîne", + "@collectionActionEdit": {}, + "sectionUnknown": "Nenas", + "@sectionUnknown": {}, + "dateToday": "Îro", + "@dateToday": {}, + "dateYesterday": "Duh", + "@dateYesterday": {}, + "drawerAboutButton": "Debar", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Sazkarî", + "@drawerSettingsButton": {}, + "drawerCollectionImages": "Wêne", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Vîdyo", + "@drawerCollectionVideos": {}, + "drawerAlbumPage": "Elbum", + "@drawerAlbumPage": {}, + "drawerCountryPage": "Welat", + "@drawerCountryPage": {}, + "drawerPlacePage": "Cih", + "@drawerPlacePage": {}, + "drawerTagPage": "Nîşank", + "@drawerTagPage": {}, + "albumMimeTypeMixed": "Tevlihev", + "@albumMimeTypeMixed": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "albumDownload": "Daxe", + "@albumDownload": {}, + "albumScreenshots": "Wêneyên dîmenderê", + "@albumScreenshots": {}, + "albumPageTitle": "Elbum", + "@albumPageTitle": {}, + "createAlbumButtonLabel": "BIAFIRÎNE", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "nû", + "@newFilterBanner": {}, + "countryPageTitle": "Welat", + "@countryPageTitle": {}, + "statePageTitle": "Amar", + "@statePageTitle": {}, + "placePageTitle": "Cih", + "@placePageTitle": {}, + "tagPageTitle": "Nîşank", + "@tagPageTitle": {}, + "explorerPageTitle": "Gervan", + "@explorerPageTitle": {}, + "searchRecentSectionTitle": "Dawî", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Dane", + "@searchDateSectionTitle": {}, + "newAlbumDialogStorageLabel": "Bîrdank:", + "@newAlbumDialogStorageLabel": {}, + "ungrouped": "Nekomkirinî", + "@ungrouped": {}, + "renameEntrySetPageTitle": "Navê biguherîne", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePreviewSectionTitle": "Pêşdîtin", + "@renameEntrySetPagePreviewSectionTitle": {}, + "searchAlbumsSectionTitle": "Elbum", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "Welat", + "@searchCountriesSectionTitle": {}, + "searchStatesSectionTitle": "Amar", + "@searchStatesSectionTitle": {}, + "searchPlacesSectionTitle": "Cih", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Nîşank", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "Nirxandin", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "Metadata", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Sazkarî", + "@settingsPageTitle": {}, + "settingsDefault": "Berdest", + "@settingsDefault": {}, + "settingsDisabled": "Neçalak kirî", + "@settingsDisabled": {}, + "settingsActionExport": "Derxe", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "Derxe", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "Têxe", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Têxe", + "@settingsActionImportDialogTitle": {}, + "appExportSettings": "Sazkarî", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "Navigasyon", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Ne yek jî", + "@settingsHomeTile": {}, + "setHomeCustom": "Kesane kirî", + "@setHomeCustom": {}, + "settingsNavigationDrawerTabTypes": "Cûre", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "Elbum", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Rûpel", + "@settingsNavigationDrawerTabPages": {}, + "settingsThumbnailSectionTitle": "Wêneyên biçûk", + "@settingsThumbnailSectionTitle": {}, + "widgetDisplayedItemRandom": "Rastehatî", + "@widgetDisplayedItemRandom": {}, + "addShortcutButtonLabel": "TEVLÎ BIKE", + "@addShortcutButtonLabel": {}, + "videoResumeButtonLabel": "BIDOMÎNE", + "@videoResumeButtonLabel": {}, + "setCoverDialogAuto": "Xweber", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Kesane", + "@setCoverDialogCustom": {}, + "editEntryRatingDialogTitle": "Nirxandin", + "@editEntryRatingDialogTitle": {}, + "searchFormatSectionTitle": "Awa", + "@searchFormatSectionTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Lêgerin", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Hilbijartin", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBurstPatternsNone": "Ne yek", + "@settingsCollectionBurstPatternsNone": {}, + "sourceViewerPageTitle": "Çavkanî", + "@sourceViewerPageTitle": {}, + "chipActionFilterOut": "Derxe", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Têxe", + "@chipActionFilterIn": {}, + "chipActionSetCover": "Bergê saz bike", + "@chipActionSetCover": {}, + "entryActionRotateCCW": "Berevajî demjimêrê bizivirîne", + "@entryActionRotateCCW": {}, + "entryActionShareImageOnly": "Tenê wêneyê parve bike", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "Tenê vîdyoyê parve bike", + "@entryActionShareVideoOnly": {}, + "entryActionViewSource": "Çavkaniyê nîşan bide", + "@entryActionViewSource": {}, + "entryActionViewMotionPhotoVideo": "Vîdyoyê veke", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionOpen": "Veke bi", + "@entryActionOpen": {}, + "entryActionSetAs": "Saz bike wekî", + "@entryActionSetAs": {}, + "entryActionOpenMap": "Di sepanê nexşeyê de nîşan bide", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Dîmenderê teqle bike", + "@entryActionRotateScreen": {}, + "entryInfoActionEditDate": "Dem & dîrokê biguherîne", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Cihê biguherîne", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "Sernav & danasînê biguherîne", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Nirxandinê biguherîne", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Nîşanan biguherîne", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Metadata biguherîne", + "@entryInfoActionRemoveMetadata": {}, + "entryInfoActionExportMetadata": "Metadata derxe", + "@entryInfoActionExportMetadata": {}, + "entryInfoActionRemoveLocation": "Cihê rake", + "@entryInfoActionRemoveLocation": {}, + "filterBinLabel": "Jêbirdank", + "@filterBinLabel": {}, + "filterNoAddressLabel": "Navnîşan tine ye", + "@filterNoAddressLabel": {}, + "filterOnThisDayLabel": "Di vê rojê de", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Nû tevlî bûyî", + "@filterRecentlyAddedLabel": {}, + "filterTypeSphericalVideoLabel": "360° vîdyo", + "@filterTypeSphericalVideoLabel": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "displayRefreshRatePreferHighest": "Bilindtirîn nirx", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Kêmtirîn nirx", + "@displayRefreshRatePreferLowest": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (Hybrid)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (Terrain)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "settingsVideoEnablePip": "Wêne di wêne de", + "@settingsVideoEnablePip": {}, + "settingsPrivacySectionTitle": "Taybetî", + "@settingsPrivacySectionTitle": {}, + "settingsAccessibilitySectionTitle": "Gihîştbarî", + "@settingsAccessibilitySectionTitle": {}, + "settingsDisplaySectionTitle": "Nîşandan", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Rûkar", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "Rûkar", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsUnitSystemTile": "Yekînî", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "Yekînî", + "@settingsUnitSystemDialogTitle": {}, + "statsPageTitle": "Amar", + "@statsPageTitle": {}, + "viewerErrorUnknown": "Wey li min!", + "@viewerErrorUnknown": {}, + "viewerInfoPageTitle": "Zanyarî", + "@viewerInfoPageTitle": {}, + "viewerInfoUnknown": "nenas", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "Danasîn", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Sernav", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "Dîrok", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelSize": "Mezinahî", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "Girêdan", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Rêgeh", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Dirêjahî", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Xwedî", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Koordînat", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Navnîşan", + "@viewerInfoLabelAddress": {}, + "mapStyleEditorDialogName": "Nav", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "Girêdan", + "@mapStyleEditorDialogUrl": {}, + "viewerInfoOpenLinkText": "Veke", + "@viewerInfoOpenLinkText": {}, + "viewerInfoSearchSuggestionDescription": "Danasîn", + "@viewerInfoSearchSuggestionDescription": {}, + "tagEditorSectionRecent": "Dawîn", + "@tagEditorSectionRecent": {}, + "tagPlaceholderCountry": "Welat", + "@tagPlaceholderCountry": {}, + "chipActionPin": "Li jor bi dar bixe", + "@chipActionPin": {}, + "chipActionUnpin": "Li jor bi dar nexe", + "@chipActionUnpin": {}, + "entryActionAddFavourite": "Tevlî bijarteyan bike", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Ji bijarteyan rake", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Çarçoveyê bigire", + "@videoActionCaptureFrame": {}, + "videoActionReplay10": "10 çirkeyan paşde vegerîne", + "@videoActionReplay10": {}, + "videoActionSkip10": "10 çirkeyan pêşde bibe", + "@videoActionSkip10": {}, + "videoActionShowPreviousFrame": "Çarçoveya paş nîşan bide", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "Çarçoveya pêş nîşan bide", + "@videoActionShowNextFrame": {}, + "videoActionSelectStreams": "Stran hilbijêre", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Leza lîstinê", + "@videoActionSetSpeed": {}, + "videoActionABRepeat": "A-B dûbare bike", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "Destpêk saz bike", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "Dawî saz bike", + "@videoRepeatActionSetEnd": {}, + "chipActionDecompose": "Veqetîne", + "@chipActionDecompose": {}, + "albumTierPinned": "Bi dar xistî", + "@albumTierPinned": {}, + "unitSystemImperial": "Imperial", + "@unitSystemImperial": {}, + "vaultLockTypePattern": "Çûre", + "@vaultLockTypePattern": {}, + "viewerTransitionParallax": "Parallax", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "Wendabûn", + "@viewerTransitionFade": {}, + "viewerTransitionNone": "Ne tişt", + "@viewerTransitionNone": {}, + "renameProcessorCounter": "Jimêr", + "@renameProcessorCounter": {}, + "editEntryDateDialogShift": "Biguherîne", + "@editEntryDateDialogShift": {} +} diff --git a/lib/l10n/app_kn.arb b/lib/l10n/app_kn.arb new file mode 100644 index 0000000..b0f71cc --- /dev/null +++ b/lib/l10n/app_kn.arb @@ -0,0 +1,978 @@ +{ + "appName": "ಎವೀಸ್", + "welcomeOptional": "ಐಚ್ಛಿಕ", + "welcomeTermsToggle": "ನಾನು ನಿಯಮಗಳು ಮತ್ತು ಷರತ್ತುಗಳನ್ನು ಒಪ್ಪುತ್ತೇನೆ", + "applyButtonLabel": "ಅನ್ವಯಿಸು", + "deleteButtonLabel": "ಅಳಿಸಿ", + "nextButtonLabel": "ಮುಂದೆ", + "showButtonLabel": "ತೋರಿಸು", + "hideButtonLabel": "ಅಡಗಿಸು", + "continueButtonLabel": "ಮುಂದುವರಿಸು", + "saveCopyButtonLabel": "ನಕಲು ಉಳಿಸಿ", + "applyTooltip": "ಅನ್ವಯಿಸು", + "cancelTooltip": "ರದ್ದುಗೊಳಿಸಿ", + "changeTooltip": "ಬದಲಿಸು", + "clearTooltip": "ಖಾಲಿ ಮಾಡು", + "previousTooltip": "ಹಿಂದಿನ", + "nextTooltip": "ಮುಂದಿನ", + "showTooltip": "ತೋರಿಸು", + "actionRemove": "ತೆಗೆದುಹಾಕಿ", + "resetTooltip": "ರೀಸೆಟ್ ಮಾಡಿ", + "saveTooltip": "ಉಳಿಸಿ", + "pickTooltip": "ಆಯ್ಕೆ", + "doubleBackExitMessage": "ನಿರ್ಗಮಿಸಲು ಮತ್ತೊಮ್ಮೆ “ಹಿಂದೆ” ಒತ್ತಿ.", + "doNotAskAgain": "ಇನ್ನೊಮ್ಮೆ ಕೇಳಬೇಡಿ", + "sourceStateLoading": "ಲೋಡ್ ಆಗುತ್ತಿದೆ", + "sourceStateCataloguing": "ಪಟ್ಟಿಮಾಡುವುದು", + "sourceStateLocatingCountries": "ದೇಶಗಳನ್ನು ಪತ್ತೆ ಮಾಡಲಾಗುತ್ತಿದೆ", + "sourceStateLocatingPlaces": "ಸ್ಥಳಗಳನ್ನು ಪತ್ತೆ ಮಾಡಲಾಗುತ್ತಿದೆ", + "chipActionDelete": "ಅಳಿಸಿ", + "chipActionGoToAlbumPage": "ಆಲ್ಬಮ್‌ಗಳಲ್ಲಿ ತೋರಿಸು", + "hideTooltip": "ಮರೆಮಾಡಿ", + "welcomeMessage": "ಎವೀಸ್ ಗೆ ಸ್ವಾಗತ", + "columnCount": "{count, plural, =1{{count} ಕಂಬಸಾಲು} other{{count} ಕಂಬಸಾಲುಗಳು}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "itemCount": "{count, plural, =1{{count} ವಸ್ತು} other{{count} ವಸ್ತುಗಳು}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "chipActionShowCollection": "ಸಂಗ್ರಹದಲ್ಲಿ ತೋರಿಸು", + "videoActionSetSpeed": "ಚಲನೆಯ ವೇಗ", + "viewerActionUnlock": "ನೋಟವನ್ನು ಬಿಡುಗಡೆಗೊಳಿಸಿ", + "editorActionTransform": "ರೂಪಾಂತರ", + "editorTransformCrop": "ಕತ್ತರಿಸು", + "chipActionUnpin": "ಪಿನ್ ತೆಗೆಯಿರಿ", + "chipActionDecompose": "ವಿಭಜಿಸು", + "chipActionFilterIn": "ಶೋಧಿಸು", + "chipActionHide": "ಅಡಗಿಸು", + "chipActionLock": "ಬಂಧಿಸು", + "chipActionPin": "ಮೇಲೆ ಸಿಕ್ಕಿಸು", + "entryActionShareVideoOnly": "ವಿಡಿಯೋವನ್ನು ಮಾತ್ರ ಹಂಚಿಕೊಳ್ಳಿ", + "entryActionViewSource": "ಮೂಲವನ್ನು ನೋಡಿ", + "entryActionConvertMotionPhotoToStillImage": "ಸ್ಥಿರ ಚಿತ್ರವಾಗಿ ಮಾರ್ಪಡಿಸಿ", + "entryActionViewMotionPhotoVideo": "ವಿಡಿಯೋ ತೆರೆಯಿರಿ", + "entryActionOpen": "ಇಂದ ತೆರೆಯಿರಿ", + "entryActionSetAs": "ಇದಾಗಿ ಸೆಟ್ ಮಾಡಿ", + "entryActionCast": "ಕ್ಯಾಸ್ಟ್", + "entryActionOpenMap": "ನಕ್ಷೆಯ ಆಪ್ ನಲ್ಲಿ ತೋರಿಸಿ", + "entryActionRotateScreen": "ಪರದೆಯನ್ನು ತಿರುಗಿಸಿ", + "entryActionAddFavourite": "ನೆಚ್ಚಿನದಕ್ಕೆ ಸೇರಿಸಿ", + "entryActionRemoveFavourite": "ನೆಚ್ಚಿನವುಗಳಿಂದ ತೆಗೆಯಿರಿ", + "videoActionShowNextFrame": "ಮುಂದಿನ ಫ್ರೇಮ್ ತೋರಿಸಿ", + "videoActionReplay10": "೧೦ ಕ್ಷಣ ಹಿಂದೆ ಓಡಿಸಿ", + "videoActionSelectStreams": "ಟ್ರ್ಯಾಕ್ ಆರಿಸಿ", + "videoActionABRepeat": "A-B ಪುನರಾವರ್ತನೆ", + "entryInfoActionEditTags": "Tagಗಳನ್ನು ತಿದ್ದಿ", + "entryInfoActionRemoveMetadata": "metadata ತೆಗೆಯಿರಿ", + "entryInfoActionExportMetadata": "metadata ರಪ್ತು ಮಾಡಿ", + "entryInfoActionRemoveLocation": "ಸ್ಥಳದ ವಿವರಗಳನ್ನು ತೆಗೆಯಿರಿ", + "focalLength": "{length} ಮಿಮಿ", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "chipActionRemove": "ತೆಗೆದುಹಾಕು", + "chipActionGoToCountryPage": "ದೇಶಗಳಲ್ಲಿ ತೋರಿಸು", + "chipActionGoToPlacePage": "ಸ್ಥಳಗಳಲ್ಲಿ ತೋರಿಸು", + "chipActionGoToTagPage": "Tagಗಳಲ್ಲಿ ತೋರಿಸು", + "chipActionFilterOut": "ಪ್ರತ್ಯೇಕಿಸು", + "videoActionShowPreviousFrame": "ಹಿಂದಿನ ಫ್ರೇಮ್ ತೋರಿಸಿ", + "timeMinutes": "{count, plural, =1{{count} ನಿಮಿಷ} other{{count} ನಿಮಿಷಗಳು}}", + "@timeMinutes": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeDays": "{count, plural, =1{{count} ದಿನ} other{{count} ದಿನಗಳು}}", + "@timeDays": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "editorTransformRotate": "ತಿರುಗಿಸು", + "stopTooltip": "ನಿಲ್ಲಿಸು", + "chipActionRename": "ಮರುನಾಮಕರಣ", + "chipActionSetCover": "ರಕ್ಷಾಕವಚ ಹೊಂದಿಸು", + "chipActionGoToExplorerPage": "ಪರಿಶೋಧಕದಲ್ಲಿ ತೋರಿಸು", + "chipActionShowCountryStates": "ಅಂಕಿಅಂಶಗಳನ್ನು ತೋರಿಸಿ", + "entryActionPrint": "ಮುದ್ರಿಸು", + "entryActionShare": "ಹಂಚಿಕೊಳ್ಳಿ", + "entryActionShareImageOnly": "ಚಿತ್ರವನ್ನು ಮಾತ್ರ ಹಂಚಿಕೊಳ್ಳಿ", + "entryActionShowGeoTiffOnMap": "ನಕ್ಷೆಯ ಮೇಲ್ಪದರದಲ್ಲಿ ತೋರಿಸಿ", + "entryActionEdit": "ಸಂಪಾದಿಸಿ", + "videoActionCaptureFrame": "ಫ್ರೇಮ್ ಸೆರೆಹಿಡಿಯಿರಿ", + "videoActionPlay": "ಪ್ಲೇ ಮಾಡಿ", + "videoActionUnmute": "ಸದ್ದಾಗಿಸಿ", + "videoActionMute": "ಸದ್ದಡಗಿಸಿ", + "videoActionPause": "ತಾಳು", + "entryInfoActionEditTitleDescription": "ಶೀರ್ಷಿಕೆ ಮತ್ತು ವಿವರಣೆಯನ್ನು ತಿದ್ದಿ", + "videoRepeatActionSetStart": "ಪ್ರಾರಂಭವನ್ನು ಹೊಂದಿಸಿ", + "entryInfoActionEditRating": "ಮೌಲ್ಯವನ್ನು ತಿದ್ದಿ", + "slideshowActionResume": "ಪುನರಾರಂಭಿಸಿ", + "slideshowActionShowInCollection": "ಸಂಗ್ರಹದಲ್ಲಿ ತೋರಿಸಿ", + "videoRepeatActionSetEnd": "ಅಂತ್ಯವನ್ನು ಹೊಂದಿಸಿ", + "viewerActionSettings": "ಸಂಯೋಜನೆಗಳು", + "viewerActionLock": "ನೋಟವನ್ನು ಬಂಧಿಸಿ", + "entryInfoActionEditDate": "ದಿನಾಂಕ ಮತ್ತು ಸಮಯವನ್ನು ತಿದ್ದಿ", + "entryInfoActionEditLocation": "ಸ್ಥಳವನ್ನು ತಿದ್ದಿ", + "cropAspectRatioFree": "ಉಚಿತ", + "cropAspectRatioOriginal": "ಮೂಲ", + "cropAspectRatioSquare": "ಚೌಕ", + "filterAspectRatioLandscapeLabel": "ಭೂದೃಶ್ಯ", + "filterAspectRatioPortraitLabel": "ಭಾವಚಿತ್ರ", + "filterBinLabel": "ಮರುಬಳಕೆ ತೊಟ್ಟಿ", + "filterFavouriteLabel": "ಅಚ್ಚುಮೆಚ್ಚು", + "filterNoDateLabel": "ದಿನಾಂಕವಿಲ್ಲ", + "filterNoAddressLabel": "ವಿಳಾಸವಿಲ್ಲ", + "filterLocatedLabel": "ನೆಲೆಗೊಳಿಸಿದ್ದು", + "filterNoLocationLabel": "ನೆಲೆ ಇಲ್ಲದ್ದು", + "filterTaggedLabel": "ಮೌಲ್ಯ ಸಹಿತ", + "filterNoRatingLabel": "ಮೌಲ್ಯ ರಹಿತ", + "filterNoTagLabel": "ಮೌಲ್ಯವಿಲ್ಲದ್ದು", + "filterOnThisDayLabel": "ಈ ದಿನದಂದು", + "filterNoTitleLabel": "ಶೀರ್ಷಿಕೆ ರಹಿತ", + "videoActionSkip10": "೧೦ ಕ್ಷಣ ಮುಂದೆ ಓಡಿಸಿ", + "timeSeconds": "{count, plural, =1{{count} ಕ್ಷಣ} other{{count} ಕ್ಷಣಗಳು}}", + "@timeSeconds": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "keepScreenOnNever": "ಎಂದಿಗೂ ಇಲ್ಲ", + "restrictedAccessDialogMessage": "{directory} ನ “{volume}”ನಲ್ಲಿರುವ ಕಡತಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಈ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸಲಾಗಿಲ್ಲ.\n\nದಯವಿಟ್ಟು ವಸ್ತುಗಳನ್ನು ಮತ್ತೊಂದು ಕೋಶಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸಲು ಮೊದಲೇ ಸ್ಥಾಪಿಸಲಾದ ಕಡತ ನಿರ್ವಾಹಕ ಅಥವಾ ಗ್ಯಾಲರಿ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸಿ.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "coordinateFormatDdm": "DDM", + "mapStyleGoogleNormal": "ಗೂಗಲ್ ನಕಾಶೆಗಳು", + "storageAccessDialogMessage": "ಈ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡಲು ಮುಂದಿನ ಪರದೆಯಲ್ಲಿ “{volume}” ದ {directory} ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿ.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "viewerTransitionZoomIn": "ಹಿಗ್ಗಿಸು", + "widgetOpenPageViewer": "ವೀಕ್ಷಕವನ್ನು ತೆರೆಯಿರಿ", + "otherDirectoryDescription": "“{name}” ಕೋಶ", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "authenticateToConfigureVault": "ನೆಲಮಾಳಿಗೆಯನ್ನು ಸಂರಚಿಸಲು ಧೃಡೀಕರಿಸಿ", + "newVaultWarningDialogMessage": "ನೆಲಮಾಳಿಗೆಯಲ್ಲಿನ ವಸ್ತುಗಳು ಈ ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ ಮಾತ್ರ ಲಭ್ಯವಿದೆ ಮತ್ತು ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಲ್ಲಿ ಇರುವುದಿಲ್ಲ.\n\nನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್ ನನ್ನು ಅಸ್ಥಾಪಿಸಿದರೆ ಅಥವಾ ಈ ಅಪ್ಲಿಕೇಶನ್ ದತ್ತಾಂಶಗಳನ್ನು ತೆರವುಗೊಳಿಸಿದರೆ, ನೀವು ಈ ಎಲ್ಲ ವಸ್ತುಗಳನ್ನು ಕಳೆದುಕೊಳ್ಳುತ್ತೀರಿ.", + "passwordDialogEnter": "ಕೀಲಿಪದ ನಮೂದಿಸಿ", + "configureVaultDialogTitle": "ನೆಲಮಾಳಿಗೆಯನ್ನು ಸಂರಚಿಸಿ", + "editEntryDialogTargetFieldsHeader": "ಮಾರ್ಪಡಿಸುವ ಕ್ಷೇತ್ರಗಳು", + "patternDialogEnter": "ಪ್ಯಾಟರ್ನ್ ನಮೂದಿಸಿ", + "patternDialogConfirm": "ಪ್ಯಾಟರ್ನ್ ಖಚಿತಪಡಿಸಿ", + "renameEntryDialogLabel": "ಹೊಸ ಹೆಸರು", + "exportEntryDialogWriteMetadata": "ಮೆಟಾಡೇಟಾ ಬರೆಯಿರಿ", + "renameAlbumDialogLabel": "ಹೊಸ ಹೆಸರು", + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{ಈ ಆಲ್ಬಮ್ ಮತ್ತು ಅದರಲ್ಲಿರುವ ವಸ್ತುವನ್ನು ಅಳಿಸುವುದೇ?} other{ಈ ಆಲ್ಬಮ್ ಮತ್ತು ಅದರಲ್ಲಿರುವ {count} ವಸ್ತುಗಳನ್ನು ಅಳಿಸುವುದೇ?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{ಈ ಆಲ್ಬಮ್ ಗಳನ್ನು ಮತ್ತು ಅದರಲ್ಲಿರುವ ವಸ್ತುವನ್ನು ಅಳಿಸುವುದೇ?} other{ಈ ಆಲ್ಬಮ್ ಗಳನ್ನು ಮತ್ತು ಅದರಲ್ಲಿರುವ {count} ವಸ್ತುಗಳನ್ನು ಅಳಿಸುವುದೇ?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "exportEntryDialogFormat": "ಸ್ವರೂಪ:", + "pinDialogEnter": "PIN ನಮೂದಿಸಿ", + "renameProcessorName": "ಹೆಸರು", + "editEntryDateDialogTitle": "ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", + "subtitlePositionTop": "ಮೇಲ್ತುದಿ", + "widgetTapUpdateWidget": "ವಿಜೆಟ್ ನವೀಕರಿಸಿ", + "rootDirectoryDescription": "ಮೂಲ ಕೋಶ", + "mapStyleOpenTopoMap": "ಓಪನ್ ಟೊಪೊ ಮ್ಯಾಪ್", + "mapStyleOsmHot": "ಮಾನವೀಯ OSM", + "maxBrightnessAlways": "ಯಾವಾಗಲೂ", + "vaultLockTypePin": "ಪಿನ್", + "videoLoopModeNever": "ಇಂದಿಗೂ ಇಲ್ಲ", + "videoLoopModeShortOnly": "ಚಿಕ್ಕ ವಿಡಿಯೋಗಳನ್ನು ಮಾತ್ರ", + "videoLoopModeAlways": "ಯಾವಾಗಲೂ", + "videoPlaybackMuted": "ಶಬ್ದರಹಿತವಾಗಿ ಪ್ಲೇ ಮಾಡಿ", + "videoPlaybackWithSound": "ಶಬ್ದಸಹಿತವಾಗಿ ಪ್ಲೇ ಮಾಡಿ", + "videoResumptionModeNever": "ಎಂದಿಗೂ ಇಲ್ಲ", + "wallpaperTargetLock": "ಲಾಕ್ ಪರದೆ", + "wallpaperTargetHomeLock": "ಮುಖ ಮತ್ತು ಲಾಕ್ ಪರದೆ", + "widgetDisplayedItemRandom": "ಇಷ್ಟಬಂದಂತೆ", + "moveUndatedConfirmationDialogMessage": "ಮುಂದುವರಿಯುವ ಮೊದಲು ವಸ್ತುವಿನ ದಿನಾಂಕಗಳನ್ನು ಉಳಿಸುವುದೇ?", + "moveUndatedConfirmationDialogSetDate": "ದಿನಾಂಕಗಳನ್ನು ಉಳಿಸಿ", + "vaultDialogLockModeWhenScreenOff": "ಪರದೆ ಬಂದಾದಾಗ ಲಾಕ್ ಮಾಡಿ", + "authenticateToUnlockVault": "ನೆಲಮಾಳಿಗೆಯ ಲಾಕ್ ತೆಗೆಯಲು ಧೃಡೀಕರಿಸಿ", + "vaultBinUsageDialogMessage": "ಕೆಲವು ನೆಲಮಾಳಿಗೆಗಳು ಮರುಬಳಕೆ ತೊಟ್ಟಿಯನ್ನು ಬಳಸುತ್ತಿವೆ.", + "coordinateFormatDms": "DMS", + "renameEntrySetPagePatternFieldLabel": "ಹೆಸರಿಸುವ ಮಾದರಿ", + "renameProcessorCounter": "ಗಣಕ", + "renameProcessorHash": "ಹ್ಯಾಷ್", + "exportEntryDialogHeight": "ಎತ್ತರ", + "exportEntryDialogQuality": "ಗುಣಮಟ್ಟ", + "overlayHistogramNone": "ಏನಿಲ್ಲ", + "overlayHistogramRGB": "RGB", + "setCoverDialogAuto": "ಸ್ವಯಂಚಾಲಿತ", + "coordinateDmsEast": "ಪೂ", + "albumTierVaults": "ನೆಲಮಾಳಿಗೆಗಳು", + "albumTierDynamic": "ಕ್ರಿಯಾಶೀಲ", + "albumTierRegular": "ಇತರೆ", + "coordinateFormatDecimal": "ದಶಮಾಂಶ ಡಿಗ್ರಿಗಳು", + "lengthUnitPercent": "%", + "keepScreenOnVideoPlayback": "ವಿಡಿಯೋ ಚಲನೆಯಲ್ಲಿರುವಾಗ", + "mapStyleGoogleTerrain": "ಗೂಗಲ್ ನಕಾಶೆಗಳು (ಭೂ ಪ್ರದೇಶ)", + "mapStyleStamenWatercolor": "Stamen ಜಲವರ್ಣ", + "themeBrightnessLight": "ತಿಳಿ ಬಣ್ಣ", + "themeBrightnessBlack": "ಕಡುಕಪ್ಪು", + "unitSystemImperial": "ಇಂಪೀರಿಯಲ್", + "vaultLockTypePattern": "ಪ್ಯಾಟರ್ನ್", + "viewerTransitionSlide": "ಜಾರಿಸು", + "viewerTransitionParallax": "ಪ್ಯಾರಾಲಾಕ್ಸ್", + "videoPlaybackSkip": "ಬಿಟ್ಟುಬಿಡು", + "storageVolumeDescriptionFallbackPrimary": "ಆಂತರಿಕ ಸಂಗ್ರಹಣೆ", + "dynamicAlbumAlreadyExists": "ಡೈನಾಮಿಕ್ ಆಲ್ಬಮ್ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ", + "newAlbumDialogNameLabel": "ಆಲ್ಬಮ್ ಹೆಸರು", + "renameAlbumDialogLabelAlreadyExistsHelper": "ಕೋಶವು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ", + "renameEntrySetPagePreviewSectionTitle": "ಮುನ್ನೋಟ", + "renameEntrySetPageInsertTooltip": "ಕ್ಷೇತ್ರವನ್ನು ಸೇರಿಸಿ", + "mapStyleGoogleHybrid": "ಗೂಗಲ್ ನಕಾಶೆಗಳು (ಹೈಬ್ರಿಡ್)", + "viewerTransitionFade": "ಮರೆಯಾಗಿಸು", + "videoResumeDialogMessage": "{time}ಕ್ಕೆ ಪುನರಾರಂಭಿಸಲು ನೀವು ಬಯಸುವಿರಾ?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "videoStartOverButtonLabel": "ಬುಡದಿಂದ ಪ್ರಾರಂಭಿಸಿ", + "newAlbumDialogAlbumAlreadyExistsHelper": "ಆಲ್ಬಮ್ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ", + "passwordDialogConfirm": "ಕೀಲಿಪದ ಖಚಿತಪಡಿಸಿ", + "exportEntryDialogWidth": "ಅಗಲ", + "editEntryDateDialogSetCustom": "ನಿಗದಿತ ದಿನಾಂಕವನ್ನು ಹೊಂದಿಸಿ", + "editEntryDateDialogCopyField": "ಬೇರೆಯ ದಿನಾಂಕದಿಂದ ನಕಲಿಸಿ", + "editEntryDateDialogExtractFromTitle": "ಶೀರ್ಷಿಕೆಯಿಂದ ಆಯ್ದು ತೆಗೆಯಿರಿ", + "lengthUnitPixel": "px", + "keepScreenOnAlways": "ಯಾವಾಗಲೂ", + "keepScreenOnViewerOnly": "ವೀಕ್ಷಣಾ ಪುಟದಲ್ಲಿ ಮಾತ್ರ", + "subtitlePositionBottom": "ಬುಡ", + "maxBrightnessNever": "ಎಂದಿಗೂ ಇಲ್ಲ", + "newDynamicAlbumDialogTitle": "ಹೊಸ ಡೈನಾಮಿಕ್ ಆಲ್ಬಮ್", + "mapStyleOsmLiberty": "OSM ಸ್ವಾತಂತ್ರ್ಯ", + "vaultLockTypePassword": "ಕೀಲಿಪದ", + "settingsVideoEnablePip": "ಚಿತ್ರದೊಳಗಿನ ಚಿತ್ರಣ", + "videoControlsPlayOutside": "ಇನ್ನೊಂದು ಪ್ಲೇಯರ್ ನಲ್ಲಿ ತೆರೆಯಿರಿ", + "storageVolumeDescriptionFallbackNonPrimary": "ಎಸ್ ಡಿ ಕಾರ್ಡ್", + "viewerTransitionNone": "ಏನಿಲ್ಲ", + "wallpaperTargetHome": "ಮುಖ ಪರದೆ", + "notEnoughSpaceDialogMessage": "ಈ ಕಾರ್ಯಾಚರಣೆಗೆ ಪೂರ್ಣಗೊಳ್ಳಲು “{volume}” ನಲ್ಲಿ {neededSize} ಉಚಿತ ಸ್ಥಳಾವಕಾಶದ ಅಗತ್ಯವಿದೆ, ಆದರೆ ಕೇವಲ {freeSize} ಮಾತ್ರ ಲಭ್ಯವಿದೆ.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "nameConflictDialogSingleSourceMessage": "ಗಮ್ಯಸ್ಥಾನ ಕೋಶದಲ್ಲಿರುವ ಕೆಲವು ಕಡತಗಳು ಒಂದೇ ಹೆಸರನ್ನು ಹೊಂದಿವೆ.", + "newVaultDialogTitle": "ಹೊಸ ನೆಲಮಾಳಿಗೆ", + "newAlbumDialogNameLabelAlreadyExistsHelper": "ಕೋಶವು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ", + "newAlbumDialogStorageLabel": "ಸಂಗ್ರಹಣೆ:", + "vaultDialogLockTypeLabel": "ಲಾಕ್ ವಿಧ", + "pinDialogConfirm": "PIN ಖಚಿತಪಡಿಸಿ", + "editEntryDialogCopyFromItem": "ಇತರ ವಸ್ತುವಿನಿಂದ ನಕಲಿಸಿ", + "unitSystemMetric": "ಮೆಟ್ರಿಕ್", + "renameEntrySetPageTitle": "ಮರುಹೆಸರಿಸಿ", + "videoResumptionModeAlways": "ಯಾವಾಗಲೂ", + "chipActionCreateAlbum": "ಆಲ್ಬಮ್ ರಚಿಸಿ", + "chipActionCreateVault": "ನೆಲಮಾಳಿಗೆ ರಚಿಸಿ", + "chipActionConfigureVault": "ನೆಲಮಾಳಿಗೆ ಸಂರಚಿಸಿ", + "entryActionCopyToClipboard": "ಕ್ಲಿಪ್‌ಬೋರ್ಡ್ ಗೆ ನಕಲಿಸಿ", + "entryActionDelete": "ಅಳಿಸಿ", + "entryActionConvert": "ಪರಿವರ್ತಿಸಿ", + "entryActionRotateCW": "ಪ್ರದಕ್ಷಿಣಾಕಾರವಾಗಿ ತಿರುಗಿಸಿ", + "entryActionFlip": "ಅಡ್ಡ ಮಗುಚು", + "entryActionExport": "ರಫ್ತು", + "entryActionInfo": "ಮಾಹಿತಿ", + "entryActionRename": "ಮರುನಾಮಕರಣ", + "entryActionRestore": "ಮರುಸ್ಥಾಪಿಸಿ", + "entryActionRotateCCW": "ಅಪ್ರದಕ್ಷಿಣಾಕಾರವಾಗಿ ತಿರುಗಿಸಿ", + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsNorth": "ಉ", + "coordinateDmsWest": "ಪ", + "coordinateDmsSouth": "ದ", + "displayRefreshRatePreferHighest": "ಗರಿಷ್ಠ ದರ", + "displayRefreshRatePreferLowest": "ಕನಿಷ್ಠ ದರ", + "nameConflictStrategyRename": "ಮರುನಾಮಕರಣ", + "nameConflictStrategyReplace": "ಬದಲಾಯಿಸು", + "nameConflictStrategySkip": "ಬಿಟ್ಟುಬಿಡು", + "overlayHistogramLuminance": "ಪ್ರಕಾಶ", + "themeBrightnessDark": "ಗಾಢ ಬಣ್ಣ", + "widgetDisplayedItemMostRecent": "ಅತ್ಯಂತ ಇತ್ತೀಚಿನ", + "widgetOpenPageHome": "ಮುಖ್ಯಪರದೆ ತೆರೆಯಿರಿ", + "widgetOpenPageCollection": "ಸಂಗ್ರಹವನ್ನು ತೆರೆಯಿರಿ", + "missingSystemFilePickerDialogMessage": "ವ್ಯವಸ್ಥೆಯ ಕಡತ ಆರಿಸುವಿಕೆ ಕಾಣೆಯಾಗಿದೆ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ದಯವಿಟ್ಟು ಅದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ ಮತ್ತು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.", + "unsupportedTypeDialogMessage": "{count, plural, =1{ಈ ಕಾರ್ಯಾಚರಣೆಯು ಈ ವಿಧದ ವಸ್ತುವಿಗೆ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ: {types}.} other{ಈ ಕಾರ್ಯಾಚರಣೆಯು ಈ ವಿಧದ ವಸ್ತುಗಳಿಗೆ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "nameConflictDialogMultipleSourceMessage": "ಕೆಲವು ಕಡತಗಳು ಒಂದೇ ಹೆಸರನ್ನು ಹೊಂದಿವೆ.", + "addShortcutDialogLabel": "ಶಾರ್ಟ್ಕಟ್ ಹೆಸರು", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{ಇದನ್ನು ಮರುಬಳಕೆ ತೊಟ್ಟಿಗೆ ಸ್ಥಳಾಂತರಿಸುವುದೇ?} other{{count} ವಸ್ತುಗಳನ್ನು ಮರುಬಳಕೆ ತೊಟ್ಟಿಗೆ ಸ್ಥಳಾಂತರಿಸುವುದೇ?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "addShortcutButtonLabel": "ಸೇರಿಸು", + "noMatchingAppDialogMessage": "ಇದನ್ನು ನಿಭಾಯಿಸಬಲ್ಲ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಲ್ಲ.", + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{ಇದನ್ನು ಅಳಿಸುವುದೇ?} other{{count} ವಸ್ತುಗಳನ್ನು ಅಳಿಸುವುದೇ?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "videoResumeButtonLabel": "ಮುಂದುವರೆಸಿ", + "setCoverDialogLatest": "ಹೊಚ್ಚಹೊಸ ವಸ್ತುಗಳು", + "newAlbumDialogTitle": "ಹೊಸ ಆಲ್ಬಮ್", + "setCoverDialogCustom": "ಇಚ್ಛಾನುಸಾರ", + "hideFilterConfirmationDialogMessage": "ಹೊಂದಿಕೆಯ ಚಿತ್ರಗಳನ್ನು ಮತ್ತು ವೀಡಿಯೊಗಳನ್ನು ನಿಮ್ಮ ಸಂಗ್ರಹದಿಂದ ಮರೆಮಾಡಲಾಗುತ್ತದೆ. “ಗೌಪ್ಯತೆ” ಸಂಯೋಜನೆಗಳಿಂದ ನೀವು ಅವುಗಳನ್ನು ಮತ್ತೆ ತೋರಿಸಬಹುದು.\n\nನೀವು ಅವುಗಳನ್ನು ಮರೆಮಾಡಲು ಬಯಸುತ್ತೀರಾ?", + "editEntryDateDialogSourceFileModifiedDate": "ಕಡತ ಮಾರ್ಪಡಿಸಿದ ದಿನಾಂಕ", + "editEntryLocationDialogImportGpx": "ಜಿಪಿಎಕ್ಸ್ ಆಮದು ಮಾಡಿ", + "editEntryDateDialogShift": "ಸ್ಥಳಾಂತರಿಸು", + "durationDialogMinutes": "ನಿಮಿಷಗಳು", + "durationDialogSeconds": "ಕ್ಷಣಗಳು", + "editEntryLocationDialogTitle": "ಸ್ಥಳ", + "editEntryLocationDialogLatitude": "ಅಕ್ಷಾಂಶ", + "editEntryLocationDialogSetCustom": "ನಿಗದಿತ ಸ್ಥಳವನ್ನು ಹೊಂದಿಸಿ", + "editEntryLocationDialogChooseOnMap": "ನಕ್ಷೆಯಲ್ಲಿ ಆರಿಸಿ", + "durationDialogHours": "ಘಂಟೆಗಳು", + "editEntryLocationDialogLongitude": "ರೇಖಾಂಶ", + "albumDownload": "ಇಳಿಸು", + "menuActionSlideshow": "ಸ್ಲೈಡ್ ಶೋ", + "newFilterBanner": "ಹೊಸ", + "statePageTitle": "ರಾಜ್ಯಗಳು", + "settingsCollectionSelectionQuickActionEditorBanner": "ಗುಂಡಿಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಮತ್ತು ವಸ್ತುಗಳನ್ನು ತಡಕಾಡುವಾಗ ಯಾವ ಕ್ರಿಯೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಬೇಕು ಎಂಬುದನ್ನು ಆರಿಸಿಕೊಳ್ಳಿ.", + "settingsThumbnailShowMotionPhotoIcon": "ಚಲನಾ ಚಿತ್ರದ ಚಿನ್ಹೆಯನ್ನು ತೋರಿಸಿ", + "settingsThumbnailShowVideoDuration": "ವಿಡಿಯೋ ಕಾಲಾವಧಿಯನ್ನು ತೋರಿಸಿ", + "settingsVideoPageTitle": "ವಿಡಿಯೋ ಸಂಯೋಜನೆಗಳು", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "ಲಭ್ಯವಿರುವ ಗುಂಡಿಗಳು", + "settingsSlideshowFillScreen": "ಪೂರ್ಣ ಪರದೆ", + "settingsVideoBackgroundModeDialogTitle": "ಹಿನ್ನೆಲೆ ಕ್ರಮ", + "settingsVideoButtonsTile": "ಒತ್ತುಗುಂಡಿಗಳು", + "settingsVideoPlaybackPageTitle": "ಪ್ಲೇಬ್ಯಾಕ್", + "settingsVideoControlsPageTitle": "ನಿಯಂತ್ರಣಗಳು", + "settingsVideoGestureSideDoubleTapSeek": "ಮುಂದೆ/ಹಿಂದೆ ಚಲಿಸಲು ಪರದೆಯ ಅಂಚಿನಲ್ಲಿ ಮಾಡಲು ದ್ವಿಗುಣ ತಟ್ಟಿ", + "viewerInfoOpenLinkText": "ತೆರೆಯಿರಿ", + "aboutTranslatorsSectionTitle": "ಅನುವಾದಕರು", + "tileLayoutList": "ಪಟ್ಟಿ", + "aboutLicensesBanner": "ಈ ಅಪ್ಲಿಕೇಶನ್ ಈ ಕೆಳಗಿನ ಮುಕ್ತ-ಮೂಲ ಪೊಟ್ಟಣಗಳು ಮತ್ತು ಭಂಡಾರಗಳನ್ನು ಬಳಸುತ್ತದೆ.", + "aboutPageTitle": "ಕುರಿತು", + "filterMimeVideoLabel": "ವಿಡಿಯೋ", + "collectionSelectPageTitle": "ವಸ್ತುಗಳನ್ನು ಆರಿಸಿ", + "dateYesterday": "ನಿನ್ನೆ", + "collectionEditFailureFeedback": "{count, plural, =1{1 ವಸ್ತುವನ್ನು ಸಂಪಾದಿಸಲು ವಿಫಲವಾಗಿದೆ} other{{count} ವಸ್ತುಗಳನ್ನು ಸಂಪಾದಿಸಲು ವಿಫಲವಾಗಿದೆ}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "settingsCoordinateFormatDialogTitle": "ನಿರ್ದೇಶಾಂಕ ಸ್ವರೂಪ", + "collectionRenameSuccessFeedback": "{count, plural, =1{1 ವಸ್ತುವನ್ನು ಮರುಹೆಸರಿಸಲಾಗಿದೆ} other{{count} ವಸ್ತುಗಳನ್ನು ಮರುಹೆಸರಿಸಲಾಗಿದೆ}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "drawerCollectionMotionPhotos": "ಚಲಿಸುವ ಚಿತ್ರಗಳು", + "drawerPlacePage": "ಸ್ಥಳಗಳು", + "settingsSubtitleThemeShowOutline": "ಬಾಹ್ಯರೇಖೆ ಮತ್ತು ನೆರಳನ್ನು ತೋರಿಸಿ", + "collectionCopySuccessFeedback": "{count, plural, =1{1 ವಸ್ತುವನ್ನು ನಕಲಿಸಲಾಗಿದೆ} other{{count} ವಸ್ತುಗಳನ್ನು ನಕಲಿಸಲಾಗಿದೆ}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "albumCamera": "ಕ್ಯಾಮೆರಾ", + "tagEditorDiscardDialogMessage": "ನೀವು ಬದಲಾವಣೆಗಳನ್ನು ತ್ಯಜಿಸಲು ಬಯಸುವಿರಾ?", + "settingsDisplayUseTvInterface": "ಆಂಡ್ರಾಯ್ಡ್ ಟಿವಿ ಇಂಟರ್ಫೇಸ್", + "sortOrderOldestFirst": "ಹಳೆಯದು ಮೊದಲು", + "settingsDisabled": "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ", + "settingsKeepScreenOnDialogTitle": "ಪರದೆಯನ್ನು ಚಾಲೂ ಇಡಿ", + "tagEditorSectionPlaceholders": "ಪ್ಲೇಸ್‌ಹೋಲ್ಡರ್‌ಗಳು", + "settingsNavigationDrawerBanner": "ಮೆನು ವಸ್ತುಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ಮತ್ತು ಮರುಕ್ರಮಗೊಳಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ.", + "collectionMoveFailureFeedback": "{count, plural, =1{1 ವಸ್ತುವನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ವಿಫಲವಾಗಿದೆ} other{{count} ವಸ್ತುಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ವಿಫಲವಾಗಿದೆ}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "settingsCollectionBrowsingQuickActionEditorBanner": "ಗುಂಡಿಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಮತ್ತು ವಸ್ತುಗಳನ್ನು ತಡಕಾಡುವಾಗ ಯಾವ ಕ್ರಿಯೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಬೇಕು ಎಂಬುದನ್ನು ಆರಿಸಿ.", + "settingsViewerQuickActionEditorBanner": "ಗುಂಡಿಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಮತ್ತು ವೀಕ್ಷಕದಲ್ಲಿ ಯಾವ ಕ್ರಿಯೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಬೇಕು ಎಂಬುದನ್ನು ಆರಿಸಿ.", + "settingsSubtitleThemeTextAlignmentLeft": "ಎಡ", + "wallpaperUseScrollEffect": "ಮುಖಪುಟದಲ್ಲಿ ಸುರುಳಿ ಪರಿಣಾಮವನ್ನು ಬಳಸಿ", + "panoramaEnableSensorControl": "ಸಂವೇದಕ ನಿಯಂತ್ರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ", + "settingsVideoGestureVerticalDragBrightnessVolume": "ಪ್ರಕಾಶ/ಶಬ್ದಪ್ರಮಾಣ ಹೊಂದಿಸಲು ಮೇಲಕ್ಕೆ ಅಥವಾ ಕೆಳಕ್ಕೆ ಜಾರಿಸಿ", + "settingsAllowErrorReporting": "ಅನಾಮಧೇಯ ದೋಷ ವರದಿಯನ್ನು ಅನುಮತಿಸಿ", + "videoStreamSelectionDialogText": "ಅಡಿಬರಹ", + "drawerCollectionAnimated": "ಅನಿಮೇಟೆಡ್", + "sortByDuration": "ಅವಧಿಯಂತೆ", + "settingsActionImportDialogTitle": "ಆಮದು", + "setHomeCustom": "ಇಚ್ಛಾನುಸಾರ", + "settingsConfirmationVaultDataLoss": "ನೆಲಮಾಳಿಗೆಯ ದತ್ತಾಂಶ ನಷ್ಟವಾಗುವುದನ್ನು ಎಚ್ಚರಿಸಿ", + "settingsConfirmationAfterMoveToBinItems": "ವಸ್ತುಗಳನ್ನು ಮರುಬಳಕೆ ತೊಟ್ಟಿಗೆ ಸ್ಥಳಾಂತರಿಸಿದ ನಂತರ ಸಂದೇಶವನ್ನು ತೋರಿಸಿ", + "settingsNavigationDrawerTabTypes": "ಪ್ರಕಾರಗಳು", + "settingsThumbnailOverlayTile": "ಮೇಲ್ಪದರ", + "settingsAllowMediaManagement": "ಮಾಧ್ಯಮ ನಿರ್ವಹಣೆಯನ್ನು ಅನುಮತಿಸಿ", + "settingsWidgetShowOutline": "ರೂಪರೇಖೆ", + "viewerOpenPanoramaButtonLabel": "ಪನೋರಮಾ ತೆರೆಯಿರಿ", + "tagPlaceholderPlace": "ಸ್ಥಳ", + "editEntryLocationDialogTimeShift": "ಸಮಯ ಸ್ಥಳಾಂತರ", + "collectionActionHideTitleSearch": "ಶೀರ್ಷಿಕೆ ಸೋಸುಕ ಅಡಗಿಸಿ", + "collectionActionMove": "ಆಲ್ಬಮ್‌ಗೆ ಸರಿಸಿ", + "collectionRenameFailureFeedback": "{count, plural, =1{1 ವಸ್ತುವನ್ನು ಮರುಹೆಸರಿಸಲು ವಿಫಲವಾಗಿದೆ} other{{count} ವಸ್ತುಗಳನ್ನು ಮರುಹೆಸರಿಸಲು ವಿಫಲವಾಗಿದೆ}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEmptyVideos": "ವೀಡಿಯೊಗಳಿಲ್ಲ", + "collectionEmptyFavourites": "ಮೆಚ್ಚಿನವುಗಳಿಲ್ಲ", + "drawerSettingsButton": "ಸಂಯೋಜನೆಗಳು", + "drawerCountryPage": "ದೇಶಗಳು", + "sortOrderNewestFirst": "ಹೊಸದು ಮೊದಲು", + "sortOrderHighestFirst": "ಹೆಚ್ಚಿನದು ಮೊದಲು", + "albumGroupType": "ಪ್ರಕಾರದಂತೆ", + "settingsVideoResumptionModeTile": "ಮುಂದುವರೆಸು", + "settingsViewerSlideshowPageTitle": "ಜಾರುಫಲಕ", + "statsTopStatesSectionTitle": "ಅಗ್ರ ರಾಜ್ಯಗಳು", + "viewerSetWallpaperButtonLabel": "ಭಿತ್ತಿಚಿತ್ರ ಹೊಂದಿಸಿ", + "viewerInfoUnknown": "ಅಜ್ಞಾತ", + "viewerInfoLabelDate": "ದಿನಾಂಕ", + "viewerInfoLabelDescription": "ವಿವರಣೆ", + "settingsWidgetOpenPage": "ವಿಜೆಟ್ ಮೇಲೆ ಸ್ಪರ್ಶಿಸುವಾಗ", + "viewerInfoLabelDuration": "ಅವಧಿ", + "viewerInfoLabelCoordinates": "ನಿರ್ದೇಶಾಂಕ", + "videoStreamSelectionDialogAudio": "ಆಡಿಯೋ", + "selectStorageVolumeDialogTitle": "ಸಂಗ್ರಹಣೆ ಆಯ್ಕೆ ಮಾಡಿ", + "settingsUnitSystemTile": "ಏಕಮಾನಗಳು", + "editEntryRatingDialogTitle": "ರೇಟಿಂಗ್", + "removeEntryMetadataDialogTitle": "ಮೆಟಾಡೇಟಾ ತೆಗೆಯುವಿಕೆ", + "genericSuccessFeedback": "ಮುಗಿದಿದೆ!", + "appPickDialogTitle": "ಅಪ್ಲಿಕೇಶನ್ ಆರಿಸಿ", + "menuActionSelectAll": "ಎಲ್ಲವನ್ನು ಆರಿಸು", + "menuActionSelectNone": "ಏನನ್ನು ಆರಿಸಬೇಡಿ", + "viewDialogLayoutSectionTitle": "ವಿನ್ಯಾಸ", + "castDialogTitle": "ಬಿತ್ತರಿಸುವ ಸಾಧನಗಳು", + "coverDialogTabApp": "ಅಪ್ಲಿಕೇಶನ್", + "coverDialogTabColor": "ವರ್ಣ", + "aboutLinkLicense": "ಪರವಾನಗಿ", + "aboutDataUsageMisc": "ನಾನಾ ರೀತಿಯ", + "aboutCreditsSectionTitle": "ಮನ್ನಣೆಗಳು", + "settingsNavigationSectionTitle": "ಸಂಚಾರ", + "settingsThumbnailShowRating": "ದರವನ್ನು ತೋರಿಸಿ", + "settingsSubtitleThemeTextAlignmentCenter": "ಮಧ್ಯ", + "settingsLanguageTile": "ಭಾಷೆ", + "statsTopTagsSectionTitle": "ಅಗ್ರ ಟ್ಯಾಗುಗಳು", + "tagEditorSectionRecent": "ಇತ್ತೀಚಿನವು", + "aboutLinkPolicy": "ಗೌಪ್ಯತೆ ನೀತಿ", + "aboutBugReportButton": "ವರದಿ", + "aboutDataUsageSectionTitle": "ದತ್ತಾಂಶ ಬಳಕೆ", + "dateToday": "ಇಂದು", + "drawerAboutButton": "ಕುರಿತು", + "drawerCollectionImages": "ಚಿತ್ರಗಳು", + "drawerCollectionVideos": "ವೀಡಿಯೊಗಳು", + "drawerCollectionPanoramas": "ಪನೋರಮಾಗಳು", + "drawerCollectionRaws": "Raw ಚಿತ್ರಗಳು", + "drawerCollectionSphericalVideos": "360° ವಿಡಿಯೋಗಳು", + "drawerAlbumPage": "ಆಲ್ಬಮ್ ಗಳು", + "sortByDate": "ದಿನಾಂಕದಂತೆ", + "sortOrderAtoZ": "ವರ್ಣಮಾಲೆಯಂತೆ (A to Z)", + "albumEmpty": "ಆಲ್ಬಮ್‌ಗಳಿಲ್ಲ", + "stateEmpty": "ರಾಜ್ಯಗಳಿಲ್ಲ", + "tagEmpty": "ಟ್ಯಾಗುಗಳಿಲ್ಲ", + "searchDateSectionTitle": "ದಿನಾಂಕ", + "searchAlbumsSectionTitle": "ಆಲ್ಬಮ್ ಗಳು", + "searchCountriesSectionTitle": "ದೇಶಗಳು", + "searchPlacesSectionTitle": "ಸ್ಥಳಗಳು", + "searchStatesSectionTitle": "ರಾಜ್ಯಗಳು", + "searchTagsSectionTitle": "ಟ್ಯಾಗುಗಳು", + "searchRatingSectionTitle": "ದರಗಳು", + "settingsPageTitle": "ಸಂಯೋಜನೆಗಳು", + "settingsActionExportDialogTitle": "ರಫ್ತು", + "settingsNavigationDrawerTabPages": "ಪುಟಗಳು", + "settingsViewerShowHistogram": "ಹಿಸ್ಟೋಗ್ರಾಮ್ ತೋರಿಸಿ", + "settingsViewerShowMinimap": "ಚಿಕ್ಕನಕ್ಷೆಯನ್ನು ತೋರಿಸಿ", + "settingsViewerEnableOverlayBlurEffect": "ಮಸುಕು ಪರಿಣಾಮ", + "settingsVideoSectionTitle": "ವಿಡಿಯೋ", + "settingsEnableBinSubtitle": "ಅಳಿಸಿದ ವಸ್ತುಗಳನ್ನು 30 ದಿನಗಳವರೆಗೆ ಇರಿಸಿ", + "settingsRemoveAnimationsTile": "ಅನಿಮೇಷನ್‌ಗಳನ್ನು ತೆಗೆದುಹಾಕಿ", + "settingsDisplaySectionTitle": "ಪ್ರದರ್ಶಕ", + "settingsCollectionTile": "ಸಂಗ್ರಹ", + "viewerInfoLabelResolution": "ಅಳತೆ", + "mapStyleDialogTitle": "ನಕ್ಷೆಯ ಪ್ರಕಾರ", + "mapZoomOutTooltip": "ಕುಗ್ಗಿಸು", + "sortByAlbumFileName": "ಆಲ್ಬಮ್ ಮತ್ತು ಕಡತದ ಹೆಸರಿನಂತೆ", + "panoramaDisableSensorControl": "ಸಂವೇದಕ ನಿಯಂತ್ರಣವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ", + "filterTypeAnimatedLabel": "ಆನಿಮೇಟೆಡ್", + "filterTypeMotionPhotoLabel": "ಚಲಿಸುವ ಚಿತ್ರ", + "filterTypePanoramaLabel": "ಪನೋರಮಾ", + "filterTypeRawLabel": "Raw", + "filterTypeSphericalVideoLabel": "360° ವಿಡಿಯೋ", + "filterTypeGeotiffLabel": "GeoTIFF", + "filterMimeImageLabel": "ಚಿತ್ರ", + "accessibilityAnimationsRemove": "ಪರದೆಯ ಪರಿಣಾಮಗಳನ್ನು ತಡೆಯಿರಿ", + "accessibilityAnimationsKeep": "ಪರದೆಯ ಪರಿಣಾಮಗಳನ್ನು ಇರಿಸಿ", + "albumTierNew": "ಹೊಸ", + "albumTierPinned": "ಚುಚ್ಚಿರುವುದು", + "albumTierApps": "ಅಪ್ಲಿಕೇಶನ್‌ಗಳು", + "aboutBugCopyInfoButton": "ನಕಲಿಸಿ", + "aboutBugSaveLogInstruction": "ಅಪ್ಲಿಕೇಶನ್ ದಾಖಲೆಗಳನ್ನು ಕಡತಕ್ಕೆ ಉಳಿಸಿ", + "aboutLicensesFlutterPluginsSectionTitle": "ಫ್ಲಟರ್ ಪ್ಲಗಿನ್‌ಗಳು", + "aboutLicensesFlutterPackagesSectionTitle": "ಫ್ಲಟರ್ ಪ್ಯಾಕೇಜುಗಳು", + "collectionPageTitle": "ಸಂಗ್ರಹ", + "collectionPickPageTitle": "ಆರಿಸಿ", + "collectionExportFailureFeedback": "{count, plural, =1{1 ಪುಟವನ್ನು ರಫ್ತು ಮಾಡಲು ವಿಫಲವಾಗಿದೆ} other{{count} ಪುಟಗಳನ್ನು ರಫ್ತು ಮಾಡಲು ವಿಫಲವಾಗಿದೆ}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "sortOrderLongestFirst": "ಉದ್ದದ್ದು ಮೊದಲು", + "placePageTitle": "ಸ್ಥಳಗಳು", + "placeEmpty": "ಸ್ಥಳಗಳಿಲ್ಲ", + "searchRecentSectionTitle": "ಇತ್ತೀಚಿನವು", + "settingsNavigationDrawerTile": "ನ್ಯಾವಿಗೇಷನ್ ಮೆನು", + "settingsViewerUseCutout": "ಕಟೌಟ್ ಪ್ರದೇಶವನ್ನು ಬಳಸಿರಿ", + "statsWithGps": "{count, plural, =1{ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು 1 ವಸ್ತು ಹೊಂದಿದೆ } other{ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು {count} ವಸ್ತುಗಳು ಹೊಂದಿವೆ}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "mapAttributionOsmData": "ನಕ್ಷೆಯ ದತ್ತಾಂಶ © [OpenStreetMap](https://www.openstreetmap.org/copyright) ಕೊಡುಗೆದಾರರು", + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | ಬಿಲ್ಲೆಗಳನ್ನು ಒದಗಿಸಿದವರು [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "viewerInfoSearchSuggestionDescription": "ವಿವರಣೆ", + "viewerInfoSearchSuggestionDimensions": "ಆಯಾಮ", + "viewerInfoSearchSuggestionRights": "ಹಕ್ಕುಗಳು", + "collectionEmptyGrantAccessButtonLabel": "ಪ್ರವೇಶವನ್ನು ನೀಡಿ", + "sortByItemCount": "ವಸ್ತುಗಳ ಎಣಿಕೆಯಂತೆ", + "sortByName": "ಹೆಸರಿನಂತೆ", + "albumVideoCaptures": "ವಿಡಿಯೋ ಕೈಸೆರೆಗಳು", + "settingsCollectionQuickActionsTile": "ತ್ವರಿತ ಕ್ರಮಗಳು", + "viewerInfoSearchEmpty": "ಹೊಂದಾಣಿಕೆಯ ಕೀಲಿಗಳಿಲ್ಲ", + "locationPickerUseThisLocationButton": "ಈ ಸ್ಥಳವನ್ನು ಬಳಸಿ", + "removeEntryMetadataDialogMore": "ಇನ್ನಷ್ಟು", + "videoStreamSelectionDialogVideo": "ವಿಡಿಯೋ", + "videoStreamSelectionDialogOff": "ನಂದಿಸು", + "videoStreamSelectionDialogTrack": "ಜಾಡು", + "videoStreamSelectionDialogNoSelection": "ಬೇರೆ ಯಾವುದೇ ಹಾಡುಗಳಿಲ್ಲ.", + "genericFailureFeedback": "ವಿಫಲವಾಗಿದೆ", + "genericDangerWarningDialogMessage": "ನೀವು ಖಚಿತಪಡಿಸುವಿರೇ?", + "tooManyItemsErrorDialogMessage": "ಕಡಿಮೆ ವಸ್ತುಗಳೊಂದಿಗೆ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.", + "menuActionConfigureView": "ನೋಟ", + "menuActionSelect": "ಆರಿಸು", + "aboutDataUsageCache": "ತಾತ್ಕಾಲಿಕ ಸಂಗ್ರಹ", + "aboutCreditsWorldAtlas1": "ಈ ಅಪ್ಲಿಕೇಶನ್ TopoJSON ಕಡತವನ್ನು ಇವರಿಂದ ಬಳಸುತ್ತದೆ", + "appPickDialogNone": "ಏನಿಲ್ಲ", + "aboutBugSectionTitle": "ದೋಷದ ವರದಿ", + "aboutDataUsageData": "ದತ್ತಾಂಶ", + "aboutLicensesSectionTitle": "ಮುಕ್ತ-ಮೂಲ ಪರವಾನಗಿಗಳು", + "aboutLicensesAndroidLibrariesSectionTitle": "ಆಂಡ್ರಾಯ್ಡ್ ಭಂಡಾರಗಳು", + "aboutLicensesDartPackagesSectionTitle": "ಡಾರ್ಟ್ ಪ್ಯಾಕೇಜುಗಳು", + "aboutLicensesShowAllButtonLabel": "ಎಲ್ಲಾ ಪರವಾನಗಿಗಳನ್ನು ತೋರಿಸಿ", + "policyPageTitle": "ಗೌಪ್ಯತೆ ನೀತಿ", + "collectionActionShowTitleSearch": "ಶೀರ್ಷಿಕೆ ಸೋಸುಕ ತೋರಿಸಿ", + "collectionActionAddShortcut": "ಶಾರ್ಟ್‌ಕಟ್ ಸೇರಿಸಿ", + "collectionActionEmptyBin": "ತೊಟ್ಟಿಯನ್ನು ಖಾಲಿಮಾಡಿ", + "sortBySize": "ಗಾತ್ರದಂತೆ", + "sortByRating": "ದರದಂತೆ", + "albumGroupVolume": "ಸಂಗ್ರಹಣೆಯ ಗಾತ್ರದಂತೆ", + "searchCollectionFieldHint": "ಸಂಗ್ರಹದಲ್ಲಿ ಹುಡುಕಿ", + "countryPageTitle": "ದೇಶಗಳು", + "countryEmpty": "ದೇಶಗಳಿಲ್ಲ", + "settingsSearchFieldLabel": "ಸಂಯೋಜನೆಗಳಲ್ಲಿ ಹುಡುಕಿ", + "appExportDynamicAlbums": "ಡೈನಾಮಿಕ್ ಆಲ್ಬಮ್ ಗಳು", + "settingsSearchEmpty": "ಹೊಂದುವ ಸಂಯೋಜನೆಗಳಿಲ್ಲ", + "appExportSettings": "ಸಂಯೋಜನೆಗಳು", + "appExportCovers": "ರಕ್ಷಾಕವಚಗಳು", + "appExportFavourites": "ಮೆಚ್ಚಿನವುಗಳು", + "settingsHomeTile": "ಮುಖಪುಟ", + "settingsHomeDialogTitle": "ಮುಖಪುಟ", + "settingsKeepScreenOnTile": "ಪರದೆಯನ್ನು ಚಾಲೂ ಇಡಿ", + "settingsDoubleBackExit": "ನಿರ್ಗಮಿಸಲು “ಹಿಂದೆ” ಎರಡು ಬಾರಿ ತಟ್ಟಿ", + "settingsConfirmationTile": "ದೃಢೀಕರಣ ಸಂವಾದಗಳು", + "settingsConfirmationDialogTitle": "ದೃಢೀಕರಣ ಸಂವಾದಗಳು", + "settingsConfirmationBeforeMoveToBinItems": "ವಸ್ತುಗಳನ್ನು ಮರುಬಳಕೆ ತೊಟ್ಟಿಗೆ ಸ್ಥಳಾಂತರಿಸುವ ಮೊದಲು ವಿಚಾರಿಸಿ", + "settingsConfirmationBeforeMoveUndatedItems": "ದಿನಾಂಕವಿಲ್ಲದ ವಸ್ತುಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸುವ ಮೊದಲು ವಿಚಾರಿಸಿ", + "settingsNavigationDrawerTabAlbums": "ಆಲ್ಬಮ್ ಗಳು", + "settingsNavigationDrawerAddAlbum": "ಆಲ್ಬಮ್ ಸೇರಿಸಿ", + "settingsThumbnailOverlayPageTitle": "ಮೇಲ್ಪದರ", + "settingsThumbnailShowHdrIcon": "HDR ಸಂಕೇತ ತೋರಿಸಿ", + "settingsThumbnailShowFavouriteIcon": "ಮೆಚ್ಚಿನ ಸಂಕೇತ ತೋರಿಸಿ", + "settingsThumbnailShowLocationIcon": "ಸ್ಥಳದ ಚಿನ್ಹೆಯನ್ನು ತೋರಿಸಿ", + "settingsThumbnailShowRawIcon": "Raw ಚಿನ್ಹೆಯನ್ನು ತೋರಿಸಿ", + "settingsViewerGestureSideTapNext": "ಹಿಂದಿನ/ಮುಂದಿನ ವಸ್ತುವನ್ನು ತೋರಿಸಲು ಪರದೆಯ ಅಂಚಿನ ಮೇಲೆ ತಟ್ಟಿ", + "settingsMotionPhotoAutoPlay": "ಚಾಲನಾ ಚಿತ್ರಗಳ ಸ್ವಯಂಚಾಲನೆ", + "settingsViewerQuickActionEmpty": "ಗುಂಡಿಗಳಿಲ್ಲ", + "settingsViewerOverlayTile": "ಮೇಲ್ಪದರ", + "settingsViewerOverlayPageTitle": "ಮೇಲ್ಪದರ", + "settingsViewerShowOverlayOnOpening": "ಪ್ರಾರಂಭದಲ್ಲಿ ತೋರಿಸಿ", + "settingsViewerShowInformationSubtitle": "ಶೀರ್ಷಿಕೆ, ದಿನಾಂಕ, ಸ್ಥಳ ಇತ್ಯಾದಿಗಳನ್ನು ತೋರಿಸಿ.", + "settingsViewerShowShootingDetails": "ಸೆರೆಹಿಡಿದ ವಿವರಗಳನ್ನು ತೋರಿಸಿ", + "settingsViewerShowDescription": "ವಿವರಣೆಗಳನ್ನು ತೋರಿಸಿ", + "settingsViewerShowOverlayThumbnails": "ಅಡಕವನ್ನು ತೋರಿಸಿ", + "settingsSlideshowTransitionTile": "ಪರಿವರ್ತನೆ", + "settingsSlideshowRepeat": "ಪುನರಾವರ್ತನೆ", + "settingsSlideshowShuffle": "ಕಲಸು", + "settingsSlideshowAnimatedZoomEffect": "ಅನಿಮೇಟೆಡ್ ಹಿಗ್ಗಿಸಿದ ಪರಿಣಾಮ", + "settingsSlideshowIntervalTile": "ಮಧ್ಯಂತರ", + "settingsSlideshowVideoPlaybackTile": "ವಿಡಿಯೋ ಪ್ಲೇಬ್ಯಾಕ್", + "settingsSlideshowVideoPlaybackDialogTitle": "ವಿಡಿಯೋ ಪ್ಲೇಬ್ಯಾಕ್", + "settingsVideoEnableHardwareAcceleration": "ಯಂತ್ರಾಂಶ ವೇಗವರ್ಧನೆ", + "settingsVideoBackgroundMode": "ಹಿನ್ನೆಲೆ ಕ್ರಮ", + "settingsVideoResumptionModeDialogTitle": "ಮುಂದುವರೆಸು", + "settingsVideoControlsTile": "ನಿಯಂತ್ರಣಗಳು", + "settingsSubtitleThemeTextPositionDialogTitle": "ಪಠ್ಯ ಸ್ಥಾನ", + "settingsVideoGestureDoubleTapTogglePlay": "ಚಾಲನೆ/ವಿರಾಮ ಮಾಡಲು ದ್ವಿಗುಣ ತಟ್ಟಿ", + "settingsSubtitleThemeTextAlignmentDialogTitle": "ಪಠ್ಯ ಜೋಡಣೆ", + "settingsSubtitleThemeTextAlignmentRight": "ಬಲ", + "settingsAllowInstalledAppAccess": "ಅಪ್ಲಿಕೇಶನ್ ಯಾದಿಗೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಿ", + "settingsAllowInstalledAppAccessSubtitle": "ಆಲ್ಬಮ್ ಪ್ರದರ್ಶನವನ್ನು ಸುಧಾರಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ", + "settingsSaveSearchHistory": "ಹುಡುಕಾಟದ ಇತಿಹಾಸವನ್ನು ಉಳಿಸಿ", + "settingsEnableBin": "ಮರುಬಳಕೆಯ ತೊಟ್ಟಿಯನ್ನು ಬಳಸಿ", + "settingsRemoveAnimationsDialogTitle": "ಅನಿಮೇಷನ್‌ಗಳನ್ನು ತೆಗೆಯಿರಿ", + "settingsTimeToTakeActionTile": "ಕ್ರಮ ತೆಗೆದುಕೊಳ್ಳಲು ಸಮಯ", + "settingsAccessibilityShowPinchGestureAlternatives": "ಬಹುಸ್ಪರ್ಶ ಗೆಸ್ಚರ್ ಪರ್ಯಾಯಗಳನ್ನು ತೋರಿಸಿ", + "settingsThemeBrightnessTile": "ಅಲಂಕಾರ", + "settingsThemeBrightnessDialogTitle": "ಅಲಂಕಾರ", + "settingsThemeColorHighlights": "ಬಣ್ಣದ ಮುಖ್ಯಾಂಶಗಳು", + "settingsHiddenItemsTile": "ಮರೆಮಾಡಿದ ವಸ್ತುಗಳು", + "settingsDisplayRefreshRateModeDialogTitle": "ರಿಫ್ರೆಶ್ ದರ", + "settingsLanguageSectionTitle": "ಭಾಷೆ ಮತ್ತು ಸ್ವರೂಪಗಳು", + "settingsLanguagePageTitle": "ಭಾಷೆ", + "settingsCoordinateFormatTile": "ನಿರ್ದೇಶಾಂಕ ಸ್ವರೂಪ", + "settingsUnitSystemDialogTitle": "ಏಕಮಾನಗಳು", + "settingsForceWesternArabicNumeralsTile": "ಅರೇಬಿಕ್ ಅಂಕಿಗಳನ್ನು ಒತ್ತಾಯಿಸಿ", + "statsTopAlbumsSectionTitle": "ಅಗ್ರ ಆಲ್ಬಮ್ ಗಳು", + "viewerErrorUnknown": "ಅಯ್ಯೋ!", + "viewerInfoLabelOwner": "ಒಡೆಯ", + "settingsWidgetDisplayedItem": "ಪ್ರದರ್ಶಿಸಲಾದ ವಸ್ತು", + "statsTopCountriesSectionTitle": "ಅಗ್ರ ದೇಶಗಳು", + "viewerInfoPageTitle": "ವಿವರ", + "viewerInfoBackToViewerTooltip": "ವೀಕ್ಷಕಕ್ಕೆ ಹಿಂದಿರುಗಿ", + "mapStyleTooltip": "ನಕ್ಷೆಯ ಶೈಲಿಯನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "mapZoomInTooltip": "ಹಿಗ್ಗಿಸು", + "mapAttributionStamen": "ಬಿಲ್ಲೆಗಳನ್ನು ಒದಗಿಸಿದವರು [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "openMapPageTooltip": "ನಕ್ಷೆ ಪುಟದಲ್ಲಿ ವೀಕ್ಷಿಸಿ", + "viewerInfoViewXmlLinkText": "XML ನೋಡಿ", + "viewerInfoSearchSuggestionDate": "ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", + "tagEditorPageAddTagTooltip": "ಟ್ಯಾಗು ಸೇರಿಸಿ", + "sourceViewerPageTitle": "ಮೂಲ", + "albumTierSpecial": "ಸಾಮಾನ್ಯ", + "collectionActionAddDynamicAlbum": "ಡೈನಾಮಿಕ್ ಆಲ್ಬಮ್ ಸೇರಿಸಿ", + "sectionUnknown": "ಅಜ್ಞಾತ", + "collectionSelectSectionTooltip": "ವಿಭಾಗವನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "drawerTagPage": "ಟ್ಯಾಗುಗಳು", + "settingsDefault": "ಡೀಫಾಲ್ಟ್", + "settingsActionExport": "ರಫ್ತು", + "settingsActionImport": "ಆಮದು", + "settingsDisplayRefreshRateModeTile": "ರಿಫ್ರೆಶ್ ದರವನ್ನು ಪ್ರದರ್ಶಿಸಿ", + "tagEditorPageNewTagFieldLabel": "ಹೊಸ ಟ್ಯಾಗು", + "tagEditorPageTitle": "Tagಗಳನ್ನು ತಿದ್ದಿ", + "removeEntryMetadataDialogAll": "ಎಲ್ಲವೂ", + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "ಚಲನೆಯ ಚಿತ್ರದ ಒಳಗೆ ವೀಡಿಯೊವನ್ನು ಚಾಲನೆ ಮಾಡಲು XMP ಅಗತ್ಯವಿದೆ.\n\nನೀವು ಅದನ್ನು ತೆಗೆದುಹಾಕಲು ಬಯಸುತ್ತೀರಾ?", + "videoSpeedDialogLabel": "ಚಾಲನೆಯ ವೇಗ", + "aboutBugReportInstruction": "ದಾಖಲೆಗಳು ಮತ್ತು ಸಾಧನದ ಮಾಹಿತಿಯ ಜೊತೆಗೆ Githubನಲ್ಲಿ ವರದಿ ಮಾಡಿ", + "aboutDataUsageDatabase": "ದತ್ತಾಂಶ ಸಂಚಯ", + "collectionActionEdit": "ಸಂಪಾದಿಸು", + "dateThisMonth": "ಈ ತಿಂಗಳು", + "createAlbumButtonLabel": "ರಚಿಸು", + "collectionDeleteFailureFeedback": "{count, plural, =1{1 ವಸ್ತುವನ್ನು ಅಳಿಸಲು ವಿಫಲವಾಗಿದೆ} other{{count} ವಸ್ತುಗಳನ್ನು ಅಳಿಸಲು ವಿಫಲವಾಗಿದೆ}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionCopyFailureFeedback": "{count, plural, =1{1 ವಸ್ತುವನ್ನು ನಕಲಿಸಲು ವಿಫಲವಾಗಿದೆ} other{{count} ವಸ್ತುಗಳನ್ನು ನಕಲಿಸಲು ವಿಫಲವಾಗಿದೆ}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "sortOrderLowestFirst": "ಕಡಿಮೆಯದು ಮೊದಲು", + "albumMimeTypeMixed": "ಮಿಶ್ರಿತ", + "albumPickPageTitlePick": "ಆಲ್ಬಮ್ ಆಯ್ಕೆಮಾಡಿ", + "tagPageTitle": "ಟ್ಯಾಗುಗಳು", + "binPageTitle": "ಮರುಬಳಕೆ ತೊಟ್ಟಿ", + "explorerPageTitle": "ಪರಿಶೋಧಕ", + "explorerActionSelectStorageVolume": "ಸಂಗ್ರಹಣೆ ಆಯ್ಕೆ ಮಾಡಿ", + "searchMetadataSectionTitle": "ಮೆಟಾಡೇಟಾ", + "settingsCollectionQuickActionEditorPageTitle": "ತ್ವರಿತ ಕ್ರಮಗಳು", + "settingsCollectionQuickActionTabBrowsing": "ತಡಕಾಟ", + "settingsViewerSectionTitle": "ವೀಕ್ಷಕ", + "settingsImageBackground": "ಚಿತ್ರದ ಹಿನ್ನೆಲೆ", + "settingsViewerShowInformation": "ಮಾಹಿತಿಯನ್ನು ತೋರಿಸಿ", + "settingsViewerShowRatingTags": "ದರಗಳು ಮತ್ತು ಟ್ಯಾಗುಗಳನ್ನು ತೋರಿಸಿ", + "settingsViewerSlideshowTile": "ಜಾರುಫಲಕ", + "settingsVideoShowVideos": "ವಿಡಿಯೋಗಳನ್ನು ತೋರಿಸಿ", + "settingsVideoPlaybackTile": "ಪ್ಲೇಬ್ಯಾಕ್", + "settingsVideoLoopModeTile": "ಆವರ್ತನ ಕ್ರಮ", + "settingsVideoLoopModeDialogTitle": "ಆವರ್ತನ ಕ್ರಮ", + "settingsSystemDefault": "ಸಿಸ್ಟಮ್ ಡೀಫಾಲ್ಟ್", + "settingsAskEverytime": "ಪ್ರತಿಬಾರಿಯೂ ಕೇಳಿ", + "settingsModificationWarningDialogMessage": "ಇತರ ಸಂಯೋಜನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲಾಗುತ್ತದೆ.", + "settingsConfirmationBeforeDeleteItems": "ವಸ್ತುಗಳನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸುವ ಮೊದಲು ವಿಚಾರಿಸಿ", + "settingsSubtitleThemePageTitle": "ಅಡಿಬರಹ", + "settingsSubtitleThemeSample": "ಇದು ಒಂದು ನಮೂನೆ.", + "settingsSubtitleThemeTextAlignmentTile": "ಪಠ್ಯ ಜೋಡಣೆ", + "settingsSubtitleThemeTextPositionTile": "ಪಠ್ಯ ಸ್ಥಾನ", + "settingsPrivacySectionTitle": "ಗೌಪ್ಯತೆ", + "viewerInfoLabelUri": "ಯು ಆರ್ ಐ", + "viewerInfoLabelPath": "ಹಾದಿ", + "viewerInfoLabelAddress": "ವಿಳಾಸ", + "mapPointNorthUpTooltip": "ಉತ್ತರದಿಕ್ಕನ್ನು ಮೇಲ್ಮುಖವಾಗಿ ಸೂಚಿಸು", + "mapAttributionOsmLiberty": "ಬಿಲ್ಲೆಗಳನ್ನು ಒದಗಿಸಿದವರು [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • ಆಶ್ರಯದಾತರು [OSM Americana](https://tile.ourmap.us)", + "mapAttributionOsmHot": "ಬಿಲ್ಲೆಗಳನ್ನು ಒದಗಿಸಿದವರು [HOT](https://www.hotosm.org/) • ಆಶ್ರಯದಾತರು [OSM France](https://openstreetmap.fr/)", + "mapEmptyRegion": "ಈ ಪ್ರದೇಶದಲ್ಲಿ ಯಾವುದೇ ಚಿತ್ರಗಳಿಲ್ಲ", + "settingsStorageAccessBanner": "ಕೆಲವು ಕೋಶಗಳಿಗೆ ಕಡತಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸ್ಪಷ್ಟ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸುವ ಅಗತ್ಯವಿದೆ. ನೀವು ಈ ಹಿಂದೆ ಪ್ರವೇಶವನ್ನು ನೀಡಿದ ಕೋಶಗಳನ್ನು ನೀವು ಇಲ್ಲಿ ಪರಿಶೀಲಿಸಬಹುದು.", + "settingsStorageAccessEmpty": "ಪ್ರವೇಶ ಅನುಮತಿಸಿಲ್ಲ", + "settingsThemeEnableDynamicColor": "ಡೈನಾಮಿಕ್ ಬಣ್ಣ", + "viewerErrorDoesNotExist": "ಕಡತವು ಇನ್ಮುಂದೆ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ.", + "viewerInfoOpenEmbeddedFailureFeedback": "ಹುದುಗಿಸಿದ ದತ್ತಾಂಶವನ್ನು ಹೊರತೆಗೆಯಲು ವಿಫಲವಾಗಿದೆ", + "viewerInfoSearchFieldLabel": "ಹುದುಗಿಸಿದ ದತ್ತಾಂಶವನ್ನು ಹುಡುಕಿ", + "viewerInfoLabelSize": "ಪ್ರಮಾಣ", + "menuActionStats": "ಅಂಕಿಅಂಶಗಳು", + "menuActionMap": "ನಕ್ಷೆ", + "viewDialogSortSectionTitle": "ವಿಂಗಡಿಸಿ", + "viewDialogGroupSectionTitle": "ವಿಭಾಗಗಳು", + "aboutBugCopyInfoInstruction": "ಸಾಧನದ ಮಾಹಿತಿಯನ್ನು ನಕಲಿಸಿ", + "aboutDataUsageInternal": "ಆಂತರಿಕ", + "aboutDataUsageExternal": "ಬಾಹ್ಯ", + "aboutDataUsageClearCache": "ಕ್ಯಾಶೆ ಸಂಗ್ರಹ ಅಳಿಸಿ", + "aboutCreditsWorldAtlas2": "ISC ಪರವಾನಗಿ ಅಡಿಯಲ್ಲಿ.", + "collectionActionSetHome": "ಮುಖಪುಟವಾಗಿ ಹೊಂದಿಸಿ", + "collectionActionCopy": "ಆಲ್ಬಮ್‌ಗೆ ನಕಲಿಸಿ", + "collectionGroupMonth": "ತಿಂಗಳಿನಂತೆ", + "collectionActionRescan": "ಪುನಃ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ", + "collectionSearchTitlesHintText": "ಶೀರ್ಷಿಕೆಗಳನ್ನು ಹುಡುಕಿ", + "collectionGroupAlbum": "ಆಲ್ಬಮ್ ನಂತೆ", + "collectionGroupDay": "ದಿನದಂತೆ", + "collectionMoveSuccessFeedback": "{count, plural, =1{1 ವಸ್ತುವನ್ನು ಸ್ಥಳಾಂತರಿಸಲಾಗಿದೆ} other{{count} ವಸ್ತುಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಲಾಗಿದೆ}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEmptyImages": "ಚಿತ್ರಗಳಿಲ್ಲ", + "collectionEditSuccessFeedback": "{count, plural, =1{1 ವಸ್ತುವನ್ನು ಸಂಪಾದಿಸಲಾಗಿದೆ} other{{count} ವಸ್ತುಗಳನ್ನು ಸಂಪಾದಿಸಲಾಗಿದೆ}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionDeselectSectionTooltip": "ವಿಭಾಗ ಆಯ್ಕೆ ರದ್ದುಮಾಡಿ", + "drawerCollectionAll": "ಎಲ್ಲಾ ಸಂಗ್ರಹ", + "drawerCollectionFavourites": "ಮೆಚ್ಚಿನವುಗಳು", + "sortOrderLargestFirst": "ದೊಡ್ಡದು ಮೊದಲು", + "sortOrderSmallestFirst": "ಚಿಕ್ಕದು ಮೊದಲು", + "sortOrderShortestFirst": "ಗಿಡ್ಡದ್ದು ಮೊದಲು", + "albumGroupTier": "ಶ್ರೇಣಿಯಂತೆ", + "albumPickPageTitleCopy": "ಆಲ್ಬಮ್‌ಗೆ ನಕಲಿಸಿ", + "albumPickPageTitleExport": "ಆಲ್ಬಮ್‌ಗೆ ರಫ್ತು ಮಾಡಿ", + "albumScreenshots": "ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳು", + "albumPickPageTitleMove": "ಆಲ್ಬಮ್‌ಗೆ ಸ್ಥಳಾಂತರಿಸಿ", + "settingsThumbnailSectionTitle": "ಥಂಬ್‌ನೇಲ್‌ಗಳು", + "settingsNavigationDrawerEditorPageTitle": "ನ್ಯಾವಿಗೇಷನ್ ಮೆನು", + "settingsThumbnailShowTagIcon": "ಟ್ಯಾಗು ಸಂಕೇತ ತೋರಿಸಿ", + "settingsDisablingBinWarningDialogMessage": "ಮರುಬಳಕೆ ತೊಟ್ಟಿಯಲ್ಲಿರುವ ವಸ್ತುಗಳನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತಿದೆ.", + "settingsAccessibilitySectionTitle": "ಎಟುಕು", + "settingsSubtitleThemeTile": "ಅಡಿಬರಹ", + "settingsSubtitleThemeTextColor": "ಪಠ್ಯದ ಬಣ್ಣ", + "settingsSubtitleThemeBackgroundColor": "ಹಿನ್ನೆಲೆ ಬಣ್ಣ", + "settingsHiddenItemsPageTitle": "ಮರೆಮಾಡಿದ ವಸ್ತುಗಳು", + "tagPlaceholderCountry": "ದೇಶ", + "tagPlaceholderState": "ರಾಜ್ಯ", + "viewDialogReverseSortOrder": "ಹಿಮ್ಮುಖ ವಿಂಗಡಣೆ ಕ್ರಮ", + "tileLayoutMosaic": "ಮೊಸಾಯಿಕ್", + "coverDialogTabCover": "ರಕ್ಷಾಕವಚ", + "albumScreenRecordings": "ಪರದೆ ಮುದ್ರಿಕೆಗಳು", + "albumPageTitle": "ಆಲ್ಬಮ್ ಗಳು", + "settingsViewerQuickActionEditorPageTitle": "ತ್ವರಿತ ಕ್ರಮಗಳು", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "ಪ್ರದರ್ಶಿತ ಗುಂಡಿಗಳು", + "settingsVideoAutoPlay": "ಸ್ವಯಂ ಚಾಲನೆ", + "statsPageTitle": "ಅಂಕಿಅಂಶಗಳು", + "viewerInfoLabelTitle": "ಶೀರ್ಷಿಕೆ", + "statsTopPlacesSectionTitle": "ಅಗ್ರ ಸ್ಥಳಗಳು", + "sortOrderZtoA": "ವರ್ಣಮಾಲೆಯ ವಿರುದ್ಧವಾಗಿ (Z to A)", + "settingsCollectionQuickActionTabSelecting": "ಆರಿಸು", + "settingsCollectionBurstPatternsTile": "ಬರ್ಸ್ಟ್ ಪ್ರಕಾರಗಳು", + "settingsCollectionBurstPatternsNone": "ಏನಿಲ್ಲ", + "settingsViewerMaximumBrightness": "ಗರಿಷ್ಟ ಪ್ರಕಾಶಮಯ", + "settingsViewerQuickActionsTile": "ತ್ವರಿತ ಕ್ರಮಗಳು", + "settingsStorageAccessPageTitle": "ಸಂಗ್ರಹಣೆ ಪ್ರವೇಶಾಧಿಕಾರ", + "settingsHiddenFiltersEmpty": "ಮರೆಮಾಡಿದ ಫಿಲ್ಟರ್‌ಗಳಿಲ್ಲ", + "settingsStorageAccessTile": "ಸಂಗ್ರಹಣೆ ಪ್ರವೇಶಾಧಿಕಾರ", + "settingsWidgetPageTitle": "ಚಿತ್ರ ಚೌಕಟ್ಟು", + "viewerInfoSearchSuggestionResolution": "ಅಳತೆ", + "filterRecentlyAddedLabel": "ಇತ್ತೀಚಿಗೆ ಸೇರಿಸಿದ್ದು", + "filterRatingRejectedLabel": "ತಿರಸ್ಕರಿಸಿದ್ದು", + "tileLayoutGrid": "ಜಾಲ", + "settingsSubtitleThemeTextSize": "ಪಠ್ಯದ ಗಾತ್ರ", + "settingsSubtitleThemeTextOpacity": "ಪಠ್ಯದ ಪಾರದರ್ಶಕತೆ", + "settingsSubtitleThemeBackgroundOpacity": "ಹಿನ್ನೆಲೆ ಪಾರದರ್ಶಕತೆ", + "settingsStorageAccessRevokeTooltip": "ಹಿಂಪಡೆಯಿರಿ", + "settingsHiddenFiltersBanner": "ಮರೆಮಾಡಿದ ಫಿಲ್ಟರ್‌ಗಳಿಗೆ ಹೊಂದಿಕೆಯಾಗುವ ಚಿತ್ರಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳು ನಿಮ್ಮ ಸಂಗ್ರಹಣೆಯಲ್ಲಿ ಗೋಚರಿಸುವುದಿಲ್ಲ.", + "settingsScreenSaverPageTitle": "ಪರದೆ ರಕ್ಷಕ", + "createButtonLabel": "ರಚಿಸಿ", + "chipActionGroup": "ಗುಂಪನ್ನು ಬದಲಾಯಿಸಿ", + "chipActionCreateGroup": "ಗುಂಪನ್ನು ರಚಿಸಿ", + "albumTierGroups": "ಗುಂಪುಗಳು", + "newGroupDialogTitle": "ಹೊಸ ಗುಂಪು", + "newGroupDialogNameLabel": "ಗುಂಪಿನ ಹೆಸರು", + "groupAlreadyExists": "ಗುಂಪು ಈವಾಗಲೇ ಅಸ್ಥಿತ್ವದಲ್ಲಿದೆ", + "groupEmpty": "ಯಾವುದೇ ಗುಂಪುಗಳಿಲ್ಲ", + "ungrouped": "ಗುಂಪುಗಳಲ್ಲದವು", + "groupPickerTitle": "ಗುಂಪನ್ನು ಆರಿಸಿ", + "groupPickerUseThisGroupButton": "ಈ ಗುಂಪನ್ನು ಬಳಸಿ", + "sectionNone": "ವಿಭಾಗಗಳಿಲ್ಲ", + "sortByPath": "ಮಾರ್ಗದ ಮೂಲಕ", + "tagPickPageTitle": "ಟ್ಯಾಗ್ ಆರಿಸಿ", + "searchFormatSectionTitle": "ಸ್ವರೂಪಗಳು", + "settingsEnabled": "ಸಕ್ರಿಯವಾಗಿದೆ", + "settingsForced": "ಬಲವಂತವಾಗಿ", + "settingsNavigationBottomActionsTile": "ಕೆಳಗಿನ ನ್ಯಾವಿಗೇಷನ್", + "settingsNavigationBottomActionEditorPageTitle": "ಕೆಳಗಿನ ನ್ಯಾವಿಗೇಷನ್", + "settingsNavigationBottomActionEditorBanner": "ಗುಂಡಿಗಳನ್ನು ಸರಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಹಿಡಿದುಕೊಳ್ಳಿ ಮತ್ತು ಕೆಳಗಿನ ನ್ಯಾವಿಗೇಷನ್ ಪಟ್ಟಿಯಲ್ಲಿ ಯಾವ ಕ್ರಿಯೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಿ.", + "settingsViewerShowZoomLevel": "ಹಿಗ್ಗಿಸಿದ ಮಟ್ಟವನ್ನು ತೋರಿಸಿ", + "mapStyleDialogAddStyle": "ಶೈಲಿಯನ್ನು ಸೇರಿಸಿ", + "mapStyleEditorDialogName": "ಹೆಸರು", + "mapStyleEditorDialogUrl": "ಯು ಆರ್ ಎಲ್", + "mapStyleEditorDialogSubdomains": "ಉಪಡೊಮೇನ್‌ಗಳು", + "mapStyleEditorDialogUserAgent": "ಬಳಕೆದಾರ ಏಜೆಂಟ್" +} diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb new file mode 100644 index 0000000..539089f --- /dev/null +++ b/lib/l10n/app_ko.arb @@ -0,0 +1,733 @@ +{ + "appName": "아베스", + "welcomeMessage": "아베스 사용을 환영합니다", + "welcomeOptional": "선택", + "welcomeTermsToggle": "이용약관에 동의합니다", + "itemCount": "{count, plural, other{{count}개}}", + "timeSeconds": "{count, plural, other{{count}초}}", + "timeMinutes": "{count, plural, other{{count}분}}", + "timeDays": "{count, plural, other{{count}일}}", + "focalLength": "{length} mm", + "applyButtonLabel": "적용", + "deleteButtonLabel": "삭제", + "nextButtonLabel": "다음", + "showButtonLabel": "보기", + "hideButtonLabel": "숨기기", + "continueButtonLabel": "다음", + "cancelTooltip": "취소", + "changeTooltip": "변경", + "clearTooltip": "초기화", + "previousTooltip": "이전", + "nextTooltip": "다음", + "showTooltip": "보기", + "hideTooltip": "숨기기", + "actionRemove": "제거", + "resetTooltip": "복원", + "saveTooltip": "저장", + "pickTooltip": "선택", + "doubleBackExitMessage": "종료하려면 한번 더 누르세요.", + "doNotAskAgain": "다시 묻지 않기", + "sourceStateLoading": "로딩 중", + "sourceStateCataloguing": "분석 중", + "sourceStateLocatingCountries": "국가 찾는 중", + "sourceStateLocatingPlaces": "장소 찾는 중", + "chipActionDelete": "삭제", + "chipActionGoToAlbumPage": "앨범 페이지에서 보기", + "chipActionGoToCountryPage": "국가 페이지에서 보기", + "chipActionGoToTagPage": "태그 페이지에서 보기", + "chipActionFilterOut": "제외하기", + "chipActionFilterIn": "포함시키기", + "chipActionHide": "숨기기", + "chipActionPin": "고정", + "chipActionUnpin": "고정 해제", + "chipActionRename": "이름 변경", + "chipActionSetCover": "대표 이미지 변경", + "chipActionCreateAlbum": "앨범 만들기", + "entryActionCopyToClipboard": "클립보드에 복사", + "entryActionDelete": "삭제", + "entryActionConvert": "변환", + "entryActionExport": "내보내기", + "entryActionInfo": "상세정보", + "entryActionRename": "이름 변경", + "entryActionRestore": "복원", + "entryActionRotateCCW": "좌회전", + "entryActionRotateCW": "우회전", + "entryActionFlip": "좌우 뒤집기", + "entryActionPrint": "인쇄", + "entryActionShare": "공유", + "entryActionViewSource": "소스 코드 보기", + "entryActionShowGeoTiffOnMap": "지도에 겹쳐그리기", + "entryActionConvertMotionPhotoToStillImage": "스틸 사진으로 변환", + "entryActionViewMotionPhotoVideo": "동영상 보기", + "entryActionEdit": "편집", + "entryActionOpen": "다른 앱에서 열기", + "entryActionSetAs": "다음 용도로 사용", + "entryActionOpenMap": "지도 앱에서 보기", + "entryActionRotateScreen": "화면 회전", + "entryActionAddFavourite": "즐겨찾기에 추가", + "entryActionRemoveFavourite": "즐겨찾기에서 삭제", + "videoActionCaptureFrame": "프레임 캡처", + "videoActionMute": "음소거", + "videoActionUnmute": "음소거 해제", + "videoActionPause": "일시정지", + "videoActionPlay": "재생", + "videoActionReplay10": "10초 뒤로 탐색", + "videoActionSkip10": "10초 앞으로 탐색", + "videoActionSelectStreams": "트랙 선택", + "videoActionSetSpeed": "재생 배속", + "viewerActionSettings": "설정", + "slideshowActionResume": "이어서", + "slideshowActionShowInCollection": "미디어 페이지에서 보기", + "entryInfoActionEditDate": "날짜 및 시간 수정", + "entryInfoActionEditLocation": "위치 수정", + "entryInfoActionEditTitleDescription": "제목 및 설명 수정", + "entryInfoActionEditRating": "별점 수정", + "entryInfoActionEditTags": "태그 수정", + "entryInfoActionRemoveMetadata": "메타데이터 삭제", + "filterBinLabel": "휴지통", + "filterFavouriteLabel": "즐겨찾기", + "filterNoDateLabel": "날짜 없음", + "filterNoLocationLabel": "위치 없음", + "filterNoRatingLabel": "별점 없음", + "filterNoTagLabel": "태그 없음", + "filterNoTitleLabel": "제목 없음", + "filterOnThisDayLabel": "이 날", + "filterRecentlyAddedLabel": "최근 추가된", + "filterRatingRejectedLabel": "거부됨", + "filterTypeAnimatedLabel": "애니메이션", + "filterTypeMotionPhotoLabel": "모션 사진", + "filterTypePanoramaLabel": "파노라마", + "filterTypeRawLabel": "Raw", + "filterTypeSphericalVideoLabel": "360° 동영상", + "filterTypeGeotiffLabel": "GeoTIFF", + "filterMimeImageLabel": "사진", + "filterMimeVideoLabel": "동영상", + "coordinateFormatDms": "도, 분, 초", + "coordinateFormatDecimal": "십신 도", + "coordinateDms": "{direction} {coordinate}", + "coordinateDmsNorth": "북위", + "coordinateDmsSouth": "남위", + "coordinateDmsEast": "동경", + "coordinateDmsWest": "서경", + "unitSystemMetric": "미터법", + "unitSystemImperial": "야드파운드법", + "videoLoopModeNever": "반복 안 함", + "videoLoopModeShortOnly": "짧은 동영상만 반복", + "videoLoopModeAlways": "항상 반복", + "videoControlsPlayOutside": "다른 앱에서 열기", + "mapStyleGoogleNormal": "Google 지도", + "mapStyleGoogleHybrid": "Google 지도 (위성)", + "mapStyleGoogleTerrain": "Google 지도 (지형)", + "mapStyleOsmHot": "Humanitarian OSM", + "mapStyleStamenWatercolor": "Stamen Watercolor (수채화)", + "nameConflictStrategyRename": "이름 변경", + "nameConflictStrategyReplace": "대체", + "nameConflictStrategySkip": "건너뛰기", + "keepScreenOnNever": "자동 꺼짐", + "keepScreenOnViewerOnly": "뷰어 이용 시 작동", + "keepScreenOnAlways": "항상 켜짐", + "accessibilityAnimationsRemove": "화면 효과 제한", + "accessibilityAnimationsKeep": "화면 효과 유지", + "displayRefreshRatePreferHighest": "가장 높은 재생률", + "displayRefreshRatePreferLowest": "가장 낮은 재생률", + "videoPlaybackSkip": "생략", + "videoPlaybackMuted": "음소거 재생", + "videoPlaybackWithSound": "일반 재생", + "themeBrightnessLight": "라이트", + "themeBrightnessDark": "다크", + "themeBrightnessBlack": "검은색", + "viewerTransitionSlide": "좌우", + "viewerTransitionParallax": "시차", + "viewerTransitionFade": "페이드", + "viewerTransitionZoomIn": "확대", + "viewerTransitionNone": "없음", + "wallpaperTargetHome": "홈 화면", + "wallpaperTargetLock": "잠금화면", + "wallpaperTargetHomeLock": "홈 및 잠금화면", + "widgetOpenPageHome": "홈 열기", + "widgetOpenPageCollection": "미디어 열기", + "widgetOpenPageViewer": "뷰어 열기", + "albumTierNew": "신규", + "albumTierPinned": "고정", + "albumTierSpecial": "기본", + "albumTierApps": "앱", + "albumTierRegular": "일반", + "storageVolumeDescriptionFallbackPrimary": "내장 메모리", + "storageVolumeDescriptionFallbackNonPrimary": "SD 카드", + "rootDirectoryDescription": "루트 폴더", + "otherDirectoryDescription": "“{name}” 폴더", + "storageAccessDialogMessage": "파일에 접근하도록 다음 화면에서 “{volume}”의 {directory}를 선택하세요.", + "restrictedAccessDialogMessage": "“{volume}”의 {directory}에 있는 파일의 접근이 제한됩니다.\n\n기본으로 설치된 갤러리나 파일 관리 앱을 사용해서 다른 폴더로 파일을 이동하세요.", + "notEnoughSpaceDialogMessage": "“{volume}”에 필요 공간은 {neededSize}인데 사용 가능한 용량은 {freeSize}만 남아있습니다.", + "missingSystemFilePickerDialogMessage": "기본 파일 선택기가 없거나 비활성화딥니다. 파일 선택기를 켜고 다시 시도하세요.", + "unsupportedTypeDialogMessage": "{count, plural, other{이 작업은 다음 항목의 형식을 지원하지 않습니다: {types}.}}", + "nameConflictDialogSingleSourceMessage": "이동할 폴더에 이름이 같은 파일이 있습니다.", + "nameConflictDialogMultipleSourceMessage": "이름이 같은 파일이 있습니다.", + "addShortcutDialogLabel": "바로가기 라벨", + "addShortcutButtonLabel": "추가", + "noMatchingAppDialogMessage": "이 작업을 처리할 수 있는 앱이 없습니다.", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{이 항목을 휴지통으로 이동하시겠습니까?} other{항목 {count}개를 휴지통으로 이동하시겠습니까?}}", + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{이 항목을 삭제하시겠습니까?} other{항목 {count}개를 삭제하시겠습니까?}}", + "moveUndatedConfirmationDialogMessage": "이 작업을 계속하기 전에 항목의 날짜를 지정하시겠습니까?", + "moveUndatedConfirmationDialogSetDate": "날짜 지정하기", + "videoResumeDialogMessage": "{time}부터 재개하시겠습니까?", + "videoStartOverButtonLabel": "처음부터", + "videoResumeButtonLabel": "이어서", + "setCoverDialogLatest": "최근 항목", + "setCoverDialogAuto": "자동 설정", + "setCoverDialogCustom": "직접 설정", + "hideFilterConfirmationDialogMessage": "이 필터에 맞는 사진과 동영상이 보이지 않을 것입니다. “개인정보 보호” 설정을 수정하면 다시 보일 수 있습니다.\n\n이 필터를 숨기시겠습니까?", + "newAlbumDialogTitle": "새 앨범 만들기", + "newAlbumDialogNameLabel": "앨범 이름", + "newAlbumDialogNameLabelAlreadyExistsHelper": "사용 중인 이름입니다", + "newAlbumDialogStorageLabel": "저장공간:", + "renameAlbumDialogLabel": "앨범 이름", + "renameAlbumDialogLabelAlreadyExistsHelper": "사용 중인 이름입니다", + "renameEntrySetPageTitle": "이름 변경", + "renameEntrySetPagePatternFieldLabel": "이름 양식", + "renameEntrySetPageInsertTooltip": "필드 추가", + "renameEntrySetPagePreviewSectionTitle": "미리보기", + "renameProcessorCounter": "숫자 증가", + "renameProcessorName": "이름", + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, other{이 앨범의 항목 {count}개를 삭제하시겠습니까?}}", + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, other{이 앨범들의 항목 {count}개를 삭제하시겠습니까?}}", + "exportEntryDialogFormat": "형식:", + "exportEntryDialogWidth": "가로", + "exportEntryDialogHeight": "세로", + "renameEntryDialogLabel": "이름", + "editEntryDialogTargetFieldsHeader": "수정할 필드", + "editEntryDateDialogTitle": "날짜 및 시간", + "editEntryDateDialogSetCustom": "지정 날짜로 편집", + "editEntryDateDialogCopyField": "다른 날짜에서 지정", + "editEntryDialogCopyFromItem": "다른 항목에서 지정", + "editEntryDateDialogExtractFromTitle": "제목에서 추출", + "editEntryDateDialogShift": "시간 이동", + "editEntryDateDialogSourceFileModifiedDate": "파일 수정한 날짜", + "durationDialogHours": "시간", + "durationDialogMinutes": "분", + "durationDialogSeconds": "초", + "editEntryLocationDialogTitle": "위치", + "editEntryLocationDialogChooseOnMap": "지도에서 선택", + "editEntryLocationDialogLatitude": "위도", + "editEntryLocationDialogLongitude": "경도", + "locationPickerUseThisLocationButton": "이 위치 사용", + "editEntryRatingDialogTitle": "별점", + "removeEntryMetadataDialogTitle": "메타데이터 삭제", + "removeEntryMetadataDialogMore": "더 보기", + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP가 있어야 모션 사진에 포함되는 동영상을 재생할 수 있습니다.\n\n삭제하시겠습니까?", + "genericDangerWarningDialogMessage": "확실합니까?", + "videoSpeedDialogLabel": "재생 배속", + "videoStreamSelectionDialogVideo": "동영상", + "videoStreamSelectionDialogAudio": "오디오", + "videoStreamSelectionDialogText": "자막", + "videoStreamSelectionDialogOff": "해제", + "videoStreamSelectionDialogTrack": "트랙", + "videoStreamSelectionDialogNoSelection": "다른 트랙이 없습니다.", + "genericSuccessFeedback": "정상 처리됐습니다", + "genericFailureFeedback": "오류가 발생했습니다", + "menuActionConfigureView": "보기 설정", + "menuActionSelect": "선택", + "menuActionSelectAll": "모두 선택", + "menuActionSelectNone": "모두 해제", + "menuActionMap": "지도", + "menuActionSlideshow": "슬라이드쇼", + "menuActionStats": "통계", + "viewDialogSortSectionTitle": "정렬", + "viewDialogGroupSectionTitle": "묶음", + "viewDialogLayoutSectionTitle": "배치", + "viewDialogReverseSortOrder": "순서를 뒤바꾸기", + "tileLayoutMosaic": "모자이크", + "tileLayoutGrid": "바둑판", + "tileLayoutList": "목록", + "coverDialogTabCover": "이미지", + "coverDialogTabApp": "앱", + "coverDialogTabColor": "색깔", + "appPickDialogTitle": "앱 선택", + "appPickDialogNone": "없음", + "aboutPageTitle": "앱 정보", + "aboutLinkLicense": "라이선스", + "aboutLinkPolicy": "개인정보 보호정책", + "aboutBugSectionTitle": "버그 보고", + "aboutBugSaveLogInstruction": "앱 로그를 파일에 저장하기", + "aboutBugCopyInfoInstruction": "시스템 정보를 복사하기", + "aboutBugCopyInfoButton": "복사", + "aboutBugReportInstruction": "로그와 시스템 정보를 첨부하여 GitHub에서 이슈를 제출하기", + "aboutBugReportButton": "제출", + "aboutCreditsSectionTitle": "크레딧", + "aboutCreditsWorldAtlas1": "이 앱은", + "aboutCreditsWorldAtlas2": "의 TopoJSON 파일(ISC 라이선스)을 이용합니다.", + "aboutTranslatorsSectionTitle": "번역가", + "aboutLicensesSectionTitle": "오픈 소스 라이선스", + "aboutLicensesBanner": "이 앱은 다음의 오픈 소스 패키지와 라이브러리를 이용합니다.", + "aboutLicensesAndroidLibrariesSectionTitle": "안드로이드 라이브러리", + "aboutLicensesFlutterPluginsSectionTitle": "플러터 플러그인", + "aboutLicensesFlutterPackagesSectionTitle": "플러터 패키지", + "aboutLicensesDartPackagesSectionTitle": "다트 패키지", + "aboutLicensesShowAllButtonLabel": "라이선스 모두 보기", + "policyPageTitle": "개인정보 보호정책", + "collectionPageTitle": "미디어", + "collectionPickPageTitle": "항목 선택", + "collectionSelectPageTitle": "항목 선택", + "collectionActionShowTitleSearch": "제목 필터 보기", + "collectionActionHideTitleSearch": "제목 필터 숨기기", + "collectionActionAddShortcut": "홈 화면에 추가", + "collectionActionEmptyBin": "휴지통 비우기", + "collectionActionCopy": "앨범으로 복사", + "collectionActionMove": "앨범으로 이동", + "collectionActionRescan": "새로 분석", + "collectionActionEdit": "편집", + "collectionSearchTitlesHintText": "제목 검색", + "collectionGroupAlbum": "앨범별로", + "collectionGroupMonth": "월별로", + "collectionGroupDay": "날짜별로", + "sectionUnknown": "없음", + "dateToday": "오늘", + "dateYesterday": "어제", + "dateThisMonth": "이번 달", + "collectionDeleteFailureFeedback": "{count, plural, other{항목 {count}개를 삭제하지 못했습니다}}", + "collectionCopyFailureFeedback": "{count, plural, other{항목 {count}개를 복사하지 못했습니다}}", + "collectionMoveFailureFeedback": "{count, plural, other{항목 {count}개를 이동하지 못했습니다}}", + "collectionRenameFailureFeedback": "{count, plural, other{항목 {count}개의 이름을 변경하지 못했습니다}}", + "collectionEditFailureFeedback": "{count, plural, other{항목 {count}개를 편집하지 못했습니다}}", + "collectionExportFailureFeedback": "{count, plural, other{항목 {count}개를 내보내지 못했습니다}}", + "collectionCopySuccessFeedback": "{count, plural, other{항목 {count}개를 복사했습니다}}", + "collectionMoveSuccessFeedback": "{count, plural, other{항목 {count}개를 이동했습니다}}", + "collectionRenameSuccessFeedback": "{count, plural, other{항목 {count}개의 이름을 변경했습니다}}", + "collectionEditSuccessFeedback": "{count, plural, other{항목 {count}개를 편집했습니다}}", + "collectionEmptyFavourites": "즐겨찾기가 없습니다", + "collectionEmptyVideos": "동영상이 없습니다", + "collectionEmptyImages": "사진이 없습니다", + "collectionEmptyGrantAccessButtonLabel": "접근 허용", + "collectionSelectSectionTooltip": "묶음 선택", + "collectionDeselectSectionTooltip": "묶음 선택 해제", + "drawerAboutButton": "앱 정보", + "drawerSettingsButton": "설정", + "drawerCollectionAll": "모든 미디어", + "drawerCollectionFavourites": "즐겨찾기", + "drawerCollectionImages": "사진", + "drawerCollectionVideos": "동영상", + "drawerCollectionAnimated": "애니메이션", + "drawerCollectionMotionPhotos": "모션 사진", + "drawerCollectionPanoramas": "파노라마", + "drawerCollectionRaws": "Raw 이미지", + "drawerCollectionSphericalVideos": "360° 동영상", + "drawerAlbumPage": "앨범", + "drawerCountryPage": "국가", + "drawerTagPage": "태그", + "sortByDate": "날짜", + "sortByName": "이름", + "sortByItemCount": "항목수", + "sortBySize": "크기", + "sortByAlbumFileName": "앨범 및 항목 제목", + "sortByRating": "별점", + "sortOrderNewestFirst": "최근 날짜순", + "sortOrderOldestFirst": "오래된 날짜순", + "sortOrderAtoZ": "A~Z", + "sortOrderZtoA": "Z~A", + "sortOrderHighestFirst": "높은 별점순", + "sortOrderLowestFirst": "낮은 별점순", + "sortOrderLargestFirst": "큰 파일순", + "sortOrderSmallestFirst": "작은 파일순", + "albumGroupTier": "단계별로", + "albumGroupType": "유형별로", + "albumGroupVolume": "저장공간별로", + "albumMimeTypeMixed": "혼합", + "albumPickPageTitleCopy": "앨범으로 복사", + "albumPickPageTitleExport": "앨범으로 내보내기", + "albumPickPageTitleMove": "앨범으로 이동", + "albumPickPageTitlePick": "앨범 선택", + "albumCamera": "카메라", + "albumDownload": "다운로드", + "albumScreenshots": "스크린샷", + "albumScreenRecordings": "화면 녹화 파일", + "albumVideoCaptures": "동영상 캡처", + "albumPageTitle": "앨범", + "albumEmpty": "앨범이 없습니다", + "createAlbumButtonLabel": "추가", + "newFilterBanner": "신규", + "countryPageTitle": "국가", + "countryEmpty": "국가가 없습니다", + "tagPageTitle": "태그", + "tagEmpty": "태그가 없습니다", + "binPageTitle": "휴지통", + "searchCollectionFieldHint": "미디어 검색", + "searchRecentSectionTitle": "최근 검색기록", + "searchDateSectionTitle": "날짜", + "searchAlbumsSectionTitle": "앨범", + "searchCountriesSectionTitle": "국가", + "searchPlacesSectionTitle": "장소", + "searchTagsSectionTitle": "태그", + "searchRatingSectionTitle": "별점", + "searchMetadataSectionTitle": "메타데이터", + "settingsPageTitle": "설정", + "settingsSystemDefault": "시스템 기본값", + "settingsDefault": "기본", + "settingsDisabled": "사용 안함", + "settingsSearchFieldLabel": "설정 검색", + "settingsSearchEmpty": "결과가 없습니다", + "settingsActionExport": "내보내기", + "settingsActionExportDialogTitle": "내보내기", + "settingsActionImport": "가져오기", + "settingsActionImportDialogTitle": "가져오기", + "appExportCovers": "대표 이미지", + "appExportFavourites": "즐겨찾기", + "appExportSettings": "설정", + "settingsNavigationSectionTitle": "탐색", + "settingsHomeTile": "홈", + "settingsHomeDialogTitle": "홈", + "settingsKeepScreenOnTile": "화면 자동 꺼짐 방지", + "settingsKeepScreenOnDialogTitle": "화면 자동 꺼짐 방지", + "settingsDoubleBackExit": "뒤로가기 두번 눌러 앱 종료하기", + "settingsConfirmationTile": "확정 대화상자", + "settingsConfirmationDialogTitle": "확정 대화상자", + "settingsConfirmationBeforeDeleteItems": "항목을 완전히 삭제 시", + "settingsConfirmationBeforeMoveToBinItems": "항목을 휴지통으로 이동 시", + "settingsConfirmationBeforeMoveUndatedItems": "날짜가 지정되지 않은 항목을 이동 시", + "settingsConfirmationAfterMoveToBinItems": "항목을 휴지통으로 이동 후", + "settingsNavigationDrawerTile": "탐색 메뉴", + "settingsNavigationDrawerEditorPageTitle": "탐색 메뉴", + "settingsNavigationDrawerBanner": "항목을 길게 누른 후 이동하여 탐색 메뉴에 표시될 항목의 순서를 수정하세요.", + "settingsNavigationDrawerTabTypes": "유형", + "settingsNavigationDrawerTabAlbums": "앨범", + "settingsNavigationDrawerTabPages": "페이지", + "settingsNavigationDrawerAddAlbum": "앨범 추가", + "settingsThumbnailSectionTitle": "섬네일", + "settingsThumbnailOverlayTile": "오버레이", + "settingsThumbnailOverlayPageTitle": "오버레이", + "settingsThumbnailShowFavouriteIcon": "즐겨찾기 아이콘 표시", + "settingsThumbnailShowTagIcon": "태그 아이콘 표시", + "settingsThumbnailShowLocationIcon": "위치 아이콘 표시", + "settingsThumbnailShowMotionPhotoIcon": "모션 사진 아이콘 표시", + "settingsThumbnailShowRating": "별점 표시", + "settingsThumbnailShowRawIcon": "Raw 아이콘 표시", + "settingsThumbnailShowVideoDuration": "동영상 길이 표시", + "settingsCollectionQuickActionsTile": "빠른 작업", + "settingsCollectionQuickActionEditorPageTitle": "빠른 작업", + "settingsCollectionQuickActionTabBrowsing": "탐색 시", + "settingsCollectionQuickActionTabSelecting": "선택 시", + "settingsCollectionBrowsingQuickActionEditorBanner": "버튼을 길게 누른 후 이동하여 항목 탐색할 때 표시될 버튼을 선택하세요.", + "settingsCollectionSelectionQuickActionEditorBanner": "버튼을 길게 누른 후 이동하여 항목 선택할 때 표시될 버튼을 선택하세요.", + "settingsViewerSectionTitle": "뷰어", + "settingsViewerGestureSideTapNext": "화면 측면에서 탭해서 이전/다음 항목 보기", + "settingsViewerUseCutout": "컷아웃 영역 사용", + "settingsViewerMaximumBrightness": "최대 밝기", + "settingsMotionPhotoAutoPlay": "모션 사진 자동 재생", + "settingsImageBackground": "이미지 배경", + "settingsViewerQuickActionsTile": "빠른 작업", + "settingsViewerQuickActionEditorPageTitle": "빠른 작업", + "settingsViewerQuickActionEditorBanner": "버튼을 길게 누른 후 이동하여 뷰어에 표시될 버튼을 선택하세요.", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "표시될 버튼", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "추가 가능한 버튼", + "settingsViewerQuickActionEmpty": "버튼이 없습니다", + "settingsViewerOverlayTile": "오버레이", + "settingsViewerOverlayPageTitle": "오버레이", + "settingsViewerShowOverlayOnOpening": "열릴 때 표시", + "settingsViewerShowMinimap": "미니맵 표시", + "settingsViewerShowInformation": "상세 정보 표시", + "settingsViewerShowInformationSubtitle": "제목, 날짜, 장소 등 표시", + "settingsViewerShowShootingDetails": "촬영 정보 표시", + "settingsViewerShowOverlayThumbnails": "섬네일 표시", + "settingsViewerEnableOverlayBlurEffect": "흐림 효과", + "settingsViewerSlideshowTile": "슬라이드쇼", + "settingsViewerSlideshowPageTitle": "슬라이드쇼", + "settingsSlideshowRepeat": "반복", + "settingsSlideshowShuffle": "순서섞기", + "settingsSlideshowFillScreen": "화면 채우기", + "settingsSlideshowAnimatedZoomEffect": "애니메이션 확대/축소 효과", + "settingsSlideshowTransitionTile": "전환 효과", + "settingsSlideshowIntervalTile": "교체 주기", + "settingsSlideshowVideoPlaybackTile": "동영상 재생", + "settingsSlideshowVideoPlaybackDialogTitle": "동영상 재생", + "settingsVideoPageTitle": "동영상 설정", + "settingsVideoSectionTitle": "동영상", + "settingsVideoShowVideos": "미디어에 동영상 표시", + "settingsVideoEnableHardwareAcceleration": "하드웨어 가속", + "settingsVideoAutoPlay": "자동 재생", + "settingsVideoLoopModeTile": "반복 모드", + "settingsVideoLoopModeDialogTitle": "반복 모드", + "settingsSubtitleThemeTile": "자막", + "settingsSubtitleThemePageTitle": "자막", + "settingsSubtitleThemeSample": "샘플입니다.", + "settingsSubtitleThemeTextAlignmentTile": "정렬", + "settingsSubtitleThemeTextAlignmentDialogTitle": "정렬", + "settingsSubtitleThemeTextSize": "글자 크기", + "settingsSubtitleThemeShowOutline": "윤곽 및 그림자 표시", + "settingsSubtitleThemeTextColor": "글자 색상", + "settingsSubtitleThemeTextOpacity": "글자 투명도", + "settingsSubtitleThemeBackgroundColor": "배경 색상", + "settingsSubtitleThemeBackgroundOpacity": "배경 투명도", + "settingsSubtitleThemeTextAlignmentLeft": "왼쪽", + "settingsSubtitleThemeTextAlignmentCenter": "가운데", + "settingsSubtitleThemeTextAlignmentRight": "오른쪽", + "settingsVideoControlsTile": "제어", + "settingsVideoControlsPageTitle": "제어", + "settingsVideoButtonsTile": "버튼", + "settingsVideoGestureDoubleTapTogglePlay": "두 번 탭해서 재생이나 일시정지하기", + "settingsVideoGestureSideDoubleTapSeek": "화면 측면에서 두 번 탭해서 앞뒤로 가기", + "settingsPrivacySectionTitle": "개인정보 보호", + "settingsAllowInstalledAppAccess": "설치된 앱의 목록 접근 허용", + "settingsAllowInstalledAppAccessSubtitle": "앨범 표시 개선을 위해", + "settingsAllowErrorReporting": "오류 보고서 보내기", + "settingsSaveSearchHistory": "검색기록", + "settingsEnableBin": "휴지통 사용", + "settingsEnableBinSubtitle": "삭제한 항목을 30일 동안 보관하기", + "settingsHiddenItemsTile": "숨겨진 항목", + "settingsHiddenItemsPageTitle": "숨겨진 항목", + "settingsHiddenFiltersBanner": "이 필터에 맞는 사진과 동영상이 숨겨지고 있으며 이 앱에서 보여지지 않을 것입니다.", + "settingsHiddenFiltersEmpty": "숨겨진 필터가 없습니다", + "settingsStorageAccessTile": "저장공간 접근", + "settingsStorageAccessPageTitle": "저장공간 접근", + "settingsStorageAccessBanner": "어떤 폴더는 사용자의 허용을 받아야만 앱이 파일에 접근이 가능합니다. 이 화면에 허용을 받은 폴더를 확인할 수 있으며 원하지 않으면 취소할 수 있습니다.", + "settingsStorageAccessEmpty": "접근 허용이 없습니다", + "settingsStorageAccessRevokeTooltip": "취소", + "settingsAccessibilitySectionTitle": "접근성", + "settingsRemoveAnimationsTile": "애니메이션 삭제", + "settingsRemoveAnimationsDialogTitle": "애니메이션 삭제", + "settingsTimeToTakeActionTile": "액션 취하기 전 대기 시간", + "settingsDisplaySectionTitle": "디스플레이", + "settingsThemeBrightnessTile": "테마", + "settingsThemeBrightnessDialogTitle": "테마", + "settingsThemeColorHighlights": "색 강조", + "settingsThemeEnableDynamicColor": "동적 색상", + "settingsDisplayRefreshRateModeTile": "화면 재생률", + "settingsDisplayRefreshRateModeDialogTitle": "화면 재생률", + "settingsLanguageSectionTitle": "언어 및 표시 형식", + "settingsLanguageTile": "언어", + "settingsLanguagePageTitle": "언어", + "settingsCoordinateFormatTile": "좌표 표현", + "settingsCoordinateFormatDialogTitle": "좌표 표현", + "settingsUnitSystemTile": "단위법", + "settingsUnitSystemDialogTitle": "단위법", + "settingsScreenSaverPageTitle": "화면보호기", + "settingsWidgetPageTitle": "사진 액자", + "settingsWidgetShowOutline": "윤곽", + "settingsWidgetOpenPage": "위젯을 탭하면", + "settingsCollectionTile": "미디어", + "statsPageTitle": "통계", + "statsWithGps": "{count, plural, other{{count}개 위치가 있음}}", + "statsTopCountriesSectionTitle": "국가 랭킹", + "statsTopPlacesSectionTitle": "장소 랭킹", + "statsTopTagsSectionTitle": "태그 랭킹", + "statsTopAlbumsSectionTitle": "앨범 랭킹", + "viewerOpenPanoramaButtonLabel": "파노라마 열기", + "viewerSetWallpaperButtonLabel": "설정", + "viewerErrorUnknown": "아이구!", + "viewerErrorDoesNotExist": "파일이 존재하지 않습니다.", + "viewerInfoPageTitle": "상세정보", + "viewerInfoBackToViewerTooltip": "뷰어로", + "viewerInfoUnknown": "알 수 없음", + "viewerInfoLabelDescription": "설명", + "viewerInfoLabelTitle": "제목", + "viewerInfoLabelDate": "날짜", + "viewerInfoLabelResolution": "해상도", + "viewerInfoLabelSize": "크기", + "viewerInfoLabelUri": "URI", + "viewerInfoLabelPath": "경로", + "viewerInfoLabelDuration": "길이", + "viewerInfoLabelOwner": "패키지", + "viewerInfoLabelCoordinates": "좌표", + "viewerInfoLabelAddress": "주소", + "mapStyleDialogTitle": "지도 유형", + "mapStyleTooltip": "지도 유형 선택", + "mapZoomInTooltip": "확대", + "mapZoomOutTooltip": "축소", + "mapPointNorthUpTooltip": "북쪽을 위로 가리키기", + "mapAttributionOsmHot": "타일 [HOT](https://www.hotosm.org/) • 호스팅 [OSM France](https://openstreetmap.fr/)", + "mapAttributionStamen": "타일 [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "openMapPageTooltip": "지도 페이지에서 보기", + "mapEmptyRegion": "이 지역의 사진이 없습니다", + "viewerInfoOpenEmbeddedFailureFeedback": "첨부 데이터 추출 오류", + "viewerInfoOpenLinkText": "열기", + "viewerInfoViewXmlLinkText": "XML 보기", + "viewerInfoSearchFieldLabel": "메타데이터 검색", + "viewerInfoSearchEmpty": "결과가 없습니다", + "viewerInfoSearchSuggestionDate": "날짜 및 시간", + "viewerInfoSearchSuggestionDescription": "설명", + "viewerInfoSearchSuggestionDimensions": "크기", + "viewerInfoSearchSuggestionResolution": "해상도", + "viewerInfoSearchSuggestionRights": "권리", + "wallpaperUseScrollEffect": "홈 화면에 스크롤 효과 사용", + "tagEditorPageTitle": "태그 수정", + "tagEditorPageNewTagFieldLabel": "새 태그", + "tagEditorPageAddTagTooltip": "태그 추가", + "tagEditorSectionRecent": "최근 이용기록", + "panoramaEnableSensorControl": "센서 제어 활성화", + "panoramaDisableSensorControl": "센서 제어 비활성화", + "sourceViewerPageTitle": "소스 코드", + "editEntryLocationDialogSetCustom": "지정 장소로 편집", + "tagEditorSectionPlaceholders": "자리 표시자", + "tagPlaceholderCountry": "국가", + "tagPlaceholderPlace": "장소", + "settingsAllowMediaManagement": "미디어 관리 허용", + "subtitlePositionTop": "위", + "settingsSubtitleThemeTextPositionTile": "수직 정렬", + "widgetDisplayedItemMostRecent": "최신", + "subtitlePositionBottom": "아래", + "widgetDisplayedItemRandom": "무작위로", + "settingsSubtitleThemeTextPositionDialogTitle": "수직 정렬", + "settingsWidgetDisplayedItem": "표시될 항목", + "entryInfoActionExportMetadata": "메타데이터 내보내기", + "filterNoAddressLabel": "주소 없음", + "filterAspectRatioPortraitLabel": "세로", + "settingsViewerShowRatingTags": "별점 및 태그 표시", + "filterAspectRatioLandscapeLabel": "가로", + "entryActionShareImageOnly": "사진만 공유", + "entryActionShareVideoOnly": "동영상만 공유", + "entryInfoActionRemoveLocation": "위치 삭제", + "keepScreenOnVideoPlayback": "동영상 재생 시 작동", + "settingsAccessibilityShowPinchGestureAlternatives": "멀티터치의 대안 표시", + "columnCount": "{count, plural, other{{count}열}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsViewerShowDescription": "설명 표시", + "settingsModificationWarningDialogMessage": "다른 설정도 변경될 것입니다.", + "settingsDisplayUseTvInterface": "안드로이드 TV 인터페이스 사용하기", + "filterTaggedLabel": "태그 있음", + "filterLocatedLabel": "위치 있음", + "tooManyItemsErrorDialogMessage": "항목 수를 줄이고 다시 시도하세요.", + "settingsVideoGestureVerticalDragBrightnessVolume": "위아래로 스와이프해서 밝기/음량을 조절하기", + "albumTierVaults": "금고", + "chipActionLock": "잠금", + "vaultLockTypePin": "PIN", + "vaultLockTypePassword": "비밀번호", + "configureVaultDialogTitle": "금고 설정", + "pinDialogEnter": "PIN을 입력하세요", + "passwordDialogEnter": "비밀번호를 입력하세요", + "pinDialogConfirm": "PIN을 확인하세요", + "vaultDialogLockTypeLabel": "잠금 방식", + "vaultDialogLockModeWhenScreenOff": "화면이 꺼진 후 자동으로 잠김", + "authenticateToConfigureVault": "금고 설정을 위한 인증", + "authenticateToUnlockVault": "금고 잠금 해제를 위한 인증", + "settingsDisablingBinWarningDialogMessage": "휴지통에 있는 항목들이 완전히 삭제될 것입니다.", + "newVaultWarningDialogMessage": "금고에 있는 항목들은 이 앱에서만 볼 수 있습니다.\n\n이 앱을 삭제 시, 또한 이 앱의 데이터를 삭제 시, 항목을 완전히 삭제될 것입니다.", + "chipActionCreateVault": "금고 만들기", + "chipActionConfigureVault": "금고 설정", + "newVaultDialogTitle": "새 금고 만들기", + "passwordDialogConfirm": "비밀번호를 확인하세요", + "vaultBinUsageDialogMessage": "휴지통을 사용하는 금고가 있습니다.", + "settingsConfirmationVaultDataLoss": "금고에 관한 데이터 손실 경고", + "placePageTitle": "장소", + "drawerPlacePage": "장소", + "chipActionGoToPlacePage": "장소 페이지에서 보기", + "placeEmpty": "장소가 없습니다", + "lengthUnitPixel": "px", + "lengthUnitPercent": "%", + "exportEntryDialogWriteMetadata": "메타데이터 저장", + "patternDialogConfirm": "패턴을 확인하세요", + "patternDialogEnter": "패턴을 입력하세요", + "vaultLockTypePattern": "패턴", + "settingsVideoEnablePip": "PIP (화면 속 화면)", + "settingsVideoBackgroundMode": "백그라운드 재생", + "settingsVideoBackgroundModeDialogTitle": "백그라운드 재생", + "settingsCollectionBurstPatternsNone": "없음", + "settingsCollectionBurstPatternsTile": "연속 촬영 양식", + "tagPlaceholderState": "주", + "chipActionShowCountryStates": "주 보기", + "stateEmpty": "주가 없습니다", + "searchStatesSectionTitle": "주", + "statsTopStatesSectionTitle": "주 랭킹", + "statePageTitle": "주", + "viewerActionLock": "뷰어 잠금", + "viewerActionUnlock": "뷰어 잠금 해제", + "settingsVideoResumptionModeTile": "재생 재개", + "settingsAskEverytime": "매번 물어보기", + "settingsVideoPlaybackPageTitle": "재생", + "settingsVideoPlaybackTile": "재생", + "settingsVideoResumptionModeDialogTitle": "재생 재개", + "tagEditorDiscardDialogMessage": "변경 사항을 취소하시겠습니까?", + "maxBrightnessAlways": "항상 켜짐", + "videoResumptionModeNever": "재개 안 함", + "videoResumptionModeAlways": "항상 재개", + "maxBrightnessNever": "작동 안 함", + "exportEntryDialogQuality": "품질", + "saveCopyButtonLabel": "사본 저장", + "applyTooltip": "적용", + "editorTransformCrop": "자르기", + "editorTransformRotate": "회전", + "cropAspectRatioFree": "사용자 맞춤 비율", + "cropAspectRatioOriginal": "원본", + "cropAspectRatioSquare": "정사각형", + "editorActionTransform": "변형", + "widgetTapUpdateWidget": "위젯 갱신", + "aboutDataUsageDatabase": "데이터베이스", + "aboutDataUsageMisc": "기타", + "aboutDataUsageSectionTitle": "사용 중인 저장공간", + "aboutDataUsageExternal": "외부 저장소", + "aboutDataUsageInternal": "내부 저장소", + "aboutDataUsageData": "데이터", + "aboutDataUsageCache": "캐시", + "overlayHistogramRGB": "RGB", + "overlayHistogramNone": "없음", + "overlayHistogramLuminance": "휘도", + "settingsViewerShowHistogram": "히스토그램 표시", + "aboutDataUsageClearCache": "캐시 삭제", + "entryActionCast": "전송", + "castDialogTitle": "전송 대상", + "settingsThumbnailShowHdrIcon": "HDR 아이콘 표시", + "collectionActionSetHome": "홈으로 설정", + "videoRepeatActionSetStart": "시작 지점 설정", + "videoRepeatActionSetEnd": "종료 지점 설정", + "stopTooltip": "취소", + "videoActionABRepeat": "A-B 반복", + "renameProcessorHash": "해시", + "settingsForceWesternArabicNumeralsTile": "아라비아 숫자 항상 사용", + "chipActionShowCollection": "미디어 페이지에서 보기", + "explorerPageTitle": "탐색기", + "chipActionGoToExplorerPage": "탐색기 페이지에서 보기", + "setHomeCustom": "직접 설정", + "explorerActionSelectStorageVolume": "저장공간 선택", + "selectStorageVolumeDialogTitle": "저장공간", + "sortByDuration": "길이", + "sortOrderShortestFirst": "짧은 순", + "sortOrderLongestFirst": "긴 순", + "mapStyleOpenTopoMap": "OpenTopoMap", + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | 타일 [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "mapAttributionOsmData": "지도 데이터 © [OpenStreetMap](https://www.openstreetmap.org/copyright) 기여자", + "mapAttributionOsmLiberty": "타일 [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • 호스팅 [OSM Americana](https://tile.ourmap.us)", + "mapStyleOsmLiberty": "OSM Liberty", + "videoActionShowNextFrame": "다음 프레임 보기", + "videoActionShowPreviousFrame": "이전 프레임 보기", + "newAlbumDialogAlbumAlreadyExistsHelper": "앨범이 이미 있습니다", + "chipActionRemove": "제거", + "albumTierDynamic": "동적", + "newDynamicAlbumDialogTitle": "새 동적 앨범", + "dynamicAlbumAlreadyExists": "동적 앨범이 이미 있습니다", + "collectionActionAddDynamicAlbum": "동적 앨범 추가", + "appExportDynamicAlbums": "동적 앨범", + "chipActionDecompose": "나누기", + "coordinateFormatDdm": "도, 십진 분", + "editEntryLocationDialogTimeShift": "시간 이동", + "editEntryLocationDialogImportGpx": "GPX 가져오기", + "removeEntryMetadataDialogAll": "모두", + "sortByPath": "경로", + "searchFormatSectionTitle": "형식", + "chipActionCreateGroup": "그룹 만들기", + "chipActionGroup": "그룹 변경", + "albumTierGroups": "그룹", + "newGroupDialogTitle": "새 그룹 만들기", + "newGroupDialogNameLabel": "그룹 이름", + "groupAlreadyExists": "사용 중인 이름입니다", + "groupEmpty": "그룹이 없습니다", + "groupPickerTitle": "그룹 선택", + "groupPickerUseThisGroupButton": "이 그룹 사용", + "ungrouped": "그룹 없이", + "sectionNone": "묶음 없이", + "createButtonLabel": "추가", + "mapStyleDialogAddStyle": "지도 유형 추가", + "mapStyleEditorDialogName": "이름", + "mapStyleEditorDialogUrl": "URL", + "mapStyleEditorDialogSubdomains": "서브도메인", + "mapStyleEditorDialogUserAgent": "사용자 에이전트", + "tagPickPageTitle": "태그 선택", + "settingsNavigationBottomActionsTile": "하단 탐색 모음", + "settingsNavigationBottomActionEditorPageTitle": "하단 탐색 모음", + "settingsNavigationBottomActionEditorBanner": "버튼을 길게 누른 후 이동하여 하단 탐색 모음에 표시될 버튼을 선택하세요.", + "settingsViewerShowZoomLevel": "확대 수준 표시", + "settingsEnabled": "사용함", + "settingsForced": "강제" +} diff --git a/lib/l10n/app_lt.arb b/lib/l10n/app_lt.arb new file mode 100644 index 0000000..c7d7da8 --- /dev/null +++ b/lib/l10n/app_lt.arb @@ -0,0 +1,1643 @@ +{ + "pickTooltip": "Pasirinkti", + "@pickTooltip": {}, + "doubleBackExitMessage": "Dar kartą bakstelėkite „atgal“, kad išeitumėte.", + "@doubleBackExitMessage": {}, + "showButtonLabel": "RODYTI", + "@showButtonLabel": {}, + "showTooltip": "Rodyti", + "@showTooltip": {}, + "appName": "Aves", + "@appName": {}, + "welcomeOptional": "Neprivaloma", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Sutinku su taisyklėmis ir sąlygomis", + "@welcomeTermsToggle": {}, + "timeSeconds": "{count, plural, =1{{count} sekundė} few{{count} sekundės} other{{count} sekundžių}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "timeDays": "{count, plural, =1{{count} diena} few{{count} dienos} other{{count} dienų}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "applyButtonLabel": "TAIKYTI", + "@applyButtonLabel": {}, + "deleteButtonLabel": "IŠTRINTI", + "@deleteButtonLabel": {}, + "nextButtonLabel": "TOLIAU", + "@nextButtonLabel": {}, + "changeTooltip": "Keisti", + "@changeTooltip": {}, + "clearTooltip": "Išvalyti", + "@clearTooltip": {}, + "nextTooltip": "Toliau", + "@nextTooltip": {}, + "actionRemove": "Pašalinti", + "@actionRemove": {}, + "resetTooltip": "Atstatyti", + "@resetTooltip": {}, + "doNotAskAgain": "Daugiau neklausti", + "@doNotAskAgain": {}, + "sourceStateLoading": "Įkeliama", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Kataloguojama", + "@sourceStateCataloguing": {}, + "chipActionGoToTagPage": "Rodyti žymose", + "@chipActionGoToTagPage": {}, + "chipActionFilterOut": "Išfiltruoti", + "@chipActionFilterOut": {}, + "chipActionHide": "Slėpti", + "@chipActionHide": {}, + "chipActionUnpin": "Atsegti nuo viršaus", + "@chipActionUnpin": {}, + "chipActionSetCover": "Nustatyti viršelį", + "@chipActionSetCover": {}, + "entryActionCopyToClipboard": "Kopijuoti į iškarpinę", + "@entryActionCopyToClipboard": {}, + "entryActionConvert": "Konvertuoti", + "@entryActionConvert": {}, + "entryActionInfo": "Informacija", + "@entryActionInfo": {}, + "entryActionRotateCCW": "Pasukti prieš laikrodžio rodyklę", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Pasukti pagal laikrodžio rodyklę", + "@entryActionRotateCW": {}, + "entryActionPrint": "Spausdinti", + "@entryActionPrint": {}, + "entryActionShare": "Dalintis", + "@entryActionShare": {}, + "entryActionViewSource": "Peržiūrėti šaltinį", + "@entryActionViewSource": {}, + "entryActionViewMotionPhotoVideo": "Atidaryti vaizdo įrašą", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionRotateScreen": "Pasukti ekraną", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Pridėti prie mėgstamiausių", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Pašalinti iš mėgstamiausių", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Užfiksuoti kadrą", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Nutildyti", + "@videoActionMute": {}, + "videoActionUnmute": "Įjungti garsą", + "@videoActionUnmute": {}, + "videoActionPause": "Pristabdyti", + "@videoActionPause": {}, + "videoActionPlay": "Groti", + "@videoActionPlay": {}, + "videoActionReplay10": "Prasukti 10 sekundžių atgal", + "@videoActionReplay10": {}, + "videoActionSkip10": "Prasukti 10 sekundžių į priekį", + "@videoActionSkip10": {}, + "videoActionSetSpeed": "Atkūrimo greitis", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "Nustatymai", + "@viewerActionSettings": {}, + "slideshowActionResume": "Tęsti", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Rodyti kolekcijoje", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditTitleDescription": "Redaguoti pavadinimą ir aprašymą", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Redaguoti įvertinimą", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Redaguoti žymas", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Pašalinti metaduomenis", + "@entryInfoActionRemoveMetadata": {}, + "entryInfoActionExportMetadata": "Eksportuoti metaduomenis", + "@entryInfoActionExportMetadata": {}, + "filterFavouriteLabel": "Mėgstamiausi", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Be datos", + "@filterNoDateLabel": {}, + "filterNoRatingLabel": "Neįvertinta", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Nepažymėta", + "@filterNoTagLabel": {}, + "filterRecentlyAddedLabel": "Neseniai pridėta", + "@filterRecentlyAddedLabel": {}, + "filterTypeMotionPhotoLabel": "Judanti nuotrauka", + "@filterTypeMotionPhotoLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° vaizdo įrašas", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "coordinateFormatDecimal": "Dešimtainiai laipsniai", + "@coordinateFormatDecimal": {}, + "unitSystemImperial": "Imperiniai", + "@unitSystemImperial": {}, + "videoLoopModeShortOnly": "Tik trumpus vaizdo įrašus", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "Visada", + "@videoLoopModeAlways": {}, + "keepScreenOnNever": "Niekada", + "@keepScreenOnNever": {}, + "keepScreenOnAlways": "Visada", + "@keepScreenOnAlways": {}, + "subtitlePositionTop": "Viršuje", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "Apačioje", + "@subtitlePositionBottom": {}, + "videoPlaybackSkip": "Praleisti", + "@videoPlaybackSkip": {}, + "notEnoughSpaceDialogMessage": "Šiai operacijai atlikti reikia {neededSize} laisvos vietos „{volume}“, tačiau liko tik {freeSize}.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "nameConflictDialogMultipleSourceMessage": "Kai kurie failai turi tą patį pavadinimą.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutButtonLabel": "PRIDĖTI", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "Nėra programėlių, kurios galėtų tai padaryti.", + "@noMatchingAppDialogMessage": {}, + "videoStartOverButtonLabel": "PRADĖTI IŠ NAUJO", + "@videoStartOverButtonLabel": {}, + "setCoverDialogLatest": "Naujausias elementas", + "@setCoverDialogLatest": {}, + "newAlbumDialogTitle": "Naujas albumas", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Katalogas jau egzistuoja", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Saugykla:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "Naujas pavadinimas", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Katalogas jau egzistuoja", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageInsertTooltip": "Įterpti lauką", + "@renameEntrySetPageInsertTooltip": {}, + "renameProcessorCounter": "Skaitiklis", + "@renameProcessorCounter": {}, + "renameProcessorName": "Pavadinimas", + "@renameProcessorName": {}, + "renameEntryDialogLabel": "Naujas pavadinimas", + "@renameEntryDialogLabel": {}, + "editEntryDateDialogTitle": "Data ir laikas", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogCopyField": "Kopijuoti iš kitos datos", + "@editEntryDateDialogCopyField": {}, + "durationDialogHours": "Valandos", + "@durationDialogHours": {}, + "durationDialogMinutes": "Minutės", + "@durationDialogMinutes": {}, + "editEntryLocationDialogChooseOnMap": "Pasirinkti žemėlapyje", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "Platuma", + "@editEntryLocationDialogLatitude": {}, + "locationPickerUseThisLocationButton": "Naudoti šią vietą", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "Įvertinimas", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Metaduomenų šalinimas", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "Daugiau", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Norint paleisti vaizdo įrašą judančioje nuotraukoje, reikalingas XMP.\n\nAr tikrai norite jį pašalinti?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "genericDangerWarningDialogMessage": "Ar tikrai?", + "@genericDangerWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Atkūrimo greitis", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogAudio": "Garsas", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Subtitrai", + "@videoStreamSelectionDialogText": {}, + "menuActionConfigureView": "Peržiūrėti", + "@menuActionConfigureView": {}, + "menuActionSelect": "Pasirinkti", + "@menuActionSelect": {}, + "menuActionSelectAll": "Pasirinkti viską", + "@menuActionSelectAll": {}, + "menuActionStats": "Statistika", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "Rikiuoti", + "@viewDialogSortSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Išdėstymas", + "@viewDialogLayoutSectionTitle": {}, + "tileLayoutMosaic": "Mozaika", + "@tileLayoutMosaic": {}, + "coverDialogTabApp": "Programėlė", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Spalva", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Pasirinkite programėlę", + "@appPickDialogTitle": {}, + "appPickDialogNone": "Jokia", + "@appPickDialogNone": {}, + "aboutPageTitle": "Apie", + "@aboutPageTitle": {}, + "aboutBugSectionTitle": "Pranešimas apie klaidą", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Išsaugokite programėlės žurnalus į failą", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Nukopijuokite sistemos informaciją", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugReportButton": "Pranešti", + "@aboutBugReportButton": {}, + "aboutLicensesSectionTitle": "Atvirojo kodo licencijos", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "Šioje programėlėje naudojami šie atvirojo kodo paketai ir bibliotekos.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android bibliotekos", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter paketai", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart paketai", + "@aboutLicensesDartPackagesSectionTitle": {}, + "collectionSelectPageTitle": "Pasirinkti elementus", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Rodyti pavadinimo filtrą", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Slėpti pavadinimo filtrą", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Pridėti nuorodą", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "Išvalyti šiukšlinę", + "@collectionActionEmptyBin": {}, + "collectionActionMove": "Perkelti į albumą", + "@collectionActionMove": {}, + "collectionActionEdit": "Redaguoti", + "@collectionActionEdit": {}, + "welcomeMessage": "Sveiki atvykę į Aves", + "@welcomeMessage": {}, + "itemCount": "{count, plural, =1{{count} elementas} few{{count} elementai} other{{count} elementų}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeMinutes": "{count, plural, =1{{count} minutė} few{{count} minutės} other{{count} minučių}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "continueButtonLabel": "TĘSTI", + "@continueButtonLabel": {}, + "cancelTooltip": "Atšaukti", + "@cancelTooltip": {}, + "hideButtonLabel": "SLĖPTI", + "@hideButtonLabel": {}, + "previousTooltip": "Ankstesnis", + "@previousTooltip": {}, + "hideTooltip": "Slėpti", + "@hideTooltip": {}, + "chipActionGoToCountryPage": "Rodyti šalyse", + "@chipActionGoToCountryPage": {}, + "saveTooltip": "Išsaugoti", + "@saveTooltip": {}, + "chipActionGoToAlbumPage": "Rodyti albumuose", + "@chipActionGoToAlbumPage": {}, + "chipActionRename": "Pervadinti", + "@chipActionRename": {}, + "entryActionDelete": "Išrinti", + "@entryActionDelete": {}, + "chipActionDelete": "Išrinti", + "@chipActionDelete": {}, + "chipActionPin": "Prisegti viršuje", + "@chipActionPin": {}, + "chipActionCreateAlbum": "Sukurti albumą", + "@chipActionCreateAlbum": {}, + "chipActionFilterIn": "Filtruoti", + "@chipActionFilterIn": {}, + "entryActionExport": "Eksportuoti", + "@entryActionExport": {}, + "entryActionRename": "Pervadinti", + "@entryActionRename": {}, + "entryActionRestore": "Atkurti", + "@entryActionRestore": {}, + "entryActionOpenMap": "Rodyti žemėlapio programėlėje", + "@entryActionOpenMap": {}, + "entryActionFlip": "Apversti horizontaliai", + "@entryActionFlip": {}, + "entryActionEdit": "Redaguoti", + "@entryActionEdit": {}, + "entryActionOpen": "Atidaryti naudojant", + "@entryActionOpen": {}, + "entryActionSetAs": "Nustatyti kaip", + "@entryActionSetAs": {}, + "filterBinLabel": "Šiukšlinė", + "@filterBinLabel": {}, + "entryInfoActionEditDate": "Redaguoti datą ir laiką", + "@entryInfoActionEditDate": {}, + "filterNoTitleLabel": "Be pavadinimo", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "Šią dieną", + "@filterOnThisDayLabel": {}, + "filterRatingRejectedLabel": "Atmesta", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Animuota", + "@filterTypeAnimatedLabel": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, + "filterMimeVideoLabel": "Vaizdo įrašas", + "@filterMimeVideoLabel": {}, + "videoLoopModeNever": "Niekada", + "@videoLoopModeNever": {}, + "unitSystemMetric": "Metriniai", + "@unitSystemMetric": {}, + "nameConflictStrategyRename": "Pervadinti", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Pakeisti", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Praleisti", + "@nameConflictStrategySkip": {}, + "themeBrightnessDark": "Tamsi", + "@themeBrightnessDark": {}, + "videoPlaybackWithSound": "Groti su garsu", + "@videoPlaybackWithSound": {}, + "themeBrightnessLight": "Šviesi", + "@themeBrightnessLight": {}, + "videoPlaybackMuted": "Groti išjungus garsą", + "@videoPlaybackMuted": {}, + "widgetDisplayedItemRandom": "Atsitiktinė", + "@widgetDisplayedItemRandom": {}, + "themeBrightnessBlack": "Juoda", + "@themeBrightnessBlack": {}, + "rootDirectoryDescription": "šakninis katalogas", + "@rootDirectoryDescription": {}, + "renameEntrySetPageTitle": "Pervadinti", + "@renameEntrySetPageTitle": {}, + "aboutLinkLicense": "Licencija", + "@aboutLinkLicense": {}, + "storageVolumeDescriptionFallbackPrimary": "Vidinė atmintis", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD kortelė", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "otherDirectoryDescription": "„{name}“ katalogas", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "videoResumeButtonLabel": "TĘSTI", + "@videoResumeButtonLabel": {}, + "newAlbumDialogNameLabel": "Albumo pavadinimas", + "@newAlbumDialogNameLabel": {}, + "storageAccessDialogMessage": "Kitame ekrane pasirinkite {directory} iš „{volume}“, kad suteiktumėte šiai programėlei prieigą prie jo.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "restrictedAccessDialogMessage": "Šiai programai neleidžiama keisti „{volume}“ {directory} failų.\n\nNorėdami perkelti elementus į kitą katalogą, naudokite iš anksto įdiegtą failų tvarkyklę arba galerijos programėlę.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "missingSystemFilePickerDialogMessage": "Trūksta sistemos failų rinkiklio arba jis išjungtas. Įgalinkite jį ir bandykite dar kartą.", + "@missingSystemFilePickerDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "Kai kurie failai paskirties aplanke turi tą patį pavadinimą.", + "@nameConflictDialogSingleSourceMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Išsaugoti datas", + "@moveUndatedConfirmationDialogSetDate": {}, + "moveUndatedConfirmationDialogMessage": "Išsaugoti elemento datas prieš tęsiant?", + "@moveUndatedConfirmationDialogMessage": {}, + "hideFilterConfirmationDialogMessage": "Atitinkančios nuotraukos ir vaizdo įrašai bus paslėpti jūsų kolekcijoje. Galite juos vėl parodyti „Privatumo“ nustatymuose.\n\nAr tikrai norite juos paslėpti?", + "@hideFilterConfirmationDialogMessage": {}, + "renameEntrySetPagePreviewSectionTitle": "Peržiūra", + "@renameEntrySetPagePreviewSectionTitle": {}, + "exportEntryDialogFormat": "Formatas:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Plotis", + "@exportEntryDialogWidth": {}, + "editEntryDialogTargetFieldsHeader": "Keičiami laukai", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogExtractFromTitle": "Ištraukti iš pavadinimo", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogSourceFileModifiedDate": "Failo pakeitimo data", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "exportEntryDialogHeight": "Aukštis", + "@exportEntryDialogHeight": {}, + "editEntryDialogCopyFromItem": "Kopijuoti iš kito elemento", + "@editEntryDialogCopyFromItem": {}, + "editEntryDateDialogSetCustom": "Nustatyti pasirinktinę datą", + "@editEntryDateDialogSetCustom": {}, + "durationDialogSeconds": "Sekundės", + "@durationDialogSeconds": {}, + "editEntryLocationDialogLongitude": "Ilguma", + "@editEntryLocationDialogLongitude": {}, + "tileLayoutGrid": "Tinklelis", + "@tileLayoutGrid": {}, + "videoStreamSelectionDialogVideo": "Vaizdas", + "@videoStreamSelectionDialogVideo": {}, + "genericSuccessFeedback": "Atlikta!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Nepavyko", + "@genericFailureFeedback": {}, + "menuActionMap": "Žemėlapis", + "@menuActionMap": {}, + "tileLayoutList": "Sąrašas", + "@tileLayoutList": {}, + "coverDialogTabCover": "Viršelis", + "@coverDialogTabCover": {}, + "aboutLinkPolicy": "Privatumo politika", + "@aboutLinkPolicy": {}, + "aboutCreditsSectionTitle": "Padėkos", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "Ši programa naudoja TopoJSON failą iš", + "@aboutCreditsWorldAtlas1": {}, + "aboutTranslatorsSectionTitle": "Vertėjai", + "@aboutTranslatorsSectionTitle": {}, + "menuActionSelectNone": "Nesirinkti nieko", + "@menuActionSelectNone": {}, + "viewDialogGroupSectionTitle": "Skyreliai", + "@viewDialogGroupSectionTitle": {}, + "viewDialogReverseSortOrder": "Atvirkštinė rikiavimo tvarka", + "@viewDialogReverseSortOrder": {}, + "aboutBugCopyInfoButton": "Kopijuoti", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "Praneškite „GitHub“ kartu su žurnalais ir sistemos informacija", + "@aboutBugReportInstruction": {}, + "aboutCreditsWorldAtlas2": "pagal ISC licenciją.", + "@aboutCreditsWorldAtlas2": {}, + "aboutLicensesShowAllButtonLabel": "Rodyti visas licencijas", + "@aboutLicensesShowAllButtonLabel": {}, + "collectionPickPageTitle": "Pasirinkti", + "@collectionPickPageTitle": {}, + "collectionPageTitle": "Kolekcija", + "@collectionPageTitle": {}, + "policyPageTitle": "Privatumo politika", + "@policyPageTitle": {}, + "collectionActionCopy": "Kopijuoti į albumą", + "@collectionActionCopy": {}, + "coordinateDmsNorth": "Š", + "@coordinateDmsNorth": {}, + "coordinateDmsEast": "R", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "V", + "@coordinateDmsWest": {}, + "coordinateDmsSouth": "P", + "@coordinateDmsSouth": {}, + "dateToday": "Šiandien", + "@dateToday": {}, + "collectionGroupAlbum": "Pagal albumą", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Pagal mėnesį", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Pagal dieną", + "@collectionGroupDay": {}, + "sectionUnknown": "Nežinoma", + "@sectionUnknown": {}, + "dateThisMonth": "Šį mėnesį", + "@dateThisMonth": {}, + "drawerAboutButton": "Apie", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Nustatymai", + "@drawerSettingsButton": {}, + "drawerCollectionVideos": "Vaizdo įrašai", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "Animuota", + "@drawerCollectionAnimated": {}, + "drawerCollectionRaws": "Raw nuotraukos", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "360° vaizdo įrašai", + "@drawerCollectionSphericalVideos": {}, + "sortByDate": "Pagal datą", + "@sortByDate": {}, + "sortByName": "Pagal pavadinimą", + "@sortByName": {}, + "sortByItemCount": "Pagal elementų skaičių", + "@sortByItemCount": {}, + "sortBySize": "Pagal dydį", + "@sortBySize": {}, + "sortByAlbumFileName": "Pagal albumą ir elemento pavadinimą", + "@sortByAlbumFileName": {}, + "sortByRating": "Pagal įvertinimą", + "@sortByRating": {}, + "sortOrderNewestFirst": "Naujausi viršuje", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Seniausi viršuje", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "A — Z", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Z — A", + "@sortOrderZtoA": {}, + "sortOrderLargestFirst": "Didžiausi viršuje", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "Mažiausi viršuje", + "@sortOrderSmallestFirst": {}, + "albumGroupType": "Pagal tipą", + "@albumGroupType": {}, + "albumGroupVolume": "Pagal apimtį saugykloje", + "@albumGroupVolume": {}, + "albumPickPageTitleCopy": "Kopijuoti į albumą", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Eksportuoti į albumą", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Perkelti į albumą", + "@albumPickPageTitleMove": {}, + "createAlbumButtonLabel": "KURTI", + "@createAlbumButtonLabel": {}, + "countryPageTitle": "Šalys", + "@countryPageTitle": {}, + "settingsActionImport": "Importuoti", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Importuoti", + "@settingsActionImportDialogTitle": {}, + "appExportFavourites": "Mėgstamiausi", + "@appExportFavourites": {}, + "appExportSettings": "Nustatymai", + "@appExportSettings": {}, + "settingsKeepScreenOnDialogTitle": "Laikyti ekraną įjungtą", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsConfirmationTile": "Patvirtinimo dialogo langai", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "Patvirtinimo dialogo langai", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeMoveToBinItems": "Klausti prieš perkeliant elementus į šiukšlinę", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Klausti prieš perkeliant elementus be datos", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Rodyti pranešimą perkėlus elementus į šiukšlinę", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerEditorPageTitle": "Naršymo meniu", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "Palieskite ir palaikykite, kad perkeltumėte ir pakeistumėte meniu elementų eiliškumą.", + "@settingsNavigationDrawerBanner": {}, + "settingsThumbnailSectionTitle": "Miniatiūros", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailShowRawIcon": "Rodyti Raw piktogramą", + "@settingsThumbnailShowRawIcon": {}, + "settingsCollectionQuickActionTabBrowsing": "Naršymas", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Pasirinkimas", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Palieskite ir palaikykite norėdami perkelti mygtukus ir pasirinkti, kokie veiksmai bus rodomi naršant elementus.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Palieskite ir palaikykite norėdami perkelti mygtukus ir pasirinkti, kokie veiksmai bus rodomi pasirenkant elementus.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsViewerMaximumBrightness": "Didžiausias ryškumas", + "@settingsViewerMaximumBrightness": {}, + "settingsViewerQuickActionsTile": "Spartieji veiksmai", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Rodomi mygtukai", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerShowOverlayOnOpening": "Rodyti atidarymo metu", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "Rodyti mini žemėlapį", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformationSubtitle": "Rodyti pavadinimą, datą, vietą ir kt.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowShootingDetails": "Rodyti išsamią fotografavimo informaciją", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerEnableOverlayBlurEffect": "Suliejimo efektas", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowPageTitle": "Skaidrių demonstravimas", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Kartoti", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Maišyti", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Užpildyti ekraną", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowAnimatedZoomEffect": "Animuotas priartinimo efektas", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "Perėjimas efektas", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Intervalas", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "Vaizdo įrašų atkūrimas", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Vaizdo įrašų atkūrimas", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "Vaizdo įrašų nustatymai", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Vaizdo įrašai", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "Rodyti vaizdo įrašus", + "@settingsVideoShowVideos": {}, + "settingsVideoAutoPlay": "Automatinis atkūrimas", + "@settingsVideoAutoPlay": {}, + "settingsSubtitleThemeSample": "Tai yra pavyzdys.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "Teksto lygiavimas", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Teksto lygiavimas", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Teksto padėtis", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Teksto dydis", + "@settingsSubtitleThemeTextSize": {}, + "settingsVideoLoopModeTile": "Kartojimo režimas", + "@settingsVideoLoopModeTile": {}, + "settingsSubtitleThemeTextOpacity": "Teksto skaidrumas", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Fono spalva", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Fono skaidrumas", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Į kairę", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Centruoti", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsVideoControlsTile": "Valdymas", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "Valdymas", + "@settingsVideoControlsPageTitle": {}, + "settingsPrivacySectionTitle": "Privatumas", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Leisti prieigą prie programėlių inventoriaus", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "Naudojamas albumo rodymui pagerinti", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "Leisti anonimiškai pranešti apie klaidas", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Išsaugoti paieškos istoriją", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "Naudoti šiukšlinę", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "Išlaikyti panaikintus elementus 30 dienų", + "@settingsEnableBinSubtitle": {}, + "settingsAllowMediaManagement": "Leisti valdyti mediją", + "@settingsAllowMediaManagement": {}, + "settingsHiddenItemsTile": "Paslėpti elementai", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Paslėpti elementai", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "Nuotraukos ir vaizdo įrašai, atitinkantys paslėptus filtrus, nebus rodomi jūsų kolekcijoje.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "Nėra paslėptų filtrų", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Prieiga prie saugyklos", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "Prieiga prie saugyklos", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessRevokeTooltip": "Atšaukti leidimą", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Pritaikymas neįgaliesiems", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Pašalinti animacijas", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "Pašalinti animacijas", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, + "settingsThemeEnableDynamicColor": "Dinaminė spalva", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Ekrano atnaujinimo dažnis", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Atnaujinimo dažnis", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageSectionTitle": "Kalba ir formatai", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "Kalba", + "@settingsLanguageTile": {}, + "settingsCoordinateFormatDialogTitle": "Koordinačių formatas", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Vienetai", + "@settingsUnitSystemTile": {}, + "settingsScreenSaverPageTitle": "Ekrano užsklanda", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "Nuotraukų rėmelis", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Kontūras", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "Bakstelėjus valdiklį", + "@settingsWidgetOpenPage": {}, + "settingsWidgetDisplayedItem": "Rodomas elementas", + "@settingsWidgetDisplayedItem": {}, + "statsTopCountriesSectionTitle": "Populiariausios šalys", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Populiariausios vietos", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Populiariausios žymos", + "@statsTopTagsSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Populiariausi albumai", + "@statsTopAlbumsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "ATIDARYTI PANORAMĄ", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "NUSTATYTI EKRANO FONĄ", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Oi!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "Failas nebeegzistuoja.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Informacija", + "@viewerInfoPageTitle": {}, + "viewerInfoUnknown": "nežinoma", + "@viewerInfoUnknown": {}, + "viewerInfoLabelTitle": "Pavadinimas", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "Data", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "Rezoliucija", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Dydis", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Kelias", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Trukmė", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Savininkas", + "@viewerInfoLabelOwner": {}, + "settingsCoordinateFormatTile": "Koordinačių formatas", + "@settingsCoordinateFormatTile": {}, + "viewerInfoViewXmlLinkText": "Peržiūrėti XML", + "@viewerInfoViewXmlLinkText": {}, + "settingsThemeColorHighlights": "Spalvų akcentai", + "@settingsThemeColorHighlights": {}, + "dateYesterday": "Vakar", + "@dateYesterday": {}, + "settingsDisplaySectionTitle": "Ekranas", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsLanguagePageTitle": "Kalba", + "@settingsLanguagePageTitle": {}, + "statsPageTitle": "Statistika", + "@statsPageTitle": {}, + "viewerInfoLabelCoordinates": "Koordinatės", + "@viewerInfoLabelCoordinates": {}, + "settingsUnitSystemDialogTitle": "Vienetai", + "@settingsUnitSystemDialogTitle": {}, + "mapStyleDialogTitle": "Žemėlapio stilius", + "@mapStyleDialogTitle": {}, + "settingsCollectionTile": "Kolekcija", + "@settingsCollectionTile": {}, + "mapStyleTooltip": "Pasirinkti žemėlapio stilių", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Pritraukti", + "@mapZoomInTooltip": {}, + "viewerInfoOpenLinkText": "Atidaryti", + "@viewerInfoOpenLinkText": {}, + "viewerInfoLabelAddress": "Adresas", + "@viewerInfoLabelAddress": {}, + "mapZoomOutTooltip": "Atitolinti", + "@mapZoomOutTooltip": {}, + "openMapPageTooltip": "Peržiūrėti žemėlapio puslapyje", + "@openMapPageTooltip": {}, + "drawerCollectionFavourites": "Mėgstamiausi", + "@drawerCollectionFavourites": {}, + "albumMimeTypeMixed": "Mišrus", + "@albumMimeTypeMixed": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "drawerCountryPage": "Šalys", + "@drawerCountryPage": {}, + "drawerCollectionPanoramas": "Panoramos", + "@drawerCollectionPanoramas": {}, + "drawerAlbumPage": "Albumai", + "@drawerAlbumPage": {}, + "drawerTagPage": "Žymos", + "@drawerTagPage": {}, + "settingsSubtitleThemePageTitle": "Subtitrai", + "@settingsSubtitleThemePageTitle": {}, + "settingsVideoLoopModeDialogTitle": "Kartojimo režimas", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "Subtitrai", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemeTextPositionTile": "Teksto padėtis", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSubtitleThemeShowOutline": "Rodyti kontūrą ir šešėlį", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Teksto spalva", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextAlignmentRight": "Į dešinę", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoButtonsTile": "Mygtukai", + "@settingsVideoButtonsTile": {}, + "settingsNavigationDrawerTabAlbums": "Albumai", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerAddAlbum": "Pridėti albumą", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsActionExportDialogTitle": "Eksportuoti", + "@settingsActionExportDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Klausti prieš ištrinanti elementus visam laikui", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsNavigationDrawerTile": "Naršymo meniu", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerTabTypes": "Tipai", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabPages": "Puslapiai", + "@settingsNavigationDrawerTabPages": {}, + "settingsThumbnailShowTagIcon": "Rodyti žymos piktogramą", + "@settingsThumbnailShowTagIcon": {}, + "settingsViewerShowInformation": "Rodyti informaciją", + "@settingsViewerShowInformation": {}, + "settingsActionExport": "Eksportuoti", + "@settingsActionExport": {}, + "appExportCovers": "Viršeliai", + "@appExportCovers": {}, + "settingsKeepScreenOnTile": "Laikyti ekraną įjungtą", + "@settingsKeepScreenOnTile": {}, + "settingsThumbnailShowRating": "Rodyti įvertinimą", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowVideoDuration": "Rodyti vaizdo įrašo trukmę", + "@settingsThumbnailShowVideoDuration": {}, + "settingsViewerQuickActionEditorPageTitle": "Spartieji veiksmai", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionsTile": "Spartieji veiksmai", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Spartieji veiksmai", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsViewerGestureSideTapNext": "Bakstelėti ekrano kraštus, kad būtų rodomas ankstesnis / kitas elementas", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Galimi mygtukai", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Nėra mygtukų", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerShowOverlayThumbnails": "Rodyti miniatiūras", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerSlideshowTile": "Skaidrių demonstravimas", + "@settingsViewerSlideshowTile": {}, + "sourceStateLocatingCountries": "Aptinkamos šalys", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Aptinkamos vietos", + "@sourceStateLocatingPlaces": {}, + "entryActionShowGeoTiffOnMap": "Rodyti kaip žemėlapio uždangą", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Konvertuoti į nejudantį paveikslėlį", + "@entryActionConvertMotionPhotoToStillImage": {}, + "videoActionSelectStreams": "Pasirinkti takelius", + "@videoActionSelectStreams": {}, + "entryInfoActionEditLocation": "Redaguoti vietą", + "@entryInfoActionEditLocation": {}, + "filterNoLocationLabel": "Be vietovės", + "@filterNoLocationLabel": {}, + "filterMimeImageLabel": "Paveikslėlis", + "@filterMimeImageLabel": {}, + "videoControlsPlayOutside": "Atidaryti su kitu grotuvu", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (hibridinis)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (reljefinis)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "Humanitarinis OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (akvarelė)", + "@mapStyleStamenWatercolor": {}, + "keepScreenOnViewerOnly": "Tik peržiūros puslapiui", + "@keepScreenOnViewerOnly": {}, + "accessibilityAnimationsRemove": "Nerodyti ekrano efektų", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Išlaikyti ekrano efektus", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferHighest": "Aukščiausias dažnis", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Žemiausias dažnis", + "@displayRefreshRatePreferLowest": {}, + "viewerTransitionSlide": "Skaidrės", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Paralaksas", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "Išblukimas", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "Priartinimas", + "@viewerTransitionZoomIn": {}, + "viewerTransitionNone": "Joks", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Pagrindinis ekranas", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "Užrakinimo ekranas", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Pagrindinis ir užrakinimo ekranai", + "@wallpaperTargetHomeLock": {}, + "widgetOpenPageHome": "Atidaryti pagrindinį puslapį", + "@widgetOpenPageHome": {}, + "widgetOpenPageViewer": "Atidaryti peržiūrą", + "@widgetOpenPageViewer": {}, + "albumTierNew": "Nauji", + "@albumTierNew": {}, + "albumTierPinned": "Prisegti", + "@albumTierPinned": {}, + "albumTierSpecial": "Bendri", + "@albumTierSpecial": {}, + "albumTierApps": "Programėlių", + "@albumTierApps": {}, + "albumTierRegular": "Kiti", + "@albumTierRegular": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Ši operacija nepalaikoma šio tipo elementams: {types}.} other{Ši operacija nepalaikoma šių tipų elementams: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "addShortcutDialogLabel": "Nuorodos etiketė", + "@addShortcutDialogLabel": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Ištrinti šį elementą?} other{Ištrinti šiuos {count} elementus?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Perkelti šį elementą į šiukšlinę?} other{Perkelti šiuos {count} elementus į šiukšlinę?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoResumeDialogMessage": "Ar norite tęsti grojimą nuo {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "setCoverDialogAuto": "Automatinis", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Pasirinktinis", + "@setCoverDialogCustom": {}, + "renameEntrySetPagePatternFieldLabel": "Pavadinimų suteikimo modelis", + "@renameEntrySetPagePatternFieldLabel": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Ištrinti šį albumą ir jame esantį elementą?} other{Ištrinti šį albumą ir jame esančius {count} elementus?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Ištrinti šiuos albumus ir jame esantį elementą?} other{Ištrinti šiuos albumus ir jame esančius {count} elementus?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editEntryDateDialogShift": "Pastumti", + "@editEntryDateDialogShift": {}, + "editEntryLocationDialogTitle": "Vieta", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogSetCustom": "Nustatyti pasirinktinę vietą", + "@editEntryLocationDialogSetCustom": {}, + "videoStreamSelectionDialogOff": "Išjungti", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Takelis", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "Kitų takelių nėra.", + "@videoStreamSelectionDialogNoSelection": {}, + "menuActionSlideshow": "Skaidrių demonstravimas", + "@menuActionSlideshow": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter papildiniai", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "collectionSearchTitlesHintText": "Ieškoti pavadinimų", + "@collectionSearchTitlesHintText": {}, + "collectionActionRescan": "Nuskenuoti iš naujo", + "@collectionActionRescan": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Nepavyko ištrinti 1 elemento} other{Nepavyko ištrinti {count} elementų}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopyFailureFeedback": "{count, plural, =1{Nepavyko nukopijuoti 1 elemento} other{Nepavyko nukopijuoti {count} elementų}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{Nepavyko perkelti 1 elemento} other{Nepavyko perkelti {count} elementų}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{Nepavyko redaguoti 1 elemento} other{Nepavyko redaguoti {count} elementų}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{Nepavyko eksportuoti 1 puslapio} other{Nepavyko eksportuoti {count} puslapių}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{Perkeltas 1 elementas} other{Perkelta {count} elementų}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, =1{Nukopijuota 1 prekė} other{Nukopijuoti {count} elementai}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameFailureFeedback": "{count, plural, =1{Nepavyko pervadinti 1 elemento} other{Nepavyko pervadinti {count} elementų}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{Pervadintas 1 elementas} other{Pervadinti {count} elementai}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{Redaguotas 1 elementas} other{Redaguoti {count} elementai}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyImages": "Nėra paveiklėlių", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Suteikti prieigą", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Pasirinkti pasirinkimą", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Panaikinti pasirinkimą", + "@collectionDeselectSectionTooltip": {}, + "drawerCollectionAll": "Visos kolekcijos", + "@drawerCollectionAll": {}, + "drawerCollectionImages": "Paveikslėliai", + "@drawerCollectionImages": {}, + "drawerCollectionMotionPhotos": "Judančios nuotraukos", + "@drawerCollectionMotionPhotos": {}, + "sortOrderHighestFirst": "Anksčiausi viršuje", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Žemiausi viršuje", + "@sortOrderLowestFirst": {}, + "albumGroupTier": "Pagal lygį", + "@albumGroupTier": {}, + "albumPickPageTitlePick": "Pasirinkti albumą", + "@albumPickPageTitlePick": {}, + "albumDownload": "Atsiuntimai", + "@albumDownload": {}, + "albumScreenshots": "Ekrano nuotraukos", + "@albumScreenshots": {}, + "albumScreenRecordings": "Ekrano vaizdo įrašai", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Vaizdo įrašai", + "@albumVideoCaptures": {}, + "albumPageTitle": "Albumai", + "@albumPageTitle": {}, + "albumEmpty": "Nėra albumų", + "@albumEmpty": {}, + "newFilterBanner": "nauja", + "@newFilterBanner": {}, + "binPageTitle": "Šiukšlinė", + "@binPageTitle": {}, + "searchRecentSectionTitle": "Naujausia", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Datos", + "@searchDateSectionTitle": {}, + "countryEmpty": "Nėra šalių", + "@countryEmpty": {}, + "tagPageTitle": "Žymos", + "@tagPageTitle": {}, + "tagEmpty": "Nėra žymų", + "@tagEmpty": {}, + "searchAlbumsSectionTitle": "Albumai", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "Šalys", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "Vietos", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Žymos", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "Įvertinimai", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "Metaduomenys", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Nustatymai", + "@settingsPageTitle": {}, + "settingsSystemDefault": "Sistemos numatyta", + "@settingsSystemDefault": {}, + "settingsDefault": "Numatyta", + "@settingsDefault": {}, + "settingsDisabled": "Išjungta", + "@settingsDisabled": {}, + "settingsSearchFieldLabel": "Paieškos nustatymai", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Nėra atitinkančio nustatymo", + "@settingsSearchEmpty": {}, + "settingsNavigationSectionTitle": "Naršymas", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Pagrindinis", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Pagrindinis", + "@settingsHomeDialogTitle": {}, + "settingsDoubleBackExit": "Du kart bakstelėti „atgal“, kad išeiti", + "@settingsDoubleBackExit": {}, + "settingsThumbnailOverlayTile": "Uždanga", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Uždanga", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowFavouriteIcon": "Rodyti mėgstamiausių piktogramą", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Rodyti judančios nuotraukos piktogramą", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsViewerUseCutout": "Naudoti iškirpimo sritį", + "@settingsViewerUseCutout": {}, + "settingsImageBackground": "Paveikslėlio fonas", + "@settingsImageBackground": {}, + "settingsViewerQuickActionEditorBanner": "Palieskite ir palaikykite norėdami perkelti mygtukus ir pasirinkti, kurie veiksmai bus rodomi peržiūroje.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsMotionPhotoAutoPlay": "Automatiškai paleisti judančias nuotraukas", + "@settingsMotionPhotoAutoPlay": {}, + "settingsViewerOverlayPageTitle": "Uždanga", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerOverlayTile": "Uždanga", + "@settingsViewerOverlayTile": {}, + "settingsVideoEnableHardwareAcceleration": "Aparatinės įrangos spartintuvas", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Dukart bakstelėti, kad groti / pristabdyti", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "Dukart bakstelėti ekrano kraštus, kad peršokti pirmyn/atgal", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsStorageAccessBanner": "Norint keisti kai kuriuos katalogus, reikia aiškios tiesioginės prieigos teisės, kad būtų galima keisti juose esančius failus. Čia galite peržiūrėti katalogus, prie kurių anksčiau suteikėte prieigą.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Prieigos teisių nesuteikta", + "@settingsStorageAccessEmpty": {}, + "settingsTimeToTakeActionTile": "Laikas iki veiksmo atlikimo", + "@settingsTimeToTakeActionTile": {}, + "statsWithGps": "{count, plural, =1{1 elementas su vieta} other{{count} elementai su vieta}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "viewerInfoBackToViewerTooltip": "Atgal į peržiūrą", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoLabelDescription": "Aprašymas", + "@viewerInfoLabelDescription": {}, + "mapPointNorthUpTooltip": "Centruoti pagal šiaurę", + "@mapPointNorthUpTooltip": {}, + "mapAttributionOsmHot": "Sluoksniai [HOT](https://www.hotosm.org/) • Priegloba [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapEmptyRegion": "Šiame regione paveikslėlių nėra", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Nepavyko išskleisti įterptųjų duomenų", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoSearchFieldLabel": "Ieškoti metaduomenyse", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Nėra atitinkančių raktų", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Data ir laikas", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Aprašymas", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Matmenys", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Rezoliucija", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Teisės", + "@viewerInfoSearchSuggestionRights": {}, + "wallpaperUseScrollEffect": "Naudoti slinkties efektą pagrindiniame ekrane", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageTitle": "Redaguoti žymas", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Nauja žyma", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Pridėti žymą", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Naujausia", + "@tagEditorSectionRecent": {}, + "tagEditorSectionPlaceholders": "Vietos rezervavimo ženklai", + "@tagEditorSectionPlaceholders": {}, + "panoramaEnableSensorControl": "Įjungti jutiklio valdymą", + "@panoramaEnableSensorControl": {}, + "sourceViewerPageTitle": "Šaltinis", + "@sourceViewerPageTitle": {}, + "widgetDisplayedItemMostRecent": "Naujausia", + "@widgetDisplayedItemMostRecent": {}, + "widgetOpenPageCollection": "Atidaryti kolekciją", + "@widgetOpenPageCollection": {}, + "collectionEmptyVideos": "Nėra vaizdo įrašų", + "@collectionEmptyVideos": {}, + "collectionEmptyFavourites": "Nėra mėgstamiausių", + "@collectionEmptyFavourites": {}, + "searchCollectionFieldHint": "Ieškoti kolekcijoje", + "@searchCollectionFieldHint": {}, + "settingsViewerSectionTitle": "Peržiūra", + "@settingsViewerSectionTitle": {}, + "panoramaDisableSensorControl": "Išjungti jutiklio valdymą", + "@panoramaDisableSensorControl": {}, + "settingsThumbnailShowLocationIcon": "Rodyti vietos piktogramą", + "@settingsThumbnailShowLocationIcon": {}, + "tagPlaceholderCountry": "Šalis", + "@tagPlaceholderCountry": {}, + "mapAttributionStamen": "Sluoksniai [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "tagPlaceholderPlace": "Vieta", + "@tagPlaceholderPlace": {}, + "filterNoAddressLabel": "Nėra adreso", + "@filterNoAddressLabel": {}, + "filterAspectRatioLandscapeLabel": "Gulsčias", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "Portretas", + "@filterAspectRatioPortraitLabel": {}, + "settingsViewerShowRatingTags": "Rodyti įvertinimus ir žymas", + "@settingsViewerShowRatingTags": {}, + "entryActionShareVideoOnly": "Bendrinti tik vaizdo įrašą", + "@entryActionShareVideoOnly": {}, + "entryActionShareImageOnly": "Bendrinti tik paveikslėlį", + "@entryActionShareImageOnly": {}, + "entryInfoActionRemoveLocation": "Pašalinti vietą", + "@entryInfoActionRemoveLocation": {}, + "chipActionShowCollection": "Rodyti kolekcijoje", + "@chipActionShowCollection": {}, + "mapAttributionOsmData": "Žemėlapio duomenys © [OpenStreetMap](https://www.openstreetmap.org/copyright) bendradarbiai", + "@mapAttributionOsmData": {}, + "filterLocatedLabel": "Lokalizuota", + "@filterLocatedLabel": {}, + "aboutDataUsageSectionTitle": "Duomenų naudojimas", + "@aboutDataUsageSectionTitle": {}, + "chipActionConfigureVault": "Konfigūruoti saugyklą", + "@chipActionConfigureVault": {}, + "chipActionGoToPlacePage": "Rodyti Vietose", + "@chipActionGoToPlacePage": {}, + "chipActionLock": "Rakinti", + "@chipActionLock": {}, + "chipActionShowCountryStates": "Rodyti valstybes", + "@chipActionShowCountryStates": {}, + "entryActionCast": "Transliuoti", + "@entryActionCast": {}, + "saveCopyButtonLabel": "IŠSAUGOTI KOPIJĄ", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Taikyti", + "@applyTooltip": {}, + "editorActionTransform": "Transformuoti", + "@editorActionTransform": {}, + "editorTransformCrop": "Apkirpti", + "@editorTransformCrop": {}, + "editorTransformRotate": "Pasukti", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Laisvai", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Originalas", + "@cropAspectRatioOriginal": {}, + "widgetTapUpdateWidget": "Atnaujinti valdiklį", + "@widgetTapUpdateWidget": {}, + "passwordDialogEnter": "Įveskite slaptažodį", + "@passwordDialogEnter": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Rodyti kelių palietimų gestų alternatyvas", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "chipActionCreateVault": "Kurti saugyklą", + "@chipActionCreateVault": {}, + "filterTaggedLabel": "Pažymėti", + "@filterTaggedLabel": {}, + "configureVaultDialogTitle": "Konfigūruoti saugyklą", + "@configureVaultDialogTitle": {}, + "settingsVideoPlaybackTile": "Atkūrimas", + "@settingsVideoPlaybackTile": {}, + "vaultDialogLockTypeLabel": "Užrakto tipas", + "@vaultDialogLockTypeLabel": {}, + "aboutDataUsageData": "Duomenys", + "@aboutDataUsageData": {}, + "vaultDialogLockModeWhenScreenOff": "Užrakinti kai ekranas išsijungia", + "@vaultDialogLockModeWhenScreenOff": {}, + "pinDialogConfirm": "Konfigūruoti PIN", + "@pinDialogConfirm": {}, + "patternDialogEnter": "Įveskite paveikslą", + "@patternDialogEnter": {}, + "pinDialogEnter": "Įveskite PIN", + "@pinDialogEnter": {}, + "passwordDialogConfirm": "Patvirtinti slaptažodį", + "@passwordDialogConfirm": {}, + "renameProcessorHash": "Maiša", + "@renameProcessorHash": {}, + "aboutDataUsageInternal": "Vidaus", + "@aboutDataUsageInternal": {}, + "aboutDataUsageCache": "Talpykla", + "@aboutDataUsageCache": {}, + "sortByDuration": "Pagal trukmę", + "@sortByDuration": {}, + "sortOrderShortestFirst": "Trumpiausi pirmiausiai", + "@sortOrderShortestFirst": {}, + "selectStorageVolumeDialogTitle": "Pasirinkti saugyklą", + "@selectStorageVolumeDialogTitle": {}, + "searchStatesSectionTitle": "Valstybės", + "@searchStatesSectionTitle": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Braukite į viršų ar apačią kad keisti šviesumą/garsumą", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsDisablingBinWarningDialogMessage": "Daiktai šiukšlių dėžėje bus ištrinti visam laikui.", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsDisplayUseTvInterface": "Android TV vaizdas", + "@settingsDisplayUseTvInterface": {}, + "settingsForceWesternArabicNumeralsTile": "Priversti arabų skaitmenys", + "@settingsForceWesternArabicNumeralsTile": {}, + "albumTierVaults": "Seifai", + "@albumTierVaults": {}, + "tooManyItemsErrorDialogMessage": "Bandykite vėl su mažiau daiktų.", + "@tooManyItemsErrorDialogMessage": {}, + "castDialogTitle": "Transliavimo įrenginiai", + "@castDialogTitle": {}, + "aboutDataUsageExternal": "Išorinė", + "@aboutDataUsageExternal": {}, + "statePageTitle": "Valstybės", + "@statePageTitle": {}, + "settingsAskEverytime": "Klausti kiekvieną kartą", + "@settingsAskEverytime": {}, + "settingsCollectionBurstPatternsTile": "Burst modeliai", + "@settingsCollectionBurstPatternsTile": {}, + "settingsCollectionBurstPatternsNone": "Jokio", + "@settingsCollectionBurstPatternsNone": {}, + "settingsViewerShowDescription": "Rodyti aprašymą", + "@settingsViewerShowDescription": {}, + "settingsVideoBackgroundMode": "Fono grojimas", + "@settingsVideoBackgroundMode": {}, + "settingsVideoResumptionModeTile": "Tęsti atkūrimą", + "@settingsVideoResumptionModeTile": {}, + "aboutDataUsageDatabase": "Duombazė", + "@aboutDataUsageDatabase": {}, + "settingsModificationWarningDialogMessage": "Kiti nustatymai bus pakeisti.", + "@settingsModificationWarningDialogMessage": {}, + "patternDialogConfirm": "Konfigūruoti paveikslą", + "@patternDialogConfirm": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "collectionActionSetHome": "Nustatyti kaip namus", + "@collectionActionSetHome": {}, + "drawerPlacePage": "Vietos", + "@drawerPlacePage": {}, + "placeEmpty": "Jokių vietų", + "@placeEmpty": {}, + "settingsViewerShowHistogram": "Rodyti histogramą", + "@settingsViewerShowHistogram": {}, + "settingsVideoEnablePip": "Paveikslas paveiksle", + "@settingsVideoEnablePip": {}, + "settingsConfirmationVaultDataLoss": "Rodyti saugyklos duomenų praradimo ispėjimą", + "@settingsConfirmationVaultDataLoss": {}, + "aboutDataUsageClearCache": "Valyti talpyklą", + "@aboutDataUsageClearCache": {}, + "statsTopStatesSectionTitle": "Pagrindinės valstybės", + "@statsTopStatesSectionTitle": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "maxBrightnessNever": "Niekada", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "Visada", + "@maxBrightnessAlways": {}, + "overlayHistogramNone": "Jokios", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "overlayHistogramLuminance": "Skaistis", + "@overlayHistogramLuminance": {}, + "vaultLockTypePassword": "Slaptažodis", + "@vaultLockTypePassword": {}, + "videoResumptionModeNever": "Niekada", + "@videoResumptionModeNever": {}, + "videoResumptionModeAlways": "Visada", + "@videoResumptionModeAlways": {}, + "newVaultWarningDialogMessage": "Daiktai saugyklose yra prieinami tik šiai programėlei ir jokiom kitom.\n\nJei pašalinsite šią programą arba išvalysite jos duomenis, jūs prarasite visus šiuos daiktus.", + "@newVaultWarningDialogMessage": {}, + "authenticateToConfigureVault": "Autentifikuoti, kad konfigūruoti saugyklą", + "@authenticateToConfigureVault": {}, + "authenticateToUnlockVault": "Autentifikuoti, kad atrakinti saugyklą", + "@authenticateToUnlockVault": {}, + "vaultBinUsageDialogMessage": "Kai kurios saugyklos naudoja šiukšlių dėžę.", + "@vaultBinUsageDialogMessage": {}, + "exportEntryDialogQuality": "Kokybė", + "@exportEntryDialogQuality": {}, + "sortOrderLongestFirst": "Ilgiausi pirmiausiai", + "@sortOrderLongestFirst": {}, + "stateEmpty": "Jokių valstybių", + "@stateEmpty": {}, + "placePageTitle": "Vietos", + "@placePageTitle": {}, + "setHomeCustom": "Pritaikytas", + "@setHomeCustom": {}, + "settingsVideoPlaybackPageTitle": "Atkūrimas", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoResumptionModeDialogTitle": "Tęsti atkūrimą", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsVideoBackgroundModeDialogTitle": "Fono grojimas", + "@settingsVideoBackgroundModeDialogTitle": {}, + "newVaultDialogTitle": "Nauja saugykla", + "@newVaultDialogTitle": {}, + "exportEntryDialogWriteMetadata": "Įrašyti metainformaciją", + "@exportEntryDialogWriteMetadata": {}, + "explorerActionSelectStorageVolume": "Pasirinkite saugyklą", + "@explorerActionSelectStorageVolume": {}, + "stopTooltip": "Stabdyti", + "@stopTooltip": {}, + "videoActionABRepeat": "A-B kartoti", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "Nustatyti pradžią", + "@videoRepeatActionSetStart": {}, + "viewerActionLock": "Užrakinti peržiūrą", + "@viewerActionLock": {}, + "viewerActionUnlock": "Atrakinti peržiūrą", + "@viewerActionUnlock": {}, + "cropAspectRatioSquare": "Kvadratas", + "@cropAspectRatioSquare": {}, + "vaultLockTypePattern": "Piešinys", + "@vaultLockTypePattern": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "explorerPageTitle": "Naršyklė", + "@explorerPageTitle": {}, + "settingsThumbnailShowHdrIcon": "Rodyti HDR ikoną", + "@settingsThumbnailShowHdrIcon": {}, + "columnCount": "{count, plural, =1{{count} stulpelis} other{{count} stulpeliai}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "chipActionGoToExplorerPage": "Rodyti Naršyklėje", + "@chipActionGoToExplorerPage": {}, + "videoRepeatActionSetEnd": "Nustatyti pabaigą", + "@videoRepeatActionSetEnd": {}, + "keepScreenOnVideoPlayback": "Vaizdo įrašo atkūrimo metu", + "@keepScreenOnVideoPlayback": {}, + "aboutDataUsageMisc": "Įvairūs", + "@aboutDataUsageMisc": {}, + "createButtonLabel": "KURTI", + "@createButtonLabel": {}, + "chipActionRemove": "Pašalinti", + "@chipActionRemove": {}, + "chipActionDecompose": "Padalyti", + "@chipActionDecompose": {}, + "chipActionGroup": "Pakeisti grupavimą", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Kurti grupę", + "@chipActionCreateGroup": {}, + "videoActionShowPreviousFrame": "Rodyti ankstesnį rėmelį", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "Rodyti sekantį rėmelį", + "@videoActionShowNextFrame": {}, + "albumTierGroups": "Grupės", + "@albumTierGroups": {}, + "albumTierDynamic": "Dinaminis", + "@albumTierDynamic": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Albumas jau yra", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "newDynamicAlbumDialogTitle": "Naujas dinaminis albumas", + "@newDynamicAlbumDialogTitle": {}, + "dynamicAlbumAlreadyExists": "Dinaminis albumas jau yra", + "@dynamicAlbumAlreadyExists": {}, + "newGroupDialogTitle": "Nauja grupė", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Grupės pavadinimas", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "Grupė jau yra", + "@groupAlreadyExists": {}, + "groupEmpty": "Nėra grupių", + "@groupEmpty": {}, + "ungrouped": "Nesugrupuota", + "@ungrouped": {}, + "groupPickerTitle": "Išsirinkti grupę", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Naudoti šią grupę", + "@groupPickerUseThisGroupButton": {}, + "editEntryLocationDialogImportGpx": "Importuoti GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "Laiko poslinkis", + "@editEntryLocationDialogTimeShift": {}, + "removeEntryMetadataDialogAll": "Visi", + "@removeEntryMetadataDialogAll": {}, + "collectionActionAddDynamicAlbum": "Pridėti dinaminį albumą", + "@collectionActionAddDynamicAlbum": {}, + "sectionNone": "Jokių skyrelių", + "@sectionNone": {}, + "sortByPath": "Pagal kelią", + "@sortByPath": {}, + "tagPickPageTitle": "Išrinkti žymą", + "@tagPickPageTitle": {}, + "searchFormatSectionTitle": "Formatai", + "@searchFormatSectionTitle": {}, + "appExportDynamicAlbums": "Dinaminiai albumai", + "@appExportDynamicAlbums": {}, + "settingsNavigationBottomActionsTile": "Apatinė naršymo juostelė", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Apatinė naršymo juostelė", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Norėdami perkelti mygtukus, palieskite ir laikykite, ir pasirinkite, kurie veiksmai bus rodomi apatinėje naršymo juostelėje.", + "@settingsNavigationBottomActionEditorBanner": {}, + "mapStyleDialogAddStyle": "Pridėti stilių", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogName": "Vardas", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogSubdomains": "Subdomenai", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "Vartotojo agentas", + "@mapStyleEditorDialogUserAgent": {}, + "mapAttributionOsmLiberty": "Plytelės iš [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Priegloba [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Plytelės iš [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "tagEditorDiscardDialogMessage": "Ar norite atmesti pakeitimus?", + "@tagEditorDiscardDialogMessage": {}, + "tagPlaceholderState": "Apskritis", + "@tagPlaceholderState": {} +} diff --git a/lib/l10n/app_ml.arb b/lib/l10n/app_ml.arb new file mode 100644 index 0000000..94606d4 --- /dev/null +++ b/lib/l10n/app_ml.arb @@ -0,0 +1,6 @@ +{ + "appName": "ഏവ്സ്", + "@appName": {}, + "welcomeMessage": "ഏവ്സിലേക്ക് സ്വാഗതം", + "@welcomeMessage": {} +} diff --git a/lib/l10n/app_my.arb b/lib/l10n/app_my.arb new file mode 100644 index 0000000..3347b44 --- /dev/null +++ b/lib/l10n/app_my.arb @@ -0,0 +1,1328 @@ +{ + "sourceStateLocatingPlaces": "နေရာ တည်နေရာများ", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "ဖျက်ရန်", + "@chipActionDelete": {}, + "welcomeMessage": "Aves မှ ကြိုဆိုပါတယ်", + "@welcomeMessage": {}, + "columnCount": "{count, plural, other{{count} ကော်လံ}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "appName": "Aves", + "@appName": {}, + "welcomeOptional": "မရွေးဘဲထားနိုင်သည်", + "@welcomeOptional": {}, + "welcomeTermsToggle": "စည်းမျဥ်းစည်းကမ်းနှင့် သတ်မှတ်ချက်များကို သဘောတူပါသည်", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, other{{count} ခု}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeSeconds": "{count, plural, other{{count} စက္ကန့်}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "timeMinutes": "{count, plural, other{{count} မိနစ်}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "timeDays": "{count, plural, other{{count} ရက်}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "focalLength": "{length} မီလီမီတာ", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "applyButtonLabel": "လုပ်ဆောင်မည်", + "@applyButtonLabel": {}, + "cancelTooltip": "မလုပ်တော့ပါ", + "@cancelTooltip": {}, + "previousTooltip": "နောက်သို့", + "@previousTooltip": {}, + "deleteButtonLabel": "ဖျက်မည်", + "@deleteButtonLabel": {}, + "nextButtonLabel": "ရှေ့သို့", + "@nextButtonLabel": {}, + "showButtonLabel": "ပြရန်", + "@showButtonLabel": {}, + "hideButtonLabel": "ဝှက်ရန်", + "@hideButtonLabel": {}, + "resetTooltip": "အရင်အတိုင်းပြန်ထားမည်", + "@resetTooltip": {}, + "continueButtonLabel": "ရှေ့ဆက်သွားရန်", + "@continueButtonLabel": {}, + "clearTooltip": "ရှင်းလင်းမည်", + "@clearTooltip": {}, + "saveCopyButtonLabel": "မိတ္တူကိုသိမ်းမည်", + "@saveCopyButtonLabel": {}, + "showTooltip": "ပြရန်", + "@showTooltip": {}, + "actionRemove": "ဖယ်ရှားမည်", + "@actionRemove": {}, + "sourceStateLoading": "လုပ်ဆောင်နေသည်", + "@sourceStateLoading": {}, + "chipActionGoToCountryPage": "နိုင်ငံတွေထဲမှာပြရန်", + "@chipActionGoToCountryPage": {}, + "applyTooltip": "လုပ်ဆောင်မည်", + "@applyTooltip": {}, + "changeTooltip": "ပြောင်းမည်", + "@changeTooltip": {}, + "nextTooltip": "ရှေ့သို့", + "@nextTooltip": {}, + "chipActionGoToPlacePage": "နေရာများထဲတွင်ပြရန်", + "@chipActionGoToPlacePage": {}, + "chipActionGoToTagPage": "အမှတ်အသားများတွင်ပြရန်", + "@chipActionGoToTagPage": {}, + "chipActionFilterOut": "စစ်ထုတ်ရန်", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "စစ်သွင်းရန်", + "@chipActionFilterIn": {}, + "chipActionHide": "ဝှက်", + "@chipActionHide": {}, + "chipActionLock": "သော့ခတ်", + "@chipActionLock": {}, + "chipActionPin": "ထိပ်ဆုံးသို့ပင်တွဲရန်", + "@chipActionPin": {}, + "chipActionUnpin": "ထိပ်ဆုံးမှပင်ဖြုတ်ရန်", + "@chipActionUnpin": {}, + "hideTooltip": "ဝှက်ရန်", + "@hideTooltip": {}, + "pickTooltip": "ရွေးရန်", + "@pickTooltip": {}, + "saveTooltip": "သိမ်းမည်", + "@saveTooltip": {}, + "doubleBackExitMessage": "ထွက်ရန် \"နောက်သို့\" ခလုတ်ကို ထပ်နှိပ်ပါ။", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "ထပ်မမေးပါနှင့်", + "@doNotAskAgain": {}, + "sourceStateLocatingCountries": "နိုင်ငံတည်နေရာများ", + "@sourceStateLocatingCountries": {}, + "chipActionGoToAlbumPage": "အယ်လ်ဘမ်တွေထဲမှာပြရန်", + "@chipActionGoToAlbumPage": {}, + "sourceStateCataloguing": "မက်တာဒေတာများ ဖန်တီးနေသည်", + "@sourceStateCataloguing": {}, + "chipActionRename": "အမည်ပြောင်းရန်", + "@chipActionRename": {}, + "chipActionSetCover": "ကာဗာပုံအဖြစ်ထားရန်", + "@chipActionSetCover": {}, + "chipActionShowCountryStates": "နိုင်ငံများပြရန်", + "@chipActionShowCountryStates": {}, + "chipActionCreateAlbum": "အယ်လ်ဘမ်ဖန်တီးရန်", + "@chipActionCreateAlbum": {}, + "chipActionCreateVault": "လျှို့ဝှက်သိုလှောင်ခန်း ဖန်တီးရန်", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "လျှို့ဝှက်သိုလှောင်ခန်းကို ပြင်ဆင်ရန်", + "@chipActionConfigureVault": {}, + "entryActionCopyToClipboard": "ကလစ်ဘုတ်သို့ကော်ပီကူးရန်", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "ဖျက်ရန်", + "@entryActionDelete": {}, + "entryActionConvert": "ဖိုင်ပုံစံပြောင်းရန်", + "@entryActionConvert": {}, + "entryActionExport": "ပို့ရန်", + "@entryActionExport": {}, + "entryActionInfo": "ဖိုင်အချက်အလက်", + "@entryActionInfo": {}, + "entryActionRename": "အမည်ပြောင်းရန်", + "@entryActionRename": {}, + "entryActionRestore": "ပြန်ယူရန်", + "@entryActionRestore": {}, + "entryActionRotateCCW": "နာရီလက်တံပြောင်းပြန်အတိုင်း လှည့်ရန်", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "နာရီလက်တံအတိုင်း လှည့်ရန်", + "@entryActionRotateCW": {}, + "entryActionFlip": "အလျားလိုက် လှန်ရန်", + "@entryActionFlip": {}, + "entryActionPrint": "ပရင့်ထုတ်ရန်", + "@entryActionPrint": {}, + "entryActionShare": "မျှဝေရန်", + "@entryActionShare": {}, + "entryActionShowGeoTiffOnMap": "မြေပုံ overlay အဖြစ် ပြရန်", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "ပုံအသေသို့ ပြောင်းရန်", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "ဗီဒီယိုဖွင့်ရန်", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "ပြင်ဆင်ရန်", + "@entryActionEdit": {}, + "entryActionOpen": "တခြားအက်ပ်ဖြင့် ဖွင့်ရန်", + "@entryActionOpen": {}, + "entryActionSetAs": "…ပုံအဖြစ် ထားရန်", + "@entryActionSetAs": {}, + "videoActionSkip10": "ရှေ့သို့ ၁၀ စက္ကန့်သွား", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "အသံဖိုင်ရွေးရန်", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "ဖွင့်ကြည့်မှု အမြန်နှုန်း", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "ဆက်တင်များ", + "@viewerActionSettings": {}, + "viewerActionLock": "ကြည့်ရှုမှုကို လော့ခ်ခတ်ရန်", + "@viewerActionLock": {}, + "viewerActionUnlock": "ကြည့်ရှုမှုကို လော့ခ်ပြန်ဖွင့်ရန်", + "@viewerActionUnlock": {}, + "slideshowActionResume": "ဆက်ကြည့်ရန်", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "စုစည်းမှုထဲမှာ ပြရန်", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "ရက်စွဲနှင့်အချိန်ကို ပြင်ရန်", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "တည်နေရာပြင်ရန်", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "ခေါင်းစဥ်နှင့်ဖော်ပြချက်ကို ပြင်ရန်", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "အဆင့်သတ်မှတ်ချက်ကို ပြင်ရန်", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Tag များကိုပြင်ရန်", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "မက်တာဒေတာများ ဖယ်ရှားရန်", + "@entryInfoActionRemoveMetadata": {}, + "editorTransformCrop": "ဖြတ်တောက်ရန်", + "@editorTransformCrop": {}, + "editorTransformRotate": "လှည့်ရန်", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "ကန့်သတ်မထား", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "မူလအတိုင်း", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "လေးထောင့်ပုံစံ", + "@cropAspectRatioSquare": {}, + "filterAspectRatioLandscapeLabel": "တစောင်း", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "အတည့်", + "@filterAspectRatioPortraitLabel": {}, + "filterBinLabel": "ပြန်သုံးအမှိုက်ပုံး", + "@filterBinLabel": {}, + "filterFavouriteLabel": "အကြိုက်ဆုံး", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "ရက်သတ်မှတ်မထား", + "@filterNoDateLabel": {}, + "filterNoAddressLabel": "လိပ်စာမပါရှိ", + "@filterNoAddressLabel": {}, + "filterLocatedLabel": "တည်နေရာပါရှိ", + "@filterLocatedLabel": {}, + "filterNoLocationLabel": "တည်နေရာမပါရှိ", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "အဆင့်သတ်မှတ်မထား", + "@filterNoRatingLabel": {}, + "filterTaggedLabel": "Tag တွဲထား", + "@filterTaggedLabel": {}, + "filterOnThisDayLabel": "ယနေ့", + "@filterOnThisDayLabel": {}, + "filterNoTitleLabel": "ခေါင်းစဥ်မပေးထား", + "@filterNoTitleLabel": {}, + "filterRecentlyAddedLabel": "ထည့်ထားတာ မကြာသေး", + "@filterRecentlyAddedLabel": {}, + "filterRatingRejectedLabel": "ပယ်ချထား", + "@filterRatingRejectedLabel": {}, + "entryActionViewSource": "ရင်းမြစ်ကို ကြည့်ရန်", + "@entryActionViewSource": {}, + "entryActionShareImageOnly": "ပုံကိုသာ မျှဝေမည်", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "ဗီဒီယိုကိုသာ မျှဝေမည်", + "@entryActionShareVideoOnly": {}, + "filterNoTagLabel": "Tag မတွဲထား", + "@filterNoTagLabel": {}, + "entryActionOpenMap": "မြေပုံကြည့်အက်ပ်တွင် ပြရန်", + "@entryActionOpenMap": {}, + "videoActionCaptureFrame": "လက်ရှိဖရိန်ကိုဖမ်းယူရန်", + "@videoActionCaptureFrame": {}, + "entryActionRotateScreen": "စကရင်ကို လှည့်ရန်", + "@entryActionRotateScreen": {}, + "videoActionMute": "အသံပိတ်ရန်", + "@videoActionMute": {}, + "entryActionAddFavourite": "အကြိုက်ဆုံးများသို့ ထည့်ရန်", + "@entryActionAddFavourite": {}, + "videoActionUnmute": "အသံပြန်ဖွင့်ရန်", + "@videoActionUnmute": {}, + "entryActionRemoveFavourite": "အကြိုက်ဆုံးများမှ ဖယ်ရှားရန်", + "@entryActionRemoveFavourite": {}, + "videoActionPause": "ခဏရပ်ရန်", + "@videoActionPause": {}, + "videoActionPlay": "ဖွင့်ရန်", + "@videoActionPlay": {}, + "videoActionReplay10": "နောက်သို့ ၁၀ စက္ကန့်ဆုတ်", + "@videoActionReplay10": {}, + "entryInfoActionExportMetadata": "မက်တာဒေတာများ ပို့ရန်", + "@entryInfoActionExportMetadata": {}, + "entryInfoActionRemoveLocation": "တည်နေရာကို ဖယ်ရှားမည်", + "@entryInfoActionRemoveLocation": {}, + "editorActionTransform": "အသွင်ပြောင်းရန်", + "@editorActionTransform": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "videoPlaybackWithSound": "အသံဖြင့်ဖွင့်မည်", + "@videoPlaybackWithSound": {}, + "videoResumptionModeAlways": "အမြဲတမ်း", + "@videoResumptionModeAlways": {}, + "viewerTransitionSlide": "Slide", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Parallax", + "@viewerTransitionParallax": {}, + "viewerTransitionNone": "ဘာမှမထား", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "ပင်မစကရင်", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "လော့ခ်စကရင်", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "ပင်မစကရင်နှင့် လော့ခ်စကရင်", + "@wallpaperTargetHomeLock": {}, + "widgetTapUpdateWidget": "ဝစ်ဂျက်ကို အပ်ဒိတ်လုပ်ရန်", + "@widgetTapUpdateWidget": {}, + "storageVolumeDescriptionFallbackPrimary": "စက်တွင်းသိုလှောင်မှု", + "@storageVolumeDescriptionFallbackPrimary": {}, + "otherDirectoryDescription": "“{name}” directory", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "restrictedAccessDialogMessage": "ယခုအက်ပ်သည် “{volume}” ၏ {directory} ရှိဖိုင်များကို ပြင်ဆင်ပြောင်းလဲခွင့်မရှိပါ။\n\nကျေးဇူးပြု၍ ၎င်းဓာတ်ပုံ/ဗီဒီယိုများကို စက်တွင်းပါဝင်ပြီးသားဖိုင်မန်နေဂျာ (သို့မဟုတ်) ဓာတ်ပုံကြည့်အက်ပ်တစ်ခုခုဖြင့် အခြား directory တစ်ခုကို ရွှေ့ပြောင်းပေးပါ။", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "notEnoughSpaceDialogMessage": "ယခုလုပ်ဆောင်ချက်ပြီးမြောက်ရန် “{volume}” တွင် နေရာလွတ် {neededSize} ရှိဖို့ လိုအပ်တာကြောင့် လက်ရှိနေရာလွတ် {freeSize} ဖြင့် လုပ်ဆောင်၍မရနိုင်ပါ။", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "missingSystemFilePickerDialogMessage": "စစ်စတမ်၏ ဖိုင်ရွေးအက်ပ်ကို ပိတ်ထားပါသည် (သို့မဟုတ်) ရှာမတွေ့ပါ။ ပြန်ဖွင့်ပေးပြီးမှ ထပ်စမ်းကြည့်ပါ။", + "@missingSystemFilePickerDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "ထည့်သွင်းလိုသော folder တွင် အမည်တူဖိုင်များရှိနေသည်။", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "အမည်တူဖိုင်များရှိနေသည်။", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "ဖြတ်လမ်းတိုအမည်", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "ဖန်တီးမည်", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "ယခုလုပ်ဆောင်ချက်ကို ကိုင်တွယ်နိုင်သောအက်ပ် ရှာမတွေ့ပါ။", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{ဒီတစ်ခုကို ပြန်သုံးအမှိုက်ပုံးထဲ ထည့်မှာလား?} =2{ဒီနှစ်ခုကို ပြန်သုံးအမှိုက်ပုံးထဲ ထည့်မှာလား?} other{ဒီ {count} ခုကို ပြန်သုံးအမှိုက်ထဲထည့်မှာလား?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "moveUndatedConfirmationDialogMessage": "ရှေ့မဆက်ခင် ဓာတ်ပုံ/ဗီဒီယိုပါ ရက်စွဲတွေကို သိမ်းမှာလား?", + "@moveUndatedConfirmationDialogMessage": {}, + "videoStartOverButtonLabel": "အစကပဲပြန်စမည်", + "@videoStartOverButtonLabel": {}, + "moveUndatedConfirmationDialogSetDate": "သိမ်းမည်", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "ကြည့်လက်စ {time} မိနစ်ကနေ ဆက်ကြည့်ချင်ပါသလား?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "videoResumeButtonLabel": "ဆက်ကြည့်မည်", + "@videoResumeButtonLabel": {}, + "settingsVideoResumptionModeTile": "ကြည့်လက်စ ဆက်ကြည့်ခြင်း", + "@settingsVideoResumptionModeTile": {}, + "filterTypeAnimatedLabel": "လှုပ်ရှားနေသောပုံ", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "လှုပ်ရှားမှုပါသောပုံ", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "မြင်ကွင်းကျယ်ဓာတ်ပုံ", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw ပုံ", + "@filterTypeRawLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterTypeSphericalVideoLabel": "၃၆၀° ဗီဒီယို", + "@filterTypeSphericalVideoLabel": {}, + "filterMimeImageLabel": "ဓာတ်ပုံ", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "ဗီဒီယို", + "@filterMimeVideoLabel": {}, + "albumTierNew": "အသစ်", + "@albumTierNew": {}, + "albumTierPinned": "ပင်တွဲထား", + "@albumTierPinned": {}, + "coordinateFormatDms": "DMS (ဒီဂရီ၊ မိနစ်၊ စက္ကန့်)", + "@coordinateFormatDms": {}, + "albumTierRegular": "အခြား", + "@albumTierRegular": {}, + "coordinateFormatDecimal": "DD (လတ္တီတွဒ်၊ လောင်ဂျီတွဒ်)", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsNorth": "မြောက်", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "တောင်", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "အရှေ့", + "@coordinateDmsEast": {}, + "keepScreenOnViewerOnly": "ဓာတ်ပုံ/ဗီဒီယိုကြည့်သည့်စာမျက်နှာတွင်သာ", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "အမြဲတမ်း", + "@keepScreenOnAlways": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "mapStyleGoogleNormal": "Google မြေပုံ", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleTerrain": "Google မြေပုံ (မြေအနေအထားပြ)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "mapStyleGoogleHybrid": "Google မြေပုံ (ဂြိုဟ်တု)", + "@mapStyleGoogleHybrid": {}, + "subtitlePositionBottom": "အောက်ဘက်", + "@subtitlePositionBottom": {}, + "themeBrightnessLight": "အလင်း", + "@themeBrightnessLight": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (ရေဆေး)", + "@mapStyleStamenWatercolor": {}, + "maxBrightnessNever": "ဘယ်တော့မှမလုပ်ပါနှင့်", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "အမြဲတမ်း", + "@maxBrightnessAlways": {}, + "nameConflictStrategyRename": "အမည်ပြောင်းလိုက်ပါ", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "အစားထိုးလိုက်ပါ", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "ကျော်လိုက်ပါ", + "@nameConflictStrategySkip": {}, + "subtitlePositionTop": "အပေါ်ဘက်", + "@subtitlePositionTop": {}, + "vaultLockTypePin": "PIN နံပါတ်", + "@vaultLockTypePin": {}, + "vaultLockTypePassword": "စကားဝှက်", + "@vaultLockTypePassword": {}, + "settingsVideoEnablePip": "PiP (အခြားအက်ပ်တစ်ခုပေါ်တွင် ထပ်ပြခြင်း)", + "@settingsVideoEnablePip": {}, + "themeBrightnessDark": "အမှောင်", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "အနက်ရောင်", + "@themeBrightnessBlack": {}, + "unitSystemMetric": "မက်ထရစ်ယူနစ်", + "@unitSystemMetric": {}, + "unitSystemImperial": "ဗြိတိသျှအင်ပါယာယူနစ် (မြန်မာနိုင်ငံသုံးစနစ်)", + "@unitSystemImperial": {}, + "vaultLockTypePattern": "Pattern", + "@vaultLockTypePattern": {}, + "videoControlsPlayOutside": "တခြား player နဲ့ဖွင့်တဲ့ခလုတ်", + "@videoControlsPlayOutside": {}, + "videoLoopModeNever": "ဘယ်တော့မှမလုပ်ပါနှင့်", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "ဗီဒီယိုအတိုလေးတွေတွင်သာ", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "အမြဲတမ်း", + "@videoLoopModeAlways": {}, + "videoPlaybackMuted": "အသံပိတ်ပြီးဖွင့်မည်", + "@videoPlaybackMuted": {}, + "videoResumptionModeNever": "ဘယ်တော့မှမလုပ်ပါနှင့်", + "@videoResumptionModeNever": {}, + "settingsVideoResumptionModeDialogTitle": "ကြည့်လက်စ ဆက်ကြည့်ခြင်း", + "@settingsVideoResumptionModeDialogTitle": {}, + "albumTierSpecial": "အကြည့်များ", + "@albumTierSpecial": {}, + "albumTierApps": "အက်ပ်အလိုက်", + "@albumTierApps": {}, + "albumTierVaults": "လျှို့ဝှက်သိုလှောင်ခန်းများ", + "@albumTierVaults": {}, + "coordinateDmsWest": "အနောက်", + "@coordinateDmsWest": {}, + "displayRefreshRatePreferHighest": "အမြင့်ဆုံးနှုန်း", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "အနိမ့်ဆုံးနှုန်း", + "@displayRefreshRatePreferLowest": {}, + "keepScreenOnNever": "ဘယ်တော့မှမလုပ်ပါနှင့်", + "@keepScreenOnNever": {}, + "keepScreenOnVideoPlayback": "ဗီဒီယိုကြည့်နေသည့်အချိန်အတွင်း", + "@keepScreenOnVideoPlayback": {}, + "videoPlaybackSkip": "ကျော်လိုက်ပါ", + "@videoPlaybackSkip": {}, + "viewerTransitionFade": "မှိန်သွားခြင်း", + "@viewerTransitionFade": {}, + "widgetDisplayedItemMostRecent": "အသစ်အဖြစ်ဆုံး", + "@widgetDisplayedItemMostRecent": {}, + "viewerTransitionZoomIn": "ချဲ့ကားလာခြင်း", + "@viewerTransitionZoomIn": {}, + "widgetDisplayedItemRandom": "ဗျောက်သောက်", + "@widgetDisplayedItemRandom": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD ကတ်တွင် သိုလှောင်မှု", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "ထိပ်ဆုံး directory", + "@rootDirectoryDescription": {}, + "storageAccessDialogMessage": "ယခုအက်ပ်ကို ဖိုင်ဝင်ရောက်ကြည့်ရှုခွင့်ပေးရန်အတွက် အရှေ့စကရင်သို့ရောက်လျှင် “{volume}” ၏ {directory} ကို ရွေးချယ်ပေးပါ။", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "unsupportedTypeDialogMessage": "{count, plural, =1{ယခုလုပ်ဆောင်ချက်ကို ဤအမျိုးအစားဖိုင်များအတွက် အထောက်အပံ့မပေးထားပါ - {types}} other{ယခုလုပ်ဆောင်ချက်ကို ဤအမျိုးအစားများပါဖိုင်များအတွက် အထောက်အပံ့မပေးထားပါ - {types}}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{ဒီတစ်ခုကိုဖျက်မှာလား?} =2{ဒီနှစ်ခုကိုဖျက်မှာလား?} other{ဒီ {count} ခုကို ဖျက်မှာလား?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "overlayHistogramNone": "မထား", + "@overlayHistogramNone": {}, + "setCoverDialogLatest": "နောက်ဆုံးပုံ/ဗီဒီယို", + "@setCoverDialogLatest": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Directory ရှိပြီးသားဖြစ်သည်", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "သိုလှောင်မှု -", + "@newAlbumDialogStorageLabel": {}, + "newVaultDialogTitle": "လျှို့ဝှက်သိုလှောင်ခန်းအသစ်", + "@newVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "စကရင်ပိတ်လျှင် လော့ခ်ခတ်ရန်", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "လော့ခ်အမျိုးအစား", + "@vaultDialogLockTypeLabel": {}, + "passwordDialogEnter": "စကားဝှက်ရိုက်ထည့်ပါ", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "စကားဝှက်ကို အတည်ပြုပါ", + "@passwordDialogConfirm": {}, + "authenticateToConfigureVault": "လျှို့ဝှက်သိုလှောင်ခန်းကိုပြင်ဆင်ရန် သင်ဖြစ်ကြောင်းသက်သေပြပါ", + "@authenticateToConfigureVault": {}, + "authenticateToUnlockVault": "လျှို့ဝှက်သိုလှောင်ခန်းကိုဖွင့်ရန် သင်ဖြစ်ကြောင်းသက်သေပြပါ", + "@authenticateToUnlockVault": {}, + "vaultBinUsageDialogMessage": "ပြန်သုံးအမှိုက်ပုံးကိုအသုံးပြုနေသော လျှို့ဝှက်သိုလှောင်ခန်းများရှိသည်။", + "@vaultBinUsageDialogMessage": {}, + "renameAlbumDialogLabel": "အမည်အသစ်", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Directory ရှိပြီးသားဖြစ်သည်", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "အမည်ပြောင်းခြင်း", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "အမည်ပေးခြင်းပုံစံ", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameProcessorCounter": "ရေတွက်မှု", + "@renameProcessorCounter": {}, + "renameProcessorName": "အမည်", + "@renameProcessorName": {}, + "exportEntryDialogFormat": "Format:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "အလျား", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "အနံ", + "@exportEntryDialogHeight": {}, + "exportEntryDialogQuality": "အရည်အသွေး", + "@exportEntryDialogQuality": {}, + "editEntryDateDialogTitle": "ရက်စွဲနှင့် အချိန်", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "စိတ်ကြိုက်ရက်စွဲထားမည်", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "တခြားရက်စွဲက ကော်ပီကူးမည်", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogExtractFromTitle": "ခေါင်းစဥ်က ယူမည်", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "အတိုးအလျှော့လုပ်မည်", + "@editEntryDateDialogShift": {}, + "editEntryDialogTargetFieldsHeader": "ပြင်ဆင်မည့် အကွက်များ", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogSourceFileModifiedDate": "ဖိုင်ပြင်ဆင်ခဲ့သည့်ရက်စွဲ", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "နာရီ", + "@durationDialogHours": {}, + "durationDialogMinutes": "မိနစ်", + "@durationDialogMinutes": {}, + "durationDialogSeconds": "စက္ကန့်", + "@durationDialogSeconds": {}, + "editEntryLocationDialogTitle": "တည်နေရာ", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogSetCustom": "စိတ်ကြိုက်တည်နေရာထားမည်", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogChooseOnMap": "မြေပုံပေါ်ကရွေးမည်", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "လတ္တီတွဒ်", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "လောင်ဂျီတွဒ်", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "ဒီနေရာကိုသုံးမည်", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "အဆင့်သတ်မှတ်ချက်", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "မက်တာဒေတာဖယ်ရှားခြင်း", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "နောက်ထပ်", + "@removeEntryMetadataDialogMore": {}, + "videoSpeedDialogLabel": "ဖွင့်ကြည့်မှု အမြန်နှုန်း", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "ဗီဒီယို", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "အသံ", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "စာတန်းထိုး", + "@videoStreamSelectionDialogText": {}, + "menuActionSelect": "ရွေးချယ်ရန်", + "@menuActionSelect": {}, + "menuActionSelectAll": "အားလုံးရွေးချယ်မည်", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "ဘာမှမရွေးပါ", + "@menuActionSelectNone": {}, + "menuActionMap": "မြေပုံ", + "@menuActionMap": {}, + "menuActionSlideshow": "ဆလိုက်ရှိုး", + "@menuActionSlideshow": {}, + "coverDialogTabApp": "အက်ပ်ပိုင်း", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "ကာလာပိုင်း", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "အက်ပ်ရွေးချယ်ပါ", + "@appPickDialogTitle": {}, + "appPickDialogNone": "ဘာမှမရွေး", + "@appPickDialogNone": {}, + "aboutPageTitle": "ဤအက်ပ်အကြောင်း", + "@aboutPageTitle": {}, + "aboutLinkLicense": "လိုင်စင်", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "ကိုယ်ရေးကိုယ်တာလုံခြုံမှု မူဝါဒ", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Bug တင်ပြခြင်း", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "အက်ပ်မှတ်တမ်းကို ဖိုင်တစ်ဖိုင်ထဲသို့သိမ်းပါ", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "စစ်စတမ်အချက်အလက်များကို ကော်ပီကူးပါ", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "ကော်ပီ", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "မှတ်တမ်းနှင့် စစ်စတမ်အချက်အလက်များကို GitHub တွင် တင်ပြပါ", + "@aboutBugReportInstruction": {}, + "aboutCreditsSectionTitle": "ခရက်ဒစ်", + "@aboutCreditsSectionTitle": {}, + "collectionPageTitle": "စုစည်းမှု", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "ရွေးချယ်ပါ", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "ပုံ/ဗီဒီယိုရွေးချယ်ပါ", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "ခေါင်းစဥ်စစ်ထုတ်ရန်", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "ခေါင်းစဥ်မစစ်ထုတ်တော့ပါ", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "ဖြတ်လမ်းတိုဖန်တီးရန်", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "အမှိုက်ပုံးရှင်းလင်းရန်", + "@collectionActionEmptyBin": {}, + "collectionEmptyGrantAccessButtonLabel": "ဖိုင်ဝင်ရောက်ကြည့်ရှုခွင့်ပေးရန်", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "အစိတ်အပိုင်းရွေးချယ်ပါ", + "@collectionSelectSectionTooltip": {}, + "drawerAboutButton": "အက်ပ်အကြောင်း", + "@drawerAboutButton": {}, + "drawerCollectionAll": "စုစည်းမှုအားလုံး", + "@drawerCollectionAll": {}, + "drawerCollectionAnimated": "လှုပ်ရှားနေသောပုံ", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "လှုပ်ရှားမှုပါသောပုံ", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "မြင်ကွင်းကျယ်ဓာတ်ပုံ", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Raw ပုံ", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "၃၆၀° ဗီဒီယို", + "@drawerCollectionSphericalVideos": {}, + "sortBySize": "အရွယ်အစားအလိုက်", + "@sortBySize": {}, + "sortByAlbumFileName": "အယ်လ်ဘမ်နှင့် ဖိုင်အမည်အလိုက်", + "@sortByAlbumFileName": {}, + "sortOrderNewestFirst": "အသစ်ဆုံးက ထိပ်ဆုံး", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "အဟောင်းဆုံးက ထိပ်ဆုံး", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "A ကနေ Z", + "@sortOrderAtoZ": {}, + "sortOrderHighestFirst": "အမြင့်ဆုံးက ထိပ်ဆုံး", + "@sortOrderHighestFirst": {}, + "albumPickPageTitleExport": "အယ်လ်ဘမ်သို့ ပို့ခြင်း", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "အယ်လ်ဘမ်သို့ ရွှေ့ခြင်း", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "အယ်လ်ဘမ်ရွေးချယ်ပါ", + "@albumPickPageTitlePick": {}, + "statePageTitle": "ပြည်နယ်များ", + "@statePageTitle": {}, + "stateEmpty": "ပြည်နယ်တစ်ခုမှ မရှိပါ", + "@stateEmpty": {}, + "placePageTitle": "နေရာများ", + "@placePageTitle": {}, + "placeEmpty": "နေရာတစ်ခုမှ မရှိပါ", + "@placeEmpty": {}, + "tagPageTitle": "Tag များ", + "@tagPageTitle": {}, + "tagEmpty": "Tag တစ်ခုမှ မရှိပါ", + "@tagEmpty": {}, + "binPageTitle": "ပြန်သုံးအမှိုက်ပုံး", + "@binPageTitle": {}, + "searchCollectionFieldHint": "စုစည်းမှုအတွင်း ရှာဖွေပါ", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "ရှာထားတာ မကြာသေး", + "@searchRecentSectionTitle": {}, + "searchStatesSectionTitle": "ပြည်နယ်များ", + "@searchStatesSectionTitle": {}, + "searchPlacesSectionTitle": "နေရာများ", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Tag များ", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "အဆင့်သတ်မှတ်ချက်များ", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "မက်တာဒေတာ", + "@searchMetadataSectionTitle": {}, + "settingsSystemDefault": "စစ်စတမ်အတိုင်း", + "@settingsSystemDefault": {}, + "settingsModificationWarningDialogMessage": "အခြားဆက်တင်များကိုပါ ပြင်ဆင်မည်ဖြစ်ပါသည်။", + "@settingsModificationWarningDialogMessage": {}, + "settingsSearchFieldLabel": "ဆက်တင်များအတွင်း ရှာဖွေပါ", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "ကိုက်ညီသောဆက်တင် မရှိပါ", + "@settingsSearchEmpty": {}, + "appExportSettings": "ဆက်တင်များ", + "@appExportSettings": {}, + "settingsDisabled": "ပိတ်ထား", + "@settingsDisabled": {}, + "settingsNavigationSectionTitle": "နေရာချခြင်း", + "@settingsNavigationSectionTitle": {}, + "settingsHomeDialogTitle": "မူလအဖြစ်", + "@settingsHomeDialogTitle": {}, + "settingsHomeTile": "မူလအဖြစ်", + "@settingsHomeTile": {}, + "settingsKeepScreenOnTile": "စကရင်မပိတ်ပါနှင့်", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "စကရင်မပိတ်ပါနှင့်", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "“နောက်သို့” ခလုတ်ကိုထပ်နှိပ်မှ ထွက်ရန်", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "အတည်ပြုဒိုင်ယာလော့ခ်များ", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "အတည်ပြုဒိုင်ယာလော့ခ်များ", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "ပုံများကို အပြီးမဖျက်ခင်ပြန်မေးရန်", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "ပြန်သုံးအမှိုက်ပုံးသို့မရွှေ့ခင် ပြန်မေးရန်", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "ရက်စွဲမပါသောပုံများကိုမရွှေ့ခင် ပြန်မေးရန်", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "ပြန်သုံးအမှိုက်ပုံးထဲထည့်ပြီးလျှင် ပြီးကြောင်း စာဖြင့်ပြပေးရန်", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsConfirmationVaultDataLoss": "လျှို့ဝှက်သိုလှောင်ခန်းရှိ ဒေတာဆုံးရှုံးမှုသတိပေးချက်များ ပြပေးရန်", + "@settingsConfirmationVaultDataLoss": {}, + "albumCamera": "ကင်မရာ", + "@albumCamera": {}, + "albumScreenshots": "Screenshot များ", + "@albumScreenshots": {}, + "albumScreenRecordings": "စကရင် recording များ", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "ဗီဒီယိုဖမ်းယူထားသည်များ", + "@albumVideoCaptures": {}, + "albumEmpty": "အယ်လ်ဘမ်တစ်ခုမှ မရှိပါ", + "@albumEmpty": {}, + "createAlbumButtonLabel": "ဖန်တီးမည်", + "@createAlbumButtonLabel": {}, + "countryPageTitle": "နိုင်ငံများ", + "@countryPageTitle": {}, + "countryEmpty": "နိုင်ငံတစ်ခုမှ မရှိပါ", + "@countryEmpty": {}, + "searchDateSectionTitle": "ရက်စွဲ", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "အယ်လ်ဘမ်များ", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "နိုင်ငံများ", + "@searchCountriesSectionTitle": {}, + "newAlbumDialogNameLabel": "အယ်လ်ဘမ်အမည်", + "@newAlbumDialogNameLabel": {}, + "hideFilterConfirmationDialogMessage": "ယခုစစ်ထုတ်မှုနှင့် ကိုက်ညီသော ဓာတ်ပုံနှင့်ဗီဒီယိုများကို စုစည်းမှုထဲမှ ဝှက်ထားမည်ဖြစ်ပါသည်။ ပြန်ဖော်ချင်ပါက “ကိုယ်ရေးကိုယ်တာလုံခြုံမှု” ဆက်တင်ထဲကနေ ပြန်ဖော်နိုင်ပါသည်။\n\nဝှက်ထားချင်တာ သေချာပါသလား?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "အယ်လ်ဘမ်အသစ်", + "@newAlbumDialogTitle": {}, + "patternDialogEnter": "Pattern ဆွဲပါ", + "@patternDialogEnter": {}, + "videoStreamSelectionDialogOff": "ပိတ်ထား", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogNoSelection": "တခြားအပုဒ်မရှိပါ။", + "@videoStreamSelectionDialogNoSelection": {}, + "videoStreamSelectionDialogTrack": "အပုဒ်", + "@videoStreamSelectionDialogTrack": {}, + "genericSuccessFeedback": "လုပ်ဆောင်ပြီးပါပြီ!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "လုပ်ဆောင်မှုမအောင်မြင်ပါ", + "@genericFailureFeedback": {}, + "genericDangerWarningDialogMessage": "သေချာပါသလား?", + "@genericDangerWarningDialogMessage": {}, + "tooManyItemsErrorDialogMessage": "ဓာတ်ပုံ/ဗီဒီယိုနည်းနည်းလေးနဲ့ ပြန်စမ်းကြည့်ပါ။", + "@tooManyItemsErrorDialogMessage": {}, + "viewDialogSortSectionTitle": "အပေါ်အောက် စီခြင်း", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "စုပြခြင်း", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "အပြင်အဆင်", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "ပြောင်းပြန်စီရန်", + "@viewDialogReverseSortOrder": {}, + "menuActionStats": "စာရင်းအင်း", + "@menuActionStats": {}, + "tileLayoutMosaic": "Mosaic ပုံစံ", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "ဇယားကွက်ပုံစံ", + "@tileLayoutGrid": {}, + "tileLayoutList": "စာရင်းပုံစံ", + "@tileLayoutList": {}, + "coverDialogTabCover": "ကာဗာပိုင်း", + "@coverDialogTabCover": {}, + "aboutBugReportButton": "တင်ပြမည်", + "@aboutBugReportButton": {}, + "aboutDataUsageData": "ဒေတာ", + "@aboutDataUsageData": {}, + "aboutDataUsageCache": "Cache", + "@aboutDataUsageCache": {}, + "aboutDataUsageDatabase": "ဒေတာဘေ့စ်", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageInternal": "စက်တွင်း", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "စက်ပြင်ပ", + "@aboutDataUsageExternal": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter Package များ", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart Package များ", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "လိုင်စင်အားလုံးကြည့်ရန်", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "ကိုယ်ရေးကိုယ်တာလုံခြုံမှု မူဝါဒ", + "@policyPageTitle": {}, + "collectionGroupAlbum": "အယ်လ်ဘမ်အလိုက်", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "လအလိုက်", + "@collectionGroupMonth": {}, + "collectionSearchTitlesHintText": "ခေါင်းစဥ်ကို ရှာဖွေပါ", + "@collectionSearchTitlesHintText": {}, + "collectionGroupDay": "ရက်အလိုက်", + "@collectionGroupDay": {}, + "settingsActionExport": "ဆက်တင်များပို့ရန်", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "ဆက်တင်များပို့ခြင်း", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "ဆက်တင်များသွင်းရန်", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "ဆက်တင်များသွင်းခြင်း", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "ကာဗာပုံများ", + "@appExportCovers": {}, + "drawerAlbumPage": "အယ်လ်ဘမ်", + "@drawerAlbumPage": {}, + "drawerCountryPage": "နိုင်ငံ", + "@drawerCountryPage": {}, + "drawerPlacePage": "နေရာ", + "@drawerPlacePage": {}, + "drawerTagPage": "Tags", + "@drawerTagPage": {}, + "sortByDate": "ရက်စွဲအလိုက်", + "@sortByDate": {}, + "sortByName": "အမည်အလိုက်", + "@sortByName": {}, + "sortByItemCount": "ပုံအရေအတွက်အလိုက်", + "@sortByItemCount": {}, + "sortOrderLargestFirst": "အကြီးဆုံးက ထိပ်ဆုံး", + "@sortOrderLargestFirst": {}, + "sortOrderLowestFirst": "အနိမ့်ဆုံးက ထိပ်ဆုံး", + "@sortOrderLowestFirst": {}, + "sortOrderSmallestFirst": "အသေးဆုံးက ထိပ်ဆုံး", + "@sortOrderSmallestFirst": {}, + "settingsNavigationDrawerBanner": "မီနူးပစ္စည်းများကိုရွှေ့ရန်နှင့်စီရန် ဆက်တိုက်ထိထားပါ။", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "အမျိုးအစားများ", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "အယ်လ်ဘမ်များ", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "စာမျက်နှာများ", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "အယ်လ်ဘမ်ထပ်ထည့်ရန်", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailShowFavouriteIcon": "အကြိုက်ဆုံးအိုင်ကွန်ကို ပြရန်", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Tag အိုင်ကွန်ကိုပြရန်", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "တည်နေရာအိုင်ကွန်ကိုပြရန်", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "လှုပ်ရှားမှုပါသောပုံ အိုင်ကွန်ကိုပြရန်", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "အဆင့်သတ်မှတ်ချက်ကို ပြရန်", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Raw အိုင်ကွန်ကိုပြရန်", + "@settingsThumbnailShowRawIcon": {}, + "albumGroupType": "အမျိုးအစားအလိုက်", + "@albumGroupType": {}, + "albumGroupVolume": "သိုလှောင်မှုပမာဏအလိုက်", + "@albumGroupVolume": {}, + "albumGroupTier": "အဆင့်အလိုက်", + "@albumGroupTier": {}, + "albumMimeTypeMixed": "ရောထား", + "@albumMimeTypeMixed": {}, + "setCoverDialogAuto": "အလိုအလျောက်", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "စိတ်ကြိုက်", + "@setCoverDialogCustom": {}, + "newVaultWarningDialogMessage": "လျှို့ဝှက်သိုလှောင်ခန်းရှိ ဓာတ်ပုံနှင့်ဗီဒီယိုများကို ဤအက်ပ်တွင်သာမြင်ရမည်ဖြစ်ပြီး အခြားအက်ပ်များတွင် မမြင်ရနိုင်ပါ။\n\nဤအက်ပ်ကိုဖျက်လိုက်သည်ဖြစ်စေ၊ အက်ပ်ဒေတာကိုရှင်းလင်းလိုက်သည်ဖြစ်စေ ၎င်းဓာတ်ပုံနှင့်ဗီဒီယိုအားလုံးကို ဆုံးရှုံးသွားမည်ဖြစ်ပါသည်။", + "@newVaultWarningDialogMessage": {}, + "configureVaultDialogTitle": "လျှို့ဝှက်သိုလှောင်ခန်းကို ပြင်ဆင်ခြင်း", + "@configureVaultDialogTitle": {}, + "patternDialogConfirm": "Pattern ကို အတည်ပြုပါ", + "@patternDialogConfirm": {}, + "pinDialogEnter": "PIN နံပါတ် ရိုက်ထည့်ပါ", + "@pinDialogEnter": {}, + "pinDialogConfirm": "PIN နံပါတ်ကို အတည်ပြုပါ", + "@pinDialogConfirm": {}, + "renameEntrySetPageInsertTooltip": "အကွက်ထည့်မည်", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "အစမ်းကြည့်ခြင်း", + "@renameEntrySetPagePreviewSectionTitle": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{ဒီအယ်လ်ဘမ်တွေနဲ့ အဲ့ဒီထဲက ဓာတ်ပုံ/ဗီဒီယိုကိုဖျက်မှာလား?} =2{ဒီအယ်လ်ဘမ်တွေနဲ့ အဲ့ဒီထဲက ဓာတ်ပုံ/ဗီဒီယိုနှစ်ခုကိုဖျက်မှာလား?} other{ဒီအယ်လ်ဘမ်တွေနဲ့ အဲ့ဒီထဲက ဓာတ်ပုံ/ဗီဒီယို {count} ခုကို ဖျက်မှာလား?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "exportEntryDialogWriteMetadata": "မက်တာဒေတာများပါ ကော်ပီကူးရန်", + "@exportEntryDialogWriteMetadata": {}, + "renameEntryDialogLabel": "အမည်အသစ်", + "@renameEntryDialogLabel": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{ယခုအယ်လ်ဘမ်နဲ့ အဲ့ဒီထဲက ဓာတ်ပုံ/ဗီဒီယိုကိုဖျက်မှာလား?} =2{ယခုအယ်လ်ဘမ်နဲ့ အဲ့ဒီထဲက ဓာတ်ပုံ/ဗီဒီယိုနှစ်ခုကိုဖျက်မှာလား?} other{ယခုအယ်လ်ဘမ်နဲ့ အဲ့ဒီထဲက ဓာတ်ပုံ/ဗီဒီယို {count} ခုကို ဖျက်မှာလား?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "လှုပ်ရှားမှုပါသောပုံအတွင်းက ဗီဒီယိုကိုဖွင့်ရန် XMP ကို လိုအပ်ပါသည်။\n\nဖျက်ချင်တာသေချာပါသလား?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "editEntryDialogCopyFromItem": "တခြားပုံကနေ ကော်ပီကူးမည်", + "@editEntryDialogCopyFromItem": {}, + "aboutDataUsageSectionTitle": "ဒေတာသုံးစွဲမှု", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageMisc": "အခြား", + "@aboutDataUsageMisc": {}, + "aboutCreditsWorldAtlas2": "မှ TopoJSON ဖိုင်ကို ISC လိုင်စင်အောက်တွင် အသုံးပြုထားသည်။", + "@aboutCreditsWorldAtlas2": {}, + "aboutCreditsWorldAtlas1": "ဤအက်ပ်သည်", + "@aboutCreditsWorldAtlas1": {}, + "aboutTranslatorsSectionTitle": "ဘာသာပြန်သူများ", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Open-Source လိုင်စင်များ", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android Library များ", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter Plugin များ", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesBanner": "ဤအက်ပ်သည် အောက်ပါ open-source package များနှင့် library များကို အသုံးပြုထားသည်။", + "@aboutLicensesBanner": {}, + "collectionActionRescan": "ပြန်စကင်ဖတ်ရန်", + "@collectionActionRescan": {}, + "collectionActionEdit": "ပြင်ဆင်ရန်", + "@collectionActionEdit": {}, + "collectionActionCopy": "အယ်လ်ဘမ်သို့ကော်ပီကူးရန်", + "@collectionActionCopy": {}, + "collectionActionMove": "အယ်လ်ဘမ်သို့ရွှေ့ရန်", + "@collectionActionMove": {}, + "dateYesterday": "မနေ့က", + "@dateYesterday": {}, + "sectionUnknown": "မသိထားသည်များ", + "@sectionUnknown": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{ပုံ/ဗီဒီယိုတစ်ခုကို ရွှေ့လို့မရခဲ့ပါ} =2{ပုံ/ဗီဒီယိုနှစ်ခုကို ရွှေ့လို့မရခဲ့ပါ} other{ပုံ/ဗီဒီယို {count} ခုကို ရွှေ့လို့မရခဲ့ပါ}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionDeleteFailureFeedback": "{count, plural, =1{ပုံ/ဗီဒီယိုတစ်ခုကို ဖျက်လို့မရခဲ့ပါ} =2{ပုံ/ဗီဒီယိုနှစ်ခုကို ဖျက်လို့မရခဲ့ပါ} other{ပုံ/ဗီဒီယို {count} ခုကို ဖျက်လို့မရခဲ့ပါ}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameFailureFeedback": "{count, plural, =1{ပုံ/ဗီဒီယိုတစ်ခုကို အမည်ပြောင်းလို့ မရခဲ့ပါ} =2{ပုံ/ဗီဒီယိုနှစ်ခုကို အမည်ပြောင်းလို့ မရခဲ့ပါ} other{ပုံ/ဗီဒီယို {count} ခုကို အမည်ပြောင်းလို့ မရခဲ့ပါ}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{ပုံ/ဗီဒီယိုတစ်ခုကို ပြင်ဆင်လို့မရခဲ့ပါ} =2{ပုံ/ဗီဒီယိုနှစ်ခုကို ပြင်ဆင်လို့မရခဲ့ပါ} other{ပုံ/ဗီဒီယို {count} ခုကို ပြင်ဆင်လို့မရခဲ့ပါ}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dateToday": "ယနေ့", + "@dateToday": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{ပုံ/ဗီဒီယိုတစ်ခုကို ကော်ပီကူးလို့မရခဲ့ပါ} =2{ပုံ/ဗီဒီယိုနှစ်ခုကို ကော်ပီကူးလို့မရခဲ့ပါ} other{ပုံ/ဗီဒီယို {count} ခုကို ကော်ပီကူးလို့မရခဲ့ပါ}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{စာမျက်နှာတစ်မျက်နှာကို ပို့လို့မရခဲ့ပါ} =2{စာမျက်နှာနှစ်မျက်နှာကို ပို့လို့မရခဲ့ပါ} other{စာမျက်နှာ {count} မျက်နှာကို ပို့လို့မရခဲ့ပါ}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dateThisMonth": "ယခုလ", + "@dateThisMonth": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{ပုံ/ဗီဒီယိုတစ်ခုကို ကော်ပီကူးလိုက်သည်} =2{ပုံ/ဗီဒီယိုနှစ်ခုကို ကော်ပီကူးလိုက်သည်} other{ပုံ/ဗီဒီယို {count} ခုကို ကော်ပီကူးလိုက်သည်}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{ပုံ/ဗီဒီယိုတစ်ခုကို အမည်ပြောင်းလိုက်သည်} =2{ပုံ/ဗီဒီယိုနှစ်ခုကို အမည်ပြောင်းလိုက်သည်} other{ပုံ/ဗီဒီယို {count} ခုကို အမည်ပြောင်းလိုက်သည်}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{ပုံ/ဗီဒီယိုတစ်ခုကို ရွှေ့လိုက်သည်} =2{ပုံ/ဗီဒီယိုနှစ်ခုကို ရွှေ့လိုက်သည်} other{ပုံ/ဗီဒီယို {count} ခုကို ရွှေ့လိုက်သည်}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{ပုံ/ဗီဒီယိုတစ်ခုကို ပြင်ဆင်လိုက်သည်} =2{ပုံ/ဗီဒီယိုနှစ်ခုကို ပြင်ဆင်လိုက်သည်} other{ပုံ/ဗီဒီယို {count} ခုကို ပြင်ဆင်လိုက်သည်}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyImages": "ပုံတစ်ပုံမှမရှိပါ", + "@collectionEmptyImages": {}, + "collectionDeselectSectionTooltip": "အစိတ်အပိုင်းကို မရွေးတော့ပါ", + "@collectionDeselectSectionTooltip": {}, + "drawerSettingsButton": "ဆက်တင်များ", + "@drawerSettingsButton": {}, + "drawerCollectionImages": "ဓာတ်ပုံ", + "@drawerCollectionImages": {}, + "drawerCollectionFavourites": "အကြိုက်ဆုံး", + "@drawerCollectionFavourites": {}, + "drawerCollectionVideos": "ဗီဒီယို", + "@drawerCollectionVideos": {}, + "collectionEmptyFavourites": "အကြိုက်ဆုံးတစ်ခုမှ မရှိပါ", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "ဗီဒီယိုတစ်ခုမှမရှိပါ", + "@collectionEmptyVideos": {}, + "sortOrderZtoA": "Z ကနေ A", + "@sortOrderZtoA": {}, + "sortByRating": "အဆင့်သတ်မှတ်ချက်အလိုက်", + "@sortByRating": {}, + "albumDownload": "ဒေါင်းလုဒ်", + "@albumDownload": {}, + "albumPageTitle": "အယ်လ်ဘမ်များ", + "@albumPageTitle": {}, + "appExportFavourites": "အကြိုက်ဆုံးများ", + "@appExportFavourites": {}, + "albumPickPageTitleCopy": "အယ်လ်ဘမ်သို့ ကော်ပီကူးခြင်း", + "@albumPickPageTitleCopy": {}, + "settingsThumbnailShowVideoDuration": "ဗီဒီယိုကြာချိန်ကို ပြရန်", + "@settingsThumbnailShowVideoDuration": {}, + "settingsPageTitle": "ဆက်တင်များ", + "@settingsPageTitle": {}, + "settingsAskEverytime": "အမြဲတမ်းပြန်မေးရန်", + "@settingsAskEverytime": {}, + "settingsPrivacySectionTitle": "ကိုယ်ရေးအချက်အလက်လုံခြုံမှု", + "@settingsPrivacySectionTitle": {}, + "settingsEnableBinSubtitle": "ဖျက်ထားသည့်ပုံများကို ရက် ၃၀ အထိ ဆက်သိမ်းထားပါမည်", + "@settingsEnableBinSubtitle": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "အလျားလိုက် စာသားနေရာ", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsViewerSlideshowPageTitle": "ဆလိုက်ရှိုး", + "@settingsViewerSlideshowPageTitle": {}, + "settingsViewerSectionTitle": "ကြည့်ရှုသည့်စာမျက်နှာ", + "@settingsViewerSectionTitle": {}, + "settingsAllowInstalledAppAccessSubtitle": "အယ်လ်ဘမ်ပြသမှုပိုမိုကောင်းမွန်စေဖို့ အသုံးပြုပါသည်", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsSubtitleThemeTextColor": "စာသားအရောင်", + "@settingsSubtitleThemeTextColor": {}, + "settingsVideoSectionTitle": "ဗီဒီယို", + "@settingsVideoSectionTitle": {}, + "settingsSubtitleThemeBackgroundColor": "နောက်ခံအရောင်", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsVideoAutoPlay": "အလိုအလျောက်ဖွင့်ခြင်း", + "@settingsVideoAutoPlay": {}, + "settingsVideoEnableHardwareAcceleration": "Hardware အသုံးပြုအရှိန်မြှင့်တင်ခြင်း", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "ပုံတွေကိုရွေးချယ်ရာမှာ ပြသမယ့်လုပ်ဆောင်မှုတွေကို ရွေးချယ်ပါ။ ခလုတ်တွေကိုရွှေ့လျှင် ဆက်တိုက်ထိထားပြီးရွှေ့ပါ။", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsSlideshowShuffle": "ဟိုရောက်လိုက် ဒီရောက်လိုက်", + "@settingsSlideshowShuffle": {}, + "settingsVideoShowVideos": "ဗီဒီယိုများပါ ပြရန်", + "@settingsVideoShowVideos": {}, + "settingsViewerShowInformation": "အချက်အလက်များကို ပြရန်", + "@settingsViewerShowInformation": {}, + "settingsCollectionQuickActionsTile": "အမြန်လုပ်ဆောင်မှု", + "@settingsCollectionQuickActionsTile": {}, + "settingsViewerOverlayTile": "Overlay", + "@settingsViewerOverlayTile": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "ဒေါင်လိုက် စာသားနေရာ", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSlideshowIntervalTile": "အကူးအပြောင်းမလုပ်ခင် ကြားအချိန်", + "@settingsSlideshowIntervalTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "အမြန်လုပ်ဆောင်မှု", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsStorageAccessRevokeTooltip": "ပြန်ရုပ်သိမ်းမည်", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsSubtitleThemeTile": "စာတန်းထိုး", + "@settingsSubtitleThemeTile": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "အပေါ်အောက်ပွတ်ဆွဲလျှင် brightness/အသံ အတိုးအလျှော့လုပ်ရန်", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsSlideshowFillScreen": "စကရင်အပြည့်", + "@settingsSlideshowFillScreen": {}, + "settingsVideoGestureDoubleTapTogglePlay": "နှစ်ချက်ထိလျှင် ဖွင့်ကြည့်/ရပ်ရန်", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsEnableBin": "ပြန်သုံးအမှိုက်ပုံးကို သုံးရန်", + "@settingsEnableBin": {}, + "settingsSubtitleThemeTextAlignmentLeft": "ဘယ်ဘက်", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsVideoGestureSideDoubleTapSeek": "စကရင်အစွန်းကို နှစ်ချက်ထိလျှင် ရှေ့သွား/နောက်ဆုတ်ရန်", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsSubtitleThemeTextAlignmentRight": "ညာဘက်", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsAllowMediaManagement": "မီဒီယာစီမံခန့်ခွဲခွင့် ပေးရန်", + "@settingsAllowMediaManagement": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "ပုံတွေကိုရှာဖွေကြည့်ရှုရာမှာ ပြသမယ့်လုပ်ဆောင်မှုတွေကို ရွေးချယ်ပါ။ ခလုတ်တွေကိုရွှေ့လျှင် ဆက်တိုက်ထိထားပြီးရွှေ့ပါ။", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsViewerShowInformationSubtitle": "ခေါင်းစဥ်၊ ရက်စွဲ၊ တည်နေရာ စသဖြင့်", + "@settingsViewerShowInformationSubtitle": {}, + "settingsSlideshowRepeat": "ပြန်ကျော့ရန်", + "@settingsSlideshowRepeat": {}, + "settingsViewerQuickActionEditorPageTitle": "အမြန်လုပ်ဆောင်မှု", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsVideoPageTitle": "ဗီဒီယိုဆက်တင်များ", + "@settingsVideoPageTitle": {}, + "settingsViewerUseCutout": "Notch နေရာပါ သုံးရန်", + "@settingsViewerUseCutout": {}, + "settingsViewerGestureSideTapNext": "စကရင်အစွန်းကို ထိလိုက်လျှင် အရှေ့/အနောက်ကတစ်ပုံကိုပြရန်", + "@settingsViewerGestureSideTapNext": {}, + "settingsSubtitleThemeTextAlignmentCenter": "အလယ်", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentTile": "အလျားလိုက် စာသားနေရာ", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsCollectionQuickActionTabSelecting": "ရွေးချယ်ရာမှာ", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsAllowErrorReporting": "အမည်မဲ့ error တင်ပြမှုများကို ခွင့်ပြုရန်", + "@settingsAllowErrorReporting": {}, + "settingsVideoLoopModeTile": "ပြန်ကျော့ခြင်း", + "@settingsVideoLoopModeTile": {}, + "settingsVideoBackgroundMode": "နောက်ခံတွင် ဖွင့်ထားခြင်း", + "@settingsVideoBackgroundMode": {}, + "settingsAllowInstalledAppAccess": "စက်တွင်းထည့်သွင်းထားသည့် အက်ပ်စာရင်း ကြည့်ရှုခွင့်ပေးရန်", + "@settingsAllowInstalledAppAccess": {}, + "settingsSlideshowAnimatedZoomEffect": "ချဲ့ကားလာသည့် effect", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsViewerOverlayPageTitle": "Overlay", + "@settingsViewerOverlayPageTitle": {}, + "settingsHiddenItemsTile": "ဝှက်ထားသည့်ပုံများ", + "@settingsHiddenItemsTile": {}, + "settingsCollectionBurstPatternsNone": "ဘာမှမထား", + "@settingsCollectionBurstPatternsNone": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "ရရှိနိုင်သော ခလုတ်များ", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerShowDescription": "ဖော်ပြချက်ကိုပြရန်", + "@settingsViewerShowDescription": {}, + "settingsViewerQuickActionEditorBanner": "ပုံတွေကိုကြည့်ရှုချိန် ပြသမယ့်လုပ်ဆောင်မှုတွေကို ရွေးချယ်ပါ။ ခလုတ်တွေကိုရွှေ့လျှင် ဆက်တိုက်ထိထားပြီးရွှေ့ပါ။", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsDisablingBinWarningDialogMessage": "ပြန်သုံးအမှိုက်ပုံးထဲက ဓာတ်ပုံနဲ့ ဗီဒီယိုတွေကို အပြီးဖျက်လိုက်မှာပါ။", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "ပြသမည့်ခလုတ်များ", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsVideoPlaybackPageTitle": "ဖွင့်ကြည့်ခြင်း", + "@settingsVideoPlaybackPageTitle": {}, + "settingsHiddenItemsPageTitle": "ဝှက်ထားသည့်ပုံများ", + "@settingsHiddenItemsPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "အဖွင့်တွင် ပြရန်", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowShootingDetails": "ရိုက်ကူးမှုအသေးစိတ်ကို ပြရန်", + "@settingsViewerShowShootingDetails": {}, + "settingsSlideshowTransitionTile": "အကူးအပြောင်း", + "@settingsSlideshowTransitionTile": {}, + "settingsViewerMaximumBrightness": "Brightness အမြင့်ဆုံးထားရန်", + "@settingsViewerMaximumBrightness": {}, + "settingsStorageAccessEmpty": "ဝင်ရောက်ကြည့်ရှုခွင့်ပေးထားတာမရှိပါ", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessBanner": "တချို့ directory တွေဟာ သူတို့ထဲကဖိုင်တွေကို ပြင်ဆင်ဖို့ ဝင်ရောက်ကြည့်ရှုခွင့်အတိအကျပေးဖို့ လိုအပ်ပါတယ်။ သင်အရင်က ဝင်ရောက်ကြည့်ရှုခွင့်ပေးခဲ့တဲ့ directory တွေကို ဒီနေရာမှာ သုံးသပ်နိုင်ပါတယ်။", + "@settingsStorageAccessBanner": {}, + "settingsViewerShowMinimap": "မြေပုံအသေးစားလေးကို ပြရန်", + "@settingsViewerShowMinimap": {}, + "settingsCollectionBurstPatternsTile": "ဆက်တိုက်ရိုက်ဓာတ်ပုံများ၏ ဖိုင်ပုံစံ", + "@settingsCollectionBurstPatternsTile": {}, + "settingsImageBackground": "ဓာတ်ပုံနောက်ခံ", + "@settingsImageBackground": {}, + "settingsVideoLoopModeDialogTitle": "ပြန်ကျော့ခြင်း", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsViewerShowOverlayThumbnails": "Thumbnail ကို ပြရန်", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsVideoControlsPageTitle": "ထိန်းချုပ်မှုများ", + "@settingsVideoControlsPageTitle": {}, + "settingsSlideshowVideoPlaybackTile": "ဗီဒီယိုဖွင့်ကြည့်ခြင်း", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsStorageAccessPageTitle": "သိုလှောင်ခန်းဝင်ရောက်ကြည့်ရှုခွင့်", + "@settingsStorageAccessPageTitle": {}, + "settingsSubtitleThemeBackgroundOpacity": "နောက်ခံထင်ရှားမှု", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsStorageAccessTile": "သိုလှောင်ခန်းဝင်ရောက်ကြည့်ရှုခွင့်", + "@settingsStorageAccessTile": {}, + "settingsViewerQuickActionEmpty": "ခလုတ်တစ်ခုမှမရှိပါ", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerSlideshowTile": "ဆလိုက်ရှိုး", + "@settingsViewerSlideshowTile": {}, + "settingsSubtitleThemeTextOpacity": "စာသားထင်ရှားမှု", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsViewerShowRatingTags": "အဆင့်သတ်မှတ်ချက်နှင့် tag များကို ပြရန်", + "@settingsViewerShowRatingTags": {}, + "settingsMotionPhotoAutoPlay": "လှုပ်ရှားမှုပါသောပုံတွေကို အလိုအလျောက်ပလေးရန်", + "@settingsMotionPhotoAutoPlay": {}, + "settingsVideoControlsTile": "ထိန်းချုပ်မှုများ", + "@settingsVideoControlsTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "ဗီဒီယိုဖွင့်ကြည့်ခြင်း", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsSubtitleThemeShowOutline": "စာသားကောက်ကြောင်းနှင့် အရိပ်ကို ပြရန်", + "@settingsSubtitleThemeShowOutline": {}, + "settingsViewerQuickActionsTile": "အမြန်လုပ်ဆောင်မှု", + "@settingsViewerQuickActionsTile": {}, + "settingsSubtitleThemePageTitle": "စာတန်းထိုး", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeTextPositionTile": "ဒေါင်လိုက် စာသားနေရာ", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsVideoBackgroundModeDialogTitle": "နောက်ခံတွင် ဖွင့်ထားခြင်း", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsSubtitleThemeTextSize": "စာသားအရွယ်အစား", + "@settingsSubtitleThemeTextSize": {}, + "settingsCollectionQuickActionTabBrowsing": "ရှာဖွေကြည့်ရှုရာမှာ", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsVideoButtonsTile": "ခလုတ်", + "@settingsVideoButtonsTile": {}, + "settingsSubtitleThemeSample": "ဒါက ဥပမာပြတာပါ။", + "@settingsSubtitleThemeSample": {}, + "settingsSaveSearchHistory": "ရှာဖွေမှုမှတ်တမ်းကို သိမ်းထားရန်", + "@settingsSaveSearchHistory": {}, + "settingsViewerShowHistogram": "Histogram ကို ပြရန်", + "@settingsViewerShowHistogram": {}, + "settingsVideoPlaybackTile": "ဖွင့်ကြည့်ခြင်း", + "@settingsVideoPlaybackTile": {}, + "chipActionShowCollection": "စုစည်းမှုထဲမှာ ပြရန်", + "@chipActionShowCollection": {}, + "chipActionDecompose": "ဖြတ်ထုတ်ရန်", + "@chipActionDecompose": {}, + "chipActionGroup": "အုပ်စုဖွဲ့မည်", + "@chipActionGroup": {}, + "stopTooltip": "ရပ်ရန်", + "@stopTooltip": {}, + "createButtonLabel": "အသစ်ထည့်ရန်", + "@createButtonLabel": {}, + "chipActionRemove": "ဖယ်ရှားမည်", + "@chipActionRemove": {}, + "chipActionGoToExplorerPage": "Explorer ထဲတွင်ပြမည်", + "@chipActionGoToExplorerPage": {}, + "chipActionCreateGroup": "အုပ်စုအသစ်ပြုလုပ်မည်", + "@chipActionCreateGroup": {} +} diff --git a/lib/l10n/app_nb.arb b/lib/l10n/app_nb.arb new file mode 100644 index 0000000..d510f96 --- /dev/null +++ b/lib/l10n/app_nb.arb @@ -0,0 +1,1488 @@ +{ + "welcomeOptional": "Valgfritt", + "@welcomeOptional": {}, + "deleteButtonLabel": "SLETT", + "@deleteButtonLabel": {}, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "changeTooltip": "Endre", + "@changeTooltip": {}, + "clearTooltip": "Tøm", + "@clearTooltip": {}, + "previousTooltip": "Forrige", + "@previousTooltip": {}, + "nextTooltip": "Neste", + "@nextTooltip": {}, + "doNotAskAgain": "Ikke spør igjen", + "@doNotAskAgain": {}, + "chipActionGoToAlbumPage": "Vis i album", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Vis i land", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "Vis i etiketter", + "@chipActionGoToTagPage": {}, + "doubleBackExitMessage": "Trykk «Tilbake» igjen for å avslutte.", + "@doubleBackExitMessage": {}, + "chipActionUnpin": "Løsne fra toppen", + "@chipActionUnpin": {}, + "chipActionRename": "Gi nytt navn", + "@chipActionRename": {}, + "chipActionFilterOut": "Ekskluder", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Inkluder", + "@chipActionFilterIn": {}, + "entryActionCopyToClipboard": "Kopier til utklippstavle", + "@entryActionCopyToClipboard": {}, + "entryActionRename": "Gi nytt navn", + "@entryActionRename": {}, + "entryActionOpen": "Åpne med", + "@entryActionOpen": {}, + "entryActionSetAs": "Sett som", + "@entryActionSetAs": {}, + "entryActionRotateCCW": "Roter mot klokken", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Roter med klokken", + "@entryActionRotateCW": {}, + "entryActionShare": "Del", + "@entryActionShare": {}, + "entryActionViewSource": "Vis kilde", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "Vis som overlagskart", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Konverter til stillbilde", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Åpne video", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Rediger", + "@entryActionEdit": {}, + "entryActionAddFavourite": "Legg til i favoritter", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Fjern fra favoritter", + "@entryActionRemoveFavourite": {}, + "videoActionMute": "Forstum", + "@videoActionMute": {}, + "videoActionUnmute": "Opphev forstummelse", + "@videoActionUnmute": {}, + "videoActionReplay10": "Blafre bakover 10 sekunder", + "@videoActionReplay10": {}, + "videoActionSkip10": "Blafre forover 10 sekunder", + "@videoActionSkip10": {}, + "videoActionSetSpeed": "Avspillingshastighet", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "Innstillinger", + "@viewerActionSettings": {}, + "entryInfoActionEditTitleDescription": "Rediger navn og beskrivelse", + "@entryInfoActionEditTitleDescription": {}, + "filterNoDateLabel": "Udatert", + "@filterNoDateLabel": {}, + "filterNoLocationLabel": "Uten posisjon", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Uvurdert", + "@filterNoRatingLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterNoTagLabel": "Uten etiketter", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Uten navn", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "På denne dagen", + "@filterOnThisDayLabel": {}, + "filterRatingRejectedLabel": "Avslått", + "@filterRatingRejectedLabel": {}, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "mapStyleGoogleHybrid": "Google Maps (hybrid)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (terreng)", + "@mapStyleGoogleTerrain": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "mapStyleOsmHot": "Humanitært OSM", + "@mapStyleOsmHot": {}, + "accessibilityAnimationsRemove": "Forhindre skjermeffekter", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Behold skjermeffekter", + "@accessibilityAnimationsKeep": {}, + "themeBrightnessDark": "Mørk", + "@themeBrightnessDark": {}, + "themeBrightnessLight": "Lys", + "@themeBrightnessLight": {}, + "viewerTransitionZoomIn": "Forstørr", + "@viewerTransitionZoomIn": {}, + "storageVolumeDescriptionFallbackPrimary": "Internlagring", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD-kort", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "rotmappe", + "@rootDirectoryDescription": {}, + "widgetOpenPageCollection": "Åpne samling", + "@widgetOpenPageCollection": {}, + "nameConflictDialogMultipleSourceMessage": "Noen filer har samme navn.", + "@nameConflictDialogMultipleSourceMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Lagre datoer", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeButtonLabel": "FORTSETT", + "@videoResumeButtonLabel": {}, + "renameEntrySetPageTitle": "Gi nytt navn", + "@renameEntrySetPageTitle": {}, + "exportEntryDialogFormat": "Format:", + "@exportEntryDialogFormat": {}, + "editEntryDateDialogTitle": "Dato og tid", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Sett egendefinert dato", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Kopier fra annen dato", + "@editEntryDateDialogCopyField": {}, + "editEntryLocationDialogLatitude": "Breddegrad", + "@editEntryLocationDialogLatitude": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Lyd", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogOff": "Av", + "@videoStreamSelectionDialogOff": {}, + "genericSuccessFeedback": "Ferdig", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Mislykket", + "@genericFailureFeedback": {}, + "menuActionSelect": "Velg", + "@menuActionSelect": {}, + "menuActionSlideshow": "Lysbildevisning", + "@menuActionSlideshow": {}, + "menuActionStats": "Statistikk", + "@menuActionStats": {}, + "appPickDialogNone": "Ingen", + "@appPickDialogNone": {}, + "aboutPageTitle": "Om", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Lisens", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Personvernspraksis", + "@aboutLinkPolicy": {}, + "aboutCreditsWorldAtlas2": "under ISC-lisens.", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Oversettere", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Frie lisenser", + "@aboutLicensesSectionTitle": {}, + "policyPageTitle": "Personvernspraksis", + "@policyPageTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter-pakker", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart-pakker", + "@aboutLicensesDartPackagesSectionTitle": {}, + "collectionActionShowTitleSearch": "Vis navnefilter", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Skjul navnefilter", + "@collectionActionHideTitleSearch": {}, + "collectionSearchTitlesHintText": "Søk etter navn", + "@collectionSearchTitlesHintText": {}, + "collectionGroupMonth": "Etter måned", + "@collectionGroupMonth": {}, + "collectionEmptyImages": "Ingen bilder", + "@collectionEmptyImages": {}, + "drawerAboutButton": "Om", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Innstillinger", + "@drawerSettingsButton": {}, + "drawerCollectionFavourites": "Favoritter", + "@drawerCollectionFavourites": {}, + "drawerCollectionAll": "Alle samlinger", + "@drawerCollectionAll": {}, + "sortOrderAtoZ": "A-Å", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Å-A", + "@sortOrderZtoA": {}, + "newFilterBanner": "ny", + "@newFilterBanner": {}, + "settingsNavigationSectionTitle": "Navigasjon", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Hjem", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Hjem", + "@settingsHomeDialogTitle": {}, + "settingsDisabled": "Avskrudd", + "@settingsDisabled": {}, + "settingsSearchFieldLabel": "Søkeinnstillinger", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Ingen samsvarende innstilling", + "@settingsSearchEmpty": {}, + "settingsKeepScreenOnTile": "Behold skjermen påslått", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Behold skjermen påslått", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Trykk «Tilbake» to ganger for å avslutte", + "@settingsDoubleBackExit": {}, + "settingsNavigationDrawerTile": "Navigasjonsmeny", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Navigasjonsmeny", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerTabAlbums": "Album", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Sider", + "@settingsNavigationDrawerTabPages": {}, + "settingsViewerQuickActionEditorPageTitle": "Hurtighandlinger", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerShowInformationSubtitle": "Vis navn, dato, posisjon, osv.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerSlideshowPageTitle": "Lysbildevisning", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowAnimatedZoomEffect": "Animert forstørrelseseffekt", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "Overgang", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowVideoPlaybackTile": "Videoavspilling", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsVideoPageTitle": "Videoinnstillinger", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "settingsVideoEnableHardwareAcceleration": "Maskinvareakselerasjon", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoLoopModeTile": "Gjentagelsesmodus", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Gjentagelsesmodus", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Tekstjustering", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextColor": "Tekstfarge", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Tekst-dekkevne", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Bakgrunnsfarge", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Bakgrunnsdekkevne", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentRight": "Høyre", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoControlsTile": "Kontroller", + "@settingsVideoControlsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Dobbelttrykk for å spille/pause", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsPrivacySectionTitle": "Personvern", + "@settingsPrivacySectionTitle": {}, + "settingsEnableBin": "Bruk papirkurv", + "@settingsEnableBin": {}, + "settingsHiddenItemsTile": "Skjulte elementer", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Skjulte elementer", + "@settingsHiddenItemsPageTitle": {}, + "settingsRemoveAnimationsTile": "Fjern animasjoner", + "@settingsRemoveAnimationsTile": {}, + "settingsDisplaySectionTitle": "Visning", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Drakt", + "@settingsThemeBrightnessTile": {}, + "settingsCoordinateFormatDialogTitle": "Koordinatformat", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Enheter", + "@settingsUnitSystemTile": {}, + "settingsScreenSaverPageTitle": "Skjermsparer", + "@settingsScreenSaverPageTitle": {}, + "statsTopCountriesSectionTitle": "Toppland", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Toppsteder", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Topp-etiketter", + "@statsTopTagsSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Topp-album", + "@statsTopAlbumsSectionTitle": {}, + "viewerInfoLabelDescription": "Beskrivelse", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Navn", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelResolution": "Oppløsning", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Størrelse", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Sti", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Varighet", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Eier", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Koordinater", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Adresse", + "@viewerInfoLabelAddress": {}, + "openMapPageTooltip": "Vis på kartsiden", + "@openMapPageTooltip": {}, + "viewerInfoOpenLinkText": "Åpne", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Vis XML", + "@viewerInfoViewXmlLinkText": {}, + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Velkommen", + "@welcomeMessage": {}, + "welcomeTermsToggle": "Jeg samtykker til vilkår og betingelser", + "@welcomeTermsToggle": {}, + "filterRecentlyAddedLabel": "Nylig tillagt", + "@filterRecentlyAddedLabel": {}, + "filterTypeAnimatedLabel": "Animert", + "@filterTypeAnimatedLabel": {}, + "nextButtonLabel": "NESTE", + "@nextButtonLabel": {}, + "continueButtonLabel": "FORTSETT", + "@continueButtonLabel": {}, + "sourceStateLoading": "Laster inn", + "@sourceStateLoading": {}, + "chipActionCreateAlbum": "Opprett album", + "@chipActionCreateAlbum": {}, + "collectionGroupAlbum": "Etter album", + "@collectionGroupAlbum": {}, + "showButtonLabel": "VIS", + "@showButtonLabel": {}, + "hideButtonLabel": "SKJUL", + "@hideButtonLabel": {}, + "cancelTooltip": "Avbryt", + "@cancelTooltip": {}, + "showTooltip": "Vis", + "@showTooltip": {}, + "actionRemove": "Fjern", + "@actionRemove": {}, + "pickTooltip": "Velg", + "@pickTooltip": {}, + "chipActionSetCover": "Sett omslag", + "@chipActionSetCover": {}, + "hideTooltip": "Skjul", + "@hideTooltip": {}, + "saveTooltip": "Lagre", + "@saveTooltip": {}, + "resetTooltip": "Tilbakestill", + "@resetTooltip": {}, + "chipActionDelete": "Slett", + "@chipActionDelete": {}, + "entryActionRotateScreen": "Roter skjerm", + "@entryActionRotateScreen": {}, + "videoActionPlay": "Spill", + "@videoActionPlay": {}, + "entryInfoActionEditTags": "Rediger etiketter", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Fjern metadata", + "@entryInfoActionRemoveMetadata": {}, + "chipActionHide": "Skjul", + "@chipActionHide": {}, + "chipActionPin": "Fest til toppen", + "@chipActionPin": {}, + "entryActionDelete": "Slett", + "@entryActionDelete": {}, + "entryActionExport": "Eksporter", + "@entryActionExport": {}, + "videoActionPause": "Pause", + "@videoActionPause": {}, + "entryActionConvert": "Konverter", + "@entryActionConvert": {}, + "entryActionOpenMap": "Vis i kartprogram", + "@entryActionOpenMap": {}, + "entryActionInfo": "Info", + "@entryActionInfo": {}, + "entryActionRestore": "Gjenopprett", + "@entryActionRestore": {}, + "aboutBugSaveLogInstruction": "Lagre programlogger til fil", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoButton": "Kopier", + "@aboutBugCopyInfoButton": {}, + "slideshowActionShowInCollection": "Vis i samling", + "@slideshowActionShowInCollection": {}, + "sortOrderLargestFirst": "Største først", + "@sortOrderLargestFirst": {}, + "entryInfoActionEditDate": "Rediger dato og tid", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditRating": "Rediger vurdering", + "@entryInfoActionEditRating": {}, + "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, + "filterTypeMotionPhotoLabel": "Bevegelig bilde", + "@filterTypeMotionPhotoLabel": {}, + "filterMimeImageLabel": "Bilde", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "coordinateDmsWest": "V", + "@coordinateDmsWest": {}, + "filterTypeSphericalVideoLabel": "360°-video", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "coordinateFormatDecimal": "Desimalgrader", + "@coordinateFormatDecimal": {}, + "coordinateDmsEast": "Ø", + "@coordinateDmsEast": {}, + "videoLoopModeNever": "Aldri", + "@videoLoopModeNever": {}, + "videoLoopModeAlways": "Alltid", + "@videoLoopModeAlways": {}, + "keepScreenOnNever": "Aldri", + "@keepScreenOnNever": {}, + "albumTierRegular": "Andre", + "@albumTierRegular": {}, + "setCoverDialogAuto": "Auto", + "@setCoverDialogAuto": {}, + "renameEntrySetPagePatternFieldLabel": "Navngivningsmønster", + "@renameEntrySetPagePatternFieldLabel": {}, + "unitSystemMetric": "Metrisk", + "@unitSystemMetric": {}, + "unitSystemImperial": "Engelske måleenheter", + "@unitSystemImperial": {}, + "keepScreenOnAlways": "Alltid", + "@keepScreenOnAlways": {}, + "wallpaperTargetLock": "Lås skjerm", + "@wallpaperTargetLock": {}, + "albumTierApps": "Programmer", + "@albumTierApps": {}, + "videoLoopModeShortOnly": "Kun korte videoer", + "@videoLoopModeShortOnly": {}, + "videoControlsPlayOutside": "Åpne med annen avspiller", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "videoPlaybackSkip": "Hopp over", + "@videoPlaybackSkip": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Mappen finnes allerede", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "themeBrightnessBlack": "Svart", + "@themeBrightnessBlack": {}, + "albumTierNew": "Ny", + "@albumTierNew": {}, + "albumTierPinned": "Festet", + "@albumTierPinned": {}, + "renameEntrySetPagePreviewSectionTitle": "Forhåndsvis", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Teller", + "@renameProcessorCounter": {}, + "viewerTransitionNone": "Ingen", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Hjemmeskjerm", + "@wallpaperTargetHome": {}, + "wallpaperTargetHomeLock": "Hjem- og låseskjermer", + "@wallpaperTargetHomeLock": {}, + "otherDirectoryDescription": "«{name}»-mappen", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "addShortcutDialogLabel": "Snarveisetikett", + "@addShortcutDialogLabel": {}, + "setCoverDialogCustom": "Egendefinert", + "@setCoverDialogCustom": {}, + "newAlbumDialogTitle": "Nytt album", + "@newAlbumDialogTitle": {}, + "addShortcutButtonLabel": "LEGG TIL", + "@addShortcutButtonLabel": {}, + "newAlbumDialogNameLabel": "Albumsnavn", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogStorageLabel": "Lagring:", + "@newAlbumDialogStorageLabel": {}, + "durationDialogSeconds": "Sekunder", + "@durationDialogSeconds": {}, + "removeEntryMetadataDialogMore": "Mer", + "@removeEntryMetadataDialogMore": {}, + "menuActionSelectAll": "Velg alle", + "@menuActionSelectAll": {}, + "appPickDialogTitle": "Velg program", + "@appPickDialogTitle": {}, + "renameEntrySetPageInsertTooltip": "Sett inn felt", + "@renameEntrySetPageInsertTooltip": {}, + "exportEntryDialogWidth": "Bredde", + "@exportEntryDialogWidth": {}, + "renameEntryDialogLabel": "Nytt navn", + "@renameEntryDialogLabel": {}, + "collectionActionMove": "Flytt til album", + "@collectionActionMove": {}, + "renameAlbumDialogLabel": "Nytt navn", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Mappen finnes allerede", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameProcessorName": "Navn", + "@renameProcessorName": {}, + "editEntryLocationDialogLongitude": "Lengdegrad", + "@editEntryLocationDialogLongitude": {}, + "exportEntryDialogHeight": "Høyde", + "@exportEntryDialogHeight": {}, + "collectionActionRescan": "Skann igjen", + "@collectionActionRescan": {}, + "sortOrderSmallestFirst": "Minste først", + "@sortOrderSmallestFirst": {}, + "editEntryDialogTargetFieldsHeader": "Felter å endre", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDialogCopyFromItem": "Kopier fra annet element", + "@editEntryDialogCopyFromItem": {}, + "durationDialogMinutes": "Minutter", + "@durationDialogMinutes": {}, + "editEntryLocationDialogChooseOnMap": "Velg på kartet", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryRatingDialogTitle": "Vurdering", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Metadatafjerning", + "@removeEntryMetadataDialogTitle": {}, + "genericDangerWarningDialogMessage": "Er du sikker?", + "@genericDangerWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Avspillingshastighet", + "@videoSpeedDialogLabel": {}, + "menuActionConfigureView": "Vis", + "@menuActionConfigureView": {}, + "menuActionMap": "Kart", + "@menuActionMap": {}, + "viewDialogGroupSectionTitle": "Gruppe", + "@viewDialogGroupSectionTitle": {}, + "tileLayoutList": "Liste", + "@tileLayoutList": {}, + "collectionPickPageTitle": "Velg", + "@collectionPickPageTitle": {}, + "menuActionSelectNone": "Fravelg alt", + "@menuActionSelectNone": {}, + "coverDialogTabCover": "Omslag", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "Program", + "@coverDialogTabApp": {}, + "collectionEmptyFavourites": "Ingen favoritter", + "@collectionEmptyFavourites": {}, + "viewDialogSortSectionTitle": "Sortering", + "@viewDialogSortSectionTitle": {}, + "tileLayoutGrid": "Rutenett", + "@tileLayoutGrid": {}, + "coverDialogTabColor": "Farge", + "@coverDialogTabColor": {}, + "aboutBugSectionTitle": "Feilrapport", + "@aboutBugSectionTitle": {}, + "aboutBugReportButton": "Rapporter", + "@aboutBugReportButton": {}, + "aboutCreditsWorldAtlas1": "Dette programmet bruker en TopoJSON-fil fra", + "@aboutCreditsWorldAtlas1": {}, + "collectionPageTitle": "Samling", + "@collectionPageTitle": {}, + "aboutBugCopyInfoInstruction": "Kopier systeminfo", + "@aboutBugCopyInfoInstruction": {}, + "aboutCreditsSectionTitle": "Bidragsytere", + "@aboutCreditsSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Vis alle lisenser", + "@aboutLicensesShowAllButtonLabel": {}, + "collectionActionAddShortcut": "Legg til snarvei", + "@collectionActionAddShortcut": {}, + "dateToday": "I dag", + "@dateToday": {}, + "searchDateSectionTitle": "Dato", + "@searchDateSectionTitle": {}, + "collectionSelectPageTitle": "Velg elementer", + "@collectionSelectPageTitle": {}, + "collectionActionEmptyBin": "Tøm papirkurv", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Kopier til album", + "@collectionActionCopy": {}, + "dateYesterday": "I går", + "@dateYesterday": {}, + "drawerCollectionImages": "Bilder", + "@drawerCollectionImages": {}, + "collectionActionEdit": "Rediger", + "@collectionActionEdit": {}, + "collectionGroupDay": "Etter dag", + "@collectionGroupDay": {}, + "dateThisMonth": "Denne måneden", + "@dateThisMonth": {}, + "drawerCollectionAnimated": "Animert", + "@drawerCollectionAnimated": {}, + "drawerCollectionSphericalVideos": "360°-videoer", + "@drawerCollectionSphericalVideos": {}, + "sortByDate": "Etter dato", + "@sortByDate": {}, + "sectionUnknown": "Ukjent", + "@sectionUnknown": {}, + "collectionEmptyVideos": "Ingen videoer", + "@collectionEmptyVideos": {}, + "drawerCountryPage": "Land", + "@drawerCountryPage": {}, + "collectionEmptyGrantAccessButtonLabel": "Innvilg tilgang", + "@collectionEmptyGrantAccessButtonLabel": {}, + "drawerCollectionVideos": "Videoer", + "@drawerCollectionVideos": {}, + "drawerTagPage": "Etiketter", + "@drawerTagPage": {}, + "drawerCollectionMotionPhotos": "Bevegelige bilder", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionRaws": "Raw bilder", + "@drawerCollectionRaws": {}, + "drawerAlbumPage": "Album", + "@drawerAlbumPage": {}, + "sortOrderHighestFirst": "Høyeste først", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Laveste først", + "@sortOrderLowestFirst": {}, + "countryEmpty": "Ingen land", + "@countryEmpty": {}, + "drawerCollectionPanoramas": "Panoramaer", + "@drawerCollectionPanoramas": {}, + "searchRecentSectionTitle": "Nylige", + "@searchRecentSectionTitle": {}, + "sourceViewerPageTitle": "Kilde", + "@sourceViewerPageTitle": {}, + "sortByName": "Etter navn", + "@sortByName": {}, + "sortByItemCount": "Etter antall elementer", + "@sortByItemCount": {}, + "sortBySize": "Etter størrelse", + "@sortBySize": {}, + "sortByAlbumFileName": "Etter album og filnavn", + "@sortByAlbumFileName": {}, + "sortByRating": "Etter vurdering", + "@sortByRating": {}, + "sortOrderNewestFirst": "Nyeste først", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Eldste først", + "@sortOrderOldestFirst": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "albumScreenshots": "Skjermavbildninger", + "@albumScreenshots": {}, + "albumPageTitle": "Album", + "@albumPageTitle": {}, + "tagPageTitle": "Etiketter", + "@tagPageTitle": {}, + "settingsViewerShowInformation": "Vis info", + "@settingsViewerShowInformation": {}, + "albumGroupType": "Etter type", + "@albumGroupType": {}, + "albumGroupVolume": "Etter lagringsdataområde", + "@albumGroupVolume": {}, + "albumMimeTypeMixed": "Blandet", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "Kopier til album", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitlePick": "Velg album", + "@albumPickPageTitlePick": {}, + "albumDownload": "Last ned", + "@albumDownload": {}, + "createAlbumButtonLabel": "OPPRETT", + "@createAlbumButtonLabel": {}, + "searchRatingSectionTitle": "Vurderinger", + "@searchRatingSectionTitle": {}, + "settingsSystemDefault": "Systemforvalg", + "@settingsSystemDefault": {}, + "albumPickPageTitleExport": "Eksporter til album", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Flytt til album", + "@albumPickPageTitleMove": {}, + "albumScreenRecordings": "Skjermopptak", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Videoopptak", + "@albumVideoCaptures": {}, + "albumEmpty": "Ingen album", + "@albumEmpty": {}, + "binPageTitle": "Papirkurv", + "@binPageTitle": {}, + "countryPageTitle": "Land", + "@countryPageTitle": {}, + "tagEmpty": "Ingen etiketter", + "@tagEmpty": {}, + "searchAlbumsSectionTitle": "Album", + "@searchAlbumsSectionTitle": {}, + "searchMetadataSectionTitle": "Metadata", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Innstillinger", + "@settingsPageTitle": {}, + "settingsActionExportDialogTitle": "Eksporter", + "@settingsActionExportDialogTitle": {}, + "searchCollectionFieldHint": "Søk i samling", + "@searchCollectionFieldHint": {}, + "searchCountriesSectionTitle": "Land", + "@searchCountriesSectionTitle": {}, + "settingsDefault": "Forvalg", + "@settingsDefault": {}, + "settingsActionExport": "Eksporter", + "@settingsActionExport": {}, + "settingsActionImport": "Importer", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Importer", + "@settingsActionImportDialogTitle": {}, + "searchPlacesSectionTitle": "Steder", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Etiketter", + "@searchTagsSectionTitle": {}, + "appExportCovers": "Omslag", + "@appExportCovers": {}, + "appExportFavourites": "Favoritter", + "@appExportFavourites": {}, + "appExportSettings": "Innstillinger", + "@appExportSettings": {}, + "settingsConfirmationDialogTitle": "Bekreftelsesdialoger", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationTile": "Bekreftelsesdialoger", + "@settingsConfirmationTile": {}, + "settingsThumbnailSectionTitle": "Miniatyrbilder", + "@settingsThumbnailSectionTitle": {}, + "timeMinutes": "{count, plural, =1{{count} minutt} other{{count} minutter}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "timeDays": "{count, plural, =1{{count} dag} other{{count} dager}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "itemCount": "{count, plural, =1{{count} element} other{{count} elementer}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeSeconds": "{count, plural, =1{{count} sekund} other{{count} sekunder}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "applyButtonLabel": "BRUK", + "@applyButtonLabel": {}, + "sourceStateCataloguing": "Katalogisering", + "@sourceStateCataloguing": {}, + "entryActionPrint": "Skriv ut", + "@entryActionPrint": {}, + "filterFavouriteLabel": "Favorittmerk", + "@filterFavouriteLabel": {}, + "filterBinLabel": "Papirkurv", + "@filterBinLabel": {}, + "nameConflictStrategyRename": "Gi nytt navn", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Erstatt", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Hopp over", + "@nameConflictStrategySkip": {}, + "videoPlaybackWithSound": "Spill med lyd", + "@videoPlaybackWithSound": {}, + "videoPlaybackMuted": "Spill forstummet", + "@videoPlaybackMuted": {}, + "videoStartOverButtonLabel": "START OM IGJEN", + "@videoStartOverButtonLabel": {}, + "noMatchingAppDialogMessage": "Ingen programmer kan håndtere dette.", + "@noMatchingAppDialogMessage": {}, + "videoResumeDialogMessage": "Fortsett avspilling fra {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "settingsNavigationDrawerTabTypes": "Typer", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerAddAlbum": "Legg til album", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsViewerQuickActionsTile": "Hurtighandlinger", + "@settingsViewerQuickActionsTile": {}, + "tagEditorPageTitle": "Rediger etiketter", + "@tagEditorPageTitle": {}, + "settingsViewerShowMinimap": "Vis minikart", + "@settingsViewerShowMinimap": {}, + "settingsSubtitleThemePageTitle": "Undertekster", + "@settingsSubtitleThemePageTitle": {}, + "settingsUnitSystemDialogTitle": "Enheter", + "@settingsUnitSystemDialogTitle": {}, + "settingsViewerShowOverlayThumbnails": "Vis miniatyrbilder", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsSlideshowFillScreen": "Fyll skjermen", + "@settingsSlideshowFillScreen": {}, + "settingsVideoShowVideos": "Vis videoer", + "@settingsVideoShowVideos": {}, + "settingsViewerSlideshowTile": "Lysbildevisning", + "@settingsViewerSlideshowTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Videoavspilling", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoAutoPlay": "Automatisk avspilling", + "@settingsVideoAutoPlay": {}, + "settingsSubtitleThemeTextSize": "Tekststørrelse", + "@settingsSubtitleThemeTextSize": {}, + "settingsVideoButtonsTile": "Knapper", + "@settingsVideoButtonsTile": {}, + "settingsSlideshowRepeat": "Gjenta", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowIntervalTile": "Intervall", + "@settingsSlideshowIntervalTile": {}, + "settingsSubtitleThemeTile": "Undertekster", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemeTextAlignmentTile": "Tekstjustering", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Venstre", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Midten", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsVideoControlsPageTitle": "Kontroller", + "@settingsVideoControlsPageTitle": {}, + "settingsThemeEnableDynamicColor": "Dynamisk farge", + "@settingsThemeEnableDynamicColor": {}, + "mapZoomOutTooltip": "Forminsk", + "@mapZoomOutTooltip": {}, + "viewerInfoPageTitle": "Info", + "@viewerInfoPageTitle": {}, + "settingsSaveSearchHistory": "Lagre søkehistorikk", + "@settingsSaveSearchHistory": {}, + "settingsEnableBinSubtitle": "Behold slettede elementer i 30 dager", + "@settingsEnableBinSubtitle": {}, + "settingsAccessibilitySectionTitle": "Tilgjengelighet", + "@settingsAccessibilitySectionTitle": {}, + "tagEditorPageNewTagFieldLabel": "Ny etikett", + "@tagEditorPageNewTagFieldLabel": {}, + "settingsRemoveAnimationsDialogTitle": "Fjern animasjoner", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsLanguageTile": "Språk", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "Språk", + "@settingsLanguagePageTitle": {}, + "viewerInfoUnknown": "ukjent", + "@viewerInfoUnknown": {}, + "settingsThemeBrightnessDialogTitle": "Drakt", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsCoordinateFormatTile": "Koordinatformat", + "@settingsCoordinateFormatTile": {}, + "settingsCollectionTile": "Samling", + "@settingsCollectionTile": {}, + "statsPageTitle": "Statistikk", + "@statsPageTitle": {}, + "viewerInfoLabelDate": "Dato", + "@viewerInfoLabelDate": {}, + "mapStyleDialogTitle": "Kartstil", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Velg kartstil", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Forstørr", + "@mapZoomInTooltip": {}, + "mapPointNorthUpTooltip": "Nord oppover", + "@mapPointNorthUpTooltip": {}, + "viewerInfoSearchSuggestionDescription": "Beskrivelse", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchFieldLabel": "Søk metadata", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchSuggestionDate": "Dato og tid", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDimensions": "Dimensjoner", + "@viewerInfoSearchSuggestionDimensions": {}, + "tagEditorSectionRecent": "Nylig", + "@tagEditorSectionRecent": {}, + "viewerInfoSearchSuggestionResolution": "Oppløsning", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Rettigheter", + "@viewerInfoSearchSuggestionRights": {}, + "tagEditorPageAddTagTooltip": "Legg til etikett", + "@tagEditorPageAddTagTooltip": {}, + "sourceStateLocatingCountries": "Lokalisering av land", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Lokalisering av steder", + "@sourceStateLocatingPlaces": {}, + "entryActionFlip": "Vend vannrett", + "@entryActionFlip": {}, + "slideshowActionResume": "Fortsett", + "@slideshowActionResume": {}, + "displayRefreshRatePreferHighest": "Høyeste takt", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Laveste takt", + "@displayRefreshRatePreferLowest": {}, + "viewerTransitionSlide": "Glidende", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Parallakse", + "@viewerTransitionParallax": {}, + "widgetOpenPageHome": "Åpne startside", + "@widgetOpenPageHome": {}, + "widgetOpenPageViewer": "Åpne visning", + "@widgetOpenPageViewer": {}, + "durationDialogHours": "Timer", + "@durationDialogHours": {}, + "aboutLicensesBanner": "Programmet bruker følgende frie pakker og bibliotek.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android-bibliotek", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter-programtillegg", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutBugReportInstruction": "Innrapporter på GitHub med loggføring og systeminfo", + "@aboutBugReportInstruction": {}, + "settingsSubtitleThemeShowOutline": "Vis omriss og skygge", + "@settingsSubtitleThemeShowOutline": {}, + "settingsVideoGestureSideDoubleTapSeek": "Dobbelttrykk på skjermkantene for å blafre forover/bakover", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsAllowInstalledAppAccessSubtitle": "Brukt til forbedring av albumsvisning", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "Tillat anonym feilrapportering", + "@settingsAllowErrorReporting": {}, + "settingsStorageAccessPageTitle": "Lagringstilgang", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessRevokeTooltip": "Tilbakekall", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsLanguageSectionTitle": "Språk og formater", + "@settingsLanguageSectionTitle": {}, + "settingsWidgetPageTitle": "Bilderamme", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Omriss", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "Når miniprogrammet trykkes", + "@settingsWidgetOpenPage": {}, + "viewerOpenPanoramaButtonLabel": "ÅPNE PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "SETT SOM BAKGRUNNSBILDE", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Oida.", + "@viewerErrorUnknown": {}, + "viewerInfoBackToViewerTooltip": "Tilbake til visning", + "@viewerInfoBackToViewerTooltip": {}, + "mapAttributionOsmHot": "Flis av [HOT](https://www.hotosm.org) • Vertstjent av [OSM France](https://openstreetmap.fr)", + "@mapAttributionOsmHot": {}, + "panoramaEnableSensorControl": "Skru på sensorstyring", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Skru av sensorstyring", + "@panoramaDisableSensorControl": {}, + "nameConflictDialogSingleSourceMessage": "Noen filer i målmappen har samme navn.", + "@nameConflictDialogSingleSourceMessage": {}, + "subtitlePositionTop": "Topp", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "Bunn", + "@subtitlePositionBottom": {}, + "settingsSlideshowShuffle": "Stokk", + "@settingsSlideshowShuffle": {}, + "statsWithGps": "{count, plural, =1{1 element med plassering} other{{count} elementer med plassering}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsMotionPhotoAutoPlay": "Auto-spill bevegelige bilder", + "@settingsMotionPhotoAutoPlay": {}, + "settingsViewerQuickActionEditorBanner": "Trykk og hold for å flytte knapper og velg hvilke handlinger som vises i viseren.", + "@settingsViewerQuickActionEditorBanner": {}, + "editEntryDateDialogSourceFileModifiedDate": "Filendringsdato", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "settingsCollectionQuickActionEditorPageTitle": "Hurtighandlinger", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "widgetDisplayedItemRandom": "Tilfeldig", + "@widgetDisplayedItemRandom": {}, + "videoActionSelectStreams": "Velg spor", + "@videoActionSelectStreams": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Oppfriskningstakt", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "tileLayoutMosaic": "Mosaikk", + "@tileLayoutMosaic": {}, + "settingsViewerSectionTitle": "Viser", + "@settingsViewerSectionTitle": {}, + "widgetDisplayedItemMostRecent": "Nyligst", + "@widgetDisplayedItemMostRecent": {}, + "editEntryDateDialogExtractFromTitle": "Utled fra navn", + "@editEntryDateDialogExtractFromTitle": {}, + "viewDialogLayoutSectionTitle": "Tilpasning", + "@viewDialogLayoutSectionTitle": {}, + "videoActionCaptureFrame": "Fang ramme", + "@videoActionCaptureFrame": {}, + "albumGroupTier": "Etter nivå", + "@albumGroupTier": {}, + "editEntryLocationDialogSetCustom": "Sett egendefinert plassering", + "@editEntryLocationDialogSetCustom": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{Kopierte 1 element} other{Kopierte {count} elementer}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsThumbnailShowLocationIcon": "Vis plasserings-ikon", + "@settingsThumbnailShowLocationIcon": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Spør før flytting av ikke-daterte elementer", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "entryInfoActionEditLocation": "Rediger plassering", + "@entryInfoActionEditLocation": {}, + "editEntryDateDialogShift": "Bytt", + "@editEntryDateDialogShift": {}, + "locationPickerUseThisLocationButton": "Bruk denne plasseringen", + "@locationPickerUseThisLocationButton": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP kreves for å spille videoen inne i et bevegelig bilde.\n\nEr du sikker på at du vil fjerne det?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "settingsNavigationDrawerBanner": "Trykk og hold for å flytte og endre rekkefølge på menyelementer.", + "@settingsNavigationDrawerBanner": {}, + "settingsViewerShowOverlayOnOpening": "Vis ved åpning", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerEnableOverlayBlurEffect": "Tilsløringseffekt", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsDisplayRefreshRateModeTile": "Visningsoppfiskningstakt", + "@settingsDisplayRefreshRateModeTile": {}, + "videoStreamSelectionDialogTrack": "Spor", + "@videoStreamSelectionDialogTrack": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{Klarte ikke å kopiere 1 element} other{Klarte ikke å kopiere {count} elementer}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{Klarte ikke å flytte 1 element} other{Klarte ikke å flytte {count} elementer}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsThumbnailShowFavouriteIcon": "Vis favoritt-ikon", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Vis etikett-ikon", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailOverlayTile": "Overlag", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Overlag", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Tilgjengelige knapper", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Viste knapper", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "filterNoAddressLabel": "Ingen adresse", + "@filterNoAddressLabel": {}, + "missingSystemFilePickerDialogMessage": "Systemfilvelgeren mangler eller er avskrudd. Skru den på igjen og prøv igjen.", + "@missingSystemFilePickerDialogMessage": {}, + "setCoverDialogLatest": "Nyeste element", + "@setCoverDialogLatest": {}, + "hideFilterConfirmationDialogMessage": "Samsvarende bilder og videoer vil bli skjult fra samlingen din? Du kan vise dem igjen fra «Personvern»-innstillingene.\n\nEr du sikker på at du vil skjule dem?", + "@hideFilterConfirmationDialogMessage": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Klarte ikke å fjerne 1 element} other{Klarte ikke å fjerne {count} elementer}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{Flyttet 1 element} other{Flyttet {count} elementer}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{Klarte ikke å eksportere 1 side} other{Klarte ikke å eksportere {count} sider}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionSelectSectionTooltip": "Velg utvalg", + "@collectionSelectSectionTooltip": {}, + "settingsConfirmationBeforeMoveToBinItems": "Spør før flytting av elementer til papirkurven", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Vis melding etter flytting av elementer til papirkurven", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsCollectionQuickActionTabBrowsing": "Utforskning", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsStorageAccessBanner": "Noen mapper krever eksplisitt tilgang til å endre filene i dem. Du kan gjennomse hvilke mapper du har gitt tilgang til tidligere her.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Ingen tilgangsinnvilgelser", + "@settingsStorageAccessEmpty": {}, + "settingsTimeToTakeActionTile": "Tid for handling", + "@settingsTimeToTakeActionTile": {}, + "viewerErrorDoesNotExist": "Filen finnes ikke lenger.", + "@viewerErrorDoesNotExist": {}, + "tagPlaceholderPlace": "Sted", + "@tagPlaceholderPlace": {}, + "settingsViewerShowRatingTags": "Vis vurdering og etiketter", + "@settingsViewerShowRatingTags": {}, + "settingsViewerShowShootingDetails": "Vis knipsingsdetaljer", + "@settingsViewerShowShootingDetails": {}, + "viewerInfoSearchEmpty": "Ingen samsvarende nøkler", + "@viewerInfoSearchEmpty": {}, + "tagEditorSectionPlaceholders": "Plassholdere", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "Land", + "@tagPlaceholderCountry": {}, + "viewerTransitionFade": "Ton ut", + "@viewerTransitionFade": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Denne operasjonen støttes ikke for elementer av følgende type: {types}.} other{Denne operasjonen støttes ikke for elementer av følgende typer: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Flytt dette elementet til papirkurven?} other{Flytt disse {count} elementene til papirkurven?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Slett dette elementet?} other{Slett disse {count} elementene?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoStreamSelectionDialogText": "Undertekster", + "@videoStreamSelectionDialogText": {}, + "collectionDeselectSectionTooltip": "Fravelg utvalg", + "@collectionDeselectSectionTooltip": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{Klarte ikke å endre navn på 1 element} other{Klarte ikke å endre navn på {count} elementer}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{Klarte ikke å redigere 1 element} other{Klarte ikke å redigere {count} elementer}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsThumbnailShowMotionPhotoIcon": "Vis bevegelig bilde -ikon", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsViewerQuickActionEmpty": "Ingen knapper", + "@settingsViewerQuickActionEmpty": {}, + "settingsThumbnailShowRating": "Vis vurdering", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Vis raw-ikon", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Vis videovarighet", + "@settingsThumbnailShowVideoDuration": {}, + "settingsViewerOverlayPageTitle": "Overlag", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerGestureSideTapNext": "Trykk på skjermkantene for å vise forrige/neste element", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerOverlayTile": "Overlag", + "@settingsViewerOverlayTile": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Trykk og hold for å flytte knapper og velge hvilke handlinger som vises når du velger elementer.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsSubtitleThemeTextPositionTile": "Tekstposisjon", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsHiddenFiltersEmpty": "Ingen skjulte filtre", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Lagringstilgang", + "@settingsStorageAccessTile": {}, + "settingsWidgetDisplayedItem": "Vist element", + "@settingsWidgetDisplayedItem": {}, + "settingsThemeColorHighlights": "Fargede framhevelser", + "@settingsThemeColorHighlights": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Klarte ikke å pakke ut innebygd data", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "mapEmptyRegion": "Ingen bilder i denne regionen", + "@mapEmptyRegion": {}, + "settingsConfirmationBeforeDeleteItems": "Spør før permanent sletting av elementer", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsCollectionQuickActionTabSelecting": "Utvelgelse", + "@settingsCollectionQuickActionTabSelecting": {}, + "coordinateFormatDms": "G-M-S", + "@coordinateFormatDms": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Trykk og hold for å flytte knapper og velge hvilke handlinger som skal vises ved utforskning av elementer.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "mapAttributionStamen": "Flis av [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "moveUndatedConfirmationDialogMessage": "Lagre elementdatoer før fortsettelse?", + "@moveUndatedConfirmationDialogMessage": {}, + "restrictedAccessDialogMessage": "Dette kartet kan ikke endre filer i {directory} for «{volume}».\n\nBruk en pre-installert filbehandler eller et galleriprogram for å flytte elementene til en annen mappe.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "settingsAllowMediaManagement": "Tillat mediahåndtering", + "@settingsAllowMediaManagement": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{Endret navn på 1 element} other{Endret navn på {count} elementer}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Slett dette albumet og elementet i det?} other{Slett dette albumet og de {count} elementene i det?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsHiddenFiltersBanner": "Bilder og videoer som samsvarer med skjulte filtre vil ikke vises i samlingen din.", + "@settingsHiddenFiltersBanner": {}, + "collectionEditSuccessFeedback": "{count, plural, =1{Redigerte 1 element} other{Redigerte {count} elementer}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Slett disse albumene og elementet i demt?} other{Slett disse albumene og de {count} elementene i dem?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "filterAspectRatioLandscapeLabel": "Liggende", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "Stående", + "@filterAspectRatioPortraitLabel": {}, + "settingsSubtitleThemeSample": "Dette er et eksempel.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Tekstposisjon", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "wallpaperUseScrollEffect": "Bruk rulleeffekt på hjemmeskjerm", + "@wallpaperUseScrollEffect": {}, + "storageAccessDialogMessage": "Velg {directory} for «{volume}» i neste skjerm for å gi dette programmet tilgang til det.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "notEnoughSpaceDialogMessage": "Denne operasjonen trenger {neededSize} ledig plass på «{volume}» for å fullføres, men det er kun {freeSize} igjen.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "settingsAllowInstalledAppAccess": "Tillat tilgang til programliste", + "@settingsAllowInstalledAppAccess": {}, + "videoStreamSelectionDialogNoSelection": "Det er ingen andre spor.", + "@videoStreamSelectionDialogNoSelection": {}, + "settingsCollectionQuickActionsTile": "Hurtighandlinger", + "@settingsCollectionQuickActionsTile": {}, + "settingsViewerUseCutout": "Bruk utklippsområde", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Maksimal lysstyrke", + "@settingsViewerMaximumBrightness": {}, + "settingsImageBackground": "Bildebakgrunn", + "@settingsImageBackground": {}, + "viewDialogReverseSortOrder": "Omvendt sorteringsrekkefølge", + "@viewDialogReverseSortOrder": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (akvarell)", + "@mapStyleStamenWatercolor": {}, + "keepScreenOnViewerOnly": "Kun visningsside", + "@keepScreenOnViewerOnly": {}, + "entryInfoActionExportMetadata": "Eksporter metadata", + "@entryInfoActionExportMetadata": {}, + "albumTierSpecial": "Ofte åpnet", + "@albumTierSpecial": {}, + "editEntryLocationDialogTitle": "Plassering", + "@editEntryLocationDialogTitle": {}, + "filterLocatedLabel": "Posisjonert", + "@filterLocatedLabel": {}, + "filterTaggedLabel": "Etikettmerket", + "@filterTaggedLabel": {}, + "settingsDisplayUseTvInterface": "Android TV-grensesnitt", + "@settingsDisplayUseTvInterface": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Vis multi-trykkhåndvendingsalternativer", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "columnCount": "{count, plural, =1{{count} kolonne} other{{count} kolonner}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "keepScreenOnVideoPlayback": "Under videoavspilling", + "@keepScreenOnVideoPlayback": {}, + "entryActionShareImageOnly": "Del kun bilde", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "Del kun video", + "@entryActionShareVideoOnly": {}, + "entryInfoActionRemoveLocation": "Fjern posisjon", + "@entryInfoActionRemoveLocation": {}, + "settingsViewerShowDescription": "Vis beskrivelse", + "@settingsViewerShowDescription": {}, + "settingsModificationWarningDialogMessage": "Andre innstillinger vil bli endret.", + "@settingsModificationWarningDialogMessage": {}, + "tooManyItemsErrorDialogMessage": "Prøv igjen med færre elementer.", + "@tooManyItemsErrorDialogMessage": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Dra opp eller ned for å justere lys-/lydstyrke", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsDisablingBinWarningDialogMessage": "Elementer i papirkurven vil bli slettet for godt.", + "@settingsDisablingBinWarningDialogMessage": {}, + "chipActionLock": "Lås", + "@chipActionLock": {}, + "chipActionGoToPlacePage": "Vis i «Steder»", + "@chipActionGoToPlacePage": {}, + "chipActionCreateVault": "Opprett hvelv", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "Sett opp hvelv", + "@chipActionConfigureVault": {}, + "albumTierVaults": "Hvelv", + "@albumTierVaults": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "newVaultDialogTitle": "Nytt hvelv", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "Sett opp hvelv", + "@configureVaultDialogTitle": {}, + "pinDialogEnter": "Skriv inn PIN", + "@pinDialogEnter": {}, + "pinDialogConfirm": "Bekreft PIN", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "Skriv inn passord", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Bekreft passord", + "@passwordDialogConfirm": {}, + "authenticateToConfigureVault": "Identitetsbekreft for å sette opp hvelv", + "@authenticateToConfigureVault": {}, + "authenticateToUnlockVault": "Identitetsbekreft for å låse opp hvelv", + "@authenticateToUnlockVault": {}, + "vaultBinUsageDialogMessage": "Noen hvelv bruker papirkurven.", + "@vaultBinUsageDialogMessage": {}, + "newVaultWarningDialogMessage": "Elementer i hvelv er kun tilgjengelig for dette programmet, og ikke andre.\n\nHvis du avinstallerer dette programmet, eller tømmer denne programdataen vil du miste alle disse elementene.", + "@newVaultWarningDialogMessage": {}, + "drawerPlacePage": "Steder", + "@drawerPlacePage": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "vaultLockTypePassword": "Passord", + "@vaultLockTypePassword": {}, + "exportEntryDialogWriteMetadata": "Skriv metadata", + "@exportEntryDialogWriteMetadata": {}, + "placeEmpty": "Ingen steder", + "@placeEmpty": {}, + "vaultDialogLockModeWhenScreenOff": "Lås når skjermen skrur seg av", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "Låsetype", + "@vaultDialogLockTypeLabel": {}, + "placePageTitle": "Steder", + "@placePageTitle": {}, + "settingsConfirmationVaultDataLoss": "Vis advarsel om hvelv-datatap", + "@settingsConfirmationVaultDataLoss": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "editorTransformCrop": "Beskjær", + "@editorTransformCrop": {}, + "editorTransformRotate": "Roter", + "@editorTransformRotate": {}, + "statePageTitle": "Tilstander", + "@statePageTitle": {}, + "stateEmpty": "Ingen tilstander", + "@stateEmpty": {}, + "settingsVideoPlaybackTile": "Avspilling", + "@settingsVideoPlaybackTile": {}, + "settingsVideoResumptionModeTile": "Gjenoppta avspilling", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoResumptionModeDialogTitle": "Gjenoppta avspilling", + "@settingsVideoResumptionModeDialogTitle": {}, + "maxBrightnessAlways": "Alltid", + "@maxBrightnessAlways": {}, + "videoResumptionModeNever": "Aldri", + "@videoResumptionModeNever": {}, + "maxBrightnessNever": "Aldri", + "@maxBrightnessNever": {}, + "videoResumptionModeAlways": "Alltid", + "@videoResumptionModeAlways": {}, + "exportEntryDialogQuality": "Kvalitet", + "@exportEntryDialogQuality": {}, + "aboutDataUsageSectionTitle": "Databruk", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageData": "Data", + "@aboutDataUsageData": {}, + "aboutDataUsageMisc": "Ymse", + "@aboutDataUsageMisc": {}, + "settingsVideoPlaybackPageTitle": "Avspilling", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoBackgroundMode": "Bakgrunnsmodus", + "@settingsVideoBackgroundMode": {}, + "saveCopyButtonLabel": "Lagre kopi", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Bruk", + "@applyTooltip": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "patternDialogConfirm": "Bekreft mønster", + "@patternDialogConfirm": {}, + "aboutDataUsageCache": "Hurtiglager", + "@aboutDataUsageCache": {}, + "aboutDataUsageDatabase": "Database", + "@aboutDataUsageDatabase": {}, + "settingsAskEverytime": "Spør hver gang", + "@settingsAskEverytime": {}, + "settingsVideoBackgroundModeDialogTitle": "Bakgrunnsmodus", + "@settingsVideoBackgroundModeDialogTitle": {}, + "tagEditorDiscardDialogMessage": "Forkast endringer?", + "@tagEditorDiscardDialogMessage": {}, + "tagPlaceholderState": "Tilstand", + "@tagPlaceholderState": {}, + "chipActionShowCountryStates": "Vis tilstander", + "@chipActionShowCountryStates": {}, + "searchStatesSectionTitle": "Tilstander", + "@searchStatesSectionTitle": {}, + "vaultLockTypePattern": "Mønster", + "@vaultLockTypePattern": {}, + "chipActionShowCollection": "Vis i samling", + "@chipActionShowCollection": {}, + "mapAttributionOsmData": "Kartdata © [OpenStreetMap](https://www.openstreetmap.org/copyright)-bidragsyterne", + "@mapAttributionOsmData": {} +} diff --git a/lib/l10n/app_ne.arb b/lib/l10n/app_ne.arb new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/lib/l10n/app_ne.arb @@ -0,0 +1 @@ +{} diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb new file mode 100644 index 0000000..c262934 --- /dev/null +++ b/lib/l10n/app_nl.arb @@ -0,0 +1,734 @@ +{ + "appName": "Aves", + "welcomeMessage": "Welkom bij Aves", + "welcomeOptional": "Optioneel", + "welcomeTermsToggle": "Ik ga akkoord met de voorwaarden", + "itemCount": "{count, plural, =1{{count} item} other{{count} items}}", + "timeSeconds": "{count, plural, =1{{count} seconde} other{{count} seconden}}", + "timeMinutes": "{count, plural, =1{{count} minuut} other{{count} minuten}}", + "timeDays": "{count, plural, =1{{count} dag} other{{count} dagen}}", + "focalLength": "{length} mm", + "applyButtonLabel": "TOEPASSEN", + "deleteButtonLabel": "VERWIJDEREN", + "nextButtonLabel": "VOLGENDE", + "showButtonLabel": "TONEN", + "hideButtonLabel": "VERBERGEN", + "continueButtonLabel": "VERDER", + "cancelTooltip": "Annuleren", + "changeTooltip": "Aanpassen", + "clearTooltip": "Leegmaken", + "previousTooltip": "Vorige", + "nextTooltip": "Volgende", + "showTooltip": "Tonen", + "hideTooltip": "Verbergen", + "actionRemove": "Verwijderen", + "resetTooltip": "Resetten", + "saveTooltip": "Opslaan", + "pickTooltip": "Kies", + "doubleBackExitMessage": "Tik nogmaals “Terug” om te sluiten.", + "doNotAskAgain": "Niet opnieuw vragen", + "sourceStateLoading": "Laden", + "sourceStateCataloguing": "Catalogiseren", + "sourceStateLocatingCountries": "Landen lokaliseren", + "sourceStateLocatingPlaces": "Plaatsen lokaliseren", + "chipActionDelete": "Verwijderen", + "chipActionGoToAlbumPage": "In Albums tonen", + "chipActionGoToCountryPage": "In Landen tonen", + "chipActionGoToTagPage": "In Labels tonen", + "chipActionFilterOut": "Uitfilteren", + "chipActionFilterIn": "Infilteren", + "chipActionHide": "Verbergen", + "chipActionPin": "Bovenaan pinnen", + "chipActionUnpin": "Unpinnen", + "chipActionRename": "Hernoemen", + "chipActionSetCover": "Album achtergrond instellen", + "chipActionCreateAlbum": "Album aanmaken", + "entryActionCopyToClipboard": "Kopiëren naar Clipboard", + "entryActionDelete": "Verwijderen", + "entryActionConvert": "Converteren", + "entryActionExport": "Exporteren", + "entryActionInfo": "Info", + "entryActionRename": "Hernoemen", + "entryActionRestore": "Herstellen", + "entryActionRotateCCW": "Linksom roteren", + "entryActionRotateCW": "Rechtsom roteren", + "entryActionFlip": "Horizontaal omdraaien", + "entryActionPrint": "Printen", + "entryActionShare": "Delen", + "entryActionViewSource": "Bron bekijken", + "entryActionShowGeoTiffOnMap": "Als kaart-overlay tonen", + "entryActionConvertMotionPhotoToStillImage": "Converteren naar stilstaand beeld", + "entryActionViewMotionPhotoVideo": "Video openen", + "entryActionEdit": "Bewerken", + "entryActionOpen": "Openen als", + "entryActionSetAs": "Instellen als", + "entryActionOpenMap": "In Kaarten-app tonen", + "entryActionRotateScreen": "Scherm roteren", + "entryActionAddFavourite": "Toevoegen aan favorieten", + "entryActionRemoveFavourite": "Verwijderen uit favorieten", + "videoActionCaptureFrame": "Frame opnemen", + "videoActionMute": "Dempen", + "videoActionUnmute": "Dempen opheffen", + "videoActionPause": "Pauzeren", + "videoActionPlay": "Afspelen", + "videoActionReplay10": "10 seconden terug", + "videoActionSkip10": "10 seconden vooruit", + "videoActionSelectStreams": "Sporen selecteren", + "videoActionSetSpeed": "Afspeelsnelheid", + "viewerActionSettings": "Instellingen", + "slideshowActionResume": "Hervatten", + "slideshowActionShowInCollection": "In Collectie tonen", + "entryInfoActionEditDate": "Datum & tijd bewerken", + "entryInfoActionEditLocation": "Locatie bewerken", + "entryInfoActionEditTitleDescription": "Titel & beschrijving bewerken", + "entryInfoActionEditRating": "Waardering bewerken", + "entryInfoActionEditTags": "Labels bewerken", + "entryInfoActionRemoveMetadata": "Verwijder metadata", + "filterBinLabel": "Prullenbak", + "filterFavouriteLabel": "Favoriet", + "filterNoDateLabel": "Zonder datum", + "filterNoLocationLabel": "Zonder plaats", + "filterNoRatingLabel": "Zonder waardering", + "filterNoTagLabel": "Zonder label", + "filterNoTitleLabel": "Zonder titel", + "filterOnThisDayLabel": "Op deze dag", + "filterRecentlyAddedLabel": "Recent toegevoegd", + "filterRatingRejectedLabel": "Afgekeurd", + "filterTypeAnimatedLabel": "Geanimeerd", + "filterTypeMotionPhotoLabel": "Bewegende Foto", + "filterTypePanoramaLabel": "Panorama", + "filterTypeRawLabel": "Raw", + "filterTypeSphericalVideoLabel": "360° Video", + "filterTypeGeotiffLabel": "GeoTIFF", + "filterMimeImageLabel": "Afbeelding", + "filterMimeVideoLabel": "Video", + "coordinateFormatDms": "DMS", + "coordinateFormatDecimal": "Decimale graden", + "coordinateDms": "{coordinate} {direction}", + "coordinateDmsNorth": "N", + "coordinateDmsSouth": "S", + "coordinateDmsEast": "E", + "coordinateDmsWest": "W", + "unitSystemMetric": "Metrisch", + "unitSystemImperial": "Brits-Amerikaans", + "videoLoopModeNever": "Nooit", + "videoLoopModeShortOnly": "Alleen korte video's", + "videoLoopModeAlways": "Altijd", + "videoControlsPlayOutside": "Met andere speler openen", + "mapStyleGoogleNormal": "Google Maps", + "mapStyleGoogleHybrid": "Google Maps (Hybride)", + "mapStyleGoogleTerrain": "Google Maps (Terrein)", + "mapStyleOsmHot": "Humanitarian OSM", + "mapStyleStamenWatercolor": "Stamen Waterkleur", + "nameConflictStrategyRename": "Hernoemen", + "nameConflictStrategyReplace": "Vervangen", + "nameConflictStrategySkip": "Overslaan", + "keepScreenOnNever": "Nooit", + "keepScreenOnViewerOnly": "Alleen Viewerpagina", + "keepScreenOnAlways": "Altijd", + "accessibilityAnimationsRemove": "Schermeffecten uitschakelen", + "accessibilityAnimationsKeep": "Schermeffecten behouden", + "displayRefreshRatePreferHighest": "Hoogste waardering", + "displayRefreshRatePreferLowest": "Laagste waardering", + "videoPlaybackSkip": "Overslaan", + "videoPlaybackMuted": "Gedempt afspelen", + "videoPlaybackWithSound": "Met geluid afspelen", + "themeBrightnessLight": "Licht", + "themeBrightnessDark": "Donker", + "themeBrightnessBlack": "Zwart", + "viewerTransitionSlide": "Slide", + "viewerTransitionParallax": "Parallax", + "viewerTransitionFade": "Vervagen", + "viewerTransitionZoomIn": "Inzoomen", + "viewerTransitionNone": "Geen", + "wallpaperTargetHome": "Startscherm", + "wallpaperTargetLock": "Vergrendelingsscherm", + "wallpaperTargetHomeLock": "Start- en vergrendelingsschermen", + "widgetOpenPageHome": "Startscherm openen", + "albumTierNew": "Nieuw", + "albumTierPinned": "Gepint", + "albumTierSpecial": "Veelgebruikt", + "albumTierApps": "Apps", + "albumTierRegular": "Overige", + "storageVolumeDescriptionFallbackPrimary": "Internale opslag", + "storageVolumeDescriptionFallbackNonPrimary": "SD kaart", + "rootDirectoryDescription": "root map", + "otherDirectoryDescription": "“{name}” map", + "storageAccessDialogMessage": "Selecteer in het volgende scherm de {directory} van “{volume}” om deze app er toegang toe te geven.", + "restrictedAccessDialogMessage": "Deze applicatie mag geen bestanden wijzigen in de {directory} van “{volume}”,.\n\n Gebruik een vooraf geïnstalleerde filemanager of galerij-app om de items naar een andere map te verplaatsen.", + "notEnoughSpaceDialogMessage": "Deze bewerking heeft {neededSize} vrije ruimte op “{volume}”, nodig om te voltooien, maar er is nog slechts {freeSize} over.", + "missingSystemFilePickerDialogMessage": "De systeembestandskiezer ontbreekt of is uitgeschakeld. Schakel het in en probeer het opnieuw.", + "unsupportedTypeDialogMessage": "{count, plural, other{Deze bewerking wordt niet ondersteund voor items van het volgende bestandstype: {types}.}}", + "nameConflictDialogSingleSourceMessage": "Sommige bestanden in de doelmap hebben dezelfde naam.", + "nameConflictDialogMultipleSourceMessage": "Sommige bestanden hebben dezelfde naam.", + "addShortcutDialogLabel": "Label snelkoppeling", + "addShortcutButtonLabel": "TOEVOEGEN", + "noMatchingAppDialogMessage": "Er zijn geen apps die dit ondersteunen.", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Dit item naar de prullenbak verplaatsen??} other{Deze {count} items naar de prullenbak verplaatsen?}}", + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Dit item verwijderen?} other{Deze {count} items verwijderen?}}", + "moveUndatedConfirmationDialogMessage": "Datums opslaan alvorens door te gaan?", + "moveUndatedConfirmationDialogSetDate": "Datums opslaan", + "videoResumeDialogMessage": "Afspelen hervatten om {time}?", + "videoStartOverButtonLabel": "OPNIEUW AFSPELLEN", + "videoResumeButtonLabel": "HERVATTEN", + "setCoverDialogLatest": "Laatste item", + "setCoverDialogAuto": "Auto", + "setCoverDialogCustom": "Aangepast", + "hideFilterConfirmationDialogMessage": "Overeenkomstige foto’s en video’s worden verborgen binnen jouw verzameling. Je kunt ze opnieuw weergeven via de “Privacy”-instellingen.\n\nWeet je zeker dat je ze wilt verbergen?", + "newAlbumDialogTitle": "Nieuw Album", + "newAlbumDialogNameLabel": "Albumnaam", + "newAlbumDialogNameLabelAlreadyExistsHelper": "Map bestaat al", + "newAlbumDialogStorageLabel": "Opslag:", + "renameAlbumDialogLabel": "Nieuwe naam", + "renameAlbumDialogLabelAlreadyExistsHelper": "Map bestaat al", + "renameEntrySetPageTitle": "Hernoemen", + "renameEntrySetPagePatternFieldLabel": "Naamgevingspatroon", + "renameEntrySetPageInsertTooltip": "Veld invoegen", + "renameEntrySetPagePreviewSectionTitle": "Voorbeeld", + "renameProcessorCounter": "Teller", + "renameProcessorName": "Naam", + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Dit album en het item erbinnen verwijderen?} other{Dit album en de {count} items erbinnen verwijderen?}}", + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Deze albums en de items erbinnen verwijderen?} other{Deze albums en de {count} items erbinnen verwijderen?}}", + "exportEntryDialogFormat": "Type:", + "exportEntryDialogWidth": "Breedte", + "exportEntryDialogHeight": "Hoogte", + "renameEntryDialogLabel": "Nieuwe naam", + "editEntryDialogTargetFieldsHeader": "Velden om aan te passen", + "editEntryDateDialogTitle": "Datum & Tijd", + "editEntryDateDialogSetCustom": "Aangepaste datum instellen", + "editEntryDateDialogCopyField": "Van andere datum kopiëren", + "editEntryDialogCopyFromItem": "Van ander item kopiëren", + "editEntryDateDialogExtractFromTitle": "Uit titel halen", + "editEntryDateDialogShift": "Verschuiven", + "editEntryDateDialogSourceFileModifiedDate": "Wijzigingsdatum bestand", + "durationDialogHours": "Uren", + "durationDialogMinutes": "Minuten", + "editEntryLocationDialogTitle": "Locatie", + "editEntryLocationDialogChooseOnMap": "Op kaart kiezen", + "editEntryLocationDialogLatitude": "Breedtegraad", + "editEntryLocationDialogLongitude": "Lengtegraad", + "locationPickerUseThisLocationButton": "Gebruik deze locatie", + "editEntryRatingDialogTitle": "Waardering", + "removeEntryMetadataDialogTitle": "Verwijderen metadata", + "removeEntryMetadataDialogMore": "Meer", + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP is vereist om de video in een bewegende foto af te spelen.\n\nWeet je zeker dat je deze wilt verwijderen?", + "genericDangerWarningDialogMessage": "Weet je het zeker?", + "videoSpeedDialogLabel": "Afspeelsnelheid", + "videoStreamSelectionDialogVideo": "Video", + "videoStreamSelectionDialogAudio": "Audio", + "videoStreamSelectionDialogText": "Ondertiteling", + "videoStreamSelectionDialogOff": "Uit", + "videoStreamSelectionDialogTrack": "Spoor", + "videoStreamSelectionDialogNoSelection": "Er zijn geen andere sporen.", + "genericSuccessFeedback": "Klaar!", + "genericFailureFeedback": "Fout", + "menuActionConfigureView": "Beeld", + "menuActionSelect": "Selecteren", + "menuActionSelectAll": "Alles selecteren", + "menuActionSelectNone": "Selectie ongedaan maken", + "menuActionMap": "Kaart", + "menuActionSlideshow": "Diavoorstelling", + "menuActionStats": "Statistieken", + "viewDialogSortSectionTitle": "Sorteer", + "viewDialogGroupSectionTitle": "Secties", + "viewDialogLayoutSectionTitle": "Layout", + "viewDialogReverseSortOrder": "Sortering omkeren", + "tileLayoutMosaic": "Mozaïek", + "tileLayoutGrid": "Raster", + "tileLayoutList": "Lijst", + "coverDialogTabCover": "Kaft", + "coverDialogTabApp": "Applicatie", + "coverDialogTabColor": "Kleur", + "appPickDialogTitle": "Kies applicatie", + "appPickDialogNone": "Geen", + "aboutPageTitle": "Over", + "aboutLinkLicense": "Licentie", + "aboutBugSectionTitle": "Foutmelding", + "aboutBugSaveLogInstruction": "Sla applicatielogs op in een bestand", + "aboutBugCopyInfoInstruction": "Systeeminformatie kopiëren", + "aboutBugCopyInfoButton": "Kopieer", + "aboutBugReportInstruction": "Melden op GitHub met de logs en systeeminformatie", + "aboutBugReportButton": "Melden", + "aboutCreditsSectionTitle": "Dankbetuiging", + "aboutCreditsWorldAtlas1": "Deze applicatie gebruikt een TopoJSON-bestand van", + "aboutCreditsWorldAtlas2": "onder ISC-licentie.", + "aboutTranslatorsSectionTitle": "Vertalers", + "aboutLicensesSectionTitle": "Open-Source Licenties", + "aboutLicensesBanner": "Deze app maakt gebruik van de volgende open-sourcepakketten en bibliotheken.", + "aboutLicensesAndroidLibrariesSectionTitle": "Android bibliotheken", + "aboutLicensesFlutterPluginsSectionTitle": "Flutter Plugins", + "aboutLicensesFlutterPackagesSectionTitle": "Flutter Packages", + "aboutLicensesDartPackagesSectionTitle": "Dart Packages", + "aboutLicensesShowAllButtonLabel": "Alle licenties tonen", + "collectionPageTitle": "Verzameling", + "collectionPickPageTitle": "Kies", + "collectionSelectPageTitle": "Items selecteren", + "collectionActionShowTitleSearch": "Titelfilter weergeven", + "collectionActionHideTitleSearch": "Verberg titel filter", + "collectionActionAddShortcut": "Snelkoppeling aanmaken", + "collectionActionEmptyBin": "Prullenbak leegmaken", + "collectionActionCopy": "Naar album kopiëren", + "collectionActionMove": "Naar album verplaatsen", + "collectionActionRescan": "Opnieuw indexeren", + "collectionActionEdit": "Bewerken", + "collectionSearchTitlesHintText": "Zoek op titel", + "collectionGroupAlbum": "Op Albumnaam", + "collectionGroupMonth": "Op maand", + "collectionGroupDay": "Op dag", + "sectionUnknown": "Onbekend", + "dateToday": "Vandaag", + "dateYesterday": "Gisteren", + "dateThisMonth": "Deze maand", + "collectionDeleteFailureFeedback": "{count, plural, =1{Kan 1 item niet verwijderen} other{Kan {count} items niet verwijderen}}", + "collectionCopyFailureFeedback": "{count, plural, =1{Kan 1 item niet kopiëren} other{Kan {count} items niet kopiëren}}", + "collectionMoveFailureFeedback": "{count, plural, =1{Kan 1 item niet verplaatsen} other{Kan {count} items niet verplaatsen}}", + "collectionRenameFailureFeedback": "{count, plural, =1{Kan 1 item niet hernoemen} other{Kan {count} items niet hernoemen}}", + "collectionEditFailureFeedback": "{count, plural, =1{Kan 1 item niet bewerken} other{Kan {count} items niet bewerken}}", + "collectionExportFailureFeedback": "{count, plural, =1{Kan 1 pagina niet exporteren} other{Kan {count} pagina’s niet exporteren}}", + "collectionCopySuccessFeedback": "{count, plural, =1{1 item gekopieerd} other{{count} items gekopieerd}}", + "collectionMoveSuccessFeedback": "{count, plural, =1{1 item verplaatst} other{{count} items verplaatst}}", + "collectionRenameSuccessFeedback": "{count, plural, =1{1 item hernoemd} other{{count} items hernoemd}}", + "collectionEditSuccessFeedback": "{count, plural, =1{1 item bewerkt} other{{count} items bewerkt}}", + "collectionEmptyFavourites": "Geen favourieten", + "collectionEmptyVideos": "Geen video’s", + "collectionEmptyImages": "Geen afbeeldingen", + "collectionEmptyGrantAccessButtonLabel": "Toegang verlenen", + "collectionSelectSectionTooltip": "Sectie selecteren", + "collectionDeselectSectionTooltip": "Sectie niet selecteren", + "drawerAboutButton": "Over", + "drawerSettingsButton": "Instellingen", + "drawerCollectionAll": "Alle verzamelingen", + "drawerCollectionFavourites": "Favourieten", + "drawerCollectionImages": "Afbeeldingen", + "drawerCollectionVideos": "Video’s", + "drawerCollectionAnimated": "Animaties", + "drawerCollectionMotionPhotos": "Bewegende foto’s", + "drawerCollectionPanoramas": "Panorama's", + "drawerCollectionRaws": "Raw foto’s", + "drawerCollectionSphericalVideos": "360° video’s", + "drawerAlbumPage": "Albums", + "drawerCountryPage": "Landen", + "drawerTagPage": "Labels", + "sortByDate": "Op datum", + "sortByName": "Op naam", + "sortByItemCount": "Op aantal items", + "sortBySize": "Op grootte", + "sortByAlbumFileName": "Op album- en itemnaam", + "sortByRating": "Op waardering", + "sortOrderNewestFirst": "Nieuwste eerst", + "sortOrderOldestFirst": "Oudste eerst", + "sortOrderAtoZ": "A - Z", + "sortOrderZtoA": "Z - A", + "sortOrderHighestFirst": "Hoogste eerst", + "sortOrderLowestFirst": "Laagste eerst", + "sortOrderLargestFirst": "Grootste eerst", + "sortOrderSmallestFirst": "Kleinste eerst", + "albumGroupTier": "Op rang", + "albumGroupType": "Op type", + "albumGroupVolume": "Op opslagvolume", + "albumMimeTypeMixed": "Gemengd", + "albumPickPageTitleCopy": "Naar album kopiëren", + "albumPickPageTitleExport": "Exporteren naar Album", + "albumPickPageTitleMove": "Naar album verplaatsen", + "albumPickPageTitlePick": "Kies Album", + "albumCamera": "Camera", + "albumDownload": "Opslaan", + "albumScreenshots": "Schermopnames", + "albumScreenRecordings": "Schermopnames", + "albumVideoCaptures": "Video opnames", + "albumPageTitle": "Albums", + "albumEmpty": "Geen albums", + "createAlbumButtonLabel": "AANMAKEN", + "newFilterBanner": "nieuw", + "countryPageTitle": "Landen", + "countryEmpty": "Geen landen", + "tagPageTitle": "Labels", + "tagEmpty": "Geen labels", + "binPageTitle": "Prullenbak", + "searchCollectionFieldHint": "Doorzoek collectie", + "searchRecentSectionTitle": "Recent", + "searchDateSectionTitle": "Datum", + "searchAlbumsSectionTitle": "Albums", + "searchCountriesSectionTitle": "Landen", + "searchPlacesSectionTitle": "Plaatsen", + "searchTagsSectionTitle": "Labels", + "searchRatingSectionTitle": "Waarderingen", + "searchMetadataSectionTitle": "Metadata", + "settingsPageTitle": "Instellingen", + "settingsSystemDefault": "Systeem", + "settingsDefault": "Standaard", + "settingsDisabled": "Uitgeschakeld", + "settingsSearchFieldLabel": "Instellingen doorzoeken", + "settingsSearchEmpty": "Geen instellingen gevonden", + "settingsActionExport": "Exporteren", + "settingsActionExportDialogTitle": "Exporteren", + "settingsActionImport": "Importeren", + "settingsActionImportDialogTitle": "Importeren", + "appExportCovers": "Omslagen", + "appExportFavourites": "Favorieten", + "appExportSettings": "Instellingen", + "settingsNavigationSectionTitle": "Navigatie", + "settingsHomeTile": "Startscherm", + "settingsHomeDialogTitle": "Startscherm", + "settingsKeepScreenOnTile": "Scherm aan houden", + "settingsKeepScreenOnDialogTitle": "Scherm aan houden", + "settingsDoubleBackExit": "Twee keer op “terug” tikken om af te sluiten", + "settingsConfirmationTile": "Bevestigingsdialogen", + "settingsConfirmationDialogTitle": "Bevestigingsdialogen", + "settingsConfirmationBeforeDeleteItems": "Bevestiging vragen voordat items voor altijd worden verwijderd", + "settingsConfirmationBeforeMoveToBinItems": "Bevestiging vragen voordat items naar de prullenbak worden verplaatst", + "settingsConfirmationBeforeMoveUndatedItems": "Bevestiging vragen voordat ongedateerde items worden verplaatst", + "settingsConfirmationAfterMoveToBinItems": "Bevestigingsbericht weergeven na het verplaatsen van items naar de prullenbak", + "settingsNavigationDrawerTile": "Navigatiemenu", + "settingsNavigationDrawerEditorPageTitle": "Navigatiemenu", + "settingsNavigationDrawerBanner": "Houd ingedrukt om menu-items te verplaatsen en opnieuw te ordenen.", + "settingsNavigationDrawerTabTypes": "Typen", + "settingsNavigationDrawerTabAlbums": "Albums", + "settingsNavigationDrawerTabPages": "Pagina’s", + "settingsNavigationDrawerAddAlbum": "Album toevoegen", + "settingsThumbnailSectionTitle": "Miniaturen", + "settingsThumbnailOverlayTile": "Overlay", + "settingsThumbnailOverlayPageTitle": "Overlay", + "settingsThumbnailShowFavouriteIcon": "Favorieten-pictogram tonen", + "settingsThumbnailShowTagIcon": "Label-pictogram tonen", + "settingsThumbnailShowLocationIcon": "Locatie-pictogram tonen", + "settingsThumbnailShowMotionPhotoIcon": "Bewegende foto-pictogram tonen", + "settingsThumbnailShowRating": "Waardering tonen", + "settingsThumbnailShowRawIcon": "Raw-pictogram tonen", + "settingsThumbnailShowVideoDuration": "Videoduur tonen", + "settingsCollectionQuickActionsTile": "Snelle bewerkingen", + "settingsCollectionQuickActionEditorPageTitle": "Snelle acties", + "settingsCollectionQuickActionTabBrowsing": "Blader", + "settingsCollectionQuickActionTabSelecting": "Selecteren", + "settingsCollectionBrowsingQuickActionEditorBanner": "Houd knoppen ingedrukt om deze te verplaatsen en te selecteren welke acties worden weergegeven bij het bladeren door items.", + "settingsCollectionSelectionQuickActionEditorBanner": "Houd knoppen ingedrukt om deze te verplaatsen en te selecteren welke acties worden weergegeven bij het selecteren van items.", + "settingsViewerSectionTitle": "Voorbeeld", + "settingsViewerGestureSideTapNext": "Tik op het scherm om het vorige/volgende item weer te geven", + "settingsViewerUseCutout": "Uitgesneden gebied gebruiken", + "settingsViewerMaximumBrightness": "Maximale helderheid", + "settingsMotionPhotoAutoPlay": "Bewegingsfoto’s automatisch afspelen", + "settingsImageBackground": "Afbeeldingsachtergrond", + "settingsViewerQuickActionsTile": "Snelle bewerkingen", + "settingsViewerQuickActionEditorPageTitle": "Snelle acties", + "settingsViewerQuickActionEditorBanner": "Houd knoppen ingedrukt om deze te verplaatsen en te selecteren welke acties in de viewer worden weergegeven.", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Zichtbare knoppen", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Beschikbare knoppen", + "settingsViewerQuickActionEmpty": "Geen knoppen", + "settingsViewerOverlayTile": "Overlay", + "settingsViewerOverlayPageTitle": "Overlay", + "settingsViewerShowOverlayOnOpening": "Bij openen weergeven", + "settingsViewerShowMinimap": "Kleine kaart tonen", + "settingsViewerShowInformation": "Informatie tonen", + "settingsViewerShowInformationSubtitle": "Titel, datum, locatie, etc.", + "settingsViewerShowShootingDetails": "Opnamedetails tonen", + "settingsViewerShowOverlayThumbnails": "Miniaturen tonen", + "settingsViewerEnableOverlayBlurEffect": "Vervagingseffect", + "settingsViewerSlideshowTile": "Diavoorstelling", + "settingsViewerSlideshowPageTitle": "Diavoorstelling", + "settingsSlideshowRepeat": "Herhalen", + "settingsSlideshowShuffle": "Willekeurige volgorde", + "settingsSlideshowFillScreen": "Volledig scherm", + "settingsSlideshowAnimatedZoomEffect": "Geanimeerd zoomeffect", + "settingsSlideshowTransitionTile": "Overgang", + "settingsSlideshowIntervalTile": "Interval", + "settingsSlideshowVideoPlaybackTile": "Video afspelen", + "settingsSlideshowVideoPlaybackDialogTitle": "Video afspelen", + "settingsVideoPageTitle": "Video Instellingen", + "settingsVideoSectionTitle": "Video", + "settingsVideoShowVideos": "Video's weergeven", + "settingsVideoEnableHardwareAcceleration": "Hardware-versnelling", + "settingsVideoAutoPlay": "Automatisch afspelen", + "settingsVideoLoopModeTile": "Herhaald afspelen", + "settingsVideoLoopModeDialogTitle": "Herhaald afspelen", + "settingsSubtitleThemeTile": "Ondertiteling", + "settingsSubtitleThemePageTitle": "Ondertiteling", + "settingsSubtitleThemeSample": "Dit is een voorbeeld.", + "settingsSubtitleThemeTextAlignmentTile": "Tekst uitlijnen", + "settingsSubtitleThemeTextAlignmentDialogTitle": "Tekst uitlijnen", + "settingsSubtitleThemeTextSize": "Tekstgroote", + "settingsSubtitleThemeShowOutline": "Omtrek en schaduw tonen", + "settingsSubtitleThemeTextColor": "Tekstkleur", + "settingsSubtitleThemeTextOpacity": "Tekstdoorzichtigheid", + "settingsSubtitleThemeBackgroundColor": "Achtergrondkleur", + "settingsSubtitleThemeBackgroundOpacity": "Achtergronddoorzichtigheid", + "settingsSubtitleThemeTextAlignmentLeft": "Links", + "settingsSubtitleThemeTextAlignmentCenter": "Midden", + "settingsSubtitleThemeTextAlignmentRight": "Rechts", + "settingsVideoControlsTile": "Bediening", + "settingsVideoControlsPageTitle": "Bediening", + "settingsVideoButtonsTile": "Knoppen", + "settingsVideoGestureDoubleTapTogglePlay": "Dubbeltik om te spelen/pauzeren", + "settingsVideoGestureSideDoubleTapSeek": "Dubbeltik op schermranden om achteruit/vooruit te zoeken", + "settingsPrivacySectionTitle": "Privacy", + "settingsAllowInstalledAppAccess": "Toegang tot app-inventaris toestaan", + "settingsAllowInstalledAppAccessSubtitle": "Gebruikt om de albumweergave te verbeteren", + "settingsAllowErrorReporting": "Anonieme foutmeldingen toestaan", + "settingsSaveSearchHistory": "Zoekgeschiedenis opslaan", + "settingsEnableBin": "Prullenbak gebruiken", + "settingsEnableBinSubtitle": "Bewaar verwijderde items 30 dagen", + "settingsHiddenItemsTile": "Verborgen items", + "settingsHiddenItemsPageTitle": "Verborgen Items", + "settingsHiddenFiltersBanner": "Foto’s en video’s die overeenkomen met verborgen filters, worden niet weergegeven in je verzameling.", + "settingsHiddenFiltersEmpty": "Geen verborgen filters", + "settingsStorageAccessTile": "Toegang tot opslag", + "settingsStorageAccessPageTitle": "Toegang tot opslag", + "settingsStorageAccessBanner": "Sommige mappen vereisen een expliciete toegangstoekenning om bestanden erin te wijzigen. Je kunt hier directory’s bekijken waartoe je eerder toegang hebt verleend.", + "settingsStorageAccessEmpty": "Geen toegang verleend", + "settingsStorageAccessRevokeTooltip": "Herroepen", + "settingsAccessibilitySectionTitle": "Toegankelijkheid", + "settingsRemoveAnimationsTile": "Animaties verwijderen", + "settingsRemoveAnimationsDialogTitle": "Animaties verwijderen", + "settingsTimeToTakeActionTile": "Reactietijd", + "settingsDisplaySectionTitle": "Scherm", + "settingsThemeBrightnessTile": "Thema", + "settingsThemeBrightnessDialogTitle": "Thema", + "settingsThemeColorHighlights": "Kleurmarkeringen", + "settingsThemeEnableDynamicColor": "Dynamische kleuren", + "settingsDisplayRefreshRateModeTile": "Vernieuwingssnelheid weergeven", + "settingsDisplayRefreshRateModeDialogTitle": "Vernieuwingssnelheid", + "settingsLanguageSectionTitle": "Taal & landinstellingen", + "settingsLanguageTile": "Taal", + "settingsLanguagePageTitle": "Taal", + "settingsCoordinateFormatTile": "Coördinaten-weergave", + "settingsCoordinateFormatDialogTitle": "Coördinaten-weergave", + "settingsUnitSystemTile": "Eenheden", + "settingsUnitSystemDialogTitle": "Eenheden", + "settingsScreenSaverPageTitle": "Schermbeveiliging", + "settingsWidgetPageTitle": "Fotolijst", + "settingsWidgetShowOutline": "Contour", + "settingsWidgetOpenPage": "Bij het tikken op de widget", + "settingsCollectionTile": "Verzameling", + "statsPageTitle": "Stats", + "statsWithGps": "{count, plural, =1{1 item met locatie} other{{count} items met locatie}}", + "statsTopCountriesSectionTitle": "Top Landen", + "statsTopPlacesSectionTitle": "Top Plaatsen", + "statsTopTagsSectionTitle": "Top Labels", + "statsTopAlbumsSectionTitle": "Top Albums", + "viewerOpenPanoramaButtonLabel": "PANORAMA OPENEN", + "viewerSetWallpaperButtonLabel": "ALS ACHTERGROND INSTELLEN", + "viewerErrorUnknown": "Oei!", + "viewerErrorDoesNotExist": "Het bestand bestaat niet meer.", + "viewerInfoPageTitle": "Info", + "viewerInfoBackToViewerTooltip": "Terug naar viewer", + "viewerInfoUnknown": "onbekendd", + "viewerInfoLabelDescription": "Omschrijving", + "viewerInfoLabelTitle": "Titel", + "viewerInfoLabelDate": "Datum", + "viewerInfoLabelResolution": "Resolutie", + "viewerInfoLabelSize": "Grootte", + "viewerInfoLabelUri": "URI", + "viewerInfoLabelPath": "Pad", + "viewerInfoLabelDuration": "Duur", + "viewerInfoLabelOwner": "Eigenaar", + "viewerInfoLabelCoordinates": "Coördinaten", + "viewerInfoLabelAddress": "Adres", + "mapStyleDialogTitle": "Kaartstijl", + "mapStyleTooltip": "Kaartstijl selecteren", + "mapZoomInTooltip": "Inzoomen", + "mapZoomOutTooltip": "Uitzoomen", + "mapPointNorthUpTooltip": "Noorden boven", + "mapAttributionOsmHot": "Tegels door [HOT](https://www.hotosm.org/) • Gehost door [OSM France](https://openstreetmap.fr/)", + "mapAttributionStamen": "Tegels door [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "openMapPageTooltip": "Op kaartpagina tonen", + "mapEmptyRegion": "Geen afbeeldingen in dit gebied", + "viewerInfoOpenEmbeddedFailureFeedback": "Kan ingesloten gegevens niet extraheren", + "viewerInfoOpenLinkText": "Openen", + "viewerInfoViewXmlLinkText": "Bekijk XML", + "viewerInfoSearchFieldLabel": "Metadata doorzoeken", + "viewerInfoSearchEmpty": "Geen overeenkomstige zoeksleutels", + "viewerInfoSearchSuggestionDate": "Datum & tijd", + "viewerInfoSearchSuggestionDescription": "Beschrijving", + "viewerInfoSearchSuggestionDimensions": "Afmetingen", + "viewerInfoSearchSuggestionResolution": "Resolutie", + "viewerInfoSearchSuggestionRights": "Rechten", + "wallpaperUseScrollEffect": "Scroll-effect gebruiken op startscherm", + "tagEditorPageTitle": "Labels bewerken", + "tagEditorPageNewTagFieldLabel": "Nieuw label", + "tagEditorPageAddTagTooltip": "Label toevoegen", + "tagEditorSectionRecent": "Recent", + "panoramaEnableSensorControl": "Sensor control inschakelen", + "panoramaDisableSensorControl": "Sensor control uitschakelen", + "sourceViewerPageTitle": "Source", + "widgetOpenPageCollection": "Verzameling openen", + "widgetOpenPageViewer": "Voorbeeld openen", + "durationDialogSeconds": "Seconden", + "aboutLinkPolicy": "Privacybeleid", + "policyPageTitle": "Privacybeleid", + "tagEditorSectionPlaceholders": "Aanduidingen", + "tagPlaceholderCountry": "Land", + "tagPlaceholderPlace": "Plaats", + "settingsAllowMediaManagement": "Mediabeheer toestaan", + "editEntryLocationDialogSetCustom": "Aangepaste locatie instellen", + "entryInfoActionExportMetadata": "Metagegevens exporteren", + "lengthUnitPercent": "%", + "vaultLockTypePin": "PIN", + "filterAspectRatioLandscapeLabel": "Liggend", + "chipActionCreateVault": "Kluis aanmaken", + "entryInfoActionRemoveLocation": "Verwijder locatie", + "chipActionConfigureVault": "Kluis configureren", + "filterNoAddressLabel": "Zonder adres", + "filterAspectRatioPortraitLabel": "Staand", + "widgetDisplayedItemRandom": "Willekeurig", + "widgetDisplayedItemMostRecent": "Laatst gebruikt", + "keepScreenOnVideoPlayback": "Tijdens het afspelen van video", + "settingsVideoEnablePip": "Beeld-in-beeld", + "filterTaggedLabel": "Met label", + "lengthUnitPixel": "px", + "vaultLockTypePassword": "Wachtwoord", + "saveCopyButtonLabel": "KOPIE OPSLAAN", + "applyTooltip": "Toepassen", + "tagPlaceholderState": "Staat", + "stopTooltip": "Stop", + "chipActionLock": "Vergrendel", + "chipActionShowCountryStates": "Staten tonen", + "chipActionGoToPlacePage": "In Plaatsen tonen", + "subtitlePositionTop": "Boven", + "subtitlePositionBottom": "Onder", + "settingsThumbnailShowHdrIcon": "HDR-pictogram tonen", + "editorTransformCrop": "Bijsnijden", + "patternDialogConfirm": "Patroon bevestigen", + "pinDialogEnter": "Voer PIN in", + "settingsAskEverytime": "Elke keer vragen", + "aboutDataUsageExternal": "Extern", + "tooManyItemsErrorDialogMessage": "Probeer opnieuw met minder items.", + "maxBrightnessAlways": "Altijd", + "patternDialogEnter": "Voer patroon in", + "settingsViewerShowDescription": "Beschrijving tonen", + "exportEntryDialogQuality": "Kwaliteit", + "aboutDataUsageDatabase": "Database", + "aboutDataUsageMisc": "Overig", + "settingsModificationWarningDialogMessage": "Andere instellingen zullen worden aangepast.", + "vaultDialogLockModeWhenScreenOff": "Vergrendelen wanneer het scherm wordt uitgeschakeld", + "aboutDataUsageData": "Data", + "aboutDataUsageCache": "Cache", + "aboutDataUsageInternal": "Intern", + "overlayHistogramRGB": "RGB", + "overlayHistogramLuminance": "Helderheid", + "videoResumptionModeNever": "Nooit", + "pinDialogConfirm": "PIN bevestigen", + "passwordDialogEnter": "Voer wachtwoord in", + "passwordDialogConfirm": "Wachtwoord bevestigen", + "settingsViewerShowHistogram": "Histogram weergeven", + "settingsVideoGestureVerticalDragBrightnessVolume": "Veeg omhoog of naar beneden om helderheid/volume aan te passen", + "settingsSubtitleThemeTextPositionTile": "Tekstpositie", + "settingsSubtitleThemeTextPositionDialogTitle": "Tekstpositie", + "vaultLockTypePattern": "Patroon", + "entryActionShareImageOnly": "Enkel afbeelding delen", + "entryActionShareVideoOnly": "Enkel video delen", + "cropAspectRatioOriginal": "Origineel", + "cropAspectRatioSquare": "Vierkant", + "maxBrightnessNever": "Nooit", + "videoResumptionModeAlways": "Altijd", + "exportEntryDialogWriteMetadata": "Metadata schrijven", + "chipActionShowCollection": "In Collectie tonen", + "entryActionCast": "Casten", + "videoRepeatActionSetStart": "Start instellen", + "videoRepeatActionSetEnd": "Einde instellen", + "viewerActionUnlock": "Weergave ontgrendelen", + "filterLocatedLabel": "Met Plaats", + "overlayHistogramNone": "Geen", + "authenticateToUnlockVault": "Verifieer om de kluis te ontgrendelen", + "vaultBinUsageDialogMessage": "Sommige kluizen gebruiken de prullenbak.", + "settingsDisablingBinWarningDialogMessage": "Items in de Prullenbak worden voor altijd verwijderd.", + "statsTopStatesSectionTitle": "Top Staten", + "editorTransformRotate": "Roteren", + "editorActionTransform": "Transformeren", + "stateEmpty": "Zonder Staten", + "settingsViewerShowRatingTags": "Waardering & labels tonen", + "drawerPlacePage": "Plaatsen", + "newVaultWarningDialogMessage": "Items in kluizen zijn alleen beschikbaar voor deze app en niet voor andere.\n\nAls je deze app verwijdert of deze app-gegevens wist, verlies je al deze items.", + "vaultDialogLockTypeLabel": "Vergrendelingstype", + "tagEditorDiscardDialogMessage": "Wijzigingen ongedaan maken?", + "renameProcessorHash": "Controlenummer", + "castDialogTitle": "Cast-apparaten", + "aboutDataUsageSectionTitle": "Gegevensgebruik", + "statePageTitle": "Staten", + "searchStatesSectionTitle": "Staten", + "settingsVideoPlaybackTile": "Afspelen", + "settingsVideoResumptionModeTile": "Afspelen hervatten", + "settingsVideoResumptionModeDialogTitle": "Afspelen hervatten", + "settingsVideoBackgroundMode": "Achtergrond-modus", + "configureVaultDialogTitle": "Kluis configureren", + "settingsWidgetDisplayedItem": "Zichtbaar item", + "albumTierVaults": "Kluizen", + "aboutDataUsageClearCache": "Cache wissen", + "placePageTitle": "Plaatsen", + "placeEmpty": "Zonder plaatsen", + "settingsCollectionBurstPatternsNone": "Geen", + "settingsVideoPlaybackPageTitle": "Afspelen", + "settingsVideoBackgroundModeDialogTitle": "Achtergrond-modus", + "settingsCollectionBurstPatternsTile": "Burst-patronen", + "settingsAccessibilityShowPinchGestureAlternatives": "Alternatieven voor multi-touch-gebaren weergeven", + "settingsDisplayUseTvInterface": "Android TV-interface", + "settingsForceWesternArabicNumeralsTile": "Arabische cijfers forceren", + "explorerPageTitle": "Bestanden", + "columnCount": "{count, plural, =1{{count} kolom} other{{count} kolommen}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "widgetTapUpdateWidget": "Widget bijwerken", + "authenticateToConfigureVault": "Verifieer om de kluis te configureren", + "settingsConfirmationVaultDataLoss": "Waarschuwing weergeven voor verlies van kluisgegevens", + "newVaultDialogTitle": "Nieuwe kluis", + "chipActionGoToExplorerPage": "In Bestanden tonen", + "cropAspectRatioFree": "Vrij", + "videoActionABRepeat": "A-B herhalen", + "viewerActionLock": "Weergave vergrendelen", + "collectionActionSetHome": "Als startpagina instellen", + "setHomeCustom": "Aangepast", + "explorerActionSelectStorageVolume": "Opslag selecteren", + "selectStorageVolumeDialogTitle": "Opslag selecteren", + "sortByDuration": "Op lengte", + "sortOrderShortestFirst": "Kortste eerst", + "sortOrderLongestFirst": "Langste eerst", + "mapStyleOpenTopoMap": "OpenTopoMap", + "mapStyleOsmLiberty": "OSM Liberty", + "mapAttributionOsmLiberty": "Symbolen van [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Aangeboden door [OSM Americana](https://tile.ourmap.us)", + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tegels van [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "mapAttributionOsmData": "Kaartgegevens © [OpenStreetMap](https://www.openstreetmap.org/copyright) bijdragers", + "videoActionShowNextFrame": "Volgend frame weergeven", + "videoActionShowPreviousFrame": "Vorig frame weergeven", + "newAlbumDialogAlbumAlreadyExistsHelper": "Album bestaat al", + "albumTierDynamic": "Dynamisch", + "newDynamicAlbumDialogTitle": "Nieuw dynamisch album", + "dynamicAlbumAlreadyExists": "Dynamisch album bestaat al", + "collectionActionAddDynamicAlbum": "Dynamisch album toevoegen", + "appExportDynamicAlbums": "Dynamische albums", + "chipActionRemove": "Verwijderen", + "chipActionDecompose": "Splitsen", + "coordinateFormatDdm": "DDM", + "editEntryLocationDialogImportGpx": "GPX importeren", + "editEntryLocationDialogTimeShift": "Verschuiving van de tijd", + "removeEntryMetadataDialogAll": "Alle", + "searchFormatSectionTitle": "Formaten", + "sortByPath": "Op pad", + "sectionNone": "Geen secties", + "createButtonLabel": "AANMAKEN", + "groupPickerUseThisGroupButton": "Deze groep gebruiken", + "newGroupDialogTitle": "Nieuwe groep", + "chipActionGroup": "Groepering wijzigen", + "chipActionCreateGroup": "Groep aanmaken", + "albumTierGroups": "Groepen", + "newGroupDialogNameLabel": "Groepsnaam", + "groupAlreadyExists": "Groep bestaat al", + "groupEmpty": "Geen groep", + "groupPickerTitle": "Groep kiezen", + "ungrouped": "Niet gegroepeerd", + "mapStyleDialogAddStyle": "Stijl toevoegen", + "mapStyleEditorDialogUrl": "URL", + "mapStyleEditorDialogName": "Naam", + "mapStyleEditorDialogUserAgent": "User-Agent", + "mapStyleEditorDialogSubdomains": "Subdomeinen", + "settingsNavigationBottomActionsTile": "Navigatie onderaan", + "settingsNavigationBottomActionEditorPageTitle": "Navigatie onderaan", + "settingsNavigationBottomActionEditorBanner": "Lang indrukken om knoppen te verplaatsen en te selecteren welke acties worden weergegeven in de onderste navigatiebalk.", + "tagPickPageTitle": "Label kiezen", + "settingsViewerShowZoomLevel": "Zoom niveau tonen", + "settingsForced": "Gedwongen", + "settingsEnabled": "Ingeschakeld" +} diff --git a/lib/l10n/app_nn.arb b/lib/l10n/app_nn.arb new file mode 100644 index 0000000..f05165a --- /dev/null +++ b/lib/l10n/app_nn.arb @@ -0,0 +1,1456 @@ +{ + "timeSeconds": "{count, plural, other{{count} sekund}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "welcomeOptional": "Valfritt", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Eg samtykkjer til krava og føresetnadane", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, =1{{count} er vald} other{{count} er valde}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeMinutes": "{count, plural, other{{count} minutt}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "timeDays": "{count, plural, =1{{count} dag} other{{count} dagar}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "applyButtonLabel": "NYTTA", + "@applyButtonLabel": {}, + "deleteButtonLabel": "SLETT", + "@deleteButtonLabel": {}, + "nextButtonLabel": "NESTE", + "@nextButtonLabel": {}, + "showButtonLabel": "VIS", + "@showButtonLabel": {}, + "hideButtonLabel": "SKJUL", + "@hideButtonLabel": {}, + "continueButtonLabel": "HALD FRAM", + "@continueButtonLabel": {}, + "changeTooltip": "Brigd", + "@changeTooltip": {}, + "clearTooltip": "Tøm", + "@clearTooltip": {}, + "previousTooltip": "Førre", + "@previousTooltip": {}, + "nextTooltip": "Neste", + "@nextTooltip": {}, + "showTooltip": "Vis", + "@showTooltip": {}, + "hideTooltip": "Skjul", + "@hideTooltip": {}, + "actionRemove": "Tak bort", + "@actionRemove": {}, + "resetTooltip": "Still attende", + "@resetTooltip": {}, + "saveTooltip": "Spar", + "@saveTooltip": {}, + "pickTooltip": "Vel", + "@pickTooltip": {}, + "chipActionUnpin": "losna ifrå toppen", + "@chipActionUnpin": {}, + "chipActionRename": "Byt namn", + "@chipActionRename": {}, + "chipActionSetCover": "Sett omslag", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "Lag eit album", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "Kopier til utklippstavla", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "Slett", + "@entryActionDelete": {}, + "entryActionConvert": "Lag om", + "@entryActionConvert": {}, + "entryActionRename": "Byt namn", + "@entryActionRename": {}, + "entryActionRestore": "Gjenopprett", + "@entryActionRestore": {}, + "entryActionRotateCCW": "Snu imot klokka", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Snu med klokka", + "@entryActionRotateCW": {}, + "entryActionFlip": "Vend vassrett", + "@entryActionFlip": {}, + "entryActionPrint": "Skriv ut", + "@entryActionPrint": {}, + "entryActionViewSource": "Vis kjelda", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "Vis som overlagskart", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Lag om til eit stillbilete", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Opne video", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Brigd", + "@entryActionEdit": {}, + "entryActionOpen": "Opne med", + "@entryActionOpen": {}, + "entryActionSetAs": "Sett som", + "@entryActionSetAs": {}, + "entryActionOpenMap": "Vis i kartapp", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Snu skjermen", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Lik", + "@entryActionAddFavourite": {}, + "videoActionCaptureFrame": "Grip biletet", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Døyv", + "@videoActionMute": {}, + "videoActionUnmute": "Ikkje døyv", + "@videoActionUnmute": {}, + "videoActionPause": "Stans", + "@videoActionPause": {}, + "videoActionPlay": "Spel av", + "@videoActionPlay": {}, + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Velkomen til Aves", + "@welcomeMessage": {}, + "chipActionPin": "Fest til toppen", + "@chipActionPin": {}, + "cancelTooltip": "Avbryt", + "@cancelTooltip": {}, + "doubleBackExitMessage": "Trykk «attende» igjen for å gå ut.", + "@doubleBackExitMessage": {}, + "sourceStateLocatingPlaces": "Finn stadar", + "@sourceStateLocatingPlaces": {}, + "doNotAskAgain": "Ikkje spør att", + "@doNotAskAgain": {}, + "chipActionDelete": "Slett", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Vis i Album", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Vis i Land", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "Vis i Merke", + "@chipActionGoToTagPage": {}, + "chipActionHide": "Skjul", + "@chipActionHide": {}, + "sourceStateLocatingCountries": "Finn land", + "@sourceStateLocatingCountries": {}, + "chipActionFilterOut": "Tak ut", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Tak med", + "@chipActionFilterIn": {}, + "entryActionExport": "Før ut", + "@entryActionExport": {}, + "entryActionInfo": "Opplysingar", + "@entryActionInfo": {}, + "entryActionShare": "Del", + "@entryActionShare": {}, + "entryActionRemoveFavourite": "Stogg å like", + "@entryActionRemoveFavourite": {}, + "videoActionReplay10": "Spol 10 sekund bakover", + "@videoActionReplay10": {}, + "videoActionSkip10": "Spol 10 sekund framover", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Vel spor", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Avspelingssnøggleik", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "Innstillingar", + "@viewerActionSettings": {}, + "slideshowActionResume": "Hald fram", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Vis i Samling", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Brigd datoen og tida", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditTitleDescription": "Brigd namnet og utgreiinga", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Brigd omdøminga", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Brigd merka", + "@entryInfoActionEditTags": {}, + "entryInfoActionExportMetadata": "Før ut metadata", + "@entryInfoActionExportMetadata": {}, + "filterAspectRatioLandscapeLabel": "Liggjande", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "Ståande", + "@filterAspectRatioPortraitLabel": {}, + "filterFavouriteLabel": "Likar", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Ikkje dagsette", + "@filterNoDateLabel": {}, + "filterNoAddressLabel": "Inga adresse", + "@filterNoAddressLabel": {}, + "filterNoRatingLabel": "Ikkje dømde", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Utan merke", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Utan namn", + "@filterNoTitleLabel": {}, + "filterRecentlyAddedLabel": "Nyleg lagde til", + "@filterRecentlyAddedLabel": {}, + "filterRatingRejectedLabel": "Avslegen", + "@filterRatingRejectedLabel": {}, + "filterTypeRawLabel": "Rå", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360°-video", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Bilete", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "G-M-S", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Desimalgrader", + "@coordinateFormatDecimal": {}, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "A", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "V", + "@coordinateDmsWest": {}, + "unitSystemImperial": "Engelske måleiningar", + "@unitSystemImperial": {}, + "videoLoopModeShortOnly": "Berre stutte videoar", + "@videoLoopModeShortOnly": {}, + "videoLoopModeNever": "Av", + "@videoLoopModeNever": {}, + "videoLoopModeAlways": "På", + "@videoLoopModeAlways": {}, + "videoControlsPlayOutside": "Opne med ein ytre avspelar", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (hybrid)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (mark)", + "@mapStyleGoogleTerrain": {}, + "nameConflictStrategyRename": "Byt namn", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Byt ut", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Hopp over", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "Aldri", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "Berre på visingssida", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Heile tida", + "@keepScreenOnAlways": {}, + "accessibilityAnimationsRemove": "Hindr skjermrørsler", + "@accessibilityAnimationsRemove": {}, + "subtitlePositionTop": "På toppen", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "I botnen", + "@subtitlePositionBottom": {}, + "videoPlaybackSkip": "Hopp over", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Spel av utan ljod", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Spel av med ljod", + "@videoPlaybackWithSound": {}, + "viewerTransitionZoomIn": "Auk", + "@viewerTransitionZoomIn": {}, + "wallpaperTargetLock": "Låseskjerm", + "@wallpaperTargetLock": {}, + "widgetDisplayedItemMostRecent": "Nylegaste", + "@widgetDisplayedItemMostRecent": {}, + "widgetOpenPageCollection": "Opne samlinga", + "@widgetOpenPageCollection": {}, + "widgetOpenPageViewer": "Opne visinga", + "@widgetOpenPageViewer": {}, + "albumTierPinned": "Festa", + "@albumTierPinned": {}, + "albumTierSpecial": "Ofte opna", + "@albumTierSpecial": {}, + "albumTierApps": "Appar", + "@albumTierApps": {}, + "albumTierRegular": "Andre", + "@albumTierRegular": {}, + "storageVolumeDescriptionFallbackPrimary": "Indre gøyme", + "@storageVolumeDescriptionFallbackPrimary": {}, + "rootDirectoryDescription": "rotmappe", + "@rootDirectoryDescription": {}, + "storageAccessDialogMessage": "Vel {directory} i «{volume}» i neste vising for å gje denne appen tilgjenge til ho.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "entryInfoActionEditLocation": "Brigd stadsetjinga", + "@entryInfoActionEditLocation": {}, + "entryInfoActionRemoveMetadata": "Tak bort metadata", + "@entryInfoActionRemoveMetadata": {}, + "filterOnThisDayLabel": "På denne dagen", + "@filterOnThisDayLabel": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "unitSystemMetric": "Metrisk", + "@unitSystemMetric": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (vassfarge)", + "@mapStyleStamenWatercolor": {}, + "viewerTransitionNone": "Ingen", + "@viewerTransitionNone": {}, + "storageVolumeDescriptionFallbackNonPrimary": "Ytre gøyme", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "albumTierNew": "Ny", + "@albumTierNew": {}, + "otherDirectoryDescription": "«{name}»-mappa", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "keepScreenOnVideoPlayback": "Under videoavspeling", + "@keepScreenOnVideoPlayback": {}, + "newAlbumDialogNameLabel": "Albumsnamn", + "@newAlbumDialogNameLabel": {}, + "durationDialogMinutes": "Minutt", + "@durationDialogMinutes": {}, + "settingsThemeColorHighlights": "Léta framhevjingar", + "@settingsThemeColorHighlights": {}, + "viewerInfoBackToViewerTooltip": "Attende til vising", + "@viewerInfoBackToViewerTooltip": {}, + "mapStyleDialogTitle": "Kartstil", + "@mapStyleDialogTitle": {}, + "notEnoughSpaceDialogMessage": "Denne gjerda tarv {neededSize} unytta rom på «{volume}» for å verta fullgjord, men det er berre {freeSize} att.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "missingSystemFilePickerDialogMessage": "Systemfilveljaren er borte eller avslegen. Slå han på og røyn om att.", + "@missingSystemFilePickerDialogMessage": {}, + "videoResumeDialogMessage": "Hald fram avspeling ifrå {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "videoStartOverButtonLabel": "BYRJA OM ATT", + "@videoStartOverButtonLabel": {}, + "hideFilterConfirmationDialogMessage": "Samsvarande bilete og videoar vil verte skjult ifrå samlinga di. Du kan visa dei att ifrå «Personvern»-innstillingane.\n\nEr du sikker på at du vil skjule dei?", + "@hideFilterConfirmationDialogMessage": {}, + "renameEntrySetPageInsertTooltip": "Innskrivingsområde", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePatternFieldLabel": "Namngjevingsmønster", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPagePreviewSectionTitle": "Førehandsvis", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameEntryDialogLabel": "Nytt namn", + "@renameEntryDialogLabel": {}, + "editEntryDialogCopyFromItem": "Kopier ifrå annan ting", + "@editEntryDialogCopyFromItem": {}, + "editEntryDateDialogSourceFileModifiedDate": "Filbrigdedato", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "Timar", + "@durationDialogHours": {}, + "editEntryLocationDialogChooseOnMap": "Vel på kartet", + "@editEntryLocationDialogChooseOnMap": {}, + "settingsLanguageTile": "Skriftmål", + "@settingsLanguageTile": {}, + "settingsUnitSystemTile": "Einingar", + "@settingsUnitSystemTile": {}, + "settingsCoordinateFormatDialogTitle": "Koordinatformat", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsWidgetDisplayedItem": "Vist ting", + "@settingsWidgetDisplayedItem": {}, + "statsTopAlbumsSectionTitle": "Topp-album", + "@statsTopAlbumsSectionTitle": {}, + "statsTopTagsSectionTitle": "Toppmerke", + "@statsTopTagsSectionTitle": {}, + "viewerInfoUnknown": "ukjend", + "@viewerInfoUnknown": {}, + "viewerInfoLabelResolution": "Oppløysing", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelOwner": "Eigar", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Koordinatar", + "@viewerInfoLabelCoordinates": {}, + "tagEditorPageAddTagTooltip": "Legg til merke", + "@tagEditorPageAddTagTooltip": {}, + "panoramaEnableSensorControl": "Slå på sensorstyring", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Slå av sensorstyring", + "@panoramaDisableSensorControl": {}, + "nameConflictDialogSingleSourceMessage": "Somme filer i målmappa har same namn.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "Somme filer har same namn.", + "@nameConflictDialogMultipleSourceMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Flytt denne tingen til papirkorga?} other{Flytt desse {count} tinga til papirkorga?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Slett denne tingen?} other{Slett desse {count} tinga?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoResumeButtonLabel": "HALD FRAM", + "@videoResumeButtonLabel": {}, + "entryActionShareVideoOnly": "Del berre video", + "@entryActionShareVideoOnly": {}, + "entryActionShareImageOnly": "Del berre bilete", + "@entryActionShareImageOnly": {}, + "unsupportedTypeDialogMessage": "{count, plural, other{Denne gjerda er ustødd for ting av fylgjande slag: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "addShortcutDialogLabel": "Snarvegsmerke", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "LEGG TIL", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "Ingen appar kan handsame dette.", + "@noMatchingAppDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "Spar datoane til tinga før du går vidare?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Spar datoar", + "@moveUndatedConfirmationDialogSetDate": {}, + "setCoverDialogLatest": "Nyaste ting", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Auto", + "@setCoverDialogAuto": {}, + "newAlbumDialogTitle": "Nytt Album", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Mappa finst alt", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Gøyme:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "Nytt namn", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Mappa finst alt", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Byt namn", + "@renameEntrySetPageTitle": {}, + "exportEntryDialogWidth": "Breidd", + "@exportEntryDialogWidth": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Slett desse albuma og deira ting?} other{Slett desse albuma og deira {count} ting?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "exportEntryDialogHeight": "Høgd", + "@exportEntryDialogHeight": {}, + "editEntryDateDialogExtractFromTitle": "Tak ut ifrå namn", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogCopyField": "Kopier ifrå annan dato", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogShift": "Skyv", + "@editEntryDateDialogShift": {}, + "durationDialogSeconds": "Sekund", + "@durationDialogSeconds": {}, + "editEntryRatingDialogTitle": "Omdøme", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Metadataborttaking", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "Meir", + "@removeEntryMetadataDialogMore": {}, + "statsTopPlacesSectionTitle": "Toppstadar", + "@statsTopPlacesSectionTitle": {}, + "settingsCollectionTile": "Samling", + "@settingsCollectionTile": {}, + "statsPageTitle": "Samandrag", + "@statsPageTitle": {}, + "statsTopCountriesSectionTitle": "Toppland", + "@statsTopCountriesSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "OPNE PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerInfoLabelSize": "Storleik", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelDate": "Dato", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelDuration": "Lengd", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelPath": "Sti", + "@viewerInfoLabelPath": {}, + "mapZoomOutTooltip": "Mink", + "@mapZoomOutTooltip": {}, + "mapZoomInTooltip": "Auk", + "@mapZoomInTooltip": {}, + "openMapPageTooltip": "Vis på kartsida", + "@openMapPageTooltip": {}, + "viewerInfoViewXmlLinkText": "Vis XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "Søk metadata", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Ingen samsvarande lyklar", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Dato og tid", + "@viewerInfoSearchSuggestionDate": {}, + "tagEditorPageTitle": "Brigd merke", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Nytt merke", + "@tagEditorPageNewTagFieldLabel": {}, + "sourceViewerPageTitle": "Kjelde", + "@sourceViewerPageTitle": {}, + "renameProcessorCounter": "Teljar", + "@renameProcessorCounter": {}, + "renameProcessorName": "Namn", + "@renameProcessorName": {}, + "editEntryDateDialogTitle": "Dato og tid", + "@editEntryDateDialogTitle": {}, + "editEntryLocationDialogLatitude": "Breiddegrad", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "Lengdegrad", + "@editEntryLocationDialogLongitude": {}, + "sourceStateLoading": "Hentar inn", + "@sourceStateLoading": {}, + "viewerErrorDoesNotExist": "Fila finst ikkje meir.", + "@viewerErrorDoesNotExist": {}, + "filterBinLabel": "Papirkorg", + "@filterBinLabel": {}, + "filterTypeAnimatedLabel": "Animert", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "Rørslebilete", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, + "mapStyleOsmHot": "Humanitært OSM", + "@mapStyleOsmHot": {}, + "themeBrightnessLight": "Ljos", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Mørk", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Svart", + "@themeBrightnessBlack": {}, + "viewerTransitionSlide": "Skridande", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Parallakse", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "Ton ut", + "@viewerTransitionFade": {}, + "widgetDisplayedItemRandom": "Tilfeldig", + "@widgetDisplayedItemRandom": {}, + "widgetOpenPageHome": "Opne heimsida", + "@widgetOpenPageHome": {}, + "restrictedAccessDialogMessage": "Denne appen har ikkje lov til å brigde filer i «{directory}»-mappa i «{volume}».\n\nBruk ein førehandsinnlagd filhandsamar eller galleriapp til å flytta tinga til ei anna mappe.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Slett dette albumet og tingen i det?} other{Slett dette albumet og dei {count} tinga i det?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "exportEntryDialogFormat": "Format:", + "@exportEntryDialogFormat": {}, + "tagPlaceholderCountry": "Land", + "@tagPlaceholderCountry": {}, + "tagEditorSectionRecent": "Nyleg", + "@tagEditorSectionRecent": {}, + "tagPlaceholderPlace": "Stad", + "@tagPlaceholderPlace": {}, + "viewerInfoSearchSuggestionRights": "Rettar", + "@viewerInfoSearchSuggestionRights": {}, + "viewerInfoSearchSuggestionResolution": "Oppløysing", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoOpenLinkText": "Opne", + "@viewerInfoOpenLinkText": {}, + "mapStyleTooltip": "Vel kartstil", + "@mapStyleTooltip": {}, + "viewerInfoLabelAddress": "Adresse", + "@viewerInfoLabelAddress": {}, + "viewerInfoLabelTitle": "Namn", + "@viewerInfoLabelTitle": {}, + "viewerErrorUnknown": "Oida.", + "@viewerErrorUnknown": {}, + "viewerSetWallpaperButtonLabel": "SET SOM BAKGRUNNSBILETE", + "@viewerSetWallpaperButtonLabel": {}, + "settingsWidgetShowOutline": "Omrit", + "@settingsWidgetShowOutline": {}, + "settingsWidgetPageTitle": "Bileteramme", + "@settingsWidgetPageTitle": {}, + "settingsScreenSaverPageTitle": "Skjermsparar", + "@settingsScreenSaverPageTitle": {}, + "settingsUnitSystemDialogTitle": "Einingar", + "@settingsUnitSystemDialogTitle": {}, + "settingsCoordinateFormatTile": "Koordinatformat", + "@settingsCoordinateFormatTile": {}, + "settingsLanguagePageTitle": "Skriftmål", + "@settingsLanguagePageTitle": {}, + "settingsLanguageSectionTitle": "Skriftmål og format", + "@settingsLanguageSectionTitle": {}, + "settingsDisplaySectionTitle": "Vising", + "@settingsDisplaySectionTitle": {}, + "videoStreamSelectionDialogTrack": "Spor", + "@videoStreamSelectionDialogTrack": {}, + "genericDangerWarningDialogMessage": "Er du viss?", + "@genericDangerWarningDialogMessage": {}, + "menuActionStats": "Samandrag", + "@menuActionStats": {}, + "viewDialogGroupSectionTitle": "Hop", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Oppsett", + "@viewDialogLayoutSectionTitle": {}, + "tileLayoutMosaic": "Mosaikk", + "@tileLayoutMosaic": {}, + "aboutBugCopyInfoButton": "Kopier", + "@aboutBugCopyInfoButton": {}, + "aboutCreditsWorldAtlas1": "Denne appen nyttar ei TopoJSON-fil ifrå", + "@aboutCreditsWorldAtlas1": {}, + "viewerInfoSearchSuggestionDescription": "Utgreiing", + "@viewerInfoSearchSuggestionDescription": {}, + "aboutCreditsWorldAtlas2": "under ISC-løyve.", + "@aboutCreditsWorldAtlas2": {}, + "videoSpeedDialogLabel": "Avspelingssnøggleik", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Ljod", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Undertekster", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "Av", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogNoSelection": "Det er ingen andre spor.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "Ferdig", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Mislykka", + "@genericFailureFeedback": {}, + "menuActionSelectAll": "Vel alle", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "Tak bort val", + "@menuActionSelectNone": {}, + "menuActionMap": "Kart", + "@menuActionMap": {}, + "menuActionSlideshow": "Ljosbiletevising", + "@menuActionSlideshow": {}, + "menuActionConfigureView": "Vis", + "@menuActionConfigureView": {}, + "menuActionSelect": "Vel", + "@menuActionSelect": {}, + "aboutBugCopyInfoInstruction": "Kopier systemopplysingar", + "@aboutBugCopyInfoInstruction": {}, + "tagEditorSectionPlaceholders": "Førebels", + "@tagEditorSectionPlaceholders": {}, + "tileLayoutGrid": "Rutenett", + "@tileLayoutGrid": {}, + "tileLayoutList": "Liste", + "@tileLayoutList": {}, + "coverDialogTabCover": "Omslag", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "App", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Let", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Vel app", + "@appPickDialogTitle": {}, + "aboutPageTitle": "Om", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Løyve", + "@aboutLinkLicense": {}, + "appPickDialogNone": "Ingen", + "@appPickDialogNone": {}, + "aboutBugSectionTitle": "Mistakrapport", + "@aboutBugSectionTitle": {}, + "aboutTranslatorsSectionTitle": "Omsetjarar", + "@aboutTranslatorsSectionTitle": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Greidde ikkje å pakke ut innbygde data", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "dateThisMonth": "Denne månaden", + "@dateThisMonth": {}, + "settingsViewerSectionTitle": "Visinga", + "@settingsViewerSectionTitle": {}, + "cropAspectRatioFree": "Frihand", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Opphavleg", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Kvadrat", + "@cropAspectRatioSquare": {}, + "videoResumptionModeNever": "Aldri", + "@videoResumptionModeNever": {}, + "wallpaperTargetHome": "Heimskjermen", + "@wallpaperTargetHome": {}, + "settingsViewerShowMinimap": "Vis småkart", + "@settingsViewerShowMinimap": {}, + "patternDialogConfirm": "Stadfest mønsteret", + "@patternDialogConfirm": {}, + "exportEntryDialogWriteMetadata": "Tak med metadata", + "@exportEntryDialogWriteMetadata": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP er turvt for å kunne spela av videoen inni rørslebilete.\n\nEr du viss på at du vil ta det bort?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "aboutBugSaveLogInstruction": "Spar apploggar til ei fil", + "@aboutBugSaveLogInstruction": {}, + "collectionActionMove": "Flytt til album", + "@collectionActionMove": {}, + "collectionGroupAlbum": "Etter album", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Etter månad", + "@collectionGroupMonth": {}, + "sectionUnknown": "Ukjend", + "@sectionUnknown": {}, + "collectionEditFailureFeedback": "{count, plural, other{Kunne ikkje brigde {count} ting}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, other{Flytte {count} ting}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyFavourites": "Det du likar vert vist her", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "Ingen videoar", + "@collectionEmptyVideos": {}, + "drawerCollectionMotionPhotos": "Rørslebilete", + "@drawerCollectionMotionPhotos": {}, + "drawerTagPage": "Merke", + "@drawerTagPage": {}, + "sortByDate": "Etter dato", + "@sortByDate": {}, + "sortBySize": "Etter storleik", + "@sortBySize": {}, + "sortByRating": "Etter omdøme", + "@sortByRating": {}, + "sortOrderNewestFirst": "Nyaste først", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Eldste først", + "@sortOrderOldestFirst": {}, + "sortOrderLargestFirst": "Største først", + "@sortOrderLargestFirst": {}, + "albumScreenRecordings": "Skjermopptak", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Videoopptak", + "@albumVideoCaptures": {}, + "albumEmpty": "Ingen album", + "@albumEmpty": {}, + "searchAlbumsSectionTitle": "Album", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "Land", + "@searchCountriesSectionTitle": {}, + "settingsConfirmationVaultDataLoss": "Åtvar om datatap ved kvelvet", + "@settingsConfirmationVaultDataLoss": {}, + "settingsNavigationDrawerAddAlbum": "Legg til album", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsConfirmationAfterMoveToBinItems": "Verta spurd om du vil angre etter å ha kasta ting i søppelkorga", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsThumbnailShowTagIcon": "Vis merke-ikon", + "@settingsThumbnailShowTagIcon": {}, + "settingsCollectionBurstPatternsNone": "Ingen", + "@settingsCollectionBurstPatternsNone": {}, + "settingsViewerQuickActionEmpty": "Ingen knappar", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerShowOverlayOnOpening": "Vis ved opning", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowShootingDetails": "Vis biletetakingsopplysingar", + "@settingsViewerShowShootingDetails": {}, + "settingsSlideshowFillScreen": "Fyll skjermen", + "@settingsSlideshowFillScreen": {}, + "settingsViewerEnableOverlayBlurEffect": "Uskarp verknad", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsSlideshowVideoPlaybackTile": "Videoavspeling", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Videoavspeling", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoShowVideos": "Vis videoar", + "@settingsVideoShowVideos": {}, + "settingsVideoEnableHardwareAcceleration": "Auk ytinga med maskinvara", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoBackgroundMode": "Spel av i bakgrunnen", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "Spel av i bakgrunnen", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsSlideshowIntervalTile": "Byt til neste etter", + "@settingsSlideshowIntervalTile": {}, + "settingsSubtitleThemeTextAlignmentTile": "Tekststilling", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeShowOutline": "Vis omriss og skuggar", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Tekststilling", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Vis andre utvegar for fleirtrykkhandvendingar", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsThemeEnableDynamicColor": "Skiftande let", + "@settingsThemeEnableDynamicColor": {}, + "settingsHiddenItemsTile": "Skjulte ting", + "@settingsHiddenItemsTile": {}, + "settingsStorageAccessBanner": "Nokre mapper krev at du gjev appen tilgjenge til dei for å brigde filer i dei. Du kan sjå på mappene som du har gjeve appen tilgjenge til her.", + "@settingsStorageAccessBanner": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Rørslejamleik", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "viewerInfoPageTitle": "Opplysingar", + "@viewerInfoPageTitle": {}, + "mapPointNorthUpTooltip": "Rett opp", + "@mapPointNorthUpTooltip": {}, + "setCoverDialogCustom": "Eiget", + "@setCoverDialogCustom": {}, + "pinDialogEnter": "Skriv inn ein talkode", + "@pinDialogEnter": {}, + "settingsNavigationDrawerBanner": "Trykk og hald for å flytta og brigde rekkjefylgda til menytinga.", + "@settingsNavigationDrawerBanner": {}, + "settingsEnableBinSubtitle": "Sparar på sletta ting i 30 dagar", + "@settingsEnableBinSubtitle": {}, + "statsTopStatesSectionTitle": "Topplandsdelar", + "@statsTopStatesSectionTitle": {}, + "chipActionCreateVault": "Kvelv", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "Set opp kvelvet", + "@chipActionConfigureVault": {}, + "displayRefreshRatePreferLowest": "Mest ujamn", + "@displayRefreshRatePreferLowest": {}, + "filterTaggedLabel": "Merkte", + "@filterTaggedLabel": {}, + "displayRefreshRatePreferHighest": "Mest jamn", + "@displayRefreshRatePreferHighest": {}, + "settingsThumbnailShowLocationIcon": "Vis stad-ikon", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowFavouriteIcon": "Vis likt-ikon", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsImageBackground": "Biletbakgrunn", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Kvikkgjerder", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerShowRatingTags": "Vis omdøme og merke", + "@settingsViewerShowRatingTags": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Tilgjengelege knappar", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "saveCopyButtonLabel": "SPAR KOPI", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Nytt", + "@applyTooltip": {}, + "editorActionTransform": "Form om", + "@editorActionTransform": {}, + "editorTransformCrop": "Klipp til", + "@editorTransformCrop": {}, + "editorTransformRotate": "Snu", + "@editorTransformRotate": {}, + "maxBrightnessNever": "Aldri", + "@maxBrightnessNever": {}, + "wallpaperTargetHomeLock": "Heim- og låseskjermane", + "@wallpaperTargetHomeLock": {}, + "sortOrderAtoZ": "A-Å", + "@sortOrderAtoZ": {}, + "createAlbumButtonLabel": "LAG", + "@createAlbumButtonLabel": {}, + "countryPageTitle": "Land", + "@countryPageTitle": {}, + "countryEmpty": "Ingen land", + "@countryEmpty": {}, + "tagEmpty": "Ingen merke", + "@tagEmpty": {}, + "newVaultWarningDialogMessage": "Ting i kvelva er berre tilgjengelege for denne appen.\n\nOm du slettar denne appen eller tømmer dataa til denne appen, vil du missa alt som er i kvelva.", + "@newVaultWarningDialogMessage": {}, + "newVaultDialogTitle": "Nytt kvelv", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "Set opp kvelvet", + "@configureVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "Lås når skjermen slår seg av", + "@vaultDialogLockModeWhenScreenOff": {}, + "sortOrderLowestFirst": "Lægste først", + "@sortOrderLowestFirst": {}, + "maxBrightnessAlways": "Heile tida", + "@maxBrightnessAlways": {}, + "videoResumptionModeAlways": "Kvar gong", + "@videoResumptionModeAlways": {}, + "vaultDialogLockTypeLabel": "Låseslag", + "@vaultDialogLockTypeLabel": {}, + "pinDialogConfirm": "Stadfest talkoden", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "Skriv inn passordet", + "@passwordDialogEnter": {}, + "vaultBinUsageDialogMessage": "Nokre kvelv nyttar papirkorga.", + "@vaultBinUsageDialogMessage": {}, + "mapEmptyRegion": "Ingen bilete i dette området", + "@mapEmptyRegion": {}, + "exportEntryDialogQuality": "Kvalitet", + "@exportEntryDialogQuality": {}, + "tooManyItemsErrorDialogMessage": "Røyn att med færre ting.", + "@tooManyItemsErrorDialogMessage": {}, + "aboutLicensesShowAllButtonLabel": "Vis alle løyve", + "@aboutLicensesShowAllButtonLabel": {}, + "collectionActionEdit": "Brigd", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Søk etter namn", + "@collectionSearchTitlesHintText": {}, + "collectionGroupDay": "Etter dag", + "@collectionGroupDay": {}, + "collectionMoveFailureFeedback": "{count, plural, other{Kunne ikkje flytta {count} ting}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameFailureFeedback": "{count, plural, other{Kunne ikkje byta namn på {count} ting}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsAskEverytime": "Spør kvar gong", + "@settingsAskEverytime": {}, + "settingsThumbnailShowRating": "Vis omdøme", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Vis rå-ikon", + "@settingsThumbnailShowRawIcon": {}, + "settingsCollectionQuickActionEditorPageTitle": "Kvikkgjerder", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Trykk og hald for å flytta knappane og velja kva for slags gjerder som skal visast når du vel ting.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsCollectionQuickActionTabBrowsing": "Gjennomsyn", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsThumbnailShowMotionPhotoIcon": "Vis rørslebilete-ikon", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsViewerQuickActionEditorBanner": "Trykk og hald for å flytta knappane og velja kva for slags gjerder som skal visast i visinga.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerSlideshowTile": "Ljosbiletevising", + "@settingsViewerSlideshowTile": {}, + "settingsViewerMaximumBrightness": "Full ljosstyrke", + "@settingsViewerMaximumBrightness": {}, + "settingsViewerUseCutout": "Nytt utklipt område", + "@settingsViewerUseCutout": {}, + "settingsVideoPlaybackTile": "Avspeling", + "@settingsVideoPlaybackTile": {}, + "settingsVideoPlaybackPageTitle": "Avspeling", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoLoopModeDialogTitle": "Gjentak", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsVideoResumptionModeTile": "Spel av der du slapp", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoResumptionModeDialogTitle": "Spel av der du slapp", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsVideoControlsPageTitle": "Styring", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Dobbeltrykk for å spela/stansa", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Dra opp eller ned for å brigde ljos-/ljodstyrken", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsVideoButtonsTile": "Knappar", + "@settingsVideoButtonsTile": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Tekststad", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Tekststorleik", + "@settingsSubtitleThemeTextSize": {}, + "settingsAccessibilitySectionTitle": "Tilgjenge", + "@settingsAccessibilitySectionTitle": {}, + "settingsStorageAccessRevokeTooltip": "Fråta", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsStorageAccessEmpty": "Ingen gjevne tilgjenge", + "@settingsStorageAccessEmpty": {}, + "settingsDisplayRefreshRateModeTile": "Rørslejamleiken til skjermen", + "@settingsDisplayRefreshRateModeTile": {}, + "tagEditorDiscardDialogMessage": "Vil du avvisa brigda?", + "@tagEditorDiscardDialogMessage": {}, + "sortByName": "Etter namn", + "@sortByName": {}, + "sortByItemCount": "Etter mengd ting", + "@sortByItemCount": {}, + "albumGroupVolume": "Etter gøymestad", + "@albumGroupVolume": {}, + "searchTagsSectionTitle": "Merke", + "@searchTagsSectionTitle": {}, + "settingsSearchFieldLabel": "Søkjeinnstillingar", + "@settingsSearchFieldLabel": {}, + "settingsKeepScreenOnDialogTitle": "Hald skjermen slegen på", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Trykk «Attende» to gongar for å gå ut av appen", + "@settingsDoubleBackExit": {}, + "settingsNavigationDrawerTabPages": "Sider", + "@settingsNavigationDrawerTabPages": {}, + "settingsCollectionQuickActionsTile": "Kvikkgjerder", + "@settingsCollectionQuickActionsTile": {}, + "settingsThumbnailShowVideoDuration": "Vis videolengd", + "@settingsThumbnailShowVideoDuration": {}, + "settingsViewerGestureSideTapNext": "Trykk på skjermkantane for å visa førre/neste ting", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerQuickActionEditorPageTitle": "Kvikkgjerder", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Viste knappar", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerOverlayTile": "Overlag", + "@settingsViewerOverlayTile": {}, + "settingsSlideshowTransitionTile": "Overgang", + "@settingsSlideshowTransitionTile": {}, + "settingsStorageAccessPageTitle": "Gøymetilgjenge", + "@settingsStorageAccessPageTitle": {}, + "settingsDisplayUseTvInterface": "Android TV-grensesnitt", + "@settingsDisplayUseTvInterface": {}, + "settingsActionExport": "Før ut", + "@settingsActionExport": {}, + "settingsNavigationDrawerTabAlbums": "Album", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsThumbnailOverlayPageTitle": "Overlag", + "@settingsThumbnailOverlayPageTitle": {}, + "editEntryDateDialogSetCustom": "Vel dato å setja", + "@editEntryDateDialogSetCustom": {}, + "aboutBugReportButton": "Rapporter", + "@aboutBugReportButton": {}, + "aboutLicensesSectionTitle": "Løyve til opne kjeldekodar", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter-tillegg", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "collectionActionEmptyBin": "Tøm papirkorga", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Kopier til album", + "@collectionActionCopy": {}, + "collectionCopySuccessFeedback": "{count, plural, other{Kopierte {count} ting}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "drawerAboutButton": "Om", + "@drawerAboutButton": {}, + "collectionEmptyImages": "Ingen bilete", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Gje tilgjenge", + "@collectionEmptyGrantAccessButtonLabel": {}, + "drawerCollectionVideos": "Videoar", + "@drawerCollectionVideos": {}, + "drawerCountryPage": "Land", + "@drawerCountryPage": {}, + "sortOrderZtoA": "Å-A", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "Høgste først", + "@sortOrderHighestFirst": {}, + "albumMimeTypeMixed": "Blanda", + "@albumMimeTypeMixed": {}, + "albumPickPageTitlePick": "Vel album", + "@albumPickPageTitlePick": {}, + "albumScreenshots": "Skjermbilete", + "@albumScreenshots": {}, + "settingsHomeTile": "Heim", + "@settingsHomeTile": {}, + "settingsViewerOverlayPageTitle": "Overlag", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerSlideshowPageTitle": "Ljosbiletevising", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Gjentak", + "@settingsSlideshowRepeat": {}, + "settingsVideoPageTitle": "Videoinnstillingar", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "settingsSubtitleThemeTile": "Undertekster", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Undertekster", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Dette er eit døme.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextPositionTile": "Tekststad", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Venstre", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeBackgroundOpacity": "Bakgrunnsgjennomsyn", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsAllowInstalledAppAccess": "Gje tilgjenge til lista over innlagde appar", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "Vert nytta til å betre albumsvisinga", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsSaveSearchHistory": "Spar søkjehistorikken", + "@settingsSaveSearchHistory": {}, + "settingsAllowErrorReporting": "Send inn anonyme feilrapportar", + "@settingsAllowErrorReporting": {}, + "collectionSelectSectionTooltip": "Vel utvalet", + "@collectionSelectSectionTooltip": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Trykk og hald for å flytta knappane og velja kva for slags gjerder som skal visast når du ser igjennom ting.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsMotionPhotoAutoPlay": "Spel av rørslebilete sjølvverkande", + "@settingsMotionPhotoAutoPlay": {}, + "settingsViewerShowDescription": "Vis utgreiingar", + "@settingsViewerShowDescription": {}, + "settingsViewerShowInformationSubtitle": "Vis namn, dato, stad, osv …", + "@settingsViewerShowInformationSubtitle": {}, + "settingsThemeBrightnessDialogTitle": "Ham", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeBrightnessTile": "Ham", + "@settingsThemeBrightnessTile": {}, + "viewerInfoLabelDescription": "Utgreiing", + "@viewerInfoLabelDescription": {}, + "passwordDialogConfirm": "Stadfest passordet", + "@passwordDialogConfirm": {}, + "drawerCollectionImages": "Bilete", + "@drawerCollectionImages": {}, + "settingsConfirmationDialogTitle": "Stadfestingsvindaugo", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Verta spurd før du slettar noko for godt", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsStorageAccessTile": "Gøymetilgjenge", + "@settingsStorageAccessTile": {}, + "tagPlaceholderState": "Landsdel", + "@tagPlaceholderState": {}, + "chipActionShowCountryStates": "Vis landsdelar", + "@chipActionShowCountryStates": {}, + "viewerActionLock": "Lås visinga", + "@viewerActionLock": {}, + "viewerActionUnlock": "Lås opp visinga", + "@viewerActionUnlock": {}, + "albumTierVaults": "Kvelv", + "@albumTierVaults": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "collectionPickPageTitle": "Vel", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "Vel ting", + "@collectionSelectPageTitle": {}, + "collectionActionAddShortcut": "Legg til snarveg", + "@collectionActionAddShortcut": {}, + "collectionDeleteFailureFeedback": "{count, plural, other{Kunne ikkje slette {count} ting}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopyFailureFeedback": "{count, plural, other{Kunne ikkje kopiera {count} ting}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, other{Brigda {count} ting}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "drawerSettingsButton": "Innstillingar", + "@drawerSettingsButton": {}, + "collectionDeselectSectionTooltip": "Fråvel utvalet", + "@collectionDeselectSectionTooltip": {}, + "drawerCollectionAll": "Alle samlingar", + "@drawerCollectionAll": {}, + "sortOrderSmallestFirst": "Smæste først", + "@sortOrderSmallestFirst": {}, + "albumPickPageTitleCopy": "Kopier til album", + "@albumPickPageTitleCopy": {}, + "drawerCollectionFavourites": "Likte", + "@drawerCollectionFavourites": {}, + "albumGroupTier": "Etter nivå", + "@albumGroupTier": {}, + "albumPickPageTitleMove": "Flytt til album", + "@albumPickPageTitleMove": {}, + "albumGroupType": "Etter slag", + "@albumGroupType": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "albumDownload": "Hent", + "@albumDownload": {}, + "statePageTitle": "Landsdelar", + "@statePageTitle": {}, + "stateEmpty": "Ingen landsdelar", + "@stateEmpty": {}, + "placePageTitle": "Stadar", + "@placePageTitle": {}, + "placeEmpty": "Ingen stadar", + "@placeEmpty": {}, + "tagPageTitle": "Merke", + "@tagPageTitle": {}, + "binPageTitle": "Papirkorga", + "@binPageTitle": {}, + "searchCollectionFieldHint": "Søk i samlinga", + "@searchCollectionFieldHint": {}, + "settingsTimeToTakeActionTile": "Tid for å gjera", + "@settingsTimeToTakeActionTile": {}, + "searchStatesSectionTitle": "Landsdelar", + "@searchStatesSectionTitle": {}, + "searchPlacesSectionTitle": "Stadar", + "@searchPlacesSectionTitle": {}, + "searchRatingSectionTitle": "Omdøme", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "Metadata", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Innstillingar", + "@settingsPageTitle": {}, + "settingsSystemDefault": "Systemforval", + "@settingsSystemDefault": {}, + "settingsDefault": "Forval", + "@settingsDefault": {}, + "settingsDisabled": "Slegen av", + "@settingsDisabled": {}, + "settingsModificationWarningDialogMessage": "Andre innstillingar vil brigdast.", + "@settingsModificationWarningDialogMessage": {}, + "settingsSearchEmpty": "Ingen samsvarande innstilling", + "@settingsSearchEmpty": {}, + "settingsActionExportDialogTitle": "Før ut", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "Før inn", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Før inn", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "Omslag", + "@appExportCovers": {}, + "appExportFavourites": "Likte ting", + "@appExportFavourites": {}, + "appExportSettings": "Innstillingar", + "@appExportSettings": {}, + "settingsHomeDialogTitle": "Heim", + "@settingsHomeDialogTitle": {}, + "settingsConfirmationTile": "Stadfestingsvindaugo", + "@settingsConfirmationTile": {}, + "settingsVideoGestureSideDoubleTapSeek": "Dobbeltrykk på skjermkantane for å hoppe framover/bakover", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsSubtitleThemeTextColor": "Tekstleten", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextAlignmentRight": "Høgre", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsPrivacySectionTitle": "Personvern", + "@settingsPrivacySectionTitle": {}, + "settingsDisablingBinWarningDialogMessage": "Ting i papirkorga vil slettast for godt.", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsAllowMediaManagement": "La få handsame medium", + "@settingsAllowMediaManagement": {}, + "settingsHiddenItemsPageTitle": "Skjulte ting", + "@settingsHiddenItemsPageTitle": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "vaultLockTypePin": "Talkode", + "@vaultLockTypePin": {}, + "searchRecentSectionTitle": "Nylege", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Dato", + "@searchDateSectionTitle": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Verta spurd før du flyttar på ting utan dato", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsEnableBin": "Nytt papirkorga", + "@settingsEnableBin": {}, + "chipActionLock": "Lås", + "@chipActionLock": {}, + "sortByAlbumFileName": "Etter album og filnamn", + "@sortByAlbumFileName": {}, + "aboutBugReportInstruction": "Rapporter på GitHub med loggføringene og systemopplysingane dine", + "@aboutBugReportInstruction": {}, + "aboutLinkPolicy": "Personvernutsegn", + "@aboutLinkPolicy": {}, + "collectionPageTitle": "Samling", + "@collectionPageTitle": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{Bytte namnet til 1 ting} other{Bytte namna til {count} ting}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "drawerCollectionPanoramas": "Panorama", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Rå bilete", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "360°-videoar", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Album", + "@drawerAlbumPage": {}, + "drawerPlacePage": "Stadar", + "@drawerPlacePage": {}, + "albumPickPageTitleExport": "Før ut til album", + "@albumPickPageTitleExport": {}, + "albumPageTitle": "Album", + "@albumPageTitle": {}, + "newFilterBanner": "ny", + "@newFilterBanner": {}, + "settingsKeepScreenOnTile": "Hald skjermen slegen på", + "@settingsKeepScreenOnTile": {}, + "settingsThumbnailSectionTitle": "Småbilete", + "@settingsThumbnailSectionTitle": {}, + "settingsConfirmationBeforeMoveToBinItems": "Verta spurd før du kastar ting i papirkorga", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsNavigationDrawerTabTypes": "Slag", + "@settingsNavigationDrawerTabTypes": {}, + "settingsThumbnailOverlayTile": "Overlag", + "@settingsThumbnailOverlayTile": {}, + "settingsSubtitleThemeTextOpacity": "Tekstgjennomsyn", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Bakgrunnsleten", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Midten", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsVideoControlsTile": "Styring", + "@settingsVideoControlsTile": {}, + "settingsViewerShowInformation": "Vis opplysingar", + "@settingsViewerShowInformation": {}, + "settingsViewerShowOverlayThumbnails": "Vis småbilete", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsSlideshowShuffle": "Bland", + "@settingsSlideshowShuffle": {}, + "settingsVideoLoopModeTile": "Gjentak", + "@settingsVideoLoopModeTile": {}, + "settingsVideoAutoPlay": "Spel av med ein gong", + "@settingsVideoAutoPlay": {}, + "vaultLockTypePattern": "Mønster", + "@vaultLockTypePattern": {}, + "vaultLockTypePassword": "Passord", + "@vaultLockTypePassword": {}, + "patternDialogEnter": "Stryk inn eit mønster", + "@patternDialogEnter": {}, + "editEntryDialogTargetFieldsHeader": "Område å brigde", + "@editEntryDialogTargetFieldsHeader": {}, + "settingsCollectionQuickActionTabSelecting": "Veljing", + "@settingsCollectionQuickActionTabSelecting": {}, + "policyPageTitle": "Personvernutsegn", + "@policyPageTitle": {}, + "collectionActionRescan": "Gjennomsøk att", + "@collectionActionRescan": {}, + "dateToday": "I dag", + "@dateToday": {}, + "dateYesterday": "I går", + "@dateYesterday": {}, + "entryInfoActionRemoveLocation": "Ta bort stadsetjinga", + "@entryInfoActionRemoveLocation": {}, + "filterLocatedLabel": "Stadsette", + "@filterLocatedLabel": {}, + "settingsCollectionBurstPatternsTile": "Attkjenning av seriebilete", + "@settingsCollectionBurstPatternsTile": {}, + "chipActionGoToPlacePage": "Vis i Stadar", + "@chipActionGoToPlacePage": {}, + "settingsNavigationDrawerTile": "Framfinningsmenyen", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Framfinningsmenyen", + "@settingsNavigationDrawerEditorPageTitle": {}, + "locationPickerUseThisLocationButton": "Nytt denne stadsetjinga", + "@locationPickerUseThisLocationButton": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter-pakker", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart-pakker", + "@aboutLicensesDartPackagesSectionTitle": {}, + "statsWithGps": "{count, plural, other{{count} ting med stadsetjing}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "mapAttributionOsmHot": "Fliser av [HOT](https://www.hotosm.org/) • Hust av [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "Fliser av [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "columnCount": "{count, plural, =1{{count} kolonne} other{{count} kolonnar}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editEntryLocationDialogTitle": "Stadsetjing", + "@editEntryLocationDialogTitle": {}, + "collectionExportFailureFeedback": "{count, plural, =1{Greidde ikkje å føra ut 1 side} other{Greidde ikkje å føra ut {count} sider}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editEntryLocationDialogSetCustom": "Set eiga stadsetjing", + "@editEntryLocationDialogSetCustom": {}, + "filterNoLocationLabel": "Ustadsette", + "@filterNoLocationLabel": {}, + "settingsNavigationSectionTitle": "Finn fram", + "@settingsNavigationSectionTitle": {}, + "chipActionShowCollection": "Vis i Samling", + "@chipActionShowCollection": {}, + "mapAttributionOsmData": "Kartdata © [OpenStreetMap](https://www.openstreetmap.org/copyright)-medverkarar", + "@mapAttributionOsmData": {} +} diff --git a/lib/l10n/app_or.arb b/lib/l10n/app_or.arb new file mode 100644 index 0000000..03443ab --- /dev/null +++ b/lib/l10n/app_or.arb @@ -0,0 +1,148 @@ +{ + "aboutPageTitle": "ସମ୍ବନ୍ଧରେ", + "@aboutPageTitle": {}, + "sortBySize": "ଆକାର ଅନୁଯାୟୀ", + "@sortBySize": {}, + "albumCamera": "କ୍ୟାମେରା", + "@albumCamera": {}, + "drawerAboutButton": "ସମ୍ବନ୍ଧରେ", + "@drawerAboutButton": {}, + "drawerSettingsButton": "ସେଟିଂ", + "@drawerSettingsButton": {}, + "sortOrderZtoA": "Z ରୁ A", + "@sortOrderZtoA": {}, + "sortByDate": "ତାରିଖ ଅନୁଯାୟୀ", + "@sortByDate": {}, + "sortByName": "ନାମ ଅନୁଯାୟୀ", + "@sortByName": {}, + "sortOrderAtoZ": "A ରୁ Z", + "@sortOrderAtoZ": {}, + "newFilterBanner": "ନୂଆ", + "@newFilterBanner": {}, + "settingsDefault": "ଡିଫଲ୍ଟ", + "@settingsDefault": {}, + "settingsViewerShowInformation": "ସୂଚନା ଦେଖାଅ", + "@settingsViewerShowInformation": {}, + "settingsVideoSectionTitle": "ଵିଡ଼ିଓ", + "@settingsVideoSectionTitle": {}, + "settingsViewerShowDescription": "ଵର୍ଣ୍ଣନା ଦେଖାଅ", + "@settingsViewerShowDescription": {}, + "entryActionRename": "ନାମ ବଦଳାନ୍ତୁ", + "@entryActionRename": {}, + "hideButtonLabel": "ଲୁଚାଅ", + "@hideButtonLabel": {}, + "showTooltip": "ଦେଖାଅ", + "@showTooltip": {}, + "entryActionExport": "ରପ୍ତାନି", + "@entryActionExport": {}, + "entryActionInfo": "ସୂଚନା", + "@entryActionInfo": {}, + "coordinateDmsSouth": "ଦ", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "ପୂ", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "ପ", + "@coordinateDmsWest": {}, + "nameConflictStrategyRename": "ନାମ ବଦଳାନ୍ତୁ", + "@nameConflictStrategyRename": {}, + "nameConflictStrategySkip": "ବାଦ୍ ଦିଅ", + "@nameConflictStrategySkip": {}, + "themeBrightnessLight": "ହାଲୁକା", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "ଗାଢ଼", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "କଳା", + "@themeBrightnessBlack": {}, + "vaultLockTypePassword": "ପାସ୍‍ୱର୍ଡ଼", + "@vaultLockTypePassword": {}, + "videoPlaybackSkip": "ବାଦ୍ ଦିଅ", + "@videoPlaybackSkip": {}, + "renameAlbumDialogLabel": "ନୂଆ ନାମ", + "@renameAlbumDialogLabel": {}, + "renameEntrySetPagePreviewSectionTitle": "ପୂର୍ଵାଵଲୋକନ", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameEntrySetPageTitle": "ନାମ ବଦଳାନ୍ତୁ", + "@renameEntrySetPageTitle": {}, + "renameProcessorName": "ନାମ", + "@renameProcessorName": {}, + "renameEntryDialogLabel": "ନୂଆ ନାମ", + "@renameEntryDialogLabel": {}, + "durationDialogMinutes": "ମିନିଟ୍", + "@durationDialogMinutes": {}, + "durationDialogSeconds": "ସେକେଣ୍ଡ", + "@durationDialogSeconds": {}, + "durationDialogHours": "ଘଣ୍ଟା", + "@durationDialogHours": {}, + "editEntryLocationDialogLatitude": "ଅକ୍ଷାଂଶ", + "@editEntryLocationDialogLatitude": {}, + "removeEntryMetadataDialogMore": "ଅଧିକ", + "@removeEntryMetadataDialogMore": {}, + "videoStreamSelectionDialogVideo": "ଵିଡ଼ିଓ", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "ଅଡ଼ିଓ", + "@videoStreamSelectionDialogAudio": {}, + "editEntryLocationDialogLongitude": "ଦ୍ରାଘିମା", + "@editEntryLocationDialogLongitude": {}, + "videoStreamSelectionDialogOff": "ବନ୍ଦ", + "@videoStreamSelectionDialogOff": {}, + "genericSuccessFeedback": "ହୋଇଗଲା!", + "@genericSuccessFeedback": {}, + "coverDialogTabApp": "ଆପ୍", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "ରଙ୍ଗ", + "@coverDialogTabColor": {}, + "aboutLinkPolicy": "ଗୋପନୀୟତା ନୀତି", + "@aboutLinkPolicy": {}, + "aboutCreditsSectionTitle": "ଶ୍ରେୟ", + "@aboutCreditsSectionTitle": {}, + "aboutTranslatorsSectionTitle": "ଅନୁଵାଦକ", + "@aboutTranslatorsSectionTitle": {}, + "collectionPageTitle": "ସଂଗ୍ରହ", + "@collectionPageTitle": {}, + "collectionActionEdit": "ସମ୍ପାଦନା", + "@collectionActionEdit": {}, + "sectionUnknown": "ଅଜ୍ଞାତ", + "@sectionUnknown": {}, + "dateToday": "ଆଜି", + "@dateToday": {}, + "dateYesterday": "ଗତକାଲି", + "@dateYesterday": {}, + "searchDateSectionTitle": "ତାରିଖ", + "@searchDateSectionTitle": {}, + "settingsPageTitle": "ସେଟିଂ", + "@settingsPageTitle": {}, + "settingsActionExport": "ରପ୍ତାନି କରିବା", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "ରପ୍ତାନି", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "ଆମଦାନୀ କରିବା", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "ଆମଦାନୀ", + "@settingsActionImportDialogTitle": {}, + "appExportSettings": "ସେଟିଂ", + "@appExportSettings": {}, + "settingsHomeTile": "ଗୃହ", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "ଗୃହ", + "@settingsHomeDialogTitle": {}, + "showButtonLabel": "ଦେଖାଅ", + "@showButtonLabel": {}, + "hideTooltip": "ଲୁଚାଅ", + "@hideTooltip": {}, + "entryActionEdit": "ସମ୍ପାଦନା", + "@entryActionEdit": {}, + "coordinateDmsNorth": "ଉ", + "@coordinateDmsNorth": {}, + "addShortcutButtonLabel": "ଯୋଡ଼ନ୍ତୁ", + "@addShortcutButtonLabel": {}, + "setCoverDialogAuto": "ସ୍ୱତଃ", + "@setCoverDialogAuto": {}, + "welcomeOptional": "ଵୈକଳ୍ପିକ", + "@welcomeOptional": {}, + "viewDialogGroupSectionTitle": "ଗୋଷ୍ଠୀ", + "@viewDialogGroupSectionTitle": {}, + "viewDialogSortSectionTitle": "ସଜାନ୍ତୁ", + "@viewDialogSortSectionTitle": {}, + "menuActionStats": "ପରିସଂଖ୍ୟାନ", + "@menuActionStats": {} +} diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb new file mode 100644 index 0000000..2951128 --- /dev/null +++ b/lib/l10n/app_pl.arb @@ -0,0 +1,1648 @@ +{ + "actionRemove": "Usuń", + "@actionRemove": {}, + "applyButtonLabel": "ZASTOSUJ", + "@applyButtonLabel": {}, + "changeTooltip": "Zmień", + "@changeTooltip": {}, + "nextTooltip": "Następny", + "@nextTooltip": {}, + "hideTooltip": "Ukryj", + "@hideTooltip": {}, + "resetTooltip": "Zresetuj", + "@resetTooltip": {}, + "pickTooltip": "Wybierz", + "@pickTooltip": {}, + "doubleBackExitMessage": "Dotknij ponownie „wstecz”, aby wyjść.", + "@doubleBackExitMessage": {}, + "saveTooltip": "Zapisz", + "@saveTooltip": {}, + "doNotAskAgain": "Nie pytaj ponownie", + "@doNotAskAgain": {}, + "sourceStateLoading": "Ładowanie", + "@sourceStateLoading": {}, + "sourceStateLocatingCountries": "Lokowanie krajów", + "@sourceStateLocatingCountries": {}, + "chipActionGoToCountryPage": "Pokaż w Krajach", + "@chipActionGoToCountryPage": {}, + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Witaj w Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Opcjonalnie", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Akceptuję warunki i zasady", + "@welcomeTermsToggle": {}, + "deleteButtonLabel": "USUŃ", + "@deleteButtonLabel": {}, + "nextButtonLabel": "NASTĘPNY", + "@nextButtonLabel": {}, + "showButtonLabel": "POKAŻ", + "@showButtonLabel": {}, + "hideButtonLabel": "UKRYJ", + "@hideButtonLabel": {}, + "continueButtonLabel": "KONTYNUUJ", + "@continueButtonLabel": {}, + "cancelTooltip": "Anuluj", + "@cancelTooltip": {}, + "clearTooltip": "Wyczyść", + "@clearTooltip": {}, + "previousTooltip": "Poprzedni", + "@previousTooltip": {}, + "showTooltip": "Pokaż", + "@showTooltip": {}, + "chipActionFilterIn": "Filtrować", + "@chipActionFilterIn": {}, + "chipActionPin": "Przypnij na górze", + "@chipActionPin": {}, + "chipActionUnpin": "Odepnij z góry", + "@chipActionUnpin": {}, + "chipActionRename": "Zmień nazwę", + "@chipActionRename": {}, + "chipActionSetCover": "Ustaw okładkę", + "@chipActionSetCover": {}, + "entryActionDelete": "Usuń", + "@entryActionDelete": {}, + "entryActionConvert": "Konwertuj", + "@entryActionConvert": {}, + "entryActionExport": "Eksport", + "@entryActionExport": {}, + "videoActionCaptureFrame": "Ramka do przechwytywania", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Wycisz", + "@videoActionMute": {}, + "videoActionUnmute": "Wyłącz wyciszenie", + "@videoActionUnmute": {}, + "videoActionPause": "Pauza", + "@videoActionPause": {}, + "videoActionPlay": "Graj", + "@videoActionPlay": {}, + "videoActionReplay10": "Przewiń do tyłu 10 sekund", + "@videoActionReplay10": {}, + "videoActionSkip10": "Przewiń do przodu 10 sekund", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Wybierz ścieżki", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Prędkość odtwarzania", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "Ustawienia", + "@viewerActionSettings": {}, + "slideshowActionResume": "Wznów", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Pokaż w Kolekcji", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Edytuj datę & godzinę", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Edytuj lokalizację", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "Edytuj tytuł & opis", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Edytuj ocenę", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Edytuj znaczniki", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Usuń metadane", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "Kosz", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Ulubione", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Niedatowany", + "@filterNoDateLabel": {}, + "filterNoRatingLabel": "Nieoceniony", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Nieoznaczone", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Bez tytułu", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "Tego dnia", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Ostatnio dodane", + "@filterRecentlyAddedLabel": {}, + "filterTypeMotionPhotoLabel": "Ruchome Zdjęcie", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Zdjęcie panoramiczne", + "@filterTypePanoramaLabel": {}, + "entryActionFlip": "Obróć w poziomie", + "@entryActionFlip": {}, + "entryActionShare": "Udostępnij", + "@entryActionShare": {}, + "entryActionViewSource": "Pokaż źródło", + "@entryActionViewSource": {}, + "entryActionOpenMap": "Pokaż w aplikacji mapy", + "@entryActionOpenMap": {}, + "sourceStateCataloguing": "Katalogowanie", + "@sourceStateCataloguing": {}, + "sourceStateLocatingPlaces": "Lokalizowanie miejsc", + "@sourceStateLocatingPlaces": {}, + "chipActionFilterOut": "Odfiltruj", + "@chipActionFilterOut": {}, + "chipActionCreateAlbum": "Utwórz album", + "@chipActionCreateAlbum": {}, + "entryActionRotateCCW": "Obróć w lewo", + "@entryActionRotateCCW": {}, + "chipActionDelete": "Usuń", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Pokaż w Albumach", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToTagPage": "Pokaż w Tagach", + "@chipActionGoToTagPage": {}, + "entryActionCopyToClipboard": "Skopiuj do schowka", + "@entryActionCopyToClipboard": {}, + "chipActionHide": "Schowaj", + "@chipActionHide": {}, + "entryActionPrint": "Drukuj", + "@entryActionPrint": {}, + "entryActionShowGeoTiffOnMap": "Pokaż jako nakładkę mapy", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Konwertuj na nieruchomy obraz", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionEdit": "Edycja", + "@entryActionEdit": {}, + "entryActionOpen": "Otwórz z", + "@entryActionOpen": {}, + "entryActionViewMotionPhotoVideo": "Otwórz film", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionRotateScreen": "Obróć ekran", + "@entryActionRotateScreen": {}, + "entryActionRemoveFavourite": "Usuń z ulubionych", + "@entryActionRemoveFavourite": {}, + "entryActionSetAs": "Ustaw jako", + "@entryActionSetAs": {}, + "entryActionAddFavourite": "Dodaj do ulubionych", + "@entryActionAddFavourite": {}, + "filterNoLocationLabel": "Nieumiejscowione", + "@filterNoLocationLabel": {}, + "filterRatingRejectedLabel": "Odrzucony", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Animowany", + "@filterTypeAnimatedLabel": {}, + "entryActionRename": "Zmień nazwę", + "@entryActionRename": {}, + "entryActionRotateCW": "Obróć w prawo", + "@entryActionRotateCW": {}, + "entryActionInfo": "Informacje", + "@entryActionInfo": {}, + "entryActionRestore": "Przywróć", + "@entryActionRestore": {}, + "subtitlePositionTop": "Na górze", + "@subtitlePositionTop": {}, + "wallpaperTargetHome": "Ekran główny", + "@wallpaperTargetHome": {}, + "nameConflictStrategySkip": "Pomiń", + "@nameConflictStrategySkip": {}, + "videoLoopModeAlways": "Zawsze", + "@videoLoopModeAlways": {}, + "filterLocatedLabel": "Umiejscowione", + "@filterLocatedLabel": {}, + "filterTaggedLabel": "Oznaczone", + "@filterTaggedLabel": {}, + "nameConflictStrategyReplace": "Zastąp", + "@nameConflictStrategyReplace": {}, + "subtitlePositionBottom": "Na dole", + "@subtitlePositionBottom": {}, + "wallpaperTargetLock": "Ekran blokady", + "@wallpaperTargetLock": {}, + "videoPlaybackSkip": "Pomiń", + "@videoPlaybackSkip": {}, + "viewerTransitionNone": "Brak", + "@viewerTransitionNone": {}, + "filterAspectRatioPortraitLabel": "Portret", + "@filterAspectRatioPortraitLabel": {}, + "filterNoAddressLabel": "Brak adresu", + "@filterNoAddressLabel": {}, + "videoControlsPlayOutside": "Odtwórz innym odtwarzaczem", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Mapy Google", + "@mapStyleGoogleNormal": {}, + "videoLoopModeShortOnly": "Tylko krótkie wideo", + "@videoLoopModeShortOnly": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (kolory wody)", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyRename": "Zmień nazwę", + "@nameConflictStrategyRename": {}, + "mapStyleOsmHot": "Humanitarny OSM", + "@mapStyleOsmHot": {}, + "keepScreenOnVideoPlayback": "Przy odtwarzaniu wideo", + "@keepScreenOnVideoPlayback": {}, + "displayRefreshRatePreferLowest": "Najniższa", + "@displayRefreshRatePreferLowest": {}, + "videoPlaybackMuted": "Odtwarzaj bez dźwięku", + "@videoPlaybackMuted": {}, + "itemCount": "{count, plural, =1{{count} element} few{{count} elementy} other{{count} elementów}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "columnCount": "{count, plural, =1{{count} rząd} few{{count} rzędy} other{{count} rzędów}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeSeconds": "{count, plural, =1{{count} sekunda} few{{count} sekundy} other{{count} sekund}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "timeMinutes": "{count, plural, =1{{count} minuta} few{{count} minuty} other{{count} minut}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "timeDays": "{count, plural, =1{{count} dzień} few{{count} dni} other{{count} dni}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "Wideo 360°", + "@filterTypeSphericalVideoLabel": {}, + "coordinateFormatDecimal": "Stopnie z miejscami dziesiętnymi", + "@coordinateFormatDecimal": {}, + "coordinateDmsSouth": "Pd", + "@coordinateDmsSouth": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsNorth": "Pn", + "@coordinateDmsNorth": {}, + "mapStyleGoogleHybrid": "Mapy Google (hybrydowe)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Mapy Google (teren)", + "@mapStyleGoogleTerrain": {}, + "keepScreenOnAlways": "Zawsze", + "@keepScreenOnAlways": {}, + "themeBrightnessLight": "Jasny", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Ciemny", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Czarny", + "@themeBrightnessBlack": {}, + "viewerTransitionSlide": "Slajd", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Paralaksa", + "@viewerTransitionParallax": {}, + "entryActionShareImageOnly": "Udostępnij tylko zdjęcia", + "@entryActionShareImageOnly": {}, + "entryInfoActionRemoveLocation": "Usuń lokalizację", + "@entryInfoActionRemoveLocation": {}, + "entryActionShareVideoOnly": "Udostępnij tylko wideo", + "@entryActionShareVideoOnly": {}, + "filterAspectRatioLandscapeLabel": "Pejzaż", + "@filterAspectRatioLandscapeLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Obraz", + "@filterMimeImageLabel": {}, + "unitSystemImperial": "Imperialne", + "@unitSystemImperial": {}, + "videoLoopModeNever": "Nigdy", + "@videoLoopModeNever": {}, + "accessibilityAnimationsRemove": "Zapobiegaj efektom ekranu", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Zachowaj efekty ekranu", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferHighest": "Najwyższa", + "@displayRefreshRatePreferHighest": {}, + "keepScreenOnNever": "Nigdy", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "Na stronie przeglądarki", + "@keepScreenOnViewerOnly": {}, + "videoPlaybackWithSound": "Odtwarzaj z dźwiękiem", + "@videoPlaybackWithSound": {}, + "viewerTransitionFade": "Zanikanie", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "Powiększanie", + "@viewerTransitionZoomIn": {}, + "entryInfoActionExportMetadata": "Wyeksportuj metadane", + "@entryInfoActionExportMetadata": {}, + "filterMimeVideoLabel": "Wideo", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "Stopnie, Minuty, Sekundy", + "@coordinateFormatDms": {}, + "coordinateDmsEast": "Ws", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "Z", + "@coordinateDmsWest": {}, + "unitSystemMetric": "Metryczne", + "@unitSystemMetric": {}, + "albumTierPinned": "Przypięty", + "@albumTierPinned": {}, + "videoResumeButtonLabel": "WZNÓW", + "@videoResumeButtonLabel": {}, + "widgetDisplayedItemRandom": "Losowo", + "@widgetDisplayedItemRandom": {}, + "widgetOpenPageHome": "Otwórz stronę główną", + "@widgetOpenPageHome": {}, + "widgetOpenPageViewer": "Otwórz przeglądarkę", + "@widgetOpenPageViewer": {}, + "albumTierNew": "Nowy", + "@albumTierNew": {}, + "albumTierSpecial": "Wspólne", + "@albumTierSpecial": {}, + "albumTierApps": "Aplikacje", + "@albumTierApps": {}, + "storageVolumeDescriptionFallbackNonPrimary": "Karta SD", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "katalog główny", + "@rootDirectoryDescription": {}, + "storageAccessDialogMessage": "Wybierz {directory} lub „{volume}” na następnym ekranie, aby dać tej aplikacji dostęp do niego.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "unsupportedTypeDialogMessage": "{count, plural, =1{Ta operacja nie jest obsługiwana dla elementów następującego typu: {types}.} other{Ta operacja nie jest obsługiwana dla elementów następujących typów: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "hideFilterConfirmationDialogMessage": "Pasujące zdjęcia i filmy zostaną ukryte w kolekcji. Możesz je ponownie wyświetlić w ustawieniach, w sekcji „Prywatność”.\n\nCzy na pewno chcesz je ukryć?", + "@hideFilterConfirmationDialogMessage": {}, + "wallpaperTargetHomeLock": "Ekran główny i blokady", + "@wallpaperTargetHomeLock": {}, + "widgetOpenPageCollection": "Otwórz kolekcję", + "@widgetOpenPageCollection": {}, + "albumTierRegular": "Inne", + "@albumTierRegular": {}, + "setCoverDialogLatest": "Ostatni element", + "@setCoverDialogLatest": {}, + "newAlbumDialogNameLabel": "Nazwa albumu", + "@newAlbumDialogNameLabel": {}, + "nameConflictDialogMultipleSourceMessage": "Niektóre pliki mają tę samą nazwę.", + "@nameConflictDialogMultipleSourceMessage": {}, + "videoResumeDialogMessage": "Czy chcesz wznowić odtwarzanie od {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "nameConflictDialogSingleSourceMessage": "Niektóre pliki w katalogu docelowym mają taką samą nazwę.", + "@nameConflictDialogSingleSourceMessage": {}, + "otherDirectoryDescription": "katalog „{name}”", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "addShortcutButtonLabel": "DODAJ", + "@addShortcutButtonLabel": {}, + "widgetDisplayedItemMostRecent": "Najnowszy", + "@widgetDisplayedItemMostRecent": {}, + "restrictedAccessDialogMessage": "Ta aplikacja nie może modyfikować plików w {directory} „{volume}”.\n\nUżyj wstępnie zainstalowanego menedżera plików lub aplikacji galerii, aby przenieść elementy do innego katalogu.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "storageVolumeDescriptionFallbackPrimary": "Pamięć wewnętrzna", + "@storageVolumeDescriptionFallbackPrimary": {}, + "notEnoughSpaceDialogMessage": "Ta operacja wymaga {neededSize} wolnego miejsca na „{volume}”, aby ją ukończyć, ale pozostało tylko {freeSize}.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "noMatchingAppDialogMessage": "Nie ma aplikacji, które mogłyby sobie z tym poradzić.", + "@noMatchingAppDialogMessage": {}, + "addShortcutDialogLabel": "Etykieta skrótu", + "@addShortcutDialogLabel": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Przenieść ten element do Kosza?} other{Przenieść te elementy {count} do Kosza?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Usunąć ten element?} other{Usunąć te elementy {count}?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "moveUndatedConfirmationDialogMessage": "Zapisać daty elementów przed kontynuacją?", + "@moveUndatedConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "Nowy album", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Katalog już istnieje", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "missingSystemFilePickerDialogMessage": "Brak selektora plików systemowych lub jest on wyłączony. Włącz go i spróbuj ponownie.", + "@missingSystemFilePickerDialogMessage": {}, + "setCoverDialogAuto": "Automatycznie", + "@setCoverDialogAuto": {}, + "moveUndatedConfirmationDialogSetDate": "Zapisz daty", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoStartOverButtonLabel": "ZACZNIJ OD NOWA", + "@videoStartOverButtonLabel": {}, + "setCoverDialogCustom": "Własny", + "@setCoverDialogCustom": {}, + "collectionActionCopy": "Kopiuj do albumu", + "@collectionActionCopy": {}, + "sortOrderOldestFirst": "Najpierw najstarsze", + "@sortOrderOldestFirst": {}, + "searchDateSectionTitle": "Data", + "@searchDateSectionTitle": {}, + "albumPageTitle": "Albumy", + "@albumPageTitle": {}, + "countryPageTitle": "Kraje", + "@countryPageTitle": {}, + "sortOrderZtoA": "Od Z do A", + "@sortOrderZtoA": {}, + "dateYesterday": "Wczoraj", + "@dateYesterday": {}, + "videoStreamSelectionDialogAudio": "Audio", + "@videoStreamSelectionDialogAudio": {}, + "dateThisMonth": "W tym miesiącu", + "@dateThisMonth": {}, + "videoStreamSelectionDialogTrack": "Ścieżka", + "@videoStreamSelectionDialogTrack": {}, + "appPickDialogTitle": "Wybierz aplikację", + "@appPickDialogTitle": {}, + "newAlbumDialogStorageLabel": "Pamięć:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "Nowa nazwa", + "@renameAlbumDialogLabel": {}, + "renameEntrySetPagePatternFieldLabel": "Wzorzec nazewnictwa", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameProcessorCounter": "Licznik", + "@renameProcessorCounter": {}, + "renameProcessorName": "Nazwa", + "@renameProcessorName": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Usunąć ten album i jego element?} few{Usunąć ten album i jego {count} elementy?} other{Usunąć ten album i jego {count} elementów?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editEntryDateDialogShift": "Zmiana", + "@editEntryDateDialogShift": {}, + "editEntryRatingDialogTitle": "Ocena", + "@editEntryRatingDialogTitle": {}, + "videoStreamSelectionDialogOff": "Wyłącz", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogNoSelection": "Nie ma innych ścieżek.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "Gotowe!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Niepowodzenie", + "@genericFailureFeedback": {}, + "genericDangerWarningDialogMessage": "Czy na pewno?", + "@genericDangerWarningDialogMessage": {}, + "tileLayoutMosaic": "Mozaika", + "@tileLayoutMosaic": {}, + "appPickDialogNone": "Brak", + "@appPickDialogNone": {}, + "aboutBugReportInstruction": "Zgłoś w usłudze GitHub z dziennikami i informacją o systemie", + "@aboutBugReportInstruction": {}, + "aboutCreditsSectionTitle": "Zasługi", + "@aboutCreditsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Pakiety Fluttera", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Pakiety Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, + "collectionPageTitle": "Kolekcja", + "@collectionPageTitle": {}, + "collectionSelectPageTitle": "Wybierz elementy", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Pokaż filtr tytułu", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Ukryj filtr tytułu", + "@collectionActionHideTitleSearch": {}, + "collectionActionMove": "Przenieś do albumu", + "@collectionActionMove": {}, + "collectionActionRescan": "Przeskanuj", + "@collectionActionRescan": {}, + "collectionActionEdit": "Edytuj", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Szukaj tytułów", + "@collectionSearchTitlesHintText": {}, + "collectionGroupMonth": "Według miesiąca", + "@collectionGroupMonth": {}, + "sectionUnknown": "Nieznany", + "@sectionUnknown": {}, + "dateToday": "Dzisiaj", + "@dateToday": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{Skopiowano 1 element} few{Skopiowano {count} elementy} other{Skopiowano {count} elementów}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{Wyedytowano 1 element} few{Wyedytowano {count} elementy} other{Wyedytowano {count} elementów}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyFavourites": "Brak ulubionych", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "Brak wideo", + "@collectionEmptyVideos": {}, + "sortByDate": "Według daty", + "@sortByDate": {}, + "sortByRating": "Według oceny", + "@sortByRating": {}, + "sortOrderNewestFirst": "Najpierw najnowsze", + "@sortOrderNewestFirst": {}, + "sortOrderHighestFirst": "Najpierw najwyższe", + "@sortOrderHighestFirst": {}, + "searchRatingSectionTitle": "Oceny", + "@searchRatingSectionTitle": {}, + "sortOrderLowestFirst": "Najpierw najniższe", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Najpierw największe", + "@sortOrderLargestFirst": {}, + "albumGroupVolume": "Według pojemności magazynu", + "@albumGroupVolume": {}, + "createAlbumButtonLabel": "UTWÓRZ", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "nowy", + "@newFilterBanner": {}, + "countryEmpty": "Brak krajów", + "@countryEmpty": {}, + "tagPageTitle": "Znaczniki", + "@tagPageTitle": {}, + "searchMetadataSectionTitle": "Metadane", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Ustawienia", + "@settingsPageTitle": {}, + "exportEntryDialogHeight": "Wysokość", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "Nowa nazwa", + "@renameEntryDialogLabel": {}, + "durationDialogMinutes": "Minuty", + "@durationDialogMinutes": {}, + "editEntryLocationDialogLongitude": "Długość geograficzna", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "Użyj tej pozycji", + "@locationPickerUseThisLocationButton": {}, + "removeEntryMetadataDialogTitle": "Usuwanie metadanych", + "@removeEntryMetadataDialogTitle": {}, + "menuActionMap": "Mapa", + "@menuActionMap": {}, + "menuActionStats": "Statystyki", + "@menuActionStats": {}, + "viewDialogGroupSectionTitle": "Sekcje", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Układ", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "Odwróć porządek sortowania", + "@viewDialogReverseSortOrder": {}, + "coverDialogTabColor": "Kolor", + "@coverDialogTabColor": {}, + "aboutBugCopyInfoInstruction": "Skopiuj informację o systemie", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugReportButton": "Zgłoś", + "@aboutBugReportButton": {}, + "aboutCreditsWorldAtlas2": "na licencji ISC.", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Tłumacze", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Licencje o otwartym kodzie", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "Ta aplikacja używa następujących pakietów i bibliotek z otwartym kodem.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Biblioteki systemu Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Wtyczki Fluttera", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "collectionActionAddShortcut": "Dodaj skrót", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "Opróżnij kosz", + "@collectionActionEmptyBin": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{Zmieniono nazwę 1 elementowi} other{Zmieniono nazwę {count} elementom}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyImages": "Brak obrazów", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Przyznaj dostęp", + "@collectionEmptyGrantAccessButtonLabel": {}, + "sortByItemCount": "Według liczby elementów", + "@sortByItemCount": {}, + "sortBySize": "Według rozmiaru", + "@sortBySize": {}, + "albumEmpty": "Brak albumów", + "@albumEmpty": {}, + "renameEntrySetPageTitle": "Zmień nazwę", + "@renameEntrySetPageTitle": {}, + "durationDialogHours": "Godziny", + "@durationDialogHours": {}, + "editEntryLocationDialogLatitude": "Szerokość geograficzna", + "@editEntryLocationDialogLatitude": {}, + "removeEntryMetadataDialogMore": "Więcej", + "@removeEntryMetadataDialogMore": {}, + "viewDialogSortSectionTitle": "Sortuj", + "@viewDialogSortSectionTitle": {}, + "aboutCreditsWorldAtlas1": "Ta aplikacja używa pliku TopoJSON z", + "@aboutCreditsWorldAtlas1": {}, + "policyPageTitle": "Polityka prywatności", + "@policyPageTitle": {}, + "drawerCollectionImages": "Obrazy", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Wideo", + "@drawerCollectionVideos": {}, + "drawerCountryPage": "Kraje", + "@drawerCountryPage": {}, + "drawerTagPage": "Znaczniki", + "@drawerTagPage": {}, + "albumGroupTier": "Według poziomu", + "@albumGroupTier": {}, + "sortOrderSmallestFirst": "Najpierw najmniejsze", + "@sortOrderSmallestFirst": {}, + "albumPickPageTitleMove": "Przenieś do albumu", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "Wybierz album", + "@albumPickPageTitlePick": {}, + "albumScreenshots": "Zrzuty ekranu", + "@albumScreenshots": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "albumDownload": "Pobrane", + "@albumDownload": {}, + "settingsDisabled": "Wyłączono", + "@settingsDisabled": {}, + "editEntryLocationDialogTitle": "Pozycja", + "@editEntryLocationDialogTitle": {}, + "menuActionSlideshow": "Pokaz slajdów", + "@menuActionSlideshow": {}, + "collectionEditFailureFeedback": "{count, plural, =1{Nie udało się wyedytować 1 elementu} other{Nie udało się wyedytować {count} elementów}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "drawerCollectionAnimated": "Animacje", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Animowane zdjęcia", + "@drawerCollectionMotionPhotos": {}, + "collectionSelectSectionTooltip": "Zaznacz sekcję", + "@collectionSelectSectionTooltip": {}, + "drawerCollectionPanoramas": "Zdjęcia panoramiczne", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Nieprzetworzone zdjęcia", + "@drawerCollectionRaws": {}, + "sortByAlbumFileName": "Według albumu i nazwy elementu", + "@sortByAlbumFileName": {}, + "albumMimeTypeMixed": "Mieszane", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "Skopiuj do albumu", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Wyeksportuj do albumu", + "@albumPickPageTitleExport": {}, + "tagEmpty": "Brak znaczników", + "@tagEmpty": {}, + "searchCountriesSectionTitle": "Kraje", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "Miejsca", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Znaczniki", + "@searchTagsSectionTitle": {}, + "exportEntryDialogWidth": "Szerokość", + "@exportEntryDialogWidth": {}, + "aboutBugSectionTitle": "Raport o błędach", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Zapisz dzienniki aplikacji w pliku", + "@aboutBugSaveLogInstruction": {}, + "albumVideoCaptures": "Przechwycone wideo", + "@albumVideoCaptures": {}, + "searchCollectionFieldHint": "Wyszukaj kolekcję", + "@searchCollectionFieldHint": {}, + "binPageTitle": "Kosz", + "@binPageTitle": {}, + "editEntryDialogCopyFromItem": "Kopiuj z innego elementu", + "@editEntryDialogCopyFromItem": {}, + "editEntryDialogTargetFieldsHeader": "Pola do modyfikacji", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Data i godzina", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogExtractFromTitle": "Wydobądź z tytułu", + "@editEntryDateDialogExtractFromTitle": {}, + "menuActionSelectAll": "Zaznacz wszystkie", + "@menuActionSelectAll": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP jest wymagane do odtworzenia wideo wewnątrz zdjęcia.\n\nCzy na pewno chcesz go usunąć?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "tileLayoutGrid": "Siatka", + "@tileLayoutGrid": {}, + "aboutBugCopyInfoButton": "Kopiuj", + "@aboutBugCopyInfoButton": {}, + "albumGroupType": "Według typu", + "@albumGroupType": {}, + "renameEntrySetPagePreviewSectionTitle": "Podgląd", + "@renameEntrySetPagePreviewSectionTitle": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Usunąć te albumy i ich element?} few{Usunąć te albumy i ich {count} elementy?} other{Usunąć te albumy i ich {count} elementów?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "renameAlbumDialogLabelAlreadyExistsHelper": "Katalog już istnieje", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageInsertTooltip": "Wstaw pole", + "@renameEntrySetPageInsertTooltip": {}, + "exportEntryDialogFormat": "Format:", + "@exportEntryDialogFormat": {}, + "editEntryDateDialogSetCustom": "Ustaw własną datę", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Skopiuj z innej daty", + "@editEntryDateDialogCopyField": {}, + "durationDialogSeconds": "Sekundy", + "@durationDialogSeconds": {}, + "editEntryLocationDialogChooseOnMap": "Wybierz z mapy", + "@editEntryLocationDialogChooseOnMap": {}, + "collectionGroupDay": "Według dnia", + "@collectionGroupDay": {}, + "editEntryDateDialogSourceFileModifiedDate": "Data modyfikacji pliku", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "editEntryLocationDialogSetCustom": "Ustaw własną pozycję", + "@editEntryLocationDialogSetCustom": {}, + "videoStreamSelectionDialogVideo": "Wideo", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogText": "Napisy", + "@videoStreamSelectionDialogText": {}, + "menuActionSelect": "Zaznacz", + "@menuActionSelect": {}, + "videoSpeedDialogLabel": "Szybkość odtwarzania", + "@videoSpeedDialogLabel": {}, + "aboutPageTitle": "O aplikacji", + "@aboutPageTitle": {}, + "menuActionConfigureView": "Widok", + "@menuActionConfigureView": {}, + "menuActionSelectNone": "Odznacz", + "@menuActionSelectNone": {}, + "tileLayoutList": "Lista", + "@tileLayoutList": {}, + "coverDialogTabCover": "Okładka", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "Aplikacja", + "@coverDialogTabApp": {}, + "aboutLinkLicense": "Licencje", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Polityka prywatności", + "@aboutLinkPolicy": {}, + "aboutLicensesShowAllButtonLabel": "Pokaż wszystkie licencje", + "@aboutLicensesShowAllButtonLabel": {}, + "collectionPickPageTitle": "Wybierz", + "@collectionPickPageTitle": {}, + "collectionGroupAlbum": "Według albumu", + "@collectionGroupAlbum": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Nie udało się usunąć 1 elementu} other{Nie udało się usunąć {count} elementów}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopyFailureFeedback": "{count, plural, =1{Nie udało się skopiować 1 elementu} other{Nie udało się skopiować {count} elementów}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{Nie udało się przenieść 1 elementu} other{Nie udało się przenieść {count} elementów}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameFailureFeedback": "{count, plural, =1{Nie udało się zmienić nazwy 1 elementowi} other{Nie udało się zmienić nazwy {count} elementom}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "albumScreenRecordings": "Nagrania ekranu", + "@albumScreenRecordings": {}, + "collectionExportFailureFeedback": "{count, plural, =1{Nie udało się wyeksportować 1 strony} other{Nie udało się wyeksportować{count} stron}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{Przeniesiono 1 element} few{Przeniesiono {count} elementy} other{Przeniesiono {count} elementów}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "drawerCollectionAll": "Wszystkie kolekcje", + "@drawerCollectionAll": {}, + "drawerSettingsButton": "Ustawienia", + "@drawerSettingsButton": {}, + "drawerCollectionFavourites": "Ulubione", + "@drawerCollectionFavourites": {}, + "sortByName": "Według nazwy", + "@sortByName": {}, + "searchAlbumsSectionTitle": "Albumy", + "@searchAlbumsSectionTitle": {}, + "settingsSystemDefault": "Ustawienie systemu", + "@settingsSystemDefault": {}, + "settingsModificationWarningDialogMessage": "Pozostałe ustawienia zostaną zmodyfikowane.", + "@settingsModificationWarningDialogMessage": {}, + "settingsDefault": "Domyślne", + "@settingsDefault": {}, + "collectionDeselectSectionTooltip": "Odznacz sekcję", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "O programie", + "@drawerAboutButton": {}, + "drawerCollectionSphericalVideos": "Wideo 360°", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Albumy", + "@drawerAlbumPage": {}, + "sortOrderAtoZ": "Od A do Z", + "@sortOrderAtoZ": {}, + "searchRecentSectionTitle": "Ostatni", + "@searchRecentSectionTitle": {}, + "settingsSlideshowShuffle": "Mieszaj", + "@settingsSlideshowShuffle": {}, + "settingsWidgetDisplayedItem": "Wyświetlany element", + "@settingsWidgetDisplayedItem": {}, + "statsPageTitle": "Statystyki", + "@statsPageTitle": {}, + "settingsViewerShowOverlayThumbnails": "Pokaż miniaturki", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsSearchFieldLabel": "Wyszukaj ustawienia", + "@settingsSearchFieldLabel": {}, + "settingsActionImport": "Zaimportuj", + "@settingsActionImport": {}, + "appExportFavourites": "Ulubione", + "@appExportFavourites": {}, + "appExportSettings": "Ustawienia", + "@appExportSettings": {}, + "settingsHomeDialogTitle": "Strona główna", + "@settingsHomeDialogTitle": {}, + "settingsDoubleBackExit": "Dotknij dwa razy „wstecz”, aby wyjść", + "@settingsDoubleBackExit": {}, + "settingsNavigationDrawerTabTypes": "Kategorie", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerAddAlbum": "Dodaj album", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsConfirmationTile": "Działania do potwierdzenia", + "@settingsConfirmationTile": {}, + "settingsThumbnailShowTagIcon": "Pokaż ikonę znacznika", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Pokaż ikonę położenia", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowRawIcon": "Pokaż ikonę RAW", + "@settingsThumbnailShowRawIcon": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Dotknij i przytrzymaj, aby przesuwać przyciski i wybrać akcje, które mają być wyświetlane podczas wybierania elementów.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsViewerGestureSideTapNext": "Dotknij krawędzi ekranu, aby wyświetlić poprzedni / następny element", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerQuickActionEditorPageTitle": "Szybkie działania", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Odtwarzanie wideo", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "Ustawienia wideo", + "@settingsVideoPageTitle": {}, + "settingsVideoLoopModeTile": "Tryb pętli", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Tryb pętli", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTextAlignmentTile": "Dopasowanie tekstu", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Pozycja tekstu", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Rozmiar tekstu", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeBackgroundColor": "Kolor tła", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Lewo", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsVideoControlsTile": "Sterowanie", + "@settingsVideoControlsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Dotknij dwukrotnie, aby odtworzyć/wstrzymać", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsPrivacySectionTitle": "Prywatność", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Zezwól na dostęp do spisu aplikacji", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowErrorReporting": "Zezwól na anonimowe zgłaszanie błędów", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Zapisz historię wyszukiwania", + "@settingsSaveSearchHistory": {}, + "settingsStorageAccessTile": "Dostęp do pamięci masowej", + "@settingsStorageAccessTile": {}, + "settingsRemoveAnimationsTile": "Usuń animacje", + "@settingsRemoveAnimationsTile": {}, + "settingsDisplayUseTvInterface": "Interfejs Android TV", + "@settingsDisplayUseTvInterface": {}, + "settingsLanguagePageTitle": "Język", + "@settingsLanguagePageTitle": {}, + "settingsScreenSaverPageTitle": "Wygaszacz ekranu", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "Ramka zdjęcia", + "@settingsWidgetPageTitle": {}, + "settingsWidgetOpenPage": "Po dotknięciu widżetu", + "@settingsWidgetOpenPage": {}, + "statsTopAlbumsSectionTitle": "Najlepsze albumy", + "@statsTopAlbumsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "OTWÓRZ PANORAMĘ", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerErrorUnknown": "Ups!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "Plik już nie istnieje.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoLabelResolution": "Rozdzielczość", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Rozmiar", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelPath": "Ścieżka", + "@viewerInfoLabelPath": {}, + "mapZoomInTooltip": "Powiększ", + "@mapZoomInTooltip": {}, + "mapAttributionStamen": "Kafelki od [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "mapEmptyRegion": "Brak obrazów w tym regionie", + "@mapEmptyRegion": {}, + "settingsKeepScreenOnTile": "Pozostaw ekran włączony", + "@settingsKeepScreenOnTile": {}, + "viewerInfoSearchSuggestionRights": "Prawa", + "@viewerInfoSearchSuggestionRights": {}, + "settingsActionImportDialogTitle": "Zaimportuj", + "@settingsActionImportDialogTitle": {}, + "settingsKeepScreenOnDialogTitle": "Pozostaw ekran włączony", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsNavigationDrawerTile": "Menu nawigacyjne", + "@settingsNavigationDrawerTile": {}, + "settingsThumbnailSectionTitle": "Miniatury", + "@settingsThumbnailSectionTitle": {}, + "settingsCollectionQuickActionTabSelecting": "Wybieranie", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsThumbnailShowVideoDuration": "Pokaż czas trwania wideo", + "@settingsThumbnailShowVideoDuration": {}, + "settingsViewerUseCutout": "Użyj obszaru wycięcia", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Jasność maksymalna", + "@settingsViewerMaximumBrightness": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Wyświetlane przyciski", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerSlideshowTile": "Pokaz slajdów", + "@settingsViewerSlideshowTile": {}, + "settingsSlideshowFillScreen": "Wypełnij ekran", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowIntervalTile": "Interwał", + "@settingsSlideshowIntervalTile": {}, + "settingsVideoEnableHardwareAcceleration": "Przyspieszenie sprzętowe", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "Odtwarzaj automatycznie", + "@settingsVideoAutoPlay": {}, + "settingsSubtitleThemeSample": "Przykładowy napis.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Dopasowanie tekstu", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextPositionTile": "Pozycja tekstu", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSubtitleThemeBackgroundOpacity": "Krycie tła", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Środek", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Prawo", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsEnableBinSubtitle": "Zachowaj usunięte elementy przez 30 dni", + "@settingsEnableBinSubtitle": {}, + "settingsAllowMediaManagement": "Zezwalaj na zarządzanie multimediami", + "@settingsAllowMediaManagement": {}, + "settingsHiddenFiltersBanner": "Zdjęcia i wideo pasujące do ukrytych filtrów nie pojawią się w twojej kolekcji.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "Brak ukrytych filtrów", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessEmpty": "Brak przyznanych uprawnień", + "@settingsStorageAccessEmpty": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Pokaż alternatywy gestów wielodotykowych", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsThemeBrightnessDialogTitle": "Motyw", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "Podkreślenia kolorów", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Kolor dynamiczny", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Częstotliwość odświeżania ekranu", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Częstotliwość odświeżania", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageSectionTitle": "Język i formaty", + "@settingsLanguageSectionTitle": {}, + "settingsCoordinateFormatTile": "Format współrzędnych", + "@settingsCoordinateFormatTile": {}, + "settingsUnitSystemDialogTitle": "Jednostki", + "@settingsUnitSystemDialogTitle": {}, + "viewerSetWallpaperButtonLabel": "USTAW TAPETĘ", + "@viewerSetWallpaperButtonLabel": {}, + "viewerInfoLabelAddress": "Adres", + "@viewerInfoLabelAddress": {}, + "mapStyleTooltip": "Wybierz styl mapy", + "@mapStyleTooltip": {}, + "mapStyleDialogTitle": "Styl mapy", + "@mapStyleDialogTitle": {}, + "wallpaperUseScrollEffect": "Używaj efektu przewijania na ekranie głównym", + "@wallpaperUseScrollEffect": {}, + "tagEditorSectionRecent": "Ostatnie", + "@tagEditorSectionRecent": {}, + "sourceViewerPageTitle": "Źródło", + "@sourceViewerPageTitle": {}, + "viewerInfoSearchEmpty": "Brak pasujących kluczy", + "@viewerInfoSearchEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Odwołaj", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Dostępność", + "@settingsAccessibilitySectionTitle": {}, + "viewerInfoOpenLinkText": "Otwórz", + "@viewerInfoOpenLinkText": {}, + "tagEditorSectionPlaceholders": "Symbole zastępcze", + "@tagEditorSectionPlaceholders": {}, + "viewerInfoPageTitle": "Informacje", + "@viewerInfoPageTitle": {}, + "viewerInfoViewXmlLinkText": "Zobacz XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Nie udało się wyodrębnić osadzonych danych", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "settingsConfirmationBeforeMoveToBinItems": "Zapytaj, zanim przeniesiesz elementy do kosza", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Zapytaj, zanim przeniesiesz niedatowane elementy", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Pokaż komunikat po przeniesieniu elementów do Kosza", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerEditorPageTitle": "Menu nawigacyjne", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "Dotknij i przytrzymaj, aby przenieść i zmienić kolejność pozycji menu.", + "@settingsNavigationDrawerBanner": {}, + "settingsThumbnailShowFavouriteIcon": "Pokaż ikonę ulubionych", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Pokaż ikonę zdjęcia ruchomego", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailOverlayTile": "Nakładka", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailShowRating": "Pokaż ocenę", + "@settingsThumbnailShowRating": {}, + "settingsCollectionQuickActionsTile": "Szybkie działania", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Dotknij i przytrzymaj, aby przenieść przyciski i wybrać akcje wyświetlane podczas przeglądania elementów.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "appExportCovers": "Okładki", + "@appExportCovers": {}, + "settingsHomeTile": "Strona główna", + "@settingsHomeTile": {}, + "settingsThumbnailOverlayPageTitle": "Nakładka", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsLanguageTile": "Język", + "@settingsLanguageTile": {}, + "settingsCollectionTile": "Kolekcja", + "@settingsCollectionTile": {}, + "statsTopPlacesSectionTitle": "Najlepsze miejsca", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Najlepsze znaczniki", + "@statsTopTagsSectionTitle": {}, + "viewerInfoBackToViewerTooltip": "Wróć do przeglądarki", + "@viewerInfoBackToViewerTooltip": {}, + "mapZoomOutTooltip": "Pomniejsz", + "@mapZoomOutTooltip": {}, + "viewerInfoSearchSuggestionDescription": "Opis", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Wymiary", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionDate": "Data i godzina", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionResolution": "Rozdzielczość", + "@viewerInfoSearchSuggestionResolution": {}, + "tagEditorPageTitle": "Edytuj znaczniki", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Nowy znacznik", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Dodaj znacznik", + "@tagEditorPageAddTagTooltip": {}, + "settingsNavigationSectionTitle": "Nawigowanie", + "@settingsNavigationSectionTitle": {}, + "viewerInfoLabelDate": "Data", + "@viewerInfoLabelDate": {}, + "settingsTimeToTakeActionTile": "Czas na podjęcie działania", + "@settingsTimeToTakeActionTile": {}, + "settingsDisplaySectionTitle": "Wyświetlanie", + "@settingsDisplaySectionTitle": {}, + "settingsNavigationDrawerTabAlbums": "Albumy", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Strony", + "@settingsNavigationDrawerTabPages": {}, + "settingsVideoSectionTitle": "Wideo", + "@settingsVideoSectionTitle": {}, + "settingsSubtitleThemeShowOutline": "Pokaż kontur i cień", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Kolor tekstu", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Krycie tekstu", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsUnitSystemTile": "Jednostki", + "@settingsUnitSystemTile": {}, + "viewerInfoLabelOwner": "Właściciel", + "@viewerInfoLabelOwner": {}, + "viewerInfoSearchFieldLabel": "Wyszukaj metadane", + "@viewerInfoSearchFieldLabel": {}, + "panoramaEnableSensorControl": "Włącz sterowanie czujnikiem", + "@panoramaEnableSensorControl": {}, + "settingsSearchEmpty": "Brak pasującego ustawienia", + "@settingsSearchEmpty": {}, + "settingsActionExport": "Wyeksportuj", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "Wyeksportuj", + "@settingsActionExportDialogTitle": {}, + "settingsCollectionQuickActionEditorPageTitle": "Szybkie działania", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsViewerSectionTitle": "Przeglądarka", + "@settingsViewerSectionTitle": {}, + "settingsImageBackground": "Tło obrazu", + "@settingsImageBackground": {}, + "settingsViewerShowRatingTags": "Pokaż ocenę i znaczniki", + "@settingsViewerShowRatingTags": {}, + "settingsViewerShowShootingDetails": "Pokaż szczegóły fotografowania", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowInformation": "Pokaż informacje", + "@settingsViewerShowInformation": {}, + "settingsViewerEnableOverlayBlurEffect": "Efekt rozmycia", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsSubtitleThemePageTitle": "Napisy", + "@settingsSubtitleThemePageTitle": {}, + "settingsVideoShowVideos": "Pokaż wideo", + "@settingsVideoShowVideos": {}, + "settingsCoordinateFormatDialogTitle": "Format współrzędnych", + "@settingsCoordinateFormatDialogTitle": {}, + "statsTopCountriesSectionTitle": "Najlepsze kraje", + "@statsTopCountriesSectionTitle": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "panoramaDisableSensorControl": "Wyłącz sterowanie czujnikiem", + "@panoramaDisableSensorControl": {}, + "tagPlaceholderCountry": "Kraj", + "@tagPlaceholderCountry": {}, + "settingsConfirmationBeforeDeleteItems": "Zapytaj, zanim usuniesz elementy na zawsze", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationDialogTitle": "Działania do potwierdzenia", + "@settingsConfirmationDialogTitle": {}, + "settingsMotionPhotoAutoPlay": "Automatyczne odtwarzanie ruchomych zdjęć", + "@settingsMotionPhotoAutoPlay": {}, + "settingsViewerQuickActionsTile": "Szybkie działania", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorBanner": "Dotknij i przytrzymaj, aby przesunąć przyciski i wybrać czynności, które mają być wyświetlane w przeglądarce.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEmpty": "Brak przycisków", + "@settingsViewerQuickActionEmpty": {}, + "settingsSlideshowAnimatedZoomEffect": "Animowany efekt powiększenia", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsViewerShowInformationSubtitle": "Pokaż tytuł, datę, położenie itp.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsThemeBrightnessTile": "Motyw", + "@settingsThemeBrightnessTile": {}, + "tagPlaceholderPlace": "Miejsce", + "@tagPlaceholderPlace": {}, + "settingsHiddenItemsPageTitle": "Ukryte elementy", + "@settingsHiddenItemsPageTitle": {}, + "settingsRemoveAnimationsDialogTitle": "Usuń animacje", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsVideoControlsPageTitle": "Sterowanie", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "Przyciski", + "@settingsVideoButtonsTile": {}, + "settingsAllowInstalledAppAccessSubtitle": "Używane do poprawy wyświetlania albumu", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsEnableBin": "Używaj kosza", + "@settingsEnableBin": {}, + "settingsWidgetShowOutline": "Zarys", + "@settingsWidgetShowOutline": {}, + "settingsHiddenItemsTile": "Ukryte elementy", + "@settingsHiddenItemsTile": {}, + "viewerInfoLabelDuration": "Czas trwania", + "@viewerInfoLabelDuration": {}, + "settingsStorageAccessPageTitle": "Dostęp do pamięci masowej", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessBanner": "Niektóre katalogi wymagają jawnego udzielenia dostępu, aby modyfikować znajdujące się w nich pliki. Możesz przejrzeć tutaj katalogi, do których wcześniej udzielono dostępu.", + "@settingsStorageAccessBanner": {}, + "statsWithGps": "{count, plural, =1{1 element z położeniem} few{{count} elementy z położeniem} other{{count} elementów z położeniem}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "viewerInfoLabelDescription": "Opis", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Tytuł", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelCoordinates": "Współrzędne", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoUnknown": "Nieznany", + "@viewerInfoUnknown": {}, + "mapAttributionOsmHot": "Kafelki od [HOT](https://www.hotosm.org/) • Obsługiwany przez: [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapPointNorthUpTooltip": "Północ u góry", + "@mapPointNorthUpTooltip": {}, + "settingsCollectionQuickActionTabBrowsing": "Przeglądanie", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Dostępne przyciski", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerOverlayTile": "Nakładka", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "Nakładka", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "Pokaz w momencie otwarcia", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "Pokaż minimapę", + "@settingsViewerShowMinimap": {}, + "settingsVideoGestureSideDoubleTapSeek": "Dotknij dwukrotnie krawędzi ekranu, aby przeszukać do tyłu / do przodu", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsViewerShowDescription": "Pokaż opis", + "@settingsViewerShowDescription": {}, + "settingsViewerSlideshowPageTitle": "Pokaz slajdów", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Powtarzaj", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowTransitionTile": "Przejście", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowVideoPlaybackTile": "Odtwarzanie wideo", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSubtitleThemeTile": "Napisy", + "@settingsSubtitleThemeTile": {}, + "openMapPageTooltip": "Wyświetl na mapie", + "@openMapPageTooltip": {}, + "tooManyItemsErrorDialogMessage": "Spróbuj ponownie z mniejszą ilością elementów.", + "@tooManyItemsErrorDialogMessage": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Przesuń palcem w górę lub w dół, aby dostosować jasność/głośność", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "chipActionLock": "Zablokuj", + "@chipActionLock": {}, + "albumTierVaults": "Skarbce", + "@albumTierVaults": {}, + "chipActionConfigureVault": "Konfiguruj Skarbiec", + "@chipActionConfigureVault": {}, + "vaultLockTypePassword": "Hasło", + "@vaultLockTypePassword": {}, + "newVaultDialogTitle": "Nowy Skarbiec", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "Konfiguruj Skarbiec", + "@configureVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "Blokada po wyłączeniu ekranu", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "Rodzaj blokady", + "@vaultDialogLockTypeLabel": {}, + "pinDialogConfirm": "Potwierdź kod PIN", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "Wpisz hasło", + "@passwordDialogEnter": {}, + "pinDialogEnter": "Wpisz kod PIN", + "@pinDialogEnter": {}, + "passwordDialogConfirm": "Potwierdź hasło", + "@passwordDialogConfirm": {}, + "authenticateToUnlockVault": "Uwierzytelnij się, aby odblokować skarbiec", + "@authenticateToUnlockVault": {}, + "authenticateToConfigureVault": "Uwierzytelnij się, aby skonfigurować Skarbiec", + "@authenticateToConfigureVault": {}, + "settingsConfirmationVaultDataLoss": "Pokaż ostrzeżenie o utracie danych skarbca", + "@settingsConfirmationVaultDataLoss": {}, + "settingsDisablingBinWarningDialogMessage": "Elementy znajdujące się w koszu zostaną usunięte na zawsze.", + "@settingsDisablingBinWarningDialogMessage": {}, + "chipActionCreateVault": "Utwórz skarbiec", + "@chipActionCreateVault": {}, + "newVaultWarningDialogMessage": "Elementy w skarbcach są dostępne tylko dla tej aplikacji i żadnej innej.\n\nJeśli odinstalujesz tę aplikację lub wyczyścisz dane tej aplikacji, stracisz wszystkie te elementy.", + "@newVaultWarningDialogMessage": {}, + "vaultBinUsageDialogMessage": "Niektóre skarbce korzystają z kosza.", + "@vaultBinUsageDialogMessage": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "chipActionGoToPlacePage": "Pokaż w Miejscach", + "@chipActionGoToPlacePage": {}, + "drawerPlacePage": "Miejsca", + "@drawerPlacePage": {}, + "placeEmpty": "Brak miejsc", + "@placeEmpty": {}, + "exportEntryDialogWriteMetadata": "Zapisz metadane", + "@exportEntryDialogWriteMetadata": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "placePageTitle": "Miejsca", + "@placePageTitle": {}, + "vaultLockTypePattern": "Wzór", + "@vaultLockTypePattern": {}, + "patternDialogEnter": "Ustaw wzór", + "@patternDialogEnter": {}, + "patternDialogConfirm": "Potwierdź wzór", + "@patternDialogConfirm": {}, + "settingsVideoEnablePip": "Obraz w obrazie", + "@settingsVideoEnablePip": {}, + "settingsVideoBackgroundMode": "Tryb tła", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "Tryb tła", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsCollectionBurstPatternsNone": "Brak", + "@settingsCollectionBurstPatternsNone": {}, + "settingsCollectionBurstPatternsTile": "Wzory wybuchowe", + "@settingsCollectionBurstPatternsTile": {}, + "viewerActionUnlock": "Odblokuj przeglądarkę", + "@viewerActionUnlock": {}, + "viewerActionLock": "Zablokuj przeglądarkę", + "@viewerActionLock": {}, + "statePageTitle": "Stany", + "@statePageTitle": {}, + "stateEmpty": "Brak stanów", + "@stateEmpty": {}, + "searchStatesSectionTitle": "Stany", + "@searchStatesSectionTitle": {}, + "statsTopStatesSectionTitle": "Najpopularniejsze stany", + "@statsTopStatesSectionTitle": {}, + "tagPlaceholderState": "Stan", + "@tagPlaceholderState": {}, + "chipActionShowCountryStates": "Pokaż stany", + "@chipActionShowCountryStates": {}, + "settingsAskEverytime": "Zawsze pytaj", + "@settingsAskEverytime": {}, + "maxBrightnessNever": "Nigdy", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "Zawsze", + "@maxBrightnessAlways": {}, + "tagEditorDiscardDialogMessage": "Czy chcesz odrzucić zamiany?", + "@tagEditorDiscardDialogMessage": {}, + "settingsVideoResumptionModeTile": "Wznów odtwarzanie", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoResumptionModeDialogTitle": "Wznów odtwarzanie", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsVideoPlaybackTile": "Odtwarzanie", + "@settingsVideoPlaybackTile": {}, + "settingsVideoPlaybackPageTitle": "Odtwarzanie", + "@settingsVideoPlaybackPageTitle": {}, + "videoResumptionModeNever": "Nigdy", + "@videoResumptionModeNever": {}, + "videoResumptionModeAlways": "Zawsze", + "@videoResumptionModeAlways": {}, + "exportEntryDialogQuality": "Jakość", + "@exportEntryDialogQuality": {}, + "saveCopyButtonLabel": "ZAPISZ KOPIĘ", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Zastosuj", + "@applyTooltip": {}, + "editorTransformRotate": "Obróć", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Dowolnie", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Oryginał", + "@cropAspectRatioOriginal": {}, + "editorActionTransform": "Przekształć", + "@editorActionTransform": {}, + "editorTransformCrop": "Przytnij", + "@editorTransformCrop": {}, + "cropAspectRatioSquare": "Kwadrat", + "@cropAspectRatioSquare": {}, + "widgetTapUpdateWidget": "Zaktualizuj widżet", + "@widgetTapUpdateWidget": {}, + "aboutDataUsageExternal": "Zewnętrzny", + "@aboutDataUsageExternal": {}, + "aboutDataUsageSectionTitle": "Wykorzystanie danych", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageInternal": "Wewnętrzny", + "@aboutDataUsageInternal": {}, + "aboutDataUsageData": "Dane", + "@aboutDataUsageData": {}, + "aboutDataUsageDatabase": "Baza danych", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageCache": "Pamięć podręczna", + "@aboutDataUsageCache": {}, + "aboutDataUsageMisc": "Różne", + "@aboutDataUsageMisc": {}, + "overlayHistogramNone": "Brak", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "overlayHistogramLuminance": "Jasność", + "@overlayHistogramLuminance": {}, + "settingsViewerShowHistogram": "Pokaż histogram", + "@settingsViewerShowHistogram": {}, + "aboutDataUsageClearCache": "Wyczyść pamięć podręczną", + "@aboutDataUsageClearCache": {}, + "entryActionCast": "Cast", + "@entryActionCast": {}, + "castDialogTitle": "Urządzenia Cast", + "@castDialogTitle": {}, + "settingsThumbnailShowHdrIcon": "Pokaż ikonę HDR", + "@settingsThumbnailShowHdrIcon": {}, + "collectionActionSetHome": "Ustaw jako stronę główną", + "@collectionActionSetHome": {}, + "videoRepeatActionSetStart": "Ustaw początek", + "@videoRepeatActionSetStart": {}, + "stopTooltip": "Zatrzymaj", + "@stopTooltip": {}, + "videoActionABRepeat": "Powtarzanie A-B", + "@videoActionABRepeat": {}, + "videoRepeatActionSetEnd": "Ustaw koniec", + "@videoRepeatActionSetEnd": {}, + "settingsForceWesternArabicNumeralsTile": "Wymuszaj cyfry arabskie", + "@settingsForceWesternArabicNumeralsTile": {}, + "renameProcessorHash": "Skrót", + "@renameProcessorHash": {}, + "chipActionShowCollection": "Pokaż w Kolekcji", + "@chipActionShowCollection": {}, + "chipActionGoToExplorerPage": "Pokaż w przeglądarce", + "@chipActionGoToExplorerPage": {}, + "explorerPageTitle": "Przeglądarka", + "@explorerPageTitle": {}, + "selectStorageVolumeDialogTitle": "Wybierz pamięć", + "@selectStorageVolumeDialogTitle": {}, + "explorerActionSelectStorageVolume": "Wybierz pamięć", + "@explorerActionSelectStorageVolume": {}, + "setHomeCustom": "Własny", + "@setHomeCustom": {}, + "sortByDuration": "Według czasu trwania", + "@sortByDuration": {}, + "sortOrderShortestFirst": "Najkrótsze najpierw", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "Najdłuższe najpierw", + "@sortOrderLongestFirst": {}, + "mapStyleOpenTopoMap": "Otwórz TopoMap", + "@mapStyleOpenTopoMap": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapAttributionOsmLiberty": "Płytki od [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Obsługiwane przez [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Kafelki od [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "mapAttributionOsmData": "Dane mapy © [OpenStreetMap](https://www.openstreetmap.org/copyright) współtwórcy", + "@mapAttributionOsmData": {}, + "videoActionShowPreviousFrame": "Pokaż poprzednią klatkę", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "Pokaż kolejną klatkę", + "@videoActionShowNextFrame": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Album już istnieje", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "chipActionRemove": "Usuń", + "@chipActionRemove": {}, + "albumTierDynamic": "Dynamiczny", + "@albumTierDynamic": {}, + "dynamicAlbumAlreadyExists": "Dynamiczny album już istnieje", + "@dynamicAlbumAlreadyExists": {}, + "newDynamicAlbumDialogTitle": "Nowy dynamiczny album", + "@newDynamicAlbumDialogTitle": {}, + "collectionActionAddDynamicAlbum": "Dodaj dynamiczny album", + "@collectionActionAddDynamicAlbum": {}, + "appExportDynamicAlbums": "Dynamiczne albumy", + "@appExportDynamicAlbums": {}, + "chipActionDecompose": "Podziel", + "@chipActionDecompose": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "editEntryLocationDialogImportGpx": "Importuj GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "Przesunięcie czasowe", + "@editEntryLocationDialogTimeShift": {}, + "removeEntryMetadataDialogAll": "Wszystko", + "@removeEntryMetadataDialogAll": {}, + "searchFormatSectionTitle": "Formaty", + "@searchFormatSectionTitle": {}, + "sortByPath": "Według ścieżki", + "@sortByPath": {}, + "sectionNone": "Brak sekcji", + "@sectionNone": {}, + "createButtonLabel": "UTWÓRZ", + "@createButtonLabel": {}, + "chipActionGroup": "Zmień grupowanie", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Utwórz grupę", + "@chipActionCreateGroup": {}, + "albumTierGroups": "Grupy", + "@albumTierGroups": {}, + "newGroupDialogTitle": "Nowa grupa", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Nazwa grupy", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "Grupa już istnieje", + "@groupAlreadyExists": {}, + "groupEmpty": "Brak grup", + "@groupEmpty": {}, + "ungrouped": "Nie pogrupowano", + "@ungrouped": {}, + "groupPickerTitle": "Wybierz grupę", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Używaj tej grupy", + "@groupPickerUseThisGroupButton": {}, + "mapStyleDialogAddStyle": "Dodaj styl", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogName": "Nazwa", + "@mapStyleEditorDialogName": {}, + "settingsNavigationBottomActionsTile": "Dolna nawigacja", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Dolna nawigacja", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Dotknij i przytrzymaj, aby przesunąć przyciski i wybrać działania wyświetlane na dolnym pasku nawigacyjnym.", + "@settingsNavigationBottomActionEditorBanner": {}, + "mapStyleEditorDialogSubdomains": "Poddomeny", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "Użytkownik-agent", + "@mapStyleEditorDialogUserAgent": {}, + "tagPickPageTitle": "Wybierz znacznik", + "@tagPickPageTitle": {}, + "settingsViewerShowZoomLevel": "Pokaż poziom przybliżenia", + "@settingsViewerShowZoomLevel": {}, + "settingsEnabled": "Włączono", + "@settingsEnabled": {}, + "settingsForced": "Wymuszono", + "@settingsForced": {} +} diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb new file mode 100644 index 0000000..61f8f61 --- /dev/null +++ b/lib/l10n/app_pt.arb @@ -0,0 +1,1450 @@ +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Bem-vindo ao Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Opcional", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Eu concordo com os Termos e Condições", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, =1{{count} item} other{{count} itens}}", + "@itemCount": {}, + "timeSeconds": "{count, plural, =1{{count} segundo} other{{count} segundos}}", + "@timeSeconds": {}, + "timeMinutes": "{count, plural, =1{{count} minuto} other{{count} minutos}}", + "@timeMinutes": {}, + "timeDays": "{count, plural, =1{{count} dia} other{{count} dias}}", + "@timeDays": {}, + "focalLength": "{length} mm", + "@focalLength": {}, + "applyButtonLabel": "APLICAR", + "@applyButtonLabel": {}, + "deleteButtonLabel": "EXCLUIR", + "@deleteButtonLabel": {}, + "nextButtonLabel": "SEGUINTE", + "@nextButtonLabel": {}, + "showButtonLabel": "MOSTRAR", + "@showButtonLabel": {}, + "hideButtonLabel": "OCULTAR", + "@hideButtonLabel": {}, + "continueButtonLabel": "CONTINUAR", + "@continueButtonLabel": {}, + "cancelTooltip": "Cancelar", + "@cancelTooltip": {}, + "changeTooltip": "Mudar", + "@changeTooltip": {}, + "clearTooltip": "Limpar", + "@clearTooltip": {}, + "previousTooltip": "Anterior", + "@previousTooltip": {}, + "nextTooltip": "Seguinte", + "@nextTooltip": {}, + "showTooltip": "Mostrar", + "@showTooltip": {}, + "hideTooltip": "Ocultar", + "@hideTooltip": {}, + "actionRemove": "Remover", + "@actionRemove": {}, + "resetTooltip": "Redefinir", + "@resetTooltip": {}, + "saveTooltip": "Salvar", + "@saveTooltip": {}, + "pickTooltip": "Escolher", + "@pickTooltip": {}, + "doubleBackExitMessage": "Toque “voltar” novamente para sair.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "Não perguntar novamente", + "@doNotAskAgain": {}, + "sourceStateLoading": "Carregando", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Catalogando", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Localizando países", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Localizando lugares", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Excluir", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Mostrar nos Álbuns", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Mostrar nos Países", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "Mostrar nas Etiquetas", + "@chipActionGoToTagPage": {}, + "chipActionFilterOut": "Filtrar dentro", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Filtrar fora", + "@chipActionFilterIn": {}, + "chipActionHide": "Ocultar", + "@chipActionHide": {}, + "chipActionPin": "Fixar no topo", + "@chipActionPin": {}, + "chipActionUnpin": "Desafixar do topo", + "@chipActionUnpin": {}, + "chipActionRename": "Renomear", + "@chipActionRename": {}, + "chipActionSetCover": "Definir capa", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "Criar álbum", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "Copiar para área de transferência", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "Excluir", + "@entryActionDelete": {}, + "entryActionExport": "Exportar", + "@entryActionExport": {}, + "entryActionInfo": "Informações", + "@entryActionInfo": {}, + "entryActionConvert": "Converter", + "@entryActionConvert": {}, + "entryActionRename": "Renomear", + "@entryActionRename": {}, + "entryActionRestore": "Restaurar", + "@entryActionRestore": {}, + "entryActionRotateCCW": "Rotacionar para esquerda", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Rotacionar para direita", + "@entryActionRotateCW": {}, + "entryActionFlip": "Virar horizontalmente", + "@entryActionFlip": {}, + "entryActionPrint": "Imprimir", + "@entryActionPrint": {}, + "entryActionShare": "Compartilhar", + "@entryActionShare": {}, + "entryActionViewSource": "Ver origem", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "Mostrar como sobreposição de mapa", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Converter para imagem estática", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Abrir vídeo", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Editar", + "@entryActionEdit": {}, + "entryActionOpen": "Abrir com", + "@entryActionOpen": {}, + "entryActionSetAs": "Definir como", + "@entryActionSetAs": {}, + "entryActionOpenMap": "Mostrar no aplicativo de mapa", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Girar a tela", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Adicionar aos favoritos", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Remova dos favoritos", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Capturar quadro", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Mudo", + "@videoActionMute": {}, + "videoActionUnmute": "Ativar mudo", + "@videoActionUnmute": {}, + "videoActionPause": "Pausa", + "@videoActionPause": {}, + "videoActionPlay": "Toque", + "@videoActionPlay": {}, + "videoActionReplay10": "Retroceda 10 segundos", + "@videoActionReplay10": {}, + "videoActionSkip10": "Avançar 10 segundos", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Selecione as faixas", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Velocidade de reprodução", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "Configurações", + "@viewerActionSettings": {}, + "slideshowActionResume": "Retomar", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Mostrar na Coleção", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Editar data e hora", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Editar localização", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "Editar título e descrição", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Editar classificação", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Editar etiquetas", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Remover metadados", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "Lixeira", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Favorito", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Sem data", + "@filterNoDateLabel": {}, + "filterNoLocationLabel": "Não localizado", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Sem classificação", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Sem etiqueta", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Sem título", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "Neste dia", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Adicionado recentemente", + "@filterRecentlyAddedLabel": {}, + "filterRatingRejectedLabel": "Rejeitado", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Animado", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "Foto em movimento", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° vídeo", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Imagem", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Vídeo", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Graus decimais", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "L", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "O", + "@coordinateDmsWest": {}, + "unitSystemMetric": "Métrica", + "@unitSystemMetric": {}, + "unitSystemImperial": "Imperial", + "@unitSystemImperial": {}, + "videoLoopModeNever": "Nunca", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "Apenas vídeos curtos", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "Sempre", + "@videoLoopModeAlways": {}, + "videoControlsPlayOutside": "Abrir com outro player", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (Híbrido)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (Terreno)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "OSM Humanitário", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (Aquarela)", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyRename": "Renomear", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Substituir", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Pular", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "Nunca", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "Somente página do visualizador", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Sempre", + "@keepScreenOnAlways": {}, + "accessibilityAnimationsRemove": "Prevenir efeitos de tela", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Manter efeitos de tela", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferHighest": "Taxa mais alta", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Taxa mais baixa", + "@displayRefreshRatePreferLowest": {}, + "videoPlaybackSkip": "Pular", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Reproduzir sem som", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Reproduzir com som", + "@videoPlaybackWithSound": {}, + "themeBrightnessLight": "Claro", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Escuro", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Preto", + "@themeBrightnessBlack": {}, + "viewerTransitionSlide": "Deslizar", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Paralaxe", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "Desvaneça", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "Mais zoom", + "@viewerTransitionZoomIn": {}, + "viewerTransitionNone": "Nenhum", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Tela inicial", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "Tela de bloqueio", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Telas iniciais e de bloqueio", + "@wallpaperTargetHomeLock": {}, + "widgetOpenPageHome": "Abrir inicial", + "@widgetOpenPageHome": {}, + "widgetOpenPageViewer": "Abrir visualizador", + "@widgetOpenPageViewer": {}, + "albumTierNew": "Novo", + "@albumTierNew": {}, + "albumTierPinned": "Fixada", + "@albumTierPinned": {}, + "albumTierSpecial": "Comum", + "@albumTierSpecial": {}, + "albumTierApps": "Aplicativos", + "@albumTierApps": {}, + "albumTierRegular": "Outras", + "@albumTierRegular": {}, + "storageVolumeDescriptionFallbackPrimary": "Armazenamento interno", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "cartão SD", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "diretório raiz", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "diretório “{name}”", + "@otherDirectoryDescription": {}, + "storageAccessDialogMessage": "Selecione o {directory} de “{volume}” na próxima tela para dar acesso a este aplicativo.", + "@storageAccessDialogMessage": {}, + "restrictedAccessDialogMessage": "Este aplicativo não tem permissão para modificar arquivos no {directory} de “{volume}”.\n\nUse um gerenciador de arquivos ou aplicativo de galeria pré-instalado para mover os itens para outro diretório.", + "@restrictedAccessDialogMessage": {}, + "notEnoughSpaceDialogMessage": "Esta operação precisa {neededSize} de espaço livre em “{volume}” para completar, mas só {freeSize} restantes.", + "@notEnoughSpaceDialogMessage": {}, + "missingSystemFilePickerDialogMessage": "O seletor de arquivos do sistema está ausente ou desabilitado. Por favor, habilite e tente novamente.", + "@missingSystemFilePickerDialogMessage": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Esta operação não é suportada para itens do seguinte tipo: {types}.} other{Esta operação não é suportada para itens dos seguintes tipos: {types}.}}", + "@unsupportedTypeDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "Alguns arquivos na pasta de destino têm o mesmo nome.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "Alguns arquivos têm o mesmo nome.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "Rótulo de atalho", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "ADICIONAR", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "Não há aplicativos que possam lidar com isso.", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Mover esse item para a lixeira?} other{Mova estes {count} itens para a lixeira?}}", + "@binEntriesConfirmationDialogMessage": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Tem certeza de que deseja excluir este item?} other{Tem certeza de que deseja excluir estes {count} itens?}}", + "@deleteEntriesConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "Salvar as datas dos itens antes de continuar?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Definir data", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Deseja continuar jogando em {time}?", + "@videoResumeDialogMessage": {}, + "videoStartOverButtonLabel": "RECOMEÇAR", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "RETOMAR", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Último item", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Auto", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Personalizado", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "Fotos e vídeos correspondentes serão ocultados da sua coleção. Você pode mostrá-los novamente nas configurações de “Privacidade”.\n\nTem certeza de que deseja ocultá-los?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "Novo álbum", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Nome do álbum", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "O diretório já existe", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Armazenar:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "Novo nome", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "O diretório já existe", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Renomear", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "Padrão de nomeação", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Inserir campo", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Visualizar", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Contador", + "@renameProcessorCounter": {}, + "renameProcessorName": "Nome", + "@renameProcessorName": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Tem certeza de que deseja excluir este álbum e seu item?} other{Tem certeza de que deseja excluir este álbum e seus {count} itens?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Tem certeza de que deseja excluir estes álbuns e seus itens?} other{Tem certeza de que deseja excluir estes álbuns e seus {count} itens?}}", + "@deleteMultiAlbumConfirmationDialogMessage": {}, + "exportEntryDialogFormat": "Formato:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Largura", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Altura", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "Novo nome", + "@renameEntryDialogLabel": {}, + "editEntryDialogTargetFieldsHeader": "Campos para modificar", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Data e hora", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Definir data personalizada", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Copiar de outra data", + "@editEntryDateDialogCopyField": {}, + "editEntryDialogCopyFromItem": "Copiar de outro item", + "@editEntryDialogCopyFromItem": {}, + "editEntryDateDialogExtractFromTitle": "Extrair do título", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Mudança", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "Data de modificação do arquivo", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "Horas", + "@durationDialogHours": {}, + "durationDialogMinutes": "Minutos", + "@durationDialogMinutes": {}, + "editEntryLocationDialogTitle": "Localização", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogChooseOnMap": "Escolha no mapa", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "Latitude", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "Longitude", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "Usar essa localização", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "Avaliação", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Remoção de metadados", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "Mais", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP é necessário para reproduzir o vídeo dentro de uma foto em movimento.\n\nTem certeza de que deseja removê-lo?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "genericDangerWarningDialogMessage": "Tem certeza?", + "@genericDangerWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Velocidade de reprodução", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Áudio", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Legendas", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "Fora", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Acompanhar", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "Não há outras faixas.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "Feito!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Falhou", + "@genericFailureFeedback": {}, + "menuActionConfigureView": "Visualizar", + "@menuActionConfigureView": {}, + "menuActionSelect": "Selecionar", + "@menuActionSelect": {}, + "menuActionSelectAll": "Selecionar tudo", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "Selecione nenhum", + "@menuActionSelectNone": {}, + "menuActionMap": "Mapa", + "@menuActionMap": {}, + "menuActionSlideshow": "Apresentação de slides", + "@menuActionSlideshow": {}, + "menuActionStats": "Estatísticas", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "Organizar", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "Seções", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Layout", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "Ordem de classificação inversa", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "Mosaico", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "Rede", + "@tileLayoutGrid": {}, + "tileLayoutList": "Lista", + "@tileLayoutList": {}, + "coverDialogTabCover": "Capa", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "Aplicativo", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Cor", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Escolha o aplicativo", + "@appPickDialogTitle": {}, + "appPickDialogNone": "Nenhum", + "@appPickDialogNone": {}, + "aboutPageTitle": "Sobre", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Licença", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Política de Privacidade", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Relatório de erro", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Salvar registros de aplicativos em um arquivo", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Copiar informações do sistema", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "Copiar", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "Relatório no GitHub com os logs e informações do sistema", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "Relatório", + "@aboutBugReportButton": {}, + "aboutCreditsSectionTitle": "Créditos", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "Este aplicativo usa um arquivo de TopoJSON", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "sob licença ISC.", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Tradutores", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Licenças de código aberto", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "Este aplicativo usa os seguintes pacotes e bibliotecas de código aberto.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Bibliotecas Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Plug-ins Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Pacotes Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Pacotes Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Mostrar todas as licenças", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "Política de Privacidade", + "@policyPageTitle": {}, + "collectionPageTitle": "Coleção", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "Escolher", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "Selecionar itens", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Mostrar filtro de título", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Ocultar filtro de título", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Adicionar atalho", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "Caixa vazia", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Copiar para o álbum", + "@collectionActionCopy": {}, + "collectionActionMove": "Mover para o álbum", + "@collectionActionMove": {}, + "collectionActionRescan": "Reexaminar", + "@collectionActionRescan": {}, + "collectionActionEdit": "Editar", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Pesquisar títulos", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "Por álbum", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Por mês", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Por dia", + "@collectionGroupDay": {}, + "sectionUnknown": "Desconhecido", + "@sectionUnknown": {}, + "dateToday": "Hoje", + "@dateToday": {}, + "dateYesterday": "Ontem", + "@dateYesterday": {}, + "dateThisMonth": "Este mês", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Falha ao excluir 1 item} other{Falha ao excluir {count} itens}}", + "@collectionDeleteFailureFeedback": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{Falha ao copiar 1 item} other{Falha ao copiar {count} itens}}", + "@collectionCopyFailureFeedback": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{Falha ao mover 1 item} other{Falha ao mover {count} itens}}", + "@collectionMoveFailureFeedback": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{Falhei em renomear 1 item} other{Falha ao renomear {count} itens}}", + "@collectionRenameFailureFeedback": {}, + "collectionEditFailureFeedback": "{count, plural, =1{Falha ao editar 1 item} other{Falha ao editar {count} itens}}", + "@collectionEditFailureFeedback": {}, + "collectionExportFailureFeedback": "{count, plural, =1{Falha ao exportar 1 página} other{Falha ao exportar {count} páginas}}", + "@collectionExportFailureFeedback": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{1 item copiado} other{Copiado {count} itens}}", + "@collectionCopySuccessFeedback": {}, + "collectionMoveSuccessFeedback": "{count, plural, =1{1 item movido} other{Mudou-se {count} itens}}", + "@collectionMoveSuccessFeedback": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{1 item renomeado} other{Renomeado {count} itens}}", + "@collectionRenameSuccessFeedback": {}, + "collectionEditSuccessFeedback": "{count, plural, =1{Editado 1 item} other{Editado {count} itens}}", + "@collectionEditSuccessFeedback": {}, + "collectionEmptyFavourites": "Nenhum favorito", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "Nenhum video", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "Nenhuma imagem", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Garantir acesso", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Selecionar seção", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Desmarcar seção", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "Sobre", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Configurações", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "Toda a coleção", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Favoritos", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Imagens", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Vídeos", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "Animado", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Fotos em movimento", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "Panoramas", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Fotos Raw", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "Vídeos 360°", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Álbuns", + "@drawerAlbumPage": {}, + "drawerCountryPage": "Países", + "@drawerCountryPage": {}, + "drawerTagPage": "Etiquetas", + "@drawerTagPage": {}, + "sortByDate": "Por data", + "@sortByDate": {}, + "sortByName": "Por nome", + "@sortByName": {}, + "sortByItemCount": "Por contagem de itens", + "@sortByItemCount": {}, + "sortBySize": "Por tamanho", + "@sortBySize": {}, + "sortByAlbumFileName": "Por álbum e título do item", + "@sortByAlbumFileName": {}, + "sortByRating": "Por classificação", + "@sortByRating": {}, + "sortOrderNewestFirst": "Os mais novos primeiro", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Mais velhos primeiro", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "A a Z", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Z a A", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "Mais alto primeiro", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Mais baixo primeiro", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Maior primeiro", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "Menor primeiro", + "@sortOrderSmallestFirst": {}, + "albumGroupType": "Por tipo", + "@albumGroupType": {}, + "albumGroupTier": "Por nível", + "@albumGroupTier": {}, + "albumGroupVolume": "Por volume de armazenamento", + "@albumGroupVolume": {}, + "albumMimeTypeMixed": "Misturado", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "Copiar para o álbum", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Exportar para o álbum", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Mover para o álbum", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "Escolher álbum", + "@albumPickPageTitlePick": {}, + "albumCamera": "Câmera", + "@albumCamera": {}, + "albumDownload": "Download", + "@albumDownload": {}, + "albumScreenshots": "Capturas de tela", + "@albumScreenshots": {}, + "albumScreenRecordings": "Gravações de tela", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Capturas de vídeo", + "@albumVideoCaptures": {}, + "albumPageTitle": "Álbuns", + "@albumPageTitle": {}, + "albumEmpty": "Nenhum álbum", + "@albumEmpty": {}, + "createAlbumButtonLabel": "CRIA", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "novo", + "@newFilterBanner": {}, + "countryPageTitle": "Países", + "@countryPageTitle": {}, + "countryEmpty": "Nenhum país", + "@countryEmpty": {}, + "tagPageTitle": "Etiquetas", + "@tagPageTitle": {}, + "tagEmpty": "Sem etiquetas", + "@tagEmpty": {}, + "binPageTitle": "Lixeira", + "@binPageTitle": {}, + "searchCollectionFieldHint": "Pesquisar coleção", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "Recente", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Data", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "Álbuns", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "Países", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "Locais", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Etiquetas", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "Classificações", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "Metadados", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Configurações", + "@settingsPageTitle": {}, + "settingsSystemDefault": "Sistema", + "@settingsSystemDefault": {}, + "settingsDefault": "Padrão", + "@settingsDefault": {}, + "settingsDisabled": "Desativada", + "@settingsDisabled": {}, + "settingsSearchFieldLabel": "Pesquisar configuração", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Nenhuma configuração correspondente", + "@settingsSearchEmpty": {}, + "settingsActionExport": "Exportar", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "Exportar", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "Importar", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Importar", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "Capas", + "@appExportCovers": {}, + "appExportFavourites": "Favoritos", + "@appExportFavourites": {}, + "appExportSettings": "Configurações", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "Navegação", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Início", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Início", + "@settingsHomeDialogTitle": {}, + "settingsKeepScreenOnTile": "Manter a tela ligada", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Manter a tela ligada", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Toque em “voltar” duas vezes para sair", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "Caixas de diálogo de confirmação", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "Caixas de diálogo de confirmação", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Pergunte antes de excluir itens para sempre", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "Pergunte antes de mover itens para a lixeira", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Pergunte antes de mover itens sem data de metadados", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Mostrar mensagem depois de mover itens para a lixeira", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerTile": "Menu de navegação", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Menu de navegação", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "Toque e segure para mover e reordenar os itens do menu.", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "Tipos", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "Álbuns", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Páginas", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Adicionar álbum", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "Miniaturas", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "Sobreposição", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Sobreposição", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowFavouriteIcon": "Mostrar ícone favorito", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Mostrar ícone de etiqueta", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Mostrar ícone de localização", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Mostrar ícone de foto em movimento", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "Mostrar classificação", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Mostrar ícone raw", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Mostrar duração do vídeo", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "Ações rápidas", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Ações rápidas", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Navegando", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Selecionando", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Toque e segure para mover os botões e selecionar quais ações são exibidas ao navegar pelos itens.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Toque e segure para mover os botões e selecionar quais ações são exibidas ao selecionar itens.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsViewerSectionTitle": "Visualizador", + "@settingsViewerSectionTitle": {}, + "settingsViewerGestureSideTapNext": "Toque nas bordas da tela para mostrar anterior/seguinte", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerUseCutout": "Usar área de recorte", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Brilho máximo", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Reprodução automática de fotos em movimento", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "Plano de fundo da imagem", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Ações rápidas", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Ações rápidas", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "Toque e segure para mover os botões e selecionar quais ações são exibidas no visualizador.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Botões exibidos", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Botões disponíveis", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Sem botões", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "Sobreposição", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "Sobreposição", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "Mostrar na abertura", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "Mostrar minimapa", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Mostrar informações", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "Mostrar título, data, local, etc.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowShootingDetails": "Mostrar detalhes de disparo", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowOverlayThumbnails": "Mostrar miniaturas", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "Efeito de desfoque", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "Apresentação de slides", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "Apresentação de slides", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Repetir", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Embaralhar", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Preencher tela", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowAnimatedZoomEffect": "Efeito de zoom animado", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "Transição", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Intervalo", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "Reprodução de vídeo", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Reprodução de vídeo", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "Configurações de vídeo", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Vídeo", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "Mostrar vídeos", + "@settingsVideoShowVideos": {}, + "settingsVideoEnableHardwareAcceleration": "Aceleraçao do hardware", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "Reprodução automática", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "Modo de loop", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Modo de loop", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "Legendas", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Legendas", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Esta é uma amostra.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "Alinhamento de texto", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Alinhamento de Texto", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Tamanho do texto", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "Mostrar contorno e sombra", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Cor do texto", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Opacidade do texto", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Cor de fundo", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Opacidade do plano de fundo", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Esquerda", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Centro", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Direita", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoControlsTile": "Controles", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "Controles", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "Botões", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Toque duas vezes para reproduzir/pausar", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "Toque duas vezes nas bordas da tela buscar para trás/para frente", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsPrivacySectionTitle": "Privacidade", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Permitir acesso ao inventário de aplicativos", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "Usado para melhorar a exibição do álbum", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "Permitir relatórios de erros anônimos", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Salvar histórico de pesquisa", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "Usar lixeira", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "Manter itens excluídos por 30 dias", + "@settingsEnableBinSubtitle": {}, + "settingsHiddenItemsTile": "Itens ocultos", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Itens ocultos", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "Fotos e vídeos que correspondem a filtros ocultos não aparecerão em sua coleção.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "Sem filtros ocultos", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Acesso ao armazenamento", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "Acesso ao armazenamento", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessBanner": "Alguns diretórios exigem uma concessão de acesso explícito para modificar arquivos neles. Você pode revisar aqui os diretórios aos quais você deu acesso anteriormente.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Sem concessões de acesso", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Revogar", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Acessibilidade", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Remover animações", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "Remover Animações", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Tempo para executar uma ação", + "@settingsTimeToTakeActionTile": {}, + "settingsDisplaySectionTitle": "Tela", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "Destaques de cores", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Cor dinâmica", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Taxa de atualização de exibição", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Taxa de atualização", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageSectionTitle": "Idioma e Formatos", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "Idioma", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "Idioma", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "Formato de coordenadas", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "Formato de coordenadas", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Unidades", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "Unidades", + "@settingsUnitSystemDialogTitle": {}, + "settingsScreenSaverPageTitle": "Protetor de tela", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "Porta-retratos", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Contorno", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "Ao tocar no widget", + "@settingsWidgetOpenPage": {}, + "settingsCollectionTile": "Coleção", + "@settingsCollectionTile": {}, + "statsPageTitle": "Estatísticas", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, =1{1 item com localização} other{{count} itens com localização}}", + "@statsWithGps": {}, + "statsTopCountriesSectionTitle": "Principais Países", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Principais Lugares", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Principais Etiquetas", + "@statsTopTagsSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Principais Álbuns", + "@statsTopAlbumsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "ABRIR PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "DEFINIR PAPEL DE PAREDE", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Algo não está certo!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "O arquivo não existe mais.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Informações", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "Voltar ao visualizador", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "desconhecido", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "Descrição", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Título", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "Data", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "Resolução", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Tamanho", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Caminho", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Duração", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Propriedade de", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Coordenadas", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Endereço", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Estilo do mapa", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Selecione o estilo do mapa", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Mais zoom", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Reduzir o zoom", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Aponte para o norte para cima", + "@mapPointNorthUpTooltip": {}, + "mapAttributionOsmHot": "Blocos por [HOT](https://www.hotosm.org/) • Hospedado por [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "Blocos por [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "openMapPageTooltip": "Visualizar na página do mapa", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "Nenhuma imagem nesta região", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Falha ao extrair dados incorporados", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "Abrir", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Visualizar XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "Pesquisar metadados", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Nenhuma chave correspondente", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Data e Hora", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Descrição", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Dimensões", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Resolução", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Direitos", + "@viewerInfoSearchSuggestionRights": {}, + "wallpaperUseScrollEffect": "Use o efeito de rolagem na tela inicial", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageTitle": "Editar etiquetas", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Nova etiqueta", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Adicionar etiqueta", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Recente", + "@tagEditorSectionRecent": {}, + "panoramaEnableSensorControl": "Ativar o controle do sensor", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Desabilitar o controle do sensor", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Fonte", + "@sourceViewerPageTitle": {}, + "widgetOpenPageCollection": "Abrir coleção", + "@widgetOpenPageCollection": {}, + "durationDialogSeconds": "Segundos", + "@durationDialogSeconds": {}, + "settingsAllowMediaManagement": "Permitir gerenciamento de mídia", + "@settingsAllowMediaManagement": {}, + "tagEditorSectionPlaceholders": "Espaços reservados", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "País", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "Lugar", + "@tagPlaceholderPlace": {}, + "editEntryLocationDialogSetCustom": "Definir local personalizado", + "@editEntryLocationDialogSetCustom": {}, + "subtitlePositionBottom": "Fundo", + "@subtitlePositionBottom": {}, + "subtitlePositionTop": "Topo", + "@subtitlePositionTop": {}, + "widgetDisplayedItemRandom": "Aleatório", + "@widgetDisplayedItemRandom": {}, + "settingsSubtitleThemeTextPositionTile": "Posição do texto", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Posição do Texto", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsWidgetDisplayedItem": "Item exibido", + "@settingsWidgetDisplayedItem": {}, + "entryInfoActionRemoveLocation": "Remover localização", + "@entryInfoActionRemoveLocation": {}, + "filterNoAddressLabel": "Sem endereço", + "@filterNoAddressLabel": {}, + "keepScreenOnVideoPlayback": "Durante a reprodução do video", + "@keepScreenOnVideoPlayback": {}, + "settingsViewerShowDescription": "Mostrar descrição", + "@settingsViewerShowDescription": {}, + "entryActionShareImageOnly": "Compartilhar apenas imagem", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "Compartilhar apenas video", + "@entryActionShareVideoOnly": {}, + "filterAspectRatioPortraitLabel": "Retrato", + "@filterAspectRatioPortraitLabel": {}, + "filterAspectRatioLandscapeLabel": "Paisagem", + "@filterAspectRatioLandscapeLabel": {}, + "entryInfoActionExportMetadata": "Exportar metadados", + "@entryInfoActionExportMetadata": {}, + "widgetDisplayedItemMostRecent": "Mais recente", + "@widgetDisplayedItemMostRecent": {}, + "filterTaggedLabel": "Marcado", + "@filterTaggedLabel": {}, + "filterLocatedLabel": "Localizado", + "@filterLocatedLabel": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Mostrar alternativas de gesto multitoque", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsModificationWarningDialogMessage": "Outras configurações serão modificadas.", + "@settingsModificationWarningDialogMessage": {}, + "settingsDisplayUseTvInterface": "Interface de TV Android", + "@settingsDisplayUseTvInterface": {}, + "settingsViewerShowRatingTags": "Mostrar avaliações e etiquetas", + "@settingsViewerShowRatingTags": {}, + "chipActionLock": "Bloquear", + "@chipActionLock": {}, + "vaultLockTypePassword": "Senha", + "@vaultLockTypePassword": {}, + "newVaultDialogTitle": "Novo Cofre", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "Configurar Cofre", + "@configureVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "Bloquear quando a tela desligar", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "Tipo de bloqueio", + "@vaultDialogLockTypeLabel": {}, + "pinDialogEnter": "Digite o PIN", + "@pinDialogEnter": {}, + "pinDialogConfirm": "Confirme o PIN", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "Digite a senha", + "@passwordDialogEnter": {}, + "columnCount": "{count, plural, =1{{count} coluna} other{{count} colunas}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsDisablingBinWarningDialogMessage": "Os itens na lixeira serão excluídos para sempre.", + "@settingsDisablingBinWarningDialogMessage": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "chipActionCreateVault": "Criar cofre", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "Configurar cofre", + "@chipActionConfigureVault": {}, + "albumTierVaults": "Cofres", + "@albumTierVaults": {}, + "lengthUnitPixel": "pixels", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "exportEntryDialogWriteMetadata": "Escrever metadados", + "@exportEntryDialogWriteMetadata": {}, + "chipActionGoToPlacePage": "Exibir em Lugares", + "@chipActionGoToPlacePage": {}, + "placePageTitle": "Lugares", + "@placePageTitle": {}, + "drawerPlacePage": "Lugares", + "@drawerPlacePage": {}, + "placeEmpty": "Sem lugares", + "@placeEmpty": {}, + "tooManyItemsErrorDialogMessage": "Tente novamente com menos itens.", + "@tooManyItemsErrorDialogMessage": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Deslize para cima ou para baixo para ajustar o brilho/volume", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "passwordDialogConfirm": "Confirmar senha", + "@passwordDialogConfirm": {}, + "authenticateToConfigureVault": "Autentique-se para configurar o cofre", + "@authenticateToConfigureVault": {}, + "authenticateToUnlockVault": "Autentique-se para desbloquear o cofre", + "@authenticateToUnlockVault": {}, + "vaultBinUsageDialogMessage": "Alguns cofres estão usando a lixeira.", + "@vaultBinUsageDialogMessage": {}, + "newVaultWarningDialogMessage": "Os itens nos cofres estão disponíveis apenas para este aplicativo e nenhum outro.\n\nSe você desinstalar este aplicativo ou limpar os dados do aplicativo, perderá todos esses itens.", + "@newVaultWarningDialogMessage": {}, + "settingsConfirmationVaultDataLoss": "Mostrar aviso de perda de dados do cofre", + "@settingsConfirmationVaultDataLoss": {}, + "patternDialogEnter": "Inserir padrão", + "@patternDialogEnter": {}, + "patternDialogConfirm": "Confirmar padrão", + "@patternDialogConfirm": {}, + "vaultLockTypePattern": "Padrão", + "@vaultLockTypePattern": {}, + "settingsVideoEnablePip": "Picture-in-picture", + "@settingsVideoEnablePip": {}, + "settingsVideoBackgroundMode": "Modo de fundo", + "@settingsVideoBackgroundMode": {}, + "settingsCollectionBurstPatternsTile": "Padrões de explosão", + "@settingsCollectionBurstPatternsTile": {}, + "chipActionShowCountryStates": "Mostrar estados", + "@chipActionShowCountryStates": {}, + "viewerActionLock": "Bloquear visualizador", + "@viewerActionLock": {}, + "statePageTitle": "Estados", + "@statePageTitle": {}, + "stateEmpty": "Nenhum estado", + "@stateEmpty": {}, + "tagPlaceholderState": "Estado", + "@tagPlaceholderState": {}, + "searchStatesSectionTitle": "Estados", + "@searchStatesSectionTitle": {}, + "settingsCollectionBurstPatternsNone": "Nenhum", + "@settingsCollectionBurstPatternsNone": {}, + "statsTopStatesSectionTitle": "Principais Estados", + "@statsTopStatesSectionTitle": {}, + "viewerActionUnlock": "Desbloquear visualizador", + "@viewerActionUnlock": {}, + "settingsVideoBackgroundModeDialogTitle": "Modo de fundo", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsVideoPlaybackTile": "Reproduzir", + "@settingsVideoPlaybackTile": {}, + "maxBrightnessAlways": "Sempre", + "@maxBrightnessAlways": {}, + "videoResumptionModeAlways": "Sempre", + "@videoResumptionModeAlways": {}, + "exportEntryDialogQuality": "Qualidade", + "@exportEntryDialogQuality": {}, + "settingsAskEverytime": "Perguntar sempre", + "@settingsAskEverytime": {}, + "settingsVideoPlaybackPageTitle": "Reproduzir", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoResumptionModeTile": "Retomar a reprodução", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoResumptionModeDialogTitle": "Retomar a reprodução", + "@settingsVideoResumptionModeDialogTitle": {}, + "maxBrightnessNever": "Nunca", + "@maxBrightnessNever": {}, + "videoResumptionModeNever": "Nunca", + "@videoResumptionModeNever": {}, + "tagEditorDiscardDialogMessage": "Pretende rejeitar as alterações?", + "@tagEditorDiscardDialogMessage": {}, + "saveCopyButtonLabel": "SALVAR CÓPIA", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Aplicar", + "@applyTooltip": {}, + "editorActionTransform": "Transformar", + "@editorActionTransform": {}, + "editorTransformCrop": "Cortar", + "@editorTransformCrop": {}, + "editorTransformRotate": "Girar", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Livre", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Original", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Quadrada", + "@cropAspectRatioSquare": {}, + "widgetTapUpdateWidget": "Atualizar o widget", + "@widgetTapUpdateWidget": {}, + "aboutDataUsageMisc": "Outros", + "@aboutDataUsageMisc": {}, + "aboutDataUsageDatabase": "Banco de Dados", + "@aboutDataUsageDatabase": {}, + "overlayHistogramLuminance": "Luminância", + "@overlayHistogramLuminance": {}, + "aboutDataUsageSectionTitle": "Uso de Dados", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageCache": "Cache", + "@aboutDataUsageCache": {}, + "aboutDataUsageExternal": "Externo", + "@aboutDataUsageExternal": {}, + "overlayHistogramNone": "Nenhum", + "@overlayHistogramNone": {}, + "aboutDataUsageData": "Dados", + "@aboutDataUsageData": {}, + "aboutDataUsageInternal": "Interno", + "@aboutDataUsageInternal": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "settingsViewerShowHistogram": "Mostrar histograma", + "@settingsViewerShowHistogram": {}, + "aboutDataUsageClearCache": "Limpar o cache", + "@aboutDataUsageClearCache": {}, + "entryActionCast": "Transmitir", + "@entryActionCast": {}, + "castDialogTitle": "Dispositivos para Transmitir", + "@castDialogTitle": {}, + "settingsThumbnailShowHdrIcon": "Mostrar ícone HDR", + "@settingsThumbnailShowHdrIcon": {}, + "collectionActionSetHome": "Definir como início", + "@collectionActionSetHome": {}, + "videoActionABRepeat": "Repetição A-B", + "@videoActionABRepeat": {}, + "videoRepeatActionSetEnd": "Definir fim", + "@videoRepeatActionSetEnd": {}, + "stopTooltip": "Parar", + "@stopTooltip": {}, + "videoRepeatActionSetStart": "Definir início", + "@videoRepeatActionSetStart": {}, + "chipActionShowCollection": "Mostrar na Coleção", + "@chipActionShowCollection": {}, + "renameProcessorHash": "Hash", + "@renameProcessorHash": {}, + "settingsForceWesternArabicNumeralsTile": "Forçar numerais arábicos", + "@settingsForceWesternArabicNumeralsTile": {}, + "chipActionGoToExplorerPage": "Mostrar no Explorador", + "@chipActionGoToExplorerPage": {}, + "explorerPageTitle": "Explorador", + "@explorerPageTitle": {}, + "sortByDuration": "Por duração", + "@sortByDuration": {}, + "sortOrderShortestFirst": "Mais curtos primeiro", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "Mais longos primeiro", + "@sortOrderLongestFirst": {}, + "explorerActionSelectStorageVolume": "Selecione o armazenamento", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "Selecione o Armazenamento", + "@selectStorageVolumeDialogTitle": {}, + "setHomeCustom": "Personalizada", + "@setHomeCustom": {}, + "mapAttributionOsmData": "Dados do mapa © [OpenStreetMap](https://www.openstreetmap.org/copyright) colaboradores", + "@mapAttributionOsmData": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapAttributionOsmLiberty": "Blocos por [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hospedado por [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Blocos por [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "videoActionShowNextFrame": "Mostrar próximo quadro", + "@videoActionShowNextFrame": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "O álbum já existe", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "videoActionShowPreviousFrame": "Mostrar quadro anterior", + "@videoActionShowPreviousFrame": {}, + "chipActionRemove": "Remover", + "@chipActionRemove": {}, + "albumTierDynamic": "Dinâmico", + "@albumTierDynamic": {}, + "newDynamicAlbumDialogTitle": "Novo Álbum Dinâmico", + "@newDynamicAlbumDialogTitle": {}, + "dynamicAlbumAlreadyExists": "O álbum dinâmico já existe", + "@dynamicAlbumAlreadyExists": {}, + "collectionActionAddDynamicAlbum": "Adicionar álbum dinâmico", + "@collectionActionAddDynamicAlbum": {}, + "appExportDynamicAlbums": "Álbuns dinâmicos", + "@appExportDynamicAlbums": {}, + "chipActionDecompose": "Separar", + "@chipActionDecompose": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "editEntryLocationDialogImportGpx": "Importar GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "Salto temporal", + "@editEntryLocationDialogTimeShift": {}, + "removeEntryMetadataDialogAll": "Todos", + "@removeEntryMetadataDialogAll": {}, + "sortByPath": "Pelo caminho", + "@sortByPath": {}, + "searchFormatSectionTitle": "Formatos", + "@searchFormatSectionTitle": {}, + "createButtonLabel": "CRIAR", + "@createButtonLabel": {}, + "chipActionGroup": "Alterar agrupamento", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Criar grupo", + "@chipActionCreateGroup": {}, + "albumTierGroups": "Grupos", + "@albumTierGroups": {}, + "newGroupDialogTitle": "Novo Grupo", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Nome do grupo", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "O grupo já existe", + "@groupAlreadyExists": {}, + "groupEmpty": "Nenhum grupo", + "@groupEmpty": {}, + "ungrouped": "Desagrupado", + "@ungrouped": {}, + "groupPickerTitle": "Selecionar Grupo", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Usar este grupo", + "@groupPickerUseThisGroupButton": {}, + "sectionNone": "Nenhuma seção", + "@sectionNone": {}, + "tagPickPageTitle": "Escolher etiqueta", + "@tagPickPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Toque e segure para mover botões e escolher quais ações são exibidas na barra de navegação inferior.", + "@settingsNavigationBottomActionEditorBanner": {}, + "mapStyleDialogAddStyle": "Adicionar estilo", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogName": "Nome", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogSubdomains": "Subdomínios", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "User-Agent", + "@mapStyleEditorDialogUserAgent": {}, + "settingsNavigationBottomActionsTile": "Navegação de fundo", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Navegação de fundo", + "@settingsNavigationBottomActionEditorPageTitle": {} +} diff --git a/lib/l10n/app_ro.arb b/lib/l10n/app_ro.arb new file mode 100644 index 0000000..cb16ab6 --- /dev/null +++ b/lib/l10n/app_ro.arb @@ -0,0 +1,951 @@ +{ + "welcomeMessage": "Bun venit la Aves", + "welcomeOptional": "Opțional", + "welcomeTermsToggle": "Sunt de acord cu Termenii și condițiile", + "timeSeconds": "{count, plural, =1{{count} secundă} other{{count} secunde}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "timeMinutes": "{count, plural, =1{{count} minut} other{{count} minute}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "timeDays": "{count, plural, =1{{count} zi} other{{count} zile}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "applyButtonLabel": "APLICA", + "deleteButtonLabel": "ȘTERGE", + "nextButtonLabel": "URMĂTORUL", + "showButtonLabel": "SPECTACOL", + "hideButtonLabel": "ASCUNDE", + "continueButtonLabel": "CONTINUA", + "cancelTooltip": "Anulare", + "changeTooltip": "Schimbare", + "previousTooltip": "Anterior", + "nextTooltip": "Următorul", + "showTooltip": "Spectacol", + "hideTooltip": "Ascunde", + "actionRemove": "Elimina", + "resetTooltip": "Resetați", + "saveTooltip": "Salvați", + "pickTooltip": "Alege", + "doubleBackExitMessage": "Atingeți „înapoi” din nou pentru a ieși.", + "doNotAskAgain": "Nu cere din nou", + "sourceStateLoading": "Se încarcă", + "sourceStateCataloguing": "Catalogare", + "sourceStateLocatingCountries": "Localizarea țărilor", + "sourceStateLocatingPlaces": "Localizarea locurilor", + "chipActionDelete": "Șterge", + "chipActionGoToAlbumPage": "Afișați în albume", + "chipActionGoToTagPage": "Afișați în etichete", + "chipActionGoToCountryPage": "Adișați în țări", + "chipActionFilterOut": "Filtre de ieșire", + "chipActionFilterIn": "Filtre de intrare", + "chipActionHide": "Ascunde", + "chipActionPin": "Fixați sus", + "chipActionUnpin": "Anulați fixarea de sus", + "chipActionRename": "Redenumiți", + "chipActionSetCover": "Setați capacul", + "chipActionCreateAlbum": "Creați album", + "entryActionCopyToClipboard": "Copiați în clipboard", + "entryActionDelete": "Șterge", + "entryActionConvert": "Convertit", + "entryActionExport": "Export", + "entryActionInfo": "Info", + "entryActionRename": "Redenumiți", + "entryActionRotateCCW": "Rotiți în sens invers acelor de ceasornic", + "entryActionFlip": "Întoarceți pe orizontală", + "entryActionPrint": "Imprimare", + "entryActionShare": "Partajare", + "entryActionConvertMotionPhotoToStillImage": "Convertiți în imagine statică", + "entryActionViewMotionPhotoVideo": "Deschide videoclipul", + "entryActionEdit": "Editați", + "entryActionOpen": "Deschide cu", + "entryActionSetAs": "Setați ca", + "entryActionOpenMap": "Afișați în aplicația pentru hartă", + "entryActionRotateScreen": "Rotiți ecranul", + "entryActionAddFavourite": "Adauga la favorite", + "videoActionCaptureFrame": "Captură cadru", + "videoActionUnmute": "Activați sunetul", + "videoActionMute": "Dezactivați sunetul", + "videoActionPause": "Pauză", + "videoActionPlay": "Redă", + "videoActionReplay10": "Căutați înapoi 10 secunde", + "videoActionSkip10": "Căutați înainte 10 secunde", + "videoActionSelectStreams": "Selectați piese", + "viewerActionSettings": "Setări", + "slideshowActionResume": "Reluare", + "slideshowActionShowInCollection": "Afișați în colecție", + "entryInfoActionEditDate": "Editați data și ora", + "entryInfoActionEditLocation": "Editați locația", + "entryInfoActionEditTitleDescription": "Editați titlul și descrierea", + "entryInfoActionEditRating": "Editați evaluarea", + "entryInfoActionRemoveMetadata": "Eliminați metadatele", + "filterBinLabel": "Cos de gunoi", + "filterFavouriteLabel": "Favorit", + "filterNoDateLabel": "Nedatat", + "filterNoLocationLabel": "Nelocat", + "filterNoRatingLabel": "Neevaluat", + "filterNoTagLabel": "Neetichetat", + "filterNoTitleLabel": "Fără titlu", + "filterOnThisDayLabel": "În această zi", + "filterRatingRejectedLabel": "Respins", + "filterTypeAnimatedLabel": "Animații", + "filterTypeMotionPhotoLabel": "Fotografie în mișcare", + "filterTypePanoramaLabel": "Panoramă", + "filterTypeRawLabel": "Raw", + "filterTypeSphericalVideoLabel": "Video 360°", + "filterTypeGeotiffLabel": "GeoTIFF", + "filterMimeImageLabel": "Imagine", + "filterMimeVideoLabel": "Video", + "coordinateFormatDms": "DMS", + "coordinateFormatDecimal": "Grade zecimale", + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsNorth": "N", + "coordinateDmsSouth": "S", + "coordinateDmsEast": "E", + "coordinateDmsWest": "W", + "unitSystemMetric": "Metrice", + "unitSystemImperial": "Imperial", + "videoLoopModeNever": "Niciodată", + "videoLoopModeShortOnly": "Numai videoclipuri scurte", + "videoLoopModeAlways": "Mereu", + "videoControlsPlayOutside": "Deschide cu alt player", + "mapStyleGoogleNormal": "Hărți Google", + "mapStyleGoogleHybrid": "Hărți Google (hibrid)", + "mapStyleGoogleTerrain": "Hărți Google (Teren)", + "mapStyleOsmHot": "OSM umanitar", + "mapStyleStamenWatercolor": "Stamine Acuarela", + "nameConflictStrategyRename": "Redenumiți", + "nameConflictStrategyReplace": "Înlocuiți", + "nameConflictStrategySkip": "Sări", + "keepScreenOnNever": "Nu", + "keepScreenOnViewerOnly": "Numai pagina de vizualizare", + "keepScreenOnAlways": "Mereu", + "accessibilityAnimationsRemove": "Preveniți efectele ecranului", + "accessibilityAnimationsKeep": "Păstrați efectele ecranului", + "displayRefreshRatePreferHighest": "Rata cea mai mare", + "displayRefreshRatePreferLowest": "Rata cea mai mica", + "videoPlaybackSkip": "Sări", + "videoPlaybackMuted": "Redare fără sunet", + "videoPlaybackWithSound": "Redare cu sunet", + "themeBrightnessDark": "Întunecată", + "themeBrightnessLight": "Luminoasă", + "themeBrightnessBlack": "Black", + "viewerTransitionSlide": "Slide", + "viewerTransitionParallax": "Paralaxă", + "viewerTransitionFade": "Decolorare", + "viewerTransitionZoomIn": "Mărește zoom", + "viewerTransitionNone": "Nici unul", + "wallpaperTargetHome": "Ecranul de start", + "wallpaperTargetLock": "Ecranul de blocare", + "wallpaperTargetHomeLock": "Ecranul de start și de blocare", + "widgetOpenPageHome": "Deschide acasă", + "widgetOpenPageCollection": "Deschide colecții", + "widgetOpenPageViewer": "Deschide vizualizatorul", + "albumTierNew": "Nou", + "albumTierPinned": "Fixat", + "albumTierSpecial": "Uzual", + "albumTierApps": "Aplicații", + "albumTierRegular": "Alții", + "storageVolumeDescriptionFallbackPrimary": "Stocare internă", + "storageVolumeDescriptionFallbackNonPrimary": "card SD", + "rootDirectoryDescription": "directorul rădăcină", + "otherDirectoryDescription": "directorul „{name}”", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "notEnoughSpaceDialogMessage": "Această operațiune are nevoie de {neededSize} spațiu liber pe „{volume}” pentru a fi finalizată, dar a mai rămas doar {freeSize}.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "missingSystemFilePickerDialogMessage": "Selectorul de fișiere de sistem lipsește sau este dezactivat. Activați-l și încercați din nou.", + "nameConflictDialogSingleSourceMessage": "Unele fișiere din folderul de destinație au același nume.", + "nameConflictDialogMultipleSourceMessage": "Unele fișiere au același nume.", + "addShortcutDialogLabel": "Etichetă de comandă rapidă", + "addShortcutButtonLabel": "ADD", + "noMatchingAppDialogMessage": "Nu există aplicații care să se ocupe de asta.", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Mutați acest articol în coșul de reciclare?} other{Mutați aceste {count} articole în coșul de reciclare?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Ștergeți acest articol?} other{Ștergeți aceste {count} articole?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "moveUndatedConfirmationDialogMessage": "Salvați datele articolului înainte de a continua?", + "moveUndatedConfirmationDialogSetDate": "Salvați datele", + "videoResumeDialogMessage": "Doriți să reluați redarea la {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "videoStartOverButtonLabel": "Începe din nou", + "videoResumeButtonLabel": "Reluați", + "setCoverDialogLatest": "Ultimul articol", + "setCoverDialogAuto": "Auto", + "setCoverDialogCustom": "Personalizat", + "hideFilterConfirmationDialogMessage": "Fotografiile și videoclipurile care se potrivesc vor fi ascunse din colecția ta. Le puteți afișa din nou din setările „Confidențialitate”.\n\n Ești sigur că vrei să le ascunzi?", + "newAlbumDialogTitle": "Album nou", + "newAlbumDialogNameLabel": "Numele albumului", + "newAlbumDialogNameLabelAlreadyExistsHelper": "Directorul există deja", + "newAlbumDialogStorageLabel": "Depozitare:", + "renameAlbumDialogLabel": "Nume nou", + "renameAlbumDialogLabelAlreadyExistsHelper": "Directorul există deja", + "renameEntrySetPageTitle": "Redenumiți", + "renameEntrySetPagePatternFieldLabel": "Model de denumire", + "renameEntrySetPageInsertTooltip": "Inserați câmp", + "renameEntrySetPagePreviewSectionTitle": "Previzualizare", + "renameProcessorCounter": "Tejghea", + "renameProcessorName": "Nume", + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Ștergi acest album și articolul din el?} other{Ștergi acest album și {count} articolele din el?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Ștergi aceste albume și articolul din ele?} other{Ștergi aceste albume și {count} articolele din ele?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "exportEntryDialogFormat": "Format:", + "exportEntryDialogWidth": "Lățime", + "exportEntryDialogHeight": "Înălțime", + "renameEntryDialogLabel": "Nume nou", + "editEntryDialogCopyFromItem": "Copiați din alt articol", + "editEntryDialogTargetFieldsHeader": "Câmpuri de modificat", + "editEntryDateDialogTitle": "Data și ora", + "editEntryDateDialogSetCustom": "Setați o dată personalizată", + "editEntryDateDialogCopyField": "Copie de la altă dată", + "editEntryDateDialogExtractFromTitle": "Extras din titlu", + "editEntryDateDialogShift": "Schimbă", + "editEntryDateDialogSourceFileModifiedDate": "Data modificării fișierului", + "durationDialogHours": "Ore", + "durationDialogMinutes": "Minute", + "durationDialogSeconds": "secunde", + "editEntryLocationDialogTitle": "Locație", + "editEntryLocationDialogSetCustom": "Setați locația personalizată", + "editEntryLocationDialogChooseOnMap": "Alegeți pe hartă", + "editEntryLocationDialogLatitude": "Latitudine", + "editEntryLocationDialogLongitude": "Longitudine", + "locationPickerUseThisLocationButton": "Utilizați această locație", + "editEntryRatingDialogTitle": "Evaluare", + "removeEntryMetadataDialogTitle": "Eliminarea metadatelor", + "removeEntryMetadataDialogMore": "Mai mult", + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP este necesar pentru a reda videoclipul dintr-o fotografie în mișcare.\n\nSunteți sigur că doriți să-l eliminați?", + "genericDangerWarningDialogMessage": "Esti sigur?", + "videoSpeedDialogLabel": "Viteza de redare", + "videoStreamSelectionDialogVideo": "Video", + "videoStreamSelectionDialogAudio": "Audio", + "videoStreamSelectionDialogText": "Subtitrări", + "videoStreamSelectionDialogOff": "Oprit", + "videoStreamSelectionDialogTrack": "Pistă", + "videoStreamSelectionDialogNoSelection": "Nu există alte piese.", + "genericSuccessFeedback": "Terminat!", + "genericFailureFeedback": "Eșuat", + "menuActionConfigureView": "Vedere", + "menuActionSelect": "Selectați", + "menuActionSelectAll": "Selectează tot", + "menuActionSelectNone": "Nu selectați nimic", + "menuActionMap": "Hartă", + "menuActionSlideshow": "Prezentare de diapozitive", + "menuActionStats": "Statistici", + "viewDialogSortSectionTitle": "Sortează", + "viewDialogGroupSectionTitle": "Secțiuni", + "viewDialogLayoutSectionTitle": "Aspect", + "viewDialogReverseSortOrder": "Ordinea de sortare inversă", + "tileLayoutMosaic": "Mozaic", + "tileLayoutGrid": "Grilă", + "tileLayoutList": "Listă", + "coverDialogTabCover": "Copertă", + "coverDialogTabApp": "App", + "coverDialogTabColor": "Culoare", + "appPickDialogTitle": "Alegeți aplicația", + "appPickDialogNone": "Nici unul", + "aboutPageTitle": "Despre", + "aboutLinkLicense": "Licență", + "aboutLinkPolicy": "Politica de Confidențialitate", + "aboutBugSectionTitle": "Raport de eroare", + "aboutBugSaveLogInstruction": "Salvați jurnalele aplicației într-un fișier", + "aboutBugCopyInfoInstruction": "Copiați informațiile despre sistem", + "aboutBugCopyInfoButton": "Copie", + "aboutBugReportInstruction": "Raportați pe GitHub cu jurnalele și informațiile de sistem", + "aboutBugReportButton": "Raport", + "aboutCreditsSectionTitle": "Credite", + "aboutCreditsWorldAtlas1": "Această aplicație folosește un fișier TopoJSON de la", + "aboutCreditsWorldAtlas2": "sub licență ISC.", + "aboutTranslatorsSectionTitle": "Traducători", + "aboutLicensesSectionTitle": "Licențe open-source", + "aboutLicensesBanner": "Această aplicație folosește următoarele pachete și biblioteci open-source.", + "aboutLicensesAndroidLibrariesSectionTitle": "Biblioteci Android", + "aboutLicensesFlutterPluginsSectionTitle": "Pluginuri Flutter", + "aboutLicensesFlutterPackagesSectionTitle": "Pachete Flutter", + "aboutLicensesDartPackagesSectionTitle": "Pachete Dart", + "aboutLicensesShowAllButtonLabel": "Afișați toate licențele", + "collectionPageTitle": "Colectie", + "collectionSelectPageTitle": "Selectați articole", + "collectionActionShowTitleSearch": "Afișează filtrul de titlu", + "collectionActionHideTitleSearch": "Ascunde filtrul de titlu", + "collectionActionAddShortcut": "Adauga scurtatura", + "collectionActionEmptyBin": "Coșul gol", + "collectionActionCopy": "Copiați în album", + "collectionActionMove": "Mutați la album", + "collectionActionRescan": "Rescanați", + "collectionActionEdit": "Editați", + "collectionSearchTitlesHintText": "Căutați titluri", + "collectionGroupAlbum": "După album", + "collectionGroupMonth": "După lună", + "collectionGroupDay": "După zi", + "sectionUnknown": "Necunoscut", + "dateToday": "Astăzi", + "dateYesterday": "Ieri", + "dateThisMonth": "Luna aceasta", + "collectionDeleteFailureFeedback": "{count, plural, =1{A eșuat ștergerea unui element} other{A eșuat ștergerea a {count} elemente}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopyFailureFeedback": "{count, plural, =1{Eșuat la copierea unui articol} other{Eșuat la copierea {count} articole}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{Nu s-au mutat 1 articol} other{Nu s-au mutat {count} articole}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "appName": "Aves", + "itemCount": "{count, plural, =1{{count} element} other{{count} elemente}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "restrictedAccessDialogMessage": "Această aplicație nu are permisiunea de a modifica fișiere din {directory} „{volume}”.\n\nUtilizați un manager de fișiere preinstalat sau o aplicație de galerie pentru a muta elementele într-un alt director.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "entryActionRotateCW": "Roteste in sensul acelor de ceasornic", + "entryActionViewSource": "Vizualizare sursă", + "entryActionShowGeoTiffOnMap": "Afișați ca suprapunere a hărții", + "entryActionRestore": "Restabiliți", + "entryActionRemoveFavourite": "Eliminați din favorite", + "videoActionSetSpeed": "Viteza de redare", + "entryInfoActionEditTags": "Editați etichetele", + "filterRecentlyAddedLabel": "Adaugate recent", + "storageAccessDialogMessage": "Vă rugăm să selectați {directory} „{volume}” în ecranul următor pentru a oferi acestei aplicații acces la acesta.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "unsupportedTypeDialogMessage": "{count, plural, =1{Această operațiune nu este acceptată pentru articole de următorul tip: {types}.} other{Această operațiune nu este acceptată pentru articole de următoarele tipuri: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "policyPageTitle": "Politica de Confidențialitate", + "collectionPickPageTitle": "Alege", + "subtitlePositionTop": "Sus", + "tagEmpty": "Fără etichete", + "settingsViewerSectionTitle": "Vizualizator", + "settingsPrivacySectionTitle": "Confidențialitate", + "viewerInfoLabelSize": "Dimensiune", + "subtitlePositionBottom": "Jos", + "albumMimeTypeMixed": "Amestecat", + "settingsActionExportDialogTitle": "Export", + "settingsDefault": "Implicit", + "countryEmpty": "Fără țări", + "statsTopTagsSectionTitle": "Etichete de top", + "albumGroupType": "După tip", + "sortByRating": "După evaluare", + "viewerInfoLabelUri": "URI", + "viewerInfoLabelDescription": "Descriere", + "settingsThumbnailOverlayPageTitle": "Suprapunere", + "mapPointNorthUpTooltip": "Îndreptați spre nord în sus", + "drawerCollectionAnimated": "Animate", + "sortOrderOldestFirst": "Cele mai vechi mai întâi", + "albumPickPageTitleExport": "Exportare în album", + "albumPickPageTitleMove": "Mutare în album", + "settingsThumbnailOverlayTile": "Suprapunere", + "viewerInfoOpenLinkText": "Deschidere", + "viewerInfoSearchSuggestionResolution": "Rezoluție", + "sortOrderLowestFirst": "Cele mai joase mai întâi", + "searchTagsSectionTitle": "Etichete", + "settingsImageBackground": "Fundal imagine", + "settingsSubtitleThemeTextPositionTile": "Poziția textului", + "viewerSetWallpaperButtonLabel": "SETARE CA FUNDAL", + "sortByItemCount": "După numărul de elemente", + "albumScreenshots": "Capturi de ecran", + "albumScreenRecordings": "Înregistrări de ecran", + "albumVideoCaptures": "Capturi video", + "settingsDisabled": "Dezactivat", + "settingsActionImportDialogTitle": "Import", + "settingsMotionPhotoAutoPlay": "Redarea automată a fotografiilor în mișcare", + "settingsSlideshowIntervalTile": "Interval", + "viewerOpenPanoramaButtonLabel": "DESCHIDERE PANORAMĂ", + "mapZoomInTooltip": "Mărire", + "openMapPageTooltip": "Vizualizare pe pagina hărții", + "viewerInfoSearchSuggestionDimensions": "Dimensiuni", + "settingsSubtitleThemeTextAlignmentRight": "Dreapta", + "settingsWidgetShowOutline": "Contur", + "viewerInfoBackToViewerTooltip": "Înapoi la vizualizator", + "viewerInfoLabelDuration": "Durată", + "mapEmptyRegion": "Nu există imagini în această regiune", + "drawerAboutButton": "Despre", + "settingsActionExport": "Export", + "settingsViewerUseCutout": "Utilizarea zonei de decupare", + "settingsWidgetDisplayedItem": "Element afișat", + "appExportSettings": "Setări", + "settingsThumbnailShowLocationIcon": "Afișare pictogramă locație", + "albumEmpty": "Fără albume", + "appExportCovers": "Coperți", + "settingsNavigationDrawerTabAlbums": "Albume", + "settingsSubtitleThemeTextPositionDialogTitle": "Poziția textului", + "settingsCoordinateFormatDialogTitle": "Formatul coordonatelor", + "mapZoomOutTooltip": "Micșorare", + "viewerInfoSearchSuggestionDate": "Data și ora", + "collectionEmptyGrantAccessButtonLabel": "Acordare acces", + "settingsHomeDialogTitle": "Acasă", + "settingsVideoControlsPageTitle": "Controale", + "settingsSubtitleThemeTextAlignmentCenter": "Centru", + "viewerInfoPageTitle": "Informații", + "viewerInfoLabelDate": "Dată", + "drawerSettingsButton": "Setări", + "drawerCollectionMotionPhotos": "Fotografii în mișcare", + "sortByName": "După nume", + "createAlbumButtonLabel": "CREARE", + "searchRecentSectionTitle": "Recente", + "settingsSearchFieldLabel": "Căutare setări", + "settingsActionImport": "Import", + "settingsHomeTile": "Acasă", + "viewerErrorDoesNotExist": "Fișierul nu mai există.", + "viewerInfoUnknown": "necunoscut", + "viewerInfoLabelResolution": "Rezoluție", + "viewerInfoLabelAddress": "Adresă", + "viewerInfoViewXmlLinkText": "Vizualizare XML", + "viewerInfoSearchSuggestionDescription": "Descriere", + "drawerCollectionAll": "Toată colecția", + "drawerCollectionImages": "Imagini", + "drawerCollectionSphericalVideos": "Videoclipuri 360°", + "drawerAlbumPage": "Albume", + "sortByAlbumFileName": "După album și numele elementului", + "sortOrderZtoA": "De la Z la A", + "sortOrderHighestFirst": "Cele mai înalte întâi", + "albumGroupTier": "După nivel", + "albumPickPageTitlePick": "Alegeți albumul", + "albumCamera": "Cameră", + "searchRatingSectionTitle": "Evaluări", + "settingsNavigationSectionTitle": "Navigare", + "settingsKeepScreenOnTile": "Se păstrează ecranul pornit", + "settingsThumbnailShowTagIcon": "Afișare pictogramă etichetă", + "settingsThumbnailShowRating": "Afișare evaluare", + "settingsSlideshowTransitionTile": "Tranziție", + "settingsVideoSectionTitle": "Video", + "settingsSubtitleThemeBackgroundOpacity": "Opacitatea fundalului", + "settingsSubtitleThemeTextAlignmentLeft": "Stânga", + "settingsVideoControlsTile": "Controale", + "settingsVideoButtonsTile": "Butoane", + "settingsAllowErrorReporting": "Permiteți raportarea anonimă a erorilor", + "settingsSaveSearchHistory": "Salvare istoric căutări", + "settingsCoordinateFormatTile": "Formatul coordonatelor", + "settingsUnitSystemTile": "Unități", + "settingsUnitSystemDialogTitle": "Unități", + "statsTopPlacesSectionTitle": "Locuri de top", + "viewerErrorUnknown": "Hopa!", + "viewerInfoLabelPath": "Cale", + "viewerInfoLabelCoordinates": "Coordonate", + "mapStyleDialogTitle": "Stil hartă", + "viewerInfoOpenEmbeddedFailureFeedback": "Nu s-a reușit extragerea datelor încorporate", + "viewerInfoSearchFieldLabel": "Căutare metadate", + "viewerInfoSearchEmpty": "Nu există chei potrivite", + "settingsVideoShowVideos": "Afișare videoclipuri", + "albumPageTitle": "Albume", + "settingsKeepScreenOnDialogTitle": "Se păstrează ecranul pornit", + "viewerInfoSearchSuggestionRights": "Drepturi", + "sortByDate": "După dată", + "sortOrderAtoZ": "De la A la Z", + "albumDownload": "Descărcări", + "appExportFavourites": "Favorite", + "settingsConfirmationTile": "Dialogurile de confirmare", + "settingsConfirmationDialogTitle": "Dialoguri de confirmare", + "settingsNavigationDrawerTile": "Meniu de navigare", + "settingsNavigationDrawerBanner": "Atingeți și țineți apăsat pentru a muta și a reordona elementele de meniu.", + "settingsThumbnailSectionTitle": "Miniaturi", + "settingsThumbnailShowMotionPhotoIcon": "Afișare pictogramă fotografie în mișcare", + "settingsThumbnailShowRawIcon": "Afișare pictogramă Raw", + "settingsVideoEnableHardwareAcceleration": "Accelerare hardware", + "settingsVideoGestureDoubleTapTogglePlay": "Atingeți de două ori pentru a reda/întrerupe", + "settingsAllowInstalledAppAccess": "Permiteți accesul la inventarul aplicațiilor", + "settingsAllowInstalledAppAccessSubtitle": "Folosit pentru a îmbunătăți afișarea albumelor", + "viewerInfoLabelOwner": "Proprietar", + "mapStyleTooltip": "Selectați stilul hărții", + "tagEditorSectionPlaceholders": "Substituenți", + "newFilterBanner": "nou", + "searchCollectionFieldHint": "Căutare colecție", + "settingsDoubleBackExit": "Atingeți „înapoi” de două ori pentru a ieși", + "settingsSlideshowVideoPlaybackTile": "Redare video", + "drawerCollectionRaws": "Fotografii Raw", + "searchMetadataSectionTitle": "Metadate", + "viewerInfoLabelTitle": "Titlu", + "settingsSearchEmpty": "Nicio setare potrivită", + "settingsNavigationDrawerTabTypes": "Tipuri", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Butoane afișate", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Butoane disponibile", + "settingsViewerShowOverlayOnOpening": "Afișare la deschidere", + "settingsViewerShowInformation": "Afișare informații", + "settingsViewerShowShootingDetails": "Afișare detalii de fotografiere", + "settingsViewerEnableOverlayBlurEffect": "Efect de estompare", + "settingsViewerSlideshowTile": "Prezentare diapozitive", + "settingsSlideshowRepeat": "Repetare", + "settingsSlideshowFillScreen": "Se umple ecranul", + "settingsHiddenFiltersBanner": "Fotografiile și videoclipurile care corespund filtrelor ascunse nu vor apărea în colecție.", + "settingsStorageAccessTile": "Acces la stocare", + "settingsStorageAccessEmpty": "Fără acordări de acces", + "settingsStorageAccessRevokeTooltip": "Revocare", + "settingsRemoveAnimationsDialogTitle": "Eliminați animațiile", + "settingsThemeEnableDynamicColor": "Culoare dinamică", + "settingsLanguageSectionTitle": "Limbă și formate", + "panoramaDisableSensorControl": "Dezactivați controlul tactil", + "widgetDisplayedItemMostRecent": "Cele mai recente", + "widgetDisplayedItemRandom": "Aleatoriu", + "collectionEmptyFavourites": "Fără favorite", + "collectionSelectSectionTooltip": "Selectați secțiunea", + "collectionMoveSuccessFeedback": "{count, plural, =1{S-a mutat 1 articol} other{S-au mutat {count} articole}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyVideos": "Fără videoclipuri", + "drawerCollectionVideos": "Videoclipuri", + "albumPickPageTitleCopy": "Copiere în album", + "settingsThumbnailShowVideoDuration": "Afișare durată videoclip", + "collectionRenameSuccessFeedback": "{count, plural, =1{Sa renumit 1 articol} other{S-au renumit {count} articole}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{S-a editat 1 articol} other{S-au editat {count} articole}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyImages": "Fără imagini", + "collectionDeselectSectionTooltip": "Deselectați secțiunea", + "drawerCollectionFavourites": "Favorite", + "drawerTagPage": "Etichete", + "sortOrderNewestFirst": "Cele mai noi mai întâi", + "drawerCollectionPanoramas": "Panorame", + "drawerCountryPage": "Țări", + "albumGroupVolume": "După volumul de stocare", + "countryPageTitle": "Țări", + "binPageTitle": "Coș de reciclare", + "settingsPageTitle": "Setări", + "sortBySize": "După dimensiune", + "tagPageTitle": "Etichete", + "settingsConfirmationBeforeMoveToBinItems": "Întreabă înainte de a muta obiecte în coșul de reciclare", + "settingsConfirmationBeforeDeleteItems": "Întreabă înainte de a șterge articole pentru totdeauna", + "settingsConfirmationBeforeMoveUndatedItems": "Întreabă înainte de a muta articole fără dată", + "settingsConfirmationAfterMoveToBinItems": "Afișare mesaj după mutarea elementelor în coșul de reciclare", + "settingsNavigationDrawerEditorPageTitle": "Meniu de navigare", + "settingsNavigationDrawerAddAlbum": "Adăugare album", + "settingsThumbnailShowFavouriteIcon": "Afișare pictogramă favorite", + "settingsNavigationDrawerTabPages": "Pagini", + "settingsViewerQuickActionsTile": "Acțiuni rapide", + "settingsViewerOverlayTile": "Suprapunere", + "settingsViewerShowMinimap": "Afișare mini-hartă", + "settingsViewerShowInformationSubtitle": "Afișare titlu, dată, locație etc.", + "settingsCollectionBrowsingQuickActionEditorBanner": "Atingeți și mențineți apăsat pentru a muta butoanele și a selecta acțiunile care sunt afișate atunci când navigați prin elemente.", + "settingsViewerGestureSideTapNext": "Atingeți marginile ecranului pentru a afișa elementul anterior/următor", + "settingsCollectionSelectionQuickActionEditorBanner": "Atingeți și țineți apăsat pentru a muta butoanele și a selecta acțiunile care sunt afișate la selectarea elementelor.", + "settingsViewerMaximumBrightness": "Luminozitate maximă", + "settingsViewerOverlayPageTitle": "Suprapunere", + "settingsViewerShowOverlayThumbnails": "Afișare miniaturi", + "settingsViewerSlideshowPageTitle": "Prezentare diapozitive", + "settingsSlideshowAnimatedZoomEffect": "Efect de zoom animat", + "settingsSlideshowShuffle": "Amestecare", + "settingsEnableBin": "Utilizare coș de reciclare", + "settingsStorageAccessPageTitle": "Acces la stocare", + "settingsVideoGestureSideDoubleTapSeek": "Atingeți de două ori marginile ecranului pentru a trece înapoi/înainte", + "settingsHiddenFiltersEmpty": "Fără filtre ascunse", + "settingsStorageAccessBanner": "Unele directoare necesită o acordare de acces explicită pentru a modifica fișierele din ele. Puteți consulta aici directoarele la care anterior ați dat acces.", + "settingsAccessibilitySectionTitle": "Accesibilitate", + "settingsRemoveAnimationsTile": "Eliminați animațiile", + "settingsDisplayRefreshRateModeTile": "Rata de reîmprospătare a ecranului", + "settingsLanguagePageTitle": "Limbă", + "statsTopAlbumsSectionTitle": "Albume de top", + "settingsDisplayRefreshRateModeDialogTitle": "Rată de reîmprospătare", + "settingsLanguageTile": "Limbă", + "statsWithGps": "{count, plural, =1{1 articol cu locație} other{{count} articole cu locație}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsScreenSaverPageTitle": "Economizor de ecran", + "settingsWidgetPageTitle": "Ramă foto", + "mapAttributionStamen": "Plăci de la [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "mapAttributionOsmHot": "Plăci de la [HOT](https://www.hotosm.org/) • Găzduit de [OSM France](https://openstreetmap.fr/)", + "tagEditorPageAddTagTooltip": "Adăugare etichetă", + "tagEditorPageNewTagFieldLabel": "Etichetă nouă", + "tagEditorSectionRecent": "Recente", + "sourceViewerPageTitle": "Sursă", + "clearTooltip": "Golire", + "collectionRenameFailureFeedback": "{count, plural, =1{A eșuat redenumirea unui element} other{A eșuat redenumirea a {count} elemente}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{A eșuat editarea unui element} other{A eșuat editarea a {count} elemente}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{A eșuat exportarea unei pagini} other{A eșuat exportarea a {count} pagini}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, =1{S-a copiat 1 articol} other{S-au copiat {count} articole}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sortOrderLargestFirst": "Cele mai mari întâi", + "sortOrderSmallestFirst": "Cele mai mici întâi", + "settingsSystemDefault": "Implicit sistem", + "settingsCollectionQuickActionEditorPageTitle": "Acțiuni rapide", + "settingsCollectionQuickActionTabBrowsing": "Navigare", + "settingsCollectionQuickActionTabSelecting": "Selectare", + "settingsCollectionQuickActionsTile": "Acțiuni rapide", + "settingsViewerQuickActionEditorPageTitle": "Acțiuni rapide", + "settingsViewerQuickActionEditorBanner": "Atingeți și țineți apăsat pentru a muta butoanele și a selecta acțiunile care sunt afișate în vizualizator.", + "settingsViewerQuickActionEmpty": "Fără butoane", + "settingsSlideshowVideoPlaybackDialogTitle": "Redare video", + "settingsVideoPageTitle": "Setări video", + "settingsVideoLoopModeTile": "Modul buclă", + "settingsVideoLoopModeDialogTitle": "Mod buclă", + "settingsSubtitleThemeTile": "Subtitrări", + "settingsSubtitleThemePageTitle": "Subtitrări", + "settingsSubtitleThemeTextAlignmentTile": "Alinierea textului", + "settingsSubtitleThemeSample": "Acesta este un exemplu.", + "settingsSubtitleThemeTextAlignmentDialogTitle": "Alinierea textului", + "settingsSubtitleThemeTextSize": "Dimensiunea textului", + "settingsSubtitleThemeShowOutline": "Afișarea conturului și a umbrei", + "settingsSubtitleThemeTextColor": "Culoarea textului", + "settingsSubtitleThemeTextOpacity": "Opacitatea textului", + "settingsSubtitleThemeBackgroundColor": "Culoarea de fundal", + "settingsVideoAutoPlay": "Redare automată", + "settingsHiddenItemsPageTitle": "Articole ascunse", + "settingsTimeToTakeActionTile": "Timpul pentru acțiune", + "settingsDisplaySectionTitle": "Afișare", + "settingsThemeBrightnessTile": "Temă", + "settingsThemeBrightnessDialogTitle": "Temă", + "settingsThemeColorHighlights": "Evidențieri de culoare", + "wallpaperUseScrollEffect": "Utilizați efectul de derulare pe ecranul de pornire", + "tagEditorPageTitle": "Editare etichete", + "tagPlaceholderCountry": "Țară", + "tagPlaceholderPlace": "Loc", + "panoramaEnableSensorControl": "Activați controlul tactil", + "entryInfoActionExportMetadata": "Exportare metadate", + "searchDateSectionTitle": "Dată", + "searchAlbumsSectionTitle": "Albume", + "searchCountriesSectionTitle": "Țări", + "searchPlacesSectionTitle": "Locuri", + "settingsEnableBinSubtitle": "Se păstrează elementele șterse timp de 30 de zile", + "settingsAllowMediaManagement": "Permiteți gestionarea media", + "settingsHiddenItemsTile": "Articole ascunse", + "settingsWidgetOpenPage": "Când atingeți widget-ul", + "settingsCollectionTile": "Colecție", + "statsPageTitle": "Statistici", + "statsTopCountriesSectionTitle": "Țări de top", + "settingsAccessibilityShowPinchGestureAlternatives": "Afișare alternative de gesturi atingeri-multiple", + "columnCount": "{count, plural, =1{{count} coloană} other{{count} coloane}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "entryActionShareImageOnly": "Distribuie doar imaginea", + "entryActionShareVideoOnly": "Distribuie numai videoclipul", + "keepScreenOnVideoPlayback": "În timpul redării video", + "settingsViewerShowRatingTags": "Afișare evaluare și etichete", + "filterAspectRatioLandscapeLabel": "Peisaj", + "filterAspectRatioPortraitLabel": "Portret", + "filterNoAddressLabel": "Nicio adresă", + "entryInfoActionRemoveLocation": "Eliminare locație", + "settingsViewerShowDescription": "Afișare descriere", + "filterLocatedLabel": "Locație", + "filterTaggedLabel": "Etichetat", + "settingsModificationWarningDialogMessage": "Alte setări vor fi modificate.", + "settingsDisplayUseTvInterface": "Interfață Android TV", + "tooManyItemsErrorDialogMessage": "Încearcă din nou cu mai puține elemente.", + "settingsVideoGestureVerticalDragBrightnessVolume": "Glisați în sus sau în jos pentru a regla luminozitatea/volumul", + "chipActionLock": "Blocare", + "chipActionCreateVault": "Creare seif", + "chipActionConfigureVault": "Configurare seif", + "albumTierVaults": "Seifuri", + "newVaultDialogTitle": "Seif nou", + "configureVaultDialogTitle": "Configurare seif", + "vaultDialogLockModeWhenScreenOff": "Blocare atunci când ecranul se oprește", + "vaultDialogLockTypeLabel": "Tip de blocare", + "pinDialogConfirm": "Confirmă codul PIN", + "pinDialogEnter": "Introdu codul PIN", + "passwordDialogEnter": "Introdu parola", + "passwordDialogConfirm": "Confirmă parola", + "authenticateToConfigureVault": "Autentifică-te pentru a configura seiful", + "authenticateToUnlockVault": "Autentifică-te pentru a debloca seiful", + "vaultBinUsageDialogMessage": "Unele seifuri folosesc coșul de reciclare.", + "settingsDisablingBinWarningDialogMessage": "Articolele din coșul de reciclare vor fi șterse pentru totdeauna.", + "vaultLockTypePin": "Pin", + "vaultLockTypePassword": "Parolă", + "newVaultWarningDialogMessage": "Elementele din seifuri sunt disponibile doar pentru această aplicație și nu pentru altele.\n\nDacă dezinstalezi această aplicație sau ștergi datele acestei aplicații, vei pierde toate aceste elemente.", + "settingsConfirmationVaultDataLoss": "Afișare avertisment privind pierderile de date din seif", + "settingsVideoBackgroundModeDialogTitle": "Mod fundal", + "lengthUnitPixel": "px", + "exportEntryDialogWriteMetadata": "Scrierea metadatelor", + "drawerPlacePage": "Locații", + "placePageTitle": "Locații", + "lengthUnitPercent": "%", + "settingsVideoBackgroundMode": "Mod fundal", + "patternDialogEnter": "Introdu modelul", + "patternDialogConfirm": "Confirmă modelul", + "placeEmpty": "Nu există locații", + "settingsVideoEnablePip": "Imagine în imagine", + "vaultLockTypePattern": "Model", + "chipActionGoToPlacePage": "Arată în Locuri", + "settingsCollectionBurstPatternsNone": "Niciunul", + "settingsCollectionBurstPatternsTile": "Modele de rafale", + "tagPlaceholderState": "Stat", + "chipActionShowCountryStates": "Afișare state", + "viewerActionLock": "Blocarea vizualizatorului", + "viewerActionUnlock": "Deblocare vizualizator", + "statePageTitle": "State", + "stateEmpty": "Nu există state", + "searchStatesSectionTitle": "State", + "statsTopStatesSectionTitle": "Statele de top", + "overlayHistogramNone": "Nimic", + "overlayHistogramLuminance": "Luminanță", + "saveCopyButtonLabel": "SALVEAZĂ COPIA", + "applyTooltip": "Aplică", + "editorTransformCrop": "Decupare", + "cropAspectRatioFree": "Liber", + "cropAspectRatioOriginal": "Original", + "settingsVideoPlaybackPageTitle": "Redare", + "settingsAskEverytime": "Întreabă de fiecare dată", + "aboutDataUsageCache": "Cache", + "aboutDataUsageDatabase": "Bază de date", + "aboutDataUsageMisc": "Diverse", + "settingsVideoPlaybackTile": "Redare", + "overlayHistogramRGB": "RGB", + "widgetTapUpdateWidget": "Actualizare widget", + "exportEntryDialogQuality": "Calitate", + "aboutDataUsageSectionTitle": "Utilizare date", + "aboutDataUsageData": "Date", + "aboutDataUsageInternal": "Intern", + "aboutDataUsageExternal": "Extern", + "collectionActionSetHome": "Setare ca principal", + "aboutDataUsageClearCache": "Golește memoria cache", + "settingsThumbnailShowHdrIcon": "Afișare pictogramă HDR", + "settingsViewerShowHistogram": "Afișare histogramă", + "settingsVideoResumptionModeTile": "Reluare redare", + "entryActionCast": "Proiectare", + "settingsVideoResumptionModeDialogTitle": "Reluare redare", + "editorActionTransform": "Transformă", + "tagEditorDiscardDialogMessage": "Dorești să renunți la modificări?", + "editorTransformRotate": "Rotire", + "cropAspectRatioSquare": "Pătrat", + "videoResumptionModeNever": "Niciodată", + "videoResumptionModeAlways": "Mereu", + "castDialogTitle": "Dispozitive de proiectare", + "maxBrightnessNever": "Niciodată", + "maxBrightnessAlways": "Mereu", + "renameProcessorHash": "Hash", + "settingsForceWesternArabicNumeralsTile": "Cifre arabe forțat", + "stopTooltip": "Oprește", + "videoActionABRepeat": "Repetă de la A la B", + "videoRepeatActionSetStart": "Setează începutul", + "videoRepeatActionSetEnd": "Setează sfârșitul", + "chipActionShowCollection": "Afișați în colecție", + "sortByDuration": "După durată", + "setHomeCustom": "Personalizat", + "sortOrderShortestFirst": "Cel mai scurt mai întâi", + "sortOrderLongestFirst": "Cel mai lung mai întâi", + "explorerActionSelectStorageVolume": "Selectează spațiu de stocare", + "selectStorageVolumeDialogTitle": "Selectează spațiu de stocare", + "chipActionGoToExplorerPage": "Afișare în Explorer", + "explorerPageTitle": "Explorer", + "mapAttributionOsmData": "Datele hărții © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributori", + "editEntryLocationDialogImportGpx": "Import GPX", + "videoActionShowPreviousFrame": "Afișează cadrul anterior", + "videoActionShowNextFrame": "Afișează următorul cadru", + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Plăci de la [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "chipActionDecompose": "Divizare", + "newDynamicAlbumDialogTitle": "Nou album dinamic", + "dynamicAlbumAlreadyExists": "Albumul dinamic există deja", + "collectionActionAddDynamicAlbum": "Adaugă album dinamic", + "appExportDynamicAlbums": "Albume dinamice", + "chipActionRemove": "Elimină", + "albumTierDynamic": "Dinamic", + "newAlbumDialogAlbumAlreadyExistsHelper": "Albumul există deja", + "mapAttributionOsmLiberty": "Plăci de la [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Găzduit de [OSM Americana](https://tile.ourmap.us)", + "mapStyleOpenTopoMap": "OpenTopoMap", + "editEntryLocationDialogTimeShift": "Schimb de timp", + "coordinateFormatDdm": "DDM", + "mapStyleOsmLiberty": "OSM Liberty", + "removeEntryMetadataDialogAll": "Toate", + "sortByPath": "După cale", + "searchFormatSectionTitle": "Formate", + "createButtonLabel": "CREARE", + "chipActionCreateGroup": "Creați un grup", + "newGroupDialogTitle": "Grup nou", + "newGroupDialogNameLabel": "Nume grup", + "groupAlreadyExists": "Grupul deja există", + "chipActionGroup": "Schimbare grupare", + "albumTierGroups": "Grupe", + "groupPickerTitle": "Alege un grup", + "groupPickerUseThisGroupButton": "Folosește acest grup", + "sectionNone": "Nicio secțiune", + "ungrouped": "Fără grup", + "groupEmpty": "Niciun grup", + "tagPickPageTitle": "Alege eticheta", + "settingsNavigationBottomActionsTile": "Navigare jos", + "settingsNavigationBottomActionEditorPageTitle": "Navigare Jos", + "settingsNavigationBottomActionEditorBanner": "Atinge și menține apăsat pentru a muta butoanele și a selecta ce acțiuni sunt afișate în bara de navigare de jos.", + "mapStyleDialogAddStyle": "Adaugă stil", + "mapStyleEditorDialogName": "Nume", + "mapStyleEditorDialogUrl": "URL", + "mapStyleEditorDialogSubdomains": "Subdomenii", + "settingsEnabled": "Activat", + "settingsForced": "Forțat", + "settingsViewerShowZoomLevel": "Arată nivelul de proximitate" +} diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb new file mode 100644 index 0000000..a643723 --- /dev/null +++ b/lib/l10n/app_ru.arb @@ -0,0 +1,733 @@ +{ + "appName": "Aves", + "welcomeMessage": "Добро пожаловать в Aves", + "welcomeOptional": "Опционально", + "welcomeTermsToggle": "Я согласен с условиями и положениями", + "itemCount": "{count, plural, =1{{count} объект} few{{count} объекта} other{{count} объектов}}", + "timeSeconds": "{count, plural, =1{{count} секунда} few{{count} секунды} other{{count} секунд}}", + "timeMinutes": "{count, plural, =1{{count} минута} few{{count} минуты} other{{count} минут}}", + "timeDays": "{count, plural, =1{{count} день} few{{count} дня} other{{count} дней}}", + "focalLength": "{length} mm", + "applyButtonLabel": "ПРИМЕНИТЬ", + "deleteButtonLabel": "УДАЛИТЬ", + "nextButtonLabel": "ДАЛЕЕ", + "showButtonLabel": "ПОКАЗАТЬ", + "hideButtonLabel": "СКРЫТЬ", + "continueButtonLabel": "ПРОДОЛЖИТЬ", + "cancelTooltip": "Отмена", + "changeTooltip": "Изменить", + "clearTooltip": "Очистить", + "previousTooltip": "Предыдущий", + "nextTooltip": "Следующий", + "showTooltip": "Показать", + "hideTooltip": "Скрыть", + "actionRemove": "Удалить", + "resetTooltip": "Сбросить", + "saveTooltip": "Сохранить", + "pickTooltip": "Выбрать", + "doubleBackExitMessage": "Нажмите «Назад» еще раз, чтобы выйти.", + "doNotAskAgain": "Больше не спрашивать", + "sourceStateLoading": "Загрузка", + "sourceStateCataloguing": "Каталогизация", + "sourceStateLocatingCountries": "Расположение стран", + "sourceStateLocatingPlaces": "Расположение локаций", + "chipActionDelete": "Удалить", + "chipActionGoToAlbumPage": "Показать в Альбомах", + "chipActionGoToCountryPage": "Показать в Странах", + "chipActionGoToTagPage": "Показать в тегах", + "chipActionFilterOut": "Исключить", + "chipActionFilterIn": "Включить", + "chipActionHide": "Скрыть", + "chipActionPin": "Закрепить", + "chipActionUnpin": "Открепить", + "chipActionRename": "Переименовать", + "chipActionSetCover": "Установить обложку", + "chipActionCreateAlbum": "Создать альбом", + "entryActionCopyToClipboard": "Скопировать в буфер обмена", + "entryActionDelete": "Удалить", + "entryActionConvert": "Конвертировать", + "entryActionExport": "Экспорт", + "entryActionInfo": "Информация", + "entryActionRename": "Переименовать", + "entryActionRestore": "Восстановить", + "entryActionRotateCCW": "Повернуть против часовой стрелки", + "entryActionRotateCW": "Повернуть по часовой стрелки", + "entryActionFlip": "Отразить по горизонтали", + "entryActionPrint": "Печать", + "entryActionShare": "Поделиться", + "entryActionViewSource": "Посмотреть источник", + "entryActionShowGeoTiffOnMap": "Показать на карте", + "entryActionConvertMotionPhotoToStillImage": "Конвертировать в статичное изображение", + "entryActionViewMotionPhotoVideo": "Открыть видео", + "entryActionEdit": "Изменить", + "entryActionOpen": "Открыть с помощью", + "entryActionSetAs": "Установить как", + "entryActionOpenMap": "Показать на карте", + "entryActionRotateScreen": "Повернуть экран", + "entryActionAddFavourite": "Добавить в избранное", + "entryActionRemoveFavourite": "Удалить из избранного", + "videoActionCaptureFrame": "Сохранить кадр", + "videoActionMute": "Выключить звук", + "videoActionUnmute": "Включить звук", + "videoActionPause": "Стоп", + "videoActionPlay": "Играть", + "videoActionReplay10": "Перемотка на 10 секунд назад", + "videoActionSkip10": "Перемотка на 10 секунд вперёд", + "videoActionSelectStreams": "Выбрать дорожку", + "videoActionSetSpeed": "Скорость воспроизведения", + "viewerActionSettings": "Настройки", + "slideshowActionResume": "Продолжить", + "slideshowActionShowInCollection": "Показать в Коллекции", + "entryInfoActionEditDate": "Изменить дату и время", + "entryInfoActionEditLocation": "Изменить местоположение", + "entryInfoActionEditTitleDescription": "Изменить название и описание", + "entryInfoActionEditRating": "Изменить рейтинг", + "entryInfoActionEditTags": "Изменить теги", + "entryInfoActionRemoveMetadata": "Удалить метаданные", + "filterBinLabel": "Корзина", + "filterFavouriteLabel": "Избранное", + "filterNoDateLabel": "Без даты", + "filterNoLocationLabel": "Без местоположения", + "filterNoRatingLabel": "Без рейтинга", + "filterNoTagLabel": "Без тегов", + "filterNoTitleLabel": "Без названия", + "filterOnThisDayLabel": "В этот день", + "filterRecentlyAddedLabel": "Недавно добавленные", + "filterRatingRejectedLabel": "Отклонённое", + "filterTypeAnimatedLabel": "GIF", + "filterTypeMotionPhotoLabel": "Живое фото", + "filterTypePanoramaLabel": "Панорама", + "filterTypeRawLabel": "RAW", + "filterTypeSphericalVideoLabel": "360° видео", + "filterTypeGeotiffLabel": "GeoTIFF", + "filterMimeImageLabel": "Изображение", + "filterMimeVideoLabel": "Видео", + "coordinateFormatDms": "Градусы, минуты и секунды", + "coordinateFormatDecimal": "Десятичные градусы", + "coordinateDms": "{coordinate} {direction}", + "coordinateDmsNorth": "с. ш.", + "coordinateDmsSouth": "ю. ш.", + "coordinateDmsEast": "в. д.", + "coordinateDmsWest": "з. д.", + "unitSystemMetric": "Метрические", + "unitSystemImperial": "Имперские", + "videoLoopModeNever": "Никогда", + "videoLoopModeShortOnly": "Только для коротких видео", + "videoLoopModeAlways": "Всегда", + "videoControlsPlayOutside": "Открыть в другом видеоплеере", + "mapStyleGoogleNormal": "Google Карты", + "mapStyleGoogleHybrid": "Google Карты (Гибридный)", + "mapStyleGoogleTerrain": "Google Карты (Местность)", + "mapStyleOsmHot": "Humanitarian OSM", + "mapStyleStamenWatercolor": "Stamen Акварель", + "nameConflictStrategyRename": "Переименовать", + "nameConflictStrategyReplace": "Заменить", + "nameConflictStrategySkip": "Пропустить", + "keepScreenOnNever": "Никогда", + "keepScreenOnViewerOnly": "Только в просмотрщике", + "keepScreenOnAlways": "Всегда", + "accessibilityAnimationsRemove": "Предотвратить экранные эффекты", + "accessibilityAnimationsKeep": "Сохранить экранные эффекты", + "displayRefreshRatePreferHighest": "Наивысшая частота", + "displayRefreshRatePreferLowest": "Наименьшая частота", + "videoPlaybackSkip": "Пропустить", + "videoPlaybackMuted": "Играть без звука", + "videoPlaybackWithSound": "Играть со звуком", + "themeBrightnessLight": "Светлая", + "themeBrightnessDark": "Тёмная", + "themeBrightnessBlack": "Чёрная", + "viewerTransitionSlide": "Скольжение", + "viewerTransitionParallax": "Параллакс", + "viewerTransitionFade": "Затухание", + "viewerTransitionZoomIn": "Приближение", + "viewerTransitionNone": "Нет", + "wallpaperTargetHome": "Домашний экран", + "wallpaperTargetLock": "Экран блокировки", + "wallpaperTargetHomeLock": "Домашний экран и экран блокировки", + "widgetOpenPageHome": "Открыть главную страницу", + "widgetOpenPageViewer": "Просмотр текущего", + "albumTierNew": "Новые", + "albumTierPinned": "Закрепленные", + "albumTierSpecial": "Стандартные", + "albumTierApps": "Приложения", + "albumTierRegular": "Другие", + "storageVolumeDescriptionFallbackPrimary": "Внутренняя память", + "storageVolumeDescriptionFallbackNonPrimary": "SD-карта", + "rootDirectoryDescription": "корневой каталог", + "otherDirectoryDescription": "каталог «{name}»", + "storageAccessDialogMessage": "Пожалуйста, выберите {directory} на накопителе «{volume}» на следующем экране, чтобы предоставить этому приложению доступ к нему.", + "restrictedAccessDialogMessage": "Этому приложению не разрешается изменять файлы в каталоге {directory} накопителя «{volume}».\n\nПожалуйста, используйте предустановленный файловый менеджер или галерею, чтобы переместить объекты в другой каталог.", + "notEnoughSpaceDialogMessage": "Для завершения этой операции требуется {neededSize} свободного места на «{volume}», но осталось только {freeSize}.", + "missingSystemFilePickerDialogMessage": "Системное приложение выбора файлов отсутствует или отключено. Пожалуйста, включите его и повторите попытку.", + "unsupportedTypeDialogMessage": "{count, plural, =1{Эта операция не поддерживается для объектов следующего формата: {types}.} other{Эта операция не поддерживается для объектов следующих форматов: {types}.}}", + "nameConflictDialogSingleSourceMessage": "Некоторые файлы в папке назначения имеют одно и то же имя.", + "nameConflictDialogMultipleSourceMessage": "Некоторые файлы имеют одно и то же имя.", + "addShortcutDialogLabel": "Название ярлыка", + "addShortcutButtonLabel": "СОЗДАТЬ", + "noMatchingAppDialogMessage": "Нет приложений, которые могли бы с этим справиться.", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Переместить этот объект в корзину?} few{Переместить эти {count} объекта в корзину?} other{Переместить эти {count} объектов в корзину?}}", + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Вы уверены, что хотите удалить этот объект?} few{Вы уверены, что хотите удалить эти {count} объекта?} other{Вы уверены, что хотите удалить эти {count} объектов?}}", + "moveUndatedConfirmationDialogMessage": "Сохранить даты элементов, прежде чем продолжить?", + "moveUndatedConfirmationDialogSetDate": "Установить дату", + "videoResumeDialogMessage": "Хотите ли вы возобновить воспроизведение на {time}?", + "videoStartOverButtonLabel": "ВОСПРОИЗВЕСТИ СНАЧАЛА", + "videoResumeButtonLabel": "ПРОДОЛЖИТЬ", + "setCoverDialogLatest": "Последний объект", + "setCoverDialogAuto": "Авто", + "setCoverDialogCustom": "Собственная", + "hideFilterConfirmationDialogMessage": "Соответствующие фотографии и видео будут скрыты из вашей коллекции. Вы можете показать их снова в настройках в разделе «Конфиденциальность».\n\nВы уверены, что хотите их скрыть?", + "newAlbumDialogTitle": "Новый альбом", + "newAlbumDialogNameLabel": "Название альбома", + "newAlbumDialogNameLabelAlreadyExistsHelper": "Каталог уже существует", + "newAlbumDialogStorageLabel": "Накопитель:", + "renameAlbumDialogLabel": "Новое название", + "renameAlbumDialogLabelAlreadyExistsHelper": "Каталог уже существует", + "renameEntrySetPageTitle": "Переименовать", + "renameEntrySetPagePatternFieldLabel": "Образец наименования", + "renameEntrySetPageInsertTooltip": "Вставить поле", + "renameEntrySetPagePreviewSectionTitle": "Предпросмотр", + "renameProcessorCounter": "Счётчик", + "renameProcessorName": "Название", + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Удалить этот альбом и элемент в нем?} other{Удалить этот альбом и {count} элементов в нем?}}", + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Удалить эти альбомы и элемент в них?} other{Удалить эти альбомы и {count} элементов в них?}}", + "exportEntryDialogFormat": "Формат:", + "exportEntryDialogWidth": "Ширина", + "exportEntryDialogHeight": "Высота", + "renameEntryDialogLabel": "Новое название", + "editEntryDialogTargetFieldsHeader": "Поля для изменения", + "editEntryDateDialogTitle": "Дата и время", + "editEntryDateDialogSetCustom": "Установить дату", + "editEntryDateDialogCopyField": "Копировать с другой даты", + "editEntryDialogCopyFromItem": "Скопировать из другого объекта", + "editEntryDateDialogExtractFromTitle": "Извлечь из названия", + "editEntryDateDialogShift": "Сдвиг", + "editEntryDateDialogSourceFileModifiedDate": "Дата изменения файла", + "durationDialogHours": "Часов", + "durationDialogMinutes": "Минут", + "editEntryLocationDialogTitle": "Местоположение", + "editEntryLocationDialogChooseOnMap": "Выбрать на карте", + "editEntryLocationDialogLatitude": "Широта", + "editEntryLocationDialogLongitude": "Долгота", + "locationPickerUseThisLocationButton": "Использовать это местоположение", + "editEntryRatingDialogTitle": "Рейтинг", + "removeEntryMetadataDialogTitle": "Удаление метаданных", + "removeEntryMetadataDialogMore": "Дополнительно", + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Для воспроизведения видео внутри этой живой фотографии требуется XMP профиль.\n\nВы уверены, что хотите удалить его?", + "genericDangerWarningDialogMessage": "Вы уверены?", + "videoSpeedDialogLabel": "Скорость воспроизведения", + "videoStreamSelectionDialogVideo": "Видео", + "videoStreamSelectionDialogAudio": "Аудио", + "videoStreamSelectionDialogText": "Субтитры", + "videoStreamSelectionDialogOff": "Отключено", + "videoStreamSelectionDialogTrack": "Дорожка", + "videoStreamSelectionDialogNoSelection": "Других дорожек нет.", + "genericSuccessFeedback": "Выполнено!", + "genericFailureFeedback": "Не удалось", + "menuActionConfigureView": "Вид", + "menuActionSelect": "Выбрать", + "menuActionSelectAll": "Выбрать все", + "menuActionSelectNone": "Снять выделение", + "menuActionMap": "Карта", + "menuActionSlideshow": "Слайд-шоу", + "menuActionStats": "Статистика", + "viewDialogSortSectionTitle": "Сортировка", + "viewDialogGroupSectionTitle": "Разделы", + "viewDialogLayoutSectionTitle": "Макет", + "viewDialogReverseSortOrder": "Обратный порядок сортировки", + "tileLayoutMosaic": "Мозайка", + "tileLayoutGrid": "Сетка", + "tileLayoutList": "Список", + "coverDialogTabCover": "Обложка", + "coverDialogTabApp": "Приложение", + "coverDialogTabColor": "Цвет", + "appPickDialogTitle": "Выберите приложение", + "appPickDialogNone": "Ничего", + "aboutPageTitle": "О нас", + "aboutLinkLicense": "Лицензия", + "aboutLinkPolicy": "Политика конфиденциальности", + "aboutBugSectionTitle": "Сообщить об ошибке", + "aboutBugSaveLogInstruction": "Сохраните логи приложения в файл", + "aboutBugCopyInfoInstruction": "Скопируйте системную информацию", + "aboutBugCopyInfoButton": "Скопировать", + "aboutBugReportInstruction": "Отправьте отчёт об ошибке на GitHub вместе с логами и системной информацией", + "aboutBugReportButton": "Отправить", + "aboutCreditsSectionTitle": "Благодарности", + "aboutCreditsWorldAtlas1": "Это приложение использует файл TopoJSON из", + "aboutCreditsWorldAtlas2": "под лицензией ISC.", + "aboutTranslatorsSectionTitle": "Переводчики", + "aboutLicensesSectionTitle": "Лицензии с открытым исходным кодом", + "aboutLicensesBanner": "Это приложение использует следующие пакеты и библиотеки с открытым исходным кодом.", + "aboutLicensesAndroidLibrariesSectionTitle": "Библиотеки Android", + "aboutLicensesFlutterPluginsSectionTitle": "Плагины Flutter", + "aboutLicensesFlutterPackagesSectionTitle": "Пакеты Flutter", + "aboutLicensesDartPackagesSectionTitle": "Пакеты Dart", + "aboutLicensesShowAllButtonLabel": "Показать все лицензии", + "policyPageTitle": "Политика конфиденциальности", + "collectionPageTitle": "Коллекция", + "collectionPickPageTitle": "Выбрать", + "collectionSelectPageTitle": "Выберите объекты", + "collectionActionShowTitleSearch": "Показать фильтр заголовка", + "collectionActionHideTitleSearch": "Скрыть фильтр заголовка", + "collectionActionAddShortcut": "Добавить ярлык", + "collectionActionEmptyBin": "Очистить корзину", + "collectionActionCopy": "Скопировать в альбом", + "collectionActionMove": "Переместить в альбом", + "collectionActionRescan": "Пересканировать", + "collectionActionEdit": "Изменить", + "collectionSearchTitlesHintText": "Поиск заголовков", + "collectionGroupAlbum": "По альбому", + "collectionGroupMonth": "По месяцу", + "collectionGroupDay": "По дню", + "sectionUnknown": "Неизвестно", + "dateToday": "Сегодня", + "dateYesterday": "Вчера", + "dateThisMonth": "В этом месяце", + "collectionDeleteFailureFeedback": "{count, plural, =1{Не удалось удалить 1 объект} few{Не удалось удалить {count} объекта} other{Не удалось удалить {count} объектов}}", + "collectionCopyFailureFeedback": "{count, plural, =1{Не удалось скопировать 1 объект} few{Не удалось скопировать {count} объекта} other{Не удалось скопировать {count} объектов}}", + "collectionMoveFailureFeedback": "{count, plural, =1{Не удалось переместить 1 объект} few{Не удалось переместить {count} объекта} other{Не удалось переместить {count} объектов}}", + "collectionRenameFailureFeedback": "{count, plural, =1{Не удалось переименовать 1 объект} few{Не удалось переименовать {count} объекта} other{Не удалось переименовать {count} объектов}}", + "collectionEditFailureFeedback": "{count, plural, =1{Не удалось изменить 1 объект} few{Не удалось изменить {count} объекта} other{Не удалось изменить {count} объектов}}", + "collectionExportFailureFeedback": "{count, plural, =1{Не удалось экспортировать 1 страницу} few{Не удалось экспортировать {count} страницы} other{Не удалось экспортировать {count} страниц}}", + "collectionCopySuccessFeedback": "{count, plural, =1{Скопирован 1 объект} few{Скопировано {count} объекта} other{Скопировано {count} объектов}}", + "collectionMoveSuccessFeedback": "{count, plural, =1{Перемещён 1 объект} few{Перемещено {count} объекта} other{Перемещено {count} объектов}}", + "collectionRenameSuccessFeedback": "{count, plural, =1{Переименован 1 объект} few{Переименовано {count} объекта} other{Переименовано {count} объектов}}", + "collectionEditSuccessFeedback": "{count, plural, =1{Изменён 1 объект} few{Изменено {count} объекта} other{Изменено {count} объектов}}", + "collectionEmptyFavourites": "Нет избранных", + "collectionEmptyVideos": "Нет видео", + "collectionEmptyImages": "Нет изображений", + "collectionEmptyGrantAccessButtonLabel": "Предоставить доступ", + "collectionSelectSectionTooltip": "Выбрать раздел", + "collectionDeselectSectionTooltip": "Снять выбор с раздела", + "drawerAboutButton": "О нас", + "drawerSettingsButton": "Настройки", + "drawerCollectionAll": "Вся коллекция", + "drawerCollectionFavourites": "Избранное", + "drawerCollectionImages": "Изображения", + "drawerCollectionVideos": "Видео", + "drawerCollectionAnimated": "GIF", + "drawerCollectionMotionPhotos": "Живые фото", + "drawerCollectionPanoramas": "Панорамы", + "drawerCollectionRaws": "RAW", + "drawerCollectionSphericalVideos": "360° видео", + "drawerAlbumPage": "Альбомы", + "drawerCountryPage": "Страны", + "drawerTagPage": "Теги", + "sortByDate": "По дате", + "sortByName": "По названию", + "sortByItemCount": "По количеству объектов", + "sortBySize": "По размеру", + "sortByAlbumFileName": "По названию альбома и пункта", + "sortByRating": "По рейтингу", + "sortOrderNewestFirst": "Сначала новые", + "sortOrderOldestFirst": "Сначала старые", + "sortOrderAtoZ": "От А до Я", + "sortOrderZtoA": "От Я до А", + "sortOrderHighestFirst": "Сначала с высоким", + "sortOrderLowestFirst": "Сначала с низким", + "sortOrderLargestFirst": "Сначала большие", + "sortOrderSmallestFirst": "Сначала маленькие", + "albumGroupTier": "По уровню", + "albumGroupType": "По типу", + "albumGroupVolume": "По накопителю", + "albumMimeTypeMixed": "Разное", + "albumPickPageTitleCopy": "Копировать в альбом", + "albumPickPageTitleExport": "Экспорт в альбом", + "albumPickPageTitleMove": "Переместить в альбом", + "albumPickPageTitlePick": "Выберите альбом", + "albumCamera": "Камера", + "albumDownload": "Загрузки", + "albumScreenshots": "Скриншоты", + "albumScreenRecordings": "Записи экрана", + "albumVideoCaptures": "Видеозаписи", + "albumPageTitle": "Альбомы", + "albumEmpty": "Нет альбомов", + "createAlbumButtonLabel": "СОЗДАТЬ", + "newFilterBanner": "новый", + "countryPageTitle": "Страны", + "countryEmpty": "Нет стран", + "tagPageTitle": "Теги", + "tagEmpty": "Нет тегов", + "binPageTitle": "Корзина", + "searchCollectionFieldHint": "Поиск по коллекции", + "searchRecentSectionTitle": "Недавние", + "searchDateSectionTitle": "Дата", + "searchAlbumsSectionTitle": "Альбомы", + "searchCountriesSectionTitle": "Страны", + "searchPlacesSectionTitle": "Локации", + "searchTagsSectionTitle": "Теги", + "searchRatingSectionTitle": "Рейтинги", + "searchMetadataSectionTitle": "Метаданные", + "settingsPageTitle": "Настройки", + "settingsSystemDefault": "Как в системе", + "settingsDefault": "По умолчанию", + "settingsDisabled": "Выключено", + "settingsSearchFieldLabel": "Поиск настроек", + "settingsSearchEmpty": "Нет соответствующих настроек", + "settingsActionExport": "Экспорт", + "settingsActionExportDialogTitle": "Экспорт", + "settingsActionImport": "Импорт", + "settingsActionImportDialogTitle": "Импорт", + "appExportCovers": "Обложки", + "appExportFavourites": "Избранное", + "appExportSettings": "Настройки", + "settingsNavigationSectionTitle": "Навигация", + "settingsHomeTile": "Домашний каталог", + "settingsHomeDialogTitle": "Домашний каталог", + "settingsKeepScreenOnTile": "Держать экран включенным", + "settingsKeepScreenOnDialogTitle": "Держать экран включенным", + "settingsDoubleBackExit": "Дважды нажмите «Назад», чтобы выйти", + "settingsConfirmationTile": "Диалоги подтверждения", + "settingsConfirmationDialogTitle": "Диалоги подтверждения", + "settingsConfirmationBeforeDeleteItems": "Спросить, прежде чем удалять объекты навсегда", + "settingsConfirmationBeforeMoveToBinItems": "Спросить, прежде чем перемещать объекты в корзину", + "settingsConfirmationBeforeMoveUndatedItems": "Спросить, прежде чем перемещать объекты без даты в метаданных", + "settingsConfirmationAfterMoveToBinItems": "Показывать сообщение после перемещения в корзину", + "settingsNavigationDrawerTile": "Навигационное меню", + "settingsNavigationDrawerEditorPageTitle": "Навигационное меню", + "settingsNavigationDrawerBanner": "Нажмите и удерживайте, чтобы переместить и изменить порядок пунктов меню.", + "settingsNavigationDrawerTabTypes": "Типы", + "settingsNavigationDrawerTabAlbums": "Альбомы", + "settingsNavigationDrawerTabPages": "Страницы", + "settingsNavigationDrawerAddAlbum": "Добавить альбом", + "settingsThumbnailSectionTitle": "Эскизы", + "settingsThumbnailOverlayTile": "Наложение", + "settingsThumbnailOverlayPageTitle": "Наложение", + "settingsThumbnailShowFavouriteIcon": "Показать значок избранного", + "settingsThumbnailShowTagIcon": "Показать значок тега", + "settingsThumbnailShowLocationIcon": "Показать значок местоположения", + "settingsThumbnailShowMotionPhotoIcon": "Показать значок «живого фото»", + "settingsThumbnailShowRating": "Показать рейтинг", + "settingsThumbnailShowRawIcon": "Показать значок RAW-файла", + "settingsThumbnailShowVideoDuration": "Показать продолжительность видео", + "settingsCollectionQuickActionsTile": "Быстрые действия", + "settingsCollectionQuickActionEditorPageTitle": "Быстрые действия", + "settingsCollectionQuickActionTabBrowsing": "Просмотр", + "settingsCollectionQuickActionTabSelecting": "Выбор", + "settingsCollectionBrowsingQuickActionEditorBanner": "Нажмите и удерживайте для перемещения кнопок и выбора действий, отображаемых при просмотре объектов.", + "settingsCollectionSelectionQuickActionEditorBanner": "Нажмите и удерживайте, чтобы переместить кнопки и выбрать, какие действия будут отображаться при выборе элементов.", + "settingsViewerSectionTitle": "Просмотрщик", + "settingsViewerGestureSideTapNext": "Нажатие на край экрана для перехода назад/вперед", + "settingsViewerUseCutout": "Использовать область выреза", + "settingsViewerMaximumBrightness": "Максимальная яркость", + "settingsMotionPhotoAutoPlay": "Автовоспроизведение «живых фото»", + "settingsImageBackground": "Фон изображения", + "settingsViewerQuickActionsTile": "Быстрые действия", + "settingsViewerQuickActionEditorPageTitle": "Быстрые действия", + "settingsViewerQuickActionEditorBanner": "Нажмите и удерживайте для перемещения кнопок и выбора действий, отображаемых в просмотрщике.", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Отображаемые кнопки", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Доступные кнопки", + "settingsViewerQuickActionEmpty": "Нет кнопок", + "settingsViewerOverlayTile": "Наложение", + "settingsViewerOverlayPageTitle": "Наложение", + "settingsViewerShowOverlayOnOpening": "Показать наложение при открытии", + "settingsViewerShowMinimap": "Показать миникарту", + "settingsViewerShowInformation": "Показать информацию", + "settingsViewerShowInformationSubtitle": "Показать название, дату, местоположение и т.д.", + "settingsViewerShowShootingDetails": "Показать детали съёмки", + "settingsViewerShowOverlayThumbnails": "Показать эскизы", + "settingsViewerEnableOverlayBlurEffect": "Наложение эффекта размытия", + "settingsViewerSlideshowTile": "Слайд-шоу", + "settingsViewerSlideshowPageTitle": "Слайд-шоу", + "settingsSlideshowRepeat": "Повтор", + "settingsSlideshowShuffle": "Вперемешку", + "settingsSlideshowFillScreen": "Полный экран", + "settingsSlideshowAnimatedZoomEffect": "Анимация зум эффекта", + "settingsSlideshowTransitionTile": "Эффект перехода", + "settingsSlideshowIntervalTile": "Интервал", + "settingsSlideshowVideoPlaybackTile": "Проигрывание видео", + "settingsSlideshowVideoPlaybackDialogTitle": "Проигрывание Видео", + "settingsVideoPageTitle": "Настройки видео", + "settingsVideoSectionTitle": "Видео", + "settingsVideoShowVideos": "Показать видео", + "settingsVideoEnableHardwareAcceleration": "Аппаратное ускорение", + "settingsVideoAutoPlay": "Автозапуск воспроизведения", + "settingsVideoLoopModeTile": "Циклический режим", + "settingsVideoLoopModeDialogTitle": "Цикличный режим", + "settingsSubtitleThemeTile": "Субтитры", + "settingsSubtitleThemePageTitle": "Субтитры", + "settingsSubtitleThemeSample": "Образец.", + "settingsSubtitleThemeTextAlignmentTile": "Выравнивание текста", + "settingsSubtitleThemeTextAlignmentDialogTitle": "Выравнивание текста", + "settingsSubtitleThemeTextSize": "Размер текста", + "settingsSubtitleThemeShowOutline": "Показать контур и тень", + "settingsSubtitleThemeTextColor": "Цвет текста", + "settingsSubtitleThemeTextOpacity": "Непрозрачность текста", + "settingsSubtitleThemeBackgroundColor": "Цвет фона", + "settingsSubtitleThemeBackgroundOpacity": "Непрозрачность фона", + "settingsSubtitleThemeTextAlignmentLeft": "По левой стороне", + "settingsSubtitleThemeTextAlignmentCenter": "По центру", + "settingsSubtitleThemeTextAlignmentRight": "По правой стороне", + "settingsVideoControlsTile": "Элементы управления", + "settingsVideoControlsPageTitle": "Элементы управления", + "settingsVideoButtonsTile": "Кнопки", + "settingsVideoGestureDoubleTapTogglePlay": "Двойное нажатие для воспроизведения/паузы", + "settingsVideoGestureSideDoubleTapSeek": "Двойное нажатие на края экрана для перехода назад/вперёд", + "settingsPrivacySectionTitle": "Конфиденциальность", + "settingsAllowInstalledAppAccess": "Разрешить доступ к библиотеке приложения", + "settingsAllowInstalledAppAccessSubtitle": "Используется для улучшения отображения альбомов", + "settingsAllowErrorReporting": "Разрешить анонимную отправку логов", + "settingsSaveSearchHistory": "Сохранять историю поиска", + "settingsEnableBin": "Использовать корзину", + "settingsEnableBinSubtitle": "Хранить удалённые объекты в течение 30 дней", + "settingsHiddenItemsTile": "Скрытые объекты", + "settingsHiddenItemsPageTitle": "Скрытые объекты", + "settingsHiddenFiltersBanner": "Фотографии и видео, соответствующие скрытым фильтрам, не появятся в вашей коллекции.", + "settingsHiddenFiltersEmpty": "Нет скрытых фильтров", + "settingsStorageAccessTile": "Доступ к хранилищу", + "settingsStorageAccessPageTitle": "Доступ к хранилищу", + "settingsStorageAccessBanner": "Некоторые каталоги требуют обязательного предоставления доступа для изменения файлов в них. Вы можете просмотреть здесь каталоги, к которым вы ранее предоставили доступ.", + "settingsStorageAccessEmpty": "Нет прав доступа", + "settingsStorageAccessRevokeTooltip": "Отменить", + "settingsAccessibilitySectionTitle": "Специальные возможности", + "settingsRemoveAnimationsTile": "Удалить анимацию", + "settingsRemoveAnimationsDialogTitle": "Удалить анимацию", + "settingsTimeToTakeActionTile": "Время на выполнение действия", + "settingsDisplaySectionTitle": "Отображение", + "settingsThemeBrightnessTile": "Тема", + "settingsThemeBrightnessDialogTitle": "Тема", + "settingsThemeColorHighlights": "Цветовые акценты", + "settingsThemeEnableDynamicColor": "Динамический цвет", + "settingsDisplayRefreshRateModeTile": "Частота обновления экрана", + "settingsDisplayRefreshRateModeDialogTitle": "Частота обновления", + "settingsLanguageSectionTitle": "Язык и форматы", + "settingsLanguageTile": "Язык", + "settingsLanguagePageTitle": "Язык", + "settingsCoordinateFormatTile": "Формат координат", + "settingsCoordinateFormatDialogTitle": "Формат координат", + "settingsUnitSystemTile": "Единицы измерения", + "settingsUnitSystemDialogTitle": "Единицы измерения", + "settingsScreenSaverPageTitle": "Скринсейвер", + "settingsWidgetPageTitle": "Фоторамка", + "settingsWidgetShowOutline": "Выделение", + "settingsWidgetOpenPage": "При нажатии на виджет", + "settingsCollectionTile": "Коллекция", + "statsPageTitle": "Статистика", + "statsWithGps": "{count, plural, =1{1 объект с местоположением} few{{count} объекта с местоположением} other{{count} объектов с местоположением}}", + "statsTopCountriesSectionTitle": "Топ стран", + "statsTopPlacesSectionTitle": "Топ локаций", + "statsTopTagsSectionTitle": "Топ тегов", + "statsTopAlbumsSectionTitle": "Топ альбомов", + "viewerOpenPanoramaButtonLabel": "ОТКРЫТЬ ПАНОРАМУ", + "viewerSetWallpaperButtonLabel": "УСТАНОВИТЬ КАК ОБОИ", + "viewerErrorUnknown": "Упс!", + "viewerErrorDoesNotExist": "Файл больше не существует.", + "viewerInfoPageTitle": "Информация", + "viewerInfoBackToViewerTooltip": "Вернуться к просмотрщику", + "viewerInfoUnknown": "неизвестный", + "viewerInfoLabelDescription": "Описание", + "viewerInfoLabelTitle": "Название", + "viewerInfoLabelDate": "Дата", + "viewerInfoLabelResolution": "Разрешение", + "viewerInfoLabelSize": "Размер", + "viewerInfoLabelUri": "Идентификатор", + "viewerInfoLabelPath": "Расположение", + "viewerInfoLabelDuration": "Продолжительность", + "viewerInfoLabelOwner": "Владелец", + "viewerInfoLabelCoordinates": "Координаты", + "viewerInfoLabelAddress": "Адрес", + "mapStyleDialogTitle": "Стиль карты", + "mapStyleTooltip": "Выберите стиль карты", + "mapZoomInTooltip": "Увеличить", + "mapZoomOutTooltip": "Уменьшить", + "mapPointNorthUpTooltip": "Повернуть на север", + "mapAttributionOsmHot": "Плитки [HOT](https://www.hotosm.org/) • Размещена на [OSM France](https://openstreetmap.fr/)", + "mapAttributionStamen": "Плитки [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "openMapPageTooltip": "Просмотреть на странице карты", + "mapEmptyRegion": "Нет изображений в этом регионе", + "viewerInfoOpenEmbeddedFailureFeedback": "Не удалось извлечь встроенные данные", + "viewerInfoOpenLinkText": "Открыть", + "viewerInfoViewXmlLinkText": "Просмотр XML", + "viewerInfoSearchFieldLabel": "Поиск метаданных", + "viewerInfoSearchEmpty": "Нет подходящих ключей", + "viewerInfoSearchSuggestionDate": "Дата и время", + "viewerInfoSearchSuggestionDescription": "Описание", + "viewerInfoSearchSuggestionDimensions": "Измерения", + "viewerInfoSearchSuggestionResolution": "Разрешение", + "viewerInfoSearchSuggestionRights": "Права", + "wallpaperUseScrollEffect": "Эффект прокрутки на домашнем экране", + "tagEditorPageTitle": "Изменить теги", + "tagEditorPageNewTagFieldLabel": "Новый тег", + "tagEditorPageAddTagTooltip": "Добавить тег", + "tagEditorSectionRecent": "Недавние", + "panoramaEnableSensorControl": "Включить сенсорное управление", + "panoramaDisableSensorControl": "Отключить сенсорное управление", + "sourceViewerPageTitle": "Источник", + "durationDialogSeconds": "Секунд", + "widgetOpenPageCollection": "Открыть коллекцию", + "tagPlaceholderCountry": "Страна", + "tagEditorSectionPlaceholders": "Закладки", + "tagPlaceholderPlace": "Локация", + "editEntryLocationDialogSetCustom": "Редактировать местоположение", + "settingsAllowMediaManagement": "Разрешить управление медиа", + "entryInfoActionExportMetadata": "Экспорт метаданных", + "subtitlePositionBottom": "Внизу", + "subtitlePositionTop": "Наверху", + "widgetDisplayedItemRandom": "Произвольные", + "settingsSubtitleThemeTextPositionTile": "Положение текста", + "settingsSubtitleThemeTextPositionDialogTitle": "Положение текста", + "settingsWidgetDisplayedItem": "Показывать", + "widgetDisplayedItemMostRecent": "Недавние", + "filterNoAddressLabel": "Без адреса", + "filterAspectRatioLandscapeLabel": "Горизонтально", + "filterAspectRatioPortraitLabel": "Вертикально", + "settingsViewerShowRatingTags": "Показать рейтинг и теги", + "columnCount": "{count, plural, =1{{count} столбец} few{{count} столбца} other{{count} столбцов}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "entryInfoActionRemoveLocation": "Удалить местоположение", + "keepScreenOnVideoPlayback": "Во время воспроизведения видео", + "settingsAccessibilityShowPinchGestureAlternatives": "Показать альтернативные жесты щипка", + "entryActionShareImageOnly": "Поделиться только изображением", + "entryActionShareVideoOnly": "Поделиться только видео", + "settingsViewerShowDescription": "Показать описание", + "chipActionConfigureVault": "Настроить хранилище", + "vaultLockTypePin": "Пин-код", + "lengthUnitPercent": "%", + "vaultLockTypePassword": "Пароль", + "newVaultDialogTitle": "Новое хранилище", + "vaultDialogLockModeWhenScreenOff": "Блокировать при выключении экрана", + "pinDialogEnter": "Введите пин-код", + "pinDialogConfirm": "Подтвердите пин-код", + "passwordDialogEnter": "Введите пароль", + "passwordDialogConfirm": "Подтвердите пароль", + "vaultDialogLockTypeLabel": "Тип защиты", + "vaultBinUsageDialogMessage": "Некоторые из хранилищ используют корзину.", + "chipActionCreateVault": "Создать хранилище", + "settingsDisplayUseTvInterface": "Интерфейс Android TV", + "configureVaultDialogTitle": "Настроить хранилище", + "albumTierVaults": "Хранилища", + "newVaultWarningDialogMessage": "Элементы внутри хранилищ доступны только для этого приложения, и никакого другого.\n\nЕсли вы удалите приложение или очистите его данные, то вы потеряете все содержимое внутри хранилищ.", + "filterLocatedLabel": "С местоположением", + "filterTaggedLabel": "С тэгами", + "chipActionGoToPlacePage": "Показать в локациях", + "settingsModificationWarningDialogMessage": "Другие настройки будут изменены.", + "placePageTitle": "Локации", + "settingsDisablingBinWarningDialogMessage": "Элементы в корзине будут удалены навсегда.", + "lengthUnitPixel": "пикс.", + "chipActionLock": "Заблокировать", + "patternDialogEnter": "Введите ключ", + "patternDialogConfirm": "Подтвердите ключ", + "vaultLockTypePattern": "Графический ключ", + "drawerPlacePage": "Локации", + "settingsVideoBackgroundMode": "Фоновый режим", + "settingsVideoBackgroundModeDialogTitle": "Фоновый режим", + "settingsVideoEnablePip": "Картинка в картинке", + "placeEmpty": "Нет локаций", + "chipActionShowCountryStates": "Показать государства", + "viewerActionUnlock": "Разблокировать просмотрщик", + "viewerActionLock": "Заблокировать просмотрщик", + "authenticateToConfigureVault": "Аутентифицируйтесь чтобы настроить хранилище", + "authenticateToUnlockVault": "Аутентифицируйтесь чтобы разблокировать хранилище", + "settingsVideoGestureVerticalDragBrightnessVolume": "Проведите пальцем вверх или вниз чтобы изменить яркость/громкость", + "settingsConfirmationVaultDataLoss": "Показывать предупреждение при утере данных хранилища", + "tooManyItemsErrorDialogMessage": "Попробуйте снова с меньшим числом элементов.", + "exportEntryDialogWriteMetadata": "Запись метаданных", + "saveCopyButtonLabel": "СОХРАНИТЬ КОПИЮ", + "applyTooltip": "Применить", + "editorActionTransform": "Изменить", + "editorTransformCrop": "Обрезать", + "editorTransformRotate": "Повернуть", + "cropAspectRatioFree": "Свободное", + "cropAspectRatioOriginal": "Изначальное", + "cropAspectRatioSquare": "Квадратное", + "maxBrightnessAlways": "Всегда", + "widgetTapUpdateWidget": "Обновить виджет", + "settingsCollectionBurstPatternsTile": "Шаблоны вспышки", + "statePageTitle": "Регионы", + "settingsVideoResumptionModeTile": "Возобновить воспроизведение", + "settingsAskEverytime": "Спрашивать каждый раз", + "maxBrightnessNever": "Никогда", + "videoResumptionModeNever": "Никогда", + "videoResumptionModeAlways": "Всегда", + "settingsVideoPlaybackTile": "Воспроизведение видео", + "settingsVideoPlaybackPageTitle": "Воспроизведение видео", + "exportEntryDialogQuality": "Качество", + "settingsVideoResumptionModeDialogTitle": "Возобновить воспроизведение", + "tagEditorDiscardDialogMessage": "Отменить изменения?", + "statsTopStatesSectionTitle": "Топ регионов", + "stateEmpty": "Нет регионов", + "tagPlaceholderState": "Регион", + "searchStatesSectionTitle": "Регионы", + "settingsCollectionBurstPatternsNone": "Без вспышки", + "aboutDataUsageSectionTitle": "Использование данных", + "aboutDataUsageData": "Данные", + "aboutDataUsageCache": "Кэш", + "aboutDataUsageDatabase": "База данных", + "aboutDataUsageMisc": "Разнообразное", + "aboutDataUsageInternal": "Внутреннее", + "aboutDataUsageExternal": "Внешнее", + "overlayHistogramNone": "Откл.", + "overlayHistogramRGB": "RGB", + "settingsViewerShowHistogram": "Показать гистограмму", + "overlayHistogramLuminance": "Яркость", + "aboutDataUsageClearCache": "Очистить кэш", + "entryActionCast": "Трансляция", + "castDialogTitle": "Устройства трансляции", + "settingsThumbnailShowHdrIcon": "Показать значок HDR", + "collectionActionSetHome": "Установить как главную", + "videoRepeatActionSetStart": "Установить начало", + "stopTooltip": "Остановить", + "videoActionABRepeat": "Повторить от А до Б", + "videoRepeatActionSetEnd": "Установить конец", + "renameProcessorHash": "Хэш", + "settingsForceWesternArabicNumeralsTile": "Принудительные арабские цифры", + "chipActionShowCollection": "Показать в Коллекции", + "chipActionGoToExplorerPage": "Показать в проводнике", + "explorerPageTitle": "Проводник", + "explorerActionSelectStorageVolume": "Выбрать хранилище", + "selectStorageVolumeDialogTitle": "Выбрать хранилище", + "sortByDuration": "По продолжительности", + "sortOrderLongestFirst": "Сначала самый длинный", + "setHomeCustom": "По своему", + "sortOrderShortestFirst": "Сначала самый короткий", + "mapStyleOpenTopoMap": "OpenTopoMap", + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Плитки от [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "mapAttributionOsmData": "Данные карты © [openstreetmap](https://www.openstreetmap.org/copyright) участники", + "videoActionShowPreviousFrame": "Показать предыдущий кадр", + "videoActionShowNextFrame": "Показать следующий кадр", + "mapStyleOsmLiberty": "OSM Liberty", + "mapAttributionOsmLiberty": "Плитки от [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Размещено на [OSM Americana](https://tile.ourmap.us)", + "newAlbumDialogAlbumAlreadyExistsHelper": "Альбом уже существует", + "chipActionDecompose": "Раздел", + "chipActionRemove": "Удалить", + "albumTierDynamic": "Динамический", + "newDynamicAlbumDialogTitle": "Новый динамический альбом", + "dynamicAlbumAlreadyExists": "Динамический альбом уже существует", + "collectionActionAddDynamicAlbum": "Добавить динамический альбом", + "appExportDynamicAlbums": "Динамические альбомы", + "editEntryLocationDialogImportGpx": "Импорт GPX", + "editEntryLocationDialogTimeShift": "Сдвиг времени", + "coordinateFormatDdm": "DDM", + "removeEntryMetadataDialogAll": "Все", + "searchFormatSectionTitle": "Форматы", + "sortByPath": "По пути", + "chipActionGroup": "Изменить группировку", + "createButtonLabel": "СОЗДАТЬ", + "chipActionCreateGroup": "Создать группу", + "albumTierGroups": "Группы", + "newGroupDialogTitle": "Новая группа", + "newGroupDialogNameLabel": "Название группы", + "groupAlreadyExists": "Группа уже существует", + "groupEmpty": "Групп нету", + "ungrouped": "Без группировки", + "groupPickerTitle": "Выбор группы", + "groupPickerUseThisGroupButton": "Использовать эту группу", + "sectionNone": "Без разделов", + "tagPickPageTitle": "Выбрать тег", + "settingsNavigationBottomActionsTile": "Нижняя навигация", + "settingsNavigationBottomActionEditorPageTitle": "Нижняя навигация", + "settingsNavigationBottomActionEditorBanner": "Нажмите и удерживайте, чтобы перемещать кнопки и выбирать действия, которые будут отображаться на нижней панели навигации.", + "mapStyleDialogAddStyle": "Добавить стиль", + "mapStyleEditorDialogName": "Название", + "mapStyleEditorDialogUrl": "URL-адрес", + "mapStyleEditorDialogSubdomains": "Поддомены", + "mapStyleEditorDialogUserAgent": "User-Agent", + "settingsEnabled": "Включено", + "settingsForced": "Принудительно", + "settingsViewerShowZoomLevel": "Показать уровень приближения" +} diff --git a/lib/l10n/app_sat.arb b/lib/l10n/app_sat.arb new file mode 100644 index 0000000..d344237 --- /dev/null +++ b/lib/l10n/app_sat.arb @@ -0,0 +1,7 @@ +{ + "@@locale": "sat", + "welcomeMessage": "ᱮᱣᱥ ᱨᱮ ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ", + "@welcomeMessage": {}, + "appName": "ᱮᱣᱥ", + "@appName": {} +} diff --git a/lib/l10n/app_sk.arb b/lib/l10n/app_sk.arb new file mode 100644 index 0000000..a043cae --- /dev/null +++ b/lib/l10n/app_sk.arb @@ -0,0 +1,1606 @@ +{ + "deleteButtonLabel": "ODSTRÁNIŤ", + "@deleteButtonLabel": {}, + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Vitajte v Aves", + "@welcomeMessage": {}, + "cancelTooltip": "ZRUŠIŤ", + "@cancelTooltip": {}, + "changeTooltip": "ZMENIŤ", + "@changeTooltip": {}, + "clearTooltip": "VYČISTIŤ", + "@clearTooltip": {}, + "previousTooltip": "PREDCHÁDZAJÚCE", + "@previousTooltip": {}, + "nextTooltip": "Ďalej", + "@nextTooltip": {}, + "showTooltip": "Zobraziť", + "@showTooltip": {}, + "resetTooltip": "Znovu", + "@resetTooltip": {}, + "saveTooltip": "Uložiť", + "@saveTooltip": {}, + "pickTooltip": "Vybrať", + "@pickTooltip": {}, + "chipActionDelete": "Odstrániť", + "@chipActionDelete": {}, + "welcomeTermsToggle": "Súhlasím s pravidlami a podmienkami", + "@welcomeTermsToggle": {}, + "timeDays": "{count, plural, other{{count} dni}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "applyButtonLabel": "POUŽIŤ", + "@applyButtonLabel": {}, + "continueButtonLabel": "POKRAČOVAŤ", + "@continueButtonLabel": {}, + "doubleBackExitMessage": "Stlač znovu “späť” pre ukončenie.", + "@doubleBackExitMessage": {}, + "welcomeOptional": "Voliteľné", + "@welcomeOptional": {}, + "timeMinutes": "{count, plural, =1{{count} minúta} few{{count} minúty} other{{count} minút}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "nextButtonLabel": "ĎALEJ", + "@nextButtonLabel": {}, + "showButtonLabel": "ZOBRAZIŤ", + "@showButtonLabel": {}, + "hideButtonLabel": "SCHOVAŤ", + "@hideButtonLabel": {}, + "hideTooltip": "Schovať", + "@hideTooltip": {}, + "actionRemove": "Odstrániť", + "@actionRemove": {}, + "sourceStateLoading": "Načítavanie", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Indexovanie", + "@sourceStateCataloguing": {}, + "doNotAskAgain": "Nepýtať sa znovu", + "@doNotAskAgain": {}, + "chipActionGoToAlbumPage": "Zobraziť v albumoch", + "@chipActionGoToAlbumPage": {}, + "sourceStateLocatingCountries": "Hľadanie krajín", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Hľadanie miest", + "@sourceStateLocatingPlaces": {}, + "chipActionGoToCountryPage": "Zobraziť v krajinách", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "Zobraziť v označeniach", + "@chipActionGoToTagPage": {}, + "chipActionFilterOut": "Filtrovať", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Prefiltrovať", + "@chipActionFilterIn": {}, + "chipActionHide": "Skryť", + "@chipActionHide": {}, + "chipActionPin": "Pripnúť na začiatok", + "@chipActionPin": {}, + "chipActionUnpin": "Odstrániť z pripnutia", + "@chipActionUnpin": {}, + "chipActionRename": "Premenovať", + "@chipActionRename": {}, + "chipActionSetCover": "Nastaviť pozadie", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "Vytvoriť album", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "Skopírovať", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "Odstrániť", + "@entryActionDelete": {}, + "entryActionConvert": "Zmeniť", + "@entryActionConvert": {}, + "entryActionExport": "Exportovať", + "@entryActionExport": {}, + "entryActionRename": "Premenovať", + "@entryActionRename": {}, + "entryActionRestore": "Obnoviť", + "@entryActionRestore": {}, + "entryActionRotateCCW": "Otočiť proti smeru hodinových ručičiek", + "@entryActionRotateCCW": {}, + "entryActionFlip": "Prevrátiť horizontálne", + "@entryActionFlip": {}, + "entryActionPrint": "Vytlačiť", + "@entryActionPrint": {}, + "entryActionShareImageOnly": "Zdieľať iba obrázok", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "Zdieľať iba video", + "@entryActionShareVideoOnly": {}, + "entryActionViewSource": "Zobraziť zdroj", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "Zobraziť na mape", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Konvertovať na statický obrázok", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Otvoriť video", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionOpen": "Otvoriť v", + "@entryActionOpen": {}, + "entryActionSetAs": "Nastaviť ako", + "@entryActionSetAs": {}, + "entryActionInfo": "Informácie", + "@entryActionInfo": {}, + "entryActionRotateCW": "Otočiť po smere hodinových ručičiek", + "@entryActionRotateCW": {}, + "entryActionShare": "Zdieľať", + "@entryActionShare": {}, + "entryActionEdit": "Upraviť", + "@entryActionEdit": {}, + "nameConflictStrategySkip": "Preskočiť", + "@nameConflictStrategySkip": {}, + "filterTypeAnimatedLabel": "Animované", + "@filterTypeAnimatedLabel": {}, + "filterRatingRejectedLabel": "Zamietnuté", + "@filterRatingRejectedLabel": {}, + "coordinateDmsWest": "W", + "@coordinateDmsWest": {}, + "videoLoopModeNever": "Nikdy", + "@videoLoopModeNever": {}, + "mapStyleGoogleTerrain": "Google mapy (terén)", + "@mapStyleGoogleTerrain": {}, + "accessibilityAnimationsKeep": "Zachovanie efektov na obrazovke", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferLowest": "Najnižšie možné", + "@displayRefreshRatePreferLowest": {}, + "moveUndatedConfirmationDialogSetDate": "Uložiť dátumy", + "@moveUndatedConfirmationDialogSetDate": {}, + "editEntryDateDialogSourceFileModifiedDate": "Dátum modifikácie súboru", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "widgetDisplayedItemMostRecent": "Najnovšie", + "@widgetDisplayedItemMostRecent": {}, + "missingSystemFilePickerDialogMessage": "Systémový vyberač súborov chýba alebo je vypnutý. Povoľte ho a skúste to znova.", + "@missingSystemFilePickerDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "Uložiť dátumy pred pokračovaním?", + "@moveUndatedConfirmationDialogMessage": {}, + "hideFilterConfirmationDialogMessage": "Vybrané fotky a videá sa nebudú zobrazovať vo vašich kolekciách. Môžete ich obnoviť v nastaveniach “Súkromie”.\n\nUrčite chcete schovať tieto súbory?", + "@hideFilterConfirmationDialogMessage": {}, + "entryActionOpenMap": "Ukázať na mape v aplikácií", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Otočiť obrazovku", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Pridať do obľúbených", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Odstrániť z obľúbených", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Zachytiť obraz", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Stlmiť zvuk", + "@videoActionMute": {}, + "videoActionUnmute": "Zapnúť zvuk", + "@videoActionUnmute": {}, + "videoActionPause": "Pozastaviť", + "@videoActionPause": {}, + "videoActionPlay": "Spustiť", + "@videoActionPlay": {}, + "videoActionReplay10": "Pretočiť späť o 10 sekúnd", + "@videoActionReplay10": {}, + "videoActionSkip10": "Pretočiť dopredu o 10 sekúnd", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Výber stopy", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Rýchlosť prehrávania", + "@videoActionSetSpeed": {}, + "slideshowActionResume": "Pokračovať", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Zobraziť v kolekcií", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Upraviť dátum a čas", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Upraviť polohu", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "Upraviť nadpis & popis", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Upraviť hodnotenie", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Upraviť značky", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Odstrániť metadáta", + "@entryInfoActionRemoveMetadata": {}, + "entryInfoActionExportMetadata": "Exportovať metadáta", + "@entryInfoActionExportMetadata": {}, + "entryInfoActionRemoveLocation": "Odstrániť polohu", + "@entryInfoActionRemoveLocation": {}, + "filterAspectRatioLandscapeLabel": "Horizontálne", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "Vetrikálne", + "@filterAspectRatioPortraitLabel": {}, + "filterBinLabel": "Kôš", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Obľúbené", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Bez dátumu", + "@filterNoDateLabel": {}, + "filterNoAddressLabel": "Bez adresy", + "@filterNoAddressLabel": {}, + "filterNoRatingLabel": "Nehodnotené", + "@filterNoRatingLabel": {}, + "filterTaggedLabel": "Označené", + "@filterTaggedLabel": {}, + "filterNoTagLabel": "Neoznačené", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Bez nadpisu", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "Tento deň", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Nedávno pridané", + "@filterRecentlyAddedLabel": {}, + "filterTypeMotionPhotoLabel": "Fotka v pohybe", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Panoráma", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° Video", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Obrázok", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Desatinné stupne", + "@coordinateFormatDecimal": {}, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "E", + "@coordinateDmsEast": {}, + "unitSystemMetric": "Metrické", + "@unitSystemMetric": {}, + "unitSystemImperial": "Imperiálne", + "@unitSystemImperial": {}, + "videoLoopModeShortOnly": "Iba krátke videá", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "Vždy", + "@videoLoopModeAlways": {}, + "videoControlsPlayOutside": "Otvoriť v inom prehrávači", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google mapy", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google mapy (Hybridné)", + "@mapStyleGoogleHybrid": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyRename": "Premenovať", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Nahradiť", + "@nameConflictStrategyReplace": {}, + "keepScreenOnNever": "Nikdy", + "@keepScreenOnNever": {}, + "keepScreenOnVideoPlayback": "Počas prehrávania", + "@keepScreenOnVideoPlayback": {}, + "keepScreenOnViewerOnly": "Iba stránka prehliadača", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Vždy", + "@keepScreenOnAlways": {}, + "accessibilityAnimationsRemove": "Predchádzanie efektom obrazovky", + "@accessibilityAnimationsRemove": {}, + "displayRefreshRatePreferHighest": "Najvyššie možné", + "@displayRefreshRatePreferHighest": {}, + "subtitlePositionTop": "Navrchu", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "Naspodku", + "@subtitlePositionBottom": {}, + "videoPlaybackSkip": "Preskočiť", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Spustiť stlmené", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Spustiť so zvukom", + "@videoPlaybackWithSound": {}, + "themeBrightnessLight": "Svetlá", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Tmavá", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Čierna", + "@themeBrightnessBlack": {}, + "viewerTransitionSlide": "Snímka", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Parallax", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "Vyblednúť", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "Priblížiť", + "@viewerTransitionZoomIn": {}, + "viewerTransitionNone": "Žiadne", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Domáca obrazovka", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "Zamknutá obrazovka", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Domáca a zamknutá obrazovka", + "@wallpaperTargetHomeLock": {}, + "widgetDisplayedItemRandom": "Náhodné", + "@widgetDisplayedItemRandom": {}, + "widgetOpenPageHome": "Isť domov", + "@widgetOpenPageHome": {}, + "widgetOpenPageCollection": "Otvoriť kolekciu", + "@widgetOpenPageCollection": {}, + "widgetOpenPageViewer": "Otvoriť prehliadač", + "@widgetOpenPageViewer": {}, + "albumTierNew": "Nový", + "@albumTierNew": {}, + "albumTierPinned": "Pripnuté", + "@albumTierPinned": {}, + "albumTierSpecial": "Spoločné", + "@albumTierSpecial": {}, + "albumTierApps": "Aplikácie", + "@albumTierApps": {}, + "albumTierRegular": "Ostatné", + "@albumTierRegular": {}, + "storageVolumeDescriptionFallbackPrimary": "Vnútorný ukladací priestor", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD karta", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "Koreňový adresár", + "@rootDirectoryDescription": {}, + "nameConflictDialogSingleSourceMessage": "Niektoré súbory v cieľovej destinácií majú rovnaké názvy.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "Niektoré súbory majú rovnaký názov.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "Názov skratky", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "PRIDAŤ", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "Nie je podporované žiadnou aplikáciou.", + "@noMatchingAppDialogMessage": {}, + "videoResumeDialogMessage": "Pokračovať v prehrávaní od {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "videoStartOverButtonLabel": "ODZNOVA", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "POKRAČOVAŤ", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Posledná položka", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Automaticky", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Vlastné", + "@setCoverDialogCustom": {}, + "newAlbumDialogTitle": "Nový album", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Názov albumu", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Priečinok už existuje", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Úložisko:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "Nový názov", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Priečinok už existuje", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Premenovať", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "Formát", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Vložiť položku", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Náhľad", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Počítadlo", + "@renameProcessorCounter": {}, + "renameProcessorName": "Názov", + "@renameProcessorName": {}, + "exportEntryDialogFormat": "Formát:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Šírka", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Výška", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "Nový názov", + "@renameEntryDialogLabel": {}, + "editEntryDialogCopyFromItem": "Kopírovať z inej položky", + "@editEntryDialogCopyFromItem": {}, + "editEntryDialogTargetFieldsHeader": "Polia k úprave", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Dátum & Čas", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Nastaviť vlastný dátum", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Kopírovať z iného dátumu", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogExtractFromTitle": "Extrahovať z nadpisu", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Posun", + "@editEntryDateDialogShift": {}, + "durationDialogHours": "Hodiny", + "@durationDialogHours": {}, + "durationDialogMinutes": "Minúty", + "@durationDialogMinutes": {}, + "durationDialogSeconds": "Sekundy", + "@durationDialogSeconds": {}, + "editEntryLocationDialogTitle": "Poloha", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogSetCustom": "Nastaviť vlastnú polohu", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogChooseOnMap": "Vybrať z mapy", + "@editEntryLocationDialogChooseOnMap": {}, + "viewerActionSettings": "Nastavenia", + "@viewerActionSettings": {}, + "tagPlaceholderState": "Štát", + "@tagPlaceholderState": {}, + "filterLocatedLabel": "Lokalizované", + "@filterLocatedLabel": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "saveCopyButtonLabel": "Uložiť kópiu", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Použiť", + "@applyTooltip": {}, + "chipActionShowCountryStates": "Zobraziť štáty", + "@chipActionShowCountryStates": {}, + "viewerActionUnlock": "Odomknúť pohľad", + "@viewerActionUnlock": {}, + "editorActionTransform": "Transformovať", + "@editorActionTransform": {}, + "editorTransformCrop": "Orezať", + "@editorTransformCrop": {}, + "editorTransformRotate": "Otočiť", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Uvoľniť", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Originál", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Štvorec", + "@cropAspectRatioSquare": {}, + "filterNoLocationLabel": "Nelokalizované", + "@filterNoLocationLabel": {}, + "drawerTagPage": "Značky", + "@drawerTagPage": {}, + "aboutLicensesSectionTitle": "Open-Source Licencie", + "@aboutLicensesSectionTitle": {}, + "collectionSelectPageTitle": "Označiť položky", + "@collectionSelectPageTitle": {}, + "collectionPickPageTitle": "Vybrať", + "@collectionPickPageTitle": {}, + "collectionMoveSuccessFeedback": "{count, plural, =1{Položka bola presunutá} other{Bolo presunutých {count} položiek}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "drawerCountryPage": "Krajiny", + "@drawerCountryPage": {}, + "drawerPlacePage": "Miesta", + "@drawerPlacePage": {}, + "sortOrderNewestFirst": "Najskôr najnovšie", + "@sortOrderNewestFirst": {}, + "sortOrderAtoZ": "od A po Z", + "@sortOrderAtoZ": {}, + "chipActionLock": "Zamknúť", + "@chipActionLock": {}, + "sortByDate": "Podľa dátumu", + "@sortByDate": {}, + "collectionEmptyVideos": "Žiadne videá", + "@collectionEmptyVideos": {}, + "aboutDataUsageSectionTitle": "Využitie dát", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageData": "Dáta", + "@aboutDataUsageData": {}, + "aboutDataUsageDatabase": "Databáza", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageMisc": "Rôzne", + "@aboutDataUsageMisc": {}, + "aboutDataUsageInternal": "Interné", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "Externé", + "@aboutDataUsageExternal": {}, + "collectionActionEmptyBin": "Vyprázdniť kôš", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Kopírovať do albumu", + "@collectionActionCopy": {}, + "dateToday": "Dnes", + "@dateToday": {}, + "dateThisMonth": "Tento mesiac", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Nepodarilo sa odstrániť položku} other{Nepodarilo sa odstrániť {count} položiek} few{Nepodarilo sa odstrániť {count} položky}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, =1{Položka bola skopírovaná} other{Bolo skopírovaných {count} položiek}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{Položka bola upravená} other{Bolo upravených {count} položiek}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyFavourites": "Žiadne obľúbené", + "@collectionEmptyFavourites": {}, + "drawerCollectionSphericalVideos": "360° Videá", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Albumy", + "@drawerAlbumPage": {}, + "sortByRating": "Podľa hodnotenia", + "@sortByRating": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Odstrániť túto položku?} other{Odstrániť týchto {count} položiek?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "exportEntryDialogWriteMetadata": "Zapísať metadáta", + "@exportEntryDialogWriteMetadata": {}, + "aboutBugCopyInfoButton": "Kopírovať", + "@aboutBugCopyInfoButton": {}, + "editEntryLocationDialogLongitude": "Zemepisná dĺžka", + "@editEntryLocationDialogLongitude": {}, + "editEntryRatingDialogTitle": "Hodnotenie", + "@editEntryRatingDialogTitle": {}, + "videoSpeedDialogLabel": "Rýchlosť prehrávania", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Zvuk", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogOff": "Vypnúť", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogNoSelection": "Žiadne iné položky.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericFailureFeedback": "Nastala chyba", + "@genericFailureFeedback": {}, + "viewDialogLayoutSectionTitle": "Rozloženie", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "Zoradiť opačne", + "@viewDialogReverseSortOrder": {}, + "tileLayoutList": "Zoznam", + "@tileLayoutList": {}, + "coverDialogTabCover": "Obálka", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "Aplikácia", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Farba", + "@coverDialogTabColor": {}, + "aboutBugReportInstruction": "Nahlásiť na Github spolu so záznamami a systémovými informáciami", + "@aboutBugReportInstruction": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android knižnice", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "collectionSearchTitlesHintText": "Vyhľadávanie v nadpisoch", + "@collectionSearchTitlesHintText": {}, + "collectionEditFailureFeedback": "{count, plural, =1{Nepodarilo sa upraviť položku} few{Nepodarilo sa upraviť {count} položky} other{Nepodarilo sa upraviť {count} položiek}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyImages": "Žiadne obrázky", + "@collectionEmptyImages": {}, + "sortOrderZtoA": "od Z po A", + "@sortOrderZtoA": {}, + "sortOrderLargestFirst": "Najväčšie prvé", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "Najmenšie prvé", + "@sortOrderSmallestFirst": {}, + "albumGroupType": "Podľa typu", + "@albumGroupType": {}, + "tagEditorDiscardDialogMessage": "Naozaj chceš zrušiť zmeny?", + "@tagEditorDiscardDialogMessage": {}, + "tagPlaceholderPlace": "Miesto", + "@tagPlaceholderPlace": {}, + "panoramaEnableSensorControl": "Povoliť senzory", + "@panoramaEnableSensorControl": {}, + "itemCount": "{count, plural, =1{{count} položka} other{{count} položiek}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "columnCount": "{count, plural, =1{{count} stĺpec} other{{count} stĺpcov}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeSeconds": "{count, plural, =1{{count} sekunda} other{{count} sekúnd}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "drawerCollectionAnimated": "Animované", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Fotky v pohybe", + "@drawerCollectionMotionPhotos": {}, + "sortOrderOldestFirst": "Najskôr najstaršie", + "@sortOrderOldestFirst": {}, + "tagEditorPageNewTagFieldLabel": "Nový štítok", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorSectionRecent": "Nedávne", + "@tagEditorSectionRecent": {}, + "chipActionGoToPlacePage": "Otvoriť v miestach", + "@chipActionGoToPlacePage": {}, + "newVaultWarningDialogMessage": "Položky v trezoroch sú dostupné iba v tejto aplikácií\n\nAk aplikáciu odinštaluješ alebo vymažeš dáta aplikácie, stratíš všetky položky z trezorov.", + "@newVaultWarningDialogMessage": {}, + "newVaultDialogTitle": "Nový trezor", + "@newVaultDialogTitle": {}, + "genericSuccessFeedback": "Hotovo!", + "@genericSuccessFeedback": {}, + "dateYesterday": "Včera", + "@dateYesterday": {}, + "exportEntryDialogQuality": "Kvalita", + "@exportEntryDialogQuality": {}, + "locationPickerUseThisLocationButton": "Použiť túto polohu", + "@locationPickerUseThisLocationButton": {}, + "aboutCreditsWorldAtlas2": "pod ISC licenciou.", + "@aboutCreditsWorldAtlas2": {}, + "collectionPageTitle": "Kolekcie", + "@collectionPageTitle": {}, + "collectionActionMove": "Presunúť do albumu", + "@collectionActionMove": {}, + "viewerActionLock": "Uzamknúť pohľad", + "@viewerActionLock": {}, + "pinDialogEnter": "Vložiť PIN", + "@pinDialogEnter": {}, + "appPickDialogTitle": "Výber aplikácie", + "@appPickDialogTitle": {}, + "appPickDialogNone": "Nič", + "@appPickDialogNone": {}, + "collectionActionRescan": "Opätovné skenovanie", + "@collectionActionRescan": {}, + "albumTierVaults": "Trezory", + "@albumTierVaults": {}, + "vaultDialogLockTypeLabel": "Typ uzamknutia", + "@vaultDialogLockTypeLabel": {}, + "aboutCreditsWorldAtlas1": "Táto aplikácia používa TopoJSON súbor od", + "@aboutCreditsWorldAtlas1": {}, + "collectionActionAddShortcut": "Pridať skratku", + "@collectionActionAddShortcut": {}, + "collectionGroupAlbum": "Podľa albumu", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Podľa mesiaca", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Podľa dňa", + "@collectionGroupDay": {}, + "collectionEmptyGrantAccessButtonLabel": "Poskytnúť prístup", + "@collectionEmptyGrantAccessButtonLabel": {}, + "drawerCollectionRaws": "Raw fotky", + "@drawerCollectionRaws": {}, + "sortByItemCount": "Podľa počtu položiek", + "@sortByItemCount": {}, + "sortBySize": "Podľa rozmerov", + "@sortBySize": {}, + "sortByAlbumFileName": "Podľa albumu & názvu", + "@sortByAlbumFileName": {}, + "tagEditorPageAddTagTooltip": "Pridať štítok", + "@tagEditorPageAddTagTooltip": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Odstrániť tento album a položku v ňom?} other{Odstrániť tento album a {count} položiek v ňom?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "removeEntryMetadataDialogTitle": "Odstránenie metadát", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "Viac", + "@removeEntryMetadataDialogMore": {}, + "menuActionConfigureView": "Zobrazenie", + "@menuActionConfigureView": {}, + "tileLayoutGrid": "Mriežka", + "@tileLayoutGrid": {}, + "menuActionSelect": "Označiť", + "@menuActionSelect": {}, + "menuActionSelectAll": "Označiť všetko", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "Nič neoznačiť", + "@menuActionSelectNone": {}, + "aboutBugSaveLogInstruction": "Uložiť záznamy aplikácie do súboru", + "@aboutBugSaveLogInstruction": {}, + "policyPageTitle": "Zásady súkromia", + "@policyPageTitle": {}, + "collectionActionShowTitleSearch": "Zobraziť filter", + "@collectionActionShowTitleSearch": {}, + "sectionUnknown": "Neznáme", + "@sectionUnknown": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{Nepodarilo sa presunúť položku} few{Nepodarilo sa presunúť {count} položky} other{Nepodarilo sa presunúť {count} položiek}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameFailureFeedback": "{count, plural, =1{Nepodarilo sa premenovať položku} few{Nepodarilo sa premenovať {count} položky} other{Nepodarilo sa premenovať {count} položiek}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "configureVaultDialogTitle": "Nastavenie trezoru", + "@configureVaultDialogTitle": {}, + "passwordDialogEnter": "Zadaj heslo", + "@passwordDialogEnter": {}, + "vaultDialogLockModeWhenScreenOff": "Uzamknúť pri vypnutí obrazovky", + "@vaultDialogLockModeWhenScreenOff": {}, + "passwordDialogConfirm": "Potvrď heslo", + "@passwordDialogConfirm": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP je potrebné pre prehranie videa vo vnútri pohyblivej fotky.\n\nUrčite to chceš odstrániť?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "videoStreamSelectionDialogText": "Titulky", + "@videoStreamSelectionDialogText": {}, + "genericDangerWarningDialogMessage": "Si si istý?", + "@genericDangerWarningDialogMessage": {}, + "tooManyItemsErrorDialogMessage": "Skús znova s menším počtom položiek.", + "@tooManyItemsErrorDialogMessage": {}, + "viewDialogSortSectionTitle": "Zoradiť", + "@viewDialogSortSectionTitle": {}, + "aboutBugCopyInfoInstruction": "Kopírovať systémové informácie", + "@aboutBugCopyInfoInstruction": {}, + "viewDialogGroupSectionTitle": "Zoskupiť", + "@viewDialogGroupSectionTitle": {}, + "aboutBugReportButton": "Nahlásiť", + "@aboutBugReportButton": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Odstrániť tieto albumy a položku v nich?} other{Odstrániť tieto albumy a {count} položiek v nich?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "aboutTranslatorsSectionTitle": "Prekladatelia", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesBanner": "Táto aplikácia používa nasledujúce open-source balíčky a knižnice.", + "@aboutLicensesBanner": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter Pluginy", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart Balíčky", + "@aboutLicensesDartPackagesSectionTitle": {}, + "collectionActionHideTitleSearch": "Skryť filter", + "@collectionActionHideTitleSearch": {}, + "collectionActionEdit": "Upraviť", + "@collectionActionEdit": {}, + "aboutLicensesShowAllButtonLabel": "Zobraziť všetky licencie", + "@aboutLicensesShowAllButtonLabel": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{Nepodarilo sa kopírovať položku} few{Nepodarilo sa kopírovať {count} položky} other{Nepodarilo sa kopírovať {count} položiek}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{Nepodarilo sa exportovať stránku} other{Nepodarilo sa exportovať {count} stránok}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{Položka bola premenovaná} other{Bolo premenovaných {count} položiek}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionSelectSectionTooltip": "Označiť sekciu", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Odznačiť sekciu", + "@collectionDeselectSectionTooltip": {}, + "drawerCollectionImages": "Obrázky", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Videá", + "@drawerCollectionVideos": {}, + "drawerCollectionPanoramas": "Panorámy", + "@drawerCollectionPanoramas": {}, + "sortByName": "Podľa názvu", + "@sortByName": {}, + "chipActionCreateVault": "Vytvoriť trezor", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "Nastaviť trezor", + "@chipActionConfigureVault": {}, + "menuActionMap": "Mapa", + "@menuActionMap": {}, + "menuActionSlideshow": "Prezentácia", + "@menuActionSlideshow": {}, + "menuActionStats": "Štatistiky", + "@menuActionStats": {}, + "tileLayoutMosaic": "Mozaika", + "@tileLayoutMosaic": {}, + "drawerCollectionAll": "Všetky kolekcie", + "@drawerCollectionAll": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Presunúť túto položku do koša?} other{Presunúť týchto {count} položiek do koša?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "patternDialogEnter": "Nastavenie vzoru", + "@patternDialogEnter": {}, + "patternDialogConfirm": "Potvrď vzor", + "@patternDialogConfirm": {}, + "pinDialogConfirm": "Potvrď PIN", + "@pinDialogConfirm": {}, + "authenticateToUnlockVault": "Pre odomknutie trezora je potrebné prihlásenie", + "@authenticateToUnlockVault": {}, + "vaultBinUsageDialogMessage": "Niektoré trezory používajú kôš.", + "@vaultBinUsageDialogMessage": {}, + "editEntryLocationDialogLatitude": "Zemepisná šírka", + "@editEntryLocationDialogLatitude": {}, + "aboutLinkLicense": "Licencia", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Zásady súkromia", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Nahlásenie chyby", + "@aboutBugSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter Balíčky", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "drawerAboutButton": "O aplikácií", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Nastavenia", + "@drawerSettingsButton": {}, + "drawerCollectionFavourites": "Obľúbené", + "@drawerCollectionFavourites": {}, + "tagPlaceholderCountry": "Krajina", + "@tagPlaceholderCountry": {}, + "panoramaDisableSensorControl": "Zakázať senzory", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Zdroj", + "@sourceViewerPageTitle": {}, + "aboutPageTitle": "O aplikácií", + "@aboutPageTitle": {}, + "vaultLockTypePattern": "Vzor", + "@vaultLockTypePattern": {}, + "vaultLockTypePassword": "Heslo", + "@vaultLockTypePassword": {}, + "settingsVideoEnablePip": "Obraz-v-obraze", + "@settingsVideoEnablePip": {}, + "videoResumptionModeAlways": "Vždy", + "@videoResumptionModeAlways": {}, + "widgetTapUpdateWidget": "Aktualizovať widget", + "@widgetTapUpdateWidget": {}, + "aboutDataUsageCache": "Cache", + "@aboutDataUsageCache": {}, + "maxBrightnessNever": "Nikdy", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "Vždy", + "@maxBrightnessAlways": {}, + "videoResumptionModeNever": "Nikdy", + "@videoResumptionModeNever": {}, + "albumPickPageTitlePick": "Vyber album", + "@albumPickPageTitlePick": {}, + "albumDownload": "Stiahnuť", + "@albumDownload": {}, + "overlayHistogramLuminance": "Svietivosť", + "@overlayHistogramLuminance": {}, + "storageAccessDialogMessage": "Prosím vyber {directory} - “{volume}” v ďalšom okne aby aplikácia mala prístup k dátam v priečinku.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "notEnoughSpaceDialogMessage": "Táto operácia potrebuje {neededSize} voľnej pamäti “{volume}” na dokončenie, dostupných je však iba {freeSize}.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "unsupportedTypeDialogMessage": "{count, plural, =1{Táto operácia neni podporovaná pre {types} súbor.} other{Táto operácia neni podporovaná pre {types} súbory.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "albumPickPageTitleExport": "Exportovať do albumu", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Presunúť do Albumu", + "@albumPickPageTitleMove": {}, + "overlayHistogramNone": "Žiadne", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "otherDirectoryDescription": "“{name}” priečinok", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "restrictedAccessDialogMessage": "Táto aplikácia nemôže modifikovať súbory v {directory} - “{volume}”.\n\nProsím použi predinštalovanú aplikáciu na presun súborov do iného priečinka.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "albumPickPageTitleCopy": "Kopírovať do Albumu", + "@albumPickPageTitleCopy": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "albumScreenshots": "Snímky obrazovky", + "@albumScreenshots": {}, + "albumScreenRecordings": "Nahrávania obrazovky", + "@albumScreenRecordings": {}, + "authenticateToConfigureVault": "Na konfiguráciu trezora je potrebné overenie", + "@authenticateToConfigureVault": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "settingsNavigationDrawerAddAlbum": "Pridať album", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailShowRating": "Zobraziť hodnotenie", + "@settingsThumbnailShowRating": {}, + "albumVideoCaptures": "Video záznamy", + "@albumVideoCaptures": {}, + "settingsSearchEmpty": "Žiadne vyhovujúce nastavenia", + "@settingsSearchEmpty": {}, + "settingsViewerSectionTitle": "Prehliadač", + "@settingsViewerSectionTitle": {}, + "countryEmpty": "Žiadne krajiny", + "@countryEmpty": {}, + "settingsKeepScreenOnTile": "Nevypínať obrazovku", + "@settingsKeepScreenOnTile": {}, + "appExportCovers": "Obaly", + "@appExportCovers": {}, + "createAlbumButtonLabel": "Vytvoriť", + "@createAlbumButtonLabel": {}, + "settingsThumbnailOverlayTile": "Prekrytie", + "@settingsThumbnailOverlayTile": {}, + "settingsNavigationDrawerTabPages": "Stránky", + "@settingsNavigationDrawerTabPages": {}, + "settingsConfirmationDialogTitle": "Potvrdzujúce dialógy", + "@settingsConfirmationDialogTitle": {}, + "appExportSettings": "Nastavenia", + "@appExportSettings": {}, + "searchPlacesSectionTitle": "Miesta", + "@searchPlacesSectionTitle": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Dotykom a podržaním môžete presúvať tlačidlá a vybrať, ktoré akcie sa zobrazia pri výbere položiek.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsThumbnailSectionTitle": "Miniatúry", + "@settingsThumbnailSectionTitle": {}, + "placeEmpty": "Žiadne miesta", + "@placeEmpty": {}, + "settingsCollectionQuickActionsTile": "Rýchle akcie", + "@settingsCollectionQuickActionsTile": {}, + "settingsThumbnailShowFavouriteIcon": "Zobraziť obľúbenú ikonu", + "@settingsThumbnailShowFavouriteIcon": {}, + "searchCountriesSectionTitle": "Krajiny", + "@searchCountriesSectionTitle": {}, + "settingsAskEverytime": "Vždy sa spýtať", + "@settingsAskEverytime": {}, + "searchTagsSectionTitle": "Značky", + "@searchTagsSectionTitle": {}, + "settingsModificationWarningDialogMessage": "Ostatné nastavenia budú modifikované.", + "@settingsModificationWarningDialogMessage": {}, + "settingsCollectionQuickActionEditorPageTitle": "Rýchle akcie", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsActionExport": "Exportovať", + "@settingsActionExport": {}, + "settingsThumbnailShowMotionPhotoIcon": "Zobraziť ikonu pohybujúcich sa fotiek", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRawIcon": "Zobraziť raw ikonu", + "@settingsThumbnailShowRawIcon": {}, + "tagPageTitle": "Značky", + "@tagPageTitle": {}, + "aboutCreditsSectionTitle": "Kredit", + "@aboutCreditsSectionTitle": {}, + "settingsActionImport": "Importovať", + "@settingsActionImport": {}, + "searchRatingSectionTitle": "Hodnotenia", + "@searchRatingSectionTitle": {}, + "settingsDisabled": "Zakázané", + "@settingsDisabled": {}, + "settingsActionImportDialogTitle": "Importovať", + "@settingsActionImportDialogTitle": {}, + "albumGroupTier": "Podľa úrovne", + "@albumGroupTier": {}, + "searchRecentSectionTitle": "Nedávne", + "@searchRecentSectionTitle": {}, + "searchAlbumsSectionTitle": "Albumy", + "@searchAlbumsSectionTitle": {}, + "albumEmpty": "Žiadne albumy", + "@albumEmpty": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Dotykom a podržaním môžete presúvať tlačidlá a vyberať akcie, ktoré sa zobrazia pri prehľadávaní položiek.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsConfirmationBeforeDeleteItems": "Spýtať sa pred odstránením", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsHomeDialogTitle": "Domov", + "@settingsHomeDialogTitle": {}, + "searchDateSectionTitle": "Dátum", + "@searchDateSectionTitle": {}, + "searchCollectionFieldHint": "Vyhľadávanie kolekcie", + "@searchCollectionFieldHint": {}, + "settingsDoubleBackExit": "Stlač krok späť 2 krát pre opustenie aplikácie", + "@settingsDoubleBackExit": {}, + "settingsThumbnailOverlayPageTitle": "Prekrytie", + "@settingsThumbnailOverlayPageTitle": {}, + "searchMetadataSectionTitle": "Metadáta", + "@searchMetadataSectionTitle": {}, + "settingsViewerQuickActionEditorPageTitle": "Rýchle akcie", + "@settingsViewerQuickActionEditorPageTitle": {}, + "videoStreamSelectionDialogTrack": "Stopa", + "@videoStreamSelectionDialogTrack": {}, + "settingsViewerUseCutout": "Použitie oblasti výrezu", + "@settingsViewerUseCutout": {}, + "settingsHomeTile": "Domov", + "@settingsHomeTile": {}, + "settingsViewerGestureSideTapNext": "Ťuknutím na okraje obrazovky zobrazíte predchádzajúcu/nasledujúcu položku", + "@settingsViewerGestureSideTapNext": {}, + "newFilterBanner": "Nový", + "@newFilterBanner": {}, + "settingsCollectionQuickActionTabSelecting": "Výber", + "@settingsCollectionQuickActionTabSelecting": {}, + "statePageTitle": "Štáty", + "@statePageTitle": {}, + "settingsNavigationDrawerEditorPageTitle": "Navigačné menu", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Spýtať sa pred presunom položiek bez dátumu", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "albumPageTitle": "Albumy", + "@albumPageTitle": {}, + "settingsDefault": "Predvolené", + "@settingsDefault": {}, + "placePageTitle": "Miesta", + "@placePageTitle": {}, + "tagEmpty": "Žiadne značky", + "@tagEmpty": {}, + "settingsNavigationDrawerTabTypes": "Typy", + "@settingsNavigationDrawerTabTypes": {}, + "settingsConfirmationTile": "Potvrdzujúce dialógy", + "@settingsConfirmationTile": {}, + "settingsThumbnailShowVideoDuration": "Zobraziť dĺžku videa", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionBurstPatternsNone": "Žiadny", + "@settingsCollectionBurstPatternsNone": {}, + "albumMimeTypeMixed": "Zmiešané", + "@albumMimeTypeMixed": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Dostupné tlačidlá", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorBanner": "Dotknite sa tlačidiel a podržte ich, aby ste ich presunuli a vybrali akcie, ktoré sa zobrazia v prehliadači.", + "@settingsViewerQuickActionEditorBanner": {}, + "sortOrderLowestFirst": "Od najmenšieho", + "@sortOrderLowestFirst": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Zobrazené tlačidlá", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "countryPageTitle": "Krajiny", + "@countryPageTitle": {}, + "settingsNavigationSectionTitle": "Navigácia", + "@settingsNavigationSectionTitle": {}, + "settingsNavigationDrawerTile": "Navigačné menu", + "@settingsNavigationDrawerTile": {}, + "settingsKeepScreenOnDialogTitle": "Nevypínať obrazovku", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsConfirmationAfterMoveToBinItems": "Zobraziť správu po presune položiek do koša", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsConfirmationVaultDataLoss": "Zobrazenie upozornenia na stratu údajov trezora", + "@settingsConfirmationVaultDataLoss": {}, + "settingsPageTitle": "Nastavenia", + "@settingsPageTitle": {}, + "settingsSearchFieldLabel": "Nastavenia vyhľadávania", + "@settingsSearchFieldLabel": {}, + "appExportFavourites": "Obľúbené", + "@appExportFavourites": {}, + "settingsViewerMaximumBrightness": "Maximálny jas", + "@settingsViewerMaximumBrightness": {}, + "settingsThumbnailShowTagIcon": "Zobraziť ikonu značky", + "@settingsThumbnailShowTagIcon": {}, + "settingsActionExportDialogTitle": "Exportovať", + "@settingsActionExportDialogTitle": {}, + "settingsNavigationDrawerBanner": "Dotknite sa a podržte, ak chcete presúvať a meniť poradie položiek ponuky.", + "@settingsNavigationDrawerBanner": {}, + "settingsCollectionBurstPatternsTile": "Vzory dávkového snímania", + "@settingsCollectionBurstPatternsTile": {}, + "albumGroupVolume": "Podľa objemu pamäte", + "@albumGroupVolume": {}, + "settingsImageBackground": "Obrazové pozadie", + "@settingsImageBackground": {}, + "searchStatesSectionTitle": "Štáty", + "@searchStatesSectionTitle": {}, + "settingsConfirmationBeforeMoveToBinItems": "Spýtať sa pred presunom do koša", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "stateEmpty": "Žiadne štáty", + "@stateEmpty": {}, + "settingsThumbnailShowLocationIcon": "Zobraziť ikonu pozície", + "@settingsThumbnailShowLocationIcon": {}, + "settingsViewerQuickActionEmpty": "Žiadne tlačidlá", + "@settingsViewerQuickActionEmpty": {}, + "settingsSystemDefault": "Predvolené", + "@settingsSystemDefault": {}, + "settingsMotionPhotoAutoPlay": "Automaticky prehrať pohyblivé fotografie", + "@settingsMotionPhotoAutoPlay": {}, + "settingsNavigationDrawerTabAlbums": "Albumy", + "@settingsNavigationDrawerTabAlbums": {}, + "sortOrderHighestFirst": "Od najväčšieho", + "@sortOrderHighestFirst": {}, + "settingsViewerQuickActionsTile": "Rýchle akcie", + "@settingsViewerQuickActionsTile": {}, + "binPageTitle": "Kôš", + "@binPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Prehliadanie", + "@settingsCollectionQuickActionTabBrowsing": {}, + "tagEditorSectionPlaceholders": "Zástupcovia", + "@tagEditorSectionPlaceholders": {}, + "settingsPrivacySectionTitle": "Súkromie", + "@settingsPrivacySectionTitle": {}, + "settingsEnableBinSubtitle": "Uchovávanie vymazaných položiek po dobu 30 dní", + "@settingsEnableBinSubtitle": {}, + "viewerInfoPageTitle": "Informácie", + "@viewerInfoPageTitle": {}, + "mapAttributionStamen": "[Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "wallpaperUseScrollEffect": "Používanie efektu posúvania na domovskej obrazovke", + "@wallpaperUseScrollEffect": {}, + "statsTopTagsSectionTitle": "Najlepšie značky", + "@statsTopTagsSectionTitle": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Zarovnanie textu", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsViewerSlideshowPageTitle": "Prezentácia", + "@settingsViewerSlideshowPageTitle": {}, + "viewerInfoSearchSuggestionResolution": "Rozlíšenie", + "@viewerInfoSearchSuggestionResolution": {}, + "settingsLanguageTile": "Jazyk", + "@settingsLanguageTile": {}, + "settingsAllowInstalledAppAccessSubtitle": "Slúži na zlepšenie zobrazenia albumu", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "viewerInfoLabelDate": "Dátum", + "@viewerInfoLabelDate": {}, + "settingsRemoveAnimationsDialogTitle": "Odstránenie animácií", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsSubtitleThemeTextColor": "Farba textu", + "@settingsSubtitleThemeTextColor": {}, + "settingsDisplayUseTvInterface": "Rozhranie systému Android TV", + "@settingsDisplayUseTvInterface": {}, + "settingsTimeToTakeActionTile": "Čas na vykonanie akcie", + "@settingsTimeToTakeActionTile": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "OTVORIŤ PANORÁMU", + "@viewerOpenPanoramaButtonLabel": {}, + "settingsSubtitleThemeBackgroundColor": "Farba pozadia", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsVideoAutoPlay": "Automatické prehrávanie", + "@settingsVideoAutoPlay": {}, + "settingsVideoEnableHardwareAcceleration": "Hardvérová akcelerácia", + "@settingsVideoEnableHardwareAcceleration": {}, + "viewerInfoLabelCoordinates": "Súradnice", + "@viewerInfoLabelCoordinates": {}, + "settingsSlideshowShuffle": "Náhodný výber", + "@settingsSlideshowShuffle": {}, + "openMapPageTooltip": "Zobraziť na stránke mapy", + "@openMapPageTooltip": {}, + "viewerInfoUnknown": "neznáme", + "@viewerInfoUnknown": {}, + "settingsVideoShowVideos": "Zobraziť videá", + "@settingsVideoShowVideos": {}, + "settingsViewerShowInformation": "Zobraziť informácie", + "@settingsViewerShowInformation": {}, + "settingsViewerOverlayTile": "Prekrytie", + "@settingsViewerOverlayTile": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Pozícia textu", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "viewerInfoLabelOwner": "Vlastník", + "@viewerInfoLabelOwner": {}, + "settingsSlideshowIntervalTile": "Interval", + "@settingsSlideshowIntervalTile": {}, + "settingsStorageAccessRevokeTooltip": "Odvolať", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsSubtitleThemeTile": "Titulky", + "@settingsSubtitleThemeTile": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Potiahnutím nahor alebo nadol upravíte jas/hlasitosť", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsAccessibilitySectionTitle": "Prístupnosť", + "@settingsAccessibilitySectionTitle": {}, + "viewerInfoViewXmlLinkText": "Zobraziť XML", + "@viewerInfoViewXmlLinkText": {}, + "statsTopCountriesSectionTitle": "Najlepšie krajiny", + "@statsTopCountriesSectionTitle": {}, + "viewerInfoLabelSize": "Veľkosť", + "@viewerInfoLabelSize": {}, + "settingsSlideshowFillScreen": "Vyplnenie obrazovky", + "@settingsSlideshowFillScreen": {}, + "settingsHiddenFiltersBanner": "Fotografie a videá zodpovedajúce skrytým filtrom sa nezobrazia vo vašej zbierke.", + "@settingsHiddenFiltersBanner": {}, + "viewerSetWallpaperButtonLabel": "NASTAVIŤ POZADIE", + "@viewerSetWallpaperButtonLabel": {}, + "settingsVideoResumptionModeTile": "Pokračovanie prehrávania", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Dvojitým ťuknutím spustíte prehrávanie/pozastavenie", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsWidgetDisplayedItem": "Zobrazená položka", + "@settingsWidgetDisplayedItem": {}, + "settingsEnableBin": "Používanie odpadkového koša", + "@settingsEnableBin": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Vľavo", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsVideoGestureSideDoubleTapSeek": "Dvojitým ťuknutím na okraje obrazovky môžete hľadať dozadu/dopredu", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsSubtitleThemeTextAlignmentRight": "Vpravo", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsLanguagePageTitle": "Jazyk", + "@settingsLanguagePageTitle": {}, + "settingsAllowMediaManagement": "Umožniť správu médií", + "@settingsAllowMediaManagement": {}, + "viewerErrorUnknown": "Ups!", + "@viewerErrorUnknown": {}, + "viewerInfoSearchSuggestionDate": "Dátum a čas", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoLabelTitle": "Nadpis", + "@viewerInfoLabelTitle": {}, + "settingsViewerShowInformationSubtitle": "Zobraziť nadpis, dátum, miesto, atď.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsWidgetOpenPage": "Keď ťuknete na miniaplikáciu", + "@settingsWidgetOpenPage": {}, + "viewerInfoSearchFieldLabel": "Prehľadávať metadáta", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoLabelDescription": "Popis", + "@viewerInfoLabelDescription": {}, + "settingsSlideshowRepeat": "Opakovať", + "@settingsSlideshowRepeat": {}, + "settingsVideoPageTitle": "Nastavenia videa", + "@settingsVideoPageTitle": {}, + "tagEditorPageTitle": "Upraviť štítky", + "@tagEditorPageTitle": {}, + "settingsWidgetShowOutline": "Obrys", + "@settingsWidgetShowOutline": {}, + "settingsSubtitleThemeTextAlignmentCenter": "V strede", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentTile": "Zarovnanie textu", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsAllowErrorReporting": "Povolenie anonymného hlásenia chýb", + "@settingsAllowErrorReporting": {}, + "settingsVideoLoopModeTile": "Režim slučky", + "@settingsVideoLoopModeTile": {}, + "settingsScreenSaverPageTitle": "Šetrič obrazovky", + "@settingsScreenSaverPageTitle": {}, + "statsWithGps": "{count, plural, =1{1 položka s polohou} other{{count} položiek s polohami}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsVideoResumptionModeDialogTitle": "Pokračovanie prehrávania", + "@settingsVideoResumptionModeDialogTitle": {}, + "mapStyleDialogTitle": "Štýl mapy", + "@mapStyleDialogTitle": {}, + "settingsVideoBackgroundMode": "Režim na pozadí", + "@settingsVideoBackgroundMode": {}, + "settingsAllowInstalledAppAccess": "Povolenie prístupu k inventáru aplikácií", + "@settingsAllowInstalledAppAccess": {}, + "settingsSlideshowAnimatedZoomEffect": "Animovaný efekt priblíženia", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsDisplayRefreshRateModeTile": "Obnovovacia frekvencia displeja", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsViewerOverlayPageTitle": "Prekrytie", + "@settingsViewerOverlayPageTitle": {}, + "settingsCoordinateFormatDialogTitle": "Formát súradníc", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsHiddenItemsTile": "Skryté položky", + "@settingsHiddenItemsTile": {}, + "settingsViewerShowDescription": "Zobraziť popis", + "@settingsViewerShowDescription": {}, + "settingsUnitSystemTile": "Jednotky", + "@settingsUnitSystemTile": {}, + "settingsCoordinateFormatTile": "Formát súradníc", + "@settingsCoordinateFormatTile": {}, + "mapZoomInTooltip": "Priblížiť", + "@mapZoomInTooltip": {}, + "viewerInfoOpenLinkText": "Otvoriť", + "@viewerInfoOpenLinkText": {}, + "settingsDisablingBinWarningDialogMessage": "Položky v koši budú navždy vymazané.", + "@settingsDisablingBinWarningDialogMessage": {}, + "statsTopStatesSectionTitle": "Najlepšie Štáty", + "@statsTopStatesSectionTitle": {}, + "settingsVideoPlaybackPageTitle": "Prehrávanie", + "@settingsVideoPlaybackPageTitle": {}, + "mapStyleTooltip": "Vybrať štýl mapy", + "@mapStyleTooltip": {}, + "viewerErrorDoesNotExist": "Súbor už neexistuje.", + "@viewerErrorDoesNotExist": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Obnovovacia frekvencia", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "mapZoomOutTooltip": "Oddialiť", + "@mapZoomOutTooltip": {}, + "mapAttributionOsmHot": "[HOT](https://www.hotosm.org/) • Hosťuje [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "settingsHiddenItemsPageTitle": "Skryté položky", + "@settingsHiddenItemsPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "Zobraziť pri otvorení", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Zobrazenie alternatív viacdotykových gest", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsViewerShowShootingDetails": "Zobraziť podrobnosti o snímaní", + "@settingsViewerShowShootingDetails": {}, + "settingsLanguageSectionTitle": "Jazyk a formáty", + "@settingsLanguageSectionTitle": {}, + "settingsDisplaySectionTitle": "Displej", + "@settingsDisplaySectionTitle": {}, + "settingsSlideshowTransitionTile": "Prechod", + "@settingsSlideshowTransitionTile": {}, + "settingsStorageAccessEmpty": "Žiadne povolené prístupy", + "@settingsStorageAccessEmpty": {}, + "settingsRemoveAnimationsTile": "Odstránenie animácií", + "@settingsRemoveAnimationsTile": {}, + "settingsStorageAccessBanner": "Niektoré adresáre vyžadujú explicitné udelenie prístupu na úpravu súborov v nich. Tu si môžete prezrieť adresáre, ku ktorým ste predtým udelili prístup.", + "@settingsStorageAccessBanner": {}, + "settingsWidgetPageTitle": "Fotorámik", + "@settingsWidgetPageTitle": {}, + "settingsViewerShowMinimap": "Zobraziť minimapu", + "@settingsViewerShowMinimap": {}, + "viewerInfoLabelPath": "Cesta", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelResolution": "Rozlíšenie", + "@viewerInfoLabelResolution": {}, + "statsTopAlbumsSectionTitle": "Najlepšie albumy", + "@statsTopAlbumsSectionTitle": {}, + "viewerInfoLabelDuration": "Trvanie", + "@viewerInfoLabelDuration": {}, + "statsPageTitle": "Štatistiky", + "@statsPageTitle": {}, + "viewerInfoSearchSuggestionDimensions": "Rozmery", + "@viewerInfoSearchSuggestionDimensions": {}, + "statsTopPlacesSectionTitle": "Najlepšie miesta", + "@statsTopPlacesSectionTitle": {}, + "settingsVideoLoopModeDialogTitle": "Režim slučky", + "@settingsVideoLoopModeDialogTitle": {}, + "viewerInfoSearchSuggestionDescription": "Popis", + "@viewerInfoSearchSuggestionDescription": {}, + "settingsViewerShowOverlayThumbnails": "Zobraziť miniatúry", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsVideoControlsPageTitle": "Ovládacie prvky", + "@settingsVideoControlsPageTitle": {}, + "settingsUnitSystemDialogTitle": "Jednotky", + "@settingsUnitSystemDialogTitle": {}, + "settingsSlideshowVideoPlaybackTile": "Prehrávanie videa", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsHiddenFiltersEmpty": "Žiadne skryté filtre", + "@settingsHiddenFiltersEmpty": {}, + "viewerInfoSearchEmpty": "Žiadne zodpovedajúce kľúče", + "@viewerInfoSearchEmpty": {}, + "settingsStorageAccessPageTitle": "Prístup k úložisku", + "@settingsStorageAccessPageTitle": {}, + "settingsThemeEnableDynamicColor": "Dynamická farba", + "@settingsThemeEnableDynamicColor": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Nepodarilo sa extrahovať vložené údaje", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "settingsSubtitleThemeBackgroundOpacity": "Ne/priehľadnosť pozadia", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsStorageAccessTile": "Prístup k úložisku", + "@settingsStorageAccessTile": {}, + "settingsThemeBrightnessTile": "Téma", + "@settingsThemeBrightnessTile": {}, + "viewerInfoBackToViewerTooltip": "Späť na prehliadač", + "@viewerInfoBackToViewerTooltip": {}, + "settingsViewerSlideshowTile": "Prezentácia", + "@settingsViewerSlideshowTile": {}, + "settingsCollectionTile": "Kolekcia", + "@settingsCollectionTile": {}, + "settingsSubtitleThemeTextOpacity": "Ne/priehľadnosť textu", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsViewerShowRatingTags": "Zobraziť hodnotenie a štítky", + "@settingsViewerShowRatingTags": {}, + "settingsViewerEnableOverlayBlurEffect": "Efekt rozmazania", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsVideoControlsTile": "Ovládacie prvky", + "@settingsVideoControlsTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Prehrávanie videa", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsSubtitleThemeShowOutline": "Zobrazenie obrysu a tieňa", + "@settingsSubtitleThemeShowOutline": {}, + "mapEmptyRegion": "Žiadne obrázky v tejto oblasti", + "@mapEmptyRegion": {}, + "settingsThemeBrightnessDialogTitle": "Téma", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsSubtitleThemePageTitle": "Titulky", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeTextPositionTile": "Pozícia textu", + "@settingsSubtitleThemeTextPositionTile": {}, + "viewerInfoLabelAddress": "Adresa", + "@viewerInfoLabelAddress": {}, + "settingsVideoBackgroundModeDialogTitle": "Režim na pozadí", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Veľkosť textu", + "@settingsSubtitleThemeTextSize": {}, + "settingsThemeColorHighlights": "Farebné zvýraznenia", + "@settingsThemeColorHighlights": {}, + "viewerInfoSearchSuggestionRights": "Práva", + "@viewerInfoSearchSuggestionRights": {}, + "mapPointNorthUpTooltip": "Nastaviť sever nahor", + "@mapPointNorthUpTooltip": {}, + "settingsVideoButtonsTile": "Tlačidlá", + "@settingsVideoButtonsTile": {}, + "settingsSubtitleThemeSample": "Toto je ukážka.", + "@settingsSubtitleThemeSample": {}, + "settingsSaveSearchHistory": "Uložiť históriu vyhľadávania", + "@settingsSaveSearchHistory": {}, + "settingsViewerShowHistogram": "Zobraziť histogram", + "@settingsViewerShowHistogram": {}, + "settingsVideoPlaybackTile": "Prehrávanie", + "@settingsVideoPlaybackTile": {}, + "entryActionCast": "Krúžky", + "@entryActionCast": {}, + "aboutDataUsageClearCache": "Vymazať cache", + "@aboutDataUsageClearCache": {}, + "castDialogTitle": "Cast zariadenia", + "@castDialogTitle": {}, + "collectionActionSetHome": "Nastaviť ako doma", + "@collectionActionSetHome": {}, + "settingsThumbnailShowHdrIcon": "Zobraziť ikonu HDR", + "@settingsThumbnailShowHdrIcon": {}, + "chipActionShowCollection": "Zobraziť v kolekcií", + "@chipActionShowCollection": {}, + "videoActionABRepeat": "Opakovanie A-B", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "Nastaviť začiatok", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "Nastaviť koniec", + "@videoRepeatActionSetEnd": {}, + "settingsForceWesternArabicNumeralsTile": "Vynútiť arabské číslice", + "@settingsForceWesternArabicNumeralsTile": {}, + "stopTooltip": "Zastaviť", + "@stopTooltip": {}, + "renameProcessorHash": "Hash", + "@renameProcessorHash": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "sortByDuration": "Trvanie", + "@sortByDuration": {}, + "sortOrderShortestFirst": "Najkratší prvý", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "Najdlhšie prvý", + "@sortOrderLongestFirst": {}, + "explorerActionSelectStorageVolume": "Vyberte skladovanie", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "Vyberte uloženie", + "@selectStorageVolumeDialogTitle": {}, + "setHomeCustom": "Vlastné", + "@setHomeCustom": {}, + "chipActionGoToExplorerPage": "Zobraziť v Explorer", + "@chipActionGoToExplorerPage": {}, + "explorerPageTitle": "Prieskumník", + "@explorerPageTitle": {}, + "mapAttributionOsmData": "Údaje máp © [OpenStreetMap](https://www.openstreetmap.org/copyright) prispievatelia", + "@mapAttributionOsmData": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) Dlaždice podľa [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "mapStyleOsmLiberty": "OSM Slobody", + "@mapStyleOsmLiberty": {}, + "mapAttributionOsmLiberty": "Dlaždice podľa [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hostovaný [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "videoActionShowPreviousFrame": "Zobraziť predchádzajúci rám", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "Zobraziť ďalší rám", + "@videoActionShowNextFrame": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Album už existuje", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "appExportDynamicAlbums": "Dynamické albumy", + "@appExportDynamicAlbums": {}, + "collectionActionAddDynamicAlbum": "Pridať dynamický album", + "@collectionActionAddDynamicAlbum": {}, + "chipActionRemove": "Odstrániť", + "@chipActionRemove": {}, + "albumTierDynamic": "Dynamické", + "@albumTierDynamic": {}, + "newDynamicAlbumDialogTitle": "Nový dynamický album", + "@newDynamicAlbumDialogTitle": {}, + "dynamicAlbumAlreadyExists": "Dynamický album už existuje", + "@dynamicAlbumAlreadyExists": {}, + "chipActionDecompose": "Rozdeliť", + "@chipActionDecompose": {}, + "createButtonLabel": "VYTVORIŤ", + "@createButtonLabel": {}, + "chipActionGroup": "Zmeniť skupinu", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Vytvorenie skupiny", + "@chipActionCreateGroup": {}, + "albumTierGroups": "Skupiny", + "@albumTierGroups": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "newGroupDialogTitle": "Nová skupina", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Názov skupiny", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "Skupina už existuje", + "@groupAlreadyExists": {}, + "groupEmpty": "Žiadne skupiny", + "@groupEmpty": {} +} diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb new file mode 100644 index 0000000..79b155d --- /dev/null +++ b/lib/l10n/app_sl.arb @@ -0,0 +1,10 @@ +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Dobrodošli v Avesu", + "@welcomeMessage": {}, + "welcomeOptional": "Izbirno", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Sprejmem pogoje uporabe", + "@welcomeTermsToggle": {} +} diff --git a/lib/l10n/app_sr.arb b/lib/l10n/app_sr.arb new file mode 100644 index 0000000..75c7b9b --- /dev/null +++ b/lib/l10n/app_sr.arb @@ -0,0 +1,8 @@ +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Добродошли у Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Izborno", + "@welcomeOptional": {} +} diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb new file mode 100644 index 0000000..7232c29 --- /dev/null +++ b/lib/l10n/app_sv.arb @@ -0,0 +1,1659 @@ +{ + "viewerActionLock": "Lås bildvisaren", + "@viewerActionLock": {}, + "entryInfoActionEditTags": "Redigera etiketter", + "@entryInfoActionEditTags": {}, + "videoActionPlay": "Spela", + "@videoActionPlay": {}, + "viewerActionSettings": "Inställningar", + "@viewerActionSettings": {}, + "albumTierSpecial": "Vanliga", + "@albumTierSpecial": {}, + "displayRefreshRatePreferLowest": "Lägsta intervall", + "@displayRefreshRatePreferLowest": {}, + "keepScreenOnViewerOnly": "Endast på bildvisningssidan", + "@keepScreenOnViewerOnly": {}, + "mapStyleOsmHot": "Humanitär OSM", + "@mapStyleOsmHot": {}, + "videoResumptionModeAlways": "Alltid", + "@videoResumptionModeAlways": {}, + "storageVolumeDescriptionFallbackPrimary": "Intern lagring", + "@storageVolumeDescriptionFallbackPrimary": {}, + "widgetOpenPageCollection": "Öppna samling", + "@widgetOpenPageCollection": {}, + "widgetTapUpdateWidget": "Uppdatera widgeten", + "@widgetTapUpdateWidget": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD kort", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "welcomeTermsToggle": "Jag godkänner användarvillkoren", + "@welcomeTermsToggle": {}, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "deleteButtonLabel": "Ta bort", + "@deleteButtonLabel": {}, + "showButtonLabel": "VISA", + "@showButtonLabel": {}, + "hideButtonLabel": "GÖM", + "@hideButtonLabel": {}, + "continueButtonLabel": "FORTSÄTT", + "@continueButtonLabel": {}, + "saveCopyButtonLabel": "Spara kopia", + "@saveCopyButtonLabel": {}, + "changeTooltip": "Ändra", + "@changeTooltip": {}, + "clearTooltip": "Rensa", + "@clearTooltip": {}, + "previousTooltip": "Föregående", + "@previousTooltip": {}, + "showTooltip": "Visa", + "@showTooltip": {}, + "hideTooltip": "Göm", + "@hideTooltip": {}, + "actionRemove": "Ta bort", + "@actionRemove": {}, + "resetTooltip": "Återställ", + "@resetTooltip": {}, + "saveTooltip": "Spara", + "@saveTooltip": {}, + "pickTooltip": "Välj", + "@pickTooltip": {}, + "sourceStateLocatingCountries": "Lokaliserar länder", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Lokaliserar platser", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Ta bort", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Visa i Album", + "@chipActionGoToAlbumPage": {}, + "welcomeOptional": "Valfritt", + "@welcomeOptional": {}, + "applyButtonLabel": "TILLÄMPA", + "@applyButtonLabel": {}, + "applyTooltip": "Tillämpa", + "@applyTooltip": {}, + "cancelTooltip": "Avbryt", + "@cancelTooltip": {}, + "doubleBackExitMessage": "Tryck ”bakåt” igen för att stänga.", + "@doubleBackExitMessage": {}, + "chipActionGoToCountryPage": "Visa i Länder", + "@chipActionGoToCountryPage": {}, + "chipActionGoToPlacePage": "Visa i Platser", + "@chipActionGoToPlacePage": {}, + "chipActionGoToTagPage": "Visa på Etikettsidan", + "@chipActionGoToTagPage": {}, + "chipActionFilterOut": "Filtrera ut", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Filtrera fram", + "@chipActionFilterIn": {}, + "chipActionHide": "Göm", + "@chipActionHide": {}, + "chipActionLock": "Lås", + "@chipActionLock": {}, + "itemCount": "{count, plural, other{{count} objekt}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "columnCount": "{count, plural, =1{{count} kolumn} other{{count} kolumner}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeSeconds": "{count, plural, =1{{count} sekund} other{{count} sekunder}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "timeMinutes": "{count, plural, =1{{count} minut} other{{count} minuter}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "timeDays": "{count, plural, =1{{count} dag} other{{count} dagar}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "chipActionPin": "Fäst överst", + "@chipActionPin": {}, + "chipActionRename": "Byt namn", + "@chipActionRename": {}, + "chipActionSetCover": "Välj som omslag", + "@chipActionSetCover": {}, + "chipActionShowCountryStates": "Visa delstater", + "@chipActionShowCountryStates": {}, + "chipActionCreateAlbum": "Skapa album", + "@chipActionCreateAlbum": {}, + "chipActionCreateVault": "Skapa valv", + "@chipActionCreateVault": {}, + "chipActionConfigureVault": "Konfigurera valv", + "@chipActionConfigureVault": {}, + "entryActionConvert": "Konvertera", + "@entryActionConvert": {}, + "entryActionExport": "Exportera", + "@entryActionExport": {}, + "entryActionInfo": "Info", + "@entryActionInfo": {}, + "entryActionRename": "Byt namn", + "@entryActionRename": {}, + "entryActionRestore": "Återställ", + "@entryActionRestore": {}, + "entryActionRotateCCW": "Rotera moturs", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Rotera medurs", + "@entryActionRotateCW": {}, + "entryActionFlip": "Vrid horisontellt", + "@entryActionFlip": {}, + "entryActionPrint": "Skriv ut", + "@entryActionPrint": {}, + "entryActionShare": "Dela", + "@entryActionShare": {}, + "entryActionShareImageOnly": "Dela endast bild", + "@entryActionShareImageOnly": {}, + "entryActionShareVideoOnly": "Dela endast video", + "@entryActionShareVideoOnly": {}, + "entryActionViewSource": "Visa källa", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "Visa som kartöverlägg", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Konvertera till stillbild", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Öppna video", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Redigera", + "@entryActionEdit": {}, + "entryActionOpen": "Öppna med", + "@entryActionOpen": {}, + "entryActionSetAs": "Välj som", + "@entryActionSetAs": {}, + "entryActionOpenMap": "Visa i kartappen", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Rotera skärmen", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Lägg till i favoritlistan", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Ta bort från favoritlistan", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Fånga stillbild", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Ljud av", + "@videoActionMute": {}, + "videoActionUnmute": "Ljud på", + "@videoActionUnmute": {}, + "videoActionPause": "Pausa", + "@videoActionPause": {}, + "videoActionReplay10": "Spola tillbaks 10 sekunder", + "@videoActionReplay10": {}, + "videoActionSkip10": "Spola framåt 10 sekunder", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Välj spår", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Uppspelningshastighet", + "@videoActionSetSpeed": {}, + "entryActionDelete": "Radera", + "@entryActionDelete": {}, + "entryActionCopyToClipboard": "Kopiera till klippboken", + "@entryActionCopyToClipboard": {}, + "viewerActionUnlock": "Lås upp bildvisaren", + "@viewerActionUnlock": {}, + "slideshowActionResume": "Återuppta", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Visa i Samling", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Redigera datum & tid", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Redigera plats", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "Redigera titel & beskrivning", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Redigera omdöme", + "@entryInfoActionEditRating": {}, + "entryInfoActionRemoveMetadata": "Ta bort metadata", + "@entryInfoActionRemoveMetadata": {}, + "entryInfoActionExportMetadata": "Exportera metadata", + "@entryInfoActionExportMetadata": {}, + "entryInfoActionRemoveLocation": "Ta bort plats", + "@entryInfoActionRemoveLocation": {}, + "editorActionTransform": "Transformera", + "@editorActionTransform": {}, + "editorTransformCrop": "Beskär", + "@editorTransformCrop": {}, + "editorTransformRotate": "Rotera", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Fri", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Original", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Fyrkant", + "@cropAspectRatioSquare": {}, + "filterAspectRatioLandscapeLabel": "Liggande bilder", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "Stående bilder", + "@filterAspectRatioPortraitLabel": {}, + "filterBinLabel": "Papperskorg", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Favorit", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Odaterad", + "@filterNoDateLabel": {}, + "filterNoAddressLabel": "Ingen adress", + "@filterNoAddressLabel": {}, + "filterLocatedLabel": "Belägen", + "@filterLocatedLabel": {}, + "filterNoLocationLabel": "Oplacerad", + "@filterNoLocationLabel": {}, + "filterNoTagLabel": "Inga etiketter tillagda", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Obetitlad", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "På den här dagen", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Nyligen tillagda", + "@filterRecentlyAddedLabel": {}, + "filterRatingRejectedLabel": "Avisad", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Animerad", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "Rörelsefoto", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° Video", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Bild", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "accessibilityAnimationsRemove": "Förhindra skärmeffekter", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Behåll skärmeffekter", + "@accessibilityAnimationsKeep": {}, + "albumTierNew": "Ny", + "@albumTierNew": {}, + "albumTierPinned": "Fastnålad", + "@albumTierPinned": {}, + "albumTierApps": "Appar", + "@albumTierApps": {}, + "albumTierVaults": "Valv", + "@albumTierVaults": {}, + "albumTierRegular": "Andra", + "@albumTierRegular": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Decimalgrader", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "Ö", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "V", + "@coordinateDmsWest": {}, + "displayRefreshRatePreferHighest": "Högsta intervall", + "@displayRefreshRatePreferHighest": {}, + "keepScreenOnVideoPlayback": "Under videouppspelning", + "@keepScreenOnVideoPlayback": {}, + "keepScreenOnAlways": "Alltid", + "@keepScreenOnAlways": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (Hybrid)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (Terräng)", + "@mapStyleGoogleTerrain": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (Akvarell)", + "@mapStyleStamenWatercolor": {}, + "maxBrightnessNever": "Aldrig", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "Alltid", + "@maxBrightnessAlways": {}, + "nameConflictStrategyRename": "Byt namn", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Ersätt", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Skippa", + "@nameConflictStrategySkip": {}, + "overlayHistogramNone": "Igen", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "overlayHistogramLuminance": "Luminans", + "@overlayHistogramLuminance": {}, + "subtitlePositionBottom": "Nederkant", + "@subtitlePositionBottom": {}, + "subtitlePositionTop": "Överkant", + "@subtitlePositionTop": {}, + "themeBrightnessLight": "Ljus", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Mörk", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Svart", + "@themeBrightnessBlack": {}, + "unitSystemMetric": "Metriska", + "@unitSystemMetric": {}, + "unitSystemImperial": "Brittiskt", + "@unitSystemImperial": {}, + "vaultLockTypePattern": "Mönster", + "@vaultLockTypePattern": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "vaultLockTypePassword": "Lösenord", + "@vaultLockTypePassword": {}, + "settingsVideoEnablePip": "Bild-i-bild", + "@settingsVideoEnablePip": {}, + "videoControlsPlayOutside": "Öppna med annan spelare", + "@videoControlsPlayOutside": {}, + "videoLoopModeNever": "Aldrig", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "Bara korta videor", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "Alltid", + "@videoLoopModeAlways": {}, + "videoPlaybackSkip": "Skippa", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Spela ljudlös", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Spela med ljud", + "@videoPlaybackWithSound": {}, + "videoResumptionModeNever": "Aldrig", + "@videoResumptionModeNever": {}, + "viewerTransitionSlide": "Glid", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Parallax", + "@viewerTransitionParallax": {}, + "viewerTransitionNone": "Igen", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Hemskärm", + "@wallpaperTargetHome": {}, + "widgetDisplayedItemRandom": "Slumpartat", + "@widgetDisplayedItemRandom": {}, + "widgetDisplayedItemMostRecent": "Det senaste", + "@widgetDisplayedItemMostRecent": {}, + "widgetOpenPageHome": "Öppna startsida", + "@widgetOpenPageHome": {}, + "otherDirectoryDescription": "”{name}”-katalogen", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "storageAccessDialogMessage": "Vänligen välj {directory} i ”{volume}” på nästa skärm för att ge appen åtkomst till den.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "videoStartOverButtonLabel": "BÖRJA OM", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "ÅTERUPPTA", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Senaste objektet", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Auto", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Anpassad", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "Matchande foton och videor kommer att döljas från din samling. Du kan välja att visa dem igen från ”sekretessinställningarna”.\n\nÄr du säker på att du vill dölja dem?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "Nytt Album", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Katalogen existerar redan", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Lagring:", + "@newAlbumDialogStorageLabel": {}, + "newVaultDialogTitle": "Nytt Valv", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "Konfigurera Valv", + "@configureVaultDialogTitle": {}, + "vaultDialogLockTypeLabel": "Lås typ", + "@vaultDialogLockTypeLabel": {}, + "pinDialogConfirm": "Bekräfta pinkod", + "@pinDialogConfirm": {}, + "pinDialogEnter": "Ange Pinkod", + "@pinDialogEnter": {}, + "passwordDialogEnter": "Ange lösenord", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Bekräfta lösenord", + "@passwordDialogConfirm": {}, + "authenticateToConfigureVault": "Verifiera dig för att konfigurera valvet", + "@authenticateToConfigureVault": {}, + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Välkommen till Aves", + "@welcomeMessage": {}, + "nextButtonLabel": "NÄSTA", + "@nextButtonLabel": {}, + "nextTooltip": "Nästa", + "@nextTooltip": {}, + "doNotAskAgain": "Fråga inte igen", + "@doNotAskAgain": {}, + "sourceStateLoading": "Laddar", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Katalogiserar", + "@sourceStateCataloguing": {}, + "editEntryLocationDialogLongitude": "Longitud", + "@editEntryLocationDialogLongitude": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP behövs för att spela upp videon i ett Rörelsefoto.\n\nÄr du säker att du vill ta bort det?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "videoStreamSelectionDialogOff": "Av", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Spår", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "Det finns inga andra spår.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "Klar!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Misslyckad", + "@genericFailureFeedback": {}, + "genericDangerWarningDialogMessage": "Är du säker?", + "@genericDangerWarningDialogMessage": {}, + "tooManyItemsErrorDialogMessage": "Försök ingen med färre objekt.", + "@tooManyItemsErrorDialogMessage": {}, + "menuActionConfigureView": "Visa", + "@menuActionConfigureView": {}, + "menuActionSelectAll": "Välj alla", + "@menuActionSelectAll": {}, + "menuActionSelect": "Välj", + "@menuActionSelect": {}, + "menuActionSelectNone": "Välj ingen", + "@menuActionSelectNone": {}, + "menuActionMap": "Karta", + "@menuActionMap": {}, + "menuActionSlideshow": "Bildspel", + "@menuActionSlideshow": {}, + "menuActionStats": "Statistik", + "@menuActionStats": {}, + "filterNoRatingLabel": "Obedömd", + "@filterNoRatingLabel": {}, + "viewerTransitionZoomIn": "Zooma in", + "@viewerTransitionZoomIn": {}, + "nameConflictDialogSingleSourceMessage": "Vissa filer i destinationsmappen har samma namn.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "Vissa filer har samma namn.", + "@nameConflictDialogMultipleSourceMessage": {}, + "noMatchingAppDialogMessage": "Det finns inga applikationer som kan hantera detta.", + "@noMatchingAppDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Spara datum", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Vill du återuppta uppspelningen vid tidpunkten {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "newAlbumDialogNameLabel": "Album namn", + "@newAlbumDialogNameLabel": {}, + "newVaultWarningDialogMessage": "Objekt i valv är endast tillgängliga i denna app och inga andra.\n\nOm du avinstallerar den här appen eller rensar appens data kommer du att förlora alla dessa objekt.", + "@newVaultWarningDialogMessage": {}, + "vaultDialogLockModeWhenScreenOff": "Lås när skärmen stängs av", + "@vaultDialogLockModeWhenScreenOff": {}, + "patternDialogEnter": "Ange mönster", + "@patternDialogEnter": {}, + "patternDialogConfirm": "Bekräfta mönster", + "@patternDialogConfirm": {}, + "renameEntrySetPagePatternFieldLabel": "Namngivningsmönster", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Infoga fällt", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Förhandsgranska", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorName": "Namn", + "@renameProcessorName": {}, + "exportEntryDialogFormat": "Format:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Bredd", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Höjd", + "@exportEntryDialogHeight": {}, + "exportEntryDialogQuality": "Kvalitet", + "@exportEntryDialogQuality": {}, + "exportEntryDialogWriteMetadata": "Registrera metadata", + "@exportEntryDialogWriteMetadata": {}, + "renameEntryDialogLabel": "Nytt namn", + "@renameEntryDialogLabel": {}, + "editEntryDialogCopyFromItem": "Kopiera från annat objekt", + "@editEntryDialogCopyFromItem": {}, + "editEntryDateDialogTitle": "Datum & Tid", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogExtractFromTitle": "Extrahera från titel", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Förskjut", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "Datum då filen ändrades", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "Timmar", + "@durationDialogHours": {}, + "durationDialogMinutes": "Minuter", + "@durationDialogMinutes": {}, + "durationDialogSeconds": "Sekunder", + "@durationDialogSeconds": {}, + "editEntryLocationDialogTitle": "Plats", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogChooseOnMap": "Välj på karta", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "Latitud", + "@editEntryLocationDialogLatitude": {}, + "locationPickerUseThisLocationButton": "Använd den här platsen", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "Omdöme", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Borttagning av metadata", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "Mer", + "@removeEntryMetadataDialogMore": {}, + "videoSpeedDialogLabel": "Uppspelningshastighet", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Ljud", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Undertexter", + "@videoStreamSelectionDialogText": {}, + "aboutBugReportInstruction": "Rapportera på GitHub tillsammans med bifogade loggar och systeminformation", + "@aboutBugReportInstruction": {}, + "aboutDataUsageInternal": "Internt", + "@aboutDataUsageInternal": {}, + "aboutLicensesBanner": "Den här applikationen använder följande paket och bibliotek under öppen källkod-licens.", + "@aboutLicensesBanner": {}, + "collectionPickPageTitle": "Välj", + "@collectionPickPageTitle": {}, + "aboutBugCopyInfoButton": "Kopiera", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportButton": "Rapportera", + "@aboutBugReportButton": {}, + "aboutDataUsageData": "Data", + "@aboutDataUsageData": {}, + "aboutDataUsageSectionTitle": "DataAnvänding", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageCache": "Cache", + "@aboutDataUsageCache": {}, + "aboutDataUsageDatabase": "Databas", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageMisc": "Diverse", + "@aboutDataUsageMisc": {}, + "aboutDataUsageExternal": "Externt", + "@aboutDataUsageExternal": {}, + "aboutDataUsageClearCache": "Rensa Cacheminnet", + "@aboutDataUsageClearCache": {}, + "aboutCreditsWorldAtlas1": "Den här appen använder en TopoJSON fil från", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "under ISC Licens.", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Översättare", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Öppen-Källkod Licenser", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android Bibliotek", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter-programtillägg", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "collectionPageTitle": "Samling", + "@collectionPageTitle": {}, + "collectionSelectPageTitle": "Välj objekt", + "@collectionSelectPageTitle": {}, + "collectionActionEmptyBin": "Töm papperskorgen", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "kopiera till album", + "@collectionActionCopy": {}, + "collectionActionMove": "Flytta till album", + "@collectionActionMove": {}, + "viewDialogSortSectionTitle": "Sortera", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "Sektioner", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Layout", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "Omvänd sorteringsordning", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "Mosaik", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "Rutnät", + "@tileLayoutGrid": {}, + "tileLayoutList": "Lista", + "@tileLayoutList": {}, + "coverDialogTabCover": "Omslag", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "App", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Färg", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Välj App", + "@appPickDialogTitle": {}, + "appPickDialogNone": "Igen", + "@appPickDialogNone": {}, + "aboutPageTitle": "Om", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Licens", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "IntegritetsPolicy", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Felrapport", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Spara appens log till en fil", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Kopiera systemInformation", + "@aboutBugCopyInfoInstruction": {}, + "aboutLicensesShowAllButtonLabel": "Visa alla licenser", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "IntegritetsPolicy", + "@policyPageTitle": {}, + "collectionActionHideTitleSearch": "Göm titelfilter", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Lägg till genväg", + "@collectionActionAddShortcut": {}, + "collectionActionRescan": "Scanna om", + "@collectionActionRescan": {}, + "collectionActionEdit": "Redigera", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Sök titlar", + "@collectionSearchTitlesHintText": {}, + "dateYesterday": "Igår", + "@dateYesterday": {}, + "dateThisMonth": "Den här månaden", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, other{Misslyckades med att ta bort {count} objekt}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopyFailureFeedback": "{count, plural, =1{Misslyckades med att kopiera 1 objekt} other{Misslyckades med att kopiera {count} objekt}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{Misslyckades med att flytta 1 objekt} other{Misslyckades med att flytta {count} objekt}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameFailureFeedback": "{count, plural, =1{Misslyckades med att byta namn på 1 objekt} other{Misslyckades med att byta namn på {count} objekt}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyFavourites": "Inga favoriter", + "@collectionEmptyFavourites": {}, + "collectionEmptyGrantAccessButtonLabel": "Bevilja åtkomst", + "@collectionEmptyGrantAccessButtonLabel": {}, + "sortOrderLargestFirst": "Störst först", + "@sortOrderLargestFirst": {}, + "sortByDate": "Efter datum", + "@sortByDate": {}, + "sortOrderSmallestFirst": "Minst först", + "@sortOrderSmallestFirst": {}, + "wallpaperTargetLock": "Låsskärm", + "@wallpaperTargetLock": {}, + "entryActionCast": "Casta", + "@entryActionCast": {}, + "filterTaggedLabel": "Taggad", + "@filterTaggedLabel": {}, + "keepScreenOnNever": "Aldrig", + "@keepScreenOnNever": {}, + "viewerTransitionFade": "Tona ut", + "@viewerTransitionFade": {}, + "wallpaperTargetHomeLock": "Hem och låsskärmar", + "@wallpaperTargetHomeLock": {}, + "missingSystemFilePickerDialogMessage": "Systemets filväljare saknas eller har inaktiverats. Vänligen aktivera denna och försök igen.", + "@missingSystemFilePickerDialogMessage": {}, + "renameProcessorCounter": "Numrering", + "@renameProcessorCounter": {}, + "editEntryLocationDialogSetCustom": "Ange plats manuellt", + "@editEntryLocationDialogSetCustom": {}, + "collectionGroupAlbum": "Efter album", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Efter månad", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Efter dag", + "@collectionGroupDay": {}, + "sectionUnknown": "Okänd", + "@sectionUnknown": {}, + "dateToday": "Idag", + "@dateToday": {}, + "collectionActionSetHome": "Välj som startsida", + "@collectionActionSetHome": {}, + "collectionEmptyVideos": "Inga videor", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "Inga bilder", + "@collectionEmptyImages": {}, + "drawerCollectionMotionPhotos": "Rörelsefoton", + "@drawerCollectionMotionPhotos": {}, + "drawerAboutButton": "Om", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Inställningar", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "Hela samlingen", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Favoriter", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Bilder", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Videor", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "Animerade", + "@drawerCollectionAnimated": {}, + "collectionDeselectSectionTooltip": "Avmarkera sektion", + "@collectionDeselectSectionTooltip": {}, + "drawerCollectionPanoramas": "Panoraman", + "@drawerCollectionPanoramas": {}, + "collectionSelectSectionTooltip": "Markera sektion", + "@collectionSelectSectionTooltip": {}, + "drawerCollectionRaws": "Bilder i råformat", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "360°-Videor", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Album", + "@drawerAlbumPage": {}, + "drawerCountryPage": "Länder", + "@drawerCountryPage": {}, + "drawerPlacePage": "Platser", + "@drawerPlacePage": {}, + "drawerTagPage": "Etiketter", + "@drawerTagPage": {}, + "sortOrderNewestFirst": "Nyast först", + "@sortOrderNewestFirst": {}, + "sortByName": "Efter namn", + "@sortByName": {}, + "sortByItemCount": "Efter antal objekt", + "@sortByItemCount": {}, + "sortBySize": "Efter storlek", + "@sortBySize": {}, + "sortByAlbumFileName": "Efter album & objekttitel", + "@sortByAlbumFileName": {}, + "sortByRating": "Efter omdömen", + "@sortByRating": {}, + "sortOrderOldestFirst": "Äldst först", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "A till Ö", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Ö till A", + "@sortOrderZtoA": {}, + "chipActionUnpin": "Släpp från fästet", + "@chipActionUnpin": {}, + "chipActionShowCollection": "Visa i Samling", + "@chipActionShowCollection": {}, + "videoActionABRepeat": "A-B återupprepa", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "Ange start", + "@videoRepeatActionSetStart": {}, + "restrictedAccessDialogMessage": "Denna applikation har ej tillåtelse att modifiera filer i {directory} i ”{volume}”.\n\nVänligen använd en förinstallerad filhanterare eller galleriapplikation för att flytta filerna till en annan katalog.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "widgetOpenPageViewer": "Öppna bildvisaren", + "@widgetOpenPageViewer": {}, + "rootDirectoryDescription": "grundkatalog", + "@rootDirectoryDescription": {}, + "notEnoughSpaceDialogMessage": "Denna åtgärd behöver {neededSize} ledigt utrymme på ”{volume}” för att kunna slutföras, men det är enbart {freeSize} kvar.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "addShortcutButtonLabel": "LÄGG TILL", + "@addShortcutButtonLabel": {}, + "addShortcutDialogLabel": "Rubrik för genväg", + "@addShortcutDialogLabel": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Denna åtgärd stöds ej för objekt av denna typ: {types}.} other{Denna åtgärd stöds ej för följande typer av objekt: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "stopTooltip": "Stopp", + "@stopTooltip": {}, + "chipActionGoToExplorerPage": "Visa i Utforskaren", + "@chipActionGoToExplorerPage": {}, + "videoRepeatActionSetEnd": "Ange slut", + "@videoRepeatActionSetEnd": {}, + "moveUndatedConfirmationDialogMessage": "Registrera datum för objekten innan vi går vidare?", + "@moveUndatedConfirmationDialogMessage": {}, + "renameProcessorHash": "Hash", + "@renameProcessorHash": {}, + "editEntryDateDialogSetCustom": "Ange anpassat datum", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Kopiera från annat datum", + "@editEntryDateDialogCopyField": {}, + "castDialogTitle": "Uppspelningsenheter", + "@castDialogTitle": {}, + "renameEntrySetPageTitle": "Ändra namn", + "@renameEntrySetPageTitle": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Vill du ta bort detta objekt?} other{Vill du ta bort dessa {count} objekt?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "renameAlbumDialogLabel": "Nytt namn", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Katalogen finns redan", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart-paket", + "@aboutLicensesDartPackagesSectionTitle": {}, + "collectionActionShowTitleSearch": "Visa titelfilter", + "@collectionActionShowTitleSearch": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Flytta detta objekt till papperskorgen?} other{Flytta dessa {count} objekt till papperskorgen?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "vaultBinUsageDialogMessage": "Några valv använder papperskorgen.", + "@vaultBinUsageDialogMessage": {}, + "authenticateToUnlockVault": "Verifiera dig för att låsa upp valvet", + "@authenticateToUnlockVault": {}, + "aboutCreditsSectionTitle": "Tillkännagivande", + "@aboutCreditsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter-paket", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "editEntryDialogTargetFieldsHeader": "Fällt att modifiera", + "@editEntryDialogTargetFieldsHeader": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Ta bort detta album samt det objektet som den innehåller?} other{Ta bort detta album och de {count} objekt som den innehåller?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Ta bort dessa album samt det objekt som de innehåller?} other{Ta bort dessa album samt de {count} objekt som de innehåller?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "newFilterBanner": "ny", + "@newFilterBanner": {}, + "countryPageTitle": "Länder", + "@countryPageTitle": {}, + "searchCountriesSectionTitle": "Länder", + "@searchCountriesSectionTitle": {}, + "settingsThumbnailShowRating": "Visa omdömen", + "@settingsThumbnailShowRating": {}, + "collectionExportFailureFeedback": "{count, plural, =1{Misslyckades med att exportera 1 sida} other{Misslyckades med att exportera {count} sidor}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{Flyttade 1 objekt} other{Flyttade {count} objekt}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "sortOrderHighestFirst": "Högst först", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Lägst först", + "@sortOrderLowestFirst": {}, + "albumGroupTier": "Efter nivå", + "@albumGroupTier": {}, + "albumPickPageTitleMove": "Flytta till Album", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "Välj Album", + "@albumPickPageTitlePick": {}, + "statePageTitle": "Delstater", + "@statePageTitle": {}, + "countryEmpty": "Inga länder", + "@countryEmpty": {}, + "stateEmpty": "Inga delstater", + "@stateEmpty": {}, + "placePageTitle": "Platser", + "@placePageTitle": {}, + "placeEmpty": "Inga platser", + "@placeEmpty": {}, + "tagPageTitle": "Etiketter", + "@tagPageTitle": {}, + "searchPlacesSectionTitle": "Platser", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Etiketter", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "Omdöme", + "@searchRatingSectionTitle": {}, + "settingsViewerShowRatingTags": "Visa omdöme & etiketter", + "@settingsViewerShowRatingTags": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{Kopierade 1 objekt} other{Kopierade{count} objekt}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{Ändrat namn på 1 objekt} other{Ändrat namn på {count} objekt}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{Misslyckades med att ändra 1 objekt} other{Misslyckades med att ändra {count} objekt}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "sortByDuration": "Efter spellängd", + "@sortByDuration": {}, + "sortOrderShortestFirst": "Kortast först", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "Längst först", + "@sortOrderLongestFirst": {}, + "albumDownload": "Nedladdningar", + "@albumDownload": {}, + "albumScreenshots": "Skärmbilder", + "@albumScreenshots": {}, + "albumScreenRecordings": "Skärminspelningar", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Videoupptagningar", + "@albumVideoCaptures": {}, + "albumPageTitle": "Album", + "@albumPageTitle": {}, + "tagEmpty": "Inga etiketter", + "@tagEmpty": {}, + "binPageTitle": "Papperskorgen", + "@binPageTitle": {}, + "explorerActionSelectStorageVolume": "Välj lagringsplats", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "Välj Lagringsplats", + "@selectStorageVolumeDialogTitle": {}, + "collectionEditSuccessFeedback": "{count, plural, =1{Ändrat 1 objekt} other{Ändrat {count} objekt}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "albumGroupVolume": "Efter lagringsmedia", + "@albumGroupVolume": {}, + "albumGroupType": "Efter typ", + "@albumGroupType": {}, + "albumMimeTypeMixed": "Blandat", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "Kopiera till Album", + "@albumPickPageTitleCopy": {}, + "searchRecentSectionTitle": "Nyligen", + "@searchRecentSectionTitle": {}, + "explorerPageTitle": "Utforskaren", + "@explorerPageTitle": {}, + "searchCollectionFieldHint": "Sök i samling", + "@searchCollectionFieldHint": {}, + "searchDateSectionTitle": "Datum", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "Album", + "@searchAlbumsSectionTitle": {}, + "searchStatesSectionTitle": "Delstater", + "@searchStatesSectionTitle": {}, + "albumPickPageTitleExport": "Exportera till Album", + "@albumPickPageTitleExport": {}, + "albumEmpty": "Inga album", + "@albumEmpty": {}, + "createAlbumButtonLabel": "SKAPA", + "@createAlbumButtonLabel": {}, + "settingsHiddenFiltersBanner": "Bilder och filmer som matchar gömda filter kommer inte visas i dina samlingar.", + "@settingsHiddenFiltersBanner": {}, + "settingsSlideshowRepeat": "Upprepa", + "@settingsSlideshowRepeat": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Textposition", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSaveSearchHistory": "Spara sökhistorik", + "@settingsSaveSearchHistory": {}, + "settingsAccessibilitySectionTitle": "Tillgänglighet", + "@settingsAccessibilitySectionTitle": {}, + "settingsNavigationDrawerBanner": "Tryck och håll i för att flytta och arrangera om objekt i menyn.", + "@settingsNavigationDrawerBanner": {}, + "settingsThumbnailShowLocationIcon": "Visa lokaliseringsikon", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowTagIcon": "Visa etikettikon", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowFavouriteIcon": "Visa favoritikon", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Uppdateringshastighet", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageTile": "Språk", + "@settingsLanguageTile": {}, + "settingsDisplayRefreshRateModeTile": "Skärmens uppdateringshastighet", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayUseTvInterface": "Android TV-gränssnitt", + "@settingsDisplayUseTvInterface": {}, + "settingsLanguagePageTitle": "Språk", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "Koordinatformat", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "Koordinatformat", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Enheter", + "@settingsUnitSystemTile": {}, + "settingsWidgetPageTitle": "Fotoram", + "@settingsWidgetPageTitle": {}, + "searchMetadataSectionTitle": "Metadata", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Inställningar", + "@settingsPageTitle": {}, + "settingsSystemDefault": "Systemets standard", + "@settingsSystemDefault": {}, + "settingsDisabled": "Inaktiverad", + "@settingsDisabled": {}, + "settingsDefault": "Standard", + "@settingsDefault": {}, + "settingsAskEverytime": "Fråga varje gång", + "@settingsAskEverytime": {}, + "settingsModificationWarningDialogMessage": "Andra inställningar kommer att ändras.", + "@settingsModificationWarningDialogMessage": {}, + "settingsSearchFieldLabel": "Sök efter inställningar", + "@settingsSearchFieldLabel": {}, + "appExportSettings": "Inställningar", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "Navigering", + "@settingsNavigationSectionTitle": {}, + "settingsActionExportDialogTitle": "Exportera", + "@settingsActionExportDialogTitle": {}, + "settingsDoubleBackExit": "Tryck ”bakåt” två gånger för att avsluta", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "Bekräftelsedialoger", + "@settingsConfirmationTile": {}, + "settingsKeepScreenOnTile": "Behåll skärmen aktiv", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Behåll Skärmen Aktiv", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsConfirmationDialogTitle": "Bekräftelsedialoger", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeMoveToBinItems": "Fråga innan objekt flyttas till papperskorgen", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Fråga innan odaterade objekt flyttas", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Visa ett meddelande efter att objekt flyttats till papperskorgen", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsConfirmationVaultDataLoss": "Visa varning för dataförlust i valv", + "@settingsConfirmationVaultDataLoss": {}, + "settingsNavigationDrawerTile": "Navigeringsmeny", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Navigeringsmeny", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerAddAlbum": "Lägg till album", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "Miniatyrbilder", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "Översikt", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Översikt", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsViewerShowShootingDetails": "Visa bildtagningsdetaljer", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowOverlayOnOpening": "Visas vid öppnande", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowHistogram": "Visa histogram", + "@settingsViewerShowHistogram": {}, + "settingsViewerShowMinimap": "Visa miniatyrkarta", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Visa information", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "Visa titel, datum, plats, etc.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowOverlayThumbnails": "Visa miniatyrbilder", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerShowDescription": "Visa beskrivning", + "@settingsViewerShowDescription": {}, + "settingsSlideshowShuffle": "Blanda", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Helskärm", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowIntervalTile": "Intervall", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "Videouppspelning", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Videouppspelning", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "settingsVideoLoopModeTile": "Upprepningsläge", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Upprepningsläge", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsVideoResumptionModeDialogTitle": "Återuppta Uppspelning", + "@settingsVideoResumptionModeDialogTitle": {}, + "settingsVideoResumptionModeTile": "Återuppta uppspelning", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoControlsTile": "Reglage", + "@settingsVideoControlsTile": {}, + "settingsVideoBackgroundMode": "Bakgrundsläge", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "Bakgrundsläge", + "@settingsVideoBackgroundModeDialogTitle": {}, + "settingsVideoControlsPageTitle": "Reglage", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "Knappar", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Tryck två gånger för att spela upp/pausa", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "Tryck två gånger på skärmkanterna för att spola bakåt/framåt", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Svep upp och ner för att anpassa ljusstyrka/ljudvolym", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsSubtitleThemeTile": "Undertexter", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Undertexter", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Detta är ett exempel.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Textplacering", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Textstorlek", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeTextColor": "Textfärg", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Textens genomskinlighet", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundOpacity": "Bakgrundens genomskinlighet", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsDisablingBinWarningDialogMessage": "Objekt i papperskorgen kommer att tas bort permanent.", + "@settingsDisablingBinWarningDialogMessage": {}, + "settingsStorageAccessTile": "Åtkomst till lagringsutrymme", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "lagringsåtkomst", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessBanner": "För vissa kataloger krävs ett särskilt åtkomsttillstånd för att ändra filer i dem. Här kan du granska kataloger vilket du tidigare gett detta tillstånd.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Inga speciella åtkomsttillstånd", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Upphäv", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsRemoveAnimationsDialogTitle": "Inaktivera Animationer", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Visa alternativ till multi-tryckgester", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsDisplaySectionTitle": "Skärm", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsForceWesternArabicNumeralsTile": "Tvinga arabiska siffror", + "@settingsForceWesternArabicNumeralsTile": {}, + "settingsWidgetDisplayedItem": "Objekt som visas", + "@settingsWidgetDisplayedItem": {}, + "statsPageTitle": "Statistik", + "@statsPageTitle": {}, + "statsTopCountriesSectionTitle": "Populära Länder", + "@statsTopCountriesSectionTitle": {}, + "settingsCollectionTile": "Samling", + "@settingsCollectionTile": {}, + "viewerOpenPanoramaButtonLabel": "ÖPPNA PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "ANGE SOM BAKGRUNDSBILD", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Ojsan!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "Filen finns ej längre.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Info", + "@viewerInfoPageTitle": {}, + "viewerInfoLabelTitle": "Titel", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "Datum", + "@viewerInfoLabelDate": {}, + "mapZoomInTooltip": "Förstora", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Förminska", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Rikta norr uppåt", + "@mapPointNorthUpTooltip": {}, + "openMapPageTooltip": "Visa på kartsidan", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "Inga bilder i denna region", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Misslyckades att extrahera inbäddad data", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "Öppna", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Visa XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "Sök metadata", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Inga matchande nycklar", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Datum & tid", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Beskrivning", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Dimensioner", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Upplösning", + "@viewerInfoSearchSuggestionResolution": {}, + "wallpaperUseScrollEffect": "Använd bläddringsanimation på hemskärmen", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageTitle": "Redigera Etiketter", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Ny etikett", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Lägg till etikett", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Senaste", + "@tagEditorSectionRecent": {}, + "settingsVideoPlaybackTile": "Uppspelning", + "@settingsVideoPlaybackTile": {}, + "appExportCovers": "Omslagsbilder", + "@appExportCovers": {}, + "settingsCollectionQuickActionTabBrowsing": "Bläddra", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Välja", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Tryck och håll nere för att flytta knappar och välj på så vis vilka åtgärder som skall visas vid bläddring bland objekt.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsVideoPlaybackPageTitle": "Uppspelning", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoEnableHardwareAcceleration": "Hårdvaruacceleration", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "Automatisk uppspelning", + "@settingsVideoAutoPlay": {}, + "panoramaDisableSensorControl": "Inaktivera sensorstyrning", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Källa", + "@sourceViewerPageTitle": {}, + "settingsSearchEmpty": "Inga matchande inställningar hittades", + "@settingsSearchEmpty": {}, + "settingsActionExport": "Exportera", + "@settingsActionExport": {}, + "settingsActionImport": "Importera", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Importera", + "@settingsActionImportDialogTitle": {}, + "appExportFavourites": "Favoriter", + "@appExportFavourites": {}, + "setHomeCustom": "Anpassad", + "@setHomeCustom": {}, + "settingsConfirmationBeforeDeleteItems": "Fråga innan objekt raderas permanent", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsNavigationDrawerTabTypes": "Kategorier", + "@settingsNavigationDrawerTabTypes": {}, + "settingsThumbnailShowRawIcon": "Visa ikon för råbildsformatet RAW", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Visa videons längd", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "Genvägar", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Genvägar", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Tryck och håll nere för att flytta knappar och välj på så vis vilka åtgärder som skall visas när objekt väljs.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsCollectionBurstPatternsTile": "Seriefotograferingsmönster", + "@settingsCollectionBurstPatternsTile": {}, + "settingsCollectionBurstPatternsNone": "Inget", + "@settingsCollectionBurstPatternsNone": {}, + "settingsViewerSectionTitle": "Bildvisare", + "@settingsViewerSectionTitle": {}, + "settingsViewerGestureSideTapNext": "Tryck på skärmens kanter för att visa tidigare/nästa objekt", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerUseCutout": "Använd skärmutskärningsområdet", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Maximal ljusstyrka", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Spela automatiskt upp rörelsefoton", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "Bakgrund för bilder", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Genvägar", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Genvägar", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "Tryck och håll ner för att flytta och på så vis välja vilka åtgärder som skall visas i bildvisaren.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Knappar Som Visas", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Tillgängliga Knappar", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Inga knappar", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "Overlay", + "@settingsViewerOverlayTile": {}, + "settingsViewerEnableOverlayBlurEffect": "Effekt för oskärpa", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "Bildspel", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "Bildspel", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowAnimatedZoomEffect": "Animerad inzoomningseffekt", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "Övergång", + "@settingsSlideshowTransitionTile": {}, + "settingsVideoPageTitle": "Videoinställningar", + "@settingsVideoPageTitle": {}, + "settingsVideoShowVideos": "Visa videor", + "@settingsVideoShowVideos": {}, + "settingsSubtitleThemeTextAlignmentTile": "Textplacering", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextPositionTile": "Textposition", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSubtitleThemeShowOutline": "Visa kantlinjer och skuggor", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeBackgroundColor": "Bakgrundsfärg", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Vänster", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Centrerad", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Höger", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsPrivacySectionTitle": "Sekretess", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Tillåt åtkomst till applikationsförteckning", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "Används för att förbättra visning av album", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "Tillåt anonym felrapportering", + "@settingsAllowErrorReporting": {}, + "settingsAllowMediaManagement": "Tillåt hantering av media", + "@settingsAllowMediaManagement": {}, + "settingsHiddenItemsTile": "Gömda objekt", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Gömda Objekt", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersEmpty": "Inga dolda filter", + "@settingsHiddenFiltersEmpty": {}, + "settingsRemoveAnimationsTile": "Inaktivera animationer", + "@settingsRemoveAnimationsTile": {}, + "settingsTimeToTakeActionTile": "Tid innan åtgärd vidtages", + "@settingsTimeToTakeActionTile": {}, + "settingsWidgetShowOutline": "Kantlinje", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "När widgeten trycks på", + "@settingsWidgetOpenPage": {}, + "statsWithGps": "{count, plural, =1{1 objekt som har sparad platsdata} other{{count} objekt som har sparad platsdata}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "viewerInfoBackToViewerTooltip": "Tillbaka till bildvisaren", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "okänd", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "Beskrivning", + "@viewerInfoLabelDescription": {}, + "viewerInfoSearchSuggestionRights": "Rättigheter", + "@viewerInfoSearchSuggestionRights": {}, + "tagPlaceholderPlace": "Plats", + "@tagPlaceholderPlace": {}, + "panoramaEnableSensorControl": "Aktivera sensorstyrning", + "@panoramaEnableSensorControl": {}, + "settingsEnableBin": "Använd papperskorg", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "Behåll borttagna objekt i 30 dagar", + "@settingsEnableBinSubtitle": {}, + "settingsViewerOverlayPageTitle": "Overlay", + "@settingsViewerOverlayPageTitle": {}, + "settingsHomeTile": "Startsida", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Startsida", + "@settingsHomeDialogTitle": {}, + "settingsNavigationDrawerTabAlbums": "Album", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Sidor", + "@settingsNavigationDrawerTabPages": {}, + "settingsThumbnailShowHdrIcon": "Visa HDR-ikon", + "@settingsThumbnailShowHdrIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Visa ikon för Rörelsefoto", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThemeColorHighlights": "Färgbetoning", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Dynamiska färger", + "@settingsThemeEnableDynamicColor": {}, + "settingsLanguageSectionTitle": "Språk & Format", + "@settingsLanguageSectionTitle": {}, + "settingsUnitSystemDialogTitle": "Enheter", + "@settingsUnitSystemDialogTitle": {}, + "settingsScreenSaverPageTitle": "Skärmsläckare", + "@settingsScreenSaverPageTitle": {}, + "statsTopStatesSectionTitle": "Populära Delstater", + "@statsTopStatesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Populära Platser", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Populära Etiketter", + "@statsTopTagsSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Populära Album", + "@statsTopAlbumsSectionTitle": {}, + "viewerInfoLabelResolution": "Upplösning", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Storlek", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Sökväg", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Varaktighet", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Ägare", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Koordinater", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Adress", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Karttyp", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Välj karttyp", + "@mapStyleTooltip": {}, + "mapAttributionOsmHot": "Brickor av [HOT](https://www.hotosm.org/) • Tillhandahållen av [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "Brickor av [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "tagEditorSectionPlaceholders": "Platshållare", + "@tagEditorSectionPlaceholders": {}, + "tagEditorDiscardDialogMessage": "Vill du kasta förändringarna?", + "@tagEditorDiscardDialogMessage": {}, + "tagPlaceholderCountry": "Land", + "@tagPlaceholderCountry": {}, + "tagPlaceholderState": "Delstat", + "@tagPlaceholderState": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapAttributionOsmLiberty": "Brickor av [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Tillhandahållen av [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Brickor av [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "mapAttributionOsmData": "Kartdata © [OpenStreetMap](https://www.openstreetmap.org/copyright) bidragsgivare", + "@mapAttributionOsmData": {}, + "videoActionShowPreviousFrame": "Visa föregående bildruta", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "Visa nästa bildruta", + "@videoActionShowNextFrame": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Albumet existerar redan", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "chipActionRemove": "Ta bort", + "@chipActionRemove": {}, + "albumTierDynamic": "Dynamisk", + "@albumTierDynamic": {}, + "newDynamicAlbumDialogTitle": "Nytt dynamiskt album", + "@newDynamicAlbumDialogTitle": {}, + "collectionActionAddDynamicAlbum": "Lägg till dynamiskt album", + "@collectionActionAddDynamicAlbum": {}, + "appExportDynamicAlbums": "Dynamiska album", + "@appExportDynamicAlbums": {}, + "dynamicAlbumAlreadyExists": "Dynamiskt album existerar redan", + "@dynamicAlbumAlreadyExists": {}, + "editEntryLocationDialogImportGpx": "Importera GPX", + "@editEntryLocationDialogImportGpx": {}, + "chipActionDecompose": "Splitta", + "@chipActionDecompose": {}, + "removeEntryMetadataDialogAll": "Allt", + "@removeEntryMetadataDialogAll": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "editEntryLocationDialogTimeShift": "Tidsskifte", + "@editEntryLocationDialogTimeShift": {}, + "sortByPath": "Efter sökväg", + "@sortByPath": {}, + "searchFormatSectionTitle": "Format", + "@searchFormatSectionTitle": {}, + "chipActionCreateGroup": "Skapa grupp", + "@chipActionCreateGroup": {}, + "createButtonLabel": "SKAPA", + "@createButtonLabel": {}, + "groupPickerUseThisGroupButton": "Använd den här gruppen", + "@groupPickerUseThisGroupButton": {}, + "sectionNone": "Inga sektioner", + "@sectionNone": {}, + "chipActionGroup": "Ändra gruppering", + "@chipActionGroup": {}, + "albumTierGroups": "Grupper", + "@albumTierGroups": {}, + "newGroupDialogTitle": "Ny grupp", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Gruppnamn", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "Gruppen existerar redan", + "@groupAlreadyExists": {}, + "groupEmpty": "Inga grupper", + "@groupEmpty": {}, + "ungrouped": "Ogrupperad", + "@ungrouped": {}, + "groupPickerTitle": "Välj Grupp", + "@groupPickerTitle": {}, + "mapStyleDialogAddStyle": "Lägg till typ", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogName": "Namn", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogSubdomains": "Underdomäner", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "Användaragent", + "@mapStyleEditorDialogUserAgent": {}, + "tagPickPageTitle": "Välj etikett", + "@tagPickPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Tryck och håll ner för att flytta knappar och välj vilka återgärder som visas i det nedre navigeringsfältet.", + "@settingsNavigationBottomActionEditorBanner": {}, + "settingsNavigationBottomActionsTile": "Nedre navigeringsfält", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Nedre navigeringsfält", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsViewerShowZoomLevel": "Visa zoomnivå", + "@settingsViewerShowZoomLevel": {}, + "settingsEnabled": "Aktiverad", + "@settingsEnabled": {}, + "settingsForced": "Tvingad", + "@settingsForced": {} +} diff --git a/lib/l10n/app_ta.arb b/lib/l10n/app_ta.arb new file mode 100644 index 0000000..661de52 --- /dev/null +++ b/lib/l10n/app_ta.arb @@ -0,0 +1,978 @@ +{ + "editEntryDateDialogSourceFileModifiedDate": "கோப்பு மாற்றியமைக்கப்பட்ட தேதி", + "durationDialogMinutes": "நிமையங்கள்", + "durationDialogSeconds": "விநாடிகள்", + "editEntryLocationDialogTitle": "இடம்", + "editEntryLocationDialogSetCustom": "தனிப்பயன் இருப்பிடத்தை அமை", + "editEntryLocationDialogChooseOnMap": "வரைபடத்தில் தேர்வு செய்", + "editEntryLocationDialogLatitude": "அகலாங்கு", + "editEntryLocationDialogLongitude": "நெட்டாங்கு", + "locationPickerUseThisLocationButton": "இந்த இருப்பிடத்தைப் பயன்படுத்து", + "editEntryRatingDialogTitle": "மதிப்பிடு", + "removeEntryMetadataDialogTitle": "மேனிலை தரவு அகற்றுதல்", + "removeEntryMetadataDialogMore": "மேலும்", + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "இயக்கபுகைப்படத்திற்குள் காணொளியை இயக்க எக்ச்எம்பி தேவை.\n\n நீங்கள் அதை அகற்ற விரும்புகிறீர்களா?", + "videoSpeedDialogLabel": "பின்னணி விரைவு", + "videoStreamSelectionDialogVideo": "காணொளி", + "videoStreamSelectionDialogAudio": "ஒலிதம்", + "videoStreamSelectionDialogText": "வசன வரிகள்", + "videoStreamSelectionDialogOff": "அணை", + "videoStreamSelectionDialogTrack": "தடம்", + "videoStreamSelectionDialogNoSelection": "வேறு தடங்கள் இல்லை.", + "genericSuccessFeedback": "முடிந்தது!", + "genericFailureFeedback": "தோல்வியுற்றது", + "genericDangerWarningDialogMessage": "நீங்கள் உறுதியாக இருக்கிறீர்களா?", + "tooManyItemsErrorDialogMessage": "குறைவான உருப்படிகளுடன் மீண்டும் முயற்சி.", + "menuActionConfigureView": "பார்வை", + "menuActionSelect": "தேர்ந்தெடு", + "menuActionSelectAll": "அனைத்தையும் தெரிவுசெய்", + "menuActionSelectNone": "எதுவுமில்லை என்பதைத் தேர்ந்தெடு", + "menuActionMap": "வரைபடம்", + "menuActionSlideshow": "வில்லைக்காட்சி", + "menuActionStats": "புள்ளிவிவரங்கள்", + "viewDialogSortSectionTitle": "வரிசைப்படுத்து", + "viewDialogGroupSectionTitle": "பிரிவுகள்", + "viewDialogLayoutSectionTitle": "இடுவெளி", + "viewDialogReverseSortOrder": "தலைகீழ் வரிசை முறை", + "tileLayoutMosaic": "மொசைக்", + "tileLayoutGrid": "சல்லடை", + "tileLayoutList": "பட்டியல்", + "castDialogTitle": "தூக்கிஎறி சாதனங்கள்", + "coverDialogTabCover": "அட்டை", + "coverDialogTabApp": "பயன்பாடு", + "coverDialogTabColor": "நிறம்", + "appPickDialogTitle": "பயன்பாட்டை எடு", + "appPickDialogNone": "எதுவுமில்லை", + "aboutPageTitle": "பற்றி", + "aboutLinkLicense": "உரிமம்", + "aboutLinkPolicy": "தனியுரிமைக் கொள்கை", + "aboutBugSectionTitle": "பிழை அறிக்கை", + "aboutBugReportInstruction": "பதிவுகள் மற்றும் கணினி தகவல்களுடன் அறிவிலிமையம் குறித்த அறிக்கை", + "aboutBugReportButton": "அறிக்கை", + "aboutDataUsageSectionTitle": "தரவுப் பயன்பாடு", + "aboutDataUsageData": "தரவு", + "aboutDataUsageCache": "தேக்ககம்", + "aboutDataUsageDatabase": "தரவுத்தளம்", + "aboutDataUsageMisc": "இதர", + "aboutDataUsageInternal": "உள்", + "aboutDataUsageExternal": "வெளிப்புறம்", + "aboutDataUsageClearCache": "தற்காலிக சேமிப்பு துடை", + "aboutCreditsSectionTitle": "நன்றி", + "aboutCreditsWorldAtlas1": "இந்தப் பயன்பாடு ஒரு டோபோச்சன் கோப்பைப் பயன்படுத்துகிறது", + "aboutCreditsWorldAtlas2": "ஐஎச்சி உரிமத்தின் கீழ்.", + "aboutTranslatorsSectionTitle": "மொழிபெயர்ப்பாளர்கள்", + "aboutLicensesSectionTitle": "திறந்த மூல உரிமங்கள்", + "aboutLicensesBanner": "இந்தப் பயன்பாடு பின்வரும் திறந்த மூல தொகுப்புகள் மற்றும் நூலகங்களைப் பயன்படுத்துகிறது.", + "aboutLicensesAndroidLibrariesSectionTitle": "ஆண்ட்ராய்டு நூலகங்கள்", + "aboutLicensesFlutterPluginsSectionTitle": "ப்லுட்டர் செருகுநிரல்கள்", + "aboutLicensesFlutterPackagesSectionTitle": "ப்லுட்டர் தொகுப்புகள்", + "aboutLicensesDartPackagesSectionTitle": "டார்ட் தொகுப்புகள்", + "aboutLicensesShowAllButtonLabel": "அனைத்து உரிமங்களையும் காட்டு", + "policyPageTitle": "தனியுரிமைக் கொள்கை", + "collectionPageTitle": "சேகரிப்பு", + "collectionPickPageTitle": "எடு", + "collectionSelectPageTitle": "உருப்படிகளைத் தேர்ந்தெடு", + "collectionActionShowTitleSearch": "தலைப்பு வடிகட்டியைக் காட்டு", + "collectionActionHideTitleSearch": "தலைப்பு வடிகட்டியை மறை", + "collectionActionAddDynamicAlbum": "மாறும் தொகுப்பைச் சேர்", + "collectionActionEmptyBin": "வெற்று தொட்டி", + "collectionActionCopy": "தொகுப்பிற்கு நகலெடு", + "collectionActionMove": "தொகுப்பிற்கு நகர்த்து", + "collectionActionRescan": "மறுவருடல்", + "collectionActionEdit": "தொகு", + "collectionGroupAlbum": "தொகுப்பால்", + "collectionGroupMonth": "திங்களால்", + "collectionGroupDay": "நாளால்", + "sectionUnknown": "தெரியாத", + "dateToday": "இன்று", + "dateYesterday": "நேற்று", + "dateThisMonth": "இந்தத் திங்கள்", + "appName": "ஏவ்சு", + "welcomeMessage": "ஏவ்சுக்கு வருக", + "welcomeOptional": "விரும்பினால்", + "welcomeTermsToggle": "விதிமுறைகள் மற்றும் நிபந்தனைகளை நான் ஒப்புக்கொள்கிறேன்", + "collectionRenameFailureFeedback": "{count, plural, =1{மறுபெயரிடுவதில் தோல்வி 1 உருப்படி} other{மறுபெயரிடுவதில் தோல்வி {count} உருப்படிகள்}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{திருத்துவதில் தோல்வியுற்றது 1 உருப்படி} other{திருத்துவதில் தோல்வியுற்றது {count} உருப்படிகள்}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, =1{ஏற்றுமதி செய்வதில் தோல்வி 1 பக்கம்} other{ஏற்றுமதி செய்வதில் தோல்வி {count} பக்கங்கள்}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, =1{நகலெடுக்கப்பட்டது 1 உருப்படி} other{நகலெடுக்கப்பட்டது {count} உருப்படிகள்}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, =1{நகர்த்தப்பட்ட 1 உருப்படி} other{நகர்த்தப்பட்ட {count} உருப்படிகள்}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{மறுபெயரிடப்பட்டது 1 உருப்படி} other{மறுபெயரிடப்பட்டது {count} உருப்படிகள்}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{திருத்தப்பட்ட 1 உருப்படி} other{திருத்தப்பட்ட {count} உருப்படிகள்}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionEmptyFavourites": "பிடித்தவை இல்லை", + "collectionEmptyVideos": "காணொளிகள் இல்லை", + "collectionEmptyImages": "படங்கள் இல்லை", + "collectionEmptyGrantAccessButtonLabel": "அணுகல் வழங்கு", + "collectionSelectSectionTooltip": "பிரிவைத் தேர்ந்தெடு", + "collectionDeselectSectionTooltip": "தேர்வு நீக்கு", + "drawerAboutButton": "பற்றி", + "drawerSettingsButton": "அமைப்புகள்", + "drawerCollectionAll": "அனைத்து சேகரிப்பு", + "drawerCollectionFavourites": "பிடித்தவை", + "drawerCollectionImages": "படங்கள்", + "drawerCollectionVideos": "காணொளிகள்", + "drawerCollectionPanoramas": "பனோரமாக்கள்", + "drawerCollectionAnimated": "அசைவூட்டபட்டது", + "drawerCollectionMotionPhotos": "இயக்கப் புகைப்படங்கள்", + "drawerCollectionRaws": "மூல புகைப்படங்கள்", + "drawerCollectionSphericalVideos": "360° காணொளிகள்", + "drawerAlbumPage": "தொகுப்புகள்", + "drawerCountryPage": "நாடுகள்", + "drawerPlacePage": "இடங்கள்", + "drawerTagPage": "குறிச்சொற்கள்", + "sortByDate": "தேதிமூலம்", + "sortByName": "பெயரால்", + "sortByItemCount": "உருப்படி எண்ணிக்கைமூலம்", + "sortBySize": "அளவுமூலம்", + "sortByAlbumFileName": "தொகுப்பு & உருப்படி தலைப்புமூலம்", + "sortByRating": "மதிப்பீடுமூலம்", + "sortByDuration": "காலப்படி", + "sortOrderNewestFirst": "முதலில் புதியது", + "sortOrderOldestFirst": "முதலில் பழமையானது", + "sortOrderAtoZ": "அ இருந்து ஔ", + "sortOrderZtoA": "ஔ இருந்து அ", + "sortOrderHighestFirst": "முதலில் அதிகபட்சம்", + "sortOrderLowestFirst": "முதலில் மிகக் குறைவு", + "sortOrderLargestFirst": "பெரியது முதலில்", + "sortOrderSmallestFirst": "சிறியது முதலில்", + "sortOrderShortestFirst": "சின்னது முதலில்", + "sortOrderLongestFirst": "முதலில் நீளமானது", + "albumGroupTier": "அடுக்குமூலம்", + "albumGroupType": "வகைமூலம்", + "albumGroupVolume": "சேமிப்பக அளவுமூலம்", + "albumMimeTypeMixed": "கலப்பு", + "albumPickPageTitleCopy": "ஆல்பத்திற்கு நகலெடு", + "albumPickPageTitleExport": "தொகுப்பிற்கு ஏற்றுமதி", + "albumPickPageTitleMove": "தொகுப்பிற்கு நகர்த்து", + "albumPickPageTitlePick": "தொகுப்பைத் தேர்ந்தெடு", + "albumCamera": "ஒளிப்படக்கருவி", + "albumDownload": "பதிவிறக்கம்", + "albumScreenshots": "திரைக்காட்சிகள்", + "albumScreenRecordings": "திரை பதிவுகள்", + "albumVideoCaptures": "காணொளி பதிவுகள்", + "albumPageTitle": "தொகுப்புகள்", + "albumEmpty": "தொகுப்புகள் இல்லை", + "createAlbumButtonLabel": "உருவாக்கு", + "newFilterBanner": "புதிய", + "countryPageTitle": "நாடுகள்", + "countryEmpty": "எந்த நாடுகளும் இல்லை", + "statePageTitle": "மாநிலங்கள்", + "stateEmpty": "மாநிலங்கள் இல்லை", + "placePageTitle": "இடங்கள்", + "placeEmpty": "இடங்கள் இல்லை", + "tagEmpty": "குறிச்சொற்கள் இல்லை", + "binPageTitle": "மறுசுழற்சி தொட்டி", + "explorerPageTitle": "உலாவி", + "explorerActionSelectStorageVolume": "சேமிப்பிடத்தைத் தேர்ந்தெடு", + "selectStorageVolumeDialogTitle": "சேமிப்பிடத்தைத் தேர்ந்தெடு", + "searchCollectionFieldHint": "சேகரிப்பு தேடல்", + "searchRecentSectionTitle": "அண்மைக் கால", + "searchDateSectionTitle": "திகதி", + "searchAlbumsSectionTitle": "தொகுப்புகள்", + "searchCountriesSectionTitle": "நாடுகள்", + "searchStatesSectionTitle": "மாநிலங்கள்", + "searchPlacesSectionTitle": "இடங்கள்", + "searchTagsSectionTitle": "குறிச்சொற்கள்", + "searchRatingSectionTitle": "மதிப்பீடுகள்", + "searchMetadataSectionTitle": "மேனிலை தரவு", + "settingsPageTitle": "அமைப்புகள்", + "settingsSystemDefault": "கணினி இயல்புநிலை", + "settingsDefault": "இயல்புநிலை", + "settingsDisabled": "முடக்கப்பட்டது", + "settingsAskEverytime": "ஒவ்வொருமுறையும் கேளு", + "settingsModificationWarningDialogMessage": "மற்ற அமைப்புகள் மாற்றப்படும்.", + "settingsSearchFieldLabel": "அமைப்புகளைத் தேடு", + "settingsSearchEmpty": "பொருந்தக்கூடிய அமைப்பு இல்லை", + "settingsActionExport": "ஏற்றுமதி", + "settingsActionExportDialogTitle": "ஏற்றுமதி", + "settingsActionImport": "இறக்குமதி", + "settingsActionImportDialogTitle": "இறக்குமதி", + "appExportCovers": "அட்டைகள்", + "appExportDynamicAlbums": "மாறும் தொகுப்புகள்", + "appExportFavourites": "பிடித்தவைகள்", + "appExportSettings": "அமைப்புகள்", + "settingsNavigationSectionTitle": "வழிசெலுத்தல்", + "settingsHomeTile": "வீடு", + "settingsHomeDialogTitle": "வீடு", + "setHomeCustom": "தனிப்பயன்", + "settingsKeepScreenOnTile": "திரையைத் தொடர்ந்து வைத்திரு", + "settingsKeepScreenOnDialogTitle": "திரையைத் தொடர்ந்து வைத்திரு", + "settingsConfirmationTile": "உறுதிப்படுத்தல் உரையாடல்கள்", + "settingsConfirmationDialogTitle": "உறுதிப்படுத்தல் உரையாடல்கள்", + "settingsConfirmationBeforeDeleteItems": "பொருட்களை எப்போதும் நீக்குவதற்கு முன் கேளு", + "settingsConfirmationBeforeMoveToBinItems": "மறுசுழற்சி தொட்டியில் பொருட்களை நகர்த்துவதற்கு முன் கேளு", + "settingsConfirmationBeforeMoveUndatedItems": "மதிப்பிடப்படாத பொருட்களை நகர்த்துவதற்கு முன் கேளு", + "settingsConfirmationAfterMoveToBinItems": "மறுசுழற்சி தொட்டியில் உருப்படிகளை நகர்த்திய பின் செய்தியைக் காட்டு", + "settingsConfirmationVaultDataLoss": "பெட்டக தரவு இழப்பு எச்சரிக்கையைக் காட்டு", + "settingsNavigationDrawerTile": "வழிசெலுத்தல் பட்டியல்", + "settingsNavigationDrawerEditorPageTitle": "வழிசெலுத்தல் பட்டியல்", + "settingsNavigationDrawerBanner": "பட்டியல் உருப்படிகளை நகர்த்தவும் மறுவரிசைப்படுத்தவும் தொட்டுப் பிடிக்கவும்.", + "settingsNavigationDrawerTabTypes": "வகைகள்", + "settingsNavigationDrawerTabAlbums": "தொகுப்புகள்", + "settingsNavigationDrawerTabPages": "பக்கங்கள்", + "settingsNavigationDrawerAddAlbum": "தொகுப்பைச் சேர்", + "settingsThumbnailSectionTitle": "சிறு உருவங்கள்", + "settingsThumbnailOverlayTile": "மேலடுக்கு", + "settingsThumbnailOverlayPageTitle": "மேலடுக்கு", + "settingsThumbnailShowHdrIcon": "எச்டிஆர் படவுருவைக் காட்டு", + "settingsThumbnailShowFavouriteIcon": "பிடித்த படவுருவைக் காட்டு", + "settingsThumbnailShowTagIcon": "குறிச்சொல் படவுருவைக் காட்டு", + "settingsThumbnailShowLocationIcon": "இருப்பிட படவுருவைக் காட்டு", + "settingsThumbnailShowMotionPhotoIcon": "இயக்கப் படப் படவுருவைக் காட்டு", + "settingsThumbnailShowRating": "மதிப்பீட்டைக் காட்டு", + "settingsThumbnailShowRawIcon": "மூல படவுருவைக் காட்டு", + "settingsThumbnailShowVideoDuration": "காணொளி காலம் காட்டு", + "settingsCollectionQuickActionsTile": "விரைவான செயல்கள்", + "settingsCollectionQuickActionEditorPageTitle": "விரைவான செயல்கள்", + "settingsCollectionQuickActionTabBrowsing": "உலாவுதல்", + "settingsCollectionQuickActionTabSelecting": "தேர்ந்தெடுப்பது", + "settingsCollectionBrowsingQuickActionEditorBanner": "பொத்தான்களை நகர்த்தவும், உருப்படிகளை உலாவும்போது எந்த நடவடிக்கைகள் காண்பிக்கப்படுகின்றன என்பதைத் தேர்ந்தெடு.", + "settingsCollectionBurstPatternsNone": "எதுவுமில்லை", + "settingsViewerSectionTitle": "பார்வையாளர்", + "settingsCollectionSelectionQuickActionEditorBanner": "பொத்தான்களை நகர்த்தவும், உருப்படிகளைத் தேர்ந்தெடுக்கும்போது எந்த நடவடிக்கைகள் காண்பிக்கப்படுகின்றன என்பதைத் தேர்ந்தெடு.", + "settingsViewerGestureSideTapNext": "முந்தைய/அடுத்த உருப்படியைக் காட்ட திரை விளிம்புகளில் தட்டு", + "settingsViewerUseCutout": "வெட்டு வெளியைப் பயன்படுத்து", + "settingsViewerMaximumBrightness": "அதிகபட்ச ஒளி", + "settingsMotionPhotoAutoPlay": "தானியங்கு இயக்கப் புகைப்படங்கள்", + "settingsImageBackground": "படப் பின்னணி", + "settingsViewerQuickActionsTile": "விரைவான செயல்கள்", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "காட்டப்பட்ட பொத்தான்கள்", + "settingsViewerQuickActionEditorPageTitle": "விரைவான செயல்கள்", + "settingsViewerQuickActionEditorBanner": "பொத்தான்களை நகர்த்தவும், பார்வையாளரில் எந்த நடவடிக்கைகள் காண்பிக்கப்படுகின்றன என்பதைத் தேர்ந்தெடு.", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "கிடைக்கும் பொத்தான்கள்", + "settingsViewerOverlayTile": "மேலடுக்கு", + "settingsViewerOverlayPageTitle": "மேலடுக்கு", + "settingsViewerShowOverlayOnOpening": "திறக்கையில் காட்டு", + "settingsViewerShowHistogram": "அலைவெண் செவ்வகப் படம் காட்டு", + "settingsViewerShowMinimap": "சிறுவரைப்படம் காட்டு", + "settingsViewerShowInformation": "தகவலைக் காட்டு", + "settingsViewerShowInformationSubtitle": "தலைப்பு, தேதி, இடம், போன்றவற்றைக் காட்டு.", + "settingsViewerShowRatingTags": "மதிப்பீடு மற்றும் குறிச்சொற்களைக் காட்டு", + "settingsViewerShowShootingDetails": "படப்பிடிப்பு விவரங்களைக் காட்டு", + "settingsViewerShowDescription": "விளக்கத்தைக் காட்டு", + "settingsViewerShowOverlayThumbnails": "சிறு உருவங்களைக் காட்டு", + "settingsViewerEnableOverlayBlurEffect": "மங்கலான விளைவு", + "settingsSlideshowShuffle": "கலக்கு", + "settingsSlideshowFillScreen": "திரை நிரப்பு", + "settingsSlideshowAnimatedZoomEffect": "அசைவூட்டம் மலர்ச்சி விளைவு", + "settingsSlideshowTransitionTile": "மாற்றம்", + "settingsSlideshowIntervalTile": "இடைவேளை", + "settingsSlideshowVideoPlaybackTile": "காணொளி மீட்பொலி", + "settingsSlideshowVideoPlaybackDialogTitle": "காணொளி மீட்பொலி", + "settingsVideoPageTitle": "காணொளி அமைப்புகள்", + "settingsVideoSectionTitle": "காணொளி", + "settingsVideoShowVideos": "காணொளிகளைக் காட்டு", + "settingsVideoPlaybackTile": "மீட்பொலி", + "focalLength": "{length} மிமீ", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "entryActionRename": "மறுபெயரிடு", + "entryActionRestore": "மீட்டெடு", + "entryActionRotateCCW": "எதிரெதிர் திசையில் சுழற்று", + "entryActionViewSource": "மூலத்தைக் காண்க", + "entryActionShowGeoTiffOnMap": "வரைபட மேலடுக்கு எனக் காட்டு", + "entryActionConvertMotionPhotoToStillImage": "நிலை படத்திற்கு மாற்று", + "entryActionViewMotionPhotoVideo": "திறந்த காணொளி", + "entryActionEdit": "தொகு", + "videoActionReplay10": "10 வினாடிகள் பின்தங்கியபடி நாடிச்செல்", + "videoActionSkip10": "10 வினாடிகள் முன்னோக்கி நாடிச்செல்", + "filterNoTagLabel": "குறிச்சொல்இடப்படாதது", + "filterNoTitleLabel": "தலைப்பில்லாத", + "filterOnThisDayLabel": "இந்த நாளில்", + "filterRecentlyAddedLabel": "அண்மைக் காலத்தில் சேர்க்கப்பட்டது", + "albumTierPinned": "பின்செய்த்து", + "overlayHistogramNone": "எதுவுமில்லை", + "videoPlaybackSkip": "தவிர்", + "videoPlaybackMuted": "ஒலிமுடக்கி இயக்கு", + "videoResumptionModeNever": "ஒருபோதும்", + "viewerTransitionZoomIn": "பெரிதாக்கு", + "viewerTransitionNone": "எதுவுமில்லை", + "wallpaperTargetHome": "முகப்புத் திரை", + "otherDirectoryDescription": "“{name}” அடைவு", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "missingSystemFilePickerDialogMessage": "கணினி கோப்பு பிக்கர் காணவில்லை அல்லது முடக்கப்பட்டுள்ளது. தயவுசெய்து அதை இயக்கி மீண்டும் முயற்சிக்கவும்.", + "nameConflictDialogMultipleSourceMessage": "சில கோப்புகளுக்கு ஒரே பெயர் உள்ளது.", + "videoStartOverButtonLabel": "மறுதொடக்கம்", + "videoResumeButtonLabel": "மீண்டும் தொடங்குங்கள்", + "setCoverDialogLatest": "அண்மைக் கால உருப்படி", + "setCoverDialogAuto": "தானி", + "newVaultDialogTitle": "புதிய பெட்டகம்", + "vaultBinUsageDialogMessage": "சில பெட்டகங்கள் மறுசுழற்சி தொட்டியைப் பயன்படுத்துகின்றன.", + "renameAlbumDialogLabel": "புதிய பெயர்", + "renameEntrySetPageInsertTooltip": "புலம் செருகவும்", + "renameEntrySetPagePreviewSectionTitle": "முன்னோட்டம்", + "renameProcessorCounter": "கணக்கிடு", + "renameProcessorHash": "கொத்து", + "renameProcessorName": "பெயர்", + "exportEntryDialogWidth": "அகலம்", + "exportEntryDialogHeight": "உயரம்", + "editEntryDialogCopyFromItem": "பிற உருப்படியிலிருந்து நகலெடு", + "durationDialogHours": "மணிகள்", + "aboutBugSaveLogInstruction": "பயன்பாட்டு பதிவுகளை ஒரு கோப்பில் சேமி", + "aboutBugCopyInfoInstruction": "கணினி தகவல்களை நகலெடு", + "aboutBugCopyInfoButton": "நகலெடு", + "collectionActionAddShortcut": "குறுக்குவழியைச் சேர்", + "collectionActionSetHome": "வீட்டாக அமை", + "collectionSearchTitlesHintText": "தலைப்புகளைத் தேடு", + "tagPageTitle": "குறிச்சொற்கள்", + "settingsDoubleBackExit": "வெளியேற “பின்” என்பதை இரண்டு முறை தட்டு", + "settingsCollectionBurstPatternsTile": "வடிவங்கள் வெடிப்பு", + "settingsViewerQuickActionEmpty": "பொத்தான்கள் இல்லை", + "settingsViewerSlideshowTile": "படவில்லைக் காட்சி", + "settingsViewerSlideshowPageTitle": "படவில்லைக் காட்சி", + "settingsSlideshowRepeat": "மறுசெய்கை", + "settingsSubtitleThemeTile": "வசன வரிகள்", + "settingsLanguageTile": "மொழி", + "statsPageTitle": "புள்ளிவிவரங்கள்", + "statsWithGps": "{count, plural, =1{1 இடம் கொண்ட உருப்படி} other{{count} இருப்பிடத்துடன் உருப்படிகள்}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "statsTopAlbumsSectionTitle": "மேல் தொகுப்புகள்", + "viewerOpenPanoramaButtonLabel": "பனோரமா திற", + "viewerErrorUnknown": "அச்சச்சோ!", + "mapZoomInTooltip": "பெரிதாக்கு", + "openMapPageTooltip": "வரைபட பக்கத்தில் காண்க", + "viewerInfoSearchSuggestionDate": "தேதி & நேரம்", + "viewerInfoSearchSuggestionDescription": "விவரம்", + "viewerInfoSearchSuggestionDimensions": "பரிமாணங்கள்", + "collectionDeleteFailureFeedback": "{count, plural, =1{நீக்குவதில் தோல்வி 1 உருப்படி} other{நீக்குவதில் தோல்வி {count} உருப்படிகள்}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionCopyFailureFeedback": "{count, plural, =1{நகலெடுப்பதில் தோல்வி 1 உருப்படி} other{நகலெடுப்பதில் தோல்வி {count} உருப்படிகள்}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{நகர்த்துவதில் தோல்வி 1 உருப்படி} other{நகர்த்துவதில் தோல்வி {count} உருப்படிகள்}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "columnCount": "{count, plural, =1{{count} நெடுவரிசை} other{{count} நெடுவரிசைகள்}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeSeconds": "{count, plural, =1{{count} இரண்டாவது} other{{count} விநாடிகள்}}", + "@timeSeconds": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "timeMinutes": "{count, plural, =1{{count} நிமிடம்} other{{count} நிமிடங்கள்}}", + "@timeMinutes": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "itemCount": "{count, plural, =1{{count} உருப்படி} other{{count} உருப்படிகள்}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "applyButtonLabel": "இடு", + "timeDays": "{count, plural, =1{{count} நாள்} other{{count} நாட்கள்}}", + "@timeDays": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteButtonLabel": "நீக்கு", + "nextButtonLabel": "அடுத்தது", + "showButtonLabel": "காட்டு", + "hideButtonLabel": "மறை", + "continueButtonLabel": "தொடரவும்", + "saveCopyButtonLabel": "நகலைச் சேமி", + "applyTooltip": "இடு", + "cancelTooltip": "விலக்கு", + "changeTooltip": "மாற்று", + "clearTooltip": "துடை", + "previousTooltip": "முந்தைய", + "nextTooltip": "அடுத்தது", + "showTooltip": "காட்டு", + "hideTooltip": "மறை", + "resetTooltip": "மீட்டமை", + "saveTooltip": "சேமி", + "actionRemove": "அகற்று", + "stopTooltip": "நிறுத்து", + "pickTooltip": "தேர்ந்தெடு", + "doubleBackExitMessage": "வெளியேற “பின்” என்பதைத் தட்டவும்.", + "doNotAskAgain": "மீண்டும் கேட்க வேண்டாம்", + "sourceStateLoading": "ஏற்றுகிறது", + "sourceStateCataloguing": "பட்டியலிடுதல்", + "sourceStateLocatingCountries": "நாடுகளைக் கண்டறிதல்", + "sourceStateLocatingPlaces": "இடங்களைக் கண்டறிதல்", + "chipActionDelete": "நீக்கு", + "chipActionRemove": "அகற்று", + "chipActionShowCollection": "சேகரிப்பில் காட்டு", + "chipActionGoToAlbumPage": "ஆல்பங்களில் காட்டு", + "chipActionGoToCountryPage": "நாடுகளில் காட்டு", + "chipActionGoToPlacePage": "இடங்களில் காண்பி", + "chipActionGoToTagPage": "குறிச்சொற்களில் காட்டு", + "chipActionGoToExplorerPage": "உலாவில் காட்டு", + "chipActionFilterOut": "வடிகட்டி நீக்கு", + "chipActionFilterIn": "வடிகட்டி வை", + "chipActionHide": "மறை", + "chipActionLock": "பூட்டு", + "chipActionPin": "மேலே முள்", + "chipActionUnpin": "மேலே இருந்து அவிழ்த்து விடு", + "chipActionRename": "மறுபெயரிடு", + "chipActionSetCover": "அட்டை அமை", + "chipActionShowCountryStates": "நிலைகளைக் காட்டு", + "chipActionCreateAlbum": "ஆல்பத்தை உருவாக்கு", + "chipActionCreateVault": "பெட்டகத்தை உருவாக்கு", + "chipActionConfigureVault": "பெட்டகத்தை உள்ளமை", + "entryActionCopyToClipboard": "இடைநிலைப் பலகைக்கு நகலெடு", + "entryActionDelete": "நீக்கு", + "entryActionConvert": "நிலைமாற்று", + "entryActionExport": "ஏற்றுமதி", + "entryActionInfo": "தகவல்", + "entryActionRotateCW": "கடிகார திசையில் சுழற்று", + "entryActionFlip": "கிடைமட்டமாகப் புரட்டு", + "entryActionPrint": "அச்சிடு", + "entryActionShare": "பங்கு", + "entryActionShareImageOnly": "படத்தை மட்டும் பகிர்", + "entryActionShareVideoOnly": "காணொளியைப் பகிர்", + "entryActionOpen": "உடன் திற", + "entryActionSetAs": "என அமை", + "entryActionCast": "நடிகர்கள்", + "entryActionOpenMap": "வரைபட பயன்பாட்டில் காண்பி", + "entryActionRotateScreen": "திரை சுழற்று", + "entryActionAddFavourite": "பிடித்தவைகளில் சேர்", + "entryActionRemoveFavourite": "பிடித்தவைகளிலிருந்து அகற்று", + "videoActionShowPreviousFrame": "முந்தைய சட்டத்தைக் காட்டு", + "videoActionShowNextFrame": "அடுத்த சட்டகத்தைக் காட்டு", + "videoActionSelectStreams": "தடங்களைத் தேர்ந்தெடு", + "videoActionSetSpeed": "பின்னணி விரைவு", + "videoActionCaptureFrame": "பிடிப்பு சட்டகம்", + "videoActionMute": "முடக்கு", + "videoActionUnmute": "ஒலித்தடையை நீக்கு", + "videoActionPause": "இடைநிறுத்தம்", + "videoActionPlay": "இயக்கு", + "videoActionABRepeat": "அ-ஆ மீண்டும்", + "videoRepeatActionSetStart": "தொடக்கத்தை அமை", + "videoRepeatActionSetEnd": "முடிவை அமை", + "viewerActionSettings": "அமைப்புகள்", + "viewerActionLock": "பூட்டு பார்வையாளர்", + "slideshowActionResume": "மீண்டும் தொடங்குங்கள்", + "viewerActionUnlock": "பார்வையாளர்பூட்டைத் திற", + "slideshowActionShowInCollection": "சேகரிப்பில் காட்டு", + "entryInfoActionEditDate": "தேதி & நேரத்தைத் திருத்து", + "entryInfoActionEditLocation": "இருப்பிடத்தைத் திருத்து", + "entryInfoActionEditTitleDescription": "தலைப்பு & விளக்கத்தைத் திருத்து", + "entryInfoActionEditRating": "மதிப்பீட்டைத் திருத்து", + "entryInfoActionEditTags": "குறிச்சொற்களைத் திருத்து", + "filterAspectRatioPortraitLabel": "உருவப்படம்", + "filterBinLabel": "மறுசுழற்சி கூடை", + "entryInfoActionRemoveMetadata": "மேனிலை தரவை அகற்று", + "entryInfoActionExportMetadata": "ஏற்றுமதி மேனிலை தரவு", + "entryInfoActionRemoveLocation": "இருப்பிடத்தை அகற்று", + "editorActionTransform": "உருமாற்று", + "editorTransformCrop": "வெட்டி எடு", + "editorTransformRotate": "சுழற்று", + "cropAspectRatioFree": "கட்டற்ற", + "cropAspectRatioOriginal": "அசல்", + "cropAspectRatioSquare": "நாற்கை", + "filterAspectRatioLandscapeLabel": "நிலப்பரப்பு", + "filterFavouriteLabel": "பிடித்த", + "filterNoDateLabel": "மதிப்பிடப்படாதது", + "filterNoAddressLabel": "முகவரி இல்லை", + "filterLocatedLabel": "அமைந்துள்ளது", + "filterNoLocationLabel": "திறக்கப்படாதது", + "filterNoRatingLabel": "மதிப்பிடப்படாதது", + "filterTaggedLabel": "குறிச்சொல்இடப்பட்டது", + "filterRatingRejectedLabel": "நிராகரிக்கப்பட்டது", + "filterTypeAnimatedLabel": "உயிருள்ளதுபோல", + "filterTypeMotionPhotoLabel": "இயக்கப் புகைப்படம்", + "filterTypePanoramaLabel": "பரந்ததோற்றம்", + "filterTypeRawLabel": "பச்சையான", + "filterTypeGeotiffLabel": "புவிடிஃப்", + "filterMimeImageLabel": "படம்", + "filterMimeVideoLabel": "காணொளி", + "filterTypeSphericalVideoLabel": "360 ° காணொளி", + "accessibilityAnimationsRemove": "திரை விளைவுகளைத் தடு", + "accessibilityAnimationsKeep": "திரை விளைவுகளை வைத்திரு", + "albumTierNew": "புதிய", + "wallpaperTargetLock": "பூட்டுத் திரை", + "wallpaperTargetHomeLock": "முகப்பு மற்றும் பூட்டு திரைகள்", + "widgetDisplayedItemRandom": "சீரற்ற", + "widgetDisplayedItemMostRecent": "மிக அண்மைக் கால", + "albumTierSpecial": "பொது", + "albumTierApps": "பயன்பாடுகள்", + "albumTierVaults": "நிலவறைகள்", + "albumTierDynamic": "மாறும்", + "albumTierRegular": "மற்றவைகள்", + "coordinateFormatDms": "டிமிவி", + "coordinateFormatDecimal": "தசம டிகிரி", + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsNorth": "வ", + "coordinateDmsSouth": "தெ", + "coordinateDmsEast": "கி", + "coordinateDmsWest": "மே", + "displayRefreshRatePreferHighest": "அதிக விகிதம்", + "displayRefreshRatePreferLowest": "குறைந்த விகிதம்", + "keepScreenOnNever": "ஒருபோதும்", + "keepScreenOnVideoPlayback": "காணொளி இயக்கத்தின்போது", + "lengthUnitPixel": "புள்ளி", + "lengthUnitPercent": "%", + "keepScreenOnViewerOnly": "பார்வையாளர் பக்கம் மட்டுமே", + "keepScreenOnAlways": "எப்போதும்", + "mapStyleGoogleNormal": "கூகிள் வரைபடங்கள்", + "mapStyleGoogleHybrid": "கூகிள் வரைபடங்கள் (கலப்பின)", + "mapStyleGoogleTerrain": "கூகிள் வரைபடங்கள் (நிலப்பரப்பு)", + "mapStyleOsmLiberty": "திதெவ விடுதலை", + "mapStyleOpenTopoMap": "திறடோபோவரைபடம்", + "maxBrightnessNever": "ஒருபோதும்", + "mapStyleOsmHot": "மனிதாபிமான திதெவ", + "mapStyleStamenWatercolor": "மகரந்தம் நீர்நிறம்", + "maxBrightnessAlways": "எப்போதும்", + "nameConflictStrategyRename": "மறுபெயரிடு", + "nameConflictStrategyReplace": "மாற்று", + "nameConflictStrategySkip": "தவிர்", + "overlayHistogramLuminance": "ஒளிர்மை", + "overlayHistogramRGB": "சிபநீ", + "subtitlePositionTop": "மேலே", + "subtitlePositionBottom": "கீழே", + "themeBrightnessLight": "ஒளி", + "themeBrightnessDark": "இருண்ட", + "themeBrightnessBlack": "கருப்பு", + "unitSystemMetric": "மீட்டர் முறை", + "unitSystemImperial": "ஏகாதிபத்திய", + "vaultLockTypePattern": "வரைவடிவம்", + "vaultLockTypePin": "தன்எண்", + "vaultLockTypePassword": "கடவுச்சொல்", + "videoLoopModeNever": "ஒருபோதும்", + "videoLoopModeShortOnly": "குறுகிய காணொளிகள் மட்டுமே", + "settingsVideoEnablePip": "படத்துள்-படம்", + "videoLoopModeAlways": "எப்போதும்", + "videoControlsPlayOutside": "மற்ற இயக்கியுடன் திற", + "videoPlaybackWithSound": "ஒலியுடன் இயக்கு", + "videoResumptionModeAlways": "எப்போதும்", + "viewerTransitionSlide": "படவில்லை", + "viewerTransitionParallax": "இடமாறு தோற்றம்", + "viewerTransitionFade": "மங்கல்", + "widgetOpenPageHome": "திறந்த வீடு", + "storageVolumeDescriptionFallbackPrimary": "உள் சேமிப்பு", + "storageVolumeDescriptionFallbackNonPrimary": "நினைவு அட்டை", + "rootDirectoryDescription": "வேர் அடைவு", + "widgetOpenPageCollection": "திறந்த சேகரிப்பு", + "widgetOpenPageViewer": "திறந்த பார்வையாளர்", + "widgetTapUpdateWidget": "நிரல் பலகையைப் புதுப்பி", + "storageAccessDialogMessage": "இந்தப் பயன்பாட்டுக்கு அணுகலை வழங்க அடுத்த திரையில் உள்ள “{volume}” இன் {directory} ஐத் தேர்ந்தெடு.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "restrictedAccessDialogMessage": "இந்தப் பயன்பாடு “{volume}” இன் {directory} இல் உள்ள கோப்புகளை மாற்ற அனுமதிக்கப்படவில்லை.\n\nஉருப்படிகளை மற்றொரு கோப்பகத்திற்கு நகர்த்துவதற்கு முன்பே நிறுவப்பட்ட கோப்பு மேலாளர் அல்லது கேலரி பயன்பாட்டைப் பயன்படுத்தவும்.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "notEnoughSpaceDialogMessage": "இந்தச் செயல்பாட்டிற்கு “{volume}” இல் இலவச இடத்தின் {neededSize} தேவை, ஆனால் {freeSize} மட்டுமே உள்ளது.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "nameConflictDialogSingleSourceMessage": "இலக்கு கோப்புறையில் உள்ள சில கோப்புகளுக்கு ஒரே பெயர் உள்ளது.", + "addShortcutDialogLabel": "குறுக்குவழி சிட்டை", + "unsupportedTypeDialogMessage": "{count, plural, =1{இந்தச் செயல்பாடு பின்வரும் வகையின் உருப்படிகளுக்கு ஆதரிக்கப்படவில்லை: {types}.} other{இந்தச் செயல்பாடு பின்வரும் வகைகளின் உருப்படிகளுக்கு ஆதரிக்கப்படவில்லை: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "addShortcutButtonLabel": "கூட்டு", + "noMatchingAppDialogMessage": "இதைக் கையாளக்கூடிய பயன்பாடுகள் எதுவும் இல்லை.", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{இந்த உருப்படியை மறுசுழற்சி தொட்டியில் நகர்த்தவா?} other{இந்த {count} உருப்படிகளை மறுசுழற்சி தொட்டியில் நகர்த்தவா?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{இந்த உருப்படியை நீக்கு?} other{இந்த {count} உருப்படிகளை நீக்கு?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "moveUndatedConfirmationDialogMessage": "தொடர்வதற்கு முன் உருப்படி தேதிகளைச் சேமிக்கவா?", + "moveUndatedConfirmationDialogSetDate": "தேதிகளைச் சேமி", + "videoResumeDialogMessage": "{time} இல் மீண்டும் இயக்குவதை விரும்புகிறீர்களா?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "setCoverDialogCustom": "தனிப்பயன்", + "hideFilterConfirmationDialogMessage": "பொருந்தக்கூடிய புகைப்படங்கள் மற்றும் காணொளிகள் உங்கள் சேகரிப்பிலிருந்து மறைக்கப்படும். “தனியுரிமை” அமைப்புகளிலிருந்து அவற்றை மீண்டும் காட்டலாம்.\n\n அவற்றை மறைக்க விரும்புகிறீர்களா?", + "newAlbumDialogTitle": "புதிய தொகுப்பு", + "newAlbumDialogNameLabel": "தொகுப்பின் பெயர்", + "newAlbumDialogAlbumAlreadyExistsHelper": "தொகுப்பு ஏற்கனவே உள்ளது", + "newAlbumDialogNameLabelAlreadyExistsHelper": "அடைவு ஏற்கனவே உள்ளது", + "newAlbumDialogStorageLabel": "சேமிப்பு:", + "newDynamicAlbumDialogTitle": "புதிய மாறும் தொகுப்பு", + "dynamicAlbumAlreadyExists": "மாறும் தொகுப்பு ஏற்கனவே உள்ளது", + "newVaultWarningDialogMessage": "பெட்டகங்களில் உள்ள உருப்படிகள் இந்தப் பயன்பாட்டிற்கு மட்டுமே கிடைக்கின்றன, மற்றவைகளுக்கு இல்லை.\n\n இந்தப் பயன்பாட்டை நிறுவல் நீக்கினால் அல்லது இந்தப் பயன்பாட்டு தரவை அழித்தால், இந்த உருப்படிகள் அனைத்தையும் இழப்பீர்கள்.", + "configureVaultDialogTitle": "பெட்டகத்தை உள்ளமை", + "vaultDialogLockModeWhenScreenOff": "திரை அணைக்கப்படும்போது பூட்டு", + "vaultDialogLockTypeLabel": "பூட்டு வகை", + "patternDialogEnter": "வடிவத்தை உள்ளிடு", + "patternDialogConfirm": "முறை உறுதிப்படுத்து", + "pinDialogEnter": "தன்எண் உள்ளிடவும்", + "pinDialogConfirm": "தன்எண் உறுதிப்படுத்து", + "passwordDialogEnter": "கடவுச்சொல்லை உள்ளிடு", + "passwordDialogConfirm": "கடவுச்சொல்லை உறுதிப்படுத்து", + "authenticateToConfigureVault": "பெட்டகத்தை உள்ளமைக்க ஏற்பு", + "authenticateToUnlockVault": "பெட்டகத்தைத் திறக்க ஏற்பு", + "renameAlbumDialogLabelAlreadyExistsHelper": "அடைவு ஏற்கனவே உள்ளது", + "renameEntrySetPageTitle": "மறுபெயரிடு", + "renameEntrySetPagePatternFieldLabel": "பெயரிடும் முறை", + "exportEntryDialogFormat": "வடிவம்:", + "exportEntryDialogQuality": "தரம்", + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{இந்தத் தொகுப்பையும் அதில் உள்ள உருப்படியையும் நீக்கு?} other{இந்தத் தொகுப்பையும் அதில் உள்ள {count} உருப்படிகளையும் நீக்கு?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{இந்தத் தொகுப்பையும் அவற்றில் உள்ள உருப்படியையும் நீக்கு?} other{இந்தத் தொகுப்பையும் அவற்றில் உள்ள {count} உருப்படிகளையும் நீக்கு?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int", + "format": "decimalPattern" + } + } + }, + "exportEntryDialogWriteMetadata": "மேனிலை தரவை எழுதுங்கள்", + "renameEntryDialogLabel": "புதிய பெயர்", + "editEntryDialogTargetFieldsHeader": "மாற்றுவதற்கான புலங்கள்", + "editEntryDateDialogTitle": "தேதி & நேரம்", + "editEntryDateDialogSetCustom": "தனிப்பயன் தேதியை அமை", + "editEntryDateDialogCopyField": "மற்ற தேதியிலிருந்து நகலெடு", + "editEntryDateDialogExtractFromTitle": "தலைப்பிலிருந்து பிரித்தெடு", + "editEntryDateDialogShift": "பெயர்வு", + "settingsVideoAutoPlay": "தானியங்கு", + "settingsVideoLoopModeTile": "சுழல் பயன்முறை", + "settingsVideoPlaybackPageTitle": "மீட்பொலி", + "settingsVideoEnableHardwareAcceleration": "வன்பொருள் முடுக்கம்", + "settingsVideoLoopModeDialogTitle": "சுழல் பயன்முறை", + "settingsVideoResumptionModeTile": "காணொளி மீட்பொலி", + "settingsVideoResumptionModeDialogTitle": "மீட்பொலியை மீண்டும் தொடங்கு", + "settingsVideoBackgroundMode": "பின்னணி முறை", + "settingsVideoBackgroundModeDialogTitle": "பின்னணி முறை", + "settingsVideoControlsTile": "கட்டுப்பாடுகள்", + "settingsVideoControlsPageTitle": "கட்டுப்பாடுகள்", + "settingsVideoButtonsTile": "பொத்தான்கள்", + "settingsVideoGestureDoubleTapTogglePlay": "விளையாட/இடைநிறுத்த இரட்டை தட்டவும்", + "settingsVideoGestureSideDoubleTapSeek": "பின்தங்கிய/முன்னோக்கி தேட திரை விளிம்புகளில் இரட்டை தட்டவும்", + "settingsVideoGestureVerticalDragBrightnessVolume": "பொலிவு/அளவை சரிசெய்ய மேலே அல்லது கீழே தேய்", + "settingsSubtitleThemePageTitle": "வசன வரிகள்", + "settingsSubtitleThemeSample": "இது ஒரு மாதிரி.", + "settingsSubtitleThemeTextAlignmentTile": "உரை சீரமைப்பு", + "settingsSubtitleThemeTextAlignmentDialogTitle": "உரை சீரமைப்பு", + "settingsSubtitleThemeTextPositionTile": "உரை நிலை", + "settingsSubtitleThemeTextPositionDialogTitle": "உரை நிலை", + "settingsSubtitleThemeTextSize": "உரை அளவு", + "settingsSubtitleThemeShowOutline": "சுருக்கம் மற்றும் நிழலைக் காட்டுங்கள்", + "settingsSubtitleThemeTextColor": "உரை நிறம்", + "settingsSubtitleThemeTextOpacity": "உரை ஒளிபுகாநிலை", + "settingsSubtitleThemeBackgroundColor": "பின்னணி நிறம்", + "settingsSubtitleThemeBackgroundOpacity": "பின்னணி ஒளிபுகாநிலை", + "settingsSubtitleThemeTextAlignmentLeft": "இடது", + "settingsSubtitleThemeTextAlignmentCenter": "நடுவண்", + "settingsSubtitleThemeTextAlignmentRight": "வலது", + "settingsPrivacySectionTitle": "தனியுரிமை", + "settingsAllowInstalledAppAccess": "பயன்பாட்டு சரக்குகளுக்கான அணுகலை அனுமதி", + "settingsAllowInstalledAppAccessSubtitle": "தொகுப்புக் காட்சியை மேம்படுத்தப் பயன்படுகிறது", + "settingsAllowErrorReporting": "பெயரிலி பிழை அறிக்கையை அனுமதி", + "settingsSaveSearchHistory": "தேடல் வரலாற்றைச் சேமி", + "settingsHiddenItemsTile": "மறைக்கப்பட்ட உருப்படிகள்", + "settingsHiddenItemsPageTitle": "மறைக்கப்பட்ட உருப்படிகள்", + "settingsHiddenFiltersBanner": "மறைக்கப்பட்ட வடிப்பான்களுடன் பொருந்தக்கூடிய புகைப்படங்கள் மற்றும் காணொளிகள் உங்கள் சேகரிப்பில் தோன்றாது.", + "settingsHiddenFiltersEmpty": "மறைக்கப்பட்ட வடிப்பான்கள் இல்லை", + "settingsStorageAccessTile": "சேமிப்பக அணுகல்", + "settingsEnableBin": "மறுசுழற்சி தொட்டியைப் பயன்படுத்து", + "settingsEnableBinSubtitle": "நீக்கப்பட்ட பொருட்களை 30 நாட்களுக்கு வைத்திரு", + "settingsDisablingBinWarningDialogMessage": "மறுசுழற்சி தொட்டியில் உள்ள உருப்படிகள் என்றென்றும் நீக்கப்படும்.", + "settingsAllowMediaManagement": "ஊடக நிர்வாகத்தை அனுமதி", + "settingsStorageAccessPageTitle": "சேமிப்பக அணுகல்", + "settingsStorageAccessBanner": "சில கோப்பகங்களுக்கு அவற்றில் உள்ள கோப்புகளை மாற்ற வெளிப்படையான அணுகல் மானியம் தேவைப்படுகிறது. நீங்கள் முன்பு அணுகலை வழங்கிய கோப்பகங்களை இங்கே மதிப்பாய்வு செய்யலாம்.", + "settingsStorageAccessEmpty": "அணுகல் மானியங்கள் இல்லை", + "settingsStorageAccessRevokeTooltip": "திரும்பப்பெறு", + "settingsAccessibilitySectionTitle": "அணுகுதிறன்", + "settingsRemoveAnimationsTile": "அசைவூட்டங்களை அகற்று", + "settingsRemoveAnimationsDialogTitle": "அசைவூட்டங்களை அகற்று", + "settingsTimeToTakeActionTile": "நடவடிக்கை எடுக்க வேண்டிய நேரம்", + "settingsAccessibilityShowPinchGestureAlternatives": "பல-தொடு சைகை மாற்றுகளைக் காட்டு", + "settingsDisplaySectionTitle": "காட்சி", + "settingsThemeBrightnessTile": "கருப்பொருள்", + "settingsThemeBrightnessDialogTitle": "கருப்பொருள்", + "settingsThemeColorHighlights": "வண்ண சிறப்பம்சங்கள்", + "settingsThemeEnableDynamicColor": "மாறும் நிறம்", + "settingsDisplayRefreshRateModeTile": "புதுப்பிப்பு வீதத்தைக் காண்பி", + "settingsDisplayRefreshRateModeDialogTitle": "புதுப்பிப்பு வீதம்", + "settingsDisplayUseTvInterface": "ஆண்ட்ராய்டு தொலைகாட்சி இடைமுகம்", + "settingsLanguageSectionTitle": "மொழி & வடிவங்கள்", + "settingsLanguagePageTitle": "மொழி", + "settingsCoordinateFormatTile": "ஆய வடிவம்", + "settingsCoordinateFormatDialogTitle": "ஆய வடிவம்", + "settingsUnitSystemTile": "அலகுகள்", + "settingsUnitSystemDialogTitle": "அலகுகள்", + "settingsForceWesternArabicNumeralsTile": "அரபு எண்களைக் கட்டாயப்படுத்துங்கள்", + "settingsScreenSaverPageTitle": "திரை சேமிப்பான்", + "settingsWidgetPageTitle": "புகைப்பட சட்டகம்", + "settingsWidgetShowOutline": "சுருக்கம்", + "settingsWidgetOpenPage": "நிரல் பலகையில் தட்டும்போது", + "settingsWidgetDisplayedItem": "காட்டப்பட்ட உருப்படி", + "settingsCollectionTile": "சேகரிப்பு", + "statsTopPlacesSectionTitle": "மேல் இடங்கள்", + "statsTopCountriesSectionTitle": "மேல் நாடுகள்", + "statsTopStatesSectionTitle": "மேல் மாநிலங்கள்", + "statsTopTagsSectionTitle": "மேல் குறிச்சொற்கள்", + "viewerSetWallpaperButtonLabel": "சுவர்த்தாளை அமை", + "viewerErrorDoesNotExist": "கோப்பு இனி இல்லை.", + "viewerInfoLabelDescription": "விவரம்", + "viewerInfoLabelTitle": "தலைப்பு", + "viewerInfoLabelDate": "திகதி", + "viewerInfoLabelResolution": "பகுத்தல்", + "viewerInfoLabelSize": "அளவு", + "viewerInfoPageTitle": "தகவல்", + "viewerInfoBackToViewerTooltip": "பார்வையாளருக்குத் திரும்பு", + "viewerInfoUnknown": "தெரியாத", + "viewerInfoLabelUri": "இணையமுகவரி", + "viewerInfoLabelPath": "பாதை", + "viewerInfoLabelDuration": "காலம்", + "viewerInfoLabelOwner": "உரிமையாளர்", + "viewerInfoLabelCoordinates": "அச்சுத்தூரங்கள்", + "viewerInfoLabelAddress": "முகவரி", + "mapStyleDialogTitle": "வரைபட நடை", + "mapStyleTooltip": "வரைபட பாணியைத் தேர்ந்தெடு", + "mapZoomOutTooltip": "சிறிதாக்கு", + "mapPointNorthUpTooltip": "வடக்கு மேலே காட்டு", + "mapAttributionOsmData": "வரைபட தரவு © [OpenStreetMap](https://www.openstreetmap.org/copyright) பங்களிப்பாளர்கள்", + "mapAttributionOsmLiberty": "[OpenMapTiles](https://www.openmaptiles.org/) மூலம் ஓடுகள், [CC BY](http://creativecommons.org/licenses/by/4.0) • [OSM Americana](https://tile.ourmap.us) மூலம் புரவலசேவை", + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | [OpenTopoMap](https://opentopomap.org/) மூலம் ஓடுகள், [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "mapAttributionOsmHot": "[HOT](https://www.hotosm.org/) மூலம் ஓடுகள் • [OSM France](https://openstreetmap.fr/) மூலம் புரவலசேவை", + "mapAttributionStamen": "[Stamen Design](https://stamen.com) மூலம் ஓடுகள், [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "mapEmptyRegion": "இந்தப் வட்டாரத்தில் படங்கள் இல்லை", + "viewerInfoOpenEmbeddedFailureFeedback": "உட்பொதிக்கப்பட்ட தரவைப் பிரித்தெடுப்பதில் தோல்வி", + "viewerInfoOpenLinkText": "திற", + "viewerInfoViewXmlLinkText": "நீகுமொ காண்க", + "viewerInfoSearchFieldLabel": "மேனிலை தரவைத் தேடு", + "viewerInfoSearchEmpty": "பொருந்தக்கூடிய திறவுகோல்கள் இல்லை", + "viewerInfoSearchSuggestionResolution": "பகுத்தல்", + "viewerInfoSearchSuggestionRights": "உரிமைகள்", + "wallpaperUseScrollEffect": "முகப்புத் திரையில் உருள் விளைவைப் பயன்படுத்து", + "tagEditorPageTitle": "குறிச்சொற்களைத் திருத்து", + "tagEditorPageNewTagFieldLabel": "புதிய குறிச்சொல்", + "tagEditorPageAddTagTooltip": "குறிச்சொல்லைச் சேர்", + "tagEditorSectionRecent": "அண்மைக் கால", + "tagEditorSectionPlaceholders": "இடம் வைத்திருப்பவர்கள்", + "tagEditorDiscardDialogMessage": "மாற்றங்களை நிராகரிக்க விரும்புகிறீர்களா?", + "tagPlaceholderCountry": "நாடு", + "tagPlaceholderState": "மாநிலம்", + "tagPlaceholderPlace": "இடம்", + "panoramaEnableSensorControl": "உணரி கட்டுப்பாட்டை இயக்கு", + "panoramaDisableSensorControl": "உணரி கட்டுப்பாட்டை முடக்கு", + "sourceViewerPageTitle": "மூலம்", + "editEntryLocationDialogImportGpx": "சிபிஎக்சு இறக்குமதி", + "editEntryLocationDialogTimeShift": "நேர மாற்றம்", + "chipActionDecompose": "பிளவு", + "coordinateFormatDdm": "டிடிஎம்", + "removeEntryMetadataDialogAll": "அனைத்தும்", + "sortByPath": "பாதைமூலம்", + "searchFormatSectionTitle": "வடிவங்கள்", + "createButtonLabel": "உருவாக்கு", + "chipActionGroup": "குழுவை மாற்றவும்", + "chipActionCreateGroup": "குழுவை உருவாக்கவும்", + "albumTierGroups": "குழுக்கள்", + "newGroupDialogTitle": "புதிய குழு", + "newGroupDialogNameLabel": "குழுவின் பெயர்", + "groupAlreadyExists": "குழு ஏற்கனவே உள்ளது", + "groupEmpty": "குழுக்கள் இல்லை", + "ungrouped": "குழுவாகாதது", + "groupPickerTitle": "குழுவைத் தேர்ந்தெடுக்கவும்", + "groupPickerUseThisGroupButton": "இந்தக் குழுவைப் பயன்படுத்தவும்", + "sectionNone": "பிரிவுகள் இல்லை", + "tagPickPageTitle": "குறிச்சொல்லைத் தேர்ந்தெடு", + "settingsEnabled": "இயக்கப்பட்டது", + "settingsForced": "கட்டாயப்படுத்தப்பட்டது", + "settingsNavigationBottomActionsTile": "கீழே வழிசெலுத்தல்", + "settingsNavigationBottomActionEditorPageTitle": "கீழ் வழிசெலுத்தல்", + "settingsNavigationBottomActionEditorBanner": "பொத்தான்களை நகர்த்துவதற்கு தொட்டுப் பிடிக்கவும் மற்றும் கீழ் வழிசெலுத்தல் பட்டியில் காட்டப்படும் செயல்களைத் தேர்ந்தெடுக்கவும்.", + "settingsViewerShowZoomLevel": "சூம் அளவைக் காட்டு", + "mapStyleDialogAddStyle": "பாணியைச் சேர்க்கவும்", + "mapStyleEditorDialogName": "பெயர்", + "mapStyleEditorDialogUrl": "முகவரி", + "mapStyleEditorDialogSubdomains": "துணை டொமைன்கள்", + "mapStyleEditorDialogUserAgent": "பயனர் முகவர்" +} diff --git a/lib/l10n/app_th.arb b/lib/l10n/app_th.arb new file mode 100644 index 0000000..5ca27c4 --- /dev/null +++ b/lib/l10n/app_th.arb @@ -0,0 +1,655 @@ +{ + "welcomeMessage": "ยินดีต้อนรับสู่ Aves", + "@welcomeMessage": {}, + "appName": "Aves", + "@appName": {}, + "welcomeOptional": "ทางเลือกอื่น", + "@welcomeOptional": {}, + "filterNoLocationLabel": "ไม่ระบุสถานที่", + "@filterNoLocationLabel": {}, + "filterRecentlyAddedLabel": "รายการที่เพิ่มเมื่อเร็วๆนี้", + "@filterRecentlyAddedLabel": {}, + "filterTypeAnimatedLabel": "การเคลื่อนไหว", + "@filterTypeAnimatedLabel": {}, + "filterTypeSphericalVideoLabel": "วิดีโอ 360°", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "รูปภาพ", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "วิดีโอ", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "องศา, นาที, วินาที", + "@coordinateFormatDms": {}, + "welcomeTermsToggle": "ฉันยินยอมในเงื่อนไขและข้อตกลง", + "@welcomeTermsToggle": {}, + "nextButtonLabel": "ถัดไป", + "@nextButtonLabel": {}, + "showButtonLabel": "แสดง", + "@showButtonLabel": {}, + "continueButtonLabel": "ต่อไป", + "@continueButtonLabel": {}, + "changeTooltip": "เปลี่ยน", + "@changeTooltip": {}, + "nextTooltip": "ถัดไป", + "@nextTooltip": {}, + "actionRemove": "ลบ", + "@actionRemove": {}, + "resetTooltip": "ตั้งใหม่", + "@resetTooltip": {}, + "saveTooltip": "บันทึก", + "@saveTooltip": {}, + "pickTooltip": "เลือก", + "@pickTooltip": {}, + "doubleBackExitMessage": "กดถอยหลังอีกครั้งเพื่อออก", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "ไม่ต้องถามอีก", + "@doNotAskAgain": {}, + "sourceStateLoading": "กำลังโหลด", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "กำลังจัดทำรายการ", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "กำลังค้นหาประเทศ", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "กำลังค้นหาสถานที่", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "ลบ", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "แสดงในหน้าอัลบั้ม", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "แสดงในหน้าประเทศ", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "แสดงในหน้าแท็ก", + "@chipActionGoToTagPage": {}, + "chipActionFilterOut": "กรองออก", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "กรองเข้า", + "@chipActionFilterIn": {}, + "chipActionHide": "ซ่อน", + "@chipActionHide": {}, + "chipActionPin": "ปักหมุดไว้บนสุด", + "@chipActionPin": {}, + "chipActionUnpin": "ถอนหมุดออก", + "@chipActionUnpin": {}, + "chipActionRename": "เปลี่ยนชื่อใหม่", + "@chipActionRename": {}, + "chipActionSetCover": "ตั้งเป็นภาพหน้าปก", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "สร้างอัลบั้ม", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "คัดลอกไว้ในคลิปบอร์ด", + "@entryActionCopyToClipboard": {}, + "entryActionConvert": "แปลงไฟล์", + "@entryActionConvert": {}, + "entryActionInfo": "ข้อมูล", + "@entryActionInfo": {}, + "entryActionRename": "เปลี่ยนชื่อใหม่", + "@entryActionRename": {}, + "entryActionRestore": "กู้คืน", + "@entryActionRestore": {}, + "entryActionRotateCW": "หมุนตามเข็มนาฬิกา", + "@entryActionRotateCW": {}, + "entryActionFlip": "พลิกแนวนอน", + "@entryActionFlip": {}, + "entryActionPrint": "พิมพ์", + "@entryActionPrint": {}, + "entryActionShare": "แชร์", + "@entryActionShare": {}, + "entryActionViewSource": "ดูแหล่งข้อมูล", + "@entryActionViewSource": {}, + "entryActionConvertMotionPhotoToStillImage": "แปลงเป็นภาพนิ่ง", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "เปิดวิดีโอ", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "แก้ไข", + "@entryActionEdit": {}, + "entryActionOpen": "เปิดด้วย", + "@entryActionOpen": {}, + "entryActionSetAs": "ตั้งเป็น", + "@entryActionSetAs": {}, + "entryActionOpenMap": "เปิดในแอพฯแผนที่", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "หมุนจอ", + "@entryActionRotateScreen": {}, + "entryActionRemoveFavourite": "ลบออกจากรายการโปรด", + "@entryActionRemoveFavourite": {}, + "videoActionMute": "ปิดเสียง", + "@videoActionMute": {}, + "videoActionUnmute": "เปิดเสียง", + "@videoActionUnmute": {}, + "videoActionSkip10": "เดินหน้า 10 วินาที", + "@videoActionSkip10": {}, + "slideshowActionShowInCollection": "แสดงคอลเลกชัน", + "@slideshowActionShowInCollection": {}, + "viewerActionSettings": "ตั้งค่า", + "@viewerActionSettings": {}, + "slideshowActionResume": "เล่นต่อ", + "@slideshowActionResume": {}, + "entryInfoActionEditTitleDescription": "แก้ไขชื่อและคำบรรยาย", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "แก้ไขระดับเรตติ้ง", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "แก้ไขแท็ก", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "ลบ metadata", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "ถังขยะ", + "@filterBinLabel": {}, + "filterFavouriteLabel": "รายการโปรด", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "ไม่ระบุวันที่", + "@filterNoDateLabel": {}, + "filterNoRatingLabel": "ไม่ระบุระดับ", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "ไม่ระบุแท็ก", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "ไม่ระบุชื่อ", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "ในวันนี้", + "@filterOnThisDayLabel": {}, + "filterRatingRejectedLabel": "ปฏิเสธ", + "@filterRatingRejectedLabel": {}, + "filterTypeMotionPhotoLabel": "ภาพเคลื่อนไหว", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "ภาพปริทัศน์ / แพโนรามา", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "ไฟล์ดิบ", + "@filterTypeRawLabel": {}, + "coordinateFormatDecimal": "องศาทศนิยม", + "@coordinateFormatDecimal": {}, + "coordinateDmsNorth": "ทิศเหนือ", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "ทิศใต้", + "@coordinateDmsSouth": {}, + "unitSystemMetric": "เมตริก", + "@unitSystemMetric": {}, + "unitSystemImperial": "อิมพีเรียล", + "@unitSystemImperial": {}, + "videoLoopModeShortOnly": "เฉพาะคลิปสั้น", + "@videoLoopModeShortOnly": {}, + "videoControlsPlayOutside": "เปิดด้วยตัวเล่นอื่น", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (Hybrid)", + "@mapStyleGoogleHybrid": {}, + "videoLoopModeNever": "ปิด", + "@videoLoopModeNever": {}, + "videoLoopModeAlways": "เปิดตลอด", + "@videoLoopModeAlways": {}, + "nameConflictStrategyRename": "เปลี่ยนชื่อใหม่", + "@nameConflictStrategyRename": {}, + "keepScreenOnNever": "ปิด", + "@keepScreenOnNever": {}, + "keepScreenOnAlways": "เปิดตลอด", + "@keepScreenOnAlways": {}, + "displayRefreshRatePreferHighest": "อัตราสูงสุด", + "@displayRefreshRatePreferHighest": {}, + "subtitlePositionTop": "ข้างบน", + "@subtitlePositionTop": {}, + "videoPlaybackMuted": "เล่นปิดเสียง", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "เล่นเปิดเสียง", + "@videoPlaybackWithSound": {}, + "themeBrightnessLight": "สว่าง", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "มืด", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "ดำ", + "@themeBrightnessBlack": {}, + "viewerTransitionSlide": "เลื่อน", + "@viewerTransitionSlide": {}, + "viewerTransitionFade": "เลือนหาย", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "ซูมเข้า", + "@viewerTransitionZoomIn": {}, + "viewerTransitionNone": "ไม่มี", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "โฮมสกรีน", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "ล็อกสกรีน", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "ทั้งสองอย่าง", + "@wallpaperTargetHomeLock": {}, + "widgetDisplayedItemRandom": "สุ่ม", + "@widgetDisplayedItemRandom": {}, + "widgetDisplayedItemMostRecent": "ล่าสุด", + "@widgetDisplayedItemMostRecent": {}, + "widgetOpenPageHome": "เปิดหน้าหลัก", + "@widgetOpenPageHome": {}, + "widgetOpenPageCollection": "เปิดคอลเลกชัน", + "@widgetOpenPageCollection": {}, + "entryActionRotateCCW": "หมุนทวนเข็มนาฬิกา", + "@entryActionRotateCCW": {}, + "hideButtonLabel": "ซ่อน", + "@hideButtonLabel": {}, + "deleteButtonLabel": "ลบ", + "@deleteButtonLabel": {}, + "cancelTooltip": "ยกเลิก", + "@cancelTooltip": {}, + "showTooltip": "แสดง", + "@showTooltip": {}, + "clearTooltip": "ล้าง", + "@clearTooltip": {}, + "previousTooltip": "ก่อนหน้า", + "@previousTooltip": {}, + "hideTooltip": "ซ่อน", + "@hideTooltip": {}, + "entryActionDelete": "ลบ", + "@entryActionDelete": {}, + "entryActionExport": "เอกซ์ปอตส์", + "@entryActionExport": {}, + "videoActionPause": "หยุดชั่วคราว", + "@videoActionPause": {}, + "videoActionReplay10": "ย้อนกลับ 10 วินาที", + "@videoActionReplay10": {}, + "entryActionAddFavourite": "ใส่ในรายการโปรด", + "@entryActionAddFavourite": {}, + "videoActionPlay": "เล่น", + "@videoActionPlay": {}, + "videoActionSelectStreams": "เลือกภาษา", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "ความเร็วในการเล่น", + "@videoActionSetSpeed": {}, + "entryInfoActionEditDate": "แก้ไขวันที่และเวลา", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "แก้ไขสถานที่", + "@entryInfoActionEditLocation": {}, + "entryInfoActionExportMetadata": "เอกซ์ปอตส์ metadata", + "@entryInfoActionExportMetadata": {}, + "coordinateDmsWest": "ทิศตะวันตก", + "@coordinateDmsWest": {}, + "coordinateDmsEast": "ทิศตะวันออก", + "@coordinateDmsEast": {}, + "displayRefreshRatePreferLowest": "อัตราต่ำสุด", + "@displayRefreshRatePreferLowest": {}, + "mapStyleGoogleTerrain": "Google Maps (Terrain)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyReplace": "แทนที่", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "ข้าม", + "@nameConflictStrategySkip": {}, + "viewerTransitionParallax": "แพรัลแลกซ์", + "@viewerTransitionParallax": {}, + "subtitlePositionBottom": "ข้างล่าง", + "@subtitlePositionBottom": {}, + "videoPlaybackSkip": "ข้าม", + "@videoPlaybackSkip": {}, + "albumTierSpecial": "ทั่วไป", + "@albumTierSpecial": {}, + "albumTierNew": "ใหม่", + "@albumTierNew": {}, + "albumTierPinned": "ปักหมุด", + "@albumTierPinned": {}, + "albumTierApps": "แอพฯ", + "@albumTierApps": {}, + "albumTierRegular": "อื่นๆ", + "@albumTierRegular": {}, + "storageVolumeDescriptionFallbackPrimary": "หน่วยความจำภายใน", + "@storageVolumeDescriptionFallbackPrimary": {}, + "rootDirectoryDescription": "สารบบราก", + "@rootDirectoryDescription": {}, + "notEnoughSpaceDialogMessage": "การดำเนินการนี้ต้องการพื้นที่ว่าง {neededSize} ของ “{volume}” เพื่อให้เสร็จ แต่ตอนนี้มีพื้นที่เหลือแค่ {freeSize}", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "storageVolumeDescriptionFallbackNonPrimary": "SD การ์ด", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "otherDirectoryDescription": "\"{name}\" ไดเรกทอรี", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "storageAccessDialogMessage": "โปรดเลือก {directory} ของ \"{volume}\" ในหน้าถัดไปเพื่อให้แอพฯทำการเข้าถึง", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "restrictedAccessDialogMessage": "แอพฯนี้ไม่ได้รับสิทธิ์ในการแก้ไขข้อมูลใน {directory} ของ \"{volume}\".\n\nกรุณาเลือกใช้ แอพฯจัดการไฟล์หรือแกลเลอรีอื่นๆ เพื่อย้ายข้อมูลไปไดเรกทอรีอื่น", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "setCoverDialogLatest": "รายการล่าสุด", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "อัตโนมัติ", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "กำหนดเอง", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "รูปภาพและวิดีโอที่ซ้ำกัน จะถูกซ่อนจากคอลเลกชันของคุณ คุณสามารถตั้งค่าให้แสดงได้ใน \"การตั้งค่าความเป็นส่วนตัว\"\n\nคุณแน่ใจหรือไม่ว่าต้องการซ่อน?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "อัลบั้มใหม่", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "ชื่ออัลบั้ม", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "มีไดเรกทอรีนี้อยู่แล้ว", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "พื้นที่จัดเก็บ:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "ตั้งชื่อใหม่", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "มีไดเรกทอรีนี้อยู่แล้ว", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameProcessorName": "ชื่อ", + "@renameProcessorName": {}, + "exportEntryDialogHeight": "ความสูง", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "ตั้งชื่อใหม่", + "@renameEntryDialogLabel": {}, + "editEntryDateDialogSourceFileModifiedDate": "วันที่แก้ไขไฟล์", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "ชั่วโมง", + "@durationDialogHours": {}, + "durationDialogMinutes": "นาที", + "@durationDialogMinutes": {}, + "durationDialogSeconds": "วินาที", + "@durationDialogSeconds": {}, + "editEntryLocationDialogTitle": "สถานที่", + "@editEntryLocationDialogTitle": {}, + "videoSpeedDialogLabel": "ความเร็วในการเล่น", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "วิดีโอ", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "เสียง", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "คำบรรยาย", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "ปิด", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "แทร็ก", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "ไม่มีแทร็กอื่น", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "เสร็จแล้ว!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "ล้มเหลว", + "@genericFailureFeedback": {}, + "menuActionConfigureView": "ดู", + "@menuActionConfigureView": {}, + "menuActionSelect": "เลือก", + "@menuActionSelect": {}, + "menuActionSelectAll": "เลือกทั้งหมด", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "ไม่เลือกทั้งหมด", + "@menuActionSelectNone": {}, + "menuActionMap": "แผนที่", + "@menuActionMap": {}, + "nameConflictDialogSingleSourceMessage": "มีไฟล์ที่ชื่อซ้ำในโฟลเดอร์ปลายทาง", + "@nameConflictDialogSingleSourceMessage": {}, + "addShortcutButtonLabel": "เพิ่ม", + "@addShortcutButtonLabel": {}, + "moveUndatedConfirmationDialogMessage": "บันทึกวันที่ของไอเทมก่อนดำเนินการต่อไหม?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "บันทึกวันที่", + "@moveUndatedConfirmationDialogSetDate": {}, + "nameConflictDialogMultipleSourceMessage": "มีบางไฟล์ที่มีชื่อเหมือนกัน", + "@nameConflictDialogMultipleSourceMessage": {}, + "noMatchingAppDialogMessage": "ไม่มีแอพฯที่จะจัดการสิ่งนี้ได้", + "@noMatchingAppDialogMessage": {}, + "videoResumeDialogMessage": "คุณต้องการที่จะเล่นต่อจาก {time} ไหม?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "renameEntrySetPageInsertTooltip": "แทรกฟิลด์", + "@renameEntrySetPageInsertTooltip": {}, + "videoStartOverButtonLabel": "เริ่มใหม่", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "เล่นต่อ", + "@videoResumeButtonLabel": {}, + "renameEntrySetPageTitle": "เปลี่ยนชื่อใหม่", + "@renameEntrySetPageTitle": {}, + "editEntryDialogCopyFromItem": "คัดลอกจากรายการอื่น", + "@editEntryDialogCopyFromItem": {}, + "editEntryDialogTargetFieldsHeader": "ฟิลด์ที่จะแก้ไข", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogCopyField": "คัดลอกจากวันอื่นๆ", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogTitle": "วันที่ & เวลา", + "@editEntryDateDialogTitle": {}, + "renameEntrySetPagePatternFieldLabel": "รูปแบบการตั้งชื่อ", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPagePreviewSectionTitle": "ดูตัวอย่าง", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "ตัวนับ", + "@renameProcessorCounter": {}, + "exportEntryDialogFormat": "รูปแบบ:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "ความกว้าง", + "@exportEntryDialogWidth": {}, + "editEntryDateDialogSetCustom": "กำหนดวันที่เอง", + "@editEntryDateDialogSetCustom": {}, + "locationPickerUseThisLocationButton": "ใช้ตําแหน่งนี้", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "คะแนน", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogMore": "เพิ่มเติม", + "@removeEntryMetadataDialogMore": {}, + "genericDangerWarningDialogMessage": "คุณแน่ใจไหม?", + "@genericDangerWarningDialogMessage": {}, + "editEntryLocationDialogLatitude": "ละติจูด", + "@editEntryLocationDialogLatitude": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "จำเป็นต้องใช้ XMP ในการเล่นวิดีโอในภาพเคลื่อนไหว\n\nคุณแน่ใจว่าต้องการลบออก?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "editEntryLocationDialogSetCustom": "กำหนดสถานที่เอง", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogLongitude": "ลองจิจูด", + "@editEntryLocationDialogLongitude": {}, + "editEntryLocationDialogChooseOnMap": "เลือกบนแผนที่", + "@editEntryLocationDialogChooseOnMap": {}, + "menuActionSlideshow": "สไลด์โชว์", + "@menuActionSlideshow": {}, + "menuActionStats": "สถิติ", + "@menuActionStats": {}, + "viewDialogReverseSortOrder": "เรียงลำดับย้อนกลับ", + "@viewDialogReverseSortOrder": {}, + "appPickDialogTitle": "เลือกแอพฯ", + "@appPickDialogTitle": {}, + "coverDialogTabColor": "สี", + "@coverDialogTabColor": {}, + "appPickDialogNone": "ไม่มี", + "@appPickDialogNone": {}, + "aboutBugSectionTitle": "รายงานข้อผิดพลาด", + "@aboutBugSectionTitle": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "ไลบรารีแอนดรอยด์", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesBanner": "แอพฯนี้ใช้แพ็คเกจและไลบรารีโอเพ่นซอร์ส ดังนี้", + "@aboutLicensesBanner": {}, + "aboutLicensesDartPackagesSectionTitle": "แพ็คเกจ Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "แสดงใบอนุญาตทั้งหมด", + "@aboutLicensesShowAllButtonLabel": {}, + "aboutLicensesFlutterPackagesSectionTitle": "แพ็คเกจ Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutBugSaveLogInstruction": "บันทึกล็อกของแอพฯเป็นไฟล์", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "คัดลอกข้อมูลระบบ", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "คัดลอก", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "รายงาน GitHub พร้อมบันทึกและข้อมูลระบบ", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "รายงาน", + "@aboutBugReportButton": {}, + "aboutCreditsWorldAtlas1": "แอพฯนี้ใช้ไฟล์ TopoJSON จาก", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "ภายใต้ใบอนุญาต ISC", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "ผู้แปล", + "@aboutTranslatorsSectionTitle": {}, + "policyPageTitle": "นโยบายความเป็นส่วนตัว", + "@policyPageTitle": {}, + "viewDialogGroupSectionTitle": "กลุ่ม", + "@viewDialogGroupSectionTitle": {}, + "viewDialogSortSectionTitle": "เรียงลำดับ", + "@viewDialogSortSectionTitle": {}, + "tileLayoutGrid": "ตาราง", + "@tileLayoutGrid": {}, + "tileLayoutMosaic": "โมเสก", + "@tileLayoutMosaic": {}, + "aboutPageTitle": "เกี่ยวกับ", + "@aboutPageTitle": {}, + "coverDialogTabApp": "แอพฯ", + "@coverDialogTabApp": {}, + "aboutLicensesSectionTitle": "ใบอนุญาตโอเพนซอร์ส", + "@aboutLicensesSectionTitle": {}, + "aboutCreditsSectionTitle": "เครดิต", + "@aboutCreditsSectionTitle": {}, + "collectionPickPageTitle": "เลือก", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "เลือกรายการ", + "@collectionSelectPageTitle": {}, + "collectionPageTitle": "คอลเลกชัน", + "@collectionPageTitle": {}, + "tileLayoutList": "รายการ", + "@tileLayoutList": {}, + "coverDialogTabCover": "หน้าปก", + "@coverDialogTabCover": {}, + "aboutLinkLicense": "ใบอนุญาต", + "@aboutLinkLicense": {}, + "aboutLicensesFlutterPluginsSectionTitle": "ปลั๊กอิน Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "viewDialogLayoutSectionTitle": "เค้าโครง", + "@viewDialogLayoutSectionTitle": {}, + "aboutLinkPolicy": "นโยบายความเป็นส่วนตัว", + "@aboutLinkPolicy": {}, + "filterLocatedLabel": "ระบุสถานที่", + "@filterLocatedLabel": {}, + "filterTaggedLabel": "ระบุแท็ก", + "@filterTaggedLabel": {}, + "keepScreenOnVideoPlayback": "ระหว่างการเล่นวิดีโอ", + "@keepScreenOnVideoPlayback": {}, + "keepScreenOnViewerOnly": "หน้า Viewer เท่านั้น", + "@keepScreenOnViewerOnly": {}, + "accessibilityAnimationsRemove": "ปิดการเคลื่อนไหว", + "@accessibilityAnimationsRemove": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{ลบอัลบั้มเหล่านี้และรายการในอัลบั้มทั้งหมด?} other{ลบอัลบั้มเหล่านี้และ {count} รายการในอัลบั้ม?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "entryActionShareVideoOnly": "แชร์วิดีโอเท่านั้น", + "@entryActionShareVideoOnly": {}, + "entryActionShowGeoTiffOnMap": "แสดงแผนที่ซ้อน", + "@entryActionShowGeoTiffOnMap": {}, + "videoActionCaptureFrame": "จับภาพเฟรม", + "@videoActionCaptureFrame": {}, + "entryInfoActionRemoveLocation": "ลบสถานที่", + "@entryInfoActionRemoveLocation": {}, + "filterAspectRatioLandscapeLabel": "ภาพแนวนอน", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "ภาพแนวตั้ง", + "@filterAspectRatioPortraitLabel": {}, + "filterNoAddressLabel": "ไม่มีที่อยู่", + "@filterNoAddressLabel": {}, + "widgetOpenPageViewer": "เปิดหน้า Viewer", + "@widgetOpenPageViewer": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "missingSystemFilePickerDialogMessage": "ตัวเลือกไฟล์ระบบหายไป หรือปิดใช้งาน โปรดเปิดใช้งานและลองอีกครั้ง", + "@missingSystemFilePickerDialogMessage": {}, + "addShortcutDialogLabel": "ป้ายทางลัด", + "@addShortcutDialogLabel": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{ย้ายรายการนี้ไปยังถังขยะ?} other{ย้าย {count} รายการนี้ไปยังถังขยะ?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{ลบรายการนี้?} other{ลบ {count} รายการนี้?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{ลบอัลบั้มนี้และรายการในอัลบั้มทั้งหมด?} other{ลบอัลบั้มนี้และ {count} รายการในอัลบั้ม?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "entryActionShareImageOnly": "แชร์รูปภาพเท่านั้น", + "@entryActionShareImageOnly": {}, + "accessibilityAnimationsKeep": "เปิดการเคลื่อนไหว", + "@accessibilityAnimationsKeep": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{การดำเนินการนี้ไม่รองรับรายการประเภทต่อไปนี้: {types}.} other{การดำเนินการนี้ไม่รองรับรายการประเภทต่อไปนี้: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "chipActionShowCollection": "แสดงคอลเลกชัน", + "@chipActionShowCollection": {} +} diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb new file mode 100644 index 0000000..bf74db3 --- /dev/null +++ b/lib/l10n/app_tr.arb @@ -0,0 +1,1454 @@ +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Aves'e Hoş Geldiniz", + "@welcomeMessage": {}, + "welcomeOptional": "İsteğe bağlı", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Hüküm ve koşulları kabul ediyorum", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, other{{count} öge}}", + "@itemCount": {}, + "timeSeconds": "{count, plural, other{{count} saniye}}", + "@timeSeconds": {}, + "timeMinutes": "{count, plural, other{{count} dakika}}", + "@timeMinutes": {}, + "timeDays": "{count, plural, other{{count} gün}}", + "@timeDays": {}, + "focalLength": "{length} mm", + "@focalLength": {}, + "applyButtonLabel": "UYGULA", + "@applyButtonLabel": {}, + "deleteButtonLabel": "SİL", + "@deleteButtonLabel": {}, + "nextButtonLabel": "SONRAKİ", + "@nextButtonLabel": {}, + "showButtonLabel": "GÖSTER", + "@showButtonLabel": {}, + "hideButtonLabel": "GİZLE", + "@hideButtonLabel": {}, + "continueButtonLabel": "DEVAM ET", + "@continueButtonLabel": {}, + "cancelTooltip": "İptal", + "@cancelTooltip": {}, + "changeTooltip": "Değiştir", + "@changeTooltip": {}, + "clearTooltip": "Temizle", + "@clearTooltip": {}, + "previousTooltip": "Önceki", + "@previousTooltip": {}, + "nextTooltip": "Sonraki", + "@nextTooltip": {}, + "showTooltip": "Göster", + "@showTooltip": {}, + "hideTooltip": "Gizle", + "@hideTooltip": {}, + "actionRemove": "Kaldır", + "@actionRemove": {}, + "resetTooltip": "Sıfırla", + "@resetTooltip": {}, + "saveTooltip": "Kaydet", + "@saveTooltip": {}, + "pickTooltip": "Seç", + "@pickTooltip": {}, + "doubleBackExitMessage": "Çıkmak için tekrar “geri”, düğmesine dokunun.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "Bir daha sorma", + "@doNotAskAgain": {}, + "sourceStateLoading": "Yükleniyor", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Kataloglanıyor", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Ülkeler konumlandırılıyor", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Konum belirleniyor", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Sil", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Albümlerde göster", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Ülkelerde göster", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "Etiketlerde göster", + "@chipActionGoToTagPage": {}, + "chipActionHide": "Gizle", + "@chipActionHide": {}, + "chipActionPin": "Başa sabitle", + "@chipActionPin": {}, + "chipActionUnpin": "Sabitlemeyi kaldır", + "@chipActionUnpin": {}, + "chipActionRename": "Yeniden adlandır", + "@chipActionRename": {}, + "chipActionSetCover": "Kapağı ayarla", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "Albüm oluştur", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "Panoya kopyala", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "Sil", + "@entryActionDelete": {}, + "entryActionConvert": "Dönüştür", + "@entryActionConvert": {}, + "entryActionExport": "Dışa aktar", + "@entryActionExport": {}, + "entryActionInfo": "Bilgi", + "@entryActionInfo": {}, + "entryActionRename": "Yeniden adlandır", + "@entryActionRename": {}, + "entryActionRestore": "Geri getir", + "@entryActionRestore": {}, + "entryActionRotateCCW": "Saat yönünün tersine döndür", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Saat yönünde döndür", + "@entryActionRotateCW": {}, + "entryActionFlip": "Yatay olarak çevir", + "@entryActionFlip": {}, + "entryActionPrint": "Yazdır", + "@entryActionPrint": {}, + "entryActionShare": "Paylaş", + "@entryActionShare": {}, + "entryActionViewSource": "Kaynağı görüntüle", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "Harita katmanı olarak göster", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Hareketsiz görüntüye dönüştür", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Videoyu aç", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Düzenle", + "@entryActionEdit": {}, + "entryActionOpen": "Şununla aç", + "@entryActionOpen": {}, + "entryActionSetAs": "Olarak ayarla", + "@entryActionSetAs": {}, + "entryActionOpenMap": "Harita uygulamasında göster", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Ekranı döndür", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Favorilere ekle", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Favorilerden kaldır", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Kareyi yakala", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Sessize al", + "@videoActionMute": {}, + "videoActionUnmute": "Sesi aç", + "@videoActionUnmute": {}, + "videoActionPause": "Duraklat", + "@videoActionPause": {}, + "videoActionPlay": "Oynat", + "@videoActionPlay": {}, + "videoActionReplay10": "10 saniye geri git", + "@videoActionReplay10": {}, + "videoActionSkip10": "10 saniye ileri git", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Ses parçası seç", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Oynatma hızı", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "Ayarlar", + "@viewerActionSettings": {}, + "entryInfoActionEditDate": "Tarih ve saati düzenle", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Konumu düzenle", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditRating": "Derecelendirmeyi düzenle", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Etiketleri düzenle", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Üst verileri kaldır", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "Geri dönüşüm kutusu", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Favori", + "@filterFavouriteLabel": {}, + "filterNoLocationLabel": "Konumsuz", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Derecelendirilmemiş", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Etiketsiz", + "@filterNoTagLabel": {}, + "filterRatingRejectedLabel": "Reddedilmiş", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Hareketli", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "Hareketli Fotoğraf", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° Video", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Resim", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Ondalık dereceler", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, + "coordinateDmsNorth": "K", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "G", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "D", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "B", + "@coordinateDmsWest": {}, + "unitSystemMetric": "Metrik", + "@unitSystemMetric": {}, + "unitSystemImperial": "İngiliz", + "@unitSystemImperial": {}, + "videoLoopModeNever": "Asla", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "Yalnızca kısa videolar", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "Her zaman", + "@videoLoopModeAlways": {}, + "videoControlsPlayOutside": "Başka bir oynatıcı ile aç", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google Haritalar", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Haritalar (Hibrit)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Haritalar (Arazi)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "İnsancıl OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Suluboya", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyRename": "Yeniden adlandır", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Değiştir", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Atla", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "Asla", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "Yalnızca görüntüleyici sayfasında", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Her zaman", + "@keepScreenOnAlways": {}, + "accessibilityAnimationsRemove": "Ekran efektlerini önle", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Ekran efektlerini koru", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferHighest": "En yüksek oran", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "En düşük oran", + "@displayRefreshRatePreferLowest": {}, + "themeBrightnessLight": "Açık", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Koyu", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Siyah", + "@themeBrightnessBlack": {}, + "albumTierNew": "Yeni", + "@albumTierNew": {}, + "albumTierPinned": "Sabitlenmiş", + "@albumTierPinned": {}, + "albumTierSpecial": "Genel", + "@albumTierSpecial": {}, + "albumTierApps": "Uygulamalar", + "@albumTierApps": {}, + "albumTierRegular": "Diğer", + "@albumTierRegular": {}, + "storageVolumeDescriptionFallbackPrimary": "Dahili depolama", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD kart", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "kök dizin", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "“{name}” dizin", + "@otherDirectoryDescription": {}, + "storageAccessDialogMessage": "Bir sonraki ekranda \"{volume}\" içindeki {directory} dizinini seçerek bu uygulamaya erişim izni verin.", + "@storageAccessDialogMessage": {}, + "restrictedAccessDialogMessage": "Bu uygulamanın “{volume}” içindeki {directory} dosyaları değiştirmesine izin verilmiyor.\n\nÖğeleri başka bir dizine taşımak için lütfen önceden yüklenmiş bir dosya yöneticisi veya galeri uygulaması kullanın.", + "@restrictedAccessDialogMessage": {}, + "notEnoughSpaceDialogMessage": "Bu işlemin tamamlanması için “{volume}” üzerinde {neededSize} boş alana ihtiyaç var, ancak yalnızca {freeSize} kaldı.", + "@notEnoughSpaceDialogMessage": {}, + "missingSystemFilePickerDialogMessage": "Sistem dosya seçicisi eksik veya devre dışı. Lütfen etkinleştirin ve tekrar deneyin.", + "@missingSystemFilePickerDialogMessage": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Bu işlem şu türdeki ögeler için desteklenmez: {types}.} other{Bu işlem şu türlerdeki ögeler için desteklenmez: {types}.}}", + "@unsupportedTypeDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "Hedef klasördeki bazı dosyalar aynı ada sahip.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "Bazı dosyalar aynı ada sahip.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "Kısayol etiketi", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "EKLE", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "Bununla ilgilenebilecek bir uygulama yok.", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Bu öge geri dönüşüm kutusuna taşınsın mı?} other{Bu {count} öge geri dönüşüm kutusuna atılsın mı?}}", + "@binEntriesConfirmationDialogMessage": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Bu öge silinsin mi?} other{Bu {count} öge silinsin mi?}}", + "@deleteEntriesConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "Devam etmeden önce öge tarihleri kaydedilsin mi?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Tarihleri kaydet", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "{time} itibarıyla oynatmaya devam etmek istiyor musunuz?", + "@videoResumeDialogMessage": {}, + "videoStartOverButtonLabel": "BAŞTAN BAŞLA", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "SÜRDÜR", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Son öge", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Otomatik", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Özel", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "Eşleşen fotoğraf ve videolar koleksiyonunuzdan gizlenecektir. Bunları “Gizlilik”, ayarlarından tekrar gösterebilirsiniz.\n\nBunları gizlemek istediğinizden emin misiniz?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "Yeni Albüm", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Albüm adı", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Dizin zaten var", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Depolama:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "Yeni ad", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Dizin zaten var", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Yeniden adlandır", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "İsimlendirme şekli", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Alan ekle", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Önizleme", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Sayaç", + "@renameProcessorCounter": {}, + "renameProcessorName": "Ad", + "@renameProcessorName": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Bu albüm ve içindeki öge silinsin mi?} other{Bu albüm ve içindeki {count} öge silinsin mi?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Bu albümler ve içindeki öge silinsin mi?} other{Bu albümler ve içindeki {count} ögesi silinsin mi?}}", + "@deleteMultiAlbumConfirmationDialogMessage": {}, + "exportEntryDialogFormat": "Biçim:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Genişlik", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Yükseklik", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "Yeni ad", + "@renameEntryDialogLabel": {}, + "editEntryDialogTargetFieldsHeader": "Değiştirilecek alanlar", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Tarih ve Saat", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Özel tarih ayarla", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Başka bir tarihten kopyala", + "@editEntryDateDialogCopyField": {}, + "editEntryDialogCopyFromItem": "Başka bir ögeden kopyala", + "@editEntryDialogCopyFromItem": {}, + "editEntryDateDialogExtractFromTitle": "Başlıktan ayıkla", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Değiştir", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "Dosya değiştirilme tarihi", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "Saat", + "@durationDialogHours": {}, + "durationDialogMinutes": "Dakika", + "@durationDialogMinutes": {}, + "editEntryLocationDialogTitle": "Konum", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogChooseOnMap": "Harita üzerinde seç", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "Enlem", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "Boylam", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "Bu konumu kullan", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "Derecelendirme", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Üst Veri Kaldırma", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "Daha fazla", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Hareketli bir fotoğrafın içindeki videoyu oynatmak için XMP gereklidir.\n\nKaldırmak istediğinizden emin misiniz?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "genericDangerWarningDialogMessage": "Emin misiniz?", + "@genericDangerWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Oynatma hızı", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Ses", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Altyazı", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "Kapalı", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Parça", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "Başka parça yok.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "Başarılı!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Başarısız", + "@genericFailureFeedback": {}, + "menuActionConfigureView": "Görünüm", + "@menuActionConfigureView": {}, + "menuActionSelect": "Seç", + "@menuActionSelect": {}, + "menuActionSelectAll": "Hepsini seç", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "Hiçbirini seçme", + "@menuActionSelectNone": {}, + "menuActionMap": "Harita", + "@menuActionMap": {}, + "menuActionStats": "İstatistikler", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "Sırala", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "Bölümler", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Düzen", + "@viewDialogLayoutSectionTitle": {}, + "tileLayoutGrid": "Izgara", + "@tileLayoutGrid": {}, + "tileLayoutList": "Liste", + "@tileLayoutList": {}, + "coverDialogTabCover": "Kapak", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "Uygulama", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Renk", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Uygulama seç", + "@appPickDialogTitle": {}, + "appPickDialogNone": "Yok", + "@appPickDialogNone": {}, + "aboutPageTitle": "Hakkında", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Lisans", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Gizlilik Politikası", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Hata Bildirimi", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Uygulama günlüklerini bir dosyaya kaydet", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Sistem bilgilerini kopyala", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "Kopyala", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "GitHub'da günlükleri ve sistem bilgilerini içeren bir rapor oluştur", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "Raporla", + "@aboutBugReportButton": {}, + "aboutCreditsSectionTitle": "Kredi", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "Bu uygulama bir TopoJSON dosyası kullanır", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "ISC Lisansı kapsamında.", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Tercümanlar", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Açık Kaynak Lisansları", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "Bu uygulama aşağıdaki açık kaynaklı paketleri ve kütüphaneleri kullanır.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android Kütüphaneleri", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter Eklentileri", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter Paketleri", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart Paketleri", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Tüm Lisansları Göster", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "Gizlilik Politikası", + "@policyPageTitle": {}, + "collectionPageTitle": "Koleksiyon", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "Seç", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "Öğeleri seç", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Başlık filtresini göster", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Başlık filtresini gizle", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Kısayol ekle", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "Çöp kutusu boş", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Albüme kopyala", + "@collectionActionCopy": {}, + "collectionActionMove": "Albüme taşı", + "@collectionActionMove": {}, + "collectionActionRescan": "Yeniden tara", + "@collectionActionRescan": {}, + "collectionActionEdit": "Düzenle", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Başlıkları ara", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "Albüme göre", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Aya göre", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Güne göre", + "@collectionGroupDay": {}, + "sectionUnknown": "Bilinmeyen", + "@sectionUnknown": {}, + "dateToday": "Bugün", + "@dateToday": {}, + "dateYesterday": "Dün", + "@dateYesterday": {}, + "dateThisMonth": "Bu ay", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{1 öge silinemedi} other{{count} öge silinemedi}}", + "@collectionDeleteFailureFeedback": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{1 öge kopyalanamadı} other{{count} öge kopyalanamadı}}", + "@collectionCopyFailureFeedback": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{1 öge taşınamadı} other{{count} öge taşınamadı}}", + "@collectionMoveFailureFeedback": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{1 ögenin adı değiştirilemedi} other{{count} ögenin adı değiştirilemedi}}", + "@collectionRenameFailureFeedback": {}, + "collectionEditFailureFeedback": "{count, plural, =1{1 öge düzenlenemedi} other{{count} öge düzenlenemedi}}", + "@collectionEditFailureFeedback": {}, + "collectionExportFailureFeedback": "{count, plural, =1{1 sayfa dışa aktarılamadı} other{{count} sayfa dışa aktarılamadı}}", + "@collectionExportFailureFeedback": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{1 öge kopyalandı} other{{count} öge kopyalandı}}", + "@collectionCopySuccessFeedback": {}, + "collectionMoveSuccessFeedback": "{count, plural, =1{1 öge taşındı} other{{count} öge taşındı}}", + "@collectionMoveSuccessFeedback": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{1 ögenin adı değiştirildi} other{{count} ögenin adı değiştirildi}}", + "@collectionRenameSuccessFeedback": {}, + "collectionEditSuccessFeedback": "{count, plural, =1{1 öge düzenlendi} other{{count} öge düzenlendi}}", + "@collectionEditSuccessFeedback": {}, + "collectionEmptyFavourites": "Favori yok", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "Video yok", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "Resim yok", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Erişim izni", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Bölüm seç", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Bölüm seçimini kaldır", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "Hakkında", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Ayarlar", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "Tüm koleksiyon", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Favoriler", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Resimler", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Videolar", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "Hareketli", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Hareketli fotoğraflar", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "Panoramalar", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Raw fotoğraflar", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "360° Videolar", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Albümler", + "@drawerAlbumPage": {}, + "drawerCountryPage": "Ülkeler", + "@drawerCountryPage": {}, + "drawerTagPage": "Etiketler", + "@drawerTagPage": {}, + "sortByDate": "Tarihe göre", + "@sortByDate": {}, + "sortByName": "Adına göre", + "@sortByName": {}, + "sortByItemCount": "Öğe sayısına göre", + "@sortByItemCount": {}, + "sortBySize": "Boyuta göre", + "@sortBySize": {}, + "sortByAlbumFileName": "Albüm ve başlığı göre", + "@sortByAlbumFileName": {}, + "sortByRating": "Derecelendirmeye göre", + "@sortByRating": {}, + "albumGroupTier": "Kademeye göre", + "@albumGroupTier": {}, + "albumGroupVolume": "Depolama hacmine göre", + "@albumGroupVolume": {}, + "albumPickPageTitleCopy": "Albüme kopyala", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Albüme aktar", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Albüme taşı", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "Albüm seç", + "@albumPickPageTitlePick": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "albumDownload": "İndir", + "@albumDownload": {}, + "albumScreenshots": "Ekran görüntüleri", + "@albumScreenshots": {}, + "albumScreenRecordings": "Ekran kayıtları", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Video çekimleri", + "@albumVideoCaptures": {}, + "albumPageTitle": "Albümler", + "@albumPageTitle": {}, + "albumEmpty": "Albüm yok", + "@albumEmpty": {}, + "createAlbumButtonLabel": "OLUŞTUR", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "yeni", + "@newFilterBanner": {}, + "countryPageTitle": "Ülkeler", + "@countryPageTitle": {}, + "countryEmpty": "Ülke yok", + "@countryEmpty": {}, + "tagPageTitle": "Etiketler", + "@tagPageTitle": {}, + "tagEmpty": "Etiket yok", + "@tagEmpty": {}, + "binPageTitle": "Geri Dönüşüm Kutusu", + "@binPageTitle": {}, + "searchCollectionFieldHint": "Koleksiyonda ara", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "Yakın zamanda", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Tarih", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "Albümler", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "Ülkeler", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "Yerler", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Etiketler", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "Derecelendirmeler", + "@searchRatingSectionTitle": {}, + "settingsPageTitle": "Ayarlar", + "@settingsPageTitle": {}, + "settingsSystemDefault": "Sistem", + "@settingsSystemDefault": {}, + "settingsDefault": "Varsayılan", + "@settingsDefault": {}, + "settingsSearchFieldLabel": "Ayarlarda ara", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Eşleşen ayar bulunamadı", + "@settingsSearchEmpty": {}, + "settingsActionExport": "Dışa aktar", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "Dışa aktar", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "İçe aktar", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "İçe aktar", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "Kapaklar", + "@appExportCovers": {}, + "appExportFavourites": "Favoriler", + "@appExportFavourites": {}, + "appExportSettings": "Ayarlar", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "Gezinti", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Anasayfa", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Anasayfa", + "@settingsHomeDialogTitle": {}, + "settingsKeepScreenOnTile": "Ekranı açık tut", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Ekranı Açık Tut", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Çıkmak için iki kez “geri” düğmesine dokun", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "Onaylama diyalogları", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "Onaylama Diyalogları", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Öğeleri sonsuza dek silmeden önce sor", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "Eşyaları geri dönüşüm kutusuna atmadan önce sor", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Tarihsiz eşyaları taşımadan önce sor", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsNavigationDrawerTile": "Gezinti menüsü", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Gezinti Menüsü", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "Menü ögelerini taşımak ve yeniden sıralamak için dokunun ve basılı tutun.", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "Türler", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "Albümler", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Sayfalar", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Albüm ekle", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "Küçük resimler", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "Kaplama", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Kaplama", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowFavouriteIcon": "Favori simgeyi göster", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Etiket simgesini göster", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Konum simgesini göster", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Hareketli fotoğraf simgesini göster", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "Derecelendirmeyi göster", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Raw simgesini göster", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Video süresini göster", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "Hızlı eylemler", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Hızlı Eylemler", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Gözatma", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Seçme", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Düğmeleri hareket ettirmek ve ögelere göz atarken hangi eylemlerin görüntüleneceğini seçmek için dokunun ve basılı tutun.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Düğmeleri hareket ettirmek ve ögeleri seçerken hangi eylemlerin görüntüleneceğini seçmek için dokunun ve basılı tutun.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsViewerSectionTitle": "Görüntüleyici", + "@settingsViewerSectionTitle": {}, + "settingsViewerUseCutout": "Kesim alanını kullan", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Maksimum parlaklık", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Hareketli fotoğrafları otomatik oynat", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "Resim arka planı", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Hızlı eylemler", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Hızlı Eylemler", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "Düğmeleri hareket ettirmek ve görüntüleyicide hangi eylemlerin görüntüleneceğini seçmek için dokunun ve basılı tutun.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Gösterilen Düğmeler", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Mevcut Düğmeler", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Düğme yok", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "Kaplama", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "Kaplama", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "Açılışta göster", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "Mini haritayı göster", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Bilgileri göster", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "Başlığı, tarihi, konumu vb. göster.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowShootingDetails": "Çekim ayrıntılarını göster", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowOverlayThumbnails": "Küçük resimleri göster", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "Bulanıklık efekti", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsVideoPageTitle": "Video Ayarları", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "Videoları göster", + "@settingsVideoShowVideos": {}, + "settingsVideoEnableHardwareAcceleration": "Donanım hızlandırma", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "Otomatik oynatma", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "Döngü modu", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Döngü Modu", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "Altyazılar", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Altyazılar", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Bu bir örnek.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "Metin hizalama", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Metin Hizalama", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Metin boyutu", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "Dış çizgiyi ve gölgeyi göster", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Metin rengi", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Metin opaklığı", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Arka plan rengi", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Arka plan opaklığı", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Sol", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Merkez", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Sağ", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoControlsTile": "Kontroller", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "Kontroller", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "Düğmeler", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Oynatmak/duraklatmak için çift dokunun", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "İleri/geri gitmek için ekran kenarlarına çift dokunun", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsPrivacySectionTitle": "Gizlilik", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Uygulama envanterine erişime izin ver", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "Albüm görüntüsünü iyileştirmek için kullanılır", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "Anonim hata raporlamasına izin ver", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Arama geçmişini kaydet", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "Geri dönüşüm kutusunu kullan", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "Silinen ögeleri 30 gün boyunca saklar", + "@settingsEnableBinSubtitle": {}, + "settingsHiddenItemsTile": "Gizli ögeler", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Gizli Öğeler", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "Gizli filtrelerle eşleşen fotoğraflar ve videolar koleksiyonunuzda görünmeyecektir.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "Gizli filtre yok", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Depolama erişimi", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "Depolama Erişimi", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessBanner": "Bazı dizinler, içlerindeki dosyaları değiştirmek için açık bir erişim izni gerektirir. Daha önce erişim izni verdiğiniz dizinleri buradan inceleyebilirsiniz.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Erişim izni yok", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Geri al", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Erişilebilirlik", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Animasyonları kaldır", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "Animasyonları Kaldır", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Harekete geçme zamanı", + "@settingsTimeToTakeActionTile": {}, + "settingsDisplaySectionTitle": "Ekran", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "Renk vurguları", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Dinamik renk", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Görüntü yenileme hızı", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Yenileme Hızı", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageSectionTitle": "Dil ve Biçim", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "Dil", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "Dil", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "Koordinat formatı", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "Koordinat Formatı", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Birimler", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "Birimler", + "@settingsUnitSystemDialogTitle": {}, + "settingsWidgetPageTitle": "Fotoğraf Çerçevesi", + "@settingsWidgetPageTitle": {}, + "settingsCollectionTile": "Koleksiyon", + "@settingsCollectionTile": {}, + "statsPageTitle": "İstatistikler", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, =1{1 öge konuma sahip} other{{count} öge konuma sahip}}", + "@statsWithGps": {}, + "statsTopCountriesSectionTitle": "Öne Çıkan Ülkeler", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Öne Çıkan Yerler", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Öne Çıkan Etiketler", + "@statsTopTagsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "PANORAMAYI AÇ", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerErrorUnknown": "Tüh!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "Dosya artık mevcut değil.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Bilgi", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "Görüntüleyiciye geri dön", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "bilinmeyen", + "@viewerInfoUnknown": {}, + "viewerInfoLabelTitle": "Başlık", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "Tarih", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "Çözünürlük", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Boyut", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Yol", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Süre", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Sahibi", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Koordinatlar", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Adres", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Harita Şekli", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Harita şeklini seç", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Yakınlaştır", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Uzaklaştır", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Kuzeyi göster", + "@mapPointNorthUpTooltip": {}, + "openMapPageTooltip": "Harita sayfasında görüntüle", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "Bu bölgede resim yok", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Gömülü veriler ayıklanamadı", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "Aç", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "XML'i Görüntüle", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "Meta verileri ara", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Eşleşen anahtar yok", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Tarih ve saat", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Açıklama", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Boyutlar", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Çözünürlük", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Haklar", + "@viewerInfoSearchSuggestionRights": {}, + "tagEditorPageTitle": "Etiketleri Düzenle", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Yeni etiket", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Etiket ekle", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Yakın zamanda", + "@tagEditorSectionRecent": {}, + "panoramaEnableSensorControl": "Sensör kontrolünü etkinleştir", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Sensör kontrolünü devre dışı bırak", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Kaynak", + "@sourceViewerPageTitle": {}, + "slideshowActionResume": "Sürdür", + "@slideshowActionResume": {}, + "filterNoTitleLabel": "İsimsiz", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "Bugün", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Son eklenen", + "@filterRecentlyAddedLabel": {}, + "viewerTransitionZoomIn": "Yakınlaştır", + "@viewerTransitionZoomIn": {}, + "widgetOpenPageHome": "Ana sayfayı aç", + "@widgetOpenPageHome": {}, + "widgetOpenPageCollection": "Koleksiyonu aç", + "@widgetOpenPageCollection": {}, + "widgetOpenPageViewer": "Görüntüleyiciyi aç", + "@widgetOpenPageViewer": {}, + "tileLayoutMosaic": "Mozaik", + "@tileLayoutMosaic": {}, + "sortOrderNewestFirst": "Önce en yeni", + "@sortOrderNewestFirst": {}, + "sortOrderLowestFirst": "Önce en düşük", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Önce en büyük", + "@sortOrderLargestFirst": {}, + "settingsConfirmationAfterMoveToBinItems": "Öğeleri geri dönüşüm kutusuna taşıdıktan sonra mesaj göster", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsViewerGestureSideTapNext": "Önceki/sonraki ögeyi göstermek için ekran kenarlarına dokunun", + "@settingsViewerGestureSideTapNext": {}, + "settingsSlideshowVideoPlaybackTile": "Video oynatma", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Video Oynatma", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "slideshowActionShowInCollection": "Koleksiyonda göster", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditTitleDescription": "Başlık ve açıklamayı düzenle", + "@entryInfoActionEditTitleDescription": {}, + "filterNoDateLabel": "Tarihsiz", + "@filterNoDateLabel": {}, + "videoPlaybackSkip": "Atla", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Sessiz oynat", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Sesli oynat", + "@videoPlaybackWithSound": {}, + "viewerTransitionNone": "Hiçbiri", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Ana ekran", + "@wallpaperTargetHome": {}, + "durationDialogSeconds": "Saniye", + "@durationDialogSeconds": {}, + "wallpaperTargetLock": "Kilit ekranı", + "@wallpaperTargetLock": {}, + "menuActionSlideshow": "Slayt gösterisi", + "@menuActionSlideshow": {}, + "wallpaperTargetHomeLock": "Ana ve kilit ekranları", + "@wallpaperTargetHomeLock": {}, + "sortOrderOldestFirst": "Önce en eski", + "@sortOrderOldestFirst": {}, + "sortOrderZtoA": "Z'den A'ya", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "Önce en yüksek", + "@sortOrderHighestFirst": {}, + "albumGroupType": "Türe göre", + "@albumGroupType": {}, + "sortOrderAtoZ": "A'dan Z'ye", + "@sortOrderAtoZ": {}, + "sortOrderSmallestFirst": "Önce en küçük", + "@sortOrderSmallestFirst": {}, + "settingsSlideshowAnimatedZoomEffect": "Animasyonlu yakınlaştırma efekti", + "@settingsSlideshowAnimatedZoomEffect": {}, + "albumMimeTypeMixed": "Karışık", + "@albumMimeTypeMixed": {}, + "searchMetadataSectionTitle": "Üstveri", + "@searchMetadataSectionTitle": {}, + "settingsSlideshowFillScreen": "Ekranı doldur", + "@settingsSlideshowFillScreen": {}, + "settingsDisabled": "Devre dışı", + "@settingsDisabled": {}, + "editEntryLocationDialogSetCustom": "Özel konum ayarla", + "@editEntryLocationDialogSetCustom": {}, + "settingsViewerSlideshowTile": "Slayt gösterisi", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "Slayt gösterisi", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Tekrarla", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Karıştır", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowTransitionTile": "Geçiş", + "@settingsSlideshowTransitionTile": {}, + "viewerTransitionFade": "Soldur", + "@viewerTransitionFade": {}, + "viewDialogReverseSortOrder": "Ters sıralama düzeni", + "@viewDialogReverseSortOrder": {}, + "settingsScreenSaverPageTitle": "Ekran Koruyucu", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetShowOutline": "Anahat", + "@settingsWidgetShowOutline": {}, + "statsTopAlbumsSectionTitle": "Öne Çıkan Albümler", + "@statsTopAlbumsSectionTitle": {}, + "viewerSetWallpaperButtonLabel": "DUVAR KAĞIDI AYARLA", + "@viewerSetWallpaperButtonLabel": {}, + "viewerInfoLabelDescription": "Açıklama", + "@viewerInfoLabelDescription": {}, + "wallpaperUseScrollEffect": "Ana ekranda kaydırma efektini kullan", + "@wallpaperUseScrollEffect": {}, + "settingsAllowMediaManagement": "Medya yönetimine izin ver", + "@settingsAllowMediaManagement": {}, + "tagEditorSectionPlaceholders": "Yer Tutucular", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "Ülke", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "Yer", + "@tagPlaceholderPlace": {}, + "viewerTransitionSlide": "Kaydır", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Paralaks", + "@viewerTransitionParallax": {}, + "settingsWidgetOpenPage": "Widget'a dokunulduğunda", + "@settingsWidgetOpenPage": {}, + "settingsSlideshowIntervalTile": "Aralık", + "@settingsSlideshowIntervalTile": {}, + "chipActionFilterOut": "Dışarıda bırak", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "İçeriye al", + "@chipActionFilterIn": {}, + "subtitlePositionBottom": "Alt", + "@subtitlePositionBottom": {}, + "subtitlePositionTop": "Üst", + "@subtitlePositionTop": {}, + "entryInfoActionExportMetadata": "Üst verileri dışa aktar", + "@entryInfoActionExportMetadata": {}, + "widgetDisplayedItemRandom": "Rastgele", + "@widgetDisplayedItemRandom": {}, + "widgetDisplayedItemMostRecent": "En son", + "@widgetDisplayedItemMostRecent": {}, + "settingsSubtitleThemeTextPositionTile": "Metin konumu", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsWidgetDisplayedItem": "Görüntülenen öge", + "@settingsWidgetDisplayedItem": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Metin Konumu", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "filterNoAddressLabel": "Adressiz", + "@filterNoAddressLabel": {}, + "filterAspectRatioLandscapeLabel": "Yatay", + "@filterAspectRatioLandscapeLabel": {}, + "settingsViewerShowRatingTags": "Derecelendirme ve etiketleri göster", + "@settingsViewerShowRatingTags": {}, + "filterAspectRatioPortraitLabel": "Dikey", + "@filterAspectRatioPortraitLabel": {}, + "entryInfoActionRemoveLocation": "Konumu kaldır", + "@entryInfoActionRemoveLocation": {}, + "entryActionShareVideoOnly": "Yalnızca video paylaş", + "@entryActionShareVideoOnly": {}, + "entryActionShareImageOnly": "Yalnızca resim paylaş", + "@entryActionShareImageOnly": {}, + "keepScreenOnVideoPlayback": "Video oynatma sırasında", + "@keepScreenOnVideoPlayback": {}, + "columnCount": "{count, plural, other{{count} sütun}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsAccessibilityShowPinchGestureAlternatives": "Çoklu dokunma hareketi alternatiflerini göster", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsViewerShowDescription": "Açıklamayı göster", + "@settingsViewerShowDescription": {}, + "settingsModificationWarningDialogMessage": "Diğer ayarlar değiştirilecektir.", + "@settingsModificationWarningDialogMessage": {}, + "settingsDisplayUseTvInterface": "Android TV arayüzü", + "@settingsDisplayUseTvInterface": {}, + "filterLocatedLabel": "Konumlu", + "@filterLocatedLabel": {}, + "filterTaggedLabel": "Etiketli", + "@filterTaggedLabel": {}, + "tooManyItemsErrorDialogMessage": "Daha az ögeyle tekrar deneyin.", + "@tooManyItemsErrorDialogMessage": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Parlaklığı/ses seviyesini ayarlamak için yukarı veya aşağı kaydırın", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "patternDialogEnter": "Deseninizi çizin", + "@patternDialogEnter": {}, + "saveCopyButtonLabel": "KOPYAYI KAYDET", + "@saveCopyButtonLabel": {}, + "applyTooltip": "Uygula", + "@applyTooltip": {}, + "chipActionConfigureVault": "Kilitli albüm ayarları", + "@chipActionConfigureVault": {}, + "viewerActionLock": "Kontrolleri kilitle", + "@viewerActionLock": {}, + "viewerActionUnlock": "Kontrollerin kilidini aç", + "@viewerActionUnlock": {}, + "editorTransformRotate": "Döndür", + "@editorTransformRotate": {}, + "editorTransformCrop": "Kırp", + "@editorTransformCrop": {}, + "editorActionTransform": "Dönüştür", + "@editorActionTransform": {}, + "cropAspectRatioFree": "Özgür", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Orijinal", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Kare", + "@cropAspectRatioSquare": {}, + "settingsCollectionBurstPatternsTile": "Seri fotoğraf çekme biçimleri", + "@settingsCollectionBurstPatternsTile": {}, + "vaultDialogLockTypeLabel": "Kilit türü", + "@vaultDialogLockTypeLabel": {}, + "chipActionShowCountryStates": "Eyaletleri göster", + "@chipActionShowCountryStates": {}, + "aboutDataUsageSectionTitle": "Kullanılan Alan", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageData": "Veriler", + "@aboutDataUsageData": {}, + "aboutDataUsageInternal": "Dahili", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "Harici", + "@aboutDataUsageExternal": {}, + "drawerPlacePage": "Yerler", + "@drawerPlacePage": {}, + "settingsAskEverytime": "Her seferinde sor", + "@settingsAskEverytime": {}, + "settingsVideoBackgroundModeDialogTitle": "Arkaplan Modu", + "@settingsVideoBackgroundModeDialogTitle": {}, + "maxBrightnessNever": "Asla", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "Her zaman", + "@maxBrightnessAlways": {}, + "videoResumptionModeNever": "Asla", + "@videoResumptionModeNever": {}, + "videoResumptionModeAlways": "Her zaman", + "@videoResumptionModeAlways": {}, + "exportEntryDialogQuality": "Kalite", + "@exportEntryDialogQuality": {}, + "settingsVideoPlaybackTile": "Oynatma", + "@settingsVideoPlaybackTile": {}, + "settingsVideoPlaybackPageTitle": "Oynatma", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoResumptionModeTile": "Oynatmaya devam et", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoResumptionModeDialogTitle": "Oynatmaya Devam Et", + "@settingsVideoResumptionModeDialogTitle": {}, + "tagEditorDiscardDialogMessage": "Değişikliklerden vazgeçmek istiyor musunuz?", + "@tagEditorDiscardDialogMessage": {}, + "chipActionGoToPlacePage": "Yerler'de Göster", + "@chipActionGoToPlacePage": {}, + "chipActionLock": "Kilitle", + "@chipActionLock": {}, + "chipActionCreateVault": "Kilitli albüm oluştur", + "@chipActionCreateVault": {}, + "albumTierVaults": "Kilitli albümler", + "@albumTierVaults": {}, + "vaultLockTypePassword": "Şifre", + "@vaultLockTypePassword": {}, + "overlayHistogramNone": "Hiçbiri", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "widgetTapUpdateWidget": "Widget'i güncelle", + "@widgetTapUpdateWidget": {}, + "configureVaultDialogTitle": "Kilitli Albüm Ayarları", + "@configureVaultDialogTitle": {}, + "aboutDataUsageCache": "Önbellek", + "@aboutDataUsageCache": {}, + "aboutDataUsageDatabase": "Veritabanı", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageMisc": "Diğer", + "@aboutDataUsageMisc": {}, + "settingsViewerShowHistogram": "Çubuk grafiğini göster", + "@settingsViewerShowHistogram": {}, + "authenticateToUnlockVault": "Albümün kilidini açmak için kimliğinizi doğrulayın", + "@authenticateToUnlockVault": {}, + "vaultBinUsageDialogMessage": "Bazı kilitli albümler çöp kutusunu kullanıyor.", + "@vaultBinUsageDialogMessage": {}, + "patternDialogConfirm": "Deseninizi tekrar çizin", + "@patternDialogConfirm": {}, + "authenticateToConfigureVault": "Kilitli albümü ayarlamak için kimliğinizi doğrulayın", + "@authenticateToConfigureVault": {}, + "statePageTitle": "Eyaletler", + "@statePageTitle": {}, + "stateEmpty": "Hiç eyalet bulunamadı", + "@stateEmpty": {}, + "searchStatesSectionTitle": "Eyaletler", + "@searchStatesSectionTitle": {}, + "settingsConfirmationVaultDataLoss": "Kilitli albüm veri kaybı uyarısını göster", + "@settingsConfirmationVaultDataLoss": {}, + "settingsCollectionBurstPatternsNone": "Hiçbiri", + "@settingsCollectionBurstPatternsNone": {}, + "settingsDisablingBinWarningDialogMessage": "Çöp kutusundaki ögeler sonsuza dek silinecektir.", + "@settingsDisablingBinWarningDialogMessage": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "newVaultDialogTitle": "Kilitli Albüm Oluştur", + "@newVaultDialogTitle": {}, + "passwordDialogConfirm": "Şifrenizi tekrar girin", + "@passwordDialogConfirm": {}, + "collectionActionSetHome": "Ana ekran olarak ayarla", + "@collectionActionSetHome": {}, + "statsTopStatesSectionTitle": "Baş Eyaletler", + "@statsTopStatesSectionTitle": {}, + "pinDialogEnter": "PIN girin", + "@pinDialogEnter": {}, + "vaultDialogLockModeWhenScreenOff": "Ekran kapatıldığında kilitle", + "@vaultDialogLockModeWhenScreenOff": {}, + "pinDialogConfirm": "PIN'inizi tekrar girin", + "@pinDialogConfirm": {}, + "exportEntryDialogWriteMetadata": "Metaverileri ekle", + "@exportEntryDialogWriteMetadata": {}, + "settingsVideoEnablePip": "Resim içinde resim", + "@settingsVideoEnablePip": {}, + "vaultLockTypePattern": "Desen", + "@vaultLockTypePattern": {}, + "aboutDataUsageClearCache": "Önbelleği Temizle", + "@aboutDataUsageClearCache": {}, + "placeEmpty": "Hiç yer bulunamadı", + "@placeEmpty": {}, + "overlayHistogramLuminance": "Parlaklık", + "@overlayHistogramLuminance": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "passwordDialogEnter": "Şifre girin", + "@passwordDialogEnter": {}, + "placePageTitle": "Yerler", + "@placePageTitle": {}, + "settingsThumbnailShowHdrIcon": "HDR simgesini göster", + "@settingsThumbnailShowHdrIcon": {}, + "settingsVideoBackgroundMode": "Arkaplan modu", + "@settingsVideoBackgroundMode": {}, + "tagPlaceholderState": "Eyalet", + "@tagPlaceholderState": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "entryActionCast": "Yansıt", + "@entryActionCast": {}, + "newVaultWarningDialogMessage": "Kilitli albümlere yalnızca bu uygulama erişebilir, başka herhangi bir uygulama erişemez.\n\nBu uygulamayı kaldırır veya verilerini silerseniz kilitli albümlerdeki bütün ögeleri kaybedersiniz.", + "@newVaultWarningDialogMessage": {}, + "castDialogTitle": "Yakındaki Cihazlar", + "@castDialogTitle": {}, + "stopTooltip": "Bitir", + "@stopTooltip": {}, + "videoActionABRepeat": "A-B döngü", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "Başlangıç noktası seç", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "Bitiş noktası seç", + "@videoRepeatActionSetEnd": {}, + "settingsForceWesternArabicNumeralsTile": "Arap rakamlarını zorla", + "@settingsForceWesternArabicNumeralsTile": {}, + "renameProcessorHash": "Sağlama", + "@renameProcessorHash": {}, + "chipActionShowCollection": "Koleksiyonda göster", + "@chipActionShowCollection": {}, + "chipActionGoToExplorerPage": "Gezginde göster", + "@chipActionGoToExplorerPage": {}, + "explorerPageTitle": "Gezgin", + "@explorerPageTitle": {}, + "explorerActionSelectStorageVolume": "Depolama alanı seç", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "Depolama Alanı Seç", + "@selectStorageVolumeDialogTitle": {}, + "setHomeCustom": "Özel", + "@setHomeCustom": {}, + "sortByDuration": "Süreye göre", + "@sortByDuration": {}, + "sortOrderShortestFirst": "Önce en kısa", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "Önce en uzun", + "@sortOrderLongestFirst": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapAttributionOsmHot": "Döşemeler [HOT](https://www.hotosm.org/) • Barındıran [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "Döşemeler [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Döşemeler [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "mapAttributionOsmLiberty": "Döşemeler [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Barındıran [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "mapAttributionOsmData": "Harita verileri © [OpenStreetMap](https://www.openstreetmap.org/copyright) katkıda bulunanlar", + "@mapAttributionOsmData": {}, + "videoActionShowNextFrame": "Sonraki kareyi göster", + "@videoActionShowNextFrame": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Böyle bir albüm zaten var", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "videoActionShowPreviousFrame": "Önceki kareyi göster", + "@videoActionShowPreviousFrame": {}, + "editEntryLocationDialogImportGpx": "GPX'i içe aktar", + "@editEntryLocationDialogImportGpx": {}, + "chipActionDecompose": "Böl", + "@chipActionDecompose": {}, + "albumTierDynamic": "Dinamik", + "@albumTierDynamic": {}, + "newDynamicAlbumDialogTitle": "Yeni dinamik albüm", + "@newDynamicAlbumDialogTitle": {}, + "appExportDynamicAlbums": "Dinamik albümler", + "@appExportDynamicAlbums": {}, + "chipActionRemove": "Kaldır", + "@chipActionRemove": {}, + "dynamicAlbumAlreadyExists": "Dinamik albüm zaten var", + "@dynamicAlbumAlreadyExists": {}, + "removeEntryMetadataDialogAll": "Tümü", + "@removeEntryMetadataDialogAll": {}, + "collectionActionAddDynamicAlbum": "Dinamik albüm ekle", + "@collectionActionAddDynamicAlbum": {}, + "searchFormatSectionTitle": "Biçimler", + "@searchFormatSectionTitle": {}, + "createButtonLabel": "YARAT", + "@createButtonLabel": {}, + "chipActionGroup": "Gruplandırmayı değiştir", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Grup oluştur", + "@chipActionCreateGroup": {}, + "albumTierGroups": "Gruplar", + "@albumTierGroups": {}, + "coordinateFormatDdm": "DDS", + "@coordinateFormatDdm": {}, + "newGroupDialogTitle": "Yeni grup", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Grup adı", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "Grup zaten var", + "@groupAlreadyExists": {}, + "groupEmpty": "Grup yok", + "@groupEmpty": {}, + "ungrouped": "Gruplandırılmamış", + "@ungrouped": {}, + "groupPickerTitle": "Grubu seç", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Bu grubu kullan", + "@groupPickerUseThisGroupButton": {}, + "sectionNone": "Bölüm yok", + "@sectionNone": {}, + "sortByPath": "Yolu", + "@sortByPath": {}, + "editEntryLocationDialogTimeShift": "Zaman farkı", + "@editEntryLocationDialogTimeShift": {}, + "mapStyleDialogAddStyle": "Biçim ekle", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogName": "Ad", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogSubdomains": "Alt alan adları", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "User-Agent", + "@mapStyleEditorDialogUserAgent": {}, + "tagPickPageTitle": "Etiket Seç", + "@tagPickPageTitle": {}, + "settingsNavigationBottomActionsTile": "Alt gezinme", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Alt Gezinme", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Düğmeleri hareket ettirmek ve alt gezinme çubuğunda hangi eylemlerin görüntüleneceğini seçmek için dokunup basılı tutun.", + "@settingsNavigationBottomActionEditorBanner": {}, + "settingsViewerShowZoomLevel": "Yakınlaştırma seviyesini göster", + "@settingsViewerShowZoomLevel": {}, + "settingsEnabled": "Etkin", + "@settingsEnabled": {} +} diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb new file mode 100644 index 0000000..7e366c9 --- /dev/null +++ b/lib/l10n/app_uk.arb @@ -0,0 +1,1648 @@ +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Ласкаво просимо до Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Необов'язково", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Я погоджуюсь з умовами та положеннями", + "@welcomeTermsToggle": {}, + "timeDays": "{count, plural, =1{{count} день} few{{count} дні} other{{count} днів}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "focalLength": "{length} мм", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "applyButtonLabel": "ЗАСТОСУВАТИ", + "@applyButtonLabel": {}, + "deleteButtonLabel": "ВИДАЛИТИ", + "@deleteButtonLabel": {}, + "nextButtonLabel": "ДАЛІ", + "@nextButtonLabel": {}, + "showButtonLabel": "ПОКАЗАТИ", + "@showButtonLabel": {}, + "hideButtonLabel": "ПРИХОВАТИ", + "@hideButtonLabel": {}, + "cancelTooltip": "Скасувати", + "@cancelTooltip": {}, + "changeTooltip": "Змінити", + "@changeTooltip": {}, + "clearTooltip": "Очистити", + "@clearTooltip": {}, + "previousTooltip": "Попередній", + "@previousTooltip": {}, + "nextTooltip": "Далі", + "@nextTooltip": {}, + "showTooltip": "Показати", + "@showTooltip": {}, + "resetTooltip": "Скинути", + "@resetTooltip": {}, + "saveTooltip": "Зберегти", + "@saveTooltip": {}, + "pickTooltip": "Вибрати", + "@pickTooltip": {}, + "sourceStateLoading": "Завантаження", + "@sourceStateLoading": {}, + "doNotAskAgain": "Не запитувати знову", + "@doNotAskAgain": {}, + "sourceStateCataloguing": "Каталогізація", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Розташування країн", + "@sourceStateLocatingCountries": {}, + "chipActionGoToCountryPage": "Показати в Країнах", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "Показати в Тегах", + "@chipActionGoToTagPage": {}, + "chipActionFilterOut": "Відфільтрувати", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Включити", + "@chipActionFilterIn": {}, + "chipActionHide": "Приховати", + "@chipActionHide": {}, + "chipActionPin": "Закріпити зверху", + "@chipActionPin": {}, + "chipActionUnpin": "Відкріпити", + "@chipActionUnpin": {}, + "chipActionRename": "Перейменувати", + "@chipActionRename": {}, + "chipActionCreateAlbum": "Створити альбом", + "@chipActionCreateAlbum": {}, + "entryActionDelete": "Видалити", + "@entryActionDelete": {}, + "entryActionConvert": "Конвертувати", + "@entryActionConvert": {}, + "entryActionExport": "Експорт", + "@entryActionExport": {}, + "entryActionInfo": "Інформація", + "@entryActionInfo": {}, + "entryActionRename": "Перейменувати", + "@entryActionRename": {}, + "entryActionRestore": "Відновити", + "@entryActionRestore": {}, + "entryActionPrint": "Роздрукувати", + "@entryActionPrint": {}, + "entryActionShare": "Поділитися", + "@entryActionShare": {}, + "entryActionShareImageOnly": "Поділитися тільки зображенням", + "@entryActionShareImageOnly": {}, + "entryActionViewSource": "Переглянути джерело", + "@entryActionViewSource": {}, + "entryActionFlip": "Віддзеркалити по горизонталі", + "@entryActionFlip": {}, + "entryActionViewMotionPhotoVideo": "Відкрити відео", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Редагувати", + "@entryActionEdit": {}, + "entryActionSetAs": "Встановити як", + "@entryActionSetAs": {}, + "entryActionAddFavourite": "Додати в обране", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Видалити з обраного", + "@entryActionRemoveFavourite": {}, + "videoActionPlay": "Відтворити", + "@videoActionPlay": {}, + "entryActionShowGeoTiffOnMap": "Показати як накладення на карту", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionOpenMap": "Показати в додатку карти", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Повернути екран", + "@entryActionRotateScreen": {}, + "videoActionCaptureFrame": "Зберегти кадр", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Вимкнути звук", + "@videoActionMute": {}, + "videoActionUnmute": "Увімкнути звук", + "@videoActionUnmute": {}, + "videoActionSkip10": "Перемотати на 10 секунд вперед", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Вибрати доріжку", + "@videoActionSelectStreams": {}, + "viewerActionSettings": "Налаштування", + "@viewerActionSettings": {}, + "slideshowActionResume": "Продовжити", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Показати у Колекції", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Редагувати дату та час", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Редагувати місцезнаходження", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "Редагувати заголовок та опис", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Редагувати рейтинг", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Редагувати теги", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Видалити метадані", + "@entryInfoActionRemoveMetadata": {}, + "entryInfoActionExportMetadata": "Експортувати метадані", + "@entryInfoActionExportMetadata": {}, + "entryInfoActionRemoveLocation": "Видалити місцезнаходження", + "@entryInfoActionRemoveLocation": {}, + "filterAspectRatioPortraitLabel": "Вертикально", + "@filterAspectRatioPortraitLabel": {}, + "filterBinLabel": "Кошик", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Обране", + "@filterFavouriteLabel": {}, + "filterNoAddressLabel": "Без адреси", + "@filterNoAddressLabel": {}, + "filterNoLocationLabel": "Без місцезнаходження", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Без рейтингу", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Без тегів", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Без назви", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "У цей день", + "@filterOnThisDayLabel": {}, + "filterTypeSphericalVideoLabel": "360° Відео", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Зображення", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Відео", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "Градуси, мінути та секунди", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Десяткові градуси", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsNorth": "пн. ш.", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "пд. ш.", + "@coordinateDmsSouth": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "coordinateDmsEast": "сх. д.", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "зх. д.", + "@coordinateDmsWest": {}, + "unitSystemMetric": "Метричні", + "@unitSystemMetric": {}, + "unitSystemImperial": "Англійські", + "@unitSystemImperial": {}, + "videoLoopModeNever": "Ніколи", + "@videoLoopModeNever": {}, + "videoLoopModeAlways": "Завжди", + "@videoLoopModeAlways": {}, + "videoControlsPlayOutside": "Відкрити в іншому відеоплеєрі", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google Карти", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Карти (Гібрид)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Карти (Місцевість)", + "@mapStyleGoogleTerrain": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "nameConflictStrategyRename": "Перейменувати", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Замінити", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Пропустити", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "Ніколи", + "@keepScreenOnNever": {}, + "keepScreenOnVideoPlayback": "Під час відтворення відео", + "@keepScreenOnVideoPlayback": {}, + "keepScreenOnViewerOnly": "Тільки сторінка для перегляду", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Завжди", + "@keepScreenOnAlways": {}, + "accessibilityAnimationsRemove": "Запобігання екранним ефектам", + "@accessibilityAnimationsRemove": {}, + "subtitlePositionTop": "Зверху", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "Знизу", + "@subtitlePositionBottom": {}, + "videoPlaybackSkip": "Пропустити", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Відтворити без звуку", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Відтворити зі звуком", + "@videoPlaybackWithSound": {}, + "themeBrightnessBlack": "Чорна", + "@themeBrightnessBlack": {}, + "viewerTransitionParallax": "Паралакс", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "Згасання", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "Збільшити", + "@viewerTransitionZoomIn": {}, + "wallpaperTargetLock": "Екран блокування", + "@wallpaperTargetLock": {}, + "viewerTransitionNone": "Нічого", + "@viewerTransitionNone": {}, + "widgetDisplayedItemRandom": "Випадковий", + "@widgetDisplayedItemRandom": {}, + "widgetDisplayedItemMostRecent": "Нещодавний", + "@widgetDisplayedItemMostRecent": {}, + "widgetOpenPageHome": "Відкрити головну сторінку", + "@widgetOpenPageHome": {}, + "albumTierNew": "Нові", + "@albumTierNew": {}, + "albumTierPinned": "Закріплені", + "@albumTierPinned": {}, + "albumTierSpecial": "Стандартні", + "@albumTierSpecial": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD картка", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "otherDirectoryDescription": "каталог «{name}»", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "rootDirectoryDescription": "кореневий каталог", + "@rootDirectoryDescription": {}, + "albumTierApps": "Додатки", + "@albumTierApps": {}, + "restrictedAccessDialogMessage": "Цьому додатку не дозволяється змінювати файли в каталозі {directory} накопичувача «{volume}».\n\nБудь ласка, використовуйте попередньо встановлений файловий менеджер або галерею, щоб перемістити об'єкти в інший каталог.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "missingSystemFilePickerDialogMessage": "Системний додаток вибору файлів відсутній або вимкнений. Будь ласка, увімкніть його та повторіть спробу.", + "@missingSystemFilePickerDialogMessage": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Ця операція не підтримується для об'єктів такого формату: {types}.} other{Ця операція не підтримується для об'єктів таких форматів {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "addShortcutDialogLabel": "Назва ярлика", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "ДОДАТИ", + "@addShortcutButtonLabel": {}, + "nameConflictDialogMultipleSourceMessage": "Деякі файли мають одну й ту саму назву.", + "@nameConflictDialogMultipleSourceMessage": {}, + "noMatchingAppDialogMessage": "Не існує додатків, які могли б з цим впоратися.", + "@noMatchingAppDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Зберегти дати", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Ви хочете продовжити відтворення з {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "videoResumeButtonLabel": "ВІДНОВИТИ", + "@videoResumeButtonLabel": {}, + "setCoverDialogAuto": "Авто", + "@setCoverDialogAuto": {}, + "moveUndatedConfirmationDialogMessage": "Зберегти дати елементів перед тим, як продовжити?", + "@moveUndatedConfirmationDialogMessage": {}, + "setCoverDialogLatest": "Останній елемент", + "@setCoverDialogLatest": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Каталог вже існує", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Накопичувач:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Каталог вже існує", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Перейменувати", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "Зразок найменування", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Поле для вставки", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Попередній перегляд", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Лічильник", + "@renameProcessorCounter": {}, + "renameProcessorName": "Назва", + "@renameProcessorName": {}, + "exportEntryDialogFormat": "Формат:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Ширина", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Висота", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "Нова назва", + "@renameEntryDialogLabel": {}, + "editEntryDialogCopyFromItem": "Скопіювати з іншого елемента", + "@editEntryDialogCopyFromItem": {}, + "editEntryDialogTargetFieldsHeader": "Поля для редагування", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Дата та час", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Встановити власну дату", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Копіювати з іншої дати", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogExtractFromTitle": "Витягти з заголовку", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Зрушення", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "Дата внесення змін до файлу", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "Години", + "@durationDialogHours": {}, + "durationDialogMinutes": "Хвилини", + "@durationDialogMinutes": {}, + "durationDialogSeconds": "Секунди", + "@durationDialogSeconds": {}, + "editEntryLocationDialogTitle": "Місцезнаходження", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogSetCustom": "Встановити власне місцезнаходження", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogChooseOnMap": "Вибрати на карті", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "Широта", + "@editEntryLocationDialogLatitude": {}, + "locationPickerUseThisLocationButton": "Використовувать це місце", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "Рейтинг", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Видалення метаданих", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "Більше", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP потрібен для відтворення відео всередині фотографії з рухом.\n\nВи впевнені, що хочете його видалити?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Швидкість відтворення", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "Відео", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Аудіо", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogOff": "Вимкнути", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Доріжка", + "@videoStreamSelectionDialogTrack": {}, + "genericSuccessFeedback": "Готово!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Не вдалося", + "@genericFailureFeedback": {}, + "genericDangerWarningDialogMessage": "Ви впевнені?", + "@genericDangerWarningDialogMessage": {}, + "menuActionConfigureView": "Вигляд", + "@menuActionConfigureView": {}, + "menuActionSelect": "Вибрати", + "@menuActionSelect": {}, + "menuActionSelectAll": "Вибрати все", + "@menuActionSelectAll": {}, + "menuActionMap": "Карта", + "@menuActionMap": {}, + "menuActionSlideshow": "Слайд-шоу", + "@menuActionSlideshow": {}, + "viewDialogSortSectionTitle": "Сортувати", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "Розділи", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Макет", + "@viewDialogLayoutSectionTitle": {}, + "tileLayoutMosaic": "Мозаїка", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "Сітка", + "@tileLayoutGrid": {}, + "tileLayoutList": "Список", + "@tileLayoutList": {}, + "coverDialogTabCover": "Обкладинка", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "Додаток", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Колір", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Вибрати додаток", + "@appPickDialogTitle": {}, + "appPickDialogNone": "Нічого", + "@appPickDialogNone": {}, + "aboutPageTitle": "Про нас", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Ліцензія", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Політика конфіденційності", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Повідомити про помилку", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Зберегти логи додатка у файл", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Копіювати системну інформацію", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "Копіювати", + "@aboutBugCopyInfoButton": {}, + "aboutCreditsSectionTitle": "Подяки", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "Цей додаток використовує файл TopoJSON із", + "@aboutCreditsWorldAtlas1": {}, + "aboutTranslatorsSectionTitle": "Перекладачі", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Ліцензії з відкритим вихідним кодом", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Бібліотеки Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Плагіни Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Пакети Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Пакети Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Показати всі ліцензії", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "Політика конфіденційності", + "@policyPageTitle": {}, + "collectionPageTitle": "Колекція", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "Вибрати", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "Виберіть елементи", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Показати фільтр заголовка", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Приховати фільтр заголовка", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Додати ярлик", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "Очистити кошик", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Скопіювати в альбом", + "@collectionActionCopy": {}, + "collectionActionMove": "Перемістити до альбому", + "@collectionActionMove": {}, + "collectionSearchTitlesHintText": "Пошук заголовків", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "По альбому", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "По місяцю", + "@collectionGroupMonth": {}, + "collectionGroupDay": "По дню", + "@collectionGroupDay": {}, + "sectionUnknown": "Невідомо", + "@sectionUnknown": {}, + "dateToday": "Сьогодні", + "@dateToday": {}, + "dateYesterday": "Вчора", + "@dateYesterday": {}, + "dateThisMonth": "У цьому місяці", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Не вдалося видалити 1 елемент} few{Не вдалося видалити {count} елементи} other{Не вдалося видалити {count} елементів}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopyFailureFeedback": "{count, plural, =1{Не вдалося скопіювати 1 елемент} few{Не вдалося скопіювати {count} елементи} other{Не вдалося скопіювати {count} елементів}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, =1{Не вдалося перенести 1 елемент} few{Не вдалося перенести {count} елементи} other{Не вдалося перенести {count} елементів}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, =1{Не вдалося відредагувати 1 елемент} few{Не вдалося відредагувати {count} елементи} other{Не вдалося відредагувати {count} елементів}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, =1{Скопійовано 1 елемент} few{Скопійовано {count} елементи} other{Скопійовано {count} елементів}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, =1{Перейменовано 1 елемент} few{Перейменовано {count} елементи} other{Перейменовано {count} елементів}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, =1{Відредаговано 1 елемент} few{Відредаговано {count} елементи} other{Відредаговано {count} елементів}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyFavourites": "Немає обраних", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "Немає відео", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "Немає зображень", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Надайте доступ", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Вибрати розділ", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Зняти вибір із розділу", + "@collectionDeselectSectionTooltip": {}, + "drawerCollectionAll": "Вся колекція", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Обране", + "@drawerCollectionFavourites": {}, + "drawerCollectionVideos": "Відео", + "@drawerCollectionVideos": {}, + "drawerCollectionRaws": "Raw фотографії", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "360° Відео", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Альбоми", + "@drawerAlbumPage": {}, + "drawerCountryPage": "Країни", + "@drawerCountryPage": {}, + "sortByName": "За назвою", + "@sortByName": {}, + "sortByAlbumFileName": "За назвою альбому та елемента", + "@sortByAlbumFileName": {}, + "sortByItemCount": "За кількістю елементів", + "@sortByItemCount": {}, + "drawerTagPage": "Теги", + "@drawerTagPage": {}, + "sortOrderHighestFirst": "Спочатку з високим", + "@sortOrderHighestFirst": {}, + "sortByRating": "За рейтингом", + "@sortByRating": {}, + "sortOrderNewestFirst": "Найновіші перші", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Найстаріші перші", + "@sortOrderOldestFirst": {}, + "sortOrderLargestFirst": "Спочатку великі", + "@sortOrderLargestFirst": {}, + "albumGroupTier": "За рівнем", + "@albumGroupTier": {}, + "albumGroupVolume": "За накопичувачем", + "@albumGroupVolume": {}, + "albumPickPageTitleCopy": "Копіювати в Альбом", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "Експортувати до Альбому", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Перемістити до Альбому", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "Вибрати Альбом", + "@albumPickPageTitlePick": {}, + "albumCamera": "Камера", + "@albumCamera": {}, + "entryActionShareVideoOnly": "Поділитися тільки відео", + "@entryActionShareVideoOnly": {}, + "continueButtonLabel": "ПРОДОВЖИТИ", + "@continueButtonLabel": {}, + "itemCount": "{count, plural, =1{{count} елемент} few{{count} елементи} other{{count} елементів}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeSeconds": "{count, plural, =1{{count} секунда} few{{count} секунди} other{{count} секунд}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "timeMinutes": "{count, plural, =1{{count} хвилина} few{{count} хвилини} other{{count} хвилин}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "doubleBackExitMessage": "Натисніть “назад” ще раз, щоб вийти.", + "@doubleBackExitMessage": {}, + "actionRemove": "Видалити", + "@actionRemove": {}, + "hideTooltip": "Приховати", + "@hideTooltip": {}, + "chipActionDelete": "Видалити", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Показати в Альбомах", + "@chipActionGoToAlbumPage": {}, + "entryActionCopyToClipboard": "Скопіювати в буфер обміну", + "@entryActionCopyToClipboard": {}, + "entryActionRotateCCW": "Обертати проти годинникової стрілки", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Обертати за годинниковою стрілкою", + "@entryActionRotateCW": {}, + "entryActionConvertMotionPhotoToStillImage": "Перетворити на нерухоме зображення", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionOpen": "Відкрити за допомогою", + "@entryActionOpen": {}, + "videoActionPause": "Призупинити", + "@videoActionPause": {}, + "videoActionSetSpeed": "Швидкість відтворення", + "@videoActionSetSpeed": {}, + "sortByDate": "За датою", + "@sortByDate": {}, + "sortOrderZtoA": "Від Я до А", + "@sortOrderZtoA": {}, + "sortOrderAtoZ": "Від А до Я", + "@sortOrderAtoZ": {}, + "sortBySize": "За розміром", + "@sortBySize": {}, + "statsPageTitle": "Статистика", + "@statsPageTitle": {}, + "themeBrightnessDark": "Темна", + "@themeBrightnessDark": {}, + "themeBrightnessLight": "Світла", + "@themeBrightnessLight": {}, + "wallpaperTargetHomeLock": "Головний екран та екран блокування", + "@wallpaperTargetHomeLock": {}, + "wallpaperTargetHome": "Головний екран", + "@wallpaperTargetHome": {}, + "chipActionSetCover": "Змінити обкладинку", + "@chipActionSetCover": {}, + "sourceStateLocatingPlaces": "Розташування локацій", + "@sourceStateLocatingPlaces": {}, + "filterTypeMotionPhotoLabel": "Фотографія з рухом", + "@filterTypeMotionPhotoLabel": {}, + "videoActionReplay10": "Перемотати на 10 секунд назад", + "@videoActionReplay10": {}, + "filterAspectRatioLandscapeLabel": "Горизонтально", + "@filterAspectRatioLandscapeLabel": {}, + "filterNoDateLabel": "Без дати", + "@filterNoDateLabel": {}, + "filterRecentlyAddedLabel": "Нещодавно додані", + "@filterRecentlyAddedLabel": {}, + "filterRatingRejectedLabel": "Відхилено", + "@filterRatingRejectedLabel": {}, + "filterTypePanoramaLabel": "Панорама", + "@filterTypePanoramaLabel": {}, + "filterTypeAnimatedLabel": "Анімована", + "@filterTypeAnimatedLabel": {}, + "videoLoopModeShortOnly": "Тільки короткі відео", + "@videoLoopModeShortOnly": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor", + "@mapStyleStamenWatercolor": {}, + "widgetOpenPageCollection": "Відкрити колекцію", + "@widgetOpenPageCollection": {}, + "accessibilityAnimationsKeep": "Зберегти екранні ефекти", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferHighest": "Найвища частота", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Найнижча частота", + "@displayRefreshRatePreferLowest": {}, + "viewerTransitionSlide": "Ковзання", + "@viewerTransitionSlide": {}, + "widgetOpenPageViewer": "Відкрити переглядач", + "@widgetOpenPageViewer": {}, + "storageVolumeDescriptionFallbackPrimary": "Внутрішня пам'ять", + "@storageVolumeDescriptionFallbackPrimary": {}, + "albumTierRegular": "Інше", + "@albumTierRegular": {}, + "storageAccessDialogMessage": "Будь ласка, виберіть {directory} на накопичувачі «{volume}» на наступному екрані, щоб надати цьому додатку доступ до нього.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "notEnoughSpaceDialogMessage": "Для завершення цієї операції потрібно {neededSize} вільного місця на «{volume}», але залишилося тільки {freeSize}.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Перемістити цей елемент у кошик?} few{Перемістити ці {count} елементи у кошик?} other{Перемістити ці {count} елементів у кошик?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoStartOverButtonLabel": "ВІДТВОРИТИ СПОЧАТКУ", + "@videoStartOverButtonLabel": {}, + "newAlbumDialogTitle": "Новий альбом", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Назва альбому", + "@newAlbumDialogNameLabel": {}, + "hideFilterConfirmationDialogMessage": "Відповідні фотографії та відео будуть приховані з вашої колекції. Ви можете показати їх знову в налаштуваннях у розділі \"Конфіденційність\".\n\nВи впевнені, що хочете їх приховати?", + "@hideFilterConfirmationDialogMessage": {}, + "renameAlbumDialogLabel": "Нова назва", + "@renameAlbumDialogLabel": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Видалити цей елемент?} few{Видалити ці {count} елементи?} other{Видалити ці {count} елементів?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Видалити цей альбом і елемент у ньому?} few{Видалити цей альбом і {count} елементи у ньому?} other{Видалити цей альбом і {count} елементів у ньому?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "nameConflictDialogSingleSourceMessage": "Деякі файли в теці призначення мають одну й ту саму назву.", + "@nameConflictDialogSingleSourceMessage": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Видалити ці альбоми та елемент в них?} few{Видалити ці альбоми та {count} елементи в них?} other{Видалити ці альбоми та {count} елементів в них?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editEntryLocationDialogLongitude": "Довгота", + "@editEntryLocationDialogLongitude": {}, + "videoStreamSelectionDialogText": "Субтитри", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogNoSelection": "Інших доріжок немає.", + "@videoStreamSelectionDialogNoSelection": {}, + "menuActionStats": "Статистика", + "@menuActionStats": {}, + "viewDialogReverseSortOrder": "Зворотній порядок сортування", + "@viewDialogReverseSortOrder": {}, + "aboutBugReportInstruction": "Надіслати звіт про помилку на GitHub разом із логами та системною інформацією", + "@aboutBugReportInstruction": {}, + "aboutCreditsWorldAtlas2": "за ліцензією ISC.", + "@aboutCreditsWorldAtlas2": {}, + "aboutLicensesBanner": "Цей додаток використовує наступні пакети та бібліотеки з відкритим вихідним кодом.", + "@aboutLicensesBanner": {}, + "aboutBugReportButton": "Надіслати звіт", + "@aboutBugReportButton": {}, + "collectionActionEdit": "Редагувати", + "@collectionActionEdit": {}, + "collectionActionRescan": "Повторне сканування", + "@collectionActionRescan": {}, + "drawerCollectionAnimated": "Анімації", + "@drawerCollectionAnimated": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{Не вдалося перейменувати 1 елемент} few{Не вдалося перейменувати {count} елементи} other{Не вдалося перейменувати {count} елементів}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "albumScreenshots": "Скріншоти", + "@albumScreenshots": {}, + "collectionExportFailureFeedback": "{count, plural, =1{Не вдалося експортувати 1 сторінку} few{Не вдалося експортувати {count} сторіноки} other{Не вдалося експортувати {count} сторінок}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "drawerCollectionPanoramas": "Панорами", + "@drawerCollectionPanoramas": {}, + "collectionMoveSuccessFeedback": "{count, plural, =1{Переміщено 1 елемент} few{Переміщено {count} елементи} other{Переміщено {count} елементів}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "drawerAboutButton": "Про нас", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Налаштування", + "@drawerSettingsButton": {}, + "drawerCollectionImages": "Зображення", + "@drawerCollectionImages": {}, + "drawerCollectionMotionPhotos": "Фото з рухом", + "@drawerCollectionMotionPhotos": {}, + "albumGroupType": "За типом", + "@albumGroupType": {}, + "albumMimeTypeMixed": "Змішані", + "@albumMimeTypeMixed": {}, + "sortOrderLowestFirst": "Спочатку з низьким", + "@sortOrderLowestFirst": {}, + "sortOrderSmallestFirst": "Спочатку маленькі", + "@sortOrderSmallestFirst": {}, + "albumVideoCaptures": "Відеозаписи", + "@albumVideoCaptures": {}, + "albumDownload": "Завантаження", + "@albumDownload": {}, + "albumScreenRecordings": "Записи екрану", + "@albumScreenRecordings": {}, + "setCoverDialogCustom": "Власний", + "@setCoverDialogCustom": {}, + "menuActionSelectNone": "Зняти виділення", + "@menuActionSelectNone": {}, + "albumPageTitle": "Альбоми", + "@albumPageTitle": {}, + "albumEmpty": "Немає альбомів", + "@albumEmpty": {}, + "createAlbumButtonLabel": "СТВОРИТИ", + "@createAlbumButtonLabel": {}, + "countryPageTitle": "Країни", + "@countryPageTitle": {}, + "countryEmpty": "Немає країн", + "@countryEmpty": {}, + "tagEmpty": "Немає тегів", + "@tagEmpty": {}, + "searchCollectionFieldHint": "Пошук колекцій", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "Нещодавні", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Дата", + "@searchDateSectionTitle": {}, + "searchCountriesSectionTitle": "Країни", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "Локації", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Теги", + "@searchTagsSectionTitle": {}, + "searchMetadataSectionTitle": "Метадані", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Налаштування", + "@settingsPageTitle": {}, + "settingsDisabled": "Вимкнено", + "@settingsDisabled": {}, + "settingsSearchFieldLabel": "Пошук налаштувань", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Немає відповідного налаштування", + "@settingsSearchEmpty": {}, + "settingsHomeTile": "Головна", + "@settingsHomeTile": {}, + "settingsConfirmationTile": "Діалоги підтвердження", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "Діалоги підтвердження", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Запитати, перш ніж видаляти елементи назавжди", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "Запитати перед тим, як переносити елементи до кошика", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsNavigationDrawerTabPages": "Сторінки", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Додати альбом", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailShowFavouriteIcon": "Показати іконку обраного", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Показати іконку тегу", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Показати іконку місцезнаходження", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Показати іконку фото з рухом", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRawIcon": "Показати іконку raw", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Показати тривалість відео", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionEditorPageTitle": "Швидкі дії", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Перегляд", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Вибір", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsViewerSectionTitle": "Переглядач", + "@settingsViewerSectionTitle": {}, + "settingsViewerGestureSideTapNext": "Торкніться країв екрану, щоб показати попередній/наступний елемент", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerUseCutout": "Використовувати область вирізу", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Максимальна яскравість", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Автоматичне відтворення фотографій з рухом", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "Фон зображення", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Швидкі дії", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Швидкі дії", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "Торкніться і утримуйте для переміщення кнопок і вибору дій, які відображатимуться у переглядачі.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEmpty": "Немає кнопок", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "Накладення", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "Накладення", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "Показати при відкритті", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "Показати міні-карту", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Показати інформацію", + "@settingsViewerShowInformation": {}, + "settingsViewerShowRatingTags": "Показати рейтинг та теги", + "@settingsViewerShowRatingTags": {}, + "settingsViewerShowShootingDetails": "Показати деталі зйомки", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowOverlayThumbnails": "Показати мініатюри", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "Ефект розмиття", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "Слайд-шоу", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "Слайд-шоу", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Повторення", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Перемішати", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Заповнити екрану", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowTransitionTile": "Перехід", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Інтервал", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "Відтворення відео", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Відтворення відео", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "Налаштування відео", + "@settingsVideoPageTitle": {}, + "settingsVideoShowVideos": "Показувати відео", + "@settingsVideoShowVideos": {}, + "settingsVideoEnableHardwareAcceleration": "Апаратне прискорення", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "Автоматичне відтворення", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeDialogTitle": "Циклічний режим", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "Субтитри", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Субтитри", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Вирівнювання тексту", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextPositionTile": "Положення тексту", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSubtitleThemeShowOutline": "Показати контур і тінь", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Колір тексту", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Непрозорість тексту", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Колір фону", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Непрозорість фону", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Центр", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Праворуч", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoControlsTile": "Елементи керування", + "@settingsVideoControlsTile": {}, + "settingsVideoButtonsTile": "Кнопки", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Подвійний дотик для відтворення/паузи", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "Подвійне натискання на краї екрану для переходу назад/вперед", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsAllowErrorReporting": "Дозволити анонімну відправку повідомлень про помилки", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Зберігати історію пошуку", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "Використовувати кошик", + "@settingsEnableBin": {}, + "settingsAllowMediaManagement": "Дозволити керування мультимедіа", + "@settingsAllowMediaManagement": {}, + "settingsHiddenItemsTile": "Приховані елементи", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Приховані елементи", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "Фотографії та відео, що відповідають прихованим фільтрам, не з'являться у вашій колекції.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "Немає прихованих фільтрів", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessTile": "Доступ до сховища", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "Доступ до сховища", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessBanner": "Деякі каталоги вимагають явного надання доступу для зміни файлів в них. Ви можете переглянути тут каталоги, до яких ви раніше надавали доступ.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Доступ не наданий", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Відкликати", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Спеціальні можливості", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Видалити анімації", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "Видалити анімації", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Час на виконання", + "@settingsTimeToTakeActionTile": {}, + "settingsDisplaySectionTitle": "Відображення", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Тема", + "@settingsThemeBrightnessTile": {}, + "settingsThemeColorHighlights": "Кольорові акценти", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Динамічний колір", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Частота оновлення дисплея", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsLanguageSectionTitle": "Мова та формати", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "Мова", + "@settingsLanguageTile": {}, + "settingsCoordinateFormatTile": "Формат координат", + "@settingsCoordinateFormatTile": {}, + "settingsUnitSystemTile": "Одиниці виміру", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "Одиниці виміру", + "@settingsUnitSystemDialogTitle": {}, + "settingsWidgetPageTitle": "Фоторамка", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Виділення", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "При натисканні на віджет", + "@settingsWidgetOpenPage": {}, + "settingsCollectionTile": "Колекція", + "@settingsCollectionTile": {}, + "statsTopCountriesSectionTitle": "Топ Країн", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Топ локацій", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Топ Тегів", + "@statsTopTagsSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Топ альбомів", + "@statsTopAlbumsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "ВІДКРИТИ ПАНОРАМУ", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "ЗМІНИТИ ШПАЛЕРИ", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Упс!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "Файлу більше не існує.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Інформація", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "Повернутися до перегляду", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "невідомий", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "Опис", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Заголовок", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "Дата", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "Роздільна здатність", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Розмір", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Шлях", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Тривалість", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Власник", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Координати", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Адреса", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Стиль карти", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Виберіть стиль карти", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Збільшити", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Зменшити", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Повернути на північ", + "@mapPointNorthUpTooltip": {}, + "mapAttributionStamen": "Плитки [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "openMapPageTooltip": "Переглянути на карті", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "Зображень у цьому регіоні немає", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Не вдалося витягти вбудовані дані", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "Відкрити", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Переглянути XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "Пошук метаданих", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Немає співпадаючих ключів", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Дата та час", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Опис", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Розміри", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Роздільна здатність", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Права", + "@viewerInfoSearchSuggestionRights": {}, + "wallpaperUseScrollEffect": "Використовувати ефект прокрутки на головному екрані", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageTitle": "Редагування тегів", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Новий тег", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Додати тег", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Нещодавні", + "@tagEditorSectionRecent": {}, + "tagEditorSectionPlaceholders": "Заповнювачі", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "Країна", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "Локація", + "@tagPlaceholderPlace": {}, + "panoramaEnableSensorControl": "Увімкнути сенсорне керування", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Вимкнути сенсорне керування", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Джерело", + "@sourceViewerPageTitle": {}, + "binPageTitle": "Кошик", + "@binPageTitle": {}, + "newFilterBanner": "новий", + "@newFilterBanner": {}, + "tagPageTitle": "Теги", + "@tagPageTitle": {}, + "searchAlbumsSectionTitle": "Альбоми", + "@searchAlbumsSectionTitle": {}, + "settingsSystemDefault": "Як у системі", + "@settingsSystemDefault": {}, + "searchRatingSectionTitle": "Рейтинги", + "@searchRatingSectionTitle": {}, + "settingsDefault": "За замовчуванням", + "@settingsDefault": {}, + "settingsActionImportDialogTitle": "Імпорт", + "@settingsActionImportDialogTitle": {}, + "appExportFavourites": "Обране", + "@appExportFavourites": {}, + "settingsKeepScreenOnDialogTitle": "Тримати екран увімкненим", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsActionExportDialogTitle": "Експорт", + "@settingsActionExportDialogTitle": {}, + "appExportSettings": "Налаштування", + "@appExportSettings": {}, + "settingsHomeDialogTitle": "Головна", + "@settingsHomeDialogTitle": {}, + "settingsActionExport": "Експорт", + "@settingsActionExport": {}, + "settingsActionImport": "Імпорт", + "@settingsActionImport": {}, + "settingsNavigationSectionTitle": "Навігація", + "@settingsNavigationSectionTitle": {}, + "settingsKeepScreenOnTile": "Тримати екран увімкненим", + "@settingsKeepScreenOnTile": {}, + "appExportCovers": "Обкладинки", + "@appExportCovers": {}, + "settingsDoubleBackExit": "Двічі натисніть «назад», щоб вийти", + "@settingsDoubleBackExit": {}, + "settingsNavigationDrawerTabAlbums": "Альбоми", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Запитати перед переміщенням недатованих елементів", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsNavigationDrawerBanner": "Натисніть і утримуйте для переміщення та зміни порядку елементів меню.", + "@settingsNavigationDrawerBanner": {}, + "settingsConfirmationAfterMoveToBinItems": "Показувати повідомлення після переміщення елементів у кошик", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerTile": "Навігаційне меню", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerTabTypes": "Типи", + "@settingsNavigationDrawerTabTypes": {}, + "settingsThumbnailOverlayPageTitle": "Накладення", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsNavigationDrawerEditorPageTitle": "Навігаційне меню", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Торкніться і утримуйте для переміщення кнопок і вибору дій, які будуть відображатися при виборі елементів.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsThumbnailSectionTitle": "Мініатюри", + "@settingsThumbnailSectionTitle": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Відображувані кнопки", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Доступні кнопки", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsSubtitleThemeTextAlignmentTile": "Вирівнювання тексту", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsThumbnailOverlayTile": "Накладення", + "@settingsThumbnailOverlayTile": {}, + "settingsVideoLoopModeTile": "Циклічний режим", + "@settingsVideoLoopModeTile": {}, + "settingsViewerShowInformationSubtitle": "Показувати заголовок, дату, місцезнаходження тощо.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsSlideshowAnimatedZoomEffect": "Анімований ефект масштабування", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSubtitleThemeSample": "Це зразок.", + "@settingsSubtitleThemeSample": {}, + "settingsVideoControlsPageTitle": "Елементи керування", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoSectionTitle": "Відео", + "@settingsVideoSectionTitle": {}, + "settingsAllowInstalledAppAccessSubtitle": "Використовується для покращення відображення альбомів", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Положення тексту", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsThumbnailShowRating": "Показати рейтинг", + "@settingsThumbnailShowRating": {}, + "settingsCollectionQuickActionsTile": "Швидкі дії", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Торкніться і утримуйте для переміщення кнопок і вибору дій, які будуть відображатися при перегляді елементів.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsSubtitleThemeTextSize": "Розмір тексту", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Ліворуч", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsPrivacySectionTitle": "Конфіденційність", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Дозволити доступ до інвентарю додатків", + "@settingsAllowInstalledAppAccess": {}, + "settingsEnableBinSubtitle": "Зберігає видалені елементи протягом 30 днів", + "@settingsEnableBinSubtitle": {}, + "settingsThemeBrightnessDialogTitle": "Тема", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsLanguagePageTitle": "Мова", + "@settingsLanguagePageTitle": {}, + "statsWithGps": "{count, plural, =1{1 елемент з місцезнаходженням} few{{count} елементи з місцезнаходженням} other{{count} елементів з місцезнаходженням}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsDisplayRefreshRateModeDialogTitle": "Частота оновлення", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsCoordinateFormatDialogTitle": "Формат координат", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsScreenSaverPageTitle": "Заставка на екран", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetDisplayedItem": "Відображаємий елемент", + "@settingsWidgetDisplayedItem": {}, + "mapAttributionOsmHot": "Плитки [HOT](https://www.hotosm.org/) • Розміщена на [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Показувати альтернативи мультисенсорним жестам", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "columnCount": "{count, plural, =1{{count} стовпець} few{{count} стовпці} other{{count} стовпців}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsViewerShowDescription": "Показати опис", + "@settingsViewerShowDescription": {}, + "settingsModificationWarningDialogMessage": "Інші параметри будуть змінені.", + "@settingsModificationWarningDialogMessage": {}, + "settingsDisplayUseTvInterface": "Інтерфейс Android TV", + "@settingsDisplayUseTvInterface": {}, + "filterLocatedLabel": "Розташований", + "@filterLocatedLabel": {}, + "filterTaggedLabel": "Позначений тегом", + "@filterTaggedLabel": {}, + "tooManyItemsErrorDialogMessage": "Спробуйте ще раз з меншою кількістю елементів.", + "@tooManyItemsErrorDialogMessage": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Проведіть пальцем угору або вниз, щоб налаштувати яскравість/гучність", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "chipActionConfigureVault": "Налаштувати сховище", + "@chipActionConfigureVault": {}, + "vaultLockTypePassword": "Пароль", + "@vaultLockTypePassword": {}, + "newVaultDialogTitle": "Нове сховище", + "@newVaultDialogTitle": {}, + "configureVaultDialogTitle": "Налаштування сховища", + "@configureVaultDialogTitle": {}, + "vaultDialogLockModeWhenScreenOff": "Заблокувати, коли екран вимикається", + "@vaultDialogLockModeWhenScreenOff": {}, + "vaultDialogLockTypeLabel": "Тип блокування", + "@vaultDialogLockTypeLabel": {}, + "pinDialogConfirm": "Підтвердити пін-код", + "@pinDialogConfirm": {}, + "passwordDialogEnter": "Введіть пароль", + "@passwordDialogEnter": {}, + "passwordDialogConfirm": "Підтвердити пароль", + "@passwordDialogConfirm": {}, + "authenticateToUnlockVault": "Пройдіть автентифікацію, щоб розблокувати сховище", + "@authenticateToUnlockVault": {}, + "settingsConfirmationVaultDataLoss": "Показувати попередження про втрату даних сховища", + "@settingsConfirmationVaultDataLoss": {}, + "chipActionLock": "Заблокувати", + "@chipActionLock": {}, + "chipActionCreateVault": "Створити сховище", + "@chipActionCreateVault": {}, + "newVaultWarningDialogMessage": "Елементи у сховищах доступні лише для цього додатка і ні для кого іншого.\n\nЯкщо ви видалите цей додаток або очистите дані додатку, ви втратите всі ці елементи.", + "@newVaultWarningDialogMessage": {}, + "vaultLockTypePin": "Пін-код", + "@vaultLockTypePin": {}, + "albumTierVaults": "Сховища", + "@albumTierVaults": {}, + "authenticateToConfigureVault": "Пройдіть автентифікацію, щоб налаштувати сховище", + "@authenticateToConfigureVault": {}, + "vaultBinUsageDialogMessage": "У деяких сховищах використовується кошик.", + "@vaultBinUsageDialogMessage": {}, + "settingsDisablingBinWarningDialogMessage": "Елементи в кошику буде видалено назавжди.", + "@settingsDisablingBinWarningDialogMessage": {}, + "pinDialogEnter": "Введіть пін-код", + "@pinDialogEnter": {}, + "drawerPlacePage": "Локації", + "@drawerPlacePage": {}, + "placeEmpty": "Немає локацій", + "@placeEmpty": {}, + "chipActionGoToPlacePage": "Показати в Локаціях", + "@chipActionGoToPlacePage": {}, + "placePageTitle": "Локації", + "@placePageTitle": {}, + "exportEntryDialogWriteMetadata": "Напишіть метадані", + "@exportEntryDialogWriteMetadata": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "settingsVideoEnablePip": "Картинка в картинці", + "@settingsVideoEnablePip": {}, + "vaultLockTypePattern": "Шаблон", + "@vaultLockTypePattern": {}, + "patternDialogEnter": "Введіть шаблон", + "@patternDialogEnter": {}, + "patternDialogConfirm": "Підтвердіть шаблон", + "@patternDialogConfirm": {}, + "settingsVideoBackgroundMode": "Фоновий режим", + "@settingsVideoBackgroundMode": {}, + "settingsVideoBackgroundModeDialogTitle": "Фоновий режим", + "@settingsVideoBackgroundModeDialogTitle": {}, + "tagPlaceholderState": "Штат", + "@tagPlaceholderState": {}, + "chipActionShowCountryStates": "Показати штати", + "@chipActionShowCountryStates": {}, + "viewerActionUnlock": "Розблокувати переглядач", + "@viewerActionUnlock": {}, + "viewerActionLock": "Заблокувати переглядач", + "@viewerActionLock": {}, + "stateEmpty": "Немає штатів", + "@stateEmpty": {}, + "settingsCollectionBurstPatternsTile": "Вибух візерунків", + "@settingsCollectionBurstPatternsTile": {}, + "settingsCollectionBurstPatternsNone": "Нічого", + "@settingsCollectionBurstPatternsNone": {}, + "statsTopStatesSectionTitle": "Топ штатів", + "@statsTopStatesSectionTitle": {}, + "searchStatesSectionTitle": "Штати", + "@searchStatesSectionTitle": {}, + "statePageTitle": "Штати", + "@statePageTitle": {}, + "settingsAskEverytime": "Запитувати щоразу", + "@settingsAskEverytime": {}, + "maxBrightnessNever": "Ніколи", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "Завжди", + "@maxBrightnessAlways": {}, + "videoResumptionModeNever": "Ніколи", + "@videoResumptionModeNever": {}, + "exportEntryDialogQuality": "Якість", + "@exportEntryDialogQuality": {}, + "settingsVideoPlaybackTile": "Відтворення", + "@settingsVideoPlaybackTile": {}, + "settingsVideoPlaybackPageTitle": "Відтворення", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoResumptionModeTile": "Продовжити відтворення", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoResumptionModeDialogTitle": "Продовжити відтворення", + "@settingsVideoResumptionModeDialogTitle": {}, + "tagEditorDiscardDialogMessage": "Ви хочете відмовитися від змін?", + "@tagEditorDiscardDialogMessage": {}, + "videoResumptionModeAlways": "Завжди", + "@videoResumptionModeAlways": {}, + "applyTooltip": "Застосувати", + "@applyTooltip": {}, + "saveCopyButtonLabel": "ЗБЕРЕГТИ КОПІЮ", + "@saveCopyButtonLabel": {}, + "editorActionTransform": "Перетворити", + "@editorActionTransform": {}, + "editorTransformCrop": "Обрізати", + "@editorTransformCrop": {}, + "editorTransformRotate": "Повернути", + "@editorTransformRotate": {}, + "cropAspectRatioFree": "Вільне", + "@cropAspectRatioFree": {}, + "cropAspectRatioOriginal": "Оригінал", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "Площа", + "@cropAspectRatioSquare": {}, + "widgetTapUpdateWidget": "Оновити віджет", + "@widgetTapUpdateWidget": {}, + "aboutDataUsageSectionTitle": "Використання даних", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageMisc": "Різне", + "@aboutDataUsageMisc": {}, + "aboutDataUsageInternal": "Внутрішній", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "Зовнішній", + "@aboutDataUsageExternal": {}, + "aboutDataUsageCache": "Кеш", + "@aboutDataUsageCache": {}, + "aboutDataUsageDatabase": "База даних", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageData": "Дані", + "@aboutDataUsageData": {}, + "overlayHistogramNone": "Нічого", + "@overlayHistogramNone": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "overlayHistogramLuminance": "Яскравість", + "@overlayHistogramLuminance": {}, + "settingsViewerShowHistogram": "Показати гістограму", + "@settingsViewerShowHistogram": {}, + "aboutDataUsageClearCache": "Очистити кеш", + "@aboutDataUsageClearCache": {}, + "entryActionCast": "Трансляція", + "@entryActionCast": {}, + "castDialogTitle": "Пристрої трансляції", + "@castDialogTitle": {}, + "settingsThumbnailShowHdrIcon": "Показати іконку HDR", + "@settingsThumbnailShowHdrIcon": {}, + "collectionActionSetHome": "Встановити як головну", + "@collectionActionSetHome": {}, + "videoRepeatActionSetStart": "Змінити початок", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "Змінити кінець", + "@videoRepeatActionSetEnd": {}, + "stopTooltip": "Зупинити", + "@stopTooltip": {}, + "videoActionABRepeat": "Повторити від А до Б", + "@videoActionABRepeat": {}, + "renameProcessorHash": "Хеш", + "@renameProcessorHash": {}, + "settingsForceWesternArabicNumeralsTile": "Примусові арабські цифри", + "@settingsForceWesternArabicNumeralsTile": {}, + "chipActionShowCollection": "Показати у Колекції", + "@chipActionShowCollection": {}, + "chipActionGoToExplorerPage": "Показати в провіднику", + "@chipActionGoToExplorerPage": {}, + "explorerPageTitle": "Провідник", + "@explorerPageTitle": {}, + "setHomeCustom": "Власне", + "@setHomeCustom": {}, + "explorerActionSelectStorageVolume": "Обрати сховище", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "Оберіть сховище", + "@selectStorageVolumeDialogTitle": {}, + "sortByDuration": "За тривалістю", + "@sortByDuration": {}, + "sortOrderShortestFirst": "Спершу найкоротше", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "Спершу найдовше", + "@sortOrderLongestFirst": {}, + "mapAttributionOsmData": "Картографічні дані © [OpenStreetMap](https://www.openstreetmap.org/copyright) помічники", + "@mapAttributionOsmData": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapAttributionOsmLiberty": "Плитки від [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Розміщено на [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Плитки від [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "videoActionShowPreviousFrame": "Показати попередній кадр", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "Показати наступний кадр", + "@videoActionShowNextFrame": {}, + "dynamicAlbumAlreadyExists": "Динамічний альбом уже існує", + "@dynamicAlbumAlreadyExists": {}, + "chipActionRemove": "Вилучити", + "@chipActionRemove": {}, + "albumTierDynamic": "Динамічний", + "@albumTierDynamic": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Альбом вже існує", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "newDynamicAlbumDialogTitle": "Новий динамічний альбом", + "@newDynamicAlbumDialogTitle": {}, + "collectionActionAddDynamicAlbum": "Додати динамічний альбом", + "@collectionActionAddDynamicAlbum": {}, + "appExportDynamicAlbums": "Динамічні альбоми", + "@appExportDynamicAlbums": {}, + "chipActionDecompose": "Розділити", + "@chipActionDecompose": {}, + "coordinateFormatDdm": "DDM", + "@coordinateFormatDdm": {}, + "editEntryLocationDialogImportGpx": "Імпорт GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "Зсув часу", + "@editEntryLocationDialogTimeShift": {}, + "removeEntryMetadataDialogAll": "Все", + "@removeEntryMetadataDialogAll": {}, + "searchFormatSectionTitle": "Формати", + "@searchFormatSectionTitle": {}, + "sortByPath": "За шляхом", + "@sortByPath": {}, + "createButtonLabel": "СТВОРИТИ", + "@createButtonLabel": {}, + "chipActionGroup": "Змінити групування", + "@chipActionGroup": {}, + "chipActionCreateGroup": "Створити групу", + "@chipActionCreateGroup": {}, + "albumTierGroups": "Групи", + "@albumTierGroups": {}, + "newGroupDialogTitle": "Нова група", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "Назва групи", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "Група вже існує", + "@groupAlreadyExists": {}, + "groupEmpty": "Груп немає", + "@groupEmpty": {}, + "ungrouped": "Не згруповані", + "@ungrouped": {}, + "groupPickerTitle": "Обрати групу", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "Використати цю групу", + "@groupPickerUseThisGroupButton": {}, + "sectionNone": "Розділів немає", + "@sectionNone": {}, + "mapStyleDialogAddStyle": "Додати стиль", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogUrl": "URL-адреса", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogName": "Ім'я", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogSubdomains": "Субдомени", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "Користувацький агент", + "@mapStyleEditorDialogUserAgent": {}, + "settingsNavigationBottomActionsTile": "Нижня навігація", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "Нижня навігація", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "Торкніться та утримуйте, щоб переміщувати кнопки та вибирати дії, які відображаються на нижній панелі навігації.", + "@settingsNavigationBottomActionEditorBanner": {}, + "tagPickPageTitle": "Вибрати тег", + "@tagPickPageTitle": {}, + "settingsViewerShowZoomLevel": "Показати рівень масштабування", + "@settingsViewerShowZoomLevel": {}, + "settingsEnabled": "Увімкнено", + "@settingsEnabled": {}, + "settingsForced": "Примусово", + "@settingsForced": {} +} diff --git a/lib/l10n/app_ur.arb b/lib/l10n/app_ur.arb new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/lib/l10n/app_ur.arb @@ -0,0 +1 @@ +{} diff --git a/lib/l10n/app_vi.arb b/lib/l10n/app_vi.arb new file mode 100644 index 0000000..5d11b3b --- /dev/null +++ b/lib/l10n/app_vi.arb @@ -0,0 +1,1586 @@ +{ + "welcomeTermsToggle": "Tôi đồng ý với các Điều khoản và Điều kiện", + "@welcomeTermsToggle": {}, + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Chào mừng đến với Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Không bắt buộc", + "@welcomeOptional": {}, + "saveCopyButtonLabel": "LƯU BẢN SAO", + "@saveCopyButtonLabel": {}, + "doubleBackExitMessage": "Nhấn “quay lại” lần nữa để thoát.", + "@doubleBackExitMessage": {}, + "showTooltip": "Hiển thị", + "@showTooltip": {}, + "sourceStateCataloguing": "Biên mục", + "@sourceStateCataloguing": {}, + "changeTooltip": "Thay đổi", + "@changeTooltip": {}, + "sourceStateLoading": "Đang tải", + "@sourceStateLoading": {}, + "applyButtonLabel": "ÁP DỤNG", + "@applyButtonLabel": {}, + "doNotAskAgain": "Đừng hỏi nữa", + "@doNotAskAgain": {}, + "nextTooltip": "Kế tiếp", + "@nextTooltip": {}, + "saveTooltip": "Lưu", + "@saveTooltip": {}, + "hideTooltip": "Ẩn", + "@hideTooltip": {}, + "actionRemove": "Loại bỏ", + "@actionRemove": {}, + "deleteButtonLabel": "XÓA BỎ", + "@deleteButtonLabel": {}, + "applyTooltip": "Áp dụng", + "@applyTooltip": {}, + "nextButtonLabel": "KẾ TIẾP", + "@nextButtonLabel": {}, + "showButtonLabel": "HIỂN THỊ", + "@showButtonLabel": {}, + "hideButtonLabel": "ẨN", + "@hideButtonLabel": {}, + "continueButtonLabel": "TIẾP TỤC", + "@continueButtonLabel": {}, + "previousTooltip": "Trước đó", + "@previousTooltip": {}, + "resetTooltip": "Đặt lại", + "@resetTooltip": {}, + "cancelTooltip": "Hủy bỏ", + "@cancelTooltip": {}, + "chipActionDelete": "Xóa", + "@chipActionDelete": {}, + "sourceStateLocatingCountries": "Định vị quốc gia", + "@sourceStateLocatingCountries": {}, + "chipActionGoToPlacePage": "Hiển thị ở địa điểm", + "@chipActionGoToPlacePage": {}, + "chipActionGoToAlbumPage": "Hiển thị trong bộ sưu tập", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Hiển thị ở các quốc gia", + "@chipActionGoToCountryPage": {}, + "sourceStateLocatingPlaces": "Định vị địa điểm", + "@sourceStateLocatingPlaces": {}, + "chipActionSetCover": "Đặt ảnh bìa", + "@chipActionSetCover": {}, + "entryInfoActionExportMetadata": "Xuất siêu dữ liệu", + "@entryInfoActionExportMetadata": {}, + "editorActionTransform": "Biến đổi", + "@editorActionTransform": {}, + "viewerActionLock": "Khóa trình xem", + "@viewerActionLock": {}, + "editorTransformRotate": "Xoay", + "@editorTransformRotate": {}, + "videoActionSkip10": "Tua tới 10 giây", + "@videoActionSkip10": {}, + "filterNoAddressLabel": "Không có địa chỉ", + "@filterNoAddressLabel": {}, + "videoActionUnmute": "Bật tiếng", + "@videoActionUnmute": {}, + "filterNoTagLabel": "Đã gỡ thẻ", + "@filterNoTagLabel": {}, + "entryActionRemoveFavourite": "Loại bỏ khỏi mục ưa thích", + "@entryActionRemoveFavourite": {}, + "filterAspectRatioLandscapeLabel": "Ngang", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "Dọc", + "@filterAspectRatioPortraitLabel": {}, + "entryActionRotateScreen": "Xoay màn hình", + "@entryActionRotateScreen": {}, + "videoActionCaptureFrame": "Chụp khung hình", + "@videoActionCaptureFrame": {}, + "entryActionViewMotionPhotoVideo": "Mở video", + "@entryActionViewMotionPhotoVideo": {}, + "filterNoTitleLabel": "Không có tiêu đề", + "@filterNoTitleLabel": {}, + "entryInfoActionRemoveMetadata": "Loại bỏ siêu dữ liệu", + "@entryInfoActionRemoveMetadata": {}, + "chipActionPin": "Ghim đầu trang", + "@chipActionPin": {}, + "entryActionConvertMotionPhotoToStillImage": "Chuyển đổi sang hình ảnh tĩnh", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryInfoActionEditTitleDescription": "Chỉnh sửa tiêu đề & mô tả", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditLocation": "Chỉnh sửa vị trí", + "@entryInfoActionEditLocation": {}, + "viewerActionUnlock": "Mở khóa trình xem", + "@viewerActionUnlock": {}, + "entryActionShare": "Chia sẻ", + "@entryActionShare": {}, + "videoActionPause": "Tạm ngừng", + "@videoActionPause": {}, + "entryActionOpenMap": "Hiển thị trong ứng dụng bản đồ", + "@entryActionOpenMap": {}, + "editorTransformCrop": "Cắt xén", + "@editorTransformCrop": {}, + "chipActionRename": "Đổi tên", + "@chipActionRename": {}, + "filterTaggedLabel": "Đã gắn thẻ", + "@filterTaggedLabel": {}, + "entryActionRotateCCW": "Xoay ngược chiều kim đồng hồ", + "@entryActionRotateCCW": {}, + "chipActionCreateVault": "Tạo két sắt", + "@chipActionCreateVault": {}, + "entryActionPrint": "In ấn", + "@entryActionPrint": {}, + "entryActionShowGeoTiffOnMap": "Hiển thị dưới dạng lớp phủ bản đồ", + "@entryActionShowGeoTiffOnMap": {}, + "viewerActionSettings": "Cài đặt", + "@viewerActionSettings": {}, + "videoActionReplay10": "Tua lùi 10 giây", + "@videoActionReplay10": {}, + "chipActionConfigureVault": "Định cấu hình két sắt", + "@chipActionConfigureVault": {}, + "cropAspectRatioFree": "Tự do", + "@cropAspectRatioFree": {}, + "slideshowActionShowInCollection": "Hiển thị trong Bộ sưu tập", + "@slideshowActionShowInCollection": {}, + "chipActionLock": "Khóa", + "@chipActionLock": {}, + "filterNoRatingLabel": "Chưa được xếp hạng", + "@filterNoRatingLabel": {}, + "entryActionOpen": "Mở với", + "@entryActionOpen": {}, + "filterNoLocationLabel": "Chưa định vị", + "@filterNoLocationLabel": {}, + "videoActionPlay": "Phát", + "@videoActionPlay": {}, + "entryActionSetAs": "Đặt làm", + "@entryActionSetAs": {}, + "filterLocatedLabel": "Đã định vị", + "@filterLocatedLabel": {}, + "entryActionInfo": "Thông tin", + "@entryActionInfo": {}, + "entryActionViewSource": "Xem nguồn", + "@entryActionViewSource": {}, + "entryActionShareVideoOnly": "Chỉ chia sẻ video", + "@entryActionShareVideoOnly": {}, + "entryInfoActionEditTags": "Chỉnh sửa thẻ", + "@entryInfoActionEditTags": {}, + "videoActionSelectStreams": "Chọn bài hát", + "@videoActionSelectStreams": {}, + "filterBinLabel": "Thùng rác", + "@filterBinLabel": {}, + "entryActionConvert": "Chuyển thành", + "@entryActionConvert": {}, + "entryInfoActionEditDate": "Chỉnh sửa ngày & giờ", + "@entryInfoActionEditDate": {}, + "slideshowActionResume": "Tiếp tục", + "@slideshowActionResume": {}, + "cropAspectRatioSquare": "Vuông", + "@cropAspectRatioSquare": {}, + "chipActionShowCountryStates": "Hiển thị tỉnh", + "@chipActionShowCountryStates": {}, + "cropAspectRatioOriginal": "Nguyên bản", + "@cropAspectRatioOriginal": {}, + "entryActionRename": "Đổi tên", + "@entryActionRename": {}, + "chipActionUnpin": "Bỏ ghim khỏi đầu", + "@chipActionUnpin": {}, + "videoActionSetSpeed": "Tốc độ phát lại", + "@videoActionSetSpeed": {}, + "filterFavouriteLabel": "Yêu thích", + "@filterFavouriteLabel": {}, + "videoActionMute": "Tắt tiếng", + "@videoActionMute": {}, + "entryActionDelete": "Xóa", + "@entryActionDelete": {}, + "entryActionRotateCW": "Xoay theo chiều kim đồng hồ", + "@entryActionRotateCW": {}, + "entryActionFlip": "Lật theo chiều ngang", + "@entryActionFlip": {}, + "entryActionExport": "Xuất", + "@entryActionExport": {}, + "entryActionAddFavourite": "Thêm vào mục yêu thích", + "@entryActionAddFavourite": {}, + "entryActionEdit": "Biên tập", + "@entryActionEdit": {}, + "entryInfoActionEditRating": "Chỉnh sửa xếp hạng", + "@entryInfoActionEditRating": {}, + "entryActionRestore": "Khôi phục", + "@entryActionRestore": {}, + "entryActionCopyToClipboard": "Sao chép vào clipboard", + "@entryActionCopyToClipboard": {}, + "chipActionCreateAlbum": "Tạo bộ sưu tập", + "@chipActionCreateAlbum": {}, + "entryInfoActionRemoveLocation": "Loại bỏ vị trí", + "@entryInfoActionRemoveLocation": {}, + "entryActionShareImageOnly": "Chỉ chia sẻ hình ảnh", + "@entryActionShareImageOnly": {}, + "filterNoDateLabel": "không ghi ngày tháng", + "@filterNoDateLabel": {}, + "aboutCreditsWorldAtlas2": "dưới bản quyền ISC.", + "@aboutCreditsWorldAtlas2": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Chuyển vào thùng rác?} other{Chuyển {count} mục vào thùng rác?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsNavigationDrawerAddAlbum": "Thêm bộ sưu tập", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsPrivacySectionTitle": "Riêng tư", + "@settingsPrivacySectionTitle": {}, + "settingsEnableBinSubtitle": "Giữ các mục đã xóa 30 ngày", + "@settingsEnableBinSubtitle": {}, + "viewerInfoPageTitle": "Thông tin", + "@viewerInfoPageTitle": {}, + "widgetOpenPageViewer": "Mở chế độ xem", + "@widgetOpenPageViewer": {}, + "setCoverDialogLatest": "Mục mới nhất", + "@setCoverDialogLatest": {}, + "settingsThumbnailShowRating": "Hiển thị xếp hạng", + "@settingsThumbnailShowRating": {}, + "albumScreenRecordings": "Ghi màn hình", + "@albumScreenRecordings": {}, + "editEntryRatingDialogTitle": "Xếp hạng", + "@editEntryRatingDialogTitle": {}, + "aboutDataUsageMisc": "Khác", + "@aboutDataUsageMisc": {}, + "collectionExportFailureFeedback": "{count, plural, =1{Lỗi khi xuất tệp} other{Lỗi khi xuất {count} tệp}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "vaultDialogLockModeWhenScreenOff": "Khóa khi màn hình tắt", + "@vaultDialogLockModeWhenScreenOff": {}, + "videoResumeDialogMessage": "Phát lại ngay {time} không?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "albumVideoCaptures": "Ảnh chụp trong Video", + "@albumVideoCaptures": {}, + "wallpaperUseScrollEffect": "Sử dụng hiệu ứng cuộn trên màn hình chính", + "@wallpaperUseScrollEffect": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "editEntryDateDialogSetCustom": "Đặt thời gian tùy chọn", + "@editEntryDateDialogSetCustom": {}, + "mapStyleGoogleTerrain": "Google Maps (Địa hình)", + "@mapStyleGoogleTerrain": {}, + "statsTopTagsSectionTitle": "Thẻ", + "@statsTopTagsSectionTitle": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Căn chỉnh văn bản", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSearchEmpty": "Không có cài đặt phù hợp", + "@settingsSearchEmpty": {}, + "removeEntryMetadataDialogMore": "Thêm", + "@removeEntryMetadataDialogMore": {}, + "pinDialogConfirm": "Xác nhận PIN", + "@pinDialogConfirm": {}, + "settingsViewerSlideshowPageTitle": "Trình chiếu", + "@settingsViewerSlideshowPageTitle": {}, + "tooManyItemsErrorDialogMessage": "Hãy thử lại với ít mục hơn.", + "@tooManyItemsErrorDialogMessage": {}, + "collectionActionEdit": "Chỉnh sửa", + "@collectionActionEdit": {}, + "viewerInfoSearchSuggestionResolution": "Phân tích", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerTransitionSlide": "Trình chiếu", + "@viewerTransitionSlide": {}, + "sortOrderLargestFirst": "Lớn trước", + "@sortOrderLargestFirst": {}, + "viewerTransitionParallax": "Thị sai", + "@viewerTransitionParallax": {}, + "settingsViewerSectionTitle": "Chế độ xem", + "@settingsViewerSectionTitle": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (Màu)", + "@mapStyleStamenWatercolor": {}, + "tagPlaceholderCountry": "Quốc gia", + "@tagPlaceholderCountry": {}, + "editEntryDateDialogSourceFileModifiedDate": "Ngày sửa đổi tệp tin", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "collectionEmptyFavourites": "Không có mục Yêu thích nào", + "@collectionEmptyFavourites": {}, + "albumTierNew": "Mới", + "@albumTierNew": {}, + "chipActionFilterOut": "Lọc đầu ra", + "@chipActionFilterOut": {}, + "removeEntryMetadataDialogTitle": "Xóa Metadata", + "@removeEntryMetadataDialogTitle": {}, + "settingsLanguageTile": "Ngôn ngữ", + "@settingsLanguageTile": {}, + "drawerCollectionVideos": "Video", + "@drawerCollectionVideos": {}, + "videoResumptionModeNever": "Không bao giờ", + "@videoResumptionModeNever": {}, + "countryEmpty": "Không tìm thấy quốc gia", + "@countryEmpty": {}, + "collectionSelectSectionTooltip": "Chọn phần", + "@collectionSelectSectionTooltip": {}, + "settingsAllowInstalledAppAccessSubtitle": "Được sử dụng để cải thiện hiển thị bộ sưu tập", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "aboutLicensesBanner": "Ứng dụng này sử dụng các gói và thư viện nguồn mở.", + "@aboutLicensesBanner": {}, + "moveUndatedConfirmationDialogSetDate": "Lưu thời gian", + "@moveUndatedConfirmationDialogSetDate": {}, + "coordinateDmsNorth": "Bắc", + "@coordinateDmsNorth": {}, + "dateYesterday": "Hôm qua", + "@dateYesterday": {}, + "viewerInfoLabelDate": "Thời gian", + "@viewerInfoLabelDate": {}, + "nameConflictStrategyReplace": "Thay thế", + "@nameConflictStrategyReplace": {}, + "chipActionHide": "Ẩn", + "@chipActionHide": {}, + "aboutDataUsageDatabase": "Database", + "@aboutDataUsageDatabase": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{Lỗi khi di chuyển tệp} other{Lỗi khi di chuyển {count} tệp}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoLoopModeAlways": "Luôn luôn", + "@videoLoopModeAlways": {}, + "settingsRemoveAnimationsDialogTitle": "Xóa hoạt ảnh", + "@settingsRemoveAnimationsDialogTitle": {}, + "tileLayoutMosaic": "Khảm", + "@tileLayoutMosaic": {}, + "settingsSubtitleThemeTextColor": "Màu văn bản", + "@settingsSubtitleThemeTextColor": {}, + "collectionDeselectSectionTooltip": "Bỏ chọn phần", + "@collectionDeselectSectionTooltip": {}, + "settingsKeepScreenOnTile": "Giữ màn hình luôn bật", + "@settingsKeepScreenOnTile": {}, + "tileLayoutGrid": "Lưới", + "@tileLayoutGrid": {}, + "settingsDisplayUseTvInterface": "Giao diện Android TV", + "@settingsDisplayUseTvInterface": {}, + "settingsTimeToTakeActionTile": "Thời gian hành động", + "@settingsTimeToTakeActionTile": {}, + "aboutCreditsWorldAtlas1": "Ứng dụng này dùng tệp TopoJSON từ", + "@aboutCreditsWorldAtlas1": {}, + "tagEditorSectionRecent": "Gần đây", + "@tagEditorSectionRecent": {}, + "nameConflictDialogMultipleSourceMessage": "Một số tệp có cùng tên.", + "@nameConflictDialogMultipleSourceMessage": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "appExportCovers": "Ảnh bìa", + "@appExportCovers": {}, + "viewerOpenPanoramaButtonLabel": "MỞ CHẾ ĐỘ TOÀN CẢNH", + "@viewerOpenPanoramaButtonLabel": {}, + "createAlbumButtonLabel": "TẠO", + "@createAlbumButtonLabel": {}, + "newAlbumDialogStorageLabel": "Lưu trữ:", + "@newAlbumDialogStorageLabel": {}, + "settingsSubtitleThemeBackgroundColor": "Màu nền", + "@settingsSubtitleThemeBackgroundColor": {}, + "menuActionSlideshow": "Trình chiếu", + "@menuActionSlideshow": {}, + "vaultLockTypePassword": "Mật khẩu", + "@vaultLockTypePassword": {}, + "settingsThumbnailOverlayTile": "Lớp phủ", + "@settingsThumbnailOverlayTile": {}, + "settingsNavigationDrawerTabPages": "Trang", + "@settingsNavigationDrawerTabPages": {}, + "settingsConfirmationDialogTitle": "Hộp thoại xác nhận", + "@settingsConfirmationDialogTitle": {}, + "videoStreamSelectionDialogText": "Phụ đề", + "@videoStreamSelectionDialogText": {}, + "settingsVideoAutoPlay": "Tự động phát", + "@settingsVideoAutoPlay": {}, + "settingsVideoEnableHardwareAcceleration": "Tăng tốc phần cứng", + "@settingsVideoEnableHardwareAcceleration": {}, + "editEntryDateDialogShift": "Ca", + "@editEntryDateDialogShift": {}, + "viewerInfoLabelCoordinates": "Tọa độ", + "@viewerInfoLabelCoordinates": {}, + "nameConflictDialogSingleSourceMessage": "Một số tệp trong thư mục có cùng tên.", + "@nameConflictDialogSingleSourceMessage": {}, + "exportEntryDialogFormat": "Định dạng:", + "@exportEntryDialogFormat": {}, + "widgetOpenPageHome": "Mở trang chủ", + "@widgetOpenPageHome": {}, + "keepScreenOnAlways": "Luôn luôn", + "@keepScreenOnAlways": {}, + "appExportSettings": "Cài đặt", + "@appExportSettings": {}, + "exportEntryDialogQuality": "Chất lượng", + "@exportEntryDialogQuality": {}, + "searchPlacesSectionTitle": "Địa điểm", + "@searchPlacesSectionTitle": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Nhấn và giữ để di chuyển các nút và chọn hành động nào sẽ được hiển thị khi chọn mục.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsSlideshowShuffle": "Xáo trộn", + "@settingsSlideshowShuffle": {}, + "settingsThumbnailSectionTitle": "Ảnh thu nhỏ", + "@settingsThumbnailSectionTitle": {}, + "videoStreamSelectionDialogAudio": "Âm thanh", + "@videoStreamSelectionDialogAudio": {}, + "videoSpeedDialogLabel": "Tốc độ phát", + "@videoSpeedDialogLabel": {}, + "openMapPageTooltip": "Xen trên Bản đồ", + "@openMapPageTooltip": {}, + "editEntryLocationDialogSetCustom": "Đặt vị trí tùy chọn", + "@editEntryLocationDialogSetCustom": {}, + "tagPlaceholderPlace": "Địa điểm", + "@tagPlaceholderPlace": {}, + "viewerInfoUnknown": "Không biết", + "@viewerInfoUnknown": {}, + "panoramaDisableSensorControl": "Tắt điều khiển cảm biến", + "@panoramaDisableSensorControl": {}, + "displayRefreshRatePreferHighest": "Giá trị cao nhất", + "@displayRefreshRatePreferHighest": {}, + "settingsVideoShowVideos": "Hiển thị các Video", + "@settingsVideoShowVideos": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Xóa mục này? } other{Xóa{count} mục?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsViewerShowInformation": "Hiển thị thông tin", + "@settingsViewerShowInformation": {}, + "placeEmpty": "Không có địa điểm", + "@placeEmpty": {}, + "settingsCollectionQuickActionsTile": "Hành động nhanh", + "@settingsCollectionQuickActionsTile": {}, + "editEntryDateDialogExtractFromTitle": "Trích xuất từ tiêu đề", + "@editEntryDateDialogExtractFromTitle": {}, + "settingsViewerOverlayTile": "Lớp phủ", + "@settingsViewerOverlayTile": {}, + "albumTierRegular": "Khác", + "@albumTierRegular": {}, + "settingsThumbnailShowFavouriteIcon": "Hiện icon Yêu thích", + "@settingsThumbnailShowFavouriteIcon": {}, + "aboutLinkLicense": "Giấy phép", + "@aboutLinkLicense": {}, + "albumScreenshots": "Ảnh chụp màn hình", + "@albumScreenshots": {}, + "editEntryDateDialogTitle": "Ngày & Giờ", + "@editEntryDateDialogTitle": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "Vị trí văn bản", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "viewerInfoLabelOwner": "Chủ sở hữu", + "@viewerInfoLabelOwner": {}, + "editEntryLocationDialogLongitude": "Kinh độ", + "@editEntryLocationDialogLongitude": {}, + "setCoverDialogCustom": "Tùy chỉnh", + "@setCoverDialogCustom": {}, + "searchCountriesSectionTitle": "Quốc gia", + "@searchCountriesSectionTitle": {}, + "settingsSlideshowIntervalTile": "Khoảng thời gian", + "@settingsSlideshowIntervalTile": {}, + "settingsAskEverytime": "Hỏi mỗi lần", + "@settingsAskEverytime": {}, + "editEntryDateDialogCopyField": "Sao chép từ ngày khác", + "@editEntryDateDialogCopyField": {}, + "searchTagsSectionTitle": "Thẻ", + "@searchTagsSectionTitle": {}, + "displayRefreshRatePreferLowest": "Giá trị thấp nhất", + "@displayRefreshRatePreferLowest": {}, + "tagEditorPageAddTagTooltip": "Thêm tag", + "@tagEditorPageAddTagTooltip": {}, + "settingsModificationWarningDialogMessage": "Các cài đặt khác sẽ được sửa đổi.", + "@settingsModificationWarningDialogMessage": {}, + "videoStartOverButtonLabel": "Bắt đầu lại", + "@videoStartOverButtonLabel": {}, + "accessibilityAnimationsKeep": "Giữ hiệu ứng màn hình", + "@accessibilityAnimationsKeep": {}, + "settingsCollectionQuickActionEditorPageTitle": "Hành động nhanh", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "policyPageTitle": "Chính sách bảo mật", + "@policyPageTitle": {}, + "tileLayoutList": "Danh sách", + "@tileLayoutList": {}, + "settingsStorageAccessRevokeTooltip": "Thu hồi", + "@settingsStorageAccessRevokeTooltip": {}, + "panoramaEnableSensorControl": "Bật điều khiển cảm biến", + "@panoramaEnableSensorControl": {}, + "settingsSubtitleThemeTile": "Phụ đề", + "@settingsSubtitleThemeTile": {}, + "widgetDisplayedItemMostRecent": "Gần đây", + "@widgetDisplayedItemMostRecent": {}, + "appPickDialogNone": "Không có", + "@appPickDialogNone": {}, + "filterMimeImageLabel": "Ảnh", + "@filterMimeImageLabel": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "Vuốt lên hoặc xuống để điều chỉnh độ sáng/âm lượng", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "settingsAccessibilitySectionTitle": "Khả năng tiếp cận", + "@settingsAccessibilitySectionTitle": {}, + "settingsActionExport": "Xuất", + "@settingsActionExport": {}, + "aboutBugCopyInfoInstruction": "Sao chép thông tin hệ thống", + "@aboutBugCopyInfoInstruction": {}, + "missingSystemFilePickerDialogMessage": "Tệp hệ thống bị thiếu hoặc bị vô hiệu hóa. Vui lòng kích hoạt nó và thử lại.", + "@missingSystemFilePickerDialogMessage": {}, + "viewerInfoViewXmlLinkText": "Xem XML", + "@viewerInfoViewXmlLinkText": {}, + "sortOrderOldestFirst": "Cũ nhất trước", + "@sortOrderOldestFirst": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{Lỗi khi đặt lại tên tệp} other{Lỗi khi đặt lại tên {count} tệp}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoResumptionModeAlways": "Luôn luôn", + "@videoResumptionModeAlways": {}, + "tagEditorDiscardDialogMessage": "Bạn có muốn hủy các thay đổi không?", + "@tagEditorDiscardDialogMessage": {}, + "collectionEditSuccessFeedback": "{count, plural, =1{Đã chỉnh sửa} other{Đã chỉnh sửa {count} mục}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "wallpaperTargetLock": "Màn hình khóa", + "@wallpaperTargetLock": {}, + "coverDialogTabApp": "Ứng dụng", + "@coverDialogTabApp": {}, + "settingsThumbnailShowMotionPhotoIcon": "Hiện icon Ảnh động", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "accessibilityAnimationsRemove": "Chặn hiệu ứng màn hình", + "@accessibilityAnimationsRemove": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Cần có XMP để phát video bên trong ảnh chuyển động.\n\nBạn có chắc chắn muốn xóa nó không?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "nameConflictStrategyRename": "Sửa tên", + "@nameConflictStrategyRename": {}, + "settingsThumbnailShowRawIcon": "Hiện icon RAW", + "@settingsThumbnailShowRawIcon": {}, + "vaultLockTypePattern": "Mẫu", + "@vaultLockTypePattern": {}, + "tagPageTitle": "Thẻ", + "@tagPageTitle": {}, + "collectionEmptyVideos": "Không có Video nào", + "@collectionEmptyVideos": {}, + "aboutCreditsSectionTitle": "Đóng góp", + "@aboutCreditsSectionTitle": {}, + "drawerAlbumPage": "Bộ sưu tập", + "@drawerAlbumPage": {}, + "statsTopCountriesSectionTitle": "Quốc gia", + "@statsTopCountriesSectionTitle": {}, + "settingsActionImport": "Nhập", + "@settingsActionImport": {}, + "viewerInfoLabelSize": "Kích cỡ", + "@viewerInfoLabelSize": {}, + "locationPickerUseThisLocationButton": "Dùng vị trí này", + "@locationPickerUseThisLocationButton": {}, + "settingsSlideshowFillScreen": "Lắp đầy màn hình", + "@settingsSlideshowFillScreen": {}, + "chipActionFilterIn": "Lọc đầu vào", + "@chipActionFilterIn": {}, + "settingsHiddenFiltersBanner": "Ảnh và video phù hợp với bộ lọc ẩn sẽ không xuất hiện trong bộ sưu tập của bạn.", + "@settingsHiddenFiltersBanner": {}, + "albumTierVaults": "Két sắt", + "@albumTierVaults": {}, + "viewerSetWallpaperButtonLabel": "CÀI HÌNH NỀN", + "@viewerSetWallpaperButtonLabel": {}, + "settingsVideoResumptionModeTile": "Quay lại playback", + "@settingsVideoResumptionModeTile": {}, + "searchRatingSectionTitle": "Xếp hạng", + "@searchRatingSectionTitle": {}, + "vaultBinUsageDialogMessage": "Một số két sắt đang sử dụng thùng rác.", + "@vaultBinUsageDialogMessage": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{Lỗi khi sao chép tệp} other{Lỗi khi sao chép {count} tệp}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsDisabled": "Vô hiệu hóa", + "@settingsDisabled": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Nhấn đúp để phát/tạm dừng", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "coordinateFormatDecimal": "Thập phân", + "@coordinateFormatDecimal": {}, + "overlayHistogramLuminance": "Độ sáng", + "@overlayHistogramLuminance": {}, + "coordinateDmsEast": "Đông", + "@coordinateDmsEast": {}, + "albumTierApps": "Ứng dụng", + "@albumTierApps": {}, + "settingsWidgetDisplayedItem": "Mục hiển thị", + "@settingsWidgetDisplayedItem": {}, + "aboutBugSaveLogInstruction": "Lưu log thành file", + "@aboutBugSaveLogInstruction": {}, + "settingsActionImportDialogTitle": "Nhập", + "@settingsActionImportDialogTitle": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "albumGroupTier": "Theo tầng", + "@albumGroupTier": {}, + "aboutBugReportInstruction": "Báo cáo trên GitHub với nhật ký và thông tin hệ thống", + "@aboutBugReportInstruction": {}, + "patternDialogEnter": "Nhập mẫu", + "@patternDialogEnter": {}, + "settingsEnableBin": "Dùng thùng rác", + "@settingsEnableBin": {}, + "otherDirectoryDescription": "“{name}” thư mục", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "viewerTransitionZoomIn": "Phóng to", + "@viewerTransitionZoomIn": {}, + "drawerCollectionAll": "Tất cả bộ sưu tập", + "@drawerCollectionAll": {}, + "collectionMoveSuccessFeedback": "{count, plural, =1{Đã di chuyển} other{Đã di chuyển {count} mục}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSubtitleThemeTextAlignmentLeft": "Trái", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsVideoGestureSideDoubleTapSeek": "Nhấn đúp vào các cạnh màn hình để lùi lại/tiến tới", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "sortByItemCount": "Theo số mục", + "@sortByItemCount": {}, + "sectionUnknown": "Không biết", + "@sectionUnknown": {}, + "dateToday": "Hôm nay", + "@dateToday": {}, + "videoStreamSelectionDialogNoSelection": "Không có bài hát nào.", + "@videoStreamSelectionDialogNoSelection": {}, + "searchRecentSectionTitle": "Gần đây", + "@searchRecentSectionTitle": {}, + "albumPickPageTitlePick": "Chọn bộ sưu tập", + "@albumPickPageTitlePick": {}, + "videoPlaybackMuted": "Phát với chế độ im lặng", + "@videoPlaybackMuted": {}, + "settingsSubtitleThemeTextAlignmentRight": "Phải", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "menuActionMap": "Bản đồ", + "@menuActionMap": {}, + "collectionActionMove": "Di chuyển tới bộ sưu tập", + "@collectionActionMove": {}, + "searchAlbumsSectionTitle": "Bộ sưu tập", + "@searchAlbumsSectionTitle": {}, + "settingsLanguagePageTitle": "Ngôn ngữ", + "@settingsLanguagePageTitle": {}, + "rootDirectoryDescription": "Thư mục root", + "@rootDirectoryDescription": {}, + "viewDialogGroupSectionTitle": "Nhóm", + "@viewDialogGroupSectionTitle": {}, + "maxBrightnessAlways": "Luôn luôn", + "@maxBrightnessAlways": {}, + "settingsAllowMediaManagement": "Cho phép quản lí phương tiện", + "@settingsAllowMediaManagement": {}, + "aboutDataUsageSectionTitle": "Sử dụng dữ liệu", + "@aboutDataUsageSectionTitle": {}, + "durationDialogSeconds": "Giây", + "@durationDialogSeconds": {}, + "themeBrightnessLight": "Sáng", + "@themeBrightnessLight": {}, + "unitSystemImperial": "Hệ ft", + "@unitSystemImperial": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "albumEmpty": "Không có bộ sưu tập nào", + "@albumEmpty": {}, + "editEntryLocationDialogChooseOnMap": "Chọn trên bản đồ", + "@editEntryLocationDialogChooseOnMap": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Nhấn và giữ để di chuyển các nút và chọn hành động nào sẽ được hiển thị khi duyệt các mục.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsConfirmationBeforeDeleteItems": "Hỏi trước khi xóa các mục vĩnh viễn", + "@settingsConfirmationBeforeDeleteItems": {}, + "sortByName": "Theo tên", + "@sortByName": {}, + "settingsHomeDialogTitle": "Trang chủ", + "@settingsHomeDialogTitle": {}, + "searchDateSectionTitle": "Thời gian", + "@searchDateSectionTitle": {}, + "viewerErrorUnknown": "Ôi!", + "@viewerErrorUnknown": {}, + "storageAccessDialogMessage": "Vui lòng chọn {directory} của “{volume}” trong màn hình tiếp theo để cấp cho ứng dụng này quyền truy cập vào nó.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "themeBrightnessDark": "Tối", + "@themeBrightnessDark": {}, + "collectionSearchTitlesHintText": "Tìm tiêu đề", + "@collectionSearchTitlesHintText": {}, + "viewerInfoSearchSuggestionDate": "Ngày & Giờ", + "@viewerInfoSearchSuggestionDate": {}, + "videoPlaybackWithSound": "Phát với âm thanh", + "@videoPlaybackWithSound": {}, + "viewerInfoLabelTitle": "Tiêu đề", + "@viewerInfoLabelTitle": {}, + "searchCollectionFieldHint": "Tìm bộ sưu tập", + "@searchCollectionFieldHint": {}, + "settingsDoubleBackExit": "Gõ “quay lại” hai lần để thoát", + "@settingsDoubleBackExit": {}, + "drawerCollectionSphericalVideos": "Video 360 độ", + "@drawerCollectionSphericalVideos": {}, + "moveUndatedConfirmationDialogMessage": "Lưu thời gian của mục trước khi tiếp tục?", + "@moveUndatedConfirmationDialogMessage": {}, + "collectionEditFailureFeedback": "{count, plural, =1{Lỗi khi chỉnh sửa tệp} other{Lỗi khi chỉnh sửa {count} tệp}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noMatchingAppDialogMessage": "Không có ứng dụng nào có thể xử lý việc này.", + "@noMatchingAppDialogMessage": {}, + "settingsThumbnailOverlayPageTitle": "Lớp phủ", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsViewerShowInformationSubtitle": "Hiển thị tiêu đề, thời gian, vị trí v..v..", + "@settingsViewerShowInformationSubtitle": {}, + "searchMetadataSectionTitle": "Siêu dữ liệu", + "@searchMetadataSectionTitle": {}, + "widgetOpenPageCollection": "Mở bộ sưu tập", + "@widgetOpenPageCollection": {}, + "clearTooltip": "Xóa", + "@clearTooltip": {}, + "settingsWidgetOpenPage": "Khi nhấn vào tiện ích", + "@settingsWidgetOpenPage": {}, + "renameProcessorName": "Tên", + "@renameProcessorName": {}, + "viewerInfoSearchFieldLabel": "Tìm kiếm metadata", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoLabelDescription": "Mô tả", + "@viewerInfoLabelDescription": {}, + "nameConflictStrategySkip": "Bỏ qua", + "@nameConflictStrategySkip": {}, + "addShortcutButtonLabel": "NHẬP", + "@addShortcutButtonLabel": {}, + "exportEntryDialogHeight": "Cao", + "@exportEntryDialogHeight": {}, + "collectionActionEmptyBin": "Trống rỗng", + "@collectionActionEmptyBin": {}, + "settingsSlideshowRepeat": "Lặp lại", + "@settingsSlideshowRepeat": {}, + "settingsViewerQuickActionEditorPageTitle": "Hành động nhanh", + "@settingsViewerQuickActionEditorPageTitle": {}, + "sortOrderAtoZ": "Từ A đến Z", + "@sortOrderAtoZ": {}, + "settingsVideoPageTitle": "Cài đặt video", + "@settingsVideoPageTitle": {}, + "setCoverDialogAuto": "Tự động", + "@setCoverDialogAuto": {}, + "tagEditorPageNewTagFieldLabel": "Tag mới", + "@tagEditorPageNewTagFieldLabel": {}, + "exportEntryDialogWidth": "Rộng", + "@exportEntryDialogWidth": {}, + "newAlbumDialogTitle": "Bộ sưu tập mới", + "@newAlbumDialogTitle": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{Đã đặt lại tên} other{Đã thay tên {count} mục}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoStreamSelectionDialogTrack": "Bài hát", + "@videoStreamSelectionDialogTrack": {}, + "settingsViewerUseCutout": "Sử dụng vùng cắt", + "@settingsViewerUseCutout": {}, + "tagEditorPageTitle": "Chỉnh sửa thẻ", + "@tagEditorPageTitle": {}, + "settingsWidgetShowOutline": "Đường viền", + "@settingsWidgetShowOutline": {}, + "settingsHomeTile": "Trang chủ", + "@settingsHomeTile": {}, + "hideFilterConfirmationDialogMessage": "Ảnh và video trùng khớp sẽ bị ẩn khỏi bộ sưu tập của bạn. Bạn có thể hiển thị lại chúng từ cài đặt “Quyền riêng tư”.\n\nBạn có chắc chắn muốn ẩn chúng không?", + "@hideFilterConfirmationDialogMessage": {}, + "settingsViewerGestureSideTapNext": "Chạm vào các cạnh màn hình để hiển thị mục trước/tiếp theo", + "@settingsViewerGestureSideTapNext": {}, + "collectionGroupDay": "Theo ngày", + "@collectionGroupDay": {}, + "collectionGroupAlbum": "Theo bộ sưu tập", + "@collectionGroupAlbum": {}, + "newFilterBanner": "mới", + "@newFilterBanner": {}, + "drawerCollectionFavourites": "Yêu thích", + "@drawerCollectionFavourites": {}, + "filterTypeRawLabel": "RAW", + "@filterTypeRawLabel": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Trung tâm", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "keepScreenOnVideoPlayback": "Khi phát lại video", + "@keepScreenOnVideoPlayback": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "settingsSubtitleThemeTextAlignmentTile": "Căn chỉnh văn bản", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Các gói Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "settingsCollectionQuickActionTabSelecting": "Chọn", + "@settingsCollectionQuickActionTabSelecting": {}, + "focalLength": "{length} pp", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "statePageTitle": "Bang/Tỉnh", + "@statePageTitle": {}, + "drawerTagPage": "Thẻ", + "@drawerTagPage": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Thư mục đã tồn tại", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "patternDialogConfirm": "Xác nhận mẫu", + "@patternDialogConfirm": {}, + "restrictedAccessDialogMessage": "Ứng dụng này không được phép sửa đổi các tệp trong {directory} của “{volume}”.\n\n Vui lòng sử dụng trình quản lý tệp hoặc ứng dụng thư viện được cài đặt sẵn để di chuyển các mục sang thư mục khác.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "durationDialogMinutes": "Phút", + "@durationDialogMinutes": {}, + "settingsAllowErrorReporting": "Cho phép báo cáo lỗi ẩn danh", + "@settingsAllowErrorReporting": {}, + "settingsVideoLoopModeTile": "Vòng lặp", + "@settingsVideoLoopModeTile": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Thao tác này không hỗ trợ cho kiểu tệp: {types}.} other{Thao tác này không hỗ trợ cho kiểu tệp: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "settingsScreenSaverPageTitle": "Bảo vệ màn hình", + "@settingsScreenSaverPageTitle": {}, + "settingsNavigationDrawerEditorPageTitle": "Menu điều hướng", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Hỏi trước khi di chuyển các mục không ghi ngày tháng", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "albumPageTitle": "Bộ sưu tập", + "@albumPageTitle": {}, + "editEntryLocationDialogTitle": "Vị trí", + "@editEntryLocationDialogTitle": {}, + "statsWithGps": "{count, plural, =1{1 mục với thông tin vị trí} other{{count}mục với thông tin vị trí}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsVideoResumptionModeDialogTitle": "Quay lại playback", + "@settingsVideoResumptionModeDialogTitle": {}, + "albumTierPinned": "Đã ghim", + "@albumTierPinned": {}, + "mapStyleDialogTitle": "Kiểu bản đồ", + "@mapStyleDialogTitle": {}, + "settingsVideoBackgroundMode": "Chế độ nền", + "@settingsVideoBackgroundMode": {}, + "albumPickPageTitleCopy": "Sao chép đến bộ sưu tập", + "@albumPickPageTitleCopy": {}, + "collectionActionCopy": "Sao chép vào bộ sưu tập", + "@collectionActionCopy": {}, + "settingsAllowInstalledAppAccess": "Cho phép truy cập vào kho ứng dụng", + "@settingsAllowInstalledAppAccess": {}, + "viewDialogReverseSortOrder": "Đảo ngược thứ tự sắp xếp", + "@viewDialogReverseSortOrder": {}, + "menuActionConfigureView": "Xem", + "@menuActionConfigureView": {}, + "aboutLicensesDartPackagesSectionTitle": "Các gói Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, + "drawerCollectionMotionPhotos": "Ảnh động", + "@drawerCollectionMotionPhotos": {}, + "settingsDefault": "Mặc định", + "@settingsDefault": {}, + "settingsSlideshowAnimatedZoomEffect": "Hiệu ứng phóng to", + "@settingsSlideshowAnimatedZoomEffect": {}, + "placePageTitle": "Địa điểm", + "@placePageTitle": {}, + "filterOnThisDayLabel": "Vào ngày này", + "@filterOnThisDayLabel": {}, + "columnCount": "{count, plural, other{{count} cột}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "viewerTransitionNone": "Không có", + "@viewerTransitionNone": {}, + "settingsDisplayRefreshRateModeTile": "Tốc độ làm mới màn hình", + "@settingsDisplayRefreshRateModeTile": {}, + "addShortcutDialogLabel": "Nhãn phím tắt", + "@addShortcutDialogLabel": {}, + "settingsViewerOverlayPageTitle": "Lớp phủ", + "@settingsViewerOverlayPageTitle": {}, + "tagEmpty": "Không được gắn thẻ", + "@tagEmpty": {}, + "pinDialogEnter": "Nhập PIN", + "@pinDialogEnter": {}, + "videoControlsPlayOutside": "Mở với trình phát khác", + "@videoControlsPlayOutside": {}, + "settingsCoordinateFormatDialogTitle": "Định dạng tọa độ", + "@settingsCoordinateFormatDialogTitle": {}, + "authenticateToUnlockVault": "Xác thực để mở khóa két sắt", + "@authenticateToUnlockVault": {}, + "collectionActionShowTitleSearch": "Hiển thị tên filter", + "@collectionActionShowTitleSearch": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "settingsNavigationDrawerTabTypes": "Loại", + "@settingsNavigationDrawerTabTypes": {}, + "menuActionSelectAll": "Chọn hết", + "@menuActionSelectAll": {}, + "settingsHiddenItemsTile": "Các mục đã ẩn", + "@settingsHiddenItemsTile": {}, + "maxBrightnessNever": "Không bao giờ", + "@maxBrightnessNever": {}, + "aboutDataUsageCache": "Cache", + "@aboutDataUsageCache": {}, + "settingsConfirmationTile": "Hộp thoại xác nhận", + "@settingsConfirmationTile": {}, + "coordinateDmsSouth": "Nam", + "@coordinateDmsSouth": {}, + "settingsThumbnailShowVideoDuration": "Hiển thị thời lượng video", + "@settingsThumbnailShowVideoDuration": {}, + "passwordDialogConfirm": "Xác nhận mật khẩu", + "@passwordDialogConfirm": {}, + "settingsCollectionBurstPatternsNone": "Không có", + "@settingsCollectionBurstPatternsNone": {}, + "albumMimeTypeMixed": "Trộn", + "@albumMimeTypeMixed": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Các nút có sẵn", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "itemCount": "{count, plural, other{{count} mục}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "widgetTapUpdateWidget": "Cập nhật widget", + "@widgetTapUpdateWidget": {}, + "settingsViewerShowDescription": "Hiển thị mô tả", + "@settingsViewerShowDescription": {}, + "viewerTransitionFade": "Phai nhạt", + "@viewerTransitionFade": {}, + "aboutLinkPolicy": "Chính sách bảo mật", + "@aboutLinkPolicy": {}, + "filterTypeSphericalVideoLabel": "360° Video", + "@filterTypeSphericalVideoLabel": {}, + "notEnoughSpaceDialogMessage": "Thao tác này cần có {neededSize} dung lượng trống trên “{volume}” để hoàn thành nhưng chỉ còn lại {freeSize}.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "settingsUnitSystemTile": "Đơn vị", + "@settingsUnitSystemTile": {}, + "pickTooltip": "Chọn", + "@pickTooltip": {}, + "settingsCoordinateFormatTile": "Định dạng tọa độ", + "@settingsCoordinateFormatTile": {}, + "newVaultWarningDialogMessage": "Các mục trong kho bí mật chỉ có sẵn cho ứng dụng này và không có sẵn cho ứng dụng khác.\n\nNếu bạn gỡ cài đặt ứng dụng này hoặc xóa dữ liệu ứng dụng này, bạn sẽ mất tất cả các mục này.", + "@newVaultWarningDialogMessage": {}, + "settingsViewerQuickActionEditorBanner": "Chạm và giữ để di chuyển các nút và chọn hành động nào được hiển thị trong trình xem.", + "@settingsViewerQuickActionEditorBanner": {}, + "themeBrightnessBlack": "Đen", + "@themeBrightnessBlack": {}, + "mapZoomInTooltip": "Phóng to", + "@mapZoomInTooltip": {}, + "viewerInfoOpenLinkText": "Mở", + "@viewerInfoOpenLinkText": {}, + "storageVolumeDescriptionFallbackNonPrimary": "Thẻ nhớ", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "renameEntrySetPagePatternFieldLabel": "Mẫu đặt tên", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameAlbumDialogLabel": "Tên mới", + "@renameAlbumDialogLabel": {}, + "settingsDisablingBinWarningDialogMessage": "Các mục trong thùng rác sẽ bị xóa vĩnh viễn.", + "@settingsDisablingBinWarningDialogMessage": {}, + "sortOrderLowestFirst": "Thấp nhất trước", + "@sortOrderLowestFirst": {}, + "statsTopStatesSectionTitle": "Bang/Tỉnh", + "@statsTopStatesSectionTitle": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Các nút được hiển thị", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsVideoPlaybackPageTitle": "Phát lại", + "@settingsVideoPlaybackPageTitle": {}, + "videoPlaybackSkip": "Bỏ qua", + "@videoPlaybackSkip": {}, + "mapStyleTooltip": "Chọn kiểu bản đồ", + "@mapStyleTooltip": {}, + "countryPageTitle": "Quốc gia", + "@countryPageTitle": {}, + "albumGroupType": "Theo loại", + "@albumGroupType": {}, + "viewerErrorDoesNotExist": "Tệp không còn tồn tại.", + "@viewerErrorDoesNotExist": {}, + "albumCamera": "Máy Ảnh", + "@albumCamera": {}, + "settingsNavigationSectionTitle": "Điều hướng", + "@settingsNavigationSectionTitle": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Tốc độ làm mới", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "filterTypePanoramaLabel": "Toàn cảnh", + "@filterTypePanoramaLabel": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "passwordDialogEnter": "Nhập mật khẩu", + "@passwordDialogEnter": {}, + "mapZoomOutTooltip": "Thu nhỏ", + "@mapZoomOutTooltip": {}, + "collectionActionHideTitleSearch": "Ẩn tên filter", + "@collectionActionHideTitleSearch": {}, + "settingsNavigationDrawerTile": "Menu điều hướng", + "@settingsNavigationDrawerTile": {}, + "drawerCollectionAnimated": "Hoạt ảnh", + "@drawerCollectionAnimated": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Thư mục đã tồn tại", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "settingsHiddenItemsPageTitle": "Mục đã ẩn", + "@settingsHiddenItemsPageTitle": {}, + "keepScreenOnViewerOnly": "Chỉ trang người xem", + "@keepScreenOnViewerOnly": {}, + "durationDialogHours": "Giờ", + "@durationDialogHours": {}, + "settingsKeepScreenOnDialogTitle": "Giữ màn hình luôn bật", + "@settingsKeepScreenOnDialogTitle": {}, + "wallpaperTargetHome": "Màn hình chính", + "@wallpaperTargetHome": {}, + "settingsViewerShowOverlayOnOpening": "Hiển thị khi mở", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "Hiển thị các lựa chọn thay thế cử chỉ đa chạm", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "settingsViewerShowShootingDetails": "Hiển thị mục shooting", + "@settingsViewerShowShootingDetails": {}, + "settingsConfirmationAfterMoveToBinItems": "Hiển thị thông báo sau khi di chuyển mục vào thùng rác", + "@settingsConfirmationAfterMoveToBinItems": {}, + "widgetDisplayedItemRandom": "Ngẫu nhiên", + "@widgetDisplayedItemRandom": {}, + "settingsLanguageSectionTitle": "Ngôn ngữ và Định dạng", + "@settingsLanguageSectionTitle": {}, + "drawerPlacePage": "Địa điểm", + "@drawerPlacePage": {}, + "menuActionSelect": "Chọn", + "@menuActionSelect": {}, + "drawerCollectionPanoramas": "Toàn cảnh", + "@drawerCollectionPanoramas": {}, + "renameEntrySetPagePreviewSectionTitle": "Xem trước", + "@renameEntrySetPagePreviewSectionTitle": {}, + "settingsDisplaySectionTitle": "Hiển thị", + "@settingsDisplaySectionTitle": {}, + "settingsConfirmationVaultDataLoss": "Hiển thị cảnh báo mất dữ liệu két sắt", + "@settingsConfirmationVaultDataLoss": {}, + "settingsSlideshowTransitionTile": "Chuyển tiếp", + "@settingsSlideshowTransitionTile": {}, + "settingsPageTitle": "Cài đặt", + "@settingsPageTitle": {}, + "subtitlePositionTop": "Trên", + "@subtitlePositionTop": {}, + "menuActionSelectNone": "Chọn không có", + "@menuActionSelectNone": {}, + "sourceViewerPageTitle": "Nguồn", + "@sourceViewerPageTitle": {}, + "settingsSearchFieldLabel": "Cài đặt tìm kiếm", + "@settingsSearchFieldLabel": {}, + "appExportFavourites": "Yêu thích", + "@appExportFavourites": {}, + "collectionEmptyImages": "Không có Ảnh nào", + "@collectionEmptyImages": {}, + "settingsViewerMaximumBrightness": "Độ sáng tối đa", + "@settingsViewerMaximumBrightness": {}, + "albumPickPageTitleExport": "Xuất đến bộ sưu tập", + "@albumPickPageTitleExport": {}, + "settingsThumbnailShowTagIcon": "Hiện icon Thẻ", + "@settingsThumbnailShowTagIcon": {}, + "settingsStorageAccessEmpty": "Không có quyền nào được cấp", + "@settingsStorageAccessEmpty": {}, + "settingsRemoveAnimationsTile": "Xóa hiệu ứng ảnh động", + "@settingsRemoveAnimationsTile": {}, + "settingsStorageAccessBanner": "Một số thư mục yêu cầu cấp quyền truy cập rõ ràng để sửa đổi các tệp trong đó. Bạn có thể xem lại các thư mục mà trước đây bạn đã cấp quyền truy cập tại đây.", + "@settingsStorageAccessBanner": {}, + "authenticateToConfigureVault": "Xác thực để định cấu hình két sắt", + "@authenticateToConfigureVault": {}, + "settingsActionExportDialogTitle": "Xuất", + "@settingsActionExportDialogTitle": {}, + "genericDangerWarningDialogMessage": "Bạn chắc chứ?", + "@genericDangerWarningDialogMessage": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "vaultDialogLockTypeLabel": "Loại khóa", + "@vaultDialogLockTypeLabel": {}, + "aboutDataUsageExternal": "Ngoại tuyến", + "@aboutDataUsageExternal": {}, + "collectionSelectPageTitle": "Chọn mục", + "@collectionSelectPageTitle": {}, + "editEntryLocationDialogLatitude": "Vĩ độ", + "@editEntryLocationDialogLatitude": {}, + "collectionActionRescan": "Quét lại", + "@collectionActionRescan": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{Đã sao chép} other{Đã sao chép {count} mục}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsNavigationDrawerBanner": "Nhấn và giữ để di chuyển và sắp xếp lại các mục menu.", + "@settingsNavigationDrawerBanner": {}, + "settingsWidgetPageTitle": "Khung ảnh", + "@settingsWidgetPageTitle": {}, + "viewDialogSortSectionTitle": "Sắp xếp", + "@viewDialogSortSectionTitle": {}, + "collectionPageTitle": "Bộ sưu tập", + "@collectionPageTitle": {}, + "unitSystemMetric": "Hệ mét", + "@unitSystemMetric": {}, + "overlayHistogramNone": "Không có", + "@overlayHistogramNone": {}, + "filterRecentlyAddedLabel": "Đã thêm gần đây", + "@filterRecentlyAddedLabel": {}, + "editEntryDialogTargetFieldsHeader": "Các trường cần sửa", + "@editEntryDialogTargetFieldsHeader": {}, + "storageVolumeDescriptionFallbackPrimary": "Bộ nhớ trong", + "@storageVolumeDescriptionFallbackPrimary": {}, + "collectionActionAddShortcut": "Thêm lối tắt", + "@collectionActionAddShortcut": {}, + "settingsViewerShowMinimap": "Hiển thị bản đồ thu nhỏ", + "@settingsViewerShowMinimap": {}, + "settingsCollectionBurstPatternsTile": "Mẫu Burst", + "@settingsCollectionBurstPatternsTile": {}, + "viewerInfoLabelPath": "Đường dẫn", + "@viewerInfoLabelPath": {}, + "albumGroupVolume": "Theo dung lượng lưu trữ", + "@albumGroupVolume": {}, + "collectionGroupMonth": "Theo tháng", + "@collectionGroupMonth": {}, + "viewerInfoLabelResolution": "Phân tích", + "@viewerInfoLabelResolution": {}, + "renameProcessorCounter": "Đếm", + "@renameProcessorCounter": {}, + "settingsImageBackground": "Hình nền", + "@settingsImageBackground": {}, + "newAlbumDialogNameLabel": "Tên bộ sưu tập", + "@newAlbumDialogNameLabel": {}, + "sortByDate": "Theo thời gian", + "@sortByDate": {}, + "statsTopAlbumsSectionTitle": "Bộ sưu tập hàng đầu", + "@statsTopAlbumsSectionTitle": {}, + "configureVaultDialogTitle": "Cấu hình Két sắt", + "@configureVaultDialogTitle": {}, + "viewerInfoLabelDuration": "Thời lượng", + "@viewerInfoLabelDuration": {}, + "sortOrderZtoA": "Từ Z về A", + "@sortOrderZtoA": {}, + "keepScreenOnNever": "Không bao giờ", + "@keepScreenOnNever": {}, + "statsPageTitle": "Thống kê", + "@statsPageTitle": {}, + "viewerInfoSearchSuggestionDimensions": "Kích thước", + "@viewerInfoSearchSuggestionDimensions": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "drawerAboutButton": "Giới thiệu", + "@drawerAboutButton": {}, + "aboutTranslatorsSectionTitle": "Dịch", + "@aboutTranslatorsSectionTitle": {}, + "statsTopPlacesSectionTitle": "Địa điểm", + "@statsTopPlacesSectionTitle": {}, + "videoStreamSelectionDialogOff": "Tắt", + "@videoStreamSelectionDialogOff": {}, + "settingsVideoLoopModeDialogTitle": "Vòng lặp", + "@settingsVideoLoopModeDialogTitle": {}, + "drawerCollectionImages": "Ảnh", + "@drawerCollectionImages": {}, + "sortOrderSmallestFirst": "Nhỏ trước", + "@sortOrderSmallestFirst": {}, + "timeSeconds": "{count, plural, other{{count} giây}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "sortBySize": "Theo kích cỡ", + "@sortBySize": {}, + "viewerInfoSearchSuggestionDescription": "Mô tả", + "@viewerInfoSearchSuggestionDescription": {}, + "settingsViewerShowOverlayThumbnails": "Hiển thị ảnh thu nhỏ", + "@settingsViewerShowOverlayThumbnails": {}, + "collectionPickPageTitle": "Chọn", + "@collectionPickPageTitle": {}, + "settingsVideoControlsPageTitle": "Điều khiển", + "@settingsVideoControlsPageTitle": {}, + "aboutBugReportButton": "Báo cáo", + "@aboutBugReportButton": {}, + "collectionEmptyGrantAccessButtonLabel": "Quyền truy cập", + "@collectionEmptyGrantAccessButtonLabel": {}, + "filterTypeMotionPhotoLabel": "Ảnh động", + "@filterTypeMotionPhotoLabel": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "viewDialogLayoutSectionTitle": "Trình bày", + "@viewDialogLayoutSectionTitle": {}, + "searchStatesSectionTitle": "Bang/Tỉnh", + "@searchStatesSectionTitle": {}, + "chipActionGoToTagPage": "Hiển thị trong các thẻ", + "@chipActionGoToTagPage": {}, + "filterTypeAnimatedLabel": "Hoạt ảnh", + "@filterTypeAnimatedLabel": {}, + "videoLoopModeNever": "Không bao giờ", + "@videoLoopModeNever": {}, + "settingsUnitSystemDialogTitle": "Đơn vị", + "@settingsUnitSystemDialogTitle": {}, + "dateThisMonth": "Tháng này", + "@dateThisMonth": {}, + "renameEntrySetPageTitle": "Đổi tên", + "@renameEntrySetPageTitle": {}, + "settingsConfirmationBeforeMoveToBinItems": "Hỏi trước khi chuyển các mục vào thùng rác", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsSlideshowVideoPlaybackTile": "Xem lại video", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsHiddenFiltersEmpty": "Không có bộ lọc ẩn nào", + "@settingsHiddenFiltersEmpty": {}, + "aboutPageTitle": "Giới thiệu", + "@aboutPageTitle": {}, + "sortByRating": "Theo xếp hạng", + "@sortByRating": {}, + "stateEmpty": "Không tìm thấy Bang/Tỉnh", + "@stateEmpty": {}, + "viewerInfoSearchEmpty": "Không phù hợp", + "@viewerInfoSearchEmpty": {}, + "drawerCountryPage": "Quốc gia", + "@drawerCountryPage": {}, + "aboutBugSectionTitle": "Báo cáo lỗi", + "@aboutBugSectionTitle": {}, + "filterRatingRejectedLabel": "Đã loại bỏ", + "@filterRatingRejectedLabel": {}, + "settingsThumbnailShowLocationIcon": "Hiện icon Vị trí", + "@settingsThumbnailShowLocationIcon": {}, + "editEntryDialogCopyFromItem": "Sao chép từ mục khác", + "@editEntryDialogCopyFromItem": {}, + "settingsStorageAccessPageTitle": "Quyền truy cập bộ nhớ", + "@settingsStorageAccessPageTitle": {}, + "genericFailureFeedback": "Bị lỗi", + "@genericFailureFeedback": {}, + "aboutDataUsageData": "Dữ liệu", + "@aboutDataUsageData": {}, + "settingsThemeEnableDynamicColor": "Màu sắc Dynamic", + "@settingsThemeEnableDynamicColor": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Không thể trích xuất dữ liệu được nhúng", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "aboutDataUsageInternal": "Nội bộ", + "@aboutDataUsageInternal": {}, + "albumDownload": "Tải về", + "@albumDownload": {}, + "coverDialogTabColor": "Màu sắc", + "@coverDialogTabColor": {}, + "coordinateDmsWest": "Tây", + "@coordinateDmsWest": {}, + "genericSuccessFeedback": "Xong!", + "@genericSuccessFeedback": {}, + "renameEntryDialogLabel": "Tên mới", + "@renameEntryDialogLabel": {}, + "renameEntrySetPageInsertTooltip": "Chèn thêm trường", + "@renameEntrySetPageInsertTooltip": {}, + "aboutLicensesShowAllButtonLabel": "Hiển thị tất cả giấy phép", + "@aboutLicensesShowAllButtonLabel": {}, + "settingsSubtitleThemeBackgroundOpacity": "Độ mờ nền", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsStorageAccessTile": "Quyền truy cập bộ nhớ", + "@settingsStorageAccessTile": {}, + "settingsThemeBrightnessTile": "Chủ đề", + "@settingsThemeBrightnessTile": {}, + "settingsViewerQuickActionEmpty": "Không có nút nào", + "@settingsViewerQuickActionEmpty": {}, + "viewerInfoBackToViewerTooltip": "Trở lại chế độ xem", + "@viewerInfoBackToViewerTooltip": {}, + "settingsSystemDefault": "Mặc định hệ thống", + "@settingsSystemDefault": {}, + "settingsViewerSlideshowTile": "Trình chiếu", + "@settingsViewerSlideshowTile": {}, + "settingsCollectionTile": "Bộ sưu tập", + "@settingsCollectionTile": {}, + "settingsSubtitleThemeTextOpacity": "Độ mờ văn bản", + "@settingsSubtitleThemeTextOpacity": {}, + "sortOrderNewestFirst": "Mới nhất trước", + "@sortOrderNewestFirst": {}, + "settingsViewerShowRatingTags": "Hiển thị thẻ và xếp hạng", + "@settingsViewerShowRatingTags": {}, + "drawerSettingsButton": "Cài đặt", + "@drawerSettingsButton": {}, + "drawerCollectionRaws": "Ảnh RAW", + "@drawerCollectionRaws": {}, + "settingsViewerEnableOverlayBlurEffect": "Hiệu ứng làm mờ", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsMotionPhotoAutoPlay": "Tự động phát Ảnh động", + "@settingsMotionPhotoAutoPlay": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "settingsVideoControlsTile": "Điều khiển", + "@settingsVideoControlsTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Phát lại video", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsSubtitleThemeShowOutline": "Hiển thị viền và bóng mờ", + "@settingsSubtitleThemeShowOutline": {}, + "settingsNavigationDrawerTabAlbums": "Bộ sưu tập", + "@settingsNavigationDrawerTabAlbums": {}, + "subtitlePositionBottom": "Dưới", + "@subtitlePositionBottom": {}, + "timeDays": "{count, plural, other{{count} ngày}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "videoResumeButtonLabel": "Phát lại", + "@videoResumeButtonLabel": {}, + "mapEmptyRegion": "Không có ảnh nào tại khu vực này", + "@mapEmptyRegion": {}, + "settingsVideoEnablePip": "Ảnh trong ảnh", + "@settingsVideoEnablePip": {}, + "settingsThemeBrightnessDialogTitle": "Chủ đề", + "@settingsThemeBrightnessDialogTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Các bổ sung Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "sortOrderHighestFirst": "Cao nhất trước", + "@sortOrderHighestFirst": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Thư viện Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "settingsViewerQuickActionsTile": "Hành động nhanh", + "@settingsViewerQuickActionsTile": {}, + "newVaultDialogTitle": "Két sắt mới", + "@newVaultDialogTitle": {}, + "timeMinutes": "{count, plural, other{{count} phút}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "albumTierSpecial": "Phổ biến", + "@albumTierSpecial": {}, + "settingsSubtitleThemePageTitle": "Phụ đề", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeTextPositionTile": "Vị trí văn bản", + "@settingsSubtitleThemeTextPositionTile": {}, + "tagEditorSectionPlaceholders": "Trình giữ chổ", + "@tagEditorSectionPlaceholders": {}, + "viewerInfoLabelAddress": "Địa chỉ", + "@viewerInfoLabelAddress": {}, + "settingsVideoBackgroundModeDialogTitle": "Chế độ nền", + "@settingsVideoBackgroundModeDialogTitle": {}, + "binPageTitle": "Thùng rác", + "@binPageTitle": {}, + "tagPlaceholderState": "Bang/Tỉnh thành", + "@tagPlaceholderState": {}, + "sortByAlbumFileName": "Theo bộ sưu tập & tên tệp", + "@sortByAlbumFileName": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Xóa các Album này và các mục bên trong} other{Xóa các Album này với {count} mục bên trong?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSubtitleThemeTextSize": "Kích thước văn bản", + "@settingsSubtitleThemeTextSize": {}, + "aboutLicensesSectionTitle": "Giấy phép mã nguồn mở", + "@aboutLicensesSectionTitle": {}, + "menuActionStats": "Thống kê", + "@menuActionStats": {}, + "settingsCollectionQuickActionTabBrowsing": "Duyệt", + "@settingsCollectionQuickActionTabBrowsing": {}, + "videoLoopModeShortOnly": "Chỉ video ngắn", + "@videoLoopModeShortOnly": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Xóa bộ sưu tập này và các mục bên trong} other{Xóa bộ sưu tập này với {count} mục bên trong?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsThemeColorHighlights": "Màu sắc nổi bật", + "@settingsThemeColorHighlights": {}, + "appPickDialogTitle": "Chọn ứng dụng", + "@appPickDialogTitle": {}, + "viewerInfoSearchSuggestionRights": "Luật", + "@viewerInfoSearchSuggestionRights": {}, + "mapPointNorthUpTooltip": "Hướng về phía bắc", + "@mapPointNorthUpTooltip": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{Lỗi khi xóa tệp} other{Lỗi khi xóa {count} tệp}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsVideoButtonsTile": "Nút", + "@settingsVideoButtonsTile": {}, + "settingsSubtitleThemeSample": "Đây là ví dụ.", + "@settingsSubtitleThemeSample": {}, + "albumPickPageTitleMove": "Di chuyển đến bộ sưu tập", + "@albumPickPageTitleMove": {}, + "settingsSaveSearchHistory": "Lưu lịch sử tìm kiếm", + "@settingsSaveSearchHistory": {}, + "settingsViewerShowHistogram": "Hiển thị biểu đồ", + "@settingsViewerShowHistogram": {}, + "aboutBugCopyInfoButton": "Sao chép", + "@aboutBugCopyInfoButton": {}, + "mapStyleGoogleHybrid": "Google Maps (Hỗn hợp)", + "@mapStyleGoogleHybrid": {}, + "wallpaperTargetHomeLock": "Màn hình chính và màn hình khóa", + "@wallpaperTargetHomeLock": {}, + "coverDialogTabCover": "Ảnh bìa", + "@coverDialogTabCover": {}, + "settingsVideoPlaybackTile": "Phát lại", + "@settingsVideoPlaybackTile": {}, + "exportEntryDialogWriteMetadata": "Viết metadata", + "@exportEntryDialogWriteMetadata": {}, + "aboutDataUsageClearCache": "Xóa bộ nhớ đệm", + "@aboutDataUsageClearCache": {}, + "entryActionCast": "Truyền", + "@entryActionCast": {}, + "castDialogTitle": "Thiết bị truyền", + "@castDialogTitle": {}, + "settingsThumbnailShowHdrIcon": "Hiển thị biểu tượng HDR", + "@settingsThumbnailShowHdrIcon": {}, + "collectionActionSetHome": "Đặt làm nhà", + "@collectionActionSetHome": {}, + "stopTooltip": "Dừng", + "@stopTooltip": {}, + "videoActionABRepeat": "Lặp lại A-B", + "@videoActionABRepeat": {}, + "videoRepeatActionSetEnd": "Đặt kết thúc", + "@videoRepeatActionSetEnd": {}, + "videoRepeatActionSetStart": "Đặt bắt đầu", + "@videoRepeatActionSetStart": {}, + "renameProcessorHash": "Băm", + "@renameProcessorHash": {}, + "settingsForceWesternArabicNumeralsTile": "Buộc chữ số Ả Rập", + "@settingsForceWesternArabicNumeralsTile": {}, + "chipActionShowCollection": "Hiển thị trong Bộ sưu tập", + "@chipActionShowCollection": {}, + "selectStorageVolumeDialogTitle": "Chọn bộ nhớ", + "@selectStorageVolumeDialogTitle": {}, + "explorerActionSelectStorageVolume": "Chọn dung lượng", + "@explorerActionSelectStorageVolume": {}, + "chipActionGoToExplorerPage": "Hiển thị ở Explorer", + "@chipActionGoToExplorerPage": {}, + "explorerPageTitle": "Khám phá", + "@explorerPageTitle": {}, + "mapAttributionOsmData": "Dữ liệu bản đồ © [OpenStreetMap](https://www.openstreetmap.org/copyright) đóng góp", + "@mapAttributionOsmData": {}, + "setHomeCustom": "Tùy chỉnh", + "@setHomeCustom": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Cung cấp bởi [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "mapAttributionOsmHot": "Cung cấp bởi [HOT](https://www.hotosm.org/) • Lưu trữ bởi [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "Cung cấp bởi [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "sortByDuration": "Theo thời lượng", + "@sortByDuration": {}, + "sortOrderShortestFirst": "Ngắn nhất trước", + "@sortOrderShortestFirst": {}, + "sortOrderLongestFirst": "Dài nhất trước", + "@sortOrderLongestFirst": {}, + "mapAttributionOsmLiberty": "Cung cấp bởi [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Được lưu trữ bởi [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "videoActionShowPreviousFrame": "Hiển thị khung hình trước đó", + "@videoActionShowPreviousFrame": {}, + "chipActionRemove": "Loại bỏ", + "@chipActionRemove": {}, + "albumTierDynamic": "Động", + "@albumTierDynamic": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "Album đã tồn tại", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "dynamicAlbumAlreadyExists": "Album động đã tồn tại", + "@dynamicAlbumAlreadyExists": {}, + "collectionActionAddDynamicAlbum": "Thêm album động", + "@collectionActionAddDynamicAlbum": {}, + "appExportDynamicAlbums": "Album động", + "@appExportDynamicAlbums": {}, + "videoActionShowNextFrame": "Hiển thị khung hình tiếp theo", + "@videoActionShowNextFrame": {}, + "newDynamicAlbumDialogTitle": "Album động mới", + "@newDynamicAlbumDialogTitle": {} +} diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb new file mode 100644 index 0000000..af16a72 --- /dev/null +++ b/lib/l10n/app_zh.arb @@ -0,0 +1,733 @@ +{ + "appName": "Aves", + "welcomeMessage": "欢迎使用 Aves", + "welcomeOptional": "可选", + "welcomeTermsToggle": "我同意这些使用条款和条件", + "itemCount": "{count, plural, other{{count} 项}}", + "timeSeconds": "{count, plural, other{{count} 秒}}", + "timeMinutes": "{count, plural, other{{count} 分}}", + "timeDays": "{count, plural, other{{count} 天}}", + "focalLength": "{length} mm", + "applyButtonLabel": "应用", + "deleteButtonLabel": "删除", + "nextButtonLabel": "下一步", + "showButtonLabel": "显示", + "hideButtonLabel": "隐藏", + "continueButtonLabel": "继续", + "cancelTooltip": "取消", + "changeTooltip": "更改", + "clearTooltip": "清除", + "previousTooltip": "上一组", + "nextTooltip": "下一组", + "showTooltip": "显示", + "hideTooltip": "隐藏", + "actionRemove": "移除", + "resetTooltip": "重置", + "saveTooltip": "保存", + "pickTooltip": "挑选", + "doubleBackExitMessage": "再按一次退出", + "doNotAskAgain": "不再询问", + "sourceStateLoading": "加载中", + "sourceStateCataloguing": "正在进行编目", + "sourceStateLocatingCountries": "正在定位地区", + "sourceStateLocatingPlaces": "正在定位地点", + "chipActionDelete": "删除", + "chipActionGoToAlbumPage": "在相册中显示", + "chipActionGoToCountryPage": "在地区中显示", + "chipActionGoToTagPage": "在标签中显示", + "chipActionFilterOut": "筛除", + "chipActionFilterIn": "筛选", + "chipActionHide": "隐藏", + "chipActionPin": "置顶", + "chipActionUnpin": "取消置顶", + "chipActionRename": "重命名", + "chipActionSetCover": "设置封面", + "chipActionCreateAlbum": "创建相册", + "entryActionCopyToClipboard": "复制到剪贴板", + "entryActionDelete": "删除", + "entryActionConvert": "转换", + "entryActionExport": "导出", + "entryActionInfo": "信息", + "entryActionRename": "重命名", + "entryActionRestore": "恢复", + "entryActionRotateCCW": "逆时针旋转", + "entryActionRotateCW": "顺时针旋转", + "entryActionFlip": "水平翻转", + "entryActionPrint": "打印", + "entryActionShare": "分享", + "entryActionViewSource": "查看源码", + "entryActionShowGeoTiffOnMap": "显示为地图叠加层", + "entryActionConvertMotionPhotoToStillImage": "转换为静态图像", + "entryActionViewMotionPhotoVideo": "打开视频", + "entryActionEdit": "编辑", + "entryActionOpen": "打开方式", + "entryActionSetAs": "设置为", + "entryActionOpenMap": "在地图应用中显示", + "entryActionRotateScreen": "旋转屏幕", + "entryActionAddFavourite": "加为收藏", + "entryActionRemoveFavourite": "取消收藏", + "videoActionCaptureFrame": "捕获帧", + "videoActionMute": "静音", + "videoActionUnmute": "取消静音", + "videoActionPause": "暂停", + "videoActionPlay": "播放", + "videoActionReplay10": "前进 10 秒", + "videoActionSkip10": "后退 10 秒", + "videoActionSelectStreams": "选择音轨", + "videoActionSetSpeed": "播放速度", + "viewerActionSettings": "设置", + "slideshowActionResume": "继续", + "slideshowActionShowInCollection": "在媒体集中显示", + "entryInfoActionEditDate": "编辑日期和时间", + "entryInfoActionEditLocation": "编辑位置", + "entryInfoActionEditTitleDescription": "编辑标题和描述", + "entryInfoActionEditRating": "修改评分", + "entryInfoActionEditTags": "编辑标签", + "entryInfoActionRemoveMetadata": "移除元数据", + "filterBinLabel": "回收站", + "filterFavouriteLabel": "收藏夹", + "filterNoDateLabel": "未注明日期", + "filterNoLocationLabel": "无定位", + "filterNoRatingLabel": "未评分", + "filterNoTagLabel": "无标签", + "filterNoTitleLabel": "无标题", + "filterOnThisDayLabel": "选择日期", + "filterRecentlyAddedLabel": "最近添加", + "filterRatingRejectedLabel": "拒绝评分", + "filterTypeAnimatedLabel": "动图", + "filterTypeMotionPhotoLabel": "动态照片", + "filterTypePanoramaLabel": "全景图", + "filterTypeRawLabel": "Raw", + "filterTypeSphericalVideoLabel": "360° 视频", + "filterTypeGeotiffLabel": "GeoTIFF", + "filterMimeImageLabel": "图像", + "filterMimeVideoLabel": "视频", + "coordinateFormatDms": "度分秒", + "coordinateFormatDecimal": "十进制度", + "coordinateDms": "{coordinate} {direction}", + "coordinateDmsNorth": "N", + "coordinateDmsSouth": "S", + "coordinateDmsEast": "E", + "coordinateDmsWest": "W", + "unitSystemMetric": "公制", + "unitSystemImperial": "英制", + "videoLoopModeNever": "从不", + "videoLoopModeShortOnly": "仅短视频", + "videoLoopModeAlways": "始终", + "videoControlsPlayOutside": "用其他播放器打开", + "mapStyleGoogleNormal": "Google 地图", + "mapStyleGoogleHybrid": "Google 地图 (卫星图像)", + "mapStyleGoogleTerrain": "Google 地图 (地形)", + "mapStyleOsmHot": "Humanitarian OSM", + "mapStyleStamenWatercolor": "Stamen Watercolor", + "nameConflictStrategyRename": "重命名", + "nameConflictStrategyReplace": "替换", + "nameConflictStrategySkip": "跳过", + "keepScreenOnNever": "从不", + "keepScreenOnViewerOnly": "仅查看器页面", + "keepScreenOnAlways": "始终", + "accessibilityAnimationsRemove": "禁用屏幕效果", + "accessibilityAnimationsKeep": "保留屏幕效果", + "displayRefreshRatePreferHighest": "最高刷新率", + "displayRefreshRatePreferLowest": "最低刷新率", + "videoPlaybackSkip": "跳过", + "videoPlaybackMuted": "静音播放", + "videoPlaybackWithSound": "有声播放", + "themeBrightnessLight": "浅色", + "themeBrightnessDark": "深色", + "themeBrightnessBlack": "黑色", + "viewerTransitionSlide": "滑动", + "viewerTransitionParallax": "视差滚动", + "viewerTransitionFade": "淡入淡出", + "viewerTransitionZoomIn": "放大", + "viewerTransitionNone": "无", + "wallpaperTargetHome": "主屏幕", + "wallpaperTargetLock": "锁屏界面", + "wallpaperTargetHomeLock": "主屏幕 + 锁屏界面", + "widgetOpenPageHome": "打开主页", + "widgetOpenPageViewer": "打开查看器", + "albumTierNew": "新的", + "albumTierPinned": "钉选", + "albumTierSpecial": "普通", + "albumTierApps": "应用", + "albumTierRegular": "其他", + "storageVolumeDescriptionFallbackPrimary": "内部存储", + "storageVolumeDescriptionFallbackNonPrimary": "SD 卡", + "rootDirectoryDescription": "根目录", + "otherDirectoryDescription": "“{name}” 目录", + "storageAccessDialogMessage": "请在下一屏幕中选择“{volume}”的{directory},以授予本应用对其的访问权限", + "restrictedAccessDialogMessage": "本应用无权修改“{volume}”的{directory}中的文件\n\n请使用预装的文件管理器或图库应用将项目移至其他目录", + "notEnoughSpaceDialogMessage": "此操作需要“{volume}”上具有 {neededSize} 可用空间才能完成,实际仅剩 {freeSize}", + "missingSystemFilePickerDialogMessage": "系统文件选择器缺失或被禁用,请将其启用后再试", + "unsupportedTypeDialogMessage": "{count, plural, other{此操作不支持以下类型的项目: {types}.}}", + "nameConflictDialogSingleSourceMessage": "目标文件夹中具有同名文件", + "nameConflictDialogMultipleSourceMessage": "存在同名文件", + "addShortcutDialogLabel": "快捷方式标签", + "addShortcutButtonLabel": "添加", + "noMatchingAppDialogMessage": "无对应的处理程序", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{将此项移至回收站?} other{将这 {count} 项移至回收站?}}", + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{删除此项?} other{删除这 {count} 项?}}", + "moveUndatedConfirmationDialogMessage": "继续之前保存项目日期?", + "moveUndatedConfirmationDialogSetDate": "保存日期", + "videoResumeDialogMessage": "想接着在 {time} 继续播放吗?", + "videoStartOverButtonLabel": "从头播放", + "videoResumeButtonLabel": "继续", + "setCoverDialogLatest": "最新项", + "setCoverDialogAuto": "自动", + "setCoverDialogCustom": "自定义", + "hideFilterConfirmationDialogMessage": "匹配的照片和视频将从收藏中隐藏,你可以通过“隐私”设置中再次显示它们\n\n确定要将其隐藏吗?", + "newAlbumDialogTitle": "新相册", + "newAlbumDialogNameLabel": "相册名称", + "newAlbumDialogNameLabelAlreadyExistsHelper": "目录已存在", + "newAlbumDialogStorageLabel": "存储:", + "renameAlbumDialogLabel": "新名称", + "renameAlbumDialogLabelAlreadyExistsHelper": "目录已存在", + "renameEntrySetPageTitle": "重命名", + "renameEntrySetPagePatternFieldLabel": "命名模式", + "renameEntrySetPageInsertTooltip": "插入字段", + "renameEntrySetPagePreviewSectionTitle": "预览", + "renameProcessorCounter": "计数器", + "renameProcessorName": "名称", + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{删除此相册及其中的一个项目?} other{删除此相册及其中的 {count} 个项目?}}", + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{删除这些相册及其中的一个项目?} other{删除这些相册及其中的 {count} 个项目?}}", + "exportEntryDialogFormat": "格式:", + "exportEntryDialogWidth": "宽度", + "exportEntryDialogHeight": "高度", + "renameEntryDialogLabel": "新名称", + "editEntryDialogTargetFieldsHeader": "待修改的字段", + "editEntryDateDialogTitle": "日期和时间", + "editEntryDateDialogSetCustom": "设置自定义日期", + "editEntryDateDialogCopyField": "复制自其他日期", + "editEntryDialogCopyFromItem": "复制自其他项目", + "editEntryDateDialogExtractFromTitle": "从标题提取", + "editEntryDateDialogShift": "转移", + "editEntryDateDialogSourceFileModifiedDate": "文件修改日期", + "durationDialogHours": "时", + "durationDialogMinutes": "分", + "editEntryLocationDialogTitle": "位置", + "editEntryLocationDialogChooseOnMap": "从地图上选择", + "editEntryLocationDialogLatitude": "纬度", + "editEntryLocationDialogLongitude": "经度", + "locationPickerUseThisLocationButton": "使用此位置", + "editEntryRatingDialogTitle": "评分", + "removeEntryMetadataDialogTitle": "元数据移除工具", + "removeEntryMetadataDialogMore": "更多", + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "播放动态照片中的视频需要 XMP\n\n确定要删除它吗?", + "genericDangerWarningDialogMessage": "你确定吗?", + "videoSpeedDialogLabel": "播放速度", + "videoStreamSelectionDialogVideo": "视频", + "videoStreamSelectionDialogAudio": "音频", + "videoStreamSelectionDialogText": "字幕", + "videoStreamSelectionDialogOff": "关", + "videoStreamSelectionDialogTrack": "音轨", + "videoStreamSelectionDialogNoSelection": "无其他音轨", + "genericSuccessFeedback": "完成!", + "genericFailureFeedback": "失败", + "menuActionConfigureView": "查看", + "menuActionSelect": "选择", + "menuActionSelectAll": "全选", + "menuActionSelectNone": "全不选", + "menuActionMap": "地图", + "menuActionSlideshow": "幻灯片", + "menuActionStats": "统计", + "viewDialogSortSectionTitle": "排序", + "viewDialogGroupSectionTitle": "分区", + "viewDialogLayoutSectionTitle": "布局", + "viewDialogReverseSortOrder": "反向排序", + "tileLayoutMosaic": "马赛克", + "tileLayoutGrid": "网格", + "tileLayoutList": "列表", + "coverDialogTabCover": "封面", + "coverDialogTabApp": "应用", + "coverDialogTabColor": "颜色", + "appPickDialogTitle": "选择应用", + "appPickDialogNone": "无", + "aboutPageTitle": "关于", + "aboutLinkLicense": "许可协议", + "aboutLinkPolicy": "隐私政策", + "aboutBugSectionTitle": "报告错误", + "aboutBugSaveLogInstruction": "将应用日志保存到文件", + "aboutBugCopyInfoInstruction": "复制系统信息", + "aboutBugCopyInfoButton": "复制", + "aboutBugReportInstruction": "在 GitHub 上报告日志和系统信息", + "aboutBugReportButton": "报告", + "aboutCreditsSectionTitle": "鸣谢", + "aboutCreditsWorldAtlas1": "本应用使用的 TopoJSON 文件来自", + "aboutCreditsWorldAtlas2": "符合 ISC 许可协议", + "aboutTranslatorsSectionTitle": "翻译人员", + "aboutLicensesSectionTitle": "开源许可协议", + "aboutLicensesBanner": "本应用使用以下开源软件包和库。", + "aboutLicensesShowAllButtonLabel": "显示所有许可协议", + "policyPageTitle": "隐私政策", + "collectionPageTitle": "媒体集", + "collectionPickPageTitle": "挑选", + "collectionSelectPageTitle": "选择项目", + "collectionActionShowTitleSearch": "显示标题搜索框", + "collectionActionHideTitleSearch": "隐藏标题搜索框", + "collectionActionAddShortcut": "添加快捷方式", + "collectionActionEmptyBin": "清空回收站", + "collectionActionCopy": "复制到相册", + "collectionActionMove": "移至相册", + "collectionActionRescan": "重新扫描", + "collectionActionEdit": "编辑", + "collectionSearchTitlesHintText": "搜索标题", + "collectionGroupAlbum": "按相册", + "collectionGroupMonth": "按月份", + "collectionGroupDay": "按天", + "sectionUnknown": "未知", + "dateToday": "今天", + "dateYesterday": "昨天", + "dateThisMonth": "本月", + "collectionDeleteFailureFeedback": "{count, plural, other{{count} 项删除失败}}", + "collectionCopyFailureFeedback": "{count, plural, other{{count} 项复制失败}}", + "collectionMoveFailureFeedback": "{count, plural, other{{count} 项移动失败}}", + "collectionRenameFailureFeedback": "{count, plural, other{{count} 项重命名失败}}", + "collectionEditFailureFeedback": "{count, plural, other{{count} 项编辑失败}}", + "collectionExportFailureFeedback": "{count, plural, other{{count} 页导出失败}}", + "collectionCopySuccessFeedback": "{count, plural, other{已复制 {count} 项}}", + "collectionMoveSuccessFeedback": "{count, plural, other{已移动 {count} 项}}", + "collectionRenameSuccessFeedback": "{count, plural, other{已重命名 {count} 项}}", + "collectionEditSuccessFeedback": "{count, plural, other{已编辑 {count} 项}}", + "collectionEmptyFavourites": "无收藏项", + "collectionEmptyVideos": "无视频", + "collectionEmptyImages": "无图像", + "collectionEmptyGrantAccessButtonLabel": "授予访问权限", + "collectionSelectSectionTooltip": "选择部分", + "collectionDeselectSectionTooltip": "取消选择部分", + "drawerAboutButton": "关于", + "drawerSettingsButton": "设置", + "drawerCollectionAll": "所有媒体集", + "drawerCollectionFavourites": "收藏夹", + "drawerCollectionImages": "图像", + "drawerCollectionVideos": "视频", + "drawerCollectionAnimated": "动图", + "drawerCollectionMotionPhotos": "动态照片", + "drawerCollectionPanoramas": "全景图", + "drawerCollectionRaws": "Raw 照片", + "drawerCollectionSphericalVideos": "360° 视频", + "drawerAlbumPage": "相册", + "drawerCountryPage": "地区", + "drawerTagPage": "标签", + "sortByDate": "按日期", + "sortByName": "按名称", + "sortByItemCount": "按数量", + "sortBySize": "按大小", + "sortByAlbumFileName": "按相册和项目标题", + "sortByRating": "按评分", + "sortOrderNewestFirst": "降序", + "sortOrderOldestFirst": "升序", + "sortOrderAtoZ": "A — Z", + "sortOrderZtoA": "Z — A", + "sortOrderHighestFirst": "由高到低", + "sortOrderLowestFirst": "由低到高", + "sortOrderLargestFirst": "由大到小", + "sortOrderSmallestFirst": "由小到大", + "albumGroupTier": "按层级", + "albumGroupType": "按类型", + "albumGroupVolume": "按存储卷", + "albumMimeTypeMixed": "混合", + "albumPickPageTitleCopy": "复制到相册", + "albumPickPageTitleExport": "导出到相册", + "albumPickPageTitleMove": "移至相册", + "albumPickPageTitlePick": "选择相册", + "albumCamera": "相机", + "albumDownload": "下载", + "albumScreenshots": "截图", + "albumScreenRecordings": "屏幕录制", + "albumVideoCaptures": "视频捕获", + "albumPageTitle": "相册", + "albumEmpty": "无相册", + "createAlbumButtonLabel": "创建", + "newFilterBanner": "新的", + "countryPageTitle": "地区", + "countryEmpty": "无地区", + "tagPageTitle": "标签", + "tagEmpty": "无标签", + "binPageTitle": "回收站", + "searchCollectionFieldHint": "搜索媒体集", + "searchRecentSectionTitle": "最近", + "searchDateSectionTitle": "日期", + "searchAlbumsSectionTitle": "相册", + "searchCountriesSectionTitle": "地区", + "searchPlacesSectionTitle": "地点", + "searchTagsSectionTitle": "标签", + "searchRatingSectionTitle": "评分", + "searchMetadataSectionTitle": "元数据", + "settingsPageTitle": "设置", + "settingsSystemDefault": "系统默认", + "settingsDefault": "默认", + "settingsDisabled": "禁用", + "settingsSearchFieldLabel": "搜索设置", + "settingsSearchEmpty": "无匹配设置项", + "settingsActionExport": "导出", + "settingsActionExportDialogTitle": "导出", + "settingsActionImport": "导入", + "settingsActionImportDialogTitle": "导入", + "appExportCovers": "封面", + "appExportFavourites": "收藏夹", + "appExportSettings": "设置", + "settingsNavigationSectionTitle": "导航", + "settingsHomeTile": "主页", + "settingsHomeDialogTitle": "主页", + "settingsKeepScreenOnTile": "保持亮屏", + "settingsKeepScreenOnDialogTitle": "保持亮屏", + "settingsDoubleBackExit": "按两次返回键退出", + "settingsConfirmationTile": "确认对话框", + "settingsConfirmationDialogTitle": "确认对话框", + "settingsConfirmationBeforeDeleteItems": "永久删除项目之前询问", + "settingsConfirmationBeforeMoveToBinItems": "移至回收站之前询问", + "settingsConfirmationBeforeMoveUndatedItems": "移动未注明日期的项目之前询问", + "settingsConfirmationAfterMoveToBinItems": "移至回收站后显示消息", + "settingsNavigationDrawerTile": "导航栏菜单", + "settingsNavigationDrawerEditorPageTitle": "导航栏菜单", + "settingsNavigationDrawerBanner": "长按移动和重新排序菜单项", + "settingsNavigationDrawerTabTypes": "类型", + "settingsNavigationDrawerTabAlbums": "相册", + "settingsNavigationDrawerTabPages": "页面", + "settingsNavigationDrawerAddAlbum": "添加相册", + "settingsThumbnailSectionTitle": "缩略图", + "settingsThumbnailOverlayTile": "叠加层", + "settingsThumbnailOverlayPageTitle": "叠加层", + "settingsThumbnailShowFavouriteIcon": "显示收藏图标", + "settingsThumbnailShowTagIcon": "显示标签图标", + "settingsThumbnailShowLocationIcon": "显示位置图标", + "settingsThumbnailShowMotionPhotoIcon": "显示动态照片图标", + "settingsThumbnailShowRating": "显示评分", + "settingsThumbnailShowRawIcon": "显示 raw 图标", + "settingsThumbnailShowVideoDuration": "显示视频时长", + "settingsCollectionQuickActionsTile": "快速操作", + "settingsCollectionQuickActionEditorPageTitle": "快速操作", + "settingsCollectionQuickActionTabBrowsing": "浏览", + "settingsCollectionQuickActionTabSelecting": "选择", + "settingsCollectionBrowsingQuickActionEditorBanner": "按住并拖拽可移动按钮并选择浏览项目时显示的操作", + "settingsCollectionSelectionQuickActionEditorBanner": "按住并拖拽可移动按钮并选择选择项目时显示的操作", + "settingsViewerSectionTitle": "查看器", + "settingsViewerGestureSideTapNext": "轻触屏幕边缘显示上/下一个项目", + "settingsViewerUseCutout": "使用刘海/挖孔区域", + "settingsViewerMaximumBrightness": "最大亮度", + "settingsMotionPhotoAutoPlay": "自动播放动态照片", + "settingsImageBackground": "图像背景", + "settingsViewerQuickActionsTile": "快速操作", + "settingsViewerQuickActionEditorPageTitle": "快速操作", + "settingsViewerQuickActionEditorBanner": "按住并拖拽可移动按钮并选择查看器中显示的操作", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "显示的按钮", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "可用按钮", + "settingsViewerQuickActionEmpty": "无按钮", + "settingsViewerOverlayTile": "叠加层", + "settingsViewerOverlayPageTitle": "叠加层", + "settingsViewerShowOverlayOnOpening": "打开时显示", + "settingsViewerShowMinimap": "显示小地图", + "settingsViewerShowInformation": "显示信息", + "settingsViewerShowInformationSubtitle": "显示标题、日期、位置等", + "settingsViewerShowShootingDetails": "显示拍摄详情", + "settingsViewerShowOverlayThumbnails": "显示缩略图", + "settingsViewerEnableOverlayBlurEffect": "模糊特效", + "settingsViewerSlideshowTile": "幻灯片", + "settingsViewerSlideshowPageTitle": "幻灯片", + "settingsSlideshowRepeat": "重复", + "settingsSlideshowShuffle": "随机播放", + "settingsSlideshowFillScreen": "填充屏幕", + "settingsSlideshowAnimatedZoomEffect": "动画缩放效果", + "settingsSlideshowTransitionTile": "过渡动画", + "settingsSlideshowIntervalTile": "时间间隔", + "settingsSlideshowVideoPlaybackTile": "视频播放", + "settingsSlideshowVideoPlaybackDialogTitle": "视频播放", + "settingsVideoPageTitle": "视频设置", + "settingsVideoSectionTitle": "视频", + "settingsVideoShowVideos": "显示视频", + "settingsVideoEnableHardwareAcceleration": "硬件加速", + "settingsVideoAutoPlay": "自动播放", + "settingsVideoLoopModeTile": "循环模式", + "settingsVideoLoopModeDialogTitle": "循环模式", + "settingsSubtitleThemeTile": "字幕", + "settingsSubtitleThemePageTitle": "字幕", + "settingsSubtitleThemeSample": "这是一个字幕示例。", + "settingsSubtitleThemeTextAlignmentTile": "对齐方式", + "settingsSubtitleThemeTextAlignmentDialogTitle": "对齐方式", + "settingsSubtitleThemeTextSize": "文本大小", + "settingsSubtitleThemeShowOutline": "显示轮廓和阴影", + "settingsSubtitleThemeTextColor": "文本颜色", + "settingsSubtitleThemeTextOpacity": "文本透明度", + "settingsSubtitleThemeBackgroundColor": "背景色", + "settingsSubtitleThemeBackgroundOpacity": "背景透明度", + "settingsSubtitleThemeTextAlignmentLeft": "居左", + "settingsSubtitleThemeTextAlignmentCenter": "居中", + "settingsSubtitleThemeTextAlignmentRight": "居右", + "settingsVideoControlsTile": "控件", + "settingsVideoControlsPageTitle": "控件", + "settingsVideoButtonsTile": "按钮", + "settingsVideoGestureDoubleTapTogglePlay": "双击播放/暂停", + "settingsVideoGestureSideDoubleTapSeek": "双击屏幕边缘步进/步退", + "settingsPrivacySectionTitle": "隐私", + "settingsAllowInstalledAppAccess": "允许访问应用清单", + "settingsAllowInstalledAppAccessSubtitle": "用于改善相册显示结果", + "settingsAllowErrorReporting": "允许匿名错误报告", + "settingsSaveSearchHistory": "保存搜索历史记录", + "settingsEnableBin": "启用回收站", + "settingsEnableBinSubtitle": "将删除项保留 30 天", + "settingsHiddenItemsTile": "隐藏项", + "settingsHiddenItemsPageTitle": "隐藏项", + "settingsHiddenFiltersBanner": "匹配隐藏过滤器的照片和视频将不会出现在你的媒体集中", + "settingsHiddenFiltersEmpty": "无隐藏过滤器", + "settingsStorageAccessTile": "存储访问", + "settingsStorageAccessPageTitle": "存储访问", + "settingsStorageAccessBanner": "某些目录需要具有明确的访问权限才能修改其中的文件,你可以在此处查看你之前已授予访问权限的目录", + "settingsStorageAccessEmpty": "尚未授予访问权限", + "settingsStorageAccessRevokeTooltip": "撤消", + "settingsAccessibilitySectionTitle": "无障碍", + "settingsRemoveAnimationsTile": "移除动画", + "settingsRemoveAnimationsDialogTitle": "移除动画", + "settingsTimeToTakeActionTile": "生效时间", + "settingsDisplaySectionTitle": "显示", + "settingsThemeBrightnessTile": "主题", + "settingsThemeBrightnessDialogTitle": "主题", + "settingsThemeColorHighlights": "色彩强调", + "settingsThemeEnableDynamicColor": "动态色彩", + "settingsDisplayRefreshRateModeTile": "显示刷新率", + "settingsDisplayRefreshRateModeDialogTitle": "刷新率", + "settingsLanguageSectionTitle": "语言和格式", + "settingsLanguageTile": "界面语言", + "settingsLanguagePageTitle": "界面语言", + "settingsCoordinateFormatTile": "坐标格式", + "settingsCoordinateFormatDialogTitle": "坐标格式", + "settingsUnitSystemTile": "单位", + "settingsUnitSystemDialogTitle": "单位", + "settingsScreenSaverPageTitle": "屏保", + "settingsWidgetPageTitle": "相框", + "settingsWidgetShowOutline": "轮廓", + "settingsWidgetOpenPage": "轻触小部件时", + "settingsCollectionTile": "媒体集", + "statsPageTitle": "统计", + "statsWithGps": "{count, plural, other{{count} 项带位置信息}}", + "statsTopCountriesSectionTitle": "热门地区", + "statsTopPlacesSectionTitle": "热门地点", + "statsTopTagsSectionTitle": "热门标签", + "statsTopAlbumsSectionTitle": "热门相册", + "viewerOpenPanoramaButtonLabel": "打开全景", + "viewerSetWallpaperButtonLabel": "设置壁纸", + "viewerErrorUnknown": "糟糕!", + "viewerErrorDoesNotExist": "该文件不存在", + "viewerInfoPageTitle": "信息", + "viewerInfoBackToViewerTooltip": "返回查看器", + "viewerInfoUnknown": "未知", + "viewerInfoLabelDescription": "描述", + "viewerInfoLabelTitle": "标题", + "viewerInfoLabelDate": "日期", + "viewerInfoLabelResolution": "分辨率", + "viewerInfoLabelSize": "大小", + "viewerInfoLabelUri": "URI", + "viewerInfoLabelPath": "路径", + "viewerInfoLabelDuration": "时长", + "viewerInfoLabelOwner": "所有者", + "viewerInfoLabelCoordinates": "坐标", + "viewerInfoLabelAddress": "地址", + "mapStyleDialogTitle": "地图样式", + "mapStyleTooltip": "选择地图样式", + "mapZoomInTooltip": "放大", + "mapZoomOutTooltip": "缩小", + "mapPointNorthUpTooltip": "上北下南", + "mapAttributionOsmHot": "绘制于 [HOT](https://www.hotosm.org/) • 主办方 [OSM France](https://openstreetmap.fr/)", + "mapAttributionStamen": "绘制于 [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "openMapPageTooltip": "在地图页面上查看", + "mapEmptyRegion": "该地区没有图片", + "viewerInfoOpenEmbeddedFailureFeedback": "提取嵌入数据失败", + "viewerInfoOpenLinkText": "打开", + "viewerInfoViewXmlLinkText": "查看 XML", + "viewerInfoSearchFieldLabel": "搜索元数据", + "viewerInfoSearchEmpty": "无匹配键", + "viewerInfoSearchSuggestionDate": "日期和时间", + "viewerInfoSearchSuggestionDescription": "描述", + "viewerInfoSearchSuggestionDimensions": "尺寸", + "viewerInfoSearchSuggestionResolution": "分辨率", + "viewerInfoSearchSuggestionRights": "所有权", + "wallpaperUseScrollEffect": "在主屏幕上使用滚动效果", + "tagEditorPageTitle": "编辑标签", + "tagEditorPageNewTagFieldLabel": "新标签", + "tagEditorPageAddTagTooltip": "添加标签", + "tagEditorSectionRecent": "最近", + "panoramaEnableSensorControl": "启用传感器控制", + "panoramaDisableSensorControl": "禁用传感器控制", + "sourceViewerPageTitle": "源码", + "widgetOpenPageCollection": "打开媒体集", + "durationDialogSeconds": "秒", + "settingsAllowMediaManagement": "允许媒体管理", + "tagEditorSectionPlaceholders": "占位符", + "editEntryLocationDialogSetCustom": "设置自定义位置", + "tagPlaceholderCountry": "国家", + "tagPlaceholderPlace": "地方", + "aboutLicensesAndroidLibrariesSectionTitle": "Android 库", + "settingsWidgetDisplayedItem": "显示的内容", + "widgetDisplayedItemMostRecent": "最新", + "aboutLicensesFlutterPluginsSectionTitle": "Flutter 插件", + "entryInfoActionExportMetadata": "导出元数据", + "widgetDisplayedItemRandom": "随机", + "subtitlePositionTop": "顶部", + "subtitlePositionBottom": "底部", + "settingsSubtitleThemeTextPositionTile": "文本位置", + "settingsSubtitleThemeTextPositionDialogTitle": "文本位置", + "aboutLicensesDartPackagesSectionTitle": "Dart 软件包", + "aboutLicensesFlutterPackagesSectionTitle": "Flutter 软件包", + "keepScreenOnVideoPlayback": "视频播放期间", + "columnCount": "{count, plural, other{{count} 列}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "entryActionShareImageOnly": "仅分享图片", + "entryActionShareVideoOnly": "仅分享视频", + "filterAspectRatioLandscapeLabel": "横向", + "filterAspectRatioPortraitLabel": "纵向", + "entryInfoActionRemoveLocation": "移除位置", + "filterNoAddressLabel": "无地址", + "settingsViewerShowRatingTags": "显示评分和标签", + "chipActionLock": "锁定", + "chipActionConfigureVault": "配置保险库", + "chipActionCreateVault": "创建保险库", + "chipActionShowCountryStates": "显示区域", + "viewerActionLock": "锁定查看器", + "viewerActionUnlock": "解锁查看器", + "editorActionTransform": "转换", + "editorTransformRotate": "旋转", + "applyTooltip": "应用", + "pinDialogEnter": "输入PIN", + "patternDialogConfirm": "确认图案", + "pinDialogConfirm": "确认PIN", + "passwordDialogConfirm": "确认密码", + "settingsDisplayUseTvInterface": "Android TV 界面", + "passwordDialogEnter": "输入密码", + "tagEditorDiscardDialogMessage": "是否放弃更改?", + "vaultLockTypePassword": "密码", + "overlayHistogramRGB": "RGB", + "saveCopyButtonLabel": "保存副本", + "aboutDataUsageMisc": "其他", + "vaultDialogLockModeWhenScreenOff": "屏幕关闭时锁定", + "tooManyItemsErrorDialogMessage": "用较少的项目重试。", + "videoResumptionModeNever": "从不", + "aboutDataUsageDatabase": "数据库", + "exportEntryDialogQuality": "画质", + "placeEmpty": "没有地点", + "settingsAskEverytime": "每次都询问", + "settingsModificationWarningDialogMessage": "其他设置将被修改。", + "settingsVideoGestureVerticalDragBrightnessVolume": "上下滑动屏幕调整亮度或音量", + "videoResumptionModeAlways": "始终", + "vaultLockTypePattern": "图案", + "albumTierVaults": "保险库", + "settingsVideoResumptionModeTile": "恢复播放", + "vaultBinUsageDialogMessage": "有些保险库正在使用资源回收站。", + "overlayHistogramLuminance": "亮度", + "patternDialogEnter": "输入图形", + "maxBrightnessAlways": "始终", + "aboutDataUsageSectionTitle": "数据使用量", + "entryActionCast": "投屏", + "vaultLockTypePin": "PIN", + "editorTransformCrop": "裁剪", + "filterTaggedLabel": "有标签", + "statePageTitle": "区域", + "settingsVideoResumptionModeDialogTitle": "恢复播放", + "settingsVideoBackgroundMode": "后台模式", + "chipActionGoToPlacePage": "在地点中显示", + "placePageTitle": "地点", + "authenticateToUnlockVault": "验证以解锁保险库", + "lengthUnitPercent": "百分比", + "maxBrightnessNever": "从不", + "aboutDataUsageCache": "缓存", + "settingsCollectionBurstPatternsNone": "无", + "widgetTapUpdateWidget": "刷新和切换小部件内容", + "settingsViewerShowDescription": "显示描述", + "cropAspectRatioFree": "自由", + "newVaultWarningDialogMessage": "保险库中的项目仅供此应用使用,其他应用不可用。\n\n如果您卸载此应用或清除此应用数据,您将丢失所有这些项目。", + "settingsDisablingBinWarningDialogMessage": "回收站中的项目将被永久删除。", + "statsTopStatesSectionTitle": "最多项的区域", + "settingsVideoPlaybackPageTitle": "播放", + "filterLocatedLabel": "有定位", + "settingsAccessibilityShowPinchGestureAlternatives": "显示触屏手势可选方案", + "drawerPlacePage": "地点", + "settingsConfirmationVaultDataLoss": "显示保险库数据丢失警报", + "aboutDataUsageClearCache": "清理缓存", + "authenticateToConfigureVault": "验证以设置保险库", + "lengthUnitPixel": "像素", + "vaultDialogLockTypeLabel": "锁定类型", + "aboutDataUsageExternal": "外部存储", + "cropAspectRatioSquare": "方形", + "overlayHistogramNone": "无", + "settingsCollectionBurstPatternsTile": "连拍模式", + "cropAspectRatioOriginal": "原始", + "configureVaultDialogTitle": "设置保险库", + "searchStatesSectionTitle": "区域", + "stateEmpty": "没有区域", + "aboutDataUsageData": "数据", + "aboutDataUsageInternal": "内部存储", + "castDialogTitle": "投屏设备", + "settingsVideoEnablePip": "画中画", + "newVaultDialogTitle": "新保险库", + "settingsVideoBackgroundModeDialogTitle": "后台模式", + "tagPlaceholderState": "区域", + "settingsViewerShowHistogram": "显示直方图", + "settingsVideoPlaybackTile": "播放", + "exportEntryDialogWriteMetadata": "写入元数据", + "settingsThumbnailShowHdrIcon": "显示 HDR 图标", + "collectionActionSetHome": "设置为首页", + "videoRepeatActionSetStart": "设置起点", + "stopTooltip": "停止", + "videoActionABRepeat": "A-B 循环播放", + "videoRepeatActionSetEnd": "设置终点", + "renameProcessorHash": "哈希", + "settingsForceWesternArabicNumeralsTile": "强制使用阿拉伯数字", + "chipActionShowCollection": "在媒体集中显示", + "explorerPageTitle": "资源管理器", + "chipActionGoToExplorerPage": "在资源管理器中显示", + "setHomeCustom": "自定义", + "explorerActionSelectStorageVolume": "选择存储器", + "selectStorageVolumeDialogTitle": "选择存储器", + "sortByDuration": "按时长", + "sortOrderLongestFirst": "先长后短", + "sortOrderShortestFirst": "先短后长", + "mapStyleOpenTopoMap": "OpenTopoMap", + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | 图块由 [OpenTopoMap](https://opentopomap.org/)提供,[CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "mapAttributionOsmData": "地图数据由 © [OpenStreetMap](https://www.openstreetmap.org/copyright) 贡献", + "videoActionShowPreviousFrame": "显示上一帧", + "videoActionShowNextFrame": "显示下一帧", + "newAlbumDialogAlbumAlreadyExistsHelper": "相册已存在", + "mapAttributionOsmLiberty": "绘制于 [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • 主办方 [OSM Americana](https://tile.ourmap.us)", + "mapStyleOsmLiberty": "OSM Liberty", + "albumTierDynamic": "动态", + "chipActionRemove": "删除", + "newDynamicAlbumDialogTitle": "新动态专辑", + "collectionActionAddDynamicAlbum": "添加动态专辑", + "appExportDynamicAlbums": "动态专辑", + "dynamicAlbumAlreadyExists": "动态专辑已存在", + "chipActionDecompose": "分割", + "coordinateFormatDdm": "度分秒十进制坐标", + "editEntryLocationDialogImportGpx": "导入 GPX", + "removeEntryMetadataDialogAll": "全部", + "editEntryLocationDialogTimeShift": "时间时移", + "searchFormatSectionTitle": "格式", + "sortByPath": "按路径", + "newGroupDialogNameLabel": "组名", + "albumTierGroups": "组", + "sectionNone": "不区分", + "chipActionCreateGroup": "创建组", + "newGroupDialogTitle": "新建组", + "createButtonLabel": "创建", + "chipActionGroup": "更改分组", + "groupAlreadyExists": "组已存在", + "groupEmpty": "没有组", + "ungrouped": "未分组", + "groupPickerTitle": "挑选组", + "groupPickerUseThisGroupButton": "使用该组", + "mapStyleDialogAddStyle": "添加样式", + "mapStyleEditorDialogName": "名称", + "mapStyleEditorDialogUrl": "URL", + "mapStyleEditorDialogSubdomains": "子域名", + "mapStyleEditorDialogUserAgent": "用户代理(UA)", + "settingsNavigationBottomActionsTile": "底部导航", + "settingsNavigationBottomActionEditorPageTitle": "底部导航", + "settingsNavigationBottomActionEditorBanner": "长按以移动按钮,并选择在底部导航栏中显示哪些操作。", + "tagPickPageTitle": "选择标签", + "settingsViewerShowZoomLevel": "显示缩放级别", + "settingsEnabled": "已启用", + "settingsForced": "已强制" +} diff --git a/lib/l10n/app_zh_Hant.arb b/lib/l10n/app_zh_Hant.arb new file mode 100644 index 0000000..272e4a3 --- /dev/null +++ b/lib/l10n/app_zh_Hant.arb @@ -0,0 +1,1644 @@ +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "歡迎使用 Aves", + "@welcomeMessage": {}, + "welcomeOptional": "可選擇的", + "@welcomeOptional": {}, + "welcomeTermsToggle": "我同意這些使用條款及狀況", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, other{{count} 項}}", + "@itemCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeDays": "{count, plural, other{{count} 天}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "nextButtonLabel": "下一步", + "@nextButtonLabel": {}, + "showButtonLabel": "顯示", + "@showButtonLabel": {}, + "continueButtonLabel": "繼續", + "@continueButtonLabel": {}, + "cancelTooltip": "取消", + "@cancelTooltip": {}, + "changeTooltip": "更改", + "@changeTooltip": {}, + "clearTooltip": "清除", + "@clearTooltip": {}, + "previousTooltip": "上一個", + "@previousTooltip": {}, + "nextTooltip": "下一個", + "@nextTooltip": {}, + "showTooltip": "顯示", + "@showTooltip": {}, + "hideTooltip": "隱藏", + "@hideTooltip": {}, + "actionRemove": "刪除", + "@actionRemove": {}, + "pickTooltip": "挑選", + "@pickTooltip": {}, + "doubleBackExitMessage": "再按一次 “上一頁” 離開.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "不再詢問", + "@doNotAskAgain": {}, + "sourceStateCataloguing": "正在整理目錄中", + "@sourceStateCataloguing": {}, + "sourceStateLocatingPlaces": "正在定位地點", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "刪除", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "在相簿中顯示", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "在國家中顯示", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "在標籤中顯示", + "@chipActionGoToTagPage": {}, + "chipActionFilterIn": "篩選", + "@chipActionFilterIn": {}, + "chipActionHide": "隱藏", + "@chipActionHide": {}, + "chipActionPin": "置頂", + "@chipActionPin": {}, + "chipActionUnpin": "取消置頂", + "@chipActionUnpin": {}, + "chipActionRename": "重新命名", + "@chipActionRename": {}, + "chipActionCreateAlbum": "建立相簿", + "@chipActionCreateAlbum": {}, + "entryActionConvert": "轉換", + "@entryActionConvert": {}, + "entryActionExport": "匯出", + "@entryActionExport": {}, + "entryActionInfo": "訊息", + "@entryActionInfo": {}, + "entryActionRename": "重新命名", + "@entryActionRename": {}, + "entryActionRestore": "還原", + "@entryActionRestore": {}, + "entryActionRotateCW": "順時鐘旋轉", + "@entryActionRotateCW": {}, + "entryActionShare": "分享", + "@entryActionShare": {}, + "entryActionShareVideoOnly": "只分享影片", + "@entryActionShareVideoOnly": {}, + "entryActionRemoveFavourite": "移除我的最愛", + "@entryActionRemoveFavourite": {}, + "entryActionShowGeoTiffOnMap": "顯示為地圖疊加層", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "轉換為靜態圖片", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "打開影片", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "編輯", + "@entryActionEdit": {}, + "entryActionOpen": "開始方式", + "@entryActionOpen": {}, + "entryActionSetAs": "設定為", + "@entryActionSetAs": {}, + "videoActionMute": "靜音", + "@videoActionMute": {}, + "videoActionPause": "暫停", + "@videoActionPause": {}, + "videoActionPlay": "播放", + "@videoActionPlay": {}, + "videoActionReplay10": "退回 10 秒", + "@videoActionReplay10": {}, + "videoActionSkip10": "前進 10 秒", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "選擇音軌", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "播放速度", + "@videoActionSetSpeed": {}, + "viewerActionSettings": "設定", + "@viewerActionSettings": {}, + "slideshowActionResume": "繼續", + "@slideshowActionResume": {}, + "entryInfoActionEditLocation": "編輯座標", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "編輯標題和描述", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionExportMetadata": "匯出元資料", + "@entryInfoActionExportMetadata": {}, + "entryInfoActionRemoveLocation": "移除座標", + "@entryInfoActionRemoveLocation": {}, + "filterAspectRatioLandscapeLabel": "橫向", + "@filterAspectRatioLandscapeLabel": {}, + "filterAspectRatioPortraitLabel": "縱向", + "@filterAspectRatioPortraitLabel": {}, + "filterBinLabel": "資源回收桶", + "@filterBinLabel": {}, + "filterFavouriteLabel": "我的最愛", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "未註明日期", + "@filterNoDateLabel": {}, + "filterNoAddressLabel": "無地址", + "@filterNoAddressLabel": {}, + "filterNoRatingLabel": "未評分", + "@filterNoRatingLabel": {}, + "filterNoLocationLabel": "未定位", + "@filterNoLocationLabel": {}, + "filterNoTagLabel": "無標籤", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "無標題", + "@filterNoTitleLabel": {}, + "filterRecentlyAddedLabel": "最近新增", + "@filterRecentlyAddedLabel": {}, + "filterRatingRejectedLabel": "駁回", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "動畫", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "動態相片", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "全景圖", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° 影片", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "圖片", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "影片", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "unitSystemMetric": "公制", + "@unitSystemMetric": {}, + "unitSystemImperial": "英制", + "@unitSystemImperial": {}, + "videoLoopModeNever": "永不", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "僅短影片", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "總是", + "@videoLoopModeAlways": {}, + "videoControlsPlayOutside": "用其他播放器打開", + "@videoControlsPlayOutside": {}, + "mapStyleGoogleNormal": "Google 地圖", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleTerrain": "Google 地圖 (地形)", + "@mapStyleGoogleTerrain": {}, + "nameConflictStrategyRename": "重新命名", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "取代", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "跳過", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "永不", + "@keepScreenOnNever": {}, + "keepScreenOnVideoPlayback": "播放影片期間", + "@keepScreenOnVideoPlayback": {}, + "keepScreenOnAlways": "總是", + "@keepScreenOnAlways": {}, + "keepScreenOnViewerOnly": "只有瀏覽頁面", + "@keepScreenOnViewerOnly": {}, + "displayRefreshRatePreferHighest": "最高更新率", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "最低更新率", + "@displayRefreshRatePreferLowest": {}, + "subtitlePositionTop": "頂端", + "@subtitlePositionTop": {}, + "subtitlePositionBottom": "底端", + "@subtitlePositionBottom": {}, + "videoPlaybackSkip": "跳過", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "靜音播放", + "@videoPlaybackMuted": {}, + "themeBrightnessLight": "淺色", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "深色", + "@themeBrightnessDark": {}, + "viewerTransitionSlide": "滑動", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "視差滾動", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "淡入淡出", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "放大", + "@viewerTransitionZoomIn": {}, + "viewerTransitionNone": "無", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "主畫面", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "鎖定畫面", + "@wallpaperTargetLock": {}, + "widgetDisplayedItemRandom": "隨機", + "@widgetDisplayedItemRandom": {}, + "widgetDisplayedItemMostRecent": "最新", + "@widgetDisplayedItemMostRecent": {}, + "widgetOpenPageHome": "打開主畫面", + "@widgetOpenPageHome": {}, + "widgetOpenPageCollection": "打開收藏品", + "@widgetOpenPageCollection": {}, + "widgetOpenPageViewer": "打開瀏覽器", + "@widgetOpenPageViewer": {}, + "albumTierPinned": "釘選", + "@albumTierPinned": {}, + "albumTierSpecial": "一般", + "@albumTierSpecial": {}, + "albumTierRegular": "其他", + "@albumTierRegular": {}, + "storageVolumeDescriptionFallbackPrimary": "內部儲存空間", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD 卡", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "根目錄", + "@rootDirectoryDescription": {}, + "albumTierApps": "Apps", + "@albumTierApps": {}, + "storageAccessDialogMessage": "請在下一畫面中選擇 “{volume}” 的 {directory},以授予本程式存取權限.", + "@storageAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "missingSystemFilePickerDialogMessage": "系統檔案選擇器遺失或停用. 請啟用他並再試一次.", + "@missingSystemFilePickerDialogMessage": {}, + "addShortcutDialogLabel": "捷徑標籤", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "新增", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "無對應的 app 能處理.", + "@noMatchingAppDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "處理前儲存項目日期?", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "儲存日期", + "@moveUndatedConfirmationDialogSetDate": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{刪除這個項目?} other{刪除這 {count} 項目?}}", + "@deleteEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoStartOverButtonLabel": "重新播放", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "繼續", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "最新項目", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "自動", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "自定", + "@setCoverDialogCustom": {}, + "newAlbumDialogTitle": "新相簿", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "相簿名稱", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "目錄已存在", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "儲存空間:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "新名稱", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "目錄已存在", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "重新命名", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "命名樣式", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "插入欄位", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "預覽", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorName": "名稱", + "@renameProcessorName": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{刪除這些相簿及其內部的項目?} other{刪除這些相簿及其中的{count}個項目?}}", + "@deleteMultiAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "exportEntryDialogFormat": "格式:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogHeight": "高度", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "新名稱", + "@renameEntryDialogLabel": {}, + "editEntryDialogTargetFieldsHeader": "修改欄位", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "日期和時間", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "設置自定日期", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "從其他日期複製", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogExtractFromTitle": "從標題獲得", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "轉移", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "檔案修改日期", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogSeconds": "秒鐘", + "@durationDialogSeconds": {}, + "editEntryLocationDialogTitle": "座標", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogSetCustom": "安置自定座標", + "@editEntryLocationDialogSetCustom": {}, + "editEntryLocationDialogChooseOnMap": "從地圖上選擇", + "@editEntryLocationDialogChooseOnMap": {}, + "editEntryLocationDialogLatitude": "緯度", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "經度", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "使用此座標", + "@locationPickerUseThisLocationButton": {}, + "removeEntryMetadataDialogMore": "更多", + "@removeEntryMetadataDialogMore": {}, + "videoSpeedDialogLabel": "播放速度", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "影片", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "音頻", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "字幕", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "關閉", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "軌道", + "@videoStreamSelectionDialogTrack": {}, + "genericFailureFeedback": "失敗", + "@genericFailureFeedback": {}, + "genericDangerWarningDialogMessage": "你確定嗎?", + "@genericDangerWarningDialogMessage": {}, + "menuActionConfigureView": "檢視", + "@menuActionConfigureView": {}, + "menuActionSelect": "選擇", + "@menuActionSelect": {}, + "menuActionSelectAll": "選擇全部", + "@menuActionSelectAll": {}, + "menuActionMap": "地圖", + "@menuActionMap": {}, + "menuActionSlideshow": "幻燈片", + "@menuActionSlideshow": {}, + "menuActionStats": "統計資料", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "排序", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "分區", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "佈局", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "反向排序", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "混合", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "網格", + "@tileLayoutGrid": {}, + "tileLayoutList": "列表", + "@tileLayoutList": {}, + "coverDialogTabApp": "App", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "顏色", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "選擇 App", + "@appPickDialogTitle": {}, + "aboutPageTitle": "關於", + "@aboutPageTitle": {}, + "aboutLinkLicense": "授權條款", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "隱私政策", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "回報錯誤", + "@aboutBugSectionTitle": {}, + "aboutBugCopyInfoInstruction": "複製系統資訊", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "複製", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "回報日誌和系統資訊到 GitHub", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "回報", + "@aboutBugReportButton": {}, + "aboutCreditsSectionTitle": "感謝名單", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "本 App 使用的 TopoJSON 檔案來自", + "@aboutCreditsWorldAtlas1": {}, + "aboutTranslatorsSectionTitle": "翻譯人員", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "開放原始碼授權條款", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android 函式庫", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter 外掛", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart 套件", + "@aboutLicensesDartPackagesSectionTitle": {}, + "policyPageTitle": "隱私政策", + "@policyPageTitle": {}, + "collectionPageTitle": "收藏品", + "@collectionPageTitle": {}, + "collectionSelectPageTitle": "選擇項目", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "顯示標題過濾器", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "隱藏標題過濾器", + "@collectionActionHideTitleSearch": {}, + "collectionActionEmptyBin": "清空資源回收筒", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "複製到相簿", + "@collectionActionCopy": {}, + "collectionActionMove": "移動到相簿", + "@collectionActionMove": {}, + "collectionActionRescan": "重新掃描", + "@collectionActionRescan": {}, + "collectionActionEdit": "編輯", + "@collectionActionEdit": {}, + "collectionGroupAlbum": "依照相簿", + "@collectionGroupAlbum": {}, + "collectionGroupDay": "依照日期", + "@collectionGroupDay": {}, + "sectionUnknown": "未知", + "@sectionUnknown": {}, + "dateYesterday": "昨天", + "@dateYesterday": {}, + "dateThisMonth": "本月", + "@dateThisMonth": {}, + "collectionRenameFailureFeedback": "{count, plural, other{改名 {count} 項目失敗}}", + "@collectionRenameFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditFailureFeedback": "{count, plural, other{編輯 {count} 項目失敗}}", + "@collectionEditFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopySuccessFeedback": "{count, plural, other{複製 {count} 項目}}", + "@collectionCopySuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionRenameSuccessFeedback": "{count, plural, other{改名 {count} 項目}}", + "@collectionRenameSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEditSuccessFeedback": "{count, plural, other{編輯 {count} 項目}}", + "@collectionEditSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionEmptyFavourites": "沒有我的最愛", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "沒有影片", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "沒有圖片", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "允許存取", + "@collectionEmptyGrantAccessButtonLabel": {}, + "drawerCollectionAll": "所有收藏品", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "我的最愛", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "圖片", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "影片", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "動畫", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "動態相片", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionRaws": "Raw 相片", + "@drawerCollectionRaws": {}, + "drawerAlbumPage": "相簿", + "@drawerAlbumPage": {}, + "drawerCountryPage": "國家", + "@drawerCountryPage": {}, + "drawerTagPage": "標籤", + "@drawerTagPage": {}, + "sortByDate": "依日期", + "@sortByDate": {}, + "sortByName": "依名稱", + "@sortByName": {}, + "sortByItemCount": "依項目數量", + "@sortByItemCount": {}, + "sortBySize": "依尺寸", + "@sortBySize": {}, + "sortByRating": "依評分", + "@sortByRating": {}, + "sortOrderNewestFirst": "由新至舊", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "由舊至新", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "A — Z", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Z — A", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "由高到低", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "由低到高", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "由大到小", + "@sortOrderLargestFirst": {}, + "albumGroupTier": "依層級", + "@albumGroupTier": {}, + "albumGroupVolume": "依儲存容量", + "@albumGroupVolume": {}, + "albumMimeTypeMixed": "混合的", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleMove": "移動到相簿", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "選擇相簿", + "@albumPickPageTitlePick": {}, + "albumCamera": "相機", + "@albumCamera": {}, + "albumDownload": "下載", + "@albumDownload": {}, + "albumScreenshots": "截圖", + "@albumScreenshots": {}, + "albumScreenRecordings": "螢幕錄影", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "影像截取", + "@albumVideoCaptures": {}, + "albumPageTitle": "相簿", + "@albumPageTitle": {}, + "albumEmpty": "沒有相簿", + "@albumEmpty": {}, + "createAlbumButtonLabel": "建立", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "新的", + "@newFilterBanner": {}, + "countryPageTitle": "國家", + "@countryPageTitle": {}, + "countryEmpty": "沒有國家", + "@countryEmpty": {}, + "binPageTitle": "資源回收桶", + "@binPageTitle": {}, + "searchRecentSectionTitle": "最近", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "日期", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "相簿", + "@searchAlbumsSectionTitle": {}, + "searchRatingSectionTitle": "評分", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "元資料", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "設定", + "@settingsPageTitle": {}, + "settingsDefault": "預設", + "@settingsDefault": {}, + "settingsDisabled": "停用", + "@settingsDisabled": {}, + "settingsSearchFieldLabel": "搜尋設定", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "沒有符合的設定", + "@settingsSearchEmpty": {}, + "settingsActionExport": "匯出", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "匯出", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "匯入", + "@settingsActionImport": {}, + "appExportCovers": "封面", + "@appExportCovers": {}, + "appExportFavourites": "我的最愛", + "@appExportFavourites": {}, + "appExportSettings": "設定", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "導航", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "主畫面", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "主畫面", + "@settingsHomeDialogTitle": {}, + "settingsKeepScreenOnDialogTitle": "保持螢幕開啟", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsConfirmationTile": "確認對話框", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "確認對話框", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "永久刪除項目前先詢問", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "移動項目到資源回收桶前先詢問", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "日期不詳的項目移動前先詢問", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "移動項目到資源回收桶後顯示訊息", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerEditorPageTitle": "操作選單", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerTabTypes": "類型", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabPages": "頁面", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "新增相簿", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "縮圖", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "疊加層", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "疊加層", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowFavouriteIcon": "顯示我的最愛圖示", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "顯示標籤圖示", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "顯示動態相片圖示", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "顯示評分", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "顯示 raw 圖示", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "顯示影片時間長度", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "快速操作", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "快速操作", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "瀏覽", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "長按來移動按鈕,以選擇在選擇項目時顯示的操作項。", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsViewerSectionTitle": "瀏覽器", + "@settingsViewerSectionTitle": {}, + "settingsViewerGestureSideTapNext": "點擊螢幕邊緣以顯示上一個/下一個項目", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerUseCutout": "使用鏤空區域", + "@settingsViewerUseCutout": {}, + "settingsMotionPhotoAutoPlay": "自動播放動態相片", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "圖片背景", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "快速操作", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "顯示的按鈕", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "可用按鈕", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerOverlayTile": "疊加層", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "疊加層", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowMinimap": "顯示小地圖", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "顯示資訊", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "顯示標題、日期、座標…等", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowRatingTags": "顯示評分和標籤", + "@settingsViewerShowRatingTags": {}, + "settingsViewerShowShootingDetails": "顯示拍攝細節", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowOverlayThumbnails": "顯示縮圖", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "模糊特效", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "幻燈片", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "幻燈片", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "重複", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "隨機播放", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "全螢幕", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowAnimatedZoomEffect": "動畫縮放效果", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "轉換", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "時間間隔", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "影片播放", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "影片播放", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "影片設定", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "影片", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "顯示影片", + "@settingsVideoShowVideos": {}, + "settingsVideoAutoPlay": "自動播放", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "循環模式", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "循環模式", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "字幕", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "字幕", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeTextAlignmentTile": "文字對齊", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeShowOutline": "顯示輪廓和陰影", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "文字顏色", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "文字透明度", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "背景顏色", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "背景透明度", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "左邊", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "置中", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "右邊", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoControlsTile": "控制", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "控制", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "按鈕", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "點擊二次以播放/暫停", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "螢幕邊緣點擊二次以後退/前進", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsPrivacySectionTitle": "隱私", + "@settingsPrivacySectionTitle": {}, + "settingsAllowErrorReporting": "允許匿名錯誤報告", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "儲存搜尋歷史記錄", + "@settingsSaveSearchHistory": {}, + "settingsEnableBinSubtitle": "刪除項目保留 30 天", + "@settingsEnableBinSubtitle": {}, + "settingsAllowMediaManagement": "允許媒體管理", + "@settingsAllowMediaManagement": {}, + "settingsHiddenItemsTile": "隱藏項目", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "隱藏項目", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenFiltersBanner": "符合過濾器的相片和影片將不會顯示在你的收藏品中.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "沒有隱藏過濾器", + "@settingsHiddenFiltersEmpty": {}, + "settingsStorageAccessEmpty": "沒有存取權限", + "@settingsStorageAccessEmpty": {}, + "settingsAccessibilitySectionTitle": "無障礙", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "移除動畫", + "@settingsRemoveAnimationsTile": {}, + "settingsTimeToTakeActionTile": "是時候採取行動", + "@settingsTimeToTakeActionTile": {}, + "settingsDisplaySectionTitle": "顯示", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessDialogTitle": "佈景主題", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeEnableDynamicColor": "動態色彩", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "顯示更新率", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "更新率", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageSectionTitle": "語言和格式", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "語言", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "語言", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "座標格式", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "座標格式", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "單位", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "單位", + "@settingsUnitSystemDialogTitle": {}, + "settingsScreenSaverPageTitle": "螢幕保護程式", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "相框", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "輪廓", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "點擊小工具時", + "@settingsWidgetOpenPage": {}, + "settingsWidgetDisplayedItem": "顯示項目", + "@settingsWidgetDisplayedItem": {}, + "settingsCollectionTile": "收藏品", + "@settingsCollectionTile": {}, + "statsTopCountriesSectionTitle": "熱門國家", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "熱門地點", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "熱門標籤", + "@statsTopTagsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "打開全景圖", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "設定桌布", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorDoesNotExist": "這檔案已不存在.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "訊息", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "回到瀏覽器", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "未知", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "描述", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "標題", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelResolution": "解析度", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "大小", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelDuration": "時間長度", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "擁有者", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "座標", + "@viewerInfoLabelCoordinates": {}, + "mapStyleDialogTitle": "地圖樣式", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "選擇地圖樣式", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "放大", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "縮小", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "北方向上", + "@mapPointNorthUpTooltip": {}, + "timeSeconds": "{count, plural, other{{count} 秒}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "timeMinutes": "{count, plural, other{{count} 分}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "applyButtonLabel": "套用", + "@applyButtonLabel": {}, + "deleteButtonLabel": "刪除", + "@deleteButtonLabel": {}, + "hideButtonLabel": "隱藏", + "@hideButtonLabel": {}, + "resetTooltip": "重置", + "@resetTooltip": {}, + "saveTooltip": "儲存", + "@saveTooltip": {}, + "sourceStateLoading": "載入中", + "@sourceStateLoading": {}, + "sourceStateLocatingCountries": "正在定位國家", + "@sourceStateLocatingCountries": {}, + "chipActionFilterOut": "過濾掉", + "@chipActionFilterOut": {}, + "chipActionSetCover": "設定封面", + "@chipActionSetCover": {}, + "entryActionCopyToClipboard": "複製到剪貼簿", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "刪除", + "@entryActionDelete": {}, + "entryActionRotateCCW": "逆時鐘旋轉", + "@entryActionRotateCCW": {}, + "entryActionShareImageOnly": "只分享圖片", + "@entryActionShareImageOnly": {}, + "entryActionFlip": "水平翻轉", + "@entryActionFlip": {}, + "entryActionViewSource": "查看原始碼", + "@entryActionViewSource": {}, + "entryActionPrint": "列印", + "@entryActionPrint": {}, + "entryActionRotateScreen": "旋轉螢幕", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "加入我的最愛", + "@entryActionAddFavourite": {}, + "entryActionOpenMap": "在地圖應用中顯示", + "@entryActionOpenMap": {}, + "videoActionCaptureFrame": "獲取幀數", + "@videoActionCaptureFrame": {}, + "videoActionUnmute": "取消靜音", + "@videoActionUnmute": {}, + "slideshowActionShowInCollection": "在收藏品中顯示", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "編輯日期和時間", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditTags": "編輯標籤", + "@entryInfoActionEditTags": {}, + "entryInfoActionEditRating": "編輯評分", + "@entryInfoActionEditRating": {}, + "entryInfoActionRemoveMetadata": "移除元資料", + "@entryInfoActionRemoveMetadata": {}, + "filterOnThisDayLabel": "在這一天", + "@filterOnThisDayLabel": {}, + "coordinateDmsWest": "W", + "@coordinateDmsWest": {}, + "coordinateDmsEast": "E", + "@coordinateDmsEast": {}, + "mapStyleGoogleHybrid": "Google 地圖 (衛星影像)", + "@mapStyleGoogleHybrid": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor", + "@mapStyleStamenWatercolor": {}, + "videoPlaybackWithSound": "帶音播放", + "@videoPlaybackWithSound": {}, + "accessibilityAnimationsRemove": "阻止螢幕特效", + "@accessibilityAnimationsRemove": {}, + "themeBrightnessBlack": "黑色", + "@themeBrightnessBlack": {}, + "accessibilityAnimationsKeep": "保留螢幕特效", + "@accessibilityAnimationsKeep": {}, + "wallpaperTargetHomeLock": "主畫面和鎖定畫面", + "@wallpaperTargetHomeLock": {}, + "albumTierNew": "新的", + "@albumTierNew": {}, + "otherDirectoryDescription": "“{name}” 目錄", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "restrictedAccessDialogMessage": "這 app 不允許修改 “{volume}” 的 {directory} 中的檔案.\n\n請使用預先安裝的檔案總管或圖片檢視器來將項目搬到另一個目錄.", + "@restrictedAccessDialogMessage": { + "placeholders": { + "directory": { + "type": "String", + "description": "the name of a directory, using the output of `rootDirectoryDescription` or `otherDirectoryDescription`" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "notEnoughSpaceDialogMessage": "此操作需要“{volume}”上具有 {neededSize} 可用空間才能完成,實際只剩 {freeSize}.", + "@notEnoughSpaceDialogMessage": { + "placeholders": { + "neededSize": { + "type": "String", + "example": "314 MB" + }, + "freeSize": { + "type": "String", + "example": "123 MB" + }, + "volume": { + "type": "String", + "example": "SD card", + "description": "the name of a storage volume" + } + } + }, + "nameConflictDialogSingleSourceMessage": "目標資料夾中有同名稱檔案.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "存在同名稱檔案.", + "@nameConflictDialogMultipleSourceMessage": {}, + "videoResumeDialogMessage": "想要在 {time} 繼續播放?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "hideFilterConfirmationDialogMessage": "符合的照片和影片將從收藏品中隱藏,你可以從 “隱私” 設定中再次顯示.\n\n確定要隱藏嗎?", + "@hideFilterConfirmationDialogMessage": {}, + "renameProcessorCounter": "計數器", + "@renameProcessorCounter": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{刪除此相簿及其中的項目?} other{刪除此相簿及其中的{count}個項目?}}", + "@deleteSingleAlbumConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "exportEntryDialogWidth": "寬度", + "@exportEntryDialogWidth": {}, + "editEntryDialogCopyFromItem": "從其他項目複製", + "@editEntryDialogCopyFromItem": {}, + "durationDialogHours": "小時", + "@durationDialogHours": {}, + "durationDialogMinutes": "分鐘", + "@durationDialogMinutes": {}, + "editEntryRatingDialogTitle": "評分", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "移除元資料", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "播放動態相片中的影片需要 XMP\n\n確定要刪除他嗎?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "menuActionSelectNone": "全部不選", + "@menuActionSelectNone": {}, + "genericSuccessFeedback": "完成!", + "@genericSuccessFeedback": {}, + "coverDialogTabCover": "封面", + "@coverDialogTabCover": {}, + "appPickDialogNone": "無", + "@appPickDialogNone": {}, + "aboutBugSaveLogInstruction": "將 App 日誌儲存到檔案", + "@aboutBugSaveLogInstruction": {}, + "aboutCreditsWorldAtlas2": "符合 ISC 授權條款.", + "@aboutCreditsWorldAtlas2": {}, + "searchCountriesSectionTitle": "國家", + "@searchCountriesSectionTitle": {}, + "albumPickPageTitleExport": "匯出到相簿", + "@albumPickPageTitleExport": {}, + "tagPageTitle": "標籤", + "@tagPageTitle": {}, + "tagEmpty": "沒有標籤", + "@tagEmpty": {}, + "searchCollectionFieldHint": "搜尋收藏品", + "@searchCollectionFieldHint": {}, + "searchPlacesSectionTitle": "地點", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "標籤", + "@searchTagsSectionTitle": {}, + "settingsSystemDefault": "系統預設", + "@settingsSystemDefault": {}, + "settingsActionImportDialogTitle": "匯入", + "@settingsActionImportDialogTitle": {}, + "settingsKeepScreenOnTile": "保持螢幕開啟", + "@settingsKeepScreenOnTile": {}, + "settingsDoubleBackExit": "按 “上一頁” 鍵二次離開", + "@settingsDoubleBackExit": {}, + "settingsNavigationDrawerTile": "操作選單", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerBanner": "長按來移動以重新排序選單項目。", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabAlbums": "相簿", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsThumbnailShowLocationIcon": "顯示座標圖示", + "@settingsThumbnailShowLocationIcon": {}, + "settingsCollectionQuickActionTabSelecting": "選擇", + "@settingsCollectionQuickActionTabSelecting": {}, + "aboutLicensesBanner": "本 App 使用下列開放原始碼套件和函式庫.", + "@aboutLicensesBanner": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter 套件", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "顯示所有授權條款", + "@aboutLicensesShowAllButtonLabel": {}, + "collectionPickPageTitle": "挑選", + "@collectionPickPageTitle": {}, + "collectionActionAddShortcut": "新增捷徑", + "@collectionActionAddShortcut": {}, + "collectionGroupMonth": "依照月份", + "@collectionGroupMonth": {}, + "collectionSearchTitlesHintText": "搜尋標題", + "@collectionSearchTitlesHintText": {}, + "dateToday": "今天", + "@dateToday": {}, + "collectionDeleteFailureFeedback": "{count, plural, other{刪除 {count} 項目失敗}}", + "@collectionDeleteFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionCopyFailureFeedback": "{count, plural, other{複製 {count} 項目失敗}}", + "@collectionCopyFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportFailureFeedback": "{count, plural, other{匯出 {count} 頁}}", + "@collectionExportFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveSuccessFeedback": "{count, plural, other{移動 {count} 項目}}", + "@collectionMoveSuccessFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionMoveFailureFeedback": "{count, plural, other{移動 {count} 項目失敗}}", + "@collectionMoveFailureFeedback": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "albumPickPageTitleCopy": "複製到相簿", + "@albumPickPageTitleCopy": {}, + "drawerAboutButton": "關於", + "@drawerAboutButton": {}, + "drawerSettingsButton": "設定", + "@drawerSettingsButton": {}, + "drawerCollectionPanoramas": "全景圖", + "@drawerCollectionPanoramas": {}, + "drawerCollectionSphericalVideos": "360° 影片", + "@drawerCollectionSphericalVideos": {}, + "sortByAlbumFileName": "依相簿和檔案名稱", + "@sortByAlbumFileName": {}, + "sortOrderSmallestFirst": "由小到大", + "@sortOrderSmallestFirst": {}, + "albumGroupType": "依類型", + "@albumGroupType": {}, + "unsupportedTypeDialogMessage": "{count, plural, other{此操作不支援以下類型的項目: {types}.}}", + "@unsupportedTypeDialogMessage": { + "placeholders": { + "count": { + "type": "int" + }, + "types": { + "type": "String", + "example": "GIF, TIFF, MP4", + "description": "a list of unsupported types" + } + } + }, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{移動這個項目到資源回收桶?} other{移動這 {count} 項目到資源回收桶?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "videoStreamSelectionDialogNoSelection": "沒有其他音軌.", + "@videoStreamSelectionDialogNoSelection": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "長按來移動按鈕,以選擇在瀏覽項目時顯示哪些操作項。", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsViewerMaximumBrightness": "最大亮度", + "@settingsViewerMaximumBrightness": {}, + "settingsViewerQuickActionEditorPageTitle": "快速操作", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "長按來移動按鈕,以選擇瀏覽器中顯示的操作項。", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEmpty": "沒有按鈕", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerShowOverlayOnOpening": "開啟時顯示", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsEnableBin": "啟用資源回收桶", + "@settingsEnableBin": {}, + "settingsVideoEnableHardwareAcceleration": "硬體加速", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsSubtitleThemeSample": "這是一個樣本.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "文字對齊", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextPositionTile": "文字位置", + "@settingsSubtitleThemeTextPositionTile": {}, + "settingsSubtitleThemeTextPositionDialogTitle": "文字位置", + "@settingsSubtitleThemeTextPositionDialogTitle": {}, + "settingsSubtitleThemeTextSize": "文字大小", + "@settingsSubtitleThemeTextSize": {}, + "settingsAllowInstalledAppAccessSubtitle": "用於改進相簿顯示", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "viewerInfoLabelPath": "路徑", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelAddress": "地址", + "@viewerInfoLabelAddress": {}, + "settingsStorageAccessTile": "儲存空間存取", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "儲存空間存取", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessRevokeTooltip": "撤銷", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsStorageAccessBanner": "某些目錄要求明確存取權限才能修改裡面的檔案. 你可以查看先前得到權限的目錄.", + "@settingsStorageAccessBanner": {}, + "settingsRemoveAnimationsDialogTitle": "移除動畫", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsThemeColorHighlights": "色彩強調", + "@settingsThemeColorHighlights": {}, + "settingsThemeBrightnessTile": "佈景主題", + "@settingsThemeBrightnessTile": {}, + "statsPageTitle": "統計資料", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, =1{1條座標資訊} other{{count}條座標資訊}}", + "@statsWithGps": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "statsTopAlbumsSectionTitle": "熱門相簿", + "@statsTopAlbumsSectionTitle": {}, + "viewerErrorUnknown": "哎呀!", + "@viewerErrorUnknown": {}, + "viewerInfoLabelDate": "日期", + "@viewerInfoLabelDate": {}, + "mapAttributionOsmHot": "繪製於 [HOT](https://www.hotosm.org/) • 主辦方 [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "繪製於 [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "openMapPageTooltip": "在地圖頁面上檢視", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "該區域沒有圖片", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "解開嵌入資料失敗", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "開啟", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "檢視 XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "搜尋元資料", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "沒有符合的關鍵字", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "日期和時間", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "描述", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "範圍", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "解析度", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "權限", + "@viewerInfoSearchSuggestionRights": {}, + "wallpaperUseScrollEffect": "在主畫面上使用滾動效果", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageTitle": "編輯標籤", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "新標籤", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "新增標籤", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "最近", + "@tagEditorSectionRecent": {}, + "tagEditorSectionPlaceholders": "占位符", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "國家", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "地方", + "@tagPlaceholderPlace": {}, + "panoramaEnableSensorControl": "啟用感測器控制", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "停用感測器控制", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "原始碼", + "@sourceViewerPageTitle": {}, + "collectionSelectSectionTooltip": "選擇部份", + "@collectionSelectSectionTooltip": {}, + "coordinateFormatDecimal": "十進制度數", + "@coordinateFormatDecimal": {}, + "collectionDeselectSectionTooltip": "取消選擇部份", + "@collectionDeselectSectionTooltip": {}, + "settingsAllowInstalledAppAccess": "允許存取應用程式清單", + "@settingsAllowInstalledAppAccess": {}, + "applyTooltip": "應用", + "@applyTooltip": {}, + "chipActionCreateVault": "建立保險庫", + "@chipActionCreateVault": {}, + "viewerActionLock": "鎖定瀏覽器", + "@viewerActionLock": {}, + "viewerActionUnlock": "解鎖瀏覽器", + "@viewerActionUnlock": {}, + "editorActionTransform": "轉換", + "@editorActionTransform": {}, + "editorTransformCrop": "剪裁", + "@editorTransformCrop": {}, + "cropAspectRatioFree": "自由", + "@cropAspectRatioFree": {}, + "editorTransformRotate": "轉向", + "@editorTransformRotate": {}, + "cropAspectRatioOriginal": "原始", + "@cropAspectRatioOriginal": {}, + "cropAspectRatioSquare": "方形", + "@cropAspectRatioSquare": {}, + "filterTaggedLabel": "已標籤", + "@filterTaggedLabel": {}, + "widgetTapUpdateWidget": "更新小工具", + "@widgetTapUpdateWidget": {}, + "chipActionLock": "鎖定", + "@chipActionLock": {}, + "chipActionConfigureVault": "設訂保險庫", + "@chipActionConfigureVault": {}, + "maxBrightnessNever": "從不", + "@maxBrightnessNever": {}, + "maxBrightnessAlways": "總是", + "@maxBrightnessAlways": {}, + "videoResumptionModeNever": "從不", + "@videoResumptionModeNever": {}, + "videoResumptionModeAlways": "總是", + "@videoResumptionModeAlways": {}, + "newVaultWarningDialogMessage": "保險庫中的項目僅供此應用使用,其他應用不可用。\n\n如果您卸載此應用程序或清除此應用程序數據,您將丟失所有這些項目。", + "@newVaultWarningDialogMessage": {}, + "newVaultDialogTitle": "新保險庫", + "@newVaultDialogTitle": {}, + "chipActionShowCountryStates": "顯示地區", + "@chipActionShowCountryStates": {}, + "albumTierVaults": "保險庫", + "@albumTierVaults": {}, + "lengthUnitPercent": "%", + "@lengthUnitPercent": {}, + "filterLocatedLabel": "位於", + "@filterLocatedLabel": {}, + "vaultLockTypePin": "PIN", + "@vaultLockTypePin": {}, + "vaultLockTypePassword": "密碼", + "@vaultLockTypePassword": {}, + "configureVaultDialogTitle": "設置保險庫", + "@configureVaultDialogTitle": {}, + "settingsVideoEnablePip": "畫中畫", + "@settingsVideoEnablePip": {}, + "vaultLockTypePattern": "圖案", + "@vaultLockTypePattern": {}, + "saveCopyButtonLabel": "保存副本", + "@saveCopyButtonLabel": {}, + "chipActionGoToPlacePage": "在地點中顯示", + "@chipActionGoToPlacePage": {}, + "vaultDialogLockModeWhenScreenOff": "螢幕關閉時鎖定", + "@vaultDialogLockModeWhenScreenOff": {}, + "pinDialogConfirm": "確認PIN", + "@pinDialogConfirm": {}, + "drawerPlacePage": "地點", + "@drawerPlacePage": {}, + "settingsAskEverytime": "每次詢問", + "@settingsAskEverytime": {}, + "settingsVideoResumptionModeTile": "再次重播", + "@settingsVideoResumptionModeTile": {}, + "settingsVideoResumptionModeDialogTitle": "再次重播", + "@settingsVideoResumptionModeDialogTitle": {}, + "tagEditorDiscardDialogMessage": "是否要放棄更改?", + "@tagEditorDiscardDialogMessage": {}, + "columnCount": "{count, plural, other{{count} 列}}", + "@columnCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsVideoBackgroundModeDialogTitle": "後臺模式", + "@settingsVideoBackgroundModeDialogTitle": {}, + "vaultDialogLockTypeLabel": "鎖定形式", + "@vaultDialogLockTypeLabel": {}, + "statePageTitle": "地區", + "@statePageTitle": {}, + "exportEntryDialogQuality": "畫質", + "@exportEntryDialogQuality": {}, + "searchStatesSectionTitle": "地區", + "@searchStatesSectionTitle": {}, + "settingsVideoPlaybackPageTitle": "重播", + "@settingsVideoPlaybackPageTitle": {}, + "settingsVideoPlaybackTile": "重播", + "@settingsVideoPlaybackTile": {}, + "settingsDisplayUseTvInterface": "Android TV介面", + "@settingsDisplayUseTvInterface": {}, + "tagPlaceholderState": "地區", + "@tagPlaceholderState": {}, + "exportEntryDialogWriteMetadata": "寫入元資料", + "@exportEntryDialogWriteMetadata": {}, + "stateEmpty": "無地區", + "@stateEmpty": {}, + "placePageTitle": "地點", + "@placePageTitle": {}, + "placeEmpty": "無地點", + "@placeEmpty": {}, + "settingsCollectionBurstPatternsTile": "連拍形式", + "@settingsCollectionBurstPatternsTile": {}, + "settingsCollectionBurstPatternsNone": "無", + "@settingsCollectionBurstPatternsNone": {}, + "settingsVideoGestureVerticalDragBrightnessVolume": "上下滑動以調整亮度/音量", + "@settingsVideoGestureVerticalDragBrightnessVolume": {}, + "statsTopStatesSectionTitle": "最多項的地區", + "@statsTopStatesSectionTitle": {}, + "lengthUnitPixel": "px", + "@lengthUnitPixel": {}, + "vaultBinUsageDialogMessage": "有些保險庫正在使用資源回收桶。", + "@vaultBinUsageDialogMessage": {}, + "tooManyItemsErrorDialogMessage": "用更少的項目重試。", + "@tooManyItemsErrorDialogMessage": {}, + "settingsDisablingBinWarningDialogMessage": "資源回收桶中的項目將被永久刪除。", + "@settingsDisablingBinWarningDialogMessage": {}, + "patternDialogEnter": "輸入圖形", + "@patternDialogEnter": {}, + "pinDialogEnter": "輸入PIN", + "@pinDialogEnter": {}, + "patternDialogConfirm": "確認圖形", + "@patternDialogConfirm": {}, + "settingsConfirmationVaultDataLoss": "顯示保險庫數據洩漏警告", + "@settingsConfirmationVaultDataLoss": {}, + "settingsModificationWarningDialogMessage": "其他設置將被修改。", + "@settingsModificationWarningDialogMessage": {}, + "settingsVideoBackgroundMode": "後臺模式", + "@settingsVideoBackgroundMode": {}, + "passwordDialogEnter": "輸入密碼", + "@passwordDialogEnter": {}, + "authenticateToConfigureVault": "驗證以設置保險庫", + "@authenticateToConfigureVault": {}, + "authenticateToUnlockVault": "驗證以解鎖保險庫", + "@authenticateToUnlockVault": {}, + "passwordDialogConfirm": "確認密碼", + "@passwordDialogConfirm": {}, + "settingsViewerShowDescription": "顯示描述", + "@settingsViewerShowDescription": {}, + "settingsAccessibilityShowPinchGestureAlternatives": "顯示多點觸控手勢的備選方案", + "@settingsAccessibilityShowPinchGestureAlternatives": {}, + "overlayHistogramRGB": "RGB", + "@overlayHistogramRGB": {}, + "settingsThumbnailShowHdrIcon": "顯示 HDR 圖示", + "@settingsThumbnailShowHdrIcon": {}, + "aboutDataUsageSectionTitle": "資料用量", + "@aboutDataUsageSectionTitle": {}, + "aboutDataUsageData": "資料", + "@aboutDataUsageData": {}, + "aboutDataUsageCache": "快取記憶體", + "@aboutDataUsageCache": {}, + "aboutDataUsageDatabase": "資料庫", + "@aboutDataUsageDatabase": {}, + "aboutDataUsageMisc": "雜項", + "@aboutDataUsageMisc": {}, + "aboutDataUsageInternal": "內部儲存", + "@aboutDataUsageInternal": {}, + "aboutDataUsageExternal": "外部儲存", + "@aboutDataUsageExternal": {}, + "overlayHistogramNone": "無", + "@overlayHistogramNone": {}, + "overlayHistogramLuminance": "亮度", + "@overlayHistogramLuminance": {}, + "collectionActionSetHome": "設為首頁", + "@collectionActionSetHome": {}, + "aboutDataUsageClearCache": "清除快取", + "@aboutDataUsageClearCache": {}, + "settingsViewerShowHistogram": "顯示直方圖", + "@settingsViewerShowHistogram": {}, + "entryActionCast": "投放", + "@entryActionCast": {}, + "castDialogTitle": "投放裝置", + "@castDialogTitle": {}, + "stopTooltip": "停止", + "@stopTooltip": {}, + "videoActionABRepeat": "A-B 重複播放", + "@videoActionABRepeat": {}, + "videoRepeatActionSetStart": "設置起點", + "@videoRepeatActionSetStart": {}, + "videoRepeatActionSetEnd": "設置終點", + "@videoRepeatActionSetEnd": {}, + "renameProcessorHash": "雜湊", + "@renameProcessorHash": {}, + "settingsForceWesternArabicNumeralsTile": "強制使用阿拉伯數字", + "@settingsForceWesternArabicNumeralsTile": {}, + "chipActionShowCollection": "在收藏品中顯示", + "@chipActionShowCollection": {}, + "explorerPageTitle": "檔案總管", + "@explorerPageTitle": {}, + "chipActionGoToExplorerPage": "在檔案總管裡顯示", + "@chipActionGoToExplorerPage": {}, + "mapAttributionOsmData": "地圖資料由 © [OpenStreetMap](https://www.openstreetmap.org/copyright) 貢獻", + "@mapAttributionOsmData": {}, + "chipActionDecompose": "分割", + "@chipActionDecompose": {}, + "albumTierDynamic": "動態", + "@albumTierDynamic": {}, + "chipActionRemove": "移除", + "@chipActionRemove": {}, + "editEntryLocationDialogImportGpx": "匯入 GPX", + "@editEntryLocationDialogImportGpx": {}, + "editEntryLocationDialogTimeShift": "時光平移", + "@editEntryLocationDialogTimeShift": {}, + "videoActionShowPreviousFrame": "顯示前一幀", + "@videoActionShowPreviousFrame": {}, + "videoActionShowNextFrame": "顯示下一幀", + "@videoActionShowNextFrame": {}, + "mapAttributionOsmLiberty": "地圖由 [OpenMapTiles](https://www.openmaptiles.org/) 所提供,以 [CC BY](http://creativecommons.org/licenses/by/4.0) 授權 • 托管於 [OSM Americana](https://tile.ourmap.us)", + "@mapAttributionOsmLiberty": {}, + "newDynamicAlbumDialogTitle": "新動態相簿", + "@newDynamicAlbumDialogTitle": {}, + "sortOrderShortestFirst": "先短後長", + "@sortOrderShortestFirst": {}, + "appExportDynamicAlbums": "動態相簿", + "@appExportDynamicAlbums": {}, + "coordinateFormatDdm": "度分十進制", + "@coordinateFormatDdm": {}, + "newAlbumDialogAlbumAlreadyExistsHelper": "相簿已經存在", + "@newAlbumDialogAlbumAlreadyExistsHelper": {}, + "dynamicAlbumAlreadyExists": "動態相簿已經存在", + "@dynamicAlbumAlreadyExists": {}, + "collectionActionAddDynamicAlbum": "新增動態相簿", + "@collectionActionAddDynamicAlbum": {}, + "sortOrderLongestFirst": "先長後短", + "@sortOrderLongestFirst": {}, + "setHomeCustom": "自定義", + "@setHomeCustom": {}, + "removeEntryMetadataDialogAll": "全部", + "@removeEntryMetadataDialogAll": {}, + "explorerActionSelectStorageVolume": "選擇儲存位置", + "@explorerActionSelectStorageVolume": {}, + "selectStorageVolumeDialogTitle": "選擇儲存位置", + "@selectStorageVolumeDialogTitle": {}, + "mapStyleOsmLiberty": "OSM Liberty", + "@mapStyleOsmLiberty": {}, + "mapStyleOpenTopoMap": "OpenTopoMap", + "@mapStyleOpenTopoMap": {}, + "mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | 地圖由 [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)", + "@mapAttributionOpenTopoMap": {}, + "sortByDuration": "按時長", + "@sortByDuration": {}, + "createButtonLabel": "建立", + "@createButtonLabel": {}, + "chipActionGroup": "更改分組", + "@chipActionGroup": {}, + "chipActionCreateGroup": "建立分組", + "@chipActionCreateGroup": {}, + "albumTierGroups": "組", + "@albumTierGroups": {}, + "newGroupDialogTitle": "新建組", + "@newGroupDialogTitle": {}, + "newGroupDialogNameLabel": "新組名稱", + "@newGroupDialogNameLabel": {}, + "groupAlreadyExists": "組已存在", + "@groupAlreadyExists": {}, + "groupEmpty": "沒有組", + "@groupEmpty": {}, + "ungrouped": "未分組", + "@ungrouped": {}, + "groupPickerTitle": "挑選組", + "@groupPickerTitle": {}, + "groupPickerUseThisGroupButton": "使用該組", + "@groupPickerUseThisGroupButton": {}, + "sectionNone": "沒有分區", + "@sectionNone": {}, + "sortByPath": "依路徑", + "@sortByPath": {}, + "tagPickPageTitle": "選擇標籤", + "@tagPickPageTitle": {}, + "searchFormatSectionTitle": "格式", + "@searchFormatSectionTitle": {}, + "settingsNavigationBottomActionsTile": "底部導航", + "@settingsNavigationBottomActionsTile": {}, + "settingsNavigationBottomActionEditorPageTitle": "底部導航", + "@settingsNavigationBottomActionEditorPageTitle": {}, + "settingsNavigationBottomActionEditorBanner": "長按以移動按鈕,并選擇在底部導航欄中顯示哪些操作。", + "@settingsNavigationBottomActionEditorBanner": {}, + "mapStyleDialogAddStyle": "添加樣式", + "@mapStyleDialogAddStyle": {}, + "mapStyleEditorDialogName": "名稱", + "@mapStyleEditorDialogName": {}, + "mapStyleEditorDialogUrl": "URL", + "@mapStyleEditorDialogUrl": {}, + "mapStyleEditorDialogSubdomains": "子域名", + "@mapStyleEditorDialogSubdomains": {}, + "mapStyleEditorDialogUserAgent": "用戶代理(UA)", + "@mapStyleEditorDialogUserAgent": {}, + "settingsViewerShowZoomLevel": "顯示縮放等級", + "@settingsViewerShowZoomLevel": {} +} diff --git a/lib/l10n/l10n.dart b/lib/l10n/l10n.dart new file mode 100644 index 0000000..3c45ea7 --- /dev/null +++ b/lib/l10n/l10n.dart @@ -0,0 +1 @@ +export 'package:aves/l10ngen/app_localizations.dart'; diff --git a/lib/l10ngen/.gitkeep b/lib/l10ngen/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/lib/l10ngen/app_localizations.dart b/lib/l10ngen/app_localizations.dart new file mode 100644 index 0000000..7710b3f --- /dev/null +++ b/lib/l10ngen/app_localizations.dart @@ -0,0 +1,4758 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:intl/intl.dart' as intl; + +import 'app_localizations_ar.dart'; +import 'app_localizations_az.dart'; +import 'app_localizations_be.dart'; +import 'app_localizations_bg.dart'; +import 'app_localizations_bn.dart'; +import 'app_localizations_ca.dart'; +import 'app_localizations_ckb.dart'; +import 'app_localizations_cs.dart'; +import 'app_localizations_da.dart'; +import 'app_localizations_de.dart'; +import 'app_localizations_el.dart'; +import 'app_localizations_en.dart'; +import 'app_localizations_es.dart'; +import 'app_localizations_et.dart'; +import 'app_localizations_eu.dart'; +import 'app_localizations_fa.dart'; +import 'app_localizations_fi.dart'; +import 'app_localizations_fr.dart'; +import 'app_localizations_gl.dart'; +import 'app_localizations_he.dart'; +import 'app_localizations_hi.dart'; +import 'app_localizations_hr.dart'; +import 'app_localizations_hu.dart'; +import 'app_localizations_id.dart'; +import 'app_localizations_is.dart'; +import 'app_localizations_it.dart'; +import 'app_localizations_ja.dart'; +import 'app_localizations_kmr.dart'; +import 'app_localizations_kn.dart'; +import 'app_localizations_ko.dart'; +import 'app_localizations_lt.dart'; +import 'app_localizations_ml.dart'; +import 'app_localizations_my.dart'; +import 'app_localizations_nb.dart'; +import 'app_localizations_ne.dart'; +import 'app_localizations_nl.dart'; +import 'app_localizations_nn.dart'; +import 'app_localizations_or.dart'; +import 'app_localizations_pl.dart'; +import 'app_localizations_pt.dart'; +import 'app_localizations_ro.dart'; +import 'app_localizations_ru.dart'; +import 'app_localizations_sat.dart'; +import 'app_localizations_sk.dart'; +import 'app_localizations_sl.dart'; +import 'app_localizations_sr.dart'; +import 'app_localizations_sv.dart'; +import 'app_localizations_ta.dart'; +import 'app_localizations_th.dart'; +import 'app_localizations_tr.dart'; +import 'app_localizations_uk.dart'; +import 'app_localizations_ur.dart'; +import 'app_localizations_vi.dart'; +import 'app_localizations_zh.dart'; + +// ignore_for_file: type=lint + +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. +/// +/// Applications need to include `AppLocalizations.delegate()` in their app's +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: +/// +/// ```dart +/// import 'l10ngen/app_localizations.dart'; +/// +/// return MaterialApp( +/// localizationsDelegates: AppLocalizations.localizationsDelegates, +/// supportedLocales: AppLocalizations.supportedLocales, +/// home: MyApplicationHome(), +/// ); +/// ``` +/// +/// ## Update pubspec.yaml +/// +/// Please make sure to update your pubspec.yaml to include the following +/// packages: +/// +/// ```yaml +/// dependencies: +/// # Internationalization support. +/// flutter_localizations: +/// sdk: flutter +/// intl: any # Use the pinned version from flutter_localizations +/// +/// # Rest of dependencies +/// ``` +/// +/// ## iOS Applications +/// +/// iOS applications define key application metadata, including supported +/// locales, in an Info.plist file that is built into the application bundle. +/// To configure the locales supported by your app, you’ll need to edit this +/// file. +/// +/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. +/// Then, in the Project Navigator, open the Info.plist file under the Runner +/// project’s Runner folder. +/// +/// Next, select the Information Property List item, select Add Item from the +/// Editor menu, then select Localizations from the pop-up menu. +/// +/// Select and expand the newly-created Localizations item then, for each +/// locale your application supports, add a new item and select the locale +/// you wish to add from the pop-up menu in the Value field. This list should +/// be consistent with the languages listed in the AppLocalizations.supportedLocales +/// property. +abstract class AppLocalizations { + AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + + final String localeName; + + static AppLocalizations? of(BuildContext context) { + return Localizations.of<AppLocalizations>(context, AppLocalizations); + } + + static const LocalizationsDelegate<AppLocalizations> delegate = _AppLocalizationsDelegate(); + + /// A list of this localizations delegate along with the default localizations + /// delegates. + /// + /// Returns a list of localizations delegates containing this delegate along with + /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, + /// and GlobalWidgetsLocalizations.delegate. + /// + /// Additional delegates can be added by appending to this list in + /// MaterialApp. This list does not have to be used at all if a custom list + /// of delegates is preferred or required. + static const List<LocalizationsDelegate<dynamic>> localizationsDelegates = <LocalizationsDelegate<dynamic>>[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; + + /// A list of this localizations delegate's supported locales. + static const List<Locale> supportedLocales = <Locale>[ + Locale('en'), + Locale('ar'), + Locale('az'), + Locale('be'), + Locale('bg'), + Locale('bn'), + Locale('ca'), + Locale('ckb'), + Locale('cs'), + Locale('da'), + Locale('de'), + Locale('el'), + Locale.fromSubtags(languageCode: 'en', scriptCode: 'Shaw'), + Locale('es'), + Locale('et'), + Locale('eu'), + Locale('fa'), + Locale('fi'), + Locale('fr'), + Locale('gl'), + Locale('he'), + Locale('hi'), + Locale('hr'), + Locale('hu'), + Locale('id'), + Locale('is'), + Locale('it'), + Locale('ja'), + Locale('kmr'), + Locale('kn'), + Locale('ko'), + Locale('lt'), + Locale('ml'), + Locale('my'), + Locale('nb'), + Locale('ne'), + Locale('nl'), + Locale('nn'), + Locale('or'), + Locale('pl'), + Locale('pt'), + Locale('ro'), + Locale('ru'), + Locale('sat'), + Locale('sk'), + Locale('sl'), + Locale('sr'), + Locale('sv'), + Locale('ta'), + Locale('th'), + Locale('tr'), + Locale('uk'), + Locale('ur'), + Locale('vi'), + Locale('zh'), + Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant'), + ]; + + /// No description provided for @appName. + /// + /// In en, this message translates to: + /// **'Aves'** + String get appName; + + /// No description provided for @welcomeMessage. + /// + /// In en, this message translates to: + /// **'Welcome to Aves'** + String get welcomeMessage; + + /// No description provided for @welcomeOptional. + /// + /// In en, this message translates to: + /// **'Optional'** + String get welcomeOptional; + + /// No description provided for @welcomeTermsToggle. + /// + /// In en, this message translates to: + /// **'I agree to the terms and conditions'** + String get welcomeTermsToggle; + + /// No description provided for @itemCount. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{{count} item} other{{count} items}}'** + String itemCount(int count); + + /// No description provided for @columnCount. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{{count} column} other{{count} columns}}'** + String columnCount(int count); + + /// No description provided for @timeSeconds. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{{count} second} other{{count} seconds}}'** + String timeSeconds(int count); + + /// No description provided for @timeMinutes. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{{count} minute} other{{count} minutes}}'** + String timeMinutes(int count); + + /// No description provided for @timeDays. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{{count} day} other{{count} days}}'** + String timeDays(int count); + + /// No description provided for @focalLength. + /// + /// In en, this message translates to: + /// **'{length} mm'** + String focalLength(String length); + + /// No description provided for @applyButtonLabel. + /// + /// In en, this message translates to: + /// **'APPLY'** + String get applyButtonLabel; + + /// No description provided for @createButtonLabel. + /// + /// In en, this message translates to: + /// **'CREATE'** + String get createButtonLabel; + + /// No description provided for @deleteButtonLabel. + /// + /// In en, this message translates to: + /// **'DELETE'** + String get deleteButtonLabel; + + /// No description provided for @nextButtonLabel. + /// + /// In en, this message translates to: + /// **'NEXT'** + String get nextButtonLabel; + + /// No description provided for @showButtonLabel. + /// + /// In en, this message translates to: + /// **'SHOW'** + String get showButtonLabel; + + /// No description provided for @hideButtonLabel. + /// + /// In en, this message translates to: + /// **'HIDE'** + String get hideButtonLabel; + + /// No description provided for @continueButtonLabel. + /// + /// In en, this message translates to: + /// **'CONTINUE'** + String get continueButtonLabel; + + /// No description provided for @saveCopyButtonLabel. + /// + /// In en, this message translates to: + /// **'SAVE COPY'** + String get saveCopyButtonLabel; + + /// No description provided for @applyTooltip. + /// + /// In en, this message translates to: + /// **'Apply'** + String get applyTooltip; + + /// No description provided for @cancelTooltip. + /// + /// In en, this message translates to: + /// **'Cancel'** + String get cancelTooltip; + + /// No description provided for @changeTooltip. + /// + /// In en, this message translates to: + /// **'Change'** + String get changeTooltip; + + /// No description provided for @clearTooltip. + /// + /// In en, this message translates to: + /// **'Clear'** + String get clearTooltip; + + /// No description provided for @previousTooltip. + /// + /// In en, this message translates to: + /// **'Previous'** + String get previousTooltip; + + /// No description provided for @nextTooltip. + /// + /// In en, this message translates to: + /// **'Next'** + String get nextTooltip; + + /// No description provided for @showTooltip. + /// + /// In en, this message translates to: + /// **'Show'** + String get showTooltip; + + /// No description provided for @hideTooltip. + /// + /// In en, this message translates to: + /// **'Hide'** + String get hideTooltip; + + /// No description provided for @actionRemove. + /// + /// In en, this message translates to: + /// **'Remove'** + String get actionRemove; + + /// No description provided for @resetTooltip. + /// + /// In en, this message translates to: + /// **'Reset'** + String get resetTooltip; + + /// No description provided for @saveTooltip. + /// + /// In en, this message translates to: + /// **'Save'** + String get saveTooltip; + + /// No description provided for @stopTooltip. + /// + /// In en, this message translates to: + /// **'Stop'** + String get stopTooltip; + + /// No description provided for @pickTooltip. + /// + /// In en, this message translates to: + /// **'Pick'** + String get pickTooltip; + + /// No description provided for @doubleBackExitMessage. + /// + /// In en, this message translates to: + /// **'Tap “back” again to exit.'** + String get doubleBackExitMessage; + + /// No description provided for @doNotAskAgain. + /// + /// In en, this message translates to: + /// **'Do not ask again'** + String get doNotAskAgain; + + /// No description provided for @sourceStateLoading. + /// + /// In en, this message translates to: + /// **'Loading'** + String get sourceStateLoading; + + /// No description provided for @sourceStateCataloguing. + /// + /// In en, this message translates to: + /// **'Cataloguing'** + String get sourceStateCataloguing; + + /// No description provided for @sourceStateLocatingCountries. + /// + /// In en, this message translates to: + /// **'Locating countries'** + String get sourceStateLocatingCountries; + + /// No description provided for @sourceStateLocatingPlaces. + /// + /// In en, this message translates to: + /// **'Locating places'** + String get sourceStateLocatingPlaces; + + /// No description provided for @chipActionDelete. + /// + /// In en, this message translates to: + /// **'Delete'** + String get chipActionDelete; + + /// No description provided for @chipActionRemove. + /// + /// In en, this message translates to: + /// **'Remove'** + String get chipActionRemove; + + /// No description provided for @chipActionShowCollection. + /// + /// In en, this message translates to: + /// **'Show in Collection'** + String get chipActionShowCollection; + + /// No description provided for @chipActionGoToAlbumPage. + /// + /// In en, this message translates to: + /// **'Show in Albums'** + String get chipActionGoToAlbumPage; + + /// No description provided for @chipActionGoToCountryPage. + /// + /// In en, this message translates to: + /// **'Show in Countries'** + String get chipActionGoToCountryPage; + + /// No description provided for @chipActionGoToPlacePage. + /// + /// In en, this message translates to: + /// **'Show in Places'** + String get chipActionGoToPlacePage; + + /// No description provided for @chipActionGoToTagPage. + /// + /// In en, this message translates to: + /// **'Show in Tags'** + String get chipActionGoToTagPage; + + /// No description provided for @chipActionGoToExplorerPage. + /// + /// In en, this message translates to: + /// **'Show in Explorer'** + String get chipActionGoToExplorerPage; + + /// No description provided for @chipActionDecompose. + /// + /// In en, this message translates to: + /// **'Split'** + String get chipActionDecompose; + + /// No description provided for @chipActionFilterOut. + /// + /// In en, this message translates to: + /// **'Filter out'** + String get chipActionFilterOut; + + /// No description provided for @chipActionFilterIn. + /// + /// In en, this message translates to: + /// **'Filter in'** + String get chipActionFilterIn; + + /// No description provided for @chipActionHide. + /// + /// In en, this message translates to: + /// **'Hide'** + String get chipActionHide; + + /// No description provided for @chipActionLock. + /// + /// In en, this message translates to: + /// **'Lock'** + String get chipActionLock; + + /// No description provided for @chipActionPin. + /// + /// In en, this message translates to: + /// **'Pin to top'** + String get chipActionPin; + + /// No description provided for @chipActionUnpin. + /// + /// In en, this message translates to: + /// **'Unpin from top'** + String get chipActionUnpin; + + /// No description provided for @chipActionGroup. + /// + /// In en, this message translates to: + /// **'Change grouping'** + String get chipActionGroup; + + /// No description provided for @chipActionRename. + /// + /// In en, this message translates to: + /// **'Rename'** + String get chipActionRename; + + /// No description provided for @chipActionSetCover. + /// + /// In en, this message translates to: + /// **'Set cover'** + String get chipActionSetCover; + + /// No description provided for @chipActionShowCountryStates. + /// + /// In en, this message translates to: + /// **'Show states'** + String get chipActionShowCountryStates; + + /// No description provided for @chipActionCreateGroup. + /// + /// In en, this message translates to: + /// **'Create group'** + String get chipActionCreateGroup; + + /// No description provided for @chipActionCreateAlbum. + /// + /// In en, this message translates to: + /// **'Create album'** + String get chipActionCreateAlbum; + + /// No description provided for @chipActionCreateVault. + /// + /// In en, this message translates to: + /// **'Create vault'** + String get chipActionCreateVault; + + /// No description provided for @chipActionConfigureVault. + /// + /// In en, this message translates to: + /// **'Configure vault'** + String get chipActionConfigureVault; + + /// No description provided for @entryActionCopyToClipboard. + /// + /// In en, this message translates to: + /// **'Copy to clipboard'** + String get entryActionCopyToClipboard; + + /// No description provided for @entryActionDelete. + /// + /// In en, this message translates to: + /// **'Delete'** + String get entryActionDelete; + + /// No description provided for @entryActionConvert. + /// + /// In en, this message translates to: + /// **'Convert'** + String get entryActionConvert; + + /// No description provided for @entryActionExport. + /// + /// In en, this message translates to: + /// **'Export'** + String get entryActionExport; + + /// No description provided for @entryActionInfo. + /// + /// In en, this message translates to: + /// **'Info'** + String get entryActionInfo; + + /// No description provided for @entryActionRename. + /// + /// In en, this message translates to: + /// **'Rename'** + String get entryActionRename; + + /// No description provided for @entryActionRestore. + /// + /// In en, this message translates to: + /// **'Restore'** + String get entryActionRestore; + + /// No description provided for @entryActionRotateCCW. + /// + /// In en, this message translates to: + /// **'Rotate counterclockwise'** + String get entryActionRotateCCW; + + /// No description provided for @entryActionRotateCW. + /// + /// In en, this message translates to: + /// **'Rotate clockwise'** + String get entryActionRotateCW; + + /// No description provided for @entryActionFlip. + /// + /// In en, this message translates to: + /// **'Flip horizontally'** + String get entryActionFlip; + + /// No description provided for @entryActionPrint. + /// + /// In en, this message translates to: + /// **'Print'** + String get entryActionPrint; + + /// No description provided for @entryActionShare. + /// + /// In en, this message translates to: + /// **'Share'** + String get entryActionShare; + + /// No description provided for @entryActionShareImageOnly. + /// + /// In en, this message translates to: + /// **'Share image only'** + String get entryActionShareImageOnly; + + /// No description provided for @entryActionShareVideoOnly. + /// + /// In en, this message translates to: + /// **'Share video only'** + String get entryActionShareVideoOnly; + + /// No description provided for @entryActionViewSource. + /// + /// In en, this message translates to: + /// **'View source'** + String get entryActionViewSource; + + /// No description provided for @entryActionShowGeoTiffOnMap. + /// + /// In en, this message translates to: + /// **'Show as map overlay'** + String get entryActionShowGeoTiffOnMap; + + /// No description provided for @entryActionConvertMotionPhotoToStillImage. + /// + /// In en, this message translates to: + /// **'Convert to still image'** + String get entryActionConvertMotionPhotoToStillImage; + + /// No description provided for @entryActionViewMotionPhotoVideo. + /// + /// In en, this message translates to: + /// **'Open video'** + String get entryActionViewMotionPhotoVideo; + + /// No description provided for @entryActionEdit. + /// + /// In en, this message translates to: + /// **'Edit'** + String get entryActionEdit; + + /// No description provided for @entryActionOpen. + /// + /// In en, this message translates to: + /// **'Open with'** + String get entryActionOpen; + + /// No description provided for @entryActionSetAs. + /// + /// In en, this message translates to: + /// **'Set as'** + String get entryActionSetAs; + + /// No description provided for @entryActionCast. + /// + /// In en, this message translates to: + /// **'Cast'** + String get entryActionCast; + + /// No description provided for @entryActionOpenMap. + /// + /// In en, this message translates to: + /// **'Show in map app'** + String get entryActionOpenMap; + + /// No description provided for @entryActionRotateScreen. + /// + /// In en, this message translates to: + /// **'Rotate screen'** + String get entryActionRotateScreen; + + /// No description provided for @entryActionAddFavourite. + /// + /// In en, this message translates to: + /// **'Add to favorites'** + String get entryActionAddFavourite; + + /// No description provided for @entryActionRemoveFavourite. + /// + /// In en, this message translates to: + /// **'Remove from favorites'** + String get entryActionRemoveFavourite; + + /// No description provided for @videoActionCaptureFrame. + /// + /// In en, this message translates to: + /// **'Capture frame'** + String get videoActionCaptureFrame; + + /// No description provided for @videoActionMute. + /// + /// In en, this message translates to: + /// **'Mute'** + String get videoActionMute; + + /// No description provided for @videoActionUnmute. + /// + /// In en, this message translates to: + /// **'Unmute'** + String get videoActionUnmute; + + /// No description provided for @videoActionPause. + /// + /// In en, this message translates to: + /// **'Pause'** + String get videoActionPause; + + /// No description provided for @videoActionPlay. + /// + /// In en, this message translates to: + /// **'Play'** + String get videoActionPlay; + + /// No description provided for @videoActionReplay10. + /// + /// In en, this message translates to: + /// **'Seek backward 10 seconds'** + String get videoActionReplay10; + + /// No description provided for @videoActionSkip10. + /// + /// In en, this message translates to: + /// **'Seek forward 10 seconds'** + String get videoActionSkip10; + + /// No description provided for @videoActionShowPreviousFrame. + /// + /// In en, this message translates to: + /// **'Show previous frame'** + String get videoActionShowPreviousFrame; + + /// No description provided for @videoActionShowNextFrame. + /// + /// In en, this message translates to: + /// **'Show next frame'** + String get videoActionShowNextFrame; + + /// No description provided for @videoActionSelectStreams. + /// + /// In en, this message translates to: + /// **'Select tracks'** + String get videoActionSelectStreams; + + /// No description provided for @videoActionSetSpeed. + /// + /// In en, this message translates to: + /// **'Playback speed'** + String get videoActionSetSpeed; + + /// No description provided for @videoActionABRepeat. + /// + /// In en, this message translates to: + /// **'A-B repeat'** + String get videoActionABRepeat; + + /// No description provided for @videoRepeatActionSetStart. + /// + /// In en, this message translates to: + /// **'Set start'** + String get videoRepeatActionSetStart; + + /// No description provided for @videoRepeatActionSetEnd. + /// + /// In en, this message translates to: + /// **'Set end'** + String get videoRepeatActionSetEnd; + + /// No description provided for @viewerActionSettings. + /// + /// In en, this message translates to: + /// **'Settings'** + String get viewerActionSettings; + + /// No description provided for @viewerActionLock. + /// + /// In en, this message translates to: + /// **'Lock viewer'** + String get viewerActionLock; + + /// No description provided for @viewerActionUnlock. + /// + /// In en, this message translates to: + /// **'Unlock viewer'** + String get viewerActionUnlock; + + /// No description provided for @slideshowActionResume. + /// + /// In en, this message translates to: + /// **'Resume'** + String get slideshowActionResume; + + /// No description provided for @slideshowActionShowInCollection. + /// + /// In en, this message translates to: + /// **'Show in Collection'** + String get slideshowActionShowInCollection; + + /// No description provided for @entryInfoActionEditDate. + /// + /// In en, this message translates to: + /// **'Edit date & time'** + String get entryInfoActionEditDate; + + /// No description provided for @entryInfoActionEditLocation. + /// + /// In en, this message translates to: + /// **'Edit location'** + String get entryInfoActionEditLocation; + + /// No description provided for @entryInfoActionEditTitleDescription. + /// + /// In en, this message translates to: + /// **'Edit title & description'** + String get entryInfoActionEditTitleDescription; + + /// No description provided for @entryInfoActionEditRating. + /// + /// In en, this message translates to: + /// **'Edit rating'** + String get entryInfoActionEditRating; + + /// No description provided for @entryInfoActionEditTags. + /// + /// In en, this message translates to: + /// **'Edit tags'** + String get entryInfoActionEditTags; + + /// No description provided for @entryInfoActionRemoveMetadata. + /// + /// In en, this message translates to: + /// **'Remove metadata'** + String get entryInfoActionRemoveMetadata; + + /// No description provided for @entryInfoActionExportMetadata. + /// + /// In en, this message translates to: + /// **'Export metadata'** + String get entryInfoActionExportMetadata; + + /// No description provided for @entryInfoActionRemoveLocation. + /// + /// In en, this message translates to: + /// **'Remove location'** + String get entryInfoActionRemoveLocation; + + /// No description provided for @editorActionTransform. + /// + /// In en, this message translates to: + /// **'Transform'** + String get editorActionTransform; + + /// No description provided for @editorTransformCrop. + /// + /// In en, this message translates to: + /// **'Crop'** + String get editorTransformCrop; + + /// No description provided for @editorTransformRotate. + /// + /// In en, this message translates to: + /// **'Rotate'** + String get editorTransformRotate; + + /// No description provided for @cropAspectRatioFree. + /// + /// In en, this message translates to: + /// **'Free'** + String get cropAspectRatioFree; + + /// No description provided for @cropAspectRatioOriginal. + /// + /// In en, this message translates to: + /// **'Original'** + String get cropAspectRatioOriginal; + + /// No description provided for @cropAspectRatioSquare. + /// + /// In en, this message translates to: + /// **'Square'** + String get cropAspectRatioSquare; + + /// No description provided for @filterAspectRatioLandscapeLabel. + /// + /// In en, this message translates to: + /// **'Landscape'** + String get filterAspectRatioLandscapeLabel; + + /// No description provided for @filterAspectRatioPortraitLabel. + /// + /// In en, this message translates to: + /// **'Portrait'** + String get filterAspectRatioPortraitLabel; + + /// No description provided for @filterBinLabel. + /// + /// In en, this message translates to: + /// **'Recycle bin'** + String get filterBinLabel; + + /// No description provided for @filterFavouriteLabel. + /// + /// In en, this message translates to: + /// **'Favorite'** + String get filterFavouriteLabel; + + /// No description provided for @filterNoDateLabel. + /// + /// In en, this message translates to: + /// **'Undated'** + String get filterNoDateLabel; + + /// No description provided for @filterNoAddressLabel. + /// + /// In en, this message translates to: + /// **'No address'** + String get filterNoAddressLabel; + + /// No description provided for @filterLocatedLabel. + /// + /// In en, this message translates to: + /// **'Located'** + String get filterLocatedLabel; + + /// No description provided for @filterNoLocationLabel. + /// + /// In en, this message translates to: + /// **'Unlocated'** + String get filterNoLocationLabel; + + /// No description provided for @filterNoRatingLabel. + /// + /// In en, this message translates to: + /// **'Unrated'** + String get filterNoRatingLabel; + + /// No description provided for @filterTaggedLabel. + /// + /// In en, this message translates to: + /// **'Tagged'** + String get filterTaggedLabel; + + /// No description provided for @filterNoTagLabel. + /// + /// In en, this message translates to: + /// **'Untagged'** + String get filterNoTagLabel; + + /// No description provided for @filterNoTitleLabel. + /// + /// In en, this message translates to: + /// **'Untitled'** + String get filterNoTitleLabel; + + /// No description provided for @filterOnThisDayLabel. + /// + /// In en, this message translates to: + /// **'On this day'** + String get filterOnThisDayLabel; + + /// No description provided for @filterRecentlyAddedLabel. + /// + /// In en, this message translates to: + /// **'Recently added'** + String get filterRecentlyAddedLabel; + + /// No description provided for @filterRatingRejectedLabel. + /// + /// In en, this message translates to: + /// **'Rejected'** + String get filterRatingRejectedLabel; + + /// No description provided for @filterTypeAnimatedLabel. + /// + /// In en, this message translates to: + /// **'Animated'** + String get filterTypeAnimatedLabel; + + /// No description provided for @filterTypeMotionPhotoLabel. + /// + /// In en, this message translates to: + /// **'Motion Photo'** + String get filterTypeMotionPhotoLabel; + + /// No description provided for @filterTypePanoramaLabel. + /// + /// In en, this message translates to: + /// **'Panorama'** + String get filterTypePanoramaLabel; + + /// No description provided for @filterTypeRawLabel. + /// + /// In en, this message translates to: + /// **'Raw'** + String get filterTypeRawLabel; + + /// No description provided for @filterTypeSphericalVideoLabel. + /// + /// In en, this message translates to: + /// **'360° Video'** + String get filterTypeSphericalVideoLabel; + + /// No description provided for @filterTypeGeotiffLabel. + /// + /// In en, this message translates to: + /// **'GeoTIFF'** + String get filterTypeGeotiffLabel; + + /// No description provided for @filterMimeImageLabel. + /// + /// In en, this message translates to: + /// **'Image'** + String get filterMimeImageLabel; + + /// No description provided for @filterMimeVideoLabel. + /// + /// In en, this message translates to: + /// **'Video'** + String get filterMimeVideoLabel; + + /// No description provided for @accessibilityAnimationsRemove. + /// + /// In en, this message translates to: + /// **'Prevent screen effects'** + String get accessibilityAnimationsRemove; + + /// No description provided for @accessibilityAnimationsKeep. + /// + /// In en, this message translates to: + /// **'Keep screen effects'** + String get accessibilityAnimationsKeep; + + /// No description provided for @albumTierNew. + /// + /// In en, this message translates to: + /// **'New'** + String get albumTierNew; + + /// No description provided for @albumTierPinned. + /// + /// In en, this message translates to: + /// **'Pinned'** + String get albumTierPinned; + + /// No description provided for @albumTierGroups. + /// + /// In en, this message translates to: + /// **'Groups'** + String get albumTierGroups; + + /// No description provided for @albumTierSpecial. + /// + /// In en, this message translates to: + /// **'Common'** + String get albumTierSpecial; + + /// No description provided for @albumTierApps. + /// + /// In en, this message translates to: + /// **'Apps'** + String get albumTierApps; + + /// No description provided for @albumTierVaults. + /// + /// In en, this message translates to: + /// **'Vaults'** + String get albumTierVaults; + + /// No description provided for @albumTierDynamic. + /// + /// In en, this message translates to: + /// **'Dynamic'** + String get albumTierDynamic; + + /// No description provided for @albumTierRegular. + /// + /// In en, this message translates to: + /// **'Others'** + String get albumTierRegular; + + /// No description provided for @coordinateFormatDms. + /// + /// In en, this message translates to: + /// **'DMS'** + String get coordinateFormatDms; + + /// No description provided for @coordinateFormatDdm. + /// + /// In en, this message translates to: + /// **'DDM'** + String get coordinateFormatDdm; + + /// No description provided for @coordinateFormatDecimal. + /// + /// In en, this message translates to: + /// **'Decimal degrees'** + String get coordinateFormatDecimal; + + /// No description provided for @coordinateDms. + /// + /// In en, this message translates to: + /// **'{coordinate} {direction}'** + String coordinateDms(String coordinate, String direction); + + /// No description provided for @coordinateDmsNorth. + /// + /// In en, this message translates to: + /// **'N'** + String get coordinateDmsNorth; + + /// No description provided for @coordinateDmsSouth. + /// + /// In en, this message translates to: + /// **'S'** + String get coordinateDmsSouth; + + /// No description provided for @coordinateDmsEast. + /// + /// In en, this message translates to: + /// **'E'** + String get coordinateDmsEast; + + /// No description provided for @coordinateDmsWest. + /// + /// In en, this message translates to: + /// **'W'** + String get coordinateDmsWest; + + /// No description provided for @displayRefreshRatePreferHighest. + /// + /// In en, this message translates to: + /// **'Highest rate'** + String get displayRefreshRatePreferHighest; + + /// No description provided for @displayRefreshRatePreferLowest. + /// + /// In en, this message translates to: + /// **'Lowest rate'** + String get displayRefreshRatePreferLowest; + + /// No description provided for @keepScreenOnNever. + /// + /// In en, this message translates to: + /// **'Never'** + String get keepScreenOnNever; + + /// No description provided for @keepScreenOnVideoPlayback. + /// + /// In en, this message translates to: + /// **'During video playback'** + String get keepScreenOnVideoPlayback; + + /// No description provided for @keepScreenOnViewerOnly. + /// + /// In en, this message translates to: + /// **'Viewer page only'** + String get keepScreenOnViewerOnly; + + /// No description provided for @keepScreenOnAlways. + /// + /// In en, this message translates to: + /// **'Always'** + String get keepScreenOnAlways; + + /// No description provided for @lengthUnitPixel. + /// + /// In en, this message translates to: + /// **'px'** + String get lengthUnitPixel; + + /// No description provided for @lengthUnitPercent. + /// + /// In en, this message translates to: + /// **'%'** + String get lengthUnitPercent; + + /// No description provided for @mapStyleGoogleNormal. + /// + /// In en, this message translates to: + /// **'Google Maps'** + String get mapStyleGoogleNormal; + + /// No description provided for @mapStyleGoogleHybrid. + /// + /// In en, this message translates to: + /// **'Google Maps (Hybrid)'** + String get mapStyleGoogleHybrid; + + /// No description provided for @mapStyleGoogleTerrain. + /// + /// In en, this message translates to: + /// **'Google Maps (Terrain)'** + String get mapStyleGoogleTerrain; + + /// No description provided for @mapStyleOsmLiberty. + /// + /// In en, this message translates to: + /// **'OSM Liberty'** + String get mapStyleOsmLiberty; + + /// No description provided for @mapStyleOpenTopoMap. + /// + /// In en, this message translates to: + /// **'OpenTopoMap'** + String get mapStyleOpenTopoMap; + + /// No description provided for @mapStyleOsmHot. + /// + /// In en, this message translates to: + /// **'Humanitarian OSM'** + String get mapStyleOsmHot; + + /// No description provided for @mapStyleStamenWatercolor. + /// + /// In en, this message translates to: + /// **'Stamen Watercolor'** + String get mapStyleStamenWatercolor; + + /// No description provided for @maxBrightnessNever. + /// + /// In en, this message translates to: + /// **'Never'** + String get maxBrightnessNever; + + /// No description provided for @maxBrightnessAlways. + /// + /// In en, this message translates to: + /// **'Always'** + String get maxBrightnessAlways; + + /// No description provided for @nameConflictStrategyRename. + /// + /// In en, this message translates to: + /// **'Rename'** + String get nameConflictStrategyRename; + + /// No description provided for @nameConflictStrategyReplace. + /// + /// In en, this message translates to: + /// **'Replace'** + String get nameConflictStrategyReplace; + + /// No description provided for @nameConflictStrategySkip. + /// + /// In en, this message translates to: + /// **'Skip'** + String get nameConflictStrategySkip; + + /// No description provided for @overlayHistogramNone. + /// + /// In en, this message translates to: + /// **'None'** + String get overlayHistogramNone; + + /// No description provided for @overlayHistogramRGB. + /// + /// In en, this message translates to: + /// **'RGB'** + String get overlayHistogramRGB; + + /// No description provided for @overlayHistogramLuminance. + /// + /// In en, this message translates to: + /// **'Luminance'** + String get overlayHistogramLuminance; + + /// No description provided for @subtitlePositionTop. + /// + /// In en, this message translates to: + /// **'Top'** + String get subtitlePositionTop; + + /// No description provided for @subtitlePositionBottom. + /// + /// In en, this message translates to: + /// **'Bottom'** + String get subtitlePositionBottom; + + /// No description provided for @themeBrightnessLight. + /// + /// In en, this message translates to: + /// **'Light'** + String get themeBrightnessLight; + + /// No description provided for @themeBrightnessDark. + /// + /// In en, this message translates to: + /// **'Dark'** + String get themeBrightnessDark; + + /// No description provided for @themeBrightnessBlack. + /// + /// In en, this message translates to: + /// **'Black'** + String get themeBrightnessBlack; + + /// No description provided for @unitSystemMetric. + /// + /// In en, this message translates to: + /// **'Metric'** + String get unitSystemMetric; + + /// No description provided for @unitSystemImperial. + /// + /// In en, this message translates to: + /// **'Imperial'** + String get unitSystemImperial; + + /// No description provided for @vaultLockTypePattern. + /// + /// In en, this message translates to: + /// **'Pattern'** + String get vaultLockTypePattern; + + /// No description provided for @vaultLockTypePin. + /// + /// In en, this message translates to: + /// **'PIN'** + String get vaultLockTypePin; + + /// No description provided for @vaultLockTypePassword. + /// + /// In en, this message translates to: + /// **'Password'** + String get vaultLockTypePassword; + + /// No description provided for @settingsVideoEnablePip. + /// + /// In en, this message translates to: + /// **'Picture-in-picture'** + String get settingsVideoEnablePip; + + /// No description provided for @videoControlsPlayOutside. + /// + /// In en, this message translates to: + /// **'Open with other player'** + String get videoControlsPlayOutside; + + /// No description provided for @videoLoopModeNever. + /// + /// In en, this message translates to: + /// **'Never'** + String get videoLoopModeNever; + + /// No description provided for @videoLoopModeShortOnly. + /// + /// In en, this message translates to: + /// **'Short videos only'** + String get videoLoopModeShortOnly; + + /// No description provided for @videoLoopModeAlways. + /// + /// In en, this message translates to: + /// **'Always'** + String get videoLoopModeAlways; + + /// No description provided for @videoPlaybackSkip. + /// + /// In en, this message translates to: + /// **'Skip'** + String get videoPlaybackSkip; + + /// No description provided for @videoPlaybackMuted. + /// + /// In en, this message translates to: + /// **'Play muted'** + String get videoPlaybackMuted; + + /// No description provided for @videoPlaybackWithSound. + /// + /// In en, this message translates to: + /// **'Play with sound'** + String get videoPlaybackWithSound; + + /// No description provided for @videoResumptionModeNever. + /// + /// In en, this message translates to: + /// **'Never'** + String get videoResumptionModeNever; + + /// No description provided for @videoResumptionModeAlways. + /// + /// In en, this message translates to: + /// **'Always'** + String get videoResumptionModeAlways; + + /// No description provided for @viewerTransitionSlide. + /// + /// In en, this message translates to: + /// **'Slide'** + String get viewerTransitionSlide; + + /// No description provided for @viewerTransitionParallax. + /// + /// In en, this message translates to: + /// **'Parallax'** + String get viewerTransitionParallax; + + /// No description provided for @viewerTransitionFade. + /// + /// In en, this message translates to: + /// **'Fade'** + String get viewerTransitionFade; + + /// No description provided for @viewerTransitionZoomIn. + /// + /// In en, this message translates to: + /// **'Zoom in'** + String get viewerTransitionZoomIn; + + /// No description provided for @viewerTransitionNone. + /// + /// In en, this message translates to: + /// **'None'** + String get viewerTransitionNone; + + /// No description provided for @wallpaperTargetHome. + /// + /// In en, this message translates to: + /// **'Home screen'** + String get wallpaperTargetHome; + + /// No description provided for @wallpaperTargetLock. + /// + /// In en, this message translates to: + /// **'Lock screen'** + String get wallpaperTargetLock; + + /// No description provided for @wallpaperTargetHomeLock. + /// + /// In en, this message translates to: + /// **'Home and lock screens'** + String get wallpaperTargetHomeLock; + + /// No description provided for @widgetDisplayedItemRandom. + /// + /// In en, this message translates to: + /// **'Random'** + String get widgetDisplayedItemRandom; + + /// No description provided for @widgetDisplayedItemMostRecent. + /// + /// In en, this message translates to: + /// **'Most recent'** + String get widgetDisplayedItemMostRecent; + + /// No description provided for @widgetOpenPageHome. + /// + /// In en, this message translates to: + /// **'Open home'** + String get widgetOpenPageHome; + + /// No description provided for @widgetOpenPageCollection. + /// + /// In en, this message translates to: + /// **'Open collection'** + String get widgetOpenPageCollection; + + /// No description provided for @widgetOpenPageViewer. + /// + /// In en, this message translates to: + /// **'Open viewer'** + String get widgetOpenPageViewer; + + /// No description provided for @widgetTapUpdateWidget. + /// + /// In en, this message translates to: + /// **'Update widget'** + String get widgetTapUpdateWidget; + + /// No description provided for @storageVolumeDescriptionFallbackPrimary. + /// + /// In en, this message translates to: + /// **'Internal storage'** + String get storageVolumeDescriptionFallbackPrimary; + + /// No description provided for @storageVolumeDescriptionFallbackNonPrimary. + /// + /// In en, this message translates to: + /// **'SD card'** + String get storageVolumeDescriptionFallbackNonPrimary; + + /// No description provided for @rootDirectoryDescription. + /// + /// In en, this message translates to: + /// **'root directory'** + String get rootDirectoryDescription; + + /// No description provided for @otherDirectoryDescription. + /// + /// In en, this message translates to: + /// **'“{name}” directory'** + String otherDirectoryDescription(String name); + + /// No description provided for @storageAccessDialogMessage. + /// + /// In en, this message translates to: + /// **'Please select the {directory} of “{volume}” in the next screen to give this app access to it.'** + String storageAccessDialogMessage(String directory, String volume); + + /// No description provided for @restrictedAccessDialogMessage. + /// + /// In en, this message translates to: + /// **'This app is not allowed to modify files in the {directory} of “{volume}”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'** + String restrictedAccessDialogMessage(String directory, String volume); + + /// No description provided for @notEnoughSpaceDialogMessage. + /// + /// In en, this message translates to: + /// **'This operation needs {neededSize} of free space on “{volume}” to complete, but there is only {freeSize} left.'** + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume); + + /// No description provided for @missingSystemFilePickerDialogMessage. + /// + /// In en, this message translates to: + /// **'The system file picker is missing or disabled. Please enable it and try again.'** + String get missingSystemFilePickerDialogMessage; + + /// No description provided for @unsupportedTypeDialogMessage. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{This operation is not supported for items of the following type: {types}.} other{This operation is not supported for items of the following types: {types}.}}'** + String unsupportedTypeDialogMessage(int count, String types); + + /// No description provided for @nameConflictDialogSingleSourceMessage. + /// + /// In en, this message translates to: + /// **'Some files in the destination folder have the same name.'** + String get nameConflictDialogSingleSourceMessage; + + /// No description provided for @nameConflictDialogMultipleSourceMessage. + /// + /// In en, this message translates to: + /// **'Some files have the same name.'** + String get nameConflictDialogMultipleSourceMessage; + + /// No description provided for @addShortcutDialogLabel. + /// + /// In en, this message translates to: + /// **'Shortcut label'** + String get addShortcutDialogLabel; + + /// No description provided for @addShortcutButtonLabel. + /// + /// In en, this message translates to: + /// **'ADD'** + String get addShortcutButtonLabel; + + /// No description provided for @noMatchingAppDialogMessage. + /// + /// In en, this message translates to: + /// **'There are no apps that can handle this.'** + String get noMatchingAppDialogMessage; + + /// No description provided for @binEntriesConfirmationDialogMessage. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{Move this item to the recycle bin?} other{Move these {count} items to the recycle bin?}}'** + String binEntriesConfirmationDialogMessage(int count); + + /// No description provided for @deleteEntriesConfirmationDialogMessage. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{Delete this item?} other{Delete these {count} items?}}'** + String deleteEntriesConfirmationDialogMessage(int count); + + /// No description provided for @moveUndatedConfirmationDialogMessage. + /// + /// In en, this message translates to: + /// **'Save item dates before proceeding?'** + String get moveUndatedConfirmationDialogMessage; + + /// No description provided for @moveUndatedConfirmationDialogSetDate. + /// + /// In en, this message translates to: + /// **'Save dates'** + String get moveUndatedConfirmationDialogSetDate; + + /// No description provided for @videoResumeDialogMessage. + /// + /// In en, this message translates to: + /// **'Do you want to resume playing at {time}?'** + String videoResumeDialogMessage(String time); + + /// No description provided for @videoStartOverButtonLabel. + /// + /// In en, this message translates to: + /// **'START OVER'** + String get videoStartOverButtonLabel; + + /// No description provided for @videoResumeButtonLabel. + /// + /// In en, this message translates to: + /// **'RESUME'** + String get videoResumeButtonLabel; + + /// No description provided for @setCoverDialogLatest. + /// + /// In en, this message translates to: + /// **'Latest item'** + String get setCoverDialogLatest; + + /// No description provided for @setCoverDialogAuto. + /// + /// In en, this message translates to: + /// **'Auto'** + String get setCoverDialogAuto; + + /// No description provided for @setCoverDialogCustom. + /// + /// In en, this message translates to: + /// **'Custom'** + String get setCoverDialogCustom; + + /// No description provided for @hideFilterConfirmationDialogMessage. + /// + /// In en, this message translates to: + /// **'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'** + String get hideFilterConfirmationDialogMessage; + + /// No description provided for @newAlbumDialogTitle. + /// + /// In en, this message translates to: + /// **'New Album'** + String get newAlbumDialogTitle; + + /// No description provided for @newAlbumDialogNameLabel. + /// + /// In en, this message translates to: + /// **'Album name'** + String get newAlbumDialogNameLabel; + + /// No description provided for @newAlbumDialogAlbumAlreadyExistsHelper. + /// + /// In en, this message translates to: + /// **'Album already exists'** + String get newAlbumDialogAlbumAlreadyExistsHelper; + + /// No description provided for @newAlbumDialogNameLabelAlreadyExistsHelper. + /// + /// In en, this message translates to: + /// **'Directory already exists'** + String get newAlbumDialogNameLabelAlreadyExistsHelper; + + /// No description provided for @newAlbumDialogStorageLabel. + /// + /// In en, this message translates to: + /// **'Storage:'** + String get newAlbumDialogStorageLabel; + + /// No description provided for @newDynamicAlbumDialogTitle. + /// + /// In en, this message translates to: + /// **'New Dynamic Album'** + String get newDynamicAlbumDialogTitle; + + /// No description provided for @dynamicAlbumAlreadyExists. + /// + /// In en, this message translates to: + /// **'Dynamic album already exists'** + String get dynamicAlbumAlreadyExists; + + /// No description provided for @newGroupDialogTitle. + /// + /// In en, this message translates to: + /// **'New Group'** + String get newGroupDialogTitle; + + /// No description provided for @newGroupDialogNameLabel. + /// + /// In en, this message translates to: + /// **'Group name'** + String get newGroupDialogNameLabel; + + /// No description provided for @groupAlreadyExists. + /// + /// In en, this message translates to: + /// **'Group already exists'** + String get groupAlreadyExists; + + /// No description provided for @groupEmpty. + /// + /// In en, this message translates to: + /// **'No groups'** + String get groupEmpty; + + /// No description provided for @ungrouped. + /// + /// In en, this message translates to: + /// **'Ungrouped'** + String get ungrouped; + + /// No description provided for @groupPickerTitle. + /// + /// In en, this message translates to: + /// **'Pick Group'** + String get groupPickerTitle; + + /// No description provided for @groupPickerUseThisGroupButton. + /// + /// In en, this message translates to: + /// **'Use this group'** + String get groupPickerUseThisGroupButton; + + /// No description provided for @newVaultWarningDialogMessage. + /// + /// In en, this message translates to: + /// **'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'** + String get newVaultWarningDialogMessage; + + /// No description provided for @newVaultDialogTitle. + /// + /// In en, this message translates to: + /// **'New Vault'** + String get newVaultDialogTitle; + + /// No description provided for @configureVaultDialogTitle. + /// + /// In en, this message translates to: + /// **'Configure Vault'** + String get configureVaultDialogTitle; + + /// No description provided for @vaultDialogLockModeWhenScreenOff. + /// + /// In en, this message translates to: + /// **'Lock when screen turns off'** + String get vaultDialogLockModeWhenScreenOff; + + /// No description provided for @vaultDialogLockTypeLabel. + /// + /// In en, this message translates to: + /// **'Lock type'** + String get vaultDialogLockTypeLabel; + + /// No description provided for @patternDialogEnter. + /// + /// In en, this message translates to: + /// **'Enter pattern'** + String get patternDialogEnter; + + /// No description provided for @patternDialogConfirm. + /// + /// In en, this message translates to: + /// **'Confirm pattern'** + String get patternDialogConfirm; + + /// No description provided for @pinDialogEnter. + /// + /// In en, this message translates to: + /// **'Enter PIN'** + String get pinDialogEnter; + + /// No description provided for @pinDialogConfirm. + /// + /// In en, this message translates to: + /// **'Confirm PIN'** + String get pinDialogConfirm; + + /// No description provided for @passwordDialogEnter. + /// + /// In en, this message translates to: + /// **'Enter password'** + String get passwordDialogEnter; + + /// No description provided for @passwordDialogConfirm. + /// + /// In en, this message translates to: + /// **'Confirm password'** + String get passwordDialogConfirm; + + /// No description provided for @authenticateToConfigureVault. + /// + /// In en, this message translates to: + /// **'Authenticate to configure vault'** + String get authenticateToConfigureVault; + + /// No description provided for @authenticateToUnlockVault. + /// + /// In en, this message translates to: + /// **'Authenticate to unlock vault'** + String get authenticateToUnlockVault; + + /// No description provided for @vaultBinUsageDialogMessage. + /// + /// In en, this message translates to: + /// **'Some vaults are using the recycle bin.'** + String get vaultBinUsageDialogMessage; + + /// No description provided for @renameAlbumDialogLabel. + /// + /// In en, this message translates to: + /// **'New name'** + String get renameAlbumDialogLabel; + + /// No description provided for @renameAlbumDialogLabelAlreadyExistsHelper. + /// + /// In en, this message translates to: + /// **'Directory already exists'** + String get renameAlbumDialogLabelAlreadyExistsHelper; + + /// No description provided for @renameEntrySetPageTitle. + /// + /// In en, this message translates to: + /// **'Rename'** + String get renameEntrySetPageTitle; + + /// No description provided for @renameEntrySetPagePatternFieldLabel. + /// + /// In en, this message translates to: + /// **'Naming pattern'** + String get renameEntrySetPagePatternFieldLabel; + + /// No description provided for @renameEntrySetPageInsertTooltip. + /// + /// In en, this message translates to: + /// **'Insert field'** + String get renameEntrySetPageInsertTooltip; + + /// No description provided for @renameEntrySetPagePreviewSectionTitle. + /// + /// In en, this message translates to: + /// **'Preview'** + String get renameEntrySetPagePreviewSectionTitle; + + /// No description provided for @renameProcessorCounter. + /// + /// In en, this message translates to: + /// **'Counter'** + String get renameProcessorCounter; + + /// No description provided for @renameProcessorHash. + /// + /// In en, this message translates to: + /// **'Hash'** + String get renameProcessorHash; + + /// No description provided for @renameProcessorName. + /// + /// In en, this message translates to: + /// **'Name'** + String get renameProcessorName; + + /// No description provided for @deleteSingleAlbumConfirmationDialogMessage. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{Delete this album and the item in it?} other{Delete this album and the {count} items in it?}}'** + String deleteSingleAlbumConfirmationDialogMessage(int count); + + /// No description provided for @deleteMultiAlbumConfirmationDialogMessage. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{Delete these albums and the item in them?} other{Delete these albums and the {count} items in them?}}'** + String deleteMultiAlbumConfirmationDialogMessage(int count); + + /// No description provided for @exportEntryDialogFormat. + /// + /// In en, this message translates to: + /// **'Format:'** + String get exportEntryDialogFormat; + + /// No description provided for @exportEntryDialogWidth. + /// + /// In en, this message translates to: + /// **'Width'** + String get exportEntryDialogWidth; + + /// No description provided for @exportEntryDialogHeight. + /// + /// In en, this message translates to: + /// **'Height'** + String get exportEntryDialogHeight; + + /// No description provided for @exportEntryDialogQuality. + /// + /// In en, this message translates to: + /// **'Quality'** + String get exportEntryDialogQuality; + + /// No description provided for @exportEntryDialogWriteMetadata. + /// + /// In en, this message translates to: + /// **'Write metadata'** + String get exportEntryDialogWriteMetadata; + + /// No description provided for @renameEntryDialogLabel. + /// + /// In en, this message translates to: + /// **'New name'** + String get renameEntryDialogLabel; + + /// No description provided for @editEntryDialogCopyFromItem. + /// + /// In en, this message translates to: + /// **'Copy from other item'** + String get editEntryDialogCopyFromItem; + + /// No description provided for @editEntryDialogTargetFieldsHeader. + /// + /// In en, this message translates to: + /// **'Fields to modify'** + String get editEntryDialogTargetFieldsHeader; + + /// No description provided for @editEntryDateDialogTitle. + /// + /// In en, this message translates to: + /// **'Date & Time'** + String get editEntryDateDialogTitle; + + /// No description provided for @editEntryDateDialogSetCustom. + /// + /// In en, this message translates to: + /// **'Set custom date'** + String get editEntryDateDialogSetCustom; + + /// No description provided for @editEntryDateDialogCopyField. + /// + /// In en, this message translates to: + /// **'Copy from other date'** + String get editEntryDateDialogCopyField; + + /// No description provided for @editEntryDateDialogExtractFromTitle. + /// + /// In en, this message translates to: + /// **'Extract from title'** + String get editEntryDateDialogExtractFromTitle; + + /// No description provided for @editEntryDateDialogShift. + /// + /// In en, this message translates to: + /// **'Shift'** + String get editEntryDateDialogShift; + + /// No description provided for @editEntryDateDialogSourceFileModifiedDate. + /// + /// In en, this message translates to: + /// **'File modified date'** + String get editEntryDateDialogSourceFileModifiedDate; + + /// No description provided for @durationDialogHours. + /// + /// In en, this message translates to: + /// **'Hours'** + String get durationDialogHours; + + /// No description provided for @durationDialogMinutes. + /// + /// In en, this message translates to: + /// **'Minutes'** + String get durationDialogMinutes; + + /// No description provided for @durationDialogSeconds. + /// + /// In en, this message translates to: + /// **'Seconds'** + String get durationDialogSeconds; + + /// No description provided for @editEntryLocationDialogTitle. + /// + /// In en, this message translates to: + /// **'Location'** + String get editEntryLocationDialogTitle; + + /// No description provided for @editEntryLocationDialogSetCustom. + /// + /// In en, this message translates to: + /// **'Set custom location'** + String get editEntryLocationDialogSetCustom; + + /// No description provided for @editEntryLocationDialogChooseOnMap. + /// + /// In en, this message translates to: + /// **'Choose on map'** + String get editEntryLocationDialogChooseOnMap; + + /// No description provided for @editEntryLocationDialogImportGpx. + /// + /// In en, this message translates to: + /// **'Import GPX'** + String get editEntryLocationDialogImportGpx; + + /// No description provided for @editEntryLocationDialogLatitude. + /// + /// In en, this message translates to: + /// **'Latitude'** + String get editEntryLocationDialogLatitude; + + /// No description provided for @editEntryLocationDialogLongitude. + /// + /// In en, this message translates to: + /// **'Longitude'** + String get editEntryLocationDialogLongitude; + + /// No description provided for @editEntryLocationDialogTimeShift. + /// + /// In en, this message translates to: + /// **'Time shift'** + String get editEntryLocationDialogTimeShift; + + /// No description provided for @locationPickerUseThisLocationButton. + /// + /// In en, this message translates to: + /// **'Use this location'** + String get locationPickerUseThisLocationButton; + + /// No description provided for @editEntryRatingDialogTitle. + /// + /// In en, this message translates to: + /// **'Rating'** + String get editEntryRatingDialogTitle; + + /// No description provided for @removeEntryMetadataDialogTitle. + /// + /// In en, this message translates to: + /// **'Metadata Removal'** + String get removeEntryMetadataDialogTitle; + + /// No description provided for @removeEntryMetadataDialogAll. + /// + /// In en, this message translates to: + /// **'All'** + String get removeEntryMetadataDialogAll; + + /// No description provided for @removeEntryMetadataDialogMore. + /// + /// In en, this message translates to: + /// **'More'** + String get removeEntryMetadataDialogMore; + + /// No description provided for @removeEntryMetadataMotionPhotoXmpWarningDialogMessage. + /// + /// In en, this message translates to: + /// **'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'** + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage; + + /// No description provided for @videoSpeedDialogLabel. + /// + /// In en, this message translates to: + /// **'Playback speed'** + String get videoSpeedDialogLabel; + + /// No description provided for @videoStreamSelectionDialogVideo. + /// + /// In en, this message translates to: + /// **'Video'** + String get videoStreamSelectionDialogVideo; + + /// No description provided for @videoStreamSelectionDialogAudio. + /// + /// In en, this message translates to: + /// **'Audio'** + String get videoStreamSelectionDialogAudio; + + /// No description provided for @videoStreamSelectionDialogText. + /// + /// In en, this message translates to: + /// **'Subtitles'** + String get videoStreamSelectionDialogText; + + /// No description provided for @videoStreamSelectionDialogOff. + /// + /// In en, this message translates to: + /// **'Off'** + String get videoStreamSelectionDialogOff; + + /// No description provided for @videoStreamSelectionDialogTrack. + /// + /// In en, this message translates to: + /// **'Track'** + String get videoStreamSelectionDialogTrack; + + /// No description provided for @videoStreamSelectionDialogNoSelection. + /// + /// In en, this message translates to: + /// **'There are no other tracks.'** + String get videoStreamSelectionDialogNoSelection; + + /// No description provided for @genericSuccessFeedback. + /// + /// In en, this message translates to: + /// **'Done!'** + String get genericSuccessFeedback; + + /// No description provided for @genericFailureFeedback. + /// + /// In en, this message translates to: + /// **'Failed'** + String get genericFailureFeedback; + + /// No description provided for @genericDangerWarningDialogMessage. + /// + /// In en, this message translates to: + /// **'Are you sure?'** + String get genericDangerWarningDialogMessage; + + /// No description provided for @tooManyItemsErrorDialogMessage. + /// + /// In en, this message translates to: + /// **'Try again with fewer items.'** + String get tooManyItemsErrorDialogMessage; + + /// No description provided for @menuActionConfigureView. + /// + /// In en, this message translates to: + /// **'View'** + String get menuActionConfigureView; + + /// No description provided for @menuActionSelect. + /// + /// In en, this message translates to: + /// **'Select'** + String get menuActionSelect; + + /// No description provided for @menuActionSelectAll. + /// + /// In en, this message translates to: + /// **'Select all'** + String get menuActionSelectAll; + + /// No description provided for @menuActionSelectNone. + /// + /// In en, this message translates to: + /// **'Select none'** + String get menuActionSelectNone; + + /// No description provided for @menuActionMap. + /// + /// In en, this message translates to: + /// **'Map'** + String get menuActionMap; + + /// No description provided for @menuActionSlideshow. + /// + /// In en, this message translates to: + /// **'Slideshow'** + String get menuActionSlideshow; + + /// No description provided for @menuActionStats. + /// + /// In en, this message translates to: + /// **'Stats'** + String get menuActionStats; + + /// No description provided for @viewDialogSortSectionTitle. + /// + /// In en, this message translates to: + /// **'Sort'** + String get viewDialogSortSectionTitle; + + /// No description provided for @viewDialogGroupSectionTitle. + /// + /// In en, this message translates to: + /// **'Sections'** + String get viewDialogGroupSectionTitle; + + /// No description provided for @viewDialogLayoutSectionTitle. + /// + /// In en, this message translates to: + /// **'Layout'** + String get viewDialogLayoutSectionTitle; + + /// No description provided for @viewDialogReverseSortOrder. + /// + /// In en, this message translates to: + /// **'Reverse sort order'** + String get viewDialogReverseSortOrder; + + /// No description provided for @tileLayoutMosaic. + /// + /// In en, this message translates to: + /// **'Mosaic'** + String get tileLayoutMosaic; + + /// No description provided for @tileLayoutGrid. + /// + /// In en, this message translates to: + /// **'Grid'** + String get tileLayoutGrid; + + /// No description provided for @tileLayoutList. + /// + /// In en, this message translates to: + /// **'List'** + String get tileLayoutList; + + /// No description provided for @castDialogTitle. + /// + /// In en, this message translates to: + /// **'Cast Devices'** + String get castDialogTitle; + + /// No description provided for @coverDialogTabCover. + /// + /// In en, this message translates to: + /// **'Cover'** + String get coverDialogTabCover; + + /// No description provided for @coverDialogTabApp. + /// + /// In en, this message translates to: + /// **'App'** + String get coverDialogTabApp; + + /// No description provided for @coverDialogTabColor. + /// + /// In en, this message translates to: + /// **'Color'** + String get coverDialogTabColor; + + /// No description provided for @appPickDialogTitle. + /// + /// In en, this message translates to: + /// **'Pick App'** + String get appPickDialogTitle; + + /// No description provided for @appPickDialogNone. + /// + /// In en, this message translates to: + /// **'None'** + String get appPickDialogNone; + + /// No description provided for @aboutPageTitle. + /// + /// In en, this message translates to: + /// **'About'** + String get aboutPageTitle; + + /// No description provided for @aboutLinkLicense. + /// + /// In en, this message translates to: + /// **'License'** + String get aboutLinkLicense; + + /// No description provided for @aboutLinkPolicy. + /// + /// In en, this message translates to: + /// **'Privacy Policy'** + String get aboutLinkPolicy; + + /// No description provided for @aboutBugSectionTitle. + /// + /// In en, this message translates to: + /// **'Bug Report'** + String get aboutBugSectionTitle; + + /// No description provided for @aboutBugSaveLogInstruction. + /// + /// In en, this message translates to: + /// **'Save app logs to a file'** + String get aboutBugSaveLogInstruction; + + /// No description provided for @aboutBugCopyInfoInstruction. + /// + /// In en, this message translates to: + /// **'Copy system information'** + String get aboutBugCopyInfoInstruction; + + /// No description provided for @aboutBugCopyInfoButton. + /// + /// In en, this message translates to: + /// **'Copy'** + String get aboutBugCopyInfoButton; + + /// No description provided for @aboutBugReportInstruction. + /// + /// In en, this message translates to: + /// **'Report on GitHub with the logs and system information'** + String get aboutBugReportInstruction; + + /// No description provided for @aboutBugReportButton. + /// + /// In en, this message translates to: + /// **'Report'** + String get aboutBugReportButton; + + /// No description provided for @aboutDataUsageSectionTitle. + /// + /// In en, this message translates to: + /// **'Data Usage'** + String get aboutDataUsageSectionTitle; + + /// No description provided for @aboutDataUsageData. + /// + /// In en, this message translates to: + /// **'Data'** + String get aboutDataUsageData; + + /// No description provided for @aboutDataUsageCache. + /// + /// In en, this message translates to: + /// **'Cache'** + String get aboutDataUsageCache; + + /// No description provided for @aboutDataUsageDatabase. + /// + /// In en, this message translates to: + /// **'Database'** + String get aboutDataUsageDatabase; + + /// No description provided for @aboutDataUsageMisc. + /// + /// In en, this message translates to: + /// **'Misc'** + String get aboutDataUsageMisc; + + /// No description provided for @aboutDataUsageInternal. + /// + /// In en, this message translates to: + /// **'Internal'** + String get aboutDataUsageInternal; + + /// No description provided for @aboutDataUsageExternal. + /// + /// In en, this message translates to: + /// **'External'** + String get aboutDataUsageExternal; + + /// No description provided for @aboutDataUsageClearCache. + /// + /// In en, this message translates to: + /// **'Clear Cache'** + String get aboutDataUsageClearCache; + + /// No description provided for @aboutCreditsSectionTitle. + /// + /// In en, this message translates to: + /// **'Credits'** + String get aboutCreditsSectionTitle; + + /// No description provided for @aboutCreditsWorldAtlas1. + /// + /// In en, this message translates to: + /// **'This app uses a TopoJSON file from'** + String get aboutCreditsWorldAtlas1; + + /// No description provided for @aboutCreditsWorldAtlas2. + /// + /// In en, this message translates to: + /// **'under ISC License.'** + String get aboutCreditsWorldAtlas2; + + /// No description provided for @aboutTranslatorsSectionTitle. + /// + /// In en, this message translates to: + /// **'Translators'** + String get aboutTranslatorsSectionTitle; + + /// No description provided for @aboutLicensesSectionTitle. + /// + /// In en, this message translates to: + /// **'Open-Source Licenses'** + String get aboutLicensesSectionTitle; + + /// No description provided for @aboutLicensesBanner. + /// + /// In en, this message translates to: + /// **'This app uses the following open-source packages and libraries.'** + String get aboutLicensesBanner; + + /// No description provided for @aboutLicensesAndroidLibrariesSectionTitle. + /// + /// In en, this message translates to: + /// **'Android Libraries'** + String get aboutLicensesAndroidLibrariesSectionTitle; + + /// No description provided for @aboutLicensesFlutterPluginsSectionTitle. + /// + /// In en, this message translates to: + /// **'Flutter Plugins'** + String get aboutLicensesFlutterPluginsSectionTitle; + + /// No description provided for @aboutLicensesFlutterPackagesSectionTitle. + /// + /// In en, this message translates to: + /// **'Flutter Packages'** + String get aboutLicensesFlutterPackagesSectionTitle; + + /// No description provided for @aboutLicensesDartPackagesSectionTitle. + /// + /// In en, this message translates to: + /// **'Dart Packages'** + String get aboutLicensesDartPackagesSectionTitle; + + /// No description provided for @aboutLicensesShowAllButtonLabel. + /// + /// In en, this message translates to: + /// **'Show All Licenses'** + String get aboutLicensesShowAllButtonLabel; + + /// No description provided for @policyPageTitle. + /// + /// In en, this message translates to: + /// **'Privacy Policy'** + String get policyPageTitle; + + /// No description provided for @collectionPageTitle. + /// + /// In en, this message translates to: + /// **'Collection'** + String get collectionPageTitle; + + /// No description provided for @collectionPickPageTitle. + /// + /// In en, this message translates to: + /// **'Pick'** + String get collectionPickPageTitle; + + /// No description provided for @collectionSelectPageTitle. + /// + /// In en, this message translates to: + /// **'Select items'** + String get collectionSelectPageTitle; + + /// No description provided for @collectionActionShowTitleSearch. + /// + /// In en, this message translates to: + /// **'Show title filter'** + String get collectionActionShowTitleSearch; + + /// No description provided for @collectionActionHideTitleSearch. + /// + /// In en, this message translates to: + /// **'Hide title filter'** + String get collectionActionHideTitleSearch; + + /// No description provided for @collectionActionAddDynamicAlbum. + /// + /// In en, this message translates to: + /// **'Add dynamic album'** + String get collectionActionAddDynamicAlbum; + + /// No description provided for @collectionActionAddShortcut. + /// + /// In en, this message translates to: + /// **'Add shortcut'** + String get collectionActionAddShortcut; + + /// No description provided for @collectionActionSetHome. + /// + /// In en, this message translates to: + /// **'Set as home'** + String get collectionActionSetHome; + + /// No description provided for @collectionActionEmptyBin. + /// + /// In en, this message translates to: + /// **'Empty bin'** + String get collectionActionEmptyBin; + + /// No description provided for @collectionActionCopy. + /// + /// In en, this message translates to: + /// **'Copy to album'** + String get collectionActionCopy; + + /// No description provided for @collectionActionMove. + /// + /// In en, this message translates to: + /// **'Move to album'** + String get collectionActionMove; + + /// No description provided for @collectionActionRescan. + /// + /// In en, this message translates to: + /// **'Rescan'** + String get collectionActionRescan; + + /// No description provided for @collectionActionEdit. + /// + /// In en, this message translates to: + /// **'Edit'** + String get collectionActionEdit; + + /// No description provided for @collectionSearchTitlesHintText. + /// + /// In en, this message translates to: + /// **'Search titles'** + String get collectionSearchTitlesHintText; + + /// No description provided for @collectionGroupAlbum. + /// + /// In en, this message translates to: + /// **'By album'** + String get collectionGroupAlbum; + + /// No description provided for @collectionGroupMonth. + /// + /// In en, this message translates to: + /// **'By month'** + String get collectionGroupMonth; + + /// No description provided for @collectionGroupDay. + /// + /// In en, this message translates to: + /// **'By day'** + String get collectionGroupDay; + + /// No description provided for @sectionNone. + /// + /// In en, this message translates to: + /// **'No sections'** + String get sectionNone; + + /// No description provided for @sectionUnknown. + /// + /// In en, this message translates to: + /// **'Unknown'** + String get sectionUnknown; + + /// No description provided for @dateToday. + /// + /// In en, this message translates to: + /// **'Today'** + String get dateToday; + + /// No description provided for @dateYesterday. + /// + /// In en, this message translates to: + /// **'Yesterday'** + String get dateYesterday; + + /// No description provided for @dateThisMonth. + /// + /// In en, this message translates to: + /// **'This month'** + String get dateThisMonth; + + /// No description provided for @collectionDeleteFailureFeedback. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{Failed to delete 1 item} other{Failed to delete {count} items}}'** + String collectionDeleteFailureFeedback(int count); + + /// No description provided for @collectionCopyFailureFeedback. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{Failed to copy 1 item} other{Failed to copy {count} items}}'** + String collectionCopyFailureFeedback(int count); + + /// No description provided for @collectionMoveFailureFeedback. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{Failed to move 1 item} other{Failed to move {count} items}}'** + String collectionMoveFailureFeedback(int count); + + /// No description provided for @collectionRenameFailureFeedback. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{Failed to rename 1 item} other{Failed to rename {count} items}}'** + String collectionRenameFailureFeedback(int count); + + /// No description provided for @collectionEditFailureFeedback. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{Failed to edit 1 item} other{Failed to edit {count} items}}'** + String collectionEditFailureFeedback(int count); + + /// No description provided for @collectionExportFailureFeedback. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{Failed to export 1 page} other{Failed to export {count} pages}}'** + String collectionExportFailureFeedback(int count); + + /// No description provided for @collectionCopySuccessFeedback. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{Copied 1 item} other{Copied {count} items}}'** + String collectionCopySuccessFeedback(int count); + + /// No description provided for @collectionMoveSuccessFeedback. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{Moved 1 item} other{Moved {count} items}}'** + String collectionMoveSuccessFeedback(int count); + + /// No description provided for @collectionRenameSuccessFeedback. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{Renamed 1 item} other{Renamed {count} items}}'** + String collectionRenameSuccessFeedback(int count); + + /// No description provided for @collectionEditSuccessFeedback. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{Edited 1 item} other{Edited {count} items}}'** + String collectionEditSuccessFeedback(int count); + + /// No description provided for @collectionEmptyFavourites. + /// + /// In en, this message translates to: + /// **'No favorites'** + String get collectionEmptyFavourites; + + /// No description provided for @collectionEmptyVideos. + /// + /// In en, this message translates to: + /// **'No videos'** + String get collectionEmptyVideos; + + /// No description provided for @collectionEmptyImages. + /// + /// In en, this message translates to: + /// **'No images'** + String get collectionEmptyImages; + + /// No description provided for @collectionEmptyGrantAccessButtonLabel. + /// + /// In en, this message translates to: + /// **'Grant access'** + String get collectionEmptyGrantAccessButtonLabel; + + /// No description provided for @collectionSelectSectionTooltip. + /// + /// In en, this message translates to: + /// **'Select section'** + String get collectionSelectSectionTooltip; + + /// No description provided for @collectionDeselectSectionTooltip. + /// + /// In en, this message translates to: + /// **'Deselect section'** + String get collectionDeselectSectionTooltip; + + /// No description provided for @drawerAboutButton. + /// + /// In en, this message translates to: + /// **'About'** + String get drawerAboutButton; + + /// No description provided for @drawerSettingsButton. + /// + /// In en, this message translates to: + /// **'Settings'** + String get drawerSettingsButton; + + /// No description provided for @drawerCollectionAll. + /// + /// In en, this message translates to: + /// **'All collection'** + String get drawerCollectionAll; + + /// No description provided for @drawerCollectionFavourites. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get drawerCollectionFavourites; + + /// No description provided for @drawerCollectionImages. + /// + /// In en, this message translates to: + /// **'Images'** + String get drawerCollectionImages; + + /// No description provided for @drawerCollectionVideos. + /// + /// In en, this message translates to: + /// **'Videos'** + String get drawerCollectionVideos; + + /// No description provided for @drawerCollectionAnimated. + /// + /// In en, this message translates to: + /// **'Animated'** + String get drawerCollectionAnimated; + + /// No description provided for @drawerCollectionMotionPhotos. + /// + /// In en, this message translates to: + /// **'Motion photos'** + String get drawerCollectionMotionPhotos; + + /// No description provided for @drawerCollectionPanoramas. + /// + /// In en, this message translates to: + /// **'Panoramas'** + String get drawerCollectionPanoramas; + + /// No description provided for @drawerCollectionRaws. + /// + /// In en, this message translates to: + /// **'Raw photos'** + String get drawerCollectionRaws; + + /// No description provided for @drawerCollectionSphericalVideos. + /// + /// In en, this message translates to: + /// **'360° Videos'** + String get drawerCollectionSphericalVideos; + + /// No description provided for @drawerAlbumPage. + /// + /// In en, this message translates to: + /// **'Albums'** + String get drawerAlbumPage; + + /// No description provided for @drawerCountryPage. + /// + /// In en, this message translates to: + /// **'Countries'** + String get drawerCountryPage; + + /// No description provided for @drawerPlacePage. + /// + /// In en, this message translates to: + /// **'Places'** + String get drawerPlacePage; + + /// No description provided for @drawerTagPage. + /// + /// In en, this message translates to: + /// **'Tags'** + String get drawerTagPage; + + /// No description provided for @sortByDate. + /// + /// In en, this message translates to: + /// **'By date'** + String get sortByDate; + + /// No description provided for @sortByName. + /// + /// In en, this message translates to: + /// **'By name'** + String get sortByName; + + /// No description provided for @sortByItemCount. + /// + /// In en, this message translates to: + /// **'By item count'** + String get sortByItemCount; + + /// No description provided for @sortBySize. + /// + /// In en, this message translates to: + /// **'By size'** + String get sortBySize; + + /// No description provided for @sortByAlbumFileName. + /// + /// In en, this message translates to: + /// **'By album & item title'** + String get sortByAlbumFileName; + + /// No description provided for @sortByRating. + /// + /// In en, this message translates to: + /// **'By rating'** + String get sortByRating; + + /// No description provided for @sortByDuration. + /// + /// In en, this message translates to: + /// **'By duration'** + String get sortByDuration; + + /// No description provided for @sortByPath. + /// + /// In en, this message translates to: + /// **'By path'** + String get sortByPath; + + /// No description provided for @sortOrderNewestFirst. + /// + /// In en, this message translates to: + /// **'Newest first'** + String get sortOrderNewestFirst; + + /// No description provided for @sortOrderOldestFirst. + /// + /// In en, this message translates to: + /// **'Oldest first'** + String get sortOrderOldestFirst; + + /// No description provided for @sortOrderAtoZ. + /// + /// In en, this message translates to: + /// **'A to Z'** + String get sortOrderAtoZ; + + /// No description provided for @sortOrderZtoA. + /// + /// In en, this message translates to: + /// **'Z to A'** + String get sortOrderZtoA; + + /// No description provided for @sortOrderHighestFirst. + /// + /// In en, this message translates to: + /// **'Highest first'** + String get sortOrderHighestFirst; + + /// No description provided for @sortOrderLowestFirst. + /// + /// In en, this message translates to: + /// **'Lowest first'** + String get sortOrderLowestFirst; + + /// No description provided for @sortOrderLargestFirst. + /// + /// In en, this message translates to: + /// **'Largest first'** + String get sortOrderLargestFirst; + + /// No description provided for @sortOrderSmallestFirst. + /// + /// In en, this message translates to: + /// **'Smallest first'** + String get sortOrderSmallestFirst; + + /// No description provided for @sortOrderShortestFirst. + /// + /// In en, this message translates to: + /// **'Shortest first'** + String get sortOrderShortestFirst; + + /// No description provided for @sortOrderLongestFirst. + /// + /// In en, this message translates to: + /// **'Longest first'** + String get sortOrderLongestFirst; + + /// No description provided for @albumGroupTier. + /// + /// In en, this message translates to: + /// **'By tier'** + String get albumGroupTier; + + /// No description provided for @albumGroupType. + /// + /// In en, this message translates to: + /// **'By type'** + String get albumGroupType; + + /// No description provided for @albumGroupVolume. + /// + /// In en, this message translates to: + /// **'By storage volume'** + String get albumGroupVolume; + + /// No description provided for @albumMimeTypeMixed. + /// + /// In en, this message translates to: + /// **'Mixed'** + String get albumMimeTypeMixed; + + /// No description provided for @albumPickPageTitleCopy. + /// + /// In en, this message translates to: + /// **'Copy to Album'** + String get albumPickPageTitleCopy; + + /// No description provided for @albumPickPageTitleExport. + /// + /// In en, this message translates to: + /// **'Export to Album'** + String get albumPickPageTitleExport; + + /// No description provided for @albumPickPageTitleMove. + /// + /// In en, this message translates to: + /// **'Move to Album'** + String get albumPickPageTitleMove; + + /// No description provided for @albumPickPageTitlePick. + /// + /// In en, this message translates to: + /// **'Pick Album'** + String get albumPickPageTitlePick; + + /// No description provided for @albumCamera. + /// + /// In en, this message translates to: + /// **'Camera'** + String get albumCamera; + + /// No description provided for @albumDownload. + /// + /// In en, this message translates to: + /// **'Download'** + String get albumDownload; + + /// No description provided for @albumScreenshots. + /// + /// In en, this message translates to: + /// **'Screenshots'** + String get albumScreenshots; + + /// No description provided for @albumScreenRecordings. + /// + /// In en, this message translates to: + /// **'Screen recordings'** + String get albumScreenRecordings; + + /// No description provided for @albumVideoCaptures. + /// + /// In en, this message translates to: + /// **'Video Captures'** + String get albumVideoCaptures; + + /// No description provided for @albumPageTitle. + /// + /// In en, this message translates to: + /// **'Albums'** + String get albumPageTitle; + + /// No description provided for @albumEmpty. + /// + /// In en, this message translates to: + /// **'No albums'** + String get albumEmpty; + + /// No description provided for @createAlbumButtonLabel. + /// + /// In en, this message translates to: + /// **'CREATE'** + String get createAlbumButtonLabel; + + /// No description provided for @newFilterBanner. + /// + /// In en, this message translates to: + /// **'new'** + String get newFilterBanner; + + /// No description provided for @countryPageTitle. + /// + /// In en, this message translates to: + /// **'Countries'** + String get countryPageTitle; + + /// No description provided for @countryEmpty. + /// + /// In en, this message translates to: + /// **'No countries'** + String get countryEmpty; + + /// No description provided for @statePageTitle. + /// + /// In en, this message translates to: + /// **'States'** + String get statePageTitle; + + /// No description provided for @stateEmpty. + /// + /// In en, this message translates to: + /// **'No states'** + String get stateEmpty; + + /// No description provided for @placePageTitle. + /// + /// In en, this message translates to: + /// **'Places'** + String get placePageTitle; + + /// No description provided for @placeEmpty. + /// + /// In en, this message translates to: + /// **'No places'** + String get placeEmpty; + + /// No description provided for @tagPageTitle. + /// + /// In en, this message translates to: + /// **'Tags'** + String get tagPageTitle; + + /// No description provided for @tagEmpty. + /// + /// In en, this message translates to: + /// **'No tags'** + String get tagEmpty; + + /// No description provided for @tagPickPageTitle. + /// + /// In en, this message translates to: + /// **'Pick Tag'** + String get tagPickPageTitle; + + /// No description provided for @binPageTitle. + /// + /// In en, this message translates to: + /// **'Recycle Bin'** + String get binPageTitle; + + /// No description provided for @explorerPageTitle. + /// + /// In en, this message translates to: + /// **'Explorer'** + String get explorerPageTitle; + + /// No description provided for @explorerActionSelectStorageVolume. + /// + /// In en, this message translates to: + /// **'Select storage'** + String get explorerActionSelectStorageVolume; + + /// No description provided for @selectStorageVolumeDialogTitle. + /// + /// In en, this message translates to: + /// **'Select Storage'** + String get selectStorageVolumeDialogTitle; + + /// No description provided for @searchCollectionFieldHint. + /// + /// In en, this message translates to: + /// **'Search collection'** + String get searchCollectionFieldHint; + + /// No description provided for @searchRecentSectionTitle. + /// + /// In en, this message translates to: + /// **'Recent'** + String get searchRecentSectionTitle; + + /// No description provided for @searchDateSectionTitle. + /// + /// In en, this message translates to: + /// **'Date'** + String get searchDateSectionTitle; + + /// No description provided for @searchFormatSectionTitle. + /// + /// In en, this message translates to: + /// **'Formats'** + String get searchFormatSectionTitle; + + /// No description provided for @searchAlbumsSectionTitle. + /// + /// In en, this message translates to: + /// **'Albums'** + String get searchAlbumsSectionTitle; + + /// No description provided for @searchCountriesSectionTitle. + /// + /// In en, this message translates to: + /// **'Countries'** + String get searchCountriesSectionTitle; + + /// No description provided for @searchStatesSectionTitle. + /// + /// In en, this message translates to: + /// **'States'** + String get searchStatesSectionTitle; + + /// No description provided for @searchPlacesSectionTitle. + /// + /// In en, this message translates to: + /// **'Places'** + String get searchPlacesSectionTitle; + + /// No description provided for @searchTagsSectionTitle. + /// + /// In en, this message translates to: + /// **'Tags'** + String get searchTagsSectionTitle; + + /// No description provided for @searchRatingSectionTitle. + /// + /// In en, this message translates to: + /// **'Ratings'** + String get searchRatingSectionTitle; + + /// No description provided for @searchMetadataSectionTitle. + /// + /// In en, this message translates to: + /// **'Metadata'** + String get searchMetadataSectionTitle; + + /// No description provided for @settingsPageTitle. + /// + /// In en, this message translates to: + /// **'Settings'** + String get settingsPageTitle; + + /// No description provided for @settingsSystemDefault. + /// + /// In en, this message translates to: + /// **'System default'** + String get settingsSystemDefault; + + /// No description provided for @settingsDefault. + /// + /// In en, this message translates to: + /// **'Default'** + String get settingsDefault; + + /// No description provided for @settingsDisabled. + /// + /// In en, this message translates to: + /// **'Disabled'** + String get settingsDisabled; + + /// No description provided for @settingsEnabled. + /// + /// In en, this message translates to: + /// **'Enabled'** + String get settingsEnabled; + + /// No description provided for @settingsForced. + /// + /// In en, this message translates to: + /// **'Forced'** + String get settingsForced; + + /// No description provided for @settingsAskEverytime. + /// + /// In en, this message translates to: + /// **'Ask everytime'** + String get settingsAskEverytime; + + /// No description provided for @settingsModificationWarningDialogMessage. + /// + /// In en, this message translates to: + /// **'Other settings will be modified.'** + String get settingsModificationWarningDialogMessage; + + /// No description provided for @settingsSearchFieldLabel. + /// + /// In en, this message translates to: + /// **'Search settings'** + String get settingsSearchFieldLabel; + + /// No description provided for @settingsSearchEmpty. + /// + /// In en, this message translates to: + /// **'No matching setting'** + String get settingsSearchEmpty; + + /// No description provided for @settingsActionExport. + /// + /// In en, this message translates to: + /// **'Export'** + String get settingsActionExport; + + /// No description provided for @settingsActionExportDialogTitle. + /// + /// In en, this message translates to: + /// **'Export'** + String get settingsActionExportDialogTitle; + + /// No description provided for @settingsActionImport. + /// + /// In en, this message translates to: + /// **'Import'** + String get settingsActionImport; + + /// No description provided for @settingsActionImportDialogTitle. + /// + /// In en, this message translates to: + /// **'Import'** + String get settingsActionImportDialogTitle; + + /// No description provided for @appExportCovers. + /// + /// In en, this message translates to: + /// **'Covers'** + String get appExportCovers; + + /// No description provided for @appExportDynamicAlbums. + /// + /// In en, this message translates to: + /// **'Dynamic albums'** + String get appExportDynamicAlbums; + + /// No description provided for @appExportFavourites. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get appExportFavourites; + + /// No description provided for @appExportSettings. + /// + /// In en, this message translates to: + /// **'Settings'** + String get appExportSettings; + + /// No description provided for @settingsNavigationSectionTitle. + /// + /// In en, this message translates to: + /// **'Navigation'** + String get settingsNavigationSectionTitle; + + /// No description provided for @settingsHomeTile. + /// + /// In en, this message translates to: + /// **'Home'** + String get settingsHomeTile; + + /// No description provided for @settingsHomeDialogTitle. + /// + /// In en, this message translates to: + /// **'Home'** + String get settingsHomeDialogTitle; + + /// No description provided for @setHomeCustom. + /// + /// In en, this message translates to: + /// **'Custom'** + String get setHomeCustom; + + /// No description provided for @settingsKeepScreenOnTile. + /// + /// In en, this message translates to: + /// **'Keep screen on'** + String get settingsKeepScreenOnTile; + + /// No description provided for @settingsKeepScreenOnDialogTitle. + /// + /// In en, this message translates to: + /// **'Keep Screen On'** + String get settingsKeepScreenOnDialogTitle; + + /// No description provided for @settingsDoubleBackExit. + /// + /// In en, this message translates to: + /// **'Tap “back” twice to exit'** + String get settingsDoubleBackExit; + + /// No description provided for @settingsConfirmationTile. + /// + /// In en, this message translates to: + /// **'Confirmation dialogs'** + String get settingsConfirmationTile; + + /// No description provided for @settingsConfirmationDialogTitle. + /// + /// In en, this message translates to: + /// **'Confirmation Dialogs'** + String get settingsConfirmationDialogTitle; + + /// No description provided for @settingsConfirmationBeforeDeleteItems. + /// + /// In en, this message translates to: + /// **'Ask before deleting items forever'** + String get settingsConfirmationBeforeDeleteItems; + + /// No description provided for @settingsConfirmationBeforeMoveToBinItems. + /// + /// In en, this message translates to: + /// **'Ask before moving items to the recycle bin'** + String get settingsConfirmationBeforeMoveToBinItems; + + /// No description provided for @settingsConfirmationBeforeMoveUndatedItems. + /// + /// In en, this message translates to: + /// **'Ask before moving undated items'** + String get settingsConfirmationBeforeMoveUndatedItems; + + /// No description provided for @settingsConfirmationAfterMoveToBinItems. + /// + /// In en, this message translates to: + /// **'Show message after moving items to the recycle bin'** + String get settingsConfirmationAfterMoveToBinItems; + + /// No description provided for @settingsConfirmationVaultDataLoss. + /// + /// In en, this message translates to: + /// **'Show vault data loss warning'** + String get settingsConfirmationVaultDataLoss; + + /// No description provided for @settingsNavigationDrawerTile. + /// + /// In en, this message translates to: + /// **'Navigation menu'** + String get settingsNavigationDrawerTile; + + /// No description provided for @settingsNavigationDrawerEditorPageTitle. + /// + /// In en, this message translates to: + /// **'Navigation Menu'** + String get settingsNavigationDrawerEditorPageTitle; + + /// No description provided for @settingsNavigationDrawerBanner. + /// + /// In en, this message translates to: + /// **'Touch and hold to move and reorder menu items.'** + String get settingsNavigationDrawerBanner; + + /// No description provided for @settingsNavigationDrawerTabTypes. + /// + /// In en, this message translates to: + /// **'Types'** + String get settingsNavigationDrawerTabTypes; + + /// No description provided for @settingsNavigationDrawerTabAlbums. + /// + /// In en, this message translates to: + /// **'Albums'** + String get settingsNavigationDrawerTabAlbums; + + /// No description provided for @settingsNavigationDrawerTabPages. + /// + /// In en, this message translates to: + /// **'Pages'** + String get settingsNavigationDrawerTabPages; + + /// No description provided for @settingsNavigationDrawerAddAlbum. + /// + /// In en, this message translates to: + /// **'Add album'** + String get settingsNavigationDrawerAddAlbum; + + /// No description provided for @settingsNavigationBottomActionsTile. + /// + /// In en, this message translates to: + /// **'Bottom navigation'** + String get settingsNavigationBottomActionsTile; + + /// No description provided for @settingsNavigationBottomActionEditorPageTitle. + /// + /// In en, this message translates to: + /// **'Bottom Navigation'** + String get settingsNavigationBottomActionEditorPageTitle; + + /// No description provided for @settingsNavigationBottomActionEditorBanner. + /// + /// In en, this message translates to: + /// **'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'** + String get settingsNavigationBottomActionEditorBanner; + + /// No description provided for @settingsThumbnailSectionTitle. + /// + /// In en, this message translates to: + /// **'Thumbnails'** + String get settingsThumbnailSectionTitle; + + /// No description provided for @settingsThumbnailOverlayTile. + /// + /// In en, this message translates to: + /// **'Overlay'** + String get settingsThumbnailOverlayTile; + + /// No description provided for @settingsThumbnailOverlayPageTitle. + /// + /// In en, this message translates to: + /// **'Overlay'** + String get settingsThumbnailOverlayPageTitle; + + /// No description provided for @settingsThumbnailShowHdrIcon. + /// + /// In en, this message translates to: + /// **'Show HDR icon'** + String get settingsThumbnailShowHdrIcon; + + /// No description provided for @settingsThumbnailShowFavouriteIcon. + /// + /// In en, this message translates to: + /// **'Show favorite icon'** + String get settingsThumbnailShowFavouriteIcon; + + /// No description provided for @settingsThumbnailShowTagIcon. + /// + /// In en, this message translates to: + /// **'Show tag icon'** + String get settingsThumbnailShowTagIcon; + + /// No description provided for @settingsThumbnailShowLocationIcon. + /// + /// In en, this message translates to: + /// **'Show location icon'** + String get settingsThumbnailShowLocationIcon; + + /// No description provided for @settingsThumbnailShowMotionPhotoIcon. + /// + /// In en, this message translates to: + /// **'Show motion photo icon'** + String get settingsThumbnailShowMotionPhotoIcon; + + /// No description provided for @settingsThumbnailShowRating. + /// + /// In en, this message translates to: + /// **'Show rating'** + String get settingsThumbnailShowRating; + + /// No description provided for @settingsThumbnailShowRawIcon. + /// + /// In en, this message translates to: + /// **'Show raw icon'** + String get settingsThumbnailShowRawIcon; + + /// No description provided for @settingsThumbnailShowVideoDuration. + /// + /// In en, this message translates to: + /// **'Show video duration'** + String get settingsThumbnailShowVideoDuration; + + /// No description provided for @settingsCollectionQuickActionsTile. + /// + /// In en, this message translates to: + /// **'Quick actions'** + String get settingsCollectionQuickActionsTile; + + /// No description provided for @settingsCollectionQuickActionEditorPageTitle. + /// + /// In en, this message translates to: + /// **'Quick Actions'** + String get settingsCollectionQuickActionEditorPageTitle; + + /// No description provided for @settingsCollectionQuickActionTabBrowsing. + /// + /// In en, this message translates to: + /// **'Browsing'** + String get settingsCollectionQuickActionTabBrowsing; + + /// No description provided for @settingsCollectionQuickActionTabSelecting. + /// + /// In en, this message translates to: + /// **'Selecting'** + String get settingsCollectionQuickActionTabSelecting; + + /// No description provided for @settingsCollectionBrowsingQuickActionEditorBanner. + /// + /// In en, this message translates to: + /// **'Touch and hold to move buttons and select which actions are displayed when browsing items.'** + String get settingsCollectionBrowsingQuickActionEditorBanner; + + /// No description provided for @settingsCollectionSelectionQuickActionEditorBanner. + /// + /// In en, this message translates to: + /// **'Touch and hold to move buttons and select which actions are displayed when selecting items.'** + String get settingsCollectionSelectionQuickActionEditorBanner; + + /// No description provided for @settingsCollectionBurstPatternsTile. + /// + /// In en, this message translates to: + /// **'Burst patterns'** + String get settingsCollectionBurstPatternsTile; + + /// No description provided for @settingsCollectionBurstPatternsNone. + /// + /// In en, this message translates to: + /// **'None'** + String get settingsCollectionBurstPatternsNone; + + /// No description provided for @settingsViewerSectionTitle. + /// + /// In en, this message translates to: + /// **'Viewer'** + String get settingsViewerSectionTitle; + + /// No description provided for @settingsViewerGestureSideTapNext. + /// + /// In en, this message translates to: + /// **'Tap on screen edges to show previous/next item'** + String get settingsViewerGestureSideTapNext; + + /// No description provided for @settingsViewerUseCutout. + /// + /// In en, this message translates to: + /// **'Use cutout area'** + String get settingsViewerUseCutout; + + /// No description provided for @settingsViewerMaximumBrightness. + /// + /// In en, this message translates to: + /// **'Maximum brightness'** + String get settingsViewerMaximumBrightness; + + /// No description provided for @settingsMotionPhotoAutoPlay. + /// + /// In en, this message translates to: + /// **'Auto play motion photos'** + String get settingsMotionPhotoAutoPlay; + + /// No description provided for @settingsImageBackground. + /// + /// In en, this message translates to: + /// **'Image background'** + String get settingsImageBackground; + + /// No description provided for @settingsViewerQuickActionsTile. + /// + /// In en, this message translates to: + /// **'Quick actions'** + String get settingsViewerQuickActionsTile; + + /// No description provided for @settingsViewerQuickActionEditorPageTitle. + /// + /// In en, this message translates to: + /// **'Quick Actions'** + String get settingsViewerQuickActionEditorPageTitle; + + /// No description provided for @settingsViewerQuickActionEditorBanner. + /// + /// In en, this message translates to: + /// **'Touch and hold to move buttons and select which actions are displayed in the viewer.'** + String get settingsViewerQuickActionEditorBanner; + + /// No description provided for @settingsViewerQuickActionEditorDisplayedButtonsSectionTitle. + /// + /// In en, this message translates to: + /// **'Displayed Buttons'** + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle; + + /// No description provided for @settingsViewerQuickActionEditorAvailableButtonsSectionTitle. + /// + /// In en, this message translates to: + /// **'Available Buttons'** + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle; + + /// No description provided for @settingsViewerQuickActionEmpty. + /// + /// In en, this message translates to: + /// **'No buttons'** + String get settingsViewerQuickActionEmpty; + + /// No description provided for @settingsViewerOverlayTile. + /// + /// In en, this message translates to: + /// **'Overlay'** + String get settingsViewerOverlayTile; + + /// No description provided for @settingsViewerOverlayPageTitle. + /// + /// In en, this message translates to: + /// **'Overlay'** + String get settingsViewerOverlayPageTitle; + + /// No description provided for @settingsViewerShowOverlayOnOpening. + /// + /// In en, this message translates to: + /// **'Show on opening'** + String get settingsViewerShowOverlayOnOpening; + + /// No description provided for @settingsViewerShowHistogram. + /// + /// In en, this message translates to: + /// **'Show histogram'** + String get settingsViewerShowHistogram; + + /// No description provided for @settingsViewerShowMinimap. + /// + /// In en, this message translates to: + /// **'Show minimap'** + String get settingsViewerShowMinimap; + + /// No description provided for @settingsViewerShowZoomLevel. + /// + /// In en, this message translates to: + /// **'Show zoom level'** + String get settingsViewerShowZoomLevel; + + /// No description provided for @settingsViewerShowInformation. + /// + /// In en, this message translates to: + /// **'Show information'** + String get settingsViewerShowInformation; + + /// No description provided for @settingsViewerShowInformationSubtitle. + /// + /// In en, this message translates to: + /// **'Show title, date, location, etc.'** + String get settingsViewerShowInformationSubtitle; + + /// No description provided for @settingsViewerShowRatingTags. + /// + /// In en, this message translates to: + /// **'Show rating & tags'** + String get settingsViewerShowRatingTags; + + /// No description provided for @settingsViewerShowShootingDetails. + /// + /// In en, this message translates to: + /// **'Show shooting details'** + String get settingsViewerShowShootingDetails; + + /// No description provided for @settingsViewerShowDescription. + /// + /// In en, this message translates to: + /// **'Show description'** + String get settingsViewerShowDescription; + + /// No description provided for @settingsViewerShowOverlayThumbnails. + /// + /// In en, this message translates to: + /// **'Show thumbnails'** + String get settingsViewerShowOverlayThumbnails; + + /// No description provided for @settingsViewerEnableOverlayBlurEffect. + /// + /// In en, this message translates to: + /// **'Blur effect'** + String get settingsViewerEnableOverlayBlurEffect; + + /// No description provided for @settingsViewerSlideshowTile. + /// + /// In en, this message translates to: + /// **'Slideshow'** + String get settingsViewerSlideshowTile; + + /// No description provided for @settingsViewerSlideshowPageTitle. + /// + /// In en, this message translates to: + /// **'Slideshow'** + String get settingsViewerSlideshowPageTitle; + + /// No description provided for @settingsSlideshowRepeat. + /// + /// In en, this message translates to: + /// **'Repeat'** + String get settingsSlideshowRepeat; + + /// No description provided for @settingsSlideshowShuffle. + /// + /// In en, this message translates to: + /// **'Shuffle'** + String get settingsSlideshowShuffle; + + /// No description provided for @settingsSlideshowFillScreen. + /// + /// In en, this message translates to: + /// **'Fill screen'** + String get settingsSlideshowFillScreen; + + /// No description provided for @settingsSlideshowAnimatedZoomEffect. + /// + /// In en, this message translates to: + /// **'Animated zoom effect'** + String get settingsSlideshowAnimatedZoomEffect; + + /// No description provided for @settingsSlideshowTransitionTile. + /// + /// In en, this message translates to: + /// **'Transition'** + String get settingsSlideshowTransitionTile; + + /// No description provided for @settingsSlideshowIntervalTile. + /// + /// In en, this message translates to: + /// **'Interval'** + String get settingsSlideshowIntervalTile; + + /// No description provided for @settingsSlideshowVideoPlaybackTile. + /// + /// In en, this message translates to: + /// **'Video playback'** + String get settingsSlideshowVideoPlaybackTile; + + /// No description provided for @settingsSlideshowVideoPlaybackDialogTitle. + /// + /// In en, this message translates to: + /// **'Video Playback'** + String get settingsSlideshowVideoPlaybackDialogTitle; + + /// No description provided for @settingsVideoPageTitle. + /// + /// In en, this message translates to: + /// **'Video Settings'** + String get settingsVideoPageTitle; + + /// No description provided for @settingsVideoSectionTitle. + /// + /// In en, this message translates to: + /// **'Video'** + String get settingsVideoSectionTitle; + + /// No description provided for @settingsVideoShowVideos. + /// + /// In en, this message translates to: + /// **'Show videos'** + String get settingsVideoShowVideos; + + /// No description provided for @settingsVideoPlaybackTile. + /// + /// In en, this message translates to: + /// **'Playback'** + String get settingsVideoPlaybackTile; + + /// No description provided for @settingsVideoPlaybackPageTitle. + /// + /// In en, this message translates to: + /// **'Playback'** + String get settingsVideoPlaybackPageTitle; + + /// No description provided for @settingsVideoEnableHardwareAcceleration. + /// + /// In en, this message translates to: + /// **'Hardware acceleration'** + String get settingsVideoEnableHardwareAcceleration; + + /// No description provided for @settingsVideoAutoPlay. + /// + /// In en, this message translates to: + /// **'Auto play'** + String get settingsVideoAutoPlay; + + /// No description provided for @settingsVideoLoopModeTile. + /// + /// In en, this message translates to: + /// **'Loop mode'** + String get settingsVideoLoopModeTile; + + /// No description provided for @settingsVideoLoopModeDialogTitle. + /// + /// In en, this message translates to: + /// **'Loop Mode'** + String get settingsVideoLoopModeDialogTitle; + + /// No description provided for @settingsVideoResumptionModeTile. + /// + /// In en, this message translates to: + /// **'Resume playback'** + String get settingsVideoResumptionModeTile; + + /// No description provided for @settingsVideoResumptionModeDialogTitle. + /// + /// In en, this message translates to: + /// **'Resume Playback'** + String get settingsVideoResumptionModeDialogTitle; + + /// No description provided for @settingsVideoBackgroundMode. + /// + /// In en, this message translates to: + /// **'Background mode'** + String get settingsVideoBackgroundMode; + + /// No description provided for @settingsVideoBackgroundModeDialogTitle. + /// + /// In en, this message translates to: + /// **'Background Mode'** + String get settingsVideoBackgroundModeDialogTitle; + + /// No description provided for @settingsVideoControlsTile. + /// + /// In en, this message translates to: + /// **'Controls'** + String get settingsVideoControlsTile; + + /// No description provided for @settingsVideoControlsPageTitle. + /// + /// In en, this message translates to: + /// **'Controls'** + String get settingsVideoControlsPageTitle; + + /// No description provided for @settingsVideoButtonsTile. + /// + /// In en, this message translates to: + /// **'Buttons'** + String get settingsVideoButtonsTile; + + /// No description provided for @settingsVideoGestureDoubleTapTogglePlay. + /// + /// In en, this message translates to: + /// **'Double tap to play/pause'** + String get settingsVideoGestureDoubleTapTogglePlay; + + /// No description provided for @settingsVideoGestureSideDoubleTapSeek. + /// + /// In en, this message translates to: + /// **'Double tap on screen edges to seek backward/forward'** + String get settingsVideoGestureSideDoubleTapSeek; + + /// No description provided for @settingsVideoGestureVerticalDragBrightnessVolume. + /// + /// In en, this message translates to: + /// **'Swipe up or down to adjust brightness/volume'** + String get settingsVideoGestureVerticalDragBrightnessVolume; + + /// No description provided for @settingsSubtitleThemeTile. + /// + /// In en, this message translates to: + /// **'Subtitles'** + String get settingsSubtitleThemeTile; + + /// No description provided for @settingsSubtitleThemePageTitle. + /// + /// In en, this message translates to: + /// **'Subtitles'** + String get settingsSubtitleThemePageTitle; + + /// No description provided for @settingsSubtitleThemeSample. + /// + /// In en, this message translates to: + /// **'This is a sample.'** + String get settingsSubtitleThemeSample; + + /// No description provided for @settingsSubtitleThemeTextAlignmentTile. + /// + /// In en, this message translates to: + /// **'Text alignment'** + String get settingsSubtitleThemeTextAlignmentTile; + + /// No description provided for @settingsSubtitleThemeTextAlignmentDialogTitle. + /// + /// In en, this message translates to: + /// **'Text Alignment'** + String get settingsSubtitleThemeTextAlignmentDialogTitle; + + /// No description provided for @settingsSubtitleThemeTextPositionTile. + /// + /// In en, this message translates to: + /// **'Text position'** + String get settingsSubtitleThemeTextPositionTile; + + /// No description provided for @settingsSubtitleThemeTextPositionDialogTitle. + /// + /// In en, this message translates to: + /// **'Text Position'** + String get settingsSubtitleThemeTextPositionDialogTitle; + + /// No description provided for @settingsSubtitleThemeTextSize. + /// + /// In en, this message translates to: + /// **'Text size'** + String get settingsSubtitleThemeTextSize; + + /// No description provided for @settingsSubtitleThemeShowOutline. + /// + /// In en, this message translates to: + /// **'Show outline and shadow'** + String get settingsSubtitleThemeShowOutline; + + /// No description provided for @settingsSubtitleThemeTextColor. + /// + /// In en, this message translates to: + /// **'Text color'** + String get settingsSubtitleThemeTextColor; + + /// No description provided for @settingsSubtitleThemeTextOpacity. + /// + /// In en, this message translates to: + /// **'Text opacity'** + String get settingsSubtitleThemeTextOpacity; + + /// No description provided for @settingsSubtitleThemeBackgroundColor. + /// + /// In en, this message translates to: + /// **'Background color'** + String get settingsSubtitleThemeBackgroundColor; + + /// No description provided for @settingsSubtitleThemeBackgroundOpacity. + /// + /// In en, this message translates to: + /// **'Background opacity'** + String get settingsSubtitleThemeBackgroundOpacity; + + /// No description provided for @settingsSubtitleThemeTextAlignmentLeft. + /// + /// In en, this message translates to: + /// **'Left'** + String get settingsSubtitleThemeTextAlignmentLeft; + + /// No description provided for @settingsSubtitleThemeTextAlignmentCenter. + /// + /// In en, this message translates to: + /// **'Center'** + String get settingsSubtitleThemeTextAlignmentCenter; + + /// No description provided for @settingsSubtitleThemeTextAlignmentRight. + /// + /// In en, this message translates to: + /// **'Right'** + String get settingsSubtitleThemeTextAlignmentRight; + + /// No description provided for @settingsPrivacySectionTitle. + /// + /// In en, this message translates to: + /// **'Privacy'** + String get settingsPrivacySectionTitle; + + /// No description provided for @settingsAllowInstalledAppAccess. + /// + /// In en, this message translates to: + /// **'Allow access to app inventory'** + String get settingsAllowInstalledAppAccess; + + /// No description provided for @settingsAllowInstalledAppAccessSubtitle. + /// + /// In en, this message translates to: + /// **'Used to improve album display'** + String get settingsAllowInstalledAppAccessSubtitle; + + /// No description provided for @settingsAllowErrorReporting. + /// + /// In en, this message translates to: + /// **'Allow anonymous error reporting'** + String get settingsAllowErrorReporting; + + /// No description provided for @settingsSaveSearchHistory. + /// + /// In en, this message translates to: + /// **'Save search history'** + String get settingsSaveSearchHistory; + + /// No description provided for @settingsEnableBin. + /// + /// In en, this message translates to: + /// **'Use recycle bin'** + String get settingsEnableBin; + + /// No description provided for @settingsEnableBinSubtitle. + /// + /// In en, this message translates to: + /// **'Keep deleted items for 30 days'** + String get settingsEnableBinSubtitle; + + /// No description provided for @settingsDisablingBinWarningDialogMessage. + /// + /// In en, this message translates to: + /// **'Items in the recycle bin will be deleted forever.'** + String get settingsDisablingBinWarningDialogMessage; + + /// No description provided for @settingsAllowMediaManagement. + /// + /// In en, this message translates to: + /// **'Allow media management'** + String get settingsAllowMediaManagement; + + /// No description provided for @settingsHiddenItemsTile. + /// + /// In en, this message translates to: + /// **'Hidden items'** + String get settingsHiddenItemsTile; + + /// No description provided for @settingsHiddenItemsPageTitle. + /// + /// In en, this message translates to: + /// **'Hidden Items'** + String get settingsHiddenItemsPageTitle; + + /// No description provided for @settingsHiddenFiltersBanner. + /// + /// In en, this message translates to: + /// **'Photos and videos matching hidden filters will not appear in your collection.'** + String get settingsHiddenFiltersBanner; + + /// No description provided for @settingsHiddenFiltersEmpty. + /// + /// In en, this message translates to: + /// **'No hidden filters'** + String get settingsHiddenFiltersEmpty; + + /// No description provided for @settingsStorageAccessTile. + /// + /// In en, this message translates to: + /// **'Storage access'** + String get settingsStorageAccessTile; + + /// No description provided for @settingsStorageAccessPageTitle. + /// + /// In en, this message translates to: + /// **'Storage Access'** + String get settingsStorageAccessPageTitle; + + /// No description provided for @settingsStorageAccessBanner. + /// + /// In en, this message translates to: + /// **'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'** + String get settingsStorageAccessBanner; + + /// No description provided for @settingsStorageAccessEmpty. + /// + /// In en, this message translates to: + /// **'No access grants'** + String get settingsStorageAccessEmpty; + + /// No description provided for @settingsStorageAccessRevokeTooltip. + /// + /// In en, this message translates to: + /// **'Revoke'** + String get settingsStorageAccessRevokeTooltip; + + /// No description provided for @settingsAccessibilitySectionTitle. + /// + /// In en, this message translates to: + /// **'Accessibility'** + String get settingsAccessibilitySectionTitle; + + /// No description provided for @settingsRemoveAnimationsTile. + /// + /// In en, this message translates to: + /// **'Remove animations'** + String get settingsRemoveAnimationsTile; + + /// No description provided for @settingsRemoveAnimationsDialogTitle. + /// + /// In en, this message translates to: + /// **'Remove Animations'** + String get settingsRemoveAnimationsDialogTitle; + + /// No description provided for @settingsTimeToTakeActionTile. + /// + /// In en, this message translates to: + /// **'Time to take action'** + String get settingsTimeToTakeActionTile; + + /// No description provided for @settingsAccessibilityShowPinchGestureAlternatives. + /// + /// In en, this message translates to: + /// **'Show multi-touch gesture alternatives'** + String get settingsAccessibilityShowPinchGestureAlternatives; + + /// No description provided for @settingsDisplaySectionTitle. + /// + /// In en, this message translates to: + /// **'Display'** + String get settingsDisplaySectionTitle; + + /// No description provided for @settingsThemeBrightnessTile. + /// + /// In en, this message translates to: + /// **'Theme'** + String get settingsThemeBrightnessTile; + + /// No description provided for @settingsThemeBrightnessDialogTitle. + /// + /// In en, this message translates to: + /// **'Theme'** + String get settingsThemeBrightnessDialogTitle; + + /// No description provided for @settingsThemeColorHighlights. + /// + /// In en, this message translates to: + /// **'Color highlights'** + String get settingsThemeColorHighlights; + + /// No description provided for @settingsThemeEnableDynamicColor. + /// + /// In en, this message translates to: + /// **'Dynamic color'** + String get settingsThemeEnableDynamicColor; + + /// No description provided for @settingsDisplayRefreshRateModeTile. + /// + /// In en, this message translates to: + /// **'Display refresh rate'** + String get settingsDisplayRefreshRateModeTile; + + /// No description provided for @settingsDisplayRefreshRateModeDialogTitle. + /// + /// In en, this message translates to: + /// **'Refresh Rate'** + String get settingsDisplayRefreshRateModeDialogTitle; + + /// No description provided for @settingsDisplayUseTvInterface. + /// + /// In en, this message translates to: + /// **'Android TV interface'** + String get settingsDisplayUseTvInterface; + + /// No description provided for @settingsLanguageSectionTitle. + /// + /// In en, this message translates to: + /// **'Language & Formats'** + String get settingsLanguageSectionTitle; + + /// No description provided for @settingsLanguageTile. + /// + /// In en, this message translates to: + /// **'Language'** + String get settingsLanguageTile; + + /// No description provided for @settingsLanguagePageTitle. + /// + /// In en, this message translates to: + /// **'Language'** + String get settingsLanguagePageTitle; + + /// No description provided for @settingsCoordinateFormatTile. + /// + /// In en, this message translates to: + /// **'Coordinate format'** + String get settingsCoordinateFormatTile; + + /// No description provided for @settingsCoordinateFormatDialogTitle. + /// + /// In en, this message translates to: + /// **'Coordinate Format'** + String get settingsCoordinateFormatDialogTitle; + + /// No description provided for @settingsUnitSystemTile. + /// + /// In en, this message translates to: + /// **'Units'** + String get settingsUnitSystemTile; + + /// No description provided for @settingsUnitSystemDialogTitle. + /// + /// In en, this message translates to: + /// **'Units'** + String get settingsUnitSystemDialogTitle; + + /// No description provided for @settingsForceWesternArabicNumeralsTile. + /// + /// In en, this message translates to: + /// **'Force Arabic numerals'** + String get settingsForceWesternArabicNumeralsTile; + + /// No description provided for @settingsScreenSaverPageTitle. + /// + /// In en, this message translates to: + /// **'Screen Saver'** + String get settingsScreenSaverPageTitle; + + /// No description provided for @settingsWidgetPageTitle. + /// + /// In en, this message translates to: + /// **'Photo Frame'** + String get settingsWidgetPageTitle; + + /// No description provided for @settingsWidgetShowOutline. + /// + /// In en, this message translates to: + /// **'Outline'** + String get settingsWidgetShowOutline; + + /// No description provided for @settingsWidgetOpenPage. + /// + /// In en, this message translates to: + /// **'When tapping on the widget'** + String get settingsWidgetOpenPage; + + /// No description provided for @settingsWidgetDisplayedItem. + /// + /// In en, this message translates to: + /// **'Displayed item'** + String get settingsWidgetDisplayedItem; + + /// No description provided for @settingsCollectionTile. + /// + /// In en, this message translates to: + /// **'Collection'** + String get settingsCollectionTile; + + /// No description provided for @statsPageTitle. + /// + /// In en, this message translates to: + /// **'Stats'** + String get statsPageTitle; + + /// No description provided for @statsWithGps. + /// + /// In en, this message translates to: + /// **'{count, plural, =1{1 item with location} other{{count} items with location}}'** + String statsWithGps(int count); + + /// No description provided for @statsTopCountriesSectionTitle. + /// + /// In en, this message translates to: + /// **'Top Countries'** + String get statsTopCountriesSectionTitle; + + /// No description provided for @statsTopStatesSectionTitle. + /// + /// In en, this message translates to: + /// **'Top States'** + String get statsTopStatesSectionTitle; + + /// No description provided for @statsTopPlacesSectionTitle. + /// + /// In en, this message translates to: + /// **'Top Places'** + String get statsTopPlacesSectionTitle; + + /// No description provided for @statsTopTagsSectionTitle. + /// + /// In en, this message translates to: + /// **'Top Tags'** + String get statsTopTagsSectionTitle; + + /// No description provided for @statsTopAlbumsSectionTitle. + /// + /// In en, this message translates to: + /// **'Top Albums'** + String get statsTopAlbumsSectionTitle; + + /// No description provided for @viewerOpenPanoramaButtonLabel. + /// + /// In en, this message translates to: + /// **'OPEN PANORAMA'** + String get viewerOpenPanoramaButtonLabel; + + /// No description provided for @viewerSetWallpaperButtonLabel. + /// + /// In en, this message translates to: + /// **'SET WALLPAPER'** + String get viewerSetWallpaperButtonLabel; + + /// No description provided for @viewerErrorUnknown. + /// + /// In en, this message translates to: + /// **'Oops!'** + String get viewerErrorUnknown; + + /// No description provided for @viewerErrorDoesNotExist. + /// + /// In en, this message translates to: + /// **'The file no longer exists.'** + String get viewerErrorDoesNotExist; + + /// No description provided for @viewerInfoPageTitle. + /// + /// In en, this message translates to: + /// **'Info'** + String get viewerInfoPageTitle; + + /// No description provided for @viewerInfoBackToViewerTooltip. + /// + /// In en, this message translates to: + /// **'Back to viewer'** + String get viewerInfoBackToViewerTooltip; + + /// No description provided for @viewerInfoUnknown. + /// + /// In en, this message translates to: + /// **'unknown'** + String get viewerInfoUnknown; + + /// No description provided for @viewerInfoLabelDescription. + /// + /// In en, this message translates to: + /// **'Description'** + String get viewerInfoLabelDescription; + + /// No description provided for @viewerInfoLabelTitle. + /// + /// In en, this message translates to: + /// **'Title'** + String get viewerInfoLabelTitle; + + /// No description provided for @viewerInfoLabelDate. + /// + /// In en, this message translates to: + /// **'Date'** + String get viewerInfoLabelDate; + + /// No description provided for @viewerInfoLabelResolution. + /// + /// In en, this message translates to: + /// **'Resolution'** + String get viewerInfoLabelResolution; + + /// No description provided for @viewerInfoLabelSize. + /// + /// In en, this message translates to: + /// **'Size'** + String get viewerInfoLabelSize; + + /// No description provided for @viewerInfoLabelUri. + /// + /// In en, this message translates to: + /// **'URI'** + String get viewerInfoLabelUri; + + /// No description provided for @viewerInfoLabelPath. + /// + /// In en, this message translates to: + /// **'Path'** + String get viewerInfoLabelPath; + + /// No description provided for @viewerInfoLabelDuration. + /// + /// In en, this message translates to: + /// **'Duration'** + String get viewerInfoLabelDuration; + + /// No description provided for @viewerInfoLabelOwner. + /// + /// In en, this message translates to: + /// **'Owner'** + String get viewerInfoLabelOwner; + + /// No description provided for @viewerInfoLabelCoordinates. + /// + /// In en, this message translates to: + /// **'Coordinates'** + String get viewerInfoLabelCoordinates; + + /// No description provided for @viewerInfoLabelAddress. + /// + /// In en, this message translates to: + /// **'Address'** + String get viewerInfoLabelAddress; + + /// No description provided for @mapStyleDialogTitle. + /// + /// In en, this message translates to: + /// **'Map Style'** + String get mapStyleDialogTitle; + + /// No description provided for @mapStyleDialogAddStyle. + /// + /// In en, this message translates to: + /// **'Add style'** + String get mapStyleDialogAddStyle; + + /// No description provided for @mapStyleTooltip. + /// + /// In en, this message translates to: + /// **'Select map style'** + String get mapStyleTooltip; + + /// No description provided for @mapStyleEditorDialogName. + /// + /// In en, this message translates to: + /// **'Name'** + String get mapStyleEditorDialogName; + + /// No description provided for @mapStyleEditorDialogUrl. + /// + /// In en, this message translates to: + /// **'URL'** + String get mapStyleEditorDialogUrl; + + /// No description provided for @mapStyleEditorDialogSubdomains. + /// + /// In en, this message translates to: + /// **'Subdomains'** + String get mapStyleEditorDialogSubdomains; + + /// No description provided for @mapStyleEditorDialogUserAgent. + /// + /// In en, this message translates to: + /// **'User-Agent'** + String get mapStyleEditorDialogUserAgent; + + /// No description provided for @mapZoomInTooltip. + /// + /// In en, this message translates to: + /// **'Zoom in'** + String get mapZoomInTooltip; + + /// No description provided for @mapZoomOutTooltip. + /// + /// In en, this message translates to: + /// **'Zoom out'** + String get mapZoomOutTooltip; + + /// No description provided for @mapPointNorthUpTooltip. + /// + /// In en, this message translates to: + /// **'Point north up'** + String get mapPointNorthUpTooltip; + + /// No description provided for @mapAttributionOsmData. + /// + /// In en, this message translates to: + /// **'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'** + String get mapAttributionOsmData; + + /// No description provided for @mapAttributionOsmLiberty. + /// + /// In en, this message translates to: + /// **'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'** + String get mapAttributionOsmLiberty; + + /// No description provided for @mapAttributionOpenTopoMap. + /// + /// In en, this message translates to: + /// **'[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'** + String get mapAttributionOpenTopoMap; + + /// No description provided for @mapAttributionOsmHot. + /// + /// In en, this message translates to: + /// **'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'** + String get mapAttributionOsmHot; + + /// No description provided for @mapAttributionStamen. + /// + /// In en, this message translates to: + /// **'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'** + String get mapAttributionStamen; + + /// No description provided for @openMapPageTooltip. + /// + /// In en, this message translates to: + /// **'View on Map page'** + String get openMapPageTooltip; + + /// No description provided for @mapEmptyRegion. + /// + /// In en, this message translates to: + /// **'No images in this region'** + String get mapEmptyRegion; + + /// No description provided for @viewerInfoOpenEmbeddedFailureFeedback. + /// + /// In en, this message translates to: + /// **'Failed to extract embedded data'** + String get viewerInfoOpenEmbeddedFailureFeedback; + + /// No description provided for @viewerInfoOpenLinkText. + /// + /// In en, this message translates to: + /// **'Open'** + String get viewerInfoOpenLinkText; + + /// No description provided for @viewerInfoViewXmlLinkText. + /// + /// In en, this message translates to: + /// **'View XML'** + String get viewerInfoViewXmlLinkText; + + /// No description provided for @viewerInfoSearchFieldLabel. + /// + /// In en, this message translates to: + /// **'Search metadata'** + String get viewerInfoSearchFieldLabel; + + /// No description provided for @viewerInfoSearchEmpty. + /// + /// In en, this message translates to: + /// **'No matching keys'** + String get viewerInfoSearchEmpty; + + /// No description provided for @viewerInfoSearchSuggestionDate. + /// + /// In en, this message translates to: + /// **'Date & time'** + String get viewerInfoSearchSuggestionDate; + + /// No description provided for @viewerInfoSearchSuggestionDescription. + /// + /// In en, this message translates to: + /// **'Description'** + String get viewerInfoSearchSuggestionDescription; + + /// No description provided for @viewerInfoSearchSuggestionDimensions. + /// + /// In en, this message translates to: + /// **'Dimensions'** + String get viewerInfoSearchSuggestionDimensions; + + /// No description provided for @viewerInfoSearchSuggestionResolution. + /// + /// In en, this message translates to: + /// **'Resolution'** + String get viewerInfoSearchSuggestionResolution; + + /// No description provided for @viewerInfoSearchSuggestionRights. + /// + /// In en, this message translates to: + /// **'Rights'** + String get viewerInfoSearchSuggestionRights; + + /// No description provided for @wallpaperUseScrollEffect. + /// + /// In en, this message translates to: + /// **'Use scroll effect on home screen'** + String get wallpaperUseScrollEffect; + + /// No description provided for @tagEditorPageTitle. + /// + /// In en, this message translates to: + /// **'Edit Tags'** + String get tagEditorPageTitle; + + /// No description provided for @tagEditorPageNewTagFieldLabel. + /// + /// In en, this message translates to: + /// **'New tag'** + String get tagEditorPageNewTagFieldLabel; + + /// No description provided for @tagEditorPageAddTagTooltip. + /// + /// In en, this message translates to: + /// **'Add tag'** + String get tagEditorPageAddTagTooltip; + + /// No description provided for @tagEditorSectionRecent. + /// + /// In en, this message translates to: + /// **'Recent'** + String get tagEditorSectionRecent; + + /// No description provided for @tagEditorSectionPlaceholders. + /// + /// In en, this message translates to: + /// **'Placeholders'** + String get tagEditorSectionPlaceholders; + + /// No description provided for @tagEditorDiscardDialogMessage. + /// + /// In en, this message translates to: + /// **'Do you want to discard changes?'** + String get tagEditorDiscardDialogMessage; + + /// No description provided for @tagPlaceholderCountry. + /// + /// In en, this message translates to: + /// **'Country'** + String get tagPlaceholderCountry; + + /// No description provided for @tagPlaceholderState. + /// + /// In en, this message translates to: + /// **'State'** + String get tagPlaceholderState; + + /// No description provided for @tagPlaceholderPlace. + /// + /// In en, this message translates to: + /// **'Place'** + String get tagPlaceholderPlace; + + /// No description provided for @panoramaEnableSensorControl. + /// + /// In en, this message translates to: + /// **'Enable sensor control'** + String get panoramaEnableSensorControl; + + /// No description provided for @panoramaDisableSensorControl. + /// + /// In en, this message translates to: + /// **'Disable sensor control'** + String get panoramaDisableSensorControl; + + /// No description provided for @sourceViewerPageTitle. + /// + /// In en, this message translates to: + /// **'Source'** + String get sourceViewerPageTitle; +} + +class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> { + const _AppLocalizationsDelegate(); + + @override + Future<AppLocalizations> load(Locale locale) { + return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale)); + } + + @override + bool isSupported(Locale locale) => <String>[ + 'ar', + 'az', + 'be', + 'bg', + 'bn', + 'ca', + 'ckb', + 'cs', + 'da', + 'de', + 'el', + 'en', + 'es', + 'et', + 'eu', + 'fa', + 'fi', + 'fr', + 'gl', + 'he', + 'hi', + 'hr', + 'hu', + 'id', + 'is', + 'it', + 'ja', + 'kmr', + 'kn', + 'ko', + 'lt', + 'ml', + 'my', + 'nb', + 'ne', + 'nl', + 'nn', + 'or', + 'pl', + 'pt', + 'ro', + 'ru', + 'sat', + 'sk', + 'sl', + 'sr', + 'sv', + 'ta', + 'th', + 'tr', + 'uk', + 'ur', + 'vi', + 'zh', + ].contains(locale.languageCode); + + @override + bool shouldReload(_AppLocalizationsDelegate old) => false; +} + +AppLocalizations lookupAppLocalizations(Locale locale) { + // Lookup logic when language+script codes are specified. + switch (locale.languageCode) { + case 'en': + { + switch (locale.scriptCode) { + case 'Shaw': + return AppLocalizationsEnShaw(); + } + break; + } + case 'zh': + { + switch (locale.scriptCode) { + case 'Hant': + return AppLocalizationsZhHant(); + } + break; + } + } + + // Lookup logic when only language code is specified. + switch (locale.languageCode) { + case 'ar': + return AppLocalizationsAr(); + case 'az': + return AppLocalizationsAz(); + case 'be': + return AppLocalizationsBe(); + case 'bg': + return AppLocalizationsBg(); + case 'bn': + return AppLocalizationsBn(); + case 'ca': + return AppLocalizationsCa(); + case 'ckb': + return AppLocalizationsCkb(); + case 'cs': + return AppLocalizationsCs(); + case 'da': + return AppLocalizationsDa(); + case 'de': + return AppLocalizationsDe(); + case 'el': + return AppLocalizationsEl(); + case 'en': + return AppLocalizationsEn(); + case 'es': + return AppLocalizationsEs(); + case 'et': + return AppLocalizationsEt(); + case 'eu': + return AppLocalizationsEu(); + case 'fa': + return AppLocalizationsFa(); + case 'fi': + return AppLocalizationsFi(); + case 'fr': + return AppLocalizationsFr(); + case 'gl': + return AppLocalizationsGl(); + case 'he': + return AppLocalizationsHe(); + case 'hi': + return AppLocalizationsHi(); + case 'hr': + return AppLocalizationsHr(); + case 'hu': + return AppLocalizationsHu(); + case 'id': + return AppLocalizationsId(); + case 'is': + return AppLocalizationsIs(); + case 'it': + return AppLocalizationsIt(); + case 'ja': + return AppLocalizationsJa(); + case 'kmr': + return AppLocalizationsKmr(); + case 'kn': + return AppLocalizationsKn(); + case 'ko': + return AppLocalizationsKo(); + case 'lt': + return AppLocalizationsLt(); + case 'ml': + return AppLocalizationsMl(); + case 'my': + return AppLocalizationsMy(); + case 'nb': + return AppLocalizationsNb(); + case 'ne': + return AppLocalizationsNe(); + case 'nl': + return AppLocalizationsNl(); + case 'nn': + return AppLocalizationsNn(); + case 'or': + return AppLocalizationsOr(); + case 'pl': + return AppLocalizationsPl(); + case 'pt': + return AppLocalizationsPt(); + case 'ro': + return AppLocalizationsRo(); + case 'ru': + return AppLocalizationsRu(); + case 'sat': + return AppLocalizationsSat(); + case 'sk': + return AppLocalizationsSk(); + case 'sl': + return AppLocalizationsSl(); + case 'sr': + return AppLocalizationsSr(); + case 'sv': + return AppLocalizationsSv(); + case 'ta': + return AppLocalizationsTa(); + case 'th': + return AppLocalizationsTh(); + case 'tr': + return AppLocalizationsTr(); + case 'uk': + return AppLocalizationsUk(); + case 'ur': + return AppLocalizationsUr(); + case 'vi': + return AppLocalizationsVi(); + case 'zh': + return AppLocalizationsZh(); + } + + throw FlutterError( + 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.', + ); +} diff --git a/lib/l10ngen/app_localizations_ar.dart b/lib/l10ngen/app_localizations_ar.dart new file mode 100644 index 0000000..699ebf4 --- /dev/null +++ b/lib/l10ngen/app_localizations_ar.dart @@ -0,0 +1,2373 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Arabic (`ar`). +class AppLocalizationsAr extends AppLocalizations { + AppLocalizationsAr([String locale = 'ar']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'مرحبا بكم في Aves'; + + @override + String get welcomeOptional => 'اختياري'; + + @override + String get welcomeTermsToggle => 'أوافق على الشروط'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count عناصر', + one: '$count عنصر', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count أعمدة', + one: '$count عمود', + ); + return '$_temp0$count'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ثواني', + one: '$countString ثانية', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString دقائق', + one: '$countString دقيقة', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString أيام', + one: '$countString يوم', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'تأكيد'; + + @override + String get createButtonLabel => 'خلق'; + + @override + String get deleteButtonLabel => 'حذف'; + + @override + String get nextButtonLabel => 'التالي'; + + @override + String get showButtonLabel => 'إظهار'; + + @override + String get hideButtonLabel => 'إخفاء'; + + @override + String get continueButtonLabel => 'إستمرار'; + + @override + String get saveCopyButtonLabel => 'حفظ نسخة'; + + @override + String get applyTooltip => 'تأكيد'; + + @override + String get cancelTooltip => 'إلغاء'; + + @override + String get changeTooltip => 'تغيير'; + + @override + String get clearTooltip => 'تنظيف'; + + @override + String get previousTooltip => 'السابق'; + + @override + String get nextTooltip => 'التالي'; + + @override + String get showTooltip => 'إظهار'; + + @override + String get hideTooltip => 'إخفاء'; + + @override + String get actionRemove => 'إزالة'; + + @override + String get resetTooltip => 'إعادة'; + + @override + String get saveTooltip => 'حفظ'; + + @override + String get stopTooltip => 'توقف'; + + @override + String get pickTooltip => 'اختيار'; + + @override + String get doubleBackExitMessage => 'اضغط على «رجوع» مرة أخرى للخروج.'; + + @override + String get doNotAskAgain => 'عدم السؤال مرة أخرى'; + + @override + String get sourceStateLoading => 'تحميل'; + + @override + String get sourceStateCataloguing => 'تصنيف'; + + @override + String get sourceStateLocatingCountries => 'تحديد مواقع الدول'; + + @override + String get sourceStateLocatingPlaces => 'تحديد المواقع'; + + @override + String get chipActionDelete => 'حَذف'; + + @override + String get chipActionRemove => 'إزالة'; + + @override + String get chipActionShowCollection => 'عرض في المجموعة'; + + @override + String get chipActionGoToAlbumPage => 'عرض في الألبومات'; + + @override + String get chipActionGoToCountryPage => 'عرض في الدول'; + + @override + String get chipActionGoToPlacePage => 'عرض في الأماكن'; + + @override + String get chipActionGoToTagPage => 'عرض في الوسوم'; + + @override + String get chipActionGoToExplorerPage => 'عرض في المستكشف'; + + @override + String get chipActionDecompose => 'فصل'; + + @override + String get chipActionFilterOut => 'تصفية أو استبعاد'; + + @override + String get chipActionFilterIn => 'تصفية أو اختيار'; + + @override + String get chipActionHide => 'إخفاء'; + + @override + String get chipActionLock => 'قَفل'; + + @override + String get chipActionPin => 'تثبيت في الأعلى'; + + @override + String get chipActionUnpin => 'إلغاء التثبيت في الأعلى'; + + @override + String get chipActionGroup => 'تغيير التجميع'; + + @override + String get chipActionRename => 'إعادة تسمية'; + + @override + String get chipActionSetCover => 'تعيين كغلاف'; + + @override + String get chipActionShowCountryStates => 'عرض الولايات'; + + @override + String get chipActionCreateGroup => 'إنشاء مجموعة'; + + @override + String get chipActionCreateAlbum => 'إنشاء ألبوم'; + + @override + String get chipActionCreateVault => 'إنشاء خزنة'; + + @override + String get chipActionConfigureVault => 'تكوين الخزنة'; + + @override + String get entryActionCopyToClipboard => 'نسخ إلى الحافظة'; + + @override + String get entryActionDelete => 'حذف'; + + @override + String get entryActionConvert => 'تحويل'; + + @override + String get entryActionExport => 'المزيد'; + + @override + String get entryActionInfo => 'معلومات'; + + @override + String get entryActionRename => 'إعادة تسمية'; + + @override + String get entryActionRestore => 'استعادة'; + + @override + String get entryActionRotateCCW => 'تدوير عكس عقارب الساعة'; + + @override + String get entryActionRotateCW => 'تدوير في اتجاه عقارب الساعة'; + + @override + String get entryActionFlip => 'عكس أفقيًا'; + + @override + String get entryActionPrint => 'طباعة'; + + @override + String get entryActionShare => 'مشاركة'; + + @override + String get entryActionShareImageOnly => 'مشاركة الصورة فقط'; + + @override + String get entryActionShareVideoOnly => 'مشاركة الفيديوهات فقط'; + + @override + String get entryActionViewSource => 'عرض المصدر'; + + @override + String get entryActionShowGeoTiffOnMap => 'عرض كتراكب على الخريطة'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'تحويل إلى صورة ثابتة'; + + @override + String get entryActionViewMotionPhotoVideo => 'فتح الفيديو'; + + @override + String get entryActionEdit => 'تحرير'; + + @override + String get entryActionOpen => 'فتح باستخدام'; + + @override + String get entryActionSetAs => 'تعيين كـ'; + + @override + String get entryActionCast => 'البث'; + + @override + String get entryActionOpenMap => 'عرض في تطبيق الخرائط'; + + @override + String get entryActionRotateScreen => 'تدوير الشاشة'; + + @override + String get entryActionAddFavourite => 'إضافة إلى المفضلة'; + + @override + String get entryActionRemoveFavourite => 'إزالة من المفضلة'; + + @override + String get videoActionCaptureFrame => 'التقاط الإطار'; + + @override + String get videoActionMute => 'كتم الصوت'; + + @override + String get videoActionUnmute => 'إلغاء كتم الصوت'; + + @override + String get videoActionPause => 'إيقاف مؤقت'; + + @override + String get videoActionPlay => 'تشغيل'; + + @override + String get videoActionReplay10 => 'الرجوع للخلف لمدة 10 ثوانٍ'; + + @override + String get videoActionSkip10 => 'تقدم إلى الأمام لمدة 10 ثوانٍ'; + + @override + String get videoActionShowPreviousFrame => 'إظهار الإطار السابق'; + + @override + String get videoActionShowNextFrame => 'إظهار الإطار التالي'; + + @override + String get videoActionSelectStreams => 'اختيار المسارات'; + + @override + String get videoActionSetSpeed => 'سرعة التشغيل'; + + @override + String get videoActionABRepeat => 'تكرار A-B'; + + @override + String get videoRepeatActionSetStart => 'تعيين بداية التشغيل'; + + @override + String get videoRepeatActionSetEnd => 'تعيين نهاية التشغيل'; + + @override + String get viewerActionSettings => 'الإعدادات'; + + @override + String get viewerActionLock => 'قفل المعاينة'; + + @override + String get viewerActionUnlock => 'إلغاء قفل المعاينة'; + + @override + String get slideshowActionResume => 'استئناف'; + + @override + String get slideshowActionShowInCollection => 'عرض في المجموعة'; + + @override + String get entryInfoActionEditDate => 'تعديل التاريخ والوقت'; + + @override + String get entryInfoActionEditLocation => 'تحديد الوجهة'; + + @override + String get entryInfoActionEditTitleDescription => 'تحرير العنوان والوصف'; + + @override + String get entryInfoActionEditRating => 'تحرير التقييم'; + + @override + String get entryInfoActionEditTags => 'تعديل العلامات'; + + @override + String get entryInfoActionRemoveMetadata => 'إزالة البيانات الوصفية'; + + @override + String get entryInfoActionExportMetadata => 'تصدير البيانات الوصفية'; + + @override + String get entryInfoActionRemoveLocation => 'إزالة الموقع'; + + @override + String get editorActionTransform => 'تحويل'; + + @override + String get editorTransformCrop => 'قص'; + + @override + String get editorTransformRotate => 'تدوير'; + + @override + String get cropAspectRatioFree => 'حر'; + + @override + String get cropAspectRatioOriginal => 'الأصل'; + + @override + String get cropAspectRatioSquare => 'مربع'; + + @override + String get filterAspectRatioLandscapeLabel => 'طبيعي'; + + @override + String get filterAspectRatioPortraitLabel => 'لوحة'; + + @override + String get filterBinLabel => 'سلة المَحذوفات'; + + @override + String get filterFavouriteLabel => 'مفضل'; + + @override + String get filterNoDateLabel => 'غير مؤرخ'; + + @override + String get filterNoAddressLabel => 'لا يوجد عنوان'; + + @override + String get filterLocatedLabel => 'متواجد'; + + @override + String get filterNoLocationLabel => 'غير محدد'; + + @override + String get filterNoRatingLabel => 'غير مصنف'; + + @override + String get filterTaggedLabel => 'الموسومة'; + + @override + String get filterNoTagLabel => 'بدون علامات'; + + @override + String get filterNoTitleLabel => 'بدون عنوان'; + + @override + String get filterOnThisDayLabel => 'في هذا اليوم'; + + @override + String get filterRecentlyAddedLabel => 'أضيف مؤخرا'; + + @override + String get filterRatingRejectedLabel => 'مرفوض'; + + @override + String get filterTypeAnimatedLabel => 'متحرك'; + + @override + String get filterTypeMotionPhotoLabel => 'الصور المتحركة'; + + @override + String get filterTypePanoramaLabel => 'بانوراما'; + + @override + String get filterTypeRawLabel => 'خام'; + + @override + String get filterTypeSphericalVideoLabel => 'فيديو 360 درجة'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'صورة'; + + @override + String get filterMimeVideoLabel => 'فيديو'; + + @override + String get accessibilityAnimationsRemove => 'منع تأثيرات الشاشة'; + + @override + String get accessibilityAnimationsKeep => 'الحفاظ على تأثيرات الشاشة'; + + @override + String get albumTierNew => 'جديد'; + + @override + String get albumTierPinned => 'مثبت'; + + @override + String get albumTierGroups => 'المجموعات'; + + @override + String get albumTierSpecial => 'شائع'; + + @override + String get albumTierApps => 'تطبيقات'; + + @override + String get albumTierVaults => 'خزائن'; + + @override + String get albumTierDynamic => 'ديناميكي'; + + @override + String get albumTierRegular => 'آخرون'; + + @override + String get coordinateFormatDms => 'نظام إدارة الوجهة'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'الدرجات العشرية'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'شمال'; + + @override + String get coordinateDmsSouth => 'جنوب'; + + @override + String get coordinateDmsEast => 'شرق'; + + @override + String get coordinateDmsWest => 'غرب'; + + @override + String get displayRefreshRatePreferHighest => 'أعلى معدل'; + + @override + String get displayRefreshRatePreferLowest => 'أدنى معدل'; + + @override + String get keepScreenOnNever => 'أبداً'; + + @override + String get keepScreenOnVideoPlayback => 'أثناء تشغيل الفيديو'; + + @override + String get keepScreenOnViewerOnly => 'صفحة المشاهدة فقط'; + + @override + String get keepScreenOnAlways => 'دائما'; + + @override + String get lengthUnitPixel => 'بكسل'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'خرائط جوجل'; + + @override + String get mapStyleGoogleHybrid => 'خرائط جوجل (الهجينة)'; + + @override + String get mapStyleGoogleTerrain => 'خرائط جوجل (التضاريس)'; + + @override + String get mapStyleOsmLiberty => 'حرية خرائط OSM'; + + @override + String get mapStyleOpenTopoMap => 'الخريطة الطبوغرافية المفتوحة'; + + @override + String get mapStyleOsmHot => 'خرائط OSM'; + + @override + String get mapStyleStamenWatercolor => 'ستايمن بالألوان المائية'; + + @override + String get maxBrightnessNever => 'أبداً'; + + @override + String get maxBrightnessAlways => 'دائماً'; + + @override + String get nameConflictStrategyRename => 'إعادة تسمية'; + + @override + String get nameConflictStrategyReplace => 'إستبدال'; + + @override + String get nameConflictStrategySkip => 'تخطي'; + + @override + String get overlayHistogramNone => 'لا شيء'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'الانارة'; + + @override + String get subtitlePositionTop => 'أعلى'; + + @override + String get subtitlePositionBottom => 'أسفل'; + + @override + String get themeBrightnessLight => 'مضيء'; + + @override + String get themeBrightnessDark => 'مظلم'; + + @override + String get themeBrightnessBlack => 'أسود'; + + @override + String get unitSystemMetric => 'النظام المتري'; + + @override + String get unitSystemImperial => 'النظام الإنشي'; + + @override + String get vaultLockTypePattern => 'نمط'; + + @override + String get vaultLockTypePin => 'رمز سري'; + + @override + String get vaultLockTypePassword => 'كلمة سر'; + + @override + String get settingsVideoEnablePip => 'صورة في صورة'; + + @override + String get videoControlsPlayOutside => 'فتح في مشغل آخر'; + + @override + String get videoLoopModeNever => 'أبداً'; + + @override + String get videoLoopModeShortOnly => 'فيديوهات قصيرة فقط'; + + @override + String get videoLoopModeAlways => 'دائماً'; + + @override + String get videoPlaybackSkip => 'تخطي'; + + @override + String get videoPlaybackMuted => 'تشغيل بدون صوت'; + + @override + String get videoPlaybackWithSound => 'تشغيل بالصوت'; + + @override + String get videoResumptionModeNever => 'أبداً'; + + @override + String get videoResumptionModeAlways => 'دائماً'; + + @override + String get viewerTransitionSlide => 'الإنزلاق'; + + @override + String get viewerTransitionParallax => 'تأثير الشبكية'; + + @override + String get viewerTransitionFade => 'تلاشي'; + + @override + String get viewerTransitionZoomIn => 'تكبير'; + + @override + String get viewerTransitionNone => 'لا شيء'; + + @override + String get wallpaperTargetHome => 'الشاشة الرئيسية'; + + @override + String get wallpaperTargetLock => 'شاشة القفل'; + + @override + String get wallpaperTargetHomeLock => 'الشاشة الرئيسية وشاشة القفل'; + + @override + String get widgetDisplayedItemRandom => 'عشوائي'; + + @override + String get widgetDisplayedItemMostRecent => 'الأحدث'; + + @override + String get widgetOpenPageHome => 'إفتح الرئيسية'; + + @override + String get widgetOpenPageCollection => 'فتح المجموعة'; + + @override + String get widgetOpenPageViewer => 'افتح العارض'; + + @override + String get widgetTapUpdateWidget => 'تحديث الويدجت'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'التخزين الداخلي'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'بطاقة الذاكرة'; + + @override + String get rootDirectoryDescription => 'دليل الجذر'; + + @override + String otherDirectoryDescription(String name) { + return 'دليل «$name»'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'يرجى تحديد $directory لـ «$volume» في الشاشة التالية لمنح هذا التطبيق حق الوصول إليه.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'لا يُسمح لهذا التطبيق بتعديل الملفات في $directory لـ «$volume»\n\nالرجاء استخدام مدير الملفات أو تطبيق المعرض المثبت مسبقًا لنقل العناصر إلى دليل آخر.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'تحتاج هذه العملية إلى $neededSize من المساحة الحرة على «$volume» لإكمالها، ولكن لم يتبق سوى $freeSize.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'منتقي ملفات النظام مفقود أو معطل. يرجى تمكينه والمحاولة مرة أخرى.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'هذه العملية غير معتمدة لعناصر الأنواع التالية: $types.', + one: 'هذه العملية غير مدعومة للعناصر من النوع التالي: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'بعض الملفات الموجودة في مجلد الوجهة لها نفس الاسم.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'بعض الملفات لها نفس الاسم.'; + + @override + String get addShortcutDialogLabel => 'تسمية الاختصار'; + + @override + String get addShortcutButtonLabel => 'إضافة'; + + @override + String get noMatchingAppDialogMessage => 'لا توجد تطبيقات يمكنها التعامل مع هذا.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'حرك هذه $countالعناصر إلى سلة المحذوفات؟', + one: 'هل تريد نقل هذا العنصر إلى سلة المحذوفات؟', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'احذف هذه $count أغراض؟', + one: 'هل تريد حذف هذا العنصر؟', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'هل تريد حفظ تواريخ العناصر قبل المتابعة؟'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'حفظ التواريخ'; + + @override + String videoResumeDialogMessage(String time) { + return 'هل ترغب في استئناف التشغيل في $time؟'; + } + + @override + String get videoStartOverButtonLabel => 'ابدأ من جديد'; + + @override + String get videoResumeButtonLabel => 'إستئناف'; + + @override + String get setCoverDialogLatest => 'أحدث عنصر'; + + @override + String get setCoverDialogAuto => 'آلي'; + + @override + String get setCoverDialogCustom => 'مخصص'; + + @override + String get hideFilterConfirmationDialogMessage => 'سيتم إخفاء الصور ومقاطع الفيديو المطابقة من مجموعتك. ويمكنك إظهارها مرة أخرى من إعدادات «الخصوصية».\n\nهل أنت متأكد أنك تريد إخفاءهم؟'; + + @override + String get newAlbumDialogTitle => 'البوم جديد'; + + @override + String get newAlbumDialogNameLabel => 'اسم الألبوم'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'الألبوم موجود بالفعل'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'الدليل موجود بالفعل'; + + @override + String get newAlbumDialogStorageLabel => 'تخزين:'; + + @override + String get newDynamicAlbumDialogTitle => 'ألبوم ديناميكي جديد'; + + @override + String get dynamicAlbumAlreadyExists => 'الألبوم الديناميكي موجود بالفعل'; + + @override + String get newGroupDialogTitle => 'مجموعة جديدة'; + + @override + String get newGroupDialogNameLabel => 'اسم المجموعة'; + + @override + String get groupAlreadyExists => 'المجموعة موجودة بالفعل'; + + @override + String get groupEmpty => 'لا توجد مجموعات'; + + @override + String get ungrouped => 'غير مجمعة'; + + @override + String get groupPickerTitle => 'اختر المجموعة'; + + @override + String get groupPickerUseThisGroupButton => 'استخدم هذه المجموعة'; + + @override + String get newVaultWarningDialogMessage => 'العناصر الموجودة في الخزائن متاحة فقط لهذا التطبيق وليس للتطبيقات الأخرى.\n\nإذا قمت بإلغاء تثبيت هذا التطبيق، أو قمت بحذف بيانات هذا التطبيق، فسوف تفقد كل هذه العناصر.'; + + @override + String get newVaultDialogTitle => 'خزنة جديدة'; + + @override + String get configureVaultDialogTitle => 'تكوين خزنة'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'القفل عند إيقاف تشغيل الشاشة'; + + @override + String get vaultDialogLockTypeLabel => 'نوع القفل'; + + @override + String get patternDialogEnter => 'أدخل النمط'; + + @override + String get patternDialogConfirm => 'تأكيد النمط'; + + @override + String get pinDialogEnter => 'أدخل الرمز السري'; + + @override + String get pinDialogConfirm => 'تأكيد الرمز السري'; + + @override + String get passwordDialogEnter => 'أدخل كلمة السر'; + + @override + String get passwordDialogConfirm => 'تأكيد كلمة السر'; + + @override + String get authenticateToConfigureVault => 'قم بالمصادقة لتكوين الخزنة'; + + @override + String get authenticateToUnlockVault => 'المصادقة لفتح الخزنة'; + + @override + String get vaultBinUsageDialogMessage => 'تستخدم بعض الخزائن سلة المحذوفات.'; + + @override + String get renameAlbumDialogLabel => 'إسم جديد'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'الدليل موجود بالفعل'; + + @override + String get renameEntrySetPageTitle => 'إعادة تسمية'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'نمط التسمية'; + + @override + String get renameEntrySetPageInsertTooltip => 'أدخل الحقل'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'معاينة'; + + @override + String get renameProcessorCounter => 'عداد'; + + @override + String get renameProcessorHash => 'تجزئة'; + + @override + String get renameProcessorName => 'اسم'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'احذف هذا الألبوم و $count العناصر فيه؟', + one: 'هل تريد حذف هذا الألبوم والعنصر الموجود فيه؟', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'احذف هذه الألبومات و $count العناصر فيها؟', + one: 'هل تريد حذف هذه الألبومات والعنصر الموجود فيها؟', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'شكل:'; + + @override + String get exportEntryDialogWidth => 'عرض'; + + @override + String get exportEntryDialogHeight => 'ارتفاع'; + + @override + String get exportEntryDialogQuality => 'جودة'; + + @override + String get exportEntryDialogWriteMetadata => 'كتابة البيانات الوصفية'; + + @override + String get renameEntryDialogLabel => 'اسم جديد'; + + @override + String get editEntryDialogCopyFromItem => 'نسخ من عنصر آخر'; + + @override + String get editEntryDialogTargetFieldsHeader => 'الحقول المراد تعديلها'; + + @override + String get editEntryDateDialogTitle => 'التاريخ والوقت'; + + @override + String get editEntryDateDialogSetCustom => 'تحديد تاريخ مخصص'; + + @override + String get editEntryDateDialogCopyField => 'نسخة من تاريخ آخر'; + + @override + String get editEntryDateDialogExtractFromTitle => 'استخراج من العنوان'; + + @override + String get editEntryDateDialogShift => 'تغيير'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'تاريخ تعديل الملف'; + + @override + String get durationDialogHours => 'ساعات'; + + @override + String get durationDialogMinutes => 'دقائق'; + + @override + String get durationDialogSeconds => 'ثواني'; + + @override + String get editEntryLocationDialogTitle => 'موقع'; + + @override + String get editEntryLocationDialogSetCustom => 'تعيين الموقع المخصص'; + + @override + String get editEntryLocationDialogChooseOnMap => 'اختر على الخريطة'; + + @override + String get editEntryLocationDialogImportGpx => 'استيراد GPX'; + + @override + String get editEntryLocationDialogLatitude => 'خط العرض'; + + @override + String get editEntryLocationDialogLongitude => 'خط الطول'; + + @override + String get editEntryLocationDialogTimeShift => 'التحول الزمني'; + + @override + String get locationPickerUseThisLocationButton => 'استخدم هذا الموقع'; + + @override + String get editEntryRatingDialogTitle => 'تقييم'; + + @override + String get removeEntryMetadataDialogTitle => 'ازالة البيانات الوصفية'; + + @override + String get removeEntryMetadataDialogAll => 'الكل'; + + @override + String get removeEntryMetadataDialogMore => 'أكثر'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'مطلوب XMP لتشغيل الفيديو داخل الصورة المتحركة.\n\nهل أنت متأكد أنك تريد إزالته؟'; + + @override + String get videoSpeedDialogLabel => 'سرعة التشغيل'; + + @override + String get videoStreamSelectionDialogVideo => 'فيديو'; + + @override + String get videoStreamSelectionDialogAudio => 'صوت'; + + @override + String get videoStreamSelectionDialogText => 'ترجمات'; + + @override + String get videoStreamSelectionDialogOff => 'ايقاف'; + + @override + String get videoStreamSelectionDialogTrack => 'مسار'; + + @override + String get videoStreamSelectionDialogNoSelection => 'لا توجد مسارات أخرى.'; + + @override + String get genericSuccessFeedback => 'إنتهى!'; + + @override + String get genericFailureFeedback => 'فشل'; + + @override + String get genericDangerWarningDialogMessage => 'هل أنت متأكد؟'; + + @override + String get tooManyItemsErrorDialogMessage => 'حاول مرة أخرى باستخدام عدد أقل من العناصر.'; + + @override + String get menuActionConfigureView => 'العرض'; + + @override + String get menuActionSelect => 'تحديد'; + + @override + String get menuActionSelectAll => 'تحديد الكل'; + + @override + String get menuActionSelectNone => 'لا تحدد شيء'; + + @override + String get menuActionMap => 'خريطة'; + + @override + String get menuActionSlideshow => 'عرض الشرائح'; + + @override + String get menuActionStats => 'احصائيات'; + + @override + String get viewDialogSortSectionTitle => 'نوع'; + + @override + String get viewDialogGroupSectionTitle => 'الأقسام'; + + @override + String get viewDialogLayoutSectionTitle => 'تخطيط'; + + @override + String get viewDialogReverseSortOrder => 'عكس ترتيب الفرز'; + + @override + String get tileLayoutMosaic => 'فسيفساء'; + + @override + String get tileLayoutGrid => 'شبكة'; + + @override + String get tileLayoutList => 'قائمة'; + + @override + String get castDialogTitle => 'أجهزة البث'; + + @override + String get coverDialogTabCover => 'غلاف'; + + @override + String get coverDialogTabApp => 'التطبيق'; + + @override + String get coverDialogTabColor => 'اللون'; + + @override + String get appPickDialogTitle => 'اختر التطبيق'; + + @override + String get appPickDialogNone => 'لاشيء'; + + @override + String get aboutPageTitle => 'حول'; + + @override + String get aboutLinkLicense => 'رخصة'; + + @override + String get aboutLinkPolicy => 'سياسة الخصوصية'; + + @override + String get aboutBugSectionTitle => 'تقرير الأخطاء'; + + @override + String get aboutBugSaveLogInstruction => 'حفظ سجلات التطبيق في ملف'; + + @override + String get aboutBugCopyInfoInstruction => 'نسخ معلومات النظام'; + + @override + String get aboutBugCopyInfoButton => 'نسخ'; + + @override + String get aboutBugReportInstruction => 'تقرير على GitHub مع السجلات ومعلومات النظام'; + + @override + String get aboutBugReportButton => 'تقرير'; + + @override + String get aboutDataUsageSectionTitle => 'استخدام البيانات'; + + @override + String get aboutDataUsageData => 'بيانات'; + + @override + String get aboutDataUsageCache => 'التخزين المؤقت'; + + @override + String get aboutDataUsageDatabase => 'قاعدة البيانات'; + + @override + String get aboutDataUsageMisc => 'منوعات'; + + @override + String get aboutDataUsageInternal => 'داخلي'; + + @override + String get aboutDataUsageExternal => 'خارجي'; + + @override + String get aboutDataUsageClearCache => 'مسح ذاكرة التخزين المؤقت'; + + @override + String get aboutCreditsSectionTitle => 'الاعتمادات'; + + @override + String get aboutCreditsWorldAtlas1 => 'يستخدم هذا التطبيق ملف TopoJSON من'; + + @override + String get aboutCreditsWorldAtlas2 => 'بموجب ترخيص ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'المترجمين'; + + @override + String get aboutLicensesSectionTitle => 'تراخيص مفتوحة المصدر'; + + @override + String get aboutLicensesBanner => 'يستخدم هذا التطبيق الحزم والمكتبات مفتوحة المصدر التالية.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'مكتبات أندرويد'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'مكونات إضافية'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'حزم إضافية'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'حزم البرمجة'; + + @override + String get aboutLicensesShowAllButtonLabel => 'عرض كافة التراخيص'; + + @override + String get policyPageTitle => 'سياسة الخصوصية'; + + @override + String get collectionPageTitle => 'مجموعة بيانات'; + + @override + String get collectionPickPageTitle => 'اختيار'; + + @override + String get collectionSelectPageTitle => 'اختيار العناصر'; + + @override + String get collectionActionShowTitleSearch => 'إظهار مرشح العنوان'; + + @override + String get collectionActionHideTitleSearch => 'إخفاء مرشح العنوان'; + + @override + String get collectionActionAddDynamicAlbum => 'إضافة ألبوم ديناميكي'; + + @override + String get collectionActionAddShortcut => 'إضافة اختصار'; + + @override + String get collectionActionSetHome => 'تعيين كخلفية'; + + @override + String get collectionActionEmptyBin => 'سلة فارغة'; + + @override + String get collectionActionCopy => 'نسخ إلى الألبوم'; + + @override + String get collectionActionMove => 'نقل إلى الألبوم'; + + @override + String get collectionActionRescan => 'إعادة المسح'; + + @override + String get collectionActionEdit => 'تحرير'; + + @override + String get collectionSearchTitlesHintText => 'عناوين البحث'; + + @override + String get collectionGroupAlbum => 'حسب الألبوم'; + + @override + String get collectionGroupMonth => 'حسب الشهر'; + + @override + String get collectionGroupDay => 'حسب اليوم'; + + @override + String get sectionNone => 'لا يوجد أقسام'; + + @override + String get sectionUnknown => 'مجهول'; + + @override + String get dateToday => 'اليوم'; + + @override + String get dateYesterday => 'أمس'; + + @override + String get dateThisMonth => 'هذا الشهر'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'فشل الحذف $count items', + one: 'فشل حذف عنصر واحد', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'فشل النسخ $count items', + one: 'فشل نسخ عنصر واحد', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'فشل في النقل $count items', + one: 'فشل في نقل عنصر واحد', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'فشلت إعادة التسمية $count items', + one: 'فشلت إعادة تسمية عنصر واحد', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'فشل التحرير $count items', + one: 'فشل تحرير عنصر واحد', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'فشل التصدير $count pages', + one: 'فشل تصدير صفحة واحدة', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'نسخ $count أغراض', + one: 'تم نسخ عنصر واحد', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'نقل $count عناصر', + one: 'تم نقل عنصر واحد', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'أعادة تسمية $count عناصر', + one: 'تمت إعادة تسمية عنصر واحد', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'تحرير $count عناصر', + one: 'تم تحريرعنصر واحد', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'لا يوجد مفضلة'; + + @override + String get collectionEmptyVideos => 'لا توجد فيديوهات'; + + @override + String get collectionEmptyImages => 'لا توجد صور'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'منح الوصول'; + + @override + String get collectionSelectSectionTooltip => 'اختر القسم'; + + @override + String get collectionDeselectSectionTooltip => 'قم بإلغاء تحديد القسم'; + + @override + String get drawerAboutButton => 'حول'; + + @override + String get drawerSettingsButton => 'إعدادات'; + + @override + String get drawerCollectionAll => 'كافة الوسائط'; + + @override + String get drawerCollectionFavourites => 'المفضلة'; + + @override + String get drawerCollectionImages => 'الصور'; + + @override + String get drawerCollectionVideos => 'الفيديوهات'; + + @override + String get drawerCollectionAnimated => 'متحرك'; + + @override + String get drawerCollectionMotionPhotos => 'صور متحركة'; + + @override + String get drawerCollectionPanoramas => 'لقطات بانورامية'; + + @override + String get drawerCollectionRaws => 'الصور الخام'; + + @override + String get drawerCollectionSphericalVideos => 'فيديوهات 360 درجة'; + + @override + String get drawerAlbumPage => 'الألبومات'; + + @override + String get drawerCountryPage => 'البلدان'; + + @override + String get drawerPlacePage => 'الأماكن'; + + @override + String get drawerTagPage => 'العلامات'; + + @override + String get sortByDate => 'حسب التاريخ'; + + @override + String get sortByName => 'حسب الإسم'; + + @override + String get sortByItemCount => 'حسب عدد العناصر'; + + @override + String get sortBySize => 'حسب الحجم'; + + @override + String get sortByAlbumFileName => 'حسب عنوان الألبوم والعنصر'; + + @override + String get sortByRating => 'حسب التصنيف'; + + @override + String get sortByDuration => 'حسب المدة'; + + @override + String get sortByPath => 'حسب المسار'; + + @override + String get sortOrderNewestFirst => 'الأحدث أولاً'; + + @override + String get sortOrderOldestFirst => 'الأقدم أولا'; + + @override + String get sortOrderAtoZ => 'من الألف إلى الياء'; + + @override + String get sortOrderZtoA => 'من الياء إلى الألف'; + + @override + String get sortOrderHighestFirst => 'الاعلى اولا'; + + @override + String get sortOrderLowestFirst => 'الأدنى أولاً'; + + @override + String get sortOrderLargestFirst => 'الأكبر أولاً'; + + @override + String get sortOrderSmallestFirst => 'الأصغر أولاً'; + + @override + String get sortOrderShortestFirst => 'الأقصر أولاً'; + + @override + String get sortOrderLongestFirst => 'الأطول أولاً'; + + @override + String get albumGroupTier => 'حسب الطبقة'; + + @override + String get albumGroupType => 'حسب النوع'; + + @override + String get albumGroupVolume => 'حسب حجم التخزين'; + + @override + String get albumMimeTypeMixed => 'مختلط'; + + @override + String get albumPickPageTitleCopy => 'نسخ إلى ألبوم'; + + @override + String get albumPickPageTitleExport => 'تصدير إلى الألبوم'; + + @override + String get albumPickPageTitleMove => 'انتقل إلى الألبوم'; + + @override + String get albumPickPageTitlePick => 'اختر الألبوم'; + + @override + String get albumCamera => 'الكاميرا'; + + @override + String get albumDownload => 'التحميل'; + + @override + String get albumScreenshots => 'لقطات الشاشة'; + + @override + String get albumScreenRecordings => 'تسجيل الشاشة'; + + @override + String get albumVideoCaptures => 'الفيديوهات الملتقطة'; + + @override + String get albumPageTitle => 'الألبومات'; + + @override + String get albumEmpty => 'لا توجد ألبومات'; + + @override + String get createAlbumButtonLabel => 'إنشاء'; + + @override + String get newFilterBanner => 'الجديد'; + + @override + String get countryPageTitle => 'دول'; + + @override + String get countryEmpty => 'لا توجد دول'; + + @override + String get statePageTitle => 'الولايات'; + + @override + String get stateEmpty => 'لا توجد ولايات'; + + @override + String get placePageTitle => 'أماكن'; + + @override + String get placeEmpty => 'لا توجد أماكن'; + + @override + String get tagPageTitle => 'العلامات'; + + @override + String get tagEmpty => 'لا توجد العلامات'; + + @override + String get tagPickPageTitle => 'اختر الوسم'; + + @override + String get binPageTitle => 'سلة المحذوفات'; + + @override + String get explorerPageTitle => 'المستكشف'; + + @override + String get explorerActionSelectStorageVolume => 'حدد التخزين'; + + @override + String get selectStorageVolumeDialogTitle => 'حدد التَخزين'; + + @override + String get searchCollectionFieldHint => 'البحث في المجموعة'; + + @override + String get searchRecentSectionTitle => 'مؤخرًا'; + + @override + String get searchDateSectionTitle => 'تاريخ'; + + @override + String get searchFormatSectionTitle => 'التنسيقات'; + + @override + String get searchAlbumsSectionTitle => 'الألبومات'; + + @override + String get searchCountriesSectionTitle => 'البلدان'; + + @override + String get searchStatesSectionTitle => 'الولايات'; + + @override + String get searchPlacesSectionTitle => 'الأماكن'; + + @override + String get searchTagsSectionTitle => 'العلامات'; + + @override + String get searchRatingSectionTitle => 'التقييمات'; + + @override + String get searchMetadataSectionTitle => 'البيانات الوصفية'; + + @override + String get settingsPageTitle => 'إعدادات'; + + @override + String get settingsSystemDefault => 'الإعداد الافتراضي للنظام'; + + @override + String get settingsDefault => 'افتراضي'; + + @override + String get settingsDisabled => 'غير مفعل'; + + @override + String get settingsEnabled => 'مُفعّل'; + + @override + String get settingsForced => 'قسري'; + + @override + String get settingsAskEverytime => 'اسأل كل مرة'; + + @override + String get settingsModificationWarningDialogMessage => 'سيتم تعديل الإعدادات الأخرى.'; + + @override + String get settingsSearchFieldLabel => 'إعدادات البحث'; + + @override + String get settingsSearchEmpty => 'لا يوجد إعداد مطابق'; + + @override + String get settingsActionExport => 'تصدير'; + + @override + String get settingsActionExportDialogTitle => 'تصدير'; + + @override + String get settingsActionImport => 'إستيراد'; + + @override + String get settingsActionImportDialogTitle => 'يستورد'; + + @override + String get appExportCovers => 'أغلفة'; + + @override + String get appExportDynamicAlbums => 'الألبومات الديناميكية'; + + @override + String get appExportFavourites => 'المفضلة'; + + @override + String get appExportSettings => 'إعدادات'; + + @override + String get settingsNavigationSectionTitle => 'التنقل'; + + @override + String get settingsHomeTile => 'الرئيسية'; + + @override + String get settingsHomeDialogTitle => 'الرئيسية'; + + @override + String get setHomeCustom => 'مخصص'; + + @override + String get settingsKeepScreenOnTile => 'إبقاء الشاشة قيد التشغيل'; + + @override + String get settingsKeepScreenOnDialogTitle => 'ابقاء الشَاشة قيد التشغيل'; + + @override + String get settingsDoubleBackExit => 'اضغط على «رجوع» مرتين للخروج'; + + @override + String get settingsConfirmationTile => 'نوافذ التأكيد'; + + @override + String get settingsConfirmationDialogTitle => 'نوافذ تأكيد الحوار'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'اسأل قبل حذف العناصر إلى الأبد'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'اسأل قبل نقل العناصر إلى سلة المحذوفات'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'اسأل قبل نقل العناصر غير المؤرخة'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'إظهار الرسالة بعد نقل العناصر إلى سلة المحذوفات'; + + @override + String get settingsConfirmationVaultDataLoss => 'إظهار تحذير فقدان بيانات المخزن'; + + @override + String get settingsNavigationDrawerTile => 'قائمة تنقل'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'قائمة التنقل'; + + @override + String get settingsNavigationDrawerBanner => 'إلمس مع الاستمرار لنقل عناصر القائمة وإعادة ترتيبها.'; + + @override + String get settingsNavigationDrawerTabTypes => 'أنواع'; + + @override + String get settingsNavigationDrawerTabAlbums => 'الألبومات'; + + @override + String get settingsNavigationDrawerTabPages => 'الصفحات'; + + @override + String get settingsNavigationDrawerAddAlbum => 'إضافة ألبوم'; + + @override + String get settingsNavigationBottomActionsTile => 'شريط التنقل السفلي'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'شريط التنقل السفلي'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'المس باستمرار لتحريك الأزرار وتحديد الإجراءات التي يتم عرضها في شريط التنقل السفلي.'; + + @override + String get settingsThumbnailSectionTitle => 'الصور المصغرة'; + + @override + String get settingsThumbnailOverlayTile => 'التراكب'; + + @override + String get settingsThumbnailOverlayPageTitle => 'التراكب'; + + @override + String get settingsThumbnailShowHdrIcon => 'إظهار أيقونة HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'إظهار الأيقونة المفضلة'; + + @override + String get settingsThumbnailShowTagIcon => 'إظهار رمز العلامة'; + + @override + String get settingsThumbnailShowLocationIcon => 'إظهار رمز الموقع'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'إظهار أيقونة الصورة المتحركة'; + + @override + String get settingsThumbnailShowRating => 'عرض التقييم'; + + @override + String get settingsThumbnailShowRawIcon => 'إظهار أيقونة الخام'; + + @override + String get settingsThumbnailShowVideoDuration => 'عرض مدة الفيديو'; + + @override + String get settingsCollectionQuickActionsTile => 'إجراءات سريعة'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'اجراءات سريعة'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'التصفح'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'إختيار'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'المس مع الاستمرار لتحريك الأزرار وتحديد الإجراءات التي يتم عرضها عند تصفح العناصر.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'المس مع الاستمرار لتحريك الأزرار وتحديد الإجراءات التي يتم عرضها عند تحديد العناصر.'; + + @override + String get settingsCollectionBurstPatternsTile => 'أنماط الصور المتتابعة'; + + @override + String get settingsCollectionBurstPatternsNone => 'لا شيء'; + + @override + String get settingsViewerSectionTitle => 'المعرض'; + + @override + String get settingsViewerGestureSideTapNext => 'اضغط على حواف الشاشة لإظهار العنصر السابق/التالي'; + + @override + String get settingsViewerUseCutout => 'استخدام منطقة القص'; + + @override + String get settingsViewerMaximumBrightness => 'أقصى سطوع'; + + @override + String get settingsMotionPhotoAutoPlay => 'التشغيل التلقائي للصور المتحركة'; + + @override + String get settingsImageBackground => 'خلفية الصورة'; + + @override + String get settingsViewerQuickActionsTile => 'إجراءات سريعة'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'اجراءات سريعة'; + + @override + String get settingsViewerQuickActionEditorBanner => 'المس مع الاستمرار لتحريك الأزرار وتحديد الإجراءات التي سيتم عرضها في العارض.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'الأزرار المعروضة'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'الأزرار المتاحة'; + + @override + String get settingsViewerQuickActionEmpty => 'لا يوجد أزرار'; + + @override + String get settingsViewerOverlayTile => 'تراكب'; + + @override + String get settingsViewerOverlayPageTitle => 'تراكب'; + + @override + String get settingsViewerShowOverlayOnOpening => 'عرض عند الفتح'; + + @override + String get settingsViewerShowHistogram => 'إظهار الرسم البياني'; + + @override + String get settingsViewerShowMinimap => 'إظهار الخريطة المصغرة'; + + @override + String get settingsViewerShowZoomLevel => 'إظهار مستوى التكبير'; + + @override + String get settingsViewerShowInformation => 'مزيد من المعلومات'; + + @override + String get settingsViewerShowInformationSubtitle => 'إظهار العنوان والتاريخ والموقع وما إلى ذلك.'; + + @override + String get settingsViewerShowRatingTags => 'عرض التصنيف والعلامات'; + + @override + String get settingsViewerShowShootingDetails => 'عرض تفاصيل التصوير'; + + @override + String get settingsViewerShowDescription => 'إظهار الوصف'; + + @override + String get settingsViewerShowOverlayThumbnails => 'عرض الصور المصغرة'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'تأثير الضبابية'; + + @override + String get settingsViewerSlideshowTile => 'عرض الشرائح'; + + @override + String get settingsViewerSlideshowPageTitle => 'عرض الشرائح'; + + @override + String get settingsSlideshowRepeat => 'تكرار'; + + @override + String get settingsSlideshowShuffle => 'تشغيل عشوائي'; + + @override + String get settingsSlideshowFillScreen => 'ملء الشاشة'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'تأثير التكبير المتحرك'; + + @override + String get settingsSlideshowTransitionTile => 'انتقال'; + + @override + String get settingsSlideshowIntervalTile => 'فاصلة'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'تشغيل الفيديو'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'تَشغيل الفيديو'; + + @override + String get settingsVideoPageTitle => 'اعدادات الفيديو'; + + @override + String get settingsVideoSectionTitle => 'الفيديو'; + + @override + String get settingsVideoShowVideos => 'عرض الفيديوهات'; + + @override + String get settingsVideoPlaybackTile => 'التشغيل'; + + @override + String get settingsVideoPlaybackPageTitle => 'التشغيل'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'تسريع الأجهزة'; + + @override + String get settingsVideoAutoPlay => 'تشغيل تلقائي'; + + @override + String get settingsVideoLoopModeTile => 'وضع التكرار'; + + @override + String get settingsVideoLoopModeDialogTitle => 'وضع التَكرار'; + + @override + String get settingsVideoResumptionModeTile => 'استئناف التشغيل'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'إستئناف التشغيل'; + + @override + String get settingsVideoBackgroundMode => 'وضع الخلفية'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'وضع الخلـفية'; + + @override + String get settingsVideoControlsTile => 'ضوابط'; + + @override + String get settingsVideoControlsPageTitle => 'ضوابط'; + + @override + String get settingsVideoButtonsTile => 'أزرار'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'انقر نقرًا مزدوجًا للتشغيل/الإيقاف'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'انقر نقرًا مزدوجًا على حواف الشاشة للتقدم للأمام/للخلف'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'اسحب لأعلى أو لأسفل لضبط مستوى السطوع/الصوت'; + + @override + String get settingsSubtitleThemeTile => 'ترجمات'; + + @override + String get settingsSubtitleThemePageTitle => 'ترجمات'; + + @override + String get settingsSubtitleThemeSample => 'هذه عينة بسيطة.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'محاذاة النص'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'مُحاذاة النص'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'موضع النص'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'موضع النَص'; + + @override + String get settingsSubtitleThemeTextSize => 'حجم الخط'; + + @override + String get settingsSubtitleThemeShowOutline => 'إظهار الخطوط العريضة والظل'; + + @override + String get settingsSubtitleThemeTextColor => 'لون الخط'; + + @override + String get settingsSubtitleThemeTextOpacity => 'عتامة النص'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'لون الخلفية'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'عتامة الخلفية'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'يسار'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'وسط'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'يمين'; + + @override + String get settingsPrivacySectionTitle => 'الخصوصية'; + + @override + String get settingsAllowInstalledAppAccess => 'السماح بالوصول إلى مخزون التطبيق'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'يستخدم لتحسين عرض الألبوم'; + + @override + String get settingsAllowErrorReporting => 'السماح بالإبلاغ عن الأخطاء المجهولة'; + + @override + String get settingsSaveSearchHistory => 'حفظ سجل البحث'; + + @override + String get settingsEnableBin => 'استخدم سلة المحذوفات'; + + @override + String get settingsEnableBinSubtitle => 'الاحتفاظ بالعناصر المحذوفة لمدة 30 يومًا'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'سيتم حذف العناصر الموجودة في سلة المحذوفات إلى الأبد.'; + + @override + String get settingsAllowMediaManagement => 'السماح بإدارة الوسائط'; + + @override + String get settingsHiddenItemsTile => 'العناصر المخفية'; + + @override + String get settingsHiddenItemsPageTitle => 'العناصر المَخفية'; + + @override + String get settingsHiddenFiltersBanner => 'لن تظهر الصور ومقاطع الفيديو المطابقة للمرشحات المخفية في مجموعتك.'; + + @override + String get settingsHiddenFiltersEmpty => 'لا يوجد مرشحات مخفية'; + + @override + String get settingsStorageAccessTile => 'الوصول إلى التخزين'; + + @override + String get settingsStorageAccessPageTitle => 'الوصُول إلى التخزين'; + + @override + String get settingsStorageAccessBanner => 'تتطلب بعض المسارات منح وصول صريح لتعديل الملفات الموجودة فيها. يمكنك هنا مراجعة المسارات التي منحتها حق الوصول إليها مسبقًا.'; + + @override + String get settingsStorageAccessEmpty => 'عدم منح الوصول'; + + @override + String get settingsStorageAccessRevokeTooltip => 'إبطال'; + + @override + String get settingsAccessibilitySectionTitle => 'إمكانية الوصول'; + + @override + String get settingsRemoveAnimationsTile => 'إزالة الرسوم المتحركة'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'ازالة الرسوم المتحركة'; + + @override + String get settingsTimeToTakeActionTile => 'وقت إتخاذ الإجراءات'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'عرض بدائل إيماءات اللمس المتعدد'; + + @override + String get settingsDisplaySectionTitle => 'عَرض'; + + @override + String get settingsThemeBrightnessTile => 'السمَة'; + + @override + String get settingsThemeBrightnessDialogTitle => 'السمة'; + + @override + String get settingsThemeColorHighlights => 'تحديد الألوان'; + + @override + String get settingsThemeEnableDynamicColor => 'اللون الديناميكي'; + + @override + String get settingsDisplayRefreshRateModeTile => 'عرض معدل التحديث'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'معدل التحديث'; + + @override + String get settingsDisplayUseTvInterface => 'واجهة أندرويد TV'; + + @override + String get settingsLanguageSectionTitle => 'اللغة والتنسيقات'; + + @override + String get settingsLanguageTile => 'اللغة'; + + @override + String get settingsLanguagePageTitle => 'اللغة'; + + @override + String get settingsCoordinateFormatTile => 'تنسيق الإحداثيات'; + + @override + String get settingsCoordinateFormatDialogTitle => 'تنسيق الاحداثيات'; + + @override + String get settingsUnitSystemTile => 'الوحدات'; + + @override + String get settingsUnitSystemDialogTitle => 'الوحدات'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'فرض الأرقام العربية'; + + @override + String get settingsScreenSaverPageTitle => 'شاشة التوقف'; + + @override + String get settingsWidgetPageTitle => 'إطار الصورة'; + + @override + String get settingsWidgetShowOutline => 'الخطوط العريضة'; + + @override + String get settingsWidgetOpenPage => 'عند النقر على الويدجت'; + + @override + String get settingsWidgetDisplayedItem => 'العنصر المعروض'; + + @override + String get settingsCollectionTile => 'مجمُوعة'; + + @override + String get statsPageTitle => 'احصائيات'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count العناصر مع الموقع', + one: '1 عنصر مع الموقع', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'أهم الدول'; + + @override + String get statsTopStatesSectionTitle => 'أهم الولايات'; + + @override + String get statsTopPlacesSectionTitle => 'أهم المواقع'; + + @override + String get statsTopTagsSectionTitle => 'أهم العلامات'; + + @override + String get statsTopAlbumsSectionTitle => 'أهم الألبومات'; + + @override + String get viewerOpenPanoramaButtonLabel => 'فتح البانوراما'; + + @override + String get viewerSetWallpaperButtonLabel => 'تعيين خلفية'; + + @override + String get viewerErrorUnknown => 'آسف!'; + + @override + String get viewerErrorDoesNotExist => 'الملف لم يعد موجودا.'; + + @override + String get viewerInfoPageTitle => 'معلومات'; + + @override + String get viewerInfoBackToViewerTooltip => 'العودة إلى العارض'; + + @override + String get viewerInfoUnknown => 'مَجهول'; + + @override + String get viewerInfoLabelDescription => 'وصف'; + + @override + String get viewerInfoLabelTitle => 'العنوان'; + + @override + String get viewerInfoLabelDate => 'التاريخ'; + + @override + String get viewerInfoLabelResolution => 'الدقة'; + + @override + String get viewerInfoLabelSize => 'الحجم'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'المسار'; + + @override + String get viewerInfoLabelDuration => 'المدة'; + + @override + String get viewerInfoLabelOwner => 'المالك'; + + @override + String get viewerInfoLabelCoordinates => 'الإحداثيات'; + + @override + String get viewerInfoLabelAddress => 'العنوان'; + + @override + String get mapStyleDialogTitle => 'نمط الخريطة'; + + @override + String get mapStyleDialogAddStyle => 'إضافة نمط'; + + @override + String get mapStyleTooltip => 'حدد نمط الخريطة'; + + @override + String get mapStyleEditorDialogName => 'اسم'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'المجالات الفرعية'; + + @override + String get mapStyleEditorDialogUserAgent => 'وكيل المستخدم'; + + @override + String get mapZoomInTooltip => 'تكبير'; + + @override + String get mapZoomOutTooltip => 'تصغير'; + + @override + String get mapPointNorthUpTooltip => 'نقطة الشمال لأعلى'; + + @override + String get mapAttributionOsmData => 'بيانات الخريطة © [OpenStreetMap](https://www.openstreetmap.org/copyright) المساهمين'; + + @override + String get mapAttributionOsmLiberty => 'البلاط بواسطة [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • مُستضاف بواسطة [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | البلاط بواسطة [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'البلاط بواسطة [HOT](https://www.hotosm.org/) • استضافة بواسطة [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'البلاط بواسطة [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'عرض على صفحة الخريطة'; + + @override + String get mapEmptyRegion => 'لا توجد صور في هذه المنطقة'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'فشل في استخراج البيانات المضمنة'; + + @override + String get viewerInfoOpenLinkText => 'فتح'; + + @override + String get viewerInfoViewXmlLinkText => 'عرض ملف XML'; + + @override + String get viewerInfoSearchFieldLabel => 'البحث في البيانات الوصفية'; + + @override + String get viewerInfoSearchEmpty => 'لا توجد مفاتيح مطابقة'; + + @override + String get viewerInfoSearchSuggestionDate => 'التَاريخ والوقت'; + + @override + String get viewerInfoSearchSuggestionDescription => 'الوصف'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'الأبعاد'; + + @override + String get viewerInfoSearchSuggestionResolution => 'الدقة'; + + @override + String get viewerInfoSearchSuggestionRights => 'الحقوق'; + + @override + String get wallpaperUseScrollEffect => 'استخدم تأثير التمرير على الشاشة الرئيسية'; + + @override + String get tagEditorPageTitle => 'تحريرالعلامات'; + + @override + String get tagEditorPageNewTagFieldLabel => 'علامة جديدة'; + + @override + String get tagEditorPageAddTagTooltip => 'إضافة علامة'; + + @override + String get tagEditorSectionRecent => 'الأخيرة'; + + @override + String get tagEditorSectionPlaceholders => 'العناصر النائبة'; + + @override + String get tagEditorDiscardDialogMessage => 'هل تريد تجاهل التغييرات؟'; + + @override + String get tagPlaceholderCountry => 'البلد'; + + @override + String get tagPlaceholderState => 'الولاية'; + + @override + String get tagPlaceholderPlace => 'المكان'; + + @override + String get panoramaEnableSensorControl => 'تمكين التحكم في المستشعر'; + + @override + String get panoramaDisableSensorControl => 'تعطيل التحكم في المستشعر'; + + @override + String get sourceViewerPageTitle => 'المصدر'; +} diff --git a/lib/l10ngen/app_localizations_az.dart b/lib/l10ngen/app_localizations_az.dart new file mode 100644 index 0000000..588725f --- /dev/null +++ b/lib/l10ngen/app_localizations_az.dart @@ -0,0 +1,2424 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Azerbaijani (`az`). +class AppLocalizationsAz extends AppLocalizations { + AppLocalizationsAz([String locale = 'az']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Aves-ə Xoş Gəlmisiniz'; + + @override + String get welcomeOptional => 'Zəruri deyil'; + + @override + String get welcomeTermsToggle => 'Mən hökm və şərtlərlə razıyam'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString element', + one: '$countString element', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString sütun', + one: '$countString sütun', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString saniyə', + one: '$countString saniyə', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString dəqiqə', + one: '$countString dəqiqə', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString gün', + one: '$countString gün', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'TƏTBİQ ET'; + + @override + String get createButtonLabel => 'YARAT'; + + @override + String get deleteButtonLabel => 'SİL'; + + @override + String get nextButtonLabel => 'NÖVBƏTİ'; + + @override + String get showButtonLabel => 'GÖSTƏR'; + + @override + String get hideButtonLabel => 'GİZLƏT'; + + @override + String get continueButtonLabel => 'DAVAM ET'; + + @override + String get saveCopyButtonLabel => 'NÜSXƏNİ SAXLA'; + + @override + String get applyTooltip => 'Tətbiq et'; + + @override + String get cancelTooltip => 'Ləğv et'; + + @override + String get changeTooltip => 'Dəyişdir'; + + @override + String get clearTooltip => 'Təmizlə'; + + @override + String get previousTooltip => 'Əvvəlki'; + + @override + String get nextTooltip => 'Növbəti'; + + @override + String get showTooltip => 'Göstər'; + + @override + String get hideTooltip => 'Gizlət'; + + @override + String get actionRemove => 'Təmizlə'; + + @override + String get resetTooltip => 'Sıfırla'; + + @override + String get saveTooltip => 'Saxla'; + + @override + String get stopTooltip => 'Dayandır'; + + @override + String get pickTooltip => 'Seçin'; + + @override + String get doubleBackExitMessage => 'Çıxmaq üçün təkrar “geri”-yə kliklə.'; + + @override + String get doNotAskAgain => 'Təkrar soruşma'; + + @override + String get sourceStateLoading => 'Yüklənilir'; + + @override + String get sourceStateCataloguing => 'Sənədləşdirmə'; + + @override + String get sourceStateLocatingCountries => 'Ölkələr yerləşdirilir'; + + @override + String get sourceStateLocatingPlaces => 'Yerlər müəyyənləşdirilir'; + + @override + String get chipActionDelete => 'Sil'; + + @override + String get chipActionRemove => 'Təmizlə'; + + @override + String get chipActionShowCollection => 'Kolleksiyada Göstər'; + + @override + String get chipActionGoToAlbumPage => 'Albomlarda Göstər'; + + @override + String get chipActionGoToCountryPage => 'Ölkələrdə Göstər'; + + @override + String get chipActionGoToPlacePage => 'Yerlərdə Göstər'; + + @override + String get chipActionGoToTagPage => 'Etiketlərdə Göstər'; + + @override + String get chipActionGoToExplorerPage => 'Nəticədə Göstər'; + + @override + String get chipActionDecompose => 'Böl'; + + @override + String get chipActionFilterOut => 'Ayırın'; + + @override + String get chipActionFilterIn => 'Qoyun'; + + @override + String get chipActionHide => 'Gizlət'; + + @override + String get chipActionLock => 'Kilidlə'; + + @override + String get chipActionPin => 'Yuxarıya sabitlə'; + + @override + String get chipActionUnpin => 'Sabitləməyin'; + + @override + String get chipActionGroup => 'Qruplandırmanı dəyişdir'; + + @override + String get chipActionRename => 'Bir də adlandır'; + + @override + String get chipActionSetCover => 'Set cover'; + + @override + String get chipActionShowCountryStates => 'Show states'; + + @override + String get chipActionCreateGroup => 'Qrup yarat'; + + @override + String get chipActionCreateAlbum => 'Albom yarat'; + + @override + String get chipActionCreateVault => 'Create vault'; + + @override + String get chipActionConfigureVault => 'Configure vault'; + + @override + String get entryActionCopyToClipboard => 'Copy to clipboard'; + + @override + String get entryActionDelete => 'Delete'; + + @override + String get entryActionConvert => 'Convert'; + + @override + String get entryActionExport => 'Export'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Rename'; + + @override + String get entryActionRestore => 'Restore'; + + @override + String get entryActionRotateCCW => 'Rotate counterclockwise'; + + @override + String get entryActionRotateCW => 'Rotate clockwise'; + + @override + String get entryActionFlip => 'Flip horizontally'; + + @override + String get entryActionPrint => 'Print'; + + @override + String get entryActionShare => 'Share'; + + @override + String get entryActionShareImageOnly => 'Share image only'; + + @override + String get entryActionShareVideoOnly => 'Share video only'; + + @override + String get entryActionViewSource => 'View source'; + + @override + String get entryActionShowGeoTiffOnMap => 'Show as map overlay'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convert to still image'; + + @override + String get entryActionViewMotionPhotoVideo => 'Open video'; + + @override + String get entryActionEdit => 'Edit'; + + @override + String get entryActionOpen => 'Open with'; + + @override + String get entryActionSetAs => 'Set as'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Show in map app'; + + @override + String get entryActionRotateScreen => 'Rotate screen'; + + @override + String get entryActionAddFavourite => 'Add to favorites'; + + @override + String get entryActionRemoveFavourite => 'Remove from favorites'; + + @override + String get videoActionCaptureFrame => 'Capture frame'; + + @override + String get videoActionMute => 'Mute'; + + @override + String get videoActionUnmute => 'Unmute'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Play'; + + @override + String get videoActionReplay10 => 'Seek backward 10 seconds'; + + @override + String get videoActionSkip10 => 'Seek forward 10 seconds'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Select tracks'; + + @override + String get videoActionSetSpeed => 'Playback speed'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Settings'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Resume'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'Edit date & time'; + + @override + String get entryInfoActionEditLocation => 'Edit location'; + + @override + String get entryInfoActionEditTitleDescription => 'Edit title & description'; + + @override + String get entryInfoActionEditRating => 'Edit rating'; + + @override + String get entryInfoActionEditTags => 'Edit tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Remove metadata'; + + @override + String get entryInfoActionExportMetadata => 'Export metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Remove location'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Crop'; + + @override + String get editorTransformRotate => 'Rotate'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landscape'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Recycle bin'; + + @override + String get filterFavouriteLabel => 'Favorite'; + + @override + String get filterNoDateLabel => 'Undated'; + + @override + String get filterNoAddressLabel => 'No address'; + + @override + String get filterLocatedLabel => 'Located'; + + @override + String get filterNoLocationLabel => 'Unlocated'; + + @override + String get filterNoRatingLabel => 'Unrated'; + + @override + String get filterTaggedLabel => 'Tagged'; + + @override + String get filterNoTagLabel => 'Untagged'; + + @override + String get filterNoTitleLabel => 'Untitled'; + + @override + String get filterOnThisDayLabel => 'On this day'; + + @override + String get filterRecentlyAddedLabel => 'Recently added'; + + @override + String get filterRatingRejectedLabel => 'Rejected'; + + @override + String get filterTypeAnimatedLabel => 'Animated'; + + @override + String get filterTypeMotionPhotoLabel => 'Motion Photo'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Image'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'New'; + + @override + String get albumTierPinned => 'Pinned'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Common'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Others'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimal degrees'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Highest rate'; + + @override + String get displayRefreshRatePreferLowest => 'Lowest rate'; + + @override + String get keepScreenOnNever => 'Never'; + + @override + String get keepScreenOnVideoPlayback => 'During video playback'; + + @override + String get keepScreenOnViewerOnly => 'Viewer page only'; + + @override + String get keepScreenOnAlways => 'Always'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Never'; + + @override + String get maxBrightnessAlways => 'Always'; + + @override + String get nameConflictStrategyRename => 'Rename'; + + @override + String get nameConflictStrategyReplace => 'Replace'; + + @override + String get nameConflictStrategySkip => 'Skip'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Top'; + + @override + String get subtitlePositionBottom => 'Bottom'; + + @override + String get themeBrightnessLight => 'Light'; + + @override + String get themeBrightnessDark => 'Dark'; + + @override + String get themeBrightnessBlack => 'Black'; + + @override + String get unitSystemMetric => 'Metric'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Password'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Open with other player'; + + @override + String get videoLoopModeNever => 'Never'; + + @override + String get videoLoopModeShortOnly => 'Short videos only'; + + @override + String get videoLoopModeAlways => 'Always'; + + @override + String get videoPlaybackSkip => 'Skip'; + + @override + String get videoPlaybackMuted => 'Play muted'; + + @override + String get videoPlaybackWithSound => 'Play with sound'; + + @override + String get videoResumptionModeNever => 'Never'; + + @override + String get videoResumptionModeAlways => 'Always'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'None'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'Random'; + + @override + String get widgetDisplayedItemMostRecent => 'Most recent'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internal storage'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Some files have the same name.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'ADD'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Save dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OVER'; + + @override + String get videoResumeButtonLabel => 'RESUME'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Custom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'New Album'; + + @override + String get newAlbumDialogNameLabel => 'Album name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'Storage:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'New name'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'Rename'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insert field'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Preview'; + + @override + String get renameProcessorCounter => 'Counter'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Name'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete this album and the $countString items in it?', + one: 'Delete this album and the item in it?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these albums and the $countString items in them?', + one: 'Delete these albums and the item in them?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Width'; + + @override + String get exportEntryDialogHeight => 'Height'; + + @override + String get exportEntryDialogQuality => 'Quality'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'New name'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'Date & Time'; + + @override + String get editEntryDateDialogSetCustom => 'Set custom date'; + + @override + String get editEntryDateDialogCopyField => 'Copy from other date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'File modified date'; + + @override + String get durationDialogHours => 'Hours'; + + @override + String get durationDialogMinutes => 'Minutes'; + + @override + String get durationDialogSeconds => 'Seconds'; + + @override + String get editEntryLocationDialogTitle => 'Location'; + + @override + String get editEntryLocationDialogSetCustom => 'Set custom location'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Choose on map'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Use this location'; + + @override + String get editEntryRatingDialogTitle => 'Rating'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'More'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'Playback speed'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtitles'; + + @override + String get videoStreamSelectionDialogOff => 'Off'; + + @override + String get videoStreamSelectionDialogTrack => 'Track'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'Done!'; + + @override + String get genericFailureFeedback => 'Failed'; + + @override + String get genericDangerWarningDialogMessage => 'Are you sure?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'View'; + + @override + String get menuActionSelect => 'Select'; + + @override + String get menuActionSelectAll => 'Select all'; + + @override + String get menuActionSelectNone => 'Select none'; + + @override + String get menuActionMap => 'Map'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'Stats'; + + @override + String get viewDialogSortSectionTitle => 'Sort'; + + @override + String get viewDialogGroupSectionTitle => 'Sections'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'Grid'; + + @override + String get tileLayoutList => 'List'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Color'; + + @override + String get appPickDialogTitle => 'Pick App'; + + @override + String get appPickDialogNone => 'None'; + + @override + String get aboutPageTitle => 'About'; + + @override + String get aboutLinkLicense => 'License'; + + @override + String get aboutLinkPolicy => 'Privacy Policy'; + + @override + String get aboutBugSectionTitle => 'Bug Report'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copy system information'; + + @override + String get aboutBugCopyInfoButton => 'Copy'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'Report'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Credits'; + + @override + String get aboutCreditsWorldAtlas1 => 'This app uses a TopoJSON file from'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'Translators'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenses'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Show All Licenses'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'Pick'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'Edit'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Unknown'; + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'About'; + + @override + String get drawerSettingsButton => 'Settings'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Countries'; + + @override + String get drawerPlacePage => 'Places'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'By date'; + + @override + String get sortByName => 'By name'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'By size'; + + @override + String get sortByAlbumFileName => 'By album & item title'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A to Z'; + + @override + String get sortOrderZtoA => 'Z to A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumMimeTypeMixed => 'Mixed'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'Camera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'CREATE'; + + @override + String get newFilterBanner => 'new'; + + @override + String get countryPageTitle => 'Countries'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'States'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Places'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Date'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Countries'; + + @override + String get searchStatesSectionTitle => 'States'; + + @override + String get searchPlacesSectionTitle => 'Places'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Ratings'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Settings'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'Disabled'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'Settings'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Home'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_be.dart b/lib/l10ngen/app_localizations_be.dart new file mode 100644 index 0000000..e0ab191 --- /dev/null +++ b/lib/l10ngen/app_localizations_be.dart @@ -0,0 +1,2392 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Belarusian (`be`). +class AppLocalizationsBe extends AppLocalizations { + AppLocalizationsBe([String locale = 'be']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Сардэчна запрашаем у Aves'; + + @override + String get welcomeOptional => 'Неабавязковыя'; + + @override + String get welcomeTermsToggle => 'Я згодны з умовамі'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count элементаў', + one: '$count элемент', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count слупкоў', + few: '$count слупкі', + one: '$count слупок', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString секунд', + few: '$countString секунды', + one: '$countString секунда', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString хвілін', + few: '$countString хвіліны', + one: '$countString хвіліна', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString дзён', + few: '$countString дні', + one: '$countString дзень', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length мм'; + } + + @override + String get applyButtonLabel => 'УЖЫВАЦЬ'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'ВЫДАЛІЦЬ'; + + @override + String get nextButtonLabel => 'ДАЛЕЙ'; + + @override + String get showButtonLabel => 'ПАКАЗАЦЬ'; + + @override + String get hideButtonLabel => 'ХАВАЦЬ'; + + @override + String get continueButtonLabel => 'ПРАЦЯГВАЦЬ'; + + @override + String get saveCopyButtonLabel => 'ЗАХАВАЦЬ КОПІЮ'; + + @override + String get applyTooltip => 'Ужыць'; + + @override + String get cancelTooltip => 'Адмена'; + + @override + String get changeTooltip => 'Змяніць'; + + @override + String get clearTooltip => 'Ачысціць'; + + @override + String get previousTooltip => 'Папярэдні'; + + @override + String get nextTooltip => 'Наступны'; + + @override + String get showTooltip => 'Паказаць'; + + @override + String get hideTooltip => 'Схаваць'; + + @override + String get actionRemove => 'Выдаліць'; + + @override + String get resetTooltip => 'Скінуць'; + + @override + String get saveTooltip => 'Захаваць'; + + @override + String get stopTooltip => 'Спыніць'; + + @override + String get pickTooltip => 'Выбраць'; + + @override + String get doubleBackExitMessage => 'Яшчэ раз націсніце «назад», каб выйсці.'; + + @override + String get doNotAskAgain => 'Больш не пытайся'; + + @override + String get sourceStateLoading => 'Загрузка'; + + @override + String get sourceStateCataloguing => 'Каталагізацыя'; + + @override + String get sourceStateLocatingCountries => 'Размяшчэнне краін'; + + @override + String get sourceStateLocatingPlaces => 'Размяшчэнне месцаў'; + + @override + String get chipActionDelete => 'Выдаліць'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Паказаць у Калекцыі'; + + @override + String get chipActionGoToAlbumPage => 'Паказаць у Альбомах'; + + @override + String get chipActionGoToCountryPage => 'Паказаць у Краінах'; + + @override + String get chipActionGoToPlacePage => 'Паказаць у Лакацыях'; + + @override + String get chipActionGoToTagPage => 'Паказаць у Тэгах'; + + @override + String get chipActionGoToExplorerPage => 'Паказаць у Правадыру'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Адфільтраваць'; + + @override + String get chipActionFilterIn => 'Фільтраваць'; + + @override + String get chipActionHide => 'Схаваць'; + + @override + String get chipActionLock => 'Заблакаваць'; + + @override + String get chipActionPin => 'Прышпіліць да вяршыні'; + + @override + String get chipActionUnpin => 'Адмацаваць зверху'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Перайменаваць'; + + @override + String get chipActionSetCover => 'Усталяваць вокладку'; + + @override + String get chipActionShowCountryStates => 'Паказаць дзяржавы'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Стварыць альбом'; + + @override + String get chipActionCreateVault => 'Стварыце сховішча'; + + @override + String get chipActionConfigureVault => 'Наладзіць сховішча'; + + @override + String get entryActionCopyToClipboard => 'Скапіяваць у буфер абмену'; + + @override + String get entryActionDelete => 'Выдаліць'; + + @override + String get entryActionConvert => 'Канвертаваць'; + + @override + String get entryActionExport => 'Экспарт'; + + @override + String get entryActionInfo => 'Інфармацыя'; + + @override + String get entryActionRename => 'Перайменаваць'; + + @override + String get entryActionRestore => 'Аднавіць'; + + @override + String get entryActionRotateCCW => 'Круціць супраць гадзінны стрэлкі'; + + @override + String get entryActionRotateCW => 'Круціць па гадзіннікавай стрэлцы'; + + @override + String get entryActionFlip => 'Перавярнуць па гарызанталі'; + + @override + String get entryActionPrint => 'Друк'; + + @override + String get entryActionShare => 'Падзяліцца'; + + @override + String get entryActionShareImageOnly => 'Падзяліцца толькі выявай'; + + @override + String get entryActionShareVideoOnly => 'Падзяліцца толькі відэа'; + + @override + String get entryActionViewSource => 'Паглядзець крыніцу'; + + @override + String get entryActionShowGeoTiffOnMap => 'Паказаць як накладанне на карту'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Канвертаваць у статычны малюнак'; + + @override + String get entryActionViewMotionPhotoVideo => 'Адкрыць відэа'; + + @override + String get entryActionEdit => 'Рэдагаваць'; + + @override + String get entryActionOpen => 'Адкрыць з дапамогай'; + + @override + String get entryActionSetAs => 'Усталяваць як'; + + @override + String get entryActionCast => 'Трансляцыя'; + + @override + String get entryActionOpenMap => 'Паказаць у праграме карты'; + + @override + String get entryActionRotateScreen => 'Паварот экрана'; + + @override + String get entryActionAddFavourite => 'Дадаць у абранае'; + + @override + String get entryActionRemoveFavourite => 'Выдаліць з абранага'; + + @override + String get videoActionCaptureFrame => 'Захоп кадра'; + + @override + String get videoActionMute => 'Адключыць гук'; + + @override + String get videoActionUnmute => 'Уключыць гук'; + + @override + String get videoActionPause => 'Паўза'; + + @override + String get videoActionPlay => 'Прайграць'; + + @override + String get videoActionReplay10 => 'Перамотка назад на 10 секунд'; + + @override + String get videoActionSkip10 => 'Перамотка наперад на 10 секунд'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Выберыце трэкі'; + + @override + String get videoActionSetSpeed => 'Хуткасць прайгравання'; + + @override + String get videoActionABRepeat => 'Паўтарыць ад А да Б'; + + @override + String get videoRepeatActionSetStart => 'Усталяваць пачатак'; + + @override + String get videoRepeatActionSetEnd => 'Усталяваць канец'; + + @override + String get viewerActionSettings => 'Налады'; + + @override + String get viewerActionLock => 'Блакіроўка прагляду'; + + @override + String get viewerActionUnlock => 'Разблакіроўка прагляду'; + + @override + String get slideshowActionResume => 'Аднавіць'; + + @override + String get slideshowActionShowInCollection => 'Паказаць у Калекцыі'; + + @override + String get entryInfoActionEditDate => 'Рэдагаваць дату і час'; + + @override + String get entryInfoActionEditLocation => 'Рэдагаваць месцазнаходжанне'; + + @override + String get entryInfoActionEditTitleDescription => 'Рэдагаваць назву і апісанне'; + + @override + String get entryInfoActionEditRating => 'Рэдагаваць рэйтынг'; + + @override + String get entryInfoActionEditTags => 'Рэдагаваць тэгі'; + + @override + String get entryInfoActionRemoveMetadata => 'Выдаліць метададзеныя'; + + @override + String get entryInfoActionExportMetadata => 'Экспарт метададзеных'; + + @override + String get entryInfoActionRemoveLocation => 'Выдаліць месцазнаходжанне'; + + @override + String get editorActionTransform => 'Трансфармаваць'; + + @override + String get editorTransformCrop => 'Абрэзаць'; + + @override + String get editorTransformRotate => 'Павярнуць'; + + @override + String get cropAspectRatioFree => 'Свабодныя'; + + @override + String get cropAspectRatioOriginal => 'Першапачатковае'; + + @override + String get cropAspectRatioSquare => 'Квадратнае'; + + @override + String get filterAspectRatioLandscapeLabel => 'Ландшафтныя'; + + @override + String get filterAspectRatioPortraitLabel => 'Партрэтныя'; + + @override + String get filterBinLabel => 'Сметніца'; + + @override + String get filterFavouriteLabel => 'Выбранае'; + + @override + String get filterNoDateLabel => 'Без даты'; + + @override + String get filterNoAddressLabel => 'Без адрасу'; + + @override + String get filterLocatedLabel => 'Размешчаны'; + + @override + String get filterNoLocationLabel => 'Без месцазнаходжання'; + + @override + String get filterNoRatingLabel => 'Без рэйтынгу'; + + @override + String get filterTaggedLabel => 'З тэгамі'; + + @override + String get filterNoTagLabel => 'Без тэгаў'; + + @override + String get filterNoTitleLabel => 'Без назвы'; + + @override + String get filterOnThisDayLabel => 'У гэты дзень'; + + @override + String get filterRecentlyAddedLabel => 'Нядаўна дададзены'; + + @override + String get filterRatingRejectedLabel => 'Адхілена'; + + @override + String get filterTypeAnimatedLabel => 'Аніміраваныя'; + + @override + String get filterTypeMotionPhotoLabel => 'Фота з рухам'; + + @override + String get filterTypePanoramaLabel => 'Панарама'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => 'Відэа 360°'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Малюнак'; + + @override + String get filterMimeVideoLabel => 'Відэа'; + + @override + String get accessibilityAnimationsRemove => 'Прадухіленне экранных эфектаў'; + + @override + String get accessibilityAnimationsKeep => 'Захаваць экранныя эфекты'; + + @override + String get albumTierNew => 'Новы'; + + @override + String get albumTierPinned => 'Замацаваны'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Стандартныя'; + + @override + String get albumTierApps => 'Праграмы'; + + @override + String get albumTierVaults => 'Сховішчы'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Іншыя'; + + @override + String get coordinateFormatDms => 'Градусы, хвіліны і секунды'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Дзесятковы градус'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'Пн'; + + @override + String get coordinateDmsSouth => 'Пд'; + + @override + String get coordinateDmsEast => 'У'; + + @override + String get coordinateDmsWest => 'З'; + + @override + String get displayRefreshRatePreferHighest => 'Найвышэйшая частата'; + + @override + String get displayRefreshRatePreferLowest => 'Найменшая частата'; + + @override + String get keepScreenOnNever => 'Ніколі'; + + @override + String get keepScreenOnVideoPlayback => 'Падчас прайгравання відэа'; + + @override + String get keepScreenOnViewerOnly => 'Толькі ў праглядніку'; + + @override + String get keepScreenOnAlways => 'Заўсёды'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Карты Google'; + + @override + String get mapStyleGoogleHybrid => 'Карты Google (гібрыд)'; + + @override + String get mapStyleGoogleTerrain => 'Карты Google (Рэльеф мясцовасці)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Гуманітарная ОСМ'; + + @override + String get mapStyleStamenWatercolor => 'Тычынка Акварэль'; + + @override + String get maxBrightnessNever => 'Ніколі'; + + @override + String get maxBrightnessAlways => 'Заўсёды'; + + @override + String get nameConflictStrategyRename => 'Перайменаваць'; + + @override + String get nameConflictStrategyReplace => 'Замяніць'; + + @override + String get nameConflictStrategySkip => 'Прапусціць'; + + @override + String get overlayHistogramNone => 'Не'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Яркасць'; + + @override + String get subtitlePositionTop => 'Верх'; + + @override + String get subtitlePositionBottom => 'Ніз'; + + @override + String get themeBrightnessLight => 'Светлая'; + + @override + String get themeBrightnessDark => 'Цёмная'; + + @override + String get themeBrightnessBlack => 'Чорная'; + + @override + String get unitSystemMetric => 'Метрычныя'; + + @override + String get unitSystemImperial => 'Англійскія'; + + @override + String get vaultLockTypePattern => 'Шаблон'; + + @override + String get vaultLockTypePin => 'PIN-код'; + + @override + String get vaultLockTypePassword => 'Пароль'; + + @override + String get settingsVideoEnablePip => 'Карцінка ў карцінцы'; + + @override + String get videoControlsPlayOutside => 'Адкрыць у іншым прайгравальніку'; + + @override + String get videoLoopModeNever => 'Ніколі'; + + @override + String get videoLoopModeShortOnly => 'Толькі для кароткіх відэа'; + + @override + String get videoLoopModeAlways => 'Заўсёды'; + + @override + String get videoPlaybackSkip => 'Прапусціць'; + + @override + String get videoPlaybackMuted => 'Прайграваць без гуку'; + + @override + String get videoPlaybackWithSound => 'Прайграваць з гукам'; + + @override + String get videoResumptionModeNever => 'Ніколі'; + + @override + String get videoResumptionModeAlways => 'Заўсёды'; + + @override + String get viewerTransitionSlide => 'Слізгаценне'; + + @override + String get viewerTransitionParallax => 'Паралакс'; + + @override + String get viewerTransitionFade => 'Згасанне'; + + @override + String get viewerTransitionZoomIn => 'Павялічыць'; + + @override + String get viewerTransitionNone => 'Нічога'; + + @override + String get wallpaperTargetHome => 'Галоўны экран'; + + @override + String get wallpaperTargetLock => 'Экран блакіроўкі'; + + @override + String get wallpaperTargetHomeLock => 'На абодва экраны'; + + @override + String get widgetDisplayedItemRandom => 'Выпадковы'; + + @override + String get widgetDisplayedItemMostRecent => 'Самы апошні'; + + @override + String get widgetOpenPageHome => 'Адкрыйце галоўную старонку'; + + @override + String get widgetOpenPageCollection => 'Адкрыць калекцыю'; + + @override + String get widgetOpenPageViewer => 'Адкрыйце аглядальнік'; + + @override + String get widgetTapUpdateWidget => 'Абнавіць віджэт'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Унутраная памяць'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD-карта'; + + @override + String get rootDirectoryDescription => 'каранёвы каталог'; + + @override + String otherDirectoryDescription(String name) { + return 'Каталог «$name»'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Калі ласка, выберыце $directory «$volume» на наступным экране, каб даць гэтай праграме доступ да яго.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Гэтай праграме забаронена змяняць файлы ў $directory «$volume».\n\nКаб перамясціць элементы ў іншую дырэкторыю, выкарыстоўвайце папярэдне ўсталяваны дыспетчар файлаў або праграму галерэі.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Для завяршэння гэтай аперацыі патрабуецца $neededSize вольнага месца на «$volume», але засталося толькі $freeSize.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Сістэмная праграма выбару файлаў адсутнічае ці адключана. Калі ласка, уключыце яе і паспрабуйце яшчэ раз.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Гэта аперацыя не падтрымліваецца для элементаў наступных тыпаў: $types.', + one: 'Гэта аперацыя не падтрымліваецца для элементаў наступнага тыпу: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Некаторыя файлы ў тэчцы прызначэння маюць аднолькавыя назвы.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Некаторыя файлы маюць аднолькавыя назвы.'; + + @override + String get addShortcutDialogLabel => 'Назва ярлыка'; + + @override + String get addShortcutButtonLabel => 'ДАДАЦЬ'; + + @override + String get noMatchingAppDialogMessage => 'Няма праграм, якія б з гэтым справіліся.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Перамясціць гэтыя $count элементаў у сметніцу?', + few: 'Перамясціць гэтыя $count элемента ў сметніцу?', + one: 'Перамясціць гэты элемент у сметніцу?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Выдаліць гэтыя $count элементаў?', + few: 'Выдаліць гэтыя $count элемента?', + one: 'Выдаліць гэты элемент?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Захаваць даты элементаў, перш чым працягнуць?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Захаваць даты'; + + @override + String videoResumeDialogMessage(String time) { + return 'Вы хочаце аднавіць прайграванне на $time?'; + } + + @override + String get videoStartOverButtonLabel => 'ПАЧАЦЬ НАНАВА'; + + @override + String get videoResumeButtonLabel => 'АДНАВІЦЬ'; + + @override + String get setCoverDialogLatest => 'Апошні элемент'; + + @override + String get setCoverDialogAuto => 'Аўто'; + + @override + String get setCoverDialogCustom => 'Свая'; + + @override + String get hideFilterConfirmationDialogMessage => 'Адпаведныя фота і відэа будуць схаваны з вашай калекцыі. Вы можаце паказаць іх зноў у наладах «Прыватнасць».\n\nВы ўпэўнены, што хочаце іх схаваць?'; + + @override + String get newAlbumDialogTitle => 'Новы альбом'; + + @override + String get newAlbumDialogNameLabel => 'Назва альбома'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Каталог ўжо існуе'; + + @override + String get newAlbumDialogStorageLabel => 'Захоўванне:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Элементы ў сховішчах даступныя толькі гэтай праграме і нікому больш.\n\nКалі вы выдаліце гэту праграму або ачысціце даныя праграмы, вы страціце ўсе гэтыя элементы.'; + + @override + String get newVaultDialogTitle => 'Новае сховішча'; + + @override + String get configureVaultDialogTitle => 'Наладзьце сховішча'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Блакіроўка пры выключэнні экрана'; + + @override + String get vaultDialogLockTypeLabel => 'Тып блакіроўкі'; + + @override + String get patternDialogEnter => 'Увядзіце ключ'; + + @override + String get patternDialogConfirm => 'Пацвердзіце графічны ключ'; + + @override + String get pinDialogEnter => 'Увядзіце PIN-код'; + + @override + String get pinDialogConfirm => 'Пацвердзіце PIN-код'; + + @override + String get passwordDialogEnter => 'Увядзіце пароль'; + + @override + String get passwordDialogConfirm => 'Пацвердзіце пароль'; + + @override + String get authenticateToConfigureVault => 'Прайдзіце аўтэнтыфікацыю, каб наладзіць сховішча'; + + @override + String get authenticateToUnlockVault => 'Прайдзіце аўтэнтыфікацыю, каб разблакіраваць сховішча'; + + @override + String get vaultBinUsageDialogMessage => 'Некаторыя сховішчы выкарыстоўваюць сметніцу.'; + + @override + String get renameAlbumDialogLabel => 'Новая назва'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Каталог ужо існуе'; + + @override + String get renameEntrySetPageTitle => 'Перайменаваць'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Шаблон наймення'; + + @override + String get renameEntrySetPageInsertTooltip => 'Поле для ўстаўкі'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Папярэдні прагляд'; + + @override + String get renameProcessorCounter => 'Лічыльнік'; + + @override + String get renameProcessorHash => 'Хэш'; + + @override + String get renameProcessorName => 'Імя'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Выдаліць гэты альбом і $count элементаў у ім?', + few: 'Выдаліць гэты альбом і $count элементы ў ім?', + one: 'Выдаліць гэты альбом і элемент у ім?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Выдаліць гэтыя альбомы і $count элементаў у іх?', + few: 'Выдаліць гэтыя альбомы і $count элементы ў іх?', + one: 'Выдаліць гэтыя альбомы і элемент у іх?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Фармат:'; + + @override + String get exportEntryDialogWidth => 'Шырыня'; + + @override + String get exportEntryDialogHeight => 'Вышыня'; + + @override + String get exportEntryDialogQuality => 'Якасць'; + + @override + String get exportEntryDialogWriteMetadata => 'Запісаць метададзеныя'; + + @override + String get renameEntryDialogLabel => 'Новая назва'; + + @override + String get editEntryDialogCopyFromItem => 'Скапіяваць з іншага элемента'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Поля для рэдагавання'; + + @override + String get editEntryDateDialogTitle => 'Дата і час'; + + @override + String get editEntryDateDialogSetCustom => 'Устанавіць дату'; + + @override + String get editEntryDateDialogCopyField => 'Скапіяваць з іншай даты'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Выняць з назвы'; + + @override + String get editEntryDateDialogShift => 'Зрух'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Дата змены файла'; + + @override + String get durationDialogHours => 'Гадзіны'; + + @override + String get durationDialogMinutes => 'Хвіліны'; + + @override + String get durationDialogSeconds => 'Секунды'; + + @override + String get editEntryLocationDialogTitle => 'Месцазнаходжанне'; + + @override + String get editEntryLocationDialogSetCustom => 'Рэдагаваць месцазнаходжанне'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Выбраць на карце'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Шырата'; + + @override + String get editEntryLocationDialogLongitude => 'Даўгата'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Выкарыстоўваць гэтае месцазнаходжанне'; + + @override + String get editEntryRatingDialogTitle => 'Рэйтынг'; + + @override + String get removeEntryMetadataDialogTitle => 'Выдаленне метададзеных'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'Больш'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP патрабуецца для прайгравання відэа ўнутры фота з рухам.\n\nВы ўпэўнены, што хочаце выдаліць яго?'; + + @override + String get videoSpeedDialogLabel => 'Хуткасць прайгравання'; + + @override + String get videoStreamSelectionDialogVideo => 'Відэа'; + + @override + String get videoStreamSelectionDialogAudio => 'Аўдыё'; + + @override + String get videoStreamSelectionDialogText => 'Субтытры'; + + @override + String get videoStreamSelectionDialogOff => 'Адкл.'; + + @override + String get videoStreamSelectionDialogTrack => 'Трэк'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Іншых трэкаў няма.'; + + @override + String get genericSuccessFeedback => 'Гатова!'; + + @override + String get genericFailureFeedback => 'Не атрымалася'; + + @override + String get genericDangerWarningDialogMessage => 'Вы ўпэўнены?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Паўтарыце спробу з меншай колькасцю элементаў.'; + + @override + String get menuActionConfigureView => 'Выгляд'; + + @override + String get menuActionSelect => 'Выбраць'; + + @override + String get menuActionSelectAll => 'Выбраць усе'; + + @override + String get menuActionSelectNone => 'Зняць вылучэнне'; + + @override + String get menuActionMap => 'Карта'; + + @override + String get menuActionSlideshow => 'Слайд-шоў'; + + @override + String get menuActionStats => 'Статыстыка'; + + @override + String get viewDialogSortSectionTitle => 'Сартаваць'; + + @override + String get viewDialogGroupSectionTitle => 'Групоўка'; + + @override + String get viewDialogLayoutSectionTitle => 'Макет'; + + @override + String get viewDialogReverseSortOrder => 'Адваротны парадак сартавання'; + + @override + String get tileLayoutMosaic => 'Мазаіка'; + + @override + String get tileLayoutGrid => 'Сетка'; + + @override + String get tileLayoutList => 'Спіс'; + + @override + String get castDialogTitle => 'Прылады трансляцыі'; + + @override + String get coverDialogTabCover => 'Вокладка'; + + @override + String get coverDialogTabApp => 'Праграма'; + + @override + String get coverDialogTabColor => 'Колер'; + + @override + String get appPickDialogTitle => 'Выбраць праграму'; + + @override + String get appPickDialogNone => 'Нічога'; + + @override + String get aboutPageTitle => 'Пра нас'; + + @override + String get aboutLinkLicense => 'Ліцэнзія'; + + @override + String get aboutLinkPolicy => 'Палітыка канфідэнцыяльнасці'; + + @override + String get aboutBugSectionTitle => 'Паведаміць пра памылку'; + + @override + String get aboutBugSaveLogInstruction => 'Захавайце логі праграмы ў файл'; + + @override + String get aboutBugCopyInfoInstruction => 'Скапіяваць сістэмную інфармацыю'; + + @override + String get aboutBugCopyInfoButton => 'Скапіяваць'; + + @override + String get aboutBugReportInstruction => 'Адправіць справаздачу аб памылцы на GitHub разам з журналамі і сістэмнай інфармацыяй'; + + @override + String get aboutBugReportButton => 'Адправіць справаздачу'; + + @override + String get aboutDataUsageSectionTitle => 'Выкарыстанне дадзеных'; + + @override + String get aboutDataUsageData => 'Дадзеныя'; + + @override + String get aboutDataUsageCache => 'Кэш'; + + @override + String get aboutDataUsageDatabase => 'База дадзеных'; + + @override + String get aboutDataUsageMisc => 'Розныя'; + + @override + String get aboutDataUsageInternal => 'Унутранае'; + + @override + String get aboutDataUsageExternal => 'Знешні'; + + @override + String get aboutDataUsageClearCache => 'Ачысціць кэш'; + + @override + String get aboutCreditsSectionTitle => 'Падзякі'; + + @override + String get aboutCreditsWorldAtlas1 => 'Гэта праграма выкарыстоўвае файл TopoJSON з'; + + @override + String get aboutCreditsWorldAtlas2 => 'пад ліцэнзіяй ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'Перакладчыкі'; + + @override + String get aboutLicensesSectionTitle => 'Ліцэнзіі з адкрытым зыходным кодам'; + + @override + String get aboutLicensesBanner => 'Гэта праграма выкарыстоўвае наступныя пакеты і бібліятэкі з адкрытым зыходным кодам.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Бібліятэкі Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Плагіны Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Пакеты Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Пакеты Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Паказаць усе ліцэнзіі'; + + @override + String get policyPageTitle => 'Палітыка канфідэнцыяльнасці'; + + @override + String get collectionPageTitle => 'Калекцыя'; + + @override + String get collectionPickPageTitle => 'Выбраць'; + + @override + String get collectionSelectPageTitle => 'Выбраць элементы'; + + @override + String get collectionActionShowTitleSearch => 'Паказаць фільтр загалоўка'; + + @override + String get collectionActionHideTitleSearch => 'Схаваць фільтр загалоўка'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Дадаць ярлык'; + + @override + String get collectionActionSetHome => 'Усталяваць як галоўную'; + + @override + String get collectionActionEmptyBin => 'Ачысціць сметніцу'; + + @override + String get collectionActionCopy => 'Скапіяваць у альбом'; + + @override + String get collectionActionMove => 'Перамясціць у альбом'; + + @override + String get collectionActionRescan => 'Паўторнае сканаванне'; + + @override + String get collectionActionEdit => 'Рэдагаваць'; + + @override + String get collectionSearchTitlesHintText => 'Пошук загалоўкаў'; + + @override + String get collectionGroupAlbum => 'Па альбоме'; + + @override + String get collectionGroupMonth => 'Па месяцу'; + + @override + String get collectionGroupDay => 'Па днях'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Невядома'; + + @override + String get dateToday => 'Сёння'; + + @override + String get dateYesterday => 'Учора'; + + @override + String get dateThisMonth => 'У гэтым месяцы'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не атрымалася выдаліць $count элементаў', + few: 'Не атрымалася выдаліць $count элементы', + one: 'Не атрымалася выдаліць 1 элемент', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не атрымалася скапіюваць $count элементаў', + few: 'Не атрымалася скапіюваць $count элементы', + one: 'Не атрымалася скапіюваць 1 элемент', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Немагчыма перанесці $count элементаў', + few: 'Немагчыма перанесці $count элементы', + one: 'Немагчыма перанесці 1 элемент', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не атрымалася перайменаваць $count элементаў', + few: 'Не атрымалася перайменаваць $count элементы', + one: 'Не атрымалася перайменаваць 1 элемент', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Немагчыма адрэдагаваць $count элементаў', + few: 'Немагчыма адрэдагаваць $count элементы', + one: 'Немагчыма адрэдагаваць 1 элемент', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не атрымалася экспартаваць $count старонак', + few: 'Не атрымалася экспартаваць $count старонкі', + one: 'Не атрымалася экспартаваць 1 старонку', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count элементаў скапіявана', + few: '$count элементы скапіявана', + one: '1 элемент скапіяваны', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Перамяшчаны $count элементаў', + few: 'Перамяшчаны $count элементы', + one: 'Перамяшчаны 1 элемент', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Перайменаваны $count элементаў', + few: 'Перайменаваны $count элементы', + one: 'Перайменаваны 1 элемент', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count элементаў адрэдагаваны', + few: '$count элементы адрэдагаваны', + one: '1 элемент адрэдагаваны', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Няма абраных'; + + @override + String get collectionEmptyVideos => 'Няма відэа'; + + @override + String get collectionEmptyImages => 'Няма выяў'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Даць доступ'; + + @override + String get collectionSelectSectionTooltip => 'Выбраць раздзел'; + + @override + String get collectionDeselectSectionTooltip => 'Адмяніць выбар раздзела'; + + @override + String get drawerAboutButton => 'Пра нас'; + + @override + String get drawerSettingsButton => 'Налады'; + + @override + String get drawerCollectionAll => 'Уся калекцыя'; + + @override + String get drawerCollectionFavourites => 'Абраныя'; + + @override + String get drawerCollectionImages => 'Выявы'; + + @override + String get drawerCollectionVideos => 'Відэа'; + + @override + String get drawerCollectionAnimated => 'Анімацыі'; + + @override + String get drawerCollectionMotionPhotos => 'Фота з рухам'; + + @override + String get drawerCollectionPanoramas => 'Панарамы'; + + @override + String get drawerCollectionRaws => 'Raw фатаграфіі'; + + @override + String get drawerCollectionSphericalVideos => '360° Відэа'; + + @override + String get drawerAlbumPage => 'Альбомы'; + + @override + String get drawerCountryPage => 'Краіны'; + + @override + String get drawerPlacePage => 'Месцы'; + + @override + String get drawerTagPage => 'Тэгі'; + + @override + String get sortByDate => 'Па даце'; + + @override + String get sortByName => 'Па назве'; + + @override + String get sortByItemCount => 'Па колькасці элементаў'; + + @override + String get sortBySize => 'Па памеры'; + + @override + String get sortByAlbumFileName => 'Па назве альбома і файла'; + + @override + String get sortByRating => 'Па рэйтынгу'; + + @override + String get sortByDuration => 'Па працягласці'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Спачатку самае новае'; + + @override + String get sortOrderOldestFirst => 'Спачатку самы стары'; + + @override + String get sortOrderAtoZ => 'Ад А да Я'; + + @override + String get sortOrderZtoA => 'Ад Я да А'; + + @override + String get sortOrderHighestFirst => 'Спачатку з высокім'; + + @override + String get sortOrderLowestFirst => 'Спачатку з нізкім'; + + @override + String get sortOrderLargestFirst => 'Спачатку вялікія'; + + @override + String get sortOrderSmallestFirst => 'Спачатку маленькі'; + + @override + String get sortOrderShortestFirst => 'Спачатку самы кароткі'; + + @override + String get sortOrderLongestFirst => 'Спачатку самы доўгі'; + + @override + String get albumGroupTier => 'Па ўзроўні'; + + @override + String get albumGroupType => 'Па тыпу'; + + @override + String get albumGroupVolume => 'Па аб\'ёме захоўвання'; + + @override + String get albumMimeTypeMixed => 'Змешаны'; + + @override + String get albumPickPageTitleCopy => 'Капіяваць у альбом'; + + @override + String get albumPickPageTitleExport => 'Экспарт у альбом'; + + @override + String get albumPickPageTitleMove => 'Перамясціць у альбом'; + + @override + String get albumPickPageTitlePick => 'Выбраць Альбом'; + + @override + String get albumCamera => 'Камера'; + + @override + String get albumDownload => 'Загрузкі'; + + @override + String get albumScreenshots => 'Скрыншоты'; + + @override + String get albumScreenRecordings => 'Запісы экрана'; + + @override + String get albumVideoCaptures => 'Відэазапісы'; + + @override + String get albumPageTitle => 'Альбомы'; + + @override + String get albumEmpty => 'Няма альбомаў'; + + @override + String get createAlbumButtonLabel => 'СТВАРЫЦЬ'; + + @override + String get newFilterBanner => 'новы'; + + @override + String get countryPageTitle => 'Краіны'; + + @override + String get countryEmpty => 'Няма краін'; + + @override + String get statePageTitle => 'Штаты'; + + @override + String get stateEmpty => 'Няма штатаў'; + + @override + String get placePageTitle => 'Месцы'; + + @override + String get placeEmpty => 'Няма месцаў'; + + @override + String get tagPageTitle => 'Тэгі'; + + @override + String get tagEmpty => 'Няма тэгаў'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Сметніца'; + + @override + String get explorerPageTitle => 'Правадыр'; + + @override + String get explorerActionSelectStorageVolume => 'Выбраць сховішча'; + + @override + String get selectStorageVolumeDialogTitle => 'Выбраць сховішча'; + + @override + String get searchCollectionFieldHint => 'Пошук калекцый'; + + @override + String get searchRecentSectionTitle => 'Апошнія'; + + @override + String get searchDateSectionTitle => 'Дата'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Альбомы'; + + @override + String get searchCountriesSectionTitle => 'Краіны'; + + @override + String get searchStatesSectionTitle => 'Штаты'; + + @override + String get searchPlacesSectionTitle => 'Месцы'; + + @override + String get searchTagsSectionTitle => 'Тэгі'; + + @override + String get searchRatingSectionTitle => 'Рэйтынгі'; + + @override + String get searchMetadataSectionTitle => 'Метададзеныя'; + + @override + String get settingsPageTitle => 'Налады'; + + @override + String get settingsSystemDefault => 'Як ў сістэме'; + + @override + String get settingsDefault => 'Па змаўчанні'; + + @override + String get settingsDisabled => 'Адкл.'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Пытацца кожны раз'; + + @override + String get settingsModificationWarningDialogMessage => 'Іншыя налады будуць зменены.'; + + @override + String get settingsSearchFieldLabel => 'Пошук налад'; + + @override + String get settingsSearchEmpty => 'Няма адпаведнай налады'; + + @override + String get settingsActionExport => 'Экспарт'; + + @override + String get settingsActionExportDialogTitle => 'Экспарт'; + + @override + String get settingsActionImport => 'Імпарт'; + + @override + String get settingsActionImportDialogTitle => 'Імпарт'; + + @override + String get appExportCovers => 'Вокладкі'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Абранае'; + + @override + String get appExportSettings => 'Налады'; + + @override + String get settingsNavigationSectionTitle => 'Навігацыя'; + + @override + String get settingsHomeTile => 'Галоўная'; + + @override + String get settingsHomeDialogTitle => 'Галоўная'; + + @override + String get setHomeCustom => 'Па-свойму'; + + @override + String get settingsKeepScreenOnTile => 'Трымаць экран уключаным'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Трымаць экран уключаным'; + + @override + String get settingsDoubleBackExit => 'Двойчы націсніце «назад», каб выйсці'; + + @override + String get settingsConfirmationTile => 'Дыялогі пацверджання'; + + @override + String get settingsConfirmationDialogTitle => 'Дыялогі пацверджання'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Спытаць, перш чым выдаляць элементы назаўжды'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Спытаць перад тым, як пераносіць элементы ў сметніцу'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Спытаць, перш чым перамяшчаць прадметы без даты'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Паказваць паведамленне пасля перамяшчэння элементаў у сметніцу'; + + @override + String get settingsConfirmationVaultDataLoss => 'Паказаць папярэджанне аб страце даных сховішча'; + + @override + String get settingsNavigationDrawerTile => 'Меню навігацыі'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Меню навігацыі'; + + @override + String get settingsNavigationDrawerBanner => 'Націсніце і ўтрымлівайце для перамяшчэння і змены парадку пунктаў меню.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Тыпы'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Альбомы'; + + @override + String get settingsNavigationDrawerTabPages => 'Старонкі'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Дадаць альбом'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Мініяцюры'; + + @override + String get settingsThumbnailOverlayTile => 'Навязванне'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Навязванне'; + + @override + String get settingsThumbnailShowHdrIcon => 'Паказаць значок HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Паказаць значок абранага'; + + @override + String get settingsThumbnailShowTagIcon => 'Паказаць значок тэга'; + + @override + String get settingsThumbnailShowLocationIcon => 'Паказаць значок месцазнаходжання'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Паказаць значок фота з рухам'; + + @override + String get settingsThumbnailShowRating => 'Паказаць рэйтынг'; + + @override + String get settingsThumbnailShowRawIcon => 'Паказаць значок raw'; + + @override + String get settingsThumbnailShowVideoDuration => 'Паказаць працягласць відэа'; + + @override + String get settingsCollectionQuickActionsTile => 'Хуткія дзеянні'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Хуткія дзеянні'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Прагляд'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Выбар'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Націсніце і ўтрымлівайце, каб перамясціць кнопкі і выбраць дзеянні, якія будуць адлюстроўвацца пры праглядзе элементаў.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Націсніце і ўтрымлівайце, каб перамясціць кнопкі і выбраць дзеянні, якія будуць адлюстроўвацца пры выбары элементаў.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Шаблоны ўспышкі'; + + @override + String get settingsCollectionBurstPatternsNone => 'Без ўспышкі'; + + @override + String get settingsViewerSectionTitle => 'Прагляднік'; + + @override + String get settingsViewerGestureSideTapNext => 'Дакраніцеся да краёў экрана, каб паказаць папярэдні/наступны элемент'; + + @override + String get settingsViewerUseCutout => 'Выкарыстоўваць вобласць выраза'; + + @override + String get settingsViewerMaximumBrightness => 'Максімальная яркасць'; + + @override + String get settingsMotionPhotoAutoPlay => 'Аўтаматычнае прайграванне фатаграфій з рухам'; + + @override + String get settingsImageBackground => 'Фон выявы'; + + @override + String get settingsViewerQuickActionsTile => 'Хуткія дзеянні'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Хуткія дзеянні'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Націсніце і ўтрымлівайце, каб перамяшчаць кнопкі і выбіраць дзеянні для адлюстравання ў праглядніку.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Адлюстраваныя кнопкі'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Даступныя кнопкі'; + + @override + String get settingsViewerQuickActionEmpty => 'Няма кнопак'; + + @override + String get settingsViewerOverlayTile => 'Навязванне'; + + @override + String get settingsViewerOverlayPageTitle => 'Навязванне'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Паказаць на адкрыцці'; + + @override + String get settingsViewerShowHistogram => 'Паказаць гістаграму'; + + @override + String get settingsViewerShowMinimap => 'Паказаць мінікарту'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Паказаць інфармацыю'; + + @override + String get settingsViewerShowInformationSubtitle => 'Паказаць назву, дату, месцазнаходжанне і г.д.'; + + @override + String get settingsViewerShowRatingTags => 'Паказаць рэйтынг і тэгі'; + + @override + String get settingsViewerShowShootingDetails => 'Паказаць дэталі здымкі'; + + @override + String get settingsViewerShowDescription => 'Паказаць апісанне'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Паказаць мініяцюры'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Эфект размыцця'; + + @override + String get settingsViewerSlideshowTile => 'Слайд-шоў'; + + @override + String get settingsViewerSlideshowPageTitle => 'Слайд-шоў'; + + @override + String get settingsSlideshowRepeat => 'Паўтарэнне'; + + @override + String get settingsSlideshowShuffle => 'Ператасаваць'; + + @override + String get settingsSlideshowFillScreen => 'Запоўніць экран'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Аніміраваны эфект маштабавання'; + + @override + String get settingsSlideshowTransitionTile => 'Пераход'; + + @override + String get settingsSlideshowIntervalTile => 'Інтэрвал'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Прайграванне відэа'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Прайграванне відэа'; + + @override + String get settingsVideoPageTitle => 'Налады відэа'; + + @override + String get settingsVideoSectionTitle => 'Відэа'; + + @override + String get settingsVideoShowVideos => 'Паказаць відэа'; + + @override + String get settingsVideoPlaybackTile => 'Прайграванне'; + + @override + String get settingsVideoPlaybackPageTitle => 'Прайграванне'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Апаратнае паскарэнне'; + + @override + String get settingsVideoAutoPlay => 'Аўтапрайграванне'; + + @override + String get settingsVideoLoopModeTile => 'Цыклічны рэжым'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Цыклічны рэжым'; + + @override + String get settingsVideoResumptionModeTile => 'Працягнуць прайграванне'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Працягнуць прайграванне'; + + @override + String get settingsVideoBackgroundMode => 'Фонавы рэжым'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Фонавы рэжым'; + + @override + String get settingsVideoControlsTile => 'Элементы кіравання'; + + @override + String get settingsVideoControlsPageTitle => 'Элементы кіравання'; + + @override + String get settingsVideoButtonsTile => 'Кнопкі'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Двойчы націсніце, каб прайграць/прыпыніць'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Двойчы націсніце на край экрана, каб перайсці назад/наперад'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Правядзіце пальцам уверх ці ўніз, каб наладзіць яркасць/гучнасць'; + + @override + String get settingsSubtitleThemeTile => 'Субтытры'; + + @override + String get settingsSubtitleThemePageTitle => 'Субтытры'; + + @override + String get settingsSubtitleThemeSample => 'Гэта ўзор.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Выраўноўванне тэксту'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Выраўноўванне тэксту'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Палажэнне тэксту'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Палажэнне тэксту'; + + @override + String get settingsSubtitleThemeTextSize => 'Памер тэксту'; + + @override + String get settingsSubtitleThemeShowOutline => 'Паказаць контур і цень'; + + @override + String get settingsSubtitleThemeTextColor => 'Колер тэксту'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Непразрыстасць тэксту'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Колер фону'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Непразрыстасць фону'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Злева'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Па цэнтры'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Справа'; + + @override + String get settingsPrivacySectionTitle => 'Канфідэнцыяльнасць'; + + @override + String get settingsAllowInstalledAppAccess => 'Дазволіць доступ да інвентара праграм'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Выкарыстоўваецца для паляпшэння адлюстравання альбомаў'; + + @override + String get settingsAllowErrorReporting => 'Дазволіць ананімнае паведамленне пра памылкі'; + + @override + String get settingsSaveSearchHistory => 'Захаваць гісторыю пошуку'; + + @override + String get settingsEnableBin => 'Выкарыстоўваць сметніцу'; + + @override + String get settingsEnableBinSubtitle => 'Захоўвае выдаленыя элементы на працягу 30 дзён'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Элементы ў сметніцы будуць выдалены назаўсёды.'; + + @override + String get settingsAllowMediaManagement => 'Дазволіць кіраванне мультымедыя'; + + @override + String get settingsHiddenItemsTile => 'Схаваныя элементы'; + + @override + String get settingsHiddenItemsPageTitle => 'Схаваныя элементы'; + + @override + String get settingsHiddenFiltersBanner => 'Фота і відэа, якія адпавядаюць схаваным фільтрам, не будуць адлюстроўвацца ў вашай калекцыі.'; + + @override + String get settingsHiddenFiltersEmpty => 'Няма схаваных фільтраў'; + + @override + String get settingsStorageAccessTile => 'Доступ да сховішча'; + + @override + String get settingsStorageAccessPageTitle => 'Доступ да сховішча'; + + @override + String get settingsStorageAccessBanner => 'Некаторыя каталогі патрабуюць відавочнага дазволу на змяненне файлаў у іх. Тут вы можаце прагледзець каталогі, да якіх вы раней далі доступ.'; + + @override + String get settingsStorageAccessEmpty => 'Доступ не прадстаўлены'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Адклікаць'; + + @override + String get settingsAccessibilitySectionTitle => 'Спецыяльныя магчымасці'; + + @override + String get settingsRemoveAnimationsTile => 'Выдаліць анімацыі'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Выдаліць анімацыі'; + + @override + String get settingsTimeToTakeActionTile => 'Час выканання'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Паказваць альтэрнатывы мультисенсорным жэстам'; + + @override + String get settingsDisplaySectionTitle => 'Адлюстраванне'; + + @override + String get settingsThemeBrightnessTile => 'Тэма'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Тэма'; + + @override + String get settingsThemeColorHighlights => 'Каляровыя акцэнты'; + + @override + String get settingsThemeEnableDynamicColor => 'Дынамічны колер'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Частата абнаўлення экрана'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Частата абнаўлення'; + + @override + String get settingsDisplayUseTvInterface => 'Інтэрфейс Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Мова і фарматы'; + + @override + String get settingsLanguageTile => 'Мова'; + + @override + String get settingsLanguagePageTitle => 'Мова'; + + @override + String get settingsCoordinateFormatTile => 'Фармат каардынат'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Фармат каардынат'; + + @override + String get settingsUnitSystemTile => 'Адзінкі вымярэння'; + + @override + String get settingsUnitSystemDialogTitle => 'Адзінкі вымярэння'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Прымусовыя арабскія лічбы'; + + @override + String get settingsScreenSaverPageTitle => 'Застаўка на экран'; + + @override + String get settingsWidgetPageTitle => 'Фотарамка'; + + @override + String get settingsWidgetShowOutline => 'Вылучэнне'; + + @override + String get settingsWidgetOpenPage => 'Пры націску на віджэт'; + + @override + String get settingsWidgetDisplayedItem => 'Адлюстраваны элемент'; + + @override + String get settingsCollectionTile => 'Калекцыя'; + + @override + String get statsPageTitle => 'Статыстыка'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count элементаў з месцазнаходжаннем', + few: '$count элементы з месцазнаходжаннем', + one: '1 элемент з месцазнаходжаннем', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Топ Краін'; + + @override + String get statsTopStatesSectionTitle => 'Топ краін'; + + @override + String get statsTopPlacesSectionTitle => 'Лепшыя месцы'; + + @override + String get statsTopTagsSectionTitle => 'Лепшыя тэгі'; + + @override + String get statsTopAlbumsSectionTitle => 'Лепшыя альбомы'; + + @override + String get viewerOpenPanoramaButtonLabel => 'АДКРЫЦЬ ПАНАРАМУ'; + + @override + String get viewerSetWallpaperButtonLabel => 'УСТАНАВІЦЬ ШПАЛЕРЫ'; + + @override + String get viewerErrorUnknown => 'Ой!'; + + @override + String get viewerErrorDoesNotExist => 'Файл больш не існуе.'; + + @override + String get viewerInfoPageTitle => 'Інфармацыя'; + + @override + String get viewerInfoBackToViewerTooltip => 'Вярнуцца да аглядальніка'; + + @override + String get viewerInfoUnknown => 'невядома'; + + @override + String get viewerInfoLabelDescription => 'Апісанне'; + + @override + String get viewerInfoLabelTitle => 'Назва'; + + @override + String get viewerInfoLabelDate => 'Дата'; + + @override + String get viewerInfoLabelResolution => 'Разрозненне'; + + @override + String get viewerInfoLabelSize => 'Памер'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Шлях'; + + @override + String get viewerInfoLabelDuration => 'Працягласць'; + + @override + String get viewerInfoLabelOwner => 'Уладальнік'; + + @override + String get viewerInfoLabelCoordinates => 'Каардынаты'; + + @override + String get viewerInfoLabelAddress => 'Адрас'; + + @override + String get mapStyleDialogTitle => 'Стыль карты'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Выберыце стыль карты'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Павелічэнне'; + + @override + String get mapZoomOutTooltip => 'Змяншэння'; + + @override + String get mapPointNorthUpTooltip => 'Пакажыце поўнач уверх'; + + @override + String get mapAttributionOsmData => 'Даныя карты © [OpenStreetMap](https://www.openstreetmap.org/copyright) удзельнікі'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Пліткі ад [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Пліткі ад [HOT](https://www.hotosm.org/) • Арганізаваны [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Пліткі ад [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Паглядзець на старонцы карты'; + + @override + String get mapEmptyRegion => 'Няма малюнкаў у гэтым рэгіёне'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Не ўдалося атрымаць убудаваныя даныя'; + + @override + String get viewerInfoOpenLinkText => 'Адкрыць'; + + @override + String get viewerInfoViewXmlLinkText => 'Прагляд XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Пошук метададзеных'; + + @override + String get viewerInfoSearchEmpty => 'Няма адпаведных ключоў'; + + @override + String get viewerInfoSearchSuggestionDate => 'Дата і час'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Апісанне'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Памеры'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Разрозненне'; + + @override + String get viewerInfoSearchSuggestionRights => 'Правы'; + + @override + String get wallpaperUseScrollEffect => 'Выкарыстоўвайце эфект пракруткі на галоўным экране'; + + @override + String get tagEditorPageTitle => 'Рэдагаваць тэгі'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Новы тэг'; + + @override + String get tagEditorPageAddTagTooltip => 'Дадаць тэг'; + + @override + String get tagEditorSectionRecent => 'Апошнія'; + + @override + String get tagEditorSectionPlaceholders => 'Запаўняльнікі'; + + @override + String get tagEditorDiscardDialogMessage => 'Вы хочаце адмяніць змены?'; + + @override + String get tagPlaceholderCountry => 'Краіна'; + + @override + String get tagPlaceholderState => 'Дзяржава'; + + @override + String get tagPlaceholderPlace => 'Месца'; + + @override + String get panoramaEnableSensorControl => 'Уключыць сэнсарнае кіраванне'; + + @override + String get panoramaDisableSensorControl => 'Адключыць сэнсарнае кіраванне'; + + @override + String get sourceViewerPageTitle => 'Крыніца'; +} diff --git a/lib/l10ngen/app_localizations_bg.dart b/lib/l10ngen/app_localizations_bg.dart new file mode 100644 index 0000000..3ff747b --- /dev/null +++ b/lib/l10ngen/app_localizations_bg.dart @@ -0,0 +1,2428 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Bulgarian (`bg`). +class AppLocalizationsBg extends AppLocalizations { + AppLocalizationsBg([String locale = 'bg']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Добре дошли в Aves'; + + @override + String get welcomeOptional => 'Опционално'; + + @override + String get welcomeTermsToggle => 'Съгласявам се с правилата и условията'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString елемента', + few: '$countString елемента', + one: '$countString елемент', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString колони', + one: '$countString колона', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString секунди', + few: '$countString секунди', + one: '$countString секунда', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString минути', + few: '$countString минути', + one: '$countString минута', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString дни', + few: '$countString дни', + one: '$countString ден', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length мм'; + } + + @override + String get applyButtonLabel => 'ПРИЕМАМ'; + + @override + String get createButtonLabel => 'СЪЗДАЙ'; + + @override + String get deleteButtonLabel => 'ИЗТРИЙ'; + + @override + String get nextButtonLabel => 'СЛЕДВАЩ'; + + @override + String get showButtonLabel => 'ПОКАЗВАНЕ'; + + @override + String get hideButtonLabel => 'СКРИЙ'; + + @override + String get continueButtonLabel => 'ПРОДЪЛЖИ'; + + @override + String get saveCopyButtonLabel => 'ЗАПАЗВАНЕ НА КОПИЕ'; + + @override + String get applyTooltip => 'Приеми'; + + @override + String get cancelTooltip => 'Отмяна'; + + @override + String get changeTooltip => 'Промени'; + + @override + String get clearTooltip => 'Изчисти'; + + @override + String get previousTooltip => 'Предишен'; + + @override + String get nextTooltip => 'Следващ'; + + @override + String get showTooltip => 'Покажи'; + + @override + String get hideTooltip => 'Скрий'; + + @override + String get actionRemove => 'Премахване'; + + @override + String get resetTooltip => 'Нулиране'; + + @override + String get saveTooltip => 'Запишете'; + + @override + String get stopTooltip => 'Стоп'; + + @override + String get pickTooltip => 'Изберете'; + + @override + String get doubleBackExitMessage => 'Натиснете отново „Назад“, за да излезете.'; + + @override + String get doNotAskAgain => 'Не питай отново'; + + @override + String get sourceStateLoading => 'Зареждане'; + + @override + String get sourceStateCataloguing => 'Каталогизация'; + + @override + String get sourceStateLocatingCountries => 'Местоположение на държави'; + + @override + String get sourceStateLocatingPlaces => 'Местоположение на места'; + + @override + String get chipActionDelete => 'Изтрий'; + + @override + String get chipActionRemove => 'Премахване'; + + @override + String get chipActionShowCollection => 'Показване в колекцията'; + + @override + String get chipActionGoToAlbumPage => 'Покажи в албуми'; + + @override + String get chipActionGoToCountryPage => 'Показване в държави'; + + @override + String get chipActionGoToPlacePage => 'Покажи в места'; + + @override + String get chipActionGoToTagPage => 'Показване в тагове'; + + @override + String get chipActionGoToExplorerPage => 'Показване в Експлорър'; + + @override + String get chipActionDecompose => 'Раздели'; + + @override + String get chipActionFilterOut => 'Изключи'; + + @override + String get chipActionFilterIn => 'Включи'; + + @override + String get chipActionHide => 'Скрий'; + + @override + String get chipActionLock => 'Заключи'; + + @override + String get chipActionPin => 'Закачете отгоре'; + + @override + String get chipActionUnpin => 'Откачи от закачени'; + + @override + String get chipActionGroup => 'Прегрупиране'; + + @override + String get chipActionRename => 'Преименувайте'; + + @override + String get chipActionSetCover => 'Задайте тапет'; + + @override + String get chipActionShowCountryStates => 'Показване на държава'; + + @override + String get chipActionCreateGroup => 'Създайте група'; + + @override + String get chipActionCreateAlbum => 'Създайте албум'; + + @override + String get chipActionCreateVault => 'Създаване на трезор'; + + @override + String get chipActionConfigureVault => 'Настройване на трезор'; + + @override + String get entryActionCopyToClipboard => 'Копирайте в клипборд'; + + @override + String get entryActionDelete => 'Изтриване'; + + @override + String get entryActionConvert => 'Конвертиране'; + + @override + String get entryActionExport => 'Експортиране'; + + @override + String get entryActionInfo => 'Информация'; + + @override + String get entryActionRename => 'Преименуване'; + + @override + String get entryActionRestore => 'Възстановяване'; + + @override + String get entryActionRotateCCW => 'Завъртете обратно на часовниковата стрелка'; + + @override + String get entryActionRotateCW => 'Завъртете по посока на часовниковата стрелка'; + + @override + String get entryActionFlip => 'Хоризонтално превъртане'; + + @override + String get entryActionPrint => 'Печат'; + + @override + String get entryActionShare => 'Споделяне'; + + @override + String get entryActionShareImageOnly => 'Споделете само изображение'; + + @override + String get entryActionShareVideoOnly => 'Сооделяне само на видео'; + + @override + String get entryActionViewSource => 'Вижте източника'; + + @override + String get entryActionShowGeoTiffOnMap => 'Покажи на картата'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Конвертиране в статично изображение'; + + @override + String get entryActionViewMotionPhotoVideo => 'Отвори видео'; + + @override + String get entryActionEdit => 'Редактиране'; + + @override + String get entryActionOpen => 'Отвори с'; + + @override + String get entryActionSetAs => 'Задай като'; + + @override + String get entryActionCast => 'Излъчване'; + + @override + String get entryActionOpenMap => 'Покажи в приложение за карти'; + + @override + String get entryActionRotateScreen => 'Завъртане на екрана'; + + @override + String get entryActionAddFavourite => 'Добави в любими'; + + @override + String get entryActionRemoveFavourite => 'Премахни от любими'; + + @override + String get videoActionCaptureFrame => 'Кадър за заснемане'; + + @override + String get videoActionMute => 'Изключи звук'; + + @override + String get videoActionUnmute => 'Включи звук'; + + @override + String get videoActionPause => 'Пауза'; + + @override + String get videoActionPlay => 'Възпроизведи'; + + @override + String get videoActionReplay10 => 'Превъртане 10 секунди назад'; + + @override + String get videoActionSkip10 => 'Превъртане 10 секунди напред'; + + @override + String get videoActionShowPreviousFrame => 'Покажи предишния кадър'; + + @override + String get videoActionShowNextFrame => 'Покажи следващия кадър'; + + @override + String get videoActionSelectStreams => 'Изберете песни'; + + @override + String get videoActionSetSpeed => 'Скорост на възпроизвеждане'; + + @override + String get videoActionABRepeat => 'Повторете от А до Б'; + + @override + String get videoRepeatActionSetStart => 'Задайте начало'; + + @override + String get videoRepeatActionSetEnd => 'Задайте край'; + + @override + String get viewerActionSettings => 'Настройки'; + + @override + String get viewerActionLock => 'Блокирай визуализатора'; + + @override + String get viewerActionUnlock => 'Отблокирай визуализатора'; + + @override + String get slideshowActionResume => 'Продължи'; + + @override + String get slideshowActionShowInCollection => 'Покажи в Колекции'; + + @override + String get entryInfoActionEditDate => 'Променете дата и час'; + + @override + String get entryInfoActionEditLocation => 'Променете местоположение'; + + @override + String get entryInfoActionEditTitleDescription => 'Променете заглавието и описанието'; + + @override + String get entryInfoActionEditRating => 'Променяте рейтинга'; + + @override + String get entryInfoActionEditTags => 'Променяне на тагове'; + + @override + String get entryInfoActionRemoveMetadata => 'Изтриване на метаданни'; + + @override + String get entryInfoActionExportMetadata => 'Експортиране на метаданни'; + + @override + String get entryInfoActionRemoveLocation => 'Премахване на местоположение'; + + @override + String get editorActionTransform => 'Трансформиране'; + + @override + String get editorTransformCrop => 'Изрязване'; + + @override + String get editorTransformRotate => 'Завъртане'; + + @override + String get cropAspectRatioFree => 'Свободни'; + + @override + String get cropAspectRatioOriginal => 'Оригинал'; + + @override + String get cropAspectRatioSquare => 'Квадратно'; + + @override + String get filterAspectRatioLandscapeLabel => 'Хоризонтално'; + + @override + String get filterAspectRatioPortraitLabel => 'Вертикално'; + + @override + String get filterBinLabel => 'Кошче'; + + @override + String get filterFavouriteLabel => 'Любими'; + + @override + String get filterNoDateLabel => 'Без дата'; + + @override + String get filterNoAddressLabel => 'Без адрес'; + + @override + String get filterLocatedLabel => 'С местоположение'; + + @override + String get filterNoLocationLabel => 'Без местоположение'; + + @override + String get filterNoRatingLabel => 'Без рейтинг'; + + @override + String get filterTaggedLabel => 'С тагове'; + + @override + String get filterNoTagLabel => 'Без тагове'; + + @override + String get filterNoTitleLabel => 'Наименувани'; + + @override + String get filterOnThisDayLabel => 'Днес'; + + @override + String get filterRecentlyAddedLabel => 'Наскоро добавени'; + + @override + String get filterRatingRejectedLabel => 'Отхвърлени'; + + @override + String get filterTypeAnimatedLabel => 'Анимирани'; + + @override + String get filterTypeMotionPhotoLabel => 'Снимка с движение'; + + @override + String get filterTypePanoramaLabel => 'Панорама'; + + @override + String get filterTypeRawLabel => 'RAW'; + + @override + String get filterTypeSphericalVideoLabel => '360° Видео'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Изображение'; + + @override + String get filterMimeVideoLabel => 'Видео'; + + @override + String get accessibilityAnimationsRemove => 'Предотвратяване ефектите на екрана'; + + @override + String get accessibilityAnimationsKeep => 'Запазване на екранните ефекти'; + + @override + String get albumTierNew => 'Нови'; + + @override + String get albumTierPinned => 'Закачени'; + + @override + String get albumTierGroups => 'Групи'; + + @override + String get albumTierSpecial => 'Стандартни'; + + @override + String get albumTierApps => 'Приложения'; + + @override + String get albumTierVaults => 'Трезори'; + + @override + String get albumTierDynamic => 'Динамични'; + + @override + String get albumTierRegular => 'Други'; + + @override + String get coordinateFormatDms => 'Градуси, минути и секунди'; + + @override + String get coordinateFormatDdm => 'Градуси, десетични минути'; + + @override + String get coordinateFormatDecimal => 'Десетични градуси'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'Север'; + + @override + String get coordinateDmsSouth => 'Юг'; + + @override + String get coordinateDmsEast => 'Изток'; + + @override + String get coordinateDmsWest => 'Запад'; + + @override + String get displayRefreshRatePreferHighest => 'Висока честота'; + + @override + String get displayRefreshRatePreferLowest => 'Ниска честота'; + + @override + String get keepScreenOnNever => 'Никога'; + + @override + String get keepScreenOnVideoPlayback => 'По време на възпроизвеждане на видео'; + + @override + String get keepScreenOnViewerOnly => 'Само във визуализатора'; + + @override + String get keepScreenOnAlways => 'Винаги'; + + @override + String get lengthUnitPixel => 'Пиксели'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Карти'; + + @override + String get mapStyleGoogleHybrid => 'Google Карти (хибрид)'; + + @override + String get mapStyleGoogleTerrain => 'Google Карти (терен)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Акварел'; + + @override + String get maxBrightnessNever => 'Никога'; + + @override + String get maxBrightnessAlways => 'Винаги'; + + @override + String get nameConflictStrategyRename => 'Преименувай'; + + @override + String get nameConflictStrategyReplace => 'Замени'; + + @override + String get nameConflictStrategySkip => 'Пропусни'; + + @override + String get overlayHistogramNone => 'Нищо'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Яркост'; + + @override + String get subtitlePositionTop => 'Най-отгоре'; + + @override + String get subtitlePositionBottom => 'Отдолу'; + + @override + String get themeBrightnessLight => 'Светла'; + + @override + String get themeBrightnessDark => 'Тъмна'; + + @override + String get themeBrightnessBlack => 'Черна'; + + @override + String get unitSystemMetric => 'Метрични'; + + @override + String get unitSystemImperial => 'Имперски'; + + @override + String get vaultLockTypePattern => 'Графичен ключ'; + + @override + String get vaultLockTypePin => 'PIN-код'; + + @override + String get vaultLockTypePassword => 'Парола'; + + @override + String get settingsVideoEnablePip => 'Картина в картината'; + + @override + String get videoControlsPlayOutside => 'Отвори с друг видео плеър'; + + @override + String get videoLoopModeNever => 'Никога'; + + @override + String get videoLoopModeShortOnly => 'Само за кратки видеа'; + + @override + String get videoLoopModeAlways => 'Винаги'; + + @override + String get videoPlaybackSkip => 'Пропусни'; + + @override + String get videoPlaybackMuted => 'Пусни без звук'; + + @override + String get videoPlaybackWithSound => 'Пусни със звук'; + + @override + String get videoResumptionModeNever => 'Никога'; + + @override + String get videoResumptionModeAlways => 'Винаги'; + + @override + String get viewerTransitionSlide => 'Слайд'; + + @override + String get viewerTransitionParallax => 'Паралакс'; + + @override + String get viewerTransitionFade => 'Избледняване на прехода'; + + @override + String get viewerTransitionZoomIn => 'Приближения'; + + @override + String get viewerTransitionNone => 'Не'; + + @override + String get wallpaperTargetHome => 'Начален екран'; + + @override + String get wallpaperTargetLock => 'Заключен екран'; + + @override + String get wallpaperTargetHomeLock => 'Начален и заключен екран'; + + @override + String get widgetDisplayedItemRandom => 'Произволни'; + + @override + String get widgetDisplayedItemMostRecent => 'Чести'; + + @override + String get widgetOpenPageHome => 'Отвори начален екран'; + + @override + String get widgetOpenPageCollection => 'Отвори колекция'; + + @override + String get widgetOpenPageViewer => 'Преглед на текущия'; + + @override + String get widgetTapUpdateWidget => 'Обнови Уиджет'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Вътрешна памет'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD карта'; + + @override + String get rootDirectoryDescription => 'Основна директория'; + + @override + String otherDirectoryDescription(String name) { + return '„$name“ директория'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Моля изберете $directory на „$volume“ на следващия екран за да дадете достъп на приложението до него.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'На това приложение не се дава достъп до $directory на „$volume“.\n\nМоля използвайте системно инсталиран файлов мениджър или Галерия за преместване на елементи в друга директория.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Тази операция изисква $neededSize свободно място на „$volume“ за да завърши, но тук има само $freeSize оставащо.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Системното файлово приложение е изключено или липсва. Моля разрешете го и опитайте отново.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Тази операция не се поддържа за елементи от следните типове: $types.', + one: 'Тази операция не се поддържа за елементи от следния тип: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Някои файлове в целевата папка имат същото име.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Някои файлове имат еднакво име.'; + + @override + String get addShortcutDialogLabel => 'Етикет за пряк път'; + + @override + String get addShortcutButtonLabel => 'ДОБАВИ'; + + @override + String get noMatchingAppDialogMessage => 'Няма приложения, които да могат да се справят с това.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Преместване на тези $countString елемента в кошчето?', + one: 'Преместване на този елемент в кошчето?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Изтриване на тези $countString елемента?', + one: 'Изтриване на този елемент?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Запазвам ли датите на елементите преди продължаване?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Запазване дата'; + + @override + String videoResumeDialogMessage(String time) { + return 'Да възобновени възпроизвеждането от $time?'; + } + + @override + String get videoStartOverButtonLabel => 'ЗАПОЧНИ ОТНАЧАЛО'; + + @override + String get videoResumeButtonLabel => 'ПРОДЪЛЖИ'; + + @override + String get setCoverDialogLatest => 'Последен елемент'; + + @override + String get setCoverDialogAuto => 'Авто'; + + @override + String get setCoverDialogCustom => 'Персонален'; + + @override + String get hideFilterConfirmationDialogMessage => 'Съответстващите снимки и видеоклипове ще бъдат скрити от вашата колекция. Можете да ги покажете отново от настройките „Поверителност“.\n\nСигурни ли сте, че искате да ги скриете?'; + + @override + String get newAlbumDialogTitle => 'Нов албум'; + + @override + String get newAlbumDialogNameLabel => 'Име на албума'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Албумът вече съществува'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Директорията вече съществува'; + + @override + String get newAlbumDialogStorageLabel => 'Хранилище:'; + + @override + String get newDynamicAlbumDialogTitle => 'Нов динамичен албум'; + + @override + String get dynamicAlbumAlreadyExists => 'Динамични албум вече съществува'; + + @override + String get newGroupDialogTitle => 'Нова Група'; + + @override + String get newGroupDialogNameLabel => 'Име на групата'; + + @override + String get groupAlreadyExists => 'Групата вече съществува'; + + @override + String get groupEmpty => 'Без група'; + + @override + String get ungrouped => 'Негрупирани'; + + @override + String get groupPickerTitle => 'Избор Група'; + + @override + String get groupPickerUseThisGroupButton => 'Използвайте тази група'; + + @override + String get newVaultWarningDialogMessage => 'Елементите в трезорите са достъпни само за това приложение и за никое друго.\n\nАко деинсталирате или изчистите данните на това приложение, ще загубите цялото съдържание на трезора.'; + + @override + String get newVaultDialogTitle => 'Нов трезор'; + + @override + String get configureVaultDialogTitle => 'Конфигурирайте Трезор'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Заключване при изключен екран'; + + @override + String get vaultDialogLockTypeLabel => 'Вид заключване'; + + @override + String get patternDialogEnter => 'Въведете шаблон'; + + @override + String get patternDialogConfirm => 'Потвърдете шаблон'; + + @override + String get pinDialogEnter => 'Въведете пин-код'; + + @override + String get pinDialogConfirm => 'Потвърдете PIN'; + + @override + String get passwordDialogEnter => 'Въведете парола'; + + @override + String get passwordDialogConfirm => 'Потвърдете парола'; + + @override + String get authenticateToConfigureVault => 'Удостоверете се, за да конфигурирате трезора'; + + @override + String get authenticateToUnlockVault => 'Удостоверете се, за да отключите трезора'; + + @override + String get vaultBinUsageDialogMessage => 'Някой от трезорите използват кошче.'; + + @override + String get renameAlbumDialogLabel => 'Ново име'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Съществуваща директория'; + + @override + String get renameEntrySetPageTitle => 'Преименувай'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Шаблон наименуван'; + + @override + String get renameEntrySetPageInsertTooltip => 'Вмъкване на поле'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Преглед'; + + @override + String get renameProcessorCounter => 'Брояч'; + + @override + String get renameProcessorHash => 'Хеш'; + + @override + String get renameProcessorName => 'Име'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Изтриване на този албум и $countString елементите в него?', + one: 'Изтриване на този албум и елемента в него?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Изтриване на тези албуми и $countString елементите в тях?', + one: 'Изтриване на тези албуми и елемента в тях?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Формат:'; + + @override + String get exportEntryDialogWidth => 'Ширина'; + + @override + String get exportEntryDialogHeight => 'Височина'; + + @override + String get exportEntryDialogQuality => 'Качество'; + + @override + String get exportEntryDialogWriteMetadata => 'Запис на метаданни'; + + @override + String get renameEntryDialogLabel => 'Ново име'; + + @override + String get editEntryDialogCopyFromItem => 'Копиране от друг елемент'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Полета за промяна'; + + @override + String get editEntryDateDialogTitle => 'Дата и час'; + + @override + String get editEntryDateDialogSetCustom => 'Задайте персонализирана дата'; + + @override + String get editEntryDateDialogCopyField => 'Копирайте от друга дата'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Извличане от заглавието'; + + @override + String get editEntryDateDialogShift => 'Преместване с'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Дата на промяна на файла'; + + @override + String get durationDialogHours => 'Часове'; + + @override + String get durationDialogMinutes => 'Минути'; + + @override + String get durationDialogSeconds => 'Секунди'; + + @override + String get editEntryLocationDialogTitle => 'Местоположение'; + + @override + String get editEntryLocationDialogSetCustom => 'Редактиране на местоположение'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Избери на картата'; + + @override + String get editEntryLocationDialogImportGpx => 'Импортиране на GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Широчина'; + + @override + String get editEntryLocationDialogLongitude => 'Дължина'; + + @override + String get editEntryLocationDialogTimeShift => 'Изместване на времето'; + + @override + String get locationPickerUseThisLocationButton => 'Използвай това местоположение'; + + @override + String get editEntryRatingDialogTitle => 'Рейтинг'; + + @override + String get removeEntryMetadataDialogTitle => 'Премахване на метаданни'; + + @override + String get removeEntryMetadataDialogAll => 'Всички'; + + @override + String get removeEntryMetadataDialogMore => 'Още'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP е необходим за възпроизвеждане на видеоклипа в снимка с движение.\n\nСигурни ли сте, че искате да го премахнете?'; + + @override + String get videoSpeedDialogLabel => 'Скорост на възпроизвеждане'; + + @override + String get videoStreamSelectionDialogVideo => 'Видео'; + + @override + String get videoStreamSelectionDialogAudio => 'Аудио'; + + @override + String get videoStreamSelectionDialogText => 'Субтитри'; + + @override + String get videoStreamSelectionDialogOff => 'Изключено'; + + @override + String get videoStreamSelectionDialogTrack => 'Пътечка'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Няма други пътечки.'; + + @override + String get genericSuccessFeedback => 'Готово!'; + + @override + String get genericFailureFeedback => 'Неуспешно'; + + @override + String get genericDangerWarningDialogMessage => 'Сигурен ли сте?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Опитай отново с по-малко елементи.'; + + @override + String get menuActionConfigureView => 'Изглед'; + + @override + String get menuActionSelect => 'Избери'; + + @override + String get menuActionSelectAll => 'Избери всички'; + + @override + String get menuActionSelectNone => 'Не избирай нищо'; + + @override + String get menuActionMap => 'Карта'; + + @override + String get menuActionSlideshow => 'Слайд-шоу'; + + @override + String get menuActionStats => 'Статистика'; + + @override + String get viewDialogSortSectionTitle => 'Сортиране'; + + @override + String get viewDialogGroupSectionTitle => 'Групиране'; + + @override + String get viewDialogLayoutSectionTitle => 'Оформление'; + + @override + String get viewDialogReverseSortOrder => 'Сортиране в обратен ред'; + + @override + String get tileLayoutMosaic => 'Мозайка'; + + @override + String get tileLayoutGrid => 'Решетка'; + + @override + String get tileLayoutList => 'Списък'; + + @override + String get castDialogTitle => 'Устройство за излъчване'; + + @override + String get coverDialogTabCover => 'Тапет'; + + @override + String get coverDialogTabApp => 'Приложение'; + + @override + String get coverDialogTabColor => 'Цвят'; + + @override + String get appPickDialogTitle => 'Изберете приложение'; + + @override + String get appPickDialogNone => 'Нищо'; + + @override + String get aboutPageTitle => 'За нас'; + + @override + String get aboutLinkLicense => 'Лицензи'; + + @override + String get aboutLinkPolicy => 'Политика за личните данни'; + + @override + String get aboutBugSectionTitle => 'Съобщи за грешка'; + + @override + String get aboutBugSaveLogInstruction => 'Запазете лог във файл'; + + @override + String get aboutBugCopyInfoInstruction => 'Копирай системата информация'; + + @override + String get aboutBugCopyInfoButton => 'Копирай'; + + @override + String get aboutBugReportInstruction => 'Изпратете съобщение за грешка на GitHub, заедно с лог и системна информация'; + + @override + String get aboutBugReportButton => 'Изпрати'; + + @override + String get aboutDataUsageSectionTitle => 'Използване на данни'; + + @override + String get aboutDataUsageData => 'Данни'; + + @override + String get aboutDataUsageCache => 'Кеш'; + + @override + String get aboutDataUsageDatabase => 'База данни'; + + @override + String get aboutDataUsageMisc => 'Разни'; + + @override + String get aboutDataUsageInternal => 'Вътрешни'; + + @override + String get aboutDataUsageExternal => 'Външни'; + + @override + String get aboutDataUsageClearCache => 'Изчисти кеш'; + + @override + String get aboutCreditsSectionTitle => 'Благодарности'; + + @override + String get aboutCreditsWorldAtlas1 => 'Това приложение използва файл TopoJSON от'; + + @override + String get aboutCreditsWorldAtlas2 => 'под ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'Преводачи'; + + @override + String get aboutLicensesSectionTitle => 'Лиценз с отворен код'; + + @override + String get aboutLicensesBanner => 'Това приложение използва следните пакети и библиотеки с отворен код.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Библиотеки Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter плъгини'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter пакети'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart пакети'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Покажи всички лицензи'; + + @override + String get policyPageTitle => 'Политика за конфиденциалност'; + + @override + String get collectionPageTitle => 'Колекция'; + + @override + String get collectionPickPageTitle => 'Избери'; + + @override + String get collectionSelectPageTitle => 'Изберете елементи'; + + @override + String get collectionActionShowTitleSearch => 'Покажи филтър на заглавията'; + + @override + String get collectionActionHideTitleSearch => 'Скрий филтъра на заглавието'; + + @override + String get collectionActionAddDynamicAlbum => 'Добави динамичен албум'; + + @override + String get collectionActionAddShortcut => 'Добави кратък път'; + + @override + String get collectionActionSetHome => 'Задай като начален'; + + @override + String get collectionActionEmptyBin => 'Изпразни кошчето'; + + @override + String get collectionActionCopy => 'Копирай в албум'; + + @override + String get collectionActionMove => 'Премести в албум'; + + @override + String get collectionActionRescan => 'Сканирай наново'; + + @override + String get collectionActionEdit => 'Редактиране'; + + @override + String get collectionSearchTitlesHintText => 'Търси заглавия'; + + @override + String get collectionGroupAlbum => 'По албум'; + + @override + String get collectionGroupMonth => 'По месец'; + + @override + String get collectionGroupDay => 'По дни'; + + @override + String get sectionNone => 'Без раздели'; + + @override + String get sectionUnknown => 'Неизвестно'; + + @override + String get dateToday => 'Днес'; + + @override + String get dateYesterday => 'Вчера'; + + @override + String get dateThisMonth => 'Този месец'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Неуспешно изтриване на $countString елемента', + one: 'Неуспешно изтриване на 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Неуспешно копиране на $countString елемента', + one: 'Неуспешно копиране на 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Неуспешно преместване на $countString елемента', + one: 'Неуспешно преместване на 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Неуспешно преименуване на $countString елемента', + one: 'Неуспешно преименуване на 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Неуспешно редактиране на $countString елемента', + one: 'Неуспешно редактиране на 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Неуспешно експортиране на $countString страници', + one: 'Неуспешно експортиране на 1 страница', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Копира $countString елемента', + one: 'Копира 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Преместени$countString елемента', + one: 'Преместен 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Преименувани $countString елемента', + one: 'Преименуван 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Редактирани$countString елемента', + one: 'Редактиран 1 елемент', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Няма любими'; + + @override + String get collectionEmptyVideos => 'Няма видеа'; + + @override + String get collectionEmptyImages => 'Няма изображения'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Упълномощете достъп'; + + @override + String get collectionSelectSectionTooltip => 'Изберете раздел'; + + @override + String get collectionDeselectSectionTooltip => 'Премахнете избрания раздел'; + + @override + String get drawerAboutButton => 'За нас'; + + @override + String get drawerSettingsButton => 'Настройки'; + + @override + String get drawerCollectionAll => 'Цялата колекция'; + + @override + String get drawerCollectionFavourites => 'Любими'; + + @override + String get drawerCollectionImages => 'Изображения'; + + @override + String get drawerCollectionVideos => 'Видео'; + + @override + String get drawerCollectionAnimated => 'Анимиран'; + + @override + String get drawerCollectionMotionPhotos => 'Снимки с движения'; + + @override + String get drawerCollectionPanoramas => 'Панорами'; + + @override + String get drawerCollectionRaws => 'RAW'; + + @override + String get drawerCollectionSphericalVideos => '360° видео'; + + @override + String get drawerAlbumPage => 'Албуми'; + + @override + String get drawerCountryPage => 'Държави'; + + @override + String get drawerPlacePage => 'Места'; + + @override + String get drawerTagPage => 'Тагове'; + + @override + String get sortByDate => 'По дати'; + + @override + String get sortByName => 'По имена'; + + @override + String get sortByItemCount => 'По брой елементи'; + + @override + String get sortBySize => 'По размер'; + + @override + String get sortByAlbumFileName => 'По име на албум и елемент'; + + @override + String get sortByRating => 'По рейтинг'; + + @override + String get sortByDuration => 'По продължителност'; + + @override + String get sortByPath => 'Според пътя'; + + @override + String get sortOrderNewestFirst => 'Първо най-новите'; + + @override + String get sortOrderOldestFirst => 'Първо най-старите'; + + @override + String get sortOrderAtoZ => 'От А до Я'; + + @override + String get sortOrderZtoA => 'От Я до А'; + + @override + String get sortOrderHighestFirst => 'Първо най-високите'; + + @override + String get sortOrderLowestFirst => 'Първо най-ниските'; + + @override + String get sortOrderLargestFirst => 'Първо най-големите'; + + @override + String get sortOrderSmallestFirst => 'Първо най-малките'; + + @override + String get sortOrderShortestFirst => 'Първо най-кратките'; + + @override + String get sortOrderLongestFirst => 'Първо най-дългите'; + + @override + String get albumGroupTier => 'По нива'; + + @override + String get albumGroupType => 'По тип'; + + @override + String get albumGroupVolume => 'По обем на съхранение'; + + @override + String get albumMimeTypeMixed => 'Разни'; + + @override + String get albumPickPageTitleCopy => 'Копирай в албум'; + + @override + String get albumPickPageTitleExport => 'Експортирай в албум'; + + @override + String get albumPickPageTitleMove => 'Премести в албум'; + + @override + String get albumPickPageTitlePick => 'Избери албум'; + + @override + String get albumCamera => 'Камера'; + + @override + String get albumDownload => 'Изтеглени'; + + @override + String get albumScreenshots => 'Екранни снимки'; + + @override + String get albumScreenRecordings => 'Екранни записи'; + + @override + String get albumVideoCaptures => 'Видеозаписи'; + + @override + String get albumPageTitle => 'Албуми'; + + @override + String get albumEmpty => 'Няма албуми'; + + @override + String get createAlbumButtonLabel => 'СЪЗДАЙ'; + + @override + String get newFilterBanner => 'Нов'; + + @override + String get countryPageTitle => 'Държави'; + + @override + String get countryEmpty => 'Няма държави'; + + @override + String get statePageTitle => 'Региони'; + + @override + String get stateEmpty => 'Няма региони'; + + @override + String get placePageTitle => 'Места'; + + @override + String get placeEmpty => 'Няма места'; + + @override + String get tagPageTitle => 'Тагове'; + + @override + String get tagEmpty => 'Без тагове'; + + @override + String get tagPickPageTitle => 'Избери Таг'; + + @override + String get binPageTitle => 'Кошче'; + + @override + String get explorerPageTitle => 'Файлов мениджър'; + + @override + String get explorerActionSelectStorageVolume => 'Избери място за съхранение'; + + @override + String get selectStorageVolumeDialogTitle => 'Избери място за съхранение'; + + @override + String get searchCollectionFieldHint => 'Търсене по колекции'; + + @override + String get searchRecentSectionTitle => 'Скорошни'; + + @override + String get searchDateSectionTitle => 'Дата'; + + @override + String get searchFormatSectionTitle => 'Формати'; + + @override + String get searchAlbumsSectionTitle => 'Албуми'; + + @override + String get searchCountriesSectionTitle => 'Държави'; + + @override + String get searchStatesSectionTitle => 'Региони'; + + @override + String get searchPlacesSectionTitle => 'Места'; + + @override + String get searchTagsSectionTitle => 'Тагове'; + + @override + String get searchRatingSectionTitle => 'Рейтинги'; + + @override + String get searchMetadataSectionTitle => 'Метаданни'; + + @override + String get settingsPageTitle => 'Настройки'; + + @override + String get settingsSystemDefault => 'По подразбиране'; + + @override + String get settingsDefault => 'По подразбиране'; + + @override + String get settingsDisabled => 'Изключено'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Питай всеки път'; + + @override + String get settingsModificationWarningDialogMessage => 'Другите настройки ще бъдат модифицирани.'; + + @override + String get settingsSearchFieldLabel => 'Търсене настройки'; + + @override + String get settingsSearchEmpty => 'Не са открити настройки'; + + @override + String get settingsActionExport => 'Експортиране'; + + @override + String get settingsActionExportDialogTitle => 'Експорт'; + + @override + String get settingsActionImport => 'Внасяне'; + + @override + String get settingsActionImportDialogTitle => 'Внасяне'; + + @override + String get appExportCovers => 'Тапети'; + + @override + String get appExportDynamicAlbums => 'Динамични албуми'; + + @override + String get appExportFavourites => 'Любими'; + + @override + String get appExportSettings => 'Настройки'; + + @override + String get settingsNavigationSectionTitle => 'Навигация'; + + @override + String get settingsHomeTile => 'Начален екран'; + + @override + String get settingsHomeDialogTitle => 'Начален екран'; + + @override + String get setHomeCustom => 'Персонализиран'; + + @override + String get settingsKeepScreenOnTile => 'Запази екрана включен'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Запази екрана включен'; + + @override + String get settingsDoubleBackExit => 'Два пъти „назад“ за изход'; + + @override + String get settingsConfirmationTile => 'Диалог за потвърждение'; + + @override + String get settingsConfirmationDialogTitle => 'Диалогови прозорци за потвърждение'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Попитай преди изтриване завинаги'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Попитай преди преместване в кошчето'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Попитай, преди преместване на елементи без дата'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Показване на съобщение след преместване на елементи в кошчето'; + + @override + String get settingsConfirmationVaultDataLoss => 'Показване на предупреждение за загуба на данни от трезора'; + + @override + String get settingsNavigationDrawerTile => 'Навигационно меню'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Навигационно меню'; + + @override + String get settingsNavigationDrawerBanner => 'Докоснете и задръжте, за да преместите и пренаредите елементи от менюто.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Типове'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Албуми'; + + @override + String get settingsNavigationDrawerTabPages => 'Страници'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Добави албум'; + + @override + String get settingsNavigationBottomActionsTile => 'Долна навигация'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Долна навигация'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Докоснете и задръжте, за да местите бутони и да избирате кои действия да се показват в долната навигационна лента.'; + + @override + String get settingsThumbnailSectionTitle => 'Миниатюри'; + + @override + String get settingsThumbnailOverlayTile => 'Повече информация'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Повече информация'; + + @override + String get settingsThumbnailShowHdrIcon => 'Показване на HDR икона'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Показване на любима икона'; + + @override + String get settingsThumbnailShowTagIcon => 'Показване на иконата за таг'; + + @override + String get settingsThumbnailShowLocationIcon => 'Показване на иконата за местоположение'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Показване на иконата на снимка с движение'; + + @override + String get settingsThumbnailShowRating => 'Покажи рейтинг'; + + @override + String get settingsThumbnailShowRawIcon => 'Показване на необработена икона'; + + @override + String get settingsThumbnailShowVideoDuration => 'Показване на продължителността на видеоклипа'; + + @override + String get settingsCollectionQuickActionsTile => 'Бързи действия'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Бързи действия'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Сърфиране'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Избиране'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Докоснете и задръжте, за да преместите бутоните и избор кои действия да се показват при разглеждане на елементи.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Докоснете и задръжте, за да преместите бутоните и да изберете кои действия да се показват при избиране на елементи.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Шаблон серийни снимки'; + + @override + String get settingsCollectionBurstPatternsNone => 'Няма'; + + @override + String get settingsViewerSectionTitle => 'Визуализатор'; + + @override + String get settingsViewerGestureSideTapNext => 'Докоснете краищата на екрана, за да покажете предишен/следващ елемент'; + + @override + String get settingsViewerUseCutout => 'Използвай зоната на изрязване'; + + @override + String get settingsViewerMaximumBrightness => 'Максимална яркост'; + + @override + String get settingsMotionPhotoAutoPlay => 'Автоматично възпроизвеждане на снимки с движение'; + + @override + String get settingsImageBackground => 'Фоново изображения'; + + @override + String get settingsViewerQuickActionsTile => 'Бързи действия'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Бързи действия'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Докоснете и задръжте, за да преместите бутоните и да изберете кои действия да се показват във визуализатора.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Показани бутони'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Налични бутони'; + + @override + String get settingsViewerQuickActionEmpty => 'Без бутони'; + + @override + String get settingsViewerOverlayTile => 'Повече информация'; + + @override + String get settingsViewerOverlayPageTitle => 'Повече информация'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Показване при отваряне'; + + @override + String get settingsViewerShowHistogram => 'Показвай хистограма'; + + @override + String get settingsViewerShowMinimap => 'Показване на миникарта'; + + @override + String get settingsViewerShowZoomLevel => 'Показване на нивото на мащабиране'; + + @override + String get settingsViewerShowInformation => 'Показване на информация'; + + @override + String get settingsViewerShowInformationSubtitle => 'Показване на заглавие, дата, местоположение и др.'; + + @override + String get settingsViewerShowRatingTags => 'Показване на рейтинг и тагове'; + + @override + String get settingsViewerShowShootingDetails => 'Показване на подробности за снимане'; + + @override + String get settingsViewerShowDescription => 'Показване описание'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Показване на миниатюри'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur ефект'; + + @override + String get settingsViewerSlideshowTile => 'Слайд-шоу'; + + @override + String get settingsViewerSlideshowPageTitle => 'Слайд-шоу'; + + @override + String get settingsSlideshowRepeat => 'Повтори слайдшоу'; + + @override + String get settingsSlideshowShuffle => 'Разбъркайте'; + + @override + String get settingsSlideshowFillScreen => 'Цял екран'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Анимиран ефект на увеличение'; + + @override + String get settingsSlideshowTransitionTile => 'Преход ефекти'; + + @override + String get settingsSlideshowIntervalTile => 'Интервал'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Възпроизвеждане на видео'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Възпроизвеждане на видео'; + + @override + String get settingsVideoPageTitle => 'Видео настройки'; + + @override + String get settingsVideoSectionTitle => 'Видео'; + + @override + String get settingsVideoShowVideos => 'Покажи видеа'; + + @override + String get settingsVideoPlaybackTile => 'Възпроизвеждане'; + + @override + String get settingsVideoPlaybackPageTitle => 'Възпроизвеждане'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Хардуерно ускорение'; + + @override + String get settingsVideoAutoPlay => 'Автоматично възпроизвеждане'; + + @override + String get settingsVideoLoopModeTile => 'Цикличен режим'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Цикличен режим'; + + @override + String get settingsVideoResumptionModeTile => 'Възобновяване на възпроизвеждането'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Възобновяване на възпроизвеждането'; + + @override + String get settingsVideoBackgroundMode => 'Фонов режим'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Фонов режим'; + + @override + String get settingsVideoControlsTile => 'Настройки видео'; + + @override + String get settingsVideoControlsPageTitle => 'Настройки видео'; + + @override + String get settingsVideoButtonsTile => 'Бутони'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Докоснете два пъти за възпроизвеждане/пауза'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Докоснете два пъти краищата на екрана, за превъртане назад/напред'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Плъзнете нагоре или надолу, за да регулирате яркостта/силата на звука'; + + @override + String get settingsSubtitleThemeTile => 'Субтитри'; + + @override + String get settingsSubtitleThemePageTitle => 'Субтитри'; + + @override + String get settingsSubtitleThemeSample => 'Това е примерен текст.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Подравняване на текст'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Подравняване на текст'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Позиция на текст'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Позиция на текст'; + + @override + String get settingsSubtitleThemeTextSize => 'Размер на текст'; + + @override + String get settingsSubtitleThemeShowOutline => 'Покажете контур и сянка'; + + @override + String get settingsSubtitleThemeTextColor => 'Цвят на текст'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Непрозрачност на текста'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Цвят на фона'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Непрозрачност на фона'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Подравняване отляво'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Подравняване по центъра'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Подравняване от дясно'; + + @override + String get settingsPrivacySectionTitle => 'Поверителност'; + + @override + String get settingsAllowInstalledAppAccess => 'Разрешете достъп до библиотеките на приложението'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Използва се за подобряване на показването на албума'; + + @override + String get settingsAllowErrorReporting => 'Разрешаване на анонимно докладване на грешки'; + + @override + String get settingsSaveSearchHistory => 'Запазване на историята на търсенето'; + + @override + String get settingsEnableBin => 'Използвайте кошчето'; + + @override + String get settingsEnableBinSubtitle => 'Съхранявайте изтритите елементи за 30 дни'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Елементите в кошчето ще бъдат изтрити завинаги.'; + + @override + String get settingsAllowMediaManagement => 'Разрешаване на управление на медиите'; + + @override + String get settingsHiddenItemsTile => 'Скрити елементи'; + + @override + String get settingsHiddenItemsPageTitle => 'Скрити елементи'; + + @override + String get settingsHiddenFiltersBanner => 'Снимките и видеоклиповете, съответстващи на скрити филтри, няма да се показват във вашата колекция.'; + + @override + String get settingsHiddenFiltersEmpty => 'Няма скрити филтри'; + + @override + String get settingsStorageAccessTile => 'Достъп до хранилището'; + + @override + String get settingsStorageAccessPageTitle => 'Достъп до хранилището'; + + @override + String get settingsStorageAccessBanner => 'Някои директории изискват изрично разрешение за достъп за модифициране на файлове в тях. Тук можете да прегледате директории, до които преди това сте дали достъп.'; + + @override + String get settingsStorageAccessEmpty => 'Няма права за достъп'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Отмени'; + + @override + String get settingsAccessibilitySectionTitle => 'Достъпност'; + + @override + String get settingsRemoveAnimationsTile => 'Премахване анимация'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Премахване анимации'; + + @override + String get settingsTimeToTakeActionTile => 'Време на изпълнение на действието'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Показване на алтернативи за жестове с мултитъч'; + + @override + String get settingsDisplaySectionTitle => 'Изглед'; + + @override + String get settingsThemeBrightnessTile => 'Тема'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Тема'; + + @override + String get settingsThemeColorHighlights => 'Цветни акценти'; + + @override + String get settingsThemeEnableDynamicColor => 'Динамични цветове'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Честота на обновление на дисплея'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Честота на опресняване'; + + @override + String get settingsDisplayUseTvInterface => 'Интерфейс Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Език и формати'; + + @override + String get settingsLanguageTile => 'Език'; + + @override + String get settingsLanguagePageTitle => 'Език'; + + @override + String get settingsCoordinateFormatTile => 'Формат на координати'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Формат на координати'; + + @override + String get settingsUnitSystemTile => 'Единици за измерване'; + + @override + String get settingsUnitSystemDialogTitle => 'Единици за измерване'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Принудителни арабски цифри'; + + @override + String get settingsScreenSaverPageTitle => 'Скрийнсейвър'; + + @override + String get settingsWidgetPageTitle => 'Фоторамка'; + + @override + String get settingsWidgetShowOutline => 'Контур'; + + @override + String get settingsWidgetOpenPage => 'При докосване на джаджата'; + + @override + String get settingsWidgetDisplayedItem => 'Показан артикул'; + + @override + String get settingsCollectionTile => 'Колекция'; + + @override + String get statsPageTitle => 'Статистика'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString елемента с местоположение', + one: '1 елемент с местоположение', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Топ страни'; + + @override + String get statsTopStatesSectionTitle => 'Топ региони'; + + @override + String get statsTopPlacesSectionTitle => 'Топ локации'; + + @override + String get statsTopTagsSectionTitle => 'Топ тагове'; + + @override + String get statsTopAlbumsSectionTitle => 'Топ албуми'; + + @override + String get viewerOpenPanoramaButtonLabel => 'ОТВОРИ ПАНОРАМА'; + + @override + String get viewerSetWallpaperButtonLabel => 'ЗАДАЙ КАТО ТАПЕТ'; + + @override + String get viewerErrorUnknown => 'Опс!'; + + @override + String get viewerErrorDoesNotExist => 'Файлът не съществува.'; + + @override + String get viewerInfoPageTitle => 'Информация'; + + @override + String get viewerInfoBackToViewerTooltip => 'Обратно към визуализатор'; + + @override + String get viewerInfoUnknown => 'Неизвестен'; + + @override + String get viewerInfoLabelDescription => 'Описание'; + + @override + String get viewerInfoLabelTitle => 'Заглавие'; + + @override + String get viewerInfoLabelDate => 'Дата'; + + @override + String get viewerInfoLabelResolution => 'Резолюция'; + + @override + String get viewerInfoLabelSize => 'Размер'; + + @override + String get viewerInfoLabelUri => 'Идентификатор'; + + @override + String get viewerInfoLabelPath => 'Път'; + + @override + String get viewerInfoLabelDuration => 'Продължителност'; + + @override + String get viewerInfoLabelOwner => 'Собственик'; + + @override + String get viewerInfoLabelCoordinates => 'Координати'; + + @override + String get viewerInfoLabelAddress => 'Адрес'; + + @override + String get mapStyleDialogTitle => 'Стиль карта'; + + @override + String get mapStyleDialogAddStyle => 'Добавяне на стил'; + + @override + String get mapStyleTooltip => 'Избирате стил на карта'; + + @override + String get mapStyleEditorDialogName => 'Име'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Поддомейни'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Увеличете мащаба'; + + @override + String get mapZoomOutTooltip => 'Намаляване'; + + @override + String get mapPointNorthUpTooltip => 'Север нагоре'; + + @override + String get mapAttributionOsmData => 'Данни карта © [OpenStreetMap](https://www.openstreetmap.org/copyright) участници'; + + @override + String get mapAttributionOsmLiberty => 'Предварително генерирани плочки от [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • • Хоствано от [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Плочки от [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Плочки от[HOT](https://www.hotosm.org/) • Хоствано от [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Плочки от [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Преглед на страницата с карта'; + + @override + String get mapEmptyRegion => 'Няма изображения в този регион'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Неуспешно извличане на вградени данни'; + + @override + String get viewerInfoOpenLinkText => 'Отвори'; + + @override + String get viewerInfoViewXmlLinkText => 'Преглед на XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Търсене на метаданни'; + + @override + String get viewerInfoSearchEmpty => 'Няма съответстващи ключове'; + + @override + String get viewerInfoSearchSuggestionDate => 'Дата и час'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Описание'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Размери'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Резолюция'; + + @override + String get viewerInfoSearchSuggestionRights => 'Права'; + + @override + String get wallpaperUseScrollEffect => 'Използвайте ефекта на превъртане на началния екран'; + + @override + String get tagEditorPageTitle => 'Променете тагове'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Нов таг'; + + @override + String get tagEditorPageAddTagTooltip => 'Добави таг'; + + @override + String get tagEditorSectionRecent => 'Скорошни'; + + @override + String get tagEditorSectionPlaceholders => 'Заместители'; + + @override + String get tagEditorDiscardDialogMessage => 'Искате ли да отхвърлите промените?'; + + @override + String get tagPlaceholderCountry => 'Държава'; + + @override + String get tagPlaceholderState => 'Регион'; + + @override + String get tagPlaceholderPlace => 'Локация'; + + @override + String get panoramaEnableSensorControl => 'Активирайте сензорния контрол'; + + @override + String get panoramaDisableSensorControl => 'Изключете сензорния контрол'; + + @override + String get sourceViewerPageTitle => 'Источник'; +} diff --git a/lib/l10ngen/app_localizations_bn.dart b/lib/l10ngen/app_localizations_bn.dart new file mode 100644 index 0000000..e8baaaf --- /dev/null +++ b/lib/l10ngen/app_localizations_bn.dart @@ -0,0 +1,2424 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Bengali Bangla (`bn`). +class AppLocalizationsBn extends AppLocalizations { + AppLocalizationsBn([String locale = 'bn']) : super(locale); + + @override + String get appName => 'আভেস'; + + @override + String get welcomeMessage => 'আভেস-এ স্বাগতম'; + + @override + String get welcomeOptional => 'বাধ্যতামূলক নয়'; + + @override + String get welcomeTermsToggle => 'আমি সর্তাবলিগুলোতে একমত'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items', + one: '$countString item', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString columns', + one: '$countString column', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString seconds', + one: '$countString second', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutes', + one: '$countString minute', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString days', + one: '$countString day', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'প্রয়োগ করুন'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'ডিলিট'; + + @override + String get nextButtonLabel => 'পরবর্তী'; + + @override + String get showButtonLabel => 'দেখান'; + + @override + String get hideButtonLabel => 'লুকান'; + + @override + String get continueButtonLabel => 'এগিয়ে যান'; + + @override + String get saveCopyButtonLabel => 'কপি সংরক্ষণ করুন'; + + @override + String get applyTooltip => 'প্রয়োগ করুন'; + + @override + String get cancelTooltip => 'বাতিল করুন'; + + @override + String get changeTooltip => 'পরিবর্তন করুন'; + + @override + String get clearTooltip => 'মুছে ফেলুন'; + + @override + String get previousTooltip => 'পূর্ববর্তী'; + + @override + String get nextTooltip => 'পরবর্তী'; + + @override + String get showTooltip => 'প্রদর্শন করুন'; + + @override + String get hideTooltip => 'লুকান'; + + @override + String get actionRemove => 'অপসারণ করুন'; + + @override + String get resetTooltip => 'Reset'; + + @override + String get saveTooltip => 'সংরক্ষণ করুন'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'বাছাই করুন'; + + @override + String get doubleBackExitMessage => 'Tap “back” again to exit.'; + + @override + String get doNotAskAgain => 'আবার জিঙ্গাসা করবেন না'; + + @override + String get sourceStateLoading => 'লোড হচ্ছে'; + + @override + String get sourceStateCataloguing => 'তালিকা প্রস্তুত করা হচ্ছে'; + + @override + String get sourceStateLocatingCountries => 'Locating countries'; + + @override + String get sourceStateLocatingPlaces => 'Locating places'; + + @override + String get chipActionDelete => 'Delete'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Show in Collection'; + + @override + String get chipActionGoToAlbumPage => 'Show in Albums'; + + @override + String get chipActionGoToCountryPage => 'Show in Countries'; + + @override + String get chipActionGoToPlacePage => 'Show in Places'; + + @override + String get chipActionGoToTagPage => 'Show in Tags'; + + @override + String get chipActionGoToExplorerPage => 'Show in Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Filter out'; + + @override + String get chipActionFilterIn => 'Filter in'; + + @override + String get chipActionHide => 'Hide'; + + @override + String get chipActionLock => 'Lock'; + + @override + String get chipActionPin => 'Pin to top'; + + @override + String get chipActionUnpin => 'Unpin from top'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Rename'; + + @override + String get chipActionSetCover => 'Set cover'; + + @override + String get chipActionShowCountryStates => 'Show states'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Create album'; + + @override + String get chipActionCreateVault => 'Create vault'; + + @override + String get chipActionConfigureVault => 'Configure vault'; + + @override + String get entryActionCopyToClipboard => 'Copy to clipboard'; + + @override + String get entryActionDelete => 'Delete'; + + @override + String get entryActionConvert => 'Convert'; + + @override + String get entryActionExport => 'Export'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Rename'; + + @override + String get entryActionRestore => 'Restore'; + + @override + String get entryActionRotateCCW => 'Rotate counterclockwise'; + + @override + String get entryActionRotateCW => 'Rotate clockwise'; + + @override + String get entryActionFlip => 'Flip horizontally'; + + @override + String get entryActionPrint => 'Print'; + + @override + String get entryActionShare => 'Share'; + + @override + String get entryActionShareImageOnly => 'Share image only'; + + @override + String get entryActionShareVideoOnly => 'Share video only'; + + @override + String get entryActionViewSource => 'View source'; + + @override + String get entryActionShowGeoTiffOnMap => 'Show as map overlay'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convert to still image'; + + @override + String get entryActionViewMotionPhotoVideo => 'Open video'; + + @override + String get entryActionEdit => 'Edit'; + + @override + String get entryActionOpen => 'Open with'; + + @override + String get entryActionSetAs => 'Set as'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Show in map app'; + + @override + String get entryActionRotateScreen => 'Rotate screen'; + + @override + String get entryActionAddFavourite => 'Add to favorites'; + + @override + String get entryActionRemoveFavourite => 'Remove from favorites'; + + @override + String get videoActionCaptureFrame => 'Capture frame'; + + @override + String get videoActionMute => 'Mute'; + + @override + String get videoActionUnmute => 'Unmute'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Play'; + + @override + String get videoActionReplay10 => 'Seek backward 10 seconds'; + + @override + String get videoActionSkip10 => 'Seek forward 10 seconds'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Select tracks'; + + @override + String get videoActionSetSpeed => 'Playback speed'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Settings'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Resume'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'Edit date & time'; + + @override + String get entryInfoActionEditLocation => 'Edit location'; + + @override + String get entryInfoActionEditTitleDescription => 'Edit title & description'; + + @override + String get entryInfoActionEditRating => 'Edit rating'; + + @override + String get entryInfoActionEditTags => 'Edit tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Remove metadata'; + + @override + String get entryInfoActionExportMetadata => 'Export metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Remove location'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Crop'; + + @override + String get editorTransformRotate => 'Rotate'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landscape'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Recycle bin'; + + @override + String get filterFavouriteLabel => 'Favorite'; + + @override + String get filterNoDateLabel => 'Undated'; + + @override + String get filterNoAddressLabel => 'No address'; + + @override + String get filterLocatedLabel => 'Located'; + + @override + String get filterNoLocationLabel => 'Unlocated'; + + @override + String get filterNoRatingLabel => 'Unrated'; + + @override + String get filterTaggedLabel => 'Tagged'; + + @override + String get filterNoTagLabel => 'Untagged'; + + @override + String get filterNoTitleLabel => 'Untitled'; + + @override + String get filterOnThisDayLabel => 'On this day'; + + @override + String get filterRecentlyAddedLabel => 'Recently added'; + + @override + String get filterRatingRejectedLabel => 'Rejected'; + + @override + String get filterTypeAnimatedLabel => 'Animated'; + + @override + String get filterTypeMotionPhotoLabel => 'Motion Photo'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Image'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'New'; + + @override + String get albumTierPinned => 'Pinned'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Common'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Others'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimal degrees'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Highest rate'; + + @override + String get displayRefreshRatePreferLowest => 'Lowest rate'; + + @override + String get keepScreenOnNever => 'Never'; + + @override + String get keepScreenOnVideoPlayback => 'During video playback'; + + @override + String get keepScreenOnViewerOnly => 'Viewer page only'; + + @override + String get keepScreenOnAlways => 'Always'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Never'; + + @override + String get maxBrightnessAlways => 'Always'; + + @override + String get nameConflictStrategyRename => 'Rename'; + + @override + String get nameConflictStrategyReplace => 'Replace'; + + @override + String get nameConflictStrategySkip => 'Skip'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Top'; + + @override + String get subtitlePositionBottom => 'Bottom'; + + @override + String get themeBrightnessLight => 'Light'; + + @override + String get themeBrightnessDark => 'Dark'; + + @override + String get themeBrightnessBlack => 'Black'; + + @override + String get unitSystemMetric => 'Metric'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Password'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Open with other player'; + + @override + String get videoLoopModeNever => 'Never'; + + @override + String get videoLoopModeShortOnly => 'Short videos only'; + + @override + String get videoLoopModeAlways => 'Always'; + + @override + String get videoPlaybackSkip => 'Skip'; + + @override + String get videoPlaybackMuted => 'Play muted'; + + @override + String get videoPlaybackWithSound => 'Play with sound'; + + @override + String get videoResumptionModeNever => 'Never'; + + @override + String get videoResumptionModeAlways => 'Always'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'None'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'Random'; + + @override + String get widgetDisplayedItemMostRecent => 'Most recent'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internal storage'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Some files have the same name.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'ADD'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Save dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OVER'; + + @override + String get videoResumeButtonLabel => 'RESUME'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Custom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'New Album'; + + @override + String get newAlbumDialogNameLabel => 'Album name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'Storage:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'New name'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'Rename'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insert field'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Preview'; + + @override + String get renameProcessorCounter => 'Counter'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Name'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete this album and the $countString items in it?', + one: 'Delete this album and the item in it?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these albums and the $countString items in them?', + one: 'Delete these albums and the item in them?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Width'; + + @override + String get exportEntryDialogHeight => 'Height'; + + @override + String get exportEntryDialogQuality => 'Quality'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'New name'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'Date & Time'; + + @override + String get editEntryDateDialogSetCustom => 'Set custom date'; + + @override + String get editEntryDateDialogCopyField => 'Copy from other date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'File modified date'; + + @override + String get durationDialogHours => 'Hours'; + + @override + String get durationDialogMinutes => 'Minutes'; + + @override + String get durationDialogSeconds => 'Seconds'; + + @override + String get editEntryLocationDialogTitle => 'Location'; + + @override + String get editEntryLocationDialogSetCustom => 'Set custom location'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Choose on map'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Use this location'; + + @override + String get editEntryRatingDialogTitle => 'Rating'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'More'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'Playback speed'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtitles'; + + @override + String get videoStreamSelectionDialogOff => 'Off'; + + @override + String get videoStreamSelectionDialogTrack => 'Track'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'Done!'; + + @override + String get genericFailureFeedback => 'Failed'; + + @override + String get genericDangerWarningDialogMessage => 'Are you sure?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'View'; + + @override + String get menuActionSelect => 'Select'; + + @override + String get menuActionSelectAll => 'Select all'; + + @override + String get menuActionSelectNone => 'Select none'; + + @override + String get menuActionMap => 'Map'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'Stats'; + + @override + String get viewDialogSortSectionTitle => 'Sort'; + + @override + String get viewDialogGroupSectionTitle => 'Sections'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'Grid'; + + @override + String get tileLayoutList => 'List'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Color'; + + @override + String get appPickDialogTitle => 'Pick App'; + + @override + String get appPickDialogNone => 'None'; + + @override + String get aboutPageTitle => 'About'; + + @override + String get aboutLinkLicense => 'License'; + + @override + String get aboutLinkPolicy => 'Privacy Policy'; + + @override + String get aboutBugSectionTitle => 'Bug Report'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copy system information'; + + @override + String get aboutBugCopyInfoButton => 'Copy'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'Report'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Credits'; + + @override + String get aboutCreditsWorldAtlas1 => 'This app uses a TopoJSON file from'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'Translators'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenses'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Show All Licenses'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'Pick'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'Edit'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Unknown'; + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'About'; + + @override + String get drawerSettingsButton => 'Settings'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Countries'; + + @override + String get drawerPlacePage => 'Places'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'By date'; + + @override + String get sortByName => 'By name'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'By size'; + + @override + String get sortByAlbumFileName => 'By album & item title'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A to Z'; + + @override + String get sortOrderZtoA => 'Z to A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumMimeTypeMixed => 'Mixed'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'Camera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'CREATE'; + + @override + String get newFilterBanner => 'new'; + + @override + String get countryPageTitle => 'Countries'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'States'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Places'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Date'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Countries'; + + @override + String get searchStatesSectionTitle => 'States'; + + @override + String get searchPlacesSectionTitle => 'Places'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Ratings'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Settings'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'Disabled'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'Settings'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Home'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_ca.dart b/lib/l10ngen/app_localizations_ca.dart new file mode 100644 index 0000000..9e39d47 --- /dev/null +++ b/lib/l10ngen/app_localizations_ca.dart @@ -0,0 +1,2373 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Catalan Valencian (`ca`). +class AppLocalizationsCa extends AppLocalizations { + AppLocalizationsCa([String locale = 'ca']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Benvingut a Aves'; + + @override + String get welcomeOptional => 'Opcional'; + + @override + String get welcomeTermsToggle => 'Estic d’acord amb els termes i condicions'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elements', + one: '$count element', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count columnes', + one: '$count columna', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString segons', + one: '$countString segon', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minuts', + one: '$countString minut', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString dies', + one: '$countString dia', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APLICAR'; + + @override + String get createButtonLabel => 'CREAR'; + + @override + String get deleteButtonLabel => 'SUPRIMEIX'; + + @override + String get nextButtonLabel => 'SEGÜENT'; + + @override + String get showButtonLabel => 'MOSTRAR'; + + @override + String get hideButtonLabel => 'AMAGAR'; + + @override + String get continueButtonLabel => 'CONTINUAR'; + + @override + String get saveCopyButtonLabel => 'GUARDAR CÒPIA'; + + @override + String get applyTooltip => 'Aplicar'; + + @override + String get cancelTooltip => 'Canceŀlar'; + + @override + String get changeTooltip => 'Canviar'; + + @override + String get clearTooltip => 'Netejar'; + + @override + String get previousTooltip => 'Anterior'; + + @override + String get nextTooltip => 'Següent'; + + @override + String get showTooltip => 'Mostrar'; + + @override + String get hideTooltip => 'Amagar'; + + @override + String get actionRemove => 'Eliminar'; + + @override + String get resetTooltip => 'Restableix'; + + @override + String get saveTooltip => 'Desa'; + + @override + String get stopTooltip => 'Parar'; + + @override + String get pickTooltip => 'Escollir'; + + @override + String get doubleBackExitMessage => 'Torneu a tocar «enrere» per sortir.'; + + @override + String get doNotAskAgain => 'No tornis a preguntar'; + + @override + String get sourceStateLoading => 'Carregant'; + + @override + String get sourceStateCataloguing => 'Catalogant'; + + @override + String get sourceStateLocatingCountries => 'Localitzant països'; + + @override + String get sourceStateLocatingPlaces => 'Localitzant llocs'; + + @override + String get chipActionDelete => 'Suprimeix'; + + @override + String get chipActionRemove => 'Eliminar'; + + @override + String get chipActionShowCollection => 'Mostrar a Coŀlecció'; + + @override + String get chipActionGoToAlbumPage => 'Mostra als Àlbums'; + + @override + String get chipActionGoToCountryPage => 'Mostra als Països'; + + @override + String get chipActionGoToPlacePage => 'Mostra als Llocs'; + + @override + String get chipActionGoToTagPage => 'Mostra a les etiquetes'; + + @override + String get chipActionGoToExplorerPage => 'Mostrar a l’Explorador'; + + @override + String get chipActionDecompose => 'Dividir'; + + @override + String get chipActionFilterOut => 'Filtrar'; + + @override + String get chipActionFilterIn => 'Filtrar'; + + @override + String get chipActionHide => 'Amagar'; + + @override + String get chipActionLock => 'Bloquejar'; + + @override + String get chipActionPin => 'Ancora a dalt'; + + @override + String get chipActionUnpin => 'Desancora de dalt'; + + @override + String get chipActionGroup => 'Canviar grup'; + + @override + String get chipActionRename => 'Canviar nom'; + + @override + String get chipActionSetCover => 'Escollir coberta'; + + @override + String get chipActionShowCountryStates => 'Mostrar estats'; + + @override + String get chipActionCreateGroup => 'Crear grup'; + + @override + String get chipActionCreateAlbum => 'Crear àlbum'; + + @override + String get chipActionCreateVault => 'Crear una caixa forta'; + + @override + String get chipActionConfigureVault => 'Configurar caixa forta'; + + @override + String get entryActionCopyToClipboard => 'Copiar al porta-retalls'; + + @override + String get entryActionDelete => 'Esborrar'; + + @override + String get entryActionConvert => 'Convertir'; + + @override + String get entryActionExport => 'Exportar'; + + @override + String get entryActionInfo => 'Informació'; + + @override + String get entryActionRename => 'Canviar nom'; + + @override + String get entryActionRestore => 'Restaurar'; + + @override + String get entryActionRotateCCW => 'Girar en sentit antihorari'; + + @override + String get entryActionRotateCW => 'Girar en sentit horari'; + + @override + String get entryActionFlip => 'Voltar horitzontalment'; + + @override + String get entryActionPrint => 'Imprimir'; + + @override + String get entryActionShare => 'Compartir'; + + @override + String get entryActionShareImageOnly => 'Compartir només imatge'; + + @override + String get entryActionShareVideoOnly => 'Compartir només vídeo'; + + @override + String get entryActionViewSource => 'Veure font'; + + @override + String get entryActionShowGeoTiffOnMap => 'Mostra com a mapa superposat'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convertir a imatge fixa'; + + @override + String get entryActionViewMotionPhotoVideo => 'Obrir vídeo'; + + @override + String get entryActionEdit => 'Editar'; + + @override + String get entryActionOpen => 'Obrir amb'; + + @override + String get entryActionSetAs => 'Definir com'; + + @override + String get entryActionCast => 'Transmetre'; + + @override + String get entryActionOpenMap => 'Mostrar en aplicació de mapes'; + + @override + String get entryActionRotateScreen => 'Girar pantalla'; + + @override + String get entryActionAddFavourite => 'Afegir a preferits'; + + @override + String get entryActionRemoveFavourite => 'Treure de preferits'; + + @override + String get videoActionCaptureFrame => 'Capturar fotograma'; + + @override + String get videoActionMute => 'Silencia'; + + @override + String get videoActionUnmute => 'Activar so'; + + @override + String get videoActionPause => 'Pausa'; + + @override + String get videoActionPlay => 'Reproduir'; + + @override + String get videoActionReplay10 => 'Retrocedeix 10 segons'; + + @override + String get videoActionSkip10 => 'Avança 10 segons'; + + @override + String get videoActionShowPreviousFrame => 'Mostrar el marc anterior'; + + @override + String get videoActionShowNextFrame => 'Mostrar el següent fotograma'; + + @override + String get videoActionSelectStreams => 'Seleccionar pista'; + + @override + String get videoActionSetSpeed => 'Velocitat de reproducció'; + + @override + String get videoActionABRepeat => 'Repetir A-B'; + + @override + String get videoRepeatActionSetStart => 'Establir l’inici'; + + @override + String get videoRepeatActionSetEnd => 'Establir el final'; + + @override + String get viewerActionSettings => 'Configuració'; + + @override + String get viewerActionLock => 'Bloquejar visualitzador'; + + @override + String get viewerActionUnlock => 'Desbloquejar visualitzador'; + + @override + String get slideshowActionResume => 'Reprèn'; + + @override + String get slideshowActionShowInCollection => 'Mostrar a Coŀlecció'; + + @override + String get entryInfoActionEditDate => 'Edita la data i l’hora'; + + @override + String get entryInfoActionEditLocation => 'Editar localització'; + + @override + String get entryInfoActionEditTitleDescription => 'Editar títol i descripció'; + + @override + String get entryInfoActionEditRating => 'Editar valoració'; + + @override + String get entryInfoActionEditTags => 'Editar etiquetes'; + + @override + String get entryInfoActionRemoveMetadata => 'Esborrar metadades'; + + @override + String get entryInfoActionExportMetadata => 'Exportar metadades'; + + @override + String get entryInfoActionRemoveLocation => 'Esborrar localització'; + + @override + String get editorActionTransform => 'Transformar'; + + @override + String get editorTransformCrop => 'Retallar'; + + @override + String get editorTransformRotate => 'Girar'; + + @override + String get cropAspectRatioFree => 'Lliure'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Quadrat'; + + @override + String get filterAspectRatioLandscapeLabel => 'Paisatge'; + + @override + String get filterAspectRatioPortraitLabel => 'Retrat'; + + @override + String get filterBinLabel => 'Paperera de reciclatge'; + + @override + String get filterFavouriteLabel => 'Preferida'; + + @override + String get filterNoDateLabel => 'Sense data'; + + @override + String get filterNoAddressLabel => 'Sense adreça'; + + @override + String get filterLocatedLabel => 'Localitzat'; + + @override + String get filterNoLocationLabel => 'Deslocalitzat'; + + @override + String get filterNoRatingLabel => 'Sense valoració'; + + @override + String get filterTaggedLabel => 'Etiquetat'; + + @override + String get filterNoTagLabel => 'Sense etiqueta'; + + @override + String get filterNoTitleLabel => 'Sense títol'; + + @override + String get filterOnThisDayLabel => 'D’avui'; + + @override + String get filterRecentlyAddedLabel => 'Afegit recentment'; + + @override + String get filterRatingRejectedLabel => 'Rebutjat'; + + @override + String get filterTypeAnimatedLabel => 'Animat'; + + @override + String get filterTypeMotionPhotoLabel => 'Foto en moviment'; + + @override + String get filterTypePanoramaLabel => 'Panoràmica'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Vídeo'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Imatge'; + + @override + String get filterMimeVideoLabel => 'Vídeo'; + + @override + String get accessibilityAnimationsRemove => 'Evitar efectes de pantalla'; + + @override + String get accessibilityAnimationsKeep => 'Mantenir efectes de pantalla'; + + @override + String get albumTierNew => 'Nou'; + + @override + String get albumTierPinned => 'Fixat'; + + @override + String get albumTierGroups => 'Grups'; + + @override + String get albumTierSpecial => 'Comú'; + + @override + String get albumTierApps => 'Aplicacions'; + + @override + String get albumTierVaults => 'Caixes fortes'; + + @override + String get albumTierDynamic => 'Dinàmic'; + + @override + String get albumTierRegular => 'Altres'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Graus decimals'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'O'; + + @override + String get displayRefreshRatePreferHighest => 'Taxa més alta'; + + @override + String get displayRefreshRatePreferLowest => 'Taxa més baixa'; + + @override + String get keepScreenOnNever => 'Mai'; + + @override + String get keepScreenOnVideoPlayback => 'Durant la reproducció de vídeo'; + + @override + String get keepScreenOnViewerOnly => 'Només la pàgina del visualitzador'; + + @override + String get keepScreenOnAlways => 'Sempre'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Híbrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terreny)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Mai'; + + @override + String get maxBrightnessAlways => 'Sempre'; + + @override + String get nameConflictStrategyRename => 'Canviar nom'; + + @override + String get nameConflictStrategyReplace => 'Substituir'; + + @override + String get nameConflictStrategySkip => 'Saltar'; + + @override + String get overlayHistogramNone => 'Cap'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Lluminància'; + + @override + String get subtitlePositionTop => 'A dalt'; + + @override + String get subtitlePositionBottom => 'A baix'; + + @override + String get themeBrightnessLight => 'Llum'; + + @override + String get themeBrightnessDark => 'Fosc'; + + @override + String get themeBrightnessBlack => 'Negre'; + + @override + String get unitSystemMetric => 'Mètric'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Patró'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Contrasenya'; + + @override + String get settingsVideoEnablePip => 'Imatge-en-imatge'; + + @override + String get videoControlsPlayOutside => 'Obrir amb un altre reproductor'; + + @override + String get videoLoopModeNever => 'Mai'; + + @override + String get videoLoopModeShortOnly => 'Només vídeos curts'; + + @override + String get videoLoopModeAlways => 'Sempre'; + + @override + String get videoPlaybackSkip => 'Saltar'; + + @override + String get videoPlaybackMuted => 'Reproduir sense so'; + + @override + String get videoPlaybackWithSound => 'Reproduir amb so'; + + @override + String get videoResumptionModeNever => 'Mai'; + + @override + String get videoResumptionModeAlways => 'Sempre'; + + @override + String get viewerTransitionSlide => 'Lliscar'; + + @override + String get viewerTransitionParallax => 'Paraŀlaxi'; + + @override + String get viewerTransitionFade => 'Esvair'; + + @override + String get viewerTransitionZoomIn => 'Ampliar'; + + @override + String get viewerTransitionNone => 'Cap'; + + @override + String get wallpaperTargetHome => 'Pàgina principal'; + + @override + String get wallpaperTargetLock => 'Pàgina de bloqueig'; + + @override + String get wallpaperTargetHomeLock => 'Pàgina principal i de bloqueig'; + + @override + String get widgetDisplayedItemRandom => 'Aleatori'; + + @override + String get widgetDisplayedItemMostRecent => 'Més recent'; + + @override + String get widgetOpenPageHome => 'Obrir casa'; + + @override + String get widgetOpenPageCollection => 'Obrir coŀlecció'; + + @override + String get widgetOpenPageViewer => 'Obrir visualitzador'; + + @override + String get widgetTapUpdateWidget => 'Actualitzar giny'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Espai intern'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'Targeta SD'; + + @override + String get rootDirectoryDescription => 'Directori arrel'; + + @override + String otherDirectoryDescription(String name) { + return '«$name» directori'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Si us plau, selecciona el $directory a «$volume» a la següent pantalla per donar-li accés a aquesta aplicació.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Aquesta aplicació no té permís per modificar arxius de $directory a «$volume».\n\nSi us plau, feu servir un gestor d’arxius o l’aplicació de galeria preinstaŀlada per moure els elements a un altre directori.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Aquesta operació necessita $neededSize d’espai lliure a «$volume» per completar-se, però només hi ha $freeSize lliure.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Falta el selector de fitxers del sistema o està desactivat. Si us plau, activeu-lo i torneu-ho a provar.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Aquesta operació no és compatible amb elements dels següents formats: $types.', + one: 'Aquesta operació no és compatible amb elements del següent format: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Alguns fitxers de la carpeta de destinació tenen el mateix nom.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Alguns fitxers tenen el mateix nom.'; + + @override + String get addShortcutDialogLabel => 'Etiqueta de la drecera'; + + @override + String get addShortcutButtonLabel => 'AFEGEIX'; + + @override + String get noMatchingAppDialogMessage => 'No hi ha aplicacions que puguin gestionar-ho.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moure aquests $count elements a la paperera de reciclatge?', + one: 'Moure aquest element a la paperera de reciclatge?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Esborrar aquests $count elements?', + one: 'Esborrar aquest element?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Desar les dates dels elements abans de continuar?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Guardar dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Vols continuar reproduint a $time?'; + } + + @override + String get videoStartOverButtonLabel => 'TORNAR A COMENÇAR'; + + @override + String get videoResumeButtonLabel => 'REPRENDRE'; + + @override + String get setCoverDialogLatest => 'Últim element'; + + @override + String get setCoverDialogAuto => 'Automàtic'; + + @override + String get setCoverDialogCustom => 'Personalitzat'; + + @override + String get hideFilterConfirmationDialogMessage => 'Les fotos i els vídeos coincidents s’amagaran de la teva coŀlecció. Podeu tornar-los a mostrar des de la configuració de «Privadesa».\n\nEsteu segur que voleu amagar-los?'; + + @override + String get newAlbumDialogTitle => 'Àlbum nou'; + + @override + String get newAlbumDialogNameLabel => 'Nom de l’Àlbum'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'L’àlbum ja existeix'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'El directori ja existeix'; + + @override + String get newAlbumDialogStorageLabel => 'Emmagatzematge:'; + + @override + String get newDynamicAlbumDialogTitle => 'Nou àlbum dinàmic'; + + @override + String get dynamicAlbumAlreadyExists => 'L’àlbum dinàmic ja existeix'; + + @override + String get newGroupDialogTitle => 'Grup nou'; + + @override + String get newGroupDialogNameLabel => 'Nom del grup'; + + @override + String get groupAlreadyExists => 'El grup ja existeix'; + + @override + String get groupEmpty => 'No hi ha grups'; + + @override + String get ungrouped => 'Desagrupats'; + + @override + String get groupPickerTitle => 'Tria grup'; + + @override + String get groupPickerUseThisGroupButton => 'Fes servir aquest grup'; + + @override + String get newVaultWarningDialogMessage => 'Els elements en caixes fortes només son disponibles des d’aquesta aplicació.\n\nSi desinstaŀles aquesta aplicació o en borres les dades, perdràs aquests elements.'; + + @override + String get newVaultDialogTitle => 'Caixa forta nova'; + + @override + String get configureVaultDialogTitle => 'Configura caixa forta'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Bloqueja quan la pantalla s’apagui'; + + @override + String get vaultDialogLockTypeLabel => 'Tipus de bloqueig'; + + @override + String get patternDialogEnter => 'Introdueix patró'; + + @override + String get patternDialogConfirm => 'Confirma patró'; + + @override + String get pinDialogEnter => 'Introdueix PIN'; + + @override + String get pinDialogConfirm => 'Confirma PIN'; + + @override + String get passwordDialogEnter => 'Introdueix contrasenya'; + + @override + String get passwordDialogConfirm => 'Confirma contrasenya'; + + @override + String get authenticateToConfigureVault => 'Autentifica la configuració de la caixa forta'; + + @override + String get authenticateToUnlockVault => 'Autentifica per desbloquejar caixa forta'; + + @override + String get vaultBinUsageDialogMessage => 'Algunes caixes fortes fan servir la paperera de reciclatge.'; + + @override + String get renameAlbumDialogLabel => 'Nom nou'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'El directori ja existeix'; + + @override + String get renameEntrySetPageTitle => 'Canviar nom'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Patró de nomenament'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insereix camp'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Previsualitza'; + + @override + String get renameProcessorCounter => 'Comptador'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Nom'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Eliminar aquest àlbum i els $count elements que conté?', + one: 'Eliminar aquest àlbum i l’element que conté?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Eliminar aquests àlbums i els $count elements que contenen?', + one: 'Eliminar aquest àlbum i l’element que conté?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Amplada'; + + @override + String get exportEntryDialogHeight => 'Alçada'; + + @override + String get exportEntryDialogQuality => 'Qualitat'; + + @override + String get exportEntryDialogWriteMetadata => 'Escriu metadades'; + + @override + String get renameEntryDialogLabel => 'Nom nou'; + + @override + String get editEntryDialogCopyFromItem => 'Copiar d’un altre element'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Camps a modificar'; + + @override + String get editEntryDateDialogTitle => 'Data i Hora'; + + @override + String get editEntryDateDialogSetCustom => 'Defineix data personalitzada'; + + @override + String get editEntryDateDialogCopyField => 'Copiar d’una altra data'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extreu del títol'; + + @override + String get editEntryDateDialogShift => 'Desplaça'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Data del fitxer modificat'; + + @override + String get durationDialogHours => 'Hores'; + + @override + String get durationDialogMinutes => 'Minuts'; + + @override + String get durationDialogSeconds => 'Segons'; + + @override + String get editEntryLocationDialogTitle => 'Localització'; + + @override + String get editEntryLocationDialogSetCustom => 'Defineix localització personalitzada'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Escull al mapa'; + + @override + String get editEntryLocationDialogImportGpx => 'Importar GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitud'; + + @override + String get editEntryLocationDialogLongitude => 'Longitud'; + + @override + String get editEntryLocationDialogTimeShift => 'Desplaçament de l’hora'; + + @override + String get locationPickerUseThisLocationButton => 'Utilitza aquesta localització'; + + @override + String get editEntryRatingDialogTitle => 'Valoració'; + + @override + String get removeEntryMetadataDialogTitle => 'Esborra metadades'; + + @override + String get removeEntryMetadataDialogAll => 'Tot'; + + @override + String get removeEntryMetadataDialogMore => 'Més'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'Es necessita XMP per reproduir el vídeo dins una foto en moviment.\n\nEstàs segur que ho vols esborrar?'; + + @override + String get videoSpeedDialogLabel => 'Velocitat de reproducció'; + + @override + String get videoStreamSelectionDialogVideo => 'Vídeo'; + + @override + String get videoStreamSelectionDialogAudio => 'Àudio'; + + @override + String get videoStreamSelectionDialogText => 'Subtítols'; + + @override + String get videoStreamSelectionDialogOff => 'Desactivat'; + + @override + String get videoStreamSelectionDialogTrack => 'Pista'; + + @override + String get videoStreamSelectionDialogNoSelection => 'No hi ha altres pistes.'; + + @override + String get genericSuccessFeedback => 'Fet!'; + + @override + String get genericFailureFeedback => 'Fallit'; + + @override + String get genericDangerWarningDialogMessage => 'Estàs segur?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Torna-ho a provar amb menys elements.'; + + @override + String get menuActionConfigureView => 'Vista'; + + @override + String get menuActionSelect => 'Selecciona'; + + @override + String get menuActionSelectAll => 'Selecciona tots'; + + @override + String get menuActionSelectNone => 'Selecciona’n cap'; + + @override + String get menuActionMap => 'Mapa'; + + @override + String get menuActionSlideshow => 'Presentació de diapositives'; + + @override + String get menuActionStats => 'Estadístiques'; + + @override + String get viewDialogSortSectionTitle => 'Ordena'; + + @override + String get viewDialogGroupSectionTitle => 'Agrupa'; + + @override + String get viewDialogLayoutSectionTitle => 'Disposició'; + + @override + String get viewDialogReverseSortOrder => 'Inverteix l’ordre'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'Quadrícula'; + + @override + String get tileLayoutList => 'Llista'; + + @override + String get castDialogTitle => 'Dispositius d’emissió'; + + @override + String get coverDialogTabCover => 'Coberta'; + + @override + String get coverDialogTabApp => 'Aplicació'; + + @override + String get coverDialogTabColor => 'Color'; + + @override + String get appPickDialogTitle => 'Tria l’aplicació'; + + @override + String get appPickDialogNone => 'Cap'; + + @override + String get aboutPageTitle => 'Sobre'; + + @override + String get aboutLinkLicense => 'Llicència'; + + @override + String get aboutLinkPolicy => 'Política de Privacitat'; + + @override + String get aboutBugSectionTitle => 'Informe d’error'; + + @override + String get aboutBugSaveLogInstruction => 'Desa els registres de l’aplicació en un fitxer'; + + @override + String get aboutBugCopyInfoInstruction => 'Copia la informació del sistema'; + + @override + String get aboutBugCopyInfoButton => 'Copia'; + + @override + String get aboutBugReportInstruction => 'Reporta a GitHub amb els logs i la informació del sistema'; + + @override + String get aboutBugReportButton => 'Informe'; + + @override + String get aboutDataUsageSectionTitle => 'Ús de dades'; + + @override + String get aboutDataUsageData => 'Dades'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Base de dades'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Intern'; + + @override + String get aboutDataUsageExternal => 'Extern'; + + @override + String get aboutDataUsageClearCache => 'Netejar Cache'; + + @override + String get aboutCreditsSectionTitle => 'Crèdits'; + + @override + String get aboutCreditsWorldAtlas1 => 'Aquesta aplicació utilitza el format de fitxers TopoJSON'; + + @override + String get aboutCreditsWorldAtlas2 => 'sota llicència ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'Traductors'; + + @override + String get aboutLicensesSectionTitle => 'Llicències de codi obert'; + + @override + String get aboutLicensesBanner => 'Aquesta aplicació utilitza els següents paquets i biblioteques de codi obert.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Llibreries Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Plugins de Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Paquets de Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Paquets de Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Mostra Totes les Llicències'; + + @override + String get policyPageTitle => 'Política de Privacitat'; + + @override + String get collectionPageTitle => 'Coŀlecció'; + + @override + String get collectionPickPageTitle => 'Escollir'; + + @override + String get collectionSelectPageTitle => 'Escollir elements'; + + @override + String get collectionActionShowTitleSearch => 'Mostra filtres de títol'; + + @override + String get collectionActionHideTitleSearch => 'Amaga filtres de títol'; + + @override + String get collectionActionAddDynamicAlbum => 'Afegir un àlbum dinàmic'; + + @override + String get collectionActionAddShortcut => 'Afegeix drecera'; + + @override + String get collectionActionSetHome => 'Defineix com inici'; + + @override + String get collectionActionEmptyBin => 'Buidar paperera'; + + @override + String get collectionActionCopy => 'Copiar a àlbum'; + + @override + String get collectionActionMove => 'Moure a àlbum'; + + @override + String get collectionActionRescan => 'Tornar a buscar'; + + @override + String get collectionActionEdit => 'Editar'; + + @override + String get collectionSearchTitlesHintText => 'Buscar títols'; + + @override + String get collectionGroupAlbum => 'Per àlbum'; + + @override + String get collectionGroupMonth => 'Per mes'; + + @override + String get collectionGroupDay => 'Per dia'; + + @override + String get sectionNone => 'Sense seccions'; + + @override + String get sectionUnknown => 'Desconegut'; + + @override + String get dateToday => 'Avui'; + + @override + String get dateYesterday => 'Ahir'; + + @override + String get dateThisMonth => 'Aquest mes'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Error en esborrar $count elements', + one: 'Error en esborrar 1 element', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Error en copiar $count elements', + one: 'Error en copiar 1 element', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Error en moure $count elements', + one: 'Error en moure 1 element', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Error en canviar el nom a $count elements', + one: 'Error en canviar el nom a 1 element', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Error en editar $count elements', + one: 'Error en editar 1 element', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Error en exportar $count pàgines', + one: 'Error en exportar una pàgina', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elements copiats', + one: 'Un element copiat', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elements moguts', + one: 'Un element mogut', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nom canviat a $count elements', + one: 'Nom canviat a 1 element', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elements editats', + one: 'Un element editat', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Sense preferits'; + + @override + String get collectionEmptyVideos => 'Sense vídeos'; + + @override + String get collectionEmptyImages => 'Sense imatges'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Donar accés'; + + @override + String get collectionSelectSectionTooltip => 'Seleccionar secció'; + + @override + String get collectionDeselectSectionTooltip => 'Desseleccionar secció'; + + @override + String get drawerAboutButton => 'Sobre'; + + @override + String get drawerSettingsButton => 'Configuració'; + + @override + String get drawerCollectionAll => 'Tota la coŀlecció'; + + @override + String get drawerCollectionFavourites => 'Preferits'; + + @override + String get drawerCollectionImages => 'Imatges'; + + @override + String get drawerCollectionVideos => 'Vídeos'; + + @override + String get drawerCollectionAnimated => 'Animacions'; + + @override + String get drawerCollectionMotionPhotos => 'Fotos en moviment'; + + @override + String get drawerCollectionPanoramas => 'Panoràmiques'; + + @override + String get drawerCollectionRaws => 'Fotos Raw'; + + @override + String get drawerCollectionSphericalVideos => 'Vídeos 360º'; + + @override + String get drawerAlbumPage => 'Àlbums'; + + @override + String get drawerCountryPage => 'Països'; + + @override + String get drawerPlacePage => 'Llocs'; + + @override + String get drawerTagPage => 'Etiquetes'; + + @override + String get sortByDate => 'Per data'; + + @override + String get sortByName => 'Per nom'; + + @override + String get sortByItemCount => 'Per nombre d’elements'; + + @override + String get sortBySize => 'Per mida'; + + @override + String get sortByAlbumFileName => 'Per àlbum i nom d’arxiu'; + + @override + String get sortByRating => 'Per valoració'; + + @override + String get sortByDuration => 'Per durada'; + + @override + String get sortByPath => 'Per ruta'; + + @override + String get sortOrderNewestFirst => 'Primer el més nou'; + + @override + String get sortOrderOldestFirst => 'Primer el més antic'; + + @override + String get sortOrderAtoZ => 'De A a Z'; + + @override + String get sortOrderZtoA => 'De Z a A'; + + @override + String get sortOrderHighestFirst => 'Primer el més alt'; + + @override + String get sortOrderLowestFirst => 'Primer el més baix'; + + @override + String get sortOrderLargestFirst => 'Primer el més gran'; + + @override + String get sortOrderSmallestFirst => 'Primer el més petit'; + + @override + String get sortOrderShortestFirst => 'El més curt primer'; + + @override + String get sortOrderLongestFirst => 'El més llarg primer'; + + @override + String get albumGroupTier => 'Per nivell'; + + @override + String get albumGroupType => 'Per tipus'; + + @override + String get albumGroupVolume => 'Per volum d’emmagatzematge'; + + @override + String get albumMimeTypeMixed => 'Barrejat'; + + @override + String get albumPickPageTitleCopy => 'Copiar a Àlbum'; + + @override + String get albumPickPageTitleExport => 'Exportar a Àlbum'; + + @override + String get albumPickPageTitleMove => 'Moure a Àlbum'; + + @override + String get albumPickPageTitlePick => 'Escollir Àlbum'; + + @override + String get albumCamera => 'Càmera'; + + @override + String get albumDownload => 'Baixades'; + + @override + String get albumScreenshots => 'Captures de pantalla'; + + @override + String get albumScreenRecordings => 'Gravacions de pantalla'; + + @override + String get albumVideoCaptures => 'Captures de Vídeo'; + + @override + String get albumPageTitle => 'Àlbums'; + + @override + String get albumEmpty => 'Sense àlbums'; + + @override + String get createAlbumButtonLabel => 'CREAR'; + + @override + String get newFilterBanner => 'nou'; + + @override + String get countryPageTitle => 'Països'; + + @override + String get countryEmpty => 'Sense països'; + + @override + String get statePageTitle => 'Estats'; + + @override + String get stateEmpty => 'Sense estats'; + + @override + String get placePageTitle => 'Llocs'; + + @override + String get placeEmpty => 'Sense llocs'; + + @override + String get tagPageTitle => 'Etiquetes'; + + @override + String get tagEmpty => 'Sense etiquetes'; + + @override + String get tagPickPageTitle => 'Tria etiqueta'; + + @override + String get binPageTitle => 'Paperera de Reciclatge'; + + @override + String get explorerPageTitle => 'Explorador'; + + @override + String get explorerActionSelectStorageVolume => 'Seleccionar emmagatzematge'; + + @override + String get selectStorageVolumeDialogTitle => 'Seleccionar Emmagatzematge'; + + @override + String get searchCollectionFieldHint => 'Buscar a coŀlecció'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Data'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Àlbums'; + + @override + String get searchCountriesSectionTitle => 'Països'; + + @override + String get searchStatesSectionTitle => 'Estats'; + + @override + String get searchPlacesSectionTitle => 'Llocs'; + + @override + String get searchTagsSectionTitle => 'Etiquetes'; + + @override + String get searchRatingSectionTitle => 'Valoracions'; + + @override + String get searchMetadataSectionTitle => 'Metadades'; + + @override + String get settingsPageTitle => 'Configuració'; + + @override + String get settingsSystemDefault => 'Per defecte al sistema'; + + @override + String get settingsDefault => 'Per defecte'; + + @override + String get settingsDisabled => 'Desactivat'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Preguntar cada vegada'; + + @override + String get settingsModificationWarningDialogMessage => 'Altres configuracions es modificaran.'; + + @override + String get settingsSearchFieldLabel => 'Busca configuracions'; + + @override + String get settingsSearchEmpty => 'Cap coincidència'; + + @override + String get settingsActionExport => 'Exportar'; + + @override + String get settingsActionExportDialogTitle => 'Exportar'; + + @override + String get settingsActionImport => 'Importar'; + + @override + String get settingsActionImportDialogTitle => 'Importar'; + + @override + String get appExportCovers => 'Cobertes'; + + @override + String get appExportDynamicAlbums => 'Àlbums dinàmics'; + + @override + String get appExportFavourites => 'Preferits'; + + @override + String get appExportSettings => 'Configuracions'; + + @override + String get settingsNavigationSectionTitle => 'Navegació'; + + @override + String get settingsHomeTile => 'Inici'; + + @override + String get settingsHomeDialogTitle => 'Inici'; + + @override + String get setHomeCustom => 'Personalitzat'; + + @override + String get settingsKeepScreenOnTile => 'Mantenir pantalla encesa'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Mantenir la Pantalla Encesa'; + + @override + String get settingsDoubleBackExit => 'Toqueu «enrere» dues vegades per sortir'; + + @override + String get settingsConfirmationTile => 'Diàlegs de confirmació'; + + @override + String get settingsConfirmationDialogTitle => 'Diàlegs de Confirmació'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Pregunta abans d’esborrar elements per sempre'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Pregunta abans de moure elements a la paperera de reciclatge'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Pregunta abans de moure elements sense data'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Mostra missatge després de moure elements a la paperera de reciclatge'; + + @override + String get settingsConfirmationVaultDataLoss => 'Mostra l’avís de pèrdua de dades d’una caixa forta'; + + @override + String get settingsNavigationDrawerTile => 'Menú de navegació'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Menú de Navegació'; + + @override + String get settingsNavigationDrawerBanner => 'Mantén premut per moure i reordenar els elements del menú.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Tipus'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Àlbums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pàgines'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Afegeix àlbum'; + + @override + String get settingsNavigationBottomActionsTile => 'Barra de navegació inferior'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Barra de navegació inferior'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Toca i mantén per moure botons i sel·leccionar quines accions es mostraran a la barra de navegació inferior.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniatures'; + + @override + String get settingsThumbnailOverlayTile => 'Incrustacions'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Incrustacions'; + + @override + String get settingsThumbnailShowHdrIcon => 'Mostra icona de HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Mostra icona de preferits'; + + @override + String get settingsThumbnailShowTagIcon => 'Mostra icona d’etiqueta'; + + @override + String get settingsThumbnailShowLocationIcon => 'Mostra icona de localització'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Mostra icona de foto en moviment'; + + @override + String get settingsThumbnailShowRating => 'Mostra valoració'; + + @override + String get settingsThumbnailShowRawIcon => 'Mostra icona raw'; + + @override + String get settingsThumbnailShowVideoDuration => 'Mostra duració de vídeo'; + + @override + String get settingsCollectionQuickActionsTile => 'Accions ràpides'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Accions Ràpides'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Navegació'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecció'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Manté premut per moure botons i seleccionar quines accions es mostren en els articles de navegació.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Manté premut per moure botons i seleccionar quines accions es mostren en seleccionar elements.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Patrons de ràfega'; + + @override + String get settingsCollectionBurstPatternsNone => 'Cap'; + + @override + String get settingsViewerSectionTitle => 'Visualitzador'; + + @override + String get settingsViewerGestureSideTapNext => 'Toqueu les vores de la pantalla per mostrar l’anterior/el següent element'; + + @override + String get settingsViewerUseCutout => 'Utilitzeu l’àrea de tall'; + + @override + String get settingsViewerMaximumBrightness => 'Brillantor màxima'; + + @override + String get settingsMotionPhotoAutoPlay => 'Reprodueix automàticament fotos en moviment'; + + @override + String get settingsImageBackground => 'Fons d’imatge'; + + @override + String get settingsViewerQuickActionsTile => 'Accions ràpides'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Accions Ràpides'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Manté premut per moure botons i seleccionar quines accions es mostren al visualitzador.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Botons Mostrats'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Botons Disponibles'; + + @override + String get settingsViewerQuickActionEmpty => 'Sense botons'; + + @override + String get settingsViewerOverlayTile => 'Incrustacions'; + + @override + String get settingsViewerOverlayPageTitle => 'Incrustacions'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Mostra a l’obrir'; + + @override + String get settingsViewerShowHistogram => 'Mostra histograma'; + + @override + String get settingsViewerShowMinimap => 'Mostra mapa en miniatura'; + + @override + String get settingsViewerShowZoomLevel => 'Mostra el nivell de zoom'; + + @override + String get settingsViewerShowInformation => 'Mostra informació'; + + @override + String get settingsViewerShowInformationSubtitle => 'Mostra títol, data, localització, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Mostra valoració i etiquetes'; + + @override + String get settingsViewerShowShootingDetails => 'Mostra detalls de la foto'; + + @override + String get settingsViewerShowDescription => 'Mostra descripció'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Mostra miniatures'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Efecte borrós'; + + @override + String get settingsViewerSlideshowTile => 'Presentació de diapositives'; + + @override + String get settingsViewerSlideshowPageTitle => 'Presentació de diapositives'; + + @override + String get settingsSlideshowRepeat => 'Repeteix'; + + @override + String get settingsSlideshowShuffle => 'Barreja'; + + @override + String get settingsSlideshowFillScreen => 'Emplenar pantalla'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Efecte de zoom animat'; + + @override + String get settingsSlideshowTransitionTile => 'Transició'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Reproducció de vídeo'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Reproducció de Vídeo'; + + @override + String get settingsVideoPageTitle => 'Configuració de Vídeo'; + + @override + String get settingsVideoSectionTitle => 'Vídeo'; + + @override + String get settingsVideoShowVideos => 'Mostra vídeos'; + + @override + String get settingsVideoPlaybackTile => 'Reproducció'; + + @override + String get settingsVideoPlaybackPageTitle => 'Reproducció'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Acceleració per maquinari'; + + @override + String get settingsVideoAutoPlay => 'Reproducció automàtica'; + + @override + String get settingsVideoLoopModeTile => 'Mode en bucle'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Mode en Bucle'; + + @override + String get settingsVideoResumptionModeTile => 'Reprèn reproducció'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Reprèn Reproducció'; + + @override + String get settingsVideoBackgroundMode => 'Mode de fons'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Mode de Fons'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Botons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Fes doble toc per reproduir/aturar'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Fes doble toc a la vora de la pantalla per retrocedir/avançar'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Llisca cap amunt o cap avall per ajustar la brillantor/volum'; + + @override + String get settingsSubtitleThemeTile => 'Subtítols'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtítols'; + + @override + String get settingsSubtitleThemeSample => 'Això és un exemple.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Ajustament de text'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Ajustament de Text'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Posició de text'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Posició de Text'; + + @override + String get settingsSubtitleThemeTextSize => 'Mida del text'; + + @override + String get settingsSubtitleThemeShowOutline => 'Mostra el contorn i l’ombra'; + + @override + String get settingsSubtitleThemeTextColor => 'Color del text'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Opacitat del text'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Color de fons'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Opacitat del fons'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Esquerra'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Centre'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Dreta'; + + @override + String get settingsPrivacySectionTitle => 'Privacitat'; + + @override + String get settingsAllowInstalledAppAccess => 'Permet accés a la llista d’aplicacions'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Utilitzat per millorar la visualització dels àlbums'; + + @override + String get settingsAllowErrorReporting => 'Permet enviar errors anònims'; + + @override + String get settingsSaveSearchHistory => 'Guarda historial de cerca'; + + @override + String get settingsEnableBin => 'Utilitzar paperera de reciclatge'; + + @override + String get settingsEnableBinSubtitle => 'Manté elements eliminats durant 30 dies'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Els elements de la paperera de reciclatge seran eliminats per sempre.'; + + @override + String get settingsAllowMediaManagement => 'Permet la gestió dels mitjans'; + + @override + String get settingsHiddenItemsTile => 'Elements amagats'; + + @override + String get settingsHiddenItemsPageTitle => 'Elements Amagats'; + + @override + String get settingsHiddenFiltersBanner => 'Les fotos i els vídeos que coincideixin amb filtres amagats no apareixeran a la teva coŀlecció.'; + + @override + String get settingsHiddenFiltersEmpty => 'Cap filtre amagat'; + + @override + String get settingsStorageAccessTile => 'Accés d’emmagatzematge'; + + @override + String get settingsStorageAccessPageTitle => 'Accés d’Emmagatzematge'; + + @override + String get settingsStorageAccessBanner => 'Alguns directoris requereixen permís explícit per modificar-hi fitxers. Podeu revisar aquí els directoris als quals heu donat accés anteriorment.'; + + @override + String get settingsStorageAccessEmpty => 'Cap permís d’accés'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revocar'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibilitat'; + + @override + String get settingsRemoveAnimationsTile => 'Treure animacions'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Treure Animacions'; + + @override + String get settingsTimeToTakeActionTile => 'Retard per executar una acció'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Mostra alternatives amb gestos multitàctils'; + + @override + String get settingsDisplaySectionTitle => 'Pantalla'; + + @override + String get settingsThemeBrightnessTile => 'Tema'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Tema'; + + @override + String get settingsThemeColorHighlights => 'Colors per ressaltar'; + + @override + String get settingsThemeEnableDynamicColor => 'Color dinàmic'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Taxa de refresc de pantalla'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Taxa de refresc'; + + @override + String get settingsDisplayUseTvInterface => 'Interfície d’Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Llengua i Formats'; + + @override + String get settingsLanguageTile => 'Idioma'; + + @override + String get settingsLanguagePageTitle => 'Idioma'; + + @override + String get settingsCoordinateFormatTile => 'Format de coordenades'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Format de Coordenades'; + + @override + String get settingsUnitSystemTile => 'Unitats'; + + @override + String get settingsUnitSystemDialogTitle => 'Unitats'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Forçar els números aràbics'; + + @override + String get settingsScreenSaverPageTitle => 'Protector de Pantalla'; + + @override + String get settingsWidgetPageTitle => 'Marc de Foto'; + + @override + String get settingsWidgetShowOutline => 'Contorn'; + + @override + String get settingsWidgetOpenPage => 'En tocar un giny'; + + @override + String get settingsWidgetDisplayedItem => 'Element mostrat'; + + @override + String get settingsCollectionTile => 'Coŀlecció'; + + @override + String get statsPageTitle => 'Estadístiques'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elements amb localització', + one: '1 element amb localització', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Països Principals'; + + @override + String get statsTopStatesSectionTitle => 'Estats Principals'; + + @override + String get statsTopPlacesSectionTitle => 'Llocs Principals'; + + @override + String get statsTopTagsSectionTitle => 'Etiquetes Principals'; + + @override + String get statsTopAlbumsSectionTitle => 'Àlbums Principals'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OBRIR PANORÀMICA'; + + @override + String get viewerSetWallpaperButtonLabel => 'DEFINEIX FONS DE PANTALLA'; + + @override + String get viewerErrorUnknown => 'Vaja!'; + + @override + String get viewerErrorDoesNotExist => 'El fitxer ja no existeix.'; + + @override + String get viewerInfoPageTitle => 'Informació'; + + @override + String get viewerInfoBackToViewerTooltip => 'Torna al visualitzador'; + + @override + String get viewerInfoUnknown => 'desconegut'; + + @override + String get viewerInfoLabelDescription => 'Descripció'; + + @override + String get viewerInfoLabelTitle => 'Títol'; + + @override + String get viewerInfoLabelDate => 'Data'; + + @override + String get viewerInfoLabelResolution => 'Resolució'; + + @override + String get viewerInfoLabelSize => 'Mida'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Ruta'; + + @override + String get viewerInfoLabelDuration => 'Duració'; + + @override + String get viewerInfoLabelOwner => 'Propietari'; + + @override + String get viewerInfoLabelCoordinates => 'Coordenades'; + + @override + String get viewerInfoLabelAddress => 'Adreça'; + + @override + String get mapStyleDialogTitle => 'Estil de mapa'; + + @override + String get mapStyleDialogAddStyle => 'Afegeix estil'; + + @override + String get mapStyleTooltip => 'Selecciona tipus de mapa'; + + @override + String get mapStyleEditorDialogName => 'Nom'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdominis'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Ampliar'; + + @override + String get mapZoomOutTooltip => 'Allunyar'; + + @override + String get mapPointNorthUpTooltip => 'Apuntar el nord cap amunt'; + + @override + String get mapAttributionOsmData => 'Dades de mapa © [OpenStreetMap](https://www.openstreetmap.org/copyright) contribuïdors'; + + @override + String get mapAttributionOsmLiberty => 'Tessel·les per [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hostatjat per [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tesel·les per [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Rajoles de [HOT](https://www.hotosm.org/) • Allotjat a [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Rajoles per [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Veure a la pàgina de mapa'; + + @override + String get mapEmptyRegion => 'Sense imatges a aquesta regió'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Error en extreure les dades incrustades'; + + @override + String get viewerInfoOpenLinkText => 'Obrir'; + + @override + String get viewerInfoViewXmlLinkText => 'Veure XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Buscar metadades'; + + @override + String get viewerInfoSearchEmpty => 'Sense claus coincidents'; + + @override + String get viewerInfoSearchSuggestionDate => 'Data i hora'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Descripció'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolució'; + + @override + String get viewerInfoSearchSuggestionRights => 'Drets'; + + @override + String get wallpaperUseScrollEffect => 'Utilitza l’efecte de desplaçament a la pantalla d’inici'; + + @override + String get tagEditorPageTitle => 'Editar Etiquetes'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Nova etiqueta'; + + @override + String get tagEditorPageAddTagTooltip => 'Afegir etiqueta'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Marcadors de posició'; + + @override + String get tagEditorDiscardDialogMessage => 'Vols descartar els canvis?'; + + @override + String get tagPlaceholderCountry => 'País'; + + @override + String get tagPlaceholderState => 'Estat'; + + @override + String get tagPlaceholderPlace => 'Lloc'; + + @override + String get panoramaEnableSensorControl => 'Activa el control del sensor'; + + @override + String get panoramaDisableSensorControl => 'Desactiva el control del sensor'; + + @override + String get sourceViewerPageTitle => 'Font'; +} diff --git a/lib/l10ngen/app_localizations_ckb.dart b/lib/l10ngen/app_localizations_ckb.dart new file mode 100644 index 0000000..9ccb06f --- /dev/null +++ b/lib/l10ngen/app_localizations_ckb.dart @@ -0,0 +1,2413 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Central Kurdish (`ckb`). +class AppLocalizationsCkb extends AppLocalizations { + AppLocalizationsCkb([String locale = 'ckb']) : super(locale); + + @override + String get appName => 'ئاڤیس'; + + @override + String get welcomeMessage => 'بەخێربێی بۆ ئاڤێس'; + + @override + String get welcomeOptional => 'ئارەزومەندانە'; + + @override + String get welcomeTermsToggle => 'ڕازیم بە مەرج و یاساکانی بەکارهێنان'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'دانە $count', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ڕیز $count', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'چرکە $countString', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'خولەک $countString', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ڕۆژ $countString', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length مم'; + } + + @override + String get applyButtonLabel => 'چەسپاندن'; + + @override + String get createButtonLabel => 'دروستکردن'; + + @override + String get deleteButtonLabel => 'سڕینەوە'; + + @override + String get nextButtonLabel => 'دواتر'; + + @override + String get showButtonLabel => 'پیشاندان'; + + @override + String get hideButtonLabel => 'شاردنەوە'; + + @override + String get continueButtonLabel => 'بەردەوامبون'; + + @override + String get saveCopyButtonLabel => 'وێنەکی لێ پاشەکەوت بکە'; + + @override + String get applyTooltip => 'جێبەجێ کردن'; + + @override + String get cancelTooltip => 'پاشگەزبوونەوە'; + + @override + String get changeTooltip => 'گۆڕین'; + + @override + String get clearTooltip => 'لابردن'; + + @override + String get previousTooltip => 'پێشوتر'; + + @override + String get nextTooltip => 'دواتر'; + + @override + String get showTooltip => 'پیشاندان'; + + @override + String get hideTooltip => 'شاردنەوە'; + + @override + String get actionRemove => 'لابردن'; + + @override + String get resetTooltip => 'سفرکردنەوە'; + + @override + String get saveTooltip => 'پاشەکەوتکردن'; + + @override + String get stopTooltip => 'وەستاندن'; + + @override + String get pickTooltip => 'هەڵبژاردن'; + + @override + String get doubleBackExitMessage => 'بۆ دەرچوون، پەنجە لە «گەڕانەوە» بدەوە.'; + + @override + String get doNotAskAgain => 'مەپرسەوە'; + + @override + String get sourceStateLoading => 'باردەکا'; + + @override + String get sourceStateCataloguing => 'پۆلێن کردن'; + + @override + String get sourceStateLocatingCountries => 'دۆزینەوەی ووڵات'; + + @override + String get sourceStateLocatingPlaces => 'دۆزینەوەی شوێن'; + + @override + String get chipActionDelete => 'سڕینەوە'; + + @override + String get chipActionRemove => 'لابردن'; + + @override + String get chipActionShowCollection => 'نیشاندان بە کۆمەڵە'; + + @override + String get chipActionGoToAlbumPage => 'بینین لە ئەلبومدا'; + + @override + String get chipActionGoToCountryPage => 'پیشاندان لە وڵاتەکاندا'; + + @override + String get chipActionGoToPlacePage => 'Show in Places'; + + @override + String get chipActionGoToTagPage => 'پیشاندانی نیشانەکراوەکان'; + + @override + String get chipActionGoToExplorerPage => 'پیشاندان لە دۆزەر'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'کاریگەرییەکان'; + + @override + String get chipActionFilterIn => 'کاریگەرییەکان'; + + @override + String get chipActionHide => 'شاردنەوە'; + + @override + String get chipActionLock => 'قفڵکردن'; + + @override + String get chipActionPin => 'جێگیرکردن لە سەرەوە'; + + @override + String get chipActionUnpin => 'لابردنی جێگیری'; + + @override + String get chipActionGroup => 'گۆڕینی پۆلێن'; + + @override + String get chipActionRename => 'ناوگۆڕین'; + + @override + String get chipActionSetCover => 'وێنەی بەرگ'; + + @override + String get chipActionShowCountryStates => 'پیشاندانی وڵاتەکان'; + + @override + String get chipActionCreateGroup => 'دروستکردنی گرۆ'; + + @override + String get chipActionCreateAlbum => 'دروستکردنی ئەلبوم'; + + @override + String get chipActionCreateVault => 'دروستکردنی تایبەت'; + + @override + String get chipActionConfigureVault => 'ڕێکخستنی قفڵکراو'; + + @override + String get entryActionCopyToClipboard => 'لەبەرگرتنەوە'; + + @override + String get entryActionDelete => 'سڕینەوە'; + + @override + String get entryActionConvert => 'گۆڕینی جۆر'; + + @override + String get entryActionExport => 'هەڵگرتن'; + + @override + String get entryActionInfo => 'زانیاری'; + + @override + String get entryActionRename => 'ناوگۆڕین'; + + @override + String get entryActionRestore => 'گێڕانەوە'; + + @override + String get entryActionRotateCCW => 'سوڕاندن بە پێچەوانەی میلی کاتژمێر'; + + @override + String get entryActionRotateCW => 'سوڕاندن بە ئاڕاستەی میلی کاتژمێر'; + + @override + String get entryActionFlip => 'ئاسۆییانە هەڵیبخەوە'; + + @override + String get entryActionPrint => 'چاپکردن'; + + @override + String get entryActionShare => 'بڵاوکردنەوە'; + + @override + String get entryActionShareImageOnly => 'بە تەنیا وێنە هاوبەش بکە'; + + @override + String get entryActionShareVideoOnly => 'بە تەنیا ڤیدیۆ هاوبەش بکە'; + + @override + String get entryActionViewSource => 'بینینی سەرچاوە'; + + @override + String get entryActionShowGeoTiffOnMap => 'Show as map overlay'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'گۆڕین بۆ وێنەی جێگیر'; + + @override + String get entryActionViewMotionPhotoVideo => 'کردنەوەی ڤیدیۆ'; + + @override + String get entryActionEdit => 'دەستکاریکردن'; + + @override + String get entryActionOpen => 'کردنەوە لەڕێی'; + + @override + String get entryActionSetAs => 'دانان وەک'; + + @override + String get entryActionCast => 'پەخش'; + + @override + String get entryActionOpenMap => 'لە نەرمەواڵەی نەخشە پیشانی بدە'; + + @override + String get entryActionRotateScreen => 'سوڕانەوەی خۆکار'; + + @override + String get entryActionAddFavourite => 'زیادکردن بۆ دڵخواز'; + + @override + String get entryActionRemoveFavourite => 'لابردن لە دڵخواز'; + + @override + String get videoActionCaptureFrame => 'Capture frame'; + + @override + String get videoActionMute => 'بێدەنگکردن'; + + @override + String get videoActionUnmute => 'کاراکردنی دەنگ'; + + @override + String get videoActionPause => 'ڕاگرتن'; + + @override + String get videoActionPlay => 'لێدان'; + + @override + String get videoActionReplay10 => '١٠ چرکە بیبە پاش'; + + @override + String get videoActionSkip10 => '١٠ چرکە بیبە پێش'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Select tracks'; + + @override + String get videoActionSetSpeed => 'خێرایی لێدان'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'دانانی دەستپێکردن'; + + @override + String get videoRepeatActionSetEnd => 'دانانی کۆتایی'; + + @override + String get viewerActionSettings => 'ڕێکخستنەکان'; + + @override + String get viewerActionLock => 'کڵۆمدانی پێشاندەر'; + + @override + String get viewerActionUnlock => 'کردنەوەی پێشاندەر'; + + @override + String get slideshowActionResume => 'بەردەوامبوونەوە'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'دەستکاری کردنی کات و ڕێکەوت'; + + @override + String get entryInfoActionEditLocation => 'دەستکاری کردنی شوێن'; + + @override + String get entryInfoActionEditTitleDescription => 'دەستکاری کردنی سەرناو و پێناس'; + + @override + String get entryInfoActionEditRating => 'دەستکاری کردنی هەڵسەنگاندن'; + + @override + String get entryInfoActionEditTags => 'Edit tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Remove metadata'; + + @override + String get entryInfoActionExportMetadata => 'Export metadata'; + + @override + String get entryInfoActionRemoveLocation => 'سڕینەوەی شوێن'; + + @override + String get editorActionTransform => 'گواستنەوە'; + + @override + String get editorTransformCrop => 'بڕین'; + + @override + String get editorTransformRotate => 'سوڕاندن'; + + @override + String get cropAspectRatioFree => 'ئازادانە'; + + @override + String get cropAspectRatioOriginal => 'ڕەسەن'; + + @override + String get cropAspectRatioSquare => 'چوارگۆشە'; + + @override + String get filterAspectRatioLandscapeLabel => 'لاکێشە'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'گلێشدان'; + + @override + String get filterFavouriteLabel => 'دڵخواز'; + + @override + String get filterNoDateLabel => 'بەڕۆژ کراوەتەوە'; + + @override + String get filterNoAddressLabel => 'بێ ناونیشان'; + + @override + String get filterLocatedLabel => 'Located'; + + @override + String get filterNoLocationLabel => 'Unlocated'; + + @override + String get filterNoRatingLabel => 'هەڵنەسەنگێنراو'; + + @override + String get filterTaggedLabel => 'Tagged'; + + @override + String get filterNoTagLabel => 'Untagged'; + + @override + String get filterNoTitleLabel => 'بێ سەرناو'; + + @override + String get filterOnThisDayLabel => 'لەم ڕۆژەدا'; + + @override + String get filterRecentlyAddedLabel => 'بەم دواییە زیاد کراو'; + + @override + String get filterRatingRejectedLabel => 'ڕەتکراوە'; + + @override + String get filterTypeAnimatedLabel => 'Animated'; + + @override + String get filterTypeMotionPhotoLabel => 'وێنەی جوڵاو'; + + @override + String get filterTypePanoramaLabel => 'پانۆراما'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => 'ڤیدیۆی سێ ڕەهەندی'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'وێنە'; + + @override + String get filterMimeVideoLabel => 'ڤیدیۆ'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'نوێ'; + + @override + String get albumTierPinned => 'Pinned'; + + @override + String get albumTierGroups => 'گرۆکان'; + + @override + String get albumTierSpecial => 'باو'; + + @override + String get albumTierApps => 'نەرمەواڵەکان'; + + @override + String get albumTierVaults => 'گاسنووق'; + + @override + String get albumTierDynamic => 'بزۆک'; + + @override + String get albumTierRegular => 'هی دیکە'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'ژمارەی دەیی'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'باکوور'; + + @override + String get coordinateDmsSouth => 'باشوور'; + + @override + String get coordinateDmsEast => 'ڕۆژهەڵات'; + + @override + String get coordinateDmsWest => 'ڕۆژاوا'; + + @override + String get displayRefreshRatePreferHighest => 'بڵندترین ڕادە'; + + @override + String get displayRefreshRatePreferLowest => 'نزمترین ڕادە'; + + @override + String get keepScreenOnNever => 'هەرگیز'; + + @override + String get keepScreenOnVideoPlayback => 'لەکاتی لێدانی ڤیدیۆ'; + + @override + String get keepScreenOnViewerOnly => 'تەنیا پەڕەی بینین'; + + @override + String get keepScreenOnAlways => 'بەردەوام'; + + @override + String get lengthUnitPixel => 'وێنەخاڵ'; + + @override + String get lengthUnitPercent => '٪'; + + @override + String get mapStyleGoogleNormal => 'نەخشەی گۆگڵ'; + + @override + String get mapStyleGoogleHybrid => 'نەخشەی گۆگڵ (چەندڕەگەز)'; + + @override + String get mapStyleGoogleTerrain => 'نەخشەی گۆگڵ (هەرد)'; + + @override + String get mapStyleOsmLiberty => 'نەخشەی ئازادی OSM'; + + @override + String get mapStyleOpenTopoMap => 'نەخشەی کراوەی نەخشەکێشی'; + + @override + String get mapStyleOsmHot => 'نەخشەی مرۆڤدۆستانەی OSM'; + + @override + String get mapStyleStamenWatercolor => 'ستەیمنی وێنەی ئاویی'; + + @override + String get maxBrightnessNever => 'هەرگیز'; + + @override + String get maxBrightnessAlways => 'بەردەوام'; + + @override + String get nameConflictStrategyRename => 'ناونانەوە'; + + @override + String get nameConflictStrategyReplace => 'جێگرتنەوە'; + + @override + String get nameConflictStrategySkip => 'بازدان'; + + @override + String get overlayHistogramNone => 'هیچیان'; + + @override + String get overlayHistogramRGB => 'س.ک.ش'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'سەرەوە'; + + @override + String get subtitlePositionBottom => 'خوارەوە'; + + @override + String get themeBrightnessLight => 'ڕوون'; + + @override + String get themeBrightnessDark => 'تاریک'; + + @override + String get themeBrightnessBlack => 'ڕەش'; + + @override + String get unitSystemMetric => 'مەتری'; + + @override + String get unitSystemImperial => 'شاهانەیی'; + + @override + String get vaultLockTypePattern => 'داڕێژە'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'تێپەڕەوشە'; + + @override + String get settingsVideoEnablePip => 'وێنە لە وێنە'; + + @override + String get videoControlsPlayOutside => 'کردنەوە بە لێدەرێکی تر'; + + @override + String get videoLoopModeNever => 'هەرگیز'; + + @override + String get videoLoopModeShortOnly => 'تەنیا ڤیدیۆ کورتەکان'; + + @override + String get videoLoopModeAlways => 'بەردەوام'; + + @override + String get videoPlaybackSkip => 'بازدان'; + + @override + String get videoPlaybackMuted => 'بەبێ دەنگی لێبدە'; + + @override + String get videoPlaybackWithSound => 'بە دەنگەوە لێبدە'; + + @override + String get videoResumptionModeNever => 'هەرگیز'; + + @override + String get videoResumptionModeAlways => 'بەردەوام'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'هیچیان'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'هەڕەمەکی'; + + @override + String get widgetDisplayedItemMostRecent => 'نوێترین'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'بیرگەی ناوەکی'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'هەندێک لە پەڕگەکان هەمان ناویان هەیە.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'زیادکردن'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'ڕێکەوتەکە پاشەکەوت بکە'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'لە سەرەتاوە'; + + @override + String get videoResumeButtonLabel => 'RESUME'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'خۆکارانە'; + + @override + String get setCoverDialogCustom => 'Custom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'ئەلبومی نوێ'; + + @override + String get newAlbumDialogNameLabel => 'ناوی ئەلبوم'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'ئەم ئەلبومە هەیە'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'بیرگە:'; + + @override + String get newDynamicAlbumDialogTitle => 'ئەلبومێکی بزۆکی نوێ'; + + @override + String get dynamicAlbumAlreadyExists => 'ئەلبومە بزۆکەکە هەیە'; + + @override + String get newGroupDialogTitle => 'گرۆی نوێ'; + + @override + String get newGroupDialogNameLabel => 'ناوی گرۆ'; + + @override + String get groupAlreadyExists => 'گرۆکە هەیە'; + + @override + String get groupEmpty => 'گرۆ نییە'; + + @override + String get ungrouped => 'گرۆ نەکراو'; + + @override + String get groupPickerTitle => 'گرۆیەک هەڵبژێرە'; + + @override + String get groupPickerUseThisGroupButton => 'ئەم گرۆیە بەکاربێنە'; + + @override + String get newVaultWarningDialogMessage => 'شتەکانی ناو ئەم گاسنووقە تەنیا بۆ ئەم کاربەرنامەیە بەردەستە نەک هی تر.\n\nئەگەر ئەم کاربەرنامەیە بسڕیتەوە یان دراوەکانی نەهێڵیت، هەموو شتەکانی ناویشی دەفەوتێن.'; + + @override + String get newVaultDialogTitle => 'گاسنووقێکی نوێ'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'کە مۆبایلەکە داخرا کڵۆمی بدە'; + + @override + String get vaultDialogLockTypeLabel => 'جۆری کڵۆمدان'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'تێپەڕەوشەیەک بنووسە'; + + @override + String get passwordDialogConfirm => 'تێپەڕەوشەکە بنووسەوە'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'هەندێک لە گاسنووقەکان گلێشدان بەکاردەینن.'; + + @override + String get renameAlbumDialogLabel => 'ناوێکی نوێ'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'ناولێنانەوە'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'خانەی تێخستن'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'پێشبینین'; + + @override + String get renameProcessorCounter => 'ژمێرەر'; + + @override + String get renameProcessorHash => 'وردکردن'; + + @override + String get renameProcessorName => 'ناو'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ئەلبومەکە و ئەو $countString شتانەشی لەناویەتی دەسڕێتەوە؟', + one: 'ئەلبومەکە و ئەو شتانەشی لەناویەتی دەسڕێتەوە؟', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ئەلبومەکان و ئەو $countString شتانەشی لەناویەتی دەسڕێتەوە؟', + one: 'ئەلبومەکان و ئەو شتانەشی لەناویەتی دەسڕێتەوە؟', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'پانی'; + + @override + String get exportEntryDialogHeight => 'بڵندی'; + + @override + String get exportEntryDialogQuality => 'جۆرایەتی'; + + @override + String get exportEntryDialogWriteMetadata => 'نووسینی مێتاداتا'; + + @override + String get renameEntryDialogLabel => 'ناوێکی نوێ'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'کات و ڕێکەوت'; + + @override + String get editEntryDateDialogSetCustom => 'ڕێکەوتێکی دیاریکراو دابنێ'; + + @override + String get editEntryDateDialogCopyField => 'لە ڕێکەوتی ترەوە وەریگرە'; + + @override + String get editEntryDateDialogExtractFromTitle => 'لە ناونیشانەکەوە دەریکێشە'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'ڕێکەوتی دەستکاریکراوی پەڕگە'; + + @override + String get durationDialogHours => 'کاژێر'; + + @override + String get durationDialogMinutes => 'خولەک'; + + @override + String get durationDialogSeconds => 'چرکە'; + + @override + String get editEntryLocationDialogTitle => 'شوون'; + + @override + String get editEntryLocationDialogSetCustom => 'شوونێکی تایبەت دابنێ'; + + @override + String get editEntryLocationDialogChooseOnMap => 'لەسەر نەخشە هەڵیبژێرە'; + + @override + String get editEntryLocationDialogImportGpx => 'هاوردنی GPX'; + + @override + String get editEntryLocationDialogLatitude => 'پانەهێڵ'; + + @override + String get editEntryLocationDialogLongitude => 'درێژەهێڵ'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'ئەم شوونە بەکاربێنە'; + + @override + String get editEntryRatingDialogTitle => 'هەڵسەنگاندن'; + + @override + String get removeEntryMetadataDialogTitle => 'لابردنی مێتاداتا'; + + @override + String get removeEntryMetadataDialogAll => 'هەمووی'; + + @override + String get removeEntryMetadataDialogMore => 'زێتر'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'خێرایی لێدان'; + + @override + String get videoStreamSelectionDialogVideo => 'ڤیدیۆ'; + + @override + String get videoStreamSelectionDialogAudio => 'دەنگ'; + + @override + String get videoStreamSelectionDialogText => 'ژێرنووس'; + + @override + String get videoStreamSelectionDialogOff => 'ناکارا'; + + @override + String get videoStreamSelectionDialogTrack => 'Track'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'کرا!'; + + @override + String get genericFailureFeedback => 'نەکرا'; + + @override + String get genericDangerWarningDialogMessage => 'دڵنیایت؟'; + + @override + String get tooManyItemsErrorDialogMessage => 'بە بڕگەی کمترەوە هەوڵدەوە.'; + + @override + String get menuActionConfigureView => 'بینین'; + + @override + String get menuActionSelect => 'دیاریکردن'; + + @override + String get menuActionSelectAll => 'گشتی دیار بکە'; + + @override + String get menuActionSelectNone => 'هیچی دیار مەکە'; + + @override + String get menuActionMap => 'نەخشە'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'ئامارەکان'; + + @override + String get viewDialogSortSectionTitle => 'ڕیز'; + + @override + String get viewDialogGroupSectionTitle => 'بەش'; + + @override + String get viewDialogLayoutSectionTitle => 'کڵێشە'; + + @override + String get viewDialogReverseSortOrder => 'ئاوەژوو کردنەوەی ڕیز'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'خانەخانەیی'; + + @override + String get tileLayoutList => 'پێڕستی'; + + @override + String get castDialogTitle => 'ئامێرەکانی پەخش'; + + @override + String get coverDialogTabCover => 'بەرگ'; + + @override + String get coverDialogTabApp => 'کاربەرنامە'; + + @override + String get coverDialogTabColor => 'ڕەنگ'; + + @override + String get appPickDialogTitle => 'کاربەرنامەیەک هەڵبژێرە'; + + @override + String get appPickDialogNone => 'هیچیان'; + + @override + String get aboutPageTitle => 'دەربارە'; + + @override + String get aboutLinkLicense => 'مۆڵەت'; + + @override + String get aboutLinkPolicy => 'Privacy Policy'; + + @override + String get aboutBugSectionTitle => 'هەواڵدان لە چەوتی'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'لەبەرگرتنەوەی زانیارییەکانی سیستەم'; + + @override + String get aboutBugCopyInfoButton => 'لەبەرگرتنەوە'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'هەواڵدان'; + + @override + String get aboutDataUsageSectionTitle => 'دراوەی بەکارهێنان'; + + @override + String get aboutDataUsageData => 'دراوە'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'بنکەدراوە'; + + @override + String get aboutDataUsageMisc => 'جۆراوجۆر'; + + @override + String get aboutDataUsageInternal => 'ناوەکی'; + + @override + String get aboutDataUsageExternal => 'دەرەکی'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'ڕاپەڕموون'; + + @override + String get aboutCreditsWorldAtlas1 => 'ئەم کاربەرنامەیە پەڕگەی TopoJSON بەکاردەینێت لە'; + + @override + String get aboutCreditsWorldAtlas2 => 'لەبن مۆڵەتی .ISC'; + + @override + String get aboutTranslatorsSectionTitle => 'وەرگێڕەکان'; + + @override + String get aboutLicensesSectionTitle => 'مۆڵەتەکانی سەرچاوە کراوە'; + + @override + String get aboutLicensesBanner => 'ئەم کاربەرنامەیە گورزە و ژێدەرگە سەرچاوە کراوەکانی خوارەوە بەکاردەهێنێت.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'ژێدەرگەکانی ئەندرۆید'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'پێوەکراوەکانی فلەتەر'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'گورزەکانی فلەتەر'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'گورزەکانی دارت'; + + @override + String get aboutLicensesShowAllButtonLabel => 'گشت مۆڵەتەکان پیشان بدە'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'هەڵبژێرە'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'زیادکردنی ئەلبومی بزۆک'; + + @override + String get collectionActionAddShortcut => 'زیادکردنی قەدبڕ'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'گلێشدان بەتاڵە'; + + @override + String get collectionActionCopy => 'لەبەریبگرەوە بۆ ئەلبوم'; + + @override + String get collectionActionMove => 'بیگوازەوە بۆ ئەلبوم'; + + @override + String get collectionActionRescan => 'پشکنینەوە'; + + @override + String get collectionActionEdit => 'دەستکاری'; + + @override + String get collectionSearchTitlesHintText => 'گەڕان لە ناونیشان'; + + @override + String get collectionGroupAlbum => 'بە ئەلبوم'; + + @override + String get collectionGroupMonth => 'بە مانگ'; + + @override + String get collectionGroupDay => 'بە ڕۆژ'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'نەناسراو'; + + @override + String get dateToday => 'ئەمڕۆ'; + + @override + String get dateYesterday => 'دونێ'; + + @override + String get dateThisMonth => 'ئەم مانگە'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'دڵخوازت نییە'; + + @override + String get collectionEmptyVideos => 'ڤیدیۆی تێدا نییە'; + + @override + String get collectionEmptyImages => 'وێنەی تێدا نییە'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'ڕێدان'; + + @override + String get collectionSelectSectionTooltip => 'بەشێک هەڵبژێرە'; + + @override + String get collectionDeselectSectionTooltip => 'بەشێک لاببە'; + + @override + String get drawerAboutButton => 'دەربارە'; + + @override + String get drawerSettingsButton => 'ڕێکخستنەکان'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'دڵخوازەکان'; + + @override + String get drawerCollectionImages => 'وێنەکان'; + + @override + String get drawerCollectionVideos => 'ڤیدیۆکان'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'وێنە جولاوەکان'; + + @override + String get drawerCollectionPanoramas => 'پانۆراماکان'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => 'ڤیدیۆی ٣٦٠°'; + + @override + String get drawerAlbumPage => 'ئەلبومەکان'; + + @override + String get drawerCountryPage => 'وڵات'; + + @override + String get drawerPlacePage => 'شوێنەکان'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'بە ڕێکەوت'; + + @override + String get sortByName => 'بە ناو'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'بە قەبارە'; + + @override + String get sortByAlbumFileName => 'بە ئەلبوم و ناوی بڕگە'; + + @override + String get sortByRating => 'بە هەڵسەنگاندن'; + + @override + String get sortByDuration => 'بە ماوە'; + + @override + String get sortByPath => 'بە ڕێڕەو'; + + @override + String get sortOrderNewestFirst => 'نوێیەکان لە پێشەوە'; + + @override + String get sortOrderOldestFirst => 'کۆنەکان لە پێشەوە'; + + @override + String get sortOrderAtoZ => 'ئ بۆ ی'; + + @override + String get sortOrderZtoA => 'ی بۆ ئ'; + + @override + String get sortOrderHighestFirst => 'بڵندترین لە پێشەوە'; + + @override + String get sortOrderLowestFirst => 'نەویترین لە یەکەم'; + + @override + String get sortOrderLargestFirst => 'گەورەترین لە یەکەم'; + + @override + String get sortOrderSmallestFirst => 'گچکەترین لە یەکەم'; + + @override + String get sortOrderShortestFirst => 'کورتترین لە یەکەم'; + + @override + String get sortOrderLongestFirst => 'درێژترین لە پێشەوە'; + + @override + String get albumGroupTier => 'بە چین'; + + @override + String get albumGroupType => 'بە جۆر'; + + @override + String get albumGroupVolume => 'بە گوێرەی قەبارەی پاشەکەوتی'; + + @override + String get albumMimeTypeMixed => 'تێکەڵاو'; + + @override + String get albumPickPageTitleCopy => 'بۆ ئەلبوم لەبەریبگرەوە'; + + @override + String get albumPickPageTitleExport => 'بۆ ئەلبومی بنێرە'; + + @override + String get albumPickPageTitleMove => 'گواستنەوە بۆ ئەلبوم'; + + @override + String get albumPickPageTitlePick => 'ئەلبومێک دیاریکە'; + + @override + String get albumCamera => 'کامێرە'; + + @override + String get albumDownload => 'داگرتنەکان'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'تۆمارەکانی ڕوونما'; + + @override + String get albumVideoCaptures => 'گرتە ڤیدیۆییەکان'; + + @override + String get albumPageTitle => 'ئەلبومەکان'; + + @override + String get albumEmpty => 'ئەلبوم نییە'; + + @override + String get createAlbumButtonLabel => 'دروستکردن'; + + @override + String get newFilterBanner => 'نوێ'; + + @override + String get countryPageTitle => 'وڵاتەکان'; + + @override + String get countryEmpty => 'هیچ وڵاتێک نییە'; + + @override + String get statePageTitle => 'هەرێمەکان'; + + @override + String get stateEmpty => 'هەرێمی تێدا نییە'; + + @override + String get placePageTitle => 'شوێنەکان'; + + @override + String get placeEmpty => 'هیچ شوێنێک نییە'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'گلێشدان'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'دوایین'; + + @override + String get searchDateSectionTitle => 'ڕێکەوت'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'ئەلبومەکان'; + + @override + String get searchCountriesSectionTitle => 'وڵات'; + + @override + String get searchStatesSectionTitle => 'هەرێم'; + + @override + String get searchPlacesSectionTitle => 'شوێن'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'هەڵسەنگاندن'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'ڕێکخستنەکان'; + + @override + String get settingsSystemDefault => 'بنەڕەتی سیستەم'; + + @override + String get settingsDefault => 'بنەڕەت'; + + @override + String get settingsDisabled => 'ناکاراکراو'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'هەموو جارێ بپرسە'; + + @override + String get settingsModificationWarningDialogMessage => 'ڕێکخستنەکانی تر دەستکاری دەکرێن.'; + + @override + String get settingsSearchFieldLabel => 'گەڕانی لە ڕێکخستنەکان'; + + @override + String get settingsSearchEmpty => 'هیچ ڕێکخستنێکی هاوشێوە نییە'; + + @override + String get settingsActionExport => 'هەناردن'; + + @override + String get settingsActionExportDialogTitle => 'هەناردن'; + + @override + String get settingsActionImport => 'هاوردن'; + + @override + String get settingsActionImportDialogTitle => 'هاوردن'; + + @override + String get appExportCovers => 'بەرگ'; + + @override + String get appExportDynamicAlbums => 'ئەلبومی بزۆک'; + + @override + String get appExportFavourites => 'دڵخوازەکان'; + + @override + String get appExportSettings => 'ڕێکخستنەکان'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Home'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'دووجار \"گەڕانەوە\" داگرە بۆ دەرچوون'; + + @override + String get settingsConfirmationTile => 'پەنجەرەی پەسەندکردن'; + + @override + String get settingsConfirmationDialogTitle => 'پەنجەرەکانی پەسەندکردن'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'جۆر'; + + @override + String get settingsNavigationDrawerTabAlbums => 'ئەلبوم'; + + @override + String get settingsNavigationDrawerTabPages => 'پەڕە'; + + @override + String get settingsNavigationDrawerAddAlbum => 'زیادکردنی ئەلبوم'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'وێنۆچکەی دڵخوازیی پیشاندە'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'وێنۆچکەی شوون پیشان بدە'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'وێنۆچکەی وێنەی جولاو پیشاندە'; + + @override + String get settingsThumbnailShowRating => 'هەڵسەنگاندن پیشان بدە'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'ماوەی ڤیدیۆ پیشاندە'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'هیچیان'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'ئەوپەڕی ڕوونی'; + + @override + String get settingsMotionPhotoAutoPlay => 'خۆکارانە وێنە جولاوەکان لێبدە'; + + @override + String get settingsImageBackground => 'پاشبنەمای وێنە'; + + @override + String get settingsViewerQuickActionsTile => 'فرمانە خێراکان'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'فرمانە خێراکان'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'دوگمە بەردەستەکان'; + + @override + String get settingsViewerQuickActionEmpty => 'دوگمە دانەندرایە'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'لەگەڵ کردنەوە پیشان بدە'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'نەخشە گچکەکرایەکە پیشان بدە'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'پیشاندانی زانیاری'; + + @override + String get settingsViewerShowInformationSubtitle => 'پیشاندانی سەرناو و ڕێکەوت و شوون و ئی تر.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'پیشاندانی وردەکارییەکانی وێنەگرتن'; + + @override + String get settingsViewerShowDescription => 'پیشاندانی پەسن'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'کاریگەری لێڵی'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'پاتەکردنەوە'; + + @override + String get settingsSlideshowShuffle => 'هەڕەمەکی'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'لێدانی ڤیدیۆ'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'لێدانی ڤیدیۆ'; + + @override + String get settingsVideoPageTitle => 'ڕێکخستنەکانی ڤیدیۆ'; + + @override + String get settingsVideoSectionTitle => 'ڤیدیۆ'; + + @override + String get settingsVideoShowVideos => 'پیشاندانی ڤیدیۆ'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'ژێرنووس'; + + @override + String get settingsSubtitleThemePageTitle => 'ژێرنووس'; + + @override + String get settingsSubtitleThemeSample => 'ئەمە نموونەیە.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'قەبارەی دەق'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'ڕەنگی دەق'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'ڕەنگی پاشبنەما'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'چەپ'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'ناوەڕاست'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'ڕاست'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'پاشەکەوتکردنی مێژووی گەڕان'; + + @override + String get settingsEnableBin => 'گلێشدان بەکاربێنە'; + + @override + String get settingsEnableBinSubtitle => 'بابەتە سڕاوەکان بۆ ٣٠ ڕۆژ بهێڵەوە'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'بابەتەکانی ناو گلێشدان بۆ هەمیشە دەسڕێنەوە.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'زمان'; + + @override + String get settingsLanguagePageTitle => 'زمان'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'یەکە'; + + @override + String get settingsUnitSystemDialogTitle => 'یەکە'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'ئامارەکان'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'سەرتۆپی وڵاتان'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'سەرتۆپی شوێنەکان'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'سەرتۆپی ئەلبومەکان'; + + @override + String get viewerOpenPanoramaButtonLabel => 'کردنەوەی پانۆراما'; + + @override + String get viewerSetWallpaperButtonLabel => 'دانانی وەک پاشبنەما'; + + @override + String get viewerErrorUnknown => 'بەداخەوە!'; + + @override + String get viewerErrorDoesNotExist => 'ئەم پەڕگەیە چیتر بەردەست نییە.'; + + @override + String get viewerInfoPageTitle => 'زانیاری'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'نەناسرای'; + + @override + String get viewerInfoLabelDescription => 'پێناس'; + + @override + String get viewerInfoLabelTitle => 'سەرناو'; + + @override + String get viewerInfoLabelDate => 'ڕێکەوت'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'قەبارە'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'ڕێڕەو'; + + @override + String get viewerInfoLabelDuration => 'ماوە'; + + @override + String get viewerInfoLabelOwner => 'خاوەن'; + + @override + String get viewerInfoLabelCoordinates => 'پۆتان'; + + @override + String get viewerInfoLabelAddress => 'ناونیشان'; + + @override + String get mapStyleDialogTitle => 'شێوازی نەخشە'; + + @override + String get mapStyleDialogAddStyle => 'زیادکردنی شێواز'; + + @override + String get mapStyleTooltip => 'شێوازێکی نەخشە دیاری بکە'; + + @override + String get mapStyleEditorDialogName => 'ناو'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'لە پەڕەی نەخشە بیبینە'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'کردنەوە'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'کات و ڕێکەوت'; + + @override + String get viewerInfoSearchSuggestionDescription => 'پێناس'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'ڕەهەند'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'دوایین'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'وڵات'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'شوێن'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'سەرچاوە'; +} diff --git a/lib/l10ngen/app_localizations_cs.dart b/lib/l10ngen/app_localizations_cs.dart new file mode 100644 index 0000000..06db26a --- /dev/null +++ b/lib/l10ngen/app_localizations_cs.dart @@ -0,0 +1,2387 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Czech (`cs`). +class AppLocalizationsCs extends AppLocalizations { + AppLocalizationsCs([String locale = 'cs']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Vítá tě Aves'; + + @override + String get welcomeOptional => 'Volitelné'; + + @override + String get welcomeTermsToggle => 'Souhlasím s podmínkami použivání'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count položek', + few: '$count položky', + one: '$count položka', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count sloupců', + few: '$count sloupce', + one: '$count sloupec', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString sekund', + few: '$countString sekundy', + one: '$countString sekunda', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minut', + few: '$countString minuty', + one: '$countString minuta', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString dnů', + few: '$countString dny', + one: '$countString den', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'POUŽÍT'; + + @override + String get createButtonLabel => 'VYTVOŘIT'; + + @override + String get deleteButtonLabel => 'SMAZAT'; + + @override + String get nextButtonLabel => 'DALŠÍ'; + + @override + String get showButtonLabel => 'ZOBRAZIT'; + + @override + String get hideButtonLabel => 'SKRÝT'; + + @override + String get continueButtonLabel => 'POKRAČOVAT'; + + @override + String get saveCopyButtonLabel => 'ULOŽIT KOPII'; + + @override + String get applyTooltip => 'Použít'; + + @override + String get cancelTooltip => 'Zrušit'; + + @override + String get changeTooltip => 'Upravit'; + + @override + String get clearTooltip => 'Vyčistit'; + + @override + String get previousTooltip => 'Předchozí'; + + @override + String get nextTooltip => 'Další'; + + @override + String get showTooltip => 'Zobrazit'; + + @override + String get hideTooltip => 'Skrýt'; + + @override + String get actionRemove => 'Odstranit'; + + @override + String get resetTooltip => 'Resetovat'; + + @override + String get saveTooltip => 'Uložit'; + + @override + String get stopTooltip => 'Zastavit'; + + @override + String get pickTooltip => 'Vybrat'; + + @override + String get doubleBackExitMessage => 'Pro ukončení klepněte znovu na „zpět“.'; + + @override + String get doNotAskAgain => 'Znovu nezobrazovat'; + + @override + String get sourceStateLoading => 'Nahrávání'; + + @override + String get sourceStateCataloguing => 'Katalogizace'; + + @override + String get sourceStateLocatingCountries => 'Vyhledání zemí'; + + @override + String get sourceStateLocatingPlaces => 'Vyhledávání míst'; + + @override + String get chipActionDelete => 'Smazat'; + + @override + String get chipActionRemove => 'Odstranit'; + + @override + String get chipActionShowCollection => 'Zobrazit ve sbírce'; + + @override + String get chipActionGoToAlbumPage => 'Zobrazit v albech'; + + @override + String get chipActionGoToCountryPage => 'Zobrazit v zemích'; + + @override + String get chipActionGoToPlacePage => 'Zobrazit v místech'; + + @override + String get chipActionGoToTagPage => 'Zobrazit ve štítcích'; + + @override + String get chipActionGoToExplorerPage => 'Zobrazit v průzkumníku'; + + @override + String get chipActionDecompose => 'Rozdělit'; + + @override + String get chipActionFilterOut => 'Odfiltrovat'; + + @override + String get chipActionFilterIn => 'Filtrovat'; + + @override + String get chipActionHide => 'Skrýt'; + + @override + String get chipActionLock => 'Uzamknout'; + + @override + String get chipActionPin => 'Připnout nahoru'; + + @override + String get chipActionUnpin => 'Odepnout seshora'; + + @override + String get chipActionGroup => 'Změnit seskupení'; + + @override + String get chipActionRename => 'Přejmenovat'; + + @override + String get chipActionSetCover => 'Nastavit přebal'; + + @override + String get chipActionShowCountryStates => 'Zobrazit země'; + + @override + String get chipActionCreateGroup => 'Vytvořit skupinu'; + + @override + String get chipActionCreateAlbum => 'Vytvořit album'; + + @override + String get chipActionCreateVault => 'Vytvořit trezor'; + + @override + String get chipActionConfigureVault => 'Upravit trezor'; + + @override + String get entryActionCopyToClipboard => 'Kopírovat do paměti'; + + @override + String get entryActionDelete => 'Smazat'; + + @override + String get entryActionConvert => 'Konvertovat'; + + @override + String get entryActionExport => 'Exportovat'; + + @override + String get entryActionInfo => 'Informace'; + + @override + String get entryActionRename => 'Přejmenovat'; + + @override + String get entryActionRestore => 'Obnovit'; + + @override + String get entryActionRotateCCW => 'Otočit doleva'; + + @override + String get entryActionRotateCW => 'Otočit doprava'; + + @override + String get entryActionFlip => 'Převrátit vodorovně'; + + @override + String get entryActionPrint => 'Tisknout'; + + @override + String get entryActionShare => 'Sdílet'; + + @override + String get entryActionShareImageOnly => 'Sdílet pouze obrázek'; + + @override + String get entryActionShareVideoOnly => 'Sdílet pouze video'; + + @override + String get entryActionViewSource => 'Zobrazit zdroj'; + + @override + String get entryActionShowGeoTiffOnMap => 'Zobrazit jako překryv mapy'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Konvertovat na statický obrázek'; + + @override + String get entryActionViewMotionPhotoVideo => 'Otevřít video'; + + @override + String get entryActionEdit => 'Upravit'; + + @override + String get entryActionOpen => 'Otevřít s'; + + @override + String get entryActionSetAs => 'Nastavit jako'; + + @override + String get entryActionCast => 'Promítat'; + + @override + String get entryActionOpenMap => 'Zobrazit na mapě'; + + @override + String get entryActionRotateScreen => 'Otočit obrazovku'; + + @override + String get entryActionAddFavourite => 'Přidat do oblíbených'; + + @override + String get entryActionRemoveFavourite => 'Odebrat z oblíbených'; + + @override + String get videoActionCaptureFrame => 'Zachytit rámeček'; + + @override + String get videoActionMute => 'Ztlumit'; + + @override + String get videoActionUnmute => 'Zrušit ztlumení'; + + @override + String get videoActionPause => 'Pozastavit'; + + @override + String get videoActionPlay => 'Spustit'; + + @override + String get videoActionReplay10 => 'Přetočit zpět o 10 sekund'; + + @override + String get videoActionSkip10 => 'Posunout vpřed o 10 sekund'; + + @override + String get videoActionShowPreviousFrame => 'Zobrazit předchozí snímek'; + + @override + String get videoActionShowNextFrame => 'Zobrazit další snímek'; + + @override + String get videoActionSelectStreams => 'Vybrat stopy'; + + @override + String get videoActionSetSpeed => 'Rychlost přehrávání'; + + @override + String get videoActionABRepeat => 'Opakování A-B'; + + @override + String get videoRepeatActionSetStart => 'Nastavit začátek'; + + @override + String get videoRepeatActionSetEnd => 'Nastavit konec'; + + @override + String get viewerActionSettings => 'Nastavení'; + + @override + String get viewerActionLock => 'Uzamknout prohlížení'; + + @override + String get viewerActionUnlock => 'Odemknout prohlížení'; + + @override + String get slideshowActionResume => 'Pokračovat'; + + @override + String get slideshowActionShowInCollection => 'Zobrazit ve sbírce'; + + @override + String get entryInfoActionEditDate => 'Upravit datum a čas'; + + @override + String get entryInfoActionEditLocation => 'Upravit polohu'; + + @override + String get entryInfoActionEditTitleDescription => 'Upravit název a popis'; + + @override + String get entryInfoActionEditRating => 'Upravit hodnocení'; + + @override + String get entryInfoActionEditTags => 'Upravit štítky'; + + @override + String get entryInfoActionRemoveMetadata => 'Odstranit metadata'; + + @override + String get entryInfoActionExportMetadata => 'Exportovat metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Odstranit polohu'; + + @override + String get editorActionTransform => 'Transformovat'; + + @override + String get editorTransformCrop => 'Oříznout'; + + @override + String get editorTransformRotate => 'Otočit'; + + @override + String get cropAspectRatioFree => 'Volný'; + + @override + String get cropAspectRatioOriginal => 'Originál'; + + @override + String get cropAspectRatioSquare => 'Čtverec'; + + @override + String get filterAspectRatioLandscapeLabel => 'Na šířku'; + + @override + String get filterAspectRatioPortraitLabel => 'Na výšku'; + + @override + String get filterBinLabel => 'Koš'; + + @override + String get filterFavouriteLabel => 'Oblíbené'; + + @override + String get filterNoDateLabel => 'Bez data'; + + @override + String get filterNoAddressLabel => 'Bez adresy'; + + @override + String get filterLocatedLabel => 'S polohou'; + + @override + String get filterNoLocationLabel => 'Bez polohy'; + + @override + String get filterNoRatingLabel => 'Nehodnocený'; + + @override + String get filterTaggedLabel => 'Se štítky'; + + @override + String get filterNoTagLabel => 'Bez štítků'; + + @override + String get filterNoTitleLabel => 'Bez názvu'; + + @override + String get filterOnThisDayLabel => 'V tento den'; + + @override + String get filterRecentlyAddedLabel => 'Naposled přidané'; + + @override + String get filterRatingRejectedLabel => 'Zamítnutý'; + + @override + String get filterTypeAnimatedLabel => 'Animovaný'; + + @override + String get filterTypeMotionPhotoLabel => 'Pohyblivá fotografie'; + + @override + String get filterTypePanoramaLabel => 'Panoráma'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Obrázek'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Zakázat vizuální efekty'; + + @override + String get accessibilityAnimationsKeep => 'Povolit vizuální efekty'; + + @override + String get albumTierNew => 'Nové'; + + @override + String get albumTierPinned => 'Připnuté'; + + @override + String get albumTierGroups => 'Skupiny'; + + @override + String get albumTierSpecial => 'Společné'; + + @override + String get albumTierApps => 'Aplikace'; + + @override + String get albumTierVaults => 'Trezory'; + + @override + String get albumTierDynamic => 'Dynamické'; + + @override + String get albumTierRegular => 'Ostatní'; + + @override + String get coordinateFormatDms => 'Stupně, minuty, vteřiny'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Stupně s desetinnými místy'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'S'; + + @override + String get coordinateDmsSouth => 'J'; + + @override + String get coordinateDmsEast => 'V'; + + @override + String get coordinateDmsWest => 'Z'; + + @override + String get displayRefreshRatePreferHighest => 'Nejvyšší'; + + @override + String get displayRefreshRatePreferLowest => 'Nejnižší'; + + @override + String get keepScreenOnNever => 'Nikdy'; + + @override + String get keepScreenOnVideoPlayback => 'Při přehrávání videa'; + + @override + String get keepScreenOnViewerOnly => 'Pouze v zobrazení prohlížeče'; + + @override + String get keepScreenOnAlways => 'Vždy'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Mapy Google'; + + @override + String get mapStyleGoogleHybrid => 'Mapy Google (satelitní)'; + + @override + String get mapStyleGoogleTerrain => 'Mapy Google (terén)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitární OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (vodové barvy)'; + + @override + String get maxBrightnessNever => 'Nikdy'; + + @override + String get maxBrightnessAlways => 'Vždy'; + + @override + String get nameConflictStrategyRename => 'Přejmenovat'; + + @override + String get nameConflictStrategyReplace => 'Nahradit'; + + @override + String get nameConflictStrategySkip => 'Přeskočit'; + + @override + String get overlayHistogramNone => 'Žádný'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Světelnost'; + + @override + String get subtitlePositionTop => 'Nahoře'; + + @override + String get subtitlePositionBottom => 'Dole'; + + @override + String get themeBrightnessLight => 'Světlé'; + + @override + String get themeBrightnessDark => 'Tmavé'; + + @override + String get themeBrightnessBlack => 'Černé'; + + @override + String get unitSystemMetric => 'Metrická soustava'; + + @override + String get unitSystemImperial => 'Imperiální jednotky'; + + @override + String get vaultLockTypePattern => 'Vzor'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Heslo'; + + @override + String get settingsVideoEnablePip => 'Obraz v obraze'; + + @override + String get videoControlsPlayOutside => 'Otevřít jiným přehrávačem'; + + @override + String get videoLoopModeNever => 'Nikdy'; + + @override + String get videoLoopModeShortOnly => 'Pouze krátká videa'; + + @override + String get videoLoopModeAlways => 'Vždy'; + + @override + String get videoPlaybackSkip => 'Přeskočit'; + + @override + String get videoPlaybackMuted => 'Přehrát ztlumené'; + + @override + String get videoPlaybackWithSound => 'Přehrát se zvukem'; + + @override + String get videoResumptionModeNever => 'Nikdy'; + + @override + String get videoResumptionModeAlways => 'Vždy'; + + @override + String get viewerTransitionSlide => 'Posun'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Zeslábnutí'; + + @override + String get viewerTransitionZoomIn => 'Přiblížení'; + + @override + String get viewerTransitionNone => 'Žádný'; + + @override + String get wallpaperTargetHome => 'Domovská obrazovka'; + + @override + String get wallpaperTargetLock => 'Zamykací obrazovka'; + + @override + String get wallpaperTargetHomeLock => 'Domovská i zamykací obrazovka'; + + @override + String get widgetDisplayedItemRandom => 'Náhodně'; + + @override + String get widgetDisplayedItemMostRecent => 'Nejnovější'; + + @override + String get widgetOpenPageHome => 'Otevřít domovskou stránku'; + + @override + String get widgetOpenPageCollection => 'Otevřít sbírku'; + + @override + String get widgetOpenPageViewer => 'Otevřít prohlížeč'; + + @override + String get widgetTapUpdateWidget => 'Aktualizovat widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Interní úložiště'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD karta'; + + @override + String get rootDirectoryDescription => 'kořenový adresář'; + + @override + String otherDirectoryDescription(String name) { + return '„$name“ adresář'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Prosím zvolte adresář $directory v „$volume“ na další obrazovce, abyste k němu povolili aplikaci přístup.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Tato aplikace nemá povolené úpravy souborů v adresáři $directory v „$volume“.\n\nPro přesun položek do jiného adresáře prosím použijte předinstalovaného správce souborů nebo galerii.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Pro dokončení této operace je vyžadováno $neededSize volného místa na „$volume“, ale k dispozici je pouze $freeSize.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Systémový nástroj pro výběr souborů chybí nebo je zakázaný. Prosím povolte jej a zkuste to znovu.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Tato operace není dostupná pro položky těchto typů: $types.', + one: 'Tato operace není dostupná pro položky tohoto typu: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Některé soubory v cílovém umístění mají stejný název.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Některé soubory mají stejný název.'; + + @override + String get addShortcutDialogLabel => 'Název zástupce'; + + @override + String get addShortcutButtonLabel => 'PŘIDAT'; + + @override + String get noMatchingAppDialogMessage => 'Pro tuto operaci není k dispozici žádná aplikace.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Přesunout těchto $count položek do koše?', + few: 'Přesunout tyto $count položky do koše?', + one: 'Přesunout tuto položku do koše?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Smazat těchto $count položek?', + few: 'Smazat tyto $count položky?', + one: 'Smazat tuto položku?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Uložit data položek, než budete pokračovat?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Uložit tada'; + + @override + String videoResumeDialogMessage(String time) { + return 'Chcete obnovit přehrávání v čase $time?'; + } + + @override + String get videoStartOverButtonLabel => 'SPUSTIT ZNOVU'; + + @override + String get videoResumeButtonLabel => 'POKRAČOVAT'; + + @override + String get setCoverDialogLatest => 'Poslední položka'; + + @override + String get setCoverDialogAuto => 'Automaticky'; + + @override + String get setCoverDialogCustom => 'Vlastní'; + + @override + String get hideFilterConfirmationDialogMessage => 'Odpovídající fotografie a videa budou ve vaší sbírce schovány. Můžete je znovu zobrazit v nastavení \"Soukromí\".\n\nOpravdu je chcete skrýt?'; + + @override + String get newAlbumDialogTitle => 'Nové album'; + + @override + String get newAlbumDialogNameLabel => 'Název alba'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album již existuje'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Adresář již existuje'; + + @override + String get newAlbumDialogStorageLabel => 'Úložiště:'; + + @override + String get newDynamicAlbumDialogTitle => 'Nové dynamické album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamické album již existuje'; + + @override + String get newGroupDialogTitle => 'Nová skupina'; + + @override + String get newGroupDialogNameLabel => 'Název skupiny'; + + @override + String get groupAlreadyExists => 'Skupina již existuje'; + + @override + String get groupEmpty => 'Žádné skupiny'; + + @override + String get ungrouped => 'Bez skupiny'; + + @override + String get groupPickerTitle => 'Vybrat skupinu'; + + @override + String get groupPickerUseThisGroupButton => 'Použít tuto skupinu'; + + @override + String get newVaultWarningDialogMessage => 'Položky v trezorech jsou přístupné pouze této aplikaci a žádné jiné.\n\nPokud tuto aplikaci odinstalujete, nebo smažete její data, o všechny tyto položky přijdete.'; + + @override + String get newVaultDialogTitle => 'Nový trezor'; + + @override + String get configureVaultDialogTitle => 'Nastavit trezor'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Uzamknout při vypnutí displeje'; + + @override + String get vaultDialogLockTypeLabel => 'Typ uzamčení'; + + @override + String get patternDialogEnter => 'Zadejte gesto'; + + @override + String get patternDialogConfirm => 'Potvrďte gesto'; + + @override + String get pinDialogEnter => 'Zadejte PIN'; + + @override + String get pinDialogConfirm => 'Potvrďte PIN'; + + @override + String get passwordDialogEnter => 'Zadejte heslo'; + + @override + String get passwordDialogConfirm => 'Potvrďte heslo'; + + @override + String get authenticateToConfigureVault => 'Pro úpravu teroru se ověřte'; + + @override + String get authenticateToUnlockVault => 'Ověřte se pro otevření trezoru'; + + @override + String get vaultBinUsageDialogMessage => 'Některé trezory používají koš.'; + + @override + String get renameAlbumDialogLabel => 'Nový název'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Adresář již existuje'; + + @override + String get renameEntrySetPageTitle => 'Přejmenovat'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Vzor názvu'; + + @override + String get renameEntrySetPageInsertTooltip => 'Vložit pole'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Náhled'; + + @override + String get renameProcessorCounter => 'Počítadlo'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Název'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Smazat toto album a v něm obsažených $count položek?', + few: 'Smazat toto album a v něm obsažené $count položky?', + one: 'Smazat toto album a v něm obsaženou položku?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Smazat tato alba a v nich obsažených $count položek?', + few: 'Smazat tato alba a v nich obsažené $count položky?', + one: 'Smazat tato alba a v nich obsaženou položku?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Formát:'; + + @override + String get exportEntryDialogWidth => 'Šířka'; + + @override + String get exportEntryDialogHeight => 'Výška'; + + @override + String get exportEntryDialogQuality => 'Kvalita'; + + @override + String get exportEntryDialogWriteMetadata => 'Zapsat metadata'; + + @override + String get renameEntryDialogLabel => 'Nový název'; + + @override + String get editEntryDialogCopyFromItem => 'Kopírovat z jiné položky'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Pole k úpravě'; + + @override + String get editEntryDateDialogTitle => 'Datum a čas'; + + @override + String get editEntryDateDialogSetCustom => 'Nastavit vlastní datum'; + + @override + String get editEntryDateDialogCopyField => 'Kopírovat z jiného data'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Odvodit z názvu'; + + @override + String get editEntryDateDialogShift => 'Posun'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Datum úpravy souboru'; + + @override + String get durationDialogHours => 'Hodiny'; + + @override + String get durationDialogMinutes => 'Minuty'; + + @override + String get durationDialogSeconds => 'Sekundy'; + + @override + String get editEntryLocationDialogTitle => 'Poloha'; + + @override + String get editEntryLocationDialogSetCustom => 'Nastavit vlastní polohu'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Vybrat na mapě'; + + @override + String get editEntryLocationDialogImportGpx => 'Importovat GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Zeměpisná šířka'; + + @override + String get editEntryLocationDialogLongitude => 'Zeměpisná délka'; + + @override + String get editEntryLocationDialogTimeShift => 'Časový posun'; + + @override + String get locationPickerUseThisLocationButton => 'Použít tuto polohu'; + + @override + String get editEntryRatingDialogTitle => 'Hodnocení'; + + @override + String get removeEntryMetadataDialogTitle => 'Odstranění metadat'; + + @override + String get removeEntryMetadataDialogAll => 'Vše'; + + @override + String get removeEntryMetadataDialogMore => 'Zobrazit více'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'Pro přehrávání videa v pohyblivé fotografii je vyžadováno XMP.\n\nOpravdu jej chcete odstranit?'; + + @override + String get videoSpeedDialogLabel => 'Rychlost přehrávání'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Titulky'; + + @override + String get videoStreamSelectionDialogOff => 'Vypnuto'; + + @override + String get videoStreamSelectionDialogTrack => 'Stopa'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Nejsou k dispozici žádné další stopy.'; + + @override + String get genericSuccessFeedback => 'Hotovo!'; + + @override + String get genericFailureFeedback => 'Selhání'; + + @override + String get genericDangerWarningDialogMessage => 'Jste si jisti?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Zkuste znovu s několika dalšími položkami.'; + + @override + String get menuActionConfigureView => 'Zobrazení'; + + @override + String get menuActionSelect => 'Výběr'; + + @override + String get menuActionSelectAll => 'Vybrat vše'; + + @override + String get menuActionSelectNone => 'Zrušit výběr'; + + @override + String get menuActionMap => 'Mapa'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'Statistiky'; + + @override + String get viewDialogSortSectionTitle => 'Řazení'; + + @override + String get viewDialogGroupSectionTitle => 'Sekce'; + + @override + String get viewDialogLayoutSectionTitle => 'Rozložení'; + + @override + String get viewDialogReverseSortOrder => 'Obrátit řazení'; + + @override + String get tileLayoutMosaic => 'Mozaika'; + + @override + String get tileLayoutGrid => 'Mřížka'; + + @override + String get tileLayoutList => 'Seznam'; + + @override + String get castDialogTitle => 'Zařízení pro promítání'; + + @override + String get coverDialogTabCover => 'Přebal'; + + @override + String get coverDialogTabApp => 'Aplikace'; + + @override + String get coverDialogTabColor => 'Barva'; + + @override + String get appPickDialogTitle => 'Vybrat aplikaci'; + + @override + String get appPickDialogNone => 'Žádný'; + + @override + String get aboutPageTitle => 'O aplikaci'; + + @override + String get aboutLinkLicense => 'Licence'; + + @override + String get aboutLinkPolicy => 'Zásady ochrany osobních údajů'; + + @override + String get aboutBugSectionTitle => 'Hlášení chyb'; + + @override + String get aboutBugSaveLogInstruction => 'Uložte aplikační logy do souboru'; + + @override + String get aboutBugCopyInfoInstruction => 'Zkopírujte informace o systému'; + + @override + String get aboutBugCopyInfoButton => 'Kopírovat'; + + @override + String get aboutBugReportInstruction => 'Nahlásit na GitHub s logy a informacemi o systému'; + + @override + String get aboutBugReportButton => 'Nahlásit'; + + @override + String get aboutDataUsageSectionTitle => 'Využitý prostor'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Mezipaměť'; + + @override + String get aboutDataUsageDatabase => 'Databáze'; + + @override + String get aboutDataUsageMisc => 'Různé'; + + @override + String get aboutDataUsageInternal => 'Interní'; + + @override + String get aboutDataUsageExternal => 'Externí'; + + @override + String get aboutDataUsageClearCache => 'Vymazat mezipaměť'; + + @override + String get aboutCreditsSectionTitle => 'Zásluhy'; + + @override + String get aboutCreditsWorldAtlas1 => 'Tato aplikace využívá soubor TopoJSON od'; + + @override + String get aboutCreditsWorldAtlas2 => 'pod ISC licencí.'; + + @override + String get aboutTranslatorsSectionTitle => 'Překladatalé'; + + @override + String get aboutLicensesSectionTitle => 'Licence open-source'; + + @override + String get aboutLicensesBanner => 'Tato aplikace využívá tyto open-source baličky a knihovny.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Knihovny Androidu'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Pluginy Flutteru'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Baličky Flutteru'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Balíčky Dartu'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Zobrazit všechny licence'; + + @override + String get policyPageTitle => 'Zásady ochrany osobních údajů'; + + @override + String get collectionPageTitle => 'Sbírky'; + + @override + String get collectionPickPageTitle => 'Výběr'; + + @override + String get collectionSelectPageTitle => 'Vybrat položky'; + + @override + String get collectionActionShowTitleSearch => 'Filtrovat dle názvu'; + + @override + String get collectionActionHideTitleSearch => 'Skrýt filtr dle názvu'; + + @override + String get collectionActionAddDynamicAlbum => 'Přidat dynamické album'; + + @override + String get collectionActionAddShortcut => 'Vytvořit zástupce'; + + @override + String get collectionActionSetHome => 'Nastavit jako domov'; + + @override + String get collectionActionEmptyBin => 'Vysypat koš'; + + @override + String get collectionActionCopy => 'Kopírovat do alba'; + + @override + String get collectionActionMove => 'Přesunout do alba'; + + @override + String get collectionActionRescan => 'Znovu prohledat'; + + @override + String get collectionActionEdit => 'Upravit'; + + @override + String get collectionSearchTitlesHintText => 'Hledat názvy'; + + @override + String get collectionGroupAlbum => 'Podle alba'; + + @override + String get collectionGroupMonth => 'Podle měsíce'; + + @override + String get collectionGroupDay => 'Podle dne'; + + @override + String get sectionNone => 'Žádné sekce'; + + @override + String get sectionUnknown => 'Neznámý'; + + @override + String get dateToday => 'Dnes'; + + @override + String get dateYesterday => 'Včera'; + + @override + String get dateThisMonth => 'Tento měsíc'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Chyba při mazání $count položek', + one: 'Chyba při mazání 1 položky', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Chyba při kopírování $count položek', + one: 'Chyba při kopírování 1 položky', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Chyba při přesouvání $count položek', + one: 'Chyba při přesouvání 1 položky', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Chyba přejmenování $count položek', + one: 'Chyba přejmenování 1 položky', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Chyba při úpravě $count položek', + one: 'Chyba při úpravě 1 položky', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Chyba při exportu $count stránek', + one: 'Chyba při exportu 1 stránky', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Zkopírováno $count položek', + few: 'Zkopírovány $count položky', + one: 'Zkopírována 1 položka', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Přesunuto $count položek', + few: 'Přesunuty $count položky', + one: 'Přesunuta 1 položka', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Přejmenováno $count položek', + few: 'Přejmenovány $count položky', + one: 'Přejmenována 1 položka', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Upraveno $count položek', + few: 'Upraveny $count položky', + one: 'Upravena 1 položka', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Žádné oblíbené položky'; + + @override + String get collectionEmptyVideos => 'Žádná videa'; + + @override + String get collectionEmptyImages => 'Žádné obrázky'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Povolit přístup'; + + @override + String get collectionSelectSectionTooltip => 'Vybrat sekci'; + + @override + String get collectionDeselectSectionTooltip => 'Zrušit výběr sekce'; + + @override + String get drawerAboutButton => 'O aplikaci'; + + @override + String get drawerSettingsButton => 'Nastavení'; + + @override + String get drawerCollectionAll => 'Celá sbírka'; + + @override + String get drawerCollectionFavourites => 'Oblíbené'; + + @override + String get drawerCollectionImages => 'Obrázky'; + + @override + String get drawerCollectionVideos => 'Videa'; + + @override + String get drawerCollectionAnimated => 'Animované'; + + @override + String get drawerCollectionMotionPhotos => 'Pohyblivé fotografie'; + + @override + String get drawerCollectionPanoramas => 'Panoramata'; + + @override + String get drawerCollectionRaws => 'Fotografie Raw'; + + @override + String get drawerCollectionSphericalVideos => '360° videa'; + + @override + String get drawerAlbumPage => 'Alba'; + + @override + String get drawerCountryPage => 'Země'; + + @override + String get drawerPlacePage => 'Místa'; + + @override + String get drawerTagPage => 'Štítky'; + + @override + String get sortByDate => 'Podle data'; + + @override + String get sortByName => 'Abecedně'; + + @override + String get sortByItemCount => 'Podle počtu položek'; + + @override + String get sortBySize => 'Podle velikosti'; + + @override + String get sortByAlbumFileName => 'Podle alba a názvu souboru'; + + @override + String get sortByRating => 'Podle hodnocení'; + + @override + String get sortByDuration => 'Podle trvání'; + + @override + String get sortByPath => 'Podle umístění'; + + @override + String get sortOrderNewestFirst => 'Od nejnovějšího'; + + @override + String get sortOrderOldestFirst => 'Od nejstaršího'; + + @override + String get sortOrderAtoZ => 'Od A do Z'; + + @override + String get sortOrderZtoA => 'Od Z do A'; + + @override + String get sortOrderHighestFirst => 'Od nejvyššího'; + + @override + String get sortOrderLowestFirst => 'Od nejnižšího'; + + @override + String get sortOrderLargestFirst => 'Od nejširšího'; + + @override + String get sortOrderSmallestFirst => 'Od nejužšího'; + + @override + String get sortOrderShortestFirst => 'Nejkratší první'; + + @override + String get sortOrderLongestFirst => 'Nejdelší první'; + + @override + String get albumGroupTier => 'Podle úrovně'; + + @override + String get albumGroupType => 'Podle typu'; + + @override + String get albumGroupVolume => 'Podle úložiště'; + + @override + String get albumMimeTypeMixed => 'Smíšené'; + + @override + String get albumPickPageTitleCopy => 'Kopírovat do alba'; + + @override + String get albumPickPageTitleExport => 'Exportovat do alba'; + + @override + String get albumPickPageTitleMove => 'Přesunout do alba'; + + @override + String get albumPickPageTitlePick => 'Vybrat album'; + + @override + String get albumCamera => 'Fotoaparát'; + + @override + String get albumDownload => 'Stažené'; + + @override + String get albumScreenshots => 'Snímky obrazovky'; + + @override + String get albumScreenRecordings => 'Nahrávky obrazovky'; + + @override + String get albumVideoCaptures => 'Snímky videa'; + + @override + String get albumPageTitle => 'Alba'; + + @override + String get albumEmpty => 'Žádná alba'; + + @override + String get createAlbumButtonLabel => 'VYTVOŘIT'; + + @override + String get newFilterBanner => 'nový'; + + @override + String get countryPageTitle => 'Země'; + + @override + String get countryEmpty => 'Žádné země'; + + @override + String get statePageTitle => 'Státy'; + + @override + String get stateEmpty => 'Žádné státy'; + + @override + String get placePageTitle => 'Místa'; + + @override + String get placeEmpty => 'Žádná místa'; + + @override + String get tagPageTitle => 'Štítky'; + + @override + String get tagEmpty => 'Žádné štítky'; + + @override + String get tagPickPageTitle => 'Vybrat štítek'; + + @override + String get binPageTitle => 'Koš'; + + @override + String get explorerPageTitle => 'Průzkumník'; + + @override + String get explorerActionSelectStorageVolume => 'Vyberte úložiště'; + + @override + String get selectStorageVolumeDialogTitle => 'Vyberte úložiště'; + + @override + String get searchCollectionFieldHint => 'Prohledat sbírky'; + + @override + String get searchRecentSectionTitle => 'Nedávné'; + + @override + String get searchDateSectionTitle => 'Datum'; + + @override + String get searchFormatSectionTitle => 'Formáty'; + + @override + String get searchAlbumsSectionTitle => 'Alba'; + + @override + String get searchCountriesSectionTitle => 'Země'; + + @override + String get searchStatesSectionTitle => 'Státy'; + + @override + String get searchPlacesSectionTitle => 'Místa'; + + @override + String get searchTagsSectionTitle => 'Štítky'; + + @override + String get searchRatingSectionTitle => 'Hodnocení'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Nastavení'; + + @override + String get settingsSystemDefault => 'Výchozí nastavení systému'; + + @override + String get settingsDefault => 'Výchozí'; + + @override + String get settingsDisabled => 'Zakázáno'; + + @override + String get settingsEnabled => 'Povoleno'; + + @override + String get settingsForced => 'Vynuceno'; + + @override + String get settingsAskEverytime => 'Vždy se zeptat'; + + @override + String get settingsModificationWarningDialogMessage => 'Ostatní nastavení budou upravena.'; + + @override + String get settingsSearchFieldLabel => 'Prohledat nastavení'; + + @override + String get settingsSearchEmpty => 'Žádné odpovídající položky'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Přebaly'; + + @override + String get appExportDynamicAlbums => 'Dynamická alba'; + + @override + String get appExportFavourites => 'Oblíbené'; + + @override + String get appExportSettings => 'Nastavení'; + + @override + String get settingsNavigationSectionTitle => 'Navigace'; + + @override + String get settingsHomeTile => 'Domů'; + + @override + String get settingsHomeDialogTitle => 'Domů'; + + @override + String get setHomeCustom => 'Vlastní'; + + @override + String get settingsKeepScreenOnTile => 'Ponechat obrazovku zapnutou'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Ponechat obrazovku zapnutou'; + + @override + String get settingsDoubleBackExit => 'Klepnout dvakrát na „zpět“ pro ukončení'; + + @override + String get settingsConfirmationTile => 'Potvrzovací dialogy'; + + @override + String get settingsConfirmationDialogTitle => 'Potvrzovací dialogy'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Zeptat se před smazáním položek navždy'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Zeptat se před přesunem položek do koše'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Zeptat se před přesunem položek bez data'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Zobrazit zprávu po přesunu položek do koše'; + + @override + String get settingsConfirmationVaultDataLoss => 'Zobrazit varování o možnosti ztráty dat trezorů'; + + @override + String get settingsNavigationDrawerTile => 'Navigační menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigační menu'; + + @override + String get settingsNavigationDrawerBanner => 'Stiskněte a podržte pro přesun položek a změnu jejich pořadí.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Typy'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Alba'; + + @override + String get settingsNavigationDrawerTabPages => 'Stránky'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Přidat album'; + + @override + String get settingsNavigationBottomActionsTile => 'Spodní navigace'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Spodní navigace'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Přidržte přesouvací tlačítka a vyberte, které akce budou zobrazeny ve spodním navigačním panelu.'; + + @override + String get settingsThumbnailSectionTitle => 'Náhledy'; + + @override + String get settingsThumbnailOverlayTile => 'Zobrazené detaily'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Zobrazené detaily'; + + @override + String get settingsThumbnailShowHdrIcon => 'Zobrazit ikonu HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Zobrazit ikonu oblíbených'; + + @override + String get settingsThumbnailShowTagIcon => 'Zobrazit ikonu štítků'; + + @override + String get settingsThumbnailShowLocationIcon => 'Zobrazit ikonu polohy'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Zobrazit ikonu pohyblivých fotografií'; + + @override + String get settingsThumbnailShowRating => 'Zobrazit hodnocení'; + + @override + String get settingsThumbnailShowRawIcon => 'Zobrazit ikonu RAW'; + + @override + String get settingsThumbnailShowVideoDuration => 'Zobrazit délku videa'; + + @override + String get settingsCollectionQuickActionsTile => 'Rychlé akce'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Rychlé akce'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Procházení'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Výběr'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Stiskněte a podržte pro přesun tlačítek a vyberte, které akce budou zobrazeny při procházení položek.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Stiskněte a podržte pro přesun tlačítek a vyberte, které akce budou zobrazeny při výběru položek.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Vzory dávek'; + + @override + String get settingsCollectionBurstPatternsNone => 'Žádný'; + + @override + String get settingsViewerSectionTitle => 'Prohlížeč'; + + @override + String get settingsViewerGestureSideTapNext => 'Stisknout v rozích obrazovky pro zobrazení předcházející/následující položky'; + + @override + String get settingsViewerUseCutout => 'Použít oblast výřezu'; + + @override + String get settingsViewerMaximumBrightness => 'Nejvyšší jas'; + + @override + String get settingsMotionPhotoAutoPlay => 'Automatické přehrávání pohyblivých fotografií'; + + @override + String get settingsImageBackground => 'Pozadí obrázku'; + + @override + String get settingsViewerQuickActionsTile => 'Rychlé akce'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Rychlé akce'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Stiskněte a podržte pro přesun tlačítek a vyberte, které akce budou zobrazeny při prohlížení položek.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Zobrazená tlačítka'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Dostupná tlačítka'; + + @override + String get settingsViewerQuickActionEmpty => 'Žádná tlačítka'; + + @override + String get settingsViewerOverlayTile => 'Souhrn'; + + @override + String get settingsViewerOverlayPageTitle => 'Souhrn'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Zobrazit při otevření'; + + @override + String get settingsViewerShowHistogram => 'Zobrazit histogram'; + + @override + String get settingsViewerShowMinimap => 'Zobrazit minimapu'; + + @override + String get settingsViewerShowZoomLevel => 'Zobrazit úroveň přiblížení'; + + @override + String get settingsViewerShowInformation => 'Zobrazit informace'; + + @override + String get settingsViewerShowInformationSubtitle => 'Zobrazit název, datum, polohu apod.'; + + @override + String get settingsViewerShowRatingTags => 'Zobrazit hodnocení a štítky'; + + @override + String get settingsViewerShowShootingDetails => 'Zobrazit podrobnosti o pořízené fogotrafii'; + + @override + String get settingsViewerShowDescription => 'Zobrazit popis'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Zobrazit náhledy'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Efekt rozostření'; + + @override + String get settingsViewerSlideshowTile => 'Prezentace'; + + @override + String get settingsViewerSlideshowPageTitle => 'Prezentace'; + + @override + String get settingsSlideshowRepeat => 'Opakovat'; + + @override + String get settingsSlideshowShuffle => 'Náhodně'; + + @override + String get settingsSlideshowFillScreen => 'Vyplnit obrazovku'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animovaný efekt přiblížení'; + + @override + String get settingsSlideshowTransitionTile => 'Přechod'; + + @override + String get settingsSlideshowIntervalTile => 'Prodleva'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Přehrávání videa'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Přehrávání videa'; + + @override + String get settingsVideoPageTitle => 'Nastavení videa'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Zobrazovat videa'; + + @override + String get settingsVideoPlaybackTile => 'Přehrávání'; + + @override + String get settingsVideoPlaybackPageTitle => 'Přehrávání'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardwarová akcelerace'; + + @override + String get settingsVideoAutoPlay => 'Automatické přehrávání'; + + @override + String get settingsVideoLoopModeTile => 'Režim smyčky'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Režim smyčky'; + + @override + String get settingsVideoResumptionModeTile => 'Obnovit přehrávání'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Obnovit přehrávání'; + + @override + String get settingsVideoBackgroundMode => 'Režim na pozadí'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Režim na pozadí'; + + @override + String get settingsVideoControlsTile => 'Ovládání'; + + @override + String get settingsVideoControlsPageTitle => 'Ovládání'; + + @override + String get settingsVideoButtonsTile => 'Tlačítka'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Dvojité stisknutí pro spuštění / pauzu'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Dvojití stisknutí v rozích obrazovky pro posun vzad / vpřed'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Potáhnout nahoru či dolů pro úpravu jasu/hlasitosti'; + + @override + String get settingsSubtitleThemeTile => 'Titulky'; + + @override + String get settingsSubtitleThemePageTitle => 'Titulky'; + + @override + String get settingsSubtitleThemeSample => 'Toto je příklad.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Zarovnání textu'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Zarovnání textu'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Pozice textu'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Pozice textu'; + + @override + String get settingsSubtitleThemeTextSize => 'Velikost textu'; + + @override + String get settingsSubtitleThemeShowOutline => 'Zobrazovat obrys a stín'; + + @override + String get settingsSubtitleThemeTextColor => 'Barva textu'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Průhlednost textu'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Barva pozadí'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Průhlednost pozadí'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Doleva'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Na střed'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Doprava'; + + @override + String get settingsPrivacySectionTitle => 'Soukromí'; + + @override + String get settingsAllowInstalledAppAccess => 'Povolit přístup do aplikačního inventáře'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Používá se pro zlepšení zobrazení alb'; + + @override + String get settingsAllowErrorReporting => 'Povolit anonymní chybová hlášení'; + + @override + String get settingsSaveSearchHistory => 'Uložit historii vyhledávání'; + + @override + String get settingsEnableBin => 'Používat koš'; + + @override + String get settingsEnableBinSubtitle => 'Ponechat v koši smazané položky po dobu 30 dní'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Položky v koši budou navždy odstraněny.'; + + @override + String get settingsAllowMediaManagement => 'Povolit správu médií'; + + @override + String get settingsHiddenItemsTile => 'Skryté položky'; + + @override + String get settingsHiddenItemsPageTitle => 'Skryté položky'; + + @override + String get settingsHiddenFiltersBanner => 'Fotografie a videa odpovídající filtrům skrytých položek nebudou zobrazeny ve vaši sbírce.'; + + @override + String get settingsHiddenFiltersEmpty => 'Žádné filtry skrytých položek'; + + @override + String get settingsStorageAccessTile => 'Přístup k úložišti'; + + @override + String get settingsStorageAccessPageTitle => 'Přístup k úložišti'; + + @override + String get settingsStorageAccessBanner => 'Některé adresáře vyžadují explicitní udělení přístupu k úpravě jejich souborů. Zde si můžete prohlédnout adresáře, ke kterým jste dříve udělili přístup.'; + + @override + String get settingsStorageAccessEmpty => 'Žádné povolené přístupy'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Odvolat'; + + @override + String get settingsAccessibilitySectionTitle => 'Přístupnost'; + + @override + String get settingsRemoveAnimationsTile => 'Zakázat animace'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Zakázat animace'; + + @override + String get settingsTimeToTakeActionTile => 'Čas k provedení akce'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Zobrazit alternativy vícedotykových gest'; + + @override + String get settingsDisplaySectionTitle => 'Zobrazení'; + + @override + String get settingsThemeBrightnessTile => 'Vzhled'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Vzhled'; + + @override + String get settingsThemeColorHighlights => 'Zvýraznění barev'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamické barvy'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Obnovovací frekvence displeje'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Obnovovací frekvence'; + + @override + String get settingsDisplayUseTvInterface => 'Rozhraní Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Jazyk a formáty'; + + @override + String get settingsLanguageTile => 'Jazyk'; + + @override + String get settingsLanguagePageTitle => 'Jazyk'; + + @override + String get settingsCoordinateFormatTile => 'Formát souřadnic'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Formát souřadnic'; + + @override + String get settingsUnitSystemTile => 'Jednotky'; + + @override + String get settingsUnitSystemDialogTitle => 'Jednotky'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Vynutit arabské číslice'; + + @override + String get settingsScreenSaverPageTitle => 'Spořič displeje'; + + @override + String get settingsWidgetPageTitle => 'Rámeček fotografie'; + + @override + String get settingsWidgetShowOutline => 'Obrys'; + + @override + String get settingsWidgetOpenPage => 'Při stisknutí widgetu'; + + @override + String get settingsWidgetDisplayedItem => 'Zobrazená položka'; + + @override + String get settingsCollectionTile => 'Sbírka'; + + @override + String get statsPageTitle => 'Statistiky'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count položek s polohou', + few: '$count položky s polohou', + one: '1 položka s polohou', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Nejčastější země'; + + @override + String get statsTopStatesSectionTitle => 'Nejčastější státy'; + + @override + String get statsTopPlacesSectionTitle => 'Nejčastější místa'; + + @override + String get statsTopTagsSectionTitle => 'Nejčastější štítky'; + + @override + String get statsTopAlbumsSectionTitle => 'Nejčastější alba'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OTEVŘÍT PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'NASTAVIT POZADÍ'; + + @override + String get viewerErrorUnknown => 'Jejda!'; + + @override + String get viewerErrorDoesNotExist => 'Soubor již neexistuje.'; + + @override + String get viewerInfoPageTitle => 'Detaily'; + + @override + String get viewerInfoBackToViewerTooltip => 'Zpět k prohlížení'; + + @override + String get viewerInfoUnknown => 'neznámý'; + + @override + String get viewerInfoLabelDescription => 'Popis'; + + @override + String get viewerInfoLabelTitle => 'Název'; + + @override + String get viewerInfoLabelDate => 'Datum'; + + @override + String get viewerInfoLabelResolution => 'Rozlišení'; + + @override + String get viewerInfoLabelSize => 'Velikost'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Umístění'; + + @override + String get viewerInfoLabelDuration => 'Délka'; + + @override + String get viewerInfoLabelOwner => 'Vlastník'; + + @override + String get viewerInfoLabelCoordinates => 'Souřadnice'; + + @override + String get viewerInfoLabelAddress => 'Adresa'; + + @override + String get mapStyleDialogTitle => 'Styl mapy'; + + @override + String get mapStyleDialogAddStyle => 'Přidat styl'; + + @override + String get mapStyleTooltip => 'Vyberte styl mapy'; + + @override + String get mapStyleEditorDialogName => 'Jméno'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Poddomény'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Přiblížit'; + + @override + String get mapZoomOutTooltip => 'Oddálit'; + + @override + String get mapPointNorthUpTooltip => 'Sever nahoře'; + + @override + String get mapAttributionOsmData => 'Mapová data © [OpenStreetMap](https://www.openstreetmap.org/copyright) přispěvatelé'; + + @override + String get mapAttributionOsmLiberty => 'Dlaždice z [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hostované na [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Dlaždice z [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Dlaždice z [HOT](https://www.hotosm.org/) • Hostováno na [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Dlaždice z [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Zobrazit na mapě'; + + @override + String get mapEmptyRegion => 'Žádné obrázky v této oblasti'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Nepodařilo se extrahovat vložená data'; + + @override + String get viewerInfoOpenLinkText => 'Otevřít'; + + @override + String get viewerInfoViewXmlLinkText => 'Zobrazit XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Prohledat metadata'; + + @override + String get viewerInfoSearchEmpty => 'Žádné odpovídající klíče'; + + @override + String get viewerInfoSearchSuggestionDate => 'Datum a čas'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Popis'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Rozměry'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Rozlišení'; + + @override + String get viewerInfoSearchSuggestionRights => 'Práva'; + + @override + String get wallpaperUseScrollEffect => 'Použít rolovací efekt na domovské obrazovce'; + + @override + String get tagEditorPageTitle => 'Upravit štítky'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Nový štítek'; + + @override + String get tagEditorPageAddTagTooltip => 'Přidat štítek'; + + @override + String get tagEditorSectionRecent => 'Nedávné'; + + @override + String get tagEditorSectionPlaceholders => 'Umístění'; + + @override + String get tagEditorDiscardDialogMessage => 'Chcete zrušit změny?'; + + @override + String get tagPlaceholderCountry => 'Země'; + + @override + String get tagPlaceholderState => 'Stát'; + + @override + String get tagPlaceholderPlace => 'Místo'; + + @override + String get panoramaEnableSensorControl => 'Povolit ovládání senzorem'; + + @override + String get panoramaDisableSensorControl => 'Zakázat ovládání senzorem'; + + @override + String get sourceViewerPageTitle => 'Zdroj'; +} diff --git a/lib/l10ngen/app_localizations_da.dart b/lib/l10ngen/app_localizations_da.dart new file mode 100644 index 0000000..a706981 --- /dev/null +++ b/lib/l10ngen/app_localizations_da.dart @@ -0,0 +1,2424 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Danish (`da`). +class AppLocalizationsDa extends AppLocalizations { + AppLocalizationsDa([String locale = 'da']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Velkommen til Aves'; + + @override + String get welcomeOptional => 'Valgfri'; + + @override + String get welcomeTermsToggle => 'Jeg accepterer vilkårene og betingelserne'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString elementer', + one: '$countString element', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString kolonner', + one: '$countString kolonne', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString sekunder', + one: '$countString sekund', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutter', + one: '$countString minut', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString dage', + one: '$countString dag', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'ANVEND'; + + @override + String get createButtonLabel => 'OPRET'; + + @override + String get deleteButtonLabel => 'SLET'; + + @override + String get nextButtonLabel => 'NÆSTE'; + + @override + String get showButtonLabel => 'VIS'; + + @override + String get hideButtonLabel => 'SKJUL'; + + @override + String get continueButtonLabel => 'FORTSÆT'; + + @override + String get saveCopyButtonLabel => 'GEM KOPI'; + + @override + String get applyTooltip => 'Anvend'; + + @override + String get cancelTooltip => 'Annuller'; + + @override + String get changeTooltip => 'Ændr'; + + @override + String get clearTooltip => 'Ryd'; + + @override + String get previousTooltip => 'Forrige'; + + @override + String get nextTooltip => 'Næste'; + + @override + String get showTooltip => 'Vis'; + + @override + String get hideTooltip => 'Skjul'; + + @override + String get actionRemove => 'Fjern'; + + @override + String get resetTooltip => 'Nulstil'; + + @override + String get saveTooltip => 'Gem'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'Vælg'; + + @override + String get doubleBackExitMessage => 'Tryk på “tilbage” igen for at afslutte.'; + + @override + String get doNotAskAgain => 'Spørg ikke igen'; + + @override + String get sourceStateLoading => 'Indlæser'; + + @override + String get sourceStateCataloguing => 'Katalogisering'; + + @override + String get sourceStateLocatingCountries => 'Lokaliserer lande'; + + @override + String get sourceStateLocatingPlaces => 'Lokaliserer steder'; + + @override + String get chipActionDelete => 'Slet'; + + @override + String get chipActionRemove => 'Fjern'; + + @override + String get chipActionShowCollection => 'Vis i samling'; + + @override + String get chipActionGoToAlbumPage => 'Vis i album'; + + @override + String get chipActionGoToCountryPage => 'Vis i lande'; + + @override + String get chipActionGoToPlacePage => 'Vis i steder'; + + @override + String get chipActionGoToTagPage => 'Vis i tags'; + + @override + String get chipActionGoToExplorerPage => 'Vis i stifinder'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Filtrer ud'; + + @override + String get chipActionFilterIn => 'Filtrer ind'; + + @override + String get chipActionHide => 'Skjul'; + + @override + String get chipActionLock => 'Lås'; + + @override + String get chipActionPin => 'Fastgør til toppen'; + + @override + String get chipActionUnpin => 'Frigør fra toppen'; + + @override + String get chipActionGroup => 'Ændr gruppering'; + + @override + String get chipActionRename => 'Omdøb'; + + @override + String get chipActionSetCover => 'Indstil cover'; + + @override + String get chipActionShowCountryStates => 'Vis stater'; + + @override + String get chipActionCreateGroup => 'Opret gruppe'; + + @override + String get chipActionCreateAlbum => 'Opret album'; + + @override + String get chipActionCreateVault => 'Opret boks'; + + @override + String get chipActionConfigureVault => 'Konfigurer boks'; + + @override + String get entryActionCopyToClipboard => 'Kopiér til udklipsholder'; + + @override + String get entryActionDelete => 'Slet'; + + @override + String get entryActionConvert => 'Konverter'; + + @override + String get entryActionExport => 'Eksportér'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Omdøb'; + + @override + String get entryActionRestore => 'Gendan'; + + @override + String get entryActionRotateCCW => 'Roter mod uret'; + + @override + String get entryActionRotateCW => 'Roter med uret'; + + @override + String get entryActionFlip => 'Vend det vandret'; + + @override + String get entryActionPrint => 'Udskriv'; + + @override + String get entryActionShare => 'Del'; + + @override + String get entryActionShareImageOnly => 'Del kun billede'; + + @override + String get entryActionShareVideoOnly => 'Del kun video'; + + @override + String get entryActionViewSource => 'Se kilde'; + + @override + String get entryActionShowGeoTiffOnMap => 'Vis som kortoverlejring'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Konverter til stillbillede'; + + @override + String get entryActionViewMotionPhotoVideo => 'Åbn video'; + + @override + String get entryActionEdit => 'Rediger'; + + @override + String get entryActionOpen => 'Åbn med'; + + @override + String get entryActionSetAs => 'Indstil som'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Vis i kort-app'; + + @override + String get entryActionRotateScreen => 'Roter skærm'; + + @override + String get entryActionAddFavourite => 'Føj til favoritter'; + + @override + String get entryActionRemoveFavourite => 'Fjern fra favoritter'; + + @override + String get videoActionCaptureFrame => 'Tag billede af frame'; + + @override + String get videoActionMute => 'Slå lyden fra'; + + @override + String get videoActionUnmute => 'Slå lyden til'; + + @override + String get videoActionPause => 'Sæt på pause'; + + @override + String get videoActionPlay => 'Afspil'; + + @override + String get videoActionReplay10 => 'Spol 10 sekunder tilbage'; + + @override + String get videoActionSkip10 => 'Spol 10 sekunder frem'; + + @override + String get videoActionShowPreviousFrame => 'Vis forrige frame'; + + @override + String get videoActionShowNextFrame => 'Vis næste frame'; + + @override + String get videoActionSelectStreams => 'Vælg spor'; + + @override + String get videoActionSetSpeed => 'Afspilningshastighed'; + + @override + String get videoActionABRepeat => 'A-B gentagelse'; + + @override + String get videoRepeatActionSetStart => 'Sæt start'; + + @override + String get videoRepeatActionSetEnd => 'Sæt slut'; + + @override + String get viewerActionSettings => 'Indstillinger'; + + @override + String get viewerActionLock => 'Lås fremviser'; + + @override + String get viewerActionUnlock => 'Oplås fremviser'; + + @override + String get slideshowActionResume => 'Genoptag'; + + @override + String get slideshowActionShowInCollection => 'Vis i samling'; + + @override + String get entryInfoActionEditDate => 'Rediger dato og tid'; + + @override + String get entryInfoActionEditLocation => 'Rediger placering'; + + @override + String get entryInfoActionEditTitleDescription => 'Rediger titel og beskrivelse'; + + @override + String get entryInfoActionEditRating => 'Rediger bedømmelse'; + + @override + String get entryInfoActionEditTags => 'Rediger tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Fjern metadata'; + + @override + String get entryInfoActionExportMetadata => 'Eksportér metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Fjern placering'; + + @override + String get editorActionTransform => 'Transformer'; + + @override + String get editorTransformCrop => 'Beskær'; + + @override + String get editorTransformRotate => 'Roter'; + + @override + String get cropAspectRatioFree => 'Frit'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Firkant'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landskab'; + + @override + String get filterAspectRatioPortraitLabel => 'Portræt'; + + @override + String get filterBinLabel => 'Papirkurv'; + + @override + String get filterFavouriteLabel => 'Favorit'; + + @override + String get filterNoDateLabel => 'Udateret'; + + @override + String get filterNoAddressLabel => 'Ingen adresse'; + + @override + String get filterLocatedLabel => 'Placeret'; + + @override + String get filterNoLocationLabel => 'Ikke placeret'; + + @override + String get filterNoRatingLabel => 'Ikke bedømt'; + + @override + String get filterTaggedLabel => 'Tagget'; + + @override + String get filterNoTagLabel => 'Ikke tagget'; + + @override + String get filterNoTitleLabel => 'Uden titel'; + + @override + String get filterOnThisDayLabel => 'På denne dag'; + + @override + String get filterRecentlyAddedLabel => 'Nyligt tilføjet'; + + @override + String get filterRatingRejectedLabel => 'Afvist'; + + @override + String get filterTypeAnimatedLabel => 'Animeret'; + + @override + String get filterTypeMotionPhotoLabel => 'Bevægelsesfoto'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Rå'; + + @override + String get filterTypeSphericalVideoLabel => '360° video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Billede'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Undgå skærmeffekter'; + + @override + String get accessibilityAnimationsKeep => 'Behold skærmeffekter'; + + @override + String get albumTierNew => 'Ny'; + + @override + String get albumTierPinned => 'Fastgjort'; + + @override + String get albumTierGroups => 'Grupper'; + + @override + String get albumTierSpecial => 'Almindelig'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Bokse'; + + @override + String get albumTierDynamic => 'Dynamisk'; + + @override + String get albumTierRegular => 'Andre'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimalgrader'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'Ø'; + + @override + String get coordinateDmsWest => 'V'; + + @override + String get displayRefreshRatePreferHighest => 'Højeste hastighed'; + + @override + String get displayRefreshRatePreferLowest => 'Laveste hastighed'; + + @override + String get keepScreenOnNever => 'Aldrig'; + + @override + String get keepScreenOnVideoPlayback => 'Under videoafspilning'; + + @override + String get keepScreenOnViewerOnly => 'Kun fremvisningsside'; + + @override + String get keepScreenOnAlways => 'Altid'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terræn)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitært OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Aldrig'; + + @override + String get maxBrightnessAlways => 'Altid'; + + @override + String get nameConflictStrategyRename => 'Omdøb'; + + @override + String get nameConflictStrategyReplace => 'Erstat'; + + @override + String get nameConflictStrategySkip => 'Spring over'; + + @override + String get overlayHistogramNone => 'Ingen'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminans'; + + @override + String get subtitlePositionTop => 'Øverst'; + + @override + String get subtitlePositionBottom => 'Nederst'; + + @override + String get themeBrightnessLight => 'Lys'; + + @override + String get themeBrightnessDark => 'Mørk'; + + @override + String get themeBrightnessBlack => 'Sort'; + + @override + String get unitSystemMetric => 'Metrisk'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Mønster'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Adgangskode'; + + @override + String get settingsVideoEnablePip => 'Billede-i-Billede'; + + @override + String get videoControlsPlayOutside => 'Åbn med en anden afspiller'; + + @override + String get videoLoopModeNever => 'Aldrig'; + + @override + String get videoLoopModeShortOnly => 'Kun korte videoer'; + + @override + String get videoLoopModeAlways => 'Altid'; + + @override + String get videoPlaybackSkip => 'Spring over'; + + @override + String get videoPlaybackMuted => 'Afspil uden lyd'; + + @override + String get videoPlaybackWithSound => 'Afspil med lyd'; + + @override + String get videoResumptionModeNever => 'Aldrig'; + + @override + String get videoResumptionModeAlways => 'Altid'; + + @override + String get viewerTransitionSlide => 'Glide'; + + @override + String get viewerTransitionParallax => 'Parallakse'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom ind'; + + @override + String get viewerTransitionNone => 'Ingen'; + + @override + String get wallpaperTargetHome => 'Startskærm'; + + @override + String get wallpaperTargetLock => 'Låseskærm'; + + @override + String get wallpaperTargetHomeLock => 'Startskærm og låseskærm'; + + @override + String get widgetDisplayedItemRandom => 'Tilfældig'; + + @override + String get widgetDisplayedItemMostRecent => 'Nyeste'; + + @override + String get widgetOpenPageHome => 'Åbn hjem'; + + @override + String get widgetOpenPageCollection => 'Åbn samling'; + + @override + String get widgetOpenPageViewer => 'Åbn fremviser'; + + @override + String get widgetTapUpdateWidget => 'Opdater widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internt lager'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD-kort'; + + @override + String get rootDirectoryDescription => 'rodmappe'; + + @override + String otherDirectoryDescription(String name) { + return '“$name”-mappe'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Vælg $directory for “$volume” på den næste skærm for at give appen adgang til den.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Denne app har ikke tilladelse til at ændre filer i $directory for “$volume”.\n\nBrug venligst en forudinstalleret filhåndtering eller galleriapp til at flytte elementerne til en anden mappe.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Denne handling kræver $neededSize ledig plads på “$volume” for at blive fuldført, men der er kun $freeSize tilbage.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Systemfilvælgeren mangler eller er deaktiveret. Aktiver den, og prøv igen.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Denne handling understøttes ikke for elementer af følgende typer: $types.', + one: 'Denne handling understøttes ikke for elementer af følgende type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Nogle filer i destinationsmappen har samme navn.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Nogle filer har samme navn.'; + + @override + String get addShortcutDialogLabel => 'Genvejsetiket'; + + @override + String get addShortcutButtonLabel => 'TILFØJ'; + + @override + String get noMatchingAppDialogMessage => 'Der er ingen apps, der kan håndtere dette.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Flyt $countString elementer til papirkurven?', + one: 'Flyt dette element til papirkurven?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Slet $countString elementer?', + one: 'Slet dette element?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Gem elementdatoer, før du fortsætter?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Gem datoer'; + + @override + String videoResumeDialogMessage(String time) { + return 'Vil du genoptage afspilningen på $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START FORFRA'; + + @override + String get videoResumeButtonLabel => 'GENOPTAG'; + + @override + String get setCoverDialogLatest => 'Seneste element'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Brugerdefineret'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matchende fotos og videoer skjules fra din samling. Du kan vise dem igen i indstillingerne “Privatliv”.\n\nEr du sikker på, at du vil skjule dem?'; + + @override + String get newAlbumDialogTitle => 'Nyt album'; + + @override + String get newAlbumDialogNameLabel => 'Albumnavn'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album findes allerede'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Mappe findes allerede'; + + @override + String get newAlbumDialogStorageLabel => 'Lager:'; + + @override + String get newDynamicAlbumDialogTitle => 'Nyt dynamisk album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamisk album findes allerede'; + + @override + String get newGroupDialogTitle => 'Ny gruppe'; + + @override + String get newGroupDialogNameLabel => 'Gruppenavn'; + + @override + String get groupAlreadyExists => 'Gruppen findes allerede'; + + @override + String get groupEmpty => 'Ingen grupper'; + + @override + String get ungrouped => 'Gruppe opløst'; + + @override + String get groupPickerTitle => 'Vælg gruppe'; + + @override + String get groupPickerUseThisGroupButton => 'Brug denne gruppe'; + + @override + String get newVaultWarningDialogMessage => 'Elementer i bokse er kun tilgængelige for denne app og ingen andre.\n\nHvis du afinstallerer appen eller rydder dens data, mister du alle disse elementer.'; + + @override + String get newVaultDialogTitle => 'Ny boks'; + + @override + String get configureVaultDialogTitle => 'Konfigurer boks'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lås når skærmen slukkes'; + + @override + String get vaultDialogLockTypeLabel => 'Låsetype'; + + @override + String get patternDialogEnter => 'Indtast mønster'; + + @override + String get patternDialogConfirm => 'Bekræft mønster'; + + @override + String get pinDialogEnter => 'Indtast PIN'; + + @override + String get pinDialogConfirm => 'Bekræft PIN'; + + @override + String get passwordDialogEnter => 'Indtast adgangskode'; + + @override + String get passwordDialogConfirm => 'Bekræft adgangskode'; + + @override + String get authenticateToConfigureVault => 'Godkend for at konfigurere boks'; + + @override + String get authenticateToUnlockVault => 'Godkend for at oplåse boks'; + + @override + String get vaultBinUsageDialogMessage => 'Nogle bokse bruger papirkurven.'; + + @override + String get renameAlbumDialogLabel => 'Nyt navn'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Mappe findes allerede'; + + @override + String get renameEntrySetPageTitle => 'Omdøb'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Navngivningsmønster'; + + @override + String get renameEntrySetPageInsertTooltip => 'Indsætningsfelt'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Forhåndsvisning'; + + @override + String get renameProcessorCounter => 'Tæller'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Navn'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Slet dette album og de $countString elementer i det?', + one: 'Slet dette album og elementet i det?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Slet disse album og de $countString elementer i dem?', + one: 'Slet disse album og elementet i dem?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Bredde'; + + @override + String get exportEntryDialogHeight => 'Højde'; + + @override + String get exportEntryDialogQuality => 'Kvalitet'; + + @override + String get exportEntryDialogWriteMetadata => 'Skriv metadata'; + + @override + String get renameEntryDialogLabel => 'Nyt navn'; + + @override + String get editEntryDialogCopyFromItem => 'Kopiér fra et andet element'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Felter at ændre'; + + @override + String get editEntryDateDialogTitle => 'Dato og Tid'; + + @override + String get editEntryDateDialogSetCustom => 'Indstil brugerdefineret dato'; + + @override + String get editEntryDateDialogCopyField => 'Kopiér fra en anden dato'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Udtræk fra titel'; + + @override + String get editEntryDateDialogShift => 'Skift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Filens ændringsdato'; + + @override + String get durationDialogHours => 'Timer'; + + @override + String get durationDialogMinutes => 'Minutter'; + + @override + String get durationDialogSeconds => 'Sekunder'; + + @override + String get editEntryLocationDialogTitle => 'Placering'; + + @override + String get editEntryLocationDialogSetCustom => 'Indstil brugerdefineret placering'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Vælg på kort'; + + @override + String get editEntryLocationDialogImportGpx => 'Importér GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Breddegrad'; + + @override + String get editEntryLocationDialogLongitude => 'Længdegrad'; + + @override + String get editEntryLocationDialogTimeShift => 'Tidsskift'; + + @override + String get locationPickerUseThisLocationButton => 'Brug denne placering'; + + @override + String get editEntryRatingDialogTitle => 'Bedømmelse'; + + @override + String get removeEntryMetadataDialogTitle => 'Fjernelse af metadata'; + + @override + String get removeEntryMetadataDialogAll => 'Alle'; + + @override + String get removeEntryMetadataDialogMore => 'Mere'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP er påkrævet for at afspille videoen i et bevægelsesfoto.\n\nEr du sikker på, at du vil fjerne den?'; + + @override + String get videoSpeedDialogLabel => 'Afspilningshastighed'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Lyd'; + + @override + String get videoStreamSelectionDialogText => 'Undertekster'; + + @override + String get videoStreamSelectionDialogOff => 'Fra'; + + @override + String get videoStreamSelectionDialogTrack => 'Spor'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Der er ingen andre spor.'; + + @override + String get genericSuccessFeedback => 'Færdig!'; + + @override + String get genericFailureFeedback => 'Mislykkedes'; + + @override + String get genericDangerWarningDialogMessage => 'Er du sikker?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Prøv igen med færre elementer.'; + + @override + String get menuActionConfigureView => 'Visning'; + + @override + String get menuActionSelect => 'Vælg'; + + @override + String get menuActionSelectAll => 'Vælg alle'; + + @override + String get menuActionSelectNone => 'Vælg ingen'; + + @override + String get menuActionMap => 'Kort'; + + @override + String get menuActionSlideshow => 'Diasshow'; + + @override + String get menuActionStats => 'Statistikker'; + + @override + String get viewDialogSortSectionTitle => 'Sortér'; + + @override + String get viewDialogGroupSectionTitle => 'Sektioner'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Omvendt sorteringsrækkefølge'; + + @override + String get tileLayoutMosaic => 'Mosaik'; + + @override + String get tileLayoutGrid => 'Gitter'; + + @override + String get tileLayoutList => 'Liste'; + + @override + String get castDialogTitle => 'Cast-enheder'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Farve'; + + @override + String get appPickDialogTitle => 'Vælg app'; + + @override + String get appPickDialogNone => 'Ingen'; + + @override + String get aboutPageTitle => 'Om'; + + @override + String get aboutLinkLicense => 'Licens'; + + @override + String get aboutLinkPolicy => 'Privatlivspolitik'; + + @override + String get aboutBugSectionTitle => 'Fejlrapport'; + + @override + String get aboutBugSaveLogInstruction => 'Gem app-logs i en fil'; + + @override + String get aboutBugCopyInfoInstruction => 'Kopiér systemoplysninger'; + + @override + String get aboutBugCopyInfoButton => 'Kopiér'; + + @override + String get aboutBugReportInstruction => 'Rapportér på GitHub med logfiler og systemoplysninger'; + + @override + String get aboutBugReportButton => 'Rapportér'; + + @override + String get aboutDataUsageSectionTitle => 'Dataforbrug'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Diverse'; + + @override + String get aboutDataUsageInternal => 'Internt'; + + @override + String get aboutDataUsageExternal => 'Eksternt'; + + @override + String get aboutDataUsageClearCache => 'Ryd cache'; + + @override + String get aboutCreditsSectionTitle => 'Kreditering'; + + @override + String get aboutCreditsWorldAtlas1 => 'Denne app bruger en TopoJSON-fil fra'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC-licens.'; + + @override + String get aboutTranslatorsSectionTitle => 'Oversættere'; + + @override + String get aboutLicensesSectionTitle => 'Open source-licenser'; + + @override + String get aboutLicensesBanner => 'Denne app bruger følgende open source-pakker og -biblioteker.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android-biblioteker'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter-plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter-pakker'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart-pakker'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Vis alle licenser'; + + @override + String get policyPageTitle => 'Privatlivspolitik'; + + @override + String get collectionPageTitle => 'Samling'; + + @override + String get collectionPickPageTitle => 'Vælg'; + + @override + String get collectionSelectPageTitle => 'Vælg elementer'; + + @override + String get collectionActionShowTitleSearch => 'Vis titelfilter'; + + @override + String get collectionActionHideTitleSearch => 'Skjul titelfilter'; + + @override + String get collectionActionAddDynamicAlbum => 'Tilføj dynamisk album'; + + @override + String get collectionActionAddShortcut => 'Tilføj genvej'; + + @override + String get collectionActionSetHome => 'Indstil som hjem'; + + @override + String get collectionActionEmptyBin => 'Tøm papirkurv'; + + @override + String get collectionActionCopy => 'Kopiér til album'; + + @override + String get collectionActionMove => 'Flyt til album'; + + @override + String get collectionActionRescan => 'Scan igen'; + + @override + String get collectionActionEdit => 'Rediger'; + + @override + String get collectionSearchTitlesHintText => 'Søg i titler'; + + @override + String get collectionGroupAlbum => 'Efter album'; + + @override + String get collectionGroupMonth => 'Efter måned'; + + @override + String get collectionGroupDay => 'Efter dag'; + + @override + String get sectionNone => 'Ingen sektioner'; + + @override + String get sectionUnknown => 'Ukendt'; + + @override + String get dateToday => 'I dag'; + + @override + String get dateYesterday => 'I går'; + + @override + String get dateThisMonth => 'Denne måned'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kunne ikke slette $countString elementer', + one: 'Kunne ikke slette 1 element', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kunne ikke kopiere $countString elementer', + one: 'Kunne ikke kopiere 1 element', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kunne ikke flytte $countString elementer', + one: 'Kunne ikke flytte 1 element', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kunne ikke omdøbe $countString elementer', + one: 'Kunne ikke omdøbe 1 element', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kunne ikke redigere $countString elementer', + one: 'Kunne ikke redigere 1 element', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kunne ikke eksportere $countString sider', + one: 'Kunne ikke eksportere 1 side', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kopierede $countString elementer', + one: 'Kopierede 1 element', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Flyttede $countString elementer', + one: 'Flyttede 1 element', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Omdøbte $countString elementer', + one: 'Omdøbte 1 element', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Redigerede $countString elementer', + one: 'Redigerede 1 element', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Ingen favoritter'; + + @override + String get collectionEmptyVideos => 'Ingen videoer'; + + @override + String get collectionEmptyImages => 'Ingen billeder'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Giv adgang'; + + @override + String get collectionSelectSectionTooltip => 'Vælg sektion'; + + @override + String get collectionDeselectSectionTooltip => 'Fravælg sektion'; + + @override + String get drawerAboutButton => 'Om'; + + @override + String get drawerSettingsButton => 'Indstillinger'; + + @override + String get drawerCollectionAll => 'Alle samlinger'; + + @override + String get drawerCollectionFavourites => 'Favoritter'; + + @override + String get drawerCollectionImages => 'Billeder'; + + @override + String get drawerCollectionVideos => 'Videoer'; + + @override + String get drawerCollectionAnimated => 'Animeret'; + + @override + String get drawerCollectionMotionPhotos => 'Bevægelsesfotos'; + + @override + String get drawerCollectionPanoramas => 'Panoramaer'; + + @override + String get drawerCollectionRaws => 'Rå billeder'; + + @override + String get drawerCollectionSphericalVideos => '360° videoer'; + + @override + String get drawerAlbumPage => 'Album'; + + @override + String get drawerCountryPage => 'Lande'; + + @override + String get drawerPlacePage => 'Steder'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'Efter dato'; + + @override + String get sortByName => 'Efter navn'; + + @override + String get sortByItemCount => 'Efter antal elementer'; + + @override + String get sortBySize => 'Efter størrelse'; + + @override + String get sortByAlbumFileName => 'Efter album og elementtitel'; + + @override + String get sortByRating => 'Efter bedømmelse'; + + @override + String get sortByDuration => 'Efter varighed'; + + @override + String get sortByPath => 'Efter sti'; + + @override + String get sortOrderNewestFirst => 'Nyeste først'; + + @override + String get sortOrderOldestFirst => 'Ældste først'; + + @override + String get sortOrderAtoZ => 'A til Å'; + + @override + String get sortOrderZtoA => 'Å til A'; + + @override + String get sortOrderHighestFirst => 'Højeste først'; + + @override + String get sortOrderLowestFirst => 'Laveste først'; + + @override + String get sortOrderLargestFirst => 'Største først'; + + @override + String get sortOrderSmallestFirst => 'Mindste først'; + + @override + String get sortOrderShortestFirst => 'Korteste først'; + + @override + String get sortOrderLongestFirst => 'Længste først'; + + @override + String get albumGroupTier => 'Efter kategori'; + + @override + String get albumGroupType => 'Efter type'; + + @override + String get albumGroupVolume => 'Efter lagervolume'; + + @override + String get albumMimeTypeMixed => 'Blandet'; + + @override + String get albumPickPageTitleCopy => 'Kopiér til album'; + + @override + String get albumPickPageTitleExport => 'Eksportér til album'; + + @override + String get albumPickPageTitleMove => 'Flyt til album'; + + @override + String get albumPickPageTitlePick => 'Vælg album'; + + @override + String get albumCamera => 'Kamera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Skærmbilleder'; + + @override + String get albumScreenRecordings => 'Skærmoptagelser'; + + @override + String get albumVideoCaptures => 'Videooptagelser'; + + @override + String get albumPageTitle => 'Album'; + + @override + String get albumEmpty => 'Ingen album'; + + @override + String get createAlbumButtonLabel => 'OPRET'; + + @override + String get newFilterBanner => 'ny'; + + @override + String get countryPageTitle => 'Lande'; + + @override + String get countryEmpty => 'Ingen lande'; + + @override + String get statePageTitle => 'Stater'; + + @override + String get stateEmpty => 'Ingen stater'; + + @override + String get placePageTitle => 'Steder'; + + @override + String get placeEmpty => 'Ingen steder'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'Ingen tags'; + + @override + String get tagPickPageTitle => 'Vælg tag'; + + @override + String get binPageTitle => 'Papirkurv'; + + @override + String get explorerPageTitle => 'Stifinder'; + + @override + String get explorerActionSelectStorageVolume => 'Vælg lager'; + + @override + String get selectStorageVolumeDialogTitle => 'Vælg lager'; + + @override + String get searchCollectionFieldHint => 'Søg i samling'; + + @override + String get searchRecentSectionTitle => 'Seneste'; + + @override + String get searchDateSectionTitle => 'Dato'; + + @override + String get searchFormatSectionTitle => 'Formater'; + + @override + String get searchAlbumsSectionTitle => 'Album'; + + @override + String get searchCountriesSectionTitle => 'Lande'; + + @override + String get searchStatesSectionTitle => 'Stater'; + + @override + String get searchPlacesSectionTitle => 'Steder'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Bedømmelser'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Indstillinger'; + + @override + String get settingsSystemDefault => 'Systemstandard'; + + @override + String get settingsDefault => 'Standard'; + + @override + String get settingsDisabled => 'Deaktiveret'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Spørg hver gang'; + + @override + String get settingsModificationWarningDialogMessage => 'Andre indstillinger bliver ændret.'; + + @override + String get settingsSearchFieldLabel => 'Søg i indstillinger'; + + @override + String get settingsSearchEmpty => 'Ingen matchende indstilling'; + + @override + String get settingsActionExport => 'Eksportér'; + + @override + String get settingsActionExportDialogTitle => 'Eksport'; + + @override + String get settingsActionImport => 'Importér'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamiske album'; + + @override + String get appExportFavourites => 'Favoritter'; + + @override + String get appExportSettings => 'Indstillinger'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Hjem'; + + @override + String get settingsHomeDialogTitle => 'Hjem'; + + @override + String get setHomeCustom => 'Tilpasset'; + + @override + String get settingsKeepScreenOnTile => 'Hold skærmen tændt'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Hold skærmen tændt'; + + @override + String get settingsDoubleBackExit => 'Tryk på “tilbage” to gange for at afslutte'; + + @override + String get settingsConfirmationTile => 'Bekræftelsesdialogbokse'; + + @override + String get settingsConfirmationDialogTitle => 'Bekræftelsesdialogbokse'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Spørg før elementer slettes permanent'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Spørg før elementer flyttes til papirkurven'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Spørg før udaterede elementer flyttes'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Vis besked efter elementer flyttes til papirkurven'; + + @override + String get settingsConfirmationVaultDataLoss => 'Vis advarsel om datatab i bokse'; + + @override + String get settingsNavigationDrawerTile => 'Navigationsmenu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigationsmenu'; + + @override + String get settingsNavigationDrawerBanner => 'Tryk og hold for at flytte og omarrangere menuelementer.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Typer'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Album'; + + @override + String get settingsNavigationDrawerTabPages => 'Sider'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Tilføj album'; + + @override + String get settingsNavigationBottomActionsTile => 'Nederste navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Nederste navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Tryk og hold for at flytte knapper og vælge, hvilke handlinger der vises i den nederste navigationslinje.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniaturebilleder'; + + @override + String get settingsThumbnailOverlayTile => 'Overlejring'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlejring'; + + @override + String get settingsThumbnailShowHdrIcon => 'Vis HDR-ikon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Vis favorit-ikon'; + + @override + String get settingsThumbnailShowTagIcon => 'Vis tag-ikon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Vis placeringsikon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Vis bevægelsesfoto-ikon'; + + @override + String get settingsThumbnailShowRating => 'Vis bedømmelse'; + + @override + String get settingsThumbnailShowRawIcon => 'Vis RAW-ikon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Vis videovarighed'; + + @override + String get settingsCollectionQuickActionsTile => 'Hurtighandlinger'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Hurtighandlinger'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Valg'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Tryk og hold for at flytte knapper og vælge, hvilke handlinger der vises, når du gennemser elementer.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Tryk og hold for at flytte knapper og vælge, hvilke handlinger der vises, når du vælger elementer.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Filnavnmønstre'; + + @override + String get settingsCollectionBurstPatternsNone => 'Ingen'; + + @override + String get settingsViewerSectionTitle => 'Fremviser'; + + @override + String get settingsViewerGestureSideTapNext => 'Tryk på skærmkanterne for at vise forrige/næste element'; + + @override + String get settingsViewerUseCutout => 'Brug udskæringsområde'; + + @override + String get settingsViewerMaximumBrightness => 'Maksimal lysstyrke'; + + @override + String get settingsMotionPhotoAutoPlay => 'Afspil bevægelsesfotos automatisk'; + + @override + String get settingsImageBackground => 'Billedbaggrund'; + + @override + String get settingsViewerQuickActionsTile => 'Hurtighandlinger'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Hurtighandlinger'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Tryk og hold for at flytte knapper og vælge, hvilke handlinger der vises i fremviseren.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Viste knapper'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Tilgængelige knapper'; + + @override + String get settingsViewerQuickActionEmpty => 'Ingen knapper'; + + @override + String get settingsViewerOverlayTile => 'Overlejring'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlejring'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Vis ved åbning'; + + @override + String get settingsViewerShowHistogram => 'Vis histogram'; + + @override + String get settingsViewerShowMinimap => 'Vis minikort'; + + @override + String get settingsViewerShowZoomLevel => 'Vis zoomniveau'; + + @override + String get settingsViewerShowInformation => 'Vis oplysninger'; + + @override + String get settingsViewerShowInformationSubtitle => 'Vis titel, dato, placering osv.'; + + @override + String get settingsViewerShowRatingTags => 'Vis bedømmelse og tags'; + + @override + String get settingsViewerShowShootingDetails => 'Vis fotograferingsdetaljer'; + + @override + String get settingsViewerShowDescription => 'Vis beskrivelse'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Vis miniaturebilleder'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Sløringseffekt'; + + @override + String get settingsViewerSlideshowTile => 'Diasshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Diasshow'; + + @override + String get settingsSlideshowRepeat => 'Gentag'; + + @override + String get settingsSlideshowShuffle => 'Bland'; + + @override + String get settingsSlideshowFillScreen => 'Udfyld skærm'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animeret zoomeffekt'; + + @override + String get settingsSlideshowTransitionTile => 'Overgang'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Videoafspilning'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Videoafspilning'; + + @override + String get settingsVideoPageTitle => 'Videoindstillinger'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Vis videoer'; + + @override + String get settingsVideoPlaybackTile => 'Afspilning'; + + @override + String get settingsVideoPlaybackPageTitle => 'Afspilning'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardwareacceleration'; + + @override + String get settingsVideoAutoPlay => 'Afspil automatisk'; + + @override + String get settingsVideoLoopModeTile => 'Loop-tilstand'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop-tilstand'; + + @override + String get settingsVideoResumptionModeTile => 'Genoptag afspilning'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Genoptag afspilning'; + + @override + String get settingsVideoBackgroundMode => 'Baggrundstilstand'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Baggrundstilstand'; + + @override + String get settingsVideoControlsTile => 'Styring'; + + @override + String get settingsVideoControlsPageTitle => 'Styring'; + + @override + String get settingsVideoButtonsTile => 'Knapper'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Dobbelttryk for at afspille/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Dobbelttryk på skærmkanterne for at gå frem/tilbage'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Stryg op eller ned for at justere lysstyrke/lydstyrke'; + + @override + String get settingsSubtitleThemeTile => 'Undertekster'; + + @override + String get settingsSubtitleThemePageTitle => 'Undertekster'; + + @override + String get settingsSubtitleThemeSample => 'Dette er et eksempel.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Tekstjustering'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Tekstjustering'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Tekstposition'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Tekstposition'; + + @override + String get settingsSubtitleThemeTextSize => 'Tekststørrelse'; + + @override + String get settingsSubtitleThemeShowOutline => 'Vis omrids og skygge'; + + @override + String get settingsSubtitleThemeTextColor => 'Tekstfarve'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Tekstopacitet'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Baggrundsfarve'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Baggrundsopacitet'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Venstre'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Midten'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Højre'; + + @override + String get settingsPrivacySectionTitle => 'Privatliv'; + + @override + String get settingsAllowInstalledAppAccess => 'Tillad adgang til app-lager'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Bruges til at forbedre albumvisning'; + + @override + String get settingsAllowErrorReporting => 'Tillad anonym fejlrapportering'; + + @override + String get settingsSaveSearchHistory => 'Gem søgehistorik'; + + @override + String get settingsEnableBin => 'Brug papirkurv'; + + @override + String get settingsEnableBinSubtitle => 'Opbevar slettede elementer i 30 dage'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Elementer i papirkurven slettes for altid.'; + + @override + String get settingsAllowMediaManagement => 'Tillad mediehåndtering'; + + @override + String get settingsHiddenItemsTile => 'Skjulte elementer'; + + @override + String get settingsHiddenItemsPageTitle => 'Skjulte Elementer'; + + @override + String get settingsHiddenFiltersBanner => 'Billeder og videoer, der matcher skjulte filtre, vises ikke i din samling.'; + + @override + String get settingsHiddenFiltersEmpty => 'Ingen skjulte filtre'; + + @override + String get settingsStorageAccessTile => 'Lageradgang'; + + @override + String get settingsStorageAccessPageTitle => 'Lageradgang'; + + @override + String get settingsStorageAccessBanner => 'Nogle mapper kræver en eksplicit adgangstilladelse for at ændre filer i dem. Her kan du se de mapper, som du tidligere har givet adgang til.'; + + @override + String get settingsStorageAccessEmpty => 'Ingen adgangstilladelser'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Tilbagekald'; + + @override + String get settingsAccessibilitySectionTitle => 'Tilgængelighed'; + + @override + String get settingsRemoveAnimationsTile => 'Fjern animationer'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Fjern animationer'; + + @override + String get settingsTimeToTakeActionTile => 'Tid til at handle'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Vis alternativer til multi-touch-bevægelser'; + + @override + String get settingsDisplaySectionTitle => 'Visning'; + + @override + String get settingsThemeBrightnessTile => 'Tema'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Tema'; + + @override + String get settingsThemeColorHighlights => 'Farvemarkeringer'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamisk farve'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Skærmens opdateringshastighed'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Opdateringshastighed'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV-grænseflade'; + + @override + String get settingsLanguageSectionTitle => 'Sprog og Formater'; + + @override + String get settingsLanguageTile => 'Sprog'; + + @override + String get settingsLanguagePageTitle => 'Sprog'; + + @override + String get settingsCoordinateFormatTile => 'Koordinatformat'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Koordinatformat'; + + @override + String get settingsUnitSystemTile => 'Enheder'; + + @override + String get settingsUnitSystemDialogTitle => 'Enheder'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Fremtving arabiske tal'; + + @override + String get settingsScreenSaverPageTitle => 'Pauseskærm'; + + @override + String get settingsWidgetPageTitle => 'Fotoramme'; + + @override + String get settingsWidgetShowOutline => 'Omrids'; + + @override + String get settingsWidgetOpenPage => 'Ved tryk på widgetten'; + + @override + String get settingsWidgetDisplayedItem => 'Vist element'; + + @override + String get settingsCollectionTile => 'Samling'; + + @override + String get statsPageTitle => 'Statistikker'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString elementer med placering', + one: '1 element med placering', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top lande'; + + @override + String get statsTopStatesSectionTitle => 'Top stater'; + + @override + String get statsTopPlacesSectionTitle => 'Top steder'; + + @override + String get statsTopTagsSectionTitle => 'Top tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top album'; + + @override + String get viewerOpenPanoramaButtonLabel => 'ÅBN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'INDSTIL BAGGRUND'; + + @override + String get viewerErrorUnknown => 'Ups!'; + + @override + String get viewerErrorDoesNotExist => 'Filen findes ikke længere.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Tilbage til fremviser'; + + @override + String get viewerInfoUnknown => 'ukendt'; + + @override + String get viewerInfoLabelDescription => 'Beskrivelse'; + + @override + String get viewerInfoLabelTitle => 'Titel'; + + @override + String get viewerInfoLabelDate => 'Dato'; + + @override + String get viewerInfoLabelResolution => 'Opløsning'; + + @override + String get viewerInfoLabelSize => 'Størrelse'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Sti'; + + @override + String get viewerInfoLabelDuration => 'Varighed'; + + @override + String get viewerInfoLabelOwner => 'Ejer'; + + @override + String get viewerInfoLabelCoordinates => 'Koordinater'; + + @override + String get viewerInfoLabelAddress => 'Adresse'; + + @override + String get mapStyleDialogTitle => 'Kortstil'; + + @override + String get mapStyleDialogAddStyle => 'Tilføj stil'; + + @override + String get mapStyleTooltip => 'Vælg kortstil'; + + @override + String get mapStyleEditorDialogName => 'Navn'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Underdomæner'; + + @override + String get mapStyleEditorDialogUserAgent => 'Brugeragent'; + + @override + String get mapZoomInTooltip => 'Zoom ind'; + + @override + String get mapZoomOutTooltip => 'Zoom ud'; + + @override + String get mapPointNorthUpTooltip => 'Peg nord op'; + + @override + String get mapAttributionOsmData => 'Kortdata © [OpenStreetMap](https://www.openstreetmap.org/copyright) bidragsydere'; + + @override + String get mapAttributionOsmLiberty => 'Fliser af [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hostet af [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Fliser af [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Fliser af [HOT](https://www.hotosm.org/) • Hostet af [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Fliser af [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Se på kortside'; + + @override + String get mapEmptyRegion => 'Ingen billeder i denne region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Kunne ikke udtrække indlejrede data'; + + @override + String get viewerInfoOpenLinkText => 'Åbn'; + + @override + String get viewerInfoViewXmlLinkText => 'Se XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Søg i metadata'; + + @override + String get viewerInfoSearchEmpty => 'Ingen matchende nøgler'; + + @override + String get viewerInfoSearchSuggestionDate => 'Dato og tid'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Beskrivelse'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensioner'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Opløsning'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rettigheder'; + + @override + String get wallpaperUseScrollEffect => 'Brug rulleeffekt på startside'; + + @override + String get tagEditorPageTitle => 'Rediger Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Nyt tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Tilføj tag'; + + @override + String get tagEditorSectionRecent => 'Seneste'; + + @override + String get tagEditorSectionPlaceholders => 'Pladsholdere'; + + @override + String get tagEditorDiscardDialogMessage => 'Vil du kassere ændringerne?'; + + @override + String get tagPlaceholderCountry => 'Land'; + + @override + String get tagPlaceholderState => 'Stat'; + + @override + String get tagPlaceholderPlace => 'Sted'; + + @override + String get panoramaEnableSensorControl => 'Aktivér sensorstyring'; + + @override + String get panoramaDisableSensorControl => 'Deaktiver sensorstyring'; + + @override + String get sourceViewerPageTitle => 'Kilde'; +} diff --git a/lib/l10ngen/app_localizations_de.dart b/lib/l10ngen/app_localizations_de.dart new file mode 100644 index 0000000..8c44f73 --- /dev/null +++ b/lib/l10ngen/app_localizations_de.dart @@ -0,0 +1,2422 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for German (`de`). +class AppLocalizationsDe extends AppLocalizations { + AppLocalizationsDe([String locale = 'de']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Willkommen bei Aves'; + + @override + String get welcomeOptional => 'Optional'; + + @override + String get welcomeTermsToggle => 'Ich stimme den Bedingungen und Konditionen zu'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString Elemente', + one: '$countString Element', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count Spalten', + one: '$count Spalte', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString Sekunde', + one: '$countString Sekunde', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString Minuten', + one: '$countString Minute', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString Tage', + one: '$countString Tag', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'ANWENDEN'; + + @override + String get createButtonLabel => 'ERSTELLEN'; + + @override + String get deleteButtonLabel => 'LÖSCHEN'; + + @override + String get nextButtonLabel => 'NÄCHSTE'; + + @override + String get showButtonLabel => 'ANZEIGEN'; + + @override + String get hideButtonLabel => 'VERBERGEN'; + + @override + String get continueButtonLabel => 'WEITER'; + + @override + String get saveCopyButtonLabel => 'KOPIE SPEICHERN'; + + @override + String get applyTooltip => 'Anwenden'; + + @override + String get cancelTooltip => 'Abbrechen'; + + @override + String get changeTooltip => 'Ändern'; + + @override + String get clearTooltip => 'Aufräumen'; + + @override + String get previousTooltip => 'Vorherige'; + + @override + String get nextTooltip => 'Nächste'; + + @override + String get showTooltip => 'Anzeigen'; + + @override + String get hideTooltip => 'Ausblenden'; + + @override + String get actionRemove => 'Entfernen'; + + @override + String get resetTooltip => 'Zurücksetzen'; + + @override + String get saveTooltip => 'Speichern'; + + @override + String get stopTooltip => 'Stoppen'; + + @override + String get pickTooltip => 'Wähle'; + + @override + String get doubleBackExitMessage => 'Zum Verlassen erneut auf „Zurück“ tippen.'; + + @override + String get doNotAskAgain => 'Nicht noch einmal fragen'; + + @override + String get sourceStateLoading => 'Laden'; + + @override + String get sourceStateCataloguing => 'Katalogisierung'; + + @override + String get sourceStateLocatingCountries => 'Länder lokalisieren'; + + @override + String get sourceStateLocatingPlaces => 'Lokalisierung von Orten'; + + @override + String get chipActionDelete => 'Löschen'; + + @override + String get chipActionRemove => 'Entfernen'; + + @override + String get chipActionShowCollection => 'In Sammlung anzeigen'; + + @override + String get chipActionGoToAlbumPage => 'Anzeigen in Alben'; + + @override + String get chipActionGoToCountryPage => 'Anzeigen in Ländern'; + + @override + String get chipActionGoToPlacePage => 'In Orten anzeigen'; + + @override + String get chipActionGoToTagPage => 'Zeige in Tags'; + + @override + String get chipActionGoToExplorerPage => 'Im Explorer anzeigen'; + + @override + String get chipActionDecompose => 'Aufschlüsseln'; + + @override + String get chipActionFilterOut => 'Filtern ohne'; + + @override + String get chipActionFilterIn => 'Filtern mit'; + + @override + String get chipActionHide => 'Ausblenden'; + + @override + String get chipActionLock => 'Sperren'; + + @override + String get chipActionPin => 'Oben Anpinnen'; + + @override + String get chipActionUnpin => 'Nicht mehr Anpinen'; + + @override + String get chipActionGroup => 'Gruppierung ändern'; + + @override + String get chipActionRename => 'Umbenennen'; + + @override + String get chipActionSetCover => 'Titelbild bestimmen'; + + @override + String get chipActionShowCountryStates => 'Staaten anzeigen'; + + @override + String get chipActionCreateGroup => 'Gruppe erstellen'; + + @override + String get chipActionCreateAlbum => 'Album erstellen'; + + @override + String get chipActionCreateVault => 'Tresor anlegen'; + + @override + String get chipActionConfigureVault => 'Tresor konfigurieren'; + + @override + String get entryActionCopyToClipboard => 'In die Zwischenablage kopieren'; + + @override + String get entryActionDelete => 'Löschen'; + + @override + String get entryActionConvert => 'Konvertieren'; + + @override + String get entryActionExport => 'Exportieren'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Umbenennen'; + + @override + String get entryActionRestore => 'Wiederherstellen'; + + @override + String get entryActionRotateCCW => 'Gegen den Uhrzeigersinn drehen'; + + @override + String get entryActionRotateCW => 'Im Uhrzeigersinn drehen'; + + @override + String get entryActionFlip => 'Horizontal spiegeln'; + + @override + String get entryActionPrint => 'Drucken'; + + @override + String get entryActionShare => 'Teilen'; + + @override + String get entryActionShareImageOnly => 'Nur das Bild teilen'; + + @override + String get entryActionShareVideoOnly => 'Nur das Video teilen'; + + @override + String get entryActionViewSource => 'Quelle anzeigen'; + + @override + String get entryActionShowGeoTiffOnMap => 'Als Karten-Overlay anzeigen'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'In ein Standbild umwandeln'; + + @override + String get entryActionViewMotionPhotoVideo => 'Video öffnen'; + + @override + String get entryActionEdit => 'Bearbeiten'; + + @override + String get entryActionOpen => 'Öffnen mit'; + + @override + String get entryActionSetAs => 'Einstellen als'; + + @override + String get entryActionCast => 'Übertragen'; + + @override + String get entryActionOpenMap => 'In der Karten-App anzeigen'; + + @override + String get entryActionRotateScreen => 'Bildschirm rotieren'; + + @override + String get entryActionAddFavourite => 'Zu Favoriten hinzufügen'; + + @override + String get entryActionRemoveFavourite => 'Aus Favoriten entfernen'; + + @override + String get videoActionCaptureFrame => 'Frame aufnehmen'; + + @override + String get videoActionMute => 'Audio deaktivieren'; + + @override + String get videoActionUnmute => 'Audio aktiveren'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Spielen'; + + @override + String get videoActionReplay10 => '10 Sekunden rückwärts springen'; + + @override + String get videoActionSkip10 => '10 Sekunden vorwärts springen'; + + @override + String get videoActionShowPreviousFrame => 'Vorigen Frame zeigen'; + + @override + String get videoActionShowNextFrame => 'Nächsten Frame zeigen'; + + @override + String get videoActionSelectStreams => 'Titel auswählen'; + + @override + String get videoActionSetSpeed => 'Wiedergabegeschwindigkeit'; + + @override + String get videoActionABRepeat => 'A-B-Wiederholung'; + + @override + String get videoRepeatActionSetStart => 'Start festlegen'; + + @override + String get videoRepeatActionSetEnd => 'Ende festlegen'; + + @override + String get viewerActionSettings => 'Einstellungen'; + + @override + String get viewerActionLock => 'Anzeige sperren'; + + @override + String get viewerActionUnlock => 'Anzeige entsperren'; + + @override + String get slideshowActionResume => 'Wiedergabe'; + + @override + String get slideshowActionShowInCollection => 'In Sammlung anzeigen'; + + @override + String get entryInfoActionEditDate => 'Datum & Uhrzeit bearbeiten'; + + @override + String get entryInfoActionEditLocation => 'Standort bearbeiten'; + + @override + String get entryInfoActionEditTitleDescription => 'Titel und Beschreibung bearbeiten'; + + @override + String get entryInfoActionEditRating => 'Bewertung bearbeiten'; + + @override + String get entryInfoActionEditTags => 'Tags bearbeiten'; + + @override + String get entryInfoActionRemoveMetadata => 'Metadaten entfernen'; + + @override + String get entryInfoActionExportMetadata => 'Metadaten exportieren'; + + @override + String get entryInfoActionRemoveLocation => 'Standort entfernen'; + + @override + String get editorActionTransform => 'Umwandeln'; + + @override + String get editorTransformCrop => 'Zuschneiden'; + + @override + String get editorTransformRotate => 'Drehen'; + + @override + String get cropAspectRatioFree => 'Frei'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Quadrat'; + + @override + String get filterAspectRatioLandscapeLabel => 'Querformat'; + + @override + String get filterAspectRatioPortraitLabel => 'Hochformat'; + + @override + String get filterBinLabel => 'Papierkorb'; + + @override + String get filterFavouriteLabel => 'Favorit'; + + @override + String get filterNoDateLabel => 'Undatiert'; + + @override + String get filterNoAddressLabel => 'Keine Adresse'; + + @override + String get filterLocatedLabel => 'Mit Standort'; + + @override + String get filterNoLocationLabel => 'Ungeortet'; + + @override + String get filterNoRatingLabel => 'Nicht bewertet'; + + @override + String get filterTaggedLabel => 'Getaggt'; + + @override + String get filterNoTagLabel => 'Unmarkiert'; + + @override + String get filterNoTitleLabel => 'Unbenannt'; + + @override + String get filterOnThisDayLabel => 'Am heutigen Tag'; + + @override + String get filterRecentlyAddedLabel => 'Kürzlich hinzugefügt'; + + @override + String get filterRatingRejectedLabel => 'Verworfen'; + + @override + String get filterTypeAnimatedLabel => 'Animationen'; + + @override + String get filterTypeMotionPhotoLabel => 'Bewegtes Foto'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Rohdaten'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Bild'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Verhinderung von Bildschirmeffekten'; + + @override + String get accessibilityAnimationsKeep => 'Bildschirmeffekte beibehalten'; + + @override + String get albumTierNew => 'Neu'; + + @override + String get albumTierPinned => 'Angeheftet'; + + @override + String get albumTierGroups => 'Gruppen'; + + @override + String get albumTierSpecial => 'Häufig verwendet'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Tresore'; + + @override + String get albumTierDynamic => 'Dynamisch'; + + @override + String get albumTierRegular => 'Andere'; + + @override + String get coordinateFormatDms => 'GMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Dezimalgrad'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 's'; + + @override + String get coordinateDmsEast => 'O'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Höchste Rate'; + + @override + String get displayRefreshRatePreferLowest => 'Niedrigste Rate'; + + @override + String get keepScreenOnNever => 'Niemals'; + + @override + String get keepScreenOnVideoPlayback => 'Während der Videowiedergabe'; + + @override + String get keepScreenOnViewerOnly => 'Nur bei Bildbetrachtung'; + + @override + String get keepScreenOnAlways => 'Immer'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Gelände)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitäres OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (Aquarell)'; + + @override + String get maxBrightnessNever => 'Nie'; + + @override + String get maxBrightnessAlways => 'Immer'; + + @override + String get nameConflictStrategyRename => 'Umbenennen'; + + @override + String get nameConflictStrategyReplace => 'Ersetzen'; + + @override + String get nameConflictStrategySkip => 'Überspringen'; + + @override + String get overlayHistogramNone => 'Keines'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Leuchtdichte'; + + @override + String get subtitlePositionTop => 'Oben'; + + @override + String get subtitlePositionBottom => 'Unten'; + + @override + String get themeBrightnessLight => 'Hell'; + + @override + String get themeBrightnessDark => 'Dunkel'; + + @override + String get themeBrightnessBlack => 'Schwarz'; + + @override + String get unitSystemMetric => 'Metrisch'; + + @override + String get unitSystemImperial => 'Imperiale'; + + @override + String get vaultLockTypePattern => 'Muster'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Passwort'; + + @override + String get settingsVideoEnablePip => 'Bild-in-Bild'; + + @override + String get videoControlsPlayOutside => 'Mit anderem Video-Player öffnen'; + + @override + String get videoLoopModeNever => 'Niemals'; + + @override + String get videoLoopModeShortOnly => 'Nur kurze Videos'; + + @override + String get videoLoopModeAlways => 'Immer'; + + @override + String get videoPlaybackSkip => 'Überspringen'; + + @override + String get videoPlaybackMuted => 'Stumm abspielen'; + + @override + String get videoPlaybackWithSound => 'Mit Ton abspielen'; + + @override + String get videoResumptionModeNever => 'Nie'; + + @override + String get videoResumptionModeAlways => 'Immer'; + + @override + String get viewerTransitionSlide => 'Dia'; + + @override + String get viewerTransitionParallax => 'Parallaxe'; + + @override + String get viewerTransitionFade => 'Ausblenden'; + + @override + String get viewerTransitionZoomIn => 'Heranzoomen'; + + @override + String get viewerTransitionNone => 'Keine'; + + @override + String get wallpaperTargetHome => 'Startbildschirm'; + + @override + String get wallpaperTargetLock => 'Sperrbildschirm'; + + @override + String get wallpaperTargetHomeLock => 'Start- und Sperrbildschirm'; + + @override + String get widgetDisplayedItemRandom => 'Zufällig'; + + @override + String get widgetDisplayedItemMostRecent => 'Neueste'; + + @override + String get widgetOpenPageHome => 'Startseite öffnen'; + + @override + String get widgetOpenPageCollection => 'Sammlung öffnen'; + + @override + String get widgetOpenPageViewer => 'Betrachter öffnen'; + + @override + String get widgetTapUpdateWidget => 'Widget aktualisieren'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Interner Speicher'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD-Karte'; + + @override + String get rootDirectoryDescription => 'Hauptverzeichnis'; + + @override + String otherDirectoryDescription(String name) { + return '„$name“ Verzeichnis'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Bitte den $directory von „$volume“ auf dem nächsten Bildschirm auswählen, um dieser App Zugriff darauf zu geben.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Diese Anwendung darf keine Dateien im $directory von „$volume“ verändern.\n\nBitte einen vorinstallierten Dateimanager verwenden oder eine Galerie-App, um die Objekte in ein anderes Verzeichnis zu verschieben.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Diese Operation benötigt $neededSize freien Platz auf „$volume“, um abgeschlossen zu werden, aber es ist nur noch $freeSize übrig.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Der System-Dateiauswahldialog fehlt oder ist deaktiviert. Bitte aktivieren und es erneut versuchen.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Dieser Vorgang wird für Elemente der folgenden Typen nicht unterstützt: $types.', + one: 'Dieser Vorgang wird für Elemente des folgenden Typs nicht unterstützt: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Einige Dateien im Zielordner haben den gleichen Namen.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Einige Dateien haben denselben Namen.'; + + @override + String get addShortcutDialogLabel => 'Shortcut-Etikett'; + + @override + String get addShortcutButtonLabel => 'Hinzufügen'; + + @override + String get noMatchingAppDialogMessage => 'Es gibt keine Anwendungen, die dies bewältigen können.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Diese $countString Elemente in den Papierkorb verschieben?', + one: 'Dieses Element in den Papierkorb verschieben?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Sicher, dass diese $countString Elemente gelöscht werden sollen?', + one: 'Sicher, dass dieses Element gelöscht werden soll?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Daten speichern, bevor es weitergeht?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Datum einstellen'; + + @override + String videoResumeDialogMessage(String time) { + return 'Soll bei $time weiter abspielt werden?'; + } + + @override + String get videoStartOverButtonLabel => 'NEU BEGINNEN'; + + @override + String get videoResumeButtonLabel => 'FORTSETZTEN'; + + @override + String get setCoverDialogLatest => 'Letzter Artikel'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Benutzerdefiniert'; + + @override + String get hideFilterConfirmationDialogMessage => + 'Passende Fotos und Videos werden aus Ihrer Sammlung ausgeblendet. Dies kann in den „Datenschutz“-Einstellungen wieder eingeblendet werden.\n\nSicher, dass diese ausblendet werden sollen?'; + + @override + String get newAlbumDialogTitle => 'Neues Album'; + + @override + String get newAlbumDialogNameLabel => 'Album Name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album existiert bereits'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Verzeichnis existiert bereits'; + + @override + String get newAlbumDialogStorageLabel => 'Speicher:'; + + @override + String get newDynamicAlbumDialogTitle => 'Neues Dynamisches Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamisches Album existiert bereits'; + + @override + String get newGroupDialogTitle => 'Neue Gruppe'; + + @override + String get newGroupDialogNameLabel => 'Gruppenname'; + + @override + String get groupAlreadyExists => 'Gruppe existiert bereits'; + + @override + String get groupEmpty => 'Keine Gruppen'; + + @override + String get ungrouped => 'Nicht gruppiert'; + + @override + String get groupPickerTitle => 'Gruppe auswählen'; + + @override + String get groupPickerUseThisGroupButton => 'Diese Gruppe verwenden'; + + @override + String get newVaultWarningDialogMessage => 'Elemente in Tresoren sind nur für diese App verfügbar und nicht in anderen.\n\nWenn Sie diese App deinstallieren oder die Daten dieser App löschen, gehen alle diese Elemente verloren.'; + + @override + String get newVaultDialogTitle => 'Neuer Tresor'; + + @override + String get configureVaultDialogTitle => 'Tresor konfigurieren'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Sperren beim Ausschalten des Bildschirms'; + + @override + String get vaultDialogLockTypeLabel => 'Schloss-Typ'; + + @override + String get patternDialogEnter => 'Muster eingeben'; + + @override + String get patternDialogConfirm => 'Muster bestätigen'; + + @override + String get pinDialogEnter => 'PIN eingeben'; + + @override + String get pinDialogConfirm => 'PIN bestätigen'; + + @override + String get passwordDialogEnter => 'Passwort eingeben'; + + @override + String get passwordDialogConfirm => 'Passwort bestätigen'; + + @override + String get authenticateToConfigureVault => 'Authentifizierung zum Konfigurieren des Tresors'; + + @override + String get authenticateToUnlockVault => 'Authentifizierung zum Entsperren des Tresors'; + + @override + String get vaultBinUsageDialogMessage => 'Einige Tresore verwenden den Papierkorb.'; + + @override + String get renameAlbumDialogLabel => 'Neuer Name'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Verzeichnis existiert bereits'; + + @override + String get renameEntrySetPageTitle => 'Umbenennen'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Benennungsmuster'; + + @override + String get renameEntrySetPageInsertTooltip => 'Feld einfügen'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Vorschau'; + + @override + String get renameProcessorCounter => 'Zähler'; + + @override + String get renameProcessorHash => 'Raute'; + + @override + String get renameProcessorName => 'Name'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Das Album und die $countString darin enthaltenen Elemente löschen?', + one: 'Das Album und das darin enthaltene Element löschen?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Diese Alben und die darin enthaltenen $countString Objekte löschen?', + one: 'Diese Alben und die darin enthaltenen Elemente löschen?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Breite'; + + @override + String get exportEntryDialogHeight => 'Höhe'; + + @override + String get exportEntryDialogQuality => 'Qualität'; + + @override + String get exportEntryDialogWriteMetadata => 'Metadaten schreiben'; + + @override + String get renameEntryDialogLabel => 'Neuer Name'; + + @override + String get editEntryDialogCopyFromItem => 'Von einem anderen Element kopieren'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Zu ändernde Felder'; + + @override + String get editEntryDateDialogTitle => 'Datum & Uhrzeit'; + + @override + String get editEntryDateDialogSetCustom => 'Datum einstellen'; + + @override + String get editEntryDateDialogCopyField => 'Von anderem Datum kopieren'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Auszug aus dem Titel'; + + @override + String get editEntryDateDialogShift => 'Verschieben'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Änderungsdatum der Datei'; + + @override + String get durationDialogHours => 'Stunden'; + + @override + String get durationDialogMinutes => 'Minuten'; + + @override + String get durationDialogSeconds => 'Sekunden'; + + @override + String get editEntryLocationDialogTitle => 'Standort'; + + @override + String get editEntryLocationDialogSetCustom => 'Benutzerdefinierten Standort festlegen'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Auf Karte wählen'; + + @override + String get editEntryLocationDialogImportGpx => 'GPX importieren'; + + @override + String get editEntryLocationDialogLatitude => 'Breitengrad'; + + @override + String get editEntryLocationDialogLongitude => 'Längengrad'; + + @override + String get editEntryLocationDialogTimeShift => 'Zeitverschiebung'; + + @override + String get locationPickerUseThisLocationButton => 'Diesen Standort verwenden'; + + @override + String get editEntryRatingDialogTitle => 'Bewertung'; + + @override + String get removeEntryMetadataDialogTitle => 'Entfernung von Metadaten'; + + @override + String get removeEntryMetadataDialogAll => 'Alle'; + + @override + String get removeEntryMetadataDialogMore => 'Mehr'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP ist erforderlich, um das Video innerhalb eines bewegten Bildes abzuspielen.\n\nSicher, dass es entfernt werden soll?'; + + @override + String get videoSpeedDialogLabel => 'Wiedergabegeschwindigkeit'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Untertitel'; + + @override + String get videoStreamSelectionDialogOff => 'Aus'; + + @override + String get videoStreamSelectionDialogTrack => 'Spur'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Es gibt keine anderen Spuren.'; + + @override + String get genericSuccessFeedback => 'Erledigt!'; + + @override + String get genericFailureFeedback => 'Gescheitert'; + + @override + String get genericDangerWarningDialogMessage => 'Sicher?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Noch einmal mit weniger Elementen versuchen.'; + + @override + String get menuActionConfigureView => 'Sortierung'; + + @override + String get menuActionSelect => 'Auswahl'; + + @override + String get menuActionSelectAll => 'Alle auswählen'; + + @override + String get menuActionSelectNone => 'Keine auswählen'; + + @override + String get menuActionMap => 'Karte'; + + @override + String get menuActionSlideshow => 'Diashow'; + + @override + String get menuActionStats => 'Statistiken'; + + @override + String get viewDialogSortSectionTitle => 'Sortieren'; + + @override + String get viewDialogGroupSectionTitle => 'Abschnitte'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Umgekehrte Sortierung'; + + @override + String get tileLayoutMosaic => 'Mosaik'; + + @override + String get tileLayoutGrid => 'Kacheln'; + + @override + String get tileLayoutList => 'Liste'; + + @override + String get castDialogTitle => 'Geräte zur Übertragung'; + + @override + String get coverDialogTabCover => 'Titelbild'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Farbe'; + + @override + String get appPickDialogTitle => 'Wähle App'; + + @override + String get appPickDialogNone => 'Nichts'; + + @override + String get aboutPageTitle => 'Über'; + + @override + String get aboutLinkLicense => 'Lizenz'; + + @override + String get aboutLinkPolicy => 'Datenschutzrichtlinie'; + + @override + String get aboutBugSectionTitle => 'Fehlerbericht'; + + @override + String get aboutBugSaveLogInstruction => 'Anwendungsprotokolle in einer Datei speichern'; + + @override + String get aboutBugCopyInfoInstruction => 'Systeminformationen kopieren'; + + @override + String get aboutBugCopyInfoButton => 'Kopieren'; + + @override + String get aboutBugReportInstruction => 'Bericht auf GitHub mit den Protokollen und Systeminformationen'; + + @override + String get aboutBugReportButton => 'Bericht'; + + @override + String get aboutDataUsageSectionTitle => 'Datennutzung'; + + @override + String get aboutDataUsageData => 'Daten'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Datenbank'; + + @override + String get aboutDataUsageMisc => 'Sonstiges'; + + @override + String get aboutDataUsageInternal => 'Intern'; + + @override + String get aboutDataUsageExternal => 'Extern'; + + @override + String get aboutDataUsageClearCache => 'Cache leeren'; + + @override + String get aboutCreditsSectionTitle => 'Kredite'; + + @override + String get aboutCreditsWorldAtlas1 => 'Diese Anwendung verwendet eine TopoJSON-Datei von'; + + @override + String get aboutCreditsWorldAtlas2 => 'unter ISC-Lizenz.'; + + @override + String get aboutTranslatorsSectionTitle => 'Übersetzer'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source-Lizenzen'; + + @override + String get aboutLicensesBanner => 'Diese Anwendung verwendet die folgenden Open-Source-Pakete und -Bibliotheken.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android-Bibliotheken'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter-Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flatter-Pakete'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart-Pakete'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Alle Lizenzen anzeigen'; + + @override + String get policyPageTitle => 'Datenschutzrichtlinie'; + + @override + String get collectionPageTitle => 'Sammlung'; + + @override + String get collectionPickPageTitle => 'Wähle'; + + @override + String get collectionSelectPageTitle => 'Elemente auswählen'; + + @override + String get collectionActionShowTitleSearch => 'Titelfilter anzeigen'; + + @override + String get collectionActionHideTitleSearch => 'Titelfilter ausblenden'; + + @override + String get collectionActionAddDynamicAlbum => 'Dynamisches Album hinzufügen'; + + @override + String get collectionActionAddShortcut => 'Verknüpfung hinzufügen'; + + @override + String get collectionActionSetHome => 'Als Startseite setzen'; + + @override + String get collectionActionEmptyBin => 'Papierkorb leeren'; + + @override + String get collectionActionCopy => 'In Album kopieren'; + + @override + String get collectionActionMove => 'Zum Album verschieben'; + + @override + String get collectionActionRescan => 'Neu scannen'; + + @override + String get collectionActionEdit => 'Bearbeiten'; + + @override + String get collectionSearchTitlesHintText => 'Titel suchen'; + + @override + String get collectionGroupAlbum => 'Nach Album'; + + @override + String get collectionGroupMonth => 'Nach Monat'; + + @override + String get collectionGroupDay => 'Nach Tag'; + + @override + String get sectionNone => 'Keine Abschnitte'; + + @override + String get sectionUnknown => 'Unbekannt'; + + @override + String get dateToday => 'Heute'; + + @override + String get dateYesterday => 'Gestern'; + + @override + String get dateThisMonth => 'Diesen Monat'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString Elemente konnten nicht gelöscht werden', + one: '1 Element konnte nicht gelöscht werden', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString Element konnten nicht kopiert werden', + one: '1 Element konnte nicht kopiert werden', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString Elemente konnten nicht verschoben werden', + one: '1 Element konnte nicht verschoben werden', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Fehler beim Umbenennen $countString Elemente', + one: 'Fehler beim Umbenennen eines Elements', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 1 Elemente konnten nicht bearbeitet werden', + one: '1 Element konnte nicht bearbeitet werden', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString Seiten konnten nicht exportiert werden', + one: '1 Seite konnte nicht exportiert werden', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: ' $countString Elemente kopiert', + one: '1 Element kopier', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString Elemente verschoben', + one: '1 Element verschoben', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString Elemente umbenannt', + one: '1 Element umbenannt', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: ' $countString Elemente bearbeitet', + one: '1 Element bearbeitet', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Keine Favoriten'; + + @override + String get collectionEmptyVideos => 'Keine Videos'; + + @override + String get collectionEmptyImages => 'Keine Bilder'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Zugriff gewähren'; + + @override + String get collectionSelectSectionTooltip => 'Bereich auswählen'; + + @override + String get collectionDeselectSectionTooltip => 'Bereich abwählen'; + + @override + String get drawerAboutButton => 'Über'; + + @override + String get drawerSettingsButton => 'Einstellungen'; + + @override + String get drawerCollectionAll => 'Alle Bilder'; + + @override + String get drawerCollectionFavourites => 'Favoriten'; + + @override + String get drawerCollectionImages => 'Bilder'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animationen'; + + @override + String get drawerCollectionMotionPhotos => 'Bewegte Fotos'; + + @override + String get drawerCollectionPanoramas => 'Panoramen'; + + @override + String get drawerCollectionRaws => 'Rohdaten Fotos'; + + @override + String get drawerCollectionSphericalVideos => '360°-Videos'; + + @override + String get drawerAlbumPage => 'Alben'; + + @override + String get drawerCountryPage => 'Länder'; + + @override + String get drawerPlacePage => 'Orte'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'Nach Datum'; + + @override + String get sortByName => 'Nach Name'; + + @override + String get sortByItemCount => 'Nach Anzahl'; + + @override + String get sortBySize => 'Nach Größe'; + + @override + String get sortByAlbumFileName => 'Nach Album- und Elementtitel'; + + @override + String get sortByRating => 'Nach Bewertung'; + + @override + String get sortByDuration => 'Nach Dauer'; + + @override + String get sortByPath => 'Nach Pfad'; + + @override + String get sortOrderNewestFirst => 'Neueste zuerst'; + + @override + String get sortOrderOldestFirst => 'Älteste zuerst'; + + @override + String get sortOrderAtoZ => 'A zu Z'; + + @override + String get sortOrderZtoA => 'Z zu A'; + + @override + String get sortOrderHighestFirst => 'Höchste zuerst'; + + @override + String get sortOrderLowestFirst => 'Niedrigste zuerst'; + + @override + String get sortOrderLargestFirst => 'Größtes zuerst'; + + @override + String get sortOrderSmallestFirst => 'Kleinste zuerst'; + + @override + String get sortOrderShortestFirst => 'Kurze zuerst'; + + @override + String get sortOrderLongestFirst => 'Lange zuerst'; + + @override + String get albumGroupTier => 'Nach Ebene'; + + @override + String get albumGroupType => 'Nach Typ'; + + @override + String get albumGroupVolume => 'Nach Speichervolumen'; + + @override + String get albumMimeTypeMixed => 'Gemischt'; + + @override + String get albumPickPageTitleCopy => 'In Album kopieren'; + + @override + String get albumPickPageTitleExport => 'In Album exportieren'; + + @override + String get albumPickPageTitleMove => 'Zum Album verschieben'; + + @override + String get albumPickPageTitlePick => 'Album auswählen'; + + @override + String get albumCamera => 'Kamera'; + + @override + String get albumDownload => 'Heruntergeladen'; + + @override + String get albumScreenshots => 'Bildschirmfotos'; + + @override + String get albumScreenRecordings => 'Bildschirmaufnahmen'; + + @override + String get albumVideoCaptures => 'Video-Aufnahmen'; + + @override + String get albumPageTitle => 'Alben'; + + @override + String get albumEmpty => 'Keine Alben'; + + @override + String get createAlbumButtonLabel => 'ERSTELLE'; + + @override + String get newFilterBanner => 'Neu'; + + @override + String get countryPageTitle => 'Länder'; + + @override + String get countryEmpty => 'Keine Länder'; + + @override + String get statePageTitle => 'Staaten'; + + @override + String get stateEmpty => 'Keine Staaten'; + + @override + String get placePageTitle => 'Orte'; + + @override + String get placeEmpty => 'Keine Orte'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'Keine Tags'; + + @override + String get tagPickPageTitle => 'Tag auswählen'; + + @override + String get binPageTitle => 'Papierkorb'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Speicher auswählen'; + + @override + String get selectStorageVolumeDialogTitle => 'Speicher auswählen'; + + @override + String get searchCollectionFieldHint => 'Sammlung durchsuchen'; + + @override + String get searchRecentSectionTitle => 'Neueste'; + + @override + String get searchDateSectionTitle => 'Datum'; + + @override + String get searchFormatSectionTitle => 'Formate'; + + @override + String get searchAlbumsSectionTitle => 'Alben'; + + @override + String get searchCountriesSectionTitle => 'Länder'; + + @override + String get searchStatesSectionTitle => 'Staaten'; + + @override + String get searchPlacesSectionTitle => 'Orte'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Bewertungen'; + + @override + String get searchMetadataSectionTitle => 'Metadaten'; + + @override + String get settingsPageTitle => 'Einstellungen'; + + @override + String get settingsSystemDefault => 'System'; + + @override + String get settingsDefault => 'Standard'; + + @override + String get settingsDisabled => 'Deaktiviert'; + + @override + String get settingsEnabled => 'Aktiviert'; + + @override + String get settingsForced => 'Erzwungen'; + + @override + String get settingsAskEverytime => 'Jedes Mal nachfragen'; + + @override + String get settingsModificationWarningDialogMessage => 'Andere Einstellungen werden angepasst.'; + + @override + String get settingsSearchFieldLabel => 'Einstellungen durchsuchen'; + + @override + String get settingsSearchEmpty => 'Keine passende Einstellung'; + + @override + String get settingsActionExport => 'Exportieren'; + + @override + String get settingsActionExportDialogTitle => 'Exportieren'; + + @override + String get settingsActionImport => 'Importieren'; + + @override + String get settingsActionImportDialogTitle => 'Importieren'; + + @override + String get appExportCovers => 'Titelbilder'; + + @override + String get appExportDynamicAlbums => 'Dynamische Alben'; + + @override + String get appExportFavourites => 'Favoriten'; + + @override + String get appExportSettings => 'Einstellungen'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Startseite'; + + @override + String get settingsHomeDialogTitle => 'Startseite'; + + @override + String get setHomeCustom => 'Benutzerdefiniert'; + + @override + String get settingsKeepScreenOnTile => 'Bildschirm eingeschaltet lassen'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Bildschirm eingeschaltet lassen'; + + @override + String get settingsDoubleBackExit => 'Zum Verlassen zweimal „zurück“ tippen'; + + @override + String get settingsConfirmationTile => 'Bestätigungsdialoge'; + + @override + String get settingsConfirmationDialogTitle => 'Bestätigungsdialoge'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Vor dem endgültigen Löschen von Elementen fragen'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Vor dem Verschieben von Elementen in den Papierkorb fragen'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Vor Verschiebung von Objekten ohne Metadaten-Datum fragen'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Nachricht nach dem Verschieben von Elementen in den Papierkorb anzeigen'; + + @override + String get settingsConfirmationVaultDataLoss => 'Warnung vor Tresordatenverlust anzeigen'; + + @override + String get settingsNavigationDrawerTile => 'Menü Navigation'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Menü Navigation'; + + @override + String get settingsNavigationDrawerBanner => 'Die Taste berühren und halten, um Menüpunkte zu verschieben und neu anzuordnen.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Typen'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Alben'; + + @override + String get settingsNavigationDrawerTabPages => 'Seiten'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Album hinzufügen'; + + @override + String get settingsNavigationBottomActionsTile => 'Untere Navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Untere Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Tippen und halten Sie um die Elemente der unteren Navigationsleiste zu verschieben und anzupassen.'; + + @override + String get settingsThumbnailSectionTitle => 'Vorschaubilder'; + + @override + String get settingsThumbnailOverlayTile => 'Überlagerung'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Überlagerung'; + + @override + String get settingsThumbnailShowHdrIcon => 'HDR-Symbol anzeigen'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Favoriten-Symbol anzeigen'; + + @override + String get settingsThumbnailShowTagIcon => 'Tag-Symbol anzeigen'; + + @override + String get settingsThumbnailShowLocationIcon => 'Standort-Symbol anzeigen'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Bewegungsfoto-Symbol anzeigen'; + + @override + String get settingsThumbnailShowRating => 'Bewertung anzeigen'; + + @override + String get settingsThumbnailShowRawIcon => 'Rohdaten-Symbol anzeigen'; + + @override + String get settingsThumbnailShowVideoDuration => 'Videodauer anzeigen'; + + @override + String get settingsCollectionQuickActionsTile => 'Schnelle Aktionen'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Schnelle Aktionen'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Durchsuchen'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Auswahl'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Die Taste gedrückt halten, um die Schaltflächen zu bewegen und auszuwählen, welche Aktionen beim Durchsuchen von Elementen angezeigt werden.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Die Taste gedrückt halten, um die Schaltflächen zu bewegen und auszuwählen, welche Aktionen beim Durchsuchen von Elementen angezeigt werden.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Berstmuster'; + + @override + String get settingsCollectionBurstPatternsNone => 'Nichts'; + + @override + String get settingsViewerSectionTitle => 'Anzeige'; + + @override + String get settingsViewerGestureSideTapNext => 'Tippen auf den Bildschirmrand, um das vorheriges/nächstes Element anzuzeigen'; + + @override + String get settingsViewerUseCutout => 'Ausgeschnittenen Bereich verwenden'; + + @override + String get settingsViewerMaximumBrightness => 'Maximale Helligkeit'; + + @override + String get settingsMotionPhotoAutoPlay => 'Automatische Wiedergabe bewegter Fotos'; + + @override + String get settingsImageBackground => 'Bild-Hintergrund'; + + @override + String get settingsViewerQuickActionsTile => 'Schnelle Aktionen'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Schnelle Aktionen'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Die Taste gedrückt halten, um die Schaltflächen zu bewegen und auszuwählen, welche Aktionen im Viewer angezeigt werden sollen.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Angezeigte Schaltflächen'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Verfügbare Schaltflächen'; + + @override + String get settingsViewerQuickActionEmpty => 'Keine Tasten'; + + @override + String get settingsViewerOverlayTile => 'Überlagerung'; + + @override + String get settingsViewerOverlayPageTitle => 'Überlagerung'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Bei Eröffnung anzeigen'; + + @override + String get settingsViewerShowHistogram => 'Histogramm anzeigen'; + + @override + String get settingsViewerShowMinimap => 'Minimap anzeigen'; + + @override + String get settingsViewerShowZoomLevel => 'Vergrößerungsgrad anzeigen'; + + @override + String get settingsViewerShowInformation => 'Informationen anzeigen'; + + @override + String get settingsViewerShowInformationSubtitle => 'Titel, Datum, Ort, etc. anzeigen.'; + + @override + String get settingsViewerShowRatingTags => 'Bewertung & Tags anzeigen'; + + @override + String get settingsViewerShowShootingDetails => 'Aufnahmedetails anzeigen'; + + @override + String get settingsViewerShowDescription => 'Beschreibung anzeigen'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Vorschaubilder anzeigen'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Unschärfe-Effekt'; + + @override + String get settingsViewerSlideshowTile => 'Diashow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Diashow'; + + @override + String get settingsSlideshowRepeat => 'Wiederholung'; + + @override + String get settingsSlideshowShuffle => 'Mischen'; + + @override + String get settingsSlideshowFillScreen => 'Bildschirm ausfüllen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animierter Zoomeffekt'; + + @override + String get settingsSlideshowTransitionTile => 'Übergang'; + + @override + String get settingsSlideshowIntervalTile => 'Intervall'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Videowiedergabe'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Videowiedergabe'; + + @override + String get settingsVideoPageTitle => 'Video-Einstellungen'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Videos anzeigen'; + + @override + String get settingsVideoPlaybackTile => 'Wiedergabe'; + + @override + String get settingsVideoPlaybackPageTitle => 'Wiedergabe'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware-Beschleunigung'; + + @override + String get settingsVideoAutoPlay => 'Automatische Wiedergabe'; + + @override + String get settingsVideoLoopModeTile => 'Schleifen-Modus'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Schleifen-Modus'; + + @override + String get settingsVideoResumptionModeTile => 'Wiedergabe fortsetzen'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Wiedergabe fortsetzen'; + + @override + String get settingsVideoBackgroundMode => 'Hintergrund-Modus'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Hintergrund-Modus'; + + @override + String get settingsVideoControlsTile => 'Steuerung'; + + @override + String get settingsVideoControlsPageTitle => 'Steuerung'; + + @override + String get settingsVideoButtonsTile => 'Schaltflächen'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Doppeltippen zum Abspielen/Pausieren'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Doppeltippen auf die Bildschirmränder zum Rückwärts-/Vorwärtsspringen'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Nach oben oder unten wischen, um die Helligkeit/Lautstärke einzustellen'; + + @override + String get settingsSubtitleThemeTile => 'Untertitel'; + + @override + String get settingsSubtitleThemePageTitle => 'Untertitel'; + + @override + String get settingsSubtitleThemeSample => 'Dies ist ein Beispiel.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Textausrichtung'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Textausrichtung'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Textposition'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Textposition'; + + @override + String get settingsSubtitleThemeTextSize => 'Textgröße'; + + @override + String get settingsSubtitleThemeShowOutline => 'Umriss und Schatten anzeigen'; + + @override + String get settingsSubtitleThemeTextColor => 'Textfarbe'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Opazität des Textes'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Hintergrundfarbe'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Hintergrund-Opazität'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Links'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Zentrum'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Rechts'; + + @override + String get settingsPrivacySectionTitle => 'Datenschutz'; + + @override + String get settingsAllowInstalledAppAccess => 'Zugriff auf die Liste der installierten Apps'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'zur Gruppierung von Bildern nach Apps'; + + @override + String get settingsAllowErrorReporting => 'Anonyme Fehlermeldungen zulassen'; + + @override + String get settingsSaveSearchHistory => 'Suchverlauf speichern'; + + @override + String get settingsEnableBin => 'Papierkorb verwenden'; + + @override + String get settingsEnableBinSubtitle => 'Gelöschte Elemente 30 Tage lang aufbewahren'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Die Elemente im Papierkorb werden für immer gelöscht.'; + + @override + String get settingsAllowMediaManagement => 'Medienverwaltung zulassen'; + + @override + String get settingsHiddenItemsTile => 'Versteckte Elemente'; + + @override + String get settingsHiddenItemsPageTitle => 'Versteckte Elemente'; + + @override + String get settingsHiddenFiltersBanner => 'Fotos und Videos, die versteckten Filtern entsprechen, werden nicht in Ihrer Sammlung angezeigt.'; + + @override + String get settingsHiddenFiltersEmpty => 'Keine versteckten Filter'; + + @override + String get settingsStorageAccessTile => 'Speicherzugriff'; + + @override + String get settingsStorageAccessPageTitle => 'Speicherzugriff'; + + @override + String get settingsStorageAccessBanner => 'Einige Verzeichnisse erfordern eine explizite Zugriffsberechtigung, um Dateien darin zu ändern. Hier können Verzeichnisse überprüft werden, auf die zuvor Zugriff gewährt wurde.'; + + @override + String get settingsStorageAccessEmpty => 'Keine Zugangsberechtigungen'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Widerrufen'; + + @override + String get settingsAccessibilitySectionTitle => 'Barrierefreiheit'; + + @override + String get settingsRemoveAnimationsTile => 'Animationen entfernen'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Animationen entfernen'; + + @override + String get settingsTimeToTakeActionTile => 'Zeit zum Reagieren'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Alternativen für Multi-Touch-Gesten anzeigen'; + + @override + String get settingsDisplaySectionTitle => 'Darstellung'; + + @override + String get settingsThemeBrightnessTile => 'Thema'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Thema'; + + @override + String get settingsThemeColorHighlights => 'Farbige Highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamische Farben'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Bildwiederholrate der Anzeige'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Bildwiederholrate'; + + @override + String get settingsDisplayUseTvInterface => 'Android-TV Oberfläche'; + + @override + String get settingsLanguageSectionTitle => 'Sprache & Formate'; + + @override + String get settingsLanguageTile => 'Sprache'; + + @override + String get settingsLanguagePageTitle => 'Sprache'; + + @override + String get settingsCoordinateFormatTile => 'Koordinatenformat'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Koordinatenformat'; + + @override + String get settingsUnitSystemTile => 'Einheiten'; + + @override + String get settingsUnitSystemDialogTitle => 'Einheiten'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Arabische Ziffern erzwingen'; + + @override + String get settingsScreenSaverPageTitle => 'Bildschirmschoner'; + + @override + String get settingsWidgetPageTitle => 'Bilderrahmen'; + + @override + String get settingsWidgetShowOutline => 'Umrandung'; + + @override + String get settingsWidgetOpenPage => 'Beim Tippen auf das Widget'; + + @override + String get settingsWidgetDisplayedItem => 'Angezeigtes Element'; + + @override + String get settingsCollectionTile => 'Sammlung'; + + @override + String get statsPageTitle => 'Statistiken'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString Elemente mit Standort', + one: '1 Element mit Standort', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top-Länder'; + + @override + String get statsTopStatesSectionTitle => 'Top Staaten'; + + @override + String get statsTopPlacesSectionTitle => 'Top-Plätze'; + + @override + String get statsTopTagsSectionTitle => 'Top-Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top-Alben'; + + @override + String get viewerOpenPanoramaButtonLabel => 'ÖFFNE PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'HINTERGRUNDBILD EINSTELLEN'; + + @override + String get viewerErrorUnknown => 'Ups!'; + + @override + String get viewerErrorDoesNotExist => 'Die Datei existiert nicht mehr.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Zurück zum Betrachter'; + + @override + String get viewerInfoUnknown => 'Unbekannt'; + + @override + String get viewerInfoLabelDescription => 'Beschreibung'; + + @override + String get viewerInfoLabelTitle => 'Titel'; + + @override + String get viewerInfoLabelDate => 'Datum'; + + @override + String get viewerInfoLabelResolution => 'Auflösung'; + + @override + String get viewerInfoLabelSize => 'Größe'; + + @override + String get viewerInfoLabelUri => 'URL'; + + @override + String get viewerInfoLabelPath => 'Pfad'; + + @override + String get viewerInfoLabelDuration => 'Dauer'; + + @override + String get viewerInfoLabelOwner => 'Im Besitz von'; + + @override + String get viewerInfoLabelCoordinates => 'Koordinaten'; + + @override + String get viewerInfoLabelAddress => 'Adresse'; + + @override + String get mapStyleDialogTitle => 'Kartenstil'; + + @override + String get mapStyleDialogAddStyle => 'Stil hinzufügen'; + + @override + String get mapStyleTooltip => 'Kartenstil auswählen'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Vergrößern'; + + @override + String get mapZoomOutTooltip => 'Verkleinern'; + + @override + String get mapPointNorthUpTooltip => 'Richtung Norden aufwärts'; + + @override + String get mapAttributionOsmData => 'Kartendaten © [OpenStreetMap](https://www.openstreetmap.org/copyright) Mitwirkende'; + + @override + String get mapAttributionOsmLiberty => 'Kacheln von [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Gehostet von [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Kacheln von [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Kacheln von [HOT](https://www.hotosm.org/) • Gehostet von [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Kacheln von [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Auf der Karte anzeigen'; + + @override + String get mapEmptyRegion => 'Keine Bilder in dieser Region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Eingebettete Daten konnten nicht extrahiert werden'; + + @override + String get viewerInfoOpenLinkText => 'Öffnen'; + + @override + String get viewerInfoViewXmlLinkText => 'Ansicht XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Metadaten suchen'; + + @override + String get viewerInfoSearchEmpty => 'Keine passenden Schlüssel'; + + @override + String get viewerInfoSearchSuggestionDate => 'Datum & Uhrzeit'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Beschreibung'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Abmessungen'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Auflösung'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rechte'; + + @override + String get wallpaperUseScrollEffect => 'Scroll-Effekt auf dem Startbildschirm verwenden'; + + @override + String get tagEditorPageTitle => 'Tags bearbeiten'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Neuer Tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Tag hinzufügen'; + + @override + String get tagEditorSectionRecent => 'Neueste'; + + @override + String get tagEditorSectionPlaceholders => 'Platzhalter'; + + @override + String get tagEditorDiscardDialogMessage => 'Möchten Sie die Änderungen verwerfen?'; + + @override + String get tagPlaceholderCountry => 'Land'; + + @override + String get tagPlaceholderState => 'Staat'; + + @override + String get tagPlaceholderPlace => 'Ort'; + + @override + String get panoramaEnableSensorControl => 'Aktivieren der Sensorsteuerung'; + + @override + String get panoramaDisableSensorControl => 'Sensorsteuerung deaktivieren'; + + @override + String get sourceViewerPageTitle => 'Quelle'; +} diff --git a/lib/l10ngen/app_localizations_el.dart b/lib/l10ngen/app_localizations_el.dart new file mode 100644 index 0000000..b735dbf --- /dev/null +++ b/lib/l10ngen/app_localizations_el.dart @@ -0,0 +1,2422 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Modern Greek (`el`). +class AppLocalizationsEl extends AppLocalizations { + AppLocalizationsEl([String locale = 'el']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Καλωσορίσατε στην εφαρμογή Aves'; + + @override + String get welcomeOptional => 'Προαιρετικό'; + + @override + String get welcomeTermsToggle => 'Συμφωνώ με τους όρους και τις προυποθέσεις'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString στοιχεία', + one: '$countString στοιχείο', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count στήλες', + one: '$count στήλη', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString δευτερόλεπτα', + one: '$countString δευτερόλεπτο', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString λεπτά', + one: '$countString λεπτό', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ημέρες', + one: '$countString ημέρα', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'ΕΦΑΡΜΟΓΗ'; + + @override + String get createButtonLabel => 'ΔΗΜΙΟΥΡΓΙΑ'; + + @override + String get deleteButtonLabel => 'ΔΙΑΓΡΑΦΗ'; + + @override + String get nextButtonLabel => 'ΕΠΟΜΕΝΟ'; + + @override + String get showButtonLabel => 'ΕΜΦΑΝΙΣΗ'; + + @override + String get hideButtonLabel => 'ΑΠΟΚΡΥΨΗ'; + + @override + String get continueButtonLabel => 'ΣΥΝΕΧΕΙΑ'; + + @override + String get saveCopyButtonLabel => 'ΑΠΟΘΗΚΕΥΣΗ ΑΝΤΙΓΡΑΦΟΥ'; + + @override + String get applyTooltip => 'Εφαρμογή'; + + @override + String get cancelTooltip => 'Ακύρωση'; + + @override + String get changeTooltip => 'Αλλαγή'; + + @override + String get clearTooltip => 'Εκκαθάριση'; + + @override + String get previousTooltip => 'Προηγούμενο'; + + @override + String get nextTooltip => 'Επόμενο'; + + @override + String get showTooltip => 'Εμφάνιση'; + + @override + String get hideTooltip => 'Απόκρυψη'; + + @override + String get actionRemove => 'Αφαίρεση'; + + @override + String get resetTooltip => 'Επαναφορά'; + + @override + String get saveTooltip => 'Αποθήκευση'; + + @override + String get stopTooltip => 'Σταμάτησε'; + + @override + String get pickTooltip => 'Διαλέξτε'; + + @override + String get doubleBackExitMessage => 'Αγγίξτε ξανά το «πίσω» για έξοδο.'; + + @override + String get doNotAskAgain => 'Να μην ερωτηθώ ξανά'; + + @override + String get sourceStateLoading => 'Φόρτωση'; + + @override + String get sourceStateCataloguing => 'Καταλογογράφηση'; + + @override + String get sourceStateLocatingCountries => 'Εντοπισμός χωρών'; + + @override + String get sourceStateLocatingPlaces => 'Εντοπισμός τοποθεσιών'; + + @override + String get chipActionDelete => 'Διαγραφή'; + + @override + String get chipActionRemove => 'Αφαίρεση'; + + @override + String get chipActionShowCollection => 'Εμφάνιση στη Συλλογή'; + + @override + String get chipActionGoToAlbumPage => 'Εμφάνιση στα Άλμπουμ'; + + @override + String get chipActionGoToCountryPage => 'Εμφάνιση στις χώρες'; + + @override + String get chipActionGoToPlacePage => 'Εμφάνιση στα μέρη'; + + @override + String get chipActionGoToTagPage => 'Εμφάνιση στις ετικέτες'; + + @override + String get chipActionGoToExplorerPage => 'Εμφάνιση στην Εξερεύνηση'; + + @override + String get chipActionDecompose => 'Διάσπαση'; + + @override + String get chipActionFilterOut => 'Χωρίς φιλτράρισμα'; + + @override + String get chipActionFilterIn => 'Με φιλτράρισμα'; + + @override + String get chipActionHide => 'Απόκρυψη'; + + @override + String get chipActionLock => 'Κλείδωμα'; + + @override + String get chipActionPin => 'Καρφίτσωμα στην κορυφή'; + + @override + String get chipActionUnpin => 'Ξέκαρφίτσωμα από την κορυφή'; + + @override + String get chipActionGroup => 'Αλλαγή ομαδοποίησης'; + + @override + String get chipActionRename => 'Μετονομασία'; + + @override + String get chipActionSetCover => 'Ορισμός ως εξώφυλλο'; + + @override + String get chipActionShowCountryStates => 'Εμφάνιση πολιτειών'; + + @override + String get chipActionCreateGroup => 'Δημιουργία ομάδας'; + + @override + String get chipActionCreateAlbum => 'Δημιουργία άλμπουμ'; + + @override + String get chipActionCreateVault => 'Δημιουργήστε θησαυροφυλάκιο'; + + @override + String get chipActionConfigureVault => 'Διαμορφώστε το θησαυροφυλάκιο'; + + @override + String get entryActionCopyToClipboard => 'Αντιγραφή στο πρόχειρο'; + + @override + String get entryActionDelete => 'Διαγραφή'; + + @override + String get entryActionConvert => 'Μετατροπή'; + + @override + String get entryActionExport => 'Εξαγωγή'; + + @override + String get entryActionInfo => 'Λεπτομέρειες'; + + @override + String get entryActionRename => 'Μετονομασία'; + + @override + String get entryActionRestore => 'Επαναφορά'; + + @override + String get entryActionRotateCCW => 'Περιστροφή προς τα αριστερά'; + + @override + String get entryActionRotateCW => 'Περιστροφή προς τα δεξιά'; + + @override + String get entryActionFlip => 'Αντανάκλαση καθρέφτη'; + + @override + String get entryActionPrint => 'Εκτύπωση'; + + @override + String get entryActionShare => 'Κοινοποίηση'; + + @override + String get entryActionShareImageOnly => 'Κοινοποίηση μόνο την εικόνα'; + + @override + String get entryActionShareVideoOnly => 'Κοινοποίηση μόνο το βίντεο'; + + @override + String get entryActionViewSource => 'Προβολή πηγής'; + + @override + String get entryActionShowGeoTiffOnMap => 'Εμφάνιση ως επικάλυψη στον χάρτη'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Μετατροπή σε στατική εικόνα'; + + @override + String get entryActionViewMotionPhotoVideo => 'Άνοιγμα του βίντεο'; + + @override + String get entryActionEdit => 'Επεξεργασία'; + + @override + String get entryActionOpen => 'Άνοιγμα με'; + + @override + String get entryActionSetAs => 'Ορισμός ως'; + + @override + String get entryActionCast => 'Εκτέλεση'; + + @override + String get entryActionOpenMap => 'Εμφάνιση στην εφαρμογή χάρτες'; + + @override + String get entryActionRotateScreen => 'Περιστροφή οθόνης'; + + @override + String get entryActionAddFavourite => 'Προσθήκη στα αγαπημένα'; + + @override + String get entryActionRemoveFavourite => 'Αφαίρεση από τα αγαπημένα'; + + @override + String get videoActionCaptureFrame => 'Λήψη στιγμιότυπου'; + + @override + String get videoActionMute => 'Σίγαση'; + + @override + String get videoActionUnmute => 'Αναίρεση σίγασης'; + + @override + String get videoActionPause => 'Παύση'; + + @override + String get videoActionPlay => 'Αναπαραγωγή'; + + @override + String get videoActionReplay10 => '10 δευτερόλεπτα πίσω'; + + @override + String get videoActionSkip10 => '10 δευτερόλεπτα μπροστά'; + + @override + String get videoActionShowPreviousFrame => 'Εμφάνιση προηγούμενου καρέ'; + + @override + String get videoActionShowNextFrame => 'Εμφάνιση επόμενου καρέ'; + + @override + String get videoActionSelectStreams => 'Επιλογή γλώσσας'; + + @override + String get videoActionSetSpeed => 'Ταχύτητα αναπαραγωγής'; + + @override + String get videoActionABRepeat => 'Επανάληψη A-B'; + + @override + String get videoRepeatActionSetStart => 'Ορισμός έναρξης'; + + @override + String get videoRepeatActionSetEnd => 'Ορισμός τέλους'; + + @override + String get viewerActionSettings => 'Ρυθμίσεις'; + + @override + String get viewerActionLock => 'Κλείδωμα προβολής'; + + @override + String get viewerActionUnlock => 'Ξεκλείδωμα προβολής'; + + @override + String get slideshowActionResume => 'Συνέχιση'; + + @override + String get slideshowActionShowInCollection => 'Εμφάνιση στη Συλλογή'; + + @override + String get entryInfoActionEditDate => 'Επεξεργασία ημερομηνίας και ώρας'; + + @override + String get entryInfoActionEditLocation => 'Επεξεργασία τοποθεσίας'; + + @override + String get entryInfoActionEditTitleDescription => 'Επεξεργασία ονομασίας & περιγραφής'; + + @override + String get entryInfoActionEditRating => 'Επεξεργασία βαθμολογίας'; + + @override + String get entryInfoActionEditTags => 'Επεξεργασία ετικετών'; + + @override + String get entryInfoActionRemoveMetadata => 'Κατάργηση μεταδεδομένων'; + + @override + String get entryInfoActionExportMetadata => 'Εξαγωγή μεταδεδομένων'; + + @override + String get entryInfoActionRemoveLocation => 'Αφαίρεση τοποθεσίας'; + + @override + String get editorActionTransform => 'Μετατροπή'; + + @override + String get editorTransformCrop => 'Περικοπή'; + + @override + String get editorTransformRotate => 'Περιστροφή'; + + @override + String get cropAspectRatioFree => 'Ελεύθερη μορφή'; + + @override + String get cropAspectRatioOriginal => 'Αρχικό'; + + @override + String get cropAspectRatioSquare => 'Τετράγωνο'; + + @override + String get filterAspectRatioLandscapeLabel => 'Oριζόντιες εικόνες'; + + @override + String get filterAspectRatioPortraitLabel => 'Κατακόρυφες εικόνες'; + + @override + String get filterBinLabel => 'Κάδος ανακύκλωσης'; + + @override + String get filterFavouriteLabel => 'Αγαπημένα'; + + @override + String get filterNoDateLabel => 'Χωρίς ημερομηνία'; + + @override + String get filterNoAddressLabel => 'Χωρίς διεύθυνση'; + + @override + String get filterLocatedLabel => 'Με τοποθεσία'; + + @override + String get filterNoLocationLabel => 'Χωρίς τοποθεσία'; + + @override + String get filterNoRatingLabel => 'Χωρίς βαθμολογία'; + + @override + String get filterTaggedLabel => 'Με ετικέτα'; + + @override + String get filterNoTagLabel => 'Χωρίς ετικέτα'; + + @override + String get filterNoTitleLabel => 'Χωρίς ονομασία'; + + @override + String get filterOnThisDayLabel => 'Αυτή τη μέρα'; + + @override + String get filterRecentlyAddedLabel => 'Προστέθηκαν πρόσφατα'; + + @override + String get filterRatingRejectedLabel => 'Απορριφθέντα'; + + @override + String get filterTypeAnimatedLabel => 'Κινούμενα'; + + @override + String get filterTypeMotionPhotoLabel => 'Φωτογραφίες με κίνηση'; + + @override + String get filterTypePanoramaLabel => 'Πανοραμικές'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => 'Βίντεο 360°'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Εικόνα'; + + @override + String get filterMimeVideoLabel => 'Βίντεο'; + + @override + String get accessibilityAnimationsRemove => 'Απενεργοποίηση εφέ οθόνης'; + + @override + String get accessibilityAnimationsKeep => 'Διατήρηση εφέ οθόνης'; + + @override + String get albumTierNew => 'Νέα'; + + @override + String get albumTierPinned => 'Καρφιτσωμένα'; + + @override + String get albumTierGroups => 'Ομάδες'; + + @override + String get albumTierSpecial => 'Συστήματος'; + + @override + String get albumTierApps => 'Εφαρμογές'; + + @override + String get albumTierVaults => 'Θησαυροφυλακια'; + + @override + String get albumTierDynamic => 'Δυναμικό'; + + @override + String get albumTierRegular => 'Προσωπικά'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Δεκαδικές μοίρες'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'Β'; + + @override + String get coordinateDmsSouth => 'Ν'; + + @override + String get coordinateDmsEast => 'Α'; + + @override + String get coordinateDmsWest => 'Δ'; + + @override + String get displayRefreshRatePreferHighest => 'Υψηλότερος ρυθμός'; + + @override + String get displayRefreshRatePreferLowest => 'Χαμηλότερος ρυθμός'; + + @override + String get keepScreenOnNever => 'Ποτέ'; + + @override + String get keepScreenOnVideoPlayback => 'Κατά την αναπαραγωγή βίντεο'; + + @override + String get keepScreenOnViewerOnly => 'Μόνο όταν πραγματοποιείται προβολή στοιχείων'; + + @override + String get keepScreenOnAlways => 'Πάντα'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Ελευθερία'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Ποτέ'; + + @override + String get maxBrightnessAlways => 'Πάντα'; + + @override + String get nameConflictStrategyRename => 'Μετονομασία'; + + @override + String get nameConflictStrategyReplace => 'Αντικατάσταση'; + + @override + String get nameConflictStrategySkip => 'Παράλειψη'; + + @override + String get overlayHistogramNone => 'Τίποτα'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Φωτεινότητα'; + + @override + String get subtitlePositionTop => 'Πάνω'; + + @override + String get subtitlePositionBottom => 'Κάτω'; + + @override + String get themeBrightnessLight => 'Φωτεινό'; + + @override + String get themeBrightnessDark => 'Σκούρο'; + + @override + String get themeBrightnessBlack => 'Μαύρο'; + + @override + String get unitSystemMetric => 'Μετρικό'; + + @override + String get unitSystemImperial => 'Aγγλοσαξονικό'; + + @override + String get vaultLockTypePattern => 'Μοτίβο'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Κωδικός πρόσβασης'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Άνοιγμα με άλλη εφαρμογή'; + + @override + String get videoLoopModeNever => 'Ποτέ'; + + @override + String get videoLoopModeShortOnly => 'Μόνο για βίντεο σύντομης διάρκειας'; + + @override + String get videoLoopModeAlways => 'Πάντα'; + + @override + String get videoPlaybackSkip => 'Παράλειψη'; + + @override + String get videoPlaybackMuted => 'Αναπαραγωγή σε σίγαση'; + + @override + String get videoPlaybackWithSound => 'Αναπαραγωγή με ήχο'; + + @override + String get videoResumptionModeNever => 'Ποτέ'; + + @override + String get videoResumptionModeAlways => 'Πάντα'; + + @override + String get viewerTransitionSlide => 'Ολίσθηση'; + + @override + String get viewerTransitionParallax => 'Παράλλαξη'; + + @override + String get viewerTransitionFade => 'Ξεθώριασμα'; + + @override + String get viewerTransitionZoomIn => 'Μεγέθυνση'; + + @override + String get viewerTransitionNone => 'Καμία'; + + @override + String get wallpaperTargetHome => 'Αρχική οθόνη'; + + @override + String get wallpaperTargetLock => 'Οθόνη κλειδώματος'; + + @override + String get wallpaperTargetHomeLock => 'Αρχική οθόνη και οθόνη κλειδώματος'; + + @override + String get widgetDisplayedItemRandom => 'Τυχαίο'; + + @override + String get widgetDisplayedItemMostRecent => 'Πιο πρόσφατο'; + + @override + String get widgetOpenPageHome => 'Άνοιγμα αρχικής σελίδας'; + + @override + String get widgetOpenPageCollection => 'Ανοιχτή συλλογή'; + + @override + String get widgetOpenPageViewer => 'Άνοιγμα προβολέα αρχείων'; + + @override + String get widgetTapUpdateWidget => 'Ενημέρωση γραφικού στοιχείου'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Εσωτερικός χώρος αποθήκευσης'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card/Εξωτερικός χώρος αποθήκευσης'; + + @override + String get rootDirectoryDescription => 'Κατάλογος ρίζας'; + + @override + String otherDirectoryDescription(String name) { + return '«$name» κατάλογος'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Παρακαλώ επιλέξτε τον $directory του «$volume» στην επόμενη οθόνη για να δώσετε πρόσβαση στην εφαρμογή.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Αυτή η εφαρμογή δεν επιτρέπεται να τροποποιεί αρχεία στο $directory του «$volume».\n\nΠαρακαλώ χρησιμοποιήστε μια άλλη εφαρμογή διαχείρισης αρχείων ή συλλογή φωτογραφιών για να μετακινήσετε τα στοιχεία αλλού.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Αυτή η λειτουργία χρειάζεται $neededSize ελεύθερου χώρου στο «$volume» για να ολοκληρωθεί, αλλά μόνο $freeSize απομένουν ελεύθερα.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Η εφαρμογή επιλογής αρχείων του δεν βρέθηκε ή είναι απενεργοποιημένη. Ενεργοποιήστε την και δοκιμάστε ξανά.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Αυτή η λειτουργία δεν υποστηρίζεται για τα ακόλουθα αρχεία: $types.', + one: 'Αυτή η λειτουργία δεν υποστηρίζεται για το ακόλουθο αρχείο: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Ορισμένα αρχεία στον φάκελο προορισμού έχουν το ίδιο όνομα.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Ορισμένα αρχεία έχουν το ίδιο όνομα.'; + + @override + String get addShortcutDialogLabel => 'Ετικέτα συντόμευσης'; + + @override + String get addShortcutButtonLabel => 'ΠΡΟΣΘΗΚΗ'; + + @override + String get noMatchingAppDialogMessage => 'Δεν βρέθηκαν εγκατεστημένες εφαρμογές που μπορούν να το κάνουν αυτό.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Μετακίνηση αυτών των $countString στοιχείων στον κάδο ανακύκλωσης;', + one: 'Μετακίνηση αυτού του στοιχείου στον κάδο ανακύκλωσης;', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Διαγραφή αυτών των $countString στοιχείων;', + one: 'Διαγραφή αυτού του στοιχείου;', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Αποθήκευση ημερομηνιών στοιχείων πριν συνεχίσετε;'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Αποθήκευση ημερομηνιών'; + + @override + String videoResumeDialogMessage(String time) { + return 'Συνέχεια αναπαραγωγής από $time?'; + } + + @override + String get videoStartOverButtonLabel => 'ΑΝΑΠΑΡΑΓΩΓΗ ΑΠΟ ΤΗΝ ΑΡΧΗ'; + + @override + String get videoResumeButtonLabel => 'ΣΥΝΕΧΙΣΗ ΑΝΑΠΑΡΑΓΩΓΗΣ'; + + @override + String get setCoverDialogLatest => 'Πιο πρόσφατο στοιχείο'; + + @override + String get setCoverDialogAuto => 'Αυτόματο'; + + @override + String get setCoverDialogCustom => 'Προσαρμοσμένο'; + + @override + String get hideFilterConfirmationDialogMessage => 'Οι φωτογραφίες και τα βίντεο που ταιριάζουν θα κρυφτούν από τη συλλογή σας. Μπορείτε να τα εμφανίσετε ξανά από τις ρυθμίσεις «Απόρρητο».\n\nΕίστε σίγουροι ότι θέλετε να τα κρύψετε;'; + + @override + String get newAlbumDialogTitle => 'Νεο αλμπουμ'; + + @override + String get newAlbumDialogNameLabel => 'Όνομα άλμπουμ'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Το άλμπουμ υπάρχει ήδη'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Η ονομασία υπάρχει ήδη'; + + @override + String get newAlbumDialogStorageLabel => 'Aποθηκευτικός χώρος:'; + + @override + String get newDynamicAlbumDialogTitle => 'Νέο δυναμικό άλμπουμ'; + + @override + String get dynamicAlbumAlreadyExists => 'Το δυναμικό άλμπουμ υπάρχει ήδη'; + + @override + String get newGroupDialogTitle => 'Νέα Ομάδα'; + + @override + String get newGroupDialogNameLabel => 'Όνομα ομάδας'; + + @override + String get groupAlreadyExists => 'Η ομάδα υπάρχει ήδη'; + + @override + String get groupEmpty => 'Όχι ομάδες'; + + @override + String get ungrouped => 'Μη ομαδοποιημένο'; + + @override + String get groupPickerTitle => 'Επιλογή ομάδας'; + + @override + String get groupPickerUseThisGroupButton => 'Χρησιμοποιήστε αυτή την ομάδα'; + + @override + String get newVaultWarningDialogMessage => + 'Τα αρχεία στα θησαυροφυλάκια είναι διαθέσιμα μόνο σε αυτή την εφαρμογή και σε καμία άλλη.\n\nΑν απεγκαταστήσετε την εφαρμογή ή έστω διαγράψετε τα δεδομένα της εφαρμογής, θα χάσετε όλα σας τα κρυφά αρχεία.'; + + @override + String get newVaultDialogTitle => 'Νεο Θησαυροφυλακιο'; + + @override + String get configureVaultDialogTitle => 'Διαμορφωστε το θησαυροφυλακιο'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Κλείδωμα όταν σβήνει η οθόνη'; + + @override + String get vaultDialogLockTypeLabel => 'Τύπος κλειδώματος'; + + @override + String get patternDialogEnter => 'Εισάγετε το μοτίβο'; + + @override + String get patternDialogConfirm => 'Επιβεβαιώστε το μοτίβο'; + + @override + String get pinDialogEnter => 'Εισάγετε το PIN'; + + @override + String get pinDialogConfirm => 'Επιβεβαιώστε το PIN'; + + @override + String get passwordDialogEnter => 'Εισάγετε τον κωδικό πρόσβασης'; + + @override + String get passwordDialogConfirm => 'Επιβεβαιώστε τον κωδικό πρόσβασης'; + + @override + String get authenticateToConfigureVault => 'Πιστοποίηση ταυτότητας για τη διαμόρφωση του θησαυροφυλακίου'; + + @override + String get authenticateToUnlockVault => 'Πιστοποίηση ταυτότητας για να ξεκλειδώσετε το θησαυροφυλάκιο'; + + @override + String get vaultBinUsageDialogMessage => 'Ορισμένα θησαυροφυλάκια χρησιμοποιούν τον κάδο ανακύκλωσης.'; + + @override + String get renameAlbumDialogLabel => 'Νέο όνομα'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Ο κατάλογος υπάρχει ήδη'; + + @override + String get renameEntrySetPageTitle => 'Μετονομασια'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Μοτίβο ονομασίας'; + + @override + String get renameEntrySetPageInsertTooltip => 'Εισαγωγή πεδίου'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Προεπισκοπηση'; + + @override + String get renameProcessorCounter => 'Μετρητής'; + + @override + String get renameProcessorHash => 'Κατακερματισμός'; + + @override + String get renameProcessorName => 'Όνομα'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Διαγράψτε αυτό το άλμπουμ και τα $countString αντικείμενα σε αυτό;', + one: 'Διαγράψτε αυτό το άλμπουμ και το αντικείμενο σε αυτό;', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Διαγράψτε αυτά τα άλμπουμ και τα $countString αντικείμενα σε αυτά;', + one: 'Διαγράψτε αυτά τα άλμπουμ και τα αντικείμενα σε αυτά;', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Μορφή:'; + + @override + String get exportEntryDialogWidth => 'Πλάτος'; + + @override + String get exportEntryDialogHeight => 'Ύψος'; + + @override + String get exportEntryDialogQuality => 'Ποιότητα'; + + @override + String get exportEntryDialogWriteMetadata => 'Εγγραφή μεταδεδομένων'; + + @override + String get renameEntryDialogLabel => 'Νέο όνομα'; + + @override + String get editEntryDialogCopyFromItem => 'Αντιγραφή από άλλο στοιχείο'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Πεδία προς τροποποίηση'; + + @override + String get editEntryDateDialogTitle => 'Ημερομηνια & Ώρα'; + + @override + String get editEntryDateDialogSetCustom => 'Ορισμός προσαρμοσμένης ημερομηνίας'; + + @override + String get editEntryDateDialogCopyField => 'Αντιγραφή από άλλη ημερομηνία'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Εξαγωγή από το όνομα του κάθε αρχείου'; + + @override + String get editEntryDateDialogShift => 'Μετατόπιση'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Ημερομηνία τροποποίησης αρχείου'; + + @override + String get durationDialogHours => 'Ώρες'; + + @override + String get durationDialogMinutes => 'Λεπτά'; + + @override + String get durationDialogSeconds => 'Δευτερόλεπτα'; + + @override + String get editEntryLocationDialogTitle => 'Τοποθεσια'; + + @override + String get editEntryLocationDialogSetCustom => 'Ορισμός προσαρμοσμένης τοποθεσίας'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Επιλογή στο χάρτη'; + + @override + String get editEntryLocationDialogImportGpx => 'Εισαγωγή GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Γεωγραφικό πλάτος'; + + @override + String get editEntryLocationDialogLongitude => 'Γεωγραφικό μήκος'; + + @override + String get editEntryLocationDialogTimeShift => 'Χρονική μετατόπιση'; + + @override + String get locationPickerUseThisLocationButton => 'Χρησιμοποίηση της τοποθεσίας'; + + @override + String get editEntryRatingDialogTitle => 'Βαθμολογια'; + + @override + String get removeEntryMetadataDialogTitle => 'Αφαιρεση μεταδεδομενων'; + + @override + String get removeEntryMetadataDialogAll => 'Όλα'; + + @override + String get removeEntryMetadataDialogMore => 'Περισσότερα'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'Απαιτείται XMP για την αναπαραγωγή του βίντεο μέσα σε μια κινούμενη φωτογραφία.\n\nΕίστε βέβαιοι ότι θέλετε να αφαιρεθεί;'; + + @override + String get videoSpeedDialogLabel => 'Ταχύτητα αναπαραγωγής'; + + @override + String get videoStreamSelectionDialogVideo => 'Βίντεο'; + + @override + String get videoStreamSelectionDialogAudio => 'Ήχος'; + + @override + String get videoStreamSelectionDialogText => 'Υπότιτλοι'; + + @override + String get videoStreamSelectionDialogOff => 'Απενεργοποίηση'; + + @override + String get videoStreamSelectionDialogTrack => 'Κομμάτι'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Δεν υπάρχουν άλλα κομμάτια.'; + + @override + String get genericSuccessFeedback => 'Ολοκληρώθηκε!'; + + @override + String get genericFailureFeedback => 'Απέτυχε'; + + @override + String get genericDangerWarningDialogMessage => 'Είστε βέβαιοι;'; + + @override + String get tooManyItemsErrorDialogMessage => 'Δοκιμάστε ξανά με λιγότερα αρχεία.'; + + @override + String get menuActionConfigureView => 'Προβολή'; + + @override + String get menuActionSelect => 'Επιλογή'; + + @override + String get menuActionSelectAll => 'Επιλογή όλων'; + + @override + String get menuActionSelectNone => 'Να μην επιλεγεί κανένα'; + + @override + String get menuActionMap => 'Χάρτης'; + + @override + String get menuActionSlideshow => 'Παρουσίαση φωτογραφιών'; + + @override + String get menuActionStats => 'Στατιστικά'; + + @override + String get viewDialogSortSectionTitle => 'Ταξινομηση'; + + @override + String get viewDialogGroupSectionTitle => 'Τμήματα'; + + @override + String get viewDialogLayoutSectionTitle => 'Διαταξη'; + + @override + String get viewDialogReverseSortOrder => 'Αντίστροφη σειρά ταξινόμησης'; + + @override + String get tileLayoutMosaic => 'Ψηφιδωτό'; + + @override + String get tileLayoutGrid => 'Πλέγμα'; + + @override + String get tileLayoutList => 'Λίστα'; + + @override + String get castDialogTitle => 'Συσκευές Απεικόνισης'; + + @override + String get coverDialogTabCover => 'Εξώφυλλο'; + + @override + String get coverDialogTabApp => 'Εφαρμογή'; + + @override + String get coverDialogTabColor => 'Χρώμα'; + + @override + String get appPickDialogTitle => 'Επιλογη εφαρμογης'; + + @override + String get appPickDialogNone => 'Καμία επιλογή'; + + @override + String get aboutPageTitle => 'Διαφορα'; + + @override + String get aboutLinkLicense => 'Άδειες'; + + @override + String get aboutLinkPolicy => 'Πολιτική Απορρήτου'; + + @override + String get aboutBugSectionTitle => 'Αναφορα σφαλματος'; + + @override + String get aboutBugSaveLogInstruction => 'Αποθήκευση των αρχείων καταγραφής της εφαρμογής σε ένα ξεχωριστό αρχείο'; + + @override + String get aboutBugCopyInfoInstruction => 'Αντιγραφή πληροφοριών του συστήματος'; + + @override + String get aboutBugCopyInfoButton => 'Αντιγραφή'; + + @override + String get aboutBugReportInstruction => 'Αναφορά στο GitHub με τα αρχεία καταγραφής και τις πληροφορίες του συστήματος'; + + @override + String get aboutBugReportButton => 'Αναφορά'; + + @override + String get aboutDataUsageSectionTitle => 'Χρήση δεδομένων'; + + @override + String get aboutDataUsageData => 'Δεδομένα'; + + @override + String get aboutDataUsageCache => 'Κρυφή μνήμη'; + + @override + String get aboutDataUsageDatabase => 'Βάση δεδομένων'; + + @override + String get aboutDataUsageMisc => 'Διάφορα στοιχεία'; + + @override + String get aboutDataUsageInternal => 'Εσωτερικά'; + + @override + String get aboutDataUsageExternal => 'Εξωτερικά'; + + @override + String get aboutDataUsageClearCache => 'Εκκαθάριση μνήμης'; + + @override + String get aboutCreditsSectionTitle => 'Αναφορες'; + + @override + String get aboutCreditsWorldAtlas1 => 'Αυτή η εφαρμογή χρησιμοποιεί ένα αρχείο TopoJSON από'; + + @override + String get aboutCreditsWorldAtlas2 => 'υπό την άδεια ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'Μεταφραστες'; + + @override + String get aboutLicensesSectionTitle => 'Αδειες ανοιχτου κωδικα'; + + @override + String get aboutLicensesBanner => 'Αυτή η εφαρμογή χρησιμοποιεί τα ακόλουθα πακέτα και βιβλιοθήκες ανοιχτού κώδικα.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Βιβλιοθηκες Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Προσθετα Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Πακετα Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Πακετα Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Εμφάνιση όλων των αδειών'; + + @override + String get policyPageTitle => 'Πολιτικη απορρητου'; + + @override + String get collectionPageTitle => 'Συλλογη'; + + @override + String get collectionPickPageTitle => 'Διαλεξτε'; + + @override + String get collectionSelectPageTitle => 'Επιλογη στοιχειων'; + + @override + String get collectionActionShowTitleSearch => 'Εμφάνιση φίλτρου τίτλου'; + + @override + String get collectionActionHideTitleSearch => 'Απόκρυψη φίλτρου τίτλου'; + + @override + String get collectionActionAddDynamicAlbum => 'Προσθήκη δυναμικού άλμπουμ'; + + @override + String get collectionActionAddShortcut => 'Προσθήκη συντόμευσης'; + + @override + String get collectionActionSetHome => 'Ορίστε ως σπίτι'; + + @override + String get collectionActionEmptyBin => 'Καθαρισμός του κάδου ανακύκλωσης'; + + @override + String get collectionActionCopy => 'Αντιγραφή στο άλμπουμ'; + + @override + String get collectionActionMove => 'Μετακίνηση στο άλμπουμ'; + + @override + String get collectionActionRescan => 'Εκ νέου σάρωση'; + + @override + String get collectionActionEdit => 'Επεξεργασία'; + + @override + String get collectionSearchTitlesHintText => 'Αναζήτηση τίτλων'; + + @override + String get collectionGroupAlbum => 'Ανά άλμπουμ'; + + @override + String get collectionGroupMonth => 'Ανά μήνα'; + + @override + String get collectionGroupDay => 'Ανά ημέρα'; + + @override + String get sectionNone => 'Όχι τμήματα'; + + @override + String get sectionUnknown => 'Χωρίς λεπτομέρειες'; + + @override + String get dateToday => 'Σήμερα'; + + @override + String get dateYesterday => 'Εχθές'; + + @override + String get dateThisMonth => 'Αυτό το μήνα'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Αποτυχία διαγραφής των $countString στοιχείων', + one: 'Αποτυχία διαγραφής του στοιχείου', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Αποτυχία αντιγραφής των $countString στοιχείων', + one: 'Αποτυχία αντιγραφής του στοιχείου', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Αποτυχία μετακίνησης των $countString στοιχείων', + one: 'Αποτυχία μετακίνησης του στοιχείου', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Αποτυχία μετονομασίας των $countString στοιχείων', + one: 'Αποτυχία μετονομασίας του στοιχείου', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Απέτυχε η επεξεργασία των $countString στοιχείων', + one: 'Απέτυχε η επεξεργασία του στοιχείου', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Απέτυχε η εξαγωγή των $countString σελίδων', + one: 'Απέτυχε η εξαγωγή της σελίδας', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Αντιγράφηκαν τα $countString στοιχεία', + one: 'Αντιγράφηκε το στοιχείο', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Μετακινήθηκαν τα $countString στοιχεία', + one: 'Μετακινήθηκε το στοιχείο', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Μετονομάστηκαν τα $countString στοιχεία', + one: 'Μετονομάστηκε το στοιχείο', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Επεξεργάστηκαν τα $countString στοιχεία', + one: 'Επεξεργάστηκε το στοιχείο', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Δεν έχουν καταχωρηθεί αγαπημένα στοιχεία'; + + @override + String get collectionEmptyVideos => 'Δεν υπάρχουν βίντεο'; + + @override + String get collectionEmptyImages => 'Δεν υπάρχουν εικόνες'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Παραχώρηση πρόσβασης'; + + @override + String get collectionSelectSectionTooltip => 'Επιλέξτε ενότητα'; + + @override + String get collectionDeselectSectionTooltip => 'Αφαιρέστε ενότητα'; + + @override + String get drawerAboutButton => 'Διάφορα'; + + @override + String get drawerSettingsButton => 'Ρυθμίσεις'; + + @override + String get drawerCollectionAll => 'Όλη η συλλογή'; + + @override + String get drawerCollectionFavourites => 'Αγαπημένα'; + + @override + String get drawerCollectionImages => 'Εικόνες'; + + @override + String get drawerCollectionVideos => 'Βίντεο'; + + @override + String get drawerCollectionAnimated => 'Κινούμενα'; + + @override + String get drawerCollectionMotionPhotos => 'Φωτογραφίες με κίνηση'; + + @override + String get drawerCollectionPanoramas => 'Πανοραμικές'; + + @override + String get drawerCollectionRaws => 'Raw φωτογραφίες'; + + @override + String get drawerCollectionSphericalVideos => 'Βίντεο 360°'; + + @override + String get drawerAlbumPage => 'Άλμπουμ'; + + @override + String get drawerCountryPage => 'Χώρες'; + + @override + String get drawerPlacePage => 'Μέρη'; + + @override + String get drawerTagPage => 'Ετικέτες'; + + @override + String get sortByDate => 'Ανά ημερομηνία'; + + @override + String get sortByName => 'Ανά όνομα'; + + @override + String get sortByItemCount => 'Ανά μέτρηση στοιχείων'; + + @override + String get sortBySize => 'Ανά μέγεθος'; + + @override + String get sortByAlbumFileName => 'Ανά τίτλο άλμπουμ και αντικειμένου'; + + @override + String get sortByRating => 'Ανά βαθμολογία'; + + @override + String get sortByDuration => 'Με διάρκεια'; + + @override + String get sortByPath => 'Από τη διαδρομή'; + + @override + String get sortOrderNewestFirst => 'Τα πιο πρόσφατα πρώτα'; + + @override + String get sortOrderOldestFirst => 'Τα παλαιότερα πρώτα'; + + @override + String get sortOrderAtoZ => 'Α έως Ω'; + + @override + String get sortOrderZtoA => 'Ω έως Α'; + + @override + String get sortOrderHighestFirst => 'Υψηλότερη βαθμολογία πρώτα'; + + @override + String get sortOrderLowestFirst => 'Χαμηλότερη βαθμολογία πρώτα'; + + @override + String get sortOrderLargestFirst => 'Τα μεγαλύτερα πρώτα'; + + @override + String get sortOrderSmallestFirst => 'Τα μικρότερα πρώτα'; + + @override + String get sortOrderShortestFirst => 'Ο συντομότερος πρώτος'; + + @override + String get sortOrderLongestFirst => 'Μακρύτερο πρώτο'; + + @override + String get albumGroupTier => 'Ανά βαθμίδα'; + + @override + String get albumGroupType => 'Ανά τύπο'; + + @override + String get albumGroupVolume => 'Ανά αποθηκευτική μονάδα'; + + @override + String get albumMimeTypeMixed => 'Μικτα'; + + @override + String get albumPickPageTitleCopy => 'Αντιγραφή στο άλμπουμ'; + + @override + String get albumPickPageTitleExport => 'Εξαγωγή στο άλμπουμ'; + + @override + String get albumPickPageTitleMove => 'Μετακίνηση στο άλμπουμ'; + + @override + String get albumPickPageTitlePick => 'Επιλογή άλμπουμ'; + + @override + String get albumCamera => 'Κάμερα'; + + @override + String get albumDownload => 'Λήψεις'; + + @override + String get albumScreenshots => 'Στιγμιότυπα οθόνης'; + + @override + String get albumScreenRecordings => 'Εγγραφές οθόνης'; + + @override + String get albumVideoCaptures => 'Στιγμιότυπα οθόνης από βίντεο'; + + @override + String get albumPageTitle => 'Άλμπουμ'; + + @override + String get albumEmpty => 'Δεν υπάρχουν άλμπουμ'; + + @override + String get createAlbumButtonLabel => 'ΔΗΜΙΟΥΡΓΙΑ'; + + @override + String get newFilterBanner => 'Νέα'; + + @override + String get countryPageTitle => 'Χωρες'; + + @override + String get countryEmpty => 'Δεν έχουν καταχωρηθεί χώρες'; + + @override + String get statePageTitle => 'Πολιτειες'; + + @override + String get stateEmpty => 'Χωρίς πολιτεία'; + + @override + String get placePageTitle => 'Μερη'; + + @override + String get placeEmpty => 'Χωρίς μέρος'; + + @override + String get tagPageTitle => 'Ετικετες'; + + @override + String get tagEmpty => 'Δεν έχουν καταχωρηθεί ετικέτες'; + + @override + String get tagPickPageTitle => 'Επιλογή ετικέτας'; + + @override + String get binPageTitle => 'Καδος ανακυκλωσης'; + + @override + String get explorerPageTitle => 'Εξερεύνηση'; + + @override + String get explorerActionSelectStorageVolume => 'Επιλέξτε αποθηκευτικό χώρο'; + + @override + String get selectStorageVolumeDialogTitle => 'Επιλέξτε Αποθήκευση'; + + @override + String get searchCollectionFieldHint => 'Αναζήτηση στην συλλογή'; + + @override + String get searchRecentSectionTitle => 'Προσφατα'; + + @override + String get searchDateSectionTitle => 'Ημερομηνια'; + + @override + String get searchFormatSectionTitle => 'Μορφές'; + + @override + String get searchAlbumsSectionTitle => 'Άλμπουμ'; + + @override + String get searchCountriesSectionTitle => 'Χωρες'; + + @override + String get searchStatesSectionTitle => 'Πολιτειες'; + + @override + String get searchPlacesSectionTitle => 'Μερη'; + + @override + String get searchTagsSectionTitle => 'Ετικετες'; + + @override + String get searchRatingSectionTitle => 'Βαθμολογιες'; + + @override + String get searchMetadataSectionTitle => 'Μεταδεδομενα'; + + @override + String get settingsPageTitle => 'Ρυθμισεις'; + + @override + String get settingsSystemDefault => 'Σύστημα'; + + @override + String get settingsDefault => 'Προεπιλογή'; + + @override + String get settingsDisabled => 'Απενεργοποιημένο'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ρωτήστε με κάθε φορά'; + + @override + String get settingsModificationWarningDialogMessage => 'Άλλες ρυθμίσεις θα τροποποιηθούν.'; + + @override + String get settingsSearchFieldLabel => 'Αναζήτηση ρυθμίσεων'; + + @override + String get settingsSearchEmpty => 'Δεν υπάρχει αντίστοιχη ρύθμιση'; + + @override + String get settingsActionExport => 'Εξαγωγή'; + + @override + String get settingsActionExportDialogTitle => 'Εξαγωγη'; + + @override + String get settingsActionImport => 'Εισαγωγή'; + + @override + String get settingsActionImportDialogTitle => 'Εισαγωγη'; + + @override + String get appExportCovers => 'Εξώφυλλα'; + + @override + String get appExportDynamicAlbums => 'Δυναμικά άλμπουμ'; + + @override + String get appExportFavourites => 'Αγαπημένα'; + + @override + String get appExportSettings => 'Ρυθμίσεις'; + + @override + String get settingsNavigationSectionTitle => 'Πλοηγηση'; + + @override + String get settingsHomeTile => 'Αρχική σελίδα της εφαρμογής'; + + @override + String get settingsHomeDialogTitle => 'Αρχικη σελιδα της εφαρμογης'; + + @override + String get setHomeCustom => 'Προσαρμοσμένο'; + + @override + String get settingsKeepScreenOnTile => 'Διατήρηση της οθόνης ενεργοποιημένη'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Διατηρηση της Οθονης Ενεργοποιημενη'; + + @override + String get settingsDoubleBackExit => 'Αγγίξτε το «πίσω» δύο φορές για έξοδο'; + + @override + String get settingsConfirmationTile => 'Παράθυρα επιβεβαίωσης'; + + @override + String get settingsConfirmationDialogTitle => 'Παραθυρα Επιβεβαιωσης'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ερώτηση πριν διαγραφούν στοιχεία οριστικά'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ερώτηση πριν μεταφερθούν στοιχεία στον κάδο ανακύκλωσης'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ερώτηση πριν μεταφερθούν στοιχεία χωρίς ημερομηνία'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Εμφάνιση μηνύματος μετά τη μεταφορά στοιχείων στον κάδο ανακύκλωσης'; + + @override + String get settingsConfirmationVaultDataLoss => 'Εμφάνιση προειδοποίησης απώλειας δεδομένων θησαυροφυλακίου'; + + @override + String get settingsNavigationDrawerTile => 'Μενού πλοήγησης'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Μενου Πλοηγησης'; + + @override + String get settingsNavigationDrawerBanner => 'Αγγίξτε παρατεταμένα για να μετακινήσετε και να αναδιατάξετε τα στοιχεία του μενού.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Τύποι'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Άλμπουμ'; + + @override + String get settingsNavigationDrawerTabPages => 'Σελίδες'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Προσθήκη άλμπουμ'; + + @override + String get settingsNavigationBottomActionsTile => 'Κάτω πλοήγηση'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Κάτω Πλοήγηση'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Πατήστε και κρατήστε πατημένο για να μετακινήσετε τα κουμπιά και να επιλέξετε ποιες ενέργειες θα εμφανίζονται στην κάτω γραμμή πλοήγησης.'; + + @override + String get settingsThumbnailSectionTitle => 'Μικρογραφιες'; + + @override + String get settingsThumbnailOverlayTile => 'Βοηθητικές πληροφορίες'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Βοηθητικές πληροφοριες'; + + @override + String get settingsThumbnailShowHdrIcon => 'Εμφάνιση εικονιδίου HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Εμφάνιση εικονιδίου για αγαπημένο'; + + @override + String get settingsThumbnailShowTagIcon => 'Εμφάνιση εικονιδίου για ετικέτα'; + + @override + String get settingsThumbnailShowLocationIcon => 'Εμφάνιση εικονιδίου για τοποθεσία'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Εμφάνιση εικονιδίου για φωτογραφία με κίνηση'; + + @override + String get settingsThumbnailShowRating => 'Εμφάνιση βαθμολογίας'; + + @override + String get settingsThumbnailShowRawIcon => 'Εμφάνιση εικονιδίου για raw στοιχεία'; + + @override + String get settingsThumbnailShowVideoDuration => 'Εμφάνιση διάρκειας βίντεο'; + + @override + String get settingsCollectionQuickActionsTile => 'Γρήγορες ενέργειες'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Γρηγορες Ενεργειες'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Περιήγηση'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Επιλογή'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Αγγίξτε παρατεταμένα για να μετακινήσετε τα κουμπιά και επιλέξτε ποιες ενέργειες θα εμφανίζονται κατά την περιήγηση στοιχείων.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Αγγίξτε παρατεταμένα για να μετακινήσετε τα κουμπιά και επιλέξτε ποιες ενέργειες θα εμφανίζονται κατά την επιλογή στοιχείων.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Εμφάνιση μοτίβων'; + + @override + String get settingsCollectionBurstPatternsNone => 'Χωρίς'; + + @override + String get settingsViewerSectionTitle => 'Προβολη'; + + @override + String get settingsViewerGestureSideTapNext => 'Πατήστε στις άκρες της οθόνης για να εμφανίσετε το προηγούμενο/επόμενο στοιχείο'; + + @override + String get settingsViewerUseCutout => 'Χρησιμοποιήστε την περιοχή αποκοπής'; + + @override + String get settingsViewerMaximumBrightness => 'Μέγιστη φωτεινότητα'; + + @override + String get settingsMotionPhotoAutoPlay => 'Αυτόματη αναπαραγωγή φωτογραφιών κίνησης'; + + @override + String get settingsImageBackground => 'Φόντο κατά την προβολή στοιχείων'; + + @override + String get settingsViewerQuickActionsTile => 'Γρήγορες ενέργειες'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Γρηγορες Ενεργειες'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Αγγίξτε παρατεταμένα για να μετακινήσετε τα κουμπιά και επιλέξτε ποιες ενέργειες θα εμφανίζονται κατά την προβολή.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Εμφανιζομενα κουμπια'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Διαθεσιμα κουμπια'; + + @override + String get settingsViewerQuickActionEmpty => 'Χωρίς κουμπιά'; + + @override + String get settingsViewerOverlayTile => 'Επικάλυψη'; + + @override + String get settingsViewerOverlayPageTitle => 'Επικαλυψη'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Εμφάνιση κατά το άνοιγμα'; + + @override + String get settingsViewerShowHistogram => 'Εμφάνιση ιστογράμματος'; + + @override + String get settingsViewerShowMinimap => 'Εμφάνιση μικρού χάρτη'; + + @override + String get settingsViewerShowZoomLevel => 'Εμφάνιση επιπέδου μεγέθυνσης'; + + @override + String get settingsViewerShowInformation => 'Εμφάνιση πληροφοριών'; + + @override + String get settingsViewerShowInformationSubtitle => 'Εμφάνιση ονομασίας, ημερομηνίας, τοποθεσίας κ.λπ.'; + + @override + String get settingsViewerShowRatingTags => 'Εμφάνιση βαθμολογίας & ετικετών'; + + @override + String get settingsViewerShowShootingDetails => 'Εμφάνιση λεπτομερειών λήψης'; + + @override + String get settingsViewerShowDescription => 'Εμφάνιση περιγραφής'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Εμφάνιση μικρογραφιών'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Εφέ θαμπώματος'; + + @override + String get settingsViewerSlideshowTile => 'Παρουσίαση φωτογραφιών'; + + @override + String get settingsViewerSlideshowPageTitle => 'Παρουσιαση φωτογραφιων'; + + @override + String get settingsSlideshowRepeat => 'Επανάληψη'; + + @override + String get settingsSlideshowShuffle => 'Τυχαία σειρά'; + + @override + String get settingsSlideshowFillScreen => 'Χρησιμοποίηση πλήρης οθόνης'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Εφέ κινούμενου ζουμ'; + + @override + String get settingsSlideshowTransitionTile => 'Μετάβαση'; + + @override + String get settingsSlideshowIntervalTile => 'Διάστημα'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Αναπαραγωγή βίντεο'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Αναπαραγωγη Βιντεο'; + + @override + String get settingsVideoPageTitle => 'Ρυθμισεις Βιντεο'; + + @override + String get settingsVideoSectionTitle => 'Βιντεο'; + + @override + String get settingsVideoShowVideos => 'Εμφάνιση των βίντεο στη συλλογή'; + + @override + String get settingsVideoPlaybackTile => 'Αναπαραγωγή'; + + @override + String get settingsVideoPlaybackPageTitle => 'Αναπαραγωγη'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Επιτάχυνση υλισμικού'; + + @override + String get settingsVideoAutoPlay => 'Αυτόματη αναπαραγωγή κατά το άνοιγμα'; + + @override + String get settingsVideoLoopModeTile => 'Επανάληψη αυτόματα στο τέλος κάθε βίντεο'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Επαναληψη Αυτοματα στο Τελος Καθε Βιντεο'; + + @override + String get settingsVideoResumptionModeTile => 'Συνέχιση αναπαραγωγής'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Συνεχιση αναπαραγωγης'; + + @override + String get settingsVideoBackgroundMode => 'Αναπαραγωγή στο παρασκήνιο'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Αναπαραγωγη στο παρασκηνιο'; + + @override + String get settingsVideoControlsTile => 'Έλεγχος'; + + @override + String get settingsVideoControlsPageTitle => 'Ελεγχος'; + + @override + String get settingsVideoButtonsTile => 'Κουμπιά'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Αγγίξτε την οθόνη δύο φορές για αναπαραγωγή/παύση'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Αγγίξτε δύο φορές τις άκρες της οθόνης για να πάτε πίσω/εμπρός'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Σύρετε προς τα πάνω ή προς τα κάτω για να ρυθμίσετε τη φωτεινότητα/την ένταση του ήχου'; + + @override + String get settingsSubtitleThemeTile => 'Υπότιτλοι'; + + @override + String get settingsSubtitleThemePageTitle => 'Υποτιτλοι'; + + @override + String get settingsSubtitleThemeSample => 'Αυτό είναι ένα δείγμα.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Στοίχιση κειμένου'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Στοιχιση Κειμενου'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Θέση κειμένου'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Θεση κειμενου'; + + @override + String get settingsSubtitleThemeTextSize => 'Μέγεθος κειμένου'; + + @override + String get settingsSubtitleThemeShowOutline => 'Εμφάνιση περιγράμματος και σκιάς'; + + @override + String get settingsSubtitleThemeTextColor => 'Χρώμα κειμένου'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Αδιαφάνεια κειμένου'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Χρώμα του φόντου'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Αδιαφάνεια φόντου'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Αριστερά'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Κέντρο'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Δεξιά'; + + @override + String get settingsPrivacySectionTitle => 'Απορρητο'; + + @override + String get settingsAllowInstalledAppAccess => 'Να επιτρέπεται η πρόσβαση στον κατάλογο εγκατεστημένων εφαρμογών της συσκευής'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Χρησιμοποιείται για τη βελτίωση της εμφάνισης των στοιχείων από τα άλμπουμ'; + + @override + String get settingsAllowErrorReporting => 'Να επιτρέπεται η ανώνυμη αναφορά σφαλμάτων'; + + @override + String get settingsSaveSearchHistory => 'Αποθήκευση ιστορικού αναζήτησης'; + + @override + String get settingsEnableBin => 'Χρησιμοποίηση κάδου ανακύκλωσης'; + + @override + String get settingsEnableBinSubtitle => 'Διατήρηση των διαγραμμένων στοιχείων για 30 ημέρες'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Τα αρχεία στον κάδο ανακύκλωσης θα διαγραφούν για πάντα.'; + + @override + String get settingsAllowMediaManagement => 'Επιτρέψτε την πλήρη διαχείριση των αρχείων σας'; + + @override + String get settingsHiddenItemsTile => 'Κρυφά στοιχεία'; + + @override + String get settingsHiddenItemsPageTitle => 'Κρυφα Στοιχεια'; + + @override + String get settingsHiddenFiltersBanner => 'Οι φωτογραφίες και τα βίντεο που είναι κρυφά δεν θα εμφανίζονται στη συλλογή σας.'; + + @override + String get settingsHiddenFiltersEmpty => 'Χωρίς κρυφά φίλτρα'; + + @override + String get settingsStorageAccessTile => 'Πρόσβαση στον χώρο αποθήκευσης'; + + @override + String get settingsStorageAccessPageTitle => 'Προσβαση στον Χωρο Αποθηκευσης'; + + @override + String get settingsStorageAccessBanner => 'Ορισμένοι κατάλογοι απαιτούν ρητή άδεια πρόσβασης για την τροποποίηση των αρχείων που βρίσκονται σε αυτούς. Μπορείτε να δείτε εδώ τους καταλόγους στους οποίους έχετε ήδη χορηγήσει πρόσβαση.'; + + @override + String get settingsStorageAccessEmpty => 'Δεν έχει χορηγηθεί πρόσβαση'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Ανάκληση χορήγησης πρόσβασης'; + + @override + String get settingsAccessibilitySectionTitle => 'Προσβασιμοτητα'; + + @override + String get settingsRemoveAnimationsTile => 'Κατάργηση κινούμενων εικόνων'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Καταργηση Κινουμενων Εικονων'; + + @override + String get settingsTimeToTakeActionTile => 'Χρόνος λήψης ενεργειών'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Εμφάνιση χειρονομιών πολλαπλής αφής'; + + @override + String get settingsDisplaySectionTitle => 'Οθονη'; + + @override + String get settingsThemeBrightnessTile => 'Θέμα'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Θεμα'; + + @override + String get settingsThemeColorHighlights => 'Χρωματιστά εικονίδια'; + + @override + String get settingsThemeEnableDynamicColor => 'Έντονο χρώμα'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Εμφάνιση ρυθμού ανανέωσης'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Ρυθμος ανανεωσης'; + + @override + String get settingsDisplayUseTvInterface => 'Χρήση του Android TV περιβάλλον'; + + @override + String get settingsLanguageSectionTitle => 'Γλωσσα & Μορφες'; + + @override + String get settingsLanguageTile => 'Γλώσσα'; + + @override + String get settingsLanguagePageTitle => 'Γλωσσα'; + + @override + String get settingsCoordinateFormatTile => 'Μορφή συντεταγμένων'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Μορφη Συντεταγμενων'; + + @override + String get settingsUnitSystemTile => 'Σύστημα μέτρησης'; + + @override + String get settingsUnitSystemDialogTitle => 'Συστημα μετρησης'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Δύναμη αραβικών αριθμών'; + + @override + String get settingsScreenSaverPageTitle => 'Προφυλαξη οθονης'; + + @override + String get settingsWidgetPageTitle => 'Κορνιζα'; + + @override + String get settingsWidgetShowOutline => 'Περίγραμμα'; + + @override + String get settingsWidgetOpenPage => 'Όταν πατάτε στο γραφικό στοιχείο'; + + @override + String get settingsWidgetDisplayedItem => 'Εμφανιζόμενο αρχείο'; + + @override + String get settingsCollectionTile => 'Συλλογή'; + + @override + String get statsPageTitle => 'Στατιστικα'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString στοιχεία με τοποθεσία', + one: '1 στοιχείο με τοποθεσία', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Κορυφαιες Χωρες'; + + @override + String get statsTopStatesSectionTitle => 'Κορυφαιες Πολιτειες'; + + @override + String get statsTopPlacesSectionTitle => 'Κορυφαια Μερη'; + + @override + String get statsTopTagsSectionTitle => 'Κορυφαιες Ετικετες'; + + @override + String get statsTopAlbumsSectionTitle => 'Κορυφαια Αλμπουμ'; + + @override + String get viewerOpenPanoramaButtonLabel => 'Άνοιγμα πανοραμικών'; + + @override + String get viewerSetWallpaperButtonLabel => 'ΟΡΙΣΜΟΣ ΤΑΠΕΤΣΑΡΙΑΣ'; + + @override + String get viewerErrorUnknown => 'Ωχ!'; + + @override + String get viewerErrorDoesNotExist => 'Το αρχείο δεν υπάρχει πλέον.'; + + @override + String get viewerInfoPageTitle => 'Πληροφοριες'; + + @override + String get viewerInfoBackToViewerTooltip => 'Επιστροφή στην προβολή'; + + @override + String get viewerInfoUnknown => 'Άγνωστο'; + + @override + String get viewerInfoLabelDescription => 'Περιγραφή'; + + @override + String get viewerInfoLabelTitle => 'Όνομα'; + + @override + String get viewerInfoLabelDate => 'Ημερομηνία'; + + @override + String get viewerInfoLabelResolution => 'Ανάλυση'; + + @override + String get viewerInfoLabelSize => 'Μέγεθος'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Διαδρομή'; + + @override + String get viewerInfoLabelDuration => 'Διάρκεια'; + + @override + String get viewerInfoLabelOwner => 'Κάτοχος'; + + @override + String get viewerInfoLabelCoordinates => 'Συντεταγμένες'; + + @override + String get viewerInfoLabelAddress => 'Διεύθυνση'; + + @override + String get mapStyleDialogTitle => 'Στυλ χαρτη'; + + @override + String get mapStyleDialogAddStyle => 'Προσθέστε στυλ'; + + @override + String get mapStyleTooltip => 'Επιλέξτε στυλ χάρτη'; + + @override + String get mapStyleEditorDialogName => 'Όνομα'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'Πρόγραμμα-χρήστη'; + + @override + String get mapZoomInTooltip => 'Μεγέθυνση'; + + @override + String get mapZoomOutTooltip => 'Σμίκρυνση'; + + @override + String get mapPointNorthUpTooltip => 'Εμφάνιση του βορρά στην κορυφή'; + + @override + String get mapAttributionOsmData => 'Δεδομένα χάρτη © [OpenStreetMap](https://www.openstreetmap.org/copyright) συνεισφέροντες'; + + @override + String get mapAttributionOsmLiberty => 'Πλακάκια από [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Φιλοξενείται από [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Πλακάκια από [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Πλακάκια από [HOT](https://www.hotosm.org/) • Φιλοξενείται από [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Πλακάκια από [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Προβολή στη σελίδα του χάρτη'; + + @override + String get mapEmptyRegion => 'Δεν υπάρχουν εικόνες σε αυτήν την περιοχή'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Αποτυχία εξαγωγής ενσωματωμένων δεδομένων'; + + @override + String get viewerInfoOpenLinkText => 'Άνοιγμα'; + + @override + String get viewerInfoViewXmlLinkText => 'Προβολή του αρχείου XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Αναζήτηση μεταδεδομένων'; + + @override + String get viewerInfoSearchEmpty => 'Δεν ταιριάζουν τα κλειδιά'; + + @override + String get viewerInfoSearchSuggestionDate => 'Ημερομηνία & Ώρα'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Περιγραφή'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Διαστάσεις'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Ανάλυση'; + + @override + String get viewerInfoSearchSuggestionRights => 'Δικαιώματα'; + + @override + String get wallpaperUseScrollEffect => 'Εφέ κύλισης στην αρχική οθόνη'; + + @override + String get tagEditorPageTitle => 'Επεξεργασια Ετικετων'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Νέα ετικέτα'; + + @override + String get tagEditorPageAddTagTooltip => 'Προσθήκη ετικέτας'; + + @override + String get tagEditorSectionRecent => 'Πρόσφατα'; + + @override + String get tagEditorSectionPlaceholders => 'Καταχώρηση τοποθεσίας'; + + @override + String get tagEditorDiscardDialogMessage => 'Θέλετε να απορρίψετε τις αλλαγές;'; + + @override + String get tagPlaceholderCountry => 'Χώρα'; + + @override + String get tagPlaceholderState => 'Πολιτεία'; + + @override + String get tagPlaceholderPlace => 'Μέρος'; + + @override + String get panoramaEnableSensorControl => 'Ενεργοποίηση ελέγχου αισθητήρα'; + + @override + String get panoramaDisableSensorControl => 'Απενεργοποίηση ελέγχου αισθητήρα'; + + @override + String get sourceViewerPageTitle => 'Πηγη'; +} diff --git a/lib/l10ngen/app_localizations_en.dart b/lib/l10ngen/app_localizations_en.dart new file mode 100644 index 0000000..a6212ce --- /dev/null +++ b/lib/l10ngen/app_localizations_en.dart @@ -0,0 +1,4838 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for English (`en`). +class AppLocalizationsEn extends AppLocalizations { + AppLocalizationsEn([String locale = 'en']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Welcome to Aves'; + + @override + String get welcomeOptional => 'Optional'; + + @override + String get welcomeTermsToggle => 'I agree to the terms and conditions'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items', + one: '$countString item', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString columns', + one: '$countString column', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString seconds', + one: '$countString second', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutes', + one: '$countString minute', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString days', + one: '$countString day', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APPLY'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'DELETE'; + + @override + String get nextButtonLabel => 'NEXT'; + + @override + String get showButtonLabel => 'SHOW'; + + @override + String get hideButtonLabel => 'HIDE'; + + @override + String get continueButtonLabel => 'CONTINUE'; + + @override + String get saveCopyButtonLabel => 'SAVE COPY'; + + @override + String get applyTooltip => 'Apply'; + + @override + String get cancelTooltip => 'Cancel'; + + @override + String get changeTooltip => 'Change'; + + @override + String get clearTooltip => 'Clear'; + + @override + String get previousTooltip => 'Previous'; + + @override + String get nextTooltip => 'Next'; + + @override + String get showTooltip => 'Show'; + + @override + String get hideTooltip => 'Hide'; + + @override + String get actionRemove => 'Remove'; + + @override + String get resetTooltip => 'Reset'; + + @override + String get saveTooltip => 'Save'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'Pick'; + + @override + String get doubleBackExitMessage => 'Tap “back” again to exit.'; + + @override + String get doNotAskAgain => 'Do not ask again'; + + @override + String get sourceStateLoading => 'Loading'; + + @override + String get sourceStateCataloguing => 'Cataloguing'; + + @override + String get sourceStateLocatingCountries => 'Locating countries'; + + @override + String get sourceStateLocatingPlaces => 'Locating places'; + + @override + String get chipActionDelete => 'Delete'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Show in Collection'; + + @override + String get chipActionGoToAlbumPage => 'Show in Albums'; + + @override + String get chipActionGoToCountryPage => 'Show in Countries'; + + @override + String get chipActionGoToPlacePage => 'Show in Places'; + + @override + String get chipActionGoToTagPage => 'Show in Tags'; + + @override + String get chipActionGoToExplorerPage => 'Show in Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Filter out'; + + @override + String get chipActionFilterIn => 'Filter in'; + + @override + String get chipActionHide => 'Hide'; + + @override + String get chipActionLock => 'Lock'; + + @override + String get chipActionPin => 'Pin to top'; + + @override + String get chipActionUnpin => 'Unpin from top'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Rename'; + + @override + String get chipActionSetCover => 'Set cover'; + + @override + String get chipActionShowCountryStates => 'Show states'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Create album'; + + @override + String get chipActionCreateVault => 'Create vault'; + + @override + String get chipActionConfigureVault => 'Configure vault'; + + @override + String get entryActionCopyToClipboard => 'Copy to clipboard'; + + @override + String get entryActionDelete => 'Delete'; + + @override + String get entryActionConvert => 'Convert'; + + @override + String get entryActionExport => 'Export'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Rename'; + + @override + String get entryActionRestore => 'Restore'; + + @override + String get entryActionRotateCCW => 'Rotate counterclockwise'; + + @override + String get entryActionRotateCW => 'Rotate clockwise'; + + @override + String get entryActionFlip => 'Flip horizontally'; + + @override + String get entryActionPrint => 'Print'; + + @override + String get entryActionShare => 'Share'; + + @override + String get entryActionShareImageOnly => 'Share image only'; + + @override + String get entryActionShareVideoOnly => 'Share video only'; + + @override + String get entryActionViewSource => 'View source'; + + @override + String get entryActionShowGeoTiffOnMap => 'Show as map overlay'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convert to still image'; + + @override + String get entryActionViewMotionPhotoVideo => 'Open video'; + + @override + String get entryActionEdit => 'Edit'; + + @override + String get entryActionOpen => 'Open with'; + + @override + String get entryActionSetAs => 'Set as'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Show in map app'; + + @override + String get entryActionRotateScreen => 'Rotate screen'; + + @override + String get entryActionAddFavourite => 'Add to favorites'; + + @override + String get entryActionRemoveFavourite => 'Remove from favorites'; + + @override + String get videoActionCaptureFrame => 'Capture frame'; + + @override + String get videoActionMute => 'Mute'; + + @override + String get videoActionUnmute => 'Unmute'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Play'; + + @override + String get videoActionReplay10 => 'Seek backward 10 seconds'; + + @override + String get videoActionSkip10 => 'Seek forward 10 seconds'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Select tracks'; + + @override + String get videoActionSetSpeed => 'Playback speed'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Settings'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Resume'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'Edit date & time'; + + @override + String get entryInfoActionEditLocation => 'Edit location'; + + @override + String get entryInfoActionEditTitleDescription => 'Edit title & description'; + + @override + String get entryInfoActionEditRating => 'Edit rating'; + + @override + String get entryInfoActionEditTags => 'Edit tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Remove metadata'; + + @override + String get entryInfoActionExportMetadata => 'Export metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Remove location'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Crop'; + + @override + String get editorTransformRotate => 'Rotate'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landscape'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Recycle bin'; + + @override + String get filterFavouriteLabel => 'Favorite'; + + @override + String get filterNoDateLabel => 'Undated'; + + @override + String get filterNoAddressLabel => 'No address'; + + @override + String get filterLocatedLabel => 'Located'; + + @override + String get filterNoLocationLabel => 'Unlocated'; + + @override + String get filterNoRatingLabel => 'Unrated'; + + @override + String get filterTaggedLabel => 'Tagged'; + + @override + String get filterNoTagLabel => 'Untagged'; + + @override + String get filterNoTitleLabel => 'Untitled'; + + @override + String get filterOnThisDayLabel => 'On this day'; + + @override + String get filterRecentlyAddedLabel => 'Recently added'; + + @override + String get filterRatingRejectedLabel => 'Rejected'; + + @override + String get filterTypeAnimatedLabel => 'Animated'; + + @override + String get filterTypeMotionPhotoLabel => 'Motion Photo'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Image'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'New'; + + @override + String get albumTierPinned => 'Pinned'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Common'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Others'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimal degrees'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Highest rate'; + + @override + String get displayRefreshRatePreferLowest => 'Lowest rate'; + + @override + String get keepScreenOnNever => 'Never'; + + @override + String get keepScreenOnVideoPlayback => 'During video playback'; + + @override + String get keepScreenOnViewerOnly => 'Viewer page only'; + + @override + String get keepScreenOnAlways => 'Always'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Never'; + + @override + String get maxBrightnessAlways => 'Always'; + + @override + String get nameConflictStrategyRename => 'Rename'; + + @override + String get nameConflictStrategyReplace => 'Replace'; + + @override + String get nameConflictStrategySkip => 'Skip'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Top'; + + @override + String get subtitlePositionBottom => 'Bottom'; + + @override + String get themeBrightnessLight => 'Light'; + + @override + String get themeBrightnessDark => 'Dark'; + + @override + String get themeBrightnessBlack => 'Black'; + + @override + String get unitSystemMetric => 'Metric'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Password'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Open with other player'; + + @override + String get videoLoopModeNever => 'Never'; + + @override + String get videoLoopModeShortOnly => 'Short videos only'; + + @override + String get videoLoopModeAlways => 'Always'; + + @override + String get videoPlaybackSkip => 'Skip'; + + @override + String get videoPlaybackMuted => 'Play muted'; + + @override + String get videoPlaybackWithSound => 'Play with sound'; + + @override + String get videoResumptionModeNever => 'Never'; + + @override + String get videoResumptionModeAlways => 'Always'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'None'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'Random'; + + @override + String get widgetDisplayedItemMostRecent => 'Most recent'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internal storage'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Some files have the same name.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'ADD'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Save dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OVER'; + + @override + String get videoResumeButtonLabel => 'RESUME'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Custom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'New Album'; + + @override + String get newAlbumDialogNameLabel => 'Album name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'Storage:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'New name'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'Rename'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insert field'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Preview'; + + @override + String get renameProcessorCounter => 'Counter'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Name'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete this album and the $countString items in it?', + one: 'Delete this album and the item in it?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these albums and the $countString items in them?', + one: 'Delete these albums and the item in them?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Width'; + + @override + String get exportEntryDialogHeight => 'Height'; + + @override + String get exportEntryDialogQuality => 'Quality'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'New name'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'Date & Time'; + + @override + String get editEntryDateDialogSetCustom => 'Set custom date'; + + @override + String get editEntryDateDialogCopyField => 'Copy from other date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'File modified date'; + + @override + String get durationDialogHours => 'Hours'; + + @override + String get durationDialogMinutes => 'Minutes'; + + @override + String get durationDialogSeconds => 'Seconds'; + + @override + String get editEntryLocationDialogTitle => 'Location'; + + @override + String get editEntryLocationDialogSetCustom => 'Set custom location'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Choose on map'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Use this location'; + + @override + String get editEntryRatingDialogTitle => 'Rating'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'More'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'Playback speed'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtitles'; + + @override + String get videoStreamSelectionDialogOff => 'Off'; + + @override + String get videoStreamSelectionDialogTrack => 'Track'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'Done!'; + + @override + String get genericFailureFeedback => 'Failed'; + + @override + String get genericDangerWarningDialogMessage => 'Are you sure?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'View'; + + @override + String get menuActionSelect => 'Select'; + + @override + String get menuActionSelectAll => 'Select all'; + + @override + String get menuActionSelectNone => 'Select none'; + + @override + String get menuActionMap => 'Map'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'Stats'; + + @override + String get viewDialogSortSectionTitle => 'Sort'; + + @override + String get viewDialogGroupSectionTitle => 'Sections'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'Grid'; + + @override + String get tileLayoutList => 'List'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Color'; + + @override + String get appPickDialogTitle => 'Pick App'; + + @override + String get appPickDialogNone => 'None'; + + @override + String get aboutPageTitle => 'About'; + + @override + String get aboutLinkLicense => 'License'; + + @override + String get aboutLinkPolicy => 'Privacy Policy'; + + @override + String get aboutBugSectionTitle => 'Bug Report'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copy system information'; + + @override + String get aboutBugCopyInfoButton => 'Copy'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'Report'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Credits'; + + @override + String get aboutCreditsWorldAtlas1 => 'This app uses a TopoJSON file from'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'Translators'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenses'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Show All Licenses'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'Pick'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'Edit'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Unknown'; + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'About'; + + @override + String get drawerSettingsButton => 'Settings'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Countries'; + + @override + String get drawerPlacePage => 'Places'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'By date'; + + @override + String get sortByName => 'By name'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'By size'; + + @override + String get sortByAlbumFileName => 'By album & item title'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A to Z'; + + @override + String get sortOrderZtoA => 'Z to A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumMimeTypeMixed => 'Mixed'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'Camera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'CREATE'; + + @override + String get newFilterBanner => 'new'; + + @override + String get countryPageTitle => 'Countries'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'States'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Places'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Date'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Countries'; + + @override + String get searchStatesSectionTitle => 'States'; + + @override + String get searchPlacesSectionTitle => 'Places'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Ratings'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Settings'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'Disabled'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'Settings'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Home'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} + +/// The translations for English, using the Shavian Shaw script (`en_Shaw`). +class AppLocalizationsEnShaw extends AppLocalizationsEn { + AppLocalizationsEnShaw() : super('en_Shaw'); + + @override + String get appName => '𐑱𐑝𐑰𐑟'; + + @override + String get welcomeMessage => '𐑢𐑧𐑤𐑒𐑩𐑥 𐑑 ·𐑱𐑝𐑰𐑟'; + + @override + String get welcomeOptional => '𐑪𐑐𐑖𐑩𐑯𐑩𐑤'; + + @override + String get welcomeTermsToggle => '𐑲 𐑩𐑜𐑮𐑰 𐑑 𐑞 𐑑𐑻𐑥𐑟 𐑯 𐑒𐑩𐑯𐑛𐑦𐑖𐑩𐑯𐑟'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 𐑲𐑑𐑩𐑥𐑟', + one: '$countString 𐑲𐑑𐑩𐑥', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 𐑒𐑪𐑤𐑩𐑥𐑟', + one: '$countString 𐑒𐑪𐑤𐑩𐑥', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 𐑕𐑧𐑒𐑩𐑯𐑛𐑟', + one: '$countString 𐑕𐑧𐑒𐑩𐑯𐑛', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 𐑥𐑦𐑯𐑦𐑑𐑕', + one: '$countString 𐑥𐑦𐑯𐑦𐑑', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 𐑛𐑱𐑟', + one: '$countString 𐑛𐑱', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length 𐑥𐑥'; + } + + @override + String get applyButtonLabel => '𐑩𐑐𐑤𐑲'; + + @override + String get createButtonLabel => '𐑒𐑮𐑦𐑱𐑑'; + + @override + String get deleteButtonLabel => '𐑛𐑦𐑤𐑰𐑑'; + + @override + String get nextButtonLabel => '𐑯𐑧𐑒𐑕𐑑'; + + @override + String get showButtonLabel => '𐑖𐑴'; + + @override + String get hideButtonLabel => '𐑣𐑲𐑛'; + + @override + String get continueButtonLabel => '𐑒𐑩𐑯𐑑𐑦𐑯𐑿'; + + @override + String get saveCopyButtonLabel => '𐑕𐑱𐑝 𐑒𐑪𐑐𐑦'; + + @override + String get applyTooltip => '𐑩𐑐𐑤𐑲'; + + @override + String get cancelTooltip => '𐑒𐑨𐑯𐑕𐑩𐑤'; + + @override + String get changeTooltip => '𐑗𐑱𐑯𐑡'; + + @override + String get clearTooltip => '𐑒𐑤𐑽'; + + @override + String get previousTooltip => '𐑐𐑮𐑰𐑝𐑾𐑕'; + + @override + String get nextTooltip => '𐑯𐑧𐑒𐑕𐑑'; + + @override + String get showTooltip => '𐑖𐑴'; + + @override + String get hideTooltip => '𐑣𐑲𐑛'; + + @override + String get actionRemove => '𐑮𐑦𐑥𐑵𐑝'; + + @override + String get resetTooltip => '𐑮𐑰𐑕𐑧𐑑'; + + @override + String get saveTooltip => '𐑕𐑱𐑝'; + + @override + String get stopTooltip => '𐑕𐑑𐑪𐑐'; + + @override + String get pickTooltip => '𐑐𐑦𐑒'; + + @override + String get doubleBackExitMessage => '𐑑𐑨𐑐 «𐑚𐑨𐑒» 𐑩𐑜𐑧𐑯 𐑑 𐑧𐑒𐑕𐑦𐑑.'; + + @override + String get doNotAskAgain => '𐑛𐑵 𐑯𐑪𐑑 𐑭𐑕𐑒 𐑩𐑜𐑧𐑯'; + + @override + String get sourceStateLoading => '𐑤𐑴𐑛𐑦𐑙'; + + @override + String get sourceStateCataloguing => '𐑒𐑨𐑑𐑩𐑤𐑪𐑜𐑦𐑙'; + + @override + String get sourceStateLocatingCountries => '𐑤𐑴𐑒𐑱𐑑𐑦𐑙 𐑒𐑳𐑯𐑑𐑮𐑦𐑟'; + + @override + String get sourceStateLocatingPlaces => '𐑤𐑴𐑒𐑱𐑑𐑦𐑙 𐑐𐑤𐑱𐑕𐑩𐑟'; + + @override + String get chipActionDelete => '𐑛𐑦𐑤𐑰𐑑'; + + @override + String get chipActionRemove => '𐑮𐑦𐑥𐑵𐑝'; + + @override + String get chipActionShowCollection => '𐑖𐑴 𐑦𐑯 ·𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯'; + + @override + String get chipActionGoToAlbumPage => '𐑖𐑴 𐑦𐑯 ·𐑨𐑤𐑚𐑩𐑥𐑟'; + + @override + String get chipActionGoToCountryPage => '𐑖𐑴 𐑦𐑯 ·𐑒𐑳𐑯𐑑𐑮𐑦𐑟'; + + @override + String get chipActionGoToPlacePage => '𐑖𐑴 𐑦𐑯 ·𐑐𐑤𐑱𐑕𐑩𐑟'; + + @override + String get chipActionGoToTagPage => '𐑖𐑴 𐑦𐑯 ·𐑑𐑨𐑜𐑟'; + + @override + String get chipActionGoToExplorerPage => '𐑖𐑴 𐑦𐑯 ·𐑦𐑒𐑕𐑐𐑤𐑹𐑼'; + + @override + String get chipActionDecompose => '𐑕𐑐𐑤𐑦𐑑'; + + @override + String get chipActionFilterOut => '𐑓𐑦𐑤𐑑𐑼 𐑬𐑑'; + + @override + String get chipActionFilterIn => '𐑓𐑦𐑤𐑑𐑼 𐑦𐑯'; + + @override + String get chipActionHide => '𐑣𐑲𐑛'; + + @override + String get chipActionLock => '𐑤𐑪𐑒'; + + @override + String get chipActionPin => '𐑐𐑦𐑯 𐑑 𐑑𐑪𐑐'; + + @override + String get chipActionUnpin => '𐑳𐑯𐑐𐑦𐑯 𐑑 𐑑𐑪𐑐'; + + @override + String get chipActionGroup => '𐑗𐑱𐑯𐑡 𐑜𐑮𐑵𐑐𐑦𐑙'; + + @override + String get chipActionRename => '𐑮𐑰𐑯𐑱𐑥'; + + @override + String get chipActionSetCover => '𐑕𐑧𐑑 𐑒𐑳𐑝𐑼'; + + @override + String get chipActionShowCountryStates => '𐑖𐑴 𐑕𐑑𐑱𐑑𐑕'; + + @override + String get chipActionCreateGroup => '𐑒𐑮𐑦𐑱𐑑 𐑜𐑮𐑵𐑐'; + + @override + String get chipActionCreateAlbum => '𐑒𐑮𐑦𐑱𐑑 𐑨𐑤𐑚𐑩𐑥'; + + @override + String get chipActionCreateVault => '𐑒𐑮𐑦𐑱𐑑 𐑝𐑷𐑤𐑑'; + + @override + String get chipActionConfigureVault => '𐑒𐑩𐑯𐑓𐑦𐑜𐑼 𐑝𐑷𐑤𐑑'; + + @override + String get entryActionCopyToClipboard => '𐑒𐑪𐑐𐑦 𐑑 𐑒𐑤𐑦𐑐𐑚𐑹𐑛'; + + @override + String get entryActionDelete => '𐑛𐑦𐑤𐑰𐑑'; + + @override + String get entryActionConvert => '𐑒𐑪𐑯𐑝𐑻𐑑'; + + @override + String get entryActionExport => '𐑦𐑒𐑕𐑐𐑹𐑑'; + + @override + String get entryActionInfo => '𐑦𐑯𐑓𐑴'; + + @override + String get entryActionRename => '𐑮𐑰𐑯𐑱𐑥'; + + @override + String get entryActionRestore => '𐑮𐑦𐑕𐑑𐑹'; + + @override + String get entryActionRotateCCW => '𐑮𐑴𐑑𐑱𐑑 𐑒𐑬𐑯𐑑𐑼𐑒𐑤𐑪𐑒𐑢𐑲𐑟'; + + @override + String get entryActionRotateCW => '𐑮𐑴𐑑𐑱𐑑 𐑒𐑤𐑪𐑒𐑢𐑲𐑟'; + + @override + String get entryActionFlip => '𐑓𐑤𐑦𐑐 𐑣𐑪𐑮𐑦𐑟𐑪𐑯𐑑𐑩𐑤𐑦'; + + @override + String get entryActionPrint => '𐑐𐑮𐑦𐑯𐑑'; + + @override + String get entryActionShare => '𐑖𐑺'; + + @override + String get entryActionShareImageOnly => '𐑖𐑺 𐑦𐑥𐑦𐑡 𐑴𐑯𐑤𐑦'; + + @override + String get entryActionShareVideoOnly => '𐑖𐑺 𐑝𐑦𐑛𐑦𐑴 𐑴𐑯𐑤𐑦'; + + @override + String get entryActionViewSource => '𐑝𐑿 𐑕𐑹𐑕'; + + @override + String get entryActionShowGeoTiffOnMap => '𐑖𐑴 𐑨𐑟 𐑥𐑨𐑐 𐑴𐑝𐑼𐑤𐑱'; + + @override + String get entryActionConvertMotionPhotoToStillImage => '𐑒𐑪𐑯𐑝𐑻𐑑 𐑑 𐑕𐑑𐑦𐑤 𐑦𐑥𐑦𐑡'; + + @override + String get entryActionViewMotionPhotoVideo => '𐑴𐑐𐑩𐑯 𐑝𐑦𐑛𐑦𐑴'; + + @override + String get entryActionEdit => '𐑧𐑛𐑦𐑑'; + + @override + String get entryActionOpen => '𐑴𐑐𐑩𐑯 𐑢𐑦𐑞'; + + @override + String get entryActionSetAs => '𐑕𐑧𐑑 𐑨𐑟'; + + @override + String get entryActionCast => '𐑒𐑭𐑕𐑑'; + + @override + String get entryActionOpenMap => '𐑖𐑴 𐑦𐑯 𐑥𐑨𐑐 𐑨𐑐'; + + @override + String get entryActionRotateScreen => '𐑮𐑴𐑑𐑱𐑑 𐑕𐑒𐑮𐑰𐑯'; + + @override + String get entryActionAddFavourite => '𐑨𐑛 𐑑 𐑓𐑱𐑝𐑼𐑦𐑑𐑕'; + + @override + String get entryActionRemoveFavourite => '𐑮𐑦𐑥𐑵𐑝 𐑓𐑮𐑪𐑥 𐑓𐑱𐑝𐑼𐑦𐑑𐑕'; + + @override + String get videoActionCaptureFrame => '𐑒𐑨𐑐𐑗𐑼 𐑓𐑮𐑱𐑥'; + + @override + String get videoActionMute => '𐑥𐑿𐑑'; + + @override + String get videoActionUnmute => '𐑳𐑯𐑥𐑿𐑑'; + + @override + String get videoActionPause => '𐑐𐑷𐑟'; + + @override + String get videoActionPlay => '𐑐𐑤𐑱'; + + @override + String get videoActionReplay10 => '𐑕𐑰𐑒 𐑚𐑨𐑒𐑢𐑼𐑛 10 𐑕𐑧𐑒𐑩𐑯𐑛𐑟'; + + @override + String get videoActionSkip10 => '𐑕𐑰𐑒 𐑓𐑹𐑢𐑼𐑛 10 𐑕𐑧𐑒𐑩𐑯𐑛𐑟'; + + @override + String get videoActionShowPreviousFrame => '𐑖𐑴 𐑐𐑮𐑰𐑝𐑾𐑕 𐑓𐑮𐑱𐑥'; + + @override + String get videoActionShowNextFrame => '𐑖𐑴 𐑯𐑧𐑒𐑕𐑑 𐑓𐑮𐑱𐑥'; + + @override + String get videoActionSelectStreams => '𐑕𐑦𐑤𐑧𐑒𐑑 𐑑𐑮𐑨𐑒𐑕'; + + @override + String get videoActionSetSpeed => '𐑐𐑤𐑱𐑚𐑨𐑒 𐑕𐑐𐑰𐑛'; + + @override + String get videoActionABRepeat => '𐑐–𐑚 𐑮𐑦𐑐𐑰𐑑'; + + @override + String get videoRepeatActionSetStart => '𐑕𐑧𐑑 𐑕𐑑𐑸𐑑'; + + @override + String get videoRepeatActionSetEnd => '𐑕𐑧𐑑 𐑧𐑯𐑛'; + + @override + String get viewerActionSettings => '𐑕𐑧𐑑𐑦𐑙𐑟'; + + @override + String get viewerActionLock => '𐑤𐑪𐑒 𐑝𐑿𐑼'; + + @override + String get viewerActionUnlock => '𐑳𐑯𐑤𐑪𐑒 𐑝𐑿𐑼'; + + @override + String get slideshowActionResume => '𐑮𐑦𐑟𐑿𐑥'; + + @override + String get slideshowActionShowInCollection => '𐑖𐑴 𐑦𐑯 ·𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯'; + + @override + String get entryInfoActionEditDate => '𐑧𐑛𐑦𐑑 𐑛𐑱𐑑 𐑯 𐑑𐑲𐑥'; + + @override + String get entryInfoActionEditLocation => '𐑧𐑛𐑦𐑑 𐑤𐑴𐑒𐑱𐑖𐑩𐑯'; + + @override + String get entryInfoActionEditTitleDescription => '𐑧𐑛𐑦𐑑 𐑑𐑲𐑑𐑩𐑤 𐑯 𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯'; + + @override + String get entryInfoActionEditRating => '𐑧𐑛𐑦𐑑 𐑮𐑱𐑑𐑦𐑙'; + + @override + String get entryInfoActionEditTags => '𐑧𐑛𐑦𐑑 𐑑𐑨𐑜𐑟'; + + @override + String get entryInfoActionRemoveMetadata => '𐑮𐑦𐑥𐑵𐑝 𐑥𐑧𐑑𐑩𐑛𐑱𐑑𐑩'; + + @override + String get entryInfoActionExportMetadata => '𐑦𐑒𐑕𐑐𐑹𐑑 𐑥𐑧𐑑𐑩𐑛𐑱𐑑𐑩'; + + @override + String get entryInfoActionRemoveLocation => '𐑮𐑦𐑥𐑵𐑝 𐑤𐑴𐑒𐑱𐑖𐑩𐑯'; + + @override + String get editorActionTransform => '𐑑𐑮𐑨𐑯𐑕𐑓𐑹𐑥'; + + @override + String get editorTransformCrop => '𐑒𐑮𐑪𐑐'; + + @override + String get editorTransformRotate => '𐑮𐑴𐑑𐑱𐑑'; + + @override + String get cropAspectRatioFree => '𐑓𐑮𐑰'; + + @override + String get cropAspectRatioOriginal => '𐑼𐑦𐑡𐑦𐑯𐑩𐑤'; + + @override + String get cropAspectRatioSquare => '𐑕𐑒𐑢𐑺'; + + @override + String get filterAspectRatioLandscapeLabel => '𐑤𐑨𐑯𐑛𐑕𐑒𐑱𐑐'; + + @override + String get filterAspectRatioPortraitLabel => '𐑐𐑹𐑑𐑮𐑦𐑑'; + + @override + String get filterBinLabel => '𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯'; + + @override + String get filterFavouriteLabel => '𐑓𐑱𐑝𐑼𐑦𐑑'; + + @override + String get filterNoDateLabel => '𐑳𐑯𐑛𐑱𐑑𐑩𐑛'; + + @override + String get filterNoAddressLabel => '𐑯𐑴 𐑩𐑛𐑮𐑧𐑕'; + + @override + String get filterLocatedLabel => '𐑤𐑴𐑒𐑱𐑑𐑩𐑛'; + + @override + String get filterNoLocationLabel => '𐑳𐑯𐑤𐑴𐑒𐑱𐑑𐑩𐑛'; + + @override + String get filterNoRatingLabel => '𐑳𐑯𐑮𐑱𐑑𐑩𐑛'; + + @override + String get filterTaggedLabel => '𐑑𐑨𐑜𐑛'; + + @override + String get filterNoTagLabel => '𐑳𐑯𐑑𐑨𐑜𐑛'; + + @override + String get filterNoTitleLabel => '𐑳𐑯𐑑𐑲𐑑𐑩𐑤𐑛'; + + @override + String get filterOnThisDayLabel => '𐑪𐑯 𐑞𐑦𐑕 𐑛𐑱'; + + @override + String get filterRecentlyAddedLabel => '𐑮𐑰𐑕𐑩𐑯𐑑𐑤𐑦 𐑨𐑛𐑩𐑛'; + + @override + String get filterRatingRejectedLabel => '𐑮𐑦𐑡𐑧𐑒𐑑𐑩𐑛'; + + @override + String get filterTypeAnimatedLabel => '𐑨𐑯𐑦𐑥𐑱𐑑𐑩𐑛'; + + @override + String get filterTypeMotionPhotoLabel => '𐑥𐑴𐑖𐑩𐑯 𐑓𐑴𐑑𐑴'; + + @override + String get filterTypePanoramaLabel => '𐑐𐑨𐑯𐑼𐑭𐑥𐑩'; + + @override + String get filterTypeRawLabel => '𐑮𐑷'; + + @override + String get filterTypeSphericalVideoLabel => '360° 𐑝𐑦𐑛𐑦𐑴'; + + @override + String get filterTypeGeotiffLabel => '⸰𐑡𐑰𐑴𐑑𐑦𐑓𐑓'; + + @override + String get filterMimeImageLabel => '𐑦𐑥𐑦𐑡'; + + @override + String get filterMimeVideoLabel => '𐑝𐑦𐑛𐑦𐑴'; + + @override + String get accessibilityAnimationsRemove => '𐑐𐑮𐑦𐑝𐑧𐑯𐑑 𐑕𐑒𐑮𐑰𐑯 𐑦𐑓𐑧𐑒𐑑𐑕'; + + @override + String get accessibilityAnimationsKeep => '𐑒𐑰𐑐 𐑕𐑒𐑮𐑰𐑯 𐑦𐑓𐑧𐑒𐑑𐑕'; + + @override + String get albumTierNew => '𐑯𐑿'; + + @override + String get albumTierPinned => '𐑐𐑦𐑯𐑛'; + + @override + String get albumTierGroups => '𐑜𐑮𐑵𐑐𐑕'; + + @override + String get albumTierSpecial => '𐑒𐑪𐑥𐑩𐑯'; + + @override + String get albumTierApps => '𐑨𐑐𐑕'; + + @override + String get albumTierVaults => '𐑝𐑷𐑤𐑑𐑕'; + + @override + String get albumTierDynamic => '𐑛𐑲𐑯𐑨𐑥𐑦𐑒'; + + @override + String get albumTierRegular => '𐑳𐑞𐑼𐑟'; + + @override + String get coordinateFormatDms => '⸰𐑛𐑥𐑕'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => '𐑛𐑧𐑕𐑦𐑥𐑩𐑤 𐑛𐑦𐑜𐑮𐑰𐑟'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => '𐑯'; + + @override + String get coordinateDmsSouth => '𐑕'; + + @override + String get coordinateDmsEast => '𐑰'; + + @override + String get coordinateDmsWest => '𐑢'; + + @override + String get displayRefreshRatePreferHighest => '𐑣𐑲𐑩𐑕𐑑 𐑮𐑱𐑑'; + + @override + String get displayRefreshRatePreferLowest => '𐑤𐑴𐑩𐑕𐑑 𐑮𐑱𐑑'; + + @override + String get keepScreenOnNever => '𐑯𐑧𐑝𐑼'; + + @override + String get keepScreenOnVideoPlayback => '𐑛𐑘𐑫𐑼𐑦𐑙 𐑝𐑦𐑛𐑦𐑴 𐑐𐑤𐑱𐑚𐑨𐑒'; + + @override + String get keepScreenOnViewerOnly => '𐑝𐑿𐑼 𐑐𐑱𐑡 𐑴𐑯𐑤𐑦'; + + @override + String get keepScreenOnAlways => '𐑷𐑤𐑢𐑱𐑟'; + + @override + String get lengthUnitPixel => '𐑐𐑒𐑕'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => '·𐑜𐑵𐑜𐑩𐑤 𐑥𐑨𐑐𐑕'; + + @override + String get mapStyleGoogleHybrid => '·𐑜𐑵𐑜𐑩𐑤 𐑥𐑨𐑐𐑕 (𐑣𐑲𐑚𐑮𐑦𐑛)'; + + @override + String get mapStyleGoogleTerrain => '·𐑜𐑵𐑜𐑩𐑤 𐑥𐑨𐑐𐑕 (𐑑𐑼𐑱𐑯)'; + + @override + String get mapStyleOsmLiberty => '⸰𐑴𐑕𐑥 ·𐑤𐑦𐑚𐑼𐑑𐑦'; + + @override + String get mapStyleOpenTopoMap => '·𐑴𐑐𐑩𐑯𐑑𐑪𐑐𐑩𐑥𐑨𐑐'; + + @override + String get mapStyleOsmHot => '·𐑣𐑿𐑥𐑨𐑯𐑦𐑑𐑺𐑾𐑯 ⸰𐑴𐑕𐑥'; + + @override + String get mapStyleStamenWatercolor => '·𐑕𐑑𐑱𐑥𐑩𐑯 𐑢𐑷𐑑𐑼𐑒𐑳𐑤𐑼'; + + @override + String get maxBrightnessNever => '𐑯𐑧𐑝𐑼'; + + @override + String get maxBrightnessAlways => '𐑷𐑤𐑢𐑱𐑟'; + + @override + String get nameConflictStrategyRename => '𐑮𐑰𐑯𐑱𐑥'; + + @override + String get nameConflictStrategyReplace => '𐑮𐑦𐑐𐑤𐑱𐑕'; + + @override + String get nameConflictStrategySkip => '𐑕𐑒𐑦𐑐'; + + @override + String get overlayHistogramNone => '𐑯𐑳𐑯'; + + @override + String get overlayHistogramRGB => '⸰𐑮𐑜𐑚'; + + @override + String get overlayHistogramLuminance => '𐑤𐑵𐑥𐑦𐑯𐑩𐑯𐑕'; + + @override + String get subtitlePositionTop => '𐑑𐑪𐑐'; + + @override + String get subtitlePositionBottom => '𐑚𐑪𐑑𐑩𐑥'; + + @override + String get themeBrightnessLight => '𐑤𐑲𐑑'; + + @override + String get themeBrightnessDark => '𐑛𐑸𐑒'; + + @override + String get themeBrightnessBlack => '𐑚𐑤𐑨𐑒'; + + @override + String get unitSystemMetric => '𐑥𐑧𐑑𐑮𐑦𐑒'; + + @override + String get unitSystemImperial => '𐑦𐑥𐑐𐑽𐑾𐑤'; + + @override + String get vaultLockTypePattern => '𐑐𐑨𐑑𐑼𐑯'; + + @override + String get vaultLockTypePin => '⸰𐑐𐑲𐑯'; + + @override + String get vaultLockTypePassword => '𐑐𐑭𐑕𐑢𐑻𐑛'; + + @override + String get settingsVideoEnablePip => '𐑐𐑦𐑒𐑗𐑼-𐑦𐑯-𐑐𐑦𐑒𐑗𐑼'; + + @override + String get videoControlsPlayOutside => '𐑴𐑐𐑩𐑯 𐑢𐑦𐑞 𐑳𐑞𐑼 𐑐𐑤𐑱𐑼'; + + @override + String get videoLoopModeNever => '𐑯𐑧𐑝𐑼'; + + @override + String get videoLoopModeShortOnly => '𐑖𐑹𐑑 𐑝𐑦𐑛𐑦𐑴𐑟 𐑴𐑯𐑤𐑦'; + + @override + String get videoLoopModeAlways => '𐑷𐑤𐑢𐑱𐑟'; + + @override + String get videoPlaybackSkip => '𐑕𐑒𐑦𐑐'; + + @override + String get videoPlaybackMuted => '𐑐𐑤𐑱 𐑥𐑿𐑑𐑩𐑛'; + + @override + String get videoPlaybackWithSound => '𐑐𐑤𐑱 𐑢𐑦𐑞 𐑕𐑬𐑯𐑛'; + + @override + String get videoResumptionModeNever => '𐑯𐑧𐑝𐑼'; + + @override + String get videoResumptionModeAlways => '𐑷𐑤𐑢𐑱𐑟'; + + @override + String get viewerTransitionSlide => '𐑕𐑤𐑲𐑛'; + + @override + String get viewerTransitionParallax => '𐑐𐑨𐑮𐑩𐑤𐑨𐑒𐑕'; + + @override + String get viewerTransitionFade => '𐑓𐑱𐑛'; + + @override + String get viewerTransitionZoomIn => '𐑟𐑵𐑥 𐑦𐑯'; + + @override + String get viewerTransitionNone => '𐑯𐑳𐑯'; + + @override + String get wallpaperTargetHome => '𐑣𐑴𐑥 𐑕𐑒𐑮𐑰𐑯'; + + @override + String get wallpaperTargetLock => '𐑤𐑪𐑒 𐑕𐑒𐑮𐑰𐑯'; + + @override + String get wallpaperTargetHomeLock => '𐑣𐑴𐑥 𐑯 𐑤𐑪𐑒 𐑕𐑒𐑮𐑰𐑯𐑟'; + + @override + String get widgetDisplayedItemRandom => '𐑮𐑨𐑯𐑛𐑩𐑥'; + + @override + String get widgetDisplayedItemMostRecent => '𐑥𐑴𐑕𐑑 𐑮𐑰𐑕𐑩𐑯𐑑'; + + @override + String get widgetOpenPageHome => '𐑴𐑐𐑩𐑯 𐑣𐑴𐑥'; + + @override + String get widgetOpenPageCollection => '𐑴𐑐𐑩𐑯 𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯'; + + @override + String get widgetOpenPageViewer => '𐑴𐑐𐑩𐑯 𐑝𐑿𐑼'; + + @override + String get widgetTapUpdateWidget => '𐑳𐑐𐑛𐑱𐑑 𐑢𐑦𐑡𐑩𐑑'; + + @override + String get storageVolumeDescriptionFallbackPrimary => '𐑦𐑯𐑑𐑻𐑯𐑩𐑤 𐑕𐑑𐑹𐑦𐑡'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => '⸰𐑕𐑛 𐑒𐑸𐑛'; + + @override + String get rootDirectoryDescription => '𐑮𐑵𐑑 𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦'; + + @override + String otherDirectoryDescription(String name) { + return '«$name» 𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return '𐑐𐑤𐑰𐑟 𐑕𐑦𐑤𐑧𐑒𐑑 𐑞 $directory 𐑝 «$volume» 𐑦𐑯 𐑞 𐑯𐑧𐑒𐑕𐑑 𐑕𐑒𐑮𐑰𐑯 𐑑 𐑜𐑦𐑝 𐑞𐑦𐑕 𐑨𐑐 𐑨𐑒𐑕𐑧𐑕 𐑑 𐑦𐑑.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return '𐑞𐑦𐑕 𐑨𐑐 𐑦𐑟 𐑯𐑪𐑑 𐑩𐑤𐑬𐑛 𐑑 𐑥𐑪𐑛𐑦𐑓𐑲 𐑓𐑲𐑤𐑟 𐑦𐑯 𐑞 $directory 𐑝 «$volume».\n\n𐑐𐑤𐑰𐑟 𐑿𐑟 𐑩 𐑐𐑮𐑰-𐑦𐑯𐑕𐑑𐑷𐑤𐑛 𐑓𐑲𐑤 𐑥𐑨𐑯𐑦𐑡𐑼 𐑹 𐑜𐑨𐑤𐑼𐑦 𐑨𐑐 𐑑 𐑥𐑵𐑝 𐑞 𐑲𐑑𐑩𐑥𐑟 𐑑 𐑩𐑯𐑳𐑞𐑼 𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return '𐑞𐑦𐑕 𐑪𐑐𐑼𐑱𐑖𐑩𐑯 𐑯𐑰𐑛𐑟 $neededSize 𐑝 𐑓𐑮𐑰 𐑕𐑐𐑱𐑕 𐑪𐑯 «$volume» 𐑑 𐑒𐑩𐑥𐑐𐑤𐑰𐑑, 𐑚𐑳𐑑 𐑞𐑺 𐑦𐑟 𐑴𐑯𐑤𐑦 $freeSize 𐑤𐑧𐑓𐑑.'; + } + + @override + String get missingSystemFilePickerDialogMessage => '𐑞 𐑕𐑦𐑕𐑑𐑩𐑥 𐑓𐑲𐑤 𐑐𐑦𐑒𐑼 𐑦𐑟 𐑥𐑦𐑕𐑦𐑙 𐑹 𐑛𐑦𐑕𐑱𐑚𐑩𐑤𐑛. 𐑐𐑤𐑰𐑟 𐑦𐑯𐑱𐑚𐑩𐑤 𐑦𐑑 𐑯 𐑑𐑮𐑲 𐑩𐑜𐑧𐑯.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '𐑞𐑦𐑕 𐑪𐑐𐑼𐑱𐑖𐑩𐑯 𐑦𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑓 𐑲𐑑𐑩𐑥𐑟 𐑝 𐑞 𐑓𐑪𐑤𐑴𐑦𐑙 𐑑𐑲𐑐𐑕: $types.', + one: '𐑞𐑦𐑕 𐑪𐑐𐑼𐑱𐑖𐑩𐑯 𐑦𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑓 𐑲𐑑𐑩𐑥𐑟 𐑝 𐑞 𐑓𐑪𐑤𐑴𐑦𐑙 𐑑𐑲𐑐: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => '𐑕𐑳𐑥 𐑓𐑲𐑤𐑟 𐑦𐑯 𐑞 𐑛𐑧𐑕𐑑𐑦𐑯𐑱𐑖𐑩𐑯 𐑓𐑴𐑤𐑛𐑼 𐑣𐑨𐑝 𐑞 𐑕𐑱𐑥 𐑯𐑱𐑥.'; + + @override + String get nameConflictDialogMultipleSourceMessage => '𐑕𐑳𐑥 𐑓𐑲𐑤𐑟 𐑣𐑨𐑝 𐑞 𐑕𐑱𐑥 𐑯𐑱𐑥.'; + + @override + String get addShortcutDialogLabel => '𐑖𐑹𐑑𐑒𐑳𐑑 𐑤𐑱𐑚𐑩𐑤'; + + @override + String get addShortcutButtonLabel => '𐑨𐑛'; + + @override + String get noMatchingAppDialogMessage => '𐑞𐑺 𐑸 𐑯𐑴 𐑨𐑐𐑕 𐑞𐑨𐑑 𐑒𐑨𐑯 𐑣𐑨𐑯𐑛𐑩𐑤 𐑞𐑦𐑕.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '¿𐑥𐑵𐑝 𐑞𐑰𐑟 $countString 𐑲𐑑𐑩𐑥𐑟 𐑑 𐑞 𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯?', + one: '¿𐑥𐑵𐑝 𐑞𐑦𐑕 𐑲𐑑𐑩𐑥 𐑑 𐑞 𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '¿𐑛𐑦𐑤𐑰𐑑 𐑞𐑰𐑟 $countString 𐑲𐑑𐑩𐑥𐑟?', + one: '¿𐑛𐑦𐑤𐑰𐑑 𐑞𐑦𐑕 𐑲𐑑𐑩𐑥?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => '¿𐑕𐑱𐑝 𐑲𐑑𐑩𐑥 𐑛𐑱𐑑𐑕 𐑚𐑦𐑓𐑹 𐑐𐑮𐑩𐑕𐑰𐑛𐑦𐑙?'; + + @override + String get moveUndatedConfirmationDialogSetDate => '𐑕𐑱𐑝 𐑛𐑱𐑑𐑕'; + + @override + String videoResumeDialogMessage(String time) { + return '¿𐑛𐑵 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑮𐑦𐑟𐑿𐑥 𐑨𐑑 $time?'; + } + + @override + String get videoStartOverButtonLabel => '𐑕𐑑𐑸𐑑 𐑴𐑝𐑼'; + + @override + String get videoResumeButtonLabel => '𐑮𐑦𐑟𐑿𐑥'; + + @override + String get setCoverDialogLatest => '𐑤𐑱𐑑𐑩𐑕𐑑 𐑲𐑑𐑩𐑥'; + + @override + String get setCoverDialogAuto => '𐑷𐑑𐑴'; + + @override + String get setCoverDialogCustom => '𐑒𐑳𐑕𐑑𐑩𐑥'; + + @override + String get hideFilterConfirmationDialogMessage => + '𐑥𐑨𐑗𐑦𐑙 𐑓𐑴𐑑𐑴𐑟 𐑯 𐑝𐑦𐑛𐑦𐑴𐑟 𐑢𐑦𐑤 𐑚𐑰 𐑣𐑦𐑛𐑩𐑯 𐑓𐑮𐑪𐑥 𐑘𐑹 𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯. 𐑿 𐑒𐑨𐑯 𐑖𐑴 𐑞𐑧𐑥 𐑩𐑜𐑧𐑯 𐑓𐑮𐑪𐑥 𐑞 «𐑐𐑮𐑦𐑝𐑩𐑕𐑦» 𐑕𐑧𐑑𐑦𐑙𐑟.\n\n¿𐑸 𐑿 𐑖𐑫𐑼 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑣𐑲𐑛 𐑞𐑧𐑥?'; + + @override + String get newAlbumDialogTitle => '𐑯𐑿 𐑨𐑤𐑚𐑩𐑥'; + + @override + String get newAlbumDialogNameLabel => '𐑨𐑤𐑚𐑩𐑥 𐑯𐑱𐑥'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => '𐑨𐑤𐑚𐑩𐑥 𐑷𐑤𐑮𐑧𐑛𐑦 𐑦𐑜𐑟𐑦𐑕𐑑𐑕'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => '𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦 𐑷𐑤𐑮𐑧𐑛𐑦 𐑦𐑜𐑟𐑦𐑕𐑑𐑕'; + + @override + String get newAlbumDialogStorageLabel => '𐑕𐑑𐑹𐑦𐑡:'; + + @override + String get newDynamicAlbumDialogTitle => '𐑯𐑿 𐑛𐑲𐑯𐑨𐑥𐑦𐑒 𐑨𐑤𐑚𐑩𐑥'; + + @override + String get dynamicAlbumAlreadyExists => '𐑛𐑲𐑯𐑨𐑥𐑦𐑒 𐑨𐑤𐑚𐑩𐑥 𐑷𐑤𐑮𐑧𐑛𐑦 𐑦𐑜𐑟𐑦𐑕𐑑𐑕'; + + @override + String get newGroupDialogTitle => '𐑯𐑿 𐑜𐑮𐑵𐑐'; + + @override + String get newGroupDialogNameLabel => '𐑜𐑮𐑵𐑐 𐑯𐑱𐑥'; + + @override + String get groupAlreadyExists => '𐑜𐑮𐑵𐑐 𐑷𐑤𐑮𐑧𐑛𐑦 𐑦𐑜𐑟𐑦𐑕𐑑𐑕'; + + @override + String get groupEmpty => '𐑯𐑴 𐑜𐑮𐑵𐑐𐑕'; + + @override + String get ungrouped => '𐑳𐑯𐑜𐑮𐑵𐑐𐑑'; + + @override + String get groupPickerTitle => '𐑐𐑦𐑒 𐑜𐑮𐑵𐑐'; + + @override + String get groupPickerUseThisGroupButton => '𐑿𐑟 𐑞𐑦𐑕 𐑜𐑮𐑵𐑐'; + + @override + String get newVaultWarningDialogMessage => + '𐑲𐑑𐑩𐑥𐑟 𐑦𐑯 𐑝𐑷𐑤𐑑𐑕 𐑸 𐑴𐑯𐑤𐑦 𐑩𐑝𐑱𐑤𐑩𐑚𐑩𐑤 𐑑 𐑞𐑦𐑕 𐑨𐑐 𐑯 𐑯𐑴 𐑳𐑞𐑼𐑟.\n\n𐑦𐑓 𐑿 𐑳𐑯𐑦𐑯𐑕𐑑𐑷𐑤 𐑞𐑦𐑕 𐑨𐑐, 𐑹 𐑒𐑤𐑽 𐑞𐑦𐑕 𐑨𐑐 𐑛𐑱𐑑𐑩, 𐑿 𐑢𐑦𐑤 𐑤𐑵𐑟 𐑷𐑤 𐑞𐑰𐑟 𐑲𐑑𐑩𐑥𐑟.'; + + @override + String get newVaultDialogTitle => '𐑯𐑿 𐑝𐑷𐑤𐑑'; + + @override + String get configureVaultDialogTitle => '𐑒𐑩𐑯𐑓𐑦𐑜𐑼 𐑝𐑷𐑤𐑑'; + + @override + String get vaultDialogLockModeWhenScreenOff => '𐑤𐑪𐑒 𐑢𐑧𐑯 𐑕𐑒𐑮𐑰𐑯 𐑑𐑻𐑯𐑟 𐑪𐑓'; + + @override + String get vaultDialogLockTypeLabel => '𐑤𐑪𐑒 𐑑𐑲𐑐'; + + @override + String get patternDialogEnter => '𐑧𐑯𐑑𐑼 𐑐𐑨𐑑𐑼𐑯'; + + @override + String get patternDialogConfirm => '𐑒𐑩𐑯𐑓𐑻𐑥 𐑐𐑨𐑑𐑼𐑯'; + + @override + String get pinDialogEnter => '𐑧𐑯𐑑𐑼 ⸰𐑐𐑲𐑯'; + + @override + String get pinDialogConfirm => '𐑒𐑩𐑯𐑓𐑻𐑥 ⸰𐑐𐑲𐑯'; + + @override + String get passwordDialogEnter => '𐑧𐑯𐑑𐑼 𐑐𐑭𐑕𐑢𐑻𐑛'; + + @override + String get passwordDialogConfirm => '𐑒𐑩𐑯𐑓𐑻𐑥 𐑐𐑭𐑕𐑢𐑻𐑛'; + + @override + String get authenticateToConfigureVault => '𐑷𐑔𐑧𐑯𐑑𐑦𐑒𐑱𐑑 𐑑 𐑒𐑩𐑯𐑓𐑦𐑜𐑼 𐑝𐑷𐑤𐑑'; + + @override + String get authenticateToUnlockVault => '𐑷𐑔𐑧𐑯𐑑𐑦𐑒𐑱𐑑 𐑑 𐑳𐑯𐑤𐑪𐑒 𐑝𐑷𐑤𐑑'; + + @override + String get vaultBinUsageDialogMessage => '𐑕𐑳𐑥 𐑝𐑷𐑤𐑑𐑕 𐑸 𐑿𐑟𐑦𐑙 𐑞 𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯.'; + + @override + String get renameAlbumDialogLabel => '𐑯𐑿 𐑯𐑱𐑥'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => '𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦 𐑷𐑤𐑮𐑧𐑛𐑦 𐑦𐑜𐑟𐑦𐑕𐑑𐑕'; + + @override + String get renameEntrySetPageTitle => '𐑮𐑰𐑯𐑱𐑥'; + + @override + String get renameEntrySetPagePatternFieldLabel => '𐑯𐑱𐑥𐑦𐑙 𐑐𐑨𐑑𐑼𐑯'; + + @override + String get renameEntrySetPageInsertTooltip => '𐑦𐑯𐑕𐑻𐑑 𐑓𐑰𐑤𐑛'; + + @override + String get renameEntrySetPagePreviewSectionTitle => '𐑐𐑮𐑰𐑝𐑿'; + + @override + String get renameProcessorCounter => '𐑒𐑬𐑯𐑑𐑼'; + + @override + String get renameProcessorHash => '𐑣𐑨𐑖'; + + @override + String get renameProcessorName => '𐑯𐑱𐑥'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '¿𐑛𐑦𐑤𐑰𐑑 𐑞𐑦𐑕 𐑨𐑤𐑚𐑩𐑥 𐑯 𐑞 $countString 𐑲𐑑𐑩𐑥𐑟 𐑦𐑯 𐑦𐑑?', + one: '¿𐑛𐑦𐑤𐑰𐑑 𐑞𐑦𐑕 𐑨𐑤𐑚𐑩𐑥 𐑯 𐑞 𐑲𐑑𐑩𐑥 𐑦𐑯 𐑦𐑑?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '¿𐑛𐑦𐑤𐑰𐑑 𐑞𐑰𐑟 𐑨𐑤𐑚𐑩𐑥𐑟 𐑯 𐑞 $countString 𐑲𐑑𐑩𐑥𐑟 𐑦𐑯 𐑞𐑧𐑥?', + one: '¿𐑛𐑦𐑤𐑰𐑑 𐑞𐑰𐑟 𐑨𐑤𐑚𐑩𐑥𐑟 𐑯 𐑞 𐑲𐑑𐑩𐑥 𐑦𐑯 𐑞𐑧𐑥?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => '𐑓𐑹𐑥𐑨𐑑:'; + + @override + String get exportEntryDialogWidth => '𐑢𐑦𐑛𐑔'; + + @override + String get exportEntryDialogHeight => '𐑣𐑲𐑑'; + + @override + String get exportEntryDialogQuality => '𐑒𐑢𐑪𐑤𐑦𐑑𐑦'; + + @override + String get exportEntryDialogWriteMetadata => '𐑮𐑲𐑑 𐑥𐑧𐑑𐑩𐑛𐑱𐑑𐑩'; + + @override + String get renameEntryDialogLabel => '𐑯𐑿 𐑯𐑱𐑥'; + + @override + String get editEntryDialogCopyFromItem => '𐑒𐑪𐑐𐑦 𐑓𐑮𐑪𐑥 𐑳𐑞𐑼 𐑲𐑑𐑩𐑥'; + + @override + String get editEntryDialogTargetFieldsHeader => '𐑓𐑰𐑤𐑛𐑟 𐑑 𐑥𐑪𐑛𐑦𐑓𐑲'; + + @override + String get editEntryDateDialogTitle => '𐑛𐑱𐑑 𐑯 𐑑𐑲𐑥'; + + @override + String get editEntryDateDialogSetCustom => '𐑕𐑧𐑑 𐑒𐑳𐑕𐑑𐑩𐑥 𐑛𐑱𐑑'; + + @override + String get editEntryDateDialogCopyField => '𐑒𐑪𐑐𐑦 𐑓𐑮𐑪𐑥 𐑳𐑞𐑼 𐑛𐑱𐑑'; + + @override + String get editEntryDateDialogExtractFromTitle => '𐑦𐑒𐑕𐑑𐑮𐑨𐑒𐑑 𐑓𐑮𐑪𐑥 𐑑𐑲𐑑𐑩𐑤'; + + @override + String get editEntryDateDialogShift => '𐑖𐑦𐑓𐑑'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => '𐑓𐑲𐑤 𐑥𐑪𐑛𐑦𐑓𐑲𐑛 𐑛𐑱𐑑'; + + @override + String get durationDialogHours => '𐑬𐑼𐑟'; + + @override + String get durationDialogMinutes => '𐑥𐑦𐑯𐑦𐑑𐑕'; + + @override + String get durationDialogSeconds => '𐑕𐑧𐑒𐑩𐑯𐑛𐑟'; + + @override + String get editEntryLocationDialogTitle => '𐑤𐑴𐑒𐑱𐑖𐑩𐑯'; + + @override + String get editEntryLocationDialogSetCustom => '𐑕𐑧𐑑 𐑒𐑳𐑕𐑑𐑩𐑥 𐑤𐑴𐑒𐑱𐑖𐑩𐑯'; + + @override + String get editEntryLocationDialogChooseOnMap => '𐑗𐑵𐑟 𐑪𐑯 𐑥𐑨𐑐'; + + @override + String get editEntryLocationDialogImportGpx => '𐑦𐑥𐑐𐑹𐑑 GPX'; + + @override + String get editEntryLocationDialogLatitude => '𐑤𐑨𐑑𐑦𐑑𐑿𐑛'; + + @override + String get editEntryLocationDialogLongitude => '𐑤𐑪𐑯𐑡𐑦𐑑𐑿𐑛'; + + @override + String get editEntryLocationDialogTimeShift => '𐑑𐑲𐑥𐑖𐑦𐑐𐑑'; + + @override + String get locationPickerUseThisLocationButton => '𐑿𐑟 𐑞𐑦𐑕 𐑤𐑴𐑒𐑱𐑖𐑩𐑯'; + + @override + String get editEntryRatingDialogTitle => '𐑮𐑱𐑑𐑦𐑙'; + + @override + String get removeEntryMetadataDialogTitle => '𐑥𐑧𐑑𐑩𐑛𐑱𐑑𐑩 𐑮𐑦𐑥𐑵𐑝𐑩𐑤'; + + @override + String get removeEntryMetadataDialogAll => '𐑷𐑤'; + + @override + String get removeEntryMetadataDialogMore => '𐑥𐑹'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => '⸰𐑦𐑥𐑐 𐑦𐑟 𐑮𐑦𐑒𐑢𐑲𐑼𐑛 𐑑 𐑐𐑤𐑱 𐑞 𐑝𐑦𐑛𐑦𐑴 𐑦𐑯𐑕𐑲𐑛 𐑩 𐑥𐑴𐑖𐑩𐑯 𐑓𐑴𐑑𐑴.\n\n¿𐑸 𐑿 𐑖𐑫𐑼 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑮𐑦𐑥𐑵𐑝 𐑦𐑑?'; + + @override + String get videoSpeedDialogLabel => '𐑐𐑤𐑱𐑚𐑨𐑒 𐑕𐑐𐑰𐑛'; + + @override + String get videoStreamSelectionDialogVideo => '𐑝𐑦𐑛𐑦𐑴'; + + @override + String get videoStreamSelectionDialogAudio => '𐑷𐑛𐑦𐑴'; + + @override + String get videoStreamSelectionDialogText => '𐑕𐑳𐑚𐑑𐑲𐑑𐑩𐑤𐑟'; + + @override + String get videoStreamSelectionDialogOff => '𐑪𐑓'; + + @override + String get videoStreamSelectionDialogTrack => '𐑑𐑮𐑨𐑒'; + + @override + String get videoStreamSelectionDialogNoSelection => '𐑞𐑺 𐑸 𐑯𐑴 𐑳𐑞𐑼 𐑑𐑮𐑨𐑒𐑕.'; + + @override + String get genericSuccessFeedback => '¡𐑛𐑳𐑯!'; + + @override + String get genericFailureFeedback => '𐑓𐑱𐑤𐑛'; + + @override + String get genericDangerWarningDialogMessage => '¿𐑸 𐑿 𐑖𐑫𐑼?'; + + @override + String get tooManyItemsErrorDialogMessage => '𐑑𐑮𐑲 𐑩𐑜𐑧𐑯 𐑢𐑦𐑞 𐑓𐑿𐑼 𐑲𐑑𐑩𐑥𐑟.'; + + @override + String get menuActionConfigureView => '𐑝𐑿'; + + @override + String get menuActionSelect => '𐑕𐑦𐑤𐑧𐑒𐑑'; + + @override + String get menuActionSelectAll => '𐑕𐑦𐑤𐑧𐑒𐑑 𐑷𐑤'; + + @override + String get menuActionSelectNone => '𐑕𐑦𐑤𐑧𐑒𐑑 𐑯𐑳𐑯'; + + @override + String get menuActionMap => '𐑥𐑨𐑐'; + + @override + String get menuActionSlideshow => '𐑕𐑤𐑲𐑛𐑖𐑴'; + + @override + String get menuActionStats => '𐑕𐑑𐑨𐑑𐑕'; + + @override + String get viewDialogSortSectionTitle => '𐑕𐑹𐑑'; + + @override + String get viewDialogGroupSectionTitle => '𐑕𐑦𐑤𐑧𐑒𐑖𐑩𐑯𐑟'; + + @override + String get viewDialogLayoutSectionTitle => '𐑤𐑱𐑬𐑑'; + + @override + String get viewDialogReverseSortOrder => '𐑮𐑦𐑝𐑻𐑕 𐑕𐑹𐑑 𐑹𐑛𐑼'; + + @override + String get tileLayoutMosaic => '𐑥𐑴𐑟𐑱𐑦𐑒'; + + @override + String get tileLayoutGrid => '𐑜𐑮𐑦𐑛'; + + @override + String get tileLayoutList => '𐑤𐑦𐑕𐑑'; + + @override + String get castDialogTitle => '𐑒𐑭𐑕𐑑 𐑛𐑦𐑝𐑲𐑕𐑩𐑟'; + + @override + String get coverDialogTabCover => '𐑒𐑳𐑝𐑼'; + + @override + String get coverDialogTabApp => '𐑨𐑐'; + + @override + String get coverDialogTabColor => '𐑒𐑳𐑤𐑼'; + + @override + String get appPickDialogTitle => '𐑐𐑦𐑒 𐑨𐑐'; + + @override + String get appPickDialogNone => '𐑯𐑳𐑯'; + + @override + String get aboutPageTitle => '𐑩𐑚𐑬𐑑'; + + @override + String get aboutLinkLicense => '𐑤𐑲𐑕𐑩𐑯𐑕'; + + @override + String get aboutLinkPolicy => '𐑐𐑮𐑦𐑝𐑩𐑕𐑦 𐑐𐑪𐑤𐑩𐑕𐑦'; + + @override + String get aboutBugSectionTitle => '𐑚𐑳𐑜 𐑮𐑦𐑐𐑹𐑑'; + + @override + String get aboutBugSaveLogInstruction => '𐑕𐑱𐑝 𐑨𐑐 𐑤𐑪𐑜𐑟 𐑑 𐑩 𐑓𐑲𐑤'; + + @override + String get aboutBugCopyInfoInstruction => '𐑒𐑪𐑐𐑦 𐑕𐑦𐑕𐑑𐑩𐑥 𐑦𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯'; + + @override + String get aboutBugCopyInfoButton => '𐑒𐑪𐑐𐑦'; + + @override + String get aboutBugReportInstruction => '𐑮𐑦𐑐𐑹𐑑 𐑪𐑯 ·𐑜𐑦𐑑𐑣𐑳𐑚 𐑢𐑦𐑞 𐑞 𐑤𐑪𐑜𐑟 𐑯 𐑕𐑦𐑕𐑑𐑩𐑥 𐑦𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯'; + + @override + String get aboutBugReportButton => '𐑮𐑦𐑐𐑹𐑑'; + + @override + String get aboutDataUsageSectionTitle => '𐑛𐑱𐑑𐑩 𐑿𐑕𐑦𐑡'; + + @override + String get aboutDataUsageData => '𐑛𐑱𐑑𐑩'; + + @override + String get aboutDataUsageCache => '𐑒𐑨𐑖'; + + @override + String get aboutDataUsageDatabase => '𐑛𐑱𐑑𐑩𐑚𐑱𐑕'; + + @override + String get aboutDataUsageMisc => '𐑥𐑦𐑕𐑤.'; + + @override + String get aboutDataUsageInternal => '𐑦𐑯𐑑𐑻𐑯𐑩𐑤'; + + @override + String get aboutDataUsageExternal => '𐑦𐑒𐑕𐑑𐑻𐑯𐑩𐑤'; + + @override + String get aboutDataUsageClearCache => '𐑒𐑤𐑽 𐑒𐑨𐑖'; + + @override + String get aboutCreditsSectionTitle => '𐑒𐑮𐑧𐑛𐑦𐑑𐑕'; + + @override + String get aboutCreditsWorldAtlas1 => '𐑞𐑦𐑕 𐑨𐑐 𐑿𐑟𐑩𐑟 𐑩 ⸰𐑑𐑪𐑐𐑩𐑡𐑕𐑪𐑯 𐑓𐑲𐑤 𐑓𐑮𐑪𐑥'; + + @override + String get aboutCreditsWorldAtlas2 => '𐑳𐑯𐑛𐑼 ⸰𐑦𐑕𐑒 𐑤𐑲𐑕𐑩𐑯𐑕.'; + + @override + String get aboutTranslatorsSectionTitle => '𐑑𐑮𐑨𐑯𐑟𐑤𐑱𐑑𐑼𐑟'; + + @override + String get aboutLicensesSectionTitle => '𐑴𐑐𐑩𐑯-𐑕𐑹𐑕 𐑤𐑲𐑕𐑩𐑯𐑕𐑩𐑟'; + + @override + String get aboutLicensesBanner => '𐑞𐑦𐑕 𐑨𐑐 𐑿𐑟𐑩𐑟 𐑞 𐑓𐑪𐑤𐑴𐑦𐑙 𐑴𐑐𐑩𐑯-𐑕𐑹𐑕 𐑐𐑨𐑒𐑦𐑡𐑩𐑟 𐑯 𐑤𐑲𐑚𐑮𐑼𐑦𐑟.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => '·𐑨𐑯𐑛𐑮𐑶𐑛 𐑤𐑲𐑚𐑮𐑼𐑦𐑟'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => '·𐑓𐑤𐑳𐑑𐑼 𐑐𐑤𐑳𐑜𐑦𐑯𐑟'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => '·𐑓𐑤𐑳𐑑𐑼 𐑐𐑨𐑒𐑦𐑡𐑩𐑟'; + + @override + String get aboutLicensesDartPackagesSectionTitle => '·𐑛𐑸𐑑 𐑐𐑨𐑒𐑦𐑡𐑩𐑟'; + + @override + String get aboutLicensesShowAllButtonLabel => '𐑖𐑴 𐑷𐑤 𐑤𐑲𐑕𐑩𐑯𐑕𐑩𐑟'; + + @override + String get policyPageTitle => '𐑐𐑮𐑦𐑝𐑩𐑕𐑦 𐑐𐑪𐑤𐑩𐑕𐑦'; + + @override + String get collectionPageTitle => '𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯'; + + @override + String get collectionPickPageTitle => '𐑐𐑦𐑒'; + + @override + String get collectionSelectPageTitle => '𐑕𐑦𐑤𐑧𐑒𐑑 𐑲𐑑𐑩𐑥𐑟'; + + @override + String get collectionActionShowTitleSearch => '𐑖𐑴 𐑑𐑲𐑑𐑩𐑤 𐑓𐑦𐑤𐑑𐑼'; + + @override + String get collectionActionHideTitleSearch => '𐑣𐑲𐑛 𐑑𐑲𐑑𐑩𐑤 𐑓𐑦𐑤𐑑𐑼'; + + @override + String get collectionActionAddDynamicAlbum => '𐑨𐑛 𐑛𐑲𐑯𐑨𐑥𐑦𐑒 𐑨𐑤𐑚𐑩𐑥'; + + @override + String get collectionActionAddShortcut => '𐑨𐑛 𐑖𐑹𐑑𐑒𐑳𐑑'; + + @override + String get collectionActionSetHome => '𐑕𐑧𐑑 𐑨𐑟 𐑣𐑴𐑥'; + + @override + String get collectionActionEmptyBin => '𐑧𐑥𐑐𐑑𐑦 𐑚𐑦𐑯'; + + @override + String get collectionActionCopy => '𐑒𐑪𐑐𐑦 𐑑 𐑨𐑤𐑚𐑩𐑥'; + + @override + String get collectionActionMove => '𐑥𐑵𐑝 𐑑 𐑨𐑤𐑚𐑩𐑥'; + + @override + String get collectionActionRescan => '𐑮𐑰𐑕𐑒𐑨𐑯'; + + @override + String get collectionActionEdit => '𐑧𐑛𐑦𐑑'; + + @override + String get collectionSearchTitlesHintText => '𐑕𐑻𐑗 𐑑𐑲𐑑𐑩𐑤𐑟'; + + @override + String get collectionGroupAlbum => '𐑚𐑲 𐑨𐑤𐑚𐑩𐑥'; + + @override + String get collectionGroupMonth => '𐑚𐑲 𐑥𐑳𐑯𐑔'; + + @override + String get collectionGroupDay => '𐑚𐑲 𐑛𐑱'; + + @override + String get sectionNone => '𐑯𐑴 𐑕𐑧𐑒𐑖𐑩𐑯𐑟'; + + @override + String get sectionUnknown => '𐑳𐑯𐑯𐑴𐑯'; + + @override + String get dateToday => '𐑑𐑫𐑛𐑱'; + + @override + String get dateYesterday => '𐑘𐑧𐑕𐑑𐑼𐑛𐑱'; + + @override + String get dateThisMonth => '𐑞𐑦𐑕 𐑥𐑳𐑯𐑔'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '𐑓𐑱𐑤𐑛 𐑑 𐑛𐑦𐑤𐑰𐑑 $countString 𐑲𐑑𐑩𐑥𐑟', + one: '𐑓𐑱𐑤𐑛 𐑑 𐑛𐑦𐑤𐑰𐑑 1 𐑲𐑑𐑩𐑥', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '𐑓𐑱𐑤𐑛 𐑑 𐑒𐑪𐑐𐑦 $countString 𐑲𐑑𐑩𐑥𐑟', + one: '𐑓𐑱𐑤𐑛 𐑑 𐑒𐑪𐑐𐑦 1 𐑲𐑑𐑩𐑥', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '𐑓𐑱𐑤𐑛 𐑑 𐑥𐑵𐑝 $countString 𐑲𐑑𐑩𐑥𐑟', + one: '𐑓𐑱𐑤𐑛 𐑑 𐑥𐑵𐑝 1 𐑲𐑑𐑩𐑥', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑯𐑱𐑥 $countString 𐑲𐑑𐑩𐑥𐑟', + one: '𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑯𐑱𐑥 1 𐑲𐑑𐑩𐑥', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '𐑓𐑱𐑤𐑛 𐑑 𐑧𐑛𐑦𐑑 $countString 𐑲𐑑𐑩𐑥𐑟', + one: '𐑓𐑱𐑤𐑛 𐑑 𐑧𐑛𐑦𐑑 1 𐑲𐑑𐑩𐑥', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '𐑓𐑱𐑤𐑛 𐑑 𐑦𐑒𐑕𐑐𐑹𐑑 $countString 𐑐𐑱𐑡𐑩𐑟', + one: '𐑓𐑱𐑤𐑛 𐑑 𐑦𐑒𐑕𐑐𐑹𐑑 1 𐑐𐑱𐑡', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '𐑒𐑪𐑐𐑦𐑛 $countString 𐑲𐑑𐑩𐑥𐑟', + one: '𐑒𐑪𐑐𐑦𐑛 1 𐑲𐑑𐑩𐑥', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '𐑥𐑵𐑝𐑛 $countString 𐑲𐑑𐑩𐑥𐑟', + one: '𐑥𐑵𐑝𐑛 1 𐑲𐑑𐑩𐑥', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '𐑮𐑰𐑯𐑱𐑥𐑛 $countString 𐑲𐑑𐑩𐑥𐑟', + one: '𐑮𐑰𐑯𐑱𐑥𐑛 1 𐑲𐑑𐑩𐑥', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '𐑧𐑛𐑦𐑑𐑩𐑛 $countString 𐑲𐑑𐑩𐑥𐑟', + one: '𐑧𐑛𐑦𐑑𐑩𐑛 1 𐑲𐑑𐑩𐑥', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => '𐑯𐑴 𐑓𐑱𐑝𐑼𐑦𐑑𐑕'; + + @override + String get collectionEmptyVideos => '𐑯𐑴 𐑝𐑦𐑛𐑦𐑴𐑟'; + + @override + String get collectionEmptyImages => '𐑯𐑴 𐑦𐑥𐑦𐑡𐑩𐑟'; + + @override + String get collectionEmptyGrantAccessButtonLabel => '𐑜𐑮𐑭𐑯𐑑 𐑨𐑒𐑕𐑧𐑕'; + + @override + String get collectionSelectSectionTooltip => '𐑕𐑦𐑤𐑧𐑒𐑑 𐑕𐑧𐑒𐑖𐑩𐑯'; + + @override + String get collectionDeselectSectionTooltip => '𐑛𐑰𐑕𐑦𐑤𐑧𐑒𐑑 𐑕𐑧𐑒𐑖𐑩𐑯'; + + @override + String get drawerAboutButton => '𐑩𐑚𐑬𐑑'; + + @override + String get drawerSettingsButton => '𐑕𐑧𐑑𐑦𐑙𐑟'; + + @override + String get drawerCollectionAll => '𐑷𐑤 𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯'; + + @override + String get drawerCollectionFavourites => '𐑓𐑱𐑝𐑼𐑦𐑑𐑕'; + + @override + String get drawerCollectionImages => '𐑦𐑥𐑦𐑡𐑩𐑟'; + + @override + String get drawerCollectionVideos => '𐑝𐑦𐑛𐑦𐑴𐑟'; + + @override + String get drawerCollectionAnimated => '𐑨𐑯𐑦𐑥𐑱𐑑𐑩𐑛'; + + @override + String get drawerCollectionMotionPhotos => '𐑥𐑴𐑖𐑩𐑯 𐑓𐑴𐑑𐑴𐑟'; + + @override + String get drawerCollectionPanoramas => '𐑐𐑨𐑯𐑼𐑭𐑥𐑩𐑟'; + + @override + String get drawerCollectionRaws => '𐑮𐑷 𐑓𐑴𐑑𐑴𐑟'; + + @override + String get drawerCollectionSphericalVideos => '360° 𐑝𐑦𐑛𐑦𐑴𐑟'; + + @override + String get drawerAlbumPage => '𐑨𐑤𐑚𐑩𐑥𐑟'; + + @override + String get drawerCountryPage => '𐑒𐑳𐑯𐑑𐑮𐑦𐑟'; + + @override + String get drawerPlacePage => '𐑐𐑤𐑱𐑕𐑩𐑟'; + + @override + String get drawerTagPage => '𐑑𐑨𐑜𐑟'; + + @override + String get sortByDate => '𐑚𐑲 𐑛𐑱𐑑'; + + @override + String get sortByName => '𐑚𐑲 𐑯𐑱𐑥'; + + @override + String get sortByItemCount => '𐑚𐑲 𐑲𐑑𐑩𐑥 𐑒𐑬𐑯𐑑'; + + @override + String get sortBySize => '𐑚𐑲 𐑕𐑲𐑟'; + + @override + String get sortByAlbumFileName => '𐑚𐑲 𐑨𐑤𐑚𐑩𐑥 𐑯 𐑲𐑑𐑩𐑥 𐑑𐑲𐑑𐑩𐑤'; + + @override + String get sortByRating => '𐑚𐑲 𐑮𐑱𐑑𐑦𐑙'; + + @override + String get sortByDuration => '𐑚𐑲 𐑛𐑘𐑫𐑼𐑱𐑖𐑩𐑯'; + + @override + String get sortByPath => '𐑚𐑲 𐑐𐑭𐑔'; + + @override + String get sortOrderNewestFirst => '𐑯𐑿𐑩𐑕𐑑 𐑓𐑻𐑕𐑑'; + + @override + String get sortOrderOldestFirst => '𐑴𐑤𐑛𐑩𐑕𐑑 𐑓𐑻𐑕𐑑'; + + @override + String get sortOrderAtoZ => '·𐑐 𐑑 ·𐑿'; + + @override + String get sortOrderZtoA => '·𐑿 𐑑 ·𐑐'; + + @override + String get sortOrderHighestFirst => '𐑣𐑲𐑩𐑕𐑑 𐑓𐑻𐑕𐑑'; + + @override + String get sortOrderLowestFirst => '𐑤𐑴𐑩𐑕𐑑 𐑓𐑻𐑕𐑑'; + + @override + String get sortOrderLargestFirst => '𐑤𐑸𐑡𐑩𐑕𐑑 𐑓𐑻𐑕𐑑'; + + @override + String get sortOrderSmallestFirst => '𐑕𐑥𐑷𐑤𐑩𐑕𐑑 𐑓𐑻𐑕𐑑'; + + @override + String get sortOrderShortestFirst => '𐑖𐑹𐑑𐑩𐑕𐑑 𐑓𐑻𐑕𐑑'; + + @override + String get sortOrderLongestFirst => '𐑤𐑪𐑙𐑜𐑩𐑕𐑑 𐑓𐑻𐑕𐑑'; + + @override + String get albumGroupTier => '𐑚𐑲 𐑑𐑽'; + + @override + String get albumGroupType => '𐑚𐑲 𐑑𐑲𐑐'; + + @override + String get albumGroupVolume => '𐑚𐑲 𐑕𐑑𐑹𐑦𐑡 𐑝𐑪𐑤𐑿𐑥'; + + @override + String get albumMimeTypeMixed => '𐑥𐑦𐑒𐑕𐑑'; + + @override + String get albumPickPageTitleCopy => '𐑒𐑪𐑐𐑦 𐑑 𐑨𐑤𐑚𐑩𐑥'; + + @override + String get albumPickPageTitleExport => '𐑦𐑒𐑕𐑐𐑹𐑑 𐑑 𐑨𐑤𐑚𐑩𐑥'; + + @override + String get albumPickPageTitleMove => '𐑥𐑵𐑝 𐑑 𐑨𐑤𐑚𐑩𐑥'; + + @override + String get albumPickPageTitlePick => '𐑐𐑦𐑒 𐑨𐑤𐑚𐑩𐑥'; + + @override + String get albumCamera => '𐑒𐑨𐑥𐑼𐑩'; + + @override + String get albumDownload => '𐑛𐑬𐑯𐑤𐑴𐑛'; + + @override + String get albumScreenshots => '𐑕𐑒𐑮𐑰𐑯𐑖𐑪𐑑𐑕'; + + @override + String get albumScreenRecordings => '𐑕𐑒𐑮𐑰𐑯 𐑮𐑦𐑒𐑹𐑛𐑦𐑙𐑟'; + + @override + String get albumVideoCaptures => '𐑝𐑦𐑛𐑦𐑴 𐑒𐑨𐑐𐑗𐑼𐑟'; + + @override + String get albumPageTitle => '𐑨𐑤𐑚𐑩𐑥𐑟'; + + @override + String get albumEmpty => '𐑯𐑴 𐑨𐑤𐑚𐑩𐑥𐑟'; + + @override + String get createAlbumButtonLabel => '𐑒𐑮𐑦𐑱𐑑'; + + @override + String get newFilterBanner => '𐑯𐑿'; + + @override + String get countryPageTitle => '𐑒𐑳𐑯𐑑𐑮𐑦𐑟'; + + @override + String get countryEmpty => '𐑯𐑴 𐑒𐑳𐑯𐑑𐑮𐑦𐑟'; + + @override + String get statePageTitle => '𐑕𐑑𐑱𐑑𐑕'; + + @override + String get stateEmpty => '𐑯𐑴 𐑕𐑑𐑱𐑑𐑕'; + + @override + String get placePageTitle => '𐑐𐑤𐑱𐑕𐑩𐑟'; + + @override + String get placeEmpty => '𐑯𐑴 𐑐𐑤𐑱𐑕𐑩𐑟'; + + @override + String get tagPageTitle => '𐑑𐑨𐑜𐑟'; + + @override + String get tagEmpty => '𐑯𐑴 𐑑𐑨𐑜𐑟'; + + @override + String get tagPickPageTitle => '𐑐𐑦𐑒 𐑑𐑨𐑜'; + + @override + String get binPageTitle => '𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯'; + + @override + String get explorerPageTitle => '𐑦𐑒𐑕𐑐𐑤𐑹𐑼'; + + @override + String get explorerActionSelectStorageVolume => '𐑕𐑦𐑤𐑧𐑒𐑑 𐑕𐑑𐑹𐑦𐑡'; + + @override + String get selectStorageVolumeDialogTitle => '𐑕𐑦𐑤𐑧𐑒𐑑 𐑕𐑑𐑹𐑦𐑡'; + + @override + String get searchCollectionFieldHint => '𐑕𐑻𐑗 𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯'; + + @override + String get searchRecentSectionTitle => '𐑮𐑰𐑕𐑩𐑯𐑑'; + + @override + String get searchDateSectionTitle => '𐑛𐑱𐑑'; + + @override + String get searchFormatSectionTitle => '𐑓𐑹𐑥𐑨𐑑𐑕'; + + @override + String get searchAlbumsSectionTitle => '𐑨𐑤𐑚𐑩𐑥𐑟'; + + @override + String get searchCountriesSectionTitle => '𐑒𐑳𐑯𐑑𐑮𐑦𐑟'; + + @override + String get searchStatesSectionTitle => '𐑕𐑑𐑱𐑑𐑕'; + + @override + String get searchPlacesSectionTitle => '𐑐𐑤𐑱𐑕𐑩𐑟'; + + @override + String get searchTagsSectionTitle => '𐑑𐑨𐑜𐑟'; + + @override + String get searchRatingSectionTitle => '𐑮𐑱𐑑𐑦𐑙𐑟'; + + @override + String get searchMetadataSectionTitle => '𐑥𐑧𐑑𐑩𐑛𐑱𐑑𐑩'; + + @override + String get settingsPageTitle => '𐑕𐑧𐑑𐑦𐑙𐑟'; + + @override + String get settingsSystemDefault => '𐑕𐑦𐑕𐑑𐑩𐑥 𐑛𐑦𐑓𐑷𐑤𐑑'; + + @override + String get settingsDefault => '𐑛𐑦𐑓𐑷𐑤𐑑'; + + @override + String get settingsDisabled => '𐑛𐑦𐑕𐑱𐑚𐑩𐑤𐑛'; + + @override + String get settingsAskEverytime => '𐑭𐑕𐑒 𐑧𐑝𐑮𐑦𐑑𐑲𐑥'; + + @override + String get settingsModificationWarningDialogMessage => '𐑳𐑞𐑼 𐑕𐑧𐑑𐑦𐑙𐑟 𐑢𐑦𐑤 𐑚𐑰 𐑥𐑪𐑛𐑦𐑓𐑲𐑛.'; + + @override + String get settingsSearchFieldLabel => '𐑕𐑻𐑗 𐑕𐑧𐑑𐑦𐑙𐑟'; + + @override + String get settingsSearchEmpty => '𐑯𐑴 𐑥𐑨𐑗𐑦𐑙 𐑕𐑧𐑑𐑦𐑙'; + + @override + String get settingsActionExport => '𐑦𐑒𐑕𐑐𐑹𐑑'; + + @override + String get settingsActionExportDialogTitle => '𐑦𐑒𐑕𐑐𐑹𐑑'; + + @override + String get settingsActionImport => '𐑦𐑥𐑐𐑹𐑑'; + + @override + String get settingsActionImportDialogTitle => '𐑦𐑥𐑐𐑹𐑑'; + + @override + String get appExportCovers => '𐑒𐑳𐑝𐑼𐑟'; + + @override + String get appExportDynamicAlbums => '𐑛𐑲𐑯𐑨𐑥𐑦𐑒 𐑨𐑤𐑚𐑩𐑥𐑟'; + + @override + String get appExportFavourites => '𐑓𐑱𐑝𐑼𐑦𐑑𐑕'; + + @override + String get appExportSettings => '𐑕𐑧𐑑𐑦𐑙𐑟'; + + @override + String get settingsNavigationSectionTitle => '𐑯𐑨𐑝𐑦𐑜𐑱𐑖𐑩𐑯'; + + @override + String get settingsHomeTile => '𐑣𐑴𐑥'; + + @override + String get settingsHomeDialogTitle => '𐑣𐑴𐑥'; + + @override + String get setHomeCustom => '𐑒𐑳𐑕𐑑𐑩𐑥'; + + @override + String get settingsKeepScreenOnTile => '𐑒𐑰𐑐 𐑕𐑒𐑮𐑰𐑯 𐑪𐑯'; + + @override + String get settingsKeepScreenOnDialogTitle => '𐑒𐑰𐑐 𐑕𐑒𐑮𐑰𐑯 𐑪𐑯'; + + @override + String get settingsDoubleBackExit => '𐑑𐑨𐑐 «𐑚𐑨𐑒» 𐑑𐑢𐑲𐑕 𐑑 𐑧𐑒𐑕𐑦𐑑'; + + @override + String get settingsConfirmationTile => '𐑒𐑪𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯 𐑛𐑲𐑩𐑤𐑪𐑜𐑟'; + + @override + String get settingsConfirmationDialogTitle => '𐑒𐑪𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯 𐑛𐑲𐑩𐑤𐑪𐑜𐑟'; + + @override + String get settingsConfirmationBeforeDeleteItems => '𐑭𐑕𐑒 𐑚𐑦𐑓𐑹 𐑛𐑦𐑤𐑰𐑑𐑦𐑙 𐑲𐑑𐑩𐑥𐑟 𐑓𐑼𐑧𐑝𐑼'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => '𐑭𐑕𐑒 𐑚𐑦𐑓𐑹 𐑥𐑵𐑝𐑦𐑙 𐑲𐑑𐑩𐑥𐑟 𐑑 𐑞 𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => '𐑭𐑕𐑒 𐑚𐑦𐑓𐑹 𐑥𐑵𐑝𐑦𐑙 𐑳𐑯𐑛𐑱𐑑𐑩𐑛 𐑲𐑑𐑩𐑥𐑟'; + + @override + String get settingsConfirmationAfterMoveToBinItems => '𐑖𐑴 𐑥𐑧𐑕𐑦𐑡 𐑭𐑓𐑑𐑼 𐑥𐑵𐑝𐑦𐑙 𐑲𐑑𐑩𐑥𐑟 𐑑 𐑞 𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯'; + + @override + String get settingsConfirmationVaultDataLoss => '𐑖𐑴 𐑝𐑷𐑤𐑑 𐑛𐑱𐑑𐑩 𐑤𐑪𐑕 𐑢𐑹𐑯𐑦𐑙'; + + @override + String get settingsNavigationDrawerTile => '𐑯𐑨𐑝𐑦𐑜𐑱𐑖𐑩𐑯 𐑥𐑧𐑯𐑿'; + + @override + String get settingsNavigationDrawerEditorPageTitle => '𐑯𐑨𐑝𐑦𐑜𐑱𐑖𐑩𐑯 𐑥𐑧𐑯𐑿'; + + @override + String get settingsNavigationDrawerBanner => '𐑑𐑳𐑗 𐑯 𐑣𐑴𐑤𐑛 𐑑 𐑥𐑵𐑝 𐑯 𐑮𐑰𐑹𐑛𐑼 𐑥𐑧𐑯𐑿 𐑲𐑑𐑩𐑥𐑟.'; + + @override + String get settingsNavigationDrawerTabTypes => '𐑑𐑲𐑐𐑕'; + + @override + String get settingsNavigationDrawerTabAlbums => '𐑨𐑤𐑚𐑩𐑥𐑟'; + + @override + String get settingsNavigationDrawerTabPages => '𐑐𐑱𐑡𐑩𐑟'; + + @override + String get settingsNavigationDrawerAddAlbum => '𐑨𐑛 𐑨𐑤𐑚𐑩𐑥'; + + @override + String get settingsNavigationBottomActionsTile => '𐑚𐑪𐑑𐑩𐑥 𐑯𐑨𐑝𐑦𐑜𐑱𐑖𐑩𐑯'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => '𐑚𐑪𐑑𐑩𐑥 𐑯𐑨𐑝𐑦𐑜𐑱𐑖𐑩𐑯'; + + @override + String get settingsNavigationBottomActionEditorBanner => '𐑑𐑳𐑗 𐑯 𐑣𐑴𐑤𐑛 𐑑 𐑥𐑵𐑝 𐑚𐑳𐑑𐑩𐑯𐑟 𐑯 𐑕𐑦𐑤𐑧𐑒𐑑 𐑢𐑦𐑗 𐑨𐑒𐑖𐑩𐑯𐑟 𐑸 𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑦𐑯 𐑞 𐑚𐑪𐑑𐑩𐑥 𐑯𐑨𐑝𐑦𐑜𐑱𐑖𐑩𐑯 𐑚𐑸.'; + + @override + String get settingsThumbnailSectionTitle => '𐑔𐑳𐑥𐑯𐑱𐑤𐑟'; + + @override + String get settingsThumbnailOverlayTile => '𐑴𐑝𐑼𐑤𐑱'; + + @override + String get settingsThumbnailOverlayPageTitle => '𐑴𐑝𐑼𐑤𐑱'; + + @override + String get settingsThumbnailShowHdrIcon => '𐑖𐑴 ⸰𐑣𐑛𐑮 𐑲𐑒𐑪𐑯'; + + @override + String get settingsThumbnailShowFavouriteIcon => '𐑖𐑴 𐑓𐑱𐑝𐑼𐑦𐑑 𐑲𐑒𐑪𐑯'; + + @override + String get settingsThumbnailShowTagIcon => '𐑖𐑴 𐑑𐑨𐑜 𐑲𐑒𐑪𐑯'; + + @override + String get settingsThumbnailShowLocationIcon => '𐑖𐑴 𐑤𐑴𐑒𐑱𐑖𐑩𐑯 𐑲𐑒𐑪𐑯'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => '𐑖𐑴 𐑥𐑴𐑖𐑩𐑯 𐑓𐑴𐑑𐑴 𐑲𐑒𐑪𐑯'; + + @override + String get settingsThumbnailShowRating => '𐑖𐑴 𐑮𐑱𐑑𐑦𐑙'; + + @override + String get settingsThumbnailShowRawIcon => '𐑖𐑴 𐑮𐑷 𐑲𐑒𐑪𐑯'; + + @override + String get settingsThumbnailShowVideoDuration => '𐑖𐑴 𐑝𐑦𐑛𐑦𐑴 𐑛𐑘𐑫𐑼𐑱𐑖𐑩𐑯'; + + @override + String get settingsCollectionQuickActionsTile => '𐑒𐑢𐑦𐑒 𐑨𐑒𐑖𐑩𐑯𐑟'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => '𐑒𐑢𐑦𐑒 𐑨𐑒𐑖𐑩𐑯𐑟'; + + @override + String get settingsCollectionQuickActionTabBrowsing => '𐑚𐑮𐑬𐑟𐑦𐑙'; + + @override + String get settingsCollectionQuickActionTabSelecting => '𐑕𐑦𐑤𐑧𐑒𐑑𐑦𐑙'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => '𐑑𐑳𐑗 𐑯 𐑣𐑴𐑤𐑛 𐑑 𐑥𐑵𐑝 𐑚𐑳𐑑𐑩𐑯𐑟 𐑯 𐑕𐑦𐑤𐑧𐑒𐑑 𐑢𐑦𐑗 𐑨𐑒𐑖𐑩𐑯𐑟 𐑸 𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑢𐑧𐑯 𐑚𐑮𐑬𐑟𐑦𐑙 𐑲𐑑𐑩𐑥𐑟.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => '𐑑𐑳𐑗 𐑯 𐑣𐑴𐑤𐑛 𐑑 𐑥𐑵𐑝 𐑚𐑳𐑑𐑩𐑯𐑟 𐑯 𐑕𐑦𐑤𐑧𐑒𐑑 𐑢𐑦𐑗 𐑨𐑒𐑖𐑩𐑯𐑟 𐑸 𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑢𐑧𐑯 𐑕𐑦𐑤𐑧𐑒𐑑𐑦𐑙 𐑲𐑑𐑩𐑥𐑟.'; + + @override + String get settingsCollectionBurstPatternsTile => '𐑚𐑻𐑕𐑑 𐑐𐑨𐑑𐑼𐑯𐑟'; + + @override + String get settingsCollectionBurstPatternsNone => '𐑯𐑳𐑯'; + + @override + String get settingsViewerSectionTitle => '𐑝𐑿𐑼'; + + @override + String get settingsViewerGestureSideTapNext => '𐑑𐑨𐑐 𐑪𐑯 𐑕𐑒𐑮𐑰𐑯 𐑧𐑡𐑩𐑟 𐑑 𐑖𐑴 𐑐𐑮𐑰𐑝𐑾𐑕/𐑯𐑧𐑒𐑕𐑑 𐑲𐑑𐑩𐑥'; + + @override + String get settingsViewerUseCutout => '𐑿𐑟 𐑒𐑳𐑑𐑬𐑑 𐑺𐑾'; + + @override + String get settingsViewerMaximumBrightness => '𐑥𐑨𐑒𐑕𐑦𐑥𐑩𐑥 𐑚𐑮𐑲𐑑𐑯𐑩𐑕'; + + @override + String get settingsMotionPhotoAutoPlay => '𐑷𐑑𐑴 𐑐𐑤𐑱 𐑥𐑴𐑖𐑩𐑯 𐑓𐑴𐑑𐑴𐑟'; + + @override + String get settingsImageBackground => '𐑦𐑥𐑦𐑡 𐑚𐑨𐑒𐑜𐑮𐑬𐑯𐑛'; + + @override + String get settingsViewerQuickActionsTile => '𐑒𐑢𐑦𐑒 𐑨𐑒𐑖𐑩𐑯𐑟'; + + @override + String get settingsViewerQuickActionEditorPageTitle => '𐑒𐑢𐑦𐑒 𐑨𐑒𐑖𐑩𐑯𐑟'; + + @override + String get settingsViewerQuickActionEditorBanner => '𐑑𐑳𐑗 𐑯 𐑣𐑴𐑤𐑛 𐑑 𐑥𐑵𐑝 𐑚𐑳𐑑𐑩𐑯𐑟 𐑯 𐑕𐑦𐑤𐑧𐑒𐑑 𐑢𐑦𐑗 𐑨𐑒𐑖𐑩𐑯𐑟 𐑸 𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑦𐑯 𐑞 𐑝𐑿𐑼.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => '𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑚𐑳𐑑𐑩𐑯𐑟'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => '𐑩𐑝𐑱𐑤𐑩𐑚𐑩𐑤 𐑚𐑳𐑑𐑩𐑯𐑟'; + + @override + String get settingsViewerQuickActionEmpty => '𐑯𐑴 𐑚𐑳𐑑𐑩𐑯𐑟'; + + @override + String get settingsViewerOverlayTile => '𐑴𐑝𐑼𐑤𐑱'; + + @override + String get settingsViewerOverlayPageTitle => '𐑴𐑝𐑼𐑤𐑱'; + + @override + String get settingsViewerShowOverlayOnOpening => '𐑖𐑴 𐑪𐑯 𐑴𐑐𐑩𐑯𐑦𐑙'; + + @override + String get settingsViewerShowHistogram => '𐑖𐑴 𐑣𐑦𐑕𐑑𐑩𐑜𐑮𐑨𐑥'; + + @override + String get settingsViewerShowMinimap => '𐑖𐑴 𐑥𐑦𐑯𐑦𐑥𐑨𐑐'; + + @override + String get settingsViewerShowInformation => '𐑖𐑴 𐑦𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯'; + + @override + String get settingsViewerShowInformationSubtitle => '𐑖𐑴 𐑑𐑲𐑑𐑩𐑤, 𐑛𐑱𐑑, 𐑤𐑴𐑒𐑱𐑖𐑩𐑯, 𐑯𐑯𐑯'; + + @override + String get settingsViewerShowRatingTags => '𐑖𐑴 𐑮𐑱𐑑𐑦𐑙 𐑯 𐑑𐑨𐑜𐑟'; + + @override + String get settingsViewerShowShootingDetails => '𐑖𐑴 𐑖𐑵𐑑𐑦𐑙 𐑛𐑰𐑑𐑱𐑤𐑟'; + + @override + String get settingsViewerShowDescription => '𐑖𐑴 𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯'; + + @override + String get settingsViewerShowOverlayThumbnails => '𐑖𐑴 𐑔𐑳𐑥𐑯𐑱𐑤𐑟'; + + @override + String get settingsViewerEnableOverlayBlurEffect => '𐑚𐑤𐑻 𐑦𐑓𐑧𐑒𐑑'; + + @override + String get settingsViewerSlideshowTile => '𐑕𐑤𐑲𐑛𐑖𐑴'; + + @override + String get settingsViewerSlideshowPageTitle => '𐑕𐑤𐑲𐑛𐑖𐑴'; + + @override + String get settingsSlideshowRepeat => '𐑮𐑦𐑐𐑰𐑑'; + + @override + String get settingsSlideshowShuffle => '𐑖𐑳𐑓𐑩𐑤'; + + @override + String get settingsSlideshowFillScreen => '𐑓𐑦𐑤 𐑕𐑒𐑮𐑰𐑯'; + + @override + String get settingsSlideshowAnimatedZoomEffect => '𐑨𐑯𐑦𐑥𐑱𐑑𐑩𐑛 𐑟𐑵𐑥 𐑦𐑓𐑧𐑒𐑑'; + + @override + String get settingsSlideshowTransitionTile => '𐑑𐑮𐑨𐑯𐑟𐑦𐑖𐑩𐑯'; + + @override + String get settingsSlideshowIntervalTile => '𐑦𐑯𐑑𐑼𐑝𐑩𐑤'; + + @override + String get settingsSlideshowVideoPlaybackTile => '𐑝𐑦𐑛𐑦𐑴 𐑐𐑤𐑱𐑚𐑨𐑒'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => '𐑝𐑦𐑛𐑦𐑴 𐑐𐑤𐑱𐑚𐑨𐑒'; + + @override + String get settingsVideoPageTitle => '𐑝𐑦𐑛𐑦𐑴 𐑕𐑧𐑑𐑦𐑙𐑟'; + + @override + String get settingsVideoSectionTitle => '𐑝𐑦𐑛𐑦𐑴'; + + @override + String get settingsVideoShowVideos => '𐑖𐑴 𐑝𐑦𐑛𐑦𐑴𐑟'; + + @override + String get settingsVideoPlaybackTile => '𐑐𐑤𐑱𐑚𐑨𐑒'; + + @override + String get settingsVideoPlaybackPageTitle => '𐑐𐑤𐑱𐑚𐑨𐑒'; + + @override + String get settingsVideoEnableHardwareAcceleration => '𐑣𐑸𐑛𐑢𐑺 𐑩𐑒𐑕𐑧𐑤𐑼𐑱𐑖𐑩𐑯'; + + @override + String get settingsVideoAutoPlay => '𐑷𐑑𐑴 𐑐𐑤𐑱'; + + @override + String get settingsVideoLoopModeTile => '𐑤𐑵𐑐 𐑥𐑴𐑛'; + + @override + String get settingsVideoLoopModeDialogTitle => '𐑤𐑵𐑐 𐑥𐑴𐑛'; + + @override + String get settingsVideoResumptionModeTile => '𐑮𐑦𐑟𐑿𐑥 𐑐𐑤𐑱𐑚𐑨𐑒'; + + @override + String get settingsVideoResumptionModeDialogTitle => '𐑮𐑦𐑟𐑿𐑥 𐑐𐑤𐑱𐑚𐑨𐑒'; + + @override + String get settingsVideoBackgroundMode => '𐑚𐑨𐑒𐑜𐑮𐑬𐑯𐑛 𐑥𐑴𐑛'; + + @override + String get settingsVideoBackgroundModeDialogTitle => '𐑚𐑨𐑒𐑜𐑮𐑬𐑯𐑛 𐑥𐑴𐑛'; + + @override + String get settingsVideoControlsTile => '𐑒𐑩𐑯𐑑𐑮𐑴𐑤𐑟'; + + @override + String get settingsVideoControlsPageTitle => '𐑒𐑩𐑯𐑑𐑮𐑴𐑤𐑟'; + + @override + String get settingsVideoButtonsTile => '𐑚𐑳𐑑𐑩𐑯𐑟'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => '𐑛𐑳𐑚𐑩𐑤 𐑑𐑨𐑐 𐑑 𐑐𐑤𐑱/𐑐𐑷𐑟'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => '𐑛𐑳𐑚𐑩𐑤 𐑑𐑨𐑐 𐑪𐑯 𐑕𐑒𐑮𐑰𐑯 𐑧𐑡𐑩𐑟 𐑑 𐑕𐑰𐑒 𐑚𐑨𐑒𐑢𐑼𐑛/𐑓𐑹𐑢𐑼𐑛'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => '𐑕𐑢𐑲𐑐 𐑳𐑐 𐑹 𐑛𐑬𐑯 𐑑 𐑩𐑡𐑳𐑕𐑑 𐑚𐑮𐑲𐑑𐑯𐑩𐑕/𐑝𐑪𐑤𐑿𐑥'; + + @override + String get settingsSubtitleThemeTile => '𐑕𐑳𐑚𐑑𐑲𐑑𐑩𐑤𐑟'; + + @override + String get settingsSubtitleThemePageTitle => '𐑕𐑳𐑚𐑑𐑲𐑑𐑩𐑤𐑟'; + + @override + String get settingsSubtitleThemeSample => '𐑞𐑦𐑕 𐑦𐑟 𐑩 𐑕𐑭𐑥𐑐𐑩𐑤.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => '𐑑𐑧𐑒𐑕𐑑 𐑩𐑤𐑲𐑯𐑥𐑩𐑯𐑑'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => '𐑑𐑧𐑒𐑕𐑑 𐑩𐑤𐑲𐑯𐑥𐑩𐑯𐑑'; + + @override + String get settingsSubtitleThemeTextPositionTile => '𐑑𐑧𐑒𐑕𐑑 𐑐𐑩𐑟𐑦𐑖𐑩𐑯'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => '𐑑𐑧𐑒𐑕𐑑 𐑐𐑩𐑟𐑦𐑖𐑩𐑯'; + + @override + String get settingsSubtitleThemeTextSize => '𐑑𐑧𐑒𐑕𐑑 𐑕𐑲𐑟'; + + @override + String get settingsSubtitleThemeShowOutline => '𐑖𐑴 𐑬𐑑𐑤𐑲𐑯 𐑯 𐑖𐑨𐑛𐑴'; + + @override + String get settingsSubtitleThemeTextColor => '𐑑𐑧𐑒𐑕𐑑 𐑒𐑳𐑤𐑼'; + + @override + String get settingsSubtitleThemeTextOpacity => '𐑑𐑧𐑒𐑕𐑑 𐑴𐑐𐑨𐑕𐑦𐑑𐑦'; + + @override + String get settingsSubtitleThemeBackgroundColor => '𐑚𐑨𐑒𐑜𐑮𐑬𐑯𐑛 𐑒𐑳𐑤𐑼'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => '𐑚𐑨𐑒𐑜𐑮𐑬𐑯𐑛 𐑴𐑐𐑨𐑕𐑦𐑑𐑦'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => '𐑤𐑧𐑓𐑑'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => '𐑕𐑧𐑯𐑑𐑼'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => '𐑮𐑲𐑑'; + + @override + String get settingsPrivacySectionTitle => '𐑐𐑮𐑦𐑝𐑩𐑕𐑦'; + + @override + String get settingsAllowInstalledAppAccess => '𐑩𐑤𐑬 𐑨𐑒𐑕𐑧𐑕 𐑑 𐑨𐑐 𐑦𐑯𐑝𐑩𐑯𐑑𐑼𐑦'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => '𐑿𐑟𐑛 𐑑 𐑦𐑥𐑐𐑮𐑵𐑝 𐑨𐑤𐑚𐑩𐑥 𐑛𐑦𐑕𐑐𐑤𐑱'; + + @override + String get settingsAllowErrorReporting => '𐑩𐑤𐑬 𐑩𐑯𐑪𐑯𐑦𐑥𐑩𐑕 𐑧𐑮𐑼 𐑮𐑦𐑐𐑹𐑑𐑦𐑙'; + + @override + String get settingsSaveSearchHistory => '𐑕𐑱𐑝 𐑕𐑻𐑗 𐑣𐑦𐑕𐑑𐑼𐑦'; + + @override + String get settingsEnableBin => '𐑿𐑟 𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯'; + + @override + String get settingsEnableBinSubtitle => '𐑒𐑰𐑐 𐑛𐑦𐑤𐑰𐑑𐑩𐑛 𐑲𐑑𐑩𐑥𐑟 𐑓 30 𐑛𐑱𐑟'; + + @override + String get settingsDisablingBinWarningDialogMessage => '𐑲𐑑𐑩𐑥𐑟 𐑦𐑯 𐑞 𐑮𐑰𐑕𐑲𐑒𐑩𐑤 𐑚𐑦𐑯 𐑢𐑦𐑤 𐑚𐑰 𐑛𐑦𐑤𐑰𐑑𐑩𐑛 𐑓𐑼𐑧𐑝𐑼.'; + + @override + String get settingsAllowMediaManagement => '𐑩𐑤𐑬 𐑥𐑰𐑛𐑾 𐑥𐑨𐑯𐑦𐑡𐑥𐑩𐑯𐑑'; + + @override + String get settingsHiddenItemsTile => '𐑣𐑦𐑛𐑩𐑯 𐑲𐑑𐑩𐑥𐑟'; + + @override + String get settingsHiddenItemsPageTitle => '𐑣𐑦𐑛𐑩𐑯 𐑲𐑑𐑩𐑥𐑟'; + + @override + String get settingsHiddenFiltersBanner => '𐑓𐑴𐑑𐑴𐑟 𐑯 𐑝𐑦𐑛𐑦𐑴𐑟 𐑥𐑨𐑗𐑦𐑙 𐑣𐑦𐑛𐑩𐑯 𐑓𐑦𐑤𐑑𐑼𐑟 𐑢𐑦𐑤 𐑯𐑪𐑑 𐑩𐑐𐑽 𐑦𐑯 𐑘𐑹 𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯.'; + + @override + String get settingsHiddenFiltersEmpty => '𐑯𐑴 𐑣𐑦𐑛𐑩𐑯 𐑓𐑦𐑤𐑑𐑼𐑟'; + + @override + String get settingsStorageAccessTile => '𐑕𐑑𐑹𐑦𐑡 𐑨𐑒𐑕𐑧𐑕'; + + @override + String get settingsStorageAccessPageTitle => '𐑕𐑑𐑹𐑦𐑡 𐑨𐑒𐑕𐑧𐑕'; + + @override + String get settingsStorageAccessBanner => + '𐑕𐑳𐑥 𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦𐑟 𐑮𐑦𐑒𐑢𐑲𐑼 𐑩𐑯 𐑦𐑒𐑕𐑐𐑤𐑦𐑕𐑦𐑑 𐑨𐑒𐑕𐑧𐑕 𐑜𐑮𐑭𐑯𐑑 𐑑 𐑥𐑪𐑛𐑦𐑓𐑲 𐑓𐑲𐑤𐑟 𐑦𐑯 𐑞𐑧𐑥. 𐑿 𐑒𐑨𐑯 𐑮𐑦𐑝𐑿 𐑣𐑽 𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦𐑟 𐑑 𐑢𐑦𐑗 𐑿 𐑐𐑮𐑰𐑝𐑾𐑕𐑤𐑦 𐑜𐑱𐑝 𐑨𐑒𐑕𐑧𐑕.'; + + @override + String get settingsStorageAccessEmpty => '𐑯𐑴 𐑨𐑒𐑕𐑧𐑕 𐑜𐑮𐑭𐑯𐑑𐑕'; + + @override + String get settingsStorageAccessRevokeTooltip => '𐑮𐑦𐑝𐑴𐑒'; + + @override + String get settingsAccessibilitySectionTitle => '𐑩𐑒𐑕𐑧𐑕𐑩𐑚𐑦𐑤𐑦𐑑𐑦'; + + @override + String get settingsRemoveAnimationsTile => '𐑮𐑦𐑥𐑵𐑝 𐑨𐑯𐑦𐑥𐑱𐑖𐑩𐑯𐑟'; + + @override + String get settingsRemoveAnimationsDialogTitle => '𐑮𐑦𐑥𐑵𐑝 𐑨𐑯𐑦𐑥𐑱𐑖𐑩𐑯𐑟'; + + @override + String get settingsTimeToTakeActionTile => '𐑑𐑲𐑥 𐑑 𐑑𐑱𐑒 𐑨𐑒𐑖𐑩𐑯'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => '𐑖𐑴 𐑥𐑳𐑤𐑑𐑦-𐑑𐑳𐑗 𐑡𐑧𐑕𐑗𐑼 𐑷𐑤𐑑𐑻𐑯𐑩𐑑𐑦𐑝𐑟'; + + @override + String get settingsDisplaySectionTitle => '𐑛𐑦𐑕𐑐𐑤𐑱'; + + @override + String get settingsThemeBrightnessTile => '𐑔𐑰𐑥'; + + @override + String get settingsThemeBrightnessDialogTitle => '𐑔𐑰𐑥'; + + @override + String get settingsThemeColorHighlights => '𐑒𐑳𐑤𐑼 𐑣𐑲𐑤𐑲𐑑𐑕'; + + @override + String get settingsThemeEnableDynamicColor => '𐑛𐑲𐑯𐑨𐑥𐑦𐑒 𐑒𐑳𐑤𐑼'; + + @override + String get settingsDisplayRefreshRateModeTile => '𐑛𐑦𐑕𐑐𐑤𐑱 𐑮𐑦𐑓𐑮𐑧𐑖 𐑮𐑱𐑑'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => '𐑮𐑦𐑓𐑮𐑧𐑖 𐑮𐑱𐑑'; + + @override + String get settingsDisplayUseTvInterface => '·𐑨𐑯𐑛𐑮𐑶𐑛 ⸰𐑑𐑝 𐑦𐑯𐑑𐑼𐑓𐑱𐑕'; + + @override + String get settingsLanguageSectionTitle => '𐑤𐑨𐑙𐑜𐑢𐑦𐑡 𐑯 𐑓𐑹𐑥𐑨𐑑𐑕'; + + @override + String get settingsLanguageTile => '𐑤𐑨𐑙𐑜𐑢𐑦𐑡'; + + @override + String get settingsLanguagePageTitle => '𐑤𐑨𐑙𐑜𐑢𐑦𐑡'; + + @override + String get settingsCoordinateFormatTile => '𐑒𐑴𐑹𐑛𐑦𐑯𐑩𐑑 𐑓𐑹𐑥𐑨𐑑'; + + @override + String get settingsCoordinateFormatDialogTitle => '𐑒𐑴𐑹𐑛𐑦𐑯𐑩𐑑 𐑓𐑹𐑥𐑨𐑑'; + + @override + String get settingsUnitSystemTile => '𐑿𐑯𐑦𐑑𐑕'; + + @override + String get settingsUnitSystemDialogTitle => '𐑿𐑯𐑦𐑑𐑕'; + + @override + String get settingsForceWesternArabicNumeralsTile => '𐑓𐑹𐑕 ·𐑨𐑮𐑩𐑚𐑦𐑒 𐑯𐑿𐑥𐑼𐑩𐑤𐑟'; + + @override + String get settingsScreenSaverPageTitle => '𐑕𐑒𐑮𐑰𐑯 𐑕𐑱𐑝𐑼'; + + @override + String get settingsWidgetPageTitle => '𐑓𐑴𐑑𐑴 𐑓𐑮𐑱𐑥'; + + @override + String get settingsWidgetShowOutline => '𐑬𐑑𐑤𐑲𐑯'; + + @override + String get settingsWidgetOpenPage => '𐑢𐑧𐑯 𐑑𐑨𐑐𐑦𐑙 𐑪𐑯 𐑞 𐑢𐑦𐑡𐑩𐑑'; + + @override + String get settingsWidgetDisplayedItem => '𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑲𐑑𐑩𐑥'; + + @override + String get settingsCollectionTile => '𐑒𐑩𐑤𐑧𐑒𐑖𐑩𐑯'; + + @override + String get statsPageTitle => '𐑕𐑑𐑨𐑑𐑕'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 𐑲𐑑𐑩𐑥𐑟 𐑢𐑦𐑞 𐑤𐑴𐑒𐑱𐑖𐑩𐑯', + one: '1 𐑲𐑑𐑩𐑥 𐑢𐑦𐑞 𐑤𐑴𐑒𐑱𐑖𐑩𐑯', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => '𐑑𐑪𐑐 𐑒𐑳𐑯𐑑𐑮𐑦𐑟'; + + @override + String get statsTopStatesSectionTitle => '𐑑𐑪𐑐 𐑕𐑑𐑱𐑑𐑕'; + + @override + String get statsTopPlacesSectionTitle => '𐑑𐑪𐑐 𐑐𐑤𐑱𐑕𐑩𐑟'; + + @override + String get statsTopTagsSectionTitle => '𐑑𐑪𐑐 𐑑𐑨𐑜𐑟'; + + @override + String get statsTopAlbumsSectionTitle => '𐑑𐑪𐑐 𐑨𐑤𐑚𐑩𐑥𐑟'; + + @override + String get viewerOpenPanoramaButtonLabel => '𐑴𐑐𐑩𐑯 𐑐𐑨𐑯𐑼𐑭𐑥𐑩'; + + @override + String get viewerSetWallpaperButtonLabel => '𐑕𐑧𐑑 𐑢𐑷𐑤𐑐𐑱𐑐𐑼'; + + @override + String get viewerErrorUnknown => '¡𐑵𐑐𐑕!'; + + @override + String get viewerErrorDoesNotExist => '𐑞 𐑓𐑲𐑤 𐑯𐑴 𐑤𐑪𐑙𐑜𐑼 𐑦𐑜𐑟𐑦𐑕𐑑𐑕.'; + + @override + String get viewerInfoPageTitle => '𐑦𐑯𐑓𐑴'; + + @override + String get viewerInfoBackToViewerTooltip => '𐑚𐑨𐑒 𐑑 𐑝𐑿𐑼'; + + @override + String get viewerInfoUnknown => '𐑳𐑯𐑯𐑴𐑯'; + + @override + String get viewerInfoLabelDescription => '𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯'; + + @override + String get viewerInfoLabelTitle => '𐑑𐑲𐑑𐑩𐑤'; + + @override + String get viewerInfoLabelDate => '𐑛𐑱𐑑'; + + @override + String get viewerInfoLabelResolution => '𐑮𐑧𐑟𐑩𐑤𐑵𐑖𐑩𐑯'; + + @override + String get viewerInfoLabelSize => '𐑕𐑲𐑟'; + + @override + String get viewerInfoLabelUri => '⸰𐑿𐑮𐑲'; + + @override + String get viewerInfoLabelPath => '𐑐𐑭𐑔'; + + @override + String get viewerInfoLabelDuration => '𐑛𐑘𐑫𐑼𐑱𐑖𐑩𐑯'; + + @override + String get viewerInfoLabelOwner => '𐑴𐑯𐑼'; + + @override + String get viewerInfoLabelCoordinates => '𐑒𐑴𐑹𐑛𐑦𐑯𐑩𐑑𐑕'; + + @override + String get viewerInfoLabelAddress => '𐑩𐑛𐑮𐑧𐑕'; + + @override + String get mapStyleDialogTitle => '𐑥𐑨𐑐 𐑕𐑑𐑲𐑤'; + + @override + String get mapStyleDialogAddStyle => '𐑨𐑛 𐑕𐑑𐑲𐑤'; + + @override + String get mapStyleTooltip => '𐑕𐑦𐑤𐑧𐑒𐑑 𐑥𐑨𐑐 𐑕𐑑𐑲𐑤'; + + @override + String get mapStyleEditorDialogName => '𐑯𐑱𐑥'; + + @override + String get mapStyleEditorDialogUrl => '∘𐑿𐑮𐑤'; + + @override + String get mapStyleEditorDialogSubdomains => '𐑕𐑳𐑚𐑛𐑴𐑥𐑱𐑯𐑟'; + + @override + String get mapStyleEditorDialogUserAgent => '𐑿𐑟𐑼𐑱𐑡𐑩𐑯𐑑'; + + @override + String get mapZoomInTooltip => '𐑟𐑵𐑥 𐑦𐑯'; + + @override + String get mapZoomOutTooltip => '𐑟𐑵𐑥 𐑬𐑑'; + + @override + String get mapPointNorthUpTooltip => '𐑐𐑶𐑯𐑑 𐑯𐑹𐑔 𐑳𐑐'; + + @override + String get mapAttributionOsmData => '𐑥𐑨𐑐 𐑛𐑱𐑑𐑩 © [·𐑴𐑐𐑩𐑯𐑕𐑑𐑮𐑰𐑑𐑥𐑨𐑐](https://www.openstreetmap.org/copyright) 𐑒𐑩𐑯𐑑𐑮𐑦𐑚𐑘𐑩𐑑𐑼𐑟'; + + @override + String get mapAttributionOsmLiberty => + '𐑑𐑲𐑤𐑟 𐑚𐑲 [·𐑴𐑐𐑩𐑯𐑥𐑨𐑐𐑑𐑲𐑤𐑟](https://www.openmaptiles.org), [⸰𐑒𐑒 𐑚𐑲](https://creativecommons.org/licenses/by/4.0) • 𐑣𐑴𐑕𐑑𐑩𐑛 𐑚𐑲 [⸰𐑴𐑕𐑥 ·𐑩𐑥𐑧𐑮𐑦𐑒𐑭𐑯𐑩](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[⸰𐑖𐑮𐑑𐑥](https://www.earthdata.nasa.gov/sensors/srtm) | 𐑑𐑲𐑤𐑟 𐑚𐑲 [·𐑴𐑐𐑩𐑯𐑑𐑪𐑐𐑩𐑥𐑨𐑐](https://opentopomap.org), [⸰𐑒𐑒 𐑚𐑲-𐑖𐑩](https://creativecommons.org/licenses/by-sa/3.0)'; + + @override + String get mapAttributionOsmHot => '𐑑𐑲𐑤𐑟 𐑚𐑲 [⸰𐑣𐑴𐑑](https://www.hotosm.org) • 𐑣𐑴𐑕𐑑𐑩𐑛 𐑚𐑲 [⸰𐑴𐑕𐑥 ·𐑓𐑮𐑭𐑯𐑕](https://openstreetmap.fr)'; + + @override + String get mapAttributionStamen => '𐑑𐑲𐑤𐑟 𐑚𐑲 [·𐑕𐑑𐑱𐑥𐑩𐑯 𐑛𐑦𐑟𐑲𐑯](https://stamen.com), [⸰𐑒𐑒 𐑚𐑲 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => '𐑝𐑿 𐑪𐑯 ·𐑥𐑨𐑐 𐑐𐑱𐑡'; + + @override + String get mapEmptyRegion => '𐑯𐑴 𐑦𐑥𐑦𐑡𐑩𐑟 𐑦𐑯 𐑞𐑦𐑕 𐑮𐑰𐑡𐑩𐑯'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => '𐑓𐑱𐑤𐑛 𐑑 𐑦𐑒𐑕𐑑𐑮𐑨𐑒𐑑 𐑦𐑥𐑚𐑧𐑛𐑩𐑛 𐑛𐑱𐑑𐑩'; + + @override + String get viewerInfoOpenLinkText => '𐑴𐑐𐑩𐑯'; + + @override + String get viewerInfoViewXmlLinkText => '𐑝𐑿 ⸰𐑦𐑥𐑤'; + + @override + String get viewerInfoSearchFieldLabel => '𐑕𐑻𐑗 𐑥𐑧𐑑𐑩𐑛𐑱𐑑𐑩'; + + @override + String get viewerInfoSearchEmpty => '𐑯𐑴 𐑥𐑨𐑗𐑦𐑙 𐑒𐑰𐑟'; + + @override + String get viewerInfoSearchSuggestionDate => '𐑛𐑱𐑑 𐑯 𐑑𐑲𐑥'; + + @override + String get viewerInfoSearchSuggestionDescription => '𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯'; + + @override + String get viewerInfoSearchSuggestionDimensions => '𐑛𐑦𐑥𐑧𐑯𐑖𐑩𐑯𐑟'; + + @override + String get viewerInfoSearchSuggestionResolution => '𐑮𐑧𐑟𐑩𐑤𐑵𐑖𐑩𐑯'; + + @override + String get viewerInfoSearchSuggestionRights => '𐑮𐑲𐑑𐑕'; + + @override + String get wallpaperUseScrollEffect => '𐑿𐑟 𐑕𐑒𐑮𐑴𐑤 𐑦𐑓𐑧𐑒𐑑 𐑪𐑯 𐑣𐑴𐑥 𐑕𐑒𐑮𐑰𐑯'; + + @override + String get tagEditorPageTitle => '𐑧𐑛𐑦𐑑 𐑑𐑨𐑜𐑟'; + + @override + String get tagEditorPageNewTagFieldLabel => '𐑯𐑿 𐑑𐑨𐑜'; + + @override + String get tagEditorPageAddTagTooltip => '𐑨𐑛 𐑑𐑨𐑜'; + + @override + String get tagEditorSectionRecent => '𐑮𐑰𐑕𐑩𐑯𐑑'; + + @override + String get tagEditorSectionPlaceholders => '𐑐𐑤𐑱𐑕𐑣𐑴𐑤𐑛𐑼𐑟'; + + @override + String get tagEditorDiscardDialogMessage => '¿𐑛𐑵 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑛𐑦𐑕𐑒𐑸𐑛 𐑗𐑱𐑯𐑡𐑩𐑟?'; + + @override + String get tagPlaceholderCountry => '𐑒𐑳𐑯𐑑𐑮𐑦'; + + @override + String get tagPlaceholderState => '𐑕𐑑𐑱𐑑'; + + @override + String get tagPlaceholderPlace => '𐑐𐑤𐑱𐑕'; + + @override + String get panoramaEnableSensorControl => '𐑦𐑯𐑱𐑚𐑩𐑤 𐑕𐑧𐑯𐑕𐑼 𐑒𐑩𐑯𐑑𐑮𐑴𐑤'; + + @override + String get panoramaDisableSensorControl => '𐑛𐑦𐑕𐑱𐑚𐑩𐑤 𐑕𐑧𐑯𐑕𐑼 𐑒𐑩𐑯𐑑𐑮𐑴𐑤'; + + @override + String get sourceViewerPageTitle => '𐑕𐑹𐑕'; +} diff --git a/lib/l10ngen/app_localizations_es.dart b/lib/l10ngen/app_localizations_es.dart new file mode 100644 index 0000000..68721b2 --- /dev/null +++ b/lib/l10ngen/app_localizations_es.dart @@ -0,0 +1,2421 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Spanish Castilian (`es`). +class AppLocalizationsEs extends AppLocalizations { + AppLocalizationsEs([String locale = 'es']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Bienvenido a Aves'; + + @override + String get welcomeOptional => 'Opcional'; + + @override + String get welcomeTermsToggle => 'Acepto los términos y condiciones'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString elementos', + one: '$countString elemento', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count columnas', + one: '$count columna', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString segundos', + one: '$countString segundo', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutos', + one: '$countString minuto', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString días', + one: '$countString día', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APLICAR'; + + @override + String get createButtonLabel => 'CREAR'; + + @override + String get deleteButtonLabel => 'BORRAR'; + + @override + String get nextButtonLabel => 'SIGUIENTE'; + + @override + String get showButtonLabel => 'MOSTRAR'; + + @override + String get hideButtonLabel => 'OCULTAR'; + + @override + String get continueButtonLabel => 'CONTINUAR'; + + @override + String get saveCopyButtonLabel => 'GUARDAR UNA COPIA'; + + @override + String get applyTooltip => 'Aplicar'; + + @override + String get cancelTooltip => 'Cancelar'; + + @override + String get changeTooltip => 'Cambiar'; + + @override + String get clearTooltip => 'Limpiar'; + + @override + String get previousTooltip => 'Anterior'; + + @override + String get nextTooltip => 'Siguiente'; + + @override + String get showTooltip => 'Mostrar'; + + @override + String get hideTooltip => 'Ocultar'; + + @override + String get actionRemove => 'Remover'; + + @override + String get resetTooltip => 'Restablecer'; + + @override + String get saveTooltip => 'Guardar'; + + @override + String get stopTooltip => 'Parar'; + + @override + String get pickTooltip => 'Elegir'; + + @override + String get doubleBackExitMessage => 'Presione «atrás» nuevamente para salir.'; + + @override + String get doNotAskAgain => 'No preguntar nuevamente'; + + @override + String get sourceStateLoading => 'Cargando'; + + @override + String get sourceStateCataloguing => 'Catalogando'; + + @override + String get sourceStateLocatingCountries => 'Ubicando países'; + + @override + String get sourceStateLocatingPlaces => 'Ubicando lugares'; + + @override + String get chipActionDelete => 'Borrar'; + + @override + String get chipActionRemove => 'Remover'; + + @override + String get chipActionShowCollection => 'Mostrar en Colección'; + + @override + String get chipActionGoToAlbumPage => 'Mostrar en Álbumes'; + + @override + String get chipActionGoToCountryPage => 'Mostrar en Países'; + + @override + String get chipActionGoToPlacePage => 'Mostrar en lugares'; + + @override + String get chipActionGoToTagPage => 'Mostrar en Etiquetas'; + + @override + String get chipActionGoToExplorerPage => 'Mostrar en el explorador'; + + @override + String get chipActionDecompose => 'Separar'; + + @override + String get chipActionFilterOut => 'Filtrar'; + + @override + String get chipActionFilterIn => 'Filtrar en'; + + @override + String get chipActionHide => 'Esconder'; + + @override + String get chipActionLock => 'Bloquear'; + + @override + String get chipActionPin => 'Fijar'; + + @override + String get chipActionUnpin => 'Dejar de fijar'; + + @override + String get chipActionGroup => 'Cambiar agrupamiento'; + + @override + String get chipActionRename => 'Renombrar'; + + @override + String get chipActionSetCover => 'Elegir carátula'; + + @override + String get chipActionShowCountryStates => 'Mostrar los estados'; + + @override + String get chipActionCreateGroup => 'Crear grupo'; + + @override + String get chipActionCreateAlbum => 'Crear álbum'; + + @override + String get chipActionCreateVault => 'Crear una caja fuerte'; + + @override + String get chipActionConfigureVault => 'Configurar la caja fuerte'; + + @override + String get entryActionCopyToClipboard => 'Copiar al portapapeles'; + + @override + String get entryActionDelete => 'Borrar'; + + @override + String get entryActionConvert => 'Convertir'; + + @override + String get entryActionExport => 'Exportar'; + + @override + String get entryActionInfo => 'Información'; + + @override + String get entryActionRename => 'Renombrar'; + + @override + String get entryActionRestore => 'Restaurar'; + + @override + String get entryActionRotateCCW => 'Rotar en sentido antihorario'; + + @override + String get entryActionRotateCW => 'Rotar en sentido horario'; + + @override + String get entryActionFlip => 'Voltear horizontalmente'; + + @override + String get entryActionPrint => 'Imprimir'; + + @override + String get entryActionShare => 'Compartir'; + + @override + String get entryActionShareImageOnly => 'Compartir sólo la imagen'; + + @override + String get entryActionShareVideoOnly => 'Compartir sólo el vídeo'; + + @override + String get entryActionViewSource => 'Ver fuente'; + + @override + String get entryActionShowGeoTiffOnMap => 'Mostrar como mapa superpuesto'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convertir a imagen fija'; + + @override + String get entryActionViewMotionPhotoVideo => 'Abrir video'; + + @override + String get entryActionEdit => 'Editar'; + + @override + String get entryActionOpen => 'Abrir con'; + + @override + String get entryActionSetAs => 'Establecer como'; + + @override + String get entryActionCast => 'Echar'; + + @override + String get entryActionOpenMap => 'Mostrar en aplicación de mapa'; + + @override + String get entryActionRotateScreen => 'Rotar pantalla'; + + @override + String get entryActionAddFavourite => 'Agregar a favoritos'; + + @override + String get entryActionRemoveFavourite => 'Quitar de favoritos'; + + @override + String get videoActionCaptureFrame => 'Capturar fotograma'; + + @override + String get videoActionMute => 'Silenciar'; + + @override + String get videoActionUnmute => 'Dejar de silenciar'; + + @override + String get videoActionPause => 'Pausa'; + + @override + String get videoActionPlay => 'Reproducir'; + + @override + String get videoActionReplay10 => 'Retroceder 10 segundos'; + + @override + String get videoActionSkip10 => 'Adelantar 10 segundos'; + + @override + String get videoActionShowPreviousFrame => 'Mostrar fotograma anterior'; + + @override + String get videoActionShowNextFrame => 'Mostrar fotograma siguiente'; + + @override + String get videoActionSelectStreams => 'Seleccionar pistas'; + + @override + String get videoActionSetSpeed => 'Velocidad de reproducción'; + + @override + String get videoActionABRepeat => 'Repetir de A a B'; + + @override + String get videoRepeatActionSetStart => 'Fijar el inicio'; + + @override + String get videoRepeatActionSetEnd => 'Fijar el fin'; + + @override + String get viewerActionSettings => 'Ajustes'; + + @override + String get viewerActionLock => 'Bloquear visor'; + + @override + String get viewerActionUnlock => 'Desbloquear visor'; + + @override + String get slideshowActionResume => 'Reanudar'; + + @override + String get slideshowActionShowInCollection => 'Mostrar en Colección'; + + @override + String get entryInfoActionEditDate => 'Editar fecha y hora'; + + @override + String get entryInfoActionEditLocation => 'Editar ubicación'; + + @override + String get entryInfoActionEditTitleDescription => 'Editar título y descripción'; + + @override + String get entryInfoActionEditRating => 'Editar clasificación'; + + @override + String get entryInfoActionEditTags => 'Editar etiquetas'; + + @override + String get entryInfoActionRemoveMetadata => 'Eliminar metadatos'; + + @override + String get entryInfoActionExportMetadata => 'Exportar los metadatos'; + + @override + String get entryInfoActionRemoveLocation => 'Eliminar la ubicación'; + + @override + String get editorActionTransform => 'Transformar'; + + @override + String get editorTransformCrop => 'Recortar'; + + @override + String get editorTransformRotate => 'Girar'; + + @override + String get cropAspectRatioFree => 'Libre'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Cuadrado'; + + @override + String get filterAspectRatioLandscapeLabel => 'Paisaje'; + + @override + String get filterAspectRatioPortraitLabel => 'Retrato'; + + @override + String get filterBinLabel => 'Cesto de basura'; + + @override + String get filterFavouriteLabel => 'Favorito'; + + @override + String get filterNoDateLabel => 'Sin fecha'; + + @override + String get filterNoAddressLabel => 'Sin dirección'; + + @override + String get filterLocatedLabel => 'Localizado'; + + @override + String get filterNoLocationLabel => 'No localizado'; + + @override + String get filterNoRatingLabel => 'Sin clasificar'; + + @override + String get filterTaggedLabel => 'Etiquetado'; + + @override + String get filterNoTagLabel => 'Sin etiquetar'; + + @override + String get filterNoTitleLabel => 'Sin título'; + + @override + String get filterOnThisDayLabel => 'De este día'; + + @override + String get filterRecentlyAddedLabel => 'Recientemente añadido'; + + @override + String get filterRatingRejectedLabel => 'Rechazado'; + + @override + String get filterTypeAnimatedLabel => 'Animado'; + + @override + String get filterTypeMotionPhotoLabel => 'Foto en movimiento'; + + @override + String get filterTypePanoramaLabel => 'Panorámica'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => 'Video en 360°'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Imagen'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Prevenir efectos en pantalla'; + + @override + String get accessibilityAnimationsKeep => 'Mantener efectos en pantalla'; + + @override + String get albumTierNew => 'Nuevo'; + + @override + String get albumTierPinned => 'Fijado'; + + @override + String get albumTierGroups => 'Grupos'; + + @override + String get albumTierSpecial => 'Común'; + + @override + String get albumTierApps => 'Aplicaciones'; + + @override + String get albumTierVaults => 'Caja fuerte'; + + @override + String get albumTierDynamic => 'Dinámico'; + + @override + String get albumTierRegular => 'Otros'; + + @override + String get coordinateFormatDms => 'GMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Grados decimales'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'O'; + + @override + String get displayRefreshRatePreferHighest => 'Alta tasa'; + + @override + String get displayRefreshRatePreferLowest => 'Baja tasa'; + + @override + String get keepScreenOnNever => 'Nunca'; + + @override + String get keepScreenOnVideoPlayback => 'Durante la reproducción de vídeo'; + + @override + String get keepScreenOnViewerOnly => 'Sólo en el visor'; + + @override + String get keepScreenOnAlways => 'Siempre'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Híbrido)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Relieve)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'OSM Humanitario'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (Acuarela)'; + + @override + String get maxBrightnessNever => 'Nunca'; + + @override + String get maxBrightnessAlways => 'Siempre'; + + @override + String get nameConflictStrategyRename => 'Renombrar'; + + @override + String get nameConflictStrategyReplace => 'Reemplazar'; + + @override + String get nameConflictStrategySkip => 'Saltear'; + + @override + String get overlayHistogramNone => 'Ninguna'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminancia'; + + @override + String get subtitlePositionTop => 'Parte superior'; + + @override + String get subtitlePositionBottom => 'Inferior'; + + @override + String get themeBrightnessLight => 'Claro'; + + @override + String get themeBrightnessDark => 'Obscuro'; + + @override + String get themeBrightnessBlack => 'Negro'; + + @override + String get unitSystemMetric => 'Métrico'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Patrón'; + + @override + String get vaultLockTypePin => 'Pin'; + + @override + String get vaultLockTypePassword => 'Contraseña'; + + @override + String get settingsVideoEnablePip => 'Imagen-en-imagen'; + + @override + String get videoControlsPlayOutside => 'Reproducir externamente'; + + @override + String get videoLoopModeNever => 'Nunca'; + + @override + String get videoLoopModeShortOnly => 'Sólo videos cortos'; + + @override + String get videoLoopModeAlways => 'Siempre'; + + @override + String get videoPlaybackSkip => 'Saltear'; + + @override + String get videoPlaybackMuted => 'Reproducir sin sonido'; + + @override + String get videoPlaybackWithSound => 'Reproducir con sonido'; + + @override + String get videoResumptionModeNever => 'Nunca'; + + @override + String get videoResumptionModeAlways => 'Siempre'; + + @override + String get viewerTransitionSlide => 'Diapositiva'; + + @override + String get viewerTransitionParallax => 'Paralaje'; + + @override + String get viewerTransitionFade => 'Desvanecer'; + + @override + String get viewerTransitionZoomIn => 'Acercar'; + + @override + String get viewerTransitionNone => 'Ninguno'; + + @override + String get wallpaperTargetHome => 'Pantalla de inicio'; + + @override + String get wallpaperTargetLock => 'Pantalla de bloqueo'; + + @override + String get wallpaperTargetHomeLock => 'Pantallas de inicio y bloqueo'; + + @override + String get widgetDisplayedItemRandom => 'Aleatorio'; + + @override + String get widgetDisplayedItemMostRecent => 'Más reciente'; + + @override + String get widgetOpenPageHome => 'Abrir la pantalla de inicio'; + + @override + String get widgetOpenPageCollection => 'Abrir colección'; + + @override + String get widgetOpenPageViewer => 'Abrir el visor'; + + @override + String get widgetTapUpdateWidget => 'Actualizar el widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Almacenamiento interno'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'Tarjeta de memoria'; + + @override + String get rootDirectoryDescription => 'el directorio raíz'; + + @override + String otherDirectoryDescription(String name) { + return 'el directorio «$name»'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Por favor seleccione $directory en «$volume» en la siguiente pantalla para permitir a esta aplicación tener acceso.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Esta aplicación no tiene permiso para modificar archivos de $directory en «$volume».\n\nPor favor use un gestor de archivos o la aplicación de galería preinstalada para mover los elementos a otro directorio.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Esta operación necesita $neededSize de espacio libre en «$volume» para completarse, pero sólo hay $freeSize disponible.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'El selector de archivos del sistema no se encuentra disponible o fue deshabilitado. Por favor habilítelo e intente nuevamente.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Esta operación no está disponible para elementos de los siguientes tipos: $types.', + one: 'Esta operación no está disponible para un elemento del siguiente tipo: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Algunos archivos en el directorio de destino tienen el mismo nombre.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Algunos archivos tienen el mismo nombre.'; + + @override + String get addShortcutDialogLabel => 'Etiqueta del atajo'; + + @override + String get addShortcutButtonLabel => 'AGREGAR'; + + @override + String get noMatchingAppDialogMessage => 'No se encontraron aplicaciones para manejar esto.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '¿Mover estos $countString elementos al cesto de basura?', + one: '¿Mover este elemento al cesto de basura?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '¿Está seguro de querer borrar $countString elementos?', + one: '¿Está seguro de borrar este elemento?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => '¿Guardar las fechas de los elementos antes de proceder?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Fijar fecha'; + + @override + String videoResumeDialogMessage(String time) { + return '¿Desea reanudar la reproducción a las $time?'; + } + + @override + String get videoStartOverButtonLabel => 'VOLVER A EMPEZAR'; + + @override + String get videoResumeButtonLabel => 'REANUDAR'; + + @override + String get setCoverDialogLatest => 'Elemento más reciente'; + + @override + String get setCoverDialogAuto => 'Automático'; + + @override + String get setCoverDialogCustom => 'Personalizado'; + + @override + String get hideFilterConfirmationDialogMessage => 'Fotos y videos que concuerden serán ocultados de su colección. Puede volver a mostrarlos desde los ajustes de «Privacidad».\n\n¿Está seguro de que desea ocultarlos?'; + + @override + String get newAlbumDialogTitle => 'Álbum nuevo'; + + @override + String get newAlbumDialogNameLabel => 'Nombre del álbum'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'El álbum ya existe'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'El directorio ya existe'; + + @override + String get newAlbumDialogStorageLabel => 'Almacenamiento:'; + + @override + String get newDynamicAlbumDialogTitle => 'Nuevo álbum dinámico'; + + @override + String get dynamicAlbumAlreadyExists => 'El álbum dinámico ya existe'; + + @override + String get newGroupDialogTitle => 'Nuevo grupo'; + + @override + String get newGroupDialogNameLabel => 'Nombre del grupo'; + + @override + String get groupAlreadyExists => 'Ya existe el grupo'; + + @override + String get groupEmpty => 'Sin grupos'; + + @override + String get ungrouped => 'No agrupado'; + + @override + String get groupPickerTitle => 'Seleccionar grupo'; + + @override + String get groupPickerUseThisGroupButton => 'Usar este grupo'; + + @override + String get newVaultWarningDialogMessage => 'Los elementos de la caja fuerte sólo están disponibles para esta aplicación y no para otras.\n\nSi desinstalas esta aplicación o borras sus datos, perderás todos estos elementos.'; + + @override + String get newVaultDialogTitle => 'Nueva caja fuerte'; + + @override + String get configureVaultDialogTitle => 'Configurar la caja fuerte'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Bloquear al apagar la pantalla'; + + @override + String get vaultDialogLockTypeLabel => 'Tipo de bloqueo'; + + @override + String get patternDialogEnter => 'Introduzca el patrón'; + + @override + String get patternDialogConfirm => 'Confirme el patrón'; + + @override + String get pinDialogEnter => 'Introducir el código pin'; + + @override + String get pinDialogConfirm => 'Confirmar el código pin'; + + @override + String get passwordDialogEnter => 'Introducir la contraseña'; + + @override + String get passwordDialogConfirm => 'Confirmar la contraseña'; + + @override + String get authenticateToConfigureVault => 'Autenticarse para configurar la caja fuerte'; + + @override + String get authenticateToUnlockVault => 'Autentificarse para desbloquear la caja fuerte'; + + @override + String get vaultBinUsageDialogMessage => 'Algunas cajas fuertes utilizan la papelera de reciclaje.'; + + @override + String get renameAlbumDialogLabel => 'Renombrar'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'El directorio ya existe'; + + @override + String get renameEntrySetPageTitle => 'Renombrar'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Patrón de nombramiento'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insertar campo'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Vista previa'; + + @override + String get renameProcessorCounter => 'Contador'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Nombre'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '¿Eliminar este álbum y los $countString elementos que contiene?', + one: '¿Eliminar este álbum y el elemento que contiene?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '¿Eliminar estos álbumes y los $countString elementos que contienen?', + one: '¿Eliminar estos álbumes y el elemento que contienen?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Formato:'; + + @override + String get exportEntryDialogWidth => 'Anchura'; + + @override + String get exportEntryDialogHeight => 'Altura'; + + @override + String get exportEntryDialogQuality => 'Calidad'; + + @override + String get exportEntryDialogWriteMetadata => 'Escribir metadatos'; + + @override + String get renameEntryDialogLabel => 'Renombrar'; + + @override + String get editEntryDialogCopyFromItem => 'Copiar de otro elemento'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Campos a modificar'; + + @override + String get editEntryDateDialogTitle => 'Fecha y hora'; + + @override + String get editEntryDateDialogSetCustom => 'Establecer fecha personalizada'; + + @override + String get editEntryDateDialogCopyField => 'Copiar de otra fecha'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extraer del título'; + + @override + String get editEntryDateDialogShift => 'Cambiar'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Fecha de modificación del archivo'; + + @override + String get durationDialogHours => 'Horas'; + + @override + String get durationDialogMinutes => 'Minutos'; + + @override + String get durationDialogSeconds => 'Segundos'; + + @override + String get editEntryLocationDialogTitle => 'Ubicación'; + + @override + String get editEntryLocationDialogSetCustom => 'Establecer la ubicación personalizada'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Elegir en el mapa'; + + @override + String get editEntryLocationDialogImportGpx => 'Importar GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitud'; + + @override + String get editEntryLocationDialogLongitude => 'Longitud'; + + @override + String get editEntryLocationDialogTimeShift => 'Desplazamiento de tiempo'; + + @override + String get locationPickerUseThisLocationButton => 'Usar esta ubicación'; + + @override + String get editEntryRatingDialogTitle => 'Clasificación'; + + @override + String get removeEntryMetadataDialogTitle => 'Eliminación de metadatos'; + + @override + String get removeEntryMetadataDialogAll => 'Todo'; + + @override + String get removeEntryMetadataDialogMore => 'Más'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP es necesario para reproducir la animación de una foto en movimiento.\n\n¿Está seguro de que desea removerlo?'; + + @override + String get videoSpeedDialogLabel => 'Velocidad de reproducción'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtítulos'; + + @override + String get videoStreamSelectionDialogOff => 'Desactivado'; + + @override + String get videoStreamSelectionDialogTrack => 'Pista'; + + @override + String get videoStreamSelectionDialogNoSelection => 'No hay otras pistas.'; + + @override + String get genericSuccessFeedback => '¡Completado!'; + + @override + String get genericFailureFeedback => 'Falló'; + + @override + String get genericDangerWarningDialogMessage => '¿Está seguro?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Vuelva a intentarlo con menos elementos.'; + + @override + String get menuActionConfigureView => 'Ver'; + + @override + String get menuActionSelect => 'Seleccionar'; + + @override + String get menuActionSelectAll => 'Seleccionar todo'; + + @override + String get menuActionSelectNone => 'Deseleccionar'; + + @override + String get menuActionMap => 'Mapa'; + + @override + String get menuActionSlideshow => 'Presentación'; + + @override + String get menuActionStats => 'Estadísticas'; + + @override + String get viewDialogSortSectionTitle => 'Ordenar'; + + @override + String get viewDialogGroupSectionTitle => 'Secciones'; + + @override + String get viewDialogLayoutSectionTitle => 'Disposición'; + + @override + String get viewDialogReverseSortOrder => 'Invertir la forma de ordenar'; + + @override + String get tileLayoutMosaic => 'Mosaico'; + + @override + String get tileLayoutGrid => 'Cuadrícula'; + + @override + String get tileLayoutList => 'Lista'; + + @override + String get castDialogTitle => 'Dispositivos Cast'; + + @override + String get coverDialogTabCover => 'Carátula'; + + @override + String get coverDialogTabApp => 'Aplicación'; + + @override + String get coverDialogTabColor => 'Color'; + + @override + String get appPickDialogTitle => 'Escoger aplicación'; + + @override + String get appPickDialogNone => 'Ninguna'; + + @override + String get aboutPageTitle => 'Acerca de'; + + @override + String get aboutLinkLicense => 'Licencia'; + + @override + String get aboutLinkPolicy => 'Política de privacidad'; + + @override + String get aboutBugSectionTitle => 'Reporte de errores'; + + @override + String get aboutBugSaveLogInstruction => 'Guardar registros de la aplicación a un archivo'; + + @override + String get aboutBugCopyInfoInstruction => 'Copiar información del sistema'; + + @override + String get aboutBugCopyInfoButton => 'Copiar'; + + @override + String get aboutBugReportInstruction => 'Reportar en GitHub con los registros y la información del sistema'; + + @override + String get aboutBugReportButton => 'Reportar'; + + @override + String get aboutDataUsageSectionTitle => 'Uso de los datos'; + + @override + String get aboutDataUsageData => 'Datos'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Base de datos'; + + @override + String get aboutDataUsageMisc => 'Varios'; + + @override + String get aboutDataUsageInternal => 'Interno'; + + @override + String get aboutDataUsageExternal => 'Exterior'; + + @override + String get aboutDataUsageClearCache => 'Borrar la cache'; + + @override + String get aboutCreditsSectionTitle => 'Créditos'; + + @override + String get aboutCreditsWorldAtlas1 => 'Esta aplicación usa un archivo TopoJSON de'; + + @override + String get aboutCreditsWorldAtlas2 => 'bajo licencia ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'Traductores'; + + @override + String get aboutLicensesSectionTitle => 'Licencias de código abierto'; + + @override + String get aboutLicensesBanner => 'Esta aplicación usa los siguientes paquetes y librerías de código abierto.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Librerías de Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Añadidos de Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Paquetes de Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Paquetes de Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Mostrar todas las licencias'; + + @override + String get policyPageTitle => 'Política de privacidad'; + + @override + String get collectionPageTitle => 'Colección'; + + @override + String get collectionPickPageTitle => 'Elegir'; + + @override + String get collectionSelectPageTitle => 'Seleccionar'; + + @override + String get collectionActionShowTitleSearch => 'Mostrar filtros de títulos'; + + @override + String get collectionActionHideTitleSearch => 'Ocultar filtros de títulos'; + + @override + String get collectionActionAddDynamicAlbum => 'Añadir álbum dinámico'; + + @override + String get collectionActionAddShortcut => 'Agregar atajo'; + + @override + String get collectionActionSetHome => 'Fijar como inicio'; + + @override + String get collectionActionEmptyBin => 'Vaciar cesto'; + + @override + String get collectionActionCopy => 'Copiar a álbum'; + + @override + String get collectionActionMove => 'Mover a álbum'; + + @override + String get collectionActionRescan => 'Volver a buscar'; + + @override + String get collectionActionEdit => 'Editar'; + + @override + String get collectionSearchTitlesHintText => 'Buscar títulos'; + + @override + String get collectionGroupAlbum => 'Por álbum'; + + @override + String get collectionGroupMonth => 'Por mes'; + + @override + String get collectionGroupDay => 'Por día'; + + @override + String get sectionNone => 'Sin secciones'; + + @override + String get sectionUnknown => 'Desconocido'; + + @override + String get dateToday => 'Hoy'; + + @override + String get dateYesterday => 'Ayer'; + + @override + String get dateThisMonth => 'Este mes'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Error al borrar $countString elementos', + one: 'Error al borrar 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Error al copiar $countString elementos', + one: 'Error al copiar 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Error al mover $countString elementos', + one: 'Error al mover 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Error al renombrar $countString elementos', + one: 'Error al renombrar 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Error al editar $countString elementos', + one: 'Error al editar 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Error al exportar $countString páginas', + one: 'Error al exportar 1 página', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copiados$countString elementos', + one: '1 elemento copiado', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Movidos $countString elementos', + one: '1 elemento movido', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renombrados $countString elementos', + one: '1 elemento renombrado', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Editados $countString elementos', + one: '1 elemento editado', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Sin favoritos'; + + @override + String get collectionEmptyVideos => 'Sin videos'; + + @override + String get collectionEmptyImages => 'Sin imágenes'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Otorgar accceso'; + + @override + String get collectionSelectSectionTooltip => 'Seleccionar sección'; + + @override + String get collectionDeselectSectionTooltip => 'Deseleccionar sección'; + + @override + String get drawerAboutButton => 'Acerca de'; + + @override + String get drawerSettingsButton => 'Ajustes'; + + @override + String get drawerCollectionAll => 'Toda la colección'; + + @override + String get drawerCollectionFavourites => 'Favoritos'; + + @override + String get drawerCollectionImages => 'Imágenes'; + + @override + String get drawerCollectionVideos => 'Vídeos'; + + @override + String get drawerCollectionAnimated => 'Animaciones'; + + @override + String get drawerCollectionMotionPhotos => 'Fotos en movimiento'; + + @override + String get drawerCollectionPanoramas => 'Panorámicas'; + + @override + String get drawerCollectionRaws => 'Fotos Raw'; + + @override + String get drawerCollectionSphericalVideos => 'Videos en 360°'; + + @override + String get drawerAlbumPage => 'Álbumes'; + + @override + String get drawerCountryPage => 'Países'; + + @override + String get drawerPlacePage => 'Lugares'; + + @override + String get drawerTagPage => 'Etiquetas'; + + @override + String get sortByDate => 'Por fecha'; + + @override + String get sortByName => 'Por nombre'; + + @override + String get sortByItemCount => 'Por número de elementos'; + + @override + String get sortBySize => 'Por tamaño'; + + @override + String get sortByAlbumFileName => 'Por nombre de álbum y título'; + + @override + String get sortByRating => 'Por clasificación'; + + @override + String get sortByDuration => 'Por duración'; + + @override + String get sortByPath => 'Por ruta'; + + @override + String get sortOrderNewestFirst => 'El más nuevo primero'; + + @override + String get sortOrderOldestFirst => 'El más viejo primero'; + + @override + String get sortOrderAtoZ => 'De la A a la Z'; + + @override + String get sortOrderZtoA => 'De la Z a la A'; + + @override + String get sortOrderHighestFirst => 'El más alto primero'; + + @override + String get sortOrderLowestFirst => 'El más bajo primero'; + + @override + String get sortOrderLargestFirst => 'El más grande primero'; + + @override + String get sortOrderSmallestFirst => 'El más pequeño primero'; + + @override + String get sortOrderShortestFirst => 'El más corto primero'; + + @override + String get sortOrderLongestFirst => 'El más largo primero'; + + @override + String get albumGroupTier => 'Por nivel'; + + @override + String get albumGroupType => 'Por tipo'; + + @override + String get albumGroupVolume => 'Por volumen de almacenamiento'; + + @override + String get albumMimeTypeMixed => 'Mezclado'; + + @override + String get albumPickPageTitleCopy => 'Copiar a álbum'; + + @override + String get albumPickPageTitleExport => 'Exportar a álbum'; + + @override + String get albumPickPageTitleMove => 'Mover a álbum'; + + @override + String get albumPickPageTitlePick => 'Elegir álbum'; + + @override + String get albumCamera => 'Cámara'; + + @override + String get albumDownload => 'Descargas'; + + @override + String get albumScreenshots => 'Capturas de pantalla'; + + @override + String get albumScreenRecordings => 'Grabaciones de pantalla'; + + @override + String get albumVideoCaptures => 'Capturas en video'; + + @override + String get albumPageTitle => 'Álbumes'; + + @override + String get albumEmpty => 'Sin álbumes'; + + @override + String get createAlbumButtonLabel => 'CREAR'; + + @override + String get newFilterBanner => 'nuevo'; + + @override + String get countryPageTitle => 'Países'; + + @override + String get countryEmpty => 'Sin países'; + + @override + String get statePageTitle => 'Estados'; + + @override + String get stateEmpty => 'Sin estados'; + + @override + String get placePageTitle => 'Lugares'; + + @override + String get placeEmpty => 'Ningún lugar'; + + @override + String get tagPageTitle => 'Etiquetas'; + + @override + String get tagEmpty => 'Sin etiquetas'; + + @override + String get tagPickPageTitle => 'Escoger etiqueta'; + + @override + String get binPageTitle => 'Cesto de basura'; + + @override + String get explorerPageTitle => 'Explorar'; + + @override + String get explorerActionSelectStorageVolume => 'Seleccionar almacenamiento'; + + @override + String get selectStorageVolumeDialogTitle => 'Seleccionar almacenamiento'; + + @override + String get searchCollectionFieldHint => 'Buscar en colección'; + + @override + String get searchRecentSectionTitle => 'Reciente'; + + @override + String get searchDateSectionTitle => 'Fecha'; + + @override + String get searchFormatSectionTitle => 'Formatos'; + + @override + String get searchAlbumsSectionTitle => 'Álbumes'; + + @override + String get searchCountriesSectionTitle => 'Países'; + + @override + String get searchStatesSectionTitle => 'Estados'; + + @override + String get searchPlacesSectionTitle => 'Lugares'; + + @override + String get searchTagsSectionTitle => 'Etiquetas'; + + @override + String get searchRatingSectionTitle => 'Clasificaciones'; + + @override + String get searchMetadataSectionTitle => 'Metadatos'; + + @override + String get settingsPageTitle => 'Ajustes'; + + @override + String get settingsSystemDefault => 'Sistema'; + + @override + String get settingsDefault => 'Restablecer'; + + @override + String get settingsDisabled => 'Desactivado'; + + @override + String get settingsEnabled => 'Activado'; + + @override + String get settingsForced => 'Forzado'; + + @override + String get settingsAskEverytime => 'Pregunta cuando quieras'; + + @override + String get settingsModificationWarningDialogMessage => 'Otras configuraciones serán modificadas.'; + + @override + String get settingsSearchFieldLabel => 'Buscar ajustes'; + + @override + String get settingsSearchEmpty => 'Sin coincidencias'; + + @override + String get settingsActionExport => 'Exportar'; + + @override + String get settingsActionExportDialogTitle => 'Exportar'; + + @override + String get settingsActionImport => 'Importar'; + + @override + String get settingsActionImportDialogTitle => 'Importar'; + + @override + String get appExportCovers => 'Carátulas'; + + @override + String get appExportDynamicAlbums => 'Álbumes dinámicos'; + + @override + String get appExportFavourites => 'Favoritos'; + + @override + String get appExportSettings => 'Ajustes'; + + @override + String get settingsNavigationSectionTitle => 'Navegación'; + + @override + String get settingsHomeTile => 'Inicio'; + + @override + String get settingsHomeDialogTitle => 'Inicio'; + + @override + String get setHomeCustom => 'Personalizado'; + + @override + String get settingsKeepScreenOnTile => 'Mantener la pantalla encendida'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Mantener la pantalla encendida'; + + @override + String get settingsDoubleBackExit => 'Presione «atrás» dos veces para salir'; + + @override + String get settingsConfirmationTile => 'Diálogos de confirmación'; + + @override + String get settingsConfirmationDialogTitle => 'Diálogos de confirmación'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Preguntar antes de eliminar elementos permanentemente'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Preguntar antes de mover elementos al cesto de basura'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Preguntar antes de mover elementos sin una fecha de metadatos'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Mostrar mensaje después de mover elementos a la papelera de reciclaje'; + + @override + String get settingsConfirmationVaultDataLoss => 'Mostrar un aviso de pérdida de datos de la caja fuerte'; + + @override + String get settingsNavigationDrawerTile => 'Menú de navegación'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Menú de navegación'; + + @override + String get settingsNavigationDrawerBanner => 'Toque y mantenga para mover y reordenar elementos del menú.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Tipos'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Álbumes'; + + @override + String get settingsNavigationDrawerTabPages => 'Páginas'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Agregar álbum'; + + @override + String get settingsNavigationBottomActionsTile => 'Barra de navegación inferior'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Barra de navegación inferior'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Toque y mantenga para mover botones y seleccionar qué acciones se mostrarán en la barra de navegación inferior.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniaturas'; + + @override + String get settingsThumbnailOverlayTile => 'Incrustaciones'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Incrustaciones'; + + @override + String get settingsThumbnailShowHdrIcon => 'Mostrar el icono del HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Mostrar icono de favoritos'; + + @override + String get settingsThumbnailShowTagIcon => 'Mostrar ícono de etiqueta'; + + @override + String get settingsThumbnailShowLocationIcon => 'Mostrar icono de ubicación'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Mostrar icono de foto en movimiento'; + + @override + String get settingsThumbnailShowRating => 'Mostrar clasificación'; + + @override + String get settingsThumbnailShowRawIcon => 'Mostrar icono Raw'; + + @override + String get settingsThumbnailShowVideoDuration => 'Mostrar duración de video'; + + @override + String get settingsCollectionQuickActionsTile => 'Acciones rápidas'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Acciones rápidas'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Búsqueda'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selección'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Toque y mantenga para mover botones y seleccionar cuáles acciones se muestran mientras busca elementos.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Toque y mantenga para mover botones y seleccionar cuáles acciones se muestran mientras selecciona elementos.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Modelos de ráfaga'; + + @override + String get settingsCollectionBurstPatternsNone => 'Ninguno'; + + @override + String get settingsViewerSectionTitle => 'Visor'; + + @override + String get settingsViewerGestureSideTapNext => 'Toque en los bordes de la pantalla para mostrar el elemento anterior/siguiente'; + + @override + String get settingsViewerUseCutout => 'Usar área recortada'; + + @override + String get settingsViewerMaximumBrightness => 'Brillo máximo'; + + @override + String get settingsMotionPhotoAutoPlay => 'Reproducir automáticamente fotos en movimiento'; + + @override + String get settingsImageBackground => 'Imagen de fondo'; + + @override + String get settingsViewerQuickActionsTile => 'Acciones rápidas'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Acciones rápidas'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Toque y mantenga para mover botones y seleccionar cuáles acciones se muestran en el visor.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Botones mostrados'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Botones disponibles'; + + @override + String get settingsViewerQuickActionEmpty => 'Sin botones'; + + @override + String get settingsViewerOverlayTile => 'Incrustaciones'; + + @override + String get settingsViewerOverlayPageTitle => 'Incrustaciones'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Mostrar durante apertura'; + + @override + String get settingsViewerShowHistogram => 'Mostrar el histograma'; + + @override + String get settingsViewerShowMinimap => 'Mostrar mapa en miniatura'; + + @override + String get settingsViewerShowZoomLevel => 'Mostrar nivel de zoom'; + + @override + String get settingsViewerShowInformation => 'Mostrar información'; + + @override + String get settingsViewerShowInformationSubtitle => 'Mostrar título, fecha, ubicación, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Mostrar la valoración y las etiquetas'; + + @override + String get settingsViewerShowShootingDetails => 'Mostrar detalles de toma'; + + @override + String get settingsViewerShowDescription => 'Mostrar la descripción'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Mostrar miniaturas'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Efecto de difuminado'; + + @override + String get settingsViewerSlideshowTile => 'Presentación'; + + @override + String get settingsViewerSlideshowPageTitle => 'Presentación'; + + @override + String get settingsSlideshowRepeat => 'Repetir'; + + @override + String get settingsSlideshowShuffle => 'Mezclar'; + + @override + String get settingsSlideshowFillScreen => 'Llenar pantalla'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Efecto de zoom animado'; + + @override + String get settingsSlideshowTransitionTile => 'Transición'; + + @override + String get settingsSlideshowIntervalTile => 'Intervalo'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Reproducción de video'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Reproducción de video'; + + @override + String get settingsVideoPageTitle => 'Ajustes de video'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Mostrar videos'; + + @override + String get settingsVideoPlaybackTile => 'Reproducción'; + + @override + String get settingsVideoPlaybackPageTitle => 'Reproducir'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Aceleración por hardware'; + + @override + String get settingsVideoAutoPlay => 'Reproducción automática'; + + @override + String get settingsVideoLoopModeTile => 'Modo bucle'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Modo bucle'; + + @override + String get settingsVideoResumptionModeTile => 'Reanudar la reproducción'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Reanudar la reproducción'; + + @override + String get settingsVideoBackgroundMode => 'Reproducción de fondo'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Reproducción de fondo'; + + @override + String get settingsVideoControlsTile => 'Controles'; + + @override + String get settingsVideoControlsPageTitle => 'Controles'; + + @override + String get settingsVideoButtonsTile => 'Botones'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Doble toque para reproducir/pausar'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Doble toque en los bordes de la pantalla para buscar atrás/adelante'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Deslice hacia arriba o hacia abajo para ajustar el brillo o el volumen'; + + @override + String get settingsSubtitleThemeTile => 'Subtítulos'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtítulos'; + + @override + String get settingsSubtitleThemeSample => 'Esto es un ejemplo.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Alineación de texto'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Alineación de texto'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Posición del texto'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Posición del texto'; + + @override + String get settingsSubtitleThemeTextSize => 'Tamaño de texto'; + + @override + String get settingsSubtitleThemeShowOutline => 'Mostrar contorno y sombra'; + + @override + String get settingsSubtitleThemeTextColor => 'Color de texto'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Opacidad de texto'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Color de fondo'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Opacidad de fondo'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Izquierda'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Centro'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Derecha'; + + @override + String get settingsPrivacySectionTitle => 'Privacidad'; + + @override + String get settingsAllowInstalledAppAccess => 'Permita el acceso a lista de aplicaciones'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Usado para mejorar los álbumes mostrados'; + + @override + String get settingsAllowErrorReporting => 'Permitir reporte de errores anónimo'; + + @override + String get settingsSaveSearchHistory => 'Guardar historial de búsqueda'; + + @override + String get settingsEnableBin => 'Usar cesto de basura'; + + @override + String get settingsEnableBinSubtitle => 'Guardar los elementos eliminados por 30 días'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Los elementos de la papelera de reciclaje se borrarán para siempre.'; + + @override + String get settingsAllowMediaManagement => 'Permitir la gestión de medios'; + + @override + String get settingsHiddenItemsTile => 'Elementos ocultos'; + + @override + String get settingsHiddenItemsPageTitle => 'Elementos ocultos'; + + @override + String get settingsHiddenFiltersBanner => 'Fotos y videos que concuerden con los filtros no aparecerán en su colección.'; + + @override + String get settingsHiddenFiltersEmpty => 'Sin filtros'; + + @override + String get settingsStorageAccessTile => 'Acceso al almacenamiento'; + + @override + String get settingsStorageAccessPageTitle => 'Acceso al almacenamiento'; + + @override + String get settingsStorageAccessBanner => 'Algunos directorios requieren un permiso de acceso explícito para que sea posible modificar los archivos que contienen. Puede revisar los directorios con permiso aquí.'; + + @override + String get settingsStorageAccessEmpty => 'Sin permisos de acceso'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revocar'; + + @override + String get settingsAccessibilitySectionTitle => 'Accesibilidad'; + + @override + String get settingsRemoveAnimationsTile => 'Remover animaciones'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remover animaciones'; + + @override + String get settingsTimeToTakeActionTile => 'Retraso para ejecutar una acción'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Mostrar alternativas a gestos multitáctiles'; + + @override + String get settingsDisplaySectionTitle => 'Pantalla'; + + @override + String get settingsThemeBrightnessTile => 'Tema'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Tema'; + + @override + String get settingsThemeColorHighlights => 'Acentos de color'; + + @override + String get settingsThemeEnableDynamicColor => 'Color dinámico'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Tasa de refresco de la pantalla'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Tasa de refresco'; + + @override + String get settingsDisplayUseTvInterface => 'Interfaz de Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Idioma y formatos'; + + @override + String get settingsLanguageTile => 'Idioma'; + + @override + String get settingsLanguagePageTitle => 'Idioma'; + + @override + String get settingsCoordinateFormatTile => 'Formato de coordenadas'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Formato de coordenadas'; + + @override + String get settingsUnitSystemTile => 'Unidades'; + + @override + String get settingsUnitSystemDialogTitle => 'Unidades'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Forzar números arábigos'; + + @override + String get settingsScreenSaverPageTitle => 'Protector de pantalla'; + + @override + String get settingsWidgetPageTitle => 'Marco de foto'; + + @override + String get settingsWidgetShowOutline => 'Borde'; + + @override + String get settingsWidgetOpenPage => 'Al pulsar sobre el widget'; + + @override + String get settingsWidgetDisplayedItem => 'Elemento para mostrar'; + + @override + String get settingsCollectionTile => 'Colección'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString elementos con ubicación', + one: '1 elemento con ubicación', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Países principales'; + + @override + String get statsTopStatesSectionTitle => 'Estados principales'; + + @override + String get statsTopPlacesSectionTitle => 'Lugares principales'; + + @override + String get statsTopTagsSectionTitle => 'Etiquetas principales'; + + @override + String get statsTopAlbumsSectionTitle => 'Álbumes principales'; + + @override + String get viewerOpenPanoramaButtonLabel => 'ABRIR PANORÁMICA'; + + @override + String get viewerSetWallpaperButtonLabel => 'ESTABLECER FONDO'; + + @override + String get viewerErrorUnknown => '¡Ups!'; + + @override + String get viewerErrorDoesNotExist => 'El archivo no existe.'; + + @override + String get viewerInfoPageTitle => 'Información'; + + @override + String get viewerInfoBackToViewerTooltip => 'Regresar al visor'; + + @override + String get viewerInfoUnknown => 'Desconocido'; + + @override + String get viewerInfoLabelDescription => 'Descripción'; + + @override + String get viewerInfoLabelTitle => 'Título'; + + @override + String get viewerInfoLabelDate => 'Fecha'; + + @override + String get viewerInfoLabelResolution => 'Resolución'; + + @override + String get viewerInfoLabelSize => 'Tamaño'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Ubicación'; + + @override + String get viewerInfoLabelDuration => 'Duración'; + + @override + String get viewerInfoLabelOwner => 'Propiedad de'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinadas'; + + @override + String get viewerInfoLabelAddress => 'Dirección'; + + @override + String get mapStyleDialogTitle => 'Estilo de mapa'; + + @override + String get mapStyleDialogAddStyle => 'Añadir estilo'; + + @override + String get mapStyleTooltip => 'Selección de estilo de mapa'; + + @override + String get mapStyleEditorDialogName => 'Nombre'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdominios'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Acercar'; + + @override + String get mapZoomOutTooltip => 'Alejar'; + + @override + String get mapPointNorthUpTooltip => 'Apuntar el Norte hacia arriba'; + + @override + String get mapAttributionOsmData => 'Datos de mapas © [OpenStreetMap](https://www.openstreetmap.org/copyright) contribuidores'; + + @override + String get mapAttributionOsmLiberty => 'Mosaicos por [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Alojado por [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Mosaicos por [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Mosaicos por [HOT](https://www.hotosm.org/) • Alojado por [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Mosaicos por [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Ver en página del mapa'; + + @override + String get mapEmptyRegion => 'Sin imágenes en esta región'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Fallo al extraer datos embutidos'; + + @override + String get viewerInfoOpenLinkText => 'Abrir'; + + @override + String get viewerInfoViewXmlLinkText => 'Ver XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Buscar metadatos'; + + @override + String get viewerInfoSearchEmpty => 'Sin claves concordantes'; + + @override + String get viewerInfoSearchSuggestionDate => 'Fecha y hora'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Descripción'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensiones'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolución'; + + @override + String get viewerInfoSearchSuggestionRights => 'Derechos'; + + @override + String get wallpaperUseScrollEffect => 'Usar el efecto de desplazamiento en la pantalla de inicio'; + + @override + String get tagEditorPageTitle => 'Editar Etiquetas'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Nueva etiqueta'; + + @override + String get tagEditorPageAddTagTooltip => 'Añadir etiqueta'; + + @override + String get tagEditorSectionRecent => 'Reciente'; + + @override + String get tagEditorSectionPlaceholders => 'Marcadores de la posición'; + + @override + String get tagEditorDiscardDialogMessage => '¿Quieres descartar los cambios?'; + + @override + String get tagPlaceholderCountry => 'País'; + + @override + String get tagPlaceholderState => 'Estado'; + + @override + String get tagPlaceholderPlace => 'Lugar'; + + @override + String get panoramaEnableSensorControl => 'Activar control de sensores'; + + @override + String get panoramaDisableSensorControl => 'Desactivar control de sensores'; + + @override + String get sourceViewerPageTitle => 'Fuente'; +} diff --git a/lib/l10ngen/app_localizations_et.dart b/lib/l10ngen/app_localizations_et.dart new file mode 100644 index 0000000..22cbecf --- /dev/null +++ b/lib/l10ngen/app_localizations_et.dart @@ -0,0 +1,2426 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Estonian (`et`). +class AppLocalizationsEt extends AppLocalizations { + AppLocalizationsEt([String locale = 'et']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Tere tulemast kasutama Avest'; + + @override + String get welcomeOptional => 'Pole kohustuslik'; + + @override + String get welcomeTermsToggle => 'Nõustun kasutustingimustega'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString objekti', + one: '$countString objekt', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString veergu', + one: '$countString veerg', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString sekundit', + one: '$countString sekund', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutit', + one: '$countString minut', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString päeva', + one: '$countString päev', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'RAKENDA'; + + @override + String get createButtonLabel => 'LOO'; + + @override + String get deleteButtonLabel => 'KUSTUTA'; + + @override + String get nextButtonLabel => 'JÄRGMINE'; + + @override + String get showButtonLabel => 'NÄITA'; + + @override + String get hideButtonLabel => 'PEIDA'; + + @override + String get continueButtonLabel => 'JÄTKA'; + + @override + String get saveCopyButtonLabel => 'SALVESTA KOOPIA'; + + @override + String get applyTooltip => 'Rakenda'; + + @override + String get cancelTooltip => 'Katkesta'; + + @override + String get changeTooltip => 'Muuda'; + + @override + String get clearTooltip => 'Tühjenda'; + + @override + String get previousTooltip => 'Eelmine'; + + @override + String get nextTooltip => 'Järgmine'; + + @override + String get showTooltip => 'Näita'; + + @override + String get hideTooltip => 'Peida'; + + @override + String get actionRemove => 'Eemalda'; + + @override + String get resetTooltip => 'Lähtesta'; + + @override + String get saveTooltip => 'Salvesta'; + + @override + String get stopTooltip => 'Lõpeta'; + + @override + String get pickTooltip => 'Vali'; + + @override + String get doubleBackExitMessage => 'Väljumiseks klõpsi uuesti nuppu „Tagasi“.'; + + @override + String get doNotAskAgain => 'Ära küsi enam uuesti'; + + @override + String get sourceStateLoading => 'Laadime andmeid'; + + @override + String get sourceStateCataloguing => 'Katalogiseerime'; + + @override + String get sourceStateLocatingCountries => 'Tuvastame riike'; + + @override + String get sourceStateLocatingPlaces => 'Tuvastame asukohti'; + + @override + String get chipActionDelete => 'Kustuta'; + + @override + String get chipActionRemove => 'Eemalda'; + + @override + String get chipActionShowCollection => 'Näita kogumikus'; + + @override + String get chipActionGoToAlbumPage => 'Näita albumites'; + + @override + String get chipActionGoToCountryPage => 'Näita riikides'; + + @override + String get chipActionGoToPlacePage => 'Näita asukohtades'; + + @override + String get chipActionGoToTagPage => 'Näita siltides'; + + @override + String get chipActionGoToExplorerPage => 'Näita sirvijas'; + + @override + String get chipActionDecompose => 'Poolita'; + + @override + String get chipActionFilterOut => 'Sõelu välja'; + + @override + String get chipActionFilterIn => 'Sõelu sisse'; + + @override + String get chipActionHide => 'Peida'; + + @override + String get chipActionLock => 'Lukusta'; + + @override + String get chipActionPin => 'Kinnita üles äärde'; + + @override + String get chipActionUnpin => 'Eemalda ülalt äärest'; + + @override + String get chipActionGroup => 'Muuda grupeerimist'; + + @override + String get chipActionRename => 'Muuda nime'; + + @override + String get chipActionSetCover => 'Määra kaanepildiks'; + + @override + String get chipActionShowCountryStates => 'Näita osariike'; + + @override + String get chipActionCreateGroup => 'Loo grupp'; + + @override + String get chipActionCreateAlbum => 'Loo album'; + + @override + String get chipActionCreateVault => 'Loo turvaruum'; + + @override + String get chipActionConfigureVault => 'Seadista turvaruumi'; + + @override + String get entryActionCopyToClipboard => 'Kopeeri lõikelauale'; + + @override + String get entryActionDelete => 'Kustuta'; + + @override + String get entryActionConvert => 'Konverteeri'; + + @override + String get entryActionExport => 'Ekspordi'; + + @override + String get entryActionInfo => 'Teave'; + + @override + String get entryActionRename => 'Muuda nime'; + + @override + String get entryActionRestore => 'Taasta'; + + @override + String get entryActionRotateCCW => 'Pööra vastupäeva'; + + @override + String get entryActionRotateCW => 'Pööra päripäeva'; + + @override + String get entryActionFlip => 'Pööra ümber horisontaalselt'; + + @override + String get entryActionPrint => 'Prindi'; + + @override + String get entryActionShare => 'Jaga'; + + @override + String get entryActionShareImageOnly => 'Jaga vaid pilti'; + + @override + String get entryActionShareVideoOnly => 'Jaga vaid videot'; + + @override + String get entryActionViewSource => 'Vaata allikat'; + + @override + String get entryActionShowGeoTiffOnMap => 'Näita kaardi ülekattena'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Muuda stoppkaadriks'; + + @override + String get entryActionViewMotionPhotoVideo => 'Ava video'; + + @override + String get entryActionEdit => 'Muuda'; + + @override + String get entryActionOpen => 'Ava rakendusega'; + + @override + String get entryActionSetAs => 'Seadista kui'; + + @override + String get entryActionCast => 'Peegelda välisseadmesse'; + + @override + String get entryActionOpenMap => 'Näita kaardirakenduses'; + + @override + String get entryActionRotateScreen => 'Pööra ekraani'; + + @override + String get entryActionAddFavourite => 'Lisa lemmikuks'; + + @override + String get entryActionRemoveFavourite => 'Eemalda lemmikute hulgast'; + + @override + String get videoActionCaptureFrame => 'Tee stoppkaader'; + + @override + String get videoActionMute => 'Summuta'; + + @override + String get videoActionUnmute => 'Eemalda summutamine'; + + @override + String get videoActionPause => 'Peata'; + + @override + String get videoActionPlay => 'Esita'; + + @override + String get videoActionReplay10 => 'Keri tagasi 10 sekundit'; + + @override + String get videoActionSkip10 => 'Keri edasi 10 sekundit'; + + @override + String get videoActionShowPreviousFrame => 'Näita eelmist kaadrit'; + + @override + String get videoActionShowNextFrame => 'Näita järgmist kaadrit'; + + @override + String get videoActionSelectStreams => 'Vali meediavood'; + + @override + String get videoActionSetSpeed => 'Taasesituse kiirus'; + + @override + String get videoActionABRepeat => 'A-B kordus'; + + @override + String get videoRepeatActionSetStart => 'Määra algus'; + + @override + String get videoRepeatActionSetEnd => 'Määra lõpp'; + + @override + String get viewerActionSettings => 'Seadistused'; + + @override + String get viewerActionLock => 'Lukusta vaade'; + + @override + String get viewerActionUnlock => 'Eemalda vaate lukustus'; + + @override + String get slideshowActionResume => 'Jätka'; + + @override + String get slideshowActionShowInCollection => 'Näita kogumikus'; + + @override + String get entryInfoActionEditDate => 'Muuda kuupäeva ja kellaaega'; + + @override + String get entryInfoActionEditLocation => 'Muuda asukohta'; + + @override + String get entryInfoActionEditTitleDescription => 'Muuda pealkirja ja kirjeldust'; + + @override + String get entryInfoActionEditRating => 'Muuda hinnangut'; + + @override + String get entryInfoActionEditTags => 'Muuda silte'; + + @override + String get entryInfoActionRemoveMetadata => 'Eemalda metainfo'; + + @override + String get entryInfoActionExportMetadata => 'Ekspordi metainfo'; + + @override + String get entryInfoActionRemoveLocation => 'Eemalda asukoht'; + + @override + String get editorActionTransform => 'Muuda'; + + @override + String get editorTransformCrop => 'Kadreeri'; + + @override + String get editorTransformRotate => 'Pööra'; + + @override + String get cropAspectRatioFree => 'Vaba'; + + @override + String get cropAspectRatioOriginal => 'Algne'; + + @override + String get cropAspectRatioSquare => 'Ruut'; + + @override + String get filterAspectRatioLandscapeLabel => 'Rõhtloodis'; + + @override + String get filterAspectRatioPortraitLabel => 'Püstloodis'; + + @override + String get filterBinLabel => 'Prügikast'; + + @override + String get filterFavouriteLabel => 'Lemmik'; + + @override + String get filterNoDateLabel => 'Kuupäevata'; + + @override + String get filterNoAddressLabel => 'Aadressita'; + + @override + String get filterLocatedLabel => 'Asukoht tuvastatud'; + + @override + String get filterNoLocationLabel => 'Asukoht tuvastamata'; + + @override + String get filterNoRatingLabel => 'Pole hinnatud'; + + @override + String get filterTaggedLabel => 'Sildistatud'; + + @override + String get filterNoTagLabel => 'Sildistamata'; + + @override + String get filterNoTitleLabel => 'Ilma nimeta'; + + @override + String get filterOnThisDayLabel => 'Täna'; + + @override + String get filterRecentlyAddedLabel => 'Hiljuti lisatud'; + + @override + String get filterRatingRejectedLabel => 'Tagasilükatud'; + + @override + String get filterTypeAnimatedLabel => 'Animeeritud'; + + @override + String get filterTypeMotionPhotoLabel => 'Liikuv foto'; + + @override + String get filterTypePanoramaLabel => 'Panoraam'; + + @override + String get filterTypeRawLabel => 'Raw-vorming'; + + @override + String get filterTypeSphericalVideoLabel => '360° video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Pilt'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Eemalda ekraanieffektid'; + + @override + String get accessibilityAnimationsKeep => 'Jäta ekraanieffektid alles'; + + @override + String get albumTierNew => 'Uus'; + + @override + String get albumTierPinned => 'Esiletõstetud'; + + @override + String get albumTierGroups => 'Grupid'; + + @override + String get albumTierSpecial => 'Üldised'; + + @override + String get albumTierApps => 'Rakendused'; + + @override + String get albumTierVaults => 'Turvaruumid'; + + @override + String get albumTierDynamic => 'Dünaamiline'; + + @override + String get albumTierRegular => 'Muud'; + + @override + String get coordinateFormatDms => 'KMS'; + + @override + String get coordinateFormatDdm => 'KKM'; + + @override + String get coordinateFormatDecimal => 'Kümnendsüsteem'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Kõrgeim sagedus'; + + @override + String get displayRefreshRatePreferLowest => 'Madalaim sagedus'; + + @override + String get keepScreenOnNever => 'Mitte kunagi'; + + @override + String get keepScreenOnVideoPlayback => 'Video taasesitusel'; + + @override + String get keepScreenOnViewerOnly => 'Vaid vaate lehel'; + + @override + String get keepScreenOnAlways => 'Alati'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (hübriidkaart)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (maastik)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'OSMi humanitaarkaart'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Mitte kunagi'; + + @override + String get maxBrightnessAlways => 'Alati'; + + @override + String get nameConflictStrategyRename => 'Muuda nime'; + + @override + String get nameConflictStrategyReplace => 'Asenda'; + + @override + String get nameConflictStrategySkip => 'Jäta vahele'; + + @override + String get overlayHistogramNone => 'Määratlemata'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Heledus'; + + @override + String get subtitlePositionTop => 'Üleval'; + + @override + String get subtitlePositionBottom => 'All'; + + @override + String get themeBrightnessLight => 'Hele kujundus'; + + @override + String get themeBrightnessDark => 'Tume kujundus'; + + @override + String get themeBrightnessBlack => 'Süsimust kujundus'; + + @override + String get unitSystemMetric => 'Meetermõõdustik'; + + @override + String get unitSystemImperial => 'Inglise mõõdustik'; + + @override + String get vaultLockTypePattern => 'Muster'; + + @override + String get vaultLockTypePin => 'PIN-kood'; + + @override + String get vaultLockTypePassword => 'Salasõna'; + + @override + String get settingsVideoEnablePip => 'Pilt pildis'; + + @override + String get videoControlsPlayOutside => 'Ava välises meediamängijas'; + + @override + String get videoLoopModeNever => 'Mitte kunagi'; + + @override + String get videoLoopModeShortOnly => 'Vaid lühivideod'; + + @override + String get videoLoopModeAlways => 'Alati'; + + @override + String get videoPlaybackSkip => 'Jäta vahele'; + + @override + String get videoPlaybackMuted => 'Esita summutatuna'; + + @override + String get videoPlaybackWithSound => 'Esita heliga'; + + @override + String get videoResumptionModeNever => 'Mitte kunagi'; + + @override + String get videoResumptionModeAlways => 'Alati'; + + @override + String get viewerTransitionSlide => 'Äraliuglemine'; + + @override + String get viewerTransitionParallax => 'Parallaks'; + + @override + String get viewerTransitionFade => 'Hajumine'; + + @override + String get viewerTransitionZoomIn => 'Sissesuumimine'; + + @override + String get viewerTransitionNone => 'Määratlemata'; + + @override + String get wallpaperTargetHome => 'Avaleht'; + + @override + String get wallpaperTargetLock => 'Lukustusvaade'; + + @override + String get wallpaperTargetHomeLock => 'Avaleht ja lukustusvaade'; + + @override + String get widgetDisplayedItemRandom => 'Juhuslik'; + + @override + String get widgetDisplayedItemMostRecent => 'Viimane'; + + @override + String get widgetOpenPageHome => 'Mine avalehele'; + + @override + String get widgetOpenPageCollection => 'Ava kogumik'; + + @override + String get widgetOpenPageViewer => 'Ava pildivaataja'; + + @override + String get widgetTapUpdateWidget => 'Värskenda vidinat'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Sisemine andmehoidla'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD-kaart'; + + @override + String get rootDirectoryDescription => 'juurkaust'; + + @override + String otherDirectoryDescription(String name) { + return '„$name“ kaust'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Palun anna sellele rakendusele järgmises ekraanivaates õigused $directory kaustale „$volume“ andmekogus.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Sellel rakendusel pole õigusi muuta faile „$volume“ andmekogu $directory kaustas.\n\nPalun kasuta failihaldurit või galeriirakendust failide tõstmiseks muude asukohta.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'See tegevus vajab „$volume“ andmeruumis $neededSize vaba andmemahtu, kuid alles on vaid $freeSize.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Süsteemi failihaldur/failivalija on puudu või kasutuselt eemaldatud. Palun pane ta tööle ja proovi siis uuesti.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'See tegevus pole toetatud antud tüüpi objektide puhul: $types.', + one: 'See tegevus pole toetatud antud tüüpi objekti puhul: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Mõnedel sihtkausta failidel on sama nimi.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Mõnedel failidel on sama nimi.'; + + @override + String get addShortcutDialogLabel => 'Kiirnupu silt'; + + @override + String get addShortcutButtonLabel => 'LISA'; + + @override + String get noMatchingAppDialogMessage => 'Pole rakendusi, mis oskaks seda kasutada.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kas viskame need $countString objekti prügikasti?', + one: 'Kas viskame selle objekti prügikasti?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kas kustutame need $countString objekti?', + one: 'Kas kustutame selle objekti?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Kas enne jätkamist salvestame objekti kuupäevad?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Salvesta kuupäevad'; + + @override + String videoResumeDialogMessage(String time) { + return 'Kas sa soovid jätkata esitamist $time kohalt?'; + } + + @override + String get videoStartOverButtonLabel => 'ALUSTA UUESTI'; + + @override + String get videoResumeButtonLabel => 'JÄTKA'; + + @override + String get setCoverDialogLatest => 'Viimane objekt'; + + @override + String get setCoverDialogAuto => 'Automaatne'; + + @override + String get setCoverDialogCustom => 'Sinu valik'; + + @override + String get hideFilterConfirmationDialogMessage => + 'Filtrile vastavad fotod ja videod on sinu meediakogust peidetud. Kui soovid neid uuesti kuvada, siis seadistuste alajaotusest „Privaatsus“ saad seda lubada.\n\nKas sa oled kindel, et soovid neid peita?'; + + @override + String get newAlbumDialogTitle => 'Uus album'; + + @override + String get newAlbumDialogNameLabel => 'Albumi nimi'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Sellise nimega album on juba olemas'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Selline kaust on juba olemas'; + + @override + String get newAlbumDialogStorageLabel => 'Andmeruum:'; + + @override + String get newDynamicAlbumDialogTitle => 'Uus dünaamiline album'; + + @override + String get dynamicAlbumAlreadyExists => 'Selline dünaamiline album on juba olemas'; + + @override + String get newGroupDialogTitle => 'Uus grupp'; + + @override + String get newGroupDialogNameLabel => 'Grupi nimi'; + + @override + String get groupAlreadyExists => 'Selline grupp on juba olemas'; + + @override + String get groupEmpty => 'Gruppe pole'; + + @override + String get ungrouped => 'Grupeerimata'; + + @override + String get groupPickerTitle => 'Vali grupp'; + + @override + String get groupPickerUseThisGroupButton => 'Kasuta seda gruppi'; + + @override + String get newVaultWarningDialogMessage => + 'Turvaruumis asuvad objektid on nähtavad vaid sellele rakendusele ja mitte ühelgi muul viisil.\n\nKui sa eemaldad nutiseadmest selle rakenduse või kustutad rakenduse andmed, siis kaob igasugune ligipääs nendele objektidele.'; + + @override + String get newVaultDialogTitle => 'Uus turvaruum'; + + @override + String get configureVaultDialogTitle => 'Seadista turvaruumi'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Ekraani väljalülitumisel lukusta turvaruum'; + + @override + String get vaultDialogLockTypeLabel => 'Lukustuse tüüp'; + + @override + String get patternDialogEnter => 'Sisesta viipemuster'; + + @override + String get patternDialogConfirm => 'Korda viipemustrit'; + + @override + String get pinDialogEnter => 'Sisesta PIN-kood'; + + @override + String get pinDialogConfirm => 'Korda PIN-koodi'; + + @override + String get passwordDialogEnter => 'Sisesta salasõna'; + + @override + String get passwordDialogConfirm => 'Korda salasõna'; + + @override + String get authenticateToConfigureVault => 'Turvaruumi seadistamiseks autendi'; + + @override + String get authenticateToUnlockVault => 'Turvaruumi lukustuse eemaldamiseks autendi'; + + @override + String get vaultBinUsageDialogMessage => 'Mõned turvaruumid kasutavad prügikasti.'; + + @override + String get renameAlbumDialogLabel => 'Uus nimi'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Selline kaust on juba olemas'; + + @override + String get renameEntrySetPageTitle => 'Muuda nime'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Failide nimemuster'; + + @override + String get renameEntrySetPageInsertTooltip => 'Lisa väli'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Eelvaade'; + + @override + String get renameProcessorCounter => 'Loendur'; + + @override + String get renameProcessorHash => 'Räsi'; + + @override + String get renameProcessorName => 'Nimi'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kas kustutame selle albumi koos seal leiduva $countString objektiga?', + one: 'Kas kustutame selle albumi koos seal leiduva ühe objektiga?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kas kustutame need albumis koos seal leiduva $countString objektiga?', + one: 'Kas kustutame need albumis koos seal leiduva ühe objektiga?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Vorming:'; + + @override + String get exportEntryDialogWidth => 'Laius'; + + @override + String get exportEntryDialogHeight => 'Kõrgus'; + + @override + String get exportEntryDialogQuality => 'Kvaliteet'; + + @override + String get exportEntryDialogWriteMetadata => 'Salvesta metainfo'; + + @override + String get renameEntryDialogLabel => 'Uus nimi'; + + @override + String get editEntryDialogCopyFromItem => 'Kopi teisest objektist'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Muudetavad väljad'; + + @override + String get editEntryDateDialogTitle => 'Kuupäev ja kellaaeg'; + + @override + String get editEntryDateDialogSetCustom => 'Määra soovitud kuupäev'; + + @override + String get editEntryDateDialogCopyField => 'Kopeeri muust kuupäevast'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Tuvasta pealkirjast'; + + @override + String get editEntryDateDialogShift => 'Nihuta ajatemplit'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Faili muutmisaeg'; + + @override + String get durationDialogHours => 'Tunnid'; + + @override + String get durationDialogMinutes => 'Minutid'; + + @override + String get durationDialogSeconds => 'Sekundid'; + + @override + String get editEntryLocationDialogTitle => 'Asukoht'; + + @override + String get editEntryLocationDialogSetCustom => 'Määra asukoht ise'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Vali kaardilt'; + + @override + String get editEntryLocationDialogImportGpx => 'Impordi GPX-fail'; + + @override + String get editEntryLocationDialogLatitude => 'Laiuskraad'; + + @override + String get editEntryLocationDialogLongitude => 'Pikkuskraad'; + + @override + String get editEntryLocationDialogTimeShift => 'Ajanihe'; + + @override + String get locationPickerUseThisLocationButton => 'Kasuta seda asukohta'; + + @override + String get editEntryRatingDialogTitle => 'Hinnang'; + + @override + String get removeEntryMetadataDialogTitle => 'Metainfo eemaldamine'; + + @override + String get removeEntryMetadataDialogAll => 'Kõik'; + + @override + String get removeEntryMetadataDialogMore => 'Veel'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP on vajalik video esitamisel foto sees.\n\nKas oled kindel, et soovid selle metainfo eemaldada?'; + + @override + String get videoSpeedDialogLabel => 'Taasesituse kiirus'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Heliriba'; + + @override + String get videoStreamSelectionDialogText => 'Subtiitrid'; + + @override + String get videoStreamSelectionDialogOff => 'Välja lülitatud'; + + @override + String get videoStreamSelectionDialogTrack => 'Videoriba'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Rohkem meediaribasid failis pole.'; + + @override + String get genericSuccessFeedback => 'Valmis!'; + + @override + String get genericFailureFeedback => 'Ei õnnestunud'; + + @override + String get genericDangerWarningDialogMessage => 'Kas sa oled kindel?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Proovi uuesti, aga väiksema arvu objektidega.'; + + @override + String get menuActionConfigureView => 'Vaata'; + + @override + String get menuActionSelect => 'Vali'; + + @override + String get menuActionSelectAll => 'Vali kõik'; + + @override + String get menuActionSelectNone => 'Ära vali midagi'; + + @override + String get menuActionMap => 'Kaart'; + + @override + String get menuActionSlideshow => 'Slaidiesitlus'; + + @override + String get menuActionStats => 'Statistika'; + + @override + String get viewDialogSortSectionTitle => 'Järjesta'; + + @override + String get viewDialogGroupSectionTitle => 'Rubriigid'; + + @override + String get viewDialogLayoutSectionTitle => 'Paiguta'; + + @override + String get viewDialogReverseSortOrder => 'Tagurpidi järjestus'; + + @override + String get tileLayoutMosaic => 'Mosaiik'; + + @override + String get tileLayoutGrid => 'Ruudustik'; + + @override + String get tileLayoutList => 'Loend'; + + @override + String get castDialogTitle => 'Seadmed peegeldamiseks'; + + @override + String get coverDialogTabCover => 'Kaanepilt'; + + @override + String get coverDialogTabApp => 'Rakenduse'; + + @override + String get coverDialogTabColor => 'Värv'; + + @override + String get appPickDialogTitle => 'Vali rakendus'; + + @override + String get appPickDialogNone => 'Määratlemata'; + + @override + String get aboutPageTitle => 'Rakenduse teave'; + + @override + String get aboutLinkLicense => 'Litsents'; + + @override + String get aboutLinkPolicy => 'Privaatsuspoliitika'; + + @override + String get aboutBugSectionTitle => 'Veateated'; + + @override + String get aboutBugSaveLogInstruction => 'Salvesta rakenduse logid faili'; + + @override + String get aboutBugCopyInfoInstruction => 'Kopeeri süsteemiteave'; + + @override + String get aboutBugCopyInfoButton => 'Kopeeri'; + + @override + String get aboutBugReportInstruction => 'Teata GitHubis koos logide ja süsteemiteabega'; + + @override + String get aboutBugReportButton => 'Teata veast'; + + @override + String get aboutDataUsageSectionTitle => 'Andmekasutus'; + + @override + String get aboutDataUsageData => 'Andmed'; + + @override + String get aboutDataUsageCache => 'Vahemälu'; + + @override + String get aboutDataUsageDatabase => 'Andmebaas'; + + @override + String get aboutDataUsageMisc => 'Varia'; + + @override + String get aboutDataUsageInternal => 'Sisemine'; + + @override + String get aboutDataUsageExternal => 'Väline'; + + @override + String get aboutDataUsageClearCache => 'Tühjenda vahemälu'; + + @override + String get aboutCreditsSectionTitle => 'Tänuavaldused'; + + @override + String get aboutCreditsWorldAtlas1 => 'See rakendus kasutab TopoJSONi faili, mille on koostanud'; + + @override + String get aboutCreditsWorldAtlas2 => ', avaldatud ISC Litsentsi alusel.'; + + @override + String get aboutTranslatorsSectionTitle => 'Tõlkijad'; + + @override + String get aboutLicensesSectionTitle => 'Avatud lähtekoodiga tarkvara litsentsid'; + + @override + String get aboutLicensesBanner => 'See rakendus kasutab järgmiseid avatud lähtekoodiga pakette ja teeke.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Androidi teegid'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutteri lisamoodulid'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutteri paketid'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Darti paketid'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Näita kõiki litsentse'; + + @override + String get policyPageTitle => 'Andmekaitsepõhimõtted'; + + @override + String get collectionPageTitle => 'Meediakogu'; + + @override + String get collectionPickPageTitle => 'Vali'; + + @override + String get collectionSelectPageTitle => 'Vali objektid'; + + @override + String get collectionActionShowTitleSearch => 'Näita pealkirjade filtrit'; + + @override + String get collectionActionHideTitleSearch => 'Peida pealkirjade filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Lisa dünaamiline album'; + + @override + String get collectionActionAddShortcut => 'Lisa viide'; + + @override + String get collectionActionSetHome => 'Märgi avaleheks'; + + @override + String get collectionActionEmptyBin => 'Tühjenda prügikast'; + + @override + String get collectionActionCopy => 'Kopeeri albumisse'; + + @override + String get collectionActionMove => 'Teisalda albumisse'; + + @override + String get collectionActionRescan => 'Skaneeri uuesti'; + + @override + String get collectionActionEdit => 'Muuda'; + + @override + String get collectionSearchTitlesHintText => 'Otsi pealkirju'; + + @override + String get collectionGroupAlbum => 'Albumi alusel'; + + @override + String get collectionGroupMonth => 'Kuude kaupa'; + + @override + String get collectionGroupDay => 'Päevade kaupa'; + + @override + String get sectionNone => 'Rubriike pole'; + + @override + String get sectionUnknown => 'Teadmata'; + + @override + String get dateToday => 'Täna'; + + @override + String get dateYesterday => 'Eile'; + + @override + String get dateThisMonth => 'Sel kuul'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString objekti kustutamine ei õnnestunud', + one: '1 objekti kustutamine ei õnnestunud', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString objekti kopeerimine ei õnnestunud', + one: '1 objekti kopeerimine ei õnnestunud', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString objekti teisaldamine ei õnnestunud', + one: '1 objekti teisaldamine ei õnnestunud', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString objekti nime muutmine ei õnnestunud', + one: '1 objekti nime muutmine ei õnnestunud', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString objekti muutmine ei õnnestunud', + one: '1 objekti muutmine ei õnnestunud', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString lehe eksportimine ei õnnestunud', + one: '1 lehe eksportimine ei õnnestunud', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kopeerisime $countString objekti', + one: 'Kopeerisime 1 objekti', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Teisaldasime $countString objekti', + one: 'Teisaldasime 1 objekti', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Muutsime $countString objekti nime', + one: 'Muutsime 1 objekti nime', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Muutsime $countString objekti', + one: 'Muutsime 1 objekti', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Sul pole veel lemmikud'; + + @override + String get collectionEmptyVideos => 'Videoid pole'; + + @override + String get collectionEmptyImages => 'Pilte pole'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Luba juurdepääs'; + + @override + String get collectionSelectSectionTooltip => 'Vali lõik'; + + @override + String get collectionDeselectSectionTooltip => 'Eemalda lõigu valik'; + + @override + String get drawerAboutButton => 'Teave'; + + @override + String get drawerSettingsButton => 'Seadistused'; + + @override + String get drawerCollectionAll => 'Kõik kogumikud'; + + @override + String get drawerCollectionFavourites => 'Lemmikud'; + + @override + String get drawerCollectionImages => 'Pildid'; + + @override + String get drawerCollectionVideos => 'Videod'; + + @override + String get drawerCollectionAnimated => 'Animeeritud'; + + @override + String get drawerCollectionMotionPhotos => 'Liikuvad fotod'; + + @override + String get drawerCollectionPanoramas => 'Panoraamfotod'; + + @override + String get drawerCollectionRaws => 'Raw-vormingus fotod'; + + @override + String get drawerCollectionSphericalVideos => '360° videod'; + + @override + String get drawerAlbumPage => 'Albumid'; + + @override + String get drawerCountryPage => 'Riigid'; + + @override + String get drawerPlacePage => 'Kohad'; + + @override + String get drawerTagPage => 'Sildid'; + + @override + String get sortByDate => 'Kuupäeva alusel'; + + @override + String get sortByName => 'Nime alusel'; + + @override + String get sortByItemCount => 'Objektide arvu järgi'; + + @override + String get sortBySize => 'Suuruse alusel'; + + @override + String get sortByAlbumFileName => 'Albumi ja objekti nime alusel'; + + @override + String get sortByRating => 'Hinnangu alusel'; + + @override + String get sortByDuration => 'Kestuse järgi'; + + @override + String get sortByPath => 'Asukoha alusel'; + + @override + String get sortOrderNewestFirst => 'Esmalt uuemad'; + + @override + String get sortOrderOldestFirst => 'Esmalt vanemad'; + + @override + String get sortOrderAtoZ => 'A kuni Z'; + + @override + String get sortOrderZtoA => 'Z kuni A'; + + @override + String get sortOrderHighestFirst => 'Esmalt kõrgemad'; + + @override + String get sortOrderLowestFirst => 'Esmalt madalamad'; + + @override + String get sortOrderLargestFirst => 'Esmalt suuremad'; + + @override + String get sortOrderSmallestFirst => 'Esmalt väiksemad'; + + @override + String get sortOrderShortestFirst => 'Esmalt lühemad'; + + @override + String get sortOrderLongestFirst => 'Esmalt pikemad'; + + @override + String get albumGroupTier => 'Taseme järgi'; + + @override + String get albumGroupType => 'Tüübi järgi'; + + @override + String get albumGroupVolume => 'Andmemahu alusel'; + + @override + String get albumMimeTypeMixed => 'Erinev sisu'; + + @override + String get albumPickPageTitleCopy => 'Kopeeri albumisse'; + + @override + String get albumPickPageTitleExport => 'Ekspordi albumisse'; + + @override + String get albumPickPageTitleMove => 'Teisalda albumisse'; + + @override + String get albumPickPageTitlePick => 'Vali album'; + + @override + String get albumCamera => 'Kaamera'; + + @override + String get albumDownload => 'Laadi alla'; + + @override + String get albumScreenshots => 'Ekraanitõmmised'; + + @override + String get albumScreenRecordings => 'Ekraanisalvestused'; + + @override + String get albumVideoCaptures => 'Videosalvestused'; + + @override + String get albumPageTitle => 'Albumid'; + + @override + String get albumEmpty => 'Albumeid ei leidu'; + + @override + String get createAlbumButtonLabel => 'LOO'; + + @override + String get newFilterBanner => 'uus'; + + @override + String get countryPageTitle => 'Riigid'; + + @override + String get countryEmpty => 'Riike pole'; + + @override + String get statePageTitle => 'Osariigid'; + + @override + String get stateEmpty => 'Osariike pole'; + + @override + String get placePageTitle => 'Asukohad'; + + @override + String get placeEmpty => 'Asukohti pole'; + + @override + String get tagPageTitle => 'Sildid'; + + @override + String get tagEmpty => 'Silte pole'; + + @override + String get tagPickPageTitle => 'Vali silt'; + + @override + String get binPageTitle => 'Prügikast'; + + @override + String get explorerPageTitle => 'Sirvija'; + + @override + String get explorerActionSelectStorageVolume => 'Vali andmeruum'; + + @override + String get selectStorageVolumeDialogTitle => 'Vali andmeruum'; + + @override + String get searchCollectionFieldHint => 'Otsi kogumikku'; + + @override + String get searchRecentSectionTitle => 'Hiljutised'; + + @override + String get searchDateSectionTitle => 'Kuupäevad'; + + @override + String get searchFormatSectionTitle => 'Vormingud'; + + @override + String get searchAlbumsSectionTitle => 'Albumid'; + + @override + String get searchCountriesSectionTitle => 'Riigid'; + + @override + String get searchStatesSectionTitle => 'Osariigid'; + + @override + String get searchPlacesSectionTitle => 'Asukohad'; + + @override + String get searchTagsSectionTitle => 'Sildid'; + + @override + String get searchRatingSectionTitle => 'Hinnagud'; + + @override + String get searchMetadataSectionTitle => 'Metainfo'; + + @override + String get settingsPageTitle => 'Seadistused'; + + @override + String get settingsSystemDefault => 'Süsteemi vaikeseadistused'; + + @override + String get settingsDefault => 'Vaikimisi'; + + @override + String get settingsDisabled => 'Pole kasutusel'; + + @override + String get settingsEnabled => 'Kasutusel'; + + @override + String get settingsForced => 'Jõustatud'; + + @override + String get settingsAskEverytime => 'Küsi iga kord'; + + @override + String get settingsModificationWarningDialogMessage => 'Muud seadistused kuuluvad muutmisele.'; + + @override + String get settingsSearchFieldLabel => 'Otsi seadistustest'; + + @override + String get settingsSearchEmpty => 'Sellist seadistust ei leidu'; + + @override + String get settingsActionExport => 'Ekspordi'; + + @override + String get settingsActionExportDialogTitle => 'Eksport'; + + @override + String get settingsActionImport => 'Impordi'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Kaanepildid'; + + @override + String get appExportDynamicAlbums => 'Dünaamilised albumid'; + + @override + String get appExportFavourites => 'Lemmikud'; + + @override + String get appExportSettings => 'Seadistused'; + + @override + String get settingsNavigationSectionTitle => 'Põhivaated'; + + @override + String get settingsHomeTile => 'Avavaade'; + + @override + String get settingsHomeDialogTitle => 'Avavaade'; + + @override + String get setHomeCustom => 'Sinu valitud'; + + @override + String get settingsKeepScreenOnTile => 'Hoia ekraan sisselülitatuna'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Hoia ekraan sisselülitatuna'; + + @override + String get settingsDoubleBackExit => 'Väljumiseks klõpsi „Tagasi“ nuppu kaks korda'; + + @override + String get settingsConfirmationTile => 'Kinnitused'; + + @override + String get settingsConfirmationDialogTitle => 'Kinnitused'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Küsi kinnitust enne objektide lõplikku kustutamist'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Küsi kinnitust enne objektide viskamist prügikasti'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Küsi kinnitust enne kuupäevadeta objektide teisaldamist'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Näita teadet peale objektide viskamist prügikasti'; + + @override + String get settingsConfirmationVaultDataLoss => 'Näita turvaruumi andmekao hoiatust'; + + @override + String get settingsNavigationDrawerTile => 'Ikooniriba'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Ikooniriba'; + + @override + String get settingsNavigationDrawerBanner => 'Menüüobjektide teisaldamiseks ja järjekorra muutmiseks vajuta ja hoia all.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Tüübid'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albumid'; + + @override + String get settingsNavigationDrawerTabPages => 'Lehed'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Lisa album'; + + @override + String get settingsNavigationBottomActionsTile => 'Alumine ikooniriba'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Alumine ikooniriba'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Nuppude/ikoonide teisaldamiseks hoia neid all ja lohista uude kohta ning vali, mis tegevusi tahad ikooniribalt teha.'; + + @override + String get settingsThumbnailSectionTitle => 'Pisipildid'; + + @override + String get settingsThumbnailOverlayTile => 'Ülekate'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Ülekate'; + + @override + String get settingsThumbnailShowHdrIcon => 'Näita HDR-ikooni'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Näita lemmikute ikooni'; + + @override + String get settingsThumbnailShowTagIcon => 'Näita siltide ikooni'; + + @override + String get settingsThumbnailShowLocationIcon => 'Näita asukoha ikooni'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Näita liikuva foto ikooni'; + + @override + String get settingsThumbnailShowRating => 'Näita hinnangute ikooni'; + + @override + String get settingsThumbnailShowRawIcon => 'Näita Raw-vormingu ikooni'; + + @override + String get settingsThumbnailShowVideoDuration => 'Näita videote kestust'; + + @override + String get settingsCollectionQuickActionsTile => 'Kiirtoimingud'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Kiirtoimingud'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Sirvimine'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Valimine'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Kui soovid valida, mis tegevused on saadaval objektide sirvimisel, siis vajuta ning hoia soovitud ikooni ning lohista ta vajalikku vaatesse.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Kui soovid valida, mis tegevused on saadaval objektide valimisel, siis vajuta ning hoia soovitud ikooni ning lohista ta vajalikku vaatesse.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Laienda mustreid'; + + @override + String get settingsCollectionBurstPatternsNone => 'Määratlemata'; + + @override + String get settingsViewerSectionTitle => 'Pildivaataja'; + + @override + String get settingsViewerGestureSideTapNext => 'Eelmise ja järgmise meediafaili vaatamiseks puuduta ekraani ääri'; + + @override + String get settingsViewerUseCutout => 'Kasuta väljalõigatud ala'; + + @override + String get settingsViewerMaximumBrightness => 'Maksimaalne heledus'; + + @override + String get settingsMotionPhotoAutoPlay => 'Esita liikuivaid fotosid automaatselt'; + + @override + String get settingsImageBackground => 'Pildi taust'; + + @override + String get settingsViewerQuickActionsTile => 'Kiirtoimingud'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Kiirtoimingud'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Nuppude/ikoonide valimiseks ja kahe vaate vahel teisaldamiseks puuduta ja all hoides lohista uude kohta.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Kuvatavad nupud'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Saadaval olevad nupud'; + + @override + String get settingsViewerQuickActionEmpty => 'Sa pole ühtegi nuppu siia lisanud'; + + @override + String get settingsViewerOverlayTile => 'Ülekate'; + + @override + String get settingsViewerOverlayPageTitle => 'Ülekate'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Näita avamisel'; + + @override + String get settingsViewerShowHistogram => 'Näita histogrammi'; + + @override + String get settingsViewerShowMinimap => 'Näita minikaarti'; + + @override + String get settingsViewerShowZoomLevel => 'Näita kasutusel suumi'; + + @override + String get settingsViewerShowInformation => 'Näita teavet'; + + @override + String get settingsViewerShowInformationSubtitle => 'Näita nime, kuupäeva, asukohta jne.'; + + @override + String get settingsViewerShowRatingTags => 'Näita hinnangut ja silte'; + + @override + String get settingsViewerShowShootingDetails => 'Näita pildistamise üksikasju'; + + @override + String get settingsViewerShowDescription => 'Näita kirjeldust'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Näita pisipilte'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Hägustamisefekt'; + + @override + String get settingsViewerSlideshowTile => 'Slaidiesitlus'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slaidiesitlus'; + + @override + String get settingsSlideshowRepeat => 'Korda'; + + @override + String get settingsSlideshowShuffle => 'Sega järjestust'; + + @override + String get settingsSlideshowFillScreen => 'Täida kogu ekraan'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animeeritud suumiefekt'; + + @override + String get settingsSlideshowTransitionTile => 'Üleminekud meedia vahetamisel'; + + @override + String get settingsSlideshowIntervalTile => 'Välp meedia vahetamisel'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video taasesitus'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video taasesitus'; + + @override + String get settingsVideoPageTitle => 'Video seadistused'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Näita videoid'; + + @override + String get settingsVideoPlaybackTile => 'Taasesitus'; + + @override + String get settingsVideoPlaybackPageTitle => 'Taasesitus'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Raudvaraline kiirendus'; + + @override + String get settingsVideoAutoPlay => 'Automaatne taasesitus'; + + @override + String get settingsVideoLoopModeTile => 'Korda videoid'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Korda videoid'; + + @override + String get settingsVideoResumptionModeTile => 'Jätka taasesitust'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Jätka taasesitust'; + + @override + String get settingsVideoBackgroundMode => 'Esitus taustal'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Esitus taustal'; + + @override + String get settingsVideoControlsTile => 'Juhtnupud'; + + @override + String get settingsVideoControlsPageTitle => 'Juhtnupud'; + + @override + String get settingsVideoButtonsTile => 'Nupud'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Esita või peata esitus topeltpuudutusega'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Topeltpuudutus ekraani äärtel kerib edasi või tagasi'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Üles või alla viipamine muudab eredust ja helivaljust'; + + @override + String get settingsSubtitleThemeTile => 'Subtiitrid'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtiitrid'; + + @override + String get settingsSubtitleThemeSample => 'See on üks lihtne näide.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Teksti joondumine'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Teksti joondumine'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Teksti asukoht'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Teksti asukoht'; + + @override + String get settingsSubtitleThemeTextSize => 'Teksti suurus'; + + @override + String get settingsSubtitleThemeShowOutline => 'Näite äärejoont ja varju'; + + @override + String get settingsSubtitleThemeTextColor => 'Teksti värv'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Teksti läbipaistmatus'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Taustavärv'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Tausta läbipaistmatus'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Vasakul'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Keskel'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Paremal'; + + @override + String get settingsPrivacySectionTitle => 'Privaatsus'; + + @override + String get settingsAllowInstalledAppAccess => 'Luba ligipääs rakenduse andmekogule'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Seda kasutatakse albumite kuvamise parandamiseks'; + + @override + String get settingsAllowErrorReporting => 'Luba anonüümset veateavitust'; + + @override + String get settingsSaveSearchHistory => 'Salvesta otsingute ajalugu'; + + @override + String get settingsEnableBin => 'Kasuta prügikasti'; + + @override + String get settingsEnableBinSubtitle => 'Hoia kustutatud objekte 30 päeva'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Prügikastis olevad objektid kustutatakse jäädavalt.'; + + @override + String get settingsAllowMediaManagement => 'Kasuta meediahaldust'; + + @override + String get settingsHiddenItemsTile => 'Peidetud objektid'; + + @override + String get settingsHiddenItemsPageTitle => 'Peidetud objektid'; + + @override + String get settingsHiddenFiltersBanner => 'Peidetuse filtritele vastavad fotod ja videod ei saa olema nähtavad sinu meediakogus.'; + + @override + String get settingsHiddenFiltersEmpty => 'Peidetuse filtreid ei ole'; + + @override + String get settingsStorageAccessTile => 'Ligipääs andmeruumile'; + + @override + String get settingsStorageAccessPageTitle => 'Ligipääs andmeruumile'; + + @override + String get settingsStorageAccessBanner => 'Mõned kaustad vajavad eraldi lubamist seal asuvate failide muutmiseks. Siin näed kaustu, millele sa varem oled sellised õigused jaganud.'; + + @override + String get settingsStorageAccessEmpty => 'Ligipääsuõigusi pole määratud'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Eemalda õigused'; + + @override + String get settingsAccessibilitySectionTitle => 'Ligipääsetavus'; + + @override + String get settingsRemoveAnimationsTile => 'Eemalda animatsioonid'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Eemalda animatsioonid'; + + @override + String get settingsTimeToTakeActionTile => 'Viivitus enne toiminguid'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Näita alternatiive mitmikpuutele'; + + @override + String get settingsDisplaySectionTitle => 'Ekraan'; + + @override + String get settingsThemeBrightnessTile => 'Kujundus'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Kujundus'; + + @override + String get settingsThemeColorHighlights => 'Esiletõstetud värvid'; + + @override + String get settingsThemeEnableDynamicColor => 'Dünaamilised värvid'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Ekraani värskendussagedus'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Värskendussagedus'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV-liidestus'; + + @override + String get settingsLanguageSectionTitle => 'Keeled ja vormingud'; + + @override + String get settingsLanguageTile => 'Keel'; + + @override + String get settingsLanguagePageTitle => 'Keel'; + + @override + String get settingsCoordinateFormatTile => 'Koordinaatide vorming'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Koordinaatide vorming'; + + @override + String get settingsUnitSystemTile => 'Ühikud'; + + @override + String get settingsUnitSystemDialogTitle => 'Ühikud'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Jõusta araabia numbrite kasutus'; + + @override + String get settingsScreenSaverPageTitle => 'Ekraanisäästja'; + + @override + String get settingsWidgetPageTitle => 'Fotoraam'; + + @override + String get settingsWidgetShowOutline => 'Piirjoon'; + + @override + String get settingsWidgetOpenPage => 'Vidinal klõpsides'; + + @override + String get settingsWidgetDisplayedItem => 'Kuvatav objekt'; + + @override + String get settingsCollectionTile => 'Meediakogu'; + + @override + String get statsPageTitle => 'Statistika'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString asukohaga objekti', + one: '1 asukohaga objekt', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Populaarsemad riigid'; + + @override + String get statsTopStatesSectionTitle => 'Populaarsemad osariigid'; + + @override + String get statsTopPlacesSectionTitle => 'Populaarsemad kohad'; + + @override + String get statsTopTagsSectionTitle => 'Populaarsemad sildid'; + + @override + String get statsTopAlbumsSectionTitle => 'Populaarsemad albumid'; + + @override + String get viewerOpenPanoramaButtonLabel => 'AVA PANORAAM'; + + @override + String get viewerSetWallpaperButtonLabel => 'MÄÄRA TAUSTAPILDIKS'; + + @override + String get viewerErrorUnknown => 'Oih, vabandust!'; + + @override + String get viewerErrorDoesNotExist => 'Seda faili pole enam olemas.'; + + @override + String get viewerInfoPageTitle => 'Meedia teave'; + + @override + String get viewerInfoBackToViewerTooltip => 'Tagasi pildivaataja juurde'; + + @override + String get viewerInfoUnknown => 'teadmata'; + + @override + String get viewerInfoLabelDescription => 'Kirjeldus'; + + @override + String get viewerInfoLabelTitle => 'Pealkiri'; + + @override + String get viewerInfoLabelDate => 'Kuupäev'; + + @override + String get viewerInfoLabelResolution => 'Resolutsioon'; + + @override + String get viewerInfoLabelSize => 'Suurus'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Asukoht'; + + @override + String get viewerInfoLabelDuration => 'Kestus'; + + @override + String get viewerInfoLabelOwner => 'Omanik'; + + @override + String get viewerInfoLabelCoordinates => 'Koordinaadid'; + + @override + String get viewerInfoLabelAddress => 'Aadress'; + + @override + String get mapStyleDialogTitle => 'Kaardi stiil'; + + @override + String get mapStyleDialogAddStyle => 'Lisa stiil'; + + @override + String get mapStyleTooltip => 'Vali kaardi stiil'; + + @override + String get mapStyleEditorDialogName => 'Nimi'; + + @override + String get mapStyleEditorDialogUrl => 'Võrguaadress'; + + @override + String get mapStyleEditorDialogSubdomains => 'Alamdomeenid'; + + @override + String get mapStyleEditorDialogUserAgent => 'Rakenduse nimi võrgus'; + + @override + String get mapZoomInTooltip => 'Suumi sisse'; + + @override + String get mapZoomOutTooltip => 'Suumi välja'; + + @override + String get mapPointNorthUpTooltip => 'Põhjasuund ülal'; + + @override + String get mapAttributionOsmData => 'Kaardiandmed © [OpenStreetMap](https://www.openstreetmap.org/copyright) kaasautorid'; + + @override + String get mapAttributionOsmLiberty => 'Kaardipaanid: [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Kaardiserver: [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Kaardipaanid: [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Kaardipaanid: [HOT](https://www.hotosm.org/) • Kaardiserver: [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Kaardipaanid: [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Vaata kaardilehel'; + + @override + String get mapEmptyRegion => 'Sellest piirkonnast ei leidu pilte'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Lõimitud andmete lugemine ei õnnestunud'; + + @override + String get viewerInfoOpenLinkText => 'Ava'; + + @override + String get viewerInfoViewXmlLinkText => 'Vaata XMLi'; + + @override + String get viewerInfoSearchFieldLabel => 'Otsi metainfot'; + + @override + String get viewerInfoSearchEmpty => 'Vastavaid võtmeid ei leidu'; + + @override + String get viewerInfoSearchSuggestionDate => 'Kuupäev ja kellaaeg'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Kirjeldus'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Mõõdud'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolutsioon'; + + @override + String get viewerInfoSearchSuggestionRights => 'Õigused'; + + @override + String get wallpaperUseScrollEffect => 'Kasuta avalehel kerimisefekti'; + + @override + String get tagEditorPageTitle => 'Muuda silte'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Uus silt'; + + @override + String get tagEditorPageAddTagTooltip => 'Lisa silt'; + + @override + String get tagEditorSectionRecent => 'Hiljutised'; + + @override + String get tagEditorSectionPlaceholders => 'Asukohanäitajad'; + + @override + String get tagEditorDiscardDialogMessage => 'Kas sa soovid muudatustest loobuda?'; + + @override + String get tagPlaceholderCountry => 'Riik'; + + @override + String get tagPlaceholderState => 'Osariik'; + + @override + String get tagPlaceholderPlace => 'Asukoht'; + + @override + String get panoramaEnableSensorControl => 'Lülita anduripõhine kontroll sisse'; + + @override + String get panoramaDisableSensorControl => 'Lülita anduripõhine kontroll välja'; + + @override + String get sourceViewerPageTitle => 'Allikas'; +} diff --git a/lib/l10ngen/app_localizations_eu.dart b/lib/l10ngen/app_localizations_eu.dart new file mode 100644 index 0000000..383aba8 --- /dev/null +++ b/lib/l10ngen/app_localizations_eu.dart @@ -0,0 +1,2374 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Basque (`eu`). +class AppLocalizationsEu extends AppLocalizations { + AppLocalizationsEu([String locale = 'eu']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Ongi etorri'; + + @override + String get welcomeOptional => 'Aukerazkoa'; + + @override + String get welcomeTermsToggle => 'Termino eta baldintzekin ados nago'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementu', + one: 'elementu $count', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count zutabe', + one: 'zutabe $count', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString segundu', + one: 'segundu $countString', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutu', + one: 'minutu $countString', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString egun', + one: 'egun $countString', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APLIKATU'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'EZABATU'; + + @override + String get nextButtonLabel => 'HURRENGOA'; + + @override + String get showButtonLabel => 'ERAKUTSI'; + + @override + String get hideButtonLabel => 'EZKUTATU'; + + @override + String get continueButtonLabel => 'JARRAITU'; + + @override + String get saveCopyButtonLabel => 'GORDE KOPIA'; + + @override + String get applyTooltip => 'Aplikatu'; + + @override + String get cancelTooltip => 'Utzi'; + + @override + String get changeTooltip => 'Aldatu'; + + @override + String get clearTooltip => 'Garbitu'; + + @override + String get previousTooltip => 'Aurrekoa'; + + @override + String get nextTooltip => 'Hurrengoa'; + + @override + String get showTooltip => 'Erakutsi'; + + @override + String get hideTooltip => 'Ezkutatu'; + + @override + String get actionRemove => 'Ezabatu'; + + @override + String get resetTooltip => 'Berrezarri'; + + @override + String get saveTooltip => 'Gorde'; + + @override + String get stopTooltip => 'Gelditu'; + + @override + String get pickTooltip => 'Aukeratu'; + + @override + String get doubleBackExitMessage => 'Sakatu «itzuli» berriro irteteko.'; + + @override + String get doNotAskAgain => 'Ez galdetu berriro'; + + @override + String get sourceStateLoading => 'Kargatzen'; + + @override + String get sourceStateCataloguing => 'Katalogatzen'; + + @override + String get sourceStateLocatingCountries => 'Herrialdeak kokatzen'; + + @override + String get sourceStateLocatingPlaces => 'Lekuak kokatzen'; + + @override + String get chipActionDelete => 'Ezabatu'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Erakutsi bilduman'; + + @override + String get chipActionGoToAlbumPage => 'Erakutsi albumetan'; + + @override + String get chipActionGoToCountryPage => 'Erakutsi herrialdeetan'; + + @override + String get chipActionGoToPlacePage => 'Erakutsi lekuetan'; + + @override + String get chipActionGoToTagPage => 'Erakutsi etiketetan'; + + @override + String get chipActionGoToExplorerPage => 'Erakutsi arakatzailean'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Ez iragazi'; + + @override + String get chipActionFilterIn => 'Iragazi'; + + @override + String get chipActionHide => 'Ezkutatu'; + + @override + String get chipActionLock => 'Blokeatu'; + + @override + String get chipActionPin => 'Finkatu goran'; + + @override + String get chipActionUnpin => 'Desfinkatu goitik'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Aldatu izena'; + + @override + String get chipActionSetCover => 'Ezarri azala'; + + @override + String get chipActionShowCountryStates => 'Erakutsi egoerak'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Sortu albuma'; + + @override + String get chipActionCreateVault => 'Sortu kutxa gotorra'; + + @override + String get chipActionConfigureVault => 'Konfiguratu kutxa gotorra'; + + @override + String get entryActionCopyToClipboard => 'Kopiatu arbelera'; + + @override + String get entryActionDelete => 'Ezabatu'; + + @override + String get entryActionConvert => 'Bihurtu'; + + @override + String get entryActionExport => 'Esportatu'; + + @override + String get entryActionInfo => 'Informazioa'; + + @override + String get entryActionRename => 'Aldatu izena'; + + @override + String get entryActionRestore => 'Berrezarri'; + + @override + String get entryActionRotateCCW => 'Biratu erlojuaren orratzen kontrako noranzkoan'; + + @override + String get entryActionRotateCW => 'Biratu erlojuaren orratzen noranzkoan'; + + @override + String get entryActionFlip => 'Buelta eman horizontalki'; + + @override + String get entryActionPrint => 'Inprimatu'; + + @override + String get entryActionShare => 'Partekatu'; + + @override + String get entryActionShareImageOnly => 'Partekatu irudia soilik'; + + @override + String get entryActionShareVideoOnly => 'Partekatu bideoa soilik'; + + @override + String get entryActionViewSource => 'Ikusi iturria'; + + @override + String get entryActionShowGeoTiffOnMap => 'Erakutsi gainjarritako mapa bezala'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Bihurtu irudi finko batean'; + + @override + String get entryActionViewMotionPhotoVideo => 'Ireki bideoa'; + + @override + String get entryActionEdit => 'Editatu'; + + @override + String get entryActionOpen => 'Ireki honekin'; + + @override + String get entryActionSetAs => 'Ezarri hau bezala'; + + @override + String get entryActionCast => 'Igorri'; + + @override + String get entryActionOpenMap => 'Erakutsi mapako aplikazioan'; + + @override + String get entryActionRotateScreen => 'Biratu pantaila'; + + @override + String get entryActionAddFavourite => 'Gehitu gogokoetara'; + + @override + String get entryActionRemoveFavourite => 'Kendu gogokoetatik'; + + @override + String get videoActionCaptureFrame => 'Atzitu fotograma'; + + @override + String get videoActionMute => 'Mututu'; + + @override + String get videoActionUnmute => 'Ez mututu'; + + @override + String get videoActionPause => 'Eten'; + + @override + String get videoActionPlay => 'Erreproduzitu'; + + @override + String get videoActionReplay10 => 'Atzera 10 segundu egin'; + + @override + String get videoActionSkip10 => 'Aurrera 10 segundu egin'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Hautatu pistak'; + + @override + String get videoActionSetSpeed => 'Erreproduzitze-abiadura'; + + @override + String get videoActionABRepeat => 'Atik Brako errepikapena'; + + @override + String get videoRepeatActionSetStart => 'Ezarri hasiera'; + + @override + String get videoRepeatActionSetEnd => 'Ezarri amaiera'; + + @override + String get viewerActionSettings => 'Ezarpenak'; + + @override + String get viewerActionLock => 'Blokeatu bisorea'; + + @override + String get viewerActionUnlock => 'Deskblokeatu bisorea'; + + @override + String get slideshowActionResume => 'Jarraitu'; + + @override + String get slideshowActionShowInCollection => 'Erakutsi bilduman'; + + @override + String get entryInfoActionEditDate => 'Editatu data eta ordua'; + + @override + String get entryInfoActionEditLocation => 'Editatu kokapena'; + + @override + String get entryInfoActionEditTitleDescription => 'Editatu izenburua eta deskribapena'; + + @override + String get entryInfoActionEditRating => 'Editatu balorazioa'; + + @override + String get entryInfoActionEditTags => 'Editatu etiketak'; + + @override + String get entryInfoActionRemoveMetadata => 'Kendu metadatuak'; + + @override + String get entryInfoActionExportMetadata => 'Esportatu metadatuak'; + + @override + String get entryInfoActionRemoveLocation => 'Ezabatu kokapena'; + + @override + String get editorActionTransform => 'Eraldatu'; + + @override + String get editorTransformCrop => 'Moztu'; + + @override + String get editorTransformRotate => 'Biratu'; + + @override + String get cropAspectRatioFree => 'Librea'; + + @override + String get cropAspectRatioOriginal => 'Jatorrizkoa'; + + @override + String get cropAspectRatioSquare => 'Karratua'; + + @override + String get filterAspectRatioLandscapeLabel => 'Formatu horizontala'; + + @override + String get filterAspectRatioPortraitLabel => 'Formatu bertikala'; + + @override + String get filterBinLabel => 'Zakarrontzia'; + + @override + String get filterFavouriteLabel => 'Gogokoa'; + + @override + String get filterNoDateLabel => 'Datarik gabe'; + + @override + String get filterNoAddressLabel => 'Helbiderik ez'; + + @override + String get filterLocatedLabel => 'Kokatua'; + + @override + String get filterNoLocationLabel => 'Kokatu gabe'; + + @override + String get filterNoRatingLabel => 'Kalifikaziorik gabe'; + + @override + String get filterTaggedLabel => 'Etiketatua'; + + @override + String get filterNoTagLabel => 'Etiketatu gabe'; + + @override + String get filterNoTitleLabel => 'Izenbururik gabe'; + + @override + String get filterOnThisDayLabel => 'Egun honetan'; + + @override + String get filterRecentlyAddedLabel => 'Duela gutxi gehitua'; + + @override + String get filterRatingRejectedLabel => 'Baztertua'; + + @override + String get filterTypeAnimatedLabel => 'Animatua'; + + @override + String get filterTypeMotionPhotoLabel => 'Argazki-mugikorra'; + + @override + String get filterTypePanoramaLabel => 'Panoramika'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360°-ko bideoa'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Irudi'; + + @override + String get filterMimeVideoLabel => 'Bideo'; + + @override + String get accessibilityAnimationsRemove => 'Pantaila-efektuak ekidin'; + + @override + String get accessibilityAnimationsKeep => 'Pantaila-efektuak mantendu'; + + @override + String get albumTierNew => 'Berria'; + + @override + String get albumTierPinned => 'Finkatua'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Ohiko'; + + @override + String get albumTierApps => 'Aplikazioak'; + + @override + String get albumTierVaults => 'Kutxa gotorrak'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Besteak'; + + @override + String get coordinateFormatDms => 'DMS (Dokumentuak kudeatzeko sistema)'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Gradu hamartarrak'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'I'; + + @override + String get coordinateDmsSouth => 'H'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'M'; + + @override + String get displayRefreshRatePreferHighest => 'Kalifikazio gorena'; + + @override + String get displayRefreshRatePreferLowest => 'Kalifikazio baxuena'; + + @override + String get keepScreenOnNever => 'Inoiz'; + + @override + String get keepScreenOnVideoPlayback => 'Bideoa erreproduzitzean'; + + @override + String get keepScreenOnViewerOnly => 'Bisorea soilik'; + + @override + String get keepScreenOnAlways => 'Beti'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (higikorra)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (lurra)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'OSM humanitarioa'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (akuarela)'; + + @override + String get maxBrightnessNever => 'Inoiz'; + + @override + String get maxBrightnessAlways => 'Beti'; + + @override + String get nameConflictStrategyRename => 'Berrizendatu'; + + @override + String get nameConflictStrategyReplace => 'Ordezkatu'; + + @override + String get nameConflictStrategySkip => 'Jauzi'; + + @override + String get overlayHistogramNone => 'Bat ere ez'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminantzia'; + + @override + String get subtitlePositionTop => 'Goran'; + + @override + String get subtitlePositionBottom => 'Behean'; + + @override + String get themeBrightnessLight => 'Argi'; + + @override + String get themeBrightnessDark => 'Ilun'; + + @override + String get themeBrightnessBlack => 'Beltz'; + + @override + String get unitSystemMetric => 'Metriko'; + + @override + String get unitSystemImperial => 'Inperial'; + + @override + String get vaultLockTypePattern => 'Patroia'; + + @override + String get vaultLockTypePin => 'PIN kodea'; + + @override + String get vaultLockTypePassword => 'Pasahitza'; + + @override + String get settingsVideoEnablePip => 'Bideoa leihotxoan'; + + @override + String get videoControlsPlayOutside => 'Ireki beste erreproduzitzaile batekin'; + + @override + String get videoLoopModeNever => 'Inoiz'; + + @override + String get videoLoopModeShortOnly => 'Bideo laburrak soilik'; + + @override + String get videoLoopModeAlways => 'Beti'; + + @override + String get videoPlaybackSkip => 'Jauzi'; + + @override + String get videoPlaybackMuted => 'Mutututa erreproduzitu'; + + @override + String get videoPlaybackWithSound => 'Soinuarekin erreproduzitu'; + + @override + String get videoResumptionModeNever => 'Inoiz'; + + @override + String get videoResumptionModeAlways => 'Beti'; + + @override + String get viewerTransitionSlide => 'Diapositiba'; + + @override + String get viewerTransitionParallax => 'Paralaxi'; + + @override + String get viewerTransitionFade => 'Desagertu'; + + @override + String get viewerTransitionZoomIn => 'Hurbildu'; + + @override + String get viewerTransitionNone => 'Bat ere ez'; + + @override + String get wallpaperTargetHome => 'Hasierako pantaila'; + + @override + String get wallpaperTargetLock => 'Blokeo-pantaila'; + + @override + String get wallpaperTargetHomeLock => 'Hasiera- eta blokeo-pantaila'; + + @override + String get widgetDisplayedItemRandom => 'Ausazko'; + + @override + String get widgetDisplayedItemMostRecent => 'Berrienak'; + + @override + String get widgetOpenPageHome => 'Ireki hasierako pantaila'; + + @override + String get widgetOpenPageCollection => 'Ireki bilduma'; + + @override + String get widgetOpenPageViewer => 'Ireki bisorea'; + + @override + String get widgetTapUpdateWidget => 'Eguneratu widgeta'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Barne-biltegiratzea'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD txartela'; + + @override + String get rootDirectoryDescription => 'Erro-karpeta'; + + @override + String otherDirectoryDescription(String name) { + return '«$name» karpeta'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Mesedez, «$volume»-(e)n $directory aukera ezazu hurrengo pantailan aplikazio honi sarrera baimentzeko.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Aplikazio honek ez du baimenik «$volume»-(e)ko $directory-(e)n fitxategiak aldatzeko.\n\nMesedez, aurreinstalatutako fitxategi-kudeatzaile edo galeriaren aplikazio bat erabili itemak beste karpeta batera mugitzeko.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Eragiketa hau burutzeko $neededSize-eko leku librea behar da «$volume»-(e)n, baina, $freeSize-eko lekua dago soilik.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Sistemako fitxategien bilatzailea falta da edo desaktibatua dago. Mesedez, aktiba ezazu eta saia zaitez berriro.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Eragiketa hau ez da bateragarria aukeratutako hurrengo elementu-motentzako: $types.', + one: 'Eragiketa hau ez da bateragarria aukeratutako hurrengo elementu-motarentzako: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Helburuko karpetan dauden fitxategi batzuek izen bera dute.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Fitxategi batzuek izen bera dute.'; + + @override + String get addShortcutDialogLabel => 'Laster-bidearen etiketa'; + + @override + String get addShortcutButtonLabel => 'GEHITU'; + + @override + String get noMatchingAppDialogMessage => 'Hau maneiatu dezakeen aplikaziorik ez dago.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementu hauek zakarrontzira bidali nahi al dituzu?', + one: 'Elementu hau zakarrontzira bidali nahi al duzu?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementu hauek ezaba nahi al dituzu?', + one: 'Elementu hau ezaba nahi al duzu?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Elementuen datak gorde nahi al dituzu aurrera egin aurretik?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Gorde datak'; + + @override + String videoResumeDialogMessage(String time) { + return 'Erreprodukzioa $time denboran jarraitzea nahi al duzu?'; + } + + @override + String get videoStartOverButtonLabel => 'BERRIRO HASI'; + + @override + String get videoResumeButtonLabel => 'JARRAITU'; + + @override + String get setCoverDialogLatest => 'Azkeneko elementua'; + + @override + String get setCoverDialogAuto => 'Automatikoa'; + + @override + String get setCoverDialogCustom => 'Pertsonalizatua'; + + @override + String get hideFilterConfirmationDialogMessage => 'Bat-etortzen diren argazki eta bideoak zure bildumatik ezkutatuko dira. Berriro agerrarazi ditzakezu «Pribatutasuna» ezarpenetatik.\n\nZiur al zaude ezkuta nahi al dituzula?'; + + @override + String get newAlbumDialogTitle => 'Album berria'; + + @override + String get newAlbumDialogNameLabel => 'Albumaren izena'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Karpeta jada badago'; + + @override + String get newAlbumDialogStorageLabel => 'Biltegiratzea:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => + 'Kutxa gotorreko elementuak aplikazio honetarako soilik daude eskuragarri eta ez beste edozeinetarako.\n\nAplikazio hau desinstalatzen baduzu, edo aplikazio honen datuak garbitu, elementu guzti hauek galduko dituzu.'; + + @override + String get newVaultDialogTitle => 'Kutxa gotor berria'; + + @override + String get configureVaultDialogTitle => 'Konfiguratu kutxa gotorra'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Blokeatu pantaila itzaltzean'; + + @override + String get vaultDialogLockTypeLabel => 'Blokeatze modua'; + + @override + String get patternDialogEnter => 'Sartu patroia'; + + @override + String get patternDialogConfirm => 'Konfirmatu patroia'; + + @override + String get pinDialogEnter => 'Sartu PINa'; + + @override + String get pinDialogConfirm => 'Konfirmatu PINa'; + + @override + String get passwordDialogEnter => 'Sartu pasahitza'; + + @override + String get passwordDialogConfirm => 'Berretsi pasahitza'; + + @override + String get authenticateToConfigureVault => 'Autentifikatu kutxa gotorra konfiguratzeko'; + + @override + String get authenticateToUnlockVault => 'Autentifikatu kutxa gotorra desblokeatzeko'; + + @override + String get vaultBinUsageDialogMessage => 'Kutxa gotor batzuk zakarrontzia erabiltzen ari dira.'; + + @override + String get renameAlbumDialogLabel => 'Izen berria'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Direktorioa jada badago'; + + @override + String get renameEntrySetPageTitle => 'Aldatu izena'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Izendapen-eredua'; + + @override + String get renameEntrySetPageInsertTooltip => 'Txertatu eremua'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Aurrebista'; + + @override + String get renameProcessorCounter => 'Kontagailu'; + + @override + String get renameProcessorHash => 'Hash-a'; + + @override + String get renameProcessorName => 'Izena'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Album hau eta bertako $count elementuak ezaba nahi al dituzu?', + one: 'Album hau eta bertako elementua ezaba nahi al dituzu?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Album hauek eta hauetan dauden $count elementuak ezaba nahi al dituzu?', + one: 'Album hauek eta hauetan dagoen elementua ezaba nahi al dituzu?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Formatua:'; + + @override + String get exportEntryDialogWidth => 'Zabalera'; + + @override + String get exportEntryDialogHeight => 'Altuera'; + + @override + String get exportEntryDialogQuality => 'Kalitatea'; + + @override + String get exportEntryDialogWriteMetadata => 'Idatzi metadatuak'; + + @override + String get renameEntryDialogLabel => 'Izen berria'; + + @override + String get editEntryDialogCopyFromItem => 'Kopiatu beste elementu batetik'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Aldatzeko eremuak'; + + @override + String get editEntryDateDialogTitle => 'Data eta ordua'; + + @override + String get editEntryDateDialogSetCustom => 'Ezarri data pertsonalizatua'; + + @override + String get editEntryDateDialogCopyField => 'Kopiatu beste data batetik'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Atera izenburutik'; + + @override + String get editEntryDateDialogShift => 'Aldatu'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Fitxategia aldatu zeneko data'; + + @override + String get durationDialogHours => 'Orduak'; + + @override + String get durationDialogMinutes => 'Minutuak'; + + @override + String get durationDialogSeconds => 'Segunduak'; + + @override + String get editEntryLocationDialogTitle => 'Kokapena'; + + @override + String get editEntryLocationDialogSetCustom => 'Ezarri kokapen pertsonalizatua'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Aukeratu mapan'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitudea'; + + @override + String get editEntryLocationDialogLongitude => 'Longitudea'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Erabili kokapen hau'; + + @override + String get editEntryRatingDialogTitle => 'Balorazioa'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadatuen ezabapena'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'Gehiago'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'Mugimendu-argazkiko bideoa erreproduzitzeko XMP behar da.\n\nZiur al zaude ezabatu nahi duzula?'; + + @override + String get videoSpeedDialogLabel => 'Erreprodukzio-abiadura'; + + @override + String get videoStreamSelectionDialogVideo => 'Bideoa'; + + @override + String get videoStreamSelectionDialogAudio => 'Audioa'; + + @override + String get videoStreamSelectionDialogText => 'Azpitituluak'; + + @override + String get videoStreamSelectionDialogOff => 'Desgaitua'; + + @override + String get videoStreamSelectionDialogTrack => 'Pista'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Ez dago pista gehiagorik.'; + + @override + String get genericSuccessFeedback => 'Egina!'; + + @override + String get genericFailureFeedback => 'Huts egin du'; + + @override + String get genericDangerWarningDialogMessage => 'Ziur al zaude?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Elementu gutxiagorekin saia zaitez berriro.'; + + @override + String get menuActionConfigureView => 'Ikusi'; + + @override + String get menuActionSelect => 'Hautatu'; + + @override + String get menuActionSelectAll => 'Guztiak hautatu'; + + @override + String get menuActionSelectNone => 'Bat ere ez hautatu'; + + @override + String get menuActionMap => 'Mapa'; + + @override + String get menuActionSlideshow => 'Aurkezpena'; + + @override + String get menuActionStats => 'Estatistikak'; + + @override + String get viewDialogSortSectionTitle => 'Ordenatu'; + + @override + String get viewDialogGroupSectionTitle => 'Taldea'; + + @override + String get viewDialogLayoutSectionTitle => 'Diseinua'; + + @override + String get viewDialogReverseSortOrder => 'Sailkapen-ordena alderantzikatu'; + + @override + String get tileLayoutMosaic => 'Mosaikoa'; + + @override + String get tileLayoutGrid => 'Sareta'; + + @override + String get tileLayoutList => 'Zerrenda'; + + @override + String get castDialogTitle => 'Igortzeko gailuak'; + + @override + String get coverDialogTabCover => 'Azala'; + + @override + String get coverDialogTabApp => 'Aplikazioa'; + + @override + String get coverDialogTabColor => 'Kolorea'; + + @override + String get appPickDialogTitle => 'Aplikazioa aukeratu'; + + @override + String get appPickDialogNone => 'Bat ere ez'; + + @override + String get aboutPageTitle => 'Honi buruz'; + + @override + String get aboutLinkLicense => 'Lizentzia'; + + @override + String get aboutLinkPolicy => 'Pribatutasun-politika'; + + @override + String get aboutBugSectionTitle => 'Akatsen berri eman'; + + @override + String get aboutBugSaveLogInstruction => 'Aplikazioaren erregistroak fitxategi batean gorde'; + + @override + String get aboutBugCopyInfoInstruction => 'Sistemako informazioa kopiatu'; + + @override + String get aboutBugCopyInfoButton => 'Kopiatu'; + + @override + String get aboutBugReportInstruction => 'GitHubera txostena erregistro eta sistemako informazioarekin bidali'; + + @override + String get aboutBugReportButton => 'Txostena bidali'; + + @override + String get aboutDataUsageSectionTitle => 'Datuen erabilera'; + + @override + String get aboutDataUsageData => 'Datuak'; + + @override + String get aboutDataUsageCache => 'Cachea'; + + @override + String get aboutDataUsageDatabase => 'Datu-basea'; + + @override + String get aboutDataUsageMisc => 'Askotariko'; + + @override + String get aboutDataUsageInternal => 'Barnekoa'; + + @override + String get aboutDataUsageExternal => 'Kanpokoa'; + + @override + String get aboutDataUsageClearCache => 'Garbitu cachea'; + + @override + String get aboutCreditsSectionTitle => 'Kredituak'; + + @override + String get aboutCreditsWorldAtlas1 => 'Aplikazio honek TopoJSON fitxategi bat erabiltzen du'; + + @override + String get aboutCreditsWorldAtlas2 => 'ISC lizentziapekoa.'; + + @override + String get aboutTranslatorsSectionTitle => 'Itzultzaileak'; + + @override + String get aboutLicensesSectionTitle => 'Kode-irekiko lizentziak'; + + @override + String get aboutLicensesBanner => 'Aplikazio honek hurrengo kode-irekiko pakete eta liburutegiak erabiltzen ditu.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Androideko liburutegiak'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutterreko pluginak'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutterreko paketeak'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Darteko paketeak'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Lizentzia guztiak erakutsi'; + + @override + String get policyPageTitle => 'Pribatutasun-politika'; + + @override + String get collectionPageTitle => 'Bilduma'; + + @override + String get collectionPickPageTitle => 'Aukeratu'; + + @override + String get collectionSelectPageTitle => 'Elementuak hautatu'; + + @override + String get collectionActionShowTitleSearch => 'Izenburuen iragazkiak erakutsi'; + + @override + String get collectionActionHideTitleSearch => 'Izenburuen iragazkiak ezkutatu'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Lasterbidea gehitu'; + + @override + String get collectionActionSetHome => 'Ezarri hasiera gisa'; + + @override + String get collectionActionEmptyBin => 'Zakarrontzia hustu'; + + @override + String get collectionActionCopy => 'Kopiatu albumera'; + + @override + String get collectionActionMove => 'Albumera mugitu'; + + @override + String get collectionActionRescan => 'Berreskaneatu'; + + @override + String get collectionActionEdit => 'Editatu'; + + @override + String get collectionSearchTitlesHintText => 'Izenburuak bilatu'; + + @override + String get collectionGroupAlbum => 'Albumaren arabera'; + + @override + String get collectionGroupMonth => 'Hilabetearen arabera'; + + @override + String get collectionGroupDay => 'Egunaren arabera'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Ezezaguna'; + + @override + String get dateToday => 'Gaur'; + + @override + String get dateYesterday => 'Atzo'; + + @override + String get dateThisMonth => 'Hilabete honetan'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Akatsa $count elementu ezabatzean', + one: 'Akatsa elementu 1 ezabatzean', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Akatsa $count elementu kopiatzean', + one: 'Akatsa elementu 1 kopiatzean', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Akatsa $count elementu mugitzean', + one: 'Akatsa elementu 1 mugitzean', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Akatsa $count elementu berrizendatzean', + one: 'Akatsa elementu 1 berrizendatzean', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Akatsa $count elementu editatzean', + one: 'Akatsa elementu 1 editatzean', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Akatsa $count orri esportatzean', + one: 'Akatsa orri 1 esportatzean', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementu kopiatuta', + one: 'Elementu 1 kopiatuta', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementu mugituta', + one: 'Elementu 1 mugituta', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementu berrizendatuta', + one: 'Elementu 1 berrizendatuta', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementu editatuta', + one: 'Elementu 1 editatuta', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Gogokorik ez'; + + @override + String get collectionEmptyVideos => 'Bideorik ez'; + + @override + String get collectionEmptyImages => 'Irudirik ez'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Sarrera baimendu'; + + @override + String get collectionSelectSectionTooltip => 'Atala aukeratu'; + + @override + String get collectionDeselectSectionTooltip => 'Atala baztertu'; + + @override + String get drawerAboutButton => 'Honi buruz'; + + @override + String get drawerSettingsButton => 'Ezarpenak'; + + @override + String get drawerCollectionAll => 'Bilduma osoa'; + + @override + String get drawerCollectionFavourites => 'Gogokoak'; + + @override + String get drawerCollectionImages => 'Irudiak'; + + @override + String get drawerCollectionVideos => 'Bideoak'; + + @override + String get drawerCollectionAnimated => 'Animazioak'; + + @override + String get drawerCollectionMotionPhotos => 'Mugimendu-argazkiak'; + + @override + String get drawerCollectionPanoramas => 'Panoramikak'; + + @override + String get drawerCollectionRaws => 'Raw argazkiak'; + + @override + String get drawerCollectionSphericalVideos => '360°-ko bideoak'; + + @override + String get drawerAlbumPage => 'Albumak'; + + @override + String get drawerCountryPage => 'Herrialdeak'; + + @override + String get drawerPlacePage => 'Lekuak'; + + @override + String get drawerTagPage => 'Etiketak'; + + @override + String get sortByDate => 'Dataren arabera'; + + @override + String get sortByName => 'Izenaren arabera'; + + @override + String get sortByItemCount => 'Elementuen kopuruaren arabera'; + + @override + String get sortBySize => 'Tamainaren arabera'; + + @override + String get sortByAlbumFileName => 'Album eta fitxategien izenaren arabera'; + + @override + String get sortByRating => 'Balorazioaren arabera'; + + @override + String get sortByDuration => 'Iraupenaren arabera'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Berriena lehenengo'; + + @override + String get sortOrderOldestFirst => 'Zaharrena lehenengo'; + + @override + String get sortOrderAtoZ => 'Atik Zra'; + + @override + String get sortOrderZtoA => 'Ztik Ara'; + + @override + String get sortOrderHighestFirst => 'Altuena lehenengo'; + + @override + String get sortOrderLowestFirst => 'Baxuena lehenengo'; + + @override + String get sortOrderLargestFirst => 'Handiena lehenengo'; + + @override + String get sortOrderSmallestFirst => 'Txikiena lehenengo'; + + @override + String get sortOrderShortestFirst => 'Laburrena lehenik'; + + @override + String get sortOrderLongestFirst => 'Luzeena lehenik'; + + @override + String get albumGroupTier => 'Mailaren arabera'; + + @override + String get albumGroupType => 'Motaren arabera'; + + @override + String get albumGroupVolume => 'Biltegiratze-tamainaren arabera'; + + @override + String get albumMimeTypeMixed => 'Nahastua'; + + @override + String get albumPickPageTitleCopy => 'Kopiatu albumera'; + + @override + String get albumPickPageTitleExport => 'Albumera esportatu'; + + @override + String get albumPickPageTitleMove => 'Albumera mugitu'; + + @override + String get albumPickPageTitlePick => 'Albuma aukeratu'; + + @override + String get albumCamera => 'Kamera'; + + @override + String get albumDownload => 'Deskargatu'; + + @override + String get albumScreenshots => 'Pantaila-argazkiak'; + + @override + String get albumScreenRecordings => 'Pantaila-grabaketak'; + + @override + String get albumVideoCaptures => 'Bideotako argazkiak'; + + @override + String get albumPageTitle => 'Albumak'; + + @override + String get albumEmpty => 'Albumik ez'; + + @override + String get createAlbumButtonLabel => 'SORTU'; + + @override + String get newFilterBanner => 'berria'; + + @override + String get countryPageTitle => 'Herrialdeak'; + + @override + String get countryEmpty => 'Herrialderik ez'; + + @override + String get statePageTitle => 'Egoerak'; + + @override + String get stateEmpty => 'Egoerarik ez'; + + @override + String get placePageTitle => 'Lekuak'; + + @override + String get placeEmpty => 'Lekurik ez'; + + @override + String get tagPageTitle => 'Etiketak'; + + @override + String get tagEmpty => 'Etiketarik ez'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Zakarrontzia'; + + @override + String get explorerPageTitle => 'Arakatzailea'; + + @override + String get explorerActionSelectStorageVolume => 'Hautatu biltegia'; + + @override + String get selectStorageVolumeDialogTitle => 'Hautatu biltegia'; + + @override + String get searchCollectionFieldHint => 'Bilduman bilatu'; + + @override + String get searchRecentSectionTitle => 'Berria'; + + @override + String get searchDateSectionTitle => 'Data'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albumak'; + + @override + String get searchCountriesSectionTitle => 'Herrialdeak'; + + @override + String get searchStatesSectionTitle => 'Egoerak'; + + @override + String get searchPlacesSectionTitle => 'Lekuak'; + + @override + String get searchTagsSectionTitle => 'Etiketak'; + + @override + String get searchRatingSectionTitle => 'Balorazioak'; + + @override + String get searchMetadataSectionTitle => 'Metadatuak'; + + @override + String get settingsPageTitle => 'Ezarpenak'; + + @override + String get settingsSystemDefault => 'Sistemakoa'; + + @override + String get settingsDefault => 'Lehenetsia'; + + @override + String get settingsDisabled => 'Desgaitua'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Galdetu aldi oro'; + + @override + String get settingsModificationWarningDialogMessage => 'Beste ezarpenak aldatuko dira.'; + + @override + String get settingsSearchFieldLabel => 'Bilaketaren ezarpenak'; + + @override + String get settingsSearchEmpty => 'Kointzidentziarik gabe'; + + @override + String get settingsActionExport => 'Esportatu'; + + @override + String get settingsActionExportDialogTitle => 'Esportazio'; + + @override + String get settingsActionImport => 'Inportatu'; + + @override + String get settingsActionImportDialogTitle => 'Inportazio'; + + @override + String get appExportCovers => 'Azalak'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Gogokoak'; + + @override + String get appExportSettings => 'Ezarpenak'; + + @override + String get settingsNavigationSectionTitle => 'Nabigazio'; + + @override + String get settingsHomeTile => 'Hasiera'; + + @override + String get settingsHomeDialogTitle => 'Hasiera'; + + @override + String get setHomeCustom => 'Pertsonalizatua'; + + @override + String get settingsKeepScreenOnTile => 'Mantendu pantaila piztuta'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Mantendu pantaila piztuta'; + + @override + String get settingsDoubleBackExit => 'Sakatu «atzera» bi aldiz irteteko'; + + @override + String get settingsConfirmationTile => 'Baieztapen-leihoak'; + + @override + String get settingsConfirmationDialogTitle => 'Baieztapen-leihoak'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Galdetu elementuak betirako ezabatu aurretik'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Galdetu elementuak zakarrontzira bidali aurretik'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Galdetu data ez duten elementuak mugitu aurretik'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Mezua erakutsi elementuak zakarrontzira bidali ondoren'; + + @override + String get settingsConfirmationVaultDataLoss => 'Erakutsi kutxa gotorreko datuen galeraren inguruko abisua'; + + @override + String get settingsNavigationDrawerTile => 'Nabigazio-menua'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Nabigazio-menua'; + + @override + String get settingsNavigationDrawerBanner => 'Sakatu eta mantendu menuko elementuak mugitu edo berrordenatzeko.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Motak'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albumak'; + + @override + String get settingsNavigationDrawerTabPages => 'Orriak'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Albuma gehitu'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniaturak'; + + @override + String get settingsThumbnailOverlayTile => 'Inkrustazioak'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Inkrustazioak'; + + @override + String get settingsThumbnailShowHdrIcon => 'Erakutsi HDR ikonoa'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Erakutsi gogokoen ikonoa'; + + @override + String get settingsThumbnailShowTagIcon => 'Erakutsi etiketaren ikonoa'; + + @override + String get settingsThumbnailShowLocationIcon => 'Erakutsi kokalekuaren ikonoa'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Erakutsi mugimendu-argazkiaren ikonoa'; + + @override + String get settingsThumbnailShowRating => 'Erakutsi balorazioa'; + + @override + String get settingsThumbnailShowRawIcon => 'Erakutsi raw ikonoa'; + + @override + String get settingsThumbnailShowVideoDuration => 'Erakutsi bideoaren iraupena'; + + @override + String get settingsCollectionQuickActionsTile => 'Ekintza azkarrak'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Ekintza azkarrak'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Araketa'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Hautapena'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Sakatu eta luze mantendu botoiak mugitzeko eta elementuak arakatzean zein ekintza bistaratuko diren aukeratzeko.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Sakatu eta luze mantendu botoiak mugitzeko eta elementuak aukeratzerakoan zein ekintza bistaratuko diren aukeratzeko.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Segida ereduak'; + + @override + String get settingsCollectionBurstPatternsNone => 'Bat ere ez'; + + @override + String get settingsViewerSectionTitle => 'Bisorea'; + + @override + String get settingsViewerGestureSideTapNext => 'Pantailaren ertzetan sakatu aurreko/hurrengo elementua bistaratzeko'; + + @override + String get settingsViewerUseCutout => 'Erabili moztutako eremua'; + + @override + String get settingsViewerMaximumBrightness => 'Gehienezko distira'; + + @override + String get settingsMotionPhotoAutoPlay => 'Automatikoki erreproduzitu mugimendu-argazkiak'; + + @override + String get settingsImageBackground => 'Atzeko irudia'; + + @override + String get settingsViewerQuickActionsTile => 'Ekintza azkarrak'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Ekintza azkarrak'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Sakatu eta luze mantendu botoiak mugitzeko eta bisorean zein ekintza bistaratuko diren aukeratzeko.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Bistaratutako botoiak'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Botoi erabilgarriak'; + + @override + String get settingsViewerQuickActionEmpty => 'Botoirik ez'; + + @override + String get settingsViewerOverlayTile => 'Inkrustazioak'; + + @override + String get settingsViewerOverlayPageTitle => 'Inkrustazioak'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Erakutsi irekitzean'; + + @override + String get settingsViewerShowHistogram => 'Erakutsi histograma'; + + @override + String get settingsViewerShowMinimap => 'Erakutsi minimapa'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Erakutsi informazioa'; + + @override + String get settingsViewerShowInformationSubtitle => 'Erakutsi izenburua, data, kokalekua, etab.'; + + @override + String get settingsViewerShowRatingTags => 'Erakutsi balorazioa eta etiketak'; + + @override + String get settingsViewerShowShootingDetails => 'Erakutsi hartualdiaren xehetasunak'; + + @override + String get settingsViewerShowDescription => 'Erakutsi azalpena'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Erakutsi miniaturak'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Lausotze efektua'; + + @override + String get settingsViewerSlideshowTile => 'Aurkezpena'; + + @override + String get settingsViewerSlideshowPageTitle => 'Aurkezpena'; + + @override + String get settingsSlideshowRepeat => 'Errepikatu'; + + @override + String get settingsSlideshowShuffle => 'Nahastu'; + + @override + String get settingsSlideshowFillScreen => 'Bete pantaila'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Zoom animatuaren efektua'; + + @override + String get settingsSlideshowTransitionTile => 'Trantsizioa'; + + @override + String get settingsSlideshowIntervalTile => 'Tartea'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Bideo-erreprodukzioa'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Bideo-erreprodukzioa'; + + @override + String get settingsVideoPageTitle => 'Bideoaren ezarpenak'; + + @override + String get settingsVideoSectionTitle => 'Bideoa'; + + @override + String get settingsVideoShowVideos => 'Erakutsi bideoak'; + + @override + String get settingsVideoPlaybackTile => 'Erreprodukzioa'; + + @override + String get settingsVideoPlaybackPageTitle => 'Erreprodukzioa'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardwarearen azelerazioa'; + + @override + String get settingsVideoAutoPlay => 'Autoerreprodukzioa'; + + @override + String get settingsVideoLoopModeTile => 'Begizta modua'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Begizta modua'; + + @override + String get settingsVideoResumptionModeTile => 'Jarraitu erreprodukzioa'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Jarraitu erreprodukzioa'; + + @override + String get settingsVideoBackgroundMode => 'Atzeko planoko modua'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Atzeko planoko modua'; + + @override + String get settingsVideoControlsTile => 'Aginteak'; + + @override + String get settingsVideoControlsPageTitle => 'Aginteak'; + + @override + String get settingsVideoButtonsTile => 'Botoiak'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Bi aldiz sakatu erreproduzitzeko/gelditzeko'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Pantailaren ertzetan bi aldiz sakatu aurrera/atzera egiteko'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Gora edo behera irristatu distira/bolumena egokitzeko'; + + @override + String get settingsSubtitleThemeTile => 'Azpitituluak'; + + @override + String get settingsSubtitleThemePageTitle => 'Azpitituluak'; + + @override + String get settingsSubtitleThemeSample => 'Hau adibide bat da.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Testuaren lerrokatzea'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Testuaren lerrokatzea'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Testuaren posizioa'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Testuaren posizioa'; + + @override + String get settingsSubtitleThemeTextSize => 'Testuaren tamaina'; + + @override + String get settingsSubtitleThemeShowOutline => 'Bistaratu ingerada eta itzala'; + + @override + String get settingsSubtitleThemeTextColor => 'Testuaren kolorea'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Testuaren opakutasuna'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Atzeko kolorea'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Atzeko opakutasuna'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Ezkerra'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Erdigune'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Eskuina'; + + @override + String get settingsPrivacySectionTitle => 'Pribatutasuna'; + + @override + String get settingsAllowInstalledAppAccess => 'Aplikazioen zerrendarako sarrera baimendu'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Albumen bistaratzea hobetzeko erabilia'; + + @override + String get settingsAllowErrorReporting => 'Onartu akatsen txosten anonimoa'; + + @override + String get settingsSaveSearchHistory => 'Gorde bilaketen historia'; + + @override + String get settingsEnableBin => 'Erabili zakarrontzia'; + + @override + String get settingsEnableBinSubtitle => 'Mantendu ezabatutako elementuak 30 egunez'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Zakarrontziko elementuak betirako ezabatuko dira.'; + + @override + String get settingsAllowMediaManagement => 'Baimendu mediaren kudeaketa'; + + @override + String get settingsHiddenItemsTile => 'Ezkutuko elementuak'; + + @override + String get settingsHiddenItemsPageTitle => 'Ezkutuko elementuak'; + + @override + String get settingsHiddenFiltersBanner => 'Iragazkiekin bat datozen argazki eta bideoak ez dira zure bilduman agertuko.'; + + @override + String get settingsHiddenFiltersEmpty => 'Ezkutuko iragazkirik ez'; + + @override + String get settingsStorageAccessTile => 'Biltegiratzerako sarrera'; + + @override + String get settingsStorageAccessPageTitle => 'Biltegiratzerako sarrera'; + + @override + String get settingsStorageAccessBanner => 'Karpeta batzuek baimen berezi bat behar dute bertak fitxategiak edita ahal izateko. Hemen, lehendik baimena eman diezun karpetak ikus ditzakezu.'; + + @override + String get settingsStorageAccessEmpty => 'Baimenik ez'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Ezeztatu'; + + @override + String get settingsAccessibilitySectionTitle => 'Irisgarritasuna'; + + @override + String get settingsRemoveAnimationsTile => 'Kendu animazioak'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Kendu animazioak'; + + @override + String get settingsTimeToTakeActionTile => 'Ekintza aurretik igarotako denbora'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Ukimen ugariko keinu alternatiboak erakutsi'; + + @override + String get settingsDisplaySectionTitle => 'Pantaila'; + + @override + String get settingsThemeBrightnessTile => 'Gaia'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Gaia'; + + @override + String get settingsThemeColorHighlights => 'Nabarmen koloreak'; + + @override + String get settingsThemeEnableDynamicColor => 'Kolore dinamikoa'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Pantailaren freskatze-maiztasuna'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Freskatze-maiztasuna'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interfazea'; + + @override + String get settingsLanguageSectionTitle => 'Hizkuntza eta formatuak'; + + @override + String get settingsLanguageTile => 'Hizkuntza'; + + @override + String get settingsLanguagePageTitle => 'Hizkuntza'; + + @override + String get settingsCoordinateFormatTile => 'Koordenatuen formatua'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Koordenatuen formatua'; + + @override + String get settingsUnitSystemTile => 'Unitateak'; + + @override + String get settingsUnitSystemDialogTitle => 'Unitateak'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Behartu arabiar zifrak'; + + @override + String get settingsScreenSaverPageTitle => 'Pantaila-babeslea'; + + @override + String get settingsWidgetPageTitle => 'Argazki-markoa'; + + @override + String get settingsWidgetShowOutline => 'Ingerada'; + + @override + String get settingsWidgetOpenPage => 'Widgetan sakatzean'; + + @override + String get settingsWidgetDisplayedItem => 'Bistaratutako elementua'; + + @override + String get settingsCollectionTile => 'Bilduma'; + + @override + String get statsPageTitle => 'Estatistikak'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementu kokapenarekin', + one: 'Elementu 1 kokapenarekin', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Herrialde nagusiak'; + + @override + String get statsTopStatesSectionTitle => 'Egoera Nagusiak'; + + @override + String get statsTopPlacesSectionTitle => 'Leku nagusiak'; + + @override + String get statsTopTagsSectionTitle => 'Etiketa nagusiak'; + + @override + String get statsTopAlbumsSectionTitle => 'Album nagusiak'; + + @override + String get viewerOpenPanoramaButtonLabel => 'IREKI PANORAMIKA'; + + @override + String get viewerSetWallpaperButtonLabel => 'EZARRI HORMA-PAPERA'; + + @override + String get viewerErrorUnknown => 'Ui!'; + + @override + String get viewerErrorDoesNotExist => 'Fitxategia jada ez da existitzen.'; + + @override + String get viewerInfoPageTitle => 'Informazioa'; + + @override + String get viewerInfoBackToViewerTooltip => 'Itzuli bisorera'; + + @override + String get viewerInfoUnknown => 'ezezaguna'; + + @override + String get viewerInfoLabelDescription => 'Deskribapena'; + + @override + String get viewerInfoLabelTitle => 'Izenburua'; + + @override + String get viewerInfoLabelDate => 'Data'; + + @override + String get viewerInfoLabelResolution => 'Bereizmena'; + + @override + String get viewerInfoLabelSize => 'Tamaina'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Bidea'; + + @override + String get viewerInfoLabelDuration => 'Iraupena'; + + @override + String get viewerInfoLabelOwner => 'Jabea'; + + @override + String get viewerInfoLabelCoordinates => 'Koordenatuak'; + + @override + String get viewerInfoLabelAddress => 'Helbidea'; + + @override + String get mapStyleDialogTitle => 'Maparen estiloa'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Hautatu maparen estiloa'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Hurreratu'; + + @override + String get mapZoomOutTooltip => 'Aldendu'; + + @override + String get mapPointNorthUpTooltip => 'Zuzendu iparra gorantz'; + + @override + String get mapAttributionOsmData => 'Maparen datuak © [OpenStreetMap](https://www.openstreetmap.org/copyright)-en laguntzaileak'; + + @override + String get mapAttributionOsmLiberty => 'Lauzak: [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Ostalaria: [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Lauzak: [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Lauzak: [HOT](https://www.hotosm.org/) • Ostalaria: [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Lauzak: [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Ikusi maparen gunean'; + + @override + String get mapEmptyRegion => 'Irudirik ez eskualde honetan'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Huts egitea erantsitako data ateratzean'; + + @override + String get viewerInfoOpenLinkText => 'Ireki'; + + @override + String get viewerInfoViewXmlLinkText => 'Ikusi XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Bilatu metadatuak'; + + @override + String get viewerInfoSearchEmpty => 'Bat datozen gakorik ez'; + + @override + String get viewerInfoSearchSuggestionDate => 'Data eta ordua'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Deskribapena'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimentsioak'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Bereizmena'; + + @override + String get viewerInfoSearchSuggestionRights => 'Eskubideak'; + + @override + String get wallpaperUseScrollEffect => 'Erabili lekualdatze-efektua hasierako pantailan'; + + @override + String get tagEditorPageTitle => 'Editatu etiketak'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Etiketa berria'; + + @override + String get tagEditorPageAddTagTooltip => 'Gehitu etiketa'; + + @override + String get tagEditorSectionRecent => 'Berrienak'; + + @override + String get tagEditorSectionPlaceholders => 'Leku-markak'; + + @override + String get tagEditorDiscardDialogMessage => 'Aldaketak baztertu nahi dituzu?'; + + @override + String get tagPlaceholderCountry => 'Herrialdea'; + + @override + String get tagPlaceholderState => 'Egoera'; + + @override + String get tagPlaceholderPlace => 'Lekua'; + + @override + String get panoramaEnableSensorControl => 'Gaitu sentsoreen agintea'; + + @override + String get panoramaDisableSensorControl => 'Desgaitu sentsoreen agintea'; + + @override + String get sourceViewerPageTitle => 'Iturria'; +} diff --git a/lib/l10ngen/app_localizations_fa.dart b/lib/l10ngen/app_localizations_fa.dart new file mode 100644 index 0000000..d81e418 --- /dev/null +++ b/lib/l10ngen/app_localizations_fa.dart @@ -0,0 +1,2370 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Persian (`fa`). +class AppLocalizationsFa extends AppLocalizations { + AppLocalizationsFa([String locale = 'fa']) : super(locale); + + @override + String get appName => 'اِیوز'; + + @override + String get welcomeMessage => 'به اِیوْز خوش آمدید'; + + @override + String get welcomeOptional => 'اختیاری'; + + @override + String get welcomeTermsToggle => 'من با شرایط و مقررات استفاده از خدمات موافق هستم'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count فایل', + one: '$count فایل', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count ستون', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ثانیه', + one: '$countString ثانیع', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString دقیقه', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString روز', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length میلی‌متر'; + } + + @override + String get applyButtonLabel => 'اعمال'; + + @override + String get createButtonLabel => 'ایجاد'; + + @override + String get deleteButtonLabel => 'پاک کردن'; + + @override + String get nextButtonLabel => 'بعدی'; + + @override + String get showButtonLabel => 'نمایش'; + + @override + String get hideButtonLabel => 'پنهان'; + + @override + String get continueButtonLabel => 'ادامه'; + + @override + String get saveCopyButtonLabel => 'ذخیرهٔ رونوشت'; + + @override + String get applyTooltip => 'اعمال'; + + @override + String get cancelTooltip => 'لغو'; + + @override + String get changeTooltip => 'تغییر'; + + @override + String get clearTooltip => 'پاک‌کردن'; + + @override + String get previousTooltip => 'قبلی'; + + @override + String get nextTooltip => 'بعدی'; + + @override + String get showTooltip => 'نمایش'; + + @override + String get hideTooltip => 'پنهان'; + + @override + String get actionRemove => 'برداشتن'; + + @override + String get resetTooltip => 'بازنشانی'; + + @override + String get saveTooltip => 'ذخیره'; + + @override + String get stopTooltip => 'ایست'; + + @override + String get pickTooltip => 'انتخاب'; + + @override + String get doubleBackExitMessage => 'دوباره «عقب» را فشار دهید تا خارج شوید.'; + + @override + String get doNotAskAgain => 'دوباره نپرس'; + + @override + String get sourceStateLoading => 'در حال بارگیری'; + + @override + String get sourceStateCataloguing => 'در حال فهرست سازی'; + + @override + String get sourceStateLocatingCountries => 'در حال مکان یابی کشور ها'; + + @override + String get sourceStateLocatingPlaces => 'در حال مکان یابی'; + + @override + String get chipActionDelete => 'پاک‌کردن'; + + @override + String get chipActionRemove => 'برداشتن'; + + @override + String get chipActionShowCollection => 'نمایش در مجموعه'; + + @override + String get chipActionGoToAlbumPage => 'نمایش در البوم‌ها'; + + @override + String get chipActionGoToCountryPage => 'نمایش در کشورها'; + + @override + String get chipActionGoToPlacePage => 'نمایش در مکان‌ها'; + + @override + String get chipActionGoToTagPage => 'نمایش در برچسب‌ها'; + + @override + String get chipActionGoToExplorerPage => 'نمایش در کاوشگر'; + + @override + String get chipActionDecompose => 'جداکردن'; + + @override + String get chipActionFilterOut => 'پاک‌کردن از پالایش'; + + @override + String get chipActionFilterIn => 'اضافه به فیلتر'; + + @override + String get chipActionHide => 'پنهان کردن'; + + @override + String get chipActionLock => 'قفل'; + + @override + String get chipActionPin => 'سنجاق به بالا'; + + @override + String get chipActionUnpin => 'برداشتن سنجاق از بالا'; + + @override + String get chipActionGroup => 'تغییر گروه‌بندی'; + + @override + String get chipActionRename => 'تغییر نام فایل'; + + @override + String get chipActionSetCover => 'گذاشتن به عنوان سرپوش'; + + @override + String get chipActionShowCountryStates => 'نمایش شهر‌ها'; + + @override + String get chipActionCreateGroup => 'ایجاد گروه'; + + @override + String get chipActionCreateAlbum => 'ساخت البوم'; + + @override + String get chipActionCreateVault => 'ساخت گاوصندوق'; + + @override + String get chipActionConfigureVault => 'پیکربندی گاوصندوق'; + + @override + String get entryActionCopyToClipboard => 'کپی به کلیپ بورد'; + + @override + String get entryActionDelete => 'پاک‌کردن'; + + @override + String get entryActionConvert => 'تبدیل فایل'; + + @override + String get entryActionExport => 'خروجی'; + + @override + String get entryActionInfo => 'اطلاعات'; + + @override + String get entryActionRename => 'تغییر نام'; + + @override + String get entryActionRestore => 'برگرداندن'; + + @override + String get entryActionRotateCCW => 'چرخش پادساعت‌گرد'; + + @override + String get entryActionRotateCW => 'چرخش ساعت‌گرد'; + + @override + String get entryActionFlip => 'آینه کردن افقی'; + + @override + String get entryActionPrint => 'چاپ'; + + @override + String get entryActionShare => 'اشتراک گذاری'; + + @override + String get entryActionShareImageOnly => 'فقط اشتراک گذاری عکس'; + + @override + String get entryActionShareVideoOnly => 'فقط اشتراک گذاری ویدئو'; + + @override + String get entryActionViewSource => 'مشاهده منبع'; + + @override + String get entryActionShowGeoTiffOnMap => 'نمایش بر روی نقشه'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'تبدیل به عکس ثابت'; + + @override + String get entryActionViewMotionPhotoVideo => 'باز کردن ویدئو'; + + @override + String get entryActionEdit => 'ویرایش'; + + @override + String get entryActionOpen => 'باز کردن با برنامه ای دیگر'; + + @override + String get entryActionSetAs => 'قرار دادن به عنوان'; + + @override + String get entryActionCast => 'بازتاب'; + + @override + String get entryActionOpenMap => 'نمایش در برنامه نقشه'; + + @override + String get entryActionRotateScreen => 'چرخش صفحه'; + + @override + String get entryActionAddFavourite => 'افزودن به برگزیده‌ها'; + + @override + String get entryActionRemoveFavourite => 'پاک‌کردن از برگزیده‌ها'; + + @override + String get videoActionCaptureFrame => 'ذخیره فریم'; + + @override + String get videoActionMute => 'بی صدا کردن'; + + @override + String get videoActionUnmute => 'با صدا کردن'; + + @override + String get videoActionPause => 'ایست'; + + @override + String get videoActionPlay => 'پخش'; + + @override + String get videoActionReplay10 => 'برگشت 10 ثانیه به عقب'; + + @override + String get videoActionSkip10 => 'جلو رفتن 10 ثانیه'; + + @override + String get videoActionShowPreviousFrame => 'نمایش قاب پیشین'; + + @override + String get videoActionShowNextFrame => 'نمایش قاب بعدی'; + + @override + String get videoActionSelectStreams => 'انتخاب صوت‌ها'; + + @override + String get videoActionSetSpeed => 'سرعت پخش'; + + @override + String get videoActionABRepeat => 'آ-ب تکرار'; + + @override + String get videoRepeatActionSetStart => 'تنظیم آغاز'; + + @override + String get videoRepeatActionSetEnd => 'تنظیم پایان'; + + @override + String get viewerActionSettings => 'تنظیمات'; + + @override + String get viewerActionLock => 'قفل پخش‌کننده'; + + @override + String get viewerActionUnlock => 'باز کردن قفل پخش‌کننده'; + + @override + String get slideshowActionResume => 'ادامه'; + + @override + String get slideshowActionShowInCollection => 'نمایش در مجموعه'; + + @override + String get entryInfoActionEditDate => 'ویرایش تاریخ'; + + @override + String get entryInfoActionEditLocation => 'ویرایش مکان'; + + @override + String get entryInfoActionEditTitleDescription => 'ویرایش عنوان و توضیحات'; + + @override + String get entryInfoActionEditRating => 'ویرایش امتیاز'; + + @override + String get entryInfoActionEditTags => 'ویرایش برچسب ها'; + + @override + String get entryInfoActionRemoveMetadata => 'پاک‌کردن فراداده'; + + @override + String get entryInfoActionExportMetadata => 'خروجی گرفتن از فراداده'; + + @override + String get entryInfoActionRemoveLocation => 'پاک‌کردن مکان'; + + @override + String get editorActionTransform => 'تبدیل'; + + @override + String get editorTransformCrop => 'برش'; + + @override + String get editorTransformRotate => 'چرخش'; + + @override + String get cropAspectRatioFree => 'آزاد'; + + @override + String get cropAspectRatioOriginal => 'اصلی'; + + @override + String get cropAspectRatioSquare => 'مربع'; + + @override + String get filterAspectRatioLandscapeLabel => 'افقی'; + + @override + String get filterAspectRatioPortraitLabel => 'عمودی'; + + @override + String get filterBinLabel => 'سطل اشغال'; + + @override + String get filterFavouriteLabel => 'برگزیده'; + + @override + String get filterNoDateLabel => 'بدون تاریخ'; + + @override + String get filterNoAddressLabel => 'بدون نشانی'; + + @override + String get filterLocatedLabel => 'واقع شده'; + + @override + String get filterNoLocationLabel => 'بدون مکان'; + + @override + String get filterNoRatingLabel => 'بدون امتیاز'; + + @override + String get filterTaggedLabel => 'نشان شده'; + + @override + String get filterNoTagLabel => 'بدون برچسب'; + + @override + String get filterNoTitleLabel => 'بدون نام'; + + @override + String get filterOnThisDayLabel => 'در امروز'; + + @override + String get filterRecentlyAddedLabel => 'تازه اضافه شده'; + + @override + String get filterRatingRejectedLabel => 'رد شده'; + + @override + String get filterTypeAnimatedLabel => 'متحرک'; + + @override + String get filterTypeMotionPhotoLabel => 'تصویر متحرک'; + + @override + String get filterTypePanoramaLabel => 'پاناروما'; + + @override + String get filterTypeRawLabel => 'خام'; + + @override + String get filterTypeSphericalVideoLabel => 'ویدئو 360°'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'عکس'; + + @override + String get filterMimeVideoLabel => 'ویدئو'; + + @override + String get accessibilityAnimationsRemove => 'جلوگیری از جلوه‌های نمایشگر'; + + @override + String get accessibilityAnimationsKeep => 'نمایش از جلوه‌های نمایشگر'; + + @override + String get albumTierNew => 'جدید'; + + @override + String get albumTierPinned => 'سنجاق شده'; + + @override + String get albumTierGroups => 'گروه‌ها'; + + @override + String get albumTierSpecial => 'مشترک'; + + @override + String get albumTierApps => 'برنامه ها'; + + @override + String get albumTierVaults => 'گاوصندوق‌ها'; + + @override + String get albumTierDynamic => 'پویا'; + + @override + String get albumTierRegular => 'دیگری‌ها'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'درجه‌های اعشاری'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'شمال'; + + @override + String get coordinateDmsSouth => 'جنوب'; + + @override + String get coordinateDmsEast => 'شرق'; + + @override + String get coordinateDmsWest => 'غرب'; + + @override + String get displayRefreshRatePreferHighest => 'بیشترین مقدار'; + + @override + String get displayRefreshRatePreferLowest => 'کمترین مقدار'; + + @override + String get keepScreenOnNever => 'هیچ‌وقت'; + + @override + String get keepScreenOnVideoPlayback => 'هنگام پخش ویدیو'; + + @override + String get keepScreenOnViewerOnly => 'فقط در صفحهٔ مشاهده‌ٔ تصویر'; + + @override + String get keepScreenOnAlways => 'همیشه'; + + @override + String get lengthUnitPixel => 'پیکسل'; + + @override + String get lengthUnitPercent => '٪'; + + @override + String get mapStyleGoogleNormal => 'نقشه گوگل'; + + @override + String get mapStyleGoogleHybrid => 'نقشه گوگل (نمایش هیبریدی)'; + + @override + String get mapStyleGoogleTerrain => 'نقشه گوگل (نمایش زمین)'; + + @override + String get mapStyleOsmLiberty => 'اواس‌ام لیبریتی'; + + @override + String get mapStyleOpenTopoMap => 'اوپن‌توپومپ'; + + @override + String get mapStyleOsmHot => 'اوپن‌استریت‌مپ بشردوستانه'; + + @override + String get mapStyleStamenWatercolor => 'استامن (نمایش نقشه کشیده شده)'; + + @override + String get maxBrightnessNever => 'هرگز'; + + @override + String get maxBrightnessAlways => 'همیشه'; + + @override + String get nameConflictStrategyRename => 'تغییر نام'; + + @override + String get nameConflictStrategyReplace => 'جایگزین کردن'; + + @override + String get nameConflictStrategySkip => 'رد شدن'; + + @override + String get overlayHistogramNone => 'هیچکدام'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'درخشش'; + + @override + String get subtitlePositionTop => 'بالا'; + + @override + String get subtitlePositionBottom => 'پایین'; + + @override + String get themeBrightnessLight => 'روشن'; + + @override + String get themeBrightnessDark => 'تاریک'; + + @override + String get themeBrightnessBlack => 'سیاه'; + + @override + String get unitSystemMetric => 'متری'; + + @override + String get unitSystemImperial => 'مایلی'; + + @override + String get vaultLockTypePattern => 'الگو'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'گذرواژه'; + + @override + String get settingsVideoEnablePip => 'تصویر در تصویر'; + + @override + String get videoControlsPlayOutside => 'باز کردن با برنامه‌ای دیگر'; + + @override + String get videoLoopModeNever => 'هیچ وقت'; + + @override + String get videoLoopModeShortOnly => 'فقط برای ویدئوهای کوتاه'; + + @override + String get videoLoopModeAlways => 'همیشه'; + + @override + String get videoPlaybackSkip => 'رد کردن'; + + @override + String get videoPlaybackMuted => 'پخش بی صدا'; + + @override + String get videoPlaybackWithSound => 'پخش با صدا'; + + @override + String get videoResumptionModeNever => 'هیچ‌وقت'; + + @override + String get videoResumptionModeAlways => 'همیشه'; + + @override + String get viewerTransitionSlide => 'اسلاید'; + + @override + String get viewerTransitionParallax => 'انطباق'; + + @override + String get viewerTransitionFade => 'محو شدن'; + + @override + String get viewerTransitionZoomIn => 'زوم‌پیش'; + + @override + String get viewerTransitionNone => 'هیچ‌کدام'; + + @override + String get wallpaperTargetHome => 'صفحهٔ خانه'; + + @override + String get wallpaperTargetLock => 'صفحهٔ قفل'; + + @override + String get wallpaperTargetHomeLock => 'صفحهٔ خانه و صفحهٔ قفل'; + + @override + String get widgetDisplayedItemRandom => 'تصادفی'; + + @override + String get widgetDisplayedItemMostRecent => 'جدید‌ترین'; + + @override + String get widgetOpenPageHome => 'باز کردن خانه'; + + @override + String get widgetOpenPageCollection => 'باز کردن مجموعه'; + + @override + String get widgetOpenPageViewer => 'باز کردن مشاهده‌گر'; + + @override + String get widgetTapUpdateWidget => 'به‌روز رسانی ابزارک'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'حافظه داخلی'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'کارت حافظه'; + + @override + String get rootDirectoryDescription => 'شاخهٔ ریشه'; + + @override + String otherDirectoryDescription(String name) { + return 'شاخهٔ «$name»'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'لطفا شاخهٔ $directory در «$volume» را در صفحه بعد انتخاب کنید و به برنامه اجازه بدهید.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'این برنامه اجازهٔ ویرایش پرونده‌ها ی پوشه $directory در «$volume» را ندارد.\n\nلطفا از یک برنامهٔ نگارخانه یا مدیر پروندهٔ از پیش نصب شده استفاده کنید.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'این کار برای کامل شدن به $neededSize فضای خالی در «$volume» نیاز دارد اما فقط $freeSize وجود دارد.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'انتخابگر پرونده سامانه وجود ندارد یا غیرفعال است. لطفا آن را فعال کنید و دوباره امتحان کنید.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'این عملکرد برای موارد از این نوع پشتیبانی نمیشود: $types.', + one: 'این عملکرد برای موارد از این نوع ممکن نیست: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'برخی از پرونده‌های موجود در پوشه مقصد به همین نام هستند.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'برخی پرونده ها نام های یکسانی دارند.'; + + @override + String get addShortcutDialogLabel => 'عنوان میانبر'; + + @override + String get addShortcutButtonLabel => 'افزودن'; + + @override + String get noMatchingAppDialogMessage => 'هیچ کاره ای وجود ندارد که بتواند این موضوع را مدیریت کند.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'این $countمورد به سطل زباله منتقل شوند؟', + one: 'این مورد به سطل زباله منتقل شود؟', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'این $count مورد پاک شوند؟', + one: 'این مورد پاک شود؟', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'پیش از ادامه دادن تاریخ موارد نگه‌داری شود؟'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'نگه‌داری تاریخ ها'; + + @override + String videoResumeDialogMessage(String time) { + return 'ادامه پخش از زمان $time؟'; + } + + @override + String get videoStartOverButtonLabel => 'شروع از اول'; + + @override + String get videoResumeButtonLabel => 'ادامه'; + + @override + String get setCoverDialogLatest => 'آخرین مورد'; + + @override + String get setCoverDialogAuto => 'خودکار'; + + @override + String get setCoverDialogCustom => 'شخصی'; + + @override + String get hideFilterConfirmationDialogMessage => 'تطبیق عکس ها و فیلم ها از مجموعه شما پنهان خواهد ماند. می توانید دوباره آنها را از تنظیمات «حریم خصوصی» نشان دهید.\n\nاز پنهان سازی آنها اطمینان دارید?'; + + @override + String get newAlbumDialogTitle => 'آلبوم جدید'; + + @override + String get newAlbumDialogNameLabel => 'نام آلبوم'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'آلبوم از پیش موجود است'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'پوشه از پیش موجود است'; + + @override + String get newAlbumDialogStorageLabel => 'حافظه:'; + + @override + String get newDynamicAlbumDialogTitle => 'آلبوم پویای جدید'; + + @override + String get dynamicAlbumAlreadyExists => 'آلبوم پویا از پیش موجود است'; + + @override + String get newGroupDialogTitle => 'گروه جدید'; + + @override + String get newGroupDialogNameLabel => 'نام گروه'; + + @override + String get groupAlreadyExists => 'گروه در حال حاضر وجود دارد'; + + @override + String get groupEmpty => 'بدون گروه'; + + @override + String get ungrouped => 'جدا شده از گروه'; + + @override + String get groupPickerTitle => 'انتخاب گروه'; + + @override + String get groupPickerUseThisGroupButton => 'استفاده از این گروه'; + + @override + String get newVaultWarningDialogMessage => 'موارد موجود در گاوصندوق تنها برای این برنامه در دسترس هستند و در هیچ برنامه دیگری وجود ندارد.\n\nاگر این برنامه را پاک کنید، یا داده‌های برنامه را پاک کنید، همه این موارد را از دست خواهید داد.'; + + @override + String get newVaultDialogTitle => 'گاوصندوق جدید'; + + @override + String get configureVaultDialogTitle => 'پیکربندی گاوصندوق'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'وقتی دستگاه خاموش شد قفل شود'; + + @override + String get vaultDialogLockTypeLabel => 'نوع قفل'; + + @override + String get patternDialogEnter => 'وارد کردن الگو'; + + @override + String get patternDialogConfirm => 'تایید الگو'; + + @override + String get pinDialogEnter => 'وارد کردن PIN'; + + @override + String get pinDialogConfirm => 'تایید PIN'; + + @override + String get passwordDialogEnter => 'وارد کردن گذرواژه'; + + @override + String get passwordDialogConfirm => 'تایید گذرواژه'; + + @override + String get authenticateToConfigureVault => 'احرازهویت برای پیکربندی گاو صندوق'; + + @override + String get authenticateToUnlockVault => 'احرازهویت برای قفل گشایی گاو صندوق'; + + @override + String get vaultBinUsageDialogMessage => 'برخی از خزانه ها از سطل زباله استفاده می کنند.'; + + @override + String get renameAlbumDialogLabel => 'نام جدید'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'پوشه از پیش موجود است'; + + @override + String get renameEntrySetPageTitle => 'تغییرنام'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'الگو نام گذاری'; + + @override + String get renameEntrySetPageInsertTooltip => 'قسمتی وارد کنید'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'پیش‌نمایش'; + + @override + String get renameProcessorCounter => 'شمارنده'; + + @override + String get renameProcessorHash => 'هش'; + + @override + String get renameProcessorName => 'نام'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'این آلبوم و $count مورد موجود در آن پاک شود؟', + one: 'این آلبوم و مورد موجود در آن پاک شود؟', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'این آلبوم ها و $count مورد موجود در آنها پاک شود؟', + one: 'این آلبوم ها و مورد موجود در آنها پاک شود؟', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'فرمت:'; + + @override + String get exportEntryDialogWidth => 'عرض'; + + @override + String get exportEntryDialogHeight => 'طول'; + + @override + String get exportEntryDialogQuality => 'کیفیت'; + + @override + String get exportEntryDialogWriteMetadata => 'نوشتن فراداده'; + + @override + String get renameEntryDialogLabel => 'نام جدید'; + + @override + String get editEntryDialogCopyFromItem => 'هم‌مانند دیگر مورد کن'; + + @override + String get editEntryDialogTargetFieldsHeader => 'قسمت هایی برای تغییر'; + + @override + String get editEntryDateDialogTitle => 'تاریخ و زمان'; + + @override + String get editEntryDateDialogSetCustom => 'تنظیم تاریخ سفارشی'; + + @override + String get editEntryDateDialogCopyField => 'رونوشت از تاریخی دیگر'; + + @override + String get editEntryDateDialogExtractFromTitle => 'استخراج از عنوان'; + + @override + String get editEntryDateDialogShift => 'جابه‌جایی'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'تاریخ تغییر پرونده'; + + @override + String get durationDialogHours => 'ساعت'; + + @override + String get durationDialogMinutes => 'دقیقه'; + + @override + String get durationDialogSeconds => 'ثانیه'; + + @override + String get editEntryLocationDialogTitle => 'مکان'; + + @override + String get editEntryLocationDialogSetCustom => 'تنظیم موقعیت سفارشی'; + + @override + String get editEntryLocationDialogChooseOnMap => 'انتخاب در نقشه'; + + @override + String get editEntryLocationDialogImportGpx => 'وارد کردن GPX'; + + @override + String get editEntryLocationDialogLatitude => 'عرض جغرافیایی'; + + @override + String get editEntryLocationDialogLongitude => 'طول جغرافیایی'; + + @override + String get editEntryLocationDialogTimeShift => 'تغییر زمان'; + + @override + String get locationPickerUseThisLocationButton => 'استفاده از این مکان'; + + @override + String get editEntryRatingDialogTitle => 'امتیاز'; + + @override + String get removeEntryMetadataDialogTitle => 'پاک‌کردن فراداده'; + + @override + String get removeEntryMetadataDialogAll => 'همه'; + + @override + String get removeEntryMetadataDialogMore => 'بیشتر'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP برای پخش ویدیو در داخل یک عکس متحرک مورد نیاز است.\n\nار پاک‌سازی آن اطمینان دارید?'; + + @override + String get videoSpeedDialogLabel => 'سرعت پخش'; + + @override + String get videoStreamSelectionDialogVideo => 'ویدیو'; + + @override + String get videoStreamSelectionDialogAudio => 'صدا'; + + @override + String get videoStreamSelectionDialogText => 'زیرنویس'; + + @override + String get videoStreamSelectionDialogOff => 'خاموش'; + + @override + String get videoStreamSelectionDialogTrack => 'صوت'; + + @override + String get videoStreamSelectionDialogNoSelection => 'هیچ صدا دیگری وجود ندارد.'; + + @override + String get genericSuccessFeedback => 'انجام شد!'; + + @override + String get genericFailureFeedback => 'ناموفق'; + + @override + String get genericDangerWarningDialogMessage => 'اطمینان دارید؟'; + + @override + String get tooManyItemsErrorDialogMessage => 'دوباره با موارد کمتر تلاش کنید.'; + + @override + String get menuActionConfigureView => 'تماشا'; + + @override + String get menuActionSelect => 'انتخاب'; + + @override + String get menuActionSelectAll => 'انتخاب همه'; + + @override + String get menuActionSelectNone => 'انتخاب هیچکدام'; + + @override + String get menuActionMap => 'نقشه'; + + @override + String get menuActionSlideshow => 'نمایش اسلایدی'; + + @override + String get menuActionStats => 'آمار'; + + @override + String get viewDialogSortSectionTitle => 'ترتیب بندی'; + + @override + String get viewDialogGroupSectionTitle => 'گروه بندی‌ها'; + + @override + String get viewDialogLayoutSectionTitle => 'چیدمان'; + + @override + String get viewDialogReverseSortOrder => 'ترتیب مرتب‌سازی معکوس'; + + @override + String get tileLayoutMosaic => 'موزائیک'; + + @override + String get tileLayoutGrid => 'شبکه'; + + @override + String get tileLayoutList => 'فهرست'; + + @override + String get castDialogTitle => 'پخش دستگاه ها'; + + @override + String get coverDialogTabCover => 'جلد'; + + @override + String get coverDialogTabApp => 'برنامه'; + + @override + String get coverDialogTabColor => 'رنگ'; + + @override + String get appPickDialogTitle => 'انتخاب برنامه'; + + @override + String get appPickDialogNone => 'هیچکدام'; + + @override + String get aboutPageTitle => 'درباره'; + + @override + String get aboutLinkLicense => 'مجوز'; + + @override + String get aboutLinkPolicy => 'سیاست حفظ حریم خصوصی'; + + @override + String get aboutBugSectionTitle => 'گزارشات خرابی'; + + @override + String get aboutBugSaveLogInstruction => 'ذخیره گزارش‌های برنامه در یک پرونده'; + + @override + String get aboutBugCopyInfoInstruction => 'رونوشت اطلاعات سامانه'; + + @override + String get aboutBugCopyInfoButton => 'کپی'; + + @override + String get aboutBugReportInstruction => 'در گیت‌هاب با گزارش ها و ریزگان دستگاه گزارش کنید'; + + @override + String get aboutBugReportButton => 'گزارش'; + + @override + String get aboutDataUsageSectionTitle => 'مصرف داده'; + + @override + String get aboutDataUsageData => 'داده'; + + @override + String get aboutDataUsageCache => 'حافظه پنهان'; + + @override + String get aboutDataUsageDatabase => 'پایگاه داده'; + + @override + String get aboutDataUsageMisc => 'متفرقه'; + + @override + String get aboutDataUsageInternal => 'داخلی'; + + @override + String get aboutDataUsageExternal => 'خارجی'; + + @override + String get aboutDataUsageClearCache => 'پاک ساری حافظه موقت'; + + @override + String get aboutCreditsSectionTitle => 'سپاس‌نامه'; + + @override + String get aboutCreditsWorldAtlas1 => 'این برنامه یک پرونده TopoJSON استفاده میکند از'; + + @override + String get aboutCreditsWorldAtlas2 => 'زیر مجوز ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'مترجم ها'; + + @override + String get aboutLicensesSectionTitle => 'مجوز متن-باز'; + + @override + String get aboutLicensesBanner => 'این برنامه بسته‌ها و کتابخانه‌های آزاد زیر به‌کار می‌برد.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'کتابخانه‌های اندروید'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'افزونه‌های Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'بسته‌های Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'بسته‌های Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'نمایش تمام مجوز ها'; + + @override + String get policyPageTitle => 'سیاست حفظ حریم خصوصی'; + + @override + String get collectionPageTitle => 'مجموعه'; + + @override + String get collectionPickPageTitle => 'انتخاب'; + + @override + String get collectionSelectPageTitle => 'انتخاب موارد'; + + @override + String get collectionActionShowTitleSearch => 'نمایش پالایش عنوان'; + + @override + String get collectionActionHideTitleSearch => 'پنهان سازی پالایش عنوان'; + + @override + String get collectionActionAddDynamicAlbum => 'افزودن آلبوم پویا'; + + @override + String get collectionActionAddShortcut => 'افزودن میانبر'; + + @override + String get collectionActionSetHome => 'تنظیم به عنوان خانه'; + + @override + String get collectionActionEmptyBin => 'سطل خالی'; + + @override + String get collectionActionCopy => 'رونوشت به آلبوم'; + + @override + String get collectionActionMove => 'هدایت به آلبوم'; + + @override + String get collectionActionRescan => 'بررسی مجدد'; + + @override + String get collectionActionEdit => 'ویرایش'; + + @override + String get collectionSearchTitlesHintText => 'جستجو عناوین'; + + @override + String get collectionGroupAlbum => 'با آلبوم'; + + @override + String get collectionGroupMonth => 'با ماه'; + + @override + String get collectionGroupDay => 'با روز'; + + @override + String get sectionNone => 'بدون دسته'; + + @override + String get sectionUnknown => 'ناشناس'; + + @override + String get dateToday => 'امروز'; + + @override + String get dateYesterday => 'دیروز'; + + @override + String get dateThisMonth => 'این ماه'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'پاک‌کردن $count مورد ناموفق بود', + one: 'پاک‌کردن ۱ مورد ناموفق بود', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'رونوشت $count مورد ناموفق بود', + one: 'رونوشت ۱ مورد ناموفق بود', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'هدایت $count مورد ناموفق بود', + one: 'هدایت ۱ مورد ناموفق بود', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'تغییرنام $count مورد ناموفق بود', + one: 'تغییرنام ۱ مورد ناموفق بود', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ویرایش $count مورد ناموفق بود', + one: 'ویرایش ۱ مورد ناموفق بود', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'استخراج $count صفحه ناموفق', + one: 'استخراج صفحه ناموفق', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count مورد رونوشت شد', + one: '۱ مورد رونوشت شد', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count مورد هدایت شد', + one: '۱ مورد هدایت شد', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count مورد تغییرنام یافت', + one: '۱ مورد تغییرنام یافت', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count مورد ویرایش شد', + one: '۱ مورد ویرایش شد', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'هیچ برگزیده‌ای نیست'; + + @override + String get collectionEmptyVideos => 'بدون ویدیو'; + + @override + String get collectionEmptyImages => 'بدون تصویر'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'گرفتن دسترسی'; + + @override + String get collectionSelectSectionTooltip => 'انتخاب بخش'; + + @override + String get collectionDeselectSectionTooltip => 'عدم‌انتخاب بخش'; + + @override + String get drawerAboutButton => 'درباره'; + + @override + String get drawerSettingsButton => 'تنظیمات'; + + @override + String get drawerCollectionAll => 'تمام مجموعه'; + + @override + String get drawerCollectionFavourites => 'برگزیده‌ها'; + + @override + String get drawerCollectionImages => 'تصاویر'; + + @override + String get drawerCollectionVideos => 'ویدیوها'; + + @override + String get drawerCollectionAnimated => 'پویانمایی شده'; + + @override + String get drawerCollectionMotionPhotos => 'تصاویر متحرک'; + + @override + String get drawerCollectionPanoramas => 'پانوراما'; + + @override + String get drawerCollectionRaws => 'تصاویر خام'; + + @override + String get drawerCollectionSphericalVideos => 'ویدیو‌های 360°'; + + @override + String get drawerAlbumPage => 'آلبوم ها'; + + @override + String get drawerCountryPage => 'کشور ها'; + + @override + String get drawerPlacePage => 'مکان ها'; + + @override + String get drawerTagPage => 'برچسب ها'; + + @override + String get sortByDate => 'با تاریخ'; + + @override + String get sortByName => 'با نام'; + + @override + String get sortByItemCount => 'با تعداد موارد'; + + @override + String get sortBySize => 'با اندازه'; + + @override + String get sortByAlbumFileName => 'با آلبوم و سرتیتر پرونده'; + + @override + String get sortByRating => 'با امتیازبندی'; + + @override + String get sortByDuration => 'بر پایه مدت'; + + @override + String get sortByPath => 'بر پایه مسیر'; + + @override + String get sortOrderNewestFirst => 'اول جدیدترین'; + + @override + String get sortOrderOldestFirst => 'اول قدیمی‌ترین'; + + @override + String get sortOrderAtoZ => 'ا تا ی'; + + @override + String get sortOrderZtoA => 'ی تا ا'; + + @override + String get sortOrderHighestFirst => 'اول بالاترین'; + + @override + String get sortOrderLowestFirst => 'اول پایین‌ترین'; + + @override + String get sortOrderLargestFirst => 'اول بزرگترین'; + + @override + String get sortOrderSmallestFirst => 'اول کوچکترین'; + + @override + String get sortOrderShortestFirst => 'اول کوتاه‌ترین'; + + @override + String get sortOrderLongestFirst => 'اول بلندترین'; + + @override + String get albumGroupTier => 'با امتیاز'; + + @override + String get albumGroupType => 'با نوع'; + + @override + String get albumGroupVolume => 'با حجم ذخیره سازی'; + + @override + String get albumMimeTypeMixed => 'ترکیبی'; + + @override + String get albumPickPageTitleCopy => 'رونوشت به آلبوم'; + + @override + String get albumPickPageTitleExport => 'خروجی گرفتن به البوم'; + + @override + String get albumPickPageTitleMove => 'هدایت به آلبوم'; + + @override + String get albumPickPageTitlePick => 'انتخاب آلبوم'; + + @override + String get albumCamera => 'دوربین'; + + @override + String get albumDownload => 'دریافت'; + + @override + String get albumScreenshots => 'تصاویر از صفحه'; + + @override + String get albumScreenRecordings => 'ضبط‌های از صفحه'; + + @override + String get albumVideoCaptures => 'ویدیو‌های ضبط شده'; + + @override + String get albumPageTitle => 'آلبوم ها'; + + @override + String get albumEmpty => 'بدون آلبوم'; + + @override + String get createAlbumButtonLabel => 'ساخت'; + + @override + String get newFilterBanner => 'جدید'; + + @override + String get countryPageTitle => 'کشور ها'; + + @override + String get countryEmpty => 'بدون کشور ها'; + + @override + String get statePageTitle => 'آمار ها'; + + @override + String get stateEmpty => 'داده‌ای نیست'; + + @override + String get placePageTitle => 'مکان ها'; + + @override + String get placeEmpty => 'مکانی نیست'; + + @override + String get tagPageTitle => 'برچسب ها'; + + @override + String get tagEmpty => 'بدون برچسب ها'; + + @override + String get tagPickPageTitle => 'انتخاب برچسب'; + + @override + String get binPageTitle => 'سطل زباله'; + + @override + String get explorerPageTitle => 'کاوشگر'; + + @override + String get explorerActionSelectStorageVolume => 'گزینش حافظه'; + + @override + String get selectStorageVolumeDialogTitle => 'گزینش حافظه'; + + @override + String get searchCollectionFieldHint => 'جستجو مجموعه'; + + @override + String get searchRecentSectionTitle => 'اخیر'; + + @override + String get searchDateSectionTitle => 'تاریخ'; + + @override + String get searchFormatSectionTitle => 'قالب‌ها'; + + @override + String get searchAlbumsSectionTitle => 'آلبوم ها'; + + @override + String get searchCountriesSectionTitle => 'کشور ها'; + + @override + String get searchStatesSectionTitle => 'آمار ها'; + + @override + String get searchPlacesSectionTitle => 'مکان ها'; + + @override + String get searchTagsSectionTitle => 'برچسب ها'; + + @override + String get searchRatingSectionTitle => 'امتیازات'; + + @override + String get searchMetadataSectionTitle => 'فراداده'; + + @override + String get settingsPageTitle => 'تنظیمات'; + + @override + String get settingsSystemDefault => 'پیشفرض سامانه'; + + @override + String get settingsDefault => 'پیشفرض'; + + @override + String get settingsDisabled => 'خاموش'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'هر بار پرسیده شود'; + + @override + String get settingsModificationWarningDialogMessage => 'دیگر تنظیمات اصلاح خواهد شد.'; + + @override + String get settingsSearchFieldLabel => 'تنظیمات جستجو'; + + @override + String get settingsSearchEmpty => 'تنظیمی منطبق نشد'; + + @override + String get settingsActionExport => 'خروجی گرفتن'; + + @override + String get settingsActionExportDialogTitle => 'خروجی گرفتن'; + + @override + String get settingsActionImport => 'وارد کردن'; + + @override + String get settingsActionImportDialogTitle => 'وارد کردن'; + + @override + String get appExportCovers => 'جلد ها'; + + @override + String get appExportDynamicAlbums => 'آلبوم‌های پویا'; + + @override + String get appExportFavourites => 'برگزیده‌ها'; + + @override + String get appExportSettings => 'تنظیمات'; + + @override + String get settingsNavigationSectionTitle => 'پیمایش'; + + @override + String get settingsHomeTile => 'خانه'; + + @override + String get settingsHomeDialogTitle => 'خانه'; + + @override + String get setHomeCustom => 'سفارشی'; + + @override + String get settingsKeepScreenOnTile => 'صفحه را روشن نگه دار'; + + @override + String get settingsKeepScreenOnDialogTitle => 'صفحه را روشن نگه دار'; + + @override + String get settingsDoubleBackExit => 'برای خروج دوبار روی «بازگشت» ضربه بزنید'; + + @override + String get settingsConfirmationTile => 'درخواست‌های تایید'; + + @override + String get settingsConfirmationDialogTitle => 'درخواست‌های‌ تایید'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'همیشه پیش از پاک‌سازی موارد بپرس'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'پیش از هدایت موارد به سطل زباله بپرسید'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'پیش از جابجایی موارد بدون تاریخ بپرسید'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'نمایش پیام پس از هدایت موارد به سطل زباله'; + + @override + String get settingsConfirmationVaultDataLoss => 'نمایش هشدار از دست دادن داده‌های گاوصندوق'; + + @override + String get settingsNavigationDrawerTile => 'گزینه‌های پیمایش'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'گزینه‌های پیمایش'; + + @override + String get settingsNavigationDrawerBanner => 'برای جابجایی و مرتب کردن دوباره موارد، لمس کنید و نگه دارید.'; + + @override + String get settingsNavigationDrawerTabTypes => 'انواع'; + + @override + String get settingsNavigationDrawerTabAlbums => 'آلبوم ها'; + + @override + String get settingsNavigationDrawerTabPages => 'صفحات'; + + @override + String get settingsNavigationDrawerAddAlbum => 'افزودن آلبوم'; + + @override + String get settingsNavigationBottomActionsTile => 'مسیریابی زیرین'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'مسیریابی زیرین'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'لمس کنید و نگه دارید تا دکمه‌ها را حرکت داده و انتخاب کنید کدام عمل‌ها در کادر مسیریابی زیرین نمایش داده شوند.'; + + @override + String get settingsThumbnailSectionTitle => 'ریز عکس ها'; + + @override + String get settingsThumbnailOverlayTile => 'روکش'; + + @override + String get settingsThumbnailOverlayPageTitle => 'روکش'; + + @override + String get settingsThumbnailShowHdrIcon => 'نمایش نماد HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'نمایش نماد برگزیدن'; + + @override + String get settingsThumbnailShowTagIcon => 'نمایش نماد برچسب'; + + @override + String get settingsThumbnailShowLocationIcon => 'نمایش نماد مکان'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'نمایش نماد تصویر متحرک'; + + @override + String get settingsThumbnailShowRating => 'نمایش امتیازبندی'; + + @override + String get settingsThumbnailShowRawIcon => 'نمایش نماد خامی'; + + @override + String get settingsThumbnailShowVideoDuration => 'نمایش مدت زمان ویدیو'; + + @override + String get settingsCollectionQuickActionsTile => 'کنش‌های سریع'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'کنش‌های سریع'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'مرور کردن'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'انتخاب کردن'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'برای جابجایی دکمه ها لمس کنید و نگه دارید و انتخاب کنید که کدام اقدامات هنگام مرور موارد نمایش داده شوند.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'برای جابجایی دکمه ها لمس کنید و نگه دارید و انتخاب کنید که کدام اقدامات هنگام انتخاب موارد نمایش داده شوند.'; + + @override + String get settingsCollectionBurstPatternsTile => 'الگوهای تصاویر چندتایی'; + + @override + String get settingsCollectionBurstPatternsNone => 'هیچکدام'; + + @override + String get settingsViewerSectionTitle => 'بیننده'; + + @override + String get settingsViewerGestureSideTapNext => 'روی لبه‌های صفحه ضربه بزنید تا مورد قبلی/بعدی نشان داده شود'; + + @override + String get settingsViewerUseCutout => 'ناحیه برش را بکار بگیر'; + + @override + String get settingsViewerMaximumBrightness => 'روشنایی حداکثری'; + + @override + String get settingsMotionPhotoAutoPlay => 'پخش خودکار تصویر متحرک'; + + @override + String get settingsImageBackground => 'پس‌زمینه تصاویر'; + + @override + String get settingsViewerQuickActionsTile => 'کنش‌های سریع'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'کنش‌های سریع'; + + @override + String get settingsViewerQuickActionEditorBanner => 'لمس کنید و نگه دارید تا دکمه ها را حرکت دهید و انتخاب کنید که کدام کنش ها در بیننده نمایش داده می شود.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'دکمه‌های نمایش داده شده'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'دکمه‌های در دسترس'; + + @override + String get settingsViewerQuickActionEmpty => 'بدون دکمه'; + + @override + String get settingsViewerOverlayTile => 'روکش'; + + @override + String get settingsViewerOverlayPageTitle => 'روکش'; + + @override + String get settingsViewerShowOverlayOnOpening => 'پس از باز شدن نمایش داده شود'; + + @override + String get settingsViewerShowHistogram => 'نمایش نمودار'; + + @override + String get settingsViewerShowMinimap => 'نمایش نقشه‌کوچک'; + + @override + String get settingsViewerShowZoomLevel => 'نمایش سطح بزرگنمایی'; + + @override + String get settingsViewerShowInformation => 'نمایش درباره'; + + @override + String get settingsViewerShowInformationSubtitle => 'نمایش عنوان، تاریخ، مکان، و...'; + + @override + String get settingsViewerShowRatingTags => 'نمایش امتیازات و برچسب ها'; + + @override + String get settingsViewerShowShootingDetails => 'نمایش ریزگان تصویربرداری'; + + @override + String get settingsViewerShowDescription => 'نمایش ریزگان'; + + @override + String get settingsViewerShowOverlayThumbnails => 'نمایش ریزعکس ها'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'جلوه محو'; + + @override + String get settingsViewerSlideshowTile => 'تصاویر گردان'; + + @override + String get settingsViewerSlideshowPageTitle => 'تصاویر گردان'; + + @override + String get settingsSlideshowRepeat => 'تکرار'; + + @override + String get settingsSlideshowShuffle => 'در هم'; + + @override + String get settingsSlideshowFillScreen => 'پر کردن صفحه'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'جلوه بزرگنمایی پویانمایی شده'; + + @override + String get settingsSlideshowTransitionTile => 'هدایت'; + + @override + String get settingsSlideshowIntervalTile => 'فاصله'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'پخش ویدیو'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'پخش ویدیو'; + + @override + String get settingsVideoPageTitle => 'تنظیمات ویدیو'; + + @override + String get settingsVideoSectionTitle => 'ویدیو'; + + @override + String get settingsVideoShowVideos => 'نمایش ویدیو ها'; + + @override + String get settingsVideoPlaybackTile => 'پخش'; + + @override + String get settingsVideoPlaybackPageTitle => 'پخش'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'شتاب سخت‌افزاری'; + + @override + String get settingsVideoAutoPlay => 'پخش خودکار'; + + @override + String get settingsVideoLoopModeTile => 'حالت حلقه'; + + @override + String get settingsVideoLoopModeDialogTitle => 'حالت حلقه'; + + @override + String get settingsVideoResumptionModeTile => 'ادامه پخش'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'ادامه پخش'; + + @override + String get settingsVideoBackgroundMode => 'حالت پس‌زمینه'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'حالت پس‌زمینه‌'; + + @override + String get settingsVideoControlsTile => 'هدایت کننده ها'; + + @override + String get settingsVideoControlsPageTitle => 'هدایت کننده ها'; + + @override + String get settingsVideoButtonsTile => 'دکمه ها'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'برای پخش/ایست دوبار ضربه زدن'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'روی لبه‌های صفحه دوبار ضربه بزنید تا به عقب/جلو بروید'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'برای تنظیم نور/صدا به بالا و پایین بکشید'; + + @override + String get settingsSubtitleThemeTile => 'زیرنویس ها'; + + @override + String get settingsSubtitleThemePageTitle => 'زیرنویس ها'; + + @override + String get settingsSubtitleThemeSample => 'این یک نمونه است.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'تراز متن'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'تراز متن'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'موقعیت متن'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'موقعیت متن‌'; + + @override + String get settingsSubtitleThemeTextSize => 'اندازه متن'; + + @override + String get settingsSubtitleThemeShowOutline => 'نمایش نوار حاشیه و سایه'; + + @override + String get settingsSubtitleThemeTextColor => 'رنگ متن'; + + @override + String get settingsSubtitleThemeTextOpacity => 'شفافیت متن'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'رنگ پس‌زمینه'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'شفافیت پس‌زمینه'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'چپ'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'مرکز'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'راست'; + + @override + String get settingsPrivacySectionTitle => 'حریم خصوصی'; + + @override + String get settingsAllowInstalledAppAccess => 'اجازه دسترسی به دارایی برنامه'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'برای بهبود نمایش آلبوم به‌کارگرفته میشود'; + + @override + String get settingsAllowErrorReporting => 'اجازه به گزارش خطا ناشناس'; + + @override + String get settingsSaveSearchHistory => 'نگهداری تاریخچه جستجو'; + + @override + String get settingsEnableBin => 'به‌کارگیری سطل زباله'; + + @override + String get settingsEnableBinSubtitle => 'موارد پاک شده را به مدت 30 روز نگه دارید'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'موارد موجود در سطل زباله برای همیشه نابود خواهند شد.'; + + @override + String get settingsAllowMediaManagement => 'اجازه مدیریت محتوا'; + + @override + String get settingsHiddenItemsTile => 'موارد پنهان'; + + @override + String get settingsHiddenItemsPageTitle => 'موارد پنهان'; + + @override + String get settingsHiddenFiltersBanner => 'تصاویر و ویدیوهایی که با پالایش‌های مخفی سازگار نیستند در مجموعه شما دیده نمیشوند.'; + + @override + String get settingsHiddenFiltersEmpty => 'پالایشی پنهان نیست'; + + @override + String get settingsStorageAccessTile => 'دسترسی حافظه'; + + @override + String get settingsStorageAccessPageTitle => 'دسترسی حافظه'; + + @override + String get settingsStorageAccessBanner => 'برخی پوشه ها برای اصلاح پرونده‌های موجود در آنها به یک مجوز دسترسی نیاز دارند. در اینجا می توانید پوشه هایی را که قبلاً به آنها دسترسی داشته اید، مرور کنید.'; + + @override + String get settingsStorageAccessEmpty => 'دسترسی اهدا نشد'; + + @override + String get settingsStorageAccessRevokeTooltip => 'لغو'; + + @override + String get settingsAccessibilitySectionTitle => 'دسترسی پذیری'; + + @override + String get settingsRemoveAnimationsTile => 'بدون پویانمایی'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'بدون پویانمایی‌'; + + @override + String get settingsTimeToTakeActionTile => 'زمان اقدام'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'نمایش جایگزین‌های چند لمس همزمان'; + + @override + String get settingsDisplaySectionTitle => 'نمایش'; + + @override + String get settingsThemeBrightnessTile => 'پوسته'; + + @override + String get settingsThemeBrightnessDialogTitle => 'پوسته'; + + @override + String get settingsThemeColorHighlights => 'رنگ متون برجسته'; + + @override + String get settingsThemeEnableDynamicColor => 'رنگ‌های پویا'; + + @override + String get settingsDisplayRefreshRateModeTile => 'نمایش نرخ تازه‌سازی'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'نرخ تازه‌سازی'; + + @override + String get settingsDisplayUseTvInterface => 'رابط تلویزیون اندروید'; + + @override + String get settingsLanguageSectionTitle => 'زبان و قالب ها'; + + @override + String get settingsLanguageTile => 'زبان'; + + @override + String get settingsLanguagePageTitle => 'زبان'; + + @override + String get settingsCoordinateFormatTile => 'قالب مختصات'; + + @override + String get settingsCoordinateFormatDialogTitle => 'قالب مختصات‌'; + + @override + String get settingsUnitSystemTile => 'واحد ها'; + + @override + String get settingsUnitSystemDialogTitle => 'واحد ها'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'اجبار به اعداد عربی'; + + @override + String get settingsScreenSaverPageTitle => 'ذخیره کننده صفحه'; + + @override + String get settingsWidgetPageTitle => 'قاب تصویر'; + + @override + String get settingsWidgetShowOutline => 'نوار حاشیه'; + + @override + String get settingsWidgetOpenPage => 'هنگام ضربه زدن بر روی ابزارک'; + + @override + String get settingsWidgetDisplayedItem => 'موارد نمایش داده شده'; + + @override + String get settingsCollectionTile => 'مجموعه'; + + @override + String get statsPageTitle => 'آمار'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count مورد دارای مکان', + one: '1 مورد دارای مکان', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'کشور‌های ممتاز'; + + @override + String get statsTopStatesSectionTitle => 'آمارهای ممتاز'; + + @override + String get statsTopPlacesSectionTitle => 'مکان‌های ممتاز'; + + @override + String get statsTopTagsSectionTitle => 'برچسب‌های ممتاز'; + + @override + String get statsTopAlbumsSectionTitle => 'آلبوم‌های ممتاز'; + + @override + String get viewerOpenPanoramaButtonLabel => 'بازکردن پانوراما'; + + @override + String get viewerSetWallpaperButtonLabel => 'تنظیم کاغذدیواری'; + + @override + String get viewerErrorUnknown => 'اوه!'; + + @override + String get viewerErrorDoesNotExist => 'پرونده دیگر موجود نیست.'; + + @override + String get viewerInfoPageTitle => 'ریزگان'; + + @override + String get viewerInfoBackToViewerTooltip => 'بازگشت به نمایش‌گر'; + + @override + String get viewerInfoUnknown => 'ناشناخته'; + + @override + String get viewerInfoLabelDescription => 'پاورقی'; + + @override + String get viewerInfoLabelTitle => 'عنوان'; + + @override + String get viewerInfoLabelDate => 'تاریخ'; + + @override + String get viewerInfoLabelResolution => 'وضوح'; + + @override + String get viewerInfoLabelSize => 'اندازه'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'مسیر'; + + @override + String get viewerInfoLabelDuration => 'مدت'; + + @override + String get viewerInfoLabelOwner => 'مالک'; + + @override + String get viewerInfoLabelCoordinates => 'مختصات'; + + @override + String get viewerInfoLabelAddress => 'نشانی'; + + @override + String get mapStyleDialogTitle => 'حالت نقشه'; + + @override + String get mapStyleDialogAddStyle => 'افزودن حالت'; + + @override + String get mapStyleTooltip => 'انتخاب حالت نقشه'; + + @override + String get mapStyleEditorDialogName => 'نام'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'زیربخش‌ها'; + + @override + String get mapStyleEditorDialogUserAgent => 'نماینده کاربر'; + + @override + String get mapZoomInTooltip => 'بزرگ نمایی'; + + @override + String get mapZoomOutTooltip => 'کوچک نمایی'; + + @override + String get mapPointNorthUpTooltip => 'نقطه شمال در بالا'; + + @override + String get mapAttributionOsmData => 'داده‌های نقشه © [OpenStreetMap](https:www.openstreetmap.org/copyright) مشارکت‌کنندگان'; + + @override + String get mapAttributionOsmLiberty => 'کاشی‌ها به‌دست [OpenMapTiles](https://www.openmaptiles.org/)، [CC BY](http://creativecommons.org/licenses/by/4.0) • میزبانی‌شده به‌دست [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | کاشی‌ها به‌دست [OpenTopoMap](https://opentopomap.org/)، [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'کاشی ها توسط [HOT](https:www.hotosm.org) • میزبانی شده به دست [OSM France](https:openstreetmap.fr)'; + + @override + String get mapAttributionStamen => 'کاشی ها بدست [Stamen Design](https:stamen.com)، [CC BY 3.0](https:creativecommons.orglicensesby3.0)'; + + @override + String get openMapPageTooltip => 'نمایش در صفحه نقشه'; + + @override + String get mapEmptyRegion => 'تصویری در این ناحیه وجود ندارد'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'هیچ تصویری در این منطقه وجود ندارد'; + + @override + String get viewerInfoOpenLinkText => 'بازکردن'; + + @override + String get viewerInfoViewXmlLinkText => 'نمایش XML'; + + @override + String get viewerInfoSearchFieldLabel => 'جستجو فراداده'; + + @override + String get viewerInfoSearchEmpty => 'کلیدی منطبق نشد'; + + @override + String get viewerInfoSearchSuggestionDate => 'تاریخ و زمان'; + + @override + String get viewerInfoSearchSuggestionDescription => 'پاورقی'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'ابعاد'; + + @override + String get viewerInfoSearchSuggestionResolution => 'وضوح'; + + @override + String get viewerInfoSearchSuggestionRights => 'حقوق'; + + @override + String get wallpaperUseScrollEffect => 'استفاده از جلوه پیمایش در صفحه اصلی'; + + @override + String get tagEditorPageTitle => 'ویرایش برچسب ها‌'; + + @override + String get tagEditorPageNewTagFieldLabel => 'برسب جدید'; + + @override + String get tagEditorPageAddTagTooltip => 'افزودن برچسب'; + + @override + String get tagEditorSectionRecent => 'اخیر'; + + @override + String get tagEditorSectionPlaceholders => 'جایگاه متن'; + + @override + String get tagEditorDiscardDialogMessage => 'آیا می خواهید تغییرات را نادیده بگیرید?'; + + @override + String get tagPlaceholderCountry => 'کشور'; + + @override + String get tagPlaceholderState => 'آمار'; + + @override + String get tagPlaceholderPlace => 'مکان'; + + @override + String get panoramaEnableSensorControl => 'روشن کردن هدایت حسگر'; + + @override + String get panoramaDisableSensorControl => 'خاموش کردن هدایت حسگر'; + + @override + String get sourceViewerPageTitle => 'منبع'; +} diff --git a/lib/l10ngen/app_localizations_fi.dart b/lib/l10ngen/app_localizations_fi.dart new file mode 100644 index 0000000..fabd120 --- /dev/null +++ b/lib/l10ngen/app_localizations_fi.dart @@ -0,0 +1,2418 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Finnish (`fi`). +class AppLocalizationsFi extends AppLocalizations { + AppLocalizationsFi([String locale = 'fi']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Tervetuloa Avesiin'; + + @override + String get welcomeOptional => 'Valinnainen'; + + @override + String get welcomeTermsToggle => 'Hyväksyn säännöt ja ehdot'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count kohdetta', + one: '$count kohde', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count saraketta', + one: '$count sarake', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString sekuntia', + one: '$countString sekunti', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minuuttia', + one: '$countString minuutti', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString päivää', + one: '$countString päivä', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'KÄYTÄ'; + + @override + String get createButtonLabel => 'LUO'; + + @override + String get deleteButtonLabel => 'POISTA'; + + @override + String get nextButtonLabel => 'SEURAAVA'; + + @override + String get showButtonLabel => 'NÄYTÄ'; + + @override + String get hideButtonLabel => 'PIILOTA'; + + @override + String get continueButtonLabel => 'JATKA'; + + @override + String get saveCopyButtonLabel => 'TALLENNA KOPIO'; + + @override + String get applyTooltip => 'Käytä'; + + @override + String get cancelTooltip => 'Peruuta'; + + @override + String get changeTooltip => 'Muuta'; + + @override + String get clearTooltip => 'Tyhjennä'; + + @override + String get previousTooltip => 'Edellinen'; + + @override + String get nextTooltip => 'Seuraava'; + + @override + String get showTooltip => 'Näytä'; + + @override + String get hideTooltip => 'Piilota'; + + @override + String get actionRemove => 'Poista'; + + @override + String get resetTooltip => 'Nollaa'; + + @override + String get saveTooltip => 'Tallenna'; + + @override + String get stopTooltip => 'Lopeta'; + + @override + String get pickTooltip => 'Valitse'; + + @override + String get doubleBackExitMessage => 'Poistu painamalla ”takaisin” uudelleen.'; + + @override + String get doNotAskAgain => 'Älä kysy uudestaan'; + + @override + String get sourceStateLoading => 'Ladataan'; + + @override + String get sourceStateCataloguing => 'Luetteloidaan'; + + @override + String get sourceStateLocatingCountries => 'Paikantaa maita'; + + @override + String get sourceStateLocatingPlaces => 'Paikantaa paikkoja'; + + @override + String get chipActionDelete => 'Poista'; + + @override + String get chipActionRemove => 'Poista'; + + @override + String get chipActionShowCollection => 'Näytä kokoelmassa'; + + @override + String get chipActionGoToAlbumPage => 'Näytä albumeissa'; + + @override + String get chipActionGoToCountryPage => 'Näytä maissa'; + + @override + String get chipActionGoToPlacePage => 'Näytä paikoissa'; + + @override + String get chipActionGoToTagPage => 'Näytä tunnisteissa'; + + @override + String get chipActionGoToExplorerPage => 'Näytä tiedostoissa'; + + @override + String get chipActionDecompose => 'Jaa osiin'; + + @override + String get chipActionFilterOut => 'Suodata pois'; + + @override + String get chipActionFilterIn => 'Sisällytä'; + + @override + String get chipActionHide => 'Piilota'; + + @override + String get chipActionLock => 'Lukitse'; + + @override + String get chipActionPin => 'Kiinnitä ylös'; + + @override + String get chipActionUnpin => 'Irrota kiinnitys ylhäältä'; + + @override + String get chipActionGroup => 'Vaihda ryhmittäytymistä'; + + @override + String get chipActionRename => 'Nimeä uudelleen'; + + @override + String get chipActionSetCover => 'Aseta kansikuvaksi'; + + @override + String get chipActionShowCountryStates => 'Näytä maanosat'; + + @override + String get chipActionCreateGroup => 'Luo ryhmä'; + + @override + String get chipActionCreateAlbum => 'Luo albumi'; + + @override + String get chipActionCreateVault => 'Luo holvi'; + + @override + String get chipActionConfigureVault => 'Määritä holvi'; + + @override + String get entryActionCopyToClipboard => 'Kopioi leikepöydälle'; + + @override + String get entryActionDelete => 'Poista'; + + @override + String get entryActionConvert => 'Muunna'; + + @override + String get entryActionExport => 'Vie'; + + @override + String get entryActionInfo => 'Tiedot'; + + @override + String get entryActionRename => 'Nimeä uudelleen'; + + @override + String get entryActionRestore => 'Palauta'; + + @override + String get entryActionRotateCCW => 'Kierrä vastapäivään'; + + @override + String get entryActionRotateCW => 'Kierrä myötäpäivään'; + + @override + String get entryActionFlip => 'Käännä vaakasuorassa'; + + @override + String get entryActionPrint => 'Tulosta'; + + @override + String get entryActionShare => 'Jaa'; + + @override + String get entryActionShareImageOnly => 'Jaa vain kuva'; + + @override + String get entryActionShareVideoOnly => 'Jaa vain video'; + + @override + String get entryActionViewSource => 'Näytä lähde'; + + @override + String get entryActionShowGeoTiffOnMap => 'Näytä kartan peittokuvana'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Muunna still-kuvaksi'; + + @override + String get entryActionViewMotionPhotoVideo => 'Avaa video'; + + @override + String get entryActionEdit => 'Muokkaa'; + + @override + String get entryActionOpen => 'Avaa sovelluksessa'; + + @override + String get entryActionSetAs => 'Aseta'; + + @override + String get entryActionCast => 'Peilaa'; + + @override + String get entryActionOpenMap => 'Näytä karttasovelluksessa'; + + @override + String get entryActionRotateScreen => 'Kierrä näyttöä'; + + @override + String get entryActionAddFavourite => 'Lisää suosikkeihin'; + + @override + String get entryActionRemoveFavourite => 'Poista suosikeista'; + + @override + String get videoActionCaptureFrame => 'Kaappaa kuva'; + + @override + String get videoActionMute => 'Mykistä'; + + @override + String get videoActionUnmute => 'Poista mykistys'; + + @override + String get videoActionPause => 'Tauko'; + + @override + String get videoActionPlay => 'Toista'; + + @override + String get videoActionReplay10 => 'Kelaa taaksepäin 10 sekuntia'; + + @override + String get videoActionSkip10 => 'Siirry eteenpäin 10 sekuntia'; + + @override + String get videoActionShowPreviousFrame => 'Näytä aikaisempi kuvaruutu'; + + @override + String get videoActionShowNextFrame => 'Näytä seuraava kuvaruutu'; + + @override + String get videoActionSelectStreams => 'Valitse kieliraita'; + + @override + String get videoActionSetSpeed => 'Toistonopeus'; + + @override + String get videoActionABRepeat => 'A-B toisto'; + + @override + String get videoRepeatActionSetStart => 'Aseta alku'; + + @override + String get videoRepeatActionSetEnd => 'Aseta loppu'; + + @override + String get viewerActionSettings => 'Asetukset'; + + @override + String get viewerActionLock => 'Lukitse katselu'; + + @override + String get viewerActionUnlock => 'Avaa katselun lukitus'; + + @override + String get slideshowActionResume => 'Jatka'; + + @override + String get slideshowActionShowInCollection => 'Näytä kokoelmassa'; + + @override + String get entryInfoActionEditDate => 'Muokkaa päivämäärää & aikaa'; + + @override + String get entryInfoActionEditLocation => 'Muokkaa sijaintia'; + + @override + String get entryInfoActionEditTitleDescription => 'Muokkaa otsikkoa & kuvausta'; + + @override + String get entryInfoActionEditRating => 'Muokkaa arviota'; + + @override + String get entryInfoActionEditTags => 'Muokkaa tunnisteita'; + + @override + String get entryInfoActionRemoveMetadata => 'Poista metatiedot'; + + @override + String get entryInfoActionExportMetadata => 'Vie metatiedot'; + + @override + String get entryInfoActionRemoveLocation => 'Poista sijainti'; + + @override + String get editorActionTransform => 'Muunna'; + + @override + String get editorTransformCrop => 'Rajaa'; + + @override + String get editorTransformRotate => 'Kierrä'; + + @override + String get cropAspectRatioFree => 'Vapaa'; + + @override + String get cropAspectRatioOriginal => 'Alkuperäinen'; + + @override + String get cropAspectRatioSquare => 'Neliö'; + + @override + String get filterAspectRatioLandscapeLabel => 'Vaakakuvat'; + + @override + String get filterAspectRatioPortraitLabel => 'Pystykuvat'; + + @override + String get filterBinLabel => 'Roskakori'; + + @override + String get filterFavouriteLabel => 'Suosikki'; + + @override + String get filterNoDateLabel => 'Päiväämätön'; + + @override + String get filterNoAddressLabel => 'Ei osoitetta'; + + @override + String get filterLocatedLabel => 'Paikannettu'; + + @override + String get filterNoLocationLabel => 'Paikantomaton'; + + @override + String get filterNoRatingLabel => 'Luokittelematon'; + + @override + String get filterTaggedLabel => 'Tunnisteella merkitty'; + + @override + String get filterNoTagLabel => 'Tunnisteella merkitsemätön'; + + @override + String get filterNoTitleLabel => 'Nimetön'; + + @override + String get filterOnThisDayLabel => 'Tänään'; + + @override + String get filterRecentlyAddedLabel => 'Viimeksi lisätyt'; + + @override + String get filterRatingRejectedLabel => 'Hylätyt'; + + @override + String get filterTypeAnimatedLabel => 'Animoitu'; + + @override + String get filterTypeMotionPhotoLabel => 'Liikevalokuva'; + + @override + String get filterTypePanoramaLabel => 'Panoraamakuva'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Kuva'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Estä näytön tehosteet'; + + @override + String get accessibilityAnimationsKeep => 'Säilytä näytön tehosteet'; + + @override + String get albumTierNew => 'Uusi'; + + @override + String get albumTierPinned => 'Kiinnitetty'; + + @override + String get albumTierGroups => 'Ryhmät'; + + @override + String get albumTierSpecial => 'Yleiset'; + + @override + String get albumTierApps => 'Sovellukset'; + + @override + String get albumTierVaults => 'Holvit'; + + @override + String get albumTierDynamic => 'Dynaamiset albumit'; + + @override + String get albumTierRegular => 'Muut'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Desimaaliasteet'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'P'; + + @override + String get coordinateDmsSouth => 'E'; + + @override + String get coordinateDmsEast => 'I'; + + @override + String get coordinateDmsWest => 'L'; + + @override + String get displayRefreshRatePreferHighest => 'Korkein päivitysnopeus'; + + @override + String get displayRefreshRatePreferLowest => 'Matalin virkistystaajuus'; + + @override + String get keepScreenOnNever => 'Ei koskaan'; + + @override + String get keepScreenOnVideoPlayback => 'Videon toiston aikana'; + + @override + String get keepScreenOnViewerOnly => 'Vain katselusivulla'; + + @override + String get keepScreenOnAlways => 'Aina'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Satelliitti+kadut )'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Maasto)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (akvarelli)'; + + @override + String get maxBrightnessNever => 'Ei koskaan'; + + @override + String get maxBrightnessAlways => 'Aina'; + + @override + String get nameConflictStrategyRename => 'Nimeä uudelleen'; + + @override + String get nameConflictStrategyReplace => 'Korvaa'; + + @override + String get nameConflictStrategySkip => 'Ohita'; + + @override + String get overlayHistogramNone => 'Ei mitään'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminanssi'; + + @override + String get subtitlePositionTop => 'Ylhäällä'; + + @override + String get subtitlePositionBottom => 'Alhaalla'; + + @override + String get themeBrightnessLight => 'Vaalea'; + + @override + String get themeBrightnessDark => 'Tumma'; + + @override + String get themeBrightnessBlack => 'Musta'; + + @override + String get unitSystemMetric => 'Metrijärjestelmä'; + + @override + String get unitSystemImperial => 'Mailijärjestelmä'; + + @override + String get vaultLockTypePattern => 'Kuvio'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Salasana'; + + @override + String get settingsVideoEnablePip => 'Kuva kuvassa'; + + @override + String get videoControlsPlayOutside => 'Avaa toisella soittimella'; + + @override + String get videoLoopModeNever => 'Ei koskaan'; + + @override + String get videoLoopModeShortOnly => 'Vain lyhyet videot'; + + @override + String get videoLoopModeAlways => 'Aina'; + + @override + String get videoPlaybackSkip => 'Ohita'; + + @override + String get videoPlaybackMuted => 'Toista mykistettynä'; + + @override + String get videoPlaybackWithSound => 'Toista äänillä'; + + @override + String get videoResumptionModeNever => 'Ei koskaan'; + + @override + String get videoResumptionModeAlways => 'Aina'; + + @override + String get viewerTransitionSlide => 'Liu’uta'; + + @override + String get viewerTransitionParallax => 'Parallaksi'; + + @override + String get viewerTransitionFade => 'Häivytä'; + + @override + String get viewerTransitionZoomIn => 'Suurenna'; + + @override + String get viewerTransitionNone => 'Ei mitään'; + + @override + String get wallpaperTargetHome => 'Kotinäyttö'; + + @override + String get wallpaperTargetLock => 'Lukitusnäyttö'; + + @override + String get wallpaperTargetHomeLock => 'Koti- ja lukitusnäyttö'; + + @override + String get widgetDisplayedItemRandom => 'Satunnainen'; + + @override + String get widgetDisplayedItemMostRecent => 'Viimeisin'; + + @override + String get widgetOpenPageHome => 'Avaa aloitussivu'; + + @override + String get widgetOpenPageCollection => 'Avaa kokoelma'; + + @override + String get widgetOpenPageViewer => 'Avaa katseluohjelma'; + + @override + String get widgetTapUpdateWidget => 'Päivitä widgetti'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Sisäinen tallennustila'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD-kortti'; + + @override + String get rootDirectoryDescription => 'juurihakemisto'; + + @override + String otherDirectoryDescription(String name) { + return '”$name” hakemisto'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Valitse ”$volume” muistin $directory hakemisto seuraavassa ruudussa antaaksesi tälle sovellukselle luvan käyttää sitä.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Tälle sovellukselle ei ole sallittu tiedostojen muuttamista ”$volume” muistin $directory hakemistossa.\n\nKäytä toista tiedostonhallinta tai galleria sovellusta siirtääksesi tiedostot toiseen hakemistoon.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Tämä operaatio vaatii $neededSize vapaata tilaa muistissa ”$volume” suoriutuakseen, mutta tilaa on vain $freeSize jäljellä.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Järjestelmän tiedostonvalitsin puuttuu tai on poistettu käytöstä. Aktivoi se ja yritä uudelleen.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Tätä toimintoa ei tueta seuraavan tyyppisille objekteille: $types.', + one: 'Tämä toiminto ei ole tuettu tämän tyyppisille objekteille: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Joillakin kohdekansion tiedostoilla on sama nimi.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Joillakin tiedostoilla on sama nimi.'; + + @override + String get addShortcutDialogLabel => 'Pikakuvakkeen nimi'; + + @override + String get addShortcutButtonLabel => 'LISÄÄ'; + + @override + String get noMatchingAppDialogMessage => 'Ei löydy sovelluksia jotka voisivat tehdä tämän.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Siirretäänkö nämä $countString tiedostoa roskakoriin?', + one: 'Siirrä tämä tiedosto roskakoriin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Poista nämä $countString tiedostoa pysyvästi?', + one: 'Poista tämä tiedosto pysyvästi?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Tallennetaanko tiedoston päivämäärä(t) ennen jatkamista?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Tallenna päivämäärät'; + + @override + String videoResumeDialogMessage(String time) { + return 'Haluatko jatkaa toistamista kohdasta $time?'; + } + + @override + String get videoStartOverButtonLabel => 'ALOITA ALUSTA'; + + @override + String get videoResumeButtonLabel => 'JATKA'; + + @override + String get setCoverDialogLatest => 'Viimeisin kohde'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Mukautettu'; + + @override + String get hideFilterConfirmationDialogMessage => 'Vastaavat kuvat ja videot piilotetaan kokoelmastasi. Voit saada ne näkymään uudestaan ”Yksityisyys” asetuksista.\n\nHaluatko varmasti piilottaa ne?'; + + @override + String get newAlbumDialogTitle => 'Uusi Albumi'; + + @override + String get newAlbumDialogNameLabel => 'Albumin nimi'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Albumi on jo olemassa'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Hakemisto on jo olemassa'; + + @override + String get newAlbumDialogStorageLabel => 'Muisti:'; + + @override + String get newDynamicAlbumDialogTitle => 'Uusi Dynaaminen Albumi'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynaaminen albumi on jo olemassa'; + + @override + String get newGroupDialogTitle => 'Uusi Ryhmä'; + + @override + String get newGroupDialogNameLabel => 'Ryhmän nimi'; + + @override + String get groupAlreadyExists => 'Ryhmä on jo olemassa'; + + @override + String get groupEmpty => 'Ei ryhmiä'; + + @override + String get ungrouped => 'Ryhmittelemättömät'; + + @override + String get groupPickerTitle => 'Valitse Ryhmä'; + + @override + String get groupPickerUseThisGroupButton => 'Käytä tätä ryhmää'; + + @override + String get newVaultWarningDialogMessage => 'Kuvat ja videot holveissa on saatavilla ainoastaan tässä sovelluksessa.\n\nJos poistat tämän sovelluksen, tai poistat sovelluksen tiedot, menetät kaikki nämä kohteet.'; + + @override + String get newVaultDialogTitle => 'Uusi Holvi'; + + @override + String get configureVaultDialogTitle => 'Määrittele Holvi'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lukitse kun näyttö sammuu'; + + @override + String get vaultDialogLockTypeLabel => 'Lukitustyyppi'; + + @override + String get patternDialogEnter => 'Syötä kuvio'; + + @override + String get patternDialogConfirm => 'Vahvista kuvio'; + + @override + String get pinDialogEnter => 'Syötä PIN'; + + @override + String get pinDialogConfirm => 'Vahvista PIN'; + + @override + String get passwordDialogEnter => 'Syötä salasana'; + + @override + String get passwordDialogConfirm => 'Vahvista salasana'; + + @override + String get authenticateToConfigureVault => 'Todenna määrittääksesi holvin'; + + @override + String get authenticateToUnlockVault => 'Todenna avataksesi holvin'; + + @override + String get vaultBinUsageDialogMessage => 'Jotkut holveistä käyttää roskakoria.'; + + @override + String get renameAlbumDialogLabel => 'Uusi nimi'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Hakemisto on jo olemassa'; + + @override + String get renameEntrySetPageTitle => 'Nimeä uudelleen'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Nimeämismalli'; + + @override + String get renameEntrySetPageInsertTooltip => 'Lisää kenttä'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Esikatselu'; + + @override + String get renameProcessorCounter => 'Laskin'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Nimi'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Poista tämä albumi ja $countString kohdetta sen sisällä?', + one: 'Poista tämä albumi ja kohteet sen sisällä?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Poista nämä albumit ja $countString kohdetta niiden sisällä?', + one: 'Poista nämä albumit ja kohteet niiden sisällä?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Formaatti:'; + + @override + String get exportEntryDialogWidth => 'Leveys'; + + @override + String get exportEntryDialogHeight => 'Korkeus'; + + @override + String get exportEntryDialogQuality => 'Laatu'; + + @override + String get exportEntryDialogWriteMetadata => 'Kirjoita metadata'; + + @override + String get renameEntryDialogLabel => 'Uusi nimi'; + + @override + String get editEntryDialogCopyFromItem => 'Kopioi toisesta kohteesta'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Muutettavat kentät'; + + @override + String get editEntryDateDialogTitle => 'Päivä & Aika'; + + @override + String get editEntryDateDialogSetCustom => 'Aseta mukautettu päivä'; + + @override + String get editEntryDateDialogCopyField => 'Kopioi toisesta päivästä'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Kopioi otsikosta'; + + @override + String get editEntryDateDialogShift => 'Vaihda'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Kohteen muokkauspäivä'; + + @override + String get durationDialogHours => 'Tunnit'; + + @override + String get durationDialogMinutes => 'Minuutit'; + + @override + String get durationDialogSeconds => 'Sekuntit'; + + @override + String get editEntryLocationDialogTitle => 'Sijainti'; + + @override + String get editEntryLocationDialogSetCustom => 'Aseta mukautettu sijainti'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Valitse kartalta'; + + @override + String get editEntryLocationDialogImportGpx => 'Tuo GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Leveyspiiri'; + + @override + String get editEntryLocationDialogLongitude => 'Pituuspiiri'; + + @override + String get editEntryLocationDialogTimeShift => 'Aikasiirto'; + + @override + String get locationPickerUseThisLocationButton => 'Käytä tätä sijaintia'; + + @override + String get editEntryRatingDialogTitle => 'Arvio'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadatan Poisto'; + + @override + String get removeEntryMetadataDialogAll => 'Kaikki'; + + @override + String get removeEntryMetadataDialogMore => 'Lisää'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP vaaditaan videon toistamiseen liikevalokuvassa.\n\nOletko varma että haluat poistaa sen?'; + + @override + String get videoSpeedDialogLabel => 'Toistonopeus'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Ääni'; + + @override + String get videoStreamSelectionDialogText => 'Tekstitys'; + + @override + String get videoStreamSelectionDialogOff => 'Pois'; + + @override + String get videoStreamSelectionDialogTrack => 'Ääniraita'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Ei löydy muita ääniraitoja.'; + + @override + String get genericSuccessFeedback => 'Tehty!'; + + @override + String get genericFailureFeedback => 'Epäonnistui'; + + @override + String get genericDangerWarningDialogMessage => 'Oletko varma?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Yritä uudestaan pienemmällä määrällä kohteita.'; + + @override + String get menuActionConfigureView => 'Näytä'; + + @override + String get menuActionSelect => 'Valitse'; + + @override + String get menuActionSelectAll => 'Valitse kaikki'; + + @override + String get menuActionSelectNone => 'Älä valitse mitään'; + + @override + String get menuActionMap => 'Kartta'; + + @override + String get menuActionSlideshow => 'Kuvakaruselli'; + + @override + String get menuActionStats => 'Tilastot'; + + @override + String get viewDialogSortSectionTitle => 'Järjestä'; + + @override + String get viewDialogGroupSectionTitle => 'Osiot'; + + @override + String get viewDialogLayoutSectionTitle => 'Asettelu'; + + @override + String get viewDialogReverseSortOrder => 'Käänteinen järjestys'; + + @override + String get tileLayoutMosaic => 'Mosaiikki'; + + @override + String get tileLayoutGrid => 'Ruudukko'; + + @override + String get tileLayoutList => 'Lista'; + + @override + String get castDialogTitle => 'Suoratoistolaitteet'; + + @override + String get coverDialogTabCover => 'Kansi'; + + @override + String get coverDialogTabApp => 'Sovellus'; + + @override + String get coverDialogTabColor => 'Väri'; + + @override + String get appPickDialogTitle => 'Valitse Sovellus'; + + @override + String get appPickDialogNone => 'Ei mitään'; + + @override + String get aboutPageTitle => 'Tietoa'; + + @override + String get aboutLinkLicense => 'Lisenssi'; + + @override + String get aboutLinkPolicy => 'Yksityisyyskäytäntö'; + + @override + String get aboutBugSectionTitle => 'Ohjelmointivirhe raportti'; + + @override + String get aboutBugSaveLogInstruction => 'Tallenna sovelluksen lokitiedot'; + + @override + String get aboutBugCopyInfoInstruction => 'Kopioi järjestelmän tiedot'; + + @override + String get aboutBugCopyInfoButton => 'Kopioi'; + + @override + String get aboutBugReportInstruction => 'Raportoi GitHub:issa sovelluksen lokitiedoilla ja järjestelmän tiedoilla'; + + @override + String get aboutBugReportButton => 'Raportoi'; + + @override + String get aboutDataUsageSectionTitle => 'Datan Käyttö'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Välimuisti'; + + @override + String get aboutDataUsageDatabase => 'Tietokanta'; + + @override + String get aboutDataUsageMisc => 'Muut'; + + @override + String get aboutDataUsageInternal => 'Sisäinen'; + + @override + String get aboutDataUsageExternal => 'Ulkoinen'; + + @override + String get aboutDataUsageClearCache => 'Tyhjennä Välimuisti'; + + @override + String get aboutCreditsSectionTitle => 'Krediitit'; + + @override + String get aboutCreditsWorldAtlas1 => 'Tämä sovellus käyttää TopoJSON tiedostoa lähteestä'; + + @override + String get aboutCreditsWorldAtlas2 => 'ISC-lisenssillä.'; + + @override + String get aboutTranslatorsSectionTitle => 'Kääntäjät'; + + @override + String get aboutLicensesSectionTitle => 'Avoimen Lähdekoodin Lisenssit'; + + @override + String get aboutLicensesBanner => 'Tämä sovellus käyttää seuraavia avoimen lähdekoodin paketteja ja kirjastoja.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Kirjastot'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Lisäosat'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Paketit'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Paketit'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Näytä Kaikki Lisenssit'; + + @override + String get policyPageTitle => 'Yksityisyyskäytäntö'; + + @override + String get collectionPageTitle => 'Kokoelma'; + + @override + String get collectionPickPageTitle => 'Valitse'; + + @override + String get collectionSelectPageTitle => 'Valitse kohteet'; + + @override + String get collectionActionShowTitleSearch => 'Näytä otsikko suodatin'; + + @override + String get collectionActionHideTitleSearch => 'Piilota otsikko suodatin'; + + @override + String get collectionActionAddDynamicAlbum => 'Luo dynaaminen albumi'; + + @override + String get collectionActionAddShortcut => 'Luo pikakuvake'; + + @override + String get collectionActionSetHome => 'Aseta aloitussivuksi'; + + @override + String get collectionActionEmptyBin => 'Tyhjennä roskakori'; + + @override + String get collectionActionCopy => 'Kopioi albumiin'; + + @override + String get collectionActionMove => 'Siirrä albumiin'; + + @override + String get collectionActionRescan => 'Skannaa uudestaan'; + + @override + String get collectionActionEdit => 'Muokkaa'; + + @override + String get collectionSearchTitlesHintText => 'Etsi otsikoita'; + + @override + String get collectionGroupAlbum => 'Albumien mukaan'; + + @override + String get collectionGroupMonth => 'Kuukauden mukaan'; + + @override + String get collectionGroupDay => 'Päivän mukaan'; + + @override + String get sectionNone => 'Ei osioita'; + + @override + String get sectionUnknown => 'Tuntematon'; + + @override + String get dateToday => 'Tänään'; + + @override + String get dateYesterday => 'Eilen'; + + @override + String get dateThisMonth => 'Tässä kuussa'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString kohteen poisto epäonnistui', + one: '1 kohteen poisto epäonnistui', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString kohteen kopiointi epäonnistui', + one: '1 kohteen kopiointi epäonnistui', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString kohteen siirto epäonnistui', + one: '1 kohteen siirto epäonnistui', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString kohteen uudelleennimeäminen epäonnistui', + one: '1 kohteen uudelleennimeäminen epäonnistui', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString kohteen muokkaaminen epäonnistui', + one: '1 kohteen muokkaaminen epäonnistui', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString sivun vienti epäonnistui', + one: '1 sivun vienti epäonnistui', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString kohdetta kopioitu', + one: '1 kohde kopioitu', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString kohdetta siirretty', + one: '1 kohde siirretty', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString kohdetta nimetty uudelleen', + one: '1 kohde nimetty uudelleen', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString kohdetta muokattu', + one: '1 kohde muokattu', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Ei suosikkeja'; + + @override + String get collectionEmptyVideos => 'Ei videoita'; + + @override + String get collectionEmptyImages => 'Ei kuvia'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Myönnä käyttöoikeus'; + + @override + String get collectionSelectSectionTooltip => 'Valitse osa'; + + @override + String get collectionDeselectSectionTooltip => 'Poista osan valinta'; + + @override + String get drawerAboutButton => 'Tietoa'; + + @override + String get drawerSettingsButton => 'Asetukset'; + + @override + String get drawerCollectionAll => 'Kaikki kokoelmat'; + + @override + String get drawerCollectionFavourites => 'Suosikit'; + + @override + String get drawerCollectionImages => 'Kuvat'; + + @override + String get drawerCollectionVideos => 'Videot'; + + @override + String get drawerCollectionAnimated => 'Animaatiot'; + + @override + String get drawerCollectionMotionPhotos => 'Liikevalokuvat'; + + @override + String get drawerCollectionPanoramas => 'Panoraamat'; + + @override + String get drawerCollectionRaws => 'Raw kuvat'; + + @override + String get drawerCollectionSphericalVideos => '360° Videot'; + + @override + String get drawerAlbumPage => 'Albumit'; + + @override + String get drawerCountryPage => 'Maat'; + + @override + String get drawerPlacePage => 'Paikat'; + + @override + String get drawerTagPage => 'Tunnisteet'; + + @override + String get sortByDate => 'Päivyksen mukaan'; + + @override + String get sortByName => 'Nimen mukaan'; + + @override + String get sortByItemCount => 'Kohteiden määrän mukaan'; + + @override + String get sortBySize => 'Koon mukaan'; + + @override + String get sortByAlbumFileName => 'Albumin & otsikon mukaan'; + + @override + String get sortByRating => 'Arvion mukaan'; + + @override + String get sortByDuration => 'Keston mukaan'; + + @override + String get sortByPath => 'Polun mukaan'; + + @override + String get sortOrderNewestFirst => 'Uusin ensin'; + + @override + String get sortOrderOldestFirst => 'Vanhin ensin'; + + @override + String get sortOrderAtoZ => 'A:sta Z:aan'; + + @override + String get sortOrderZtoA => 'Z:sta A:han'; + + @override + String get sortOrderHighestFirst => 'Korkein ensin'; + + @override + String get sortOrderLowestFirst => 'Matalin ensin'; + + @override + String get sortOrderLargestFirst => 'Suurin ensin'; + + @override + String get sortOrderSmallestFirst => 'Pienin ensin'; + + @override + String get sortOrderShortestFirst => 'Lyhyin ensin'; + + @override + String get sortOrderLongestFirst => 'Pisin ensin'; + + @override + String get albumGroupTier => 'Tason mukaan'; + + @override + String get albumGroupType => 'Tyypin mukaan'; + + @override + String get albumGroupVolume => 'Muistin koon mukaan'; + + @override + String get albumMimeTypeMixed => 'Sekoitettu'; + + @override + String get albumPickPageTitleCopy => 'Kopioi Albumiin'; + + @override + String get albumPickPageTitleExport => 'Vie Albumiin'; + + @override + String get albumPickPageTitleMove => 'Siirrä Albumiin'; + + @override + String get albumPickPageTitlePick => 'Valitse Albumi'; + + @override + String get albumCamera => 'Kamera'; + + @override + String get albumDownload => 'Lataa'; + + @override + String get albumScreenshots => 'Kuvakaappaukset'; + + @override + String get albumScreenRecordings => 'Näyttötallenteet'; + + @override + String get albumVideoCaptures => 'Video Tallenteet'; + + @override + String get albumPageTitle => 'Albumit'; + + @override + String get albumEmpty => 'Ei albumeita'; + + @override + String get createAlbumButtonLabel => 'LUO'; + + @override + String get newFilterBanner => 'uusi'; + + @override + String get countryPageTitle => 'Maat'; + + @override + String get countryEmpty => 'Ei maita'; + + @override + String get statePageTitle => 'Maanosat'; + + @override + String get stateEmpty => 'Ei maanosia'; + + @override + String get placePageTitle => 'Paikat'; + + @override + String get placeEmpty => 'Ei paikkoja'; + + @override + String get tagPageTitle => 'Tunnisteet'; + + @override + String get tagEmpty => 'Ei tunnisteita'; + + @override + String get tagPickPageTitle => 'Valitse Tunniste'; + + @override + String get binPageTitle => 'Roskakori'; + + @override + String get explorerPageTitle => 'Tiedostot'; + + @override + String get explorerActionSelectStorageVolume => 'Valitse tallennustila'; + + @override + String get selectStorageVolumeDialogTitle => 'Valitse Tallennustila'; + + @override + String get searchCollectionFieldHint => 'Etsi kokoelmasta'; + + @override + String get searchRecentSectionTitle => 'Viimeaikaiset'; + + @override + String get searchDateSectionTitle => 'Päiväys'; + + @override + String get searchFormatSectionTitle => 'Formaatit'; + + @override + String get searchAlbumsSectionTitle => 'Albumit'; + + @override + String get searchCountriesSectionTitle => 'Maat'; + + @override + String get searchStatesSectionTitle => 'Maanosat'; + + @override + String get searchPlacesSectionTitle => 'Paikat'; + + @override + String get searchTagsSectionTitle => 'Tunnisteet'; + + @override + String get searchRatingSectionTitle => 'Arviot'; + + @override + String get searchMetadataSectionTitle => 'Metatiedot'; + + @override + String get settingsPageTitle => 'Asetukset'; + + @override + String get settingsSystemDefault => 'Järjestelmän oletus'; + + @override + String get settingsDefault => 'Oletus'; + + @override + String get settingsDisabled => 'Poistettu käytöstä'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Kysy joka kerta'; + + @override + String get settingsModificationWarningDialogMessage => 'Muita asetuksia tullaan muuttamaan.'; + + @override + String get settingsSearchFieldLabel => 'Etsi asetuksista'; + + @override + String get settingsSearchEmpty => 'Ei vastaavia asetuksia'; + + @override + String get settingsActionExport => 'Vie'; + + @override + String get settingsActionExportDialogTitle => 'Vie'; + + @override + String get settingsActionImport => 'Tuo'; + + @override + String get settingsActionImportDialogTitle => 'Tuo'; + + @override + String get appExportCovers => 'Kansikuvat'; + + @override + String get appExportDynamicAlbums => 'Dynaamiset albumit'; + + @override + String get appExportFavourites => 'Suosikit'; + + @override + String get appExportSettings => 'Asetukset'; + + @override + String get settingsNavigationSectionTitle => 'Navigaatio'; + + @override + String get settingsHomeTile => 'Aloitussivu'; + + @override + String get settingsHomeDialogTitle => 'Aloitussivu'; + + @override + String get setHomeCustom => 'Mukautettu'; + + @override + String get settingsKeepScreenOnTile => 'Pidä näyttö päällä'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Pidä Näyttö Päällä'; + + @override + String get settingsDoubleBackExit => 'Paina ”takaisin” kahdesti poistuaksesi'; + + @override + String get settingsConfirmationTile => 'Vahvistusikkunat'; + + @override + String get settingsConfirmationDialogTitle => 'Vahvistusikkunat'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Kysy ennen kohteiden poistoa pysyvästi'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Kysy ennen kohteiden siirtämistä roskakoriin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Kysy ennen päiväämättömien kohteiden siirtämistä'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Näytä viesti kohteiden roskakoriin siirtämisen jälkeen'; + + @override + String get settingsConfirmationVaultDataLoss => 'Näytä holvin datan menettämisen varoitus'; + + @override + String get settingsNavigationDrawerTile => 'Navigaatiovalikko'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigaatiovalikko'; + + @override + String get settingsNavigationDrawerBanner => 'Kosketa ja pidä pohjassa siirtääksesi ja uudelleen järjestelläksesi valikon kohteita.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Lajit'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albumit'; + + @override + String get settingsNavigationDrawerTabPages => 'Sivut'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Lisää albumi'; + + @override + String get settingsNavigationBottomActionsTile => 'Alapalkin painikkeet'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Alapalkin Painikkeet'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Kosketa ja pidä pohjassa liikuttaaksesi painikkeita ja valitse mitkä toiminnot näytetään alapalkissa.'; + + @override + String get settingsThumbnailSectionTitle => 'Pienet näytekuvat'; + + @override + String get settingsThumbnailOverlayTile => 'Peitekuvakkeet'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Peitekuvakkeet'; + + @override + String get settingsThumbnailShowHdrIcon => 'Näytä HDR kuvake'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Näytä suosikki kuvake'; + + @override + String get settingsThumbnailShowTagIcon => 'Näytä tunniste kuvake'; + + @override + String get settingsThumbnailShowLocationIcon => 'Näytä sijainti kuvake'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Näytä liikevalokuva kuvake'; + + @override + String get settingsThumbnailShowRating => 'Näytä arvio'; + + @override + String get settingsThumbnailShowRawIcon => 'Näytä raw kuvake'; + + @override + String get settingsThumbnailShowVideoDuration => 'Näytä videon kesto'; + + @override + String get settingsCollectionQuickActionsTile => 'Pikatoiminnot'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Pikatoiminnot'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Selaaminen'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Valitseminen'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Koske ja pidä pohjassa liikuttaaksesi painikkeita ja valitse mitkä toiminnot näytetään kohteita selatessa.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Koske ja pidä pohjassa liikuttaaksesi painikkeita ja valitaksesi mitkä toiminnot näytetään kun valitaan kohteita.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Monikuvien kuviot'; + + @override + String get settingsCollectionBurstPatternsNone => 'Ei mitään'; + + @override + String get settingsViewerSectionTitle => 'Kuvaselain'; + + @override + String get settingsViewerGestureSideTapNext => 'Paina näytön reunasta näyttääksesi edellisen/seuraavan kohteen'; + + @override + String get settingsViewerUseCutout => 'Käytä tilapalkin aluetta'; + + @override + String get settingsViewerMaximumBrightness => 'Ylin kirkkaustaso'; + + @override + String get settingsMotionPhotoAutoPlay => 'Automaattisesti toista liikevalokuvat'; + + @override + String get settingsImageBackground => 'Kuvien taustaväri'; + + @override + String get settingsViewerQuickActionsTile => 'Pikatoiminnot'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Pikatoiminnot'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Kosketa ja pidä pohjassa liikuttaaksesi painikkeita ja valitaksesi mitkä toiminnot näytetään kuvaselaimessa.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Käytössä olevat painikkeet'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Saatavilla olevat painikkeet'; + + @override + String get settingsViewerQuickActionEmpty => 'Ei painikkeita'; + + @override + String get settingsViewerOverlayTile => 'Peitekuvakkeet'; + + @override + String get settingsViewerOverlayPageTitle => 'Peitekuvakkeet'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Näytä avatessa'; + + @override + String get settingsViewerShowHistogram => 'Näytä histogrammi'; + + @override + String get settingsViewerShowMinimap => 'Näytä pienoiskartta'; + + @override + String get settingsViewerShowZoomLevel => 'Näytä suurennuksen taso'; + + @override + String get settingsViewerShowInformation => 'Näytä tiedot'; + + @override + String get settingsViewerShowInformationSubtitle => 'Näytä otsikko, päiväys, sijainti, jne.'; + + @override + String get settingsViewerShowRatingTags => 'Näytä arvio & tunnisteet'; + + @override + String get settingsViewerShowShootingDetails => 'Näytä valokuvaus tiedot'; + + @override + String get settingsViewerShowDescription => 'Näytä kuvaus'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Näytä pienet näytekuvat'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Sumennus efekti'; + + @override + String get settingsViewerSlideshowTile => 'Kuvakarusellit'; + + @override + String get settingsViewerSlideshowPageTitle => 'Kuvakaruselli'; + + @override + String get settingsSlideshowRepeat => 'Toista'; + + @override + String get settingsSlideshowShuffle => 'Sekoita'; + + @override + String get settingsSlideshowFillScreen => 'Täytä näyttö'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animoitu zoom-efekti'; + + @override + String get settingsSlideshowTransitionTile => 'Siirtymät'; + + @override + String get settingsSlideshowIntervalTile => 'Aikaväli'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Videon toisto'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Videon Toisto'; + + @override + String get settingsVideoPageTitle => 'Video Asetukset'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Näytä videot'; + + @override + String get settingsVideoPlaybackTile => 'Toisto'; + + @override + String get settingsVideoPlaybackPageTitle => 'Toisto'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Laitteistokiihdytys'; + + @override + String get settingsVideoAutoPlay => 'Automaattinen toisto'; + + @override + String get settingsVideoLoopModeTile => 'Jatkuva toisto'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Jatkuva Toisto'; + + @override + String get settingsVideoResumptionModeTile => 'Jatka toistamista'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Jatka Toistamista'; + + @override + String get settingsVideoBackgroundMode => 'Taustalla-tila'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Taustalla-tila'; + + @override + String get settingsVideoControlsTile => 'Kontrollit'; + + @override + String get settingsVideoControlsPageTitle => 'Kontrollit'; + + @override + String get settingsVideoButtonsTile => 'Painikkeet'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Tuplanapauta toistaaksesi/pysäyttääksesi'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Tuplanapauta näytön reunaa siirtyäksesi taaksepäin/eteenpäin'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Vedä ylös tai alas muuttaksesi kirkkautta/äänenvoimakkuutta'; + + @override + String get settingsSubtitleThemeTile => 'Tekstitys'; + + @override + String get settingsSubtitleThemePageTitle => 'Tekstitys'; + + @override + String get settingsSubtitleThemeSample => 'Tässä on esimerkki.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Tekstin kohdistus'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Tekstin Kohdistus'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Tekstin sijainti'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Tekstin Sijainti'; + + @override + String get settingsSubtitleThemeTextSize => 'Tekstin koko'; + + @override + String get settingsSubtitleThemeShowOutline => 'Näytä reunukset ja varjo'; + + @override + String get settingsSubtitleThemeTextColor => 'Tekstin väri'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Tekstin läpinäkyvyys'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Taustan väri'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Taustan läpinäkyvyys'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Vasemmalla'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Keskellä'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Oikealla'; + + @override + String get settingsPrivacySectionTitle => 'Yksityisyys'; + + @override + String get settingsAllowInstalledAppAccess => 'Salli pääsy sovellusluetteloon'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Käytetään albumi näkymän parantamiseen'; + + @override + String get settingsAllowErrorReporting => 'Salli anonyymi virhetietojen raportointi'; + + @override + String get settingsSaveSearchHistory => 'Tallenna hakuhistoria'; + + @override + String get settingsEnableBin => 'Käytä roskakoria'; + + @override + String get settingsEnableBinSubtitle => 'Säilytä poistetut tiedostot 30 päivän ajan'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Kohteet roskakorissa poistetaan pysyvästi.'; + + @override + String get settingsAllowMediaManagement => 'Salli median hallinta'; + + @override + String get settingsHiddenItemsTile => 'Piilotetut kohteet'; + + @override + String get settingsHiddenItemsPageTitle => 'Piilotetut Kohteet'; + + @override + String get settingsHiddenFiltersBanner => 'Piilotettuja suodattimia vastaavat kuvat ja videot eivät näy kokoelmassasi.'; + + @override + String get settingsHiddenFiltersEmpty => 'Ei piilotettuja suodattimia'; + + @override + String get settingsStorageAccessTile => 'Tallennustilan käyttöoikeudet'; + + @override + String get settingsStorageAccessPageTitle => 'Tallennustilan Käyttöoikeudet'; + + @override + String get settingsStorageAccessBanner => 'Jotkut kansiot vaativat erillisen käyttöluvan jotta niiden sisältöä voidaan muokata. Tässä voit tarkastella kansioita joiden kohdalla olet käyttöluvan antanut.'; + + @override + String get settingsStorageAccessEmpty => 'Ei annettuja käyttölupia'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Peruuta'; + + @override + String get settingsAccessibilitySectionTitle => 'Helppokäyttöisyys'; + + @override + String get settingsRemoveAnimationsTile => 'Poista animaatiot'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Poista Animaatiot'; + + @override + String get settingsTimeToTakeActionTile => 'Aikaraja toimien tekemiselle'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Näytä vaihtoehdot monikosketuseleille'; + + @override + String get settingsDisplaySectionTitle => 'Näyttö'; + + @override + String get settingsThemeBrightnessTile => 'Teema'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Teema'; + + @override + String get settingsThemeColorHighlights => 'Värilliset korostukset'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynaaminen väritys'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Näytön virkistystaajuus'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Virkistystaajuus'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV käyttöliittymä'; + + @override + String get settingsLanguageSectionTitle => 'Kieli & Muodot'; + + @override + String get settingsLanguageTile => 'Kieli'; + + @override + String get settingsLanguagePageTitle => 'Kieli'; + + @override + String get settingsCoordinateFormatTile => 'Koordinaattimuoto'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Koordinaattimuoto'; + + @override + String get settingsUnitSystemTile => 'Yksiköt'; + + @override + String get settingsUnitSystemDialogTitle => 'Yksiköt'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Pakota Arabialaiset numerot'; + + @override + String get settingsScreenSaverPageTitle => 'Näytönsäästäjä'; + + @override + String get settingsWidgetPageTitle => 'Kuvakehys'; + + @override + String get settingsWidgetShowOutline => 'Siluetti'; + + @override + String get settingsWidgetOpenPage => 'Kun painat widgettia'; + + @override + String get settingsWidgetDisplayedItem => 'Näytetty kohde'; + + @override + String get settingsCollectionTile => 'Kokoelma'; + + @override + String get statsPageTitle => 'Tilastot'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString kohdetta sijainnilla', + one: '1 kohde sijainnilla', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Suosituimmat Maat'; + + @override + String get statsTopStatesSectionTitle => 'Suosituimmat Maanosat'; + + @override + String get statsTopPlacesSectionTitle => 'Suosituimmat Paikat'; + + @override + String get statsTopTagsSectionTitle => 'Suosituimmat Tunnisteet'; + + @override + String get statsTopAlbumsSectionTitle => 'Suosituimmat Albumit'; + + @override + String get viewerOpenPanoramaButtonLabel => 'AVAA PANORAAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'ASETA TAUSTAKUVA'; + + @override + String get viewerErrorUnknown => 'Hupsis!'; + + @override + String get viewerErrorDoesNotExist => 'Kohdetta ei ole enään olemassa.'; + + @override + String get viewerInfoPageTitle => 'Tiedot'; + + @override + String get viewerInfoBackToViewerTooltip => 'Takaisin katseluun'; + + @override + String get viewerInfoUnknown => 'tuntematon'; + + @override + String get viewerInfoLabelDescription => 'Kuvaus'; + + @override + String get viewerInfoLabelTitle => 'Otsikko'; + + @override + String get viewerInfoLabelDate => 'Päiväys'; + + @override + String get viewerInfoLabelResolution => 'Resoluutio'; + + @override + String get viewerInfoLabelSize => 'Koko'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Polku'; + + @override + String get viewerInfoLabelDuration => 'Kesto'; + + @override + String get viewerInfoLabelOwner => 'Omistaja'; + + @override + String get viewerInfoLabelCoordinates => 'Koordinaatit'; + + @override + String get viewerInfoLabelAddress => 'Osoite'; + + @override + String get mapStyleDialogTitle => 'Kartan Tyyli'; + + @override + String get mapStyleDialogAddStyle => 'Lisää tyyli'; + + @override + String get mapStyleTooltip => 'Valitse kartan tyyli'; + + @override + String get mapStyleEditorDialogName => 'Nimi'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Aliverkkotunnukset'; + + @override + String get mapStyleEditorDialogUserAgent => 'Käyttäjäagentti'; + + @override + String get mapZoomInTooltip => 'Suurenna'; + + @override + String get mapZoomOutTooltip => 'Loitonna'; + + @override + String get mapPointNorthUpTooltip => 'Osoita pohjoinen ylöspäin'; + + @override + String get mapAttributionOsmData => 'Karttatiedot © [OpenStreetMap](https://www.openstreetmap.org/copyright) osallistujat'; + + @override + String get mapAttributionOsmLiberty => 'Karttatiilit tekijältä [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Ylläpitäjä [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Karttatiilit tekijältä [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Karttatiilit tekijältä [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Karttatiilit tekijältä [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Näytä Karttasivulla'; + + @override + String get mapEmptyRegion => 'Ei kuvia tällä alueella'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Upotettujen tietojen kopiointi epäonnistui'; + + @override + String get viewerInfoOpenLinkText => 'Avaa'; + + @override + String get viewerInfoViewXmlLinkText => 'Näytä XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Etsi metatiedoista'; + + @override + String get viewerInfoSearchEmpty => 'Ei vastaavia avaimia'; + + @override + String get viewerInfoSearchSuggestionDate => 'Päivä & aika'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Kuvaus'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Mitat'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resoluutio'; + + @override + String get viewerInfoSearchSuggestionRights => 'Oikeudet'; + + @override + String get wallpaperUseScrollEffect => 'Käytä vieritys-efektiä kotinäytöllä'; + + @override + String get tagEditorPageTitle => 'Muokkaa Tunnisteita'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Uusi tunniste'; + + @override + String get tagEditorPageAddTagTooltip => 'Lisää tunniste'; + + @override + String get tagEditorSectionRecent => 'Viimeaikaiset'; + + @override + String get tagEditorSectionPlaceholders => 'Paikkamerkit'; + + @override + String get tagEditorDiscardDialogMessage => 'Haluatko peruuttaa muutokset?'; + + @override + String get tagPlaceholderCountry => 'Maa'; + + @override + String get tagPlaceholderState => 'Maanosa'; + + @override + String get tagPlaceholderPlace => 'Paikka'; + + @override + String get panoramaEnableSensorControl => 'Ota käyttöön sensoriohjaus'; + + @override + String get panoramaDisableSensorControl => 'Poista käytöstä sensoriohjaus'; + + @override + String get sourceViewerPageTitle => 'Lähde'; +} diff --git a/lib/l10ngen/app_localizations_fr.dart b/lib/l10ngen/app_localizations_fr.dart new file mode 100644 index 0000000..95f4b83 --- /dev/null +++ b/lib/l10ngen/app_localizations_fr.dart @@ -0,0 +1,2425 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for French (`fr`). +class AppLocalizationsFr extends AppLocalizations { + AppLocalizationsFr([String locale = 'fr']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Bienvenue'; + + @override + String get welcomeOptional => 'Option'; + + @override + String get welcomeTermsToggle => 'J’accepte les conditions d’utilisation'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString éléments', + one: '$countString élément', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count colonnes', + one: '$count colonne', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString secondes', + one: '$countString seconde', + zero: '$countString seconde', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutes', + one: '$countString minute', + zero: '$countString minute', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString jours', + one: '$countString jour', + zero: '$countString jour', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APPLIQUER'; + + @override + String get createButtonLabel => 'CRÉER'; + + @override + String get deleteButtonLabel => 'SUPPRIMER'; + + @override + String get nextButtonLabel => 'SUIVANT'; + + @override + String get showButtonLabel => 'AFFICHER'; + + @override + String get hideButtonLabel => 'MASQUER'; + + @override + String get continueButtonLabel => 'CONTINUER'; + + @override + String get saveCopyButtonLabel => 'ENREGISTRER UNE COPIE'; + + @override + String get applyTooltip => 'Appliquer'; + + @override + String get cancelTooltip => 'Annuler'; + + @override + String get changeTooltip => 'Modifier'; + + @override + String get clearTooltip => 'Effacer'; + + @override + String get previousTooltip => 'Précédent'; + + @override + String get nextTooltip => 'Suivant'; + + @override + String get showTooltip => 'Afficher'; + + @override + String get hideTooltip => 'Masquer'; + + @override + String get actionRemove => 'Supprimer'; + + @override + String get resetTooltip => 'Réinitialiser'; + + @override + String get saveTooltip => 'Sauvegarder'; + + @override + String get stopTooltip => 'Arrêter'; + + @override + String get pickTooltip => 'Sélectionner'; + + @override + String get doubleBackExitMessage => 'Pressez « retour » à nouveau pour quitter.'; + + @override + String get doNotAskAgain => 'Ne pas demander de nouveau'; + + @override + String get sourceStateLoading => 'Chargement'; + + @override + String get sourceStateCataloguing => 'Classification'; + + @override + String get sourceStateLocatingCountries => 'Identification des pays'; + + @override + String get sourceStateLocatingPlaces => 'Identification des lieux'; + + @override + String get chipActionDelete => 'Supprimer'; + + @override + String get chipActionRemove => 'Retirer'; + + @override + String get chipActionShowCollection => 'Afficher dans Collection'; + + @override + String get chipActionGoToAlbumPage => 'Afficher dans Albums'; + + @override + String get chipActionGoToCountryPage => 'Afficher dans Pays'; + + @override + String get chipActionGoToPlacePage => 'Afficher dans Lieux'; + + @override + String get chipActionGoToTagPage => 'Afficher dans Étiquettes'; + + @override + String get chipActionGoToExplorerPage => 'Afficher dans Explorateur'; + + @override + String get chipActionDecompose => 'Scinder'; + + @override + String get chipActionFilterOut => 'Exclure'; + + @override + String get chipActionFilterIn => 'Inclure'; + + @override + String get chipActionHide => 'Masquer'; + + @override + String get chipActionLock => 'Verrouiller'; + + @override + String get chipActionPin => 'Épingler'; + + @override + String get chipActionUnpin => 'Retirer'; + + @override + String get chipActionGroup => 'Modifier groupement'; + + @override + String get chipActionRename => 'Renommer'; + + @override + String get chipActionSetCover => 'Modifier la couverture'; + + @override + String get chipActionShowCountryStates => 'Afficher les États'; + + @override + String get chipActionCreateGroup => 'Créer un groupe'; + + @override + String get chipActionCreateAlbum => 'Créer un album'; + + @override + String get chipActionCreateVault => 'Créer un coffre-fort'; + + @override + String get chipActionConfigureVault => 'Configurer le coffre-fort'; + + @override + String get entryActionCopyToClipboard => 'Copier dans presse-papier'; + + @override + String get entryActionDelete => 'Supprimer'; + + @override + String get entryActionConvert => 'Convertir'; + + @override + String get entryActionExport => 'Exporter'; + + @override + String get entryActionInfo => 'Détails'; + + @override + String get entryActionRename => 'Renommer'; + + @override + String get entryActionRestore => 'Restaurer'; + + @override + String get entryActionRotateCCW => 'Pivoter à gauche'; + + @override + String get entryActionRotateCW => 'Pivoter à droite'; + + @override + String get entryActionFlip => 'Retourner horizontalement'; + + @override + String get entryActionPrint => 'Imprimer'; + + @override + String get entryActionShare => 'Partager'; + + @override + String get entryActionShareImageOnly => 'Partager l’image seulement'; + + @override + String get entryActionShareVideoOnly => 'Partager la vidéo seulement'; + + @override + String get entryActionViewSource => 'Voir le code'; + + @override + String get entryActionShowGeoTiffOnMap => 'Superposer sur la carte'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convertir en image fixe'; + + @override + String get entryActionViewMotionPhotoVideo => 'Ouvrir la vidéo'; + + @override + String get entryActionEdit => 'Modifier'; + + @override + String get entryActionOpen => 'Ouvrir avec'; + + @override + String get entryActionSetAs => 'Utiliser comme'; + + @override + String get entryActionCast => 'Caster'; + + @override + String get entryActionOpenMap => 'Localiser avec'; + + @override + String get entryActionRotateScreen => 'Pivoter l’écran'; + + @override + String get entryActionAddFavourite => 'Ajouter aux favoris'; + + @override + String get entryActionRemoveFavourite => 'Retirer des favoris'; + + @override + String get videoActionCaptureFrame => 'Capturer l’image'; + + @override + String get videoActionMute => 'Couper le son'; + + @override + String get videoActionUnmute => 'Rétablir le son'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Lire'; + + @override + String get videoActionReplay10 => 'Reculer de 10 secondes'; + + @override + String get videoActionSkip10 => 'Avancer de 10 secondes'; + + @override + String get videoActionShowPreviousFrame => 'Montrer l’image précédente'; + + @override + String get videoActionShowNextFrame => 'Montrer l’image suivante'; + + @override + String get videoActionSelectStreams => 'Choisir les pistes'; + + @override + String get videoActionSetSpeed => 'Vitesse de lecture'; + + @override + String get videoActionABRepeat => 'Lecture répétée A-B'; + + @override + String get videoRepeatActionSetStart => 'Définir le début'; + + @override + String get videoRepeatActionSetEnd => 'Définir la fin'; + + @override + String get viewerActionSettings => 'Préférences'; + + @override + String get viewerActionLock => 'Verrouiller la visionneuse'; + + @override + String get viewerActionUnlock => 'Déverrouiller la visionneuse'; + + @override + String get slideshowActionResume => 'Reprendre'; + + @override + String get slideshowActionShowInCollection => 'Afficher dans Collection'; + + @override + String get entryInfoActionEditDate => 'Modifier la date'; + + @override + String get entryInfoActionEditLocation => 'Modifier le lieu'; + + @override + String get entryInfoActionEditTitleDescription => 'Modifier titre et description'; + + @override + String get entryInfoActionEditRating => 'Modifier la notation'; + + @override + String get entryInfoActionEditTags => 'Modifier les étiquettes'; + + @override + String get entryInfoActionRemoveMetadata => 'Retirer les métadonnées'; + + @override + String get entryInfoActionExportMetadata => 'Exporter les métadonnées'; + + @override + String get entryInfoActionRemoveLocation => 'Retirer le lieu'; + + @override + String get editorActionTransform => 'Transformation'; + + @override + String get editorTransformCrop => 'Recadrage'; + + @override + String get editorTransformRotate => 'Rotation'; + + @override + String get cropAspectRatioFree => 'Personnalisé'; + + @override + String get cropAspectRatioOriginal => 'Photo d’origine'; + + @override + String get cropAspectRatioSquare => 'Carré'; + + @override + String get filterAspectRatioLandscapeLabel => 'Paysage'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Corbeille'; + + @override + String get filterFavouriteLabel => 'Favori'; + + @override + String get filterNoDateLabel => 'Sans date'; + + @override + String get filterNoAddressLabel => 'Sans adresse'; + + @override + String get filterLocatedLabel => 'Localisé'; + + @override + String get filterNoLocationLabel => 'Sans lieu'; + + @override + String get filterNoRatingLabel => 'Sans notation'; + + @override + String get filterTaggedLabel => 'Étiqueté'; + + @override + String get filterNoTagLabel => 'Sans étiquette'; + + @override + String get filterNoTitleLabel => 'Sans titre'; + + @override + String get filterOnThisDayLabel => 'Ce jour-là'; + + @override + String get filterRecentlyAddedLabel => 'Ajouté récemment'; + + @override + String get filterRatingRejectedLabel => 'Rejeté'; + + @override + String get filterTypeAnimatedLabel => 'Animation'; + + @override + String get filterTypeMotionPhotoLabel => 'Photo animée'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => 'Vidéo à 360°'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Image'; + + @override + String get filterMimeVideoLabel => 'Vidéo'; + + @override + String get accessibilityAnimationsRemove => 'Empêchez certains effets de l’écran'; + + @override + String get accessibilityAnimationsKeep => 'Conserver les effets de l’écran'; + + @override + String get albumTierNew => 'Nouveaux'; + + @override + String get albumTierPinned => 'Épinglés'; + + @override + String get albumTierGroups => 'Groupes'; + + @override + String get albumTierSpecial => 'Standards'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Coffres-forts'; + + @override + String get albumTierDynamic => 'Dynamique'; + + @override + String get albumTierRegular => 'Autres'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Degrés décimaux'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'O'; + + @override + String get displayRefreshRatePreferHighest => 'Fréquence maximale'; + + @override + String get displayRefreshRatePreferLowest => 'Fréquence minimale'; + + @override + String get keepScreenOnNever => 'Jamais'; + + @override + String get keepScreenOnVideoPlayback => 'Pendant la lecture de vidéos'; + + @override + String get keepScreenOnViewerOnly => 'Visionneuse seulement'; + + @override + String get keepScreenOnAlways => 'Toujours'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Satellite)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Relief)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'OSM Humanitaire'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (Aquarelle)'; + + @override + String get maxBrightnessNever => 'Jamais'; + + @override + String get maxBrightnessAlways => 'Toujours'; + + @override + String get nameConflictStrategyRename => 'Renommer'; + + @override + String get nameConflictStrategyReplace => 'Remplacer'; + + @override + String get nameConflictStrategySkip => 'Ignorer'; + + @override + String get overlayHistogramNone => 'Aucun'; + + @override + String get overlayHistogramRGB => 'RVB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Haut'; + + @override + String get subtitlePositionBottom => 'Bas'; + + @override + String get themeBrightnessLight => 'Clair'; + + @override + String get themeBrightnessDark => 'Sombre'; + + @override + String get themeBrightnessBlack => 'Noir'; + + @override + String get unitSystemMetric => 'SI'; + + @override + String get unitSystemImperial => 'anglo-saxonnes'; + + @override + String get vaultLockTypePattern => 'Modèle'; + + @override + String get vaultLockTypePin => 'Code PIN'; + + @override + String get vaultLockTypePassword => 'Mot de passe'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Ouvrir avec un autre lecteur'; + + @override + String get videoLoopModeNever => 'Jamais'; + + @override + String get videoLoopModeShortOnly => 'Courtes vidéos seulement'; + + @override + String get videoLoopModeAlways => 'Toujours'; + + @override + String get videoPlaybackSkip => 'Passer'; + + @override + String get videoPlaybackMuted => 'Jouer sans son'; + + @override + String get videoPlaybackWithSound => 'Jouer avec son'; + + @override + String get videoResumptionModeNever => 'Jamais'; + + @override + String get videoResumptionModeAlways => 'Toujours'; + + @override + String get viewerTransitionSlide => 'Défilement'; + + @override + String get viewerTransitionParallax => 'Parallaxe'; + + @override + String get viewerTransitionFade => 'Fondu'; + + @override + String get viewerTransitionZoomIn => 'Zoom'; + + @override + String get viewerTransitionNone => 'Aucune'; + + @override + String get wallpaperTargetHome => 'Écran d’accueil'; + + @override + String get wallpaperTargetLock => 'Écran de verrouillage'; + + @override + String get wallpaperTargetHomeLock => 'Écrans accueil et verrouillage'; + + @override + String get widgetDisplayedItemRandom => 'Aléatoire'; + + @override + String get widgetDisplayedItemMostRecent => 'Le plus récent'; + + @override + String get widgetOpenPageHome => 'Ouvrir la page d’accueil'; + + @override + String get widgetOpenPageCollection => 'Ouvrir la collection'; + + @override + String get widgetOpenPageViewer => 'Ouvrir la visionneuse'; + + @override + String get widgetTapUpdateWidget => 'Mettre à jour le widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Stockage interne'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'Carte SD'; + + @override + String get rootDirectoryDescription => 'dossier racine'; + + @override + String otherDirectoryDescription(String name) { + return 'dossier « $name »'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Veuillez sélectionner le $directory de « $volume » à l’écran suivant, pour que l’app puisse modifier son contenu.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Cette app ne peut pas modifier les fichiers du $directory de « $volume ».\n\nVeuillez utiliser une app pré-installée pour déplacer les fichiers vers un autre dossier.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Cette opération nécessite $neededSize d’espace disponible sur « $volume », mais il ne reste que $freeSize.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Le sélecteur de fichiers du système est absent ou désactivé. Veuillez le réactiver et réessayer.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Cette opération n’est pas disponible pour les fichiers aux formats suivants : $types.', + one: 'Cette opération n’est pas disponible pour les fichiers au format suivant : $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Certains fichiers dans le dossier de destination ont le même nom.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Certains fichiers ont le même nom.'; + + @override + String get addShortcutDialogLabel => 'Nom du raccourci'; + + @override + String get addShortcutButtonLabel => 'AJOUTER'; + + @override + String get noMatchingAppDialogMessage => 'Aucune app ne peut effectuer cette opération.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Mettre ces $countString éléments à la corbeille ?', + one: 'Mettre cet élément à la corbeille ?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Supprimer ces $countString éléments ?', + one: 'Supprimer cet élément ?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Sauvegarder les dates des éléments avant de continuer ?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Sauvegarder les dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Voulez-vous reprendre la lecture à $time ?'; + } + + @override + String get videoStartOverButtonLabel => 'RECOMMENCER'; + + @override + String get videoResumeButtonLabel => 'REPRENDRE'; + + @override + String get setCoverDialogLatest => 'dernier élément'; + + @override + String get setCoverDialogAuto => 'automatique'; + + @override + String get setCoverDialogCustom => 'personnalisé'; + + @override + String get hideFilterConfirmationDialogMessage => + 'Les images et vidéos correspondantes n’apparaîtront plus dans votre collection. Vous pouvez les montrer à nouveau via les réglages de « Confidentialité ».\n\nVoulez-vous vraiment les masquer ?'; + + @override + String get newAlbumDialogTitle => 'Nouvel album'; + + @override + String get newAlbumDialogNameLabel => 'Nom de l’album'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'L’album existe déjà'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Le dossier existe déjà'; + + @override + String get newAlbumDialogStorageLabel => 'Volume de stockage :'; + + @override + String get newDynamicAlbumDialogTitle => 'Nouvel album dynamique'; + + @override + String get dynamicAlbumAlreadyExists => 'L’album dynamique existe déjà'; + + @override + String get newGroupDialogTitle => 'Nouveau groupe'; + + @override + String get newGroupDialogNameLabel => 'Nom du groupe'; + + @override + String get groupAlreadyExists => 'Le groupe existe déjà'; + + @override + String get groupEmpty => 'Aucun groupe'; + + @override + String get ungrouped => 'Non groupé'; + + @override + String get groupPickerTitle => 'Sélection'; + + @override + String get groupPickerUseThisGroupButton => 'Utiliser ce groupe'; + + @override + String get newVaultWarningDialogMessage => 'Les éléments dans les coffres-forts ne sont visibles que dans cette app et nulle autre.\n\nSi vous désinstallez cette app, ou que vous supprimez ses données, vous perdrez tous ces éléments.'; + + @override + String get newVaultDialogTitle => 'Nouveau coffre-fort'; + + @override + String get configureVaultDialogTitle => 'Configuration du coffre-fort'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Verrouiller quand l’écran s’éteint'; + + @override + String get vaultDialogLockTypeLabel => 'Verrouillage'; + + @override + String get patternDialogEnter => 'Entrez votre modèle'; + + @override + String get patternDialogConfirm => 'Confirmez votre modèle'; + + @override + String get pinDialogEnter => 'Entrez votre code PIN'; + + @override + String get pinDialogConfirm => 'Confirmez votre code PIN'; + + @override + String get passwordDialogEnter => 'Entrez votre mot de passe'; + + @override + String get passwordDialogConfirm => 'Confirmez votre mot de passe'; + + @override + String get authenticateToConfigureVault => 'Authentification pour configurer le coffre-fort'; + + @override + String get authenticateToUnlockVault => 'Authentification pour déverrouiller le coffre-fort'; + + @override + String get vaultBinUsageDialogMessage => 'Des coffres-forts utilisent la corbeille.'; + + @override + String get renameAlbumDialogLabel => 'Nouveau nom'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Le dossier existe déjà'; + + @override + String get renameEntrySetPageTitle => 'Renommage'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Modèle de nommage'; + + @override + String get renameEntrySetPageInsertTooltip => 'Ajouter un champ'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Aperçu'; + + @override + String get renameProcessorCounter => 'Compteur'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Nom'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Supprimer cet album et les $countString éléments dedans ?', + one: 'Supprimer cet album et l’élément dedans ?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Supprimer ces albums et les $countString éléments dedans ?', + one: 'Supprimer ces albums et l’élément dedans ?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format :'; + + @override + String get exportEntryDialogWidth => 'Largeur'; + + @override + String get exportEntryDialogHeight => 'Hauteur'; + + @override + String get exportEntryDialogQuality => 'Qualité'; + + @override + String get exportEntryDialogWriteMetadata => 'Écrire les métadonnées'; + + @override + String get renameEntryDialogLabel => 'Nouveau nom'; + + @override + String get editEntryDialogCopyFromItem => 'Copier d’un autre élément'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Champs à modifier'; + + @override + String get editEntryDateDialogTitle => 'Date & Heure'; + + @override + String get editEntryDateDialogSetCustom => 'Régler une date personnalisée'; + + @override + String get editEntryDateDialogCopyField => 'Copier d’une autre date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extraire du titre'; + + @override + String get editEntryDateDialogShift => 'Décaler'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Date de modification du fichier'; + + @override + String get durationDialogHours => 'Heures'; + + @override + String get durationDialogMinutes => 'Minutes'; + + @override + String get durationDialogSeconds => 'Secondes'; + + @override + String get editEntryLocationDialogTitle => 'Lieu'; + + @override + String get editEntryLocationDialogSetCustom => 'Définir un lieu personnalisé'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Sélectionner sur la carte'; + + @override + String get editEntryLocationDialogImportGpx => 'Importer un fichier GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Décalage temporel'; + + @override + String get locationPickerUseThisLocationButton => 'Utiliser ce lieu'; + + @override + String get editEntryRatingDialogTitle => 'Notation'; + + @override + String get removeEntryMetadataDialogTitle => 'Retrait de métadonnées'; + + @override + String get removeEntryMetadataDialogAll => 'Tout'; + + @override + String get removeEntryMetadataDialogMore => 'Voir plus'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'Les métadonnées XMP sont nécessaires pour lire la vidéo d’une photo animée.\n\nVoulez-vous vraiment les supprimer ?'; + + @override + String get videoSpeedDialogLabel => 'Vitesse de lecture'; + + @override + String get videoStreamSelectionDialogVideo => 'Vidéo'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Sous-titres'; + + @override + String get videoStreamSelectionDialogOff => 'Désactivé'; + + @override + String get videoStreamSelectionDialogTrack => 'Piste'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Il n’y a pas d’autre piste.'; + + @override + String get genericSuccessFeedback => 'Succès !'; + + @override + String get genericFailureFeedback => 'Échec'; + + @override + String get genericDangerWarningDialogMessage => 'Êtes-vous sûr ?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Réessayez avec moins d’éléments.'; + + @override + String get menuActionConfigureView => 'Vue'; + + @override + String get menuActionSelect => 'Sélectionner'; + + @override + String get menuActionSelectAll => 'Tout sélectionner'; + + @override + String get menuActionSelectNone => 'Tout désélectionner'; + + @override + String get menuActionMap => 'Carte'; + + @override + String get menuActionSlideshow => 'Diaporama'; + + @override + String get menuActionStats => 'Statistiques'; + + @override + String get viewDialogSortSectionTitle => 'Tri'; + + @override + String get viewDialogGroupSectionTitle => 'Sections'; + + @override + String get viewDialogLayoutSectionTitle => 'Vue'; + + @override + String get viewDialogReverseSortOrder => 'Inverser l’ordre'; + + @override + String get tileLayoutMosaic => 'Mosaïque'; + + @override + String get tileLayoutGrid => 'Grille'; + + @override + String get tileLayoutList => 'Liste'; + + @override + String get castDialogTitle => 'Appareils'; + + @override + String get coverDialogTabCover => 'Image'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Couleur'; + + @override + String get appPickDialogTitle => 'Sélection'; + + @override + String get appPickDialogNone => 'Aucune'; + + @override + String get aboutPageTitle => 'À propos'; + + @override + String get aboutLinkLicense => 'Licence'; + + @override + String get aboutLinkPolicy => 'Politique de confidentialité'; + + @override + String get aboutBugSectionTitle => 'Rapports d’erreur'; + + @override + String get aboutBugSaveLogInstruction => 'Sauvegarder les logs de l’app vers un fichier'; + + @override + String get aboutBugCopyInfoInstruction => 'Copier les informations d’environnement'; + + @override + String get aboutBugCopyInfoButton => 'Copier'; + + @override + String get aboutBugReportInstruction => 'Créer une « issue » sur GitHub en attachant les logs et informations d’environnement'; + + @override + String get aboutBugReportButton => 'Créer'; + + @override + String get aboutDataUsageSectionTitle => 'Espace utilisé'; + + @override + String get aboutDataUsageData => 'Données'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Base de données'; + + @override + String get aboutDataUsageMisc => 'Divers'; + + @override + String get aboutDataUsageInternal => 'Interne'; + + @override + String get aboutDataUsageExternal => 'Externe'; + + @override + String get aboutDataUsageClearCache => 'Vider le cache'; + + @override + String get aboutCreditsSectionTitle => 'Remerciements'; + + @override + String get aboutCreditsWorldAtlas1 => 'Cette app utilise un fichier TopoJSON de'; + + @override + String get aboutCreditsWorldAtlas2 => 'sous licence ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'Traducteurs'; + + @override + String get aboutLicensesSectionTitle => 'Licences open-source'; + + @override + String get aboutLicensesBanner => 'Cette app utilise ces librairies et packages open-source.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Librairies Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Plugins Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Packages Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Packages Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Afficher toutes les licences'; + + @override + String get policyPageTitle => 'Politique de confidentialité'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'Sélection'; + + @override + String get collectionSelectPageTitle => 'Sélection'; + + @override + String get collectionActionShowTitleSearch => 'Filtrer les titres'; + + @override + String get collectionActionHideTitleSearch => 'Masquer le filtre'; + + @override + String get collectionActionAddDynamicAlbum => 'Ajouter un album dynamique'; + + @override + String get collectionActionAddShortcut => 'Créer un raccourci'; + + @override + String get collectionActionSetHome => 'Définir comme page d’accueil'; + + @override + String get collectionActionEmptyBin => 'Vider la corbeille'; + + @override + String get collectionActionCopy => 'Copier vers l’album'; + + @override + String get collectionActionMove => 'Déplacer vers l’album'; + + @override + String get collectionActionRescan => 'Réanalyser'; + + @override + String get collectionActionEdit => 'Modifier'; + + @override + String get collectionSearchTitlesHintText => 'Recherche de titres'; + + @override + String get collectionGroupAlbum => 'par album'; + + @override + String get collectionGroupMonth => 'par mois'; + + @override + String get collectionGroupDay => 'par jour'; + + @override + String get sectionNone => 'Aucune section'; + + @override + String get sectionUnknown => 'Inconnu'; + + @override + String get dateToday => 'Aujourd’hui'; + + @override + String get dateYesterday => 'Hier'; + + @override + String get dateThisMonth => 'Ce mois-ci'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Échec de la suppression de $countString éléments', + one: 'Échec de la suppression d’1 élément', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Échec de la copie de $countString éléments', + one: 'Échec de la copie d’1 élément', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Échec du déplacement de $countString éléments', + one: 'Échec du déplacement d’1 élément', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Échec du renommage de $countString éléments', + one: 'Échec du renommage d’1 élément', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Échec de la modification de $countString éléments', + one: 'Échec de la modification d’1 élément', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Échec de l’export de $countString pages', + one: 'Échec de l’export d’1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString éléments copiés', + one: '1 élément copié', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString éléments déplacés', + one: '1 élément déplacé', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString éléments renommés', + one: '1 élément renommé', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString éléments modifiés', + one: '1 élément modifié', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Aucun favori'; + + @override + String get collectionEmptyVideos => 'Aucune vidéo'; + + @override + String get collectionEmptyImages => 'Aucune image'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Autoriser l’accès'; + + @override + String get collectionSelectSectionTooltip => 'Sélectionner la section'; + + @override + String get collectionDeselectSectionTooltip => 'Désélectionner la section'; + + @override + String get drawerAboutButton => 'À propos'; + + @override + String get drawerSettingsButton => 'Réglages'; + + @override + String get drawerCollectionAll => 'Toute la collection'; + + @override + String get drawerCollectionFavourites => 'Favoris'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Vidéos'; + + @override + String get drawerCollectionAnimated => 'Animations'; + + @override + String get drawerCollectionMotionPhotos => 'Photos animées'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Photos Raw'; + + @override + String get drawerCollectionSphericalVideos => 'Vidéos à 360°'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Pays'; + + @override + String get drawerPlacePage => 'Lieux'; + + @override + String get drawerTagPage => 'Étiquettes'; + + @override + String get sortByDate => 'par date'; + + @override + String get sortByName => 'alphabétique'; + + @override + String get sortByItemCount => 'par nombre d’éléments'; + + @override + String get sortBySize => 'par taille'; + + @override + String get sortByAlbumFileName => 'par titre d’album et élément'; + + @override + String get sortByRating => 'par notation'; + + @override + String get sortByDuration => 'par durée'; + + @override + String get sortByPath => 'par chemin'; + + @override + String get sortOrderNewestFirst => 'Plus récents d’abord'; + + @override + String get sortOrderOldestFirst => 'Plus anciens d’abord'; + + @override + String get sortOrderAtoZ => 'De A à Z'; + + @override + String get sortOrderZtoA => 'De Z à A'; + + @override + String get sortOrderHighestFirst => 'Meilleurs d’abord'; + + @override + String get sortOrderLowestFirst => 'Moins bons d’abord'; + + @override + String get sortOrderLargestFirst => 'Plus larges d’abord'; + + @override + String get sortOrderSmallestFirst => 'Moins larges d’abord'; + + @override + String get sortOrderShortestFirst => 'Plus courts d’abord'; + + @override + String get sortOrderLongestFirst => 'Plus longs d’abord'; + + @override + String get albumGroupTier => 'par importance'; + + @override + String get albumGroupType => 'par type'; + + @override + String get albumGroupVolume => 'par volume de stockage'; + + @override + String get albumMimeTypeMixed => 'Mixte'; + + @override + String get albumPickPageTitleCopy => 'Copie'; + + @override + String get albumPickPageTitleExport => 'Export'; + + @override + String get albumPickPageTitleMove => 'Déplacement'; + + @override + String get albumPickPageTitlePick => 'Sélection'; + + @override + String get albumCamera => 'Appareil photo'; + + @override + String get albumDownload => 'Téléchargements'; + + @override + String get albumScreenshots => 'Captures d’écran'; + + @override + String get albumScreenRecordings => 'Enregistrements d’écran'; + + @override + String get albumVideoCaptures => 'Captures de vidéo'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'Aucun album'; + + @override + String get createAlbumButtonLabel => 'CRÉER'; + + @override + String get newFilterBanner => 'nouveau'; + + @override + String get countryPageTitle => 'Pays'; + + @override + String get countryEmpty => 'Aucun pays'; + + @override + String get statePageTitle => 'États'; + + @override + String get stateEmpty => 'Aucun État'; + + @override + String get placePageTitle => 'Lieux'; + + @override + String get placeEmpty => 'Aucun lieu'; + + @override + String get tagPageTitle => 'Étiquettes'; + + @override + String get tagEmpty => 'Aucune étiquette'; + + @override + String get tagPickPageTitle => 'Sélection'; + + @override + String get binPageTitle => 'Corbeille'; + + @override + String get explorerPageTitle => 'Explorateur'; + + @override + String get explorerActionSelectStorageVolume => 'Choisir le stockage'; + + @override + String get selectStorageVolumeDialogTitle => 'Volumes de stockage'; + + @override + String get searchCollectionFieldHint => 'Recherche'; + + @override + String get searchRecentSectionTitle => 'Historique'; + + @override + String get searchDateSectionTitle => 'Date'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Pays'; + + @override + String get searchStatesSectionTitle => 'États'; + + @override + String get searchPlacesSectionTitle => 'Lieux'; + + @override + String get searchTagsSectionTitle => 'Étiquettes'; + + @override + String get searchRatingSectionTitle => 'Notations'; + + @override + String get searchMetadataSectionTitle => 'Métadonnées'; + + @override + String get settingsPageTitle => 'Réglages'; + + @override + String get settingsSystemDefault => 'Système'; + + @override + String get settingsDefault => 'Par défaut'; + + @override + String get settingsDisabled => 'Désactivé'; + + @override + String get settingsEnabled => 'Activé'; + + @override + String get settingsForced => 'Forcé'; + + @override + String get settingsAskEverytime => 'Demander chaque fois'; + + @override + String get settingsModificationWarningDialogMessage => 'D’autres réglages seront modifiés.'; + + @override + String get settingsSearchFieldLabel => 'Recherche de réglages'; + + @override + String get settingsSearchEmpty => 'Aucun réglage correspondant'; + + @override + String get settingsActionExport => 'Exporter'; + + @override + String get settingsActionExportDialogTitle => 'Exporter'; + + @override + String get settingsActionImport => 'Importer'; + + @override + String get settingsActionImportDialogTitle => 'Importer'; + + @override + String get appExportCovers => 'Couvertures'; + + @override + String get appExportDynamicAlbums => 'Albums dynamiques'; + + @override + String get appExportFavourites => 'Favoris'; + + @override + String get appExportSettings => 'Réglages'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Page d’accueil'; + + @override + String get settingsHomeDialogTitle => 'Page d’accueil'; + + @override + String get setHomeCustom => 'Personnalisé'; + + @override + String get settingsKeepScreenOnTile => 'Maintenir l’écran allumé'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Allumage de l’écran'; + + @override + String get settingsDoubleBackExit => 'Presser « retour » 2 fois pour quitter'; + + @override + String get settingsConfirmationTile => 'Demandes de confirmation'; + + @override + String get settingsConfirmationDialogTitle => 'Demandes de confirmation'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Suppression définitive d’éléments'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Mise d’éléments à la corbeille'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Déplacement d’éléments non datés'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Confirmation après mise d’éléments à la corbeille'; + + @override + String get settingsConfirmationVaultDataLoss => 'Afficher l’avertissement sur la perte de données avec les coffres-forts'; + + @override + String get settingsNavigationDrawerTile => 'Menu de navigation'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Menu de navigation'; + + @override + String get settingsNavigationDrawerBanner => 'Maintenez votre doigt appuyé pour déplacer et réorganiser les éléments de menu.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Ajouter un album'; + + @override + String get settingsNavigationBottomActionsTile => 'Barre de navigation inférieure'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Barre de navigation inférieure'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Maintenez votre doigt appuyé pour déplacer les boutons et sélectionner les actions à afficher dans la barre de navigation inférieure.'; + + @override + String get settingsThumbnailSectionTitle => 'Vignettes'; + + @override + String get settingsThumbnailOverlayTile => 'Incrustations'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Incrustations'; + + @override + String get settingsThumbnailShowHdrIcon => 'Afficher l’icône HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Afficher l’icône de favori'; + + @override + String get settingsThumbnailShowTagIcon => 'Afficher l’icône d’étiquette'; + + @override + String get settingsThumbnailShowLocationIcon => 'Afficher l’icône de lieu'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Afficher l’icône de photo animée'; + + @override + String get settingsThumbnailShowRating => 'Afficher la notation'; + + @override + String get settingsThumbnailShowRawIcon => 'Afficher l’icône de photo raw'; + + @override + String get settingsThumbnailShowVideoDuration => 'Afficher la durée de la vidéo'; + + @override + String get settingsCollectionQuickActionsTile => 'Actions rapides'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Actions rapides'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Navigation'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Sélection'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Maintenez votre doigt appuyé pour déplacer les boutons et choisir les actions affichées lors de la navigation.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Maintenez votre doigt appuyé pour déplacer les boutons et choisir les actions affichées lors de la sélection d’éléments.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Modèles de rafale'; + + @override + String get settingsCollectionBurstPatternsNone => 'Aucun'; + + @override + String get settingsViewerSectionTitle => 'Visionneuse'; + + @override + String get settingsViewerGestureSideTapNext => 'Appuyer sur les bords de l’écran pour passer à l’élément précédent/suivant'; + + @override + String get settingsViewerUseCutout => 'Utiliser la zone d’encoche'; + + @override + String get settingsViewerMaximumBrightness => 'Luminosité maximale'; + + @override + String get settingsMotionPhotoAutoPlay => 'Lecture automatique des photos animées'; + + @override + String get settingsImageBackground => 'Arrière-plan de l’image'; + + @override + String get settingsViewerQuickActionsTile => 'Actions rapides'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Actions rapides'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Maintenez votre doigt appuyé pour déplacer les boutons et choisir les actions affichées sur la visionneuse.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Boutons affichés'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Boutons disponibles'; + + @override + String get settingsViewerQuickActionEmpty => 'Aucun bouton'; + + @override + String get settingsViewerOverlayTile => 'Incrustations'; + + @override + String get settingsViewerOverlayPageTitle => 'Incrustations'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Afficher à l’ouverture'; + + @override + String get settingsViewerShowHistogram => 'Afficher l’histogramme'; + + @override + String get settingsViewerShowMinimap => 'Afficher la mini-carte'; + + @override + String get settingsViewerShowZoomLevel => 'Afficher le niveau de zoom'; + + @override + String get settingsViewerShowInformation => 'Afficher les détails'; + + @override + String get settingsViewerShowInformationSubtitle => 'Afficher les titre, date, lieu, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Afficher la notation et les étiquettes'; + + @override + String get settingsViewerShowShootingDetails => 'Afficher les détails de prise de vue'; + + @override + String get settingsViewerShowDescription => 'Afficher la description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Afficher les vignettes'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Effets de flou'; + + @override + String get settingsViewerSlideshowTile => 'Diaporama'; + + @override + String get settingsViewerSlideshowPageTitle => 'Diaporama'; + + @override + String get settingsSlideshowRepeat => 'Répéter'; + + @override + String get settingsSlideshowShuffle => 'Aléatoire'; + + @override + String get settingsSlideshowFillScreen => 'Remplir l’écran'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Effet de zoom animé'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Intervalle'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Lecture de vidéos'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Lecture de vidéos'; + + @override + String get settingsVideoPageTitle => 'Réglages vidéo'; + + @override + String get settingsVideoSectionTitle => 'Vidéo'; + + @override + String get settingsVideoShowVideos => 'Afficher les vidéos'; + + @override + String get settingsVideoPlaybackTile => 'Lecture'; + + @override + String get settingsVideoPlaybackPageTitle => 'Lecture'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Accélération matérielle'; + + @override + String get settingsVideoAutoPlay => 'Lecture automatique'; + + @override + String get settingsVideoLoopModeTile => 'Lecture répétée'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Lecture répétée'; + + @override + String get settingsVideoResumptionModeTile => 'Reprise de lecture'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Reprise de lecture'; + + @override + String get settingsVideoBackgroundMode => 'Lecture en arrière-plan'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Arrière-plan'; + + @override + String get settingsVideoControlsTile => 'Contrôles'; + + @override + String get settingsVideoControlsPageTitle => 'Contrôles'; + + @override + String get settingsVideoButtonsTile => 'Boutons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Appuyer deux fois pour lire ou mettre en pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Appuyer deux fois sur les bords de l’écran pour reculer ou avancer'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Balayer verticalement pour ajuster la luminosité et le volume'; + + @override + String get settingsSubtitleThemeTile => 'Sous-titres'; + + @override + String get settingsSubtitleThemePageTitle => 'Sous-titres'; + + @override + String get settingsSubtitleThemeSample => 'Ceci est un exemple.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Alignement du texte'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Alignement du texte'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Position du texte'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Position du texte'; + + @override + String get settingsSubtitleThemeTextSize => 'Taille du texte'; + + @override + String get settingsSubtitleThemeShowOutline => 'Afficher les contours et ombres'; + + @override + String get settingsSubtitleThemeTextColor => 'Couleur du texte'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Transparence du texte'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Couleur d’arrière-plan'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Transparence de l’arrière-plan'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'gauche'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'centré'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'droite'; + + @override + String get settingsPrivacySectionTitle => 'Confidentialité'; + + @override + String get settingsAllowInstalledAppAccess => 'Autoriser l’accès à l’inventaire des apps'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Pour un affichage amélioré des albums'; + + @override + String get settingsAllowErrorReporting => 'Autoriser l’envoi de rapports d’erreur'; + + @override + String get settingsSaveSearchHistory => 'Maintenir un historique des recherches'; + + @override + String get settingsEnableBin => 'Utiliser la corbeille'; + + @override + String get settingsEnableBinSubtitle => 'Conserver les éléments supprimés pendant 30 jours'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Les éléments dans la corbeille seront supprimés définitivement.'; + + @override + String get settingsAllowMediaManagement => 'Autoriser la gestion des médias'; + + @override + String get settingsHiddenItemsTile => 'Éléments masqués'; + + @override + String get settingsHiddenItemsPageTitle => 'Éléments masqués'; + + @override + String get settingsHiddenFiltersBanner => 'Les images et vidéos correspondantes aux filtres masqués n’apparaîtront pas dans votre collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'Aucun filtre masqué'; + + @override + String get settingsStorageAccessTile => 'Accès au stockage'; + + @override + String get settingsStorageAccessPageTitle => 'Accès au stockage'; + + @override + String get settingsStorageAccessBanner => 'Une autorisation d’accès au stockage est nécessaire pour modifier le contenu de certains dossiers. Voici la liste des autorisations couramment en vigueur.'; + + @override + String get settingsStorageAccessEmpty => 'Aucune autorisation d’accès'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Retirer'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibilité'; + + @override + String get settingsRemoveAnimationsTile => 'Suppression des animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Suppression des animations'; + + @override + String get settingsTimeToTakeActionTile => 'Délai pour effectuer une action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Afficher des alternatives aux interactions multitactiles'; + + @override + String get settingsDisplaySectionTitle => 'Affichage'; + + @override + String get settingsThemeBrightnessTile => 'Thème'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Thème'; + + @override + String get settingsThemeColorHighlights => 'Surlignages colorés'; + + @override + String get settingsThemeEnableDynamicColor => 'Couleur dynamique'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Fréquence d’actualisation de l’écran'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Fréquence d’actualisation'; + + @override + String get settingsDisplayUseTvInterface => 'Interface Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Langue & Formats'; + + @override + String get settingsLanguageTile => 'Langue'; + + @override + String get settingsLanguagePageTitle => 'Langue'; + + @override + String get settingsCoordinateFormatTile => 'Format de coordonnées'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Format de coordonnées'; + + @override + String get settingsUnitSystemTile => 'Unités'; + + @override + String get settingsUnitSystemDialogTitle => 'Unités'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Toujours utiliser les chiffres arabes'; + + @override + String get settingsScreenSaverPageTitle => 'Économiseur d’écran'; + + @override + String get settingsWidgetPageTitle => 'Cadre photo'; + + @override + String get settingsWidgetShowOutline => 'Contours'; + + @override + String get settingsWidgetOpenPage => 'Quand vous appuyez sur le widget'; + + @override + String get settingsWidgetDisplayedItem => 'Élément affiché'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Statistiques'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString éléments localisés', + one: '1 élément localisé', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top pays'; + + @override + String get statsTopStatesSectionTitle => 'Top États'; + + @override + String get statsTopPlacesSectionTitle => 'Top lieux'; + + @override + String get statsTopTagsSectionTitle => 'Top étiquettes'; + + @override + String get statsTopAlbumsSectionTitle => 'Top albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OUVRIR LE PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'APPLIQUER'; + + @override + String get viewerErrorUnknown => 'Zut !'; + + @override + String get viewerErrorDoesNotExist => 'Le fichier n’existe plus.'; + + @override + String get viewerInfoPageTitle => 'Détails'; + + @override + String get viewerInfoBackToViewerTooltip => 'Retour à la visionneuse'; + + @override + String get viewerInfoUnknown => 'inconnu'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Titre'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Résolution'; + + @override + String get viewerInfoLabelSize => 'Taille'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Chemin'; + + @override + String get viewerInfoLabelDuration => 'Durée'; + + @override + String get viewerInfoLabelOwner => 'Propriétaire'; + + @override + String get viewerInfoLabelCoordinates => 'Coordonnées'; + + @override + String get viewerInfoLabelAddress => 'Adresse'; + + @override + String get mapStyleDialogTitle => 'Type de carte'; + + @override + String get mapStyleDialogAddStyle => 'Ajouter un style'; + + @override + String get mapStyleTooltip => 'Sélectionner le type de carte'; + + @override + String get mapStyleEditorDialogName => 'Nom'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Sous-domaines'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoomer'; + + @override + String get mapZoomOutTooltip => 'Dézoomer'; + + @override + String get mapPointNorthUpTooltip => 'Placer le nord en haut'; + + @override + String get mapAttributionOsmData => 'Données © les contributeurs d’[OpenStreetMap](https://www.openstreetmap.org/copyright)'; + + @override + String get mapAttributionOsmLiberty => 'Fond de carte par [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hébergé par [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Fond de carte par [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Fond de carte par [HOT](https://www.hotosm.org/) • Hébergé par [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Fond de carte par [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Ouvrir la page Carte'; + + @override + String get mapEmptyRegion => 'Aucune image dans cette région'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Échec de l’extraction des données'; + + @override + String get viewerInfoOpenLinkText => 'Ouvrir'; + + @override + String get viewerInfoViewXmlLinkText => 'Afficher le XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Recherche de métadonnées'; + + @override + String get viewerInfoSearchEmpty => 'Aucune clé correspondante'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & heure'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Résolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Droits'; + + @override + String get wallpaperUseScrollEffect => 'Utiliser l’effet de défilement sur l’écran d’accueil'; + + @override + String get tagEditorPageTitle => 'Modifier les étiquettes'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Nouvelle étiquette'; + + @override + String get tagEditorPageAddTagTooltip => 'Ajouter l’étiquette'; + + @override + String get tagEditorSectionRecent => 'Ajouts récents'; + + @override + String get tagEditorSectionPlaceholders => 'Étiquettes de substitution'; + + @override + String get tagEditorDiscardDialogMessage => 'Voulez-vous ignorer les changements ?'; + + @override + String get tagPlaceholderCountry => 'Pays'; + + @override + String get tagPlaceholderState => 'État'; + + @override + String get tagPlaceholderPlace => 'Lieu'; + + @override + String get panoramaEnableSensorControl => 'Activer le contrôle par capteurs'; + + @override + String get panoramaDisableSensorControl => 'Désactiver le contrôle par capteurs'; + + @override + String get sourceViewerPageTitle => 'Code source'; +} diff --git a/lib/l10ngen/app_localizations_gl.dart b/lib/l10ngen/app_localizations_gl.dart new file mode 100644 index 0000000..b7be36b --- /dev/null +++ b/lib/l10ngen/app_localizations_gl.dart @@ -0,0 +1,2421 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Galician (`gl`). +class AppLocalizationsGl extends AppLocalizations { + AppLocalizationsGl([String locale = 'gl']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Benvido a Aves'; + + @override + String get welcomeOptional => 'Opcional'; + + @override + String get welcomeTermsToggle => 'Acepto os termos e condicións'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementos', + one: '$count elemento', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString columnas', + one: '$countString columna', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString segundos', + one: '$countString segundo', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutos', + one: '$countString minuto', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString días', + one: '$countString día', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APLICAR'; + + @override + String get createButtonLabel => 'CREAR'; + + @override + String get deleteButtonLabel => 'ELIMINAR'; + + @override + String get nextButtonLabel => 'SEGUINTE'; + + @override + String get showButtonLabel => 'AMOSAR'; + + @override + String get hideButtonLabel => 'AGOCHAR'; + + @override + String get continueButtonLabel => 'PROSEGUIR'; + + @override + String get saveCopyButtonLabel => 'GARDAR COPIA'; + + @override + String get applyTooltip => 'Aplicar'; + + @override + String get cancelTooltip => 'Cancelar'; + + @override + String get changeTooltip => 'Trocar'; + + @override + String get clearTooltip => 'Limpar'; + + @override + String get previousTooltip => 'Anterior'; + + @override + String get nextTooltip => 'Seguinte'; + + @override + String get showTooltip => 'Amosar'; + + @override + String get hideTooltip => 'Agochar'; + + @override + String get actionRemove => 'Retirar'; + + @override + String get resetTooltip => 'Restituír'; + + @override + String get saveTooltip => 'Gardar'; + + @override + String get stopTooltip => 'Deter'; + + @override + String get pickTooltip => 'Escoller'; + + @override + String get doubleBackExitMessage => 'Prema «atrás» de novo para saír.'; + + @override + String get doNotAskAgain => 'Non preguntar de novo'; + + @override + String get sourceStateLoading => 'Cargando'; + + @override + String get sourceStateCataloguing => 'Catalogando'; + + @override + String get sourceStateLocatingCountries => 'Localizando países'; + + @override + String get sourceStateLocatingPlaces => 'Localizando lugares'; + + @override + String get chipActionDelete => 'Eliminar'; + + @override + String get chipActionRemove => 'Retirar'; + + @override + String get chipActionShowCollection => 'Amosar na colección'; + + @override + String get chipActionGoToAlbumPage => 'Amosar en álbums'; + + @override + String get chipActionGoToCountryPage => 'Amosar en países'; + + @override + String get chipActionGoToPlacePage => 'Amosar en lugares'; + + @override + String get chipActionGoToTagPage => 'Amosar en etiquetas'; + + @override + String get chipActionGoToExplorerPage => 'Amosar no explorador'; + + @override + String get chipActionDecompose => 'Separar'; + + @override + String get chipActionFilterOut => 'Excluír'; + + @override + String get chipActionFilterIn => 'Incluír'; + + @override + String get chipActionHide => 'Agochar'; + + @override + String get chipActionLock => 'Bloquear'; + + @override + String get chipActionPin => 'Fixar na parte superior'; + + @override + String get chipActionUnpin => 'Desbloquear dende arriba'; + + @override + String get chipActionGroup => 'Cambiar agrupamento'; + + @override + String get chipActionRename => 'Cambiar o nome'; + + @override + String get chipActionSetCover => 'Definir cuberta'; + + @override + String get chipActionShowCountryStates => 'Amosar estados'; + + @override + String get chipActionCreateGroup => 'Crear grupo'; + + @override + String get chipActionCreateAlbum => 'Crear álbum'; + + @override + String get chipActionCreateVault => 'Crear cofre'; + + @override + String get chipActionConfigureVault => 'Configurar cofre'; + + @override + String get entryActionCopyToClipboard => 'Copiar ao portapapeis'; + + @override + String get entryActionDelete => 'Eliminar'; + + @override + String get entryActionConvert => 'Converter'; + + @override + String get entryActionExport => 'Exportar'; + + @override + String get entryActionInfo => 'Información'; + + @override + String get entryActionRename => 'Cambiar o nome'; + + @override + String get entryActionRestore => 'Restaurar'; + + @override + String get entryActionRotateCCW => 'Xirar no sentido antihorario'; + + @override + String get entryActionRotateCW => 'Xirar no sentido horario'; + + @override + String get entryActionFlip => 'Voltear horizontalmente'; + + @override + String get entryActionPrint => 'Imprimir'; + + @override + String get entryActionShare => 'Compartir'; + + @override + String get entryActionShareImageOnly => 'Só compartir imaxe'; + + @override + String get entryActionShareVideoOnly => 'Só compartir vídeo'; + + @override + String get entryActionViewSource => 'Ver fonte'; + + @override + String get entryActionShowGeoTiffOnMap => 'Amosar como superposición de mapa'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Converter a imaxe fixa'; + + @override + String get entryActionViewMotionPhotoVideo => 'Abrir vídeo'; + + @override + String get entryActionEdit => 'Editar'; + + @override + String get entryActionOpen => 'Abrir con'; + + @override + String get entryActionSetAs => 'Definir como'; + + @override + String get entryActionCast => 'Transmitir'; + + @override + String get entryActionOpenMap => 'Amosar na aplicación de mapas'; + + @override + String get entryActionRotateScreen => 'Rotar pantalla'; + + @override + String get entryActionAddFavourite => 'Engadir a favoritos'; + + @override + String get entryActionRemoveFavourite => 'Eliminar dos favoritos'; + + @override + String get videoActionCaptureFrame => 'Cadro de captura'; + + @override + String get videoActionMute => 'Silenciar'; + + @override + String get videoActionUnmute => 'Activar son'; + + @override + String get videoActionPause => 'Pausa'; + + @override + String get videoActionPlay => 'Reproducir'; + + @override + String get videoActionReplay10 => 'Cear 10 segundos'; + + @override + String get videoActionSkip10 => 'Avanzar 10 segundos'; + + @override + String get videoActionShowPreviousFrame => 'Amosar fotograma anterior'; + + @override + String get videoActionShowNextFrame => 'Amosar fotograma seguinte'; + + @override + String get videoActionSelectStreams => 'Seleccionar pistas'; + + @override + String get videoActionSetSpeed => 'Velocidade de reprodución'; + + @override + String get videoActionABRepeat => 'Repetir A-B'; + + @override + String get videoRepeatActionSetStart => 'Definir inicio'; + + @override + String get videoRepeatActionSetEnd => 'Definir final'; + + @override + String get viewerActionSettings => 'Configuración'; + + @override + String get viewerActionLock => 'Bloquear visor'; + + @override + String get viewerActionUnlock => 'Desbloquear visor'; + + @override + String get slideshowActionResume => 'Retomar'; + + @override + String get slideshowActionShowInCollection => 'Amosar na colección'; + + @override + String get entryInfoActionEditDate => 'Editar data e hora'; + + @override + String get entryInfoActionEditLocation => 'Editar localización'; + + @override + String get entryInfoActionEditTitleDescription => 'Editar título e descrición'; + + @override + String get entryInfoActionEditRating => 'Editar valoración'; + + @override + String get entryInfoActionEditTags => 'Editar etiquetas'; + + @override + String get entryInfoActionRemoveMetadata => 'Eliminar metadatos'; + + @override + String get entryInfoActionExportMetadata => 'Exportar metadatos'; + + @override + String get entryInfoActionRemoveLocation => 'Retirar localización'; + + @override + String get editorActionTransform => 'Transformar'; + + @override + String get editorTransformCrop => 'Recortar'; + + @override + String get editorTransformRotate => 'Xirar'; + + @override + String get cropAspectRatioFree => 'Libre'; + + @override + String get cropAspectRatioOriginal => 'Orixinal'; + + @override + String get cropAspectRatioSquare => 'Cadrado'; + + @override + String get filterAspectRatioLandscapeLabel => 'Paisaxe'; + + @override + String get filterAspectRatioPortraitLabel => 'Retrato'; + + @override + String get filterBinLabel => 'Lixo'; + + @override + String get filterFavouriteLabel => 'Favorito'; + + @override + String get filterNoDateLabel => 'Sen data'; + + @override + String get filterNoAddressLabel => 'Sen enderezo'; + + @override + String get filterLocatedLabel => 'Localizado'; + + @override + String get filterNoLocationLabel => 'Sen localizar'; + + @override + String get filterNoRatingLabel => 'Sen clasificar'; + + @override + String get filterTaggedLabel => 'Etiquetado'; + + @override + String get filterNoTagLabel => 'Sen etiquetar'; + + @override + String get filterNoTitleLabel => 'Sen título'; + + @override + String get filterOnThisDayLabel => 'Neste día'; + + @override + String get filterRecentlyAddedLabel => 'Engadido recentemente'; + + @override + String get filterRatingRejectedLabel => 'Rexeitado'; + + @override + String get filterTypeAnimatedLabel => 'Animado'; + + @override + String get filterTypeMotionPhotoLabel => 'Foto en movemento'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => 'Vídeo 360°'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Imaxe'; + + @override + String get filterMimeVideoLabel => 'Vídeo'; + + @override + String get accessibilityAnimationsRemove => 'Evitar efectos de pantalla'; + + @override + String get accessibilityAnimationsKeep => 'Manter efectos de pantalla'; + + @override + String get albumTierNew => 'Novo'; + + @override + String get albumTierPinned => 'Fixado'; + + @override + String get albumTierGroups => 'Grupos'; + + @override + String get albumTierSpecial => 'Común'; + + @override + String get albumTierApps => 'Aplicacións'; + + @override + String get albumTierVaults => 'Cofres'; + + @override + String get albumTierDynamic => 'Dinámico'; + + @override + String get albumTierRegular => 'Outros'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Graos decimais'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'L'; + + @override + String get coordinateDmsWest => 'O'; + + @override + String get displayRefreshRatePreferHighest => 'Taxa máis alta'; + + @override + String get displayRefreshRatePreferLowest => 'Taxa máis baixa'; + + @override + String get keepScreenOnNever => 'Nunca'; + + @override + String get keepScreenOnVideoPlayback => 'Durante a reproducción de vídeo'; + + @override + String get keepScreenOnViewerOnly => 'Só páxina do visor'; + + @override + String get keepScreenOnAlways => 'Sempre'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Híbrido)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terreo)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (acuarela)'; + + @override + String get maxBrightnessNever => 'Nunca'; + + @override + String get maxBrightnessAlways => 'Sempre'; + + @override + String get nameConflictStrategyRename => 'Trocar nome'; + + @override + String get nameConflictStrategyReplace => 'Trocar'; + + @override + String get nameConflictStrategySkip => 'Saltar'; + + @override + String get overlayHistogramNone => 'Ningún'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminancia'; + + @override + String get subtitlePositionTop => 'Parte superior'; + + @override + String get subtitlePositionBottom => 'Fondo'; + + @override + String get themeBrightnessLight => 'Claro'; + + @override + String get themeBrightnessDark => 'Escuro'; + + @override + String get themeBrightnessBlack => 'Negro'; + + @override + String get unitSystemMetric => 'Métrico'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Padrón'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Contrasinal'; + + @override + String get settingsVideoEnablePip => 'Imaxe-en-imaxe'; + + @override + String get videoControlsPlayOutside => 'Abrir con outro reproductor'; + + @override + String get videoLoopModeNever => 'Nunca'; + + @override + String get videoLoopModeShortOnly => 'Só vídeos curtos'; + + @override + String get videoLoopModeAlways => 'Sempre'; + + @override + String get videoPlaybackSkip => 'Saltar'; + + @override + String get videoPlaybackMuted => 'Reproducir sen son'; + + @override + String get videoPlaybackWithSound => 'Reproducir con son'; + + @override + String get videoResumptionModeNever => 'Nunca'; + + @override + String get videoResumptionModeAlways => 'Sempre'; + + @override + String get viewerTransitionSlide => 'Diapositiva'; + + @override + String get viewerTransitionParallax => 'Paralaxe'; + + @override + String get viewerTransitionFade => 'Esvaecer'; + + @override + String get viewerTransitionZoomIn => 'Achegar'; + + @override + String get viewerTransitionNone => 'Ningún'; + + @override + String get wallpaperTargetHome => 'Pantalla de inicio'; + + @override + String get wallpaperTargetLock => 'Pantalla de bloqueo'; + + @override + String get wallpaperTargetHomeLock => 'Pantallas de inicio e bloqueo'; + + @override + String get widgetDisplayedItemRandom => 'Aleatorio'; + + @override + String get widgetDisplayedItemMostRecent => 'Máis recente'; + + @override + String get widgetOpenPageHome => 'Abrir inicio'; + + @override + String get widgetOpenPageCollection => 'Abrir colección'; + + @override + String get widgetOpenPageViewer => 'Abrir visor'; + + @override + String get widgetTapUpdateWidget => 'Actualizar widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Almacenaxe interna'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'Tarxeta SD'; + + @override + String get rootDirectoryDescription => 'directorio raiz'; + + @override + String otherDirectoryDescription(String name) { + return 'directorio «$name»'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Por favor, seleccione o $directory de «$volume» na seguinte pantalla para lle fornecer acceso a esta aplicación.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Esta apliación non ten permiso para modificar arquivos no $directory de «$volume».\n\nPor favor, empregue un xestor de arquivos ou galería preinstalados para mover os elementos a outro directorio.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Esta operación precisa $neededSize de espazo libre en «$volume» para se completar, pero só hai $freeSize dispoñible.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'O selector de arquivos falta ou está desactivado. Por favor, actíveo e tente de novo.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Operación non soportada para elementos destes tipos: $types.', + one: 'Operación non soportada para elementos deste tipo: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Algúns arquivos do directorio de destiño teñen o mesmo nome.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Algúns arquivos teñen o mesmo nome.'; + + @override + String get addShortcutDialogLabel => 'Etiqueta do atallo'; + + @override + String get addShortcutButtonLabel => 'ENGADIR'; + + @override + String get noMatchingAppDialogMessage => 'Non hai aplicacións que poidan manexar isto.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Mover estes $countString elementos ao lixo?', + one: 'Mover este elemento ao lixo?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Borrar estes $countString elementos?', + one: 'Borrar este elemento?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Gardar as datas dos elementos antes de continuar?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Gardar datas'; + + @override + String videoResumeDialogMessage(String time) { + return 'Desexa continuar a reproducción dende $time?'; + } + + @override + String get videoStartOverButtonLabel => 'RECOMEZAR'; + + @override + String get videoResumeButtonLabel => 'RETOMAR'; + + @override + String get setCoverDialogLatest => 'Último elemento'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Personalizado'; + + @override + String get hideFilterConfirmationDialogMessage => 'Agocharánse da súa colección as fotos e vídeos que concorden. Pódense amosar de novo dende os axustes de «Privacidade».\n\nEstá certo de querer agochalos?'; + + @override + String get newAlbumDialogTitle => 'Novo álbum'; + + @override + String get newAlbumDialogNameLabel => 'Nome do álbum'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Xa existe o álbum'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Xa existe o directorio'; + + @override + String get newAlbumDialogStorageLabel => 'Almacenaxe:'; + + @override + String get newDynamicAlbumDialogTitle => 'Novo álbum dinámico'; + + @override + String get dynamicAlbumAlreadyExists => 'Xa existe o álbum dinámico'; + + @override + String get newGroupDialogTitle => 'Novo grupo'; + + @override + String get newGroupDialogNameLabel => 'Nome do grupo'; + + @override + String get groupAlreadyExists => 'Xa existe o grupo'; + + @override + String get groupEmpty => 'Sen grupos'; + + @override + String get ungrouped => 'Non agrupado'; + + @override + String get groupPickerTitle => 'Escolmar grupo'; + + @override + String get groupPickerUseThisGroupButton => 'Usar este grupo'; + + @override + String get newVaultWarningDialogMessage => 'Os elementos en cofres só están dispoñibles para esta aplicación.\n\nPerderanse ao desinstalala ou ao borrar os seus datos.'; + + @override + String get newVaultDialogTitle => 'Novo cofre'; + + @override + String get configureVaultDialogTitle => 'Configurar cofre'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Bloquear ao se apagar a pantalla'; + + @override + String get vaultDialogLockTypeLabel => 'Tipo de bloqueo'; + + @override + String get patternDialogEnter => 'Inserir padrón'; + + @override + String get patternDialogConfirm => 'Confirmar padrón'; + + @override + String get pinDialogEnter => 'Inserir PIN'; + + @override + String get pinDialogConfirm => 'Confirmar PIN'; + + @override + String get passwordDialogEnter => 'Inserir contrasinal'; + + @override + String get passwordDialogConfirm => 'Confirmar contrasinal'; + + @override + String get authenticateToConfigureVault => 'Autenticarse para configurar o cofre'; + + @override + String get authenticateToUnlockVault => 'Autenticarse para despechar cofre'; + + @override + String get vaultBinUsageDialogMessage => 'Algúns cofres están a utilizar o lixo.'; + + @override + String get renameAlbumDialogLabel => 'Nome novo'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Xa existe o directorio'; + + @override + String get renameEntrySetPageTitle => 'Trocar nome'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Padrón de nomeamento'; + + @override + String get renameEntrySetPageInsertTooltip => 'Inserir campo'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Vista previa'; + + @override + String get renameProcessorCounter => 'Contador'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Nome'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Eliminar este álbum e os seus $countString elementos?', + one: 'Eliminar este álbum e o seu elemento?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Eliminar estes álbums e os seus $countString elementos?', + one: 'Eliminar estes álbums e os seus elementos?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Formato:'; + + @override + String get exportEntryDialogWidth => 'Largo'; + + @override + String get exportEntryDialogHeight => 'Alto'; + + @override + String get exportEntryDialogQuality => 'Calidade'; + + @override + String get exportEntryDialogWriteMetadata => 'Escribir metadatos'; + + @override + String get renameEntryDialogLabel => 'Nome novo'; + + @override + String get editEntryDialogCopyFromItem => 'Copiar dende outro elemento'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Campos a modificar'; + + @override + String get editEntryDateDialogTitle => 'Data e hora'; + + @override + String get editEntryDateDialogSetCustom => 'Definir data personalizada'; + + @override + String get editEntryDateDialogCopyField => 'Copiar dende outra data'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extraer do título'; + + @override + String get editEntryDateDialogShift => 'Mover'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Data de modificación do arquivo'; + + @override + String get durationDialogHours => 'Horas'; + + @override + String get durationDialogMinutes => 'Minutos'; + + @override + String get durationDialogSeconds => 'Segundos'; + + @override + String get editEntryLocationDialogTitle => 'Localización'; + + @override + String get editEntryLocationDialogSetCustom => 'Establecer localización personalizada'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Escoller no mapa'; + + @override + String get editEntryLocationDialogImportGpx => 'Importar GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Lonxitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Cambio de tempo'; + + @override + String get locationPickerUseThisLocationButton => 'Usar esta localización'; + + @override + String get editEntryRatingDialogTitle => 'Valoración'; + + @override + String get removeEntryMetadataDialogTitle => 'Supresión de metadatos'; + + @override + String get removeEntryMetadataDialogAll => 'Todo'; + + @override + String get removeEntryMetadataDialogMore => 'Máis'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'Precísase XMP para reproducir a animación dunha foto en movemento.\n\nEstá certo de querer eliminalo?'; + + @override + String get videoSpeedDialogLabel => 'Velocidade de reproducción'; + + @override + String get videoStreamSelectionDialogVideo => 'Vídeo'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtítulos'; + + @override + String get videoStreamSelectionDialogOff => 'Desactivado'; + + @override + String get videoStreamSelectionDialogTrack => 'Pista'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Non hai outras pistas.'; + + @override + String get genericSuccessFeedback => 'Feito!'; + + @override + String get genericFailureFeedback => 'Fallou'; + + @override + String get genericDangerWarningDialogMessage => 'Está certo?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Tente de novo con menos elementos.'; + + @override + String get menuActionConfigureView => 'Vista'; + + @override + String get menuActionSelect => 'Escolmar'; + + @override + String get menuActionSelectAll => 'Escolmar todo'; + + @override + String get menuActionSelectNone => 'Non escolmar ningún'; + + @override + String get menuActionMap => 'Mapa'; + + @override + String get menuActionSlideshow => 'Presentación'; + + @override + String get menuActionStats => 'Estatísticas'; + + @override + String get viewDialogSortSectionTitle => 'Ordenar'; + + @override + String get viewDialogGroupSectionTitle => 'Seccións'; + + @override + String get viewDialogLayoutSectionTitle => 'Disposición'; + + @override + String get viewDialogReverseSortOrder => 'Invertir ordenación'; + + @override + String get tileLayoutMosaic => 'Mosaico'; + + @override + String get tileLayoutGrid => 'Cuadrícula'; + + @override + String get tileLayoutList => 'Lista'; + + @override + String get castDialogTitle => 'Dispositivos de emisión'; + + @override + String get coverDialogTabCover => 'Cuberta'; + + @override + String get coverDialogTabApp => 'Aplicación'; + + @override + String get coverDialogTabColor => 'Cor'; + + @override + String get appPickDialogTitle => 'Escoller aplicación'; + + @override + String get appPickDialogNone => 'Ningún'; + + @override + String get aboutPageTitle => 'Verbo de'; + + @override + String get aboutLinkLicense => 'Licenza'; + + @override + String get aboutLinkPolicy => 'Política de privacidade'; + + @override + String get aboutBugSectionTitle => 'Informe de erros'; + + @override + String get aboutBugSaveLogInstruction => 'Gardar rexistros da aplicación nun arquivo'; + + @override + String get aboutBugCopyInfoInstruction => 'Copiar a información do sistema'; + + @override + String get aboutBugCopyInfoButton => 'Copiar'; + + @override + String get aboutBugReportInstruction => 'Informar en GitHub cos rexistros e información do sistema'; + + @override + String get aboutBugReportButton => 'Informar'; + + @override + String get aboutDataUsageSectionTitle => 'Uso de datos'; + + @override + String get aboutDataUsageData => 'Datos'; + + @override + String get aboutDataUsageCache => 'Caché'; + + @override + String get aboutDataUsageDatabase => 'Base de datos'; + + @override + String get aboutDataUsageMisc => 'Varios'; + + @override + String get aboutDataUsageInternal => 'Interno'; + + @override + String get aboutDataUsageExternal => 'Externo'; + + @override + String get aboutDataUsageClearCache => 'Limpar caché'; + + @override + String get aboutCreditsSectionTitle => 'Créditos'; + + @override + String get aboutCreditsWorldAtlas1 => 'Esta apliación usa un arquivo TopoJSON de'; + + @override + String get aboutCreditsWorldAtlas2 => 'baixo licenza ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'Tradutores'; + + @override + String get aboutLicensesSectionTitle => 'Licenzas de código aberto'; + + @override + String get aboutLicensesBanner => 'Esta aplicación usa os paquetes e bibliotecas de código aberto que seguen.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Bibliotecas de Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Plugins de Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Paquetes de Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Paquetes de Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Amosar todas as licenzas'; + + @override + String get policyPageTitle => 'Política de privacidade'; + + @override + String get collectionPageTitle => 'Colección'; + + @override + String get collectionPickPageTitle => 'Escolmar'; + + @override + String get collectionSelectPageTitle => 'Escolmar elementos'; + + @override + String get collectionActionShowTitleSearch => 'Amosar filtro de título'; + + @override + String get collectionActionHideTitleSearch => 'Agochar filtro de título'; + + @override + String get collectionActionAddDynamicAlbum => 'Engadir álbum dinámico'; + + @override + String get collectionActionAddShortcut => 'Engadir atallo'; + + @override + String get collectionActionSetHome => 'Fixar como inicio'; + + @override + String get collectionActionEmptyBin => 'Baleirar lixo'; + + @override + String get collectionActionCopy => 'Copiar a álbum'; + + @override + String get collectionActionMove => 'Mover a álbum'; + + @override + String get collectionActionRescan => 'Ler de novo'; + + @override + String get collectionActionEdit => 'Editar'; + + @override + String get collectionSearchTitlesHintText => 'Procurar títulos'; + + @override + String get collectionGroupAlbum => 'Por álbum'; + + @override + String get collectionGroupMonth => 'Por mes'; + + @override + String get collectionGroupDay => 'Por día'; + + @override + String get sectionNone => 'Sen seccións'; + + @override + String get sectionUnknown => 'Descoñecido'; + + @override + String get dateToday => 'Hoxe'; + + @override + String get dateYesterday => 'Onte'; + + @override + String get dateThisMonth => 'Este mes'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Erro ao borrar $countString elementos', + one: 'Erro ao borrar un elemento', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Erro ao copiar $countString elementos', + one: 'Erro ao copiar un elemento', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Erro ao mover $countString elementos', + one: 'Erro ao mover un elemento', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Erro ao trocar o nome de $countString elementos', + one: 'Erro ao trocar o nome dun elemento', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Erro ao editar $countString elementos', + one: 'Erro ao editar un elemento', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Erro ao exportar $countString páxinas', + one: 'Erro ao exportar unha páxina', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copiados $countString elementos', + one: 'Copiado un elemento', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Movidos $countString elementos', + one: 'Movido un elemento', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Trocado o nome de $countString elementos', + one: 'Trocado o nome dun elemento', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Editados $countString elementos', + one: 'Editado un elemento', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Sen favoritos'; + + @override + String get collectionEmptyVideos => 'Sen vídeos'; + + @override + String get collectionEmptyImages => 'Sen imaxes'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Dar acceso'; + + @override + String get collectionSelectSectionTooltip => 'Escolmar sección'; + + @override + String get collectionDeselectSectionTooltip => 'Desescolmar sección'; + + @override + String get drawerAboutButton => 'Verbo de'; + + @override + String get drawerSettingsButton => 'Axustes'; + + @override + String get drawerCollectionAll => 'Toda a colección'; + + @override + String get drawerCollectionFavourites => 'Favoritos'; + + @override + String get drawerCollectionImages => 'Imaxes'; + + @override + String get drawerCollectionVideos => 'Vídeos'; + + @override + String get drawerCollectionAnimated => 'Animacións'; + + @override + String get drawerCollectionMotionPhotos => 'Fotos en movemento'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Fotos Raw'; + + @override + String get drawerCollectionSphericalVideos => 'Vídeos 360°'; + + @override + String get drawerAlbumPage => 'Álbums'; + + @override + String get drawerCountryPage => 'Países'; + + @override + String get drawerPlacePage => 'Lugares'; + + @override + String get drawerTagPage => 'Etiquetas'; + + @override + String get sortByDate => 'Por data'; + + @override + String get sortByName => 'Por nome'; + + @override + String get sortByItemCount => 'Por número de elementos'; + + @override + String get sortBySize => 'Por tamaño'; + + @override + String get sortByAlbumFileName => 'Por nome de álbum e título'; + + @override + String get sortByRating => 'Por valoración'; + + @override + String get sortByDuration => 'Por duración'; + + @override + String get sortByPath => 'Por ruta'; + + @override + String get sortOrderNewestFirst => 'Novos primeiro'; + + @override + String get sortOrderOldestFirst => 'Vellos primeiro'; + + @override + String get sortOrderAtoZ => 'A ao Z'; + + @override + String get sortOrderZtoA => 'Z ao A'; + + @override + String get sortOrderHighestFirst => 'Máis altos primeiro'; + + @override + String get sortOrderLowestFirst => 'Máis baixos primeiro'; + + @override + String get sortOrderLargestFirst => 'Máis grandes primeiro'; + + @override + String get sortOrderSmallestFirst => 'Máis pequenos primeiro'; + + @override + String get sortOrderShortestFirst => 'Máis curtos primeiro'; + + @override + String get sortOrderLongestFirst => 'Máis longos primeiro'; + + @override + String get albumGroupTier => 'Por nivel'; + + @override + String get albumGroupType => 'Por tipo'; + + @override + String get albumGroupVolume => 'Por volume de almacenaxe'; + + @override + String get albumMimeTypeMixed => 'Mesturado'; + + @override + String get albumPickPageTitleCopy => 'Copiar a álbum'; + + @override + String get albumPickPageTitleExport => 'Exportar a álbum'; + + @override + String get albumPickPageTitleMove => 'Mover a álbum'; + + @override + String get albumPickPageTitlePick => 'Escolmar álbum'; + + @override + String get albumCamera => 'Cámara'; + + @override + String get albumDownload => 'Descargas'; + + @override + String get albumScreenshots => 'Capturas de pantalla'; + + @override + String get albumScreenRecordings => 'Gravacións de pantalla'; + + @override + String get albumVideoCaptures => 'Capturas de vídeo'; + + @override + String get albumPageTitle => 'Álbums'; + + @override + String get albumEmpty => 'Sen álbums'; + + @override + String get createAlbumButtonLabel => 'CREAR'; + + @override + String get newFilterBanner => 'novo'; + + @override + String get countryPageTitle => 'Países'; + + @override + String get countryEmpty => 'Sen países'; + + @override + String get statePageTitle => 'Estados'; + + @override + String get stateEmpty => 'Sen estados'; + + @override + String get placePageTitle => 'Lugares'; + + @override + String get placeEmpty => 'Sen lugares'; + + @override + String get tagPageTitle => 'Etiquetas'; + + @override + String get tagEmpty => 'Sen etiquetas'; + + @override + String get tagPickPageTitle => 'Escoller etiqueta'; + + @override + String get binPageTitle => 'Lixo'; + + @override + String get explorerPageTitle => 'Explorador'; + + @override + String get explorerActionSelectStorageVolume => 'Escolmar almacenaxe'; + + @override + String get selectStorageVolumeDialogTitle => 'Escolmar almacenaxe'; + + @override + String get searchCollectionFieldHint => 'Procurar en colección'; + + @override + String get searchRecentSectionTitle => 'Recente'; + + @override + String get searchDateSectionTitle => 'Data'; + + @override + String get searchFormatSectionTitle => 'Formatos'; + + @override + String get searchAlbumsSectionTitle => 'Álbums'; + + @override + String get searchCountriesSectionTitle => 'Países'; + + @override + String get searchStatesSectionTitle => 'Estados'; + + @override + String get searchPlacesSectionTitle => 'Lugares'; + + @override + String get searchTagsSectionTitle => 'Etiquetas'; + + @override + String get searchRatingSectionTitle => 'Valoracións'; + + @override + String get searchMetadataSectionTitle => 'Metadatos'; + + @override + String get settingsPageTitle => 'Axustes'; + + @override + String get settingsSystemDefault => 'Sistema'; + + @override + String get settingsDefault => 'Por defecto'; + + @override + String get settingsDisabled => 'Desactivado'; + + @override + String get settingsEnabled => 'Activado'; + + @override + String get settingsForced => 'Forzado'; + + @override + String get settingsAskEverytime => 'Preguntar sempre'; + + @override + String get settingsModificationWarningDialogMessage => 'Modificaranse outros axustes.'; + + @override + String get settingsSearchFieldLabel => 'Procurar axustes'; + + @override + String get settingsSearchEmpty => 'Sen coincidencia'; + + @override + String get settingsActionExport => 'Exportar'; + + @override + String get settingsActionExportDialogTitle => 'Exportar'; + + @override + String get settingsActionImport => 'Importar'; + + @override + String get settingsActionImportDialogTitle => 'Importar'; + + @override + String get appExportCovers => 'Cubertas'; + + @override + String get appExportDynamicAlbums => 'Álbums dinámicos'; + + @override + String get appExportFavourites => 'Favoritos'; + + @override + String get appExportSettings => 'Axustes'; + + @override + String get settingsNavigationSectionTitle => 'Navegación'; + + @override + String get settingsHomeTile => 'Inicio'; + + @override + String get settingsHomeDialogTitle => 'Inicio'; + + @override + String get setHomeCustom => 'Personalizado'; + + @override + String get settingsKeepScreenOnTile => 'Manter pantalla acesa'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Manter pantalla acesa'; + + @override + String get settingsDoubleBackExit => 'Premer «atrás» dúas veces para saír'; + + @override + String get settingsConfirmationTile => 'Diálogos de confirmación'; + + @override + String get settingsConfirmationDialogTitle => 'Diálogos de confirmación'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Preguntar antes de borrar elementos para sempre'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Preguntar antes de enviar elementos ao lixo'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Preguntar antes de mover elementos sen data'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Amosar mensaxe tras mover elementos ao lixo'; + + @override + String get settingsConfirmationVaultDataLoss => 'Amosar aviso de perda de datos en cofre'; + + @override + String get settingsNavigationDrawerTile => 'Menú de navegación'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Menú de navegación'; + + @override + String get settingsNavigationDrawerBanner => 'Premer e manter para mover e reordenar elementos do menú.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Tipos'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Álbums'; + + @override + String get settingsNavigationDrawerTabPages => 'Páxinas'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Engadir álbum'; + + @override + String get settingsNavigationBottomActionsTile => 'Barra de navegación inferior'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Barra de navegación inferior'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Prema e manteña para mover botóns e escolmar que accións se amosarán na barra de navegación inferior.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniaturas'; + + @override + String get settingsThumbnailOverlayTile => 'Superposición'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Superposición'; + + @override + String get settingsThumbnailShowHdrIcon => 'Amosar icona de HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Amosar icona de favorito'; + + @override + String get settingsThumbnailShowTagIcon => 'Amosar icona de etiqueta'; + + @override + String get settingsThumbnailShowLocationIcon => 'Amosar icona de localización'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Amosar icona de foto en movemento'; + + @override + String get settingsThumbnailShowRating => 'Amosar valoración'; + + @override + String get settingsThumbnailShowRawIcon => 'Amosar icona de RAW'; + + @override + String get settingsThumbnailShowVideoDuration => 'Amosar duración de vídeo'; + + @override + String get settingsCollectionQuickActionsTile => 'Accións rápidas'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Accións rápidas'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Navegando'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Escolmando'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Prema e manteña para mover botóns e escoller que accións se amosarán ao navegar polo elementos.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Prema e manteña para mover botóns e escoller que accións se amosarán ao navegar polos elementos.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Patróns de refacho'; + + @override + String get settingsCollectionBurstPatternsNone => 'Ningún'; + + @override + String get settingsViewerSectionTitle => 'Visor'; + + @override + String get settingsViewerGestureSideTapNext => 'Tocar nos bordes da pantalla para amosar o elemento anterior/seguinte'; + + @override + String get settingsViewerUseCutout => 'Usar a área recortada'; + + @override + String get settingsViewerMaximumBrightness => 'Brillo máximo'; + + @override + String get settingsMotionPhotoAutoPlay => 'Reproducir automáticamente fotos en movemento'; + + @override + String get settingsImageBackground => 'Fondo de imaxe'; + + @override + String get settingsViewerQuickActionsTile => 'Accións rápidas'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Accións rápidas'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Prema e manteña para mover botóns e escoller que accións se amosarán no visor.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Botóns amosados'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Botóns dispoñibles'; + + @override + String get settingsViewerQuickActionEmpty => 'Sen botóns'; + + @override + String get settingsViewerOverlayTile => 'Superposición'; + + @override + String get settingsViewerOverlayPageTitle => 'Superposición'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Amosar ao abrir'; + + @override + String get settingsViewerShowHistogram => 'Amosar histograma'; + + @override + String get settingsViewerShowMinimap => 'Amosar minimapa'; + + @override + String get settingsViewerShowZoomLevel => 'Amosar nivel de zoom'; + + @override + String get settingsViewerShowInformation => 'Amosar información'; + + @override + String get settingsViewerShowInformationSubtitle => 'Amosar título, data, localización, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Amosar valoración e etiquetas'; + + @override + String get settingsViewerShowShootingDetails => 'Amosar detalles da toma'; + + @override + String get settingsViewerShowDescription => 'Amosar descrición'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Amosar miniaturas'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Efecto de desenfoque'; + + @override + String get settingsViewerSlideshowTile => 'Presentación'; + + @override + String get settingsViewerSlideshowPageTitle => 'Presentación'; + + @override + String get settingsSlideshowRepeat => 'Repetir'; + + @override + String get settingsSlideshowShuffle => 'Barallar'; + + @override + String get settingsSlideshowFillScreen => 'Encher pantalla'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Efecto de zoom animado'; + + @override + String get settingsSlideshowTransitionTile => 'Transición'; + + @override + String get settingsSlideshowIntervalTile => 'Intervalo'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Reprodución de vídeo'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Reprodución de vídeo'; + + @override + String get settingsVideoPageTitle => 'Axustes de vídeo'; + + @override + String get settingsVideoSectionTitle => 'Vídeo'; + + @override + String get settingsVideoShowVideos => 'Amosar vídeos'; + + @override + String get settingsVideoPlaybackTile => 'Reprodución'; + + @override + String get settingsVideoPlaybackPageTitle => 'Reprodución'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Aceleración por hardware'; + + @override + String get settingsVideoAutoPlay => 'Reprodución automática'; + + @override + String get settingsVideoLoopModeTile => 'Modo bucle'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Modo bucle'; + + @override + String get settingsVideoResumptionModeTile => 'Retomar reprodución'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Retomar reprodución'; + + @override + String get settingsVideoBackgroundMode => 'Modo do fondo'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Modo do fondo'; + + @override + String get settingsVideoControlsTile => 'Controis'; + + @override + String get settingsVideoControlsPageTitle => 'Controis'; + + @override + String get settingsVideoButtonsTile => 'Botóns'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Dobre toque para reproducir/pausar'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Dobre toque nos bordes da pantalla para buscar atrás/adiante'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Esvarar para riba ou para abaixo para axustar brillo/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtítulos'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtítulos'; + + @override + String get settingsSubtitleThemeSample => 'Este é un exemplo.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Aliñamento do texto'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Aliñamento do texto'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Posición do texto'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Posición do texto'; + + @override + String get settingsSubtitleThemeTextSize => 'Tamaño do texto'; + + @override + String get settingsSubtitleThemeShowOutline => 'Amosar contorno e sombra'; + + @override + String get settingsSubtitleThemeTextColor => 'Cor do texto'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Opacidade do texto'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Cor de fondo'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Opacidade do fondo'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Esquerda'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Centro'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Dereita'; + + @override + String get settingsPrivacySectionTitle => 'Privacidade'; + + @override + String get settingsAllowInstalledAppAccess => 'Permitir acceso á lista de aplicacións'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Usado para mellorar a visualización dos álbums'; + + @override + String get settingsAllowErrorReporting => 'Permitir informes de erros anónimos'; + + @override + String get settingsSaveSearchHistory => 'Gardar historial de procura'; + + @override + String get settingsEnableBin => 'Usar lixo'; + + @override + String get settingsEnableBinSubtitle => 'Mantén os elementos borrados por 30 días'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Os elementos no lixo borraranse para sempre.'; + + @override + String get settingsAllowMediaManagement => 'Permitir xestión de medios'; + + @override + String get settingsHiddenItemsTile => 'Elementos ocultos'; + + @override + String get settingsHiddenItemsPageTitle => 'Elementos ocultos'; + + @override + String get settingsHiddenFiltersBanner => 'As fotos e vídeos que cadren cos filtros ocultos non se amosarán na súa colección.'; + + @override + String get settingsHiddenFiltersEmpty => 'Sen filtros ocultos'; + + @override + String get settingsStorageAccessTile => 'Acceso á almacenaxe'; + + @override + String get settingsStorageAccessPageTitle => 'Acceso á almacenaxe'; + + @override + String get settingsStorageAccessBanner => 'Algúns directorios precisan permiso explícito de acceso para modificar os arquivos que conteñen. Aquí pode revisar a que directorios lles tera dado acceso.'; + + @override + String get settingsStorageAccessEmpty => 'Sen permisos de acceso'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revogar'; + + @override + String get settingsAccessibilitySectionTitle => 'Accesibilidade'; + + @override + String get settingsRemoveAnimationsTile => 'Eliminar animacións'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Eliminar animacións'; + + @override + String get settingsTimeToTakeActionTile => 'Retardo para executar unha acción'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Amosar alternativas de xestos multitoque'; + + @override + String get settingsDisplaySectionTitle => 'Pantalla'; + + @override + String get settingsThemeBrightnessTile => 'Tema'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Tema'; + + @override + String get settingsThemeColorHighlights => 'Realces de cor'; + + @override + String get settingsThemeEnableDynamicColor => 'Cor dinámica'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Taxa de refresco da pantalla'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Taxa de refresco'; + + @override + String get settingsDisplayUseTvInterface => 'Interface Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Idioma e formatos'; + + @override + String get settingsLanguageTile => 'Idioma'; + + @override + String get settingsLanguagePageTitle => 'Idioma'; + + @override + String get settingsCoordinateFormatTile => 'Formato de coordenadas'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Formato de coordenadas'; + + @override + String get settingsUnitSystemTile => 'Unidades'; + + @override + String get settingsUnitSystemDialogTitle => 'Unidades'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Forzar números arábigos'; + + @override + String get settingsScreenSaverPageTitle => 'Protector de pantalla'; + + @override + String get settingsWidgetPageTitle => 'Marco de foto'; + + @override + String get settingsWidgetShowOutline => 'Contorno'; + + @override + String get settingsWidgetOpenPage => 'Ao tocar no widget'; + + @override + String get settingsWidgetDisplayedItem => 'Elemento amosado'; + + @override + String get settingsCollectionTile => 'Colección'; + + @override + String get statsPageTitle => 'Estatísticas'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString elementos con localización', + one: '1 elemento con localización', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Países principais'; + + @override + String get statsTopStatesSectionTitle => 'Estados principais'; + + @override + String get statsTopPlacesSectionTitle => 'Lugares principais'; + + @override + String get statsTopTagsSectionTitle => 'Etiquetas principais'; + + @override + String get statsTopAlbumsSectionTitle => 'Álbums principais'; + + @override + String get viewerOpenPanoramaButtonLabel => 'ABRIR PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'DEFINIR FONDO'; + + @override + String get viewerErrorUnknown => 'Epa!'; + + @override + String get viewerErrorDoesNotExist => 'Xa non existe o arquivo.'; + + @override + String get viewerInfoPageTitle => 'Información'; + + @override + String get viewerInfoBackToViewerTooltip => 'Tornar ao visor'; + + @override + String get viewerInfoUnknown => 'descoñecido'; + + @override + String get viewerInfoLabelDescription => 'Descrición'; + + @override + String get viewerInfoLabelTitle => 'Título'; + + @override + String get viewerInfoLabelDate => 'Data'; + + @override + String get viewerInfoLabelResolution => 'Resolución'; + + @override + String get viewerInfoLabelSize => 'Tamaño'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Ruta'; + + @override + String get viewerInfoLabelDuration => 'Duración'; + + @override + String get viewerInfoLabelOwner => 'Propietario'; + + @override + String get viewerInfoLabelCoordinates => 'Coordenadas'; + + @override + String get viewerInfoLabelAddress => 'Enderezo'; + + @override + String get mapStyleDialogTitle => 'Estilo do mapa'; + + @override + String get mapStyleDialogAddStyle => 'Engadir estilo'; + + @override + String get mapStyleTooltip => 'Seleccione estilo do mapa'; + + @override + String get mapStyleEditorDialogName => 'Nome'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdominios'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Achegar'; + + @override + String get mapZoomOutTooltip => 'Afastar'; + + @override + String get mapPointNorthUpTooltip => 'Apuntar o norte cara arriba'; + + @override + String get mapAttributionOsmData => 'Datos de mapa © os colaboradores de [OpenStreetMap](https://www.openstreetmap.org/copyright)'; + + @override + String get mapAttributionOsmLiberty => 'Mosaicos de [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hospedado por [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Mosaicos de [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Mosaicos de [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Mosaicos de [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Ver na páxina do mapa'; + + @override + String get mapEmptyRegion => 'Sen imaxes nesta rexión'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Fallo ao extraer datos incrustados'; + + @override + String get viewerInfoOpenLinkText => 'Abrir'; + + @override + String get viewerInfoViewXmlLinkText => 'Ver XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Procurar metadatos'; + + @override + String get viewerInfoSearchEmpty => 'Sen claves concordantes'; + + @override + String get viewerInfoSearchSuggestionDate => 'Data e hora'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Descrición'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensións'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolución'; + + @override + String get viewerInfoSearchSuggestionRights => 'Dereitos'; + + @override + String get wallpaperUseScrollEffect => 'Usar efecto de desprazamento en pantalla de inicio'; + + @override + String get tagEditorPageTitle => 'Editar etiquetas'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Nova etiqueta'; + + @override + String get tagEditorPageAddTagTooltip => 'Engadir etiqueta'; + + @override + String get tagEditorSectionRecent => 'Recente'; + + @override + String get tagEditorSectionPlaceholders => 'Marcadores de posición'; + + @override + String get tagEditorDiscardDialogMessage => 'Quere descartar os cambios?'; + + @override + String get tagPlaceholderCountry => 'País'; + + @override + String get tagPlaceholderState => 'Estado'; + + @override + String get tagPlaceholderPlace => 'Lugar'; + + @override + String get panoramaEnableSensorControl => 'Activar control do sensor'; + + @override + String get panoramaDisableSensorControl => 'Desactivar control do sensor'; + + @override + String get sourceViewerPageTitle => 'Fonte'; +} diff --git a/lib/l10ngen/app_localizations_he.dart b/lib/l10ngen/app_localizations_he.dart new file mode 100644 index 0000000..c84ef30 --- /dev/null +++ b/lib/l10ngen/app_localizations_he.dart @@ -0,0 +1,2424 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Hebrew (`he`). +class AppLocalizationsHe extends AppLocalizations { + AppLocalizationsHe([String locale = 'he']) : super(locale); + + @override + String get appName => 'אייבז'; + + @override + String get welcomeMessage => 'ברוך הבא לאייבז'; + + @override + String get welcomeOptional => 'אופציונלי'; + + @override + String get welcomeTermsToggle => 'אני מסכימ/ה לתנאים'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString פריטים', + one: '$countString פריט', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString עמודות', + one: '$countString עמודה', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString שניות', + one: '$countString שניה', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString דקות', + one: '$countString דקה', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ימים', + one: '$countString יום', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'החל'; + + @override + String get createButtonLabel => 'צור'; + + @override + String get deleteButtonLabel => 'מחק'; + + @override + String get nextButtonLabel => 'הבא'; + + @override + String get showButtonLabel => 'הצג'; + + @override + String get hideButtonLabel => 'הסתר'; + + @override + String get continueButtonLabel => 'המשך'; + + @override + String get saveCopyButtonLabel => 'שמור עותק'; + + @override + String get applyTooltip => 'החל'; + + @override + String get cancelTooltip => 'ביטול'; + + @override + String get changeTooltip => 'שינוי'; + + @override + String get clearTooltip => 'ניקוי'; + + @override + String get previousTooltip => 'הקודם'; + + @override + String get nextTooltip => 'הבא'; + + @override + String get showTooltip => 'הצג'; + + @override + String get hideTooltip => 'הסתר'; + + @override + String get actionRemove => 'הסרה'; + + @override + String get resetTooltip => 'אפס'; + + @override + String get saveTooltip => 'שמור'; + + @override + String get stopTooltip => 'עצור'; + + @override + String get pickTooltip => 'בחר'; + + @override + String get doubleBackExitMessage => 'כדי לצאת הקש שוב על \"חזרה\".'; + + @override + String get doNotAskAgain => 'אל תשאל שוב'; + + @override + String get sourceStateLoading => 'טוען'; + + @override + String get sourceStateCataloguing => 'מקטלג'; + + @override + String get sourceStateLocatingCountries => 'טוען מדינות'; + + @override + String get sourceStateLocatingPlaces => 'טוען מקומות'; + + @override + String get chipActionDelete => 'מחק'; + + @override + String get chipActionRemove => 'הסר'; + + @override + String get chipActionShowCollection => 'הצג באוסף'; + + @override + String get chipActionGoToAlbumPage => 'הצג באלבום'; + + @override + String get chipActionGoToCountryPage => 'הצג במדינות'; + + @override + String get chipActionGoToPlacePage => 'הצג במקומות'; + + @override + String get chipActionGoToTagPage => 'הצג בתגיות'; + + @override + String get chipActionGoToExplorerPage => 'הצג בסייר'; + + @override + String get chipActionDecompose => 'פיצול'; + + @override + String get chipActionFilterOut => 'סנן החוצה'; + + @override + String get chipActionFilterIn => 'סנן לבתוך'; + + @override + String get chipActionHide => 'הסתר'; + + @override + String get chipActionLock => 'נעל'; + + @override + String get chipActionPin => 'הצמד למעלה'; + + @override + String get chipActionUnpin => 'בטל הצמד למעלה'; + + @override + String get chipActionGroup => 'קבוצה'; + + @override + String get chipActionRename => 'שנה שם'; + + @override + String get chipActionSetCover => 'הגדר עטיפה'; + + @override + String get chipActionShowCountryStates => 'הצג סטטיסטיקות'; + + @override + String get chipActionCreateGroup => 'צור קבוצה'; + + @override + String get chipActionCreateAlbum => 'צור אלבום'; + + @override + String get chipActionCreateVault => 'צור כספת'; + + @override + String get chipActionConfigureVault => 'הגדרת כספת'; + + @override + String get entryActionCopyToClipboard => 'הועתק ללוח'; + + @override + String get entryActionDelete => 'מחיקה'; + + @override + String get entryActionConvert => 'המרה'; + + @override + String get entryActionExport => 'ייצוא'; + + @override + String get entryActionInfo => 'מידע'; + + @override + String get entryActionRename => 'שינוי שם'; + + @override + String get entryActionRestore => 'שחזור'; + + @override + String get entryActionRotateCCW => 'סובב נגד כיוון השעון'; + + @override + String get entryActionRotateCW => 'סובב עם כיוון השעון'; + + @override + String get entryActionFlip => 'הפוך אופקית'; + + @override + String get entryActionPrint => 'הדפסה'; + + @override + String get entryActionShare => 'שיתוף'; + + @override + String get entryActionShareImageOnly => 'שיתוף תמונה בלבד'; + + @override + String get entryActionShareVideoOnly => 'שיתוף וידיאו בלבד‍'; + + @override + String get entryActionViewSource => 'מקור וידאו'; + + @override + String get entryActionShowGeoTiffOnMap => 'הצג כשכבת מפה'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convert to still image'; + + @override + String get entryActionViewMotionPhotoVideo => 'Open video'; + + @override + String get entryActionEdit => 'Edit'; + + @override + String get entryActionOpen => 'Open with'; + + @override + String get entryActionSetAs => 'Set as'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Show in map app'; + + @override + String get entryActionRotateScreen => 'Rotate screen'; + + @override + String get entryActionAddFavourite => 'Add to favorites'; + + @override + String get entryActionRemoveFavourite => 'Remove from favorites'; + + @override + String get videoActionCaptureFrame => 'Capture frame'; + + @override + String get videoActionMute => 'Mute'; + + @override + String get videoActionUnmute => 'Unmute'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Play'; + + @override + String get videoActionReplay10 => 'Seek backward 10 seconds'; + + @override + String get videoActionSkip10 => 'Seek forward 10 seconds'; + + @override + String get videoActionShowPreviousFrame => 'הצג פריים קודם'; + + @override + String get videoActionShowNextFrame => 'הצג פריים הבא'; + + @override + String get videoActionSelectStreams => 'בחר מסלולים'; + + @override + String get videoActionSetSpeed => 'Playback speed'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Settings'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Resume'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'Edit date & time'; + + @override + String get entryInfoActionEditLocation => 'Edit location'; + + @override + String get entryInfoActionEditTitleDescription => 'Edit title & description'; + + @override + String get entryInfoActionEditRating => 'Edit rating'; + + @override + String get entryInfoActionEditTags => 'Edit tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Remove metadata'; + + @override + String get entryInfoActionExportMetadata => 'Export metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Remove location'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Crop'; + + @override + String get editorTransformRotate => 'Rotate'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landscape'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Recycle bin'; + + @override + String get filterFavouriteLabel => 'Favorite'; + + @override + String get filterNoDateLabel => 'Undated'; + + @override + String get filterNoAddressLabel => 'No address'; + + @override + String get filterLocatedLabel => 'Located'; + + @override + String get filterNoLocationLabel => 'Unlocated'; + + @override + String get filterNoRatingLabel => 'Unrated'; + + @override + String get filterTaggedLabel => 'Tagged'; + + @override + String get filterNoTagLabel => 'Untagged'; + + @override + String get filterNoTitleLabel => 'Untitled'; + + @override + String get filterOnThisDayLabel => 'On this day'; + + @override + String get filterRecentlyAddedLabel => 'Recently added'; + + @override + String get filterRatingRejectedLabel => 'Rejected'; + + @override + String get filterTypeAnimatedLabel => 'Animated'; + + @override + String get filterTypeMotionPhotoLabel => 'Motion Photo'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Image'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'New'; + + @override + String get albumTierPinned => 'Pinned'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Common'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Others'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimal degrees'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Highest rate'; + + @override + String get displayRefreshRatePreferLowest => 'Lowest rate'; + + @override + String get keepScreenOnNever => 'Never'; + + @override + String get keepScreenOnVideoPlayback => 'During video playback'; + + @override + String get keepScreenOnViewerOnly => 'Viewer page only'; + + @override + String get keepScreenOnAlways => 'Always'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Never'; + + @override + String get maxBrightnessAlways => 'Always'; + + @override + String get nameConflictStrategyRename => 'Rename'; + + @override + String get nameConflictStrategyReplace => 'Replace'; + + @override + String get nameConflictStrategySkip => 'Skip'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Top'; + + @override + String get subtitlePositionBottom => 'Bottom'; + + @override + String get themeBrightnessLight => 'Light'; + + @override + String get themeBrightnessDark => 'Dark'; + + @override + String get themeBrightnessBlack => 'Black'; + + @override + String get unitSystemMetric => 'Metric'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Password'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Open with other player'; + + @override + String get videoLoopModeNever => 'Never'; + + @override + String get videoLoopModeShortOnly => 'Short videos only'; + + @override + String get videoLoopModeAlways => 'Always'; + + @override + String get videoPlaybackSkip => 'Skip'; + + @override + String get videoPlaybackMuted => 'Play muted'; + + @override + String get videoPlaybackWithSound => 'Play with sound'; + + @override + String get videoResumptionModeNever => 'Never'; + + @override + String get videoResumptionModeAlways => 'Always'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'None'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'Random'; + + @override + String get widgetDisplayedItemMostRecent => 'Most recent'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internal storage'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Some files have the same name.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'ADD'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Save dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OVER'; + + @override + String get videoResumeButtonLabel => 'RESUME'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Custom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'New Album'; + + @override + String get newAlbumDialogNameLabel => 'Album name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'Storage:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'קבוצה חדשה'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'הקבוצה כבר קיימת'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'New name'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'Rename'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insert field'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Preview'; + + @override + String get renameProcessorCounter => 'Counter'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Name'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete this album and the $countString items in it?', + one: 'Delete this album and the item in it?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these albums and the $countString items in them?', + one: 'Delete these albums and the item in them?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Width'; + + @override + String get exportEntryDialogHeight => 'Height'; + + @override + String get exportEntryDialogQuality => 'Quality'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'New name'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'Date & Time'; + + @override + String get editEntryDateDialogSetCustom => 'Set custom date'; + + @override + String get editEntryDateDialogCopyField => 'Copy from other date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'File modified date'; + + @override + String get durationDialogHours => 'Hours'; + + @override + String get durationDialogMinutes => 'Minutes'; + + @override + String get durationDialogSeconds => 'Seconds'; + + @override + String get editEntryLocationDialogTitle => 'Location'; + + @override + String get editEntryLocationDialogSetCustom => 'Set custom location'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Choose on map'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Use this location'; + + @override + String get editEntryRatingDialogTitle => 'Rating'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'More'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'Playback speed'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtitles'; + + @override + String get videoStreamSelectionDialogOff => 'Off'; + + @override + String get videoStreamSelectionDialogTrack => 'Track'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'Done!'; + + @override + String get genericFailureFeedback => 'Failed'; + + @override + String get genericDangerWarningDialogMessage => 'Are you sure?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'View'; + + @override + String get menuActionSelect => 'Select'; + + @override + String get menuActionSelectAll => 'Select all'; + + @override + String get menuActionSelectNone => 'Select none'; + + @override + String get menuActionMap => 'Map'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'Stats'; + + @override + String get viewDialogSortSectionTitle => 'Sort'; + + @override + String get viewDialogGroupSectionTitle => 'Sections'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'Grid'; + + @override + String get tileLayoutList => 'List'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Color'; + + @override + String get appPickDialogTitle => 'Pick App'; + + @override + String get appPickDialogNone => 'None'; + + @override + String get aboutPageTitle => 'About'; + + @override + String get aboutLinkLicense => 'License'; + + @override + String get aboutLinkPolicy => 'Privacy Policy'; + + @override + String get aboutBugSectionTitle => 'Bug Report'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copy system information'; + + @override + String get aboutBugCopyInfoButton => 'Copy'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'Report'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Credits'; + + @override + String get aboutCreditsWorldAtlas1 => 'This app uses a TopoJSON file from'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'Translators'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenses'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Show All Licenses'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'Pick'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'Edit'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Unknown'; + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'About'; + + @override + String get drawerSettingsButton => 'Settings'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Countries'; + + @override + String get drawerPlacePage => 'Places'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'By date'; + + @override + String get sortByName => 'By name'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'By size'; + + @override + String get sortByAlbumFileName => 'By album & item title'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A to Z'; + + @override + String get sortOrderZtoA => 'Z to A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumMimeTypeMixed => 'Mixed'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'Camera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'CREATE'; + + @override + String get newFilterBanner => 'new'; + + @override + String get countryPageTitle => 'Countries'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'States'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Places'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Date'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Countries'; + + @override + String get searchStatesSectionTitle => 'States'; + + @override + String get searchPlacesSectionTitle => 'Places'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Ratings'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Settings'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'Disabled'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'Settings'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Home'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_hi.dart b/lib/l10ngen/app_localizations_hi.dart new file mode 100644 index 0000000..2ab970f --- /dev/null +++ b/lib/l10ngen/app_localizations_hi.dart @@ -0,0 +1,2415 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Hindi (`hi`). +class AppLocalizationsHi extends AppLocalizations { + AppLocalizationsHi([String locale = 'hi']) : super(locale); + + @override + String get appName => 'ऐवीज'; + + @override + String get welcomeMessage => 'ऐवीज मे आपका स्वागत है'; + + @override + String get welcomeOptional => 'वैकल्पिक'; + + @override + String get welcomeTermsToggle => 'मैं नियमों और शर्तों से सहमत हूं'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count चीजे', + one: '$count चीज', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count कॉलम', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString सेकंडस', + one: '$countString सेकंड', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString मिनट', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString दिन', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length एम एम'; + } + + @override + String get applyButtonLabel => 'लगाऐ'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'मिटाए'; + + @override + String get nextButtonLabel => 'आगे'; + + @override + String get showButtonLabel => 'देखे'; + + @override + String get hideButtonLabel => 'छिपाए'; + + @override + String get continueButtonLabel => 'जारी रखे'; + + @override + String get saveCopyButtonLabel => 'सेव कॉपी'; + + @override + String get applyTooltip => 'लगाए'; + + @override + String get cancelTooltip => 'रद्द करें'; + + @override + String get changeTooltip => 'बदलें'; + + @override + String get clearTooltip => 'मिटाएं'; + + @override + String get previousTooltip => 'पिछे'; + + @override + String get nextTooltip => 'आगे'; + + @override + String get showTooltip => 'देखें'; + + @override + String get hideTooltip => 'छिपाए'; + + @override + String get actionRemove => 'हटाएं'; + + @override + String get resetTooltip => 'रिसेट'; + + @override + String get saveTooltip => 'सहेजें'; + + @override + String get stopTooltip => 'रोके'; + + @override + String get pickTooltip => 'चुनें'; + + @override + String get doubleBackExitMessage => 'बाहर जाने के लिए दोबारा \"पीछे\" पर टैप करें'; + + @override + String get doNotAskAgain => 'दोबारा मत पूछो'; + + @override + String get sourceStateLoading => 'लोड हो रहा है'; + + @override + String get sourceStateCataloguing => 'Cataloguing'; + + @override + String get sourceStateLocatingCountries => 'देश खोज रहे हैं'; + + @override + String get sourceStateLocatingPlaces => 'स्थान खोज रहें हैं'; + + @override + String get chipActionDelete => 'मिटाएं'; + + @override + String get chipActionRemove => 'हटाएं'; + + @override + String get chipActionShowCollection => 'कोलेक्शन में दिखाए'; + + @override + String get chipActionGoToAlbumPage => 'एल्बम में दिखाए'; + + @override + String get chipActionGoToCountryPage => 'देशों में दिखाएं'; + + @override + String get chipActionGoToPlacePage => 'स्थानों में दिखाएं'; + + @override + String get chipActionGoToTagPage => 'टैग्स में दिखाएं'; + + @override + String get chipActionGoToExplorerPage => 'एक्सप्लोरर में दिखाए'; + + @override + String get chipActionDecompose => 'स्प्लिट करे'; + + @override + String get chipActionFilterOut => 'फिल्टर करें'; + + @override + String get chipActionFilterIn => 'में फिल्टर करें'; + + @override + String get chipActionHide => 'छिपाए'; + + @override + String get chipActionLock => 'लॉक'; + + @override + String get chipActionPin => 'शीर्ष पर पिन करें'; + + @override + String get chipActionUnpin => 'शीर्ष से अनपिन करें'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'नाम बदले'; + + @override + String get chipActionSetCover => 'कवर सेट करें'; + + @override + String get chipActionShowCountryStates => 'राज्यों को दिखाएं'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'एल्बम बनाएं'; + + @override + String get chipActionCreateVault => 'वॉल्ट बनाएं'; + + @override + String get chipActionConfigureVault => 'वॉल्ट को कॉन्फ़िगर करें'; + + @override + String get entryActionCopyToClipboard => 'क्लिपबोर्ड पर कॉपी करें'; + + @override + String get entryActionDelete => 'मिटाएं'; + + @override + String get entryActionConvert => 'बदले'; + + @override + String get entryActionExport => 'एक्सपोर्ट करें'; + + @override + String get entryActionInfo => 'जानकारी'; + + @override + String get entryActionRename => 'नाम बदलें'; + + @override + String get entryActionRestore => 'रिस्टोर करे'; + + @override + String get entryActionRotateCCW => 'वामावर्त स्थिति में घुमाएं'; + + @override + String get entryActionRotateCW => 'दक्षिणावर्त घुमाएं'; + + @override + String get entryActionFlip => 'क्षैतिज फ्लिप करे'; + + @override + String get entryActionPrint => 'प्रिंट करे'; + + @override + String get entryActionShare => 'शेयर करे'; + + @override + String get entryActionShareImageOnly => 'केवल इमेज शेयर करें'; + + @override + String get entryActionShareVideoOnly => 'केवल वीडियो शेयर करें'; + + @override + String get entryActionViewSource => 'सोर्स देखें'; + + @override + String get entryActionShowGeoTiffOnMap => 'मैप ओवरले के रूप में देखे'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'स्थिर छवि में परिवर्तित करें'; + + @override + String get entryActionViewMotionPhotoVideo => 'वीडियो खोलें'; + + @override + String get entryActionEdit => 'एडिट करें'; + + @override + String get entryActionOpen => 'के साथ खोलें'; + + @override + String get entryActionSetAs => 'के रूप में सेट करें'; + + @override + String get entryActionCast => 'कास्ट करें'; + + @override + String get entryActionOpenMap => 'मैप एप में दिखाएं'; + + @override + String get entryActionRotateScreen => 'स्क्रीन घुमाएँ'; + + @override + String get entryActionAddFavourite => 'पसंदीदा में जोड़े'; + + @override + String get entryActionRemoveFavourite => 'पसंदीदा से निकालें'; + + @override + String get videoActionCaptureFrame => 'फ्रेम कैप्चर करें'; + + @override + String get videoActionMute => 'म्यूट करे'; + + @override + String get videoActionUnmute => 'अनम्यूट करे'; + + @override + String get videoActionPause => 'रोके'; + + @override + String get videoActionPlay => 'चलाएं'; + + @override + String get videoActionReplay10 => '10 सेकंड्स पीछे ले'; + + @override + String get videoActionSkip10 => '10 सेकंड्स आगे लें'; + + @override + String get videoActionShowPreviousFrame => 'पिछला फ्रेम दिखाए'; + + @override + String get videoActionShowNextFrame => 'अगला फ्रेम दिखाए'; + + @override + String get videoActionSelectStreams => 'ट्रैक्स को चुने'; + + @override + String get videoActionSetSpeed => 'चलाने की गति'; + + @override + String get videoActionABRepeat => 'A-B दोहराव'; + + @override + String get videoRepeatActionSetStart => 'स्टार्ट सेट करे'; + + @override + String get videoRepeatActionSetEnd => 'एण्ड सेट करे'; + + @override + String get viewerActionSettings => 'सैटिंग'; + + @override + String get viewerActionLock => 'व्यूअर को लॉक करे'; + + @override + String get viewerActionUnlock => 'व्यूअर को अनलॉक करे'; + + @override + String get slideshowActionResume => 'रिज्यूम करें'; + + @override + String get slideshowActionShowInCollection => 'संग्रह में दिखाएं'; + + @override + String get entryInfoActionEditDate => 'दिनांक व समय एडिट करे'; + + @override + String get entryInfoActionEditLocation => 'लोकेशन एडिट करे'; + + @override + String get entryInfoActionEditTitleDescription => 'शीर्षक और विवरण संपादित करें'; + + @override + String get entryInfoActionEditRating => 'रेटिंग एडिट करे'; + + @override + String get entryInfoActionEditTags => 'टैग्स एडिट करे'; + + @override + String get entryInfoActionRemoveMetadata => 'मेटाडाटा हटाएं'; + + @override + String get entryInfoActionExportMetadata => 'मेटाडाटा एक्सपोर्ट करें'; + + @override + String get entryInfoActionRemoveLocation => 'लोकेशन हटाएं'; + + @override + String get editorActionTransform => 'परिवर्तन'; + + @override + String get editorTransformCrop => 'क्रॉप'; + + @override + String get editorTransformRotate => 'घुमाएं'; + + @override + String get cropAspectRatioFree => 'फ्री'; + + @override + String get cropAspectRatioOriginal => 'ओरिजनल'; + + @override + String get cropAspectRatioSquare => 'वर्ग'; + + @override + String get filterAspectRatioLandscapeLabel => 'लैंडस्केप'; + + @override + String get filterAspectRatioPortraitLabel => 'पोर्ट्रेट'; + + @override + String get filterBinLabel => 'रीसाइकल बिन'; + + @override + String get filterFavouriteLabel => 'पसंदीदा'; + + @override + String get filterNoDateLabel => 'अदिनांकित'; + + @override + String get filterNoAddressLabel => 'एड्रेस रहित'; + + @override + String get filterLocatedLabel => 'लोकेट किया गया'; + + @override + String get filterNoLocationLabel => 'लॉकेट नही किया गया'; + + @override + String get filterNoRatingLabel => 'रेट नहीं किया गया'; + + @override + String get filterTaggedLabel => 'टैग किया गया'; + + @override + String get filterNoTagLabel => 'टैग नहीं किया गया'; + + @override + String get filterNoTitleLabel => 'शीर्षकहीन'; + + @override + String get filterOnThisDayLabel => 'इस दिन पर'; + + @override + String get filterRecentlyAddedLabel => 'हाल ही में शामिल की गई'; + + @override + String get filterRatingRejectedLabel => 'अस्वीकृत'; + + @override + String get filterTypeAnimatedLabel => 'एनिमेटेड'; + + @override + String get filterTypeMotionPhotoLabel => 'मोशन फोटो'; + + @override + String get filterTypePanoramaLabel => 'पैनोरमा'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° वीडियो'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'इमेज'; + + @override + String get filterMimeVideoLabel => 'वीडियो'; + + @override + String get accessibilityAnimationsRemove => 'स्क्रीन प्रभाव को रोकें'; + + @override + String get accessibilityAnimationsKeep => 'स्क्रीन प्रभाव रखें'; + + @override + String get albumTierNew => 'नया'; + + @override + String get albumTierPinned => 'पिन किया गया'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'कॉमन'; + + @override + String get albumTierApps => 'ऐप्स'; + + @override + String get albumTierVaults => 'संदूक'; + + @override + String get albumTierDynamic => 'डायनेमिक'; + + @override + String get albumTierRegular => 'अन्य'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'दशमलव डिग्री'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'उ'; + + @override + String get coordinateDmsSouth => 'द'; + + @override + String get coordinateDmsEast => 'पू'; + + @override + String get coordinateDmsWest => 'प'; + + @override + String get displayRefreshRatePreferHighest => 'उच्चतम दर'; + + @override + String get displayRefreshRatePreferLowest => 'न्यूनतम दर'; + + @override + String get keepScreenOnNever => 'कभी नहीं'; + + @override + String get keepScreenOnVideoPlayback => 'वीडियो प्लेबैक के दौरान'; + + @override + String get keepScreenOnViewerOnly => 'केवल व्यूअर पेज'; + + @override + String get keepScreenOnAlways => 'हमेशा'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'गूगल मैप्स'; + + @override + String get mapStyleGoogleHybrid => 'गूगल मैप्स (हाइब्रिड)'; + + @override + String get mapStyleGoogleTerrain => 'गूगल मैप्स (टेरेन)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'ओपनटॉपोमैप'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'कभी नहीं'; + + @override + String get maxBrightnessAlways => 'हमेशा'; + + @override + String get nameConflictStrategyRename => 'नाम बदलें'; + + @override + String get nameConflictStrategyReplace => 'बदलें'; + + @override + String get nameConflictStrategySkip => 'छोड़े'; + + @override + String get overlayHistogramNone => 'कोई नहीं'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'चमक'; + + @override + String get subtitlePositionTop => 'शीर्ष'; + + @override + String get subtitlePositionBottom => 'नीचे'; + + @override + String get themeBrightnessLight => 'लाइट'; + + @override + String get themeBrightnessDark => 'डार्क'; + + @override + String get themeBrightnessBlack => 'काला'; + + @override + String get unitSystemMetric => 'मात्रिक'; + + @override + String get unitSystemImperial => 'इम्पीरियल'; + + @override + String get vaultLockTypePattern => 'पैटर्न'; + + @override + String get vaultLockTypePin => 'पिन'; + + @override + String get vaultLockTypePassword => 'पासवर्ड'; + + @override + String get settingsVideoEnablePip => 'पिक्चर-इन-पिक्चर'; + + @override + String get videoControlsPlayOutside => 'अन्य प्लेयर के साथ खोलें'; + + @override + String get videoLoopModeNever => 'कभी नहीं'; + + @override + String get videoLoopModeShortOnly => 'केवल लघु वीडियो'; + + @override + String get videoLoopModeAlways => 'हमेशा'; + + @override + String get videoPlaybackSkip => 'छोड़े'; + + @override + String get videoPlaybackMuted => 'बिना ध्वनि के चलाएं'; + + @override + String get videoPlaybackWithSound => 'ध्वनि के साथ चलाए'; + + @override + String get videoResumptionModeNever => 'कभी नहीं'; + + @override + String get videoResumptionModeAlways => 'हमेशा'; + + @override + String get viewerTransitionSlide => 'स्लाइड'; + + @override + String get viewerTransitionParallax => 'पैरालैक्स'; + + @override + String get viewerTransitionFade => 'फेड'; + + @override + String get viewerTransitionZoomIn => 'ज़ूम इन'; + + @override + String get viewerTransitionNone => 'कोई नहीं'; + + @override + String get wallpaperTargetHome => 'होम स्क्रीन'; + + @override + String get wallpaperTargetLock => 'लॉक स्क्रीन'; + + @override + String get wallpaperTargetHomeLock => 'होम और लॉक स्क्रीन'; + + @override + String get widgetDisplayedItemRandom => 'यादृच्छिक'; + + @override + String get widgetDisplayedItemMostRecent => 'हाल ही के'; + + @override + String get widgetOpenPageHome => 'घर खोलें'; + + @override + String get widgetOpenPageCollection => 'संग्रह खोलें'; + + @override + String get widgetOpenPageViewer => 'व्यूअर खोलें'; + + @override + String get widgetTapUpdateWidget => 'विजेट अपडेट करें'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'आंतरिक भंडारण'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'एसडी कार्ड'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'अगले स्क्रीन में \"$volume\" के $directory का चयन करें ताकि यह ऐप इसके लिए पहुंच सके।।'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'इस एप्लिकेशन को \"$volume\" की $directory में फ़ाइलों को संशोधित करने की अनुमति नहीं है।\n\nकृपया किसी अन्य directory में आइटम स्थानांतरित करने के लिए एक पूर्व-स्थापित फ़ाइल प्रबंधक या गैलरी ऐप का उपयोग करें।।'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'इस ऑपरेशन को पूरा करने के लिए \"$volume\" पर “$neededSize” खाली जगह की आवश्यकता है, लेकिन केवल $freeSize जगह है।।'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'सिस्टम फ़ाइल पिकर लापता या अक्षम है। कृपया इसे सक्षम करें और फिर से प्रयास करें।।'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'यह ऑपरेशन निम्न प्रकार के आइटम के लिए समर्थित नहीं है: $types.', + one: 'यह ऑपरेशन निम्न प्रकार के आइटम के लिए समर्थित नहीं है: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'गंतव्य फ़ोल्डर में कुछ फ़ाइलों का नाम समान है।।'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'कुछ फ़ाइलों का नाम समान है।।'; + + @override + String get addShortcutDialogLabel => 'शॉर्टकट लेबल'; + + @override + String get addShortcutButtonLabel => 'ADD'; + + @override + String get noMatchingAppDialogMessage => 'इसमें कोई ऐप नहीं है जो इसे संभाल सकता है।।'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'इन $countString आइटम को रीसायकल बिन में ले जाएं?', + one: 'इस आइटम को रीसायकल बिन में ले जाएं?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'इन $countString आइटमो को हटाएं?', + one: 'इस आइटम को हटाए?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'आगे बढ़ने से पहले आइटम की तारीख सेव करे?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'तारीख सहेजें'; + + @override + String videoResumeDialogMessage(String time) { + return 'क्या आप $time पर पुन: चलाना चाहते हैं?'; + } + + @override + String get videoStartOverButtonLabel => 'पुन: प्रारंभ करें'; + + @override + String get videoResumeButtonLabel => 'पुन: चलाएं'; + + @override + String get setCoverDialogLatest => 'नवीनतम आइटम'; + + @override + String get setCoverDialogAuto => 'ऑटो'; + + @override + String get setCoverDialogCustom => 'कस्टम'; + + @override + String get hideFilterConfirmationDialogMessage => 'मैचिंग तस्वीरें और वीडियो आपके कलेक्शन से छिपे होंगे। आप उन्हें फिर से \"गोपनीयता\" सेटिंग्स से दिखा सकते हैं।\n\nक्या आप उन्हें छिपाना चाहते हैं?'; + + @override + String get newAlbumDialogTitle => 'नया एल्बम'; + + @override + String get newAlbumDialogNameLabel => 'एल्बम का नाम'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'एल्बम पहले से उपलब्ध हैं'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'डायरेक्टरी पहले से मौजूद'; + + @override + String get newAlbumDialogStorageLabel => 'स्टोरेज:'; + + @override + String get newDynamicAlbumDialogTitle => 'नया डायनेमिक एल्बम'; + + @override + String get dynamicAlbumAlreadyExists => 'डायनेमिक एल्बम पहले से ही मौजूद है'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'वॉल्ट में आइटम केवल इस ऐप के लिए व अन्य के लिए नहीं उपलब्ध हैं।\n\nयदि आप इस ऐप को अनइंस्टॉल करते हैं, या इस ऐप डेटा को साफ़ करते हैं, तो आप इन सभी आइटम को खो देंगे।।'; + + @override + String get newVaultDialogTitle => 'नया वॉल्ट'; + + @override + String get configureVaultDialogTitle => 'वॉल्ट को कॉन्फ़िगर करना'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'लॉक करे,जब स्क्रीन बंद हो जाती है'; + + @override + String get vaultDialogLockTypeLabel => 'लॉक प्रकार'; + + @override + String get patternDialogEnter => 'पैटर्न दर्ज करें'; + + @override + String get patternDialogConfirm => 'पैटर्न कन्फर्म करे'; + + @override + String get pinDialogEnter => 'पिन दर्ज करें'; + + @override + String get pinDialogConfirm => 'पिन कन्फर्म करें'; + + @override + String get passwordDialogEnter => 'पासवर्ड दर्ज करें'; + + @override + String get passwordDialogConfirm => 'पासवर्ड कन्फर्म करें'; + + @override + String get authenticateToConfigureVault => 'वॉल्ट को कॉन्फ़िगर करने के लिए प्रमाणीकरण करें'; + + @override + String get authenticateToUnlockVault => 'वॉल्ट को अनलॉक करने के लिए प्रमाणीकरण करें'; + + @override + String get vaultBinUsageDialogMessage => 'कुछ वॉल्ट्स रीसायकल बिन का उपयोग कर रहे हैं।।'; + + @override + String get renameAlbumDialogLabel => 'नया नाम'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'डायरेक्टरी पहले से मौजूद'; + + @override + String get renameEntrySetPageTitle => 'नाम बदलें'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'नामकरण पैटर्न'; + + @override + String get renameEntrySetPageInsertTooltip => 'फ़ील्ड डालें'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'पूर्वावलोकन'; + + @override + String get renameProcessorCounter => 'काउंटर'; + + @override + String get renameProcessorHash => 'हैश'; + + @override + String get renameProcessorName => 'नाम'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'यह एल्बम और इसमें मौजूद $countString हटाएं?', + one: 'यह एल्बम और इसमें मौजूद आइटम हटाएं?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ये एल्बम और उनमें मौजूद $countString आइटम हटाएं?', + one: 'ये एल्बम और उनमें मौजूद आइटम हटाएं?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'फॉर्मेट:'; + + @override + String get exportEntryDialogWidth => 'चौड़ाई'; + + @override + String get exportEntryDialogHeight => 'ऊंचाई'; + + @override + String get exportEntryDialogQuality => 'गुणवत्ता'; + + @override + String get exportEntryDialogWriteMetadata => 'मेटाडाटा लिखें'; + + @override + String get renameEntryDialogLabel => 'नया नाम'; + + @override + String get editEntryDialogCopyFromItem => 'अन्य आइटम से कॉपी करें'; + + @override + String get editEntryDialogTargetFieldsHeader => 'संशोधित करने के लिए फ़ील्ड'; + + @override + String get editEntryDateDialogTitle => 'तारीख और समय'; + + @override + String get editEntryDateDialogSetCustom => 'कस्टम तिथि सेट करें'; + + @override + String get editEntryDateDialogCopyField => 'अन्य तारीख से कॉपी करें'; + + @override + String get editEntryDateDialogExtractFromTitle => 'शीर्षक से निकालें'; + + @override + String get editEntryDateDialogShift => 'शिफ्ट'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'फ़ाइल संशोधित दिनांक'; + + @override + String get durationDialogHours => 'घंटे'; + + @override + String get durationDialogMinutes => 'मिनट'; + + @override + String get durationDialogSeconds => 'सेकंड'; + + @override + String get editEntryLocationDialogTitle => 'स्थान'; + + @override + String get editEntryLocationDialogSetCustom => 'कस्टम स्थान सेट करें'; + + @override + String get editEntryLocationDialogChooseOnMap => 'मानचित्र पर चुनें'; + + @override + String get editEntryLocationDialogImportGpx => 'GPX इंपोर्ट करे'; + + @override + String get editEntryLocationDialogLatitude => 'अक्षांश'; + + @override + String get editEntryLocationDialogLongitude => 'देशांतर'; + + @override + String get editEntryLocationDialogTimeShift => 'टाइम शिफ्ट'; + + @override + String get locationPickerUseThisLocationButton => 'इस स्थान का उपयोग करें'; + + @override + String get editEntryRatingDialogTitle => 'रेटिंग'; + + @override + String get removeEntryMetadataDialogTitle => 'मेटाडाटा हटाना'; + + @override + String get removeEntryMetadataDialogAll => 'सभी'; + + @override + String get removeEntryMetadataDialogMore => 'अधिक'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'मोशन फोटो के अंदर वीडियो चलाने के लिए XMP की जरूरत है\n\nक्या आप वास्तव में इसे हटाना चाहते हैं?'; + + @override + String get videoSpeedDialogLabel => 'चलाने की गति'; + + @override + String get videoStreamSelectionDialogVideo => 'वीडियो'; + + @override + String get videoStreamSelectionDialogAudio => 'ऑडियो'; + + @override + String get videoStreamSelectionDialogText => 'उपशीर्षक'; + + @override + String get videoStreamSelectionDialogOff => 'बंद'; + + @override + String get videoStreamSelectionDialogTrack => 'ट्रैक'; + + @override + String get videoStreamSelectionDialogNoSelection => 'कोई अन्य ट्रैक नहीं हैं।'; + + @override + String get genericSuccessFeedback => 'हो गया!'; + + @override + String get genericFailureFeedback => 'असफल'; + + @override + String get genericDangerWarningDialogMessage => 'क्या आपको यकीन है?'; + + @override + String get tooManyItemsErrorDialogMessage => 'कम आइटम के साथ पुनः प्रयास करें।'; + + @override + String get menuActionConfigureView => 'देखें'; + + @override + String get menuActionSelect => 'चूने'; + + @override + String get menuActionSelectAll => 'सभी चुने'; + + @override + String get menuActionSelectNone => 'कुछ मत चुने'; + + @override + String get menuActionMap => 'मैप'; + + @override + String get menuActionSlideshow => 'स्लाइड शो'; + + @override + String get menuActionStats => 'आँकड़े'; + + @override + String get viewDialogSortSectionTitle => 'क्रम से लगाए'; + + @override + String get viewDialogGroupSectionTitle => 'समूह में रखे'; + + @override + String get viewDialogLayoutSectionTitle => 'लेआउट'; + + @override + String get viewDialogReverseSortOrder => 'क्रम उलटा करे'; + + @override + String get tileLayoutMosaic => 'मौज़ेक'; + + @override + String get tileLayoutGrid => 'ग्रिड'; + + @override + String get tileLayoutList => 'सूची'; + + @override + String get castDialogTitle => 'कास्ट डिवाइस'; + + @override + String get coverDialogTabCover => 'ढखें'; + + @override + String get coverDialogTabApp => 'ऐप'; + + @override + String get coverDialogTabColor => 'रंग'; + + @override + String get appPickDialogTitle => 'ऐप चुनें'; + + @override + String get appPickDialogNone => 'कोई नहीं'; + + @override + String get aboutPageTitle => 'बारे में'; + + @override + String get aboutLinkLicense => 'लाइसेंस'; + + @override + String get aboutLinkPolicy => 'गोपनीयता नीति'; + + @override + String get aboutBugSectionTitle => 'बग रिपोर्ट'; + + @override + String get aboutBugSaveLogInstruction => 'ऐप लॉग को फ़ाइल में सहेजें'; + + @override + String get aboutBugCopyInfoInstruction => 'सिस्टम जानकारी कॉपी करें'; + + @override + String get aboutBugCopyInfoButton => 'कोपी'; + + @override + String get aboutBugReportInstruction => 'लॉग और सिस्टम जानकारी के साथ GitHub पर रिपोर्ट करें'; + + @override + String get aboutBugReportButton => 'रिपोर्ट दे'; + + @override + String get aboutDataUsageSectionTitle => 'डेटा उपयोग'; + + @override + String get aboutDataUsageData => 'डेटा'; + + @override + String get aboutDataUsageCache => 'कैश'; + + @override + String get aboutDataUsageDatabase => 'डेटाबेस'; + + @override + String get aboutDataUsageMisc => 'विविध'; + + @override + String get aboutDataUsageInternal => 'आंतरिक'; + + @override + String get aboutDataUsageExternal => 'बाहरी'; + + @override + String get aboutDataUsageClearCache => 'कैश साफ़ करें'; + + @override + String get aboutCreditsSectionTitle => 'क्रेडिट'; + + @override + String get aboutCreditsWorldAtlas1 => 'यह ऐप TopoJSON फ़ाइल का उपयोग करता है'; + + @override + String get aboutCreditsWorldAtlas2 => 'आईएससी लाइसेंस के तहत।'; + + @override + String get aboutTranslatorsSectionTitle => 'अनुवादक'; + + @override + String get aboutLicensesSectionTitle => 'ओपन सोर्स लाइसेंस'; + + @override + String get aboutLicensesBanner => 'यह ऐप निम्नलिखित ओपन सोर्स पैकेज और पुस्तकालयों का उपयोग करता है।'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'एंड्रॉइड लाइब्रेरीज़'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'फ्लटर प्लगइन्स'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'फ्लटर पैकेज'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'डार्ट पैकेज'; + + @override + String get aboutLicensesShowAllButtonLabel => 'सभी लाइसेंस दिखाएं'; + + @override + String get policyPageTitle => 'गोपनीयता नीति'; + + @override + String get collectionPageTitle => 'संग्रह'; + + @override + String get collectionPickPageTitle => 'चुने'; + + @override + String get collectionSelectPageTitle => 'आइटम चुनें'; + + @override + String get collectionActionShowTitleSearch => 'शीर्षक फ़िल्टर दिखाएं'; + + @override + String get collectionActionHideTitleSearch => 'शीर्षक फ़िल्टर छुपाएं'; + + @override + String get collectionActionAddDynamicAlbum => 'डायनेमिक एल्बम जोड़े'; + + @override + String get collectionActionAddShortcut => 'शॉर्टकट जोड़ें'; + + @override + String get collectionActionSetHome => 'घर के रूप में सेट करें'; + + @override + String get collectionActionEmptyBin => 'बीन खाली करे'; + + @override + String get collectionActionCopy => 'एल्बम में कॉपी करें'; + + @override + String get collectionActionMove => 'एल्बम पर जाएँ'; + + @override + String get collectionActionRescan => 'पुन: स्कैन करे'; + + @override + String get collectionActionEdit => 'एडिट करे'; + + @override + String get collectionSearchTitlesHintText => 'शीर्षक खोजें'; + + @override + String get collectionGroupAlbum => 'एल्बम के अनुसार'; + + @override + String get collectionGroupMonth => 'महीने के अनुसार'; + + @override + String get collectionGroupDay => 'दिन के अनुसार'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'अज्ञात'; + + @override + String get dateToday => 'आज'; + + @override + String get dateYesterday => 'कल'; + + @override + String get dateThisMonth => 'इस महीने'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString आइटम हटाने में विफल', + one: '1 आइटम हटाने में विफल', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString आइटम कॉपी करने में विफल', + one: '1 आइटम कॉपी करने में विफल', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString आइटम ले जाने में विफल', + one: '1 आइटम ले जाने में विफल', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString आइटम का नाम बदलने में विफल', + one: '1 आइटम का नाम बदलने में विफल', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString आइटम एडिट करने में विफल', + one: '1 आइटम एडिट करने में विफल', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString पन्ने निर्यात करने में विफल', + one: '1 पन्ना निर्यात करने में विफल', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString आइटम कॉपी किए गए', + one: '1 आइटम कॉपी किया गया', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString आइटम स्थानांतरित किए गए', + one: '1 आइटम स्थानांतरित किया गया', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString आइटम का नाम बदला गया', + one: '1 आइटम का नाम बदला गया', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString आइटम संपादित किए गए', + one: '1 आइटम संपादित किया गया', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'कोई पसंदीदा नहीं'; + + @override + String get collectionEmptyVideos => 'कोई वीडियो नहीं'; + + @override + String get collectionEmptyImages => 'कोई इमेज नहीं'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'पहुंच प्रदान करें'; + + @override + String get collectionSelectSectionTooltip => 'अनुभाग चुनें'; + + @override + String get collectionDeselectSectionTooltip => 'अनुभाग का चयन रद्द करें'; + + @override + String get drawerAboutButton => 'के बारे में'; + + @override + String get drawerSettingsButton => 'सेटिंग्स'; + + @override + String get drawerCollectionAll => 'सभी संग्रह'; + + @override + String get drawerCollectionFavourites => 'पसंदीदा'; + + @override + String get drawerCollectionImages => 'इमेजेस'; + + @override + String get drawerCollectionVideos => 'वीडियो'; + + @override + String get drawerCollectionAnimated => 'एनिमेटेड'; + + @override + String get drawerCollectionMotionPhotos => 'मोशन तस्वीरें'; + + @override + String get drawerCollectionPanoramas => 'पैनोरामा'; + + @override + String get drawerCollectionRaws => 'रॉ फ़ोटो'; + + @override + String get drawerCollectionSphericalVideos => '360⁰ वीडियो'; + + @override + String get drawerAlbumPage => 'एल्बम'; + + @override + String get drawerCountryPage => 'देश'; + + @override + String get drawerPlacePage => 'स्थान'; + + @override + String get drawerTagPage => 'टैग्स'; + + @override + String get sortByDate => 'दिनांक से'; + + @override + String get sortByName => 'नाम से'; + + @override + String get sortByItemCount => 'आइटम गणना के द्वारा'; + + @override + String get sortBySize => 'साइज से'; + + @override + String get sortByAlbumFileName => 'एल्बम और फाइल नाम से'; + + @override + String get sortByRating => 'रेटिंग से'; + + @override + String get sortByDuration => 'समय के अनुसार'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'नए पहले'; + + @override + String get sortOrderOldestFirst => 'पूराने पहले'; + + @override + String get sortOrderAtoZ => 'A से Z'; + + @override + String get sortOrderZtoA => 'Z से A'; + + @override + String get sortOrderHighestFirst => 'उच्चतम पहले'; + + @override + String get sortOrderLowestFirst => 'निम्नतम पहले'; + + @override + String get sortOrderLargestFirst => 'सबसे बड़ा पहले'; + + @override + String get sortOrderSmallestFirst => 'सबसे छोटा पहले'; + + @override + String get sortOrderShortestFirst => 'छोटा पहले'; + + @override + String get sortOrderLongestFirst => 'सबसे लंबा पहले'; + + @override + String get albumGroupTier => 'टियर से'; + + @override + String get albumGroupType => 'टाइप द्वारा'; + + @override + String get albumGroupVolume => 'स्टोरेज मात्रा के अनुसार'; + + @override + String get albumMimeTypeMixed => 'मिक्सड'; + + @override + String get albumPickPageTitleCopy => 'एल्बम में कॉपी करे'; + + @override + String get albumPickPageTitleExport => 'एल्बम में एक्सपोर्ट करे'; + + @override + String get albumPickPageTitleMove => 'एल्बम में स्थानांतरित करे'; + + @override + String get albumPickPageTitlePick => 'एल्बम चुने'; + + @override + String get albumCamera => 'कैमरा'; + + @override + String get albumDownload => 'डाउनलोड'; + + @override + String get albumScreenshots => 'स्क्रीनशॉट'; + + @override + String get albumScreenRecordings => 'स्क्रीन रिकॉर्डिंग'; + + @override + String get albumVideoCaptures => 'वीडियो कैप्चर'; + + @override + String get albumPageTitle => 'एल्बम'; + + @override + String get albumEmpty => 'कोई एल्बम नहीं l'; + + @override + String get createAlbumButtonLabel => 'बनाए'; + + @override + String get newFilterBanner => 'नया'; + + @override + String get countryPageTitle => 'देशों'; + + @override + String get countryEmpty => 'कोई देश नहीं'; + + @override + String get statePageTitle => 'राज्य/देश'; + + @override + String get stateEmpty => 'कौन राज्य नहीं'; + + @override + String get placePageTitle => 'स्थान'; + + @override + String get placeEmpty => 'कोई स्थान नहीं'; + + @override + String get tagPageTitle => 'टैग्स'; + + @override + String get tagEmpty => 'कोई टैग नहीं'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'रिसाइकल बिन'; + + @override + String get explorerPageTitle => 'एक्सप्लोरर'; + + @override + String get explorerActionSelectStorageVolume => 'स्टोरेज चुने'; + + @override + String get selectStorageVolumeDialogTitle => 'स्टोरेज'; + + @override + String get searchCollectionFieldHint => 'कलेक्शन खोजें'; + + @override + String get searchRecentSectionTitle => 'हाल ही का'; + + @override + String get searchDateSectionTitle => 'दिनांक'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'एल्बम'; + + @override + String get searchCountriesSectionTitle => 'देशों'; + + @override + String get searchStatesSectionTitle => 'राज्य/देश'; + + @override + String get searchPlacesSectionTitle => 'स्थान'; + + @override + String get searchTagsSectionTitle => 'टैग'; + + @override + String get searchRatingSectionTitle => 'रेटिंग'; + + @override + String get searchMetadataSectionTitle => 'मेटाडाटा'; + + @override + String get settingsPageTitle => 'सेटिंग्स'; + + @override + String get settingsSystemDefault => 'सिस्टम डिफॉल्ट'; + + @override + String get settingsDefault => 'डिफॉल्ट'; + + @override + String get settingsDisabled => 'डिसेबल किया गया'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'हर बार पूछे'; + + @override + String get settingsModificationWarningDialogMessage => 'अन्य सेटिंग्स परिवर्तित की जाएगी'; + + @override + String get settingsSearchFieldLabel => 'सेटिंग्स खोजें'; + + @override + String get settingsSearchEmpty => 'कोई सेटिंग्स नहीं मिली'; + + @override + String get settingsActionExport => 'एक्सपोर्ट'; + + @override + String get settingsActionExportDialogTitle => 'एक्सपोर्ट'; + + @override + String get settingsActionImport => 'इंपोर्ट'; + + @override + String get settingsActionImportDialogTitle => 'इंपोर्ट'; + + @override + String get appExportCovers => 'कवर'; + + @override + String get appExportDynamicAlbums => 'डायनेमिक एल्बम'; + + @override + String get appExportFavourites => 'पसंदीदा'; + + @override + String get appExportSettings => 'सेटिंग्स'; + + @override + String get settingsNavigationSectionTitle => 'नेविगेशन'; + + @override + String get settingsHomeTile => 'होम'; + + @override + String get settingsHomeDialogTitle => 'होम'; + + @override + String get setHomeCustom => 'कस्टम'; + + @override + String get settingsKeepScreenOnTile => 'स्क्रीन को चालू रखें'; + + @override + String get settingsKeepScreenOnDialogTitle => 'स्क्रीन को चालू रखें'; + + @override + String get settingsDoubleBackExit => 'बाहर जाने के लिए \"पीछे\" दो बार दबाए'; + + @override + String get settingsConfirmationTile => 'पुष्टीकरण डायलॉग'; + + @override + String get settingsConfirmationDialogTitle => 'पुष्टीकरण डायलॉग'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'आइटम को हमेशा के लिए डीलीट करने से पहले पूछे'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'आइटम को रिसाइकल बिन में ले जाने से पहले पूछे'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'अदिनांकित आइटम को ले जाने से पहले पूछे'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'आइटम को रिसाइकिल बिन में ले जाने के बाद संदेश दिखाए'; + + @override + String get settingsConfirmationVaultDataLoss => 'वोल्ट (संदूक) के डाटा लॉस की चेतावनी दिखाए'; + + @override + String get settingsNavigationDrawerTile => 'नेविगेशन मेनू'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'नेविगेशन मेनू'; + + @override + String get settingsNavigationDrawerBanner => 'मेनू आइटम को ले जाने व रिआर्डर करने के लिए टच और होल्ड करें'; + + @override + String get settingsNavigationDrawerTabTypes => 'टाइप्स'; + + @override + String get settingsNavigationDrawerTabAlbums => 'एल्बम'; + + @override + String get settingsNavigationDrawerTabPages => 'पेज़'; + + @override + String get settingsNavigationDrawerAddAlbum => 'एल्बम जोड़े'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_hr.dart b/lib/l10ngen/app_localizations_hr.dart new file mode 100644 index 0000000..791eb80 --- /dev/null +++ b/lib/l10ngen/app_localizations_hr.dart @@ -0,0 +1,2424 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Croatian (`hr`). +class AppLocalizationsHr extends AppLocalizations { + AppLocalizationsHr([String locale = 'hr']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Welcome to Aves'; + + @override + String get welcomeOptional => 'Optional'; + + @override + String get welcomeTermsToggle => 'I agree to the terms and conditions'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items', + one: '$countString item', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString columns', + one: '$countString column', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString seconds', + one: '$countString second', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutes', + one: '$countString minute', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString days', + one: '$countString day', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APPLY'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'DELETE'; + + @override + String get nextButtonLabel => 'NEXT'; + + @override + String get showButtonLabel => 'SHOW'; + + @override + String get hideButtonLabel => 'HIDE'; + + @override + String get continueButtonLabel => 'CONTINUE'; + + @override + String get saveCopyButtonLabel => 'SAVE COPY'; + + @override + String get applyTooltip => 'Apply'; + + @override + String get cancelTooltip => 'Cancel'; + + @override + String get changeTooltip => 'Change'; + + @override + String get clearTooltip => 'Clear'; + + @override + String get previousTooltip => 'Previous'; + + @override + String get nextTooltip => 'Next'; + + @override + String get showTooltip => 'Show'; + + @override + String get hideTooltip => 'Hide'; + + @override + String get actionRemove => 'Remove'; + + @override + String get resetTooltip => 'Reset'; + + @override + String get saveTooltip => 'Save'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'Pick'; + + @override + String get doubleBackExitMessage => 'Tap “back” again to exit.'; + + @override + String get doNotAskAgain => 'Do not ask again'; + + @override + String get sourceStateLoading => 'Loading'; + + @override + String get sourceStateCataloguing => 'Cataloguing'; + + @override + String get sourceStateLocatingCountries => 'Locating countries'; + + @override + String get sourceStateLocatingPlaces => 'Locating places'; + + @override + String get chipActionDelete => 'Delete'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Show in Collection'; + + @override + String get chipActionGoToAlbumPage => 'Show in Albums'; + + @override + String get chipActionGoToCountryPage => 'Show in Countries'; + + @override + String get chipActionGoToPlacePage => 'Show in Places'; + + @override + String get chipActionGoToTagPage => 'Show in Tags'; + + @override + String get chipActionGoToExplorerPage => 'Show in Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Filter out'; + + @override + String get chipActionFilterIn => 'Filter in'; + + @override + String get chipActionHide => 'Hide'; + + @override + String get chipActionLock => 'Lock'; + + @override + String get chipActionPin => 'Pin to top'; + + @override + String get chipActionUnpin => 'Unpin from top'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Rename'; + + @override + String get chipActionSetCover => 'Set cover'; + + @override + String get chipActionShowCountryStates => 'Show states'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Create album'; + + @override + String get chipActionCreateVault => 'Create vault'; + + @override + String get chipActionConfigureVault => 'Configure vault'; + + @override + String get entryActionCopyToClipboard => 'Copy to clipboard'; + + @override + String get entryActionDelete => 'Delete'; + + @override + String get entryActionConvert => 'Convert'; + + @override + String get entryActionExport => 'Export'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Rename'; + + @override + String get entryActionRestore => 'Restore'; + + @override + String get entryActionRotateCCW => 'Rotate counterclockwise'; + + @override + String get entryActionRotateCW => 'Rotate clockwise'; + + @override + String get entryActionFlip => 'Flip horizontally'; + + @override + String get entryActionPrint => 'Print'; + + @override + String get entryActionShare => 'Share'; + + @override + String get entryActionShareImageOnly => 'Share image only'; + + @override + String get entryActionShareVideoOnly => 'Share video only'; + + @override + String get entryActionViewSource => 'View source'; + + @override + String get entryActionShowGeoTiffOnMap => 'Show as map overlay'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convert to still image'; + + @override + String get entryActionViewMotionPhotoVideo => 'Open video'; + + @override + String get entryActionEdit => 'Edit'; + + @override + String get entryActionOpen => 'Open with'; + + @override + String get entryActionSetAs => 'Set as'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Show in map app'; + + @override + String get entryActionRotateScreen => 'Rotate screen'; + + @override + String get entryActionAddFavourite => 'Add to favorites'; + + @override + String get entryActionRemoveFavourite => 'Remove from favorites'; + + @override + String get videoActionCaptureFrame => 'Capture frame'; + + @override + String get videoActionMute => 'Mute'; + + @override + String get videoActionUnmute => 'Unmute'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Play'; + + @override + String get videoActionReplay10 => 'Seek backward 10 seconds'; + + @override + String get videoActionSkip10 => 'Seek forward 10 seconds'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Select tracks'; + + @override + String get videoActionSetSpeed => 'Playback speed'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Settings'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Resume'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'Edit date & time'; + + @override + String get entryInfoActionEditLocation => 'Edit location'; + + @override + String get entryInfoActionEditTitleDescription => 'Edit title & description'; + + @override + String get entryInfoActionEditRating => 'Edit rating'; + + @override + String get entryInfoActionEditTags => 'Edit tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Remove metadata'; + + @override + String get entryInfoActionExportMetadata => 'Export metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Remove location'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Crop'; + + @override + String get editorTransformRotate => 'Rotate'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landscape'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Recycle bin'; + + @override + String get filterFavouriteLabel => 'Favorite'; + + @override + String get filterNoDateLabel => 'Undated'; + + @override + String get filterNoAddressLabel => 'No address'; + + @override + String get filterLocatedLabel => 'Located'; + + @override + String get filterNoLocationLabel => 'Unlocated'; + + @override + String get filterNoRatingLabel => 'Unrated'; + + @override + String get filterTaggedLabel => 'Tagged'; + + @override + String get filterNoTagLabel => 'Untagged'; + + @override + String get filterNoTitleLabel => 'Untitled'; + + @override + String get filterOnThisDayLabel => 'On this day'; + + @override + String get filterRecentlyAddedLabel => 'Recently added'; + + @override + String get filterRatingRejectedLabel => 'Rejected'; + + @override + String get filterTypeAnimatedLabel => 'Animated'; + + @override + String get filterTypeMotionPhotoLabel => 'Motion Photo'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Image'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'New'; + + @override + String get albumTierPinned => 'Pinned'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Common'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Others'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimal degrees'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Highest rate'; + + @override + String get displayRefreshRatePreferLowest => 'Lowest rate'; + + @override + String get keepScreenOnNever => 'Never'; + + @override + String get keepScreenOnVideoPlayback => 'During video playback'; + + @override + String get keepScreenOnViewerOnly => 'Viewer page only'; + + @override + String get keepScreenOnAlways => 'Always'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Never'; + + @override + String get maxBrightnessAlways => 'Always'; + + @override + String get nameConflictStrategyRename => 'Rename'; + + @override + String get nameConflictStrategyReplace => 'Replace'; + + @override + String get nameConflictStrategySkip => 'Skip'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Top'; + + @override + String get subtitlePositionBottom => 'Bottom'; + + @override + String get themeBrightnessLight => 'Light'; + + @override + String get themeBrightnessDark => 'Dark'; + + @override + String get themeBrightnessBlack => 'Black'; + + @override + String get unitSystemMetric => 'Metric'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Password'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Open with other player'; + + @override + String get videoLoopModeNever => 'Never'; + + @override + String get videoLoopModeShortOnly => 'Short videos only'; + + @override + String get videoLoopModeAlways => 'Always'; + + @override + String get videoPlaybackSkip => 'Skip'; + + @override + String get videoPlaybackMuted => 'Play muted'; + + @override + String get videoPlaybackWithSound => 'Play with sound'; + + @override + String get videoResumptionModeNever => 'Never'; + + @override + String get videoResumptionModeAlways => 'Always'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'None'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'Random'; + + @override + String get widgetDisplayedItemMostRecent => 'Most recent'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internal storage'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Some files have the same name.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'ADD'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Save dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OVER'; + + @override + String get videoResumeButtonLabel => 'RESUME'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Custom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'New Album'; + + @override + String get newAlbumDialogNameLabel => 'Album name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'Storage:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'New name'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'Rename'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insert field'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Preview'; + + @override + String get renameProcessorCounter => 'Counter'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Name'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete this album and the $countString items in it?', + one: 'Delete this album and the item in it?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these albums and the $countString items in them?', + one: 'Delete these albums and the item in them?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Width'; + + @override + String get exportEntryDialogHeight => 'Height'; + + @override + String get exportEntryDialogQuality => 'Quality'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'New name'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'Date & Time'; + + @override + String get editEntryDateDialogSetCustom => 'Set custom date'; + + @override + String get editEntryDateDialogCopyField => 'Copy from other date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'File modified date'; + + @override + String get durationDialogHours => 'Hours'; + + @override + String get durationDialogMinutes => 'Minutes'; + + @override + String get durationDialogSeconds => 'Seconds'; + + @override + String get editEntryLocationDialogTitle => 'Location'; + + @override + String get editEntryLocationDialogSetCustom => 'Set custom location'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Choose on map'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Use this location'; + + @override + String get editEntryRatingDialogTitle => 'Rating'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'More'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'Playback speed'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtitles'; + + @override + String get videoStreamSelectionDialogOff => 'Off'; + + @override + String get videoStreamSelectionDialogTrack => 'Track'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'Done!'; + + @override + String get genericFailureFeedback => 'Failed'; + + @override + String get genericDangerWarningDialogMessage => 'Are you sure?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'View'; + + @override + String get menuActionSelect => 'Select'; + + @override + String get menuActionSelectAll => 'Select all'; + + @override + String get menuActionSelectNone => 'Select none'; + + @override + String get menuActionMap => 'Map'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'Stats'; + + @override + String get viewDialogSortSectionTitle => 'Sort'; + + @override + String get viewDialogGroupSectionTitle => 'Sections'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'Grid'; + + @override + String get tileLayoutList => 'List'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Color'; + + @override + String get appPickDialogTitle => 'Pick App'; + + @override + String get appPickDialogNone => 'None'; + + @override + String get aboutPageTitle => 'About'; + + @override + String get aboutLinkLicense => 'License'; + + @override + String get aboutLinkPolicy => 'Privacy Policy'; + + @override + String get aboutBugSectionTitle => 'Bug Report'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copy system information'; + + @override + String get aboutBugCopyInfoButton => 'Copy'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'Report'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Credits'; + + @override + String get aboutCreditsWorldAtlas1 => 'This app uses a TopoJSON file from'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'Translators'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenses'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Show All Licenses'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'Pick'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'Edit'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Unknown'; + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'About'; + + @override + String get drawerSettingsButton => 'Settings'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Countries'; + + @override + String get drawerPlacePage => 'Places'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'By date'; + + @override + String get sortByName => 'By name'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'By size'; + + @override + String get sortByAlbumFileName => 'By album & item title'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A to Z'; + + @override + String get sortOrderZtoA => 'Z to A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumMimeTypeMixed => 'Mixed'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'Camera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'CREATE'; + + @override + String get newFilterBanner => 'new'; + + @override + String get countryPageTitle => 'Countries'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'States'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Places'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Date'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Countries'; + + @override + String get searchStatesSectionTitle => 'States'; + + @override + String get searchPlacesSectionTitle => 'Places'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Ratings'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Settings'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'Disabled'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'Settings'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Home'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_hu.dart b/lib/l10ngen/app_localizations_hu.dart new file mode 100644 index 0000000..d76b791 --- /dev/null +++ b/lib/l10ngen/app_localizations_hu.dart @@ -0,0 +1,2367 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Hungarian (`hu`). +class AppLocalizationsHu extends AppLocalizations { + AppLocalizationsHu([String locale = 'hu']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Üdvözöl az Aves'; + + @override + String get welcomeOptional => 'Nem kötelező'; + + @override + String get welcomeTermsToggle => 'Elfogadom a felhasználási feltételeket'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elem', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count oszlop', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString másodperc', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString perc', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString nap', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'ALKALMAZ'; + + @override + String get createButtonLabel => 'LÉTREHOZÁS'; + + @override + String get deleteButtonLabel => 'TÖRLÉS'; + + @override + String get nextButtonLabel => 'KÖVETKEZŐ'; + + @override + String get showButtonLabel => 'MUTAT'; + + @override + String get hideButtonLabel => 'ELREJTÉS'; + + @override + String get continueButtonLabel => 'FOLYTAT'; + + @override + String get saveCopyButtonLabel => 'MÁSOLAT MENTÉSE'; + + @override + String get applyTooltip => 'Alkalmaz'; + + @override + String get cancelTooltip => 'Mégse'; + + @override + String get changeTooltip => 'Változtat'; + + @override + String get clearTooltip => 'Töröl'; + + @override + String get previousTooltip => 'Előző'; + + @override + String get nextTooltip => 'Következő'; + + @override + String get showTooltip => 'Megjelenítés'; + + @override + String get hideTooltip => 'Elrejtés'; + + @override + String get actionRemove => 'Eltávolítás'; + + @override + String get resetTooltip => 'Visszaállít'; + + @override + String get saveTooltip => 'Mentés'; + + @override + String get stopTooltip => 'Állj'; + + @override + String get pickTooltip => 'Kiválaszt'; + + @override + String get doubleBackExitMessage => 'Nyomd meg a „visszát” még egyszer a kilépéshez.'; + + @override + String get doNotAskAgain => 'Ne kérdezd újra'; + + @override + String get sourceStateLoading => 'Betöltés'; + + @override + String get sourceStateCataloguing => 'Katalógus'; + + @override + String get sourceStateLocatingCountries => 'Országok meghatározása'; + + @override + String get sourceStateLocatingPlaces => 'Helyek meghatározása'; + + @override + String get chipActionDelete => 'Törlés'; + + @override + String get chipActionRemove => 'Eltávolítás'; + + @override + String get chipActionShowCollection => 'Megjelenítés a gyűjteményekben'; + + @override + String get chipActionGoToAlbumPage => 'Megjelenítés az albumokban'; + + @override + String get chipActionGoToCountryPage => 'Megjelenítés az országokban'; + + @override + String get chipActionGoToPlacePage => 'Megjelenítés a helyekben'; + + @override + String get chipActionGoToTagPage => 'Megjelenítés a címkékben'; + + @override + String get chipActionGoToExplorerPage => 'Mutatás a böngészőben'; + + @override + String get chipActionDecompose => 'Felosztás'; + + @override + String get chipActionFilterOut => 'Nem tartalmazza'; + + @override + String get chipActionFilterIn => 'Tartalmazza'; + + @override + String get chipActionHide => 'Elrejtés'; + + @override + String get chipActionLock => 'Zárolás'; + + @override + String get chipActionPin => 'Kitűzés felülre'; + + @override + String get chipActionUnpin => 'Kitűzés megszüntetése'; + + @override + String get chipActionGroup => 'Csoportosítás módosítása'; + + @override + String get chipActionRename => 'Átnevezés'; + + @override + String get chipActionSetCover => 'Borító beállítása'; + + @override + String get chipActionShowCountryStates => 'Megyék megjelenítése'; + + @override + String get chipActionCreateGroup => 'Csoport létrehozása'; + + @override + String get chipActionCreateAlbum => 'Új album'; + + @override + String get chipActionCreateVault => 'Széf készítése'; + + @override + String get chipActionConfigureVault => 'Széf beállítása'; + + @override + String get entryActionCopyToClipboard => 'Vágolapra másolás'; + + @override + String get entryActionDelete => 'Törlés'; + + @override + String get entryActionConvert => 'Átalakítás'; + + @override + String get entryActionExport => 'Exportálás'; + + @override + String get entryActionInfo => 'Infó'; + + @override + String get entryActionRename => 'Átnevezés'; + + @override + String get entryActionRestore => 'Visszaállítás'; + + @override + String get entryActionRotateCCW => 'Forgatás balra'; + + @override + String get entryActionRotateCW => 'Forgatás jobbra'; + + @override + String get entryActionFlip => 'Forgatás vízszintesen'; + + @override + String get entryActionPrint => 'Nyomtatás'; + + @override + String get entryActionShare => 'Megosztás'; + + @override + String get entryActionShareImageOnly => 'Csak kép megosztása'; + + @override + String get entryActionShareVideoOnly => 'Csak videó megosztása'; + + @override + String get entryActionViewSource => 'Forrás megtekintése'; + + @override + String get entryActionShowGeoTiffOnMap => 'Térképre helyezve'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Átalakítás állóképpé'; + + @override + String get entryActionViewMotionPhotoVideo => 'Videó megnyitása'; + + @override + String get entryActionEdit => 'Szerkesztés'; + + @override + String get entryActionOpen => 'Megnyitás ezzel'; + + @override + String get entryActionSetAs => 'Beállit, mint'; + + @override + String get entryActionCast => 'Kivetítés'; + + @override + String get entryActionOpenMap => 'Megjelenítés térkép alkalmazásban'; + + @override + String get entryActionRotateScreen => 'Képernyő forgatása'; + + @override + String get entryActionAddFavourite => 'Kedvencekhez adás'; + + @override + String get entryActionRemoveFavourite => 'Eltávolítás a kedvencekből'; + + @override + String get videoActionCaptureFrame => 'Képkocka mentése'; + + @override + String get videoActionMute => 'Némítás'; + + @override + String get videoActionUnmute => 'Némítás feloldása'; + + @override + String get videoActionPause => 'Szünet'; + + @override + String get videoActionPlay => 'Lejátszás'; + + @override + String get videoActionReplay10 => 'Ugrás vissza 10 másodpercet'; + + @override + String get videoActionSkip10 => 'Ugrás előre 10 másodpercet'; + + @override + String get videoActionShowPreviousFrame => 'Előző képkocka mutatása'; + + @override + String get videoActionShowNextFrame => 'Következő képkocka mutatása'; + + @override + String get videoActionSelectStreams => 'Sávok kiválasztása'; + + @override + String get videoActionSetSpeed => 'Lejátszás sebessége'; + + @override + String get videoActionABRepeat => 'A-B ismétlés'; + + @override + String get videoRepeatActionSetStart => 'Kezdőpont beállítása'; + + @override + String get videoRepeatActionSetEnd => 'Végpont beállítása'; + + @override + String get viewerActionSettings => 'Beállítások'; + + @override + String get viewerActionLock => 'Megtekintő zárolása'; + + @override + String get viewerActionUnlock => 'Megtekintő feloldása'; + + @override + String get slideshowActionResume => 'Folytatás'; + + @override + String get slideshowActionShowInCollection => 'Megjelenítés a gyűjteményekben'; + + @override + String get entryInfoActionEditDate => 'Dátum és idő szerkesztése'; + + @override + String get entryInfoActionEditLocation => 'Hely szerkesztése'; + + @override + String get entryInfoActionEditTitleDescription => 'Cím és leírás szerkesztése'; + + @override + String get entryInfoActionEditRating => 'Értékelés szerkesztése'; + + @override + String get entryInfoActionEditTags => 'Címke szerkesztése'; + + @override + String get entryInfoActionRemoveMetadata => 'Metaadat eltávolítása'; + + @override + String get entryInfoActionExportMetadata => 'Metaadat exportálása'; + + @override + String get entryInfoActionRemoveLocation => 'Hely eltávolítása'; + + @override + String get editorActionTransform => 'Alakítás'; + + @override + String get editorTransformCrop => 'Vágás'; + + @override + String get editorTransformRotate => 'Forgatás'; + + @override + String get cropAspectRatioFree => 'Kötetlen'; + + @override + String get cropAspectRatioOriginal => 'Eredeti'; + + @override + String get cropAspectRatioSquare => 'Négyzet'; + + @override + String get filterAspectRatioLandscapeLabel => 'Fekvő'; + + @override + String get filterAspectRatioPortraitLabel => 'Álló'; + + @override + String get filterBinLabel => 'Kuka'; + + @override + String get filterFavouriteLabel => 'Kedvenc'; + + @override + String get filterNoDateLabel => 'Nincs dátum'; + + @override + String get filterNoAddressLabel => 'Nincs cím'; + + @override + String get filterLocatedLabel => 'Hely információval rendelkezők'; + + @override + String get filterNoLocationLabel => 'Hely információ nélküliek'; + + @override + String get filterNoRatingLabel => 'Nincs értékelés'; + + @override + String get filterTaggedLabel => 'Cimkézett'; + + @override + String get filterNoTagLabel => 'Cimkézetlen'; + + @override + String get filterNoTitleLabel => 'Névtelen'; + + @override + String get filterOnThisDayLabel => 'Ezen a napon'; + + @override + String get filterRecentlyAddedLabel => 'Nemrég hozzáadva'; + + @override + String get filterRatingRejectedLabel => 'Elutasított'; + + @override + String get filterTypeAnimatedLabel => 'Animált'; + + @override + String get filterTypeMotionPhotoLabel => 'Mozgó fotók'; + + @override + String get filterTypePanoramaLabel => 'Panoráma'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° videó'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Kép'; + + @override + String get filterMimeVideoLabel => 'Videó'; + + @override + String get accessibilityAnimationsRemove => 'Animációk mellőzése'; + + @override + String get accessibilityAnimationsKeep => 'Animációk megtartása'; + + @override + String get albumTierNew => 'Új'; + + @override + String get albumTierPinned => 'Kitűzött'; + + @override + String get albumTierGroups => 'Csoportok'; + + @override + String get albumTierSpecial => 'Gyakori'; + + @override + String get albumTierApps => 'Alkalmazások'; + + @override + String get albumTierVaults => 'Széfek'; + + @override + String get albumTierDynamic => 'Dinamikus'; + + @override + String get albumTierRegular => 'Egyebek'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Tizedes fokok'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'É'; + + @override + String get coordinateDmsSouth => 'D'; + + @override + String get coordinateDmsEast => 'K'; + + @override + String get coordinateDmsWest => 'Ny'; + + @override + String get displayRefreshRatePreferHighest => 'Legmagasabb érték'; + + @override + String get displayRefreshRatePreferLowest => 'Legalacsonyabb érték'; + + @override + String get keepScreenOnNever => 'Soha'; + + @override + String get keepScreenOnVideoPlayback => 'Videólejátszás alatt'; + + @override + String get keepScreenOnViewerOnly => 'Csak a megtekintőnél'; + + @override + String get keepScreenOnAlways => 'Mindig'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google térkép'; + + @override + String get mapStyleGoogleHybrid => 'Google térkép (Hibrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google térkép (Domborzat)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Akvarell'; + + @override + String get maxBrightnessNever => 'Soha'; + + @override + String get maxBrightnessAlways => 'Mindig'; + + @override + String get nameConflictStrategyRename => 'Átnevezés'; + + @override + String get nameConflictStrategyReplace => 'Kicserél'; + + @override + String get nameConflictStrategySkip => 'Átugrik'; + + @override + String get overlayHistogramNone => 'Nincs'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Fényerő'; + + @override + String get subtitlePositionTop => 'Felül'; + + @override + String get subtitlePositionBottom => 'Alul'; + + @override + String get themeBrightnessLight => 'Világos'; + + @override + String get themeBrightnessDark => 'Sötét'; + + @override + String get themeBrightnessBlack => 'Fekete'; + + @override + String get unitSystemMetric => 'Metrikus'; + + @override + String get unitSystemImperial => 'Angolszász'; + + @override + String get vaultLockTypePattern => 'Minta'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Jelszó'; + + @override + String get settingsVideoEnablePip => 'Kép a képben'; + + @override + String get videoControlsPlayOutside => 'Megnyitás másik lejátszóval'; + + @override + String get videoLoopModeNever => 'Soha'; + + @override + String get videoLoopModeShortOnly => 'Csak rövid videók'; + + @override + String get videoLoopModeAlways => 'Mindig'; + + @override + String get videoPlaybackSkip => 'Átugrik'; + + @override + String get videoPlaybackMuted => 'Lejátszás némítva'; + + @override + String get videoPlaybackWithSound => 'Lejátszás hanggal'; + + @override + String get videoResumptionModeNever => 'Soha'; + + @override + String get videoResumptionModeAlways => 'Mindig'; + + @override + String get viewerTransitionSlide => 'Csúsztatás'; + + @override + String get viewerTransitionParallax => 'Parallaxis'; + + @override + String get viewerTransitionFade => 'Áttünés'; + + @override + String get viewerTransitionZoomIn => 'Nagyítás'; + + @override + String get viewerTransitionNone => 'Nincs'; + + @override + String get wallpaperTargetHome => 'Kezdőképernyő'; + + @override + String get wallpaperTargetLock => 'Lezárási képernyő'; + + @override + String get wallpaperTargetHomeLock => 'Kezdő és lezárási képernyő'; + + @override + String get widgetDisplayedItemRandom => 'Véletlenszerű'; + + @override + String get widgetDisplayedItemMostRecent => 'Legutóbbi'; + + @override + String get widgetOpenPageHome => 'Kezdőlap megnyitása'; + + @override + String get widgetOpenPageCollection => 'Gyűjtemény megnyitása'; + + @override + String get widgetOpenPageViewer => 'Megtekintő megnyitása'; + + @override + String get widgetTapUpdateWidget => 'Widget frissítése'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Belső tárhely'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD kártya'; + + @override + String get rootDirectoryDescription => 'gyökér mappa'; + + @override + String otherDirectoryDescription(String name) { + return '„$name” mappa'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Válaszd ki a $directory mappát a „$volume” tárhelyen a következő képernyőn, hogy az Aves hozzáférjen.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Az Avesnek nincs engedélyezve, hogy módosításokat végezzen a $directory mappában a „$volume” tárhelyen.\n\nHasználd a telefon fájlkezelőjét vagy galériáját az elemek másik mappába helyezéséhez.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Ehhez a művelethez $neededSize szabad helyre van szükség itt: „$volume”, de csak $freeSize szabad.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'A rendszer fájlkezelője hiányzik vagy letiltott. Engedélyezd és próbáld újra.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Ez a művelet nem támogatott a következő típusú elemeknél: $types.', + one: 'Ez a művelet nem támogatott a következő típusú elemnél: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Néhány fájl neve ugyanaz a cél mappában.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Néhány fájl neve ugyanaz.'; + + @override + String get addShortcutDialogLabel => 'Parancsikon címke'; + + @override + String get addShortcutButtonLabel => 'HOZZÁAD'; + + @override + String get noMatchingAppDialogMessage => 'Nincs alkalmazás ami elboldogul ezzel.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Áthelyezed a $count elemet a kukába?', + one: 'Áthelyezed a kukába?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Törlöd ezt a $count elemet?', + one: 'Törlöd ezt az elemet?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Mented az elemek dátumait a végrehajtás előtt?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Dátumok mentése'; + + @override + String videoResumeDialogMessage(String time) { + return 'Folytatod a lejátszást innen: $time?'; + } + + @override + String get videoStartOverButtonLabel => 'KEZDÉS ELÖLRŐL'; + + @override + String get videoResumeButtonLabel => 'FOLYTATÁS'; + + @override + String get setCoverDialogLatest => 'Legutóbbi elem'; + + @override + String get setCoverDialogAuto => 'Automatikus'; + + @override + String get setCoverDialogCustom => 'Egyéni'; + + @override + String get hideFilterConfirmationDialogMessage => 'Az egyező képek és videók el lesznek rejtve a gyűjteményedből. Újra megjelenítheted ezeket az „Adatvédelem” beállításokban.\n\nBiztosan el akarod rejteni őket?'; + + @override + String get newAlbumDialogTitle => 'Új album'; + + @override + String get newAlbumDialogNameLabel => 'Album neve'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Az album már létezik'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'A mappa már létezik'; + + @override + String get newAlbumDialogStorageLabel => 'Tárhely:'; + + @override + String get newDynamicAlbumDialogTitle => 'Új Dinamikus Album'; + + @override + String get dynamicAlbumAlreadyExists => 'A dinamikus album már létezik'; + + @override + String get newGroupDialogTitle => 'Új csoport'; + + @override + String get newGroupDialogNameLabel => 'Csoport neve'; + + @override + String get groupAlreadyExists => 'Csoport már létezik'; + + @override + String get groupEmpty => 'Nincsenek csoportok'; + + @override + String get ungrouped => 'Csoportosítatlan'; + + @override + String get groupPickerTitle => 'Válassza ki a csoportot'; + + @override + String get groupPickerUseThisGroupButton => 'Használja ezt a csoportot'; + + @override + String get newVaultWarningDialogMessage => 'A széfben lévő elemek csak ebben az alkalmazásban érhetőek el.\n\nHa eltávolítod az alkalmazást vagy törlöd az adatokat, ezeket az elemeket is elveszíted.'; + + @override + String get newVaultDialogTitle => 'Új széf'; + + @override + String get configureVaultDialogTitle => 'Széf konfigurálása'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Zárolás képernyő kikapcsoláskor'; + + @override + String get vaultDialogLockTypeLabel => 'Zárolás típusa'; + + @override + String get patternDialogEnter => 'Minta megadása'; + + @override + String get patternDialogConfirm => 'Minta megerősítése'; + + @override + String get pinDialogEnter => 'PIN megadása'; + + @override + String get pinDialogConfirm => 'PIN megerősítése'; + + @override + String get passwordDialogEnter => 'Jelszó megadása'; + + @override + String get passwordDialogConfirm => 'Jelszó megerősítése'; + + @override + String get authenticateToConfigureVault => 'Azonosítás a széf beállításához'; + + @override + String get authenticateToUnlockVault => 'Azonosítás a széf feloldásához'; + + @override + String get vaultBinUsageDialogMessage => 'Néhány széf használja a kukát.'; + + @override + String get renameAlbumDialogLabel => 'Új név'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'A mappa már létezik'; + + @override + String get renameEntrySetPageTitle => 'Átnevezés'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Elnevezési minta'; + + @override + String get renameEntrySetPageInsertTooltip => 'Mező beszúrása'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Előnézet'; + + @override + String get renameProcessorCounter => 'Számláló'; + + @override + String get renameProcessorHash => 'Hash-kulcs'; + + @override + String get renameProcessorName => 'Név'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Törlöd ezt az albumot és a benne levő $count elemet?', + one: 'Törlöd ezt az albumot és az egy elemet benne ?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Törlöd ezt az albumot és a benne levő $count elemet?', + one: 'Törlöd ezt az albumot és az egy elemet benne ?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Formátum:'; + + @override + String get exportEntryDialogWidth => 'Szélesség'; + + @override + String get exportEntryDialogHeight => 'Magasság'; + + @override + String get exportEntryDialogQuality => 'Minőség'; + + @override + String get exportEntryDialogWriteMetadata => 'Metaadat írása'; + + @override + String get renameEntryDialogLabel => 'Új név'; + + @override + String get editEntryDialogCopyFromItem => 'Másolás másik elemről'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Módosítandó mezők'; + + @override + String get editEntryDateDialogTitle => 'Dátum és idő'; + + @override + String get editEntryDateDialogSetCustom => 'Egyéni dátum beállítása'; + + @override + String get editEntryDateDialogCopyField => 'Másolás másik dátumról'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Kibontás a címből'; + + @override + String get editEntryDateDialogShift => 'Csúsztatás'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Fájl módosítás dátuma'; + + @override + String get durationDialogHours => 'Óra'; + + @override + String get durationDialogMinutes => 'Perc'; + + @override + String get durationDialogSeconds => 'Másodperc'; + + @override + String get editEntryLocationDialogTitle => 'Hely'; + + @override + String get editEntryLocationDialogSetCustom => 'Egyéni hely beállítása'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Kijelölés térképen'; + + @override + String get editEntryLocationDialogImportGpx => 'GPX importálás'; + + @override + String get editEntryLocationDialogLatitude => 'Szélesség'; + + @override + String get editEntryLocationDialogLongitude => 'Hosszúság'; + + @override + String get editEntryLocationDialogTimeShift => 'Időeltolódás'; + + @override + String get locationPickerUseThisLocationButton => 'Használd ezt a helyet'; + + @override + String get editEntryRatingDialogTitle => 'Értékelés'; + + @override + String get removeEntryMetadataDialogTitle => 'Metaadat eltávolítása'; + + @override + String get removeEntryMetadataDialogAll => 'Összes'; + + @override + String get removeEntryMetadataDialogMore => 'Továbbiak'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'Az XMP szükséges a mozgó fotókban lévő videó lejátszásához.\n\nBiztosan eltávolítod?'; + + @override + String get videoSpeedDialogLabel => 'Lejátszás sebessége'; + + @override + String get videoStreamSelectionDialogVideo => 'Videó'; + + @override + String get videoStreamSelectionDialogAudio => 'Audió'; + + @override + String get videoStreamSelectionDialogText => 'Feliratok'; + + @override + String get videoStreamSelectionDialogOff => 'Ki'; + + @override + String get videoStreamSelectionDialogTrack => 'Sáv'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Nincsenek más sávok.'; + + @override + String get genericSuccessFeedback => 'Kész!'; + + @override + String get genericFailureFeedback => 'Sikertelen'; + + @override + String get genericDangerWarningDialogMessage => 'Biztos benne?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Próbáld újra kevesebb elemmel.'; + + @override + String get menuActionConfigureView => 'Nézet'; + + @override + String get menuActionSelect => 'Kiválasztás'; + + @override + String get menuActionSelectAll => 'Összes kijelölése'; + + @override + String get menuActionSelectNone => 'Kijelölés megszüntetése'; + + @override + String get menuActionMap => 'Térkép'; + + @override + String get menuActionSlideshow => 'Diavetités'; + + @override + String get menuActionStats => 'Statisztikák'; + + @override + String get viewDialogSortSectionTitle => 'Rendezés'; + + @override + String get viewDialogGroupSectionTitle => 'Szekciók'; + + @override + String get viewDialogLayoutSectionTitle => 'Elrendezés'; + + @override + String get viewDialogReverseSortOrder => 'Fordított sorrend'; + + @override + String get tileLayoutMosaic => 'Mozaik'; + + @override + String get tileLayoutGrid => 'Rács'; + + @override + String get tileLayoutList => 'Lista'; + + @override + String get castDialogTitle => 'Kivetítő eszközök'; + + @override + String get coverDialogTabCover => 'Borító'; + + @override + String get coverDialogTabApp => 'Alkalmazás'; + + @override + String get coverDialogTabColor => 'Szín'; + + @override + String get appPickDialogTitle => 'Alkalmazás választása'; + + @override + String get appPickDialogNone => 'Nincs'; + + @override + String get aboutPageTitle => 'Névjegy'; + + @override + String get aboutLinkLicense => 'Licensz'; + + @override + String get aboutLinkPolicy => 'Adatvédelmi irányelvek'; + + @override + String get aboutBugSectionTitle => 'Hibajelentés'; + + @override + String get aboutBugSaveLogInstruction => 'Naplófájlok mentése'; + + @override + String get aboutBugCopyInfoInstruction => 'Rendszer információ másolása'; + + @override + String get aboutBugCopyInfoButton => 'Másolás'; + + @override + String get aboutBugReportInstruction => 'Jelentés GitHub-on naplófájlokkal és rendszer információval'; + + @override + String get aboutBugReportButton => 'Jelentés'; + + @override + String get aboutDataUsageSectionTitle => 'Adatforgalom'; + + @override + String get aboutDataUsageData => 'Adat'; + + @override + String get aboutDataUsageCache => 'Gyorsítótár'; + + @override + String get aboutDataUsageDatabase => 'Adatbázis'; + + @override + String get aboutDataUsageMisc => 'Egyéb'; + + @override + String get aboutDataUsageInternal => 'Belső'; + + @override + String get aboutDataUsageExternal => 'Külső'; + + @override + String get aboutDataUsageClearCache => 'Gyorsítótár törlése'; + + @override + String get aboutCreditsSectionTitle => 'Készítők'; + + @override + String get aboutCreditsWorldAtlas1 => 'Ez az app egy TopoJSON fájlt használ'; + + @override + String get aboutCreditsWorldAtlas2 => 'oldalról ISC Licenccel.'; + + @override + String get aboutTranslatorsSectionTitle => 'Fordítók'; + + @override + String get aboutLicensesSectionTitle => 'Nyílt forrású licenszek'; + + @override + String get aboutLicensesBanner => 'Használt nyílt forrású csomagok és könyvtárak.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android könyvtárak'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter beépülők'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter csomagok'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart csomagok'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Minden licensz megjelenítése'; + + @override + String get policyPageTitle => 'Adatvédelmi irányelvek'; + + @override + String get collectionPageTitle => 'Gyűjtemény'; + + @override + String get collectionPickPageTitle => 'Választ'; + + @override + String get collectionSelectPageTitle => 'Elemek kiválasztása'; + + @override + String get collectionActionShowTitleSearch => 'Cím szűrő mutatása'; + + @override + String get collectionActionHideTitleSearch => 'Cím szűrő elrejtése'; + + @override + String get collectionActionAddDynamicAlbum => 'Dinamikus album hozzáadása'; + + @override + String get collectionActionAddShortcut => 'Parancsikon készítése'; + + @override + String get collectionActionSetHome => 'Kezdőlapnak beállít'; + + @override + String get collectionActionEmptyBin => 'A kuka üres'; + + @override + String get collectionActionCopy => 'Másolás albumba'; + + @override + String get collectionActionMove => 'Áthelyezés albumba'; + + @override + String get collectionActionRescan => 'Újraolvasás'; + + @override + String get collectionActionEdit => 'Szerkesztés'; + + @override + String get collectionSearchTitlesHintText => 'Címek keresése'; + + @override + String get collectionGroupAlbum => 'Albumok szerint'; + + @override + String get collectionGroupMonth => 'Hónapok szerint'; + + @override + String get collectionGroupDay => 'Napok szerint'; + + @override + String get sectionNone => 'Semmi szerint'; + + @override + String get sectionUnknown => 'Ismeretlen'; + + @override + String get dateToday => 'Ma'; + + @override + String get dateYesterday => 'Tegnap'; + + @override + String get dateThisMonth => 'Ebben a hónapban'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elem törlése sikertelen', + one: 'Elem törlése sikertelen', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elem másolása sikertelen', + one: 'Elem másolása sikertelen', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elem áthelyezése sikertelen', + one: 'Elem áthelyezése sikertelen', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elem átnevezése sikertelen', + one: 'Elem átnevezése sikertelen', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elem szerkesztése sikertelen', + one: 'Elem szerkesztése sikertelen', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nem sikerült exportálni $count oldalt', + one: 'Nem sikerült exportálni 1 oldalt', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elem másolva', + one: '1 elem másolva', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elem áthelyezve', + one: '1 elem áthelyezve', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elem átnevezve', + one: '1 elem átnevezve', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elem szerkesztve', + one: '1 elem szerkesztve', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Nincsenek kedvencek'; + + @override + String get collectionEmptyVideos => 'Nincsenek videók'; + + @override + String get collectionEmptyImages => 'Nincsenek képek'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Hozzáférés biztosítása'; + + @override + String get collectionSelectSectionTooltip => 'Szakasz kijelölése'; + + @override + String get collectionDeselectSectionTooltip => 'Szakasz kijelölésének megszüntetése'; + + @override + String get drawerAboutButton => 'Névjegy'; + + @override + String get drawerSettingsButton => 'Beállítások'; + + @override + String get drawerCollectionAll => 'Összes gyűjtemény'; + + @override + String get drawerCollectionFavourites => 'Kedvencek'; + + @override + String get drawerCollectionImages => 'Képek'; + + @override + String get drawerCollectionVideos => 'Videók'; + + @override + String get drawerCollectionAnimated => 'Animált'; + + @override + String get drawerCollectionMotionPhotos => 'Mozgó fotók'; + + @override + String get drawerCollectionPanoramas => 'Panorámák'; + + @override + String get drawerCollectionRaws => 'Raw fotók'; + + @override + String get drawerCollectionSphericalVideos => '360° videó'; + + @override + String get drawerAlbumPage => 'Albumok'; + + @override + String get drawerCountryPage => 'Országok'; + + @override + String get drawerPlacePage => 'Helyek'; + + @override + String get drawerTagPage => 'Címkék'; + + @override + String get sortByDate => 'Dátum'; + + @override + String get sortByName => 'Név'; + + @override + String get sortByItemCount => 'Elemek száma'; + + @override + String get sortBySize => 'Méret'; + + @override + String get sortByAlbumFileName => 'Album és cím szerint'; + + @override + String get sortByRating => 'Értékelés'; + + @override + String get sortByDuration => 'Hossz szerint'; + + @override + String get sortByPath => 'Útvonal szerint'; + + @override + String get sortOrderNewestFirst => 'Legújabb legelöl'; + + @override + String get sortOrderOldestFirst => 'Legrégebbi legelöl'; + + @override + String get sortOrderAtoZ => 'A-Z'; + + @override + String get sortOrderZtoA => 'Z-A'; + + @override + String get sortOrderHighestFirst => 'Legmagasabb legelöl'; + + @override + String get sortOrderLowestFirst => 'Legalacsonyabb legelöl'; + + @override + String get sortOrderLargestFirst => 'Legnagyobb legelöl'; + + @override + String get sortOrderSmallestFirst => 'Legkisebb legelöl'; + + @override + String get sortOrderShortestFirst => 'Legrövidebb legelöl'; + + @override + String get sortOrderLongestFirst => 'Leghosszabb legelöl'; + + @override + String get albumGroupTier => 'Szint szerint'; + + @override + String get albumGroupType => 'Típus szerint'; + + @override + String get albumGroupVolume => 'Tárhely alapján'; + + @override + String get albumMimeTypeMixed => 'Vegyesen'; + + @override + String get albumPickPageTitleCopy => 'Másolás albumba'; + + @override + String get albumPickPageTitleExport => 'Exportálás albumba'; + + @override + String get albumPickPageTitleMove => 'Áthelyezés albumba'; + + @override + String get albumPickPageTitlePick => 'Album választása'; + + @override + String get albumCamera => 'Kamera'; + + @override + String get albumDownload => 'Letöltés'; + + @override + String get albumScreenshots => 'Képernyőképek'; + + @override + String get albumScreenRecordings => 'Képernyőfelvételek'; + + @override + String get albumVideoCaptures => 'Képkocka mentések'; + + @override + String get albumPageTitle => 'Albumok'; + + @override + String get albumEmpty => 'Nincsenek albumok'; + + @override + String get createAlbumButtonLabel => 'LÉTREHOZÁS'; + + @override + String get newFilterBanner => 'új'; + + @override + String get countryPageTitle => 'Országok'; + + @override + String get countryEmpty => 'Nincsenek országok'; + + @override + String get statePageTitle => 'Megyék'; + + @override + String get stateEmpty => 'Nincsenek megyék'; + + @override + String get placePageTitle => 'Helyek'; + + @override + String get placeEmpty => 'Nincsenek helyek'; + + @override + String get tagPageTitle => 'Címkék'; + + @override + String get tagEmpty => 'Nincsenek címkék'; + + @override + String get tagPickPageTitle => 'Címke kiválasztása'; + + @override + String get binPageTitle => 'Kuka'; + + @override + String get explorerPageTitle => 'Böngésző'; + + @override + String get explorerActionSelectStorageVolume => 'Tároló kiválasztása'; + + @override + String get selectStorageVolumeDialogTitle => 'Tároló Kiválasztása'; + + @override + String get searchCollectionFieldHint => 'Gyűjtemény keresése'; + + @override + String get searchRecentSectionTitle => 'Legutóbbi'; + + @override + String get searchDateSectionTitle => 'Dátum'; + + @override + String get searchFormatSectionTitle => 'Formátumok'; + + @override + String get searchAlbumsSectionTitle => 'Albumok'; + + @override + String get searchCountriesSectionTitle => 'Országok'; + + @override + String get searchStatesSectionTitle => 'Megyék'; + + @override + String get searchPlacesSectionTitle => 'Helyek'; + + @override + String get searchTagsSectionTitle => 'Címkék'; + + @override + String get searchRatingSectionTitle => 'Értékelések'; + + @override + String get searchMetadataSectionTitle => 'Metaadat'; + + @override + String get settingsPageTitle => 'Beállítások'; + + @override + String get settingsSystemDefault => 'Rendszer alapértéke'; + + @override + String get settingsDefault => 'Alapértelmezett'; + + @override + String get settingsDisabled => 'Letiltva'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Mindig rákérdez'; + + @override + String get settingsModificationWarningDialogMessage => 'Egyéb beállítások is módosítva lesznek.'; + + @override + String get settingsSearchFieldLabel => 'Keresési beállítások'; + + @override + String get settingsSearchEmpty => 'Nincs egyező beállítás'; + + @override + String get settingsActionExport => 'Exportálás'; + + @override + String get settingsActionExportDialogTitle => 'Exportálás'; + + @override + String get settingsActionImport => 'Importálás'; + + @override + String get settingsActionImportDialogTitle => 'Importálás'; + + @override + String get appExportCovers => 'Borítóképek'; + + @override + String get appExportDynamicAlbums => 'Dinamikus albumok'; + + @override + String get appExportFavourites => 'Kedvencek'; + + @override + String get appExportSettings => 'Beállítások'; + + @override + String get settingsNavigationSectionTitle => 'Navigáció'; + + @override + String get settingsHomeTile => 'Kezdőlap'; + + @override + String get settingsHomeDialogTitle => 'Kezdőlap'; + + @override + String get setHomeCustom => 'Egyéni'; + + @override + String get settingsKeepScreenOnTile => 'Kijelző bekapcsolva tartása'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Kijelző bekapcsolva tartása'; + + @override + String get settingsDoubleBackExit => 'Nyomd meg a „visszát” kétszer a kilépéshez'; + + @override + String get settingsConfirmationTile => 'Megerősítési kérdések'; + + @override + String get settingsConfirmationDialogTitle => 'Megerősítési kérdések'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Kérdés az elemek végleges törlése előtt'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Kérdés az elemek kukába helyezése előtt'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Kérdés a dátum nélküli elemek áthelyezése előtt'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Üzenet az elemek kukába helyezése után'; + + @override + String get settingsConfirmationVaultDataLoss => 'Széf adatvesztési figyelmeztetés mutatása'; + + @override + String get settingsNavigationDrawerTile => 'Navigációs menü'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigációs menü'; + + @override + String get settingsNavigationDrawerBanner => 'Érintsd és tartsd lenyomva a menü elemek mozgatásához és átrendezéshez.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Típusok'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albumok'; + + @override + String get settingsNavigationDrawerTabPages => 'Oldalak'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Album hozzáadása'; + + @override + String get settingsNavigationBottomActionsTile => 'Alsó navigáció'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Alsó Navigáció'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Érintsd meg és tartsd lenyomva a gombokat, majd válaszd ki, mely műveletek jelenjenek meg az alsó navigációs sávban.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniatűrök'; + + @override + String get settingsThumbnailOverlayTile => 'Átfedés'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Átfedés'; + + @override + String get settingsThumbnailShowHdrIcon => 'HDR ikon megjelenítése'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Kedvenc ikon mutatása'; + + @override + String get settingsThumbnailShowTagIcon => 'Címke ikon mutatása'; + + @override + String get settingsThumbnailShowLocationIcon => 'Hely ikon mutatása'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Mozgó fotó ikon mutatása'; + + @override + String get settingsThumbnailShowRating => 'Értékelés mutatása'; + + @override + String get settingsThumbnailShowRawIcon => 'Raw ikon mutatása'; + + @override + String get settingsThumbnailShowVideoDuration => 'Videó hosszának mutatása'; + + @override + String get settingsCollectionQuickActionsTile => 'Gyors műveletek'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Gyors műveletek'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Böngészés'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Kiválasztás'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Érintsd és tartsd lenyomva a gombok mozgatásához, válaszd ki az elemek böngészésekor megjelenő műveleteket.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Érintsd és tartsd lenyomva a gombok mozgatásához, válaszd ki az elemek kiválasztásakor megjelenő műveleteket.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Sorozatfelvételi minták'; + + @override + String get settingsCollectionBurstPatternsNone => 'Nincs'; + + @override + String get settingsViewerSectionTitle => 'Megtekintő'; + + @override + String get settingsViewerGestureSideTapNext => 'Koppints a képernyő szélein az előző/következő elemhez'; + + @override + String get settingsViewerUseCutout => 'Képernyő kivágási terület használata'; + + @override + String get settingsViewerMaximumBrightness => 'Maximális fényerő'; + + @override + String get settingsMotionPhotoAutoPlay => 'Mozgó fotók lejátszása'; + + @override + String get settingsImageBackground => 'Fénykép háttere'; + + @override + String get settingsViewerQuickActionsTile => 'Gyors műveletek'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Gyors műveletek'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Érintsd és tartsd lenyomva a gombok mozgatásához, válaszd ki a megtekintőben megjelenő műveleteket.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Megjelenített gombok'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Elérhető gombok'; + + @override + String get settingsViewerQuickActionEmpty => 'Nincsenek gombok'; + + @override + String get settingsViewerOverlayTile => 'Átfedés'; + + @override + String get settingsViewerOverlayPageTitle => 'Átfedés'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Megjelenítés megnyitáskor'; + + @override + String get settingsViewerShowHistogram => 'Hisztogram megjelenítése'; + + @override + String get settingsViewerShowMinimap => 'Mini térkép mutatása'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Információ mutatása'; + + @override + String get settingsViewerShowInformationSubtitle => 'Cím, dátum, hely, stb. mutatása'; + + @override + String get settingsViewerShowRatingTags => 'Értékelés és címkék mutatása'; + + @override + String get settingsViewerShowShootingDetails => 'Fényképezés részleteinek mutatása'; + + @override + String get settingsViewerShowDescription => 'Leírás mutatása'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Miniatűrök mutatása'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Elmosódási hatás'; + + @override + String get settingsViewerSlideshowTile => 'Diavetités'; + + @override + String get settingsViewerSlideshowPageTitle => 'Diavetités'; + + @override + String get settingsSlideshowRepeat => 'Ismétlés'; + + @override + String get settingsSlideshowShuffle => 'Keverés'; + + @override + String get settingsSlideshowFillScreen => 'Képernyő kitöltése'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animált nagyítási hatás'; + + @override + String get settingsSlideshowTransitionTile => 'Áttünés'; + + @override + String get settingsSlideshowIntervalTile => 'Hossz'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Videó lejátszás'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Videó lejátszás'; + + @override + String get settingsVideoPageTitle => 'Videó beállítások'; + + @override + String get settingsVideoSectionTitle => 'Videó'; + + @override + String get settingsVideoShowVideos => 'Videók mutatása'; + + @override + String get settingsVideoPlaybackTile => 'Visszajátszás'; + + @override + String get settingsVideoPlaybackPageTitle => 'Lejátszás'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardveres gyorsítás'; + + @override + String get settingsVideoAutoPlay => 'Automatikus lejátszás'; + + @override + String get settingsVideoLoopModeTile => 'Ismétlés'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Ismétlés'; + + @override + String get settingsVideoResumptionModeTile => 'Lejátszás folytatása'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Lejátszás folytatása'; + + @override + String get settingsVideoBackgroundMode => 'Lejátszás háttérben'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Lejátszás háttérben'; + + @override + String get settingsVideoControlsTile => 'Vezérlők'; + + @override + String get settingsVideoControlsPageTitle => 'Vezérlők'; + + @override + String get settingsVideoButtonsTile => 'Gombok'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Lejátszás/szünet dupla koppintással'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Előre/hátra tekerés dupla koppintással a képernyő szélein'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Fényerő/hangerő módosítása fel vagy lefelé csúsztatással'; + + @override + String get settingsSubtitleThemeTile => 'Feliratok'; + + @override + String get settingsSubtitleThemePageTitle => 'Feliratok'; + + @override + String get settingsSubtitleThemeSample => 'Ez egy minta.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Szöveg pozíciója'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Szöveg pozíciója'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Szöveg pozíciója'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Szöveg pozíciója'; + + @override + String get settingsSubtitleThemeTextSize => 'Szöveg mérete'; + + @override + String get settingsSubtitleThemeShowOutline => 'Körvonal és árnyék megjelenítése'; + + @override + String get settingsSubtitleThemeTextColor => 'Szöveg színe'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Szöveg átlátszósága'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Háttér szín'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Háttér átlátszósága'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Balra'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Középen'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Jobbra'; + + @override + String get settingsPrivacySectionTitle => 'Adatvédelem'; + + @override + String get settingsAllowInstalledAppAccess => 'Hozzáférés engedélyezése az app leltárhoz'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Az album megjelenítésének javítására szolgál'; + + @override + String get settingsAllowErrorReporting => 'Névtelen hibajelentés engedélyezése'; + + @override + String get settingsSaveSearchHistory => 'Keresési előzmény mentése'; + + @override + String get settingsEnableBin => 'Kuka használata'; + + @override + String get settingsEnableBinSubtitle => 'Törölt elemek megőrzése 30 napig'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'A kukában lévő elemek örökre törlésre kerülnek.'; + + @override + String get settingsAllowMediaManagement => 'Média kezelés engedélyezése'; + + @override + String get settingsHiddenItemsTile => 'Rejtett elemek'; + + @override + String get settingsHiddenItemsPageTitle => 'Rejtett elemek'; + + @override + String get settingsHiddenFiltersBanner => 'A rejtett szűrőknek megfelelő képek és videók nem jelennek meg a gyűjteményében.'; + + @override + String get settingsHiddenFiltersEmpty => 'Nincsenek rejtett szűrők'; + + @override + String get settingsStorageAccessTile => 'Tárhely hozzáférés'; + + @override + String get settingsStorageAccessPageTitle => 'Tárhely hozzáférés'; + + @override + String get settingsStorageAccessBanner => 'Egyes könyvtárak kifejezett hozzáférési engedélyt igényelnek a benne lévő fájlok módosításához. Itt áttekintheted a könyvtárakat, amelyekhez korábban hozzáférést adtál.'; + + @override + String get settingsStorageAccessEmpty => 'Nincsenek jogok megadva'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Megvonás'; + + @override + String get settingsAccessibilitySectionTitle => 'Kisegítő lehetőségek'; + + @override + String get settingsRemoveAnimationsTile => 'Animációk eltávolítása'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Animációk eltávolítása'; + + @override + String get settingsTimeToTakeActionTile => 'Ideje cselekedni'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Mutasson alternatív többujjas kézmozdulatokat'; + + @override + String get settingsDisplaySectionTitle => 'Kijelző'; + + @override + String get settingsThemeBrightnessTile => 'Téma'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Téma'; + + @override + String get settingsThemeColorHighlights => 'Szín kiemelés'; + + @override + String get settingsThemeEnableDynamicColor => 'Dinamikus szín'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Képernyőfrissítési ráta'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Frissítési ráta'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV felület'; + + @override + String get settingsLanguageSectionTitle => 'Nyelv és formátumok'; + + @override + String get settingsLanguageTile => 'Nyelv'; + + @override + String get settingsLanguagePageTitle => 'Nyelv'; + + @override + String get settingsCoordinateFormatTile => 'Koordináták formátuma'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Koordináták formátuma'; + + @override + String get settingsUnitSystemTile => 'Mértékegységek'; + + @override + String get settingsUnitSystemDialogTitle => 'Mértékegységek'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Arab számok használata'; + + @override + String get settingsScreenSaverPageTitle => 'Képernyővédő'; + + @override + String get settingsWidgetPageTitle => 'Fotó keret'; + + @override + String get settingsWidgetShowOutline => 'Körvonal'; + + @override + String get settingsWidgetOpenPage => 'Widgetre koppintáskor'; + + @override + String get settingsWidgetDisplayedItem => 'Megjelenített elem'; + + @override + String get settingsCollectionTile => 'Gyűjtemény'; + + @override + String get statsPageTitle => 'Statisztikák'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elem helyadatokkal', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Legjobb országok'; + + @override + String get statsTopStatesSectionTitle => 'Legjobb megyék'; + + @override + String get statsTopPlacesSectionTitle => 'Legjobb helyek'; + + @override + String get statsTopTagsSectionTitle => 'Legjobb címkék'; + + @override + String get statsTopAlbumsSectionTitle => 'Legjobb albumok'; + + @override + String get viewerOpenPanoramaButtonLabel => 'PANORÁMA MEGNYITÁSA'; + + @override + String get viewerSetWallpaperButtonLabel => 'BEÁLLÍTÁS HÁTTÉRKÉPNEK'; + + @override + String get viewerErrorUnknown => 'Hoppá!'; + + @override + String get viewerErrorDoesNotExist => 'A fájl már nem létezik.'; + + @override + String get viewerInfoPageTitle => 'Infó'; + + @override + String get viewerInfoBackToViewerTooltip => 'Vissza a megtekintőhöz'; + + @override + String get viewerInfoUnknown => 'ismeretlen'; + + @override + String get viewerInfoLabelDescription => 'Leírás'; + + @override + String get viewerInfoLabelTitle => 'Cím'; + + @override + String get viewerInfoLabelDate => 'Dátum'; + + @override + String get viewerInfoLabelResolution => 'Felbontás'; + + @override + String get viewerInfoLabelSize => 'Méret'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Hely'; + + @override + String get viewerInfoLabelDuration => 'Hossz'; + + @override + String get viewerInfoLabelOwner => 'Tulajdonos'; + + @override + String get viewerInfoLabelCoordinates => 'Koordináták'; + + @override + String get viewerInfoLabelAddress => 'Cím'; + + @override + String get mapStyleDialogTitle => 'Térkép stílus'; + + @override + String get mapStyleDialogAddStyle => 'Stílus hozzáadása'; + + @override + String get mapStyleTooltip => 'Térkép stílus választása'; + + @override + String get mapStyleEditorDialogName => 'Név'; + + @override + String get mapStyleEditorDialogUrl => 'URL-cím'; + + @override + String get mapStyleEditorDialogSubdomains => 'Aldomainek'; + + @override + String get mapStyleEditorDialogUserAgent => 'Böngésző-Azonosító'; + + @override + String get mapZoomInTooltip => 'Nagyítás'; + + @override + String get mapZoomOutTooltip => 'Kicsinyítés'; + + @override + String get mapPointNorthUpTooltip => 'Mindig észak felé'; + + @override + String get mapAttributionOsmData => 'Térképadatok © [OpenStreetMap](https://www.openstreetmap.org/copyright) közreműködők'; + + @override + String get mapAttributionOsmLiberty => 'Csempék: [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Kiszolgálja: [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Csempék: [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Csempék: [HOT](https://www.hotosm.org/) • Kiszolgálja: [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Csempék: [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Megtekintés a térképen'; + + @override + String get mapEmptyRegion => 'Nincsenek képek ebben a régióban'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Sikertelen a metaadatok kicsomagolása'; + + @override + String get viewerInfoOpenLinkText => 'Megnyitás'; + + @override + String get viewerInfoViewXmlLinkText => 'XML megtekintése'; + + @override + String get viewerInfoSearchFieldLabel => 'Metaadat keresése'; + + @override + String get viewerInfoSearchEmpty => 'Nincs egyező kulcs'; + + @override + String get viewerInfoSearchSuggestionDate => 'Dátum és idő'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Leírás'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Méretek'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Felbontás'; + + @override + String get viewerInfoSearchSuggestionRights => 'Jogok'; + + @override + String get wallpaperUseScrollEffect => 'Görgetés használata kezdőképernyőn'; + + @override + String get tagEditorPageTitle => 'Címkék szerkesztése'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Új címke'; + + @override + String get tagEditorPageAddTagTooltip => 'Címke hozzáadása'; + + @override + String get tagEditorSectionRecent => 'Legutóbbi'; + + @override + String get tagEditorSectionPlaceholders => 'Helyszűrők'; + + @override + String get tagEditorDiscardDialogMessage => 'Elveted a változtatásokat?'; + + @override + String get tagPlaceholderCountry => 'Ország'; + + @override + String get tagPlaceholderState => 'Megye'; + + @override + String get tagPlaceholderPlace => 'Hely'; + + @override + String get panoramaEnableSensorControl => 'Szenzoros vezérlés engedélyezése'; + + @override + String get panoramaDisableSensorControl => 'Szenzoros vezérlés letiltása'; + + @override + String get sourceViewerPageTitle => 'Forrás'; +} diff --git a/lib/l10ngen/app_localizations_id.dart b/lib/l10ngen/app_localizations_id.dart new file mode 100644 index 0000000..69e51d5 --- /dev/null +++ b/lib/l10ngen/app_localizations_id.dart @@ -0,0 +1,2404 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Indonesian (`id`). +class AppLocalizationsId extends AppLocalizations { + AppLocalizationsId([String locale = 'id']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Selamat datang di Aves'; + + @override + String get welcomeOptional => 'Opsional'; + + @override + String get welcomeTermsToggle => 'Saya menyetujui syarat dan ketentuan'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString benda', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count kolom', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString detik', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString menit', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString hari', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'TERAPKAN'; + + @override + String get createButtonLabel => 'BUAT'; + + @override + String get deleteButtonLabel => 'BUANG'; + + @override + String get nextButtonLabel => 'SELANJUTNYA'; + + @override + String get showButtonLabel => 'TAMPILKAN'; + + @override + String get hideButtonLabel => 'SEMBUNYIKAN'; + + @override + String get continueButtonLabel => 'SELANJUTNYA'; + + @override + String get saveCopyButtonLabel => 'SIMPAN SALINAN'; + + @override + String get applyTooltip => 'Terapkan'; + + @override + String get cancelTooltip => 'Batal'; + + @override + String get changeTooltip => 'Ganti'; + + @override + String get clearTooltip => 'Hapus'; + + @override + String get previousTooltip => 'Sebelumnya'; + + @override + String get nextTooltip => 'Selanjutnya'; + + @override + String get showTooltip => 'Tampilkan'; + + @override + String get hideTooltip => 'Sembunyikan'; + + @override + String get actionRemove => 'Hapus'; + + @override + String get resetTooltip => 'Ulang'; + + @override + String get saveTooltip => 'Simpan'; + + @override + String get stopTooltip => 'Berhenti'; + + @override + String get pickTooltip => 'Pilih'; + + @override + String get doubleBackExitMessage => 'Ketuk “kembali” lagi untuk keluar.'; + + @override + String get doNotAskAgain => 'Jangan tanya lagi'; + + @override + String get sourceStateLoading => 'Memuat'; + + @override + String get sourceStateCataloguing => 'Mengkataloging'; + + @override + String get sourceStateLocatingCountries => 'Mencari negara'; + + @override + String get sourceStateLocatingPlaces => 'Mencari tempat'; + + @override + String get chipActionDelete => 'Hapus'; + + @override + String get chipActionRemove => 'Hapus'; + + @override + String get chipActionShowCollection => 'Tampilkan di Koleksi'; + + @override + String get chipActionGoToAlbumPage => 'Tampilkan di Album'; + + @override + String get chipActionGoToCountryPage => 'Tampilkan di Negara'; + + @override + String get chipActionGoToPlacePage => 'Tampilkan di Tempat'; + + @override + String get chipActionGoToTagPage => 'Tampilkan di Label'; + + @override + String get chipActionGoToExplorerPage => 'Tampilkan di Penjelajah'; + + @override + String get chipActionDecompose => 'Pisah'; + + @override + String get chipActionFilterOut => 'Filter keluar'; + + @override + String get chipActionFilterIn => 'Filter masuk'; + + @override + String get chipActionHide => 'Sembunyikan'; + + @override + String get chipActionLock => 'Kunci'; + + @override + String get chipActionPin => 'Sematkan ke atas'; + + @override + String get chipActionUnpin => 'Lepas sematan dari atas'; + + @override + String get chipActionGroup => 'Ubah pengelompokan'; + + @override + String get chipActionRename => 'Ganti nama'; + + @override + String get chipActionSetCover => 'Setel sampul'; + + @override + String get chipActionShowCountryStates => 'Tampilkan wilayah'; + + @override + String get chipActionCreateGroup => 'Buat kelompok'; + + @override + String get chipActionCreateAlbum => 'Buat album'; + + @override + String get chipActionCreateVault => 'Buat brankas'; + + @override + String get chipActionConfigureVault => 'Atur brankas'; + + @override + String get entryActionCopyToClipboard => 'Salin ke papan klip'; + + @override + String get entryActionDelete => 'Hapus'; + + @override + String get entryActionConvert => 'Ubah'; + + @override + String get entryActionExport => 'Ekspor'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Ganti nama'; + + @override + String get entryActionRestore => 'Pulihkan'; + + @override + String get entryActionRotateCCW => 'Putar berlawanan arah jarum jam'; + + @override + String get entryActionRotateCW => 'Putar searah jarum jam'; + + @override + String get entryActionFlip => 'Balik secara horisontal'; + + @override + String get entryActionPrint => 'Cetak'; + + @override + String get entryActionShare => 'Bagikan'; + + @override + String get entryActionShareImageOnly => 'Bagikan gambar saja'; + + @override + String get entryActionShareVideoOnly => 'Bagikan video saja'; + + @override + String get entryActionViewSource => 'Lihat sumber'; + + @override + String get entryActionShowGeoTiffOnMap => 'Tampilkan sebagai hamparan peta'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Ubah ke gambar tetap'; + + @override + String get entryActionViewMotionPhotoVideo => 'Buka video'; + + @override + String get entryActionEdit => 'Ubah'; + + @override + String get entryActionOpen => 'Buka dengan'; + + @override + String get entryActionSetAs => 'Tetapkan sebagai'; + + @override + String get entryActionCast => 'Siarkan'; + + @override + String get entryActionOpenMap => 'Tampilkan di peta'; + + @override + String get entryActionRotateScreen => 'Putar layar'; + + @override + String get entryActionAddFavourite => 'Tambahkan ke favorit'; + + @override + String get entryActionRemoveFavourite => 'Hapus dari favorit'; + + @override + String get videoActionCaptureFrame => 'Tangkap bingkai'; + + @override + String get videoActionMute => 'Matikan Suara'; + + @override + String get videoActionUnmute => 'Hidupkan Suara'; + + @override + String get videoActionPause => 'Hentikan'; + + @override + String get videoActionPlay => 'Mainkan'; + + @override + String get videoActionReplay10 => 'Mundurkan 10 detik'; + + @override + String get videoActionSkip10 => 'Majukan 10 detik'; + + @override + String get videoActionShowPreviousFrame => 'Tampilkan bingkai sebelumnya'; + + @override + String get videoActionShowNextFrame => 'Tampilkan bingkai berikutnya'; + + @override + String get videoActionSelectStreams => 'Pilih trek'; + + @override + String get videoActionSetSpeed => 'Kecepatan pemutaran'; + + @override + String get videoActionABRepeat => 'Ulang A-B'; + + @override + String get videoRepeatActionSetStart => 'Tetapkan awal'; + + @override + String get videoRepeatActionSetEnd => 'Tetapkan akhir'; + + @override + String get viewerActionSettings => 'Pengaturan'; + + @override + String get viewerActionLock => 'Kunci penampil'; + + @override + String get viewerActionUnlock => 'Buka kunci penampil'; + + @override + String get slideshowActionResume => 'Lanjutkan'; + + @override + String get slideshowActionShowInCollection => 'Tampilkan di Koleksi'; + + @override + String get entryInfoActionEditDate => 'Ubah tanggal & waktu'; + + @override + String get entryInfoActionEditLocation => 'Ubah lokasi'; + + @override + String get entryInfoActionEditTitleDescription => 'Ubah judul & deskripsi'; + + @override + String get entryInfoActionEditRating => 'Ubah nilai'; + + @override + String get entryInfoActionEditTags => 'Ubah label'; + + @override + String get entryInfoActionRemoveMetadata => 'Hapus metadata'; + + @override + String get entryInfoActionExportMetadata => 'Ekspor metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Hapus lokasi'; + + @override + String get editorActionTransform => 'Transformasi'; + + @override + String get editorTransformCrop => 'Potong'; + + @override + String get editorTransformRotate => 'Putar'; + + @override + String get cropAspectRatioFree => 'Bebas'; + + @override + String get cropAspectRatioOriginal => 'Asli'; + + @override + String get cropAspectRatioSquare => 'Kotak'; + + @override + String get filterAspectRatioLandscapeLabel => 'Lanskap'; + + @override + String get filterAspectRatioPortraitLabel => 'Potret'; + + @override + String get filterBinLabel => 'Tong sampah'; + + @override + String get filterFavouriteLabel => 'Favorit'; + + @override + String get filterNoDateLabel => 'Tak ada tanggal'; + + @override + String get filterNoAddressLabel => 'Tidak ada alamat'; + + @override + String get filterLocatedLabel => 'Terletak'; + + @override + String get filterNoLocationLabel => 'Lokasi yang tidak ditemukan'; + + @override + String get filterNoRatingLabel => 'Belum diberi nilai'; + + @override + String get filterTaggedLabel => 'Dilabel'; + + @override + String get filterNoTagLabel => 'Tidak dilabel'; + + @override + String get filterNoTitleLabel => 'Tak ada judul'; + + @override + String get filterOnThisDayLabel => 'Di hari ini'; + + @override + String get filterRecentlyAddedLabel => 'Baru-baru ini ditambahkan'; + + @override + String get filterRatingRejectedLabel => 'Ditolak'; + + @override + String get filterTypeAnimatedLabel => 'Teranimasi'; + + @override + String get filterTypeMotionPhotoLabel => 'Foto bergerak'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => 'Vidio 360°'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Gambar'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Cegah efek layar'; + + @override + String get accessibilityAnimationsKeep => 'Simpan efek layar'; + + @override + String get albumTierNew => 'Baru'; + + @override + String get albumTierPinned => 'Disemat'; + + @override + String get albumTierGroups => 'Kelompok'; + + @override + String get albumTierSpecial => 'Biasa'; + + @override + String get albumTierApps => 'Aplikasi'; + + @override + String get albumTierVaults => 'Brankas'; + + @override + String get albumTierDynamic => 'Dinamis'; + + @override + String get albumTierRegular => 'Lainnya'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Derajat desimal'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Penyegaran tertinggi'; + + @override + String get displayRefreshRatePreferLowest => 'Penyegaran terendah'; + + @override + String get keepScreenOnNever => 'Jangan pernah'; + + @override + String get keepScreenOnVideoPlayback => 'Saat pemutaran video'; + + @override + String get keepScreenOnViewerOnly => 'Hanya halaman penampil'; + + @override + String get keepScreenOnAlways => 'Selalu'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Tidak pernah'; + + @override + String get maxBrightnessAlways => 'Selalu'; + + @override + String get nameConflictStrategyRename => 'Ganti nama'; + + @override + String get nameConflictStrategyReplace => 'Ganti'; + + @override + String get nameConflictStrategySkip => 'Lewati'; + + @override + String get overlayHistogramNone => 'Tidak ada'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Kecerahan'; + + @override + String get subtitlePositionTop => 'Teratas'; + + @override + String get subtitlePositionBottom => 'Bawah'; + + @override + String get themeBrightnessLight => 'Terang'; + + @override + String get themeBrightnessDark => 'Gelap'; + + @override + String get themeBrightnessBlack => 'Hitam'; + + @override + String get unitSystemMetric => 'Metrik'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Pola'; + + @override + String get vaultLockTypePin => 'Pin'; + + @override + String get vaultLockTypePassword => 'Kata sandi'; + + @override + String get settingsVideoEnablePip => 'Gambar dalam gambar'; + + @override + String get videoControlsPlayOutside => 'Buka dengan pemutar lain'; + + @override + String get videoLoopModeNever => 'Jangan pernah'; + + @override + String get videoLoopModeShortOnly => 'Hanya video pendek'; + + @override + String get videoLoopModeAlways => 'Selalu'; + + @override + String get videoPlaybackSkip => 'Lewati'; + + @override + String get videoPlaybackMuted => 'Mainkan bisu'; + + @override + String get videoPlaybackWithSound => 'Mainkan dengan suara'; + + @override + String get videoResumptionModeNever => 'Tidak pernah'; + + @override + String get videoResumptionModeAlways => 'Selalu'; + + @override + String get viewerTransitionSlide => 'Menggeser'; + + @override + String get viewerTransitionParallax => 'Paralaks'; + + @override + String get viewerTransitionFade => 'Memudar'; + + @override + String get viewerTransitionZoomIn => 'Membesar'; + + @override + String get viewerTransitionNone => 'Tidak ada'; + + @override + String get wallpaperTargetHome => 'Tampilan depan'; + + @override + String get wallpaperTargetLock => 'Tampilan kunci'; + + @override + String get wallpaperTargetHomeLock => 'Tampilan depan dan kunci'; + + @override + String get widgetDisplayedItemRandom => 'Acak'; + + @override + String get widgetDisplayedItemMostRecent => 'Terkini'; + + @override + String get widgetOpenPageHome => 'Buka beranda'; + + @override + String get widgetOpenPageCollection => 'Buka koleksi'; + + @override + String get widgetOpenPageViewer => 'Buka penampil'; + + @override + String get widgetTapUpdateWidget => 'Perbarui widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Penyimpanan internal'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'kartu SD'; + + @override + String get rootDirectoryDescription => 'direktori root'; + + @override + String otherDirectoryDescription(String name) { + return 'direktori “$name”'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Silahkan pilih $directory dari “$volume” di layar berikutnya untuk memberikan akses aplikasi ini ke sana.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Aplikasi ini tidak diizinkan untuk mengubah file di $directory dari “$volume”.\n\nSilahkan pakai aplikasi Manager File atau aplikasi gallery untuk gerakkan benda ke direktori lain.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Operasi ini memerlukan $neededSize ruang kosong di “$volume” untuk menyelesaikan, tetapi hanya ada $freeSize tersisa.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Pemilih file sistem tidak ada atau dinonaktifkan. Harap aktifkan dan coba lagi.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Operasi ini tidak didukung untuk benda dari jenis berikut: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Beberapa file di folder tujuan memiliki nama yang sama.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Beberapa file memiliki nama yang sama.'; + + @override + String get addShortcutDialogLabel => 'Label pintasan'; + + @override + String get addShortcutButtonLabel => 'TAMBAH'; + + @override + String get noMatchingAppDialogMessage => 'Tidak ada aplikasi yang cocok untuk menangani ini.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Pindahkan $countString benda ke tempat sampah?', + one: 'Pindahkan benda ini ke tong sampah?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Apakah Anda yakin ingin menghapus $countString benda?', + one: 'Anda yakin ingin menghapus benda ini?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Simpan tanggal benda sebelum melanjutkan?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Atur tanggal'; + + @override + String videoResumeDialogMessage(String time) { + return 'Apakah Anda ingin melanjutkan di $time?'; + } + + @override + String get videoStartOverButtonLabel => 'ULANG DARI AWAL'; + + @override + String get videoResumeButtonLabel => 'LANJUT'; + + @override + String get setCoverDialogLatest => 'Benda terbaru'; + + @override + String get setCoverDialogAuto => 'Otomatis'; + + @override + String get setCoverDialogCustom => 'Kustom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Foto dan video yang cocok akan disembunyikan dari koleksi Anda. Anda dapat menampilkannya lagi dari pengaturan “Privasi”.\n\nApakah Anda yakin ingin menyembunyikannya?'; + + @override + String get newAlbumDialogTitle => 'Album Baru'; + + @override + String get newAlbumDialogNameLabel => 'Nama album'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album sudah ada'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Direktori sudah ada'; + + @override + String get newAlbumDialogStorageLabel => 'Penyimpanan:'; + + @override + String get newDynamicAlbumDialogTitle => 'Album Dinamis Baru'; + + @override + String get dynamicAlbumAlreadyExists => 'Album dinamis sudah ada'; + + @override + String get newGroupDialogTitle => 'Kelompok Baru'; + + @override + String get newGroupDialogNameLabel => 'Nama kelompok'; + + @override + String get groupAlreadyExists => 'Kelompok sudah ada'; + + @override + String get groupEmpty => 'Tidak ada kelompok'; + + @override + String get ungrouped => 'Tidak dikelompokkan'; + + @override + String get groupPickerTitle => 'Pilih Kelompok'; + + @override + String get groupPickerUseThisGroupButton => 'Gunakan kelompok ini'; + + @override + String get newVaultWarningDialogMessage => 'Item dalam brankas hanya tersedia untuk aplikasi ini dan bukan yang lain.\n\nJika Anda menghapus aplikasi ini, atau menghapus data aplikasi ini, Anda akan kehilangan semua item tersebut.'; + + @override + String get newVaultDialogTitle => 'Brankas Baru'; + + @override + String get configureVaultDialogTitle => 'Atur Brankas'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Kunci ketika layar mati'; + + @override + String get vaultDialogLockTypeLabel => 'Jenis penguncian'; + + @override + String get patternDialogEnter => 'Masukkan pola'; + + @override + String get patternDialogConfirm => 'Konfirmasi pola'; + + @override + String get pinDialogEnter => 'Masukkan pin'; + + @override + String get pinDialogConfirm => 'Konfirmasi pin'; + + @override + String get passwordDialogEnter => 'Masukkan kata sandi'; + + @override + String get passwordDialogConfirm => 'Konfirmasi kata sandi'; + + @override + String get authenticateToConfigureVault => 'Autentikasi untuk mengatur brankas'; + + @override + String get authenticateToUnlockVault => 'Autentikasi untuk membuka brankas'; + + @override + String get vaultBinUsageDialogMessage => 'Beberapa brankas menggunakan tong sampah.'; + + @override + String get renameAlbumDialogLabel => 'Nama baru'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Direktori sudah ada'; + + @override + String get renameEntrySetPageTitle => 'Ganti nama'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Pola penamaan'; + + @override + String get renameEntrySetPageInsertTooltip => 'Masukkan bidang'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Pratinjau'; + + @override + String get renameProcessorCounter => 'Penghitungan'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Nama'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Hapus album ini dan $countString item yang ada di dalam?', + one: 'Hapus album ini dan item yang ada di dalam?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Hapus album ini dan $countString item yang ada di dalam?', + one: 'Hapus album ini dan item yang ada di dalam?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Lebar'; + + @override + String get exportEntryDialogHeight => 'Tinggi'; + + @override + String get exportEntryDialogQuality => 'Kualitas'; + + @override + String get exportEntryDialogWriteMetadata => 'Tulis metadata'; + + @override + String get renameEntryDialogLabel => 'Nama baru'; + + @override + String get editEntryDialogCopyFromItem => 'Salin dari benda lain'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Bidang untuk dimodifikasikan'; + + @override + String get editEntryDateDialogTitle => 'Tanggal & Waktu'; + + @override + String get editEntryDateDialogSetCustom => 'Atur tanggal khusus'; + + @override + String get editEntryDateDialogCopyField => 'Salin dari tanggal lain'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Ekstrak dari judul'; + + @override + String get editEntryDateDialogShift => 'Geser'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Tanggal modifikasi file'; + + @override + String get durationDialogHours => 'Jam'; + + @override + String get durationDialogMinutes => 'Menit'; + + @override + String get durationDialogSeconds => 'Detik'; + + @override + String get editEntryLocationDialogTitle => 'Lokasi'; + + @override + String get editEntryLocationDialogSetCustom => 'Terapkan lokasi kustom'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Pilih di peta'; + + @override + String get editEntryLocationDialogImportGpx => 'Impor GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Garis lintang'; + + @override + String get editEntryLocationDialogLongitude => 'Garis bujur'; + + @override + String get editEntryLocationDialogTimeShift => 'Pergeseran waktu'; + + @override + String get locationPickerUseThisLocationButton => 'Gunakan lokasi ini'; + + @override + String get editEntryRatingDialogTitle => 'Nilai'; + + @override + String get removeEntryMetadataDialogTitle => 'Penghapusan Metadata'; + + @override + String get removeEntryMetadataDialogAll => 'Semua'; + + @override + String get removeEntryMetadataDialogMore => 'Lebih Banyak'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP diperlukan untuk memutar video di dalam Foto bergerak.\n\nAnda yakin ingin menghapusnya?'; + + @override + String get videoSpeedDialogLabel => 'Kecepatan pemutaran'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subjudul'; + + @override + String get videoStreamSelectionDialogOff => 'Mati'; + + @override + String get videoStreamSelectionDialogTrack => 'Trek'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Tidak ada Trek yang lain.'; + + @override + String get genericSuccessFeedback => 'Selesai!'; + + @override + String get genericFailureFeedback => 'Gagal'; + + @override + String get genericDangerWarningDialogMessage => 'Apakah kamu yakin?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Coba lagi dengan item yang lebih sedikit.'; + + @override + String get menuActionConfigureView => 'Tata letak'; + + @override + String get menuActionSelect => 'Pilih'; + + @override + String get menuActionSelectAll => 'Pilih semua'; + + @override + String get menuActionSelectNone => 'Pilih tidak ada'; + + @override + String get menuActionMap => 'Peta'; + + @override + String get menuActionSlideshow => 'Tampilan slide'; + + @override + String get menuActionStats => 'Statistik'; + + @override + String get viewDialogSortSectionTitle => 'Sortir'; + + @override + String get viewDialogGroupSectionTitle => 'Bagian'; + + @override + String get viewDialogLayoutSectionTitle => 'Tata letak'; + + @override + String get viewDialogReverseSortOrder => 'Urutan pengurutan terbalik'; + + @override + String get tileLayoutMosaic => 'Mosaik'; + + @override + String get tileLayoutGrid => 'Grid'; + + @override + String get tileLayoutList => 'Daftar'; + + @override + String get castDialogTitle => 'Siarkan Perangkat'; + + @override + String get coverDialogTabCover => 'Kover'; + + @override + String get coverDialogTabApp => 'Aplikasi'; + + @override + String get coverDialogTabColor => 'Warna'; + + @override + String get appPickDialogTitle => 'Pilih Aplikasi'; + + @override + String get appPickDialogNone => 'Tidak ada'; + + @override + String get aboutPageTitle => 'Tentang'; + + @override + String get aboutLinkLicense => 'Lisensi'; + + @override + String get aboutLinkPolicy => 'Aturan Privasi'; + + @override + String get aboutBugSectionTitle => 'Lapor Bug'; + + @override + String get aboutBugSaveLogInstruction => 'Simpan log aplikasi ke file'; + + @override + String get aboutBugCopyInfoInstruction => 'Salin informasi sistem'; + + @override + String get aboutBugCopyInfoButton => 'Salin'; + + @override + String get aboutBugReportInstruction => 'Laporkan ke GitHub dengan log dan informasi sistem'; + + @override + String get aboutBugReportButton => 'Rapor'; + + @override + String get aboutDataUsageSectionTitle => 'Penggunaan Data'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Tembolok'; + + @override + String get aboutDataUsageDatabase => 'Basis Data'; + + @override + String get aboutDataUsageMisc => 'Lainnya'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'Eksternal'; + + @override + String get aboutDataUsageClearCache => 'Bersihkan cache'; + + @override + String get aboutCreditsSectionTitle => 'Kredit'; + + @override + String get aboutCreditsWorldAtlas1 => 'Aplikasi ini menggunakan file TopoJSON dari'; + + @override + String get aboutCreditsWorldAtlas2 => 'dibawah Lisensi ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'Penerjemah'; + + @override + String get aboutLicensesSectionTitle => 'Lisensi Sumber Terbuka'; + + @override + String get aboutLicensesBanner => 'Aplikasi ini menggunakan paket dan perpustakaan sumber terbuka berikut.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Perpustakaan Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Plugin Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Paket Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Paket Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Tampilkan Semua Lisensi'; + + @override + String get policyPageTitle => 'Aturan Privasi'; + + @override + String get collectionPageTitle => 'Koleksi'; + + @override + String get collectionPickPageTitle => 'Pilih'; + + @override + String get collectionSelectPageTitle => 'Pilih benda'; + + @override + String get collectionActionShowTitleSearch => 'Tampilkan filter judul'; + + @override + String get collectionActionHideTitleSearch => 'Sembunyikan filter judul'; + + @override + String get collectionActionAddDynamicAlbum => 'Tambahkan album dinamis'; + + @override + String get collectionActionAddShortcut => 'Tambahkan pintasan'; + + @override + String get collectionActionSetHome => 'Tetapkan sebagai beranda'; + + @override + String get collectionActionEmptyBin => 'Kosongkan tong sampah'; + + @override + String get collectionActionCopy => 'Salin ke album'; + + @override + String get collectionActionMove => 'Pindah ke album'; + + @override + String get collectionActionRescan => 'Pindai ulang'; + + @override + String get collectionActionEdit => 'Ubah'; + + @override + String get collectionSearchTitlesHintText => 'Cari judul'; + + @override + String get collectionGroupAlbum => 'Lewat album'; + + @override + String get collectionGroupMonth => 'Lewat bulan'; + + @override + String get collectionGroupDay => 'Lewat hari'; + + @override + String get sectionNone => 'Tidak ada bagian'; + + @override + String get sectionUnknown => 'Tidak dikenal'; + + @override + String get dateToday => 'Hari ini'; + + @override + String get dateYesterday => 'Kemaren'; + + @override + String get dateThisMonth => 'Bulan ini'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Gagal untuk menghapus $countString benda', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Gagal untuk menyalin $countString benda', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Gagal untuk menggerakkan $countString benda', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Gagal untuk menggantikan nama $countString benda', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Gagal untuk mengubah $countString benda', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Gagal untuk mengekspor $countString halaman', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Menyalin $countString benda', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString benda terpindah', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Tergantikan nama untuk $countString benda', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Mengubah $countString benda', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Tidak ada favorit'; + + @override + String get collectionEmptyVideos => 'Tidak ada video'; + + @override + String get collectionEmptyImages => 'Tidak ada gambar'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Berikan akses'; + + @override + String get collectionSelectSectionTooltip => 'Pilih bagian'; + + @override + String get collectionDeselectSectionTooltip => 'Batalkan pilihan bagian'; + + @override + String get drawerAboutButton => 'Tentang'; + + @override + String get drawerSettingsButton => 'Pengaturan'; + + @override + String get drawerCollectionAll => 'Semua koleksi'; + + @override + String get drawerCollectionFavourites => 'Favorit'; + + @override + String get drawerCollectionImages => 'Gambar'; + + @override + String get drawerCollectionVideos => 'Video'; + + @override + String get drawerCollectionAnimated => 'Teranimasi'; + + @override + String get drawerCollectionMotionPhotos => 'Foto bergerak'; + + @override + String get drawerCollectionPanoramas => 'Panorama'; + + @override + String get drawerCollectionRaws => 'Foto Raw'; + + @override + String get drawerCollectionSphericalVideos => 'Video 360°'; + + @override + String get drawerAlbumPage => 'Album'; + + @override + String get drawerCountryPage => 'Negara'; + + @override + String get drawerPlacePage => 'Tempat'; + + @override + String get drawerTagPage => 'Label'; + + @override + String get sortByDate => 'Lewat tanggal'; + + @override + String get sortByName => 'Lewat nama'; + + @override + String get sortByItemCount => 'Lewat jumlah benda'; + + @override + String get sortBySize => 'Lewat ukuran'; + + @override + String get sortByAlbumFileName => 'Berdasarkan nama album & judul item'; + + @override + String get sortByRating => 'Lewat nilai'; + + @override + String get sortByDuration => 'Berdasarkan durasi'; + + @override + String get sortByPath => 'Melalui lokasi'; + + @override + String get sortOrderNewestFirst => 'Terbaru pertama'; + + @override + String get sortOrderOldestFirst => 'Tertua pertama'; + + @override + String get sortOrderAtoZ => 'A ke Z'; + + @override + String get sortOrderZtoA => 'Z ke A'; + + @override + String get sortOrderHighestFirst => 'Tertinggi pertama'; + + @override + String get sortOrderLowestFirst => 'Terendah pertama'; + + @override + String get sortOrderLargestFirst => 'Terbesar pertama'; + + @override + String get sortOrderSmallestFirst => 'Terkecil pertama'; + + @override + String get sortOrderShortestFirst => 'Yang terpendek dulu'; + + @override + String get sortOrderLongestFirst => 'Yang terpanjang dulu'; + + @override + String get albumGroupTier => 'Lewat tingkat'; + + @override + String get albumGroupType => 'Berdasarkan tipe'; + + @override + String get albumGroupVolume => 'Lewat volume penyimpanan'; + + @override + String get albumMimeTypeMixed => 'Tercampur'; + + @override + String get albumPickPageTitleCopy => 'Salin ke Album'; + + @override + String get albumPickPageTitleExport => 'Ekspor ke Album'; + + @override + String get albumPickPageTitleMove => 'Pindah ke Album'; + + @override + String get albumPickPageTitlePick => 'Pilih Album'; + + @override + String get albumCamera => 'Kamera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Tangkapan layar'; + + @override + String get albumScreenRecordings => 'Rekaman layar'; + + @override + String get albumVideoCaptures => 'Tangkapan Video'; + + @override + String get albumPageTitle => 'Album'; + + @override + String get albumEmpty => 'Tidak ada album'; + + @override + String get createAlbumButtonLabel => 'BUAT'; + + @override + String get newFilterBanner => 'baru'; + + @override + String get countryPageTitle => 'Negara'; + + @override + String get countryEmpty => 'Tidak ada negara'; + + @override + String get statePageTitle => 'Wilayah'; + + @override + String get stateEmpty => 'Tidak ada wilayah'; + + @override + String get placePageTitle => 'Tempat'; + + @override + String get placeEmpty => 'Tidak ada tempat'; + + @override + String get tagPageTitle => 'Label'; + + @override + String get tagEmpty => 'Tidak ada label'; + + @override + String get tagPickPageTitle => 'Pilih Tagar'; + + @override + String get binPageTitle => 'Tong Sampah'; + + @override + String get explorerPageTitle => 'Penjelajah'; + + @override + String get explorerActionSelectStorageVolume => 'Pilih penyimpanan'; + + @override + String get selectStorageVolumeDialogTitle => 'Pilih Penyimpanan'; + + @override + String get searchCollectionFieldHint => 'Cari koleksi'; + + @override + String get searchRecentSectionTitle => 'Terkini'; + + @override + String get searchDateSectionTitle => 'Tanggal'; + + @override + String get searchFormatSectionTitle => 'Format'; + + @override + String get searchAlbumsSectionTitle => 'Album'; + + @override + String get searchCountriesSectionTitle => 'Negara'; + + @override + String get searchStatesSectionTitle => 'Wilayah'; + + @override + String get searchPlacesSectionTitle => 'Tempat'; + + @override + String get searchTagsSectionTitle => 'Label'; + + @override + String get searchRatingSectionTitle => 'Nilai'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Pengaturan'; + + @override + String get settingsSystemDefault => 'Sistem'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'Nonaktif'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ta za'; + + @override + String get settingsModificationWarningDialogMessage => 'Pengaturan lain akan diubah.'; + + @override + String get settingsSearchFieldLabel => 'Cari peraturan'; + + @override + String get settingsSearchEmpty => 'Tidak ada peraturan yang cocok'; + + @override + String get settingsActionExport => 'Ekspor'; + + @override + String get settingsActionExportDialogTitle => 'Ekspor'; + + @override + String get settingsActionImport => 'Impor'; + + @override + String get settingsActionImportDialogTitle => 'Impor'; + + @override + String get appExportCovers => 'Sampul'; + + @override + String get appExportDynamicAlbums => 'Album dinamis'; + + @override + String get appExportFavourites => 'Favorit'; + + @override + String get appExportSettings => 'Pengaturan'; + + @override + String get settingsNavigationSectionTitle => 'Navigasi'; + + @override + String get settingsHomeTile => 'Beranda'; + + @override + String get settingsHomeDialogTitle => 'Beranda'; + + @override + String get setHomeCustom => 'Kustom'; + + @override + String get settingsKeepScreenOnTile => 'Biarkan layarnya menyala'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Biarkan Layarnya Menyala'; + + @override + String get settingsDoubleBackExit => 'Ketuk “kembali” dua kali untuk keluar'; + + @override + String get settingsConfirmationTile => 'Dialog konfirmasi'; + + @override + String get settingsConfirmationDialogTitle => 'Dialog Konfirmasi'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Tanya sebelum menghapus benda selamanya'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Tanya sebelum memindahkan benda ke tong sampah'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Tanyakan sebelum memindahkan barang tanpa metadata tanggal'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Tampilkan pesan setelah menggerakkan barang ke tong sampah'; + + @override + String get settingsConfirmationVaultDataLoss => 'Tampilkan peringatan kehilangan data brankas'; + + @override + String get settingsNavigationDrawerTile => 'Menu navigasi'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Menu Navigasi'; + + @override + String get settingsNavigationDrawerBanner => 'Sentuh dan tahan untuk memindahkan dan menyusun ulang benda menu.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Tipe'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Album'; + + @override + String get settingsNavigationDrawerTabPages => 'Halaman'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Tambahkan album'; + + @override + String get settingsNavigationBottomActionsTile => 'Navigasi bawah'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Navigasi Bawah'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Sentuh dan tahan untuk memindahkan tombol dan pilih tindakan apa saja yang ditampilkan dalam bilah navigasi bawah.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnail'; + + @override + String get settingsThumbnailOverlayTile => 'Hamparan'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Hamparan'; + + @override + String get settingsThumbnailShowHdrIcon => 'Tampilkan ikon HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Tampilkan ikon favorit'; + + @override + String get settingsThumbnailShowTagIcon => 'Tampilkan ikon label'; + + @override + String get settingsThumbnailShowLocationIcon => 'Tampilkan ikon lokasi'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Tampilkan ikon Foto bergerak'; + + @override + String get settingsThumbnailShowRating => 'Tampilkan nilai'; + + @override + String get settingsThumbnailShowRawIcon => 'Tampilkan ikon raw'; + + @override + String get settingsThumbnailShowVideoDuration => 'Tampilkan durasi video'; + + @override + String get settingsCollectionQuickActionsTile => 'Aksi cepat'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Aksi Cepat'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Menjelajah'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Memilih'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Sentuh dan tahan untuk memindahkan tombol dan memilih tindakan yang ditampilkan saat menelusuri benda.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Sentuh dan tahan untuk memindahkan tombol dan memilih tindakan yang ditampilkan saat memilih benda.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Pola semburan'; + + @override + String get settingsCollectionBurstPatternsNone => 'Tidak ada'; + + @override + String get settingsViewerSectionTitle => 'Penampil'; + + @override + String get settingsViewerGestureSideTapNext => 'Ketuk tepi layar untuk menampilkan benda sebelumnya/berikutnya'; + + @override + String get settingsViewerUseCutout => 'Gunakan area potongan'; + + @override + String get settingsViewerMaximumBrightness => 'Kecerahan maksimum'; + + @override + String get settingsMotionPhotoAutoPlay => 'Putar foto bergerak otomatis'; + + @override + String get settingsImageBackground => 'Latar belakang gambar'; + + @override + String get settingsViewerQuickActionsTile => 'Aksi cepat'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Aksi Cepat'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Sentuh dan tahan untuk memindahkan tombol dan memilih tindakan yang ditampilkan di penampil.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Tombol yang Ditampilkan'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Tombol yang tersedia'; + + @override + String get settingsViewerQuickActionEmpty => 'Tidak ada tombol'; + + @override + String get settingsViewerOverlayTile => 'Hamparan'; + + @override + String get settingsViewerOverlayPageTitle => 'Hamparan'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Tampilkan saat pembukaan'; + + @override + String get settingsViewerShowHistogram => 'Tampilkan histogram'; + + @override + String get settingsViewerShowMinimap => 'Tampilkan minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Tampilkan informasi'; + + @override + String get settingsViewerShowInformationSubtitle => 'Tampilkan judul, tanggal, lokasi, dll.'; + + @override + String get settingsViewerShowRatingTags => 'Tampilkan peringkat & tag'; + + @override + String get settingsViewerShowShootingDetails => 'Tampilkan detail pemotretan'; + + @override + String get settingsViewerShowDescription => 'Tampilkan deskripsi'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Tampilkan thumbnail'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Efek Kabur'; + + @override + String get settingsViewerSlideshowTile => 'Tampilan slide'; + + @override + String get settingsViewerSlideshowPageTitle => 'Tampilan Slide'; + + @override + String get settingsSlideshowRepeat => 'Ulangi'; + + @override + String get settingsSlideshowShuffle => 'Acak'; + + @override + String get settingsSlideshowFillScreen => 'Isi layar'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Efek zoom bergerak'; + + @override + String get settingsSlideshowTransitionTile => 'Transisi'; + + @override + String get settingsSlideshowIntervalTile => 'Jarak waktu'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Putaran ulang video'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Putaran Ulang Video'; + + @override + String get settingsVideoPageTitle => 'Pengaturan Video'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Tampilkan video'; + + @override + String get settingsVideoPlaybackTile => 'Pemutaran'; + + @override + String get settingsVideoPlaybackPageTitle => 'Pemutaran'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Akselerasi perangkat keras'; + + @override + String get settingsVideoAutoPlay => 'Putar otomatis'; + + @override + String get settingsVideoLoopModeTile => 'Putar ulang'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Putar Ulang'; + + @override + String get settingsVideoResumptionModeTile => 'Lanjutkan pemutaran'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Lanjutkan Pemutaran'; + + @override + String get settingsVideoBackgroundMode => 'Mode latar belakang'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Mode Latar Belakang'; + + @override + String get settingsVideoControlsTile => 'Kontrol'; + + @override + String get settingsVideoControlsPageTitle => 'Kontrol'; + + @override + String get settingsVideoButtonsTile => 'Tombol'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Ketuk dua kali untuk mainkan/hentikan'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Ketuk dua kali di tepi layar untuk mencari kebelakang/kedepan'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Usap ke atas atau bawah untuk mengatur kecerahan/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subjudul'; + + @override + String get settingsSubtitleThemePageTitle => 'Subjudul'; + + @override + String get settingsSubtitleThemeSample => 'Ini adalah sampel.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Perataan teks'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Perataan Teks'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Posisi teks'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Posisi Teks'; + + @override + String get settingsSubtitleThemeTextSize => 'Ukuran teks'; + + @override + String get settingsSubtitleThemeShowOutline => 'Tampilkan garis besar dan bayangan'; + + @override + String get settingsSubtitleThemeTextColor => 'Warna teks'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Opasitas teks'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Warna latar belakang'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Opasitas latar belakang'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Kiri'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Tengah'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Kanan'; + + @override + String get settingsPrivacySectionTitle => 'Privasi'; + + @override + String get settingsAllowInstalledAppAccess => 'Izinkan akses ke inventori aplikasi'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Digunakan untuk meningkatkan tampilan album'; + + @override + String get settingsAllowErrorReporting => 'Izinkan pelaporan kesalahan secara anonim'; + + @override + String get settingsSaveSearchHistory => 'Simpan riwayat pencarian'; + + @override + String get settingsEnableBin => 'Gunakan tong sampah'; + + @override + String get settingsEnableBinSubtitle => 'Simpan benda yang dihapus selama 30 hari'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Item dalam tong sampah akan hilang selamanya.'; + + @override + String get settingsAllowMediaManagement => 'Izinkan pengelolaan media'; + + @override + String get settingsHiddenItemsTile => 'Benda tersembunyi'; + + @override + String get settingsHiddenItemsPageTitle => 'Benda Tersembunyi'; + + @override + String get settingsHiddenFiltersBanner => 'Foto dan video filter tersembunyi yang cocok tidak akan muncul di koleksi Anda.'; + + @override + String get settingsHiddenFiltersEmpty => 'Tidak ada filter tersembunyi'; + + @override + String get settingsStorageAccessTile => 'Akses penyimpanan'; + + @override + String get settingsStorageAccessPageTitle => 'Akses Penyimpanan'; + + @override + String get settingsStorageAccessBanner => 'Beberapa direktori memerlukan pemberian akses eksplisit untuk memodifikasi file di dalamnya. Anda dapat meninjau direktori yang anda beri akses sebelumnya di sini.'; + + @override + String get settingsStorageAccessEmpty => 'Tidak ada akses'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Tarik kembali'; + + @override + String get settingsAccessibilitySectionTitle => 'Aksesibilitas'; + + @override + String get settingsRemoveAnimationsTile => 'Hapus animasi'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Hapus Animasi'; + + @override + String get settingsTimeToTakeActionTile => 'Waktu untuk mengambil tindakan'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Tampilkan alternatif gestur multisentuh'; + + @override + String get settingsDisplaySectionTitle => 'Tampilan'; + + @override + String get settingsThemeBrightnessTile => 'Tema'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Tema'; + + @override + String get settingsThemeColorHighlights => 'Highlight warna'; + + @override + String get settingsThemeEnableDynamicColor => 'Warna dinamis'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Tingkat penyegaran tampilan'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Tingkat Penyegaran'; + + @override + String get settingsDisplayUseTvInterface => 'Antarmuka Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Bahasa & Format'; + + @override + String get settingsLanguageTile => 'Bahasa'; + + @override + String get settingsLanguagePageTitle => 'Bahasa'; + + @override + String get settingsCoordinateFormatTile => 'Format koordinat'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Format Koordinat'; + + @override + String get settingsUnitSystemTile => 'Unit'; + + @override + String get settingsUnitSystemDialogTitle => 'Unit'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Paksa angka Arab'; + + @override + String get settingsScreenSaverPageTitle => 'Screensaver'; + + @override + String get settingsWidgetPageTitle => 'Bingkai Foto'; + + @override + String get settingsWidgetShowOutline => 'Garis luar'; + + @override + String get settingsWidgetOpenPage => 'Saat mengetuk di sebuah widget'; + + @override + String get settingsWidgetDisplayedItem => 'Barang yang ditampilkan'; + + @override + String get settingsCollectionTile => 'Koleksi'; + + @override + String get statsPageTitle => 'Statistik'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString benda dengan lokasi', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Negara Teratas'; + + @override + String get statsTopStatesSectionTitle => 'Wilayah Teratas'; + + @override + String get statsTopPlacesSectionTitle => 'Tempat Teratas'; + + @override + String get statsTopTagsSectionTitle => 'Label Teratas'; + + @override + String get statsTopAlbumsSectionTitle => 'Album Teratas'; + + @override + String get viewerOpenPanoramaButtonLabel => 'BUKA PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'TETAPKAN SEBAGAI WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Ups!'; + + @override + String get viewerErrorDoesNotExist => 'File tidak ada lagi.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Kembali ke penampil'; + + @override + String get viewerInfoUnknown => 'tidak dikenal'; + + @override + String get viewerInfoLabelDescription => 'Deskripsi'; + + @override + String get viewerInfoLabelTitle => 'Judul'; + + @override + String get viewerInfoLabelDate => 'Tanggal'; + + @override + String get viewerInfoLabelResolution => 'Resolusi'; + + @override + String get viewerInfoLabelSize => 'Ukuran'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Jalan'; + + @override + String get viewerInfoLabelDuration => 'Durasi'; + + @override + String get viewerInfoLabelOwner => 'Dimiliki oleh'; + + @override + String get viewerInfoLabelCoordinates => 'Koordinat'; + + @override + String get viewerInfoLabelAddress => 'Alamat'; + + @override + String get mapStyleDialogTitle => 'Gaya Peta'; + + @override + String get mapStyleDialogAddStyle => 'Tambahkan gaya'; + + @override + String get mapStyleTooltip => 'Pilih gaya peta'; + + @override + String get mapStyleEditorDialogName => 'Nama'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomain'; + + @override + String get mapStyleEditorDialogUserAgent => 'Agen Pengguna'; + + @override + String get mapZoomInTooltip => 'Perbesar'; + + @override + String get mapZoomOutTooltip => 'Perkecil'; + + @override + String get mapPointNorthUpTooltip => 'Arahkan ke utara ke atas'; + + @override + String get mapAttributionOsmData => 'Data peta © [OpenStreetMap](https://www.openstreetmap.org/copyright) kontributor'; + + @override + String get mapAttributionOsmLiberty => 'Ubin oleh [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Disediakan oleh [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Ubin oleh [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tile oleh [HOT](https://www.hotosm.org/) • Diselenggarakan oleh [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tile oleh [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Lihat di halaman Peta'; + + @override + String get mapEmptyRegion => 'Tidak ada gambar di wilayah ini'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Gagal mengekstrak data yang disematkan'; + + @override + String get viewerInfoOpenLinkText => 'Buka'; + + @override + String get viewerInfoViewXmlLinkText => 'Tampilkan XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Cari metadata'; + + @override + String get viewerInfoSearchEmpty => 'Tidak ada kata kunci yang cocok'; + + @override + String get viewerInfoSearchSuggestionDate => 'Tanggal & waktu'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Deskripsi'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensi'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolusi'; + + @override + String get viewerInfoSearchSuggestionRights => 'Hak'; + + @override + String get wallpaperUseScrollEffect => 'Gunakan efek scroll di layar beranda'; + + @override + String get tagEditorPageTitle => 'Ubah Label'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Label baru'; + + @override + String get tagEditorPageAddTagTooltip => 'Tambah label'; + + @override + String get tagEditorSectionRecent => 'Terkini'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholder'; + + @override + String get tagEditorDiscardDialogMessage => 'Apakah Anda ingin membuang perubahan?'; + + @override + String get tagPlaceholderCountry => 'Negara'; + + @override + String get tagPlaceholderState => 'Wilayah'; + + @override + String get tagPlaceholderPlace => 'Tempat'; + + @override + String get panoramaEnableSensorControl => 'Aktifkan kontrol sensor'; + + @override + String get panoramaDisableSensorControl => 'Nonaktifkan kontrol sensor'; + + @override + String get sourceViewerPageTitle => 'Sumber'; +} diff --git a/lib/l10ngen/app_localizations_is.dart b/lib/l10ngen/app_localizations_is.dart new file mode 100644 index 0000000..3c0393f --- /dev/null +++ b/lib/l10ngen/app_localizations_is.dart @@ -0,0 +1,2374 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Icelandic (`is`). +class AppLocalizationsIs extends AppLocalizations { + AppLocalizationsIs([String locale = 'is']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Velkomin í Aves'; + + @override + String get welcomeOptional => 'Valfrjálst'; + + @override + String get welcomeTermsToggle => 'Ég samþykki skilmálana og kvaðir'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count atriðum', + one: '$count atriði', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count dálkar', + one: '$count dálkur', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString sekúndur', + one: '$countString sekúnda', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString mínútur', + one: '$countString mínúta', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString dagar', + one: '$countString dagur', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'VIRKJA'; + + @override + String get createButtonLabel => 'BÚA TIL'; + + @override + String get deleteButtonLabel => 'EYÐA'; + + @override + String get nextButtonLabel => 'NÆSTA'; + + @override + String get showButtonLabel => 'BIRTA'; + + @override + String get hideButtonLabel => 'FELA'; + + @override + String get continueButtonLabel => 'HALDA ÁFRAM'; + + @override + String get saveCopyButtonLabel => 'VISTA AFRIT'; + + @override + String get applyTooltip => 'Virkja'; + + @override + String get cancelTooltip => 'Hætta við'; + + @override + String get changeTooltip => 'Breyta'; + + @override + String get clearTooltip => 'Hreinsa'; + + @override + String get previousTooltip => 'Fyrra'; + + @override + String get nextTooltip => 'Næsta'; + + @override + String get showTooltip => 'Birta'; + + @override + String get hideTooltip => 'Fela'; + + @override + String get actionRemove => 'Fjarlægja'; + + @override + String get resetTooltip => 'Endurstilla'; + + @override + String get saveTooltip => 'Vista'; + + @override + String get stopTooltip => 'Stöðva'; + + @override + String get pickTooltip => 'Veldu'; + + @override + String get doubleBackExitMessage => 'Ýttu aftur á „Til baka“ til að hætta.'; + + @override + String get doNotAskAgain => 'Ekki spyrja aftur'; + + @override + String get sourceStateLoading => 'Innhleðsla'; + + @override + String get sourceStateCataloguing => 'Gerð efnisyfirlits'; + + @override + String get sourceStateLocatingCountries => 'Staðset lönd'; + + @override + String get sourceStateLocatingPlaces => 'Staðset staði'; + + @override + String get chipActionDelete => 'Eyða'; + + @override + String get chipActionRemove => 'Fjarlægja'; + + @override + String get chipActionShowCollection => 'Sýna í safni'; + + @override + String get chipActionGoToAlbumPage => 'Birta í Albúm'; + + @override + String get chipActionGoToCountryPage => 'Birta í Lönd'; + + @override + String get chipActionGoToPlacePage => 'Birta í Staðir'; + + @override + String get chipActionGoToTagPage => 'Birta í Merki'; + + @override + String get chipActionGoToExplorerPage => 'Sýna í skráastjóra'; + + @override + String get chipActionDecompose => 'Skipta upp'; + + @override + String get chipActionFilterOut => 'Sía út'; + + @override + String get chipActionFilterIn => 'Sía inn'; + + @override + String get chipActionHide => 'Fela'; + + @override + String get chipActionLock => 'Læsa'; + + @override + String get chipActionPin => 'Festa efst'; + + @override + String get chipActionUnpin => 'Losa af efri hluta'; + + @override + String get chipActionGroup => 'Breyta hópun'; + + @override + String get chipActionRename => 'Endurnefna'; + + @override + String get chipActionSetCover => 'Setja umslag'; + + @override + String get chipActionShowCountryStates => 'Birta héruð'; + + @override + String get chipActionCreateGroup => 'Útbúa hóp'; + + @override + String get chipActionCreateAlbum => 'Búa til albúm'; + + @override + String get chipActionCreateVault => 'Búa til öryggisgeymslu'; + + @override + String get chipActionConfigureVault => 'Stilla öryggisgeymslu'; + + @override + String get entryActionCopyToClipboard => 'Afrita á klippispjald'; + + @override + String get entryActionDelete => 'Eyða'; + + @override + String get entryActionConvert => 'Umbreyta'; + + @override + String get entryActionExport => 'Flytja út'; + + @override + String get entryActionInfo => 'Upplýsingar'; + + @override + String get entryActionRename => 'Endurnefna'; + + @override + String get entryActionRestore => 'Endurheimta'; + + @override + String get entryActionRotateCCW => 'Snúa rangsælis'; + + @override + String get entryActionRotateCW => 'Snúa réttsælis'; + + @override + String get entryActionFlip => 'Fletta lárétt'; + + @override + String get entryActionPrint => 'Prenta'; + + @override + String get entryActionShare => 'Deila'; + + @override + String get entryActionShareImageOnly => 'Deila einungis mynd'; + + @override + String get entryActionShareVideoOnly => 'Deila einungis myndskeiði'; + + @override + String get entryActionViewSource => 'Skoða uppruna'; + + @override + String get entryActionShowGeoTiffOnMap => 'Birta sem yfirlag á korti'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Umbreyta í kyrrmynd'; + + @override + String get entryActionViewMotionPhotoVideo => 'Opna myndskeið'; + + @override + String get entryActionEdit => 'Breyta'; + + @override + String get entryActionOpen => 'Opna með'; + + @override + String get entryActionSetAs => 'Setja sem'; + + @override + String get entryActionCast => 'Leikarar'; + + @override + String get entryActionOpenMap => 'Birta í landakortaforriti'; + + @override + String get entryActionRotateScreen => 'Snúa skjánum'; + + @override + String get entryActionAddFavourite => 'Bæta í eftirlæti'; + + @override + String get entryActionRemoveFavourite => 'Fjarlægja úr eftirlætum'; + + @override + String get videoActionCaptureFrame => 'Taka ramma'; + + @override + String get videoActionMute => 'Hljóð af'; + + @override + String get videoActionUnmute => 'Hljóð á'; + + @override + String get videoActionPause => 'Í bið'; + + @override + String get videoActionPlay => 'Afspilun'; + + @override + String get videoActionReplay10 => 'Fara afturábak um 10 sekúndur'; + + @override + String get videoActionSkip10 => 'Fara áfram um 10 sekúndur'; + + @override + String get videoActionShowPreviousFrame => 'Sýna fyrri ramma'; + + @override + String get videoActionShowNextFrame => 'Sýna næsta ramma'; + + @override + String get videoActionSelectStreams => 'Veldu ferla'; + + @override + String get videoActionSetSpeed => 'Afspilunarhraði'; + + @override + String get videoActionABRepeat => 'Endurtekning A-B'; + + @override + String get videoRepeatActionSetStart => 'Stilla byrjun'; + + @override + String get videoRepeatActionSetEnd => 'Stilla endi'; + + @override + String get viewerActionSettings => 'Stillingar'; + + @override + String get viewerActionLock => 'Læsa skoðara'; + + @override + String get viewerActionUnlock => 'Aflæsa skoðara'; + + @override + String get slideshowActionResume => 'Halda áfram'; + + @override + String get slideshowActionShowInCollection => 'Sýna í safni'; + + @override + String get entryInfoActionEditDate => 'Breyta dagsetningu og tíma'; + + @override + String get entryInfoActionEditLocation => 'Breyta staðsetningu'; + + @override + String get entryInfoActionEditTitleDescription => 'Breyta titli og lýsingu'; + + @override + String get entryInfoActionEditRating => 'Breyta einkunn'; + + @override + String get entryInfoActionEditTags => 'Breyta merkjum'; + + @override + String get entryInfoActionRemoveMetadata => 'Fjarlægja lýsigögn'; + + @override + String get entryInfoActionExportMetadata => 'Flytja út lýsigögn'; + + @override + String get entryInfoActionRemoveLocation => 'Fjarlægja staðsetningu'; + + @override + String get editorActionTransform => 'Ummyndun'; + + @override + String get editorTransformCrop => 'Utansníða'; + + @override + String get editorTransformRotate => 'Snúa'; + + @override + String get cropAspectRatioFree => 'Frjálst'; + + @override + String get cropAspectRatioOriginal => 'Upprunaleg'; + + @override + String get cropAspectRatioSquare => 'Ferningur'; + + @override + String get filterAspectRatioLandscapeLabel => 'Lárétt'; + + @override + String get filterAspectRatioPortraitLabel => 'Lóðrétt'; + + @override + String get filterBinLabel => 'Ruslmappa'; + + @override + String get filterFavouriteLabel => 'Eftirlæti'; + + @override + String get filterNoDateLabel => 'Ódagsett'; + + @override + String get filterNoAddressLabel => 'Ekkert heimilisfang'; + + @override + String get filterLocatedLabel => 'Staðsett'; + + @override + String get filterNoLocationLabel => 'Óstaðsett'; + + @override + String get filterNoRatingLabel => 'Án einkunnar'; + + @override + String get filterTaggedLabel => 'Merkt'; + + @override + String get filterNoTagLabel => 'Ómerkt'; + + @override + String get filterNoTitleLabel => 'Án titils'; + + @override + String get filterOnThisDayLabel => 'Á þessum degi'; + + @override + String get filterRecentlyAddedLabel => 'Nýlega bætt við'; + + @override + String get filterRatingRejectedLabel => 'Hafnað'; + + @override + String get filterTypeAnimatedLabel => 'Með hreyfingu'; + + @override + String get filterTypeMotionPhotoLabel => 'Hreyfiljósmynd'; + + @override + String get filterTypePanoramaLabel => 'Víðmynd'; + + @override + String get filterTypeRawLabel => 'RAW'; + + @override + String get filterTypeSphericalVideoLabel => '360° myndskeið'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Mynd'; + + @override + String get filterMimeVideoLabel => 'Myndskeið'; + + @override + String get accessibilityAnimationsRemove => 'Koma í veg fyrir skjábrellur'; + + @override + String get accessibilityAnimationsKeep => 'Halda skjábrellum'; + + @override + String get albumTierNew => 'Nýtt'; + + @override + String get albumTierPinned => 'Fest'; + + @override + String get albumTierGroups => 'Hópar'; + + @override + String get albumTierSpecial => 'Algengt'; + + @override + String get albumTierApps => 'Forrit'; + + @override + String get albumTierVaults => 'Öryggisgeymslur'; + + @override + String get albumTierDynamic => 'Breytilegt'; + + @override + String get albumTierRegular => 'Annað'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Gráður í tugakerfi'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'A'; + + @override + String get coordinateDmsWest => 'V'; + + @override + String get displayRefreshRatePreferHighest => 'Hæsti hraði'; + + @override + String get displayRefreshRatePreferLowest => 'Lægsti hraði'; + + @override + String get keepScreenOnNever => 'Aldrei'; + + @override + String get keepScreenOnVideoPlayback => 'Á meðan myndskeið er í spilun'; + + @override + String get keepScreenOnViewerOnly => 'Aðeins síða skoðara'; + + @override + String get keepScreenOnAlways => 'Alltaf'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (blandað)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (yfirborð)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'OSM fyrir hjálparstarf'; + + @override + String get mapStyleStamenWatercolor => 'Stamen-vatnslitir'; + + @override + String get maxBrightnessNever => 'Aldrei'; + + @override + String get maxBrightnessAlways => 'Alltaf'; + + @override + String get nameConflictStrategyRename => 'Endurnefna'; + + @override + String get nameConflictStrategyReplace => 'Skipta út'; + + @override + String get nameConflictStrategySkip => 'Sleppa'; + + @override + String get overlayHistogramNone => 'Ekkert'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Ljómi'; + + @override + String get subtitlePositionTop => 'Efst'; + + @override + String get subtitlePositionBottom => 'Neðst'; + + @override + String get themeBrightnessLight => 'Ljóst'; + + @override + String get themeBrightnessDark => 'Dökkt'; + + @override + String get themeBrightnessBlack => 'Svart'; + + @override + String get unitSystemMetric => 'Metrakerfi'; + + @override + String get unitSystemImperial => 'Breskt Imperial kerfi'; + + @override + String get vaultLockTypePattern => 'Mynstur'; + + @override + String get vaultLockTypePin => 'PIN-númer'; + + @override + String get vaultLockTypePassword => 'Lykilorð'; + + @override + String get settingsVideoEnablePip => 'Mynd-í-mynd'; + + @override + String get videoControlsPlayOutside => 'Opna með öðrum spilara'; + + @override + String get videoLoopModeNever => 'Aldrei'; + + @override + String get videoLoopModeShortOnly => 'Einungis stutt myndskeið'; + + @override + String get videoLoopModeAlways => 'Alltaf'; + + @override + String get videoPlaybackSkip => 'Sleppa'; + + @override + String get videoPlaybackMuted => 'Afspilun án hljóðs'; + + @override + String get videoPlaybackWithSound => 'Afspilun með hljóði'; + + @override + String get videoResumptionModeNever => 'Aldrei'; + + @override + String get videoResumptionModeAlways => 'Alltaf'; + + @override + String get viewerTransitionSlide => 'Renna'; + + @override + String get viewerTransitionParallax => 'Hliðrun'; + + @override + String get viewerTransitionFade => 'Deyfing'; + + @override + String get viewerTransitionZoomIn => 'Renna að'; + + @override + String get viewerTransitionNone => 'Ekkert'; + + @override + String get wallpaperTargetHome => 'Upphafsskjár'; + + @override + String get wallpaperTargetLock => 'Læsa skjá'; + + @override + String get wallpaperTargetHomeLock => 'Upphafs- og lásskjáir'; + + @override + String get widgetDisplayedItemRandom => 'Handahóf'; + + @override + String get widgetDisplayedItemMostRecent => 'Nýlegast'; + + @override + String get widgetOpenPageHome => 'Opna upphafsskjá'; + + @override + String get widgetOpenPageCollection => 'Opna myndasafn'; + + @override + String get widgetOpenPageViewer => 'Opna skoðara'; + + @override + String get widgetTapUpdateWidget => 'Uppfæra viðmótshluta'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'innbyggðri geymslu'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD-minniskorti'; + + @override + String get rootDirectoryDescription => 'rótarmöppu'; + + @override + String otherDirectoryDescription(String name) { + return '„$name“ möppu'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Veldu $directory á „$volume“ í næsta skjá til að gefa forritinu aðgang að henni.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Þessu forriti er ekki heimilt að breyta skrám í $directory á „$volume“.\n\nNotaðu for-uppsettan skráastjóra eða myndasafnsforrit til að færa atriðin í aðra möppu.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Þessi aðgerð þarfnast $neededSize af lausu plássi á „$volume“ til að geta klárað, en einungis $freeSize eru eftir.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Skráaveljari kerfisins er óvirkur eða hann vantar. Virkjaðu hann og reydu síðan aftur.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Þessi aðgerð er ekki studd fyrir atriði af eftirfarandi tegundum: $types.', + one: 'Þessi aðgerð er ekki studd fyrir atriði af tegundinni: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Sumar skrár í móttökumöppunni eru með sama heiti.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Einhverjar skrár eru með sama heiti.'; + + @override + String get addShortcutDialogLabel => 'Skýring flýtilykils'; + + @override + String get addShortcutButtonLabel => 'BÆTA VIÐ'; + + @override + String get noMatchingAppDialogMessage => 'Ekkert forrit fannst sem getur meðhöndlað þessa aðgerð.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Færa þessi $count atriði í ruslmöppuna?', + one: 'Færa þetta atriði í ruslmöppuna?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Eyða þessum $count atriðum?', + one: 'Eyða þessu atriði?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Vista dagsetningar atriðis áður en haldið er áfram?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Vista dagsetningar'; + + @override + String videoResumeDialogMessage(String time) { + return 'Viltu halda afspilun áfram frá $time?'; + } + + @override + String get videoStartOverButtonLabel => 'BYRJA AFTUR'; + + @override + String get videoResumeButtonLabel => 'HALDA ÁFRAM'; + + @override + String get setCoverDialogLatest => 'Síðasta atriðið'; + + @override + String get setCoverDialogAuto => 'Sjálfvirkt'; + + @override + String get setCoverDialogCustom => 'Sérsniðið'; + + @override + String get hideFilterConfirmationDialogMessage => + 'Samsvarandi ljósmyndir og myndskeið verða falin frá safninu þínu. Þú getur látið þetta birtast aftur með því að fara í „Persónuvernd“-stillingarnar.\n\nErtu viss um að þú viljir fela þetta?'; + + @override + String get newAlbumDialogTitle => 'Nýtt albúm'; + + @override + String get newAlbumDialogNameLabel => 'Heiti albúms'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Albúm er þegar til staðar'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Mappa er þegar til staðar'; + + @override + String get newAlbumDialogStorageLabel => 'Geymslurými:'; + + @override + String get newDynamicAlbumDialogTitle => 'Nýtt breytilegt albúm'; + + @override + String get dynamicAlbumAlreadyExists => 'Breytilegt albúm er þegar til staðar'; + + @override + String get newGroupDialogTitle => 'Nýr hópur'; + + @override + String get newGroupDialogNameLabel => 'Heiti hóps'; + + @override + String get groupAlreadyExists => 'Hópur er þegar til'; + + @override + String get groupEmpty => 'Engir hópar'; + + @override + String get ungrouped => 'Óhópað'; + + @override + String get groupPickerTitle => 'Veldu hóp'; + + @override + String get groupPickerUseThisGroupButton => 'Nota þennan hóp'; + + @override + String get newVaultWarningDialogMessage => 'Atriði í öryggisgeymslum eru einungis aðgengileg í þessu forriti og engum öðrum.\n\nEf þú fjarlægir þetta forrit, eða hreinsar gögn forritsins, muntu tapa öllum þessum atriðum.'; + + @override + String get newVaultDialogTitle => 'Ný öryggisgeymsla'; + + @override + String get configureVaultDialogTitle => 'Stilla öryggisgeymslu'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Læsa þegar skjárinn slekkur á sér'; + + @override + String get vaultDialogLockTypeLabel => 'Tegund læsingar'; + + @override + String get patternDialogEnter => 'Settu inn mynstur'; + + @override + String get patternDialogConfirm => 'Staðfestu mynstrið'; + + @override + String get pinDialogEnter => 'Settu inn PIN-númer'; + + @override + String get pinDialogConfirm => 'Staðfestu PIN-númer'; + + @override + String get passwordDialogEnter => 'Settu inn lykilorð'; + + @override + String get passwordDialogConfirm => 'Staðfestu lykilorð'; + + @override + String get authenticateToConfigureVault => 'Auðkenndu til að stilla öryggisgeymslu'; + + @override + String get authenticateToUnlockVault => 'Auðkenndu til að aflæsa öryggisgeymslu'; + + @override + String get vaultBinUsageDialogMessage => 'Sumar öryggisgeymslur nota ruslmöppuna.'; + + @override + String get renameAlbumDialogLabel => 'Nýtt heiti'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Mappa er þegar til staðar'; + + @override + String get renameEntrySetPageTitle => 'Endurnefna'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Nefningarmynstur'; + + @override + String get renameEntrySetPageInsertTooltip => 'Setja inn gagnasvið'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Forskoðun'; + + @override + String get renameProcessorCounter => 'Teljari'; + + @override + String get renameProcessorHash => 'Tætigildi'; + + @override + String get renameProcessorName => 'Heiti'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Eyða þessu albúmi og $count atriðum í því??', + one: 'Eyða þessu albúmi og atriðinu í því?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Eyða þessum albúmum og $count atriðum í þeim??', + one: 'Eyða þessum albúmum og atriðinu í þeim?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Snið:'; + + @override + String get exportEntryDialogWidth => 'Breidd'; + + @override + String get exportEntryDialogHeight => 'Hæð'; + + @override + String get exportEntryDialogQuality => 'Gæði'; + + @override + String get exportEntryDialogWriteMetadata => 'Skrifa lýsigögn'; + + @override + String get renameEntryDialogLabel => 'Nýtt heiti'; + + @override + String get editEntryDialogCopyFromItem => 'Afrita úr öðru atriði'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Gagnasvið sem á að breyta'; + + @override + String get editEntryDateDialogTitle => 'Dagsetning og tími'; + + @override + String get editEntryDateDialogSetCustom => 'Stilla sérsniðna dagsetningu'; + + @override + String get editEntryDateDialogCopyField => 'Afrita úr annarri dagsetningu'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Veiða úr titli'; + + @override + String get editEntryDateDialogShift => 'Hliðra'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Breytingardagsetning skráar'; + + @override + String get durationDialogHours => 'Klukkustundir'; + + @override + String get durationDialogMinutes => 'Mínútur'; + + @override + String get durationDialogSeconds => 'Sekúndur'; + + @override + String get editEntryLocationDialogTitle => 'Staðsetning'; + + @override + String get editEntryLocationDialogSetCustom => 'Stilla sérsniðna staðsetningu'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Velja á korti'; + + @override + String get editEntryLocationDialogImportGpx => 'Flytja inn GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Breiddargráða'; + + @override + String get editEntryLocationDialogLongitude => 'Lengdargráða'; + + @override + String get editEntryLocationDialogTimeShift => 'Tímahliðrun'; + + @override + String get locationPickerUseThisLocationButton => 'Nota þessa staðsetningu'; + + @override + String get editEntryRatingDialogTitle => 'Einkunn'; + + @override + String get removeEntryMetadataDialogTitle => 'Fjarlæging lýsigagna'; + + @override + String get removeEntryMetadataDialogAll => 'Allt'; + + @override + String get removeEntryMetadataDialogMore => 'Meira'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP er nauðsynlegt til að geta spilað myndskeið inni í hreyfiljósmynd.\n\nErtu viss um að þú viljir fjarlægja það?'; + + @override + String get videoSpeedDialogLabel => 'Afspilunarhraði'; + + @override + String get videoStreamSelectionDialogVideo => 'Myndskeið'; + + @override + String get videoStreamSelectionDialogAudio => 'Hljóð'; + + @override + String get videoStreamSelectionDialogText => 'Skjátextar'; + + @override + String get videoStreamSelectionDialogOff => 'Slökkt'; + + @override + String get videoStreamSelectionDialogTrack => 'Ferill'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Það eru engir aðrir ferlar.'; + + @override + String get genericSuccessFeedback => 'Lokið!'; + + @override + String get genericFailureFeedback => 'Mistókst'; + + @override + String get genericDangerWarningDialogMessage => 'Ertu viss?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Reyndu aftur með færri atriðum.'; + + @override + String get menuActionConfigureView => 'Skoða'; + + @override + String get menuActionSelect => 'Velja'; + + @override + String get menuActionSelectAll => 'Velja allt'; + + @override + String get menuActionSelectNone => 'Velja ekkert'; + + @override + String get menuActionMap => 'Kort'; + + @override + String get menuActionSlideshow => 'Skyggnusýning'; + + @override + String get menuActionStats => 'Tölfræði'; + + @override + String get viewDialogSortSectionTitle => 'Raða'; + + @override + String get viewDialogGroupSectionTitle => 'Hlutar'; + + @override + String get viewDialogLayoutSectionTitle => 'Framsetning'; + + @override + String get viewDialogReverseSortOrder => 'Öfug röð'; + + @override + String get tileLayoutMosaic => 'Mósaík'; + + @override + String get tileLayoutGrid => 'Reitir'; + + @override + String get tileLayoutList => 'Listi'; + + @override + String get castDialogTitle => 'Útvörpunartæki'; + + @override + String get coverDialogTabCover => 'Umslag'; + + @override + String get coverDialogTabApp => 'Forrit'; + + @override + String get coverDialogTabColor => 'Litur'; + + @override + String get appPickDialogTitle => 'Veldu forrit'; + + @override + String get appPickDialogNone => 'Ekkert'; + + @override + String get aboutPageTitle => 'Um hugbúnaðinn'; + + @override + String get aboutLinkLicense => 'Notkunarleyfi'; + + @override + String get aboutLinkPolicy => 'Meðferð persónuupplýsinga'; + + @override + String get aboutBugSectionTitle => 'Villuskýrsla'; + + @override + String get aboutBugSaveLogInstruction => 'Vista atvikaskráningu forrits í skrá'; + + @override + String get aboutBugCopyInfoInstruction => 'Afrita kerfisupplýsingar'; + + @override + String get aboutBugCopyInfoButton => 'Afrita'; + + @override + String get aboutBugReportInstruction => 'Tilkynna á GitHub með atvikaskrám og kerfisupplýsingum'; + + @override + String get aboutBugReportButton => 'Tilkynna'; + + @override + String get aboutDataUsageSectionTitle => 'Gagnanotkun'; + + @override + String get aboutDataUsageData => 'Gögn'; + + @override + String get aboutDataUsageCache => 'Skyndiminni'; + + @override + String get aboutDataUsageDatabase => 'Gagnagrunnur'; + + @override + String get aboutDataUsageMisc => 'Ýmislegt'; + + @override + String get aboutDataUsageInternal => 'Innri'; + + @override + String get aboutDataUsageExternal => 'Utanaðkomandi'; + + @override + String get aboutDataUsageClearCache => 'Hreinsa skyndiminni'; + + @override + String get aboutCreditsSectionTitle => 'Framlög'; + + @override + String get aboutCreditsWorldAtlas1 => 'Þetta forrit notar TopoJSON-skrá frá'; + + @override + String get aboutCreditsWorldAtlas2 => 'með ISC-notkunarleyfi.'; + + @override + String get aboutTranslatorsSectionTitle => 'Þýðendur'; + + @override + String get aboutLicensesSectionTitle => 'Notkunarleyfi opins hugbúnaðar'; + + @override + String get aboutLicensesBanner => 'Þetta forrit notar eftirfarandi pakka og aðgerðasöfn með opnum grunnkóða.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android-aðgerðasöfn'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter-viðbætur'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter-pakkar'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart-pakkar'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Sýna öll notkunarleyfi'; + + @override + String get policyPageTitle => 'Meðferð persónuupplýsinga'; + + @override + String get collectionPageTitle => 'Safn'; + + @override + String get collectionPickPageTitle => 'Veldu'; + + @override + String get collectionSelectPageTitle => 'Veldu atriði'; + + @override + String get collectionActionShowTitleSearch => 'Birta titilsíu'; + + @override + String get collectionActionHideTitleSearch => 'Fela titilsíu'; + + @override + String get collectionActionAddDynamicAlbum => 'Bæta við breytilegu albúmi'; + + @override + String get collectionActionAddShortcut => 'Bæta við flýtileið'; + + @override + String get collectionActionSetHome => 'Setja sem upphafsskjá'; + + @override + String get collectionActionEmptyBin => 'Tæma ruslið'; + + @override + String get collectionActionCopy => 'Afrita í albúm'; + + @override + String get collectionActionMove => 'Færa í albúm'; + + @override + String get collectionActionRescan => 'Endurskanna'; + + @override + String get collectionActionEdit => 'Breyta'; + + @override + String get collectionSearchTitlesHintText => 'Leita í lagatitlum'; + + @override + String get collectionGroupAlbum => 'Eftir albúmum'; + + @override + String get collectionGroupMonth => 'Eftir mánuðum'; + + @override + String get collectionGroupDay => 'Eftir dögum'; + + @override + String get sectionNone => 'Engir hlutar'; + + @override + String get sectionUnknown => 'Óþekkt'; + + @override + String get dateToday => 'Í dag'; + + @override + String get dateYesterday => 'Í gær'; + + @override + String get dateThisMonth => 'Í þessum mánuði'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Mistókst að eyða $count atriðum', + one: 'Mistókst að eyða 1 atriði', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Mistókst að afrita $count atriðum', + one: 'Mistókst að afrita 1 atriði', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Mistókst að flytja $count atriðum', + one: 'Mistókst að flytja 1 atriði', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Mistókst að endurnefna $count atriðum', + one: 'Mistókst að endurnefna 1 atriði', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Mistókst að breyta $count atriðum', + one: 'Mistókst að breyta 1 atriði', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Mistókst að flytja út $count atriðum', + one: 'Mistókst að flytja út 1 atriði', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Afritaði $count atriðum', + one: 'Afritaði 1 atriði', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Færði $count atriðum', + one: 'Færði 1 atriði', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Endurnefndi $count atriðum', + one: 'Endurnefndi 1 atriði', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Breytti $count atriðum', + one: 'Breytti 1 atriði', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Engin eftirlæti'; + + @override + String get collectionEmptyVideos => 'Engin myndskeið'; + + @override + String get collectionEmptyImages => 'Engar myndir'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Veita aðgang'; + + @override + String get collectionSelectSectionTooltip => 'Velja hluta'; + + @override + String get collectionDeselectSectionTooltip => 'Afvelja hluta'; + + @override + String get drawerAboutButton => 'Um hugbúnaðinn'; + + @override + String get drawerSettingsButton => 'Stillingar'; + + @override + String get drawerCollectionAll => 'Allt safnið'; + + @override + String get drawerCollectionFavourites => 'Eftirlæti'; + + @override + String get drawerCollectionImages => 'Myndir'; + + @override + String get drawerCollectionVideos => 'Myndskeið'; + + @override + String get drawerCollectionAnimated => 'Með hreyfingu'; + + @override + String get drawerCollectionMotionPhotos => 'Hreyfiljósmyndir'; + + @override + String get drawerCollectionPanoramas => 'Víðmyndir'; + + @override + String get drawerCollectionRaws => 'RAW-myndir'; + + @override + String get drawerCollectionSphericalVideos => '360° myndskeið'; + + @override + String get drawerAlbumPage => 'Albúm'; + + @override + String get drawerCountryPage => 'Lönd'; + + @override + String get drawerPlacePage => 'Staðir'; + + @override + String get drawerTagPage => 'Merki'; + + @override + String get sortByDate => 'Eftir dagsetningu'; + + @override + String get sortByName => 'Eftir nafni'; + + @override + String get sortByItemCount => 'Eftir fjölda atriða'; + + @override + String get sortBySize => 'Eftir stærð'; + + @override + String get sortByAlbumFileName => 'Eftir heiti albúma og atriða'; + + @override + String get sortByRating => 'Eftir einkunn'; + + @override + String get sortByDuration => 'Eftir tímalengd'; + + @override + String get sortByPath => 'Eftir slóð'; + + @override + String get sortOrderNewestFirst => 'Nýjast fyrst'; + + @override + String get sortOrderOldestFirst => 'Elsta fyrst'; + + @override + String get sortOrderAtoZ => 'A til Ö'; + + @override + String get sortOrderZtoA => 'Ö til A'; + + @override + String get sortOrderHighestFirst => 'Hæsta fyrst'; + + @override + String get sortOrderLowestFirst => 'Lægsta fyrst'; + + @override + String get sortOrderLargestFirst => 'Stærst fyrst'; + + @override + String get sortOrderSmallestFirst => 'Minnsta fyrst'; + + @override + String get sortOrderShortestFirst => 'Stysta fyrst'; + + @override + String get sortOrderLongestFirst => 'Lengsta fyrst'; + + @override + String get albumGroupTier => 'Eftir flokki'; + + @override + String get albumGroupType => 'Eftir gerð'; + + @override + String get albumGroupVolume => 'Eftir gagnageymslu'; + + @override + String get albumMimeTypeMixed => 'Blandað'; + + @override + String get albumPickPageTitleCopy => 'Afrita í albúm'; + + @override + String get albumPickPageTitleExport => 'Flytja út í albúm'; + + @override + String get albumPickPageTitleMove => 'Færa í albúm'; + + @override + String get albumPickPageTitlePick => 'Veldu albúm'; + + @override + String get albumCamera => 'Myndavél'; + + @override + String get albumDownload => 'Sækja'; + + @override + String get albumScreenshots => 'Skjámyndir'; + + @override + String get albumScreenRecordings => 'Skjáupptökur'; + + @override + String get albumVideoCaptures => 'Upptökur myndskeiða'; + + @override + String get albumPageTitle => 'Albúm'; + + @override + String get albumEmpty => 'Engin albúm'; + + @override + String get createAlbumButtonLabel => 'BÚA TIL'; + + @override + String get newFilterBanner => 'nýtt'; + + @override + String get countryPageTitle => 'Lönd'; + + @override + String get countryEmpty => 'Engin lönd'; + + @override + String get statePageTitle => 'Héruð'; + + @override + String get stateEmpty => 'Engin héruð'; + + @override + String get placePageTitle => 'Staðir'; + + @override + String get placeEmpty => 'Engir staðir'; + + @override + String get tagPageTitle => 'Merki'; + + @override + String get tagEmpty => 'Engin merki'; + + @override + String get tagPickPageTitle => 'Veldu merki'; + + @override + String get binPageTitle => 'Ruslmappa'; + + @override + String get explorerPageTitle => 'Skráastjóri'; + + @override + String get explorerActionSelectStorageVolume => 'Veldu geymslu'; + + @override + String get selectStorageVolumeDialogTitle => 'Veldu geymslu'; + + @override + String get searchCollectionFieldHint => 'Leita í safni'; + + @override + String get searchRecentSectionTitle => 'Nýlegt'; + + @override + String get searchDateSectionTitle => 'Dagsetning'; + + @override + String get searchFormatSectionTitle => 'Snið'; + + @override + String get searchAlbumsSectionTitle => 'Albúm'; + + @override + String get searchCountriesSectionTitle => 'Lönd'; + + @override + String get searchStatesSectionTitle => 'Héruð'; + + @override + String get searchPlacesSectionTitle => 'Staðir'; + + @override + String get searchTagsSectionTitle => 'Merki'; + + @override + String get searchRatingSectionTitle => 'Einkunnir'; + + @override + String get searchMetadataSectionTitle => 'Lýsigögn'; + + @override + String get settingsPageTitle => 'Stillingar'; + + @override + String get settingsSystemDefault => 'Sjálfgefið í kerfinu'; + + @override + String get settingsDefault => 'Sjálfgefið'; + + @override + String get settingsDisabled => 'Óvirkt'; + + @override + String get settingsEnabled => 'Virkt'; + + @override + String get settingsForced => 'Þvingað'; + + @override + String get settingsAskEverytime => 'Spyrja í hvert skipti'; + + @override + String get settingsModificationWarningDialogMessage => 'Aðrar stillingar munu breytast.'; + + @override + String get settingsSearchFieldLabel => 'Leita í stillingum'; + + @override + String get settingsSearchEmpty => 'Engin samsvarandi stilling'; + + @override + String get settingsActionExport => 'Flytja út'; + + @override + String get settingsActionExportDialogTitle => 'Flytja út'; + + @override + String get settingsActionImport => 'Flytja inn'; + + @override + String get settingsActionImportDialogTitle => 'Flytja inn'; + + @override + String get appExportCovers => 'Umslög'; + + @override + String get appExportDynamicAlbums => 'Breytileg albúm'; + + @override + String get appExportFavourites => 'Eftirlæti'; + + @override + String get appExportSettings => 'Stillingar'; + + @override + String get settingsNavigationSectionTitle => 'Flakk'; + + @override + String get settingsHomeTile => 'Heim'; + + @override + String get settingsHomeDialogTitle => 'Heim'; + + @override + String get setHomeCustom => 'Sérsniðið'; + + @override + String get settingsKeepScreenOnTile => 'Halda skjá í gangi'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Halda skjá í gangi'; + + @override + String get settingsDoubleBackExit => 'Ýttu tvisvar á „Til baka“ til að hætta'; + + @override + String get settingsConfirmationTile => 'Staðfestingargluggar'; + + @override + String get settingsConfirmationDialogTitle => 'Staðfestingargluggar'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Spyrja áður en atriðum er endanlega eytt'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Spyrja áður en atriði eru færð í ruslmöppuna'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Spyrja áður en ódagsett atriði eru færð'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Sýna skilaboð eftir að atriði eru færð í ruslmöppuna'; + + @override + String get settingsConfirmationVaultDataLoss => 'Birta aðvörun um gagnatap öryggisgeymslu'; + + @override + String get settingsNavigationDrawerTile => 'Leiðsagnarval'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Flakkvalmynd'; + + @override + String get settingsNavigationDrawerBanner => 'Ýttu og haltu niðri til að endurraða valmyndaratriðum.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Tegundir'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albúm'; + + @override + String get settingsNavigationDrawerTabPages => 'Síður'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Bæta við albúmi'; + + @override + String get settingsNavigationBottomActionsTile => 'Flakkstika neðst'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Flakkstika neðst'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Ýttu og haltu niðri til að færa hnappa og velja hvaða aðgerðir eiga að birtast á flakkstikunni neðst.'; + + @override + String get settingsThumbnailSectionTitle => 'Smámyndir'; + + @override + String get settingsThumbnailOverlayTile => 'Yfirlag'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Yfirlag'; + + @override + String get settingsThumbnailShowHdrIcon => 'Birta HDR-táknmynd'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Birta tákn fyrir eftirlæti'; + + @override + String get settingsThumbnailShowTagIcon => 'Birta tákn fyrir merki'; + + @override + String get settingsThumbnailShowLocationIcon => 'Birta tákn fyrir staðsetningu'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Birta tákn fyrir hreyfiljósmyndir'; + + @override + String get settingsThumbnailShowRating => 'Birta einkunn'; + + @override + String get settingsThumbnailShowRawIcon => 'Birta tákn fyrir RAW'; + + @override + String get settingsThumbnailShowVideoDuration => 'Birta tímalengd myndskeiða'; + + @override + String get settingsCollectionQuickActionsTile => 'Flýtiaðgerðir'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Flýtiaðgerðir'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Vafur'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Val'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Ýttu og haltu niðri til að færa hnappa og velja hvaða aðgerðir séu birtar þegar verið er að fletta í gegnum atriði.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Ýttu og haltu niðri til að færa hnappa og velja hvaða aðgerðir séu birtar þegar verið er að velja atriði.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Mynstur runu'; + + @override + String get settingsCollectionBurstPatternsNone => 'Ekkert'; + + @override + String get settingsViewerSectionTitle => 'Skoðari'; + + @override + String get settingsViewerGestureSideTapNext => 'Ýttu á skjájaðra til að birta fyrra/næsta atriði'; + + @override + String get settingsViewerUseCutout => 'Nota útklippt svæði'; + + @override + String get settingsViewerMaximumBrightness => 'Hámarksbirtustig'; + + @override + String get settingsMotionPhotoAutoPlay => 'Spila hreyfiljósmyndir sjálfkrafa'; + + @override + String get settingsImageBackground => 'Bakgrunnur mynda'; + + @override + String get settingsViewerQuickActionsTile => 'Flýtiaðgerðir'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Flýtiaðgerðir'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Ýttu og haltu niðri til að færa hnappa og velja hvaða aðgerðir séu birtar í skoðaranum.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Birtir hnappar'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Tiltækir hnappar'; + + @override + String get settingsViewerQuickActionEmpty => 'Engir hnappar'; + + @override + String get settingsViewerOverlayTile => 'Yfirlag'; + + @override + String get settingsViewerOverlayPageTitle => 'Yfirlag'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Birta við opnun'; + + @override + String get settingsViewerShowHistogram => 'Birta litatíðnirit'; + + @override + String get settingsViewerShowMinimap => 'Birta smákort'; + + @override + String get settingsViewerShowZoomLevel => 'Birta aðdráttarstig'; + + @override + String get settingsViewerShowInformation => 'Birta upplýsingar'; + + @override + String get settingsViewerShowInformationSubtitle => 'Birta titil, dagsetningu, staðsetningu, o.s.frv.'; + + @override + String get settingsViewerShowRatingTags => 'Birta einkunn og merki'; + + @override + String get settingsViewerShowShootingDetails => 'Sýna ítarlegri upplýsingar um myndatöku'; + + @override + String get settingsViewerShowDescription => 'Birta lýsingu'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Birta smámyndir'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Móðunarbrella'; + + @override + String get settingsViewerSlideshowTile => 'Skyggnusýning'; + + @override + String get settingsViewerSlideshowPageTitle => 'Skyggnusýning'; + + @override + String get settingsSlideshowRepeat => 'Endurtaka'; + + @override + String get settingsSlideshowShuffle => 'Stokka'; + + @override + String get settingsSlideshowFillScreen => 'Fylla skjá'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Aðdráttur með hreyfingu'; + + @override + String get settingsSlideshowTransitionTile => 'Millifærsla'; + + @override + String get settingsSlideshowIntervalTile => 'Millibil'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Afspilun myndskeiða'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Afspilun myndskeiða'; + + @override + String get settingsVideoPageTitle => 'Myndstillingar'; + + @override + String get settingsVideoSectionTitle => 'Myndskeið'; + + @override + String get settingsVideoShowVideos => 'Sýna myndskeið'; + + @override + String get settingsVideoPlaybackTile => 'Afspilun'; + + @override + String get settingsVideoPlaybackPageTitle => 'Afspilun'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Vélbúnaðarhröðun'; + + @override + String get settingsVideoAutoPlay => 'Sjálfvirk spilun'; + + @override + String get settingsVideoLoopModeTile => 'Endurtekningarhamur'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Endurtekningarhamur'; + + @override + String get settingsVideoResumptionModeTile => 'Halda afspilun áfram'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Halda afspilun áfram'; + + @override + String get settingsVideoBackgroundMode => 'Bakgrunnshamur'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Bakgrunnshamur'; + + @override + String get settingsVideoControlsTile => 'Stýringar'; + + @override + String get settingsVideoControlsPageTitle => 'Stýringar'; + + @override + String get settingsVideoButtonsTile => 'Hnappar'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Tvíbankaðu til að spila/setja í bið'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Tvíbankaðu á skjájaðra leita afturábak/áfram'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Strjúktu upp/niður til að breyta birtustigi/hljóðstyrk'; + + @override + String get settingsSubtitleThemeTile => 'Skjátextar'; + + @override + String get settingsSubtitleThemePageTitle => 'Skjátextar'; + + @override + String get settingsSubtitleThemeSample => 'Þetta er dæmi.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Jöfnun texta'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Jöfnun texta'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Textastaðsetning'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Textastaða'; + + @override + String get settingsSubtitleThemeTextSize => 'Stærð texta'; + + @override + String get settingsSubtitleThemeShowOutline => 'Sýna útlínur og skugga'; + + @override + String get settingsSubtitleThemeTextColor => 'Litur texta'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Ógegnsæi texta'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Litur bakgrunns'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Ógegnsæi bakgrunns'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Vinstri'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Miðjað'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Hægri'; + + @override + String get settingsPrivacySectionTitle => 'Persónuvernd'; + + @override + String get settingsAllowInstalledAppAccess => 'Leyfa aðgang að forritaskrá'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Notað til að bæta birtingu albúma'; + + @override + String get settingsAllowErrorReporting => 'Leyfa nafnlausar villutilkynningar'; + + @override + String get settingsSaveSearchHistory => 'Vista leitarferil'; + + @override + String get settingsEnableBin => 'Nota ruslmöppu'; + + @override + String get settingsEnableBinSubtitle => 'Halda eyddum atriðum í 30 daga'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Atriðum í ruslinu verður endanlega eytt.'; + + @override + String get settingsAllowMediaManagement => 'Leyfa stýringu gagnamiðla'; + + @override + String get settingsHiddenItemsTile => 'Falin atriði'; + + @override + String get settingsHiddenItemsPageTitle => 'Falin atriði'; + + @override + String get settingsHiddenFiltersBanner => 'Myndir og myndskeið sem samsvara felusíum, munu ekki birtast í safninu þínu.'; + + @override + String get settingsHiddenFiltersEmpty => 'Engar felusíur'; + + @override + String get settingsStorageAccessTile => 'Aðgengi geymslu'; + + @override + String get settingsStorageAccessPageTitle => 'Aðgengi geymslu'; + + @override + String get settingsStorageAccessBanner => 'Sumar möppur krefjast þess að gefin sé sérstök heimild til að breyta skrám í þeim. Þú getur yfirfarið hér þær möppur sem þú hefur gefið aðgangaheimildir fyrir.'; + + @override + String get settingsStorageAccessEmpty => 'Engiar aðgangsheimildir'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Afturkalla'; + + @override + String get settingsAccessibilitySectionTitle => 'Auðveldað aðgengi'; + + @override + String get settingsRemoveAnimationsTile => 'Fjarlægja hreyfimyndir'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Fjarlægja hreyfimyndir'; + + @override + String get settingsTimeToTakeActionTile => 'Tími til að grípa til aðgerða'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Sýna aðra valkosti með mörgum bendingum'; + + @override + String get settingsDisplaySectionTitle => 'Birting'; + + @override + String get settingsThemeBrightnessTile => 'Þema'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Þema'; + + @override + String get settingsThemeColorHighlights => 'Hátónalitun'; + + @override + String get settingsThemeEnableDynamicColor => 'Breytilegur litur'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Birta uppfærslutíðni'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Uppfærslutíðni'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV viðmót'; + + @override + String get settingsLanguageSectionTitle => 'Tungumál og snið'; + + @override + String get settingsLanguageTile => 'Tungumál'; + + @override + String get settingsLanguagePageTitle => 'Tungumál'; + + @override + String get settingsCoordinateFormatTile => 'Snið hnita'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Snið hnita'; + + @override + String get settingsUnitSystemTile => 'Einingar'; + + @override + String get settingsUnitSystemDialogTitle => 'Einingar'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Þvinga arabískar tölur'; + + @override + String get settingsScreenSaverPageTitle => 'Skjáhvíla'; + + @override + String get settingsWidgetPageTitle => 'Myndarammi'; + + @override + String get settingsWidgetShowOutline => 'Útlínur'; + + @override + String get settingsWidgetOpenPage => 'Þegar ýtt er á viðmótshlutann'; + + @override + String get settingsWidgetDisplayedItem => 'Birt atriði'; + + @override + String get settingsCollectionTile => 'Safn'; + + @override + String get statsPageTitle => 'Tölfræði'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count atriði með staðsetningum', + one: '1 atriði með staðsetningu', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Algengustu lönd'; + + @override + String get statsTopStatesSectionTitle => 'Algengustu héruð'; + + @override + String get statsTopPlacesSectionTitle => 'Algengustu staðir'; + + @override + String get statsTopTagsSectionTitle => 'Algengustu merki'; + + @override + String get statsTopAlbumsSectionTitle => 'Vinsælustu albúm'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPNA VÍÐMYND'; + + @override + String get viewerSetWallpaperButtonLabel => 'SETJA BAKGRUNN'; + + @override + String get viewerErrorUnknown => 'Úbbs!'; + + @override + String get viewerErrorDoesNotExist => 'Skráin er ekki lengur til.'; + + @override + String get viewerInfoPageTitle => 'Upplýsingar'; + + @override + String get viewerInfoBackToViewerTooltip => 'Til baka í skoðara'; + + @override + String get viewerInfoUnknown => 'óþekkt'; + + @override + String get viewerInfoLabelDescription => 'Lýsing'; + + @override + String get viewerInfoLabelTitle => 'Titill'; + + @override + String get viewerInfoLabelDate => 'Dagsetning'; + + @override + String get viewerInfoLabelResolution => 'Upplausn'; + + @override + String get viewerInfoLabelSize => 'Stærð'; + + @override + String get viewerInfoLabelUri => 'Vefslóð'; + + @override + String get viewerInfoLabelPath => 'Slóð'; + + @override + String get viewerInfoLabelDuration => 'Tímalengd'; + + @override + String get viewerInfoLabelOwner => 'Eigandi'; + + @override + String get viewerInfoLabelCoordinates => 'Hnit'; + + @override + String get viewerInfoLabelAddress => 'Heimilisfang'; + + @override + String get mapStyleDialogTitle => 'Stíll korts'; + + @override + String get mapStyleDialogAddStyle => 'Bæta við stíl'; + + @override + String get mapStyleTooltip => 'Veldu stíl korts'; + + @override + String get mapStyleEditorDialogName => 'Heiti'; + + @override + String get mapStyleEditorDialogUrl => 'Vefslóð'; + + @override + String get mapStyleEditorDialogSubdomains => 'Undirlén'; + + @override + String get mapStyleEditorDialogUserAgent => 'Kennistrengur vafra'; + + @override + String get mapZoomInTooltip => 'Renna að'; + + @override + String get mapZoomOutTooltip => 'Renna frá'; + + @override + String get mapPointNorthUpTooltip => 'Norður beint upp'; + + @override + String get mapAttributionOsmData => 'Kortagögn frá © [OpenStreetMap](https://www.openstreetmap.org/copyright) þátttakendum'; + + @override + String get mapAttributionOsmLiberty => 'Kortaflísar frá [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hýst hjá [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Kortaflísar frá [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Kortatíglar frá [HOT](https://www.hotosm.org/) • Hýst af [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Kortatíglar frá [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Skoða á kortasíðu'; + + @override + String get mapEmptyRegion => 'Engar myndir á þessu svæði'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Mistókst að ná í ívafin gögn'; + + @override + String get viewerInfoOpenLinkText => 'Opna'; + + @override + String get viewerInfoViewXmlLinkText => 'Skoða XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Leita í lýsigögnum'; + + @override + String get viewerInfoSearchEmpty => 'Engir samsvarandi lyklar'; + + @override + String get viewerInfoSearchSuggestionDate => 'Dagsetning og tími'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Lýsing'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Stærðir'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Upplausn'; + + @override + String get viewerInfoSearchSuggestionRights => 'Réttindi'; + + @override + String get wallpaperUseScrollEffect => 'Nota skrunbrellur á upphafsskjá'; + + @override + String get tagEditorPageTitle => 'Breyta merkjum'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Nýtt merki'; + + @override + String get tagEditorPageAddTagTooltip => 'Bæta við merki'; + + @override + String get tagEditorSectionRecent => 'Nýlegt'; + + @override + String get tagEditorSectionPlaceholders => 'Ígildisbreytur'; + + @override + String get tagEditorDiscardDialogMessage => 'Viltu henda breytingum?'; + + @override + String get tagPlaceholderCountry => 'Land'; + + @override + String get tagPlaceholderState => 'Hérað'; + + @override + String get tagPlaceholderPlace => 'Staður'; + + @override + String get panoramaEnableSensorControl => 'Virkja skynjarastýringu'; + + @override + String get panoramaDisableSensorControl => 'Gera skynjarastýringu óvirka'; + + @override + String get sourceViewerPageTitle => 'Uppruni'; +} diff --git a/lib/l10ngen/app_localizations_it.dart b/lib/l10ngen/app_localizations_it.dart new file mode 100644 index 0000000..b496804 --- /dev/null +++ b/lib/l10ngen/app_localizations_it.dart @@ -0,0 +1,2421 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Italian (`it`). +class AppLocalizationsIt extends AppLocalizations { + AppLocalizationsIt([String locale = 'it']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Benvenuto in Aves'; + + @override + String get welcomeOptional => 'Opzionale'; + + @override + String get welcomeTermsToggle => 'Accetto i termini e le condizioni'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString elementi', + one: '$countString elemento', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count colonne', + one: '$count colonna', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString secondi', + one: '$countString secondo', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minuti', + one: '$countString minuto', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString giorni', + one: '$countString giorno', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APPLICA'; + + @override + String get createButtonLabel => 'CREA'; + + @override + String get deleteButtonLabel => 'ELIMINA'; + + @override + String get nextButtonLabel => 'AVANTI'; + + @override + String get showButtonLabel => 'VISUALIZZA'; + + @override + String get hideButtonLabel => 'NASCONDI'; + + @override + String get continueButtonLabel => 'CONTINUA'; + + @override + String get saveCopyButtonLabel => 'SALVA COPIA'; + + @override + String get applyTooltip => 'Applica'; + + @override + String get cancelTooltip => 'Annulla'; + + @override + String get changeTooltip => 'Cambia'; + + @override + String get clearTooltip => 'Cancella'; + + @override + String get previousTooltip => 'Precedente'; + + @override + String get nextTooltip => 'Successivo'; + + @override + String get showTooltip => 'Visualizza'; + + @override + String get hideTooltip => 'Nascondi'; + + @override + String get actionRemove => 'Rimuovi'; + + @override + String get resetTooltip => 'Ripristina'; + + @override + String get saveTooltip => 'Salva'; + + @override + String get stopTooltip => 'Ferma'; + + @override + String get pickTooltip => 'Seleziona'; + + @override + String get doubleBackExitMessage => 'Tocca di nuovo «indietro» per uscire.'; + + @override + String get doNotAskAgain => 'Non chiedere di nuovo'; + + @override + String get sourceStateLoading => 'Caricamento'; + + @override + String get sourceStateCataloguing => 'Catalogazione'; + + @override + String get sourceStateLocatingCountries => 'Individuazione paesi'; + + @override + String get sourceStateLocatingPlaces => 'Individuazione luoghi'; + + @override + String get chipActionDelete => 'Elimina'; + + @override + String get chipActionRemove => 'Rimuovi'; + + @override + String get chipActionShowCollection => 'Visualizza nella Collezione'; + + @override + String get chipActionGoToAlbumPage => 'Visualizza negli Album'; + + @override + String get chipActionGoToCountryPage => 'Mostra nei Paesi'; + + @override + String get chipActionGoToPlacePage => 'Visualizza nei Luoghi'; + + @override + String get chipActionGoToTagPage => 'Visualizza nelle Etichette'; + + @override + String get chipActionGoToExplorerPage => 'Mostra in Gestione file'; + + @override + String get chipActionDecompose => 'Dividi'; + + @override + String get chipActionFilterOut => 'Escludi'; + + @override + String get chipActionFilterIn => 'Includi'; + + @override + String get chipActionHide => 'Nascondi'; + + @override + String get chipActionLock => 'Proteggi'; + + @override + String get chipActionPin => 'Aggancia in alto'; + + @override + String get chipActionUnpin => 'Rimuovi dall’alto'; + + @override + String get chipActionGroup => 'Cambia raggruppamento'; + + @override + String get chipActionRename => 'Rinomina'; + + @override + String get chipActionSetCover => 'Imposta copertina'; + + @override + String get chipActionShowCountryStates => 'Visualizza stati'; + + @override + String get chipActionCreateGroup => 'Crea gruppo'; + + @override + String get chipActionCreateAlbum => 'Crea album'; + + @override + String get chipActionCreateVault => 'Crea cassaforte'; + + @override + String get chipActionConfigureVault => 'Configura cassaforte'; + + @override + String get entryActionCopyToClipboard => 'Copia negli appunti'; + + @override + String get entryActionDelete => 'Elimina'; + + @override + String get entryActionConvert => 'Converti'; + + @override + String get entryActionExport => 'Esporta'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Rinomina'; + + @override + String get entryActionRestore => 'Ripristina'; + + @override + String get entryActionRotateCCW => 'Ruota in senso antiorario'; + + @override + String get entryActionRotateCW => 'Ruota in senso orario'; + + @override + String get entryActionFlip => 'Capovolgi orizzontalmente'; + + @override + String get entryActionPrint => 'Stampa'; + + @override + String get entryActionShare => 'Condividi'; + + @override + String get entryActionShareImageOnly => 'Condividi solo immagine'; + + @override + String get entryActionShareVideoOnly => 'Condividi solo video'; + + @override + String get entryActionViewSource => 'Visualizza sorgente'; + + @override + String get entryActionShowGeoTiffOnMap => 'Visualizza sopra la mappa'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Converti in immagine fissa'; + + @override + String get entryActionViewMotionPhotoVideo => 'Apri video'; + + @override + String get entryActionEdit => 'Modifica'; + + @override + String get entryActionOpen => 'Apri con'; + + @override + String get entryActionSetAs => 'Imposta come'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Visualizza in app mappa'; + + @override + String get entryActionRotateScreen => 'Ruota schermo'; + + @override + String get entryActionAddFavourite => 'Aggiungi ai preferiti'; + + @override + String get entryActionRemoveFavourite => 'Rimuovi dai preferiti'; + + @override + String get videoActionCaptureFrame => 'Cattura fotogramma'; + + @override + String get videoActionMute => 'Disattiva audio'; + + @override + String get videoActionUnmute => 'Attiva audio'; + + @override + String get videoActionPause => 'Pausa'; + + @override + String get videoActionPlay => 'Riproduci'; + + @override + String get videoActionReplay10 => 'Cerca indietro di 10 secondi'; + + @override + String get videoActionSkip10 => 'Cerca in avanti di 10 secondi'; + + @override + String get videoActionShowPreviousFrame => 'Visualizza fotogramma precedente'; + + @override + String get videoActionShowNextFrame => 'Visualizza fotogramma successivo'; + + @override + String get videoActionSelectStreams => 'Seleziona tracce'; + + @override + String get videoActionSetSpeed => 'Velocità riproduzione'; + + @override + String get videoActionABRepeat => 'Ripeti A-B'; + + @override + String get videoRepeatActionSetStart => 'Imposta inizio'; + + @override + String get videoRepeatActionSetEnd => 'Imposta fine'; + + @override + String get viewerActionSettings => 'Impostazioni'; + + @override + String get viewerActionLock => 'Blocca visualizzazione'; + + @override + String get viewerActionUnlock => 'Sblocca visualizzazione'; + + @override + String get slideshowActionResume => 'Riprendi'; + + @override + String get slideshowActionShowInCollection => 'Visualizza nella Collezione'; + + @override + String get entryInfoActionEditDate => 'Modifica data e ora'; + + @override + String get entryInfoActionEditLocation => 'Modifica posizione'; + + @override + String get entryInfoActionEditTitleDescription => 'Modifica titolo e descrizione'; + + @override + String get entryInfoActionEditRating => 'Modifica valutazione'; + + @override + String get entryInfoActionEditTags => 'Modifica etichette'; + + @override + String get entryInfoActionRemoveMetadata => 'Rimuovi metadati'; + + @override + String get entryInfoActionExportMetadata => 'Esporta metadati'; + + @override + String get entryInfoActionRemoveLocation => 'Rimuovi posizione'; + + @override + String get editorActionTransform => 'Trasforma'; + + @override + String get editorTransformCrop => 'Ritaglia'; + + @override + String get editorTransformRotate => 'Ruota'; + + @override + String get cropAspectRatioFree => 'Liberi'; + + @override + String get cropAspectRatioOriginal => 'Originale'; + + @override + String get cropAspectRatioSquare => 'Quadrato'; + + @override + String get filterAspectRatioLandscapeLabel => 'Orizzontale'; + + @override + String get filterAspectRatioPortraitLabel => 'Verticale'; + + @override + String get filterBinLabel => 'Cestino'; + + @override + String get filterFavouriteLabel => 'Preferito'; + + @override + String get filterNoDateLabel => 'Senza data'; + + @override + String get filterNoAddressLabel => 'Senza indirizzo'; + + @override + String get filterLocatedLabel => 'Posizionato'; + + @override + String get filterNoLocationLabel => 'Senza posizione'; + + @override + String get filterNoRatingLabel => 'Non valutato'; + + @override + String get filterTaggedLabel => 'Etichettato'; + + @override + String get filterNoTagLabel => 'Senza etichetta'; + + @override + String get filterNoTitleLabel => 'Senza titolo'; + + @override + String get filterOnThisDayLabel => 'In questo giorno'; + + @override + String get filterRecentlyAddedLabel => 'Aggiunto di recente'; + + @override + String get filterRatingRejectedLabel => 'Rifiutato'; + + @override + String get filterTypeAnimatedLabel => 'Animato'; + + @override + String get filterTypeMotionPhotoLabel => 'Foto in movimento'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => 'Video a 360°'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Immagine'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Evita effetti schermo'; + + @override + String get accessibilityAnimationsKeep => 'Mantieni effetti schermo'; + + @override + String get albumTierNew => 'Nuovo'; + + @override + String get albumTierPinned => 'Fissati'; + + @override + String get albumTierGroups => 'Gruppi'; + + @override + String get albumTierSpecial => 'Frequenti'; + + @override + String get albumTierApps => 'Applicazioni'; + + @override + String get albumTierVaults => 'Casseforti'; + + @override + String get albumTierDynamic => 'Dinamico'; + + @override + String get albumTierRegular => 'Altri'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Gradi decimali'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'O'; + + @override + String get displayRefreshRatePreferHighest => 'Frequenza massima'; + + @override + String get displayRefreshRatePreferLowest => 'Frequenza minima'; + + @override + String get keepScreenOnNever => 'Mai'; + + @override + String get keepScreenOnVideoPlayback => 'Durante riproduzione video'; + + @override + String get keepScreenOnViewerOnly => 'Solo pagina visualizzazione'; + + @override + String get keepScreenOnAlways => 'Sempre'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Ibrido)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terreno)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'OSM umanitario'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (Acquerello)'; + + @override + String get maxBrightnessNever => 'Mai'; + + @override + String get maxBrightnessAlways => 'Sempre'; + + @override + String get nameConflictStrategyRename => 'Rinomina'; + + @override + String get nameConflictStrategyReplace => 'Sostituisci'; + + @override + String get nameConflictStrategySkip => 'Salta'; + + @override + String get overlayHistogramNone => 'Nessuno'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminanza'; + + @override + String get subtitlePositionTop => 'In alto'; + + @override + String get subtitlePositionBottom => 'In basso'; + + @override + String get themeBrightnessLight => 'Chiaro'; + + @override + String get themeBrightnessDark => 'Scuro'; + + @override + String get themeBrightnessBlack => 'Nero'; + + @override + String get unitSystemMetric => 'Metrico'; + + @override + String get unitSystemImperial => 'Imperiale'; + + @override + String get vaultLockTypePattern => 'Sequenza'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Password'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Apri con un altro lettore'; + + @override + String get videoLoopModeNever => 'Mai'; + + @override + String get videoLoopModeShortOnly => 'Solo video brevi'; + + @override + String get videoLoopModeAlways => 'Sempre'; + + @override + String get videoPlaybackSkip => 'Salta'; + + @override + String get videoPlaybackMuted => 'Riproduci senza audio'; + + @override + String get videoPlaybackWithSound => 'Riproduci con audio'; + + @override + String get videoResumptionModeNever => 'Mai'; + + @override + String get videoResumptionModeAlways => 'Sempre'; + + @override + String get viewerTransitionSlide => 'Diapositiva'; + + @override + String get viewerTransitionParallax => 'Parallasse'; + + @override + String get viewerTransitionFade => 'Dissolvenza'; + + @override + String get viewerTransitionZoomIn => 'Ingrandisci'; + + @override + String get viewerTransitionNone => 'Nessuna'; + + @override + String get wallpaperTargetHome => 'Schermata iniziale'; + + @override + String get wallpaperTargetLock => 'Schermata di blocco'; + + @override + String get wallpaperTargetHomeLock => 'Schermata iniziale e di blocco'; + + @override + String get widgetDisplayedItemRandom => 'Casuale'; + + @override + String get widgetDisplayedItemMostRecent => 'Più recente'; + + @override + String get widgetOpenPageHome => 'Apri pagina iniziale'; + + @override + String get widgetOpenPageCollection => 'Apri collezione'; + + @override + String get widgetOpenPageViewer => 'Apri visualizzazione'; + + @override + String get widgetTapUpdateWidget => 'Aggiorna widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Archiviazione interna'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'Scheda SD'; + + @override + String get rootDirectoryDescription => 'cartella root'; + + @override + String otherDirectoryDescription(String name) { + return 'cartella «$name»'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Per dare accesso a questa applicazione nella prossima schermata seleziona la $directory di «$volume».'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Questa applicazione non è autorizzata a modificare i file nella $directory di «$volume».\n\nPer spostare gli elementi in un’altra cartella usa un gestore file o un’app galleria preinstallata.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Per essere completata questa operazione ha bisogno di $neededSize di spazio libero in «$volume», ma sono rimasti solo $freeSize.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Il selezionatore file di sistema è mancante o disabilitato. Abilitalo e riprova.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Questa operazione non è supportata per elementi dei seguenti tipi: $types.', + one: 'Questa operazione non è supportata per elementi del seguente tipo: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Alcuni file nella cartella destinazione hanno lo stesso nome.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Alcuni file hanno lo stesso nome.'; + + @override + String get addShortcutDialogLabel => 'Etichetta scorciatoia'; + + @override + String get addShortcutButtonLabel => 'AGGIUNGI'; + + @override + String get noMatchingAppDialogMessage => 'Non ci sono app che possono gestire questo.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Vuoi spostare questi $countString elementi nel cestino?', + one: 'Vuoi sposta questo elemento nel cestino?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Vuoi eliminare questi $countString elementi?', + one: 'Vuoi eliminare questo elemento?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Prima di procedere vuoi salvare le date degli elementi?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Salva date'; + + @override + String videoResumeDialogMessage(String time) { + return 'Vuoi riprendere la riproduzione a $time?'; + } + + @override + String get videoStartOverButtonLabel => 'RICOMINCIA'; + + @override + String get videoResumeButtonLabel => 'RIPRENDI'; + + @override + String get setCoverDialogLatest => 'Ultimo elemento'; + + @override + String get setCoverDialogAuto => 'Automatico'; + + @override + String get setCoverDialogCustom => 'Personalizzato'; + + @override + String get hideFilterConfirmationDialogMessage => 'Le foto e i video corrispondenti saranno nascosti dalla collezione. Puoi visualizarli di nuovo dalle impostazioni della «Privacy».\n\nVuoi nascondere le foto e i video corrispodenti?'; + + @override + String get newAlbumDialogTitle => 'Nuovo album'; + + @override + String get newAlbumDialogNameLabel => 'Nome album'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album già esistente'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'La cartella esiste già'; + + @override + String get newAlbumDialogStorageLabel => 'Archiviazione:'; + + @override + String get newDynamicAlbumDialogTitle => 'Nuovo album dinamico'; + + @override + String get dynamicAlbumAlreadyExists => 'Album dinamico già esistente'; + + @override + String get newGroupDialogTitle => 'Nuovo gruppo'; + + @override + String get newGroupDialogNameLabel => 'Nome gruppo'; + + @override + String get groupAlreadyExists => 'Gruppo già esistente'; + + @override + String get groupEmpty => 'Nessun gruppo'; + + @override + String get ungrouped => 'Non raggruppato'; + + @override + String get groupPickerTitle => 'Scegli gruppo'; + + @override + String get groupPickerUseThisGroupButton => 'Usa questo gruppo'; + + @override + String get newVaultWarningDialogMessage => 'Gli elementi nelle cassaforti sono disponibili solo per questa app e non per altre.\n\nSe disinstalli l’app o cancelli i relativi dati, perderai tutti questi elementi.'; + + @override + String get newVaultDialogTitle => 'Nuova Cassaforte'; + + @override + String get configureVaultDialogTitle => 'Configura Cassaforte'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Blocca allo spegnimento dello schermo'; + + @override + String get vaultDialogLockTypeLabel => 'Tipo di protezione'; + + @override + String get patternDialogEnter => 'Inserisci sequenza'; + + @override + String get patternDialogConfirm => 'Conferma sequenza'; + + @override + String get pinDialogEnter => 'Inserisci PIN'; + + @override + String get pinDialogConfirm => 'Conferma PIN'; + + @override + String get passwordDialogEnter => 'Inserisci password'; + + @override + String get passwordDialogConfirm => 'Conferma password'; + + @override + String get authenticateToConfigureVault => 'Accedi per configurare la cassaforte'; + + @override + String get authenticateToUnlockVault => 'Accedi per sbloccare la cassaforte'; + + @override + String get vaultBinUsageDialogMessage => 'Alcune casseforti stanno usando il cestino.'; + + @override + String get renameAlbumDialogLabel => 'Nuovo nome'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'La cartella esiste già'; + + @override + String get renameEntrySetPageTitle => 'Rinomina'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Schema nomi'; + + @override + String get renameEntrySetPageInsertTooltip => 'Inserisci campo'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Anteprima'; + + @override + String get renameProcessorCounter => 'Contatore'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Nome'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Vuoi eliminare questo album e i relativi $countString elementi?', + one: 'Vuoi eliminare questo album e il relativo elemento?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Vuoi eliminare questi album e i relativi $countString elementi?', + one: 'Vuoi eliminare questi album e il relativo elemento?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Formato:'; + + @override + String get exportEntryDialogWidth => 'Larghezza'; + + @override + String get exportEntryDialogHeight => 'Altezza'; + + @override + String get exportEntryDialogQuality => 'Qualità'; + + @override + String get exportEntryDialogWriteMetadata => 'Scrivi metadati'; + + @override + String get renameEntryDialogLabel => 'Nuovo nome'; + + @override + String get editEntryDialogCopyFromItem => 'Copia da un altro elemento'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Campi da modificare'; + + @override + String get editEntryDateDialogTitle => 'Data e ora'; + + @override + String get editEntryDateDialogSetCustom => 'Imposta data personalizzata'; + + @override + String get editEntryDateDialogCopyField => 'Copia da un’altra data'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Estrai dal titolo'; + + @override + String get editEntryDateDialogShift => 'Sfasamento'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Data modifica file'; + + @override + String get durationDialogHours => 'Ore'; + + @override + String get durationDialogMinutes => 'Minuti'; + + @override + String get durationDialogSeconds => 'Secondi'; + + @override + String get editEntryLocationDialogTitle => 'Posizione'; + + @override + String get editEntryLocationDialogSetCustom => 'Imposta posizione personalizzata'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Scegli sulla mappa'; + + @override + String get editEntryLocationDialogImportGpx => 'Importa GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitudine'; + + @override + String get editEntryLocationDialogLongitude => 'Longitudine'; + + @override + String get editEntryLocationDialogTimeShift => 'Scostamento tempo'; + + @override + String get locationPickerUseThisLocationButton => 'Usa questa posizione'; + + @override + String get editEntryRatingDialogTitle => 'Valutazione'; + + @override + String get removeEntryMetadataDialogTitle => 'Rimozione metadati'; + + @override + String get removeEntryMetadataDialogAll => 'Tutti'; + + @override + String get removeEntryMetadataDialogMore => 'Altro'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'Per riprodurre il video all’interno di una foto in movimento è richiesto XMP .\n\nSei sicuro di volerlo rimuovere?'; + + @override + String get videoSpeedDialogLabel => 'Velocità riproduzione'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Sottotitoli'; + + @override + String get videoStreamSelectionDialogOff => 'Spento'; + + @override + String get videoStreamSelectionDialogTrack => 'Traccia'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Non ci sono altre tracce.'; + + @override + String get genericSuccessFeedback => 'Fatto!'; + + @override + String get genericFailureFeedback => 'Fallito'; + + @override + String get genericDangerWarningDialogMessage => 'Sei sicuro?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Riprova con meno elementi.'; + + @override + String get menuActionConfigureView => 'Vista'; + + @override + String get menuActionSelect => 'Seleziona'; + + @override + String get menuActionSelectAll => 'Seleziona tutto'; + + @override + String get menuActionSelectNone => 'Deseleziona tutto'; + + @override + String get menuActionMap => 'Mappa'; + + @override + String get menuActionSlideshow => 'Presentazione'; + + @override + String get menuActionStats => 'Statistiche'; + + @override + String get viewDialogSortSectionTitle => 'Ordina'; + + @override + String get viewDialogGroupSectionTitle => 'Sezioni'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Inverti ordinamento'; + + @override + String get tileLayoutMosaic => 'Mosaico'; + + @override + String get tileLayoutGrid => 'Griglia'; + + @override + String get tileLayoutList => 'Elenco'; + + @override + String get castDialogTitle => 'Dispositivi Cast'; + + @override + String get coverDialogTabCover => 'Copertina'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Colore'; + + @override + String get appPickDialogTitle => 'Seleziona app'; + + @override + String get appPickDialogNone => 'Nessuna'; + + @override + String get aboutPageTitle => 'Informazioni'; + + @override + String get aboutLinkLicense => 'Licenza'; + + @override + String get aboutLinkPolicy => 'Informativa sulla privacy'; + + @override + String get aboutBugSectionTitle => 'Segnalazione bug'; + + @override + String get aboutBugSaveLogInstruction => 'Salva registri app in un file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copia informazioni sistema'; + + @override + String get aboutBugCopyInfoButton => 'Copia'; + + @override + String get aboutBugReportInstruction => 'Segnala su GitHub con i registri e le info di sistema'; + + @override + String get aboutBugReportButton => 'Segnala'; + + @override + String get aboutDataUsageSectionTitle => 'Uso dati'; + + @override + String get aboutDataUsageData => 'Dati'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Varie'; + + @override + String get aboutDataUsageInternal => 'Interno'; + + @override + String get aboutDataUsageExternal => 'Esterno'; + + @override + String get aboutDataUsageClearCache => 'Svuota cache'; + + @override + String get aboutCreditsSectionTitle => 'Ringraziamenti'; + + @override + String get aboutCreditsWorldAtlas1 => 'Questa applicazione usa un file TopoJSON di'; + + @override + String get aboutCreditsWorldAtlas2 => 'sotto licenza ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'Traduttori'; + + @override + String get aboutLicensesSectionTitle => 'Licenze open-source'; + + @override + String get aboutLicensesBanner => 'Questa applicazione usa i seguenti pacchetti e librerie open-source.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Librerie Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Plugin Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Pacchetti Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Pacchetti Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Visualizza tutte le licenze'; + + @override + String get policyPageTitle => 'Informativa sulla privacy'; + + @override + String get collectionPageTitle => 'Collezione'; + + @override + String get collectionPickPageTitle => 'Seleziona'; + + @override + String get collectionSelectPageTitle => 'Seleziona elementi'; + + @override + String get collectionActionShowTitleSearch => 'Visualizza filtro titoli'; + + @override + String get collectionActionHideTitleSearch => 'Nascondi filtro titoli'; + + @override + String get collectionActionAddDynamicAlbum => 'Aggiungi album dinamico'; + + @override + String get collectionActionAddShortcut => 'Aggiungi collegamento'; + + @override + String get collectionActionSetHome => 'Imposta come pagina iniziale'; + + @override + String get collectionActionEmptyBin => 'Svuota cestino'; + + @override + String get collectionActionCopy => 'Copia nell’album'; + + @override + String get collectionActionMove => 'Sposta nell’album'; + + @override + String get collectionActionRescan => 'Riscansiona'; + + @override + String get collectionActionEdit => 'Modifica'; + + @override + String get collectionSearchTitlesHintText => 'Cerca titoli'; + + @override + String get collectionGroupAlbum => 'Per album'; + + @override + String get collectionGroupMonth => 'Per mese'; + + @override + String get collectionGroupDay => 'Per giorno'; + + @override + String get sectionNone => 'Nessuna sezione'; + + @override + String get sectionUnknown => 'Sconosciuto'; + + @override + String get dateToday => 'Oggi'; + + @override + String get dateYesterday => 'Ieri'; + + @override + String get dateThisMonth => 'Questo mese'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Impossibile eliminare $countString elementi', + one: 'Impossibile eliminare 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Impossibile copiare $countString elementi', + one: 'Impossibile copiare 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Impossibile spostare $countString elementi', + one: 'Impossibile spostare 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Impossibile rinominare $countString elementi', + one: 'Impossibile rinominare 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Impossibile modificare $countString elementi', + one: 'Impossibile modificare 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Impossibile esportare $countString elementi', + one: 'Impossibile esportare 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copiati $countString elementi', + one: 'Copiato 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Spostati $countString elementi', + one: 'Spostato 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Rinominati $countString elementi', + one: 'Rinominato 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Modificati $countString elementi', + one: 'Modificato 1 elemento', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Nessun preferito'; + + @override + String get collectionEmptyVideos => 'Nessun video'; + + @override + String get collectionEmptyImages => 'Nessuna immagine'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Consenti accesso'; + + @override + String get collectionSelectSectionTooltip => 'Seleziona sezione'; + + @override + String get collectionDeselectSectionTooltip => 'Deseleziona sezione'; + + @override + String get drawerAboutButton => 'Info'; + + @override + String get drawerSettingsButton => 'Impostazioni'; + + @override + String get drawerCollectionAll => 'Tutte le collezioni'; + + @override + String get drawerCollectionFavourites => 'Preferiti'; + + @override + String get drawerCollectionImages => 'Immagini'; + + @override + String get drawerCollectionVideos => 'Video'; + + @override + String get drawerCollectionAnimated => 'Animazioni'; + + @override + String get drawerCollectionMotionPhotos => 'Foto in movimento'; + + @override + String get drawerCollectionPanoramas => 'Panorami'; + + @override + String get drawerCollectionRaws => 'Foto raw'; + + @override + String get drawerCollectionSphericalVideos => 'Video a 360°'; + + @override + String get drawerAlbumPage => 'Album'; + + @override + String get drawerCountryPage => 'Paesi'; + + @override + String get drawerPlacePage => 'Luoghi'; + + @override + String get drawerTagPage => 'Etichette'; + + @override + String get sortByDate => 'Per data'; + + @override + String get sortByName => 'Per nome'; + + @override + String get sortByItemCount => 'Per numero elementi'; + + @override + String get sortBySize => 'Per dimensione'; + + @override + String get sortByAlbumFileName => 'Per album e nome file'; + + @override + String get sortByRating => 'Per valutazione'; + + @override + String get sortByDuration => 'Per durata'; + + @override + String get sortByPath => 'Per percorso'; + + @override + String get sortOrderNewestFirst => 'Dal più nuovo'; + + @override + String get sortOrderOldestFirst => 'Dal più vecchio'; + + @override + String get sortOrderAtoZ => 'Dalla A alla Z'; + + @override + String get sortOrderZtoA => 'Dalla Z alla A'; + + @override + String get sortOrderHighestFirst => 'Dalla più alta'; + + @override + String get sortOrderLowestFirst => 'Dalla più bassa'; + + @override + String get sortOrderLargestFirst => 'Dal più grande'; + + @override + String get sortOrderSmallestFirst => 'Dal più piccolo'; + + @override + String get sortOrderShortestFirst => 'Dal più corto'; + + @override + String get sortOrderLongestFirst => 'Dal più lungo'; + + @override + String get albumGroupTier => 'Per importanza'; + + @override + String get albumGroupType => 'Per tipo'; + + @override + String get albumGroupVolume => 'Per volume archiviazione'; + + @override + String get albumMimeTypeMixed => 'Misto'; + + @override + String get albumPickPageTitleCopy => 'Copia nell’album'; + + @override + String get albumPickPageTitleExport => 'Esporta nell’album'; + + @override + String get albumPickPageTitleMove => 'Sposta nell’album'; + + @override + String get albumPickPageTitlePick => 'Seleziona album'; + + @override + String get albumCamera => 'Fotocamera'; + + @override + String get albumDownload => 'Scaricati'; + + @override + String get albumScreenshots => 'Schermate'; + + @override + String get albumScreenRecordings => 'Registrazioni schermo'; + + @override + String get albumVideoCaptures => 'Catture video'; + + @override + String get albumPageTitle => 'Album'; + + @override + String get albumEmpty => 'Nessun album'; + + @override + String get createAlbumButtonLabel => 'CREA'; + + @override + String get newFilterBanner => 'nuovo'; + + @override + String get countryPageTitle => 'Paesi'; + + @override + String get countryEmpty => 'Nessun paese'; + + @override + String get statePageTitle => 'Stati'; + + @override + String get stateEmpty => 'Nessuno stato'; + + @override + String get placePageTitle => 'Luoghi'; + + @override + String get placeEmpty => 'Nessun luogo'; + + @override + String get tagPageTitle => 'Etichette'; + + @override + String get tagEmpty => 'Nessuna etichetta'; + + @override + String get tagPickPageTitle => 'Seleziona etichetta'; + + @override + String get binPageTitle => 'Cestino'; + + @override + String get explorerPageTitle => 'Gestione file'; + + @override + String get explorerActionSelectStorageVolume => 'Seleziona supporto'; + + @override + String get selectStorageVolumeDialogTitle => 'Seleziona supporto'; + + @override + String get searchCollectionFieldHint => 'Cerca collezione'; + + @override + String get searchRecentSectionTitle => 'Recenti'; + + @override + String get searchDateSectionTitle => 'Data'; + + @override + String get searchFormatSectionTitle => 'Formati'; + + @override + String get searchAlbumsSectionTitle => 'Album'; + + @override + String get searchCountriesSectionTitle => 'Paesi'; + + @override + String get searchStatesSectionTitle => 'Stati'; + + @override + String get searchPlacesSectionTitle => 'Luoghi'; + + @override + String get searchTagsSectionTitle => 'Etichette'; + + @override + String get searchRatingSectionTitle => 'Valutazioni'; + + @override + String get searchMetadataSectionTitle => 'Metadati'; + + @override + String get settingsPageTitle => 'Impostazioni'; + + @override + String get settingsSystemDefault => 'Predefinito sistema'; + + @override + String get settingsDefault => 'Predefinito'; + + @override + String get settingsDisabled => 'Disabilitato'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Chiedi sempre'; + + @override + String get settingsModificationWarningDialogMessage => 'Saranno modificate le altre impostazioni.'; + + @override + String get settingsSearchFieldLabel => 'Ricerca impostazioni'; + + @override + String get settingsSearchEmpty => 'Nessuna impostazione corrispondente'; + + @override + String get settingsActionExport => 'Esporta'; + + @override + String get settingsActionExportDialogTitle => 'Esporta'; + + @override + String get settingsActionImport => 'Importa'; + + @override + String get settingsActionImportDialogTitle => 'Importa'; + + @override + String get appExportCovers => 'Copertine'; + + @override + String get appExportDynamicAlbums => 'Album dinamici'; + + @override + String get appExportFavourites => 'Preferiti'; + + @override + String get appExportSettings => 'Impostazioni'; + + @override + String get settingsNavigationSectionTitle => 'Navigazione'; + + @override + String get settingsHomeTile => 'Pagina iniziale'; + + @override + String get settingsHomeDialogTitle => 'Pagina iniziale'; + + @override + String get setHomeCustom => 'Personalizzato'; + + @override + String get settingsKeepScreenOnTile => 'Mantieni acceso lo schermo'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Mantieni schermo acceso'; + + @override + String get settingsDoubleBackExit => 'Tocca «indietro» due volte per uscire'; + + @override + String get settingsConfirmationTile => 'Richieste conferma'; + + @override + String get settingsConfirmationDialogTitle => 'Richieste conferma'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Chiedi prima di eliminare gli elementi definitivamente'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Chiedi prima di spostare gli elementi nel cestino'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Chiedi prima di spostare gli elementi senza data'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Visualizza un messaggio dopo aver spostato gli elementi nel cestino'; + + @override + String get settingsConfirmationVaultDataLoss => 'Visualizza avviso perdita dati delle casseforti'; + + @override + String get settingsNavigationDrawerTile => 'Menu navigazione'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Menu navigazione'; + + @override + String get settingsNavigationDrawerBanner => 'Tocca e tieni premuto per spostare e riordinare gli elementi del menu.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Tipi'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Album'; + + @override + String get settingsNavigationDrawerTabPages => 'Pagine'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Aggiungi album'; + + @override + String get settingsNavigationBottomActionsTile => 'Navigazione in basso'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Navigazione in basso'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono visualizzate nella barra di navigazione in basso.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniature'; + + @override + String get settingsThumbnailOverlayTile => 'Sovrapposizione'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Sovrapposizione'; + + @override + String get settingsThumbnailShowHdrIcon => 'Visualizza icona HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Visualizza icona Preferiti'; + + @override + String get settingsThumbnailShowTagIcon => 'Visualizza icona Etichetta'; + + @override + String get settingsThumbnailShowLocationIcon => 'Visualizza icona Posizione'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Viusalizza icona Foto in movimento'; + + @override + String get settingsThumbnailShowRating => 'Visualizza Valutazione'; + + @override + String get settingsThumbnailShowRawIcon => 'Visualizza icona Raw'; + + @override + String get settingsThumbnailShowVideoDuration => 'Visualizza durata video'; + + @override + String get settingsCollectionQuickActionsTile => 'Azioni rapide'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Azioni rapide'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Navigazione'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selezione'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono visualizzate durante la navigazione degli elementi.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono visualizzate quando si selezionano gli elementi.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Modelli burst'; + + @override + String get settingsCollectionBurstPatternsNone => 'Nessuno'; + + @override + String get settingsViewerSectionTitle => 'Visualizzazione'; + + @override + String get settingsViewerGestureSideTapNext => 'Tocca i bordi dello schermo per visualizzare l’elemento precedente/successivo'; + + @override + String get settingsViewerUseCutout => 'Usa area ritagliata'; + + @override + String get settingsViewerMaximumBrightness => 'Luminosità massima'; + + @override + String get settingsMotionPhotoAutoPlay => 'Riproduzione automatica foto in movimento'; + + @override + String get settingsImageBackground => 'Sfondo immagine'; + + @override + String get settingsViewerQuickActionsTile => 'Azioni rapide'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Azioni rapide'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono visualizzate nel visualizzatore.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Pulsanti visualizzati'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Pulsanti disponibili'; + + @override + String get settingsViewerQuickActionEmpty => 'Nessun pulsante'; + + @override + String get settingsViewerOverlayTile => 'Sovrapposizione'; + + @override + String get settingsViewerOverlayPageTitle => 'Sovrapposizione'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Visualizza all’apertura'; + + @override + String get settingsViewerShowHistogram => 'Visualizza istogramma'; + + @override + String get settingsViewerShowMinimap => 'Visualizza minimappa'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Visualizza informazioni'; + + @override + String get settingsViewerShowInformationSubtitle => 'Visualizza titolo, data, posizione, ecc.'; + + @override + String get settingsViewerShowRatingTags => 'Visualizza valutazione e etichette'; + + @override + String get settingsViewerShowShootingDetails => 'Visualizza dettagli scatto'; + + @override + String get settingsViewerShowDescription => 'Visualizza descrizione'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Visualizza miniature'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Effetto sfocatura'; + + @override + String get settingsViewerSlideshowTile => 'Presentazione'; + + @override + String get settingsViewerSlideshowPageTitle => 'Presentazione'; + + @override + String get settingsSlideshowRepeat => 'Ripeti'; + + @override + String get settingsSlideshowShuffle => 'Ordine casuale'; + + @override + String get settingsSlideshowFillScreen => 'Riempi schermo'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Effetto ingrandimento animato'; + + @override + String get settingsSlideshowTransitionTile => 'Transizione'; + + @override + String get settingsSlideshowIntervalTile => 'Intervallo'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Riproduzione video'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Riproduzione video'; + + @override + String get settingsVideoPageTitle => 'Impostazioni video'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Visualizza video'; + + @override + String get settingsVideoPlaybackTile => 'Riproduzione'; + + @override + String get settingsVideoPlaybackPageTitle => 'Riproduzione'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Accelerazione hardware'; + + @override + String get settingsVideoAutoPlay => 'Riproduzione automatica'; + + @override + String get settingsVideoLoopModeTile => 'Modalità loop'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Modalità loop'; + + @override + String get settingsVideoResumptionModeTile => 'Riprendi riproduzione'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Riprendi riproduzione'; + + @override + String get settingsVideoBackgroundMode => 'Modalità sottofondo'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Modalità sottofondo'; + + @override + String get settingsVideoControlsTile => 'Controlli'; + + @override + String get settingsVideoControlsPageTitle => 'Controlli'; + + @override + String get settingsVideoButtonsTile => 'Pulsanti'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Doppio tocco riproduci/pausa'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Doppio tocco sui bordi dello schermo per cercare avanti/indietro'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Trascina su o giù per regolare luminosità/volume'; + + @override + String get settingsSubtitleThemeTile => 'Sottotitoli'; + + @override + String get settingsSubtitleThemePageTitle => 'Sottotitoli'; + + @override + String get settingsSubtitleThemeSample => 'Questo è un campione.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Allineamento testo'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Allineamento testo'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Posizione testo'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Posizione testo'; + + @override + String get settingsSubtitleThemeTextSize => 'Dimensione testo'; + + @override + String get settingsSubtitleThemeShowOutline => 'Visualizza contorno e ombra'; + + @override + String get settingsSubtitleThemeTextColor => 'Colore testo'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Opacità testo'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Colore sfondo'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Opacità sfondo'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Sinistra'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Centro'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Destra'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Consenti l’accesso all’inventario app'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Usato per migliorare la visualizzazione album'; + + @override + String get settingsAllowErrorReporting => 'Consenti segnalazione anonima errori'; + + @override + String get settingsSaveSearchHistory => 'Salva cronologia ricerche'; + + @override + String get settingsEnableBin => 'Usa cestino'; + + @override + String get settingsEnableBinSubtitle => 'Conserva elementi eliminati per 30 giorni'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Gli elementi nel cestino verranno eliminati permanentemente.'; + + @override + String get settingsAllowMediaManagement => 'Consenti gestione media'; + + @override + String get settingsHiddenItemsTile => 'Elementi nascosti'; + + @override + String get settingsHiddenItemsPageTitle => 'Elementi nascosti'; + + @override + String get settingsHiddenFiltersBanner => 'Le foto e i video che corrispondono ai filtri nascosti non appariranno nella collezione.'; + + @override + String get settingsHiddenFiltersEmpty => 'Nessun filtro nascosto'; + + @override + String get settingsStorageAccessTile => 'Accesso a tutti i file'; + + @override + String get settingsStorageAccessPageTitle => 'Accesso a tutti i file'; + + @override + String get settingsStorageAccessBanner => 'Alcune cartelle per modificare i file al loro interno richiedono una concessione di accesso esplicita. Puoi rivedere qui le cartelle a cui hai dato accesso in precedenza.'; + + @override + String get settingsStorageAccessEmpty => 'Nessuna autorizzazione concessa'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Rifiuta autorizzazione'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibilità'; + + @override + String get settingsRemoveAnimationsTile => 'Rimuovi animazioni'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Rimuovi animazioni'; + + @override + String get settingsTimeToTakeActionTile => 'Tempo reazione'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Visualizza gesti multi touch alternativi'; + + @override + String get settingsDisplaySectionTitle => 'Schermo'; + + @override + String get settingsThemeBrightnessTile => 'Tema'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Tema'; + + @override + String get settingsThemeColorHighlights => 'Colori evidenziati'; + + @override + String get settingsThemeEnableDynamicColor => 'Colori dinamici'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Frequenza aggiornamento schermo'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Frequenza aggiornamento'; + + @override + String get settingsDisplayUseTvInterface => 'Interfaccia Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Lingua e formati'; + + @override + String get settingsLanguageTile => 'Lingua'; + + @override + String get settingsLanguagePageTitle => 'Lingua'; + + @override + String get settingsCoordinateFormatTile => 'Formato coordinate'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Formato coordinate'; + + @override + String get settingsUnitSystemTile => 'Unità'; + + @override + String get settingsUnitSystemDialogTitle => 'Unità'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Forza numeri arabi'; + + @override + String get settingsScreenSaverPageTitle => 'Salvaschermo'; + + @override + String get settingsWidgetPageTitle => 'Cornice foto'; + + @override + String get settingsWidgetShowOutline => 'Contorno'; + + @override + String get settingsWidgetOpenPage => 'Quando tocchi il widget'; + + @override + String get settingsWidgetDisplayedItem => 'Elemento visualizzato'; + + @override + String get settingsCollectionTile => 'Collezione'; + + @override + String get statsPageTitle => 'Statistiche'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString elementi con posizione', + one: '1 elemento con posizione', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Paesi più frequenti'; + + @override + String get statsTopStatesSectionTitle => 'Stati più frequenti'; + + @override + String get statsTopPlacesSectionTitle => 'Luoghi più frequenti'; + + @override + String get statsTopTagsSectionTitle => 'Etichette più frequenti'; + + @override + String get statsTopAlbumsSectionTitle => 'Album più frequenti'; + + @override + String get viewerOpenPanoramaButtonLabel => 'APRI PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'IMPOSTA SFONDO'; + + @override + String get viewerErrorUnknown => 'Ops!'; + + @override + String get viewerErrorDoesNotExist => 'Il file non esiste più.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Torna alla visualizzazione'; + + @override + String get viewerInfoUnknown => 'sconosciuto'; + + @override + String get viewerInfoLabelDescription => 'Descrizione'; + + @override + String get viewerInfoLabelTitle => 'Titolo'; + + @override + String get viewerInfoLabelDate => 'Data'; + + @override + String get viewerInfoLabelResolution => 'Risoluzione'; + + @override + String get viewerInfoLabelSize => 'Dimensione'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Percorso'; + + @override + String get viewerInfoLabelDuration => 'Durata'; + + @override + String get viewerInfoLabelOwner => 'Proprietario'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinate'; + + @override + String get viewerInfoLabelAddress => 'Indirizzo'; + + @override + String get mapStyleDialogTitle => 'Stile mappa'; + + @override + String get mapStyleDialogAddStyle => 'Aggiungi stile'; + + @override + String get mapStyleTooltip => 'Seleziona stile mappa'; + + @override + String get mapStyleEditorDialogName => 'Nome'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Sottodomini'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Ingrandisci'; + + @override + String get mapZoomOutTooltip => 'Riduci'; + + @override + String get mapPointNorthUpTooltip => 'Punta a nord verso l’alto'; + + @override + String get mapAttributionOsmData => 'Dati della mappa © collaboratori di [OpenStreetMap](https://www.openstreetmap.org/copyright)'; + + @override + String get mapAttributionOsmLiberty => 'Tasselli di [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Ospitato da [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tasselli di [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tasselli di [HOT](https://www.hotosm.org/) • Ospitato da [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Titoli di [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Visualizza nella pagina della mappa'; + + @override + String get mapEmptyRegion => 'Nessuna immagine in questa regione'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Estrazione dati incorporati fallita'; + + @override + String get viewerInfoOpenLinkText => 'Apri'; + + @override + String get viewerInfoViewXmlLinkText => 'Visualizza XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Ricerca metadati'; + + @override + String get viewerInfoSearchEmpty => 'Nessuna chiave corrispondente'; + + @override + String get viewerInfoSearchSuggestionDate => 'Data e ora'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Descrizione'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensioni'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Risoluzione'; + + @override + String get viewerInfoSearchSuggestionRights => 'Diritti'; + + @override + String get wallpaperUseScrollEffect => 'Usa effetto di scorrimento nella schermata iniziale'; + + @override + String get tagEditorPageTitle => 'Modifica etichette'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Nuova etichetta'; + + @override + String get tagEditorPageAddTagTooltip => 'Aggiungi etichetta'; + + @override + String get tagEditorSectionRecent => 'Recenti'; + + @override + String get tagEditorSectionPlaceholders => 'Segnaposti'; + + @override + String get tagEditorDiscardDialogMessage => 'Vuoi scartare le modifiche?'; + + @override + String get tagPlaceholderCountry => 'Paese'; + + @override + String get tagPlaceholderState => 'Stato'; + + @override + String get tagPlaceholderPlace => 'Luogo'; + + @override + String get panoramaEnableSensorControl => 'Abilita controllo sensore'; + + @override + String get panoramaDisableSensorControl => 'Disabilita controllo sensore'; + + @override + String get sourceViewerPageTitle => 'Codice sorgente'; +} diff --git a/lib/l10ngen/app_localizations_ja.dart b/lib/l10ngen/app_localizations_ja.dart new file mode 100644 index 0000000..98deb15 --- /dev/null +++ b/lib/l10ngen/app_localizations_ja.dart @@ -0,0 +1,2404 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Japanese (`ja`). +class AppLocalizationsJa extends AppLocalizations { + AppLocalizationsJa([String locale = 'ja']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Avesへようこそ'; + + @override + String get welcomeOptional => 'オプション'; + + @override + String get welcomeTermsToggle => '利用規約に同意する'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 件のアイテム', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 列', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 秒', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 分', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 日', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => '適用'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => '削除'; + + @override + String get nextButtonLabel => '次へ'; + + @override + String get showButtonLabel => '表示'; + + @override + String get hideButtonLabel => '非表示'; + + @override + String get continueButtonLabel => '続ける'; + + @override + String get saveCopyButtonLabel => 'コピーを保存'; + + @override + String get applyTooltip => '適用する'; + + @override + String get cancelTooltip => 'キャンセル'; + + @override + String get changeTooltip => '変更'; + + @override + String get clearTooltip => 'クリア'; + + @override + String get previousTooltip => '前へ'; + + @override + String get nextTooltip => '次へ'; + + @override + String get showTooltip => '表示する'; + + @override + String get hideTooltip => '非表示にする'; + + @override + String get actionRemove => '削除'; + + @override + String get resetTooltip => 'リセット'; + + @override + String get saveTooltip => '保存'; + + @override + String get stopTooltip => '停止'; + + @override + String get pickTooltip => 'ピック'; + + @override + String get doubleBackExitMessage => '終了するには「戻る」をもう一度タップしてください。'; + + @override + String get doNotAskAgain => '今後このメッセージを表示しない'; + + @override + String get sourceStateLoading => '読み込み中'; + + @override + String get sourceStateCataloguing => '分類中'; + + @override + String get sourceStateLocatingCountries => '国、地域を確認中'; + + @override + String get sourceStateLocatingPlaces => '場所を確認中'; + + @override + String get chipActionDelete => '削除'; + + @override + String get chipActionRemove => '削除'; + + @override + String get chipActionShowCollection => 'コレクションで表示'; + + @override + String get chipActionGoToAlbumPage => 'アルバム別に表示'; + + @override + String get chipActionGoToCountryPage => '国地域別に表示'; + + @override + String get chipActionGoToPlacePage => '場所別に表示'; + + @override + String get chipActionGoToTagPage => 'タグ別に表示'; + + @override + String get chipActionGoToExplorerPage => 'エクスプローラーで表示'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => '除外する'; + + @override + String get chipActionFilterIn => 'フィルター'; + + @override + String get chipActionHide => '非表示'; + + @override + String get chipActionLock => 'ロック'; + + @override + String get chipActionPin => '一番上に固定'; + + @override + String get chipActionUnpin => '一番上への固定を解除'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => '名前を変更'; + + @override + String get chipActionSetCover => 'カバーを設定'; + + @override + String get chipActionShowCountryStates => '地域を表示'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'アルバムを作成'; + + @override + String get chipActionCreateVault => '保管庫を作成'; + + @override + String get chipActionConfigureVault => '保管庫を設定'; + + @override + String get entryActionCopyToClipboard => 'クリップボードにコピー'; + + @override + String get entryActionDelete => '削除'; + + @override + String get entryActionConvert => '変換'; + + @override + String get entryActionExport => 'エクスポート'; + + @override + String get entryActionInfo => '情報'; + + @override + String get entryActionRename => '名前を変更'; + + @override + String get entryActionRestore => '元に戻す'; + + @override + String get entryActionRotateCCW => '反時計回りに回転'; + + @override + String get entryActionRotateCW => '時計回りに回転'; + + @override + String get entryActionFlip => '水平方向に反転'; + + @override + String get entryActionPrint => '印刷'; + + @override + String get entryActionShare => '共有'; + + @override + String get entryActionShareImageOnly => '画像のみ共有'; + + @override + String get entryActionShareVideoOnly => '動画のみ共有'; + + @override + String get entryActionViewSource => 'ソースを表示'; + + @override + String get entryActionShowGeoTiffOnMap => '地図のオーバーレイとして表示'; + + @override + String get entryActionConvertMotionPhotoToStillImage => '静止画に変換'; + + @override + String get entryActionViewMotionPhotoVideo => '動画を開く'; + + @override + String get entryActionEdit => '編集'; + + @override + String get entryActionOpen => 'アプリで開く'; + + @override + String get entryActionSetAs => '登録'; + + @override + String get entryActionCast => 'キャスト'; + + @override + String get entryActionOpenMap => '地図アプリで表示'; + + @override + String get entryActionRotateScreen => '画面を回転'; + + @override + String get entryActionAddFavourite => 'お気に入りに追加'; + + @override + String get entryActionRemoveFavourite => 'お気に入りから削除'; + + @override + String get videoActionCaptureFrame => 'フレームをキャプチャ'; + + @override + String get videoActionMute => 'ミュート'; + + @override + String get videoActionUnmute => 'ミュート解除'; + + @override + String get videoActionPause => '一時停止'; + + @override + String get videoActionPlay => '再生'; + + @override + String get videoActionReplay10 => '10 秒前に戻る'; + + @override + String get videoActionSkip10 => '10 秒前に進む'; + + @override + String get videoActionShowPreviousFrame => '前のフレームを表示'; + + @override + String get videoActionShowNextFrame => '次のフレームを表示'; + + @override + String get videoActionSelectStreams => 'トラックを選択'; + + @override + String get videoActionSetSpeed => '再生速度'; + + @override + String get videoActionABRepeat => 'A-B リピート'; + + @override + String get videoRepeatActionSetStart => '開始点を設定'; + + @override + String get videoRepeatActionSetEnd => '終点を設定'; + + @override + String get viewerActionSettings => '設定'; + + @override + String get viewerActionLock => 'ビューをロック'; + + @override + String get viewerActionUnlock => 'ビューをアンロック'; + + @override + String get slideshowActionResume => '再開'; + + @override + String get slideshowActionShowInCollection => 'コレクションで表示'; + + @override + String get entryInfoActionEditDate => '日時を編集'; + + @override + String get entryInfoActionEditLocation => '位置情報を編集'; + + @override + String get entryInfoActionEditTitleDescription => 'タイトルと説明を編集'; + + @override + String get entryInfoActionEditRating => '評価を編集'; + + @override + String get entryInfoActionEditTags => 'タグを編集'; + + @override + String get entryInfoActionRemoveMetadata => 'メタデータを削除'; + + @override + String get entryInfoActionExportMetadata => 'メタデータをエクスポート'; + + @override + String get entryInfoActionRemoveLocation => '位置情報を削除'; + + @override + String get editorActionTransform => '変換'; + + @override + String get editorTransformCrop => '切り取り'; + + @override + String get editorTransformRotate => '回転'; + + @override + String get cropAspectRatioFree => 'フリー'; + + @override + String get cropAspectRatioOriginal => 'オリジナル'; + + @override + String get cropAspectRatioSquare => '正方形'; + + @override + String get filterAspectRatioLandscapeLabel => '横向き'; + + @override + String get filterAspectRatioPortraitLabel => '縦向き'; + + @override + String get filterBinLabel => 'ごみ箱'; + + @override + String get filterFavouriteLabel => 'お気に入り'; + + @override + String get filterNoDateLabel => '日付なし'; + + @override + String get filterNoAddressLabel => 'アドレスなし'; + + @override + String get filterLocatedLabel => '位置情報あり'; + + @override + String get filterNoLocationLabel => '位置情報なし'; + + @override + String get filterNoRatingLabel => '評価情報なし'; + + @override + String get filterTaggedLabel => 'タグ付き'; + + @override + String get filterNoTagLabel => 'タグ情報なし'; + + @override + String get filterNoTitleLabel => 'タイトルなし'; + + @override + String get filterOnThisDayLabel => '過去のこの日'; + + @override + String get filterRecentlyAddedLabel => '最近追加'; + + @override + String get filterRatingRejectedLabel => '拒否'; + + @override + String get filterTypeAnimatedLabel => 'アニメーション'; + + @override + String get filterTypeMotionPhotoLabel => 'モーションフォト'; + + @override + String get filterTypePanoramaLabel => 'パノラマ'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° 動画'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => '画像'; + + @override + String get filterMimeVideoLabel => '動画'; + + @override + String get accessibilityAnimationsRemove => '画面効果を表示しない'; + + @override + String get accessibilityAnimationsKeep => '画面効果を表示'; + + @override + String get albumTierNew => '新規'; + + @override + String get albumTierPinned => '固定'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => '全体'; + + @override + String get albumTierApps => 'アプリ'; + + @override + String get albumTierVaults => '保管庫'; + + @override + String get albumTierDynamic => 'ダイナミック'; + + @override + String get albumTierRegular => 'その他'; + + @override + String get coordinateFormatDms => '度分秒'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => '十進角'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$direction$coordinate'; + } + + @override + String get coordinateDmsNorth => '北緯'; + + @override + String get coordinateDmsSouth => '南緯'; + + @override + String get coordinateDmsEast => '東経'; + + @override + String get coordinateDmsWest => '西経'; + + @override + String get displayRefreshRatePreferHighest => '高レート'; + + @override + String get displayRefreshRatePreferLowest => '低レート'; + + @override + String get keepScreenOnNever => '自動オフ'; + + @override + String get keepScreenOnVideoPlayback => '動画再生時'; + + @override + String get keepScreenOnViewerOnly => 'ビューアー表示中のみ'; + + @override + String get keepScreenOnAlways => '常にオン'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google マップ'; + + @override + String get mapStyleGoogleHybrid => 'Google マップ(ハイブリッド)'; + + @override + String get mapStyleGoogleTerrain => 'Google マップ(地形)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => '無効'; + + @override + String get maxBrightnessAlways => '常時有効'; + + @override + String get nameConflictStrategyRename => '名前を変更'; + + @override + String get nameConflictStrategyReplace => '置換'; + + @override + String get nameConflictStrategySkip => 'スキップ'; + + @override + String get overlayHistogramNone => 'なし'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => '明るさ'; + + @override + String get subtitlePositionTop => 'トップ'; + + @override + String get subtitlePositionBottom => '下'; + + @override + String get themeBrightnessLight => 'ライト'; + + @override + String get themeBrightnessDark => 'ダーク'; + + @override + String get themeBrightnessBlack => 'ブラック'; + + @override + String get unitSystemMetric => 'メートル法'; + + @override + String get unitSystemImperial => 'ヤード・ポンド法'; + + @override + String get vaultLockTypePattern => 'パターン'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'パスワード'; + + @override + String get settingsVideoEnablePip => 'ピクチャインピクチャ'; + + @override + String get videoControlsPlayOutside => '他のプレイヤーで開く'; + + @override + String get videoLoopModeNever => 'ループ再生しない'; + + @override + String get videoLoopModeShortOnly => '短い動画のみ'; + + @override + String get videoLoopModeAlways => '常にループ再生'; + + @override + String get videoPlaybackSkip => 'スキップ'; + + @override + String get videoPlaybackMuted => 'ミュート再生'; + + @override + String get videoPlaybackWithSound => '音声あり再生'; + + @override + String get videoResumptionModeNever => '無効'; + + @override + String get videoResumptionModeAlways => '常にオン'; + + @override + String get viewerTransitionSlide => 'スライド'; + + @override + String get viewerTransitionParallax => 'パララックス'; + + @override + String get viewerTransitionFade => 'フェード'; + + @override + String get viewerTransitionZoomIn => 'ズームイン'; + + @override + String get viewerTransitionNone => 'なし'; + + @override + String get wallpaperTargetHome => 'ホーム画面'; + + @override + String get wallpaperTargetLock => 'ロック画面'; + + @override + String get wallpaperTargetHomeLock => 'ホームおよびロック画面'; + + @override + String get widgetDisplayedItemRandom => 'ランダム'; + + @override + String get widgetDisplayedItemMostRecent => '最新'; + + @override + String get widgetOpenPageHome => 'ホームを開く'; + + @override + String get widgetOpenPageCollection => 'コレクションを開く'; + + @override + String get widgetOpenPageViewer => 'ビューワーを開く'; + + @override + String get widgetTapUpdateWidget => 'ウィジェットを更新'; + + @override + String get storageVolumeDescriptionFallbackPrimary => '内蔵ストレージ'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD カード'; + + @override + String get rootDirectoryDescription => 'ルート ディレクトリ'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” ディレクトリ'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'このアプリにアクセスを許可するために次の画面で $directory の “$volume” を選択してください。'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'このアプリは $directory の “$volume” にあるファイルを変更できません。\n\nプリインストールされているファイル マネージャまたはギャラリー アプリを使用して他のディレクトリに移動してください。'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'この操作には “$volume” に $neededSize の容量が必要ですが、 残り $freeSize のみ利用可能です。'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'システム ファイル ピッカーが見つからないか、利用できません。利用可能にしてから再度お試しください。'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'この操作は次のタイプのアイテムには対応していません: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => '目的フォルダに同じ名前のファイルが存在しています。'; + + @override + String get nameConflictDialogMultipleSourceMessage => '同じ名前のファイルが存在しています。'; + + @override + String get addShortcutDialogLabel => 'ショートカット ラベル'; + + @override + String get addShortcutButtonLabel => '追加'; + + @override + String get noMatchingAppDialogMessage => '処理できるアプリが見つかりません。'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 件のアイテムをごみ箱に移動しますか?', + one: 'このアイテムをごみ箱に移動しますか?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 件のアイテムを削除しますか?', + one: 'このアイテムを削除しますか?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => '続行する前にアイテムの日付を保存しますか?'; + + @override + String get moveUndatedConfirmationDialogSetDate => '日付を設定'; + + @override + String videoResumeDialogMessage(String time) { + return '$time の時点から再生を再開しますか?'; + } + + @override + String get videoStartOverButtonLabel => '最初から再生'; + + @override + String get videoResumeButtonLabel => '再開'; + + @override + String get setCoverDialogLatest => '最新のアイテム'; + + @override + String get setCoverDialogAuto => '自動'; + + @override + String get setCoverDialogCustom => 'カスタム'; + + @override + String get hideFilterConfirmationDialogMessage => '一致する写真と動画はコレクションに表示されなくなります。「プライバシー」設定からいつでもアイテムを表示できます。\n\nこれらのアイテムを非表示にしますか?'; + + @override + String get newAlbumDialogTitle => '新規アルバム'; + + @override + String get newAlbumDialogNameLabel => 'アルバム名'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'アルバムはすでに存在します'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'ディレクトリが既に存在します'; + + @override + String get newAlbumDialogStorageLabel => 'ストレージ:'; + + @override + String get newDynamicAlbumDialogTitle => '新規ダイナミックアルバム'; + + @override + String get dynamicAlbumAlreadyExists => 'ダイナミックアルバムはすでに存在します'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => '保管庫のアイテムはアプリ内のみで保存しているため、他のアプリでは利用できません。\n\nこのアプリをアンインストールしたり、データを消去したりすると、これらのアイテムはすべて失われます。'; + + @override + String get newVaultDialogTitle => '新しい保管庫'; + + @override + String get configureVaultDialogTitle => '保管庫の設定'; + + @override + String get vaultDialogLockModeWhenScreenOff => '画面オフ時にロック'; + + @override + String get vaultDialogLockTypeLabel => 'ロックの種類'; + + @override + String get patternDialogEnter => 'パターンを入力'; + + @override + String get patternDialogConfirm => 'パターンの確認'; + + @override + String get pinDialogEnter => 'PINを入力'; + + @override + String get pinDialogConfirm => 'PINの確認'; + + @override + String get passwordDialogEnter => 'パスワードを入力'; + + @override + String get passwordDialogConfirm => 'パスワードの確認'; + + @override + String get authenticateToConfigureVault => '認証して保管庫を設定'; + + @override + String get authenticateToUnlockVault => '認証して保管庫を解除'; + + @override + String get vaultBinUsageDialogMessage => 'ゴミ箱を使用している保管庫があります。'; + + @override + String get renameAlbumDialogLabel => '新しい名前'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'ディレクトリが既に存在します'; + + @override + String get renameEntrySetPageTitle => '名前を変更'; + + @override + String get renameEntrySetPagePatternFieldLabel => '名前付けのパターン'; + + @override + String get renameEntrySetPageInsertTooltip => 'フィールドを挿入'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'プレビュー'; + + @override + String get renameProcessorCounter => '連番'; + + @override + String get renameProcessorHash => 'ハッシュ'; + + @override + String get renameProcessorName => '名前'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'このアルバムとアルバム内の $countString 件のアイテムを削除しますか?', + one: 'このアルバムとアルバム内のアイテムを削除しますか?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'これらのアルバムとアルバム内の $countString 件のアイテムを削除しますか?', + one: 'これらのアルバムとアルバム内のアイテムを削除しますか?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => '形式:'; + + @override + String get exportEntryDialogWidth => '幅'; + + @override + String get exportEntryDialogHeight => '高さ'; + + @override + String get exportEntryDialogQuality => '画質'; + + @override + String get exportEntryDialogWriteMetadata => 'メタデータを書き込む'; + + @override + String get renameEntryDialogLabel => '新しい名前'; + + @override + String get editEntryDialogCopyFromItem => '他のアイテムからコピーする'; + + @override + String get editEntryDialogTargetFieldsHeader => '更新するフィールド'; + + @override + String get editEntryDateDialogTitle => '日時'; + + @override + String get editEntryDateDialogSetCustom => '日を設定する'; + + @override + String get editEntryDateDialogCopyField => '他の日からコピーする'; + + @override + String get editEntryDateDialogExtractFromTitle => 'タイトルから抽出する'; + + @override + String get editEntryDateDialogShift => 'シフト'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'ファイル更新日'; + + @override + String get durationDialogHours => '時'; + + @override + String get durationDialogMinutes => '分'; + + @override + String get durationDialogSeconds => '秒'; + + @override + String get editEntryLocationDialogTitle => '位置情報'; + + @override + String get editEntryLocationDialogSetCustom => 'カスタムの場所を設定する'; + + @override + String get editEntryLocationDialogChooseOnMap => '地図上で選択'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => '緯度'; + + @override + String get editEntryLocationDialogLongitude => '経度'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'この位置情報を使用'; + + @override + String get editEntryRatingDialogTitle => '評価'; + + @override + String get removeEntryMetadataDialogTitle => 'メタデータの削除'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'もっと見る'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'モーションフォト内の動画を再生するには XMP が必要です。\n\n削除しますか?'; + + @override + String get videoSpeedDialogLabel => '再生速度'; + + @override + String get videoStreamSelectionDialogVideo => '動画'; + + @override + String get videoStreamSelectionDialogAudio => '音声'; + + @override + String get videoStreamSelectionDialogText => '字幕'; + + @override + String get videoStreamSelectionDialogOff => 'オフ'; + + @override + String get videoStreamSelectionDialogTrack => 'トラック'; + + @override + String get videoStreamSelectionDialogNoSelection => '他にトラックはありません。'; + + @override + String get genericSuccessFeedback => '完了しました!'; + + @override + String get genericFailureFeedback => 'エラー'; + + @override + String get genericDangerWarningDialogMessage => '適用しますか?'; + + @override + String get tooManyItemsErrorDialogMessage => '少ないアイテムで再度試してください。'; + + @override + String get menuActionConfigureView => '表示'; + + @override + String get menuActionSelect => '選択'; + + @override + String get menuActionSelectAll => 'すべて選択'; + + @override + String get menuActionSelectNone => '選択を解除'; + + @override + String get menuActionMap => '地図'; + + @override + String get menuActionSlideshow => 'スライドショー'; + + @override + String get menuActionStats => '統計'; + + @override + String get viewDialogSortSectionTitle => '並べ替え'; + + @override + String get viewDialogGroupSectionTitle => 'グループ'; + + @override + String get viewDialogLayoutSectionTitle => 'レイアウト'; + + @override + String get viewDialogReverseSortOrder => '並び順を反転'; + + @override + String get tileLayoutMosaic => 'モザイク'; + + @override + String get tileLayoutGrid => 'グリッド表示'; + + @override + String get tileLayoutList => 'リスト表示'; + + @override + String get castDialogTitle => 'キャストデバイス'; + + @override + String get coverDialogTabCover => 'カバー'; + + @override + String get coverDialogTabApp => 'アプリ'; + + @override + String get coverDialogTabColor => 'カラー'; + + @override + String get appPickDialogTitle => 'アプリを選ぶ'; + + @override + String get appPickDialogNone => 'なし'; + + @override + String get aboutPageTitle => 'アプリについて'; + + @override + String get aboutLinkLicense => 'ライセンス'; + + @override + String get aboutLinkPolicy => 'プライバシー ポリシー'; + + @override + String get aboutBugSectionTitle => 'バグの報告'; + + @override + String get aboutBugSaveLogInstruction => 'アプリのログをファイルに保存'; + + @override + String get aboutBugCopyInfoInstruction => 'システム情報をコピー'; + + @override + String get aboutBugCopyInfoButton => 'コピー'; + + @override + String get aboutBugReportInstruction => 'ログとシステム情報とともに GitHub で報告'; + + @override + String get aboutBugReportButton => '報告'; + + @override + String get aboutDataUsageSectionTitle => 'データ使用量'; + + @override + String get aboutDataUsageData => 'データ'; + + @override + String get aboutDataUsageCache => 'キャッシュ'; + + @override + String get aboutDataUsageDatabase => 'データベース'; + + @override + String get aboutDataUsageMisc => 'その他'; + + @override + String get aboutDataUsageInternal => '内部ストレージ'; + + @override + String get aboutDataUsageExternal => '外部ストレージ'; + + @override + String get aboutDataUsageClearCache => 'キャッシュを削除'; + + @override + String get aboutCreditsSectionTitle => 'クレジット'; + + @override + String get aboutCreditsWorldAtlas1 => 'このアプリは TopoJSON ファイルを'; + + @override + String get aboutCreditsWorldAtlas2 => 'ISC License の下使用しています。'; + + @override + String get aboutTranslatorsSectionTitle => '翻訳'; + + @override + String get aboutLicensesSectionTitle => 'オープンソース ライセンス'; + + @override + String get aboutLicensesBanner => 'このアプリは下記のオープンソース パッケージおよびライブラリを使用しています。'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android ライブラリ'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter プラグイン'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter パッケージ'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart パッケージ'; + + @override + String get aboutLicensesShowAllButtonLabel => 'すべてのライセンスを表示'; + + @override + String get policyPageTitle => 'プライバシー ポリシー'; + + @override + String get collectionPageTitle => 'コレクション'; + + @override + String get collectionPickPageTitle => 'ピック'; + + @override + String get collectionSelectPageTitle => 'アイテムを選択'; + + @override + String get collectionActionShowTitleSearch => 'タイトル名フィルターを表示'; + + @override + String get collectionActionHideTitleSearch => 'タイトル名フィルターを非表示'; + + @override + String get collectionActionAddDynamicAlbum => 'ダイナミックアルバムを追加'; + + @override + String get collectionActionAddShortcut => 'ショートカットを追加'; + + @override + String get collectionActionSetHome => 'ホームに設定'; + + @override + String get collectionActionEmptyBin => 'ごみ箱を空にする'; + + @override + String get collectionActionCopy => 'アルバムにコピー'; + + @override + String get collectionActionMove => 'アルバムに移動'; + + @override + String get collectionActionRescan => '再スキャン'; + + @override + String get collectionActionEdit => '編集'; + + @override + String get collectionSearchTitlesHintText => 'タイトルを検索'; + + @override + String get collectionGroupAlbum => 'アルバム別'; + + @override + String get collectionGroupMonth => '月別'; + + @override + String get collectionGroupDay => '日別'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => '不明'; + + @override + String get dateToday => '今日'; + + @override + String get dateYesterday => '昨日'; + + @override + String get dateThisMonth => '今月'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 件のアイテムを削除できませんでした', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 件のアイテムをコピーできませんでした', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 件のアイテムを移動できませんでした', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 件のアイテム名を変更できませんでした', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 件のアイテムを編集できませんでした', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ページをエクスポートできませんでした', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 件のアイテムをコピーしました', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 件のアイテムを移動しました', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 件のアイテム名を変更しました', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 件のアイテムを編集しました', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'お気に入りはありません'; + + @override + String get collectionEmptyVideos => '動画はありません'; + + @override + String get collectionEmptyImages => '画像はありません'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'アクセスを許可'; + + @override + String get collectionSelectSectionTooltip => 'セクションを選択'; + + @override + String get collectionDeselectSectionTooltip => 'セクションの選択を解除'; + + @override + String get drawerAboutButton => 'アプリについて'; + + @override + String get drawerSettingsButton => '設定'; + + @override + String get drawerCollectionAll => 'すべてのコレクション'; + + @override + String get drawerCollectionFavourites => 'お気に入り'; + + @override + String get drawerCollectionImages => '画像'; + + @override + String get drawerCollectionVideos => '動画'; + + @override + String get drawerCollectionAnimated => 'アニメーション'; + + @override + String get drawerCollectionMotionPhotos => 'モーションフォト'; + + @override + String get drawerCollectionPanoramas => 'パノラマ'; + + @override + String get drawerCollectionRaws => 'Raw 写真'; + + @override + String get drawerCollectionSphericalVideos => '360° 動画'; + + @override + String get drawerAlbumPage => 'アルバム'; + + @override + String get drawerCountryPage => '国'; + + @override + String get drawerPlacePage => '場所'; + + @override + String get drawerTagPage => 'タグ'; + + @override + String get sortByDate => '日付'; + + @override + String get sortByName => '名前'; + + @override + String get sortByItemCount => 'アイテム件数'; + + @override + String get sortBySize => 'サイズ'; + + @override + String get sortByAlbumFileName => 'アルバムとファイル名'; + + @override + String get sortByRating => '評価'; + + @override + String get sortByDuration => '期間順'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => '新しいものから表示'; + + @override + String get sortOrderOldestFirst => '古いものから表示'; + + @override + String get sortOrderAtoZ => 'AからZ'; + + @override + String get sortOrderZtoA => 'ZからA'; + + @override + String get sortOrderHighestFirst => '高いものから表示'; + + @override + String get sortOrderLowestFirst => '低いものから表示'; + + @override + String get sortOrderLargestFirst => '大きいものから表示'; + + @override + String get sortOrderSmallestFirst => '小さいものから表示'; + + @override + String get sortOrderShortestFirst => '短いものから表示'; + + @override + String get sortOrderLongestFirst => '長いものから表示'; + + @override + String get albumGroupTier => '階層別'; + + @override + String get albumGroupType => 'タイプ別'; + + @override + String get albumGroupVolume => 'ストレージ ボリューム別'; + + @override + String get albumMimeTypeMixed => '混合'; + + @override + String get albumPickPageTitleCopy => 'アルバムにコピー'; + + @override + String get albumPickPageTitleExport => 'アルバムにエクスポート'; + + @override + String get albumPickPageTitleMove => 'アルバムに移動'; + + @override + String get albumPickPageTitlePick => 'アルバムを選択'; + + @override + String get albumCamera => 'カメラ'; + + @override + String get albumDownload => 'ダウンロード'; + + @override + String get albumScreenshots => 'スクリーンショット'; + + @override + String get albumScreenRecordings => '画面録画'; + + @override + String get albumVideoCaptures => '動画キャプチャ'; + + @override + String get albumPageTitle => 'アルバム'; + + @override + String get albumEmpty => 'アルバムはありません'; + + @override + String get createAlbumButtonLabel => '作成'; + + @override + String get newFilterBanner => '新規'; + + @override + String get countryPageTitle => '国'; + + @override + String get countryEmpty => '国はありません'; + + @override + String get statePageTitle => '州'; + + @override + String get stateEmpty => '州なし'; + + @override + String get placePageTitle => '場所'; + + @override + String get placeEmpty => '場所なし'; + + @override + String get tagPageTitle => 'タグ'; + + @override + String get tagEmpty => 'タグはありません'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'ごみ箱'; + + @override + String get explorerPageTitle => 'エクスプローラー'; + + @override + String get explorerActionSelectStorageVolume => 'ストレージを選択'; + + @override + String get selectStorageVolumeDialogTitle => 'ストレージを選択'; + + @override + String get searchCollectionFieldHint => 'コレクションを検索'; + + @override + String get searchRecentSectionTitle => '最近'; + + @override + String get searchDateSectionTitle => '日付'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'アルバム'; + + @override + String get searchCountriesSectionTitle => '国'; + + @override + String get searchStatesSectionTitle => '地域'; + + @override + String get searchPlacesSectionTitle => '場所'; + + @override + String get searchTagsSectionTitle => 'タグ'; + + @override + String get searchRatingSectionTitle => '評価'; + + @override + String get searchMetadataSectionTitle => 'メタデータ'; + + @override + String get settingsPageTitle => '設定'; + + @override + String get settingsSystemDefault => 'システム'; + + @override + String get settingsDefault => 'デフォルト'; + + @override + String get settingsDisabled => '無効'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => '都度選択'; + + @override + String get settingsModificationWarningDialogMessage => '他の設定は変更されます。'; + + @override + String get settingsSearchFieldLabel => '検索設定'; + + @override + String get settingsSearchEmpty => '一致する設定なし'; + + @override + String get settingsActionExport => 'エクスポート'; + + @override + String get settingsActionExportDialogTitle => 'エクスポート'; + + @override + String get settingsActionImport => 'インポート'; + + @override + String get settingsActionImportDialogTitle => 'インポート'; + + @override + String get appExportCovers => 'カバー'; + + @override + String get appExportDynamicAlbums => 'ダイナミックアルバム'; + + @override + String get appExportFavourites => 'お気に入り'; + + @override + String get appExportSettings => '設定'; + + @override + String get settingsNavigationSectionTitle => 'ナビゲーション'; + + @override + String get settingsHomeTile => 'ホーム'; + + @override + String get settingsHomeDialogTitle => 'ホーム'; + + @override + String get setHomeCustom => 'カスタム'; + + @override + String get settingsKeepScreenOnTile => '画面をオンのままにする'; + + @override + String get settingsKeepScreenOnDialogTitle => '画面をオンのままにする'; + + @override + String get settingsDoubleBackExit => '「戻る」を2回タップして終了'; + + @override + String get settingsConfirmationTile => '確認メッセージ'; + + @override + String get settingsConfirmationDialogTitle => '確認メッセージ'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'アイテムを完全に削除する前に確認'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'アイテムをごみ箱に移動する前に確認'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'メタデータ上に日付のないアイテムを移動する前に確認'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'ゴミ箱に移動したらメッセージを表示'; + + @override + String get settingsConfirmationVaultDataLoss => '保管庫のデータ損失警告を表示する'; + + @override + String get settingsNavigationDrawerTile => 'ナビゲーション メニュー'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'ナビゲーション メニュー'; + + @override + String get settingsNavigationDrawerBanner => 'メニュー項目を長押しして、移動および並べ替え'; + + @override + String get settingsNavigationDrawerTabTypes => 'タイプ'; + + @override + String get settingsNavigationDrawerTabAlbums => 'アルバム'; + + @override + String get settingsNavigationDrawerTabPages => 'ページ'; + + @override + String get settingsNavigationDrawerAddAlbum => 'アルバムを追加'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'サムネイル'; + + @override + String get settingsThumbnailOverlayTile => 'オーバーレイ'; + + @override + String get settingsThumbnailOverlayPageTitle => 'オーバーレイ'; + + @override + String get settingsThumbnailShowHdrIcon => 'HDRアイコンを表示'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'お気に入りアイコンを表示'; + + @override + String get settingsThumbnailShowTagIcon => 'タグアイコンを表示'; + + @override + String get settingsThumbnailShowLocationIcon => '位置情報アイコンを表示'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'モーションフォトアイコンを表示'; + + @override + String get settingsThumbnailShowRating => '評価情報を表示'; + + @override + String get settingsThumbnailShowRawIcon => 'Raw アイコンを表示'; + + @override + String get settingsThumbnailShowVideoDuration => '動画の再生時間を表示'; + + @override + String get settingsCollectionQuickActionsTile => 'クイック アクション'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'クイック アクション'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'ブラウズ中'; + + @override + String get settingsCollectionQuickActionTabSelecting => '選択中'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => '長押ししてボタンを移動しアイテムを閲覧中に表示されるアクションを選択します。'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => '長押ししてボタンを移動しアイテムを選択中に表示されるアクションを選択します。'; + + @override + String get settingsCollectionBurstPatternsTile => 'バーストパターン'; + + @override + String get settingsCollectionBurstPatternsNone => 'なし'; + + @override + String get settingsViewerSectionTitle => 'ビューアー'; + + @override + String get settingsViewerGestureSideTapNext => '画面の端をタップして進む/戻る'; + + @override + String get settingsViewerUseCutout => '切り取り領域を使用'; + + @override + String get settingsViewerMaximumBrightness => '明るさ最大'; + + @override + String get settingsMotionPhotoAutoPlay => 'モーションフォトを自動再生'; + + @override + String get settingsImageBackground => '画像の背景'; + + @override + String get settingsViewerQuickActionsTile => 'クイックアクション'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'クイックアクション'; + + @override + String get settingsViewerQuickActionEditorBanner => '長押ししてボタンを移動しビューアーで表示されるアクションを選択します。'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => '表示ボタン'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => '利用可能なボタン'; + + @override + String get settingsViewerQuickActionEmpty => 'ボタンなし'; + + @override + String get settingsViewerOverlayTile => 'オーバーレイ'; + + @override + String get settingsViewerOverlayPageTitle => 'オーバーレイ'; + + @override + String get settingsViewerShowOverlayOnOpening => '起動時に表示'; + + @override + String get settingsViewerShowHistogram => 'ヒストグラムを表示'; + + @override + String get settingsViewerShowMinimap => '小さな地図を表示'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => '情報を表示'; + + @override + String get settingsViewerShowInformationSubtitle => 'タイトル、日付、位置情報、その他を表示'; + + @override + String get settingsViewerShowRatingTags => '評価とタグを表示'; + + @override + String get settingsViewerShowShootingDetails => '撮影詳細を表示'; + + @override + String get settingsViewerShowDescription => '説明を表示'; + + @override + String get settingsViewerShowOverlayThumbnails => 'サムネイルを表示'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'ぼかし効果'; + + @override + String get settingsViewerSlideshowTile => 'スライドショー'; + + @override + String get settingsViewerSlideshowPageTitle => 'スライドショー'; + + @override + String get settingsSlideshowRepeat => '繰り返し'; + + @override + String get settingsSlideshowShuffle => 'シャッフル'; + + @override + String get settingsSlideshowFillScreen => '画面いっぱいに表示'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'アニメーション付きのズーム効果'; + + @override + String get settingsSlideshowTransitionTile => 'トランジション'; + + @override + String get settingsSlideshowIntervalTile => '間隔'; + + @override + String get settingsSlideshowVideoPlaybackTile => '動画を再生'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => '動画再生'; + + @override + String get settingsVideoPageTitle => '動画設定'; + + @override + String get settingsVideoSectionTitle => '動画'; + + @override + String get settingsVideoShowVideos => '動画を表示'; + + @override + String get settingsVideoPlaybackTile => '再生'; + + @override + String get settingsVideoPlaybackPageTitle => '再生'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'ハードウェア アクセラレーション'; + + @override + String get settingsVideoAutoPlay => '自動再生'; + + @override + String get settingsVideoLoopModeTile => 'ループ モード'; + + @override + String get settingsVideoLoopModeDialogTitle => 'ループ モード'; + + @override + String get settingsVideoResumptionModeTile => '前回の位置からの再生'; + + @override + String get settingsVideoResumptionModeDialogTitle => '前回の位置からの再生'; + + @override + String get settingsVideoBackgroundMode => 'バックグラウンド再生'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'バックグラウンド再生'; + + @override + String get settingsVideoControlsTile => '操作'; + + @override + String get settingsVideoControlsPageTitle => '操作'; + + @override + String get settingsVideoButtonsTile => 'ボタン'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => '2回タップして再生/一時停止'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => '画面の角を2回タップして早送り/早戻し'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => '左右で上下にスワイプして輝度と音量を調節'; + + @override + String get settingsSubtitleThemeTile => '字幕'; + + @override + String get settingsSubtitleThemePageTitle => '字幕'; + + @override + String get settingsSubtitleThemeSample => 'これはサンプルです。'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'テキストの配置'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'テキストの配置'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'テキストの位置'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'テキストの位置'; + + @override + String get settingsSubtitleThemeTextSize => 'テキストのサイズ'; + + @override + String get settingsSubtitleThemeShowOutline => 'アウトラインと影を表示'; + + @override + String get settingsSubtitleThemeTextColor => 'テキストの色'; + + @override + String get settingsSubtitleThemeTextOpacity => 'テキストの不透明度'; + + @override + String get settingsSubtitleThemeBackgroundColor => '背景色'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => '背景の不透明度'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => '左揃え'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => '中央揃え'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => '右揃え'; + + @override + String get settingsPrivacySectionTitle => 'プライバシー'; + + @override + String get settingsAllowInstalledAppAccess => 'アプリのインベントリへのアクセスを許可する'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'アルバム表示の改善に使用されます'; + + @override + String get settingsAllowErrorReporting => '匿名でのエラー報告を許可する'; + + @override + String get settingsSaveSearchHistory => '検索履歴を保存'; + + @override + String get settingsEnableBin => 'ごみ箱を使用'; + + @override + String get settingsEnableBinSubtitle => '削除したアイテムを30日間保持します'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'ごみ箱の中のアイテムは永久に削除されます。'; + + @override + String get settingsAllowMediaManagement => 'メディア管理を許可'; + + @override + String get settingsHiddenItemsTile => '非表示アイテム'; + + @override + String get settingsHiddenItemsPageTitle => '非表示アイテム'; + + @override + String get settingsHiddenFiltersBanner => '非表示のフィルターに一致する写真と動画は、コレクションに表示されません。'; + + @override + String get settingsHiddenFiltersEmpty => '非表示フィルターがありません'; + + @override + String get settingsStorageAccessTile => 'ストレージへのアクセス'; + + @override + String get settingsStorageAccessPageTitle => 'ストレージへのアクセス'; + + @override + String get settingsStorageAccessBanner => 'ディレクトリによっては、ファイルの編集のためにアクセス許可が必要です。ここには、これまでにアクセスを許可したディレクトリが表示されます。'; + + @override + String get settingsStorageAccessEmpty => '許可したアクセスはありません'; + + @override + String get settingsStorageAccessRevokeTooltip => '許可を取り消し'; + + @override + String get settingsAccessibilitySectionTitle => 'アクセシビリティ'; + + @override + String get settingsRemoveAnimationsTile => 'アニメーションの削除'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'アニメーションの削除'; + + @override + String get settingsTimeToTakeActionTile => '操作までの時間'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'マルチタッチジェスチャーの選択肢を表示する'; + + @override + String get settingsDisplaySectionTitle => 'ディスプレイ'; + + @override + String get settingsThemeBrightnessTile => 'テーマ'; + + @override + String get settingsThemeBrightnessDialogTitle => 'テーマ'; + + @override + String get settingsThemeColorHighlights => 'カラー強調表示'; + + @override + String get settingsThemeEnableDynamicColor => 'ダイナミックカラー'; + + @override + String get settingsDisplayRefreshRateModeTile => 'ディスプレイ リフレッシュ レート'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'リフレッシュ レート'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV インターフェイス'; + + @override + String get settingsLanguageSectionTitle => '言語と形式'; + + @override + String get settingsLanguageTile => '言語'; + + @override + String get settingsLanguagePageTitle => '言語'; + + @override + String get settingsCoordinateFormatTile => '座標形式'; + + @override + String get settingsCoordinateFormatDialogTitle => '座標形式'; + + @override + String get settingsUnitSystemTile => '単位'; + + @override + String get settingsUnitSystemDialogTitle => '単位'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'アラビア数字を強制する'; + + @override + String get settingsScreenSaverPageTitle => 'スクリーンセーバー'; + + @override + String get settingsWidgetPageTitle => 'フォトフレーム'; + + @override + String get settingsWidgetShowOutline => '枠'; + + @override + String get settingsWidgetOpenPage => 'ウィジェットをタップしたとき'; + + @override + String get settingsWidgetDisplayedItem => '表示アイテム'; + + @override + String get settingsCollectionTile => 'コレクション'; + + @override + String get statsPageTitle => '統計'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '位置情報のあるアイテム $countString 件', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => '上位の国'; + + @override + String get statsTopStatesSectionTitle => 'トップ地域'; + + @override + String get statsTopPlacesSectionTitle => '上位の場所'; + + @override + String get statsTopTagsSectionTitle => '上位のタグ'; + + @override + String get statsTopAlbumsSectionTitle => 'トップアルバム'; + + @override + String get viewerOpenPanoramaButtonLabel => 'パノラマを開く'; + + @override + String get viewerSetWallpaperButtonLabel => '壁紙設定'; + + @override + String get viewerErrorUnknown => 'エラー!'; + + @override + String get viewerErrorDoesNotExist => 'ファイルが存在しません。'; + + @override + String get viewerInfoPageTitle => '情報'; + + @override + String get viewerInfoBackToViewerTooltip => 'ビューアーに戻る'; + + @override + String get viewerInfoUnknown => '不明'; + + @override + String get viewerInfoLabelDescription => '説明'; + + @override + String get viewerInfoLabelTitle => 'タイトル'; + + @override + String get viewerInfoLabelDate => '日付'; + + @override + String get viewerInfoLabelResolution => '解像度'; + + @override + String get viewerInfoLabelSize => 'サイズ'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'パス'; + + @override + String get viewerInfoLabelDuration => '再生時間'; + + @override + String get viewerInfoLabelOwner => '所有者'; + + @override + String get viewerInfoLabelCoordinates => '座標'; + + @override + String get viewerInfoLabelAddress => 'アドレス'; + + @override + String get mapStyleDialogTitle => '地図のスタイル'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => '地図のスタイルを選択'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'ズームイン'; + + @override + String get mapZoomOutTooltip => 'ズームアウト'; + + @override + String get mapPointNorthUpTooltip => '北が上になるように表示'; + + @override + String get mapAttributionOsmData => '地図データ © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => '地図ページで表示'; + + @override + String get mapEmptyRegion => 'この地域の画像はありません'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => '埋め込みデータを抽出できませんでした'; + + @override + String get viewerInfoOpenLinkText => '開く'; + + @override + String get viewerInfoViewXmlLinkText => 'XML を表示'; + + @override + String get viewerInfoSearchFieldLabel => 'メタデータを検索'; + + @override + String get viewerInfoSearchEmpty => '一致するキーはありません'; + + @override + String get viewerInfoSearchSuggestionDate => '日時'; + + @override + String get viewerInfoSearchSuggestionDescription => '説明'; + + @override + String get viewerInfoSearchSuggestionDimensions => '寸法'; + + @override + String get viewerInfoSearchSuggestionResolution => '解像度'; + + @override + String get viewerInfoSearchSuggestionRights => '権限'; + + @override + String get wallpaperUseScrollEffect => 'ホーム画面でスクロール効果を使う'; + + @override + String get tagEditorPageTitle => 'タグの編集'; + + @override + String get tagEditorPageNewTagFieldLabel => '新しいタグ'; + + @override + String get tagEditorPageAddTagTooltip => 'タグを追加'; + + @override + String get tagEditorSectionRecent => '最近'; + + @override + String get tagEditorSectionPlaceholders => 'プレースホルダー'; + + @override + String get tagEditorDiscardDialogMessage => '変更を破棄しますか?'; + + @override + String get tagPlaceholderCountry => '国'; + + @override + String get tagPlaceholderState => '州'; + + @override + String get tagPlaceholderPlace => '場所'; + + @override + String get panoramaEnableSensorControl => 'センサー制御を有効にする'; + + @override + String get panoramaDisableSensorControl => 'センサー制御を無効にする'; + + @override + String get sourceViewerPageTitle => 'ソース'; +} diff --git a/lib/l10ngen/app_localizations_kmr.dart b/lib/l10ngen/app_localizations_kmr.dart new file mode 100644 index 0000000..4e837e3 --- /dev/null +++ b/lib/l10ngen/app_localizations_kmr.dart @@ -0,0 +1,2424 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Northern Kurdish (`kmr`). +class AppLocalizationsKmr extends AppLocalizations { + AppLocalizationsKmr([String locale = 'kmr']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Tu bi xêr hatî Aves'; + + @override + String get welcomeOptional => 'Vebijêrkî'; + + @override + String get welcomeTermsToggle => 'Ez merc û rewşan dipejirînim'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString hêman', + one: '$countString hêman', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString stûn', + one: '$countString stûn', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString çirke', + one: '$countString çirke', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString xulek', + one: '$countString xulek', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString roj', + one: '$countString roj', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'BISEPÎNE'; + + @override + String get createButtonLabel => 'BIAFIRÎNE'; + + @override + String get deleteButtonLabel => 'JÊ BIBE'; + + @override + String get nextButtonLabel => 'JÊ BIBE'; + + @override + String get showButtonLabel => 'NÎŞAN BIDE'; + + @override + String get hideButtonLabel => 'VEŞÊRE'; + + @override + String get continueButtonLabel => 'BIDOMÎNE'; + + @override + String get saveCopyButtonLabel => 'JÊGIRTINÊ TOMAR BIKE'; + + @override + String get applyTooltip => 'Bisepîne'; + + @override + String get cancelTooltip => 'Têk bibe'; + + @override + String get changeTooltip => 'Biguherîne'; + + @override + String get clearTooltip => 'Pak bike'; + + @override + String get previousTooltip => 'Paş'; + + @override + String get nextTooltip => 'Pêş'; + + @override + String get showTooltip => 'Nişan bide'; + + @override + String get hideTooltip => 'Veşêre'; + + @override + String get actionRemove => 'Rake'; + + @override + String get resetTooltip => 'Ji nû be saz bike'; + + @override + String get saveTooltip => 'Tomar bike'; + + @override + String get stopTooltip => 'Rawestîne'; + + @override + String get pickTooltip => 'Hilbijêre'; + + @override + String get doubleBackExitMessage => '“Vegere” dîsa bitikîne da ku derkevî.'; + + @override + String get doNotAskAgain => 'Dîsa pirs neke'; + + @override + String get sourceStateLoading => 'Tê barkirin'; + + @override + String get sourceStateCataloguing => 'Beş'; + + @override + String get sourceStateLocatingCountries => 'Dîtina welatan'; + + @override + String get sourceStateLocatingPlaces => 'Dîtina cihan'; + + @override + String get chipActionDelete => 'Jê bibe'; + + @override + String get chipActionRemove => 'Rake'; + + @override + String get chipActionShowCollection => 'Di komê de nîşan bide'; + + @override + String get chipActionGoToAlbumPage => 'Di elbumê de nîşan bide'; + + @override + String get chipActionGoToCountryPage => 'Di welatan de nîşan bide'; + + @override + String get chipActionGoToPlacePage => 'Di cihan de nîşan bide'; + + @override + String get chipActionGoToTagPage => 'Di nîşankan de nîşan bide'; + + @override + String get chipActionGoToExplorerPage => 'Di gervanê de nîşan bide'; + + @override + String get chipActionDecompose => 'Veqetîne'; + + @override + String get chipActionFilterOut => 'Derxe'; + + @override + String get chipActionFilterIn => 'Têxe'; + + @override + String get chipActionHide => 'Veşêre'; + + @override + String get chipActionLock => 'Kilît bike'; + + @override + String get chipActionPin => 'Li jor bi dar bixe'; + + @override + String get chipActionUnpin => 'Li jor bi dar nexe'; + + @override + String get chipActionGroup => 'Komkirinê biguherîne'; + + @override + String get chipActionRename => 'Navê biguherîne'; + + @override + String get chipActionSetCover => 'Bergê saz bike'; + + @override + String get chipActionShowCountryStates => 'Amaran nîşan bide'; + + @override + String get chipActionCreateGroup => 'Komê biafirîne'; + + @override + String get chipActionCreateAlbum => 'Elbumê biafirîne'; + + @override + String get chipActionCreateVault => 'Nirxê biafirîne'; + + @override + String get chipActionConfigureVault => 'Configure vault'; + + @override + String get entryActionCopyToClipboard => 'Copy to clipboard'; + + @override + String get entryActionDelete => 'Jê bibe'; + + @override + String get entryActionConvert => 'Mezinahiyê biguherîne'; + + @override + String get entryActionExport => 'Derxîne'; + + @override + String get entryActionInfo => 'Zanyarî'; + + @override + String get entryActionRename => 'Navê biguherîne'; + + @override + String get entryActionRestore => 'Vegerîne'; + + @override + String get entryActionRotateCCW => 'Berevajî demjimêrê bizivirîne'; + + @override + String get entryActionRotateCW => 'Rotate clockwise'; + + @override + String get entryActionFlip => 'Flip horizontally'; + + @override + String get entryActionPrint => 'Çap bike'; + + @override + String get entryActionShare => 'Parve bike'; + + @override + String get entryActionShareImageOnly => 'Tenê wêneyê parve bike'; + + @override + String get entryActionShareVideoOnly => 'Tenê vîdyoyê parve bike'; + + @override + String get entryActionViewSource => 'Çavkaniyê nîşan bide'; + + @override + String get entryActionShowGeoTiffOnMap => 'Show as map overlay'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convert to still image'; + + @override + String get entryActionViewMotionPhotoVideo => 'Vîdyoyê veke'; + + @override + String get entryActionEdit => 'Biguherîne'; + + @override + String get entryActionOpen => 'Veke bi'; + + @override + String get entryActionSetAs => 'Saz bike wekî'; + + @override + String get entryActionCast => 'Weşan'; + + @override + String get entryActionOpenMap => 'Di sepanê nexşeyê de nîşan bide'; + + @override + String get entryActionRotateScreen => 'Dîmenderê teqle bike'; + + @override + String get entryActionAddFavourite => 'Tevlî bijarteyan bike'; + + @override + String get entryActionRemoveFavourite => 'Ji bijarteyan rake'; + + @override + String get videoActionCaptureFrame => 'Çarçoveyê bigire'; + + @override + String get videoActionMute => 'Bêdeng bike'; + + @override + String get videoActionUnmute => 'Bêdeng neke'; + + @override + String get videoActionPause => 'Rawestîne'; + + @override + String get videoActionPlay => 'Vêxe'; + + @override + String get videoActionReplay10 => '10 çirkeyan paşde vegerîne'; + + @override + String get videoActionSkip10 => '10 çirkeyan pêşde bibe'; + + @override + String get videoActionShowPreviousFrame => 'Çarçoveya paş nîşan bide'; + + @override + String get videoActionShowNextFrame => 'Çarçoveya pêş nîşan bide'; + + @override + String get videoActionSelectStreams => 'Stran hilbijêre'; + + @override + String get videoActionSetSpeed => 'Leza lîstinê'; + + @override + String get videoActionABRepeat => 'A-B dûbare bike'; + + @override + String get videoRepeatActionSetStart => 'Destpêk saz bike'; + + @override + String get videoRepeatActionSetEnd => 'Dawî saz bike'; + + @override + String get viewerActionSettings => 'Sazkarî'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Bidomîne'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'Dem & dîrokê biguherîne'; + + @override + String get entryInfoActionEditLocation => 'Cihê biguherîne'; + + @override + String get entryInfoActionEditTitleDescription => 'Sernav & danasînê biguherîne'; + + @override + String get entryInfoActionEditRating => 'Nirxandinê biguherîne'; + + @override + String get entryInfoActionEditTags => 'Nîşanan biguherîne'; + + @override + String get entryInfoActionRemoveMetadata => 'Metadata biguherîne'; + + @override + String get entryInfoActionExportMetadata => 'Metadata derxe'; + + @override + String get entryInfoActionRemoveLocation => 'Cihê rake'; + + @override + String get editorActionTransform => 'Biguherîne'; + + @override + String get editorTransformCrop => 'Jê bike'; + + @override + String get editorTransformRotate => 'Bizivirîne'; + + @override + String get cropAspectRatioFree => 'Belaş'; + + @override + String get cropAspectRatioOriginal => 'Resen'; + + @override + String get cropAspectRatioSquare => 'Çargoşe'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landscape'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Jêbirdank'; + + @override + String get filterFavouriteLabel => 'Favorite'; + + @override + String get filterNoDateLabel => 'Rojekirî'; + + @override + String get filterNoAddressLabel => 'Navnîşan tine ye'; + + @override + String get filterLocatedLabel => 'Bicihkirî'; + + @override + String get filterNoLocationLabel => 'Bicihnekirî'; + + @override + String get filterNoRatingLabel => 'Nenirxandî'; + + @override + String get filterTaggedLabel => 'Nîşankirî'; + + @override + String get filterNoTagLabel => 'Nenîşankirî'; + + @override + String get filterNoTitleLabel => 'Bêsernav'; + + @override + String get filterOnThisDayLabel => 'Di vê rojê de'; + + @override + String get filterRecentlyAddedLabel => 'Nû tevlî bûyî'; + + @override + String get filterRatingRejectedLabel => 'Dûrixistî'; + + @override + String get filterTypeAnimatedLabel => 'Anîmasyon'; + + @override + String get filterTypeMotionPhotoLabel => 'Motion Photo'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Xav'; + + @override + String get filterTypeSphericalVideoLabel => '360° vîdyo'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Wêne'; + + @override + String get filterMimeVideoLabel => 'Vîdyo'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'Nû'; + + @override + String get albumTierPinned => 'Bi dar xistî'; + + @override + String get albumTierGroups => 'Kom'; + + @override + String get albumTierSpecial => 'Hevpar'; + + @override + String get albumTierApps => 'Sepan'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamîk'; + + @override + String get albumTierRegular => 'Ên din'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimal degrees'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'BK'; + + @override + String get coordinateDmsSouth => 'BŞ'; + + @override + String get coordinateDmsEast => 'RT'; + + @override + String get coordinateDmsWest => 'RA'; + + @override + String get displayRefreshRatePreferHighest => 'Bilindtirîn nirx'; + + @override + String get displayRefreshRatePreferLowest => 'Kêmtirîn nirx'; + + @override + String get keepScreenOnNever => 'Ti carî'; + + @override + String get keepScreenOnVideoPlayback => 'During video playback'; + + @override + String get keepScreenOnViewerOnly => 'Viewer page only'; + + @override + String get keepScreenOnAlways => 'Her dem'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Ti carî'; + + @override + String get maxBrightnessAlways => 'Her dem'; + + @override + String get nameConflictStrategyRename => 'Navê biguherîne'; + + @override + String get nameConflictStrategyReplace => 'Replace'; + + @override + String get nameConflictStrategySkip => 'Derbas bike'; + + @override + String get overlayHistogramNone => 'Ne yek'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Ronahî'; + + @override + String get subtitlePositionTop => 'Jor'; + + @override + String get subtitlePositionBottom => 'Jêr'; + + @override + String get themeBrightnessLight => 'Ronahî'; + + @override + String get themeBrightnessDark => 'Tarî'; + + @override + String get themeBrightnessBlack => 'Reş'; + + @override + String get unitSystemMetric => 'Metrî'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Çûre'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Borînpeyv'; + + @override + String get settingsVideoEnablePip => 'Wêne di wêne de'; + + @override + String get videoControlsPlayOutside => 'Open with other player'; + + @override + String get videoLoopModeNever => 'Ti carî'; + + @override + String get videoLoopModeShortOnly => 'Vîdyo yên kin tenê'; + + @override + String get videoLoopModeAlways => 'Her dem'; + + @override + String get videoPlaybackSkip => 'Derbas bike'; + + @override + String get videoPlaybackMuted => 'Play muted'; + + @override + String get videoPlaybackWithSound => 'Play with sound'; + + @override + String get videoResumptionModeNever => 'Ti carî'; + + @override + String get videoResumptionModeAlways => 'Her dem'; + + @override + String get viewerTransitionSlide => 'Bişemtîne'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Wendabûn'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'Ne tişt'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'Rastehatî'; + + @override + String get widgetDisplayedItemMostRecent => 'Most recent'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internal storage'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Some files have the same name.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'TEVLÎ BIKE'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Save dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OVER'; + + @override + String get videoResumeButtonLabel => 'BIDOMÎNE'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'Xweber'; + + @override + String get setCoverDialogCustom => 'Kesane'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'New Album'; + + @override + String get newAlbumDialogNameLabel => 'Album name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'Bîrdank:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Nekomkirinî'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'New name'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'Navê biguherîne'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insert field'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Pêşdîtin'; + + @override + String get renameProcessorCounter => 'Jimêr'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Nav'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete this album and the $countString items in it?', + one: 'Delete this album and the item in it?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these albums and the $countString items in them?', + one: 'Delete these albums and the item in them?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Awa:'; + + @override + String get exportEntryDialogWidth => 'Ferehî'; + + @override + String get exportEntryDialogHeight => 'Dirêjî'; + + @override + String get exportEntryDialogQuality => 'Kalîte'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'New name'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'Date & Time'; + + @override + String get editEntryDateDialogSetCustom => 'Set custom date'; + + @override + String get editEntryDateDialogCopyField => 'Copy from other date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Biguherîne'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'File modified date'; + + @override + String get durationDialogHours => 'Demjimêr'; + + @override + String get durationDialogMinutes => 'Xulek'; + + @override + String get durationDialogSeconds => 'Çirke'; + + @override + String get editEntryLocationDialogTitle => 'Cih'; + + @override + String get editEntryLocationDialogSetCustom => 'Set custom location'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Choose on map'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Use this location'; + + @override + String get editEntryRatingDialogTitle => 'Nirxandin'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'Hemû'; + + @override + String get removeEntryMetadataDialogMore => 'Bêtir'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'Playback speed'; + + @override + String get videoStreamSelectionDialogVideo => 'Vîdyo'; + + @override + String get videoStreamSelectionDialogAudio => 'Deng'; + + @override + String get videoStreamSelectionDialogText => 'Jêrnivîs'; + + @override + String get videoStreamSelectionDialogOff => 'Vemirî'; + + @override + String get videoStreamSelectionDialogTrack => 'Herik'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'Qediya!'; + + @override + String get genericFailureFeedback => 'Têkçûyî'; + + @override + String get genericDangerWarningDialogMessage => 'Are you sure?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'Nîşan bide'; + + @override + String get menuActionSelect => 'Hilbijêre'; + + @override + String get menuActionSelectAll => 'Select all'; + + @override + String get menuActionSelectNone => 'Select none'; + + @override + String get menuActionMap => 'Nexşe'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'Amar'; + + @override + String get viewDialogSortSectionTitle => 'Rêzkirin'; + + @override + String get viewDialogGroupSectionTitle => 'Beş'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mozaîk'; + + @override + String get tileLayoutGrid => 'Tor'; + + @override + String get tileLayoutList => 'Rêz'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'Sepan'; + + @override + String get coverDialogTabColor => 'Reng'; + + @override + String get appPickDialogTitle => 'Pick App'; + + @override + String get appPickDialogNone => 'Ne yek'; + + @override + String get aboutPageTitle => 'Derbar'; + + @override + String get aboutLinkLicense => 'Lîsans'; + + @override + String get aboutLinkPolicy => 'Privacy Policy'; + + @override + String get aboutBugSectionTitle => 'Bug Report'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copy system information'; + + @override + String get aboutBugCopyInfoButton => 'Jê bigire'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'Ragihîne'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Dane'; + + @override + String get aboutDataUsageCache => 'Bîrdanka demkî'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Hindrîn'; + + @override + String get aboutDataUsageExternal => 'Derveyî'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Credits'; + + @override + String get aboutCreditsWorldAtlas1 => 'This app uses a TopoJSON file from'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'Wergêr'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenses'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Show All Licenses'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'Pick'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'Biguherîne'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Nenas'; + + @override + String get dateToday => 'Îro'; + + @override + String get dateYesterday => 'Duh'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'Debar'; + + @override + String get drawerSettingsButton => 'Sazkarî'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Wêne'; + + @override + String get drawerCollectionVideos => 'Vîdyo'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Elbum'; + + @override + String get drawerCountryPage => 'Welat'; + + @override + String get drawerPlacePage => 'Cih'; + + @override + String get drawerTagPage => 'Nîşank'; + + @override + String get sortByDate => 'By date'; + + @override + String get sortByName => 'By name'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'By size'; + + @override + String get sortByAlbumFileName => 'By album & item title'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A to Z'; + + @override + String get sortOrderZtoA => 'Z to A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumMimeTypeMixed => 'Tevlihev'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'Kamera'; + + @override + String get albumDownload => 'Daxe'; + + @override + String get albumScreenshots => 'Wêneyên dîmenderê'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Elbum'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'BIAFIRÎNE'; + + @override + String get newFilterBanner => 'nû'; + + @override + String get countryPageTitle => 'Welat'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'Amar'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Cih'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Nîşank'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Gervan'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Dawî'; + + @override + String get searchDateSectionTitle => 'Dane'; + + @override + String get searchFormatSectionTitle => 'Awa'; + + @override + String get searchAlbumsSectionTitle => 'Elbum'; + + @override + String get searchCountriesSectionTitle => 'Welat'; + + @override + String get searchStatesSectionTitle => 'Amar'; + + @override + String get searchPlacesSectionTitle => 'Cih'; + + @override + String get searchTagsSectionTitle => 'Nîşank'; + + @override + String get searchRatingSectionTitle => 'Nirxandin'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Sazkarî'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'Berdest'; + + @override + String get settingsDisabled => 'Neçalak kirî'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'Derxe'; + + @override + String get settingsActionExportDialogTitle => 'Derxe'; + + @override + String get settingsActionImport => 'Têxe'; + + @override + String get settingsActionImportDialogTitle => 'Têxe'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'Sazkarî'; + + @override + String get settingsNavigationSectionTitle => 'Navigasyon'; + + @override + String get settingsHomeTile => 'Ne yek jî'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Kesane kirî'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Cûre'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Elbum'; + + @override + String get settingsNavigationDrawerTabPages => 'Rûpel'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Wêneyên biçûk'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Lêgerin'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Hilbijartin'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'Ne yek'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Taybetî'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Gihîştbarî'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Nîşandan'; + + @override + String get settingsThemeBrightnessTile => 'Rûkar'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Rûkar'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Ziman û awa'; + + @override + String get settingsLanguageTile => 'Ziman'; + + @override + String get settingsLanguagePageTitle => 'Ziman'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Yekînî'; + + @override + String get settingsUnitSystemDialogTitle => 'Yekînî'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Amar'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Wey li min!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Zanyarî'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'nenas'; + + @override + String get viewerInfoLabelDescription => 'Danasîn'; + + @override + String get viewerInfoLabelTitle => 'Sernav'; + + @override + String get viewerInfoLabelDate => 'Dîrok'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Mezinahî'; + + @override + String get viewerInfoLabelUri => 'Girêdan'; + + @override + String get viewerInfoLabelPath => 'Rêgeh'; + + @override + String get viewerInfoLabelDuration => 'Dirêjahî'; + + @override + String get viewerInfoLabelOwner => 'Xwedî'; + + @override + String get viewerInfoLabelCoordinates => 'Koordînat'; + + @override + String get viewerInfoLabelAddress => 'Navnîşan'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Nav'; + + @override + String get mapStyleEditorDialogUrl => 'Girêdan'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Veke'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Danasîn'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Dawîn'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Welat'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Çavkanî'; +} diff --git a/lib/l10ngen/app_localizations_kn.dart b/lib/l10ngen/app_localizations_kn.dart new file mode 100644 index 0000000..e55ca37 --- /dev/null +++ b/lib/l10ngen/app_localizations_kn.dart @@ -0,0 +1,2425 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Kannada (`kn`). +class AppLocalizationsKn extends AppLocalizations { + AppLocalizationsKn([String locale = 'kn']) : super(locale); + + @override + String get appName => 'ಎವೀಸ್'; + + @override + String get welcomeMessage => 'ಎವೀಸ್ ಗೆ ಸ್ವಾಗತ'; + + @override + String get welcomeOptional => 'ಐಚ್ಛಿಕ'; + + @override + String get welcomeTermsToggle => 'ನಾನು ನಿಯಮಗಳು ಮತ್ತು ಷರತ್ತುಗಳನ್ನು ಒಪ್ಪುತ್ತೇನೆ'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ವಸ್ತುಗಳು', + one: '$countString ವಸ್ತು', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ಕಂಬಸಾಲುಗಳು', + one: '$countString ಕಂಬಸಾಲು', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ಕ್ಷಣಗಳು', + one: '$countString ಕ್ಷಣ', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ನಿಮಿಷಗಳು', + one: '$countString ನಿಮಿಷ', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ದಿನಗಳು', + one: '$countString ದಿನ', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length ಮಿಮಿ'; + } + + @override + String get applyButtonLabel => 'ಅನ್ವಯಿಸು'; + + @override + String get createButtonLabel => 'ರಚಿಸಿ'; + + @override + String get deleteButtonLabel => 'ಅಳಿಸಿ'; + + @override + String get nextButtonLabel => 'ಮುಂದೆ'; + + @override + String get showButtonLabel => 'ತೋರಿಸು'; + + @override + String get hideButtonLabel => 'ಅಡಗಿಸು'; + + @override + String get continueButtonLabel => 'ಮುಂದುವರಿಸು'; + + @override + String get saveCopyButtonLabel => 'ನಕಲು ಉಳಿಸಿ'; + + @override + String get applyTooltip => 'ಅನ್ವಯಿಸು'; + + @override + String get cancelTooltip => 'ರದ್ದುಗೊಳಿಸಿ'; + + @override + String get changeTooltip => 'ಬದಲಿಸು'; + + @override + String get clearTooltip => 'ಖಾಲಿ ಮಾಡು'; + + @override + String get previousTooltip => 'ಹಿಂದಿನ'; + + @override + String get nextTooltip => 'ಮುಂದಿನ'; + + @override + String get showTooltip => 'ತೋರಿಸು'; + + @override + String get hideTooltip => 'ಮರೆಮಾಡಿ'; + + @override + String get actionRemove => 'ತೆಗೆದುಹಾಕಿ'; + + @override + String get resetTooltip => 'ರೀಸೆಟ್ ಮಾಡಿ'; + + @override + String get saveTooltip => 'ಉಳಿಸಿ'; + + @override + String get stopTooltip => 'ನಿಲ್ಲಿಸು'; + + @override + String get pickTooltip => 'ಆಯ್ಕೆ'; + + @override + String get doubleBackExitMessage => 'ನಿರ್ಗಮಿಸಲು ಮತ್ತೊಮ್ಮೆ “ಹಿಂದೆ” ಒತ್ತಿ.'; + + @override + String get doNotAskAgain => 'ಇನ್ನೊಮ್ಮೆ ಕೇಳಬೇಡಿ'; + + @override + String get sourceStateLoading => 'ಲೋಡ್ ಆಗುತ್ತಿದೆ'; + + @override + String get sourceStateCataloguing => 'ಪಟ್ಟಿಮಾಡುವುದು'; + + @override + String get sourceStateLocatingCountries => 'ದೇಶಗಳನ್ನು ಪತ್ತೆ ಮಾಡಲಾಗುತ್ತಿದೆ'; + + @override + String get sourceStateLocatingPlaces => 'ಸ್ಥಳಗಳನ್ನು ಪತ್ತೆ ಮಾಡಲಾಗುತ್ತಿದೆ'; + + @override + String get chipActionDelete => 'ಅಳಿಸಿ'; + + @override + String get chipActionRemove => 'ತೆಗೆದುಹಾಕು'; + + @override + String get chipActionShowCollection => 'ಸಂಗ್ರಹದಲ್ಲಿ ತೋರಿಸು'; + + @override + String get chipActionGoToAlbumPage => 'ಆಲ್ಬಮ್‌ಗಳಲ್ಲಿ ತೋರಿಸು'; + + @override + String get chipActionGoToCountryPage => 'ದೇಶಗಳಲ್ಲಿ ತೋರಿಸು'; + + @override + String get chipActionGoToPlacePage => 'ಸ್ಥಳಗಳಲ್ಲಿ ತೋರಿಸು'; + + @override + String get chipActionGoToTagPage => 'Tagಗಳಲ್ಲಿ ತೋರಿಸು'; + + @override + String get chipActionGoToExplorerPage => 'ಪರಿಶೋಧಕದಲ್ಲಿ ತೋರಿಸು'; + + @override + String get chipActionDecompose => 'ವಿಭಜಿಸು'; + + @override + String get chipActionFilterOut => 'ಪ್ರತ್ಯೇಕಿಸು'; + + @override + String get chipActionFilterIn => 'ಶೋಧಿಸು'; + + @override + String get chipActionHide => 'ಅಡಗಿಸು'; + + @override + String get chipActionLock => 'ಬಂಧಿಸು'; + + @override + String get chipActionPin => 'ಮೇಲೆ ಸಿಕ್ಕಿಸು'; + + @override + String get chipActionUnpin => 'ಪಿನ್ ತೆಗೆಯಿರಿ'; + + @override + String get chipActionGroup => 'ಗುಂಪನ್ನು ಬದಲಾಯಿಸಿ'; + + @override + String get chipActionRename => 'ಮರುನಾಮಕರಣ'; + + @override + String get chipActionSetCover => 'ರಕ್ಷಾಕವಚ ಹೊಂದಿಸು'; + + @override + String get chipActionShowCountryStates => 'ಅಂಕಿಅಂಶಗಳನ್ನು ತೋರಿಸಿ'; + + @override + String get chipActionCreateGroup => 'ಗುಂಪನ್ನು ರಚಿಸಿ'; + + @override + String get chipActionCreateAlbum => 'ಆಲ್ಬಮ್ ರಚಿಸಿ'; + + @override + String get chipActionCreateVault => 'ನೆಲಮಾಳಿಗೆ ರಚಿಸಿ'; + + @override + String get chipActionConfigureVault => 'ನೆಲಮಾಳಿಗೆ ಸಂರಚಿಸಿ'; + + @override + String get entryActionCopyToClipboard => 'ಕ್ಲಿಪ್‌ಬೋರ್ಡ್ ಗೆ ನಕಲಿಸಿ'; + + @override + String get entryActionDelete => 'ಅಳಿಸಿ'; + + @override + String get entryActionConvert => 'ಪರಿವರ್ತಿಸಿ'; + + @override + String get entryActionExport => 'ರಫ್ತು'; + + @override + String get entryActionInfo => 'ಮಾಹಿತಿ'; + + @override + String get entryActionRename => 'ಮರುನಾಮಕರಣ'; + + @override + String get entryActionRestore => 'ಮರುಸ್ಥಾಪಿಸಿ'; + + @override + String get entryActionRotateCCW => 'ಅಪ್ರದಕ್ಷಿಣಾಕಾರವಾಗಿ ತಿರುಗಿಸಿ'; + + @override + String get entryActionRotateCW => 'ಪ್ರದಕ್ಷಿಣಾಕಾರವಾಗಿ ತಿರುಗಿಸಿ'; + + @override + String get entryActionFlip => 'ಅಡ್ಡ ಮಗುಚು'; + + @override + String get entryActionPrint => 'ಮುದ್ರಿಸು'; + + @override + String get entryActionShare => 'ಹಂಚಿಕೊಳ್ಳಿ'; + + @override + String get entryActionShareImageOnly => 'ಚಿತ್ರವನ್ನು ಮಾತ್ರ ಹಂಚಿಕೊಳ್ಳಿ'; + + @override + String get entryActionShareVideoOnly => 'ವಿಡಿಯೋವನ್ನು ಮಾತ್ರ ಹಂಚಿಕೊಳ್ಳಿ'; + + @override + String get entryActionViewSource => 'ಮೂಲವನ್ನು ನೋಡಿ'; + + @override + String get entryActionShowGeoTiffOnMap => 'ನಕ್ಷೆಯ ಮೇಲ್ಪದರದಲ್ಲಿ ತೋರಿಸಿ'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'ಸ್ಥಿರ ಚಿತ್ರವಾಗಿ ಮಾರ್ಪಡಿಸಿ'; + + @override + String get entryActionViewMotionPhotoVideo => 'ವಿಡಿಯೋ ತೆರೆಯಿರಿ'; + + @override + String get entryActionEdit => 'ಸಂಪಾದಿಸಿ'; + + @override + String get entryActionOpen => 'ಇಂದ ತೆರೆಯಿರಿ'; + + @override + String get entryActionSetAs => 'ಇದಾಗಿ ಸೆಟ್ ಮಾಡಿ'; + + @override + String get entryActionCast => 'ಕ್ಯಾಸ್ಟ್'; + + @override + String get entryActionOpenMap => 'ನಕ್ಷೆಯ ಆಪ್ ನಲ್ಲಿ ತೋರಿಸಿ'; + + @override + String get entryActionRotateScreen => 'ಪರದೆಯನ್ನು ತಿರುಗಿಸಿ'; + + @override + String get entryActionAddFavourite => 'ನೆಚ್ಚಿನದಕ್ಕೆ ಸೇರಿಸಿ'; + + @override + String get entryActionRemoveFavourite => 'ನೆಚ್ಚಿನವುಗಳಿಂದ ತೆಗೆಯಿರಿ'; + + @override + String get videoActionCaptureFrame => 'ಫ್ರೇಮ್ ಸೆರೆಹಿಡಿಯಿರಿ'; + + @override + String get videoActionMute => 'ಸದ್ದಡಗಿಸಿ'; + + @override + String get videoActionUnmute => 'ಸದ್ದಾಗಿಸಿ'; + + @override + String get videoActionPause => 'ತಾಳು'; + + @override + String get videoActionPlay => 'ಪ್ಲೇ ಮಾಡಿ'; + + @override + String get videoActionReplay10 => '೧೦ ಕ್ಷಣ ಹಿಂದೆ ಓಡಿಸಿ'; + + @override + String get videoActionSkip10 => '೧೦ ಕ್ಷಣ ಮುಂದೆ ಓಡಿಸಿ'; + + @override + String get videoActionShowPreviousFrame => 'ಹಿಂದಿನ ಫ್ರೇಮ್ ತೋರಿಸಿ'; + + @override + String get videoActionShowNextFrame => 'ಮುಂದಿನ ಫ್ರೇಮ್ ತೋರಿಸಿ'; + + @override + String get videoActionSelectStreams => 'ಟ್ರ್ಯಾಕ್ ಆರಿಸಿ'; + + @override + String get videoActionSetSpeed => 'ಚಲನೆಯ ವೇಗ'; + + @override + String get videoActionABRepeat => 'A-B ಪುನರಾವರ್ತನೆ'; + + @override + String get videoRepeatActionSetStart => 'ಪ್ರಾರಂಭವನ್ನು ಹೊಂದಿಸಿ'; + + @override + String get videoRepeatActionSetEnd => 'ಅಂತ್ಯವನ್ನು ಹೊಂದಿಸಿ'; + + @override + String get viewerActionSettings => 'ಸಂಯೋಜನೆಗಳು'; + + @override + String get viewerActionLock => 'ನೋಟವನ್ನು ಬಂಧಿಸಿ'; + + @override + String get viewerActionUnlock => 'ನೋಟವನ್ನು ಬಿಡುಗಡೆಗೊಳಿಸಿ'; + + @override + String get slideshowActionResume => 'ಪುನರಾರಂಭಿಸಿ'; + + @override + String get slideshowActionShowInCollection => 'ಸಂಗ್ರಹದಲ್ಲಿ ತೋರಿಸಿ'; + + @override + String get entryInfoActionEditDate => 'ದಿನಾಂಕ ಮತ್ತು ಸಮಯವನ್ನು ತಿದ್ದಿ'; + + @override + String get entryInfoActionEditLocation => 'ಸ್ಥಳವನ್ನು ತಿದ್ದಿ'; + + @override + String get entryInfoActionEditTitleDescription => 'ಶೀರ್ಷಿಕೆ ಮತ್ತು ವಿವರಣೆಯನ್ನು ತಿದ್ದಿ'; + + @override + String get entryInfoActionEditRating => 'ಮೌಲ್ಯವನ್ನು ತಿದ್ದಿ'; + + @override + String get entryInfoActionEditTags => 'Tagಗಳನ್ನು ತಿದ್ದಿ'; + + @override + String get entryInfoActionRemoveMetadata => 'metadata ತೆಗೆಯಿರಿ'; + + @override + String get entryInfoActionExportMetadata => 'metadata ರಪ್ತು ಮಾಡಿ'; + + @override + String get entryInfoActionRemoveLocation => 'ಸ್ಥಳದ ವಿವರಗಳನ್ನು ತೆಗೆಯಿರಿ'; + + @override + String get editorActionTransform => 'ರೂಪಾಂತರ'; + + @override + String get editorTransformCrop => 'ಕತ್ತರಿಸು'; + + @override + String get editorTransformRotate => 'ತಿರುಗಿಸು'; + + @override + String get cropAspectRatioFree => 'ಉಚಿತ'; + + @override + String get cropAspectRatioOriginal => 'ಮೂಲ'; + + @override + String get cropAspectRatioSquare => 'ಚೌಕ'; + + @override + String get filterAspectRatioLandscapeLabel => 'ಭೂದೃಶ್ಯ'; + + @override + String get filterAspectRatioPortraitLabel => 'ಭಾವಚಿತ್ರ'; + + @override + String get filterBinLabel => 'ಮರುಬಳಕೆ ತೊಟ್ಟಿ'; + + @override + String get filterFavouriteLabel => 'ಅಚ್ಚುಮೆಚ್ಚು'; + + @override + String get filterNoDateLabel => 'ದಿನಾಂಕವಿಲ್ಲ'; + + @override + String get filterNoAddressLabel => 'ವಿಳಾಸವಿಲ್ಲ'; + + @override + String get filterLocatedLabel => 'ನೆಲೆಗೊಳಿಸಿದ್ದು'; + + @override + String get filterNoLocationLabel => 'ನೆಲೆ ಇಲ್ಲದ್ದು'; + + @override + String get filterNoRatingLabel => 'ಮೌಲ್ಯ ರಹಿತ'; + + @override + String get filterTaggedLabel => 'ಮೌಲ್ಯ ಸಹಿತ'; + + @override + String get filterNoTagLabel => 'ಮೌಲ್ಯವಿಲ್ಲದ್ದು'; + + @override + String get filterNoTitleLabel => 'ಶೀರ್ಷಿಕೆ ರಹಿತ'; + + @override + String get filterOnThisDayLabel => 'ಈ ದಿನದಂದು'; + + @override + String get filterRecentlyAddedLabel => 'ಇತ್ತೀಚಿಗೆ ಸೇರಿಸಿದ್ದು'; + + @override + String get filterRatingRejectedLabel => 'ತಿರಸ್ಕರಿಸಿದ್ದು'; + + @override + String get filterTypeAnimatedLabel => 'ಆನಿಮೇಟೆಡ್'; + + @override + String get filterTypeMotionPhotoLabel => 'ಚಲಿಸುವ ಚಿತ್ರ'; + + @override + String get filterTypePanoramaLabel => 'ಪನೋರಮಾ'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° ವಿಡಿಯೋ'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'ಚಿತ್ರ'; + + @override + String get filterMimeVideoLabel => 'ವಿಡಿಯೋ'; + + @override + String get accessibilityAnimationsRemove => 'ಪರದೆಯ ಪರಿಣಾಮಗಳನ್ನು ತಡೆಯಿರಿ'; + + @override + String get accessibilityAnimationsKeep => 'ಪರದೆಯ ಪರಿಣಾಮಗಳನ್ನು ಇರಿಸಿ'; + + @override + String get albumTierNew => 'ಹೊಸ'; + + @override + String get albumTierPinned => 'ಚುಚ್ಚಿರುವುದು'; + + @override + String get albumTierGroups => 'ಗುಂಪುಗಳು'; + + @override + String get albumTierSpecial => 'ಸಾಮಾನ್ಯ'; + + @override + String get albumTierApps => 'ಅಪ್ಲಿಕೇಶನ್‌ಗಳು'; + + @override + String get albumTierVaults => 'ನೆಲಮಾಳಿಗೆಗಳು'; + + @override + String get albumTierDynamic => 'ಕ್ರಿಯಾಶೀಲ'; + + @override + String get albumTierRegular => 'ಇತರೆ'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'ದಶಮಾಂಶ ಡಿಗ್ರಿಗಳು'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'ಉ'; + + @override + String get coordinateDmsSouth => 'ದ'; + + @override + String get coordinateDmsEast => 'ಪೂ'; + + @override + String get coordinateDmsWest => 'ಪ'; + + @override + String get displayRefreshRatePreferHighest => 'ಗರಿಷ್ಠ ದರ'; + + @override + String get displayRefreshRatePreferLowest => 'ಕನಿಷ್ಠ ದರ'; + + @override + String get keepScreenOnNever => 'ಎಂದಿಗೂ ಇಲ್ಲ'; + + @override + String get keepScreenOnVideoPlayback => 'ವಿಡಿಯೋ ಚಲನೆಯಲ್ಲಿರುವಾಗ'; + + @override + String get keepScreenOnViewerOnly => 'ವೀಕ್ಷಣಾ ಪುಟದಲ್ಲಿ ಮಾತ್ರ'; + + @override + String get keepScreenOnAlways => 'ಯಾವಾಗಲೂ'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'ಗೂಗಲ್ ನಕಾಶೆಗಳು'; + + @override + String get mapStyleGoogleHybrid => 'ಗೂಗಲ್ ನಕಾಶೆಗಳು (ಹೈಬ್ರಿಡ್)'; + + @override + String get mapStyleGoogleTerrain => 'ಗೂಗಲ್ ನಕಾಶೆಗಳು (ಭೂ ಪ್ರದೇಶ)'; + + @override + String get mapStyleOsmLiberty => 'OSM ಸ್ವಾತಂತ್ರ್ಯ'; + + @override + String get mapStyleOpenTopoMap => 'ಓಪನ್ ಟೊಪೊ ಮ್ಯಾಪ್'; + + @override + String get mapStyleOsmHot => 'ಮಾನವೀಯ OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen ಜಲವರ್ಣ'; + + @override + String get maxBrightnessNever => 'ಎಂದಿಗೂ ಇಲ್ಲ'; + + @override + String get maxBrightnessAlways => 'ಯಾವಾಗಲೂ'; + + @override + String get nameConflictStrategyRename => 'ಮರುನಾಮಕರಣ'; + + @override + String get nameConflictStrategyReplace => 'ಬದಲಾಯಿಸು'; + + @override + String get nameConflictStrategySkip => 'ಬಿಟ್ಟುಬಿಡು'; + + @override + String get overlayHistogramNone => 'ಏನಿಲ್ಲ'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'ಪ್ರಕಾಶ'; + + @override + String get subtitlePositionTop => 'ಮೇಲ್ತುದಿ'; + + @override + String get subtitlePositionBottom => 'ಬುಡ'; + + @override + String get themeBrightnessLight => 'ತಿಳಿ ಬಣ್ಣ'; + + @override + String get themeBrightnessDark => 'ಗಾಢ ಬಣ್ಣ'; + + @override + String get themeBrightnessBlack => 'ಕಡುಕಪ್ಪು'; + + @override + String get unitSystemMetric => 'ಮೆಟ್ರಿಕ್'; + + @override + String get unitSystemImperial => 'ಇಂಪೀರಿಯಲ್'; + + @override + String get vaultLockTypePattern => 'ಪ್ಯಾಟರ್ನ್'; + + @override + String get vaultLockTypePin => 'ಪಿನ್'; + + @override + String get vaultLockTypePassword => 'ಕೀಲಿಪದ'; + + @override + String get settingsVideoEnablePip => 'ಚಿತ್ರದೊಳಗಿನ ಚಿತ್ರಣ'; + + @override + String get videoControlsPlayOutside => 'ಇನ್ನೊಂದು ಪ್ಲೇಯರ್ ನಲ್ಲಿ ತೆರೆಯಿರಿ'; + + @override + String get videoLoopModeNever => 'ಇಂದಿಗೂ ಇಲ್ಲ'; + + @override + String get videoLoopModeShortOnly => 'ಚಿಕ್ಕ ವಿಡಿಯೋಗಳನ್ನು ಮಾತ್ರ'; + + @override + String get videoLoopModeAlways => 'ಯಾವಾಗಲೂ'; + + @override + String get videoPlaybackSkip => 'ಬಿಟ್ಟುಬಿಡು'; + + @override + String get videoPlaybackMuted => 'ಶಬ್ದರಹಿತವಾಗಿ ಪ್ಲೇ ಮಾಡಿ'; + + @override + String get videoPlaybackWithSound => 'ಶಬ್ದಸಹಿತವಾಗಿ ಪ್ಲೇ ಮಾಡಿ'; + + @override + String get videoResumptionModeNever => 'ಎಂದಿಗೂ ಇಲ್ಲ'; + + @override + String get videoResumptionModeAlways => 'ಯಾವಾಗಲೂ'; + + @override + String get viewerTransitionSlide => 'ಜಾರಿಸು'; + + @override + String get viewerTransitionParallax => 'ಪ್ಯಾರಾಲಾಕ್ಸ್'; + + @override + String get viewerTransitionFade => 'ಮರೆಯಾಗಿಸು'; + + @override + String get viewerTransitionZoomIn => 'ಹಿಗ್ಗಿಸು'; + + @override + String get viewerTransitionNone => 'ಏನಿಲ್ಲ'; + + @override + String get wallpaperTargetHome => 'ಮುಖ ಪರದೆ'; + + @override + String get wallpaperTargetLock => 'ಲಾಕ್ ಪರದೆ'; + + @override + String get wallpaperTargetHomeLock => 'ಮುಖ ಮತ್ತು ಲಾಕ್ ಪರದೆ'; + + @override + String get widgetDisplayedItemRandom => 'ಇಷ್ಟಬಂದಂತೆ'; + + @override + String get widgetDisplayedItemMostRecent => 'ಅತ್ಯಂತ ಇತ್ತೀಚಿನ'; + + @override + String get widgetOpenPageHome => 'ಮುಖ್ಯಪರದೆ ತೆರೆಯಿರಿ'; + + @override + String get widgetOpenPageCollection => 'ಸಂಗ್ರಹವನ್ನು ತೆರೆಯಿರಿ'; + + @override + String get widgetOpenPageViewer => 'ವೀಕ್ಷಕವನ್ನು ತೆರೆಯಿರಿ'; + + @override + String get widgetTapUpdateWidget => 'ವಿಜೆಟ್ ನವೀಕರಿಸಿ'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'ಆಂತರಿಕ ಸಂಗ್ರಹಣೆ'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'ಎಸ್ ಡಿ ಕಾರ್ಡ್'; + + @override + String get rootDirectoryDescription => 'ಮೂಲ ಕೋಶ'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” ಕೋಶ'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'ಈ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡಲು ಮುಂದಿನ ಪರದೆಯಲ್ಲಿ “$volume” ದ $directory ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿ.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return '$directory ನ “$volume”ನಲ್ಲಿರುವ ಕಡತಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಈ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸಲಾಗಿಲ್ಲ.\n\nದಯವಿಟ್ಟು ವಸ್ತುಗಳನ್ನು ಮತ್ತೊಂದು ಕೋಶಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸಲು ಮೊದಲೇ ಸ್ಥಾಪಿಸಲಾದ ಕಡತ ನಿರ್ವಾಹಕ ಅಥವಾ ಗ್ಯಾಲರಿ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸಿ.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'ಈ ಕಾರ್ಯಾಚರಣೆಗೆ ಪೂರ್ಣಗೊಳ್ಳಲು “$volume” ನಲ್ಲಿ $neededSize ಉಚಿತ ಸ್ಥಳಾವಕಾಶದ ಅಗತ್ಯವಿದೆ, ಆದರೆ ಕೇವಲ $freeSize ಮಾತ್ರ ಲಭ್ಯವಿದೆ.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'ವ್ಯವಸ್ಥೆಯ ಕಡತ ಆರಿಸುವಿಕೆ ಕಾಣೆಯಾಗಿದೆ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ದಯವಿಟ್ಟು ಅದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ ಮತ್ತು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ಈ ಕಾರ್ಯಾಚರಣೆಯು ಈ ವಿಧದ ವಸ್ತುಗಳಿಗೆ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ: $types.', + one: 'ಈ ಕಾರ್ಯಾಚರಣೆಯು ಈ ವಿಧದ ವಸ್ತುವಿಗೆ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'ಗಮ್ಯಸ್ಥಾನ ಕೋಶದಲ್ಲಿರುವ ಕೆಲವು ಕಡತಗಳು ಒಂದೇ ಹೆಸರನ್ನು ಹೊಂದಿವೆ.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'ಕೆಲವು ಕಡತಗಳು ಒಂದೇ ಹೆಸರನ್ನು ಹೊಂದಿವೆ.'; + + @override + String get addShortcutDialogLabel => 'ಶಾರ್ಟ್ಕಟ್ ಹೆಸರು'; + + @override + String get addShortcutButtonLabel => 'ಸೇರಿಸು'; + + @override + String get noMatchingAppDialogMessage => 'ಇದನ್ನು ನಿಭಾಯಿಸಬಲ್ಲ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಲ್ಲ.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ವಸ್ತುಗಳನ್ನು ಮರುಬಳಕೆ ತೊಟ್ಟಿಗೆ ಸ್ಥಳಾಂತರಿಸುವುದೇ?', + one: 'ಇದನ್ನು ಮರುಬಳಕೆ ತೊಟ್ಟಿಗೆ ಸ್ಥಳಾಂತರಿಸುವುದೇ?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ವಸ್ತುಗಳನ್ನು ಅಳಿಸುವುದೇ?', + one: 'ಇದನ್ನು ಅಳಿಸುವುದೇ?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'ಮುಂದುವರಿಯುವ ಮೊದಲು ವಸ್ತುವಿನ ದಿನಾಂಕಗಳನ್ನು ಉಳಿಸುವುದೇ?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'ದಿನಾಂಕಗಳನ್ನು ಉಳಿಸಿ'; + + @override + String videoResumeDialogMessage(String time) { + return '$timeಕ್ಕೆ ಪುನರಾರಂಭಿಸಲು ನೀವು ಬಯಸುವಿರಾ?'; + } + + @override + String get videoStartOverButtonLabel => 'ಬುಡದಿಂದ ಪ್ರಾರಂಭಿಸಿ'; + + @override + String get videoResumeButtonLabel => 'ಮುಂದುವರೆಸಿ'; + + @override + String get setCoverDialogLatest => 'ಹೊಚ್ಚಹೊಸ ವಸ್ತುಗಳು'; + + @override + String get setCoverDialogAuto => 'ಸ್ವಯಂಚಾಲಿತ'; + + @override + String get setCoverDialogCustom => 'ಇಚ್ಛಾನುಸಾರ'; + + @override + String get hideFilterConfirmationDialogMessage => 'ಹೊಂದಿಕೆಯ ಚಿತ್ರಗಳನ್ನು ಮತ್ತು ವೀಡಿಯೊಗಳನ್ನು ನಿಮ್ಮ ಸಂಗ್ರಹದಿಂದ ಮರೆಮಾಡಲಾಗುತ್ತದೆ. “ಗೌಪ್ಯತೆ” ಸಂಯೋಜನೆಗಳಿಂದ ನೀವು ಅವುಗಳನ್ನು ಮತ್ತೆ ತೋರಿಸಬಹುದು.\n\nನೀವು ಅವುಗಳನ್ನು ಮರೆಮಾಡಲು ಬಯಸುತ್ತೀರಾ?'; + + @override + String get newAlbumDialogTitle => 'ಹೊಸ ಆಲ್ಬಮ್'; + + @override + String get newAlbumDialogNameLabel => 'ಆಲ್ಬಮ್ ಹೆಸರು'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'ಆಲ್ಬಮ್ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'ಕೋಶವು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ'; + + @override + String get newAlbumDialogStorageLabel => 'ಸಂಗ್ರಹಣೆ:'; + + @override + String get newDynamicAlbumDialogTitle => 'ಹೊಸ ಡೈನಾಮಿಕ್ ಆಲ್ಬಮ್'; + + @override + String get dynamicAlbumAlreadyExists => 'ಡೈನಾಮಿಕ್ ಆಲ್ಬಮ್ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ'; + + @override + String get newGroupDialogTitle => 'ಹೊಸ ಗುಂಪು'; + + @override + String get newGroupDialogNameLabel => 'ಗುಂಪಿನ ಹೆಸರು'; + + @override + String get groupAlreadyExists => 'ಗುಂಪು ಈವಾಗಲೇ ಅಸ್ಥಿತ್ವದಲ್ಲಿದೆ'; + + @override + String get groupEmpty => 'ಯಾವುದೇ ಗುಂಪುಗಳಿಲ್ಲ'; + + @override + String get ungrouped => 'ಗುಂಪುಗಳಲ್ಲದವು'; + + @override + String get groupPickerTitle => 'ಗುಂಪನ್ನು ಆರಿಸಿ'; + + @override + String get groupPickerUseThisGroupButton => 'ಈ ಗುಂಪನ್ನು ಬಳಸಿ'; + + @override + String get newVaultWarningDialogMessage => + 'ನೆಲಮಾಳಿಗೆಯಲ್ಲಿನ ವಸ್ತುಗಳು ಈ ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ ಮಾತ್ರ ಲಭ್ಯವಿದೆ ಮತ್ತು ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಲ್ಲಿ ಇರುವುದಿಲ್ಲ.\n\nನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್ ನನ್ನು ಅಸ್ಥಾಪಿಸಿದರೆ ಅಥವಾ ಈ ಅಪ್ಲಿಕೇಶನ್ ದತ್ತಾಂಶಗಳನ್ನು ತೆರವುಗೊಳಿಸಿದರೆ, ನೀವು ಈ ಎಲ್ಲ ವಸ್ತುಗಳನ್ನು ಕಳೆದುಕೊಳ್ಳುತ್ತೀರಿ.'; + + @override + String get newVaultDialogTitle => 'ಹೊಸ ನೆಲಮಾಳಿಗೆ'; + + @override + String get configureVaultDialogTitle => 'ನೆಲಮಾಳಿಗೆಯನ್ನು ಸಂರಚಿಸಿ'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'ಪರದೆ ಬಂದಾದಾಗ ಲಾಕ್ ಮಾಡಿ'; + + @override + String get vaultDialogLockTypeLabel => 'ಲಾಕ್ ವಿಧ'; + + @override + String get patternDialogEnter => 'ಪ್ಯಾಟರ್ನ್ ನಮೂದಿಸಿ'; + + @override + String get patternDialogConfirm => 'ಪ್ಯಾಟರ್ನ್ ಖಚಿತಪಡಿಸಿ'; + + @override + String get pinDialogEnter => 'PIN ನಮೂದಿಸಿ'; + + @override + String get pinDialogConfirm => 'PIN ಖಚಿತಪಡಿಸಿ'; + + @override + String get passwordDialogEnter => 'ಕೀಲಿಪದ ನಮೂದಿಸಿ'; + + @override + String get passwordDialogConfirm => 'ಕೀಲಿಪದ ಖಚಿತಪಡಿಸಿ'; + + @override + String get authenticateToConfigureVault => 'ನೆಲಮಾಳಿಗೆಯನ್ನು ಸಂರಚಿಸಲು ಧೃಡೀಕರಿಸಿ'; + + @override + String get authenticateToUnlockVault => 'ನೆಲಮಾಳಿಗೆಯ ಲಾಕ್ ತೆಗೆಯಲು ಧೃಡೀಕರಿಸಿ'; + + @override + String get vaultBinUsageDialogMessage => 'ಕೆಲವು ನೆಲಮಾಳಿಗೆಗಳು ಮರುಬಳಕೆ ತೊಟ್ಟಿಯನ್ನು ಬಳಸುತ್ತಿವೆ.'; + + @override + String get renameAlbumDialogLabel => 'ಹೊಸ ಹೆಸರು'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'ಕೋಶವು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ'; + + @override + String get renameEntrySetPageTitle => 'ಮರುಹೆಸರಿಸಿ'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'ಹೆಸರಿಸುವ ಮಾದರಿ'; + + @override + String get renameEntrySetPageInsertTooltip => 'ಕ್ಷೇತ್ರವನ್ನು ಸೇರಿಸಿ'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'ಮುನ್ನೋಟ'; + + @override + String get renameProcessorCounter => 'ಗಣಕ'; + + @override + String get renameProcessorHash => 'ಹ್ಯಾಷ್'; + + @override + String get renameProcessorName => 'ಹೆಸರು'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ಈ ಆಲ್ಬಮ್ ಮತ್ತು ಅದರಲ್ಲಿರುವ $countString ವಸ್ತುಗಳನ್ನು ಅಳಿಸುವುದೇ?', + one: 'ಈ ಆಲ್ಬಮ್ ಮತ್ತು ಅದರಲ್ಲಿರುವ ವಸ್ತುವನ್ನು ಅಳಿಸುವುದೇ?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ಈ ಆಲ್ಬಮ್ ಗಳನ್ನು ಮತ್ತು ಅದರಲ್ಲಿರುವ $countString ವಸ್ತುಗಳನ್ನು ಅಳಿಸುವುದೇ?', + one: 'ಈ ಆಲ್ಬಮ್ ಗಳನ್ನು ಮತ್ತು ಅದರಲ್ಲಿರುವ ವಸ್ತುವನ್ನು ಅಳಿಸುವುದೇ?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'ಸ್ವರೂಪ:'; + + @override + String get exportEntryDialogWidth => 'ಅಗಲ'; + + @override + String get exportEntryDialogHeight => 'ಎತ್ತರ'; + + @override + String get exportEntryDialogQuality => 'ಗುಣಮಟ್ಟ'; + + @override + String get exportEntryDialogWriteMetadata => 'ಮೆಟಾಡೇಟಾ ಬರೆಯಿರಿ'; + + @override + String get renameEntryDialogLabel => 'ಹೊಸ ಹೆಸರು'; + + @override + String get editEntryDialogCopyFromItem => 'ಇತರ ವಸ್ತುವಿನಿಂದ ನಕಲಿಸಿ'; + + @override + String get editEntryDialogTargetFieldsHeader => 'ಮಾರ್ಪಡಿಸುವ ಕ್ಷೇತ್ರಗಳು'; + + @override + String get editEntryDateDialogTitle => 'ದಿನಾಂಕ ಮತ್ತು ಸಮಯ'; + + @override + String get editEntryDateDialogSetCustom => 'ನಿಗದಿತ ದಿನಾಂಕವನ್ನು ಹೊಂದಿಸಿ'; + + @override + String get editEntryDateDialogCopyField => 'ಬೇರೆಯ ದಿನಾಂಕದಿಂದ ನಕಲಿಸಿ'; + + @override + String get editEntryDateDialogExtractFromTitle => 'ಶೀರ್ಷಿಕೆಯಿಂದ ಆಯ್ದು ತೆಗೆಯಿರಿ'; + + @override + String get editEntryDateDialogShift => 'ಸ್ಥಳಾಂತರಿಸು'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'ಕಡತ ಮಾರ್ಪಡಿಸಿದ ದಿನಾಂಕ'; + + @override + String get durationDialogHours => 'ಘಂಟೆಗಳು'; + + @override + String get durationDialogMinutes => 'ನಿಮಿಷಗಳು'; + + @override + String get durationDialogSeconds => 'ಕ್ಷಣಗಳು'; + + @override + String get editEntryLocationDialogTitle => 'ಸ್ಥಳ'; + + @override + String get editEntryLocationDialogSetCustom => 'ನಿಗದಿತ ಸ್ಥಳವನ್ನು ಹೊಂದಿಸಿ'; + + @override + String get editEntryLocationDialogChooseOnMap => 'ನಕ್ಷೆಯಲ್ಲಿ ಆರಿಸಿ'; + + @override + String get editEntryLocationDialogImportGpx => 'ಜಿಪಿಎಕ್ಸ್ ಆಮದು ಮಾಡಿ'; + + @override + String get editEntryLocationDialogLatitude => 'ಅಕ್ಷಾಂಶ'; + + @override + String get editEntryLocationDialogLongitude => 'ರೇಖಾಂಶ'; + + @override + String get editEntryLocationDialogTimeShift => 'ಸಮಯ ಸ್ಥಳಾಂತರ'; + + @override + String get locationPickerUseThisLocationButton => 'ಈ ಸ್ಥಳವನ್ನು ಬಳಸಿ'; + + @override + String get editEntryRatingDialogTitle => 'ರೇಟಿಂಗ್'; + + @override + String get removeEntryMetadataDialogTitle => 'ಮೆಟಾಡೇಟಾ ತೆಗೆಯುವಿಕೆ'; + + @override + String get removeEntryMetadataDialogAll => 'ಎಲ್ಲವೂ'; + + @override + String get removeEntryMetadataDialogMore => 'ಇನ್ನಷ್ಟು'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'ಚಲನೆಯ ಚಿತ್ರದ ಒಳಗೆ ವೀಡಿಯೊವನ್ನು ಚಾಲನೆ ಮಾಡಲು XMP ಅಗತ್ಯವಿದೆ.\n\nನೀವು ಅದನ್ನು ತೆಗೆದುಹಾಕಲು ಬಯಸುತ್ತೀರಾ?'; + + @override + String get videoSpeedDialogLabel => 'ಚಾಲನೆಯ ವೇಗ'; + + @override + String get videoStreamSelectionDialogVideo => 'ವಿಡಿಯೋ'; + + @override + String get videoStreamSelectionDialogAudio => 'ಆಡಿಯೋ'; + + @override + String get videoStreamSelectionDialogText => 'ಅಡಿಬರಹ'; + + @override + String get videoStreamSelectionDialogOff => 'ನಂದಿಸು'; + + @override + String get videoStreamSelectionDialogTrack => 'ಜಾಡು'; + + @override + String get videoStreamSelectionDialogNoSelection => 'ಬೇರೆ ಯಾವುದೇ ಹಾಡುಗಳಿಲ್ಲ.'; + + @override + String get genericSuccessFeedback => 'ಮುಗಿದಿದೆ!'; + + @override + String get genericFailureFeedback => 'ವಿಫಲವಾಗಿದೆ'; + + @override + String get genericDangerWarningDialogMessage => 'ನೀವು ಖಚಿತಪಡಿಸುವಿರೇ?'; + + @override + String get tooManyItemsErrorDialogMessage => 'ಕಡಿಮೆ ವಸ್ತುಗಳೊಂದಿಗೆ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.'; + + @override + String get menuActionConfigureView => 'ನೋಟ'; + + @override + String get menuActionSelect => 'ಆರಿಸು'; + + @override + String get menuActionSelectAll => 'ಎಲ್ಲವನ್ನು ಆರಿಸು'; + + @override + String get menuActionSelectNone => 'ಏನನ್ನು ಆರಿಸಬೇಡಿ'; + + @override + String get menuActionMap => 'ನಕ್ಷೆ'; + + @override + String get menuActionSlideshow => 'ಸ್ಲೈಡ್ ಶೋ'; + + @override + String get menuActionStats => 'ಅಂಕಿಅಂಶಗಳು'; + + @override + String get viewDialogSortSectionTitle => 'ವಿಂಗಡಿಸಿ'; + + @override + String get viewDialogGroupSectionTitle => 'ವಿಭಾಗಗಳು'; + + @override + String get viewDialogLayoutSectionTitle => 'ವಿನ್ಯಾಸ'; + + @override + String get viewDialogReverseSortOrder => 'ಹಿಮ್ಮುಖ ವಿಂಗಡಣೆ ಕ್ರಮ'; + + @override + String get tileLayoutMosaic => 'ಮೊಸಾಯಿಕ್'; + + @override + String get tileLayoutGrid => 'ಜಾಲ'; + + @override + String get tileLayoutList => 'ಪಟ್ಟಿ'; + + @override + String get castDialogTitle => 'ಬಿತ್ತರಿಸುವ ಸಾಧನಗಳು'; + + @override + String get coverDialogTabCover => 'ರಕ್ಷಾಕವಚ'; + + @override + String get coverDialogTabApp => 'ಅಪ್ಲಿಕೇಶನ್'; + + @override + String get coverDialogTabColor => 'ವರ್ಣ'; + + @override + String get appPickDialogTitle => 'ಅಪ್ಲಿಕೇಶನ್ ಆರಿಸಿ'; + + @override + String get appPickDialogNone => 'ಏನಿಲ್ಲ'; + + @override + String get aboutPageTitle => 'ಕುರಿತು'; + + @override + String get aboutLinkLicense => 'ಪರವಾನಗಿ'; + + @override + String get aboutLinkPolicy => 'ಗೌಪ್ಯತೆ ನೀತಿ'; + + @override + String get aboutBugSectionTitle => 'ದೋಷದ ವರದಿ'; + + @override + String get aboutBugSaveLogInstruction => 'ಅಪ್ಲಿಕೇಶನ್ ದಾಖಲೆಗಳನ್ನು ಕಡತಕ್ಕೆ ಉಳಿಸಿ'; + + @override + String get aboutBugCopyInfoInstruction => 'ಸಾಧನದ ಮಾಹಿತಿಯನ್ನು ನಕಲಿಸಿ'; + + @override + String get aboutBugCopyInfoButton => 'ನಕಲಿಸಿ'; + + @override + String get aboutBugReportInstruction => 'ದಾಖಲೆಗಳು ಮತ್ತು ಸಾಧನದ ಮಾಹಿತಿಯ ಜೊತೆಗೆ Githubನಲ್ಲಿ ವರದಿ ಮಾಡಿ'; + + @override + String get aboutBugReportButton => 'ವರದಿ'; + + @override + String get aboutDataUsageSectionTitle => 'ದತ್ತಾಂಶ ಬಳಕೆ'; + + @override + String get aboutDataUsageData => 'ದತ್ತಾಂಶ'; + + @override + String get aboutDataUsageCache => 'ತಾತ್ಕಾಲಿಕ ಸಂಗ್ರಹ'; + + @override + String get aboutDataUsageDatabase => 'ದತ್ತಾಂಶ ಸಂಚಯ'; + + @override + String get aboutDataUsageMisc => 'ನಾನಾ ರೀತಿಯ'; + + @override + String get aboutDataUsageInternal => 'ಆಂತರಿಕ'; + + @override + String get aboutDataUsageExternal => 'ಬಾಹ್ಯ'; + + @override + String get aboutDataUsageClearCache => 'ಕ್ಯಾಶೆ ಸಂಗ್ರಹ ಅಳಿಸಿ'; + + @override + String get aboutCreditsSectionTitle => 'ಮನ್ನಣೆಗಳು'; + + @override + String get aboutCreditsWorldAtlas1 => 'ಈ ಅಪ್ಲಿಕೇಶನ್ TopoJSON ಕಡತವನ್ನು ಇವರಿಂದ ಬಳಸುತ್ತದೆ'; + + @override + String get aboutCreditsWorldAtlas2 => 'ISC ಪರವಾನಗಿ ಅಡಿಯಲ್ಲಿ.'; + + @override + String get aboutTranslatorsSectionTitle => 'ಅನುವಾದಕರು'; + + @override + String get aboutLicensesSectionTitle => 'ಮುಕ್ತ-ಮೂಲ ಪರವಾನಗಿಗಳು'; + + @override + String get aboutLicensesBanner => 'ಈ ಅಪ್ಲಿಕೇಶನ್ ಈ ಕೆಳಗಿನ ಮುಕ್ತ-ಮೂಲ ಪೊಟ್ಟಣಗಳು ಮತ್ತು ಭಂಡಾರಗಳನ್ನು ಬಳಸುತ್ತದೆ.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'ಆಂಡ್ರಾಯ್ಡ್ ಭಂಡಾರಗಳು'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'ಫ್ಲಟರ್ ಪ್ಲಗಿನ್‌ಗಳು'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'ಫ್ಲಟರ್ ಪ್ಯಾಕೇಜುಗಳು'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'ಡಾರ್ಟ್ ಪ್ಯಾಕೇಜುಗಳು'; + + @override + String get aboutLicensesShowAllButtonLabel => 'ಎಲ್ಲಾ ಪರವಾನಗಿಗಳನ್ನು ತೋರಿಸಿ'; + + @override + String get policyPageTitle => 'ಗೌಪ್ಯತೆ ನೀತಿ'; + + @override + String get collectionPageTitle => 'ಸಂಗ್ರಹ'; + + @override + String get collectionPickPageTitle => 'ಆರಿಸಿ'; + + @override + String get collectionSelectPageTitle => 'ವಸ್ತುಗಳನ್ನು ಆರಿಸಿ'; + + @override + String get collectionActionShowTitleSearch => 'ಶೀರ್ಷಿಕೆ ಸೋಸುಕ ತೋರಿಸಿ'; + + @override + String get collectionActionHideTitleSearch => 'ಶೀರ್ಷಿಕೆ ಸೋಸುಕ ಅಡಗಿಸಿ'; + + @override + String get collectionActionAddDynamicAlbum => 'ಡೈನಾಮಿಕ್ ಆಲ್ಬಮ್ ಸೇರಿಸಿ'; + + @override + String get collectionActionAddShortcut => 'ಶಾರ್ಟ್‌ಕಟ್ ಸೇರಿಸಿ'; + + @override + String get collectionActionSetHome => 'ಮುಖಪುಟವಾಗಿ ಹೊಂದಿಸಿ'; + + @override + String get collectionActionEmptyBin => 'ತೊಟ್ಟಿಯನ್ನು ಖಾಲಿಮಾಡಿ'; + + @override + String get collectionActionCopy => 'ಆಲ್ಬಮ್‌ಗೆ ನಕಲಿಸಿ'; + + @override + String get collectionActionMove => 'ಆಲ್ಬಮ್‌ಗೆ ಸರಿಸಿ'; + + @override + String get collectionActionRescan => 'ಪುನಃ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ'; + + @override + String get collectionActionEdit => 'ಸಂಪಾದಿಸು'; + + @override + String get collectionSearchTitlesHintText => 'ಶೀರ್ಷಿಕೆಗಳನ್ನು ಹುಡುಕಿ'; + + @override + String get collectionGroupAlbum => 'ಆಲ್ಬಮ್ ನಂತೆ'; + + @override + String get collectionGroupMonth => 'ತಿಂಗಳಿನಂತೆ'; + + @override + String get collectionGroupDay => 'ದಿನದಂತೆ'; + + @override + String get sectionNone => 'ವಿಭಾಗಗಳಿಲ್ಲ'; + + @override + String get sectionUnknown => 'ಅಜ್ಞಾತ'; + + @override + String get dateToday => 'ಇಂದು'; + + @override + String get dateYesterday => 'ನಿನ್ನೆ'; + + @override + String get dateThisMonth => 'ಈ ತಿಂಗಳು'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ವಸ್ತುಗಳನ್ನು ಅಳಿಸಲು ವಿಫಲವಾಗಿದೆ', + one: '1 ವಸ್ತುವನ್ನು ಅಳಿಸಲು ವಿಫಲವಾಗಿದೆ', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ವಸ್ತುಗಳನ್ನು ನಕಲಿಸಲು ವಿಫಲವಾಗಿದೆ', + one: '1 ವಸ್ತುವನ್ನು ನಕಲಿಸಲು ವಿಫಲವಾಗಿದೆ', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ವಸ್ತುಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ವಿಫಲವಾಗಿದೆ', + one: '1 ವಸ್ತುವನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ವಿಫಲವಾಗಿದೆ', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ವಸ್ತುಗಳನ್ನು ಮರುಹೆಸರಿಸಲು ವಿಫಲವಾಗಿದೆ', + one: '1 ವಸ್ತುವನ್ನು ಮರುಹೆಸರಿಸಲು ವಿಫಲವಾಗಿದೆ', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ವಸ್ತುಗಳನ್ನು ಸಂಪಾದಿಸಲು ವಿಫಲವಾಗಿದೆ', + one: '1 ವಸ್ತುವನ್ನು ಸಂಪಾದಿಸಲು ವಿಫಲವಾಗಿದೆ', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ಪುಟಗಳನ್ನು ರಫ್ತು ಮಾಡಲು ವಿಫಲವಾಗಿದೆ', + one: '1 ಪುಟವನ್ನು ರಫ್ತು ಮಾಡಲು ವಿಫಲವಾಗಿದೆ', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ವಸ್ತುಗಳನ್ನು ನಕಲಿಸಲಾಗಿದೆ', + one: '1 ವಸ್ತುವನ್ನು ನಕಲಿಸಲಾಗಿದೆ', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ವಸ್ತುಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಲಾಗಿದೆ', + one: '1 ವಸ್ತುವನ್ನು ಸ್ಥಳಾಂತರಿಸಲಾಗಿದೆ', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ವಸ್ತುಗಳನ್ನು ಮರುಹೆಸರಿಸಲಾಗಿದೆ', + one: '1 ವಸ್ತುವನ್ನು ಮರುಹೆಸರಿಸಲಾಗಿದೆ', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ವಸ್ತುಗಳನ್ನು ಸಂಪಾದಿಸಲಾಗಿದೆ', + one: '1 ವಸ್ತುವನ್ನು ಸಂಪಾದಿಸಲಾಗಿದೆ', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'ಮೆಚ್ಚಿನವುಗಳಿಲ್ಲ'; + + @override + String get collectionEmptyVideos => 'ವೀಡಿಯೊಗಳಿಲ್ಲ'; + + @override + String get collectionEmptyImages => 'ಚಿತ್ರಗಳಿಲ್ಲ'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'ಪ್ರವೇಶವನ್ನು ನೀಡಿ'; + + @override + String get collectionSelectSectionTooltip => 'ವಿಭಾಗವನ್ನು ಆಯ್ಕೆಮಾಡಿ'; + + @override + String get collectionDeselectSectionTooltip => 'ವಿಭಾಗ ಆಯ್ಕೆ ರದ್ದುಮಾಡಿ'; + + @override + String get drawerAboutButton => 'ಕುರಿತು'; + + @override + String get drawerSettingsButton => 'ಸಂಯೋಜನೆಗಳು'; + + @override + String get drawerCollectionAll => 'ಎಲ್ಲಾ ಸಂಗ್ರಹ'; + + @override + String get drawerCollectionFavourites => 'ಮೆಚ್ಚಿನವುಗಳು'; + + @override + String get drawerCollectionImages => 'ಚಿತ್ರಗಳು'; + + @override + String get drawerCollectionVideos => 'ವೀಡಿಯೊಗಳು'; + + @override + String get drawerCollectionAnimated => 'ಅನಿಮೇಟೆಡ್'; + + @override + String get drawerCollectionMotionPhotos => 'ಚಲಿಸುವ ಚಿತ್ರಗಳು'; + + @override + String get drawerCollectionPanoramas => 'ಪನೋರಮಾಗಳು'; + + @override + String get drawerCollectionRaws => 'Raw ಚಿತ್ರಗಳು'; + + @override + String get drawerCollectionSphericalVideos => '360° ವಿಡಿಯೋಗಳು'; + + @override + String get drawerAlbumPage => 'ಆಲ್ಬಮ್ ಗಳು'; + + @override + String get drawerCountryPage => 'ದೇಶಗಳು'; + + @override + String get drawerPlacePage => 'ಸ್ಥಳಗಳು'; + + @override + String get drawerTagPage => 'ಟ್ಯಾಗುಗಳು'; + + @override + String get sortByDate => 'ದಿನಾಂಕದಂತೆ'; + + @override + String get sortByName => 'ಹೆಸರಿನಂತೆ'; + + @override + String get sortByItemCount => 'ವಸ್ತುಗಳ ಎಣಿಕೆಯಂತೆ'; + + @override + String get sortBySize => 'ಗಾತ್ರದಂತೆ'; + + @override + String get sortByAlbumFileName => 'ಆಲ್ಬಮ್ ಮತ್ತು ಕಡತದ ಹೆಸರಿನಂತೆ'; + + @override + String get sortByRating => 'ದರದಂತೆ'; + + @override + String get sortByDuration => 'ಅವಧಿಯಂತೆ'; + + @override + String get sortByPath => 'ಮಾರ್ಗದ ಮೂಲಕ'; + + @override + String get sortOrderNewestFirst => 'ಹೊಸದು ಮೊದಲು'; + + @override + String get sortOrderOldestFirst => 'ಹಳೆಯದು ಮೊದಲು'; + + @override + String get sortOrderAtoZ => 'ವರ್ಣಮಾಲೆಯಂತೆ (A to Z)'; + + @override + String get sortOrderZtoA => 'ವರ್ಣಮಾಲೆಯ ವಿರುದ್ಧವಾಗಿ (Z to A)'; + + @override + String get sortOrderHighestFirst => 'ಹೆಚ್ಚಿನದು ಮೊದಲು'; + + @override + String get sortOrderLowestFirst => 'ಕಡಿಮೆಯದು ಮೊದಲು'; + + @override + String get sortOrderLargestFirst => 'ದೊಡ್ಡದು ಮೊದಲು'; + + @override + String get sortOrderSmallestFirst => 'ಚಿಕ್ಕದು ಮೊದಲು'; + + @override + String get sortOrderShortestFirst => 'ಗಿಡ್ಡದ್ದು ಮೊದಲು'; + + @override + String get sortOrderLongestFirst => 'ಉದ್ದದ್ದು ಮೊದಲು'; + + @override + String get albumGroupTier => 'ಶ್ರೇಣಿಯಂತೆ'; + + @override + String get albumGroupType => 'ಪ್ರಕಾರದಂತೆ'; + + @override + String get albumGroupVolume => 'ಸಂಗ್ರಹಣೆಯ ಗಾತ್ರದಂತೆ'; + + @override + String get albumMimeTypeMixed => 'ಮಿಶ್ರಿತ'; + + @override + String get albumPickPageTitleCopy => 'ಆಲ್ಬಮ್‌ಗೆ ನಕಲಿಸಿ'; + + @override + String get albumPickPageTitleExport => 'ಆಲ್ಬಮ್‌ಗೆ ರಫ್ತು ಮಾಡಿ'; + + @override + String get albumPickPageTitleMove => 'ಆಲ್ಬಮ್‌ಗೆ ಸ್ಥಳಾಂತರಿಸಿ'; + + @override + String get albumPickPageTitlePick => 'ಆಲ್ಬಮ್ ಆಯ್ಕೆಮಾಡಿ'; + + @override + String get albumCamera => 'ಕ್ಯಾಮೆರಾ'; + + @override + String get albumDownload => 'ಇಳಿಸು'; + + @override + String get albumScreenshots => 'ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳು'; + + @override + String get albumScreenRecordings => 'ಪರದೆ ಮುದ್ರಿಕೆಗಳು'; + + @override + String get albumVideoCaptures => 'ವಿಡಿಯೋ ಕೈಸೆರೆಗಳು'; + + @override + String get albumPageTitle => 'ಆಲ್ಬಮ್ ಗಳು'; + + @override + String get albumEmpty => 'ಆಲ್ಬಮ್‌ಗಳಿಲ್ಲ'; + + @override + String get createAlbumButtonLabel => 'ರಚಿಸು'; + + @override + String get newFilterBanner => 'ಹೊಸ'; + + @override + String get countryPageTitle => 'ದೇಶಗಳು'; + + @override + String get countryEmpty => 'ದೇಶಗಳಿಲ್ಲ'; + + @override + String get statePageTitle => 'ರಾಜ್ಯಗಳು'; + + @override + String get stateEmpty => 'ರಾಜ್ಯಗಳಿಲ್ಲ'; + + @override + String get placePageTitle => 'ಸ್ಥಳಗಳು'; + + @override + String get placeEmpty => 'ಸ್ಥಳಗಳಿಲ್ಲ'; + + @override + String get tagPageTitle => 'ಟ್ಯಾಗುಗಳು'; + + @override + String get tagEmpty => 'ಟ್ಯಾಗುಗಳಿಲ್ಲ'; + + @override + String get tagPickPageTitle => 'ಟ್ಯಾಗ್ ಆರಿಸಿ'; + + @override + String get binPageTitle => 'ಮರುಬಳಕೆ ತೊಟ್ಟಿ'; + + @override + String get explorerPageTitle => 'ಪರಿಶೋಧಕ'; + + @override + String get explorerActionSelectStorageVolume => 'ಸಂಗ್ರಹಣೆ ಆಯ್ಕೆ ಮಾಡಿ'; + + @override + String get selectStorageVolumeDialogTitle => 'ಸಂಗ್ರಹಣೆ ಆಯ್ಕೆ ಮಾಡಿ'; + + @override + String get searchCollectionFieldHint => 'ಸಂಗ್ರಹದಲ್ಲಿ ಹುಡುಕಿ'; + + @override + String get searchRecentSectionTitle => 'ಇತ್ತೀಚಿನವು'; + + @override + String get searchDateSectionTitle => 'ದಿನಾಂಕ'; + + @override + String get searchFormatSectionTitle => 'ಸ್ವರೂಪಗಳು'; + + @override + String get searchAlbumsSectionTitle => 'ಆಲ್ಬಮ್ ಗಳು'; + + @override + String get searchCountriesSectionTitle => 'ದೇಶಗಳು'; + + @override + String get searchStatesSectionTitle => 'ರಾಜ್ಯಗಳು'; + + @override + String get searchPlacesSectionTitle => 'ಸ್ಥಳಗಳು'; + + @override + String get searchTagsSectionTitle => 'ಟ್ಯಾಗುಗಳು'; + + @override + String get searchRatingSectionTitle => 'ದರಗಳು'; + + @override + String get searchMetadataSectionTitle => 'ಮೆಟಾಡೇಟಾ'; + + @override + String get settingsPageTitle => 'ಸಂಯೋಜನೆಗಳು'; + + @override + String get settingsSystemDefault => 'ಸಿಸ್ಟಮ್ ಡೀಫಾಲ್ಟ್'; + + @override + String get settingsDefault => 'ಡೀಫಾಲ್ಟ್'; + + @override + String get settingsDisabled => 'ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ'; + + @override + String get settingsEnabled => 'ಸಕ್ರಿಯವಾಗಿದೆ'; + + @override + String get settingsForced => 'ಬಲವಂತವಾಗಿ'; + + @override + String get settingsAskEverytime => 'ಪ್ರತಿಬಾರಿಯೂ ಕೇಳಿ'; + + @override + String get settingsModificationWarningDialogMessage => 'ಇತರ ಸಂಯೋಜನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲಾಗುತ್ತದೆ.'; + + @override + String get settingsSearchFieldLabel => 'ಸಂಯೋಜನೆಗಳಲ್ಲಿ ಹುಡುಕಿ'; + + @override + String get settingsSearchEmpty => 'ಹೊಂದುವ ಸಂಯೋಜನೆಗಳಿಲ್ಲ'; + + @override + String get settingsActionExport => 'ರಫ್ತು'; + + @override + String get settingsActionExportDialogTitle => 'ರಫ್ತು'; + + @override + String get settingsActionImport => 'ಆಮದು'; + + @override + String get settingsActionImportDialogTitle => 'ಆಮದು'; + + @override + String get appExportCovers => 'ರಕ್ಷಾಕವಚಗಳು'; + + @override + String get appExportDynamicAlbums => 'ಡೈನಾಮಿಕ್ ಆಲ್ಬಮ್ ಗಳು'; + + @override + String get appExportFavourites => 'ಮೆಚ್ಚಿನವುಗಳು'; + + @override + String get appExportSettings => 'ಸಂಯೋಜನೆಗಳು'; + + @override + String get settingsNavigationSectionTitle => 'ಸಂಚಾರ'; + + @override + String get settingsHomeTile => 'ಮುಖಪುಟ'; + + @override + String get settingsHomeDialogTitle => 'ಮುಖಪುಟ'; + + @override + String get setHomeCustom => 'ಇಚ್ಛಾನುಸಾರ'; + + @override + String get settingsKeepScreenOnTile => 'ಪರದೆಯನ್ನು ಚಾಲೂ ಇಡಿ'; + + @override + String get settingsKeepScreenOnDialogTitle => 'ಪರದೆಯನ್ನು ಚಾಲೂ ಇಡಿ'; + + @override + String get settingsDoubleBackExit => 'ನಿರ್ಗಮಿಸಲು “ಹಿಂದೆ” ಎರಡು ಬಾರಿ ತಟ್ಟಿ'; + + @override + String get settingsConfirmationTile => 'ದೃಢೀಕರಣ ಸಂವಾದಗಳು'; + + @override + String get settingsConfirmationDialogTitle => 'ದೃಢೀಕರಣ ಸಂವಾದಗಳು'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'ವಸ್ತುಗಳನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸುವ ಮೊದಲು ವಿಚಾರಿಸಿ'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'ವಸ್ತುಗಳನ್ನು ಮರುಬಳಕೆ ತೊಟ್ಟಿಗೆ ಸ್ಥಳಾಂತರಿಸುವ ಮೊದಲು ವಿಚಾರಿಸಿ'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'ದಿನಾಂಕವಿಲ್ಲದ ವಸ್ತುಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸುವ ಮೊದಲು ವಿಚಾರಿಸಿ'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'ವಸ್ತುಗಳನ್ನು ಮರುಬಳಕೆ ತೊಟ್ಟಿಗೆ ಸ್ಥಳಾಂತರಿಸಿದ ನಂತರ ಸಂದೇಶವನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsConfirmationVaultDataLoss => 'ನೆಲಮಾಳಿಗೆಯ ದತ್ತಾಂಶ ನಷ್ಟವಾಗುವುದನ್ನು ಎಚ್ಚರಿಸಿ'; + + @override + String get settingsNavigationDrawerTile => 'ನ್ಯಾವಿಗೇಷನ್ ಮೆನು'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'ನ್ಯಾವಿಗೇಷನ್ ಮೆನು'; + + @override + String get settingsNavigationDrawerBanner => 'ಮೆನು ವಸ್ತುಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ಮತ್ತು ಮರುಕ್ರಮಗೊಳಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ.'; + + @override + String get settingsNavigationDrawerTabTypes => 'ಪ್ರಕಾರಗಳು'; + + @override + String get settingsNavigationDrawerTabAlbums => 'ಆಲ್ಬಮ್ ಗಳು'; + + @override + String get settingsNavigationDrawerTabPages => 'ಪುಟಗಳು'; + + @override + String get settingsNavigationDrawerAddAlbum => 'ಆಲ್ಬಮ್ ಸೇರಿಸಿ'; + + @override + String get settingsNavigationBottomActionsTile => 'ಕೆಳಗಿನ ನ್ಯಾವಿಗೇಷನ್'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'ಕೆಳಗಿನ ನ್ಯಾವಿಗೇಷನ್'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'ಗುಂಡಿಗಳನ್ನು ಸರಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಹಿಡಿದುಕೊಳ್ಳಿ ಮತ್ತು ಕೆಳಗಿನ ನ್ಯಾವಿಗೇಷನ್ ಪಟ್ಟಿಯಲ್ಲಿ ಯಾವ ಕ್ರಿಯೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಿ.'; + + @override + String get settingsThumbnailSectionTitle => 'ಥಂಬ್‌ನೇಲ್‌ಗಳು'; + + @override + String get settingsThumbnailOverlayTile => 'ಮೇಲ್ಪದರ'; + + @override + String get settingsThumbnailOverlayPageTitle => 'ಮೇಲ್ಪದರ'; + + @override + String get settingsThumbnailShowHdrIcon => 'HDR ಸಂಕೇತ ತೋರಿಸಿ'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'ಮೆಚ್ಚಿನ ಸಂಕೇತ ತೋರಿಸಿ'; + + @override + String get settingsThumbnailShowTagIcon => 'ಟ್ಯಾಗು ಸಂಕೇತ ತೋರಿಸಿ'; + + @override + String get settingsThumbnailShowLocationIcon => 'ಸ್ಥಳದ ಚಿನ್ಹೆಯನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'ಚಲನಾ ಚಿತ್ರದ ಚಿನ್ಹೆಯನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsThumbnailShowRating => 'ದರವನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsThumbnailShowRawIcon => 'Raw ಚಿನ್ಹೆಯನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsThumbnailShowVideoDuration => 'ವಿಡಿಯೋ ಕಾಲಾವಧಿಯನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsCollectionQuickActionsTile => 'ತ್ವರಿತ ಕ್ರಮಗಳು'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'ತ್ವರಿತ ಕ್ರಮಗಳು'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'ತಡಕಾಟ'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'ಆರಿಸು'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'ಗುಂಡಿಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಮತ್ತು ವಸ್ತುಗಳನ್ನು ತಡಕಾಡುವಾಗ ಯಾವ ಕ್ರಿಯೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಬೇಕು ಎಂಬುದನ್ನು ಆರಿಸಿ.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'ಗುಂಡಿಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಮತ್ತು ವಸ್ತುಗಳನ್ನು ತಡಕಾಡುವಾಗ ಯಾವ ಕ್ರಿಯೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಬೇಕು ಎಂಬುದನ್ನು ಆರಿಸಿಕೊಳ್ಳಿ.'; + + @override + String get settingsCollectionBurstPatternsTile => 'ಬರ್ಸ್ಟ್ ಪ್ರಕಾರಗಳು'; + + @override + String get settingsCollectionBurstPatternsNone => 'ಏನಿಲ್ಲ'; + + @override + String get settingsViewerSectionTitle => 'ವೀಕ್ಷಕ'; + + @override + String get settingsViewerGestureSideTapNext => 'ಹಿಂದಿನ/ಮುಂದಿನ ವಸ್ತುವನ್ನು ತೋರಿಸಲು ಪರದೆಯ ಅಂಚಿನ ಮೇಲೆ ತಟ್ಟಿ'; + + @override + String get settingsViewerUseCutout => 'ಕಟೌಟ್ ಪ್ರದೇಶವನ್ನು ಬಳಸಿರಿ'; + + @override + String get settingsViewerMaximumBrightness => 'ಗರಿಷ್ಟ ಪ್ರಕಾಶಮಯ'; + + @override + String get settingsMotionPhotoAutoPlay => 'ಚಾಲನಾ ಚಿತ್ರಗಳ ಸ್ವಯಂಚಾಲನೆ'; + + @override + String get settingsImageBackground => 'ಚಿತ್ರದ ಹಿನ್ನೆಲೆ'; + + @override + String get settingsViewerQuickActionsTile => 'ತ್ವರಿತ ಕ್ರಮಗಳು'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'ತ್ವರಿತ ಕ್ರಮಗಳು'; + + @override + String get settingsViewerQuickActionEditorBanner => 'ಗುಂಡಿಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಮತ್ತು ವೀಕ್ಷಕದಲ್ಲಿ ಯಾವ ಕ್ರಿಯೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಬೇಕು ಎಂಬುದನ್ನು ಆರಿಸಿ.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'ಪ್ರದರ್ಶಿತ ಗುಂಡಿಗಳು'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'ಲಭ್ಯವಿರುವ ಗುಂಡಿಗಳು'; + + @override + String get settingsViewerQuickActionEmpty => 'ಗುಂಡಿಗಳಿಲ್ಲ'; + + @override + String get settingsViewerOverlayTile => 'ಮೇಲ್ಪದರ'; + + @override + String get settingsViewerOverlayPageTitle => 'ಮೇಲ್ಪದರ'; + + @override + String get settingsViewerShowOverlayOnOpening => 'ಪ್ರಾರಂಭದಲ್ಲಿ ತೋರಿಸಿ'; + + @override + String get settingsViewerShowHistogram => 'ಹಿಸ್ಟೋಗ್ರಾಮ್ ತೋರಿಸಿ'; + + @override + String get settingsViewerShowMinimap => 'ಚಿಕ್ಕನಕ್ಷೆಯನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsViewerShowZoomLevel => 'ಹಿಗ್ಗಿಸಿದ ಮಟ್ಟವನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsViewerShowInformation => 'ಮಾಹಿತಿಯನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsViewerShowInformationSubtitle => 'ಶೀರ್ಷಿಕೆ, ದಿನಾಂಕ, ಸ್ಥಳ ಇತ್ಯಾದಿಗಳನ್ನು ತೋರಿಸಿ.'; + + @override + String get settingsViewerShowRatingTags => 'ದರಗಳು ಮತ್ತು ಟ್ಯಾಗುಗಳನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsViewerShowShootingDetails => 'ಸೆರೆಹಿಡಿದ ವಿವರಗಳನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsViewerShowDescription => 'ವಿವರಣೆಗಳನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsViewerShowOverlayThumbnails => 'ಅಡಕವನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'ಮಸುಕು ಪರಿಣಾಮ'; + + @override + String get settingsViewerSlideshowTile => 'ಜಾರುಫಲಕ'; + + @override + String get settingsViewerSlideshowPageTitle => 'ಜಾರುಫಲಕ'; + + @override + String get settingsSlideshowRepeat => 'ಪುನರಾವರ್ತನೆ'; + + @override + String get settingsSlideshowShuffle => 'ಕಲಸು'; + + @override + String get settingsSlideshowFillScreen => 'ಪೂರ್ಣ ಪರದೆ'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'ಅನಿಮೇಟೆಡ್ ಹಿಗ್ಗಿಸಿದ ಪರಿಣಾಮ'; + + @override + String get settingsSlideshowTransitionTile => 'ಪರಿವರ್ತನೆ'; + + @override + String get settingsSlideshowIntervalTile => 'ಮಧ್ಯಂತರ'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'ವಿಡಿಯೋ ಪ್ಲೇಬ್ಯಾಕ್'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'ವಿಡಿಯೋ ಪ್ಲೇಬ್ಯಾಕ್'; + + @override + String get settingsVideoPageTitle => 'ವಿಡಿಯೋ ಸಂಯೋಜನೆಗಳು'; + + @override + String get settingsVideoSectionTitle => 'ವಿಡಿಯೋ'; + + @override + String get settingsVideoShowVideos => 'ವಿಡಿಯೋಗಳನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsVideoPlaybackTile => 'ಪ್ಲೇಬ್ಯಾಕ್'; + + @override + String get settingsVideoPlaybackPageTitle => 'ಪ್ಲೇಬ್ಯಾಕ್'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'ಯಂತ್ರಾಂಶ ವೇಗವರ್ಧನೆ'; + + @override + String get settingsVideoAutoPlay => 'ಸ್ವಯಂ ಚಾಲನೆ'; + + @override + String get settingsVideoLoopModeTile => 'ಆವರ್ತನ ಕ್ರಮ'; + + @override + String get settingsVideoLoopModeDialogTitle => 'ಆವರ್ತನ ಕ್ರಮ'; + + @override + String get settingsVideoResumptionModeTile => 'ಮುಂದುವರೆಸು'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'ಮುಂದುವರೆಸು'; + + @override + String get settingsVideoBackgroundMode => 'ಹಿನ್ನೆಲೆ ಕ್ರಮ'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'ಹಿನ್ನೆಲೆ ಕ್ರಮ'; + + @override + String get settingsVideoControlsTile => 'ನಿಯಂತ್ರಣಗಳು'; + + @override + String get settingsVideoControlsPageTitle => 'ನಿಯಂತ್ರಣಗಳು'; + + @override + String get settingsVideoButtonsTile => 'ಒತ್ತುಗುಂಡಿಗಳು'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'ಚಾಲನೆ/ವಿರಾಮ ಮಾಡಲು ದ್ವಿಗುಣ ತಟ್ಟಿ'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'ಮುಂದೆ/ಹಿಂದೆ ಚಲಿಸಲು ಪರದೆಯ ಅಂಚಿನಲ್ಲಿ ಮಾಡಲು ದ್ವಿಗುಣ ತಟ್ಟಿ'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'ಪ್ರಕಾಶ/ಶಬ್ದಪ್ರಮಾಣ ಹೊಂದಿಸಲು ಮೇಲಕ್ಕೆ ಅಥವಾ ಕೆಳಕ್ಕೆ ಜಾರಿಸಿ'; + + @override + String get settingsSubtitleThemeTile => 'ಅಡಿಬರಹ'; + + @override + String get settingsSubtitleThemePageTitle => 'ಅಡಿಬರಹ'; + + @override + String get settingsSubtitleThemeSample => 'ಇದು ಒಂದು ನಮೂನೆ.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'ಪಠ್ಯ ಜೋಡಣೆ'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'ಪಠ್ಯ ಜೋಡಣೆ'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'ಪಠ್ಯ ಸ್ಥಾನ'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'ಪಠ್ಯ ಸ್ಥಾನ'; + + @override + String get settingsSubtitleThemeTextSize => 'ಪಠ್ಯದ ಗಾತ್ರ'; + + @override + String get settingsSubtitleThemeShowOutline => 'ಬಾಹ್ಯರೇಖೆ ಮತ್ತು ನೆರಳನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsSubtitleThemeTextColor => 'ಪಠ್ಯದ ಬಣ್ಣ'; + + @override + String get settingsSubtitleThemeTextOpacity => 'ಪಠ್ಯದ ಪಾರದರ್ಶಕತೆ'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'ಹಿನ್ನೆಲೆ ಬಣ್ಣ'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'ಹಿನ್ನೆಲೆ ಪಾರದರ್ಶಕತೆ'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'ಎಡ'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'ಮಧ್ಯ'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'ಬಲ'; + + @override + String get settingsPrivacySectionTitle => 'ಗೌಪ್ಯತೆ'; + + @override + String get settingsAllowInstalledAppAccess => 'ಅಪ್ಲಿಕೇಶನ್ ಯಾದಿಗೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಿ'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'ಆಲ್ಬಮ್ ಪ್ರದರ್ಶನವನ್ನು ಸುಧಾರಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ'; + + @override + String get settingsAllowErrorReporting => 'ಅನಾಮಧೇಯ ದೋಷ ವರದಿಯನ್ನು ಅನುಮತಿಸಿ'; + + @override + String get settingsSaveSearchHistory => 'ಹುಡುಕಾಟದ ಇತಿಹಾಸವನ್ನು ಉಳಿಸಿ'; + + @override + String get settingsEnableBin => 'ಮರುಬಳಕೆಯ ತೊಟ್ಟಿಯನ್ನು ಬಳಸಿ'; + + @override + String get settingsEnableBinSubtitle => 'ಅಳಿಸಿದ ವಸ್ತುಗಳನ್ನು 30 ದಿನಗಳವರೆಗೆ ಇರಿಸಿ'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'ಮರುಬಳಕೆ ತೊಟ್ಟಿಯಲ್ಲಿರುವ ವಸ್ತುಗಳನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತಿದೆ.'; + + @override + String get settingsAllowMediaManagement => 'ಮಾಧ್ಯಮ ನಿರ್ವಹಣೆಯನ್ನು ಅನುಮತಿಸಿ'; + + @override + String get settingsHiddenItemsTile => 'ಮರೆಮಾಡಿದ ವಸ್ತುಗಳು'; + + @override + String get settingsHiddenItemsPageTitle => 'ಮರೆಮಾಡಿದ ವಸ್ತುಗಳು'; + + @override + String get settingsHiddenFiltersBanner => 'ಮರೆಮಾಡಿದ ಫಿಲ್ಟರ್‌ಗಳಿಗೆ ಹೊಂದಿಕೆಯಾಗುವ ಚಿತ್ರಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳು ನಿಮ್ಮ ಸಂಗ್ರಹಣೆಯಲ್ಲಿ ಗೋಚರಿಸುವುದಿಲ್ಲ.'; + + @override + String get settingsHiddenFiltersEmpty => 'ಮರೆಮಾಡಿದ ಫಿಲ್ಟರ್‌ಗಳಿಲ್ಲ'; + + @override + String get settingsStorageAccessTile => 'ಸಂಗ್ರಹಣೆ ಪ್ರವೇಶಾಧಿಕಾರ'; + + @override + String get settingsStorageAccessPageTitle => 'ಸಂಗ್ರಹಣೆ ಪ್ರವೇಶಾಧಿಕಾರ'; + + @override + String get settingsStorageAccessBanner => 'ಕೆಲವು ಕೋಶಗಳಿಗೆ ಕಡತಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸ್ಪಷ್ಟ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸುವ ಅಗತ್ಯವಿದೆ. ನೀವು ಈ ಹಿಂದೆ ಪ್ರವೇಶವನ್ನು ನೀಡಿದ ಕೋಶಗಳನ್ನು ನೀವು ಇಲ್ಲಿ ಪರಿಶೀಲಿಸಬಹುದು.'; + + @override + String get settingsStorageAccessEmpty => 'ಪ್ರವೇಶ ಅನುಮತಿಸಿಲ್ಲ'; + + @override + String get settingsStorageAccessRevokeTooltip => 'ಹಿಂಪಡೆಯಿರಿ'; + + @override + String get settingsAccessibilitySectionTitle => 'ಎಟುಕು'; + + @override + String get settingsRemoveAnimationsTile => 'ಅನಿಮೇಷನ್‌ಗಳನ್ನು ತೆಗೆದುಹಾಕಿ'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'ಅನಿಮೇಷನ್‌ಗಳನ್ನು ತೆಗೆಯಿರಿ'; + + @override + String get settingsTimeToTakeActionTile => 'ಕ್ರಮ ತೆಗೆದುಕೊಳ್ಳಲು ಸಮಯ'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'ಬಹುಸ್ಪರ್ಶ ಗೆಸ್ಚರ್ ಪರ್ಯಾಯಗಳನ್ನು ತೋರಿಸಿ'; + + @override + String get settingsDisplaySectionTitle => 'ಪ್ರದರ್ಶಕ'; + + @override + String get settingsThemeBrightnessTile => 'ಅಲಂಕಾರ'; + + @override + String get settingsThemeBrightnessDialogTitle => 'ಅಲಂಕಾರ'; + + @override + String get settingsThemeColorHighlights => 'ಬಣ್ಣದ ಮುಖ್ಯಾಂಶಗಳು'; + + @override + String get settingsThemeEnableDynamicColor => 'ಡೈನಾಮಿಕ್ ಬಣ್ಣ'; + + @override + String get settingsDisplayRefreshRateModeTile => 'ರಿಫ್ರೆಶ್ ದರವನ್ನು ಪ್ರದರ್ಶಿಸಿ'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'ರಿಫ್ರೆಶ್ ದರ'; + + @override + String get settingsDisplayUseTvInterface => 'ಆಂಡ್ರಾಯ್ಡ್ ಟಿವಿ ಇಂಟರ್ಫೇಸ್'; + + @override + String get settingsLanguageSectionTitle => 'ಭಾಷೆ ಮತ್ತು ಸ್ವರೂಪಗಳು'; + + @override + String get settingsLanguageTile => 'ಭಾಷೆ'; + + @override + String get settingsLanguagePageTitle => 'ಭಾಷೆ'; + + @override + String get settingsCoordinateFormatTile => 'ನಿರ್ದೇಶಾಂಕ ಸ್ವರೂಪ'; + + @override + String get settingsCoordinateFormatDialogTitle => 'ನಿರ್ದೇಶಾಂಕ ಸ್ವರೂಪ'; + + @override + String get settingsUnitSystemTile => 'ಏಕಮಾನಗಳು'; + + @override + String get settingsUnitSystemDialogTitle => 'ಏಕಮಾನಗಳು'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'ಅರೇಬಿಕ್ ಅಂಕಿಗಳನ್ನು ಒತ್ತಾಯಿಸಿ'; + + @override + String get settingsScreenSaverPageTitle => 'ಪರದೆ ರಕ್ಷಕ'; + + @override + String get settingsWidgetPageTitle => 'ಚಿತ್ರ ಚೌಕಟ್ಟು'; + + @override + String get settingsWidgetShowOutline => 'ರೂಪರೇಖೆ'; + + @override + String get settingsWidgetOpenPage => 'ವಿಜೆಟ್ ಮೇಲೆ ಸ್ಪರ್ಶಿಸುವಾಗ'; + + @override + String get settingsWidgetDisplayedItem => 'ಪ್ರದರ್ಶಿಸಲಾದ ವಸ್ತು'; + + @override + String get settingsCollectionTile => 'ಸಂಗ್ರಹ'; + + @override + String get statsPageTitle => 'ಅಂಕಿಅಂಶಗಳು'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು $countString ವಸ್ತುಗಳು ಹೊಂದಿವೆ', + one: 'ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು 1 ವಸ್ತು ಹೊಂದಿದೆ ', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'ಅಗ್ರ ದೇಶಗಳು'; + + @override + String get statsTopStatesSectionTitle => 'ಅಗ್ರ ರಾಜ್ಯಗಳು'; + + @override + String get statsTopPlacesSectionTitle => 'ಅಗ್ರ ಸ್ಥಳಗಳು'; + + @override + String get statsTopTagsSectionTitle => 'ಅಗ್ರ ಟ್ಯಾಗುಗಳು'; + + @override + String get statsTopAlbumsSectionTitle => 'ಅಗ್ರ ಆಲ್ಬಮ್ ಗಳು'; + + @override + String get viewerOpenPanoramaButtonLabel => 'ಪನೋರಮಾ ತೆರೆಯಿರಿ'; + + @override + String get viewerSetWallpaperButtonLabel => 'ಭಿತ್ತಿಚಿತ್ರ ಹೊಂದಿಸಿ'; + + @override + String get viewerErrorUnknown => 'ಅಯ್ಯೋ!'; + + @override + String get viewerErrorDoesNotExist => 'ಕಡತವು ಇನ್ಮುಂದೆ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ.'; + + @override + String get viewerInfoPageTitle => 'ವಿವರ'; + + @override + String get viewerInfoBackToViewerTooltip => 'ವೀಕ್ಷಕಕ್ಕೆ ಹಿಂದಿರುಗಿ'; + + @override + String get viewerInfoUnknown => 'ಅಜ್ಞಾತ'; + + @override + String get viewerInfoLabelDescription => 'ವಿವರಣೆ'; + + @override + String get viewerInfoLabelTitle => 'ಶೀರ್ಷಿಕೆ'; + + @override + String get viewerInfoLabelDate => 'ದಿನಾಂಕ'; + + @override + String get viewerInfoLabelResolution => 'ಅಳತೆ'; + + @override + String get viewerInfoLabelSize => 'ಪ್ರಮಾಣ'; + + @override + String get viewerInfoLabelUri => 'ಯು ಆರ್ ಐ'; + + @override + String get viewerInfoLabelPath => 'ಹಾದಿ'; + + @override + String get viewerInfoLabelDuration => 'ಅವಧಿ'; + + @override + String get viewerInfoLabelOwner => 'ಒಡೆಯ'; + + @override + String get viewerInfoLabelCoordinates => 'ನಿರ್ದೇಶಾಂಕ'; + + @override + String get viewerInfoLabelAddress => 'ವಿಳಾಸ'; + + @override + String get mapStyleDialogTitle => 'ನಕ್ಷೆಯ ಪ್ರಕಾರ'; + + @override + String get mapStyleDialogAddStyle => 'ಶೈಲಿಯನ್ನು ಸೇರಿಸಿ'; + + @override + String get mapStyleTooltip => 'ನಕ್ಷೆಯ ಶೈಲಿಯನ್ನು ಆಯ್ಕೆಮಾಡಿ'; + + @override + String get mapStyleEditorDialogName => 'ಹೆಸರು'; + + @override + String get mapStyleEditorDialogUrl => 'ಯು ಆರ್ ಎಲ್'; + + @override + String get mapStyleEditorDialogSubdomains => 'ಉಪಡೊಮೇನ್‌ಗಳು'; + + @override + String get mapStyleEditorDialogUserAgent => 'ಬಳಕೆದಾರ ಏಜೆಂಟ್'; + + @override + String get mapZoomInTooltip => 'ಹಿಗ್ಗಿಸು'; + + @override + String get mapZoomOutTooltip => 'ಕುಗ್ಗಿಸು'; + + @override + String get mapPointNorthUpTooltip => 'ಉತ್ತರದಿಕ್ಕನ್ನು ಮೇಲ್ಮುಖವಾಗಿ ಸೂಚಿಸು'; + + @override + String get mapAttributionOsmData => 'ನಕ್ಷೆಯ ದತ್ತಾಂಶ © [OpenStreetMap](https://www.openstreetmap.org/copyright) ಕೊಡುಗೆದಾರರು'; + + @override + String get mapAttributionOsmLiberty => 'ಬಿಲ್ಲೆಗಳನ್ನು ಒದಗಿಸಿದವರು [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • ಆಶ್ರಯದಾತರು [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | ಬಿಲ್ಲೆಗಳನ್ನು ಒದಗಿಸಿದವರು [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'ಬಿಲ್ಲೆಗಳನ್ನು ಒದಗಿಸಿದವರು [HOT](https://www.hotosm.org/) • ಆಶ್ರಯದಾತರು [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'ಬಿಲ್ಲೆಗಳನ್ನು ಒದಗಿಸಿದವರು [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'ನಕ್ಷೆ ಪುಟದಲ್ಲಿ ವೀಕ್ಷಿಸಿ'; + + @override + String get mapEmptyRegion => 'ಈ ಪ್ರದೇಶದಲ್ಲಿ ಯಾವುದೇ ಚಿತ್ರಗಳಿಲ್ಲ'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'ಹುದುಗಿಸಿದ ದತ್ತಾಂಶವನ್ನು ಹೊರತೆಗೆಯಲು ವಿಫಲವಾಗಿದೆ'; + + @override + String get viewerInfoOpenLinkText => 'ತೆರೆಯಿರಿ'; + + @override + String get viewerInfoViewXmlLinkText => 'XML ನೋಡಿ'; + + @override + String get viewerInfoSearchFieldLabel => 'ಹುದುಗಿಸಿದ ದತ್ತಾಂಶವನ್ನು ಹುಡುಕಿ'; + + @override + String get viewerInfoSearchEmpty => 'ಹೊಂದಾಣಿಕೆಯ ಕೀಲಿಗಳಿಲ್ಲ'; + + @override + String get viewerInfoSearchSuggestionDate => 'ದಿನಾಂಕ ಮತ್ತು ಸಮಯ'; + + @override + String get viewerInfoSearchSuggestionDescription => 'ವಿವರಣೆ'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'ಆಯಾಮ'; + + @override + String get viewerInfoSearchSuggestionResolution => 'ಅಳತೆ'; + + @override + String get viewerInfoSearchSuggestionRights => 'ಹಕ್ಕುಗಳು'; + + @override + String get wallpaperUseScrollEffect => 'ಮುಖಪುಟದಲ್ಲಿ ಸುರುಳಿ ಪರಿಣಾಮವನ್ನು ಬಳಸಿ'; + + @override + String get tagEditorPageTitle => 'Tagಗಳನ್ನು ತಿದ್ದಿ'; + + @override + String get tagEditorPageNewTagFieldLabel => 'ಹೊಸ ಟ್ಯಾಗು'; + + @override + String get tagEditorPageAddTagTooltip => 'ಟ್ಯಾಗು ಸೇರಿಸಿ'; + + @override + String get tagEditorSectionRecent => 'ಇತ್ತೀಚಿನವು'; + + @override + String get tagEditorSectionPlaceholders => 'ಪ್ಲೇಸ್‌ಹೋಲ್ಡರ್‌ಗಳು'; + + @override + String get tagEditorDiscardDialogMessage => 'ನೀವು ಬದಲಾವಣೆಗಳನ್ನು ತ್ಯಜಿಸಲು ಬಯಸುವಿರಾ?'; + + @override + String get tagPlaceholderCountry => 'ದೇಶ'; + + @override + String get tagPlaceholderState => 'ರಾಜ್ಯ'; + + @override + String get tagPlaceholderPlace => 'ಸ್ಥಳ'; + + @override + String get panoramaEnableSensorControl => 'ಸಂವೇದಕ ನಿಯಂತ್ರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ'; + + @override + String get panoramaDisableSensorControl => 'ಸಂವೇದಕ ನಿಯಂತ್ರಣವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ'; + + @override + String get sourceViewerPageTitle => 'ಮೂಲ'; +} diff --git a/lib/l10ngen/app_localizations_ko.dart b/lib/l10ngen/app_localizations_ko.dart new file mode 100644 index 0000000..7b44952 --- /dev/null +++ b/lib/l10ngen/app_localizations_ko.dart @@ -0,0 +1,2402 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Korean (`ko`). +class AppLocalizationsKo extends AppLocalizations { + AppLocalizationsKo([String locale = 'ko']) : super(locale); + + @override + String get appName => '아베스'; + + @override + String get welcomeMessage => '아베스 사용을 환영합니다'; + + @override + String get welcomeOptional => '선택'; + + @override + String get welcomeTermsToggle => '이용약관에 동의합니다'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString개', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count열', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString초', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString분', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString일', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => '적용'; + + @override + String get createButtonLabel => '추가'; + + @override + String get deleteButtonLabel => '삭제'; + + @override + String get nextButtonLabel => '다음'; + + @override + String get showButtonLabel => '보기'; + + @override + String get hideButtonLabel => '숨기기'; + + @override + String get continueButtonLabel => '다음'; + + @override + String get saveCopyButtonLabel => '사본 저장'; + + @override + String get applyTooltip => '적용'; + + @override + String get cancelTooltip => '취소'; + + @override + String get changeTooltip => '변경'; + + @override + String get clearTooltip => '초기화'; + + @override + String get previousTooltip => '이전'; + + @override + String get nextTooltip => '다음'; + + @override + String get showTooltip => '보기'; + + @override + String get hideTooltip => '숨기기'; + + @override + String get actionRemove => '제거'; + + @override + String get resetTooltip => '복원'; + + @override + String get saveTooltip => '저장'; + + @override + String get stopTooltip => '취소'; + + @override + String get pickTooltip => '선택'; + + @override + String get doubleBackExitMessage => '종료하려면 한번 더 누르세요.'; + + @override + String get doNotAskAgain => '다시 묻지 않기'; + + @override + String get sourceStateLoading => '로딩 중'; + + @override + String get sourceStateCataloguing => '분석 중'; + + @override + String get sourceStateLocatingCountries => '국가 찾는 중'; + + @override + String get sourceStateLocatingPlaces => '장소 찾는 중'; + + @override + String get chipActionDelete => '삭제'; + + @override + String get chipActionRemove => '제거'; + + @override + String get chipActionShowCollection => '미디어 페이지에서 보기'; + + @override + String get chipActionGoToAlbumPage => '앨범 페이지에서 보기'; + + @override + String get chipActionGoToCountryPage => '국가 페이지에서 보기'; + + @override + String get chipActionGoToPlacePage => '장소 페이지에서 보기'; + + @override + String get chipActionGoToTagPage => '태그 페이지에서 보기'; + + @override + String get chipActionGoToExplorerPage => '탐색기 페이지에서 보기'; + + @override + String get chipActionDecompose => '나누기'; + + @override + String get chipActionFilterOut => '제외하기'; + + @override + String get chipActionFilterIn => '포함시키기'; + + @override + String get chipActionHide => '숨기기'; + + @override + String get chipActionLock => '잠금'; + + @override + String get chipActionPin => '고정'; + + @override + String get chipActionUnpin => '고정 해제'; + + @override + String get chipActionGroup => '그룹 변경'; + + @override + String get chipActionRename => '이름 변경'; + + @override + String get chipActionSetCover => '대표 이미지 변경'; + + @override + String get chipActionShowCountryStates => '주 보기'; + + @override + String get chipActionCreateGroup => '그룹 만들기'; + + @override + String get chipActionCreateAlbum => '앨범 만들기'; + + @override + String get chipActionCreateVault => '금고 만들기'; + + @override + String get chipActionConfigureVault => '금고 설정'; + + @override + String get entryActionCopyToClipboard => '클립보드에 복사'; + + @override + String get entryActionDelete => '삭제'; + + @override + String get entryActionConvert => '변환'; + + @override + String get entryActionExport => '내보내기'; + + @override + String get entryActionInfo => '상세정보'; + + @override + String get entryActionRename => '이름 변경'; + + @override + String get entryActionRestore => '복원'; + + @override + String get entryActionRotateCCW => '좌회전'; + + @override + String get entryActionRotateCW => '우회전'; + + @override + String get entryActionFlip => '좌우 뒤집기'; + + @override + String get entryActionPrint => '인쇄'; + + @override + String get entryActionShare => '공유'; + + @override + String get entryActionShareImageOnly => '사진만 공유'; + + @override + String get entryActionShareVideoOnly => '동영상만 공유'; + + @override + String get entryActionViewSource => '소스 코드 보기'; + + @override + String get entryActionShowGeoTiffOnMap => '지도에 겹쳐그리기'; + + @override + String get entryActionConvertMotionPhotoToStillImage => '스틸 사진으로 변환'; + + @override + String get entryActionViewMotionPhotoVideo => '동영상 보기'; + + @override + String get entryActionEdit => '편집'; + + @override + String get entryActionOpen => '다른 앱에서 열기'; + + @override + String get entryActionSetAs => '다음 용도로 사용'; + + @override + String get entryActionCast => '전송'; + + @override + String get entryActionOpenMap => '지도 앱에서 보기'; + + @override + String get entryActionRotateScreen => '화면 회전'; + + @override + String get entryActionAddFavourite => '즐겨찾기에 추가'; + + @override + String get entryActionRemoveFavourite => '즐겨찾기에서 삭제'; + + @override + String get videoActionCaptureFrame => '프레임 캡처'; + + @override + String get videoActionMute => '음소거'; + + @override + String get videoActionUnmute => '음소거 해제'; + + @override + String get videoActionPause => '일시정지'; + + @override + String get videoActionPlay => '재생'; + + @override + String get videoActionReplay10 => '10초 뒤로 탐색'; + + @override + String get videoActionSkip10 => '10초 앞으로 탐색'; + + @override + String get videoActionShowPreviousFrame => '이전 프레임 보기'; + + @override + String get videoActionShowNextFrame => '다음 프레임 보기'; + + @override + String get videoActionSelectStreams => '트랙 선택'; + + @override + String get videoActionSetSpeed => '재생 배속'; + + @override + String get videoActionABRepeat => 'A-B 반복'; + + @override + String get videoRepeatActionSetStart => '시작 지점 설정'; + + @override + String get videoRepeatActionSetEnd => '종료 지점 설정'; + + @override + String get viewerActionSettings => '설정'; + + @override + String get viewerActionLock => '뷰어 잠금'; + + @override + String get viewerActionUnlock => '뷰어 잠금 해제'; + + @override + String get slideshowActionResume => '이어서'; + + @override + String get slideshowActionShowInCollection => '미디어 페이지에서 보기'; + + @override + String get entryInfoActionEditDate => '날짜 및 시간 수정'; + + @override + String get entryInfoActionEditLocation => '위치 수정'; + + @override + String get entryInfoActionEditTitleDescription => '제목 및 설명 수정'; + + @override + String get entryInfoActionEditRating => '별점 수정'; + + @override + String get entryInfoActionEditTags => '태그 수정'; + + @override + String get entryInfoActionRemoveMetadata => '메타데이터 삭제'; + + @override + String get entryInfoActionExportMetadata => '메타데이터 내보내기'; + + @override + String get entryInfoActionRemoveLocation => '위치 삭제'; + + @override + String get editorActionTransform => '변형'; + + @override + String get editorTransformCrop => '자르기'; + + @override + String get editorTransformRotate => '회전'; + + @override + String get cropAspectRatioFree => '사용자 맞춤 비율'; + + @override + String get cropAspectRatioOriginal => '원본'; + + @override + String get cropAspectRatioSquare => '정사각형'; + + @override + String get filterAspectRatioLandscapeLabel => '가로'; + + @override + String get filterAspectRatioPortraitLabel => '세로'; + + @override + String get filterBinLabel => '휴지통'; + + @override + String get filterFavouriteLabel => '즐겨찾기'; + + @override + String get filterNoDateLabel => '날짜 없음'; + + @override + String get filterNoAddressLabel => '주소 없음'; + + @override + String get filterLocatedLabel => '위치 있음'; + + @override + String get filterNoLocationLabel => '위치 없음'; + + @override + String get filterNoRatingLabel => '별점 없음'; + + @override + String get filterTaggedLabel => '태그 있음'; + + @override + String get filterNoTagLabel => '태그 없음'; + + @override + String get filterNoTitleLabel => '제목 없음'; + + @override + String get filterOnThisDayLabel => '이 날'; + + @override + String get filterRecentlyAddedLabel => '최근 추가된'; + + @override + String get filterRatingRejectedLabel => '거부됨'; + + @override + String get filterTypeAnimatedLabel => '애니메이션'; + + @override + String get filterTypeMotionPhotoLabel => '모션 사진'; + + @override + String get filterTypePanoramaLabel => '파노라마'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° 동영상'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => '사진'; + + @override + String get filterMimeVideoLabel => '동영상'; + + @override + String get accessibilityAnimationsRemove => '화면 효과 제한'; + + @override + String get accessibilityAnimationsKeep => '화면 효과 유지'; + + @override + String get albumTierNew => '신규'; + + @override + String get albumTierPinned => '고정'; + + @override + String get albumTierGroups => '그룹'; + + @override + String get albumTierSpecial => '기본'; + + @override + String get albumTierApps => '앱'; + + @override + String get albumTierVaults => '금고'; + + @override + String get albumTierDynamic => '동적'; + + @override + String get albumTierRegular => '일반'; + + @override + String get coordinateFormatDms => '도, 분, 초'; + + @override + String get coordinateFormatDdm => '도, 십진 분'; + + @override + String get coordinateFormatDecimal => '십신 도'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$direction $coordinate'; + } + + @override + String get coordinateDmsNorth => '북위'; + + @override + String get coordinateDmsSouth => '남위'; + + @override + String get coordinateDmsEast => '동경'; + + @override + String get coordinateDmsWest => '서경'; + + @override + String get displayRefreshRatePreferHighest => '가장 높은 재생률'; + + @override + String get displayRefreshRatePreferLowest => '가장 낮은 재생률'; + + @override + String get keepScreenOnNever => '자동 꺼짐'; + + @override + String get keepScreenOnVideoPlayback => '동영상 재생 시 작동'; + + @override + String get keepScreenOnViewerOnly => '뷰어 이용 시 작동'; + + @override + String get keepScreenOnAlways => '항상 켜짐'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google 지도'; + + @override + String get mapStyleGoogleHybrid => 'Google 지도 (위성)'; + + @override + String get mapStyleGoogleTerrain => 'Google 지도 (지형)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (수채화)'; + + @override + String get maxBrightnessNever => '작동 안 함'; + + @override + String get maxBrightnessAlways => '항상 켜짐'; + + @override + String get nameConflictStrategyRename => '이름 변경'; + + @override + String get nameConflictStrategyReplace => '대체'; + + @override + String get nameConflictStrategySkip => '건너뛰기'; + + @override + String get overlayHistogramNone => '없음'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => '휘도'; + + @override + String get subtitlePositionTop => '위'; + + @override + String get subtitlePositionBottom => '아래'; + + @override + String get themeBrightnessLight => '라이트'; + + @override + String get themeBrightnessDark => '다크'; + + @override + String get themeBrightnessBlack => '검은색'; + + @override + String get unitSystemMetric => '미터법'; + + @override + String get unitSystemImperial => '야드파운드법'; + + @override + String get vaultLockTypePattern => '패턴'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => '비밀번호'; + + @override + String get settingsVideoEnablePip => 'PIP (화면 속 화면)'; + + @override + String get videoControlsPlayOutside => '다른 앱에서 열기'; + + @override + String get videoLoopModeNever => '반복 안 함'; + + @override + String get videoLoopModeShortOnly => '짧은 동영상만 반복'; + + @override + String get videoLoopModeAlways => '항상 반복'; + + @override + String get videoPlaybackSkip => '생략'; + + @override + String get videoPlaybackMuted => '음소거 재생'; + + @override + String get videoPlaybackWithSound => '일반 재생'; + + @override + String get videoResumptionModeNever => '재개 안 함'; + + @override + String get videoResumptionModeAlways => '항상 재개'; + + @override + String get viewerTransitionSlide => '좌우'; + + @override + String get viewerTransitionParallax => '시차'; + + @override + String get viewerTransitionFade => '페이드'; + + @override + String get viewerTransitionZoomIn => '확대'; + + @override + String get viewerTransitionNone => '없음'; + + @override + String get wallpaperTargetHome => '홈 화면'; + + @override + String get wallpaperTargetLock => '잠금화면'; + + @override + String get wallpaperTargetHomeLock => '홈 및 잠금화면'; + + @override + String get widgetDisplayedItemRandom => '무작위로'; + + @override + String get widgetDisplayedItemMostRecent => '최신'; + + @override + String get widgetOpenPageHome => '홈 열기'; + + @override + String get widgetOpenPageCollection => '미디어 열기'; + + @override + String get widgetOpenPageViewer => '뷰어 열기'; + + @override + String get widgetTapUpdateWidget => '위젯 갱신'; + + @override + String get storageVolumeDescriptionFallbackPrimary => '내장 메모리'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD 카드'; + + @override + String get rootDirectoryDescription => '루트 폴더'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” 폴더'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return '파일에 접근하도록 다음 화면에서 “$volume”의 $directory를 선택하세요.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return '“$volume”의 $directory에 있는 파일의 접근이 제한됩니다.\n\n기본으로 설치된 갤러리나 파일 관리 앱을 사용해서 다른 폴더로 파일을 이동하세요.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return '“$volume”에 필요 공간은 $neededSize인데 사용 가능한 용량은 $freeSize만 남아있습니다.'; + } + + @override + String get missingSystemFilePickerDialogMessage => '기본 파일 선택기가 없거나 비활성화딥니다. 파일 선택기를 켜고 다시 시도하세요.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '이 작업은 다음 항목의 형식을 지원하지 않습니다: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => '이동할 폴더에 이름이 같은 파일이 있습니다.'; + + @override + String get nameConflictDialogMultipleSourceMessage => '이름이 같은 파일이 있습니다.'; + + @override + String get addShortcutDialogLabel => '바로가기 라벨'; + + @override + String get addShortcutButtonLabel => '추가'; + + @override + String get noMatchingAppDialogMessage => '이 작업을 처리할 수 있는 앱이 없습니다.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목 $countString개를 휴지통으로 이동하시겠습니까?', + one: '이 항목을 휴지통으로 이동하시겠습니까?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목 $countString개를 삭제하시겠습니까?', + one: '이 항목을 삭제하시겠습니까?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => '이 작업을 계속하기 전에 항목의 날짜를 지정하시겠습니까?'; + + @override + String get moveUndatedConfirmationDialogSetDate => '날짜 지정하기'; + + @override + String videoResumeDialogMessage(String time) { + return '$time부터 재개하시겠습니까?'; + } + + @override + String get videoStartOverButtonLabel => '처음부터'; + + @override + String get videoResumeButtonLabel => '이어서'; + + @override + String get setCoverDialogLatest => '최근 항목'; + + @override + String get setCoverDialogAuto => '자동 설정'; + + @override + String get setCoverDialogCustom => '직접 설정'; + + @override + String get hideFilterConfirmationDialogMessage => '이 필터에 맞는 사진과 동영상이 보이지 않을 것입니다. “개인정보 보호” 설정을 수정하면 다시 보일 수 있습니다.\n\n이 필터를 숨기시겠습니까?'; + + @override + String get newAlbumDialogTitle => '새 앨범 만들기'; + + @override + String get newAlbumDialogNameLabel => '앨범 이름'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => '앨범이 이미 있습니다'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => '사용 중인 이름입니다'; + + @override + String get newAlbumDialogStorageLabel => '저장공간:'; + + @override + String get newDynamicAlbumDialogTitle => '새 동적 앨범'; + + @override + String get dynamicAlbumAlreadyExists => '동적 앨범이 이미 있습니다'; + + @override + String get newGroupDialogTitle => '새 그룹 만들기'; + + @override + String get newGroupDialogNameLabel => '그룹 이름'; + + @override + String get groupAlreadyExists => '사용 중인 이름입니다'; + + @override + String get groupEmpty => '그룹이 없습니다'; + + @override + String get ungrouped => '그룹 없이'; + + @override + String get groupPickerTitle => '그룹 선택'; + + @override + String get groupPickerUseThisGroupButton => '이 그룹 사용'; + + @override + String get newVaultWarningDialogMessage => '금고에 있는 항목들은 이 앱에서만 볼 수 있습니다.\n\n이 앱을 삭제 시, 또한 이 앱의 데이터를 삭제 시, 항목을 완전히 삭제될 것입니다.'; + + @override + String get newVaultDialogTitle => '새 금고 만들기'; + + @override + String get configureVaultDialogTitle => '금고 설정'; + + @override + String get vaultDialogLockModeWhenScreenOff => '화면이 꺼진 후 자동으로 잠김'; + + @override + String get vaultDialogLockTypeLabel => '잠금 방식'; + + @override + String get patternDialogEnter => '패턴을 입력하세요'; + + @override + String get patternDialogConfirm => '패턴을 확인하세요'; + + @override + String get pinDialogEnter => 'PIN을 입력하세요'; + + @override + String get pinDialogConfirm => 'PIN을 확인하세요'; + + @override + String get passwordDialogEnter => '비밀번호를 입력하세요'; + + @override + String get passwordDialogConfirm => '비밀번호를 확인하세요'; + + @override + String get authenticateToConfigureVault => '금고 설정을 위한 인증'; + + @override + String get authenticateToUnlockVault => '금고 잠금 해제를 위한 인증'; + + @override + String get vaultBinUsageDialogMessage => '휴지통을 사용하는 금고가 있습니다.'; + + @override + String get renameAlbumDialogLabel => '앨범 이름'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => '사용 중인 이름입니다'; + + @override + String get renameEntrySetPageTitle => '이름 변경'; + + @override + String get renameEntrySetPagePatternFieldLabel => '이름 양식'; + + @override + String get renameEntrySetPageInsertTooltip => '필드 추가'; + + @override + String get renameEntrySetPagePreviewSectionTitle => '미리보기'; + + @override + String get renameProcessorCounter => '숫자 증가'; + + @override + String get renameProcessorHash => '해시'; + + @override + String get renameProcessorName => '이름'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '이 앨범의 항목 $countString개를 삭제하시겠습니까?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '이 앨범들의 항목 $countString개를 삭제하시겠습니까?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => '형식:'; + + @override + String get exportEntryDialogWidth => '가로'; + + @override + String get exportEntryDialogHeight => '세로'; + + @override + String get exportEntryDialogQuality => '품질'; + + @override + String get exportEntryDialogWriteMetadata => '메타데이터 저장'; + + @override + String get renameEntryDialogLabel => '이름'; + + @override + String get editEntryDialogCopyFromItem => '다른 항목에서 지정'; + + @override + String get editEntryDialogTargetFieldsHeader => '수정할 필드'; + + @override + String get editEntryDateDialogTitle => '날짜 및 시간'; + + @override + String get editEntryDateDialogSetCustom => '지정 날짜로 편집'; + + @override + String get editEntryDateDialogCopyField => '다른 날짜에서 지정'; + + @override + String get editEntryDateDialogExtractFromTitle => '제목에서 추출'; + + @override + String get editEntryDateDialogShift => '시간 이동'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => '파일 수정한 날짜'; + + @override + String get durationDialogHours => '시간'; + + @override + String get durationDialogMinutes => '분'; + + @override + String get durationDialogSeconds => '초'; + + @override + String get editEntryLocationDialogTitle => '위치'; + + @override + String get editEntryLocationDialogSetCustom => '지정 장소로 편집'; + + @override + String get editEntryLocationDialogChooseOnMap => '지도에서 선택'; + + @override + String get editEntryLocationDialogImportGpx => 'GPX 가져오기'; + + @override + String get editEntryLocationDialogLatitude => '위도'; + + @override + String get editEntryLocationDialogLongitude => '경도'; + + @override + String get editEntryLocationDialogTimeShift => '시간 이동'; + + @override + String get locationPickerUseThisLocationButton => '이 위치 사용'; + + @override + String get editEntryRatingDialogTitle => '별점'; + + @override + String get removeEntryMetadataDialogTitle => '메타데이터 삭제'; + + @override + String get removeEntryMetadataDialogAll => '모두'; + + @override + String get removeEntryMetadataDialogMore => '더 보기'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP가 있어야 모션 사진에 포함되는 동영상을 재생할 수 있습니다.\n\n삭제하시겠습니까?'; + + @override + String get videoSpeedDialogLabel => '재생 배속'; + + @override + String get videoStreamSelectionDialogVideo => '동영상'; + + @override + String get videoStreamSelectionDialogAudio => '오디오'; + + @override + String get videoStreamSelectionDialogText => '자막'; + + @override + String get videoStreamSelectionDialogOff => '해제'; + + @override + String get videoStreamSelectionDialogTrack => '트랙'; + + @override + String get videoStreamSelectionDialogNoSelection => '다른 트랙이 없습니다.'; + + @override + String get genericSuccessFeedback => '정상 처리됐습니다'; + + @override + String get genericFailureFeedback => '오류가 발생했습니다'; + + @override + String get genericDangerWarningDialogMessage => '확실합니까?'; + + @override + String get tooManyItemsErrorDialogMessage => '항목 수를 줄이고 다시 시도하세요.'; + + @override + String get menuActionConfigureView => '보기 설정'; + + @override + String get menuActionSelect => '선택'; + + @override + String get menuActionSelectAll => '모두 선택'; + + @override + String get menuActionSelectNone => '모두 해제'; + + @override + String get menuActionMap => '지도'; + + @override + String get menuActionSlideshow => '슬라이드쇼'; + + @override + String get menuActionStats => '통계'; + + @override + String get viewDialogSortSectionTitle => '정렬'; + + @override + String get viewDialogGroupSectionTitle => '묶음'; + + @override + String get viewDialogLayoutSectionTitle => '배치'; + + @override + String get viewDialogReverseSortOrder => '순서를 뒤바꾸기'; + + @override + String get tileLayoutMosaic => '모자이크'; + + @override + String get tileLayoutGrid => '바둑판'; + + @override + String get tileLayoutList => '목록'; + + @override + String get castDialogTitle => '전송 대상'; + + @override + String get coverDialogTabCover => '이미지'; + + @override + String get coverDialogTabApp => '앱'; + + @override + String get coverDialogTabColor => '색깔'; + + @override + String get appPickDialogTitle => '앱 선택'; + + @override + String get appPickDialogNone => '없음'; + + @override + String get aboutPageTitle => '앱 정보'; + + @override + String get aboutLinkLicense => '라이선스'; + + @override + String get aboutLinkPolicy => '개인정보 보호정책'; + + @override + String get aboutBugSectionTitle => '버그 보고'; + + @override + String get aboutBugSaveLogInstruction => '앱 로그를 파일에 저장하기'; + + @override + String get aboutBugCopyInfoInstruction => '시스템 정보를 복사하기'; + + @override + String get aboutBugCopyInfoButton => '복사'; + + @override + String get aboutBugReportInstruction => '로그와 시스템 정보를 첨부하여 GitHub에서 이슈를 제출하기'; + + @override + String get aboutBugReportButton => '제출'; + + @override + String get aboutDataUsageSectionTitle => '사용 중인 저장공간'; + + @override + String get aboutDataUsageData => '데이터'; + + @override + String get aboutDataUsageCache => '캐시'; + + @override + String get aboutDataUsageDatabase => '데이터베이스'; + + @override + String get aboutDataUsageMisc => '기타'; + + @override + String get aboutDataUsageInternal => '내부 저장소'; + + @override + String get aboutDataUsageExternal => '외부 저장소'; + + @override + String get aboutDataUsageClearCache => '캐시 삭제'; + + @override + String get aboutCreditsSectionTitle => '크레딧'; + + @override + String get aboutCreditsWorldAtlas1 => '이 앱은'; + + @override + String get aboutCreditsWorldAtlas2 => '의 TopoJSON 파일(ISC 라이선스)을 이용합니다.'; + + @override + String get aboutTranslatorsSectionTitle => '번역가'; + + @override + String get aboutLicensesSectionTitle => '오픈 소스 라이선스'; + + @override + String get aboutLicensesBanner => '이 앱은 다음의 오픈 소스 패키지와 라이브러리를 이용합니다.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => '안드로이드 라이브러리'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => '플러터 플러그인'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => '플러터 패키지'; + + @override + String get aboutLicensesDartPackagesSectionTitle => '다트 패키지'; + + @override + String get aboutLicensesShowAllButtonLabel => '라이선스 모두 보기'; + + @override + String get policyPageTitle => '개인정보 보호정책'; + + @override + String get collectionPageTitle => '미디어'; + + @override + String get collectionPickPageTitle => '항목 선택'; + + @override + String get collectionSelectPageTitle => '항목 선택'; + + @override + String get collectionActionShowTitleSearch => '제목 필터 보기'; + + @override + String get collectionActionHideTitleSearch => '제목 필터 숨기기'; + + @override + String get collectionActionAddDynamicAlbum => '동적 앨범 추가'; + + @override + String get collectionActionAddShortcut => '홈 화면에 추가'; + + @override + String get collectionActionSetHome => '홈으로 설정'; + + @override + String get collectionActionEmptyBin => '휴지통 비우기'; + + @override + String get collectionActionCopy => '앨범으로 복사'; + + @override + String get collectionActionMove => '앨범으로 이동'; + + @override + String get collectionActionRescan => '새로 분석'; + + @override + String get collectionActionEdit => '편집'; + + @override + String get collectionSearchTitlesHintText => '제목 검색'; + + @override + String get collectionGroupAlbum => '앨범별로'; + + @override + String get collectionGroupMonth => '월별로'; + + @override + String get collectionGroupDay => '날짜별로'; + + @override + String get sectionNone => '묶음 없이'; + + @override + String get sectionUnknown => '없음'; + + @override + String get dateToday => '오늘'; + + @override + String get dateYesterday => '어제'; + + @override + String get dateThisMonth => '이번 달'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목 $countString개를 삭제하지 못했습니다', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목 $countString개를 복사하지 못했습니다', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목 $countString개를 이동하지 못했습니다', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목 $countString개의 이름을 변경하지 못했습니다', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목 $countString개를 편집하지 못했습니다', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목 $countString개를 내보내지 못했습니다', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목 $countString개를 복사했습니다', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목 $countString개를 이동했습니다', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목 $countString개의 이름을 변경했습니다', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목 $countString개를 편집했습니다', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => '즐겨찾기가 없습니다'; + + @override + String get collectionEmptyVideos => '동영상이 없습니다'; + + @override + String get collectionEmptyImages => '사진이 없습니다'; + + @override + String get collectionEmptyGrantAccessButtonLabel => '접근 허용'; + + @override + String get collectionSelectSectionTooltip => '묶음 선택'; + + @override + String get collectionDeselectSectionTooltip => '묶음 선택 해제'; + + @override + String get drawerAboutButton => '앱 정보'; + + @override + String get drawerSettingsButton => '설정'; + + @override + String get drawerCollectionAll => '모든 미디어'; + + @override + String get drawerCollectionFavourites => '즐겨찾기'; + + @override + String get drawerCollectionImages => '사진'; + + @override + String get drawerCollectionVideos => '동영상'; + + @override + String get drawerCollectionAnimated => '애니메이션'; + + @override + String get drawerCollectionMotionPhotos => '모션 사진'; + + @override + String get drawerCollectionPanoramas => '파노라마'; + + @override + String get drawerCollectionRaws => 'Raw 이미지'; + + @override + String get drawerCollectionSphericalVideos => '360° 동영상'; + + @override + String get drawerAlbumPage => '앨범'; + + @override + String get drawerCountryPage => '국가'; + + @override + String get drawerPlacePage => '장소'; + + @override + String get drawerTagPage => '태그'; + + @override + String get sortByDate => '날짜'; + + @override + String get sortByName => '이름'; + + @override + String get sortByItemCount => '항목수'; + + @override + String get sortBySize => '크기'; + + @override + String get sortByAlbumFileName => '앨범 및 항목 제목'; + + @override + String get sortByRating => '별점'; + + @override + String get sortByDuration => '길이'; + + @override + String get sortByPath => '경로'; + + @override + String get sortOrderNewestFirst => '최근 날짜순'; + + @override + String get sortOrderOldestFirst => '오래된 날짜순'; + + @override + String get sortOrderAtoZ => 'A~Z'; + + @override + String get sortOrderZtoA => 'Z~A'; + + @override + String get sortOrderHighestFirst => '높은 별점순'; + + @override + String get sortOrderLowestFirst => '낮은 별점순'; + + @override + String get sortOrderLargestFirst => '큰 파일순'; + + @override + String get sortOrderSmallestFirst => '작은 파일순'; + + @override + String get sortOrderShortestFirst => '짧은 순'; + + @override + String get sortOrderLongestFirst => '긴 순'; + + @override + String get albumGroupTier => '단계별로'; + + @override + String get albumGroupType => '유형별로'; + + @override + String get albumGroupVolume => '저장공간별로'; + + @override + String get albumMimeTypeMixed => '혼합'; + + @override + String get albumPickPageTitleCopy => '앨범으로 복사'; + + @override + String get albumPickPageTitleExport => '앨범으로 내보내기'; + + @override + String get albumPickPageTitleMove => '앨범으로 이동'; + + @override + String get albumPickPageTitlePick => '앨범 선택'; + + @override + String get albumCamera => '카메라'; + + @override + String get albumDownload => '다운로드'; + + @override + String get albumScreenshots => '스크린샷'; + + @override + String get albumScreenRecordings => '화면 녹화 파일'; + + @override + String get albumVideoCaptures => '동영상 캡처'; + + @override + String get albumPageTitle => '앨범'; + + @override + String get albumEmpty => '앨범이 없습니다'; + + @override + String get createAlbumButtonLabel => '추가'; + + @override + String get newFilterBanner => '신규'; + + @override + String get countryPageTitle => '국가'; + + @override + String get countryEmpty => '국가가 없습니다'; + + @override + String get statePageTitle => '주'; + + @override + String get stateEmpty => '주가 없습니다'; + + @override + String get placePageTitle => '장소'; + + @override + String get placeEmpty => '장소가 없습니다'; + + @override + String get tagPageTitle => '태그'; + + @override + String get tagEmpty => '태그가 없습니다'; + + @override + String get tagPickPageTitle => '태그 선택'; + + @override + String get binPageTitle => '휴지통'; + + @override + String get explorerPageTitle => '탐색기'; + + @override + String get explorerActionSelectStorageVolume => '저장공간 선택'; + + @override + String get selectStorageVolumeDialogTitle => '저장공간'; + + @override + String get searchCollectionFieldHint => '미디어 검색'; + + @override + String get searchRecentSectionTitle => '최근 검색기록'; + + @override + String get searchDateSectionTitle => '날짜'; + + @override + String get searchFormatSectionTitle => '형식'; + + @override + String get searchAlbumsSectionTitle => '앨범'; + + @override + String get searchCountriesSectionTitle => '국가'; + + @override + String get searchStatesSectionTitle => '주'; + + @override + String get searchPlacesSectionTitle => '장소'; + + @override + String get searchTagsSectionTitle => '태그'; + + @override + String get searchRatingSectionTitle => '별점'; + + @override + String get searchMetadataSectionTitle => '메타데이터'; + + @override + String get settingsPageTitle => '설정'; + + @override + String get settingsSystemDefault => '시스템 기본값'; + + @override + String get settingsDefault => '기본'; + + @override + String get settingsDisabled => '사용 안함'; + + @override + String get settingsEnabled => '사용함'; + + @override + String get settingsForced => '강제'; + + @override + String get settingsAskEverytime => '매번 물어보기'; + + @override + String get settingsModificationWarningDialogMessage => '다른 설정도 변경될 것입니다.'; + + @override + String get settingsSearchFieldLabel => '설정 검색'; + + @override + String get settingsSearchEmpty => '결과가 없습니다'; + + @override + String get settingsActionExport => '내보내기'; + + @override + String get settingsActionExportDialogTitle => '내보내기'; + + @override + String get settingsActionImport => '가져오기'; + + @override + String get settingsActionImportDialogTitle => '가져오기'; + + @override + String get appExportCovers => '대표 이미지'; + + @override + String get appExportDynamicAlbums => '동적 앨범'; + + @override + String get appExportFavourites => '즐겨찾기'; + + @override + String get appExportSettings => '설정'; + + @override + String get settingsNavigationSectionTitle => '탐색'; + + @override + String get settingsHomeTile => '홈'; + + @override + String get settingsHomeDialogTitle => '홈'; + + @override + String get setHomeCustom => '직접 설정'; + + @override + String get settingsKeepScreenOnTile => '화면 자동 꺼짐 방지'; + + @override + String get settingsKeepScreenOnDialogTitle => '화면 자동 꺼짐 방지'; + + @override + String get settingsDoubleBackExit => '뒤로가기 두번 눌러 앱 종료하기'; + + @override + String get settingsConfirmationTile => '확정 대화상자'; + + @override + String get settingsConfirmationDialogTitle => '확정 대화상자'; + + @override + String get settingsConfirmationBeforeDeleteItems => '항목을 완전히 삭제 시'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => '항목을 휴지통으로 이동 시'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => '날짜가 지정되지 않은 항목을 이동 시'; + + @override + String get settingsConfirmationAfterMoveToBinItems => '항목을 휴지통으로 이동 후'; + + @override + String get settingsConfirmationVaultDataLoss => '금고에 관한 데이터 손실 경고'; + + @override + String get settingsNavigationDrawerTile => '탐색 메뉴'; + + @override + String get settingsNavigationDrawerEditorPageTitle => '탐색 메뉴'; + + @override + String get settingsNavigationDrawerBanner => '항목을 길게 누른 후 이동하여 탐색 메뉴에 표시될 항목의 순서를 수정하세요.'; + + @override + String get settingsNavigationDrawerTabTypes => '유형'; + + @override + String get settingsNavigationDrawerTabAlbums => '앨범'; + + @override + String get settingsNavigationDrawerTabPages => '페이지'; + + @override + String get settingsNavigationDrawerAddAlbum => '앨범 추가'; + + @override + String get settingsNavigationBottomActionsTile => '하단 탐색 모음'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => '하단 탐색 모음'; + + @override + String get settingsNavigationBottomActionEditorBanner => '버튼을 길게 누른 후 이동하여 하단 탐색 모음에 표시될 버튼을 선택하세요.'; + + @override + String get settingsThumbnailSectionTitle => '섬네일'; + + @override + String get settingsThumbnailOverlayTile => '오버레이'; + + @override + String get settingsThumbnailOverlayPageTitle => '오버레이'; + + @override + String get settingsThumbnailShowHdrIcon => 'HDR 아이콘 표시'; + + @override + String get settingsThumbnailShowFavouriteIcon => '즐겨찾기 아이콘 표시'; + + @override + String get settingsThumbnailShowTagIcon => '태그 아이콘 표시'; + + @override + String get settingsThumbnailShowLocationIcon => '위치 아이콘 표시'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => '모션 사진 아이콘 표시'; + + @override + String get settingsThumbnailShowRating => '별점 표시'; + + @override + String get settingsThumbnailShowRawIcon => 'Raw 아이콘 표시'; + + @override + String get settingsThumbnailShowVideoDuration => '동영상 길이 표시'; + + @override + String get settingsCollectionQuickActionsTile => '빠른 작업'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => '빠른 작업'; + + @override + String get settingsCollectionQuickActionTabBrowsing => '탐색 시'; + + @override + String get settingsCollectionQuickActionTabSelecting => '선택 시'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => '버튼을 길게 누른 후 이동하여 항목 탐색할 때 표시될 버튼을 선택하세요.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => '버튼을 길게 누른 후 이동하여 항목 선택할 때 표시될 버튼을 선택하세요.'; + + @override + String get settingsCollectionBurstPatternsTile => '연속 촬영 양식'; + + @override + String get settingsCollectionBurstPatternsNone => '없음'; + + @override + String get settingsViewerSectionTitle => '뷰어'; + + @override + String get settingsViewerGestureSideTapNext => '화면 측면에서 탭해서 이전/다음 항목 보기'; + + @override + String get settingsViewerUseCutout => '컷아웃 영역 사용'; + + @override + String get settingsViewerMaximumBrightness => '최대 밝기'; + + @override + String get settingsMotionPhotoAutoPlay => '모션 사진 자동 재생'; + + @override + String get settingsImageBackground => '이미지 배경'; + + @override + String get settingsViewerQuickActionsTile => '빠른 작업'; + + @override + String get settingsViewerQuickActionEditorPageTitle => '빠른 작업'; + + @override + String get settingsViewerQuickActionEditorBanner => '버튼을 길게 누른 후 이동하여 뷰어에 표시될 버튼을 선택하세요.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => '표시될 버튼'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => '추가 가능한 버튼'; + + @override + String get settingsViewerQuickActionEmpty => '버튼이 없습니다'; + + @override + String get settingsViewerOverlayTile => '오버레이'; + + @override + String get settingsViewerOverlayPageTitle => '오버레이'; + + @override + String get settingsViewerShowOverlayOnOpening => '열릴 때 표시'; + + @override + String get settingsViewerShowHistogram => '히스토그램 표시'; + + @override + String get settingsViewerShowMinimap => '미니맵 표시'; + + @override + String get settingsViewerShowZoomLevel => '확대 수준 표시'; + + @override + String get settingsViewerShowInformation => '상세 정보 표시'; + + @override + String get settingsViewerShowInformationSubtitle => '제목, 날짜, 장소 등 표시'; + + @override + String get settingsViewerShowRatingTags => '별점 및 태그 표시'; + + @override + String get settingsViewerShowShootingDetails => '촬영 정보 표시'; + + @override + String get settingsViewerShowDescription => '설명 표시'; + + @override + String get settingsViewerShowOverlayThumbnails => '섬네일 표시'; + + @override + String get settingsViewerEnableOverlayBlurEffect => '흐림 효과'; + + @override + String get settingsViewerSlideshowTile => '슬라이드쇼'; + + @override + String get settingsViewerSlideshowPageTitle => '슬라이드쇼'; + + @override + String get settingsSlideshowRepeat => '반복'; + + @override + String get settingsSlideshowShuffle => '순서섞기'; + + @override + String get settingsSlideshowFillScreen => '화면 채우기'; + + @override + String get settingsSlideshowAnimatedZoomEffect => '애니메이션 확대/축소 효과'; + + @override + String get settingsSlideshowTransitionTile => '전환 효과'; + + @override + String get settingsSlideshowIntervalTile => '교체 주기'; + + @override + String get settingsSlideshowVideoPlaybackTile => '동영상 재생'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => '동영상 재생'; + + @override + String get settingsVideoPageTitle => '동영상 설정'; + + @override + String get settingsVideoSectionTitle => '동영상'; + + @override + String get settingsVideoShowVideos => '미디어에 동영상 표시'; + + @override + String get settingsVideoPlaybackTile => '재생'; + + @override + String get settingsVideoPlaybackPageTitle => '재생'; + + @override + String get settingsVideoEnableHardwareAcceleration => '하드웨어 가속'; + + @override + String get settingsVideoAutoPlay => '자동 재생'; + + @override + String get settingsVideoLoopModeTile => '반복 모드'; + + @override + String get settingsVideoLoopModeDialogTitle => '반복 모드'; + + @override + String get settingsVideoResumptionModeTile => '재생 재개'; + + @override + String get settingsVideoResumptionModeDialogTitle => '재생 재개'; + + @override + String get settingsVideoBackgroundMode => '백그라운드 재생'; + + @override + String get settingsVideoBackgroundModeDialogTitle => '백그라운드 재생'; + + @override + String get settingsVideoControlsTile => '제어'; + + @override + String get settingsVideoControlsPageTitle => '제어'; + + @override + String get settingsVideoButtonsTile => '버튼'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => '두 번 탭해서 재생이나 일시정지하기'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => '화면 측면에서 두 번 탭해서 앞뒤로 가기'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => '위아래로 스와이프해서 밝기/음량을 조절하기'; + + @override + String get settingsSubtitleThemeTile => '자막'; + + @override + String get settingsSubtitleThemePageTitle => '자막'; + + @override + String get settingsSubtitleThemeSample => '샘플입니다.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => '정렬'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => '정렬'; + + @override + String get settingsSubtitleThemeTextPositionTile => '수직 정렬'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => '수직 정렬'; + + @override + String get settingsSubtitleThemeTextSize => '글자 크기'; + + @override + String get settingsSubtitleThemeShowOutline => '윤곽 및 그림자 표시'; + + @override + String get settingsSubtitleThemeTextColor => '글자 색상'; + + @override + String get settingsSubtitleThemeTextOpacity => '글자 투명도'; + + @override + String get settingsSubtitleThemeBackgroundColor => '배경 색상'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => '배경 투명도'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => '왼쪽'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => '가운데'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => '오른쪽'; + + @override + String get settingsPrivacySectionTitle => '개인정보 보호'; + + @override + String get settingsAllowInstalledAppAccess => '설치된 앱의 목록 접근 허용'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => '앨범 표시 개선을 위해'; + + @override + String get settingsAllowErrorReporting => '오류 보고서 보내기'; + + @override + String get settingsSaveSearchHistory => '검색기록'; + + @override + String get settingsEnableBin => '휴지통 사용'; + + @override + String get settingsEnableBinSubtitle => '삭제한 항목을 30일 동안 보관하기'; + + @override + String get settingsDisablingBinWarningDialogMessage => '휴지통에 있는 항목들이 완전히 삭제될 것입니다.'; + + @override + String get settingsAllowMediaManagement => '미디어 관리 허용'; + + @override + String get settingsHiddenItemsTile => '숨겨진 항목'; + + @override + String get settingsHiddenItemsPageTitle => '숨겨진 항목'; + + @override + String get settingsHiddenFiltersBanner => '이 필터에 맞는 사진과 동영상이 숨겨지고 있으며 이 앱에서 보여지지 않을 것입니다.'; + + @override + String get settingsHiddenFiltersEmpty => '숨겨진 필터가 없습니다'; + + @override + String get settingsStorageAccessTile => '저장공간 접근'; + + @override + String get settingsStorageAccessPageTitle => '저장공간 접근'; + + @override + String get settingsStorageAccessBanner => '어떤 폴더는 사용자의 허용을 받아야만 앱이 파일에 접근이 가능합니다. 이 화면에 허용을 받은 폴더를 확인할 수 있으며 원하지 않으면 취소할 수 있습니다.'; + + @override + String get settingsStorageAccessEmpty => '접근 허용이 없습니다'; + + @override + String get settingsStorageAccessRevokeTooltip => '취소'; + + @override + String get settingsAccessibilitySectionTitle => '접근성'; + + @override + String get settingsRemoveAnimationsTile => '애니메이션 삭제'; + + @override + String get settingsRemoveAnimationsDialogTitle => '애니메이션 삭제'; + + @override + String get settingsTimeToTakeActionTile => '액션 취하기 전 대기 시간'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => '멀티터치의 대안 표시'; + + @override + String get settingsDisplaySectionTitle => '디스플레이'; + + @override + String get settingsThemeBrightnessTile => '테마'; + + @override + String get settingsThemeBrightnessDialogTitle => '테마'; + + @override + String get settingsThemeColorHighlights => '색 강조'; + + @override + String get settingsThemeEnableDynamicColor => '동적 색상'; + + @override + String get settingsDisplayRefreshRateModeTile => '화면 재생률'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => '화면 재생률'; + + @override + String get settingsDisplayUseTvInterface => '안드로이드 TV 인터페이스 사용하기'; + + @override + String get settingsLanguageSectionTitle => '언어 및 표시 형식'; + + @override + String get settingsLanguageTile => '언어'; + + @override + String get settingsLanguagePageTitle => '언어'; + + @override + String get settingsCoordinateFormatTile => '좌표 표현'; + + @override + String get settingsCoordinateFormatDialogTitle => '좌표 표현'; + + @override + String get settingsUnitSystemTile => '단위법'; + + @override + String get settingsUnitSystemDialogTitle => '단위법'; + + @override + String get settingsForceWesternArabicNumeralsTile => '아라비아 숫자 항상 사용'; + + @override + String get settingsScreenSaverPageTitle => '화면보호기'; + + @override + String get settingsWidgetPageTitle => '사진 액자'; + + @override + String get settingsWidgetShowOutline => '윤곽'; + + @override + String get settingsWidgetOpenPage => '위젯을 탭하면'; + + @override + String get settingsWidgetDisplayedItem => '표시될 항목'; + + @override + String get settingsCollectionTile => '미디어'; + + @override + String get statsPageTitle => '통계'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString개 위치가 있음', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => '국가 랭킹'; + + @override + String get statsTopStatesSectionTitle => '주 랭킹'; + + @override + String get statsTopPlacesSectionTitle => '장소 랭킹'; + + @override + String get statsTopTagsSectionTitle => '태그 랭킹'; + + @override + String get statsTopAlbumsSectionTitle => '앨범 랭킹'; + + @override + String get viewerOpenPanoramaButtonLabel => '파노라마 열기'; + + @override + String get viewerSetWallpaperButtonLabel => '설정'; + + @override + String get viewerErrorUnknown => '아이구!'; + + @override + String get viewerErrorDoesNotExist => '파일이 존재하지 않습니다.'; + + @override + String get viewerInfoPageTitle => '상세정보'; + + @override + String get viewerInfoBackToViewerTooltip => '뷰어로'; + + @override + String get viewerInfoUnknown => '알 수 없음'; + + @override + String get viewerInfoLabelDescription => '설명'; + + @override + String get viewerInfoLabelTitle => '제목'; + + @override + String get viewerInfoLabelDate => '날짜'; + + @override + String get viewerInfoLabelResolution => '해상도'; + + @override + String get viewerInfoLabelSize => '크기'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => '경로'; + + @override + String get viewerInfoLabelDuration => '길이'; + + @override + String get viewerInfoLabelOwner => '패키지'; + + @override + String get viewerInfoLabelCoordinates => '좌표'; + + @override + String get viewerInfoLabelAddress => '주소'; + + @override + String get mapStyleDialogTitle => '지도 유형'; + + @override + String get mapStyleDialogAddStyle => '지도 유형 추가'; + + @override + String get mapStyleTooltip => '지도 유형 선택'; + + @override + String get mapStyleEditorDialogName => '이름'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => '서브도메인'; + + @override + String get mapStyleEditorDialogUserAgent => '사용자 에이전트'; + + @override + String get mapZoomInTooltip => '확대'; + + @override + String get mapZoomOutTooltip => '축소'; + + @override + String get mapPointNorthUpTooltip => '북쪽을 위로 가리키기'; + + @override + String get mapAttributionOsmData => '지도 데이터 © [OpenStreetMap](https://www.openstreetmap.org/copyright) 기여자'; + + @override + String get mapAttributionOsmLiberty => '타일 [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • 호스팅 [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | 타일 [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => '타일 [HOT](https://www.hotosm.org/) • 호스팅 [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => '타일 [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => '지도 페이지에서 보기'; + + @override + String get mapEmptyRegion => '이 지역의 사진이 없습니다'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => '첨부 데이터 추출 오류'; + + @override + String get viewerInfoOpenLinkText => '열기'; + + @override + String get viewerInfoViewXmlLinkText => 'XML 보기'; + + @override + String get viewerInfoSearchFieldLabel => '메타데이터 검색'; + + @override + String get viewerInfoSearchEmpty => '결과가 없습니다'; + + @override + String get viewerInfoSearchSuggestionDate => '날짜 및 시간'; + + @override + String get viewerInfoSearchSuggestionDescription => '설명'; + + @override + String get viewerInfoSearchSuggestionDimensions => '크기'; + + @override + String get viewerInfoSearchSuggestionResolution => '해상도'; + + @override + String get viewerInfoSearchSuggestionRights => '권리'; + + @override + String get wallpaperUseScrollEffect => '홈 화면에 스크롤 효과 사용'; + + @override + String get tagEditorPageTitle => '태그 수정'; + + @override + String get tagEditorPageNewTagFieldLabel => '새 태그'; + + @override + String get tagEditorPageAddTagTooltip => '태그 추가'; + + @override + String get tagEditorSectionRecent => '최근 이용기록'; + + @override + String get tagEditorSectionPlaceholders => '자리 표시자'; + + @override + String get tagEditorDiscardDialogMessage => '변경 사항을 취소하시겠습니까?'; + + @override + String get tagPlaceholderCountry => '국가'; + + @override + String get tagPlaceholderState => '주'; + + @override + String get tagPlaceholderPlace => '장소'; + + @override + String get panoramaEnableSensorControl => '센서 제어 활성화'; + + @override + String get panoramaDisableSensorControl => '센서 제어 비활성화'; + + @override + String get sourceViewerPageTitle => '소스 코드'; +} diff --git a/lib/l10ngen/app_localizations_lt.dart b/lib/l10ngen/app_localizations_lt.dart new file mode 100644 index 0000000..3925b4f --- /dev/null +++ b/lib/l10ngen/app_localizations_lt.dart @@ -0,0 +1,2381 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Lithuanian (`lt`). +class AppLocalizationsLt extends AppLocalizations { + AppLocalizationsLt([String locale = 'lt']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Sveiki atvykę į Aves'; + + @override + String get welcomeOptional => 'Neprivaloma'; + + @override + String get welcomeTermsToggle => 'Sutinku su taisyklėmis ir sąlygomis'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementų', + few: '$count elementai', + one: '$count elementas', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString stulpeliai', + one: '$countString stulpelis', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString sekundžių', + few: '$countString sekundės', + one: '$countString sekundė', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minučių', + few: '$countString minutės', + one: '$countString minutė', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString dienų', + few: '$countString dienos', + one: '$countString diena', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'TAIKYTI'; + + @override + String get createButtonLabel => 'KURTI'; + + @override + String get deleteButtonLabel => 'IŠTRINTI'; + + @override + String get nextButtonLabel => 'TOLIAU'; + + @override + String get showButtonLabel => 'RODYTI'; + + @override + String get hideButtonLabel => 'SLĖPTI'; + + @override + String get continueButtonLabel => 'TĘSTI'; + + @override + String get saveCopyButtonLabel => 'IŠSAUGOTI KOPIJĄ'; + + @override + String get applyTooltip => 'Taikyti'; + + @override + String get cancelTooltip => 'Atšaukti'; + + @override + String get changeTooltip => 'Keisti'; + + @override + String get clearTooltip => 'Išvalyti'; + + @override + String get previousTooltip => 'Ankstesnis'; + + @override + String get nextTooltip => 'Toliau'; + + @override + String get showTooltip => 'Rodyti'; + + @override + String get hideTooltip => 'Slėpti'; + + @override + String get actionRemove => 'Pašalinti'; + + @override + String get resetTooltip => 'Atstatyti'; + + @override + String get saveTooltip => 'Išsaugoti'; + + @override + String get stopTooltip => 'Stabdyti'; + + @override + String get pickTooltip => 'Pasirinkti'; + + @override + String get doubleBackExitMessage => 'Dar kartą bakstelėkite „atgal“, kad išeitumėte.'; + + @override + String get doNotAskAgain => 'Daugiau neklausti'; + + @override + String get sourceStateLoading => 'Įkeliama'; + + @override + String get sourceStateCataloguing => 'Kataloguojama'; + + @override + String get sourceStateLocatingCountries => 'Aptinkamos šalys'; + + @override + String get sourceStateLocatingPlaces => 'Aptinkamos vietos'; + + @override + String get chipActionDelete => 'Išrinti'; + + @override + String get chipActionRemove => 'Pašalinti'; + + @override + String get chipActionShowCollection => 'Rodyti kolekcijoje'; + + @override + String get chipActionGoToAlbumPage => 'Rodyti albumuose'; + + @override + String get chipActionGoToCountryPage => 'Rodyti šalyse'; + + @override + String get chipActionGoToPlacePage => 'Rodyti Vietose'; + + @override + String get chipActionGoToTagPage => 'Rodyti žymose'; + + @override + String get chipActionGoToExplorerPage => 'Rodyti Naršyklėje'; + + @override + String get chipActionDecompose => 'Padalyti'; + + @override + String get chipActionFilterOut => 'Išfiltruoti'; + + @override + String get chipActionFilterIn => 'Filtruoti'; + + @override + String get chipActionHide => 'Slėpti'; + + @override + String get chipActionLock => 'Rakinti'; + + @override + String get chipActionPin => 'Prisegti viršuje'; + + @override + String get chipActionUnpin => 'Atsegti nuo viršaus'; + + @override + String get chipActionGroup => 'Pakeisti grupavimą'; + + @override + String get chipActionRename => 'Pervadinti'; + + @override + String get chipActionSetCover => 'Nustatyti viršelį'; + + @override + String get chipActionShowCountryStates => 'Rodyti valstybes'; + + @override + String get chipActionCreateGroup => 'Kurti grupę'; + + @override + String get chipActionCreateAlbum => 'Sukurti albumą'; + + @override + String get chipActionCreateVault => 'Kurti saugyklą'; + + @override + String get chipActionConfigureVault => 'Konfigūruoti saugyklą'; + + @override + String get entryActionCopyToClipboard => 'Kopijuoti į iškarpinę'; + + @override + String get entryActionDelete => 'Išrinti'; + + @override + String get entryActionConvert => 'Konvertuoti'; + + @override + String get entryActionExport => 'Eksportuoti'; + + @override + String get entryActionInfo => 'Informacija'; + + @override + String get entryActionRename => 'Pervadinti'; + + @override + String get entryActionRestore => 'Atkurti'; + + @override + String get entryActionRotateCCW => 'Pasukti prieš laikrodžio rodyklę'; + + @override + String get entryActionRotateCW => 'Pasukti pagal laikrodžio rodyklę'; + + @override + String get entryActionFlip => 'Apversti horizontaliai'; + + @override + String get entryActionPrint => 'Spausdinti'; + + @override + String get entryActionShare => 'Dalintis'; + + @override + String get entryActionShareImageOnly => 'Bendrinti tik paveikslėlį'; + + @override + String get entryActionShareVideoOnly => 'Bendrinti tik vaizdo įrašą'; + + @override + String get entryActionViewSource => 'Peržiūrėti šaltinį'; + + @override + String get entryActionShowGeoTiffOnMap => 'Rodyti kaip žemėlapio uždangą'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Konvertuoti į nejudantį paveikslėlį'; + + @override + String get entryActionViewMotionPhotoVideo => 'Atidaryti vaizdo įrašą'; + + @override + String get entryActionEdit => 'Redaguoti'; + + @override + String get entryActionOpen => 'Atidaryti naudojant'; + + @override + String get entryActionSetAs => 'Nustatyti kaip'; + + @override + String get entryActionCast => 'Transliuoti'; + + @override + String get entryActionOpenMap => 'Rodyti žemėlapio programėlėje'; + + @override + String get entryActionRotateScreen => 'Pasukti ekraną'; + + @override + String get entryActionAddFavourite => 'Pridėti prie mėgstamiausių'; + + @override + String get entryActionRemoveFavourite => 'Pašalinti iš mėgstamiausių'; + + @override + String get videoActionCaptureFrame => 'Užfiksuoti kadrą'; + + @override + String get videoActionMute => 'Nutildyti'; + + @override + String get videoActionUnmute => 'Įjungti garsą'; + + @override + String get videoActionPause => 'Pristabdyti'; + + @override + String get videoActionPlay => 'Groti'; + + @override + String get videoActionReplay10 => 'Prasukti 10 sekundžių atgal'; + + @override + String get videoActionSkip10 => 'Prasukti 10 sekundžių į priekį'; + + @override + String get videoActionShowPreviousFrame => 'Rodyti ankstesnį rėmelį'; + + @override + String get videoActionShowNextFrame => 'Rodyti sekantį rėmelį'; + + @override + String get videoActionSelectStreams => 'Pasirinkti takelius'; + + @override + String get videoActionSetSpeed => 'Atkūrimo greitis'; + + @override + String get videoActionABRepeat => 'A-B kartoti'; + + @override + String get videoRepeatActionSetStart => 'Nustatyti pradžią'; + + @override + String get videoRepeatActionSetEnd => 'Nustatyti pabaigą'; + + @override + String get viewerActionSettings => 'Nustatymai'; + + @override + String get viewerActionLock => 'Užrakinti peržiūrą'; + + @override + String get viewerActionUnlock => 'Atrakinti peržiūrą'; + + @override + String get slideshowActionResume => 'Tęsti'; + + @override + String get slideshowActionShowInCollection => 'Rodyti kolekcijoje'; + + @override + String get entryInfoActionEditDate => 'Redaguoti datą ir laiką'; + + @override + String get entryInfoActionEditLocation => 'Redaguoti vietą'; + + @override + String get entryInfoActionEditTitleDescription => 'Redaguoti pavadinimą ir aprašymą'; + + @override + String get entryInfoActionEditRating => 'Redaguoti įvertinimą'; + + @override + String get entryInfoActionEditTags => 'Redaguoti žymas'; + + @override + String get entryInfoActionRemoveMetadata => 'Pašalinti metaduomenis'; + + @override + String get entryInfoActionExportMetadata => 'Eksportuoti metaduomenis'; + + @override + String get entryInfoActionRemoveLocation => 'Pašalinti vietą'; + + @override + String get editorActionTransform => 'Transformuoti'; + + @override + String get editorTransformCrop => 'Apkirpti'; + + @override + String get editorTransformRotate => 'Pasukti'; + + @override + String get cropAspectRatioFree => 'Laisvai'; + + @override + String get cropAspectRatioOriginal => 'Originalas'; + + @override + String get cropAspectRatioSquare => 'Kvadratas'; + + @override + String get filterAspectRatioLandscapeLabel => 'Gulsčias'; + + @override + String get filterAspectRatioPortraitLabel => 'Portretas'; + + @override + String get filterBinLabel => 'Šiukšlinė'; + + @override + String get filterFavouriteLabel => 'Mėgstamiausi'; + + @override + String get filterNoDateLabel => 'Be datos'; + + @override + String get filterNoAddressLabel => 'Nėra adreso'; + + @override + String get filterLocatedLabel => 'Lokalizuota'; + + @override + String get filterNoLocationLabel => 'Be vietovės'; + + @override + String get filterNoRatingLabel => 'Neįvertinta'; + + @override + String get filterTaggedLabel => 'Pažymėti'; + + @override + String get filterNoTagLabel => 'Nepažymėta'; + + @override + String get filterNoTitleLabel => 'Be pavadinimo'; + + @override + String get filterOnThisDayLabel => 'Šią dieną'; + + @override + String get filterRecentlyAddedLabel => 'Neseniai pridėta'; + + @override + String get filterRatingRejectedLabel => 'Atmesta'; + + @override + String get filterTypeAnimatedLabel => 'Animuota'; + + @override + String get filterTypeMotionPhotoLabel => 'Judanti nuotrauka'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° vaizdo įrašas'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Paveikslėlis'; + + @override + String get filterMimeVideoLabel => 'Vaizdo įrašas'; + + @override + String get accessibilityAnimationsRemove => 'Nerodyti ekrano efektų'; + + @override + String get accessibilityAnimationsKeep => 'Išlaikyti ekrano efektus'; + + @override + String get albumTierNew => 'Nauji'; + + @override + String get albumTierPinned => 'Prisegti'; + + @override + String get albumTierGroups => 'Grupės'; + + @override + String get albumTierSpecial => 'Bendri'; + + @override + String get albumTierApps => 'Programėlių'; + + @override + String get albumTierVaults => 'Seifai'; + + @override + String get albumTierDynamic => 'Dinaminis'; + + @override + String get albumTierRegular => 'Kiti'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Dešimtainiai laipsniai'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'Š'; + + @override + String get coordinateDmsSouth => 'P'; + + @override + String get coordinateDmsEast => 'R'; + + @override + String get coordinateDmsWest => 'V'; + + @override + String get displayRefreshRatePreferHighest => 'Aukščiausias dažnis'; + + @override + String get displayRefreshRatePreferLowest => 'Žemiausias dažnis'; + + @override + String get keepScreenOnNever => 'Niekada'; + + @override + String get keepScreenOnVideoPlayback => 'Vaizdo įrašo atkūrimo metu'; + + @override + String get keepScreenOnViewerOnly => 'Tik peržiūros puslapiui'; + + @override + String get keepScreenOnAlways => 'Visada'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (hibridinis)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (reljefinis)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarinis OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (akvarelė)'; + + @override + String get maxBrightnessNever => 'Niekada'; + + @override + String get maxBrightnessAlways => 'Visada'; + + @override + String get nameConflictStrategyRename => 'Pervadinti'; + + @override + String get nameConflictStrategyReplace => 'Pakeisti'; + + @override + String get nameConflictStrategySkip => 'Praleisti'; + + @override + String get overlayHistogramNone => 'Jokios'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Skaistis'; + + @override + String get subtitlePositionTop => 'Viršuje'; + + @override + String get subtitlePositionBottom => 'Apačioje'; + + @override + String get themeBrightnessLight => 'Šviesi'; + + @override + String get themeBrightnessDark => 'Tamsi'; + + @override + String get themeBrightnessBlack => 'Juoda'; + + @override + String get unitSystemMetric => 'Metriniai'; + + @override + String get unitSystemImperial => 'Imperiniai'; + + @override + String get vaultLockTypePattern => 'Piešinys'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Slaptažodis'; + + @override + String get settingsVideoEnablePip => 'Paveikslas paveiksle'; + + @override + String get videoControlsPlayOutside => 'Atidaryti su kitu grotuvu'; + + @override + String get videoLoopModeNever => 'Niekada'; + + @override + String get videoLoopModeShortOnly => 'Tik trumpus vaizdo įrašus'; + + @override + String get videoLoopModeAlways => 'Visada'; + + @override + String get videoPlaybackSkip => 'Praleisti'; + + @override + String get videoPlaybackMuted => 'Groti išjungus garsą'; + + @override + String get videoPlaybackWithSound => 'Groti su garsu'; + + @override + String get videoResumptionModeNever => 'Niekada'; + + @override + String get videoResumptionModeAlways => 'Visada'; + + @override + String get viewerTransitionSlide => 'Skaidrės'; + + @override + String get viewerTransitionParallax => 'Paralaksas'; + + @override + String get viewerTransitionFade => 'Išblukimas'; + + @override + String get viewerTransitionZoomIn => 'Priartinimas'; + + @override + String get viewerTransitionNone => 'Joks'; + + @override + String get wallpaperTargetHome => 'Pagrindinis ekranas'; + + @override + String get wallpaperTargetLock => 'Užrakinimo ekranas'; + + @override + String get wallpaperTargetHomeLock => 'Pagrindinis ir užrakinimo ekranai'; + + @override + String get widgetDisplayedItemRandom => 'Atsitiktinė'; + + @override + String get widgetDisplayedItemMostRecent => 'Naujausia'; + + @override + String get widgetOpenPageHome => 'Atidaryti pagrindinį puslapį'; + + @override + String get widgetOpenPageCollection => 'Atidaryti kolekciją'; + + @override + String get widgetOpenPageViewer => 'Atidaryti peržiūrą'; + + @override + String get widgetTapUpdateWidget => 'Atnaujinti valdiklį'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Vidinė atmintis'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD kortelė'; + + @override + String get rootDirectoryDescription => 'šakninis katalogas'; + + @override + String otherDirectoryDescription(String name) { + return '„$name“ katalogas'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Kitame ekrane pasirinkite $directory iš „$volume“, kad suteiktumėte šiai programėlei prieigą prie jo.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Šiai programai neleidžiama keisti „$volume“ $directory failų.\n\nNorėdami perkelti elementus į kitą katalogą, naudokite iš anksto įdiegtą failų tvarkyklę arba galerijos programėlę.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Šiai operacijai atlikti reikia $neededSize laisvos vietos „$volume“, tačiau liko tik $freeSize.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Trūksta sistemos failų rinkiklio arba jis išjungtas. Įgalinkite jį ir bandykite dar kartą.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Ši operacija nepalaikoma šių tipų elementams: $types.', + one: 'Ši operacija nepalaikoma šio tipo elementams: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Kai kurie failai paskirties aplanke turi tą patį pavadinimą.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Kai kurie failai turi tą patį pavadinimą.'; + + @override + String get addShortcutDialogLabel => 'Nuorodos etiketė'; + + @override + String get addShortcutButtonLabel => 'PRIDĖTI'; + + @override + String get noMatchingAppDialogMessage => 'Nėra programėlių, kurios galėtų tai padaryti.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Perkelti šiuos $count elementus į šiukšlinę?', + one: 'Perkelti šį elementą į šiukšlinę?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Ištrinti šiuos $count elementus?', + one: 'Ištrinti šį elementą?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Išsaugoti elemento datas prieš tęsiant?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Išsaugoti datas'; + + @override + String videoResumeDialogMessage(String time) { + return 'Ar norite tęsti grojimą nuo $time?'; + } + + @override + String get videoStartOverButtonLabel => 'PRADĖTI IŠ NAUJO'; + + @override + String get videoResumeButtonLabel => 'TĘSTI'; + + @override + String get setCoverDialogLatest => 'Naujausias elementas'; + + @override + String get setCoverDialogAuto => 'Automatinis'; + + @override + String get setCoverDialogCustom => 'Pasirinktinis'; + + @override + String get hideFilterConfirmationDialogMessage => 'Atitinkančios nuotraukos ir vaizdo įrašai bus paslėpti jūsų kolekcijoje. Galite juos vėl parodyti „Privatumo“ nustatymuose.\n\nAr tikrai norite juos paslėpti?'; + + @override + String get newAlbumDialogTitle => 'Naujas albumas'; + + @override + String get newAlbumDialogNameLabel => 'Albumo pavadinimas'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Albumas jau yra'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Katalogas jau egzistuoja'; + + @override + String get newAlbumDialogStorageLabel => 'Saugykla:'; + + @override + String get newDynamicAlbumDialogTitle => 'Naujas dinaminis albumas'; + + @override + String get dynamicAlbumAlreadyExists => 'Dinaminis albumas jau yra'; + + @override + String get newGroupDialogTitle => 'Nauja grupė'; + + @override + String get newGroupDialogNameLabel => 'Grupės pavadinimas'; + + @override + String get groupAlreadyExists => 'Grupė jau yra'; + + @override + String get groupEmpty => 'Nėra grupių'; + + @override + String get ungrouped => 'Nesugrupuota'; + + @override + String get groupPickerTitle => 'Išsirinkti grupę'; + + @override + String get groupPickerUseThisGroupButton => 'Naudoti šią grupę'; + + @override + String get newVaultWarningDialogMessage => 'Daiktai saugyklose yra prieinami tik šiai programėlei ir jokiom kitom.\n\nJei pašalinsite šią programą arba išvalysite jos duomenis, jūs prarasite visus šiuos daiktus.'; + + @override + String get newVaultDialogTitle => 'Nauja saugykla'; + + @override + String get configureVaultDialogTitle => 'Konfigūruoti saugyklą'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Užrakinti kai ekranas išsijungia'; + + @override + String get vaultDialogLockTypeLabel => 'Užrakto tipas'; + + @override + String get patternDialogEnter => 'Įveskite paveikslą'; + + @override + String get patternDialogConfirm => 'Konfigūruoti paveikslą'; + + @override + String get pinDialogEnter => 'Įveskite PIN'; + + @override + String get pinDialogConfirm => 'Konfigūruoti PIN'; + + @override + String get passwordDialogEnter => 'Įveskite slaptažodį'; + + @override + String get passwordDialogConfirm => 'Patvirtinti slaptažodį'; + + @override + String get authenticateToConfigureVault => 'Autentifikuoti, kad konfigūruoti saugyklą'; + + @override + String get authenticateToUnlockVault => 'Autentifikuoti, kad atrakinti saugyklą'; + + @override + String get vaultBinUsageDialogMessage => 'Kai kurios saugyklos naudoja šiukšlių dėžę.'; + + @override + String get renameAlbumDialogLabel => 'Naujas pavadinimas'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Katalogas jau egzistuoja'; + + @override + String get renameEntrySetPageTitle => 'Pervadinti'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Pavadinimų suteikimo modelis'; + + @override + String get renameEntrySetPageInsertTooltip => 'Įterpti lauką'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Peržiūra'; + + @override + String get renameProcessorCounter => 'Skaitiklis'; + + @override + String get renameProcessorHash => 'Maiša'; + + @override + String get renameProcessorName => 'Pavadinimas'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Ištrinti šį albumą ir jame esančius $count elementus?', + one: 'Ištrinti šį albumą ir jame esantį elementą?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Ištrinti šiuos albumus ir jame esančius $count elementus?', + one: 'Ištrinti šiuos albumus ir jame esantį elementą?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Formatas:'; + + @override + String get exportEntryDialogWidth => 'Plotis'; + + @override + String get exportEntryDialogHeight => 'Aukštis'; + + @override + String get exportEntryDialogQuality => 'Kokybė'; + + @override + String get exportEntryDialogWriteMetadata => 'Įrašyti metainformaciją'; + + @override + String get renameEntryDialogLabel => 'Naujas pavadinimas'; + + @override + String get editEntryDialogCopyFromItem => 'Kopijuoti iš kito elemento'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Keičiami laukai'; + + @override + String get editEntryDateDialogTitle => 'Data ir laikas'; + + @override + String get editEntryDateDialogSetCustom => 'Nustatyti pasirinktinę datą'; + + @override + String get editEntryDateDialogCopyField => 'Kopijuoti iš kitos datos'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Ištraukti iš pavadinimo'; + + @override + String get editEntryDateDialogShift => 'Pastumti'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Failo pakeitimo data'; + + @override + String get durationDialogHours => 'Valandos'; + + @override + String get durationDialogMinutes => 'Minutės'; + + @override + String get durationDialogSeconds => 'Sekundės'; + + @override + String get editEntryLocationDialogTitle => 'Vieta'; + + @override + String get editEntryLocationDialogSetCustom => 'Nustatyti pasirinktinę vietą'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Pasirinkti žemėlapyje'; + + @override + String get editEntryLocationDialogImportGpx => 'Importuoti GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Platuma'; + + @override + String get editEntryLocationDialogLongitude => 'Ilguma'; + + @override + String get editEntryLocationDialogTimeShift => 'Laiko poslinkis'; + + @override + String get locationPickerUseThisLocationButton => 'Naudoti šią vietą'; + + @override + String get editEntryRatingDialogTitle => 'Įvertinimas'; + + @override + String get removeEntryMetadataDialogTitle => 'Metaduomenų šalinimas'; + + @override + String get removeEntryMetadataDialogAll => 'Visi'; + + @override + String get removeEntryMetadataDialogMore => 'Daugiau'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'Norint paleisti vaizdo įrašą judančioje nuotraukoje, reikalingas XMP.\n\nAr tikrai norite jį pašalinti?'; + + @override + String get videoSpeedDialogLabel => 'Atkūrimo greitis'; + + @override + String get videoStreamSelectionDialogVideo => 'Vaizdas'; + + @override + String get videoStreamSelectionDialogAudio => 'Garsas'; + + @override + String get videoStreamSelectionDialogText => 'Subtitrai'; + + @override + String get videoStreamSelectionDialogOff => 'Išjungti'; + + @override + String get videoStreamSelectionDialogTrack => 'Takelis'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Kitų takelių nėra.'; + + @override + String get genericSuccessFeedback => 'Atlikta!'; + + @override + String get genericFailureFeedback => 'Nepavyko'; + + @override + String get genericDangerWarningDialogMessage => 'Ar tikrai?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Bandykite vėl su mažiau daiktų.'; + + @override + String get menuActionConfigureView => 'Peržiūrėti'; + + @override + String get menuActionSelect => 'Pasirinkti'; + + @override + String get menuActionSelectAll => 'Pasirinkti viską'; + + @override + String get menuActionSelectNone => 'Nesirinkti nieko'; + + @override + String get menuActionMap => 'Žemėlapis'; + + @override + String get menuActionSlideshow => 'Skaidrių demonstravimas'; + + @override + String get menuActionStats => 'Statistika'; + + @override + String get viewDialogSortSectionTitle => 'Rikiuoti'; + + @override + String get viewDialogGroupSectionTitle => 'Skyreliai'; + + @override + String get viewDialogLayoutSectionTitle => 'Išdėstymas'; + + @override + String get viewDialogReverseSortOrder => 'Atvirkštinė rikiavimo tvarka'; + + @override + String get tileLayoutMosaic => 'Mozaika'; + + @override + String get tileLayoutGrid => 'Tinklelis'; + + @override + String get tileLayoutList => 'Sąrašas'; + + @override + String get castDialogTitle => 'Transliavimo įrenginiai'; + + @override + String get coverDialogTabCover => 'Viršelis'; + + @override + String get coverDialogTabApp => 'Programėlė'; + + @override + String get coverDialogTabColor => 'Spalva'; + + @override + String get appPickDialogTitle => 'Pasirinkite programėlę'; + + @override + String get appPickDialogNone => 'Jokia'; + + @override + String get aboutPageTitle => 'Apie'; + + @override + String get aboutLinkLicense => 'Licencija'; + + @override + String get aboutLinkPolicy => 'Privatumo politika'; + + @override + String get aboutBugSectionTitle => 'Pranešimas apie klaidą'; + + @override + String get aboutBugSaveLogInstruction => 'Išsaugokite programėlės žurnalus į failą'; + + @override + String get aboutBugCopyInfoInstruction => 'Nukopijuokite sistemos informaciją'; + + @override + String get aboutBugCopyInfoButton => 'Kopijuoti'; + + @override + String get aboutBugReportInstruction => 'Praneškite „GitHub“ kartu su žurnalais ir sistemos informacija'; + + @override + String get aboutBugReportButton => 'Pranešti'; + + @override + String get aboutDataUsageSectionTitle => 'Duomenų naudojimas'; + + @override + String get aboutDataUsageData => 'Duomenys'; + + @override + String get aboutDataUsageCache => 'Talpykla'; + + @override + String get aboutDataUsageDatabase => 'Duombazė'; + + @override + String get aboutDataUsageMisc => 'Įvairūs'; + + @override + String get aboutDataUsageInternal => 'Vidaus'; + + @override + String get aboutDataUsageExternal => 'Išorinė'; + + @override + String get aboutDataUsageClearCache => 'Valyti talpyklą'; + + @override + String get aboutCreditsSectionTitle => 'Padėkos'; + + @override + String get aboutCreditsWorldAtlas1 => 'Ši programa naudoja TopoJSON failą iš'; + + @override + String get aboutCreditsWorldAtlas2 => 'pagal ISC licenciją.'; + + @override + String get aboutTranslatorsSectionTitle => 'Vertėjai'; + + @override + String get aboutLicensesSectionTitle => 'Atvirojo kodo licencijos'; + + @override + String get aboutLicensesBanner => 'Šioje programėlėje naudojami šie atvirojo kodo paketai ir bibliotekos.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android bibliotekos'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter papildiniai'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter paketai'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart paketai'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Rodyti visas licencijas'; + + @override + String get policyPageTitle => 'Privatumo politika'; + + @override + String get collectionPageTitle => 'Kolekcija'; + + @override + String get collectionPickPageTitle => 'Pasirinkti'; + + @override + String get collectionSelectPageTitle => 'Pasirinkti elementus'; + + @override + String get collectionActionShowTitleSearch => 'Rodyti pavadinimo filtrą'; + + @override + String get collectionActionHideTitleSearch => 'Slėpti pavadinimo filtrą'; + + @override + String get collectionActionAddDynamicAlbum => 'Pridėti dinaminį albumą'; + + @override + String get collectionActionAddShortcut => 'Pridėti nuorodą'; + + @override + String get collectionActionSetHome => 'Nustatyti kaip namus'; + + @override + String get collectionActionEmptyBin => 'Išvalyti šiukšlinę'; + + @override + String get collectionActionCopy => 'Kopijuoti į albumą'; + + @override + String get collectionActionMove => 'Perkelti į albumą'; + + @override + String get collectionActionRescan => 'Nuskenuoti iš naujo'; + + @override + String get collectionActionEdit => 'Redaguoti'; + + @override + String get collectionSearchTitlesHintText => 'Ieškoti pavadinimų'; + + @override + String get collectionGroupAlbum => 'Pagal albumą'; + + @override + String get collectionGroupMonth => 'Pagal mėnesį'; + + @override + String get collectionGroupDay => 'Pagal dieną'; + + @override + String get sectionNone => 'Jokių skyrelių'; + + @override + String get sectionUnknown => 'Nežinoma'; + + @override + String get dateToday => 'Šiandien'; + + @override + String get dateYesterday => 'Vakar'; + + @override + String get dateThisMonth => 'Šį mėnesį'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nepavyko ištrinti $count elementų', + one: 'Nepavyko ištrinti 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nepavyko nukopijuoti $count elementų', + one: 'Nepavyko nukopijuoti 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nepavyko perkelti $count elementų', + one: 'Nepavyko perkelti 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nepavyko pervadinti $count elementų', + one: 'Nepavyko pervadinti 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nepavyko redaguoti $count elementų', + one: 'Nepavyko redaguoti 1 elemento', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nepavyko eksportuoti $count puslapių', + one: 'Nepavyko eksportuoti 1 puslapio', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nukopijuoti $count elementai', + one: 'Nukopijuota 1 prekė', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Perkelta $count elementų', + one: 'Perkeltas 1 elementas', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Pervadinti $count elementai', + one: 'Pervadintas 1 elementas', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Redaguoti $count elementai', + one: 'Redaguotas 1 elementas', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Nėra mėgstamiausių'; + + @override + String get collectionEmptyVideos => 'Nėra vaizdo įrašų'; + + @override + String get collectionEmptyImages => 'Nėra paveiklėlių'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Suteikti prieigą'; + + @override + String get collectionSelectSectionTooltip => 'Pasirinkti pasirinkimą'; + + @override + String get collectionDeselectSectionTooltip => 'Panaikinti pasirinkimą'; + + @override + String get drawerAboutButton => 'Apie'; + + @override + String get drawerSettingsButton => 'Nustatymai'; + + @override + String get drawerCollectionAll => 'Visos kolekcijos'; + + @override + String get drawerCollectionFavourites => 'Mėgstamiausi'; + + @override + String get drawerCollectionImages => 'Paveikslėliai'; + + @override + String get drawerCollectionVideos => 'Vaizdo įrašai'; + + @override + String get drawerCollectionAnimated => 'Animuota'; + + @override + String get drawerCollectionMotionPhotos => 'Judančios nuotraukos'; + + @override + String get drawerCollectionPanoramas => 'Panoramos'; + + @override + String get drawerCollectionRaws => 'Raw nuotraukos'; + + @override + String get drawerCollectionSphericalVideos => '360° vaizdo įrašai'; + + @override + String get drawerAlbumPage => 'Albumai'; + + @override + String get drawerCountryPage => 'Šalys'; + + @override + String get drawerPlacePage => 'Vietos'; + + @override + String get drawerTagPage => 'Žymos'; + + @override + String get sortByDate => 'Pagal datą'; + + @override + String get sortByName => 'Pagal pavadinimą'; + + @override + String get sortByItemCount => 'Pagal elementų skaičių'; + + @override + String get sortBySize => 'Pagal dydį'; + + @override + String get sortByAlbumFileName => 'Pagal albumą ir elemento pavadinimą'; + + @override + String get sortByRating => 'Pagal įvertinimą'; + + @override + String get sortByDuration => 'Pagal trukmę'; + + @override + String get sortByPath => 'Pagal kelią'; + + @override + String get sortOrderNewestFirst => 'Naujausi viršuje'; + + @override + String get sortOrderOldestFirst => 'Seniausi viršuje'; + + @override + String get sortOrderAtoZ => 'A — Z'; + + @override + String get sortOrderZtoA => 'Z — A'; + + @override + String get sortOrderHighestFirst => 'Anksčiausi viršuje'; + + @override + String get sortOrderLowestFirst => 'Žemiausi viršuje'; + + @override + String get sortOrderLargestFirst => 'Didžiausi viršuje'; + + @override + String get sortOrderSmallestFirst => 'Mažiausi viršuje'; + + @override + String get sortOrderShortestFirst => 'Trumpiausi pirmiausiai'; + + @override + String get sortOrderLongestFirst => 'Ilgiausi pirmiausiai'; + + @override + String get albumGroupTier => 'Pagal lygį'; + + @override + String get albumGroupType => 'Pagal tipą'; + + @override + String get albumGroupVolume => 'Pagal apimtį saugykloje'; + + @override + String get albumMimeTypeMixed => 'Mišrus'; + + @override + String get albumPickPageTitleCopy => 'Kopijuoti į albumą'; + + @override + String get albumPickPageTitleExport => 'Eksportuoti į albumą'; + + @override + String get albumPickPageTitleMove => 'Perkelti į albumą'; + + @override + String get albumPickPageTitlePick => 'Pasirinkti albumą'; + + @override + String get albumCamera => 'Kamera'; + + @override + String get albumDownload => 'Atsiuntimai'; + + @override + String get albumScreenshots => 'Ekrano nuotraukos'; + + @override + String get albumScreenRecordings => 'Ekrano vaizdo įrašai'; + + @override + String get albumVideoCaptures => 'Vaizdo įrašai'; + + @override + String get albumPageTitle => 'Albumai'; + + @override + String get albumEmpty => 'Nėra albumų'; + + @override + String get createAlbumButtonLabel => 'KURTI'; + + @override + String get newFilterBanner => 'nauja'; + + @override + String get countryPageTitle => 'Šalys'; + + @override + String get countryEmpty => 'Nėra šalių'; + + @override + String get statePageTitle => 'Valstybės'; + + @override + String get stateEmpty => 'Jokių valstybių'; + + @override + String get placePageTitle => 'Vietos'; + + @override + String get placeEmpty => 'Jokių vietų'; + + @override + String get tagPageTitle => 'Žymos'; + + @override + String get tagEmpty => 'Nėra žymų'; + + @override + String get tagPickPageTitle => 'Išrinkti žymą'; + + @override + String get binPageTitle => 'Šiukšlinė'; + + @override + String get explorerPageTitle => 'Naršyklė'; + + @override + String get explorerActionSelectStorageVolume => 'Pasirinkite saugyklą'; + + @override + String get selectStorageVolumeDialogTitle => 'Pasirinkti saugyklą'; + + @override + String get searchCollectionFieldHint => 'Ieškoti kolekcijoje'; + + @override + String get searchRecentSectionTitle => 'Naujausia'; + + @override + String get searchDateSectionTitle => 'Datos'; + + @override + String get searchFormatSectionTitle => 'Formatai'; + + @override + String get searchAlbumsSectionTitle => 'Albumai'; + + @override + String get searchCountriesSectionTitle => 'Šalys'; + + @override + String get searchStatesSectionTitle => 'Valstybės'; + + @override + String get searchPlacesSectionTitle => 'Vietos'; + + @override + String get searchTagsSectionTitle => 'Žymos'; + + @override + String get searchRatingSectionTitle => 'Įvertinimai'; + + @override + String get searchMetadataSectionTitle => 'Metaduomenys'; + + @override + String get settingsPageTitle => 'Nustatymai'; + + @override + String get settingsSystemDefault => 'Sistemos numatyta'; + + @override + String get settingsDefault => 'Numatyta'; + + @override + String get settingsDisabled => 'Išjungta'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Klausti kiekvieną kartą'; + + @override + String get settingsModificationWarningDialogMessage => 'Kiti nustatymai bus pakeisti.'; + + @override + String get settingsSearchFieldLabel => 'Paieškos nustatymai'; + + @override + String get settingsSearchEmpty => 'Nėra atitinkančio nustatymo'; + + @override + String get settingsActionExport => 'Eksportuoti'; + + @override + String get settingsActionExportDialogTitle => 'Eksportuoti'; + + @override + String get settingsActionImport => 'Importuoti'; + + @override + String get settingsActionImportDialogTitle => 'Importuoti'; + + @override + String get appExportCovers => 'Viršeliai'; + + @override + String get appExportDynamicAlbums => 'Dinaminiai albumai'; + + @override + String get appExportFavourites => 'Mėgstamiausi'; + + @override + String get appExportSettings => 'Nustatymai'; + + @override + String get settingsNavigationSectionTitle => 'Naršymas'; + + @override + String get settingsHomeTile => 'Pagrindinis'; + + @override + String get settingsHomeDialogTitle => 'Pagrindinis'; + + @override + String get setHomeCustom => 'Pritaikytas'; + + @override + String get settingsKeepScreenOnTile => 'Laikyti ekraną įjungtą'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Laikyti ekraną įjungtą'; + + @override + String get settingsDoubleBackExit => 'Du kart bakstelėti „atgal“, kad išeiti'; + + @override + String get settingsConfirmationTile => 'Patvirtinimo dialogo langai'; + + @override + String get settingsConfirmationDialogTitle => 'Patvirtinimo dialogo langai'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Klausti prieš ištrinanti elementus visam laikui'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Klausti prieš perkeliant elementus į šiukšlinę'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Klausti prieš perkeliant elementus be datos'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Rodyti pranešimą perkėlus elementus į šiukšlinę'; + + @override + String get settingsConfirmationVaultDataLoss => 'Rodyti saugyklos duomenų praradimo ispėjimą'; + + @override + String get settingsNavigationDrawerTile => 'Naršymo meniu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Naršymo meniu'; + + @override + String get settingsNavigationDrawerBanner => 'Palieskite ir palaikykite, kad perkeltumėte ir pakeistumėte meniu elementų eiliškumą.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Tipai'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albumai'; + + @override + String get settingsNavigationDrawerTabPages => 'Puslapiai'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Pridėti albumą'; + + @override + String get settingsNavigationBottomActionsTile => 'Apatinė naršymo juostelė'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Apatinė naršymo juostelė'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Norėdami perkelti mygtukus, palieskite ir laikykite, ir pasirinkite, kurie veiksmai bus rodomi apatinėje naršymo juostelėje.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniatiūros'; + + @override + String get settingsThumbnailOverlayTile => 'Uždanga'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Uždanga'; + + @override + String get settingsThumbnailShowHdrIcon => 'Rodyti HDR ikoną'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Rodyti mėgstamiausių piktogramą'; + + @override + String get settingsThumbnailShowTagIcon => 'Rodyti žymos piktogramą'; + + @override + String get settingsThumbnailShowLocationIcon => 'Rodyti vietos piktogramą'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Rodyti judančios nuotraukos piktogramą'; + + @override + String get settingsThumbnailShowRating => 'Rodyti įvertinimą'; + + @override + String get settingsThumbnailShowRawIcon => 'Rodyti Raw piktogramą'; + + @override + String get settingsThumbnailShowVideoDuration => 'Rodyti vaizdo įrašo trukmę'; + + @override + String get settingsCollectionQuickActionsTile => 'Spartieji veiksmai'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Spartieji veiksmai'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Naršymas'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Pasirinkimas'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Palieskite ir palaikykite norėdami perkelti mygtukus ir pasirinkti, kokie veiksmai bus rodomi naršant elementus.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Palieskite ir palaikykite norėdami perkelti mygtukus ir pasirinkti, kokie veiksmai bus rodomi pasirenkant elementus.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst modeliai'; + + @override + String get settingsCollectionBurstPatternsNone => 'Jokio'; + + @override + String get settingsViewerSectionTitle => 'Peržiūra'; + + @override + String get settingsViewerGestureSideTapNext => 'Bakstelėti ekrano kraštus, kad būtų rodomas ankstesnis / kitas elementas'; + + @override + String get settingsViewerUseCutout => 'Naudoti iškirpimo sritį'; + + @override + String get settingsViewerMaximumBrightness => 'Didžiausias ryškumas'; + + @override + String get settingsMotionPhotoAutoPlay => 'Automatiškai paleisti judančias nuotraukas'; + + @override + String get settingsImageBackground => 'Paveikslėlio fonas'; + + @override + String get settingsViewerQuickActionsTile => 'Spartieji veiksmai'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Spartieji veiksmai'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Palieskite ir palaikykite norėdami perkelti mygtukus ir pasirinkti, kurie veiksmai bus rodomi peržiūroje.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Rodomi mygtukai'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Galimi mygtukai'; + + @override + String get settingsViewerQuickActionEmpty => 'Nėra mygtukų'; + + @override + String get settingsViewerOverlayTile => 'Uždanga'; + + @override + String get settingsViewerOverlayPageTitle => 'Uždanga'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Rodyti atidarymo metu'; + + @override + String get settingsViewerShowHistogram => 'Rodyti histogramą'; + + @override + String get settingsViewerShowMinimap => 'Rodyti mini žemėlapį'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Rodyti informaciją'; + + @override + String get settingsViewerShowInformationSubtitle => 'Rodyti pavadinimą, datą, vietą ir kt.'; + + @override + String get settingsViewerShowRatingTags => 'Rodyti įvertinimus ir žymas'; + + @override + String get settingsViewerShowShootingDetails => 'Rodyti išsamią fotografavimo informaciją'; + + @override + String get settingsViewerShowDescription => 'Rodyti aprašymą'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Rodyti miniatiūras'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Suliejimo efektas'; + + @override + String get settingsViewerSlideshowTile => 'Skaidrių demonstravimas'; + + @override + String get settingsViewerSlideshowPageTitle => 'Skaidrių demonstravimas'; + + @override + String get settingsSlideshowRepeat => 'Kartoti'; + + @override + String get settingsSlideshowShuffle => 'Maišyti'; + + @override + String get settingsSlideshowFillScreen => 'Užpildyti ekraną'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animuotas priartinimo efektas'; + + @override + String get settingsSlideshowTransitionTile => 'Perėjimas efektas'; + + @override + String get settingsSlideshowIntervalTile => 'Intervalas'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Vaizdo įrašų atkūrimas'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Vaizdo įrašų atkūrimas'; + + @override + String get settingsVideoPageTitle => 'Vaizdo įrašų nustatymai'; + + @override + String get settingsVideoSectionTitle => 'Vaizdo įrašai'; + + @override + String get settingsVideoShowVideos => 'Rodyti vaizdo įrašus'; + + @override + String get settingsVideoPlaybackTile => 'Atkūrimas'; + + @override + String get settingsVideoPlaybackPageTitle => 'Atkūrimas'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Aparatinės įrangos spartintuvas'; + + @override + String get settingsVideoAutoPlay => 'Automatinis atkūrimas'; + + @override + String get settingsVideoLoopModeTile => 'Kartojimo režimas'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Kartojimo režimas'; + + @override + String get settingsVideoResumptionModeTile => 'Tęsti atkūrimą'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Tęsti atkūrimą'; + + @override + String get settingsVideoBackgroundMode => 'Fono grojimas'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Fono grojimas'; + + @override + String get settingsVideoControlsTile => 'Valdymas'; + + @override + String get settingsVideoControlsPageTitle => 'Valdymas'; + + @override + String get settingsVideoButtonsTile => 'Mygtukai'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Dukart bakstelėti, kad groti / pristabdyti'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Dukart bakstelėti ekrano kraštus, kad peršokti pirmyn/atgal'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Braukite į viršų ar apačią kad keisti šviesumą/garsumą'; + + @override + String get settingsSubtitleThemeTile => 'Subtitrai'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitrai'; + + @override + String get settingsSubtitleThemeSample => 'Tai yra pavyzdys.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Teksto lygiavimas'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Teksto lygiavimas'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Teksto padėtis'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Teksto padėtis'; + + @override + String get settingsSubtitleThemeTextSize => 'Teksto dydis'; + + @override + String get settingsSubtitleThemeShowOutline => 'Rodyti kontūrą ir šešėlį'; + + @override + String get settingsSubtitleThemeTextColor => 'Teksto spalva'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Teksto skaidrumas'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Fono spalva'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Fono skaidrumas'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Į kairę'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Centruoti'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Į dešinę'; + + @override + String get settingsPrivacySectionTitle => 'Privatumas'; + + @override + String get settingsAllowInstalledAppAccess => 'Leisti prieigą prie programėlių inventoriaus'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Naudojamas albumo rodymui pagerinti'; + + @override + String get settingsAllowErrorReporting => 'Leisti anonimiškai pranešti apie klaidas'; + + @override + String get settingsSaveSearchHistory => 'Išsaugoti paieškos istoriją'; + + @override + String get settingsEnableBin => 'Naudoti šiukšlinę'; + + @override + String get settingsEnableBinSubtitle => 'Išlaikyti panaikintus elementus 30 dienų'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Daiktai šiukšlių dėžėje bus ištrinti visam laikui.'; + + @override + String get settingsAllowMediaManagement => 'Leisti valdyti mediją'; + + @override + String get settingsHiddenItemsTile => 'Paslėpti elementai'; + + @override + String get settingsHiddenItemsPageTitle => 'Paslėpti elementai'; + + @override + String get settingsHiddenFiltersBanner => 'Nuotraukos ir vaizdo įrašai, atitinkantys paslėptus filtrus, nebus rodomi jūsų kolekcijoje.'; + + @override + String get settingsHiddenFiltersEmpty => 'Nėra paslėptų filtrų'; + + @override + String get settingsStorageAccessTile => 'Prieiga prie saugyklos'; + + @override + String get settingsStorageAccessPageTitle => 'Prieiga prie saugyklos'; + + @override + String get settingsStorageAccessBanner => + 'Norint keisti kai kuriuos katalogus, reikia aiškios tiesioginės prieigos teisės, kad būtų galima keisti juose esančius failus. Čia galite peržiūrėti katalogus, prie kurių anksčiau suteikėte prieigą.'; + + @override + String get settingsStorageAccessEmpty => 'Prieigos teisių nesuteikta'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Atšaukti leidimą'; + + @override + String get settingsAccessibilitySectionTitle => 'Pritaikymas neįgaliesiems'; + + @override + String get settingsRemoveAnimationsTile => 'Pašalinti animacijas'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Pašalinti animacijas'; + + @override + String get settingsTimeToTakeActionTile => 'Laikas iki veiksmo atlikimo'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Rodyti kelių palietimų gestų alternatyvas'; + + @override + String get settingsDisplaySectionTitle => 'Ekranas'; + + @override + String get settingsThemeBrightnessTile => 'Tema'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Tema'; + + @override + String get settingsThemeColorHighlights => 'Spalvų akcentai'; + + @override + String get settingsThemeEnableDynamicColor => 'Dinaminė spalva'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Ekrano atnaujinimo dažnis'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Atnaujinimo dažnis'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV vaizdas'; + + @override + String get settingsLanguageSectionTitle => 'Kalba ir formatai'; + + @override + String get settingsLanguageTile => 'Kalba'; + + @override + String get settingsLanguagePageTitle => 'Kalba'; + + @override + String get settingsCoordinateFormatTile => 'Koordinačių formatas'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Koordinačių formatas'; + + @override + String get settingsUnitSystemTile => 'Vienetai'; + + @override + String get settingsUnitSystemDialogTitle => 'Vienetai'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Priversti arabų skaitmenys'; + + @override + String get settingsScreenSaverPageTitle => 'Ekrano užsklanda'; + + @override + String get settingsWidgetPageTitle => 'Nuotraukų rėmelis'; + + @override + String get settingsWidgetShowOutline => 'Kontūras'; + + @override + String get settingsWidgetOpenPage => 'Bakstelėjus valdiklį'; + + @override + String get settingsWidgetDisplayedItem => 'Rodomas elementas'; + + @override + String get settingsCollectionTile => 'Kolekcija'; + + @override + String get statsPageTitle => 'Statistika'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementai su vieta', + one: '1 elementas su vieta', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Populiariausios šalys'; + + @override + String get statsTopStatesSectionTitle => 'Pagrindinės valstybės'; + + @override + String get statsTopPlacesSectionTitle => 'Populiariausios vietos'; + + @override + String get statsTopTagsSectionTitle => 'Populiariausios žymos'; + + @override + String get statsTopAlbumsSectionTitle => 'Populiariausi albumai'; + + @override + String get viewerOpenPanoramaButtonLabel => 'ATIDARYTI PANORAMĄ'; + + @override + String get viewerSetWallpaperButtonLabel => 'NUSTATYTI EKRANO FONĄ'; + + @override + String get viewerErrorUnknown => 'Oi!'; + + @override + String get viewerErrorDoesNotExist => 'Failas nebeegzistuoja.'; + + @override + String get viewerInfoPageTitle => 'Informacija'; + + @override + String get viewerInfoBackToViewerTooltip => 'Atgal į peržiūrą'; + + @override + String get viewerInfoUnknown => 'nežinoma'; + + @override + String get viewerInfoLabelDescription => 'Aprašymas'; + + @override + String get viewerInfoLabelTitle => 'Pavadinimas'; + + @override + String get viewerInfoLabelDate => 'Data'; + + @override + String get viewerInfoLabelResolution => 'Rezoliucija'; + + @override + String get viewerInfoLabelSize => 'Dydis'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Kelias'; + + @override + String get viewerInfoLabelDuration => 'Trukmė'; + + @override + String get viewerInfoLabelOwner => 'Savininkas'; + + @override + String get viewerInfoLabelCoordinates => 'Koordinatės'; + + @override + String get viewerInfoLabelAddress => 'Adresas'; + + @override + String get mapStyleDialogTitle => 'Žemėlapio stilius'; + + @override + String get mapStyleDialogAddStyle => 'Pridėti stilių'; + + @override + String get mapStyleTooltip => 'Pasirinkti žemėlapio stilių'; + + @override + String get mapStyleEditorDialogName => 'Vardas'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomenai'; + + @override + String get mapStyleEditorDialogUserAgent => 'Vartotojo agentas'; + + @override + String get mapZoomInTooltip => 'Pritraukti'; + + @override + String get mapZoomOutTooltip => 'Atitolinti'; + + @override + String get mapPointNorthUpTooltip => 'Centruoti pagal šiaurę'; + + @override + String get mapAttributionOsmData => 'Žemėlapio duomenys © [OpenStreetMap](https://www.openstreetmap.org/copyright) bendradarbiai'; + + @override + String get mapAttributionOsmLiberty => 'Plytelės iš [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Priegloba [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Plytelės iš [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Sluoksniai [HOT](https://www.hotosm.org/) • Priegloba [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Sluoksniai [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Peržiūrėti žemėlapio puslapyje'; + + @override + String get mapEmptyRegion => 'Šiame regione paveikslėlių nėra'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Nepavyko išskleisti įterptųjų duomenų'; + + @override + String get viewerInfoOpenLinkText => 'Atidaryti'; + + @override + String get viewerInfoViewXmlLinkText => 'Peržiūrėti XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Ieškoti metaduomenyse'; + + @override + String get viewerInfoSearchEmpty => 'Nėra atitinkančių raktų'; + + @override + String get viewerInfoSearchSuggestionDate => 'Data ir laikas'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Aprašymas'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Matmenys'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Rezoliucija'; + + @override + String get viewerInfoSearchSuggestionRights => 'Teisės'; + + @override + String get wallpaperUseScrollEffect => 'Naudoti slinkties efektą pagrindiniame ekrane'; + + @override + String get tagEditorPageTitle => 'Redaguoti žymas'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Nauja žyma'; + + @override + String get tagEditorPageAddTagTooltip => 'Pridėti žymą'; + + @override + String get tagEditorSectionRecent => 'Naujausia'; + + @override + String get tagEditorSectionPlaceholders => 'Vietos rezervavimo ženklai'; + + @override + String get tagEditorDiscardDialogMessage => 'Ar norite atmesti pakeitimus?'; + + @override + String get tagPlaceholderCountry => 'Šalis'; + + @override + String get tagPlaceholderState => 'Apskritis'; + + @override + String get tagPlaceholderPlace => 'Vieta'; + + @override + String get panoramaEnableSensorControl => 'Įjungti jutiklio valdymą'; + + @override + String get panoramaDisableSensorControl => 'Išjungti jutiklio valdymą'; + + @override + String get sourceViewerPageTitle => 'Šaltinis'; +} diff --git a/lib/l10ngen/app_localizations_ml.dart b/lib/l10ngen/app_localizations_ml.dart new file mode 100644 index 0000000..bcbb286 --- /dev/null +++ b/lib/l10ngen/app_localizations_ml.dart @@ -0,0 +1,2424 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Malayalam (`ml`). +class AppLocalizationsMl extends AppLocalizations { + AppLocalizationsMl([String locale = 'ml']) : super(locale); + + @override + String get appName => 'ഏവ്സ്'; + + @override + String get welcomeMessage => 'ഏവ്സിലേക്ക് സ്വാഗതം'; + + @override + String get welcomeOptional => 'Optional'; + + @override + String get welcomeTermsToggle => 'I agree to the terms and conditions'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items', + one: '$countString item', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString columns', + one: '$countString column', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString seconds', + one: '$countString second', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutes', + one: '$countString minute', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString days', + one: '$countString day', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APPLY'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'DELETE'; + + @override + String get nextButtonLabel => 'NEXT'; + + @override + String get showButtonLabel => 'SHOW'; + + @override + String get hideButtonLabel => 'HIDE'; + + @override + String get continueButtonLabel => 'CONTINUE'; + + @override + String get saveCopyButtonLabel => 'SAVE COPY'; + + @override + String get applyTooltip => 'Apply'; + + @override + String get cancelTooltip => 'Cancel'; + + @override + String get changeTooltip => 'Change'; + + @override + String get clearTooltip => 'Clear'; + + @override + String get previousTooltip => 'Previous'; + + @override + String get nextTooltip => 'Next'; + + @override + String get showTooltip => 'Show'; + + @override + String get hideTooltip => 'Hide'; + + @override + String get actionRemove => 'Remove'; + + @override + String get resetTooltip => 'Reset'; + + @override + String get saveTooltip => 'Save'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'Pick'; + + @override + String get doubleBackExitMessage => 'Tap “back” again to exit.'; + + @override + String get doNotAskAgain => 'Do not ask again'; + + @override + String get sourceStateLoading => 'Loading'; + + @override + String get sourceStateCataloguing => 'Cataloguing'; + + @override + String get sourceStateLocatingCountries => 'Locating countries'; + + @override + String get sourceStateLocatingPlaces => 'Locating places'; + + @override + String get chipActionDelete => 'Delete'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Show in Collection'; + + @override + String get chipActionGoToAlbumPage => 'Show in Albums'; + + @override + String get chipActionGoToCountryPage => 'Show in Countries'; + + @override + String get chipActionGoToPlacePage => 'Show in Places'; + + @override + String get chipActionGoToTagPage => 'Show in Tags'; + + @override + String get chipActionGoToExplorerPage => 'Show in Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Filter out'; + + @override + String get chipActionFilterIn => 'Filter in'; + + @override + String get chipActionHide => 'Hide'; + + @override + String get chipActionLock => 'Lock'; + + @override + String get chipActionPin => 'Pin to top'; + + @override + String get chipActionUnpin => 'Unpin from top'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Rename'; + + @override + String get chipActionSetCover => 'Set cover'; + + @override + String get chipActionShowCountryStates => 'Show states'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Create album'; + + @override + String get chipActionCreateVault => 'Create vault'; + + @override + String get chipActionConfigureVault => 'Configure vault'; + + @override + String get entryActionCopyToClipboard => 'Copy to clipboard'; + + @override + String get entryActionDelete => 'Delete'; + + @override + String get entryActionConvert => 'Convert'; + + @override + String get entryActionExport => 'Export'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Rename'; + + @override + String get entryActionRestore => 'Restore'; + + @override + String get entryActionRotateCCW => 'Rotate counterclockwise'; + + @override + String get entryActionRotateCW => 'Rotate clockwise'; + + @override + String get entryActionFlip => 'Flip horizontally'; + + @override + String get entryActionPrint => 'Print'; + + @override + String get entryActionShare => 'Share'; + + @override + String get entryActionShareImageOnly => 'Share image only'; + + @override + String get entryActionShareVideoOnly => 'Share video only'; + + @override + String get entryActionViewSource => 'View source'; + + @override + String get entryActionShowGeoTiffOnMap => 'Show as map overlay'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convert to still image'; + + @override + String get entryActionViewMotionPhotoVideo => 'Open video'; + + @override + String get entryActionEdit => 'Edit'; + + @override + String get entryActionOpen => 'Open with'; + + @override + String get entryActionSetAs => 'Set as'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Show in map app'; + + @override + String get entryActionRotateScreen => 'Rotate screen'; + + @override + String get entryActionAddFavourite => 'Add to favorites'; + + @override + String get entryActionRemoveFavourite => 'Remove from favorites'; + + @override + String get videoActionCaptureFrame => 'Capture frame'; + + @override + String get videoActionMute => 'Mute'; + + @override + String get videoActionUnmute => 'Unmute'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Play'; + + @override + String get videoActionReplay10 => 'Seek backward 10 seconds'; + + @override + String get videoActionSkip10 => 'Seek forward 10 seconds'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Select tracks'; + + @override + String get videoActionSetSpeed => 'Playback speed'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Settings'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Resume'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'Edit date & time'; + + @override + String get entryInfoActionEditLocation => 'Edit location'; + + @override + String get entryInfoActionEditTitleDescription => 'Edit title & description'; + + @override + String get entryInfoActionEditRating => 'Edit rating'; + + @override + String get entryInfoActionEditTags => 'Edit tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Remove metadata'; + + @override + String get entryInfoActionExportMetadata => 'Export metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Remove location'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Crop'; + + @override + String get editorTransformRotate => 'Rotate'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landscape'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Recycle bin'; + + @override + String get filterFavouriteLabel => 'Favorite'; + + @override + String get filterNoDateLabel => 'Undated'; + + @override + String get filterNoAddressLabel => 'No address'; + + @override + String get filterLocatedLabel => 'Located'; + + @override + String get filterNoLocationLabel => 'Unlocated'; + + @override + String get filterNoRatingLabel => 'Unrated'; + + @override + String get filterTaggedLabel => 'Tagged'; + + @override + String get filterNoTagLabel => 'Untagged'; + + @override + String get filterNoTitleLabel => 'Untitled'; + + @override + String get filterOnThisDayLabel => 'On this day'; + + @override + String get filterRecentlyAddedLabel => 'Recently added'; + + @override + String get filterRatingRejectedLabel => 'Rejected'; + + @override + String get filterTypeAnimatedLabel => 'Animated'; + + @override + String get filterTypeMotionPhotoLabel => 'Motion Photo'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Image'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'New'; + + @override + String get albumTierPinned => 'Pinned'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Common'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Others'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimal degrees'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Highest rate'; + + @override + String get displayRefreshRatePreferLowest => 'Lowest rate'; + + @override + String get keepScreenOnNever => 'Never'; + + @override + String get keepScreenOnVideoPlayback => 'During video playback'; + + @override + String get keepScreenOnViewerOnly => 'Viewer page only'; + + @override + String get keepScreenOnAlways => 'Always'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Never'; + + @override + String get maxBrightnessAlways => 'Always'; + + @override + String get nameConflictStrategyRename => 'Rename'; + + @override + String get nameConflictStrategyReplace => 'Replace'; + + @override + String get nameConflictStrategySkip => 'Skip'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Top'; + + @override + String get subtitlePositionBottom => 'Bottom'; + + @override + String get themeBrightnessLight => 'Light'; + + @override + String get themeBrightnessDark => 'Dark'; + + @override + String get themeBrightnessBlack => 'Black'; + + @override + String get unitSystemMetric => 'Metric'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Password'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Open with other player'; + + @override + String get videoLoopModeNever => 'Never'; + + @override + String get videoLoopModeShortOnly => 'Short videos only'; + + @override + String get videoLoopModeAlways => 'Always'; + + @override + String get videoPlaybackSkip => 'Skip'; + + @override + String get videoPlaybackMuted => 'Play muted'; + + @override + String get videoPlaybackWithSound => 'Play with sound'; + + @override + String get videoResumptionModeNever => 'Never'; + + @override + String get videoResumptionModeAlways => 'Always'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'None'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'Random'; + + @override + String get widgetDisplayedItemMostRecent => 'Most recent'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internal storage'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Some files have the same name.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'ADD'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Save dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OVER'; + + @override + String get videoResumeButtonLabel => 'RESUME'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Custom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'New Album'; + + @override + String get newAlbumDialogNameLabel => 'Album name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'Storage:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'New name'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'Rename'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insert field'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Preview'; + + @override + String get renameProcessorCounter => 'Counter'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Name'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete this album and the $countString items in it?', + one: 'Delete this album and the item in it?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these albums and the $countString items in them?', + one: 'Delete these albums and the item in them?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Width'; + + @override + String get exportEntryDialogHeight => 'Height'; + + @override + String get exportEntryDialogQuality => 'Quality'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'New name'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'Date & Time'; + + @override + String get editEntryDateDialogSetCustom => 'Set custom date'; + + @override + String get editEntryDateDialogCopyField => 'Copy from other date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'File modified date'; + + @override + String get durationDialogHours => 'Hours'; + + @override + String get durationDialogMinutes => 'Minutes'; + + @override + String get durationDialogSeconds => 'Seconds'; + + @override + String get editEntryLocationDialogTitle => 'Location'; + + @override + String get editEntryLocationDialogSetCustom => 'Set custom location'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Choose on map'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Use this location'; + + @override + String get editEntryRatingDialogTitle => 'Rating'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'More'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'Playback speed'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtitles'; + + @override + String get videoStreamSelectionDialogOff => 'Off'; + + @override + String get videoStreamSelectionDialogTrack => 'Track'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'Done!'; + + @override + String get genericFailureFeedback => 'Failed'; + + @override + String get genericDangerWarningDialogMessage => 'Are you sure?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'View'; + + @override + String get menuActionSelect => 'Select'; + + @override + String get menuActionSelectAll => 'Select all'; + + @override + String get menuActionSelectNone => 'Select none'; + + @override + String get menuActionMap => 'Map'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'Stats'; + + @override + String get viewDialogSortSectionTitle => 'Sort'; + + @override + String get viewDialogGroupSectionTitle => 'Sections'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'Grid'; + + @override + String get tileLayoutList => 'List'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Color'; + + @override + String get appPickDialogTitle => 'Pick App'; + + @override + String get appPickDialogNone => 'None'; + + @override + String get aboutPageTitle => 'About'; + + @override + String get aboutLinkLicense => 'License'; + + @override + String get aboutLinkPolicy => 'Privacy Policy'; + + @override + String get aboutBugSectionTitle => 'Bug Report'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copy system information'; + + @override + String get aboutBugCopyInfoButton => 'Copy'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'Report'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Credits'; + + @override + String get aboutCreditsWorldAtlas1 => 'This app uses a TopoJSON file from'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'Translators'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenses'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Show All Licenses'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'Pick'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'Edit'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Unknown'; + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'About'; + + @override + String get drawerSettingsButton => 'Settings'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Countries'; + + @override + String get drawerPlacePage => 'Places'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'By date'; + + @override + String get sortByName => 'By name'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'By size'; + + @override + String get sortByAlbumFileName => 'By album & item title'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A to Z'; + + @override + String get sortOrderZtoA => 'Z to A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumMimeTypeMixed => 'Mixed'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'Camera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'CREATE'; + + @override + String get newFilterBanner => 'new'; + + @override + String get countryPageTitle => 'Countries'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'States'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Places'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Date'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Countries'; + + @override + String get searchStatesSectionTitle => 'States'; + + @override + String get searchPlacesSectionTitle => 'Places'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Ratings'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Settings'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'Disabled'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'Settings'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Home'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_my.dart b/lib/l10ngen/app_localizations_my.dart new file mode 100644 index 0000000..1694ffb --- /dev/null +++ b/lib/l10ngen/app_localizations_my.dart @@ -0,0 +1,2387 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Burmese (`my`). +class AppLocalizationsMy extends AppLocalizations { + AppLocalizationsMy([String locale = 'my']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Aves မှ ကြိုဆိုပါတယ်'; + + @override + String get welcomeOptional => 'မရွေးဘဲထားနိုင်သည်'; + + @override + String get welcomeTermsToggle => 'စည်းမျဥ်းစည်းကမ်းနှင့် သတ်မှတ်ချက်များကို သဘောတူပါသည်'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count ခု', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count ကော်လံ', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString စက္ကန့်', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString မိနစ်', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ရက်', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length မီလီမီတာ'; + } + + @override + String get applyButtonLabel => 'လုပ်ဆောင်မည်'; + + @override + String get createButtonLabel => 'အသစ်ထည့်ရန်'; + + @override + String get deleteButtonLabel => 'ဖျက်မည်'; + + @override + String get nextButtonLabel => 'ရှေ့သို့'; + + @override + String get showButtonLabel => 'ပြရန်'; + + @override + String get hideButtonLabel => 'ဝှက်ရန်'; + + @override + String get continueButtonLabel => 'ရှေ့ဆက်သွားရန်'; + + @override + String get saveCopyButtonLabel => 'မိတ္တူကိုသိမ်းမည်'; + + @override + String get applyTooltip => 'လုပ်ဆောင်မည်'; + + @override + String get cancelTooltip => 'မလုပ်တော့ပါ'; + + @override + String get changeTooltip => 'ပြောင်းမည်'; + + @override + String get clearTooltip => 'ရှင်းလင်းမည်'; + + @override + String get previousTooltip => 'နောက်သို့'; + + @override + String get nextTooltip => 'ရှေ့သို့'; + + @override + String get showTooltip => 'ပြရန်'; + + @override + String get hideTooltip => 'ဝှက်ရန်'; + + @override + String get actionRemove => 'ဖယ်ရှားမည်'; + + @override + String get resetTooltip => 'အရင်အတိုင်းပြန်ထားမည်'; + + @override + String get saveTooltip => 'သိမ်းမည်'; + + @override + String get stopTooltip => 'ရပ်ရန်'; + + @override + String get pickTooltip => 'ရွေးရန်'; + + @override + String get doubleBackExitMessage => 'ထွက်ရန် \"နောက်သို့\" ခလုတ်ကို ထပ်နှိပ်ပါ။'; + + @override + String get doNotAskAgain => 'ထပ်မမေးပါနှင့်'; + + @override + String get sourceStateLoading => 'လုပ်ဆောင်နေသည်'; + + @override + String get sourceStateCataloguing => 'မက်တာဒေတာများ ဖန်တီးနေသည်'; + + @override + String get sourceStateLocatingCountries => 'နိုင်ငံတည်နေရာများ'; + + @override + String get sourceStateLocatingPlaces => 'နေရာ တည်နေရာများ'; + + @override + String get chipActionDelete => 'ဖျက်ရန်'; + + @override + String get chipActionRemove => 'ဖယ်ရှားမည်'; + + @override + String get chipActionShowCollection => 'စုစည်းမှုထဲမှာ ပြရန်'; + + @override + String get chipActionGoToAlbumPage => 'အယ်လ်ဘမ်တွေထဲမှာပြရန်'; + + @override + String get chipActionGoToCountryPage => 'နိုင်ငံတွေထဲမှာပြရန်'; + + @override + String get chipActionGoToPlacePage => 'နေရာများထဲတွင်ပြရန်'; + + @override + String get chipActionGoToTagPage => 'အမှတ်အသားများတွင်ပြရန်'; + + @override + String get chipActionGoToExplorerPage => 'Explorer ထဲတွင်ပြမည်'; + + @override + String get chipActionDecompose => 'ဖြတ်ထုတ်ရန်'; + + @override + String get chipActionFilterOut => 'စစ်ထုတ်ရန်'; + + @override + String get chipActionFilterIn => 'စစ်သွင်းရန်'; + + @override + String get chipActionHide => 'ဝှက်'; + + @override + String get chipActionLock => 'သော့ခတ်'; + + @override + String get chipActionPin => 'ထိပ်ဆုံးသို့ပင်တွဲရန်'; + + @override + String get chipActionUnpin => 'ထိပ်ဆုံးမှပင်ဖြုတ်ရန်'; + + @override + String get chipActionGroup => 'အုပ်စုဖွဲ့မည်'; + + @override + String get chipActionRename => 'အမည်ပြောင်းရန်'; + + @override + String get chipActionSetCover => 'ကာဗာပုံအဖြစ်ထားရန်'; + + @override + String get chipActionShowCountryStates => 'နိုင်ငံများပြရန်'; + + @override + String get chipActionCreateGroup => 'အုပ်စုအသစ်ပြုလုပ်မည်'; + + @override + String get chipActionCreateAlbum => 'အယ်လ်ဘမ်ဖန်တီးရန်'; + + @override + String get chipActionCreateVault => 'လျှို့ဝှက်သိုလှောင်ခန်း ဖန်တီးရန်'; + + @override + String get chipActionConfigureVault => 'လျှို့ဝှက်သိုလှောင်ခန်းကို ပြင်ဆင်ရန်'; + + @override + String get entryActionCopyToClipboard => 'ကလစ်ဘုတ်သို့ကော်ပီကူးရန်'; + + @override + String get entryActionDelete => 'ဖျက်ရန်'; + + @override + String get entryActionConvert => 'ဖိုင်ပုံစံပြောင်းရန်'; + + @override + String get entryActionExport => 'ပို့ရန်'; + + @override + String get entryActionInfo => 'ဖိုင်အချက်အလက်'; + + @override + String get entryActionRename => 'အမည်ပြောင်းရန်'; + + @override + String get entryActionRestore => 'ပြန်ယူရန်'; + + @override + String get entryActionRotateCCW => 'နာရီလက်တံပြောင်းပြန်အတိုင်း လှည့်ရန်'; + + @override + String get entryActionRotateCW => 'နာရီလက်တံအတိုင်း လှည့်ရန်'; + + @override + String get entryActionFlip => 'အလျားလိုက် လှန်ရန်'; + + @override + String get entryActionPrint => 'ပရင့်ထုတ်ရန်'; + + @override + String get entryActionShare => 'မျှဝေရန်'; + + @override + String get entryActionShareImageOnly => 'ပုံကိုသာ မျှဝေမည်'; + + @override + String get entryActionShareVideoOnly => 'ဗီဒီယိုကိုသာ မျှဝေမည်'; + + @override + String get entryActionViewSource => 'ရင်းမြစ်ကို ကြည့်ရန်'; + + @override + String get entryActionShowGeoTiffOnMap => 'မြေပုံ overlay အဖြစ် ပြရန်'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'ပုံအသေသို့ ပြောင်းရန်'; + + @override + String get entryActionViewMotionPhotoVideo => 'ဗီဒီယိုဖွင့်ရန်'; + + @override + String get entryActionEdit => 'ပြင်ဆင်ရန်'; + + @override + String get entryActionOpen => 'တခြားအက်ပ်ဖြင့် ဖွင့်ရန်'; + + @override + String get entryActionSetAs => '…ပုံအဖြစ် ထားရန်'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'မြေပုံကြည့်အက်ပ်တွင် ပြရန်'; + + @override + String get entryActionRotateScreen => 'စကရင်ကို လှည့်ရန်'; + + @override + String get entryActionAddFavourite => 'အကြိုက်ဆုံးများသို့ ထည့်ရန်'; + + @override + String get entryActionRemoveFavourite => 'အကြိုက်ဆုံးများမှ ဖယ်ရှားရန်'; + + @override + String get videoActionCaptureFrame => 'လက်ရှိဖရိန်ကိုဖမ်းယူရန်'; + + @override + String get videoActionMute => 'အသံပိတ်ရန်'; + + @override + String get videoActionUnmute => 'အသံပြန်ဖွင့်ရန်'; + + @override + String get videoActionPause => 'ခဏရပ်ရန်'; + + @override + String get videoActionPlay => 'ဖွင့်ရန်'; + + @override + String get videoActionReplay10 => 'နောက်သို့ ၁၀ စက္ကန့်ဆုတ်'; + + @override + String get videoActionSkip10 => 'ရှေ့သို့ ၁၀ စက္ကန့်သွား'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'အသံဖိုင်ရွေးရန်'; + + @override + String get videoActionSetSpeed => 'ဖွင့်ကြည့်မှု အမြန်နှုန်း'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'ဆက်တင်များ'; + + @override + String get viewerActionLock => 'ကြည့်ရှုမှုကို လော့ခ်ခတ်ရန်'; + + @override + String get viewerActionUnlock => 'ကြည့်ရှုမှုကို လော့ခ်ပြန်ဖွင့်ရန်'; + + @override + String get slideshowActionResume => 'ဆက်ကြည့်ရန်'; + + @override + String get slideshowActionShowInCollection => 'စုစည်းမှုထဲမှာ ပြရန်'; + + @override + String get entryInfoActionEditDate => 'ရက်စွဲနှင့်အချိန်ကို ပြင်ရန်'; + + @override + String get entryInfoActionEditLocation => 'တည်နေရာပြင်ရန်'; + + @override + String get entryInfoActionEditTitleDescription => 'ခေါင်းစဥ်နှင့်ဖော်ပြချက်ကို ပြင်ရန်'; + + @override + String get entryInfoActionEditRating => 'အဆင့်သတ်မှတ်ချက်ကို ပြင်ရန်'; + + @override + String get entryInfoActionEditTags => 'Tag များကိုပြင်ရန်'; + + @override + String get entryInfoActionRemoveMetadata => 'မက်တာဒေတာများ ဖယ်ရှားရန်'; + + @override + String get entryInfoActionExportMetadata => 'မက်တာဒေတာများ ပို့ရန်'; + + @override + String get entryInfoActionRemoveLocation => 'တည်နေရာကို ဖယ်ရှားမည်'; + + @override + String get editorActionTransform => 'အသွင်ပြောင်းရန်'; + + @override + String get editorTransformCrop => 'ဖြတ်တောက်ရန်'; + + @override + String get editorTransformRotate => 'လှည့်ရန်'; + + @override + String get cropAspectRatioFree => 'ကန့်သတ်မထား'; + + @override + String get cropAspectRatioOriginal => 'မူလအတိုင်း'; + + @override + String get cropAspectRatioSquare => 'လေးထောင့်ပုံစံ'; + + @override + String get filterAspectRatioLandscapeLabel => 'တစောင်း'; + + @override + String get filterAspectRatioPortraitLabel => 'အတည့်'; + + @override + String get filterBinLabel => 'ပြန်သုံးအမှိုက်ပုံး'; + + @override + String get filterFavouriteLabel => 'အကြိုက်ဆုံး'; + + @override + String get filterNoDateLabel => 'ရက်သတ်မှတ်မထား'; + + @override + String get filterNoAddressLabel => 'လိပ်စာမပါရှိ'; + + @override + String get filterLocatedLabel => 'တည်နေရာပါရှိ'; + + @override + String get filterNoLocationLabel => 'တည်နေရာမပါရှိ'; + + @override + String get filterNoRatingLabel => 'အဆင့်သတ်မှတ်မထား'; + + @override + String get filterTaggedLabel => 'Tag တွဲထား'; + + @override + String get filterNoTagLabel => 'Tag မတွဲထား'; + + @override + String get filterNoTitleLabel => 'ခေါင်းစဥ်မပေးထား'; + + @override + String get filterOnThisDayLabel => 'ယနေ့'; + + @override + String get filterRecentlyAddedLabel => 'ထည့်ထားတာ မကြာသေး'; + + @override + String get filterRatingRejectedLabel => 'ပယ်ချထား'; + + @override + String get filterTypeAnimatedLabel => 'လှုပ်ရှားနေသောပုံ'; + + @override + String get filterTypeMotionPhotoLabel => 'လှုပ်ရှားမှုပါသောပုံ'; + + @override + String get filterTypePanoramaLabel => 'မြင်ကွင်းကျယ်ဓာတ်ပုံ'; + + @override + String get filterTypeRawLabel => 'Raw ပုံ'; + + @override + String get filterTypeSphericalVideoLabel => '၃၆၀° ဗီဒီယို'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'ဓာတ်ပုံ'; + + @override + String get filterMimeVideoLabel => 'ဗီဒီယို'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'အသစ်'; + + @override + String get albumTierPinned => 'ပင်တွဲထား'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'အကြည့်များ'; + + @override + String get albumTierApps => 'အက်ပ်အလိုက်'; + + @override + String get albumTierVaults => 'လျှို့ဝှက်သိုလှောင်ခန်းများ'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'အခြား'; + + @override + String get coordinateFormatDms => 'DMS (ဒီဂရီ၊ မိနစ်၊ စက္ကန့်)'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'DD (လတ္တီတွဒ်၊ လောင်ဂျီတွဒ်)'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'မြောက်'; + + @override + String get coordinateDmsSouth => 'တောင်'; + + @override + String get coordinateDmsEast => 'အရှေ့'; + + @override + String get coordinateDmsWest => 'အနောက်'; + + @override + String get displayRefreshRatePreferHighest => 'အမြင့်ဆုံးနှုန်း'; + + @override + String get displayRefreshRatePreferLowest => 'အနိမ့်ဆုံးနှုန်း'; + + @override + String get keepScreenOnNever => 'ဘယ်တော့မှမလုပ်ပါနှင့်'; + + @override + String get keepScreenOnVideoPlayback => 'ဗီဒီယိုကြည့်နေသည့်အချိန်အတွင်း'; + + @override + String get keepScreenOnViewerOnly => 'ဓာတ်ပုံ/ဗီဒီယိုကြည့်သည့်စာမျက်နှာတွင်သာ'; + + @override + String get keepScreenOnAlways => 'အမြဲတမ်း'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google မြေပုံ'; + + @override + String get mapStyleGoogleHybrid => 'Google မြေပုံ (ဂြိုဟ်တု)'; + + @override + String get mapStyleGoogleTerrain => 'Google မြေပုံ (မြေအနေအထားပြ)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (ရေဆေး)'; + + @override + String get maxBrightnessNever => 'ဘယ်တော့မှမလုပ်ပါနှင့်'; + + @override + String get maxBrightnessAlways => 'အမြဲတမ်း'; + + @override + String get nameConflictStrategyRename => 'အမည်ပြောင်းလိုက်ပါ'; + + @override + String get nameConflictStrategyReplace => 'အစားထိုးလိုက်ပါ'; + + @override + String get nameConflictStrategySkip => 'ကျော်လိုက်ပါ'; + + @override + String get overlayHistogramNone => 'မထား'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'အပေါ်ဘက်'; + + @override + String get subtitlePositionBottom => 'အောက်ဘက်'; + + @override + String get themeBrightnessLight => 'အလင်း'; + + @override + String get themeBrightnessDark => 'အမှောင်'; + + @override + String get themeBrightnessBlack => 'အနက်ရောင်'; + + @override + String get unitSystemMetric => 'မက်ထရစ်ယူနစ်'; + + @override + String get unitSystemImperial => 'ဗြိတိသျှအင်ပါယာယူနစ် (မြန်မာနိုင်ငံသုံးစနစ်)'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN နံပါတ်'; + + @override + String get vaultLockTypePassword => 'စကားဝှက်'; + + @override + String get settingsVideoEnablePip => 'PiP (အခြားအက်ပ်တစ်ခုပေါ်တွင် ထပ်ပြခြင်း)'; + + @override + String get videoControlsPlayOutside => 'တခြား player နဲ့ဖွင့်တဲ့ခလုတ်'; + + @override + String get videoLoopModeNever => 'ဘယ်တော့မှမလုပ်ပါနှင့်'; + + @override + String get videoLoopModeShortOnly => 'ဗီဒီယိုအတိုလေးတွေတွင်သာ'; + + @override + String get videoLoopModeAlways => 'အမြဲတမ်း'; + + @override + String get videoPlaybackSkip => 'ကျော်လိုက်ပါ'; + + @override + String get videoPlaybackMuted => 'အသံပိတ်ပြီးဖွင့်မည်'; + + @override + String get videoPlaybackWithSound => 'အသံဖြင့်ဖွင့်မည်'; + + @override + String get videoResumptionModeNever => 'ဘယ်တော့မှမလုပ်ပါနှင့်'; + + @override + String get videoResumptionModeAlways => 'အမြဲတမ်း'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'မှိန်သွားခြင်း'; + + @override + String get viewerTransitionZoomIn => 'ချဲ့ကားလာခြင်း'; + + @override + String get viewerTransitionNone => 'ဘာမှမထား'; + + @override + String get wallpaperTargetHome => 'ပင်မစကရင်'; + + @override + String get wallpaperTargetLock => 'လော့ခ်စကရင်'; + + @override + String get wallpaperTargetHomeLock => 'ပင်မစကရင်နှင့် လော့ခ်စကရင်'; + + @override + String get widgetDisplayedItemRandom => 'ဗျောက်သောက်'; + + @override + String get widgetDisplayedItemMostRecent => 'အသစ်အဖြစ်ဆုံး'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'ဝစ်ဂျက်ကို အပ်ဒိတ်လုပ်ရန်'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'စက်တွင်းသိုလှောင်မှု'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD ကတ်တွင် သိုလှောင်မှု'; + + @override + String get rootDirectoryDescription => 'ထိပ်ဆုံး directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'ယခုအက်ပ်ကို ဖိုင်ဝင်ရောက်ကြည့်ရှုခွင့်ပေးရန်အတွက် အရှေ့စကရင်သို့ရောက်လျှင် “$volume” ၏ $directory ကို ရွေးချယ်ပေးပါ။'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'ယခုအက်ပ်သည် “$volume” ၏ $directory ရှိဖိုင်များကို ပြင်ဆင်ပြောင်းလဲခွင့်မရှိပါ။\n\nကျေးဇူးပြု၍ ၎င်းဓာတ်ပုံ/ဗီဒီယိုများကို စက်တွင်းပါဝင်ပြီးသားဖိုင်မန်နေဂျာ (သို့မဟုတ်) ဓာတ်ပုံကြည့်အက်ပ်တစ်ခုခုဖြင့် အခြား directory တစ်ခုကို ရွှေ့ပြောင်းပေးပါ။'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'ယခုလုပ်ဆောင်ချက်ပြီးမြောက်ရန် “$volume” တွင် နေရာလွတ် $neededSize ရှိဖို့ လိုအပ်တာကြောင့် လက်ရှိနေရာလွတ် $freeSize ဖြင့် လုပ်ဆောင်၍မရနိုင်ပါ။'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'စစ်စတမ်၏ ဖိုင်ရွေးအက်ပ်ကို ပိတ်ထားပါသည် (သို့မဟုတ်) ရှာမတွေ့ပါ။ ပြန်ဖွင့်ပေးပြီးမှ ထပ်စမ်းကြည့်ပါ။'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ယခုလုပ်ဆောင်ချက်ကို ဤအမျိုးအစားများပါဖိုင်များအတွက် အထောက်အပံ့မပေးထားပါ - $types', + one: 'ယခုလုပ်ဆောင်ချက်ကို ဤအမျိုးအစားဖိုင်များအတွက် အထောက်အပံ့မပေးထားပါ - $types', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'ထည့်သွင်းလိုသော folder တွင် အမည်တူဖိုင်များရှိနေသည်။'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'အမည်တူဖိုင်များရှိနေသည်။'; + + @override + String get addShortcutDialogLabel => 'ဖြတ်လမ်းတိုအမည်'; + + @override + String get addShortcutButtonLabel => 'ဖန်တီးမည်'; + + @override + String get noMatchingAppDialogMessage => 'ယခုလုပ်ဆောင်ချက်ကို ကိုင်တွယ်နိုင်သောအက်ပ် ရှာမတွေ့ပါ။'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ဒီ $count ခုကို ပြန်သုံးအမှိုက်ထဲထည့်မှာလား?', + two: 'ဒီနှစ်ခုကို ပြန်သုံးအမှိုက်ပုံးထဲ ထည့်မှာလား?', + one: 'ဒီတစ်ခုကို ပြန်သုံးအမှိုက်ပုံးထဲ ထည့်မှာလား?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ဒီ $count ခုကို ဖျက်မှာလား?', + two: 'ဒီနှစ်ခုကိုဖျက်မှာလား?', + one: 'ဒီတစ်ခုကိုဖျက်မှာလား?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'ရှေ့မဆက်ခင် ဓာတ်ပုံ/ဗီဒီယိုပါ ရက်စွဲတွေကို သိမ်းမှာလား?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'သိမ်းမည်'; + + @override + String videoResumeDialogMessage(String time) { + return 'ကြည့်လက်စ $time မိနစ်ကနေ ဆက်ကြည့်ချင်ပါသလား?'; + } + + @override + String get videoStartOverButtonLabel => 'အစကပဲပြန်စမည်'; + + @override + String get videoResumeButtonLabel => 'ဆက်ကြည့်မည်'; + + @override + String get setCoverDialogLatest => 'နောက်ဆုံးပုံ/ဗီဒီယို'; + + @override + String get setCoverDialogAuto => 'အလိုအလျောက်'; + + @override + String get setCoverDialogCustom => 'စိတ်ကြိုက်'; + + @override + String get hideFilterConfirmationDialogMessage => + 'ယခုစစ်ထုတ်မှုနှင့် ကိုက်ညီသော ဓာတ်ပုံနှင့်ဗီဒီယိုများကို စုစည်းမှုထဲမှ ဝှက်ထားမည်ဖြစ်ပါသည်။ ပြန်ဖော်ချင်ပါက “ကိုယ်ရေးကိုယ်တာလုံခြုံမှု” ဆက်တင်ထဲကနေ ပြန်ဖော်နိုင်ပါသည်။\n\nဝှက်ထားချင်တာ သေချာပါသလား?'; + + @override + String get newAlbumDialogTitle => 'အယ်လ်ဘမ်အသစ်'; + + @override + String get newAlbumDialogNameLabel => 'အယ်လ်ဘမ်အမည်'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory ရှိပြီးသားဖြစ်သည်'; + + @override + String get newAlbumDialogStorageLabel => 'သိုလှောင်မှု -'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => + 'လျှို့ဝှက်သိုလှောင်ခန်းရှိ ဓာတ်ပုံနှင့်ဗီဒီယိုများကို ဤအက်ပ်တွင်သာမြင်ရမည်ဖြစ်ပြီး အခြားအက်ပ်များတွင် မမြင်ရနိုင်ပါ။\n\nဤအက်ပ်ကိုဖျက်လိုက်သည်ဖြစ်စေ၊ အက်ပ်ဒေတာကိုရှင်းလင်းလိုက်သည်ဖြစ်စေ ၎င်းဓာတ်ပုံနှင့်ဗီဒီယိုအားလုံးကို ဆုံးရှုံးသွားမည်ဖြစ်ပါသည်။'; + + @override + String get newVaultDialogTitle => 'လျှို့ဝှက်သိုလှောင်ခန်းအသစ်'; + + @override + String get configureVaultDialogTitle => 'လျှို့ဝှက်သိုလှောင်ခန်းကို ပြင်ဆင်ခြင်း'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'စကရင်ပိတ်လျှင် လော့ခ်ခတ်ရန်'; + + @override + String get vaultDialogLockTypeLabel => 'လော့ခ်အမျိုးအစား'; + + @override + String get patternDialogEnter => 'Pattern ဆွဲပါ'; + + @override + String get patternDialogConfirm => 'Pattern ကို အတည်ပြုပါ'; + + @override + String get pinDialogEnter => 'PIN နံပါတ် ရိုက်ထည့်ပါ'; + + @override + String get pinDialogConfirm => 'PIN နံပါတ်ကို အတည်ပြုပါ'; + + @override + String get passwordDialogEnter => 'စကားဝှက်ရိုက်ထည့်ပါ'; + + @override + String get passwordDialogConfirm => 'စကားဝှက်ကို အတည်ပြုပါ'; + + @override + String get authenticateToConfigureVault => 'လျှို့ဝှက်သိုလှောင်ခန်းကိုပြင်ဆင်ရန် သင်ဖြစ်ကြောင်းသက်သေပြပါ'; + + @override + String get authenticateToUnlockVault => 'လျှို့ဝှက်သိုလှောင်ခန်းကိုဖွင့်ရန် သင်ဖြစ်ကြောင်းသက်သေပြပါ'; + + @override + String get vaultBinUsageDialogMessage => 'ပြန်သုံးအမှိုက်ပုံးကိုအသုံးပြုနေသော လျှို့ဝှက်သိုလှောင်ခန်းများရှိသည်။'; + + @override + String get renameAlbumDialogLabel => 'အမည်အသစ်'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory ရှိပြီးသားဖြစ်သည်'; + + @override + String get renameEntrySetPageTitle => 'အမည်ပြောင်းခြင်း'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'အမည်ပေးခြင်းပုံစံ'; + + @override + String get renameEntrySetPageInsertTooltip => 'အကွက်ထည့်မည်'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'အစမ်းကြည့်ခြင်း'; + + @override + String get renameProcessorCounter => 'ရေတွက်မှု'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'အမည်'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ယခုအယ်လ်ဘမ်နဲ့ အဲ့ဒီထဲက ဓာတ်ပုံ/ဗီဒီယို $count ခုကို ဖျက်မှာလား?', + two: 'ယခုအယ်လ်ဘမ်နဲ့ အဲ့ဒီထဲက ဓာတ်ပုံ/ဗီဒီယိုနှစ်ခုကိုဖျက်မှာလား?', + one: 'ယခုအယ်လ်ဘမ်နဲ့ အဲ့ဒီထဲက ဓာတ်ပုံ/ဗီဒီယိုကိုဖျက်မှာလား?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ဒီအယ်လ်ဘမ်တွေနဲ့ အဲ့ဒီထဲက ဓာတ်ပုံ/ဗီဒီယို $count ခုကို ဖျက်မှာလား?', + two: 'ဒီအယ်လ်ဘမ်တွေနဲ့ အဲ့ဒီထဲက ဓာတ်ပုံ/ဗီဒီယိုနှစ်ခုကိုဖျက်မှာလား?', + one: 'ဒီအယ်လ်ဘမ်တွေနဲ့ အဲ့ဒီထဲက ဓာတ်ပုံ/ဗီဒီယိုကိုဖျက်မှာလား?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'အလျား'; + + @override + String get exportEntryDialogHeight => 'အနံ'; + + @override + String get exportEntryDialogQuality => 'အရည်အသွေး'; + + @override + String get exportEntryDialogWriteMetadata => 'မက်တာဒေတာများပါ ကော်ပီကူးရန်'; + + @override + String get renameEntryDialogLabel => 'အမည်အသစ်'; + + @override + String get editEntryDialogCopyFromItem => 'တခြားပုံကနေ ကော်ပီကူးမည်'; + + @override + String get editEntryDialogTargetFieldsHeader => 'ပြင်ဆင်မည့် အကွက်များ'; + + @override + String get editEntryDateDialogTitle => 'ရက်စွဲနှင့် အချိန်'; + + @override + String get editEntryDateDialogSetCustom => 'စိတ်ကြိုက်ရက်စွဲထားမည်'; + + @override + String get editEntryDateDialogCopyField => 'တခြားရက်စွဲက ကော်ပီကူးမည်'; + + @override + String get editEntryDateDialogExtractFromTitle => 'ခေါင်းစဥ်က ယူမည်'; + + @override + String get editEntryDateDialogShift => 'အတိုးအလျှော့လုပ်မည်'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'ဖိုင်ပြင်ဆင်ခဲ့သည့်ရက်စွဲ'; + + @override + String get durationDialogHours => 'နာရီ'; + + @override + String get durationDialogMinutes => 'မိနစ်'; + + @override + String get durationDialogSeconds => 'စက္ကန့်'; + + @override + String get editEntryLocationDialogTitle => 'တည်နေရာ'; + + @override + String get editEntryLocationDialogSetCustom => 'စိတ်ကြိုက်တည်နေရာထားမည်'; + + @override + String get editEntryLocationDialogChooseOnMap => 'မြေပုံပေါ်ကရွေးမည်'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'လတ္တီတွဒ်'; + + @override + String get editEntryLocationDialogLongitude => 'လောင်ဂျီတွဒ်'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'ဒီနေရာကိုသုံးမည်'; + + @override + String get editEntryRatingDialogTitle => 'အဆင့်သတ်မှတ်ချက်'; + + @override + String get removeEntryMetadataDialogTitle => 'မက်တာဒေတာဖယ်ရှားခြင်း'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'နောက်ထပ်'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'လှုပ်ရှားမှုပါသောပုံအတွင်းက ဗီဒီယိုကိုဖွင့်ရန် XMP ကို လိုအပ်ပါသည်။\n\nဖျက်ချင်တာသေချာပါသလား?'; + + @override + String get videoSpeedDialogLabel => 'ဖွင့်ကြည့်မှု အမြန်နှုန်း'; + + @override + String get videoStreamSelectionDialogVideo => 'ဗီဒီယို'; + + @override + String get videoStreamSelectionDialogAudio => 'အသံ'; + + @override + String get videoStreamSelectionDialogText => 'စာတန်းထိုး'; + + @override + String get videoStreamSelectionDialogOff => 'ပိတ်ထား'; + + @override + String get videoStreamSelectionDialogTrack => 'အပုဒ်'; + + @override + String get videoStreamSelectionDialogNoSelection => 'တခြားအပုဒ်မရှိပါ။'; + + @override + String get genericSuccessFeedback => 'လုပ်ဆောင်ပြီးပါပြီ!'; + + @override + String get genericFailureFeedback => 'လုပ်ဆောင်မှုမအောင်မြင်ပါ'; + + @override + String get genericDangerWarningDialogMessage => 'သေချာပါသလား?'; + + @override + String get tooManyItemsErrorDialogMessage => 'ဓာတ်ပုံ/ဗီဒီယိုနည်းနည်းလေးနဲ့ ပြန်စမ်းကြည့်ပါ။'; + + @override + String get menuActionConfigureView => 'View'; + + @override + String get menuActionSelect => 'ရွေးချယ်ရန်'; + + @override + String get menuActionSelectAll => 'အားလုံးရွေးချယ်မည်'; + + @override + String get menuActionSelectNone => 'ဘာမှမရွေးပါ'; + + @override + String get menuActionMap => 'မြေပုံ'; + + @override + String get menuActionSlideshow => 'ဆလိုက်ရှိုး'; + + @override + String get menuActionStats => 'စာရင်းအင်း'; + + @override + String get viewDialogSortSectionTitle => 'အပေါ်အောက် စီခြင်း'; + + @override + String get viewDialogGroupSectionTitle => 'စုပြခြင်း'; + + @override + String get viewDialogLayoutSectionTitle => 'အပြင်အဆင်'; + + @override + String get viewDialogReverseSortOrder => 'ပြောင်းပြန်စီရန်'; + + @override + String get tileLayoutMosaic => 'Mosaic ပုံစံ'; + + @override + String get tileLayoutGrid => 'ဇယားကွက်ပုံစံ'; + + @override + String get tileLayoutList => 'စာရင်းပုံစံ'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'ကာဗာပိုင်း'; + + @override + String get coverDialogTabApp => 'အက်ပ်ပိုင်း'; + + @override + String get coverDialogTabColor => 'ကာလာပိုင်း'; + + @override + String get appPickDialogTitle => 'အက်ပ်ရွေးချယ်ပါ'; + + @override + String get appPickDialogNone => 'ဘာမှမရွေး'; + + @override + String get aboutPageTitle => 'ဤအက်ပ်အကြောင်း'; + + @override + String get aboutLinkLicense => 'လိုင်စင်'; + + @override + String get aboutLinkPolicy => 'ကိုယ်ရေးကိုယ်တာလုံခြုံမှု မူဝါဒ'; + + @override + String get aboutBugSectionTitle => 'Bug တင်ပြခြင်း'; + + @override + String get aboutBugSaveLogInstruction => 'အက်ပ်မှတ်တမ်းကို ဖိုင်တစ်ဖိုင်ထဲသို့သိမ်းပါ'; + + @override + String get aboutBugCopyInfoInstruction => 'စစ်စတမ်အချက်အလက်များကို ကော်ပီကူးပါ'; + + @override + String get aboutBugCopyInfoButton => 'ကော်ပီ'; + + @override + String get aboutBugReportInstruction => 'မှတ်တမ်းနှင့် စစ်စတမ်အချက်အလက်များကို GitHub တွင် တင်ပြပါ'; + + @override + String get aboutBugReportButton => 'တင်ပြမည်'; + + @override + String get aboutDataUsageSectionTitle => 'ဒေတာသုံးစွဲမှု'; + + @override + String get aboutDataUsageData => 'ဒေတာ'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'ဒေတာဘေ့စ်'; + + @override + String get aboutDataUsageMisc => 'အခြား'; + + @override + String get aboutDataUsageInternal => 'စက်တွင်း'; + + @override + String get aboutDataUsageExternal => 'စက်ပြင်ပ'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'ခရက်ဒစ်'; + + @override + String get aboutCreditsWorldAtlas1 => 'ဤအက်ပ်သည်'; + + @override + String get aboutCreditsWorldAtlas2 => 'မှ TopoJSON ဖိုင်ကို ISC လိုင်စင်အောက်တွင် အသုံးပြုထားသည်။'; + + @override + String get aboutTranslatorsSectionTitle => 'ဘာသာပြန်သူများ'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source လိုင်စင်များ'; + + @override + String get aboutLicensesBanner => 'ဤအက်ပ်သည် အောက်ပါ open-source package များနှင့် library များကို အသုံးပြုထားသည်။'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Library များ'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugin များ'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Package များ'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Package များ'; + + @override + String get aboutLicensesShowAllButtonLabel => 'လိုင်စင်အားလုံးကြည့်ရန်'; + + @override + String get policyPageTitle => 'ကိုယ်ရေးကိုယ်တာလုံခြုံမှု မူဝါဒ'; + + @override + String get collectionPageTitle => 'စုစည်းမှု'; + + @override + String get collectionPickPageTitle => 'ရွေးချယ်ပါ'; + + @override + String get collectionSelectPageTitle => 'ပုံ/ဗီဒီယိုရွေးချယ်ပါ'; + + @override + String get collectionActionShowTitleSearch => 'ခေါင်းစဥ်စစ်ထုတ်ရန်'; + + @override + String get collectionActionHideTitleSearch => 'ခေါင်းစဥ်မစစ်ထုတ်တော့ပါ'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'ဖြတ်လမ်းတိုဖန်တီးရန်'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'အမှိုက်ပုံးရှင်းလင်းရန်'; + + @override + String get collectionActionCopy => 'အယ်လ်ဘမ်သို့ကော်ပီကူးရန်'; + + @override + String get collectionActionMove => 'အယ်လ်ဘမ်သို့ရွှေ့ရန်'; + + @override + String get collectionActionRescan => 'ပြန်စကင်ဖတ်ရန်'; + + @override + String get collectionActionEdit => 'ပြင်ဆင်ရန်'; + + @override + String get collectionSearchTitlesHintText => 'ခေါင်းစဥ်ကို ရှာဖွေပါ'; + + @override + String get collectionGroupAlbum => 'အယ်လ်ဘမ်အလိုက်'; + + @override + String get collectionGroupMonth => 'လအလိုက်'; + + @override + String get collectionGroupDay => 'ရက်အလိုက်'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'မသိထားသည်များ'; + + @override + String get dateToday => 'ယနေ့'; + + @override + String get dateYesterday => 'မနေ့က'; + + @override + String get dateThisMonth => 'ယခုလ'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ပုံ/ဗီဒီယို $count ခုကို ဖျက်လို့မရခဲ့ပါ', + two: 'ပုံ/ဗီဒီယိုနှစ်ခုကို ဖျက်လို့မရခဲ့ပါ', + one: 'ပုံ/ဗီဒီယိုတစ်ခုကို ဖျက်လို့မရခဲ့ပါ', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ပုံ/ဗီဒီယို $count ခုကို ကော်ပီကူးလို့မရခဲ့ပါ', + two: 'ပုံ/ဗီဒီယိုနှစ်ခုကို ကော်ပီကူးလို့မရခဲ့ပါ', + one: 'ပုံ/ဗီဒီယိုတစ်ခုကို ကော်ပီကူးလို့မရခဲ့ပါ', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ပုံ/ဗီဒီယို $count ခုကို ရွှေ့လို့မရခဲ့ပါ', + two: 'ပုံ/ဗီဒီယိုနှစ်ခုကို ရွှေ့လို့မရခဲ့ပါ', + one: 'ပုံ/ဗီဒီယိုတစ်ခုကို ရွှေ့လို့မရခဲ့ပါ', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ပုံ/ဗီဒီယို $count ခုကို အမည်ပြောင်းလို့ မရခဲ့ပါ', + two: 'ပုံ/ဗီဒီယိုနှစ်ခုကို အမည်ပြောင်းလို့ မရခဲ့ပါ', + one: 'ပုံ/ဗီဒီယိုတစ်ခုကို အမည်ပြောင်းလို့ မရခဲ့ပါ', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ပုံ/ဗီဒီယို $count ခုကို ပြင်ဆင်လို့မရခဲ့ပါ', + two: 'ပုံ/ဗီဒီယိုနှစ်ခုကို ပြင်ဆင်လို့မရခဲ့ပါ', + one: 'ပုံ/ဗီဒီယိုတစ်ခုကို ပြင်ဆင်လို့မရခဲ့ပါ', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'စာမျက်နှာ $count မျက်နှာကို ပို့လို့မရခဲ့ပါ', + two: 'စာမျက်နှာနှစ်မျက်နှာကို ပို့လို့မရခဲ့ပါ', + one: 'စာမျက်နှာတစ်မျက်နှာကို ပို့လို့မရခဲ့ပါ', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ပုံ/ဗီဒီယို $count ခုကို ကော်ပီကူးလိုက်သည်', + two: 'ပုံ/ဗီဒီယိုနှစ်ခုကို ကော်ပီကူးလိုက်သည်', + one: 'ပုံ/ဗီဒီယိုတစ်ခုကို ကော်ပီကူးလိုက်သည်', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ပုံ/ဗီဒီယို $count ခုကို ရွှေ့လိုက်သည်', + two: 'ပုံ/ဗီဒီယိုနှစ်ခုကို ရွှေ့လိုက်သည်', + one: 'ပုံ/ဗီဒီယိုတစ်ခုကို ရွှေ့လိုက်သည်', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ပုံ/ဗီဒီယို $count ခုကို အမည်ပြောင်းလိုက်သည်', + two: 'ပုံ/ဗီဒီယိုနှစ်ခုကို အမည်ပြောင်းလိုက်သည်', + one: 'ပုံ/ဗီဒီယိုတစ်ခုကို အမည်ပြောင်းလိုက်သည်', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ပုံ/ဗီဒီယို $count ခုကို ပြင်ဆင်လိုက်သည်', + two: 'ပုံ/ဗီဒီယိုနှစ်ခုကို ပြင်ဆင်လိုက်သည်', + one: 'ပုံ/ဗီဒီယိုတစ်ခုကို ပြင်ဆင်လိုက်သည်', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'အကြိုက်ဆုံးတစ်ခုမှ မရှိပါ'; + + @override + String get collectionEmptyVideos => 'ဗီဒီယိုတစ်ခုမှမရှိပါ'; + + @override + String get collectionEmptyImages => 'ပုံတစ်ပုံမှမရှိပါ'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'ဖိုင်ဝင်ရောက်ကြည့်ရှုခွင့်ပေးရန်'; + + @override + String get collectionSelectSectionTooltip => 'အစိတ်အပိုင်းရွေးချယ်ပါ'; + + @override + String get collectionDeselectSectionTooltip => 'အစိတ်အပိုင်းကို မရွေးတော့ပါ'; + + @override + String get drawerAboutButton => 'အက်ပ်အကြောင်း'; + + @override + String get drawerSettingsButton => 'ဆက်တင်များ'; + + @override + String get drawerCollectionAll => 'စုစည်းမှုအားလုံး'; + + @override + String get drawerCollectionFavourites => 'အကြိုက်ဆုံး'; + + @override + String get drawerCollectionImages => 'ဓာတ်ပုံ'; + + @override + String get drawerCollectionVideos => 'ဗီဒီယို'; + + @override + String get drawerCollectionAnimated => 'လှုပ်ရှားနေသောပုံ'; + + @override + String get drawerCollectionMotionPhotos => 'လှုပ်ရှားမှုပါသောပုံ'; + + @override + String get drawerCollectionPanoramas => 'မြင်ကွင်းကျယ်ဓာတ်ပုံ'; + + @override + String get drawerCollectionRaws => 'Raw ပုံ'; + + @override + String get drawerCollectionSphericalVideos => '၃၆၀° ဗီဒီယို'; + + @override + String get drawerAlbumPage => 'အယ်လ်ဘမ်'; + + @override + String get drawerCountryPage => 'နိုင်ငံ'; + + @override + String get drawerPlacePage => 'နေရာ'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'ရက်စွဲအလိုက်'; + + @override + String get sortByName => 'အမည်အလိုက်'; + + @override + String get sortByItemCount => 'ပုံအရေအတွက်အလိုက်'; + + @override + String get sortBySize => 'အရွယ်အစားအလိုက်'; + + @override + String get sortByAlbumFileName => 'အယ်လ်ဘမ်နှင့် ဖိုင်အမည်အလိုက်'; + + @override + String get sortByRating => 'အဆင့်သတ်မှတ်ချက်အလိုက်'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'အသစ်ဆုံးက ထိပ်ဆုံး'; + + @override + String get sortOrderOldestFirst => 'အဟောင်းဆုံးက ထိပ်ဆုံး'; + + @override + String get sortOrderAtoZ => 'A ကနေ Z'; + + @override + String get sortOrderZtoA => 'Z ကနေ A'; + + @override + String get sortOrderHighestFirst => 'အမြင့်ဆုံးက ထိပ်ဆုံး'; + + @override + String get sortOrderLowestFirst => 'အနိမ့်ဆုံးက ထိပ်ဆုံး'; + + @override + String get sortOrderLargestFirst => 'အကြီးဆုံးက ထိပ်ဆုံး'; + + @override + String get sortOrderSmallestFirst => 'အသေးဆုံးက ထိပ်ဆုံး'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'အဆင့်အလိုက်'; + + @override + String get albumGroupType => 'အမျိုးအစားအလိုက်'; + + @override + String get albumGroupVolume => 'သိုလှောင်မှုပမာဏအလိုက်'; + + @override + String get albumMimeTypeMixed => 'ရောထား'; + + @override + String get albumPickPageTitleCopy => 'အယ်လ်ဘမ်သို့ ကော်ပီကူးခြင်း'; + + @override + String get albumPickPageTitleExport => 'အယ်လ်ဘမ်သို့ ပို့ခြင်း'; + + @override + String get albumPickPageTitleMove => 'အယ်လ်ဘမ်သို့ ရွှေ့ခြင်း'; + + @override + String get albumPickPageTitlePick => 'အယ်လ်ဘမ်ရွေးချယ်ပါ'; + + @override + String get albumCamera => 'ကင်မရာ'; + + @override + String get albumDownload => 'ဒေါင်းလုဒ်'; + + @override + String get albumScreenshots => 'Screenshot များ'; + + @override + String get albumScreenRecordings => 'စကရင် recording များ'; + + @override + String get albumVideoCaptures => 'ဗီဒီယိုဖမ်းယူထားသည်များ'; + + @override + String get albumPageTitle => 'အယ်လ်ဘမ်များ'; + + @override + String get albumEmpty => 'အယ်လ်ဘမ်တစ်ခုမှ မရှိပါ'; + + @override + String get createAlbumButtonLabel => 'ဖန်တီးမည်'; + + @override + String get newFilterBanner => 'new'; + + @override + String get countryPageTitle => 'နိုင်ငံများ'; + + @override + String get countryEmpty => 'နိုင်ငံတစ်ခုမှ မရှိပါ'; + + @override + String get statePageTitle => 'ပြည်နယ်များ'; + + @override + String get stateEmpty => 'ပြည်နယ်တစ်ခုမှ မရှိပါ'; + + @override + String get placePageTitle => 'နေရာများ'; + + @override + String get placeEmpty => 'နေရာတစ်ခုမှ မရှိပါ'; + + @override + String get tagPageTitle => 'Tag များ'; + + @override + String get tagEmpty => 'Tag တစ်ခုမှ မရှိပါ'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'ပြန်သုံးအမှိုက်ပုံး'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'စုစည်းမှုအတွင်း ရှာဖွေပါ'; + + @override + String get searchRecentSectionTitle => 'ရှာထားတာ မကြာသေး'; + + @override + String get searchDateSectionTitle => 'ရက်စွဲ'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'အယ်လ်ဘမ်များ'; + + @override + String get searchCountriesSectionTitle => 'နိုင်ငံများ'; + + @override + String get searchStatesSectionTitle => 'ပြည်နယ်များ'; + + @override + String get searchPlacesSectionTitle => 'နေရာများ'; + + @override + String get searchTagsSectionTitle => 'Tag များ'; + + @override + String get searchRatingSectionTitle => 'အဆင့်သတ်မှတ်ချက်များ'; + + @override + String get searchMetadataSectionTitle => 'မက်တာဒေတာ'; + + @override + String get settingsPageTitle => 'ဆက်တင်များ'; + + @override + String get settingsSystemDefault => 'စစ်စတမ်အတိုင်း'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'ပိတ်ထား'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'အမြဲတမ်းပြန်မေးရန်'; + + @override + String get settingsModificationWarningDialogMessage => 'အခြားဆက်တင်များကိုပါ ပြင်ဆင်မည်ဖြစ်ပါသည်။'; + + @override + String get settingsSearchFieldLabel => 'ဆက်တင်များအတွင်း ရှာဖွေပါ'; + + @override + String get settingsSearchEmpty => 'ကိုက်ညီသောဆက်တင် မရှိပါ'; + + @override + String get settingsActionExport => 'ဆက်တင်များပို့ရန်'; + + @override + String get settingsActionExportDialogTitle => 'ဆက်တင်များပို့ခြင်း'; + + @override + String get settingsActionImport => 'ဆက်တင်များသွင်းရန်'; + + @override + String get settingsActionImportDialogTitle => 'ဆက်တင်များသွင်းခြင်း'; + + @override + String get appExportCovers => 'ကာဗာပုံများ'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'အကြိုက်ဆုံးများ'; + + @override + String get appExportSettings => 'ဆက်တင်များ'; + + @override + String get settingsNavigationSectionTitle => 'နေရာချခြင်း'; + + @override + String get settingsHomeTile => 'မူလအဖြစ်'; + + @override + String get settingsHomeDialogTitle => 'မူလအဖြစ်'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'စကရင်မပိတ်ပါနှင့်'; + + @override + String get settingsKeepScreenOnDialogTitle => 'စကရင်မပိတ်ပါနှင့်'; + + @override + String get settingsDoubleBackExit => '“နောက်သို့” ခလုတ်ကိုထပ်နှိပ်မှ ထွက်ရန်'; + + @override + String get settingsConfirmationTile => 'အတည်ပြုဒိုင်ယာလော့ခ်များ'; + + @override + String get settingsConfirmationDialogTitle => 'အတည်ပြုဒိုင်ယာလော့ခ်များ'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'ပုံများကို အပြီးမဖျက်ခင်ပြန်မေးရန်'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'ပြန်သုံးအမှိုက်ပုံးသို့မရွှေ့ခင် ပြန်မေးရန်'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'ရက်စွဲမပါသောပုံများကိုမရွှေ့ခင် ပြန်မေးရန်'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'ပြန်သုံးအမှိုက်ပုံးထဲထည့်ပြီးလျှင် ပြီးကြောင်း စာဖြင့်ပြပေးရန်'; + + @override + String get settingsConfirmationVaultDataLoss => 'လျှို့ဝှက်သိုလှောင်ခန်းရှိ ဒေတာဆုံးရှုံးမှုသတိပေးချက်များ ပြပေးရန်'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'မီနူးပစ္စည်းများကိုရွှေ့ရန်နှင့်စီရန် ဆက်တိုက်ထိထားပါ။'; + + @override + String get settingsNavigationDrawerTabTypes => 'အမျိုးအစားများ'; + + @override + String get settingsNavigationDrawerTabAlbums => 'အယ်လ်ဘမ်များ'; + + @override + String get settingsNavigationDrawerTabPages => 'စာမျက်နှာများ'; + + @override + String get settingsNavigationDrawerAddAlbum => 'အယ်လ်ဘမ်ထပ်ထည့်ရန်'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'အကြိုက်ဆုံးအိုင်ကွန်ကို ပြရန်'; + + @override + String get settingsThumbnailShowTagIcon => 'Tag အိုင်ကွန်ကိုပြရန်'; + + @override + String get settingsThumbnailShowLocationIcon => 'တည်နေရာအိုင်ကွန်ကိုပြရန်'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'လှုပ်ရှားမှုပါသောပုံ အိုင်ကွန်ကိုပြရန်'; + + @override + String get settingsThumbnailShowRating => 'အဆင့်သတ်မှတ်ချက်ကို ပြရန်'; + + @override + String get settingsThumbnailShowRawIcon => 'Raw အိုင်ကွန်ကိုပြရန်'; + + @override + String get settingsThumbnailShowVideoDuration => 'ဗီဒီယိုကြာချိန်ကို ပြရန်'; + + @override + String get settingsCollectionQuickActionsTile => 'အမြန်လုပ်ဆောင်မှု'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'အမြန်လုပ်ဆောင်မှု'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'ရှာဖွေကြည့်ရှုရာမှာ'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'ရွေးချယ်ရာမှာ'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'ပုံတွေကိုရှာဖွေကြည့်ရှုရာမှာ ပြသမယ့်လုပ်ဆောင်မှုတွေကို ရွေးချယ်ပါ။ ခလုတ်တွေကိုရွှေ့လျှင် ဆက်တိုက်ထိထားပြီးရွှေ့ပါ။'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'ပုံတွေကိုရွေးချယ်ရာမှာ ပြသမယ့်လုပ်ဆောင်မှုတွေကို ရွေးချယ်ပါ။ ခလုတ်တွေကိုရွှေ့လျှင် ဆက်တိုက်ထိထားပြီးရွှေ့ပါ။'; + + @override + String get settingsCollectionBurstPatternsTile => 'ဆက်တိုက်ရိုက်ဓာတ်ပုံများ၏ ဖိုင်ပုံစံ'; + + @override + String get settingsCollectionBurstPatternsNone => 'ဘာမှမထား'; + + @override + String get settingsViewerSectionTitle => 'ကြည့်ရှုသည့်စာမျက်နှာ'; + + @override + String get settingsViewerGestureSideTapNext => 'စကရင်အစွန်းကို ထိလိုက်လျှင် အရှေ့/အနောက်ကတစ်ပုံကိုပြရန်'; + + @override + String get settingsViewerUseCutout => 'Notch နေရာပါ သုံးရန်'; + + @override + String get settingsViewerMaximumBrightness => 'Brightness အမြင့်ဆုံးထားရန်'; + + @override + String get settingsMotionPhotoAutoPlay => 'လှုပ်ရှားမှုပါသောပုံတွေကို အလိုအလျောက်ပလေးရန်'; + + @override + String get settingsImageBackground => 'ဓာတ်ပုံနောက်ခံ'; + + @override + String get settingsViewerQuickActionsTile => 'အမြန်လုပ်ဆောင်မှု'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'အမြန်လုပ်ဆောင်မှု'; + + @override + String get settingsViewerQuickActionEditorBanner => 'ပုံတွေကိုကြည့်ရှုချိန် ပြသမယ့်လုပ်ဆောင်မှုတွေကို ရွေးချယ်ပါ။ ခလုတ်တွေကိုရွှေ့လျှင် ဆက်တိုက်ထိထားပြီးရွှေ့ပါ။'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'ပြသမည့်ခလုတ်များ'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'ရရှိနိုင်သော ခလုတ်များ'; + + @override + String get settingsViewerQuickActionEmpty => 'ခလုတ်တစ်ခုမှမရှိပါ'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'အဖွင့်တွင် ပြရန်'; + + @override + String get settingsViewerShowHistogram => 'Histogram ကို ပြရန်'; + + @override + String get settingsViewerShowMinimap => 'မြေပုံအသေးစားလေးကို ပြရန်'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'အချက်အလက်များကို ပြရန်'; + + @override + String get settingsViewerShowInformationSubtitle => 'ခေါင်းစဥ်၊ ရက်စွဲ၊ တည်နေရာ စသဖြင့်'; + + @override + String get settingsViewerShowRatingTags => 'အဆင့်သတ်မှတ်ချက်နှင့် tag များကို ပြရန်'; + + @override + String get settingsViewerShowShootingDetails => 'ရိုက်ကူးမှုအသေးစိတ်ကို ပြရန်'; + + @override + String get settingsViewerShowDescription => 'ဖော်ပြချက်ကိုပြရန်'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Thumbnail ကို ပြရန်'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'ဆလိုက်ရှိုး'; + + @override + String get settingsViewerSlideshowPageTitle => 'ဆလိုက်ရှိုး'; + + @override + String get settingsSlideshowRepeat => 'ပြန်ကျော့ရန်'; + + @override + String get settingsSlideshowShuffle => 'ဟိုရောက်လိုက် ဒီရောက်လိုက်'; + + @override + String get settingsSlideshowFillScreen => 'စကရင်အပြည့်'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'ချဲ့ကားလာသည့် effect'; + + @override + String get settingsSlideshowTransitionTile => 'အကူးအပြောင်း'; + + @override + String get settingsSlideshowIntervalTile => 'အကူးအပြောင်းမလုပ်ခင် ကြားအချိန်'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'ဗီဒီယိုဖွင့်ကြည့်ခြင်း'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'ဗီဒီယိုဖွင့်ကြည့်ခြင်း'; + + @override + String get settingsVideoPageTitle => 'ဗီဒီယိုဆက်တင်များ'; + + @override + String get settingsVideoSectionTitle => 'ဗီဒီယို'; + + @override + String get settingsVideoShowVideos => 'ဗီဒီယိုများပါ ပြရန်'; + + @override + String get settingsVideoPlaybackTile => 'ဖွင့်ကြည့်ခြင်း'; + + @override + String get settingsVideoPlaybackPageTitle => 'ဖွင့်ကြည့်ခြင်း'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware အသုံးပြုအရှိန်မြှင့်တင်ခြင်း'; + + @override + String get settingsVideoAutoPlay => 'အလိုအလျောက်ဖွင့်ခြင်း'; + + @override + String get settingsVideoLoopModeTile => 'ပြန်ကျော့ခြင်း'; + + @override + String get settingsVideoLoopModeDialogTitle => 'ပြန်ကျော့ခြင်း'; + + @override + String get settingsVideoResumptionModeTile => 'ကြည့်လက်စ ဆက်ကြည့်ခြင်း'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'ကြည့်လက်စ ဆက်ကြည့်ခြင်း'; + + @override + String get settingsVideoBackgroundMode => 'နောက်ခံတွင် ဖွင့်ထားခြင်း'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'နောက်ခံတွင် ဖွင့်ထားခြင်း'; + + @override + String get settingsVideoControlsTile => 'ထိန်းချုပ်မှုများ'; + + @override + String get settingsVideoControlsPageTitle => 'ထိန်းချုပ်မှုများ'; + + @override + String get settingsVideoButtonsTile => 'ခလုတ်'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'နှစ်ချက်ထိလျှင် ဖွင့်ကြည့်/ရပ်ရန်'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'စကရင်အစွန်းကို နှစ်ချက်ထိလျှင် ရှေ့သွား/နောက်ဆုတ်ရန်'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'အပေါ်အောက်ပွတ်ဆွဲလျှင် brightness/အသံ အတိုးအလျှော့လုပ်ရန်'; + + @override + String get settingsSubtitleThemeTile => 'စာတန်းထိုး'; + + @override + String get settingsSubtitleThemePageTitle => 'စာတန်းထိုး'; + + @override + String get settingsSubtitleThemeSample => 'ဒါက ဥပမာပြတာပါ။'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'အလျားလိုက် စာသားနေရာ'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'အလျားလိုက် စာသားနေရာ'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'ဒေါင်လိုက် စာသားနေရာ'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'ဒေါင်လိုက် စာသားနေရာ'; + + @override + String get settingsSubtitleThemeTextSize => 'စာသားအရွယ်အစား'; + + @override + String get settingsSubtitleThemeShowOutline => 'စာသားကောက်ကြောင်းနှင့် အရိပ်ကို ပြရန်'; + + @override + String get settingsSubtitleThemeTextColor => 'စာသားအရောင်'; + + @override + String get settingsSubtitleThemeTextOpacity => 'စာသားထင်ရှားမှု'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'နောက်ခံအရောင်'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'နောက်ခံထင်ရှားမှု'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'ဘယ်ဘက်'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'အလယ်'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'ညာဘက်'; + + @override + String get settingsPrivacySectionTitle => 'ကိုယ်ရေးအချက်အလက်လုံခြုံမှု'; + + @override + String get settingsAllowInstalledAppAccess => 'စက်တွင်းထည့်သွင်းထားသည့် အက်ပ်စာရင်း ကြည့်ရှုခွင့်ပေးရန်'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'အယ်လ်ဘမ်ပြသမှုပိုမိုကောင်းမွန်စေဖို့ အသုံးပြုပါသည်'; + + @override + String get settingsAllowErrorReporting => 'အမည်မဲ့ error တင်ပြမှုများကို ခွင့်ပြုရန်'; + + @override + String get settingsSaveSearchHistory => 'ရှာဖွေမှုမှတ်တမ်းကို သိမ်းထားရန်'; + + @override + String get settingsEnableBin => 'ပြန်သုံးအမှိုက်ပုံးကို သုံးရန်'; + + @override + String get settingsEnableBinSubtitle => 'ဖျက်ထားသည့်ပုံများကို ရက် ၃၀ အထိ ဆက်သိမ်းထားပါမည်'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'ပြန်သုံးအမှိုက်ပုံးထဲက ဓာတ်ပုံနဲ့ ဗီဒီယိုတွေကို အပြီးဖျက်လိုက်မှာပါ။'; + + @override + String get settingsAllowMediaManagement => 'မီဒီယာစီမံခန့်ခွဲခွင့် ပေးရန်'; + + @override + String get settingsHiddenItemsTile => 'ဝှက်ထားသည့်ပုံများ'; + + @override + String get settingsHiddenItemsPageTitle => 'ဝှက်ထားသည့်ပုံများ'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'သိုလှောင်ခန်းဝင်ရောက်ကြည့်ရှုခွင့်'; + + @override + String get settingsStorageAccessPageTitle => 'သိုလှောင်ခန်းဝင်ရောက်ကြည့်ရှုခွင့်'; + + @override + String get settingsStorageAccessBanner => 'တချို့ directory တွေဟာ သူတို့ထဲကဖိုင်တွေကို ပြင်ဆင်ဖို့ ဝင်ရောက်ကြည့်ရှုခွင့်အတိအကျပေးဖို့ လိုအပ်ပါတယ်။ သင်အရင်က ဝင်ရောက်ကြည့်ရှုခွင့်ပေးခဲ့တဲ့ directory တွေကို ဒီနေရာမှာ သုံးသပ်နိုင်ပါတယ်။'; + + @override + String get settingsStorageAccessEmpty => 'ဝင်ရောက်ကြည့်ရှုခွင့်ပေးထားတာမရှိပါ'; + + @override + String get settingsStorageAccessRevokeTooltip => 'ပြန်ရုပ်သိမ်းမည်'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_nb.dart b/lib/l10ngen/app_localizations_nb.dart new file mode 100644 index 0000000..7ab424d --- /dev/null +++ b/lib/l10ngen/app_localizations_nb.dart @@ -0,0 +1,2373 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Norwegian Bokmål (`nb`). +class AppLocalizationsNb extends AppLocalizations { + AppLocalizationsNb([String locale = 'nb']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Velkommen'; + + @override + String get welcomeOptional => 'Valgfritt'; + + @override + String get welcomeTermsToggle => 'Jeg samtykker til vilkår og betingelser'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementer', + one: '$count element', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count kolonner', + one: '$count kolonne', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString sekunder', + one: '$countString sekund', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutter', + one: '$countString minutt', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString dager', + one: '$countString dag', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'BRUK'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'SLETT'; + + @override + String get nextButtonLabel => 'NESTE'; + + @override + String get showButtonLabel => 'VIS'; + + @override + String get hideButtonLabel => 'SKJUL'; + + @override + String get continueButtonLabel => 'FORTSETT'; + + @override + String get saveCopyButtonLabel => 'Lagre kopi'; + + @override + String get applyTooltip => 'Bruk'; + + @override + String get cancelTooltip => 'Avbryt'; + + @override + String get changeTooltip => 'Endre'; + + @override + String get clearTooltip => 'Tøm'; + + @override + String get previousTooltip => 'Forrige'; + + @override + String get nextTooltip => 'Neste'; + + @override + String get showTooltip => 'Vis'; + + @override + String get hideTooltip => 'Skjul'; + + @override + String get actionRemove => 'Fjern'; + + @override + String get resetTooltip => 'Tilbakestill'; + + @override + String get saveTooltip => 'Lagre'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'Velg'; + + @override + String get doubleBackExitMessage => 'Trykk «Tilbake» igjen for å avslutte.'; + + @override + String get doNotAskAgain => 'Ikke spør igjen'; + + @override + String get sourceStateLoading => 'Laster inn'; + + @override + String get sourceStateCataloguing => 'Katalogisering'; + + @override + String get sourceStateLocatingCountries => 'Lokalisering av land'; + + @override + String get sourceStateLocatingPlaces => 'Lokalisering av steder'; + + @override + String get chipActionDelete => 'Slett'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Vis i samling'; + + @override + String get chipActionGoToAlbumPage => 'Vis i album'; + + @override + String get chipActionGoToCountryPage => 'Vis i land'; + + @override + String get chipActionGoToPlacePage => 'Vis i «Steder»'; + + @override + String get chipActionGoToTagPage => 'Vis i etiketter'; + + @override + String get chipActionGoToExplorerPage => 'Show in Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Ekskluder'; + + @override + String get chipActionFilterIn => 'Inkluder'; + + @override + String get chipActionHide => 'Skjul'; + + @override + String get chipActionLock => 'Lås'; + + @override + String get chipActionPin => 'Fest til toppen'; + + @override + String get chipActionUnpin => 'Løsne fra toppen'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Gi nytt navn'; + + @override + String get chipActionSetCover => 'Sett omslag'; + + @override + String get chipActionShowCountryStates => 'Vis tilstander'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Opprett album'; + + @override + String get chipActionCreateVault => 'Opprett hvelv'; + + @override + String get chipActionConfigureVault => 'Sett opp hvelv'; + + @override + String get entryActionCopyToClipboard => 'Kopier til utklippstavle'; + + @override + String get entryActionDelete => 'Slett'; + + @override + String get entryActionConvert => 'Konverter'; + + @override + String get entryActionExport => 'Eksporter'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Gi nytt navn'; + + @override + String get entryActionRestore => 'Gjenopprett'; + + @override + String get entryActionRotateCCW => 'Roter mot klokken'; + + @override + String get entryActionRotateCW => 'Roter med klokken'; + + @override + String get entryActionFlip => 'Vend vannrett'; + + @override + String get entryActionPrint => 'Skriv ut'; + + @override + String get entryActionShare => 'Del'; + + @override + String get entryActionShareImageOnly => 'Del kun bilde'; + + @override + String get entryActionShareVideoOnly => 'Del kun video'; + + @override + String get entryActionViewSource => 'Vis kilde'; + + @override + String get entryActionShowGeoTiffOnMap => 'Vis som overlagskart'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Konverter til stillbilde'; + + @override + String get entryActionViewMotionPhotoVideo => 'Åpne video'; + + @override + String get entryActionEdit => 'Rediger'; + + @override + String get entryActionOpen => 'Åpne med'; + + @override + String get entryActionSetAs => 'Sett som'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Vis i kartprogram'; + + @override + String get entryActionRotateScreen => 'Roter skjerm'; + + @override + String get entryActionAddFavourite => 'Legg til i favoritter'; + + @override + String get entryActionRemoveFavourite => 'Fjern fra favoritter'; + + @override + String get videoActionCaptureFrame => 'Fang ramme'; + + @override + String get videoActionMute => 'Forstum'; + + @override + String get videoActionUnmute => 'Opphev forstummelse'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Spill'; + + @override + String get videoActionReplay10 => 'Blafre bakover 10 sekunder'; + + @override + String get videoActionSkip10 => 'Blafre forover 10 sekunder'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Velg spor'; + + @override + String get videoActionSetSpeed => 'Avspillingshastighet'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Innstillinger'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Fortsett'; + + @override + String get slideshowActionShowInCollection => 'Vis i samling'; + + @override + String get entryInfoActionEditDate => 'Rediger dato og tid'; + + @override + String get entryInfoActionEditLocation => 'Rediger plassering'; + + @override + String get entryInfoActionEditTitleDescription => 'Rediger navn og beskrivelse'; + + @override + String get entryInfoActionEditRating => 'Rediger vurdering'; + + @override + String get entryInfoActionEditTags => 'Rediger etiketter'; + + @override + String get entryInfoActionRemoveMetadata => 'Fjern metadata'; + + @override + String get entryInfoActionExportMetadata => 'Eksporter metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Fjern posisjon'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Beskjær'; + + @override + String get editorTransformRotate => 'Roter'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'Liggende'; + + @override + String get filterAspectRatioPortraitLabel => 'Stående'; + + @override + String get filterBinLabel => 'Papirkurv'; + + @override + String get filterFavouriteLabel => 'Favorittmerk'; + + @override + String get filterNoDateLabel => 'Udatert'; + + @override + String get filterNoAddressLabel => 'Ingen adresse'; + + @override + String get filterLocatedLabel => 'Posisjonert'; + + @override + String get filterNoLocationLabel => 'Uten posisjon'; + + @override + String get filterNoRatingLabel => 'Uvurdert'; + + @override + String get filterTaggedLabel => 'Etikettmerket'; + + @override + String get filterNoTagLabel => 'Uten etiketter'; + + @override + String get filterNoTitleLabel => 'Uten navn'; + + @override + String get filterOnThisDayLabel => 'På denne dagen'; + + @override + String get filterRecentlyAddedLabel => 'Nylig tillagt'; + + @override + String get filterRatingRejectedLabel => 'Avslått'; + + @override + String get filterTypeAnimatedLabel => 'Animert'; + + @override + String get filterTypeMotionPhotoLabel => 'Bevegelig bilde'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360°-video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Bilde'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Forhindre skjermeffekter'; + + @override + String get accessibilityAnimationsKeep => 'Behold skjermeffekter'; + + @override + String get albumTierNew => 'Ny'; + + @override + String get albumTierPinned => 'Festet'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Ofte åpnet'; + + @override + String get albumTierApps => 'Programmer'; + + @override + String get albumTierVaults => 'Hvelv'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Andre'; + + @override + String get coordinateFormatDms => 'G-M-S'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Desimalgrader'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'Ø'; + + @override + String get coordinateDmsWest => 'V'; + + @override + String get displayRefreshRatePreferHighest => 'Høyeste takt'; + + @override + String get displayRefreshRatePreferLowest => 'Laveste takt'; + + @override + String get keepScreenOnNever => 'Aldri'; + + @override + String get keepScreenOnVideoPlayback => 'Under videoavspilling'; + + @override + String get keepScreenOnViewerOnly => 'Kun visningsside'; + + @override + String get keepScreenOnAlways => 'Alltid'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (terreng)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitært OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (akvarell)'; + + @override + String get maxBrightnessNever => 'Aldri'; + + @override + String get maxBrightnessAlways => 'Alltid'; + + @override + String get nameConflictStrategyRename => 'Gi nytt navn'; + + @override + String get nameConflictStrategyReplace => 'Erstatt'; + + @override + String get nameConflictStrategySkip => 'Hopp over'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Topp'; + + @override + String get subtitlePositionBottom => 'Bunn'; + + @override + String get themeBrightnessLight => 'Lys'; + + @override + String get themeBrightnessDark => 'Mørk'; + + @override + String get themeBrightnessBlack => 'Svart'; + + @override + String get unitSystemMetric => 'Metrisk'; + + @override + String get unitSystemImperial => 'Engelske måleenheter'; + + @override + String get vaultLockTypePattern => 'Mønster'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Passord'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Åpne med annen avspiller'; + + @override + String get videoLoopModeNever => 'Aldri'; + + @override + String get videoLoopModeShortOnly => 'Kun korte videoer'; + + @override + String get videoLoopModeAlways => 'Alltid'; + + @override + String get videoPlaybackSkip => 'Hopp over'; + + @override + String get videoPlaybackMuted => 'Spill forstummet'; + + @override + String get videoPlaybackWithSound => 'Spill med lyd'; + + @override + String get videoResumptionModeNever => 'Aldri'; + + @override + String get videoResumptionModeAlways => 'Alltid'; + + @override + String get viewerTransitionSlide => 'Glidende'; + + @override + String get viewerTransitionParallax => 'Parallakse'; + + @override + String get viewerTransitionFade => 'Ton ut'; + + @override + String get viewerTransitionZoomIn => 'Forstørr'; + + @override + String get viewerTransitionNone => 'Ingen'; + + @override + String get wallpaperTargetHome => 'Hjemmeskjerm'; + + @override + String get wallpaperTargetLock => 'Lås skjerm'; + + @override + String get wallpaperTargetHomeLock => 'Hjem- og låseskjermer'; + + @override + String get widgetDisplayedItemRandom => 'Tilfeldig'; + + @override + String get widgetDisplayedItemMostRecent => 'Nyligst'; + + @override + String get widgetOpenPageHome => 'Åpne startside'; + + @override + String get widgetOpenPageCollection => 'Åpne samling'; + + @override + String get widgetOpenPageViewer => 'Åpne visning'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internlagring'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD-kort'; + + @override + String get rootDirectoryDescription => 'rotmappe'; + + @override + String otherDirectoryDescription(String name) { + return '«$name»-mappen'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Velg $directory for «$volume» i neste skjerm for å gi dette programmet tilgang til det.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Dette kartet kan ikke endre filer i $directory for «$volume».\n\nBruk en pre-installert filbehandler eller et galleriprogram for å flytte elementene til en annen mappe.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Denne operasjonen trenger $neededSize ledig plass på «$volume» for å fullføres, men det er kun $freeSize igjen.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Systemfilvelgeren mangler eller er avskrudd. Skru den på igjen og prøv igjen.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Denne operasjonen støttes ikke for elementer av følgende typer: $types.', + one: 'Denne operasjonen støttes ikke for elementer av følgende type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Noen filer i målmappen har samme navn.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Noen filer har samme navn.'; + + @override + String get addShortcutDialogLabel => 'Snarveisetikett'; + + @override + String get addShortcutButtonLabel => 'LEGG TIL'; + + @override + String get noMatchingAppDialogMessage => 'Ingen programmer kan håndtere dette.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Flytt disse $count elementene til papirkurven?', + one: 'Flytt dette elementet til papirkurven?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Slett disse $count elementene?', + one: 'Slett dette elementet?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Lagre elementdatoer før fortsettelse?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Lagre datoer'; + + @override + String videoResumeDialogMessage(String time) { + return 'Fortsett avspilling fra $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OM IGJEN'; + + @override + String get videoResumeButtonLabel => 'FORTSETT'; + + @override + String get setCoverDialogLatest => 'Nyeste element'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Egendefinert'; + + @override + String get hideFilterConfirmationDialogMessage => 'Samsvarende bilder og videoer vil bli skjult fra samlingen din? Du kan vise dem igjen fra «Personvern»-innstillingene.\n\nEr du sikker på at du vil skjule dem?'; + + @override + String get newAlbumDialogTitle => 'Nytt album'; + + @override + String get newAlbumDialogNameLabel => 'Albumsnavn'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Mappen finnes allerede'; + + @override + String get newAlbumDialogStorageLabel => 'Lagring:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Elementer i hvelv er kun tilgjengelig for dette programmet, og ikke andre.\n\nHvis du avinstallerer dette programmet, eller tømmer denne programdataen vil du miste alle disse elementene.'; + + @override + String get newVaultDialogTitle => 'Nytt hvelv'; + + @override + String get configureVaultDialogTitle => 'Sett opp hvelv'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lås når skjermen skrur seg av'; + + @override + String get vaultDialogLockTypeLabel => 'Låsetype'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Bekreft mønster'; + + @override + String get pinDialogEnter => 'Skriv inn PIN'; + + @override + String get pinDialogConfirm => 'Bekreft PIN'; + + @override + String get passwordDialogEnter => 'Skriv inn passord'; + + @override + String get passwordDialogConfirm => 'Bekreft passord'; + + @override + String get authenticateToConfigureVault => 'Identitetsbekreft for å sette opp hvelv'; + + @override + String get authenticateToUnlockVault => 'Identitetsbekreft for å låse opp hvelv'; + + @override + String get vaultBinUsageDialogMessage => 'Noen hvelv bruker papirkurven.'; + + @override + String get renameAlbumDialogLabel => 'Nytt navn'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Mappen finnes allerede'; + + @override + String get renameEntrySetPageTitle => 'Gi nytt navn'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Navngivningsmønster'; + + @override + String get renameEntrySetPageInsertTooltip => 'Sett inn felt'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Forhåndsvis'; + + @override + String get renameProcessorCounter => 'Teller'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Navn'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Slett dette albumet og de $count elementene i det?', + one: 'Slett dette albumet og elementet i det?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Slett disse albumene og de $count elementene i dem?', + one: 'Slett disse albumene og elementet i demt?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Bredde'; + + @override + String get exportEntryDialogHeight => 'Høyde'; + + @override + String get exportEntryDialogQuality => 'Kvalitet'; + + @override + String get exportEntryDialogWriteMetadata => 'Skriv metadata'; + + @override + String get renameEntryDialogLabel => 'Nytt navn'; + + @override + String get editEntryDialogCopyFromItem => 'Kopier fra annet element'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Felter å endre'; + + @override + String get editEntryDateDialogTitle => 'Dato og tid'; + + @override + String get editEntryDateDialogSetCustom => 'Sett egendefinert dato'; + + @override + String get editEntryDateDialogCopyField => 'Kopier fra annen dato'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Utled fra navn'; + + @override + String get editEntryDateDialogShift => 'Bytt'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Filendringsdato'; + + @override + String get durationDialogHours => 'Timer'; + + @override + String get durationDialogMinutes => 'Minutter'; + + @override + String get durationDialogSeconds => 'Sekunder'; + + @override + String get editEntryLocationDialogTitle => 'Plassering'; + + @override + String get editEntryLocationDialogSetCustom => 'Sett egendefinert plassering'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Velg på kartet'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Breddegrad'; + + @override + String get editEntryLocationDialogLongitude => 'Lengdegrad'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Bruk denne plasseringen'; + + @override + String get editEntryRatingDialogTitle => 'Vurdering'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadatafjerning'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'Mer'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP kreves for å spille videoen inne i et bevegelig bilde.\n\nEr du sikker på at du vil fjerne det?'; + + @override + String get videoSpeedDialogLabel => 'Avspillingshastighet'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Lyd'; + + @override + String get videoStreamSelectionDialogText => 'Undertekster'; + + @override + String get videoStreamSelectionDialogOff => 'Av'; + + @override + String get videoStreamSelectionDialogTrack => 'Spor'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Det er ingen andre spor.'; + + @override + String get genericSuccessFeedback => 'Ferdig'; + + @override + String get genericFailureFeedback => 'Mislykket'; + + @override + String get genericDangerWarningDialogMessage => 'Er du sikker?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Prøv igjen med færre elementer.'; + + @override + String get menuActionConfigureView => 'Vis'; + + @override + String get menuActionSelect => 'Velg'; + + @override + String get menuActionSelectAll => 'Velg alle'; + + @override + String get menuActionSelectNone => 'Fravelg alt'; + + @override + String get menuActionMap => 'Kart'; + + @override + String get menuActionSlideshow => 'Lysbildevisning'; + + @override + String get menuActionStats => 'Statistikk'; + + @override + String get viewDialogSortSectionTitle => 'Sortering'; + + @override + String get viewDialogGroupSectionTitle => 'Gruppe'; + + @override + String get viewDialogLayoutSectionTitle => 'Tilpasning'; + + @override + String get viewDialogReverseSortOrder => 'Omvendt sorteringsrekkefølge'; + + @override + String get tileLayoutMosaic => 'Mosaikk'; + + @override + String get tileLayoutGrid => 'Rutenett'; + + @override + String get tileLayoutList => 'Liste'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Omslag'; + + @override + String get coverDialogTabApp => 'Program'; + + @override + String get coverDialogTabColor => 'Farge'; + + @override + String get appPickDialogTitle => 'Velg program'; + + @override + String get appPickDialogNone => 'Ingen'; + + @override + String get aboutPageTitle => 'Om'; + + @override + String get aboutLinkLicense => 'Lisens'; + + @override + String get aboutLinkPolicy => 'Personvernspraksis'; + + @override + String get aboutBugSectionTitle => 'Feilrapport'; + + @override + String get aboutBugSaveLogInstruction => 'Lagre programlogger til fil'; + + @override + String get aboutBugCopyInfoInstruction => 'Kopier systeminfo'; + + @override + String get aboutBugCopyInfoButton => 'Kopier'; + + @override + String get aboutBugReportInstruction => 'Innrapporter på GitHub med loggføring og systeminfo'; + + @override + String get aboutBugReportButton => 'Rapporter'; + + @override + String get aboutDataUsageSectionTitle => 'Databruk'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Hurtiglager'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Ymse'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Bidragsytere'; + + @override + String get aboutCreditsWorldAtlas1 => 'Dette programmet bruker en TopoJSON-fil fra'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC-lisens.'; + + @override + String get aboutTranslatorsSectionTitle => 'Oversettere'; + + @override + String get aboutLicensesSectionTitle => 'Frie lisenser'; + + @override + String get aboutLicensesBanner => 'Programmet bruker følgende frie pakker og bibliotek.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android-bibliotek'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter-programtillegg'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter-pakker'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart-pakker'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Vis alle lisenser'; + + @override + String get policyPageTitle => 'Personvernspraksis'; + + @override + String get collectionPageTitle => 'Samling'; + + @override + String get collectionPickPageTitle => 'Velg'; + + @override + String get collectionSelectPageTitle => 'Velg elementer'; + + @override + String get collectionActionShowTitleSearch => 'Vis navnefilter'; + + @override + String get collectionActionHideTitleSearch => 'Skjul navnefilter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Legg til snarvei'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Tøm papirkurv'; + + @override + String get collectionActionCopy => 'Kopier til album'; + + @override + String get collectionActionMove => 'Flytt til album'; + + @override + String get collectionActionRescan => 'Skann igjen'; + + @override + String get collectionActionEdit => 'Rediger'; + + @override + String get collectionSearchTitlesHintText => 'Søk etter navn'; + + @override + String get collectionGroupAlbum => 'Etter album'; + + @override + String get collectionGroupMonth => 'Etter måned'; + + @override + String get collectionGroupDay => 'Etter dag'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Ukjent'; + + @override + String get dateToday => 'I dag'; + + @override + String get dateYesterday => 'I går'; + + @override + String get dateThisMonth => 'Denne måneden'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Klarte ikke å fjerne $count elementer', + one: 'Klarte ikke å fjerne 1 element', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Klarte ikke å kopiere $count elementer', + one: 'Klarte ikke å kopiere 1 element', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Klarte ikke å flytte $count elementer', + one: 'Klarte ikke å flytte 1 element', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Klarte ikke å endre navn på $count elementer', + one: 'Klarte ikke å endre navn på 1 element', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Klarte ikke å redigere $count elementer', + one: 'Klarte ikke å redigere 1 element', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Klarte ikke å eksportere $count sider', + one: 'Klarte ikke å eksportere 1 side', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kopierte $count elementer', + one: 'Kopierte 1 element', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Flyttet $count elementer', + one: 'Flyttet 1 element', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Endret navn på $count elementer', + one: 'Endret navn på 1 element', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Redigerte $count elementer', + one: 'Redigerte 1 element', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Ingen favoritter'; + + @override + String get collectionEmptyVideos => 'Ingen videoer'; + + @override + String get collectionEmptyImages => 'Ingen bilder'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Innvilg tilgang'; + + @override + String get collectionSelectSectionTooltip => 'Velg utvalg'; + + @override + String get collectionDeselectSectionTooltip => 'Fravelg utvalg'; + + @override + String get drawerAboutButton => 'Om'; + + @override + String get drawerSettingsButton => 'Innstillinger'; + + @override + String get drawerCollectionAll => 'Alle samlinger'; + + @override + String get drawerCollectionFavourites => 'Favoritter'; + + @override + String get drawerCollectionImages => 'Bilder'; + + @override + String get drawerCollectionVideos => 'Videoer'; + + @override + String get drawerCollectionAnimated => 'Animert'; + + @override + String get drawerCollectionMotionPhotos => 'Bevegelige bilder'; + + @override + String get drawerCollectionPanoramas => 'Panoramaer'; + + @override + String get drawerCollectionRaws => 'Raw bilder'; + + @override + String get drawerCollectionSphericalVideos => '360°-videoer'; + + @override + String get drawerAlbumPage => 'Album'; + + @override + String get drawerCountryPage => 'Land'; + + @override + String get drawerPlacePage => 'Steder'; + + @override + String get drawerTagPage => 'Etiketter'; + + @override + String get sortByDate => 'Etter dato'; + + @override + String get sortByName => 'Etter navn'; + + @override + String get sortByItemCount => 'Etter antall elementer'; + + @override + String get sortBySize => 'Etter størrelse'; + + @override + String get sortByAlbumFileName => 'Etter album og filnavn'; + + @override + String get sortByRating => 'Etter vurdering'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Nyeste først'; + + @override + String get sortOrderOldestFirst => 'Eldste først'; + + @override + String get sortOrderAtoZ => 'A-Å'; + + @override + String get sortOrderZtoA => 'Å-A'; + + @override + String get sortOrderHighestFirst => 'Høyeste først'; + + @override + String get sortOrderLowestFirst => 'Laveste først'; + + @override + String get sortOrderLargestFirst => 'Største først'; + + @override + String get sortOrderSmallestFirst => 'Minste først'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'Etter nivå'; + + @override + String get albumGroupType => 'Etter type'; + + @override + String get albumGroupVolume => 'Etter lagringsdataområde'; + + @override + String get albumMimeTypeMixed => 'Blandet'; + + @override + String get albumPickPageTitleCopy => 'Kopier til album'; + + @override + String get albumPickPageTitleExport => 'Eksporter til album'; + + @override + String get albumPickPageTitleMove => 'Flytt til album'; + + @override + String get albumPickPageTitlePick => 'Velg album'; + + @override + String get albumCamera => 'Kamera'; + + @override + String get albumDownload => 'Last ned'; + + @override + String get albumScreenshots => 'Skjermavbildninger'; + + @override + String get albumScreenRecordings => 'Skjermopptak'; + + @override + String get albumVideoCaptures => 'Videoopptak'; + + @override + String get albumPageTitle => 'Album'; + + @override + String get albumEmpty => 'Ingen album'; + + @override + String get createAlbumButtonLabel => 'OPPRETT'; + + @override + String get newFilterBanner => 'ny'; + + @override + String get countryPageTitle => 'Land'; + + @override + String get countryEmpty => 'Ingen land'; + + @override + String get statePageTitle => 'Tilstander'; + + @override + String get stateEmpty => 'Ingen tilstander'; + + @override + String get placePageTitle => 'Steder'; + + @override + String get placeEmpty => 'Ingen steder'; + + @override + String get tagPageTitle => 'Etiketter'; + + @override + String get tagEmpty => 'Ingen etiketter'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Papirkurv'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Søk i samling'; + + @override + String get searchRecentSectionTitle => 'Nylige'; + + @override + String get searchDateSectionTitle => 'Dato'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Album'; + + @override + String get searchCountriesSectionTitle => 'Land'; + + @override + String get searchStatesSectionTitle => 'Tilstander'; + + @override + String get searchPlacesSectionTitle => 'Steder'; + + @override + String get searchTagsSectionTitle => 'Etiketter'; + + @override + String get searchRatingSectionTitle => 'Vurderinger'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Innstillinger'; + + @override + String get settingsSystemDefault => 'Systemforvalg'; + + @override + String get settingsDefault => 'Forvalg'; + + @override + String get settingsDisabled => 'Avskrudd'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Spør hver gang'; + + @override + String get settingsModificationWarningDialogMessage => 'Andre innstillinger vil bli endret.'; + + @override + String get settingsSearchFieldLabel => 'Søkeinnstillinger'; + + @override + String get settingsSearchEmpty => 'Ingen samsvarende innstilling'; + + @override + String get settingsActionExport => 'Eksporter'; + + @override + String get settingsActionExportDialogTitle => 'Eksporter'; + + @override + String get settingsActionImport => 'Importer'; + + @override + String get settingsActionImportDialogTitle => 'Importer'; + + @override + String get appExportCovers => 'Omslag'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favoritter'; + + @override + String get appExportSettings => 'Innstillinger'; + + @override + String get settingsNavigationSectionTitle => 'Navigasjon'; + + @override + String get settingsHomeTile => 'Hjem'; + + @override + String get settingsHomeDialogTitle => 'Hjem'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Behold skjermen påslått'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Behold skjermen påslått'; + + @override + String get settingsDoubleBackExit => 'Trykk «Tilbake» to ganger for å avslutte'; + + @override + String get settingsConfirmationTile => 'Bekreftelsesdialoger'; + + @override + String get settingsConfirmationDialogTitle => 'Bekreftelsesdialoger'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Spør før permanent sletting av elementer'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Spør før flytting av elementer til papirkurven'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Spør før flytting av ikke-daterte elementer'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Vis melding etter flytting av elementer til papirkurven'; + + @override + String get settingsConfirmationVaultDataLoss => 'Vis advarsel om hvelv-datatap'; + + @override + String get settingsNavigationDrawerTile => 'Navigasjonsmeny'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigasjonsmeny'; + + @override + String get settingsNavigationDrawerBanner => 'Trykk og hold for å flytte og endre rekkefølge på menyelementer.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Typer'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Album'; + + @override + String get settingsNavigationDrawerTabPages => 'Sider'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Legg til album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniatyrbilder'; + + @override + String get settingsThumbnailOverlayTile => 'Overlag'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlag'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Vis favoritt-ikon'; + + @override + String get settingsThumbnailShowTagIcon => 'Vis etikett-ikon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Vis plasserings-ikon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Vis bevegelig bilde -ikon'; + + @override + String get settingsThumbnailShowRating => 'Vis vurdering'; + + @override + String get settingsThumbnailShowRawIcon => 'Vis raw-ikon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Vis videovarighet'; + + @override + String get settingsCollectionQuickActionsTile => 'Hurtighandlinger'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Hurtighandlinger'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Utforskning'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Utvelgelse'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Trykk og hold for å flytte knapper og velge hvilke handlinger som skal vises ved utforskning av elementer.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Trykk og hold for å flytte knapper og velge hvilke handlinger som vises når du velger elementer.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viser'; + + @override + String get settingsViewerGestureSideTapNext => 'Trykk på skjermkantene for å vise forrige/neste element'; + + @override + String get settingsViewerUseCutout => 'Bruk utklippsområde'; + + @override + String get settingsViewerMaximumBrightness => 'Maksimal lysstyrke'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto-spill bevegelige bilder'; + + @override + String get settingsImageBackground => 'Bildebakgrunn'; + + @override + String get settingsViewerQuickActionsTile => 'Hurtighandlinger'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Hurtighandlinger'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Trykk og hold for å flytte knapper og velg hvilke handlinger som vises i viseren.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Viste knapper'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Tilgjengelige knapper'; + + @override + String get settingsViewerQuickActionEmpty => 'Ingen knapper'; + + @override + String get settingsViewerOverlayTile => 'Overlag'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlag'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Vis ved åpning'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Vis minikart'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Vis info'; + + @override + String get settingsViewerShowInformationSubtitle => 'Vis navn, dato, posisjon, osv.'; + + @override + String get settingsViewerShowRatingTags => 'Vis vurdering og etiketter'; + + @override + String get settingsViewerShowShootingDetails => 'Vis knipsingsdetaljer'; + + @override + String get settingsViewerShowDescription => 'Vis beskrivelse'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Vis miniatyrbilder'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Tilsløringseffekt'; + + @override + String get settingsViewerSlideshowTile => 'Lysbildevisning'; + + @override + String get settingsViewerSlideshowPageTitle => 'Lysbildevisning'; + + @override + String get settingsSlideshowRepeat => 'Gjenta'; + + @override + String get settingsSlideshowShuffle => 'Stokk'; + + @override + String get settingsSlideshowFillScreen => 'Fyll skjermen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animert forstørrelseseffekt'; + + @override + String get settingsSlideshowTransitionTile => 'Overgang'; + + @override + String get settingsSlideshowIntervalTile => 'Intervall'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Videoavspilling'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Videoavspilling'; + + @override + String get settingsVideoPageTitle => 'Videoinnstillinger'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Vis videoer'; + + @override + String get settingsVideoPlaybackTile => 'Avspilling'; + + @override + String get settingsVideoPlaybackPageTitle => 'Avspilling'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Maskinvareakselerasjon'; + + @override + String get settingsVideoAutoPlay => 'Automatisk avspilling'; + + @override + String get settingsVideoLoopModeTile => 'Gjentagelsesmodus'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Gjentagelsesmodus'; + + @override + String get settingsVideoResumptionModeTile => 'Gjenoppta avspilling'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Gjenoppta avspilling'; + + @override + String get settingsVideoBackgroundMode => 'Bakgrunnsmodus'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Bakgrunnsmodus'; + + @override + String get settingsVideoControlsTile => 'Kontroller'; + + @override + String get settingsVideoControlsPageTitle => 'Kontroller'; + + @override + String get settingsVideoButtonsTile => 'Knapper'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Dobbelttrykk for å spille/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Dobbelttrykk på skjermkantene for å blafre forover/bakover'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Dra opp eller ned for å justere lys-/lydstyrke'; + + @override + String get settingsSubtitleThemeTile => 'Undertekster'; + + @override + String get settingsSubtitleThemePageTitle => 'Undertekster'; + + @override + String get settingsSubtitleThemeSample => 'Dette er et eksempel.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Tekstjustering'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Tekstjustering'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Tekstposisjon'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Tekstposisjon'; + + @override + String get settingsSubtitleThemeTextSize => 'Tekststørrelse'; + + @override + String get settingsSubtitleThemeShowOutline => 'Vis omriss og skygge'; + + @override + String get settingsSubtitleThemeTextColor => 'Tekstfarge'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Tekst-dekkevne'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Bakgrunnsfarge'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Bakgrunnsdekkevne'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Venstre'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Midten'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Høyre'; + + @override + String get settingsPrivacySectionTitle => 'Personvern'; + + @override + String get settingsAllowInstalledAppAccess => 'Tillat tilgang til programliste'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Brukt til forbedring av albumsvisning'; + + @override + String get settingsAllowErrorReporting => 'Tillat anonym feilrapportering'; + + @override + String get settingsSaveSearchHistory => 'Lagre søkehistorikk'; + + @override + String get settingsEnableBin => 'Bruk papirkurv'; + + @override + String get settingsEnableBinSubtitle => 'Behold slettede elementer i 30 dager'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Elementer i papirkurven vil bli slettet for godt.'; + + @override + String get settingsAllowMediaManagement => 'Tillat mediahåndtering'; + + @override + String get settingsHiddenItemsTile => 'Skjulte elementer'; + + @override + String get settingsHiddenItemsPageTitle => 'Skjulte elementer'; + + @override + String get settingsHiddenFiltersBanner => 'Bilder og videoer som samsvarer med skjulte filtre vil ikke vises i samlingen din.'; + + @override + String get settingsHiddenFiltersEmpty => 'Ingen skjulte filtre'; + + @override + String get settingsStorageAccessTile => 'Lagringstilgang'; + + @override + String get settingsStorageAccessPageTitle => 'Lagringstilgang'; + + @override + String get settingsStorageAccessBanner => 'Noen mapper krever eksplisitt tilgang til å endre filene i dem. Du kan gjennomse hvilke mapper du har gitt tilgang til tidligere her.'; + + @override + String get settingsStorageAccessEmpty => 'Ingen tilgangsinnvilgelser'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Tilbakekall'; + + @override + String get settingsAccessibilitySectionTitle => 'Tilgjengelighet'; + + @override + String get settingsRemoveAnimationsTile => 'Fjern animasjoner'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Fjern animasjoner'; + + @override + String get settingsTimeToTakeActionTile => 'Tid for handling'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Vis multi-trykkhåndvendingsalternativer'; + + @override + String get settingsDisplaySectionTitle => 'Visning'; + + @override + String get settingsThemeBrightnessTile => 'Drakt'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Drakt'; + + @override + String get settingsThemeColorHighlights => 'Fargede framhevelser'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamisk farge'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Visningsoppfiskningstakt'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Oppfriskningstakt'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV-grensesnitt'; + + @override + String get settingsLanguageSectionTitle => 'Språk og formater'; + + @override + String get settingsLanguageTile => 'Språk'; + + @override + String get settingsLanguagePageTitle => 'Språk'; + + @override + String get settingsCoordinateFormatTile => 'Koordinatformat'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Koordinatformat'; + + @override + String get settingsUnitSystemTile => 'Enheter'; + + @override + String get settingsUnitSystemDialogTitle => 'Enheter'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Skjermsparer'; + + @override + String get settingsWidgetPageTitle => 'Bilderamme'; + + @override + String get settingsWidgetShowOutline => 'Omriss'; + + @override + String get settingsWidgetOpenPage => 'Når miniprogrammet trykkes'; + + @override + String get settingsWidgetDisplayedItem => 'Vist element'; + + @override + String get settingsCollectionTile => 'Samling'; + + @override + String get statsPageTitle => 'Statistikk'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementer med plassering', + one: '1 element med plassering', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Toppland'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Toppsteder'; + + @override + String get statsTopTagsSectionTitle => 'Topp-etiketter'; + + @override + String get statsTopAlbumsSectionTitle => 'Topp-album'; + + @override + String get viewerOpenPanoramaButtonLabel => 'ÅPNE PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SETT SOM BAKGRUNNSBILDE'; + + @override + String get viewerErrorUnknown => 'Oida.'; + + @override + String get viewerErrorDoesNotExist => 'Filen finnes ikke lenger.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Tilbake til visning'; + + @override + String get viewerInfoUnknown => 'ukjent'; + + @override + String get viewerInfoLabelDescription => 'Beskrivelse'; + + @override + String get viewerInfoLabelTitle => 'Navn'; + + @override + String get viewerInfoLabelDate => 'Dato'; + + @override + String get viewerInfoLabelResolution => 'Oppløsning'; + + @override + String get viewerInfoLabelSize => 'Størrelse'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Sti'; + + @override + String get viewerInfoLabelDuration => 'Varighet'; + + @override + String get viewerInfoLabelOwner => 'Eier'; + + @override + String get viewerInfoLabelCoordinates => 'Koordinater'; + + @override + String get viewerInfoLabelAddress => 'Adresse'; + + @override + String get mapStyleDialogTitle => 'Kartstil'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Velg kartstil'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Forstørr'; + + @override + String get mapZoomOutTooltip => 'Forminsk'; + + @override + String get mapPointNorthUpTooltip => 'Nord oppover'; + + @override + String get mapAttributionOsmData => 'Kartdata © [OpenStreetMap](https://www.openstreetmap.org/copyright)-bidragsyterne'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Flis av [HOT](https://www.hotosm.org) • Vertstjent av [OSM France](https://openstreetmap.fr)'; + + @override + String get mapAttributionStamen => 'Flis av [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Vis på kartsiden'; + + @override + String get mapEmptyRegion => 'Ingen bilder i denne regionen'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Klarte ikke å pakke ut innebygd data'; + + @override + String get viewerInfoOpenLinkText => 'Åpne'; + + @override + String get viewerInfoViewXmlLinkText => 'Vis XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Søk metadata'; + + @override + String get viewerInfoSearchEmpty => 'Ingen samsvarende nøkler'; + + @override + String get viewerInfoSearchSuggestionDate => 'Dato og tid'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Beskrivelse'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensjoner'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Oppløsning'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rettigheter'; + + @override + String get wallpaperUseScrollEffect => 'Bruk rulleeffekt på hjemmeskjerm'; + + @override + String get tagEditorPageTitle => 'Rediger etiketter'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Ny etikett'; + + @override + String get tagEditorPageAddTagTooltip => 'Legg til etikett'; + + @override + String get tagEditorSectionRecent => 'Nylig'; + + @override + String get tagEditorSectionPlaceholders => 'Plassholdere'; + + @override + String get tagEditorDiscardDialogMessage => 'Forkast endringer?'; + + @override + String get tagPlaceholderCountry => 'Land'; + + @override + String get tagPlaceholderState => 'Tilstand'; + + @override + String get tagPlaceholderPlace => 'Sted'; + + @override + String get panoramaEnableSensorControl => 'Skru på sensorstyring'; + + @override + String get panoramaDisableSensorControl => 'Skru av sensorstyring'; + + @override + String get sourceViewerPageTitle => 'Kilde'; +} diff --git a/lib/l10ngen/app_localizations_ne.dart b/lib/l10ngen/app_localizations_ne.dart new file mode 100644 index 0000000..7b58a8f --- /dev/null +++ b/lib/l10ngen/app_localizations_ne.dart @@ -0,0 +1,2424 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Nepali (`ne`). +class AppLocalizationsNe extends AppLocalizations { + AppLocalizationsNe([String locale = 'ne']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Welcome to Aves'; + + @override + String get welcomeOptional => 'Optional'; + + @override + String get welcomeTermsToggle => 'I agree to the terms and conditions'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items', + one: '$countString item', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString columns', + one: '$countString column', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString seconds', + one: '$countString second', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutes', + one: '$countString minute', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString days', + one: '$countString day', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APPLY'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'DELETE'; + + @override + String get nextButtonLabel => 'NEXT'; + + @override + String get showButtonLabel => 'SHOW'; + + @override + String get hideButtonLabel => 'HIDE'; + + @override + String get continueButtonLabel => 'CONTINUE'; + + @override + String get saveCopyButtonLabel => 'SAVE COPY'; + + @override + String get applyTooltip => 'Apply'; + + @override + String get cancelTooltip => 'Cancel'; + + @override + String get changeTooltip => 'Change'; + + @override + String get clearTooltip => 'Clear'; + + @override + String get previousTooltip => 'Previous'; + + @override + String get nextTooltip => 'Next'; + + @override + String get showTooltip => 'Show'; + + @override + String get hideTooltip => 'Hide'; + + @override + String get actionRemove => 'Remove'; + + @override + String get resetTooltip => 'Reset'; + + @override + String get saveTooltip => 'Save'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'Pick'; + + @override + String get doubleBackExitMessage => 'Tap “back” again to exit.'; + + @override + String get doNotAskAgain => 'Do not ask again'; + + @override + String get sourceStateLoading => 'Loading'; + + @override + String get sourceStateCataloguing => 'Cataloguing'; + + @override + String get sourceStateLocatingCountries => 'Locating countries'; + + @override + String get sourceStateLocatingPlaces => 'Locating places'; + + @override + String get chipActionDelete => 'Delete'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Show in Collection'; + + @override + String get chipActionGoToAlbumPage => 'Show in Albums'; + + @override + String get chipActionGoToCountryPage => 'Show in Countries'; + + @override + String get chipActionGoToPlacePage => 'Show in Places'; + + @override + String get chipActionGoToTagPage => 'Show in Tags'; + + @override + String get chipActionGoToExplorerPage => 'Show in Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Filter out'; + + @override + String get chipActionFilterIn => 'Filter in'; + + @override + String get chipActionHide => 'Hide'; + + @override + String get chipActionLock => 'Lock'; + + @override + String get chipActionPin => 'Pin to top'; + + @override + String get chipActionUnpin => 'Unpin from top'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Rename'; + + @override + String get chipActionSetCover => 'Set cover'; + + @override + String get chipActionShowCountryStates => 'Show states'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Create album'; + + @override + String get chipActionCreateVault => 'Create vault'; + + @override + String get chipActionConfigureVault => 'Configure vault'; + + @override + String get entryActionCopyToClipboard => 'Copy to clipboard'; + + @override + String get entryActionDelete => 'Delete'; + + @override + String get entryActionConvert => 'Convert'; + + @override + String get entryActionExport => 'Export'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Rename'; + + @override + String get entryActionRestore => 'Restore'; + + @override + String get entryActionRotateCCW => 'Rotate counterclockwise'; + + @override + String get entryActionRotateCW => 'Rotate clockwise'; + + @override + String get entryActionFlip => 'Flip horizontally'; + + @override + String get entryActionPrint => 'Print'; + + @override + String get entryActionShare => 'Share'; + + @override + String get entryActionShareImageOnly => 'Share image only'; + + @override + String get entryActionShareVideoOnly => 'Share video only'; + + @override + String get entryActionViewSource => 'View source'; + + @override + String get entryActionShowGeoTiffOnMap => 'Show as map overlay'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convert to still image'; + + @override + String get entryActionViewMotionPhotoVideo => 'Open video'; + + @override + String get entryActionEdit => 'Edit'; + + @override + String get entryActionOpen => 'Open with'; + + @override + String get entryActionSetAs => 'Set as'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Show in map app'; + + @override + String get entryActionRotateScreen => 'Rotate screen'; + + @override + String get entryActionAddFavourite => 'Add to favorites'; + + @override + String get entryActionRemoveFavourite => 'Remove from favorites'; + + @override + String get videoActionCaptureFrame => 'Capture frame'; + + @override + String get videoActionMute => 'Mute'; + + @override + String get videoActionUnmute => 'Unmute'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Play'; + + @override + String get videoActionReplay10 => 'Seek backward 10 seconds'; + + @override + String get videoActionSkip10 => 'Seek forward 10 seconds'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Select tracks'; + + @override + String get videoActionSetSpeed => 'Playback speed'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Settings'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Resume'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'Edit date & time'; + + @override + String get entryInfoActionEditLocation => 'Edit location'; + + @override + String get entryInfoActionEditTitleDescription => 'Edit title & description'; + + @override + String get entryInfoActionEditRating => 'Edit rating'; + + @override + String get entryInfoActionEditTags => 'Edit tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Remove metadata'; + + @override + String get entryInfoActionExportMetadata => 'Export metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Remove location'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Crop'; + + @override + String get editorTransformRotate => 'Rotate'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landscape'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Recycle bin'; + + @override + String get filterFavouriteLabel => 'Favorite'; + + @override + String get filterNoDateLabel => 'Undated'; + + @override + String get filterNoAddressLabel => 'No address'; + + @override + String get filterLocatedLabel => 'Located'; + + @override + String get filterNoLocationLabel => 'Unlocated'; + + @override + String get filterNoRatingLabel => 'Unrated'; + + @override + String get filterTaggedLabel => 'Tagged'; + + @override + String get filterNoTagLabel => 'Untagged'; + + @override + String get filterNoTitleLabel => 'Untitled'; + + @override + String get filterOnThisDayLabel => 'On this day'; + + @override + String get filterRecentlyAddedLabel => 'Recently added'; + + @override + String get filterRatingRejectedLabel => 'Rejected'; + + @override + String get filterTypeAnimatedLabel => 'Animated'; + + @override + String get filterTypeMotionPhotoLabel => 'Motion Photo'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Image'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'New'; + + @override + String get albumTierPinned => 'Pinned'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Common'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Others'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimal degrees'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Highest rate'; + + @override + String get displayRefreshRatePreferLowest => 'Lowest rate'; + + @override + String get keepScreenOnNever => 'Never'; + + @override + String get keepScreenOnVideoPlayback => 'During video playback'; + + @override + String get keepScreenOnViewerOnly => 'Viewer page only'; + + @override + String get keepScreenOnAlways => 'Always'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Never'; + + @override + String get maxBrightnessAlways => 'Always'; + + @override + String get nameConflictStrategyRename => 'Rename'; + + @override + String get nameConflictStrategyReplace => 'Replace'; + + @override + String get nameConflictStrategySkip => 'Skip'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Top'; + + @override + String get subtitlePositionBottom => 'Bottom'; + + @override + String get themeBrightnessLight => 'Light'; + + @override + String get themeBrightnessDark => 'Dark'; + + @override + String get themeBrightnessBlack => 'Black'; + + @override + String get unitSystemMetric => 'Metric'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Password'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Open with other player'; + + @override + String get videoLoopModeNever => 'Never'; + + @override + String get videoLoopModeShortOnly => 'Short videos only'; + + @override + String get videoLoopModeAlways => 'Always'; + + @override + String get videoPlaybackSkip => 'Skip'; + + @override + String get videoPlaybackMuted => 'Play muted'; + + @override + String get videoPlaybackWithSound => 'Play with sound'; + + @override + String get videoResumptionModeNever => 'Never'; + + @override + String get videoResumptionModeAlways => 'Always'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'None'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'Random'; + + @override + String get widgetDisplayedItemMostRecent => 'Most recent'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internal storage'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Some files have the same name.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'ADD'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Save dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OVER'; + + @override + String get videoResumeButtonLabel => 'RESUME'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Custom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'New Album'; + + @override + String get newAlbumDialogNameLabel => 'Album name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'Storage:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'New name'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'Rename'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insert field'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Preview'; + + @override + String get renameProcessorCounter => 'Counter'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Name'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete this album and the $countString items in it?', + one: 'Delete this album and the item in it?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these albums and the $countString items in them?', + one: 'Delete these albums and the item in them?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Width'; + + @override + String get exportEntryDialogHeight => 'Height'; + + @override + String get exportEntryDialogQuality => 'Quality'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'New name'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'Date & Time'; + + @override + String get editEntryDateDialogSetCustom => 'Set custom date'; + + @override + String get editEntryDateDialogCopyField => 'Copy from other date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'File modified date'; + + @override + String get durationDialogHours => 'Hours'; + + @override + String get durationDialogMinutes => 'Minutes'; + + @override + String get durationDialogSeconds => 'Seconds'; + + @override + String get editEntryLocationDialogTitle => 'Location'; + + @override + String get editEntryLocationDialogSetCustom => 'Set custom location'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Choose on map'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Use this location'; + + @override + String get editEntryRatingDialogTitle => 'Rating'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'More'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'Playback speed'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtitles'; + + @override + String get videoStreamSelectionDialogOff => 'Off'; + + @override + String get videoStreamSelectionDialogTrack => 'Track'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'Done!'; + + @override + String get genericFailureFeedback => 'Failed'; + + @override + String get genericDangerWarningDialogMessage => 'Are you sure?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'View'; + + @override + String get menuActionSelect => 'Select'; + + @override + String get menuActionSelectAll => 'Select all'; + + @override + String get menuActionSelectNone => 'Select none'; + + @override + String get menuActionMap => 'Map'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'Stats'; + + @override + String get viewDialogSortSectionTitle => 'Sort'; + + @override + String get viewDialogGroupSectionTitle => 'Sections'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'Grid'; + + @override + String get tileLayoutList => 'List'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Color'; + + @override + String get appPickDialogTitle => 'Pick App'; + + @override + String get appPickDialogNone => 'None'; + + @override + String get aboutPageTitle => 'About'; + + @override + String get aboutLinkLicense => 'License'; + + @override + String get aboutLinkPolicy => 'Privacy Policy'; + + @override + String get aboutBugSectionTitle => 'Bug Report'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copy system information'; + + @override + String get aboutBugCopyInfoButton => 'Copy'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'Report'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Credits'; + + @override + String get aboutCreditsWorldAtlas1 => 'This app uses a TopoJSON file from'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'Translators'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenses'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Show All Licenses'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'Pick'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'Edit'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Unknown'; + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'About'; + + @override + String get drawerSettingsButton => 'Settings'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Countries'; + + @override + String get drawerPlacePage => 'Places'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'By date'; + + @override + String get sortByName => 'By name'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'By size'; + + @override + String get sortByAlbumFileName => 'By album & item title'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A to Z'; + + @override + String get sortOrderZtoA => 'Z to A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumMimeTypeMixed => 'Mixed'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'Camera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'CREATE'; + + @override + String get newFilterBanner => 'new'; + + @override + String get countryPageTitle => 'Countries'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'States'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Places'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Date'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Countries'; + + @override + String get searchStatesSectionTitle => 'States'; + + @override + String get searchPlacesSectionTitle => 'Places'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Ratings'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Settings'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'Disabled'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'Settings'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Home'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_nl.dart b/lib/l10ngen/app_localizations_nl.dart new file mode 100644 index 0000000..e36c77e --- /dev/null +++ b/lib/l10ngen/app_localizations_nl.dart @@ -0,0 +1,2423 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Dutch Flemish (`nl`). +class AppLocalizationsNl extends AppLocalizations { + AppLocalizationsNl([String locale = 'nl']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Welkom bij Aves'; + + @override + String get welcomeOptional => 'Optioneel'; + + @override + String get welcomeTermsToggle => 'Ik ga akkoord met de voorwaarden'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items', + one: '$countString item', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString kolommen', + one: '$countString kolom', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString seconden', + one: '$countString seconde', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minuten', + one: '$countString minuut', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString dagen', + one: '$countString dag', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'TOEPASSEN'; + + @override + String get createButtonLabel => 'AANMAKEN'; + + @override + String get deleteButtonLabel => 'VERWIJDEREN'; + + @override + String get nextButtonLabel => 'VOLGENDE'; + + @override + String get showButtonLabel => 'TONEN'; + + @override + String get hideButtonLabel => 'VERBERGEN'; + + @override + String get continueButtonLabel => 'VERDER'; + + @override + String get saveCopyButtonLabel => 'KOPIE OPSLAAN'; + + @override + String get applyTooltip => 'Toepassen'; + + @override + String get cancelTooltip => 'Annuleren'; + + @override + String get changeTooltip => 'Aanpassen'; + + @override + String get clearTooltip => 'Leegmaken'; + + @override + String get previousTooltip => 'Vorige'; + + @override + String get nextTooltip => 'Volgende'; + + @override + String get showTooltip => 'Tonen'; + + @override + String get hideTooltip => 'Verbergen'; + + @override + String get actionRemove => 'Verwijderen'; + + @override + String get resetTooltip => 'Resetten'; + + @override + String get saveTooltip => 'Opslaan'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'Kies'; + + @override + String get doubleBackExitMessage => 'Tik nogmaals “Terug” om te sluiten.'; + + @override + String get doNotAskAgain => 'Niet opnieuw vragen'; + + @override + String get sourceStateLoading => 'Laden'; + + @override + String get sourceStateCataloguing => 'Catalogiseren'; + + @override + String get sourceStateLocatingCountries => 'Landen lokaliseren'; + + @override + String get sourceStateLocatingPlaces => 'Plaatsen lokaliseren'; + + @override + String get chipActionDelete => 'Verwijderen'; + + @override + String get chipActionRemove => 'Verwijderen'; + + @override + String get chipActionShowCollection => 'In Collectie tonen'; + + @override + String get chipActionGoToAlbumPage => 'In Albums tonen'; + + @override + String get chipActionGoToCountryPage => 'In Landen tonen'; + + @override + String get chipActionGoToPlacePage => 'In Plaatsen tonen'; + + @override + String get chipActionGoToTagPage => 'In Labels tonen'; + + @override + String get chipActionGoToExplorerPage => 'In Bestanden tonen'; + + @override + String get chipActionDecompose => 'Splitsen'; + + @override + String get chipActionFilterOut => 'Uitfilteren'; + + @override + String get chipActionFilterIn => 'Infilteren'; + + @override + String get chipActionHide => 'Verbergen'; + + @override + String get chipActionLock => 'Vergrendel'; + + @override + String get chipActionPin => 'Bovenaan pinnen'; + + @override + String get chipActionUnpin => 'Unpinnen'; + + @override + String get chipActionGroup => 'Groepering wijzigen'; + + @override + String get chipActionRename => 'Hernoemen'; + + @override + String get chipActionSetCover => 'Album achtergrond instellen'; + + @override + String get chipActionShowCountryStates => 'Staten tonen'; + + @override + String get chipActionCreateGroup => 'Groep aanmaken'; + + @override + String get chipActionCreateAlbum => 'Album aanmaken'; + + @override + String get chipActionCreateVault => 'Kluis aanmaken'; + + @override + String get chipActionConfigureVault => 'Kluis configureren'; + + @override + String get entryActionCopyToClipboard => 'Kopiëren naar Clipboard'; + + @override + String get entryActionDelete => 'Verwijderen'; + + @override + String get entryActionConvert => 'Converteren'; + + @override + String get entryActionExport => 'Exporteren'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Hernoemen'; + + @override + String get entryActionRestore => 'Herstellen'; + + @override + String get entryActionRotateCCW => 'Linksom roteren'; + + @override + String get entryActionRotateCW => 'Rechtsom roteren'; + + @override + String get entryActionFlip => 'Horizontaal omdraaien'; + + @override + String get entryActionPrint => 'Printen'; + + @override + String get entryActionShare => 'Delen'; + + @override + String get entryActionShareImageOnly => 'Enkel afbeelding delen'; + + @override + String get entryActionShareVideoOnly => 'Enkel video delen'; + + @override + String get entryActionViewSource => 'Bron bekijken'; + + @override + String get entryActionShowGeoTiffOnMap => 'Als kaart-overlay tonen'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Converteren naar stilstaand beeld'; + + @override + String get entryActionViewMotionPhotoVideo => 'Video openen'; + + @override + String get entryActionEdit => 'Bewerken'; + + @override + String get entryActionOpen => 'Openen als'; + + @override + String get entryActionSetAs => 'Instellen als'; + + @override + String get entryActionCast => 'Casten'; + + @override + String get entryActionOpenMap => 'In Kaarten-app tonen'; + + @override + String get entryActionRotateScreen => 'Scherm roteren'; + + @override + String get entryActionAddFavourite => 'Toevoegen aan favorieten'; + + @override + String get entryActionRemoveFavourite => 'Verwijderen uit favorieten'; + + @override + String get videoActionCaptureFrame => 'Frame opnemen'; + + @override + String get videoActionMute => 'Dempen'; + + @override + String get videoActionUnmute => 'Dempen opheffen'; + + @override + String get videoActionPause => 'Pauzeren'; + + @override + String get videoActionPlay => 'Afspelen'; + + @override + String get videoActionReplay10 => '10 seconden terug'; + + @override + String get videoActionSkip10 => '10 seconden vooruit'; + + @override + String get videoActionShowPreviousFrame => 'Vorig frame weergeven'; + + @override + String get videoActionShowNextFrame => 'Volgend frame weergeven'; + + @override + String get videoActionSelectStreams => 'Sporen selecteren'; + + @override + String get videoActionSetSpeed => 'Afspeelsnelheid'; + + @override + String get videoActionABRepeat => 'A-B herhalen'; + + @override + String get videoRepeatActionSetStart => 'Start instellen'; + + @override + String get videoRepeatActionSetEnd => 'Einde instellen'; + + @override + String get viewerActionSettings => 'Instellingen'; + + @override + String get viewerActionLock => 'Weergave vergrendelen'; + + @override + String get viewerActionUnlock => 'Weergave ontgrendelen'; + + @override + String get slideshowActionResume => 'Hervatten'; + + @override + String get slideshowActionShowInCollection => 'In Collectie tonen'; + + @override + String get entryInfoActionEditDate => 'Datum & tijd bewerken'; + + @override + String get entryInfoActionEditLocation => 'Locatie bewerken'; + + @override + String get entryInfoActionEditTitleDescription => 'Titel & beschrijving bewerken'; + + @override + String get entryInfoActionEditRating => 'Waardering bewerken'; + + @override + String get entryInfoActionEditTags => 'Labels bewerken'; + + @override + String get entryInfoActionRemoveMetadata => 'Verwijder metadata'; + + @override + String get entryInfoActionExportMetadata => 'Metagegevens exporteren'; + + @override + String get entryInfoActionRemoveLocation => 'Verwijder locatie'; + + @override + String get editorActionTransform => 'Transformeren'; + + @override + String get editorTransformCrop => 'Bijsnijden'; + + @override + String get editorTransformRotate => 'Roteren'; + + @override + String get cropAspectRatioFree => 'Vrij'; + + @override + String get cropAspectRatioOriginal => 'Origineel'; + + @override + String get cropAspectRatioSquare => 'Vierkant'; + + @override + String get filterAspectRatioLandscapeLabel => 'Liggend'; + + @override + String get filterAspectRatioPortraitLabel => 'Staand'; + + @override + String get filterBinLabel => 'Prullenbak'; + + @override + String get filterFavouriteLabel => 'Favoriet'; + + @override + String get filterNoDateLabel => 'Zonder datum'; + + @override + String get filterNoAddressLabel => 'Zonder adres'; + + @override + String get filterLocatedLabel => 'Met Plaats'; + + @override + String get filterNoLocationLabel => 'Zonder plaats'; + + @override + String get filterNoRatingLabel => 'Zonder waardering'; + + @override + String get filterTaggedLabel => 'Met label'; + + @override + String get filterNoTagLabel => 'Zonder label'; + + @override + String get filterNoTitleLabel => 'Zonder titel'; + + @override + String get filterOnThisDayLabel => 'Op deze dag'; + + @override + String get filterRecentlyAddedLabel => 'Recent toegevoegd'; + + @override + String get filterRatingRejectedLabel => 'Afgekeurd'; + + @override + String get filterTypeAnimatedLabel => 'Geanimeerd'; + + @override + String get filterTypeMotionPhotoLabel => 'Bewegende Foto'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Afbeelding'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Schermeffecten uitschakelen'; + + @override + String get accessibilityAnimationsKeep => 'Schermeffecten behouden'; + + @override + String get albumTierNew => 'Nieuw'; + + @override + String get albumTierPinned => 'Gepint'; + + @override + String get albumTierGroups => 'Groepen'; + + @override + String get albumTierSpecial => 'Veelgebruikt'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Kluizen'; + + @override + String get albumTierDynamic => 'Dynamisch'; + + @override + String get albumTierRegular => 'Overige'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimale graden'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Hoogste waardering'; + + @override + String get displayRefreshRatePreferLowest => 'Laagste waardering'; + + @override + String get keepScreenOnNever => 'Nooit'; + + @override + String get keepScreenOnVideoPlayback => 'Tijdens het afspelen van video'; + + @override + String get keepScreenOnViewerOnly => 'Alleen Viewerpagina'; + + @override + String get keepScreenOnAlways => 'Altijd'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybride)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrein)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Waterkleur'; + + @override + String get maxBrightnessNever => 'Nooit'; + + @override + String get maxBrightnessAlways => 'Altijd'; + + @override + String get nameConflictStrategyRename => 'Hernoemen'; + + @override + String get nameConflictStrategyReplace => 'Vervangen'; + + @override + String get nameConflictStrategySkip => 'Overslaan'; + + @override + String get overlayHistogramNone => 'Geen'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Helderheid'; + + @override + String get subtitlePositionTop => 'Boven'; + + @override + String get subtitlePositionBottom => 'Onder'; + + @override + String get themeBrightnessLight => 'Licht'; + + @override + String get themeBrightnessDark => 'Donker'; + + @override + String get themeBrightnessBlack => 'Zwart'; + + @override + String get unitSystemMetric => 'Metrisch'; + + @override + String get unitSystemImperial => 'Brits-Amerikaans'; + + @override + String get vaultLockTypePattern => 'Patroon'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Wachtwoord'; + + @override + String get settingsVideoEnablePip => 'Beeld-in-beeld'; + + @override + String get videoControlsPlayOutside => 'Met andere speler openen'; + + @override + String get videoLoopModeNever => 'Nooit'; + + @override + String get videoLoopModeShortOnly => 'Alleen korte video\'s'; + + @override + String get videoLoopModeAlways => 'Altijd'; + + @override + String get videoPlaybackSkip => 'Overslaan'; + + @override + String get videoPlaybackMuted => 'Gedempt afspelen'; + + @override + String get videoPlaybackWithSound => 'Met geluid afspelen'; + + @override + String get videoResumptionModeNever => 'Nooit'; + + @override + String get videoResumptionModeAlways => 'Altijd'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Vervagen'; + + @override + String get viewerTransitionZoomIn => 'Inzoomen'; + + @override + String get viewerTransitionNone => 'Geen'; + + @override + String get wallpaperTargetHome => 'Startscherm'; + + @override + String get wallpaperTargetLock => 'Vergrendelingsscherm'; + + @override + String get wallpaperTargetHomeLock => 'Start- en vergrendelingsschermen'; + + @override + String get widgetDisplayedItemRandom => 'Willekeurig'; + + @override + String get widgetDisplayedItemMostRecent => 'Laatst gebruikt'; + + @override + String get widgetOpenPageHome => 'Startscherm openen'; + + @override + String get widgetOpenPageCollection => 'Verzameling openen'; + + @override + String get widgetOpenPageViewer => 'Voorbeeld openen'; + + @override + String get widgetTapUpdateWidget => 'Widget bijwerken'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internale opslag'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD kaart'; + + @override + String get rootDirectoryDescription => 'root map'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” map'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Selecteer in het volgende scherm de $directory van “$volume” om deze app er toegang toe te geven.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Deze applicatie mag geen bestanden wijzigen in de $directory van “$volume”,.\n\n Gebruik een vooraf geïnstalleerde filemanager of galerij-app om de items naar een andere map te verplaatsen.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Deze bewerking heeft $neededSize vrije ruimte op “$volume”, nodig om te voltooien, maar er is nog slechts $freeSize over.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'De systeembestandskiezer ontbreekt of is uitgeschakeld. Schakel het in en probeer het opnieuw.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Deze bewerking wordt niet ondersteund voor items van het volgende bestandstype: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Sommige bestanden in de doelmap hebben dezelfde naam.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Sommige bestanden hebben dezelfde naam.'; + + @override + String get addShortcutDialogLabel => 'Label snelkoppeling'; + + @override + String get addShortcutButtonLabel => 'TOEVOEGEN'; + + @override + String get noMatchingAppDialogMessage => 'Er zijn geen apps die dit ondersteunen.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Deze $countString items naar de prullenbak verplaatsen?', + one: 'Dit item naar de prullenbak verplaatsen??', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Deze $countString items verwijderen?', + one: 'Dit item verwijderen?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Datums opslaan alvorens door te gaan?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Datums opslaan'; + + @override + String videoResumeDialogMessage(String time) { + return 'Afspelen hervatten om $time?'; + } + + @override + String get videoStartOverButtonLabel => 'OPNIEUW AFSPELLEN'; + + @override + String get videoResumeButtonLabel => 'HERVATTEN'; + + @override + String get setCoverDialogLatest => 'Laatste item'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Aangepast'; + + @override + String get hideFilterConfirmationDialogMessage => 'Overeenkomstige foto’s en video’s worden verborgen binnen jouw verzameling. Je kunt ze opnieuw weergeven via de “Privacy”-instellingen.\n\nWeet je zeker dat je ze wilt verbergen?'; + + @override + String get newAlbumDialogTitle => 'Nieuw Album'; + + @override + String get newAlbumDialogNameLabel => 'Albumnaam'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album bestaat al'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Map bestaat al'; + + @override + String get newAlbumDialogStorageLabel => 'Opslag:'; + + @override + String get newDynamicAlbumDialogTitle => 'Nieuw dynamisch album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamisch album bestaat al'; + + @override + String get newGroupDialogTitle => 'Nieuwe groep'; + + @override + String get newGroupDialogNameLabel => 'Groepsnaam'; + + @override + String get groupAlreadyExists => 'Groep bestaat al'; + + @override + String get groupEmpty => 'Geen groep'; + + @override + String get ungrouped => 'Niet gegroepeerd'; + + @override + String get groupPickerTitle => 'Groep kiezen'; + + @override + String get groupPickerUseThisGroupButton => 'Deze groep gebruiken'; + + @override + String get newVaultWarningDialogMessage => 'Items in kluizen zijn alleen beschikbaar voor deze app en niet voor andere.\n\nAls je deze app verwijdert of deze app-gegevens wist, verlies je al deze items.'; + + @override + String get newVaultDialogTitle => 'Nieuwe kluis'; + + @override + String get configureVaultDialogTitle => 'Kluis configureren'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Vergrendelen wanneer het scherm wordt uitgeschakeld'; + + @override + String get vaultDialogLockTypeLabel => 'Vergrendelingstype'; + + @override + String get patternDialogEnter => 'Voer patroon in'; + + @override + String get patternDialogConfirm => 'Patroon bevestigen'; + + @override + String get pinDialogEnter => 'Voer PIN in'; + + @override + String get pinDialogConfirm => 'PIN bevestigen'; + + @override + String get passwordDialogEnter => 'Voer wachtwoord in'; + + @override + String get passwordDialogConfirm => 'Wachtwoord bevestigen'; + + @override + String get authenticateToConfigureVault => 'Verifieer om de kluis te configureren'; + + @override + String get authenticateToUnlockVault => 'Verifieer om de kluis te ontgrendelen'; + + @override + String get vaultBinUsageDialogMessage => 'Sommige kluizen gebruiken de prullenbak.'; + + @override + String get renameAlbumDialogLabel => 'Nieuwe naam'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Map bestaat al'; + + @override + String get renameEntrySetPageTitle => 'Hernoemen'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naamgevingspatroon'; + + @override + String get renameEntrySetPageInsertTooltip => 'Veld invoegen'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Voorbeeld'; + + @override + String get renameProcessorCounter => 'Teller'; + + @override + String get renameProcessorHash => 'Controlenummer'; + + @override + String get renameProcessorName => 'Naam'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Dit album en de $countString items erbinnen verwijderen?', + one: 'Dit album en het item erbinnen verwijderen?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Deze albums en de $countString items erbinnen verwijderen?', + one: 'Deze albums en de items erbinnen verwijderen?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Type:'; + + @override + String get exportEntryDialogWidth => 'Breedte'; + + @override + String get exportEntryDialogHeight => 'Hoogte'; + + @override + String get exportEntryDialogQuality => 'Kwaliteit'; + + @override + String get exportEntryDialogWriteMetadata => 'Metadata schrijven'; + + @override + String get renameEntryDialogLabel => 'Nieuwe naam'; + + @override + String get editEntryDialogCopyFromItem => 'Van ander item kopiëren'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Velden om aan te passen'; + + @override + String get editEntryDateDialogTitle => 'Datum & Tijd'; + + @override + String get editEntryDateDialogSetCustom => 'Aangepaste datum instellen'; + + @override + String get editEntryDateDialogCopyField => 'Van andere datum kopiëren'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Uit titel halen'; + + @override + String get editEntryDateDialogShift => 'Verschuiven'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Wijzigingsdatum bestand'; + + @override + String get durationDialogHours => 'Uren'; + + @override + String get durationDialogMinutes => 'Minuten'; + + @override + String get durationDialogSeconds => 'Seconden'; + + @override + String get editEntryLocationDialogTitle => 'Locatie'; + + @override + String get editEntryLocationDialogSetCustom => 'Aangepaste locatie instellen'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Op kaart kiezen'; + + @override + String get editEntryLocationDialogImportGpx => 'GPX importeren'; + + @override + String get editEntryLocationDialogLatitude => 'Breedtegraad'; + + @override + String get editEntryLocationDialogLongitude => 'Lengtegraad'; + + @override + String get editEntryLocationDialogTimeShift => 'Verschuiving van de tijd'; + + @override + String get locationPickerUseThisLocationButton => 'Gebruik deze locatie'; + + @override + String get editEntryRatingDialogTitle => 'Waardering'; + + @override + String get removeEntryMetadataDialogTitle => 'Verwijderen metadata'; + + @override + String get removeEntryMetadataDialogAll => 'Alle'; + + @override + String get removeEntryMetadataDialogMore => 'Meer'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is vereist om de video in een bewegende foto af te spelen.\n\nWeet je zeker dat je deze wilt verwijderen?'; + + @override + String get videoSpeedDialogLabel => 'Afspeelsnelheid'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Ondertiteling'; + + @override + String get videoStreamSelectionDialogOff => 'Uit'; + + @override + String get videoStreamSelectionDialogTrack => 'Spoor'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Er zijn geen andere sporen.'; + + @override + String get genericSuccessFeedback => 'Klaar!'; + + @override + String get genericFailureFeedback => 'Fout'; + + @override + String get genericDangerWarningDialogMessage => 'Weet je het zeker?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Probeer opnieuw met minder items.'; + + @override + String get menuActionConfigureView => 'Beeld'; + + @override + String get menuActionSelect => 'Selecteren'; + + @override + String get menuActionSelectAll => 'Alles selecteren'; + + @override + String get menuActionSelectNone => 'Selectie ongedaan maken'; + + @override + String get menuActionMap => 'Kaart'; + + @override + String get menuActionSlideshow => 'Diavoorstelling'; + + @override + String get menuActionStats => 'Statistieken'; + + @override + String get viewDialogSortSectionTitle => 'Sorteer'; + + @override + String get viewDialogGroupSectionTitle => 'Secties'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Sortering omkeren'; + + @override + String get tileLayoutMosaic => 'Mozaïek'; + + @override + String get tileLayoutGrid => 'Raster'; + + @override + String get tileLayoutList => 'Lijst'; + + @override + String get castDialogTitle => 'Cast-apparaten'; + + @override + String get coverDialogTabCover => 'Kaft'; + + @override + String get coverDialogTabApp => 'Applicatie'; + + @override + String get coverDialogTabColor => 'Kleur'; + + @override + String get appPickDialogTitle => 'Kies applicatie'; + + @override + String get appPickDialogNone => 'Geen'; + + @override + String get aboutPageTitle => 'Over'; + + @override + String get aboutLinkLicense => 'Licentie'; + + @override + String get aboutLinkPolicy => 'Privacybeleid'; + + @override + String get aboutBugSectionTitle => 'Foutmelding'; + + @override + String get aboutBugSaveLogInstruction => 'Sla applicatielogs op in een bestand'; + + @override + String get aboutBugCopyInfoInstruction => 'Systeeminformatie kopiëren'; + + @override + String get aboutBugCopyInfoButton => 'Kopieer'; + + @override + String get aboutBugReportInstruction => 'Melden op GitHub met de logs en systeeminformatie'; + + @override + String get aboutBugReportButton => 'Melden'; + + @override + String get aboutDataUsageSectionTitle => 'Gegevensgebruik'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Overig'; + + @override + String get aboutDataUsageInternal => 'Intern'; + + @override + String get aboutDataUsageExternal => 'Extern'; + + @override + String get aboutDataUsageClearCache => 'Cache wissen'; + + @override + String get aboutCreditsSectionTitle => 'Dankbetuiging'; + + @override + String get aboutCreditsWorldAtlas1 => 'Deze applicatie gebruikt een TopoJSON-bestand van'; + + @override + String get aboutCreditsWorldAtlas2 => 'onder ISC-licentie.'; + + @override + String get aboutTranslatorsSectionTitle => 'Vertalers'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenties'; + + @override + String get aboutLicensesBanner => 'Deze app maakt gebruik van de volgende open-sourcepakketten en bibliotheken.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android bibliotheken'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Alle licenties tonen'; + + @override + String get policyPageTitle => 'Privacybeleid'; + + @override + String get collectionPageTitle => 'Verzameling'; + + @override + String get collectionPickPageTitle => 'Kies'; + + @override + String get collectionSelectPageTitle => 'Items selecteren'; + + @override + String get collectionActionShowTitleSearch => 'Titelfilter weergeven'; + + @override + String get collectionActionHideTitleSearch => 'Verberg titel filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Dynamisch album toevoegen'; + + @override + String get collectionActionAddShortcut => 'Snelkoppeling aanmaken'; + + @override + String get collectionActionSetHome => 'Als startpagina instellen'; + + @override + String get collectionActionEmptyBin => 'Prullenbak leegmaken'; + + @override + String get collectionActionCopy => 'Naar album kopiëren'; + + @override + String get collectionActionMove => 'Naar album verplaatsen'; + + @override + String get collectionActionRescan => 'Opnieuw indexeren'; + + @override + String get collectionActionEdit => 'Bewerken'; + + @override + String get collectionSearchTitlesHintText => 'Zoek op titel'; + + @override + String get collectionGroupAlbum => 'Op Albumnaam'; + + @override + String get collectionGroupMonth => 'Op maand'; + + @override + String get collectionGroupDay => 'Op dag'; + + @override + String get sectionNone => 'Geen secties'; + + @override + String get sectionUnknown => 'Onbekend'; + + @override + String get dateToday => 'Vandaag'; + + @override + String get dateYesterday => 'Gisteren'; + + @override + String get dateThisMonth => 'Deze maand'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kan $countString items niet verwijderen', + one: 'Kan 1 item niet verwijderen', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kan $countString items niet kopiëren', + one: 'Kan 1 item niet kopiëren', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kan $countString items niet verplaatsen', + one: 'Kan 1 item niet verplaatsen', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kan $countString items niet hernoemen', + one: 'Kan 1 item niet hernoemen', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kan $countString items niet bewerken', + one: 'Kan 1 item niet bewerken', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kan $countString pagina’s niet exporteren', + one: 'Kan 1 pagina niet exporteren', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items gekopieerd', + one: '1 item gekopieerd', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items verplaatst', + one: '1 item verplaatst', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items hernoemd', + one: '1 item hernoemd', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items bewerkt', + one: '1 item bewerkt', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Geen favourieten'; + + @override + String get collectionEmptyVideos => 'Geen video’s'; + + @override + String get collectionEmptyImages => 'Geen afbeeldingen'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Toegang verlenen'; + + @override + String get collectionSelectSectionTooltip => 'Sectie selecteren'; + + @override + String get collectionDeselectSectionTooltip => 'Sectie niet selecteren'; + + @override + String get drawerAboutButton => 'Over'; + + @override + String get drawerSettingsButton => 'Instellingen'; + + @override + String get drawerCollectionAll => 'Alle verzamelingen'; + + @override + String get drawerCollectionFavourites => 'Favourieten'; + + @override + String get drawerCollectionImages => 'Afbeeldingen'; + + @override + String get drawerCollectionVideos => 'Video’s'; + + @override + String get drawerCollectionAnimated => 'Animaties'; + + @override + String get drawerCollectionMotionPhotos => 'Bewegende foto’s'; + + @override + String get drawerCollectionPanoramas => 'Panorama\'s'; + + @override + String get drawerCollectionRaws => 'Raw foto’s'; + + @override + String get drawerCollectionSphericalVideos => '360° video’s'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Landen'; + + @override + String get drawerPlacePage => 'Plaatsen'; + + @override + String get drawerTagPage => 'Labels'; + + @override + String get sortByDate => 'Op datum'; + + @override + String get sortByName => 'Op naam'; + + @override + String get sortByItemCount => 'Op aantal items'; + + @override + String get sortBySize => 'Op grootte'; + + @override + String get sortByAlbumFileName => 'Op album- en itemnaam'; + + @override + String get sortByRating => 'Op waardering'; + + @override + String get sortByDuration => 'Op lengte'; + + @override + String get sortByPath => 'Op pad'; + + @override + String get sortOrderNewestFirst => 'Nieuwste eerst'; + + @override + String get sortOrderOldestFirst => 'Oudste eerst'; + + @override + String get sortOrderAtoZ => 'A - Z'; + + @override + String get sortOrderZtoA => 'Z - A'; + + @override + String get sortOrderHighestFirst => 'Hoogste eerst'; + + @override + String get sortOrderLowestFirst => 'Laagste eerst'; + + @override + String get sortOrderLargestFirst => 'Grootste eerst'; + + @override + String get sortOrderSmallestFirst => 'Kleinste eerst'; + + @override + String get sortOrderShortestFirst => 'Kortste eerst'; + + @override + String get sortOrderLongestFirst => 'Langste eerst'; + + @override + String get albumGroupTier => 'Op rang'; + + @override + String get albumGroupType => 'Op type'; + + @override + String get albumGroupVolume => 'Op opslagvolume'; + + @override + String get albumMimeTypeMixed => 'Gemengd'; + + @override + String get albumPickPageTitleCopy => 'Naar album kopiëren'; + + @override + String get albumPickPageTitleExport => 'Exporteren naar Album'; + + @override + String get albumPickPageTitleMove => 'Naar album verplaatsen'; + + @override + String get albumPickPageTitlePick => 'Kies Album'; + + @override + String get albumCamera => 'Camera'; + + @override + String get albumDownload => 'Opslaan'; + + @override + String get albumScreenshots => 'Schermopnames'; + + @override + String get albumScreenRecordings => 'Schermopnames'; + + @override + String get albumVideoCaptures => 'Video opnames'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'Geen albums'; + + @override + String get createAlbumButtonLabel => 'AANMAKEN'; + + @override + String get newFilterBanner => 'nieuw'; + + @override + String get countryPageTitle => 'Landen'; + + @override + String get countryEmpty => 'Geen landen'; + + @override + String get statePageTitle => 'Staten'; + + @override + String get stateEmpty => 'Zonder Staten'; + + @override + String get placePageTitle => 'Plaatsen'; + + @override + String get placeEmpty => 'Zonder plaatsen'; + + @override + String get tagPageTitle => 'Labels'; + + @override + String get tagEmpty => 'Geen labels'; + + @override + String get tagPickPageTitle => 'Label kiezen'; + + @override + String get binPageTitle => 'Prullenbak'; + + @override + String get explorerPageTitle => 'Bestanden'; + + @override + String get explorerActionSelectStorageVolume => 'Opslag selecteren'; + + @override + String get selectStorageVolumeDialogTitle => 'Opslag selecteren'; + + @override + String get searchCollectionFieldHint => 'Doorzoek collectie'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Datum'; + + @override + String get searchFormatSectionTitle => 'Formaten'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Landen'; + + @override + String get searchStatesSectionTitle => 'Staten'; + + @override + String get searchPlacesSectionTitle => 'Plaatsen'; + + @override + String get searchTagsSectionTitle => 'Labels'; + + @override + String get searchRatingSectionTitle => 'Waarderingen'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Instellingen'; + + @override + String get settingsSystemDefault => 'Systeem'; + + @override + String get settingsDefault => 'Standaard'; + + @override + String get settingsDisabled => 'Uitgeschakeld'; + + @override + String get settingsEnabled => 'Ingeschakeld'; + + @override + String get settingsForced => 'Gedwongen'; + + @override + String get settingsAskEverytime => 'Elke keer vragen'; + + @override + String get settingsModificationWarningDialogMessage => 'Andere instellingen zullen worden aangepast.'; + + @override + String get settingsSearchFieldLabel => 'Instellingen doorzoeken'; + + @override + String get settingsSearchEmpty => 'Geen instellingen gevonden'; + + @override + String get settingsActionExport => 'Exporteren'; + + @override + String get settingsActionExportDialogTitle => 'Exporteren'; + + @override + String get settingsActionImport => 'Importeren'; + + @override + String get settingsActionImportDialogTitle => 'Importeren'; + + @override + String get appExportCovers => 'Omslagen'; + + @override + String get appExportDynamicAlbums => 'Dynamische albums'; + + @override + String get appExportFavourites => 'Favorieten'; + + @override + String get appExportSettings => 'Instellingen'; + + @override + String get settingsNavigationSectionTitle => 'Navigatie'; + + @override + String get settingsHomeTile => 'Startscherm'; + + @override + String get settingsHomeDialogTitle => 'Startscherm'; + + @override + String get setHomeCustom => 'Aangepast'; + + @override + String get settingsKeepScreenOnTile => 'Scherm aan houden'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Scherm aan houden'; + + @override + String get settingsDoubleBackExit => 'Twee keer op “terug” tikken om af te sluiten'; + + @override + String get settingsConfirmationTile => 'Bevestigingsdialogen'; + + @override + String get settingsConfirmationDialogTitle => 'Bevestigingsdialogen'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Bevestiging vragen voordat items voor altijd worden verwijderd'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Bevestiging vragen voordat items naar de prullenbak worden verplaatst'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Bevestiging vragen voordat ongedateerde items worden verplaatst'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Bevestigingsbericht weergeven na het verplaatsen van items naar de prullenbak'; + + @override + String get settingsConfirmationVaultDataLoss => 'Waarschuwing weergeven voor verlies van kluisgegevens'; + + @override + String get settingsNavigationDrawerTile => 'Navigatiemenu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigatiemenu'; + + @override + String get settingsNavigationDrawerBanner => 'Houd ingedrukt om menu-items te verplaatsen en opnieuw te ordenen.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Typen'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pagina’s'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Album toevoegen'; + + @override + String get settingsNavigationBottomActionsTile => 'Navigatie onderaan'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Navigatie onderaan'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Lang indrukken om knoppen te verplaatsen en te selecteren welke acties worden weergegeven in de onderste navigatiebalk.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniaturen'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'HDR-pictogram tonen'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Favorieten-pictogram tonen'; + + @override + String get settingsThumbnailShowTagIcon => 'Label-pictogram tonen'; + + @override + String get settingsThumbnailShowLocationIcon => 'Locatie-pictogram tonen'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Bewegende foto-pictogram tonen'; + + @override + String get settingsThumbnailShowRating => 'Waardering tonen'; + + @override + String get settingsThumbnailShowRawIcon => 'Raw-pictogram tonen'; + + @override + String get settingsThumbnailShowVideoDuration => 'Videoduur tonen'; + + @override + String get settingsCollectionQuickActionsTile => 'Snelle bewerkingen'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Snelle acties'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Blader'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecteren'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Houd knoppen ingedrukt om deze te verplaatsen en te selecteren welke acties worden weergegeven bij het bladeren door items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Houd knoppen ingedrukt om deze te verplaatsen en te selecteren welke acties worden weergegeven bij het selecteren van items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst-patronen'; + + @override + String get settingsCollectionBurstPatternsNone => 'Geen'; + + @override + String get settingsViewerSectionTitle => 'Voorbeeld'; + + @override + String get settingsViewerGestureSideTapNext => 'Tik op het scherm om het vorige/volgende item weer te geven'; + + @override + String get settingsViewerUseCutout => 'Uitgesneden gebied gebruiken'; + + @override + String get settingsViewerMaximumBrightness => 'Maximale helderheid'; + + @override + String get settingsMotionPhotoAutoPlay => 'Bewegingsfoto’s automatisch afspelen'; + + @override + String get settingsImageBackground => 'Afbeeldingsachtergrond'; + + @override + String get settingsViewerQuickActionsTile => 'Snelle bewerkingen'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Snelle acties'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Houd knoppen ingedrukt om deze te verplaatsen en te selecteren welke acties in de viewer worden weergegeven.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Zichtbare knoppen'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Beschikbare knoppen'; + + @override + String get settingsViewerQuickActionEmpty => 'Geen knoppen'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Bij openen weergeven'; + + @override + String get settingsViewerShowHistogram => 'Histogram weergeven'; + + @override + String get settingsViewerShowMinimap => 'Kleine kaart tonen'; + + @override + String get settingsViewerShowZoomLevel => 'Zoom niveau tonen'; + + @override + String get settingsViewerShowInformation => 'Informatie tonen'; + + @override + String get settingsViewerShowInformationSubtitle => 'Titel, datum, locatie, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Waardering & labels tonen'; + + @override + String get settingsViewerShowShootingDetails => 'Opnamedetails tonen'; + + @override + String get settingsViewerShowDescription => 'Beschrijving tonen'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Miniaturen tonen'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Vervagingseffect'; + + @override + String get settingsViewerSlideshowTile => 'Diavoorstelling'; + + @override + String get settingsViewerSlideshowPageTitle => 'Diavoorstelling'; + + @override + String get settingsSlideshowRepeat => 'Herhalen'; + + @override + String get settingsSlideshowShuffle => 'Willekeurige volgorde'; + + @override + String get settingsSlideshowFillScreen => 'Volledig scherm'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Geanimeerd zoomeffect'; + + @override + String get settingsSlideshowTransitionTile => 'Overgang'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video afspelen'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video afspelen'; + + @override + String get settingsVideoPageTitle => 'Video Instellingen'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Video\'s weergeven'; + + @override + String get settingsVideoPlaybackTile => 'Afspelen'; + + @override + String get settingsVideoPlaybackPageTitle => 'Afspelen'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware-versnelling'; + + @override + String get settingsVideoAutoPlay => 'Automatisch afspelen'; + + @override + String get settingsVideoLoopModeTile => 'Herhaald afspelen'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Herhaald afspelen'; + + @override + String get settingsVideoResumptionModeTile => 'Afspelen hervatten'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Afspelen hervatten'; + + @override + String get settingsVideoBackgroundMode => 'Achtergrond-modus'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Achtergrond-modus'; + + @override + String get settingsVideoControlsTile => 'Bediening'; + + @override + String get settingsVideoControlsPageTitle => 'Bediening'; + + @override + String get settingsVideoButtonsTile => 'Knoppen'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Dubbeltik om te spelen/pauzeren'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Dubbeltik op schermranden om achteruit/vooruit te zoeken'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Veeg omhoog of naar beneden om helderheid/volume aan te passen'; + + @override + String get settingsSubtitleThemeTile => 'Ondertiteling'; + + @override + String get settingsSubtitleThemePageTitle => 'Ondertiteling'; + + @override + String get settingsSubtitleThemeSample => 'Dit is een voorbeeld.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Tekst uitlijnen'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Tekst uitlijnen'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Tekstpositie'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Tekstpositie'; + + @override + String get settingsSubtitleThemeTextSize => 'Tekstgroote'; + + @override + String get settingsSubtitleThemeShowOutline => 'Omtrek en schaduw tonen'; + + @override + String get settingsSubtitleThemeTextColor => 'Tekstkleur'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Tekstdoorzichtigheid'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Achtergrondkleur'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Achtergronddoorzichtigheid'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Links'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Midden'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Rechts'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Toegang tot app-inventaris toestaan'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Gebruikt om de albumweergave te verbeteren'; + + @override + String get settingsAllowErrorReporting => 'Anonieme foutmeldingen toestaan'; + + @override + String get settingsSaveSearchHistory => 'Zoekgeschiedenis opslaan'; + + @override + String get settingsEnableBin => 'Prullenbak gebruiken'; + + @override + String get settingsEnableBinSubtitle => 'Bewaar verwijderde items 30 dagen'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in de Prullenbak worden voor altijd verwijderd.'; + + @override + String get settingsAllowMediaManagement => 'Mediabeheer toestaan'; + + @override + String get settingsHiddenItemsTile => 'Verborgen items'; + + @override + String get settingsHiddenItemsPageTitle => 'Verborgen Items'; + + @override + String get settingsHiddenFiltersBanner => 'Foto’s en video’s die overeenkomen met verborgen filters, worden niet weergegeven in je verzameling.'; + + @override + String get settingsHiddenFiltersEmpty => 'Geen verborgen filters'; + + @override + String get settingsStorageAccessTile => 'Toegang tot opslag'; + + @override + String get settingsStorageAccessPageTitle => 'Toegang tot opslag'; + + @override + String get settingsStorageAccessBanner => 'Sommige mappen vereisen een expliciete toegangstoekenning om bestanden erin te wijzigen. Je kunt hier directory’s bekijken waartoe je eerder toegang hebt verleend.'; + + @override + String get settingsStorageAccessEmpty => 'Geen toegang verleend'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Herroepen'; + + @override + String get settingsAccessibilitySectionTitle => 'Toegankelijkheid'; + + @override + String get settingsRemoveAnimationsTile => 'Animaties verwijderen'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Animaties verwijderen'; + + @override + String get settingsTimeToTakeActionTile => 'Reactietijd'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Alternatieven voor multi-touch-gebaren weergeven'; + + @override + String get settingsDisplaySectionTitle => 'Scherm'; + + @override + String get settingsThemeBrightnessTile => 'Thema'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Thema'; + + @override + String get settingsThemeColorHighlights => 'Kleurmarkeringen'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamische kleuren'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Vernieuwingssnelheid weergeven'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Vernieuwingssnelheid'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV-interface'; + + @override + String get settingsLanguageSectionTitle => 'Taal & landinstellingen'; + + @override + String get settingsLanguageTile => 'Taal'; + + @override + String get settingsLanguagePageTitle => 'Taal'; + + @override + String get settingsCoordinateFormatTile => 'Coördinaten-weergave'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coördinaten-weergave'; + + @override + String get settingsUnitSystemTile => 'Eenheden'; + + @override + String get settingsUnitSystemDialogTitle => 'Eenheden'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Arabische cijfers forceren'; + + @override + String get settingsScreenSaverPageTitle => 'Schermbeveiliging'; + + @override + String get settingsWidgetPageTitle => 'Fotolijst'; + + @override + String get settingsWidgetShowOutline => 'Contour'; + + @override + String get settingsWidgetOpenPage => 'Bij het tikken op de widget'; + + @override + String get settingsWidgetDisplayedItem => 'Zichtbaar item'; + + @override + String get settingsCollectionTile => 'Verzameling'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items met locatie', + one: '1 item met locatie', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Landen'; + + @override + String get statsTopStatesSectionTitle => 'Top Staten'; + + @override + String get statsTopPlacesSectionTitle => 'Top Plaatsen'; + + @override + String get statsTopTagsSectionTitle => 'Top Labels'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'PANORAMA OPENEN'; + + @override + String get viewerSetWallpaperButtonLabel => 'ALS ACHTERGROND INSTELLEN'; + + @override + String get viewerErrorUnknown => 'Oei!'; + + @override + String get viewerErrorDoesNotExist => 'Het bestand bestaat niet meer.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Terug naar viewer'; + + @override + String get viewerInfoUnknown => 'onbekendd'; + + @override + String get viewerInfoLabelDescription => 'Omschrijving'; + + @override + String get viewerInfoLabelTitle => 'Titel'; + + @override + String get viewerInfoLabelDate => 'Datum'; + + @override + String get viewerInfoLabelResolution => 'Resolutie'; + + @override + String get viewerInfoLabelSize => 'Grootte'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Pad'; + + @override + String get viewerInfoLabelDuration => 'Duur'; + + @override + String get viewerInfoLabelOwner => 'Eigenaar'; + + @override + String get viewerInfoLabelCoordinates => 'Coördinaten'; + + @override + String get viewerInfoLabelAddress => 'Adres'; + + @override + String get mapStyleDialogTitle => 'Kaartstijl'; + + @override + String get mapStyleDialogAddStyle => 'Stijl toevoegen'; + + @override + String get mapStyleTooltip => 'Kaartstijl selecteren'; + + @override + String get mapStyleEditorDialogName => 'Naam'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomeinen'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Inzoomen'; + + @override + String get mapZoomOutTooltip => 'Uitzoomen'; + + @override + String get mapPointNorthUpTooltip => 'Noorden boven'; + + @override + String get mapAttributionOsmData => 'Kaartgegevens © [OpenStreetMap](https://www.openstreetmap.org/copyright) bijdragers'; + + @override + String get mapAttributionOsmLiberty => 'Symbolen van [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Aangeboden door [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tegels van [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tegels door [HOT](https://www.hotosm.org/) • Gehost door [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tegels door [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Op kaartpagina tonen'; + + @override + String get mapEmptyRegion => 'Geen afbeeldingen in dit gebied'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Kan ingesloten gegevens niet extraheren'; + + @override + String get viewerInfoOpenLinkText => 'Openen'; + + @override + String get viewerInfoViewXmlLinkText => 'Bekijk XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Metadata doorzoeken'; + + @override + String get viewerInfoSearchEmpty => 'Geen overeenkomstige zoeksleutels'; + + @override + String get viewerInfoSearchSuggestionDate => 'Datum & tijd'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Beschrijving'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Afmetingen'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolutie'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rechten'; + + @override + String get wallpaperUseScrollEffect => 'Scroll-effect gebruiken op startscherm'; + + @override + String get tagEditorPageTitle => 'Labels bewerken'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Nieuw label'; + + @override + String get tagEditorPageAddTagTooltip => 'Label toevoegen'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Aanduidingen'; + + @override + String get tagEditorDiscardDialogMessage => 'Wijzigingen ongedaan maken?'; + + @override + String get tagPlaceholderCountry => 'Land'; + + @override + String get tagPlaceholderState => 'Staat'; + + @override + String get tagPlaceholderPlace => 'Plaats'; + + @override + String get panoramaEnableSensorControl => 'Sensor control inschakelen'; + + @override + String get panoramaDisableSensorControl => 'Sensor control uitschakelen'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_nn.dart b/lib/l10ngen/app_localizations_nn.dart new file mode 100644 index 0000000..7bed0a5 --- /dev/null +++ b/lib/l10ngen/app_localizations_nn.dart @@ -0,0 +1,2361 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Norwegian Nynorsk (`nn`). +class AppLocalizationsNn extends AppLocalizations { + AppLocalizationsNn([String locale = 'nn']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Velkomen til Aves'; + + @override + String get welcomeOptional => 'Valfritt'; + + @override + String get welcomeTermsToggle => 'Eg samtykkjer til krava og føresetnadane'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count er valde', + one: '$count er vald', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count kolonnar', + one: '$count kolonne', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString sekund', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutt', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString dagar', + one: '$countString dag', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'NYTTA'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'SLETT'; + + @override + String get nextButtonLabel => 'NESTE'; + + @override + String get showButtonLabel => 'VIS'; + + @override + String get hideButtonLabel => 'SKJUL'; + + @override + String get continueButtonLabel => 'HALD FRAM'; + + @override + String get saveCopyButtonLabel => 'SPAR KOPI'; + + @override + String get applyTooltip => 'Nytt'; + + @override + String get cancelTooltip => 'Avbryt'; + + @override + String get changeTooltip => 'Brigd'; + + @override + String get clearTooltip => 'Tøm'; + + @override + String get previousTooltip => 'Førre'; + + @override + String get nextTooltip => 'Neste'; + + @override + String get showTooltip => 'Vis'; + + @override + String get hideTooltip => 'Skjul'; + + @override + String get actionRemove => 'Tak bort'; + + @override + String get resetTooltip => 'Still attende'; + + @override + String get saveTooltip => 'Spar'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'Vel'; + + @override + String get doubleBackExitMessage => 'Trykk «attende» igjen for å gå ut.'; + + @override + String get doNotAskAgain => 'Ikkje spør att'; + + @override + String get sourceStateLoading => 'Hentar inn'; + + @override + String get sourceStateCataloguing => 'Cataloguing'; + + @override + String get sourceStateLocatingCountries => 'Finn land'; + + @override + String get sourceStateLocatingPlaces => 'Finn stadar'; + + @override + String get chipActionDelete => 'Slett'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Vis i Samling'; + + @override + String get chipActionGoToAlbumPage => 'Vis i Album'; + + @override + String get chipActionGoToCountryPage => 'Vis i Land'; + + @override + String get chipActionGoToPlacePage => 'Vis i Stadar'; + + @override + String get chipActionGoToTagPage => 'Vis i Merke'; + + @override + String get chipActionGoToExplorerPage => 'Show in Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Tak ut'; + + @override + String get chipActionFilterIn => 'Tak med'; + + @override + String get chipActionHide => 'Skjul'; + + @override + String get chipActionLock => 'Lås'; + + @override + String get chipActionPin => 'Fest til toppen'; + + @override + String get chipActionUnpin => 'losna ifrå toppen'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Byt namn'; + + @override + String get chipActionSetCover => 'Sett omslag'; + + @override + String get chipActionShowCountryStates => 'Vis landsdelar'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Lag eit album'; + + @override + String get chipActionCreateVault => 'Kvelv'; + + @override + String get chipActionConfigureVault => 'Set opp kvelvet'; + + @override + String get entryActionCopyToClipboard => 'Kopier til utklippstavla'; + + @override + String get entryActionDelete => 'Slett'; + + @override + String get entryActionConvert => 'Lag om'; + + @override + String get entryActionExport => 'Før ut'; + + @override + String get entryActionInfo => 'Opplysingar'; + + @override + String get entryActionRename => 'Byt namn'; + + @override + String get entryActionRestore => 'Gjenopprett'; + + @override + String get entryActionRotateCCW => 'Snu imot klokka'; + + @override + String get entryActionRotateCW => 'Snu med klokka'; + + @override + String get entryActionFlip => 'Vend vassrett'; + + @override + String get entryActionPrint => 'Skriv ut'; + + @override + String get entryActionShare => 'Del'; + + @override + String get entryActionShareImageOnly => 'Del berre bilete'; + + @override + String get entryActionShareVideoOnly => 'Del berre video'; + + @override + String get entryActionViewSource => 'Vis kjelda'; + + @override + String get entryActionShowGeoTiffOnMap => 'Vis som overlagskart'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Lag om til eit stillbilete'; + + @override + String get entryActionViewMotionPhotoVideo => 'Opne video'; + + @override + String get entryActionEdit => 'Brigd'; + + @override + String get entryActionOpen => 'Opne med'; + + @override + String get entryActionSetAs => 'Sett som'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Vis i kartapp'; + + @override + String get entryActionRotateScreen => 'Snu skjermen'; + + @override + String get entryActionAddFavourite => 'Lik'; + + @override + String get entryActionRemoveFavourite => 'Stogg å like'; + + @override + String get videoActionCaptureFrame => 'Grip biletet'; + + @override + String get videoActionMute => 'Døyv'; + + @override + String get videoActionUnmute => 'Ikkje døyv'; + + @override + String get videoActionPause => 'Stans'; + + @override + String get videoActionPlay => 'Spel av'; + + @override + String get videoActionReplay10 => 'Spol 10 sekund bakover'; + + @override + String get videoActionSkip10 => 'Spol 10 sekund framover'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Vel spor'; + + @override + String get videoActionSetSpeed => 'Avspelingssnøggleik'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Innstillingar'; + + @override + String get viewerActionLock => 'Lås visinga'; + + @override + String get viewerActionUnlock => 'Lås opp visinga'; + + @override + String get slideshowActionResume => 'Hald fram'; + + @override + String get slideshowActionShowInCollection => 'Vis i Samling'; + + @override + String get entryInfoActionEditDate => 'Brigd datoen og tida'; + + @override + String get entryInfoActionEditLocation => 'Brigd stadsetjinga'; + + @override + String get entryInfoActionEditTitleDescription => 'Brigd namnet og utgreiinga'; + + @override + String get entryInfoActionEditRating => 'Brigd omdøminga'; + + @override + String get entryInfoActionEditTags => 'Brigd merka'; + + @override + String get entryInfoActionRemoveMetadata => 'Tak bort metadata'; + + @override + String get entryInfoActionExportMetadata => 'Før ut metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Ta bort stadsetjinga'; + + @override + String get editorActionTransform => 'Form om'; + + @override + String get editorTransformCrop => 'Klipp til'; + + @override + String get editorTransformRotate => 'Snu'; + + @override + String get cropAspectRatioFree => 'Frihand'; + + @override + String get cropAspectRatioOriginal => 'Opphavleg'; + + @override + String get cropAspectRatioSquare => 'Kvadrat'; + + @override + String get filterAspectRatioLandscapeLabel => 'Liggjande'; + + @override + String get filterAspectRatioPortraitLabel => 'Ståande'; + + @override + String get filterBinLabel => 'Papirkorg'; + + @override + String get filterFavouriteLabel => 'Likar'; + + @override + String get filterNoDateLabel => 'Ikkje dagsette'; + + @override + String get filterNoAddressLabel => 'Inga adresse'; + + @override + String get filterLocatedLabel => 'Stadsette'; + + @override + String get filterNoLocationLabel => 'Ustadsette'; + + @override + String get filterNoRatingLabel => 'Ikkje dømde'; + + @override + String get filterTaggedLabel => 'Merkte'; + + @override + String get filterNoTagLabel => 'Utan merke'; + + @override + String get filterNoTitleLabel => 'Utan namn'; + + @override + String get filterOnThisDayLabel => 'På denne dagen'; + + @override + String get filterRecentlyAddedLabel => 'Nyleg lagde til'; + + @override + String get filterRatingRejectedLabel => 'Avslegen'; + + @override + String get filterTypeAnimatedLabel => 'Animert'; + + @override + String get filterTypeMotionPhotoLabel => 'Rørslebilete'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Rå'; + + @override + String get filterTypeSphericalVideoLabel => '360°-video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Bilete'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Hindr skjermrørsler'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'Ny'; + + @override + String get albumTierPinned => 'Festa'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Ofte opna'; + + @override + String get albumTierApps => 'Appar'; + + @override + String get albumTierVaults => 'Kvelv'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Andre'; + + @override + String get coordinateFormatDms => 'G-M-S'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Desimalgrader'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'A'; + + @override + String get coordinateDmsWest => 'V'; + + @override + String get displayRefreshRatePreferHighest => 'Mest jamn'; + + @override + String get displayRefreshRatePreferLowest => 'Mest ujamn'; + + @override + String get keepScreenOnNever => 'Aldri'; + + @override + String get keepScreenOnVideoPlayback => 'Under videoavspeling'; + + @override + String get keepScreenOnViewerOnly => 'Berre på visingssida'; + + @override + String get keepScreenOnAlways => 'Heile tida'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (mark)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitært OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (vassfarge)'; + + @override + String get maxBrightnessNever => 'Aldri'; + + @override + String get maxBrightnessAlways => 'Heile tida'; + + @override + String get nameConflictStrategyRename => 'Byt namn'; + + @override + String get nameConflictStrategyReplace => 'Byt ut'; + + @override + String get nameConflictStrategySkip => 'Hopp over'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'På toppen'; + + @override + String get subtitlePositionBottom => 'I botnen'; + + @override + String get themeBrightnessLight => 'Ljos'; + + @override + String get themeBrightnessDark => 'Mørk'; + + @override + String get themeBrightnessBlack => 'Svart'; + + @override + String get unitSystemMetric => 'Metrisk'; + + @override + String get unitSystemImperial => 'Engelske måleiningar'; + + @override + String get vaultLockTypePattern => 'Mønster'; + + @override + String get vaultLockTypePin => 'Talkode'; + + @override + String get vaultLockTypePassword => 'Passord'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Opne med ein ytre avspelar'; + + @override + String get videoLoopModeNever => 'Av'; + + @override + String get videoLoopModeShortOnly => 'Berre stutte videoar'; + + @override + String get videoLoopModeAlways => 'På'; + + @override + String get videoPlaybackSkip => 'Hopp over'; + + @override + String get videoPlaybackMuted => 'Spel av utan ljod'; + + @override + String get videoPlaybackWithSound => 'Spel av med ljod'; + + @override + String get videoResumptionModeNever => 'Aldri'; + + @override + String get videoResumptionModeAlways => 'Kvar gong'; + + @override + String get viewerTransitionSlide => 'Skridande'; + + @override + String get viewerTransitionParallax => 'Parallakse'; + + @override + String get viewerTransitionFade => 'Ton ut'; + + @override + String get viewerTransitionZoomIn => 'Auk'; + + @override + String get viewerTransitionNone => 'Ingen'; + + @override + String get wallpaperTargetHome => 'Heimskjermen'; + + @override + String get wallpaperTargetLock => 'Låseskjerm'; + + @override + String get wallpaperTargetHomeLock => 'Heim- og låseskjermane'; + + @override + String get widgetDisplayedItemRandom => 'Tilfeldig'; + + @override + String get widgetDisplayedItemMostRecent => 'Nylegaste'; + + @override + String get widgetOpenPageHome => 'Opne heimsida'; + + @override + String get widgetOpenPageCollection => 'Opne samlinga'; + + @override + String get widgetOpenPageViewer => 'Opne visinga'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Indre gøyme'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'Ytre gøyme'; + + @override + String get rootDirectoryDescription => 'rotmappe'; + + @override + String otherDirectoryDescription(String name) { + return '«$name»-mappa'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Vel $directory i «$volume» i neste vising for å gje denne appen tilgjenge til ho.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Denne appen har ikkje lov til å brigde filer i «$directory»-mappa i «$volume».\n\nBruk ein førehandsinnlagd filhandsamar eller galleriapp til å flytta tinga til ei anna mappe.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Denne gjerda tarv $neededSize unytta rom på «$volume» for å verta fullgjord, men det er berre $freeSize att.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Systemfilveljaren er borte eller avslegen. Slå han på og røyn om att.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Denne gjerda er ustødd for ting av fylgjande slag: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Somme filer i målmappa har same namn.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Somme filer har same namn.'; + + @override + String get addShortcutDialogLabel => 'Snarvegsmerke'; + + @override + String get addShortcutButtonLabel => 'LEGG TIL'; + + @override + String get noMatchingAppDialogMessage => 'Ingen appar kan handsame dette.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Flytt desse $count tinga til papirkorga?', + one: 'Flytt denne tingen til papirkorga?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Slett desse $count tinga?', + one: 'Slett denne tingen?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Spar datoane til tinga før du går vidare?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Spar datoar'; + + @override + String videoResumeDialogMessage(String time) { + return 'Hald fram avspeling ifrå $time?'; + } + + @override + String get videoStartOverButtonLabel => 'BYRJA OM ATT'; + + @override + String get videoResumeButtonLabel => 'HALD FRAM'; + + @override + String get setCoverDialogLatest => 'Nyaste ting'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Eiget'; + + @override + String get hideFilterConfirmationDialogMessage => 'Samsvarande bilete og videoar vil verte skjult ifrå samlinga di. Du kan visa dei att ifrå «Personvern»-innstillingane.\n\nEr du sikker på at du vil skjule dei?'; + + @override + String get newAlbumDialogTitle => 'Nytt Album'; + + @override + String get newAlbumDialogNameLabel => 'Albumsnamn'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Mappa finst alt'; + + @override + String get newAlbumDialogStorageLabel => 'Gøyme:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Ting i kvelva er berre tilgjengelege for denne appen.\n\nOm du slettar denne appen eller tømmer dataa til denne appen, vil du missa alt som er i kvelva.'; + + @override + String get newVaultDialogTitle => 'Nytt kvelv'; + + @override + String get configureVaultDialogTitle => 'Set opp kvelvet'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lås når skjermen slår seg av'; + + @override + String get vaultDialogLockTypeLabel => 'Låseslag'; + + @override + String get patternDialogEnter => 'Stryk inn eit mønster'; + + @override + String get patternDialogConfirm => 'Stadfest mønsteret'; + + @override + String get pinDialogEnter => 'Skriv inn ein talkode'; + + @override + String get pinDialogConfirm => 'Stadfest talkoden'; + + @override + String get passwordDialogEnter => 'Skriv inn passordet'; + + @override + String get passwordDialogConfirm => 'Stadfest passordet'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Nokre kvelv nyttar papirkorga.'; + + @override + String get renameAlbumDialogLabel => 'Nytt namn'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Mappa finst alt'; + + @override + String get renameEntrySetPageTitle => 'Byt namn'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Namngjevingsmønster'; + + @override + String get renameEntrySetPageInsertTooltip => 'Innskrivingsområde'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Førehandsvis'; + + @override + String get renameProcessorCounter => 'Teljar'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Namn'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Slett dette albumet og dei $count tinga i det?', + one: 'Slett dette albumet og tingen i det?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Slett desse albuma og deira $count ting?', + one: 'Slett desse albuma og deira ting?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Breidd'; + + @override + String get exportEntryDialogHeight => 'Høgd'; + + @override + String get exportEntryDialogQuality => 'Kvalitet'; + + @override + String get exportEntryDialogWriteMetadata => 'Tak med metadata'; + + @override + String get renameEntryDialogLabel => 'Nytt namn'; + + @override + String get editEntryDialogCopyFromItem => 'Kopier ifrå annan ting'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Område å brigde'; + + @override + String get editEntryDateDialogTitle => 'Dato og tid'; + + @override + String get editEntryDateDialogSetCustom => 'Vel dato å setja'; + + @override + String get editEntryDateDialogCopyField => 'Kopier ifrå annan dato'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Tak ut ifrå namn'; + + @override + String get editEntryDateDialogShift => 'Skyv'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Filbrigdedato'; + + @override + String get durationDialogHours => 'Timar'; + + @override + String get durationDialogMinutes => 'Minutt'; + + @override + String get durationDialogSeconds => 'Sekund'; + + @override + String get editEntryLocationDialogTitle => 'Stadsetjing'; + + @override + String get editEntryLocationDialogSetCustom => 'Set eiga stadsetjing'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Vel på kartet'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Breiddegrad'; + + @override + String get editEntryLocationDialogLongitude => 'Lengdegrad'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Nytt denne stadsetjinga'; + + @override + String get editEntryRatingDialogTitle => 'Omdøme'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadataborttaking'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'Meir'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP er turvt for å kunne spela av videoen inni rørslebilete.\n\nEr du viss på at du vil ta det bort?'; + + @override + String get videoSpeedDialogLabel => 'Avspelingssnøggleik'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Ljod'; + + @override + String get videoStreamSelectionDialogText => 'Undertekster'; + + @override + String get videoStreamSelectionDialogOff => 'Av'; + + @override + String get videoStreamSelectionDialogTrack => 'Spor'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Det er ingen andre spor.'; + + @override + String get genericSuccessFeedback => 'Ferdig'; + + @override + String get genericFailureFeedback => 'Mislykka'; + + @override + String get genericDangerWarningDialogMessage => 'Er du viss?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Røyn att med færre ting.'; + + @override + String get menuActionConfigureView => 'Vis'; + + @override + String get menuActionSelect => 'Vel'; + + @override + String get menuActionSelectAll => 'Vel alle'; + + @override + String get menuActionSelectNone => 'Tak bort val'; + + @override + String get menuActionMap => 'Kart'; + + @override + String get menuActionSlideshow => 'Ljosbiletevising'; + + @override + String get menuActionStats => 'Samandrag'; + + @override + String get viewDialogSortSectionTitle => 'Sort'; + + @override + String get viewDialogGroupSectionTitle => 'Hop'; + + @override + String get viewDialogLayoutSectionTitle => 'Oppsett'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mosaikk'; + + @override + String get tileLayoutGrid => 'Rutenett'; + + @override + String get tileLayoutList => 'Liste'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Omslag'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Let'; + + @override + String get appPickDialogTitle => 'Vel app'; + + @override + String get appPickDialogNone => 'Ingen'; + + @override + String get aboutPageTitle => 'Om'; + + @override + String get aboutLinkLicense => 'Løyve'; + + @override + String get aboutLinkPolicy => 'Personvernutsegn'; + + @override + String get aboutBugSectionTitle => 'Mistakrapport'; + + @override + String get aboutBugSaveLogInstruction => 'Spar apploggar til ei fil'; + + @override + String get aboutBugCopyInfoInstruction => 'Kopier systemopplysingar'; + + @override + String get aboutBugCopyInfoButton => 'Kopier'; + + @override + String get aboutBugReportInstruction => 'Rapporter på GitHub med loggføringene og systemopplysingane dine'; + + @override + String get aboutBugReportButton => 'Rapporter'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Credits'; + + @override + String get aboutCreditsWorldAtlas1 => 'Denne appen nyttar ei TopoJSON-fil ifrå'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC-løyve.'; + + @override + String get aboutTranslatorsSectionTitle => 'Omsetjarar'; + + @override + String get aboutLicensesSectionTitle => 'Løyve til opne kjeldekodar'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter-tillegg'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter-pakker'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart-pakker'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Vis alle løyve'; + + @override + String get policyPageTitle => 'Personvernutsegn'; + + @override + String get collectionPageTitle => 'Samling'; + + @override + String get collectionPickPageTitle => 'Vel'; + + @override + String get collectionSelectPageTitle => 'Vel ting'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Legg til snarveg'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Tøm papirkorga'; + + @override + String get collectionActionCopy => 'Kopier til album'; + + @override + String get collectionActionMove => 'Flytt til album'; + + @override + String get collectionActionRescan => 'Gjennomsøk att'; + + @override + String get collectionActionEdit => 'Brigd'; + + @override + String get collectionSearchTitlesHintText => 'Søk etter namn'; + + @override + String get collectionGroupAlbum => 'Etter album'; + + @override + String get collectionGroupMonth => 'Etter månad'; + + @override + String get collectionGroupDay => 'Etter dag'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Ukjend'; + + @override + String get dateToday => 'I dag'; + + @override + String get dateYesterday => 'I går'; + + @override + String get dateThisMonth => 'Denne månaden'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kunne ikkje slette $count ting', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kunne ikkje kopiera $count ting', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kunne ikkje flytta $count ting', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kunne ikkje byta namn på $count ting', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kunne ikkje brigde $count ting', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Greidde ikkje å føra ut $count sider', + one: 'Greidde ikkje å føra ut 1 side', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kopierte $count ting', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Flytte $count ting', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Bytte namna til $count ting', + one: 'Bytte namnet til 1 ting', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Brigda $count ting', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Det du likar vert vist her'; + + @override + String get collectionEmptyVideos => 'Ingen videoar'; + + @override + String get collectionEmptyImages => 'Ingen bilete'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Gje tilgjenge'; + + @override + String get collectionSelectSectionTooltip => 'Vel utvalet'; + + @override + String get collectionDeselectSectionTooltip => 'Fråvel utvalet'; + + @override + String get drawerAboutButton => 'Om'; + + @override + String get drawerSettingsButton => 'Innstillingar'; + + @override + String get drawerCollectionAll => 'Alle samlingar'; + + @override + String get drawerCollectionFavourites => 'Likte'; + + @override + String get drawerCollectionImages => 'Bilete'; + + @override + String get drawerCollectionVideos => 'Videoar'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Rørslebilete'; + + @override + String get drawerCollectionPanoramas => 'Panorama'; + + @override + String get drawerCollectionRaws => 'Rå bilete'; + + @override + String get drawerCollectionSphericalVideos => '360°-videoar'; + + @override + String get drawerAlbumPage => 'Album'; + + @override + String get drawerCountryPage => 'Land'; + + @override + String get drawerPlacePage => 'Stadar'; + + @override + String get drawerTagPage => 'Merke'; + + @override + String get sortByDate => 'Etter dato'; + + @override + String get sortByName => 'Etter namn'; + + @override + String get sortByItemCount => 'Etter mengd ting'; + + @override + String get sortBySize => 'Etter storleik'; + + @override + String get sortByAlbumFileName => 'Etter album og filnamn'; + + @override + String get sortByRating => 'Etter omdøme'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Nyaste først'; + + @override + String get sortOrderOldestFirst => 'Eldste først'; + + @override + String get sortOrderAtoZ => 'A-Å'; + + @override + String get sortOrderZtoA => 'Å-A'; + + @override + String get sortOrderHighestFirst => 'Høgste først'; + + @override + String get sortOrderLowestFirst => 'Lægste først'; + + @override + String get sortOrderLargestFirst => 'Største først'; + + @override + String get sortOrderSmallestFirst => 'Smæste først'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'Etter nivå'; + + @override + String get albumGroupType => 'Etter slag'; + + @override + String get albumGroupVolume => 'Etter gøymestad'; + + @override + String get albumMimeTypeMixed => 'Blanda'; + + @override + String get albumPickPageTitleCopy => 'Kopier til album'; + + @override + String get albumPickPageTitleExport => 'Før ut til album'; + + @override + String get albumPickPageTitleMove => 'Flytt til album'; + + @override + String get albumPickPageTitlePick => 'Vel album'; + + @override + String get albumCamera => 'Kamera'; + + @override + String get albumDownload => 'Hent'; + + @override + String get albumScreenshots => 'Skjermbilete'; + + @override + String get albumScreenRecordings => 'Skjermopptak'; + + @override + String get albumVideoCaptures => 'Videoopptak'; + + @override + String get albumPageTitle => 'Album'; + + @override + String get albumEmpty => 'Ingen album'; + + @override + String get createAlbumButtonLabel => 'LAG'; + + @override + String get newFilterBanner => 'ny'; + + @override + String get countryPageTitle => 'Land'; + + @override + String get countryEmpty => 'Ingen land'; + + @override + String get statePageTitle => 'Landsdelar'; + + @override + String get stateEmpty => 'Ingen landsdelar'; + + @override + String get placePageTitle => 'Stadar'; + + @override + String get placeEmpty => 'Ingen stadar'; + + @override + String get tagPageTitle => 'Merke'; + + @override + String get tagEmpty => 'Ingen merke'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Papirkorga'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Søk i samlinga'; + + @override + String get searchRecentSectionTitle => 'Nylege'; + + @override + String get searchDateSectionTitle => 'Dato'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Album'; + + @override + String get searchCountriesSectionTitle => 'Land'; + + @override + String get searchStatesSectionTitle => 'Landsdelar'; + + @override + String get searchPlacesSectionTitle => 'Stadar'; + + @override + String get searchTagsSectionTitle => 'Merke'; + + @override + String get searchRatingSectionTitle => 'Omdøme'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Innstillingar'; + + @override + String get settingsSystemDefault => 'Systemforval'; + + @override + String get settingsDefault => 'Forval'; + + @override + String get settingsDisabled => 'Slegen av'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Spør kvar gong'; + + @override + String get settingsModificationWarningDialogMessage => 'Andre innstillingar vil brigdast.'; + + @override + String get settingsSearchFieldLabel => 'Søkjeinnstillingar'; + + @override + String get settingsSearchEmpty => 'Ingen samsvarande innstilling'; + + @override + String get settingsActionExport => 'Før ut'; + + @override + String get settingsActionExportDialogTitle => 'Før ut'; + + @override + String get settingsActionImport => 'Før inn'; + + @override + String get settingsActionImportDialogTitle => 'Før inn'; + + @override + String get appExportCovers => 'Omslag'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Likte ting'; + + @override + String get appExportSettings => 'Innstillingar'; + + @override + String get settingsNavigationSectionTitle => 'Finn fram'; + + @override + String get settingsHomeTile => 'Heim'; + + @override + String get settingsHomeDialogTitle => 'Heim'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Hald skjermen slegen på'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Hald skjermen slegen på'; + + @override + String get settingsDoubleBackExit => 'Trykk «Attende» to gongar for å gå ut av appen'; + + @override + String get settingsConfirmationTile => 'Stadfestingsvindaugo'; + + @override + String get settingsConfirmationDialogTitle => 'Stadfestingsvindaugo'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Verta spurd før du slettar noko for godt'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Verta spurd før du kastar ting i papirkorga'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Verta spurd før du flyttar på ting utan dato'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Verta spurd om du vil angre etter å ha kasta ting i søppelkorga'; + + @override + String get settingsConfirmationVaultDataLoss => 'Åtvar om datatap ved kvelvet'; + + @override + String get settingsNavigationDrawerTile => 'Framfinningsmenyen'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Framfinningsmenyen'; + + @override + String get settingsNavigationDrawerBanner => 'Trykk og hald for å flytta og brigde rekkjefylgda til menytinga.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Slag'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Album'; + + @override + String get settingsNavigationDrawerTabPages => 'Sider'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Legg til album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Småbilete'; + + @override + String get settingsThumbnailOverlayTile => 'Overlag'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlag'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Vis likt-ikon'; + + @override + String get settingsThumbnailShowTagIcon => 'Vis merke-ikon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Vis stad-ikon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Vis rørslebilete-ikon'; + + @override + String get settingsThumbnailShowRating => 'Vis omdøme'; + + @override + String get settingsThumbnailShowRawIcon => 'Vis rå-ikon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Vis videolengd'; + + @override + String get settingsCollectionQuickActionsTile => 'Kvikkgjerder'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Kvikkgjerder'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Gjennomsyn'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Veljing'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Trykk og hald for å flytta knappane og velja kva for slags gjerder som skal visast når du ser igjennom ting.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Trykk og hald for å flytta knappane og velja kva for slags gjerder som skal visast når du vel ting.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Attkjenning av seriebilete'; + + @override + String get settingsCollectionBurstPatternsNone => 'Ingen'; + + @override + String get settingsViewerSectionTitle => 'Visinga'; + + @override + String get settingsViewerGestureSideTapNext => 'Trykk på skjermkantane for å visa førre/neste ting'; + + @override + String get settingsViewerUseCutout => 'Nytt utklipt område'; + + @override + String get settingsViewerMaximumBrightness => 'Full ljosstyrke'; + + @override + String get settingsMotionPhotoAutoPlay => 'Spel av rørslebilete sjølvverkande'; + + @override + String get settingsImageBackground => 'Biletbakgrunn'; + + @override + String get settingsViewerQuickActionsTile => 'Kvikkgjerder'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Kvikkgjerder'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Trykk og hald for å flytta knappane og velja kva for slags gjerder som skal visast i visinga.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Viste knappar'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Tilgjengelege knappar'; + + @override + String get settingsViewerQuickActionEmpty => 'Ingen knappar'; + + @override + String get settingsViewerOverlayTile => 'Overlag'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlag'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Vis ved opning'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Vis småkart'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Vis opplysingar'; + + @override + String get settingsViewerShowInformationSubtitle => 'Vis namn, dato, stad, osv …'; + + @override + String get settingsViewerShowRatingTags => 'Vis omdøme og merke'; + + @override + String get settingsViewerShowShootingDetails => 'Vis biletetakingsopplysingar'; + + @override + String get settingsViewerShowDescription => 'Vis utgreiingar'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Vis småbilete'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Uskarp verknad'; + + @override + String get settingsViewerSlideshowTile => 'Ljosbiletevising'; + + @override + String get settingsViewerSlideshowPageTitle => 'Ljosbiletevising'; + + @override + String get settingsSlideshowRepeat => 'Gjentak'; + + @override + String get settingsSlideshowShuffle => 'Bland'; + + @override + String get settingsSlideshowFillScreen => 'Fyll skjermen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Overgang'; + + @override + String get settingsSlideshowIntervalTile => 'Byt til neste etter'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Videoavspeling'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Videoavspeling'; + + @override + String get settingsVideoPageTitle => 'Videoinnstillingar'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Vis videoar'; + + @override + String get settingsVideoPlaybackTile => 'Avspeling'; + + @override + String get settingsVideoPlaybackPageTitle => 'Avspeling'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Auk ytinga med maskinvara'; + + @override + String get settingsVideoAutoPlay => 'Spel av med ein gong'; + + @override + String get settingsVideoLoopModeTile => 'Gjentak'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Gjentak'; + + @override + String get settingsVideoResumptionModeTile => 'Spel av der du slapp'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Spel av der du slapp'; + + @override + String get settingsVideoBackgroundMode => 'Spel av i bakgrunnen'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Spel av i bakgrunnen'; + + @override + String get settingsVideoControlsTile => 'Styring'; + + @override + String get settingsVideoControlsPageTitle => 'Styring'; + + @override + String get settingsVideoButtonsTile => 'Knappar'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Dobbeltrykk for å spela/stansa'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Dobbeltrykk på skjermkantane for å hoppe framover/bakover'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Dra opp eller ned for å brigde ljos-/ljodstyrken'; + + @override + String get settingsSubtitleThemeTile => 'Undertekster'; + + @override + String get settingsSubtitleThemePageTitle => 'Undertekster'; + + @override + String get settingsSubtitleThemeSample => 'Dette er eit døme.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Tekststilling'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Tekststilling'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Tekststad'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Tekststad'; + + @override + String get settingsSubtitleThemeTextSize => 'Tekststorleik'; + + @override + String get settingsSubtitleThemeShowOutline => 'Vis omriss og skuggar'; + + @override + String get settingsSubtitleThemeTextColor => 'Tekstleten'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Tekstgjennomsyn'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Bakgrunnsleten'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Bakgrunnsgjennomsyn'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Venstre'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Midten'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Høgre'; + + @override + String get settingsPrivacySectionTitle => 'Personvern'; + + @override + String get settingsAllowInstalledAppAccess => 'Gje tilgjenge til lista over innlagde appar'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Vert nytta til å betre albumsvisinga'; + + @override + String get settingsAllowErrorReporting => 'Send inn anonyme feilrapportar'; + + @override + String get settingsSaveSearchHistory => 'Spar søkjehistorikken'; + + @override + String get settingsEnableBin => 'Nytt papirkorga'; + + @override + String get settingsEnableBinSubtitle => 'Sparar på sletta ting i 30 dagar'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Ting i papirkorga vil slettast for godt.'; + + @override + String get settingsAllowMediaManagement => 'La få handsame medium'; + + @override + String get settingsHiddenItemsTile => 'Skjulte ting'; + + @override + String get settingsHiddenItemsPageTitle => 'Skjulte ting'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Gøymetilgjenge'; + + @override + String get settingsStorageAccessPageTitle => 'Gøymetilgjenge'; + + @override + String get settingsStorageAccessBanner => 'Nokre mapper krev at du gjev appen tilgjenge til dei for å brigde filer i dei. Du kan sjå på mappene som du har gjeve appen tilgjenge til her.'; + + @override + String get settingsStorageAccessEmpty => 'Ingen gjevne tilgjenge'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Fråta'; + + @override + String get settingsAccessibilitySectionTitle => 'Tilgjenge'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Tid for å gjera'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Vis andre utvegar for fleirtrykkhandvendingar'; + + @override + String get settingsDisplaySectionTitle => 'Vising'; + + @override + String get settingsThemeBrightnessTile => 'Ham'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Ham'; + + @override + String get settingsThemeColorHighlights => 'Léta framhevjingar'; + + @override + String get settingsThemeEnableDynamicColor => 'Skiftande let'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Rørslejamleiken til skjermen'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Rørslejamleik'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV-grensesnitt'; + + @override + String get settingsLanguageSectionTitle => 'Skriftmål og format'; + + @override + String get settingsLanguageTile => 'Skriftmål'; + + @override + String get settingsLanguagePageTitle => 'Skriftmål'; + + @override + String get settingsCoordinateFormatTile => 'Koordinatformat'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Koordinatformat'; + + @override + String get settingsUnitSystemTile => 'Einingar'; + + @override + String get settingsUnitSystemDialogTitle => 'Einingar'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Skjermsparar'; + + @override + String get settingsWidgetPageTitle => 'Bileteramme'; + + @override + String get settingsWidgetShowOutline => 'Omrit'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Vist ting'; + + @override + String get settingsCollectionTile => 'Samling'; + + @override + String get statsPageTitle => 'Samandrag'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count ting med stadsetjing', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Toppland'; + + @override + String get statsTopStatesSectionTitle => 'Topplandsdelar'; + + @override + String get statsTopPlacesSectionTitle => 'Toppstadar'; + + @override + String get statsTopTagsSectionTitle => 'Toppmerke'; + + @override + String get statsTopAlbumsSectionTitle => 'Topp-album'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPNE PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET SOM BAKGRUNNSBILETE'; + + @override + String get viewerErrorUnknown => 'Oida.'; + + @override + String get viewerErrorDoesNotExist => 'Fila finst ikkje meir.'; + + @override + String get viewerInfoPageTitle => 'Opplysingar'; + + @override + String get viewerInfoBackToViewerTooltip => 'Attende til vising'; + + @override + String get viewerInfoUnknown => 'ukjend'; + + @override + String get viewerInfoLabelDescription => 'Utgreiing'; + + @override + String get viewerInfoLabelTitle => 'Namn'; + + @override + String get viewerInfoLabelDate => 'Dato'; + + @override + String get viewerInfoLabelResolution => 'Oppløysing'; + + @override + String get viewerInfoLabelSize => 'Storleik'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Sti'; + + @override + String get viewerInfoLabelDuration => 'Lengd'; + + @override + String get viewerInfoLabelOwner => 'Eigar'; + + @override + String get viewerInfoLabelCoordinates => 'Koordinatar'; + + @override + String get viewerInfoLabelAddress => 'Adresse'; + + @override + String get mapStyleDialogTitle => 'Kartstil'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Vel kartstil'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Auk'; + + @override + String get mapZoomOutTooltip => 'Mink'; + + @override + String get mapPointNorthUpTooltip => 'Rett opp'; + + @override + String get mapAttributionOsmData => 'Kartdata © [OpenStreetMap](https://www.openstreetmap.org/copyright)-medverkarar'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Fliser av [HOT](https://www.hotosm.org/) • Hust av [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Fliser av [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Vis på kartsida'; + + @override + String get mapEmptyRegion => 'Ingen bilete i dette området'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Greidde ikkje å pakke ut innbygde data'; + + @override + String get viewerInfoOpenLinkText => 'Opne'; + + @override + String get viewerInfoViewXmlLinkText => 'Vis XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Søk metadata'; + + @override + String get viewerInfoSearchEmpty => 'Ingen samsvarande lyklar'; + + @override + String get viewerInfoSearchSuggestionDate => 'Dato og tid'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Utgreiing'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Oppløysing'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rettar'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Brigd merke'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Nytt merke'; + + @override + String get tagEditorPageAddTagTooltip => 'Legg til merke'; + + @override + String get tagEditorSectionRecent => 'Nyleg'; + + @override + String get tagEditorSectionPlaceholders => 'Førebels'; + + @override + String get tagEditorDiscardDialogMessage => 'Vil du avvisa brigda?'; + + @override + String get tagPlaceholderCountry => 'Land'; + + @override + String get tagPlaceholderState => 'Landsdel'; + + @override + String get tagPlaceholderPlace => 'Stad'; + + @override + String get panoramaEnableSensorControl => 'Slå på sensorstyring'; + + @override + String get panoramaDisableSensorControl => 'Slå av sensorstyring'; + + @override + String get sourceViewerPageTitle => 'Kjelde'; +} diff --git a/lib/l10ngen/app_localizations_or.dart b/lib/l10ngen/app_localizations_or.dart new file mode 100644 index 0000000..2f9c4f4 --- /dev/null +++ b/lib/l10ngen/app_localizations_or.dart @@ -0,0 +1,2424 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Oriya (`or`). +class AppLocalizationsOr extends AppLocalizations { + AppLocalizationsOr([String locale = 'or']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Welcome to Aves'; + + @override + String get welcomeOptional => 'ଵୈକଳ୍ପିକ'; + + @override + String get welcomeTermsToggle => 'I agree to the terms and conditions'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items', + one: '$countString item', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString columns', + one: '$countString column', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString seconds', + one: '$countString second', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutes', + one: '$countString minute', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString days', + one: '$countString day', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APPLY'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'DELETE'; + + @override + String get nextButtonLabel => 'NEXT'; + + @override + String get showButtonLabel => 'ଦେଖାଅ'; + + @override + String get hideButtonLabel => 'ଲୁଚାଅ'; + + @override + String get continueButtonLabel => 'CONTINUE'; + + @override + String get saveCopyButtonLabel => 'SAVE COPY'; + + @override + String get applyTooltip => 'Apply'; + + @override + String get cancelTooltip => 'Cancel'; + + @override + String get changeTooltip => 'Change'; + + @override + String get clearTooltip => 'Clear'; + + @override + String get previousTooltip => 'Previous'; + + @override + String get nextTooltip => 'Next'; + + @override + String get showTooltip => 'ଦେଖାଅ'; + + @override + String get hideTooltip => 'ଲୁଚାଅ'; + + @override + String get actionRemove => 'Remove'; + + @override + String get resetTooltip => 'Reset'; + + @override + String get saveTooltip => 'Save'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'Pick'; + + @override + String get doubleBackExitMessage => 'Tap “back” again to exit.'; + + @override + String get doNotAskAgain => 'Do not ask again'; + + @override + String get sourceStateLoading => 'Loading'; + + @override + String get sourceStateCataloguing => 'Cataloguing'; + + @override + String get sourceStateLocatingCountries => 'Locating countries'; + + @override + String get sourceStateLocatingPlaces => 'Locating places'; + + @override + String get chipActionDelete => 'Delete'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Show in Collection'; + + @override + String get chipActionGoToAlbumPage => 'Show in Albums'; + + @override + String get chipActionGoToCountryPage => 'Show in Countries'; + + @override + String get chipActionGoToPlacePage => 'Show in Places'; + + @override + String get chipActionGoToTagPage => 'Show in Tags'; + + @override + String get chipActionGoToExplorerPage => 'Show in Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Filter out'; + + @override + String get chipActionFilterIn => 'Filter in'; + + @override + String get chipActionHide => 'Hide'; + + @override + String get chipActionLock => 'Lock'; + + @override + String get chipActionPin => 'Pin to top'; + + @override + String get chipActionUnpin => 'Unpin from top'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Rename'; + + @override + String get chipActionSetCover => 'Set cover'; + + @override + String get chipActionShowCountryStates => 'Show states'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Create album'; + + @override + String get chipActionCreateVault => 'Create vault'; + + @override + String get chipActionConfigureVault => 'Configure vault'; + + @override + String get entryActionCopyToClipboard => 'Copy to clipboard'; + + @override + String get entryActionDelete => 'Delete'; + + @override + String get entryActionConvert => 'Convert'; + + @override + String get entryActionExport => 'ରପ୍ତାନି'; + + @override + String get entryActionInfo => 'ସୂଚନା'; + + @override + String get entryActionRename => 'ନାମ ବଦଳାନ୍ତୁ'; + + @override + String get entryActionRestore => 'Restore'; + + @override + String get entryActionRotateCCW => 'Rotate counterclockwise'; + + @override + String get entryActionRotateCW => 'Rotate clockwise'; + + @override + String get entryActionFlip => 'Flip horizontally'; + + @override + String get entryActionPrint => 'Print'; + + @override + String get entryActionShare => 'Share'; + + @override + String get entryActionShareImageOnly => 'Share image only'; + + @override + String get entryActionShareVideoOnly => 'Share video only'; + + @override + String get entryActionViewSource => 'View source'; + + @override + String get entryActionShowGeoTiffOnMap => 'Show as map overlay'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convert to still image'; + + @override + String get entryActionViewMotionPhotoVideo => 'Open video'; + + @override + String get entryActionEdit => 'ସମ୍ପାଦନା'; + + @override + String get entryActionOpen => 'Open with'; + + @override + String get entryActionSetAs => 'Set as'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Show in map app'; + + @override + String get entryActionRotateScreen => 'Rotate screen'; + + @override + String get entryActionAddFavourite => 'Add to favorites'; + + @override + String get entryActionRemoveFavourite => 'Remove from favorites'; + + @override + String get videoActionCaptureFrame => 'Capture frame'; + + @override + String get videoActionMute => 'Mute'; + + @override + String get videoActionUnmute => 'Unmute'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Play'; + + @override + String get videoActionReplay10 => 'Seek backward 10 seconds'; + + @override + String get videoActionSkip10 => 'Seek forward 10 seconds'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Select tracks'; + + @override + String get videoActionSetSpeed => 'Playback speed'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Settings'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Resume'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'Edit date & time'; + + @override + String get entryInfoActionEditLocation => 'Edit location'; + + @override + String get entryInfoActionEditTitleDescription => 'Edit title & description'; + + @override + String get entryInfoActionEditRating => 'Edit rating'; + + @override + String get entryInfoActionEditTags => 'Edit tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Remove metadata'; + + @override + String get entryInfoActionExportMetadata => 'Export metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Remove location'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Crop'; + + @override + String get editorTransformRotate => 'Rotate'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landscape'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Recycle bin'; + + @override + String get filterFavouriteLabel => 'Favorite'; + + @override + String get filterNoDateLabel => 'Undated'; + + @override + String get filterNoAddressLabel => 'No address'; + + @override + String get filterLocatedLabel => 'Located'; + + @override + String get filterNoLocationLabel => 'Unlocated'; + + @override + String get filterNoRatingLabel => 'Unrated'; + + @override + String get filterTaggedLabel => 'Tagged'; + + @override + String get filterNoTagLabel => 'Untagged'; + + @override + String get filterNoTitleLabel => 'Untitled'; + + @override + String get filterOnThisDayLabel => 'On this day'; + + @override + String get filterRecentlyAddedLabel => 'Recently added'; + + @override + String get filterRatingRejectedLabel => 'Rejected'; + + @override + String get filterTypeAnimatedLabel => 'Animated'; + + @override + String get filterTypeMotionPhotoLabel => 'Motion Photo'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Image'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'New'; + + @override + String get albumTierPinned => 'Pinned'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Common'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Others'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimal degrees'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'ଉ'; + + @override + String get coordinateDmsSouth => 'ଦ'; + + @override + String get coordinateDmsEast => 'ପୂ'; + + @override + String get coordinateDmsWest => 'ପ'; + + @override + String get displayRefreshRatePreferHighest => 'Highest rate'; + + @override + String get displayRefreshRatePreferLowest => 'Lowest rate'; + + @override + String get keepScreenOnNever => 'Never'; + + @override + String get keepScreenOnVideoPlayback => 'During video playback'; + + @override + String get keepScreenOnViewerOnly => 'Viewer page only'; + + @override + String get keepScreenOnAlways => 'Always'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Never'; + + @override + String get maxBrightnessAlways => 'Always'; + + @override + String get nameConflictStrategyRename => 'ନାମ ବଦଳାନ୍ତୁ'; + + @override + String get nameConflictStrategyReplace => 'Replace'; + + @override + String get nameConflictStrategySkip => 'ବାଦ୍ ଦିଅ'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Top'; + + @override + String get subtitlePositionBottom => 'Bottom'; + + @override + String get themeBrightnessLight => 'ହାଲୁକା'; + + @override + String get themeBrightnessDark => 'ଗାଢ଼'; + + @override + String get themeBrightnessBlack => 'କଳା'; + + @override + String get unitSystemMetric => 'Metric'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'ପାସ୍‍ୱର୍ଡ଼'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Open with other player'; + + @override + String get videoLoopModeNever => 'Never'; + + @override + String get videoLoopModeShortOnly => 'Short videos only'; + + @override + String get videoLoopModeAlways => 'Always'; + + @override + String get videoPlaybackSkip => 'ବାଦ୍ ଦିଅ'; + + @override + String get videoPlaybackMuted => 'Play muted'; + + @override + String get videoPlaybackWithSound => 'Play with sound'; + + @override + String get videoResumptionModeNever => 'Never'; + + @override + String get videoResumptionModeAlways => 'Always'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'None'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'Random'; + + @override + String get widgetDisplayedItemMostRecent => 'Most recent'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internal storage'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Some files have the same name.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'ଯୋଡ଼ନ୍ତୁ'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Save dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OVER'; + + @override + String get videoResumeButtonLabel => 'RESUME'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'ସ୍ୱତଃ'; + + @override + String get setCoverDialogCustom => 'Custom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'New Album'; + + @override + String get newAlbumDialogNameLabel => 'Album name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'Storage:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'ନୂଆ ନାମ'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'ନାମ ବଦଳାନ୍ତୁ'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insert field'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'ପୂର୍ଵାଵଲୋକନ'; + + @override + String get renameProcessorCounter => 'Counter'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'ନାମ'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete this album and the $countString items in it?', + one: 'Delete this album and the item in it?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these albums and the $countString items in them?', + one: 'Delete these albums and the item in them?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Width'; + + @override + String get exportEntryDialogHeight => 'Height'; + + @override + String get exportEntryDialogQuality => 'Quality'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'ନୂଆ ନାମ'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'Date & Time'; + + @override + String get editEntryDateDialogSetCustom => 'Set custom date'; + + @override + String get editEntryDateDialogCopyField => 'Copy from other date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'File modified date'; + + @override + String get durationDialogHours => 'ଘଣ୍ଟା'; + + @override + String get durationDialogMinutes => 'ମିନିଟ୍'; + + @override + String get durationDialogSeconds => 'ସେକେଣ୍ଡ'; + + @override + String get editEntryLocationDialogTitle => 'Location'; + + @override + String get editEntryLocationDialogSetCustom => 'Set custom location'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Choose on map'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'ଅକ୍ଷାଂଶ'; + + @override + String get editEntryLocationDialogLongitude => 'ଦ୍ରାଘିମା'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Use this location'; + + @override + String get editEntryRatingDialogTitle => 'Rating'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'ଅଧିକ'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'Playback speed'; + + @override + String get videoStreamSelectionDialogVideo => 'ଵିଡ଼ିଓ'; + + @override + String get videoStreamSelectionDialogAudio => 'ଅଡ଼ିଓ'; + + @override + String get videoStreamSelectionDialogText => 'Subtitles'; + + @override + String get videoStreamSelectionDialogOff => 'ବନ୍ଦ'; + + @override + String get videoStreamSelectionDialogTrack => 'Track'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'ହୋଇଗଲା!'; + + @override + String get genericFailureFeedback => 'Failed'; + + @override + String get genericDangerWarningDialogMessage => 'Are you sure?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'View'; + + @override + String get menuActionSelect => 'Select'; + + @override + String get menuActionSelectAll => 'Select all'; + + @override + String get menuActionSelectNone => 'Select none'; + + @override + String get menuActionMap => 'Map'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'ପରିସଂଖ୍ୟାନ'; + + @override + String get viewDialogSortSectionTitle => 'ସଜାନ୍ତୁ'; + + @override + String get viewDialogGroupSectionTitle => 'ଗୋଷ୍ଠୀ'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'Grid'; + + @override + String get tileLayoutList => 'List'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'ଆପ୍'; + + @override + String get coverDialogTabColor => 'ରଙ୍ଗ'; + + @override + String get appPickDialogTitle => 'Pick App'; + + @override + String get appPickDialogNone => 'None'; + + @override + String get aboutPageTitle => 'ସମ୍ବନ୍ଧରେ'; + + @override + String get aboutLinkLicense => 'License'; + + @override + String get aboutLinkPolicy => 'ଗୋପନୀୟତା ନୀତି'; + + @override + String get aboutBugSectionTitle => 'Bug Report'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copy system information'; + + @override + String get aboutBugCopyInfoButton => 'Copy'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'Report'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'ଶ୍ରେୟ'; + + @override + String get aboutCreditsWorldAtlas1 => 'This app uses a TopoJSON file from'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'ଅନୁଵାଦକ'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenses'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Show All Licenses'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'ସଂଗ୍ରହ'; + + @override + String get collectionPickPageTitle => 'Pick'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'ସମ୍ପାଦନା'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'ଅଜ୍ଞାତ'; + + @override + String get dateToday => 'ଆଜି'; + + @override + String get dateYesterday => 'ଗତକାଲି'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'ସମ୍ବନ୍ଧରେ'; + + @override + String get drawerSettingsButton => 'ସେଟିଂ'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Countries'; + + @override + String get drawerPlacePage => 'Places'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'ତାରିଖ ଅନୁଯାୟୀ'; + + @override + String get sortByName => 'ନାମ ଅନୁଯାୟୀ'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'ଆକାର ଅନୁଯାୟୀ'; + + @override + String get sortByAlbumFileName => 'By album & item title'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A ରୁ Z'; + + @override + String get sortOrderZtoA => 'Z ରୁ A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumMimeTypeMixed => 'Mixed'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'କ୍ୟାମେରା'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'CREATE'; + + @override + String get newFilterBanner => 'ନୂଆ'; + + @override + String get countryPageTitle => 'Countries'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'States'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Places'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'ତାରିଖ'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Countries'; + + @override + String get searchStatesSectionTitle => 'States'; + + @override + String get searchPlacesSectionTitle => 'Places'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Ratings'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'ସେଟିଂ'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'ଡିଫଲ୍ଟ'; + + @override + String get settingsDisabled => 'Disabled'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'ରପ୍ତାନି କରିବା'; + + @override + String get settingsActionExportDialogTitle => 'ରପ୍ତାନି'; + + @override + String get settingsActionImport => 'ଆମଦାନୀ କରିବା'; + + @override + String get settingsActionImportDialogTitle => 'ଆମଦାନୀ'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'ସେଟିଂ'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'ଗୃହ'; + + @override + String get settingsHomeDialogTitle => 'ଗୃହ'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'ସୂଚନା ଦେଖାଅ'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'ଵର୍ଣ୍ଣନା ଦେଖାଅ'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'ଵିଡ଼ିଓ'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_pl.dart b/lib/l10ngen/app_localizations_pl.dart new file mode 100644 index 0000000..70da994 --- /dev/null +++ b/lib/l10ngen/app_localizations_pl.dart @@ -0,0 +1,2384 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Polish (`pl`). +class AppLocalizationsPl extends AppLocalizations { + AppLocalizationsPl([String locale = 'pl']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Witaj w Aves'; + + @override + String get welcomeOptional => 'Opcjonalnie'; + + @override + String get welcomeTermsToggle => 'Akceptuję warunki i zasady'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementów', + few: '$count elementy', + one: '$count element', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count rzędów', + few: '$count rzędy', + one: '$count rząd', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString sekund', + few: '$countString sekundy', + one: '$countString sekunda', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minut', + few: '$countString minuty', + one: '$countString minuta', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString dni', + few: '$countString dni', + one: '$countString dzień', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'ZASTOSUJ'; + + @override + String get createButtonLabel => 'UTWÓRZ'; + + @override + String get deleteButtonLabel => 'USUŃ'; + + @override + String get nextButtonLabel => 'NASTĘPNY'; + + @override + String get showButtonLabel => 'POKAŻ'; + + @override + String get hideButtonLabel => 'UKRYJ'; + + @override + String get continueButtonLabel => 'KONTYNUUJ'; + + @override + String get saveCopyButtonLabel => 'ZAPISZ KOPIĘ'; + + @override + String get applyTooltip => 'Zastosuj'; + + @override + String get cancelTooltip => 'Anuluj'; + + @override + String get changeTooltip => 'Zmień'; + + @override + String get clearTooltip => 'Wyczyść'; + + @override + String get previousTooltip => 'Poprzedni'; + + @override + String get nextTooltip => 'Następny'; + + @override + String get showTooltip => 'Pokaż'; + + @override + String get hideTooltip => 'Ukryj'; + + @override + String get actionRemove => 'Usuń'; + + @override + String get resetTooltip => 'Zresetuj'; + + @override + String get saveTooltip => 'Zapisz'; + + @override + String get stopTooltip => 'Zatrzymaj'; + + @override + String get pickTooltip => 'Wybierz'; + + @override + String get doubleBackExitMessage => 'Dotknij ponownie „wstecz”, aby wyjść.'; + + @override + String get doNotAskAgain => 'Nie pytaj ponownie'; + + @override + String get sourceStateLoading => 'Ładowanie'; + + @override + String get sourceStateCataloguing => 'Katalogowanie'; + + @override + String get sourceStateLocatingCountries => 'Lokowanie krajów'; + + @override + String get sourceStateLocatingPlaces => 'Lokalizowanie miejsc'; + + @override + String get chipActionDelete => 'Usuń'; + + @override + String get chipActionRemove => 'Usuń'; + + @override + String get chipActionShowCollection => 'Pokaż w Kolekcji'; + + @override + String get chipActionGoToAlbumPage => 'Pokaż w Albumach'; + + @override + String get chipActionGoToCountryPage => 'Pokaż w Krajach'; + + @override + String get chipActionGoToPlacePage => 'Pokaż w Miejscach'; + + @override + String get chipActionGoToTagPage => 'Pokaż w Tagach'; + + @override + String get chipActionGoToExplorerPage => 'Pokaż w przeglądarce'; + + @override + String get chipActionDecompose => 'Podziel'; + + @override + String get chipActionFilterOut => 'Odfiltruj'; + + @override + String get chipActionFilterIn => 'Filtrować'; + + @override + String get chipActionHide => 'Schowaj'; + + @override + String get chipActionLock => 'Zablokuj'; + + @override + String get chipActionPin => 'Przypnij na górze'; + + @override + String get chipActionUnpin => 'Odepnij z góry'; + + @override + String get chipActionGroup => 'Zmień grupowanie'; + + @override + String get chipActionRename => 'Zmień nazwę'; + + @override + String get chipActionSetCover => 'Ustaw okładkę'; + + @override + String get chipActionShowCountryStates => 'Pokaż stany'; + + @override + String get chipActionCreateGroup => 'Utwórz grupę'; + + @override + String get chipActionCreateAlbum => 'Utwórz album'; + + @override + String get chipActionCreateVault => 'Utwórz skarbiec'; + + @override + String get chipActionConfigureVault => 'Konfiguruj Skarbiec'; + + @override + String get entryActionCopyToClipboard => 'Skopiuj do schowka'; + + @override + String get entryActionDelete => 'Usuń'; + + @override + String get entryActionConvert => 'Konwertuj'; + + @override + String get entryActionExport => 'Eksport'; + + @override + String get entryActionInfo => 'Informacje'; + + @override + String get entryActionRename => 'Zmień nazwę'; + + @override + String get entryActionRestore => 'Przywróć'; + + @override + String get entryActionRotateCCW => 'Obróć w lewo'; + + @override + String get entryActionRotateCW => 'Obróć w prawo'; + + @override + String get entryActionFlip => 'Obróć w poziomie'; + + @override + String get entryActionPrint => 'Drukuj'; + + @override + String get entryActionShare => 'Udostępnij'; + + @override + String get entryActionShareImageOnly => 'Udostępnij tylko zdjęcia'; + + @override + String get entryActionShareVideoOnly => 'Udostępnij tylko wideo'; + + @override + String get entryActionViewSource => 'Pokaż źródło'; + + @override + String get entryActionShowGeoTiffOnMap => 'Pokaż jako nakładkę mapy'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Konwertuj na nieruchomy obraz'; + + @override + String get entryActionViewMotionPhotoVideo => 'Otwórz film'; + + @override + String get entryActionEdit => 'Edycja'; + + @override + String get entryActionOpen => 'Otwórz z'; + + @override + String get entryActionSetAs => 'Ustaw jako'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Pokaż w aplikacji mapy'; + + @override + String get entryActionRotateScreen => 'Obróć ekran'; + + @override + String get entryActionAddFavourite => 'Dodaj do ulubionych'; + + @override + String get entryActionRemoveFavourite => 'Usuń z ulubionych'; + + @override + String get videoActionCaptureFrame => 'Ramka do przechwytywania'; + + @override + String get videoActionMute => 'Wycisz'; + + @override + String get videoActionUnmute => 'Wyłącz wyciszenie'; + + @override + String get videoActionPause => 'Pauza'; + + @override + String get videoActionPlay => 'Graj'; + + @override + String get videoActionReplay10 => 'Przewiń do tyłu 10 sekund'; + + @override + String get videoActionSkip10 => 'Przewiń do przodu 10 sekund'; + + @override + String get videoActionShowPreviousFrame => 'Pokaż poprzednią klatkę'; + + @override + String get videoActionShowNextFrame => 'Pokaż kolejną klatkę'; + + @override + String get videoActionSelectStreams => 'Wybierz ścieżki'; + + @override + String get videoActionSetSpeed => 'Prędkość odtwarzania'; + + @override + String get videoActionABRepeat => 'Powtarzanie A-B'; + + @override + String get videoRepeatActionSetStart => 'Ustaw początek'; + + @override + String get videoRepeatActionSetEnd => 'Ustaw koniec'; + + @override + String get viewerActionSettings => 'Ustawienia'; + + @override + String get viewerActionLock => 'Zablokuj przeglądarkę'; + + @override + String get viewerActionUnlock => 'Odblokuj przeglądarkę'; + + @override + String get slideshowActionResume => 'Wznów'; + + @override + String get slideshowActionShowInCollection => 'Pokaż w Kolekcji'; + + @override + String get entryInfoActionEditDate => 'Edytuj datę & godzinę'; + + @override + String get entryInfoActionEditLocation => 'Edytuj lokalizację'; + + @override + String get entryInfoActionEditTitleDescription => 'Edytuj tytuł & opis'; + + @override + String get entryInfoActionEditRating => 'Edytuj ocenę'; + + @override + String get entryInfoActionEditTags => 'Edytuj znaczniki'; + + @override + String get entryInfoActionRemoveMetadata => 'Usuń metadane'; + + @override + String get entryInfoActionExportMetadata => 'Wyeksportuj metadane'; + + @override + String get entryInfoActionRemoveLocation => 'Usuń lokalizację'; + + @override + String get editorActionTransform => 'Przekształć'; + + @override + String get editorTransformCrop => 'Przytnij'; + + @override + String get editorTransformRotate => 'Obróć'; + + @override + String get cropAspectRatioFree => 'Dowolnie'; + + @override + String get cropAspectRatioOriginal => 'Oryginał'; + + @override + String get cropAspectRatioSquare => 'Kwadrat'; + + @override + String get filterAspectRatioLandscapeLabel => 'Pejzaż'; + + @override + String get filterAspectRatioPortraitLabel => 'Portret'; + + @override + String get filterBinLabel => 'Kosz'; + + @override + String get filterFavouriteLabel => 'Ulubione'; + + @override + String get filterNoDateLabel => 'Niedatowany'; + + @override + String get filterNoAddressLabel => 'Brak adresu'; + + @override + String get filterLocatedLabel => 'Umiejscowione'; + + @override + String get filterNoLocationLabel => 'Nieumiejscowione'; + + @override + String get filterNoRatingLabel => 'Nieoceniony'; + + @override + String get filterTaggedLabel => 'Oznaczone'; + + @override + String get filterNoTagLabel => 'Nieoznaczone'; + + @override + String get filterNoTitleLabel => 'Bez tytułu'; + + @override + String get filterOnThisDayLabel => 'Tego dnia'; + + @override + String get filterRecentlyAddedLabel => 'Ostatnio dodane'; + + @override + String get filterRatingRejectedLabel => 'Odrzucony'; + + @override + String get filterTypeAnimatedLabel => 'Animowany'; + + @override + String get filterTypeMotionPhotoLabel => 'Ruchome Zdjęcie'; + + @override + String get filterTypePanoramaLabel => 'Zdjęcie panoramiczne'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => 'Wideo 360°'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Obraz'; + + @override + String get filterMimeVideoLabel => 'Wideo'; + + @override + String get accessibilityAnimationsRemove => 'Zapobiegaj efektom ekranu'; + + @override + String get accessibilityAnimationsKeep => 'Zachowaj efekty ekranu'; + + @override + String get albumTierNew => 'Nowy'; + + @override + String get albumTierPinned => 'Przypięty'; + + @override + String get albumTierGroups => 'Grupy'; + + @override + String get albumTierSpecial => 'Wspólne'; + + @override + String get albumTierApps => 'Aplikacje'; + + @override + String get albumTierVaults => 'Skarbce'; + + @override + String get albumTierDynamic => 'Dynamiczny'; + + @override + String get albumTierRegular => 'Inne'; + + @override + String get coordinateFormatDms => 'Stopnie, Minuty, Sekundy'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Stopnie z miejscami dziesiętnymi'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'Pn'; + + @override + String get coordinateDmsSouth => 'Pd'; + + @override + String get coordinateDmsEast => 'Ws'; + + @override + String get coordinateDmsWest => 'Z'; + + @override + String get displayRefreshRatePreferHighest => 'Najwyższa'; + + @override + String get displayRefreshRatePreferLowest => 'Najniższa'; + + @override + String get keepScreenOnNever => 'Nigdy'; + + @override + String get keepScreenOnVideoPlayback => 'Przy odtwarzaniu wideo'; + + @override + String get keepScreenOnViewerOnly => 'Na stronie przeglądarki'; + + @override + String get keepScreenOnAlways => 'Zawsze'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Mapy Google'; + + @override + String get mapStyleGoogleHybrid => 'Mapy Google (hybrydowe)'; + + @override + String get mapStyleGoogleTerrain => 'Mapy Google (teren)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'Otwórz TopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarny OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (kolory wody)'; + + @override + String get maxBrightnessNever => 'Nigdy'; + + @override + String get maxBrightnessAlways => 'Zawsze'; + + @override + String get nameConflictStrategyRename => 'Zmień nazwę'; + + @override + String get nameConflictStrategyReplace => 'Zastąp'; + + @override + String get nameConflictStrategySkip => 'Pomiń'; + + @override + String get overlayHistogramNone => 'Brak'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Jasność'; + + @override + String get subtitlePositionTop => 'Na górze'; + + @override + String get subtitlePositionBottom => 'Na dole'; + + @override + String get themeBrightnessLight => 'Jasny'; + + @override + String get themeBrightnessDark => 'Ciemny'; + + @override + String get themeBrightnessBlack => 'Czarny'; + + @override + String get unitSystemMetric => 'Metryczne'; + + @override + String get unitSystemImperial => 'Imperialne'; + + @override + String get vaultLockTypePattern => 'Wzór'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Hasło'; + + @override + String get settingsVideoEnablePip => 'Obraz w obrazie'; + + @override + String get videoControlsPlayOutside => 'Odtwórz innym odtwarzaczem'; + + @override + String get videoLoopModeNever => 'Nigdy'; + + @override + String get videoLoopModeShortOnly => 'Tylko krótkie wideo'; + + @override + String get videoLoopModeAlways => 'Zawsze'; + + @override + String get videoPlaybackSkip => 'Pomiń'; + + @override + String get videoPlaybackMuted => 'Odtwarzaj bez dźwięku'; + + @override + String get videoPlaybackWithSound => 'Odtwarzaj z dźwiękiem'; + + @override + String get videoResumptionModeNever => 'Nigdy'; + + @override + String get videoResumptionModeAlways => 'Zawsze'; + + @override + String get viewerTransitionSlide => 'Slajd'; + + @override + String get viewerTransitionParallax => 'Paralaksa'; + + @override + String get viewerTransitionFade => 'Zanikanie'; + + @override + String get viewerTransitionZoomIn => 'Powiększanie'; + + @override + String get viewerTransitionNone => 'Brak'; + + @override + String get wallpaperTargetHome => 'Ekran główny'; + + @override + String get wallpaperTargetLock => 'Ekran blokady'; + + @override + String get wallpaperTargetHomeLock => 'Ekran główny i blokady'; + + @override + String get widgetDisplayedItemRandom => 'Losowo'; + + @override + String get widgetDisplayedItemMostRecent => 'Najnowszy'; + + @override + String get widgetOpenPageHome => 'Otwórz stronę główną'; + + @override + String get widgetOpenPageCollection => 'Otwórz kolekcję'; + + @override + String get widgetOpenPageViewer => 'Otwórz przeglądarkę'; + + @override + String get widgetTapUpdateWidget => 'Zaktualizuj widżet'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Pamięć wewnętrzna'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'Karta SD'; + + @override + String get rootDirectoryDescription => 'katalog główny'; + + @override + String otherDirectoryDescription(String name) { + return 'katalog „$name”'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Wybierz $directory lub „$volume” na następnym ekranie, aby dać tej aplikacji dostęp do niego.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Ta aplikacja nie może modyfikować plików w $directory „$volume”.\n\nUżyj wstępnie zainstalowanego menedżera plików lub aplikacji galerii, aby przenieść elementy do innego katalogu.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Ta operacja wymaga $neededSize wolnego miejsca na „$volume”, aby ją ukończyć, ale pozostało tylko $freeSize.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Brak selektora plików systemowych lub jest on wyłączony. Włącz go i spróbuj ponownie.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Ta operacja nie jest obsługiwana dla elementów następujących typów: $types.', + one: 'Ta operacja nie jest obsługiwana dla elementów następującego typu: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Niektóre pliki w katalogu docelowym mają taką samą nazwę.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Niektóre pliki mają tę samą nazwę.'; + + @override + String get addShortcutDialogLabel => 'Etykieta skrótu'; + + @override + String get addShortcutButtonLabel => 'DODAJ'; + + @override + String get noMatchingAppDialogMessage => 'Nie ma aplikacji, które mogłyby sobie z tym poradzić.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Przenieść te elementy $count do Kosza?', + one: 'Przenieść ten element do Kosza?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Usunąć te elementy $count?', + one: 'Usunąć ten element?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Zapisać daty elementów przed kontynuacją?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Zapisz daty'; + + @override + String videoResumeDialogMessage(String time) { + return 'Czy chcesz wznowić odtwarzanie od $time?'; + } + + @override + String get videoStartOverButtonLabel => 'ZACZNIJ OD NOWA'; + + @override + String get videoResumeButtonLabel => 'WZNÓW'; + + @override + String get setCoverDialogLatest => 'Ostatni element'; + + @override + String get setCoverDialogAuto => 'Automatycznie'; + + @override + String get setCoverDialogCustom => 'Własny'; + + @override + String get hideFilterConfirmationDialogMessage => 'Pasujące zdjęcia i filmy zostaną ukryte w kolekcji. Możesz je ponownie wyświetlić w ustawieniach, w sekcji „Prywatność”.\n\nCzy na pewno chcesz je ukryć?'; + + @override + String get newAlbumDialogTitle => 'Nowy album'; + + @override + String get newAlbumDialogNameLabel => 'Nazwa albumu'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album już istnieje'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Katalog już istnieje'; + + @override + String get newAlbumDialogStorageLabel => 'Pamięć:'; + + @override + String get newDynamicAlbumDialogTitle => 'Nowy dynamiczny album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamiczny album już istnieje'; + + @override + String get newGroupDialogTitle => 'Nowa grupa'; + + @override + String get newGroupDialogNameLabel => 'Nazwa grupy'; + + @override + String get groupAlreadyExists => 'Grupa już istnieje'; + + @override + String get groupEmpty => 'Brak grup'; + + @override + String get ungrouped => 'Nie pogrupowano'; + + @override + String get groupPickerTitle => 'Wybierz grupę'; + + @override + String get groupPickerUseThisGroupButton => 'Używaj tej grupy'; + + @override + String get newVaultWarningDialogMessage => 'Elementy w skarbcach są dostępne tylko dla tej aplikacji i żadnej innej.\n\nJeśli odinstalujesz tę aplikację lub wyczyścisz dane tej aplikacji, stracisz wszystkie te elementy.'; + + @override + String get newVaultDialogTitle => 'Nowy Skarbiec'; + + @override + String get configureVaultDialogTitle => 'Konfiguruj Skarbiec'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Blokada po wyłączeniu ekranu'; + + @override + String get vaultDialogLockTypeLabel => 'Rodzaj blokady'; + + @override + String get patternDialogEnter => 'Ustaw wzór'; + + @override + String get patternDialogConfirm => 'Potwierdź wzór'; + + @override + String get pinDialogEnter => 'Wpisz kod PIN'; + + @override + String get pinDialogConfirm => 'Potwierdź kod PIN'; + + @override + String get passwordDialogEnter => 'Wpisz hasło'; + + @override + String get passwordDialogConfirm => 'Potwierdź hasło'; + + @override + String get authenticateToConfigureVault => 'Uwierzytelnij się, aby skonfigurować Skarbiec'; + + @override + String get authenticateToUnlockVault => 'Uwierzytelnij się, aby odblokować skarbiec'; + + @override + String get vaultBinUsageDialogMessage => 'Niektóre skarbce korzystają z kosza.'; + + @override + String get renameAlbumDialogLabel => 'Nowa nazwa'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Katalog już istnieje'; + + @override + String get renameEntrySetPageTitle => 'Zmień nazwę'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Wzorzec nazewnictwa'; + + @override + String get renameEntrySetPageInsertTooltip => 'Wstaw pole'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Podgląd'; + + @override + String get renameProcessorCounter => 'Licznik'; + + @override + String get renameProcessorHash => 'Skrót'; + + @override + String get renameProcessorName => 'Nazwa'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Usunąć ten album i jego $count elementów?', + few: 'Usunąć ten album i jego $count elementy?', + one: 'Usunąć ten album i jego element?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Usunąć te albumy i ich $count elementów?', + few: 'Usunąć te albumy i ich $count elementy?', + one: 'Usunąć te albumy i ich element?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Szerokość'; + + @override + String get exportEntryDialogHeight => 'Wysokość'; + + @override + String get exportEntryDialogQuality => 'Jakość'; + + @override + String get exportEntryDialogWriteMetadata => 'Zapisz metadane'; + + @override + String get renameEntryDialogLabel => 'Nowa nazwa'; + + @override + String get editEntryDialogCopyFromItem => 'Kopiuj z innego elementu'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Pola do modyfikacji'; + + @override + String get editEntryDateDialogTitle => 'Data i godzina'; + + @override + String get editEntryDateDialogSetCustom => 'Ustaw własną datę'; + + @override + String get editEntryDateDialogCopyField => 'Skopiuj z innej daty'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Wydobądź z tytułu'; + + @override + String get editEntryDateDialogShift => 'Zmiana'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Data modyfikacji pliku'; + + @override + String get durationDialogHours => 'Godziny'; + + @override + String get durationDialogMinutes => 'Minuty'; + + @override + String get durationDialogSeconds => 'Sekundy'; + + @override + String get editEntryLocationDialogTitle => 'Pozycja'; + + @override + String get editEntryLocationDialogSetCustom => 'Ustaw własną pozycję'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Wybierz z mapy'; + + @override + String get editEntryLocationDialogImportGpx => 'Importuj GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Szerokość geograficzna'; + + @override + String get editEntryLocationDialogLongitude => 'Długość geograficzna'; + + @override + String get editEntryLocationDialogTimeShift => 'Przesunięcie czasowe'; + + @override + String get locationPickerUseThisLocationButton => 'Użyj tej pozycji'; + + @override + String get editEntryRatingDialogTitle => 'Ocena'; + + @override + String get removeEntryMetadataDialogTitle => 'Usuwanie metadanych'; + + @override + String get removeEntryMetadataDialogAll => 'Wszystko'; + + @override + String get removeEntryMetadataDialogMore => 'Więcej'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP jest wymagane do odtworzenia wideo wewnątrz zdjęcia.\n\nCzy na pewno chcesz go usunąć?'; + + @override + String get videoSpeedDialogLabel => 'Szybkość odtwarzania'; + + @override + String get videoStreamSelectionDialogVideo => 'Wideo'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Napisy'; + + @override + String get videoStreamSelectionDialogOff => 'Wyłącz'; + + @override + String get videoStreamSelectionDialogTrack => 'Ścieżka'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Nie ma innych ścieżek.'; + + @override + String get genericSuccessFeedback => 'Gotowe!'; + + @override + String get genericFailureFeedback => 'Niepowodzenie'; + + @override + String get genericDangerWarningDialogMessage => 'Czy na pewno?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Spróbuj ponownie z mniejszą ilością elementów.'; + + @override + String get menuActionConfigureView => 'Widok'; + + @override + String get menuActionSelect => 'Zaznacz'; + + @override + String get menuActionSelectAll => 'Zaznacz wszystkie'; + + @override + String get menuActionSelectNone => 'Odznacz'; + + @override + String get menuActionMap => 'Mapa'; + + @override + String get menuActionSlideshow => 'Pokaz slajdów'; + + @override + String get menuActionStats => 'Statystyki'; + + @override + String get viewDialogSortSectionTitle => 'Sortuj'; + + @override + String get viewDialogGroupSectionTitle => 'Sekcje'; + + @override + String get viewDialogLayoutSectionTitle => 'Układ'; + + @override + String get viewDialogReverseSortOrder => 'Odwróć porządek sortowania'; + + @override + String get tileLayoutMosaic => 'Mozaika'; + + @override + String get tileLayoutGrid => 'Siatka'; + + @override + String get tileLayoutList => 'Lista'; + + @override + String get castDialogTitle => 'Urządzenia Cast'; + + @override + String get coverDialogTabCover => 'Okładka'; + + @override + String get coverDialogTabApp => 'Aplikacja'; + + @override + String get coverDialogTabColor => 'Kolor'; + + @override + String get appPickDialogTitle => 'Wybierz aplikację'; + + @override + String get appPickDialogNone => 'Brak'; + + @override + String get aboutPageTitle => 'O aplikacji'; + + @override + String get aboutLinkLicense => 'Licencje'; + + @override + String get aboutLinkPolicy => 'Polityka prywatności'; + + @override + String get aboutBugSectionTitle => 'Raport o błędach'; + + @override + String get aboutBugSaveLogInstruction => 'Zapisz dzienniki aplikacji w pliku'; + + @override + String get aboutBugCopyInfoInstruction => 'Skopiuj informację o systemie'; + + @override + String get aboutBugCopyInfoButton => 'Kopiuj'; + + @override + String get aboutBugReportInstruction => 'Zgłoś w usłudze GitHub z dziennikami i informacją o systemie'; + + @override + String get aboutBugReportButton => 'Zgłoś'; + + @override + String get aboutDataUsageSectionTitle => 'Wykorzystanie danych'; + + @override + String get aboutDataUsageData => 'Dane'; + + @override + String get aboutDataUsageCache => 'Pamięć podręczna'; + + @override + String get aboutDataUsageDatabase => 'Baza danych'; + + @override + String get aboutDataUsageMisc => 'Różne'; + + @override + String get aboutDataUsageInternal => 'Wewnętrzny'; + + @override + String get aboutDataUsageExternal => 'Zewnętrzny'; + + @override + String get aboutDataUsageClearCache => 'Wyczyść pamięć podręczną'; + + @override + String get aboutCreditsSectionTitle => 'Zasługi'; + + @override + String get aboutCreditsWorldAtlas1 => 'Ta aplikacja używa pliku TopoJSON z'; + + @override + String get aboutCreditsWorldAtlas2 => 'na licencji ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'Tłumacze'; + + @override + String get aboutLicensesSectionTitle => 'Licencje o otwartym kodzie'; + + @override + String get aboutLicensesBanner => 'Ta aplikacja używa następujących pakietów i bibliotek z otwartym kodem.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Biblioteki systemu Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Wtyczki Fluttera'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Pakiety Fluttera'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Pakiety Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Pokaż wszystkie licencje'; + + @override + String get policyPageTitle => 'Polityka prywatności'; + + @override + String get collectionPageTitle => 'Kolekcja'; + + @override + String get collectionPickPageTitle => 'Wybierz'; + + @override + String get collectionSelectPageTitle => 'Wybierz elementy'; + + @override + String get collectionActionShowTitleSearch => 'Pokaż filtr tytułu'; + + @override + String get collectionActionHideTitleSearch => 'Ukryj filtr tytułu'; + + @override + String get collectionActionAddDynamicAlbum => 'Dodaj dynamiczny album'; + + @override + String get collectionActionAddShortcut => 'Dodaj skrót'; + + @override + String get collectionActionSetHome => 'Ustaw jako stronę główną'; + + @override + String get collectionActionEmptyBin => 'Opróżnij kosz'; + + @override + String get collectionActionCopy => 'Kopiuj do albumu'; + + @override + String get collectionActionMove => 'Przenieś do albumu'; + + @override + String get collectionActionRescan => 'Przeskanuj'; + + @override + String get collectionActionEdit => 'Edytuj'; + + @override + String get collectionSearchTitlesHintText => 'Szukaj tytułów'; + + @override + String get collectionGroupAlbum => 'Według albumu'; + + @override + String get collectionGroupMonth => 'Według miesiąca'; + + @override + String get collectionGroupDay => 'Według dnia'; + + @override + String get sectionNone => 'Brak sekcji'; + + @override + String get sectionUnknown => 'Nieznany'; + + @override + String get dateToday => 'Dzisiaj'; + + @override + String get dateYesterday => 'Wczoraj'; + + @override + String get dateThisMonth => 'W tym miesiącu'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nie udało się usunąć $count elementów', + one: 'Nie udało się usunąć 1 elementu', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nie udało się skopiować $count elementów', + one: 'Nie udało się skopiować 1 elementu', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nie udało się przenieść $count elementów', + one: 'Nie udało się przenieść 1 elementu', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nie udało się zmienić nazwy $count elementom', + one: 'Nie udało się zmienić nazwy 1 elementowi', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nie udało się wyedytować $count elementów', + one: 'Nie udało się wyedytować 1 elementu', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nie udało się wyeksportować$count stron', + one: 'Nie udało się wyeksportować 1 strony', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Skopiowano $count elementów', + few: 'Skopiowano $count elementy', + one: 'Skopiowano 1 element', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Przeniesiono $count elementów', + few: 'Przeniesiono $count elementy', + one: 'Przeniesiono 1 element', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Zmieniono nazwę $count elementom', + one: 'Zmieniono nazwę 1 elementowi', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Wyedytowano $count elementów', + few: 'Wyedytowano $count elementy', + one: 'Wyedytowano 1 element', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Brak ulubionych'; + + @override + String get collectionEmptyVideos => 'Brak wideo'; + + @override + String get collectionEmptyImages => 'Brak obrazów'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Przyznaj dostęp'; + + @override + String get collectionSelectSectionTooltip => 'Zaznacz sekcję'; + + @override + String get collectionDeselectSectionTooltip => 'Odznacz sekcję'; + + @override + String get drawerAboutButton => 'O programie'; + + @override + String get drawerSettingsButton => 'Ustawienia'; + + @override + String get drawerCollectionAll => 'Wszystkie kolekcje'; + + @override + String get drawerCollectionFavourites => 'Ulubione'; + + @override + String get drawerCollectionImages => 'Obrazy'; + + @override + String get drawerCollectionVideos => 'Wideo'; + + @override + String get drawerCollectionAnimated => 'Animacje'; + + @override + String get drawerCollectionMotionPhotos => 'Animowane zdjęcia'; + + @override + String get drawerCollectionPanoramas => 'Zdjęcia panoramiczne'; + + @override + String get drawerCollectionRaws => 'Nieprzetworzone zdjęcia'; + + @override + String get drawerCollectionSphericalVideos => 'Wideo 360°'; + + @override + String get drawerAlbumPage => 'Albumy'; + + @override + String get drawerCountryPage => 'Kraje'; + + @override + String get drawerPlacePage => 'Miejsca'; + + @override + String get drawerTagPage => 'Znaczniki'; + + @override + String get sortByDate => 'Według daty'; + + @override + String get sortByName => 'Według nazwy'; + + @override + String get sortByItemCount => 'Według liczby elementów'; + + @override + String get sortBySize => 'Według rozmiaru'; + + @override + String get sortByAlbumFileName => 'Według albumu i nazwy elementu'; + + @override + String get sortByRating => 'Według oceny'; + + @override + String get sortByDuration => 'Według czasu trwania'; + + @override + String get sortByPath => 'Według ścieżki'; + + @override + String get sortOrderNewestFirst => 'Najpierw najnowsze'; + + @override + String get sortOrderOldestFirst => 'Najpierw najstarsze'; + + @override + String get sortOrderAtoZ => 'Od A do Z'; + + @override + String get sortOrderZtoA => 'Od Z do A'; + + @override + String get sortOrderHighestFirst => 'Najpierw najwyższe'; + + @override + String get sortOrderLowestFirst => 'Najpierw najniższe'; + + @override + String get sortOrderLargestFirst => 'Najpierw największe'; + + @override + String get sortOrderSmallestFirst => 'Najpierw najmniejsze'; + + @override + String get sortOrderShortestFirst => 'Najkrótsze najpierw'; + + @override + String get sortOrderLongestFirst => 'Najdłuższe najpierw'; + + @override + String get albumGroupTier => 'Według poziomu'; + + @override + String get albumGroupType => 'Według typu'; + + @override + String get albumGroupVolume => 'Według pojemności magazynu'; + + @override + String get albumMimeTypeMixed => 'Mieszane'; + + @override + String get albumPickPageTitleCopy => 'Skopiuj do albumu'; + + @override + String get albumPickPageTitleExport => 'Wyeksportuj do albumu'; + + @override + String get albumPickPageTitleMove => 'Przenieś do albumu'; + + @override + String get albumPickPageTitlePick => 'Wybierz album'; + + @override + String get albumCamera => 'Kamera'; + + @override + String get albumDownload => 'Pobrane'; + + @override + String get albumScreenshots => 'Zrzuty ekranu'; + + @override + String get albumScreenRecordings => 'Nagrania ekranu'; + + @override + String get albumVideoCaptures => 'Przechwycone wideo'; + + @override + String get albumPageTitle => 'Albumy'; + + @override + String get albumEmpty => 'Brak albumów'; + + @override + String get createAlbumButtonLabel => 'UTWÓRZ'; + + @override + String get newFilterBanner => 'nowy'; + + @override + String get countryPageTitle => 'Kraje'; + + @override + String get countryEmpty => 'Brak krajów'; + + @override + String get statePageTitle => 'Stany'; + + @override + String get stateEmpty => 'Brak stanów'; + + @override + String get placePageTitle => 'Miejsca'; + + @override + String get placeEmpty => 'Brak miejsc'; + + @override + String get tagPageTitle => 'Znaczniki'; + + @override + String get tagEmpty => 'Brak znaczników'; + + @override + String get tagPickPageTitle => 'Wybierz znacznik'; + + @override + String get binPageTitle => 'Kosz'; + + @override + String get explorerPageTitle => 'Przeglądarka'; + + @override + String get explorerActionSelectStorageVolume => 'Wybierz pamięć'; + + @override + String get selectStorageVolumeDialogTitle => 'Wybierz pamięć'; + + @override + String get searchCollectionFieldHint => 'Wyszukaj kolekcję'; + + @override + String get searchRecentSectionTitle => 'Ostatni'; + + @override + String get searchDateSectionTitle => 'Data'; + + @override + String get searchFormatSectionTitle => 'Formaty'; + + @override + String get searchAlbumsSectionTitle => 'Albumy'; + + @override + String get searchCountriesSectionTitle => 'Kraje'; + + @override + String get searchStatesSectionTitle => 'Stany'; + + @override + String get searchPlacesSectionTitle => 'Miejsca'; + + @override + String get searchTagsSectionTitle => 'Znaczniki'; + + @override + String get searchRatingSectionTitle => 'Oceny'; + + @override + String get searchMetadataSectionTitle => 'Metadane'; + + @override + String get settingsPageTitle => 'Ustawienia'; + + @override + String get settingsSystemDefault => 'Ustawienie systemu'; + + @override + String get settingsDefault => 'Domyślne'; + + @override + String get settingsDisabled => 'Wyłączono'; + + @override + String get settingsEnabled => 'Włączono'; + + @override + String get settingsForced => 'Wymuszono'; + + @override + String get settingsAskEverytime => 'Zawsze pytaj'; + + @override + String get settingsModificationWarningDialogMessage => 'Pozostałe ustawienia zostaną zmodyfikowane.'; + + @override + String get settingsSearchFieldLabel => 'Wyszukaj ustawienia'; + + @override + String get settingsSearchEmpty => 'Brak pasującego ustawienia'; + + @override + String get settingsActionExport => 'Wyeksportuj'; + + @override + String get settingsActionExportDialogTitle => 'Wyeksportuj'; + + @override + String get settingsActionImport => 'Zaimportuj'; + + @override + String get settingsActionImportDialogTitle => 'Zaimportuj'; + + @override + String get appExportCovers => 'Okładki'; + + @override + String get appExportDynamicAlbums => 'Dynamiczne albumy'; + + @override + String get appExportFavourites => 'Ulubione'; + + @override + String get appExportSettings => 'Ustawienia'; + + @override + String get settingsNavigationSectionTitle => 'Nawigowanie'; + + @override + String get settingsHomeTile => 'Strona główna'; + + @override + String get settingsHomeDialogTitle => 'Strona główna'; + + @override + String get setHomeCustom => 'Własny'; + + @override + String get settingsKeepScreenOnTile => 'Pozostaw ekran włączony'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Pozostaw ekran włączony'; + + @override + String get settingsDoubleBackExit => 'Dotknij dwa razy „wstecz”, aby wyjść'; + + @override + String get settingsConfirmationTile => 'Działania do potwierdzenia'; + + @override + String get settingsConfirmationDialogTitle => 'Działania do potwierdzenia'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Zapytaj, zanim usuniesz elementy na zawsze'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Zapytaj, zanim przeniesiesz elementy do kosza'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Zapytaj, zanim przeniesiesz niedatowane elementy'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Pokaż komunikat po przeniesieniu elementów do Kosza'; + + @override + String get settingsConfirmationVaultDataLoss => 'Pokaż ostrzeżenie o utracie danych skarbca'; + + @override + String get settingsNavigationDrawerTile => 'Menu nawigacyjne'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Menu nawigacyjne'; + + @override + String get settingsNavigationDrawerBanner => 'Dotknij i przytrzymaj, aby przenieść i zmienić kolejność pozycji menu.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Kategorie'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albumy'; + + @override + String get settingsNavigationDrawerTabPages => 'Strony'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Dodaj album'; + + @override + String get settingsNavigationBottomActionsTile => 'Dolna nawigacja'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Dolna nawigacja'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Dotknij i przytrzymaj, aby przesunąć przyciski i wybrać działania wyświetlane na dolnym pasku nawigacyjnym.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniatury'; + + @override + String get settingsThumbnailOverlayTile => 'Nakładka'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Nakładka'; + + @override + String get settingsThumbnailShowHdrIcon => 'Pokaż ikonę HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Pokaż ikonę ulubionych'; + + @override + String get settingsThumbnailShowTagIcon => 'Pokaż ikonę znacznika'; + + @override + String get settingsThumbnailShowLocationIcon => 'Pokaż ikonę położenia'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Pokaż ikonę zdjęcia ruchomego'; + + @override + String get settingsThumbnailShowRating => 'Pokaż ocenę'; + + @override + String get settingsThumbnailShowRawIcon => 'Pokaż ikonę RAW'; + + @override + String get settingsThumbnailShowVideoDuration => 'Pokaż czas trwania wideo'; + + @override + String get settingsCollectionQuickActionsTile => 'Szybkie działania'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Szybkie działania'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Przeglądanie'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Wybieranie'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Dotknij i przytrzymaj, aby przenieść przyciski i wybrać akcje wyświetlane podczas przeglądania elementów.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Dotknij i przytrzymaj, aby przesuwać przyciski i wybrać akcje, które mają być wyświetlane podczas wybierania elementów.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Wzory wybuchowe'; + + @override + String get settingsCollectionBurstPatternsNone => 'Brak'; + + @override + String get settingsViewerSectionTitle => 'Przeglądarka'; + + @override + String get settingsViewerGestureSideTapNext => 'Dotknij krawędzi ekranu, aby wyświetlić poprzedni / następny element'; + + @override + String get settingsViewerUseCutout => 'Użyj obszaru wycięcia'; + + @override + String get settingsViewerMaximumBrightness => 'Jasność maksymalna'; + + @override + String get settingsMotionPhotoAutoPlay => 'Automatyczne odtwarzanie ruchomych zdjęć'; + + @override + String get settingsImageBackground => 'Tło obrazu'; + + @override + String get settingsViewerQuickActionsTile => 'Szybkie działania'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Szybkie działania'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Dotknij i przytrzymaj, aby przesunąć przyciski i wybrać czynności, które mają być wyświetlane w przeglądarce.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Wyświetlane przyciski'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Dostępne przyciski'; + + @override + String get settingsViewerQuickActionEmpty => 'Brak przycisków'; + + @override + String get settingsViewerOverlayTile => 'Nakładka'; + + @override + String get settingsViewerOverlayPageTitle => 'Nakładka'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Pokaz w momencie otwarcia'; + + @override + String get settingsViewerShowHistogram => 'Pokaż histogram'; + + @override + String get settingsViewerShowMinimap => 'Pokaż minimapę'; + + @override + String get settingsViewerShowZoomLevel => 'Pokaż poziom przybliżenia'; + + @override + String get settingsViewerShowInformation => 'Pokaż informacje'; + + @override + String get settingsViewerShowInformationSubtitle => 'Pokaż tytuł, datę, położenie itp.'; + + @override + String get settingsViewerShowRatingTags => 'Pokaż ocenę i znaczniki'; + + @override + String get settingsViewerShowShootingDetails => 'Pokaż szczegóły fotografowania'; + + @override + String get settingsViewerShowDescription => 'Pokaż opis'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Pokaż miniaturki'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Efekt rozmycia'; + + @override + String get settingsViewerSlideshowTile => 'Pokaz slajdów'; + + @override + String get settingsViewerSlideshowPageTitle => 'Pokaz slajdów'; + + @override + String get settingsSlideshowRepeat => 'Powtarzaj'; + + @override + String get settingsSlideshowShuffle => 'Mieszaj'; + + @override + String get settingsSlideshowFillScreen => 'Wypełnij ekran'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animowany efekt powiększenia'; + + @override + String get settingsSlideshowTransitionTile => 'Przejście'; + + @override + String get settingsSlideshowIntervalTile => 'Interwał'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Odtwarzanie wideo'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Odtwarzanie wideo'; + + @override + String get settingsVideoPageTitle => 'Ustawienia wideo'; + + @override + String get settingsVideoSectionTitle => 'Wideo'; + + @override + String get settingsVideoShowVideos => 'Pokaż wideo'; + + @override + String get settingsVideoPlaybackTile => 'Odtwarzanie'; + + @override + String get settingsVideoPlaybackPageTitle => 'Odtwarzanie'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Przyspieszenie sprzętowe'; + + @override + String get settingsVideoAutoPlay => 'Odtwarzaj automatycznie'; + + @override + String get settingsVideoLoopModeTile => 'Tryb pętli'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Tryb pętli'; + + @override + String get settingsVideoResumptionModeTile => 'Wznów odtwarzanie'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Wznów odtwarzanie'; + + @override + String get settingsVideoBackgroundMode => 'Tryb tła'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Tryb tła'; + + @override + String get settingsVideoControlsTile => 'Sterowanie'; + + @override + String get settingsVideoControlsPageTitle => 'Sterowanie'; + + @override + String get settingsVideoButtonsTile => 'Przyciski'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Dotknij dwukrotnie, aby odtworzyć/wstrzymać'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Dotknij dwukrotnie krawędzi ekranu, aby przeszukać do tyłu / do przodu'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Przesuń palcem w górę lub w dół, aby dostosować jasność/głośność'; + + @override + String get settingsSubtitleThemeTile => 'Napisy'; + + @override + String get settingsSubtitleThemePageTitle => 'Napisy'; + + @override + String get settingsSubtitleThemeSample => 'Przykładowy napis.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Dopasowanie tekstu'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Dopasowanie tekstu'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Pozycja tekstu'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Pozycja tekstu'; + + @override + String get settingsSubtitleThemeTextSize => 'Rozmiar tekstu'; + + @override + String get settingsSubtitleThemeShowOutline => 'Pokaż kontur i cień'; + + @override + String get settingsSubtitleThemeTextColor => 'Kolor tekstu'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Krycie tekstu'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Kolor tła'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Krycie tła'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Lewo'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Środek'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Prawo'; + + @override + String get settingsPrivacySectionTitle => 'Prywatność'; + + @override + String get settingsAllowInstalledAppAccess => 'Zezwól na dostęp do spisu aplikacji'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Używane do poprawy wyświetlania albumu'; + + @override + String get settingsAllowErrorReporting => 'Zezwól na anonimowe zgłaszanie błędów'; + + @override + String get settingsSaveSearchHistory => 'Zapisz historię wyszukiwania'; + + @override + String get settingsEnableBin => 'Używaj kosza'; + + @override + String get settingsEnableBinSubtitle => 'Zachowaj usunięte elementy przez 30 dni'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Elementy znajdujące się w koszu zostaną usunięte na zawsze.'; + + @override + String get settingsAllowMediaManagement => 'Zezwalaj na zarządzanie multimediami'; + + @override + String get settingsHiddenItemsTile => 'Ukryte elementy'; + + @override + String get settingsHiddenItemsPageTitle => 'Ukryte elementy'; + + @override + String get settingsHiddenFiltersBanner => 'Zdjęcia i wideo pasujące do ukrytych filtrów nie pojawią się w twojej kolekcji.'; + + @override + String get settingsHiddenFiltersEmpty => 'Brak ukrytych filtrów'; + + @override + String get settingsStorageAccessTile => 'Dostęp do pamięci masowej'; + + @override + String get settingsStorageAccessPageTitle => 'Dostęp do pamięci masowej'; + + @override + String get settingsStorageAccessBanner => 'Niektóre katalogi wymagają jawnego udzielenia dostępu, aby modyfikować znajdujące się w nich pliki. Możesz przejrzeć tutaj katalogi, do których wcześniej udzielono dostępu.'; + + @override + String get settingsStorageAccessEmpty => 'Brak przyznanych uprawnień'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Odwołaj'; + + @override + String get settingsAccessibilitySectionTitle => 'Dostępność'; + + @override + String get settingsRemoveAnimationsTile => 'Usuń animacje'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Usuń animacje'; + + @override + String get settingsTimeToTakeActionTile => 'Czas na podjęcie działania'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Pokaż alternatywy gestów wielodotykowych'; + + @override + String get settingsDisplaySectionTitle => 'Wyświetlanie'; + + @override + String get settingsThemeBrightnessTile => 'Motyw'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Motyw'; + + @override + String get settingsThemeColorHighlights => 'Podkreślenia kolorów'; + + @override + String get settingsThemeEnableDynamicColor => 'Kolor dynamiczny'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Częstotliwość odświeżania ekranu'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Częstotliwość odświeżania'; + + @override + String get settingsDisplayUseTvInterface => 'Interfejs Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Język i formaty'; + + @override + String get settingsLanguageTile => 'Język'; + + @override + String get settingsLanguagePageTitle => 'Język'; + + @override + String get settingsCoordinateFormatTile => 'Format współrzędnych'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Format współrzędnych'; + + @override + String get settingsUnitSystemTile => 'Jednostki'; + + @override + String get settingsUnitSystemDialogTitle => 'Jednostki'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Wymuszaj cyfry arabskie'; + + @override + String get settingsScreenSaverPageTitle => 'Wygaszacz ekranu'; + + @override + String get settingsWidgetPageTitle => 'Ramka zdjęcia'; + + @override + String get settingsWidgetShowOutline => 'Zarys'; + + @override + String get settingsWidgetOpenPage => 'Po dotknięciu widżetu'; + + @override + String get settingsWidgetDisplayedItem => 'Wyświetlany element'; + + @override + String get settingsCollectionTile => 'Kolekcja'; + + @override + String get statsPageTitle => 'Statystyki'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elementów z położeniem', + few: '$count elementy z położeniem', + one: '1 element z położeniem', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Najlepsze kraje'; + + @override + String get statsTopStatesSectionTitle => 'Najpopularniejsze stany'; + + @override + String get statsTopPlacesSectionTitle => 'Najlepsze miejsca'; + + @override + String get statsTopTagsSectionTitle => 'Najlepsze znaczniki'; + + @override + String get statsTopAlbumsSectionTitle => 'Najlepsze albumy'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OTWÓRZ PANORAMĘ'; + + @override + String get viewerSetWallpaperButtonLabel => 'USTAW TAPETĘ'; + + @override + String get viewerErrorUnknown => 'Ups!'; + + @override + String get viewerErrorDoesNotExist => 'Plik już nie istnieje.'; + + @override + String get viewerInfoPageTitle => 'Informacje'; + + @override + String get viewerInfoBackToViewerTooltip => 'Wróć do przeglądarki'; + + @override + String get viewerInfoUnknown => 'Nieznany'; + + @override + String get viewerInfoLabelDescription => 'Opis'; + + @override + String get viewerInfoLabelTitle => 'Tytuł'; + + @override + String get viewerInfoLabelDate => 'Data'; + + @override + String get viewerInfoLabelResolution => 'Rozdzielczość'; + + @override + String get viewerInfoLabelSize => 'Rozmiar'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Ścieżka'; + + @override + String get viewerInfoLabelDuration => 'Czas trwania'; + + @override + String get viewerInfoLabelOwner => 'Właściciel'; + + @override + String get viewerInfoLabelCoordinates => 'Współrzędne'; + + @override + String get viewerInfoLabelAddress => 'Adres'; + + @override + String get mapStyleDialogTitle => 'Styl mapy'; + + @override + String get mapStyleDialogAddStyle => 'Dodaj styl'; + + @override + String get mapStyleTooltip => 'Wybierz styl mapy'; + + @override + String get mapStyleEditorDialogName => 'Nazwa'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Poddomeny'; + + @override + String get mapStyleEditorDialogUserAgent => 'Użytkownik-agent'; + + @override + String get mapZoomInTooltip => 'Powiększ'; + + @override + String get mapZoomOutTooltip => 'Pomniejsz'; + + @override + String get mapPointNorthUpTooltip => 'Północ u góry'; + + @override + String get mapAttributionOsmData => 'Dane mapy © [OpenStreetMap](https://www.openstreetmap.org/copyright) współtwórcy'; + + @override + String get mapAttributionOsmLiberty => 'Płytki od [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Obsługiwane przez [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Kafelki od [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Kafelki od [HOT](https://www.hotosm.org/) • Obsługiwany przez: [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Kafelki od [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Wyświetl na mapie'; + + @override + String get mapEmptyRegion => 'Brak obrazów w tym regionie'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Nie udało się wyodrębnić osadzonych danych'; + + @override + String get viewerInfoOpenLinkText => 'Otwórz'; + + @override + String get viewerInfoViewXmlLinkText => 'Zobacz XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Wyszukaj metadane'; + + @override + String get viewerInfoSearchEmpty => 'Brak pasujących kluczy'; + + @override + String get viewerInfoSearchSuggestionDate => 'Data i godzina'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Opis'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Wymiary'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Rozdzielczość'; + + @override + String get viewerInfoSearchSuggestionRights => 'Prawa'; + + @override + String get wallpaperUseScrollEffect => 'Używaj efektu przewijania na ekranie głównym'; + + @override + String get tagEditorPageTitle => 'Edytuj znaczniki'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Nowy znacznik'; + + @override + String get tagEditorPageAddTagTooltip => 'Dodaj znacznik'; + + @override + String get tagEditorSectionRecent => 'Ostatnie'; + + @override + String get tagEditorSectionPlaceholders => 'Symbole zastępcze'; + + @override + String get tagEditorDiscardDialogMessage => 'Czy chcesz odrzucić zamiany?'; + + @override + String get tagPlaceholderCountry => 'Kraj'; + + @override + String get tagPlaceholderState => 'Stan'; + + @override + String get tagPlaceholderPlace => 'Miejsce'; + + @override + String get panoramaEnableSensorControl => 'Włącz sterowanie czujnikiem'; + + @override + String get panoramaDisableSensorControl => 'Wyłącz sterowanie czujnikiem'; + + @override + String get sourceViewerPageTitle => 'Źródło'; +} diff --git a/lib/l10ngen/app_localizations_pt.dart b/lib/l10ngen/app_localizations_pt.dart new file mode 100644 index 0000000..1c5d57b --- /dev/null +++ b/lib/l10ngen/app_localizations_pt.dart @@ -0,0 +1,2421 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Portuguese (`pt`). +class AppLocalizationsPt extends AppLocalizations { + AppLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Bem-vindo ao Aves'; + + @override + String get welcomeOptional => 'Opcional'; + + @override + String get welcomeTermsToggle => 'Eu concordo com os Termos e Condições'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString itens', + one: '$countString item', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count colunas', + one: '$count coluna', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString segundos', + one: '$countString segundo', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutos', + one: '$countString minuto', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString dias', + one: '$countString dia', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APLICAR'; + + @override + String get createButtonLabel => 'CRIAR'; + + @override + String get deleteButtonLabel => 'EXCLUIR'; + + @override + String get nextButtonLabel => 'SEGUINTE'; + + @override + String get showButtonLabel => 'MOSTRAR'; + + @override + String get hideButtonLabel => 'OCULTAR'; + + @override + String get continueButtonLabel => 'CONTINUAR'; + + @override + String get saveCopyButtonLabel => 'SALVAR CÓPIA'; + + @override + String get applyTooltip => 'Aplicar'; + + @override + String get cancelTooltip => 'Cancelar'; + + @override + String get changeTooltip => 'Mudar'; + + @override + String get clearTooltip => 'Limpar'; + + @override + String get previousTooltip => 'Anterior'; + + @override + String get nextTooltip => 'Seguinte'; + + @override + String get showTooltip => 'Mostrar'; + + @override + String get hideTooltip => 'Ocultar'; + + @override + String get actionRemove => 'Remover'; + + @override + String get resetTooltip => 'Redefinir'; + + @override + String get saveTooltip => 'Salvar'; + + @override + String get stopTooltip => 'Parar'; + + @override + String get pickTooltip => 'Escolher'; + + @override + String get doubleBackExitMessage => 'Toque “voltar” novamente para sair.'; + + @override + String get doNotAskAgain => 'Não perguntar novamente'; + + @override + String get sourceStateLoading => 'Carregando'; + + @override + String get sourceStateCataloguing => 'Catalogando'; + + @override + String get sourceStateLocatingCountries => 'Localizando países'; + + @override + String get sourceStateLocatingPlaces => 'Localizando lugares'; + + @override + String get chipActionDelete => 'Excluir'; + + @override + String get chipActionRemove => 'Remover'; + + @override + String get chipActionShowCollection => 'Mostrar na Coleção'; + + @override + String get chipActionGoToAlbumPage => 'Mostrar nos Álbuns'; + + @override + String get chipActionGoToCountryPage => 'Mostrar nos Países'; + + @override + String get chipActionGoToPlacePage => 'Exibir em Lugares'; + + @override + String get chipActionGoToTagPage => 'Mostrar nas Etiquetas'; + + @override + String get chipActionGoToExplorerPage => 'Mostrar no Explorador'; + + @override + String get chipActionDecompose => 'Separar'; + + @override + String get chipActionFilterOut => 'Filtrar dentro'; + + @override + String get chipActionFilterIn => 'Filtrar fora'; + + @override + String get chipActionHide => 'Ocultar'; + + @override + String get chipActionLock => 'Bloquear'; + + @override + String get chipActionPin => 'Fixar no topo'; + + @override + String get chipActionUnpin => 'Desafixar do topo'; + + @override + String get chipActionGroup => 'Alterar agrupamento'; + + @override + String get chipActionRename => 'Renomear'; + + @override + String get chipActionSetCover => 'Definir capa'; + + @override + String get chipActionShowCountryStates => 'Mostrar estados'; + + @override + String get chipActionCreateGroup => 'Criar grupo'; + + @override + String get chipActionCreateAlbum => 'Criar álbum'; + + @override + String get chipActionCreateVault => 'Criar cofre'; + + @override + String get chipActionConfigureVault => 'Configurar cofre'; + + @override + String get entryActionCopyToClipboard => 'Copiar para área de transferência'; + + @override + String get entryActionDelete => 'Excluir'; + + @override + String get entryActionConvert => 'Converter'; + + @override + String get entryActionExport => 'Exportar'; + + @override + String get entryActionInfo => 'Informações'; + + @override + String get entryActionRename => 'Renomear'; + + @override + String get entryActionRestore => 'Restaurar'; + + @override + String get entryActionRotateCCW => 'Rotacionar para esquerda'; + + @override + String get entryActionRotateCW => 'Rotacionar para direita'; + + @override + String get entryActionFlip => 'Virar horizontalmente'; + + @override + String get entryActionPrint => 'Imprimir'; + + @override + String get entryActionShare => 'Compartilhar'; + + @override + String get entryActionShareImageOnly => 'Compartilhar apenas imagem'; + + @override + String get entryActionShareVideoOnly => 'Compartilhar apenas video'; + + @override + String get entryActionViewSource => 'Ver origem'; + + @override + String get entryActionShowGeoTiffOnMap => 'Mostrar como sobreposição de mapa'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Converter para imagem estática'; + + @override + String get entryActionViewMotionPhotoVideo => 'Abrir vídeo'; + + @override + String get entryActionEdit => 'Editar'; + + @override + String get entryActionOpen => 'Abrir com'; + + @override + String get entryActionSetAs => 'Definir como'; + + @override + String get entryActionCast => 'Transmitir'; + + @override + String get entryActionOpenMap => 'Mostrar no aplicativo de mapa'; + + @override + String get entryActionRotateScreen => 'Girar a tela'; + + @override + String get entryActionAddFavourite => 'Adicionar aos favoritos'; + + @override + String get entryActionRemoveFavourite => 'Remova dos favoritos'; + + @override + String get videoActionCaptureFrame => 'Capturar quadro'; + + @override + String get videoActionMute => 'Mudo'; + + @override + String get videoActionUnmute => 'Ativar mudo'; + + @override + String get videoActionPause => 'Pausa'; + + @override + String get videoActionPlay => 'Toque'; + + @override + String get videoActionReplay10 => 'Retroceda 10 segundos'; + + @override + String get videoActionSkip10 => 'Avançar 10 segundos'; + + @override + String get videoActionShowPreviousFrame => 'Mostrar quadro anterior'; + + @override + String get videoActionShowNextFrame => 'Mostrar próximo quadro'; + + @override + String get videoActionSelectStreams => 'Selecione as faixas'; + + @override + String get videoActionSetSpeed => 'Velocidade de reprodução'; + + @override + String get videoActionABRepeat => 'Repetição A-B'; + + @override + String get videoRepeatActionSetStart => 'Definir início'; + + @override + String get videoRepeatActionSetEnd => 'Definir fim'; + + @override + String get viewerActionSettings => 'Configurações'; + + @override + String get viewerActionLock => 'Bloquear visualizador'; + + @override + String get viewerActionUnlock => 'Desbloquear visualizador'; + + @override + String get slideshowActionResume => 'Retomar'; + + @override + String get slideshowActionShowInCollection => 'Mostrar na Coleção'; + + @override + String get entryInfoActionEditDate => 'Editar data e hora'; + + @override + String get entryInfoActionEditLocation => 'Editar localização'; + + @override + String get entryInfoActionEditTitleDescription => 'Editar título e descrição'; + + @override + String get entryInfoActionEditRating => 'Editar classificação'; + + @override + String get entryInfoActionEditTags => 'Editar etiquetas'; + + @override + String get entryInfoActionRemoveMetadata => 'Remover metadados'; + + @override + String get entryInfoActionExportMetadata => 'Exportar metadados'; + + @override + String get entryInfoActionRemoveLocation => 'Remover localização'; + + @override + String get editorActionTransform => 'Transformar'; + + @override + String get editorTransformCrop => 'Cortar'; + + @override + String get editorTransformRotate => 'Girar'; + + @override + String get cropAspectRatioFree => 'Livre'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Quadrada'; + + @override + String get filterAspectRatioLandscapeLabel => 'Paisagem'; + + @override + String get filterAspectRatioPortraitLabel => 'Retrato'; + + @override + String get filterBinLabel => 'Lixeira'; + + @override + String get filterFavouriteLabel => 'Favorito'; + + @override + String get filterNoDateLabel => 'Sem data'; + + @override + String get filterNoAddressLabel => 'Sem endereço'; + + @override + String get filterLocatedLabel => 'Localizado'; + + @override + String get filterNoLocationLabel => 'Não localizado'; + + @override + String get filterNoRatingLabel => 'Sem classificação'; + + @override + String get filterTaggedLabel => 'Marcado'; + + @override + String get filterNoTagLabel => 'Sem etiqueta'; + + @override + String get filterNoTitleLabel => 'Sem título'; + + @override + String get filterOnThisDayLabel => 'Neste dia'; + + @override + String get filterRecentlyAddedLabel => 'Adicionado recentemente'; + + @override + String get filterRatingRejectedLabel => 'Rejeitado'; + + @override + String get filterTypeAnimatedLabel => 'Animado'; + + @override + String get filterTypeMotionPhotoLabel => 'Foto em movimento'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° vídeo'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Imagem'; + + @override + String get filterMimeVideoLabel => 'Vídeo'; + + @override + String get accessibilityAnimationsRemove => 'Prevenir efeitos de tela'; + + @override + String get accessibilityAnimationsKeep => 'Manter efeitos de tela'; + + @override + String get albumTierNew => 'Novo'; + + @override + String get albumTierPinned => 'Fixada'; + + @override + String get albumTierGroups => 'Grupos'; + + @override + String get albumTierSpecial => 'Comum'; + + @override + String get albumTierApps => 'Aplicativos'; + + @override + String get albumTierVaults => 'Cofres'; + + @override + String get albumTierDynamic => 'Dinâmico'; + + @override + String get albumTierRegular => 'Outras'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Graus decimais'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'L'; + + @override + String get coordinateDmsWest => 'O'; + + @override + String get displayRefreshRatePreferHighest => 'Taxa mais alta'; + + @override + String get displayRefreshRatePreferLowest => 'Taxa mais baixa'; + + @override + String get keepScreenOnNever => 'Nunca'; + + @override + String get keepScreenOnVideoPlayback => 'Durante a reprodução do video'; + + @override + String get keepScreenOnViewerOnly => 'Somente página do visualizador'; + + @override + String get keepScreenOnAlways => 'Sempre'; + + @override + String get lengthUnitPixel => 'pixels'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Híbrido)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terreno)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'OSM Humanitário'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (Aquarela)'; + + @override + String get maxBrightnessNever => 'Nunca'; + + @override + String get maxBrightnessAlways => 'Sempre'; + + @override + String get nameConflictStrategyRename => 'Renomear'; + + @override + String get nameConflictStrategyReplace => 'Substituir'; + + @override + String get nameConflictStrategySkip => 'Pular'; + + @override + String get overlayHistogramNone => 'Nenhum'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminância'; + + @override + String get subtitlePositionTop => 'Topo'; + + @override + String get subtitlePositionBottom => 'Fundo'; + + @override + String get themeBrightnessLight => 'Claro'; + + @override + String get themeBrightnessDark => 'Escuro'; + + @override + String get themeBrightnessBlack => 'Preto'; + + @override + String get unitSystemMetric => 'Métrica'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Padrão'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Senha'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Abrir com outro player'; + + @override + String get videoLoopModeNever => 'Nunca'; + + @override + String get videoLoopModeShortOnly => 'Apenas vídeos curtos'; + + @override + String get videoLoopModeAlways => 'Sempre'; + + @override + String get videoPlaybackSkip => 'Pular'; + + @override + String get videoPlaybackMuted => 'Reproduzir sem som'; + + @override + String get videoPlaybackWithSound => 'Reproduzir com som'; + + @override + String get videoResumptionModeNever => 'Nunca'; + + @override + String get videoResumptionModeAlways => 'Sempre'; + + @override + String get viewerTransitionSlide => 'Deslizar'; + + @override + String get viewerTransitionParallax => 'Paralaxe'; + + @override + String get viewerTransitionFade => 'Desvaneça'; + + @override + String get viewerTransitionZoomIn => 'Mais zoom'; + + @override + String get viewerTransitionNone => 'Nenhum'; + + @override + String get wallpaperTargetHome => 'Tela inicial'; + + @override + String get wallpaperTargetLock => 'Tela de bloqueio'; + + @override + String get wallpaperTargetHomeLock => 'Telas iniciais e de bloqueio'; + + @override + String get widgetDisplayedItemRandom => 'Aleatório'; + + @override + String get widgetDisplayedItemMostRecent => 'Mais recente'; + + @override + String get widgetOpenPageHome => 'Abrir inicial'; + + @override + String get widgetOpenPageCollection => 'Abrir coleção'; + + @override + String get widgetOpenPageViewer => 'Abrir visualizador'; + + @override + String get widgetTapUpdateWidget => 'Atualizar o widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Armazenamento interno'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'cartão SD'; + + @override + String get rootDirectoryDescription => 'diretório raiz'; + + @override + String otherDirectoryDescription(String name) { + return 'diretório “$name”'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Selecione o $directory de “$volume” na próxima tela para dar acesso a este aplicativo.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Este aplicativo não tem permissão para modificar arquivos no $directory de “$volume”.\n\nUse um gerenciador de arquivos ou aplicativo de galeria pré-instalado para mover os itens para outro diretório.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Esta operação precisa $neededSize de espaço livre em “$volume” para completar, mas só $freeSize restantes.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'O seletor de arquivos do sistema está ausente ou desabilitado. Por favor, habilite e tente novamente.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Esta operação não é suportada para itens dos seguintes tipos: $types.', + one: 'Esta operação não é suportada para itens do seguinte tipo: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Alguns arquivos na pasta de destino têm o mesmo nome.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Alguns arquivos têm o mesmo nome.'; + + @override + String get addShortcutDialogLabel => 'Rótulo de atalho'; + + @override + String get addShortcutButtonLabel => 'ADICIONAR'; + + @override + String get noMatchingAppDialogMessage => 'Não há aplicativos que possam lidar com isso.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Mova estes $countString itens para a lixeira?', + one: 'Mover esse item para a lixeira?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Tem certeza de que deseja excluir estes $countString itens?', + one: 'Tem certeza de que deseja excluir este item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Salvar as datas dos itens antes de continuar?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Definir data'; + + @override + String videoResumeDialogMessage(String time) { + return 'Deseja continuar jogando em $time?'; + } + + @override + String get videoStartOverButtonLabel => 'RECOMEÇAR'; + + @override + String get videoResumeButtonLabel => 'RETOMAR'; + + @override + String get setCoverDialogLatest => 'Último item'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Personalizado'; + + @override + String get hideFilterConfirmationDialogMessage => 'Fotos e vídeos correspondentes serão ocultados da sua coleção. Você pode mostrá-los novamente nas configurações de “Privacidade”.\n\nTem certeza de que deseja ocultá-los?'; + + @override + String get newAlbumDialogTitle => 'Novo álbum'; + + @override + String get newAlbumDialogNameLabel => 'Nome do álbum'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'O álbum já existe'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'O diretório já existe'; + + @override + String get newAlbumDialogStorageLabel => 'Armazenar:'; + + @override + String get newDynamicAlbumDialogTitle => 'Novo Álbum Dinâmico'; + + @override + String get dynamicAlbumAlreadyExists => 'O álbum dinâmico já existe'; + + @override + String get newGroupDialogTitle => 'Novo Grupo'; + + @override + String get newGroupDialogNameLabel => 'Nome do grupo'; + + @override + String get groupAlreadyExists => 'O grupo já existe'; + + @override + String get groupEmpty => 'Nenhum grupo'; + + @override + String get ungrouped => 'Desagrupado'; + + @override + String get groupPickerTitle => 'Selecionar Grupo'; + + @override + String get groupPickerUseThisGroupButton => 'Usar este grupo'; + + @override + String get newVaultWarningDialogMessage => 'Os itens nos cofres estão disponíveis apenas para este aplicativo e nenhum outro.\n\nSe você desinstalar este aplicativo ou limpar os dados do aplicativo, perderá todos esses itens.'; + + @override + String get newVaultDialogTitle => 'Novo Cofre'; + + @override + String get configureVaultDialogTitle => 'Configurar Cofre'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Bloquear quando a tela desligar'; + + @override + String get vaultDialogLockTypeLabel => 'Tipo de bloqueio'; + + @override + String get patternDialogEnter => 'Inserir padrão'; + + @override + String get patternDialogConfirm => 'Confirmar padrão'; + + @override + String get pinDialogEnter => 'Digite o PIN'; + + @override + String get pinDialogConfirm => 'Confirme o PIN'; + + @override + String get passwordDialogEnter => 'Digite a senha'; + + @override + String get passwordDialogConfirm => 'Confirmar senha'; + + @override + String get authenticateToConfigureVault => 'Autentique-se para configurar o cofre'; + + @override + String get authenticateToUnlockVault => 'Autentique-se para desbloquear o cofre'; + + @override + String get vaultBinUsageDialogMessage => 'Alguns cofres estão usando a lixeira.'; + + @override + String get renameAlbumDialogLabel => 'Novo nome'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'O diretório já existe'; + + @override + String get renameEntrySetPageTitle => 'Renomear'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Padrão de nomeação'; + + @override + String get renameEntrySetPageInsertTooltip => 'Inserir campo'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Visualizar'; + + @override + String get renameProcessorCounter => 'Contador'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Nome'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Tem certeza de que deseja excluir este álbum e seus $countString itens?', + one: 'Tem certeza de que deseja excluir este álbum e seu item?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Tem certeza de que deseja excluir estes álbuns e seus $countString itens?', + one: 'Tem certeza de que deseja excluir estes álbuns e seus itens?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Formato:'; + + @override + String get exportEntryDialogWidth => 'Largura'; + + @override + String get exportEntryDialogHeight => 'Altura'; + + @override + String get exportEntryDialogQuality => 'Qualidade'; + + @override + String get exportEntryDialogWriteMetadata => 'Escrever metadados'; + + @override + String get renameEntryDialogLabel => 'Novo nome'; + + @override + String get editEntryDialogCopyFromItem => 'Copiar de outro item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Campos para modificar'; + + @override + String get editEntryDateDialogTitle => 'Data e hora'; + + @override + String get editEntryDateDialogSetCustom => 'Definir data personalizada'; + + @override + String get editEntryDateDialogCopyField => 'Copiar de outra data'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extrair do título'; + + @override + String get editEntryDateDialogShift => 'Mudança'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Data de modificação do arquivo'; + + @override + String get durationDialogHours => 'Horas'; + + @override + String get durationDialogMinutes => 'Minutos'; + + @override + String get durationDialogSeconds => 'Segundos'; + + @override + String get editEntryLocationDialogTitle => 'Localização'; + + @override + String get editEntryLocationDialogSetCustom => 'Definir local personalizado'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Escolha no mapa'; + + @override + String get editEntryLocationDialogImportGpx => 'Importar GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Salto temporal'; + + @override + String get locationPickerUseThisLocationButton => 'Usar essa localização'; + + @override + String get editEntryRatingDialogTitle => 'Avaliação'; + + @override + String get removeEntryMetadataDialogTitle => 'Remoção de metadados'; + + @override + String get removeEntryMetadataDialogAll => 'Todos'; + + @override + String get removeEntryMetadataDialogMore => 'Mais'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP é necessário para reproduzir o vídeo dentro de uma foto em movimento.\n\nTem certeza de que deseja removê-lo?'; + + @override + String get videoSpeedDialogLabel => 'Velocidade de reprodução'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Áudio'; + + @override + String get videoStreamSelectionDialogText => 'Legendas'; + + @override + String get videoStreamSelectionDialogOff => 'Fora'; + + @override + String get videoStreamSelectionDialogTrack => 'Acompanhar'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Não há outras faixas.'; + + @override + String get genericSuccessFeedback => 'Feito!'; + + @override + String get genericFailureFeedback => 'Falhou'; + + @override + String get genericDangerWarningDialogMessage => 'Tem certeza?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Tente novamente com menos itens.'; + + @override + String get menuActionConfigureView => 'Visualizar'; + + @override + String get menuActionSelect => 'Selecionar'; + + @override + String get menuActionSelectAll => 'Selecionar tudo'; + + @override + String get menuActionSelectNone => 'Selecione nenhum'; + + @override + String get menuActionMap => 'Mapa'; + + @override + String get menuActionSlideshow => 'Apresentação de slides'; + + @override + String get menuActionStats => 'Estatísticas'; + + @override + String get viewDialogSortSectionTitle => 'Organizar'; + + @override + String get viewDialogGroupSectionTitle => 'Seções'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Ordem de classificação inversa'; + + @override + String get tileLayoutMosaic => 'Mosaico'; + + @override + String get tileLayoutGrid => 'Rede'; + + @override + String get tileLayoutList => 'Lista'; + + @override + String get castDialogTitle => 'Dispositivos para Transmitir'; + + @override + String get coverDialogTabCover => 'Capa'; + + @override + String get coverDialogTabApp => 'Aplicativo'; + + @override + String get coverDialogTabColor => 'Cor'; + + @override + String get appPickDialogTitle => 'Escolha o aplicativo'; + + @override + String get appPickDialogNone => 'Nenhum'; + + @override + String get aboutPageTitle => 'Sobre'; + + @override + String get aboutLinkLicense => 'Licença'; + + @override + String get aboutLinkPolicy => 'Política de Privacidade'; + + @override + String get aboutBugSectionTitle => 'Relatório de erro'; + + @override + String get aboutBugSaveLogInstruction => 'Salvar registros de aplicativos em um arquivo'; + + @override + String get aboutBugCopyInfoInstruction => 'Copiar informações do sistema'; + + @override + String get aboutBugCopyInfoButton => 'Copiar'; + + @override + String get aboutBugReportInstruction => 'Relatório no GitHub com os logs e informações do sistema'; + + @override + String get aboutBugReportButton => 'Relatório'; + + @override + String get aboutDataUsageSectionTitle => 'Uso de Dados'; + + @override + String get aboutDataUsageData => 'Dados'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Banco de Dados'; + + @override + String get aboutDataUsageMisc => 'Outros'; + + @override + String get aboutDataUsageInternal => 'Interno'; + + @override + String get aboutDataUsageExternal => 'Externo'; + + @override + String get aboutDataUsageClearCache => 'Limpar o cache'; + + @override + String get aboutCreditsSectionTitle => 'Créditos'; + + @override + String get aboutCreditsWorldAtlas1 => 'Este aplicativo usa um arquivo de TopoJSON'; + + @override + String get aboutCreditsWorldAtlas2 => 'sob licença ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'Tradutores'; + + @override + String get aboutLicensesSectionTitle => 'Licenças de código aberto'; + + @override + String get aboutLicensesBanner => 'Este aplicativo usa os seguintes pacotes e bibliotecas de código aberto.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Bibliotecas Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Plug-ins Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Pacotes Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Pacotes Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Mostrar todas as licenças'; + + @override + String get policyPageTitle => 'Política de Privacidade'; + + @override + String get collectionPageTitle => 'Coleção'; + + @override + String get collectionPickPageTitle => 'Escolher'; + + @override + String get collectionSelectPageTitle => 'Selecionar itens'; + + @override + String get collectionActionShowTitleSearch => 'Mostrar filtro de título'; + + @override + String get collectionActionHideTitleSearch => 'Ocultar filtro de título'; + + @override + String get collectionActionAddDynamicAlbum => 'Adicionar álbum dinâmico'; + + @override + String get collectionActionAddShortcut => 'Adicionar atalho'; + + @override + String get collectionActionSetHome => 'Definir como início'; + + @override + String get collectionActionEmptyBin => 'Caixa vazia'; + + @override + String get collectionActionCopy => 'Copiar para o álbum'; + + @override + String get collectionActionMove => 'Mover para o álbum'; + + @override + String get collectionActionRescan => 'Reexaminar'; + + @override + String get collectionActionEdit => 'Editar'; + + @override + String get collectionSearchTitlesHintText => 'Pesquisar títulos'; + + @override + String get collectionGroupAlbum => 'Por álbum'; + + @override + String get collectionGroupMonth => 'Por mês'; + + @override + String get collectionGroupDay => 'Por dia'; + + @override + String get sectionNone => 'Nenhuma seção'; + + @override + String get sectionUnknown => 'Desconhecido'; + + @override + String get dateToday => 'Hoje'; + + @override + String get dateYesterday => 'Ontem'; + + @override + String get dateThisMonth => 'Este mês'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Falha ao excluir $countString itens', + one: 'Falha ao excluir 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Falha ao copiar $countString itens', + one: 'Falha ao copiar 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Falha ao mover $countString itens', + one: 'Falha ao mover 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Falha ao renomear $countString itens', + one: 'Falhei em renomear 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Falha ao editar $countString itens', + one: 'Falha ao editar 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Falha ao exportar $countString páginas', + one: 'Falha ao exportar 1 página', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copiado $countString itens', + one: '1 item copiado', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Mudou-se $countString itens', + one: '1 item movido', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renomeado $countString itens', + one: '1 item renomeado', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Editado $countString itens', + one: 'Editado 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Nenhum favorito'; + + @override + String get collectionEmptyVideos => 'Nenhum video'; + + @override + String get collectionEmptyImages => 'Nenhuma imagem'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Garantir acesso'; + + @override + String get collectionSelectSectionTooltip => 'Selecionar seção'; + + @override + String get collectionDeselectSectionTooltip => 'Desmarcar seção'; + + @override + String get drawerAboutButton => 'Sobre'; + + @override + String get drawerSettingsButton => 'Configurações'; + + @override + String get drawerCollectionAll => 'Toda a coleção'; + + @override + String get drawerCollectionFavourites => 'Favoritos'; + + @override + String get drawerCollectionImages => 'Imagens'; + + @override + String get drawerCollectionVideos => 'Vídeos'; + + @override + String get drawerCollectionAnimated => 'Animado'; + + @override + String get drawerCollectionMotionPhotos => 'Fotos em movimento'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Fotos Raw'; + + @override + String get drawerCollectionSphericalVideos => 'Vídeos 360°'; + + @override + String get drawerAlbumPage => 'Álbuns'; + + @override + String get drawerCountryPage => 'Países'; + + @override + String get drawerPlacePage => 'Lugares'; + + @override + String get drawerTagPage => 'Etiquetas'; + + @override + String get sortByDate => 'Por data'; + + @override + String get sortByName => 'Por nome'; + + @override + String get sortByItemCount => 'Por contagem de itens'; + + @override + String get sortBySize => 'Por tamanho'; + + @override + String get sortByAlbumFileName => 'Por álbum e título do item'; + + @override + String get sortByRating => 'Por classificação'; + + @override + String get sortByDuration => 'Por duração'; + + @override + String get sortByPath => 'Pelo caminho'; + + @override + String get sortOrderNewestFirst => 'Os mais novos primeiro'; + + @override + String get sortOrderOldestFirst => 'Mais velhos primeiro'; + + @override + String get sortOrderAtoZ => 'A a Z'; + + @override + String get sortOrderZtoA => 'Z a A'; + + @override + String get sortOrderHighestFirst => 'Mais alto primeiro'; + + @override + String get sortOrderLowestFirst => 'Mais baixo primeiro'; + + @override + String get sortOrderLargestFirst => 'Maior primeiro'; + + @override + String get sortOrderSmallestFirst => 'Menor primeiro'; + + @override + String get sortOrderShortestFirst => 'Mais curtos primeiro'; + + @override + String get sortOrderLongestFirst => 'Mais longos primeiro'; + + @override + String get albumGroupTier => 'Por nível'; + + @override + String get albumGroupType => 'Por tipo'; + + @override + String get albumGroupVolume => 'Por volume de armazenamento'; + + @override + String get albumMimeTypeMixed => 'Misturado'; + + @override + String get albumPickPageTitleCopy => 'Copiar para o álbum'; + + @override + String get albumPickPageTitleExport => 'Exportar para o álbum'; + + @override + String get albumPickPageTitleMove => 'Mover para o álbum'; + + @override + String get albumPickPageTitlePick => 'Escolher álbum'; + + @override + String get albumCamera => 'Câmera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Capturas de tela'; + + @override + String get albumScreenRecordings => 'Gravações de tela'; + + @override + String get albumVideoCaptures => 'Capturas de vídeo'; + + @override + String get albumPageTitle => 'Álbuns'; + + @override + String get albumEmpty => 'Nenhum álbum'; + + @override + String get createAlbumButtonLabel => 'CRIA'; + + @override + String get newFilterBanner => 'novo'; + + @override + String get countryPageTitle => 'Países'; + + @override + String get countryEmpty => 'Nenhum país'; + + @override + String get statePageTitle => 'Estados'; + + @override + String get stateEmpty => 'Nenhum estado'; + + @override + String get placePageTitle => 'Lugares'; + + @override + String get placeEmpty => 'Sem lugares'; + + @override + String get tagPageTitle => 'Etiquetas'; + + @override + String get tagEmpty => 'Sem etiquetas'; + + @override + String get tagPickPageTitle => 'Escolher etiqueta'; + + @override + String get binPageTitle => 'Lixeira'; + + @override + String get explorerPageTitle => 'Explorador'; + + @override + String get explorerActionSelectStorageVolume => 'Selecione o armazenamento'; + + @override + String get selectStorageVolumeDialogTitle => 'Selecione o Armazenamento'; + + @override + String get searchCollectionFieldHint => 'Pesquisar coleção'; + + @override + String get searchRecentSectionTitle => 'Recente'; + + @override + String get searchDateSectionTitle => 'Data'; + + @override + String get searchFormatSectionTitle => 'Formatos'; + + @override + String get searchAlbumsSectionTitle => 'Álbuns'; + + @override + String get searchCountriesSectionTitle => 'Países'; + + @override + String get searchStatesSectionTitle => 'Estados'; + + @override + String get searchPlacesSectionTitle => 'Locais'; + + @override + String get searchTagsSectionTitle => 'Etiquetas'; + + @override + String get searchRatingSectionTitle => 'Classificações'; + + @override + String get searchMetadataSectionTitle => 'Metadados'; + + @override + String get settingsPageTitle => 'Configurações'; + + @override + String get settingsSystemDefault => 'Sistema'; + + @override + String get settingsDefault => 'Padrão'; + + @override + String get settingsDisabled => 'Desativada'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Perguntar sempre'; + + @override + String get settingsModificationWarningDialogMessage => 'Outras configurações serão modificadas.'; + + @override + String get settingsSearchFieldLabel => 'Pesquisar configuração'; + + @override + String get settingsSearchEmpty => 'Nenhuma configuração correspondente'; + + @override + String get settingsActionExport => 'Exportar'; + + @override + String get settingsActionExportDialogTitle => 'Exportar'; + + @override + String get settingsActionImport => 'Importar'; + + @override + String get settingsActionImportDialogTitle => 'Importar'; + + @override + String get appExportCovers => 'Capas'; + + @override + String get appExportDynamicAlbums => 'Álbuns dinâmicos'; + + @override + String get appExportFavourites => 'Favoritos'; + + @override + String get appExportSettings => 'Configurações'; + + @override + String get settingsNavigationSectionTitle => 'Navegação'; + + @override + String get settingsHomeTile => 'Início'; + + @override + String get settingsHomeDialogTitle => 'Início'; + + @override + String get setHomeCustom => 'Personalizada'; + + @override + String get settingsKeepScreenOnTile => 'Manter a tela ligada'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Manter a tela ligada'; + + @override + String get settingsDoubleBackExit => 'Toque em “voltar” duas vezes para sair'; + + @override + String get settingsConfirmationTile => 'Caixas de diálogo de confirmação'; + + @override + String get settingsConfirmationDialogTitle => 'Caixas de diálogo de confirmação'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Pergunte antes de excluir itens para sempre'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Pergunte antes de mover itens para a lixeira'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Pergunte antes de mover itens sem data de metadados'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Mostrar mensagem depois de mover itens para a lixeira'; + + @override + String get settingsConfirmationVaultDataLoss => 'Mostrar aviso de perda de dados do cofre'; + + @override + String get settingsNavigationDrawerTile => 'Menu de navegação'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Menu de navegação'; + + @override + String get settingsNavigationDrawerBanner => 'Toque e segure para mover e reordenar os itens do menu.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Tipos'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Álbuns'; + + @override + String get settingsNavigationDrawerTabPages => 'Páginas'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Adicionar álbum'; + + @override + String get settingsNavigationBottomActionsTile => 'Navegação de fundo'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Navegação de fundo'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Toque e segure para mover botões e escolher quais ações são exibidas na barra de navegação inferior.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniaturas'; + + @override + String get settingsThumbnailOverlayTile => 'Sobreposição'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Sobreposição'; + + @override + String get settingsThumbnailShowHdrIcon => 'Mostrar ícone HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Mostrar ícone favorito'; + + @override + String get settingsThumbnailShowTagIcon => 'Mostrar ícone de etiqueta'; + + @override + String get settingsThumbnailShowLocationIcon => 'Mostrar ícone de localização'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Mostrar ícone de foto em movimento'; + + @override + String get settingsThumbnailShowRating => 'Mostrar classificação'; + + @override + String get settingsThumbnailShowRawIcon => 'Mostrar ícone raw'; + + @override + String get settingsThumbnailShowVideoDuration => 'Mostrar duração do vídeo'; + + @override + String get settingsCollectionQuickActionsTile => 'Ações rápidas'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Ações rápidas'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Navegando'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecionando'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Toque e segure para mover os botões e selecionar quais ações são exibidas ao navegar pelos itens.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Toque e segure para mover os botões e selecionar quais ações são exibidas ao selecionar itens.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Padrões de explosão'; + + @override + String get settingsCollectionBurstPatternsNone => 'Nenhum'; + + @override + String get settingsViewerSectionTitle => 'Visualizador'; + + @override + String get settingsViewerGestureSideTapNext => 'Toque nas bordas da tela para mostrar anterior/seguinte'; + + @override + String get settingsViewerUseCutout => 'Usar área de recorte'; + + @override + String get settingsViewerMaximumBrightness => 'Brilho máximo'; + + @override + String get settingsMotionPhotoAutoPlay => 'Reprodução automática de fotos em movimento'; + + @override + String get settingsImageBackground => 'Plano de fundo da imagem'; + + @override + String get settingsViewerQuickActionsTile => 'Ações rápidas'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Ações rápidas'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Toque e segure para mover os botões e selecionar quais ações são exibidas no visualizador.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Botões exibidos'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Botões disponíveis'; + + @override + String get settingsViewerQuickActionEmpty => 'Sem botões'; + + @override + String get settingsViewerOverlayTile => 'Sobreposição'; + + @override + String get settingsViewerOverlayPageTitle => 'Sobreposição'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Mostrar na abertura'; + + @override + String get settingsViewerShowHistogram => 'Mostrar histograma'; + + @override + String get settingsViewerShowMinimap => 'Mostrar minimapa'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Mostrar informações'; + + @override + String get settingsViewerShowInformationSubtitle => 'Mostrar título, data, local, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Mostrar avaliações e etiquetas'; + + @override + String get settingsViewerShowShootingDetails => 'Mostrar detalhes de disparo'; + + @override + String get settingsViewerShowDescription => 'Mostrar descrição'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Mostrar miniaturas'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Efeito de desfoque'; + + @override + String get settingsViewerSlideshowTile => 'Apresentação de slides'; + + @override + String get settingsViewerSlideshowPageTitle => 'Apresentação de slides'; + + @override + String get settingsSlideshowRepeat => 'Repetir'; + + @override + String get settingsSlideshowShuffle => 'Embaralhar'; + + @override + String get settingsSlideshowFillScreen => 'Preencher tela'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Efeito de zoom animado'; + + @override + String get settingsSlideshowTransitionTile => 'Transição'; + + @override + String get settingsSlideshowIntervalTile => 'Intervalo'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Reprodução de vídeo'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Reprodução de vídeo'; + + @override + String get settingsVideoPageTitle => 'Configurações de vídeo'; + + @override + String get settingsVideoSectionTitle => 'Vídeo'; + + @override + String get settingsVideoShowVideos => 'Mostrar vídeos'; + + @override + String get settingsVideoPlaybackTile => 'Reproduzir'; + + @override + String get settingsVideoPlaybackPageTitle => 'Reproduzir'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Aceleraçao do hardware'; + + @override + String get settingsVideoAutoPlay => 'Reprodução automática'; + + @override + String get settingsVideoLoopModeTile => 'Modo de loop'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Modo de loop'; + + @override + String get settingsVideoResumptionModeTile => 'Retomar a reprodução'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Retomar a reprodução'; + + @override + String get settingsVideoBackgroundMode => 'Modo de fundo'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Modo de fundo'; + + @override + String get settingsVideoControlsTile => 'Controles'; + + @override + String get settingsVideoControlsPageTitle => 'Controles'; + + @override + String get settingsVideoButtonsTile => 'Botões'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Toque duas vezes para reproduzir/pausar'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Toque duas vezes nas bordas da tela buscar para trás/para frente'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Deslize para cima ou para baixo para ajustar o brilho/volume'; + + @override + String get settingsSubtitleThemeTile => 'Legendas'; + + @override + String get settingsSubtitleThemePageTitle => 'Legendas'; + + @override + String get settingsSubtitleThemeSample => 'Esta é uma amostra.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Alinhamento de texto'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Alinhamento de Texto'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Posição do texto'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Posição do Texto'; + + @override + String get settingsSubtitleThemeTextSize => 'Tamanho do texto'; + + @override + String get settingsSubtitleThemeShowOutline => 'Mostrar contorno e sombra'; + + @override + String get settingsSubtitleThemeTextColor => 'Cor do texto'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Opacidade do texto'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Cor de fundo'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Opacidade do plano de fundo'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Esquerda'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Centro'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Direita'; + + @override + String get settingsPrivacySectionTitle => 'Privacidade'; + + @override + String get settingsAllowInstalledAppAccess => 'Permitir acesso ao inventário de aplicativos'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Usado para melhorar a exibição do álbum'; + + @override + String get settingsAllowErrorReporting => 'Permitir relatórios de erros anônimos'; + + @override + String get settingsSaveSearchHistory => 'Salvar histórico de pesquisa'; + + @override + String get settingsEnableBin => 'Usar lixeira'; + + @override + String get settingsEnableBinSubtitle => 'Manter itens excluídos por 30 dias'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Os itens na lixeira serão excluídos para sempre.'; + + @override + String get settingsAllowMediaManagement => 'Permitir gerenciamento de mídia'; + + @override + String get settingsHiddenItemsTile => 'Itens ocultos'; + + @override + String get settingsHiddenItemsPageTitle => 'Itens ocultos'; + + @override + String get settingsHiddenFiltersBanner => 'Fotos e vídeos que correspondem a filtros ocultos não aparecerão em sua coleção.'; + + @override + String get settingsHiddenFiltersEmpty => 'Sem filtros ocultos'; + + @override + String get settingsStorageAccessTile => 'Acesso ao armazenamento'; + + @override + String get settingsStorageAccessPageTitle => 'Acesso ao armazenamento'; + + @override + String get settingsStorageAccessBanner => 'Alguns diretórios exigem uma concessão de acesso explícito para modificar arquivos neles. Você pode revisar aqui os diretórios aos quais você deu acesso anteriormente.'; + + @override + String get settingsStorageAccessEmpty => 'Sem concessões de acesso'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revogar'; + + @override + String get settingsAccessibilitySectionTitle => 'Acessibilidade'; + + @override + String get settingsRemoveAnimationsTile => 'Remover animações'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remover Animações'; + + @override + String get settingsTimeToTakeActionTile => 'Tempo para executar uma ação'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Mostrar alternativas de gesto multitoque'; + + @override + String get settingsDisplaySectionTitle => 'Tela'; + + @override + String get settingsThemeBrightnessTile => 'Tema'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Tema'; + + @override + String get settingsThemeColorHighlights => 'Destaques de cores'; + + @override + String get settingsThemeEnableDynamicColor => 'Cor dinâmica'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Taxa de atualização de exibição'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Taxa de atualização'; + + @override + String get settingsDisplayUseTvInterface => 'Interface de TV Android'; + + @override + String get settingsLanguageSectionTitle => 'Idioma e Formatos'; + + @override + String get settingsLanguageTile => 'Idioma'; + + @override + String get settingsLanguagePageTitle => 'Idioma'; + + @override + String get settingsCoordinateFormatTile => 'Formato de coordenadas'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Formato de coordenadas'; + + @override + String get settingsUnitSystemTile => 'Unidades'; + + @override + String get settingsUnitSystemDialogTitle => 'Unidades'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Forçar numerais arábicos'; + + @override + String get settingsScreenSaverPageTitle => 'Protetor de tela'; + + @override + String get settingsWidgetPageTitle => 'Porta-retratos'; + + @override + String get settingsWidgetShowOutline => 'Contorno'; + + @override + String get settingsWidgetOpenPage => 'Ao tocar no widget'; + + @override + String get settingsWidgetDisplayedItem => 'Item exibido'; + + @override + String get settingsCollectionTile => 'Coleção'; + + @override + String get statsPageTitle => 'Estatísticas'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString itens com localização', + one: '1 item com localização', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Principais Países'; + + @override + String get statsTopStatesSectionTitle => 'Principais Estados'; + + @override + String get statsTopPlacesSectionTitle => 'Principais Lugares'; + + @override + String get statsTopTagsSectionTitle => 'Principais Etiquetas'; + + @override + String get statsTopAlbumsSectionTitle => 'Principais Álbuns'; + + @override + String get viewerOpenPanoramaButtonLabel => 'ABRIR PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'DEFINIR PAPEL DE PAREDE'; + + @override + String get viewerErrorUnknown => 'Algo não está certo!'; + + @override + String get viewerErrorDoesNotExist => 'O arquivo não existe mais.'; + + @override + String get viewerInfoPageTitle => 'Informações'; + + @override + String get viewerInfoBackToViewerTooltip => 'Voltar ao visualizador'; + + @override + String get viewerInfoUnknown => 'desconhecido'; + + @override + String get viewerInfoLabelDescription => 'Descrição'; + + @override + String get viewerInfoLabelTitle => 'Título'; + + @override + String get viewerInfoLabelDate => 'Data'; + + @override + String get viewerInfoLabelResolution => 'Resolução'; + + @override + String get viewerInfoLabelSize => 'Tamanho'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Caminho'; + + @override + String get viewerInfoLabelDuration => 'Duração'; + + @override + String get viewerInfoLabelOwner => 'Propriedade de'; + + @override + String get viewerInfoLabelCoordinates => 'Coordenadas'; + + @override + String get viewerInfoLabelAddress => 'Endereço'; + + @override + String get mapStyleDialogTitle => 'Estilo do mapa'; + + @override + String get mapStyleDialogAddStyle => 'Adicionar estilo'; + + @override + String get mapStyleTooltip => 'Selecione o estilo do mapa'; + + @override + String get mapStyleEditorDialogName => 'Nome'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomínios'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Mais zoom'; + + @override + String get mapZoomOutTooltip => 'Reduzir o zoom'; + + @override + String get mapPointNorthUpTooltip => 'Aponte para o norte para cima'; + + @override + String get mapAttributionOsmData => 'Dados do mapa © [OpenStreetMap](https://www.openstreetmap.org/copyright) colaboradores'; + + @override + String get mapAttributionOsmLiberty => 'Blocos por [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hospedado por [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Blocos por [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Blocos por [HOT](https://www.hotosm.org/) • Hospedado por [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Blocos por [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Visualizar na página do mapa'; + + @override + String get mapEmptyRegion => 'Nenhuma imagem nesta região'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Falha ao extrair dados incorporados'; + + @override + String get viewerInfoOpenLinkText => 'Abrir'; + + @override + String get viewerInfoViewXmlLinkText => 'Visualizar XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Pesquisar metadados'; + + @override + String get viewerInfoSearchEmpty => 'Nenhuma chave correspondente'; + + @override + String get viewerInfoSearchSuggestionDate => 'Data e Hora'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Descrição'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensões'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolução'; + + @override + String get viewerInfoSearchSuggestionRights => 'Direitos'; + + @override + String get wallpaperUseScrollEffect => 'Use o efeito de rolagem na tela inicial'; + + @override + String get tagEditorPageTitle => 'Editar etiquetas'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Nova etiqueta'; + + @override + String get tagEditorPageAddTagTooltip => 'Adicionar etiqueta'; + + @override + String get tagEditorSectionRecent => 'Recente'; + + @override + String get tagEditorSectionPlaceholders => 'Espaços reservados'; + + @override + String get tagEditorDiscardDialogMessage => 'Pretende rejeitar as alterações?'; + + @override + String get tagPlaceholderCountry => 'País'; + + @override + String get tagPlaceholderState => 'Estado'; + + @override + String get tagPlaceholderPlace => 'Lugar'; + + @override + String get panoramaEnableSensorControl => 'Ativar o controle do sensor'; + + @override + String get panoramaDisableSensorControl => 'Desabilitar o controle do sensor'; + + @override + String get sourceViewerPageTitle => 'Fonte'; +} diff --git a/lib/l10ngen/app_localizations_ro.dart b/lib/l10ngen/app_localizations_ro.dart new file mode 100644 index 0000000..75e6a73 --- /dev/null +++ b/lib/l10ngen/app_localizations_ro.dart @@ -0,0 +1,2374 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Romanian Moldavian Moldovan (`ro`). +class AppLocalizationsRo extends AppLocalizations { + AppLocalizationsRo([String locale = 'ro']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Bun venit la Aves'; + + @override + String get welcomeOptional => 'Opțional'; + + @override + String get welcomeTermsToggle => 'Sunt de acord cu Termenii și condițiile'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count elemente', + one: '$count element', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count coloane', + one: '$count coloană', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString secunde', + one: '$countString secundă', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minute', + one: '$countString minut', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString zile', + one: '$countString zi', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APLICA'; + + @override + String get createButtonLabel => 'CREARE'; + + @override + String get deleteButtonLabel => 'ȘTERGE'; + + @override + String get nextButtonLabel => 'URMĂTORUL'; + + @override + String get showButtonLabel => 'SPECTACOL'; + + @override + String get hideButtonLabel => 'ASCUNDE'; + + @override + String get continueButtonLabel => 'CONTINUA'; + + @override + String get saveCopyButtonLabel => 'SALVEAZĂ COPIA'; + + @override + String get applyTooltip => 'Aplică'; + + @override + String get cancelTooltip => 'Anulare'; + + @override + String get changeTooltip => 'Schimbare'; + + @override + String get clearTooltip => 'Golire'; + + @override + String get previousTooltip => 'Anterior'; + + @override + String get nextTooltip => 'Următorul'; + + @override + String get showTooltip => 'Spectacol'; + + @override + String get hideTooltip => 'Ascunde'; + + @override + String get actionRemove => 'Elimina'; + + @override + String get resetTooltip => 'Resetați'; + + @override + String get saveTooltip => 'Salvați'; + + @override + String get stopTooltip => 'Oprește'; + + @override + String get pickTooltip => 'Alege'; + + @override + String get doubleBackExitMessage => 'Atingeți „înapoi” din nou pentru a ieși.'; + + @override + String get doNotAskAgain => 'Nu cere din nou'; + + @override + String get sourceStateLoading => 'Se încarcă'; + + @override + String get sourceStateCataloguing => 'Catalogare'; + + @override + String get sourceStateLocatingCountries => 'Localizarea țărilor'; + + @override + String get sourceStateLocatingPlaces => 'Localizarea locurilor'; + + @override + String get chipActionDelete => 'Șterge'; + + @override + String get chipActionRemove => 'Elimină'; + + @override + String get chipActionShowCollection => 'Afișați în colecție'; + + @override + String get chipActionGoToAlbumPage => 'Afișați în albume'; + + @override + String get chipActionGoToCountryPage => 'Adișați în țări'; + + @override + String get chipActionGoToPlacePage => 'Arată în Locuri'; + + @override + String get chipActionGoToTagPage => 'Afișați în etichete'; + + @override + String get chipActionGoToExplorerPage => 'Afișare în Explorer'; + + @override + String get chipActionDecompose => 'Divizare'; + + @override + String get chipActionFilterOut => 'Filtre de ieșire'; + + @override + String get chipActionFilterIn => 'Filtre de intrare'; + + @override + String get chipActionHide => 'Ascunde'; + + @override + String get chipActionLock => 'Blocare'; + + @override + String get chipActionPin => 'Fixați sus'; + + @override + String get chipActionUnpin => 'Anulați fixarea de sus'; + + @override + String get chipActionGroup => 'Schimbare grupare'; + + @override + String get chipActionRename => 'Redenumiți'; + + @override + String get chipActionSetCover => 'Setați capacul'; + + @override + String get chipActionShowCountryStates => 'Afișare state'; + + @override + String get chipActionCreateGroup => 'Creați un grup'; + + @override + String get chipActionCreateAlbum => 'Creați album'; + + @override + String get chipActionCreateVault => 'Creare seif'; + + @override + String get chipActionConfigureVault => 'Configurare seif'; + + @override + String get entryActionCopyToClipboard => 'Copiați în clipboard'; + + @override + String get entryActionDelete => 'Șterge'; + + @override + String get entryActionConvert => 'Convertit'; + + @override + String get entryActionExport => 'Export'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Redenumiți'; + + @override + String get entryActionRestore => 'Restabiliți'; + + @override + String get entryActionRotateCCW => 'Rotiți în sens invers acelor de ceasornic'; + + @override + String get entryActionRotateCW => 'Roteste in sensul acelor de ceasornic'; + + @override + String get entryActionFlip => 'Întoarceți pe orizontală'; + + @override + String get entryActionPrint => 'Imprimare'; + + @override + String get entryActionShare => 'Partajare'; + + @override + String get entryActionShareImageOnly => 'Distribuie doar imaginea'; + + @override + String get entryActionShareVideoOnly => 'Distribuie numai videoclipul'; + + @override + String get entryActionViewSource => 'Vizualizare sursă'; + + @override + String get entryActionShowGeoTiffOnMap => 'Afișați ca suprapunere a hărții'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convertiți în imagine statică'; + + @override + String get entryActionViewMotionPhotoVideo => 'Deschide videoclipul'; + + @override + String get entryActionEdit => 'Editați'; + + @override + String get entryActionOpen => 'Deschide cu'; + + @override + String get entryActionSetAs => 'Setați ca'; + + @override + String get entryActionCast => 'Proiectare'; + + @override + String get entryActionOpenMap => 'Afișați în aplicația pentru hartă'; + + @override + String get entryActionRotateScreen => 'Rotiți ecranul'; + + @override + String get entryActionAddFavourite => 'Adauga la favorite'; + + @override + String get entryActionRemoveFavourite => 'Eliminați din favorite'; + + @override + String get videoActionCaptureFrame => 'Captură cadru'; + + @override + String get videoActionMute => 'Dezactivați sunetul'; + + @override + String get videoActionUnmute => 'Activați sunetul'; + + @override + String get videoActionPause => 'Pauză'; + + @override + String get videoActionPlay => 'Redă'; + + @override + String get videoActionReplay10 => 'Căutați înapoi 10 secunde'; + + @override + String get videoActionSkip10 => 'Căutați înainte 10 secunde'; + + @override + String get videoActionShowPreviousFrame => 'Afișează cadrul anterior'; + + @override + String get videoActionShowNextFrame => 'Afișează următorul cadru'; + + @override + String get videoActionSelectStreams => 'Selectați piese'; + + @override + String get videoActionSetSpeed => 'Viteza de redare'; + + @override + String get videoActionABRepeat => 'Repetă de la A la B'; + + @override + String get videoRepeatActionSetStart => 'Setează începutul'; + + @override + String get videoRepeatActionSetEnd => 'Setează sfârșitul'; + + @override + String get viewerActionSettings => 'Setări'; + + @override + String get viewerActionLock => 'Blocarea vizualizatorului'; + + @override + String get viewerActionUnlock => 'Deblocare vizualizator'; + + @override + String get slideshowActionResume => 'Reluare'; + + @override + String get slideshowActionShowInCollection => 'Afișați în colecție'; + + @override + String get entryInfoActionEditDate => 'Editați data și ora'; + + @override + String get entryInfoActionEditLocation => 'Editați locația'; + + @override + String get entryInfoActionEditTitleDescription => 'Editați titlul și descrierea'; + + @override + String get entryInfoActionEditRating => 'Editați evaluarea'; + + @override + String get entryInfoActionEditTags => 'Editați etichetele'; + + @override + String get entryInfoActionRemoveMetadata => 'Eliminați metadatele'; + + @override + String get entryInfoActionExportMetadata => 'Exportare metadate'; + + @override + String get entryInfoActionRemoveLocation => 'Eliminare locație'; + + @override + String get editorActionTransform => 'Transformă'; + + @override + String get editorTransformCrop => 'Decupare'; + + @override + String get editorTransformRotate => 'Rotire'; + + @override + String get cropAspectRatioFree => 'Liber'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Pătrat'; + + @override + String get filterAspectRatioLandscapeLabel => 'Peisaj'; + + @override + String get filterAspectRatioPortraitLabel => 'Portret'; + + @override + String get filterBinLabel => 'Cos de gunoi'; + + @override + String get filterFavouriteLabel => 'Favorit'; + + @override + String get filterNoDateLabel => 'Nedatat'; + + @override + String get filterNoAddressLabel => 'Nicio adresă'; + + @override + String get filterLocatedLabel => 'Locație'; + + @override + String get filterNoLocationLabel => 'Nelocat'; + + @override + String get filterNoRatingLabel => 'Neevaluat'; + + @override + String get filterTaggedLabel => 'Etichetat'; + + @override + String get filterNoTagLabel => 'Neetichetat'; + + @override + String get filterNoTitleLabel => 'Fără titlu'; + + @override + String get filterOnThisDayLabel => 'În această zi'; + + @override + String get filterRecentlyAddedLabel => 'Adaugate recent'; + + @override + String get filterRatingRejectedLabel => 'Respins'; + + @override + String get filterTypeAnimatedLabel => 'Animații'; + + @override + String get filterTypeMotionPhotoLabel => 'Fotografie în mișcare'; + + @override + String get filterTypePanoramaLabel => 'Panoramă'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => 'Video 360°'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Imagine'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Preveniți efectele ecranului'; + + @override + String get accessibilityAnimationsKeep => 'Păstrați efectele ecranului'; + + @override + String get albumTierNew => 'Nou'; + + @override + String get albumTierPinned => 'Fixat'; + + @override + String get albumTierGroups => 'Grupe'; + + @override + String get albumTierSpecial => 'Uzual'; + + @override + String get albumTierApps => 'Aplicații'; + + @override + String get albumTierVaults => 'Seifuri'; + + @override + String get albumTierDynamic => 'Dinamic'; + + @override + String get albumTierRegular => 'Alții'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Grade zecimale'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Rata cea mai mare'; + + @override + String get displayRefreshRatePreferLowest => 'Rata cea mai mica'; + + @override + String get keepScreenOnNever => 'Nu'; + + @override + String get keepScreenOnVideoPlayback => 'În timpul redării video'; + + @override + String get keepScreenOnViewerOnly => 'Numai pagina de vizualizare'; + + @override + String get keepScreenOnAlways => 'Mereu'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Hărți Google'; + + @override + String get mapStyleGoogleHybrid => 'Hărți Google (hibrid)'; + + @override + String get mapStyleGoogleTerrain => 'Hărți Google (Teren)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'OSM umanitar'; + + @override + String get mapStyleStamenWatercolor => 'Stamine Acuarela'; + + @override + String get maxBrightnessNever => 'Niciodată'; + + @override + String get maxBrightnessAlways => 'Mereu'; + + @override + String get nameConflictStrategyRename => 'Redenumiți'; + + @override + String get nameConflictStrategyReplace => 'Înlocuiți'; + + @override + String get nameConflictStrategySkip => 'Sări'; + + @override + String get overlayHistogramNone => 'Nimic'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminanță'; + + @override + String get subtitlePositionTop => 'Sus'; + + @override + String get subtitlePositionBottom => 'Jos'; + + @override + String get themeBrightnessLight => 'Luminoasă'; + + @override + String get themeBrightnessDark => 'Întunecată'; + + @override + String get themeBrightnessBlack => 'Black'; + + @override + String get unitSystemMetric => 'Metrice'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Model'; + + @override + String get vaultLockTypePin => 'Pin'; + + @override + String get vaultLockTypePassword => 'Parolă'; + + @override + String get settingsVideoEnablePip => 'Imagine în imagine'; + + @override + String get videoControlsPlayOutside => 'Deschide cu alt player'; + + @override + String get videoLoopModeNever => 'Niciodată'; + + @override + String get videoLoopModeShortOnly => 'Numai videoclipuri scurte'; + + @override + String get videoLoopModeAlways => 'Mereu'; + + @override + String get videoPlaybackSkip => 'Sări'; + + @override + String get videoPlaybackMuted => 'Redare fără sunet'; + + @override + String get videoPlaybackWithSound => 'Redare cu sunet'; + + @override + String get videoResumptionModeNever => 'Niciodată'; + + @override + String get videoResumptionModeAlways => 'Mereu'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Paralaxă'; + + @override + String get viewerTransitionFade => 'Decolorare'; + + @override + String get viewerTransitionZoomIn => 'Mărește zoom'; + + @override + String get viewerTransitionNone => 'Nici unul'; + + @override + String get wallpaperTargetHome => 'Ecranul de start'; + + @override + String get wallpaperTargetLock => 'Ecranul de blocare'; + + @override + String get wallpaperTargetHomeLock => 'Ecranul de start și de blocare'; + + @override + String get widgetDisplayedItemRandom => 'Aleatoriu'; + + @override + String get widgetDisplayedItemMostRecent => 'Cele mai recente'; + + @override + String get widgetOpenPageHome => 'Deschide acasă'; + + @override + String get widgetOpenPageCollection => 'Deschide colecții'; + + @override + String get widgetOpenPageViewer => 'Deschide vizualizatorul'; + + @override + String get widgetTapUpdateWidget => 'Actualizare widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Stocare internă'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'card SD'; + + @override + String get rootDirectoryDescription => 'directorul rădăcină'; + + @override + String otherDirectoryDescription(String name) { + return 'directorul „$name”'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Vă rugăm să selectați $directory „$volume” în ecranul următor pentru a oferi acestei aplicații acces la acesta.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Această aplicație nu are permisiunea de a modifica fișiere din $directory „$volume”.\n\nUtilizați un manager de fișiere preinstalat sau o aplicație de galerie pentru a muta elementele într-un alt director.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Această operațiune are nevoie de $neededSize spațiu liber pe „$volume” pentru a fi finalizată, dar a mai rămas doar $freeSize.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Selectorul de fișiere de sistem lipsește sau este dezactivat. Activați-l și încercați din nou.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Această operațiune nu este acceptată pentru articole de următoarele tipuri: $types.', + one: 'Această operațiune nu este acceptată pentru articole de următorul tip: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Unele fișiere din folderul de destinație au același nume.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Unele fișiere au același nume.'; + + @override + String get addShortcutDialogLabel => 'Etichetă de comandă rapidă'; + + @override + String get addShortcutButtonLabel => 'ADD'; + + @override + String get noMatchingAppDialogMessage => 'Nu există aplicații care să se ocupe de asta.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Mutați aceste $count articole în coșul de reciclare?', + one: 'Mutați acest articol în coșul de reciclare?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Ștergeți aceste $count articole?', + one: 'Ștergeți acest articol?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Salvați datele articolului înainte de a continua?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Salvați datele'; + + @override + String videoResumeDialogMessage(String time) { + return 'Doriți să reluați redarea la $time?'; + } + + @override + String get videoStartOverButtonLabel => 'Începe din nou'; + + @override + String get videoResumeButtonLabel => 'Reluați'; + + @override + String get setCoverDialogLatest => 'Ultimul articol'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Personalizat'; + + @override + String get hideFilterConfirmationDialogMessage => 'Fotografiile și videoclipurile care se potrivesc vor fi ascunse din colecția ta. Le puteți afișa din nou din setările „Confidențialitate”.\n\n Ești sigur că vrei să le ascunzi?'; + + @override + String get newAlbumDialogTitle => 'Album nou'; + + @override + String get newAlbumDialogNameLabel => 'Numele albumului'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Albumul există deja'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directorul există deja'; + + @override + String get newAlbumDialogStorageLabel => 'Depozitare:'; + + @override + String get newDynamicAlbumDialogTitle => 'Nou album dinamic'; + + @override + String get dynamicAlbumAlreadyExists => 'Albumul dinamic există deja'; + + @override + String get newGroupDialogTitle => 'Grup nou'; + + @override + String get newGroupDialogNameLabel => 'Nume grup'; + + @override + String get groupAlreadyExists => 'Grupul deja există'; + + @override + String get groupEmpty => 'Niciun grup'; + + @override + String get ungrouped => 'Fără grup'; + + @override + String get groupPickerTitle => 'Alege un grup'; + + @override + String get groupPickerUseThisGroupButton => 'Folosește acest grup'; + + @override + String get newVaultWarningDialogMessage => + 'Elementele din seifuri sunt disponibile doar pentru această aplicație și nu pentru altele.\n\nDacă dezinstalezi această aplicație sau ștergi datele acestei aplicații, vei pierde toate aceste elemente.'; + + @override + String get newVaultDialogTitle => 'Seif nou'; + + @override + String get configureVaultDialogTitle => 'Configurare seif'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Blocare atunci când ecranul se oprește'; + + @override + String get vaultDialogLockTypeLabel => 'Tip de blocare'; + + @override + String get patternDialogEnter => 'Introdu modelul'; + + @override + String get patternDialogConfirm => 'Confirmă modelul'; + + @override + String get pinDialogEnter => 'Introdu codul PIN'; + + @override + String get pinDialogConfirm => 'Confirmă codul PIN'; + + @override + String get passwordDialogEnter => 'Introdu parola'; + + @override + String get passwordDialogConfirm => 'Confirmă parola'; + + @override + String get authenticateToConfigureVault => 'Autentifică-te pentru a configura seiful'; + + @override + String get authenticateToUnlockVault => 'Autentifică-te pentru a debloca seiful'; + + @override + String get vaultBinUsageDialogMessage => 'Unele seifuri folosesc coșul de reciclare.'; + + @override + String get renameAlbumDialogLabel => 'Nume nou'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directorul există deja'; + + @override + String get renameEntrySetPageTitle => 'Redenumiți'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Model de denumire'; + + @override + String get renameEntrySetPageInsertTooltip => 'Inserați câmp'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Previzualizare'; + + @override + String get renameProcessorCounter => 'Tejghea'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Nume'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Ștergi acest album și $count articolele din el?', + one: 'Ștergi acest album și articolul din el?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Ștergi aceste albume și $count articolele din ele?', + one: 'Ștergi aceste albume și articolul din ele?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Lățime'; + + @override + String get exportEntryDialogHeight => 'Înălțime'; + + @override + String get exportEntryDialogQuality => 'Calitate'; + + @override + String get exportEntryDialogWriteMetadata => 'Scrierea metadatelor'; + + @override + String get renameEntryDialogLabel => 'Nume nou'; + + @override + String get editEntryDialogCopyFromItem => 'Copiați din alt articol'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Câmpuri de modificat'; + + @override + String get editEntryDateDialogTitle => 'Data și ora'; + + @override + String get editEntryDateDialogSetCustom => 'Setați o dată personalizată'; + + @override + String get editEntryDateDialogCopyField => 'Copie de la altă dată'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extras din titlu'; + + @override + String get editEntryDateDialogShift => 'Schimbă'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Data modificării fișierului'; + + @override + String get durationDialogHours => 'Ore'; + + @override + String get durationDialogMinutes => 'Minute'; + + @override + String get durationDialogSeconds => 'secunde'; + + @override + String get editEntryLocationDialogTitle => 'Locație'; + + @override + String get editEntryLocationDialogSetCustom => 'Setați locația personalizată'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Alegeți pe hartă'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitudine'; + + @override + String get editEntryLocationDialogLongitude => 'Longitudine'; + + @override + String get editEntryLocationDialogTimeShift => 'Schimb de timp'; + + @override + String get locationPickerUseThisLocationButton => 'Utilizați această locație'; + + @override + String get editEntryRatingDialogTitle => 'Evaluare'; + + @override + String get removeEntryMetadataDialogTitle => 'Eliminarea metadatelor'; + + @override + String get removeEntryMetadataDialogAll => 'Toate'; + + @override + String get removeEntryMetadataDialogMore => 'Mai mult'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP este necesar pentru a reda videoclipul dintr-o fotografie în mișcare.\n\nSunteți sigur că doriți să-l eliminați?'; + + @override + String get videoSpeedDialogLabel => 'Viteza de redare'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtitrări'; + + @override + String get videoStreamSelectionDialogOff => 'Oprit'; + + @override + String get videoStreamSelectionDialogTrack => 'Pistă'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Nu există alte piese.'; + + @override + String get genericSuccessFeedback => 'Terminat!'; + + @override + String get genericFailureFeedback => 'Eșuat'; + + @override + String get genericDangerWarningDialogMessage => 'Esti sigur?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Încearcă din nou cu mai puține elemente.'; + + @override + String get menuActionConfigureView => 'Vedere'; + + @override + String get menuActionSelect => 'Selectați'; + + @override + String get menuActionSelectAll => 'Selectează tot'; + + @override + String get menuActionSelectNone => 'Nu selectați nimic'; + + @override + String get menuActionMap => 'Hartă'; + + @override + String get menuActionSlideshow => 'Prezentare de diapozitive'; + + @override + String get menuActionStats => 'Statistici'; + + @override + String get viewDialogSortSectionTitle => 'Sortează'; + + @override + String get viewDialogGroupSectionTitle => 'Secțiuni'; + + @override + String get viewDialogLayoutSectionTitle => 'Aspect'; + + @override + String get viewDialogReverseSortOrder => 'Ordinea de sortare inversă'; + + @override + String get tileLayoutMosaic => 'Mozaic'; + + @override + String get tileLayoutGrid => 'Grilă'; + + @override + String get tileLayoutList => 'Listă'; + + @override + String get castDialogTitle => 'Dispozitive de proiectare'; + + @override + String get coverDialogTabCover => 'Copertă'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Culoare'; + + @override + String get appPickDialogTitle => 'Alegeți aplicația'; + + @override + String get appPickDialogNone => 'Nici unul'; + + @override + String get aboutPageTitle => 'Despre'; + + @override + String get aboutLinkLicense => 'Licență'; + + @override + String get aboutLinkPolicy => 'Politica de Confidențialitate'; + + @override + String get aboutBugSectionTitle => 'Raport de eroare'; + + @override + String get aboutBugSaveLogInstruction => 'Salvați jurnalele aplicației într-un fișier'; + + @override + String get aboutBugCopyInfoInstruction => 'Copiați informațiile despre sistem'; + + @override + String get aboutBugCopyInfoButton => 'Copie'; + + @override + String get aboutBugReportInstruction => 'Raportați pe GitHub cu jurnalele și informațiile de sistem'; + + @override + String get aboutBugReportButton => 'Raport'; + + @override + String get aboutDataUsageSectionTitle => 'Utilizare date'; + + @override + String get aboutDataUsageData => 'Date'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Bază de date'; + + @override + String get aboutDataUsageMisc => 'Diverse'; + + @override + String get aboutDataUsageInternal => 'Intern'; + + @override + String get aboutDataUsageExternal => 'Extern'; + + @override + String get aboutDataUsageClearCache => 'Golește memoria cache'; + + @override + String get aboutCreditsSectionTitle => 'Credite'; + + @override + String get aboutCreditsWorldAtlas1 => 'Această aplicație folosește un fișier TopoJSON de la'; + + @override + String get aboutCreditsWorldAtlas2 => 'sub licență ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'Traducători'; + + @override + String get aboutLicensesSectionTitle => 'Licențe open-source'; + + @override + String get aboutLicensesBanner => 'Această aplicație folosește următoarele pachete și biblioteci open-source.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Biblioteci Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Pluginuri Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Pachete Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Pachete Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Afișați toate licențele'; + + @override + String get policyPageTitle => 'Politica de Confidențialitate'; + + @override + String get collectionPageTitle => 'Colectie'; + + @override + String get collectionPickPageTitle => 'Alege'; + + @override + String get collectionSelectPageTitle => 'Selectați articole'; + + @override + String get collectionActionShowTitleSearch => 'Afișează filtrul de titlu'; + + @override + String get collectionActionHideTitleSearch => 'Ascunde filtrul de titlu'; + + @override + String get collectionActionAddDynamicAlbum => 'Adaugă album dinamic'; + + @override + String get collectionActionAddShortcut => 'Adauga scurtatura'; + + @override + String get collectionActionSetHome => 'Setare ca principal'; + + @override + String get collectionActionEmptyBin => 'Coșul gol'; + + @override + String get collectionActionCopy => 'Copiați în album'; + + @override + String get collectionActionMove => 'Mutați la album'; + + @override + String get collectionActionRescan => 'Rescanați'; + + @override + String get collectionActionEdit => 'Editați'; + + @override + String get collectionSearchTitlesHintText => 'Căutați titluri'; + + @override + String get collectionGroupAlbum => 'După album'; + + @override + String get collectionGroupMonth => 'După lună'; + + @override + String get collectionGroupDay => 'După zi'; + + @override + String get sectionNone => 'Nicio secțiune'; + + @override + String get sectionUnknown => 'Necunoscut'; + + @override + String get dateToday => 'Astăzi'; + + @override + String get dateYesterday => 'Ieri'; + + @override + String get dateThisMonth => 'Luna aceasta'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'A eșuat ștergerea a $count elemente', + one: 'A eșuat ștergerea unui element', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Eșuat la copierea $count articole', + one: 'Eșuat la copierea unui articol', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nu s-au mutat $count articole', + one: 'Nu s-au mutat 1 articol', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'A eșuat redenumirea a $count elemente', + one: 'A eșuat redenumirea unui element', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'A eșuat editarea a $count elemente', + one: 'A eșuat editarea unui element', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'A eșuat exportarea a $count pagini', + one: 'A eșuat exportarea unei pagini', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'S-au copiat $count articole', + one: 'S-a copiat 1 articol', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'S-au mutat $count articole', + one: 'S-a mutat 1 articol', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'S-au renumit $count articole', + one: 'Sa renumit 1 articol', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'S-au editat $count articole', + one: 'S-a editat 1 articol', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Fără favorite'; + + @override + String get collectionEmptyVideos => 'Fără videoclipuri'; + + @override + String get collectionEmptyImages => 'Fără imagini'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Acordare acces'; + + @override + String get collectionSelectSectionTooltip => 'Selectați secțiunea'; + + @override + String get collectionDeselectSectionTooltip => 'Deselectați secțiunea'; + + @override + String get drawerAboutButton => 'Despre'; + + @override + String get drawerSettingsButton => 'Setări'; + + @override + String get drawerCollectionAll => 'Toată colecția'; + + @override + String get drawerCollectionFavourites => 'Favorite'; + + @override + String get drawerCollectionImages => 'Imagini'; + + @override + String get drawerCollectionVideos => 'Videoclipuri'; + + @override + String get drawerCollectionAnimated => 'Animate'; + + @override + String get drawerCollectionMotionPhotos => 'Fotografii în mișcare'; + + @override + String get drawerCollectionPanoramas => 'Panorame'; + + @override + String get drawerCollectionRaws => 'Fotografii Raw'; + + @override + String get drawerCollectionSphericalVideos => 'Videoclipuri 360°'; + + @override + String get drawerAlbumPage => 'Albume'; + + @override + String get drawerCountryPage => 'Țări'; + + @override + String get drawerPlacePage => 'Locații'; + + @override + String get drawerTagPage => 'Etichete'; + + @override + String get sortByDate => 'După dată'; + + @override + String get sortByName => 'După nume'; + + @override + String get sortByItemCount => 'După numărul de elemente'; + + @override + String get sortBySize => 'După dimensiune'; + + @override + String get sortByAlbumFileName => 'După album și numele elementului'; + + @override + String get sortByRating => 'După evaluare'; + + @override + String get sortByDuration => 'După durată'; + + @override + String get sortByPath => 'După cale'; + + @override + String get sortOrderNewestFirst => 'Cele mai noi mai întâi'; + + @override + String get sortOrderOldestFirst => 'Cele mai vechi mai întâi'; + + @override + String get sortOrderAtoZ => 'De la A la Z'; + + @override + String get sortOrderZtoA => 'De la Z la A'; + + @override + String get sortOrderHighestFirst => 'Cele mai înalte întâi'; + + @override + String get sortOrderLowestFirst => 'Cele mai joase mai întâi'; + + @override + String get sortOrderLargestFirst => 'Cele mai mari întâi'; + + @override + String get sortOrderSmallestFirst => 'Cele mai mici întâi'; + + @override + String get sortOrderShortestFirst => 'Cel mai scurt mai întâi'; + + @override + String get sortOrderLongestFirst => 'Cel mai lung mai întâi'; + + @override + String get albumGroupTier => 'După nivel'; + + @override + String get albumGroupType => 'După tip'; + + @override + String get albumGroupVolume => 'După volumul de stocare'; + + @override + String get albumMimeTypeMixed => 'Amestecat'; + + @override + String get albumPickPageTitleCopy => 'Copiere în album'; + + @override + String get albumPickPageTitleExport => 'Exportare în album'; + + @override + String get albumPickPageTitleMove => 'Mutare în album'; + + @override + String get albumPickPageTitlePick => 'Alegeți albumul'; + + @override + String get albumCamera => 'Cameră'; + + @override + String get albumDownload => 'Descărcări'; + + @override + String get albumScreenshots => 'Capturi de ecran'; + + @override + String get albumScreenRecordings => 'Înregistrări de ecran'; + + @override + String get albumVideoCaptures => 'Capturi video'; + + @override + String get albumPageTitle => 'Albume'; + + @override + String get albumEmpty => 'Fără albume'; + + @override + String get createAlbumButtonLabel => 'CREARE'; + + @override + String get newFilterBanner => 'nou'; + + @override + String get countryPageTitle => 'Țări'; + + @override + String get countryEmpty => 'Fără țări'; + + @override + String get statePageTitle => 'State'; + + @override + String get stateEmpty => 'Nu există state'; + + @override + String get placePageTitle => 'Locații'; + + @override + String get placeEmpty => 'Nu există locații'; + + @override + String get tagPageTitle => 'Etichete'; + + @override + String get tagEmpty => 'Fără etichete'; + + @override + String get tagPickPageTitle => 'Alege eticheta'; + + @override + String get binPageTitle => 'Coș de reciclare'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Selectează spațiu de stocare'; + + @override + String get selectStorageVolumeDialogTitle => 'Selectează spațiu de stocare'; + + @override + String get searchCollectionFieldHint => 'Căutare colecție'; + + @override + String get searchRecentSectionTitle => 'Recente'; + + @override + String get searchDateSectionTitle => 'Dată'; + + @override + String get searchFormatSectionTitle => 'Formate'; + + @override + String get searchAlbumsSectionTitle => 'Albume'; + + @override + String get searchCountriesSectionTitle => 'Țări'; + + @override + String get searchStatesSectionTitle => 'State'; + + @override + String get searchPlacesSectionTitle => 'Locuri'; + + @override + String get searchTagsSectionTitle => 'Etichete'; + + @override + String get searchRatingSectionTitle => 'Evaluări'; + + @override + String get searchMetadataSectionTitle => 'Metadate'; + + @override + String get settingsPageTitle => 'Setări'; + + @override + String get settingsSystemDefault => 'Implicit sistem'; + + @override + String get settingsDefault => 'Implicit'; + + @override + String get settingsDisabled => 'Dezactivat'; + + @override + String get settingsEnabled => 'Activat'; + + @override + String get settingsForced => 'Forțat'; + + @override + String get settingsAskEverytime => 'Întreabă de fiecare dată'; + + @override + String get settingsModificationWarningDialogMessage => 'Alte setări vor fi modificate.'; + + @override + String get settingsSearchFieldLabel => 'Căutare setări'; + + @override + String get settingsSearchEmpty => 'Nicio setare potrivită'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Coperți'; + + @override + String get appExportDynamicAlbums => 'Albume dinamice'; + + @override + String get appExportFavourites => 'Favorite'; + + @override + String get appExportSettings => 'Setări'; + + @override + String get settingsNavigationSectionTitle => 'Navigare'; + + @override + String get settingsHomeTile => 'Acasă'; + + @override + String get settingsHomeDialogTitle => 'Acasă'; + + @override + String get setHomeCustom => 'Personalizat'; + + @override + String get settingsKeepScreenOnTile => 'Se păstrează ecranul pornit'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Se păstrează ecranul pornit'; + + @override + String get settingsDoubleBackExit => 'Atingeți „înapoi” de două ori pentru a ieși'; + + @override + String get settingsConfirmationTile => 'Dialogurile de confirmare'; + + @override + String get settingsConfirmationDialogTitle => 'Dialoguri de confirmare'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Întreabă înainte de a șterge articole pentru totdeauna'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Întreabă înainte de a muta obiecte în coșul de reciclare'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Întreabă înainte de a muta articole fără dată'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Afișare mesaj după mutarea elementelor în coșul de reciclare'; + + @override + String get settingsConfirmationVaultDataLoss => 'Afișare avertisment privind pierderile de date din seif'; + + @override + String get settingsNavigationDrawerTile => 'Meniu de navigare'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Meniu de navigare'; + + @override + String get settingsNavigationDrawerBanner => 'Atingeți și țineți apăsat pentru a muta și a reordona elementele de meniu.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Tipuri'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albume'; + + @override + String get settingsNavigationDrawerTabPages => 'Pagini'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Adăugare album'; + + @override + String get settingsNavigationBottomActionsTile => 'Navigare jos'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Navigare Jos'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Atinge și menține apăsat pentru a muta butoanele și a selecta ce acțiuni sunt afișate în bara de navigare de jos.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniaturi'; + + @override + String get settingsThumbnailOverlayTile => 'Suprapunere'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Suprapunere'; + + @override + String get settingsThumbnailShowHdrIcon => 'Afișare pictogramă HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Afișare pictogramă favorite'; + + @override + String get settingsThumbnailShowTagIcon => 'Afișare pictogramă etichetă'; + + @override + String get settingsThumbnailShowLocationIcon => 'Afișare pictogramă locație'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Afișare pictogramă fotografie în mișcare'; + + @override + String get settingsThumbnailShowRating => 'Afișare evaluare'; + + @override + String get settingsThumbnailShowRawIcon => 'Afișare pictogramă Raw'; + + @override + String get settingsThumbnailShowVideoDuration => 'Afișare durată videoclip'; + + @override + String get settingsCollectionQuickActionsTile => 'Acțiuni rapide'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Acțiuni rapide'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Navigare'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selectare'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Atingeți și mențineți apăsat pentru a muta butoanele și a selecta acțiunile care sunt afișate atunci când navigați prin elemente.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Atingeți și țineți apăsat pentru a muta butoanele și a selecta acțiunile care sunt afișate la selectarea elementelor.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Modele de rafale'; + + @override + String get settingsCollectionBurstPatternsNone => 'Niciunul'; + + @override + String get settingsViewerSectionTitle => 'Vizualizator'; + + @override + String get settingsViewerGestureSideTapNext => 'Atingeți marginile ecranului pentru a afișa elementul anterior/următor'; + + @override + String get settingsViewerUseCutout => 'Utilizarea zonei de decupare'; + + @override + String get settingsViewerMaximumBrightness => 'Luminozitate maximă'; + + @override + String get settingsMotionPhotoAutoPlay => 'Redarea automată a fotografiilor în mișcare'; + + @override + String get settingsImageBackground => 'Fundal imagine'; + + @override + String get settingsViewerQuickActionsTile => 'Acțiuni rapide'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Acțiuni rapide'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Atingeți și țineți apăsat pentru a muta butoanele și a selecta acțiunile care sunt afișate în vizualizator.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Butoane afișate'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Butoane disponibile'; + + @override + String get settingsViewerQuickActionEmpty => 'Fără butoane'; + + @override + String get settingsViewerOverlayTile => 'Suprapunere'; + + @override + String get settingsViewerOverlayPageTitle => 'Suprapunere'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Afișare la deschidere'; + + @override + String get settingsViewerShowHistogram => 'Afișare histogramă'; + + @override + String get settingsViewerShowMinimap => 'Afișare mini-hartă'; + + @override + String get settingsViewerShowZoomLevel => 'Arată nivelul de proximitate'; + + @override + String get settingsViewerShowInformation => 'Afișare informații'; + + @override + String get settingsViewerShowInformationSubtitle => 'Afișare titlu, dată, locație etc.'; + + @override + String get settingsViewerShowRatingTags => 'Afișare evaluare și etichete'; + + @override + String get settingsViewerShowShootingDetails => 'Afișare detalii de fotografiere'; + + @override + String get settingsViewerShowDescription => 'Afișare descriere'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Afișare miniaturi'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Efect de estompare'; + + @override + String get settingsViewerSlideshowTile => 'Prezentare diapozitive'; + + @override + String get settingsViewerSlideshowPageTitle => 'Prezentare diapozitive'; + + @override + String get settingsSlideshowRepeat => 'Repetare'; + + @override + String get settingsSlideshowShuffle => 'Amestecare'; + + @override + String get settingsSlideshowFillScreen => 'Se umple ecranul'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Efect de zoom animat'; + + @override + String get settingsSlideshowTransitionTile => 'Tranziție'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Redare video'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Redare video'; + + @override + String get settingsVideoPageTitle => 'Setări video'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Afișare videoclipuri'; + + @override + String get settingsVideoPlaybackTile => 'Redare'; + + @override + String get settingsVideoPlaybackPageTitle => 'Redare'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Accelerare hardware'; + + @override + String get settingsVideoAutoPlay => 'Redare automată'; + + @override + String get settingsVideoLoopModeTile => 'Modul buclă'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Mod buclă'; + + @override + String get settingsVideoResumptionModeTile => 'Reluare redare'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Reluare redare'; + + @override + String get settingsVideoBackgroundMode => 'Mod fundal'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Mod fundal'; + + @override + String get settingsVideoControlsTile => 'Controale'; + + @override + String get settingsVideoControlsPageTitle => 'Controale'; + + @override + String get settingsVideoButtonsTile => 'Butoane'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Atingeți de două ori pentru a reda/întrerupe'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Atingeți de două ori marginile ecranului pentru a trece înapoi/înainte'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Glisați în sus sau în jos pentru a regla luminozitatea/volumul'; + + @override + String get settingsSubtitleThemeTile => 'Subtitrări'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitrări'; + + @override + String get settingsSubtitleThemeSample => 'Acesta este un exemplu.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Alinierea textului'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Alinierea textului'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Poziția textului'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Poziția textului'; + + @override + String get settingsSubtitleThemeTextSize => 'Dimensiunea textului'; + + @override + String get settingsSubtitleThemeShowOutline => 'Afișarea conturului și a umbrei'; + + @override + String get settingsSubtitleThemeTextColor => 'Culoarea textului'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Opacitatea textului'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Culoarea de fundal'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Opacitatea fundalului'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Stânga'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Centru'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Dreapta'; + + @override + String get settingsPrivacySectionTitle => 'Confidențialitate'; + + @override + String get settingsAllowInstalledAppAccess => 'Permiteți accesul la inventarul aplicațiilor'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Folosit pentru a îmbunătăți afișarea albumelor'; + + @override + String get settingsAllowErrorReporting => 'Permiteți raportarea anonimă a erorilor'; + + @override + String get settingsSaveSearchHistory => 'Salvare istoric căutări'; + + @override + String get settingsEnableBin => 'Utilizare coș de reciclare'; + + @override + String get settingsEnableBinSubtitle => 'Se păstrează elementele șterse timp de 30 de zile'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Articolele din coșul de reciclare vor fi șterse pentru totdeauna.'; + + @override + String get settingsAllowMediaManagement => 'Permiteți gestionarea media'; + + @override + String get settingsHiddenItemsTile => 'Articole ascunse'; + + @override + String get settingsHiddenItemsPageTitle => 'Articole ascunse'; + + @override + String get settingsHiddenFiltersBanner => 'Fotografiile și videoclipurile care corespund filtrelor ascunse nu vor apărea în colecție.'; + + @override + String get settingsHiddenFiltersEmpty => 'Fără filtre ascunse'; + + @override + String get settingsStorageAccessTile => 'Acces la stocare'; + + @override + String get settingsStorageAccessPageTitle => 'Acces la stocare'; + + @override + String get settingsStorageAccessBanner => 'Unele directoare necesită o acordare de acces explicită pentru a modifica fișierele din ele. Puteți consulta aici directoarele la care anterior ați dat acces.'; + + @override + String get settingsStorageAccessEmpty => 'Fără acordări de acces'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revocare'; + + @override + String get settingsAccessibilitySectionTitle => 'Accesibilitate'; + + @override + String get settingsRemoveAnimationsTile => 'Eliminați animațiile'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Eliminați animațiile'; + + @override + String get settingsTimeToTakeActionTile => 'Timpul pentru acțiune'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Afișare alternative de gesturi atingeri-multiple'; + + @override + String get settingsDisplaySectionTitle => 'Afișare'; + + @override + String get settingsThemeBrightnessTile => 'Temă'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Temă'; + + @override + String get settingsThemeColorHighlights => 'Evidențieri de culoare'; + + @override + String get settingsThemeEnableDynamicColor => 'Culoare dinamică'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Rata de reîmprospătare a ecranului'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Rată de reîmprospătare'; + + @override + String get settingsDisplayUseTvInterface => 'Interfață Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Limbă și formate'; + + @override + String get settingsLanguageTile => 'Limbă'; + + @override + String get settingsLanguagePageTitle => 'Limbă'; + + @override + String get settingsCoordinateFormatTile => 'Formatul coordonatelor'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Formatul coordonatelor'; + + @override + String get settingsUnitSystemTile => 'Unități'; + + @override + String get settingsUnitSystemDialogTitle => 'Unități'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Cifre arabe forțat'; + + @override + String get settingsScreenSaverPageTitle => 'Economizor de ecran'; + + @override + String get settingsWidgetPageTitle => 'Ramă foto'; + + @override + String get settingsWidgetShowOutline => 'Contur'; + + @override + String get settingsWidgetOpenPage => 'Când atingeți widget-ul'; + + @override + String get settingsWidgetDisplayedItem => 'Element afișat'; + + @override + String get settingsCollectionTile => 'Colecție'; + + @override + String get statsPageTitle => 'Statistici'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count articole cu locație', + one: '1 articol cu locație', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Țări de top'; + + @override + String get statsTopStatesSectionTitle => 'Statele de top'; + + @override + String get statsTopPlacesSectionTitle => 'Locuri de top'; + + @override + String get statsTopTagsSectionTitle => 'Etichete de top'; + + @override + String get statsTopAlbumsSectionTitle => 'Albume de top'; + + @override + String get viewerOpenPanoramaButtonLabel => 'DESCHIDERE PANORAMĂ'; + + @override + String get viewerSetWallpaperButtonLabel => 'SETARE CA FUNDAL'; + + @override + String get viewerErrorUnknown => 'Hopa!'; + + @override + String get viewerErrorDoesNotExist => 'Fișierul nu mai există.'; + + @override + String get viewerInfoPageTitle => 'Informații'; + + @override + String get viewerInfoBackToViewerTooltip => 'Înapoi la vizualizator'; + + @override + String get viewerInfoUnknown => 'necunoscut'; + + @override + String get viewerInfoLabelDescription => 'Descriere'; + + @override + String get viewerInfoLabelTitle => 'Titlu'; + + @override + String get viewerInfoLabelDate => 'Dată'; + + @override + String get viewerInfoLabelResolution => 'Rezoluție'; + + @override + String get viewerInfoLabelSize => 'Dimensiune'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Cale'; + + @override + String get viewerInfoLabelDuration => 'Durată'; + + @override + String get viewerInfoLabelOwner => 'Proprietar'; + + @override + String get viewerInfoLabelCoordinates => 'Coordonate'; + + @override + String get viewerInfoLabelAddress => 'Adresă'; + + @override + String get mapStyleDialogTitle => 'Stil hartă'; + + @override + String get mapStyleDialogAddStyle => 'Adaugă stil'; + + @override + String get mapStyleTooltip => 'Selectați stilul hărții'; + + @override + String get mapStyleEditorDialogName => 'Nume'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomenii'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Mărire'; + + @override + String get mapZoomOutTooltip => 'Micșorare'; + + @override + String get mapPointNorthUpTooltip => 'Îndreptați spre nord în sus'; + + @override + String get mapAttributionOsmData => 'Datele hărții © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributori'; + + @override + String get mapAttributionOsmLiberty => 'Plăci de la [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Găzduit de [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Plăci de la [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Plăci de la [HOT](https://www.hotosm.org/) • Găzduit de [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Plăci de la [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Vizualizare pe pagina hărții'; + + @override + String get mapEmptyRegion => 'Nu există imagini în această regiune'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Nu s-a reușit extragerea datelor încorporate'; + + @override + String get viewerInfoOpenLinkText => 'Deschidere'; + + @override + String get viewerInfoViewXmlLinkText => 'Vizualizare XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Căutare metadate'; + + @override + String get viewerInfoSearchEmpty => 'Nu există chei potrivite'; + + @override + String get viewerInfoSearchSuggestionDate => 'Data și ora'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Descriere'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensiuni'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Rezoluție'; + + @override + String get viewerInfoSearchSuggestionRights => 'Drepturi'; + + @override + String get wallpaperUseScrollEffect => 'Utilizați efectul de derulare pe ecranul de pornire'; + + @override + String get tagEditorPageTitle => 'Editare etichete'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Etichetă nouă'; + + @override + String get tagEditorPageAddTagTooltip => 'Adăugare etichetă'; + + @override + String get tagEditorSectionRecent => 'Recente'; + + @override + String get tagEditorSectionPlaceholders => 'Substituenți'; + + @override + String get tagEditorDiscardDialogMessage => 'Dorești să renunți la modificări?'; + + @override + String get tagPlaceholderCountry => 'Țară'; + + @override + String get tagPlaceholderState => 'Stat'; + + @override + String get tagPlaceholderPlace => 'Loc'; + + @override + String get panoramaEnableSensorControl => 'Activați controlul tactil'; + + @override + String get panoramaDisableSensorControl => 'Dezactivați controlul tactil'; + + @override + String get sourceViewerPageTitle => 'Sursă'; +} diff --git a/lib/l10ngen/app_localizations_ru.dart b/lib/l10ngen/app_localizations_ru.dart new file mode 100644 index 0000000..57f0971 --- /dev/null +++ b/lib/l10ngen/app_localizations_ru.dart @@ -0,0 +1,2439 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Russian (`ru`). +class AppLocalizationsRu extends AppLocalizations { + AppLocalizationsRu([String locale = 'ru']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Добро пожаловать в Aves'; + + @override + String get welcomeOptional => 'Опционально'; + + @override + String get welcomeTermsToggle => 'Я согласен с условиями и положениями'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString объектов', + few: '$countString объекта', + one: '$countString объект', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count столбцов', + few: '$count столбца', + one: '$count столбец', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString секунд', + few: '$countString секунды', + one: '$countString секунда', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString минут', + few: '$countString минуты', + one: '$countString минута', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString дней', + few: '$countString дня', + one: '$countString день', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'ПРИМЕНИТЬ'; + + @override + String get createButtonLabel => 'СОЗДАТЬ'; + + @override + String get deleteButtonLabel => 'УДАЛИТЬ'; + + @override + String get nextButtonLabel => 'ДАЛЕЕ'; + + @override + String get showButtonLabel => 'ПОКАЗАТЬ'; + + @override + String get hideButtonLabel => 'СКРЫТЬ'; + + @override + String get continueButtonLabel => 'ПРОДОЛЖИТЬ'; + + @override + String get saveCopyButtonLabel => 'СОХРАНИТЬ КОПИЮ'; + + @override + String get applyTooltip => 'Применить'; + + @override + String get cancelTooltip => 'Отмена'; + + @override + String get changeTooltip => 'Изменить'; + + @override + String get clearTooltip => 'Очистить'; + + @override + String get previousTooltip => 'Предыдущий'; + + @override + String get nextTooltip => 'Следующий'; + + @override + String get showTooltip => 'Показать'; + + @override + String get hideTooltip => 'Скрыть'; + + @override + String get actionRemove => 'Удалить'; + + @override + String get resetTooltip => 'Сбросить'; + + @override + String get saveTooltip => 'Сохранить'; + + @override + String get stopTooltip => 'Остановить'; + + @override + String get pickTooltip => 'Выбрать'; + + @override + String get doubleBackExitMessage => 'Нажмите «Назад» еще раз, чтобы выйти.'; + + @override + String get doNotAskAgain => 'Больше не спрашивать'; + + @override + String get sourceStateLoading => 'Загрузка'; + + @override + String get sourceStateCataloguing => 'Каталогизация'; + + @override + String get sourceStateLocatingCountries => 'Расположение стран'; + + @override + String get sourceStateLocatingPlaces => 'Расположение локаций'; + + @override + String get chipActionDelete => 'Удалить'; + + @override + String get chipActionRemove => 'Удалить'; + + @override + String get chipActionShowCollection => 'Показать в Коллекции'; + + @override + String get chipActionGoToAlbumPage => 'Показать в Альбомах'; + + @override + String get chipActionGoToCountryPage => 'Показать в Странах'; + + @override + String get chipActionGoToPlacePage => 'Показать в локациях'; + + @override + String get chipActionGoToTagPage => 'Показать в тегах'; + + @override + String get chipActionGoToExplorerPage => 'Показать в проводнике'; + + @override + String get chipActionDecompose => 'Раздел'; + + @override + String get chipActionFilterOut => 'Исключить'; + + @override + String get chipActionFilterIn => 'Включить'; + + @override + String get chipActionHide => 'Скрыть'; + + @override + String get chipActionLock => 'Заблокировать'; + + @override + String get chipActionPin => 'Закрепить'; + + @override + String get chipActionUnpin => 'Открепить'; + + @override + String get chipActionGroup => 'Изменить группировку'; + + @override + String get chipActionRename => 'Переименовать'; + + @override + String get chipActionSetCover => 'Установить обложку'; + + @override + String get chipActionShowCountryStates => 'Показать государства'; + + @override + String get chipActionCreateGroup => 'Создать группу'; + + @override + String get chipActionCreateAlbum => 'Создать альбом'; + + @override + String get chipActionCreateVault => 'Создать хранилище'; + + @override + String get chipActionConfigureVault => 'Настроить хранилище'; + + @override + String get entryActionCopyToClipboard => 'Скопировать в буфер обмена'; + + @override + String get entryActionDelete => 'Удалить'; + + @override + String get entryActionConvert => 'Конвертировать'; + + @override + String get entryActionExport => 'Экспорт'; + + @override + String get entryActionInfo => 'Информация'; + + @override + String get entryActionRename => 'Переименовать'; + + @override + String get entryActionRestore => 'Восстановить'; + + @override + String get entryActionRotateCCW => 'Повернуть против часовой стрелки'; + + @override + String get entryActionRotateCW => 'Повернуть по часовой стрелки'; + + @override + String get entryActionFlip => 'Отразить по горизонтали'; + + @override + String get entryActionPrint => 'Печать'; + + @override + String get entryActionShare => 'Поделиться'; + + @override + String get entryActionShareImageOnly => 'Поделиться только изображением'; + + @override + String get entryActionShareVideoOnly => 'Поделиться только видео'; + + @override + String get entryActionViewSource => 'Посмотреть источник'; + + @override + String get entryActionShowGeoTiffOnMap => 'Показать на карте'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Конвертировать в статичное изображение'; + + @override + String get entryActionViewMotionPhotoVideo => 'Открыть видео'; + + @override + String get entryActionEdit => 'Изменить'; + + @override + String get entryActionOpen => 'Открыть с помощью'; + + @override + String get entryActionSetAs => 'Установить как'; + + @override + String get entryActionCast => 'Трансляция'; + + @override + String get entryActionOpenMap => 'Показать на карте'; + + @override + String get entryActionRotateScreen => 'Повернуть экран'; + + @override + String get entryActionAddFavourite => 'Добавить в избранное'; + + @override + String get entryActionRemoveFavourite => 'Удалить из избранного'; + + @override + String get videoActionCaptureFrame => 'Сохранить кадр'; + + @override + String get videoActionMute => 'Выключить звук'; + + @override + String get videoActionUnmute => 'Включить звук'; + + @override + String get videoActionPause => 'Стоп'; + + @override + String get videoActionPlay => 'Играть'; + + @override + String get videoActionReplay10 => 'Перемотка на 10 секунд назад'; + + @override + String get videoActionSkip10 => 'Перемотка на 10 секунд вперёд'; + + @override + String get videoActionShowPreviousFrame => 'Показать предыдущий кадр'; + + @override + String get videoActionShowNextFrame => 'Показать следующий кадр'; + + @override + String get videoActionSelectStreams => 'Выбрать дорожку'; + + @override + String get videoActionSetSpeed => 'Скорость воспроизведения'; + + @override + String get videoActionABRepeat => 'Повторить от А до Б'; + + @override + String get videoRepeatActionSetStart => 'Установить начало'; + + @override + String get videoRepeatActionSetEnd => 'Установить конец'; + + @override + String get viewerActionSettings => 'Настройки'; + + @override + String get viewerActionLock => 'Заблокировать просмотрщик'; + + @override + String get viewerActionUnlock => 'Разблокировать просмотрщик'; + + @override + String get slideshowActionResume => 'Продолжить'; + + @override + String get slideshowActionShowInCollection => 'Показать в Коллекции'; + + @override + String get entryInfoActionEditDate => 'Изменить дату и время'; + + @override + String get entryInfoActionEditLocation => 'Изменить местоположение'; + + @override + String get entryInfoActionEditTitleDescription => 'Изменить название и описание'; + + @override + String get entryInfoActionEditRating => 'Изменить рейтинг'; + + @override + String get entryInfoActionEditTags => 'Изменить теги'; + + @override + String get entryInfoActionRemoveMetadata => 'Удалить метаданные'; + + @override + String get entryInfoActionExportMetadata => 'Экспорт метаданных'; + + @override + String get entryInfoActionRemoveLocation => 'Удалить местоположение'; + + @override + String get editorActionTransform => 'Изменить'; + + @override + String get editorTransformCrop => 'Обрезать'; + + @override + String get editorTransformRotate => 'Повернуть'; + + @override + String get cropAspectRatioFree => 'Свободное'; + + @override + String get cropAspectRatioOriginal => 'Изначальное'; + + @override + String get cropAspectRatioSquare => 'Квадратное'; + + @override + String get filterAspectRatioLandscapeLabel => 'Горизонтально'; + + @override + String get filterAspectRatioPortraitLabel => 'Вертикально'; + + @override + String get filterBinLabel => 'Корзина'; + + @override + String get filterFavouriteLabel => 'Избранное'; + + @override + String get filterNoDateLabel => 'Без даты'; + + @override + String get filterNoAddressLabel => 'Без адреса'; + + @override + String get filterLocatedLabel => 'С местоположением'; + + @override + String get filterNoLocationLabel => 'Без местоположения'; + + @override + String get filterNoRatingLabel => 'Без рейтинга'; + + @override + String get filterTaggedLabel => 'С тэгами'; + + @override + String get filterNoTagLabel => 'Без тегов'; + + @override + String get filterNoTitleLabel => 'Без названия'; + + @override + String get filterOnThisDayLabel => 'В этот день'; + + @override + String get filterRecentlyAddedLabel => 'Недавно добавленные'; + + @override + String get filterRatingRejectedLabel => 'Отклонённое'; + + @override + String get filterTypeAnimatedLabel => 'GIF'; + + @override + String get filterTypeMotionPhotoLabel => 'Живое фото'; + + @override + String get filterTypePanoramaLabel => 'Панорама'; + + @override + String get filterTypeRawLabel => 'RAW'; + + @override + String get filterTypeSphericalVideoLabel => '360° видео'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Изображение'; + + @override + String get filterMimeVideoLabel => 'Видео'; + + @override + String get accessibilityAnimationsRemove => 'Предотвратить экранные эффекты'; + + @override + String get accessibilityAnimationsKeep => 'Сохранить экранные эффекты'; + + @override + String get albumTierNew => 'Новые'; + + @override + String get albumTierPinned => 'Закрепленные'; + + @override + String get albumTierGroups => 'Группы'; + + @override + String get albumTierSpecial => 'Стандартные'; + + @override + String get albumTierApps => 'Приложения'; + + @override + String get albumTierVaults => 'Хранилища'; + + @override + String get albumTierDynamic => 'Динамический'; + + @override + String get albumTierRegular => 'Другие'; + + @override + String get coordinateFormatDms => 'Градусы, минуты и секунды'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Десятичные градусы'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'с. ш.'; + + @override + String get coordinateDmsSouth => 'ю. ш.'; + + @override + String get coordinateDmsEast => 'в. д.'; + + @override + String get coordinateDmsWest => 'з. д.'; + + @override + String get displayRefreshRatePreferHighest => 'Наивысшая частота'; + + @override + String get displayRefreshRatePreferLowest => 'Наименьшая частота'; + + @override + String get keepScreenOnNever => 'Никогда'; + + @override + String get keepScreenOnVideoPlayback => 'Во время воспроизведения видео'; + + @override + String get keepScreenOnViewerOnly => 'Только в просмотрщике'; + + @override + String get keepScreenOnAlways => 'Всегда'; + + @override + String get lengthUnitPixel => 'пикс.'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Карты'; + + @override + String get mapStyleGoogleHybrid => 'Google Карты (Гибридный)'; + + @override + String get mapStyleGoogleTerrain => 'Google Карты (Местность)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Акварель'; + + @override + String get maxBrightnessNever => 'Никогда'; + + @override + String get maxBrightnessAlways => 'Всегда'; + + @override + String get nameConflictStrategyRename => 'Переименовать'; + + @override + String get nameConflictStrategyReplace => 'Заменить'; + + @override + String get nameConflictStrategySkip => 'Пропустить'; + + @override + String get overlayHistogramNone => 'Откл.'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Яркость'; + + @override + String get subtitlePositionTop => 'Наверху'; + + @override + String get subtitlePositionBottom => 'Внизу'; + + @override + String get themeBrightnessLight => 'Светлая'; + + @override + String get themeBrightnessDark => 'Тёмная'; + + @override + String get themeBrightnessBlack => 'Чёрная'; + + @override + String get unitSystemMetric => 'Метрические'; + + @override + String get unitSystemImperial => 'Имперские'; + + @override + String get vaultLockTypePattern => 'Графический ключ'; + + @override + String get vaultLockTypePin => 'Пин-код'; + + @override + String get vaultLockTypePassword => 'Пароль'; + + @override + String get settingsVideoEnablePip => 'Картинка в картинке'; + + @override + String get videoControlsPlayOutside => 'Открыть в другом видеоплеере'; + + @override + String get videoLoopModeNever => 'Никогда'; + + @override + String get videoLoopModeShortOnly => 'Только для коротких видео'; + + @override + String get videoLoopModeAlways => 'Всегда'; + + @override + String get videoPlaybackSkip => 'Пропустить'; + + @override + String get videoPlaybackMuted => 'Играть без звука'; + + @override + String get videoPlaybackWithSound => 'Играть со звуком'; + + @override + String get videoResumptionModeNever => 'Никогда'; + + @override + String get videoResumptionModeAlways => 'Всегда'; + + @override + String get viewerTransitionSlide => 'Скольжение'; + + @override + String get viewerTransitionParallax => 'Параллакс'; + + @override + String get viewerTransitionFade => 'Затухание'; + + @override + String get viewerTransitionZoomIn => 'Приближение'; + + @override + String get viewerTransitionNone => 'Нет'; + + @override + String get wallpaperTargetHome => 'Домашний экран'; + + @override + String get wallpaperTargetLock => 'Экран блокировки'; + + @override + String get wallpaperTargetHomeLock => 'Домашний экран и экран блокировки'; + + @override + String get widgetDisplayedItemRandom => 'Произвольные'; + + @override + String get widgetDisplayedItemMostRecent => 'Недавние'; + + @override + String get widgetOpenPageHome => 'Открыть главную страницу'; + + @override + String get widgetOpenPageCollection => 'Открыть коллекцию'; + + @override + String get widgetOpenPageViewer => 'Просмотр текущего'; + + @override + String get widgetTapUpdateWidget => 'Обновить виджет'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Внутренняя память'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD-карта'; + + @override + String get rootDirectoryDescription => 'корневой каталог'; + + @override + String otherDirectoryDescription(String name) { + return 'каталог «$name»'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Пожалуйста, выберите $directory на накопителе «$volume» на следующем экране, чтобы предоставить этому приложению доступ к нему.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Этому приложению не разрешается изменять файлы в каталоге $directory накопителя «$volume».\n\nПожалуйста, используйте предустановленный файловый менеджер или галерею, чтобы переместить объекты в другой каталог.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Для завершения этой операции требуется $neededSize свободного места на «$volume», но осталось только $freeSize.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Системное приложение выбора файлов отсутствует или отключено. Пожалуйста, включите его и повторите попытку.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Эта операция не поддерживается для объектов следующих форматов: $types.', + one: 'Эта операция не поддерживается для объектов следующего формата: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Некоторые файлы в папке назначения имеют одно и то же имя.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Некоторые файлы имеют одно и то же имя.'; + + @override + String get addShortcutDialogLabel => 'Название ярлыка'; + + @override + String get addShortcutButtonLabel => 'СОЗДАТЬ'; + + @override + String get noMatchingAppDialogMessage => 'Нет приложений, которые могли бы с этим справиться.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Переместить эти $countString объектов в корзину?', + few: 'Переместить эти $countString объекта в корзину?', + one: 'Переместить этот объект в корзину?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Вы уверены, что хотите удалить эти $countString объектов?', + few: 'Вы уверены, что хотите удалить эти $countString объекта?', + one: 'Вы уверены, что хотите удалить этот объект?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Сохранить даты элементов, прежде чем продолжить?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Установить дату'; + + @override + String videoResumeDialogMessage(String time) { + return 'Хотите ли вы возобновить воспроизведение на $time?'; + } + + @override + String get videoStartOverButtonLabel => 'ВОСПРОИЗВЕСТИ СНАЧАЛА'; + + @override + String get videoResumeButtonLabel => 'ПРОДОЛЖИТЬ'; + + @override + String get setCoverDialogLatest => 'Последний объект'; + + @override + String get setCoverDialogAuto => 'Авто'; + + @override + String get setCoverDialogCustom => 'Собственная'; + + @override + String get hideFilterConfirmationDialogMessage => 'Соответствующие фотографии и видео будут скрыты из вашей коллекции. Вы можете показать их снова в настройках в разделе «Конфиденциальность».\n\nВы уверены, что хотите их скрыть?'; + + @override + String get newAlbumDialogTitle => 'Новый альбом'; + + @override + String get newAlbumDialogNameLabel => 'Название альбома'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Альбом уже существует'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Каталог уже существует'; + + @override + String get newAlbumDialogStorageLabel => 'Накопитель:'; + + @override + String get newDynamicAlbumDialogTitle => 'Новый динамический альбом'; + + @override + String get dynamicAlbumAlreadyExists => 'Динамический альбом уже существует'; + + @override + String get newGroupDialogTitle => 'Новая группа'; + + @override + String get newGroupDialogNameLabel => 'Название группы'; + + @override + String get groupAlreadyExists => 'Группа уже существует'; + + @override + String get groupEmpty => 'Групп нету'; + + @override + String get ungrouped => 'Без группировки'; + + @override + String get groupPickerTitle => 'Выбор группы'; + + @override + String get groupPickerUseThisGroupButton => 'Использовать эту группу'; + + @override + String get newVaultWarningDialogMessage => 'Элементы внутри хранилищ доступны только для этого приложения, и никакого другого.\n\nЕсли вы удалите приложение или очистите его данные, то вы потеряете все содержимое внутри хранилищ.'; + + @override + String get newVaultDialogTitle => 'Новое хранилище'; + + @override + String get configureVaultDialogTitle => 'Настроить хранилище'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Блокировать при выключении экрана'; + + @override + String get vaultDialogLockTypeLabel => 'Тип защиты'; + + @override + String get patternDialogEnter => 'Введите ключ'; + + @override + String get patternDialogConfirm => 'Подтвердите ключ'; + + @override + String get pinDialogEnter => 'Введите пин-код'; + + @override + String get pinDialogConfirm => 'Подтвердите пин-код'; + + @override + String get passwordDialogEnter => 'Введите пароль'; + + @override + String get passwordDialogConfirm => 'Подтвердите пароль'; + + @override + String get authenticateToConfigureVault => 'Аутентифицируйтесь чтобы настроить хранилище'; + + @override + String get authenticateToUnlockVault => 'Аутентифицируйтесь чтобы разблокировать хранилище'; + + @override + String get vaultBinUsageDialogMessage => 'Некоторые из хранилищ используют корзину.'; + + @override + String get renameAlbumDialogLabel => 'Новое название'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Каталог уже существует'; + + @override + String get renameEntrySetPageTitle => 'Переименовать'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Образец наименования'; + + @override + String get renameEntrySetPageInsertTooltip => 'Вставить поле'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Предпросмотр'; + + @override + String get renameProcessorCounter => 'Счётчик'; + + @override + String get renameProcessorHash => 'Хэш'; + + @override + String get renameProcessorName => 'Название'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Удалить этот альбом и $countString элементов в нем?', + one: 'Удалить этот альбом и элемент в нем?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Удалить эти альбомы и $countString элементов в них?', + one: 'Удалить эти альбомы и элемент в них?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Формат:'; + + @override + String get exportEntryDialogWidth => 'Ширина'; + + @override + String get exportEntryDialogHeight => 'Высота'; + + @override + String get exportEntryDialogQuality => 'Качество'; + + @override + String get exportEntryDialogWriteMetadata => 'Запись метаданных'; + + @override + String get renameEntryDialogLabel => 'Новое название'; + + @override + String get editEntryDialogCopyFromItem => 'Скопировать из другого объекта'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Поля для изменения'; + + @override + String get editEntryDateDialogTitle => 'Дата и время'; + + @override + String get editEntryDateDialogSetCustom => 'Установить дату'; + + @override + String get editEntryDateDialogCopyField => 'Копировать с другой даты'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Извлечь из названия'; + + @override + String get editEntryDateDialogShift => 'Сдвиг'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Дата изменения файла'; + + @override + String get durationDialogHours => 'Часов'; + + @override + String get durationDialogMinutes => 'Минут'; + + @override + String get durationDialogSeconds => 'Секунд'; + + @override + String get editEntryLocationDialogTitle => 'Местоположение'; + + @override + String get editEntryLocationDialogSetCustom => 'Редактировать местоположение'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Выбрать на карте'; + + @override + String get editEntryLocationDialogImportGpx => 'Импорт GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Широта'; + + @override + String get editEntryLocationDialogLongitude => 'Долгота'; + + @override + String get editEntryLocationDialogTimeShift => 'Сдвиг времени'; + + @override + String get locationPickerUseThisLocationButton => 'Использовать это местоположение'; + + @override + String get editEntryRatingDialogTitle => 'Рейтинг'; + + @override + String get removeEntryMetadataDialogTitle => 'Удаление метаданных'; + + @override + String get removeEntryMetadataDialogAll => 'Все'; + + @override + String get removeEntryMetadataDialogMore => 'Дополнительно'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'Для воспроизведения видео внутри этой живой фотографии требуется XMP профиль.\n\nВы уверены, что хотите удалить его?'; + + @override + String get videoSpeedDialogLabel => 'Скорость воспроизведения'; + + @override + String get videoStreamSelectionDialogVideo => 'Видео'; + + @override + String get videoStreamSelectionDialogAudio => 'Аудио'; + + @override + String get videoStreamSelectionDialogText => 'Субтитры'; + + @override + String get videoStreamSelectionDialogOff => 'Отключено'; + + @override + String get videoStreamSelectionDialogTrack => 'Дорожка'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Других дорожек нет.'; + + @override + String get genericSuccessFeedback => 'Выполнено!'; + + @override + String get genericFailureFeedback => 'Не удалось'; + + @override + String get genericDangerWarningDialogMessage => 'Вы уверены?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Попробуйте снова с меньшим числом элементов.'; + + @override + String get menuActionConfigureView => 'Вид'; + + @override + String get menuActionSelect => 'Выбрать'; + + @override + String get menuActionSelectAll => 'Выбрать все'; + + @override + String get menuActionSelectNone => 'Снять выделение'; + + @override + String get menuActionMap => 'Карта'; + + @override + String get menuActionSlideshow => 'Слайд-шоу'; + + @override + String get menuActionStats => 'Статистика'; + + @override + String get viewDialogSortSectionTitle => 'Сортировка'; + + @override + String get viewDialogGroupSectionTitle => 'Разделы'; + + @override + String get viewDialogLayoutSectionTitle => 'Макет'; + + @override + String get viewDialogReverseSortOrder => 'Обратный порядок сортировки'; + + @override + String get tileLayoutMosaic => 'Мозайка'; + + @override + String get tileLayoutGrid => 'Сетка'; + + @override + String get tileLayoutList => 'Список'; + + @override + String get castDialogTitle => 'Устройства трансляции'; + + @override + String get coverDialogTabCover => 'Обложка'; + + @override + String get coverDialogTabApp => 'Приложение'; + + @override + String get coverDialogTabColor => 'Цвет'; + + @override + String get appPickDialogTitle => 'Выберите приложение'; + + @override + String get appPickDialogNone => 'Ничего'; + + @override + String get aboutPageTitle => 'О нас'; + + @override + String get aboutLinkLicense => 'Лицензия'; + + @override + String get aboutLinkPolicy => 'Политика конфиденциальности'; + + @override + String get aboutBugSectionTitle => 'Сообщить об ошибке'; + + @override + String get aboutBugSaveLogInstruction => 'Сохраните логи приложения в файл'; + + @override + String get aboutBugCopyInfoInstruction => 'Скопируйте системную информацию'; + + @override + String get aboutBugCopyInfoButton => 'Скопировать'; + + @override + String get aboutBugReportInstruction => 'Отправьте отчёт об ошибке на GitHub вместе с логами и системной информацией'; + + @override + String get aboutBugReportButton => 'Отправить'; + + @override + String get aboutDataUsageSectionTitle => 'Использование данных'; + + @override + String get aboutDataUsageData => 'Данные'; + + @override + String get aboutDataUsageCache => 'Кэш'; + + @override + String get aboutDataUsageDatabase => 'База данных'; + + @override + String get aboutDataUsageMisc => 'Разнообразное'; + + @override + String get aboutDataUsageInternal => 'Внутреннее'; + + @override + String get aboutDataUsageExternal => 'Внешнее'; + + @override + String get aboutDataUsageClearCache => 'Очистить кэш'; + + @override + String get aboutCreditsSectionTitle => 'Благодарности'; + + @override + String get aboutCreditsWorldAtlas1 => 'Это приложение использует файл TopoJSON из'; + + @override + String get aboutCreditsWorldAtlas2 => 'под лицензией ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'Переводчики'; + + @override + String get aboutLicensesSectionTitle => 'Лицензии с открытым исходным кодом'; + + @override + String get aboutLicensesBanner => 'Это приложение использует следующие пакеты и библиотеки с открытым исходным кодом.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Библиотеки Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Плагины Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Пакеты Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Пакеты Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Показать все лицензии'; + + @override + String get policyPageTitle => 'Политика конфиденциальности'; + + @override + String get collectionPageTitle => 'Коллекция'; + + @override + String get collectionPickPageTitle => 'Выбрать'; + + @override + String get collectionSelectPageTitle => 'Выберите объекты'; + + @override + String get collectionActionShowTitleSearch => 'Показать фильтр заголовка'; + + @override + String get collectionActionHideTitleSearch => 'Скрыть фильтр заголовка'; + + @override + String get collectionActionAddDynamicAlbum => 'Добавить динамический альбом'; + + @override + String get collectionActionAddShortcut => 'Добавить ярлык'; + + @override + String get collectionActionSetHome => 'Установить как главную'; + + @override + String get collectionActionEmptyBin => 'Очистить корзину'; + + @override + String get collectionActionCopy => 'Скопировать в альбом'; + + @override + String get collectionActionMove => 'Переместить в альбом'; + + @override + String get collectionActionRescan => 'Пересканировать'; + + @override + String get collectionActionEdit => 'Изменить'; + + @override + String get collectionSearchTitlesHintText => 'Поиск заголовков'; + + @override + String get collectionGroupAlbum => 'По альбому'; + + @override + String get collectionGroupMonth => 'По месяцу'; + + @override + String get collectionGroupDay => 'По дню'; + + @override + String get sectionNone => 'Без разделов'; + + @override + String get sectionUnknown => 'Неизвестно'; + + @override + String get dateToday => 'Сегодня'; + + @override + String get dateYesterday => 'Вчера'; + + @override + String get dateThisMonth => 'В этом месяце'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не удалось удалить $countString объектов', + few: 'Не удалось удалить $countString объекта', + one: 'Не удалось удалить 1 объект', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не удалось скопировать $countString объектов', + few: 'Не удалось скопировать $countString объекта', + one: 'Не удалось скопировать 1 объект', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не удалось переместить $countString объектов', + few: 'Не удалось переместить $countString объекта', + one: 'Не удалось переместить 1 объект', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не удалось переименовать $countString объектов', + few: 'Не удалось переименовать $countString объекта', + one: 'Не удалось переименовать 1 объект', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не удалось изменить $countString объектов', + few: 'Не удалось изменить $countString объекта', + one: 'Не удалось изменить 1 объект', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не удалось экспортировать $countString страниц', + few: 'Не удалось экспортировать $countString страницы', + one: 'Не удалось экспортировать 1 страницу', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Скопировано $countString объектов', + few: 'Скопировано $countString объекта', + one: 'Скопирован 1 объект', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Перемещено $countString объектов', + few: 'Перемещено $countString объекта', + one: 'Перемещён 1 объект', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Переименовано $countString объектов', + few: 'Переименовано $countString объекта', + one: 'Переименован 1 объект', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Изменено $countString объектов', + few: 'Изменено $countString объекта', + one: 'Изменён 1 объект', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Нет избранных'; + + @override + String get collectionEmptyVideos => 'Нет видео'; + + @override + String get collectionEmptyImages => 'Нет изображений'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Предоставить доступ'; + + @override + String get collectionSelectSectionTooltip => 'Выбрать раздел'; + + @override + String get collectionDeselectSectionTooltip => 'Снять выбор с раздела'; + + @override + String get drawerAboutButton => 'О нас'; + + @override + String get drawerSettingsButton => 'Настройки'; + + @override + String get drawerCollectionAll => 'Вся коллекция'; + + @override + String get drawerCollectionFavourites => 'Избранное'; + + @override + String get drawerCollectionImages => 'Изображения'; + + @override + String get drawerCollectionVideos => 'Видео'; + + @override + String get drawerCollectionAnimated => 'GIF'; + + @override + String get drawerCollectionMotionPhotos => 'Живые фото'; + + @override + String get drawerCollectionPanoramas => 'Панорамы'; + + @override + String get drawerCollectionRaws => 'RAW'; + + @override + String get drawerCollectionSphericalVideos => '360° видео'; + + @override + String get drawerAlbumPage => 'Альбомы'; + + @override + String get drawerCountryPage => 'Страны'; + + @override + String get drawerPlacePage => 'Локации'; + + @override + String get drawerTagPage => 'Теги'; + + @override + String get sortByDate => 'По дате'; + + @override + String get sortByName => 'По названию'; + + @override + String get sortByItemCount => 'По количеству объектов'; + + @override + String get sortBySize => 'По размеру'; + + @override + String get sortByAlbumFileName => 'По названию альбома и пункта'; + + @override + String get sortByRating => 'По рейтингу'; + + @override + String get sortByDuration => 'По продолжительности'; + + @override + String get sortByPath => 'По пути'; + + @override + String get sortOrderNewestFirst => 'Сначала новые'; + + @override + String get sortOrderOldestFirst => 'Сначала старые'; + + @override + String get sortOrderAtoZ => 'От А до Я'; + + @override + String get sortOrderZtoA => 'От Я до А'; + + @override + String get sortOrderHighestFirst => 'Сначала с высоким'; + + @override + String get sortOrderLowestFirst => 'Сначала с низким'; + + @override + String get sortOrderLargestFirst => 'Сначала большие'; + + @override + String get sortOrderSmallestFirst => 'Сначала маленькие'; + + @override + String get sortOrderShortestFirst => 'Сначала самый короткий'; + + @override + String get sortOrderLongestFirst => 'Сначала самый длинный'; + + @override + String get albumGroupTier => 'По уровню'; + + @override + String get albumGroupType => 'По типу'; + + @override + String get albumGroupVolume => 'По накопителю'; + + @override + String get albumMimeTypeMixed => 'Разное'; + + @override + String get albumPickPageTitleCopy => 'Копировать в альбом'; + + @override + String get albumPickPageTitleExport => 'Экспорт в альбом'; + + @override + String get albumPickPageTitleMove => 'Переместить в альбом'; + + @override + String get albumPickPageTitlePick => 'Выберите альбом'; + + @override + String get albumCamera => 'Камера'; + + @override + String get albumDownload => 'Загрузки'; + + @override + String get albumScreenshots => 'Скриншоты'; + + @override + String get albumScreenRecordings => 'Записи экрана'; + + @override + String get albumVideoCaptures => 'Видеозаписи'; + + @override + String get albumPageTitle => 'Альбомы'; + + @override + String get albumEmpty => 'Нет альбомов'; + + @override + String get createAlbumButtonLabel => 'СОЗДАТЬ'; + + @override + String get newFilterBanner => 'новый'; + + @override + String get countryPageTitle => 'Страны'; + + @override + String get countryEmpty => 'Нет стран'; + + @override + String get statePageTitle => 'Регионы'; + + @override + String get stateEmpty => 'Нет регионов'; + + @override + String get placePageTitle => 'Локации'; + + @override + String get placeEmpty => 'Нет локаций'; + + @override + String get tagPageTitle => 'Теги'; + + @override + String get tagEmpty => 'Нет тегов'; + + @override + String get tagPickPageTitle => 'Выбрать тег'; + + @override + String get binPageTitle => 'Корзина'; + + @override + String get explorerPageTitle => 'Проводник'; + + @override + String get explorerActionSelectStorageVolume => 'Выбрать хранилище'; + + @override + String get selectStorageVolumeDialogTitle => 'Выбрать хранилище'; + + @override + String get searchCollectionFieldHint => 'Поиск по коллекции'; + + @override + String get searchRecentSectionTitle => 'Недавние'; + + @override + String get searchDateSectionTitle => 'Дата'; + + @override + String get searchFormatSectionTitle => 'Форматы'; + + @override + String get searchAlbumsSectionTitle => 'Альбомы'; + + @override + String get searchCountriesSectionTitle => 'Страны'; + + @override + String get searchStatesSectionTitle => 'Регионы'; + + @override + String get searchPlacesSectionTitle => 'Локации'; + + @override + String get searchTagsSectionTitle => 'Теги'; + + @override + String get searchRatingSectionTitle => 'Рейтинги'; + + @override + String get searchMetadataSectionTitle => 'Метаданные'; + + @override + String get settingsPageTitle => 'Настройки'; + + @override + String get settingsSystemDefault => 'Как в системе'; + + @override + String get settingsDefault => 'По умолчанию'; + + @override + String get settingsDisabled => 'Выключено'; + + @override + String get settingsEnabled => 'Включено'; + + @override + String get settingsForced => 'Принудительно'; + + @override + String get settingsAskEverytime => 'Спрашивать каждый раз'; + + @override + String get settingsModificationWarningDialogMessage => 'Другие настройки будут изменены.'; + + @override + String get settingsSearchFieldLabel => 'Поиск настроек'; + + @override + String get settingsSearchEmpty => 'Нет соответствующих настроек'; + + @override + String get settingsActionExport => 'Экспорт'; + + @override + String get settingsActionExportDialogTitle => 'Экспорт'; + + @override + String get settingsActionImport => 'Импорт'; + + @override + String get settingsActionImportDialogTitle => 'Импорт'; + + @override + String get appExportCovers => 'Обложки'; + + @override + String get appExportDynamicAlbums => 'Динамические альбомы'; + + @override + String get appExportFavourites => 'Избранное'; + + @override + String get appExportSettings => 'Настройки'; + + @override + String get settingsNavigationSectionTitle => 'Навигация'; + + @override + String get settingsHomeTile => 'Домашний каталог'; + + @override + String get settingsHomeDialogTitle => 'Домашний каталог'; + + @override + String get setHomeCustom => 'По своему'; + + @override + String get settingsKeepScreenOnTile => 'Держать экран включенным'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Держать экран включенным'; + + @override + String get settingsDoubleBackExit => 'Дважды нажмите «Назад», чтобы выйти'; + + @override + String get settingsConfirmationTile => 'Диалоги подтверждения'; + + @override + String get settingsConfirmationDialogTitle => 'Диалоги подтверждения'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Спросить, прежде чем удалять объекты навсегда'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Спросить, прежде чем перемещать объекты в корзину'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Спросить, прежде чем перемещать объекты без даты в метаданных'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Показывать сообщение после перемещения в корзину'; + + @override + String get settingsConfirmationVaultDataLoss => 'Показывать предупреждение при утере данных хранилища'; + + @override + String get settingsNavigationDrawerTile => 'Навигационное меню'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Навигационное меню'; + + @override + String get settingsNavigationDrawerBanner => 'Нажмите и удерживайте, чтобы переместить и изменить порядок пунктов меню.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Типы'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Альбомы'; + + @override + String get settingsNavigationDrawerTabPages => 'Страницы'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Добавить альбом'; + + @override + String get settingsNavigationBottomActionsTile => 'Нижняя навигация'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Нижняя навигация'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Нажмите и удерживайте, чтобы перемещать кнопки и выбирать действия, которые будут отображаться на нижней панели навигации.'; + + @override + String get settingsThumbnailSectionTitle => 'Эскизы'; + + @override + String get settingsThumbnailOverlayTile => 'Наложение'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Наложение'; + + @override + String get settingsThumbnailShowHdrIcon => 'Показать значок HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Показать значок избранного'; + + @override + String get settingsThumbnailShowTagIcon => 'Показать значок тега'; + + @override + String get settingsThumbnailShowLocationIcon => 'Показать значок местоположения'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Показать значок «живого фото»'; + + @override + String get settingsThumbnailShowRating => 'Показать рейтинг'; + + @override + String get settingsThumbnailShowRawIcon => 'Показать значок RAW-файла'; + + @override + String get settingsThumbnailShowVideoDuration => 'Показать продолжительность видео'; + + @override + String get settingsCollectionQuickActionsTile => 'Быстрые действия'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Быстрые действия'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Просмотр'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Выбор'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Нажмите и удерживайте для перемещения кнопок и выбора действий, отображаемых при просмотре объектов.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Нажмите и удерживайте, чтобы переместить кнопки и выбрать, какие действия будут отображаться при выборе элементов.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Шаблоны вспышки'; + + @override + String get settingsCollectionBurstPatternsNone => 'Без вспышки'; + + @override + String get settingsViewerSectionTitle => 'Просмотрщик'; + + @override + String get settingsViewerGestureSideTapNext => 'Нажатие на край экрана для перехода назад/вперед'; + + @override + String get settingsViewerUseCutout => 'Использовать область выреза'; + + @override + String get settingsViewerMaximumBrightness => 'Максимальная яркость'; + + @override + String get settingsMotionPhotoAutoPlay => 'Автовоспроизведение «живых фото»'; + + @override + String get settingsImageBackground => 'Фон изображения'; + + @override + String get settingsViewerQuickActionsTile => 'Быстрые действия'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Быстрые действия'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Нажмите и удерживайте для перемещения кнопок и выбора действий, отображаемых в просмотрщике.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Отображаемые кнопки'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Доступные кнопки'; + + @override + String get settingsViewerQuickActionEmpty => 'Нет кнопок'; + + @override + String get settingsViewerOverlayTile => 'Наложение'; + + @override + String get settingsViewerOverlayPageTitle => 'Наложение'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Показать наложение при открытии'; + + @override + String get settingsViewerShowHistogram => 'Показать гистограмму'; + + @override + String get settingsViewerShowMinimap => 'Показать миникарту'; + + @override + String get settingsViewerShowZoomLevel => 'Показать уровень приближения'; + + @override + String get settingsViewerShowInformation => 'Показать информацию'; + + @override + String get settingsViewerShowInformationSubtitle => 'Показать название, дату, местоположение и т.д.'; + + @override + String get settingsViewerShowRatingTags => 'Показать рейтинг и теги'; + + @override + String get settingsViewerShowShootingDetails => 'Показать детали съёмки'; + + @override + String get settingsViewerShowDescription => 'Показать описание'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Показать эскизы'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Наложение эффекта размытия'; + + @override + String get settingsViewerSlideshowTile => 'Слайд-шоу'; + + @override + String get settingsViewerSlideshowPageTitle => 'Слайд-шоу'; + + @override + String get settingsSlideshowRepeat => 'Повтор'; + + @override + String get settingsSlideshowShuffle => 'Вперемешку'; + + @override + String get settingsSlideshowFillScreen => 'Полный экран'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Анимация зум эффекта'; + + @override + String get settingsSlideshowTransitionTile => 'Эффект перехода'; + + @override + String get settingsSlideshowIntervalTile => 'Интервал'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Проигрывание видео'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Проигрывание Видео'; + + @override + String get settingsVideoPageTitle => 'Настройки видео'; + + @override + String get settingsVideoSectionTitle => 'Видео'; + + @override + String get settingsVideoShowVideos => 'Показать видео'; + + @override + String get settingsVideoPlaybackTile => 'Воспроизведение видео'; + + @override + String get settingsVideoPlaybackPageTitle => 'Воспроизведение видео'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Аппаратное ускорение'; + + @override + String get settingsVideoAutoPlay => 'Автозапуск воспроизведения'; + + @override + String get settingsVideoLoopModeTile => 'Циклический режим'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Цикличный режим'; + + @override + String get settingsVideoResumptionModeTile => 'Возобновить воспроизведение'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Возобновить воспроизведение'; + + @override + String get settingsVideoBackgroundMode => 'Фоновый режим'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Фоновый режим'; + + @override + String get settingsVideoControlsTile => 'Элементы управления'; + + @override + String get settingsVideoControlsPageTitle => 'Элементы управления'; + + @override + String get settingsVideoButtonsTile => 'Кнопки'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Двойное нажатие для воспроизведения/паузы'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Двойное нажатие на края экрана для перехода назад/вперёд'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Проведите пальцем вверх или вниз чтобы изменить яркость/громкость'; + + @override + String get settingsSubtitleThemeTile => 'Субтитры'; + + @override + String get settingsSubtitleThemePageTitle => 'Субтитры'; + + @override + String get settingsSubtitleThemeSample => 'Образец.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Выравнивание текста'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Выравнивание текста'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Положение текста'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Положение текста'; + + @override + String get settingsSubtitleThemeTextSize => 'Размер текста'; + + @override + String get settingsSubtitleThemeShowOutline => 'Показать контур и тень'; + + @override + String get settingsSubtitleThemeTextColor => 'Цвет текста'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Непрозрачность текста'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Цвет фона'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Непрозрачность фона'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'По левой стороне'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'По центру'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'По правой стороне'; + + @override + String get settingsPrivacySectionTitle => 'Конфиденциальность'; + + @override + String get settingsAllowInstalledAppAccess => 'Разрешить доступ к библиотеке приложения'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Используется для улучшения отображения альбомов'; + + @override + String get settingsAllowErrorReporting => 'Разрешить анонимную отправку логов'; + + @override + String get settingsSaveSearchHistory => 'Сохранять историю поиска'; + + @override + String get settingsEnableBin => 'Использовать корзину'; + + @override + String get settingsEnableBinSubtitle => 'Хранить удалённые объекты в течение 30 дней'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Элементы в корзине будут удалены навсегда.'; + + @override + String get settingsAllowMediaManagement => 'Разрешить управление медиа'; + + @override + String get settingsHiddenItemsTile => 'Скрытые объекты'; + + @override + String get settingsHiddenItemsPageTitle => 'Скрытые объекты'; + + @override + String get settingsHiddenFiltersBanner => 'Фотографии и видео, соответствующие скрытым фильтрам, не появятся в вашей коллекции.'; + + @override + String get settingsHiddenFiltersEmpty => 'Нет скрытых фильтров'; + + @override + String get settingsStorageAccessTile => 'Доступ к хранилищу'; + + @override + String get settingsStorageAccessPageTitle => 'Доступ к хранилищу'; + + @override + String get settingsStorageAccessBanner => 'Некоторые каталоги требуют обязательного предоставления доступа для изменения файлов в них. Вы можете просмотреть здесь каталоги, к которым вы ранее предоставили доступ.'; + + @override + String get settingsStorageAccessEmpty => 'Нет прав доступа'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Отменить'; + + @override + String get settingsAccessibilitySectionTitle => 'Специальные возможности'; + + @override + String get settingsRemoveAnimationsTile => 'Удалить анимацию'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Удалить анимацию'; + + @override + String get settingsTimeToTakeActionTile => 'Время на выполнение действия'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Показать альтернативные жесты щипка'; + + @override + String get settingsDisplaySectionTitle => 'Отображение'; + + @override + String get settingsThemeBrightnessTile => 'Тема'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Тема'; + + @override + String get settingsThemeColorHighlights => 'Цветовые акценты'; + + @override + String get settingsThemeEnableDynamicColor => 'Динамический цвет'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Частота обновления экрана'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Частота обновления'; + + @override + String get settingsDisplayUseTvInterface => 'Интерфейс Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Язык и форматы'; + + @override + String get settingsLanguageTile => 'Язык'; + + @override + String get settingsLanguagePageTitle => 'Язык'; + + @override + String get settingsCoordinateFormatTile => 'Формат координат'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Формат координат'; + + @override + String get settingsUnitSystemTile => 'Единицы измерения'; + + @override + String get settingsUnitSystemDialogTitle => 'Единицы измерения'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Принудительные арабские цифры'; + + @override + String get settingsScreenSaverPageTitle => 'Скринсейвер'; + + @override + String get settingsWidgetPageTitle => 'Фоторамка'; + + @override + String get settingsWidgetShowOutline => 'Выделение'; + + @override + String get settingsWidgetOpenPage => 'При нажатии на виджет'; + + @override + String get settingsWidgetDisplayedItem => 'Показывать'; + + @override + String get settingsCollectionTile => 'Коллекция'; + + @override + String get statsPageTitle => 'Статистика'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString объектов с местоположением', + few: '$countString объекта с местоположением', + one: '1 объект с местоположением', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Топ стран'; + + @override + String get statsTopStatesSectionTitle => 'Топ регионов'; + + @override + String get statsTopPlacesSectionTitle => 'Топ локаций'; + + @override + String get statsTopTagsSectionTitle => 'Топ тегов'; + + @override + String get statsTopAlbumsSectionTitle => 'Топ альбомов'; + + @override + String get viewerOpenPanoramaButtonLabel => 'ОТКРЫТЬ ПАНОРАМУ'; + + @override + String get viewerSetWallpaperButtonLabel => 'УСТАНОВИТЬ КАК ОБОИ'; + + @override + String get viewerErrorUnknown => 'Упс!'; + + @override + String get viewerErrorDoesNotExist => 'Файл больше не существует.'; + + @override + String get viewerInfoPageTitle => 'Информация'; + + @override + String get viewerInfoBackToViewerTooltip => 'Вернуться к просмотрщику'; + + @override + String get viewerInfoUnknown => 'неизвестный'; + + @override + String get viewerInfoLabelDescription => 'Описание'; + + @override + String get viewerInfoLabelTitle => 'Название'; + + @override + String get viewerInfoLabelDate => 'Дата'; + + @override + String get viewerInfoLabelResolution => 'Разрешение'; + + @override + String get viewerInfoLabelSize => 'Размер'; + + @override + String get viewerInfoLabelUri => 'Идентификатор'; + + @override + String get viewerInfoLabelPath => 'Расположение'; + + @override + String get viewerInfoLabelDuration => 'Продолжительность'; + + @override + String get viewerInfoLabelOwner => 'Владелец'; + + @override + String get viewerInfoLabelCoordinates => 'Координаты'; + + @override + String get viewerInfoLabelAddress => 'Адрес'; + + @override + String get mapStyleDialogTitle => 'Стиль карты'; + + @override + String get mapStyleDialogAddStyle => 'Добавить стиль'; + + @override + String get mapStyleTooltip => 'Выберите стиль карты'; + + @override + String get mapStyleEditorDialogName => 'Название'; + + @override + String get mapStyleEditorDialogUrl => 'URL-адрес'; + + @override + String get mapStyleEditorDialogSubdomains => 'Поддомены'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Увеличить'; + + @override + String get mapZoomOutTooltip => 'Уменьшить'; + + @override + String get mapPointNorthUpTooltip => 'Повернуть на север'; + + @override + String get mapAttributionOsmData => 'Данные карты © [openstreetmap](https://www.openstreetmap.org/copyright) участники'; + + @override + String get mapAttributionOsmLiberty => 'Плитки от [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Размещено на [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Плитки от [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Плитки [HOT](https://www.hotosm.org/) • Размещена на [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Плитки [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Просмотреть на странице карты'; + + @override + String get mapEmptyRegion => 'Нет изображений в этом регионе'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Не удалось извлечь встроенные данные'; + + @override + String get viewerInfoOpenLinkText => 'Открыть'; + + @override + String get viewerInfoViewXmlLinkText => 'Просмотр XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Поиск метаданных'; + + @override + String get viewerInfoSearchEmpty => 'Нет подходящих ключей'; + + @override + String get viewerInfoSearchSuggestionDate => 'Дата и время'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Описание'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Измерения'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Разрешение'; + + @override + String get viewerInfoSearchSuggestionRights => 'Права'; + + @override + String get wallpaperUseScrollEffect => 'Эффект прокрутки на домашнем экране'; + + @override + String get tagEditorPageTitle => 'Изменить теги'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Новый тег'; + + @override + String get tagEditorPageAddTagTooltip => 'Добавить тег'; + + @override + String get tagEditorSectionRecent => 'Недавние'; + + @override + String get tagEditorSectionPlaceholders => 'Закладки'; + + @override + String get tagEditorDiscardDialogMessage => 'Отменить изменения?'; + + @override + String get tagPlaceholderCountry => 'Страна'; + + @override + String get tagPlaceholderState => 'Регион'; + + @override + String get tagPlaceholderPlace => 'Локация'; + + @override + String get panoramaEnableSensorControl => 'Включить сенсорное управление'; + + @override + String get panoramaDisableSensorControl => 'Отключить сенсорное управление'; + + @override + String get sourceViewerPageTitle => 'Источник'; +} diff --git a/lib/l10ngen/app_localizations_sat.dart b/lib/l10ngen/app_localizations_sat.dart new file mode 100644 index 0000000..845765b --- /dev/null +++ b/lib/l10ngen/app_localizations_sat.dart @@ -0,0 +1,2424 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Santali (`sat`). +class AppLocalizationsSat extends AppLocalizations { + AppLocalizationsSat([String locale = 'sat']) : super(locale); + + @override + String get appName => 'ᱮᱣᱥ'; + + @override + String get welcomeMessage => 'ᱮᱣᱥ ᱨᱮ ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ'; + + @override + String get welcomeOptional => 'Optional'; + + @override + String get welcomeTermsToggle => 'I agree to the terms and conditions'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items', + one: '$countString item', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString columns', + one: '$countString column', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString seconds', + one: '$countString second', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutes', + one: '$countString minute', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString days', + one: '$countString day', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APPLY'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'DELETE'; + + @override + String get nextButtonLabel => 'NEXT'; + + @override + String get showButtonLabel => 'SHOW'; + + @override + String get hideButtonLabel => 'HIDE'; + + @override + String get continueButtonLabel => 'CONTINUE'; + + @override + String get saveCopyButtonLabel => 'SAVE COPY'; + + @override + String get applyTooltip => 'Apply'; + + @override + String get cancelTooltip => 'Cancel'; + + @override + String get changeTooltip => 'Change'; + + @override + String get clearTooltip => 'Clear'; + + @override + String get previousTooltip => 'Previous'; + + @override + String get nextTooltip => 'Next'; + + @override + String get showTooltip => 'Show'; + + @override + String get hideTooltip => 'Hide'; + + @override + String get actionRemove => 'Remove'; + + @override + String get resetTooltip => 'Reset'; + + @override + String get saveTooltip => 'Save'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'Pick'; + + @override + String get doubleBackExitMessage => 'Tap “back” again to exit.'; + + @override + String get doNotAskAgain => 'Do not ask again'; + + @override + String get sourceStateLoading => 'Loading'; + + @override + String get sourceStateCataloguing => 'Cataloguing'; + + @override + String get sourceStateLocatingCountries => 'Locating countries'; + + @override + String get sourceStateLocatingPlaces => 'Locating places'; + + @override + String get chipActionDelete => 'Delete'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Show in Collection'; + + @override + String get chipActionGoToAlbumPage => 'Show in Albums'; + + @override + String get chipActionGoToCountryPage => 'Show in Countries'; + + @override + String get chipActionGoToPlacePage => 'Show in Places'; + + @override + String get chipActionGoToTagPage => 'Show in Tags'; + + @override + String get chipActionGoToExplorerPage => 'Show in Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Filter out'; + + @override + String get chipActionFilterIn => 'Filter in'; + + @override + String get chipActionHide => 'Hide'; + + @override + String get chipActionLock => 'Lock'; + + @override + String get chipActionPin => 'Pin to top'; + + @override + String get chipActionUnpin => 'Unpin from top'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Rename'; + + @override + String get chipActionSetCover => 'Set cover'; + + @override + String get chipActionShowCountryStates => 'Show states'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Create album'; + + @override + String get chipActionCreateVault => 'Create vault'; + + @override + String get chipActionConfigureVault => 'Configure vault'; + + @override + String get entryActionCopyToClipboard => 'Copy to clipboard'; + + @override + String get entryActionDelete => 'Delete'; + + @override + String get entryActionConvert => 'Convert'; + + @override + String get entryActionExport => 'Export'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Rename'; + + @override + String get entryActionRestore => 'Restore'; + + @override + String get entryActionRotateCCW => 'Rotate counterclockwise'; + + @override + String get entryActionRotateCW => 'Rotate clockwise'; + + @override + String get entryActionFlip => 'Flip horizontally'; + + @override + String get entryActionPrint => 'Print'; + + @override + String get entryActionShare => 'Share'; + + @override + String get entryActionShareImageOnly => 'Share image only'; + + @override + String get entryActionShareVideoOnly => 'Share video only'; + + @override + String get entryActionViewSource => 'View source'; + + @override + String get entryActionShowGeoTiffOnMap => 'Show as map overlay'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convert to still image'; + + @override + String get entryActionViewMotionPhotoVideo => 'Open video'; + + @override + String get entryActionEdit => 'Edit'; + + @override + String get entryActionOpen => 'Open with'; + + @override + String get entryActionSetAs => 'Set as'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Show in map app'; + + @override + String get entryActionRotateScreen => 'Rotate screen'; + + @override + String get entryActionAddFavourite => 'Add to favorites'; + + @override + String get entryActionRemoveFavourite => 'Remove from favorites'; + + @override + String get videoActionCaptureFrame => 'Capture frame'; + + @override + String get videoActionMute => 'Mute'; + + @override + String get videoActionUnmute => 'Unmute'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Play'; + + @override + String get videoActionReplay10 => 'Seek backward 10 seconds'; + + @override + String get videoActionSkip10 => 'Seek forward 10 seconds'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Select tracks'; + + @override + String get videoActionSetSpeed => 'Playback speed'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Settings'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Resume'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'Edit date & time'; + + @override + String get entryInfoActionEditLocation => 'Edit location'; + + @override + String get entryInfoActionEditTitleDescription => 'Edit title & description'; + + @override + String get entryInfoActionEditRating => 'Edit rating'; + + @override + String get entryInfoActionEditTags => 'Edit tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Remove metadata'; + + @override + String get entryInfoActionExportMetadata => 'Export metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Remove location'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Crop'; + + @override + String get editorTransformRotate => 'Rotate'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landscape'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Recycle bin'; + + @override + String get filterFavouriteLabel => 'Favorite'; + + @override + String get filterNoDateLabel => 'Undated'; + + @override + String get filterNoAddressLabel => 'No address'; + + @override + String get filterLocatedLabel => 'Located'; + + @override + String get filterNoLocationLabel => 'Unlocated'; + + @override + String get filterNoRatingLabel => 'Unrated'; + + @override + String get filterTaggedLabel => 'Tagged'; + + @override + String get filterNoTagLabel => 'Untagged'; + + @override + String get filterNoTitleLabel => 'Untitled'; + + @override + String get filterOnThisDayLabel => 'On this day'; + + @override + String get filterRecentlyAddedLabel => 'Recently added'; + + @override + String get filterRatingRejectedLabel => 'Rejected'; + + @override + String get filterTypeAnimatedLabel => 'Animated'; + + @override + String get filterTypeMotionPhotoLabel => 'Motion Photo'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Image'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'New'; + + @override + String get albumTierPinned => 'Pinned'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Common'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Others'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimal degrees'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Highest rate'; + + @override + String get displayRefreshRatePreferLowest => 'Lowest rate'; + + @override + String get keepScreenOnNever => 'Never'; + + @override + String get keepScreenOnVideoPlayback => 'During video playback'; + + @override + String get keepScreenOnViewerOnly => 'Viewer page only'; + + @override + String get keepScreenOnAlways => 'Always'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Never'; + + @override + String get maxBrightnessAlways => 'Always'; + + @override + String get nameConflictStrategyRename => 'Rename'; + + @override + String get nameConflictStrategyReplace => 'Replace'; + + @override + String get nameConflictStrategySkip => 'Skip'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Top'; + + @override + String get subtitlePositionBottom => 'Bottom'; + + @override + String get themeBrightnessLight => 'Light'; + + @override + String get themeBrightnessDark => 'Dark'; + + @override + String get themeBrightnessBlack => 'Black'; + + @override + String get unitSystemMetric => 'Metric'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Password'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Open with other player'; + + @override + String get videoLoopModeNever => 'Never'; + + @override + String get videoLoopModeShortOnly => 'Short videos only'; + + @override + String get videoLoopModeAlways => 'Always'; + + @override + String get videoPlaybackSkip => 'Skip'; + + @override + String get videoPlaybackMuted => 'Play muted'; + + @override + String get videoPlaybackWithSound => 'Play with sound'; + + @override + String get videoResumptionModeNever => 'Never'; + + @override + String get videoResumptionModeAlways => 'Always'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'None'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'Random'; + + @override + String get widgetDisplayedItemMostRecent => 'Most recent'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internal storage'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Some files have the same name.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'ADD'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Save dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OVER'; + + @override + String get videoResumeButtonLabel => 'RESUME'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Custom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'New Album'; + + @override + String get newAlbumDialogNameLabel => 'Album name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'Storage:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'New name'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'Rename'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insert field'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Preview'; + + @override + String get renameProcessorCounter => 'Counter'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Name'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete this album and the $countString items in it?', + one: 'Delete this album and the item in it?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these albums and the $countString items in them?', + one: 'Delete these albums and the item in them?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Width'; + + @override + String get exportEntryDialogHeight => 'Height'; + + @override + String get exportEntryDialogQuality => 'Quality'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'New name'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'Date & Time'; + + @override + String get editEntryDateDialogSetCustom => 'Set custom date'; + + @override + String get editEntryDateDialogCopyField => 'Copy from other date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'File modified date'; + + @override + String get durationDialogHours => 'Hours'; + + @override + String get durationDialogMinutes => 'Minutes'; + + @override + String get durationDialogSeconds => 'Seconds'; + + @override + String get editEntryLocationDialogTitle => 'Location'; + + @override + String get editEntryLocationDialogSetCustom => 'Set custom location'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Choose on map'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Use this location'; + + @override + String get editEntryRatingDialogTitle => 'Rating'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'More'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'Playback speed'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtitles'; + + @override + String get videoStreamSelectionDialogOff => 'Off'; + + @override + String get videoStreamSelectionDialogTrack => 'Track'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'Done!'; + + @override + String get genericFailureFeedback => 'Failed'; + + @override + String get genericDangerWarningDialogMessage => 'Are you sure?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'View'; + + @override + String get menuActionSelect => 'Select'; + + @override + String get menuActionSelectAll => 'Select all'; + + @override + String get menuActionSelectNone => 'Select none'; + + @override + String get menuActionMap => 'Map'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'Stats'; + + @override + String get viewDialogSortSectionTitle => 'Sort'; + + @override + String get viewDialogGroupSectionTitle => 'Sections'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'Grid'; + + @override + String get tileLayoutList => 'List'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Color'; + + @override + String get appPickDialogTitle => 'Pick App'; + + @override + String get appPickDialogNone => 'None'; + + @override + String get aboutPageTitle => 'About'; + + @override + String get aboutLinkLicense => 'License'; + + @override + String get aboutLinkPolicy => 'Privacy Policy'; + + @override + String get aboutBugSectionTitle => 'Bug Report'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copy system information'; + + @override + String get aboutBugCopyInfoButton => 'Copy'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'Report'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Credits'; + + @override + String get aboutCreditsWorldAtlas1 => 'This app uses a TopoJSON file from'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'Translators'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenses'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Show All Licenses'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'Pick'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'Edit'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Unknown'; + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'About'; + + @override + String get drawerSettingsButton => 'Settings'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Countries'; + + @override + String get drawerPlacePage => 'Places'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'By date'; + + @override + String get sortByName => 'By name'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'By size'; + + @override + String get sortByAlbumFileName => 'By album & item title'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A to Z'; + + @override + String get sortOrderZtoA => 'Z to A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumMimeTypeMixed => 'Mixed'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'Camera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'CREATE'; + + @override + String get newFilterBanner => 'new'; + + @override + String get countryPageTitle => 'Countries'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'States'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Places'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Date'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Countries'; + + @override + String get searchStatesSectionTitle => 'States'; + + @override + String get searchPlacesSectionTitle => 'Places'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Ratings'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Settings'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'Disabled'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'Settings'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Home'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_sk.dart b/lib/l10ngen/app_localizations_sk.dart new file mode 100644 index 0000000..2c45b87 --- /dev/null +++ b/lib/l10ngen/app_localizations_sk.dart @@ -0,0 +1,2378 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Slovak (`sk`). +class AppLocalizationsSk extends AppLocalizations { + AppLocalizationsSk([String locale = 'sk']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Vitajte v Aves'; + + @override + String get welcomeOptional => 'Voliteľné'; + + @override + String get welcomeTermsToggle => 'Súhlasím s pravidlami a podmienkami'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count položiek', + one: '$count položka', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count stĺpcov', + one: '$count stĺpec', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString sekúnd', + one: '$countString sekunda', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minút', + few: '$countString minúty', + one: '$countString minúta', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString dni', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'POUŽIŤ'; + + @override + String get createButtonLabel => 'VYTVORIŤ'; + + @override + String get deleteButtonLabel => 'ODSTRÁNIŤ'; + + @override + String get nextButtonLabel => 'ĎALEJ'; + + @override + String get showButtonLabel => 'ZOBRAZIŤ'; + + @override + String get hideButtonLabel => 'SCHOVAŤ'; + + @override + String get continueButtonLabel => 'POKRAČOVAŤ'; + + @override + String get saveCopyButtonLabel => 'Uložiť kópiu'; + + @override + String get applyTooltip => 'Použiť'; + + @override + String get cancelTooltip => 'ZRUŠIŤ'; + + @override + String get changeTooltip => 'ZMENIŤ'; + + @override + String get clearTooltip => 'VYČISTIŤ'; + + @override + String get previousTooltip => 'PREDCHÁDZAJÚCE'; + + @override + String get nextTooltip => 'Ďalej'; + + @override + String get showTooltip => 'Zobraziť'; + + @override + String get hideTooltip => 'Schovať'; + + @override + String get actionRemove => 'Odstrániť'; + + @override + String get resetTooltip => 'Znovu'; + + @override + String get saveTooltip => 'Uložiť'; + + @override + String get stopTooltip => 'Zastaviť'; + + @override + String get pickTooltip => 'Vybrať'; + + @override + String get doubleBackExitMessage => 'Stlač znovu “späť” pre ukončenie.'; + + @override + String get doNotAskAgain => 'Nepýtať sa znovu'; + + @override + String get sourceStateLoading => 'Načítavanie'; + + @override + String get sourceStateCataloguing => 'Indexovanie'; + + @override + String get sourceStateLocatingCountries => 'Hľadanie krajín'; + + @override + String get sourceStateLocatingPlaces => 'Hľadanie miest'; + + @override + String get chipActionDelete => 'Odstrániť'; + + @override + String get chipActionRemove => 'Odstrániť'; + + @override + String get chipActionShowCollection => 'Zobraziť v kolekcií'; + + @override + String get chipActionGoToAlbumPage => 'Zobraziť v albumoch'; + + @override + String get chipActionGoToCountryPage => 'Zobraziť v krajinách'; + + @override + String get chipActionGoToPlacePage => 'Otvoriť v miestach'; + + @override + String get chipActionGoToTagPage => 'Zobraziť v označeniach'; + + @override + String get chipActionGoToExplorerPage => 'Zobraziť v Explorer'; + + @override + String get chipActionDecompose => 'Rozdeliť'; + + @override + String get chipActionFilterOut => 'Filtrovať'; + + @override + String get chipActionFilterIn => 'Prefiltrovať'; + + @override + String get chipActionHide => 'Skryť'; + + @override + String get chipActionLock => 'Zamknúť'; + + @override + String get chipActionPin => 'Pripnúť na začiatok'; + + @override + String get chipActionUnpin => 'Odstrániť z pripnutia'; + + @override + String get chipActionGroup => 'Zmeniť skupinu'; + + @override + String get chipActionRename => 'Premenovať'; + + @override + String get chipActionSetCover => 'Nastaviť pozadie'; + + @override + String get chipActionShowCountryStates => 'Zobraziť štáty'; + + @override + String get chipActionCreateGroup => 'Vytvorenie skupiny'; + + @override + String get chipActionCreateAlbum => 'Vytvoriť album'; + + @override + String get chipActionCreateVault => 'Vytvoriť trezor'; + + @override + String get chipActionConfigureVault => 'Nastaviť trezor'; + + @override + String get entryActionCopyToClipboard => 'Skopírovať'; + + @override + String get entryActionDelete => 'Odstrániť'; + + @override + String get entryActionConvert => 'Zmeniť'; + + @override + String get entryActionExport => 'Exportovať'; + + @override + String get entryActionInfo => 'Informácie'; + + @override + String get entryActionRename => 'Premenovať'; + + @override + String get entryActionRestore => 'Obnoviť'; + + @override + String get entryActionRotateCCW => 'Otočiť proti smeru hodinových ručičiek'; + + @override + String get entryActionRotateCW => 'Otočiť po smere hodinových ručičiek'; + + @override + String get entryActionFlip => 'Prevrátiť horizontálne'; + + @override + String get entryActionPrint => 'Vytlačiť'; + + @override + String get entryActionShare => 'Zdieľať'; + + @override + String get entryActionShareImageOnly => 'Zdieľať iba obrázok'; + + @override + String get entryActionShareVideoOnly => 'Zdieľať iba video'; + + @override + String get entryActionViewSource => 'Zobraziť zdroj'; + + @override + String get entryActionShowGeoTiffOnMap => 'Zobraziť na mape'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Konvertovať na statický obrázok'; + + @override + String get entryActionViewMotionPhotoVideo => 'Otvoriť video'; + + @override + String get entryActionEdit => 'Upraviť'; + + @override + String get entryActionOpen => 'Otvoriť v'; + + @override + String get entryActionSetAs => 'Nastaviť ako'; + + @override + String get entryActionCast => 'Krúžky'; + + @override + String get entryActionOpenMap => 'Ukázať na mape v aplikácií'; + + @override + String get entryActionRotateScreen => 'Otočiť obrazovku'; + + @override + String get entryActionAddFavourite => 'Pridať do obľúbených'; + + @override + String get entryActionRemoveFavourite => 'Odstrániť z obľúbených'; + + @override + String get videoActionCaptureFrame => 'Zachytiť obraz'; + + @override + String get videoActionMute => 'Stlmiť zvuk'; + + @override + String get videoActionUnmute => 'Zapnúť zvuk'; + + @override + String get videoActionPause => 'Pozastaviť'; + + @override + String get videoActionPlay => 'Spustiť'; + + @override + String get videoActionReplay10 => 'Pretočiť späť o 10 sekúnd'; + + @override + String get videoActionSkip10 => 'Pretočiť dopredu o 10 sekúnd'; + + @override + String get videoActionShowPreviousFrame => 'Zobraziť predchádzajúci rám'; + + @override + String get videoActionShowNextFrame => 'Zobraziť ďalší rám'; + + @override + String get videoActionSelectStreams => 'Výber stopy'; + + @override + String get videoActionSetSpeed => 'Rýchlosť prehrávania'; + + @override + String get videoActionABRepeat => 'Opakovanie A-B'; + + @override + String get videoRepeatActionSetStart => 'Nastaviť začiatok'; + + @override + String get videoRepeatActionSetEnd => 'Nastaviť koniec'; + + @override + String get viewerActionSettings => 'Nastavenia'; + + @override + String get viewerActionLock => 'Uzamknúť pohľad'; + + @override + String get viewerActionUnlock => 'Odomknúť pohľad'; + + @override + String get slideshowActionResume => 'Pokračovať'; + + @override + String get slideshowActionShowInCollection => 'Zobraziť v kolekcií'; + + @override + String get entryInfoActionEditDate => 'Upraviť dátum a čas'; + + @override + String get entryInfoActionEditLocation => 'Upraviť polohu'; + + @override + String get entryInfoActionEditTitleDescription => 'Upraviť nadpis & popis'; + + @override + String get entryInfoActionEditRating => 'Upraviť hodnotenie'; + + @override + String get entryInfoActionEditTags => 'Upraviť značky'; + + @override + String get entryInfoActionRemoveMetadata => 'Odstrániť metadáta'; + + @override + String get entryInfoActionExportMetadata => 'Exportovať metadáta'; + + @override + String get entryInfoActionRemoveLocation => 'Odstrániť polohu'; + + @override + String get editorActionTransform => 'Transformovať'; + + @override + String get editorTransformCrop => 'Orezať'; + + @override + String get editorTransformRotate => 'Otočiť'; + + @override + String get cropAspectRatioFree => 'Uvoľniť'; + + @override + String get cropAspectRatioOriginal => 'Originál'; + + @override + String get cropAspectRatioSquare => 'Štvorec'; + + @override + String get filterAspectRatioLandscapeLabel => 'Horizontálne'; + + @override + String get filterAspectRatioPortraitLabel => 'Vetrikálne'; + + @override + String get filterBinLabel => 'Kôš'; + + @override + String get filterFavouriteLabel => 'Obľúbené'; + + @override + String get filterNoDateLabel => 'Bez dátumu'; + + @override + String get filterNoAddressLabel => 'Bez adresy'; + + @override + String get filterLocatedLabel => 'Lokalizované'; + + @override + String get filterNoLocationLabel => 'Nelokalizované'; + + @override + String get filterNoRatingLabel => 'Nehodnotené'; + + @override + String get filterTaggedLabel => 'Označené'; + + @override + String get filterNoTagLabel => 'Neoznačené'; + + @override + String get filterNoTitleLabel => 'Bez nadpisu'; + + @override + String get filterOnThisDayLabel => 'Tento deň'; + + @override + String get filterRecentlyAddedLabel => 'Nedávno pridané'; + + @override + String get filterRatingRejectedLabel => 'Zamietnuté'; + + @override + String get filterTypeAnimatedLabel => 'Animované'; + + @override + String get filterTypeMotionPhotoLabel => 'Fotka v pohybe'; + + @override + String get filterTypePanoramaLabel => 'Panoráma'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Obrázok'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Predchádzanie efektom obrazovky'; + + @override + String get accessibilityAnimationsKeep => 'Zachovanie efektov na obrazovke'; + + @override + String get albumTierNew => 'Nový'; + + @override + String get albumTierPinned => 'Pripnuté'; + + @override + String get albumTierGroups => 'Skupiny'; + + @override + String get albumTierSpecial => 'Spoločné'; + + @override + String get albumTierApps => 'Aplikácie'; + + @override + String get albumTierVaults => 'Trezory'; + + @override + String get albumTierDynamic => 'Dynamické'; + + @override + String get albumTierRegular => 'Ostatné'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Desatinné stupne'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Najvyššie možné'; + + @override + String get displayRefreshRatePreferLowest => 'Najnižšie možné'; + + @override + String get keepScreenOnNever => 'Nikdy'; + + @override + String get keepScreenOnVideoPlayback => 'Počas prehrávania'; + + @override + String get keepScreenOnViewerOnly => 'Iba stránka prehliadača'; + + @override + String get keepScreenOnAlways => 'Vždy'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google mapy'; + + @override + String get mapStyleGoogleHybrid => 'Google mapy (Hybridné)'; + + @override + String get mapStyleGoogleTerrain => 'Google mapy (terén)'; + + @override + String get mapStyleOsmLiberty => 'OSM Slobody'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Nikdy'; + + @override + String get maxBrightnessAlways => 'Vždy'; + + @override + String get nameConflictStrategyRename => 'Premenovať'; + + @override + String get nameConflictStrategyReplace => 'Nahradiť'; + + @override + String get nameConflictStrategySkip => 'Preskočiť'; + + @override + String get overlayHistogramNone => 'Žiadne'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Svietivosť'; + + @override + String get subtitlePositionTop => 'Navrchu'; + + @override + String get subtitlePositionBottom => 'Naspodku'; + + @override + String get themeBrightnessLight => 'Svetlá'; + + @override + String get themeBrightnessDark => 'Tmavá'; + + @override + String get themeBrightnessBlack => 'Čierna'; + + @override + String get unitSystemMetric => 'Metrické'; + + @override + String get unitSystemImperial => 'Imperiálne'; + + @override + String get vaultLockTypePattern => 'Vzor'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Heslo'; + + @override + String get settingsVideoEnablePip => 'Obraz-v-obraze'; + + @override + String get videoControlsPlayOutside => 'Otvoriť v inom prehrávači'; + + @override + String get videoLoopModeNever => 'Nikdy'; + + @override + String get videoLoopModeShortOnly => 'Iba krátke videá'; + + @override + String get videoLoopModeAlways => 'Vždy'; + + @override + String get videoPlaybackSkip => 'Preskočiť'; + + @override + String get videoPlaybackMuted => 'Spustiť stlmené'; + + @override + String get videoPlaybackWithSound => 'Spustiť so zvukom'; + + @override + String get videoResumptionModeNever => 'Nikdy'; + + @override + String get videoResumptionModeAlways => 'Vždy'; + + @override + String get viewerTransitionSlide => 'Snímka'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Vyblednúť'; + + @override + String get viewerTransitionZoomIn => 'Priblížiť'; + + @override + String get viewerTransitionNone => 'Žiadne'; + + @override + String get wallpaperTargetHome => 'Domáca obrazovka'; + + @override + String get wallpaperTargetLock => 'Zamknutá obrazovka'; + + @override + String get wallpaperTargetHomeLock => 'Domáca a zamknutá obrazovka'; + + @override + String get widgetDisplayedItemRandom => 'Náhodné'; + + @override + String get widgetDisplayedItemMostRecent => 'Najnovšie'; + + @override + String get widgetOpenPageHome => 'Isť domov'; + + @override + String get widgetOpenPageCollection => 'Otvoriť kolekciu'; + + @override + String get widgetOpenPageViewer => 'Otvoriť prehliadač'; + + @override + String get widgetTapUpdateWidget => 'Aktualizovať widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Vnútorný ukladací priestor'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD karta'; + + @override + String get rootDirectoryDescription => 'Koreňový adresár'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” priečinok'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Prosím vyber $directory - “$volume” v ďalšom okne aby aplikácia mala prístup k dátam v priečinku.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Táto aplikácia nemôže modifikovať súbory v $directory - “$volume”.\n\nProsím použi predinštalovanú aplikáciu na presun súborov do iného priečinka.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Táto operácia potrebuje $neededSize voľnej pamäti “$volume” na dokončenie, dostupných je však iba $freeSize.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Systémový vyberač súborov chýba alebo je vypnutý. Povoľte ho a skúste to znova.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Táto operácia neni podporovaná pre $types súbory.', + one: 'Táto operácia neni podporovaná pre $types súbor.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Niektoré súbory v cieľovej destinácií majú rovnaké názvy.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Niektoré súbory majú rovnaký názov.'; + + @override + String get addShortcutDialogLabel => 'Názov skratky'; + + @override + String get addShortcutButtonLabel => 'PRIDAŤ'; + + @override + String get noMatchingAppDialogMessage => 'Nie je podporované žiadnou aplikáciou.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Presunúť týchto $count položiek do koša?', + one: 'Presunúť túto položku do koša?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Odstrániť týchto $count položiek?', + one: 'Odstrániť túto položku?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Uložiť dátumy pred pokračovaním?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Uložiť dátumy'; + + @override + String videoResumeDialogMessage(String time) { + return 'Pokračovať v prehrávaní od $time?'; + } + + @override + String get videoStartOverButtonLabel => 'ODZNOVA'; + + @override + String get videoResumeButtonLabel => 'POKRAČOVAŤ'; + + @override + String get setCoverDialogLatest => 'Posledná položka'; + + @override + String get setCoverDialogAuto => 'Automaticky'; + + @override + String get setCoverDialogCustom => 'Vlastné'; + + @override + String get hideFilterConfirmationDialogMessage => 'Vybrané fotky a videá sa nebudú zobrazovať vo vašich kolekciách. Môžete ich obnoviť v nastaveniach “Súkromie”.\n\nUrčite chcete schovať tieto súbory?'; + + @override + String get newAlbumDialogTitle => 'Nový album'; + + @override + String get newAlbumDialogNameLabel => 'Názov albumu'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album už existuje'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Priečinok už existuje'; + + @override + String get newAlbumDialogStorageLabel => 'Úložisko:'; + + @override + String get newDynamicAlbumDialogTitle => 'Nový dynamický album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamický album už existuje'; + + @override + String get newGroupDialogTitle => 'Nová skupina'; + + @override + String get newGroupDialogNameLabel => 'Názov skupiny'; + + @override + String get groupAlreadyExists => 'Skupina už existuje'; + + @override + String get groupEmpty => 'Žiadne skupiny'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Položky v trezoroch sú dostupné iba v tejto aplikácií\n\nAk aplikáciu odinštaluješ alebo vymažeš dáta aplikácie, stratíš všetky položky z trezorov.'; + + @override + String get newVaultDialogTitle => 'Nový trezor'; + + @override + String get configureVaultDialogTitle => 'Nastavenie trezoru'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Uzamknúť pri vypnutí obrazovky'; + + @override + String get vaultDialogLockTypeLabel => 'Typ uzamknutia'; + + @override + String get patternDialogEnter => 'Nastavenie vzoru'; + + @override + String get patternDialogConfirm => 'Potvrď vzor'; + + @override + String get pinDialogEnter => 'Vložiť PIN'; + + @override + String get pinDialogConfirm => 'Potvrď PIN'; + + @override + String get passwordDialogEnter => 'Zadaj heslo'; + + @override + String get passwordDialogConfirm => 'Potvrď heslo'; + + @override + String get authenticateToConfigureVault => 'Na konfiguráciu trezora je potrebné overenie'; + + @override + String get authenticateToUnlockVault => 'Pre odomknutie trezora je potrebné prihlásenie'; + + @override + String get vaultBinUsageDialogMessage => 'Niektoré trezory používajú kôš.'; + + @override + String get renameAlbumDialogLabel => 'Nový názov'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Priečinok už existuje'; + + @override + String get renameEntrySetPageTitle => 'Premenovať'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Formát'; + + @override + String get renameEntrySetPageInsertTooltip => 'Vložiť položku'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Náhľad'; + + @override + String get renameProcessorCounter => 'Počítadlo'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Názov'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Odstrániť tento album a $count položiek v ňom?', + one: 'Odstrániť tento album a položku v ňom?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Odstrániť tieto albumy a $count položiek v nich?', + one: 'Odstrániť tieto albumy a položku v nich?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Formát:'; + + @override + String get exportEntryDialogWidth => 'Šírka'; + + @override + String get exportEntryDialogHeight => 'Výška'; + + @override + String get exportEntryDialogQuality => 'Kvalita'; + + @override + String get exportEntryDialogWriteMetadata => 'Zapísať metadáta'; + + @override + String get renameEntryDialogLabel => 'Nový názov'; + + @override + String get editEntryDialogCopyFromItem => 'Kopírovať z inej položky'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Polia k úprave'; + + @override + String get editEntryDateDialogTitle => 'Dátum & Čas'; + + @override + String get editEntryDateDialogSetCustom => 'Nastaviť vlastný dátum'; + + @override + String get editEntryDateDialogCopyField => 'Kopírovať z iného dátumu'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extrahovať z nadpisu'; + + @override + String get editEntryDateDialogShift => 'Posun'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Dátum modifikácie súboru'; + + @override + String get durationDialogHours => 'Hodiny'; + + @override + String get durationDialogMinutes => 'Minúty'; + + @override + String get durationDialogSeconds => 'Sekundy'; + + @override + String get editEntryLocationDialogTitle => 'Poloha'; + + @override + String get editEntryLocationDialogSetCustom => 'Nastaviť vlastnú polohu'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Vybrať z mapy'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Zemepisná šírka'; + + @override + String get editEntryLocationDialogLongitude => 'Zemepisná dĺžka'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Použiť túto polohu'; + + @override + String get editEntryRatingDialogTitle => 'Hodnotenie'; + + @override + String get removeEntryMetadataDialogTitle => 'Odstránenie metadát'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'Viac'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP je potrebné pre prehranie videa vo vnútri pohyblivej fotky.\n\nUrčite to chceš odstrániť?'; + + @override + String get videoSpeedDialogLabel => 'Rýchlosť prehrávania'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Zvuk'; + + @override + String get videoStreamSelectionDialogText => 'Titulky'; + + @override + String get videoStreamSelectionDialogOff => 'Vypnúť'; + + @override + String get videoStreamSelectionDialogTrack => 'Stopa'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Žiadne iné položky.'; + + @override + String get genericSuccessFeedback => 'Hotovo!'; + + @override + String get genericFailureFeedback => 'Nastala chyba'; + + @override + String get genericDangerWarningDialogMessage => 'Si si istý?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Skús znova s menším počtom položiek.'; + + @override + String get menuActionConfigureView => 'Zobrazenie'; + + @override + String get menuActionSelect => 'Označiť'; + + @override + String get menuActionSelectAll => 'Označiť všetko'; + + @override + String get menuActionSelectNone => 'Nič neoznačiť'; + + @override + String get menuActionMap => 'Mapa'; + + @override + String get menuActionSlideshow => 'Prezentácia'; + + @override + String get menuActionStats => 'Štatistiky'; + + @override + String get viewDialogSortSectionTitle => 'Zoradiť'; + + @override + String get viewDialogGroupSectionTitle => 'Zoskupiť'; + + @override + String get viewDialogLayoutSectionTitle => 'Rozloženie'; + + @override + String get viewDialogReverseSortOrder => 'Zoradiť opačne'; + + @override + String get tileLayoutMosaic => 'Mozaika'; + + @override + String get tileLayoutGrid => 'Mriežka'; + + @override + String get tileLayoutList => 'Zoznam'; + + @override + String get castDialogTitle => 'Cast zariadenia'; + + @override + String get coverDialogTabCover => 'Obálka'; + + @override + String get coverDialogTabApp => 'Aplikácia'; + + @override + String get coverDialogTabColor => 'Farba'; + + @override + String get appPickDialogTitle => 'Výber aplikácie'; + + @override + String get appPickDialogNone => 'Nič'; + + @override + String get aboutPageTitle => 'O aplikácií'; + + @override + String get aboutLinkLicense => 'Licencia'; + + @override + String get aboutLinkPolicy => 'Zásady súkromia'; + + @override + String get aboutBugSectionTitle => 'Nahlásenie chyby'; + + @override + String get aboutBugSaveLogInstruction => 'Uložiť záznamy aplikácie do súboru'; + + @override + String get aboutBugCopyInfoInstruction => 'Kopírovať systémové informácie'; + + @override + String get aboutBugCopyInfoButton => 'Kopírovať'; + + @override + String get aboutBugReportInstruction => 'Nahlásiť na Github spolu so záznamami a systémovými informáciami'; + + @override + String get aboutBugReportButton => 'Nahlásiť'; + + @override + String get aboutDataUsageSectionTitle => 'Využitie dát'; + + @override + String get aboutDataUsageData => 'Dáta'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Databáza'; + + @override + String get aboutDataUsageMisc => 'Rôzne'; + + @override + String get aboutDataUsageInternal => 'Interné'; + + @override + String get aboutDataUsageExternal => 'Externé'; + + @override + String get aboutDataUsageClearCache => 'Vymazať cache'; + + @override + String get aboutCreditsSectionTitle => 'Kredit'; + + @override + String get aboutCreditsWorldAtlas1 => 'Táto aplikácia používa TopoJSON súbor od'; + + @override + String get aboutCreditsWorldAtlas2 => 'pod ISC licenciou.'; + + @override + String get aboutTranslatorsSectionTitle => 'Prekladatelia'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licencie'; + + @override + String get aboutLicensesBanner => 'Táto aplikácia používa nasledujúce open-source balíčky a knižnice.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android knižnice'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Pluginy'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Balíčky'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Balíčky'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Zobraziť všetky licencie'; + + @override + String get policyPageTitle => 'Zásady súkromia'; + + @override + String get collectionPageTitle => 'Kolekcie'; + + @override + String get collectionPickPageTitle => 'Vybrať'; + + @override + String get collectionSelectPageTitle => 'Označiť položky'; + + @override + String get collectionActionShowTitleSearch => 'Zobraziť filter'; + + @override + String get collectionActionHideTitleSearch => 'Skryť filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Pridať dynamický album'; + + @override + String get collectionActionAddShortcut => 'Pridať skratku'; + + @override + String get collectionActionSetHome => 'Nastaviť ako doma'; + + @override + String get collectionActionEmptyBin => 'Vyprázdniť kôš'; + + @override + String get collectionActionCopy => 'Kopírovať do albumu'; + + @override + String get collectionActionMove => 'Presunúť do albumu'; + + @override + String get collectionActionRescan => 'Opätovné skenovanie'; + + @override + String get collectionActionEdit => 'Upraviť'; + + @override + String get collectionSearchTitlesHintText => 'Vyhľadávanie v nadpisoch'; + + @override + String get collectionGroupAlbum => 'Podľa albumu'; + + @override + String get collectionGroupMonth => 'Podľa mesiaca'; + + @override + String get collectionGroupDay => 'Podľa dňa'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Neznáme'; + + @override + String get dateToday => 'Dnes'; + + @override + String get dateYesterday => 'Včera'; + + @override + String get dateThisMonth => 'Tento mesiac'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + few: 'Nepodarilo sa odstrániť $count položky', + other: 'Nepodarilo sa odstrániť $count položiek', + one: 'Nepodarilo sa odstrániť položku', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nepodarilo sa kopírovať $count položiek', + few: 'Nepodarilo sa kopírovať $count položky', + one: 'Nepodarilo sa kopírovať položku', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nepodarilo sa presunúť $count položiek', + few: 'Nepodarilo sa presunúť $count položky', + one: 'Nepodarilo sa presunúť položku', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nepodarilo sa premenovať $count položiek', + few: 'Nepodarilo sa premenovať $count položky', + one: 'Nepodarilo sa premenovať položku', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nepodarilo sa upraviť $count položiek', + few: 'Nepodarilo sa upraviť $count položky', + one: 'Nepodarilo sa upraviť položku', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Nepodarilo sa exportovať $count stránok', + one: 'Nepodarilo sa exportovať stránku', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Bolo skopírovaných $count položiek', + one: 'Položka bola skopírovaná', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Bolo presunutých $count položiek', + one: 'Položka bola presunutá', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Bolo premenovaných $count položiek', + one: 'Položka bola premenovaná', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Bolo upravených $count položiek', + one: 'Položka bola upravená', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Žiadne obľúbené'; + + @override + String get collectionEmptyVideos => 'Žiadne videá'; + + @override + String get collectionEmptyImages => 'Žiadne obrázky'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Poskytnúť prístup'; + + @override + String get collectionSelectSectionTooltip => 'Označiť sekciu'; + + @override + String get collectionDeselectSectionTooltip => 'Odznačiť sekciu'; + + @override + String get drawerAboutButton => 'O aplikácií'; + + @override + String get drawerSettingsButton => 'Nastavenia'; + + @override + String get drawerCollectionAll => 'Všetky kolekcie'; + + @override + String get drawerCollectionFavourites => 'Obľúbené'; + + @override + String get drawerCollectionImages => 'Obrázky'; + + @override + String get drawerCollectionVideos => 'Videá'; + + @override + String get drawerCollectionAnimated => 'Animované'; + + @override + String get drawerCollectionMotionPhotos => 'Fotky v pohybe'; + + @override + String get drawerCollectionPanoramas => 'Panorámy'; + + @override + String get drawerCollectionRaws => 'Raw fotky'; + + @override + String get drawerCollectionSphericalVideos => '360° Videá'; + + @override + String get drawerAlbumPage => 'Albumy'; + + @override + String get drawerCountryPage => 'Krajiny'; + + @override + String get drawerPlacePage => 'Miesta'; + + @override + String get drawerTagPage => 'Značky'; + + @override + String get sortByDate => 'Podľa dátumu'; + + @override + String get sortByName => 'Podľa názvu'; + + @override + String get sortByItemCount => 'Podľa počtu položiek'; + + @override + String get sortBySize => 'Podľa rozmerov'; + + @override + String get sortByAlbumFileName => 'Podľa albumu & názvu'; + + @override + String get sortByRating => 'Podľa hodnotenia'; + + @override + String get sortByDuration => 'Trvanie'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Najskôr najnovšie'; + + @override + String get sortOrderOldestFirst => 'Najskôr najstaršie'; + + @override + String get sortOrderAtoZ => 'od A po Z'; + + @override + String get sortOrderZtoA => 'od Z po A'; + + @override + String get sortOrderHighestFirst => 'Od najväčšieho'; + + @override + String get sortOrderLowestFirst => 'Od najmenšieho'; + + @override + String get sortOrderLargestFirst => 'Najväčšie prvé'; + + @override + String get sortOrderSmallestFirst => 'Najmenšie prvé'; + + @override + String get sortOrderShortestFirst => 'Najkratší prvý'; + + @override + String get sortOrderLongestFirst => 'Najdlhšie prvý'; + + @override + String get albumGroupTier => 'Podľa úrovne'; + + @override + String get albumGroupType => 'Podľa typu'; + + @override + String get albumGroupVolume => 'Podľa objemu pamäte'; + + @override + String get albumMimeTypeMixed => 'Zmiešané'; + + @override + String get albumPickPageTitleCopy => 'Kopírovať do Albumu'; + + @override + String get albumPickPageTitleExport => 'Exportovať do albumu'; + + @override + String get albumPickPageTitleMove => 'Presunúť do Albumu'; + + @override + String get albumPickPageTitlePick => 'Vyber album'; + + @override + String get albumCamera => 'Kamera'; + + @override + String get albumDownload => 'Stiahnuť'; + + @override + String get albumScreenshots => 'Snímky obrazovky'; + + @override + String get albumScreenRecordings => 'Nahrávania obrazovky'; + + @override + String get albumVideoCaptures => 'Video záznamy'; + + @override + String get albumPageTitle => 'Albumy'; + + @override + String get albumEmpty => 'Žiadne albumy'; + + @override + String get createAlbumButtonLabel => 'Vytvoriť'; + + @override + String get newFilterBanner => 'Nový'; + + @override + String get countryPageTitle => 'Krajiny'; + + @override + String get countryEmpty => 'Žiadne krajiny'; + + @override + String get statePageTitle => 'Štáty'; + + @override + String get stateEmpty => 'Žiadne štáty'; + + @override + String get placePageTitle => 'Miesta'; + + @override + String get placeEmpty => 'Žiadne miesta'; + + @override + String get tagPageTitle => 'Značky'; + + @override + String get tagEmpty => 'Žiadne značky'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Kôš'; + + @override + String get explorerPageTitle => 'Prieskumník'; + + @override + String get explorerActionSelectStorageVolume => 'Vyberte skladovanie'; + + @override + String get selectStorageVolumeDialogTitle => 'Vyberte uloženie'; + + @override + String get searchCollectionFieldHint => 'Vyhľadávanie kolekcie'; + + @override + String get searchRecentSectionTitle => 'Nedávne'; + + @override + String get searchDateSectionTitle => 'Dátum'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albumy'; + + @override + String get searchCountriesSectionTitle => 'Krajiny'; + + @override + String get searchStatesSectionTitle => 'Štáty'; + + @override + String get searchPlacesSectionTitle => 'Miesta'; + + @override + String get searchTagsSectionTitle => 'Značky'; + + @override + String get searchRatingSectionTitle => 'Hodnotenia'; + + @override + String get searchMetadataSectionTitle => 'Metadáta'; + + @override + String get settingsPageTitle => 'Nastavenia'; + + @override + String get settingsSystemDefault => 'Predvolené'; + + @override + String get settingsDefault => 'Predvolené'; + + @override + String get settingsDisabled => 'Zakázané'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Vždy sa spýtať'; + + @override + String get settingsModificationWarningDialogMessage => 'Ostatné nastavenia budú modifikované.'; + + @override + String get settingsSearchFieldLabel => 'Nastavenia vyhľadávania'; + + @override + String get settingsSearchEmpty => 'Žiadne vyhovujúce nastavenia'; + + @override + String get settingsActionExport => 'Exportovať'; + + @override + String get settingsActionExportDialogTitle => 'Exportovať'; + + @override + String get settingsActionImport => 'Importovať'; + + @override + String get settingsActionImportDialogTitle => 'Importovať'; + + @override + String get appExportCovers => 'Obaly'; + + @override + String get appExportDynamicAlbums => 'Dynamické albumy'; + + @override + String get appExportFavourites => 'Obľúbené'; + + @override + String get appExportSettings => 'Nastavenia'; + + @override + String get settingsNavigationSectionTitle => 'Navigácia'; + + @override + String get settingsHomeTile => 'Domov'; + + @override + String get settingsHomeDialogTitle => 'Domov'; + + @override + String get setHomeCustom => 'Vlastné'; + + @override + String get settingsKeepScreenOnTile => 'Nevypínať obrazovku'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Nevypínať obrazovku'; + + @override + String get settingsDoubleBackExit => 'Stlač krok späť 2 krát pre opustenie aplikácie'; + + @override + String get settingsConfirmationTile => 'Potvrdzujúce dialógy'; + + @override + String get settingsConfirmationDialogTitle => 'Potvrdzujúce dialógy'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Spýtať sa pred odstránením'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Spýtať sa pred presunom do koša'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Spýtať sa pred presunom položiek bez dátumu'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Zobraziť správu po presune položiek do koša'; + + @override + String get settingsConfirmationVaultDataLoss => 'Zobrazenie upozornenia na stratu údajov trezora'; + + @override + String get settingsNavigationDrawerTile => 'Navigačné menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigačné menu'; + + @override + String get settingsNavigationDrawerBanner => 'Dotknite sa a podržte, ak chcete presúvať a meniť poradie položiek ponuky.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Typy'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albumy'; + + @override + String get settingsNavigationDrawerTabPages => 'Stránky'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Pridať album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniatúry'; + + @override + String get settingsThumbnailOverlayTile => 'Prekrytie'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Prekrytie'; + + @override + String get settingsThumbnailShowHdrIcon => 'Zobraziť ikonu HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Zobraziť obľúbenú ikonu'; + + @override + String get settingsThumbnailShowTagIcon => 'Zobraziť ikonu značky'; + + @override + String get settingsThumbnailShowLocationIcon => 'Zobraziť ikonu pozície'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Zobraziť ikonu pohybujúcich sa fotiek'; + + @override + String get settingsThumbnailShowRating => 'Zobraziť hodnotenie'; + + @override + String get settingsThumbnailShowRawIcon => 'Zobraziť raw ikonu'; + + @override + String get settingsThumbnailShowVideoDuration => 'Zobraziť dĺžku videa'; + + @override + String get settingsCollectionQuickActionsTile => 'Rýchle akcie'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Rýchle akcie'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Prehliadanie'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Výber'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Dotykom a podržaním môžete presúvať tlačidlá a vyberať akcie, ktoré sa zobrazia pri prehľadávaní položiek.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Dotykom a podržaním môžete presúvať tlačidlá a vybrať, ktoré akcie sa zobrazia pri výbere položiek.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Vzory dávkového snímania'; + + @override + String get settingsCollectionBurstPatternsNone => 'Žiadny'; + + @override + String get settingsViewerSectionTitle => 'Prehliadač'; + + @override + String get settingsViewerGestureSideTapNext => 'Ťuknutím na okraje obrazovky zobrazíte predchádzajúcu/nasledujúcu položku'; + + @override + String get settingsViewerUseCutout => 'Použitie oblasti výrezu'; + + @override + String get settingsViewerMaximumBrightness => 'Maximálny jas'; + + @override + String get settingsMotionPhotoAutoPlay => 'Automaticky prehrať pohyblivé fotografie'; + + @override + String get settingsImageBackground => 'Obrazové pozadie'; + + @override + String get settingsViewerQuickActionsTile => 'Rýchle akcie'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Rýchle akcie'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Dotknite sa tlačidiel a podržte ich, aby ste ich presunuli a vybrali akcie, ktoré sa zobrazia v prehliadači.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Zobrazené tlačidlá'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Dostupné tlačidlá'; + + @override + String get settingsViewerQuickActionEmpty => 'Žiadne tlačidlá'; + + @override + String get settingsViewerOverlayTile => 'Prekrytie'; + + @override + String get settingsViewerOverlayPageTitle => 'Prekrytie'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Zobraziť pri otvorení'; + + @override + String get settingsViewerShowHistogram => 'Zobraziť histogram'; + + @override + String get settingsViewerShowMinimap => 'Zobraziť minimapu'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Zobraziť informácie'; + + @override + String get settingsViewerShowInformationSubtitle => 'Zobraziť nadpis, dátum, miesto, atď.'; + + @override + String get settingsViewerShowRatingTags => 'Zobraziť hodnotenie a štítky'; + + @override + String get settingsViewerShowShootingDetails => 'Zobraziť podrobnosti o snímaní'; + + @override + String get settingsViewerShowDescription => 'Zobraziť popis'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Zobraziť miniatúry'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Efekt rozmazania'; + + @override + String get settingsViewerSlideshowTile => 'Prezentácia'; + + @override + String get settingsViewerSlideshowPageTitle => 'Prezentácia'; + + @override + String get settingsSlideshowRepeat => 'Opakovať'; + + @override + String get settingsSlideshowShuffle => 'Náhodný výber'; + + @override + String get settingsSlideshowFillScreen => 'Vyplnenie obrazovky'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animovaný efekt priblíženia'; + + @override + String get settingsSlideshowTransitionTile => 'Prechod'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Prehrávanie videa'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Prehrávanie videa'; + + @override + String get settingsVideoPageTitle => 'Nastavenia videa'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Zobraziť videá'; + + @override + String get settingsVideoPlaybackTile => 'Prehrávanie'; + + @override + String get settingsVideoPlaybackPageTitle => 'Prehrávanie'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardvérová akcelerácia'; + + @override + String get settingsVideoAutoPlay => 'Automatické prehrávanie'; + + @override + String get settingsVideoLoopModeTile => 'Režim slučky'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Režim slučky'; + + @override + String get settingsVideoResumptionModeTile => 'Pokračovanie prehrávania'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Pokračovanie prehrávania'; + + @override + String get settingsVideoBackgroundMode => 'Režim na pozadí'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Režim na pozadí'; + + @override + String get settingsVideoControlsTile => 'Ovládacie prvky'; + + @override + String get settingsVideoControlsPageTitle => 'Ovládacie prvky'; + + @override + String get settingsVideoButtonsTile => 'Tlačidlá'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Dvojitým ťuknutím spustíte prehrávanie/pozastavenie'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Dvojitým ťuknutím na okraje obrazovky môžete hľadať dozadu/dopredu'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Potiahnutím nahor alebo nadol upravíte jas/hlasitosť'; + + @override + String get settingsSubtitleThemeTile => 'Titulky'; + + @override + String get settingsSubtitleThemePageTitle => 'Titulky'; + + @override + String get settingsSubtitleThemeSample => 'Toto je ukážka.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Zarovnanie textu'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Zarovnanie textu'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Pozícia textu'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Pozícia textu'; + + @override + String get settingsSubtitleThemeTextSize => 'Veľkosť textu'; + + @override + String get settingsSubtitleThemeShowOutline => 'Zobrazenie obrysu a tieňa'; + + @override + String get settingsSubtitleThemeTextColor => 'Farba textu'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Ne/priehľadnosť textu'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Farba pozadia'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Ne/priehľadnosť pozadia'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Vľavo'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'V strede'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Vpravo'; + + @override + String get settingsPrivacySectionTitle => 'Súkromie'; + + @override + String get settingsAllowInstalledAppAccess => 'Povolenie prístupu k inventáru aplikácií'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Slúži na zlepšenie zobrazenia albumu'; + + @override + String get settingsAllowErrorReporting => 'Povolenie anonymného hlásenia chýb'; + + @override + String get settingsSaveSearchHistory => 'Uložiť históriu vyhľadávania'; + + @override + String get settingsEnableBin => 'Používanie odpadkového koša'; + + @override + String get settingsEnableBinSubtitle => 'Uchovávanie vymazaných položiek po dobu 30 dní'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Položky v koši budú navždy vymazané.'; + + @override + String get settingsAllowMediaManagement => 'Umožniť správu médií'; + + @override + String get settingsHiddenItemsTile => 'Skryté položky'; + + @override + String get settingsHiddenItemsPageTitle => 'Skryté položky'; + + @override + String get settingsHiddenFiltersBanner => 'Fotografie a videá zodpovedajúce skrytým filtrom sa nezobrazia vo vašej zbierke.'; + + @override + String get settingsHiddenFiltersEmpty => 'Žiadne skryté filtre'; + + @override + String get settingsStorageAccessTile => 'Prístup k úložisku'; + + @override + String get settingsStorageAccessPageTitle => 'Prístup k úložisku'; + + @override + String get settingsStorageAccessBanner => 'Niektoré adresáre vyžadujú explicitné udelenie prístupu na úpravu súborov v nich. Tu si môžete prezrieť adresáre, ku ktorým ste predtým udelili prístup.'; + + @override + String get settingsStorageAccessEmpty => 'Žiadne povolené prístupy'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Odvolať'; + + @override + String get settingsAccessibilitySectionTitle => 'Prístupnosť'; + + @override + String get settingsRemoveAnimationsTile => 'Odstránenie animácií'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Odstránenie animácií'; + + @override + String get settingsTimeToTakeActionTile => 'Čas na vykonanie akcie'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Zobrazenie alternatív viacdotykových gest'; + + @override + String get settingsDisplaySectionTitle => 'Displej'; + + @override + String get settingsThemeBrightnessTile => 'Téma'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Téma'; + + @override + String get settingsThemeColorHighlights => 'Farebné zvýraznenia'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamická farba'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Obnovovacia frekvencia displeja'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Obnovovacia frekvencia'; + + @override + String get settingsDisplayUseTvInterface => 'Rozhranie systému Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Jazyk a formáty'; + + @override + String get settingsLanguageTile => 'Jazyk'; + + @override + String get settingsLanguagePageTitle => 'Jazyk'; + + @override + String get settingsCoordinateFormatTile => 'Formát súradníc'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Formát súradníc'; + + @override + String get settingsUnitSystemTile => 'Jednotky'; + + @override + String get settingsUnitSystemDialogTitle => 'Jednotky'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Vynútiť arabské číslice'; + + @override + String get settingsScreenSaverPageTitle => 'Šetrič obrazovky'; + + @override + String get settingsWidgetPageTitle => 'Fotorámik'; + + @override + String get settingsWidgetShowOutline => 'Obrys'; + + @override + String get settingsWidgetOpenPage => 'Keď ťuknete na miniaplikáciu'; + + @override + String get settingsWidgetDisplayedItem => 'Zobrazená položka'; + + @override + String get settingsCollectionTile => 'Kolekcia'; + + @override + String get statsPageTitle => 'Štatistiky'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count položiek s polohami', + one: '1 položka s polohou', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Najlepšie krajiny'; + + @override + String get statsTopStatesSectionTitle => 'Najlepšie Štáty'; + + @override + String get statsTopPlacesSectionTitle => 'Najlepšie miesta'; + + @override + String get statsTopTagsSectionTitle => 'Najlepšie značky'; + + @override + String get statsTopAlbumsSectionTitle => 'Najlepšie albumy'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OTVORIŤ PANORÁMU'; + + @override + String get viewerSetWallpaperButtonLabel => 'NASTAVIŤ POZADIE'; + + @override + String get viewerErrorUnknown => 'Ups!'; + + @override + String get viewerErrorDoesNotExist => 'Súbor už neexistuje.'; + + @override + String get viewerInfoPageTitle => 'Informácie'; + + @override + String get viewerInfoBackToViewerTooltip => 'Späť na prehliadač'; + + @override + String get viewerInfoUnknown => 'neznáme'; + + @override + String get viewerInfoLabelDescription => 'Popis'; + + @override + String get viewerInfoLabelTitle => 'Nadpis'; + + @override + String get viewerInfoLabelDate => 'Dátum'; + + @override + String get viewerInfoLabelResolution => 'Rozlíšenie'; + + @override + String get viewerInfoLabelSize => 'Veľkosť'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Cesta'; + + @override + String get viewerInfoLabelDuration => 'Trvanie'; + + @override + String get viewerInfoLabelOwner => 'Vlastník'; + + @override + String get viewerInfoLabelCoordinates => 'Súradnice'; + + @override + String get viewerInfoLabelAddress => 'Adresa'; + + @override + String get mapStyleDialogTitle => 'Štýl mapy'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Vybrať štýl mapy'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Priblížiť'; + + @override + String get mapZoomOutTooltip => 'Oddialiť'; + + @override + String get mapPointNorthUpTooltip => 'Nastaviť sever nahor'; + + @override + String get mapAttributionOsmData => 'Údaje máp © [OpenStreetMap](https://www.openstreetmap.org/copyright) prispievatelia'; + + @override + String get mapAttributionOsmLiberty => 'Dlaždice podľa [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hostovaný [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) Dlaždice podľa [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => '[HOT](https://www.hotosm.org/) • Hosťuje [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => '[Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Zobraziť na stránke mapy'; + + @override + String get mapEmptyRegion => 'Žiadne obrázky v tejto oblasti'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Nepodarilo sa extrahovať vložené údaje'; + + @override + String get viewerInfoOpenLinkText => 'Otvoriť'; + + @override + String get viewerInfoViewXmlLinkText => 'Zobraziť XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Prehľadávať metadáta'; + + @override + String get viewerInfoSearchEmpty => 'Žiadne zodpovedajúce kľúče'; + + @override + String get viewerInfoSearchSuggestionDate => 'Dátum a čas'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Popis'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Rozmery'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Rozlíšenie'; + + @override + String get viewerInfoSearchSuggestionRights => 'Práva'; + + @override + String get wallpaperUseScrollEffect => 'Používanie efektu posúvania na domovskej obrazovke'; + + @override + String get tagEditorPageTitle => 'Upraviť štítky'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Nový štítok'; + + @override + String get tagEditorPageAddTagTooltip => 'Pridať štítok'; + + @override + String get tagEditorSectionRecent => 'Nedávne'; + + @override + String get tagEditorSectionPlaceholders => 'Zástupcovia'; + + @override + String get tagEditorDiscardDialogMessage => 'Naozaj chceš zrušiť zmeny?'; + + @override + String get tagPlaceholderCountry => 'Krajina'; + + @override + String get tagPlaceholderState => 'Štát'; + + @override + String get tagPlaceholderPlace => 'Miesto'; + + @override + String get panoramaEnableSensorControl => 'Povoliť senzory'; + + @override + String get panoramaDisableSensorControl => 'Zakázať senzory'; + + @override + String get sourceViewerPageTitle => 'Zdroj'; +} diff --git a/lib/l10ngen/app_localizations_sl.dart b/lib/l10ngen/app_localizations_sl.dart new file mode 100644 index 0000000..7950897 --- /dev/null +++ b/lib/l10ngen/app_localizations_sl.dart @@ -0,0 +1,2424 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Slovenian (`sl`). +class AppLocalizationsSl extends AppLocalizations { + AppLocalizationsSl([String locale = 'sl']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Dobrodošli v Avesu'; + + @override + String get welcomeOptional => 'Izbirno'; + + @override + String get welcomeTermsToggle => 'Sprejmem pogoje uporabe'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items', + one: '$countString item', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString columns', + one: '$countString column', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString seconds', + one: '$countString second', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutes', + one: '$countString minute', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString days', + one: '$countString day', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APPLY'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'DELETE'; + + @override + String get nextButtonLabel => 'NEXT'; + + @override + String get showButtonLabel => 'SHOW'; + + @override + String get hideButtonLabel => 'HIDE'; + + @override + String get continueButtonLabel => 'CONTINUE'; + + @override + String get saveCopyButtonLabel => 'SAVE COPY'; + + @override + String get applyTooltip => 'Apply'; + + @override + String get cancelTooltip => 'Cancel'; + + @override + String get changeTooltip => 'Change'; + + @override + String get clearTooltip => 'Clear'; + + @override + String get previousTooltip => 'Previous'; + + @override + String get nextTooltip => 'Next'; + + @override + String get showTooltip => 'Show'; + + @override + String get hideTooltip => 'Hide'; + + @override + String get actionRemove => 'Remove'; + + @override + String get resetTooltip => 'Reset'; + + @override + String get saveTooltip => 'Save'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'Pick'; + + @override + String get doubleBackExitMessage => 'Tap “back” again to exit.'; + + @override + String get doNotAskAgain => 'Do not ask again'; + + @override + String get sourceStateLoading => 'Loading'; + + @override + String get sourceStateCataloguing => 'Cataloguing'; + + @override + String get sourceStateLocatingCountries => 'Locating countries'; + + @override + String get sourceStateLocatingPlaces => 'Locating places'; + + @override + String get chipActionDelete => 'Delete'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Show in Collection'; + + @override + String get chipActionGoToAlbumPage => 'Show in Albums'; + + @override + String get chipActionGoToCountryPage => 'Show in Countries'; + + @override + String get chipActionGoToPlacePage => 'Show in Places'; + + @override + String get chipActionGoToTagPage => 'Show in Tags'; + + @override + String get chipActionGoToExplorerPage => 'Show in Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Filter out'; + + @override + String get chipActionFilterIn => 'Filter in'; + + @override + String get chipActionHide => 'Hide'; + + @override + String get chipActionLock => 'Lock'; + + @override + String get chipActionPin => 'Pin to top'; + + @override + String get chipActionUnpin => 'Unpin from top'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Rename'; + + @override + String get chipActionSetCover => 'Set cover'; + + @override + String get chipActionShowCountryStates => 'Show states'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Create album'; + + @override + String get chipActionCreateVault => 'Create vault'; + + @override + String get chipActionConfigureVault => 'Configure vault'; + + @override + String get entryActionCopyToClipboard => 'Copy to clipboard'; + + @override + String get entryActionDelete => 'Delete'; + + @override + String get entryActionConvert => 'Convert'; + + @override + String get entryActionExport => 'Export'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Rename'; + + @override + String get entryActionRestore => 'Restore'; + + @override + String get entryActionRotateCCW => 'Rotate counterclockwise'; + + @override + String get entryActionRotateCW => 'Rotate clockwise'; + + @override + String get entryActionFlip => 'Flip horizontally'; + + @override + String get entryActionPrint => 'Print'; + + @override + String get entryActionShare => 'Share'; + + @override + String get entryActionShareImageOnly => 'Share image only'; + + @override + String get entryActionShareVideoOnly => 'Share video only'; + + @override + String get entryActionViewSource => 'View source'; + + @override + String get entryActionShowGeoTiffOnMap => 'Show as map overlay'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convert to still image'; + + @override + String get entryActionViewMotionPhotoVideo => 'Open video'; + + @override + String get entryActionEdit => 'Edit'; + + @override + String get entryActionOpen => 'Open with'; + + @override + String get entryActionSetAs => 'Set as'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Show in map app'; + + @override + String get entryActionRotateScreen => 'Rotate screen'; + + @override + String get entryActionAddFavourite => 'Add to favorites'; + + @override + String get entryActionRemoveFavourite => 'Remove from favorites'; + + @override + String get videoActionCaptureFrame => 'Capture frame'; + + @override + String get videoActionMute => 'Mute'; + + @override + String get videoActionUnmute => 'Unmute'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Play'; + + @override + String get videoActionReplay10 => 'Seek backward 10 seconds'; + + @override + String get videoActionSkip10 => 'Seek forward 10 seconds'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Select tracks'; + + @override + String get videoActionSetSpeed => 'Playback speed'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Settings'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Resume'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'Edit date & time'; + + @override + String get entryInfoActionEditLocation => 'Edit location'; + + @override + String get entryInfoActionEditTitleDescription => 'Edit title & description'; + + @override + String get entryInfoActionEditRating => 'Edit rating'; + + @override + String get entryInfoActionEditTags => 'Edit tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Remove metadata'; + + @override + String get entryInfoActionExportMetadata => 'Export metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Remove location'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Crop'; + + @override + String get editorTransformRotate => 'Rotate'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landscape'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Recycle bin'; + + @override + String get filterFavouriteLabel => 'Favorite'; + + @override + String get filterNoDateLabel => 'Undated'; + + @override + String get filterNoAddressLabel => 'No address'; + + @override + String get filterLocatedLabel => 'Located'; + + @override + String get filterNoLocationLabel => 'Unlocated'; + + @override + String get filterNoRatingLabel => 'Unrated'; + + @override + String get filterTaggedLabel => 'Tagged'; + + @override + String get filterNoTagLabel => 'Untagged'; + + @override + String get filterNoTitleLabel => 'Untitled'; + + @override + String get filterOnThisDayLabel => 'On this day'; + + @override + String get filterRecentlyAddedLabel => 'Recently added'; + + @override + String get filterRatingRejectedLabel => 'Rejected'; + + @override + String get filterTypeAnimatedLabel => 'Animated'; + + @override + String get filterTypeMotionPhotoLabel => 'Motion Photo'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Image'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'New'; + + @override + String get albumTierPinned => 'Pinned'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Common'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Others'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimal degrees'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Highest rate'; + + @override + String get displayRefreshRatePreferLowest => 'Lowest rate'; + + @override + String get keepScreenOnNever => 'Never'; + + @override + String get keepScreenOnVideoPlayback => 'During video playback'; + + @override + String get keepScreenOnViewerOnly => 'Viewer page only'; + + @override + String get keepScreenOnAlways => 'Always'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Never'; + + @override + String get maxBrightnessAlways => 'Always'; + + @override + String get nameConflictStrategyRename => 'Rename'; + + @override + String get nameConflictStrategyReplace => 'Replace'; + + @override + String get nameConflictStrategySkip => 'Skip'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Top'; + + @override + String get subtitlePositionBottom => 'Bottom'; + + @override + String get themeBrightnessLight => 'Light'; + + @override + String get themeBrightnessDark => 'Dark'; + + @override + String get themeBrightnessBlack => 'Black'; + + @override + String get unitSystemMetric => 'Metric'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Password'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Open with other player'; + + @override + String get videoLoopModeNever => 'Never'; + + @override + String get videoLoopModeShortOnly => 'Short videos only'; + + @override + String get videoLoopModeAlways => 'Always'; + + @override + String get videoPlaybackSkip => 'Skip'; + + @override + String get videoPlaybackMuted => 'Play muted'; + + @override + String get videoPlaybackWithSound => 'Play with sound'; + + @override + String get videoResumptionModeNever => 'Never'; + + @override + String get videoResumptionModeAlways => 'Always'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'None'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'Random'; + + @override + String get widgetDisplayedItemMostRecent => 'Most recent'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internal storage'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Some files have the same name.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'ADD'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Save dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OVER'; + + @override + String get videoResumeButtonLabel => 'RESUME'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Custom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'New Album'; + + @override + String get newAlbumDialogNameLabel => 'Album name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'Storage:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'New name'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'Rename'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insert field'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Preview'; + + @override + String get renameProcessorCounter => 'Counter'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Name'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete this album and the $countString items in it?', + one: 'Delete this album and the item in it?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these albums and the $countString items in them?', + one: 'Delete these albums and the item in them?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Width'; + + @override + String get exportEntryDialogHeight => 'Height'; + + @override + String get exportEntryDialogQuality => 'Quality'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'New name'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'Date & Time'; + + @override + String get editEntryDateDialogSetCustom => 'Set custom date'; + + @override + String get editEntryDateDialogCopyField => 'Copy from other date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'File modified date'; + + @override + String get durationDialogHours => 'Hours'; + + @override + String get durationDialogMinutes => 'Minutes'; + + @override + String get durationDialogSeconds => 'Seconds'; + + @override + String get editEntryLocationDialogTitle => 'Location'; + + @override + String get editEntryLocationDialogSetCustom => 'Set custom location'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Choose on map'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Use this location'; + + @override + String get editEntryRatingDialogTitle => 'Rating'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'More'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'Playback speed'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtitles'; + + @override + String get videoStreamSelectionDialogOff => 'Off'; + + @override + String get videoStreamSelectionDialogTrack => 'Track'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'Done!'; + + @override + String get genericFailureFeedback => 'Failed'; + + @override + String get genericDangerWarningDialogMessage => 'Are you sure?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'View'; + + @override + String get menuActionSelect => 'Select'; + + @override + String get menuActionSelectAll => 'Select all'; + + @override + String get menuActionSelectNone => 'Select none'; + + @override + String get menuActionMap => 'Map'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'Stats'; + + @override + String get viewDialogSortSectionTitle => 'Sort'; + + @override + String get viewDialogGroupSectionTitle => 'Sections'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'Grid'; + + @override + String get tileLayoutList => 'List'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Color'; + + @override + String get appPickDialogTitle => 'Pick App'; + + @override + String get appPickDialogNone => 'None'; + + @override + String get aboutPageTitle => 'About'; + + @override + String get aboutLinkLicense => 'License'; + + @override + String get aboutLinkPolicy => 'Privacy Policy'; + + @override + String get aboutBugSectionTitle => 'Bug Report'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copy system information'; + + @override + String get aboutBugCopyInfoButton => 'Copy'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'Report'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Credits'; + + @override + String get aboutCreditsWorldAtlas1 => 'This app uses a TopoJSON file from'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'Translators'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenses'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Show All Licenses'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'Pick'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'Edit'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Unknown'; + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'About'; + + @override + String get drawerSettingsButton => 'Settings'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Countries'; + + @override + String get drawerPlacePage => 'Places'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'By date'; + + @override + String get sortByName => 'By name'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'By size'; + + @override + String get sortByAlbumFileName => 'By album & item title'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A to Z'; + + @override + String get sortOrderZtoA => 'Z to A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumMimeTypeMixed => 'Mixed'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'Camera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'CREATE'; + + @override + String get newFilterBanner => 'new'; + + @override + String get countryPageTitle => 'Countries'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'States'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Places'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Date'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Countries'; + + @override + String get searchStatesSectionTitle => 'States'; + + @override + String get searchPlacesSectionTitle => 'Places'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Ratings'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Settings'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'Disabled'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'Settings'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Home'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_sr.dart b/lib/l10ngen/app_localizations_sr.dart new file mode 100644 index 0000000..dc838f3 --- /dev/null +++ b/lib/l10ngen/app_localizations_sr.dart @@ -0,0 +1,2424 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Serbian (`sr`). +class AppLocalizationsSr extends AppLocalizations { + AppLocalizationsSr([String locale = 'sr']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Добродошли у Aves'; + + @override + String get welcomeOptional => 'Izborno'; + + @override + String get welcomeTermsToggle => 'I agree to the terms and conditions'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items', + one: '$countString item', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString columns', + one: '$countString column', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString seconds', + one: '$countString second', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutes', + one: '$countString minute', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString days', + one: '$countString day', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APPLY'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'DELETE'; + + @override + String get nextButtonLabel => 'NEXT'; + + @override + String get showButtonLabel => 'SHOW'; + + @override + String get hideButtonLabel => 'HIDE'; + + @override + String get continueButtonLabel => 'CONTINUE'; + + @override + String get saveCopyButtonLabel => 'SAVE COPY'; + + @override + String get applyTooltip => 'Apply'; + + @override + String get cancelTooltip => 'Cancel'; + + @override + String get changeTooltip => 'Change'; + + @override + String get clearTooltip => 'Clear'; + + @override + String get previousTooltip => 'Previous'; + + @override + String get nextTooltip => 'Next'; + + @override + String get showTooltip => 'Show'; + + @override + String get hideTooltip => 'Hide'; + + @override + String get actionRemove => 'Remove'; + + @override + String get resetTooltip => 'Reset'; + + @override + String get saveTooltip => 'Save'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'Pick'; + + @override + String get doubleBackExitMessage => 'Tap “back” again to exit.'; + + @override + String get doNotAskAgain => 'Do not ask again'; + + @override + String get sourceStateLoading => 'Loading'; + + @override + String get sourceStateCataloguing => 'Cataloguing'; + + @override + String get sourceStateLocatingCountries => 'Locating countries'; + + @override + String get sourceStateLocatingPlaces => 'Locating places'; + + @override + String get chipActionDelete => 'Delete'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Show in Collection'; + + @override + String get chipActionGoToAlbumPage => 'Show in Albums'; + + @override + String get chipActionGoToCountryPage => 'Show in Countries'; + + @override + String get chipActionGoToPlacePage => 'Show in Places'; + + @override + String get chipActionGoToTagPage => 'Show in Tags'; + + @override + String get chipActionGoToExplorerPage => 'Show in Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Filter out'; + + @override + String get chipActionFilterIn => 'Filter in'; + + @override + String get chipActionHide => 'Hide'; + + @override + String get chipActionLock => 'Lock'; + + @override + String get chipActionPin => 'Pin to top'; + + @override + String get chipActionUnpin => 'Unpin from top'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Rename'; + + @override + String get chipActionSetCover => 'Set cover'; + + @override + String get chipActionShowCountryStates => 'Show states'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Create album'; + + @override + String get chipActionCreateVault => 'Create vault'; + + @override + String get chipActionConfigureVault => 'Configure vault'; + + @override + String get entryActionCopyToClipboard => 'Copy to clipboard'; + + @override + String get entryActionDelete => 'Delete'; + + @override + String get entryActionConvert => 'Convert'; + + @override + String get entryActionExport => 'Export'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Rename'; + + @override + String get entryActionRestore => 'Restore'; + + @override + String get entryActionRotateCCW => 'Rotate counterclockwise'; + + @override + String get entryActionRotateCW => 'Rotate clockwise'; + + @override + String get entryActionFlip => 'Flip horizontally'; + + @override + String get entryActionPrint => 'Print'; + + @override + String get entryActionShare => 'Share'; + + @override + String get entryActionShareImageOnly => 'Share image only'; + + @override + String get entryActionShareVideoOnly => 'Share video only'; + + @override + String get entryActionViewSource => 'View source'; + + @override + String get entryActionShowGeoTiffOnMap => 'Show as map overlay'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convert to still image'; + + @override + String get entryActionViewMotionPhotoVideo => 'Open video'; + + @override + String get entryActionEdit => 'Edit'; + + @override + String get entryActionOpen => 'Open with'; + + @override + String get entryActionSetAs => 'Set as'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Show in map app'; + + @override + String get entryActionRotateScreen => 'Rotate screen'; + + @override + String get entryActionAddFavourite => 'Add to favorites'; + + @override + String get entryActionRemoveFavourite => 'Remove from favorites'; + + @override + String get videoActionCaptureFrame => 'Capture frame'; + + @override + String get videoActionMute => 'Mute'; + + @override + String get videoActionUnmute => 'Unmute'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Play'; + + @override + String get videoActionReplay10 => 'Seek backward 10 seconds'; + + @override + String get videoActionSkip10 => 'Seek forward 10 seconds'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Select tracks'; + + @override + String get videoActionSetSpeed => 'Playback speed'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Settings'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Resume'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'Edit date & time'; + + @override + String get entryInfoActionEditLocation => 'Edit location'; + + @override + String get entryInfoActionEditTitleDescription => 'Edit title & description'; + + @override + String get entryInfoActionEditRating => 'Edit rating'; + + @override + String get entryInfoActionEditTags => 'Edit tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Remove metadata'; + + @override + String get entryInfoActionExportMetadata => 'Export metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Remove location'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Crop'; + + @override + String get editorTransformRotate => 'Rotate'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landscape'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Recycle bin'; + + @override + String get filterFavouriteLabel => 'Favorite'; + + @override + String get filterNoDateLabel => 'Undated'; + + @override + String get filterNoAddressLabel => 'No address'; + + @override + String get filterLocatedLabel => 'Located'; + + @override + String get filterNoLocationLabel => 'Unlocated'; + + @override + String get filterNoRatingLabel => 'Unrated'; + + @override + String get filterTaggedLabel => 'Tagged'; + + @override + String get filterNoTagLabel => 'Untagged'; + + @override + String get filterNoTitleLabel => 'Untitled'; + + @override + String get filterOnThisDayLabel => 'On this day'; + + @override + String get filterRecentlyAddedLabel => 'Recently added'; + + @override + String get filterRatingRejectedLabel => 'Rejected'; + + @override + String get filterTypeAnimatedLabel => 'Animated'; + + @override + String get filterTypeMotionPhotoLabel => 'Motion Photo'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Image'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'New'; + + @override + String get albumTierPinned => 'Pinned'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Common'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Others'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimal degrees'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Highest rate'; + + @override + String get displayRefreshRatePreferLowest => 'Lowest rate'; + + @override + String get keepScreenOnNever => 'Never'; + + @override + String get keepScreenOnVideoPlayback => 'During video playback'; + + @override + String get keepScreenOnViewerOnly => 'Viewer page only'; + + @override + String get keepScreenOnAlways => 'Always'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Never'; + + @override + String get maxBrightnessAlways => 'Always'; + + @override + String get nameConflictStrategyRename => 'Rename'; + + @override + String get nameConflictStrategyReplace => 'Replace'; + + @override + String get nameConflictStrategySkip => 'Skip'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Top'; + + @override + String get subtitlePositionBottom => 'Bottom'; + + @override + String get themeBrightnessLight => 'Light'; + + @override + String get themeBrightnessDark => 'Dark'; + + @override + String get themeBrightnessBlack => 'Black'; + + @override + String get unitSystemMetric => 'Metric'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Password'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Open with other player'; + + @override + String get videoLoopModeNever => 'Never'; + + @override + String get videoLoopModeShortOnly => 'Short videos only'; + + @override + String get videoLoopModeAlways => 'Always'; + + @override + String get videoPlaybackSkip => 'Skip'; + + @override + String get videoPlaybackMuted => 'Play muted'; + + @override + String get videoPlaybackWithSound => 'Play with sound'; + + @override + String get videoResumptionModeNever => 'Never'; + + @override + String get videoResumptionModeAlways => 'Always'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'None'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'Random'; + + @override + String get widgetDisplayedItemMostRecent => 'Most recent'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internal storage'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Some files have the same name.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'ADD'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Save dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OVER'; + + @override + String get videoResumeButtonLabel => 'RESUME'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Custom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'New Album'; + + @override + String get newAlbumDialogNameLabel => 'Album name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'Storage:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'New name'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'Rename'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insert field'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Preview'; + + @override + String get renameProcessorCounter => 'Counter'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Name'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete this album and the $countString items in it?', + one: 'Delete this album and the item in it?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these albums and the $countString items in them?', + one: 'Delete these albums and the item in them?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Width'; + + @override + String get exportEntryDialogHeight => 'Height'; + + @override + String get exportEntryDialogQuality => 'Quality'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'New name'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'Date & Time'; + + @override + String get editEntryDateDialogSetCustom => 'Set custom date'; + + @override + String get editEntryDateDialogCopyField => 'Copy from other date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'File modified date'; + + @override + String get durationDialogHours => 'Hours'; + + @override + String get durationDialogMinutes => 'Minutes'; + + @override + String get durationDialogSeconds => 'Seconds'; + + @override + String get editEntryLocationDialogTitle => 'Location'; + + @override + String get editEntryLocationDialogSetCustom => 'Set custom location'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Choose on map'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Use this location'; + + @override + String get editEntryRatingDialogTitle => 'Rating'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'More'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'Playback speed'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtitles'; + + @override + String get videoStreamSelectionDialogOff => 'Off'; + + @override + String get videoStreamSelectionDialogTrack => 'Track'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'Done!'; + + @override + String get genericFailureFeedback => 'Failed'; + + @override + String get genericDangerWarningDialogMessage => 'Are you sure?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'View'; + + @override + String get menuActionSelect => 'Select'; + + @override + String get menuActionSelectAll => 'Select all'; + + @override + String get menuActionSelectNone => 'Select none'; + + @override + String get menuActionMap => 'Map'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'Stats'; + + @override + String get viewDialogSortSectionTitle => 'Sort'; + + @override + String get viewDialogGroupSectionTitle => 'Sections'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'Grid'; + + @override + String get tileLayoutList => 'List'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Color'; + + @override + String get appPickDialogTitle => 'Pick App'; + + @override + String get appPickDialogNone => 'None'; + + @override + String get aboutPageTitle => 'About'; + + @override + String get aboutLinkLicense => 'License'; + + @override + String get aboutLinkPolicy => 'Privacy Policy'; + + @override + String get aboutBugSectionTitle => 'Bug Report'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copy system information'; + + @override + String get aboutBugCopyInfoButton => 'Copy'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'Report'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Credits'; + + @override + String get aboutCreditsWorldAtlas1 => 'This app uses a TopoJSON file from'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'Translators'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenses'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Show All Licenses'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'Pick'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'Edit'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Unknown'; + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'About'; + + @override + String get drawerSettingsButton => 'Settings'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Countries'; + + @override + String get drawerPlacePage => 'Places'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'By date'; + + @override + String get sortByName => 'By name'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'By size'; + + @override + String get sortByAlbumFileName => 'By album & item title'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A to Z'; + + @override + String get sortOrderZtoA => 'Z to A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumMimeTypeMixed => 'Mixed'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'Camera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'CREATE'; + + @override + String get newFilterBanner => 'new'; + + @override + String get countryPageTitle => 'Countries'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'States'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Places'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Date'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Countries'; + + @override + String get searchStatesSectionTitle => 'States'; + + @override + String get searchPlacesSectionTitle => 'Places'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Ratings'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Settings'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'Disabled'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'Settings'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Home'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_sv.dart b/lib/l10ngen/app_localizations_sv.dart new file mode 100644 index 0000000..8d21e6d --- /dev/null +++ b/lib/l10ngen/app_localizations_sv.dart @@ -0,0 +1,2404 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Swedish (`sv`). +class AppLocalizationsSv extends AppLocalizations { + AppLocalizationsSv([String locale = 'sv']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Välkommen till Aves'; + + @override + String get welcomeOptional => 'Valfritt'; + + @override + String get welcomeTermsToggle => 'Jag godkänner användarvillkoren'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count objekt', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count kolumner', + one: '$count kolumn', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString sekunder', + one: '$countString sekund', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minuter', + one: '$countString minut', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString dagar', + one: '$countString dag', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'TILLÄMPA'; + + @override + String get createButtonLabel => 'SKAPA'; + + @override + String get deleteButtonLabel => 'Ta bort'; + + @override + String get nextButtonLabel => 'NÄSTA'; + + @override + String get showButtonLabel => 'VISA'; + + @override + String get hideButtonLabel => 'GÖM'; + + @override + String get continueButtonLabel => 'FORTSÄTT'; + + @override + String get saveCopyButtonLabel => 'Spara kopia'; + + @override + String get applyTooltip => 'Tillämpa'; + + @override + String get cancelTooltip => 'Avbryt'; + + @override + String get changeTooltip => 'Ändra'; + + @override + String get clearTooltip => 'Rensa'; + + @override + String get previousTooltip => 'Föregående'; + + @override + String get nextTooltip => 'Nästa'; + + @override + String get showTooltip => 'Visa'; + + @override + String get hideTooltip => 'Göm'; + + @override + String get actionRemove => 'Ta bort'; + + @override + String get resetTooltip => 'Återställ'; + + @override + String get saveTooltip => 'Spara'; + + @override + String get stopTooltip => 'Stopp'; + + @override + String get pickTooltip => 'Välj'; + + @override + String get doubleBackExitMessage => 'Tryck ”bakåt” igen för att stänga.'; + + @override + String get doNotAskAgain => 'Fråga inte igen'; + + @override + String get sourceStateLoading => 'Laddar'; + + @override + String get sourceStateCataloguing => 'Katalogiserar'; + + @override + String get sourceStateLocatingCountries => 'Lokaliserar länder'; + + @override + String get sourceStateLocatingPlaces => 'Lokaliserar platser'; + + @override + String get chipActionDelete => 'Ta bort'; + + @override + String get chipActionRemove => 'Ta bort'; + + @override + String get chipActionShowCollection => 'Visa i Samling'; + + @override + String get chipActionGoToAlbumPage => 'Visa i Album'; + + @override + String get chipActionGoToCountryPage => 'Visa i Länder'; + + @override + String get chipActionGoToPlacePage => 'Visa i Platser'; + + @override + String get chipActionGoToTagPage => 'Visa på Etikettsidan'; + + @override + String get chipActionGoToExplorerPage => 'Visa i Utforskaren'; + + @override + String get chipActionDecompose => 'Splitta'; + + @override + String get chipActionFilterOut => 'Filtrera ut'; + + @override + String get chipActionFilterIn => 'Filtrera fram'; + + @override + String get chipActionHide => 'Göm'; + + @override + String get chipActionLock => 'Lås'; + + @override + String get chipActionPin => 'Fäst överst'; + + @override + String get chipActionUnpin => 'Släpp från fästet'; + + @override + String get chipActionGroup => 'Ändra gruppering'; + + @override + String get chipActionRename => 'Byt namn'; + + @override + String get chipActionSetCover => 'Välj som omslag'; + + @override + String get chipActionShowCountryStates => 'Visa delstater'; + + @override + String get chipActionCreateGroup => 'Skapa grupp'; + + @override + String get chipActionCreateAlbum => 'Skapa album'; + + @override + String get chipActionCreateVault => 'Skapa valv'; + + @override + String get chipActionConfigureVault => 'Konfigurera valv'; + + @override + String get entryActionCopyToClipboard => 'Kopiera till klippboken'; + + @override + String get entryActionDelete => 'Radera'; + + @override + String get entryActionConvert => 'Konvertera'; + + @override + String get entryActionExport => 'Exportera'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Byt namn'; + + @override + String get entryActionRestore => 'Återställ'; + + @override + String get entryActionRotateCCW => 'Rotera moturs'; + + @override + String get entryActionRotateCW => 'Rotera medurs'; + + @override + String get entryActionFlip => 'Vrid horisontellt'; + + @override + String get entryActionPrint => 'Skriv ut'; + + @override + String get entryActionShare => 'Dela'; + + @override + String get entryActionShareImageOnly => 'Dela endast bild'; + + @override + String get entryActionShareVideoOnly => 'Dela endast video'; + + @override + String get entryActionViewSource => 'Visa källa'; + + @override + String get entryActionShowGeoTiffOnMap => 'Visa som kartöverlägg'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Konvertera till stillbild'; + + @override + String get entryActionViewMotionPhotoVideo => 'Öppna video'; + + @override + String get entryActionEdit => 'Redigera'; + + @override + String get entryActionOpen => 'Öppna med'; + + @override + String get entryActionSetAs => 'Välj som'; + + @override + String get entryActionCast => 'Casta'; + + @override + String get entryActionOpenMap => 'Visa i kartappen'; + + @override + String get entryActionRotateScreen => 'Rotera skärmen'; + + @override + String get entryActionAddFavourite => 'Lägg till i favoritlistan'; + + @override + String get entryActionRemoveFavourite => 'Ta bort från favoritlistan'; + + @override + String get videoActionCaptureFrame => 'Fånga stillbild'; + + @override + String get videoActionMute => 'Ljud av'; + + @override + String get videoActionUnmute => 'Ljud på'; + + @override + String get videoActionPause => 'Pausa'; + + @override + String get videoActionPlay => 'Spela'; + + @override + String get videoActionReplay10 => 'Spola tillbaks 10 sekunder'; + + @override + String get videoActionSkip10 => 'Spola framåt 10 sekunder'; + + @override + String get videoActionShowPreviousFrame => 'Visa föregående bildruta'; + + @override + String get videoActionShowNextFrame => 'Visa nästa bildruta'; + + @override + String get videoActionSelectStreams => 'Välj spår'; + + @override + String get videoActionSetSpeed => 'Uppspelningshastighet'; + + @override + String get videoActionABRepeat => 'A-B återupprepa'; + + @override + String get videoRepeatActionSetStart => 'Ange start'; + + @override + String get videoRepeatActionSetEnd => 'Ange slut'; + + @override + String get viewerActionSettings => 'Inställningar'; + + @override + String get viewerActionLock => 'Lås bildvisaren'; + + @override + String get viewerActionUnlock => 'Lås upp bildvisaren'; + + @override + String get slideshowActionResume => 'Återuppta'; + + @override + String get slideshowActionShowInCollection => 'Visa i Samling'; + + @override + String get entryInfoActionEditDate => 'Redigera datum & tid'; + + @override + String get entryInfoActionEditLocation => 'Redigera plats'; + + @override + String get entryInfoActionEditTitleDescription => 'Redigera titel & beskrivning'; + + @override + String get entryInfoActionEditRating => 'Redigera omdöme'; + + @override + String get entryInfoActionEditTags => 'Redigera etiketter'; + + @override + String get entryInfoActionRemoveMetadata => 'Ta bort metadata'; + + @override + String get entryInfoActionExportMetadata => 'Exportera metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Ta bort plats'; + + @override + String get editorActionTransform => 'Transformera'; + + @override + String get editorTransformCrop => 'Beskär'; + + @override + String get editorTransformRotate => 'Rotera'; + + @override + String get cropAspectRatioFree => 'Fri'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Fyrkant'; + + @override + String get filterAspectRatioLandscapeLabel => 'Liggande bilder'; + + @override + String get filterAspectRatioPortraitLabel => 'Stående bilder'; + + @override + String get filterBinLabel => 'Papperskorg'; + + @override + String get filterFavouriteLabel => 'Favorit'; + + @override + String get filterNoDateLabel => 'Odaterad'; + + @override + String get filterNoAddressLabel => 'Ingen adress'; + + @override + String get filterLocatedLabel => 'Belägen'; + + @override + String get filterNoLocationLabel => 'Oplacerad'; + + @override + String get filterNoRatingLabel => 'Obedömd'; + + @override + String get filterTaggedLabel => 'Taggad'; + + @override + String get filterNoTagLabel => 'Inga etiketter tillagda'; + + @override + String get filterNoTitleLabel => 'Obetitlad'; + + @override + String get filterOnThisDayLabel => 'På den här dagen'; + + @override + String get filterRecentlyAddedLabel => 'Nyligen tillagda'; + + @override + String get filterRatingRejectedLabel => 'Avisad'; + + @override + String get filterTypeAnimatedLabel => 'Animerad'; + + @override + String get filterTypeMotionPhotoLabel => 'Rörelsefoto'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Bild'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Förhindra skärmeffekter'; + + @override + String get accessibilityAnimationsKeep => 'Behåll skärmeffekter'; + + @override + String get albumTierNew => 'Ny'; + + @override + String get albumTierPinned => 'Fastnålad'; + + @override + String get albumTierGroups => 'Grupper'; + + @override + String get albumTierSpecial => 'Vanliga'; + + @override + String get albumTierApps => 'Appar'; + + @override + String get albumTierVaults => 'Valv'; + + @override + String get albumTierDynamic => 'Dynamisk'; + + @override + String get albumTierRegular => 'Andra'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimalgrader'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'Ö'; + + @override + String get coordinateDmsWest => 'V'; + + @override + String get displayRefreshRatePreferHighest => 'Högsta intervall'; + + @override + String get displayRefreshRatePreferLowest => 'Lägsta intervall'; + + @override + String get keepScreenOnNever => 'Aldrig'; + + @override + String get keepScreenOnVideoPlayback => 'Under videouppspelning'; + + @override + String get keepScreenOnViewerOnly => 'Endast på bildvisningssidan'; + + @override + String get keepScreenOnAlways => 'Alltid'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terräng)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitär OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (Akvarell)'; + + @override + String get maxBrightnessNever => 'Aldrig'; + + @override + String get maxBrightnessAlways => 'Alltid'; + + @override + String get nameConflictStrategyRename => 'Byt namn'; + + @override + String get nameConflictStrategyReplace => 'Ersätt'; + + @override + String get nameConflictStrategySkip => 'Skippa'; + + @override + String get overlayHistogramNone => 'Igen'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminans'; + + @override + String get subtitlePositionTop => 'Överkant'; + + @override + String get subtitlePositionBottom => 'Nederkant'; + + @override + String get themeBrightnessLight => 'Ljus'; + + @override + String get themeBrightnessDark => 'Mörk'; + + @override + String get themeBrightnessBlack => 'Svart'; + + @override + String get unitSystemMetric => 'Metriska'; + + @override + String get unitSystemImperial => 'Brittiskt'; + + @override + String get vaultLockTypePattern => 'Mönster'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Lösenord'; + + @override + String get settingsVideoEnablePip => 'Bild-i-bild'; + + @override + String get videoControlsPlayOutside => 'Öppna med annan spelare'; + + @override + String get videoLoopModeNever => 'Aldrig'; + + @override + String get videoLoopModeShortOnly => 'Bara korta videor'; + + @override + String get videoLoopModeAlways => 'Alltid'; + + @override + String get videoPlaybackSkip => 'Skippa'; + + @override + String get videoPlaybackMuted => 'Spela ljudlös'; + + @override + String get videoPlaybackWithSound => 'Spela med ljud'; + + @override + String get videoResumptionModeNever => 'Aldrig'; + + @override + String get videoResumptionModeAlways => 'Alltid'; + + @override + String get viewerTransitionSlide => 'Glid'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Tona ut'; + + @override + String get viewerTransitionZoomIn => 'Zooma in'; + + @override + String get viewerTransitionNone => 'Igen'; + + @override + String get wallpaperTargetHome => 'Hemskärm'; + + @override + String get wallpaperTargetLock => 'Låsskärm'; + + @override + String get wallpaperTargetHomeLock => 'Hem och låsskärmar'; + + @override + String get widgetDisplayedItemRandom => 'Slumpartat'; + + @override + String get widgetDisplayedItemMostRecent => 'Det senaste'; + + @override + String get widgetOpenPageHome => 'Öppna startsida'; + + @override + String get widgetOpenPageCollection => 'Öppna samling'; + + @override + String get widgetOpenPageViewer => 'Öppna bildvisaren'; + + @override + String get widgetTapUpdateWidget => 'Uppdatera widgeten'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Intern lagring'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD kort'; + + @override + String get rootDirectoryDescription => 'grundkatalog'; + + @override + String otherDirectoryDescription(String name) { + return '”$name”-katalogen'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Vänligen välj $directory i ”$volume” på nästa skärm för att ge appen åtkomst till den.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Denna applikation har ej tillåtelse att modifiera filer i $directory i ”$volume”.\n\nVänligen använd en förinstallerad filhanterare eller galleriapplikation för att flytta filerna till en annan katalog.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Denna åtgärd behöver $neededSize ledigt utrymme på ”$volume” för att kunna slutföras, men det är enbart $freeSize kvar.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Systemets filväljare saknas eller har inaktiverats. Vänligen aktivera denna och försök igen.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Denna åtgärd stöds ej för följande typer av objekt: $types.', + one: 'Denna åtgärd stöds ej för objekt av denna typ: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Vissa filer i destinationsmappen har samma namn.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Vissa filer har samma namn.'; + + @override + String get addShortcutDialogLabel => 'Rubrik för genväg'; + + @override + String get addShortcutButtonLabel => 'LÄGG TILL'; + + @override + String get noMatchingAppDialogMessage => 'Det finns inga applikationer som kan hantera detta.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Flytta dessa $countString objekt till papperskorgen?', + one: 'Flytta detta objekt till papperskorgen?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Vill du ta bort dessa $countString objekt?', + one: 'Vill du ta bort detta objekt?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Registrera datum för objekten innan vi går vidare?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Spara datum'; + + @override + String videoResumeDialogMessage(String time) { + return 'Vill du återuppta uppspelningen vid tidpunkten $time?'; + } + + @override + String get videoStartOverButtonLabel => 'BÖRJA OM'; + + @override + String get videoResumeButtonLabel => 'ÅTERUPPTA'; + + @override + String get setCoverDialogLatest => 'Senaste objektet'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Anpassad'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matchande foton och videor kommer att döljas från din samling. Du kan välja att visa dem igen från ”sekretessinställningarna”.\n\nÄr du säker på att du vill dölja dem?'; + + @override + String get newAlbumDialogTitle => 'Nytt Album'; + + @override + String get newAlbumDialogNameLabel => 'Album namn'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Albumet existerar redan'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Katalogen existerar redan'; + + @override + String get newAlbumDialogStorageLabel => 'Lagring:'; + + @override + String get newDynamicAlbumDialogTitle => 'Nytt dynamiskt album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamiskt album existerar redan'; + + @override + String get newGroupDialogTitle => 'Ny grupp'; + + @override + String get newGroupDialogNameLabel => 'Gruppnamn'; + + @override + String get groupAlreadyExists => 'Gruppen existerar redan'; + + @override + String get groupEmpty => 'Inga grupper'; + + @override + String get ungrouped => 'Ogrupperad'; + + @override + String get groupPickerTitle => 'Välj Grupp'; + + @override + String get groupPickerUseThisGroupButton => 'Använd den här gruppen'; + + @override + String get newVaultWarningDialogMessage => 'Objekt i valv är endast tillgängliga i denna app och inga andra.\n\nOm du avinstallerar den här appen eller rensar appens data kommer du att förlora alla dessa objekt.'; + + @override + String get newVaultDialogTitle => 'Nytt Valv'; + + @override + String get configureVaultDialogTitle => 'Konfigurera Valv'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lås när skärmen stängs av'; + + @override + String get vaultDialogLockTypeLabel => 'Lås typ'; + + @override + String get patternDialogEnter => 'Ange mönster'; + + @override + String get patternDialogConfirm => 'Bekräfta mönster'; + + @override + String get pinDialogEnter => 'Ange Pinkod'; + + @override + String get pinDialogConfirm => 'Bekräfta pinkod'; + + @override + String get passwordDialogEnter => 'Ange lösenord'; + + @override + String get passwordDialogConfirm => 'Bekräfta lösenord'; + + @override + String get authenticateToConfigureVault => 'Verifiera dig för att konfigurera valvet'; + + @override + String get authenticateToUnlockVault => 'Verifiera dig för att låsa upp valvet'; + + @override + String get vaultBinUsageDialogMessage => 'Några valv använder papperskorgen.'; + + @override + String get renameAlbumDialogLabel => 'Nytt namn'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Katalogen finns redan'; + + @override + String get renameEntrySetPageTitle => 'Ändra namn'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Namngivningsmönster'; + + @override + String get renameEntrySetPageInsertTooltip => 'Infoga fällt'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Förhandsgranska'; + + @override + String get renameProcessorCounter => 'Numrering'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Namn'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Ta bort detta album och de $countString objekt som den innehåller?', + one: 'Ta bort detta album samt det objektet som den innehåller?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Ta bort dessa album samt de $countString objekt som de innehåller?', + one: 'Ta bort dessa album samt det objekt som de innehåller?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Bredd'; + + @override + String get exportEntryDialogHeight => 'Höjd'; + + @override + String get exportEntryDialogQuality => 'Kvalitet'; + + @override + String get exportEntryDialogWriteMetadata => 'Registrera metadata'; + + @override + String get renameEntryDialogLabel => 'Nytt namn'; + + @override + String get editEntryDialogCopyFromItem => 'Kopiera från annat objekt'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fällt att modifiera'; + + @override + String get editEntryDateDialogTitle => 'Datum & Tid'; + + @override + String get editEntryDateDialogSetCustom => 'Ange anpassat datum'; + + @override + String get editEntryDateDialogCopyField => 'Kopiera från annat datum'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extrahera från titel'; + + @override + String get editEntryDateDialogShift => 'Förskjut'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Datum då filen ändrades'; + + @override + String get durationDialogHours => 'Timmar'; + + @override + String get durationDialogMinutes => 'Minuter'; + + @override + String get durationDialogSeconds => 'Sekunder'; + + @override + String get editEntryLocationDialogTitle => 'Plats'; + + @override + String get editEntryLocationDialogSetCustom => 'Ange plats manuellt'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Välj på karta'; + + @override + String get editEntryLocationDialogImportGpx => 'Importera GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitud'; + + @override + String get editEntryLocationDialogLongitude => 'Longitud'; + + @override + String get editEntryLocationDialogTimeShift => 'Tidsskifte'; + + @override + String get locationPickerUseThisLocationButton => 'Använd den här platsen'; + + @override + String get editEntryRatingDialogTitle => 'Omdöme'; + + @override + String get removeEntryMetadataDialogTitle => 'Borttagning av metadata'; + + @override + String get removeEntryMetadataDialogAll => 'Allt'; + + @override + String get removeEntryMetadataDialogMore => 'Mer'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP behövs för att spela upp videon i ett Rörelsefoto.\n\nÄr du säker att du vill ta bort det?'; + + @override + String get videoSpeedDialogLabel => 'Uppspelningshastighet'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Ljud'; + + @override + String get videoStreamSelectionDialogText => 'Undertexter'; + + @override + String get videoStreamSelectionDialogOff => 'Av'; + + @override + String get videoStreamSelectionDialogTrack => 'Spår'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Det finns inga andra spår.'; + + @override + String get genericSuccessFeedback => 'Klar!'; + + @override + String get genericFailureFeedback => 'Misslyckad'; + + @override + String get genericDangerWarningDialogMessage => 'Är du säker?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Försök ingen med färre objekt.'; + + @override + String get menuActionConfigureView => 'Visa'; + + @override + String get menuActionSelect => 'Välj'; + + @override + String get menuActionSelectAll => 'Välj alla'; + + @override + String get menuActionSelectNone => 'Välj ingen'; + + @override + String get menuActionMap => 'Karta'; + + @override + String get menuActionSlideshow => 'Bildspel'; + + @override + String get menuActionStats => 'Statistik'; + + @override + String get viewDialogSortSectionTitle => 'Sortera'; + + @override + String get viewDialogGroupSectionTitle => 'Sektioner'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Omvänd sorteringsordning'; + + @override + String get tileLayoutMosaic => 'Mosaik'; + + @override + String get tileLayoutGrid => 'Rutnät'; + + @override + String get tileLayoutList => 'Lista'; + + @override + String get castDialogTitle => 'Uppspelningsenheter'; + + @override + String get coverDialogTabCover => 'Omslag'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Färg'; + + @override + String get appPickDialogTitle => 'Välj App'; + + @override + String get appPickDialogNone => 'Igen'; + + @override + String get aboutPageTitle => 'Om'; + + @override + String get aboutLinkLicense => 'Licens'; + + @override + String get aboutLinkPolicy => 'IntegritetsPolicy'; + + @override + String get aboutBugSectionTitle => 'Felrapport'; + + @override + String get aboutBugSaveLogInstruction => 'Spara appens log till en fil'; + + @override + String get aboutBugCopyInfoInstruction => 'Kopiera systemInformation'; + + @override + String get aboutBugCopyInfoButton => 'Kopiera'; + + @override + String get aboutBugReportInstruction => 'Rapportera på GitHub tillsammans med bifogade loggar och systeminformation'; + + @override + String get aboutBugReportButton => 'Rapportera'; + + @override + String get aboutDataUsageSectionTitle => 'DataAnvänding'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Databas'; + + @override + String get aboutDataUsageMisc => 'Diverse'; + + @override + String get aboutDataUsageInternal => 'Internt'; + + @override + String get aboutDataUsageExternal => 'Externt'; + + @override + String get aboutDataUsageClearCache => 'Rensa Cacheminnet'; + + @override + String get aboutCreditsSectionTitle => 'Tillkännagivande'; + + @override + String get aboutCreditsWorldAtlas1 => 'Den här appen använder en TopoJSON fil från'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC Licens.'; + + @override + String get aboutTranslatorsSectionTitle => 'Översättare'; + + @override + String get aboutLicensesSectionTitle => 'Öppen-Källkod Licenser'; + + @override + String get aboutLicensesBanner => 'Den här applikationen använder följande paket och bibliotek under öppen källkod-licens.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Bibliotek'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter-programtillägg'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter-paket'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart-paket'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Visa alla licenser'; + + @override + String get policyPageTitle => 'IntegritetsPolicy'; + + @override + String get collectionPageTitle => 'Samling'; + + @override + String get collectionPickPageTitle => 'Välj'; + + @override + String get collectionSelectPageTitle => 'Välj objekt'; + + @override + String get collectionActionShowTitleSearch => 'Visa titelfilter'; + + @override + String get collectionActionHideTitleSearch => 'Göm titelfilter'; + + @override + String get collectionActionAddDynamicAlbum => 'Lägg till dynamiskt album'; + + @override + String get collectionActionAddShortcut => 'Lägg till genväg'; + + @override + String get collectionActionSetHome => 'Välj som startsida'; + + @override + String get collectionActionEmptyBin => 'Töm papperskorgen'; + + @override + String get collectionActionCopy => 'kopiera till album'; + + @override + String get collectionActionMove => 'Flytta till album'; + + @override + String get collectionActionRescan => 'Scanna om'; + + @override + String get collectionActionEdit => 'Redigera'; + + @override + String get collectionSearchTitlesHintText => 'Sök titlar'; + + @override + String get collectionGroupAlbum => 'Efter album'; + + @override + String get collectionGroupMonth => 'Efter månad'; + + @override + String get collectionGroupDay => 'Efter dag'; + + @override + String get sectionNone => 'Inga sektioner'; + + @override + String get sectionUnknown => 'Okänd'; + + @override + String get dateToday => 'Idag'; + + @override + String get dateYesterday => 'Igår'; + + @override + String get dateThisMonth => 'Den här månaden'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Misslyckades med att ta bort $count objekt', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Misslyckades med att kopiera $count objekt', + one: 'Misslyckades med att kopiera 1 objekt', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Misslyckades med att flytta $count objekt', + one: 'Misslyckades med att flytta 1 objekt', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Misslyckades med att byta namn på $count objekt', + one: 'Misslyckades med att byta namn på 1 objekt', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Misslyckades med att ändra $countString objekt', + one: 'Misslyckades med att ändra 1 objekt', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Misslyckades med att exportera $countString sidor', + one: 'Misslyckades med att exportera 1 sida', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Kopierade$countString objekt', + one: 'Kopierade 1 objekt', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Flyttade $countString objekt', + one: 'Flyttade 1 objekt', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Ändrat namn på $countString objekt', + one: 'Ändrat namn på 1 objekt', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Ändrat $countString objekt', + one: 'Ändrat 1 objekt', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Inga favoriter'; + + @override + String get collectionEmptyVideos => 'Inga videor'; + + @override + String get collectionEmptyImages => 'Inga bilder'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Bevilja åtkomst'; + + @override + String get collectionSelectSectionTooltip => 'Markera sektion'; + + @override + String get collectionDeselectSectionTooltip => 'Avmarkera sektion'; + + @override + String get drawerAboutButton => 'Om'; + + @override + String get drawerSettingsButton => 'Inställningar'; + + @override + String get drawerCollectionAll => 'Hela samlingen'; + + @override + String get drawerCollectionFavourites => 'Favoriter'; + + @override + String get drawerCollectionImages => 'Bilder'; + + @override + String get drawerCollectionVideos => 'Videor'; + + @override + String get drawerCollectionAnimated => 'Animerade'; + + @override + String get drawerCollectionMotionPhotos => 'Rörelsefoton'; + + @override + String get drawerCollectionPanoramas => 'Panoraman'; + + @override + String get drawerCollectionRaws => 'Bilder i råformat'; + + @override + String get drawerCollectionSphericalVideos => '360°-Videor'; + + @override + String get drawerAlbumPage => 'Album'; + + @override + String get drawerCountryPage => 'Länder'; + + @override + String get drawerPlacePage => 'Platser'; + + @override + String get drawerTagPage => 'Etiketter'; + + @override + String get sortByDate => 'Efter datum'; + + @override + String get sortByName => 'Efter namn'; + + @override + String get sortByItemCount => 'Efter antal objekt'; + + @override + String get sortBySize => 'Efter storlek'; + + @override + String get sortByAlbumFileName => 'Efter album & objekttitel'; + + @override + String get sortByRating => 'Efter omdömen'; + + @override + String get sortByDuration => 'Efter spellängd'; + + @override + String get sortByPath => 'Efter sökväg'; + + @override + String get sortOrderNewestFirst => 'Nyast först'; + + @override + String get sortOrderOldestFirst => 'Äldst först'; + + @override + String get sortOrderAtoZ => 'A till Ö'; + + @override + String get sortOrderZtoA => 'Ö till A'; + + @override + String get sortOrderHighestFirst => 'Högst först'; + + @override + String get sortOrderLowestFirst => 'Lägst först'; + + @override + String get sortOrderLargestFirst => 'Störst först'; + + @override + String get sortOrderSmallestFirst => 'Minst först'; + + @override + String get sortOrderShortestFirst => 'Kortast först'; + + @override + String get sortOrderLongestFirst => 'Längst först'; + + @override + String get albumGroupTier => 'Efter nivå'; + + @override + String get albumGroupType => 'Efter typ'; + + @override + String get albumGroupVolume => 'Efter lagringsmedia'; + + @override + String get albumMimeTypeMixed => 'Blandat'; + + @override + String get albumPickPageTitleCopy => 'Kopiera till Album'; + + @override + String get albumPickPageTitleExport => 'Exportera till Album'; + + @override + String get albumPickPageTitleMove => 'Flytta till Album'; + + @override + String get albumPickPageTitlePick => 'Välj Album'; + + @override + String get albumCamera => 'Kamera'; + + @override + String get albumDownload => 'Nedladdningar'; + + @override + String get albumScreenshots => 'Skärmbilder'; + + @override + String get albumScreenRecordings => 'Skärminspelningar'; + + @override + String get albumVideoCaptures => 'Videoupptagningar'; + + @override + String get albumPageTitle => 'Album'; + + @override + String get albumEmpty => 'Inga album'; + + @override + String get createAlbumButtonLabel => 'SKAPA'; + + @override + String get newFilterBanner => 'ny'; + + @override + String get countryPageTitle => 'Länder'; + + @override + String get countryEmpty => 'Inga länder'; + + @override + String get statePageTitle => 'Delstater'; + + @override + String get stateEmpty => 'Inga delstater'; + + @override + String get placePageTitle => 'Platser'; + + @override + String get placeEmpty => 'Inga platser'; + + @override + String get tagPageTitle => 'Etiketter'; + + @override + String get tagEmpty => 'Inga etiketter'; + + @override + String get tagPickPageTitle => 'Välj etikett'; + + @override + String get binPageTitle => 'Papperskorgen'; + + @override + String get explorerPageTitle => 'Utforskaren'; + + @override + String get explorerActionSelectStorageVolume => 'Välj lagringsplats'; + + @override + String get selectStorageVolumeDialogTitle => 'Välj Lagringsplats'; + + @override + String get searchCollectionFieldHint => 'Sök i samling'; + + @override + String get searchRecentSectionTitle => 'Nyligen'; + + @override + String get searchDateSectionTitle => 'Datum'; + + @override + String get searchFormatSectionTitle => 'Format'; + + @override + String get searchAlbumsSectionTitle => 'Album'; + + @override + String get searchCountriesSectionTitle => 'Länder'; + + @override + String get searchStatesSectionTitle => 'Delstater'; + + @override + String get searchPlacesSectionTitle => 'Platser'; + + @override + String get searchTagsSectionTitle => 'Etiketter'; + + @override + String get searchRatingSectionTitle => 'Omdöme'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Inställningar'; + + @override + String get settingsSystemDefault => 'Systemets standard'; + + @override + String get settingsDefault => 'Standard'; + + @override + String get settingsDisabled => 'Inaktiverad'; + + @override + String get settingsEnabled => 'Aktiverad'; + + @override + String get settingsForced => 'Tvingad'; + + @override + String get settingsAskEverytime => 'Fråga varje gång'; + + @override + String get settingsModificationWarningDialogMessage => 'Andra inställningar kommer att ändras.'; + + @override + String get settingsSearchFieldLabel => 'Sök efter inställningar'; + + @override + String get settingsSearchEmpty => 'Inga matchande inställningar hittades'; + + @override + String get settingsActionExport => 'Exportera'; + + @override + String get settingsActionExportDialogTitle => 'Exportera'; + + @override + String get settingsActionImport => 'Importera'; + + @override + String get settingsActionImportDialogTitle => 'Importera'; + + @override + String get appExportCovers => 'Omslagsbilder'; + + @override + String get appExportDynamicAlbums => 'Dynamiska album'; + + @override + String get appExportFavourites => 'Favoriter'; + + @override + String get appExportSettings => 'Inställningar'; + + @override + String get settingsNavigationSectionTitle => 'Navigering'; + + @override + String get settingsHomeTile => 'Startsida'; + + @override + String get settingsHomeDialogTitle => 'Startsida'; + + @override + String get setHomeCustom => 'Anpassad'; + + @override + String get settingsKeepScreenOnTile => 'Behåll skärmen aktiv'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Behåll Skärmen Aktiv'; + + @override + String get settingsDoubleBackExit => 'Tryck ”bakåt” två gånger för att avsluta'; + + @override + String get settingsConfirmationTile => 'Bekräftelsedialoger'; + + @override + String get settingsConfirmationDialogTitle => 'Bekräftelsedialoger'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Fråga innan objekt raderas permanent'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Fråga innan objekt flyttas till papperskorgen'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Fråga innan odaterade objekt flyttas'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Visa ett meddelande efter att objekt flyttats till papperskorgen'; + + @override + String get settingsConfirmationVaultDataLoss => 'Visa varning för dataförlust i valv'; + + @override + String get settingsNavigationDrawerTile => 'Navigeringsmeny'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigeringsmeny'; + + @override + String get settingsNavigationDrawerBanner => 'Tryck och håll i för att flytta och arrangera om objekt i menyn.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Kategorier'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Album'; + + @override + String get settingsNavigationDrawerTabPages => 'Sidor'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Lägg till album'; + + @override + String get settingsNavigationBottomActionsTile => 'Nedre navigeringsfält'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Nedre navigeringsfält'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Tryck och håll ner för att flytta knappar och välj vilka återgärder som visas i det nedre navigeringsfältet.'; + + @override + String get settingsThumbnailSectionTitle => 'Miniatyrbilder'; + + @override + String get settingsThumbnailOverlayTile => 'Översikt'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Översikt'; + + @override + String get settingsThumbnailShowHdrIcon => 'Visa HDR-ikon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Visa favoritikon'; + + @override + String get settingsThumbnailShowTagIcon => 'Visa etikettikon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Visa lokaliseringsikon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Visa ikon för Rörelsefoto'; + + @override + String get settingsThumbnailShowRating => 'Visa omdömen'; + + @override + String get settingsThumbnailShowRawIcon => 'Visa ikon för råbildsformatet RAW'; + + @override + String get settingsThumbnailShowVideoDuration => 'Visa videons längd'; + + @override + String get settingsCollectionQuickActionsTile => 'Genvägar'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Genvägar'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Bläddra'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Välja'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Tryck och håll nere för att flytta knappar och välj på så vis vilka åtgärder som skall visas vid bläddring bland objekt.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Tryck och håll nere för att flytta knappar och välj på så vis vilka åtgärder som skall visas när objekt väljs.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Seriefotograferingsmönster'; + + @override + String get settingsCollectionBurstPatternsNone => 'Inget'; + + @override + String get settingsViewerSectionTitle => 'Bildvisare'; + + @override + String get settingsViewerGestureSideTapNext => 'Tryck på skärmens kanter för att visa tidigare/nästa objekt'; + + @override + String get settingsViewerUseCutout => 'Använd skärmutskärningsområdet'; + + @override + String get settingsViewerMaximumBrightness => 'Maximal ljusstyrka'; + + @override + String get settingsMotionPhotoAutoPlay => 'Spela automatiskt upp rörelsefoton'; + + @override + String get settingsImageBackground => 'Bakgrund för bilder'; + + @override + String get settingsViewerQuickActionsTile => 'Genvägar'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Genvägar'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Tryck och håll ner för att flytta och på så vis välja vilka åtgärder som skall visas i bildvisaren.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Knappar Som Visas'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Tillgängliga Knappar'; + + @override + String get settingsViewerQuickActionEmpty => 'Inga knappar'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Visas vid öppnande'; + + @override + String get settingsViewerShowHistogram => 'Visa histogram'; + + @override + String get settingsViewerShowMinimap => 'Visa miniatyrkarta'; + + @override + String get settingsViewerShowZoomLevel => 'Visa zoomnivå'; + + @override + String get settingsViewerShowInformation => 'Visa information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Visa titel, datum, plats, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Visa omdöme & etiketter'; + + @override + String get settingsViewerShowShootingDetails => 'Visa bildtagningsdetaljer'; + + @override + String get settingsViewerShowDescription => 'Visa beskrivning'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Visa miniatyrbilder'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Effekt för oskärpa'; + + @override + String get settingsViewerSlideshowTile => 'Bildspel'; + + @override + String get settingsViewerSlideshowPageTitle => 'Bildspel'; + + @override + String get settingsSlideshowRepeat => 'Upprepa'; + + @override + String get settingsSlideshowShuffle => 'Blanda'; + + @override + String get settingsSlideshowFillScreen => 'Helskärm'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animerad inzoomningseffekt'; + + @override + String get settingsSlideshowTransitionTile => 'Övergång'; + + @override + String get settingsSlideshowIntervalTile => 'Intervall'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Videouppspelning'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Videouppspelning'; + + @override + String get settingsVideoPageTitle => 'Videoinställningar'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Visa videor'; + + @override + String get settingsVideoPlaybackTile => 'Uppspelning'; + + @override + String get settingsVideoPlaybackPageTitle => 'Uppspelning'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hårdvaruacceleration'; + + @override + String get settingsVideoAutoPlay => 'Automatisk uppspelning'; + + @override + String get settingsVideoLoopModeTile => 'Upprepningsläge'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Upprepningsläge'; + + @override + String get settingsVideoResumptionModeTile => 'Återuppta uppspelning'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Återuppta Uppspelning'; + + @override + String get settingsVideoBackgroundMode => 'Bakgrundsläge'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Bakgrundsläge'; + + @override + String get settingsVideoControlsTile => 'Reglage'; + + @override + String get settingsVideoControlsPageTitle => 'Reglage'; + + @override + String get settingsVideoButtonsTile => 'Knappar'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Tryck två gånger för att spela upp/pausa'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Tryck två gånger på skärmkanterna för att spola bakåt/framåt'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Svep upp och ner för att anpassa ljusstyrka/ljudvolym'; + + @override + String get settingsSubtitleThemeTile => 'Undertexter'; + + @override + String get settingsSubtitleThemePageTitle => 'Undertexter'; + + @override + String get settingsSubtitleThemeSample => 'Detta är ett exempel.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Textplacering'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Textplacering'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Textposition'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Textposition'; + + @override + String get settingsSubtitleThemeTextSize => 'Textstorlek'; + + @override + String get settingsSubtitleThemeShowOutline => 'Visa kantlinjer och skuggor'; + + @override + String get settingsSubtitleThemeTextColor => 'Textfärg'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Textens genomskinlighet'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Bakgrundsfärg'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Bakgrundens genomskinlighet'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Vänster'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Centrerad'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Höger'; + + @override + String get settingsPrivacySectionTitle => 'Sekretess'; + + @override + String get settingsAllowInstalledAppAccess => 'Tillåt åtkomst till applikationsförteckning'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Används för att förbättra visning av album'; + + @override + String get settingsAllowErrorReporting => 'Tillåt anonym felrapportering'; + + @override + String get settingsSaveSearchHistory => 'Spara sökhistorik'; + + @override + String get settingsEnableBin => 'Använd papperskorg'; + + @override + String get settingsEnableBinSubtitle => 'Behåll borttagna objekt i 30 dagar'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Objekt i papperskorgen kommer att tas bort permanent.'; + + @override + String get settingsAllowMediaManagement => 'Tillåt hantering av media'; + + @override + String get settingsHiddenItemsTile => 'Gömda objekt'; + + @override + String get settingsHiddenItemsPageTitle => 'Gömda Objekt'; + + @override + String get settingsHiddenFiltersBanner => 'Bilder och filmer som matchar gömda filter kommer inte visas i dina samlingar.'; + + @override + String get settingsHiddenFiltersEmpty => 'Inga dolda filter'; + + @override + String get settingsStorageAccessTile => 'Åtkomst till lagringsutrymme'; + + @override + String get settingsStorageAccessPageTitle => 'lagringsåtkomst'; + + @override + String get settingsStorageAccessBanner => 'För vissa kataloger krävs ett särskilt åtkomsttillstånd för att ändra filer i dem. Här kan du granska kataloger vilket du tidigare gett detta tillstånd.'; + + @override + String get settingsStorageAccessEmpty => 'Inga speciella åtkomsttillstånd'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Upphäv'; + + @override + String get settingsAccessibilitySectionTitle => 'Tillgänglighet'; + + @override + String get settingsRemoveAnimationsTile => 'Inaktivera animationer'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Inaktivera Animationer'; + + @override + String get settingsTimeToTakeActionTile => 'Tid innan åtgärd vidtages'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Visa alternativ till multi-tryckgester'; + + @override + String get settingsDisplaySectionTitle => 'Skärm'; + + @override + String get settingsThemeBrightnessTile => 'Tema'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Tema'; + + @override + String get settingsThemeColorHighlights => 'Färgbetoning'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamiska färger'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Skärmens uppdateringshastighet'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Uppdateringshastighet'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV-gränssnitt'; + + @override + String get settingsLanguageSectionTitle => 'Språk & Format'; + + @override + String get settingsLanguageTile => 'Språk'; + + @override + String get settingsLanguagePageTitle => 'Språk'; + + @override + String get settingsCoordinateFormatTile => 'Koordinatformat'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Koordinatformat'; + + @override + String get settingsUnitSystemTile => 'Enheter'; + + @override + String get settingsUnitSystemDialogTitle => 'Enheter'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Tvinga arabiska siffror'; + + @override + String get settingsScreenSaverPageTitle => 'Skärmsläckare'; + + @override + String get settingsWidgetPageTitle => 'Fotoram'; + + @override + String get settingsWidgetShowOutline => 'Kantlinje'; + + @override + String get settingsWidgetOpenPage => 'När widgeten trycks på'; + + @override + String get settingsWidgetDisplayedItem => 'Objekt som visas'; + + @override + String get settingsCollectionTile => 'Samling'; + + @override + String get statsPageTitle => 'Statistik'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString objekt som har sparad platsdata', + one: '1 objekt som har sparad platsdata', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Populära Länder'; + + @override + String get statsTopStatesSectionTitle => 'Populära Delstater'; + + @override + String get statsTopPlacesSectionTitle => 'Populära Platser'; + + @override + String get statsTopTagsSectionTitle => 'Populära Etiketter'; + + @override + String get statsTopAlbumsSectionTitle => 'Populära Album'; + + @override + String get viewerOpenPanoramaButtonLabel => 'ÖPPNA PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'ANGE SOM BAKGRUNDSBILD'; + + @override + String get viewerErrorUnknown => 'Ojsan!'; + + @override + String get viewerErrorDoesNotExist => 'Filen finns ej längre.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Tillbaka till bildvisaren'; + + @override + String get viewerInfoUnknown => 'okänd'; + + @override + String get viewerInfoLabelDescription => 'Beskrivning'; + + @override + String get viewerInfoLabelTitle => 'Titel'; + + @override + String get viewerInfoLabelDate => 'Datum'; + + @override + String get viewerInfoLabelResolution => 'Upplösning'; + + @override + String get viewerInfoLabelSize => 'Storlek'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Sökväg'; + + @override + String get viewerInfoLabelDuration => 'Varaktighet'; + + @override + String get viewerInfoLabelOwner => 'Ägare'; + + @override + String get viewerInfoLabelCoordinates => 'Koordinater'; + + @override + String get viewerInfoLabelAddress => 'Adress'; + + @override + String get mapStyleDialogTitle => 'Karttyp'; + + @override + String get mapStyleDialogAddStyle => 'Lägg till typ'; + + @override + String get mapStyleTooltip => 'Välj karttyp'; + + @override + String get mapStyleEditorDialogName => 'Namn'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Underdomäner'; + + @override + String get mapStyleEditorDialogUserAgent => 'Användaragent'; + + @override + String get mapZoomInTooltip => 'Förstora'; + + @override + String get mapZoomOutTooltip => 'Förminska'; + + @override + String get mapPointNorthUpTooltip => 'Rikta norr uppåt'; + + @override + String get mapAttributionOsmData => 'Kartdata © [OpenStreetMap](https://www.openstreetmap.org/copyright) bidragsgivare'; + + @override + String get mapAttributionOsmLiberty => 'Brickor av [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Tillhandahållen av [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Brickor av [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Brickor av [HOT](https://www.hotosm.org/) • Tillhandahållen av [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Brickor av [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Visa på kartsidan'; + + @override + String get mapEmptyRegion => 'Inga bilder i denna region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Misslyckades att extrahera inbäddad data'; + + @override + String get viewerInfoOpenLinkText => 'Öppna'; + + @override + String get viewerInfoViewXmlLinkText => 'Visa XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Sök metadata'; + + @override + String get viewerInfoSearchEmpty => 'Inga matchande nycklar'; + + @override + String get viewerInfoSearchSuggestionDate => 'Datum & tid'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Beskrivning'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensioner'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Upplösning'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rättigheter'; + + @override + String get wallpaperUseScrollEffect => 'Använd bläddringsanimation på hemskärmen'; + + @override + String get tagEditorPageTitle => 'Redigera Etiketter'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Ny etikett'; + + @override + String get tagEditorPageAddTagTooltip => 'Lägg till etikett'; + + @override + String get tagEditorSectionRecent => 'Senaste'; + + @override + String get tagEditorSectionPlaceholders => 'Platshållare'; + + @override + String get tagEditorDiscardDialogMessage => 'Vill du kasta förändringarna?'; + + @override + String get tagPlaceholderCountry => 'Land'; + + @override + String get tagPlaceholderState => 'Delstat'; + + @override + String get tagPlaceholderPlace => 'Plats'; + + @override + String get panoramaEnableSensorControl => 'Aktivera sensorstyrning'; + + @override + String get panoramaDisableSensorControl => 'Inaktivera sensorstyrning'; + + @override + String get sourceViewerPageTitle => 'Källa'; +} diff --git a/lib/l10ngen/app_localizations_ta.dart b/lib/l10ngen/app_localizations_ta.dart new file mode 100644 index 0000000..eb4e6fb --- /dev/null +++ b/lib/l10ngen/app_localizations_ta.dart @@ -0,0 +1,2425 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Tamil (`ta`). +class AppLocalizationsTa extends AppLocalizations { + AppLocalizationsTa([String locale = 'ta']) : super(locale); + + @override + String get appName => 'ஏவ்சு'; + + @override + String get welcomeMessage => 'ஏவ்சுக்கு வருக'; + + @override + String get welcomeOptional => 'விரும்பினால்'; + + @override + String get welcomeTermsToggle => 'விதிமுறைகள் மற்றும் நிபந்தனைகளை நான் ஒப்புக்கொள்கிறேன்'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString உருப்படிகள்', + one: '$countString உருப்படி', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString நெடுவரிசைகள்', + one: '$countString நெடுவரிசை', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString விநாடிகள்', + one: '$countString இரண்டாவது', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString நிமிடங்கள்', + one: '$countString நிமிடம்', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString நாட்கள்', + one: '$countString நாள்', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length மிமீ'; + } + + @override + String get applyButtonLabel => 'இடு'; + + @override + String get createButtonLabel => 'உருவாக்கு'; + + @override + String get deleteButtonLabel => 'நீக்கு'; + + @override + String get nextButtonLabel => 'அடுத்தது'; + + @override + String get showButtonLabel => 'காட்டு'; + + @override + String get hideButtonLabel => 'மறை'; + + @override + String get continueButtonLabel => 'தொடரவும்'; + + @override + String get saveCopyButtonLabel => 'நகலைச் சேமி'; + + @override + String get applyTooltip => 'இடு'; + + @override + String get cancelTooltip => 'விலக்கு'; + + @override + String get changeTooltip => 'மாற்று'; + + @override + String get clearTooltip => 'துடை'; + + @override + String get previousTooltip => 'முந்தைய'; + + @override + String get nextTooltip => 'அடுத்தது'; + + @override + String get showTooltip => 'காட்டு'; + + @override + String get hideTooltip => 'மறை'; + + @override + String get actionRemove => 'அகற்று'; + + @override + String get resetTooltip => 'மீட்டமை'; + + @override + String get saveTooltip => 'சேமி'; + + @override + String get stopTooltip => 'நிறுத்து'; + + @override + String get pickTooltip => 'தேர்ந்தெடு'; + + @override + String get doubleBackExitMessage => 'வெளியேற “பின்” என்பதைத் தட்டவும்.'; + + @override + String get doNotAskAgain => 'மீண்டும் கேட்க வேண்டாம்'; + + @override + String get sourceStateLoading => 'ஏற்றுகிறது'; + + @override + String get sourceStateCataloguing => 'பட்டியலிடுதல்'; + + @override + String get sourceStateLocatingCountries => 'நாடுகளைக் கண்டறிதல்'; + + @override + String get sourceStateLocatingPlaces => 'இடங்களைக் கண்டறிதல்'; + + @override + String get chipActionDelete => 'நீக்கு'; + + @override + String get chipActionRemove => 'அகற்று'; + + @override + String get chipActionShowCollection => 'சேகரிப்பில் காட்டு'; + + @override + String get chipActionGoToAlbumPage => 'ஆல்பங்களில் காட்டு'; + + @override + String get chipActionGoToCountryPage => 'நாடுகளில் காட்டு'; + + @override + String get chipActionGoToPlacePage => 'இடங்களில் காண்பி'; + + @override + String get chipActionGoToTagPage => 'குறிச்சொற்களில் காட்டு'; + + @override + String get chipActionGoToExplorerPage => 'உலாவில் காட்டு'; + + @override + String get chipActionDecompose => 'பிளவு'; + + @override + String get chipActionFilterOut => 'வடிகட்டி நீக்கு'; + + @override + String get chipActionFilterIn => 'வடிகட்டி வை'; + + @override + String get chipActionHide => 'மறை'; + + @override + String get chipActionLock => 'பூட்டு'; + + @override + String get chipActionPin => 'மேலே முள்'; + + @override + String get chipActionUnpin => 'மேலே இருந்து அவிழ்த்து விடு'; + + @override + String get chipActionGroup => 'குழுவை மாற்றவும்'; + + @override + String get chipActionRename => 'மறுபெயரிடு'; + + @override + String get chipActionSetCover => 'அட்டை அமை'; + + @override + String get chipActionShowCountryStates => 'நிலைகளைக் காட்டு'; + + @override + String get chipActionCreateGroup => 'குழுவை உருவாக்கவும்'; + + @override + String get chipActionCreateAlbum => 'ஆல்பத்தை உருவாக்கு'; + + @override + String get chipActionCreateVault => 'பெட்டகத்தை உருவாக்கு'; + + @override + String get chipActionConfigureVault => 'பெட்டகத்தை உள்ளமை'; + + @override + String get entryActionCopyToClipboard => 'இடைநிலைப் பலகைக்கு நகலெடு'; + + @override + String get entryActionDelete => 'நீக்கு'; + + @override + String get entryActionConvert => 'நிலைமாற்று'; + + @override + String get entryActionExport => 'ஏற்றுமதி'; + + @override + String get entryActionInfo => 'தகவல்'; + + @override + String get entryActionRename => 'மறுபெயரிடு'; + + @override + String get entryActionRestore => 'மீட்டெடு'; + + @override + String get entryActionRotateCCW => 'எதிரெதிர் திசையில் சுழற்று'; + + @override + String get entryActionRotateCW => 'கடிகார திசையில் சுழற்று'; + + @override + String get entryActionFlip => 'கிடைமட்டமாகப் புரட்டு'; + + @override + String get entryActionPrint => 'அச்சிடு'; + + @override + String get entryActionShare => 'பங்கு'; + + @override + String get entryActionShareImageOnly => 'படத்தை மட்டும் பகிர்'; + + @override + String get entryActionShareVideoOnly => 'காணொளியைப் பகிர்'; + + @override + String get entryActionViewSource => 'மூலத்தைக் காண்க'; + + @override + String get entryActionShowGeoTiffOnMap => 'வரைபட மேலடுக்கு எனக் காட்டு'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'நிலை படத்திற்கு மாற்று'; + + @override + String get entryActionViewMotionPhotoVideo => 'திறந்த காணொளி'; + + @override + String get entryActionEdit => 'தொகு'; + + @override + String get entryActionOpen => 'உடன் திற'; + + @override + String get entryActionSetAs => 'என அமை'; + + @override + String get entryActionCast => 'நடிகர்கள்'; + + @override + String get entryActionOpenMap => 'வரைபட பயன்பாட்டில் காண்பி'; + + @override + String get entryActionRotateScreen => 'திரை சுழற்று'; + + @override + String get entryActionAddFavourite => 'பிடித்தவைகளில் சேர்'; + + @override + String get entryActionRemoveFavourite => 'பிடித்தவைகளிலிருந்து அகற்று'; + + @override + String get videoActionCaptureFrame => 'பிடிப்பு சட்டகம்'; + + @override + String get videoActionMute => 'முடக்கு'; + + @override + String get videoActionUnmute => 'ஒலித்தடையை நீக்கு'; + + @override + String get videoActionPause => 'இடைநிறுத்தம்'; + + @override + String get videoActionPlay => 'இயக்கு'; + + @override + String get videoActionReplay10 => '10 வினாடிகள் பின்தங்கியபடி நாடிச்செல்'; + + @override + String get videoActionSkip10 => '10 வினாடிகள் முன்னோக்கி நாடிச்செல்'; + + @override + String get videoActionShowPreviousFrame => 'முந்தைய சட்டத்தைக் காட்டு'; + + @override + String get videoActionShowNextFrame => 'அடுத்த சட்டகத்தைக் காட்டு'; + + @override + String get videoActionSelectStreams => 'தடங்களைத் தேர்ந்தெடு'; + + @override + String get videoActionSetSpeed => 'பின்னணி விரைவு'; + + @override + String get videoActionABRepeat => 'அ-ஆ மீண்டும்'; + + @override + String get videoRepeatActionSetStart => 'தொடக்கத்தை அமை'; + + @override + String get videoRepeatActionSetEnd => 'முடிவை அமை'; + + @override + String get viewerActionSettings => 'அமைப்புகள்'; + + @override + String get viewerActionLock => 'பூட்டு பார்வையாளர்'; + + @override + String get viewerActionUnlock => 'பார்வையாளர்பூட்டைத் திற'; + + @override + String get slideshowActionResume => 'மீண்டும் தொடங்குங்கள்'; + + @override + String get slideshowActionShowInCollection => 'சேகரிப்பில் காட்டு'; + + @override + String get entryInfoActionEditDate => 'தேதி & நேரத்தைத் திருத்து'; + + @override + String get entryInfoActionEditLocation => 'இருப்பிடத்தைத் திருத்து'; + + @override + String get entryInfoActionEditTitleDescription => 'தலைப்பு & விளக்கத்தைத் திருத்து'; + + @override + String get entryInfoActionEditRating => 'மதிப்பீட்டைத் திருத்து'; + + @override + String get entryInfoActionEditTags => 'குறிச்சொற்களைத் திருத்து'; + + @override + String get entryInfoActionRemoveMetadata => 'மேனிலை தரவை அகற்று'; + + @override + String get entryInfoActionExportMetadata => 'ஏற்றுமதி மேனிலை தரவு'; + + @override + String get entryInfoActionRemoveLocation => 'இருப்பிடத்தை அகற்று'; + + @override + String get editorActionTransform => 'உருமாற்று'; + + @override + String get editorTransformCrop => 'வெட்டி எடு'; + + @override + String get editorTransformRotate => 'சுழற்று'; + + @override + String get cropAspectRatioFree => 'கட்டற்ற'; + + @override + String get cropAspectRatioOriginal => 'அசல்'; + + @override + String get cropAspectRatioSquare => 'நாற்கை'; + + @override + String get filterAspectRatioLandscapeLabel => 'நிலப்பரப்பு'; + + @override + String get filterAspectRatioPortraitLabel => 'உருவப்படம்'; + + @override + String get filterBinLabel => 'மறுசுழற்சி கூடை'; + + @override + String get filterFavouriteLabel => 'பிடித்த'; + + @override + String get filterNoDateLabel => 'மதிப்பிடப்படாதது'; + + @override + String get filterNoAddressLabel => 'முகவரி இல்லை'; + + @override + String get filterLocatedLabel => 'அமைந்துள்ளது'; + + @override + String get filterNoLocationLabel => 'திறக்கப்படாதது'; + + @override + String get filterNoRatingLabel => 'மதிப்பிடப்படாதது'; + + @override + String get filterTaggedLabel => 'குறிச்சொல்இடப்பட்டது'; + + @override + String get filterNoTagLabel => 'குறிச்சொல்இடப்படாதது'; + + @override + String get filterNoTitleLabel => 'தலைப்பில்லாத'; + + @override + String get filterOnThisDayLabel => 'இந்த நாளில்'; + + @override + String get filterRecentlyAddedLabel => 'அண்மைக் காலத்தில் சேர்க்கப்பட்டது'; + + @override + String get filterRatingRejectedLabel => 'நிராகரிக்கப்பட்டது'; + + @override + String get filterTypeAnimatedLabel => 'உயிருள்ளதுபோல'; + + @override + String get filterTypeMotionPhotoLabel => 'இயக்கப் புகைப்படம்'; + + @override + String get filterTypePanoramaLabel => 'பரந்ததோற்றம்'; + + @override + String get filterTypeRawLabel => 'பச்சையான'; + + @override + String get filterTypeSphericalVideoLabel => '360 ° காணொளி'; + + @override + String get filterTypeGeotiffLabel => 'புவிடிஃப்'; + + @override + String get filterMimeImageLabel => 'படம்'; + + @override + String get filterMimeVideoLabel => 'காணொளி'; + + @override + String get accessibilityAnimationsRemove => 'திரை விளைவுகளைத் தடு'; + + @override + String get accessibilityAnimationsKeep => 'திரை விளைவுகளை வைத்திரு'; + + @override + String get albumTierNew => 'புதிய'; + + @override + String get albumTierPinned => 'பின்செய்த்து'; + + @override + String get albumTierGroups => 'குழுக்கள்'; + + @override + String get albumTierSpecial => 'பொது'; + + @override + String get albumTierApps => 'பயன்பாடுகள்'; + + @override + String get albumTierVaults => 'நிலவறைகள்'; + + @override + String get albumTierDynamic => 'மாறும்'; + + @override + String get albumTierRegular => 'மற்றவைகள்'; + + @override + String get coordinateFormatDms => 'டிமிவி'; + + @override + String get coordinateFormatDdm => 'டிடிஎம்'; + + @override + String get coordinateFormatDecimal => 'தசம டிகிரி'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'வ'; + + @override + String get coordinateDmsSouth => 'தெ'; + + @override + String get coordinateDmsEast => 'கி'; + + @override + String get coordinateDmsWest => 'மே'; + + @override + String get displayRefreshRatePreferHighest => 'அதிக விகிதம்'; + + @override + String get displayRefreshRatePreferLowest => 'குறைந்த விகிதம்'; + + @override + String get keepScreenOnNever => 'ஒருபோதும்'; + + @override + String get keepScreenOnVideoPlayback => 'காணொளி இயக்கத்தின்போது'; + + @override + String get keepScreenOnViewerOnly => 'பார்வையாளர் பக்கம் மட்டுமே'; + + @override + String get keepScreenOnAlways => 'எப்போதும்'; + + @override + String get lengthUnitPixel => 'புள்ளி'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'கூகிள் வரைபடங்கள்'; + + @override + String get mapStyleGoogleHybrid => 'கூகிள் வரைபடங்கள் (கலப்பின)'; + + @override + String get mapStyleGoogleTerrain => 'கூகிள் வரைபடங்கள் (நிலப்பரப்பு)'; + + @override + String get mapStyleOsmLiberty => 'திதெவ விடுதலை'; + + @override + String get mapStyleOpenTopoMap => 'திறடோபோவரைபடம்'; + + @override + String get mapStyleOsmHot => 'மனிதாபிமான திதெவ'; + + @override + String get mapStyleStamenWatercolor => 'மகரந்தம் நீர்நிறம்'; + + @override + String get maxBrightnessNever => 'ஒருபோதும்'; + + @override + String get maxBrightnessAlways => 'எப்போதும்'; + + @override + String get nameConflictStrategyRename => 'மறுபெயரிடு'; + + @override + String get nameConflictStrategyReplace => 'மாற்று'; + + @override + String get nameConflictStrategySkip => 'தவிர்'; + + @override + String get overlayHistogramNone => 'எதுவுமில்லை'; + + @override + String get overlayHistogramRGB => 'சிபநீ'; + + @override + String get overlayHistogramLuminance => 'ஒளிர்மை'; + + @override + String get subtitlePositionTop => 'மேலே'; + + @override + String get subtitlePositionBottom => 'கீழே'; + + @override + String get themeBrightnessLight => 'ஒளி'; + + @override + String get themeBrightnessDark => 'இருண்ட'; + + @override + String get themeBrightnessBlack => 'கருப்பு'; + + @override + String get unitSystemMetric => 'மீட்டர் முறை'; + + @override + String get unitSystemImperial => 'ஏகாதிபத்திய'; + + @override + String get vaultLockTypePattern => 'வரைவடிவம்'; + + @override + String get vaultLockTypePin => 'தன்எண்'; + + @override + String get vaultLockTypePassword => 'கடவுச்சொல்'; + + @override + String get settingsVideoEnablePip => 'படத்துள்-படம்'; + + @override + String get videoControlsPlayOutside => 'மற்ற இயக்கியுடன் திற'; + + @override + String get videoLoopModeNever => 'ஒருபோதும்'; + + @override + String get videoLoopModeShortOnly => 'குறுகிய காணொளிகள் மட்டுமே'; + + @override + String get videoLoopModeAlways => 'எப்போதும்'; + + @override + String get videoPlaybackSkip => 'தவிர்'; + + @override + String get videoPlaybackMuted => 'ஒலிமுடக்கி இயக்கு'; + + @override + String get videoPlaybackWithSound => 'ஒலியுடன் இயக்கு'; + + @override + String get videoResumptionModeNever => 'ஒருபோதும்'; + + @override + String get videoResumptionModeAlways => 'எப்போதும்'; + + @override + String get viewerTransitionSlide => 'படவில்லை'; + + @override + String get viewerTransitionParallax => 'இடமாறு தோற்றம்'; + + @override + String get viewerTransitionFade => 'மங்கல்'; + + @override + String get viewerTransitionZoomIn => 'பெரிதாக்கு'; + + @override + String get viewerTransitionNone => 'எதுவுமில்லை'; + + @override + String get wallpaperTargetHome => 'முகப்புத் திரை'; + + @override + String get wallpaperTargetLock => 'பூட்டுத் திரை'; + + @override + String get wallpaperTargetHomeLock => 'முகப்பு மற்றும் பூட்டு திரைகள்'; + + @override + String get widgetDisplayedItemRandom => 'சீரற்ற'; + + @override + String get widgetDisplayedItemMostRecent => 'மிக அண்மைக் கால'; + + @override + String get widgetOpenPageHome => 'திறந்த வீடு'; + + @override + String get widgetOpenPageCollection => 'திறந்த சேகரிப்பு'; + + @override + String get widgetOpenPageViewer => 'திறந்த பார்வையாளர்'; + + @override + String get widgetTapUpdateWidget => 'நிரல் பலகையைப் புதுப்பி'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'உள் சேமிப்பு'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'நினைவு அட்டை'; + + @override + String get rootDirectoryDescription => 'வேர் அடைவு'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” அடைவு'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'இந்தப் பயன்பாட்டுக்கு அணுகலை வழங்க அடுத்த திரையில் உள்ள “$volume” இன் $directory ஐத் தேர்ந்தெடு.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'இந்தப் பயன்பாடு “$volume” இன் $directory இல் உள்ள கோப்புகளை மாற்ற அனுமதிக்கப்படவில்லை.\n\nஉருப்படிகளை மற்றொரு கோப்பகத்திற்கு நகர்த்துவதற்கு முன்பே நிறுவப்பட்ட கோப்பு மேலாளர் அல்லது கேலரி பயன்பாட்டைப் பயன்படுத்தவும்.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'இந்தச் செயல்பாட்டிற்கு “$volume” இல் இலவச இடத்தின் $neededSize தேவை, ஆனால் $freeSize மட்டுமே உள்ளது.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'கணினி கோப்பு பிக்கர் காணவில்லை அல்லது முடக்கப்பட்டுள்ளது. தயவுசெய்து அதை இயக்கி மீண்டும் முயற்சிக்கவும்.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'இந்தச் செயல்பாடு பின்வரும் வகைகளின் உருப்படிகளுக்கு ஆதரிக்கப்படவில்லை: $types.', + one: 'இந்தச் செயல்பாடு பின்வரும் வகையின் உருப்படிகளுக்கு ஆதரிக்கப்படவில்லை: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'இலக்கு கோப்புறையில் உள்ள சில கோப்புகளுக்கு ஒரே பெயர் உள்ளது.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'சில கோப்புகளுக்கு ஒரே பெயர் உள்ளது.'; + + @override + String get addShortcutDialogLabel => 'குறுக்குவழி சிட்டை'; + + @override + String get addShortcutButtonLabel => 'கூட்டு'; + + @override + String get noMatchingAppDialogMessage => 'இதைக் கையாளக்கூடிய பயன்பாடுகள் எதுவும் இல்லை.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'இந்த $countString உருப்படிகளை மறுசுழற்சி தொட்டியில் நகர்த்தவா?', + one: 'இந்த உருப்படியை மறுசுழற்சி தொட்டியில் நகர்த்தவா?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'இந்த $countString உருப்படிகளை நீக்கு?', + one: 'இந்த உருப்படியை நீக்கு?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'தொடர்வதற்கு முன் உருப்படி தேதிகளைச் சேமிக்கவா?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'தேதிகளைச் சேமி'; + + @override + String videoResumeDialogMessage(String time) { + return '$time இல் மீண்டும் இயக்குவதை விரும்புகிறீர்களா?'; + } + + @override + String get videoStartOverButtonLabel => 'மறுதொடக்கம்'; + + @override + String get videoResumeButtonLabel => 'மீண்டும் தொடங்குங்கள்'; + + @override + String get setCoverDialogLatest => 'அண்மைக் கால உருப்படி'; + + @override + String get setCoverDialogAuto => 'தானி'; + + @override + String get setCoverDialogCustom => 'தனிப்பயன்'; + + @override + String get hideFilterConfirmationDialogMessage => 'பொருந்தக்கூடிய புகைப்படங்கள் மற்றும் காணொளிகள் உங்கள் சேகரிப்பிலிருந்து மறைக்கப்படும். “தனியுரிமை” அமைப்புகளிலிருந்து அவற்றை மீண்டும் காட்டலாம்.\n\n அவற்றை மறைக்க விரும்புகிறீர்களா?'; + + @override + String get newAlbumDialogTitle => 'புதிய தொகுப்பு'; + + @override + String get newAlbumDialogNameLabel => 'தொகுப்பின் பெயர்'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'தொகுப்பு ஏற்கனவே உள்ளது'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'அடைவு ஏற்கனவே உள்ளது'; + + @override + String get newAlbumDialogStorageLabel => 'சேமிப்பு:'; + + @override + String get newDynamicAlbumDialogTitle => 'புதிய மாறும் தொகுப்பு'; + + @override + String get dynamicAlbumAlreadyExists => 'மாறும் தொகுப்பு ஏற்கனவே உள்ளது'; + + @override + String get newGroupDialogTitle => 'புதிய குழு'; + + @override + String get newGroupDialogNameLabel => 'குழுவின் பெயர்'; + + @override + String get groupAlreadyExists => 'குழு ஏற்கனவே உள்ளது'; + + @override + String get groupEmpty => 'குழுக்கள் இல்லை'; + + @override + String get ungrouped => 'குழுவாகாதது'; + + @override + String get groupPickerTitle => 'குழுவைத் தேர்ந்தெடுக்கவும்'; + + @override + String get groupPickerUseThisGroupButton => 'இந்தக் குழுவைப் பயன்படுத்தவும்'; + + @override + String get newVaultWarningDialogMessage => + 'பெட்டகங்களில் உள்ள உருப்படிகள் இந்தப் பயன்பாட்டிற்கு மட்டுமே கிடைக்கின்றன, மற்றவைகளுக்கு இல்லை.\n\n இந்தப் பயன்பாட்டை நிறுவல் நீக்கினால் அல்லது இந்தப் பயன்பாட்டு தரவை அழித்தால், இந்த உருப்படிகள் அனைத்தையும் இழப்பீர்கள்.'; + + @override + String get newVaultDialogTitle => 'புதிய பெட்டகம்'; + + @override + String get configureVaultDialogTitle => 'பெட்டகத்தை உள்ளமை'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'திரை அணைக்கப்படும்போது பூட்டு'; + + @override + String get vaultDialogLockTypeLabel => 'பூட்டு வகை'; + + @override + String get patternDialogEnter => 'வடிவத்தை உள்ளிடு'; + + @override + String get patternDialogConfirm => 'முறை உறுதிப்படுத்து'; + + @override + String get pinDialogEnter => 'தன்எண் உள்ளிடவும்'; + + @override + String get pinDialogConfirm => 'தன்எண் உறுதிப்படுத்து'; + + @override + String get passwordDialogEnter => 'கடவுச்சொல்லை உள்ளிடு'; + + @override + String get passwordDialogConfirm => 'கடவுச்சொல்லை உறுதிப்படுத்து'; + + @override + String get authenticateToConfigureVault => 'பெட்டகத்தை உள்ளமைக்க ஏற்பு'; + + @override + String get authenticateToUnlockVault => 'பெட்டகத்தைத் திறக்க ஏற்பு'; + + @override + String get vaultBinUsageDialogMessage => 'சில பெட்டகங்கள் மறுசுழற்சி தொட்டியைப் பயன்படுத்துகின்றன.'; + + @override + String get renameAlbumDialogLabel => 'புதிய பெயர்'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'அடைவு ஏற்கனவே உள்ளது'; + + @override + String get renameEntrySetPageTitle => 'மறுபெயரிடு'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'பெயரிடும் முறை'; + + @override + String get renameEntrySetPageInsertTooltip => 'புலம் செருகவும்'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'முன்னோட்டம்'; + + @override + String get renameProcessorCounter => 'கணக்கிடு'; + + @override + String get renameProcessorHash => 'கொத்து'; + + @override + String get renameProcessorName => 'பெயர்'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'இந்தத் தொகுப்பையும் அதில் உள்ள $countString உருப்படிகளையும் நீக்கு?', + one: 'இந்தத் தொகுப்பையும் அதில் உள்ள உருப்படியையும் நீக்கு?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'இந்தத் தொகுப்பையும் அவற்றில் உள்ள $countString உருப்படிகளையும் நீக்கு?', + one: 'இந்தத் தொகுப்பையும் அவற்றில் உள்ள உருப்படியையும் நீக்கு?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'வடிவம்:'; + + @override + String get exportEntryDialogWidth => 'அகலம்'; + + @override + String get exportEntryDialogHeight => 'உயரம்'; + + @override + String get exportEntryDialogQuality => 'தரம்'; + + @override + String get exportEntryDialogWriteMetadata => 'மேனிலை தரவை எழுதுங்கள்'; + + @override + String get renameEntryDialogLabel => 'புதிய பெயர்'; + + @override + String get editEntryDialogCopyFromItem => 'பிற உருப்படியிலிருந்து நகலெடு'; + + @override + String get editEntryDialogTargetFieldsHeader => 'மாற்றுவதற்கான புலங்கள்'; + + @override + String get editEntryDateDialogTitle => 'தேதி & நேரம்'; + + @override + String get editEntryDateDialogSetCustom => 'தனிப்பயன் தேதியை அமை'; + + @override + String get editEntryDateDialogCopyField => 'மற்ற தேதியிலிருந்து நகலெடு'; + + @override + String get editEntryDateDialogExtractFromTitle => 'தலைப்பிலிருந்து பிரித்தெடு'; + + @override + String get editEntryDateDialogShift => 'பெயர்வு'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'கோப்பு மாற்றியமைக்கப்பட்ட தேதி'; + + @override + String get durationDialogHours => 'மணிகள்'; + + @override + String get durationDialogMinutes => 'நிமையங்கள்'; + + @override + String get durationDialogSeconds => 'விநாடிகள்'; + + @override + String get editEntryLocationDialogTitle => 'இடம்'; + + @override + String get editEntryLocationDialogSetCustom => 'தனிப்பயன் இருப்பிடத்தை அமை'; + + @override + String get editEntryLocationDialogChooseOnMap => 'வரைபடத்தில் தேர்வு செய்'; + + @override + String get editEntryLocationDialogImportGpx => 'சிபிஎக்சு இறக்குமதி'; + + @override + String get editEntryLocationDialogLatitude => 'அகலாங்கு'; + + @override + String get editEntryLocationDialogLongitude => 'நெட்டாங்கு'; + + @override + String get editEntryLocationDialogTimeShift => 'நேர மாற்றம்'; + + @override + String get locationPickerUseThisLocationButton => 'இந்த இருப்பிடத்தைப் பயன்படுத்து'; + + @override + String get editEntryRatingDialogTitle => 'மதிப்பிடு'; + + @override + String get removeEntryMetadataDialogTitle => 'மேனிலை தரவு அகற்றுதல்'; + + @override + String get removeEntryMetadataDialogAll => 'அனைத்தும்'; + + @override + String get removeEntryMetadataDialogMore => 'மேலும்'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'இயக்கபுகைப்படத்திற்குள் காணொளியை இயக்க எக்ச்எம்பி தேவை.\n\n நீங்கள் அதை அகற்ற விரும்புகிறீர்களா?'; + + @override + String get videoSpeedDialogLabel => 'பின்னணி விரைவு'; + + @override + String get videoStreamSelectionDialogVideo => 'காணொளி'; + + @override + String get videoStreamSelectionDialogAudio => 'ஒலிதம்'; + + @override + String get videoStreamSelectionDialogText => 'வசன வரிகள்'; + + @override + String get videoStreamSelectionDialogOff => 'அணை'; + + @override + String get videoStreamSelectionDialogTrack => 'தடம்'; + + @override + String get videoStreamSelectionDialogNoSelection => 'வேறு தடங்கள் இல்லை.'; + + @override + String get genericSuccessFeedback => 'முடிந்தது!'; + + @override + String get genericFailureFeedback => 'தோல்வியுற்றது'; + + @override + String get genericDangerWarningDialogMessage => 'நீங்கள் உறுதியாக இருக்கிறீர்களா?'; + + @override + String get tooManyItemsErrorDialogMessage => 'குறைவான உருப்படிகளுடன் மீண்டும் முயற்சி.'; + + @override + String get menuActionConfigureView => 'பார்வை'; + + @override + String get menuActionSelect => 'தேர்ந்தெடு'; + + @override + String get menuActionSelectAll => 'அனைத்தையும் தெரிவுசெய்'; + + @override + String get menuActionSelectNone => 'எதுவுமில்லை என்பதைத் தேர்ந்தெடு'; + + @override + String get menuActionMap => 'வரைபடம்'; + + @override + String get menuActionSlideshow => 'வில்லைக்காட்சி'; + + @override + String get menuActionStats => 'புள்ளிவிவரங்கள்'; + + @override + String get viewDialogSortSectionTitle => 'வரிசைப்படுத்து'; + + @override + String get viewDialogGroupSectionTitle => 'பிரிவுகள்'; + + @override + String get viewDialogLayoutSectionTitle => 'இடுவெளி'; + + @override + String get viewDialogReverseSortOrder => 'தலைகீழ் வரிசை முறை'; + + @override + String get tileLayoutMosaic => 'மொசைக்'; + + @override + String get tileLayoutGrid => 'சல்லடை'; + + @override + String get tileLayoutList => 'பட்டியல்'; + + @override + String get castDialogTitle => 'தூக்கிஎறி சாதனங்கள்'; + + @override + String get coverDialogTabCover => 'அட்டை'; + + @override + String get coverDialogTabApp => 'பயன்பாடு'; + + @override + String get coverDialogTabColor => 'நிறம்'; + + @override + String get appPickDialogTitle => 'பயன்பாட்டை எடு'; + + @override + String get appPickDialogNone => 'எதுவுமில்லை'; + + @override + String get aboutPageTitle => 'பற்றி'; + + @override + String get aboutLinkLicense => 'உரிமம்'; + + @override + String get aboutLinkPolicy => 'தனியுரிமைக் கொள்கை'; + + @override + String get aboutBugSectionTitle => 'பிழை அறிக்கை'; + + @override + String get aboutBugSaveLogInstruction => 'பயன்பாட்டு பதிவுகளை ஒரு கோப்பில் சேமி'; + + @override + String get aboutBugCopyInfoInstruction => 'கணினி தகவல்களை நகலெடு'; + + @override + String get aboutBugCopyInfoButton => 'நகலெடு'; + + @override + String get aboutBugReportInstruction => 'பதிவுகள் மற்றும் கணினி தகவல்களுடன் அறிவிலிமையம் குறித்த அறிக்கை'; + + @override + String get aboutBugReportButton => 'அறிக்கை'; + + @override + String get aboutDataUsageSectionTitle => 'தரவுப் பயன்பாடு'; + + @override + String get aboutDataUsageData => 'தரவு'; + + @override + String get aboutDataUsageCache => 'தேக்ககம்'; + + @override + String get aboutDataUsageDatabase => 'தரவுத்தளம்'; + + @override + String get aboutDataUsageMisc => 'இதர'; + + @override + String get aboutDataUsageInternal => 'உள்'; + + @override + String get aboutDataUsageExternal => 'வெளிப்புறம்'; + + @override + String get aboutDataUsageClearCache => 'தற்காலிக சேமிப்பு துடை'; + + @override + String get aboutCreditsSectionTitle => 'நன்றி'; + + @override + String get aboutCreditsWorldAtlas1 => 'இந்தப் பயன்பாடு ஒரு டோபோச்சன் கோப்பைப் பயன்படுத்துகிறது'; + + @override + String get aboutCreditsWorldAtlas2 => 'ஐஎச்சி உரிமத்தின் கீழ்.'; + + @override + String get aboutTranslatorsSectionTitle => 'மொழிபெயர்ப்பாளர்கள்'; + + @override + String get aboutLicensesSectionTitle => 'திறந்த மூல உரிமங்கள்'; + + @override + String get aboutLicensesBanner => 'இந்தப் பயன்பாடு பின்வரும் திறந்த மூல தொகுப்புகள் மற்றும் நூலகங்களைப் பயன்படுத்துகிறது.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'ஆண்ட்ராய்டு நூலகங்கள்'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'ப்லுட்டர் செருகுநிரல்கள்'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'ப்லுட்டர் தொகுப்புகள்'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'டார்ட் தொகுப்புகள்'; + + @override + String get aboutLicensesShowAllButtonLabel => 'அனைத்து உரிமங்களையும் காட்டு'; + + @override + String get policyPageTitle => 'தனியுரிமைக் கொள்கை'; + + @override + String get collectionPageTitle => 'சேகரிப்பு'; + + @override + String get collectionPickPageTitle => 'எடு'; + + @override + String get collectionSelectPageTitle => 'உருப்படிகளைத் தேர்ந்தெடு'; + + @override + String get collectionActionShowTitleSearch => 'தலைப்பு வடிகட்டியைக் காட்டு'; + + @override + String get collectionActionHideTitleSearch => 'தலைப்பு வடிகட்டியை மறை'; + + @override + String get collectionActionAddDynamicAlbum => 'மாறும் தொகுப்பைச் சேர்'; + + @override + String get collectionActionAddShortcut => 'குறுக்குவழியைச் சேர்'; + + @override + String get collectionActionSetHome => 'வீட்டாக அமை'; + + @override + String get collectionActionEmptyBin => 'வெற்று தொட்டி'; + + @override + String get collectionActionCopy => 'தொகுப்பிற்கு நகலெடு'; + + @override + String get collectionActionMove => 'தொகுப்பிற்கு நகர்த்து'; + + @override + String get collectionActionRescan => 'மறுவருடல்'; + + @override + String get collectionActionEdit => 'தொகு'; + + @override + String get collectionSearchTitlesHintText => 'தலைப்புகளைத் தேடு'; + + @override + String get collectionGroupAlbum => 'தொகுப்பால்'; + + @override + String get collectionGroupMonth => 'திங்களால்'; + + @override + String get collectionGroupDay => 'நாளால்'; + + @override + String get sectionNone => 'பிரிவுகள் இல்லை'; + + @override + String get sectionUnknown => 'தெரியாத'; + + @override + String get dateToday => 'இன்று'; + + @override + String get dateYesterday => 'நேற்று'; + + @override + String get dateThisMonth => 'இந்தத் திங்கள்'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'நீக்குவதில் தோல்வி $countString உருப்படிகள்', + one: 'நீக்குவதில் தோல்வி 1 உருப்படி', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'நகலெடுப்பதில் தோல்வி $countString உருப்படிகள்', + one: 'நகலெடுப்பதில் தோல்வி 1 உருப்படி', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'நகர்த்துவதில் தோல்வி $countString உருப்படிகள்', + one: 'நகர்த்துவதில் தோல்வி 1 உருப்படி', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'மறுபெயரிடுவதில் தோல்வி $countString உருப்படிகள்', + one: 'மறுபெயரிடுவதில் தோல்வி 1 உருப்படி', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'திருத்துவதில் தோல்வியுற்றது $countString உருப்படிகள்', + one: 'திருத்துவதில் தோல்வியுற்றது 1 உருப்படி', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ஏற்றுமதி செய்வதில் தோல்வி $countString பக்கங்கள்', + one: 'ஏற்றுமதி செய்வதில் தோல்வி 1 பக்கம்', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'நகலெடுக்கப்பட்டது $countString உருப்படிகள்', + one: 'நகலெடுக்கப்பட்டது 1 உருப்படி', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'நகர்த்தப்பட்ட $countString உருப்படிகள்', + one: 'நகர்த்தப்பட்ட 1 உருப்படி', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'மறுபெயரிடப்பட்டது $countString உருப்படிகள்', + one: 'மறுபெயரிடப்பட்டது 1 உருப்படி', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'திருத்தப்பட்ட $countString உருப்படிகள்', + one: 'திருத்தப்பட்ட 1 உருப்படி', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'பிடித்தவை இல்லை'; + + @override + String get collectionEmptyVideos => 'காணொளிகள் இல்லை'; + + @override + String get collectionEmptyImages => 'படங்கள் இல்லை'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'அணுகல் வழங்கு'; + + @override + String get collectionSelectSectionTooltip => 'பிரிவைத் தேர்ந்தெடு'; + + @override + String get collectionDeselectSectionTooltip => 'தேர்வு நீக்கு'; + + @override + String get drawerAboutButton => 'பற்றி'; + + @override + String get drawerSettingsButton => 'அமைப்புகள்'; + + @override + String get drawerCollectionAll => 'அனைத்து சேகரிப்பு'; + + @override + String get drawerCollectionFavourites => 'பிடித்தவை'; + + @override + String get drawerCollectionImages => 'படங்கள்'; + + @override + String get drawerCollectionVideos => 'காணொளிகள்'; + + @override + String get drawerCollectionAnimated => 'அசைவூட்டபட்டது'; + + @override + String get drawerCollectionMotionPhotos => 'இயக்கப் புகைப்படங்கள்'; + + @override + String get drawerCollectionPanoramas => 'பனோரமாக்கள்'; + + @override + String get drawerCollectionRaws => 'மூல புகைப்படங்கள்'; + + @override + String get drawerCollectionSphericalVideos => '360° காணொளிகள்'; + + @override + String get drawerAlbumPage => 'தொகுப்புகள்'; + + @override + String get drawerCountryPage => 'நாடுகள்'; + + @override + String get drawerPlacePage => 'இடங்கள்'; + + @override + String get drawerTagPage => 'குறிச்சொற்கள்'; + + @override + String get sortByDate => 'தேதிமூலம்'; + + @override + String get sortByName => 'பெயரால்'; + + @override + String get sortByItemCount => 'உருப்படி எண்ணிக்கைமூலம்'; + + @override + String get sortBySize => 'அளவுமூலம்'; + + @override + String get sortByAlbumFileName => 'தொகுப்பு & உருப்படி தலைப்புமூலம்'; + + @override + String get sortByRating => 'மதிப்பீடுமூலம்'; + + @override + String get sortByDuration => 'காலப்படி'; + + @override + String get sortByPath => 'பாதைமூலம்'; + + @override + String get sortOrderNewestFirst => 'முதலில் புதியது'; + + @override + String get sortOrderOldestFirst => 'முதலில் பழமையானது'; + + @override + String get sortOrderAtoZ => 'அ இருந்து ஔ'; + + @override + String get sortOrderZtoA => 'ஔ இருந்து அ'; + + @override + String get sortOrderHighestFirst => 'முதலில் அதிகபட்சம்'; + + @override + String get sortOrderLowestFirst => 'முதலில் மிகக் குறைவு'; + + @override + String get sortOrderLargestFirst => 'பெரியது முதலில்'; + + @override + String get sortOrderSmallestFirst => 'சிறியது முதலில்'; + + @override + String get sortOrderShortestFirst => 'சின்னது முதலில்'; + + @override + String get sortOrderLongestFirst => 'முதலில் நீளமானது'; + + @override + String get albumGroupTier => 'அடுக்குமூலம்'; + + @override + String get albumGroupType => 'வகைமூலம்'; + + @override + String get albumGroupVolume => 'சேமிப்பக அளவுமூலம்'; + + @override + String get albumMimeTypeMixed => 'கலப்பு'; + + @override + String get albumPickPageTitleCopy => 'ஆல்பத்திற்கு நகலெடு'; + + @override + String get albumPickPageTitleExport => 'தொகுப்பிற்கு ஏற்றுமதி'; + + @override + String get albumPickPageTitleMove => 'தொகுப்பிற்கு நகர்த்து'; + + @override + String get albumPickPageTitlePick => 'தொகுப்பைத் தேர்ந்தெடு'; + + @override + String get albumCamera => 'ஒளிப்படக்கருவி'; + + @override + String get albumDownload => 'பதிவிறக்கம்'; + + @override + String get albumScreenshots => 'திரைக்காட்சிகள்'; + + @override + String get albumScreenRecordings => 'திரை பதிவுகள்'; + + @override + String get albumVideoCaptures => 'காணொளி பதிவுகள்'; + + @override + String get albumPageTitle => 'தொகுப்புகள்'; + + @override + String get albumEmpty => 'தொகுப்புகள் இல்லை'; + + @override + String get createAlbumButtonLabel => 'உருவாக்கு'; + + @override + String get newFilterBanner => 'புதிய'; + + @override + String get countryPageTitle => 'நாடுகள்'; + + @override + String get countryEmpty => 'எந்த நாடுகளும் இல்லை'; + + @override + String get statePageTitle => 'மாநிலங்கள்'; + + @override + String get stateEmpty => 'மாநிலங்கள் இல்லை'; + + @override + String get placePageTitle => 'இடங்கள்'; + + @override + String get placeEmpty => 'இடங்கள் இல்லை'; + + @override + String get tagPageTitle => 'குறிச்சொற்கள்'; + + @override + String get tagEmpty => 'குறிச்சொற்கள் இல்லை'; + + @override + String get tagPickPageTitle => 'குறிச்சொல்லைத் தேர்ந்தெடு'; + + @override + String get binPageTitle => 'மறுசுழற்சி தொட்டி'; + + @override + String get explorerPageTitle => 'உலாவி'; + + @override + String get explorerActionSelectStorageVolume => 'சேமிப்பிடத்தைத் தேர்ந்தெடு'; + + @override + String get selectStorageVolumeDialogTitle => 'சேமிப்பிடத்தைத் தேர்ந்தெடு'; + + @override + String get searchCollectionFieldHint => 'சேகரிப்பு தேடல்'; + + @override + String get searchRecentSectionTitle => 'அண்மைக் கால'; + + @override + String get searchDateSectionTitle => 'திகதி'; + + @override + String get searchFormatSectionTitle => 'வடிவங்கள்'; + + @override + String get searchAlbumsSectionTitle => 'தொகுப்புகள்'; + + @override + String get searchCountriesSectionTitle => 'நாடுகள்'; + + @override + String get searchStatesSectionTitle => 'மாநிலங்கள்'; + + @override + String get searchPlacesSectionTitle => 'இடங்கள்'; + + @override + String get searchTagsSectionTitle => 'குறிச்சொற்கள்'; + + @override + String get searchRatingSectionTitle => 'மதிப்பீடுகள்'; + + @override + String get searchMetadataSectionTitle => 'மேனிலை தரவு'; + + @override + String get settingsPageTitle => 'அமைப்புகள்'; + + @override + String get settingsSystemDefault => 'கணினி இயல்புநிலை'; + + @override + String get settingsDefault => 'இயல்புநிலை'; + + @override + String get settingsDisabled => 'முடக்கப்பட்டது'; + + @override + String get settingsEnabled => 'இயக்கப்பட்டது'; + + @override + String get settingsForced => 'கட்டாயப்படுத்தப்பட்டது'; + + @override + String get settingsAskEverytime => 'ஒவ்வொருமுறையும் கேளு'; + + @override + String get settingsModificationWarningDialogMessage => 'மற்ற அமைப்புகள் மாற்றப்படும்.'; + + @override + String get settingsSearchFieldLabel => 'அமைப்புகளைத் தேடு'; + + @override + String get settingsSearchEmpty => 'பொருந்தக்கூடிய அமைப்பு இல்லை'; + + @override + String get settingsActionExport => 'ஏற்றுமதி'; + + @override + String get settingsActionExportDialogTitle => 'ஏற்றுமதி'; + + @override + String get settingsActionImport => 'இறக்குமதி'; + + @override + String get settingsActionImportDialogTitle => 'இறக்குமதி'; + + @override + String get appExportCovers => 'அட்டைகள்'; + + @override + String get appExportDynamicAlbums => 'மாறும் தொகுப்புகள்'; + + @override + String get appExportFavourites => 'பிடித்தவைகள்'; + + @override + String get appExportSettings => 'அமைப்புகள்'; + + @override + String get settingsNavigationSectionTitle => 'வழிசெலுத்தல்'; + + @override + String get settingsHomeTile => 'வீடு'; + + @override + String get settingsHomeDialogTitle => 'வீடு'; + + @override + String get setHomeCustom => 'தனிப்பயன்'; + + @override + String get settingsKeepScreenOnTile => 'திரையைத் தொடர்ந்து வைத்திரு'; + + @override + String get settingsKeepScreenOnDialogTitle => 'திரையைத் தொடர்ந்து வைத்திரு'; + + @override + String get settingsDoubleBackExit => 'வெளியேற “பின்” என்பதை இரண்டு முறை தட்டு'; + + @override + String get settingsConfirmationTile => 'உறுதிப்படுத்தல் உரையாடல்கள்'; + + @override + String get settingsConfirmationDialogTitle => 'உறுதிப்படுத்தல் உரையாடல்கள்'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'பொருட்களை எப்போதும் நீக்குவதற்கு முன் கேளு'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'மறுசுழற்சி தொட்டியில் பொருட்களை நகர்த்துவதற்கு முன் கேளு'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'மதிப்பிடப்படாத பொருட்களை நகர்த்துவதற்கு முன் கேளு'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'மறுசுழற்சி தொட்டியில் உருப்படிகளை நகர்த்திய பின் செய்தியைக் காட்டு'; + + @override + String get settingsConfirmationVaultDataLoss => 'பெட்டக தரவு இழப்பு எச்சரிக்கையைக் காட்டு'; + + @override + String get settingsNavigationDrawerTile => 'வழிசெலுத்தல் பட்டியல்'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'வழிசெலுத்தல் பட்டியல்'; + + @override + String get settingsNavigationDrawerBanner => 'பட்டியல் உருப்படிகளை நகர்த்தவும் மறுவரிசைப்படுத்தவும் தொட்டுப் பிடிக்கவும்.'; + + @override + String get settingsNavigationDrawerTabTypes => 'வகைகள்'; + + @override + String get settingsNavigationDrawerTabAlbums => 'தொகுப்புகள்'; + + @override + String get settingsNavigationDrawerTabPages => 'பக்கங்கள்'; + + @override + String get settingsNavigationDrawerAddAlbum => 'தொகுப்பைச் சேர்'; + + @override + String get settingsNavigationBottomActionsTile => 'கீழே வழிசெலுத்தல்'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'கீழ் வழிசெலுத்தல்'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'பொத்தான்களை நகர்த்துவதற்கு தொட்டுப் பிடிக்கவும் மற்றும் கீழ் வழிசெலுத்தல் பட்டியில் காட்டப்படும் செயல்களைத் தேர்ந்தெடுக்கவும்.'; + + @override + String get settingsThumbnailSectionTitle => 'சிறு உருவங்கள்'; + + @override + String get settingsThumbnailOverlayTile => 'மேலடுக்கு'; + + @override + String get settingsThumbnailOverlayPageTitle => 'மேலடுக்கு'; + + @override + String get settingsThumbnailShowHdrIcon => 'எச்டிஆர் படவுருவைக் காட்டு'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'பிடித்த படவுருவைக் காட்டு'; + + @override + String get settingsThumbnailShowTagIcon => 'குறிச்சொல் படவுருவைக் காட்டு'; + + @override + String get settingsThumbnailShowLocationIcon => 'இருப்பிட படவுருவைக் காட்டு'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'இயக்கப் படப் படவுருவைக் காட்டு'; + + @override + String get settingsThumbnailShowRating => 'மதிப்பீட்டைக் காட்டு'; + + @override + String get settingsThumbnailShowRawIcon => 'மூல படவுருவைக் காட்டு'; + + @override + String get settingsThumbnailShowVideoDuration => 'காணொளி காலம் காட்டு'; + + @override + String get settingsCollectionQuickActionsTile => 'விரைவான செயல்கள்'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'விரைவான செயல்கள்'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'உலாவுதல்'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'தேர்ந்தெடுப்பது'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'பொத்தான்களை நகர்த்தவும், உருப்படிகளை உலாவும்போது எந்த நடவடிக்கைகள் காண்பிக்கப்படுகின்றன என்பதைத் தேர்ந்தெடு.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'பொத்தான்களை நகர்த்தவும், உருப்படிகளைத் தேர்ந்தெடுக்கும்போது எந்த நடவடிக்கைகள் காண்பிக்கப்படுகின்றன என்பதைத் தேர்ந்தெடு.'; + + @override + String get settingsCollectionBurstPatternsTile => 'வடிவங்கள் வெடிப்பு'; + + @override + String get settingsCollectionBurstPatternsNone => 'எதுவுமில்லை'; + + @override + String get settingsViewerSectionTitle => 'பார்வையாளர்'; + + @override + String get settingsViewerGestureSideTapNext => 'முந்தைய/அடுத்த உருப்படியைக் காட்ட திரை விளிம்புகளில் தட்டு'; + + @override + String get settingsViewerUseCutout => 'வெட்டு வெளியைப் பயன்படுத்து'; + + @override + String get settingsViewerMaximumBrightness => 'அதிகபட்ச ஒளி'; + + @override + String get settingsMotionPhotoAutoPlay => 'தானியங்கு இயக்கப் புகைப்படங்கள்'; + + @override + String get settingsImageBackground => 'படப் பின்னணி'; + + @override + String get settingsViewerQuickActionsTile => 'விரைவான செயல்கள்'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'விரைவான செயல்கள்'; + + @override + String get settingsViewerQuickActionEditorBanner => 'பொத்தான்களை நகர்த்தவும், பார்வையாளரில் எந்த நடவடிக்கைகள் காண்பிக்கப்படுகின்றன என்பதைத் தேர்ந்தெடு.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'காட்டப்பட்ட பொத்தான்கள்'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'கிடைக்கும் பொத்தான்கள்'; + + @override + String get settingsViewerQuickActionEmpty => 'பொத்தான்கள் இல்லை'; + + @override + String get settingsViewerOverlayTile => 'மேலடுக்கு'; + + @override + String get settingsViewerOverlayPageTitle => 'மேலடுக்கு'; + + @override + String get settingsViewerShowOverlayOnOpening => 'திறக்கையில் காட்டு'; + + @override + String get settingsViewerShowHistogram => 'அலைவெண் செவ்வகப் படம் காட்டு'; + + @override + String get settingsViewerShowMinimap => 'சிறுவரைப்படம் காட்டு'; + + @override + String get settingsViewerShowZoomLevel => 'சூம் அளவைக் காட்டு'; + + @override + String get settingsViewerShowInformation => 'தகவலைக் காட்டு'; + + @override + String get settingsViewerShowInformationSubtitle => 'தலைப்பு, தேதி, இடம், போன்றவற்றைக் காட்டு.'; + + @override + String get settingsViewerShowRatingTags => 'மதிப்பீடு மற்றும் குறிச்சொற்களைக் காட்டு'; + + @override + String get settingsViewerShowShootingDetails => 'படப்பிடிப்பு விவரங்களைக் காட்டு'; + + @override + String get settingsViewerShowDescription => 'விளக்கத்தைக் காட்டு'; + + @override + String get settingsViewerShowOverlayThumbnails => 'சிறு உருவங்களைக் காட்டு'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'மங்கலான விளைவு'; + + @override + String get settingsViewerSlideshowTile => 'படவில்லைக் காட்சி'; + + @override + String get settingsViewerSlideshowPageTitle => 'படவில்லைக் காட்சி'; + + @override + String get settingsSlideshowRepeat => 'மறுசெய்கை'; + + @override + String get settingsSlideshowShuffle => 'கலக்கு'; + + @override + String get settingsSlideshowFillScreen => 'திரை நிரப்பு'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'அசைவூட்டம் மலர்ச்சி விளைவு'; + + @override + String get settingsSlideshowTransitionTile => 'மாற்றம்'; + + @override + String get settingsSlideshowIntervalTile => 'இடைவேளை'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'காணொளி மீட்பொலி'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'காணொளி மீட்பொலி'; + + @override + String get settingsVideoPageTitle => 'காணொளி அமைப்புகள்'; + + @override + String get settingsVideoSectionTitle => 'காணொளி'; + + @override + String get settingsVideoShowVideos => 'காணொளிகளைக் காட்டு'; + + @override + String get settingsVideoPlaybackTile => 'மீட்பொலி'; + + @override + String get settingsVideoPlaybackPageTitle => 'மீட்பொலி'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'வன்பொருள் முடுக்கம்'; + + @override + String get settingsVideoAutoPlay => 'தானியங்கு'; + + @override + String get settingsVideoLoopModeTile => 'சுழல் பயன்முறை'; + + @override + String get settingsVideoLoopModeDialogTitle => 'சுழல் பயன்முறை'; + + @override + String get settingsVideoResumptionModeTile => 'காணொளி மீட்பொலி'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'மீட்பொலியை மீண்டும் தொடங்கு'; + + @override + String get settingsVideoBackgroundMode => 'பின்னணி முறை'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'பின்னணி முறை'; + + @override + String get settingsVideoControlsTile => 'கட்டுப்பாடுகள்'; + + @override + String get settingsVideoControlsPageTitle => 'கட்டுப்பாடுகள்'; + + @override + String get settingsVideoButtonsTile => 'பொத்தான்கள்'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'விளையாட/இடைநிறுத்த இரட்டை தட்டவும்'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'பின்தங்கிய/முன்னோக்கி தேட திரை விளிம்புகளில் இரட்டை தட்டவும்'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'பொலிவு/அளவை சரிசெய்ய மேலே அல்லது கீழே தேய்'; + + @override + String get settingsSubtitleThemeTile => 'வசன வரிகள்'; + + @override + String get settingsSubtitleThemePageTitle => 'வசன வரிகள்'; + + @override + String get settingsSubtitleThemeSample => 'இது ஒரு மாதிரி.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'உரை சீரமைப்பு'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'உரை சீரமைப்பு'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'உரை நிலை'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'உரை நிலை'; + + @override + String get settingsSubtitleThemeTextSize => 'உரை அளவு'; + + @override + String get settingsSubtitleThemeShowOutline => 'சுருக்கம் மற்றும் நிழலைக் காட்டுங்கள்'; + + @override + String get settingsSubtitleThemeTextColor => 'உரை நிறம்'; + + @override + String get settingsSubtitleThemeTextOpacity => 'உரை ஒளிபுகாநிலை'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'பின்னணி நிறம்'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'பின்னணி ஒளிபுகாநிலை'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'இடது'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'நடுவண்'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'வலது'; + + @override + String get settingsPrivacySectionTitle => 'தனியுரிமை'; + + @override + String get settingsAllowInstalledAppAccess => 'பயன்பாட்டு சரக்குகளுக்கான அணுகலை அனுமதி'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'தொகுப்புக் காட்சியை மேம்படுத்தப் பயன்படுகிறது'; + + @override + String get settingsAllowErrorReporting => 'பெயரிலி பிழை அறிக்கையை அனுமதி'; + + @override + String get settingsSaveSearchHistory => 'தேடல் வரலாற்றைச் சேமி'; + + @override + String get settingsEnableBin => 'மறுசுழற்சி தொட்டியைப் பயன்படுத்து'; + + @override + String get settingsEnableBinSubtitle => 'நீக்கப்பட்ட பொருட்களை 30 நாட்களுக்கு வைத்திரு'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'மறுசுழற்சி தொட்டியில் உள்ள உருப்படிகள் என்றென்றும் நீக்கப்படும்.'; + + @override + String get settingsAllowMediaManagement => 'ஊடக நிர்வாகத்தை அனுமதி'; + + @override + String get settingsHiddenItemsTile => 'மறைக்கப்பட்ட உருப்படிகள்'; + + @override + String get settingsHiddenItemsPageTitle => 'மறைக்கப்பட்ட உருப்படிகள்'; + + @override + String get settingsHiddenFiltersBanner => 'மறைக்கப்பட்ட வடிப்பான்களுடன் பொருந்தக்கூடிய புகைப்படங்கள் மற்றும் காணொளிகள் உங்கள் சேகரிப்பில் தோன்றாது.'; + + @override + String get settingsHiddenFiltersEmpty => 'மறைக்கப்பட்ட வடிப்பான்கள் இல்லை'; + + @override + String get settingsStorageAccessTile => 'சேமிப்பக அணுகல்'; + + @override + String get settingsStorageAccessPageTitle => 'சேமிப்பக அணுகல்'; + + @override + String get settingsStorageAccessBanner => 'சில கோப்பகங்களுக்கு அவற்றில் உள்ள கோப்புகளை மாற்ற வெளிப்படையான அணுகல் மானியம் தேவைப்படுகிறது. நீங்கள் முன்பு அணுகலை வழங்கிய கோப்பகங்களை இங்கே மதிப்பாய்வு செய்யலாம்.'; + + @override + String get settingsStorageAccessEmpty => 'அணுகல் மானியங்கள் இல்லை'; + + @override + String get settingsStorageAccessRevokeTooltip => 'திரும்பப்பெறு'; + + @override + String get settingsAccessibilitySectionTitle => 'அணுகுதிறன்'; + + @override + String get settingsRemoveAnimationsTile => 'அசைவூட்டங்களை அகற்று'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'அசைவூட்டங்களை அகற்று'; + + @override + String get settingsTimeToTakeActionTile => 'நடவடிக்கை எடுக்க வேண்டிய நேரம்'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'பல-தொடு சைகை மாற்றுகளைக் காட்டு'; + + @override + String get settingsDisplaySectionTitle => 'காட்சி'; + + @override + String get settingsThemeBrightnessTile => 'கருப்பொருள்'; + + @override + String get settingsThemeBrightnessDialogTitle => 'கருப்பொருள்'; + + @override + String get settingsThemeColorHighlights => 'வண்ண சிறப்பம்சங்கள்'; + + @override + String get settingsThemeEnableDynamicColor => 'மாறும் நிறம்'; + + @override + String get settingsDisplayRefreshRateModeTile => 'புதுப்பிப்பு வீதத்தைக் காண்பி'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'புதுப்பிப்பு வீதம்'; + + @override + String get settingsDisplayUseTvInterface => 'ஆண்ட்ராய்டு தொலைகாட்சி இடைமுகம்'; + + @override + String get settingsLanguageSectionTitle => 'மொழி & வடிவங்கள்'; + + @override + String get settingsLanguageTile => 'மொழி'; + + @override + String get settingsLanguagePageTitle => 'மொழி'; + + @override + String get settingsCoordinateFormatTile => 'ஆய வடிவம்'; + + @override + String get settingsCoordinateFormatDialogTitle => 'ஆய வடிவம்'; + + @override + String get settingsUnitSystemTile => 'அலகுகள்'; + + @override + String get settingsUnitSystemDialogTitle => 'அலகுகள்'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'அரபு எண்களைக் கட்டாயப்படுத்துங்கள்'; + + @override + String get settingsScreenSaverPageTitle => 'திரை சேமிப்பான்'; + + @override + String get settingsWidgetPageTitle => 'புகைப்பட சட்டகம்'; + + @override + String get settingsWidgetShowOutline => 'சுருக்கம்'; + + @override + String get settingsWidgetOpenPage => 'நிரல் பலகையில் தட்டும்போது'; + + @override + String get settingsWidgetDisplayedItem => 'காட்டப்பட்ட உருப்படி'; + + @override + String get settingsCollectionTile => 'சேகரிப்பு'; + + @override + String get statsPageTitle => 'புள்ளிவிவரங்கள்'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString இருப்பிடத்துடன் உருப்படிகள்', + one: '1 இடம் கொண்ட உருப்படி', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'மேல் நாடுகள்'; + + @override + String get statsTopStatesSectionTitle => 'மேல் மாநிலங்கள்'; + + @override + String get statsTopPlacesSectionTitle => 'மேல் இடங்கள்'; + + @override + String get statsTopTagsSectionTitle => 'மேல் குறிச்சொற்கள்'; + + @override + String get statsTopAlbumsSectionTitle => 'மேல் தொகுப்புகள்'; + + @override + String get viewerOpenPanoramaButtonLabel => 'பனோரமா திற'; + + @override + String get viewerSetWallpaperButtonLabel => 'சுவர்த்தாளை அமை'; + + @override + String get viewerErrorUnknown => 'அச்சச்சோ!'; + + @override + String get viewerErrorDoesNotExist => 'கோப்பு இனி இல்லை.'; + + @override + String get viewerInfoPageTitle => 'தகவல்'; + + @override + String get viewerInfoBackToViewerTooltip => 'பார்வையாளருக்குத் திரும்பு'; + + @override + String get viewerInfoUnknown => 'தெரியாத'; + + @override + String get viewerInfoLabelDescription => 'விவரம்'; + + @override + String get viewerInfoLabelTitle => 'தலைப்பு'; + + @override + String get viewerInfoLabelDate => 'திகதி'; + + @override + String get viewerInfoLabelResolution => 'பகுத்தல்'; + + @override + String get viewerInfoLabelSize => 'அளவு'; + + @override + String get viewerInfoLabelUri => 'இணையமுகவரி'; + + @override + String get viewerInfoLabelPath => 'பாதை'; + + @override + String get viewerInfoLabelDuration => 'காலம்'; + + @override + String get viewerInfoLabelOwner => 'உரிமையாளர்'; + + @override + String get viewerInfoLabelCoordinates => 'அச்சுத்தூரங்கள்'; + + @override + String get viewerInfoLabelAddress => 'முகவரி'; + + @override + String get mapStyleDialogTitle => 'வரைபட நடை'; + + @override + String get mapStyleDialogAddStyle => 'பாணியைச் சேர்க்கவும்'; + + @override + String get mapStyleTooltip => 'வரைபட பாணியைத் தேர்ந்தெடு'; + + @override + String get mapStyleEditorDialogName => 'பெயர்'; + + @override + String get mapStyleEditorDialogUrl => 'முகவரி'; + + @override + String get mapStyleEditorDialogSubdomains => 'துணை டொமைன்கள்'; + + @override + String get mapStyleEditorDialogUserAgent => 'பயனர் முகவர்'; + + @override + String get mapZoomInTooltip => 'பெரிதாக்கு'; + + @override + String get mapZoomOutTooltip => 'சிறிதாக்கு'; + + @override + String get mapPointNorthUpTooltip => 'வடக்கு மேலே காட்டு'; + + @override + String get mapAttributionOsmData => 'வரைபட தரவு © [OpenStreetMap](https://www.openstreetmap.org/copyright) பங்களிப்பாளர்கள்'; + + @override + String get mapAttributionOsmLiberty => '[OpenMapTiles](https://www.openmaptiles.org/) மூலம் ஓடுகள், [CC BY](http://creativecommons.org/licenses/by/4.0) • [OSM Americana](https://tile.ourmap.us) மூலம் புரவலசேவை'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | [OpenTopoMap](https://opentopomap.org/) மூலம் ஓடுகள், [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => '[HOT](https://www.hotosm.org/) மூலம் ஓடுகள் • [OSM France](https://openstreetmap.fr/) மூலம் புரவலசேவை'; + + @override + String get mapAttributionStamen => '[Stamen Design](https://stamen.com) மூலம் ஓடுகள், [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'வரைபட பக்கத்தில் காண்க'; + + @override + String get mapEmptyRegion => 'இந்தப் வட்டாரத்தில் படங்கள் இல்லை'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'உட்பொதிக்கப்பட்ட தரவைப் பிரித்தெடுப்பதில் தோல்வி'; + + @override + String get viewerInfoOpenLinkText => 'திற'; + + @override + String get viewerInfoViewXmlLinkText => 'நீகுமொ காண்க'; + + @override + String get viewerInfoSearchFieldLabel => 'மேனிலை தரவைத் தேடு'; + + @override + String get viewerInfoSearchEmpty => 'பொருந்தக்கூடிய திறவுகோல்கள் இல்லை'; + + @override + String get viewerInfoSearchSuggestionDate => 'தேதி & நேரம்'; + + @override + String get viewerInfoSearchSuggestionDescription => 'விவரம்'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'பரிமாணங்கள்'; + + @override + String get viewerInfoSearchSuggestionResolution => 'பகுத்தல்'; + + @override + String get viewerInfoSearchSuggestionRights => 'உரிமைகள்'; + + @override + String get wallpaperUseScrollEffect => 'முகப்புத் திரையில் உருள் விளைவைப் பயன்படுத்து'; + + @override + String get tagEditorPageTitle => 'குறிச்சொற்களைத் திருத்து'; + + @override + String get tagEditorPageNewTagFieldLabel => 'புதிய குறிச்சொல்'; + + @override + String get tagEditorPageAddTagTooltip => 'குறிச்சொல்லைச் சேர்'; + + @override + String get tagEditorSectionRecent => 'அண்மைக் கால'; + + @override + String get tagEditorSectionPlaceholders => 'இடம் வைத்திருப்பவர்கள்'; + + @override + String get tagEditorDiscardDialogMessage => 'மாற்றங்களை நிராகரிக்க விரும்புகிறீர்களா?'; + + @override + String get tagPlaceholderCountry => 'நாடு'; + + @override + String get tagPlaceholderState => 'மாநிலம்'; + + @override + String get tagPlaceholderPlace => 'இடம்'; + + @override + String get panoramaEnableSensorControl => 'உணரி கட்டுப்பாட்டை இயக்கு'; + + @override + String get panoramaDisableSensorControl => 'உணரி கட்டுப்பாட்டை முடக்கு'; + + @override + String get sourceViewerPageTitle => 'மூலம்'; +} diff --git a/lib/l10ngen/app_localizations_th.dart b/lib/l10ngen/app_localizations_th.dart new file mode 100644 index 0000000..0711292 --- /dev/null +++ b/lib/l10ngen/app_localizations_th.dart @@ -0,0 +1,2412 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Thai (`th`). +class AppLocalizationsTh extends AppLocalizations { + AppLocalizationsTh([String locale = 'th']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'ยินดีต้อนรับสู่ Aves'; + + @override + String get welcomeOptional => 'ทางเลือกอื่น'; + + @override + String get welcomeTermsToggle => 'ฉันยินยอมในเงื่อนไขและข้อตกลง'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items', + one: '$countString item', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString columns', + one: '$countString column', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString seconds', + one: '$countString second', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutes', + one: '$countString minute', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString days', + one: '$countString day', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APPLY'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'ลบ'; + + @override + String get nextButtonLabel => 'ถัดไป'; + + @override + String get showButtonLabel => 'แสดง'; + + @override + String get hideButtonLabel => 'ซ่อน'; + + @override + String get continueButtonLabel => 'ต่อไป'; + + @override + String get saveCopyButtonLabel => 'SAVE COPY'; + + @override + String get applyTooltip => 'Apply'; + + @override + String get cancelTooltip => 'ยกเลิก'; + + @override + String get changeTooltip => 'เปลี่ยน'; + + @override + String get clearTooltip => 'ล้าง'; + + @override + String get previousTooltip => 'ก่อนหน้า'; + + @override + String get nextTooltip => 'ถัดไป'; + + @override + String get showTooltip => 'แสดง'; + + @override + String get hideTooltip => 'ซ่อน'; + + @override + String get actionRemove => 'ลบ'; + + @override + String get resetTooltip => 'ตั้งใหม่'; + + @override + String get saveTooltip => 'บันทึก'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'เลือก'; + + @override + String get doubleBackExitMessage => 'กดถอยหลังอีกครั้งเพื่อออก'; + + @override + String get doNotAskAgain => 'ไม่ต้องถามอีก'; + + @override + String get sourceStateLoading => 'กำลังโหลด'; + + @override + String get sourceStateCataloguing => 'กำลังจัดทำรายการ'; + + @override + String get sourceStateLocatingCountries => 'กำลังค้นหาประเทศ'; + + @override + String get sourceStateLocatingPlaces => 'กำลังค้นหาสถานที่'; + + @override + String get chipActionDelete => 'ลบ'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'แสดงคอลเลกชัน'; + + @override + String get chipActionGoToAlbumPage => 'แสดงในหน้าอัลบั้ม'; + + @override + String get chipActionGoToCountryPage => 'แสดงในหน้าประเทศ'; + + @override + String get chipActionGoToPlacePage => 'Show in Places'; + + @override + String get chipActionGoToTagPage => 'แสดงในหน้าแท็ก'; + + @override + String get chipActionGoToExplorerPage => 'Show in Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'กรองออก'; + + @override + String get chipActionFilterIn => 'กรองเข้า'; + + @override + String get chipActionHide => 'ซ่อน'; + + @override + String get chipActionLock => 'Lock'; + + @override + String get chipActionPin => 'ปักหมุดไว้บนสุด'; + + @override + String get chipActionUnpin => 'ถอนหมุดออก'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'เปลี่ยนชื่อใหม่'; + + @override + String get chipActionSetCover => 'ตั้งเป็นภาพหน้าปก'; + + @override + String get chipActionShowCountryStates => 'Show states'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'สร้างอัลบั้ม'; + + @override + String get chipActionCreateVault => 'Create vault'; + + @override + String get chipActionConfigureVault => 'Configure vault'; + + @override + String get entryActionCopyToClipboard => 'คัดลอกไว้ในคลิปบอร์ด'; + + @override + String get entryActionDelete => 'ลบ'; + + @override + String get entryActionConvert => 'แปลงไฟล์'; + + @override + String get entryActionExport => 'เอกซ์ปอตส์'; + + @override + String get entryActionInfo => 'ข้อมูล'; + + @override + String get entryActionRename => 'เปลี่ยนชื่อใหม่'; + + @override + String get entryActionRestore => 'กู้คืน'; + + @override + String get entryActionRotateCCW => 'หมุนทวนเข็มนาฬิกา'; + + @override + String get entryActionRotateCW => 'หมุนตามเข็มนาฬิกา'; + + @override + String get entryActionFlip => 'พลิกแนวนอน'; + + @override + String get entryActionPrint => 'พิมพ์'; + + @override + String get entryActionShare => 'แชร์'; + + @override + String get entryActionShareImageOnly => 'แชร์รูปภาพเท่านั้น'; + + @override + String get entryActionShareVideoOnly => 'แชร์วิดีโอเท่านั้น'; + + @override + String get entryActionViewSource => 'ดูแหล่งข้อมูล'; + + @override + String get entryActionShowGeoTiffOnMap => 'แสดงแผนที่ซ้อน'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'แปลงเป็นภาพนิ่ง'; + + @override + String get entryActionViewMotionPhotoVideo => 'เปิดวิดีโอ'; + + @override + String get entryActionEdit => 'แก้ไข'; + + @override + String get entryActionOpen => 'เปิดด้วย'; + + @override + String get entryActionSetAs => 'ตั้งเป็น'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'เปิดในแอพฯแผนที่'; + + @override + String get entryActionRotateScreen => 'หมุนจอ'; + + @override + String get entryActionAddFavourite => 'ใส่ในรายการโปรด'; + + @override + String get entryActionRemoveFavourite => 'ลบออกจากรายการโปรด'; + + @override + String get videoActionCaptureFrame => 'จับภาพเฟรม'; + + @override + String get videoActionMute => 'ปิดเสียง'; + + @override + String get videoActionUnmute => 'เปิดเสียง'; + + @override + String get videoActionPause => 'หยุดชั่วคราว'; + + @override + String get videoActionPlay => 'เล่น'; + + @override + String get videoActionReplay10 => 'ย้อนกลับ 10 วินาที'; + + @override + String get videoActionSkip10 => 'เดินหน้า 10 วินาที'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'เลือกภาษา'; + + @override + String get videoActionSetSpeed => 'ความเร็วในการเล่น'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'ตั้งค่า'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'เล่นต่อ'; + + @override + String get slideshowActionShowInCollection => 'แสดงคอลเลกชัน'; + + @override + String get entryInfoActionEditDate => 'แก้ไขวันที่และเวลา'; + + @override + String get entryInfoActionEditLocation => 'แก้ไขสถานที่'; + + @override + String get entryInfoActionEditTitleDescription => 'แก้ไขชื่อและคำบรรยาย'; + + @override + String get entryInfoActionEditRating => 'แก้ไขระดับเรตติ้ง'; + + @override + String get entryInfoActionEditTags => 'แก้ไขแท็ก'; + + @override + String get entryInfoActionRemoveMetadata => 'ลบ metadata'; + + @override + String get entryInfoActionExportMetadata => 'เอกซ์ปอตส์ metadata'; + + @override + String get entryInfoActionRemoveLocation => 'ลบสถานที่'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Crop'; + + @override + String get editorTransformRotate => 'Rotate'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'ภาพแนวนอน'; + + @override + String get filterAspectRatioPortraitLabel => 'ภาพแนวตั้ง'; + + @override + String get filterBinLabel => 'ถังขยะ'; + + @override + String get filterFavouriteLabel => 'รายการโปรด'; + + @override + String get filterNoDateLabel => 'ไม่ระบุวันที่'; + + @override + String get filterNoAddressLabel => 'ไม่มีที่อยู่'; + + @override + String get filterLocatedLabel => 'ระบุสถานที่'; + + @override + String get filterNoLocationLabel => 'ไม่ระบุสถานที่'; + + @override + String get filterNoRatingLabel => 'ไม่ระบุระดับ'; + + @override + String get filterTaggedLabel => 'ระบุแท็ก'; + + @override + String get filterNoTagLabel => 'ไม่ระบุแท็ก'; + + @override + String get filterNoTitleLabel => 'ไม่ระบุชื่อ'; + + @override + String get filterOnThisDayLabel => 'ในวันนี้'; + + @override + String get filterRecentlyAddedLabel => 'รายการที่เพิ่มเมื่อเร็วๆนี้'; + + @override + String get filterRatingRejectedLabel => 'ปฏิเสธ'; + + @override + String get filterTypeAnimatedLabel => 'การเคลื่อนไหว'; + + @override + String get filterTypeMotionPhotoLabel => 'ภาพเคลื่อนไหว'; + + @override + String get filterTypePanoramaLabel => 'ภาพปริทัศน์ / แพโนรามา'; + + @override + String get filterTypeRawLabel => 'ไฟล์ดิบ'; + + @override + String get filterTypeSphericalVideoLabel => 'วิดีโอ 360°'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'รูปภาพ'; + + @override + String get filterMimeVideoLabel => 'วิดีโอ'; + + @override + String get accessibilityAnimationsRemove => 'ปิดการเคลื่อนไหว'; + + @override + String get accessibilityAnimationsKeep => 'เปิดการเคลื่อนไหว'; + + @override + String get albumTierNew => 'ใหม่'; + + @override + String get albumTierPinned => 'ปักหมุด'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'ทั่วไป'; + + @override + String get albumTierApps => 'แอพฯ'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'อื่นๆ'; + + @override + String get coordinateFormatDms => 'องศา, นาที, วินาที'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'องศาทศนิยม'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'ทิศเหนือ'; + + @override + String get coordinateDmsSouth => 'ทิศใต้'; + + @override + String get coordinateDmsEast => 'ทิศตะวันออก'; + + @override + String get coordinateDmsWest => 'ทิศตะวันตก'; + + @override + String get displayRefreshRatePreferHighest => 'อัตราสูงสุด'; + + @override + String get displayRefreshRatePreferLowest => 'อัตราต่ำสุด'; + + @override + String get keepScreenOnNever => 'ปิด'; + + @override + String get keepScreenOnVideoPlayback => 'ระหว่างการเล่นวิดีโอ'; + + @override + String get keepScreenOnViewerOnly => 'หน้า Viewer เท่านั้น'; + + @override + String get keepScreenOnAlways => 'เปิดตลอด'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Never'; + + @override + String get maxBrightnessAlways => 'Always'; + + @override + String get nameConflictStrategyRename => 'เปลี่ยนชื่อใหม่'; + + @override + String get nameConflictStrategyReplace => 'แทนที่'; + + @override + String get nameConflictStrategySkip => 'ข้าม'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'ข้างบน'; + + @override + String get subtitlePositionBottom => 'ข้างล่าง'; + + @override + String get themeBrightnessLight => 'สว่าง'; + + @override + String get themeBrightnessDark => 'มืด'; + + @override + String get themeBrightnessBlack => 'ดำ'; + + @override + String get unitSystemMetric => 'เมตริก'; + + @override + String get unitSystemImperial => 'อิมพีเรียล'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Password'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'เปิดด้วยตัวเล่นอื่น'; + + @override + String get videoLoopModeNever => 'ปิด'; + + @override + String get videoLoopModeShortOnly => 'เฉพาะคลิปสั้น'; + + @override + String get videoLoopModeAlways => 'เปิดตลอด'; + + @override + String get videoPlaybackSkip => 'ข้าม'; + + @override + String get videoPlaybackMuted => 'เล่นปิดเสียง'; + + @override + String get videoPlaybackWithSound => 'เล่นเปิดเสียง'; + + @override + String get videoResumptionModeNever => 'Never'; + + @override + String get videoResumptionModeAlways => 'Always'; + + @override + String get viewerTransitionSlide => 'เลื่อน'; + + @override + String get viewerTransitionParallax => 'แพรัลแลกซ์'; + + @override + String get viewerTransitionFade => 'เลือนหาย'; + + @override + String get viewerTransitionZoomIn => 'ซูมเข้า'; + + @override + String get viewerTransitionNone => 'ไม่มี'; + + @override + String get wallpaperTargetHome => 'โฮมสกรีน'; + + @override + String get wallpaperTargetLock => 'ล็อกสกรีน'; + + @override + String get wallpaperTargetHomeLock => 'ทั้งสองอย่าง'; + + @override + String get widgetDisplayedItemRandom => 'สุ่ม'; + + @override + String get widgetDisplayedItemMostRecent => 'ล่าสุด'; + + @override + String get widgetOpenPageHome => 'เปิดหน้าหลัก'; + + @override + String get widgetOpenPageCollection => 'เปิดคอลเลกชัน'; + + @override + String get widgetOpenPageViewer => 'เปิดหน้า Viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'หน่วยความจำภายใน'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD การ์ด'; + + @override + String get rootDirectoryDescription => 'สารบบราก'; + + @override + String otherDirectoryDescription(String name) { + return '\"$name\" ไดเรกทอรี'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'โปรดเลือก $directory ของ \"$volume\" ในหน้าถัดไปเพื่อให้แอพฯทำการเข้าถึง'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'แอพฯนี้ไม่ได้รับสิทธิ์ในการแก้ไขข้อมูลใน $directory ของ \"$volume\".\n\nกรุณาเลือกใช้ แอพฯจัดการไฟล์หรือแกลเลอรีอื่นๆ เพื่อย้ายข้อมูลไปไดเรกทอรีอื่น'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'การดำเนินการนี้ต้องการพื้นที่ว่าง $neededSize ของ “$volume” เพื่อให้เสร็จ แต่ตอนนี้มีพื้นที่เหลือแค่ $freeSize'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'ตัวเลือกไฟล์ระบบหายไป หรือปิดใช้งาน โปรดเปิดใช้งานและลองอีกครั้ง'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'การดำเนินการนี้ไม่รองรับรายการประเภทต่อไปนี้: $types.', + one: 'การดำเนินการนี้ไม่รองรับรายการประเภทต่อไปนี้: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'มีไฟล์ที่ชื่อซ้ำในโฟลเดอร์ปลายทาง'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'มีบางไฟล์ที่มีชื่อเหมือนกัน'; + + @override + String get addShortcutDialogLabel => 'ป้ายทางลัด'; + + @override + String get addShortcutButtonLabel => 'เพิ่ม'; + + @override + String get noMatchingAppDialogMessage => 'ไม่มีแอพฯที่จะจัดการสิ่งนี้ได้'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ย้าย $count รายการนี้ไปยังถังขยะ?', + one: 'ย้ายรายการนี้ไปยังถังขยะ?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ลบ $count รายการนี้?', + one: 'ลบรายการนี้?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'บันทึกวันที่ของไอเทมก่อนดำเนินการต่อไหม?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'บันทึกวันที่'; + + @override + String videoResumeDialogMessage(String time) { + return 'คุณต้องการที่จะเล่นต่อจาก $time ไหม?'; + } + + @override + String get videoStartOverButtonLabel => 'เริ่มใหม่'; + + @override + String get videoResumeButtonLabel => 'เล่นต่อ'; + + @override + String get setCoverDialogLatest => 'รายการล่าสุด'; + + @override + String get setCoverDialogAuto => 'อัตโนมัติ'; + + @override + String get setCoverDialogCustom => 'กำหนดเอง'; + + @override + String get hideFilterConfirmationDialogMessage => 'รูปภาพและวิดีโอที่ซ้ำกัน จะถูกซ่อนจากคอลเลกชันของคุณ คุณสามารถตั้งค่าให้แสดงได้ใน \"การตั้งค่าความเป็นส่วนตัว\"\n\nคุณแน่ใจหรือไม่ว่าต้องการซ่อน?'; + + @override + String get newAlbumDialogTitle => 'อัลบั้มใหม่'; + + @override + String get newAlbumDialogNameLabel => 'ชื่ออัลบั้ม'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'มีไดเรกทอรีนี้อยู่แล้ว'; + + @override + String get newAlbumDialogStorageLabel => 'พื้นที่จัดเก็บ:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'ตั้งชื่อใหม่'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'มีไดเรกทอรีนี้อยู่แล้ว'; + + @override + String get renameEntrySetPageTitle => 'เปลี่ยนชื่อใหม่'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'รูปแบบการตั้งชื่อ'; + + @override + String get renameEntrySetPageInsertTooltip => 'แทรกฟิลด์'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'ดูตัวอย่าง'; + + @override + String get renameProcessorCounter => 'ตัวนับ'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'ชื่อ'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ลบอัลบั้มนี้และ $count รายการในอัลบั้ม?', + one: 'ลบอัลบั้มนี้และรายการในอัลบั้มทั้งหมด?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ลบอัลบั้มเหล่านี้และ $count รายการในอัลบั้ม?', + one: 'ลบอัลบั้มเหล่านี้และรายการในอัลบั้มทั้งหมด?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'รูปแบบ:'; + + @override + String get exportEntryDialogWidth => 'ความกว้าง'; + + @override + String get exportEntryDialogHeight => 'ความสูง'; + + @override + String get exportEntryDialogQuality => 'Quality'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'ตั้งชื่อใหม่'; + + @override + String get editEntryDialogCopyFromItem => 'คัดลอกจากรายการอื่น'; + + @override + String get editEntryDialogTargetFieldsHeader => 'ฟิลด์ที่จะแก้ไข'; + + @override + String get editEntryDateDialogTitle => 'วันที่ & เวลา'; + + @override + String get editEntryDateDialogSetCustom => 'กำหนดวันที่เอง'; + + @override + String get editEntryDateDialogCopyField => 'คัดลอกจากวันอื่นๆ'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'วันที่แก้ไขไฟล์'; + + @override + String get durationDialogHours => 'ชั่วโมง'; + + @override + String get durationDialogMinutes => 'นาที'; + + @override + String get durationDialogSeconds => 'วินาที'; + + @override + String get editEntryLocationDialogTitle => 'สถานที่'; + + @override + String get editEntryLocationDialogSetCustom => 'กำหนดสถานที่เอง'; + + @override + String get editEntryLocationDialogChooseOnMap => 'เลือกบนแผนที่'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'ละติจูด'; + + @override + String get editEntryLocationDialogLongitude => 'ลองจิจูด'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'ใช้ตําแหน่งนี้'; + + @override + String get editEntryRatingDialogTitle => 'คะแนน'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'เพิ่มเติม'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'จำเป็นต้องใช้ XMP ในการเล่นวิดีโอในภาพเคลื่อนไหว\n\nคุณแน่ใจว่าต้องการลบออก?'; + + @override + String get videoSpeedDialogLabel => 'ความเร็วในการเล่น'; + + @override + String get videoStreamSelectionDialogVideo => 'วิดีโอ'; + + @override + String get videoStreamSelectionDialogAudio => 'เสียง'; + + @override + String get videoStreamSelectionDialogText => 'คำบรรยาย'; + + @override + String get videoStreamSelectionDialogOff => 'ปิด'; + + @override + String get videoStreamSelectionDialogTrack => 'แทร็ก'; + + @override + String get videoStreamSelectionDialogNoSelection => 'ไม่มีแทร็กอื่น'; + + @override + String get genericSuccessFeedback => 'เสร็จแล้ว!'; + + @override + String get genericFailureFeedback => 'ล้มเหลว'; + + @override + String get genericDangerWarningDialogMessage => 'คุณแน่ใจไหม?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'ดู'; + + @override + String get menuActionSelect => 'เลือก'; + + @override + String get menuActionSelectAll => 'เลือกทั้งหมด'; + + @override + String get menuActionSelectNone => 'ไม่เลือกทั้งหมด'; + + @override + String get menuActionMap => 'แผนที่'; + + @override + String get menuActionSlideshow => 'สไลด์โชว์'; + + @override + String get menuActionStats => 'สถิติ'; + + @override + String get viewDialogSortSectionTitle => 'เรียงลำดับ'; + + @override + String get viewDialogGroupSectionTitle => 'กลุ่ม'; + + @override + String get viewDialogLayoutSectionTitle => 'เค้าโครง'; + + @override + String get viewDialogReverseSortOrder => 'เรียงลำดับย้อนกลับ'; + + @override + String get tileLayoutMosaic => 'โมเสก'; + + @override + String get tileLayoutGrid => 'ตาราง'; + + @override + String get tileLayoutList => 'รายการ'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'หน้าปก'; + + @override + String get coverDialogTabApp => 'แอพฯ'; + + @override + String get coverDialogTabColor => 'สี'; + + @override + String get appPickDialogTitle => 'เลือกแอพฯ'; + + @override + String get appPickDialogNone => 'ไม่มี'; + + @override + String get aboutPageTitle => 'เกี่ยวกับ'; + + @override + String get aboutLinkLicense => 'ใบอนุญาต'; + + @override + String get aboutLinkPolicy => 'นโยบายความเป็นส่วนตัว'; + + @override + String get aboutBugSectionTitle => 'รายงานข้อผิดพลาด'; + + @override + String get aboutBugSaveLogInstruction => 'บันทึกล็อกของแอพฯเป็นไฟล์'; + + @override + String get aboutBugCopyInfoInstruction => 'คัดลอกข้อมูลระบบ'; + + @override + String get aboutBugCopyInfoButton => 'คัดลอก'; + + @override + String get aboutBugReportInstruction => 'รายงาน GitHub พร้อมบันทึกและข้อมูลระบบ'; + + @override + String get aboutBugReportButton => 'รายงาน'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'เครดิต'; + + @override + String get aboutCreditsWorldAtlas1 => 'แอพฯนี้ใช้ไฟล์ TopoJSON จาก'; + + @override + String get aboutCreditsWorldAtlas2 => 'ภายใต้ใบอนุญาต ISC'; + + @override + String get aboutTranslatorsSectionTitle => 'ผู้แปล'; + + @override + String get aboutLicensesSectionTitle => 'ใบอนุญาตโอเพนซอร์ส'; + + @override + String get aboutLicensesBanner => 'แอพฯนี้ใช้แพ็คเกจและไลบรารีโอเพ่นซอร์ส ดังนี้'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'ไลบรารีแอนดรอยด์'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'ปลั๊กอิน Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'แพ็คเกจ Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'แพ็คเกจ Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'แสดงใบอนุญาตทั้งหมด'; + + @override + String get policyPageTitle => 'นโยบายความเป็นส่วนตัว'; + + @override + String get collectionPageTitle => 'คอลเลกชัน'; + + @override + String get collectionPickPageTitle => 'เลือก'; + + @override + String get collectionSelectPageTitle => 'เลือกรายการ'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'Edit'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Unknown'; + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'About'; + + @override + String get drawerSettingsButton => 'Settings'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Countries'; + + @override + String get drawerPlacePage => 'Places'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'By date'; + + @override + String get sortByName => 'By name'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'By size'; + + @override + String get sortByAlbumFileName => 'By album & item title'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A to Z'; + + @override + String get sortOrderZtoA => 'Z to A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumMimeTypeMixed => 'Mixed'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'Camera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'CREATE'; + + @override + String get newFilterBanner => 'new'; + + @override + String get countryPageTitle => 'Countries'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'States'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Places'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Date'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Countries'; + + @override + String get searchStatesSectionTitle => 'States'; + + @override + String get searchPlacesSectionTitle => 'Places'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Ratings'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Settings'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'Disabled'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'Settings'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Home'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_tr.dart b/lib/l10ngen/app_localizations_tr.dart new file mode 100644 index 0000000..8949893 --- /dev/null +++ b/lib/l10ngen/app_localizations_tr.dart @@ -0,0 +1,2416 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Turkish (`tr`). +class AppLocalizationsTr extends AppLocalizations { + AppLocalizationsTr([String locale = 'tr']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Aves\'e Hoş Geldiniz'; + + @override + String get welcomeOptional => 'İsteğe bağlı'; + + @override + String get welcomeTermsToggle => 'Hüküm ve koşulları kabul ediyorum'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString öge', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count sütun', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString saniye', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString dakika', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString gün', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'UYGULA'; + + @override + String get createButtonLabel => 'YARAT'; + + @override + String get deleteButtonLabel => 'SİL'; + + @override + String get nextButtonLabel => 'SONRAKİ'; + + @override + String get showButtonLabel => 'GÖSTER'; + + @override + String get hideButtonLabel => 'GİZLE'; + + @override + String get continueButtonLabel => 'DEVAM ET'; + + @override + String get saveCopyButtonLabel => 'KOPYAYI KAYDET'; + + @override + String get applyTooltip => 'Uygula'; + + @override + String get cancelTooltip => 'İptal'; + + @override + String get changeTooltip => 'Değiştir'; + + @override + String get clearTooltip => 'Temizle'; + + @override + String get previousTooltip => 'Önceki'; + + @override + String get nextTooltip => 'Sonraki'; + + @override + String get showTooltip => 'Göster'; + + @override + String get hideTooltip => 'Gizle'; + + @override + String get actionRemove => 'Kaldır'; + + @override + String get resetTooltip => 'Sıfırla'; + + @override + String get saveTooltip => 'Kaydet'; + + @override + String get stopTooltip => 'Bitir'; + + @override + String get pickTooltip => 'Seç'; + + @override + String get doubleBackExitMessage => 'Çıkmak için tekrar “geri”, düğmesine dokunun.'; + + @override + String get doNotAskAgain => 'Bir daha sorma'; + + @override + String get sourceStateLoading => 'Yükleniyor'; + + @override + String get sourceStateCataloguing => 'Kataloglanıyor'; + + @override + String get sourceStateLocatingCountries => 'Ülkeler konumlandırılıyor'; + + @override + String get sourceStateLocatingPlaces => 'Konum belirleniyor'; + + @override + String get chipActionDelete => 'Sil'; + + @override + String get chipActionRemove => 'Kaldır'; + + @override + String get chipActionShowCollection => 'Koleksiyonda göster'; + + @override + String get chipActionGoToAlbumPage => 'Albümlerde göster'; + + @override + String get chipActionGoToCountryPage => 'Ülkelerde göster'; + + @override + String get chipActionGoToPlacePage => 'Yerler\'de Göster'; + + @override + String get chipActionGoToTagPage => 'Etiketlerde göster'; + + @override + String get chipActionGoToExplorerPage => 'Gezginde göster'; + + @override + String get chipActionDecompose => 'Böl'; + + @override + String get chipActionFilterOut => 'Dışarıda bırak'; + + @override + String get chipActionFilterIn => 'İçeriye al'; + + @override + String get chipActionHide => 'Gizle'; + + @override + String get chipActionLock => 'Kilitle'; + + @override + String get chipActionPin => 'Başa sabitle'; + + @override + String get chipActionUnpin => 'Sabitlemeyi kaldır'; + + @override + String get chipActionGroup => 'Gruplandırmayı değiştir'; + + @override + String get chipActionRename => 'Yeniden adlandır'; + + @override + String get chipActionSetCover => 'Kapağı ayarla'; + + @override + String get chipActionShowCountryStates => 'Eyaletleri göster'; + + @override + String get chipActionCreateGroup => 'Grup oluştur'; + + @override + String get chipActionCreateAlbum => 'Albüm oluştur'; + + @override + String get chipActionCreateVault => 'Kilitli albüm oluştur'; + + @override + String get chipActionConfigureVault => 'Kilitli albüm ayarları'; + + @override + String get entryActionCopyToClipboard => 'Panoya kopyala'; + + @override + String get entryActionDelete => 'Sil'; + + @override + String get entryActionConvert => 'Dönüştür'; + + @override + String get entryActionExport => 'Dışa aktar'; + + @override + String get entryActionInfo => 'Bilgi'; + + @override + String get entryActionRename => 'Yeniden adlandır'; + + @override + String get entryActionRestore => 'Geri getir'; + + @override + String get entryActionRotateCCW => 'Saat yönünün tersine döndür'; + + @override + String get entryActionRotateCW => 'Saat yönünde döndür'; + + @override + String get entryActionFlip => 'Yatay olarak çevir'; + + @override + String get entryActionPrint => 'Yazdır'; + + @override + String get entryActionShare => 'Paylaş'; + + @override + String get entryActionShareImageOnly => 'Yalnızca resim paylaş'; + + @override + String get entryActionShareVideoOnly => 'Yalnızca video paylaş'; + + @override + String get entryActionViewSource => 'Kaynağı görüntüle'; + + @override + String get entryActionShowGeoTiffOnMap => 'Harita katmanı olarak göster'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Hareketsiz görüntüye dönüştür'; + + @override + String get entryActionViewMotionPhotoVideo => 'Videoyu aç'; + + @override + String get entryActionEdit => 'Düzenle'; + + @override + String get entryActionOpen => 'Şununla aç'; + + @override + String get entryActionSetAs => 'Olarak ayarla'; + + @override + String get entryActionCast => 'Yansıt'; + + @override + String get entryActionOpenMap => 'Harita uygulamasında göster'; + + @override + String get entryActionRotateScreen => 'Ekranı döndür'; + + @override + String get entryActionAddFavourite => 'Favorilere ekle'; + + @override + String get entryActionRemoveFavourite => 'Favorilerden kaldır'; + + @override + String get videoActionCaptureFrame => 'Kareyi yakala'; + + @override + String get videoActionMute => 'Sessize al'; + + @override + String get videoActionUnmute => 'Sesi aç'; + + @override + String get videoActionPause => 'Duraklat'; + + @override + String get videoActionPlay => 'Oynat'; + + @override + String get videoActionReplay10 => '10 saniye geri git'; + + @override + String get videoActionSkip10 => '10 saniye ileri git'; + + @override + String get videoActionShowPreviousFrame => 'Önceki kareyi göster'; + + @override + String get videoActionShowNextFrame => 'Sonraki kareyi göster'; + + @override + String get videoActionSelectStreams => 'Ses parçası seç'; + + @override + String get videoActionSetSpeed => 'Oynatma hızı'; + + @override + String get videoActionABRepeat => 'A-B döngü'; + + @override + String get videoRepeatActionSetStart => 'Başlangıç noktası seç'; + + @override + String get videoRepeatActionSetEnd => 'Bitiş noktası seç'; + + @override + String get viewerActionSettings => 'Ayarlar'; + + @override + String get viewerActionLock => 'Kontrolleri kilitle'; + + @override + String get viewerActionUnlock => 'Kontrollerin kilidini aç'; + + @override + String get slideshowActionResume => 'Sürdür'; + + @override + String get slideshowActionShowInCollection => 'Koleksiyonda göster'; + + @override + String get entryInfoActionEditDate => 'Tarih ve saati düzenle'; + + @override + String get entryInfoActionEditLocation => 'Konumu düzenle'; + + @override + String get entryInfoActionEditTitleDescription => 'Başlık ve açıklamayı düzenle'; + + @override + String get entryInfoActionEditRating => 'Derecelendirmeyi düzenle'; + + @override + String get entryInfoActionEditTags => 'Etiketleri düzenle'; + + @override + String get entryInfoActionRemoveMetadata => 'Üst verileri kaldır'; + + @override + String get entryInfoActionExportMetadata => 'Üst verileri dışa aktar'; + + @override + String get entryInfoActionRemoveLocation => 'Konumu kaldır'; + + @override + String get editorActionTransform => 'Dönüştür'; + + @override + String get editorTransformCrop => 'Kırp'; + + @override + String get editorTransformRotate => 'Döndür'; + + @override + String get cropAspectRatioFree => 'Özgür'; + + @override + String get cropAspectRatioOriginal => 'Orijinal'; + + @override + String get cropAspectRatioSquare => 'Kare'; + + @override + String get filterAspectRatioLandscapeLabel => 'Yatay'; + + @override + String get filterAspectRatioPortraitLabel => 'Dikey'; + + @override + String get filterBinLabel => 'Geri dönüşüm kutusu'; + + @override + String get filterFavouriteLabel => 'Favori'; + + @override + String get filterNoDateLabel => 'Tarihsiz'; + + @override + String get filterNoAddressLabel => 'Adressiz'; + + @override + String get filterLocatedLabel => 'Konumlu'; + + @override + String get filterNoLocationLabel => 'Konumsuz'; + + @override + String get filterNoRatingLabel => 'Derecelendirilmemiş'; + + @override + String get filterTaggedLabel => 'Etiketli'; + + @override + String get filterNoTagLabel => 'Etiketsiz'; + + @override + String get filterNoTitleLabel => 'İsimsiz'; + + @override + String get filterOnThisDayLabel => 'Bugün'; + + @override + String get filterRecentlyAddedLabel => 'Son eklenen'; + + @override + String get filterRatingRejectedLabel => 'Reddedilmiş'; + + @override + String get filterTypeAnimatedLabel => 'Hareketli'; + + @override + String get filterTypeMotionPhotoLabel => 'Hareketli Fotoğraf'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Resim'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Ekran efektlerini önle'; + + @override + String get accessibilityAnimationsKeep => 'Ekran efektlerini koru'; + + @override + String get albumTierNew => 'Yeni'; + + @override + String get albumTierPinned => 'Sabitlenmiş'; + + @override + String get albumTierGroups => 'Gruplar'; + + @override + String get albumTierSpecial => 'Genel'; + + @override + String get albumTierApps => 'Uygulamalar'; + + @override + String get albumTierVaults => 'Kilitli albümler'; + + @override + String get albumTierDynamic => 'Dinamik'; + + @override + String get albumTierRegular => 'Diğer'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDS'; + + @override + String get coordinateFormatDecimal => 'Ondalık dereceler'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'K'; + + @override + String get coordinateDmsSouth => 'G'; + + @override + String get coordinateDmsEast => 'D'; + + @override + String get coordinateDmsWest => 'B'; + + @override + String get displayRefreshRatePreferHighest => 'En yüksek oran'; + + @override + String get displayRefreshRatePreferLowest => 'En düşük oran'; + + @override + String get keepScreenOnNever => 'Asla'; + + @override + String get keepScreenOnVideoPlayback => 'Video oynatma sırasında'; + + @override + String get keepScreenOnViewerOnly => 'Yalnızca görüntüleyici sayfasında'; + + @override + String get keepScreenOnAlways => 'Her zaman'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Haritalar'; + + @override + String get mapStyleGoogleHybrid => 'Google Haritalar (Hibrit)'; + + @override + String get mapStyleGoogleTerrain => 'Google Haritalar (Arazi)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'İnsancıl OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Suluboya'; + + @override + String get maxBrightnessNever => 'Asla'; + + @override + String get maxBrightnessAlways => 'Her zaman'; + + @override + String get nameConflictStrategyRename => 'Yeniden adlandır'; + + @override + String get nameConflictStrategyReplace => 'Değiştir'; + + @override + String get nameConflictStrategySkip => 'Atla'; + + @override + String get overlayHistogramNone => 'Hiçbiri'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Parlaklık'; + + @override + String get subtitlePositionTop => 'Üst'; + + @override + String get subtitlePositionBottom => 'Alt'; + + @override + String get themeBrightnessLight => 'Açık'; + + @override + String get themeBrightnessDark => 'Koyu'; + + @override + String get themeBrightnessBlack => 'Siyah'; + + @override + String get unitSystemMetric => 'Metrik'; + + @override + String get unitSystemImperial => 'İngiliz'; + + @override + String get vaultLockTypePattern => 'Desen'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Şifre'; + + @override + String get settingsVideoEnablePip => 'Resim içinde resim'; + + @override + String get videoControlsPlayOutside => 'Başka bir oynatıcı ile aç'; + + @override + String get videoLoopModeNever => 'Asla'; + + @override + String get videoLoopModeShortOnly => 'Yalnızca kısa videolar'; + + @override + String get videoLoopModeAlways => 'Her zaman'; + + @override + String get videoPlaybackSkip => 'Atla'; + + @override + String get videoPlaybackMuted => 'Sessiz oynat'; + + @override + String get videoPlaybackWithSound => 'Sesli oynat'; + + @override + String get videoResumptionModeNever => 'Asla'; + + @override + String get videoResumptionModeAlways => 'Her zaman'; + + @override + String get viewerTransitionSlide => 'Kaydır'; + + @override + String get viewerTransitionParallax => 'Paralaks'; + + @override + String get viewerTransitionFade => 'Soldur'; + + @override + String get viewerTransitionZoomIn => 'Yakınlaştır'; + + @override + String get viewerTransitionNone => 'Hiçbiri'; + + @override + String get wallpaperTargetHome => 'Ana ekran'; + + @override + String get wallpaperTargetLock => 'Kilit ekranı'; + + @override + String get wallpaperTargetHomeLock => 'Ana ve kilit ekranları'; + + @override + String get widgetDisplayedItemRandom => 'Rastgele'; + + @override + String get widgetDisplayedItemMostRecent => 'En son'; + + @override + String get widgetOpenPageHome => 'Ana sayfayı aç'; + + @override + String get widgetOpenPageCollection => 'Koleksiyonu aç'; + + @override + String get widgetOpenPageViewer => 'Görüntüleyiciyi aç'; + + @override + String get widgetTapUpdateWidget => 'Widget\'i güncelle'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Dahili depolama'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD kart'; + + @override + String get rootDirectoryDescription => 'kök dizin'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” dizin'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Bir sonraki ekranda \"$volume\" içindeki $directory dizinini seçerek bu uygulamaya erişim izni verin.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Bu uygulamanın “$volume” içindeki $directory dosyaları değiştirmesine izin verilmiyor.\n\nÖğeleri başka bir dizine taşımak için lütfen önceden yüklenmiş bir dosya yöneticisi veya galeri uygulaması kullanın.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Bu işlemin tamamlanması için “$volume” üzerinde $neededSize boş alana ihtiyaç var, ancak yalnızca $freeSize kaldı.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Sistem dosya seçicisi eksik veya devre dışı. Lütfen etkinleştirin ve tekrar deneyin.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Bu işlem şu türlerdeki ögeler için desteklenmez: $types.', + one: 'Bu işlem şu türdeki ögeler için desteklenmez: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Hedef klasördeki bazı dosyalar aynı ada sahip.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Bazı dosyalar aynı ada sahip.'; + + @override + String get addShortcutDialogLabel => 'Kısayol etiketi'; + + @override + String get addShortcutButtonLabel => 'EKLE'; + + @override + String get noMatchingAppDialogMessage => 'Bununla ilgilenebilecek bir uygulama yok.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Bu $countString öge geri dönüşüm kutusuna atılsın mı?', + one: 'Bu öge geri dönüşüm kutusuna taşınsın mı?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Bu $countString öge silinsin mi?', + one: 'Bu öge silinsin mi?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Devam etmeden önce öge tarihleri kaydedilsin mi?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Tarihleri kaydet'; + + @override + String videoResumeDialogMessage(String time) { + return '$time itibarıyla oynatmaya devam etmek istiyor musunuz?'; + } + + @override + String get videoStartOverButtonLabel => 'BAŞTAN BAŞLA'; + + @override + String get videoResumeButtonLabel => 'SÜRDÜR'; + + @override + String get setCoverDialogLatest => 'Son öge'; + + @override + String get setCoverDialogAuto => 'Otomatik'; + + @override + String get setCoverDialogCustom => 'Özel'; + + @override + String get hideFilterConfirmationDialogMessage => 'Eşleşen fotoğraf ve videolar koleksiyonunuzdan gizlenecektir. Bunları “Gizlilik”, ayarlarından tekrar gösterebilirsiniz.\n\nBunları gizlemek istediğinizden emin misiniz?'; + + @override + String get newAlbumDialogTitle => 'Yeni Albüm'; + + @override + String get newAlbumDialogNameLabel => 'Albüm adı'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Böyle bir albüm zaten var'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Dizin zaten var'; + + @override + String get newAlbumDialogStorageLabel => 'Depolama:'; + + @override + String get newDynamicAlbumDialogTitle => 'Yeni dinamik albüm'; + + @override + String get dynamicAlbumAlreadyExists => 'Dinamik albüm zaten var'; + + @override + String get newGroupDialogTitle => 'Yeni grup'; + + @override + String get newGroupDialogNameLabel => 'Grup adı'; + + @override + String get groupAlreadyExists => 'Grup zaten var'; + + @override + String get groupEmpty => 'Grup yok'; + + @override + String get ungrouped => 'Gruplandırılmamış'; + + @override + String get groupPickerTitle => 'Grubu seç'; + + @override + String get groupPickerUseThisGroupButton => 'Bu grubu kullan'; + + @override + String get newVaultWarningDialogMessage => 'Kilitli albümlere yalnızca bu uygulama erişebilir, başka herhangi bir uygulama erişemez.\n\nBu uygulamayı kaldırır veya verilerini silerseniz kilitli albümlerdeki bütün ögeleri kaybedersiniz.'; + + @override + String get newVaultDialogTitle => 'Kilitli Albüm Oluştur'; + + @override + String get configureVaultDialogTitle => 'Kilitli Albüm Ayarları'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Ekran kapatıldığında kilitle'; + + @override + String get vaultDialogLockTypeLabel => 'Kilit türü'; + + @override + String get patternDialogEnter => 'Deseninizi çizin'; + + @override + String get patternDialogConfirm => 'Deseninizi tekrar çizin'; + + @override + String get pinDialogEnter => 'PIN girin'; + + @override + String get pinDialogConfirm => 'PIN\'inizi tekrar girin'; + + @override + String get passwordDialogEnter => 'Şifre girin'; + + @override + String get passwordDialogConfirm => 'Şifrenizi tekrar girin'; + + @override + String get authenticateToConfigureVault => 'Kilitli albümü ayarlamak için kimliğinizi doğrulayın'; + + @override + String get authenticateToUnlockVault => 'Albümün kilidini açmak için kimliğinizi doğrulayın'; + + @override + String get vaultBinUsageDialogMessage => 'Bazı kilitli albümler çöp kutusunu kullanıyor.'; + + @override + String get renameAlbumDialogLabel => 'Yeni ad'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Dizin zaten var'; + + @override + String get renameEntrySetPageTitle => 'Yeniden adlandır'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'İsimlendirme şekli'; + + @override + String get renameEntrySetPageInsertTooltip => 'Alan ekle'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Önizleme'; + + @override + String get renameProcessorCounter => 'Sayaç'; + + @override + String get renameProcessorHash => 'Sağlama'; + + @override + String get renameProcessorName => 'Ad'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Bu albüm ve içindeki $countString öge silinsin mi?', + one: 'Bu albüm ve içindeki öge silinsin mi?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Bu albümler ve içindeki $countString ögesi silinsin mi?', + one: 'Bu albümler ve içindeki öge silinsin mi?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Biçim:'; + + @override + String get exportEntryDialogWidth => 'Genişlik'; + + @override + String get exportEntryDialogHeight => 'Yükseklik'; + + @override + String get exportEntryDialogQuality => 'Kalite'; + + @override + String get exportEntryDialogWriteMetadata => 'Metaverileri ekle'; + + @override + String get renameEntryDialogLabel => 'Yeni ad'; + + @override + String get editEntryDialogCopyFromItem => 'Başka bir ögeden kopyala'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Değiştirilecek alanlar'; + + @override + String get editEntryDateDialogTitle => 'Tarih ve Saat'; + + @override + String get editEntryDateDialogSetCustom => 'Özel tarih ayarla'; + + @override + String get editEntryDateDialogCopyField => 'Başka bir tarihten kopyala'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Başlıktan ayıkla'; + + @override + String get editEntryDateDialogShift => 'Değiştir'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Dosya değiştirilme tarihi'; + + @override + String get durationDialogHours => 'Saat'; + + @override + String get durationDialogMinutes => 'Dakika'; + + @override + String get durationDialogSeconds => 'Saniye'; + + @override + String get editEntryLocationDialogTitle => 'Konum'; + + @override + String get editEntryLocationDialogSetCustom => 'Özel konum ayarla'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Harita üzerinde seç'; + + @override + String get editEntryLocationDialogImportGpx => 'GPX\'i içe aktar'; + + @override + String get editEntryLocationDialogLatitude => 'Enlem'; + + @override + String get editEntryLocationDialogLongitude => 'Boylam'; + + @override + String get editEntryLocationDialogTimeShift => 'Zaman farkı'; + + @override + String get locationPickerUseThisLocationButton => 'Bu konumu kullan'; + + @override + String get editEntryRatingDialogTitle => 'Derecelendirme'; + + @override + String get removeEntryMetadataDialogTitle => 'Üst Veri Kaldırma'; + + @override + String get removeEntryMetadataDialogAll => 'Tümü'; + + @override + String get removeEntryMetadataDialogMore => 'Daha fazla'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'Hareketli bir fotoğrafın içindeki videoyu oynatmak için XMP gereklidir.\n\nKaldırmak istediğinizden emin misiniz?'; + + @override + String get videoSpeedDialogLabel => 'Oynatma hızı'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Ses'; + + @override + String get videoStreamSelectionDialogText => 'Altyazı'; + + @override + String get videoStreamSelectionDialogOff => 'Kapalı'; + + @override + String get videoStreamSelectionDialogTrack => 'Parça'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Başka parça yok.'; + + @override + String get genericSuccessFeedback => 'Başarılı!'; + + @override + String get genericFailureFeedback => 'Başarısız'; + + @override + String get genericDangerWarningDialogMessage => 'Emin misiniz?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Daha az ögeyle tekrar deneyin.'; + + @override + String get menuActionConfigureView => 'Görünüm'; + + @override + String get menuActionSelect => 'Seç'; + + @override + String get menuActionSelectAll => 'Hepsini seç'; + + @override + String get menuActionSelectNone => 'Hiçbirini seçme'; + + @override + String get menuActionMap => 'Harita'; + + @override + String get menuActionSlideshow => 'Slayt gösterisi'; + + @override + String get menuActionStats => 'İstatistikler'; + + @override + String get viewDialogSortSectionTitle => 'Sırala'; + + @override + String get viewDialogGroupSectionTitle => 'Bölümler'; + + @override + String get viewDialogLayoutSectionTitle => 'Düzen'; + + @override + String get viewDialogReverseSortOrder => 'Ters sıralama düzeni'; + + @override + String get tileLayoutMosaic => 'Mozaik'; + + @override + String get tileLayoutGrid => 'Izgara'; + + @override + String get tileLayoutList => 'Liste'; + + @override + String get castDialogTitle => 'Yakındaki Cihazlar'; + + @override + String get coverDialogTabCover => 'Kapak'; + + @override + String get coverDialogTabApp => 'Uygulama'; + + @override + String get coverDialogTabColor => 'Renk'; + + @override + String get appPickDialogTitle => 'Uygulama seç'; + + @override + String get appPickDialogNone => 'Yok'; + + @override + String get aboutPageTitle => 'Hakkında'; + + @override + String get aboutLinkLicense => 'Lisans'; + + @override + String get aboutLinkPolicy => 'Gizlilik Politikası'; + + @override + String get aboutBugSectionTitle => 'Hata Bildirimi'; + + @override + String get aboutBugSaveLogInstruction => 'Uygulama günlüklerini bir dosyaya kaydet'; + + @override + String get aboutBugCopyInfoInstruction => 'Sistem bilgilerini kopyala'; + + @override + String get aboutBugCopyInfoButton => 'Kopyala'; + + @override + String get aboutBugReportInstruction => 'GitHub\'da günlükleri ve sistem bilgilerini içeren bir rapor oluştur'; + + @override + String get aboutBugReportButton => 'Raporla'; + + @override + String get aboutDataUsageSectionTitle => 'Kullanılan Alan'; + + @override + String get aboutDataUsageData => 'Veriler'; + + @override + String get aboutDataUsageCache => 'Önbellek'; + + @override + String get aboutDataUsageDatabase => 'Veritabanı'; + + @override + String get aboutDataUsageMisc => 'Diğer'; + + @override + String get aboutDataUsageInternal => 'Dahili'; + + @override + String get aboutDataUsageExternal => 'Harici'; + + @override + String get aboutDataUsageClearCache => 'Önbelleği Temizle'; + + @override + String get aboutCreditsSectionTitle => 'Kredi'; + + @override + String get aboutCreditsWorldAtlas1 => 'Bu uygulama bir TopoJSON dosyası kullanır'; + + @override + String get aboutCreditsWorldAtlas2 => 'ISC Lisansı kapsamında.'; + + @override + String get aboutTranslatorsSectionTitle => 'Tercümanlar'; + + @override + String get aboutLicensesSectionTitle => 'Açık Kaynak Lisansları'; + + @override + String get aboutLicensesBanner => 'Bu uygulama aşağıdaki açık kaynaklı paketleri ve kütüphaneleri kullanır.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Kütüphaneleri'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Eklentileri'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Paketleri'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Paketleri'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Tüm Lisansları Göster'; + + @override + String get policyPageTitle => 'Gizlilik Politikası'; + + @override + String get collectionPageTitle => 'Koleksiyon'; + + @override + String get collectionPickPageTitle => 'Seç'; + + @override + String get collectionSelectPageTitle => 'Öğeleri seç'; + + @override + String get collectionActionShowTitleSearch => 'Başlık filtresini göster'; + + @override + String get collectionActionHideTitleSearch => 'Başlık filtresini gizle'; + + @override + String get collectionActionAddDynamicAlbum => 'Dinamik albüm ekle'; + + @override + String get collectionActionAddShortcut => 'Kısayol ekle'; + + @override + String get collectionActionSetHome => 'Ana ekran olarak ayarla'; + + @override + String get collectionActionEmptyBin => 'Çöp kutusu boş'; + + @override + String get collectionActionCopy => 'Albüme kopyala'; + + @override + String get collectionActionMove => 'Albüme taşı'; + + @override + String get collectionActionRescan => 'Yeniden tara'; + + @override + String get collectionActionEdit => 'Düzenle'; + + @override + String get collectionSearchTitlesHintText => 'Başlıkları ara'; + + @override + String get collectionGroupAlbum => 'Albüme göre'; + + @override + String get collectionGroupMonth => 'Aya göre'; + + @override + String get collectionGroupDay => 'Güne göre'; + + @override + String get sectionNone => 'Bölüm yok'; + + @override + String get sectionUnknown => 'Bilinmeyen'; + + @override + String get dateToday => 'Bugün'; + + @override + String get dateYesterday => 'Dün'; + + @override + String get dateThisMonth => 'Bu ay'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString öge silinemedi', + one: '1 öge silinemedi', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString öge kopyalanamadı', + one: '1 öge kopyalanamadı', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString öge taşınamadı', + one: '1 öge taşınamadı', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ögenin adı değiştirilemedi', + one: '1 ögenin adı değiştirilemedi', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString öge düzenlenemedi', + one: '1 öge düzenlenemedi', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString sayfa dışa aktarılamadı', + one: '1 sayfa dışa aktarılamadı', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString öge kopyalandı', + one: '1 öge kopyalandı', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString öge taşındı', + one: '1 öge taşındı', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ögenin adı değiştirildi', + one: '1 ögenin adı değiştirildi', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString öge düzenlendi', + one: '1 öge düzenlendi', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Favori yok'; + + @override + String get collectionEmptyVideos => 'Video yok'; + + @override + String get collectionEmptyImages => 'Resim yok'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Erişim izni'; + + @override + String get collectionSelectSectionTooltip => 'Bölüm seç'; + + @override + String get collectionDeselectSectionTooltip => 'Bölüm seçimini kaldır'; + + @override + String get drawerAboutButton => 'Hakkında'; + + @override + String get drawerSettingsButton => 'Ayarlar'; + + @override + String get drawerCollectionAll => 'Tüm koleksiyon'; + + @override + String get drawerCollectionFavourites => 'Favoriler'; + + @override + String get drawerCollectionImages => 'Resimler'; + + @override + String get drawerCollectionVideos => 'Videolar'; + + @override + String get drawerCollectionAnimated => 'Hareketli'; + + @override + String get drawerCollectionMotionPhotos => 'Hareketli fotoğraflar'; + + @override + String get drawerCollectionPanoramas => 'Panoramalar'; + + @override + String get drawerCollectionRaws => 'Raw fotoğraflar'; + + @override + String get drawerCollectionSphericalVideos => '360° Videolar'; + + @override + String get drawerAlbumPage => 'Albümler'; + + @override + String get drawerCountryPage => 'Ülkeler'; + + @override + String get drawerPlacePage => 'Yerler'; + + @override + String get drawerTagPage => 'Etiketler'; + + @override + String get sortByDate => 'Tarihe göre'; + + @override + String get sortByName => 'Adına göre'; + + @override + String get sortByItemCount => 'Öğe sayısına göre'; + + @override + String get sortBySize => 'Boyuta göre'; + + @override + String get sortByAlbumFileName => 'Albüm ve başlığı göre'; + + @override + String get sortByRating => 'Derecelendirmeye göre'; + + @override + String get sortByDuration => 'Süreye göre'; + + @override + String get sortByPath => 'Yolu'; + + @override + String get sortOrderNewestFirst => 'Önce en yeni'; + + @override + String get sortOrderOldestFirst => 'Önce en eski'; + + @override + String get sortOrderAtoZ => 'A\'dan Z\'ye'; + + @override + String get sortOrderZtoA => 'Z\'den A\'ya'; + + @override + String get sortOrderHighestFirst => 'Önce en yüksek'; + + @override + String get sortOrderLowestFirst => 'Önce en düşük'; + + @override + String get sortOrderLargestFirst => 'Önce en büyük'; + + @override + String get sortOrderSmallestFirst => 'Önce en küçük'; + + @override + String get sortOrderShortestFirst => 'Önce en kısa'; + + @override + String get sortOrderLongestFirst => 'Önce en uzun'; + + @override + String get albumGroupTier => 'Kademeye göre'; + + @override + String get albumGroupType => 'Türe göre'; + + @override + String get albumGroupVolume => 'Depolama hacmine göre'; + + @override + String get albumMimeTypeMixed => 'Karışık'; + + @override + String get albumPickPageTitleCopy => 'Albüme kopyala'; + + @override + String get albumPickPageTitleExport => 'Albüme aktar'; + + @override + String get albumPickPageTitleMove => 'Albüme taşı'; + + @override + String get albumPickPageTitlePick => 'Albüm seç'; + + @override + String get albumCamera => 'Kamera'; + + @override + String get albumDownload => 'İndir'; + + @override + String get albumScreenshots => 'Ekran görüntüleri'; + + @override + String get albumScreenRecordings => 'Ekran kayıtları'; + + @override + String get albumVideoCaptures => 'Video çekimleri'; + + @override + String get albumPageTitle => 'Albümler'; + + @override + String get albumEmpty => 'Albüm yok'; + + @override + String get createAlbumButtonLabel => 'OLUŞTUR'; + + @override + String get newFilterBanner => 'yeni'; + + @override + String get countryPageTitle => 'Ülkeler'; + + @override + String get countryEmpty => 'Ülke yok'; + + @override + String get statePageTitle => 'Eyaletler'; + + @override + String get stateEmpty => 'Hiç eyalet bulunamadı'; + + @override + String get placePageTitle => 'Yerler'; + + @override + String get placeEmpty => 'Hiç yer bulunamadı'; + + @override + String get tagPageTitle => 'Etiketler'; + + @override + String get tagEmpty => 'Etiket yok'; + + @override + String get tagPickPageTitle => 'Etiket Seç'; + + @override + String get binPageTitle => 'Geri Dönüşüm Kutusu'; + + @override + String get explorerPageTitle => 'Gezgin'; + + @override + String get explorerActionSelectStorageVolume => 'Depolama alanı seç'; + + @override + String get selectStorageVolumeDialogTitle => 'Depolama Alanı Seç'; + + @override + String get searchCollectionFieldHint => 'Koleksiyonda ara'; + + @override + String get searchRecentSectionTitle => 'Yakın zamanda'; + + @override + String get searchDateSectionTitle => 'Tarih'; + + @override + String get searchFormatSectionTitle => 'Biçimler'; + + @override + String get searchAlbumsSectionTitle => 'Albümler'; + + @override + String get searchCountriesSectionTitle => 'Ülkeler'; + + @override + String get searchStatesSectionTitle => 'Eyaletler'; + + @override + String get searchPlacesSectionTitle => 'Yerler'; + + @override + String get searchTagsSectionTitle => 'Etiketler'; + + @override + String get searchRatingSectionTitle => 'Derecelendirmeler'; + + @override + String get searchMetadataSectionTitle => 'Üstveri'; + + @override + String get settingsPageTitle => 'Ayarlar'; + + @override + String get settingsSystemDefault => 'Sistem'; + + @override + String get settingsDefault => 'Varsayılan'; + + @override + String get settingsDisabled => 'Devre dışı'; + + @override + String get settingsEnabled => 'Etkin'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Her seferinde sor'; + + @override + String get settingsModificationWarningDialogMessage => 'Diğer ayarlar değiştirilecektir.'; + + @override + String get settingsSearchFieldLabel => 'Ayarlarda ara'; + + @override + String get settingsSearchEmpty => 'Eşleşen ayar bulunamadı'; + + @override + String get settingsActionExport => 'Dışa aktar'; + + @override + String get settingsActionExportDialogTitle => 'Dışa aktar'; + + @override + String get settingsActionImport => 'İçe aktar'; + + @override + String get settingsActionImportDialogTitle => 'İçe aktar'; + + @override + String get appExportCovers => 'Kapaklar'; + + @override + String get appExportDynamicAlbums => 'Dinamik albümler'; + + @override + String get appExportFavourites => 'Favoriler'; + + @override + String get appExportSettings => 'Ayarlar'; + + @override + String get settingsNavigationSectionTitle => 'Gezinti'; + + @override + String get settingsHomeTile => 'Anasayfa'; + + @override + String get settingsHomeDialogTitle => 'Anasayfa'; + + @override + String get setHomeCustom => 'Özel'; + + @override + String get settingsKeepScreenOnTile => 'Ekranı açık tut'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Ekranı Açık Tut'; + + @override + String get settingsDoubleBackExit => 'Çıkmak için iki kez “geri” düğmesine dokun'; + + @override + String get settingsConfirmationTile => 'Onaylama diyalogları'; + + @override + String get settingsConfirmationDialogTitle => 'Onaylama Diyalogları'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Öğeleri sonsuza dek silmeden önce sor'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Eşyaları geri dönüşüm kutusuna atmadan önce sor'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Tarihsiz eşyaları taşımadan önce sor'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Öğeleri geri dönüşüm kutusuna taşıdıktan sonra mesaj göster'; + + @override + String get settingsConfirmationVaultDataLoss => 'Kilitli albüm veri kaybı uyarısını göster'; + + @override + String get settingsNavigationDrawerTile => 'Gezinti menüsü'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Gezinti Menüsü'; + + @override + String get settingsNavigationDrawerBanner => 'Menü ögelerini taşımak ve yeniden sıralamak için dokunun ve basılı tutun.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Türler'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albümler'; + + @override + String get settingsNavigationDrawerTabPages => 'Sayfalar'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Albüm ekle'; + + @override + String get settingsNavigationBottomActionsTile => 'Alt gezinme'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Alt Gezinme'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Düğmeleri hareket ettirmek ve alt gezinme çubuğunda hangi eylemlerin görüntüleneceğini seçmek için dokunup basılı tutun.'; + + @override + String get settingsThumbnailSectionTitle => 'Küçük resimler'; + + @override + String get settingsThumbnailOverlayTile => 'Kaplama'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Kaplama'; + + @override + String get settingsThumbnailShowHdrIcon => 'HDR simgesini göster'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Favori simgeyi göster'; + + @override + String get settingsThumbnailShowTagIcon => 'Etiket simgesini göster'; + + @override + String get settingsThumbnailShowLocationIcon => 'Konum simgesini göster'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Hareketli fotoğraf simgesini göster'; + + @override + String get settingsThumbnailShowRating => 'Derecelendirmeyi göster'; + + @override + String get settingsThumbnailShowRawIcon => 'Raw simgesini göster'; + + @override + String get settingsThumbnailShowVideoDuration => 'Video süresini göster'; + + @override + String get settingsCollectionQuickActionsTile => 'Hızlı eylemler'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Hızlı Eylemler'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Gözatma'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Seçme'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Düğmeleri hareket ettirmek ve ögelere göz atarken hangi eylemlerin görüntüleneceğini seçmek için dokunun ve basılı tutun.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Düğmeleri hareket ettirmek ve ögeleri seçerken hangi eylemlerin görüntüleneceğini seçmek için dokunun ve basılı tutun.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Seri fotoğraf çekme biçimleri'; + + @override + String get settingsCollectionBurstPatternsNone => 'Hiçbiri'; + + @override + String get settingsViewerSectionTitle => 'Görüntüleyici'; + + @override + String get settingsViewerGestureSideTapNext => 'Önceki/sonraki ögeyi göstermek için ekran kenarlarına dokunun'; + + @override + String get settingsViewerUseCutout => 'Kesim alanını kullan'; + + @override + String get settingsViewerMaximumBrightness => 'Maksimum parlaklık'; + + @override + String get settingsMotionPhotoAutoPlay => 'Hareketli fotoğrafları otomatik oynat'; + + @override + String get settingsImageBackground => 'Resim arka planı'; + + @override + String get settingsViewerQuickActionsTile => 'Hızlı eylemler'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Hızlı Eylemler'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Düğmeleri hareket ettirmek ve görüntüleyicide hangi eylemlerin görüntüleneceğini seçmek için dokunun ve basılı tutun.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Gösterilen Düğmeler'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Mevcut Düğmeler'; + + @override + String get settingsViewerQuickActionEmpty => 'Düğme yok'; + + @override + String get settingsViewerOverlayTile => 'Kaplama'; + + @override + String get settingsViewerOverlayPageTitle => 'Kaplama'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Açılışta göster'; + + @override + String get settingsViewerShowHistogram => 'Çubuk grafiğini göster'; + + @override + String get settingsViewerShowMinimap => 'Mini haritayı göster'; + + @override + String get settingsViewerShowZoomLevel => 'Yakınlaştırma seviyesini göster'; + + @override + String get settingsViewerShowInformation => 'Bilgileri göster'; + + @override + String get settingsViewerShowInformationSubtitle => 'Başlığı, tarihi, konumu vb. göster.'; + + @override + String get settingsViewerShowRatingTags => 'Derecelendirme ve etiketleri göster'; + + @override + String get settingsViewerShowShootingDetails => 'Çekim ayrıntılarını göster'; + + @override + String get settingsViewerShowDescription => 'Açıklamayı göster'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Küçük resimleri göster'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Bulanıklık efekti'; + + @override + String get settingsViewerSlideshowTile => 'Slayt gösterisi'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slayt gösterisi'; + + @override + String get settingsSlideshowRepeat => 'Tekrarla'; + + @override + String get settingsSlideshowShuffle => 'Karıştır'; + + @override + String get settingsSlideshowFillScreen => 'Ekranı doldur'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animasyonlu yakınlaştırma efekti'; + + @override + String get settingsSlideshowTransitionTile => 'Geçiş'; + + @override + String get settingsSlideshowIntervalTile => 'Aralık'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video oynatma'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Oynatma'; + + @override + String get settingsVideoPageTitle => 'Video Ayarları'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Videoları göster'; + + @override + String get settingsVideoPlaybackTile => 'Oynatma'; + + @override + String get settingsVideoPlaybackPageTitle => 'Oynatma'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Donanım hızlandırma'; + + @override + String get settingsVideoAutoPlay => 'Otomatik oynatma'; + + @override + String get settingsVideoLoopModeTile => 'Döngü modu'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Döngü Modu'; + + @override + String get settingsVideoResumptionModeTile => 'Oynatmaya devam et'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Oynatmaya Devam Et'; + + @override + String get settingsVideoBackgroundMode => 'Arkaplan modu'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Arkaplan Modu'; + + @override + String get settingsVideoControlsTile => 'Kontroller'; + + @override + String get settingsVideoControlsPageTitle => 'Kontroller'; + + @override + String get settingsVideoButtonsTile => 'Düğmeler'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Oynatmak/duraklatmak için çift dokunun'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'İleri/geri gitmek için ekran kenarlarına çift dokunun'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Parlaklığı/ses seviyesini ayarlamak için yukarı veya aşağı kaydırın'; + + @override + String get settingsSubtitleThemeTile => 'Altyazılar'; + + @override + String get settingsSubtitleThemePageTitle => 'Altyazılar'; + + @override + String get settingsSubtitleThemeSample => 'Bu bir örnek.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Metin hizalama'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Metin Hizalama'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Metin konumu'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Metin Konumu'; + + @override + String get settingsSubtitleThemeTextSize => 'Metin boyutu'; + + @override + String get settingsSubtitleThemeShowOutline => 'Dış çizgiyi ve gölgeyi göster'; + + @override + String get settingsSubtitleThemeTextColor => 'Metin rengi'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Metin opaklığı'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Arka plan rengi'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Arka plan opaklığı'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Sol'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Merkez'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Sağ'; + + @override + String get settingsPrivacySectionTitle => 'Gizlilik'; + + @override + String get settingsAllowInstalledAppAccess => 'Uygulama envanterine erişime izin ver'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Albüm görüntüsünü iyileştirmek için kullanılır'; + + @override + String get settingsAllowErrorReporting => 'Anonim hata raporlamasına izin ver'; + + @override + String get settingsSaveSearchHistory => 'Arama geçmişini kaydet'; + + @override + String get settingsEnableBin => 'Geri dönüşüm kutusunu kullan'; + + @override + String get settingsEnableBinSubtitle => 'Silinen ögeleri 30 gün boyunca saklar'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Çöp kutusundaki ögeler sonsuza dek silinecektir.'; + + @override + String get settingsAllowMediaManagement => 'Medya yönetimine izin ver'; + + @override + String get settingsHiddenItemsTile => 'Gizli ögeler'; + + @override + String get settingsHiddenItemsPageTitle => 'Gizli Öğeler'; + + @override + String get settingsHiddenFiltersBanner => 'Gizli filtrelerle eşleşen fotoğraflar ve videolar koleksiyonunuzda görünmeyecektir.'; + + @override + String get settingsHiddenFiltersEmpty => 'Gizli filtre yok'; + + @override + String get settingsStorageAccessTile => 'Depolama erişimi'; + + @override + String get settingsStorageAccessPageTitle => 'Depolama Erişimi'; + + @override + String get settingsStorageAccessBanner => 'Bazı dizinler, içlerindeki dosyaları değiştirmek için açık bir erişim izni gerektirir. Daha önce erişim izni verdiğiniz dizinleri buradan inceleyebilirsiniz.'; + + @override + String get settingsStorageAccessEmpty => 'Erişim izni yok'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Geri al'; + + @override + String get settingsAccessibilitySectionTitle => 'Erişilebilirlik'; + + @override + String get settingsRemoveAnimationsTile => 'Animasyonları kaldır'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Animasyonları Kaldır'; + + @override + String get settingsTimeToTakeActionTile => 'Harekete geçme zamanı'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Çoklu dokunma hareketi alternatiflerini göster'; + + @override + String get settingsDisplaySectionTitle => 'Ekran'; + + @override + String get settingsThemeBrightnessTile => 'Tema'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Tema'; + + @override + String get settingsThemeColorHighlights => 'Renk vurguları'; + + @override + String get settingsThemeEnableDynamicColor => 'Dinamik renk'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Görüntü yenileme hızı'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Yenileme Hızı'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV arayüzü'; + + @override + String get settingsLanguageSectionTitle => 'Dil ve Biçim'; + + @override + String get settingsLanguageTile => 'Dil'; + + @override + String get settingsLanguagePageTitle => 'Dil'; + + @override + String get settingsCoordinateFormatTile => 'Koordinat formatı'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Koordinat Formatı'; + + @override + String get settingsUnitSystemTile => 'Birimler'; + + @override + String get settingsUnitSystemDialogTitle => 'Birimler'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Arap rakamlarını zorla'; + + @override + String get settingsScreenSaverPageTitle => 'Ekran Koruyucu'; + + @override + String get settingsWidgetPageTitle => 'Fotoğraf Çerçevesi'; + + @override + String get settingsWidgetShowOutline => 'Anahat'; + + @override + String get settingsWidgetOpenPage => 'Widget\'a dokunulduğunda'; + + @override + String get settingsWidgetDisplayedItem => 'Görüntülenen öge'; + + @override + String get settingsCollectionTile => 'Koleksiyon'; + + @override + String get statsPageTitle => 'İstatistikler'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString öge konuma sahip', + one: '1 öge konuma sahip', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Öne Çıkan Ülkeler'; + + @override + String get statsTopStatesSectionTitle => 'Baş Eyaletler'; + + @override + String get statsTopPlacesSectionTitle => 'Öne Çıkan Yerler'; + + @override + String get statsTopTagsSectionTitle => 'Öne Çıkan Etiketler'; + + @override + String get statsTopAlbumsSectionTitle => 'Öne Çıkan Albümler'; + + @override + String get viewerOpenPanoramaButtonLabel => 'PANORAMAYI AÇ'; + + @override + String get viewerSetWallpaperButtonLabel => 'DUVAR KAĞIDI AYARLA'; + + @override + String get viewerErrorUnknown => 'Tüh!'; + + @override + String get viewerErrorDoesNotExist => 'Dosya artık mevcut değil.'; + + @override + String get viewerInfoPageTitle => 'Bilgi'; + + @override + String get viewerInfoBackToViewerTooltip => 'Görüntüleyiciye geri dön'; + + @override + String get viewerInfoUnknown => 'bilinmeyen'; + + @override + String get viewerInfoLabelDescription => 'Açıklama'; + + @override + String get viewerInfoLabelTitle => 'Başlık'; + + @override + String get viewerInfoLabelDate => 'Tarih'; + + @override + String get viewerInfoLabelResolution => 'Çözünürlük'; + + @override + String get viewerInfoLabelSize => 'Boyut'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Yol'; + + @override + String get viewerInfoLabelDuration => 'Süre'; + + @override + String get viewerInfoLabelOwner => 'Sahibi'; + + @override + String get viewerInfoLabelCoordinates => 'Koordinatlar'; + + @override + String get viewerInfoLabelAddress => 'Adres'; + + @override + String get mapStyleDialogTitle => 'Harita Şekli'; + + @override + String get mapStyleDialogAddStyle => 'Biçim ekle'; + + @override + String get mapStyleTooltip => 'Harita şeklini seç'; + + @override + String get mapStyleEditorDialogName => 'Ad'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Alt alan adları'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Yakınlaştır'; + + @override + String get mapZoomOutTooltip => 'Uzaklaştır'; + + @override + String get mapPointNorthUpTooltip => 'Kuzeyi göster'; + + @override + String get mapAttributionOsmData => 'Harita verileri © [OpenStreetMap](https://www.openstreetmap.org/copyright) katkıda bulunanlar'; + + @override + String get mapAttributionOsmLiberty => 'Döşemeler [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Barındıran [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Döşemeler [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Döşemeler [HOT](https://www.hotosm.org/) • Barındıran [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Döşemeler [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Harita sayfasında görüntüle'; + + @override + String get mapEmptyRegion => 'Bu bölgede resim yok'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Gömülü veriler ayıklanamadı'; + + @override + String get viewerInfoOpenLinkText => 'Aç'; + + @override + String get viewerInfoViewXmlLinkText => 'XML\'i Görüntüle'; + + @override + String get viewerInfoSearchFieldLabel => 'Meta verileri ara'; + + @override + String get viewerInfoSearchEmpty => 'Eşleşen anahtar yok'; + + @override + String get viewerInfoSearchSuggestionDate => 'Tarih ve saat'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Açıklama'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Boyutlar'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Çözünürlük'; + + @override + String get viewerInfoSearchSuggestionRights => 'Haklar'; + + @override + String get wallpaperUseScrollEffect => 'Ana ekranda kaydırma efektini kullan'; + + @override + String get tagEditorPageTitle => 'Etiketleri Düzenle'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Yeni etiket'; + + @override + String get tagEditorPageAddTagTooltip => 'Etiket ekle'; + + @override + String get tagEditorSectionRecent => 'Yakın zamanda'; + + @override + String get tagEditorSectionPlaceholders => 'Yer Tutucular'; + + @override + String get tagEditorDiscardDialogMessage => 'Değişikliklerden vazgeçmek istiyor musunuz?'; + + @override + String get tagPlaceholderCountry => 'Ülke'; + + @override + String get tagPlaceholderState => 'Eyalet'; + + @override + String get tagPlaceholderPlace => 'Yer'; + + @override + String get panoramaEnableSensorControl => 'Sensör kontrolünü etkinleştir'; + + @override + String get panoramaDisableSensorControl => 'Sensör kontrolünü devre dışı bırak'; + + @override + String get sourceViewerPageTitle => 'Kaynak'; +} diff --git a/lib/l10ngen/app_localizations_uk.dart b/lib/l10ngen/app_localizations_uk.dart new file mode 100644 index 0000000..88910bd --- /dev/null +++ b/lib/l10ngen/app_localizations_uk.dart @@ -0,0 +1,2393 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Ukrainian (`uk`). +class AppLocalizationsUk extends AppLocalizations { + AppLocalizationsUk([String locale = 'uk']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Ласкаво просимо до Aves'; + + @override + String get welcomeOptional => 'Необов\'язково'; + + @override + String get welcomeTermsToggle => 'Я погоджуюсь з умовами та положеннями'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count елементів', + few: '$count елементи', + one: '$count елемент', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count стовпців', + few: '$count стовпці', + one: '$count стовпець', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString секунд', + few: '$countString секунди', + one: '$countString секунда', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString хвилин', + few: '$countString хвилини', + one: '$countString хвилина', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString днів', + few: '$countString дні', + one: '$countString день', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length мм'; + } + + @override + String get applyButtonLabel => 'ЗАСТОСУВАТИ'; + + @override + String get createButtonLabel => 'СТВОРИТИ'; + + @override + String get deleteButtonLabel => 'ВИДАЛИТИ'; + + @override + String get nextButtonLabel => 'ДАЛІ'; + + @override + String get showButtonLabel => 'ПОКАЗАТИ'; + + @override + String get hideButtonLabel => 'ПРИХОВАТИ'; + + @override + String get continueButtonLabel => 'ПРОДОВЖИТИ'; + + @override + String get saveCopyButtonLabel => 'ЗБЕРЕГТИ КОПІЮ'; + + @override + String get applyTooltip => 'Застосувати'; + + @override + String get cancelTooltip => 'Скасувати'; + + @override + String get changeTooltip => 'Змінити'; + + @override + String get clearTooltip => 'Очистити'; + + @override + String get previousTooltip => 'Попередній'; + + @override + String get nextTooltip => 'Далі'; + + @override + String get showTooltip => 'Показати'; + + @override + String get hideTooltip => 'Приховати'; + + @override + String get actionRemove => 'Видалити'; + + @override + String get resetTooltip => 'Скинути'; + + @override + String get saveTooltip => 'Зберегти'; + + @override + String get stopTooltip => 'Зупинити'; + + @override + String get pickTooltip => 'Вибрати'; + + @override + String get doubleBackExitMessage => 'Натисніть “назад” ще раз, щоб вийти.'; + + @override + String get doNotAskAgain => 'Не запитувати знову'; + + @override + String get sourceStateLoading => 'Завантаження'; + + @override + String get sourceStateCataloguing => 'Каталогізація'; + + @override + String get sourceStateLocatingCountries => 'Розташування країн'; + + @override + String get sourceStateLocatingPlaces => 'Розташування локацій'; + + @override + String get chipActionDelete => 'Видалити'; + + @override + String get chipActionRemove => 'Вилучити'; + + @override + String get chipActionShowCollection => 'Показати у Колекції'; + + @override + String get chipActionGoToAlbumPage => 'Показати в Альбомах'; + + @override + String get chipActionGoToCountryPage => 'Показати в Країнах'; + + @override + String get chipActionGoToPlacePage => 'Показати в Локаціях'; + + @override + String get chipActionGoToTagPage => 'Показати в Тегах'; + + @override + String get chipActionGoToExplorerPage => 'Показати в провіднику'; + + @override + String get chipActionDecompose => 'Розділити'; + + @override + String get chipActionFilterOut => 'Відфільтрувати'; + + @override + String get chipActionFilterIn => 'Включити'; + + @override + String get chipActionHide => 'Приховати'; + + @override + String get chipActionLock => 'Заблокувати'; + + @override + String get chipActionPin => 'Закріпити зверху'; + + @override + String get chipActionUnpin => 'Відкріпити'; + + @override + String get chipActionGroup => 'Змінити групування'; + + @override + String get chipActionRename => 'Перейменувати'; + + @override + String get chipActionSetCover => 'Змінити обкладинку'; + + @override + String get chipActionShowCountryStates => 'Показати штати'; + + @override + String get chipActionCreateGroup => 'Створити групу'; + + @override + String get chipActionCreateAlbum => 'Створити альбом'; + + @override + String get chipActionCreateVault => 'Створити сховище'; + + @override + String get chipActionConfigureVault => 'Налаштувати сховище'; + + @override + String get entryActionCopyToClipboard => 'Скопіювати в буфер обміну'; + + @override + String get entryActionDelete => 'Видалити'; + + @override + String get entryActionConvert => 'Конвертувати'; + + @override + String get entryActionExport => 'Експорт'; + + @override + String get entryActionInfo => 'Інформація'; + + @override + String get entryActionRename => 'Перейменувати'; + + @override + String get entryActionRestore => 'Відновити'; + + @override + String get entryActionRotateCCW => 'Обертати проти годинникової стрілки'; + + @override + String get entryActionRotateCW => 'Обертати за годинниковою стрілкою'; + + @override + String get entryActionFlip => 'Віддзеркалити по горизонталі'; + + @override + String get entryActionPrint => 'Роздрукувати'; + + @override + String get entryActionShare => 'Поділитися'; + + @override + String get entryActionShareImageOnly => 'Поділитися тільки зображенням'; + + @override + String get entryActionShareVideoOnly => 'Поділитися тільки відео'; + + @override + String get entryActionViewSource => 'Переглянути джерело'; + + @override + String get entryActionShowGeoTiffOnMap => 'Показати як накладення на карту'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Перетворити на нерухоме зображення'; + + @override + String get entryActionViewMotionPhotoVideo => 'Відкрити відео'; + + @override + String get entryActionEdit => 'Редагувати'; + + @override + String get entryActionOpen => 'Відкрити за допомогою'; + + @override + String get entryActionSetAs => 'Встановити як'; + + @override + String get entryActionCast => 'Трансляція'; + + @override + String get entryActionOpenMap => 'Показати в додатку карти'; + + @override + String get entryActionRotateScreen => 'Повернути екран'; + + @override + String get entryActionAddFavourite => 'Додати в обране'; + + @override + String get entryActionRemoveFavourite => 'Видалити з обраного'; + + @override + String get videoActionCaptureFrame => 'Зберегти кадр'; + + @override + String get videoActionMute => 'Вимкнути звук'; + + @override + String get videoActionUnmute => 'Увімкнути звук'; + + @override + String get videoActionPause => 'Призупинити'; + + @override + String get videoActionPlay => 'Відтворити'; + + @override + String get videoActionReplay10 => 'Перемотати на 10 секунд назад'; + + @override + String get videoActionSkip10 => 'Перемотати на 10 секунд вперед'; + + @override + String get videoActionShowPreviousFrame => 'Показати попередній кадр'; + + @override + String get videoActionShowNextFrame => 'Показати наступний кадр'; + + @override + String get videoActionSelectStreams => 'Вибрати доріжку'; + + @override + String get videoActionSetSpeed => 'Швидкість відтворення'; + + @override + String get videoActionABRepeat => 'Повторити від А до Б'; + + @override + String get videoRepeatActionSetStart => 'Змінити початок'; + + @override + String get videoRepeatActionSetEnd => 'Змінити кінець'; + + @override + String get viewerActionSettings => 'Налаштування'; + + @override + String get viewerActionLock => 'Заблокувати переглядач'; + + @override + String get viewerActionUnlock => 'Розблокувати переглядач'; + + @override + String get slideshowActionResume => 'Продовжити'; + + @override + String get slideshowActionShowInCollection => 'Показати у Колекції'; + + @override + String get entryInfoActionEditDate => 'Редагувати дату та час'; + + @override + String get entryInfoActionEditLocation => 'Редагувати місцезнаходження'; + + @override + String get entryInfoActionEditTitleDescription => 'Редагувати заголовок та опис'; + + @override + String get entryInfoActionEditRating => 'Редагувати рейтинг'; + + @override + String get entryInfoActionEditTags => 'Редагувати теги'; + + @override + String get entryInfoActionRemoveMetadata => 'Видалити метадані'; + + @override + String get entryInfoActionExportMetadata => 'Експортувати метадані'; + + @override + String get entryInfoActionRemoveLocation => 'Видалити місцезнаходження'; + + @override + String get editorActionTransform => 'Перетворити'; + + @override + String get editorTransformCrop => 'Обрізати'; + + @override + String get editorTransformRotate => 'Повернути'; + + @override + String get cropAspectRatioFree => 'Вільне'; + + @override + String get cropAspectRatioOriginal => 'Оригінал'; + + @override + String get cropAspectRatioSquare => 'Площа'; + + @override + String get filterAspectRatioLandscapeLabel => 'Горизонтально'; + + @override + String get filterAspectRatioPortraitLabel => 'Вертикально'; + + @override + String get filterBinLabel => 'Кошик'; + + @override + String get filterFavouriteLabel => 'Обране'; + + @override + String get filterNoDateLabel => 'Без дати'; + + @override + String get filterNoAddressLabel => 'Без адреси'; + + @override + String get filterLocatedLabel => 'Розташований'; + + @override + String get filterNoLocationLabel => 'Без місцезнаходження'; + + @override + String get filterNoRatingLabel => 'Без рейтингу'; + + @override + String get filterTaggedLabel => 'Позначений тегом'; + + @override + String get filterNoTagLabel => 'Без тегів'; + + @override + String get filterNoTitleLabel => 'Без назви'; + + @override + String get filterOnThisDayLabel => 'У цей день'; + + @override + String get filterRecentlyAddedLabel => 'Нещодавно додані'; + + @override + String get filterRatingRejectedLabel => 'Відхилено'; + + @override + String get filterTypeAnimatedLabel => 'Анімована'; + + @override + String get filterTypeMotionPhotoLabel => 'Фотографія з рухом'; + + @override + String get filterTypePanoramaLabel => 'Панорама'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Відео'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Зображення'; + + @override + String get filterMimeVideoLabel => 'Відео'; + + @override + String get accessibilityAnimationsRemove => 'Запобігання екранним ефектам'; + + @override + String get accessibilityAnimationsKeep => 'Зберегти екранні ефекти'; + + @override + String get albumTierNew => 'Нові'; + + @override + String get albumTierPinned => 'Закріплені'; + + @override + String get albumTierGroups => 'Групи'; + + @override + String get albumTierSpecial => 'Стандартні'; + + @override + String get albumTierApps => 'Додатки'; + + @override + String get albumTierVaults => 'Сховища'; + + @override + String get albumTierDynamic => 'Динамічний'; + + @override + String get albumTierRegular => 'Інше'; + + @override + String get coordinateFormatDms => 'Градуси, мінути та секунди'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Десяткові градуси'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'пн. ш.'; + + @override + String get coordinateDmsSouth => 'пд. ш.'; + + @override + String get coordinateDmsEast => 'сх. д.'; + + @override + String get coordinateDmsWest => 'зх. д.'; + + @override + String get displayRefreshRatePreferHighest => 'Найвища частота'; + + @override + String get displayRefreshRatePreferLowest => 'Найнижча частота'; + + @override + String get keepScreenOnNever => 'Ніколи'; + + @override + String get keepScreenOnVideoPlayback => 'Під час відтворення відео'; + + @override + String get keepScreenOnViewerOnly => 'Тільки сторінка для перегляду'; + + @override + String get keepScreenOnAlways => 'Завжди'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Карти'; + + @override + String get mapStyleGoogleHybrid => 'Google Карти (Гібрид)'; + + @override + String get mapStyleGoogleTerrain => 'Google Карти (Місцевість)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Ніколи'; + + @override + String get maxBrightnessAlways => 'Завжди'; + + @override + String get nameConflictStrategyRename => 'Перейменувати'; + + @override + String get nameConflictStrategyReplace => 'Замінити'; + + @override + String get nameConflictStrategySkip => 'Пропустити'; + + @override + String get overlayHistogramNone => 'Нічого'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Яскравість'; + + @override + String get subtitlePositionTop => 'Зверху'; + + @override + String get subtitlePositionBottom => 'Знизу'; + + @override + String get themeBrightnessLight => 'Світла'; + + @override + String get themeBrightnessDark => 'Темна'; + + @override + String get themeBrightnessBlack => 'Чорна'; + + @override + String get unitSystemMetric => 'Метричні'; + + @override + String get unitSystemImperial => 'Англійські'; + + @override + String get vaultLockTypePattern => 'Шаблон'; + + @override + String get vaultLockTypePin => 'Пін-код'; + + @override + String get vaultLockTypePassword => 'Пароль'; + + @override + String get settingsVideoEnablePip => 'Картинка в картинці'; + + @override + String get videoControlsPlayOutside => 'Відкрити в іншому відеоплеєрі'; + + @override + String get videoLoopModeNever => 'Ніколи'; + + @override + String get videoLoopModeShortOnly => 'Тільки короткі відео'; + + @override + String get videoLoopModeAlways => 'Завжди'; + + @override + String get videoPlaybackSkip => 'Пропустити'; + + @override + String get videoPlaybackMuted => 'Відтворити без звуку'; + + @override + String get videoPlaybackWithSound => 'Відтворити зі звуком'; + + @override + String get videoResumptionModeNever => 'Ніколи'; + + @override + String get videoResumptionModeAlways => 'Завжди'; + + @override + String get viewerTransitionSlide => 'Ковзання'; + + @override + String get viewerTransitionParallax => 'Паралакс'; + + @override + String get viewerTransitionFade => 'Згасання'; + + @override + String get viewerTransitionZoomIn => 'Збільшити'; + + @override + String get viewerTransitionNone => 'Нічого'; + + @override + String get wallpaperTargetHome => 'Головний екран'; + + @override + String get wallpaperTargetLock => 'Екран блокування'; + + @override + String get wallpaperTargetHomeLock => 'Головний екран та екран блокування'; + + @override + String get widgetDisplayedItemRandom => 'Випадковий'; + + @override + String get widgetDisplayedItemMostRecent => 'Нещодавний'; + + @override + String get widgetOpenPageHome => 'Відкрити головну сторінку'; + + @override + String get widgetOpenPageCollection => 'Відкрити колекцію'; + + @override + String get widgetOpenPageViewer => 'Відкрити переглядач'; + + @override + String get widgetTapUpdateWidget => 'Оновити віджет'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Внутрішня пам\'ять'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD картка'; + + @override + String get rootDirectoryDescription => 'кореневий каталог'; + + @override + String otherDirectoryDescription(String name) { + return 'каталог «$name»'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Будь ласка, виберіть $directory на накопичувачі «$volume» на наступному екрані, щоб надати цьому додатку доступ до нього.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Цьому додатку не дозволяється змінювати файли в каталозі $directory накопичувача «$volume».\n\nБудь ласка, використовуйте попередньо встановлений файловий менеджер або галерею, щоб перемістити об\'єкти в інший каталог.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Для завершення цієї операції потрібно $neededSize вільного місця на «$volume», але залишилося тільки $freeSize.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Системний додаток вибору файлів відсутній або вимкнений. Будь ласка, увімкніть його та повторіть спробу.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Ця операція не підтримується для об\'єктів таких форматів $types.', + one: 'Ця операція не підтримується для об\'єктів такого формату: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Деякі файли в теці призначення мають одну й ту саму назву.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Деякі файли мають одну й ту саму назву.'; + + @override + String get addShortcutDialogLabel => 'Назва ярлика'; + + @override + String get addShortcutButtonLabel => 'ДОДАТИ'; + + @override + String get noMatchingAppDialogMessage => 'Не існує додатків, які могли б з цим впоратися.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Перемістити ці $count елементів у кошик?', + few: 'Перемістити ці $count елементи у кошик?', + one: 'Перемістити цей елемент у кошик?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Видалити ці $count елементів?', + few: 'Видалити ці $count елементи?', + one: 'Видалити цей елемент?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Зберегти дати елементів перед тим, як продовжити?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Зберегти дати'; + + @override + String videoResumeDialogMessage(String time) { + return 'Ви хочете продовжити відтворення з $time?'; + } + + @override + String get videoStartOverButtonLabel => 'ВІДТВОРИТИ СПОЧАТКУ'; + + @override + String get videoResumeButtonLabel => 'ВІДНОВИТИ'; + + @override + String get setCoverDialogLatest => 'Останній елемент'; + + @override + String get setCoverDialogAuto => 'Авто'; + + @override + String get setCoverDialogCustom => 'Власний'; + + @override + String get hideFilterConfirmationDialogMessage => 'Відповідні фотографії та відео будуть приховані з вашої колекції. Ви можете показати їх знову в налаштуваннях у розділі \"Конфіденційність\".\n\nВи впевнені, що хочете їх приховати?'; + + @override + String get newAlbumDialogTitle => 'Новий альбом'; + + @override + String get newAlbumDialogNameLabel => 'Назва альбому'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Альбом вже існує'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Каталог вже існує'; + + @override + String get newAlbumDialogStorageLabel => 'Накопичувач:'; + + @override + String get newDynamicAlbumDialogTitle => 'Новий динамічний альбом'; + + @override + String get dynamicAlbumAlreadyExists => 'Динамічний альбом уже існує'; + + @override + String get newGroupDialogTitle => 'Нова група'; + + @override + String get newGroupDialogNameLabel => 'Назва групи'; + + @override + String get groupAlreadyExists => 'Група вже існує'; + + @override + String get groupEmpty => 'Груп немає'; + + @override + String get ungrouped => 'Не згруповані'; + + @override + String get groupPickerTitle => 'Обрати групу'; + + @override + String get groupPickerUseThisGroupButton => 'Використати цю групу'; + + @override + String get newVaultWarningDialogMessage => 'Елементи у сховищах доступні лише для цього додатка і ні для кого іншого.\n\nЯкщо ви видалите цей додаток або очистите дані додатку, ви втратите всі ці елементи.'; + + @override + String get newVaultDialogTitle => 'Нове сховище'; + + @override + String get configureVaultDialogTitle => 'Налаштування сховища'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Заблокувати, коли екран вимикається'; + + @override + String get vaultDialogLockTypeLabel => 'Тип блокування'; + + @override + String get patternDialogEnter => 'Введіть шаблон'; + + @override + String get patternDialogConfirm => 'Підтвердіть шаблон'; + + @override + String get pinDialogEnter => 'Введіть пін-код'; + + @override + String get pinDialogConfirm => 'Підтвердити пін-код'; + + @override + String get passwordDialogEnter => 'Введіть пароль'; + + @override + String get passwordDialogConfirm => 'Підтвердити пароль'; + + @override + String get authenticateToConfigureVault => 'Пройдіть автентифікацію, щоб налаштувати сховище'; + + @override + String get authenticateToUnlockVault => 'Пройдіть автентифікацію, щоб розблокувати сховище'; + + @override + String get vaultBinUsageDialogMessage => 'У деяких сховищах використовується кошик.'; + + @override + String get renameAlbumDialogLabel => 'Нова назва'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Каталог вже існує'; + + @override + String get renameEntrySetPageTitle => 'Перейменувати'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Зразок найменування'; + + @override + String get renameEntrySetPageInsertTooltip => 'Поле для вставки'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Попередній перегляд'; + + @override + String get renameProcessorCounter => 'Лічильник'; + + @override + String get renameProcessorHash => 'Хеш'; + + @override + String get renameProcessorName => 'Назва'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Видалити цей альбом і $count елементів у ньому?', + few: 'Видалити цей альбом і $count елементи у ньому?', + one: 'Видалити цей альбом і елемент у ньому?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Видалити ці альбоми та $count елементів в них?', + few: 'Видалити ці альбоми та $count елементи в них?', + one: 'Видалити ці альбоми та елемент в них?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Формат:'; + + @override + String get exportEntryDialogWidth => 'Ширина'; + + @override + String get exportEntryDialogHeight => 'Висота'; + + @override + String get exportEntryDialogQuality => 'Якість'; + + @override + String get exportEntryDialogWriteMetadata => 'Напишіть метадані'; + + @override + String get renameEntryDialogLabel => 'Нова назва'; + + @override + String get editEntryDialogCopyFromItem => 'Скопіювати з іншого елемента'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Поля для редагування'; + + @override + String get editEntryDateDialogTitle => 'Дата та час'; + + @override + String get editEntryDateDialogSetCustom => 'Встановити власну дату'; + + @override + String get editEntryDateDialogCopyField => 'Копіювати з іншої дати'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Витягти з заголовку'; + + @override + String get editEntryDateDialogShift => 'Зрушення'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Дата внесення змін до файлу'; + + @override + String get durationDialogHours => 'Години'; + + @override + String get durationDialogMinutes => 'Хвилини'; + + @override + String get durationDialogSeconds => 'Секунди'; + + @override + String get editEntryLocationDialogTitle => 'Місцезнаходження'; + + @override + String get editEntryLocationDialogSetCustom => 'Встановити власне місцезнаходження'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Вибрати на карті'; + + @override + String get editEntryLocationDialogImportGpx => 'Імпорт GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Широта'; + + @override + String get editEntryLocationDialogLongitude => 'Довгота'; + + @override + String get editEntryLocationDialogTimeShift => 'Зсув часу'; + + @override + String get locationPickerUseThisLocationButton => 'Використовувать це місце'; + + @override + String get editEntryRatingDialogTitle => 'Рейтинг'; + + @override + String get removeEntryMetadataDialogTitle => 'Видалення метаданих'; + + @override + String get removeEntryMetadataDialogAll => 'Все'; + + @override + String get removeEntryMetadataDialogMore => 'Більше'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP потрібен для відтворення відео всередині фотографії з рухом.\n\nВи впевнені, що хочете його видалити?'; + + @override + String get videoSpeedDialogLabel => 'Швидкість відтворення'; + + @override + String get videoStreamSelectionDialogVideo => 'Відео'; + + @override + String get videoStreamSelectionDialogAudio => 'Аудіо'; + + @override + String get videoStreamSelectionDialogText => 'Субтитри'; + + @override + String get videoStreamSelectionDialogOff => 'Вимкнути'; + + @override + String get videoStreamSelectionDialogTrack => 'Доріжка'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Інших доріжок немає.'; + + @override + String get genericSuccessFeedback => 'Готово!'; + + @override + String get genericFailureFeedback => 'Не вдалося'; + + @override + String get genericDangerWarningDialogMessage => 'Ви впевнені?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Спробуйте ще раз з меншою кількістю елементів.'; + + @override + String get menuActionConfigureView => 'Вигляд'; + + @override + String get menuActionSelect => 'Вибрати'; + + @override + String get menuActionSelectAll => 'Вибрати все'; + + @override + String get menuActionSelectNone => 'Зняти виділення'; + + @override + String get menuActionMap => 'Карта'; + + @override + String get menuActionSlideshow => 'Слайд-шоу'; + + @override + String get menuActionStats => 'Статистика'; + + @override + String get viewDialogSortSectionTitle => 'Сортувати'; + + @override + String get viewDialogGroupSectionTitle => 'Розділи'; + + @override + String get viewDialogLayoutSectionTitle => 'Макет'; + + @override + String get viewDialogReverseSortOrder => 'Зворотній порядок сортування'; + + @override + String get tileLayoutMosaic => 'Мозаїка'; + + @override + String get tileLayoutGrid => 'Сітка'; + + @override + String get tileLayoutList => 'Список'; + + @override + String get castDialogTitle => 'Пристрої трансляції'; + + @override + String get coverDialogTabCover => 'Обкладинка'; + + @override + String get coverDialogTabApp => 'Додаток'; + + @override + String get coverDialogTabColor => 'Колір'; + + @override + String get appPickDialogTitle => 'Вибрати додаток'; + + @override + String get appPickDialogNone => 'Нічого'; + + @override + String get aboutPageTitle => 'Про нас'; + + @override + String get aboutLinkLicense => 'Ліцензія'; + + @override + String get aboutLinkPolicy => 'Політика конфіденційності'; + + @override + String get aboutBugSectionTitle => 'Повідомити про помилку'; + + @override + String get aboutBugSaveLogInstruction => 'Зберегти логи додатка у файл'; + + @override + String get aboutBugCopyInfoInstruction => 'Копіювати системну інформацію'; + + @override + String get aboutBugCopyInfoButton => 'Копіювати'; + + @override + String get aboutBugReportInstruction => 'Надіслати звіт про помилку на GitHub разом із логами та системною інформацією'; + + @override + String get aboutBugReportButton => 'Надіслати звіт'; + + @override + String get aboutDataUsageSectionTitle => 'Використання даних'; + + @override + String get aboutDataUsageData => 'Дані'; + + @override + String get aboutDataUsageCache => 'Кеш'; + + @override + String get aboutDataUsageDatabase => 'База даних'; + + @override + String get aboutDataUsageMisc => 'Різне'; + + @override + String get aboutDataUsageInternal => 'Внутрішній'; + + @override + String get aboutDataUsageExternal => 'Зовнішній'; + + @override + String get aboutDataUsageClearCache => 'Очистити кеш'; + + @override + String get aboutCreditsSectionTitle => 'Подяки'; + + @override + String get aboutCreditsWorldAtlas1 => 'Цей додаток використовує файл TopoJSON із'; + + @override + String get aboutCreditsWorldAtlas2 => 'за ліцензією ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'Перекладачі'; + + @override + String get aboutLicensesSectionTitle => 'Ліцензії з відкритим вихідним кодом'; + + @override + String get aboutLicensesBanner => 'Цей додаток використовує наступні пакети та бібліотеки з відкритим вихідним кодом.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Бібліотеки Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Плагіни Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Пакети Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Пакети Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Показати всі ліцензії'; + + @override + String get policyPageTitle => 'Політика конфіденційності'; + + @override + String get collectionPageTitle => 'Колекція'; + + @override + String get collectionPickPageTitle => 'Вибрати'; + + @override + String get collectionSelectPageTitle => 'Виберіть елементи'; + + @override + String get collectionActionShowTitleSearch => 'Показати фільтр заголовка'; + + @override + String get collectionActionHideTitleSearch => 'Приховати фільтр заголовка'; + + @override + String get collectionActionAddDynamicAlbum => 'Додати динамічний альбом'; + + @override + String get collectionActionAddShortcut => 'Додати ярлик'; + + @override + String get collectionActionSetHome => 'Встановити як головну'; + + @override + String get collectionActionEmptyBin => 'Очистити кошик'; + + @override + String get collectionActionCopy => 'Скопіювати в альбом'; + + @override + String get collectionActionMove => 'Перемістити до альбому'; + + @override + String get collectionActionRescan => 'Повторне сканування'; + + @override + String get collectionActionEdit => 'Редагувати'; + + @override + String get collectionSearchTitlesHintText => 'Пошук заголовків'; + + @override + String get collectionGroupAlbum => 'По альбому'; + + @override + String get collectionGroupMonth => 'По місяцю'; + + @override + String get collectionGroupDay => 'По дню'; + + @override + String get sectionNone => 'Розділів немає'; + + @override + String get sectionUnknown => 'Невідомо'; + + @override + String get dateToday => 'Сьогодні'; + + @override + String get dateYesterday => 'Вчора'; + + @override + String get dateThisMonth => 'У цьому місяці'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не вдалося видалити $count елементів', + few: 'Не вдалося видалити $count елементи', + one: 'Не вдалося видалити 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не вдалося скопіювати $count елементів', + few: 'Не вдалося скопіювати $count елементи', + one: 'Не вдалося скопіювати 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не вдалося перенести $count елементів', + few: 'Не вдалося перенести $count елементи', + one: 'Не вдалося перенести 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не вдалося перейменувати $count елементів', + few: 'Не вдалося перейменувати $count елементи', + one: 'Не вдалося перейменувати 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не вдалося відредагувати $count елементів', + few: 'Не вдалося відредагувати $count елементи', + one: 'Не вдалося відредагувати 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Не вдалося експортувати $count сторінок', + few: 'Не вдалося експортувати $count сторіноки', + one: 'Не вдалося експортувати 1 сторінку', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Скопійовано $count елементів', + few: 'Скопійовано $count елементи', + one: 'Скопійовано 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Переміщено $count елементів', + few: 'Переміщено $count елементи', + one: 'Переміщено 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Перейменовано $count елементів', + few: 'Перейменовано $count елементи', + one: 'Перейменовано 1 елемент', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Відредаговано $count елементів', + few: 'Відредаговано $count елементи', + one: 'Відредаговано 1 елемент', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Немає обраних'; + + @override + String get collectionEmptyVideos => 'Немає відео'; + + @override + String get collectionEmptyImages => 'Немає зображень'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Надайте доступ'; + + @override + String get collectionSelectSectionTooltip => 'Вибрати розділ'; + + @override + String get collectionDeselectSectionTooltip => 'Зняти вибір із розділу'; + + @override + String get drawerAboutButton => 'Про нас'; + + @override + String get drawerSettingsButton => 'Налаштування'; + + @override + String get drawerCollectionAll => 'Вся колекція'; + + @override + String get drawerCollectionFavourites => 'Обране'; + + @override + String get drawerCollectionImages => 'Зображення'; + + @override + String get drawerCollectionVideos => 'Відео'; + + @override + String get drawerCollectionAnimated => 'Анімації'; + + @override + String get drawerCollectionMotionPhotos => 'Фото з рухом'; + + @override + String get drawerCollectionPanoramas => 'Панорами'; + + @override + String get drawerCollectionRaws => 'Raw фотографії'; + + @override + String get drawerCollectionSphericalVideos => '360° Відео'; + + @override + String get drawerAlbumPage => 'Альбоми'; + + @override + String get drawerCountryPage => 'Країни'; + + @override + String get drawerPlacePage => 'Локації'; + + @override + String get drawerTagPage => 'Теги'; + + @override + String get sortByDate => 'За датою'; + + @override + String get sortByName => 'За назвою'; + + @override + String get sortByItemCount => 'За кількістю елементів'; + + @override + String get sortBySize => 'За розміром'; + + @override + String get sortByAlbumFileName => 'За назвою альбому та елемента'; + + @override + String get sortByRating => 'За рейтингом'; + + @override + String get sortByDuration => 'За тривалістю'; + + @override + String get sortByPath => 'За шляхом'; + + @override + String get sortOrderNewestFirst => 'Найновіші перші'; + + @override + String get sortOrderOldestFirst => 'Найстаріші перші'; + + @override + String get sortOrderAtoZ => 'Від А до Я'; + + @override + String get sortOrderZtoA => 'Від Я до А'; + + @override + String get sortOrderHighestFirst => 'Спочатку з високим'; + + @override + String get sortOrderLowestFirst => 'Спочатку з низьким'; + + @override + String get sortOrderLargestFirst => 'Спочатку великі'; + + @override + String get sortOrderSmallestFirst => 'Спочатку маленькі'; + + @override + String get sortOrderShortestFirst => 'Спершу найкоротше'; + + @override + String get sortOrderLongestFirst => 'Спершу найдовше'; + + @override + String get albumGroupTier => 'За рівнем'; + + @override + String get albumGroupType => 'За типом'; + + @override + String get albumGroupVolume => 'За накопичувачем'; + + @override + String get albumMimeTypeMixed => 'Змішані'; + + @override + String get albumPickPageTitleCopy => 'Копіювати в Альбом'; + + @override + String get albumPickPageTitleExport => 'Експортувати до Альбому'; + + @override + String get albumPickPageTitleMove => 'Перемістити до Альбому'; + + @override + String get albumPickPageTitlePick => 'Вибрати Альбом'; + + @override + String get albumCamera => 'Камера'; + + @override + String get albumDownload => 'Завантаження'; + + @override + String get albumScreenshots => 'Скріншоти'; + + @override + String get albumScreenRecordings => 'Записи екрану'; + + @override + String get albumVideoCaptures => 'Відеозаписи'; + + @override + String get albumPageTitle => 'Альбоми'; + + @override + String get albumEmpty => 'Немає альбомів'; + + @override + String get createAlbumButtonLabel => 'СТВОРИТИ'; + + @override + String get newFilterBanner => 'новий'; + + @override + String get countryPageTitle => 'Країни'; + + @override + String get countryEmpty => 'Немає країн'; + + @override + String get statePageTitle => 'Штати'; + + @override + String get stateEmpty => 'Немає штатів'; + + @override + String get placePageTitle => 'Локації'; + + @override + String get placeEmpty => 'Немає локацій'; + + @override + String get tagPageTitle => 'Теги'; + + @override + String get tagEmpty => 'Немає тегів'; + + @override + String get tagPickPageTitle => 'Вибрати тег'; + + @override + String get binPageTitle => 'Кошик'; + + @override + String get explorerPageTitle => 'Провідник'; + + @override + String get explorerActionSelectStorageVolume => 'Обрати сховище'; + + @override + String get selectStorageVolumeDialogTitle => 'Оберіть сховище'; + + @override + String get searchCollectionFieldHint => 'Пошук колекцій'; + + @override + String get searchRecentSectionTitle => 'Нещодавні'; + + @override + String get searchDateSectionTitle => 'Дата'; + + @override + String get searchFormatSectionTitle => 'Формати'; + + @override + String get searchAlbumsSectionTitle => 'Альбоми'; + + @override + String get searchCountriesSectionTitle => 'Країни'; + + @override + String get searchStatesSectionTitle => 'Штати'; + + @override + String get searchPlacesSectionTitle => 'Локації'; + + @override + String get searchTagsSectionTitle => 'Теги'; + + @override + String get searchRatingSectionTitle => 'Рейтинги'; + + @override + String get searchMetadataSectionTitle => 'Метадані'; + + @override + String get settingsPageTitle => 'Налаштування'; + + @override + String get settingsSystemDefault => 'Як у системі'; + + @override + String get settingsDefault => 'За замовчуванням'; + + @override + String get settingsDisabled => 'Вимкнено'; + + @override + String get settingsEnabled => 'Увімкнено'; + + @override + String get settingsForced => 'Примусово'; + + @override + String get settingsAskEverytime => 'Запитувати щоразу'; + + @override + String get settingsModificationWarningDialogMessage => 'Інші параметри будуть змінені.'; + + @override + String get settingsSearchFieldLabel => 'Пошук налаштувань'; + + @override + String get settingsSearchEmpty => 'Немає відповідного налаштування'; + + @override + String get settingsActionExport => 'Експорт'; + + @override + String get settingsActionExportDialogTitle => 'Експорт'; + + @override + String get settingsActionImport => 'Імпорт'; + + @override + String get settingsActionImportDialogTitle => 'Імпорт'; + + @override + String get appExportCovers => 'Обкладинки'; + + @override + String get appExportDynamicAlbums => 'Динамічні альбоми'; + + @override + String get appExportFavourites => 'Обране'; + + @override + String get appExportSettings => 'Налаштування'; + + @override + String get settingsNavigationSectionTitle => 'Навігація'; + + @override + String get settingsHomeTile => 'Головна'; + + @override + String get settingsHomeDialogTitle => 'Головна'; + + @override + String get setHomeCustom => 'Власне'; + + @override + String get settingsKeepScreenOnTile => 'Тримати екран увімкненим'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Тримати екран увімкненим'; + + @override + String get settingsDoubleBackExit => 'Двічі натисніть «назад», щоб вийти'; + + @override + String get settingsConfirmationTile => 'Діалоги підтвердження'; + + @override + String get settingsConfirmationDialogTitle => 'Діалоги підтвердження'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Запитати, перш ніж видаляти елементи назавжди'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Запитати перед тим, як переносити елементи до кошика'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Запитати перед переміщенням недатованих елементів'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Показувати повідомлення після переміщення елементів у кошик'; + + @override + String get settingsConfirmationVaultDataLoss => 'Показувати попередження про втрату даних сховища'; + + @override + String get settingsNavigationDrawerTile => 'Навігаційне меню'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Навігаційне меню'; + + @override + String get settingsNavigationDrawerBanner => 'Натисніть і утримуйте для переміщення та зміни порядку елементів меню.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Типи'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Альбоми'; + + @override + String get settingsNavigationDrawerTabPages => 'Сторінки'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Додати альбом'; + + @override + String get settingsNavigationBottomActionsTile => 'Нижня навігація'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Нижня навігація'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Торкніться та утримуйте, щоб переміщувати кнопки та вибирати дії, які відображаються на нижній панелі навігації.'; + + @override + String get settingsThumbnailSectionTitle => 'Мініатюри'; + + @override + String get settingsThumbnailOverlayTile => 'Накладення'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Накладення'; + + @override + String get settingsThumbnailShowHdrIcon => 'Показати іконку HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Показати іконку обраного'; + + @override + String get settingsThumbnailShowTagIcon => 'Показати іконку тегу'; + + @override + String get settingsThumbnailShowLocationIcon => 'Показати іконку місцезнаходження'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Показати іконку фото з рухом'; + + @override + String get settingsThumbnailShowRating => 'Показати рейтинг'; + + @override + String get settingsThumbnailShowRawIcon => 'Показати іконку raw'; + + @override + String get settingsThumbnailShowVideoDuration => 'Показати тривалість відео'; + + @override + String get settingsCollectionQuickActionsTile => 'Швидкі дії'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Швидкі дії'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Перегляд'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Вибір'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Торкніться і утримуйте для переміщення кнопок і вибору дій, які будуть відображатися при перегляді елементів.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Торкніться і утримуйте для переміщення кнопок і вибору дій, які будуть відображатися при виборі елементів.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Вибух візерунків'; + + @override + String get settingsCollectionBurstPatternsNone => 'Нічого'; + + @override + String get settingsViewerSectionTitle => 'Переглядач'; + + @override + String get settingsViewerGestureSideTapNext => 'Торкніться країв екрану, щоб показати попередній/наступний елемент'; + + @override + String get settingsViewerUseCutout => 'Використовувати область вирізу'; + + @override + String get settingsViewerMaximumBrightness => 'Максимальна яскравість'; + + @override + String get settingsMotionPhotoAutoPlay => 'Автоматичне відтворення фотографій з рухом'; + + @override + String get settingsImageBackground => 'Фон зображення'; + + @override + String get settingsViewerQuickActionsTile => 'Швидкі дії'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Швидкі дії'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Торкніться і утримуйте для переміщення кнопок і вибору дій, які відображатимуться у переглядачі.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Відображувані кнопки'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Доступні кнопки'; + + @override + String get settingsViewerQuickActionEmpty => 'Немає кнопок'; + + @override + String get settingsViewerOverlayTile => 'Накладення'; + + @override + String get settingsViewerOverlayPageTitle => 'Накладення'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Показати при відкритті'; + + @override + String get settingsViewerShowHistogram => 'Показати гістограму'; + + @override + String get settingsViewerShowMinimap => 'Показати міні-карту'; + + @override + String get settingsViewerShowZoomLevel => 'Показати рівень масштабування'; + + @override + String get settingsViewerShowInformation => 'Показати інформацію'; + + @override + String get settingsViewerShowInformationSubtitle => 'Показувати заголовок, дату, місцезнаходження тощо.'; + + @override + String get settingsViewerShowRatingTags => 'Показати рейтинг та теги'; + + @override + String get settingsViewerShowShootingDetails => 'Показати деталі зйомки'; + + @override + String get settingsViewerShowDescription => 'Показати опис'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Показати мініатюри'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Ефект розмиття'; + + @override + String get settingsViewerSlideshowTile => 'Слайд-шоу'; + + @override + String get settingsViewerSlideshowPageTitle => 'Слайд-шоу'; + + @override + String get settingsSlideshowRepeat => 'Повторення'; + + @override + String get settingsSlideshowShuffle => 'Перемішати'; + + @override + String get settingsSlideshowFillScreen => 'Заповнити екрану'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Анімований ефект масштабування'; + + @override + String get settingsSlideshowTransitionTile => 'Перехід'; + + @override + String get settingsSlideshowIntervalTile => 'Інтервал'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Відтворення відео'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Відтворення відео'; + + @override + String get settingsVideoPageTitle => 'Налаштування відео'; + + @override + String get settingsVideoSectionTitle => 'Відео'; + + @override + String get settingsVideoShowVideos => 'Показувати відео'; + + @override + String get settingsVideoPlaybackTile => 'Відтворення'; + + @override + String get settingsVideoPlaybackPageTitle => 'Відтворення'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Апаратне прискорення'; + + @override + String get settingsVideoAutoPlay => 'Автоматичне відтворення'; + + @override + String get settingsVideoLoopModeTile => 'Циклічний режим'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Циклічний режим'; + + @override + String get settingsVideoResumptionModeTile => 'Продовжити відтворення'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Продовжити відтворення'; + + @override + String get settingsVideoBackgroundMode => 'Фоновий режим'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Фоновий режим'; + + @override + String get settingsVideoControlsTile => 'Елементи керування'; + + @override + String get settingsVideoControlsPageTitle => 'Елементи керування'; + + @override + String get settingsVideoButtonsTile => 'Кнопки'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Подвійний дотик для відтворення/паузи'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Подвійне натискання на краї екрану для переходу назад/вперед'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Проведіть пальцем угору або вниз, щоб налаштувати яскравість/гучність'; + + @override + String get settingsSubtitleThemeTile => 'Субтитри'; + + @override + String get settingsSubtitleThemePageTitle => 'Субтитри'; + + @override + String get settingsSubtitleThemeSample => 'Це зразок.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Вирівнювання тексту'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Вирівнювання тексту'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Положення тексту'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Положення тексту'; + + @override + String get settingsSubtitleThemeTextSize => 'Розмір тексту'; + + @override + String get settingsSubtitleThemeShowOutline => 'Показати контур і тінь'; + + @override + String get settingsSubtitleThemeTextColor => 'Колір тексту'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Непрозорість тексту'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Колір фону'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Непрозорість фону'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Ліворуч'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Центр'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Праворуч'; + + @override + String get settingsPrivacySectionTitle => 'Конфіденційність'; + + @override + String get settingsAllowInstalledAppAccess => 'Дозволити доступ до інвентарю додатків'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Використовується для покращення відображення альбомів'; + + @override + String get settingsAllowErrorReporting => 'Дозволити анонімну відправку повідомлень про помилки'; + + @override + String get settingsSaveSearchHistory => 'Зберігати історію пошуку'; + + @override + String get settingsEnableBin => 'Використовувати кошик'; + + @override + String get settingsEnableBinSubtitle => 'Зберігає видалені елементи протягом 30 днів'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Елементи в кошику буде видалено назавжди.'; + + @override + String get settingsAllowMediaManagement => 'Дозволити керування мультимедіа'; + + @override + String get settingsHiddenItemsTile => 'Приховані елементи'; + + @override + String get settingsHiddenItemsPageTitle => 'Приховані елементи'; + + @override + String get settingsHiddenFiltersBanner => 'Фотографії та відео, що відповідають прихованим фільтрам, не з\'являться у вашій колекції.'; + + @override + String get settingsHiddenFiltersEmpty => 'Немає прихованих фільтрів'; + + @override + String get settingsStorageAccessTile => 'Доступ до сховища'; + + @override + String get settingsStorageAccessPageTitle => 'Доступ до сховища'; + + @override + String get settingsStorageAccessBanner => 'Деякі каталоги вимагають явного надання доступу для зміни файлів в них. Ви можете переглянути тут каталоги, до яких ви раніше надавали доступ.'; + + @override + String get settingsStorageAccessEmpty => 'Доступ не наданий'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Відкликати'; + + @override + String get settingsAccessibilitySectionTitle => 'Спеціальні можливості'; + + @override + String get settingsRemoveAnimationsTile => 'Видалити анімації'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Видалити анімації'; + + @override + String get settingsTimeToTakeActionTile => 'Час на виконання'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Показувати альтернативи мультисенсорним жестам'; + + @override + String get settingsDisplaySectionTitle => 'Відображення'; + + @override + String get settingsThemeBrightnessTile => 'Тема'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Тема'; + + @override + String get settingsThemeColorHighlights => 'Кольорові акценти'; + + @override + String get settingsThemeEnableDynamicColor => 'Динамічний колір'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Частота оновлення дисплея'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Частота оновлення'; + + @override + String get settingsDisplayUseTvInterface => 'Інтерфейс Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Мова та формати'; + + @override + String get settingsLanguageTile => 'Мова'; + + @override + String get settingsLanguagePageTitle => 'Мова'; + + @override + String get settingsCoordinateFormatTile => 'Формат координат'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Формат координат'; + + @override + String get settingsUnitSystemTile => 'Одиниці виміру'; + + @override + String get settingsUnitSystemDialogTitle => 'Одиниці виміру'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Примусові арабські цифри'; + + @override + String get settingsScreenSaverPageTitle => 'Заставка на екран'; + + @override + String get settingsWidgetPageTitle => 'Фоторамка'; + + @override + String get settingsWidgetShowOutline => 'Виділення'; + + @override + String get settingsWidgetOpenPage => 'При натисканні на віджет'; + + @override + String get settingsWidgetDisplayedItem => 'Відображаємий елемент'; + + @override + String get settingsCollectionTile => 'Колекція'; + + @override + String get statsPageTitle => 'Статистика'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count елементів з місцезнаходженням', + few: '$count елементи з місцезнаходженням', + one: '1 елемент з місцезнаходженням', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Топ Країн'; + + @override + String get statsTopStatesSectionTitle => 'Топ штатів'; + + @override + String get statsTopPlacesSectionTitle => 'Топ локацій'; + + @override + String get statsTopTagsSectionTitle => 'Топ Тегів'; + + @override + String get statsTopAlbumsSectionTitle => 'Топ альбомів'; + + @override + String get viewerOpenPanoramaButtonLabel => 'ВІДКРИТИ ПАНОРАМУ'; + + @override + String get viewerSetWallpaperButtonLabel => 'ЗМІНИТИ ШПАЛЕРИ'; + + @override + String get viewerErrorUnknown => 'Упс!'; + + @override + String get viewerErrorDoesNotExist => 'Файлу більше не існує.'; + + @override + String get viewerInfoPageTitle => 'Інформація'; + + @override + String get viewerInfoBackToViewerTooltip => 'Повернутися до перегляду'; + + @override + String get viewerInfoUnknown => 'невідомий'; + + @override + String get viewerInfoLabelDescription => 'Опис'; + + @override + String get viewerInfoLabelTitle => 'Заголовок'; + + @override + String get viewerInfoLabelDate => 'Дата'; + + @override + String get viewerInfoLabelResolution => 'Роздільна здатність'; + + @override + String get viewerInfoLabelSize => 'Розмір'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Шлях'; + + @override + String get viewerInfoLabelDuration => 'Тривалість'; + + @override + String get viewerInfoLabelOwner => 'Власник'; + + @override + String get viewerInfoLabelCoordinates => 'Координати'; + + @override + String get viewerInfoLabelAddress => 'Адреса'; + + @override + String get mapStyleDialogTitle => 'Стиль карти'; + + @override + String get mapStyleDialogAddStyle => 'Додати стиль'; + + @override + String get mapStyleTooltip => 'Виберіть стиль карти'; + + @override + String get mapStyleEditorDialogName => 'Ім\'я'; + + @override + String get mapStyleEditorDialogUrl => 'URL-адреса'; + + @override + String get mapStyleEditorDialogSubdomains => 'Субдомени'; + + @override + String get mapStyleEditorDialogUserAgent => 'Користувацький агент'; + + @override + String get mapZoomInTooltip => 'Збільшити'; + + @override + String get mapZoomOutTooltip => 'Зменшити'; + + @override + String get mapPointNorthUpTooltip => 'Повернути на північ'; + + @override + String get mapAttributionOsmData => 'Картографічні дані © [OpenStreetMap](https://www.openstreetmap.org/copyright) помічники'; + + @override + String get mapAttributionOsmLiberty => 'Плитки від [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Розміщено на [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Плитки від [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Плитки [HOT](https://www.hotosm.org/) • Розміщена на [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Плитки [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Переглянути на карті'; + + @override + String get mapEmptyRegion => 'Зображень у цьому регіоні немає'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Не вдалося витягти вбудовані дані'; + + @override + String get viewerInfoOpenLinkText => 'Відкрити'; + + @override + String get viewerInfoViewXmlLinkText => 'Переглянути XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Пошук метаданих'; + + @override + String get viewerInfoSearchEmpty => 'Немає співпадаючих ключів'; + + @override + String get viewerInfoSearchSuggestionDate => 'Дата та час'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Опис'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Розміри'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Роздільна здатність'; + + @override + String get viewerInfoSearchSuggestionRights => 'Права'; + + @override + String get wallpaperUseScrollEffect => 'Використовувати ефект прокрутки на головному екрані'; + + @override + String get tagEditorPageTitle => 'Редагування тегів'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Новий тег'; + + @override + String get tagEditorPageAddTagTooltip => 'Додати тег'; + + @override + String get tagEditorSectionRecent => 'Нещодавні'; + + @override + String get tagEditorSectionPlaceholders => 'Заповнювачі'; + + @override + String get tagEditorDiscardDialogMessage => 'Ви хочете відмовитися від змін?'; + + @override + String get tagPlaceholderCountry => 'Країна'; + + @override + String get tagPlaceholderState => 'Штат'; + + @override + String get tagPlaceholderPlace => 'Локація'; + + @override + String get panoramaEnableSensorControl => 'Увімкнути сенсорне керування'; + + @override + String get panoramaDisableSensorControl => 'Вимкнути сенсорне керування'; + + @override + String get sourceViewerPageTitle => 'Джерело'; +} diff --git a/lib/l10ngen/app_localizations_ur.dart b/lib/l10ngen/app_localizations_ur.dart new file mode 100644 index 0000000..25b2afc --- /dev/null +++ b/lib/l10ngen/app_localizations_ur.dart @@ -0,0 +1,2424 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Urdu (`ur`). +class AppLocalizationsUr extends AppLocalizations { + AppLocalizationsUr([String locale = 'ur']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Welcome to Aves'; + + @override + String get welcomeOptional => 'Optional'; + + @override + String get welcomeTermsToggle => 'I agree to the terms and conditions'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items', + one: '$countString item', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString columns', + one: '$countString column', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString seconds', + one: '$countString second', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString minutes', + one: '$countString minute', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString days', + one: '$countString day', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => 'APPLY'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'DELETE'; + + @override + String get nextButtonLabel => 'NEXT'; + + @override + String get showButtonLabel => 'SHOW'; + + @override + String get hideButtonLabel => 'HIDE'; + + @override + String get continueButtonLabel => 'CONTINUE'; + + @override + String get saveCopyButtonLabel => 'SAVE COPY'; + + @override + String get applyTooltip => 'Apply'; + + @override + String get cancelTooltip => 'Cancel'; + + @override + String get changeTooltip => 'Change'; + + @override + String get clearTooltip => 'Clear'; + + @override + String get previousTooltip => 'Previous'; + + @override + String get nextTooltip => 'Next'; + + @override + String get showTooltip => 'Show'; + + @override + String get hideTooltip => 'Hide'; + + @override + String get actionRemove => 'Remove'; + + @override + String get resetTooltip => 'Reset'; + + @override + String get saveTooltip => 'Save'; + + @override + String get stopTooltip => 'Stop'; + + @override + String get pickTooltip => 'Pick'; + + @override + String get doubleBackExitMessage => 'Tap “back” again to exit.'; + + @override + String get doNotAskAgain => 'Do not ask again'; + + @override + String get sourceStateLoading => 'Loading'; + + @override + String get sourceStateCataloguing => 'Cataloguing'; + + @override + String get sourceStateLocatingCountries => 'Locating countries'; + + @override + String get sourceStateLocatingPlaces => 'Locating places'; + + @override + String get chipActionDelete => 'Delete'; + + @override + String get chipActionRemove => 'Remove'; + + @override + String get chipActionShowCollection => 'Show in Collection'; + + @override + String get chipActionGoToAlbumPage => 'Show in Albums'; + + @override + String get chipActionGoToCountryPage => 'Show in Countries'; + + @override + String get chipActionGoToPlacePage => 'Show in Places'; + + @override + String get chipActionGoToTagPage => 'Show in Tags'; + + @override + String get chipActionGoToExplorerPage => 'Show in Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Filter out'; + + @override + String get chipActionFilterIn => 'Filter in'; + + @override + String get chipActionHide => 'Hide'; + + @override + String get chipActionLock => 'Lock'; + + @override + String get chipActionPin => 'Pin to top'; + + @override + String get chipActionUnpin => 'Unpin from top'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Rename'; + + @override + String get chipActionSetCover => 'Set cover'; + + @override + String get chipActionShowCountryStates => 'Show states'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Create album'; + + @override + String get chipActionCreateVault => 'Create vault'; + + @override + String get chipActionConfigureVault => 'Configure vault'; + + @override + String get entryActionCopyToClipboard => 'Copy to clipboard'; + + @override + String get entryActionDelete => 'Delete'; + + @override + String get entryActionConvert => 'Convert'; + + @override + String get entryActionExport => 'Export'; + + @override + String get entryActionInfo => 'Info'; + + @override + String get entryActionRename => 'Rename'; + + @override + String get entryActionRestore => 'Restore'; + + @override + String get entryActionRotateCCW => 'Rotate counterclockwise'; + + @override + String get entryActionRotateCW => 'Rotate clockwise'; + + @override + String get entryActionFlip => 'Flip horizontally'; + + @override + String get entryActionPrint => 'Print'; + + @override + String get entryActionShare => 'Share'; + + @override + String get entryActionShareImageOnly => 'Share image only'; + + @override + String get entryActionShareVideoOnly => 'Share video only'; + + @override + String get entryActionViewSource => 'View source'; + + @override + String get entryActionShowGeoTiffOnMap => 'Show as map overlay'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Convert to still image'; + + @override + String get entryActionViewMotionPhotoVideo => 'Open video'; + + @override + String get entryActionEdit => 'Edit'; + + @override + String get entryActionOpen => 'Open with'; + + @override + String get entryActionSetAs => 'Set as'; + + @override + String get entryActionCast => 'Cast'; + + @override + String get entryActionOpenMap => 'Show in map app'; + + @override + String get entryActionRotateScreen => 'Rotate screen'; + + @override + String get entryActionAddFavourite => 'Add to favorites'; + + @override + String get entryActionRemoveFavourite => 'Remove from favorites'; + + @override + String get videoActionCaptureFrame => 'Capture frame'; + + @override + String get videoActionMute => 'Mute'; + + @override + String get videoActionUnmute => 'Unmute'; + + @override + String get videoActionPause => 'Pause'; + + @override + String get videoActionPlay => 'Play'; + + @override + String get videoActionReplay10 => 'Seek backward 10 seconds'; + + @override + String get videoActionSkip10 => 'Seek forward 10 seconds'; + + @override + String get videoActionShowPreviousFrame => 'Show previous frame'; + + @override + String get videoActionShowNextFrame => 'Show next frame'; + + @override + String get videoActionSelectStreams => 'Select tracks'; + + @override + String get videoActionSetSpeed => 'Playback speed'; + + @override + String get videoActionABRepeat => 'A-B repeat'; + + @override + String get videoRepeatActionSetStart => 'Set start'; + + @override + String get videoRepeatActionSetEnd => 'Set end'; + + @override + String get viewerActionSettings => 'Settings'; + + @override + String get viewerActionLock => 'Lock viewer'; + + @override + String get viewerActionUnlock => 'Unlock viewer'; + + @override + String get slideshowActionResume => 'Resume'; + + @override + String get slideshowActionShowInCollection => 'Show in Collection'; + + @override + String get entryInfoActionEditDate => 'Edit date & time'; + + @override + String get entryInfoActionEditLocation => 'Edit location'; + + @override + String get entryInfoActionEditTitleDescription => 'Edit title & description'; + + @override + String get entryInfoActionEditRating => 'Edit rating'; + + @override + String get entryInfoActionEditTags => 'Edit tags'; + + @override + String get entryInfoActionRemoveMetadata => 'Remove metadata'; + + @override + String get entryInfoActionExportMetadata => 'Export metadata'; + + @override + String get entryInfoActionRemoveLocation => 'Remove location'; + + @override + String get editorActionTransform => 'Transform'; + + @override + String get editorTransformCrop => 'Crop'; + + @override + String get editorTransformRotate => 'Rotate'; + + @override + String get cropAspectRatioFree => 'Free'; + + @override + String get cropAspectRatioOriginal => 'Original'; + + @override + String get cropAspectRatioSquare => 'Square'; + + @override + String get filterAspectRatioLandscapeLabel => 'Landscape'; + + @override + String get filterAspectRatioPortraitLabel => 'Portrait'; + + @override + String get filterBinLabel => 'Recycle bin'; + + @override + String get filterFavouriteLabel => 'Favorite'; + + @override + String get filterNoDateLabel => 'Undated'; + + @override + String get filterNoAddressLabel => 'No address'; + + @override + String get filterLocatedLabel => 'Located'; + + @override + String get filterNoLocationLabel => 'Unlocated'; + + @override + String get filterNoRatingLabel => 'Unrated'; + + @override + String get filterTaggedLabel => 'Tagged'; + + @override + String get filterNoTagLabel => 'Untagged'; + + @override + String get filterNoTitleLabel => 'Untitled'; + + @override + String get filterOnThisDayLabel => 'On this day'; + + @override + String get filterRecentlyAddedLabel => 'Recently added'; + + @override + String get filterRatingRejectedLabel => 'Rejected'; + + @override + String get filterTypeAnimatedLabel => 'Animated'; + + @override + String get filterTypeMotionPhotoLabel => 'Motion Photo'; + + @override + String get filterTypePanoramaLabel => 'Panorama'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Image'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Prevent screen effects'; + + @override + String get accessibilityAnimationsKeep => 'Keep screen effects'; + + @override + String get albumTierNew => 'New'; + + @override + String get albumTierPinned => 'Pinned'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Common'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => 'Vaults'; + + @override + String get albumTierDynamic => 'Dynamic'; + + @override + String get albumTierRegular => 'Others'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Decimal degrees'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => 'Highest rate'; + + @override + String get displayRefreshRatePreferLowest => 'Lowest rate'; + + @override + String get keepScreenOnNever => 'Never'; + + @override + String get keepScreenOnVideoPlayback => 'During video playback'; + + @override + String get keepScreenOnViewerOnly => 'Viewer page only'; + + @override + String get keepScreenOnAlways => 'Always'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hybrid)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Terrain)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => 'Never'; + + @override + String get maxBrightnessAlways => 'Always'; + + @override + String get nameConflictStrategyRename => 'Rename'; + + @override + String get nameConflictStrategyReplace => 'Replace'; + + @override + String get nameConflictStrategySkip => 'Skip'; + + @override + String get overlayHistogramNone => 'None'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Luminance'; + + @override + String get subtitlePositionTop => 'Top'; + + @override + String get subtitlePositionBottom => 'Bottom'; + + @override + String get themeBrightnessLight => 'Light'; + + @override + String get themeBrightnessDark => 'Dark'; + + @override + String get themeBrightnessBlack => 'Black'; + + @override + String get unitSystemMetric => 'Metric'; + + @override + String get unitSystemImperial => 'Imperial'; + + @override + String get vaultLockTypePattern => 'Pattern'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Password'; + + @override + String get settingsVideoEnablePip => 'Picture-in-picture'; + + @override + String get videoControlsPlayOutside => 'Open with other player'; + + @override + String get videoLoopModeNever => 'Never'; + + @override + String get videoLoopModeShortOnly => 'Short videos only'; + + @override + String get videoLoopModeAlways => 'Always'; + + @override + String get videoPlaybackSkip => 'Skip'; + + @override + String get videoPlaybackMuted => 'Play muted'; + + @override + String get videoPlaybackWithSound => 'Play with sound'; + + @override + String get videoResumptionModeNever => 'Never'; + + @override + String get videoResumptionModeAlways => 'Always'; + + @override + String get viewerTransitionSlide => 'Slide'; + + @override + String get viewerTransitionParallax => 'Parallax'; + + @override + String get viewerTransitionFade => 'Fade'; + + @override + String get viewerTransitionZoomIn => 'Zoom in'; + + @override + String get viewerTransitionNone => 'None'; + + @override + String get wallpaperTargetHome => 'Home screen'; + + @override + String get wallpaperTargetLock => 'Lock screen'; + + @override + String get wallpaperTargetHomeLock => 'Home and lock screens'; + + @override + String get widgetDisplayedItemRandom => 'Random'; + + @override + String get widgetDisplayedItemMostRecent => 'Most recent'; + + @override + String get widgetOpenPageHome => 'Open home'; + + @override + String get widgetOpenPageCollection => 'Open collection'; + + @override + String get widgetOpenPageViewer => 'Open viewer'; + + @override + String get widgetTapUpdateWidget => 'Update widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Internal storage'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD card'; + + @override + String get rootDirectoryDescription => 'root directory'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” directory'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Please select the $directory of “$volume” in the next screen to give this app access to it.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'This app is not allowed to modify files in the $directory of “$volume”.\n\nPlease use a pre-installed file manager or gallery app to move the items to another directory.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'This operation needs $neededSize of free space on “$volume” to complete, but there is only $freeSize left.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'The system file picker is missing or disabled. Please enable it and try again.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'This operation is not supported for items of the following types: $types.', + one: 'This operation is not supported for items of the following type: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Some files in the destination folder have the same name.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Some files have the same name.'; + + @override + String get addShortcutDialogLabel => 'Shortcut label'; + + @override + String get addShortcutButtonLabel => 'ADD'; + + @override + String get noMatchingAppDialogMessage => 'There are no apps that can handle this.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Move these $countString items to the recycle bin?', + one: 'Move this item to the recycle bin?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these $countString items?', + one: 'Delete this item?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Save item dates before proceeding?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Save dates'; + + @override + String videoResumeDialogMessage(String time) { + return 'Do you want to resume playing at $time?'; + } + + @override + String get videoStartOverButtonLabel => 'START OVER'; + + @override + String get videoResumeButtonLabel => 'RESUME'; + + @override + String get setCoverDialogLatest => 'Latest item'; + + @override + String get setCoverDialogAuto => 'Auto'; + + @override + String get setCoverDialogCustom => 'Custom'; + + @override + String get hideFilterConfirmationDialogMessage => 'Matching photos and videos will be hidden from your collection. You can show them again from the “Privacy” settings.\n\nAre you sure you want to hide them?'; + + @override + String get newAlbumDialogTitle => 'New Album'; + + @override + String get newAlbumDialogNameLabel => 'Album name'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album already exists'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get newAlbumDialogStorageLabel => 'Storage:'; + + @override + String get newDynamicAlbumDialogTitle => 'New Dynamic Album'; + + @override + String get dynamicAlbumAlreadyExists => 'Dynamic album already exists'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Items in vaults are only available to this app and no others.\n\nIf you uninstall this app, or clear this app data, you will lose all these items.'; + + @override + String get newVaultDialogTitle => 'New Vault'; + + @override + String get configureVaultDialogTitle => 'Configure Vault'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Lock when screen turns off'; + + @override + String get vaultDialogLockTypeLabel => 'Lock type'; + + @override + String get patternDialogEnter => 'Enter pattern'; + + @override + String get patternDialogConfirm => 'Confirm pattern'; + + @override + String get pinDialogEnter => 'Enter PIN'; + + @override + String get pinDialogConfirm => 'Confirm PIN'; + + @override + String get passwordDialogEnter => 'Enter password'; + + @override + String get passwordDialogConfirm => 'Confirm password'; + + @override + String get authenticateToConfigureVault => 'Authenticate to configure vault'; + + @override + String get authenticateToUnlockVault => 'Authenticate to unlock vault'; + + @override + String get vaultBinUsageDialogMessage => 'Some vaults are using the recycle bin.'; + + @override + String get renameAlbumDialogLabel => 'New name'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Directory already exists'; + + @override + String get renameEntrySetPageTitle => 'Rename'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Naming pattern'; + + @override + String get renameEntrySetPageInsertTooltip => 'Insert field'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Preview'; + + @override + String get renameProcessorCounter => 'Counter'; + + @override + String get renameProcessorHash => 'Hash'; + + @override + String get renameProcessorName => 'Name'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete this album and the $countString items in it?', + one: 'Delete this album and the item in it?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Delete these albums and the $countString items in them?', + one: 'Delete these albums and the item in them?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Format:'; + + @override + String get exportEntryDialogWidth => 'Width'; + + @override + String get exportEntryDialogHeight => 'Height'; + + @override + String get exportEntryDialogQuality => 'Quality'; + + @override + String get exportEntryDialogWriteMetadata => 'Write metadata'; + + @override + String get renameEntryDialogLabel => 'New name'; + + @override + String get editEntryDialogCopyFromItem => 'Copy from other item'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Fields to modify'; + + @override + String get editEntryDateDialogTitle => 'Date & Time'; + + @override + String get editEntryDateDialogSetCustom => 'Set custom date'; + + @override + String get editEntryDateDialogCopyField => 'Copy from other date'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Extract from title'; + + @override + String get editEntryDateDialogShift => 'Shift'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'File modified date'; + + @override + String get durationDialogHours => 'Hours'; + + @override + String get durationDialogMinutes => 'Minutes'; + + @override + String get durationDialogSeconds => 'Seconds'; + + @override + String get editEntryLocationDialogTitle => 'Location'; + + @override + String get editEntryLocationDialogSetCustom => 'Set custom location'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Choose on map'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Latitude'; + + @override + String get editEntryLocationDialogLongitude => 'Longitude'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Use this location'; + + @override + String get editEntryRatingDialogTitle => 'Rating'; + + @override + String get removeEntryMetadataDialogTitle => 'Metadata Removal'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'More'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'XMP is required to play the video inside a motion photo.\n\nAre you sure you want to remove it?'; + + @override + String get videoSpeedDialogLabel => 'Playback speed'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Audio'; + + @override + String get videoStreamSelectionDialogText => 'Subtitles'; + + @override + String get videoStreamSelectionDialogOff => 'Off'; + + @override + String get videoStreamSelectionDialogTrack => 'Track'; + + @override + String get videoStreamSelectionDialogNoSelection => 'There are no other tracks.'; + + @override + String get genericSuccessFeedback => 'Done!'; + + @override + String get genericFailureFeedback => 'Failed'; + + @override + String get genericDangerWarningDialogMessage => 'Are you sure?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Try again with fewer items.'; + + @override + String get menuActionConfigureView => 'View'; + + @override + String get menuActionSelect => 'Select'; + + @override + String get menuActionSelectAll => 'Select all'; + + @override + String get menuActionSelectNone => 'Select none'; + + @override + String get menuActionMap => 'Map'; + + @override + String get menuActionSlideshow => 'Slideshow'; + + @override + String get menuActionStats => 'Stats'; + + @override + String get viewDialogSortSectionTitle => 'Sort'; + + @override + String get viewDialogGroupSectionTitle => 'Sections'; + + @override + String get viewDialogLayoutSectionTitle => 'Layout'; + + @override + String get viewDialogReverseSortOrder => 'Reverse sort order'; + + @override + String get tileLayoutMosaic => 'Mosaic'; + + @override + String get tileLayoutGrid => 'Grid'; + + @override + String get tileLayoutList => 'List'; + + @override + String get castDialogTitle => 'Cast Devices'; + + @override + String get coverDialogTabCover => 'Cover'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => 'Color'; + + @override + String get appPickDialogTitle => 'Pick App'; + + @override + String get appPickDialogNone => 'None'; + + @override + String get aboutPageTitle => 'About'; + + @override + String get aboutLinkLicense => 'License'; + + @override + String get aboutLinkPolicy => 'Privacy Policy'; + + @override + String get aboutBugSectionTitle => 'Bug Report'; + + @override + String get aboutBugSaveLogInstruction => 'Save app logs to a file'; + + @override + String get aboutBugCopyInfoInstruction => 'Copy system information'; + + @override + String get aboutBugCopyInfoButton => 'Copy'; + + @override + String get aboutBugReportInstruction => 'Report on GitHub with the logs and system information'; + + @override + String get aboutBugReportButton => 'Report'; + + @override + String get aboutDataUsageSectionTitle => 'Data Usage'; + + @override + String get aboutDataUsageData => 'Data'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Misc'; + + @override + String get aboutDataUsageInternal => 'Internal'; + + @override + String get aboutDataUsageExternal => 'External'; + + @override + String get aboutDataUsageClearCache => 'Clear Cache'; + + @override + String get aboutCreditsSectionTitle => 'Credits'; + + @override + String get aboutCreditsWorldAtlas1 => 'This app uses a TopoJSON file from'; + + @override + String get aboutCreditsWorldAtlas2 => 'under ISC License.'; + + @override + String get aboutTranslatorsSectionTitle => 'Translators'; + + @override + String get aboutLicensesSectionTitle => 'Open-Source Licenses'; + + @override + String get aboutLicensesBanner => 'This app uses the following open-source packages and libraries.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android Libraries'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter Plugins'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter Packages'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart Packages'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Show All Licenses'; + + @override + String get policyPageTitle => 'Privacy Policy'; + + @override + String get collectionPageTitle => 'Collection'; + + @override + String get collectionPickPageTitle => 'Pick'; + + @override + String get collectionSelectPageTitle => 'Select items'; + + @override + String get collectionActionShowTitleSearch => 'Show title filter'; + + @override + String get collectionActionHideTitleSearch => 'Hide title filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Add dynamic album'; + + @override + String get collectionActionAddShortcut => 'Add shortcut'; + + @override + String get collectionActionSetHome => 'Set as home'; + + @override + String get collectionActionEmptyBin => 'Empty bin'; + + @override + String get collectionActionCopy => 'Copy to album'; + + @override + String get collectionActionMove => 'Move to album'; + + @override + String get collectionActionRescan => 'Rescan'; + + @override + String get collectionActionEdit => 'Edit'; + + @override + String get collectionSearchTitlesHintText => 'Search titles'; + + @override + String get collectionGroupAlbum => 'By album'; + + @override + String get collectionGroupMonth => 'By month'; + + @override + String get collectionGroupDay => 'By day'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Unknown'; + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String get dateThisMonth => 'This month'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to delete $countString items', + one: 'Failed to delete 1 item', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to copy $countString items', + one: 'Failed to copy 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to move $countString items', + one: 'Failed to move 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to rename $countString items', + one: 'Failed to rename 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to edit $countString items', + one: 'Failed to edit 1 item', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Failed to export $countString pages', + one: 'Failed to export 1 page', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Copied $countString items', + one: 'Copied 1 item', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Moved $countString items', + one: 'Moved 1 item', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Renamed $countString items', + one: 'Renamed 1 item', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Edited $countString items', + one: 'Edited 1 item', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'No favorites'; + + @override + String get collectionEmptyVideos => 'No videos'; + + @override + String get collectionEmptyImages => 'No images'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Grant access'; + + @override + String get collectionSelectSectionTooltip => 'Select section'; + + @override + String get collectionDeselectSectionTooltip => 'Deselect section'; + + @override + String get drawerAboutButton => 'About'; + + @override + String get drawerSettingsButton => 'Settings'; + + @override + String get drawerCollectionAll => 'All collection'; + + @override + String get drawerCollectionFavourites => 'Favorites'; + + @override + String get drawerCollectionImages => 'Images'; + + @override + String get drawerCollectionVideos => 'Videos'; + + @override + String get drawerCollectionAnimated => 'Animated'; + + @override + String get drawerCollectionMotionPhotos => 'Motion photos'; + + @override + String get drawerCollectionPanoramas => 'Panoramas'; + + @override + String get drawerCollectionRaws => 'Raw photos'; + + @override + String get drawerCollectionSphericalVideos => '360° Videos'; + + @override + String get drawerAlbumPage => 'Albums'; + + @override + String get drawerCountryPage => 'Countries'; + + @override + String get drawerPlacePage => 'Places'; + + @override + String get drawerTagPage => 'Tags'; + + @override + String get sortByDate => 'By date'; + + @override + String get sortByName => 'By name'; + + @override + String get sortByItemCount => 'By item count'; + + @override + String get sortBySize => 'By size'; + + @override + String get sortByAlbumFileName => 'By album & item title'; + + @override + String get sortByRating => 'By rating'; + + @override + String get sortByDuration => 'By duration'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Newest first'; + + @override + String get sortOrderOldestFirst => 'Oldest first'; + + @override + String get sortOrderAtoZ => 'A to Z'; + + @override + String get sortOrderZtoA => 'Z to A'; + + @override + String get sortOrderHighestFirst => 'Highest first'; + + @override + String get sortOrderLowestFirst => 'Lowest first'; + + @override + String get sortOrderLargestFirst => 'Largest first'; + + @override + String get sortOrderSmallestFirst => 'Smallest first'; + + @override + String get sortOrderShortestFirst => 'Shortest first'; + + @override + String get sortOrderLongestFirst => 'Longest first'; + + @override + String get albumGroupTier => 'By tier'; + + @override + String get albumGroupType => 'By type'; + + @override + String get albumGroupVolume => 'By storage volume'; + + @override + String get albumMimeTypeMixed => 'Mixed'; + + @override + String get albumPickPageTitleCopy => 'Copy to Album'; + + @override + String get albumPickPageTitleExport => 'Export to Album'; + + @override + String get albumPickPageTitleMove => 'Move to Album'; + + @override + String get albumPickPageTitlePick => 'Pick Album'; + + @override + String get albumCamera => 'Camera'; + + @override + String get albumDownload => 'Download'; + + @override + String get albumScreenshots => 'Screenshots'; + + @override + String get albumScreenRecordings => 'Screen recordings'; + + @override + String get albumVideoCaptures => 'Video Captures'; + + @override + String get albumPageTitle => 'Albums'; + + @override + String get albumEmpty => 'No albums'; + + @override + String get createAlbumButtonLabel => 'CREATE'; + + @override + String get newFilterBanner => 'new'; + + @override + String get countryPageTitle => 'Countries'; + + @override + String get countryEmpty => 'No countries'; + + @override + String get statePageTitle => 'States'; + + @override + String get stateEmpty => 'No states'; + + @override + String get placePageTitle => 'Places'; + + @override + String get placeEmpty => 'No places'; + + @override + String get tagPageTitle => 'Tags'; + + @override + String get tagEmpty => 'No tags'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Recycle Bin'; + + @override + String get explorerPageTitle => 'Explorer'; + + @override + String get explorerActionSelectStorageVolume => 'Select storage'; + + @override + String get selectStorageVolumeDialogTitle => 'Select Storage'; + + @override + String get searchCollectionFieldHint => 'Search collection'; + + @override + String get searchRecentSectionTitle => 'Recent'; + + @override + String get searchDateSectionTitle => 'Date'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Albums'; + + @override + String get searchCountriesSectionTitle => 'Countries'; + + @override + String get searchStatesSectionTitle => 'States'; + + @override + String get searchPlacesSectionTitle => 'Places'; + + @override + String get searchTagsSectionTitle => 'Tags'; + + @override + String get searchRatingSectionTitle => 'Ratings'; + + @override + String get searchMetadataSectionTitle => 'Metadata'; + + @override + String get settingsPageTitle => 'Settings'; + + @override + String get settingsSystemDefault => 'System default'; + + @override + String get settingsDefault => 'Default'; + + @override + String get settingsDisabled => 'Disabled'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Ask everytime'; + + @override + String get settingsModificationWarningDialogMessage => 'Other settings will be modified.'; + + @override + String get settingsSearchFieldLabel => 'Search settings'; + + @override + String get settingsSearchEmpty => 'No matching setting'; + + @override + String get settingsActionExport => 'Export'; + + @override + String get settingsActionExportDialogTitle => 'Export'; + + @override + String get settingsActionImport => 'Import'; + + @override + String get settingsActionImportDialogTitle => 'Import'; + + @override + String get appExportCovers => 'Covers'; + + @override + String get appExportDynamicAlbums => 'Dynamic albums'; + + @override + String get appExportFavourites => 'Favorites'; + + @override + String get appExportSettings => 'Settings'; + + @override + String get settingsNavigationSectionTitle => 'Navigation'; + + @override + String get settingsHomeTile => 'Home'; + + @override + String get settingsHomeDialogTitle => 'Home'; + + @override + String get setHomeCustom => 'Custom'; + + @override + String get settingsKeepScreenOnTile => 'Keep screen on'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Keep Screen On'; + + @override + String get settingsDoubleBackExit => 'Tap “back” twice to exit'; + + @override + String get settingsConfirmationTile => 'Confirmation dialogs'; + + @override + String get settingsConfirmationDialogTitle => 'Confirmation Dialogs'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Ask before deleting items forever'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Ask before moving items to the recycle bin'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Ask before moving undated items'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Show message after moving items to the recycle bin'; + + @override + String get settingsConfirmationVaultDataLoss => 'Show vault data loss warning'; + + @override + String get settingsNavigationDrawerTile => 'Navigation menu'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Navigation Menu'; + + @override + String get settingsNavigationDrawerBanner => 'Touch and hold to move and reorder menu items.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Types'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Albums'; + + @override + String get settingsNavigationDrawerTabPages => 'Pages'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Add album'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Thumbnails'; + + @override + String get settingsThumbnailOverlayTile => 'Overlay'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Overlay'; + + @override + String get settingsThumbnailShowHdrIcon => 'Show HDR icon'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Show favorite icon'; + + @override + String get settingsThumbnailShowTagIcon => 'Show tag icon'; + + @override + String get settingsThumbnailShowLocationIcon => 'Show location icon'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Show motion photo icon'; + + @override + String get settingsThumbnailShowRating => 'Show rating'; + + @override + String get settingsThumbnailShowRawIcon => 'Show raw icon'; + + @override + String get settingsThumbnailShowVideoDuration => 'Show video duration'; + + @override + String get settingsCollectionQuickActionsTile => 'Quick actions'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Browsing'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Selecting'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when browsing items.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed when selecting items.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Burst patterns'; + + @override + String get settingsCollectionBurstPatternsNone => 'None'; + + @override + String get settingsViewerSectionTitle => 'Viewer'; + + @override + String get settingsViewerGestureSideTapNext => 'Tap on screen edges to show previous/next item'; + + @override + String get settingsViewerUseCutout => 'Use cutout area'; + + @override + String get settingsViewerMaximumBrightness => 'Maximum brightness'; + + @override + String get settingsMotionPhotoAutoPlay => 'Auto play motion photos'; + + @override + String get settingsImageBackground => 'Image background'; + + @override + String get settingsViewerQuickActionsTile => 'Quick actions'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Quick Actions'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the viewer.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Displayed Buttons'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Available Buttons'; + + @override + String get settingsViewerQuickActionEmpty => 'No buttons'; + + @override + String get settingsViewerOverlayTile => 'Overlay'; + + @override + String get settingsViewerOverlayPageTitle => 'Overlay'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Show on opening'; + + @override + String get settingsViewerShowHistogram => 'Show histogram'; + + @override + String get settingsViewerShowMinimap => 'Show minimap'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Show information'; + + @override + String get settingsViewerShowInformationSubtitle => 'Show title, date, location, etc.'; + + @override + String get settingsViewerShowRatingTags => 'Show rating & tags'; + + @override + String get settingsViewerShowShootingDetails => 'Show shooting details'; + + @override + String get settingsViewerShowDescription => 'Show description'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Show thumbnails'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Blur effect'; + + @override + String get settingsViewerSlideshowTile => 'Slideshow'; + + @override + String get settingsViewerSlideshowPageTitle => 'Slideshow'; + + @override + String get settingsSlideshowRepeat => 'Repeat'; + + @override + String get settingsSlideshowShuffle => 'Shuffle'; + + @override + String get settingsSlideshowFillScreen => 'Fill screen'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Animated zoom effect'; + + @override + String get settingsSlideshowTransitionTile => 'Transition'; + + @override + String get settingsSlideshowIntervalTile => 'Interval'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Video playback'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Video Playback'; + + @override + String get settingsVideoPageTitle => 'Video Settings'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Show videos'; + + @override + String get settingsVideoPlaybackTile => 'Playback'; + + @override + String get settingsVideoPlaybackPageTitle => 'Playback'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Hardware acceleration'; + + @override + String get settingsVideoAutoPlay => 'Auto play'; + + @override + String get settingsVideoLoopModeTile => 'Loop mode'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Loop Mode'; + + @override + String get settingsVideoResumptionModeTile => 'Resume playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Resume Playback'; + + @override + String get settingsVideoBackgroundMode => 'Background mode'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Background Mode'; + + @override + String get settingsVideoControlsTile => 'Controls'; + + @override + String get settingsVideoControlsPageTitle => 'Controls'; + + @override + String get settingsVideoButtonsTile => 'Buttons'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Double tap to play/pause'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Double tap on screen edges to seek backward/forward'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Swipe up or down to adjust brightness/volume'; + + @override + String get settingsSubtitleThemeTile => 'Subtitles'; + + @override + String get settingsSubtitleThemePageTitle => 'Subtitles'; + + @override + String get settingsSubtitleThemeSample => 'This is a sample.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Text alignment'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Text Alignment'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Text position'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Text Position'; + + @override + String get settingsSubtitleThemeTextSize => 'Text size'; + + @override + String get settingsSubtitleThemeShowOutline => 'Show outline and shadow'; + + @override + String get settingsSubtitleThemeTextColor => 'Text color'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Text opacity'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Background color'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Background opacity'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Left'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Center'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Right'; + + @override + String get settingsPrivacySectionTitle => 'Privacy'; + + @override + String get settingsAllowInstalledAppAccess => 'Allow access to app inventory'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Used to improve album display'; + + @override + String get settingsAllowErrorReporting => 'Allow anonymous error reporting'; + + @override + String get settingsSaveSearchHistory => 'Save search history'; + + @override + String get settingsEnableBin => 'Use recycle bin'; + + @override + String get settingsEnableBinSubtitle => 'Keep deleted items for 30 days'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Items in the recycle bin will be deleted forever.'; + + @override + String get settingsAllowMediaManagement => 'Allow media management'; + + @override + String get settingsHiddenItemsTile => 'Hidden items'; + + @override + String get settingsHiddenItemsPageTitle => 'Hidden Items'; + + @override + String get settingsHiddenFiltersBanner => 'Photos and videos matching hidden filters will not appear in your collection.'; + + @override + String get settingsHiddenFiltersEmpty => 'No hidden filters'; + + @override + String get settingsStorageAccessTile => 'Storage access'; + + @override + String get settingsStorageAccessPageTitle => 'Storage Access'; + + @override + String get settingsStorageAccessBanner => 'Some directories require an explicit access grant to modify files in them. You can review here directories to which you previously gave access.'; + + @override + String get settingsStorageAccessEmpty => 'No access grants'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Revoke'; + + @override + String get settingsAccessibilitySectionTitle => 'Accessibility'; + + @override + String get settingsRemoveAnimationsTile => 'Remove animations'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Remove Animations'; + + @override + String get settingsTimeToTakeActionTile => 'Time to take action'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Show multi-touch gesture alternatives'; + + @override + String get settingsDisplaySectionTitle => 'Display'; + + @override + String get settingsThemeBrightnessTile => 'Theme'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Theme'; + + @override + String get settingsThemeColorHighlights => 'Color highlights'; + + @override + String get settingsThemeEnableDynamicColor => 'Dynamic color'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Display refresh rate'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Refresh Rate'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV interface'; + + @override + String get settingsLanguageSectionTitle => 'Language & Formats'; + + @override + String get settingsLanguageTile => 'Language'; + + @override + String get settingsLanguagePageTitle => 'Language'; + + @override + String get settingsCoordinateFormatTile => 'Coordinate format'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Coordinate Format'; + + @override + String get settingsUnitSystemTile => 'Units'; + + @override + String get settingsUnitSystemDialogTitle => 'Units'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Force Arabic numerals'; + + @override + String get settingsScreenSaverPageTitle => 'Screen Saver'; + + @override + String get settingsWidgetPageTitle => 'Photo Frame'; + + @override + String get settingsWidgetShowOutline => 'Outline'; + + @override + String get settingsWidgetOpenPage => 'When tapping on the widget'; + + @override + String get settingsWidgetDisplayedItem => 'Displayed item'; + + @override + String get settingsCollectionTile => 'Collection'; + + @override + String get statsPageTitle => 'Stats'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString items with location', + one: '1 item with location', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Top Countries'; + + @override + String get statsTopStatesSectionTitle => 'Top States'; + + @override + String get statsTopPlacesSectionTitle => 'Top Places'; + + @override + String get statsTopTagsSectionTitle => 'Top Tags'; + + @override + String get statsTopAlbumsSectionTitle => 'Top Albums'; + + @override + String get viewerOpenPanoramaButtonLabel => 'OPEN PANORAMA'; + + @override + String get viewerSetWallpaperButtonLabel => 'SET WALLPAPER'; + + @override + String get viewerErrorUnknown => 'Oops!'; + + @override + String get viewerErrorDoesNotExist => 'The file no longer exists.'; + + @override + String get viewerInfoPageTitle => 'Info'; + + @override + String get viewerInfoBackToViewerTooltip => 'Back to viewer'; + + @override + String get viewerInfoUnknown => 'unknown'; + + @override + String get viewerInfoLabelDescription => 'Description'; + + @override + String get viewerInfoLabelTitle => 'Title'; + + @override + String get viewerInfoLabelDate => 'Date'; + + @override + String get viewerInfoLabelResolution => 'Resolution'; + + @override + String get viewerInfoLabelSize => 'Size'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Path'; + + @override + String get viewerInfoLabelDuration => 'Duration'; + + @override + String get viewerInfoLabelOwner => 'Owner'; + + @override + String get viewerInfoLabelCoordinates => 'Coordinates'; + + @override + String get viewerInfoLabelAddress => 'Address'; + + @override + String get mapStyleDialogTitle => 'Map Style'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Select map style'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Zoom in'; + + @override + String get mapZoomOutTooltip => 'Zoom out'; + + @override + String get mapPointNorthUpTooltip => 'Point north up'; + + @override + String get mapAttributionOsmData => 'Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors'; + + @override + String get mapAttributionOsmLiberty => 'Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'View on Map page'; + + @override + String get mapEmptyRegion => 'No images in this region'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Failed to extract embedded data'; + + @override + String get viewerInfoOpenLinkText => 'Open'; + + @override + String get viewerInfoViewXmlLinkText => 'View XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Search metadata'; + + @override + String get viewerInfoSearchEmpty => 'No matching keys'; + + @override + String get viewerInfoSearchSuggestionDate => 'Date & time'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Description'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Dimensions'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Resolution'; + + @override + String get viewerInfoSearchSuggestionRights => 'Rights'; + + @override + String get wallpaperUseScrollEffect => 'Use scroll effect on home screen'; + + @override + String get tagEditorPageTitle => 'Edit Tags'; + + @override + String get tagEditorPageNewTagFieldLabel => 'New tag'; + + @override + String get tagEditorPageAddTagTooltip => 'Add tag'; + + @override + String get tagEditorSectionRecent => 'Recent'; + + @override + String get tagEditorSectionPlaceholders => 'Placeholders'; + + @override + String get tagEditorDiscardDialogMessage => 'Do you want to discard changes?'; + + @override + String get tagPlaceholderCountry => 'Country'; + + @override + String get tagPlaceholderState => 'State'; + + @override + String get tagPlaceholderPlace => 'Place'; + + @override + String get panoramaEnableSensorControl => 'Enable sensor control'; + + @override + String get panoramaDisableSensorControl => 'Disable sensor control'; + + @override + String get sourceViewerPageTitle => 'Source'; +} diff --git a/lib/l10ngen/app_localizations_vi.dart b/lib/l10ngen/app_localizations_vi.dart new file mode 100644 index 0000000..d1519a1 --- /dev/null +++ b/lib/l10ngen/app_localizations_vi.dart @@ -0,0 +1,2368 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Vietnamese (`vi`). +class AppLocalizationsVi extends AppLocalizations { + AppLocalizationsVi([String locale = 'vi']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => 'Chào mừng đến với Aves'; + + @override + String get welcomeOptional => 'Không bắt buộc'; + + @override + String get welcomeTermsToggle => 'Tôi đồng ý với các Điều khoản và Điều kiện'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count mục', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count cột', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString giây', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString phút', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString ngày', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length pp'; + } + + @override + String get applyButtonLabel => 'ÁP DỤNG'; + + @override + String get createButtonLabel => 'CREATE'; + + @override + String get deleteButtonLabel => 'XÓA BỎ'; + + @override + String get nextButtonLabel => 'KẾ TIẾP'; + + @override + String get showButtonLabel => 'HIỂN THỊ'; + + @override + String get hideButtonLabel => 'ẨN'; + + @override + String get continueButtonLabel => 'TIẾP TỤC'; + + @override + String get saveCopyButtonLabel => 'LƯU BẢN SAO'; + + @override + String get applyTooltip => 'Áp dụng'; + + @override + String get cancelTooltip => 'Hủy bỏ'; + + @override + String get changeTooltip => 'Thay đổi'; + + @override + String get clearTooltip => 'Xóa'; + + @override + String get previousTooltip => 'Trước đó'; + + @override + String get nextTooltip => 'Kế tiếp'; + + @override + String get showTooltip => 'Hiển thị'; + + @override + String get hideTooltip => 'Ẩn'; + + @override + String get actionRemove => 'Loại bỏ'; + + @override + String get resetTooltip => 'Đặt lại'; + + @override + String get saveTooltip => 'Lưu'; + + @override + String get stopTooltip => 'Dừng'; + + @override + String get pickTooltip => 'Chọn'; + + @override + String get doubleBackExitMessage => 'Nhấn “quay lại” lần nữa để thoát.'; + + @override + String get doNotAskAgain => 'Đừng hỏi nữa'; + + @override + String get sourceStateLoading => 'Đang tải'; + + @override + String get sourceStateCataloguing => 'Biên mục'; + + @override + String get sourceStateLocatingCountries => 'Định vị quốc gia'; + + @override + String get sourceStateLocatingPlaces => 'Định vị địa điểm'; + + @override + String get chipActionDelete => 'Xóa'; + + @override + String get chipActionRemove => 'Loại bỏ'; + + @override + String get chipActionShowCollection => 'Hiển thị trong Bộ sưu tập'; + + @override + String get chipActionGoToAlbumPage => 'Hiển thị trong bộ sưu tập'; + + @override + String get chipActionGoToCountryPage => 'Hiển thị ở các quốc gia'; + + @override + String get chipActionGoToPlacePage => 'Hiển thị ở địa điểm'; + + @override + String get chipActionGoToTagPage => 'Hiển thị trong các thẻ'; + + @override + String get chipActionGoToExplorerPage => 'Hiển thị ở Explorer'; + + @override + String get chipActionDecompose => 'Split'; + + @override + String get chipActionFilterOut => 'Lọc đầu ra'; + + @override + String get chipActionFilterIn => 'Lọc đầu vào'; + + @override + String get chipActionHide => 'Ẩn'; + + @override + String get chipActionLock => 'Khóa'; + + @override + String get chipActionPin => 'Ghim đầu trang'; + + @override + String get chipActionUnpin => 'Bỏ ghim khỏi đầu'; + + @override + String get chipActionGroup => 'Change grouping'; + + @override + String get chipActionRename => 'Đổi tên'; + + @override + String get chipActionSetCover => 'Đặt ảnh bìa'; + + @override + String get chipActionShowCountryStates => 'Hiển thị tỉnh'; + + @override + String get chipActionCreateGroup => 'Create group'; + + @override + String get chipActionCreateAlbum => 'Tạo bộ sưu tập'; + + @override + String get chipActionCreateVault => 'Tạo két sắt'; + + @override + String get chipActionConfigureVault => 'Định cấu hình két sắt'; + + @override + String get entryActionCopyToClipboard => 'Sao chép vào clipboard'; + + @override + String get entryActionDelete => 'Xóa'; + + @override + String get entryActionConvert => 'Chuyển thành'; + + @override + String get entryActionExport => 'Xuất'; + + @override + String get entryActionInfo => 'Thông tin'; + + @override + String get entryActionRename => 'Đổi tên'; + + @override + String get entryActionRestore => 'Khôi phục'; + + @override + String get entryActionRotateCCW => 'Xoay ngược chiều kim đồng hồ'; + + @override + String get entryActionRotateCW => 'Xoay theo chiều kim đồng hồ'; + + @override + String get entryActionFlip => 'Lật theo chiều ngang'; + + @override + String get entryActionPrint => 'In ấn'; + + @override + String get entryActionShare => 'Chia sẻ'; + + @override + String get entryActionShareImageOnly => 'Chỉ chia sẻ hình ảnh'; + + @override + String get entryActionShareVideoOnly => 'Chỉ chia sẻ video'; + + @override + String get entryActionViewSource => 'Xem nguồn'; + + @override + String get entryActionShowGeoTiffOnMap => 'Hiển thị dưới dạng lớp phủ bản đồ'; + + @override + String get entryActionConvertMotionPhotoToStillImage => 'Chuyển đổi sang hình ảnh tĩnh'; + + @override + String get entryActionViewMotionPhotoVideo => 'Mở video'; + + @override + String get entryActionEdit => 'Biên tập'; + + @override + String get entryActionOpen => 'Mở với'; + + @override + String get entryActionSetAs => 'Đặt làm'; + + @override + String get entryActionCast => 'Truyền'; + + @override + String get entryActionOpenMap => 'Hiển thị trong ứng dụng bản đồ'; + + @override + String get entryActionRotateScreen => 'Xoay màn hình'; + + @override + String get entryActionAddFavourite => 'Thêm vào mục yêu thích'; + + @override + String get entryActionRemoveFavourite => 'Loại bỏ khỏi mục ưa thích'; + + @override + String get videoActionCaptureFrame => 'Chụp khung hình'; + + @override + String get videoActionMute => 'Tắt tiếng'; + + @override + String get videoActionUnmute => 'Bật tiếng'; + + @override + String get videoActionPause => 'Tạm ngừng'; + + @override + String get videoActionPlay => 'Phát'; + + @override + String get videoActionReplay10 => 'Tua lùi 10 giây'; + + @override + String get videoActionSkip10 => 'Tua tới 10 giây'; + + @override + String get videoActionShowPreviousFrame => 'Hiển thị khung hình trước đó'; + + @override + String get videoActionShowNextFrame => 'Hiển thị khung hình tiếp theo'; + + @override + String get videoActionSelectStreams => 'Chọn bài hát'; + + @override + String get videoActionSetSpeed => 'Tốc độ phát lại'; + + @override + String get videoActionABRepeat => 'Lặp lại A-B'; + + @override + String get videoRepeatActionSetStart => 'Đặt bắt đầu'; + + @override + String get videoRepeatActionSetEnd => 'Đặt kết thúc'; + + @override + String get viewerActionSettings => 'Cài đặt'; + + @override + String get viewerActionLock => 'Khóa trình xem'; + + @override + String get viewerActionUnlock => 'Mở khóa trình xem'; + + @override + String get slideshowActionResume => 'Tiếp tục'; + + @override + String get slideshowActionShowInCollection => 'Hiển thị trong Bộ sưu tập'; + + @override + String get entryInfoActionEditDate => 'Chỉnh sửa ngày & giờ'; + + @override + String get entryInfoActionEditLocation => 'Chỉnh sửa vị trí'; + + @override + String get entryInfoActionEditTitleDescription => 'Chỉnh sửa tiêu đề & mô tả'; + + @override + String get entryInfoActionEditRating => 'Chỉnh sửa xếp hạng'; + + @override + String get entryInfoActionEditTags => 'Chỉnh sửa thẻ'; + + @override + String get entryInfoActionRemoveMetadata => 'Loại bỏ siêu dữ liệu'; + + @override + String get entryInfoActionExportMetadata => 'Xuất siêu dữ liệu'; + + @override + String get entryInfoActionRemoveLocation => 'Loại bỏ vị trí'; + + @override + String get editorActionTransform => 'Biến đổi'; + + @override + String get editorTransformCrop => 'Cắt xén'; + + @override + String get editorTransformRotate => 'Xoay'; + + @override + String get cropAspectRatioFree => 'Tự do'; + + @override + String get cropAspectRatioOriginal => 'Nguyên bản'; + + @override + String get cropAspectRatioSquare => 'Vuông'; + + @override + String get filterAspectRatioLandscapeLabel => 'Ngang'; + + @override + String get filterAspectRatioPortraitLabel => 'Dọc'; + + @override + String get filterBinLabel => 'Thùng rác'; + + @override + String get filterFavouriteLabel => 'Yêu thích'; + + @override + String get filterNoDateLabel => 'không ghi ngày tháng'; + + @override + String get filterNoAddressLabel => 'Không có địa chỉ'; + + @override + String get filterLocatedLabel => 'Đã định vị'; + + @override + String get filterNoLocationLabel => 'Chưa định vị'; + + @override + String get filterNoRatingLabel => 'Chưa được xếp hạng'; + + @override + String get filterTaggedLabel => 'Đã gắn thẻ'; + + @override + String get filterNoTagLabel => 'Đã gỡ thẻ'; + + @override + String get filterNoTitleLabel => 'Không có tiêu đề'; + + @override + String get filterOnThisDayLabel => 'Vào ngày này'; + + @override + String get filterRecentlyAddedLabel => 'Đã thêm gần đây'; + + @override + String get filterRatingRejectedLabel => 'Đã loại bỏ'; + + @override + String get filterTypeAnimatedLabel => 'Hoạt ảnh'; + + @override + String get filterTypeMotionPhotoLabel => 'Ảnh động'; + + @override + String get filterTypePanoramaLabel => 'Toàn cảnh'; + + @override + String get filterTypeRawLabel => 'RAW'; + + @override + String get filterTypeSphericalVideoLabel => '360° Video'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => 'Ảnh'; + + @override + String get filterMimeVideoLabel => 'Video'; + + @override + String get accessibilityAnimationsRemove => 'Chặn hiệu ứng màn hình'; + + @override + String get accessibilityAnimationsKeep => 'Giữ hiệu ứng màn hình'; + + @override + String get albumTierNew => 'Mới'; + + @override + String get albumTierPinned => 'Đã ghim'; + + @override + String get albumTierGroups => 'Groups'; + + @override + String get albumTierSpecial => 'Phổ biến'; + + @override + String get albumTierApps => 'Ứng dụng'; + + @override + String get albumTierVaults => 'Két sắt'; + + @override + String get albumTierDynamic => 'Động'; + + @override + String get albumTierRegular => 'Khác'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => 'DDM'; + + @override + String get coordinateFormatDecimal => 'Thập phân'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'Bắc'; + + @override + String get coordinateDmsSouth => 'Nam'; + + @override + String get coordinateDmsEast => 'Đông'; + + @override + String get coordinateDmsWest => 'Tây'; + + @override + String get displayRefreshRatePreferHighest => 'Giá trị cao nhất'; + + @override + String get displayRefreshRatePreferLowest => 'Giá trị thấp nhất'; + + @override + String get keepScreenOnNever => 'Không bao giờ'; + + @override + String get keepScreenOnVideoPlayback => 'Khi phát lại video'; + + @override + String get keepScreenOnViewerOnly => 'Chỉ trang người xem'; + + @override + String get keepScreenOnAlways => 'Luôn luôn'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google Maps'; + + @override + String get mapStyleGoogleHybrid => 'Google Maps (Hỗn hợp)'; + + @override + String get mapStyleGoogleTerrain => 'Google Maps (Địa hình)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor (Màu)'; + + @override + String get maxBrightnessNever => 'Không bao giờ'; + + @override + String get maxBrightnessAlways => 'Luôn luôn'; + + @override + String get nameConflictStrategyRename => 'Sửa tên'; + + @override + String get nameConflictStrategyReplace => 'Thay thế'; + + @override + String get nameConflictStrategySkip => 'Bỏ qua'; + + @override + String get overlayHistogramNone => 'Không có'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => 'Độ sáng'; + + @override + String get subtitlePositionTop => 'Trên'; + + @override + String get subtitlePositionBottom => 'Dưới'; + + @override + String get themeBrightnessLight => 'Sáng'; + + @override + String get themeBrightnessDark => 'Tối'; + + @override + String get themeBrightnessBlack => 'Đen'; + + @override + String get unitSystemMetric => 'Hệ mét'; + + @override + String get unitSystemImperial => 'Hệ ft'; + + @override + String get vaultLockTypePattern => 'Mẫu'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => 'Mật khẩu'; + + @override + String get settingsVideoEnablePip => 'Ảnh trong ảnh'; + + @override + String get videoControlsPlayOutside => 'Mở với trình phát khác'; + + @override + String get videoLoopModeNever => 'Không bao giờ'; + + @override + String get videoLoopModeShortOnly => 'Chỉ video ngắn'; + + @override + String get videoLoopModeAlways => 'Luôn luôn'; + + @override + String get videoPlaybackSkip => 'Bỏ qua'; + + @override + String get videoPlaybackMuted => 'Phát với chế độ im lặng'; + + @override + String get videoPlaybackWithSound => 'Phát với âm thanh'; + + @override + String get videoResumptionModeNever => 'Không bao giờ'; + + @override + String get videoResumptionModeAlways => 'Luôn luôn'; + + @override + String get viewerTransitionSlide => 'Trình chiếu'; + + @override + String get viewerTransitionParallax => 'Thị sai'; + + @override + String get viewerTransitionFade => 'Phai nhạt'; + + @override + String get viewerTransitionZoomIn => 'Phóng to'; + + @override + String get viewerTransitionNone => 'Không có'; + + @override + String get wallpaperTargetHome => 'Màn hình chính'; + + @override + String get wallpaperTargetLock => 'Màn hình khóa'; + + @override + String get wallpaperTargetHomeLock => 'Màn hình chính và màn hình khóa'; + + @override + String get widgetDisplayedItemRandom => 'Ngẫu nhiên'; + + @override + String get widgetDisplayedItemMostRecent => 'Gần đây'; + + @override + String get widgetOpenPageHome => 'Mở trang chủ'; + + @override + String get widgetOpenPageCollection => 'Mở bộ sưu tập'; + + @override + String get widgetOpenPageViewer => 'Mở chế độ xem'; + + @override + String get widgetTapUpdateWidget => 'Cập nhật widget'; + + @override + String get storageVolumeDescriptionFallbackPrimary => 'Bộ nhớ trong'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'Thẻ nhớ'; + + @override + String get rootDirectoryDescription => 'Thư mục root'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” thư mục'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return 'Vui lòng chọn $directory của “$volume” trong màn hình tiếp theo để cấp cho ứng dụng này quyền truy cập vào nó.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return 'Ứng dụng này không được phép sửa đổi các tệp trong $directory của “$volume”.\n\n Vui lòng sử dụng trình quản lý tệp hoặc ứng dụng thư viện được cài đặt sẵn để di chuyển các mục sang thư mục khác.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return 'Thao tác này cần có $neededSize dung lượng trống trên “$volume” để hoàn thành nhưng chỉ còn lại $freeSize.'; + } + + @override + String get missingSystemFilePickerDialogMessage => 'Tệp hệ thống bị thiếu hoặc bị vô hiệu hóa. Vui lòng kích hoạt nó và thử lại.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Thao tác này không hỗ trợ cho kiểu tệp: $types.', + one: 'Thao tác này không hỗ trợ cho kiểu tệp: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => 'Một số tệp trong thư mục có cùng tên.'; + + @override + String get nameConflictDialogMultipleSourceMessage => 'Một số tệp có cùng tên.'; + + @override + String get addShortcutDialogLabel => 'Nhãn phím tắt'; + + @override + String get addShortcutButtonLabel => 'NHẬP'; + + @override + String get noMatchingAppDialogMessage => 'Không có ứng dụng nào có thể xử lý việc này.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Chuyển $count mục vào thùng rác?', + one: 'Chuyển vào thùng rác?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Xóa$count mục?', + one: 'Xóa mục này? ', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => 'Lưu thời gian của mục trước khi tiếp tục?'; + + @override + String get moveUndatedConfirmationDialogSetDate => 'Lưu thời gian'; + + @override + String videoResumeDialogMessage(String time) { + return 'Phát lại ngay $time không?'; + } + + @override + String get videoStartOverButtonLabel => 'Bắt đầu lại'; + + @override + String get videoResumeButtonLabel => 'Phát lại'; + + @override + String get setCoverDialogLatest => 'Mục mới nhất'; + + @override + String get setCoverDialogAuto => 'Tự động'; + + @override + String get setCoverDialogCustom => 'Tùy chỉnh'; + + @override + String get hideFilterConfirmationDialogMessage => 'Ảnh và video trùng khớp sẽ bị ẩn khỏi bộ sưu tập của bạn. Bạn có thể hiển thị lại chúng từ cài đặt “Quyền riêng tư”.\n\nBạn có chắc chắn muốn ẩn chúng không?'; + + @override + String get newAlbumDialogTitle => 'Bộ sưu tập mới'; + + @override + String get newAlbumDialogNameLabel => 'Tên bộ sưu tập'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => 'Album đã tồn tại'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => 'Thư mục đã tồn tại'; + + @override + String get newAlbumDialogStorageLabel => 'Lưu trữ:'; + + @override + String get newDynamicAlbumDialogTitle => 'Album động mới'; + + @override + String get dynamicAlbumAlreadyExists => 'Album động đã tồn tại'; + + @override + String get newGroupDialogTitle => 'New Group'; + + @override + String get newGroupDialogNameLabel => 'Group name'; + + @override + String get groupAlreadyExists => 'Group already exists'; + + @override + String get groupEmpty => 'No groups'; + + @override + String get ungrouped => 'Ungrouped'; + + @override + String get groupPickerTitle => 'Pick Group'; + + @override + String get groupPickerUseThisGroupButton => 'Use this group'; + + @override + String get newVaultWarningDialogMessage => 'Các mục trong kho bí mật chỉ có sẵn cho ứng dụng này và không có sẵn cho ứng dụng khác.\n\nNếu bạn gỡ cài đặt ứng dụng này hoặc xóa dữ liệu ứng dụng này, bạn sẽ mất tất cả các mục này.'; + + @override + String get newVaultDialogTitle => 'Két sắt mới'; + + @override + String get configureVaultDialogTitle => 'Cấu hình Két sắt'; + + @override + String get vaultDialogLockModeWhenScreenOff => 'Khóa khi màn hình tắt'; + + @override + String get vaultDialogLockTypeLabel => 'Loại khóa'; + + @override + String get patternDialogEnter => 'Nhập mẫu'; + + @override + String get patternDialogConfirm => 'Xác nhận mẫu'; + + @override + String get pinDialogEnter => 'Nhập PIN'; + + @override + String get pinDialogConfirm => 'Xác nhận PIN'; + + @override + String get passwordDialogEnter => 'Nhập mật khẩu'; + + @override + String get passwordDialogConfirm => 'Xác nhận mật khẩu'; + + @override + String get authenticateToConfigureVault => 'Xác thực để định cấu hình két sắt'; + + @override + String get authenticateToUnlockVault => 'Xác thực để mở khóa két sắt'; + + @override + String get vaultBinUsageDialogMessage => 'Một số két sắt đang sử dụng thùng rác.'; + + @override + String get renameAlbumDialogLabel => 'Tên mới'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => 'Thư mục đã tồn tại'; + + @override + String get renameEntrySetPageTitle => 'Đổi tên'; + + @override + String get renameEntrySetPagePatternFieldLabel => 'Mẫu đặt tên'; + + @override + String get renameEntrySetPageInsertTooltip => 'Chèn thêm trường'; + + @override + String get renameEntrySetPagePreviewSectionTitle => 'Xem trước'; + + @override + String get renameProcessorCounter => 'Đếm'; + + @override + String get renameProcessorHash => 'Băm'; + + @override + String get renameProcessorName => 'Tên'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Xóa bộ sưu tập này với $count mục bên trong?', + one: 'Xóa bộ sưu tập này và các mục bên trong', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Xóa các Album này với $count mục bên trong?', + one: 'Xóa các Album này và các mục bên trong', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => 'Định dạng:'; + + @override + String get exportEntryDialogWidth => 'Rộng'; + + @override + String get exportEntryDialogHeight => 'Cao'; + + @override + String get exportEntryDialogQuality => 'Chất lượng'; + + @override + String get exportEntryDialogWriteMetadata => 'Viết metadata'; + + @override + String get renameEntryDialogLabel => 'Tên mới'; + + @override + String get editEntryDialogCopyFromItem => 'Sao chép từ mục khác'; + + @override + String get editEntryDialogTargetFieldsHeader => 'Các trường cần sửa'; + + @override + String get editEntryDateDialogTitle => 'Ngày & Giờ'; + + @override + String get editEntryDateDialogSetCustom => 'Đặt thời gian tùy chọn'; + + @override + String get editEntryDateDialogCopyField => 'Sao chép từ ngày khác'; + + @override + String get editEntryDateDialogExtractFromTitle => 'Trích xuất từ tiêu đề'; + + @override + String get editEntryDateDialogShift => 'Ca'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => 'Ngày sửa đổi tệp tin'; + + @override + String get durationDialogHours => 'Giờ'; + + @override + String get durationDialogMinutes => 'Phút'; + + @override + String get durationDialogSeconds => 'Giây'; + + @override + String get editEntryLocationDialogTitle => 'Vị trí'; + + @override + String get editEntryLocationDialogSetCustom => 'Đặt vị trí tùy chọn'; + + @override + String get editEntryLocationDialogChooseOnMap => 'Chọn trên bản đồ'; + + @override + String get editEntryLocationDialogImportGpx => 'Import GPX'; + + @override + String get editEntryLocationDialogLatitude => 'Vĩ độ'; + + @override + String get editEntryLocationDialogLongitude => 'Kinh độ'; + + @override + String get editEntryLocationDialogTimeShift => 'Time shift'; + + @override + String get locationPickerUseThisLocationButton => 'Dùng vị trí này'; + + @override + String get editEntryRatingDialogTitle => 'Xếp hạng'; + + @override + String get removeEntryMetadataDialogTitle => 'Xóa Metadata'; + + @override + String get removeEntryMetadataDialogAll => 'All'; + + @override + String get removeEntryMetadataDialogMore => 'Thêm'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => 'Cần có XMP để phát video bên trong ảnh chuyển động.\n\nBạn có chắc chắn muốn xóa nó không?'; + + @override + String get videoSpeedDialogLabel => 'Tốc độ phát'; + + @override + String get videoStreamSelectionDialogVideo => 'Video'; + + @override + String get videoStreamSelectionDialogAudio => 'Âm thanh'; + + @override + String get videoStreamSelectionDialogText => 'Phụ đề'; + + @override + String get videoStreamSelectionDialogOff => 'Tắt'; + + @override + String get videoStreamSelectionDialogTrack => 'Bài hát'; + + @override + String get videoStreamSelectionDialogNoSelection => 'Không có bài hát nào.'; + + @override + String get genericSuccessFeedback => 'Xong!'; + + @override + String get genericFailureFeedback => 'Bị lỗi'; + + @override + String get genericDangerWarningDialogMessage => 'Bạn chắc chứ?'; + + @override + String get tooManyItemsErrorDialogMessage => 'Hãy thử lại với ít mục hơn.'; + + @override + String get menuActionConfigureView => 'Xem'; + + @override + String get menuActionSelect => 'Chọn'; + + @override + String get menuActionSelectAll => 'Chọn hết'; + + @override + String get menuActionSelectNone => 'Chọn không có'; + + @override + String get menuActionMap => 'Bản đồ'; + + @override + String get menuActionSlideshow => 'Trình chiếu'; + + @override + String get menuActionStats => 'Thống kê'; + + @override + String get viewDialogSortSectionTitle => 'Sắp xếp'; + + @override + String get viewDialogGroupSectionTitle => 'Nhóm'; + + @override + String get viewDialogLayoutSectionTitle => 'Trình bày'; + + @override + String get viewDialogReverseSortOrder => 'Đảo ngược thứ tự sắp xếp'; + + @override + String get tileLayoutMosaic => 'Khảm'; + + @override + String get tileLayoutGrid => 'Lưới'; + + @override + String get tileLayoutList => 'Danh sách'; + + @override + String get castDialogTitle => 'Thiết bị truyền'; + + @override + String get coverDialogTabCover => 'Ảnh bìa'; + + @override + String get coverDialogTabApp => 'Ứng dụng'; + + @override + String get coverDialogTabColor => 'Màu sắc'; + + @override + String get appPickDialogTitle => 'Chọn ứng dụng'; + + @override + String get appPickDialogNone => 'Không có'; + + @override + String get aboutPageTitle => 'Giới thiệu'; + + @override + String get aboutLinkLicense => 'Giấy phép'; + + @override + String get aboutLinkPolicy => 'Chính sách bảo mật'; + + @override + String get aboutBugSectionTitle => 'Báo cáo lỗi'; + + @override + String get aboutBugSaveLogInstruction => 'Lưu log thành file'; + + @override + String get aboutBugCopyInfoInstruction => 'Sao chép thông tin hệ thống'; + + @override + String get aboutBugCopyInfoButton => 'Sao chép'; + + @override + String get aboutBugReportInstruction => 'Báo cáo trên GitHub với nhật ký và thông tin hệ thống'; + + @override + String get aboutBugReportButton => 'Báo cáo'; + + @override + String get aboutDataUsageSectionTitle => 'Sử dụng dữ liệu'; + + @override + String get aboutDataUsageData => 'Dữ liệu'; + + @override + String get aboutDataUsageCache => 'Cache'; + + @override + String get aboutDataUsageDatabase => 'Database'; + + @override + String get aboutDataUsageMisc => 'Khác'; + + @override + String get aboutDataUsageInternal => 'Nội bộ'; + + @override + String get aboutDataUsageExternal => 'Ngoại tuyến'; + + @override + String get aboutDataUsageClearCache => 'Xóa bộ nhớ đệm'; + + @override + String get aboutCreditsSectionTitle => 'Đóng góp'; + + @override + String get aboutCreditsWorldAtlas1 => 'Ứng dụng này dùng tệp TopoJSON từ'; + + @override + String get aboutCreditsWorldAtlas2 => 'dưới bản quyền ISC.'; + + @override + String get aboutTranslatorsSectionTitle => 'Dịch'; + + @override + String get aboutLicensesSectionTitle => 'Giấy phép mã nguồn mở'; + + @override + String get aboutLicensesBanner => 'Ứng dụng này sử dụng các gói và thư viện nguồn mở.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Thư viện Android'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Các bổ sung Flutter'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Các gói Flutter'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Các gói Dart'; + + @override + String get aboutLicensesShowAllButtonLabel => 'Hiển thị tất cả giấy phép'; + + @override + String get policyPageTitle => 'Chính sách bảo mật'; + + @override + String get collectionPageTitle => 'Bộ sưu tập'; + + @override + String get collectionPickPageTitle => 'Chọn'; + + @override + String get collectionSelectPageTitle => 'Chọn mục'; + + @override + String get collectionActionShowTitleSearch => 'Hiển thị tên filter'; + + @override + String get collectionActionHideTitleSearch => 'Ẩn tên filter'; + + @override + String get collectionActionAddDynamicAlbum => 'Thêm album động'; + + @override + String get collectionActionAddShortcut => 'Thêm lối tắt'; + + @override + String get collectionActionSetHome => 'Đặt làm nhà'; + + @override + String get collectionActionEmptyBin => 'Trống rỗng'; + + @override + String get collectionActionCopy => 'Sao chép vào bộ sưu tập'; + + @override + String get collectionActionMove => 'Di chuyển tới bộ sưu tập'; + + @override + String get collectionActionRescan => 'Quét lại'; + + @override + String get collectionActionEdit => 'Chỉnh sửa'; + + @override + String get collectionSearchTitlesHintText => 'Tìm tiêu đề'; + + @override + String get collectionGroupAlbum => 'Theo bộ sưu tập'; + + @override + String get collectionGroupMonth => 'Theo tháng'; + + @override + String get collectionGroupDay => 'Theo ngày'; + + @override + String get sectionNone => 'No sections'; + + @override + String get sectionUnknown => 'Không biết'; + + @override + String get dateToday => 'Hôm nay'; + + @override + String get dateYesterday => 'Hôm qua'; + + @override + String get dateThisMonth => 'Tháng này'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Lỗi khi xóa $count tệp', + one: 'Lỗi khi xóa tệp', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Lỗi khi sao chép $count tệp', + one: 'Lỗi khi sao chép tệp', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Lỗi khi di chuyển $count tệp', + one: 'Lỗi khi di chuyển tệp', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Lỗi khi đặt lại tên $count tệp', + one: 'Lỗi khi đặt lại tên tệp', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Lỗi khi chỉnh sửa $count tệp', + one: 'Lỗi khi chỉnh sửa tệp', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Lỗi khi xuất $count tệp', + one: 'Lỗi khi xuất tệp', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Đã sao chép $count mục', + one: 'Đã sao chép', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Đã di chuyển $count mục', + one: 'Đã di chuyển', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Đã thay tên $count mục', + one: 'Đã đặt lại tên', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'Đã chỉnh sửa $count mục', + one: 'Đã chỉnh sửa', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => 'Không có mục Yêu thích nào'; + + @override + String get collectionEmptyVideos => 'Không có Video nào'; + + @override + String get collectionEmptyImages => 'Không có Ảnh nào'; + + @override + String get collectionEmptyGrantAccessButtonLabel => 'Quyền truy cập'; + + @override + String get collectionSelectSectionTooltip => 'Chọn phần'; + + @override + String get collectionDeselectSectionTooltip => 'Bỏ chọn phần'; + + @override + String get drawerAboutButton => 'Giới thiệu'; + + @override + String get drawerSettingsButton => 'Cài đặt'; + + @override + String get drawerCollectionAll => 'Tất cả bộ sưu tập'; + + @override + String get drawerCollectionFavourites => 'Yêu thích'; + + @override + String get drawerCollectionImages => 'Ảnh'; + + @override + String get drawerCollectionVideos => 'Video'; + + @override + String get drawerCollectionAnimated => 'Hoạt ảnh'; + + @override + String get drawerCollectionMotionPhotos => 'Ảnh động'; + + @override + String get drawerCollectionPanoramas => 'Toàn cảnh'; + + @override + String get drawerCollectionRaws => 'Ảnh RAW'; + + @override + String get drawerCollectionSphericalVideos => 'Video 360 độ'; + + @override + String get drawerAlbumPage => 'Bộ sưu tập'; + + @override + String get drawerCountryPage => 'Quốc gia'; + + @override + String get drawerPlacePage => 'Địa điểm'; + + @override + String get drawerTagPage => 'Thẻ'; + + @override + String get sortByDate => 'Theo thời gian'; + + @override + String get sortByName => 'Theo tên'; + + @override + String get sortByItemCount => 'Theo số mục'; + + @override + String get sortBySize => 'Theo kích cỡ'; + + @override + String get sortByAlbumFileName => 'Theo bộ sưu tập & tên tệp'; + + @override + String get sortByRating => 'Theo xếp hạng'; + + @override + String get sortByDuration => 'Theo thời lượng'; + + @override + String get sortByPath => 'By path'; + + @override + String get sortOrderNewestFirst => 'Mới nhất trước'; + + @override + String get sortOrderOldestFirst => 'Cũ nhất trước'; + + @override + String get sortOrderAtoZ => 'Từ A đến Z'; + + @override + String get sortOrderZtoA => 'Từ Z về A'; + + @override + String get sortOrderHighestFirst => 'Cao nhất trước'; + + @override + String get sortOrderLowestFirst => 'Thấp nhất trước'; + + @override + String get sortOrderLargestFirst => 'Lớn trước'; + + @override + String get sortOrderSmallestFirst => 'Nhỏ trước'; + + @override + String get sortOrderShortestFirst => 'Ngắn nhất trước'; + + @override + String get sortOrderLongestFirst => 'Dài nhất trước'; + + @override + String get albumGroupTier => 'Theo tầng'; + + @override + String get albumGroupType => 'Theo loại'; + + @override + String get albumGroupVolume => 'Theo dung lượng lưu trữ'; + + @override + String get albumMimeTypeMixed => 'Trộn'; + + @override + String get albumPickPageTitleCopy => 'Sao chép đến bộ sưu tập'; + + @override + String get albumPickPageTitleExport => 'Xuất đến bộ sưu tập'; + + @override + String get albumPickPageTitleMove => 'Di chuyển đến bộ sưu tập'; + + @override + String get albumPickPageTitlePick => 'Chọn bộ sưu tập'; + + @override + String get albumCamera => 'Máy Ảnh'; + + @override + String get albumDownload => 'Tải về'; + + @override + String get albumScreenshots => 'Ảnh chụp màn hình'; + + @override + String get albumScreenRecordings => 'Ghi màn hình'; + + @override + String get albumVideoCaptures => 'Ảnh chụp trong Video'; + + @override + String get albumPageTitle => 'Bộ sưu tập'; + + @override + String get albumEmpty => 'Không có bộ sưu tập nào'; + + @override + String get createAlbumButtonLabel => 'TẠO'; + + @override + String get newFilterBanner => 'mới'; + + @override + String get countryPageTitle => 'Quốc gia'; + + @override + String get countryEmpty => 'Không tìm thấy quốc gia'; + + @override + String get statePageTitle => 'Bang/Tỉnh'; + + @override + String get stateEmpty => 'Không tìm thấy Bang/Tỉnh'; + + @override + String get placePageTitle => 'Địa điểm'; + + @override + String get placeEmpty => 'Không có địa điểm'; + + @override + String get tagPageTitle => 'Thẻ'; + + @override + String get tagEmpty => 'Không được gắn thẻ'; + + @override + String get tagPickPageTitle => 'Pick Tag'; + + @override + String get binPageTitle => 'Thùng rác'; + + @override + String get explorerPageTitle => 'Khám phá'; + + @override + String get explorerActionSelectStorageVolume => 'Chọn dung lượng'; + + @override + String get selectStorageVolumeDialogTitle => 'Chọn bộ nhớ'; + + @override + String get searchCollectionFieldHint => 'Tìm bộ sưu tập'; + + @override + String get searchRecentSectionTitle => 'Gần đây'; + + @override + String get searchDateSectionTitle => 'Thời gian'; + + @override + String get searchFormatSectionTitle => 'Formats'; + + @override + String get searchAlbumsSectionTitle => 'Bộ sưu tập'; + + @override + String get searchCountriesSectionTitle => 'Quốc gia'; + + @override + String get searchStatesSectionTitle => 'Bang/Tỉnh'; + + @override + String get searchPlacesSectionTitle => 'Địa điểm'; + + @override + String get searchTagsSectionTitle => 'Thẻ'; + + @override + String get searchRatingSectionTitle => 'Xếp hạng'; + + @override + String get searchMetadataSectionTitle => 'Siêu dữ liệu'; + + @override + String get settingsPageTitle => 'Cài đặt'; + + @override + String get settingsSystemDefault => 'Mặc định hệ thống'; + + @override + String get settingsDefault => 'Mặc định'; + + @override + String get settingsDisabled => 'Vô hiệu hóa'; + + @override + String get settingsEnabled => 'Enabled'; + + @override + String get settingsForced => 'Forced'; + + @override + String get settingsAskEverytime => 'Hỏi mỗi lần'; + + @override + String get settingsModificationWarningDialogMessage => 'Các cài đặt khác sẽ được sửa đổi.'; + + @override + String get settingsSearchFieldLabel => 'Cài đặt tìm kiếm'; + + @override + String get settingsSearchEmpty => 'Không có cài đặt phù hợp'; + + @override + String get settingsActionExport => 'Xuất'; + + @override + String get settingsActionExportDialogTitle => 'Xuất'; + + @override + String get settingsActionImport => 'Nhập'; + + @override + String get settingsActionImportDialogTitle => 'Nhập'; + + @override + String get appExportCovers => 'Ảnh bìa'; + + @override + String get appExportDynamicAlbums => 'Album động'; + + @override + String get appExportFavourites => 'Yêu thích'; + + @override + String get appExportSettings => 'Cài đặt'; + + @override + String get settingsNavigationSectionTitle => 'Điều hướng'; + + @override + String get settingsHomeTile => 'Trang chủ'; + + @override + String get settingsHomeDialogTitle => 'Trang chủ'; + + @override + String get setHomeCustom => 'Tùy chỉnh'; + + @override + String get settingsKeepScreenOnTile => 'Giữ màn hình luôn bật'; + + @override + String get settingsKeepScreenOnDialogTitle => 'Giữ màn hình luôn bật'; + + @override + String get settingsDoubleBackExit => 'Gõ “quay lại” hai lần để thoát'; + + @override + String get settingsConfirmationTile => 'Hộp thoại xác nhận'; + + @override + String get settingsConfirmationDialogTitle => 'Hộp thoại xác nhận'; + + @override + String get settingsConfirmationBeforeDeleteItems => 'Hỏi trước khi xóa các mục vĩnh viễn'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => 'Hỏi trước khi chuyển các mục vào thùng rác'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => 'Hỏi trước khi di chuyển các mục không ghi ngày tháng'; + + @override + String get settingsConfirmationAfterMoveToBinItems => 'Hiển thị thông báo sau khi di chuyển mục vào thùng rác'; + + @override + String get settingsConfirmationVaultDataLoss => 'Hiển thị cảnh báo mất dữ liệu két sắt'; + + @override + String get settingsNavigationDrawerTile => 'Menu điều hướng'; + + @override + String get settingsNavigationDrawerEditorPageTitle => 'Menu điều hướng'; + + @override + String get settingsNavigationDrawerBanner => 'Nhấn và giữ để di chuyển và sắp xếp lại các mục menu.'; + + @override + String get settingsNavigationDrawerTabTypes => 'Loại'; + + @override + String get settingsNavigationDrawerTabAlbums => 'Bộ sưu tập'; + + @override + String get settingsNavigationDrawerTabPages => 'Trang'; + + @override + String get settingsNavigationDrawerAddAlbum => 'Thêm bộ sưu tập'; + + @override + String get settingsNavigationBottomActionsTile => 'Bottom navigation'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => 'Bottom Navigation'; + + @override + String get settingsNavigationBottomActionEditorBanner => 'Touch and hold to move buttons and select which actions are displayed in the bottom navigation bar.'; + + @override + String get settingsThumbnailSectionTitle => 'Ảnh thu nhỏ'; + + @override + String get settingsThumbnailOverlayTile => 'Lớp phủ'; + + @override + String get settingsThumbnailOverlayPageTitle => 'Lớp phủ'; + + @override + String get settingsThumbnailShowHdrIcon => 'Hiển thị biểu tượng HDR'; + + @override + String get settingsThumbnailShowFavouriteIcon => 'Hiện icon Yêu thích'; + + @override + String get settingsThumbnailShowTagIcon => 'Hiện icon Thẻ'; + + @override + String get settingsThumbnailShowLocationIcon => 'Hiện icon Vị trí'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => 'Hiện icon Ảnh động'; + + @override + String get settingsThumbnailShowRating => 'Hiển thị xếp hạng'; + + @override + String get settingsThumbnailShowRawIcon => 'Hiện icon RAW'; + + @override + String get settingsThumbnailShowVideoDuration => 'Hiển thị thời lượng video'; + + @override + String get settingsCollectionQuickActionsTile => 'Hành động nhanh'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => 'Hành động nhanh'; + + @override + String get settingsCollectionQuickActionTabBrowsing => 'Duyệt'; + + @override + String get settingsCollectionQuickActionTabSelecting => 'Chọn'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => 'Nhấn và giữ để di chuyển các nút và chọn hành động nào sẽ được hiển thị khi duyệt các mục.'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => 'Nhấn và giữ để di chuyển các nút và chọn hành động nào sẽ được hiển thị khi chọn mục.'; + + @override + String get settingsCollectionBurstPatternsTile => 'Mẫu Burst'; + + @override + String get settingsCollectionBurstPatternsNone => 'Không có'; + + @override + String get settingsViewerSectionTitle => 'Chế độ xem'; + + @override + String get settingsViewerGestureSideTapNext => 'Chạm vào các cạnh màn hình để hiển thị mục trước/tiếp theo'; + + @override + String get settingsViewerUseCutout => 'Sử dụng vùng cắt'; + + @override + String get settingsViewerMaximumBrightness => 'Độ sáng tối đa'; + + @override + String get settingsMotionPhotoAutoPlay => 'Tự động phát Ảnh động'; + + @override + String get settingsImageBackground => 'Hình nền'; + + @override + String get settingsViewerQuickActionsTile => 'Hành động nhanh'; + + @override + String get settingsViewerQuickActionEditorPageTitle => 'Hành động nhanh'; + + @override + String get settingsViewerQuickActionEditorBanner => 'Chạm và giữ để di chuyển các nút và chọn hành động nào được hiển thị trong trình xem.'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => 'Các nút được hiển thị'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => 'Các nút có sẵn'; + + @override + String get settingsViewerQuickActionEmpty => 'Không có nút nào'; + + @override + String get settingsViewerOverlayTile => 'Lớp phủ'; + + @override + String get settingsViewerOverlayPageTitle => 'Lớp phủ'; + + @override + String get settingsViewerShowOverlayOnOpening => 'Hiển thị khi mở'; + + @override + String get settingsViewerShowHistogram => 'Hiển thị biểu đồ'; + + @override + String get settingsViewerShowMinimap => 'Hiển thị bản đồ thu nhỏ'; + + @override + String get settingsViewerShowZoomLevel => 'Show zoom level'; + + @override + String get settingsViewerShowInformation => 'Hiển thị thông tin'; + + @override + String get settingsViewerShowInformationSubtitle => 'Hiển thị tiêu đề, thời gian, vị trí v..v..'; + + @override + String get settingsViewerShowRatingTags => 'Hiển thị thẻ và xếp hạng'; + + @override + String get settingsViewerShowShootingDetails => 'Hiển thị mục shooting'; + + @override + String get settingsViewerShowDescription => 'Hiển thị mô tả'; + + @override + String get settingsViewerShowOverlayThumbnails => 'Hiển thị ảnh thu nhỏ'; + + @override + String get settingsViewerEnableOverlayBlurEffect => 'Hiệu ứng làm mờ'; + + @override + String get settingsViewerSlideshowTile => 'Trình chiếu'; + + @override + String get settingsViewerSlideshowPageTitle => 'Trình chiếu'; + + @override + String get settingsSlideshowRepeat => 'Lặp lại'; + + @override + String get settingsSlideshowShuffle => 'Xáo trộn'; + + @override + String get settingsSlideshowFillScreen => 'Lắp đầy màn hình'; + + @override + String get settingsSlideshowAnimatedZoomEffect => 'Hiệu ứng phóng to'; + + @override + String get settingsSlideshowTransitionTile => 'Chuyển tiếp'; + + @override + String get settingsSlideshowIntervalTile => 'Khoảng thời gian'; + + @override + String get settingsSlideshowVideoPlaybackTile => 'Xem lại video'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => 'Phát lại video'; + + @override + String get settingsVideoPageTitle => 'Cài đặt video'; + + @override + String get settingsVideoSectionTitle => 'Video'; + + @override + String get settingsVideoShowVideos => 'Hiển thị các Video'; + + @override + String get settingsVideoPlaybackTile => 'Phát lại'; + + @override + String get settingsVideoPlaybackPageTitle => 'Phát lại'; + + @override + String get settingsVideoEnableHardwareAcceleration => 'Tăng tốc phần cứng'; + + @override + String get settingsVideoAutoPlay => 'Tự động phát'; + + @override + String get settingsVideoLoopModeTile => 'Vòng lặp'; + + @override + String get settingsVideoLoopModeDialogTitle => 'Vòng lặp'; + + @override + String get settingsVideoResumptionModeTile => 'Quay lại playback'; + + @override + String get settingsVideoResumptionModeDialogTitle => 'Quay lại playback'; + + @override + String get settingsVideoBackgroundMode => 'Chế độ nền'; + + @override + String get settingsVideoBackgroundModeDialogTitle => 'Chế độ nền'; + + @override + String get settingsVideoControlsTile => 'Điều khiển'; + + @override + String get settingsVideoControlsPageTitle => 'Điều khiển'; + + @override + String get settingsVideoButtonsTile => 'Nút'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => 'Nhấn đúp để phát/tạm dừng'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => 'Nhấn đúp vào các cạnh màn hình để lùi lại/tiến tới'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => 'Vuốt lên hoặc xuống để điều chỉnh độ sáng/âm lượng'; + + @override + String get settingsSubtitleThemeTile => 'Phụ đề'; + + @override + String get settingsSubtitleThemePageTitle => 'Phụ đề'; + + @override + String get settingsSubtitleThemeSample => 'Đây là ví dụ.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => 'Căn chỉnh văn bản'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => 'Căn chỉnh văn bản'; + + @override + String get settingsSubtitleThemeTextPositionTile => 'Vị trí văn bản'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => 'Vị trí văn bản'; + + @override + String get settingsSubtitleThemeTextSize => 'Kích thước văn bản'; + + @override + String get settingsSubtitleThemeShowOutline => 'Hiển thị viền và bóng mờ'; + + @override + String get settingsSubtitleThemeTextColor => 'Màu văn bản'; + + @override + String get settingsSubtitleThemeTextOpacity => 'Độ mờ văn bản'; + + @override + String get settingsSubtitleThemeBackgroundColor => 'Màu nền'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => 'Độ mờ nền'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => 'Trái'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => 'Trung tâm'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => 'Phải'; + + @override + String get settingsPrivacySectionTitle => 'Riêng tư'; + + @override + String get settingsAllowInstalledAppAccess => 'Cho phép truy cập vào kho ứng dụng'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => 'Được sử dụng để cải thiện hiển thị bộ sưu tập'; + + @override + String get settingsAllowErrorReporting => 'Cho phép báo cáo lỗi ẩn danh'; + + @override + String get settingsSaveSearchHistory => 'Lưu lịch sử tìm kiếm'; + + @override + String get settingsEnableBin => 'Dùng thùng rác'; + + @override + String get settingsEnableBinSubtitle => 'Giữ các mục đã xóa 30 ngày'; + + @override + String get settingsDisablingBinWarningDialogMessage => 'Các mục trong thùng rác sẽ bị xóa vĩnh viễn.'; + + @override + String get settingsAllowMediaManagement => 'Cho phép quản lí phương tiện'; + + @override + String get settingsHiddenItemsTile => 'Các mục đã ẩn'; + + @override + String get settingsHiddenItemsPageTitle => 'Mục đã ẩn'; + + @override + String get settingsHiddenFiltersBanner => 'Ảnh và video phù hợp với bộ lọc ẩn sẽ không xuất hiện trong bộ sưu tập của bạn.'; + + @override + String get settingsHiddenFiltersEmpty => 'Không có bộ lọc ẩn nào'; + + @override + String get settingsStorageAccessTile => 'Quyền truy cập bộ nhớ'; + + @override + String get settingsStorageAccessPageTitle => 'Quyền truy cập bộ nhớ'; + + @override + String get settingsStorageAccessBanner => 'Một số thư mục yêu cầu cấp quyền truy cập rõ ràng để sửa đổi các tệp trong đó. Bạn có thể xem lại các thư mục mà trước đây bạn đã cấp quyền truy cập tại đây.'; + + @override + String get settingsStorageAccessEmpty => 'Không có quyền nào được cấp'; + + @override + String get settingsStorageAccessRevokeTooltip => 'Thu hồi'; + + @override + String get settingsAccessibilitySectionTitle => 'Khả năng tiếp cận'; + + @override + String get settingsRemoveAnimationsTile => 'Xóa hiệu ứng ảnh động'; + + @override + String get settingsRemoveAnimationsDialogTitle => 'Xóa hoạt ảnh'; + + @override + String get settingsTimeToTakeActionTile => 'Thời gian hành động'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => 'Hiển thị các lựa chọn thay thế cử chỉ đa chạm'; + + @override + String get settingsDisplaySectionTitle => 'Hiển thị'; + + @override + String get settingsThemeBrightnessTile => 'Chủ đề'; + + @override + String get settingsThemeBrightnessDialogTitle => 'Chủ đề'; + + @override + String get settingsThemeColorHighlights => 'Màu sắc nổi bật'; + + @override + String get settingsThemeEnableDynamicColor => 'Màu sắc Dynamic'; + + @override + String get settingsDisplayRefreshRateModeTile => 'Tốc độ làm mới màn hình'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => 'Tốc độ làm mới'; + + @override + String get settingsDisplayUseTvInterface => 'Giao diện Android TV'; + + @override + String get settingsLanguageSectionTitle => 'Ngôn ngữ và Định dạng'; + + @override + String get settingsLanguageTile => 'Ngôn ngữ'; + + @override + String get settingsLanguagePageTitle => 'Ngôn ngữ'; + + @override + String get settingsCoordinateFormatTile => 'Định dạng tọa độ'; + + @override + String get settingsCoordinateFormatDialogTitle => 'Định dạng tọa độ'; + + @override + String get settingsUnitSystemTile => 'Đơn vị'; + + @override + String get settingsUnitSystemDialogTitle => 'Đơn vị'; + + @override + String get settingsForceWesternArabicNumeralsTile => 'Buộc chữ số Ả Rập'; + + @override + String get settingsScreenSaverPageTitle => 'Bảo vệ màn hình'; + + @override + String get settingsWidgetPageTitle => 'Khung ảnh'; + + @override + String get settingsWidgetShowOutline => 'Đường viền'; + + @override + String get settingsWidgetOpenPage => 'Khi nhấn vào tiện ích'; + + @override + String get settingsWidgetDisplayedItem => 'Mục hiển thị'; + + @override + String get settingsCollectionTile => 'Bộ sưu tập'; + + @override + String get statsPageTitle => 'Thống kê'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '${count}mục với thông tin vị trí', + one: '1 mục với thông tin vị trí', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => 'Quốc gia'; + + @override + String get statsTopStatesSectionTitle => 'Bang/Tỉnh'; + + @override + String get statsTopPlacesSectionTitle => 'Địa điểm'; + + @override + String get statsTopTagsSectionTitle => 'Thẻ'; + + @override + String get statsTopAlbumsSectionTitle => 'Bộ sưu tập hàng đầu'; + + @override + String get viewerOpenPanoramaButtonLabel => 'MỞ CHẾ ĐỘ TOÀN CẢNH'; + + @override + String get viewerSetWallpaperButtonLabel => 'CÀI HÌNH NỀN'; + + @override + String get viewerErrorUnknown => 'Ôi!'; + + @override + String get viewerErrorDoesNotExist => 'Tệp không còn tồn tại.'; + + @override + String get viewerInfoPageTitle => 'Thông tin'; + + @override + String get viewerInfoBackToViewerTooltip => 'Trở lại chế độ xem'; + + @override + String get viewerInfoUnknown => 'Không biết'; + + @override + String get viewerInfoLabelDescription => 'Mô tả'; + + @override + String get viewerInfoLabelTitle => 'Tiêu đề'; + + @override + String get viewerInfoLabelDate => 'Thời gian'; + + @override + String get viewerInfoLabelResolution => 'Phân tích'; + + @override + String get viewerInfoLabelSize => 'Kích cỡ'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => 'Đường dẫn'; + + @override + String get viewerInfoLabelDuration => 'Thời lượng'; + + @override + String get viewerInfoLabelOwner => 'Chủ sở hữu'; + + @override + String get viewerInfoLabelCoordinates => 'Tọa độ'; + + @override + String get viewerInfoLabelAddress => 'Địa chỉ'; + + @override + String get mapStyleDialogTitle => 'Kiểu bản đồ'; + + @override + String get mapStyleDialogAddStyle => 'Add style'; + + @override + String get mapStyleTooltip => 'Chọn kiểu bản đồ'; + + @override + String get mapStyleEditorDialogName => 'Name'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => 'Subdomains'; + + @override + String get mapStyleEditorDialogUserAgent => 'User-Agent'; + + @override + String get mapZoomInTooltip => 'Phóng to'; + + @override + String get mapZoomOutTooltip => 'Thu nhỏ'; + + @override + String get mapPointNorthUpTooltip => 'Hướng về phía bắc'; + + @override + String get mapAttributionOsmData => 'Dữ liệu bản đồ © [OpenStreetMap](https://www.openstreetmap.org/copyright) đóng góp'; + + @override + String get mapAttributionOsmLiberty => 'Cung cấp bởi [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Được lưu trữ bởi [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Cung cấp bởi [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => 'Cung cấp bởi [HOT](https://www.hotosm.org/) • Lưu trữ bởi [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => 'Cung cấp bởi [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => 'Xen trên Bản đồ'; + + @override + String get mapEmptyRegion => 'Không có ảnh nào tại khu vực này'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => 'Không thể trích xuất dữ liệu được nhúng'; + + @override + String get viewerInfoOpenLinkText => 'Mở'; + + @override + String get viewerInfoViewXmlLinkText => 'Xem XML'; + + @override + String get viewerInfoSearchFieldLabel => 'Tìm kiếm metadata'; + + @override + String get viewerInfoSearchEmpty => 'Không phù hợp'; + + @override + String get viewerInfoSearchSuggestionDate => 'Ngày & Giờ'; + + @override + String get viewerInfoSearchSuggestionDescription => 'Mô tả'; + + @override + String get viewerInfoSearchSuggestionDimensions => 'Kích thước'; + + @override + String get viewerInfoSearchSuggestionResolution => 'Phân tích'; + + @override + String get viewerInfoSearchSuggestionRights => 'Luật'; + + @override + String get wallpaperUseScrollEffect => 'Sử dụng hiệu ứng cuộn trên màn hình chính'; + + @override + String get tagEditorPageTitle => 'Chỉnh sửa thẻ'; + + @override + String get tagEditorPageNewTagFieldLabel => 'Tag mới'; + + @override + String get tagEditorPageAddTagTooltip => 'Thêm tag'; + + @override + String get tagEditorSectionRecent => 'Gần đây'; + + @override + String get tagEditorSectionPlaceholders => 'Trình giữ chổ'; + + @override + String get tagEditorDiscardDialogMessage => 'Bạn có muốn hủy các thay đổi không?'; + + @override + String get tagPlaceholderCountry => 'Quốc gia'; + + @override + String get tagPlaceholderState => 'Bang/Tỉnh thành'; + + @override + String get tagPlaceholderPlace => 'Địa điểm'; + + @override + String get panoramaEnableSensorControl => 'Bật điều khiển cảm biến'; + + @override + String get panoramaDisableSensorControl => 'Tắt điều khiển cảm biến'; + + @override + String get sourceViewerPageTitle => 'Nguồn'; +} diff --git a/lib/l10ngen/app_localizations_zh.dart b/lib/l10ngen/app_localizations_zh.dart new file mode 100644 index 0000000..4d2dead --- /dev/null +++ b/lib/l10ngen/app_localizations_zh.dart @@ -0,0 +1,4750 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Chinese (`zh`). +class AppLocalizationsZh extends AppLocalizations { + AppLocalizationsZh([String locale = 'zh']) : super(locale); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => '欢迎使用 Aves'; + + @override + String get welcomeOptional => '可选'; + + @override + String get welcomeTermsToggle => '我同意这些使用条款和条件'; + + @override + String itemCount(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 项', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 列', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 秒', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 分', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 天', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => '应用'; + + @override + String get createButtonLabel => '创建'; + + @override + String get deleteButtonLabel => '删除'; + + @override + String get nextButtonLabel => '下一步'; + + @override + String get showButtonLabel => '显示'; + + @override + String get hideButtonLabel => '隐藏'; + + @override + String get continueButtonLabel => '继续'; + + @override + String get saveCopyButtonLabel => '保存副本'; + + @override + String get applyTooltip => '应用'; + + @override + String get cancelTooltip => '取消'; + + @override + String get changeTooltip => '更改'; + + @override + String get clearTooltip => '清除'; + + @override + String get previousTooltip => '上一组'; + + @override + String get nextTooltip => '下一组'; + + @override + String get showTooltip => '显示'; + + @override + String get hideTooltip => '隐藏'; + + @override + String get actionRemove => '移除'; + + @override + String get resetTooltip => '重置'; + + @override + String get saveTooltip => '保存'; + + @override + String get stopTooltip => '停止'; + + @override + String get pickTooltip => '挑选'; + + @override + String get doubleBackExitMessage => '再按一次退出'; + + @override + String get doNotAskAgain => '不再询问'; + + @override + String get sourceStateLoading => '加载中'; + + @override + String get sourceStateCataloguing => '正在进行编目'; + + @override + String get sourceStateLocatingCountries => '正在定位地区'; + + @override + String get sourceStateLocatingPlaces => '正在定位地点'; + + @override + String get chipActionDelete => '删除'; + + @override + String get chipActionRemove => '删除'; + + @override + String get chipActionShowCollection => '在媒体集中显示'; + + @override + String get chipActionGoToAlbumPage => '在相册中显示'; + + @override + String get chipActionGoToCountryPage => '在地区中显示'; + + @override + String get chipActionGoToPlacePage => '在地点中显示'; + + @override + String get chipActionGoToTagPage => '在标签中显示'; + + @override + String get chipActionGoToExplorerPage => '在资源管理器中显示'; + + @override + String get chipActionDecompose => '分割'; + + @override + String get chipActionFilterOut => '筛除'; + + @override + String get chipActionFilterIn => '筛选'; + + @override + String get chipActionHide => '隐藏'; + + @override + String get chipActionLock => '锁定'; + + @override + String get chipActionPin => '置顶'; + + @override + String get chipActionUnpin => '取消置顶'; + + @override + String get chipActionGroup => '更改分组'; + + @override + String get chipActionRename => '重命名'; + + @override + String get chipActionSetCover => '设置封面'; + + @override + String get chipActionShowCountryStates => '显示区域'; + + @override + String get chipActionCreateGroup => '创建组'; + + @override + String get chipActionCreateAlbum => '创建相册'; + + @override + String get chipActionCreateVault => '创建保险库'; + + @override + String get chipActionConfigureVault => '配置保险库'; + + @override + String get entryActionCopyToClipboard => '复制到剪贴板'; + + @override + String get entryActionDelete => '删除'; + + @override + String get entryActionConvert => '转换'; + + @override + String get entryActionExport => '导出'; + + @override + String get entryActionInfo => '信息'; + + @override + String get entryActionRename => '重命名'; + + @override + String get entryActionRestore => '恢复'; + + @override + String get entryActionRotateCCW => '逆时针旋转'; + + @override + String get entryActionRotateCW => '顺时针旋转'; + + @override + String get entryActionFlip => '水平翻转'; + + @override + String get entryActionPrint => '打印'; + + @override + String get entryActionShare => '分享'; + + @override + String get entryActionShareImageOnly => '仅分享图片'; + + @override + String get entryActionShareVideoOnly => '仅分享视频'; + + @override + String get entryActionViewSource => '查看源码'; + + @override + String get entryActionShowGeoTiffOnMap => '显示为地图叠加层'; + + @override + String get entryActionConvertMotionPhotoToStillImage => '转换为静态图像'; + + @override + String get entryActionViewMotionPhotoVideo => '打开视频'; + + @override + String get entryActionEdit => '编辑'; + + @override + String get entryActionOpen => '打开方式'; + + @override + String get entryActionSetAs => '设置为'; + + @override + String get entryActionCast => '投屏'; + + @override + String get entryActionOpenMap => '在地图应用中显示'; + + @override + String get entryActionRotateScreen => '旋转屏幕'; + + @override + String get entryActionAddFavourite => '加为收藏'; + + @override + String get entryActionRemoveFavourite => '取消收藏'; + + @override + String get videoActionCaptureFrame => '捕获帧'; + + @override + String get videoActionMute => '静音'; + + @override + String get videoActionUnmute => '取消静音'; + + @override + String get videoActionPause => '暂停'; + + @override + String get videoActionPlay => '播放'; + + @override + String get videoActionReplay10 => '前进 10 秒'; + + @override + String get videoActionSkip10 => '后退 10 秒'; + + @override + String get videoActionShowPreviousFrame => '显示上一帧'; + + @override + String get videoActionShowNextFrame => '显示下一帧'; + + @override + String get videoActionSelectStreams => '选择音轨'; + + @override + String get videoActionSetSpeed => '播放速度'; + + @override + String get videoActionABRepeat => 'A-B 循环播放'; + + @override + String get videoRepeatActionSetStart => '设置起点'; + + @override + String get videoRepeatActionSetEnd => '设置终点'; + + @override + String get viewerActionSettings => '设置'; + + @override + String get viewerActionLock => '锁定查看器'; + + @override + String get viewerActionUnlock => '解锁查看器'; + + @override + String get slideshowActionResume => '继续'; + + @override + String get slideshowActionShowInCollection => '在媒体集中显示'; + + @override + String get entryInfoActionEditDate => '编辑日期和时间'; + + @override + String get entryInfoActionEditLocation => '编辑位置'; + + @override + String get entryInfoActionEditTitleDescription => '编辑标题和描述'; + + @override + String get entryInfoActionEditRating => '修改评分'; + + @override + String get entryInfoActionEditTags => '编辑标签'; + + @override + String get entryInfoActionRemoveMetadata => '移除元数据'; + + @override + String get entryInfoActionExportMetadata => '导出元数据'; + + @override + String get entryInfoActionRemoveLocation => '移除位置'; + + @override + String get editorActionTransform => '转换'; + + @override + String get editorTransformCrop => '裁剪'; + + @override + String get editorTransformRotate => '旋转'; + + @override + String get cropAspectRatioFree => '自由'; + + @override + String get cropAspectRatioOriginal => '原始'; + + @override + String get cropAspectRatioSquare => '方形'; + + @override + String get filterAspectRatioLandscapeLabel => '横向'; + + @override + String get filterAspectRatioPortraitLabel => '纵向'; + + @override + String get filterBinLabel => '回收站'; + + @override + String get filterFavouriteLabel => '收藏夹'; + + @override + String get filterNoDateLabel => '未注明日期'; + + @override + String get filterNoAddressLabel => '无地址'; + + @override + String get filterLocatedLabel => '有定位'; + + @override + String get filterNoLocationLabel => '无定位'; + + @override + String get filterNoRatingLabel => '未评分'; + + @override + String get filterTaggedLabel => '有标签'; + + @override + String get filterNoTagLabel => '无标签'; + + @override + String get filterNoTitleLabel => '无标题'; + + @override + String get filterOnThisDayLabel => '选择日期'; + + @override + String get filterRecentlyAddedLabel => '最近添加'; + + @override + String get filterRatingRejectedLabel => '拒绝评分'; + + @override + String get filterTypeAnimatedLabel => '动图'; + + @override + String get filterTypeMotionPhotoLabel => '动态照片'; + + @override + String get filterTypePanoramaLabel => '全景图'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° 视频'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => '图像'; + + @override + String get filterMimeVideoLabel => '视频'; + + @override + String get accessibilityAnimationsRemove => '禁用屏幕效果'; + + @override + String get accessibilityAnimationsKeep => '保留屏幕效果'; + + @override + String get albumTierNew => '新的'; + + @override + String get albumTierPinned => '钉选'; + + @override + String get albumTierGroups => '组'; + + @override + String get albumTierSpecial => '普通'; + + @override + String get albumTierApps => '应用'; + + @override + String get albumTierVaults => '保险库'; + + @override + String get albumTierDynamic => '动态'; + + @override + String get albumTierRegular => '其他'; + + @override + String get coordinateFormatDms => '度分秒'; + + @override + String get coordinateFormatDdm => '度分秒十进制坐标'; + + @override + String get coordinateFormatDecimal => '十进制度'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => '最高刷新率'; + + @override + String get displayRefreshRatePreferLowest => '最低刷新率'; + + @override + String get keepScreenOnNever => '从不'; + + @override + String get keepScreenOnVideoPlayback => '视频播放期间'; + + @override + String get keepScreenOnViewerOnly => '仅查看器页面'; + + @override + String get keepScreenOnAlways => '始终'; + + @override + String get lengthUnitPixel => '像素'; + + @override + String get lengthUnitPercent => '百分比'; + + @override + String get mapStyleGoogleNormal => 'Google 地图'; + + @override + String get mapStyleGoogleHybrid => 'Google 地图 (卫星图像)'; + + @override + String get mapStyleGoogleTerrain => 'Google 地图 (地形)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => '从不'; + + @override + String get maxBrightnessAlways => '始终'; + + @override + String get nameConflictStrategyRename => '重命名'; + + @override + String get nameConflictStrategyReplace => '替换'; + + @override + String get nameConflictStrategySkip => '跳过'; + + @override + String get overlayHistogramNone => '无'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => '亮度'; + + @override + String get subtitlePositionTop => '顶部'; + + @override + String get subtitlePositionBottom => '底部'; + + @override + String get themeBrightnessLight => '浅色'; + + @override + String get themeBrightnessDark => '深色'; + + @override + String get themeBrightnessBlack => '黑色'; + + @override + String get unitSystemMetric => '公制'; + + @override + String get unitSystemImperial => '英制'; + + @override + String get vaultLockTypePattern => '图案'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => '密码'; + + @override + String get settingsVideoEnablePip => '画中画'; + + @override + String get videoControlsPlayOutside => '用其他播放器打开'; + + @override + String get videoLoopModeNever => '从不'; + + @override + String get videoLoopModeShortOnly => '仅短视频'; + + @override + String get videoLoopModeAlways => '始终'; + + @override + String get videoPlaybackSkip => '跳过'; + + @override + String get videoPlaybackMuted => '静音播放'; + + @override + String get videoPlaybackWithSound => '有声播放'; + + @override + String get videoResumptionModeNever => '从不'; + + @override + String get videoResumptionModeAlways => '始终'; + + @override + String get viewerTransitionSlide => '滑动'; + + @override + String get viewerTransitionParallax => '视差滚动'; + + @override + String get viewerTransitionFade => '淡入淡出'; + + @override + String get viewerTransitionZoomIn => '放大'; + + @override + String get viewerTransitionNone => '无'; + + @override + String get wallpaperTargetHome => '主屏幕'; + + @override + String get wallpaperTargetLock => '锁屏界面'; + + @override + String get wallpaperTargetHomeLock => '主屏幕 + 锁屏界面'; + + @override + String get widgetDisplayedItemRandom => '随机'; + + @override + String get widgetDisplayedItemMostRecent => '最新'; + + @override + String get widgetOpenPageHome => '打开主页'; + + @override + String get widgetOpenPageCollection => '打开媒体集'; + + @override + String get widgetOpenPageViewer => '打开查看器'; + + @override + String get widgetTapUpdateWidget => '刷新和切换小部件内容'; + + @override + String get storageVolumeDescriptionFallbackPrimary => '内部存储'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD 卡'; + + @override + String get rootDirectoryDescription => '根目录'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” 目录'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return '请在下一屏幕中选择“$volume”的$directory,以授予本应用对其的访问权限'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return '本应用无权修改“$volume”的$directory中的文件\n\n请使用预装的文件管理器或图库应用将项目移至其他目录'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return '此操作需要“$volume”上具有 $neededSize 可用空间才能完成,实际仅剩 $freeSize'; + } + + @override + String get missingSystemFilePickerDialogMessage => '系统文件选择器缺失或被禁用,请将其启用后再试'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '此操作不支持以下类型的项目: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => '目标文件夹中具有同名文件'; + + @override + String get nameConflictDialogMultipleSourceMessage => '存在同名文件'; + + @override + String get addShortcutDialogLabel => '快捷方式标签'; + + @override + String get addShortcutButtonLabel => '添加'; + + @override + String get noMatchingAppDialogMessage => '无对应的处理程序'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '将这 $countString 项移至回收站?', + one: '将此项移至回收站?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '删除这 $countString 项?', + one: '删除此项?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => '继续之前保存项目日期?'; + + @override + String get moveUndatedConfirmationDialogSetDate => '保存日期'; + + @override + String videoResumeDialogMessage(String time) { + return '想接着在 $time 继续播放吗?'; + } + + @override + String get videoStartOverButtonLabel => '从头播放'; + + @override + String get videoResumeButtonLabel => '继续'; + + @override + String get setCoverDialogLatest => '最新项'; + + @override + String get setCoverDialogAuto => '自动'; + + @override + String get setCoverDialogCustom => '自定义'; + + @override + String get hideFilterConfirmationDialogMessage => '匹配的照片和视频将从收藏中隐藏,你可以通过“隐私”设置中再次显示它们\n\n确定要将其隐藏吗?'; + + @override + String get newAlbumDialogTitle => '新相册'; + + @override + String get newAlbumDialogNameLabel => '相册名称'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => '相册已存在'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => '目录已存在'; + + @override + String get newAlbumDialogStorageLabel => '存储:'; + + @override + String get newDynamicAlbumDialogTitle => '新动态专辑'; + + @override + String get dynamicAlbumAlreadyExists => '动态专辑已存在'; + + @override + String get newGroupDialogTitle => '新建组'; + + @override + String get newGroupDialogNameLabel => '组名'; + + @override + String get groupAlreadyExists => '组已存在'; + + @override + String get groupEmpty => '没有组'; + + @override + String get ungrouped => '未分组'; + + @override + String get groupPickerTitle => '挑选组'; + + @override + String get groupPickerUseThisGroupButton => '使用该组'; + + @override + String get newVaultWarningDialogMessage => '保险库中的项目仅供此应用使用,其他应用不可用。\n\n如果您卸载此应用或清除此应用数据,您将丢失所有这些项目。'; + + @override + String get newVaultDialogTitle => '新保险库'; + + @override + String get configureVaultDialogTitle => '设置保险库'; + + @override + String get vaultDialogLockModeWhenScreenOff => '屏幕关闭时锁定'; + + @override + String get vaultDialogLockTypeLabel => '锁定类型'; + + @override + String get patternDialogEnter => '输入图形'; + + @override + String get patternDialogConfirm => '确认图案'; + + @override + String get pinDialogEnter => '输入PIN'; + + @override + String get pinDialogConfirm => '确认PIN'; + + @override + String get passwordDialogEnter => '输入密码'; + + @override + String get passwordDialogConfirm => '确认密码'; + + @override + String get authenticateToConfigureVault => '验证以设置保险库'; + + @override + String get authenticateToUnlockVault => '验证以解锁保险库'; + + @override + String get vaultBinUsageDialogMessage => '有些保险库正在使用资源回收站。'; + + @override + String get renameAlbumDialogLabel => '新名称'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => '目录已存在'; + + @override + String get renameEntrySetPageTitle => '重命名'; + + @override + String get renameEntrySetPagePatternFieldLabel => '命名模式'; + + @override + String get renameEntrySetPageInsertTooltip => '插入字段'; + + @override + String get renameEntrySetPagePreviewSectionTitle => '预览'; + + @override + String get renameProcessorCounter => '计数器'; + + @override + String get renameProcessorHash => '哈希'; + + @override + String get renameProcessorName => '名称'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '删除此相册及其中的 $countString 个项目?', + one: '删除此相册及其中的一个项目?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '删除这些相册及其中的 $countString 个项目?', + one: '删除这些相册及其中的一个项目?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => '格式:'; + + @override + String get exportEntryDialogWidth => '宽度'; + + @override + String get exportEntryDialogHeight => '高度'; + + @override + String get exportEntryDialogQuality => '画质'; + + @override + String get exportEntryDialogWriteMetadata => '写入元数据'; + + @override + String get renameEntryDialogLabel => '新名称'; + + @override + String get editEntryDialogCopyFromItem => '复制自其他项目'; + + @override + String get editEntryDialogTargetFieldsHeader => '待修改的字段'; + + @override + String get editEntryDateDialogTitle => '日期和时间'; + + @override + String get editEntryDateDialogSetCustom => '设置自定义日期'; + + @override + String get editEntryDateDialogCopyField => '复制自其他日期'; + + @override + String get editEntryDateDialogExtractFromTitle => '从标题提取'; + + @override + String get editEntryDateDialogShift => '转移'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => '文件修改日期'; + + @override + String get durationDialogHours => '时'; + + @override + String get durationDialogMinutes => '分'; + + @override + String get durationDialogSeconds => '秒'; + + @override + String get editEntryLocationDialogTitle => '位置'; + + @override + String get editEntryLocationDialogSetCustom => '设置自定义位置'; + + @override + String get editEntryLocationDialogChooseOnMap => '从地图上选择'; + + @override + String get editEntryLocationDialogImportGpx => '导入 GPX'; + + @override + String get editEntryLocationDialogLatitude => '纬度'; + + @override + String get editEntryLocationDialogLongitude => '经度'; + + @override + String get editEntryLocationDialogTimeShift => '时间时移'; + + @override + String get locationPickerUseThisLocationButton => '使用此位置'; + + @override + String get editEntryRatingDialogTitle => '评分'; + + @override + String get removeEntryMetadataDialogTitle => '元数据移除工具'; + + @override + String get removeEntryMetadataDialogAll => '全部'; + + @override + String get removeEntryMetadataDialogMore => '更多'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => '播放动态照片中的视频需要 XMP\n\n确定要删除它吗?'; + + @override + String get videoSpeedDialogLabel => '播放速度'; + + @override + String get videoStreamSelectionDialogVideo => '视频'; + + @override + String get videoStreamSelectionDialogAudio => '音频'; + + @override + String get videoStreamSelectionDialogText => '字幕'; + + @override + String get videoStreamSelectionDialogOff => '关'; + + @override + String get videoStreamSelectionDialogTrack => '音轨'; + + @override + String get videoStreamSelectionDialogNoSelection => '无其他音轨'; + + @override + String get genericSuccessFeedback => '完成!'; + + @override + String get genericFailureFeedback => '失败'; + + @override + String get genericDangerWarningDialogMessage => '你确定吗?'; + + @override + String get tooManyItemsErrorDialogMessage => '用较少的项目重试。'; + + @override + String get menuActionConfigureView => '查看'; + + @override + String get menuActionSelect => '选择'; + + @override + String get menuActionSelectAll => '全选'; + + @override + String get menuActionSelectNone => '全不选'; + + @override + String get menuActionMap => '地图'; + + @override + String get menuActionSlideshow => '幻灯片'; + + @override + String get menuActionStats => '统计'; + + @override + String get viewDialogSortSectionTitle => '排序'; + + @override + String get viewDialogGroupSectionTitle => '分区'; + + @override + String get viewDialogLayoutSectionTitle => '布局'; + + @override + String get viewDialogReverseSortOrder => '反向排序'; + + @override + String get tileLayoutMosaic => '马赛克'; + + @override + String get tileLayoutGrid => '网格'; + + @override + String get tileLayoutList => '列表'; + + @override + String get castDialogTitle => '投屏设备'; + + @override + String get coverDialogTabCover => '封面'; + + @override + String get coverDialogTabApp => '应用'; + + @override + String get coverDialogTabColor => '颜色'; + + @override + String get appPickDialogTitle => '选择应用'; + + @override + String get appPickDialogNone => '无'; + + @override + String get aboutPageTitle => '关于'; + + @override + String get aboutLinkLicense => '许可协议'; + + @override + String get aboutLinkPolicy => '隐私政策'; + + @override + String get aboutBugSectionTitle => '报告错误'; + + @override + String get aboutBugSaveLogInstruction => '将应用日志保存到文件'; + + @override + String get aboutBugCopyInfoInstruction => '复制系统信息'; + + @override + String get aboutBugCopyInfoButton => '复制'; + + @override + String get aboutBugReportInstruction => '在 GitHub 上报告日志和系统信息'; + + @override + String get aboutBugReportButton => '报告'; + + @override + String get aboutDataUsageSectionTitle => '数据使用量'; + + @override + String get aboutDataUsageData => '数据'; + + @override + String get aboutDataUsageCache => '缓存'; + + @override + String get aboutDataUsageDatabase => '数据库'; + + @override + String get aboutDataUsageMisc => '其他'; + + @override + String get aboutDataUsageInternal => '内部存储'; + + @override + String get aboutDataUsageExternal => '外部存储'; + + @override + String get aboutDataUsageClearCache => '清理缓存'; + + @override + String get aboutCreditsSectionTitle => '鸣谢'; + + @override + String get aboutCreditsWorldAtlas1 => '本应用使用的 TopoJSON 文件来自'; + + @override + String get aboutCreditsWorldAtlas2 => '符合 ISC 许可协议'; + + @override + String get aboutTranslatorsSectionTitle => '翻译人员'; + + @override + String get aboutLicensesSectionTitle => '开源许可协议'; + + @override + String get aboutLicensesBanner => '本应用使用以下开源软件包和库。'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android 库'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter 插件'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter 软件包'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart 软件包'; + + @override + String get aboutLicensesShowAllButtonLabel => '显示所有许可协议'; + + @override + String get policyPageTitle => '隐私政策'; + + @override + String get collectionPageTitle => '媒体集'; + + @override + String get collectionPickPageTitle => '挑选'; + + @override + String get collectionSelectPageTitle => '选择项目'; + + @override + String get collectionActionShowTitleSearch => '显示标题搜索框'; + + @override + String get collectionActionHideTitleSearch => '隐藏标题搜索框'; + + @override + String get collectionActionAddDynamicAlbum => '添加动态专辑'; + + @override + String get collectionActionAddShortcut => '添加快捷方式'; + + @override + String get collectionActionSetHome => '设置为首页'; + + @override + String get collectionActionEmptyBin => '清空回收站'; + + @override + String get collectionActionCopy => '复制到相册'; + + @override + String get collectionActionMove => '移至相册'; + + @override + String get collectionActionRescan => '重新扫描'; + + @override + String get collectionActionEdit => '编辑'; + + @override + String get collectionSearchTitlesHintText => '搜索标题'; + + @override + String get collectionGroupAlbum => '按相册'; + + @override + String get collectionGroupMonth => '按月份'; + + @override + String get collectionGroupDay => '按天'; + + @override + String get sectionNone => '不区分'; + + @override + String get sectionUnknown => '未知'; + + @override + String get dateToday => '今天'; + + @override + String get dateYesterday => '昨天'; + + @override + String get dateThisMonth => '本月'; + + @override + String collectionDeleteFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 项删除失败', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 项复制失败', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 项移动失败', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 项重命名失败', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 项编辑失败', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 页导出失败', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '已复制 $countString 项', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '已移动 $countString 项', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '已重命名 $countString 项', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '已编辑 $countString 项', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => '无收藏项'; + + @override + String get collectionEmptyVideos => '无视频'; + + @override + String get collectionEmptyImages => '无图像'; + + @override + String get collectionEmptyGrantAccessButtonLabel => '授予访问权限'; + + @override + String get collectionSelectSectionTooltip => '选择部分'; + + @override + String get collectionDeselectSectionTooltip => '取消选择部分'; + + @override + String get drawerAboutButton => '关于'; + + @override + String get drawerSettingsButton => '设置'; + + @override + String get drawerCollectionAll => '所有媒体集'; + + @override + String get drawerCollectionFavourites => '收藏夹'; + + @override + String get drawerCollectionImages => '图像'; + + @override + String get drawerCollectionVideos => '视频'; + + @override + String get drawerCollectionAnimated => '动图'; + + @override + String get drawerCollectionMotionPhotos => '动态照片'; + + @override + String get drawerCollectionPanoramas => '全景图'; + + @override + String get drawerCollectionRaws => 'Raw 照片'; + + @override + String get drawerCollectionSphericalVideos => '360° 视频'; + + @override + String get drawerAlbumPage => '相册'; + + @override + String get drawerCountryPage => '地区'; + + @override + String get drawerPlacePage => '地点'; + + @override + String get drawerTagPage => '标签'; + + @override + String get sortByDate => '按日期'; + + @override + String get sortByName => '按名称'; + + @override + String get sortByItemCount => '按数量'; + + @override + String get sortBySize => '按大小'; + + @override + String get sortByAlbumFileName => '按相册和项目标题'; + + @override + String get sortByRating => '按评分'; + + @override + String get sortByDuration => '按时长'; + + @override + String get sortByPath => '按路径'; + + @override + String get sortOrderNewestFirst => '降序'; + + @override + String get sortOrderOldestFirst => '升序'; + + @override + String get sortOrderAtoZ => 'A — Z'; + + @override + String get sortOrderZtoA => 'Z — A'; + + @override + String get sortOrderHighestFirst => '由高到低'; + + @override + String get sortOrderLowestFirst => '由低到高'; + + @override + String get sortOrderLargestFirst => '由大到小'; + + @override + String get sortOrderSmallestFirst => '由小到大'; + + @override + String get sortOrderShortestFirst => '先短后长'; + + @override + String get sortOrderLongestFirst => '先长后短'; + + @override + String get albumGroupTier => '按层级'; + + @override + String get albumGroupType => '按类型'; + + @override + String get albumGroupVolume => '按存储卷'; + + @override + String get albumMimeTypeMixed => '混合'; + + @override + String get albumPickPageTitleCopy => '复制到相册'; + + @override + String get albumPickPageTitleExport => '导出到相册'; + + @override + String get albumPickPageTitleMove => '移至相册'; + + @override + String get albumPickPageTitlePick => '选择相册'; + + @override + String get albumCamera => '相机'; + + @override + String get albumDownload => '下载'; + + @override + String get albumScreenshots => '截图'; + + @override + String get albumScreenRecordings => '屏幕录制'; + + @override + String get albumVideoCaptures => '视频捕获'; + + @override + String get albumPageTitle => '相册'; + + @override + String get albumEmpty => '无相册'; + + @override + String get createAlbumButtonLabel => '创建'; + + @override + String get newFilterBanner => '新的'; + + @override + String get countryPageTitle => '地区'; + + @override + String get countryEmpty => '无地区'; + + @override + String get statePageTitle => '区域'; + + @override + String get stateEmpty => '没有区域'; + + @override + String get placePageTitle => '地点'; + + @override + String get placeEmpty => '没有地点'; + + @override + String get tagPageTitle => '标签'; + + @override + String get tagEmpty => '无标签'; + + @override + String get tagPickPageTitle => '选择标签'; + + @override + String get binPageTitle => '回收站'; + + @override + String get explorerPageTitle => '资源管理器'; + + @override + String get explorerActionSelectStorageVolume => '选择存储器'; + + @override + String get selectStorageVolumeDialogTitle => '选择存储器'; + + @override + String get searchCollectionFieldHint => '搜索媒体集'; + + @override + String get searchRecentSectionTitle => '最近'; + + @override + String get searchDateSectionTitle => '日期'; + + @override + String get searchFormatSectionTitle => '格式'; + + @override + String get searchAlbumsSectionTitle => '相册'; + + @override + String get searchCountriesSectionTitle => '地区'; + + @override + String get searchStatesSectionTitle => '区域'; + + @override + String get searchPlacesSectionTitle => '地点'; + + @override + String get searchTagsSectionTitle => '标签'; + + @override + String get searchRatingSectionTitle => '评分'; + + @override + String get searchMetadataSectionTitle => '元数据'; + + @override + String get settingsPageTitle => '设置'; + + @override + String get settingsSystemDefault => '系统默认'; + + @override + String get settingsDefault => '默认'; + + @override + String get settingsDisabled => '禁用'; + + @override + String get settingsEnabled => '已启用'; + + @override + String get settingsForced => '已强制'; + + @override + String get settingsAskEverytime => '每次都询问'; + + @override + String get settingsModificationWarningDialogMessage => '其他设置将被修改。'; + + @override + String get settingsSearchFieldLabel => '搜索设置'; + + @override + String get settingsSearchEmpty => '无匹配设置项'; + + @override + String get settingsActionExport => '导出'; + + @override + String get settingsActionExportDialogTitle => '导出'; + + @override + String get settingsActionImport => '导入'; + + @override + String get settingsActionImportDialogTitle => '导入'; + + @override + String get appExportCovers => '封面'; + + @override + String get appExportDynamicAlbums => '动态专辑'; + + @override + String get appExportFavourites => '收藏夹'; + + @override + String get appExportSettings => '设置'; + + @override + String get settingsNavigationSectionTitle => '导航'; + + @override + String get settingsHomeTile => '主页'; + + @override + String get settingsHomeDialogTitle => '主页'; + + @override + String get setHomeCustom => '自定义'; + + @override + String get settingsKeepScreenOnTile => '保持亮屏'; + + @override + String get settingsKeepScreenOnDialogTitle => '保持亮屏'; + + @override + String get settingsDoubleBackExit => '按两次返回键退出'; + + @override + String get settingsConfirmationTile => '确认对话框'; + + @override + String get settingsConfirmationDialogTitle => '确认对话框'; + + @override + String get settingsConfirmationBeforeDeleteItems => '永久删除项目之前询问'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => '移至回收站之前询问'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => '移动未注明日期的项目之前询问'; + + @override + String get settingsConfirmationAfterMoveToBinItems => '移至回收站后显示消息'; + + @override + String get settingsConfirmationVaultDataLoss => '显示保险库数据丢失警报'; + + @override + String get settingsNavigationDrawerTile => '导航栏菜单'; + + @override + String get settingsNavigationDrawerEditorPageTitle => '导航栏菜单'; + + @override + String get settingsNavigationDrawerBanner => '长按移动和重新排序菜单项'; + + @override + String get settingsNavigationDrawerTabTypes => '类型'; + + @override + String get settingsNavigationDrawerTabAlbums => '相册'; + + @override + String get settingsNavigationDrawerTabPages => '页面'; + + @override + String get settingsNavigationDrawerAddAlbum => '添加相册'; + + @override + String get settingsNavigationBottomActionsTile => '底部导航'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => '底部导航'; + + @override + String get settingsNavigationBottomActionEditorBanner => '长按以移动按钮,并选择在底部导航栏中显示哪些操作。'; + + @override + String get settingsThumbnailSectionTitle => '缩略图'; + + @override + String get settingsThumbnailOverlayTile => '叠加层'; + + @override + String get settingsThumbnailOverlayPageTitle => '叠加层'; + + @override + String get settingsThumbnailShowHdrIcon => '显示 HDR 图标'; + + @override + String get settingsThumbnailShowFavouriteIcon => '显示收藏图标'; + + @override + String get settingsThumbnailShowTagIcon => '显示标签图标'; + + @override + String get settingsThumbnailShowLocationIcon => '显示位置图标'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => '显示动态照片图标'; + + @override + String get settingsThumbnailShowRating => '显示评分'; + + @override + String get settingsThumbnailShowRawIcon => '显示 raw 图标'; + + @override + String get settingsThumbnailShowVideoDuration => '显示视频时长'; + + @override + String get settingsCollectionQuickActionsTile => '快速操作'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => '快速操作'; + + @override + String get settingsCollectionQuickActionTabBrowsing => '浏览'; + + @override + String get settingsCollectionQuickActionTabSelecting => '选择'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => '按住并拖拽可移动按钮并选择浏览项目时显示的操作'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => '按住并拖拽可移动按钮并选择选择项目时显示的操作'; + + @override + String get settingsCollectionBurstPatternsTile => '连拍模式'; + + @override + String get settingsCollectionBurstPatternsNone => '无'; + + @override + String get settingsViewerSectionTitle => '查看器'; + + @override + String get settingsViewerGestureSideTapNext => '轻触屏幕边缘显示上/下一个项目'; + + @override + String get settingsViewerUseCutout => '使用刘海/挖孔区域'; + + @override + String get settingsViewerMaximumBrightness => '最大亮度'; + + @override + String get settingsMotionPhotoAutoPlay => '自动播放动态照片'; + + @override + String get settingsImageBackground => '图像背景'; + + @override + String get settingsViewerQuickActionsTile => '快速操作'; + + @override + String get settingsViewerQuickActionEditorPageTitle => '快速操作'; + + @override + String get settingsViewerQuickActionEditorBanner => '按住并拖拽可移动按钮并选择查看器中显示的操作'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => '显示的按钮'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => '可用按钮'; + + @override + String get settingsViewerQuickActionEmpty => '无按钮'; + + @override + String get settingsViewerOverlayTile => '叠加层'; + + @override + String get settingsViewerOverlayPageTitle => '叠加层'; + + @override + String get settingsViewerShowOverlayOnOpening => '打开时显示'; + + @override + String get settingsViewerShowHistogram => '显示直方图'; + + @override + String get settingsViewerShowMinimap => '显示小地图'; + + @override + String get settingsViewerShowZoomLevel => '显示缩放级别'; + + @override + String get settingsViewerShowInformation => '显示信息'; + + @override + String get settingsViewerShowInformationSubtitle => '显示标题、日期、位置等'; + + @override + String get settingsViewerShowRatingTags => '显示评分和标签'; + + @override + String get settingsViewerShowShootingDetails => '显示拍摄详情'; + + @override + String get settingsViewerShowDescription => '显示描述'; + + @override + String get settingsViewerShowOverlayThumbnails => '显示缩略图'; + + @override + String get settingsViewerEnableOverlayBlurEffect => '模糊特效'; + + @override + String get settingsViewerSlideshowTile => '幻灯片'; + + @override + String get settingsViewerSlideshowPageTitle => '幻灯片'; + + @override + String get settingsSlideshowRepeat => '重复'; + + @override + String get settingsSlideshowShuffle => '随机播放'; + + @override + String get settingsSlideshowFillScreen => '填充屏幕'; + + @override + String get settingsSlideshowAnimatedZoomEffect => '动画缩放效果'; + + @override + String get settingsSlideshowTransitionTile => '过渡动画'; + + @override + String get settingsSlideshowIntervalTile => '时间间隔'; + + @override + String get settingsSlideshowVideoPlaybackTile => '视频播放'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => '视频播放'; + + @override + String get settingsVideoPageTitle => '视频设置'; + + @override + String get settingsVideoSectionTitle => '视频'; + + @override + String get settingsVideoShowVideos => '显示视频'; + + @override + String get settingsVideoPlaybackTile => '播放'; + + @override + String get settingsVideoPlaybackPageTitle => '播放'; + + @override + String get settingsVideoEnableHardwareAcceleration => '硬件加速'; + + @override + String get settingsVideoAutoPlay => '自动播放'; + + @override + String get settingsVideoLoopModeTile => '循环模式'; + + @override + String get settingsVideoLoopModeDialogTitle => '循环模式'; + + @override + String get settingsVideoResumptionModeTile => '恢复播放'; + + @override + String get settingsVideoResumptionModeDialogTitle => '恢复播放'; + + @override + String get settingsVideoBackgroundMode => '后台模式'; + + @override + String get settingsVideoBackgroundModeDialogTitle => '后台模式'; + + @override + String get settingsVideoControlsTile => '控件'; + + @override + String get settingsVideoControlsPageTitle => '控件'; + + @override + String get settingsVideoButtonsTile => '按钮'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => '双击播放/暂停'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => '双击屏幕边缘步进/步退'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => '上下滑动屏幕调整亮度或音量'; + + @override + String get settingsSubtitleThemeTile => '字幕'; + + @override + String get settingsSubtitleThemePageTitle => '字幕'; + + @override + String get settingsSubtitleThemeSample => '这是一个字幕示例。'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => '对齐方式'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => '对齐方式'; + + @override + String get settingsSubtitleThemeTextPositionTile => '文本位置'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => '文本位置'; + + @override + String get settingsSubtitleThemeTextSize => '文本大小'; + + @override + String get settingsSubtitleThemeShowOutline => '显示轮廓和阴影'; + + @override + String get settingsSubtitleThemeTextColor => '文本颜色'; + + @override + String get settingsSubtitleThemeTextOpacity => '文本透明度'; + + @override + String get settingsSubtitleThemeBackgroundColor => '背景色'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => '背景透明度'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => '居左'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => '居中'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => '居右'; + + @override + String get settingsPrivacySectionTitle => '隐私'; + + @override + String get settingsAllowInstalledAppAccess => '允许访问应用清单'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => '用于改善相册显示结果'; + + @override + String get settingsAllowErrorReporting => '允许匿名错误报告'; + + @override + String get settingsSaveSearchHistory => '保存搜索历史记录'; + + @override + String get settingsEnableBin => '启用回收站'; + + @override + String get settingsEnableBinSubtitle => '将删除项保留 30 天'; + + @override + String get settingsDisablingBinWarningDialogMessage => '回收站中的项目将被永久删除。'; + + @override + String get settingsAllowMediaManagement => '允许媒体管理'; + + @override + String get settingsHiddenItemsTile => '隐藏项'; + + @override + String get settingsHiddenItemsPageTitle => '隐藏项'; + + @override + String get settingsHiddenFiltersBanner => '匹配隐藏过滤器的照片和视频将不会出现在你的媒体集中'; + + @override + String get settingsHiddenFiltersEmpty => '无隐藏过滤器'; + + @override + String get settingsStorageAccessTile => '存储访问'; + + @override + String get settingsStorageAccessPageTitle => '存储访问'; + + @override + String get settingsStorageAccessBanner => '某些目录需要具有明确的访问权限才能修改其中的文件,你可以在此处查看你之前已授予访问权限的目录'; + + @override + String get settingsStorageAccessEmpty => '尚未授予访问权限'; + + @override + String get settingsStorageAccessRevokeTooltip => '撤消'; + + @override + String get settingsAccessibilitySectionTitle => '无障碍'; + + @override + String get settingsRemoveAnimationsTile => '移除动画'; + + @override + String get settingsRemoveAnimationsDialogTitle => '移除动画'; + + @override + String get settingsTimeToTakeActionTile => '生效时间'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => '显示触屏手势可选方案'; + + @override + String get settingsDisplaySectionTitle => '显示'; + + @override + String get settingsThemeBrightnessTile => '主题'; + + @override + String get settingsThemeBrightnessDialogTitle => '主题'; + + @override + String get settingsThemeColorHighlights => '色彩强调'; + + @override + String get settingsThemeEnableDynamicColor => '动态色彩'; + + @override + String get settingsDisplayRefreshRateModeTile => '显示刷新率'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => '刷新率'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV 界面'; + + @override + String get settingsLanguageSectionTitle => '语言和格式'; + + @override + String get settingsLanguageTile => '界面语言'; + + @override + String get settingsLanguagePageTitle => '界面语言'; + + @override + String get settingsCoordinateFormatTile => '坐标格式'; + + @override + String get settingsCoordinateFormatDialogTitle => '坐标格式'; + + @override + String get settingsUnitSystemTile => '单位'; + + @override + String get settingsUnitSystemDialogTitle => '单位'; + + @override + String get settingsForceWesternArabicNumeralsTile => '强制使用阿拉伯数字'; + + @override + String get settingsScreenSaverPageTitle => '屏保'; + + @override + String get settingsWidgetPageTitle => '相框'; + + @override + String get settingsWidgetShowOutline => '轮廓'; + + @override + String get settingsWidgetOpenPage => '轻触小部件时'; + + @override + String get settingsWidgetDisplayedItem => '显示的内容'; + + @override + String get settingsCollectionTile => '媒体集'; + + @override + String get statsPageTitle => '统计'; + + @override + String statsWithGps(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 项带位置信息', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => '热门地区'; + + @override + String get statsTopStatesSectionTitle => '最多项的区域'; + + @override + String get statsTopPlacesSectionTitle => '热门地点'; + + @override + String get statsTopTagsSectionTitle => '热门标签'; + + @override + String get statsTopAlbumsSectionTitle => '热门相册'; + + @override + String get viewerOpenPanoramaButtonLabel => '打开全景'; + + @override + String get viewerSetWallpaperButtonLabel => '设置壁纸'; + + @override + String get viewerErrorUnknown => '糟糕!'; + + @override + String get viewerErrorDoesNotExist => '该文件不存在'; + + @override + String get viewerInfoPageTitle => '信息'; + + @override + String get viewerInfoBackToViewerTooltip => '返回查看器'; + + @override + String get viewerInfoUnknown => '未知'; + + @override + String get viewerInfoLabelDescription => '描述'; + + @override + String get viewerInfoLabelTitle => '标题'; + + @override + String get viewerInfoLabelDate => '日期'; + + @override + String get viewerInfoLabelResolution => '分辨率'; + + @override + String get viewerInfoLabelSize => '大小'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => '路径'; + + @override + String get viewerInfoLabelDuration => '时长'; + + @override + String get viewerInfoLabelOwner => '所有者'; + + @override + String get viewerInfoLabelCoordinates => '坐标'; + + @override + String get viewerInfoLabelAddress => '地址'; + + @override + String get mapStyleDialogTitle => '地图样式'; + + @override + String get mapStyleDialogAddStyle => '添加样式'; + + @override + String get mapStyleTooltip => '选择地图样式'; + + @override + String get mapStyleEditorDialogName => '名称'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => '子域名'; + + @override + String get mapStyleEditorDialogUserAgent => '用户代理(UA)'; + + @override + String get mapZoomInTooltip => '放大'; + + @override + String get mapZoomOutTooltip => '缩小'; + + @override + String get mapPointNorthUpTooltip => '上北下南'; + + @override + String get mapAttributionOsmData => '地图数据由 © [OpenStreetMap](https://www.openstreetmap.org/copyright) 贡献'; + + @override + String get mapAttributionOsmLiberty => '绘制于 [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • 主办方 [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | 图块由 [OpenTopoMap](https://opentopomap.org/)提供,[CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => '绘制于 [HOT](https://www.hotosm.org/) • 主办方 [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => '绘制于 [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => '在地图页面上查看'; + + @override + String get mapEmptyRegion => '该地区没有图片'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => '提取嵌入数据失败'; + + @override + String get viewerInfoOpenLinkText => '打开'; + + @override + String get viewerInfoViewXmlLinkText => '查看 XML'; + + @override + String get viewerInfoSearchFieldLabel => '搜索元数据'; + + @override + String get viewerInfoSearchEmpty => '无匹配键'; + + @override + String get viewerInfoSearchSuggestionDate => '日期和时间'; + + @override + String get viewerInfoSearchSuggestionDescription => '描述'; + + @override + String get viewerInfoSearchSuggestionDimensions => '尺寸'; + + @override + String get viewerInfoSearchSuggestionResolution => '分辨率'; + + @override + String get viewerInfoSearchSuggestionRights => '所有权'; + + @override + String get wallpaperUseScrollEffect => '在主屏幕上使用滚动效果'; + + @override + String get tagEditorPageTitle => '编辑标签'; + + @override + String get tagEditorPageNewTagFieldLabel => '新标签'; + + @override + String get tagEditorPageAddTagTooltip => '添加标签'; + + @override + String get tagEditorSectionRecent => '最近'; + + @override + String get tagEditorSectionPlaceholders => '占位符'; + + @override + String get tagEditorDiscardDialogMessage => '是否放弃更改?'; + + @override + String get tagPlaceholderCountry => '国家'; + + @override + String get tagPlaceholderState => '区域'; + + @override + String get tagPlaceholderPlace => '地方'; + + @override + String get panoramaEnableSensorControl => '启用传感器控制'; + + @override + String get panoramaDisableSensorControl => '禁用传感器控制'; + + @override + String get sourceViewerPageTitle => '源码'; +} + +/// The translations for Chinese, using the Han script (`zh_Hant`). +class AppLocalizationsZhHant extends AppLocalizationsZh { + AppLocalizationsZhHant() : super('zh_Hant'); + + @override + String get appName => 'Aves'; + + @override + String get welcomeMessage => '歡迎使用 Aves'; + + @override + String get welcomeOptional => '可選擇的'; + + @override + String get welcomeTermsToggle => '我同意這些使用條款及狀況'; + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 項', + ); + return '$_temp0'; + } + + @override + String columnCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 列', + ); + return '$_temp0'; + } + + @override + String timeSeconds(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 秒', + ); + return '$_temp0'; + } + + @override + String timeMinutes(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 分', + ); + return '$_temp0'; + } + + @override + String timeDays(int count) { + final intl.NumberFormat countNumberFormat = intl.NumberFormat.decimalPattern(localeName); + final String countString = countNumberFormat.format(count); + + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$countString 天', + ); + return '$_temp0'; + } + + @override + String focalLength(String length) { + return '$length mm'; + } + + @override + String get applyButtonLabel => '套用'; + + @override + String get createButtonLabel => '建立'; + + @override + String get deleteButtonLabel => '刪除'; + + @override + String get nextButtonLabel => '下一步'; + + @override + String get showButtonLabel => '顯示'; + + @override + String get hideButtonLabel => '隱藏'; + + @override + String get continueButtonLabel => '繼續'; + + @override + String get saveCopyButtonLabel => '保存副本'; + + @override + String get applyTooltip => '應用'; + + @override + String get cancelTooltip => '取消'; + + @override + String get changeTooltip => '更改'; + + @override + String get clearTooltip => '清除'; + + @override + String get previousTooltip => '上一個'; + + @override + String get nextTooltip => '下一個'; + + @override + String get showTooltip => '顯示'; + + @override + String get hideTooltip => '隱藏'; + + @override + String get actionRemove => '刪除'; + + @override + String get resetTooltip => '重置'; + + @override + String get saveTooltip => '儲存'; + + @override + String get stopTooltip => '停止'; + + @override + String get pickTooltip => '挑選'; + + @override + String get doubleBackExitMessage => '再按一次 “上一頁” 離開.'; + + @override + String get doNotAskAgain => '不再詢問'; + + @override + String get sourceStateLoading => '載入中'; + + @override + String get sourceStateCataloguing => '正在整理目錄中'; + + @override + String get sourceStateLocatingCountries => '正在定位國家'; + + @override + String get sourceStateLocatingPlaces => '正在定位地點'; + + @override + String get chipActionDelete => '刪除'; + + @override + String get chipActionRemove => '移除'; + + @override + String get chipActionShowCollection => '在收藏品中顯示'; + + @override + String get chipActionGoToAlbumPage => '在相簿中顯示'; + + @override + String get chipActionGoToCountryPage => '在國家中顯示'; + + @override + String get chipActionGoToPlacePage => '在地點中顯示'; + + @override + String get chipActionGoToTagPage => '在標籤中顯示'; + + @override + String get chipActionGoToExplorerPage => '在檔案總管裡顯示'; + + @override + String get chipActionDecompose => '分割'; + + @override + String get chipActionFilterOut => '過濾掉'; + + @override + String get chipActionFilterIn => '篩選'; + + @override + String get chipActionHide => '隱藏'; + + @override + String get chipActionLock => '鎖定'; + + @override + String get chipActionPin => '置頂'; + + @override + String get chipActionUnpin => '取消置頂'; + + @override + String get chipActionGroup => '更改分組'; + + @override + String get chipActionRename => '重新命名'; + + @override + String get chipActionSetCover => '設定封面'; + + @override + String get chipActionShowCountryStates => '顯示地區'; + + @override + String get chipActionCreateGroup => '建立分組'; + + @override + String get chipActionCreateAlbum => '建立相簿'; + + @override + String get chipActionCreateVault => '建立保險庫'; + + @override + String get chipActionConfigureVault => '設訂保險庫'; + + @override + String get entryActionCopyToClipboard => '複製到剪貼簿'; + + @override + String get entryActionDelete => '刪除'; + + @override + String get entryActionConvert => '轉換'; + + @override + String get entryActionExport => '匯出'; + + @override + String get entryActionInfo => '訊息'; + + @override + String get entryActionRename => '重新命名'; + + @override + String get entryActionRestore => '還原'; + + @override + String get entryActionRotateCCW => '逆時鐘旋轉'; + + @override + String get entryActionRotateCW => '順時鐘旋轉'; + + @override + String get entryActionFlip => '水平翻轉'; + + @override + String get entryActionPrint => '列印'; + + @override + String get entryActionShare => '分享'; + + @override + String get entryActionShareImageOnly => '只分享圖片'; + + @override + String get entryActionShareVideoOnly => '只分享影片'; + + @override + String get entryActionViewSource => '查看原始碼'; + + @override + String get entryActionShowGeoTiffOnMap => '顯示為地圖疊加層'; + + @override + String get entryActionConvertMotionPhotoToStillImage => '轉換為靜態圖片'; + + @override + String get entryActionViewMotionPhotoVideo => '打開影片'; + + @override + String get entryActionEdit => '編輯'; + + @override + String get entryActionOpen => '開始方式'; + + @override + String get entryActionSetAs => '設定為'; + + @override + String get entryActionCast => '投放'; + + @override + String get entryActionOpenMap => '在地圖應用中顯示'; + + @override + String get entryActionRotateScreen => '旋轉螢幕'; + + @override + String get entryActionAddFavourite => '加入我的最愛'; + + @override + String get entryActionRemoveFavourite => '移除我的最愛'; + + @override + String get videoActionCaptureFrame => '獲取幀數'; + + @override + String get videoActionMute => '靜音'; + + @override + String get videoActionUnmute => '取消靜音'; + + @override + String get videoActionPause => '暫停'; + + @override + String get videoActionPlay => '播放'; + + @override + String get videoActionReplay10 => '退回 10 秒'; + + @override + String get videoActionSkip10 => '前進 10 秒'; + + @override + String get videoActionShowPreviousFrame => '顯示前一幀'; + + @override + String get videoActionShowNextFrame => '顯示下一幀'; + + @override + String get videoActionSelectStreams => '選擇音軌'; + + @override + String get videoActionSetSpeed => '播放速度'; + + @override + String get videoActionABRepeat => 'A-B 重複播放'; + + @override + String get videoRepeatActionSetStart => '設置起點'; + + @override + String get videoRepeatActionSetEnd => '設置終點'; + + @override + String get viewerActionSettings => '設定'; + + @override + String get viewerActionLock => '鎖定瀏覽器'; + + @override + String get viewerActionUnlock => '解鎖瀏覽器'; + + @override + String get slideshowActionResume => '繼續'; + + @override + String get slideshowActionShowInCollection => '在收藏品中顯示'; + + @override + String get entryInfoActionEditDate => '編輯日期和時間'; + + @override + String get entryInfoActionEditLocation => '編輯座標'; + + @override + String get entryInfoActionEditTitleDescription => '編輯標題和描述'; + + @override + String get entryInfoActionEditRating => '編輯評分'; + + @override + String get entryInfoActionEditTags => '編輯標籤'; + + @override + String get entryInfoActionRemoveMetadata => '移除元資料'; + + @override + String get entryInfoActionExportMetadata => '匯出元資料'; + + @override + String get entryInfoActionRemoveLocation => '移除座標'; + + @override + String get editorActionTransform => '轉換'; + + @override + String get editorTransformCrop => '剪裁'; + + @override + String get editorTransformRotate => '轉向'; + + @override + String get cropAspectRatioFree => '自由'; + + @override + String get cropAspectRatioOriginal => '原始'; + + @override + String get cropAspectRatioSquare => '方形'; + + @override + String get filterAspectRatioLandscapeLabel => '橫向'; + + @override + String get filterAspectRatioPortraitLabel => '縱向'; + + @override + String get filterBinLabel => '資源回收桶'; + + @override + String get filterFavouriteLabel => '我的最愛'; + + @override + String get filterNoDateLabel => '未註明日期'; + + @override + String get filterNoAddressLabel => '無地址'; + + @override + String get filterLocatedLabel => '位於'; + + @override + String get filterNoLocationLabel => '未定位'; + + @override + String get filterNoRatingLabel => '未評分'; + + @override + String get filterTaggedLabel => '已標籤'; + + @override + String get filterNoTagLabel => '無標籤'; + + @override + String get filterNoTitleLabel => '無標題'; + + @override + String get filterOnThisDayLabel => '在這一天'; + + @override + String get filterRecentlyAddedLabel => '最近新增'; + + @override + String get filterRatingRejectedLabel => '駁回'; + + @override + String get filterTypeAnimatedLabel => '動畫'; + + @override + String get filterTypeMotionPhotoLabel => '動態相片'; + + @override + String get filterTypePanoramaLabel => '全景圖'; + + @override + String get filterTypeRawLabel => 'Raw'; + + @override + String get filterTypeSphericalVideoLabel => '360° 影片'; + + @override + String get filterTypeGeotiffLabel => 'GeoTIFF'; + + @override + String get filterMimeImageLabel => '圖片'; + + @override + String get filterMimeVideoLabel => '影片'; + + @override + String get accessibilityAnimationsRemove => '阻止螢幕特效'; + + @override + String get accessibilityAnimationsKeep => '保留螢幕特效'; + + @override + String get albumTierNew => '新的'; + + @override + String get albumTierPinned => '釘選'; + + @override + String get albumTierGroups => '組'; + + @override + String get albumTierSpecial => '一般'; + + @override + String get albumTierApps => 'Apps'; + + @override + String get albumTierVaults => '保險庫'; + + @override + String get albumTierDynamic => '動態'; + + @override + String get albumTierRegular => '其他'; + + @override + String get coordinateFormatDms => 'DMS'; + + @override + String get coordinateFormatDdm => '度分十進制'; + + @override + String get coordinateFormatDecimal => '十進制度數'; + + @override + String coordinateDms(String coordinate, String direction) { + return '$coordinate $direction'; + } + + @override + String get coordinateDmsNorth => 'N'; + + @override + String get coordinateDmsSouth => 'S'; + + @override + String get coordinateDmsEast => 'E'; + + @override + String get coordinateDmsWest => 'W'; + + @override + String get displayRefreshRatePreferHighest => '最高更新率'; + + @override + String get displayRefreshRatePreferLowest => '最低更新率'; + + @override + String get keepScreenOnNever => '永不'; + + @override + String get keepScreenOnVideoPlayback => '播放影片期間'; + + @override + String get keepScreenOnViewerOnly => '只有瀏覽頁面'; + + @override + String get keepScreenOnAlways => '總是'; + + @override + String get lengthUnitPixel => 'px'; + + @override + String get lengthUnitPercent => '%'; + + @override + String get mapStyleGoogleNormal => 'Google 地圖'; + + @override + String get mapStyleGoogleHybrid => 'Google 地圖 (衛星影像)'; + + @override + String get mapStyleGoogleTerrain => 'Google 地圖 (地形)'; + + @override + String get mapStyleOsmLiberty => 'OSM Liberty'; + + @override + String get mapStyleOpenTopoMap => 'OpenTopoMap'; + + @override + String get mapStyleOsmHot => 'Humanitarian OSM'; + + @override + String get mapStyleStamenWatercolor => 'Stamen Watercolor'; + + @override + String get maxBrightnessNever => '從不'; + + @override + String get maxBrightnessAlways => '總是'; + + @override + String get nameConflictStrategyRename => '重新命名'; + + @override + String get nameConflictStrategyReplace => '取代'; + + @override + String get nameConflictStrategySkip => '跳過'; + + @override + String get overlayHistogramNone => '無'; + + @override + String get overlayHistogramRGB => 'RGB'; + + @override + String get overlayHistogramLuminance => '亮度'; + + @override + String get subtitlePositionTop => '頂端'; + + @override + String get subtitlePositionBottom => '底端'; + + @override + String get themeBrightnessLight => '淺色'; + + @override + String get themeBrightnessDark => '深色'; + + @override + String get themeBrightnessBlack => '黑色'; + + @override + String get unitSystemMetric => '公制'; + + @override + String get unitSystemImperial => '英制'; + + @override + String get vaultLockTypePattern => '圖案'; + + @override + String get vaultLockTypePin => 'PIN'; + + @override + String get vaultLockTypePassword => '密碼'; + + @override + String get settingsVideoEnablePip => '畫中畫'; + + @override + String get videoControlsPlayOutside => '用其他播放器打開'; + + @override + String get videoLoopModeNever => '永不'; + + @override + String get videoLoopModeShortOnly => '僅短影片'; + + @override + String get videoLoopModeAlways => '總是'; + + @override + String get videoPlaybackSkip => '跳過'; + + @override + String get videoPlaybackMuted => '靜音播放'; + + @override + String get videoPlaybackWithSound => '帶音播放'; + + @override + String get videoResumptionModeNever => '從不'; + + @override + String get videoResumptionModeAlways => '總是'; + + @override + String get viewerTransitionSlide => '滑動'; + + @override + String get viewerTransitionParallax => '視差滾動'; + + @override + String get viewerTransitionFade => '淡入淡出'; + + @override + String get viewerTransitionZoomIn => '放大'; + + @override + String get viewerTransitionNone => '無'; + + @override + String get wallpaperTargetHome => '主畫面'; + + @override + String get wallpaperTargetLock => '鎖定畫面'; + + @override + String get wallpaperTargetHomeLock => '主畫面和鎖定畫面'; + + @override + String get widgetDisplayedItemRandom => '隨機'; + + @override + String get widgetDisplayedItemMostRecent => '最新'; + + @override + String get widgetOpenPageHome => '打開主畫面'; + + @override + String get widgetOpenPageCollection => '打開收藏品'; + + @override + String get widgetOpenPageViewer => '打開瀏覽器'; + + @override + String get widgetTapUpdateWidget => '更新小工具'; + + @override + String get storageVolumeDescriptionFallbackPrimary => '內部儲存空間'; + + @override + String get storageVolumeDescriptionFallbackNonPrimary => 'SD 卡'; + + @override + String get rootDirectoryDescription => '根目錄'; + + @override + String otherDirectoryDescription(String name) { + return '“$name” 目錄'; + } + + @override + String storageAccessDialogMessage(String directory, String volume) { + return '請在下一畫面中選擇 “$volume” 的 $directory,以授予本程式存取權限.'; + } + + @override + String restrictedAccessDialogMessage(String directory, String volume) { + return '這 app 不允許修改 “$volume” 的 $directory 中的檔案.\n\n請使用預先安裝的檔案總管或圖片檢視器來將項目搬到另一個目錄.'; + } + + @override + String notEnoughSpaceDialogMessage(String neededSize, String freeSize, String volume) { + return '此操作需要“$volume”上具有 $neededSize 可用空間才能完成,實際只剩 $freeSize.'; + } + + @override + String get missingSystemFilePickerDialogMessage => '系統檔案選擇器遺失或停用. 請啟用他並再試一次.'; + + @override + String unsupportedTypeDialogMessage(int count, String types) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '此操作不支援以下類型的項目: $types.', + ); + return '$_temp0'; + } + + @override + String get nameConflictDialogSingleSourceMessage => '目標資料夾中有同名稱檔案.'; + + @override + String get nameConflictDialogMultipleSourceMessage => '存在同名稱檔案.'; + + @override + String get addShortcutDialogLabel => '捷徑標籤'; + + @override + String get addShortcutButtonLabel => '新增'; + + @override + String get noMatchingAppDialogMessage => '無對應的 app 能處理.'; + + @override + String binEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '移動這 $count 項目到資源回收桶?', + one: '移動這個項目到資源回收桶?', + ); + return '$_temp0'; + } + + @override + String deleteEntriesConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '刪除這 $count 項目?', + one: '刪除這個項目?', + ); + return '$_temp0'; + } + + @override + String get moveUndatedConfirmationDialogMessage => '處理前儲存項目日期?'; + + @override + String get moveUndatedConfirmationDialogSetDate => '儲存日期'; + + @override + String videoResumeDialogMessage(String time) { + return '想要在 $time 繼續播放?'; + } + + @override + String get videoStartOverButtonLabel => '重新播放'; + + @override + String get videoResumeButtonLabel => '繼續'; + + @override + String get setCoverDialogLatest => '最新項目'; + + @override + String get setCoverDialogAuto => '自動'; + + @override + String get setCoverDialogCustom => '自定'; + + @override + String get hideFilterConfirmationDialogMessage => '符合的照片和影片將從收藏品中隱藏,你可以從 “隱私” 設定中再次顯示.\n\n確定要隱藏嗎?'; + + @override + String get newAlbumDialogTitle => '新相簿'; + + @override + String get newAlbumDialogNameLabel => '相簿名稱'; + + @override + String get newAlbumDialogAlbumAlreadyExistsHelper => '相簿已經存在'; + + @override + String get newAlbumDialogNameLabelAlreadyExistsHelper => '目錄已存在'; + + @override + String get newAlbumDialogStorageLabel => '儲存空間:'; + + @override + String get newDynamicAlbumDialogTitle => '新動態相簿'; + + @override + String get dynamicAlbumAlreadyExists => '動態相簿已經存在'; + + @override + String get newGroupDialogTitle => '新建組'; + + @override + String get newGroupDialogNameLabel => '新組名稱'; + + @override + String get groupAlreadyExists => '組已存在'; + + @override + String get groupEmpty => '沒有組'; + + @override + String get ungrouped => '未分組'; + + @override + String get groupPickerTitle => '挑選組'; + + @override + String get groupPickerUseThisGroupButton => '使用該組'; + + @override + String get newVaultWarningDialogMessage => '保險庫中的項目僅供此應用使用,其他應用不可用。\n\n如果您卸載此應用程序或清除此應用程序數據,您將丟失所有這些項目。'; + + @override + String get newVaultDialogTitle => '新保險庫'; + + @override + String get configureVaultDialogTitle => '設置保險庫'; + + @override + String get vaultDialogLockModeWhenScreenOff => '螢幕關閉時鎖定'; + + @override + String get vaultDialogLockTypeLabel => '鎖定形式'; + + @override + String get patternDialogEnter => '輸入圖形'; + + @override + String get patternDialogConfirm => '確認圖形'; + + @override + String get pinDialogEnter => '輸入PIN'; + + @override + String get pinDialogConfirm => '確認PIN'; + + @override + String get passwordDialogEnter => '輸入密碼'; + + @override + String get passwordDialogConfirm => '確認密碼'; + + @override + String get authenticateToConfigureVault => '驗證以設置保險庫'; + + @override + String get authenticateToUnlockVault => '驗證以解鎖保險庫'; + + @override + String get vaultBinUsageDialogMessage => '有些保險庫正在使用資源回收桶。'; + + @override + String get renameAlbumDialogLabel => '新名稱'; + + @override + String get renameAlbumDialogLabelAlreadyExistsHelper => '目錄已存在'; + + @override + String get renameEntrySetPageTitle => '重新命名'; + + @override + String get renameEntrySetPagePatternFieldLabel => '命名樣式'; + + @override + String get renameEntrySetPageInsertTooltip => '插入欄位'; + + @override + String get renameEntrySetPagePreviewSectionTitle => '預覽'; + + @override + String get renameProcessorCounter => '計數器'; + + @override + String get renameProcessorHash => '雜湊'; + + @override + String get renameProcessorName => '名稱'; + + @override + String deleteSingleAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '刪除此相簿及其中的$count個項目?', + one: '刪除此相簿及其中的項目?', + ); + return '$_temp0'; + } + + @override + String deleteMultiAlbumConfirmationDialogMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '刪除這些相簿及其中的$count個項目?', + one: '刪除這些相簿及其內部的項目?', + ); + return '$_temp0'; + } + + @override + String get exportEntryDialogFormat => '格式:'; + + @override + String get exportEntryDialogWidth => '寬度'; + + @override + String get exportEntryDialogHeight => '高度'; + + @override + String get exportEntryDialogQuality => '畫質'; + + @override + String get exportEntryDialogWriteMetadata => '寫入元資料'; + + @override + String get renameEntryDialogLabel => '新名稱'; + + @override + String get editEntryDialogCopyFromItem => '從其他項目複製'; + + @override + String get editEntryDialogTargetFieldsHeader => '修改欄位'; + + @override + String get editEntryDateDialogTitle => '日期和時間'; + + @override + String get editEntryDateDialogSetCustom => '設置自定日期'; + + @override + String get editEntryDateDialogCopyField => '從其他日期複製'; + + @override + String get editEntryDateDialogExtractFromTitle => '從標題獲得'; + + @override + String get editEntryDateDialogShift => '轉移'; + + @override + String get editEntryDateDialogSourceFileModifiedDate => '檔案修改日期'; + + @override + String get durationDialogHours => '小時'; + + @override + String get durationDialogMinutes => '分鐘'; + + @override + String get durationDialogSeconds => '秒鐘'; + + @override + String get editEntryLocationDialogTitle => '座標'; + + @override + String get editEntryLocationDialogSetCustom => '安置自定座標'; + + @override + String get editEntryLocationDialogChooseOnMap => '從地圖上選擇'; + + @override + String get editEntryLocationDialogImportGpx => '匯入 GPX'; + + @override + String get editEntryLocationDialogLatitude => '緯度'; + + @override + String get editEntryLocationDialogLongitude => '經度'; + + @override + String get editEntryLocationDialogTimeShift => '時光平移'; + + @override + String get locationPickerUseThisLocationButton => '使用此座標'; + + @override + String get editEntryRatingDialogTitle => '評分'; + + @override + String get removeEntryMetadataDialogTitle => '移除元資料'; + + @override + String get removeEntryMetadataDialogAll => '全部'; + + @override + String get removeEntryMetadataDialogMore => '更多'; + + @override + String get removeEntryMetadataMotionPhotoXmpWarningDialogMessage => '播放動態相片中的影片需要 XMP\n\n確定要刪除他嗎?'; + + @override + String get videoSpeedDialogLabel => '播放速度'; + + @override + String get videoStreamSelectionDialogVideo => '影片'; + + @override + String get videoStreamSelectionDialogAudio => '音頻'; + + @override + String get videoStreamSelectionDialogText => '字幕'; + + @override + String get videoStreamSelectionDialogOff => '關閉'; + + @override + String get videoStreamSelectionDialogTrack => '軌道'; + + @override + String get videoStreamSelectionDialogNoSelection => '沒有其他音軌.'; + + @override + String get genericSuccessFeedback => '完成!'; + + @override + String get genericFailureFeedback => '失敗'; + + @override + String get genericDangerWarningDialogMessage => '你確定嗎?'; + + @override + String get tooManyItemsErrorDialogMessage => '用更少的項目重試。'; + + @override + String get menuActionConfigureView => '檢視'; + + @override + String get menuActionSelect => '選擇'; + + @override + String get menuActionSelectAll => '選擇全部'; + + @override + String get menuActionSelectNone => '全部不選'; + + @override + String get menuActionMap => '地圖'; + + @override + String get menuActionSlideshow => '幻燈片'; + + @override + String get menuActionStats => '統計資料'; + + @override + String get viewDialogSortSectionTitle => '排序'; + + @override + String get viewDialogGroupSectionTitle => '分區'; + + @override + String get viewDialogLayoutSectionTitle => '佈局'; + + @override + String get viewDialogReverseSortOrder => '反向排序'; + + @override + String get tileLayoutMosaic => '混合'; + + @override + String get tileLayoutGrid => '網格'; + + @override + String get tileLayoutList => '列表'; + + @override + String get castDialogTitle => '投放裝置'; + + @override + String get coverDialogTabCover => '封面'; + + @override + String get coverDialogTabApp => 'App'; + + @override + String get coverDialogTabColor => '顏色'; + + @override + String get appPickDialogTitle => '選擇 App'; + + @override + String get appPickDialogNone => '無'; + + @override + String get aboutPageTitle => '關於'; + + @override + String get aboutLinkLicense => '授權條款'; + + @override + String get aboutLinkPolicy => '隱私政策'; + + @override + String get aboutBugSectionTitle => '回報錯誤'; + + @override + String get aboutBugSaveLogInstruction => '將 App 日誌儲存到檔案'; + + @override + String get aboutBugCopyInfoInstruction => '複製系統資訊'; + + @override + String get aboutBugCopyInfoButton => '複製'; + + @override + String get aboutBugReportInstruction => '回報日誌和系統資訊到 GitHub'; + + @override + String get aboutBugReportButton => '回報'; + + @override + String get aboutDataUsageSectionTitle => '資料用量'; + + @override + String get aboutDataUsageData => '資料'; + + @override + String get aboutDataUsageCache => '快取記憶體'; + + @override + String get aboutDataUsageDatabase => '資料庫'; + + @override + String get aboutDataUsageMisc => '雜項'; + + @override + String get aboutDataUsageInternal => '內部儲存'; + + @override + String get aboutDataUsageExternal => '外部儲存'; + + @override + String get aboutDataUsageClearCache => '清除快取'; + + @override + String get aboutCreditsSectionTitle => '感謝名單'; + + @override + String get aboutCreditsWorldAtlas1 => '本 App 使用的 TopoJSON 檔案來自'; + + @override + String get aboutCreditsWorldAtlas2 => '符合 ISC 授權條款.'; + + @override + String get aboutTranslatorsSectionTitle => '翻譯人員'; + + @override + String get aboutLicensesSectionTitle => '開放原始碼授權條款'; + + @override + String get aboutLicensesBanner => '本 App 使用下列開放原始碼套件和函式庫.'; + + @override + String get aboutLicensesAndroidLibrariesSectionTitle => 'Android 函式庫'; + + @override + String get aboutLicensesFlutterPluginsSectionTitle => 'Flutter 外掛'; + + @override + String get aboutLicensesFlutterPackagesSectionTitle => 'Flutter 套件'; + + @override + String get aboutLicensesDartPackagesSectionTitle => 'Dart 套件'; + + @override + String get aboutLicensesShowAllButtonLabel => '顯示所有授權條款'; + + @override + String get policyPageTitle => '隱私政策'; + + @override + String get collectionPageTitle => '收藏品'; + + @override + String get collectionPickPageTitle => '挑選'; + + @override + String get collectionSelectPageTitle => '選擇項目'; + + @override + String get collectionActionShowTitleSearch => '顯示標題過濾器'; + + @override + String get collectionActionHideTitleSearch => '隱藏標題過濾器'; + + @override + String get collectionActionAddDynamicAlbum => '新增動態相簿'; + + @override + String get collectionActionAddShortcut => '新增捷徑'; + + @override + String get collectionActionSetHome => '設為首頁'; + + @override + String get collectionActionEmptyBin => '清空資源回收筒'; + + @override + String get collectionActionCopy => '複製到相簿'; + + @override + String get collectionActionMove => '移動到相簿'; + + @override + String get collectionActionRescan => '重新掃描'; + + @override + String get collectionActionEdit => '編輯'; + + @override + String get collectionSearchTitlesHintText => '搜尋標題'; + + @override + String get collectionGroupAlbum => '依照相簿'; + + @override + String get collectionGroupMonth => '依照月份'; + + @override + String get collectionGroupDay => '依照日期'; + + @override + String get sectionNone => '沒有分區'; + + @override + String get sectionUnknown => '未知'; + + @override + String get dateToday => '今天'; + + @override + String get dateYesterday => '昨天'; + + @override + String get dateThisMonth => '本月'; + + @override + String collectionDeleteFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '刪除 $count 項目失敗', + ); + return '$_temp0'; + } + + @override + String collectionCopyFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '複製 $count 項目失敗', + ); + return '$_temp0'; + } + + @override + String collectionMoveFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '移動 $count 項目失敗', + ); + return '$_temp0'; + } + + @override + String collectionRenameFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '改名 $count 項目失敗', + ); + return '$_temp0'; + } + + @override + String collectionEditFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '編輯 $count 項目失敗', + ); + return '$_temp0'; + } + + @override + String collectionExportFailureFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '匯出 $count 頁', + ); + return '$_temp0'; + } + + @override + String collectionCopySuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '複製 $count 項目', + ); + return '$_temp0'; + } + + @override + String collectionMoveSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '移動 $count 項目', + ); + return '$_temp0'; + } + + @override + String collectionRenameSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '改名 $count 項目', + ); + return '$_temp0'; + } + + @override + String collectionEditSuccessFeedback(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '編輯 $count 項目', + ); + return '$_temp0'; + } + + @override + String get collectionEmptyFavourites => '沒有我的最愛'; + + @override + String get collectionEmptyVideos => '沒有影片'; + + @override + String get collectionEmptyImages => '沒有圖片'; + + @override + String get collectionEmptyGrantAccessButtonLabel => '允許存取'; + + @override + String get collectionSelectSectionTooltip => '選擇部份'; + + @override + String get collectionDeselectSectionTooltip => '取消選擇部份'; + + @override + String get drawerAboutButton => '關於'; + + @override + String get drawerSettingsButton => '設定'; + + @override + String get drawerCollectionAll => '所有收藏品'; + + @override + String get drawerCollectionFavourites => '我的最愛'; + + @override + String get drawerCollectionImages => '圖片'; + + @override + String get drawerCollectionVideos => '影片'; + + @override + String get drawerCollectionAnimated => '動畫'; + + @override + String get drawerCollectionMotionPhotos => '動態相片'; + + @override + String get drawerCollectionPanoramas => '全景圖'; + + @override + String get drawerCollectionRaws => 'Raw 相片'; + + @override + String get drawerCollectionSphericalVideos => '360° 影片'; + + @override + String get drawerAlbumPage => '相簿'; + + @override + String get drawerCountryPage => '國家'; + + @override + String get drawerPlacePage => '地點'; + + @override + String get drawerTagPage => '標籤'; + + @override + String get sortByDate => '依日期'; + + @override + String get sortByName => '依名稱'; + + @override + String get sortByItemCount => '依項目數量'; + + @override + String get sortBySize => '依尺寸'; + + @override + String get sortByAlbumFileName => '依相簿和檔案名稱'; + + @override + String get sortByRating => '依評分'; + + @override + String get sortByDuration => '按時長'; + + @override + String get sortByPath => '依路徑'; + + @override + String get sortOrderNewestFirst => '由新至舊'; + + @override + String get sortOrderOldestFirst => '由舊至新'; + + @override + String get sortOrderAtoZ => 'A — Z'; + + @override + String get sortOrderZtoA => 'Z — A'; + + @override + String get sortOrderHighestFirst => '由高到低'; + + @override + String get sortOrderLowestFirst => '由低到高'; + + @override + String get sortOrderLargestFirst => '由大到小'; + + @override + String get sortOrderSmallestFirst => '由小到大'; + + @override + String get sortOrderShortestFirst => '先短後長'; + + @override + String get sortOrderLongestFirst => '先長後短'; + + @override + String get albumGroupTier => '依層級'; + + @override + String get albumGroupType => '依類型'; + + @override + String get albumGroupVolume => '依儲存容量'; + + @override + String get albumMimeTypeMixed => '混合的'; + + @override + String get albumPickPageTitleCopy => '複製到相簿'; + + @override + String get albumPickPageTitleExport => '匯出到相簿'; + + @override + String get albumPickPageTitleMove => '移動到相簿'; + + @override + String get albumPickPageTitlePick => '選擇相簿'; + + @override + String get albumCamera => '相機'; + + @override + String get albumDownload => '下載'; + + @override + String get albumScreenshots => '截圖'; + + @override + String get albumScreenRecordings => '螢幕錄影'; + + @override + String get albumVideoCaptures => '影像截取'; + + @override + String get albumPageTitle => '相簿'; + + @override + String get albumEmpty => '沒有相簿'; + + @override + String get createAlbumButtonLabel => '建立'; + + @override + String get newFilterBanner => '新的'; + + @override + String get countryPageTitle => '國家'; + + @override + String get countryEmpty => '沒有國家'; + + @override + String get statePageTitle => '地區'; + + @override + String get stateEmpty => '無地區'; + + @override + String get placePageTitle => '地點'; + + @override + String get placeEmpty => '無地點'; + + @override + String get tagPageTitle => '標籤'; + + @override + String get tagEmpty => '沒有標籤'; + + @override + String get tagPickPageTitle => '選擇標籤'; + + @override + String get binPageTitle => '資源回收桶'; + + @override + String get explorerPageTitle => '檔案總管'; + + @override + String get explorerActionSelectStorageVolume => '選擇儲存位置'; + + @override + String get selectStorageVolumeDialogTitle => '選擇儲存位置'; + + @override + String get searchCollectionFieldHint => '搜尋收藏品'; + + @override + String get searchRecentSectionTitle => '最近'; + + @override + String get searchDateSectionTitle => '日期'; + + @override + String get searchFormatSectionTitle => '格式'; + + @override + String get searchAlbumsSectionTitle => '相簿'; + + @override + String get searchCountriesSectionTitle => '國家'; + + @override + String get searchStatesSectionTitle => '地區'; + + @override + String get searchPlacesSectionTitle => '地點'; + + @override + String get searchTagsSectionTitle => '標籤'; + + @override + String get searchRatingSectionTitle => '評分'; + + @override + String get searchMetadataSectionTitle => '元資料'; + + @override + String get settingsPageTitle => '設定'; + + @override + String get settingsSystemDefault => '系統預設'; + + @override + String get settingsDefault => '預設'; + + @override + String get settingsDisabled => '停用'; + + @override + String get settingsAskEverytime => '每次詢問'; + + @override + String get settingsModificationWarningDialogMessage => '其他設置將被修改。'; + + @override + String get settingsSearchFieldLabel => '搜尋設定'; + + @override + String get settingsSearchEmpty => '沒有符合的設定'; + + @override + String get settingsActionExport => '匯出'; + + @override + String get settingsActionExportDialogTitle => '匯出'; + + @override + String get settingsActionImport => '匯入'; + + @override + String get settingsActionImportDialogTitle => '匯入'; + + @override + String get appExportCovers => '封面'; + + @override + String get appExportDynamicAlbums => '動態相簿'; + + @override + String get appExportFavourites => '我的最愛'; + + @override + String get appExportSettings => '設定'; + + @override + String get settingsNavigationSectionTitle => '導航'; + + @override + String get settingsHomeTile => '主畫面'; + + @override + String get settingsHomeDialogTitle => '主畫面'; + + @override + String get setHomeCustom => '自定義'; + + @override + String get settingsKeepScreenOnTile => '保持螢幕開啟'; + + @override + String get settingsKeepScreenOnDialogTitle => '保持螢幕開啟'; + + @override + String get settingsDoubleBackExit => '按 “上一頁” 鍵二次離開'; + + @override + String get settingsConfirmationTile => '確認對話框'; + + @override + String get settingsConfirmationDialogTitle => '確認對話框'; + + @override + String get settingsConfirmationBeforeDeleteItems => '永久刪除項目前先詢問'; + + @override + String get settingsConfirmationBeforeMoveToBinItems => '移動項目到資源回收桶前先詢問'; + + @override + String get settingsConfirmationBeforeMoveUndatedItems => '日期不詳的項目移動前先詢問'; + + @override + String get settingsConfirmationAfterMoveToBinItems => '移動項目到資源回收桶後顯示訊息'; + + @override + String get settingsConfirmationVaultDataLoss => '顯示保險庫數據洩漏警告'; + + @override + String get settingsNavigationDrawerTile => '操作選單'; + + @override + String get settingsNavigationDrawerEditorPageTitle => '操作選單'; + + @override + String get settingsNavigationDrawerBanner => '長按來移動以重新排序選單項目。'; + + @override + String get settingsNavigationDrawerTabTypes => '類型'; + + @override + String get settingsNavigationDrawerTabAlbums => '相簿'; + + @override + String get settingsNavigationDrawerTabPages => '頁面'; + + @override + String get settingsNavigationDrawerAddAlbum => '新增相簿'; + + @override + String get settingsNavigationBottomActionsTile => '底部導航'; + + @override + String get settingsNavigationBottomActionEditorPageTitle => '底部導航'; + + @override + String get settingsNavigationBottomActionEditorBanner => '長按以移動按鈕,并選擇在底部導航欄中顯示哪些操作。'; + + @override + String get settingsThumbnailSectionTitle => '縮圖'; + + @override + String get settingsThumbnailOverlayTile => '疊加層'; + + @override + String get settingsThumbnailOverlayPageTitle => '疊加層'; + + @override + String get settingsThumbnailShowHdrIcon => '顯示 HDR 圖示'; + + @override + String get settingsThumbnailShowFavouriteIcon => '顯示我的最愛圖示'; + + @override + String get settingsThumbnailShowTagIcon => '顯示標籤圖示'; + + @override + String get settingsThumbnailShowLocationIcon => '顯示座標圖示'; + + @override + String get settingsThumbnailShowMotionPhotoIcon => '顯示動態相片圖示'; + + @override + String get settingsThumbnailShowRating => '顯示評分'; + + @override + String get settingsThumbnailShowRawIcon => '顯示 raw 圖示'; + + @override + String get settingsThumbnailShowVideoDuration => '顯示影片時間長度'; + + @override + String get settingsCollectionQuickActionsTile => '快速操作'; + + @override + String get settingsCollectionQuickActionEditorPageTitle => '快速操作'; + + @override + String get settingsCollectionQuickActionTabBrowsing => '瀏覽'; + + @override + String get settingsCollectionQuickActionTabSelecting => '選擇'; + + @override + String get settingsCollectionBrowsingQuickActionEditorBanner => '長按來移動按鈕,以選擇在瀏覽項目時顯示哪些操作項。'; + + @override + String get settingsCollectionSelectionQuickActionEditorBanner => '長按來移動按鈕,以選擇在選擇項目時顯示的操作項。'; + + @override + String get settingsCollectionBurstPatternsTile => '連拍形式'; + + @override + String get settingsCollectionBurstPatternsNone => '無'; + + @override + String get settingsViewerSectionTitle => '瀏覽器'; + + @override + String get settingsViewerGestureSideTapNext => '點擊螢幕邊緣以顯示上一個/下一個項目'; + + @override + String get settingsViewerUseCutout => '使用鏤空區域'; + + @override + String get settingsViewerMaximumBrightness => '最大亮度'; + + @override + String get settingsMotionPhotoAutoPlay => '自動播放動態相片'; + + @override + String get settingsImageBackground => '圖片背景'; + + @override + String get settingsViewerQuickActionsTile => '快速操作'; + + @override + String get settingsViewerQuickActionEditorPageTitle => '快速操作'; + + @override + String get settingsViewerQuickActionEditorBanner => '長按來移動按鈕,以選擇瀏覽器中顯示的操作項。'; + + @override + String get settingsViewerQuickActionEditorDisplayedButtonsSectionTitle => '顯示的按鈕'; + + @override + String get settingsViewerQuickActionEditorAvailableButtonsSectionTitle => '可用按鈕'; + + @override + String get settingsViewerQuickActionEmpty => '沒有按鈕'; + + @override + String get settingsViewerOverlayTile => '疊加層'; + + @override + String get settingsViewerOverlayPageTitle => '疊加層'; + + @override + String get settingsViewerShowOverlayOnOpening => '開啟時顯示'; + + @override + String get settingsViewerShowHistogram => '顯示直方圖'; + + @override + String get settingsViewerShowMinimap => '顯示小地圖'; + + @override + String get settingsViewerShowZoomLevel => '顯示縮放等級'; + + @override + String get settingsViewerShowInformation => '顯示資訊'; + + @override + String get settingsViewerShowInformationSubtitle => '顯示標題、日期、座標…等'; + + @override + String get settingsViewerShowRatingTags => '顯示評分和標籤'; + + @override + String get settingsViewerShowShootingDetails => '顯示拍攝細節'; + + @override + String get settingsViewerShowDescription => '顯示描述'; + + @override + String get settingsViewerShowOverlayThumbnails => '顯示縮圖'; + + @override + String get settingsViewerEnableOverlayBlurEffect => '模糊特效'; + + @override + String get settingsViewerSlideshowTile => '幻燈片'; + + @override + String get settingsViewerSlideshowPageTitle => '幻燈片'; + + @override + String get settingsSlideshowRepeat => '重複'; + + @override + String get settingsSlideshowShuffle => '隨機播放'; + + @override + String get settingsSlideshowFillScreen => '全螢幕'; + + @override + String get settingsSlideshowAnimatedZoomEffect => '動畫縮放效果'; + + @override + String get settingsSlideshowTransitionTile => '轉換'; + + @override + String get settingsSlideshowIntervalTile => '時間間隔'; + + @override + String get settingsSlideshowVideoPlaybackTile => '影片播放'; + + @override + String get settingsSlideshowVideoPlaybackDialogTitle => '影片播放'; + + @override + String get settingsVideoPageTitle => '影片設定'; + + @override + String get settingsVideoSectionTitle => '影片'; + + @override + String get settingsVideoShowVideos => '顯示影片'; + + @override + String get settingsVideoPlaybackTile => '重播'; + + @override + String get settingsVideoPlaybackPageTitle => '重播'; + + @override + String get settingsVideoEnableHardwareAcceleration => '硬體加速'; + + @override + String get settingsVideoAutoPlay => '自動播放'; + + @override + String get settingsVideoLoopModeTile => '循環模式'; + + @override + String get settingsVideoLoopModeDialogTitle => '循環模式'; + + @override + String get settingsVideoResumptionModeTile => '再次重播'; + + @override + String get settingsVideoResumptionModeDialogTitle => '再次重播'; + + @override + String get settingsVideoBackgroundMode => '後臺模式'; + + @override + String get settingsVideoBackgroundModeDialogTitle => '後臺模式'; + + @override + String get settingsVideoControlsTile => '控制'; + + @override + String get settingsVideoControlsPageTitle => '控制'; + + @override + String get settingsVideoButtonsTile => '按鈕'; + + @override + String get settingsVideoGestureDoubleTapTogglePlay => '點擊二次以播放/暫停'; + + @override + String get settingsVideoGestureSideDoubleTapSeek => '螢幕邊緣點擊二次以後退/前進'; + + @override + String get settingsVideoGestureVerticalDragBrightnessVolume => '上下滑動以調整亮度/音量'; + + @override + String get settingsSubtitleThemeTile => '字幕'; + + @override + String get settingsSubtitleThemePageTitle => '字幕'; + + @override + String get settingsSubtitleThemeSample => '這是一個樣本.'; + + @override + String get settingsSubtitleThemeTextAlignmentTile => '文字對齊'; + + @override + String get settingsSubtitleThemeTextAlignmentDialogTitle => '文字對齊'; + + @override + String get settingsSubtitleThemeTextPositionTile => '文字位置'; + + @override + String get settingsSubtitleThemeTextPositionDialogTitle => '文字位置'; + + @override + String get settingsSubtitleThemeTextSize => '文字大小'; + + @override + String get settingsSubtitleThemeShowOutline => '顯示輪廓和陰影'; + + @override + String get settingsSubtitleThemeTextColor => '文字顏色'; + + @override + String get settingsSubtitleThemeTextOpacity => '文字透明度'; + + @override + String get settingsSubtitleThemeBackgroundColor => '背景顏色'; + + @override + String get settingsSubtitleThemeBackgroundOpacity => '背景透明度'; + + @override + String get settingsSubtitleThemeTextAlignmentLeft => '左邊'; + + @override + String get settingsSubtitleThemeTextAlignmentCenter => '置中'; + + @override + String get settingsSubtitleThemeTextAlignmentRight => '右邊'; + + @override + String get settingsPrivacySectionTitle => '隱私'; + + @override + String get settingsAllowInstalledAppAccess => '允許存取應用程式清單'; + + @override + String get settingsAllowInstalledAppAccessSubtitle => '用於改進相簿顯示'; + + @override + String get settingsAllowErrorReporting => '允許匿名錯誤報告'; + + @override + String get settingsSaveSearchHistory => '儲存搜尋歷史記錄'; + + @override + String get settingsEnableBin => '啟用資源回收桶'; + + @override + String get settingsEnableBinSubtitle => '刪除項目保留 30 天'; + + @override + String get settingsDisablingBinWarningDialogMessage => '資源回收桶中的項目將被永久刪除。'; + + @override + String get settingsAllowMediaManagement => '允許媒體管理'; + + @override + String get settingsHiddenItemsTile => '隱藏項目'; + + @override + String get settingsHiddenItemsPageTitle => '隱藏項目'; + + @override + String get settingsHiddenFiltersBanner => '符合過濾器的相片和影片將不會顯示在你的收藏品中.'; + + @override + String get settingsHiddenFiltersEmpty => '沒有隱藏過濾器'; + + @override + String get settingsStorageAccessTile => '儲存空間存取'; + + @override + String get settingsStorageAccessPageTitle => '儲存空間存取'; + + @override + String get settingsStorageAccessBanner => '某些目錄要求明確存取權限才能修改裡面的檔案. 你可以查看先前得到權限的目錄.'; + + @override + String get settingsStorageAccessEmpty => '沒有存取權限'; + + @override + String get settingsStorageAccessRevokeTooltip => '撤銷'; + + @override + String get settingsAccessibilitySectionTitle => '無障礙'; + + @override + String get settingsRemoveAnimationsTile => '移除動畫'; + + @override + String get settingsRemoveAnimationsDialogTitle => '移除動畫'; + + @override + String get settingsTimeToTakeActionTile => '是時候採取行動'; + + @override + String get settingsAccessibilityShowPinchGestureAlternatives => '顯示多點觸控手勢的備選方案'; + + @override + String get settingsDisplaySectionTitle => '顯示'; + + @override + String get settingsThemeBrightnessTile => '佈景主題'; + + @override + String get settingsThemeBrightnessDialogTitle => '佈景主題'; + + @override + String get settingsThemeColorHighlights => '色彩強調'; + + @override + String get settingsThemeEnableDynamicColor => '動態色彩'; + + @override + String get settingsDisplayRefreshRateModeTile => '顯示更新率'; + + @override + String get settingsDisplayRefreshRateModeDialogTitle => '更新率'; + + @override + String get settingsDisplayUseTvInterface => 'Android TV介面'; + + @override + String get settingsLanguageSectionTitle => '語言和格式'; + + @override + String get settingsLanguageTile => '語言'; + + @override + String get settingsLanguagePageTitle => '語言'; + + @override + String get settingsCoordinateFormatTile => '座標格式'; + + @override + String get settingsCoordinateFormatDialogTitle => '座標格式'; + + @override + String get settingsUnitSystemTile => '單位'; + + @override + String get settingsUnitSystemDialogTitle => '單位'; + + @override + String get settingsForceWesternArabicNumeralsTile => '強制使用阿拉伯數字'; + + @override + String get settingsScreenSaverPageTitle => '螢幕保護程式'; + + @override + String get settingsWidgetPageTitle => '相框'; + + @override + String get settingsWidgetShowOutline => '輪廓'; + + @override + String get settingsWidgetOpenPage => '點擊小工具時'; + + @override + String get settingsWidgetDisplayedItem => '顯示項目'; + + @override + String get settingsCollectionTile => '收藏品'; + + @override + String get statsPageTitle => '統計資料'; + + @override + String statsWithGps(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count條座標資訊', + one: '1條座標資訊', + ); + return '$_temp0'; + } + + @override + String get statsTopCountriesSectionTitle => '熱門國家'; + + @override + String get statsTopStatesSectionTitle => '最多項的地區'; + + @override + String get statsTopPlacesSectionTitle => '熱門地點'; + + @override + String get statsTopTagsSectionTitle => '熱門標籤'; + + @override + String get statsTopAlbumsSectionTitle => '熱門相簿'; + + @override + String get viewerOpenPanoramaButtonLabel => '打開全景圖'; + + @override + String get viewerSetWallpaperButtonLabel => '設定桌布'; + + @override + String get viewerErrorUnknown => '哎呀!'; + + @override + String get viewerErrorDoesNotExist => '這檔案已不存在.'; + + @override + String get viewerInfoPageTitle => '訊息'; + + @override + String get viewerInfoBackToViewerTooltip => '回到瀏覽器'; + + @override + String get viewerInfoUnknown => '未知'; + + @override + String get viewerInfoLabelDescription => '描述'; + + @override + String get viewerInfoLabelTitle => '標題'; + + @override + String get viewerInfoLabelDate => '日期'; + + @override + String get viewerInfoLabelResolution => '解析度'; + + @override + String get viewerInfoLabelSize => '大小'; + + @override + String get viewerInfoLabelUri => 'URI'; + + @override + String get viewerInfoLabelPath => '路徑'; + + @override + String get viewerInfoLabelDuration => '時間長度'; + + @override + String get viewerInfoLabelOwner => '擁有者'; + + @override + String get viewerInfoLabelCoordinates => '座標'; + + @override + String get viewerInfoLabelAddress => '地址'; + + @override + String get mapStyleDialogTitle => '地圖樣式'; + + @override + String get mapStyleDialogAddStyle => '添加樣式'; + + @override + String get mapStyleTooltip => '選擇地圖樣式'; + + @override + String get mapStyleEditorDialogName => '名稱'; + + @override + String get mapStyleEditorDialogUrl => 'URL'; + + @override + String get mapStyleEditorDialogSubdomains => '子域名'; + + @override + String get mapStyleEditorDialogUserAgent => '用戶代理(UA)'; + + @override + String get mapZoomInTooltip => '放大'; + + @override + String get mapZoomOutTooltip => '縮小'; + + @override + String get mapPointNorthUpTooltip => '北方向上'; + + @override + String get mapAttributionOsmData => '地圖資料由 © [OpenStreetMap](https://www.openstreetmap.org/copyright) 貢獻'; + + @override + String get mapAttributionOsmLiberty => '地圖由 [OpenMapTiles](https://www.openmaptiles.org/) 所提供,以 [CC BY](http://creativecommons.org/licenses/by/4.0) 授權 • 托管於 [OSM Americana](https://tile.ourmap.us)'; + + @override + String get mapAttributionOpenTopoMap => '[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | 地圖由 [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)'; + + @override + String get mapAttributionOsmHot => '繪製於 [HOT](https://www.hotosm.org/) • 主辦方 [OSM France](https://openstreetmap.fr/)'; + + @override + String get mapAttributionStamen => '繪製於 [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)'; + + @override + String get openMapPageTooltip => '在地圖頁面上檢視'; + + @override + String get mapEmptyRegion => '該區域沒有圖片'; + + @override + String get viewerInfoOpenEmbeddedFailureFeedback => '解開嵌入資料失敗'; + + @override + String get viewerInfoOpenLinkText => '開啟'; + + @override + String get viewerInfoViewXmlLinkText => '檢視 XML'; + + @override + String get viewerInfoSearchFieldLabel => '搜尋元資料'; + + @override + String get viewerInfoSearchEmpty => '沒有符合的關鍵字'; + + @override + String get viewerInfoSearchSuggestionDate => '日期和時間'; + + @override + String get viewerInfoSearchSuggestionDescription => '描述'; + + @override + String get viewerInfoSearchSuggestionDimensions => '範圍'; + + @override + String get viewerInfoSearchSuggestionResolution => '解析度'; + + @override + String get viewerInfoSearchSuggestionRights => '權限'; + + @override + String get wallpaperUseScrollEffect => '在主畫面上使用滾動效果'; + + @override + String get tagEditorPageTitle => '編輯標籤'; + + @override + String get tagEditorPageNewTagFieldLabel => '新標籤'; + + @override + String get tagEditorPageAddTagTooltip => '新增標籤'; + + @override + String get tagEditorSectionRecent => '最近'; + + @override + String get tagEditorSectionPlaceholders => '占位符'; + + @override + String get tagEditorDiscardDialogMessage => '是否要放棄更改?'; + + @override + String get tagPlaceholderCountry => '國家'; + + @override + String get tagPlaceholderState => '地區'; + + @override + String get tagPlaceholderPlace => '地方'; + + @override + String get panoramaEnableSensorControl => '啟用感測器控制'; + + @override + String get panoramaDisableSensorControl => '停用感測器控制'; + + @override + String get sourceViewerPageTitle => '原始碼'; +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..e788e09 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,2 @@ +import 'main_play.dart' as app; +void main() => app.main(); diff --git a/lib/main_common.dart b/lib/main_common.dart new file mode 100644 index 0000000..7cae52f --- /dev/null +++ b/lib/main_common.dart @@ -0,0 +1,34 @@ +import 'dart:isolate'; + +import 'package:aves/app_flavor.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +void mainCommon(AppFlavor flavor, {Map? debugIntentData}) { + initPlatformServices(); + + Isolate.current.addErrorListener( + RawReceivePort((pair) { + final errorAndStacktrace = pair as List; + final error = errorAndStacktrace[0] as String; + final stackTraceString = errorAndStacktrace[1] as String?; + final stackTrace = stackTraceString != null ? StackTrace.fromString(stackTraceString) : null; + reportService.recordError(error, stackTrace); + }).sendPort, + ); + + LeakTracking.start(); + FlutterMemoryAllocations.instance.addListener( + (event) => LeakTracking.dispatchObjectEvent(event.toMap()), + ); + + runApp( + AvesApp( + flavor: flavor, + debugIntentData: debugIntentData, + ), + ); +} diff --git a/lib/main_izzy.dart b/lib/main_izzy.dart new file mode 100644 index 0000000..5cd5529 --- /dev/null +++ b/lib/main_izzy.dart @@ -0,0 +1,11 @@ +import 'package:aves/app_flavor.dart'; +import 'package:aves/main_common.dart'; +import 'package:aves/widget_common.dart'; + +const _flavor = AppFlavor.izzy; + +@pragma('vm:entry-point') +void main() => mainCommon(_flavor); + +@pragma('vm:entry-point') +void widgetMain() => widgetMainCommon(_flavor); diff --git a/lib/main_libre.dart b/lib/main_libre.dart new file mode 100644 index 0000000..bab8e00 --- /dev/null +++ b/lib/main_libre.dart @@ -0,0 +1,11 @@ +import 'package:aves/app_flavor.dart'; +import 'package:aves/main_common.dart'; +import 'package:aves/widget_common.dart'; + +const _flavor = AppFlavor.libre; + +@pragma('vm:entry-point') +void main() => mainCommon(_flavor); + +@pragma('vm:entry-point') +void widgetMain() => widgetMainCommon(_flavor); diff --git a/lib/main_play.dart b/lib/main_play.dart new file mode 100644 index 0000000..17686cf --- /dev/null +++ b/lib/main_play.dart @@ -0,0 +1,21 @@ +import 'package:aves/app_flavor.dart'; +import 'package:aves/main_common.dart'; +import 'package:aves/widget_common.dart'; +import 'package:aves/widgets/cast/cast_controller.dart'; +import 'package:flutter/widgets.dart'; + +const _flavor = AppFlavor.play; + +@pragma('vm:entry-point') +Future<void> main() async { + WidgetsFlutterBinding.ensureInitialized(); + + // Carica backend salvato + await CastController.instance.loadSavedBackend(); + + // ⭐ AVVIA Aves come fa il main originale + mainCommon(_flavor); +} + +@pragma('vm:entry-point') +void widgetMain() => widgetMainCommon(_flavor); diff --git a/lib/main_play_test_editor.dart b/lib/main_play_test_editor.dart new file mode 100644 index 0000000..d0aab00 --- /dev/null +++ b/lib/main_play_test_editor.dart @@ -0,0 +1,17 @@ +import 'package:aves/app_flavor.dart'; +import 'package:aves/main_common.dart'; +import 'package:aves/model/app/intent.dart'; + +// https://developer.android.com/studio/command-line/adb.html#IntentSpec +// adb shell am start -n deckers.thibault.aves.debug/deckers.thibault.aves.MainActivity -a android.intent.action.EDIT -d content://media/external/images/media/183128 -t image/* + +@pragma('vm:entry-point') +void main() => mainCommon( + AppFlavor.play, + debugIntentData: { + IntentDataKeys.action: IntentActions.edit, + IntentDataKeys.mimeType: 'image/*', + IntentDataKeys.uri: 'content://media/external/images/media/1000064996', // landscape + // IntentDataKeys.uri: 'content://media/external/images/media/1000064754', // portrait + }, +); diff --git a/lib/model/app/contributors.dart b/lib/model/app/contributors.dart new file mode 100644 index 0000000..ff3e2bb --- /dev/null +++ b/lib/model/app/contributors.dart @@ -0,0 +1,203 @@ +class Contributors { + static const translators = { + Contributor('D3ZOXY', 'its.ghost.message@gmail.com'), + Contributor('JanWaldhorn', 'weblate@jwh.anonaddy.com'), + Contributor('n-berenice', null), + Contributor('Jonatas de Almeida Barros', 'ajonatas56@gmail.com'), + Contributor('MeFinity', 'me.dot.finity@gmail.com'), + Contributor('Maki', null), + Contributor('HiSubway', 'shenyusoftware@gmail.com'), + Contributor('glemco', 'glemco@posteo.net'), + Contributor('Aerowolf', null), + Contributor('小默', 'duzhe163908@gmail.com'), + Contributor('metezd', 'itoldyouthat@protonmail.com'), + Contributor('Martijn Fabrie', null), + Contributor('Koen Koppens', 'koenkoppens@proton.me'), + Contributor('Emmanouil Papavergis', null), + Contributor('kha84', 'khalukhin@gmail.com'), + Contributor('gallegonovato', 'fran-carro@hotmail.es'), + Contributor('Havokdan', 'havokdan@yahoo.com.br'), + Contributor('Jean Mareilles', 'waged1266@tutanota.com'), + Contributor('이정희', 'daemul72@gmail.com'), + Contributor('Translator-3000', 'weblate.m1d0h@8shield.net'), + Contributor('Ralea Adrian Vicențiu', 'ralea.adrian@gmail.com'), + Contributor('Igor Sorocean', 'sorocean.igor@gmail.com'), + Contributor('JY3', 'GeeyunJY3@gmail.com'), + Contributor('Gediminas Murauskas', 'muziejusinfo@gmail.com'), + Contributor('Oğuz Ersen', 'oguz@ersen.moe'), + Contributor('Allan Nordhøy', 'epost@anotheragency.no'), + Contributor('pemibe', 'pemibe4634@dmonies.com'), + Contributor('Linerly', 'linerly@proton.me'), + Contributor('Skrripy', 'rozihrash.ya6w7@simplelogin.com'), + Contributor('vesp', 'vesp@post.cz'), + Contributor('Dan', 'denqwerta@gmail.com'), + Contributor('Tijolinho', 'pedrohenrique29.alfenas@gmail.com'), + Contributor('Piotr K', '1337.kelt@gmail.com'), + Contributor('rehork', 'cooky@e.email'), + Contributor('Eric', 'zxmegaxqug@hldrive.com'), // @hamburger2048 / 大王叫我来巡山 + Contributor('Aitor Salaberria', 'trslbrr@gmail.com'), + Contributor('Felipe Nogueira', 'contato.fnog@gmail.com'), + Contributor('kaajjo', 'claymanoff@gmail.com'), + Contributor('Eduardo Malaspina', 'vaio0@swismail.com'), + Contributor('Evgeniy Khramov', 'thejenjagamertjg@gmail.com'), + Contributor('syu_pf_ssy', 'syu.pf.ssy@outlook.com'), + Contributor('Dick Pluim', 'github@dickpluim.com'), + Contributor('György Viktor', 'wickdj@gmail.com'), + Contributor('byPety', 'peter@csordascsalad.hu'), + Contributor('tryvseu', 'tryvseu@tuta.io'), + Contributor('陳義昇', 'love80312@gmail.com'), + Contributor('Макар Разин', 'makarrazin14@gmail.com'), + Contributor('Leon', 'leonhoog@outlook.com'), + Contributor('stephen-cusi', 'magiskcurry@qq.com'), + Contributor('atilluF', '110931720+atilluF@users.noreply.github.com'), + Contributor('Davide Neri', 'davnerix@gmail.com'), + Contributor('ShiftCtrlAltDel', 'who--is@yandex.ru'), + Contributor('lol lol', 'besonderspositiverpanda@ji5.de'), + Contributor('Fabian Rennebeck', 'propago47@posteo.org'), + Contributor('Henry The Mole', 'htmole@gmail.com'), + Contributor('Kryštof Černý', 'cleverline1mc@gmail.com'), + Contributor('marciozomb13', 'marciozomb13@outlook.com'), + Contributor('yangyangdaji', '1504305527@qq.com'), + Contributor('ngocanhtve', 'ngocanh.tve@gmail.com'), + Contributor('Le Nhut Binh', 'bebinh2202@gmail.com'), + Contributor('Martin Frandel', 'martinko.fr@gmail.com'), + Contributor('Milan Šalka', 'salka.milan@googlemail.com'), + Contributor('Diviega Ayulsa', 'ayulsadiviega@gmail.com'), + Contributor('Fqwe1', 'Fqwe1@users.noreply.hosted.weblate.org'), + Contributor('Reza Almanda', 'rezaalmanda27@gmail.com'), + Contributor('Sveinn í Felli', 'sv1@fellsnet.is'), + Contributor('Henning Bunk', 'henningtbunk@gmail.com'), + Contributor('Samirah Ail', 'samiratalzahrani@gmail.com'), + Contributor('Salih Ail', 'rrrfff444@gmail.com'), + Contributor('Nasreddine Loukriz', 'nasreddineloukriz@gmail.com'), + Contributor('Mohamed Zeroug', 'mzeroug19@gmail.com'), + Contributor('ssantos', 'ssantos@web.de'), + Contributor('Сергій', 'sergiy.goncharuk.1@gmail.com'), + Contributor('v1s7', 'v1s7@users.noreply.hosted.weblate.org'), + Contributor('fuzfyy', 'egeozce35@gmail.com'), + Contributor('minh', 'teaminh@skiff.com'), + Contributor('luckris25', 'lk1thebestl@gmail.com'), + Contributor('Marc Amorós', 'marquitus99@gmail.com'), + Contributor('elea11', 'p.manuel.warnecke@gmail.com'), + Contributor('しいたけ', 'Shiitake@users.noreply.hosted.weblate.org'), + Contributor('wanzh', 'wanzh66666@gmail.com'), + Contributor('ID J', 'tabby4442@gmail.com'), + Contributor('randint', 'lancameb@hotmail.com'), + Contributor('امیر جهانگرد', 'ijahangard.a@gmail.com'), + Contributor('slasb37', 'p84haghi@gmail.com'), + Contributor('mimvahedi', 'vahedi0vahedi@gmail.com'), + Contributor('Alireza Rashidi', 'alirezarashidigoorabi@gmail.com'), + Contributor('何意挽秋風', '94283631+RejectVanity@users.noreply.github.com'), + Contributor('cheese', 'deanlemans5646@gmail.com'), + Contributor('Owen Elderbroek', 'o.elderbroek@gmail.com'), + Contributor('Maxi', 'maxitendo01@proton.me'), + Contributor('Jerguš Fonfer', 'caro.jf@protonmail.com'), + Contributor('elfriob', 'elfriob@ya.ru'), + Contributor('Stephan Paternotte', 'stephan@paternottes.net'), + Contributor('Tung Anh', 'buihuutunganh2007@gmail.com'), + Contributor('Adrien N', 'adriennathaniel1999@gmail.com'), + Contributor('Shift18', 'bribable.lawyer@posteo.net'), + Contributor('Andreas Håll', 'ante_skalman@hotmail.com'), + Contributor('Scorza9999', 'oliva.scorza@gmail.com'), + Contributor('Taufan', 'taufanxxx@gmail.com'), + Contributor('Leo Aaua Felix', 'g00g7el@gmail.com'), + Contributor('-J-', 'heyj0e@tuta.io'), + Contributor('bittin', 'bittin@reimu.nl'), + Contributor('splice11', 'trenchedgrandpa@protonmail.com'), + Contributor('Ihor Hordiichuk', 'igor_ck@outlook.com'), + Contributor('João Palmeiro', 'joaommpalmeiro@gmail.com'), + Contributor('Whoever4976', 'wolffjonas47@gmail.com'), + Contributor('Your Average Code', 'neumeiersi91358@th-nuernberg.de'), + Contributor('Paranoid Android', 'f.cherdzhiev@innopolis.university'), + Contributor('Noah Kenzie Rodriguez-Beus', 'noahbeus@protonmail.com'), + Contributor('5FeetUnder', '15950507+5FeetUnder@users.noreply.github.com'), + Contributor('Cleverson Cândido', 'optimuspraimu@gmail.com'), + Contributor('Hasan Kara', 'hasanbeytullahkara@gmail.com'), + Contributor('Thomas Di Cristofaro', 'hostedweblate.8347@tdc.akamail.it'), + Contributor('Petrov', 'i_v_c@mail.ru'), + Contributor('தமிழ்நேரம்', 'anishprabu.t@gmail.com'), + Contributor('bovirus', 'roberto.boriotti@canon.it'), + Contributor('Максим Горпиніч', 'maksimgorpinic2005a@gmail.com'), + Contributor('Priit Jõerüüt', 'hwlate@joeruut.com'), + Contributor('Dr Hieu', 'v7pvas7m@anonaddy.com'), + Contributor('Saúl Palacios', 'palacios22c@gmail.com'), + Contributor('Grooty12', 'Rasmus@rosendahl-kaa.name'), + Contributor('Victor M', 'victormorita@tuta.io'), + Contributor('cat', 'catsnote@proton.me'), + Contributor('Bruno Fragoso', 'darth_signa@hotmail.com'), + Contributor('hugoalh', 'hugoalh@users.noreply.hosted.weblate.org'), + Contributor('Josep M. Ferrer', 'txemaq@gmail.com'), + Contributor('pitroig', 'ona@riseup.net'), + Contributor('Rubén Castiñeiras Lorenzo', 'rcasl@outlook.com'), + Contributor('hanyang cheng', 'cinxiafortis@tutanota.de'), + Contributor('Chethan', 'chethan@users.noreply.hosted.weblate.org'), + Contributor('Prasannakumar T Bhat', 'pbhat99@gmail.com'), + Contributor('Bora Atıcı', 'boratici.acc@gmail.com'), + Contributor('Ettore Atalan', 'atalanttore@googlemail.com'), + Contributor('VertekPlus', 'vertekplus@users.noreply.hosted.weblate.org'), + Contributor('slabs37', 'p84haghi@gmail.com'), + Contributor('GiannosOB', 'giannos2105@gmail.com'), + Contributor('Miquel Martí', 'miquelmarti111@gmail.com'), + Contributor('Yurt Page', 'yurtpage@gmail.com'), + Contributor('Murcielago', 'weblate.j9bmx@slmail.me'), + Contributor('vm', 'varga.m007@gmail.com'), + Contributor('WMatheist', 'wmatheist@protonmail.com'), + Contributor('Daniel Nylander', 'daniel@danielnylander.se'), + Contributor('Alioc', 'hit.177411245@gmail.com'), + Contributor('Sasi Ba', 'sasiba8328@fuasha.com'), + Contributor('Sevect', 'sevect@users.noreply.hosted.weblate.org'), + Contributor('Star Athendwyl', 'weblate.tyke961@passmail.net'), + Contributor('Marija Grineviciute', 'marijagrine@protonmail.com'), + Contributor('Hasan Berat Kaylan', 'hasanberatkaylan@gmail.com'), + Contributor('Mahyar-Saberifard', 'mahyarsaberi20@gmail.com'), + Contributor('ggLuigi_Ching', 'chingy.cyl@gmail.com'), + Contributor('Åzze', 'laitinen.jere222@gmail.com'), + Contributor('Olli', 'ollinen@ollit.dev'), + Contributor('Ricky Tigg', 'ricky.tigg@gmail.com'), + Contributor('Oris5', 'otso.karttunen@gmail.com'), + Contributor('nullspace', 'jxhchina@gmail.com'), + Contributor('dcre', 'realdcre@users.noreply.hosted.weblate.org'), + Contributor('AUGANOS', 'giannoskai@proton.me'), + Contributor('H@di', 'hadi@hadisafari.ir'), + Contributor('Kachelkaiser', 'kachelkaiser@htpst.de'), + Contributor('Kiril Panayotov', 'eccyboo@protonmail.com'), + Contributor('Xusi Fons', 'xusi@keemail.me'), + Contributor('abc0922001', 'abc0922001@hotmail.com'), + Contributor('Morkovka21Vek', 'morkovka21vek@gmail.com'), + Contributor('Valentin Ljuba', '7fnndt50@anonaddy.me'), + // Contributor('Femini', 'nizamismidov4@gmail.com'), // Azerbaijani + // Contributor('Jamil Farajov', 'jamilfarajov@gmail.com'), // Azerbaijani + // Contributor('Alvi Khan', 'aveenalvi@gmail.com'), // Bengali + // Contributor('Htet Oo Hlaing', 'htetoh2006@outlook.com'), // Burmese + // Contributor('Khant', 'khant@users.noreply.hosted.weblate.org'), // Burmese + // Contributor('Thit Lwin', 'thitlwincoder@gmail.com'), // Burmese + // Contributor('s2W', 'dmrmarketingemail@yahoo.com'), // Croatian + // Contributor('Idj', 'joneltmp+goahn@gmail.com'), // Hebrew + // Contributor('elid', 'shopisrael12@gmail.com'), // Hebrew + // Contributor('Rohit Burman', 'rohitburman31p@rediffmail.com'), // Hindi + // Contributor('AJ07', 'ajaykumarmeena676@gmail.com'), // Hindi + // Contributor('Sartaj', 'ssaarrttaajj111@gmail.com'), // Hindi + // Contributor('Anurag Samota', 'anuragsamotasamota@gmail.com'), // Hindi + // Contributor('GoRaN', 'gorangharib.909@gmail.com'), // Kurdish (Central) + // Contributor('Rasti K5', 'rasti.khdhr@gmail.com'), // Kurdish (Central) + // Contributor('CYAXXX', 'ferhad.hasan9624@gmail.com'), // Kurdish (Northern) + // Contributor('Cx', 'cyax1@proton.me'), // Kurdish (Northern) + // Contributor('Raman', 'xysed@tutanota.com'), // Malayalam + // Contributor('Akhil Raj', 'akhilakae07@gmail.com'), // Malayalam + // Contributor('Over Barrow', 'rawixo6748@insfou.com'), // Nepali + // Contributor('Subham Jena', 'subhamjena8465@gmail.com'), // Odia + // Contributor('Prasanta-Hembram', 'Prasantahembram720@gmail.com'), // Santali + // Contributor('Enenra', 'nnra2210@gmail.com'), // Serbian + // Contributor('Nikola Perović', 'nikolaperovicccc@gmail.com'), // Serbian + // Contributor('mytja', 'mamnju21@gmail.com'), // Slovenian + // Contributor('Nattapong K', 'mixer5056@gmail.com'), // Thai + // Contributor('Feliks-WR', 'aq.1428@tuta.io'), // Urdu + }; +} + +class Contributor { + final String name; + final String? weblateEmail; + + const Contributor(this.name, this.weblateEmail); +} diff --git a/lib/model/app/dependencies.dart b/lib/model/app/dependencies.dart new file mode 100644 index 0000000..4777342 --- /dev/null +++ b/lib/model/app/dependencies.dart @@ -0,0 +1,410 @@ +import 'package:aves/app_flavor.dart'; + +class Dependencies { + static const String apache2 = 'Apache License 2.0'; + static const String bsd2 = 'BSD 2-Clause “Simplified” License'; + static const String bsd3 = 'BSD 3-Clause “Revised” License'; + static const String eclipse1 = 'Eclipse Public License 1.0'; + static const String lgpl3 = 'GNU Lesser General Public License v3.0'; + static const String mit = 'MIT License'; + static const String zlib = 'zlib License'; + + static const List<Dependency> androidDependencies = [ + Dependency( + name: 'AndroidSVG (Aves fork)', + license: apache2, + sourceUrl: 'https://github.com/deckerst/androidsvg', + ), + Dependency( + name: 'AndroidX (Core Kotlin, Exifinterface, Lifecycle Process, Multidex)', + license: apache2, + sourceUrl: 'https://android.googlesource.com/platform/frameworks/support/+/androidx-main/core/core-ktx', + ), + Dependency( + name: 'CWAC-Document', + license: apache2, + sourceUrl: 'https://github.com/commonsguy/cwac-document', + ), + Dependency( + name: 'Glide', + license: '$apache2, $bsd2', + sourceUrl: 'https://github.com/bumptech/glide', + ), + Dependency( + name: 'Metadata Extractor', + license: apache2, + sourceUrl: 'https://github.com/drewnoakes/metadata-extractor', + ), + Dependency( + name: 'MP4 Parser (Aves fork)', + license: apache2, + sourceUrl: 'https://github.com/deckerst/mp4parser', + ), + Dependency( + name: 'PixyMeta Android (Aves fork)', + license: eclipse1, + sourceUrl: 'https://github.com/deckerst/pixymeta-android', + ), + Dependency( + name: 'Tiff Bitmap Factory (Aves fork)', + license: mit, + sourceUrl: 'https://github.com/deckerst/Android-TiffBitmapFactory', + ), + ]; + + static const List<Dependency> _flutterPluginsCommon = [ + Dependency( + name: 'Connectivity Plus', + license: bsd3, + sourceUrl: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/connectivity_plus', + ), + Dependency( + name: 'Device Info Plus', + license: bsd3, + sourceUrl: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/device_info_plus', + ), + Dependency( + name: 'Dynamic Color', + license: apache2, + sourceUrl: 'https://github.com/material-foundation/flutter-packages/tree/main/packages/dynamic_color', + ), + Dependency( + name: 'Floating', + license: mit, + sourceUrl: 'https://github.com/wrbl606/floating', + ), + Dependency( + name: 'Flutter Display Mode', + license: mit, + sourceUrl: 'https://github.com/ajinasokan/flutter_displaymode', + ), + Dependency( + name: 'Local Auth', + license: bsd3, + sourceUrl: 'https://github.com/flutter/packages/tree/main/packages/local_auth/local_auth', + ), + Dependency( + name: 'Media Kit', + license: mit, + sourceUrl: 'https://github.com/media-kit/media-kit', + ), + Dependency( + name: 'Network Info Plus', + license: bsd3, + sourceUrl: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/network_info_plus', + ), + Dependency( + name: 'Package Info Plus', + license: bsd3, + sourceUrl: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/package_info_plus', + ), + Dependency( + name: 'Permission Handler', + license: mit, + sourceUrl: 'https://github.com/Baseflow/flutter-permission-handler', + ), + Dependency( + name: 'Printing', + license: apache2, + sourceUrl: 'https://github.com/DavBfr/dart_pdf', + ), + Dependency( + name: 'Screen Brightness', + license: mit, + sourceUrl: 'https://github.com/aaassseee/screen_brightness', + ), + Dependency( + name: 'Shared Preferences', + license: bsd3, + sourceUrl: 'https://github.com/flutter/packages/tree/main/packages/shared_preferences/shared_preferences', + ), + Dependency( + name: 'sqflite', + license: bsd2, + sourceUrl: 'https://github.com/tekartik/sqflite', + ), + Dependency( + name: 'Streams Channel (Aves fork)', + license: apache2, + sourceUrl: 'https://github.com/deckerst/aves_streams_channel', + ), + Dependency( + name: 'URL Launcher', + license: bsd3, + sourceUrl: 'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher', + ), + Dependency( + name: 'Volume Controller', + license: mit, + sourceUrl: 'https://github.com/kurenai7968/volume_controller', + ), + ]; + + static const List<Dependency> _googleMobileServices = [ + Dependency( + name: 'Google API Availability', + license: mit, + sourceUrl: 'https://github.com/Baseflow/flutter-google-api-availability', + ), + Dependency( + name: 'Google Maps for Flutter', + license: bsd3, + sourceUrl: 'https://github.com/flutter/packages/tree/main/packages/google_maps_flutter/google_maps_flutter', + ), + ]; + + static const List<Dependency> _flutterPluginsIzzyOnly = [ + ..._googleMobileServices, + ]; + + static const List<Dependency> _flutterPluginsLibreOnly = []; + + static const List<Dependency> _flutterPluginsPlayOnly = [ + ..._googleMobileServices, + Dependency( + name: 'FlutterFire (Core, Crashlytics)', + license: bsd3, + sourceUrl: 'https://github.com/FirebaseExtended/flutterfire', + ), + ]; + + static List<Dependency> flutterPlugins(AppFlavor flavor) => [ + ..._flutterPluginsCommon, + if (flavor == AppFlavor.izzy) ..._flutterPluginsIzzyOnly, + if (flavor == AppFlavor.libre) ..._flutterPluginsLibreOnly, + if (flavor == AppFlavor.play) ..._flutterPluginsPlayOnly, + ]; + + static const List<Dependency> flutterPackages = [ + Dependency( + name: 'Charts (Aves fork)', + license: apache2, + sourceUrl: 'https://github.com/deckerst/flutter_google_charts', + ), + Dependency( + name: 'Custom rounded rectangle border', + license: mit, + sourceUrl: 'https://github.com/lekanbar/custom_rounded_rectangle_border', + ), + Dependency( + name: 'Decorated Icon', + license: mit, + sourceUrl: 'https://github.com/benPesso/flutter_decorated_icon', + ), + Dependency( + name: 'Expansion Tile Card (Aves fork)', + license: bsd3, + sourceUrl: 'https://github.com/deckerst/expansion_tile_card', + ), + Dependency( + name: 'FlexColorPicker', + license: bsd3, + sourceUrl: 'https://github.com/rydmike/flex_color_picker', + ), + Dependency( + name: 'Flutter Highlight', + license: mit, + sourceUrl: 'https://github.com/git-touch/highlight', + ), + Dependency( + name: 'Flutter Map', + license: bsd3, + sourceUrl: 'https://github.com/fleaflet/flutter_map', + ), + Dependency( + name: 'Flutter Markdown Plus', + license: bsd3, + sourceUrl: 'https://github.com/foresightmobile/flutter_markdown_plus', + ), + Dependency( + name: 'Flutter Staggered Animations', + license: mit, + sourceUrl: 'https://github.com/mobiten/flutter_staggered_animations', + ), + Dependency( + name: 'Material Design Icons Flutter', + license: mit, + sourceUrl: 'https://github.com/ziofat/material_design_icons_flutter', + ), + Dependency( + name: 'Material Symbols Icons for Flutter', + license: apache2, + sourceUrl: 'https://github.com/timmaffett/material_symbols_icons', + ), + Dependency( + name: 'Overlay Support', + license: apache2, + sourceUrl: 'https://github.com/boyan01/overlay_support', + ), + Dependency( + name: 'Palette Generator', + license: bsd3, + sourceUrl: 'https://github.com/flutter/packages/tree/main/packages/palette_generator', + ), + Dependency( + name: 'Panorama (Aves fork)', + license: apache2, + sourceUrl: 'https://github.com/deckerst/aves_panorama', + ), + Dependency( + name: 'Pattern Lock', + license: apache2, + sourceUrl: 'https://github.com/qwert2603/pattern_lock', + ), + Dependency( + name: 'Percent Indicator', + license: bsd2, + sourceUrl: 'https://github.com/diegoveloper/flutter_percent_indicator', + ), + Dependency( + name: 'Pin Code Fields', + license: mit, + sourceUrl: 'https://github.com/adar2378/pin_code_fields', + ), + Dependency( + name: 'Provider', + license: mit, + sourceUrl: 'https://github.com/rrousselGit/provider', + ), + Dependency( + name: 'Smooth Page Indicator', + license: mit, + sourceUrl: 'https://github.com/Milad-Akarie/smooth_page_indicator', + ), + Dependency( + name: 'Vector Map Tiles', + license: bsd3, + sourceUrl: 'https://github.com/greensopinion/flutter-vector-map-tiles', + ), + Dependency( + name: 'Vector Tile Renderer', + license: bsd3, + sourceUrl: 'https://github.com/greensopinion/dart-vector-tile-renderer', + ), + ]; + + static const List<Dependency> dartPackages = [ + Dependency( + name: 'Collection', + license: bsd3, + sourceUrl: 'https://github.com/dart-lang/collection', + ), + Dependency( + name: 'Country Code', + license: mit, + sourceUrl: 'https://github.com/denixport/dart.country', + ), + Dependency( + name: 'CSV', + license: mit, + sourceUrl: 'https://github.com/close2/csv', + ), + Dependency( + name: 'DLNA Dart', + license: bsd3, + sourceUrl: 'https://github.com/suconghou/dlna-dart', + ), + Dependency( + name: 'Equatable', + license: mit, + sourceUrl: 'https://github.com/felangel/equatable', + ), + Dependency( + name: 'Event Bus', + license: mit, + sourceUrl: 'https://github.com/marcojakob/dart-event-bus', + ), + Dependency( + name: 'Fluster', + license: mit, + sourceUrl: 'https://github.com/alfonsocejudo/fluster', + ), + Dependency( + name: 'Flutter Lints', + license: bsd3, + sourceUrl: 'https://github.com/flutter/packages/tree/main/packages/flutter_lints', + ), + Dependency( + name: 'Get It', + license: mit, + sourceUrl: 'https://github.com/fluttercommunity/get_it', + ), + Dependency( + name: 'GPX', + license: apache2, + sourceUrl: 'https://github.com/kb0/dart-gpx', + ), + Dependency( + name: 'HTTP', + license: bsd3, + sourceUrl: 'https://github.com/dart-lang/http', + ), + Dependency( + name: 'Intl', + license: bsd3, + sourceUrl: 'https://github.com/dart-lang/intl', + ), + Dependency( + name: 'LatLong2', + license: apache2, + sourceUrl: 'https://github.com/jifalops/dart-latlong', + ), + Dependency( + name: 'Memory Leak Tracker', + license: bsd3, + sourceUrl: 'https://github.com/dart-lang/leak_tracker', + ), + Dependency( + name: 'Path', + license: bsd3, + sourceUrl: 'https://github.com/dart-lang/path', + ), + Dependency( + name: 'PDF for Dart and Flutter', + license: apache2, + sourceUrl: 'https://github.com/DavBfr/dart_pdf', + ), + Dependency( + name: 'Proj4dart', + license: mit, + sourceUrl: 'https://github.com/maRci002/proj4dart', + ), + Dependency( + name: 'Shelf', + license: bsd3, + sourceUrl: 'https://github.com/dart-lang/shelf', + ), + Dependency( + name: 'Stack Trace', + license: bsd3, + sourceUrl: 'https://github.com/dart-lang/stack_trace', + ), + Dependency( + name: 'Synchronized', + license: mit, + sourceUrl: 'https://github.com/tekartik/synchronized.dart/tree/master/synchronized', + ), + Dependency( + name: 'Vector Math', + license: '$zlib, $bsd3', + sourceUrl: 'https://github.com/google/vector_math.dart', + ), + Dependency( + name: 'XML', + license: mit, + sourceUrl: 'https://github.com/renggli/dart-xml', + ), + ]; +} + +class Dependency { + final String name; + final String license; + final String sourceUrl; + + const Dependency({ + required this.name, + required this.license, + required this.sourceUrl, + }); +} diff --git a/lib/model/app/intent.dart b/lib/model/app/intent.dart new file mode 100644 index 0000000..ee4985b --- /dev/null +++ b/lib/model/app/intent.dart @@ -0,0 +1,27 @@ +class IntentActions { + static const edit = 'edit'; + static const pickItems = 'pick_items'; + static const pickCollectionFilters = 'pick_collection_filters'; + static const screenSaver = 'screen_saver'; + static const screenSaverSettings = 'screen_saver_settings'; + static const search = 'search'; + static const setWallpaper = 'set_wallpaper'; + static const view = 'view'; + static const viewGeo = 'view_geo'; + static const widgetOpen = 'widget_open'; + static const widgetSettings = 'widget_settings'; +} + +class IntentDataKeys { + static const action = 'action'; + static const allowMultiple = 'allowMultiple'; + static const brightness = 'brightness'; + static const explorerPath = 'explorerPath'; + static const filters = 'filters'; + static const mimeType = 'mimeType'; + static const page = 'page'; + static const query = 'query'; + static const secureUris = 'secureUris'; + static const uri = 'uri'; + static const widgetId = 'widgetId'; +} diff --git a/lib/model/app/permissions.dart b/lib/model/app/permissions.dart new file mode 100644 index 0000000..3104272 --- /dev/null +++ b/lib/model/app/permissions.dart @@ -0,0 +1,16 @@ +import 'package:permission_handler/permission_handler.dart'; + +class Permissions { + static const storage = [ + Permission.storage, + // for media access on Android >=13 + Permission.photos, + Permission.videos, + ]; + + static const mediaAccess = [ + ...storage, + // to access media with unredacted metadata with scoped storage (Android >=10) + Permission.accessMediaLocation, + ]; +} diff --git a/lib/model/app/support.dart b/lib/model/app/support.dart new file mode 100644 index 0000000..6d6f5d2 --- /dev/null +++ b/lib/model/app/support.dart @@ -0,0 +1,87 @@ +import 'package:aves/ref/mime_types.dart'; + +class AppSupport { + // TODO TLAD [codec] make it dynamic if it depends on OS/lib versions + static const Set<String> undecodableImages = { + // unsupported + MimeTypes.art, + MimeTypes.cdr, + MimeTypes.cdrt, + MimeTypes.cpt, + MimeTypes.djvu, + MimeTypes.dwg, + MimeTypes.dxf, + MimeTypes.jpeg2000, + MimeTypes.jpx, + MimeTypes.jxl, + MimeTypes.pat, + MimeTypes.pcx, + MimeTypes.pnm, + MimeTypes.ppm, + MimeTypes.psdVnd, + MimeTypes.psdX, + MimeTypes.rgbe, + MimeTypes.tap, + MimeTypes.vtf, + MimeTypes.wmf, + // RAW + MimeTypes.crw, + // non-media + MimeTypes.octetStream, + MimeTypes.zip, + }; + + static bool canDecode(String mimeType) => !undecodableImages.contains(mimeType); + + // `exifinterface` v1.3.3 declared support for DNG, but it strips non-standard Exif tags when saving attributes, + // and DNG requires DNG-specific tags saved along standard Exif. So it was actually breaking DNG files. + static bool canEditExif(String mimeType) { + switch (mimeType.toLowerCase()) { + // as of androidx.exifinterface:exifinterface:1.3.4 + case MimeTypes.jpeg: + case MimeTypes.png: + case MimeTypes.webp: + return true; + default: + return false; + } + } + + static bool canEditIptc(String mimeType) { + switch (mimeType.toLowerCase()) { + // as of latest PixyMeta + case MimeTypes.jpeg: + case MimeTypes.tiff: + return true; + default: + return false; + } + } + + static bool canEditXmp(String mimeType) { + switch (mimeType.toLowerCase()) { + // as of latest PixyMeta + case MimeTypes.gif: + case MimeTypes.jpeg: + case MimeTypes.png: + case MimeTypes.tiff: + return true; + // using `mp4parser` + case MimeTypes.mp4: + return true; + default: + return false; + } + } + + static bool canRemoveMetadata(String mimeType) { + switch (mimeType.toLowerCase()) { + // as of latest PixyMeta + case MimeTypes.jpeg: + case MimeTypes.tiff: + return true; + default: + return false; + } + } +} diff --git a/lib/model/app_inventory.dart b/lib/model/app_inventory.dart new file mode 100644 index 0000000..7e90930 --- /dev/null +++ b/lib/model/app_inventory.dart @@ -0,0 +1,82 @@ +import 'package:aves/services/common/services.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; + +final AppInventory appInventory = AppInventory._private(); + +class AppInventory { + Set<Package> _packages = {}; + List<String> _potentialAppDirs = []; + + ValueNotifier<bool> areAppNamesReadyNotifier = ValueNotifier(false); + + Iterable<Package> get _launcherPackages => _packages.where((v) => v.categoryLauncher); + + AppInventory._private(); + + Future<void> initAppNames() async { + if (_packages.isEmpty) { + debugPrint('Access installed app inventory'); + _packages = await appService.getPackages(); + _potentialAppDirs = _launcherPackages.expand((v) => v.potentialDirs).toList(); + areAppNamesReadyNotifier.value = true; + } + } + + Future<void> resetAppNames() async { + _packages.clear(); + _potentialAppDirs.clear(); + areAppNamesReadyNotifier.value = false; + } + + bool isPotentialAppDir(String dir) => _potentialAppDirs.contains(Package.normalizePotentialDir(dir)); + + String? getAlbumAppPackageName(String albumPath) { + final dir = Package.normalizePotentialDir(pContext.split(albumPath).last); + final package = _launcherPackages.firstWhereOrNull((v) => v.potentialDirs.contains(dir)); + return package?.packageName; + } + + String? getCurrentAppName(String packageName) { + final package = _packages.firstWhereOrNull((v) => v.packageName == packageName); + return package?.currentLabel; + } +} + +class Package { + final String packageName; + final String? currentLabel, englishLabel; + final bool categoryLauncher, isSystem; + final Set<String> ownedDirs = {}; + + Package({ + required this.packageName, + required this.currentLabel, + required this.englishLabel, + required this.categoryLauncher, + required this.isSystem, + }); + + factory Package.fromMap(Map map) { + return Package( + packageName: map['packageName'] ?? '', + currentLabel: map['currentLabel'], + englishLabel: map['englishLabel'], + categoryLauncher: map['categoryLauncher'] ?? false, + isSystem: map['isSystem'] ?? false, + ); + } + + Set<String> get potentialDirs => [ + currentLabel, + englishLabel, + ...ownedDirs, + ].nonNulls.map(normalizePotentialDir).toSet(); + + static String normalizePotentialDir(String dir) { + return dir.replaceAll('_', ' ').trim().toLowerCase(); + } + + @override + String toString() => '$runtimeType#${shortHash(this)}{packageName=$packageName, categoryLauncher=$categoryLauncher, isSystem=$isSystem, currentLabel=$currentLabel, englishLabel=$englishLabel, ownedDirs=$ownedDirs}'; +} diff --git a/lib/model/availability.dart b/lib/model/availability.dart new file mode 100644 index 0000000..59fc270 --- /dev/null +++ b/lib/model/availability.dart @@ -0,0 +1,64 @@ +import 'package:aves/model/device.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:flutter/foundation.dart'; + +abstract class AvesAvailability { + Future<void> onNewIntent(); + + void onResume(); + + bool get isLocked; + + Future<bool> get isConnected; + + Future<bool> get canLocatePlaces; + + List<EntryMapStyle> get mapStyles; +} + +class LiveAvesAvailability implements AvesAvailability { + bool? _isConnected, _isLocked; + + LiveAvesAvailability() { + Connectivity().onConnectivityChanged.listen(_updateConnectivityFromResult); + } + + @override + Future<void> onNewIntent() async { + _isLocked = await deviceService.isLocked(); + debugPrint('Device is locked=$_isLocked'); + } + + @override + void onResume() => _isConnected = null; + + @override + bool get isLocked => _isLocked ?? false; + + @override + Future<bool> get isConnected async { + if (_isConnected != null) return SynchronousFuture(_isConnected!); + final result = await (Connectivity().checkConnectivity()); + _updateConnectivityFromResult(result); + return _isConnected!; + } + + void _updateConnectivityFromResult(List<ConnectivityResult> result) { + final newValue = result.isNotEmpty && !result.contains(ConnectivityResult.none); + if (_isConnected != newValue) { + _isConnected = newValue; + debugPrint('Device is connected=$_isConnected'); + } + } + + @override + Future<bool> get canLocatePlaces async => device.hasGeocoder && await isConnected; + + @override + List<EntryMapStyle> get mapStyles => [ + ...mobileServices.mapStyles, + ...EntryMapStyles.baseStyles, + ]; +} diff --git a/lib/model/covers.dart b/lib/model/covers.dart new file mode 100644 index 0000000..c6e1146 --- /dev/null +++ b/lib/model/covers.dart @@ -0,0 +1,345 @@ +import 'dart:async'; + +import 'package:aves/model/app_inventory.dart'; +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/container/tag_group.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:collection/collection.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/painting.dart'; +import 'package:synchronized/synchronized.dart'; + +final Covers covers = Covers._private(); + +typedef CoverProps = (int? entryId, String? packageName, Color? color); + +class Covers { + final Set<StreamSubscription> _subscriptions = {}; + final _lock = Lock(); + + final StreamController<Set<CollectionFilter>?> _entryChangeStreamController = StreamController.broadcast(); + final StreamController<Set<CollectionFilter>?> _packageChangeStreamController = StreamController.broadcast(); + final StreamController<Set<CollectionFilter>?> _colorChangeStreamController = StreamController.broadcast(); + + Stream<Set<CollectionFilter>?> get entryChangeStream => _entryChangeStreamController.stream; + + Stream<Set<CollectionFilter>?> get packageChangeStream => _packageChangeStreamController.stream; + + Stream<Set<CollectionFilter>?> get colorChangeStream => _colorChangeStreamController.stream; + + Set<CoverRow> _rows = {}; + + // do not subscribe to events from other modules in constructor + // so that modules can subscribe to each other + Covers._private(); + + Future<void> init() async { + _rows = await localMediaDb.loadAllCovers(); + _subscriptions.add(dynamicAlbums.eventBus.on<DynamicAlbumChangedEvent>().listen((e) => _updateCoveredDynamicAlbums(e.changes))); + _subscriptions.add(albumGrouping.eventBus.on<GroupUriChangedEvent>().listen((e) => _updateCoveredGroup(e.oldGroupUri, e.newGroupUri))); + _subscriptions.add(tagGrouping.eventBus.on<GroupUriChangedEvent>().listen((e) => _updateCoveredGroup(e.oldGroupUri, e.newGroupUri))); + } + + int get count => _rows.length; + + Set<CoverRow> get all => Set.unmodifiable(_rows); + + CoverProps? of(CollectionFilter filter) { + if (filter is StoredAlbumFilter && vaults.isLocked(filter.album)) return null; + + final row = _rows.firstWhereOrNull((row) => row.filter == filter); + return row != null ? (row.entryId, row.packageName, row.color) : null; + } + + Future<CoverProps?> remove(CollectionFilter filter, {bool notify = true}) async { + final props = of(filter); + if (props != null) { + await set(filter: filter, entryId: null, packageName: null, color: null); + + if (notify) { + final (entryId, packageName, color) = props; + if (entryId != null) _entryChangeStreamController.add({filter}); + if (packageName != null) _packageChangeStreamController.add({filter}); + if (color != null) _colorChangeStreamController.add({filter}); + } + } + return props; + } + + Future<void> removeAll(Set<CollectionFilter> filters, {bool notify = true}) async { + final entryIdChanged = <CollectionFilter>{}; + final packageNameChanged = <CollectionFilter>{}; + final colorChanged = <CollectionFilter>{}; + + for (final filter in filters) { + final props = await remove(filter, notify: false); + if (notify && props != null) { + final (entryId, packageName, color) = props; + if (entryId != null) entryIdChanged.add(filter); + if (packageName != null) packageNameChanged.add(filter); + if (color != null) colorChanged.add(filter); + } + } + + if (notify) { + if (entryIdChanged.isNotEmpty) _entryChangeStreamController.add(entryIdChanged); + if (packageNameChanged.isNotEmpty) _packageChangeStreamController.add(packageNameChanged); + if (colorChanged.isNotEmpty) _colorChangeStreamController.add(colorChanged); + } + } + + Future<void> set({ + required CollectionFilter filter, + required int? entryId, + required String? packageName, + required Color? color, + bool notify = true, + }) async { + // erase contextual properties from filters before saving them + switch (filter) { + case StoredAlbumFilter _: + filter = StoredAlbumFilter(filter.album, null); + case AlbumGroupFilter _: + filter = AlbumGroupFilter.empty(filter.uri); + case TagGroupFilter _: + filter = TagGroupFilter.empty(filter.uri); + } + + final oldRows = _rows.where((row) => row.filter == filter).toSet(); + _rows.removeAll(oldRows); + await localMediaDb.removeCovers({filter}); + + final oldRow = oldRows.firstOrNull; + final oldEntry = oldRow?.entryId; + final oldPackage = oldRow?.packageName; + final oldColor = oldRow?.color; + + if (entryId != null || packageName != null || color != null) { + final row = CoverRow( + filter: filter, + entryId: entryId, + packageName: packageName, + color: color, + ); + _rows.add(row); + await localMediaDb.addCovers({row}); + } + + if (notify) { + if (oldEntry != entryId) _entryChangeStreamController.add({filter}); + if (oldPackage != packageName) _packageChangeStreamController.add({filter}); + if (oldColor != color) _colorChangeStreamController.add({filter}); + } + } + + Future<void> _removeEntryFromRows(Set<CoverRow> rows) { + return Future.forEach<CoverRow>( + rows, + (row) => set( + filter: row.filter, + entryId: null, + packageName: row.packageName, + color: row.color, + ), + ); + } + + Future<void> moveEntry(AvesEntry entry) async { + final entryId = entry.id; + await _removeEntryFromRows(_rows.where((row) => row.entryId == entryId && !row.filter.test(entry)).toSet()); + } + + Future<void> removeIds(Set<int> entryIds) async { + await _removeEntryFromRows(_rows.where((row) => entryIds.contains(row.entryId)).toSet()); + } + + Future<void> clear() async { + await localMediaDb.clearCovers(); + _rows.clear(); + + _entryChangeStreamController.add(null); + _packageChangeStreamController.add(null); + _colorChangeStreamController.add(null); + } + + AlbumType effectiveAlbumType(String albumPath) { + final filterPackage = of(StoredAlbumFilter(albumPath, null))?.$2; + if (filterPackage != null) { + return filterPackage.isEmpty ? AlbumType.regular : AlbumType.app; + } else { + return androidFileUtils.getAlbumType(albumPath); + } + } + + String? effectiveAlbumPackage(String albumPath) { + final filterPackage = of(StoredAlbumFilter(albumPath, null))?.$2; + return filterPackage ?? appInventory.getAlbumAppPackageName(albumPath); + } + + Future<void> _updateCoveredDynamicAlbums(Map<DynamicAlbumFilter, DynamicAlbumFilter?> changes) async { + await _lock.synchronized(() async { + await Future.forEach(changes.entries, (kv) async { + final oldFilter = kv.key; + final newFilter = kv.value; + + final cover = await covers.remove(oldFilter, notify: false); + if (cover != null && newFilter != null) { + await covers.set( + filter: newFilter, + entryId: cover.$1, + packageName: cover.$2, + color: cover.$3, + notify: true, + ); + } + }); + }); + } + + Future<void> _updateCoveredGroup(Uri oldGroupUri, Uri newGroupUri) async { + await _lock.synchronized(() async { + final grouping = FilterGrouping.forUri(oldGroupUri); + if (grouping != null) { + final oldFilter = grouping.uriToFilter(oldGroupUri); + final newFilter = grouping.uriToFilter(newGroupUri); + + if (oldFilter != null) { + final cover = await covers.remove(oldFilter, notify: false); + if (cover != null && newFilter != null) { + await covers.set( + filter: newFilter, + entryId: cover.$1, + packageName: cover.$2, + color: cover.$3, + notify: true, + ); + } + } + } + }); + } + + // import/export + + List<Map<String, dynamic>>? export(CollectionSource source) { + final visibleEntries = source.visibleEntries; + final jsonList = all + .map((row) { + final entryId = row.entryId; + final path = visibleEntries.firstWhereOrNull((entry) => entryId == entry.id)?.path; + final volume = androidFileUtils.getStorageVolume(path)?.path; + final relativePath = volume != null ? path?.substring(volume.length) : null; + final packageName = row.packageName; + final colorJson = row.color?.toJson(); + + return { + 'filter': row.filter.toJson(), + 'volume': ?volume, + 'relativePath': ?relativePath, + 'packageName': ?packageName, + 'color': ?colorJson, + }; + }) + .nonNulls + .toList(); + return jsonList.isNotEmpty ? jsonList : null; + } + + void import(Object jsonList, CollectionSource source) { + if (jsonList is! List) { + debugPrint('failed to import covers for jsonMap=$jsonList'); + return; + } + + final visibleEntries = source.visibleEntries; + jsonList.cast<Map<String, Object?>>().forEach((row) { + try { + final filter = CollectionFilter.fromJson(row['filter'] as String?); + if (filter == null) { + debugPrint('failed to import cover for row=$row'); + return; + } + + final volume = row['volume'] as String?; + final relativePath = row['relativePath'] as String?; + final packageName = row['packageName'] as String?; + final color = row['color']; + // for backward compatibility, color used to be an `int`, now a `string` + final colorJson = color is String ? color : null; + + AvesEntry? entry; + if (volume != null && relativePath != null) { + final path = pContext.join(volume, relativePath); + entry = visibleEntries.firstWhereOrNull((entry) => entry.path == path && filter.test(entry)); + if (entry == null) { + debugPrint('failed to import cover entry for path=$path, filter=$filter'); + } + } + + if (entry != null || packageName != null || colorJson != null) { + set( + filter: filter, + entryId: entry?.id, + packageName: packageName, + color: ExtraColor.fromJson(colorJson), + ); + } + } catch (error, stack) { + debugPrint('failed to import cover for row=$row with error=$error\n$stack'); + } + }); + } +} + +@immutable +class CoverRow extends Equatable { + final CollectionFilter filter; + final int? entryId; + final String? packageName; + final Color? color; + + @override + List<Object?> get props => [filter, entryId, packageName, color]; + + const CoverRow({ + required this.filter, + required this.entryId, + required this.packageName, + required this.color, + }); + + static CoverRow? fromMap(Map map) { + final filter = CollectionFilter.fromJson(map['filter']); + if (filter == null) return null; + + final entryId = map['entryId'] as int?; + final packageName = map['packageName'] as String?; + final colorJson = map['color'] as String?; + + return CoverRow( + filter: filter, + entryId: entryId, + packageName: packageName, + color: ExtraColor.fromJson(colorJson), + ); + } + + Map<String, dynamic> toMap() => { + 'filter': filter.toJson(), + 'entryId': entryId, + 'packageName': packageName, + 'color': color?.toJson(), + }; +} diff --git a/lib/model/db/db.dart b/lib/model/db/db.dart new file mode 100644 index 0000000..9a8b2ec --- /dev/null +++ b/lib/model/db/db.dart @@ -0,0 +1,174 @@ +// lib/model/db/db.dart +import 'package:aves/model/covers.dart'; +//import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/metadata/address.dart'; +import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/metadata/trash.dart'; +import 'package:aves/model/vaults/details.dart'; +import 'package:aves/model/viewer/video_playback.dart'; +import 'folder_stats.dart'; + +// 👇 serve per tipizzare il getter della connessione SQLite +import 'package:sqflite/sqflite.dart' show Database; + +// 👇 serve per buildLocalFolders() +import 'package:aves/model/source/collection_source.dart'; + + +abstract class LocalMediaDb { + int get nextId; + + Future<Set<String>> getLocalFolderPaths(); + + Future<Map<String, FolderStats>> buildFoldersInMemory(CollectionSource source); + + Future<void> saveFoldersBatch(List<FolderStats> folders); + + Future<String> get path; + + Future<void> init(); + + Future<int> dbFileSize(); + + Future<void> reset(); + + Future<void> removeIds(Set<int> ids, {Set<EntryDataType>? dataTypes}); + + Future<List<FolderStats>> loadFolders(); + + + // === Espone la connessione SQLite aperta dal loader (per il sync 4A) === + Database get rawDb; + + // ============================================================ + // FOLDERS API (LOCAL) — AGGIUNTA + // ============================================================ + + + + + + // ============================================================ + // ENTRIES + // ============================================================ + + Future<void> clearEntries(); + + Future<Set<AvesEntry>> loadEntries({int? origin, String? directory}); + + Future<Set<AvesEntry>> loadEntriesById(Set<int> ids); + + Future<void> insertEntries(Set<AvesEntry> entries); + + Future<void> updateEntry(int id, AvesEntry entry); + + Future<Set<AvesEntry>> searchLiveEntries(String query, {int? limit}); + + Future<Set<AvesEntry>> searchLiveDuplicates(int origin, Set<AvesEntry>? entries); + + // ============================================================ + // DATE TAKEN + // ============================================================ + + Future<void> clearDates(); + + Future<Map<int?, int?>> loadDates(); + + // ============================================================ + // CATALOG METADATA + // ============================================================ + + Future<void> clearCatalogMetadata(); + + Future<Set<CatalogMetadata>> loadCatalogMetadata(); + + Future<Set<CatalogMetadata>> loadCatalogMetadataById(Set<int> ids); + + Future<void> saveCatalogMetadata(Set<CatalogMetadata> metadataEntries); + + Future<void> updateCatalogMetadata(int id, CatalogMetadata? metadata); + + // ============================================================ + // ADDRESS + // ============================================================ + + Future<void> clearAddresses(); + + Future<Set<AddressDetails>> loadAddresses(); + + Future<Set<AddressDetails>> loadAddressesById(Set<int> ids); + + Future<void> saveAddresses(Set<AddressDetails> addresses); + + Future<void> updateAddress(int id, AddressDetails? address); + + // ============================================================ + // VAULTS + // ============================================================ + + Future<void> clearVaults(); + + Future<Set<VaultDetails>> loadAllVaults(); + + Future<void> addVaults(Set<VaultDetails> rows); + + Future<void> updateVault(String oldName, VaultDetails row); + + Future<void> removeVaults(Set<VaultDetails> rows); + + // ============================================================ + // TRASH + // ============================================================ + + Future<void> clearTrashDetails(); + + Future<Set<TrashDetails>> loadAllTrashDetails(); + + Future<void> updateTrash(int id, TrashDetails? details); + + // ============================================================ + // FAVOURITES + // ============================================================ + + Future<void> clearFavourites(); + + Future<Set<FavouriteRow>> loadAllFavourites(); + + Future<void> addFavourites(Set<FavouriteRow> rows); + + Future<void> updateFavouriteId(int id, FavouriteRow row); + + Future<void> removeFavourites(Set<FavouriteRow> rows); + + // ============================================================ + // COVERS + // ============================================================ + + Future<void> clearCovers(); + + Future<Set<CoverRow>> loadAllCovers(); + + Future<void> addCovers(Set<CoverRow> rows); + + Future<void> updateCoverEntryId(int id, CoverRow row); + + Future<void> removeCovers(Set<CollectionFilter> filters); + + + // ============================================================ + // VIDEO PLAYBACK + // ============================================================ + + Future<void> clearVideoPlayback(); + + Future<Set<VideoPlaybackRow>> loadAllVideoPlayback(); + + Future<VideoPlaybackRow?> loadVideoPlayback(int id); + + Future<void> addVideoPlayback(Set<VideoPlaybackRow> rows); + + Future<void> removeVideoPlayback(Set<int> ids); +} diff --git a/lib/model/db/db_extension.dart b/lib/model/db/db_extension.dart new file mode 100644 index 0000000..a0d2a66 --- /dev/null +++ b/lib/model/db/db_extension.dart @@ -0,0 +1,13 @@ +import 'package:sqflite/sqflite.dart'; + +extension ExtraDatabase on Database { + // check table existence via `sqlite_master` + // `sqlite_schema` is the alias used in SQLite documentation, + // but it was introduced in SQLite v3.33.0 and it is unavailable on Android API < 34, + // and the historical alias `sqlite_master` is still supported. + // cf https://www.sqlite.org/faq.html#q7 + Future<bool> tableExists(String table) async { + final results = await query('sqlite_master', where: 'type = ? AND name = ?', whereArgs: ['table', table]); + return results.isNotEmpty; + } +} diff --git a/lib/model/db/db_sqflite.dart b/lib/model/db/db_sqflite.dart new file mode 100644 index 0000000..8c8a8f7 --- /dev/null +++ b/lib/model/db/db_sqflite.dart @@ -0,0 +1,1112 @@ +// lib/model/db/db_sqflite.dart +import 'dart:io'; + +import 'package:aves/model/covers.dart'; +import 'package:aves/model/db/db.dart'; +import 'package:aves/model/db/db_sqflite_schema.dart'; +import 'package:aves/model/db/db_sqflite_upgrade.dart'; +//import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/metadata/address.dart'; +import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/metadata/trash.dart'; +import 'package:aves/model/vaults/details.dart'; +import 'package:aves/model/viewer/video_playback.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:sqflite/sqflite.dart'; + +// ✅ NEW: Remote origin costante +import 'package:aves/remote/remote_origin.dart'; +import 'package:path/path.dart' as p; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/utils/android_file_utils.dart'; + +import 'folder_stats.dart'; + + +class SqfliteLocalMediaDb implements LocalMediaDb { + late Database _db; + + // 🔴 4A: espone la connessione nativa aperta dal loader + @override + Database get rawDb => _db; + + @override + //Future<String> get path async => pContext.join(await getDatabasesPath(), 'metadata.db'); + Future<String> get path async => pContext.join(await getDatabasesPath(), 'aves.db'); + static const entryTable = SqfliteLocalMediaDbSchema.entryTable; + static const dateTakenTable = SqfliteLocalMediaDbSchema.dateTakenTable; + static const metadataTable = SqfliteLocalMediaDbSchema.metadataTable; + static const addressTable = SqfliteLocalMediaDbSchema.addressTable; + static const favouriteTable = SqfliteLocalMediaDbSchema.favouriteTable; + static const coverTable = SqfliteLocalMediaDbSchema.coverTable; + //static const dynamicAlbumTable = SqfliteLocalMediaDbSchema.dynamicAlbumTable; + static const vaultTable = SqfliteLocalMediaDbSchema.vaultTable; + static const trashTable = SqfliteLocalMediaDbSchema.trashTable; + static const videoPlaybackTable = SqfliteLocalMediaDbSchema.videoPlaybackTable; + + static const _entryInsertSliceMaxCount = 10000; // number of entries + static const _queryCursorBufferSize = 1000; // number of rows + static int _lastId = 0; + + @override + int get nextId => ++_lastId; + +@override +Future<Set<String>> getLocalFolderPaths() async { + final rows = await _db.query('folders', columns: ['path'], where: 'is_remote=0'); + return rows.map((r) => r['path'] as String).toSet(); +} + + + +// ============================================================ +// FOLDERS API (LOCAL) +// ============================================================ + +Future<Map<String, FolderStats>> buildFoldersInMemory(CollectionSource source) async { + final Map<String, FolderStats> folders = {}; + + for (final e in source.allEntries) { + final path = e.path; + if (path == null || path.isEmpty) continue; + + final dir = p.dirname(path); +final stats = folders.putIfAbsent(dir, () { + return FolderStats( + path: dir, + displayName: dir.split('/').last, // nome cartella + fileCount: 0, + totalSize: 0, + thumbEntryId: null, + thumbDate: null, + albumType: 0, + priority: 0, + isRemote: 0, + user: null, + deviceId: null, + hidden: 0, + hybridType: null, + ); +}); + + stats.fileCount++; + stats.totalSize += e.sizeBytes ?? 0; + + final date = e.dateModifiedMillis ?? 0; + if (stats.thumbDate == null || date > stats.thumbDate!) { + stats.thumbDate = date; + stats.thumbEntryId = e.id; + } + + stats.albumType = androidFileUtils.getAlbumType(dir).index; + stats.priority = stats.albumType; + stats.isRemote = e.origin; + stats.user = null; + stats.deviceId = null; + } + + return folders; +} + +Future<void> saveFoldersBatch(List<FolderStats> folders) async { + await _db.transaction((txn) async { + final batch = txn.batch(); + + for (final stats in folders) { + batch.insert( + 'folders', + { + 'path': stats.path, + 'display_name': stats.displayName, + 'album_type': stats.albumType, + 'priority': stats.priority, + 'is_remote': stats.isRemote, + 'hybrid_type': stats.hybridType ?? 0, + 'user': stats.user, + 'device_id': stats.deviceId, + 'file_count': stats.fileCount, + 'total_size': stats.totalSize, + 'thumb_entry_id': stats.thumbEntryId, + 'thumb_date': stats.thumbDate, + 'hidden': stats.hidden, + }, + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + + await batch.commit(noResult: true); + }); +} + +Future<List<FolderStats>> loadFolders() async { + final rows = await _db.query('folders'); + return rows.map((row) { + return FolderStats( + path: row['path'] as String, + displayName: row['display_name'] as String, + fileCount: row['file_count'] as int, + totalSize: row['total_size'] as int, + thumbEntryId: row['thumb_entry_id'] as int?, + thumbDate: row['thumb_date'] as int?, + albumType: row['album_type'] as int, + priority: row['priority'] as int, + isRemote: row['is_remote'] as int, + user: row['user'] as String?, + deviceId: row['device_id'] as String?, + hidden: row['hidden'] as int, + hybridType: row['hybrid_type'] as String?, + ); + }).toList(); +} + +Future<void> updateFolderPriority(String path, int priority) async { + await _db.update( + 'folders', + {'priority': priority}, + where: 'path = ?', + whereArgs: [path], + ); +} + +Future<void> updateFolderHidden(String path, int hidden) async { + await _db.update( + 'folders', + {'hidden': hidden}, + where: 'path = ?', + whereArgs: [path], + ); +} + +Future<void> updateFolderDisplayName(String path, String name) async { + await _db.update( + 'folders', + {'display_name': name}, + where: 'path = ?', + whereArgs: [path], + ); +} + +Future<void> updateFolderCover(String path, int entryId) async { + await _db.update( + 'folders', + { + 'thumb_entry_id': entryId, + 'thumb_date': DateTime.now().millisecondsSinceEpoch, + }, + where: 'path = ?', + whereArgs: [path], + ); +} + +Future<void> deleteFolder(String path) async { + await _db.delete( + 'folders', + where: 'path = ?', + whereArgs: [path], + ); +} + + + + +@override +Future<void> init() async { + debugPrint('[localMediaDb][init] START'); + + final dbPath = await path; + debugPrint('[localMediaDb][init] DB PATH = $dbPath'); + + try { + debugPrint('[localMediaDb][init] calling openDatabase...'); + _db = await openDatabase( + dbPath, + onConfigure: (db) async { + debugPrint('[localMediaDb][init] onConfigure'); + try { await db.execute('PRAGMA journal_mode=WAL'); } catch (e) { + debugPrint('[localMediaDb][init] WAL failed: $e'); + } + try { await db.execute('PRAGMA foreign_keys=ON'); } catch (e) { + debugPrint('[localMediaDb][init] FK failed: $e'); + } + }, + onCreate: (db, version) async { + debugPrint('[localMediaDb][init] onCreate version=$version'); + SqfliteLocalMediaDbSchema.createLatestVersion(db); + await db.execute(''' + CREATE TABLE folders ( + path TEXT PRIMARY KEY, + display_name TEXT, + file_count INTEGER, + total_size INTEGER, + thumb_entry_id INTEGER, + thumb_date INTEGER, + album_type INTEGER, + priority INTEGER, + is_remote INTEGER, + user TEXT, + device_id TEXT, + hidden INTEGER, + hybrid_type TEXT + ) + '''); + + }, + onUpgrade: (db, oldVersion, newVersion) async { + debugPrint('[localMediaDb][init] onUpgrade $oldVersion -> $newVersion'); + LocalMediaDbUpgrader.upgradeDb(db, oldVersion, newVersion); +if (oldVersion < 17) { + await db.execute(''' + CREATE TABLE IF NOT EXISTS folders ( + path TEXT PRIMARY KEY, + display_name TEXT, + file_count INTEGER, + total_size INTEGER, + thumb_entry_id INTEGER, + thumb_date INTEGER, + album_type INTEGER, + priority INTEGER, + is_remote INTEGER, + user TEXT, + device_id TEXT, + hidden INTEGER, + hybrid_type TEXT + ) + '''); +} + + }, + version: 17, + ); + debugPrint('[localMediaDb][init] openDatabase SUCCESS'); + debugPrint('[localMediaDb][init] _db is null? ${_db == null}'); + debugPrint('[localMediaDb][init] _db runtimeType = ${_db.runtimeType}'); + + } catch (e, st) { + debugPrint('[localMediaDb][init] openDatabase FAILED: $e'); + debugPrint('[localMediaDb][init] STACK: $st'); + debugPrint('[localMediaDb][init] deleting DB and retrying'); + + await deleteDatabase(dbPath); + +/* _db = await openDatabase( + dbPath, + version: 17, + onCreate: (db, version) { + debugPrint('[localMediaDb][init] onCreate (retry) version=$version'); + SqfliteLocalMediaDbSchema.createLatestVersion(db); + }, + onUpgrade: LocalMediaDbUpgrader.upgradeDb, + ); +*/ +_db = await openDatabase( + dbPath, + version: 17, + onCreate: (db, version) async { + debugPrint('[localMediaDb][init] onCreate (retry) version=$version'); + SqfliteLocalMediaDbSchema.createLatestVersion(db); + + await db.execute(''' + CREATE TABLE folders ( + path TEXT PRIMARY KEY, + display_name TEXT, + file_count INTEGER, + total_size INTEGER, + thumb_entry_id INTEGER, + thumb_date INTEGER, + album_type INTEGER, + priority INTEGER, + is_remote INTEGER, + user TEXT, + device_id TEXT, + hidden INTEGER, + hybrid_type TEXT + ) + '''); + }, + onUpgrade: (db, oldVersion, newVersion) async { + await LocalMediaDbUpgrader.upgradeDb(db, oldVersion, newVersion); + + if (oldVersion < 17) { + await db.execute(''' + CREATE TABLE IF NOT EXISTS folders ( + path TEXT PRIMARY KEY, + display_name TEXT, + file_count INTEGER, + total_size INTEGER, + thumb_entry_id INTEGER, + thumb_date INTEGER, + album_type INTEGER, + priority INTEGER, + is_remote INTEGER, + user TEXT, + device_id TEXT, + hidden INTEGER, + hybrid_type TEXT + ) + '''); + } + }, +); + + debugPrint('[localMediaDb][init] openDatabase RETRY SUCCESS'); + } + + debugPrint('[localMediaDb][init] running PRAGMA user_version...'); + try { + await _db.rawQuery('PRAGMA user_version'); + debugPrint('[localMediaDb][init] PRAGMA OK'); + } catch (e) { + debugPrint('[localMediaDb][init] PRAGMA FAILED: $e'); + } + + debugPrint('[localMediaDb][init] ensureRemoteColumns...'); + try { + await _ensureRemoteColumns(_db); + debugPrint('[localMediaDb][init] ensureRemoteColumns OK'); + } catch (e) { + debugPrint('[localMediaDb][init] ensureRemoteColumns FAILED: $e'); + } + + debugPrint('[localMediaDb][init] computing lastId...'); + try { + final maxIdRows = await _db.rawQuery('SELECT MAX(id) AS maxId FROM $entryTable'); + _lastId = (maxIdRows.firstOrNull?['maxId'] as int?) ?? 0; + debugPrint('[localMediaDb][init] lastId=$_lastId'); + } catch (e) { + debugPrint('[localMediaDb][init] lastId FAILED: $e'); + } + + debugPrint('[localMediaDb][init] END'); +} + + + + + + + + @override + Future<int> dbFileSize() async { + final file = File(await path); + return await file.exists() ? await file.length() : 0; + } + + @override + Future<void> reset() async { + debugPrint('$runtimeType reset'); + await _db.close(); + await deleteDatabase(await path); + await init(); + } + + @override + Future<void> removeIds(Set<int> ids, {Set<EntryDataType>? dataTypes}) async { + if (ids.isEmpty) return; + + final _dataTypes = dataTypes ?? EntryDataType.values.toSet(); + + final batch = _db.batch(); + const where = 'id = ?'; + const coverWhere = 'entryId = ?'; + ids.forEach((id) { + final whereArgs = [id]; + if (_dataTypes.contains(EntryDataType.basic)) { + batch.delete(entryTable, where: where, whereArgs: whereArgs); + } + if (_dataTypes.contains(EntryDataType.catalog)) { + batch.delete(dateTakenTable, where: where, whereArgs: whereArgs); + batch.delete(metadataTable, where: where, whereArgs: whereArgs); + } + if (_dataTypes.contains(EntryDataType.address)) { + batch.delete(addressTable, where: where, whereArgs: whereArgs); + } + if (_dataTypes.contains(EntryDataType.references)) { + batch.delete(favouriteTable, where: where, whereArgs: whereArgs); + batch.delete(coverTable, where: coverWhere, whereArgs: whereArgs); + batch.delete(trashTable, where: where, whereArgs: whereArgs); + batch.delete(videoPlaybackTable, where: where, whereArgs: whereArgs); + } + }); + await batch.commit(noResult: true); + } + + // entries + + @override + Future<void> clearEntries() async { + final count = await _db.delete(entryTable, where: '1'); + debugPrint('$runtimeType clearEntries deleted $count rows'); + } + + @override + Future<Set<AvesEntry>> loadEntries({int? origin, String? directory}) async { + // Costruzione dinamica della WHERE + String? where; + final whereArgs = <Object?>[]; + + if (origin != null) { + where = 'origin = ?'; + whereArgs.add(origin); + } + + // 📌 Diagnostica: segna i parametri logici d’ingresso + debugPrint('[localMediaDb] loadEntries(origin=$origin, directory=$directory)'); + + final entries = <AvesEntry>{}; + + if (directory != null) { + final separator = pContext.separator; + if (!directory.endsWith(separator)) { + directory = '$directory$separator'; + } + + where = '${where != null ? '$where AND ' : ''}path LIKE ?'; + whereArgs.add('$directory%'); + + debugPrint('[localMediaDb] SQL(queryCursor, by directory) WHERE="$where" args=$whereArgs'); + + final cursor = await _db.queryCursor(entryTable, where: where, whereArgs: whereArgs, bufferSize: _queryCursorBufferSize); + final dirLength = directory.length; + var readRows = 0; + while (await cursor.moveNext()) { + final row = cursor.current; + readRows++; + // skip entries in subfolders + final path = row['path'] as String?; + if (path != null && !path.substring(dirLength).contains(separator)) { + entries.add(AvesEntry.fromMap(row)); + } + } + debugPrint('[localMediaDb] rows read=$readRows kept=${entries.length} (directory filter)'); + } else { + debugPrint('[localMediaDb] SQL(queryCursor) WHERE="${where ?? '—'}" args=$whereArgs'); + + final cursor = await _db.queryCursor(entryTable, where: where, whereArgs: whereArgs, bufferSize: _queryCursorBufferSize); + var readRows = 0; + while (await cursor.moveNext()) { + readRows++; + entries.add(AvesEntry.fromMap(cursor.current)); + } + debugPrint('[localMediaDb] rows read=$readRows kept=${entries.length}'); + + // 🔎 Fallback di sola diagnostica: se stiamo cercando remoti (origin==RemoteOrigin.value) + // ma non troviamo nulla, verifichiamo se in tabella ci sono righe origin=RemoteOrigin.value + if ((origin == RemoteOrigin.value) && entries.isEmpty) { + try { + final countRows = await _db.rawQuery( + 'SELECT COUNT(*) AS c FROM $entryTable WHERE origin=?', + [RemoteOrigin.value], + ); + final c = (countRows.firstOrNull?['c'] as int?) ?? 0; + debugPrint('[localMediaDb][diag] check COUNT(origin=${RemoteOrigin.value})=$c'); + if (c > 0) { + final sample = await _db.rawQuery( + 'SELECT id, remoteId, provider, uri, trashed, dateModifiedMillis ' + 'FROM $entryTable WHERE origin=? ORDER BY id DESC LIMIT 5', + [RemoteOrigin.value], + ); + debugPrint('[localMediaDb][diag] sample origin=${RemoteOrigin.value} = $sample'); + } + } catch (e, st) { + debugPrint('[localMediaDb][diag] fallback check failed: $e\n$st'); + } + } + } + + return entries; + } + + @override + Future<Set<AvesEntry>> loadEntriesById(Set<int> ids) => _getByIds(ids, entryTable, AvesEntry.fromMap); + + @override + Future<void> insertEntries(Set<AvesEntry> entries) async { + if (entries.isEmpty) return; + final stopwatch = Stopwatch()..start(); + int inserted = 0; + await Future.forEach(entries.slices(_entryInsertSliceMaxCount), (slice) async { + debugPrint('$runtimeType saveEntries inserting slice of [${inserted + 1}, ${inserted + slice.length}] entries'); + final batch = _db.batch(); + slice.forEach((entry) => _batchInsertEntry(batch, entry)); + await batch.commit(noResult: true); + inserted += slice.length; + }); + debugPrint('$runtimeType saveEntries complete in ${stopwatch.elapsed.inMilliseconds}ms for ${entries.length} entries'); + } + + @override + Future<void> updateEntry(int id, AvesEntry entry) async { + final batch = _db.batch(); + batch.delete(entryTable, where: 'id = ?', whereArgs: [id]); + _batchInsertEntry(batch, entry); + await batch.commit(noResult: true); + } + + void _batchInsertEntry(Batch batch, AvesEntry entry) { + batch.insert( + entryTable, + entry.toDatabaseMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + + @override + Future<Set<AvesEntry>> searchLiveEntries(String query, {int? limit}) async { + final rows = await _db.query( + entryTable, + where: '(title LIKE ? OR path LIKE ?) AND trashed = ?', + whereArgs: ['%$query%', '%$query%', 0], + orderBy: 'sourceDateTakenMillis DESC', + limit: limit, + ); + return rows.map(AvesEntry.fromMap).toSet(); + } + + @override + Future<Set<AvesEntry>> searchLiveDuplicates(int origin, Set<AvesEntry>? entries) async { + String where = 'origin = ? AND trashed = ?'; + if (entries != null) { + where += ' AND contentId IN (${entries.map((v) => v.contentId).join(',')})'; + } + final rows = await _db.rawQuery( + 'SELECT *, MAX(id) AS id' + ' FROM $entryTable' + ' WHERE $where' + ' GROUP BY contentId' + ' HAVING COUNT(id) > 1', + [origin, 0], + ); + final duplicates = rows.map(AvesEntry.fromMap).toSet(); + if (duplicates.isNotEmpty) { + debugPrint('$runtimeType found duplicates=$duplicates'); + } + return duplicates; + } + + // date taken + + @override + Future<void> clearDates() async { + final count = await _db.delete(dateTakenTable, where: '1'); + debugPrint('$runtimeType clearDates deleted $count rows'); + } + + @override + Future<Map<int?, int?>> loadDates() async { + debugPrint('[localMediaDb][loadDates] _db is null? ${_db == null}'); + debugPrint('[localMediaDb][loadDates] instance hashCode = ${this.hashCode}'); + final result = <int?, int?>{}; + final cursor = await _db.queryCursor(dateTakenTable, bufferSize: _queryCursorBufferSize); + while (await cursor.moveNext()) { + final row = cursor.current; + result[row['id'] as int] = row['dateMillis'] as int? ?? 0; + } + return result; + } + + // catalog metadata + + @override + Future<void> clearCatalogMetadata() async { + final count = await _db.delete(metadataTable, where: '1'); + debugPrint('$runtimeType clearMetadataEntries deleted $count rows'); + } + + @override + Future<Set<CatalogMetadata>> loadCatalogMetadata() async { + final result = <CatalogMetadata>{}; + final cursor = await _db.queryCursor(metadataTable, bufferSize: _queryCursorBufferSize); + while (await cursor.moveNext()) { + result.add(CatalogMetadata.fromMap(cursor.current)); + } + return result; + } + + @override + Future<Set<CatalogMetadata>> loadCatalogMetadataById(Set<int> ids) => _getByIds(ids, metadataTable, CatalogMetadata.fromMap); + + @override + Future<void> saveCatalogMetadata(Set<CatalogMetadata> metadataEntries) async { + if (metadataEntries.isEmpty) return; + final stopwatch = Stopwatch()..start(); + try { + final batch = _db.batch(); + metadataEntries.forEach((metadata) => _batchInsertMetadata(batch, metadata)); + await batch.commit(noResult: true); + debugPrint('$runtimeType saveMetadata complete in ${stopwatch.elapsed.inMilliseconds}ms for ${metadataEntries.length} entries'); + } catch (error, stack) { + debugPrint('$runtimeType failed to save metadata with error=$error\n$stack'); + } + } + + @override + Future<void> updateCatalogMetadata(int id, CatalogMetadata? metadata) async { + final batch = _db.batch(); + batch.delete(dateTakenTable, where: 'id = ?', whereArgs: [id]); + batch.delete(metadataTable, where: 'id = ?', whereArgs: [id]); + _batchInsertMetadata(batch, metadata); + await batch.commit(noResult: true); + } + + void _batchInsertMetadata(Batch batch, CatalogMetadata? metadata) { + if (metadata == null) return; + if (metadata.dateMillis != 0) { + batch.insert( + dateTakenTable, + { + 'id': metadata.id, + 'dateMillis': metadata.dateMillis, + }, + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + batch.insert( + metadataTable, + metadata.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + + // address + + @override + Future<void> clearAddresses() async { + final count = await _db.delete(addressTable, where: '1'); + debugPrint('$runtimeType clearAddresses deleted $count rows'); + } + + @override + Future<Set<AddressDetails>> loadAddresses() async { + final result = <AddressDetails>{}; + final cursor = await _db.queryCursor(addressTable, bufferSize: _queryCursorBufferSize); + while (await cursor.moveNext()) { + result.add(AddressDetails.fromMap(cursor.current)); + } + return result; + } + + @override + Future<Set<AddressDetails>> loadAddressesById(Set<int> ids) => _getByIds(ids, addressTable, AddressDetails.fromMap); + + @override + Future<void> saveAddresses(Set<AddressDetails> addresses) async { + if (addresses.isEmpty) return; + final stopwatch = Stopwatch()..start(); + final batch = _db.batch(); + addresses.forEach((address) => _batchInsertAddress(batch, address)); + await batch.commit(noResult: true); + debugPrint('$runtimeType saveAddresses complete in ${stopwatch.elapsed.inMilliseconds}ms for ${addresses.length} entries'); + } + + @override + Future<void> updateAddress(int id, AddressDetails? address) async { + final batch = _db.batch(); + batch.delete(addressTable, where: 'id = ?', whereArgs: [id]); + _batchInsertAddress(batch, address); + await batch.commit(noResult: true); + } + + void _batchInsertAddress(Batch batch, AddressDetails? address) { + if (address == null) return; + batch.insert( + addressTable, + address.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + + // vaults + + @override + Future<void> clearVaults() async { + final count = await _db.delete(vaultTable, where: '1'); + debugPrint('$runtimeType clearVaults deleted $count rows'); + } + + @override + Future<Set<VaultDetails>> loadAllVaults() async { + final result = <VaultDetails>{}; + final cursor = await _db.queryCursor(vaultTable, bufferSize: _queryCursorBufferSize); + while (await cursor.moveNext()) { + result.add(VaultDetails.fromMap(cursor.current)); + } + return result; + } + + @override + Future<void> addVaults(Set<VaultDetails> rows) async { + if (rows.isEmpty) return; + final batch = _db.batch(); + rows.forEach((row) => _batchInsertVault(batch, row)); + await batch.commit(noResult: true); + } + + @override + Future<void> updateVault(String oldName, VaultDetails row) async { + final batch = _db.batch(); + batch.delete(vaultTable, where: 'name = ?', whereArgs: [oldName]); + _batchInsertVault(batch, row); + await batch.commit(noResult: true); + } + + void _batchInsertVault(Batch batch, VaultDetails row) { + batch.insert( + vaultTable, + row.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + + @override + Future<void> removeVaults(Set<VaultDetails> rows) async { + if (rows.isEmpty) return; + + final batch = _db.batch(); + rows.map((v) => v.name).forEach((name) => batch.delete(vaultTable, where: 'name = ?', whereArgs: [name])); + await batch.commit(noResult: true); + } + + // trash + + @override + Future<void> clearTrashDetails() async { + final count = await _db.delete(trashTable, where: '1'); + debugPrint('$runtimeType clearTrashDetails deleted $count rows'); + } + + @override + Future<Set<TrashDetails>> loadAllTrashDetails() async { + final result = <TrashDetails>{}; + final cursor = await _db.queryCursor(trashTable, bufferSize: _queryCursorBufferSize); + while (await cursor.moveNext()) { + result.add(TrashDetails.fromMap(cursor.current)); + } + return result; + } + + @override + Future<void> updateTrash(int id, TrashDetails? details) async { + final batch = _db.batch(); + batch.delete(trashTable, where: 'id = ?', whereArgs: [id]); + _batchInsertTrashDetails(batch, details); + await batch.commit(noResult: true); + } + + void _batchInsertTrashDetails(Batch batch, TrashDetails? details) { + if (details == null) return; + batch.insert( + trashTable, + details.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + + // favourites + + @override + Future<void> clearFavourites() async { + final count = await _db.delete(favouriteTable, where: '1'); + debugPrint('$runtimeType clearFavourites deleted $count rows'); + } + + @override + Future<Set<FavouriteRow>> loadAllFavourites() async { + final result = <FavouriteRow>{}; + final cursor = await _db.queryCursor(favouriteTable, bufferSize: _queryCursorBufferSize); + while (await cursor.moveNext()) { + result.add(FavouriteRow.fromMap(cursor.current)); + } + return result; + } + + @override + Future<void> addFavourites(Set<FavouriteRow> rows) async { + if (rows.isEmpty) return; + final batch = _db.batch(); + rows.forEach((row) => _batchInsertFavourite(batch, row)); + await batch.commit(noResult: true); + } + + @override + Future<void> updateFavouriteId(int id, FavouriteRow row) async { + final batch = _db.batch(); + batch.delete(favouriteTable, where: 'id = ?', whereArgs: [id]); + _batchInsertFavourite(batch, row); + await batch.commit(noResult: true); + } + + void _batchInsertFavourite(Batch batch, FavouriteRow row) { + batch.insert( + favouriteTable, + row.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + + @override + Future<void> removeFavourites(Set<FavouriteRow> rows) async { + if (rows.isEmpty) return; + + final ids = rows.map((row) => row.entryId).whereType<int>().toSet(); + if (ids.isEmpty) return; + + final batch = _db.batch(); + for (final id in ids) { + batch.delete(favouriteTable, where: 'id = ?', whereArgs: [id]); + } + await batch.commit(noResult: true); + } + + // covers + + @override + Future<void> clearCovers() async { + final count = await _db.delete(coverTable, where: '1'); + debugPrint('$runtimeType clearCovers deleted $count rows'); + } + + @override + Future<Set<CoverRow>> loadAllCovers() async { + final result = <CoverRow>{}; + final cursor = await _db.queryCursor(coverTable, bufferSize: _queryCursorBufferSize); + while (await cursor.moveNext()) { + final rowMap = cursor.current; + final row = CoverRow.fromMap(rowMap); + if (row != null) { + result.add(row); + } else { + debugPrint('$runtimeType failed to deserialize cover from row=$rowMap'); + } + } + return result; + } + + @override + Future<void> addCovers(Set<CoverRow> rows) async { + if (rows.isEmpty) return; + + final batch = _db.batch(); + rows.forEach((row) => _batchInsertCover(batch, row)); + await batch.commit(noResult: true); + } + + @override + Future<void> updateCoverEntryId(int id, CoverRow row) async { + final batch = _db.batch(); + batch.delete(coverTable, where: 'entryId = ?', whereArgs: [id]); + _batchInsertCover(batch, row); + await batch.commit(noResult: true); + } + + void _batchInsertCover(Batch batch, CoverRow row) { + batch.insert( + coverTable, + row.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + + @override + Future<void> removeCovers(Set<CollectionFilter> filters) async { + if (filters.isEmpty) return; + + // for backward compatibility, remove stored JSON instead of removing de/reserialized filters + final obsoleteFilterJson = <String>{}; + + final rows = await _db.query(coverTable); + rows.forEach((row) { + final filterJson = row['filter'] as String?; + if (filterJson != null) { + final filter = CollectionFilter.fromJson(filterJson); + if (filters.any((v) => filter == v)) { + obsoleteFilterJson.add(filterJson); + } + } + }); + + final batch = _db.batch(); + obsoleteFilterJson.forEach((filterJson) => batch.delete(coverTable, where: 'filter = ?', whereArgs: [filterJson])); + await batch.commit(noResult: true); + } + + // dynamic albums +/* + @override + Future<int> clearDynamicAlbums() async { + final count = await _db.delete(dynamicAlbumTable, where: '1'); + debugPrint('$runtimeType clearDynamicAlbums deleted $count rows'); + return count; + } + + @override + Future<Set<DynamicAlbumRow>> loadAllDynamicAlbums({int bufferSize = _queryCursorBufferSize}) async { + final result = <DynamicAlbumRow>{}; + try { + final cursor = await _db.queryCursor(dynamicAlbumTable, bufferSize: bufferSize); + while (await cursor.moveNext()) { + final rowMap = cursor.current; + final row = DynamicAlbumRow.fromMap(rowMap); + if (row != null) { + result.add(row); + } else { + debugPrint('$runtimeType failed to deserialize dynamic album from row=$rowMap'); + } + } + } catch (error, stack) { + debugPrint('$runtimeType failed to query table=$dynamicAlbumTable error=$error\n$stack'); + if (bufferSize > 1) { + debugPrint('$runtimeType retry to query table=$dynamicAlbumTable with no cursor buffer'); + final safeRows = await loadAllDynamicAlbums(bufferSize: 1); + final clearedCount = await clearDynamicAlbums(); + await addDynamicAlbums(safeRows); + final addedCount = safeRows.length; + final lostCount = clearedCount - addedCount; + debugPrint('$runtimeType kept $addedCount rows, lost $lostCount rows from table=$dynamicAlbumTable'); + return safeRows; + } + } + return result; + } + + @override + Future<void> addDynamicAlbums(Set<DynamicAlbumRow> rows) async { + if (rows.isEmpty) return; + + final batch = _db.batch(); + rows.forEach((row) => _batchInsertDynamicAlbum(batch, row)); + await batch.commit(noResult: true); + } + + void _batchInsertDynamicAlbum(Batch batch, DynamicAlbumRow row) { + batch.insert( + dynamicAlbumTable, + row.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + + @override + Future<void> removeDynamicAlbums(Set<String> names) async { + if (names.isEmpty) return; + + final batch = _db.batch(); + names.forEach((name) => batch.delete(dynamicAlbumTable, where: 'name = ?', whereArgs: [name])); + await batch.commit(noResult: true); + } +*/ + // video playback + + @override + Future<void> clearVideoPlayback() async { + final count = await _db.delete(videoPlaybackTable, where: '1'); + debugPrint('$runtimeType clearVideoPlayback deleted $count rows'); + } + + @override + Future<Set<VideoPlaybackRow>> loadAllVideoPlayback() async { + final result = <VideoPlaybackRow>{}; + final cursor = await _db.queryCursor(videoPlaybackTable, bufferSize: _queryCursorBufferSize); + while (await cursor.moveNext()) { + final rowMap = cursor.current; + final row = VideoPlaybackRow.fromMap(rowMap); + if (row != null) { + result.add(row); + } else { + debugPrint('$runtimeType failed to deserialize video playback from row=$rowMap'); + } + } + return result; + } + + @override + Future<VideoPlaybackRow?> loadVideoPlayback(int id) async { + final rows = await _db.query(videoPlaybackTable, where: 'id = ?', whereArgs: [id]); + if (rows.isEmpty) return null; + + return VideoPlaybackRow.fromMap(rows.first); + } + + @override + Future<void> addVideoPlayback(Set<VideoPlaybackRow> rows) async { + if (rows.isEmpty) return; + + final batch = _db.batch(); + rows.forEach((row) => _batchInsertVideoPlayback(batch, row)); + await batch.commit(noResult: true); + } + + void _batchInsertVideoPlayback(Batch batch, VideoPlaybackRow row) { + batch.insert( + videoPlaybackTable, + row.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + + @override + Future<void> removeVideoPlayback(Set<int> ids) async { + if (ids.isEmpty) return; + + final batch = _db.batch(); + ids.forEach((id) => batch.delete(videoPlaybackTable, where: 'id = ?', whereArgs: [id])); + await batch.commit(noResult: true); + } + + // convenience methods + + Future<Set<T>> _getByIds<T>(Set<int> ids, String table, T Function(Map<String, Object?> row) mapRow) async { + final result = <T>{}; + if (ids.isNotEmpty) { + final cursor = await _db.queryCursor(table, where: 'id IN (${ids.join(',')})', bufferSize: _queryCursorBufferSize); + while (await cursor.moveNext()) { + result.add(mapRow(cursor.current)); + } + } + return result; + } + + // -------------------------------------------------------- + // MIGRAZIONE "GUARDIA" PER COLONNE REMOTE + // -------------------------------------------------------- + Future<void> _ensureRemoteColumns(Database db) async { + Future<Set<String>> _columnsOf(String table) async { + final rows = await db.rawQuery('PRAGMA table_info($table)'); + return rows.map((r) => (r['name'] as String).toLowerCase()).toSet(); + } + + final cols = await _columnsOf(entryTable); + + final alters = <String>[ + if (!cols.contains('origin')) "ALTER TABLE $entryTable ADD COLUMN origin INTEGER", + if (!cols.contains('trashed')) "ALTER TABLE $entryTable ADD COLUMN trashed INTEGER", + if (!cols.contains('provider')) "ALTER TABLE $entryTable ADD COLUMN provider TEXT", + if (!cols.contains('remoteid')) "ALTER TABLE $entryTable ADD COLUMN remoteId TEXT", + if (!cols.contains('remotepath')) "ALTER TABLE $entryTable ADD COLUMN remotePath TEXT", + if (!cols.contains('remotethumb1')) "ALTER TABLE $entryTable ADD COLUMN remoteThumb1 TEXT", + if (!cols.contains('remotethumb2')) "ALTER TABLE $entryTable ADD COLUMN remoteThumb2 TEXT", + if (!cols.contains('remotewidth')) "ALTER TABLE $entryTable ADD COLUMN remoteWidth INTEGER", + if (!cols.contains('remoteheight')) "ALTER TABLE $entryTable ADD COLUMN remoteHeight INTEGER", + if (!cols.contains('remoterotation')) "ALTER TABLE $entryTable ADD COLUMN remoteRotation INTEGER", + if (!cols.contains('latitude')) "ALTER TABLE $entryTable ADD COLUMN latitude REAL", + if (!cols.contains('longitude')) "ALTER TABLE $entryTable ADD COLUMN longitude REAL", + if (!cols.contains('altitude')) "ALTER TABLE $entryTable ADD COLUMN altitude REAL", + ]; + + for (final sql in alters) { + try { + await db.execute(sql); + } catch (_) { + // idempotenza: ignora duplicate column name ecc. + } + } + + // Indici utili ai remoti + try { await db.execute("CREATE INDEX IF NOT EXISTS entry_remote_idx ON $entryTable(origin, remoteId)"); } catch (_) {} + try { await db.execute("CREATE INDEX IF NOT EXISTS entry_origin_trashed_idx ON $entryTable(origin, trashed)"); } catch (_) {} + } +} diff --git a/lib/model/db/db_sqflite_schema.dart b/lib/model/db/db_sqflite_schema.dart new file mode 100644 index 0000000..b9c26cc --- /dev/null +++ b/lib/model/db/db_sqflite_schema.dart @@ -0,0 +1,196 @@ +import 'package:sqflite/sqflite.dart'; + +class SqfliteLocalMediaDbSchema { + static const entryTable = 'entry'; + static const dateTakenTable = 'dateTaken'; + static const metadataTable = 'metadata'; + static const addressTable = 'address'; + static const favouriteTable = 'favourites'; + static const coverTable = 'covers'; + static const dynamicAlbumTable = 'dynamicAlbums'; + static const vaultTable = 'vaults'; + static const trashTable = 'trash'; + static const videoPlaybackTable = 'videoPlayback'; + + // ⭐ NUOVA TABELLA + static const foldersTable = 'folders'; + + static const allTables = [ + entryTable, + dateTakenTable, + metadataTable, + addressTable, + favouriteTable, + coverTable, + dynamicAlbumTable, + vaultTable, + trashTable, + videoPlaybackTable, + foldersTable, // ⭐ AGGIUNTA QUI + ]; + + static Future<void> createLatestVersion(Database db) async { + await Future.forEach(allTables, (table) => createTable(db, table)); + } + + static Future<void> createTable(Database db, String table) async { + switch (table) { + case entryTable: + await db.execute( + 'CREATE TABLE $entryTable(' + 'id INTEGER PRIMARY KEY' + ', contentId INTEGER' + ', uri TEXT' + ', path TEXT' + ', sourceMimeType TEXT' + ', width INTEGER' + ', height INTEGER' + ', sourceRotationDegrees INTEGER' + ', sizeBytes INTEGER' + ', title TEXT' + ', dateAddedSecs INTEGER DEFAULT (strftime(\'%s\',\'now\'))' + ', dateModifiedMillis INTEGER' + ', sourceDateTakenMillis INTEGER' + ', durationMillis INTEGER' + ', trashed INTEGER DEFAULT 0' + ', origin INTEGER DEFAULT 0' + ', provider TEXT' + ', remoteId TEXT' + ', remotePath TEXT' + ', remoteThumb1 TEXT' + ', remoteThumb2 TEXT' + ')', + ); + await db.execute('CREATE INDEX IF NOT EXISTS idx_entry_origin ON $entryTable(origin);'); + await db.execute('CREATE INDEX IF NOT EXISTS idx_entry_remoteId ON $entryTable(remoteId);'); + return; + + case dateTakenTable: + await db.execute( + 'CREATE TABLE $dateTakenTable(' + 'id INTEGER PRIMARY KEY' + ', dateMillis INTEGER' + ')', + ); + return; + + case metadataTable: + await db.execute( + 'CREATE TABLE $metadataTable(' + 'id INTEGER PRIMARY KEY' + ', mimeType TEXT' + ', dateMillis INTEGER' + ', flags INTEGER' + ', rotationDegrees INTEGER' + ', xmpSubjects TEXT' + ', xmpTitle TEXT' + ', latitude REAL' + ', longitude REAL' + ', rating INTEGER' + ')', + ); + return; + + case addressTable: + await db.execute( + 'CREATE TABLE $addressTable(' + 'id INTEGER PRIMARY KEY' + ', addressLine TEXT' + ', countryCode TEXT' + ', countryName TEXT' + ', adminArea TEXT' + ', locality TEXT' + ')', + ); + return; + + case favouriteTable: + await db.execute( + 'CREATE TABLE $favouriteTable(' + 'id INTEGER PRIMARY KEY' + ')', + ); + return; + + case coverTable: + await db.execute( + 'CREATE TABLE $coverTable(' + 'filter TEXT PRIMARY KEY' + ', entryId INTEGER' + ', packageName TEXT' + ', color TEXT' + ')', + ); + return; + + case dynamicAlbumTable: + await db.execute( + 'CREATE TABLE $dynamicAlbumTable(' + 'name TEXT PRIMARY KEY' + ', filter TEXT' + ')', + ); + return; + + case vaultTable: + await db.execute( + 'CREATE TABLE $vaultTable(' + 'name TEXT PRIMARY KEY' + ', autoLock INTEGER' + ', useBin INTEGER' + ', lockType TEXT' + ')', + ); + return; + + case trashTable: + await db.execute( + 'CREATE TABLE $trashTable(' + 'id INTEGER PRIMARY KEY' + ', path TEXT' + ', dateMillis INTEGER' + ')', + ); + return; + + case videoPlaybackTable: + await db.execute( + 'CREATE TABLE $videoPlaybackTable(' + 'id INTEGER PRIMARY KEY' + ', resumeTimeMillis INTEGER' + ')', + ); + return; + + // ⭐ NUOVA TABELLA FOLDERS +case foldersTable: + await db.execute( + 'CREATE TABLE $foldersTable(' + 'id INTEGER PRIMARY KEY AUTOINCREMENT,' + 'path TEXT NOT NULL,' + 'user TEXT,' + 'device_id TEXT,' + 'is_remote INTEGER NOT NULL DEFAULT 0,' + 'hybrid_type INTEGER NOT NULL DEFAULT 0,' + 'album_type INTEGER NOT NULL DEFAULT 0,' + 'priority INTEGER NOT NULL DEFAULT 0,' + 'display_name TEXT,' + 'file_count INTEGER NOT NULL DEFAULT 0,' + 'thumb_entry_id INTEGER,' + 'total_size INTEGER NOT NULL DEFAULT 0,' + 'thumb_date INTEGER,' + 'hidden INTEGER NOT NULL DEFAULT 0' + ')', + ); + + await db.execute('CREATE INDEX IF NOT EXISTS idx_folders_path ON $foldersTable(path)'); + await db.execute('CREATE INDEX IF NOT EXISTS idx_folders_is_remote ON $foldersTable(is_remote)'); + await db.execute('CREATE INDEX IF NOT EXISTS idx_folders_priority ON $foldersTable(priority)'); + await db.execute('CREATE INDEX IF NOT EXISTS idx_folders_hybrid ON $foldersTable(hybrid_type)'); + return; + + default: + throw Exception('unknown table=$table'); + } + } +} diff --git a/lib/model/db/db_sqflite_upgrade.dart b/lib/model/db/db_sqflite_upgrade.dart new file mode 100644 index 0000000..eb276b5 --- /dev/null +++ b/lib/model/db/db_sqflite_upgrade.dart @@ -0,0 +1,623 @@ +// lib/model/db/db_sqflite_upgrade.dart +import 'dart:ui'; + +import 'package:aves/model/covers.dart'; +import 'package:aves/model/db/db_extension.dart'; +import 'package:aves/model/db/db_sqflite_schema.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:flutter/foundation.dart'; +import 'package:sqflite/sqflite.dart'; + +class LocalMediaDbUpgrader { + static const entryTable = SqfliteLocalMediaDbSchema.entryTable; + static const dateTakenTable = SqfliteLocalMediaDbSchema.dateTakenTable; + static const metadataTable = SqfliteLocalMediaDbSchema.metadataTable; + static const addressTable = SqfliteLocalMediaDbSchema.addressTable; + static const favouriteTable = SqfliteLocalMediaDbSchema.favouriteTable; + static const coverTable = SqfliteLocalMediaDbSchema.coverTable; + static const dynamicAlbumTable = SqfliteLocalMediaDbSchema.dynamicAlbumTable; + static const vaultTable = SqfliteLocalMediaDbSchema.vaultTable; + static const trashTable = SqfliteLocalMediaDbSchema.trashTable; + static const videoPlaybackTable = SqfliteLocalMediaDbSchema.videoPlaybackTable; + + // warning: "ALTER TABLE ... RENAME COLUMN ..." is not supported + // on SQLite <3.25.0, bundled on older Android devices + static Future<void> upgradeDb(Database db, int oldVersion, int newVersion) async { + debugPrint('DB will be upgraded from v$oldVersion to v$newVersion'); + while (oldVersion < newVersion) { + switch (oldVersion) { + case 1: + await _upgradeFrom1(db); + case 2: + await _upgradeFrom2(db); + case 3: + await _upgradeFrom3(db); + case 4: + await _upgradeFrom4(db); + case 5: + await _upgradeFrom5(db); + case 6: + await _upgradeFrom6(db); + case 7: + await _upgradeFrom7(db); + case 8: + await _upgradeFrom8(db); + case 9: + await _upgradeFrom9(db); + case 10: + await _upgradeFrom10(db); + case 11: + await _upgradeFrom11(db); + case 12: + await _upgradeFrom12(db); + case 13: + await _upgradeFrom13(db); + case 14: + await _upgradeFrom14(db); + // NEW: add remote-source columns & indexes + case 15: + await _upgradeFrom15(db); + case 16: + await _upgradeFrom16(db); + } + oldVersion++; + } + await _sanitize(db); + } + + static Future<void> _sanitize(Database db) async { + // ensure all tables exist + await Future.forEach(SqfliteLocalMediaDbSchema.allTables, (table) async { + if (!(await db.tableExists(table))) { + await SqfliteLocalMediaDbSchema.createTable(db, table); + } + }); + + // remove rows referencing future entry IDs + final maxIdRows = await db.rawQuery('SELECT MAX(id) AS maxId FROM $entryTable'); + final lastId = (maxIdRows.firstOrNull?['maxId'] as int?) ?? 0; + await db.delete(favouriteTable, where: 'id > ?', whereArgs: [lastId]); + await db.delete(coverTable, where: 'entryId > ?', whereArgs: [lastId]); + } + + static Future<void> _upgradeFrom1(Database db) async { + debugPrint('upgrading DB from v1'); + + // rename column 'orientationDegrees' to 'sourceRotationDegrees' + const newEntryTable = '${entryTable}TEMP'; + await db.execute( + 'CREATE TABLE $newEntryTable (' + 'contentId INTEGER PRIMARY KEY' + ', uri TEXT' + ', path TEXT' + ', sourceMimeType TEXT' + ', width INTEGER' + ', height INTEGER' + ', sourceRotationDegrees INTEGER' + ', sizeBytes INTEGER' + ', title TEXT' + ', dateModifiedSecs INTEGER' + ', sourceDateTakenMillis INTEGER' + ', durationMillis INTEGER' + ')', + ); + await db.rawInsert( + 'INSERT INTO $newEntryTable (contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateModifiedSecs,sourceDateTakenMillis,durationMillis)' + ' SELECT contentId,uri,path,sourceMimeType,width,height,orientationDegrees,sizeBytes,title,dateModifiedSecs,sourceDateTakenMillis,durationMillis' + ' FROM $entryTable;', + ); + await db.execute('DROP TABLE $entryTable;'); + await db.execute('ALTER TABLE $newEntryTable RENAME TO $entryTable;'); + + // rename column 'videoRotation' to 'rotationDegrees' + const newMetadataTable = '${metadataTable}TEMP'; + await db.execute( + 'CREATE TABLE $newMetadataTable (' + 'contentId INTEGER PRIMARY KEY' + ', mimeType TEXT' + ', dateMillis INTEGER' + ', isAnimated INTEGER' + ', rotationDegrees INTEGER' + ', xmpSubjects TEXT' + ', xmpTitleDescription TEXT' + ', latitude REAL' + ', longitude REAL' + ')', + ); + await db.rawInsert( + 'INSERT INTO $newMetadataTable (contentId,mimeType,dateMillis,isAnimated,rotationDegrees,xmpSubjects,xmpTitleDescription,latitude,longitude)' + ' SELECT contentId,mimeType,dateMillis,isAnimated,videoRotation,xmpSubjects,xmpTitleDescription,latitude,longitude' + ' FROM $metadataTable;', + ); + await db.rawInsert('UPDATE $newMetadataTable SET rotationDegrees = NULL WHERE rotationDegrees = 0;'); + await db.execute('DROP TABLE $metadataTable;'); + await db.execute('ALTER TABLE $newMetadataTable RENAME TO $metadataTable;'); + + // new column 'isFlipped' + await db.execute('ALTER TABLE $metadataTable ADD COLUMN isFlipped INTEGER;'); + } + + static Future<void> _upgradeFrom2(Database db) async { + debugPrint('upgrading DB from v2'); + + // merge columns 'isAnimated' and 'isFlipped' into 'flags' + const newMetadataTable = '${metadataTable}TEMP'; + await db.execute( + 'CREATE TABLE $newMetadataTable (' + 'contentId INTEGER PRIMARY KEY' + ', mimeType TEXT' + ', dateMillis INTEGER' + ', flags INTEGER' + ', rotationDegrees INTEGER' + ', xmpSubjects TEXT' + ', xmpTitleDescription TEXT' + ', latitude REAL' + ', longitude REAL' + ')', + ); + await db.rawInsert( + 'INSERT INTO $newMetadataTable (contentId,mimeType,dateMillis,flags,rotationDegrees,xmpSubjects,xmpTitleDescription,latitude,longitude)' + ' SELECT contentId,mimeType,dateMillis,ifnull(isAnimated,0)+ifnull(isFlipped,0)*2,rotationDegrees,xmpSubjects,xmpTitleDescription,latitude,longitude' + ' FROM $metadataTable;', + ); + await db.execute('DROP TABLE $metadataTable;'); + await db.execute('ALTER TABLE $newMetadataTable RENAME TO $metadataTable;'); + } + + static Future<void> _upgradeFrom3(Database db) async { + debugPrint('upgrading DB from v3'); + await db.execute( + 'CREATE TABLE $coverTable (' + 'filter TEXT PRIMARY KEY' + ', contentId INTEGER' + ')', + ); + } + + static Future<void> _upgradeFrom4(Database db) async { + debugPrint('upgrading DB from v4'); + await db.execute( + 'CREATE TABLE $videoPlaybackTable (' + 'contentId INTEGER PRIMARY KEY' + ', resumeTimeMillis INTEGER' + ')', + ); + } + + static Future<void> _upgradeFrom5(Database db) async { + debugPrint('upgrading DB from v5'); + await db.execute('ALTER TABLE $metadataTable ADD COLUMN rating INTEGER;'); + } + + static Future<void> _upgradeFrom6(Database db) async { + debugPrint('upgrading DB from v6'); + // new primary key column `id` instead of `contentId` + // new column `trashed` + await db.transaction((txn) async { + const newEntryTable = '${entryTable}TEMP'; + await db.execute( + 'CREATE TABLE $newEntryTable (' + 'id INTEGER PRIMARY KEY' + ', contentId INTEGER' + ', uri TEXT' + ', path TEXT' + ', sourceMimeType TEXT' + ', width INTEGER' + ', height INTEGER' + ', sourceRotationDegrees INTEGER' + ', sizeBytes INTEGER' + ', title TEXT' + ', dateModifiedSecs INTEGER' + ', sourceDateTakenMillis INTEGER' + ', durationMillis INTEGER' + ', trashed INTEGER DEFAULT 0' + ')', + ); + await db.rawInsert( + 'INSERT INTO $newEntryTable (id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateModifiedSecs,sourceDateTakenMillis,durationMillis)' + ' SELECT contentId,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateModifiedSecs,sourceDateTakenMillis,durationMillis' + ' FROM $entryTable;', + ); + await db.execute('DROP TABLE $entryTable;'); + await db.execute('ALTER TABLE $newEntryTable RENAME TO $entryTable;'); + }); + + // rename column `contentId` to `id` + await db.transaction((txn) async { + const newDateTakenTable = '${dateTakenTable}TEMP'; + await db.execute( + 'CREATE TABLE $newDateTakenTable (' + 'id INTEGER PRIMARY KEY' + ', dateMillis INTEGER' + ')', + ); + await db.rawInsert( + 'INSERT INTO $newDateTakenTable (id,dateMillis)' + ' SELECT contentId,dateMillis' + ' FROM $dateTakenTable;', + ); + await db.execute('DROP TABLE $dateTakenTable;'); + await db.execute('ALTER TABLE $newDateTakenTable RENAME TO $dateTakenTable;'); + }); + + // rename column `contentId` to `id` + await db.transaction((txn) async { + const newMetadataTable = '${metadataTable}TEMP'; + await db.execute( + 'CREATE TABLE $newMetadataTable (' + 'id INTEGER PRIMARY KEY' + ', mimeType TEXT' + ', dateMillis INTEGER' + ', flags INTEGER' + ', rotationDegrees INTEGER' + ', xmpSubjects TEXT' + ', xmpTitle TEXT' + ', latitude REAL' + ', longitude REAL' + ', rating INTEGER' + ')', + ); + await db.rawInsert( + 'INSERT INTO $newMetadataTable (id,mimeType,dateMillis,flags,rotationDegrees,xmpSubjects,xmpTitle,latitude,longitude,rating)' + ' SELECT contentId,mimeType,dateMillis,flags,rotationDegrees,xmpSubjects,xmpTitle,latitude,longitude,rating' + ' FROM $metadataTable;', + ); + await db.execute('DROP TABLE $metadataTable;'); + await db.execute('ALTER TABLE $newMetadataTable RENAME TO $metadataTable;'); + }); + + // rename column `contentId` to `id` + await db.transaction((txn) async { + const newAddressTable = '${addressTable}TEMP'; + await db.execute( + 'CREATE TABLE $newAddressTable (' + 'id INTEGER PRIMARY KEY' + ', addressLine TEXT' + ', countryCode TEXT' + ', countryName TEXT' + ', adminArea TEXT' + ', locality TEXT' + ')', + ); + await db.rawInsert( + 'INSERT INTO $newAddressTable (id,addressLine,countryCode,countryName,adminArea,locality)' + ' SELECT contentId,addressLine,countryCode,countryName,adminArea,locality' + ' FROM $addressTable;', + ); + await db.execute('DROP TABLE $addressTable;'); + await db.execute('ALTER TABLE $newAddressTable RENAME TO $addressTable;'); + }); + + // rename column `contentId` to `id` + await db.transaction((txn) async { + const newVideoPlaybackTable = '${videoPlaybackTable}TEMP'; + await db.execute( + 'CREATE TABLE $newVideoPlaybackTable (' + 'id INTEGER PRIMARY KEY' + ', resumeTimeMillis INTEGER' + ')', + ); + await db.rawInsert( + 'INSERT INTO $newVideoPlaybackTable (id,resumeTimeMillis)' + ' SELECT contentId,resumeTimeMillis' + ' FROM $videoPlaybackTable;', + ); + await db.execute('DROP TABLE $videoPlaybackTable;'); + await db.execute('ALTER TABLE $newVideoPlaybackTable RENAME TO $videoPlaybackTable;'); + }); + + // rename column `contentId` to `entryId` + await db.transaction((txn) async { + const newCoverTable = '${coverTable}TEMP'; + await db.execute( + 'CREATE TABLE $newCoverTable (' + 'filter TEXT PRIMARY KEY' + ', entryId INTEGER' + ')', + ); + await db.rawInsert( + 'INSERT INTO $newCoverTable (filter,entryId)' + ' SELECT filter,contentId' + ' FROM $coverTable;', + ); + await db.execute('DROP TABLE $coverTable;'); + await db.execute('ALTER TABLE $newCoverTable RENAME TO $coverTable;'); + }); + + // new table + await db.execute( + 'CREATE TABLE $trashTable (' + 'id INTEGER PRIMARY KEY' + ', path TEXT' + ', dateMillis INTEGER' + ')', + ); + } + + static Future<void> _upgradeFrom7(Database db) async { + debugPrint('upgrading DB from v7'); + await db.execute('ALTER TABLE $coverTable ADD COLUMN packageName TEXT;'); + await db.execute('ALTER TABLE $coverTable ADD COLUMN color INTEGER;'); + } + + static Future<void> _upgradeFrom8(Database db) async { + debugPrint('upgrading DB from v8'); + + // new column `dateAddedSecs` + await db.transaction((txn) async { + const newEntryTable = '${entryTable}TEMP'; + await db.execute( + 'CREATE TABLE $newEntryTable (' + 'id INTEGER PRIMARY KEY' + ', contentId INTEGER' + ', uri TEXT' + ', path TEXT' + ', sourceMimeType TEXT' + ', width INTEGER' + ', height INTEGER' + ', sourceRotationDegrees INTEGER' + ', sizeBytes INTEGER' + ', title TEXT' + ', dateAddedSecs INTEGER DEFAULT (strftime(\'%s\',\'now\'))' + ', dateModifiedSecs INTEGER' + ', sourceDateTakenMillis INTEGER' + ', durationMillis INTEGER' + ', trashed INTEGER DEFAULT 0' + ')', + ); + await db.rawInsert( + 'INSERT INTO $newEntryTable (id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateModifiedSecs,sourceDateTakenMillis,durationMillis,trashed)' + ' SELECT id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateModifiedSecs,sourceDateTakenMillis,durationMillis,trashed' + ' FROM $entryTable;', + ); + await db.execute('DROP TABLE $entryTable;'); + await db.execute('ALTER TABLE $newEntryTable RENAME TO $entryTable;'); + }); + + // rename column `xmpTitleDescription` to `xmpTitle` + await db.transaction((txn) async { + const newMetadataTable = '${metadataTable}TEMP'; + await db.execute( + 'CREATE TABLE $newMetadataTable (' + 'id INTEGER PRIMARY KEY' + ', mimeType TEXT' + ', dateMillis INTEGER' + ', flags INTEGER' + ', rotationDegrees INTEGER' + ', xmpSubjects TEXT' + ', xmpTitle TEXT' + ', latitude REAL' + ', longitude REAL' + ', rating INTEGER' + ')', + ); + await db.rawInsert( + 'INSERT INTO $newMetadataTable (id,mimeType,dateMillis,flags,rotationDegrees,xmpSubjects,xmpTitle,latitude,longitude,rating)' + ' SELECT id,mimeType,dateMillis,flags,rotationDegrees,xmpSubjects,xmpTitleDescription,latitude,longitude,rating' + ' FROM $metadataTable;', + ); + await db.execute('DROP TABLE $metadataTable;'); + await db.execute('ALTER TABLE $newMetadataTable RENAME TO $metadataTable;'); + }); + } + + static Future<void> _upgradeFrom9(Database db) async { + debugPrint('upgrading DB from v9'); + + // clean duplicates introduced before Aves v1.7.1 + final duplicatedContentIdRows = await db.query(entryTable, columns: ['contentId'], groupBy: 'contentId', having: 'COUNT(id) > 1 AND contentId IS NOT NULL'); + final duplicatedContentIds = duplicatedContentIdRows.map((row) => row['contentId'] as int?).nonNulls.toSet(); + final duplicateIds = <int>{}; + await Future.forEach(duplicatedContentIds, (contentId) async { + final rows = await db.query(entryTable, columns: ['id'], where: 'contentId = ?', whereArgs: [contentId]); + final ids = rows.map((row) => row['id'] as int?).nonNulls.toList()..sort(); + if (ids.length > 1) { + ids.removeAt(0); + duplicateIds.addAll(ids); + } + }); + final batch = db.batch(); + const where = 'id = ?'; + const coverWhere = 'entryId = ?'; + duplicateIds.forEach((id) { + final whereArgs = [id]; + batch.delete(entryTable, where: where, whereArgs: whereArgs); + batch.delete(dateTakenTable, where: where, whereArgs: whereArgs); + batch.delete(metadataTable, where: where, whereArgs: whereArgs); + batch.delete(addressTable, where: where, whereArgs: whereArgs); + batch.delete(favouriteTable, where: where, whereArgs: whereArgs); + batch.delete(coverTable, where: coverWhere, whereArgs: whereArgs); + batch.delete(trashTable, where: where, whereArgs: whereArgs); + batch.delete(videoPlaybackTable, where: where, whereArgs: whereArgs); + }); + await batch.commit(noResult: true); + } + + static Future<void> _upgradeFrom10(Database db) async { + debugPrint('upgrading DB from v10'); + + await db.execute('ALTER TABLE $entryTable ADD COLUMN origin INTEGER DEFAULT 0;'); + + await db.execute( + 'CREATE TABLE $vaultTable (' + 'name TEXT PRIMARY KEY' + ', autoLock INTEGER' + ', useBin INTEGER' + ', lockType TEXT' + ')', + ); + } + + static Future<void> _upgradeFrom11(Database db) async { + debugPrint('upgrading DB from v11'); + + await db.execute( + 'CREATE TABLE $dynamicAlbumTable (' + 'name TEXT PRIMARY KEY' + ', filter TEXT' + ')', + ); + } + + static Future<void> _upgradeFrom12(Database db) async { + debugPrint('upgrading DB from v12'); + + // retrieve covers stored with `int` color value + final rows = <CoverRow>{}; + final cursor = await db.queryCursor(coverTable); + while (await cursor.moveNext()) { + final Map map = cursor.current; + final filter = CollectionFilter.fromJson(map['filter']); + if (filter != null) { + final colorValue = map['color'] as int?; + final color = colorValue != null ? Color(colorValue) : null; + final row = CoverRow( + filter: filter, + entryId: map['entryId'] as int?, + packageName: map['packageName'] as String?, + color: color, + ); + rows.add(row); + } + } + + // convert `color` column type from value number to JSON string + const newCoverTable = '${coverTable}TEMP'; + await db.execute( + 'CREATE TABLE $newCoverTable (' + 'filter TEXT PRIMARY KEY' + ', entryId INTEGER' + ', packageName TEXT' + ', color TEXT' + ')', + ); + + // insert covers with `string` color value + if (rows.isNotEmpty) { + final batch = db.batch(); + rows.forEach((row) { + batch.insert( + newCoverTable, + row.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + }); + await batch.commit(noResult: true); + } + + await db.execute('DROP TABLE $coverTable;'); + await db.execute('ALTER TABLE $newCoverTable RENAME TO $coverTable;'); + } + + static Future<void> _upgradeFrom13(Database db) async { + debugPrint('upgrading DB from v13'); + + if (await db.tableExists(entryTable)) { + // rename column 'dateModifiedSecs' to 'dateModifiedMillis' + const newEntryTable = '${entryTable}TEMP'; + await db.execute( + 'CREATE TABLE $newEntryTable (' + 'id INTEGER PRIMARY KEY' + ', contentId INTEGER' + ', uri TEXT' + ', path TEXT' + ', sourceMimeType TEXT' + ', width INTEGER' + ', height INTEGER' + ', sourceRotationDegrees INTEGER' + ', sizeBytes INTEGER' + ', title TEXT' + ', dateAddedSecs INTEGER DEFAULT (strftime(\'%s\',\'now\'))' + ', dateModifiedMillis INTEGER' + ', sourceDateTakenMillis INTEGER' + ', durationMillis INTEGER' + ', trashed INTEGER DEFAULT 0' + ', origin INTEGER DEFAULT 0' + ')', + ); + await db.rawInsert( + 'INSERT INTO $newEntryTable (id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedMillis,sourceDateTakenMillis,durationMillis,trashed,origin)' + ' SELECT id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateAddedSecs,dateModifiedSecs*1000,sourceDateTakenMillis,durationMillis,trashed,origin' + ' FROM $entryTable;', + ); + await db.execute('DROP TABLE $entryTable;'); + await db.execute('ALTER TABLE $newEntryTable RENAME TO $entryTable;'); + } + } + + static Future<void> _upgradeFrom14(Database db) async { + debugPrint('upgrading DB from v14'); + + // transitional upgrade previously used to sanitize rebuildable tables + // (dateTakenTable, metadataTable, addressTable, trashTable, videoPlaybackTable) + // for users with a potentially corrupted DB following upgrade to v1.12.4 + } + + // ============================================================ + // NEW: v15 - supporto sorgente remota (campi provider/remote*) + // ============================================================ + +static Future<void> _upgradeFrom15(Database db) async { + debugPrint('upgrading DB from v15 (remote source columns)'); + + // Controlla se una colonna esiste usando PRAGMA table_info + Future<bool> _hasColumn(String table, String column) async { + final rows = await db.rawQuery('PRAGMA table_info($table)'); + for (final row in rows) { + final name = row['name'] as String?; + if (name == column) return true; + } + return false; + } + + // Aggiunge la colonna solo se mancante + Future<void> _addColumnIfMissing(String table, String col, String type) async { + if (!await _hasColumn(table, col)) { + await db.execute('ALTER TABLE $table ADD COLUMN $col $type'); + } + } + + // --- entry: campi per la sorgente remota --- + await _addColumnIfMissing(entryTable, 'provider', 'TEXT'); + await _addColumnIfMissing(entryTable, 'remoteId', 'TEXT'); + await _addColumnIfMissing(entryTable, 'remotePath', 'TEXT'); + await _addColumnIfMissing(entryTable, 'remoteThumb1', 'TEXT'); + await _addColumnIfMissing(entryTable, 'remoteThumb2', 'TEXT'); + + // Indici utili (idempotenti) + await db.execute('CREATE INDEX IF NOT EXISTS idx_entry_origin ON $entryTable(origin);'); + await db.execute('CREATE INDEX IF NOT EXISTS idx_entry_remoteId ON $entryTable(remoteId);'); + + // ⭐⭐⭐ CREA LA TABELLA FOLDERS SE NON ESISTE ⭐⭐⭐ + if (!(await db.tableExists('folders'))) { + await db.execute(''' +CREATE TABLE folders ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + path TEXT NOT NULL, + user TEXT, + device_id TEXT, + is_remote INTEGER NOT NULL DEFAULT 0, + hybrid_type INTEGER NOT NULL DEFAULT 0, + album_type INTEGER NOT NULL DEFAULT 0, + priority INTEGER NOT NULL DEFAULT 0, + display_name TEXT +) +'''); + + await db.execute('CREATE INDEX IF NOT EXISTS idx_folders_path ON folders(path);'); + await db.execute('CREATE INDEX IF NOT EXISTS idx_folders_is_remote ON folders(is_remote);'); + await db.execute('CREATE INDEX IF NOT EXISTS idx_folders_priority ON folders(priority);'); + await db.execute('CREATE INDEX IF NOT EXISTS idx_folders_hybrid ON folders(hybrid_type);'); + } +} + +static Future<void> _upgradeFrom16(Database db) async { + // aggiunge le colonne mancanti nella tabella folders + await db.execute('ALTER TABLE folders ADD COLUMN file_count INTEGER NOT NULL DEFAULT 0'); + await db.execute('ALTER TABLE folders ADD COLUMN total_size INTEGER NOT NULL DEFAULT 0'); + await db.execute('ALTER TABLE folders ADD COLUMN thumb_entry_id INTEGER'); + await db.execute('ALTER TABLE folders ADD COLUMN thumb_date INTEGER'); + await db.execute('ALTER TABLE folders ADD COLUMN hidden INTEGER NOT NULL DEFAULT 0'); +} + +} diff --git a/lib/model/db/folder_stats.dart b/lib/model/db/folder_stats.dart new file mode 100644 index 0000000..8b9ff12 --- /dev/null +++ b/lib/model/db/folder_stats.dart @@ -0,0 +1,54 @@ +class FolderStats { + // percorso della cartella (PRIMARY KEY) + final String path; + + // nome visualizzato (può essere diverso dal nome della cartella) + String displayName; + + // numero di file nella cartella + int fileCount; + + // dimensione totale in byte + int totalSize; + + // id dell’entry usata come cover + int? thumbEntryId; + + // timestamp dell’entry usata come cover + int? thumbDate; + + // tipo album (0 = normale, 1 = camera, 2 = screenshot, ecc.) + int albumType; + + // priorità per i pinned (0 = normale) + int priority; + + // 0 = locale, 1 = remoto + int isRemote; + + // per album remoti + String? user; + String? deviceId; + + // album nascosto (0 = visibile, 1 = nascosto) + int hidden; + + // tipo ibrido (es. "camera", "screenshots", ecc.) + String? hybridType; + + FolderStats({ + required this.path, + required this.displayName, + this.fileCount = 0, + this.totalSize = 0, + this.thumbEntryId, + this.thumbDate, + this.albumType = 0, + this.priority = 0, + this.isRemote = 0, + this.user, + this.deviceId, + this.hidden = 0, + this.hybridType, + }); +} diff --git a/lib/model/device.dart b/lib/model/device.dart new file mode 100644 index 0000000..de324a7 --- /dev/null +++ b/lib/model/device.dart @@ -0,0 +1,68 @@ +import 'package:aves/services/common/services.dart'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:local_auth/local_auth.dart'; +import 'package:package_info_plus/package_info_plus.dart'; + +final Device device = Device._private(); + +class Device { + late final String _packageName, _packageVersion, _userAgent; + late final bool _canAuthenticateUser, _canPinShortcut, _showPinShortcutFeedback; + late final bool _canRenderSubdivisionFlagEmojis, _canRequestManageMedia; + late final bool _hasGeocoder, _isDynamicColorAvailable, _supportEdgeToEdgeUIMode, _supportPictureInPicture; + late final bool _isPhysicalDevice, _isTelevision; + + String get packageName => _packageName; + + String get packageVersion => _packageVersion; + + String get userAgent => _userAgent; + + bool get canAuthenticateUser => _canAuthenticateUser; + + bool get canPinShortcut => _canPinShortcut; + + bool get canRenderSubdivisionFlagEmojis => _canRenderSubdivisionFlagEmojis; + + bool get canRequestManageMedia => _canRequestManageMedia; + + bool get hasGeocoder => _hasGeocoder; + + bool get isDynamicColorAvailable => _isDynamicColorAvailable; + + bool get isPhysicalDevice => _isPhysicalDevice; + + bool get isTelevision => _isTelevision; + + bool get showPinShortcutFeedback => _showPinShortcutFeedback; + + bool get supportEdgeToEdgeUIMode => _supportEdgeToEdgeUIMode; + + bool get supportPictureInPicture => _supportPictureInPicture; + + Device._private(); + + Future<void> init() async { + final packageInfo = await PackageInfo.fromPlatform(); + _packageName = packageInfo.packageName; + _packageVersion = packageInfo.version; + _userAgent = '$_packageName/$_packageVersion'; + + final androidInfo = await DeviceInfoPlugin().androidInfo; + _isPhysicalDevice = androidInfo.isPhysicalDevice; + _isTelevision = androidInfo.systemFeatures.contains('android.software.leanback'); + + final auth = LocalAuthentication(); + _canAuthenticateUser = await auth.canCheckBiometrics || await auth.isDeviceSupported(); + + final capabilities = await deviceService.getCapabilities(); + _canPinShortcut = capabilities['canPinShortcut'] ?? false; + _canRenderSubdivisionFlagEmojis = capabilities['canRenderSubdivisionFlagEmojis'] ?? false; + _canRequestManageMedia = capabilities['canRequestManageMedia'] ?? false; + _hasGeocoder = capabilities['hasGeocoder'] ?? false; + _isDynamicColorAvailable = capabilities['isDynamicColorAvailable'] ?? false; + _showPinShortcutFeedback = capabilities['showPinShortcutFeedback'] ?? false; + _supportEdgeToEdgeUIMode = capabilities['supportEdgeToEdgeUIMode'] ?? false; + _supportPictureInPicture = capabilities['supportPictureInPicture'] ?? false; + } +} diff --git a/lib/model/dynamic_albums.dart b/lib/model/dynamic_albums.dart new file mode 100644 index 0000000..6671e06 --- /dev/null +++ b/lib/model/dynamic_albums.dart @@ -0,0 +1,44 @@ +import 'dart:async'; +import 'package:flutter/foundation.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; + +/// Fake Dynamic Albums implementation. +/// Does nothing, stores nothing, emits nothing. +/// Only exists to satisfy imports across the project. + +class DynamicAlbumChangedEvent { + final Map<DynamicAlbumFilter, DynamicAlbumFilter?> changes; + DynamicAlbumChangedEvent(this.changes); +} + +class _FakeEventBus { + Stream<T> on<T>() => const Stream.empty(); +} + +class FakeDynamicAlbums extends ChangeNotifier { + final _FakeEventBus eventBus = _FakeEventBus(); + + // Aves expects a Set<DynamicAlbumFilter> + Set<DynamicAlbumFilter> get all => const {}; + int get count => 0; + + Future<void> init() async {} + Future<void> clear() async {} + + Future<void> add(DynamicAlbumFilter filter) async {} + Future<void> remove(Set<DynamicAlbumFilter> filters) async {} + Future<void> rename(DynamicAlbumFilter oldFilter, String newName) async {} + + DynamicAlbumFilter? get(String name) => null; + + // Accepts nullable String because dialogs pass String? + bool contains(String? name) => false; + + // Accept any JSON-like object + Future<void> import(Object? json) async {} + + // Aves expects a Map<String, dynamic> + Map<String, dynamic> export() => {}; +} + +final dynamicAlbums = FakeDynamicAlbums(); diff --git a/lib/model/entry/cache.dart b/lib/model/entry/cache.dart new file mode 100644 index 0000000..f195b7b --- /dev/null +++ b/lib/model/entry/cache.dart @@ -0,0 +1,69 @@ +import 'dart:async'; + +import 'package:aves/image_providers/full_image_provider.dart'; +import 'package:aves/image_providers/thumbnail_provider.dart'; +import 'package:flutter/foundation.dart'; + +class EntryCache { + // ordered descending + static final thumbnailRequestExtents = <double>[]; + + static void markThumbnailExtent(double extent) { + if (!thumbnailRequestExtents.contains(extent)) { + thumbnailRequestExtents + ..add(extent) + ..sort((a, b) => b.compareTo(a)); + } + } + + static Future<void> evict( + String uri, + String mimeType, + int? dateModifiedMillis, + int rotationDegrees, + bool isFlipped, + bool isAnimated, + ) async { + debugPrint('Evict cached images for uri=$uri, mimeType=$mimeType, dateModifiedMillis=$dateModifiedMillis, rotationDegrees=$rotationDegrees, isFlipped=$isFlipped, isAnimated=$isAnimated'); + + // TODO TLAD provide pageId parameter for multi page items, if someday image editing features are added for them + int? pageId; + + // evict fullscreen image + await FullImage( + uri: uri, + mimeType: mimeType, + pageId: pageId, + rotationDegrees: rotationDegrees, + isFlipped: isFlipped, + isAnimated: isAnimated, + ).evict(); + + // evict low quality thumbnail (without specified extents) + await ThumbnailProvider( + ThumbnailProviderKey( + uri: uri, + mimeType: mimeType, + pageId: pageId, + dateModifiedMillis: dateModifiedMillis ?? 0, + rotationDegrees: rotationDegrees, + isFlipped: isFlipped, + ), + ).evict(); + + await Future.forEach<double>( + thumbnailRequestExtents, + (extent) => ThumbnailProvider( + ThumbnailProviderKey( + uri: uri, + mimeType: mimeType, + pageId: pageId, + dateModifiedMillis: dateModifiedMillis ?? 0, + rotationDegrees: rotationDegrees, + isFlipped: isFlipped, + extent: extent, + ), + ).evict(), + ); + } +} diff --git a/lib/model/entry/dirs.dart b/lib/model/entry/dirs.dart new file mode 100644 index 0000000..6db7918 --- /dev/null +++ b/lib/model/entry/dirs.dart @@ -0,0 +1,76 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:collection/collection.dart'; + +final entryDirRepo = EntryDirRepo._private(); + +class EntryDirRepo { + EntryDirRepo._private(); + + // mapping between the raw entry directory path to a resolvable directory + final Map<String?, EntryDir> _dirs = {}; + final StreamController<EntryDir> _ambiguousDirStreamController = StreamController.broadcast(); + + Stream<EntryDir> get ambiguousDirStream => _ambiguousDirStreamController.stream; + + // get a resolvable directory for a raw entry directory path + EntryDir getOrCreate(String? asIs) { + var entryDir = _dirs[asIs]; + if (entryDir != null) return entryDir; + + final asIsLower = asIs?.toLowerCase(); + entryDir = _dirs.values.firstWhereOrNull((dir) => dir.asIsLower == asIsLower); + if (entryDir != null && !entryDir.ambiguous) { + entryDir.ambiguous = true; + _ambiguousDirStreamController.add(entryDir); + } + + return _dirs.putIfAbsent(asIs, () => entryDir ?? EntryDir(asIs)); + } +} + +// Some directories are ambiguous because they use different cases, +// but the OS merge and present them as one directory. +// This class resolves ambiguous directories to get the directory path +// with the right case, as presented by the OS. +class EntryDir { + final String? asIs, asIsLower; + bool ambiguous = false; + String? _resolved; + + EntryDir(this.asIs) : asIsLower = asIs?.toLowerCase(); + + String? get resolved { + if (!ambiguous) return asIs; + if (asIs == null) return null; + + _resolved ??= _resolve(); + return _resolved; + } + + String? _resolve() { + final vrl = androidFileUtils.relativeDirectoryFromPath(asIs!); + if (vrl == null || vrl.relativeDir.isEmpty) return asIs; + + var resolved = vrl.volumePath; + final parts = pContext.split(vrl.relativeDir); + for (final part in parts) { + FileSystemEntity? found; + final dir = Directory(resolved); + if (dir.existsSync()) { + final partLower = part.toLowerCase(); + try { + final childrenDirs = dir.listSync().where((v) => v.absolute is Directory).toSet(); + found = childrenDirs.firstWhereOrNull((v) => pContext.basename(v.path).toLowerCase() == partLower); + } catch (error) { + // ignore, could be IO issue when listing directory + } + } + resolved = found?.path ?? '$resolved${pContext.separator}$part'; + } + return resolved; + } +} diff --git a/lib/model/entry/entry.dart b/lib/model/entry/entry.dart new file mode 100644 index 0000000..4dade1d --- /dev/null +++ b/lib/model/entry/entry.dart @@ -0,0 +1,828 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:ui'; +import 'dart:io'; + +import 'package:sqflite/sqflite.dart'; +import 'package:aves/model/entry/cache.dart'; +import 'package:aves/model/entry/dirs.dart'; +import 'package:aves/model/entry/extensions/keys.dart'; +import 'package:aves/model/metadata/address.dart'; +import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/metadata/trash.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/format.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:flutter/foundation.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +// ✅ NEW: Remote origin costante +import 'package:aves/remote/remote_origin.dart'; + +enum EntryDataType { basic, aspectRatio, catalog, address, references } + +class AvesEntry with AvesEntryBase { + // ============================================================ + // CAMPI ORIGINALI AVES + // ============================================================ + + @override + int id; + + @override + String uri; + + @override + int? pageId; + + @override + int? sizeBytes; + + String? _path, _filename, _extension, _sourceTitle; + EntryDir? _directory; + int? contentId; + final String sourceMimeType; + int width, height, sourceRotationDegrees; + int? dateAddedSecs, _dateModifiedMillis, sourceDateTakenMillis, _durationMillis; + bool trashed; + int origin; + + int? _catalogDateMillis; + CatalogMetadata? _catalogMetadata; + AddressDetails? _addressDetails; + TrashDetails? trashDetails; + + List<AvesEntry>? stackedEntries; + + @override + final AChangeNotifier visualChangeNotifier = AChangeNotifier(); + + final AChangeNotifier metadataChangeNotifier = AChangeNotifier(), + addressChangeNotifier = AChangeNotifier(); + + // ============================================================ + // CAMPI REMOTI (AGGIUNTI) + // ============================================================ + + String? remoteId; + String? remotePath; + String? remoteThumb1; + String? remoteThumb2; + String? provider; + + double? latitude; + double? longitude; + double? altitude; + + int? remoteWidth; + int? remoteHeight; + int? remoteRotation; + + // Toggle: se true il decoder remoto rispetta già l’EXIF → Aves NON ruota. + static const bool kRemoteRespectsExifAtDecode = true; + + // Getter utili + bool get isRemote => origin == RemoteOrigin.value; // EntryOrigins.remote == RemoteOrigin.value + String? get remoteThumb => remoteThumb2 ?? remoteThumb1; + + // ============================================================ + // COSTRUTTORE + // ============================================================ + + AvesEntry({ + required int? id, + required this.uri, + required String? path, + required this.contentId, + required this.pageId, + required this.sourceMimeType, + required this.width, + required this.height, + required this.sourceRotationDegrees, + required this.sizeBytes, + required String? sourceTitle, + required this.dateAddedSecs, + required int? dateModifiedMillis, + required this.sourceDateTakenMillis, + required int? durationMillis, + required this.trashed, + required this.origin, + this.stackedEntries, + this.remoteId, + this.remotePath, + this.remoteThumb1, + this.remoteThumb2, + this.provider, + this.latitude, + this.longitude, + this.altitude, + this.remoteWidth, + this.remoteHeight, + this.remoteRotation, + }) : id = id ?? 0 { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$AvesEntry', + object: this, + ); + } + this.path = path; + this.sourceTitle = sourceTitle; + this.dateModifiedMillis = dateModifiedMillis; + this.durationMillis = durationMillis; + } + + // ============================================================ + // COPY-WITH + // ============================================================ + + AvesEntry copyWith({ + int? id, + String? uri, + String? path, + int? contentId, + String? title, + int? dateAddedSecs, + int? dateModifiedMillis, + int? origin, + List<AvesEntry>? stackedEntries, + }) { + final copyEntryId = id ?? this.id; + final copied = AvesEntry( + id: copyEntryId, + uri: uri ?? this.uri, + path: path ?? this.path, + contentId: contentId ?? this.contentId, + pageId: null, + sourceMimeType: sourceMimeType, + width: width, + height: height, + sourceRotationDegrees: sourceRotationDegrees, + sizeBytes: sizeBytes, + sourceTitle: title ?? sourceTitle, + dateAddedSecs: dateAddedSecs ?? this.dateAddedSecs, + dateModifiedMillis: dateModifiedMillis ?? this.dateModifiedMillis, + sourceDateTakenMillis: sourceDateTakenMillis, + durationMillis: durationMillis, + trashed: trashed, + origin: origin ?? this.origin, + stackedEntries: stackedEntries ?? this.stackedEntries, + + // campi remoti copiati + remoteId: remoteId, + remotePath: remotePath, + remoteThumb1: remoteThumb1, + remoteThumb2: remoteThumb2, + provider: provider, + latitude: latitude, + longitude: longitude, + altitude: altitude, + remoteWidth: remoteWidth, + remoteHeight: remoteHeight, + remoteRotation: remoteRotation, + ) + ..catalogMetadata = _catalogMetadata?.copyWith(id: copyEntryId) + ..addressDetails = _addressDetails?.copyWith(id: copyEntryId) + ..trashDetails = trashDetails?.copyWith(id: copyEntryId); + + return copied; + } + + // ============================================================ + // FROM MAP (DB → MODEL) — REMOTE-FRIENDLY + // ============================================================ + +factory AvesEntry.fromMap(Map map) { + // origin/remoteId/uri → fallback corretti + final origin = map[EntryFields.origin] as int? ?? 0; + final rid = map['remoteId'] as String?; + final rawUri = map[EntryFields.uri] as String?; + final safeUri = rawUri ?? + ((origin == RemoteOrigin.value && rid != null) + ? 'aves-remote://rid/$rid' + : 'content://invalid'); + + // MIME robusto + final safeMime = (map[EntryFields.sourceMimeType] as String?) ?? + (map[EntryFields.mimeType] as String?) ?? + _inferMimeFromRemotePath(map) ?? + 'image/jpeg'; + + // Dimensioni + final safeWidth = + (map[EntryFields.width] as int?) ?? (map['remoteWidth'] as int?) ?? 0; + final safeHeight = + (map[EntryFields.height] as int?) ?? (map['remoteHeight'] as int?) ?? 0; + + // dateModified + final safeDateModified = (map[EntryFields.dateModifiedMillis] as int?) ?? + (map[EntryFields.sourceDateTakenMillis] as int?) ?? + DateTime.now().millisecondsSinceEpoch; + + // contentId sintetico + final safeContentId = + (map[EntryFields.contentId] as int?) ?? _syntheticContentId(map); + + // --- CREA ENTRY --- + final entry = AvesEntry( + id: map[EntryFields.id] as int?, + uri: safeUri, + path: map[EntryFields.path] as String?, + pageId: null, + contentId: safeContentId, + sourceMimeType: safeMime, + width: safeWidth, + height: safeHeight, + sourceRotationDegrees: + map[EntryFields.sourceRotationDegrees] as int? ?? 0, + sizeBytes: map[EntryFields.sizeBytes] as int?, + sourceTitle: map[EntryFields.title] as String?, + dateAddedSecs: map[EntryFields.dateAddedSecs] as int?, + dateModifiedMillis: safeDateModified, + sourceDateTakenMillis: + map[EntryFields.sourceDateTakenMillis] as int?, + durationMillis: map[EntryFields.durationMillis] as int?, + trashed: (map[EntryFields.trashed] as int? ?? 0) != 0, + origin: origin, + + // --- REMOTE FIELDS --- + remoteId: rid, + remotePath: map['remotePath'] as String?, + remoteThumb1: map['remoteThumb1'] as String?, + remoteThumb2: map['remoteThumb2'] as String?, + provider: map['provider'] as String?, + remoteWidth: map['remoteWidth'] as int?, + remoteHeight: map['remoteHeight'] as int?, + remoteRotation: map['remoteRotation'] as int?, + + latitude: (map['latitude'] as num?)?.toDouble(), + longitude: (map['longitude'] as num?)?.toDouble(), + altitude: (map['altitude'] as num?)?.toDouble(), + ); + + // --- PATCH: GPS REMOTO → CATALOG METADATA --- + if (entry.isRemote && + entry.latitude != null && + entry.longitude != null) { + entry.catalogMetadata = CatalogMetadata( + id: entry.id!, + latitude: entry.latitude, + longitude: entry.longitude, + ); + } + + // --- PATCH: ADDRESS REMOTO --- + if (map['countryName'] != null || + map['adminArea'] != null || + map['locality'] != null || + map['countryCode'] != null) { + entry.addressDetails = AddressDetails( + id: entry.id!, + countryCode: map['countryCode'] as String?, + countryName: map['countryName'] as String?, + adminArea: map['adminArea'] as String?, + locality: map['locality'] as String?, + ); + } + + return entry; +} + +Future<void> registerRemoteFolder() async { + if (!isRemote) return; + + try { + final cartella = remotePath ?? 'Remote'; + final user = provider ?? 'unknown'; + final dir = '$cartella@$user'; + + final rows = await localMediaDb.rawDb.rawQuery( + 'SELECT hybrid_type FROM folders WHERE path = ?', + [dir], + ); + + final localDirPath = '/storage/emulated/0/Pictures/$dir'; + final existsLocal = await Directory(localDirPath).exists(); + final hybridType = existsLocal ? 1 : 0; + + if (rows.isEmpty) { + await localMediaDb.rawDb.insert( + 'folders', + { + 'path': dir, + 'display_name': cartella, + 'user': user, + 'device_id': user, + 'is_remote': 1, + 'hybrid_type': hybridType, + 'album_type': 0, + 'priority': 0, + }, + conflictAlgorithm: ConflictAlgorithm.ignore, + ); + } else { + final existingHybrid = rows.first['hybrid_type'] as int? ?? 0; + if (existingHybrid != hybridType) { + await localMediaDb.rawDb.update( + 'folders', + {'hybrid_type': hybridType}, + where: 'path = ?', + whereArgs: [dir], + ); + } + } + } catch (e, st) { + debugPrint('ERROR registering remote folder: $e\n$st'); + } +} + + // ============================================================ + // TO MAP (MODEL → DB) + // ============================================================ + + Map<String, dynamic> toDatabaseMap() { + return { + EntryFields.id: id, + EntryFields.uri: uri, + EntryFields.path: path, + EntryFields.contentId: contentId, + EntryFields.sourceMimeType: sourceMimeType, + EntryFields.width: width, + EntryFields.height: height, + EntryFields.sourceRotationDegrees: sourceRotationDegrees, + EntryFields.sizeBytes: sizeBytes, + EntryFields.title: sourceTitle, + EntryFields.dateAddedSecs: dateAddedSecs, + EntryFields.dateModifiedMillis: dateModifiedMillis, + EntryFields.sourceDateTakenMillis: sourceDateTakenMillis, + EntryFields.durationMillis: durationMillis, + EntryFields.trashed: trashed ? 1 : 0, + EntryFields.origin: origin, + + // --- REMOTE FIELDS --- + 'remoteId': remoteId, + 'remotePath': remotePath, + 'remoteThumb1': remoteThumb1, + 'remoteThumb2': remoteThumb2, + 'provider': provider, + 'remoteWidth': remoteWidth, + 'remoteHeight': remoteHeight, + 'remoteRotation': remoteRotation, + + 'latitude': latitude, + 'longitude': longitude, + 'altitude': altitude, + + }; + } + + // ============================================================ + // GETTER “REMOTE-AWARE” (display/size/rotation + visibilità) + // ============================================================ + + @override + int get rotationDegrees { + if (isRemote) { + // Decoder remoto rispetta già l'EXIF → Aves non ruota + if (kRemoteRespectsExifAtDecode) return 0; + // Altrimenti, usa la rotazione remota (se disponibile) + return remoteRotation ?? 0; + } + return _catalogMetadata?.rotationDegrees ?? sourceRotationDegrees; + } + + @override + set rotationDegrees(int rotationDegrees) { + if (isRemote) { + // Manteniamo il valore per future policy, ma non verrà applicato se kRemoteRespectsExifAtDecode=true + remoteRotation = rotationDegrees; + } else { + sourceRotationDegrees = rotationDegrees; + _catalogMetadata?.rotationDegrees = rotationDegrees; + } + } + + // 🔁 isFlipped (per i remoti: sempre false) + @override + bool get isFlipped => isRemote ? false : (_catalogMetadata?.isFlipped ?? false); + + @override + set isFlipped(bool v) { + if (!isRemote) { + _catalogMetadata?.isFlipped = v; + } + } + + // ======================= + // PATCH sui DUE GETTER + // ======================= + + @override + double get displayAspectRatio { + if (isRemote) { + // dimensioni "naturali" dei remoti + double w = (remoteWidth ?? width).toDouble(); + double h = (remoteHeight ?? height).toDouble(); + + // Se il decoder remoto rispetta l’EXIF e l’originale era 90/270, + // il bitmap decodificato è già portrait: per il FRAME swappiamo w/h. + if (kRemoteRespectsExifAtDecode) { + final rotated90 = ((remoteRotation ?? 0) % 180) == 90; + if (rotated90) { + final t = w; + w = h; + h = t; + } + } + + if (w == 0 || h == 0) return 1; + return w / h; + } + + // Locali: logica originale + double w = width.toDouble(); + double h = height.toDouble(); + if (w == 0 || h == 0) return 1; + return isRotated ? h / w : w / h; + } + + @override + Size get displaySize { + if (isRemote) { + double w = (remoteWidth ?? width).toDouble(); + double h = (remoteHeight ?? height).toDouble(); + + if (kRemoteRespectsExifAtDecode) { + final rotated90 = ((remoteRotation ?? 0) % 180) == 90; + if (rotated90) { + final t = w; + w = h; + h = t; + } + } + + if (w == 0 || h == 0) return const Size(1, 1); + // Nessuno swap aggiuntivo lato Aves: il frame ora è coerente al bitmap + return Size(w, h); + } + + // Locali: logica originale + final w = width.toDouble(); + final h = height.toDouble(); + return isRotated ? Size(h, w) : Size(w, h); + } + + /// Presenza “logica”: i remoti non vivono sul FS locale → considera presenti se non cestinati. + bool get isPresent { + if (isRemote) return !trashed; + return !trashed && + (uri.startsWith('content://') || + uri.startsWith('file://') || + path != null); + } + + /// Visualizzabilità minima: MIME coerente + dimensioni non zero. + bool get isDisplayable { + if (trashed) return false; + if (isRemote) { + final m = mimeType; + final supported = m.startsWith('image/') || m.startsWith('video/'); + final hasSize = + (width > 0 && height > 0) || (remoteWidth != null && remoteHeight != null); + return supported && hasSize; + } + final m = mimeType; + return (m.startsWith('image/') || m.startsWith('video/')) && isPresent; + } + + /// Le thumbs remote non dipendono dal canale nativo → basta isDisplayable. + bool get canThumbnail => isDisplayable; + + // ============================================================ + // (RESTO INVARIATO) + // ============================================================ + + Map<String, dynamic> toPlatformEntryMap() { + return { + EntryFields.uri: uri, + EntryFields.path: path, + EntryFields.pageId: pageId, + EntryFields.mimeType: mimeType, + EntryFields.width: width, + EntryFields.height: height, + EntryFields.rotationDegrees: rotationDegrees, + EntryFields.isFlipped: isFlipped, + EntryFields.dateModifiedMillis: dateModifiedMillis, + EntryFields.sizeBytes: sizeBytes, + EntryFields.trashed: trashed, + EntryFields.trashPath: trashDetails?.path, + EntryFields.origin: origin, + }; + } + + void dispose() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + visualChangeNotifier.dispose(); + metadataChangeNotifier.dispose(); + addressChangeNotifier.dispose(); + } + + @override + String toString() => '$runtimeType#${shortHash(this)}{id=$id, uri=$uri, path=$path, pageId=$pageId}'; + + set path(String? path) { + _path = path; + _directory = null; + _filename = null; + _extension = null; + _bestTitle = null; + } + + @override + String? get path => _path; + + // directory path, without the trailing separator + String? get directory { + _directory ??= entryDirRepo.getOrCreate(path != null ? pContext.dirname(path!) : null); + return _directory!.resolved; + } + + String? get filenameWithoutExtension { + _filename ??= path != null ? pContext.basenameWithoutExtension(path!) : null; + return _filename; + } + + // file extension, including the `.` + String? get extension { + _extension ??= path != null ? pContext.extension(path!) : null; + return _extension; + } + + // the MIME type reported by the Media Store is unreliable + // so we use the one found during cataloguing if possible + @override + String get mimeType => _catalogMetadata?.mimeType ?? sourceMimeType; + + bool get isCatalogued => _catalogMetadata != null; + + DateTime? _bestDate; + + DateTime? get bestDate { + _bestDate ??= dateTimeFromMillis(_catalogDateMillis) ?? + dateTimeFromMillis(sourceDateTakenMillis) ?? + dateTimeFromMillis(dateModifiedMillis ?? 0); + return _bestDate; + } + + @override + bool get isAnimated => catalogMetadata?.isAnimated ?? false; + + bool get isHdr => _catalogMetadata?.isHdr ?? false; + + int get rating => _catalogMetadata?.rating ?? 0; + + bool get isRotated => rotationDegrees % 180 == 90; + + String? get sourceTitle => _sourceTitle; + + set sourceTitle(String? sourceTitle) { + _sourceTitle = sourceTitle; + _bestTitle = null; + } + + int? get dateModifiedMillis => _dateModifiedMillis; + + set dateModifiedMillis(int? dateModifiedMillis) { + _dateModifiedMillis = dateModifiedMillis; + _bestDate = null; + } + + DateTime? get monthTaken { + final d = bestDate; + return d == null ? null : DateTime(d.year, d.month); + } + + DateTime? get dayTaken { + final d = bestDate; + return d == null ? null : DateTime(d.year, d.month, d.day); + } + + @override + int? get durationMillis => _durationMillis; + + set durationMillis(int? durationMillis) { + _durationMillis = durationMillis; + _durationText = null; + } + + String? _durationText; + + String get durationText { + _durationText ??= formatFriendlyDuration(Duration(milliseconds: durationMillis ?? 0)); + return _durationText!; + } + + bool get hasGps => (_catalogMetadata?.latitude ?? 0) != 0 || (_catalogMetadata?.longitude ?? 0) != 0; + + bool get hasAddress => _addressDetails != null; + + bool get hasFineAddress => + _addressDetails?.place?.isNotEmpty == true || (_addressDetails?.countryName?.length ?? 0) > 3; + + Set<String>? _tags; + + Set<String> get tags { + _tags ??= _catalogMetadata?.xmpSubjects?.split(';').where((tag) => tag.isNotEmpty).toSet() ?? {}; + return _tags!; + } + + String? _bestTitle; + + @override + String? get bestTitle { + _bestTitle ??= _catalogMetadata?.xmpTitle?.isNotEmpty == true + ? _catalogMetadata!.xmpTitle + : (filenameWithoutExtension ?? sourceTitle); + return _bestTitle; + } + + int? get catalogDateMillis => _catalogDateMillis; + + set catalogDateMillis(int? dateMillis) { + _catalogDateMillis = dateMillis; + _bestDate = null; + } + + CatalogMetadata? get catalogMetadata => _catalogMetadata; + + set catalogMetadata(CatalogMetadata? newMetadata) { + final oldMimeType = mimeType; + final oldDateModifiedMillis = dateModifiedMillis; + final oldRotationDegrees = rotationDegrees; + final oldIsFlipped = isFlipped; + + catalogDateMillis = newMetadata?.dateMillis; + _catalogMetadata = newMetadata; + _bestTitle = null; + _tags = null; + metadataChangeNotifier.notify(); + + _onVisualFieldChanged(oldMimeType, oldDateModifiedMillis, oldRotationDegrees, oldIsFlipped); + } + + void clearMetadata() { + catalogMetadata = null; + addressDetails = null; + } + + AddressDetails? get addressDetails => _addressDetails; + + set addressDetails(AddressDetails? newAddress) { + _addressDetails = newAddress; + addressChangeNotifier.notify(); + } + + String get shortAddress { + return { + _addressDetails?.countryName, + _addressDetails?.adminArea, + _addressDetails?.locality, + }.nonNulls.where((v) => v.isNotEmpty).join(', '); + } + + static void normalizeMimeTypeFields(Map fields) { + final mimeType = fields[EntryFields.mimeType] as String?; + if (mimeType != null) { + fields[EntryFields.mimeType] = MimeTypes.normalize(mimeType); + } + final sourceMimeType = fields[EntryFields.sourceMimeType] as String?; + if (sourceMimeType != null) { + fields[EntryFields.sourceMimeType] = MimeTypes.normalize(sourceMimeType); + } + } + + Future<void> applyNewFields(Map newFields, {required bool persist}) async { + final oldMimeType = mimeType; + final oldDateModifiedMillis = this.dateModifiedMillis; + final oldRotationDegrees = this.rotationDegrees; + final oldIsFlipped = this.isFlipped; + + final uri = newFields[EntryFields.uri]; + if (uri is String) this.uri = uri; + final path = newFields[EntryFields.path]; + if (path is String) this.path = path; + final contentId = newFields[EntryFields.contentId]; + if (contentId is int) this.contentId = contentId; + + final sourceTitle = newFields[EntryFields.title]; + if (sourceTitle is String) this.sourceTitle = sourceTitle; + final sourceRotationDegrees = newFields[EntryFields.sourceRotationDegrees]; + if (sourceRotationDegrees is int) this.sourceRotationDegrees = sourceRotationDegrees; + final sourceDateTakenMillis = newFields[EntryFields.sourceDateTakenMillis]; + if (sourceDateTakenMillis is int) this.sourceDateTakenMillis = sourceDateTakenMillis; + + final width = newFields[EntryFields.width]; + if (width is int) this.width = width; + final height = newFields[EntryFields.height]; + if (height is int) this.height = height; + final durationMillis = newFields[EntryFields.durationMillis]; + if (durationMillis is int) this.durationMillis = durationMillis; + + final sizeBytes = newFields[EntryFields.sizeBytes]; + if (sizeBytes is int) this.sizeBytes = sizeBytes; + final dateModifiedMillis = newFields[EntryFields.dateModifiedMillis]; + if (dateModifiedMillis is int) this.dateModifiedMillis = dateModifiedMillis; + final rotationDegrees = newFields[EntryFields.rotationDegrees]; + if (rotationDegrees is int) this.rotationDegrees = rotationDegrees; + final isFlipped = newFields[EntryFields.isFlipped]; + if (isFlipped is bool) this.isFlipped = isFlipped; + + if (persist) { + await localMediaDb.updateEntry(id, this); + if (catalogMetadata != null) await localMediaDb.saveCatalogMetadata({catalogMetadata!}); + } + + await _onVisualFieldChanged(oldMimeType, oldDateModifiedMillis, oldRotationDegrees, oldIsFlipped); + metadataChangeNotifier.notify(); + } + + Future<void> refresh({ + required bool background, + required bool persist, + required Set<EntryDataType> dataTypes, + }) async { + _bestDate = null; + _bestTitle = null; + _tags = null; + + if (persist) { + await localMediaDb.removeIds({id}, dataTypes: dataTypes); + } + + final updatedEntry = await mediaFetchService.getEntry(uri, mimeType); + if (updatedEntry != null) { + await applyNewFields(updatedEntry.toDatabaseMap(), persist: persist); + } + } + + Future<bool> delete() { + final opCompleter = Completer<bool>(); + mediaEditService + .delete(entries: {this}) + .listen( + (event) => opCompleter.complete(event.success && !event.skipped), + onError: opCompleter.completeError, + onDone: () { + if (!opCompleter.isCompleted) { + opCompleter.complete(false); + } + }, + ); + return opCompleter.future; + } + + Future<void> _onVisualFieldChanged( + String oldMimeType, + int? oldDateModifiedMillis, + int oldRotationDegrees, + bool oldIsFlipped, + ) async { + if ((!MimeTypes.refersToSameType(oldMimeType, mimeType) && !MimeTypes.isVideo(oldMimeType)) || + oldDateModifiedMillis != dateModifiedMillis || + oldRotationDegrees != rotationDegrees || + oldIsFlipped != isFlipped) { + await EntryCache.evict(uri, oldMimeType, oldDateModifiedMillis, oldRotationDegrees, oldIsFlipped, isAnimated); + visualChangeNotifier.notify(); + } + } + + // ------------------------------------------------------------ + // Helpers “remote-friendly” + // ------------------------------------------------------------ + + static String? _inferMimeFromRemotePath(Map map) { + final path = (map['remotePath'] as String?) ?? (map[EntryFields.path] as String?); + if (path == null) return null; + final lower = path.toLowerCase(); + if (lower.endsWith('.jpg') || lower.endsWith('.jpeg')) return 'image/jpeg'; + if (lower.endsWith('.png')) return 'image/png'; + if (lower.endsWith('.webp')) return 'image/webp'; + if (lower.endsWith('.gif')) return 'image/gif'; + if (lower.endsWith('.mp4')) return 'video/mp4'; + if (lower.endsWith('.mov')) return 'video/quicktime'; + if (lower.endsWith('.mkv')) return 'video/x-matroska'; + return null; + } + + static int? _syntheticContentId(Map map) { + final id = map[EntryFields.id] as int?; + if (id == null) return null; + return 1000000000 + id; // disgiunto dai locali, >0 + } +} diff --git a/lib/model/entry/extensions/catalog.dart b/lib/model/entry/extensions/catalog.dart new file mode 100644 index 0000000..593fadd --- /dev/null +++ b/lib/model/entry/extensions/catalog.dart @@ -0,0 +1,82 @@ +import 'dart:async'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/keys.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/media/geotiff.dart'; +import 'package:aves/model/media/video/metadata.dart'; +import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/metadata/svg_metadata_service.dart'; +import 'package:flutter/foundation.dart'; + +extension ExtraAvesEntryCatalog on AvesEntry { + Future<void> catalog({required bool background, required bool force, required bool persist}) async { + if (isCatalogued && !force) return; + + final beforeAvailableHeapSize = await deviceService.getAvailableHeapSize(); + + if (isSvg) { + // vector image sizing is not essential, so we should not spend time for it during loading + // but it is useful anyway (for aspect ratios etc.) so we size them during cataloguing + final size = await SvgMetadataService.getSize(this); + if (size != null) { + final fields = { + EntryFields.width: size.width.ceil(), + EntryFields.height: size.height.ceil(), + }; + await applyNewFields(fields, persist: persist); + } + catalogMetadata = CatalogMetadata(id: id); + } else { + // pre-processing + if (isVideo || mimeType == MimeTypes.avif) { + // on initial loading, original source may report incorrect size, rotation or duration + final fields = await VideoMetadataFormatter.getLoadingMetadata(this); + // check size as the video interpreter may fail on some AVIF stills + final width = fields[EntryFields.width]; + final height = fields[EntryFields.height]; + final isValid = (width == null || width > 0) && (height == null || height > 0); + if (isValid) { + await applyNewFields(fields, persist: persist); + } + } + + // cataloguing on platform + catalogMetadata = await metadataFetchService.getCatalogMetadata(this, background: background); + + // post-processing + if ((isVideo && (catalogMetadata?.dateMillis ?? 0) == 0) || (mimeType == MimeTypes.avif && durationMillis != null)) { + final videoMetadata = await VideoMetadataFormatter.completeCatalogMetadata(this); + if (videoMetadata != null) { + catalogMetadata = videoMetadata; + } + } + if (isGeotiff && !hasGps) { + final info = await metadataFetchService.getGeoTiffInfo(this); + if (info != null) { + final center = GeoTiffCoordinateConverter( + info: info, + entry: this, + ).center; + if (center != null) { + catalogMetadata = catalogMetadata?.copyWith( + latitude: center.latitude, + longitude: center.longitude, + ); + } + } + } + } + + final afterAvailableHeapSize = await deviceService.getAvailableHeapSize(); + final diff = beforeAvailableHeapSize - afterAvailableHeapSize; + const largeHeapUsageThreshold = 15 * (1 << 20); // MB + + if (diff > largeHeapUsageThreshold) { + debugPrint('Large heap usage (${diff}B) from cataloguing entry=$this size=$sizeBytes'); + await deviceService.requestGarbageCollection(); + } + } +} diff --git a/lib/model/entry/extensions/favourites.dart b/lib/model/entry/extensions/favourites.dart new file mode 100644 index 0000000..22ca36f --- /dev/null +++ b/lib/model/entry/extensions/favourites.dart @@ -0,0 +1,26 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/favourites.dart'; + +extension ExtraAvesEntryFav on AvesEntry { + bool get isFavourite => favourites.isFavourite(this); + + Future<void> toggleFavourite() async { + if (isFavourite) { + await removeFromFavourites(); + } else { + await addToFavourites(); + } + } + + Future<void> addToFavourites() async { + if (!isFavourite) { + await favourites.add({this}); + } + } + + Future<void> removeFromFavourites() async { + if (isFavourite) { + await favourites.removeEntries({this}); + } + } +} diff --git a/lib/model/entry/extensions/images.dart b/lib/model/entry/extensions/images.dart new file mode 100644 index 0000000..f99f057 --- /dev/null +++ b/lib/model/entry/extensions/images.dart @@ -0,0 +1,108 @@ +import 'dart:math'; + +import 'package:aves/image_providers/full_image_provider.dart'; +import 'package:aves/image_providers/region_provider.dart'; +import 'package:aves/image_providers/thumbnail_provider.dart'; +import 'package:aves/model/entry/cache.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/utils/math_utils.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/painting.dart'; +import 'package:aves/remote/remote_http.dart'; +import 'package:aves/remote/remote_origin.dart'; + +extension ExtraAvesEntryImages on AvesEntry { + // === Helper per remoti === + bool get isRemote => origin == RemoteOrigin.value; + + bool isThumbnailReady({double extent = 0}) => _isReady(_getThumbnailProviderKey(extent)); + + ThumbnailProvider getThumbnail({double extent = 0}) { + return ThumbnailProvider(_getThumbnailProviderKey(extent)); + } + + ThumbnailProviderKey _getThumbnailProviderKey(double extent) { + final requestExtent = extent.roundToDouble(); + EntryCache.markThumbnailExtent(requestExtent); + return ThumbnailProviderKey( + uri: uri, + mimeType: mimeType, + pageId: pageId, + rotationDegrees: rotationDegrees, + isFlipped: isFlipped, + dateModifiedMillis: dateModifiedMillis ?? -1, + extent: requestExtent, + ); + } + + RegionProvider getRegion({int sampleSize = 1, double scale = 1, required Rectangle<num> region}) { + if (isRemote) { + // Non supportiamo il tiling di region su immagini remote (non c’è file locale). + throw UnsupportedError("Region tiling not supported for remote images"); + } + + return RegionProvider( + RegionProviderKey( + uri: uri, + mimeType: mimeType, + pageId: pageId, + sizeBytes: sizeBytes, + rotationDegrees: rotationDegrees, + isFlipped: isFlipped, + sampleSize: sampleSize, + regionRect: Rectangle( + (region.left * scale).round(), + (region.top * scale).round(), + (region.width * scale).round(), + (region.height * scale).round(), + ), + imageSize: Size((width * scale).toDouble(), (height * scale).toDouble()), + ), + ); + } + + Rectangle<double> get fullImageRegion => Rectangle<double>(.0, .0, width.toDouble(), height.toDouble()); + + /// Provider dell’immagine completa. + /// - Remoto → `NetworkImage` con header Bearer “sincroni” (se già in cache via RemoteHttp.headers()). + /// - Locale → `FullImage` (pipeline classica Aves). + ImageProvider get fullImage { + if (isRemote) { + final abs = RemoteHttp.absUrl(remotePath ?? path); + // Se la cache non è ancora popolata, può essere null: chi usa il ramo viewer remoto fa comunque await degli headers. + final hdrs = RemoteHttp.peekHeaders(); + return NetworkImage(abs, headers: hdrs); + } + + return FullImage( + uri: uri, + mimeType: mimeType, + pageId: pageId, + rotationDegrees: rotationDegrees, + isFlipped: isFlipped, + isAnimated: isAnimated, + sizeBytes: sizeBytes, + ); + } + + bool _isReady(Object providerKey) => imageCache.statusForKey(providerKey).keepAlive; + + List<ThumbnailProvider> get cachedThumbnails => + EntryCache.thumbnailRequestExtents.map(_getThumbnailProviderKey).where(_isReady).map(ThumbnailProvider.new).toList(); + + ThumbnailProvider get bestCachedThumbnail { + final sizedThumbnailKey = EntryCache.thumbnailRequestExtents.map(_getThumbnailProviderKey).firstWhereOrNull(_isReady); + return sizedThumbnailKey != null ? ThumbnailProvider(sizedThumbnailKey) : getThumbnail(); + } + + static int sampleSizeForScale({ + required double magnifierScale, + required double devicePixelRatio, + }) { + var sample = 0; + if (0 < magnifierScale && magnifierScale < 1) { + sample = highestPowerOf2(1 / (magnifierScale * devicePixelRatio)); + } + return max<int>(1, sample); + } +} diff --git a/lib/model/entry/extensions/info.dart b/lib/model/entry/extensions/info.dart new file mode 100644 index 0000000..cf213f8 --- /dev/null +++ b/lib/model/entry/extensions/info.dart @@ -0,0 +1,187 @@ +import 'dart:async'; +import 'dart:collection'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/media/video/metadata.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/metadata/svg_metadata_service.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/format.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_dir.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +extension ExtraAvesEntryInfo on AvesEntry { + // directory names may contain the name of their parent directory (as prefix + '/') + // directory names may contain an index (as suffix in '[]') + static final directoryNamePattern = RegExp(r'^((?<parent>.*?)/)?(?<name>.*?)(\[(?<index>\d+)\])?$'); + + Future<List<MapEntry<String, MetadataDirectory>>> getMetadataDirectories(BuildContext context) async { + final rawMetadata = await (isSvg ? SvgMetadataService.getAllMetadata(this) : metadataFetchService.getAllMetadata(this)); + final directories = rawMetadata.entries.map((dirKV) { + var directoryName = dirKV.key as String; + + String? parent; + int? index; + final match = directoryNamePattern.firstMatch(directoryName); + if (match != null) { + parent = match.namedGroup('parent'); + final nameMatch = match.namedGroup('name'); + if (nameMatch != null) { + directoryName = nameMatch; + } + final indexMatch = match.namedGroup('index'); + if (indexMatch != null) { + index = int.tryParse(indexMatch); + } + } + + final rawTags = dirKV.value as Map; + return MetadataDirectory( + directoryName, + _toSortedTags(rawTags), + parent: parent, + index: index, + ); + }).toList(); + + if (isVideo || (mimeType == MimeTypes.heif && isMultiPage) || mimeType == MimeTypes.avif) { + directories.addAll(await _getStreamDirectories(context)); + } + + final titledDirectories = directories.map((dir) { + var title = dir.name; + if (directories.where((dir) => dir.name == title).length > 1 && dir.parent?.isNotEmpty == true) { + title = '${dir.parent}/$title'; + } + if (dir.index != null) { + title += ' ${dir.index}'; + } + return MapEntry(title, dir); + }).toList()..sort((a, b) => compareAsciiUpperCase(a.key, b.key)); + + return titledDirectories; + } + + Future<List<MetadataDirectory>> _getStreamDirectories(BuildContext context) async { + final directories = <MetadataDirectory>[]; + final mediaInfo = await videoMetadataFetcher.getMetadata(this); + if (!context.mounted) { + return directories; + } + + final formattedMediaTags = VideoMetadataFormatter.formatInfo(mediaInfo); + if (formattedMediaTags.isNotEmpty) { + // overwrite generic directory found from the platform side + directories.add(MetadataDirectory(MetadataDirectory.mediaDirectory, _toSortedTags(formattedMediaTags))); + } + + if (mediaInfo.containsKey(Keys.chapters)) { + final allChapters = (mediaInfo.remove(Keys.chapters) as List).cast<Map>(); + if (allChapters.isNotEmpty) { + allChapters.sortBy((v) => v[Keys.time] as num? ?? 0); + + final chapterTags = SplayTreeMap.of( + Map.fromEntries( + allChapters.mapIndexed((i, chapter) { + final chapterNumber = i + 1; + final time = Duration(seconds: (chapter[Keys.time] as num? ?? 0).round()); + final title = chapter[Keys.title] as String? ?? 'Chapter $chapterNumber'; + return MapEntry('$chapterNumber${AText.separator}${formatFriendlyDuration(time)}', title); + }), + ), + compareNatural, + ); + directories.add(MetadataDirectory('Chapters', chapterTags)); + } + } + + if (mediaInfo.containsKey(Keys.streams)) { + String getTypeText(Map stream) { + final type = stream[Keys.streamType] ?? MediaStreamTypes.unknown; + switch (type) { + case MediaStreamTypes.attachment: + return 'Attachment'; + case MediaStreamTypes.audio: + return 'Audio'; + case MediaStreamTypes.metadata: + return 'Metadata'; + case MediaStreamTypes.subtitle: + case MediaStreamTypes.timedText: + return 'Text'; + case MediaStreamTypes.video: + return stream.containsKey(Keys.fpsDen) || stream.containsKey(Keys.fps) ? 'Video' : 'Image'; + case MediaStreamTypes.unknown: + default: + return 'Unknown'; + } + } + + final allStreams = (mediaInfo[Keys.streams] as List).cast<Map>(); + final attachmentStreams = allStreams.where((stream) => stream[Keys.streamType] == MediaStreamTypes.attachment).toList(); + final knownStreams = allStreams.whereNot(attachmentStreams.contains); + + // display known streams as separate directories (e.g. video, audio, subs) + if (knownStreams.isNotEmpty) { + final indexDigits = knownStreams.length.toString().length; + + final colors = context.read<AvesColorsData>(); + for (final stream in knownStreams) { + final index = (stream[Keys.index] ?? 0) + 1; + final typeText = getTypeText(stream); + final dirName = [ + 'Stream ${index.toString().padLeft(indexDigits, '0')}', + typeText, + ].join(AText.separator); + final formattedStreamTags = VideoMetadataFormatter.formatInfo(stream); + if (formattedStreamTags.isNotEmpty) { + final color = colors.fromString(typeText); + directories.add(MetadataDirectory(dirName, _toSortedTags(formattedStreamTags), color: color)); + } + } + } + + // group attachments by format (e.g. TTF fonts) + if (attachmentStreams.isNotEmpty) { + final formatCount = <String, List<String?>>{}; + for (final stream in attachmentStreams) { + final codec = (stream[Keys.codecName] as String? ?? 'unknown').toUpperCase(); + if (!formatCount.containsKey(codec)) { + formatCount[codec] = []; + } + formatCount[codec]!.add(stream[Keys.filename]); + } + if (formatCount.isNotEmpty) { + final rawTags = formatCount.map((key, value) { + final count = value.length; + // remove duplicate names, so number of displayed names may not match displayed count + final names = value.nonNulls.toSet().toList()..sort(compareAsciiUpperCase); + return MapEntry(key, '$count items: ${names.join(', ')}'); + }); + directories.add(MetadataDirectory('Attachments', _toSortedTags(rawTags))); + } + } + } + return directories; + } + + SplayTreeMap<String, String> _toSortedTags(Map rawTags) { + final tags = SplayTreeMap.of( + Map.fromEntries( + rawTags.entries.map((tagKV) { + var value = (tagKV.value as String? ?? '').trim(); + if (value.isEmpty) return null; + final tagName = tagKV.key as String; + return MapEntry(tagName, value); + }).nonNulls, + ), + ); + return tags; + } +} diff --git a/lib/model/entry/extensions/keys.dart b/lib/model/entry/extensions/keys.dart new file mode 100644 index 0000000..d6eeafb --- /dev/null +++ b/lib/model/entry/extensions/keys.dart @@ -0,0 +1,28 @@ +// entry fields exported and imported from/to the platform side +// should match `EntryFields` on platform side +class EntryFields { + static const id = 'id'; // int + static const origin = 'origin'; // int + static const uri = 'uri'; // string + static const contentId = 'contentId'; // long + static const path = 'path'; // string + static const pageId = 'pageId'; // int + static const sourceMimeType = 'sourceMimeType'; // string + static const mimeType = 'mimeType'; // string + + static const width = 'width'; // int + static const height = 'height'; // int + static const sourceRotationDegrees = 'sourceRotationDegrees'; // int + static const rotationDegrees = 'rotationDegrees'; // int + static const isFlipped = 'isFlipped'; // boolean + + static const dateAddedSecs = 'dateAddedSecs'; // long + static const dateModifiedMillis = 'dateModifiedMillis'; // long + static const sourceDateTakenMillis = 'sourceDateTakenMillis'; // long + static const durationMillis = 'durationMillis'; // long + + static const sizeBytes = 'sizeBytes'; // long + static const trashed = 'trashed'; // boolean + static const trashPath = 'trashPath'; // string + static const title = 'title'; // string +} diff --git a/lib/model/entry/extensions/location.dart b/lib/model/entry/extensions/location.dart new file mode 100644 index 0000000..e33c4ab --- /dev/null +++ b/lib/model/entry/extensions/location.dart @@ -0,0 +1,90 @@ +import 'dart:async'; +import 'dart:ui'; + +import 'package:aves/geo/countries.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/metadata/address.dart'; +import 'package:aves/services/common/service_policy.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/geocoding_service.dart'; +import 'package:country_code/country_code.dart'; +import 'package:flutter/foundation.dart'; +import 'package:latlong2/latlong.dart'; + +extension ExtraAvesEntryLocation on AvesEntry { + static final _invalidLocalityPattern = RegExp(r'^[-+\dA-Z]+$'); + + LatLng? get latLng => hasGps ? LatLng(catalogMetadata!.latitude!, catalogMetadata!.longitude!) : null; + + Future<void> locate({required bool background, required bool force, required Locale geocoderLocale}) async { + if (hasGps) { + await _locateCountry(force: force); + if (await availability.canLocatePlaces) { + await locatePlace(background: background, force: force, geocoderLocale: geocoderLocale); + } + } else { + addressDetails = null; + } + } + + // quick reverse geocoding to find the country, using an offline asset + Future<void> _locateCountry({required bool force}) async { + if (!hasGps || (hasAddress && !force)) return; + final countryCode = await countryTopology.countryCode(latLng!); + setCountry(countryCode); + } + + void setCountry(CountryCode? countryCode) { + if (hasFineAddress || countryCode == null) return; + addressDetails = AddressDetails( + id: id, + countryCode: countryCode.alpha2, + countryName: countryCode.alpha3, + ); + } + + // full reverse geocoding, requiring Play Services and some connectivity + Future<void> locatePlace({required bool background, required bool force, required Locale geocoderLocale}) async { + if (!hasGps || (hasFineAddress && !force)) return; + try { + Future<List<Address>> call() => GeocodingService.getAddress(latLng!, geocoderLocale); + final addresses = await (background + ? servicePolicy.call( + call, + priority: ServiceCallPriority.getLocation, + ) + : call()); + if (addresses.isNotEmpty) { + final v = addresses.first; + var locality = v.locality ?? v.subLocality ?? v.featureName; + if (locality == null || _invalidLocalityPattern.hasMatch(locality) || {v.subThoroughfare, v.countryName}.contains(locality)) { + locality = v.subAdminArea; + } + addressDetails = AddressDetails( + id: id, + countryCode: v.countryCode?.toUpperCase(), + countryName: v.countryName, + adminArea: v.adminArea, + locality: locality, + ); + } + } catch (error, stack) { + debugPrint('$runtimeType locate failed with path=$path coordinates=$latLng error=$error\n$stack'); + } + } + + Future<String?> findAddressLine({required Locale geocoderLocale}) async { + if (!hasGps) return null; + + try { + final addresses = await GeocodingService.getAddress(latLng!, geocoderLocale); + if (addresses.isNotEmpty) { + final address = addresses.first; + return address.addressLine; + } + } catch (error, stack) { + debugPrint('$runtimeType findAddressLine failed with path=$path coordinates=$latLng error=$error\n$stack'); + } + return null; + } +} diff --git a/lib/model/entry/extensions/metadata_edition.dart b/lib/model/entry/extensions/metadata_edition.dart new file mode 100644 index 0000000..4542728 --- /dev/null +++ b/lib/model/entry/extensions/metadata_edition.dart @@ -0,0 +1,591 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:aves/convert/convert.dart'; +import 'package:aves/model/device.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/catalog.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/metadata/date_modifier.dart'; +import 'package:aves/ref/locales.dart'; +import 'package:aves/ref/metadata/exif.dart'; +import 'package:aves/ref/metadata/iptc.dart'; +import 'package:aves/ref/metadata/xmp.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/metadata/xmp.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:aves/utils/xmp_utils.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:intl/intl.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:xml/xml.dart'; + +extension ExtraAvesEntryMetadataEdition on AvesEntry { + static final _iso6709LatitudeFormatter = NumberFormat('00.0000', asciiLocale); + static final _iso6709LongitudeFormatter = NumberFormat('000.0000', asciiLocale); + + Future<Set<EntryDataType>> editDate(DateModifier userModifier) async { + final dataTypes = <EntryDataType>{}; + + final appliedModifier = await _applyDateModifierToEntry(userModifier); + if (appliedModifier == null) { + if (isValid && userModifier.action != DateEditAction.copyField) { + await reportService.recordError('failed to get date for modifier=$userModifier, entry=$this'); + } + return {}; + } + + if (isExifEditionSupported && appliedModifier.fields.any((v) => v.type == MetadataType.exif)) { + final newFields = await metadataEditService.editExifDate(this, appliedModifier); + if (newFields.isNotEmpty) { + dataTypes.addAll({ + EntryDataType.basic, + EntryDataType.catalog, + }); + } + } + + if (isXmpEditionSupported && appliedModifier.fields.any((v) => v.type == MetadataType.xmp)) { + final metadata = { + MetadataType.xmp: await _editXmp((descriptions) { + switch (appliedModifier.action) { + case DateEditAction.setCustom: + case DateEditAction.copyField: + case DateEditAction.copyItem: + case DateEditAction.extractFromTitle: + editCreateDateXmp(descriptions, appliedModifier.setDateTime); + case DateEditAction.shift: + final xmpDate = XMP.getString(descriptions, XmpAttributes.xmpCreateDate, namespace: XmpNamespaces.xmp); + if (xmpDate != null) { + final date = DateTime.tryParse(xmpDate); + if (date != null) { + // TODO TLAD [date] DateTime.tryParse converts to UTC time, losing the time zone offset + final shiftedDate = date.add(Duration(seconds: appliedModifier.shiftSeconds!)); + editCreateDateXmp(descriptions, shiftedDate); + } else { + reportService.recordError('failed to parse XMP date=$xmpDate'); + } + } + case DateEditAction.remove: + editCreateDateXmp(descriptions, null); + } + return true; + }), + }; + final newFields = await metadataEditService.editMetadata(this, metadata); + if (newFields.isNotEmpty) { + dataTypes.addAll({ + EntryDataType.basic, + EntryDataType.catalog, + }); + } + } + + return dataTypes; + } + + static const removalLocation = LatLng(0, 0); + + Future<Set<EntryDataType>> editLocation(LatLng? latLng) async { + final dataTypes = <EntryDataType>{}; + final metadata = <MetadataType, dynamic>{}; + + final missingDate = await _missingDateCheckAndExifEdit(dataTypes); + + if (isExifEditionSupported) { + // clear every GPS field + final exifFields = Map<MetadataField, dynamic>.fromEntries(MetadataFields.exifGpsFields.map((k) => MapEntry(k, null))); + // add latitude & longitude, if any + if (latLng != null && latLng != removalLocation) { + final latitude = latLng.latitude; + final longitude = latLng.longitude; + exifFields.addAll({ + MetadataField.exifGpsLatitude: latitude.abs(), + MetadataField.exifGpsLatitudeRef: latitude >= 0 ? Exif.latitudeNorth : Exif.latitudeSouth, + MetadataField.exifGpsLongitude: longitude.abs(), + MetadataField.exifGpsLongitudeRef: longitude >= 0 ? Exif.longitudeEast : Exif.longitudeWest, + }); + } + metadata[MetadataType.exif] = Map<String, dynamic>.fromEntries(exifFields.entries.map((kv) => MapEntry(kv.key.toPlatform!, kv.value))); + + if (isXmpEditionSupported && missingDate != null) { + metadata[MetadataType.xmp] = await _editXmp((descriptions) { + editCreateDateXmp(descriptions, missingDate); + return true; + }); + } + } + + if (mimeType == MimeTypes.mp4) { + final mp4Fields = <MetadataField, String?>{}; + + String? iso6709String; + if (latLng != null && latLng != removalLocation) { + final latitude = latLng.latitude; + final longitude = latLng.longitude; + final isoLat = '${latitude >= 0 ? '+' : '-'}${_iso6709LatitudeFormatter.format(latitude.abs())}'; + final isoLon = '${longitude >= 0 ? '+' : '-'}${_iso6709LongitudeFormatter.format(longitude.abs())}'; + iso6709String = '$isoLat$isoLon/'; + } + mp4Fields[MetadataField.mp4GpsCoordinates] = iso6709String; + + if (missingDate != null) { + final xmpParts = await _editXmp((descriptions) { + editCreateDateXmp(descriptions, missingDate); + return true; + }); + mp4Fields[MetadataField.mp4Xmp] = xmpParts[xmpCoreKey]; + } + + metadata[MetadataType.mp4] = Map<String, String?>.fromEntries(mp4Fields.entries.map((kv) => MapEntry(kv.key.toPlatform!, kv.value))); + } + + final newFields = await metadataEditService.editMetadata(this, metadata); + if (newFields.isNotEmpty) { + dataTypes.addAll({ + EntryDataType.catalog, + EntryDataType.address, + }); + } + return dataTypes; + } + + Future<Set<EntryDataType>> _changeExifOrientation(Future<Map<String, dynamic>> Function() apply) async { + final dataTypes = <EntryDataType>{}; + + await _missingDateCheckAndExifEdit(dataTypes); + + final newFields = await apply(); + // applying fields is only useful for a smoother visual change, + // as proper refreshing and persistence happens at the caller level + await applyNewFields(newFields, persist: false); + if (newFields.isNotEmpty) { + dataTypes.addAll({ + EntryDataType.basic, + EntryDataType.aspectRatio, + EntryDataType.catalog, + }); + } + return dataTypes; + } + + Future<Set<EntryDataType>> _rotateMp4(int rotationDegrees) async { + final dataTypes = <EntryDataType>{}; + + final missingDate = await _missingDateCheckAndExifEdit(dataTypes); + + final mp4Fields = <MetadataField, String?>{ + MetadataField.mp4RotationDegrees: rotationDegrees.toString(), + }; + + if (missingDate != null) { + final xmpParts = await _editXmp((descriptions) { + editCreateDateXmp(descriptions, missingDate); + return true; + }); + mp4Fields[MetadataField.mp4Xmp] = xmpParts[xmpCoreKey]; + } + + final metadata = <MetadataType, dynamic>{ + MetadataType.mp4: Map<String, String?>.fromEntries(mp4Fields.entries.map((kv) => MapEntry(kv.key.toPlatform!, kv.value))), + }; + + final newFields = await metadataEditService.editMetadata(this, metadata); + // applying fields is only useful for a smoother visual change, + // as proper refreshing and persistence happens at the caller level + await applyNewFields(newFields, persist: false); + if (newFields.isNotEmpty) { + dataTypes.addAll({ + EntryDataType.basic, + EntryDataType.aspectRatio, + EntryDataType.catalog, + }); + } + return dataTypes; + } + + Future<Set<EntryDataType>> rotate({required bool clockwise}) { + if (mimeType == MimeTypes.mp4) { + return _rotateMp4((rotationDegrees + (clockwise ? 90 : -90) + 360) % 360); + } else { + return _changeExifOrientation(() => metadataEditService.rotate(this, clockwise: clockwise)); + } + } + + Future<Set<EntryDataType>> flip() { + return _changeExifOrientation(() => metadataEditService.flip(this)); + } + + // write title: + // - IPTC / object-name, if IPTC exists + // - XMP / dc:title + // write description: + // - Exif / ImageDescription (clear field) + // - Exif / UserComment (clear field) + // - IPTC / caption-abstract, if IPTC exists + // - XMP / dc:description + Future<Set<EntryDataType>> editTitleDescription(Map<DescriptionField, String?> fields) async { + final dataTypes = <EntryDataType>{}; + final metadata = <MetadataType, dynamic>{}; + + final missingDate = await _missingDateCheckAndExifEdit(dataTypes); + + final editTitle = fields.keys.contains(DescriptionField.title); + final editDescription = fields.keys.contains(DescriptionField.description); + final title = fields[DescriptionField.title]; + final description = fields[DescriptionField.description]; + + if (isExifEditionSupported && editDescription) { + metadata[MetadataType.exif] = { + // clear field because it is subpar, with ASCII support only + MetadataField.exifImageDescription.toPlatform!: null, + // clear field because it is subpar, with ambiguous encoding + MetadataField.exifUserComment.toPlatform!: null, + }; + } + + if (isIptcEditionSupported) { + final iptc = await metadataFetchService.getIptc(this); + if (iptc != null) { + if (editTitle) { + editIptcValues(iptc, IPTC.applicationRecord, IPTC.objectName, {?title}); + } + if (editDescription) { + editIptcValues(iptc, IPTC.applicationRecord, IPTC.captionAbstractTag, {?description}); + } + metadata[MetadataType.iptc] = iptc; + } + } + + if (isXmpEditionSupported) { + metadata[MetadataType.xmp] = await _editXmp((descriptions) { + var modified = false; + if (editTitle) { + modified |= XMP.setAttribute( + descriptions, + XmpElements.dcTitle, + title, + namespace: XmpNamespaces.dc, + strat: XmpEditStrategy.always, + ); + } + if (editDescription) { + modified |= XMP.setAttribute( + descriptions, + XmpElements.dcDescription, + description, + namespace: XmpNamespaces.dc, + strat: XmpEditStrategy.always, + ); + } + if (modified && missingDate != null) { + editCreateDateXmp(descriptions, missingDate); + } + return modified; + }); + } + + final newFields = await metadataEditService.editMetadata(this, metadata); + if (newFields.isNotEmpty) { + dataTypes.addAll({ + EntryDataType.basic, + EntryDataType.catalog, + }); + } + + return dataTypes; + } + + // write: + // - IPTC / keywords, if IPTC exists + // - XMP / dc:subject + Future<Set<EntryDataType>> editTags(Set<String> tags) async { + final dataTypes = <EntryDataType>{}; + final metadata = <MetadataType, dynamic>{}; + + final missingDate = await _missingDateCheckAndExifEdit(dataTypes); + + if (isIptcEditionSupported) { + final iptc = await metadataFetchService.getIptc(this); + if (iptc != null) { + editIptcValues(iptc, IPTC.applicationRecord, IPTC.keywordsTag, tags); + metadata[MetadataType.iptc] = iptc; + } + } + + if (isXmpEditionSupported) { + metadata[MetadataType.xmp] = await _editXmp((descriptions) { + final modified = editTagsXmp(descriptions, tags); + if (modified && missingDate != null) { + editCreateDateXmp(descriptions, missingDate); + } + return modified; + }); + } + + final newFields = await metadataEditService.editMetadata(this, metadata); + if (newFields.isNotEmpty) { + dataTypes.add(EntryDataType.catalog); + } + return dataTypes; + } + + // write: + // - XMP / xmp:Rating + // update: + // - XMP / MicrosoftPhoto:Rating + // ignore (Windows tags, not part of Exif 2.32 spec): + // - Exif / Rating + // - Exif / RatingPercent + Future<Set<EntryDataType>> editRating(int? rating) async { + final dataTypes = <EntryDataType>{}; + final metadata = <MetadataType, dynamic>{}; + + final missingDate = await _missingDateCheckAndExifEdit(dataTypes); + + if (isXmpEditionSupported) { + metadata[MetadataType.xmp] = await _editXmp((descriptions) { + final modified = editRatingXmp(descriptions, rating); + if (modified && missingDate != null) { + editCreateDateXmp(descriptions, missingDate); + } + return modified; + }); + } + + final newFields = await metadataEditService.editMetadata(this, metadata); + if (newFields.isNotEmpty) { + dataTypes.add(EntryDataType.catalog); + } + return dataTypes; + } + + // remove: + // - trailer video + // - XMP / Container:Directory + // - XMP / GCamera:MicroVideo* + // - XMP / GCamera:MotionPhoto* + Future<Set<EntryDataType>> removeTrailerVideo() async { + final dataTypes = <EntryDataType>{}; + final metadata = <MetadataType, dynamic>{}; + + if (!isXmpEditionSupported) return dataTypes; + + final missingDate = await _missingDateCheckAndExifEdit(dataTypes); + + final newFields = await metadataEditService.removeTrailerVideo(this); + + metadata[MetadataType.xmp] = await _editXmp((descriptions) { + final modified = removeContainerXmp(descriptions); + if (modified && missingDate != null) { + editCreateDateXmp(descriptions, missingDate); + } + return modified; + }); + + newFields.addAll(await metadataEditService.editMetadata(this, metadata, autoCorrectTrailerOffset: false)); + if (newFields.isNotEmpty) { + dataTypes.add(EntryDataType.catalog); + } + return dataTypes; + } + + Future<Set<EntryDataType>> removeMetadata(Set<MetadataType> types) async { + final dataTypes = <EntryDataType>{}; + + final newFields = await metadataEditService.removeTypes(this, types); + if (newFields.isNotEmpty) { + dataTypes.addAll({ + EntryDataType.basic, + EntryDataType.aspectRatio, + EntryDataType.catalog, + EntryDataType.address, + }); + } + return dataTypes; + } + + static void editIptcValues(List<Map<String, dynamic>> iptc, int record, int tag, Set<String> values) { + iptc.removeWhere((v) => v['record'] == record && v['tag'] == tag); + iptc.add({ + 'record': record, + 'tag': tag, + 'values': values.map((v) => utf8.encode(v)).toList(), + }); + } + + @visibleForTesting + static bool editCreateDateXmp(List<XmlNode> descriptions, DateTime? date) { + return XMP.setAttribute( + descriptions, + XmpAttributes.xmpCreateDate, + date != null ? XMP.toXmpDate(date) : null, + namespace: XmpNamespaces.xmp, + strat: XmpEditStrategy.always, + ); + } + + @visibleForTesting + static bool editTagsXmp(List<XmlNode> descriptions, Set<String> tags) { + return XMP.setStringBag( + descriptions, + XmpElements.dcSubject, + tags, + namespace: XmpNamespaces.dc, + strat: XmpEditStrategy.always, + ); + } + + @visibleForTesting + static bool editRatingXmp(List<XmlNode> descriptions, int? rating) { + bool modified = false; + + modified |= XMP.setAttribute( + descriptions, + XmpElements.xmpRating, + (rating ?? 0) == 0 ? null : '$rating', + namespace: XmpNamespaces.xmp, + strat: XmpEditStrategy.always, + ); + + modified |= XMP.setAttribute( + descriptions, + XmpElements.msPhotoRating, + XMP.toMsPhotoRating(rating), + namespace: XmpNamespaces.microsoftPhoto, + strat: XmpEditStrategy.updateIfPresent, + ); + + return modified; + } + + @visibleForTesting + static bool removeContainerXmp(List<XmlNode> descriptions) { + bool modified = false; + + modified |= XMP.removeElements( + descriptions, + XmpElements.containerDirectory, + XmpNamespaces.gContainer, + ); + + modified |= + [ + XmpAttributes.gCameraMicroVideo, + XmpAttributes.gCameraMicroVideoVersion, + XmpAttributes.gCameraMicroVideoOffset, + XmpAttributes.gCameraMicroVideoPresentationTimestampUs, + XmpAttributes.gCameraMotionPhoto, + XmpAttributes.gCameraMotionPhotoVersion, + XmpAttributes.gCameraMotionPhotoPresentationTimestampUs, + ].fold<bool>(modified, (prev, name) { + return prev |= XMP.removeElements( + descriptions, + name, + XmpNamespaces.gCamera, + ); + }); + + return modified; + } + + // convenience methods + + // This method checks whether the item already has a metadata date, + // and adds a date (the file modified date) via Exif if possible. + // It returns a date if the caller needs to add it via other metadata types (e.g. XMP). + Future<DateTime?> _missingDateCheckAndExifEdit(Set<EntryDataType> dataTypes) async { + if (path == null) return null; + + // make sure entry is catalogued before we check whether is has a metadata date + if (!isCatalogued) { + await catalog(background: false, force: false, persist: true); + } + final dateMillis = catalogMetadata?.dateMillis; + if (dateMillis != null && dateMillis > 0) return null; + + late DateTime date; + try { + date = await File(path!).lastModified(); + } on FileSystemException catch (_) { + return null; + } + + if (isExifEditionSupported) { + final newFields = await metadataEditService.editExifDate(this, DateModifier.setCustom(const {MetadataField.exifDateOriginal}, date)); + if (newFields.isNotEmpty) { + dataTypes.addAll({ + EntryDataType.basic, + EntryDataType.catalog, + }); + return null; + } + } + + return date; + } + + Future<DateModifier?> _applyDateModifierToEntry(DateModifier modifier) async { + Set<MetadataField> mainMetadataDate() => {isExifEditionSupported ? MetadataField.exifDateOriginal : MetadataField.xmpXmpCreateDate}; + + switch (modifier.action) { + case DateEditAction.copyField: + DateTime? date; + final source = modifier.copyFieldSource; + if (source != null) { + switch (source) { + case DateFieldSource.fileModifiedDate: + try { + if (path != null) { + final file = File(path!); + if (await file.exists()) { + date = await file.lastModified(); + } + } + } on FileSystemException catch (_) {} + default: + date = await metadataFetchService.getDate(this, source.toMetadataField()!); + } + } + return date != null ? DateModifier.setCustom(mainMetadataDate(), date) : null; + case DateEditAction.extractFromTitle: + final date = parseUnknownDateFormat(bestTitle); + return date != null ? DateModifier.setCustom(mainMetadataDate(), date) : null; + case DateEditAction.setCustom: + case DateEditAction.copyItem: + return DateModifier.setCustom(mainMetadataDate(), modifier.setDateTime!); + case DateEditAction.shift: + case DateEditAction.remove: + return modifier; + } + } + + static const xmpCoreKey = 'xmp'; + static const xmpExtendedKey = 'extendedXmp'; + + Future<Map<String, String?>> _editXmp(bool Function(List<XmlNode> descriptions) apply) async { + final xmp = await metadataFetchService.getXmp(this); + if (xmp == null) { + throw Exception('failed to get XMP'); + } + + final xmpString = xmp.xmpString; + final extendedXmpString = xmp.extendedXmpString; + + final editedXmpString = await XMP.edit( + xmpString, + 'Aves v${device.packageVersion}', + apply, + ); + + final editedXmp = AvesXmp(xmpString: editedXmpString, extendedXmpString: extendedXmpString); + return { + xmpCoreKey: editedXmp.xmpString, + xmpExtendedKey: editedXmp.extendedXmpString, + }; + } +} + +enum DescriptionField { title, description } diff --git a/lib/model/entry/extensions/multipage.dart b/lib/model/entry/extensions/multipage.dart new file mode 100644 index 0000000..a1c84b5 --- /dev/null +++ b/lib/model/entry/extensions/multipage.dart @@ -0,0 +1,45 @@ +import 'dart:async'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/multipage.dart'; +import 'package:aves/ref/bursts.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:collection/collection.dart'; + +extension ExtraAvesEntryMultipage on AvesEntry { + bool get isMultiPage => isStack || ((catalogMetadata?.isMultiPage ?? false) && (isMotionPhoto || !isHdr)); + + bool get isStack => stackedEntries?.isNotEmpty == true; + + bool get isMotionPhoto => catalogMetadata?.isMotionPhoto ?? false; + + String? getBurstKey(List<String> patterns) { + final key = BurstPatterns.getKeyForName(filenameWithoutExtension, patterns); + return key != null ? '$directory/$key' : null; + } + + Future<MultiPageInfo?> getMultiPageInfo() async { + if (isStack) { + return MultiPageInfo( + mainEntry: this, + pages: stackedEntries! + .mapIndexed( + (index, entry) => SinglePageInfo( + index: index, + pageId: entry.id, + isDefault: index == 0, + uri: entry.uri, + mimeType: entry.mimeType, + width: entry.width, + height: entry.height, + rotationDegrees: entry.rotationDegrees, + durationMillis: entry.durationMillis, + ), + ) + .toList(), + ); + } else { + return await metadataFetchService.getMultiPageInfo(this); + } + } +} diff --git a/lib/model/entry/extensions/props.dart b/lib/model/entry/extensions/props.dart new file mode 100644 index 0000000..5595195 --- /dev/null +++ b/lib/model/entry/extensions/props.dart @@ -0,0 +1,148 @@ +import 'dart:io'; +import 'dart:ui'; + +import 'package:aves/model/app/support.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/trash.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/ref/unicode.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:intl/intl.dart'; + +extension ExtraAvesEntryProps on AvesEntry { + bool get isValid => !isMissingAtPath && sizeBytes != 0 && width > 0 && height > 0; + + // type + + String get mimeTypeAnySubtype => mimeType.replaceAll(RegExp('/.*'), '/*'); + + bool get canHaveAlpha => MimeTypes.canHaveAlpha(mimeType); + + bool get isSvg => mimeType == MimeTypes.svg; + + bool get isRaw => MimeTypes.isRaw(mimeType); + + bool get isImage => MimeTypes.isImage(mimeType); + + bool get isVideo => MimeTypes.isVideo(mimeType) || (mimeType == MimeTypes.avif && isAnimated); + + bool get isPureVideo => isVideo && !isAnimated; + + // size + + bool get useTiles => !isAnimated; + + bool get isSized => width > 0 && height > 0; + + Size videoDisplaySize(double? sar) { + final size = displaySize; + if (sar != null && sar != 1) { + final dar = displayAspectRatio * sar; + final w = size.width; + final h = size.height; + if (w >= h) return Size(w, w / dar); + if (h > w) return Size(h * dar, h); + } + return size; + } + + // text + + String getResolutionText(String locale) { + final dimensionFormatter = NumberFormat('0', locale); + final ws = dimensionFormatter.format(width); + final hs = dimensionFormatter.format(height); + return isRotated ? '$hs${AText.resolutionSeparator}$ws' : '$ws${AText.resolutionSeparator}$hs'; + } + + String get aspectRatioText { + const separator = UniChars.ratio; + if (width > 0 && height > 0) { + final gcd = width.gcd(height); + final w = width ~/ gcd; + final h = height ~/ gcd; + return isRotated ? '$h$separator$w' : '$w$separator$h'; + } else { + return '?$separator?'; + } + } + + // catalog + + bool get isGeotiff => catalogMetadata?.isGeotiff ?? false; + + bool get is360 => catalogMetadata?.is360 ?? false; + + // trash + + bool get isExpiredTrash { + final dateMillis = trashDetails?.dateMillis; + if (dateMillis == null) return false; + return DateTime.fromMillisecondsSinceEpoch(dateMillis).add(TrashMixin.binKeepDuration).isBefore(DateTime.now()); + } + + int? get trashDaysLeft { + final dateMillis = trashDetails?.dateMillis; + if (dateMillis == null) return null; + return DateTime.fromMillisecondsSinceEpoch(dateMillis).add(TrashMixin.binKeepDuration).difference(DateTime.now()).inHumanDays; + } + + // storage + + String? get storageDirectory { + if (!trashed) { + // prefer normalized paths + return directory; + } + // trash details should be present, but provide fallback path anyway + final _storagePath = trashDetails?.path ?? path; + return _storagePath != null ? pContext.dirname(_storagePath) : null; + } + + bool get isMissingAtPath { + final _storagePath = trashed ? trashDetails?.path : path; + return _storagePath != null && !File(_storagePath).existsSync(); + } + + // providers + + bool get _isVaultContent => path?.startsWith(androidFileUtils.vaultRoot) ?? false; + + bool get _isMediaStoreContent => uri.startsWith(AndroidFileUtils.mediaStoreUriRoot); + + bool get isMediaStoreMediaContent => _isMediaStoreContent && AndroidFileUtils.mediaUriPathRoots.any(uri.contains); + + // edition + + bool get canEdit => !settings.isReadOnly && path != null && !trashed && (_isMediaStoreContent || _isVaultContent); + + bool get canEditDate => canEdit && (isExifEditionSupported || isXmpEditionSupported); + + bool get canEditLocation => canEdit && (isExifEditionSupported || mimeType == MimeTypes.mp4); + + bool get canEditTitleDescription => canEdit && isXmpEditionSupported; + + bool get canEditRating => canEdit && isXmpEditionSupported; + + bool get canEditTags => canEdit && isXmpEditionSupported; + + bool get canRotate => canEdit && (isExifEditionSupported || mimeType == MimeTypes.mp4); + + bool get canFlip => canEdit && isExifEditionSupported; + + // app support + + bool get isDecodingSupported => AppSupport.canDecode(mimeType); + + bool get isExifEditionSupported => AppSupport.canEditExif(mimeType); + + bool get isIptcEditionSupported => AppSupport.canEditIptc(mimeType); + + bool get isXmpEditionSupported => AppSupport.canEditXmp(mimeType); + + bool get isMetadataRemovalSupported => AppSupport.canRemoveMetadata(mimeType); +} diff --git a/lib/model/entry/extensions/remote_flags.dart b/lib/model/entry/extensions/remote_flags.dart new file mode 100644 index 0000000..7f3d57b --- /dev/null +++ b/lib/model/entry/extensions/remote_flags.dart @@ -0,0 +1,16 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/origins.dart'; +import 'package:aves/remote/remote_origin.dart'; + +extension RemoteFlags on AvesEntry { + /// Entry salvata come remota nel DB + bool get isRemoteOnly => origin == RemoteOrigin.value; + + /// Ha collegamento remoto (almeno remoteId valido) + bool get isRemoteAvailable => (remoteId != null && remoteId!.trim().isNotEmpty); + + /// “Ibrido”: entry locale (origin=mediaStoreContent) con remote link + /// (la vuoi trattare come locale in UI/performance) + bool get isLocalAndRemote => + origin == EntryOrigins.mediaStoreContent && isRemoteAvailable; +} diff --git a/lib/model/entry/origins.dart b/lib/model/entry/origins.dart new file mode 100644 index 0000000..efc3549 --- /dev/null +++ b/lib/model/entry/origins.dart @@ -0,0 +1,6 @@ +class EntryOrigins { + static const int mediaStoreContent = 0; + static const int unknownContent = 1; + static const int file = 2; + static const int vault = 3; +} diff --git a/lib/model/entry/sort.dart b/lib/model/entry/sort.dart new file mode 100644 index 0000000..e0e5573 --- /dev/null +++ b/lib/model/entry/sort.dart @@ -0,0 +1,52 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:collection/collection.dart'; + +class AvesEntrySort { + // compare by: + // 1) title ascending + // 2) extension ascending + static int compareByName(AvesEntry a, AvesEntry b) { + final c = compareAsciiUpperCaseNatural(a.bestTitle ?? '', b.bestTitle ?? ''); + return c != 0 ? c : compareAsciiUpperCase(a.extension ?? '', b.extension ?? ''); + } + + // compare by: + // 1) date descending + // 2) name descending + static int compareByDate(AvesEntry a, AvesEntry b) { + var c = (b.bestDate ?? epoch).compareTo(a.bestDate ?? epoch); + if (c != 0) return c; + return compareByName(b, a); + } + + // compare by: + // 1) rating descending + // 2) date descending + static int compareByRating(AvesEntry a, AvesEntry b) { + final c = b.rating.compareTo(a.rating); + return c != 0 ? c : compareByDate(a, b); + } + + // compare by: + // 1) size descending + // 2) date descending + static int compareBySize(AvesEntry a, AvesEntry b) { + final c = (b.sizeBytes ?? 0).compareTo(a.sizeBytes ?? 0); + return c != 0 ? c : compareByDate(a, b); + } + + // compare by: + // 1) duration descending + // 2) date descending + static int compareByDuration(AvesEntry a, AvesEntry b) { + final c = (b.durationMillis ?? 0).compareTo(a.durationMillis ?? 0); + return c != 0 ? c : compareByDate(a, b); + } + + // compare by: + // 1) path ascending + static int compareByPath(AvesEntry a, AvesEntry b) { + return compareAsciiUpperCase(a.path ?? '', b.path ?? ''); + } +} diff --git a/lib/model/favourites.dart b/lib/model/favourites.dart new file mode 100644 index 0000000..10a3131 --- /dev/null +++ b/lib/model/favourites.dart @@ -0,0 +1,127 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +final Favourites favourites = Favourites._private(); + +class Favourites with ChangeNotifier { + Set<FavouriteRow> _rows = {}; + + Favourites._private() { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); + } + + Future<void> init() async { + _rows = await localMediaDb.loadAllFavourites(); + } + + int get count => _rows.length; + + Set<int> get all => Set.unmodifiable(_rows.map((v) => v.entryId)); + + bool isFavourite(AvesEntry entry) => _rows.any((row) => row.entryId == entry.id); + + FavouriteRow _entryToRow(AvesEntry entry) => FavouriteRow(entryId: entry.id); + + Future<void> add(Set<AvesEntry> entries) async { + final newRows = entries.map(_entryToRow).toSet(); + + await localMediaDb.addFavourites(newRows); + _rows.addAll(newRows); + + notifyListeners(); + } + + Future<void> removeEntries(Set<AvesEntry> entries) => removeIds(entries.map((entry) => entry.id).toSet()); + + Future<void> removeIds(Set<int> entryIds) async { + final removedRows = _rows.where((row) => entryIds.contains(row.entryId)).toSet(); + + await localMediaDb.removeFavourites(removedRows); + removedRows.forEach(_rows.remove); + + notifyListeners(); + } + + Future<void> clear() async { + await localMediaDb.clearFavourites(); + _rows.clear(); + + notifyListeners(); + } + + // import/export + + Map<String, List<String>>? export(CollectionSource source) { + final visibleEntries = source.visibleEntries; + final ids = all; + final paths = visibleEntries.where((entry) => ids.contains(entry.id)).map((entry) => entry.path).nonNulls.toSet(); + final byVolume = groupBy<String, StorageVolume?>(paths, androidFileUtils.getStorageVolume); + final jsonMap = Map.fromEntries( + byVolume.entries.map((kv) { + final volume = kv.key?.path; + if (volume == null) return null; + final rootLength = volume.length; + final relativePaths = kv.value.map((v) => v.substring(rootLength)).toList(); + return MapEntry(volume, relativePaths); + }).nonNulls, + ); + return jsonMap.isNotEmpty ? jsonMap : null; + } + + void import(Object jsonMap, CollectionSource source) { + if (jsonMap is! Map) { + debugPrint('failed to import favourites for jsonMap=$jsonMap'); + return; + } + + final visibleEntries = source.visibleEntries; + final foundEntries = <AvesEntry>{}; + final missedPaths = <String>{}; + jsonMap.cast<String, List>().forEach((volume, relativePaths) { + relativePaths.cast<String?>().forEach((relativePath) { + final path = pContext.join(volume, relativePath); + final entry = visibleEntries.firstWhereOrNull((entry) => entry.path == path); + if (entry != null) { + foundEntries.add(entry); + } else { + missedPaths.add(path); + } + }); + + if (foundEntries.isNotEmpty) { + add(foundEntries); + } + if (missedPaths.isNotEmpty) { + debugPrint('failed to import favourites with ${missedPaths.length} missed paths'); + } + }); + } +} + +@immutable +class FavouriteRow extends Equatable { + final int entryId; + + @override + List<Object?> get props => [entryId]; + + const FavouriteRow({ + required this.entryId, + }); + + factory FavouriteRow.fromMap(Map map) { + return FavouriteRow( + entryId: map['id'] as int, + ); + } + + Map<String, dynamic> toMap() => { + 'id': entryId, + }; +} diff --git a/lib/model/filters/aspect_ratio.dart b/lib/model/filters/aspect_ratio.dart new file mode 100644 index 0000000..594a373 --- /dev/null +++ b/lib/model/filters/aspect_ratio.dart @@ -0,0 +1,78 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/query.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +class AspectRatioFilter extends CollectionFilter { + static const type = 'aspect_ratio'; + + final double threshold; + final String op; + late final EntryPredicate _test; + + static final landscape = AspectRatioFilter(1, QueryFilter.opGreater); + static final portrait = AspectRatioFilter(1, QueryFilter.opLower); + + @override + List<Object?> get props => [threshold, op, reversed]; + + AspectRatioFilter(this.threshold, this.op, {super.reversed = false}) { + switch (op) { + case QueryFilter.opEqual: + _test = (entry) => entry.displayAspectRatio == threshold; + case QueryFilter.opLower: + _test = (entry) => entry.displayAspectRatio < threshold; + case QueryFilter.opGreater: + _test = (entry) => entry.displayAspectRatio > threshold; + } + } + + factory AspectRatioFilter.fromMap(Map<String, dynamic> json) { + return AspectRatioFilter( + json['threshold'] as double, + json['op'] as String, + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'threshold': threshold, + 'op': op, + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => true; + + @override + String get universalLabel => '$op $threshold'; + + @override + String getLabel(BuildContext context) { + final l10n = context.l10n; + if (threshold == 1) { + switch (op) { + case QueryFilter.opGreater: + return l10n.filterAspectRatioLandscapeLabel; + case QueryFilter.opLower: + return l10n.filterAspectRatioPortraitLabel; + } + } + return universalLabel; + } + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(AIcons.aspectRatio, size: size); + + @override + String get category => type; + + @override + String get key => '$type-$reversed-$threshold-$op'; +} diff --git a/lib/model/filters/container/album_group.dart b/lib/model/filters/container/album_group.dart new file mode 100644 index 0000000..6f1e77d --- /dev/null +++ b/lib/model/filters/container/album_group.dart @@ -0,0 +1,42 @@ +import 'package:aves/model/filters/container/group_base.dart'; +import 'package:aves/model/filters/container/set_or.dart'; +import 'package:aves/model/filters/filters.dart'; + +mixin AlbumBaseFilter on CollectionFilter {} + +// placeholder to pick a group, distinguishing this root filter from cancelling +class _RootAlbumGroupFilter extends DummyCollectionFilter with AlbumBaseFilter { + _RootAlbumGroupFilter._private({required super.reversed}); +} + +class AlbumGroupFilter extends GroupBaseFilter with AlbumBaseFilter { + static const type = 'album_group'; + + static AlbumBaseFilter root = _RootAlbumGroupFilter._private(reversed: false); + + AlbumGroupFilter(super.uri, super.filter, {super.reversed = false}); + + factory AlbumGroupFilter.empty(Uri uri) => AlbumGroupFilter(uri, SetOrFilter(const {})); + + static AlbumGroupFilter? fromMap(Map<String, dynamic> json) { + final props = GroupBaseFilter.fromMap(json); + if (props == null) return null; + + final (uri, filter, reversed) = props; + return AlbumGroupFilter(uri, filter, reversed: reversed); + } + + @override + String get category => type; + + // container + + @override + AlbumGroupFilter? replaceFilters(CollectionFilter? Function(CollectionFilter oldFilter) toElement) { + return AlbumGroupFilter( + uri, + filter.replaceFilters(toElement), + reversed: reversed, + ); + } +} diff --git a/lib/model/filters/container/container.dart b/lib/model/filters/container/container.dart new file mode 100644 index 0000000..08f7901 --- /dev/null +++ b/lib/model/filters/container/container.dart @@ -0,0 +1,11 @@ +import 'package:aves/model/filters/filters.dart'; + +mixin ContainerFilter<T extends CollectionFilter> on CollectionFilter { + Set<CollectionFilter> get innerFilters; + + bool containsFilter(CollectionFilterPredicate test) { + return innerFilters.any(test) || innerFilters.whereType<ContainerFilter>().any((v) => v.containsFilter(test)); + } + + T? replaceFilters(CollectionFilter? Function(CollectionFilter oldFilter) toElement); +} diff --git a/lib/model/filters/container/dynamic_album.dart b/lib/model/filters/container/dynamic_album.dart new file mode 100644 index 0000000..7d52571 --- /dev/null +++ b/lib/model/filters/container/dynamic_album.dart @@ -0,0 +1,77 @@ +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/container.dart'; +import 'package:aves/model/filters/covered/covered.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:flutter/widgets.dart'; + +// a dynamic album can act as: +// - an alias, when inner filter is a simple filter, +// - a combination, when inner filter is a container. +class DynamicAlbumFilter extends CollectionFilter with ContainerFilter, CoveredFilter, AlbumBaseFilter { + static const type = 'dynamic_album'; + + final String name; + final CollectionFilter filter; + + @override + List<Object?> get props => [name, filter, reversed]; + + DynamicAlbumFilter(this.name, this.filter, {super.reversed = false}); + + static DynamicAlbumFilter? fromMap(Map<String, dynamic> json) { + final filter = CollectionFilter.fromJson(json['filter']); + if (filter == null) return null; + + return DynamicAlbumFilter( + json['name'], + filter, + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'name': name, + 'filter': filter.toJson(), + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => filter.test; + + @override + bool get exclusiveProp => false; + + @override + String get universalLabel => name; + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) { + return allowGenericIcon ? Icon(AIcons.dynamicAlbum, size: size) : null; + } + + @override + String get category => type; + + @override + String get key => '$type-$reversed-$name'; + + // container + + @override + Set<CollectionFilter> get innerFilters => {filter}; + + @override + DynamicAlbumFilter? replaceFilters(CollectionFilter? Function(CollectionFilter oldFilter) toElement) { + final newFilter = toElement(filter); + return newFilter != null + ? DynamicAlbumFilter( + name, + newFilter, + reversed: reversed, + ) + : null; + } +} diff --git a/lib/model/filters/container/group_base.dart b/lib/model/filters/container/group_base.dart new file mode 100644 index 0000000..18bf777 --- /dev/null +++ b/lib/model/filters/container/group_base.dart @@ -0,0 +1,66 @@ +import 'package:aves/model/filters/container/container.dart'; +import 'package:aves/model/filters/container/set_or.dart'; +import 'package:aves/model/filters/covered/covered.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:flutter/widgets.dart'; + +abstract class GroupBaseFilter extends CollectionFilter with ContainerFilter, CoveredFilter { + final Uri uri; + final SetOrFilter filter; + late final String _name; + + // do not include contextual `filter` to `props` + // stringify URI because its runtime type is undetermined and different types falsify equality checks + @override + List<Object?> get props => [uri.toString(), reversed]; + + GroupBaseFilter(this.uri, this.filter, {super.reversed = false}) { + _name = FilterGrouping.getGroupName(uri) ?? ''; + } + + @override + EntryPredicate get positiveTest => filter.test; + + @override + bool get exclusiveProp => false; + + @override + String get universalLabel => _name; + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) { + return allowGenericIcon ? Icon(AIcons.group, size: size) : null; + } + + @override + String get key => '$category-$reversed-$uri'; + + // container + + @override + Set<CollectionFilter> get innerFilters => {filter}; + + // serialization + + static (Uri, SetOrFilter, bool)? fromMap(Map<String, dynamic> json) { + final filter = CollectionFilter.fromJson(json['filter']); + if (filter == null || filter is! SetOrFilter) return null; + + final uriString = json['uri']; + final uri = uriString is String ? Uri.tryParse(uriString) : null; + if (uri == null) return null; + + final reversed = json['reversed'] ?? false; + return (uri, filter, reversed); + } + + @override + Map<String, dynamic> toMap() => { + 'type': category, + 'uri': uri.toString(), + 'filter': filter.toJson(), + 'reversed': reversed, + }; +} diff --git a/lib/model/filters/container/set_and.dart b/lib/model/filters/container/set_and.dart new file mode 100644 index 0000000..da821c4 --- /dev/null +++ b/lib/model/filters/container/set_and.dart @@ -0,0 +1,89 @@ +import 'package:aves/model/filters/container/container.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/widgets.dart'; + +// `AND` op for multiple filters +// can handle containing no filters +class SetAndFilter extends CollectionFilter with ContainerFilter { + static const type = 'and'; + + late final List<CollectionFilter> _filters; + + late final EntryPredicate _test; + late final IconData? _genericIcon; + + @override + List<Object?> get props => [_filters, reversed]; + + CollectionFilter? get _first => _filters.firstOrNull; + + SetAndFilter(Set<CollectionFilter> filters, {super.reversed = false}) { + _filters = filters.toList().sorted(); + _test = (entry) => _filters.every((v) => v.test(entry)); + switch (_first) { + case StoredAlbumFilter(): + _genericIcon = AIcons.album; + case LocationFilter(level: LocationLevel.country): + _genericIcon = AIcons.country; + case LocationFilter(level: LocationLevel.state): + _genericIcon = AIcons.state; + default: + _genericIcon = null; + } + } + + static SetAndFilter? fromMap(Map<String, dynamic> json) { + final filters = (json['filters'] as List).cast<String>().map(CollectionFilter.fromJson).nonNulls.toSet(); + return SetAndFilter( + filters, + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'filters': _filters.map((v) => v.toJson()).toList(), + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => false; + + @override + String get universalLabel => _filters.map((v) => v.universalLabel).join(', '); + + @override + String getLabel(BuildContext context) => _filters.map((v) => v.getLabel(context)).join(', '); + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) { + return _genericIcon != null ? Icon(_genericIcon, size: size) : _first?.iconBuilder(context, size, allowGenericIcon: allowGenericIcon); + } + + @override + String get category => _first?.category ?? type; + + @override + String get key => '$type-$reversed-${_filters.map((v) => v.key)}'; + + // container + + @override + Set<CollectionFilter> get innerFilters => _filters.toSet(); + + @override + SetAndFilter replaceFilters(CollectionFilter? Function(CollectionFilter oldFilter) toElement) { + return SetAndFilter( + _filters.map((v) => toElement(v)).nonNulls.toSet(), + reversed: reversed, + ); + } +} diff --git a/lib/model/filters/container/set_or.dart b/lib/model/filters/container/set_or.dart new file mode 100644 index 0000000..07ad2e3 --- /dev/null +++ b/lib/model/filters/container/set_or.dart @@ -0,0 +1,89 @@ +import 'package:aves/model/filters/container/container.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/widgets.dart'; + +// `OR` op for multiple filters +// can handle containing no filters +class SetOrFilter extends CollectionFilter with ContainerFilter { + static const type = 'or'; + + late final List<CollectionFilter> _filters; + + late final EntryPredicate _test; + late final IconData? _genericIcon; + + @override + List<Object?> get props => [_filters, reversed]; + + CollectionFilter? get _first => _filters.firstOrNull; + + SetOrFilter(Set<CollectionFilter> filters, {super.reversed = false}) { + _filters = filters.toList().sorted(); + _test = (entry) => _filters.any((v) => v.test(entry)); + switch (_first) { + case StoredAlbumFilter _: + _genericIcon = AIcons.album; + case LocationFilter(level: LocationLevel.country): + _genericIcon = AIcons.country; + case LocationFilter(level: LocationLevel.state): + _genericIcon = AIcons.state; + default: + _genericIcon = null; + } + } + + static SetOrFilter? fromMap(Map<String, dynamic> json) { + final filters = (json['filters'] as List).cast<String>().map(CollectionFilter.fromJson).nonNulls.toSet(); + return SetOrFilter( + filters, + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'filters': _filters.map((v) => v.toJson()).toList(), + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => false; + + @override + String get universalLabel => _filters.map((v) => v.universalLabel).join(', '); + + @override + String getLabel(BuildContext context) => _filters.map((v) => v.getLabel(context)).join(', '); + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) { + return _genericIcon != null ? Icon(_genericIcon, size: size) : _first?.iconBuilder(context, size, allowGenericIcon: allowGenericIcon); + } + + @override + String get category => _first?.category ?? type; + + @override + String get key => '$type-$reversed-${_filters.map((v) => v.key)}'; + + // container + + @override + Set<CollectionFilter> get innerFilters => _filters.toSet(); + + @override + SetOrFilter replaceFilters(CollectionFilter? Function(CollectionFilter oldFilter) toElement) { + return SetOrFilter( + _filters.map((v) => toElement(v)).nonNulls.toSet(), + reversed: reversed, + ); + } +} diff --git a/lib/model/filters/container/tag_base_filter.dart b/lib/model/filters/container/tag_base_filter.dart new file mode 100644 index 0000000..ddcd7db --- /dev/null +++ b/lib/model/filters/container/tag_base_filter.dart @@ -0,0 +1,5 @@ +/// Interfaccia minimal per i filtri TAG. +/// Serve solo per compatibilità con tag.dart e tag_pick_page.dart. +abstract class TagBaseFilter { + String get tag; +} diff --git a/lib/model/filters/container/tag_group.dart b/lib/model/filters/container/tag_group.dart new file mode 100644 index 0000000..76b1728 --- /dev/null +++ b/lib/model/filters/container/tag_group.dart @@ -0,0 +1,42 @@ +import 'package:aves/model/filters/container/group_base.dart'; +import 'package:aves/model/filters/container/set_or.dart'; +import 'package:aves/model/filters/filters.dart'; + +mixin TagBaseFilter on CollectionFilter {} + +// placeholder to pick a group, distinguishing this root filter from cancelling +class _RootTagGroupFilter extends DummyCollectionFilter with TagBaseFilter { + _RootTagGroupFilter._private({required super.reversed}); +} + +class TagGroupFilter extends GroupBaseFilter with TagBaseFilter { + static const type = 'tag_group'; + + static TagBaseFilter root = _RootTagGroupFilter._private(reversed: false); + + TagGroupFilter(super.uri, super.filter, {super.reversed = false}); + + factory TagGroupFilter.empty(Uri uri) => TagGroupFilter(uri, SetOrFilter(const {})); + + static TagGroupFilter? fromMap(Map<String, dynamic> json) { + final props = GroupBaseFilter.fromMap(json); + if (props == null) return null; + + final (uri, filter, reversed) = props; + return TagGroupFilter(uri, filter, reversed: reversed); + } + + @override + String get category => type; + + // container + + @override + TagGroupFilter? replaceFilters(CollectionFilter? Function(CollectionFilter oldFilter) toElement) { + return TagGroupFilter( + uri, + filter.replaceFilters(toElement), + reversed: reversed, + ); + } +} diff --git a/lib/model/filters/coordinate.dart b/lib/model/filters/coordinate.dart new file mode 100644 index 0000000..f29ecfe --- /dev/null +++ b/lib/model/filters/coordinate.dart @@ -0,0 +1,84 @@ +import 'package:aves/l10n/l10n.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/enums/coordinate_format.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; +import 'package:latlong2/latlong.dart'; + +class CoordinateFilter extends CollectionFilter { + static const type = 'coordinate'; + + final LatLng sw; + final LatLng ne; + final bool minuteSecondPadding; + late final EntryPredicate _test; + + @override + List<Object?> get props => [sw, ne, reversed]; + + CoordinateFilter(this.sw, this.ne, {this.minuteSecondPadding = false, super.reversed = false}) { + _test = (entry) => GeoUtils.contains(sw, ne, entry.latLng); + } + + factory CoordinateFilter.fromMap(Map<String, dynamic> json) { + return CoordinateFilter( + LatLng.fromJson(json['sw']), + LatLng.fromJson(json['ne']), + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'sw': sw.toJson(), + 'ne': ne.toJson(), + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + String _formatBounds(String Function(LatLng latLng) s) => '${s(ne)}\n${s(sw)}'; + + @override + bool get exclusiveProp => false; + + @override + String get universalLabel { + return _formatBounds( + (latLng) => CoordinateFormat.decimal.formatWithoutDirectionality( + lookupAppLocalizations(AppLocalizations.supportedLocales.first), + latLng, + minuteSecondPadding: minuteSecondPadding, + dmsSecondDecimals: 0, + ), + ); + } + + @override + String getLabel(BuildContext context) { + return _formatBounds((latLng) { + final format = settings.coordinateFormat; + return format.format( + context, + latLng, + minuteSecondPadding: minuteSecondPadding, + dmsSecondDecimals: format == CoordinateFormat.ddm ? 2 : 0, + ); + }); + } + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(AIcons.geoBounds, size: size); + + @override + String get category => type; + + @override + String get key => '$type-$reversed-$sw-$ne'; +} diff --git a/lib/model/filters/covered/covered.dart b/lib/model/filters/covered/covered.dart new file mode 100644 index 0000000..6e4b2c6 --- /dev/null +++ b/lib/model/filters/covered/covered.dart @@ -0,0 +1,16 @@ +import 'package:aves/model/covers.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +@immutable +mixin CoveredFilter on CollectionFilter { + @override + Future<Color> color(BuildContext context) { + final customColor = covers.of(this)?.$3; + if (customColor != null) { + return SynchronousFuture(customColor); + } + return super.color(context); + } +} diff --git a/lib/model/filters/covered/location.dart b/lib/model/filters/covered/location.dart new file mode 100644 index 0000000..e5114de --- /dev/null +++ b/lib/model/filters/covered/location.dart @@ -0,0 +1,134 @@ +import 'package:aves/model/device.dart'; +import 'package:aves/model/filters/covered/covered.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/utils/emoji_utils.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/widgets.dart'; + +class LocationFilter extends CollectionFilter with CoveredFilter { + static const type = 'location'; + static const locationSeparator = ';'; + + final LocationLevel level; + late final String _location; + late final String? _code; + late final EntryPredicate _test; + + static final unlocated = LocationFilter(LocationLevel.place, ''); + static final located = unlocated.reverse(); + + bool get _isUnlocated => _location.isEmpty; + + @override + List<Object?> get props => [level, _location, _code, reversed]; + + LocationFilter(this.level, String location, {super.reversed = false}) { + final split = location.split(locationSeparator); + _location = split.isNotEmpty ? split[0] : location; + _code = split.length > 1 ? split[1] : null; + + if (_isUnlocated) { + _test = (entry) => !entry.hasGps; + } else { + switch (level) { + case LocationLevel.country: + _test = (entry) => entry.addressDetails?.countryCode == _code; + case LocationLevel.state: + _test = (entry) => entry.addressDetails?.stateCode == _code; + case LocationLevel.place: + _test = (entry) => entry.addressDetails?.place == _location; + } + } + } + + factory LocationFilter.fromMap(Map<String, dynamic> json) { + return LocationFilter( + LocationLevel.values.firstWhereOrNull((v) => v.toString() == json['level']) ?? LocationLevel.place, + json['location'], + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() { + String location = _location; + switch (level) { + case LocationLevel.country: + case LocationLevel.state: + if (_code != null) { + location = _nameAndCode; + } + case LocationLevel.place: + break; + } + return { + 'type': type, + 'level': level.toString(), + 'location': location, + 'reversed': reversed, + }; + } + + String get _nameAndCode => '$_location$locationSeparator$_code'; + + String? get code => _code; + + String get place => _location; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => true; + + @override + String get universalLabel => _location; + + @override + String getLabel(BuildContext context) => _isUnlocated ? context.l10n.filterNoLocationLabel : _location; + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) { + if (_isUnlocated) { + return Icon(AIcons.locationUnlocated, size: size); + } + switch (level) { + case LocationLevel.country: + if (_code != null) { + final flag = EmojiUtils.countryCodeToFlag(_code); + if (flag != null) { + return Text( + flag, + style: TextStyle(fontSize: size), + textScaler: TextScaler.noScaling, + ); + } + } + return Icon(AIcons.country, size: size); + case LocationLevel.state: + if (_code != null && device.canRenderSubdivisionFlagEmojis) { + final flag = EmojiUtils.stateCodeToFlag(_code); + if (flag != null) { + return Text( + flag, + style: TextStyle(fontSize: size), + textScaler: TextScaler.noScaling, + ); + } + } + return Icon(AIcons.state, size: size); + case LocationLevel.place: + return Icon(AIcons.place, size: size); + } + } + + @override + String get category => type; + + @override + String get key => '$type-$reversed-$level-$code-$place'; +} + +enum LocationLevel { place, state, country } diff --git a/lib/model/filters/covered/stored_album.dart b/lib/model/filters/covered/stored_album.dart new file mode 100644 index 0000000..74c7272 --- /dev/null +++ b/lib/model/filters/covered/stored_album.dart @@ -0,0 +1,142 @@ +import 'package:aves/model/covers.dart'; +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/covered/covered.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/widgets/common/identity/aves_icons.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +class StoredAlbumFilter extends CollectionFilter with CoveredFilter, AlbumBaseFilter { + static const type = 'album'; + + final String album; + final String? displayName; + late final EntryPredicate _test; + + // ✅ Canonical key = basename (ultimo segmento del path) + // Serve per: + // - unire locale+remoto nello stesso album + // - deduplicare filtri (pinned/hidden/covers) in modo coerente + late final String _canonicalKey; + + // do not include contextual `displayName` to `props` + @override + List<Object?> get props => [_canonicalKey, reversed]; + + StoredAlbumFilter(this.album, this.displayName, {super.reversed = false}) { + _canonicalKey = _albumKey(album); + + // ✅ Match by basename: locale e remoto con stesso nome cartella finiscono nello stesso album + _test = (entry) { + final dir = entry.directory; + if (dir == null || dir.isEmpty) return false; + return _albumKey(dir) == _canonicalKey; + }; + } + + /// Extract album key from a directory path (local or remote). + /// - "/storage/.../DCIM/Trip" -> "Trip" + /// - "/photos/Fabio/original/Trip" -> "Trip" + String _albumKey(String path) { + final normalized = path.replaceAll('\\', '/'); + final parts = pContext.split(normalized).where((s) => s.isNotEmpty).toList(); + return parts.isEmpty ? normalized : parts.last; + } + + factory StoredAlbumFilter.fromMap(Map<String, dynamic> json) { + return StoredAlbumFilter( + json['album'], + json['uniqueName'], + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'album': album, + 'uniqueName': displayName, + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => true; + + @override + String get universalLabel => displayName ?? _canonicalKey; + + // ✅ Tooltip: niente path completo del server, resta leggibile + @override + String getTooltip(BuildContext context) => isVault ? super.getTooltip(context) : (displayName ?? _canonicalKey); + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) { + return IconUtils.getAlbumIcon( + context: context, + albumPath: album, + size: size, + ) ?? + (allowGenericIcon ? Icon(AIcons.album, size: size) : null); + } + + @override + Future<Color> color(BuildContext context) { + // custom color has precedence over others, even custom app color + final customColor = covers.of(this)?.$3; + if (customColor != null) return SynchronousFuture(customColor); + + final colors = context.read<AvesColorsData>(); + // do not use async/await and rely on `SynchronousFuture` + // to prevent rebuilding of the `FutureBuilder` listening on this future + final albumType = covers.effectiveAlbumType(album); + switch (albumType) { + case AlbumType.regular: + case AlbumType.vault: + break; + case AlbumType.app: + final appColor = colors.appColor(album); + if (appColor != null) return appColor; + case AlbumType.camera: + return SynchronousFuture(colors.albumCamera); + case AlbumType.download: + return SynchronousFuture(colors.albumDownload); + case AlbumType.screenRecordings: + return SynchronousFuture(colors.albumScreenRecordings); + case AlbumType.screenshots: + return SynchronousFuture(colors.albumScreenshots); + case AlbumType.videoCaptures: + return SynchronousFuture(colors.albumVideoCaptures); + } + return super.color(context); + } + + @override + String get category => type; + + // key is expected by test driver + // ✅ anche questa deve essere canonica, altrimenti duplicati/instabilità in UI + @override + String get key => '$type-$reversed-$_canonicalKey'; + + StorageVolume? get storageVolume => androidFileUtils.getStorageVolume(album); + + bool get canRename { + if (isVault) return true; + + // do not allow renaming volume root + final dir = androidFileUtils.relativeDirectoryFromPath(album); + return dir != null && dir.relativeDir.isNotEmpty; + } + + bool get isVault => vaults.isVault(album); +} diff --git a/lib/model/filters/covered/tag.dart b/lib/model/filters/covered/tag.dart new file mode 100644 index 0000000..c46fe83 --- /dev/null +++ b/lib/model/filters/covered/tag.dart @@ -0,0 +1,61 @@ +import 'package:aves/model/filters/container/tag_group.dart'; +import 'package:aves/model/filters/covered/covered.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +class TagFilter extends CollectionFilter with CoveredFilter, TagBaseFilter { + static const type = 'tag'; + + final String tag; + late final EntryPredicate _test; + + @override + List<Object?> get props => [tag, reversed]; + + TagFilter(this.tag, {super.reversed = false}) { + if (tag.isEmpty) { + _test = (entry) => entry.tags.isEmpty; + } else { + _test = (entry) => entry.tags.contains(tag); + } + } + + factory TagFilter.fromMap(Map<String, dynamic> json) { + return TagFilter( + json['tag'], + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'tag': tag, + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => false; + + @override + String get universalLabel => tag; + + @override + String getLabel(BuildContext context) => tag.isEmpty ? context.l10n.filterNoTagLabel : tag; + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) { + return allowGenericIcon ? Icon(tag.isEmpty ? AIcons.tagUntagged : AIcons.tag, size: size) : null; + } + + @override + String get category => type; + + @override + String get key => '$type-$reversed-$tag'; +} diff --git a/lib/model/filters/date.dart b/lib/model/filters/date.dart new file mode 100644 index 0000000..64706a7 --- /dev/null +++ b/lib/model/filters/date.dart @@ -0,0 +1,134 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/format.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; + +class DateFilter extends CollectionFilter { + static const type = 'date'; + + final DateLevel level; + late final DateTime? date; + late final DateTime _effectiveDate; + late final EntryPredicate _test; + + static final onThisDay = DateFilter(DateLevel.md, null); + + @override + List<Object?> get props => [level, date, reversed]; + + DateFilter(this.level, this.date, {super.reversed = false}) { + _effectiveDate = date ?? DateTime.now(); + switch (level) { + case DateLevel.y: + _test = (entry) => entry.bestDate?.isAtSameYearAs(_effectiveDate) ?? false; + case DateLevel.ym: + _test = (entry) => entry.bestDate?.isAtSameMonthAs(_effectiveDate) ?? false; + case DateLevel.ymd: + _test = (entry) => entry.bestDate?.isAtSameDayAs(_effectiveDate) ?? false; + case DateLevel.md: + final month = _effectiveDate.month; + final day = _effectiveDate.day; + _test = (entry) { + final bestDate = entry.bestDate; + return bestDate != null && bestDate.month == month && bestDate.day == day; + }; + case DateLevel.m: + final month = _effectiveDate.month; + _test = (entry) => entry.bestDate?.month == month; + case DateLevel.d: + final day = _effectiveDate.day; + _test = (entry) => entry.bestDate?.day == day; + } + } + + factory DateFilter.fromMap(Map<String, dynamic> json) { + final dateString = json['date'] as String?; + return DateFilter( + DateLevel.values.firstWhereOrNull((v) => v.toString() == json['level']) ?? DateLevel.ymd, + dateString != null ? DateTime.tryParse(dateString) : null, + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'level': level.toString(), + 'date': date?.toIso8601String(), + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => true; + + @override + bool isCompatible(CollectionFilter other) { + if (other is DateFilter) { + if (reversed != other.reversed && this == other.reverse()) return false; + return reversed || other.reversed || isCompatibleLevel(level, other.level); + } else { + return true; + } + } + + static bool isCompatibleLevel(DateLevel a, DateLevel b) { + switch (a) { + case DateLevel.y: + return {DateLevel.md, DateLevel.m, DateLevel.d}.contains(b); + case DateLevel.ym: + return DateLevel.d == b; + case DateLevel.ymd: + return false; + case DateLevel.md: + return DateLevel.y == b; + case DateLevel.m: + return {DateLevel.y, DateLevel.d}.contains(b); + case DateLevel.d: + return {DateLevel.y, DateLevel.ym, DateLevel.m}.contains(b); + } + } + + @override + String get universalLabel => _effectiveDate.toIso8601String(); + + @override + String getLabel(BuildContext context) { + final locale = context.locale; + switch (level) { + case DateLevel.y: + return DateFormat.y(locale).format(_effectiveDate); + case DateLevel.ym: + return DateFormat.yMMM(locale).format(_effectiveDate); + case DateLevel.ymd: + return formatDay(_effectiveDate, locale); + case DateLevel.md: + if (date != null) { + return DateFormat.MMMd(locale).format(_effectiveDate); + } else { + return context.l10n.filterOnThisDayLabel; + } + case DateLevel.m: + return DateFormat.MMMM(locale).format(_effectiveDate); + case DateLevel.d: + return DateFormat.d(locale).format(_effectiveDate); + } + } + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(AIcons.date, size: size); + + @override + String get category => type; + + @override + String get key => '$type-$reversed-$level-$date'; +} + +enum DateLevel { y, ym, ymd, md, m, d } diff --git a/lib/model/filters/directory_filter.dart b/lib/model/filters/directory_filter.dart new file mode 100644 index 0000000..b9705ea --- /dev/null +++ b/lib/model/filters/directory_filter.dart @@ -0,0 +1,41 @@ +import 'dart:convert'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/path.dart'; + +class DirectoryFilter extends CollectionFilter { + final String directory; + + const DirectoryFilter(this.directory, {super.reversed = false}); + + @override + String get category => PathFilter.type; + + @override + bool get exclusiveProp => false; + + @override + String get key => directory; + + @override + EntryPredicate get positiveTest => (AvesEntry entry) { + final p = entry.path ?? ''; + return p.startsWith(directory); + }; + + @override + String get universalLabel => directory; + + @override + Map<String, dynamic> toMap() => { + 'type': category, + 'directory': directory, + 'reversed': reversed, + }; + + @override + String toJson() => jsonEncode(toMap()); + + @override + List<Object?> get props => [category, directory, reversed]; +} diff --git a/lib/model/filters/favourite.dart b/lib/model/filters/favourite.dart new file mode 100644 index 0000000..a41e7e9 --- /dev/null +++ b/lib/model/filters/favourite.dart @@ -0,0 +1,61 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/favourites.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +class FavouriteFilter extends CollectionFilter { + static const type = 'favourite'; + + static bool _test(AvesEntry entry) => entry.isFavourite; + + static const instance = FavouriteFilter._private(); + static const instanceReversed = FavouriteFilter._private(reversed: true); + + @override + List<Object?> get props => [reversed]; + + const FavouriteFilter._private({super.reversed = false}); + + factory FavouriteFilter.fromMap(Map<String, dynamic> json) { + final reversed = json['reversed'] ?? false; + return reversed ? instanceReversed : instance; + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => false; + + @override + String get universalLabel => type; + + @override + String getLabel(BuildContext context) => context.l10n.filterFavouriteLabel; + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(AIcons.favourite, size: size); + + @override + Future<Color> color(BuildContext context) { + final colors = context.read<AvesColorsData>(); + return SynchronousFuture(colors.favourite); + } + + @override + String get category => type; + + @override + String get key => '$type-$reversed'; +} diff --git a/lib/model/filters/filters.dart b/lib/model/filters/filters.dart new file mode 100644 index 0000000..0ebabaa --- /dev/null +++ b/lib/model/filters/filters.dart @@ -0,0 +1,218 @@ +import 'dart:convert'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/aspect_ratio.dart'; +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/container/set_and.dart'; +import 'package:aves/model/filters/container/set_or.dart'; +import 'package:aves/model/filters/container/tag_group.dart'; +import 'package:aves/model/filters/coordinate.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/date.dart'; +import 'package:aves/model/filters/favourite.dart'; +import 'package:aves/model/filters/mime.dart'; +import 'package:aves/model/filters/missing.dart'; +import 'package:aves/model/filters/path.dart'; +import 'package:aves/model/filters/placeholder.dart'; +import 'package:aves/model/filters/query.dart'; +import 'package:aves/model/filters/rating.dart'; +import 'package:aves/model/filters/recent.dart'; +import 'package:aves/model/filters/trash.dart'; +import 'package:aves/model/filters/type.dart'; +import 'package:aves/model/filters/weekday.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:collection/collection.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +@immutable +abstract class CollectionFilter extends Equatable implements Comparable<CollectionFilter> { + static const List<String> categoryOrder = [ + TrashFilter.type, + QueryFilter.type, + SetAndFilter.type, + SetOrFilter.type, + MimeFilter.type, + AlbumGroupFilter.type, + TagGroupFilter.type, + DynamicAlbumFilter.type, + StoredAlbumFilter.type, + TypeFilter.type, + RecentlyAddedFilter.type, + DateFilter.type, + WeekDayFilter.type, + LocationFilter.type, + CoordinateFilter.type, + FavouriteFilter.type, + RatingFilter.type, + TagFilter.type, + AspectRatioFilter.type, + MissingFilter.type, + PathFilter.type, + ]; + + final bool reversed; + + const CollectionFilter({required this.reversed}); + + static CollectionFilter? _fromMap(Map<String, dynamic> jsonMap) { + final type = jsonMap['type']; + switch (type) { + case AlbumGroupFilter.type: + return AlbumGroupFilter.fromMap(jsonMap); + case TagGroupFilter.type: + return TagGroupFilter.fromMap(jsonMap); + case AspectRatioFilter.type: + return AspectRatioFilter.fromMap(jsonMap); + case CoordinateFilter.type: + return CoordinateFilter.fromMap(jsonMap); + case DateFilter.type: + return DateFilter.fromMap(jsonMap); + case DynamicAlbumFilter.type: + return DynamicAlbumFilter.fromMap(jsonMap); + case FavouriteFilter.type: + return FavouriteFilter.fromMap(jsonMap); + case LocationFilter.type: + return LocationFilter.fromMap(jsonMap); + case MimeFilter.type: + return MimeFilter.fromMap(jsonMap); + case MissingFilter.type: + return MissingFilter.fromMap(jsonMap); + case SetAndFilter.type: + return SetAndFilter.fromMap(jsonMap); + case SetOrFilter.type: + return SetOrFilter.fromMap(jsonMap); + case PathFilter.type: + return PathFilter.fromMap(jsonMap); + case PlaceholderFilter.type: + return PlaceholderFilter.fromMap(jsonMap); + case QueryFilter.type: + return QueryFilter.fromMap(jsonMap); + case RatingFilter.type: + return RatingFilter.fromMap(jsonMap); + case RecentlyAddedFilter.type: + return RecentlyAddedFilter.fromMap(jsonMap); + case StoredAlbumFilter.type: + return StoredAlbumFilter.fromMap(jsonMap); + case TagFilter.type: + return TagFilter.fromMap(jsonMap); + case TypeFilter.type: + return TypeFilter.fromMap(jsonMap); + case TrashFilter.type: + return TrashFilter.fromMap(jsonMap); + case WeekDayFilter.type: + return WeekDayFilter.fromMap(jsonMap); + } + debugPrint('failed to deserialize filter from JSON map=$jsonMap'); + return null; + } + + static CollectionFilter? fromJson(String? jsonString) { + if (jsonString == null || jsonString.isEmpty) return null; + + try { + final jsonMap = jsonDecode(jsonString); + if (jsonMap is Map<String, dynamic>) { + return _fromMap(jsonMap); + } + debugPrint('failed to parse filter from json=$jsonString'); + } catch (error) { + // no need for stack + debugPrint('failed to parse filter from json=$jsonString error=$error'); + } + return null; + } + + Map<String, dynamic> toMap(); + + String toJson() => jsonEncode(toMap()); + + EntryPredicate get positiveTest; + + EntryPredicate get test => reversed ? (v) => !positiveTest(v) : positiveTest; + + CollectionFilter reverse() => _fromMap(toMap()..['reversed'] = !reversed)!; + + bool get exclusiveProp; + + bool isCompatible(CollectionFilter other) { + if (category != other.category) return true; + if (!reversed && !other.reversed) return !exclusiveProp; + if (reversed && other.reversed) return true; + if (this == other.reverse()) return false; + return true; + } + + String get universalLabel; + + String getLabel(BuildContext context) => universalLabel; + + String getTooltip(BuildContext context) => getLabel(context); + + bool matchLabel(BuildContext context, String query) => getLabel(context).toUpperCase().contains(query); + + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => null; + + Future<Color> color(BuildContext context) { + final colors = context.read<AvesColorsData>(); + return SynchronousFuture(colors.fromString(getLabel(context))); + } + + String get category; + + // to be used as widget key + String get key; + + int get displayPriority => categoryOrder.indexOf(category); + + @override + int compareTo(CollectionFilter other) { + final c = displayPriority.compareTo(other.displayPriority); + // assume we compare context-independent labels + return c != 0 ? c : compareAsciiUpperCaseNatural(universalLabel, other.universalLabel); + } +} + +@immutable +class FilterGridItem<T extends CollectionFilter> with EquatableMixin { + final T filter; + final AvesEntry? entry; + + @override + List<Object?> get props => [filter, entry?.uri]; + + const FilterGridItem(this.filter, this.entry); +} + +typedef EntryPredicate = bool Function(AvesEntry entry); +typedef CollectionFilterPredicate = bool Function(CollectionFilter filter); + +abstract class DummyCollectionFilter extends CollectionFilter { + const DummyCollectionFilter({required super.reversed}); + + @override + String get category => throw UnimplementedError(); + + @override + bool get exclusiveProp => throw UnimplementedError(); + + @override + String get key => throw UnimplementedError(); + + @override + EntryPredicate get positiveTest => throw UnimplementedError(); + + @override + List<Object?> get props => throw UnimplementedError(); + + @override + Map<String, dynamic> toMap() => throw UnimplementedError(); + + @override + String get universalLabel => throw UnimplementedError(); +} diff --git a/lib/model/filters/mime.dart b/lib/model/filters/mime.dart new file mode 100644 index 0000000..da5b900 --- /dev/null +++ b/lib/model/filters/mime.dart @@ -0,0 +1,105 @@ +import 'dart:async'; + +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/utils/mime_utils.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +class MimeFilter extends CollectionFilter { + static const type = 'mime'; + + final String mime; + late final String _label; + late final IconData _icon; + late final EntryPredicate _test; + + static final image = MimeFilter(MimeTypes.anyImage); + static final video = MimeFilter(MimeTypes.anyVideo); + + @override + List<Object?> get props => [mime, reversed]; + + MimeFilter(this.mime, {super.reversed = false}) { + IconData? icon; + var lowMime = mime.toLowerCase(); + if (lowMime.endsWith('/*')) { + lowMime = lowMime.substring(0, lowMime.length - 2); + _test = (entry) => entry.mimeType.startsWith(lowMime); + _label = lowMime.toUpperCase(); + if (mime == MimeTypes.anyImage) { + icon = AIcons.image; + } else if (mime == MimeTypes.anyVideo) { + icon = AIcons.video; + } + } else { + _test = (entry) => entry.mimeType == lowMime; + _label = MimeUtils.displayType(lowMime); + } + _icon = icon ?? AIcons.vector; + } + + factory MimeFilter.fromMap(Map<String, dynamic> json) { + return MimeFilter( + json['mime'], + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'mime': mime, + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => true; + + @override + String get universalLabel => _label; + + @override + String getLabel(BuildContext context) { + final l10n = context.l10n; + return switch (mime) { + MimeTypes.anyImage => l10n.filterMimeImageLabel, + MimeTypes.anyVideo => l10n.filterMimeVideoLabel, + _ => _label, + }; + } + + @override + String getTooltip(BuildContext context) { + return '${getLabel(context)} ($mime)'; + } + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(_icon, size: size); + + @override + Future<Color> color(BuildContext context) { + final colors = context.read<AvesColorsData>(); + switch (mime) { + case MimeTypes.anyImage: + return SynchronousFuture(colors.image); + case MimeTypes.anyVideo: + return SynchronousFuture(colors.video); + default: + return SynchronousFuture(colors.fromString(_label)); + } + } + + @override + String get category => type; + + @override + String get key => '$type-$reversed-$mime'; +} diff --git a/lib/model/filters/missing.dart b/lib/model/filters/missing.dart new file mode 100644 index 0000000..ab93155 --- /dev/null +++ b/lib/model/filters/missing.dart @@ -0,0 +1,80 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +class MissingFilter extends CollectionFilter { + static const type = 'missing'; + + static const _date = 'date'; + static const _fineAddress = 'fine_address'; + static const _title = 'title'; + + final String metadataType; + late final IconData _icon; + late final EntryPredicate _test; + + static final date = MissingFilter._private(_date); + static final fineAddress = MissingFilter._private(_fineAddress); + static final title = MissingFilter._private(_title); + + @override + List<Object?> get props => [metadataType, reversed]; + + MissingFilter._private(this.metadataType, {super.reversed = false}) { + switch (metadataType) { + case _date: + _test = (entry) => (entry.catalogMetadata?.dateMillis ?? 0) == 0; + _icon = AIcons.dateUndated; + case _fineAddress: + _test = (entry) => entry.hasGps && !entry.hasFineAddress; + _icon = AIcons.locationUnlocated; + case _title: + _test = (entry) => (entry.catalogMetadata?.xmpTitle ?? '').isEmpty; + _icon = AIcons.descriptionUntitled; + } + } + + factory MissingFilter.fromMap(Map<String, dynamic> json) { + return MissingFilter._private( + json['metadataType'], + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'metadataType': metadataType, + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => false; + + @override + String get universalLabel => metadataType; + + @override + String getLabel(BuildContext context) { + final l10n = context.l10n; + return switch (metadataType) { + _date => l10n.filterNoDateLabel, + _fineAddress => l10n.filterNoAddressLabel, + _title => l10n.filterNoTitleLabel, + _ => metadataType, + }; + } + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(_icon, size: size); + + @override + String get category => type; + + @override + String get key => '$type-$reversed-$metadataType'; +} diff --git a/lib/model/filters/path.dart b/lib/model/filters/path.dart new file mode 100644 index 0000000..400485a --- /dev/null +++ b/lib/model/filters/path.dart @@ -0,0 +1,74 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:flutter/widgets.dart'; + +class PathFilter extends CollectionFilter { + static const type = 'path'; + + // including trailing separator + late final String path; + + // without trailing separator + late final String _rootAlbum; + + late final EntryPredicate _test; + + @override + List<Object?> get props => [path, reversed]; + + PathFilter(String path, {super.reversed = false}) { + this.path = path.endsWith(pContext.separator) ? path : '$path${pContext.separator}'; + _rootAlbum = this.path.substring(0, this.path.length - 1); + _test = (entry) { + final dir = entry.directory; + if (dir == null) return false; + // avoid string building in most cases + return dir.startsWith(_rootAlbum) && '$dir${pContext.separator}'.startsWith(this.path); + }; + } + + factory PathFilter.fromMap(Map<String, dynamic> json) { + return PathFilter( + json['path'], + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'path': path, + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => true; + + @override + String get universalLabel => path; + + @override + String getLabel(BuildContext context) { + final _directory = androidFileUtils.relativeDirectoryFromPath(path); + if (_directory == null) return universalLabel; + if (_directory.relativeDir.isEmpty) { + return _directory.getVolumeDescription(context); + } + return pContext.split(_directory.relativeDir).last; + } + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(AIcons.path, size: size); + + @override + String get category => type; + + @override + String get key => '$type-$reversed-$path'; +} diff --git a/lib/model/filters/placeholder.dart b/lib/model/filters/placeholder.dart new file mode 100644 index 0000000..e200742 --- /dev/null +++ b/lib/model/filters/placeholder.dart @@ -0,0 +1,107 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/catalog.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +class PlaceholderFilter extends CollectionFilter { + static const type = 'placeholder'; + + static const _country = 'country'; + static const _state = 'state'; + static const _place = 'place'; + + final String placeholder; + late final IconData _icon; + + static final country = PlaceholderFilter._private(_country); + static final state = PlaceholderFilter._private(_state); + static final place = PlaceholderFilter._private(_place); + + @override + List<Object?> get props => [placeholder]; + + PlaceholderFilter._private(this.placeholder) : super(reversed: false) { + switch (placeholder) { + case _country: + _icon = AIcons.country; + case _state: + _icon = AIcons.state; + case _place: + _icon = AIcons.place; + } + } + + factory PlaceholderFilter.fromMap(Map<String, dynamic> json) { + return PlaceholderFilter._private( + json['placeholder'], + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'placeholder': placeholder, + }; + + Future<String?> toTag(AvesEntry entry) async { + switch (placeholder) { + case _country: + case _state: + case _place: + if (!entry.isCatalogued) { + await entry.catalog(background: false, force: false, persist: true); + } + if (!entry.hasGps) return null; + + if (!entry.hasFineAddress) { + await entry.locate(background: false, force: false, geocoderLocale: settings.appliedLocale); + } + final address = entry.addressDetails; + if (address == null) return null; + + switch (placeholder) { + case _country: + return address.countryName; + case _state: + return address.stateName; + case _place: + return address.place; + } + } + return null; + } + + @override + EntryPredicate get positiveTest => + (entry) => throw Exception('this is not a test'); + + @override + bool get exclusiveProp => false; + + @override + String get universalLabel => placeholder; + + @override + String getLabel(BuildContext context) { + final l10n = context.l10n; + return switch (placeholder) { + _country => l10n.tagPlaceholderCountry, + _state => l10n.tagPlaceholderState, + _place => l10n.tagPlaceholderPlace, + _ => placeholder, + }; + } + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(_icon, size: size); + + @override + String get category => type; + + @override + String get key => '$type-$reversed-$placeholder'; +} diff --git a/lib/model/filters/query.dart b/lib/model/filters/query.dart new file mode 100644 index 0000000..a29df5f --- /dev/null +++ b/lib/model/filters/query.dart @@ -0,0 +1,225 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +class QueryFilter extends CollectionFilter { + static const type = 'query'; + + static final exactRegex = RegExp('^"(.*)"\$'); + static final regexRegex = RegExp('^/(.*)/\$'); + + final String query; + final bool colorful, live; + late final EntryPredicate _test; + + @override + List<Object?> get props => [query, live, reversed]; + + static final _fieldPattern = RegExp(r'(.+)([=<>])(.+)'); + static final _fileSizePattern = RegExp(r'(\d+)([KMG])?'); + static const keyContentExtension = 'EXT'; + static const keyContentId = 'ID'; + static const keyContentYear = 'YEAR'; + static const keyContentMonth = 'MONTH'; + static const keyContentDay = 'DAY'; + static const keyContentWidth = 'WIDTH'; + static const keyContentHeight = 'HEIGHT'; + static const keyContentSize = 'SIZE'; + static const opEqual = '='; + static const opLower = '<'; + static const opGreater = '>'; + + QueryFilter(this.query, {this.colorful = true, this.live = false, super.reversed = false}) { + // allow regex queries wrapped with `/.../` + var matches = regexRegex.allMatches(query); + if (matches.length == 1) { + try { + final regex = RegExp(matches.first.group(1)!); + _test = (entry) { + final title = entry.bestTitle; + return title != null && regex.hasMatch(title); + }; + } on FormatException catch (_) { + // invalid regex + _test = (entry) => false; + } + return; + } + + var upQuery = query.toUpperCase(); + + final test = fieldTest(upQuery); + if (test != null) { + _test = test; + return; + } + + // allow NOT queries starting with `-` + final not = upQuery.startsWith('-'); + if (not) { + upQuery = upQuery.substring(1); + } + + // allow untrimmed queries wrapped with `"..."` + matches = exactRegex.allMatches(upQuery); + if (matches.length == 1) { + upQuery = matches.first.group(1)!; + } + + // default to title search + bool testTitle(AvesEntry entry) => entry.bestTitle?.toUpperCase().contains(upQuery) == true; + _test = not ? (entry) => !testTitle(entry) : testTitle; + } + + factory QueryFilter.fromMap(Map<String, dynamic> json) { + return QueryFilter( + json['query'], + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'query': query, + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => false; + + @override + String get universalLabel => query; + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(AIcons.text, fill: 1, size: size); + + @override + Future<Color> color(BuildContext context) { + if (colorful) { + return super.color(context); + } + + final colors = context.read<AvesColorsData>(); + return SynchronousFuture(colors.neutral); + } + + @override + String get category => type; + + @override + String get key => '$type-$reversed-$query'; + + EntryPredicate? fieldTest(String upQuery) { + var match = _fieldPattern.firstMatch(upQuery); + if (match == null) return null; + + final key = match.group(1)?.trim(); + final op = match.group(2)?.trim(); + var valueString = match.group(3)?.trim(); + if (key == null || op == null || valueString == null) return null; + + final valueInt = int.tryParse(valueString); + + switch (key) { + case keyContentExtension: + if (op == opEqual) { + final extension = '.$valueString'; + return (entry) => entry.extension?.toUpperCase() == extension; + } + case keyContentId: + if (valueInt == null) return null; + if (op == opEqual) { + return (entry) => entry.contentId == valueInt; + } + case keyContentYear: + if (valueInt == null) return null; + switch (op) { + case opEqual: + return (entry) => (entry.bestDate?.year ?? 0) == valueInt; + case opLower: + return (entry) => (entry.bestDate?.year ?? 0) < valueInt; + case opGreater: + return (entry) => (entry.bestDate?.year ?? 0) > valueInt; + } + case keyContentMonth: + if (valueInt == null) return null; + switch (op) { + case opEqual: + return (entry) => (entry.bestDate?.month ?? 0) == valueInt; + case opLower: + return (entry) => (entry.bestDate?.month ?? 0) < valueInt; + case opGreater: + return (entry) => (entry.bestDate?.month ?? 0) > valueInt; + } + case keyContentDay: + if (valueInt == null) return null; + switch (op) { + case opEqual: + return (entry) => (entry.bestDate?.day ?? 0) == valueInt; + case opLower: + return (entry) => (entry.bestDate?.day ?? 0) < valueInt; + case opGreater: + return (entry) => (entry.bestDate?.day ?? 0) > valueInt; + } + case keyContentWidth: + if (valueInt == null) return null; + switch (op) { + case opEqual: + return (entry) => entry.displaySize.width == valueInt; + case opLower: + return (entry) => entry.displaySize.width < valueInt; + case opGreater: + return (entry) => entry.displaySize.width > valueInt; + } + case keyContentHeight: + if (valueInt == null) return null; + switch (op) { + case opEqual: + return (entry) => entry.displaySize.height == valueInt; + case opLower: + return (entry) => entry.displaySize.height < valueInt; + case opGreater: + return (entry) => entry.displaySize.height > valueInt; + } + case keyContentSize: + match = _fileSizePattern.firstMatch(valueString); + if (match == null) return null; + + valueString = match.group(1)?.trim(); + if (valueString == null) return null; + final valueInt = int.tryParse(valueString); + if (valueInt == null) return null; + + var bytes = valueInt; + final multiplierString = match.group(2)?.trim(); + switch (multiplierString) { + case 'K': + bytes *= kilo; + case 'M': + bytes *= mega; + case 'G': + bytes *= giga; + } + + switch (op) { + case opEqual: + return (entry) => (entry.sizeBytes ?? 0) == bytes; + case opLower: + return (entry) => (entry.sizeBytes ?? 0) < bytes; + case opGreater: + return (entry) => (entry.sizeBytes ?? 0) > bytes; + } + } + + return null; + } +} diff --git a/lib/model/filters/rating.dart b/lib/model/filters/rating.dart new file mode 100644 index 0000000..35719e7 --- /dev/null +++ b/lib/model/filters/rating.dart @@ -0,0 +1,96 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/ref/unicode.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +class RatingFilter extends CollectionFilter { + static const type = 'rating'; + + final int rating; + final String op; + late final EntryPredicate _test; + + static const opEqual = '='; + static const opOrLower = '<='; + static const opOrGreater = '>='; + + @override + List<Object?> get props => [rating, op, reversed]; + + RatingFilter(this.rating, {this.op = opEqual, super.reversed = false}) { + _test = switch (op) { + opOrLower => (entry) => entry.rating <= rating && entry.rating > 0, + opOrGreater => (entry) => entry.rating >= rating, + opEqual || _ => (entry) => entry.rating == rating, + }; + } + + RatingFilter copyWith(String op) => RatingFilter( + rating, + op: op, + reversed: reversed, + ); + + factory RatingFilter.fromMap(Map<String, dynamic> json) { + return RatingFilter( + json['rating'] ?? 0, + op: json['op'] ?? opEqual, + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'rating': rating, + 'op': op, + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => true; + + @override + String get universalLabel => '$op $rating'; + + @override + String getLabel(BuildContext context) => switch (op) { + opOrLower || opOrGreater => '${UniChars.whiteMediumStar} ${formatRatingRange(context, rating, op)}', + opEqual || _ => formatRating(context, rating), + }; + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) { + return switch (rating) { + -1 => Icon(AIcons.ratingRejected, size: size), + 0 => Icon(AIcons.ratingUnrated, size: size), + _ => null, + }; + } + + @override + String get category => type; + + @override + String get key => '$type-$reversed-$rating-$op'; + + static String formatRating(BuildContext context, int rating) { + return switch (rating) { + -1 => context.l10n.filterRatingRejectedLabel, + 0 => context.l10n.filterNoRatingLabel, + _ => UniChars.whiteMediumStar * rating, + }; + } + + static String formatRatingRange(BuildContext context, int rating, String op) { + return switch (op) { + opOrLower => '1~$rating', + opOrGreater => '$rating~5', + opEqual || _ => '$rating', + }; + } +} diff --git a/lib/model/filters/recent.dart b/lib/model/filters/recent.dart new file mode 100644 index 0000000..13c8b3b --- /dev/null +++ b/lib/model/filters/recent.dart @@ -0,0 +1,61 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +class RecentlyAddedFilter extends CollectionFilter { + static const type = 'recently_added'; + + static late EntryPredicate _test; + + static final instance = RecentlyAddedFilter._private(); + static final instanceReversed = RecentlyAddedFilter._private(reversed: true); + + static late int nowSecs; + + static void updateNow() { + nowSecs = DateTime.now().millisecondsSinceEpoch ~/ 1000; + _test = (entry) => (nowSecs - (entry.dateAddedSecs ?? 0)) < _dayInSecs; + } + + static const _dayInSecs = 24 * 60 * 60; + + @override + List<Object?> get props => [reversed]; + + RecentlyAddedFilter._private({super.reversed = false}) { + updateNow(); + } + + factory RecentlyAddedFilter.fromMap(Map<String, dynamic> json) { + final reversed = json['reversed'] ?? false; + return reversed ? instanceReversed : instance; + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => false; + + @override + String get universalLabel => type; + + @override + String getLabel(BuildContext context) => context.l10n.filterRecentlyAddedLabel; + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(AIcons.dateRecent, size: size); + + @override + String get category => type; + + @override + String get key => '$type-$reversed'; +} diff --git a/lib/model/filters/trash.dart b/lib/model/filters/trash.dart new file mode 100644 index 0000000..865b4d2 --- /dev/null +++ b/lib/model/filters/trash.dart @@ -0,0 +1,51 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +class TrashFilter extends CollectionFilter { + static const type = 'trash'; + + static bool _test(AvesEntry entry) => entry.trashed; + + static const instance = TrashFilter._private(); + static const instanceReversed = TrashFilter._private(reversed: true); + + @override + List<Object?> get props => [reversed]; + + const TrashFilter._private({super.reversed = false}); + + factory TrashFilter.fromMap(Map<String, dynamic> json) { + final reversed = json['reversed'] ?? false; + return reversed ? instanceReversed : instance; + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => false; + + @override + String get universalLabel => type; + + @override + String getLabel(BuildContext context) => context.l10n.filterBinLabel; + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(AIcons.bin, size: size); + + @override + String get category => type; + + @override + String get key => '$type-$reversed'; +} diff --git a/lib/model/filters/type.dart b/lib/model/filters/type.dart new file mode 100644 index 0000000..49e813a --- /dev/null +++ b/lib/model/filters/type.dart @@ -0,0 +1,129 @@ +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +class TypeFilter extends CollectionFilter { + static const type = 'type'; + + static const _animated = 'animated'; // subset of `image/gif` and `image/webp` + static const _geotiff = 'geotiff'; // subset of `image/tiff` + static const _hdr = 'hdr'; // subset of `image/jpeg` + static const _motionPhoto = 'motion_photo'; // subset of images (jpeg, heic) + static const _panorama = 'panorama'; // subset of images + static const _raw = 'raw'; // specific image formats + static const _sphericalVideo = 'spherical_video'; // subset of videos + + final String itemType; + late final IconData _icon; + late final EntryPredicate _test; + + static final animated = TypeFilter._private(_animated); + static final geotiff = TypeFilter._private(_geotiff); + static final hdr = TypeFilter._private(_hdr); + static final motionPhoto = TypeFilter._private(_motionPhoto); + static final panorama = TypeFilter._private(_panorama); + static final raw = TypeFilter._private(_raw); + static final sphericalVideo = TypeFilter._private(_sphericalVideo); + + @override + List<Object?> get props => [itemType, reversed]; + + TypeFilter._private(this.itemType, {super.reversed = false}) { + switch (itemType) { + case _animated: + _test = (entry) => entry.isAnimated; + _icon = AIcons.animated; + case _geotiff: + _test = (entry) => entry.isGeotiff; + _icon = AIcons.geo; + case _hdr: + _test = (entry) => entry.isHdr; + _icon = AIcons.hdr; + case _motionPhoto: + _test = (entry) => entry.isMotionPhoto; + _icon = AIcons.motionPhoto; + case _panorama: + _test = (entry) => entry.isImage && entry.is360; + _icon = AIcons.panorama; + case _raw: + _test = (entry) => entry.isRaw; + _icon = AIcons.raw; + case _sphericalVideo: + _test = (entry) => entry.isVideo && entry.is360; + _icon = AIcons.sphericalVideo; + } + } + + factory TypeFilter.fromMap(Map<String, dynamic> json) { + return TypeFilter._private( + json['itemType'], + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'itemType': itemType, + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => false; + + @override + String get universalLabel => itemType; + + @override + String getLabel(BuildContext context) { + final l10n = context.l10n; + return switch (itemType) { + _animated => l10n.filterTypeAnimatedLabel, + _geotiff => l10n.filterTypeGeotiffLabel, + _hdr => 'HDR', + _motionPhoto => l10n.filterTypeMotionPhotoLabel, + _panorama => l10n.filterTypePanoramaLabel, + _raw => l10n.filterTypeRawLabel, + _sphericalVideo => l10n.filterTypeSphericalVideoLabel, + _ => itemType, + }; + } + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(_icon, size: size); + + @override + Future<Color> color(BuildContext context) { + final colors = context.read<AvesColorsData>(); + switch (itemType) { + case _animated: + return SynchronousFuture(colors.animated); + case _geotiff: + return SynchronousFuture(colors.geotiff); + case _motionPhoto: + return SynchronousFuture(colors.motionPhoto); + case _panorama: + return SynchronousFuture(colors.panorama); + case _raw: + return SynchronousFuture(colors.raw); + case _sphericalVideo: + return SynchronousFuture(colors.sphericalVideo); + } + return super.color(context); + } + + @override + String get category => type; + + @override + String get key => '$type-$reversed-$itemType'; +} diff --git a/lib/model/filters/weekday.dart b/lib/model/filters/weekday.dart new file mode 100644 index 0000000..7c082d8 --- /dev/null +++ b/lib/model/filters/weekday.dart @@ -0,0 +1,58 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; + +class WeekDayFilter extends CollectionFilter { + static const type = 'weekday'; + + late final int weekday; + late final EntryPredicate _test; + + @override + List<Object?> get props => [weekday, reversed]; + + // `weekday` should be in [1, 7], with 1 as Monday + WeekDayFilter(this.weekday, {super.reversed = false}) { + _test = (entry) => entry.bestDate?.weekday == weekday; + } + + factory WeekDayFilter.fromMap(Map<String, dynamic> json) { + return WeekDayFilter( + json['weekday'] as int, + reversed: json['reversed'] ?? false, + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'weekday': weekday, + 'reversed': reversed, + }; + + @override + EntryPredicate get positiveTest => _test; + + @override + bool get exclusiveProp => true; + + @override + String get universalLabel => weekday.toString(); + + @override + String getLabel(BuildContext context) { + final dateSymbols = DateFormat(null, context.locale).dateSymbols; + return dateSymbols.STANDALONEWEEKDAYS[weekday % 7]; + } + + @override + Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(AIcons.dateWeekday, size: size); + + @override + String get category => type; + + @override + String get key => '$type-$reversed-$weekday'; +} diff --git a/lib/model/grouping/common.dart b/lib/model/grouping/common.dart new file mode 100644 index 0000000..e53476b --- /dev/null +++ b/lib/model/grouping/common.dart @@ -0,0 +1,376 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/container/group_base.dart'; +import 'package:aves/model/filters/container/set_or.dart'; +import 'package:aves/model/filters/container/tag_group.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/convert.dart'; +import 'package:aves/model/source/album.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/events.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:collection/collection.dart'; +import 'package:event_bus/event_bus.dart'; +import 'package:flutter/foundation.dart'; + +final FilterGrouping albumGrouping = FilterGrouping._private(FilterGrouping.hostAlbums, AlbumGroupFilter.new); +final FilterGrouping tagGrouping = FilterGrouping._private(FilterGrouping.hostTags, TagGroupFilter.new); + +// album group URI: "aves://albums/group?path=/group12/subgroup34" +// stored album URI: "aves://albums/stored?path=/volume/dir/path12" +// dynamic album URI: "aves://albums/dynamic?name=dynalbum12" +class FilterGrouping<T extends GroupBaseFilter> with ChangeNotifier { + static const scheme = 'aves'; + static const hostAlbums = 'albums'; + static const hostTags = 'tags'; + + static const _groupPath = '/group'; + static const _groupPathParamKey = 'path'; + + final EventBus eventBus = EventBus(); + + final String _host; + final T Function(Uri uri, SetOrFilter filter) _createGroupFilter; + final Map<Uri, Set<Uri>> _groups = {}; + final Set<StreamSubscription> _subscriptions = {}; + final Map<CollectionSource, Set<StreamSubscription>> _sourceSubscriptions = {}; + CollectionSource? _source; + + Map<Uri, Set<Uri>> get allGroups => Map.unmodifiable(_groups); + + // do not subscribe to events from other modules in constructor + // so that modules can subscribe to each other + FilterGrouping._private(this._host, this._createGroupFilter) { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); + } + + void init() { + _subscriptions.add(dynamicAlbums.eventBus.on<DynamicAlbumChangedEvent>().listen((e) => _clearObsoleteFilters())); + } + + void setGroups(Map<Uri, Set<Uri>> groups) { + _groups.clear(); + _groups.addAll(groups); + } + + @override + void dispose() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + _sourceSubscriptions.keys.toSet().forEach(unregisterSource); + super.dispose(); + } + + void registerSource(CollectionSource source) { + unregisterSource(_source); + final sourceEvents = source.eventBus; + _sourceSubscriptions[source] = { + sourceEvents.on<EntryMovedEvent>().listen((e) => _clearObsoleteFilters()), + sourceEvents.on<EntryRemovedEvent>().listen((e) => _clearObsoleteFilters()), + sourceEvents.on<AlbumsChangedEvent>().listen((e) => _clearObsoleteFilters()), + }; + _source = source; + } + + void unregisterSource(CollectionSource? source) { + _sourceSubscriptions.remove(source) + ?..forEach((sub) => sub.cancel()) + ..clear(); + } + + void addToGroup(Set<Uri> childrenUris, Uri? destinationGroup) { + _removeFromGroups(childrenUris); + if (destinationGroup != null) { + _ensureGroupFromRoot(destinationGroup); + final children = _groups[destinationGroup] ?? {}; + children.addAll(childrenUris); + _groups[destinationGroup] = children; + } + _reparentGroupPaths(childrenUris, destinationGroup); + _cleanEmptyGroups(); + notifyListeners(); + } + + void rename(Uri oldUri, Uri newUri) { + final childrenUris = _groups[oldUri]; + if (childrenUris == null) return; + + // local copy to prevent concurrent modification + addToGroup(Set.of(childrenUris), newUri); + eventBus.fire(GroupUriChangedEvent(oldUri, newUri)); + } + + bool get isNotEmpty => _groups.isNotEmpty; + + bool exists(Uri? groupUri) => _groups.containsKey(groupUri); + + Set<Uri> getGroups() => _groups.keys.toSet(); + + // returns number of filters within provided group, following subgroups without counting them + // providing the null root will yield 0, rather than the total number of filters in the collection (which is out of scope) + int countLeaves(Uri? groupUri) { + int count = 0; + if (groupUri != null) { + final childrenUris = _groups[groupUri]; + if (childrenUris != null) { + childrenUris.map(uriToFilter).nonNulls.forEach((filter) { + if (filter is GroupBaseFilter) { + count += countLeaves(filter.uri); + } else { + count++; + } + }); + } + } + return count; + } + + // returns filters directly within the provided group, including subgroups as filters + // providing the null root will yield its direct group filters + Set<CollectionFilter> getDirectChildren(Uri? currentGroupUri) { + if (currentGroupUri == null) { + return _groups.entries.where((kv) => getParentGroup(kv.key) == currentGroupUri).map((kv) { + final groupUri = kv.key; + final childrenUris = kv.value; + final childrenFilters = childrenUris.map(uriToFilter).nonNulls.toSet(); + return _createGroupFilter(groupUri, SetOrFilter(childrenFilters)); + }).toSet(); + } + + final childrenUris = _groups.entries.firstWhereOrNull((kv) => kv.key == currentGroupUri)?.value; + if (childrenUris != null) { + return childrenUris.map(uriToFilter).nonNulls.toSet(); + } + + return {}; + } + + Uri buildGroupUri(Uri? parentGroupUri, String name) { + return _buildGroupUri(_host, parentGroupUri, name); + } + + CollectionFilter? uriToFilter(Uri? uri) { + if (uri == null || uri.host != _host) return null; + + if (FilterGrouping.isGroupUri(uri)) { + return _createGroupFilter(uri, SetOrFilter(getDirectChildren(uri))); + } + + return GroupingConversion.uriToFilter(uri); + } + + void _removeFromGroups(Set<Uri> uris) { + _groups.forEach((_, childrenUris) { + childrenUris.removeAll(uris); + }); + } + + void _cleanEmptyGroups() { + final emptyGroupUris = _groups.entries.where((kv) => kv.value.isEmpty).map((v) => v.key).toSet(); + if (emptyGroupUris.isNotEmpty) { + _removeFromGroups(emptyGroupUris); + _groups.removeWhere((groupUri, _) => emptyGroupUris.contains(groupUri)); + _cleanEmptyGroups(); + } + } + + void _reparentGroupPaths(Set<Uri> childrenUris, Uri? parentGroupUri) { + final groupUris = childrenUris.where(FilterGrouping.isGroupUri).toSet(); + groupUris.forEach((oldGroupUri) { + final name = FilterGrouping.getGroupName(oldGroupUri); + if (name != null) { + final groupChildrenUris = _groups.remove(oldGroupUri); + if (groupChildrenUris != null) { + // create child group with updated URI + final newGroupUri = buildGroupUri(parentGroupUri, name); + _groups[newGroupUri] = groupChildrenUris; + + // update child group URI in parent group itself + if (parentGroupUri != null) { + final children = _groups[parentGroupUri]; + if (children != null && children.remove(oldGroupUri)) { + children.add(newGroupUri); + } + } + + eventBus.fire(GroupUriChangedEvent(oldGroupUri, newGroupUri)); + _reparentGroupPaths(groupChildrenUris, newGroupUri); + } + } + }); + } + + void _ensureGroupFromRoot(Uri groupUri) { + final parentGroupUri = FilterGrouping.getParentGroup(groupUri); + if (parentGroupUri != null) { + final children = _groups[parentGroupUri] ?? {}; + children.addAll({groupUri}); + _groups[parentGroupUri] = children; + _ensureGroupFromRoot(parentGroupUri); + } + } + + void _clearObsoleteFilters() { + final source = _source; + if (source == null || source.targetScope != CollectionSource.fullScope || !source.isReady) return; + + _groups.entries.forEach((kv) { + final groupUri = kv.key; + final childrenUris = kv.value; + + final allEntries = source.allEntries; + final rawAlbums = source.rawAlbums; + final sortedTags = source.sortedTags; + + childrenUris.toSet().forEach((childUri) { + final filter = uriToFilter(childUri); + var valid = false; + if (filter != null) { + switch (filter) { + case GroupBaseFilter _: + valid = true; + case DynamicAlbumFilter _: + valid = dynamicAlbums.contains(filter.name); + case StoredAlbumFilter _: + // check album itself + final isVisibleAlbum = rawAlbums.contains(filter.album); + if (isVisibleAlbum) { + valid = true; + } else { + // check non-visible content (hidden, trash, etc.) + valid = allEntries.any(filter.test); + } + case TagFilter _: + // check tag itself + final isVisibleTag = sortedTags.contains(filter.tag); + if (isVisibleTag) { + valid = true; + } else { + // check non-visible content (hidden, trash, etc.) + valid = allEntries.any(filter.test); + } + } + } + if (!valid) { + childrenUris.remove(childUri); + debugPrint('Removed obsolete childUri=$childUri from group=$groupUri'); + } + }); + }); + _cleanEmptyGroups(); + } + + // group uri / filter conversion + + static String? getGroupPath(Uri? uri) => uri?.queryParameters[_groupPathParamKey]; + + static String? getGroupName(Uri? uri) { + final path = getGroupPath(uri); + return path != null ? pContext.split(path).lastOrNull : null; + } + + static bool isGroupUri(Uri uri) => uri.path == FilterGrouping._groupPath; + + // parent group URI is `null` for root + static Uri _buildGroupUri(String host, Uri? parentGroupUri, String name) { + if (parentGroupUri != null) { + final path = getGroupPath(parentGroupUri); + if (path != null) { + return parentGroupUri.replace( + queryParameters: { + _groupPathParamKey: pContext.join(path, name), + }, + ); + } + } + return Uri( + scheme: scheme, + host: host, + path: _groupPath, + queryParameters: { + _groupPathParamKey: name, + }, + ); + } + + // returns `null` for root + Uri? getFilterParent(CollectionFilter filter) { + final uri = GroupingConversion.filterToUri(filter); + if (uri == null) return null; + + if (isGroupUri(uri)) { + return getParentGroup(uri); + } else { + return _groups.entries.firstWhereOrNull((kv) { + return kv.value.contains(uri); + })?.key; + } + } + + // returns `null` for root + static Uri? getParentGroup(Uri? groupUri) { + if (groupUri == null) return null; + + final path = getGroupPath(groupUri); + if (path != null) { + final segments = pContext.split(path); + final newLength = segments.length - 1; + if (newLength > 0) { + return groupUri.replace( + queryParameters: { + _groupPathParamKey: pContext.joinAll(segments.take(newLength)), + }, + ); + } + } + return null; + } + + static FilterGrouping? forUri(Uri uri) { + switch (uri.host) { + case hostAlbums: + return albumGrouping; + case hostTags: + return tagGrouping; + default: + return null; + } + } + + // serialization + + static String toJson(Map<Uri, Set<Uri>> groups) => jsonEncode( + groups.map((parentUri, childrenUris) { + return MapEntry(parentUri.toString(), childrenUris.map((v) => v.toString()).toList()); + }), + ); + + static Map<Uri, Set<Uri>>? fromJson(String? jsonString) { + if (jsonString == null || jsonString.isEmpty) return null; + + final jsonMap = jsonDecode(jsonString); + if (jsonMap is! Map) return null; + + return jsonMap.map((parent, children) { + final Uri? parentUri = parent is String ? Uri.tryParse(parent) : null; + final Set<Uri> childrenUris = children is Iterable ? children.whereType<String>().map(Uri.tryParse).nonNulls.toSet() : {}; + return MapEntry(parentUri, childrenUris); + }).whereNotNullKey(); + } +} + +@immutable +class GroupUriChangedEvent { + final Uri oldGroupUri; + final Uri newGroupUri; + + const GroupUriChangedEvent(this.oldGroupUri, this.newGroupUri); +} diff --git a/lib/model/grouping/convert.dart b/lib/model/grouping/convert.dart new file mode 100644 index 0000000..d27663a --- /dev/null +++ b/lib/model/grouping/convert.dart @@ -0,0 +1,87 @@ +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/container/group_base.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; + +mixin GroupingConversion { + static const _storedAlbumPath = '/stored'; + static const _dynamicAlbumPath = '/dynamic'; + static const _tagPath = '/tag'; + static const _nameParamKey = 'name'; + static const _storagePathParamKey = 'path'; + + static CollectionFilter? uriToFilter(Uri uri) { + switch (uri.path) { + case _storedAlbumPath: + final album = uri.queryParameters[_storagePathParamKey]; + if (album != null) { + return StoredAlbumFilter(album, null); + } + case _dynamicAlbumPath: + final name = uri.queryParameters[_nameParamKey]; + if (name != null) { + return dynamicAlbums.get(name); + } + case _tagPath: + final tag = uri.queryParameters[_nameParamKey]; + if (tag != null) { + return TagFilter(tag); + } + default: + throw Exception('unhandled path=${uri.path} with uri=$uri'); + } + + throw Exception('failed to convert to filter with uri=$uri'); + } + + static Uri? filterToUri(CollectionFilter filter) { + switch (filter) { + case GroupBaseFilter _: + return filter.uri; + case StoredAlbumFilter _: + return _buildStoredAlbumUri(filter.album); + case DynamicAlbumFilter _: + return _buildDynamicAlbumUri(filter.name); + case TagFilter _: + return _buildTagUri(filter.tag); + default: + throw Exception('unknown type with filter=$filter'); + } + } + + static Uri _buildStoredAlbumUri(String album) { + return Uri( + scheme: FilterGrouping.scheme, + host: FilterGrouping.hostAlbums, + path: _storedAlbumPath, + queryParameters: { + _storagePathParamKey: album, + }, + ); + } + + static Uri _buildDynamicAlbumUri(String name) { + return Uri( + scheme: FilterGrouping.scheme, + host: FilterGrouping.hostAlbums, + path: _dynamicAlbumPath, + queryParameters: { + _nameParamKey: name, + }, + ); + } + + static Uri _buildTagUri(String tag) { + return Uri( + scheme: FilterGrouping.scheme, + host: FilterGrouping.hostTags, + path: _tagPath, + queryParameters: { + _nameParamKey: tag, + }, + ); + } +} diff --git a/lib/model/grouping/filter_grouping.dart b/lib/model/grouping/filter_grouping.dart new file mode 100644 index 0000000..bd23ad8 --- /dev/null +++ b/lib/model/grouping/filter_grouping.dart @@ -0,0 +1,8 @@ +/// Versione minimal di FilterGrouping. +/// Serve solo per compatibilità con create_group_dialog.dart. +class FilterGrouping { + final String id; + final String label; + + const FilterGrouping({required this.id, required this.label}); +} diff --git a/lib/model/grouping/group_uri_changed_event.dart b/lib/model/grouping/group_uri_changed_event.dart new file mode 100644 index 0000000..570d7c5 --- /dev/null +++ b/lib/model/grouping/group_uri_changed_event.dart @@ -0,0 +1,6 @@ +class GroupUriChangedEvent { + final String? oldUri; + final String? newUri; + + GroupUriChangedEvent({this.oldUri, this.newUri}); +} diff --git a/lib/model/grouping/tag_grouping.dart b/lib/model/grouping/tag_grouping.dart new file mode 100644 index 0000000..d65e6a2 --- /dev/null +++ b/lib/model/grouping/tag_grouping.dart @@ -0,0 +1,26 @@ +import 'package:flutter/foundation.dart'; + +/// Evento emesso quando cambia il grouping dei TAG. +/// Versione minimal per compatibilità. +class GroupUriChangedEvent { + final String? oldUri; + final String? newUri; + + GroupUriChangedEvent({this.oldUri, this.newUri}); +} + +/// Gestione grouping SOLO TAG. +/// Versione minimal: mantiene solo una stringa. +class TagGrouping extends ChangeNotifier { + String? _groupUri; + + String? get groupUri => _groupUri; + + set groupUri(String? value) { + if (_groupUri != value) { + final old = _groupUri; + _groupUri = value; + notifyListeners(); + } + } +} diff --git a/lib/model/highlight.dart b/lib/model/highlight.dart new file mode 100644 index 0000000..b8940de --- /dev/null +++ b/lib/model/highlight.dart @@ -0,0 +1,73 @@ +import 'package:event_bus/event_bus.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/painting.dart'; + +class HighlightInfo extends ChangeNotifier { + final EventBus eventBus = EventBus(); + + HighlightInfo() { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); + } + + void trackItem<T>( + T? item, { + TrackPredicate? predicate, + Alignment? alignment, + bool? animate, + Object? highlightItem, + }) { + if (item != null) { + eventBus.fire( + TrackEvent<T>( + item, + predicate ?? (_) => true, + alignment ?? Alignment.center, + animate ?? true, + highlightItem, + ), + ); + } + } + + Object? _item; + + void set(Object item) { + if (_item == item) return; + _item = item; + notifyListeners(); + } + + Object? clear() { + if (_item == null) return null; + final item = _item; + _item = null; + notifyListeners(); + return item; + } + + bool contains(Object item) => _item == item; + + @override + String toString() => '$runtimeType#${shortHash(this)}{item=$_item}'; +} + +@immutable +class TrackEvent<T> { + final T item; + final TrackPredicate predicate; + final Alignment alignment; + final bool animate; + final Object? highlightItem; + + const TrackEvent( + this.item, + this.predicate, + this.alignment, + this.animate, + this.highlightItem, + ); +} + +// `itemVisibility`: percent of the item tracked already visible in viewport +// returns whether to proceed with tracking +typedef TrackPredicate = bool Function(double itemVisibility); diff --git a/lib/model/media/geotiff.dart b/lib/model/media/geotiff.dart new file mode 100644 index 0000000..ad036ae --- /dev/null +++ b/lib/model/media/geotiff.dart @@ -0,0 +1,266 @@ +import 'dart:async'; +import 'dart:math'; +import 'dart:ui' as ui; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/images.dart'; +import 'package:aves/ref/metadata/geotiff.dart'; +import 'package:aves/utils/math_utils.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/widgets.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:proj4dart/proj4dart.dart' as proj4; + +@immutable +class GeoTiffInfo extends Equatable { + final List<double>? modelPixelScale, modelTiePoints, modelTransformation; + final int? projCSType, projLinearUnits; + + @override + List<Object?> get props => [modelPixelScale, modelTiePoints, modelTransformation, projCSType, projLinearUnits]; + + const GeoTiffInfo({ + this.modelPixelScale, + this.modelTiePoints, + this.modelTransformation, + this.projCSType, + this.projLinearUnits, + }); + + factory GeoTiffInfo.fromMap(Map map) { + return GeoTiffInfo( + modelPixelScale: (map[GeoTiffExifTags.modelPixelScale] as List?)?.cast<double>(), + modelTiePoints: (map[GeoTiffExifTags.modelTiePoints] as List?)?.cast<double>(), + modelTransformation: (map[GeoTiffExifTags.modelTransformation] as List?)?.cast<double>(), + projCSType: map[GeoTiffKeys.projCSType] as int?, + projLinearUnits: map[GeoTiffKeys.projLinearUnits] as int?, + ); + } +} + +class MappedGeoTiff with MapOverlay { + final AvesEntry entry; + + late final GeoTiffCoordinateConverter _converter; + late final int _mapServiceTileSize; + late final MapServiceHelper _mapServiceHelper; + + static final _tileImagePaint = Paint(); + static final _tileMissingPaint = Paint() + ..style = PaintingStyle.fill + ..color = const Color(0xFF000000); + + MappedGeoTiff({ + required GeoTiffInfo info, + required this.entry, + required double devicePixelRatio, + }) { + _converter = GeoTiffCoordinateConverter(info: info, entry: entry); + _mapServiceTileSize = (256 * devicePixelRatio).round(); + _mapServiceHelper = MapServiceHelper(_mapServiceTileSize); + } + + @override + Future<MapTile?> getTile(int tx, int ty, int? zoomLevel) async { + zoomLevel ??= 0; + + // global projected coordinates in meters (EPSG:3857 Spherical Mercator) + final tileTopLeft3857 = _mapServiceHelper.tileTopLeft(tx, ty, zoomLevel); + final tileBottomRight3857 = _mapServiceHelper.tileTopLeft(tx + 1, ty + 1, zoomLevel); + + // image region coordinates in pixels + final tileTopLeftPx = _converter.epsg3857ToPoint(tileTopLeft3857); + final tileBottomRightPx = _converter.epsg3857ToPoint(tileBottomRight3857); + if (tileTopLeftPx == null || tileBottomRightPx == null) return null; + + final tileLeft = tileTopLeftPx.x; + final tileRight = tileBottomRightPx.x; + final tileTop = tileTopLeftPx.y; + final tileBottom = tileBottomRightPx.y; + + final width = entry.width; + final height = entry.height; + + final regionLeft = tileLeft.clamp(0, width); + final regionRight = tileRight.clamp(0, width); + final regionTop = tileTop.clamp(0, height); + final regionBottom = tileBottom.clamp(0, height); + + final regionWidth = regionRight - regionLeft; + final regionHeight = regionBottom - regionTop; + if (regionWidth == 0 || regionHeight == 0) return null; + + final tileXScale = (tileRight - tileLeft) / _mapServiceTileSize; + final sampleSize = max<int>(1, highestPowerOf2(tileXScale)); + final region = entry.getRegion( + sampleSize: sampleSize, + region: Rectangle(regionLeft, regionTop, regionWidth, regionHeight), + ); + + final imageInfoCompleter = Completer<ImageInfo?>(); + final imageStream = region.resolve(ImageConfiguration.empty); + final imageStreamListener = ImageStreamListener((image, synchronousCall) { + imageInfoCompleter.complete(image); + }, onError: imageInfoCompleter.completeError); + imageStream.addListener(imageStreamListener); + ImageInfo? regionImageInfo; + try { + regionImageInfo = await imageInfoCompleter.future; + } catch (error) { + debugPrint('failed to get image for region=$region with error=$error'); + } + imageStream.removeListener(imageStreamListener); + + final imageOffset = Offset( + regionLeft > tileLeft ? (regionLeft - tileLeft).toDouble() : 0, + regionTop > tileTop ? (regionTop - tileTop).toDouble() : 0, + ); + final tileImageScaleX = (tileRight - tileLeft) / _mapServiceTileSize; + final tileImageScaleY = (tileBottom - tileTop) / _mapServiceTileSize; + + final recorder = ui.PictureRecorder(); + final canvas = Canvas(recorder); + canvas.scale(1 / tileImageScaleX, 1 / tileImageScaleY); + if (regionImageInfo != null) { + final s = sampleSize.toDouble(); + canvas.scale(s, s); + canvas.drawImage(regionImageInfo.image, imageOffset / s, _tileImagePaint); + canvas.scale(1 / s, 1 / s); + } else { + // fallback to show area + canvas.drawRect( + Rect.fromLTWH( + imageOffset.dx, + imageOffset.dy, + regionWidth.toDouble(), + regionHeight.toDouble(), + ), + _tileMissingPaint, + ); + } + canvas.scale(tileImageScaleX, tileImageScaleY); + + final picture = recorder.endRecording(); + final tileImage = await picture.toImage(_mapServiceTileSize, _mapServiceTileSize); + final byteData = await tileImage.toByteData(format: ui.ImageByteFormat.png); + if (byteData == null) return null; + + return MapTile( + width: tileImage.width, + height: tileImage.height, + data: byteData.buffer.asUint8List(), + ); + } + + @override + String get id => entry.uri; + + @override + ImageProvider get imageProvider => entry.fullImage; + + @override + bool get canOverlay => center != null; + + LatLng? get center => _converter.center; + + @override + LatLng? get topLeft => _converter.topLeft; + + @override + LatLng? get bottomRight => _converter.bottomRight; +} + +class GeoTiffCoordinateConverter { + final AvesEntry entry; + + late LatLng? Function(Point<int> pixel) pointToLatLng; + late Point<int>? Function(Point<double> smPoint) epsg3857ToPoint; + + GeoTiffCoordinateConverter({ + required GeoTiffInfo info, + required this.entry, + }) { + pointToLatLng = (_) => null; + epsg3857ToPoint = (_) => null; + + // limitation: only support some UTM coordinate systems + final projCSType = info.projCSType; + final srcProj4 = GeoUtils.epsgToProj4(projCSType); + if (srcProj4 == null) { + debugPrint('unsupported projCSType=$projCSType'); + return; + } + + // limitation: only support model space values in units of meters + // TODO TLAD [geotiff] default from parsing proj4 instead of meter? + final projLinearUnits = info.projLinearUnits ?? GeoTiffUnits.linearMeter; + if (projLinearUnits != GeoTiffUnits.linearMeter) { + debugPrint('unsupported projLinearUnits=$projLinearUnits'); + return; + } + + // limitation: only support tie points, not transformation matrix + final modelTiePoints = info.modelTiePoints; + if (modelTiePoints == null) return; + + if (modelTiePoints.length < 6) return; + + // map image space (I,J,K) to model space (X,Y,Z) + final tpI = modelTiePoints[0]; + final tpJ = modelTiePoints[1]; + final tpK = modelTiePoints[2]; + final tpX = modelTiePoints[3]; + final tpY = modelTiePoints[4]; + final tpZ = modelTiePoints[5]; + + // limitation: expect 0,0,0,X,Y,0 + if (tpI != 0 || tpJ != 0 || tpK != 0 || tpZ != 0) return; + + final modelPixelScale = info.modelPixelScale; + if (modelPixelScale == null || modelPixelScale.length < 2) return; + + final xScale = modelPixelScale[0]; + final yScale = modelPixelScale[1]; + + final geoTiffProjection = proj4.Projection.parse(srcProj4); + final projToLatLng = proj4.ProjectionTuple( + fromProj: geoTiffProjection, + toProj: proj4.Projection.WGS84, + ); + pointToLatLng = (pixel) { + final srcPoint = proj4.Point( + x: tpX + pixel.x * xScale, + y: tpY - pixel.y * yScale, + ); + final destPoint = projToLatLng.forward(srcPoint); + + final latitude = destPoint.y; + final longitude = destPoint.x; + if (latitude >= -90.0 && latitude <= 90.0 && longitude >= -180.0 && longitude <= 180.0) { + return LatLng(latitude, longitude); + } + return null; + }; + + final projFromMapService = proj4.ProjectionTuple( + fromProj: proj4.Projection.GOOGLE, + toProj: geoTiffProjection, + ); + epsg3857ToPoint = (smPoint) { + final srcPoint = proj4.Point(x: smPoint.x, y: smPoint.y); + final destPoint = projFromMapService.forward(srcPoint); + return Point(((destPoint.x - tpX) / xScale).round(), -((destPoint.y - tpY) / yScale).round()); + }; + } + + int get width => entry.width; + + int get height => entry.height; + + LatLng? get center => pointToLatLng(Point((width / 2).round(), (height / 2).round())); + + LatLng? get topLeft => pointToLatLng(const Point(0, 0)); + + LatLng? get bottomRight => pointToLatLng(Point(width, height)); +} diff --git a/lib/model/media/panorama.dart b/lib/model/media/panorama.dart new file mode 100644 index 0000000..981908e --- /dev/null +++ b/lib/model/media/panorama.dart @@ -0,0 +1,86 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +class PanoramaInfo { + final Rect? croppedAreaRect; + final Size? fullPanoSize; + final String? projectionType; + + PanoramaInfo({ + this.croppedAreaRect, + this.fullPanoSize, + this.projectionType, + }); + + factory PanoramaInfo.fromMap(Map map) { + var cLeft = map['croppedAreaLeft'] as int?; + var cTop = map['croppedAreaTop'] as int?; + var cWidth = map['croppedAreaWidth'] as int?; + var cHeight = map['croppedAreaHeight'] as int?; + var fWidth = map['fullPanoWidth'] as int?; + var fHeight = map['fullPanoHeight'] as int?; + final projectionType = map['projectionType'] as String?; + + // handle missing `fullPanoHeight` (e.g. Samsung camera app panorama mode) + if (fHeight == null && fWidth != null && cHeight != null) { + fHeight = (fWidth / 2).round(); + cTop = ((fHeight - cHeight) / 2).round(); + } + + // handle inconsistent sizing (e.g. rotated image taken with OnePlus EB2103) + if (cWidth != null && cHeight != null && fWidth != null && fHeight != null) { + final croppedOrientation = cWidth > cHeight ? Orientation.landscape : Orientation.portrait; + final fullOrientation = fWidth > fHeight ? Orientation.landscape : Orientation.portrait; + var inconsistent = false; + if (croppedOrientation != fullOrientation) { + // inconsistent orientation + inconsistent = true; + final tmp = cHeight; + cHeight = cWidth; + cWidth = tmp; + } + + if (cWidth > fWidth) { + // inconsistent full/cropped width + inconsistent = true; + final tmp = fWidth; + fWidth = cWidth; + cWidth = tmp; + } + + if (cHeight > fHeight) { + // inconsistent full/cropped height + inconsistent = true; + final tmp = cHeight; + cHeight = fHeight; + fHeight = tmp; + } + + if (inconsistent) { + cLeft = (fWidth - cWidth) ~/ 2; + cTop = (fHeight - cHeight) ~/ 2; + } + } + + Rect? croppedAreaRect; + if (cLeft != null && cTop != null && cWidth != null && cHeight != null) { + croppedAreaRect = Rect.fromLTWH(cLeft.toDouble(), cTop.toDouble(), cWidth.toDouble(), cHeight.toDouble()); + } + + Size? fullPanoSize; + if (fWidth != null && fHeight != null) { + fullPanoSize = Size(fWidth.toDouble(), fHeight.toDouble()); + } + + return PanoramaInfo( + croppedAreaRect: croppedAreaRect, + fullPanoSize: fullPanoSize, + projectionType: projectionType, + ); + } + + bool get hasCroppedArea => croppedAreaRect != null && fullPanoSize != null; + + @override + String toString() => '$runtimeType#${shortHash(this)}{croppedAreaRect=$croppedAreaRect, fullPanoSize=$fullPanoSize, projectionType=$projectionType}'; +} diff --git a/lib/model/media/video/channel_layouts.dart b/lib/model/media/video/channel_layouts.dart new file mode 100644 index 0000000..c2ed853 --- /dev/null +++ b/lib/model/media/video/channel_layouts.dart @@ -0,0 +1,94 @@ +// channel layout constants from FFmpeg libavutil/channel_layout.h +class ChannelLayouts { + // ignore_for_file: constant_identifier_names + + static const FRONT_LEFT = 0x00000001; + static const FRONT_RIGHT = 0x00000002; + static const FRONT_CENTER = 0x00000004; + static const LOW_FREQUENCY = 0x00000008; + static const BACK_LEFT = 0x00000010; + static const BACK_RIGHT = 0x00000020; + static const FRONT_LEFT_OF_CENTER = 0x00000040; + static const FRONT_RIGHT_OF_CENTER = 0x00000080; + static const BACK_CENTER = 0x00000100; + static const SIDE_LEFT = 0x00000200; + static const SIDE_RIGHT = 0x00000400; + static const TOP_CENTER = 0x00000800; + static const TOP_FRONT_LEFT = 0x00001000; + static const TOP_FRONT_CENTER = 0x00002000; + static const TOP_FRONT_RIGHT = 0x00004000; + static const TOP_BACK_LEFT = 0x00008000; + static const TOP_BACK_CENTER = 0x00010000; + static const TOP_BACK_RIGHT = 0x00020000; + static const STEREO_LEFT = 0x20000000; + static const STEREO_RIGHT = 0x40000000; + + static const WIDE_LEFT = 0x0000000080000000; + static const WIDE_RIGHT = 0x0000000100000000; + static const SURROUND_DIRECT_LEFT = 0x0000000200000000; + static const SURROUND_DIRECT_RIGHT = 0x0000000400000000; + static const LOW_FREQUENCY_2 = 0x0000000800000000; + + static const LAYOUT_NATIVE = 0x8000000000000000; + + static const LAYOUT_MONO = (FRONT_CENTER); + static const LAYOUT_STEREO = (FRONT_LEFT | FRONT_RIGHT); + static const LAYOUT_2POINT1 = (LAYOUT_STEREO | LOW_FREQUENCY); + static const LAYOUT_2_1 = (LAYOUT_STEREO | BACK_CENTER); + static const LAYOUT_SURROUND = (LAYOUT_STEREO | FRONT_CENTER); + static const LAYOUT_3POINT1 = (LAYOUT_SURROUND | LOW_FREQUENCY); + static const LAYOUT_4POINT0 = (LAYOUT_SURROUND | BACK_CENTER); + static const LAYOUT_4POINT1 = (LAYOUT_4POINT0 | LOW_FREQUENCY); + static const LAYOUT_2_2 = (LAYOUT_STEREO | SIDE_LEFT | SIDE_RIGHT); + static const LAYOUT_QUAD = (LAYOUT_STEREO | BACK_LEFT | BACK_RIGHT); + static const LAYOUT_5POINT0 = (LAYOUT_SURROUND | SIDE_LEFT | SIDE_RIGHT); + static const LAYOUT_5POINT1 = (LAYOUT_5POINT0 | LOW_FREQUENCY); + static const LAYOUT_5POINT0_BACK = (LAYOUT_SURROUND | BACK_LEFT | BACK_RIGHT); + static const LAYOUT_5POINT1_BACK = (LAYOUT_5POINT0_BACK | LOW_FREQUENCY); + static const LAYOUT_6POINT0 = (LAYOUT_5POINT0 | BACK_CENTER); + static const LAYOUT_6POINT0_FRONT = (LAYOUT_2_2 | FRONT_LEFT_OF_CENTER | FRONT_RIGHT_OF_CENTER); + static const LAYOUT_HEXAGONAL = (LAYOUT_5POINT0_BACK | BACK_CENTER); + static const LAYOUT_6POINT1 = (LAYOUT_5POINT1 | BACK_CENTER); + static const LAYOUT_6POINT1_BACK = (LAYOUT_5POINT1_BACK | BACK_CENTER); + static const LAYOUT_6POINT1_FRONT = (LAYOUT_6POINT0_FRONT | LOW_FREQUENCY); + static const LAYOUT_7POINT0 = (LAYOUT_5POINT0 | BACK_LEFT | BACK_RIGHT); + static const LAYOUT_7POINT0_FRONT = (LAYOUT_5POINT0 | FRONT_LEFT_OF_CENTER | FRONT_RIGHT_OF_CENTER); + static const LAYOUT_7POINT1 = (LAYOUT_5POINT1 | BACK_LEFT | BACK_RIGHT); + static const LAYOUT_7POINT1_WIDE = (LAYOUT_5POINT1 | FRONT_LEFT_OF_CENTER | FRONT_RIGHT_OF_CENTER); + static const LAYOUT_7POINT1_WIDE_BACK = (LAYOUT_5POINT1_BACK | FRONT_LEFT_OF_CENTER | FRONT_RIGHT_OF_CENTER); + static const LAYOUT_OCTAGONAL = (LAYOUT_5POINT0 | BACK_LEFT | BACK_CENTER | BACK_RIGHT); + static const LAYOUT_HEXADECAGONAL = (LAYOUT_OCTAGONAL | WIDE_LEFT | WIDE_RIGHT | TOP_BACK_LEFT | TOP_BACK_RIGHT | TOP_BACK_CENTER | TOP_FRONT_CENTER | TOP_FRONT_LEFT | TOP_FRONT_RIGHT); + static const LAYOUT_STEREO_DOWNMIX = (STEREO_LEFT | STEREO_RIGHT); + + static const names = { + LAYOUT_NATIVE: 'native', + LAYOUT_MONO: 'mono', + LAYOUT_STEREO: 'stereo 2.0 • FL FR', + LAYOUT_2POINT1: 'stereo 2.1 • FL FR LFE', + LAYOUT_2_1: 'surround 3.0 • FL FR BC', + LAYOUT_SURROUND: 'stereo 3.0 • FL FR FC', + LAYOUT_3POINT1: 'stereo 3.1 • FL FR FC LFE', + LAYOUT_4POINT0: 'surround 4.0 • FL FR FC BC', + LAYOUT_4POINT1: 'surround 4.1 • FL FR FC BC LFE', + LAYOUT_2_2: 'quad (side) • FL FR SL SR', + LAYOUT_QUAD: 'quad (back) • FL FR BL BR', + LAYOUT_5POINT0: '5.0 (side) • FL FR FC SL SR', + LAYOUT_5POINT1: '5.1 (side) • FL FR FC SL SR LFE', + LAYOUT_5POINT0_BACK: '5.0 (back) • FL FR FC BL BR', + LAYOUT_5POINT1_BACK: '5.1 (back) • FL FR FC BL BR LFE', + LAYOUT_6POINT0: '6.0 (side) • FL FR FC SL SR BC', + LAYOUT_6POINT0_FRONT: '6.0 (front) • FL FR FLC FRC SL SR', + LAYOUT_HEXAGONAL: 'hexagonal • FL FR FC BL BR BC', + LAYOUT_6POINT1: '6.1 (side) • FL FR FC SL SR BC LFE', + LAYOUT_6POINT1_BACK: '6.1 (back) • FL FR FC BL BR BC LFE', + LAYOUT_6POINT1_FRONT: '6.1 (front) • FL FR FLC FRC SL SR LFE', + LAYOUT_7POINT0: 'surround 7.0 • FL FR FC SL SR BL BR', + LAYOUT_7POINT0_FRONT: 'wide 7.0 • FL FR FC FLC FRC SL SR', + LAYOUT_7POINT1: 'surround 7.1 • FL FR FC SL SR BL BR LFE', + LAYOUT_7POINT1_WIDE: 'wide 7.1 • FL FR FC FLC FRC SL SR LFE', + LAYOUT_7POINT1_WIDE_BACK: 'wide 7.1 (back) • FL FR FC FLC FRC BL BR LFE', + LAYOUT_OCTAGONAL: 'octagonal • FL FR FC SL SR BL BR BC', + LAYOUT_HEXADECAGONAL: 'hexadecagonal • FL FR FC WL WR TFL TFR TFC SL SR BL BR BC TBL TBR TBC', + LAYOUT_STEREO_DOWNMIX: 'stereo downmix', + }; +} diff --git a/lib/model/media/video/codecs.dart b/lib/model/media/video/codecs.dart new file mode 100644 index 0000000..aa29d56 --- /dev/null +++ b/lib/model/media/video/codecs.dart @@ -0,0 +1,16 @@ +class Codecs { + static const aac = 'aac'; + static const ac3 = 'ac3'; + static const eac3 = 'eac3'; + static const h264 = 'h264'; + static const hevc = 'hevc'; + static const matroska = 'matroska'; + static const mpeg4 = 'mpeg4'; + static const mpts = 'mpegts'; + static const opus = 'opus'; + static const pgs = 'hdmv_pgs_subtitle'; + static const subrip = 'subrip'; + static const theora = 'theora'; + static const vorbis = 'vorbis'; + static const webm = 'webm'; +} diff --git a/lib/model/media/video/metadata.dart b/lib/model/media/video/metadata.dart new file mode 100644 index 0000000..6b28c3a --- /dev/null +++ b/lib/model/media/video/metadata.dart @@ -0,0 +1,509 @@ +import 'dart:async'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/keys.dart'; +import 'package:aves/model/media/video/channel_layouts.dart'; +import 'package:aves/model/media/video/codecs.dart'; +import 'package:aves/model/media/video/profiles/aac.dart'; +import 'package:aves/model/media/video/profiles/h264.dart'; +import 'package:aves/model/media/video/profiles/hevc.dart'; +import 'package:aves/model/media/video/stereo_3d_modes.dart'; +import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/ref/languages.dart'; +import 'package:aves/ref/locales.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/ref/mp4.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/format.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/utils/math_utils.dart'; +import 'package:aves/utils/string_utils.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; + +class VideoMetadataFormatter { + static final _dateY4M2D2H2m2s2Pattern = RegExp(r'(\d{4})[-./:](\d{1,2})[-./:](\d{1,2})([ T](\d{1,2}):(\d{1,2}):(\d{1,2})( ([ap]\.? ?m\.?))?)?'); + static final _ambiguousDatePatterns = { + RegExp(r'^\d{2}[-/]\d{2}[-/]\d{4}$'), + }; + static final _durationHmsmPattern = RegExp(r'(\d+):(\d+):(\d+)(.\d+)'); + static final _durationSmPattern = RegExp(r'(\d+)(.\d+)'); + static final _locationPattern = RegExp(r'([+-][.0-9]+)'); + static final Map<String, String> _codecNames = { + Codecs.ac3: 'AC-3', + Codecs.eac3: 'E-AC-3', + Codecs.h264: 'AVC (H.264)', + Codecs.hevc: 'HEVC (H.265)', + Codecs.matroska: 'Matroska', + Codecs.mpeg4: 'MPEG-4 Visual', + Codecs.mpts: 'MPEG-TS', + Codecs.opus: 'Opus', + Codecs.pgs: 'PGS', + Codecs.subrip: 'SubRip', + Codecs.theora: 'Theora', + Codecs.vorbis: 'Vorbis', + Codecs.webm: 'WebM', + }; + + // fetch size, rotation and duration + static Future<Map<String, int>> getLoadingMetadata(AvesEntry entry) async { + final mediaInfo = await videoMetadataFetcher.getMetadata(entry); + final fields = <String, int>{}; + + final streams = mediaInfo[Keys.streams]; + if (streams is List) { + final allStreamInfo = streams.cast<Map>(); + final sizedStream = allStreamInfo.firstWhereOrNull((stream) => stream.containsKey(Keys.videoWidth) && stream.containsKey(Keys.videoHeight)); + if (sizedStream != null) { + final width = sizedStream[Keys.videoWidth]; + final height = sizedStream[Keys.videoHeight]; + if (width is int && height is int) { + fields[EntryFields.width] = width; + fields[EntryFields.height] = height; + } + + final rotationDegrees = sizedStream[Keys.rotate]; + if (rotationDegrees is int) { + fields[EntryFields.rotationDegrees] = rotationDegrees; + } + } + } + + final durationMicros = mediaInfo[Keys.durationMicros]; + if (durationMicros is num) { + fields[EntryFields.durationMillis] = (durationMicros / 1000).round(); + } else { + final duration = _parseDuration(mediaInfo[Keys.duration]); + if (duration != null && duration > Duration.zero) { + fields[EntryFields.durationMillis] = duration.inMilliseconds; + } + } + return fields; + } + + // fetch date and animated status + static Future<CatalogMetadata?> completeCatalogMetadata(AvesEntry entry) async { + var catalogMetadata = entry.catalogMetadata ?? CatalogMetadata(id: entry.id); + + final mediaInfo = await videoMetadataFetcher.getMetadata(entry); + + if (entry.mimeType == MimeTypes.avif) { + final duration = _parseDuration(mediaInfo[Keys.duration]); + if (duration == null || duration == Duration.zero) return null; + + catalogMetadata = catalogMetadata.copyWith(isAnimated: true); + } + + // only consider values with at least 8 characters (yyyymmdd), + // ignoring unset values like `0`, as well as year values like `2021` + bool isDefined(dynamic value) => value is String && value.length >= 8; + + var dateString = mediaInfo[Keys.date]; + if (!isDefined(dateString)) { + dateString = mediaInfo[Keys.creationTime]; + } + int? dateMillis; + if (isDefined(dateString)) { + dateMillis = parseVideoDate(dateString); + if (dateMillis == null && !isAmbiguousDate(dateString)) { + await reportService.recordError('getCatalogMetadata failed to parse date=$dateString for mimeType=${entry.mimeType} entry=$entry'); + } + } + + // exclude date if it is suspiciously close to epoch + if (dateMillis != null && !DateTime.fromMillisecondsSinceEpoch(dateMillis).isAtSameDayAs(epoch)) { + catalogMetadata = catalogMetadata.copyWith(dateMillis: dateMillis); + } + + return catalogMetadata; + } + + static bool isAmbiguousDate(String dateString) { + return _ambiguousDatePatterns.any((pattern) => pattern.hasMatch(dateString)); + } + + static int? parseVideoDate(String dateString) { + final date = DateTime.tryParse(dateString); + if (date != null) { + return date.millisecondsSinceEpoch; + } + + // `DateTime` does not recognize these values found in the wild: + // - `UTC 2021-05-30 19:14:21` + // - `2021/10/31 21:23:17` + // - `2021-09-10T7:14:49 pmZ` + // - `2022-01-28T5:07:46 p. m.Z` + // - `2012-1-1T12:00:00Z` + // - `2020.10.14` + // - `2016:11:16 18:00:00` + // - `2021` (not enough to build a date) + + var match = _dateY4M2D2H2m2s2Pattern.firstMatch(dateString); + if (match != null) { + final year = int.tryParse(match.group(1)!); + final month = int.tryParse(match.group(2)!); + final day = int.tryParse(match.group(3)!); + + if (year != null && month != null && day != null) { + var hour = 0, minute = 0, second = 0, pm = false; + if (match.groupCount >= 7 && match.group(4) != null) { + hour = int.tryParse(match.group(5)!) ?? 0; + minute = int.tryParse(match.group(6)!) ?? 0; + second = int.tryParse(match.group(7)!) ?? 0; + pm = {'pm', 'p. m.'}.contains(match.group(9)); + } + + final date = DateTime(year, month, day, hour + (pm ? 12 : 0), minute, second, 0); + return date.millisecondsSinceEpoch; + } + } + + return null; + } + + // pattern to extract optional language code suffix, e.g. 'location-eng' + static final keyWithLanguagePattern = RegExp(r'^(.*)-([a-z]{3})$'); + + static Map<String, String> formatInfo(Map info) { + final dir = <String, String>{}; + final streamType = info[Keys.streamType]; + final codec = info[Keys.codecName]; + for (final kv in info.entries) { + final value = kv.value; + if (value != null) { + try { + String? key; + String? keyLanguage; + // some keys have a language suffix, but they may be duplicates + // we only keep the root key when they have the same value as the same key with no language + final languageMatch = keyWithLanguagePattern.firstMatch(kv.key); + if (languageMatch != null) { + final code = languageMatch.group(2)!; + final native = _formatLanguage(code); + if (native != code) { + final root = languageMatch.group(1)!; + final rootValue = info[root]; + // skip if it is a duplicate of the same entry with no language + if (rootValue == value) continue; + key = root; + if (info.keys.cast<String>().where((k) => k.startsWith('$root-')).length > 1) { + // only keep language when multiple languages are present + keyLanguage = native; + } + } + } + key = (key ?? (kv.key as String)).toLowerCase(); + + void save(String key, dynamic value) { + if (value != null) { + dir[keyLanguage != null ? '$key ($keyLanguage)' : key] = value.toString(); + } + } + + switch (key) { + case Keys.chapters: + case Keys.codecLevel: + case Keys.codecTag: + case Keys.codecTagString: + case Keys.durationTs: + case Keys.fpsNum: + case Keys.index: + case Keys.isAvc: + case Keys.probeScore: + case Keys.programCount: + case Keys.refs: + case Keys.sarNum: + case Keys.selectedAudioStream: + case Keys.selectedTextStream: + case Keys.selectedVideoStream: + case Keys.statisticsTags: + case Keys.streamCount: + case Keys.streams: + case Keys.streamType: + case Keys.tbrNum: + case Keys.tbrDen: + break; + case Keys.androidCaptureFramerate: + final captureFps = double.parse(value); + save('Capture Frame Rate', '${roundToPrecision(captureFps, decimals: 3)} FPS'); + case Keys.androidManufacturer: + save('Android Manufacturer', value); + case Keys.androidModel: + save('Android Model', value); + case Keys.androidVersion: + save('Android Version', value); + case Keys.audioChannels: + save('Audio Channels', value); + case Keys.bitrate: + case Keys.bps: + save('Bit Rate', _formatMetric(value, 'b/s')); + case Keys.byteCount: + save('Size', _formatFilesize(value)); + case Keys.channelLayout: + save('Channel Layout', _formatChannelLayout(value)); + case Keys.codecName: + if (value != 'none') { + save('Format', _formatCodecName(value)); + } + case Keys.codecPixelFormat: + if (streamType == MediaStreamTypes.video) { + // this is just a short name used by FFmpeg + // user-friendly descriptions for related enums are defined in libavutil/pixfmt.h + save('Pixel Format', value.toString().toUpperCase()); + } + case Keys.hwPixelFormat: + save('Hardware Pixel Format', value.toString().toUpperCase()); + case Keys.codedHeight: + save('Coded Height', '$value pixels'); + case Keys.codedWidth: + save('Coded Width', '$value pixels'); + case Keys.decoderHeight: + save('Decoder Height', '$value pixels'); + case Keys.decoderWidth: + save('Decoder Width', '$value pixels'); + case Keys.colorMatrix: + save('Color Matrix', value.toString().toUpperCase()); + case Keys.colorPrimaries: + save('Color Primaries', value.toString().toUpperCase()); + case Keys.colorRange: + save('Color Range', value.toString().toUpperCase()); + case Keys.colorSpace: + save('Color Space', value.toString().toUpperCase()); + case Keys.colorTransfer: + save('Color Transfer', value.toString().toUpperCase()); + case Keys.codecProfileId: + { + final profile = int.tryParse(value); + if (profile != null) { + String? profileString; + switch (codec) { + case Codecs.h264: + case Codecs.hevc: + { + final levelValue = info[Keys.codecLevel]; + if (levelValue != null) { + final level = levelValue is int ? levelValue : int.tryParse(levelValue) ?? 0; + if (codec == Codecs.h264) { + profileString = H264.formatProfile(profile, level); + } else { + profileString = Hevc.formatProfile(profile, level); + } + } + } + case Codecs.aac: + profileString = AAC.formatProfile(profile); + default: + profileString = profile.toString(); + } + save('Format Profile', profileString); + } + } + case Keys.compatibleBrands: + final formattedBrands = RegExp(r'.{4}') + .allMatches(value) + .map((m) { + final brand = m.group(0)!; + return _formatBrand(brand); + }) + .join(', '); + save('Compatible Brands', formattedBrands); + case Keys.creationTime: + save('Creation Time', _formatDate(value)); + case Keys.date: + if (value is String && value != '0') { + final charCount = value.length; + save(charCount == 4 ? 'Year' : 'Date', value); + } + case Keys.duration: + save('Duration', _formatDuration(value)); + case Keys.durationMicros: + if (value != 0) save('Duration', formatPreciseDuration(Duration(microseconds: value))); + case Keys.extraDataSize: + save('Extra Data Size', _formatFilesize(value)); + case Keys.fps: + save('Frame Rate', '${roundToPrecision(info[Keys.fps], decimals: 3)} FPS'); + case Keys.fpsDen: + save('Frame Rate', '${roundToPrecision(info[Keys.fpsNum] / info[Keys.fpsDen], decimals: 3)} FPS'); + case Keys.frameCount: + save('Frame Count', value); + case Keys.gamma: + save('Gamma', value.toString().toUpperCase()); + case Keys.hasBFrames: + save('Has B-Frames', value); + case Keys.hearingImpaired: + save('Hearing impaired', value); + case Keys.language: + if (value != 'und') save('Language', _formatLanguage(value)); + case Keys.location: + save('Location', _formatLocation(value)); + case Keys.majorBrand: + save('Major Brand', _formatBrand(value)); + case Keys.mediaFormat: + save('Format', value.toString().splitMapJoin(',', onMatch: (s) => ', ', onNonMatch: _formatCodecName)); + case Keys.minorVersion: + if (value != '0') save('Minor Version', value); + case Keys.nalLengthSize: + save('NAL Length Size', _formatFilesize(value)); + case Keys.quicktimeLocationAccuracyHorizontal: + save('QuickTime Location Horizontal Accuracy', value); + case Keys.quicktimeCreationDate: + case Keys.quicktimeLocationIso6709: + case Keys.quicktimeMake: + case Keys.quicktimeModel: + case Keys.quicktimeSoftware: + // redundant with `QuickTime Metadata` directory + break; + case Keys.rFrameRate: + save('R Frame Rate', value); + case Keys.rotate: + save('Rotation', '$value°'); + case Keys.sampleFormat: + save('Sample Format', value.toString().toUpperCase()); + case Keys.sampleRate: + save('Sample Rate', _formatMetric(value, 'Hz')); + case Keys.sar: + save('Sample Aspect Ratio', value); + case Keys.sarDen: + final sarNum = info[Keys.sarNum]; + final sarDen = info[Keys.sarDen]; + // skip common square pixels (1:1) + if (sarNum != sarDen) save('SAR', '$sarNum:$sarDen'); + case Keys.segmentCount: + save('Segment Count', value); + case Keys.sourceOshash: + save('Source OSHash', value); + case Keys.startMicros: + if (value != 0) save('Start', formatPreciseDuration(Duration(microseconds: value))); + case Keys.startPts: + save('Start PTS', value); + case Keys.startTime: + save('Start', _formatDuration(value)); + case Keys.statisticsWritingApp: + save('Stats Writing App', value); + case Keys.statisticsWritingDateUtc: + save('Stats Writing Date', _formatDate(value)); + case Keys.stereo3dMode: + save('Stereo 3D Mode', _formatStereo3dMode(value)); + case Keys.timeBase: + save('Time Base', value); + case Keys.track: + if (value != '0') save('Track', value); + case Keys.vendorId: + save('Vendor ID', value); + case Keys.videoHeight: + save('Video Height', '$value pixels'); + case Keys.videoWidth: + save('Video Width', '$value pixels'); + case Keys.visualImpaired: + save('Visual impaired', value); + case Keys.xiaomiSlowMoment: + save('Xiaomi Slow Moment', value); + default: + save(key.toSentenceCase(), value); + } + } catch (error) { + debugPrint('failed to process video info key=${kv.key} value=${kv.value}, error=$error'); + } + } + } + return dir; + } + + static String _formatBrand(String value) => Mp4.brands[value] ?? value; + + static String _formatChannelLayout(dynamic value) { + if (value is int) { + return ChannelLayouts.names[value] ?? 'unknown ($value)'; + } + return '$value'; + } + + static String _formatCodecName(String value) => _codecNames[value] ?? value.toUpperCase().replaceAll('_', ' '); + + // input example: '2021-04-12T09:14:37.000000Z' + static String? _formatDate(String value) { + final date = DateTime.tryParse(value); + if (date == null) return value; + if (date == epoch) return null; + return date.toIso8601String(); + } + + static String _formatStereo3dMode(String value) => Stereo3dModes.names[value] ?? value; + + // input example: '00:00:05.408000000' or '5.408000' + static Duration? _parseDuration(String? value) { + if (value == null) return null; + + var match = _durationHmsmPattern.firstMatch(value); + if (match != null) { + final h = int.tryParse(match.group(1)!); + final m = int.tryParse(match.group(2)!); + final s = int.tryParse(match.group(3)!); + final millis = double.tryParse(match.group(4)!); + if (h != null && m != null && s != null && millis != null) { + return Duration( + hours: h, + minutes: m, + seconds: s, + milliseconds: (millis * 1000).toInt(), + ); + } + } + + match = _durationSmPattern.firstMatch(value); + if (match != null) { + final s = int.tryParse(match.group(1)!); + final millis = double.tryParse(match.group(2)!); + if (s != null && millis != null) { + return Duration( + seconds: s, + milliseconds: (millis * 1000).toInt(), + ); + } + } + + return null; + } + + // input example: '00:00:05.408000000' or '5.408000' + static String _formatDuration(String value) { + final duration = _parseDuration(value); + return duration != null ? formatPreciseDuration(duration) : value; + } + + static String _formatFilesize(dynamic value) { + final size = value is int ? value : int.tryParse(value); + return size != null ? formatFileSize(asciiLocale, size) : value; + } + + static String _formatLanguage(String value) { + final language = Language.living639_2.firstWhereOrNull((language) => language.iso639_2 == value); + return language?.native ?? value; + } + + // format ISO 6709 input, e.g. '+37.5090+127.0243/' (Samsung), '+51.3328-000.7053+113.474/' (Apple) + static String? _formatLocation(String value) { + final matches = _locationPattern.allMatches(value); + if (matches.isNotEmpty) { + final coordinates = matches.map((m) => double.tryParse(m.group(0)!)).toList(); + if (coordinates.every((c) => c == 0)) return null; + return coordinates.join(', '); + } + return value; + } + + static String _formatMetric(dynamic size, String unit, {int round = 2}) { + if (size is String) { + final parsed = int.tryParse(size); + if (parsed == null) return size; + size = parsed; + } + + const divider = 1000; + if (size < divider) return '$size $unit'; + if (size < divider * divider) return '${(size / divider).toStringAsFixed(round)} K$unit'; + return '${(size / divider / divider).toStringAsFixed(round)} M$unit'; + } +} diff --git a/lib/model/media/video/profiles/aac.dart b/lib/model/media/video/profiles/aac.dart new file mode 100644 index 0000000..ffeb1e8 --- /dev/null +++ b/lib/model/media/video/profiles/aac.dart @@ -0,0 +1,33 @@ +class AAC { + static const profileMain = 0; + static const profileLowComplexity = 1; + static const profileScalableSampleRate = 2; + static const profileLongTermPrediction = 3; + static const profileHighEfficiency = 4; + static const profileHighEfficiencyV2 = 28; + static const profileLowDelay = 22; + static const profileLowDelayV2 = 38; + + static String formatProfile(int profileIndex) { + switch (profileIndex) { + case profileMain: + return 'Main'; + case profileLowComplexity: + return 'LC'; + case profileLongTermPrediction: + return 'LTP'; + case profileScalableSampleRate: + return 'SSR'; + case profileHighEfficiency: + return 'HE-AAC'; + case profileHighEfficiencyV2: + return 'HE-AAC v2'; + case profileLowDelay: + return 'LD'; + case profileLowDelayV2: + return 'ELD'; + default: + return '$profileIndex'; + } + } +} diff --git a/lib/model/media/video/profiles/h264.dart b/lib/model/media/video/profiles/h264.dart new file mode 100644 index 0000000..5fb99ac --- /dev/null +++ b/lib/model/media/video/profiles/h264.dart @@ -0,0 +1,62 @@ +class H264 { + static const profileConstrained = 1 << 9; + static const profileIntra = 1 << 11; + + static const profileBaseline = 66; + static const profileConstrainedBaseline = 66 | profileConstrained; + static const profileMain = 77; + static const profileExtended = 88; + static const profileHigh = 100; + static const profileHigh10 = 110; + static const profileHigh422 = 122; + static const profileHigh444 = 144; + static const profileHigh444Predictive = 244; + + // intra + static const profileHigh10Intra = 110 | profileIntra; + static const profileHigh422Intra = 122 | profileIntra; + static const profileHigh444Intra = 244 | profileIntra; + static const profileCAVLC444 = 44; + + // multiview + static const profileMultiviewHigh = 118; + static const profileStereoHigh = 128; + static const profileMultiviewDepthHigh = 138; + + static String formatProfile(int profileIndex, int levelIndex) { + String profile; + switch (profileIndex) { + case profileBaseline: + profile = 'Baseline'; + case profileConstrainedBaseline: + profile = 'Constrained Baseline'; + case profileMain: + profile = 'Main'; + case profileExtended: + profile = 'Extended'; + case profileHigh: + profile = 'High'; + case profileHigh10: + profile = 'High 10'; + case profileHigh10Intra: + profile = 'High 10 Intra'; + case profileHigh422: + profile = 'High 4:2:2'; + case profileHigh422Intra: + profile = 'High 4:2:2 Intra'; + case profileHigh444: + profile = 'High 4:4:4'; + case profileHigh444Predictive: + profile = 'High 4:4:4 Predictive'; + case profileHigh444Intra: + profile = 'High 4:4:4 Intra'; + case profileCAVLC444: + profile = 'CAVLC 4:4:4'; + default: + return '$profileIndex'; + } + if (levelIndex <= 0) return profile; + final level = (levelIndex / 10.0).toStringAsFixed(levelIndex % 10 != 0 ? 1 : 0); + return '$profile Profile, Level $level'; + } +} diff --git a/lib/model/media/video/profiles/hevc.dart b/lib/model/media/video/profiles/hevc.dart new file mode 100644 index 0000000..880982e --- /dev/null +++ b/lib/model/media/video/profiles/hevc.dart @@ -0,0 +1,25 @@ +class Hevc { + static const profileMain = 1; + static const profileMain10 = 2; + static const profileMainStillPicture = 3; + static const profileRExt = 4; + + static String formatProfile(int profileIndex, int levelIndex) { + String profile; + switch (profileIndex) { + case profileMain: + profile = 'Main'; + case profileMain10: + profile = 'Main 10'; + case profileMainStillPicture: + profile = 'Main Still Picture'; + case profileRExt: + profile = 'Format Range'; + default: + return '$profileIndex'; + } + if (levelIndex <= 0) return profile; + final level = (levelIndex / 30.0).toStringAsFixed(levelIndex % 10 != 0 ? 1 : 0); + return '$profile Profile, Level $level'; + } +} diff --git a/lib/model/media/video/stereo_3d_modes.dart b/lib/model/media/video/stereo_3d_modes.dart new file mode 100644 index 0000000..d0ff76b --- /dev/null +++ b/lib/model/media/video/stereo_3d_modes.dart @@ -0,0 +1,22 @@ +class Stereo3dModes { + static const names = { + 'ab2l': 'above below half height left first', + 'tb2l': 'above below half height left first', + 'ab2r': 'above below half height right first', + 'tb2r': 'above below half height right first', + 'abl': 'above below left first', + 'tbl': 'above below left first', + 'abr': 'above below right first', + 'tbr': 'above below right first', + 'al': 'alternating frames left first', + 'ar': 'alternating frames right first', + 'sbs2l': 'side by side half width left first', + 'sbs2r': 'side by side half width right first', + 'sbsl': 'side by side left first', + 'sbsr': 'side by side right first', + 'irl': 'interleave rows left first', + 'irr': 'interleave rows right first', + 'icl': 'interleave columns left first', + 'icr': 'interleave columns right first', + }; +} diff --git a/lib/model/metadata/address.dart b/lib/model/metadata/address.dart new file mode 100644 index 0000000..02ef62c --- /dev/null +++ b/lib/model/metadata/address.dart @@ -0,0 +1,56 @@ +import 'package:aves/geo/states.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class AddressDetails extends Equatable { + final int id; + final String? countryCode, countryName, adminArea, locality; + + @override + List<Object?> get props => [id, countryCode, countryName, adminArea, locality]; + + String? get place => locality != null && locality!.isNotEmpty ? locality : adminArea; + + String? get stateCode => GeoStates.stateCodeByName[stateName]; + + String? get stateName => GeoStates.stateCountryCodes.contains(countryCode) ? adminArea : null; + + const AddressDetails({ + required this.id, + this.countryCode, + this.countryName, + this.adminArea, + this.locality, + }); + + AddressDetails copyWith({ + int? id, + }) { + return AddressDetails( + id: id ?? this.id, + countryCode: countryCode, + countryName: countryName, + adminArea: adminArea, + locality: locality, + ); + } + + factory AddressDetails.fromMap(Map map) { + return AddressDetails( + id: map['id'] as int, + countryCode: map['countryCode'] as String?, + countryName: map['countryName'] as String?, + adminArea: map['adminArea'] as String?, + locality: map['locality'] as String?, + ); + } + + Map<String, dynamic> toMap() => { + 'id': id, + 'countryCode': countryCode, + 'countryName': countryName, + 'adminArea': adminArea, + 'locality': locality, + }; +} diff --git a/lib/model/metadata/catalog.dart b/lib/model/metadata/catalog.dart new file mode 100644 index 0000000..a4d4b1f --- /dev/null +++ b/lib/model/metadata/catalog.dart @@ -0,0 +1,136 @@ +import 'package:aves/services/geocoding_service.dart'; +import 'package:flutter/foundation.dart'; + +class CatalogMetadata { + final int id; + final int? dateMillis; + final bool isAnimated, isGeotiff, is360, isMultiPage, isMotionPhoto, isHdr; + bool isFlipped; + int? rotationDegrees; + final String? mimeType, xmpSubjects, xmpTitle; + double? latitude, longitude; + Address? address; + int rating; + + // less lenient than Flutter's `precisionErrorTolerance` (1e-10) + static const double _precisionErrorTolerance = 1e-9; + + static const _isAnimatedMask = 1 << 0; + static const _isFlippedMask = 1 << 1; + static const _isGeotiffMask = 1 << 2; + static const _is360Mask = 1 << 3; + static const _isMultiPageMask = 1 << 4; + static const _isMotionPhotoMask = 1 << 5; + static const _isHdr = 1 << 6; // for images: embedded HDR gainmap, for videos: HDR color transfer + + CatalogMetadata({ + required this.id, + this.mimeType, + this.dateMillis, + this.isAnimated = false, + this.isFlipped = false, + this.isGeotiff = false, + this.is360 = false, + this.isMultiPage = false, + this.isMotionPhoto = false, + this.isHdr = false, + this.rotationDegrees, + this.xmpSubjects, + this.xmpTitle, + double? latitude, + double? longitude, + this.rating = 0, + }) { + // Geocoder throws an `IllegalArgumentException` when a coordinate has a funky value like `1.7056881853375E7` + // We also exclude zero coordinates, taking into account precision errors (e.g. {5.952380952380953e-11,-2.7777777777777777e-10}), + // but Flutter's `precisionErrorTolerance` (1e-10) is slightly too lenient for this case. + if (latitude != null && longitude != null && (latitude.abs() > _precisionErrorTolerance || longitude.abs() > _precisionErrorTolerance)) { + // funny case: some files have latitude and longitude reverse + // (e.g. a Japanese location at lat~=133 and long~=34, which is a valid longitude but an invalid latitude) + // so we should check and assign both coordinates at once + if (latitude >= -90.0 && latitude <= 90.0 && longitude >= -180.0 && longitude <= 180.0) { + this.latitude = latitude; + this.longitude = longitude; + } + } + } + + CatalogMetadata copyWith({ + int? id, + String? mimeType, + int? dateMillis, + bool? isAnimated, + bool? isMultiPage, + int? rotationDegrees, + double? latitude, + double? longitude, + }) { + return CatalogMetadata( + id: id ?? this.id, + mimeType: mimeType ?? this.mimeType, + dateMillis: dateMillis ?? this.dateMillis, + isAnimated: isAnimated ?? this.isAnimated, + isFlipped: isFlipped, + isGeotiff: isGeotiff, + is360: is360, + isMultiPage: isMultiPage ?? this.isMultiPage, + isMotionPhoto: isMotionPhoto, + isHdr: isHdr, + rotationDegrees: rotationDegrees ?? this.rotationDegrees, + xmpSubjects: xmpSubjects, + xmpTitle: xmpTitle, + latitude: latitude ?? this.latitude, + longitude: longitude ?? this.longitude, + rating: rating, + ); + } + + factory CatalogMetadata.fromMap(Map map) { + final flags = map['flags'] ?? 0; + return CatalogMetadata( + id: map['id'], + mimeType: map['mimeType'], + dateMillis: map['dateMillis'] ?? 0, + isAnimated: flags & _isAnimatedMask != 0, + isFlipped: flags & _isFlippedMask != 0, + isGeotiff: flags & _isGeotiffMask != 0, + is360: flags & _is360Mask != 0, + isMultiPage: flags & _isMultiPageMask != 0, + isMotionPhoto: flags & _isMotionPhotoMask != 0, + isHdr: flags & _isHdr != 0, + // `rotationDegrees` should default to `sourceRotationDegrees`, not 0 + rotationDegrees: map['rotationDegrees'], + xmpSubjects: map['xmpSubjects'] ?? '', + xmpTitle: map['xmpTitle'] ?? '', + latitude: map['latitude'], + longitude: map['longitude'], + rating: map['rating'] ?? 0, + ); + } + + Map<String, dynamic> toMap() => { + 'id': id, + 'mimeType': mimeType, + 'dateMillis': dateMillis, + 'flags': + (isAnimated ? _isAnimatedMask : 0) | + (isFlipped ? _isFlippedMask : 0) | + (isGeotiff ? _isGeotiffMask : 0) | + (is360 ? _is360Mask : 0) | + (isMultiPage ? _isMultiPageMask : 0) | + (isMotionPhoto ? _isMotionPhotoMask : 0) | + (isHdr ? _isHdr : 0), + 'rotationDegrees': rotationDegrees, + 'xmpSubjects': xmpSubjects, + 'xmpTitle': xmpTitle, + 'latitude': latitude, + 'longitude': longitude, + 'rating': rating, + }; + + @override + String toString() => + '$runtimeType#${shortHash(this)}{id=$id, mimeType=$mimeType, dateMillis=$dateMillis' + ', isAnimated=$isAnimated, isFlipped=$isFlipped, isGeotiff=$isGeotiff, is360=$is360, isMultiPage=$isMultiPage, isMotionPhoto=$isMotionPhoto, isHdr=$isHdr' + ', rotationDegrees=$rotationDegrees, xmpSubjects=$xmpSubjects, xmpTitle=$xmpTitle, latitude=$latitude, longitude=$longitude, rating=$rating}'; +} diff --git a/lib/model/metadata/date_modifier.dart b/lib/model/metadata/date_modifier.dart new file mode 100644 index 0000000..b34a86e --- /dev/null +++ b/lib/model/metadata/date_modifier.dart @@ -0,0 +1,51 @@ +import 'package:aves_model/aves_model.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class DateModifier extends Equatable { + static const writableFields = [ + MetadataField.exifDate, + MetadataField.exifDateOriginal, + MetadataField.exifDateDigitized, + MetadataField.exifGpsDatestamp, + MetadataField.xmpXmpCreateDate, + ]; + + final DateEditAction action; + final Set<MetadataField> fields; + final DateTime? setDateTime; + final DateFieldSource? copyFieldSource; + final int? shiftSeconds; + + @override + List<Object?> get props => [action, fields, setDateTime, copyFieldSource, shiftSeconds]; + + const DateModifier._private( + this.action, { + this.fields = const {}, + this.setDateTime, + this.copyFieldSource, + this.shiftSeconds, + }); + + factory DateModifier.setCustom(Set<MetadataField> fields, DateTime dateTime) { + return DateModifier._private(DateEditAction.setCustom, fields: fields, setDateTime: dateTime); + } + + factory DateModifier.copyField(DateFieldSource copyFieldSource) { + return DateModifier._private(DateEditAction.copyField, copyFieldSource: copyFieldSource); + } + + factory DateModifier.extractFromTitle() { + return const DateModifier._private(DateEditAction.extractFromTitle); + } + + factory DateModifier.shift(Set<MetadataField> fields, int shiftSeconds) { + return DateModifier._private(DateEditAction.shift, fields: fields, shiftSeconds: shiftSeconds); + } + + factory DateModifier.remove(Set<MetadataField> fields) { + return DateModifier._private(DateEditAction.remove, fields: fields); + } +} diff --git a/lib/model/metadata/overlay.dart b/lib/model/metadata/overlay.dart new file mode 100644 index 0000000..55e145f --- /dev/null +++ b/lib/model/metadata/overlay.dart @@ -0,0 +1,32 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class OverlayMetadata extends Equatable { + final double? aperture, focalLength; + final String? description, exposureTime; + final int? iso; + + @override + List<Object?> get props => [aperture, description, exposureTime, focalLength, iso]; + + bool get hasShootingDetails => aperture != null || exposureTime != null || focalLength != null || iso != null; + + const OverlayMetadata({ + this.aperture, + this.description, + this.exposureTime, + this.focalLength, + this.iso, + }); + + factory OverlayMetadata.fromMap(Map map) { + return OverlayMetadata( + aperture: map['aperture'] as double?, + description: map['description'] as String?, + exposureTime: map['exposureTime'] as String?, + focalLength: map['focalLength'] as double?, + iso: map['iso'] as int?, + ); + } +} diff --git a/lib/model/metadata/trash.dart b/lib/model/metadata/trash.dart new file mode 100644 index 0000000..6522164 --- /dev/null +++ b/lib/model/metadata/trash.dart @@ -0,0 +1,42 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class TrashDetails extends Equatable { + final int id; + final String path; + final int dateMillis; + + @override + List<Object?> get props => [id, path, dateMillis]; + + const TrashDetails({ + required this.id, + required this.path, + required this.dateMillis, + }); + + TrashDetails copyWith({ + int? id, + }) { + return TrashDetails( + id: id ?? this.id, + path: path, + dateMillis: dateMillis, + ); + } + + factory TrashDetails.fromMap(Map map) { + return TrashDetails( + id: map['id'] as int, + path: map['path'] as String, + dateMillis: map['dateMillis'] as int, + ); + } + + Map<String, dynamic> toMap() => { + 'id': id, + 'path': path, + 'dateMillis': dateMillis, + }; +} diff --git a/lib/model/multipage.dart b/lib/model/multipage.dart new file mode 100644 index 0000000..e8ca784 --- /dev/null +++ b/lib/model/multipage.dart @@ -0,0 +1,209 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/keys.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +class MultiPageInfo { + final AvesEntry mainEntry; + final List<SinglePageInfo> _pages; + final Map<SinglePageInfo, AvesEntry> _pageEntries = {}; + final Set<AvesEntry> _transientEntries = <AvesEntry>{}; + + int get pageCount => _pages.length; + + MultiPageInfo({ + required this.mainEntry, + required List<SinglePageInfo> pages, + }) : _pages = pages { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$MultiPageInfo', + object: this, + ); + } + if (_pages.isNotEmpty) { + _pages.sort(); + // make sure there is a page marked as default + if (defaultPage == null) { + final firstPage = _pages.removeAt(0); + _pages.insert(0, firstPage.copyWith(isDefault: true)); + } + + final stackedEntries = mainEntry.stackedEntries; + if (stackedEntries != null) { + _pageEntries.addEntries( + pages.map((pageInfo) { + final pageEntry = stackedEntries.firstWhere((entry) => entry.uri == pageInfo.uri); + return MapEntry(pageInfo, pageEntry); + }), + ); + } + } + } + + void dispose() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + _transientEntries.forEach((entry) => entry.dispose()); + } + + factory MultiPageInfo.fromPageMaps(AvesEntry mainEntry, List<Map> pageMaps) { + return MultiPageInfo( + mainEntry: mainEntry, + pages: pageMaps.map(SinglePageInfo.fromMap).toList(), + ); + } + + SinglePageInfo? get defaultPage => _pages.firstWhereOrNull((page) => page.isDefault); + + SinglePageInfo? getById(int? pageId) => _pages.firstWhereOrNull((page) => page.pageId == pageId); + + SinglePageInfo? getByIndex(int? pageIndex) => _pages.firstWhereOrNull((page) => page.index == pageIndex); + + AvesEntry getPageEntryByIndex(int? pageIndex) => _getPageEntry(getByIndex(pageIndex)); + + AvesEntry _getPageEntry(SinglePageInfo? pageInfo) { + if (pageInfo != null) { + return _pageEntries.putIfAbsent(pageInfo, () => _createPageEntry(pageInfo)); + } else { + return mainEntry; + } + } + + Set<AvesEntry> get videoPageEntries => _pages.where((page) => page.isVideo).map(_getPageEntry).toSet(); + + List<AvesEntry> get exportEntries => _pages.map((pageInfo) => _createPageEntry(pageInfo, eraseDefaultPageId: false)).toList(); + + Future<void> extractMotionPhotoVideo() async { + final videoPage = _pages.firstWhereOrNull((page) => page.isVideo); + if (videoPage != null && videoPage.uri == null) { + final fields = await embeddedDataService.extractMotionPhotoVideo(mainEntry); + if (fields.containsKey(EntryFields.uri)) { + final pageIndex = _pages.indexOf(videoPage); + _pages.removeAt(pageIndex); + _pages.insert( + pageIndex, + videoPage.copyWith( + uri: fields[EntryFields.uri] as String?, + // the initial fake page may contain inaccurate values for the following fields + // so we override them with values from the extracted standalone video + rotationDegrees: fields[EntryFields.sourceRotationDegrees] as int?, + durationMillis: fields[EntryFields.durationMillis] as int?, + ), + ); + _pageEntries.remove(videoPage); + } + } + } + + AvesEntry _createPageEntry(SinglePageInfo pageInfo, {bool eraseDefaultPageId = true}) { + // do not provide the page ID for the default page, + // so that we can treat this page like the main entry + // and retrieve cached images for it + final pageId = eraseDefaultPageId && pageInfo.isDefault ? null : pageInfo.pageId; + + // dynamically extracted video is not in the trash like the original motion photo + final trashed = (mainEntry.isMotionPhoto && pageInfo.isVideo) ? false : mainEntry.trashed; + + final pageEntry = + AvesEntry( + id: mainEntry.id, + uri: pageInfo.uri ?? mainEntry.uri, + path: mainEntry.path, + contentId: mainEntry.contentId, + pageId: pageId, + sourceMimeType: pageInfo.mimeType, + width: pageInfo.width, + height: pageInfo.height, + sourceRotationDegrees: pageInfo.rotationDegrees ?? mainEntry.sourceRotationDegrees, + sizeBytes: mainEntry.sizeBytes, + sourceTitle: mainEntry.sourceTitle, + dateAddedSecs: mainEntry.dateAddedSecs, + dateModifiedMillis: mainEntry.dateModifiedMillis, + sourceDateTakenMillis: mainEntry.sourceDateTakenMillis, + durationMillis: pageInfo.durationMillis ?? mainEntry.durationMillis, + trashed: trashed, + origin: mainEntry.origin, + ) + ..catalogMetadata = mainEntry.catalogMetadata?.copyWith( + mimeType: pageInfo.mimeType, + isMultiPage: false, + rotationDegrees: pageInfo.rotationDegrees, + ) + ..addressDetails = mainEntry.addressDetails?.copyWith() + ..trashDetails = trashed ? mainEntry.trashDetails : null; + _transientEntries.add(pageEntry); + return pageEntry; + } + + @override + String toString() => '$runtimeType#${shortHash(this)}{mainEntry=$mainEntry, pages=$_pages}'; +} + +class SinglePageInfo implements Comparable<SinglePageInfo> { + final int index, pageId; + final bool isDefault; + final String? uri; + final String mimeType; + final int width, height; + final int? rotationDegrees, durationMillis; + + const SinglePageInfo({ + required this.index, + required this.pageId, + required this.isDefault, + this.uri, + required this.mimeType, + required this.width, + required this.height, + this.rotationDegrees, + this.durationMillis, + }); + + SinglePageInfo copyWith({ + bool? isDefault, + String? uri, + int? rotationDegrees, + int? durationMillis, + }) { + return SinglePageInfo( + index: index, + pageId: pageId, + isDefault: isDefault ?? this.isDefault, + uri: uri ?? this.uri, + mimeType: mimeType, + width: width, + height: height, + rotationDegrees: rotationDegrees ?? this.rotationDegrees, + durationMillis: durationMillis ?? this.durationMillis, + ); + } + + factory SinglePageInfo.fromMap(Map map) { + final index = map['page'] as int; + return SinglePageInfo( + index: index, + pageId: index, + isDefault: map['isDefault'] as bool? ?? false, + mimeType: map['mimeType'] as String, + width: map['width'] as int? ?? 0, + height: map['height'] as int? ?? 0, + rotationDegrees: map['rotationDegrees'] as int?, + durationMillis: map['durationMillis'] as int?, + ); + } + + bool get isVideo => MimeTypes.isVideo(mimeType); + + @override + String toString() => '$runtimeType#${shortHash(this)}{index=$index, pageId=$pageId, isDefault=$isDefault, uri=$uri, mimeType=$mimeType, width=$width, height=$height, rotationDegrees=$rotationDegrees, durationMillis=$durationMillis}'; + + @override + int compareTo(SinglePageInfo other) => index.compareTo(other.index); +} diff --git a/lib/model/naming_pattern.dart b/lib/model/naming_pattern.dart new file mode 100644 index 0000000..7e977df --- /dev/null +++ b/lib/model/naming_pattern.dart @@ -0,0 +1,301 @@ +import 'package:aves/convert/convert.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:intl/intl.dart'; + +@immutable +class NamingPattern { + final List<NamingProcessor> processors; + + static final processorPattern = RegExp(r'<(.+?)(,(.+?))?>'); + static const processorOptionSeparator = ','; + static const optionKeyValueSeparator = '='; + + const NamingPattern(this.processors); + + factory NamingPattern.from({ + required String userPattern, + required int entryCount, + required String locale, + }) { + final processors = <NamingProcessor>[]; + + const defaultCounterStart = 1; + final defaultCounterPadding = '$entryCount'.length; + + var index = 0; + final matches = processorPattern.allMatches(userPattern); + matches.forEach((match) { + final start = match.start; + final end = match.end; + if (index < start) { + processors.add(LiteralNamingProcessor(userPattern.substring(index, start))); + index = start; + } + final processorKey = match.group(1); + final processorOptions = match.group(3); + switch (processorKey) { + case CounterNamingProcessor.key: + int? start, padding; + _applyProcessorOptions(processorOptions, (key, value) { + final valueInt = int.tryParse(value); + if (valueInt != null) { + switch (key) { + case CounterNamingProcessor.optionStart: + start = valueInt; + case CounterNamingProcessor.optionPadding: + padding = valueInt; + } + } + }); + processors.add(CounterNamingProcessor(start: start ?? defaultCounterStart, padding: padding ?? defaultCounterPadding)); + case DateNamingProcessor.key: + if (processorOptions != null) { + processors.add(DateNamingProcessor(processorOptions.trim(), locale)); + } + case HashNamingProcessor.key: + if (processorOptions != null) { + processors.add(HashNamingProcessor(processorOptions.trim())); + } + case MetadataFieldNamingProcessor.key: + if (processorOptions != null) { + processors.add(MetadataFieldNamingProcessor(processorOptions.trim())); + } + case NameNamingProcessor.key: + processors.add(const NameNamingProcessor()); + case WidthNamingProcessor.key: + processors.add(WidthNamingProcessor()); + case HeightNamingProcessor.key: + processors.add(HeightNamingProcessor()); + case TagsNamingProcessor.key: + processors.add(TagsNamingProcessor(processorOptions?.trim() ?? '')); + default: + debugPrint('unsupported naming processor: ${match.group(0)}'); + } + index = end; + }); + if (index < userPattern.length) { + processors.add(LiteralNamingProcessor(userPattern.substring(index, userPattern.length))); + } + + return NamingPattern(processors); + } + + static void _applyProcessorOptions(String? processorOptions, void Function(String key, String value) applyOption) { + if (processorOptions != null) { + processorOptions.split(processorOptionSeparator).map((v) => v.trim()).forEach((kv) { + final parts = kv.split(optionKeyValueSeparator); + if (parts.length >= 2) { + final key = parts[0]; + final value = parts.skip(1).join(optionKeyValueSeparator); + applyOption(key, value); + } + }); + } + } + + static int getInsertionOffset(String userPattern, int offset) { + offset = offset.clamp(0, userPattern.length); + final matches = processorPattern.allMatches(userPattern); + for (final match in matches) { + final start = match.start; + final end = match.end; + if (offset <= start) return offset; + if (offset <= end) return end; + } + return offset; + } + + static String defaultPatternFor(String processorKey) { + switch (processorKey) { + case DateNamingProcessor.key: + return '<$processorKey, yyyyMMdd-HHmmss>'; + case HashNamingProcessor.key: + return '<$processorKey, md5>'; + case TagsNamingProcessor.key: + return '<$processorKey, ->'; + case CounterNamingProcessor.key: + case NameNamingProcessor.key: + default: + if (processorKey.startsWith(MetadataFieldNamingProcessor.key)) { + final field = MetadataFieldNamingProcessor.fieldFromKey(processorKey); + return '<${MetadataFieldNamingProcessor.key}, $field>'; + } + return '<$processorKey>'; + } + } + + Future<String> apply(AvesEntry entry, int index) async { + final fields = processors.expand((v) => v.getRequiredFields()).toSet(); + final fieldValues = await metadataFetchService.getFields(entry, fields); + return processors.map((v) => v.process(entry, index, fieldValues) ?? '').join().trim(); + } +} + +@immutable +abstract class NamingProcessor extends Equatable { + const NamingProcessor(); + + @override + List<Object?> get props => []; + + String? process(AvesEntry entry, int index, Map<String, dynamic> fieldValues); + + Set<MetadataField> getRequiredFields() => {}; +} + +@immutable +class LiteralNamingProcessor extends NamingProcessor { + final String text; + + @override + List<Object?> get props => [text]; + + const LiteralNamingProcessor(this.text); + + @override + String? process(AvesEntry entry, int index, Map<String, dynamic> fieldValues) => text; +} + +@immutable +class DateNamingProcessor extends NamingProcessor { + static const key = 'date'; + + final DateFormat format; + + @override + List<Object?> get props => [format.pattern]; + + DateNamingProcessor(String pattern, String locale) : format = DateFormat(pattern, locale); + + @override + String? process(AvesEntry entry, int index, Map<String, dynamic> fieldValues) { + final date = entry.bestDate; + return date != null ? format.format(date) : null; + } +} + +@immutable +class TagsNamingProcessor extends NamingProcessor { + static const key = 'tags'; + static const defaultSeparator = ' '; + + final String separator; + + @override + List<Object?> get props => [separator]; + + TagsNamingProcessor(String separator) : separator = separator.isEmpty ? defaultSeparator : separator; + + @override + String? process(AvesEntry entry, int index, Map<String, dynamic> fieldValues) { + return entry.tags.join(separator); + } +} + +@immutable +class MetadataFieldNamingProcessor extends NamingProcessor { + static const key = 'field'; + + static String keyWithField(MetadataField field) => '$key-${field.name}'; + + // loose, for user to see and later parse + static String fieldFromKey(String keyWithField) => keyWithField.substring(key.length + 1); + + late final MetadataField? field; + + @override + List<Object?> get props => [field]; + + MetadataFieldNamingProcessor(String field) { + final lowerField = field.toLowerCase(); + this.field = MetadataField.values.firstWhereOrNull((v) => v.name.toLowerCase() == lowerField); + } + + @override + Set<MetadataField> getRequiredFields() => {field}.nonNulls.toSet(); + + @override + String? process(AvesEntry entry, int index, Map<String, dynamic> fieldValues) { + return fieldValues[field?.toPlatform]?.toString(); + } +} + +@immutable +class NameNamingProcessor extends NamingProcessor { + static const key = 'name'; + + const NameNamingProcessor(); + + @override + String? process(AvesEntry entry, int index, Map<String, dynamic> fieldValues) => entry.filenameWithoutExtension; +} + +@immutable +class WidthNamingProcessor extends NamingProcessor { + static const key = 'width'; + + @override + String? process(AvesEntry entry, int index, Map<String, dynamic> fieldValues) { + return '${entry.displaySize.width.toInt()}'; + } +} + +@immutable +class HeightNamingProcessor extends NamingProcessor { + static const key = 'height'; + + @override + String? process(AvesEntry entry, int index, Map<String, dynamic> fieldValues) { + return '${entry.displaySize.height.toInt()}'; + } +} + +@immutable +class CounterNamingProcessor extends NamingProcessor { + final int start; + final int padding; + + static const key = 'counter'; + static const optionStart = 'start'; + static const optionPadding = 'padding'; + + @override + List<Object?> get props => [start, padding]; + + const CounterNamingProcessor({ + required this.start, + required this.padding, + }); + + @override + String? process(AvesEntry entry, int index, Map<String, dynamic> fieldValues) => '${index + start}'.padLeft(padding, '0'); +} + +@immutable +class HashNamingProcessor extends NamingProcessor { + static const key = 'hash'; + static const optionFunction = 'function'; + + late final MetadataField? function; + + @override + List<Object?> get props => [function]; + + HashNamingProcessor(String function) { + final lowerField = 'hash${function.toLowerCase()}'; + this.function = MetadataField.values.firstWhereOrNull((v) => v.name.toLowerCase() == lowerField); + } + + @override + Set<MetadataField> getRequiredFields() => {function}.nonNulls.toSet(); + + @override + String? process(AvesEntry entry, int index, Map<String, dynamic> fieldValues) { + return fieldValues[function?.toPlatform]?.toString(); + } +} diff --git a/lib/model/query.dart b/lib/model/query.dart new file mode 100644 index 0000000..fa468f1 --- /dev/null +++ b/lib/model/query.dart @@ -0,0 +1,49 @@ +import 'dart:async'; + +import 'package:aves_utils/aves_utils.dart'; +import 'package:flutter/foundation.dart'; + +class Query extends ChangeNotifier { + final AChangeNotifier _focusRequestNotifier = AChangeNotifier(); + final ValueNotifier<String> _queryNotifier = ValueNotifier(''); + final StreamController<bool> _enabledStreamController = StreamController.broadcast(); + + Query({required bool enabled, required String? initialValue}) { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); + _enabled = enabled; + if (initialValue != null && initialValue.isNotEmpty) { + _enabled = true; + queryNotifier.value = initialValue; + } + } + + @override + void dispose() { + _focusRequestNotifier.dispose(); + _queryNotifier.dispose(); + super.dispose(); + } + + bool _enabled = false; + + bool get enabled => _enabled; + + set enabled(bool value) { + _enabled = value; + _enabledStreamController.add(_enabled); + queryNotifier.value = ''; + notifyListeners(); + + if (_enabled) { + focusRequestNotifier.notifyListeners(); + } + } + + void toggle() => enabled = !enabled; + + Stream<bool> get enabledStream => _enabledStreamController.stream; + + AChangeNotifier get focusRequestNotifier => _focusRequestNotifier; + + ValueNotifier<String> get queryNotifier => _queryNotifier; +} diff --git a/lib/model/selection.dart b/lib/model/selection.dart new file mode 100644 index 0000000..fbb6014 --- /dev/null +++ b/lib/model/selection.dart @@ -0,0 +1,58 @@ +import 'package:flutter/foundation.dart'; + +class Selection<T> extends ChangeNotifier { + bool _isSelecting = false; + + bool get isSelecting => _isSelecting; + + final Set<T> _selectedItems = {}; + + Set<T> get selectedItems => _selectedItems; + + Selection() { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); + } + + void browse() { + if (!_isSelecting) return; + _isSelecting = false; + notifyListeners(); + } + + void select() { + if (_isSelecting) return; + // clear selection on `select`, not on `browse`, so that + // the selection count is stable when transitioning to browse + clearSelection(); + _isSelecting = true; + notifyListeners(); + } + + bool isSelected(Iterable<T> items) => items.every(selectedItems.contains); + + void addToSelection(Iterable<T> items) { + if (items.isEmpty) return; + + select(); + _selectedItems.addAll(items); + notifyListeners(); + } + + void removeFromSelection(Iterable<T> items) { + if (items.isEmpty) return; + + _selectedItems.removeAll(items); + notifyListeners(); + } + + void clearSelection() { + _selectedItems.clear(); + notifyListeners(); + } + + void toggleSelection(T item) { + if (!_isSelecting) select(); + if (!_selectedItems.remove(item)) _selectedItems.add(item); + notifyListeners(); + } +} diff --git a/lib/model/settings/defaults.dart b/lib/model/settings/defaults.dart new file mode 100644 index 0000000..a96bc40 --- /dev/null +++ b/lib/model/settings/defaults.dart @@ -0,0 +1,150 @@ +import 'package:aves/model/filters/favourite.dart'; +import 'package:aves/model/filters/mime.dart'; +import 'package:aves/model/filters/recent.dart'; +import 'package:aves/model/naming_pattern.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/explorer/explorer_page.dart'; +import 'package:aves/widgets/filter_grids/albums_page.dart'; +import 'package:aves/widgets/filter_grids/countries_page.dart'; +import 'package:aves/widgets/filter_grids/tags_page.dart'; +import 'package:aves/widgets/navigation/nav_item.dart'; +import 'package:aves_model/aves_model.dart'; + +// ✅ NEW +import 'package:aves/model/settings/enums/local_cast_source_mode.dart'; + +class SettingsDefaults { + // app + static const hasAcceptedTerms = false; + static const canUseAnalysisService = true; + static const isInstalledAppAccessAllowed = false; + static const isErrorReportingAllowed = false; + static const tileLayout = TileLayout.grid; + static const entryRenamingPattern = '<${DateNamingProcessor.key}, yyyyMMdd-HHmmss> <${NameNamingProcessor.key}>'; + + // display + static const displayRefreshRateMode = DisplayRefreshRateMode.auto; + static const themeBrightness = AvesThemeBrightness.system; + static const themeColorMode = AvesThemeColorMode.polychrome; + static const enableDynamicColor = false; + static const enableBlurEffect = true; // `enableBlurEffect` has a contextual default value + static const maxBrightness = MaxBrightness.never; + static const forceTvLayout = false; + + // navigation + static const mustBackTwiceToExit = true; + static const keepScreenOn = KeepScreenOn.viewerOnly; + static const homePage = HomePageSetting.collection; + static const confirm = true; + static const setMetadataDateBeforeFileOp = false; + static final drawerTypeBookmarks = [ + null, + RecentlyAddedFilter.instance, + ]; + static const drawerPageBookmarks = [ + AlbumListPage.routeName, + CountryListPage.routeName, + TagListPage.routeName, + ExplorerPage.routeName, + ]; + static final bottomNavigationActions = [ + const AvesNavItem(route: CollectionPage.routeName), + AvesNavItem(route: CollectionPage.routeName, filters: {MimeFilter.video}), + AvesNavItem(route: CollectionPage.routeName, filters: {FavouriteFilter.instance}), + const AvesNavItem(route: AlbumListPage.routeName), + ]; + + // collection + static const collectionSectionFactor = EntrySectionFactor.month; + static const collectionSortFactor = EntrySortFactor.date; + static const collectionBrowsingQuickActions = [ + EntrySetAction.searchCollection, + ]; + static const collectionSelectionQuickActions = [ + EntrySetAction.share, + EntrySetAction.delete, + ]; + static const showThumbnailFavourite = true; + static const showThumbnailHdr = true; + static const thumbnailLocationIcon = ThumbnailOverlayLocationIcon.none; + static const thumbnailTagIcon = ThumbnailOverlayTagIcon.none; + static const showThumbnailMotionPhoto = true; + static const showThumbnailRating = true; + static const showThumbnailRaw = true; + static const showThumbnailVideoDuration = true; + + // filter grids + static const albumGroupFactor = AlbumChipSectionFactor.importance; + static const chipListSortFactor = ChipSortFactor.name; + + // viewer + static const viewerQuickActions = [ + EntryAction.rotateScreen, + EntryAction.toggleFavourite, + EntryAction.share, + EntryAction.delete, + ]; + static const showOverlayOnOpening = true; + static const showOverlayMinimap = false; + static const showOverlayZoomLevel = false; + static const overlayHistogramStyle = OverlayHistogramStyle.none; + static const showOverlayInfo = true; + static const showOverlayDescription = false; + static const showOverlayRatingTags = false; + static const showOverlayShootingDetails = false; + static const showOverlayThumbnailPreview = false; + static const viewerGestureSideTapNext = false; + static const viewerUseCutout = true; + static const enableMotionPhotoAutoPlay = false; + + // ✅ NEW: casting (solo per contenuti locali) + static const localCastSourceMode = LocalCastSourceMode.automatic; + + // info + static const infoMapZoom = 12.0; + static const coordinateFormat = CoordinateFormat.dms; + static const unitSystem = UnitSystem.metric; + + // tag editor + static const tagEditorCurrentFilterSectionExpanded = true; + + // converter + static const convertMimeType = MimeTypes.jpeg; + static const convertQuality = 95; + static const convertWriteMetadata = true; + + // rendering + static const imageBackground = EntryBackground.white; + + // search + static const saveSearchHistory = true; + + // bin + static const enableBin = true; + + // accessibility + static const showPinchGestureAlternatives = false; + static const accessibilityAnimations = AccessibilityAnimations.system; + static const timeToTakeAction = AccessibilityTimeout.s3; + + // slideshow + static const slideshowRepeat = false; + static const slideshowShuffle = false; + static const slideshowFillScreen = false; + static const slideshowAnimatedZoomEffect = true; + static const slideshowTransition = ViewerTransition.fade; + static const slideshowVideoPlayback = SlideshowVideoPlayback.playMuted; + static const slideshowInterval = 5; + + // widget + static const widgetOutline = false; + static const widgetShape = WidgetShape.rrect; + static const widgetOpenPage = WidgetOpenPage.viewer; + static const widgetDisplayedItem = WidgetDisplayedItem.random; + + // platform settings + static const isRotationLocked = false; + static const areAnimationsRemoved = false; +} + diff --git a/lib/model/settings/enums/accessibility_animations.dart b/lib/model/settings/enums/accessibility_animations.dart new file mode 100644 index 0000000..25f9e0f --- /dev/null +++ b/lib/model/settings/enums/accessibility_animations.dart @@ -0,0 +1,32 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraAccessibilityAnimations on AccessibilityAnimations { + bool get animate { + switch (this) { + case AccessibilityAnimations.system: + // as of Flutter v2.5.1, the check for `disableAnimations` is unreliable + // so we cannot use `window.accessibilityFeatures.disableAnimations` nor `MediaQuery.of(context).disableAnimations` + return !settings.areAnimationsRemoved; + case AccessibilityAnimations.disabled: + return false; + case AccessibilityAnimations.enabled: + return true; + } + } + + Duration get popUpAnimationDuration => animate ? ADurations.popupMenuAnimation : Duration.zero; + + Duration get popUpAnimationDelay => popUpAnimationDuration + const Duration(milliseconds: ADurations.transitionMarginMillis); + + AnimationStyle get popUpAnimationStyle { + return animate + ? AnimationStyle( + curve: Curves.easeInOutCubic, + duration: popUpAnimationDuration, + ) + : AnimationStyle.noAnimation; + } +} diff --git a/lib/model/settings/enums/accessibility_timeout.dart b/lib/model/settings/enums/accessibility_timeout.dart new file mode 100644 index 0000000..dddd22b --- /dev/null +++ b/lib/model/settings/enums/accessibility_timeout.dart @@ -0,0 +1,26 @@ +import 'package:aves/services/accessibility_service.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves_model/aves_model.dart'; + +extension ExtraAccessibilityTimeout on AccessibilityTimeout { + Future<Duration> getSnackBarDuration(bool hasAction) async { + switch (this) { + case AccessibilityTimeout.system: + if (hasAction) { + return Duration(milliseconds: await (AccessibilityService.getRecommendedTimeToTakeAction(ADurations.opToastActionDisplay))); + } else { + return Duration(milliseconds: await (AccessibilityService.getRecommendedTimeToRead(ADurations.opToastTextDisplay))); + } + case AccessibilityTimeout.s1: + return const Duration(seconds: 1); + case AccessibilityTimeout.s3: + return const Duration(seconds: 3); + case AccessibilityTimeout.s5: + return const Duration(seconds: 5); + case AccessibilityTimeout.s10: + return const Duration(seconds: 10); + case AccessibilityTimeout.s30: + return const Duration(seconds: 30); + } + } +} diff --git a/lib/model/settings/enums/coordinate_format.dart b/lib/model/settings/enums/coordinate_format.dart new file mode 100644 index 0000000..2572bac --- /dev/null +++ b/lib/model/settings/enums/coordinate_format.dart @@ -0,0 +1,95 @@ +import 'package:aves/l10n/l10n.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:latlong2/latlong.dart'; + +extension ExtraCoordinateFormat on CoordinateFormat { + static const _separator = ', '; + + String format(BuildContext context, LatLng latLng, {bool minuteSecondPadding = false, int? dmsSecondDecimals}) { + final text = formatWithoutDirectionality(context.l10n, latLng, minuteSecondPadding: minuteSecondPadding, dmsSecondDecimals: dmsSecondDecimals); + return context.applyDirectionality(text); + } + + String formatWithoutDirectionality(AppLocalizations l10n, LatLng latLng, {bool minuteSecondPadding = false, int? dmsSecondDecimals}) { + switch (this) { + case CoordinateFormat.dms: + return toDMS(l10n, latLng, minuteSecondPadding: minuteSecondPadding, secondDecimals: dmsSecondDecimals ?? 2).join(_separator); + case CoordinateFormat.ddm: + return toDDM(l10n, latLng, minutePadding: minuteSecondPadding, minuteDecimals: dmsSecondDecimals ?? 4).join(_separator); + case CoordinateFormat.decimal: + return _toDecimal(l10n, latLng).join(_separator); + } + } + + // returns coordinates formatted as DMS, e.g. ['41° 24′ 12.2″ N', '2° 10′ 26.5″ E'] + static List<String> toDMS(AppLocalizations l10n, LatLng latLng, {bool minuteSecondPadding = false, int secondDecimals = 2}) { + final locale = l10n.localeName; + final lat = latLng.latitude; + final lng = latLng.longitude; + final latSexa = _decimal2sexagesimal(lat, minuteSecondPadding, secondDecimals, locale); + final lngSexa = _decimal2sexagesimal(lng, minuteSecondPadding, secondDecimals, locale); + return [ + l10n.coordinateDms(latSexa, lat < 0 ? l10n.coordinateDmsSouth : l10n.coordinateDmsNorth), + l10n.coordinateDms(lngSexa, lng < 0 ? l10n.coordinateDmsWest : l10n.coordinateDmsEast), + ]; + } + + // returns coordinates formatted as DDM, e.g. ['41° 24.2028′ N', '2° 10.4418′ E'] + static List<String> toDDM(AppLocalizations l10n, LatLng latLng, {bool minutePadding = false, int minuteDecimals = 4}) { + final locale = l10n.localeName; + final lat = latLng.latitude; + final lng = latLng.longitude; + final latSexa = _decimal2ddm(lat, minutePadding, minuteDecimals, locale); + final lngSexa = _decimal2ddm(lng, minutePadding, minuteDecimals, locale); + return [ + l10n.coordinateDms(latSexa, lat < 0 ? l10n.coordinateDmsSouth : l10n.coordinateDmsNorth), + l10n.coordinateDms(lngSexa, lng < 0 ? l10n.coordinateDmsWest : l10n.coordinateDmsEast), + ]; + } + + static String _decimal2sexagesimal( + double degDecimal, + bool minuteSecondPadding, + int secondDecimals, + String locale, + ) { + final degAbs = degDecimal.abs(); + final deg = degAbs.toInt(); + final minDecimal = (degAbs - deg) * 60; + final min = minDecimal.toInt(); + final sec = (minDecimal - min) * 60; + + final degText = NumberFormat('0', locale).format(deg); + final minText = NumberFormat('0' * (minuteSecondPadding ? 2 : 1), locale).format(min); + final secText = NumberFormat('${'0' * (minuteSecondPadding ? 2 : 1)}${secondDecimals > 0 ? '.${'0' * secondDecimals}' : ''}', locale).format(sec); + + return '$degText° $minText′ $secText″'; + } + + static String _decimal2ddm( + double degDecimal, + bool minutePadding, + int minuteDecimals, + String locale, + ) { + final degAbs = degDecimal.abs(); + final deg = degAbs.toInt(); + final min = (degAbs - deg) * 60; + + final degText = NumberFormat('0', locale).format(deg); + final minText = NumberFormat('${'0' * (minutePadding ? 2 : 1)}${minuteDecimals > 0 ? '.${'0' * minuteDecimals}' : ''}', locale).format(min); + + return '$degText° $minText′'; + } + + static List<String> _toDecimal(AppLocalizations l10n, LatLng latLng) { + final coordinateFormatter = NumberFormat('0.000000°', l10n.localeName); + return [ + coordinateFormatter.format(latLng.latitude), + coordinateFormatter.format(latLng.longitude), + ]; + } +} diff --git a/lib/model/settings/enums/display_refresh_rate_mode.dart b/lib/model/settings/enums/display_refresh_rate_mode.dart new file mode 100644 index 0000000..32d1cd2 --- /dev/null +++ b/lib/model/settings/enums/display_refresh_rate_mode.dart @@ -0,0 +1,24 @@ +import 'package:aves/services/common/services.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_displaymode/flutter_displaymode.dart'; + +extension ExtraDisplayRefreshRateMode on DisplayRefreshRateMode { + Future<void> apply() async { + if (!await windowService.isActivity()) return; + + final androidInfo = await DeviceInfoPlugin().androidInfo; + if (androidInfo.version.sdkInt < 23) return; + + debugPrint('Apply display refresh rate: $name'); + switch (this) { + case DisplayRefreshRateMode.auto: + await FlutterDisplayMode.setPreferredMode(DisplayMode.auto); + case DisplayRefreshRateMode.highest: + await FlutterDisplayMode.setHighRefreshRate(); + case DisplayRefreshRateMode.lowest: + await FlutterDisplayMode.setLowRefreshRate(); + } + } +} diff --git a/lib/model/settings/enums/entry_background.dart b/lib/model/settings/enums/entry_background.dart new file mode 100644 index 0000000..9661c4d --- /dev/null +++ b/lib/model/settings/enums/entry_background.dart @@ -0,0 +1,25 @@ +import 'dart:ui'; + +import 'package:aves_model/aves_model.dart'; + +extension ExtraEntryBackground on EntryBackground { + bool get isColor { + switch (this) { + case EntryBackground.black: + case EntryBackground.white: + return true; + default: + return false; + } + } + + Color get color { + switch (this) { + case EntryBackground.white: + return const Color(0xFFFFFFFF); + case EntryBackground.black: + default: + return const Color(0xFF000000); + } + } +} diff --git a/lib/model/settings/enums/local_cast_source_mode.dart b/lib/model/settings/enums/local_cast_source_mode.dart new file mode 100644 index 0000000..12c0889 --- /dev/null +++ b/lib/model/settings/enums/local_cast_source_mode.dart @@ -0,0 +1,5 @@ +enum LocalCastSourceMode { + automatic, + phone, + server, +} diff --git a/lib/model/settings/enums/screen_on.dart b/lib/model/settings/enums/screen_on.dart new file mode 100644 index 0000000..2d6e63b --- /dev/null +++ b/lib/model/settings/enums/screen_on.dart @@ -0,0 +1,8 @@ +import 'package:aves/services/common/services.dart'; +import 'package:aves_model/aves_model.dart'; + +extension ExtraKeepScreenOn on KeepScreenOn { + void apply() { + windowService.keepScreenOn(this == KeepScreenOn.always); + } +} diff --git a/lib/model/settings/enums/subtitle_position.dart b/lib/model/settings/enums/subtitle_position.dart new file mode 100644 index 0000000..a37ad72 --- /dev/null +++ b/lib/model/settings/enums/subtitle_position.dart @@ -0,0 +1,13 @@ +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/painting.dart'; + +extension ExtraSubtitlePosition on SubtitlePosition { + TextAlignVertical toTextAlignVertical() { + switch (this) { + case SubtitlePosition.top: + return TextAlignVertical.top; + case SubtitlePosition.bottom: + return TextAlignVertical.bottom; + } + } +} diff --git a/lib/model/settings/enums/theme_brightness.dart b/lib/model/settings/enums/theme_brightness.dart new file mode 100644 index 0000000..5bcbd75 --- /dev/null +++ b/lib/model/settings/enums/theme_brightness.dart @@ -0,0 +1,16 @@ +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +extension ExtraAvesThemeBrightness on AvesThemeBrightness { + ThemeMode get appThemeMode { + switch (this) { + case AvesThemeBrightness.system: + return ThemeMode.system; + case AvesThemeBrightness.light: + return ThemeMode.light; + case AvesThemeBrightness.dark: + case AvesThemeBrightness.black: + return ThemeMode.dark; + } + } +} diff --git a/lib/model/settings/enums/viewer_transition.dart b/lib/model/settings/enums/viewer_transition.dart new file mode 100644 index 0000000..4bb554b --- /dev/null +++ b/lib/model/settings/enums/viewer_transition.dart @@ -0,0 +1,62 @@ +import 'dart:math'; + +import 'package:aves/widgets/viewer/controls/transitions.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraViewerTransition on ViewerTransition { + TransitionBuilder builder(PageController pageController, int index) { + switch (this) { + case ViewerTransition.slide: + return PageTransitionEffects.slide(pageController, index, parallax: false); + case ViewerTransition.parallax: + return PageTransitionEffects.slide(pageController, index, parallax: true); + case ViewerTransition.fade: + return PageTransitionEffects.fade(pageController, index, zoomIn: false); + case ViewerTransition.zoomIn: + return PageTransitionEffects.fade(pageController, index, zoomIn: true); + case ViewerTransition.none: + return PageTransitionEffects.none(pageController, index); + case ViewerTransition.random: + return _ViewerTransitionRandomizer.getBuilder(pageController, index); + } + } +} + +class _ViewerTransitionRandomizer { + static const options = [ + ViewerTransition.slide, + ViewerTransition.parallax, + ViewerTransition.fade, + ViewerTransition.zoomIn, + ]; + + static final List<(int, ViewerTransition)> _indexedTransitions = []; + + static TransitionBuilder getBuilder( + PageController pageController, + int index, + ) => (context, child) { + final negative = pageController.hasClients && pageController.position.haveDimensions && (pageController.page! - index).isNegative; + final transition = _getTransition(negative ? index - 1 : index); + final builder = transition.builder(pageController, index); + return builder(context, child); + }; + + static ViewerTransition _getTransition(int transitionIndex) { + var indexedTransition = _indexedTransitions.firstWhereOrNull((v) => v.$1 == transitionIndex); + if (indexedTransition != null) { + _indexedTransitions.remove(indexedTransition); + } else { + indexedTransition = (transitionIndex, options[Random().nextInt(options.length)]); + } + _indexedTransitions.insert(0, indexedTransition); + while (_indexedTransitions.length > 3) { + _indexedTransitions.removeLast(); + } + + final (_, transition) = indexedTransition; + return transition; + } +} diff --git a/lib/model/settings/enums/widget_outline.dart b/lib/model/settings/enums/widget_outline.dart new file mode 100644 index 0000000..660d66d --- /dev/null +++ b/lib/model/settings/enums/widget_outline.dart @@ -0,0 +1,33 @@ +import 'package:aves_model/aves_model.dart'; +import 'package:dynamic_color/dynamic_color.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +extension ExtraWidgetOutline on WidgetOutline { + Future<Color?> color(Brightness brightness) async { + switch (this) { + case WidgetOutline.none: + return SynchronousFuture(null); + case WidgetOutline.black: + return SynchronousFuture(Colors.black); + case WidgetOutline.white: + return SynchronousFuture(Colors.white); + case WidgetOutline.systemBlackAndWhite: + return SynchronousFuture(brightness == Brightness.dark ? Colors.black : Colors.white); + case WidgetOutline.systemBlackAndWhiteHighContrast: + return SynchronousFuture(brightness == Brightness.dark ? Colors.white : Colors.black); + case WidgetOutline.systemDynamicLowContrast: + final color = await _getDynamicColor(brightness == Brightness.dark ? Brightness.light : Brightness.dark); + return color ?? await WidgetOutline.systemBlackAndWhite.color(brightness); + case WidgetOutline.systemDynamic: + final color = await _getDynamicColor(brightness); + return color ?? await WidgetOutline.systemBlackAndWhiteHighContrast.color(brightness); + } + } + + Future<Color?> _getDynamicColor(Brightness brightness) async { + final corePalette = await DynamicColorPlugin.getCorePalette(); + final scheme = corePalette?.toColorScheme(brightness: brightness); + return scheme?.primary; + } +} diff --git a/lib/model/settings/enums/widget_shape.dart b/lib/model/settings/enums/widget_shape.dart new file mode 100644 index 0000000..6943a28 --- /dev/null +++ b/lib/model/settings/enums/widget_shape.dart @@ -0,0 +1,201 @@ +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/painting.dart'; + +extension ExtraWidgetShape on WidgetShape { + static const double _defaultCornerRadius = 24; + + Path path(Size widgetSize, double devicePixelRatio, {double? cornerRadiusPx}) { + final rect = Offset.zero & widgetSize; + switch (this) { + case WidgetShape.bumpyColumns: + return _buildBumpyColumnsPath(rect); + case WidgetShape.bumpyRows: + return _buildBumpyRowsPath(rect); + case WidgetShape.circle: + return Path()..addOval( + Rect.fromCircle( + center: rect.center, + radius: rect.shortestSide / 2, + ), + ); + case WidgetShape.concaveSquare: + return _buildConcaveSquarePath(rect); + case WidgetShape.heart: + return _buildHeartPath(rect); + case WidgetShape.rrect: + return Path()..addRRect(BorderRadius.circular(cornerRadiusPx ?? (_defaultCornerRadius * devicePixelRatio)).toRRect(rect)); + case WidgetShape.tearRectLeft: + final radius = cornerRadiusPx ?? (_defaultCornerRadius * devicePixelRatio); + return _buildTearRectPath(rect, topLeftRadiusPx: radius, topRightRadiusPx: radius * 2); + case WidgetShape.tearRectRight: + final radius = cornerRadiusPx ?? (_defaultCornerRadius * devicePixelRatio); + return _buildTearRectPath(rect, topLeftRadiusPx: radius * 2, topRightRadiusPx: radius); + case WidgetShape.wavyCircle16: + return _buildWavyCirclePath(rect, 16, .5); + } + } + + Path _buildBumpyColumnsPath(Rect rect) { + final radius = rect.width / 4; + final topY = radius; + final bottomY = rect.height - radius; + const angleUnit = pi / 6; + return Path() + ..moveTo(0, topY) + ..arcTo(Rect.fromCircle(center: Offset(radius, topY), radius: radius), -6 * angleUnit, 4 * angleUnit, false) + ..arcTo(Rect.fromCircle(center: Offset(radius * 2, topY), radius: radius), -4 * angleUnit, 2 * angleUnit, false) + ..arcTo(Rect.fromCircle(center: Offset(radius * 3, topY), radius: radius), -4 * angleUnit, 4 * angleUnit, false) + ..lineTo(rect.width, bottomY) + ..arcTo(Rect.fromCircle(center: Offset(radius * 3, bottomY), radius: radius), 0, 4 * angleUnit, false) + ..arcTo(Rect.fromCircle(center: Offset(radius * 2, bottomY), radius: radius), 2 * angleUnit, 2 * angleUnit, false) + ..arcTo(Rect.fromCircle(center: Offset(radius, bottomY), radius: radius), 2 * angleUnit, 4 * angleUnit, false) + ..lineTo(0, topY); + } + + Path _buildBumpyRowsPath(Rect rect) { + final radius = rect.height / 4; + final leftX = radius; + final rightX = rect.width - radius; + const angleUnit = pi / 6; + return Path() + ..moveTo(leftX, 0) + ..lineTo(rightX, 0) + ..arcTo(Rect.fromCircle(center: Offset(rightX, radius), radius: radius), -3 * angleUnit, 4 * angleUnit, false) + ..arcTo(Rect.fromCircle(center: Offset(rightX, radius * 2), radius: radius), -angleUnit, 2 * angleUnit, false) + ..arcTo(Rect.fromCircle(center: Offset(rightX, radius * 3), radius: radius), -angleUnit, 4 * angleUnit, false) + ..lineTo(leftX, rect.height) + ..arcTo(Rect.fromCircle(center: Offset(leftX, radius * 3), radius: radius), 3 * angleUnit, 4 * angleUnit, false) + ..arcTo(Rect.fromCircle(center: Offset(leftX, radius * 2), radius: radius), 5 * angleUnit, 2 * angleUnit, false) + ..arcTo(Rect.fromCircle(center: Offset(leftX, radius), radius: radius), 5 * angleUnit, 4 * angleUnit, false); + } + + Path _buildConcaveSquarePath(Rect rect) { + final center = rect.center; + final dim = rect.shortestSide; + final radius = dim / 4; + + final tl = center + Offset(-radius, -radius); + final tr = center + Offset(radius, -radius); + final br = center + Offset(radius, radius); + final bl = center + Offset(-radius, radius); + + final outsideDim = radius * (1 + sqrt(3)); + final left = center + Offset(-outsideDim, 0); + final top = center + Offset(0, -outsideDim); + final right = center + Offset(outsideDim, 0); + final bottom = center + Offset(0, outsideDim); + + final tlTop = (tl + top) / 2; + final topTr = (top + tr) / 2; + final trRight = (tr + right) / 2; + final rightBr = (right + br) / 2; + final brBottom = (br + bottom) / 2; + final bottomBl = (bottom + bl) / 2; + final blLeft = (bl + left) / 2; + final leftTl = (left + tl) / 2; + + final r = Radius.circular(radius); + return Path() + ..moveTo(tlTop.dx, tlTop.dy) + ..arcToPoint(topTr, radius: r, clockwise: false) + ..arcToPoint(trRight, radius: r) + ..arcToPoint(rightBr, radius: r, clockwise: false) + ..arcToPoint(brBottom, radius: r) + ..arcToPoint(bottomBl, radius: r, clockwise: false) + ..arcToPoint(blLeft, radius: r) + ..arcToPoint(leftTl, radius: r, clockwise: false) + ..arcToPoint(tlTop, radius: r); + } + + Path _buildHeartPath(Rect rect) { + final center = rect.center; + final dim = rect.shortestSide; + const p0dy = -.4; + const p1dx = .5; + const p1dy = -.4; + const p2dx = .8; + const p2dy = .5; + const p3dy = .5 - p0dy; + return Path() + ..moveTo(center.dx, center.dy) + ..relativeMoveTo(0, dim * p0dy) + ..relativeCubicTo(dim * -p1dx, dim * p1dy, dim * -p2dx, dim * p2dy, 0, dim * p3dy) + ..moveTo(center.dx, center.dy) + ..relativeMoveTo(0, dim * p0dy) + ..relativeCubicTo(dim * p1dx, dim * p1dy, dim * p2dx, dim * p2dy, 0, dim * p3dy); + } + + Path _buildTearRectPath(Rect rect, {required double topLeftRadiusPx, required double topRightRadiusPx}) { + final topLeftRadius = Radius.circular(topLeftRadiusPx); + final topRightRadius = Radius.circular(topRightRadiusPx); + return Path()..addRRect( + BorderRadius.only( + topLeft: topLeftRadius, + topRight: topRightRadius, + bottomLeft: topRightRadius, + bottomRight: topLeftRadius, + ).toRRect(rect), + ); + } + + Path _buildWavyCirclePath(Rect rect, int bumpCount, double amplitudeFactor, {double angleOffset = 0}) { + final center = rect.center; + final dim = rect.shortestSide; + + final waveAmplitude = amplitudeFactor / bumpCount; + final circleRadius = (dim / 2) * (1 - waveAmplitude); + + final pointCount = (dim * dim).round(); + final angleIncrement = 2 * pi / pointCount; + final points = List.generate(pointCount, (i) { + final t = angleIncrement * i; + final r = cos((t + angleOffset) * bumpCount) * waveAmplitude + 1; + final dx = r * cos(t) * circleRadius; + final dy = r * sin(t) * circleRadius; + return Offset(center.dx + dx, center.dy + dy); + }); + final origin = points.first; + + final path = Path()..moveTo(origin.dx, origin.dy); + for (var i = 0; i <= pointCount; i++) { + final p = points[i % pointCount]; + path.lineTo(p.dx, p.dy); + } + return path; + } + + double extentPx(Size widgetSizePx, AvesEntry entry) { + switch (this) { + case WidgetShape.bumpyColumns: + case WidgetShape.bumpyRows: + case WidgetShape.rrect: + case WidgetShape.tearRectLeft: + case WidgetShape.tearRectRight: + final entryRatio = entry.displayAspectRatio; + final widgetRatio = widgetSizePx.width / widgetSizePx.height; + if (entryRatio > 1) { + // landscape entry, must return thumbnail height as extent + if (widgetRatio > entryRatio) { + return widgetSizePx.width / entryRatio; + } else { + return widgetSizePx.height; + } + } else { + // portrait entry, must return thumbnail width as extent + if (widgetRatio > entryRatio) { + return widgetSizePx.width; + } else { + return widgetSizePx.height * entryRatio; + } + } + case WidgetShape.circle: + case WidgetShape.heart: + case WidgetShape.wavyCircle16: + case WidgetShape.concaveSquare: + return widgetSizePx.shortestSide; + } + } +} diff --git a/lib/model/settings/modules/app.dart b/lib/model/settings/modules/app.dart new file mode 100644 index 0000000..53ea9c1 --- /dev/null +++ b/lib/model/settings/modules/app.dart @@ -0,0 +1,142 @@ +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +mixin AppSettings on SettingsAccess { + static const int recentFilterHistoryMax = 20; + + void initAppSettings() { + vaults.addListener(_onVaultsChanged); + } + + bool get hasAcceptedTerms => getBool(SettingKeys.hasAcceptedTermsKey) ?? SettingsDefaults.hasAcceptedTerms; + + set hasAcceptedTerms(bool newValue) => set(SettingKeys.hasAcceptedTermsKey, newValue); + + bool get canUseAnalysisService => getBool(SettingKeys.canUseAnalysisServiceKey) ?? SettingsDefaults.canUseAnalysisService; + + set canUseAnalysisService(bool newValue) => set(SettingKeys.canUseAnalysisServiceKey, newValue); + + bool get isInstalledAppAccessAllowed => getBool(SettingKeys.isInstalledAppAccessAllowedKey) ?? SettingsDefaults.isInstalledAppAccessAllowed; + + set isInstalledAppAccessAllowed(bool newValue) => set(SettingKeys.isInstalledAppAccessAllowedKey, newValue); + + bool get isErrorReportingAllowed => getBool(SettingKeys.isErrorReportingAllowedKey) ?? SettingsDefaults.isErrorReportingAllowed; + + set isErrorReportingAllowed(bool newValue) => set(SettingKeys.isErrorReportingAllowedKey, newValue); + + static const localeSeparator = '-'; + + Locale? get locale { + // exceptionally allow getting locale before settings are initialized + final tag = initialized ? getString(SettingKeys.localeKey) : null; + if (tag != null) { + final codes = tag.split(localeSeparator); + return Locale.fromSubtags( + languageCode: codes[0], + scriptCode: codes[1] == '' ? null : codes[1], + countryCode: codes[2] == '' ? null : codes[2], + ); + } + return null; + } + + set locale(Locale? newValue) { + String? tag; + if (newValue != null) { + tag = [ + newValue.languageCode, + newValue.scriptCode ?? '', + newValue.countryCode ?? '', + ].join(localeSeparator); + } + set(SettingKeys.localeKey, tag); + resetAppliedLocale(); + } + + List<Locale> _systemLocalesFallback = []; + + set systemLocalesFallback(List<Locale> locales) => _systemLocalesFallback = locales; + + Locale? _appliedLocale; + + void resetAppliedLocale() => _appliedLocale = null; + + Locale get appliedLocale { + if (_appliedLocale == null) { + final _locale = locale; + final preferredLocales = <Locale>[]; + if (_locale != null) { + preferredLocales.add(_locale); + } else { + preferredLocales.addAll(WidgetsBinding.instance.platformDispatcher.locales); + if (preferredLocales.isEmpty) { + // the `window` locales may be empty in a window-less service context + preferredLocales.addAll(_systemLocalesFallback); + } + } + _appliedLocale = basicLocaleListResolution(preferredLocales, AvesApp.supportedLocales); + } + return _appliedLocale!; + } + + bool get forceWesternArabicNumerals => getBool(SettingKeys.forceWesternArabicNumeralsKey) ?? false; + + set forceWesternArabicNumerals(bool newValue) => set(SettingKeys.forceWesternArabicNumeralsKey, newValue); + + int get catalogTimeZoneOffsetMillis => getInt(SettingKeys.catalogTimeZoneOffsetMillisKey) ?? 0; + + set catalogTimeZoneOffsetMillis(int newValue) => set(SettingKeys.catalogTimeZoneOffsetMillisKey, newValue); + + double getTileExtent(String routeName) => getDouble(SettingKeys.tileExtentPrefixKey + routeName) ?? 0; + + void setTileExtent(String routeName, double newValue) => set(SettingKeys.tileExtentPrefixKey + routeName, newValue); + + TileLayout getTileLayout(String routeName) => getEnumOrDefault(SettingKeys.tileLayoutPrefixKey + routeName, SettingsDefaults.tileLayout, TileLayout.values); + + void setTileLayout(String routeName, TileLayout newValue) => set(SettingKeys.tileLayoutPrefixKey + routeName, newValue.toString()); + + String get entryRenamingPattern => getString(SettingKeys.entryRenamingPatternKey) ?? SettingsDefaults.entryRenamingPattern; + + set entryRenamingPattern(String newValue) => set(SettingKeys.entryRenamingPatternKey, newValue); + + List<int>? get topEntryIds => getStringList(SettingKeys.topEntryIdsKey)?.map(int.tryParse).nonNulls.toList(); + + set topEntryIds(List<int>? newValue) => set(SettingKeys.topEntryIdsKey, newValue?.map((id) => id.toString()).nonNulls.toList()); + + List<String> get recentDestinationAlbums => getStringList(SettingKeys.recentDestinationAlbumsKey) ?? []; + + set recentDestinationAlbums(List<String> newValue) => set(SettingKeys.recentDestinationAlbumsKey, newValue.take(recentFilterHistoryMax).toList()); + + // recent tags + + List<CollectionFilter> get _recentTags => (getStringList(SettingKeys.recentTagsKey) ?? []).map(CollectionFilter.fromJson).nonNulls.toList(); + + set _recentTags(List<CollectionFilter> newValue) => set(SettingKeys.recentTagsKey, newValue.take(recentFilterHistoryMax).map((filter) => filter.toJson()).toList()); + + // when vaults are unlocked, recent tags are transient and not persisted + List<CollectionFilter>? _protectedRecentTags; + + List<CollectionFilter> get recentTags => vaults.needProtection ? _protectedRecentTags ?? List.of(_recentTags) : _recentTags; + + set recentTags(List<CollectionFilter> newValue) { + if (vaults.needProtection) { + _protectedRecentTags = newValue; + } else { + _recentTags = newValue; + } + } + + void _onVaultsChanged() => _protectedRecentTags = null; + + void removeObsoleteRecentTags(CollectionSource? source) { + if (source != null) { + recentTags = recentTags.where((v) => v is! TagFilter || source.sortedTags.contains(v.tag)).toList(); + } + } +} diff --git a/lib/model/settings/modules/collection.dart b/lib/model/settings/modules/collection.dart new file mode 100644 index 0000000..5ccd095 --- /dev/null +++ b/lib/model/settings/modules/collection.dart @@ -0,0 +1,60 @@ +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves_model/aves_model.dart'; + +mixin CollectionSettings on SettingsAccess { + List<String> get collectionBurstPatterns => getStringList(SettingKeys.collectionBurstPatternsKey) ?? []; + + set collectionBurstPatterns(List<String> newValue) => set(SettingKeys.collectionBurstPatternsKey, newValue); + + EntrySectionFactor get collectionSectionFactor => getEnumOrDefault(SettingKeys.collectionGroupFactorKey, SettingsDefaults.collectionSectionFactor, EntrySectionFactor.values); + + set collectionSectionFactor(EntrySectionFactor newValue) => set(SettingKeys.collectionGroupFactorKey, newValue.toString()); + + EntrySortFactor get collectionSortFactor => getEnumOrDefault(SettingKeys.collectionSortFactorKey, SettingsDefaults.collectionSortFactor, EntrySortFactor.values); + + set collectionSortFactor(EntrySortFactor newValue) => set(SettingKeys.collectionSortFactorKey, newValue.toString()); + + bool get collectionSortReverse => getBool(SettingKeys.collectionSortReverseKey) ?? false; + + set collectionSortReverse(bool newValue) => set(SettingKeys.collectionSortReverseKey, newValue); + + List<EntrySetAction> get collectionBrowsingQuickActions => getEnumListOrDefault(SettingKeys.collectionBrowsingQuickActionsKey, SettingsDefaults.collectionBrowsingQuickActions, EntrySetAction.values); + + set collectionBrowsingQuickActions(List<EntrySetAction> newValue) => set(SettingKeys.collectionBrowsingQuickActionsKey, newValue.map((v) => v.toString()).toList()); + + List<EntrySetAction> get collectionSelectionQuickActions => getEnumListOrDefault(SettingKeys.collectionSelectionQuickActionsKey, SettingsDefaults.collectionSelectionQuickActions, EntrySetAction.values); + + set collectionSelectionQuickActions(List<EntrySetAction> newValue) => set(SettingKeys.collectionSelectionQuickActionsKey, newValue.map((v) => v.toString()).toList()); + + bool get showThumbnailFavourite => getBool(SettingKeys.showThumbnailFavouriteKey) ?? SettingsDefaults.showThumbnailFavourite; + + set showThumbnailFavourite(bool newValue) => set(SettingKeys.showThumbnailFavouriteKey, newValue); + + bool get showThumbnailHdr => getBool(SettingKeys.showThumbnailHdrKey) ?? SettingsDefaults.showThumbnailHdr; + + set showThumbnailHdr(bool newValue) => set(SettingKeys.showThumbnailHdrKey, newValue); + + ThumbnailOverlayLocationIcon get thumbnailLocationIcon => getEnumOrDefault(SettingKeys.thumbnailLocationIconKey, SettingsDefaults.thumbnailLocationIcon, ThumbnailOverlayLocationIcon.values); + + set thumbnailLocationIcon(ThumbnailOverlayLocationIcon newValue) => set(SettingKeys.thumbnailLocationIconKey, newValue.toString()); + + ThumbnailOverlayTagIcon get thumbnailTagIcon => getEnumOrDefault(SettingKeys.thumbnailTagIconKey, SettingsDefaults.thumbnailTagIcon, ThumbnailOverlayTagIcon.values); + + set thumbnailTagIcon(ThumbnailOverlayTagIcon newValue) => set(SettingKeys.thumbnailTagIconKey, newValue.toString()); + + bool get showThumbnailMotionPhoto => getBool(SettingKeys.showThumbnailMotionPhotoKey) ?? SettingsDefaults.showThumbnailMotionPhoto; + + set showThumbnailMotionPhoto(bool newValue) => set(SettingKeys.showThumbnailMotionPhotoKey, newValue); + + bool get showThumbnailRating => getBool(SettingKeys.showThumbnailRatingKey) ?? SettingsDefaults.showThumbnailRating; + + set showThumbnailRating(bool newValue) => set(SettingKeys.showThumbnailRatingKey, newValue); + + bool get showThumbnailRaw => getBool(SettingKeys.showThumbnailRawKey) ?? SettingsDefaults.showThumbnailRaw; + + set showThumbnailRaw(bool newValue) => set(SettingKeys.showThumbnailRawKey, newValue); + + bool get showThumbnailVideoDuration => getBool(SettingKeys.showThumbnailVideoDurationKey) ?? SettingsDefaults.showThumbnailVideoDuration; + + set showThumbnailVideoDuration(bool newValue) => set(SettingKeys.showThumbnailVideoDurationKey, newValue); +} diff --git a/lib/model/settings/modules/debug.dart b/lib/model/settings/modules/debug.dart new file mode 100644 index 0000000..f740206 --- /dev/null +++ b/lib/model/settings/modules/debug.dart @@ -0,0 +1,7 @@ +import 'package:aves_model/aves_model.dart'; + +mixin DebugSettings on SettingsAccess { + bool get debugShowViewerTiles => getBool(SettingKeys.debugShowViewerTilesKey) ?? false; + + set debugShowViewerTiles(bool newValue) => set(SettingKeys.debugShowViewerTilesKey, newValue); +} diff --git a/lib/model/settings/modules/display.dart b/lib/model/settings/modules/display.dart new file mode 100644 index 0000000..390dd87 --- /dev/null +++ b/lib/model/settings/modules/display.dart @@ -0,0 +1,37 @@ +import 'package:aves/model/device.dart'; +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves_model/aves_model.dart'; + +mixin DisplaySettings on SettingsAccess { + DisplayRefreshRateMode get displayRefreshRateMode => getEnumOrDefault(SettingKeys.displayRefreshRateModeKey, SettingsDefaults.displayRefreshRateMode, DisplayRefreshRateMode.values); + + set displayRefreshRateMode(DisplayRefreshRateMode newValue) => set(SettingKeys.displayRefreshRateModeKey, newValue.toString()); + + AvesThemeBrightness get themeBrightness => getEnumOrDefault(SettingKeys.themeBrightnessKey, SettingsDefaults.themeBrightness, AvesThemeBrightness.values); + + set themeBrightness(AvesThemeBrightness newValue) => set(SettingKeys.themeBrightnessKey, newValue.toString()); + + AvesThemeColorMode get themeColorMode => getEnumOrDefault(SettingKeys.themeColorModeKey, SettingsDefaults.themeColorMode, AvesThemeColorMode.values); + + set themeColorMode(AvesThemeColorMode newValue) => set(SettingKeys.themeColorModeKey, newValue.toString()); + + bool get enableDynamicColor => getBool(SettingKeys.enableDynamicColorKey) ?? SettingsDefaults.enableDynamicColor; + + set enableDynamicColor(bool newValue) => set(SettingKeys.enableDynamicColorKey, newValue); + + bool get enableBlurEffect => getBool(SettingKeys.enableBlurEffectKey) ?? SettingsDefaults.enableBlurEffect; + + set enableBlurEffect(bool newValue) => set(SettingKeys.enableBlurEffectKey, newValue); + + MaxBrightness get maxBrightness => getEnumOrDefault(SettingKeys.maxBrightnessKey, SettingsDefaults.maxBrightness, MaxBrightness.values); + + set maxBrightness(MaxBrightness newValue) => set(SettingKeys.maxBrightnessKey, newValue.toString()); + + bool get forceTvLayout => getBool(SettingKeys.forceTvLayoutKey) ?? SettingsDefaults.forceTvLayout; + + set forceTvLayout(bool newValue) => set(SettingKeys.forceTvLayoutKey, newValue); + + bool get useTvLayout => device.isTelevision || forceTvLayout; + + bool get isReadOnly => useTvLayout; +} diff --git a/lib/model/settings/modules/filter_grids.dart b/lib/model/settings/modules/filter_grids.dart new file mode 100644 index 0000000..1dcc772 --- /dev/null +++ b/lib/model/settings/modules/filter_grids.dart @@ -0,0 +1,117 @@ +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:synchronized/synchronized.dart'; + +mixin FilterGridsSettings on SettingsAccess { + AlbumChipSectionFactor get albumSectionFactor => getEnumOrDefault(SettingKeys.albumSectionFactorKey, SettingsDefaults.albumGroupFactor, AlbumChipSectionFactor.values); + + set albumSectionFactor(AlbumChipSectionFactor newValue) => set(SettingKeys.albumSectionFactorKey, newValue.toString()); + + ChipSortFactor get albumSortFactor => getEnumOrDefault(SettingKeys.albumSortFactorKey, SettingsDefaults.chipListSortFactor, ChipSortFactor.values); + + set albumSortFactor(ChipSortFactor newValue) => set(SettingKeys.albumSortFactorKey, newValue.toString()); + + ChipSortFactor get countrySortFactor => getEnumOrDefault(SettingKeys.countrySortFactorKey, SettingsDefaults.chipListSortFactor, ChipSortFactor.values); + + set countrySortFactor(ChipSortFactor newValue) => set(SettingKeys.countrySortFactorKey, newValue.toString()); + + ChipSortFactor get stateSortFactor => getEnumOrDefault(SettingKeys.stateSortFactorKey, SettingsDefaults.chipListSortFactor, ChipSortFactor.values); + + set stateSortFactor(ChipSortFactor newValue) => set(SettingKeys.stateSortFactorKey, newValue.toString()); + + ChipSortFactor get placeSortFactor => getEnumOrDefault(SettingKeys.placeSortFactorKey, SettingsDefaults.chipListSortFactor, ChipSortFactor.values); + + set placeSortFactor(ChipSortFactor newValue) => set(SettingKeys.placeSortFactorKey, newValue.toString()); + + ChipSortFactor get tagSortFactor => getEnumOrDefault(SettingKeys.tagSortFactorKey, SettingsDefaults.chipListSortFactor, ChipSortFactor.values); + + set tagSortFactor(ChipSortFactor newValue) => set(SettingKeys.tagSortFactorKey, newValue.toString()); + + bool get albumSortReverse => getBool(SettingKeys.albumSortReverseKey) ?? false; + + set albumSortReverse(bool newValue) => set(SettingKeys.albumSortReverseKey, newValue); + + bool get countrySortReverse => getBool(SettingKeys.countrySortReverseKey) ?? false; + + set countrySortReverse(bool newValue) => set(SettingKeys.countrySortReverseKey, newValue); + + bool get stateSortReverse => getBool(SettingKeys.stateSortReverseKey) ?? false; + + set stateSortReverse(bool newValue) => set(SettingKeys.stateSortReverseKey, newValue); + + bool get placeSortReverse => getBool(SettingKeys.placeSortReverseKey) ?? false; + + set placeSortReverse(bool newValue) => set(SettingKeys.placeSortReverseKey, newValue); + + bool get tagSortReverse => getBool(SettingKeys.tagSortReverseKey) ?? false; + + set tagSortReverse(bool newValue) => set(SettingKeys.tagSortReverseKey, newValue); + + Set<CollectionFilter> get pinnedFilters => (getStringList(SettingKeys.pinnedFiltersKey) ?? []).map(CollectionFilter.fromJson).nonNulls.toSet(); + + set pinnedFilters(Set<CollectionFilter> newValue) => set(SettingKeys.pinnedFiltersKey, newValue.map((filter) => filter.toJson()).toList()); + + bool getShowTitleQuery(String routeName) => getBool(SettingKeys.showTitleQueryPrefixKey + routeName) ?? false; + + void setShowTitleQuery(String routeName, bool newValue) => set(SettingKeys.showTitleQueryPrefixKey + routeName, newValue); + + void resetShowTitleQuery() { + final configuredKeys = store.getKeys().where((v) => v.startsWith(SettingKeys.showTitleQueryPrefixKey)).toSet(); + configuredKeys.forEach((key) => set(key, false)); + } + + Map<Uri, Set<Uri>> get albumGroups => FilterGrouping.fromJson(getString(SettingKeys.albumGroupsKey)) ?? {}; + + set albumGroups(Map<Uri, Set<Uri>> groups) => set(SettingKeys.albumGroupsKey, FilterGrouping.toJson(groups)); + + Map<Uri, Set<Uri>> get tagGroups => FilterGrouping.fromJson(getString(SettingKeys.tagGroupsKey)) ?? {}; + + set tagGroups(Map<Uri, Set<Uri>> groups) => set(SettingKeys.tagGroupsKey, FilterGrouping.toJson(groups)); + + // listening + + final _lockForPins = Lock(); + + Future<void> updatePinnedDynamicAlbums(Map<DynamicAlbumFilter, DynamicAlbumFilter?> changes) async { + await _lockForPins.synchronized(() async { + final _pinnedFilters = pinnedFilters; + bool changed = false; + changes.forEach((oldFilter, newFilter) { + if (newFilter != null) { + changed |= _pinnedFilters.replace(oldFilter, newFilter); + } else { + changed |= _pinnedFilters.remove(oldFilter); + } + }); + if (changed) { + pinnedFilters = _pinnedFilters; + } + }); + } + + Future<void> updatePinnedGroup(Uri oldGroupUri, Uri newGroupUri) async { + await _lockForPins.synchronized(() async { + final _pinnedFilters = pinnedFilters; + bool changed = false; + final grouping = FilterGrouping.forUri(oldGroupUri); + if (grouping != null) { + final oldFilter = grouping.uriToFilter(oldGroupUri); + final newFilter = grouping.uriToFilter(newGroupUri); + if (oldFilter != null && newFilter != null) { + changed |= _pinnedFilters.replace(oldFilter, newFilter); + } + } + if (changed) { + pinnedFilters = _pinnedFilters; + } + }); + } + + void saveAlbumGroups() => albumGroups = albumGrouping.allGroups; + + void saveTagGroups() => tagGroups = tagGrouping.allGroups; +} diff --git a/lib/model/settings/modules/info.dart b/lib/model/settings/modules/info.dart new file mode 100644 index 0000000..18e8094 --- /dev/null +++ b/lib/model/settings/modules/info.dart @@ -0,0 +1,16 @@ +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves_model/aves_model.dart'; + +mixin InfoSettings on SettingsAccess { + double get infoMapZoom => getDouble(SettingKeys.infoMapZoomKey) ?? SettingsDefaults.infoMapZoom; + + set infoMapZoom(double newValue) => set(SettingKeys.infoMapZoomKey, newValue); + + CoordinateFormat get coordinateFormat => getEnumOrDefault(SettingKeys.coordinateFormatKey, SettingsDefaults.coordinateFormat, CoordinateFormat.values); + + set coordinateFormat(CoordinateFormat newValue) => set(SettingKeys.coordinateFormatKey, newValue.toString()); + + UnitSystem get unitSystem => getEnumOrDefault(SettingKeys.unitSystemKey, SettingsDefaults.unitSystem, UnitSystem.values); + + set unitSystem(UnitSystem newValue) => set(SettingKeys.unitSystemKey, newValue.toString()); +} diff --git a/lib/model/settings/modules/navigation.dart b/lib/model/settings/modules/navigation.dart new file mode 100644 index 0000000..94d7634 --- /dev/null +++ b/lib/model/settings/modules/navigation.dart @@ -0,0 +1,142 @@ +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/explorer/explorer_page.dart'; +import 'package:aves/widgets/filter_grids/albums_page.dart'; +import 'package:aves/widgets/filter_grids/tags_page.dart'; +import 'package:aves/widgets/navigation/nav_item.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:synchronized/synchronized.dart'; + +mixin NavigationSettings on SettingsAccess { + bool get mustBackTwiceToExit => getBool(SettingKeys.mustBackTwiceToExitKey) ?? SettingsDefaults.mustBackTwiceToExit; + + set mustBackTwiceToExit(bool newValue) => set(SettingKeys.mustBackTwiceToExitKey, newValue); + + KeepScreenOn get keepScreenOn => getEnumOrDefault(SettingKeys.keepScreenOnKey, SettingsDefaults.keepScreenOn, KeepScreenOn.values); + + set keepScreenOn(KeepScreenOn newValue) => set(SettingKeys.keepScreenOnKey, newValue.toString()); + + HomePageSetting get homePage => getEnumOrDefault(SettingKeys.homePageKey, SettingsDefaults.homePage, HomePageSetting.values); + + Set<CollectionFilter> get homeCustomCollection => (getStringList(SettingKeys.homeCustomCollectionKey) ?? []).map(CollectionFilter.fromJson).nonNulls.toSet(); + + String? get homeCustomExplorerPath => getString(SettingKeys.homeCustomExplorerPathKey); + + AvesNavItem get homeNavItem { + switch (homePage) { + case HomePageSetting.collection: + return AvesNavItem(route: CollectionPage.routeName, filters: homeCustomCollection); + case HomePageSetting.albums: + return const AvesNavItem(route: AlbumListPage.routeName); + case HomePageSetting.tags: + return const AvesNavItem(route: TagListPage.routeName); + case HomePageSetting.explorer: + return AvesNavItem(route: ExplorerPage.routeName, path: homeCustomExplorerPath); + } + } + + void setHome( + HomePageSetting homePage, { + Set<CollectionFilter> customCollection = const {}, + String? customExplorerPath, + }) { + set(SettingKeys.homePageKey, homePage.toString()); + set(SettingKeys.homeCustomCollectionKey, customCollection.map((filter) => filter.toJson()).toList()); + set(SettingKeys.homeCustomExplorerPathKey, customExplorerPath); + } + + bool get confirmCreateVault => getBool(SettingKeys.confirmCreateVaultKey) ?? SettingsDefaults.confirm; + + set confirmCreateVault(bool newValue) => set(SettingKeys.confirmCreateVaultKey, newValue); + + bool get confirmDeleteForever => getBool(SettingKeys.confirmDeleteForeverKey) ?? SettingsDefaults.confirm; + + set confirmDeleteForever(bool newValue) => set(SettingKeys.confirmDeleteForeverKey, newValue); + + bool get confirmMoveToBin => getBool(SettingKeys.confirmMoveToBinKey) ?? SettingsDefaults.confirm; + + set confirmMoveToBin(bool newValue) => set(SettingKeys.confirmMoveToBinKey, newValue); + + bool get confirmMoveUndatedItems => getBool(SettingKeys.confirmMoveUndatedItemsKey) ?? SettingsDefaults.confirm; + + set confirmMoveUndatedItems(bool newValue) => set(SettingKeys.confirmMoveUndatedItemsKey, newValue); + + bool get confirmAfterMoveToBin => getBool(SettingKeys.confirmAfterMoveToBinKey) ?? SettingsDefaults.confirm; + + set confirmAfterMoveToBin(bool newValue) => set(SettingKeys.confirmAfterMoveToBinKey, newValue); + + bool get setMetadataDateBeforeFileOp => getBool(SettingKeys.setMetadataDateBeforeFileOpKey) ?? SettingsDefaults.setMetadataDateBeforeFileOp; + + set setMetadataDateBeforeFileOp(bool newValue) => set(SettingKeys.setMetadataDateBeforeFileOpKey, newValue); + + List<CollectionFilter?> get drawerTypeBookmarks => + getStringList(SettingKeys.drawerTypeBookmarksKey)?.map((v) { + if (v.isEmpty) return null; + return CollectionFilter.fromJson(v); + }).toList() ?? + SettingsDefaults.drawerTypeBookmarks; + + set drawerTypeBookmarks(List<CollectionFilter?> newValue) => set(SettingKeys.drawerTypeBookmarksKey, newValue.map((filter) => filter?.toJson() ?? '').toList()); + + List<AlbumBaseFilter>? get drawerAlbumBookmarks => getStringList(SettingKeys.drawerAlbumBookmarksKey)?.map(CollectionFilter.fromJson).whereType<AlbumBaseFilter>().toList(); + + set drawerAlbumBookmarks(List<AlbumBaseFilter>? newValue) => set(SettingKeys.drawerAlbumBookmarksKey, newValue?.map((filter) => filter.toJson()).toList()); + + List<String> get drawerPageBookmarks => getStringList(SettingKeys.drawerPageBookmarksKey) ?? SettingsDefaults.drawerPageBookmarks; + + set drawerPageBookmarks(List<String> newValue) => set(SettingKeys.drawerPageBookmarksKey, newValue); + + List<AvesNavItem> get bottomNavigationActions => getStringList(SettingKeys.bottomNavigationActionsKey)?.map(AvesNavItem.fromJson).nonNulls.toList() ?? SettingsDefaults.bottomNavigationActions; + + set bottomNavigationActions(List<AvesNavItem>? newValue) => set(SettingKeys.bottomNavigationActionsKey, newValue?.map((v) => v.toJson()).toList()); + + bool get enableBottomNavigationBar => bottomNavigationActions.length >= 2; + + // listening + + final _lockForBookmarks = Lock(); + + Future<void> updateBookmarkedDynamicAlbums(Map<DynamicAlbumFilter, DynamicAlbumFilter?> changes) async { + await _lockForBookmarks.synchronized(() async { + final _bookmarks = drawerAlbumBookmarks; + bool changed = false; + if (_bookmarks != null) { + changes.forEach((oldFilter, newFilter) { + if (newFilter != null) { + changed |= _bookmarks.replace(oldFilter, newFilter); + } else { + changed |= _bookmarks.remove(oldFilter); + } + }); + } + if (changed) { + drawerAlbumBookmarks = _bookmarks; + } + }); + } + + Future<void> updateBookmarkedGroup(Uri oldGroupUri, Uri newGroupUri) async { + await _lockForBookmarks.synchronized(() async { + final _bookmarks = drawerAlbumBookmarks; + bool changed = false; + if (_bookmarks != null) { + final grouping = FilterGrouping.forUri(oldGroupUri); + if (grouping != null) { + final oldFilter = grouping.uriToFilter(oldGroupUri); + final newFilter = grouping.uriToFilter(newGroupUri); + if (oldFilter is AlbumBaseFilter && newFilter is AlbumBaseFilter) { + changed |= _bookmarks.replace(oldFilter, newFilter); + } + } + } + if (changed) { + drawerAlbumBookmarks = _bookmarks; + } + }); + } +} diff --git a/lib/model/settings/modules/privacy.dart b/lib/model/settings/modules/privacy.dart new file mode 100644 index 0000000..a6408b8 --- /dev/null +++ b/lib/model/settings/modules/privacy.dart @@ -0,0 +1,46 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/modules/search.dart'; +import 'package:aves_model/aves_model.dart'; + +mixin PrivacySettings on SettingsAccess, SearchSettings { + Set<CollectionFilter> get hiddenFilters => (getStringList(SettingKeys.hiddenFiltersKey) ?? []).map(CollectionFilter.fromJson).nonNulls.toSet(); + + set hiddenFilters(Set<CollectionFilter> newValue) => set(SettingKeys.hiddenFiltersKey, newValue.map((filter) => filter.toJson()).toList()); + + void changeFilterVisibility(Set<CollectionFilter> filters, bool visible) { + final _deactivatedHiddenFilters = deactivatedHiddenFilters; + final _hiddenFilters = hiddenFilters; + + _deactivatedHiddenFilters.removeAll(filters); + if (visible) { + _hiddenFilters.removeAll(filters); + } else { + _hiddenFilters.addAll(filters); + searchHistory = searchHistory..removeWhere(filters.contains); + } + + deactivatedHiddenFilters = _deactivatedHiddenFilters; + hiddenFilters = _hiddenFilters; + } + + Set<CollectionFilter> get deactivatedHiddenFilters => (getStringList(SettingKeys.deactivatedHiddenFiltersKey) ?? []).map(CollectionFilter.fromJson).nonNulls.toSet(); + + set deactivatedHiddenFilters(Set<CollectionFilter> newValue) => set(SettingKeys.deactivatedHiddenFiltersKey, newValue.map((filter) => filter.toJson()).toList()); + + void activateHiddenFilter(CollectionFilter filter, bool active) { + final _deactivatedHiddenFilters = deactivatedHiddenFilters; + final _hiddenFilters = hiddenFilters; + + if (active) { + _deactivatedHiddenFilters.remove(filter); + _hiddenFilters.add(filter); + searchHistory = searchHistory..remove(filter); + } else { + _deactivatedHiddenFilters.add(filter); + _hiddenFilters.remove(filter); + } + + deactivatedHiddenFilters = _deactivatedHiddenFilters; + hiddenFilters = _hiddenFilters; + } +} diff --git a/lib/model/settings/modules/screen_saver.dart b/lib/model/settings/modules/screen_saver.dart new file mode 100644 index 0000000..176bac4 --- /dev/null +++ b/lib/model/settings/modules/screen_saver.dart @@ -0,0 +1,29 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves_model/aves_model.dart'; + +mixin ScreenSaverSettings on SettingsAccess { + bool get screenSaverFillScreen => getBool(SettingKeys.screenSaverFillScreenKey) ?? SettingsDefaults.slideshowFillScreen; + + set screenSaverFillScreen(bool newValue) => set(SettingKeys.screenSaverFillScreenKey, newValue); + + bool get screenSaverAnimatedZoomEffect => getBool(SettingKeys.screenSaverAnimatedZoomEffectKey) ?? SettingsDefaults.slideshowAnimatedZoomEffect; + + set screenSaverAnimatedZoomEffect(bool newValue) => set(SettingKeys.screenSaverAnimatedZoomEffectKey, newValue); + + ViewerTransition get screenSaverTransition => getEnumOrDefault(SettingKeys.screenSaverTransitionKey, SettingsDefaults.slideshowTransition, ViewerTransition.values); + + set screenSaverTransition(ViewerTransition newValue) => set(SettingKeys.screenSaverTransitionKey, newValue.toString()); + + SlideshowVideoPlayback get screenSaverVideoPlayback => getEnumOrDefault(SettingKeys.screenSaverVideoPlaybackKey, SettingsDefaults.slideshowVideoPlayback, SlideshowVideoPlayback.values); + + set screenSaverVideoPlayback(SlideshowVideoPlayback newValue) => set(SettingKeys.screenSaverVideoPlaybackKey, newValue.toString()); + + int get screenSaverInterval => getInt(SettingKeys.screenSaverIntervalKey) ?? SettingsDefaults.slideshowInterval; + + set screenSaverInterval(int newValue) => set(SettingKeys.screenSaverIntervalKey, newValue); + + Set<CollectionFilter> get screenSaverCollectionFilters => (getStringList(SettingKeys.screenSaverCollectionFiltersKey) ?? []).map(CollectionFilter.fromJson).nonNulls.toSet(); + + set screenSaverCollectionFilters(Set<CollectionFilter> newValue) => set(SettingKeys.screenSaverCollectionFiltersKey, newValue.map((filter) => filter.toJson()).toList()); +} diff --git a/lib/model/settings/modules/search.dart b/lib/model/settings/modules/search.dart new file mode 100644 index 0000000..3a5ff94 --- /dev/null +++ b/lib/model/settings/modules/search.dart @@ -0,0 +1,13 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves_model/aves_model.dart'; + +mixin SearchSettings on SettingsAccess { + bool get saveSearchHistory => getBool(SettingKeys.saveSearchHistoryKey) ?? SettingsDefaults.saveSearchHistory; + + set saveSearchHistory(bool newValue) => set(SettingKeys.saveSearchHistoryKey, newValue); + + List<CollectionFilter> get searchHistory => (getStringList(SettingKeys.searchHistoryKey) ?? []).map(CollectionFilter.fromJson).nonNulls.toList(); + + set searchHistory(List<CollectionFilter> newValue) => set(SettingKeys.searchHistoryKey, newValue.map((filter) => filter.toJson()).toList()); +} diff --git a/lib/model/settings/modules/slideshow.dart b/lib/model/settings/modules/slideshow.dart new file mode 100644 index 0000000..50740e9 --- /dev/null +++ b/lib/model/settings/modules/slideshow.dart @@ -0,0 +1,32 @@ +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves_model/aves_model.dart'; + +mixin SlideshowSettings on SettingsAccess { + bool get slideshowRepeat => getBool(SettingKeys.slideshowRepeatKey) ?? SettingsDefaults.slideshowRepeat; + + set slideshowRepeat(bool newValue) => set(SettingKeys.slideshowRepeatKey, newValue); + + bool get slideshowShuffle => getBool(SettingKeys.slideshowShuffleKey) ?? SettingsDefaults.slideshowShuffle; + + set slideshowShuffle(bool newValue) => set(SettingKeys.slideshowShuffleKey, newValue); + + bool get slideshowFillScreen => getBool(SettingKeys.slideshowFillScreenKey) ?? SettingsDefaults.slideshowFillScreen; + + set slideshowFillScreen(bool newValue) => set(SettingKeys.slideshowFillScreenKey, newValue); + + bool get slideshowAnimatedZoomEffect => getBool(SettingKeys.slideshowAnimatedZoomEffectKey) ?? SettingsDefaults.slideshowAnimatedZoomEffect; + + set slideshowAnimatedZoomEffect(bool newValue) => set(SettingKeys.slideshowAnimatedZoomEffectKey, newValue); + + ViewerTransition get slideshowTransition => getEnumOrDefault(SettingKeys.slideshowTransitionKey, SettingsDefaults.slideshowTransition, ViewerTransition.values); + + set slideshowTransition(ViewerTransition newValue) => set(SettingKeys.slideshowTransitionKey, newValue.toString()); + + SlideshowVideoPlayback get slideshowVideoPlayback => getEnumOrDefault(SettingKeys.slideshowVideoPlaybackKey, SettingsDefaults.slideshowVideoPlayback, SlideshowVideoPlayback.values); + + set slideshowVideoPlayback(SlideshowVideoPlayback newValue) => set(SettingKeys.slideshowVideoPlaybackKey, newValue.toString()); + + int get slideshowInterval => getInt(SettingKeys.slideshowIntervalKey) ?? SettingsDefaults.slideshowInterval; + + set slideshowInterval(int newValue) => set(SettingKeys.slideshowIntervalKey, newValue); +} diff --git a/lib/model/settings/modules/viewer.dart b/lib/model/settings/modules/viewer.dart new file mode 100644 index 0000000..044b39c --- /dev/null +++ b/lib/model/settings/modules/viewer.dart @@ -0,0 +1,75 @@ +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves_model/aves_model.dart'; + +// ✅ NEW +import 'package:aves/model/settings/enums/local_cast_source_mode.dart'; + +mixin ViewerSettings on SettingsAccess { + List<EntryAction> get viewerQuickActions => getEnumListOrDefault(SettingKeys.viewerQuickActionsKey, SettingsDefaults.viewerQuickActions, EntryAction.values); + + set viewerQuickActions(List<EntryAction> newValue) => set(SettingKeys.viewerQuickActionsKey, newValue.map((v) => v.toString()).toList()); + + bool get showOverlayOnOpening => getBool(SettingKeys.showOverlayOnOpeningKey) ?? SettingsDefaults.showOverlayOnOpening; + + set showOverlayOnOpening(bool newValue) => set(SettingKeys.showOverlayOnOpeningKey, newValue); + + bool get showOverlayMinimap => getBool(SettingKeys.showOverlayMinimapKey) ?? SettingsDefaults.showOverlayMinimap; + + set showOverlayMinimap(bool newValue) => set(SettingKeys.showOverlayMinimapKey, newValue); + + bool get showOverlayZoomLevel => getBool(SettingKeys.showOverlayZoomLevelKey) ?? SettingsDefaults.showOverlayZoomLevel; + + set showOverlayZoomLevel(bool newValue) => set(SettingKeys.showOverlayZoomLevelKey, newValue); + + OverlayHistogramStyle get overlayHistogramStyle => getEnumOrDefault(SettingKeys.overlayHistogramStyleKey, SettingsDefaults.overlayHistogramStyle, OverlayHistogramStyle.values); + + set overlayHistogramStyle(OverlayHistogramStyle newValue) => set(SettingKeys.overlayHistogramStyleKey, newValue.toString()); + + bool get showOverlayInfo => getBool(SettingKeys.showOverlayInfoKey) ?? SettingsDefaults.showOverlayInfo; + + set showOverlayInfo(bool newValue) => set(SettingKeys.showOverlayInfoKey, newValue); + + bool get showOverlayDescription => getBool(SettingKeys.showOverlayDescriptionKey) ?? SettingsDefaults.showOverlayDescription; + + set showOverlayDescription(bool newValue) => set(SettingKeys.showOverlayDescriptionKey, newValue); + + bool get showOverlayRatingTags => getBool(SettingKeys.showOverlayRatingTagsKey) ?? SettingsDefaults.showOverlayRatingTags; + + set showOverlayRatingTags(bool newValue) => set(SettingKeys.showOverlayRatingTagsKey, newValue); + + bool get showOverlayShootingDetails => getBool(SettingKeys.showOverlayShootingDetailsKey) ?? SettingsDefaults.showOverlayShootingDetails; + + set showOverlayShootingDetails(bool newValue) => set(SettingKeys.showOverlayShootingDetailsKey, newValue); + + bool get showOverlayThumbnailPreview => getBool(SettingKeys.showOverlayThumbnailPreviewKey) ?? SettingsDefaults.showOverlayThumbnailPreview; + + set showOverlayThumbnailPreview(bool newValue) => set(SettingKeys.showOverlayThumbnailPreviewKey, newValue); + + bool get viewerGestureSideTapNext => getBool(SettingKeys.viewerGestureSideTapNextKey) ?? SettingsDefaults.viewerGestureSideTapNext; + + set viewerGestureSideTapNext(bool newValue) => set(SettingKeys.viewerGestureSideTapNextKey, newValue); + + bool get viewerUseCutout => getBool(SettingKeys.viewerUseCutoutKey) ?? SettingsDefaults.viewerUseCutout; + + set viewerUseCutout(bool newValue) => set(SettingKeys.viewerUseCutoutKey, newValue); + + bool get enableMotionPhotoAutoPlay => getBool(SettingKeys.enableMotionPhotoAutoPlayKey) ?? SettingsDefaults.enableMotionPhotoAutoPlay; + + set enableMotionPhotoAutoPlay(bool newValue) => set(SettingKeys.enableMotionPhotoAutoPlayKey, newValue); + + EntryBackground get imageBackground => getEnumOrDefault(SettingKeys.imageBackgroundKey, SettingsDefaults.imageBackground, EntryBackground.values); + + set imageBackground(EntryBackground newValue) => set(SettingKeys.imageBackgroundKey, newValue.toString()); + + // ✅ NEW: casting (solo per contenuti locali) + LocalCastSourceMode get localCastSourceMode => getEnumOrDefault( + SettingKeys.localCastSourceModeKey, + SettingsDefaults.localCastSourceMode, + LocalCastSourceMode.values, + ); + + set localCastSourceMode(LocalCastSourceMode newValue) => set( + SettingKeys.localCastSourceModeKey, + newValue.toString(), + ); +} diff --git a/lib/model/settings/modules/widget.dart b/lib/model/settings/modules/widget.dart new file mode 100644 index 0000000..f1b3c91 --- /dev/null +++ b/lib/model/settings/modules/widget.dart @@ -0,0 +1,29 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves_model/aves_model.dart'; + +mixin WidgetSettings on SettingsAccess { + WidgetOutline getWidgetOutline(int widgetId) => getEnumOrDefault('${SettingKeys.widgetOutlinePrefixKey}$widgetId', WidgetOutline.none, WidgetOutline.values); + + void setWidgetOutline(int widgetId, WidgetOutline newValue) => set('${SettingKeys.widgetOutlinePrefixKey}$widgetId', newValue.toString()); + + WidgetShape getWidgetShape(int widgetId) => getEnumOrDefault('${SettingKeys.widgetShapePrefixKey}$widgetId', SettingsDefaults.widgetShape, WidgetShape.values); + + void setWidgetShape(int widgetId, WidgetShape newValue) => set('${SettingKeys.widgetShapePrefixKey}$widgetId', newValue.toString()); + + Set<CollectionFilter> getWidgetCollectionFilters(int widgetId) => (getStringList('${SettingKeys.widgetCollectionFiltersPrefixKey}$widgetId') ?? []).map(CollectionFilter.fromJson).nonNulls.toSet(); + + void setWidgetCollectionFilters(int widgetId, Set<CollectionFilter> newValue) => set('${SettingKeys.widgetCollectionFiltersPrefixKey}$widgetId', newValue.map((filter) => filter.toJson()).toList()); + + WidgetOpenPage getWidgetOpenPage(int widgetId) => getEnumOrDefault('${SettingKeys.widgetOpenPagePrefixKey}$widgetId', SettingsDefaults.widgetOpenPage, WidgetOpenPage.values); + + void setWidgetOpenPage(int widgetId, WidgetOpenPage newValue) => set('${SettingKeys.widgetOpenPagePrefixKey}$widgetId', newValue.toString()); + + WidgetDisplayedItem getWidgetDisplayedItem(int widgetId) => getEnumOrDefault('${SettingKeys.widgetDisplayedItemPrefixKey}$widgetId', SettingsDefaults.widgetDisplayedItem, WidgetDisplayedItem.values); + + void setWidgetDisplayedItem(int widgetId, WidgetDisplayedItem newValue) => set('${SettingKeys.widgetDisplayedItemPrefixKey}$widgetId', newValue.toString()); + + String? getWidgetUri(int widgetId) => getString('${SettingKeys.widgetUriPrefixKey}$widgetId'); + + void setWidgetUri(int widgetId, String? newValue) => set('${SettingKeys.widgetUriPrefixKey}$widgetId', newValue); +} diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart new file mode 100644 index 0000000..bb56a58 --- /dev/null +++ b/lib/model/settings/settings.dart @@ -0,0 +1,524 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:math'; + +import 'package:aves/app_flavor.dart'; +import 'package:aves/model/device.dart'; +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/filters/favourite.dart'; +import 'package:aves/model/filters/mime.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/modules/app.dart'; +import 'package:aves/model/settings/modules/collection.dart'; +import 'package:aves/model/settings/modules/debug.dart'; +import 'package:aves/model/settings/modules/display.dart'; +import 'package:aves/model/settings/modules/filter_grids.dart'; +import 'package:aves/model/settings/modules/info.dart'; +import 'package:aves/model/settings/modules/navigation.dart'; +import 'package:aves/model/settings/modules/privacy.dart'; +import 'package:aves/model/settings/modules/screen_saver.dart'; +import 'package:aves/model/settings/modules/search.dart'; +import 'package:aves/model/settings/modules/slideshow.dart'; +import 'package:aves/model/settings/modules/viewer.dart'; +import 'package:aves/model/settings/modules/widget.dart'; +import 'package:aves/ref/bursts.dart'; +import 'package:aves/services/accessibility_service.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/search/page.dart'; +import 'package:aves/widgets/filter_grids/albums_page.dart'; +import 'package:aves/widgets/filter_grids/countries_page.dart'; +import 'package:aves/widgets/filter_grids/places_page.dart'; +import 'package:aves/widgets/filter_grids/tags_page.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:collection/collection.dart'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/services.dart'; +import 'package:latlong2/latlong.dart'; + +final Settings settings = Settings._private(); + +class Settings + with + ChangeNotifier, + SettingsAccess, + SearchSettings, + AppSettings, + CollectionSettings, + DebugSettings, + DisplaySettings, + FilterGridsSettings, + InfoSettings, + NavigationSettings, + PrivacySettings, + ScreenSaverSettings, + SlideshowSettings, + SubtitlesSettings, + VideoSettings, + ViewerSettings, + WidgetSettings { + final Set<StreamSubscription> _subscriptions = {}; + final EventChannel _platformSettingsChangeChannel = const OptionalEventChannel('deckers.thibault/aves/settings_change'); + final StreamController<SettingsChangedEvent> _updateStreamController = StreamController.broadcast(); + final StreamController<SettingsChangedEvent> _updateTileExtentStreamController = StreamController.broadcast(); + + @override + Stream<SettingsChangedEvent> get updateStream => _updateStreamController.stream; + + Stream<SettingsChangedEvent> get updateTileExtentStream => _updateTileExtentStreamController.stream; + + @override + bool get initialized => store.initialized; + + @override + SettingsStore get store => settingsStore; + + Settings._private() { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); + } + + Future<void> init({ + required bool monitorPlatformSettings, + required bool shouldSanitize, + }) async { + await store.init(); + resetAppliedLocale(); + _unregister(); + _register(monitorPlatformSettings); + initAppSettings(); + if (shouldSanitize) { + await sanitize(); + } + } + + void _unregister() { + albumGrouping.removeListener(saveAlbumGroups); + tagGrouping.removeListener(saveTagGroups); + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + void _register(bool monitorPlatformSettings) { + albumGrouping.addListener(saveAlbumGroups); + tagGrouping.addListener(saveTagGroups); + _subscriptions.add( + dynamicAlbums.eventBus.on<DynamicAlbumChangedEvent>().listen((e) { + final changes = e.changes; + updateBookmarkedDynamicAlbums(changes); + updatePinnedDynamicAlbums(changes); + }), + ); + _subscriptions.add(albumGrouping.eventBus.on<GroupUriChangedEvent>().listen(_onGroupingChange)); + _subscriptions.add(tagGrouping.eventBus.on<GroupUriChangedEvent>().listen(_onGroupingChange)); + if (monitorPlatformSettings) { + _subscriptions.add(_platformSettingsChangeChannel.receiveBroadcastStream().listen((event) => _onPlatformSettingsChanged(event as Map?))); + } + } + + void _onGroupingChange(GroupUriChangedEvent event) { + final oldGroupUri = event.oldGroupUri; + final newGroupUri = event.newGroupUri; + updateBookmarkedGroup(oldGroupUri, newGroupUri); + updatePinnedGroup(oldGroupUri, newGroupUri); + } + + Future<void> reload() => store.reload(); + + Future<void> reset({required bool includeInternalKeys}) async { + if (includeInternalKeys) { + await store.clear(); + } else { + await Future.forEach<String>(store.getKeys().whereNot(SettingKeys.isInternalKey), store.remove); + } + } + + Future<void> setContextualDefaults(AppFlavor flavor) async { + // performance + final performanceClass = await deviceService.getPerformanceClass(); + enableBlurEffect = performanceClass >= 29; + + final androidInfo = await DeviceInfoPlugin().androidInfo; + final manufacturer = androidInfo.manufacturer.toLowerCase(); + final pattern = BurstPatterns.byManufacturer[manufacturer]; + collectionBurstPatterns = pattern != null ? [pattern] : []; + + // availability + if (flavor.hasMapStyleDefault) { + final defaultMapStyle = mobileServices.defaultMapStyle; + if (defaultMapStyle != null && mobileServices.mapStyles.contains(defaultMapStyle)) { + mapStyle = defaultMapStyle; + } else { + final styles = EntryMapStyles.baseStyles; + mapStyle = styles[Random().nextInt(styles.length)]; + } + } + + if (settings.useTvLayout) { + applyTvSettings(); + } + } + + void applyTvSettings() { + themeBrightness = AvesThemeBrightness.dark; + maxBrightness = MaxBrightness.never; + mustBackTwiceToExit = false; + // address `TV-BU` / `TV-BY` requirements from https://developer.android.com/docs/quality-guidelines/tv-app-quality + keepScreenOn = KeepScreenOn.videoPlayback; + drawerTypeBookmarks = [ + null, + MimeFilter.video, + FavouriteFilter.instance, + ]; + drawerPageBookmarks = [ + AlbumListPage.routeName, + CountryListPage.routeName, + PlaceListPage.routeName, + TagListPage.routeName, + SearchPage.routeName, + ]; + bottomNavigationActions = []; + showOverlayOnOpening = false; + showOverlayMinimap = false; + showOverlayZoomLevel = false; + showOverlayThumbnailPreview = false; + viewerGestureSideTapNext = false; + viewerUseCutout = true; + videoBackgroundMode = VideoBackgroundMode.disabled; + videoControlActions = []; + videoGestureDoubleTapTogglePlay = false; + videoGestureSideDoubleTapSeek = false; + enableBin = false; + showPinchGestureAlternatives = true; + resetShowTitleQuery(); + } + + Future<void> sanitize() async { + if (timeToTakeAction == AccessibilityTimeout.system && !await AccessibilityService.hasRecommendedTimeouts()) { + set(SettingKeys.timeToTakeActionKey, null); + } + if (viewerUseCutout != SettingsDefaults.viewerUseCutout && !await windowService.isCutoutAware()) { + set(SettingKeys.viewerUseCutoutKey, null); + } + if (videoBackgroundMode == VideoBackgroundMode.pip && !device.supportPictureInPicture) { + set(SettingKeys.videoBackgroundModeKey, null); + } + collectionBurstPatterns = collectionBurstPatterns.where(BurstPatterns.options.contains).toList(); + + // emulator + if (!device.isPhysicalDevice) { + set(SettingKeys.videoHardwareAccelerationKey, VideoHardwareAcceleration.disabled); + } + } + + // tag editor + + bool get tagEditorCurrentFilterSectionExpanded => getBool(SettingKeys.tagEditorCurrentFilterSectionExpandedKey) ?? SettingsDefaults.tagEditorCurrentFilterSectionExpanded; + + set tagEditorCurrentFilterSectionExpanded(bool newValue) => set(SettingKeys.tagEditorCurrentFilterSectionExpandedKey, newValue); + + String? get tagEditorExpandedSection => getString(SettingKeys.tagEditorExpandedSectionKey); + + set tagEditorExpandedSection(String? newValue) => set(SettingKeys.tagEditorExpandedSectionKey, newValue); + + // converter + + String get convertMimeType => getString(SettingKeys.convertMimeTypeKey) ?? SettingsDefaults.convertMimeType; + + set convertMimeType(String newValue) => set(SettingKeys.convertMimeTypeKey, newValue); + + int get convertQuality => getInt(SettingKeys.convertQualityKey) ?? SettingsDefaults.convertQuality; + + set convertQuality(int newValue) => set(SettingKeys.convertQualityKey, newValue); + + bool get convertWriteMetadata => getBool(SettingKeys.convertWriteMetadataKey) ?? SettingsDefaults.convertWriteMetadata; + + set convertWriteMetadata(bool newValue) => set(SettingKeys.convertWriteMetadataKey, newValue); + + // map + + EntryMapStyle? get mapStyle { + var preferred = getString(SettingKeys.mapStyleKey); + + // backward compatibility with definition as enum + const oldEnumPrefix = 'EntryMapStyle.'; + if (preferred != null && preferred.startsWith(oldEnumPrefix)) { + preferred = preferred.substring(oldEnumPrefix.length); + if (preferred.isEmpty) preferred = null; + } + + if (preferred == null) return null; + + final styles = [...availability.mapStyles, ...customMapStyles]; + return styles.firstWhereOrNull((v) => v.key == preferred) ?? styles.first; + } + + set mapStyle(EntryMapStyle? newValue) => set(SettingKeys.mapStyleKey, newValue?.key); + + LatLng? get mapDefaultCenter { + final json = getString(SettingKeys.mapDefaultCenterKey); + return json != null ? LatLng.fromJson(jsonDecode(json)) : null; + } + + set mapDefaultCenter(LatLng? newValue) => set(SettingKeys.mapDefaultCenterKey, newValue != null ? jsonEncode(newValue.toJson()) : null); + + Set<EntryMapStyle> get customMapStyles => (getStringList(SettingKeys.customMapStylesKey) ?? []).map(EntryMapStyle.fromJson).nonNulls.toSet(); + + set customMapStyles(Set<EntryMapStyle> newValue) => set(SettingKeys.customMapStylesKey, newValue.map((filter) => filter.toJson()).toList()); + + // bin + + bool get enableBin => getBool(SettingKeys.enableBinKey) ?? SettingsDefaults.enableBin; + + set enableBin(bool newValue) => set(SettingKeys.enableBinKey, newValue); + + // accessibility + + bool get showPinchGestureAlternatives => getBool(SettingKeys.showPinchGestureAlternativesKey) ?? SettingsDefaults.showPinchGestureAlternatives; + + set showPinchGestureAlternatives(bool newValue) => set(SettingKeys.showPinchGestureAlternativesKey, newValue); + + AccessibilityAnimations get accessibilityAnimations => getEnumOrDefault(SettingKeys.accessibilityAnimationsKey, SettingsDefaults.accessibilityAnimations, AccessibilityAnimations.values); + + bool get animate => accessibilityAnimations.animate; + + set accessibilityAnimations(AccessibilityAnimations newValue) => set(SettingKeys.accessibilityAnimationsKey, newValue.toString()); + + AccessibilityTimeout get timeToTakeAction => getEnumOrDefault(SettingKeys.timeToTakeActionKey, SettingsDefaults.timeToTakeAction, AccessibilityTimeout.values); + + set timeToTakeAction(AccessibilityTimeout newValue) => set(SettingKeys.timeToTakeActionKey, newValue.toString()); + + // platform settings + + void _onPlatformSettingsChanged(Map? fields) { + fields?.forEach((key, value) { + switch (key) { + case SettingKeys.platformAccelerometerRotationKey: + if (value is num) { + isRotationLocked = value == 0; + } + case SettingKeys.platformTransitionAnimationScaleKey: + if (value is num) { + areAnimationsRemoved = value == 0; + } + case SettingKeys.platformLongPressTimeoutMillisKey: + if (value is num) { + longPressTimeoutMillis = value.toInt(); + } + } + }); + } + + bool get isRotationLocked => getBool(SettingKeys.platformAccelerometerRotationKey) ?? SettingsDefaults.isRotationLocked; + + set isRotationLocked(bool newValue) => set(SettingKeys.platformAccelerometerRotationKey, newValue); + + bool get areAnimationsRemoved => getBool(SettingKeys.platformTransitionAnimationScaleKey) ?? SettingsDefaults.areAnimationsRemoved; + + set areAnimationsRemoved(bool newValue) => set(SettingKeys.platformTransitionAnimationScaleKey, newValue); + + Duration get longPressTimeout => Duration(milliseconds: getInt(SettingKeys.platformLongPressTimeoutMillisKey) ?? kLongPressTimeout.inMilliseconds); + + set longPressTimeoutMillis(int newValue) => set(SettingKeys.platformLongPressTimeoutMillisKey, newValue); + + // import/export + + Map<String, dynamic> export() => Map.fromEntries( + store.getKeys().whereNot(SettingKeys.isInternalKey).map((k) => MapEntry(k, store.get(k))), + ); + + Future<void> import(Object jsonMap) async { + if (jsonMap is! Map) { + debugPrint('failed to import settings for jsonMap=$jsonMap'); + return; + } + + // clear to restore defaults + await reset(includeInternalKeys: false); + + // apply user modifications + jsonMap.cast<String, Object?>().forEach((key, newValue) { + final oldValue = store.get(key); + + if (newValue == null) { + store.remove(key); + } else if (key.startsWith(SettingKeys.tileExtentPrefixKey)) { + if (newValue is double) { + store.setDouble(key, newValue); + } else { + debugPrint('failed to import key=$key, value=$newValue is not a double'); + } + } else if (key.startsWith(SettingKeys.tileLayoutPrefixKey)) { + if (newValue is String) { + store.setString(key, newValue); + } else { + debugPrint('failed to import key=$key, value=$newValue is not a string'); + } + } else if (key.startsWith(SettingKeys.showTitleQueryPrefixKey)) { + if (newValue is bool) { + store.setBool(key, newValue); + } else { + debugPrint('failed to import key=$key, value=$newValue is not a bool'); + } + } else { + switch (key) { + case SettingKeys.convertQualityKey: + case SettingKeys.screenSaverIntervalKey: + case SettingKeys.slideshowIntervalKey: + if (newValue is int) { + store.setInt(key, newValue); + } else { + debugPrint('failed to import key=$key, value=$newValue is not an int'); + } + case SettingKeys.subtitleFontSizeKey: + case SettingKeys.infoMapZoomKey: + if (newValue is double) { + store.setDouble(key, newValue); + } else { + debugPrint('failed to import key=$key, value=$newValue is not a double'); + } + case SettingKeys.isInstalledAppAccessAllowedKey: + case SettingKeys.isErrorReportingAllowedKey: + case SettingKeys.forceWesternArabicNumeralsKey: + case SettingKeys.enableDynamicColorKey: + case SettingKeys.enableBlurEffectKey: + case SettingKeys.mustBackTwiceToExitKey: + case SettingKeys.confirmCreateVaultKey: + case SettingKeys.confirmDeleteForeverKey: + case SettingKeys.confirmMoveToBinKey: + case SettingKeys.confirmMoveUndatedItemsKey: + case SettingKeys.confirmAfterMoveToBinKey: + case SettingKeys.setMetadataDateBeforeFileOpKey: + case SettingKeys.collectionSortReverseKey: + case SettingKeys.showThumbnailFavouriteKey: + case SettingKeys.showThumbnailHdrKey: + case SettingKeys.showThumbnailMotionPhotoKey: + case SettingKeys.showThumbnailRatingKey: + case SettingKeys.showThumbnailRawKey: + case SettingKeys.showThumbnailVideoDurationKey: + case SettingKeys.albumSortReverseKey: + case SettingKeys.countrySortReverseKey: + case SettingKeys.stateSortReverseKey: + case SettingKeys.placeSortReverseKey: + case SettingKeys.tagSortReverseKey: + case SettingKeys.showOverlayOnOpeningKey: + case SettingKeys.showOverlayMinimapKey: + case SettingKeys.showOverlayZoomLevelKey: + case SettingKeys.showOverlayInfoKey: + case SettingKeys.showOverlayDescriptionKey: + case SettingKeys.showOverlayRatingTagsKey: + case SettingKeys.showOverlayShootingDetailsKey: + case SettingKeys.showOverlayThumbnailPreviewKey: + case SettingKeys.viewerGestureSideTapNextKey: + case SettingKeys.viewerUseCutoutKey: + case SettingKeys.enableMotionPhotoAutoPlayKey: + case SettingKeys.videoGestureDoubleTapTogglePlayKey: + case SettingKeys.videoGestureSideDoubleTapSeekKey: + case SettingKeys.videoGestureVerticalDragBrightnessVolumeKey: + case SettingKeys.subtitleShowOutlineKey: + case SettingKeys.tagEditorCurrentFilterSectionExpandedKey: + case SettingKeys.convertWriteMetadataKey: + case SettingKeys.saveSearchHistoryKey: + case SettingKeys.showPinchGestureAlternativesKey: + case SettingKeys.screenSaverFillScreenKey: + case SettingKeys.screenSaverAnimatedZoomEffectKey: + case SettingKeys.slideshowRepeatKey: + case SettingKeys.slideshowShuffleKey: + case SettingKeys.slideshowFillScreenKey: + case SettingKeys.slideshowAnimatedZoomEffectKey: + if (newValue is bool) { + store.setBool(key, newValue); + } else { + debugPrint('failed to import key=$key, value=$newValue is not a bool'); + } + case SettingKeys.localeKey: + case SettingKeys.displayRefreshRateModeKey: + case SettingKeys.themeBrightnessKey: + case SettingKeys.themeColorModeKey: + case SettingKeys.maxBrightnessKey: + case SettingKeys.keepScreenOnKey: + case SettingKeys.homePageKey: + case SettingKeys.homeCustomExplorerPathKey: + case SettingKeys.collectionGroupFactorKey: + case SettingKeys.collectionSortFactorKey: + case SettingKeys.thumbnailLocationIconKey: + case SettingKeys.thumbnailTagIconKey: + case SettingKeys.albumSectionFactorKey: + case SettingKeys.albumSortFactorKey: + case SettingKeys.countrySortFactorKey: + case SettingKeys.stateSortFactorKey: + case SettingKeys.placeSortFactorKey: + case SettingKeys.tagSortFactorKey: + case SettingKeys.albumGroupsKey: + case SettingKeys.tagGroupsKey: + case SettingKeys.imageBackgroundKey: + case SettingKeys.videoAutoPlayModeKey: + case SettingKeys.videoBackgroundModeKey: + case SettingKeys.videoHardwareAccelerationKey: + case SettingKeys.videoLoopModeKey: + case SettingKeys.videoResumptionModeKey: + case SettingKeys.subtitleTextAlignmentKey: + case SettingKeys.subtitleTextPositionKey: + case SettingKeys.subtitleTextColorKey: + case SettingKeys.subtitleBackgroundColorKey: + case SettingKeys.tagEditorExpandedSectionKey: + case SettingKeys.convertMimeTypeKey: + case SettingKeys.mapStyleKey: + case SettingKeys.mapDefaultCenterKey: + case SettingKeys.coordinateFormatKey: + case SettingKeys.unitSystemKey: + case SettingKeys.accessibilityAnimationsKey: + case SettingKeys.timeToTakeActionKey: + case SettingKeys.screenSaverTransitionKey: + case SettingKeys.screenSaverVideoPlaybackKey: + case SettingKeys.slideshowTransitionKey: + case SettingKeys.slideshowVideoPlaybackKey: + if (newValue is String) { + store.setString(key, newValue); + } else { + debugPrint('failed to import key=$key, value=$newValue is not a string'); + } + case SettingKeys.customMapStylesKey: + case SettingKeys.homeCustomCollectionKey: + case SettingKeys.drawerTypeBookmarksKey: + case SettingKeys.drawerAlbumBookmarksKey: + case SettingKeys.drawerPageBookmarksKey: + case SettingKeys.bottomNavigationActionsKey: + case SettingKeys.collectionBurstPatternsKey: + case SettingKeys.pinnedFiltersKey: + case SettingKeys.hiddenFiltersKey: + case SettingKeys.deactivatedHiddenFiltersKey: + case SettingKeys.collectionBrowsingQuickActionsKey: + case SettingKeys.collectionSelectionQuickActionsKey: + case SettingKeys.viewerQuickActionsKey: + case SettingKeys.videoControlActionsKey: + case SettingKeys.screenSaverCollectionFiltersKey: + if (newValue is List) { + store.setStringList(key, newValue.cast<String>()); + } else { + debugPrint('failed to import key=$key, value=$newValue is not a list'); + } + } + } + if (oldValue != newValue) { + notifyKeyChange(key, oldValue, newValue); + } + }); + await sanitize(); + notifyListeners(); + } + + @override + void notifyKeyChange(String key, Object? oldValue, Object? newValue) { + _updateStreamController.add(SettingsChangedEvent(key, oldValue, newValue)); + if (key.startsWith(SettingKeys.tileExtentPrefixKey)) { + _updateTileExtentStreamController.add(SettingsChangedEvent(key, oldValue, newValue)); + } + } +} diff --git a/lib/model/settings/store_shared_pref.dart b/lib/model/settings/store_shared_pref.dart new file mode 100644 index 0000000..6547d8c --- /dev/null +++ b/lib/model/settings/store_shared_pref.dart @@ -0,0 +1,68 @@ +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class SharedPrefSettingsStore implements SettingsStore { + static SharedPreferences? _prefs; + + @override + bool get initialized => _prefs != null; + + @override + Future<void> init() async { + try { + _prefs = await SharedPreferences.getInstance(); + } catch (error, stack) { + debugPrint('$runtimeType init error=$error\n$stack'); + } + } + + @override + Future<void> reload() => _prefs!.reload(); + + @override + Future<bool> clear() => _prefs!.clear(); + + @override + Future<bool> remove(String key) => _prefs!.remove(key); + + // get + + @override + Set<String> getKeys() => _prefs!.getKeys(); + + @override + Object? get(String key) => _prefs!.get(key); + + @override + bool? getBool(String key) => _prefs!.getBool(key); + + @override + int? getInt(String key) => _prefs!.getInt(key); + + @override + double? getDouble(String key) => _prefs!.getDouble(key); + + @override + String? getString(String key) => _prefs!.getString(key); + + @override + List<String>? getStringList(String key) => _prefs!.getStringList(key); + + // set + + @override + Future<bool> setBool(String key, bool value) => _prefs!.setBool(key, value); + + @override + Future<bool> setInt(String key, int value) => _prefs!.setInt(key, value); + + @override + Future<bool> setDouble(String key, double value) => _prefs!.setDouble(key, value); + + @override + Future<bool> setString(String key, String value) => _prefs!.setString(key, value); + + @override + Future<bool> setStringList(String key, List<String> value) => _prefs!.setStringList(key, value); +} diff --git a/lib/model/source/album.dart b/lib/model/source/album.dart new file mode 100644 index 0000000..24cbce1 --- /dev/null +++ b/lib/model/source/album.dart @@ -0,0 +1,529 @@ +// lib/model/source/album.dart +import 'package:aves/model/db/folder_stats.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/widgets.dart'; + +bool debugCreateFoldersEnabled = false; + +// ============================================================ +// FASE 2: FolderRow legacy +// Conservata per compatibilità, ma la logica moderna usa FolderStats. +// ============================================================ + +class FolderRow { + final String path; + final int albumType; + final int priority; + final String displayName; + + final int? isRemote; + final int? hybridType; + final String? deviceId; + + FolderRow({ + required this.path, + required this.albumType, + required this.priority, + required this.displayName, + this.isRemote, + this.hybridType, + this.deviceId, + }); +} + +// ============================================================ + +mixin AlbumMixin on SourceBase { + final Set<String> _directories = {}; + final Set<String> _newAlbums = {}; + + // Cache cartelle moderna, basata esclusivamente su folderMap. + late Map<String, FolderStats> foldersCache = {}; + + bool _albumsReadyNotified = false; + + // ============================================================ + // GROUPING ALBUM REMOTI / LOCALI + // ============================================================ + + String groupForAlbum(String dir) { + final folder = foldersCache[dir]; + + if (folder == null) return 'Local'; + + // Gli album ibridi sono trattati come Local. + if (folder.hybridType != null) return 'Local'; + + if (folder.isRemote == 1) return 'Remote'; + + return 'Local'; + } + + static const groupOrder = { + 'Local': 0, + 'User': 1, + 'Common': 2, + // Device:<id> va sempre in fondo. + }; + + int orderForGroup(String g) { + if (groupOrder.containsKey(g)) return groupOrder[g]!; + + if (g.startsWith('User:')) return 1; + if (g.startsWith('Device:')) return 3; + + return 4; + } + + // ============================================================ + // Rebuild da folderMap only + // ============================================================ + + void _rebuildDirectoriesFromFolderMap({String reason = 'unknown'}) { + foldersCache = Map<String, FolderStats>.from(folderMap); + + final grouped = <String, List<String>>{}; + + for (final dir in foldersCache.keys) { + final folder = foldersCache[dir]; + + if (folder?.hidden == 1) continue; + + if (!remoteVisible && folder?.isRemote == 1) continue; + + final group = groupForAlbum(dir); + grouped.putIfAbsent(group, () => <String>[]).add(dir); + } + + final sortedGroups = grouped.keys.toList() + ..sort((a, b) => orderForGroup(a).compareTo(orderForGroup(b))); + + final sortedDirs = <String>[]; + + for (final group in sortedGroups) { + final dirs = grouped[group]!; + + dirs.sort((a, b) { + final fa = foldersCache[a]; + final fb = foldersCache[b]; + + if (fa != null && fb != null) { + final p = fa.priority.compareTo(fb.priority); + if (p != 0) return p; + return compareAsciiUpperCaseNatural(fa.displayName, fb.displayName); + } + + return compareAsciiUpperCaseNatural(a, b); + }); + + sortedDirs.addAll(dirs); + } + + _directories + ..clear() + ..addAll(sortedDirs); + + debugPrint( + '[albums] rebuildFromFolderMap ' + 'reason=$reason ' + 'folderMap=${folderMap.length} ' + 'foldersCache=${foldersCache.length} ' + 'directories=${_directories.length}', + ); + } + + // ============================================================ + // Caricamento cartelle + // ============================================================ + + @override + Future<Map<String, FolderStats>> loadFoldersFromDb() async { + _rebuildDirectoriesFromFolderMap(reason: 'loadFoldersFromDb'); + + return Map<String, FolderStats>.from(foldersCache); + } + + @override + Future<void> initFoldersCache() async { + _rebuildDirectoriesFromFolderMap(reason: 'initFoldersCache'); + } + + List<String> get rawAlbums { + if (_directories.isEmpty && folderMap.isNotEmpty) { + _rebuildDirectoriesFromFolderMap(reason: 'rawAlbums-empty'); + } + + if (!_albumsReadyNotified && _directories.isNotEmpty) { + _albumsReadyNotified = true; + + Future.microtask(() { + invalidateStoredAlbumDisplayNames(); + notifyAlbumsChanged(); + + debugPrint( + '[albums] rawAlbums notified UI refresh ' + 'count=${_directories.length}', + ); + }); + } + + debugPrint( + '[albums] rawAlbums ' + 'count=${_directories.length} ' + 'folderMap=${folderMap.length}', + ); + + return List.unmodifiable(_directories); + } + + Set<StoredAlbumFilter> getNewAlbumFilters(BuildContext context) => + Set.unmodifiable( + _newAlbums.map( + (v) => StoredAlbumFilter( + v, + getStoredAlbumDisplayName(context, v), + ), + ), + ); + + // ============================================================ + // Ordinamento album + // ============================================================ + + int compareAlbumsByPath(String? a, String? b) => + compareAsciiUpperCase(a ??= '', b ??= ''); + + @override + int compareAlbumsByName(String? a, String? b) { + final fa = foldersCache[a]; + final fb = foldersCache[b]; + + if (fa != null && fb != null) { + final p = fa.priority.compareTo(fb.priority); + if (p != 0) return p; + return compareAsciiUpperCaseNatural(fa.displayName, fb.displayName); + } + + return compareAsciiUpperCaseNatural(a ?? '', b ?? ''); + } + + void notifyAlbumsChanged() { + eventBus.fire(AlbumsChangedEvent()); + } + + void _onAlbumChanged({bool notify = true}) { + invalidateStoredAlbumDisplayNames(); + + if (notify) { + notifyAlbumsChanged(); + } + } + + // ============================================================ + // getAlbumEntries + // ============================================================ + + Map<String, AvesEntry?> getAlbumEntries() { + if (_directories.isEmpty && folderMap.isNotEmpty) { + _rebuildDirectoriesFromFolderMap(reason: 'getAlbumEntries-empty'); + } + + final entries = sortedEntriesByDate; + final result = <String, AvesEntry?>{}; + + for (final album in rawAlbums) { + result[album] = entries.firstWhereOrNull( + (entry) => entry.directory == album, + ); + } + + return result; + } + + // ============================================================ + // updateDirectories + // ============================================================ + + @override + Future<void> updateDirectories() async { + _rebuildDirectoriesFromFolderMap(reason: 'updateDirectories'); + + _albumsReadyNotified = true; + invalidateStoredAlbumDisplayNames(); + + notifyAlbumsChanged(); + } + + // ============================================================ + // addDirectories / cleanEmptyAlbums + // + // FolderMap-only: + // - non scriviamo folders da qui; + // - computeFolderMap() in CollectionSource è la fonte unica. + // ============================================================ + + @override + void addDirectories({ + required Set<String?> albums, + bool notify = true, + }) async { + final dirs = albums.nonNulls.where((a) => a.isNotEmpty).toSet(); + if (dirs.isEmpty) return; + + if (!debugCreateFoldersEnabled) { + debugPrint( + '[folders] CREATION SKIPPED (${dirs.length}) ' + '- folderMap-only mode', + ); + } + + // Non modifichiamo foldersCache manualmente. + // Le nuove cartelle appariranno quando computeFolderMap() + // aggiornerà source.folderMap. + if (notify) { + notifyAlbumsChanged(); + } + } + + @override + void cleanEmptyAlbums([Set<String>? albums]) async { + final dirs = (albums ?? _directories).nonNulls.toSet(); + if (dirs.isEmpty) return; + + bool changed = false; + + for (final dir in dirs) { + final stillHasEntries = visibleEntries.any((e) => e.directory == dir); + + if (!stillHasEntries && _isRemovable(dir)) { + foldersCache.remove(dir); + _directories.remove(dir); + changed = true; + } + } + + if (changed) { + notifyAlbumsChanged(); + } + } + + // ============================================================ + + bool _isRemovable(String album) { + if (visibleEntries.any((entry) => entry.directory == album)) return false; + if (_newAlbums.contains(album)) return false; + if (vaults.isVault(album)) return false; + + if (settings.pinnedFilters + .whereType<StoredAlbumFilter>() + .map((v) => v.album) + .contains(album)) { + return false; + } + + return true; + } + + // ============================================================ + // Filter summary + // ============================================================ + + final Map<String, int> _filterEntryCountMap = {}, _filterSizeMap = {}; + final Map<String, AvesEntry?> _filterRecentEntryMap = {}; + + void invalidateAlbumFilterSummary({ + Set<AvesEntry>? entries, + Set<String?>? directories, + bool notify = true, + }) { + if (_filterEntryCountMap.isEmpty && + _filterSizeMap.isEmpty && + _filterRecentEntryMap.isEmpty) { + return; + } + + if (entries == null && directories == null) { + _filterEntryCountMap.clear(); + _filterSizeMap.clear(); + _filterRecentEntryMap.clear(); + } else { + directories ??= {}; + + if (entries != null) { + directories.addAll(entries.map((entry) => entry.directory).nonNulls); + } + + directories.nonNulls + .map((v) => StoredAlbumFilter(v, null).key) + .forEach((key) { + _filterEntryCountMap.remove(key); + _filterSizeMap.remove(key); + _filterRecentEntryMap.remove(key); + }); + + invalidateDynamicAlbumFilterSummary(notify: false); + invalidateAlbumGroupFilterSummary(notify: false); + } + + if (notify) { + eventBus.fire(StoredAlbumSummaryInvalidatedEvent(directories)); + eventBus.fire(const DynamicAlbumSummaryInvalidatedEvent()); + eventBus.fire(const AlbumGroupSummaryInvalidatedEvent()); + } + } + + void invalidateDynamicAlbumFilterSummary({bool notify = true}) { + _filterEntryCountMap.removeWhere(_isDynamicAlbumKey); + _filterSizeMap.removeWhere(_isDynamicAlbumKey); + _filterRecentEntryMap.removeWhere(_isDynamicAlbumKey); + + if (notify) { + eventBus.fire(const DynamicAlbumSummaryInvalidatedEvent()); + } + } + + void invalidateAlbumGroupFilterSummary({bool notify = true}) { + _filterEntryCountMap.removeWhere(_isAlbumGroupKey); + _filterSizeMap.removeWhere(_isAlbumGroupKey); + _filterRecentEntryMap.removeWhere(_isAlbumGroupKey); + + if (notify) { + eventBus.fire(const AlbumGroupSummaryInvalidatedEvent()); + } + } + + bool _isDynamicAlbumKey(String key, _) => + key.startsWith('${DynamicAlbumFilter.type}-'); + + bool _isAlbumGroupKey(String key, _) => + key.startsWith('${AlbumGroupFilter.type}-'); + + // ============================================================ + // Album summary + // Compatibile con Aves: UI usa StoredAlbumFilter, + // ma la lista album viene da folderMap. + // ============================================================ + + int albumEntryCount(AlbumBaseFilter filter) { + return _filterEntryCountMap.putIfAbsent( + filter.key, + () { + if (filter is StoredAlbumFilter) { + final album = filter.album; + + return visibleEntries + .where((entry) => entry.directory == album) + .length; + } + + return visibleEntries.where(filter.test).length; + }, + ); + } + + int albumSize(AlbumBaseFilter filter) { + return _filterSizeMap.putIfAbsent( + filter.key, + () { + if (filter is StoredAlbumFilter) { + final album = filter.album; + + return visibleEntries + .where((entry) => entry.directory == album) + .map((v) => v.sizeBytes) + .sum; + } + + return visibleEntries.where(filter.test).map((v) => v.sizeBytes).sum; + }, + ); + } + + AvesEntry? albumRecentEntry(AlbumBaseFilter filter) { + return _filterRecentEntryMap.putIfAbsent( + filter.key, + () { + if (filter is StoredAlbumFilter) { + final album = filter.album; + + return sortedEntriesByDate.firstWhereOrNull( + (entry) => entry.directory == album, + ); + } + + return sortedEntriesByDate.firstWhereOrNull(filter.test); + }, + ); + } + + // ============================================================ + // New albums + // ============================================================ + + void createStoredAlbum(String directory) { + if (!_directories.contains(directory)) { + _newAlbums.add(directory); + addDirectories(albums: {directory}); + } + } + + void renameNewAlbum(String source, String destination) { + if (_newAlbums.remove(source)) { + cleanEmptyAlbums({source}); + createStoredAlbum(destination); + } + } + + void forgetNewAlbums(Set<String> directories) { + _newAlbums.removeAll(directories); + } + + // ============================================================ + // Display names + // ============================================================ + + final Map<String, String> _albumDisplayNamesWithContext = {}, + _albumDisplayNamesWithoutContext = {}; + + void invalidateStoredAlbumDisplayNames() { + _albumDisplayNamesWithContext.clear(); + _albumDisplayNamesWithoutContext.clear(); + } + + @override + String getStoredAlbumDisplayName(BuildContext? context, String dirPath) { + final f = foldersCache[dirPath] ?? folderMap[dirPath]; + + if (f != null) return f.displayName; + + return pContext.basename(dirPath); + } +} + +class AlbumsChangedEvent {} + +class DynamicAlbumSummaryInvalidatedEvent { + const DynamicAlbumSummaryInvalidatedEvent(); +} + +class AlbumGroupSummaryInvalidatedEvent { + const AlbumGroupSummaryInvalidatedEvent(); +} + +class StoredAlbumSummaryInvalidatedEvent { + final Set<String?>? directories; + + const StoredAlbumSummaryInvalidatedEvent(this.directories); +} diff --git a/lib/model/source/album.dart.ok b/lib/model/source/album.dart.ok new file mode 100644 index 0000000..70fba1d --- /dev/null +++ b/lib/model/source/album.dart.ok @@ -0,0 +1,527 @@ +// lib/model/source/album.dart +import 'package:aves/model/db/folder_stats.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/widgets.dart'; + +bool debugCreateFoldersEnabled = false; + +// ============================================================ +// FASE 2: FolderRow legacy +// Conservata per compatibilità, ma la logica moderna usa FolderStats. +// ============================================================ + +class FolderRow { + final String path; + final int albumType; + final int priority; + final String displayName; + + final int? isRemote; + final int? hybridType; + final String? deviceId; + + FolderRow({ + required this.path, + required this.albumType, + required this.priority, + required this.displayName, + this.isRemote, + this.hybridType, + this.deviceId, + }); +} + +// ============================================================ + +mixin AlbumMixin on SourceBase { + final Set<String> _directories = {}; + final Set<String> _newAlbums = {}; + + // Cache cartelle moderna, basata esclusivamente su folderMap. + late Map<String, FolderStats> foldersCache = {}; + + bool _albumsReadyNotified = false; + + // ============================================================ + // GROUPING ALBUM REMOTI / LOCALI + // ============================================================ + + String groupForAlbum(String dir) { + final folder = foldersCache[dir]; + + if (folder == null) return 'Local'; + + // Gli album ibridi sono trattati come Local. + if (folder.hybridType != null) return 'Local'; + + if (folder.isRemote == 1) return 'Remote'; + + return 'Local'; + } + + static const groupOrder = { + 'Local': 0, + 'User': 1, + 'Common': 2, + // Device:<id> va sempre in fondo. + }; + + int orderForGroup(String g) { + if (groupOrder.containsKey(g)) return groupOrder[g]!; + + if (g.startsWith('User:')) return 1; + if (g.startsWith('Device:')) return 3; + + return 4; + } + + // ============================================================ + // Rebuild da folderMap only + // ============================================================ + + void _rebuildDirectoriesFromFolderMap({String reason = 'unknown'}) { + foldersCache = Map<String, FolderStats>.from(folderMap); + + final grouped = <String, List<String>>{}; + + for (final dir in foldersCache.keys) { + final folder = foldersCache[dir]; + + if (folder?.hidden == 1) continue; + + final group = groupForAlbum(dir); + grouped.putIfAbsent(group, () => <String>[]).add(dir); + } + + final sortedGroups = grouped.keys.toList() + ..sort((a, b) => orderForGroup(a).compareTo(orderForGroup(b))); + + final sortedDirs = <String>[]; + + for (final group in sortedGroups) { + final dirs = grouped[group]!; + + dirs.sort((a, b) { + final fa = foldersCache[a]; + final fb = foldersCache[b]; + + if (fa != null && fb != null) { + final p = fa.priority.compareTo(fb.priority); + if (p != 0) return p; + return compareAsciiUpperCaseNatural(fa.displayName, fb.displayName); + } + + return compareAsciiUpperCaseNatural(a, b); + }); + + sortedDirs.addAll(dirs); + } + + _directories + ..clear() + ..addAll(sortedDirs); + + debugPrint( + '[albums] rebuildFromFolderMap ' + 'reason=$reason ' + 'folderMap=${folderMap.length} ' + 'foldersCache=${foldersCache.length} ' + 'directories=${_directories.length}', + ); + } + + // ============================================================ + // Caricamento cartelle + // ============================================================ + + @override + Future<Map<String, FolderStats>> loadFoldersFromDb() async { + _rebuildDirectoriesFromFolderMap(reason: 'loadFoldersFromDb'); + + return Map<String, FolderStats>.from(foldersCache); + } + + @override + Future<void> initFoldersCache() async { + _rebuildDirectoriesFromFolderMap(reason: 'initFoldersCache'); + } + + List<String> get rawAlbums { + if (_directories.isEmpty && folderMap.isNotEmpty) { + _rebuildDirectoriesFromFolderMap(reason: 'rawAlbums-empty'); + } + + if (!_albumsReadyNotified && _directories.isNotEmpty) { + _albumsReadyNotified = true; + + Future.microtask(() { + invalidateStoredAlbumDisplayNames(); + notifyAlbumsChanged(); + + debugPrint( + '[albums] rawAlbums notified UI refresh ' + 'count=${_directories.length}', + ); + }); + } + + debugPrint( + '[albums] rawAlbums ' + 'count=${_directories.length} ' + 'folderMap=${folderMap.length}', + ); + + return List.unmodifiable(_directories); + } + + Set<StoredAlbumFilter> getNewAlbumFilters(BuildContext context) => + Set.unmodifiable( + _newAlbums.map( + (v) => StoredAlbumFilter( + v, + getStoredAlbumDisplayName(context, v), + ), + ), + ); + + // ============================================================ + // Ordinamento album + // ============================================================ + + int compareAlbumsByPath(String? a, String? b) => + compareAsciiUpperCase(a ??= '', b ??= ''); + + @override + int compareAlbumsByName(String? a, String? b) { + final fa = foldersCache[a]; + final fb = foldersCache[b]; + + if (fa != null && fb != null) { + final p = fa.priority.compareTo(fb.priority); + if (p != 0) return p; + return compareAsciiUpperCaseNatural(fa.displayName, fb.displayName); + } + + return compareAsciiUpperCaseNatural(a ?? '', b ?? ''); + } + + void notifyAlbumsChanged() { + eventBus.fire(AlbumsChangedEvent()); + } + + void _onAlbumChanged({bool notify = true}) { + invalidateStoredAlbumDisplayNames(); + + if (notify) { + notifyAlbumsChanged(); + } + } + + // ============================================================ + // getAlbumEntries + // ============================================================ + + Map<String, AvesEntry?> getAlbumEntries() { + if (_directories.isEmpty && folderMap.isNotEmpty) { + _rebuildDirectoriesFromFolderMap(reason: 'getAlbumEntries-empty'); + } + + final entries = sortedEntriesByDate; + final result = <String, AvesEntry?>{}; + + for (final album in rawAlbums) { + result[album] = entries.firstWhereOrNull( + (entry) => entry.directory == album, + ); + } + + return result; + } + + // ============================================================ + // updateDirectories + // ============================================================ + + @override + Future<void> updateDirectories() async { + _rebuildDirectoriesFromFolderMap(reason: 'updateDirectories'); + + _albumsReadyNotified = true; + invalidateStoredAlbumDisplayNames(); + + notifyAlbumsChanged(); + } + + // ============================================================ + // addDirectories / cleanEmptyAlbums + // + // FolderMap-only: + // - non scriviamo folders da qui; + // - computeFolderMap() in CollectionSource è la fonte unica. + // ============================================================ + + @override + void addDirectories({ + required Set<String?> albums, + bool notify = true, + }) async { + final dirs = albums.nonNulls.where((a) => a.isNotEmpty).toSet(); + if (dirs.isEmpty) return; + + if (!debugCreateFoldersEnabled) { + debugPrint( + '[folders] CREATION SKIPPED (${dirs.length}) ' + '- folderMap-only mode', + ); + } + + // Non modifichiamo foldersCache manualmente. + // Le nuove cartelle appariranno quando computeFolderMap() + // aggiornerà source.folderMap. + if (notify) { + notifyAlbumsChanged(); + } + } + + @override + void cleanEmptyAlbums([Set<String>? albums]) async { + final dirs = (albums ?? _directories).nonNulls.toSet(); + if (dirs.isEmpty) return; + + bool changed = false; + + for (final dir in dirs) { + final stillHasEntries = visibleEntries.any((e) => e.directory == dir); + + if (!stillHasEntries && _isRemovable(dir)) { + foldersCache.remove(dir); + _directories.remove(dir); + changed = true; + } + } + + if (changed) { + notifyAlbumsChanged(); + } + } + + // ============================================================ + + bool _isRemovable(String album) { + if (visibleEntries.any((entry) => entry.directory == album)) return false; + if (_newAlbums.contains(album)) return false; + if (vaults.isVault(album)) return false; + + if (settings.pinnedFilters + .whereType<StoredAlbumFilter>() + .map((v) => v.album) + .contains(album)) { + return false; + } + + return true; + } + + // ============================================================ + // Filter summary + // ============================================================ + + final Map<String, int> _filterEntryCountMap = {}, _filterSizeMap = {}; + final Map<String, AvesEntry?> _filterRecentEntryMap = {}; + + void invalidateAlbumFilterSummary({ + Set<AvesEntry>? entries, + Set<String?>? directories, + bool notify = true, + }) { + if (_filterEntryCountMap.isEmpty && + _filterSizeMap.isEmpty && + _filterRecentEntryMap.isEmpty) { + return; + } + + if (entries == null && directories == null) { + _filterEntryCountMap.clear(); + _filterSizeMap.clear(); + _filterRecentEntryMap.clear(); + } else { + directories ??= {}; + + if (entries != null) { + directories.addAll(entries.map((entry) => entry.directory).nonNulls); + } + + directories.nonNulls + .map((v) => StoredAlbumFilter(v, null).key) + .forEach((key) { + _filterEntryCountMap.remove(key); + _filterSizeMap.remove(key); + _filterRecentEntryMap.remove(key); + }); + + invalidateDynamicAlbumFilterSummary(notify: false); + invalidateAlbumGroupFilterSummary(notify: false); + } + + if (notify) { + eventBus.fire(StoredAlbumSummaryInvalidatedEvent(directories)); + eventBus.fire(const DynamicAlbumSummaryInvalidatedEvent()); + eventBus.fire(const AlbumGroupSummaryInvalidatedEvent()); + } + } + + void invalidateDynamicAlbumFilterSummary({bool notify = true}) { + _filterEntryCountMap.removeWhere(_isDynamicAlbumKey); + _filterSizeMap.removeWhere(_isDynamicAlbumKey); + _filterRecentEntryMap.removeWhere(_isDynamicAlbumKey); + + if (notify) { + eventBus.fire(const DynamicAlbumSummaryInvalidatedEvent()); + } + } + + void invalidateAlbumGroupFilterSummary({bool notify = true}) { + _filterEntryCountMap.removeWhere(_isAlbumGroupKey); + _filterSizeMap.removeWhere(_isAlbumGroupKey); + _filterRecentEntryMap.removeWhere(_isAlbumGroupKey); + + if (notify) { + eventBus.fire(const AlbumGroupSummaryInvalidatedEvent()); + } + } + + bool _isDynamicAlbumKey(String key, _) => + key.startsWith('${DynamicAlbumFilter.type}-'); + + bool _isAlbumGroupKey(String key, _) => + key.startsWith('${AlbumGroupFilter.type}-'); + + // ============================================================ + // Album summary + // Compatibile con Aves: UI usa StoredAlbumFilter, + // ma la lista album viene da folderMap. + // ============================================================ + + int albumEntryCount(AlbumBaseFilter filter) { + return _filterEntryCountMap.putIfAbsent( + filter.key, + () { + if (filter is StoredAlbumFilter) { + final album = filter.album; + + return visibleEntries + .where((entry) => entry.directory == album) + .length; + } + + return visibleEntries.where(filter.test).length; + }, + ); + } + + int albumSize(AlbumBaseFilter filter) { + return _filterSizeMap.putIfAbsent( + filter.key, + () { + if (filter is StoredAlbumFilter) { + final album = filter.album; + + return visibleEntries + .where((entry) => entry.directory == album) + .map((v) => v.sizeBytes) + .sum; + } + + return visibleEntries.where(filter.test).map((v) => v.sizeBytes).sum; + }, + ); + } + + AvesEntry? albumRecentEntry(AlbumBaseFilter filter) { + return _filterRecentEntryMap.putIfAbsent( + filter.key, + () { + if (filter is StoredAlbumFilter) { + final album = filter.album; + + return sortedEntriesByDate.firstWhereOrNull( + (entry) => entry.directory == album, + ); + } + + return sortedEntriesByDate.firstWhereOrNull(filter.test); + }, + ); + } + + // ============================================================ + // New albums + // ============================================================ + + void createStoredAlbum(String directory) { + if (!_directories.contains(directory)) { + _newAlbums.add(directory); + addDirectories(albums: {directory}); + } + } + + void renameNewAlbum(String source, String destination) { + if (_newAlbums.remove(source)) { + cleanEmptyAlbums({source}); + createStoredAlbum(destination); + } + } + + void forgetNewAlbums(Set<String> directories) { + _newAlbums.removeAll(directories); + } + + // ============================================================ + // Display names + // ============================================================ + + final Map<String, String> _albumDisplayNamesWithContext = {}, + _albumDisplayNamesWithoutContext = {}; + + void invalidateStoredAlbumDisplayNames() { + _albumDisplayNamesWithContext.clear(); + _albumDisplayNamesWithoutContext.clear(); + } + + @override + String getStoredAlbumDisplayName(BuildContext? context, String dirPath) { + final f = foldersCache[dirPath] ?? folderMap[dirPath]; + + if (f != null) return f.displayName; + + return pContext.basename(dirPath); + } +} + +class AlbumsChangedEvent {} + +class DynamicAlbumSummaryInvalidatedEvent { + const DynamicAlbumSummaryInvalidatedEvent(); +} + +class AlbumGroupSummaryInvalidatedEvent { + const AlbumGroupSummaryInvalidatedEvent(); +} + +class StoredAlbumSummaryInvalidatedEvent { + final Set<String?>? directories; + + const StoredAlbumSummaryInvalidatedEvent(this.directories); +} diff --git a/lib/model/source/analysis_controller.dart b/lib/model/source/analysis_controller.dart new file mode 100644 index 0000000..1efde19 --- /dev/null +++ b/lib/model/source/analysis_controller.dart @@ -0,0 +1,37 @@ +import 'package:flutter/foundation.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +class AnalysisController { + final bool canStartService, force; + final int progressTotal, progressOffset; + final List<int>? entryIds; + + final ValueNotifier<bool> _stopSignal = ValueNotifier(false); + + AnalysisController({ + this.canStartService = true, + this.entryIds, + this.force = false, + this.progressTotal = 0, + this.progressOffset = 0, + }) { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$AnalysisController', + object: this, + ); + } + } + + void dispose() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + _stopSignal.dispose(); + } + + bool get isStopping => _stopSignal.value; + + void enableStopSignal() => _stopSignal.value = true; +} diff --git a/lib/model/source/collection_lens.dart b/lib/model/source/collection_lens.dart new file mode 100644 index 0000000..598aec9 --- /dev/null +++ b/lib/model/source/collection_lens.dart @@ -0,0 +1,487 @@ +import 'dart:async'; +import 'dart:collection'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/entry/sort.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/favourite.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/query.dart'; +import 'package:aves/model/filters/rating.dart'; +import 'package:aves/model/filters/trash.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/events.dart'; +import 'package:aves/model/source/location/location.dart'; +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/model/source/tag.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; + +import 'package:aves/remote/collection_source_remote_ext.dart'; +import 'package:aves/remote/remote_origin.dart'; + +class CollectionLens with ChangeNotifier { + final CollectionSource source; + final Set<CollectionFilter> filters; + List<String> burstPatterns; + EntrySectionFactor sectionFactor; + EntrySortFactor sortFactor; + bool sortReverse; + final AChangeNotifier filterChangeNotifier = AChangeNotifier(), sortSectionChangeNotifier = AChangeNotifier(); + final Set<StreamSubscription> _subscriptions = {}; + int? id; + bool listenToSource, stackBursts, stackDevelopedRaws, fixedSort; + List<AvesEntry>? fixedSelection; + + final Set<AvesEntry> _syntheticEntries = {}; + List<AvesEntry> _filteredSortedEntries = []; + + Map<SectionKey, List<AvesEntry>> sections = Map.unmodifiable({}); + Timer? _refreshTimer; + + CollectionLens({ + required this.source, + Set<CollectionFilter?>? filters, + this.id, + this.listenToSource = true, + this.stackBursts = true, + this.stackDevelopedRaws = true, + this.fixedSort = false, + this.fixedSelection, + }) : filters = (filters ?? {}).nonNulls.toSet(), + burstPatterns = settings.collectionBurstPatterns, + sectionFactor = settings.collectionSectionFactor, + sortFactor = settings.collectionSortFactor, + sortReverse = settings.collectionSortReverse { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); + id ??= hashCode; + if (listenToSource) { + final sourceEvents = source.eventBus; + _subscriptions.add(sourceEvents.on<EntryAddedEvent>().listen((e) => _onEntryAdded(e.entries))); + _subscriptions.add(sourceEvents.on<EntryRemovedEvent>().listen((e) => _onEntryRemoved(e.entries))); + _subscriptions.add( + sourceEvents.on<EntryMovedEvent>().listen((e) { + switch (e.type) { + case MoveType.copy: + case MoveType.export: + // refreshing new items is already handled via `EntryAddedEvent`s + break; + case MoveType.move: + case MoveType.fromBin: + refresh(); + case MoveType.toBin: + _onEntryRemoved(e.entries); + } + }), + ); + _subscriptions.add(sourceEvents.on<EntryRefreshedEvent>().listen((e) => refresh())); + _subscriptions.add(sourceEvents.on<FilterVisibilityChangedEvent>().listen((e) => refresh())); + _subscriptions.add(sourceEvents.on<CatalogMetadataChangedEvent>().listen((e) => refresh())); + _subscriptions.add( + sourceEvents.on<AddressMetadataChangedEvent>().listen((e) { + if (this.filters.any((filter) => filter is LocationFilter)) { + refresh(); + } + }), + ); + favourites.addListener(_onFavouritesChanged); + } + _subscriptions.add( + settings.updateStream + .where( + (event) => [ + SettingKeys.collectionBurstPatternsKey, + SettingKeys.collectionSortFactorKey, + SettingKeys.collectionGroupFactorKey, + SettingKeys.collectionSortReverseKey, + ].contains(event.key), + ) + .listen((_) => _onSettingsChanged()), + ); + refresh(); + } + +@override +void dispose() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + favourites.removeListener(_onFavouritesChanged); + filterChangeNotifier.dispose(); + sortSectionChangeNotifier.dispose(); + _disposeSyntheticEntries(); + + // cancel debounced refresh timer + _refreshTimer?.cancel(); + _refreshTimer = null; + + super.dispose(); +} + + CollectionLens copyWith({ + CollectionSource? source, + Set<CollectionFilter>? filters, + bool? listenToSource, + List<AvesEntry>? fixedSelection, + }) => CollectionLens( + source: source ?? this.source, + filters: filters ?? this.filters, + id: id, + listenToSource: listenToSource ?? this.listenToSource, + fixedSelection: fixedSelection ?? this.fixedSelection, + ); + + void _disposeSyntheticEntries() { + _syntheticEntries.forEach((v) => v.dispose()); + _syntheticEntries.clear(); + } + + bool get isEmpty => _filteredSortedEntries.isEmpty; + + int get entryCount => _filteredSortedEntries.length; + + // sorted as displayed to the user, i.e. sorted then sectioned, not an absolute order on all entries + List<AvesEntry>? _sortedEntries; + + List<AvesEntry> get sortedEntries { + _sortedEntries ??= List.of(sections.entries.expand((kv) => kv.value)); + return _sortedEntries!; + } + + bool get showHeaders { + bool showAlbumHeaders() => !filters.any((v) => v is StoredAlbumFilter && !v.reversed); + + switch (sortFactor) { + case EntrySortFactor.date: + switch (sectionFactor) { + case EntrySectionFactor.none: + return false; + case EntrySectionFactor.album: + return showAlbumHeaders(); + case EntrySectionFactor.month: + return true; + case EntrySectionFactor.day: + return true; + } + case EntrySortFactor.name: + case EntrySortFactor.path: + return showAlbumHeaders(); + case EntrySortFactor.rating: + return !filters.any((f) => f is RatingFilter); + case EntrySortFactor.size: + case EntrySortFactor.duration: + return false; + } + } + + void addFilters(Set<CollectionFilter> newFilters) { + if (filters.containsAll(newFilters)) return; + for (final filter in newFilters) { + filters.removeWhere((other) => !filter.isCompatible(other)); + } + filters.addAll(newFilters); + _onFilterChanged(); + } + + void removeFilter(CollectionFilter filter) { + if (!filters.contains(filter)) return; + filters.remove(filter); + _onFilterChanged(); + } + + void setLiveQuery(String query) { + filters.removeWhere((v) => v is QueryFilter && v.live); + if (query.isNotEmpty) { + filters.add(QueryFilter(query, live: true)); + } + _onFilterChanged(); + } + + void _onFilterChanged() { + refresh(); + filterChangeNotifier.notifyListeners(); + } +/* + void _applyFilters() { + final entries = fixedSelection ?? (filters.contains(TrashFilter.instance) ? source.trashedEntries : source.visibleEntries); + _disposeSyntheticEntries(); + _filteredSortedEntries = List.of(filters.isEmpty ? entries : entries.where((entry) => filters.every((filter) => filter.test(entry)))); + + if (stackBursts) { + _stackBursts(); + } + if (stackDevelopedRaws) { + _stackDevelopedRaws(); + } + } +*/ +void _applyFilters() { + final entries = fixedSelection + ?? (filters.contains(TrashFilter.instance) + ? source.trashedEntries + : source.visibleEntries); + + _disposeSyntheticEntries(); + + // 🔥 1) Applica i filtri normali + _filteredSortedEntries = List.of( + filters.isEmpty + ? entries + : entries.where((entry) => filters.every((filter) => filter.test(entry))), + ); + + // 🔥 2) Nascondi completamente i remoti quando il server NON è OK + if (!source.remoteVisible) { + _filteredSortedEntries = _filteredSortedEntries + .where((e) => e.origin != RemoteOrigin.value) + .toList(); + } + + // 🔥 3) Stack burst e RAW come prima + if (stackBursts) { + _stackBursts(); + } + if (stackDevelopedRaws) { + _stackDevelopedRaws(); + } +} + + void _stackBursts() { + final byBurstKey = groupBy<AvesEntry, String?>(_filteredSortedEntries, (entry) => entry.getBurstKey(burstPatterns)).whereNotNullKey(); + byBurstKey.forEach((burstKey, entries) { + if (entries.length > 1) { + entries.sort(AvesEntrySort.compareByName); + final mainEntry = entries.first; + final stackEntry = mainEntry.copyWith(stackedEntries: entries); + _syntheticEntries.add(stackEntry); + + entries.skip(1).forEach((subEntry) { + _filteredSortedEntries.remove(subEntry); + }); + final index = _filteredSortedEntries.indexOf(mainEntry); + _filteredSortedEntries.removeAt(index); + _filteredSortedEntries.insert(index, stackEntry); + } + }); + } + + void _stackDevelopedRaws() { + final allRawEntries = _filteredSortedEntries.where((entry) => entry.isRaw).toSet(); + if (allRawEntries.isNotEmpty) { + final allDevelopedEntries = _filteredSortedEntries.where((entry) => MimeTypes.developedRawImages.contains(entry.mimeType)).toSet(); + final rawEntriesByDir = groupBy<AvesEntry, String?>(allRawEntries, (entry) => entry.directory).whereNotNullKey(); + rawEntriesByDir.forEach((dir, dirRawEntries) { + final dirDevelopedEntries = allDevelopedEntries.where((entry) => entry.directory == dir).toSet(); + for (final rawEntry in dirRawEntries) { + final rawFilename = rawEntry.filenameWithoutExtension; + final developedEntry = dirDevelopedEntries.firstWhereOrNull((entry) => entry.filenameWithoutExtension == rawFilename); + if (developedEntry != null) { + final mainEntry = developedEntry; + final subEntry = rawEntry; + + final stackEntry = mainEntry.copyWith(stackedEntries: [mainEntry, subEntry]); + _syntheticEntries.add(stackEntry); + + _filteredSortedEntries.remove(subEntry); + final index = _filteredSortedEntries.indexOf(mainEntry); + _filteredSortedEntries.removeAt(index); + _filteredSortedEntries.insert(0, stackEntry); + } + } + }); + } + } + + void _applySort() { + if (fixedSort) return; + + switch (sortFactor) { + case EntrySortFactor.date: + _filteredSortedEntries.sort(AvesEntrySort.compareByDate); + case EntrySortFactor.name: + _filteredSortedEntries.sort(AvesEntrySort.compareByName); + case EntrySortFactor.rating: + _filteredSortedEntries.sort(AvesEntrySort.compareByRating); + case EntrySortFactor.size: + _filteredSortedEntries.sort(AvesEntrySort.compareBySize); + case EntrySortFactor.duration: + _filteredSortedEntries.sort(AvesEntrySort.compareByDuration); + case EntrySortFactor.path: + _filteredSortedEntries.sort(AvesEntrySort.compareByPath); + } + if (sortReverse) { + _filteredSortedEntries = _filteredSortedEntries.reversed.toList(); + } + } + + void _applySection() { + if (fixedSort) { + sections = Map.fromEntries([ + MapEntry(const SectionKey(), _filteredSortedEntries), + ]); + } else { + switch (sortFactor) { + case EntrySortFactor.date: + switch (sectionFactor) { + case EntrySectionFactor.album: + sections = groupBy<AvesEntry, EntryAlbumSectionKey>(_filteredSortedEntries, (entry) => EntryAlbumSectionKey(entry.directory)); + case EntrySectionFactor.month: + sections = groupBy<AvesEntry, EntryDateSectionKey>(_filteredSortedEntries, (entry) => EntryDateSectionKey(entry.monthTaken)); + case EntrySectionFactor.day: + sections = groupBy<AvesEntry, EntryDateSectionKey>(_filteredSortedEntries, (entry) => EntryDateSectionKey(entry.dayTaken)); + case EntrySectionFactor.none: + sections = Map.fromEntries([ + MapEntry(const SectionKey(), _filteredSortedEntries), + ]); + } + case EntrySortFactor.name: + final byAlbum = groupBy<AvesEntry, EntryAlbumSectionKey>(_filteredSortedEntries, (entry) => EntryAlbumSectionKey(entry.directory)); + final int Function(EntryAlbumSectionKey, EntryAlbumSectionKey) compare = sortReverse ? (a, b) => source.compareAlbumsByName(b.directory, a.directory) : (a, b) => source.compareAlbumsByName(a.directory, b.directory); + sections = SplayTreeMap<EntryAlbumSectionKey, List<AvesEntry>>.of(byAlbum, compare); + case EntrySortFactor.rating: + sections = groupBy<AvesEntry, EntryRatingSectionKey>(_filteredSortedEntries, (entry) => EntryRatingSectionKey(entry.rating)); + case EntrySortFactor.size: + case EntrySortFactor.duration: + sections = Map.fromEntries([ + MapEntry(const SectionKey(), _filteredSortedEntries), + ]); + case EntrySortFactor.path: + final byAlbum = groupBy<AvesEntry, EntryAlbumSectionKey>(_filteredSortedEntries, (entry) => EntryAlbumSectionKey(entry.directory)); + final int Function(EntryAlbumSectionKey, EntryAlbumSectionKey) compare = sortReverse ? (a, b) => source.compareAlbumsByPath(b.directory, a.directory) : (a, b) => source.compareAlbumsByPath(a.directory, b.directory); + sections = SplayTreeMap<EntryAlbumSectionKey, List<AvesEntry>>.of(byAlbum, compare); + } + } + sections = Map.unmodifiable(sections); + _sortedEntries = null; + notifyListeners(); + } + + // metadata change should also trigger a full refresh + // as dates impact sorting and sectioning + void refresh() { + _applyFilters(); + _applySort(); + _applySection(); + } + +/// Refresh debounced per evitare troppi rebuild quando arrivano batch di upsert +void refreshDebounced([int ms = 250]) { + _refreshTimer?.cancel(); + _refreshTimer = Timer(Duration(milliseconds: ms), () => refresh()); +} + + + void _onFavouritesChanged() { + if (filters.any((filter) => filter is FavouriteFilter)) { + refresh(); + } + } + + void _onSettingsChanged() { + final newBurstPatterns = settings.collectionBurstPatterns; + final newSortFactor = settings.collectionSortFactor; + final newSectionFactor = settings.collectionSectionFactor; + final newSortReverse = settings.collectionSortReverse; + + final needFilter = burstPatterns != newBurstPatterns; + final needSort = needFilter || sortFactor != newSortFactor || sortReverse != newSortReverse; + final needSection = needSort || sectionFactor != newSectionFactor; + + if (needFilter) { + burstPatterns = newBurstPatterns; + _applyFilters(); + } + if (needSort) { + sortFactor = newSortFactor; + sortReverse = newSortReverse; + _applySort(); + } + if (needSection) { + sectionFactor = newSectionFactor; + _applySection(); + } + + if (needFilter) { + filterChangeNotifier.notifyListeners(); + } + if (needSort || needSection) { + sortSectionChangeNotifier.notifyListeners(); + } + } + + void _onEntryAdded(Set<AvesEntry>? entries) { + refreshDebounced(); + } + + void _onEntryRemoved(Set<AvesEntry> entries) { + if (_syntheticEntries.isNotEmpty) { + // find impacted stacks + final obsoleteStacks = <AvesEntry>{}; + + void _replaceStack(AvesEntry stackEntry, AvesEntry entry) { + obsoleteStacks.add(stackEntry); + fixedSelection?.replace(stackEntry, entry); + _filteredSortedEntries.replace(stackEntry, entry); + _sortedEntries?.replace(stackEntry, entry); + sections.forEach((key, sectionEntries) => sectionEntries.replace(stackEntry, entry)); + } + + final stacks = _filteredSortedEntries.where((entry) => entry.isStack).toSet(); + stacks.forEach((stackEntry) { + final subEntries = stackEntry.stackedEntries!; + if (subEntries.any(entries.contains)) { + final mainEntry = subEntries.first; + + // remove the deleted sub-entries + subEntries.removeWhere(entries.contains); + + switch (subEntries.length) { + case 0: + // remove the stack itself + obsoleteStacks.add(stackEntry); + break; + case 1: + // replace the stack by the last remaining sub-entry + _replaceStack(stackEntry, subEntries.first); + break; + default: + // keep the stack with the remaining sub-entries + if (!subEntries.contains(mainEntry)) { + // recreate the stack with the correct main entry + _replaceStack(stackEntry, subEntries.first.copyWith(stackedEntries: subEntries)); + } + break; + } + } + }); + + obsoleteStacks.forEach((stackEntry) { + _syntheticEntries.remove(stackEntry); + stackEntry.dispose(); + }); + entries.addAll(obsoleteStacks); + } + + // we should remove obsolete entries and sections + // but do not apply sort/section + // as section order change would surprise the user while browsing + fixedSelection?.removeWhere(entries.contains); + _filteredSortedEntries.removeWhere(entries.contains); + _sortedEntries?.removeWhere(entries.contains); + sections.forEach((key, sectionEntries) => sectionEntries.removeWhere(entries.contains)); + sections = Map.unmodifiable(Map.fromEntries(sections.entries.where((kv) => kv.value.isNotEmpty))); + notifyListeners(); + } + + @override + String toString() => '$runtimeType#${shortHash(this)}{id=$id, source=$source, filters=$filters, entryCount=$entryCount}'; +} diff --git a/lib/model/source/collection_source.dart b/lib/model/source/collection_source.dart new file mode 100644 index 0000000..b2bf8a0 --- /dev/null +++ b/lib/model/source/collection_source.dart @@ -0,0 +1,921 @@ +// lib/model/source/collection_source.dart +import 'dart:async'; +import 'dart:ui'; + +import 'package:aves/model/covers.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/catalog.dart'; +import 'package:aves/model/entry/extensions/keys.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/entry/sort.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/tag_group.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/trash.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/grouping/convert.dart'; +import 'package:aves/model/metadata/trash.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/album.dart'; +import 'package:aves/model/source/analysis_controller.dart'; +import 'package:aves/model/source/events.dart'; +import 'package:aves/model/source/location/country.dart'; +import 'package:aves/model/source/location/location.dart'; +import 'package:aves/model/source/location/place.dart'; +import 'package:aves/model/source/location/state.dart'; +import 'package:aves/model/source/tag.dart'; +import 'package:aves/model/source/trash.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/services/analysis_service.dart'; +import 'package:aves/services/common/image_op_events.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:event_bus/event_bus.dart'; +import 'package:flutter/foundation.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +import 'package:aves/model/db/folder_stats.dart'; +import 'package:aves/model/db/db_sqflite.dart'; + +// Remote origin +import 'package:aves/remote/remote_origin.dart'; +import 'package:aves/remote/remote_sync_bus.dart'; + +typedef SourceScope = Set<CollectionFilter>?; + +// Trace opzionale: mostra chi nasconderebbe i remoti, senza nasconderli. +const bool kTraceHiddenRemotes = true; + +mixin SourceBase { + EventBus get eventBus; + + Map<int, AvesEntry> get entryById; + + Map<String, FolderStats> get folderMap; + + Set<AvesEntry> get allEntries; + + Set<AvesEntry> get visibleEntries; + + Set<AvesEntry> get trashedEntries; + + List<AvesEntry> get sortedEntriesByDate; + + ValueNotifier<SourceState> stateNotifier = ValueNotifier(SourceState.ready); + + set state(SourceState value) => stateNotifier.value = value; + + SourceState get state => stateNotifier.value; + + bool get isReady => state == SourceState.ready; + + // Debug: forza visibilità remota per testing. + bool debugForceRemoteVisible = true; + + bool get remoteVisible { + if (debugForceRemoteVisible) return true; + final state = RemoteSyncBus.instance.stateNotifier.value; + return state == RemoteSyncState.syncing || state == RemoteSyncState.upToDate; + } + + ValueNotifier<ProgressEvent> progressNotifier = + ValueNotifier(const ProgressEvent(done: 0, total: 0)); + + void setProgress({required int done, required int total}) => + progressNotifier.value = ProgressEvent(done: done, total: total); + + void invalidateEntries(); +} + +abstract class CollectionSource + with + SourceBase, + AlbumMixin, + CountryMixin, + PlaceMixin, + StateMixin, + LocationMixin, + TagMixin, + TrashMixin { + static const fullScope = <CollectionFilter>{}; + + CollectionSource() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$CollectionSource', + object: this, + ); + } + + settings.updateStream + .where((event) => event.key == SettingKeys.localeKey) + .listen((_) => invalidateStoredAlbumDisplayNames()); + + settings.updateStream + .where((event) => event.key == SettingKeys.hiddenFiltersKey) + .listen((event) { + final oldValue = event.oldValue; + if (oldValue is List<String>?) { + final oldHiddenFilters = + (oldValue ?? []).map(CollectionFilter.fromJson).nonNulls.toSet(); + final newlyVisibleFilters = + oldHiddenFilters.whereNot(settings.hiddenFilters.contains).toSet(); + _onFilterVisibilityChanged(newlyVisibleFilters); + } + }); + + vaults.addListener(_onVaultsChanged); + } + + @mustCallSuper + void dispose() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + + vaults.removeListener(_onVaultsChanged); + _rawEntries.forEach((v) => v.dispose()); + } + + set canAnalyze(bool enabled); + + final EventBus _eventBus = EventBus(); + + @override + EventBus get eventBus => _eventBus; + + final Map<int, AvesEntry> _entryById = {}; + + @override + Map<int, AvesEntry> get entryById => Map.unmodifiable(_entryById); + + final Set<AvesEntry> _rawEntries = {}; + + @override + Set<AvesEntry> get allEntries => Set.unmodifiable(_rawEntries); + + Set<AvesEntry>? _visibleEntries, _trashedEntries; + + @override + Set<AvesEntry> get visibleEntries { + _visibleEntries ??= Set.unmodifiable(_applyHiddenFilters(_rawEntries)); + return _visibleEntries!; + } + + @override + Set<AvesEntry> get trashedEntries { + _trashedEntries ??= Set.unmodifiable(_applyTrashFilter(_rawEntries)); + return _trashedEntries!; + } + + List<AvesEntry>? _sortedEntriesByDate; + + @override + List<AvesEntry> get sortedEntriesByDate { + _sortedEntriesByDate ??= + List.unmodifiable(visibleEntries.toList()..sort(AvesEntrySort.compareByDate)); + return _sortedEntriesByDate!; + } + + // known date by entry ID + late Map<int?, int?> _savedDates; + + // === FOLDER MAP: fonte dati unica per AlbumPage e InfoPage === + late Map<String, FolderStats> _folderMap = {}; + + @override + Map<String, FolderStats> get folderMap => _folderMap; + + Future<void> computeFolderMap() async { + // Evita di sovrascrivere una folderMap valida con una vuota durante startup. + if (_rawEntries.isEmpty) { + debugPrint('[folders] computeFolderMap skipped rawEntries=0'); + return; + } + + // Reset cache derivate. + _visibleEntries = null; + _trashedEntries = null; + _sortedEntriesByDate = null; + + final entries = visibleEntries; + + debugPrint( + '[folders] computeFolderMap start ' + 'rawEntries=${_rawEntries.length} ' + 'visibleEntries=${entries.length}', + ); + + final map = <String, FolderStats>{}; + + for (final entry in entries) { + final dir = entry.directory; + if (dir == null || dir.isEmpty) continue; + + map.putIfAbsent(dir, () { + return FolderStats( + path: dir, + displayName: dir.split('/').last, + fileCount: 0, + totalSize: 0, + thumbEntryId: entry.id, + thumbDate: entry.dateModifiedMillis, + albumType: 0, + priority: 0, + isRemote: entry.origin, + user: null, + deviceId: null, + hybridType: null, + hidden: 0, + ); + }); + + final stats = map[dir]!; + + stats.fileCount++; + stats.totalSize += entry.sizeBytes ?? 0; + + // Usa come thumbnail l'entry più recente della cartella. + final currentThumbDate = stats.thumbDate ?? 0; + final entryDate = entry.dateModifiedMillis ?? 0; + + if (entryDate > currentThumbDate) { + stats.thumbEntryId = entry.id; + stats.thumbDate = entry.dateModifiedMillis; + } + } + + debugPrint( + '[folders] computeFolderMap built folders=${map.length}', + ); + + await finalizeFolders(map); + } + + Future<void> finalizeFolders(Map<String, FolderStats> map) async { + debugPrint( + '[folders] finalizeFolders start folders=${map.length}', + ); + + await localMediaDb.saveFoldersBatch(map.values.toList()); + + _folderMap = Map.unmodifiable(map); + + debugPrint( + '[folders] finalizeFolders done folderMap=${_folderMap.length}', + ); + + eventBus.fire(AlbumsChangedEvent()); + } + + List<String> foldersForEntry(AvesEntry entry) { + final dir = entry.directory; + if (dir == null) return const []; + return _folderMap.containsKey(dir) ? [dir] : const []; + } + + Future<void> loadDates() async { + _savedDates = Map.unmodifiable(await localMediaDb.loadDates()); + } + + Set<CollectionFilter> _getAppHiddenFilters() => { + ...settings.hiddenFilters, + ...vaults.vaultDirectories + .where(vaults.isLocked) + .map((v) => StoredAlbumFilter(v, null)), + }; + + Iterable<AvesEntry> _applyHiddenFilters(Iterable<AvesEntry> entries) { + final hiddenFilters = { + TrashFilter.instance, + ..._getAppHiddenFilters(), + }; + + final remoteOn = remoteVisible; + + if (!remoteOn) { + entries = entries.where((e) => e.origin == 0).toList(); + } + + return entries.where((entry) { + if (entry.origin == RemoteOrigin.value) { + if (kTraceHiddenRemotes) { + final hiddenBy = hiddenFilters.firstWhereOrNull((f) => f.test(entry)); + if (hiddenBy != null && !TrashFilter.instance.test(entry)) { + debugPrint( + '[hidden][trace] remote id=${entry.id} ' + 'rid=${entry.remoteId} by=${hiddenBy.runtimeType}', + ); + } + } + + // Remoti: nascondi solo se nel cestino. + return !TrashFilter.instance.test(entry); + } + + // Locali: logica originale. + return !hiddenFilters.any((filter) => filter.test(entry)); + }); + } + + Iterable<AvesEntry> _applyTrashFilter(Iterable<AvesEntry> entries) { + final hiddenFilters = _getAppHiddenFilters(); + return entries + .where(TrashFilter.instance.test) + .where((entry) => !hiddenFilters.any((filter) => filter.test(entry))); + } + + void _invalidate({Set<AvesEntry>? entries, bool notify = true}) { + if (_rawEntries.isEmpty) return; + + invalidateEntries(); + + // invalidateAlbumFilterSummary(entries: entries, notify: notify); + invalidateCountryFilterSummary(entries: entries, notify: notify); + invalidatePlaceFilterSummary(entries: entries, notify: notify); + invalidateStateFilterSummary(entries: entries, notify: notify); + invalidateTagFilterSummary(entries: entries, notify: notify); + } + + @override + void invalidateEntries() { + _visibleEntries = null; + _trashedEntries = null; + _sortedEntriesByDate = null; + } + + Future<void> reloadEntriesFromDb() async { + final dbEntries = await localMediaDb.loadEntries(); + + _rawEntries + ..clear() + ..addAll(dbEntries); + + _entryById + ..clear() + ..addEntries(dbEntries.map((e) => MapEntry(e.id, e))); + + await computeFolderMap(); + } + + void updateDerivedFilters([Set<AvesEntry>? entries]) { + _invalidate(entries: entries); + + // It is possible for entries hidden by a filter type to impact other types. + // updateDirectories() è gestito dalla folderMap/computeFolderMap. + updateLocations(); + updateTags(); + } + + Future<void> addEntries(Set<AvesEntry> entries, {bool notify = true}) async { + if (entries.isEmpty) return; + + await localMediaDb.insertEntries(entries); + + final dbEntries = await localMediaDb.loadEntries(); + + _rawEntries + ..clear() + ..addAll(dbEntries); + + _entryById + ..clear() + ..addEntries(dbEntries.map((e) => MapEntry(e.id, e))); + + _invalidate(entries: entries, notify: notify); + + await computeFolderMap(); + + if (notify) { + eventBus.fire(EntryAddedEvent(entries)); + } + } + + void removeEntriesFromMemory(Set<AvesEntry> entries, {bool notify = true}) { + if (entries.isEmpty) return; + + for (final e in entries) { + _entryById.remove(e.id); + } + + _rawEntries.removeAll(entries); + updateDerivedFilters(entries); + + unawaited(computeFolderMap()); + + if (notify) { + eventBus.fire(EntryRemovedEvent(entries)); + } + } + + Future<void> removeEntries(Set<String> uris, {required bool includeTrash}) async { + if (uris.isEmpty) return; + + final entries = _rawEntries.where((entry) => uris.contains(entry.uri)).toSet(); + + if (!includeTrash) { + entries.removeWhere(TrashFilter.instance.test); + } + + if (entries.isEmpty) return; + + final ids = entries.map((entry) => entry.id).toSet(); + + await favourites.removeIds(ids); + await covers.removeIds(ids); + await localMediaDb.removeIds(ids); + + for (final id in ids) { + _entryById.remove(id); + } + + _rawEntries.removeAll(entries); + updateDerivedFilters(entries); + + await computeFolderMap(); + + eventBus.fire(EntryRemovedEvent(entries)); + } + + void clearEntries() { + _entryById.clear(); + _rawEntries.clear(); + _folderMap = {}; + + _invalidate(); + + // Do not update directories/locations/tags here. + } + + /// Carica dal DB tutte le entry remote e le aggiunge alla sorgente corrente. + Future<void> appendRemoteEntries({bool notify = true}) async { + final remotes = await localMediaDb.loadEntries(origin: RemoteOrigin.value); + if (remotes.isEmpty) return; + + final visibleRemotes = remotes.where((e) => !e.trashed).toSet(); + if (visibleRemotes.isEmpty) return; + + await localMediaDb.insertEntries(visibleRemotes); + + final dbEntries = await localMediaDb.loadEntries(); + + _rawEntries + ..clear() + ..addAll(dbEntries); + + _entryById + ..clear() + ..addEntries(dbEntries.map((e) => MapEntry(e.id, e))); + + _invalidate(entries: visibleRemotes, notify: notify); + + await computeFolderMap(); + + if (notify) { + eventBus.fire(EntryAddedEvent(visibleRemotes)); + } + } + + Future<void> _moveEntry( + AvesEntry entry, + Map newFields, { + required bool persist, + }) async { + newFields.keys.forEach((key) { + final newValue = newFields[key]; + + switch (key) { + case EntryFields.contentId: + entry.contentId = newValue as int?; + case EntryFields.dateModifiedMillis: + entry.dateModifiedMillis = newValue as int?; + case EntryFields.path: + entry.path = newValue as String?; + case EntryFields.title: + entry.sourceTitle = newValue as String?; + case EntryFields.trashed: + final trashed = newValue as bool; + entry.trashed = trashed; + entry.trashDetails = trashed + ? TrashDetails( + id: entry.id, + path: newFields[EntryFields.trashPath] as String, + dateMillis: DateTime.now().millisecondsSinceEpoch, + ) + : null; + case EntryFields.uri: + entry.uri = newValue as String; + case EntryFields.origin: + entry.origin = newValue as int; + } + }); + + if (entry.trashed) { + final trashPath = entry.trashDetails?.path; + if (trashPath != null) { + entry.contentId = null; + entry.uri = Uri.file(trashPath).toString(); + } else { + debugPrint('failed to update uri from unknown trash path for uri=${entry.uri}'); + } + } + + if (persist) { + await covers.moveEntry(entry); + final id = entry.id; + await localMediaDb.updateEntry(id, entry); + await localMediaDb.updateCatalogMetadata(id, entry.catalogMetadata); + await localMediaDb.updateAddress(id, entry.addressDetails); + await localMediaDb.updateTrash(id, entry.trashDetails); + } + } + + Future<void> updateAfterMove({ + required Set<AvesEntry> todoEntries, + required MoveType moveType, + required Set<String> destinationAlbums, + required Set<MoveOpEvent> movedOps, + }) async { + if (movedOps.isEmpty) return; + + final replacedUris = movedOps + .map((movedOp) => movedOp.newFields[EntryFields.path] as String?) + .map((targetPath) { + final existingEntry = _rawEntries.firstWhereOrNull( + (entry) => entry.path == targetPath && !entry.trashed, + ); + return existingEntry?.uri; + }) + .nonNulls + .toSet(); + + await removeEntries(replacedUris, includeTrash: false); + + final fromAlbums = <String?>{}; + final movedEntries = <AvesEntry>{}; + final copy = moveType == MoveType.copy; + + if (copy) { + movedOps.forEach((movedOp) { + final sourceUri = movedOp.uri; + final newFields = movedOp.newFields; + final sourceEntry = + todoEntries.firstWhereOrNull((entry) => entry.uri == sourceUri); + + if (sourceEntry != null) { + fromAlbums.add(sourceEntry.directory); + movedEntries.add( + sourceEntry.copyWith( + id: localMediaDb.nextId, + uri: newFields[EntryFields.uri] as String?, + path: newFields[EntryFields.path] as String?, + contentId: newFields[EntryFields.contentId] as int?, + title: newFields[EntryFields.title] as String?, + dateAddedSecs: newFields[EntryFields.dateAddedSecs] as int?, + dateModifiedMillis: + newFields[EntryFields.dateModifiedMillis] as int?, + origin: newFields[EntryFields.origin] as int?, + ), + ); + } else { + debugPrint('failed to find source entry with uri=$sourceUri'); + } + }); + + await localMediaDb.insertEntries(movedEntries); + await localMediaDb.saveCatalogMetadata( + movedEntries.map((entry) => entry.catalogMetadata).nonNulls.toSet(), + ); + await localMediaDb.saveAddresses( + movedEntries.map((entry) => entry.addressDetails).nonNulls.toSet(), + ); + } else { + await Future.forEach<MoveOpEvent>(movedOps, (movedOp) async { + final newFields = movedOp.newFields; + if (newFields.isNotEmpty) { + final sourceUri = movedOp.uri; + final entry = todoEntries.firstWhereOrNull( + (entry) => entry.uri == sourceUri, + ); + + if (entry != null) { + if (moveType == MoveType.fromBin) { + newFields[EntryFields.trashed] = false; + } else { + fromAlbums.add(entry.directory); + } + + movedEntries.add(entry); + await _moveEntry(entry, newFields, persist: true); + } + } + }); + } + + switch (moveType) { + case MoveType.copy: + await addEntries(movedEntries); + case MoveType.move: + case MoveType.export: + cleanEmptyAlbums(fromAlbums.nonNulls.toSet()); + addDirectories(albums: destinationAlbums); + case MoveType.toBin: + case MoveType.fromBin: + updateDerivedFilters(movedEntries); + } + + invalidateAlbumFilterSummary(directories: fromAlbums); + _invalidate(entries: movedEntries); + + await computeFolderMap(); + + eventBus.fire(EntryMovedEvent(moveType, movedEntries)); + } + + Future<void> updateAfterRename({ + required Set<AvesEntry> todoEntries, + required Set<MoveOpEvent> movedOps, + required bool persist, + }) async { + if (movedOps.isEmpty) return; + + final movedEntries = <AvesEntry>{}; + + await Future.forEach<MoveOpEvent>(movedOps, (movedOp) async { + final newFields = movedOp.newFields; + if (newFields.isNotEmpty) { + final sourceUri = movedOp.uri; + final entry = + todoEntries.firstWhereOrNull((entry) => entry.uri == sourceUri); + + if (entry != null) { + movedEntries.add(entry); + await _moveEntry(entry, newFields, persist: persist); + } + } + }); + + await computeFolderMap(); + + eventBus.fire(EntryMovedEvent(MoveType.move, movedEntries)); + } + + SourceScope get loadedScope; + + SourceScope get targetScope; + + @override + Future<void> init({ + required SourceScope scope, + AnalysisController? analysisController, + bool loadTopEntriesFirst = false, + }) async { + // MediaStoreSource.init() è l’unica vera implementazione. + } + + Future<Set<String>> refreshUris( + Set<String> changedUris, { + AnalysisController? analysisController, + }); + + Future<void> refreshEntries( + Set<AvesEntry> entries, + Set<EntryDataType> dataTypes, + ) async { + const background = false; + const persist = true; + + await Future.forEach(entries, (entry) async { + await entry.refresh( + background: background, + persist: persist, + dataTypes: dataTypes, + ); + }); + + if (dataTypes.contains(EntryDataType.aspectRatio)) { + onAspectRatioChanged(); + } + + if (dataTypes.contains(EntryDataType.catalog)) { + await deviceService.requestGarbageCollection(); + + await Future.forEach(entries, (entry) async { + await entry.catalog( + background: background, + force: dataTypes.contains(EntryDataType.catalog), + persist: persist, + ); + await localMediaDb.updateCatalogMetadata(entry.id, entry.catalogMetadata); + }); + + onCatalogMetadataChanged(); + } + + if (dataTypes.contains(EntryDataType.address)) { + await Future.forEach(entries, (entry) async { + await entry.locate( + background: background, + force: dataTypes.contains(EntryDataType.address), + geocoderLocale: settings.appliedLocale, + ); + await localMediaDb.updateAddress(entry.id, entry.addressDetails); + }); + + onAddressMetadataChanged(); + } + + updateDerivedFilters(entries); + + await computeFolderMap(); + + eventBus.fire(EntryRefreshedEvent(entries)); + } + + Future<void> analyze( + AnalysisController? analysisController, { + Set<AvesEntry>? entries, + }) async { + final todoEntries = entries ?? allEntries; + final defaultAnalysisController = AnalysisController(); + final _analysisController = analysisController ?? defaultAnalysisController; + final force = _analysisController.force; + + if (!_analysisController.isStopping) { + var startAnalysisService = false; + + if (_analysisController.canStartService && settings.canUseAnalysisService) { + if (!startAnalysisService) { + final opCount = + (force ? todoEntries : todoEntries.where(TagMixin.catalogEntriesTest)) + .length; + startAnalysisService = opCount > TagMixin.commitCountThreshold; + } + + if (!startAnalysisService && await availability.canLocatePlaces) { + final opCount = (force + ? todoEntries.where((entry) => entry.hasGps) + : todoEntries.where(LocationMixin.locatePlacesTest)) + .length; + startAnalysisService = opCount > LocationMixin.commitCountThreshold; + } + } + + debugPrint( + 'analyze ${todoEntries.length} entries, ' + 'force=$force, starting service=$startAnalysisService', + ); + + if (startAnalysisService) { + final lifecycleState = AvesApp.lifecycleStateNotifier.value; + + switch (lifecycleState) { + case AppLifecycleState.resumed: + case AppLifecycleState.inactive: + await AnalysisService.startService( + force: force, + entryIds: entries?.map((entry) => entry.id).toList(), + ); + default: + unawaited( + reportService.log( + 'analysis service not started because app is in state=$lifecycleState', + ), + ); + } + } else { + await deviceService.requestGarbageCollection(); + + await catalogEntries(_analysisController, todoEntries); + updateDerivedFilters(todoEntries); + + await locateEntries(_analysisController, todoEntries); + updateDerivedFilters(todoEntries); + } + } + + defaultAnalysisController.dispose(); + + await computeFolderMap(); + + state = SourceState.ready; + } + + void onAspectRatioChanged() => eventBus.fire(AspectRatioChangedEvent()); + + // Monitoring + + bool _canRefresh = true; + + void pauseMonitoring() => _canRefresh = false; + + void resumeMonitoring() => _canRefresh = true; + + bool get canRefresh => _canRefresh; + + // Filter summary + + int count(CollectionFilter filter) { + switch (filter) { + case AlbumBaseFilter _: + return albumEntryCount(filter); + case LocationFilter(level: LocationLevel.country): + return countryEntryCount(filter); + case LocationFilter(level: LocationLevel.state): + return stateEntryCount(filter); + case LocationFilter(level: LocationLevel.place): + return placeEntryCount(filter); + case TagBaseFilter _: + return tagEntryCount(filter); + } + + return 0; + } + + int size(CollectionFilter filter) { + switch (filter) { + case AlbumBaseFilter _: + return albumSize(filter); + case LocationFilter(level: LocationLevel.country): + return countrySize(filter); + case LocationFilter(level: LocationLevel.state): + return stateSize(filter); + case LocationFilter(level: LocationLevel.place): + return placeSize(filter); + case TagBaseFilter _: + return tagSize(filter); + } + + return 0; + } + + AvesEntry? recentEntry(CollectionFilter filter) { + switch (filter) { + case AlbumBaseFilter _: + return albumRecentEntry(filter); + case LocationFilter(level: LocationLevel.country): + return countryRecentEntry(filter); + case LocationFilter(level: LocationLevel.state): + return stateRecentEntry(filter); + case LocationFilter(level: LocationLevel.place): + return placeRecentEntry(filter); + case TagBaseFilter _: + return tagRecentEntry(filter); + } + + return null; + } + + AvesEntry? coverEntry(CollectionFilter filter) { + final id = covers.of(filter)?.$1; + + if (id != null) { + final entry = visibleEntries.firstWhereOrNull((e) => e.id == id); + if (entry != null) return entry; + } + + if (filter is StoredAlbumFilter) { + final album = filter.album; + + final e = sortedEntriesByDate.firstWhereOrNull( + (entry) => entry.directory == album, + ); + + if (e != null) return e; + } + + return recentEntry(filter); + } + + void _onFilterVisibilityChanged(Set<CollectionFilter> newlyVisibleFilters) { + updateDerivedFilters(); + eventBus.fire(const FilterVisibilityChangedEvent()); + + unawaited(computeFolderMap()); + + if (newlyVisibleFilters.isNotEmpty) { + final candidateEntries = visibleEntries + .where((entry) => newlyVisibleFilters.any((f) => f.test(entry))) + .toSet(); + + analyze(null, entries: candidateEntries); + } + } + + void _onVaultsChanged() { + final newlyVisibleFilters = vaults.vaultDirectories + .whereNot(vaults.isLocked) + .map((v) => StoredAlbumFilter(v, null)) + .toSet(); + + _onFilterVisibilityChanged(newlyVisibleFilters); + } +} + +class AspectRatioChangedEvent {} diff --git a/lib/model/source/collection_source.dartrm b/lib/model/source/collection_source.dartrm new file mode 100644 index 0000000..90be3ee --- /dev/null +++ b/lib/model/source/collection_source.dartrm @@ -0,0 +1,726 @@ +// lib/model/source/collection_source.dart +import 'dart:async'; +import 'dart:ui'; + +import 'package:aves/model/covers.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/catalog.dart'; +import 'package:aves/model/entry/extensions/keys.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/entry/sort.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/filters/container/tag_group.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/trash.dart'; +import 'package:aves/model/metadata/trash.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/analysis_controller.dart'; +import 'package:aves/model/source/events.dart'; +import 'package:aves/model/source/location/country.dart'; +import 'package:aves/model/source/location/location.dart'; +import 'package:aves/model/source/location/place.dart'; +import 'package:aves/model/source/location/state.dart'; +import 'package:aves/model/source/tag.dart'; +import 'package:aves/model/source/trash.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/services/analysis_service.dart'; +import 'package:aves/services/common/image_op_events.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:event_bus/event_bus.dart'; +import 'package:flutter/foundation.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +// ✅ NEW: Remote origin costante +import 'package:aves/remote/remote_origin.dart'; +import 'package:aves/remote/remote_sync_bus.dart'; + + +typedef SourceScope = Set<CollectionFilter>?; + +// Trace opzionale: mostra chi nasconderebbe i remoti (non li nascondiamo) +const bool kTraceHiddenRemotes = true; + + +mixin SourceBase { + EventBus get eventBus; + + Map<int, AvesEntry> get entryById; + + Set<AvesEntry> get allEntries; + + Set<AvesEntry> get visibleEntries; + + Set<AvesEntry> get trashedEntries; + + List<AvesEntry> get sortedEntriesByDate; + + ValueNotifier<SourceState> stateNotifier = ValueNotifier(SourceState.ready); + + set state(SourceState value) => stateNotifier.value = value; + + SourceState get state => stateNotifier.value; + + bool get isReady => state == SourceState.ready; + +/// true se il remote è considerato "on" (mostrare remoti) +/*bool get remoteVisible { + final state = RemoteSyncBus.instance.stateNotifier.value; + return state == RemoteSyncState.syncing || state == RemoteSyncState.upToDate; +} +*/ + +// debug: forza visibilità remota per testing (impostare a false per tornare al comportamento normale) +bool debugForceRemoteVisible = true; + +/// true se il remote è considerato "on" (mostrare remoti) +bool get remoteVisible { + if (debugForceRemoteVisible) return true; + final state = RemoteSyncBus.instance.stateNotifier.value; + return state == RemoteSyncState.syncing || state == RemoteSyncState.upToDate; +} + + ValueNotifier<ProgressEvent> progressNotifier = ValueNotifier(const ProgressEvent(done: 0, total: 0)); + + void setProgress({required int done, required int total}) => progressNotifier.value = ProgressEvent(done: done, total: total); + + void invalidateEntries(); +} + +abstract class CollectionSource + with + SourceBase, + CountryMixin, + PlaceMixin, + StateMixin, + LocationMixin, + TagMixin, + TrashMixin { + static const fullScope = <CollectionFilter>{}; + + CollectionSource() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$CollectionSource', + object: this, + ); + } + settings.updateStream.where((event) => event.key == SettingKeys.localeKey).listen((_) {}); + settings.updateStream.where((event) => event.key == SettingKeys.hiddenFiltersKey).listen((event) { + final oldValue = event.oldValue; + if (oldValue is List<String>?) { + final oldHiddenFilters = (oldValue ?? []).map(CollectionFilter.fromJson).nonNulls.toSet(); + final newlyVisibleFilters = oldHiddenFilters.whereNot(settings.hiddenFilters.contains).toSet(); + _onFilterVisibilityChanged(newlyVisibleFilters); + } + }); + vaults.addListener(_onVaultsChanged); + } + + @mustCallSuper + void dispose() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + vaults.removeListener(_onVaultsChanged); + _rawEntries.forEach((v) => v.dispose()); + } + + set canAnalyze(bool enabled); + + final EventBus _eventBus = EventBus(); + + @override + EventBus get eventBus => _eventBus; + + final Map<int, AvesEntry> _entryById = {}; + + @override + Map<int, AvesEntry> get entryById => Map.unmodifiable(_entryById); + + final Set<AvesEntry> _rawEntries = {}; + + @override + Set<AvesEntry> get allEntries => Set.unmodifiable(_rawEntries); + + Set<AvesEntry>? _visibleEntries, _trashedEntries; + + @override + Set<AvesEntry> get visibleEntries { + _visibleEntries ??= Set.unmodifiable(_applyHiddenFilters(_rawEntries)); + return _visibleEntries!; + } + + @override + Set<AvesEntry> get trashedEntries { + _trashedEntries ??= Set.unmodifiable(_applyTrashFilter(_rawEntries)); + return _trashedEntries!; + } + + List<AvesEntry>? _sortedEntriesByDate; + + @override + List<AvesEntry> get sortedEntriesByDate { + _sortedEntriesByDate ??= List.unmodifiable(visibleEntries.toList()..sort(AvesEntrySort.compareByDate)); + return _sortedEntriesByDate!; + } + + // known date by entry ID + late Map<int?, int?> _savedDates; + + //late Map<String, FolderRow> foldersCache = {}; + + Future<void> loadDates() async { + _savedDates = Map.unmodifiable(await localMediaDb.loadDates()); + } + +//Future<void> initFoldersCache() async { +// foldersCache = await loadFoldersFromDb(); +//} + +/*Future<Map<String, FolderRow>> loadFoldersFromDb() async { + final rows = await localMediaDb.rawDb.query( + 'folders', + where: 'is_remote = 0', + ); + + final map = <String, FolderRow>{}; + for (final row in rows) { + map[row['path'] as String] = FolderRow( + path: row['path'] as String, + albumType: row['album_type'] as int, + priority: row['priority'] as int, + displayName: row['display_name'] as String, + ); + } + return map; +}*/ + + Set<CollectionFilter> _getAppHiddenFilters() => { + ...settings.hiddenFilters, + }; + +Iterable<AvesEntry> _applyHiddenFilters(Iterable<AvesEntry> entries) { + final hiddenFilters = { + TrashFilter.instance, + ..._getAppHiddenFilters(), + }; + + // Remote OFF -> mostra solo entry locali (origin == 0) + // Usa il getter esposto sulla source per centralizzare la logica + final remoteOn = remoteVisible; + + if (!remoteOn) { + entries = entries.where((e) => e.origin == 0).toList(); + } + + // PATCH B: non nascondere i remoti con i filtri "nascosti" (tranne Trash) + return entries.where((entry) { + if (entry.origin == RemoteOrigin.value) { + if (kTraceHiddenRemotes) { + final hiddenBy = hiddenFilters.firstWhereOrNull((f) => f.test(entry)); + if (hiddenBy != null && !TrashFilter.instance.test(entry)) { + debugPrint('[hidden][trace] remote id=${entry.id} rid=${entry.remoteId} by=${hiddenBy.runtimeType}'); + } + } + // remoti: nascondi solo se nel cestino + return !TrashFilter.instance.test(entry); + } + // locali: logica originale + return !hiddenFilters.any((filter) => filter.test(entry)); + }); +} + + + Iterable<AvesEntry> _applyTrashFilter(Iterable<AvesEntry> entries) { + final hiddenFilters = _getAppHiddenFilters(); + return entries.where(TrashFilter.instance.test).where((entry) => !hiddenFilters.any((filter) => filter.test(entry))); + } + + void _invalidate({Set<AvesEntry>? entries, bool notify = true}) { + invalidateEntries(); + invalidateCountryFilterSummary(entries: entries, notify: notify); + invalidatePlaceFilterSummary(entries: entries, notify: notify); + invalidateStateFilterSummary(entries: entries, notify: notify); + invalidateTagFilterSummary(entries: entries, notify: notify); + } + + @override + void invalidateEntries() { + _visibleEntries = null; + _trashedEntries = null; + _sortedEntriesByDate = null; + } + + void updateDerivedFilters([Set<AvesEntry>? entries]) { + _invalidate(entries: entries); + // it is possible for entries hidden by a filter type, to have an impact on other types + // e.g. given a sole entry for country C and tag T, hiding T should make C disappear too + //updateDirectories(); + updateLocations(); + updateTags(); + } + + void addEntries(Set<AvesEntry> entries, {bool notify = true}) { + if (entries.isEmpty) return; + + // ✅ DEDUPE per URI (evita raddoppi quando lo stesso media entra con ID diverso) + final newUris = entries + .map((e) => e.uri) + .whereType<String>() + .where((u) => u.isNotEmpty) + .toSet(); + + if (newUris.isNotEmpty && _rawEntries.isNotEmpty) { + final removedByUri = <AvesEntry>{}; + + _rawEntries.removeWhere((entry) { + final u = entry.uri; + final match = u != null && newUris.contains(u); + if (match) removedByUri.add(entry); + return match; + }); + + // rimuovi anche dalla mappa id->entry per non lasciare "zombie" + if (removedByUri.isNotEmpty) { + for (final old in removedByUri) { + _entryById.remove(old.id); + } + } + } + + // Deduplica per ID (comportamento originale) + final newIdMapEntries = Map.fromEntries(entries.map((entry) => MapEntry(entry.id, entry))); + if (_rawEntries.isNotEmpty) { + final newIds = newIdMapEntries.keys.toSet(); + _rawEntries.removeWhere((entry) => newIds.contains(entry.id)); + } + + entries.where((entry) => entry.catalogDateMillis == null).forEach((entry) { + entry.catalogDateMillis = _savedDates[entry.id]; + }); + + _entryById.addAll(newIdMapEntries); + _rawEntries.addAll(entries); + _invalidate(entries: entries, notify: notify); + + if (notify) { + eventBus.fire(EntryAddedEvent(entries)); + } + } + + void removeEntriesFromMemory(Set<AvesEntry> entries, {bool notify = true}) { + if (entries.isEmpty) return; + + for (final e in entries) { + _entryById.remove(e.id); + } + _rawEntries.removeAll(entries); + updateDerivedFilters(entries); + if (notify) { + eventBus.fire(EntryRemovedEvent(entries)); + } + } + + Future<void> removeEntries(Set<String> uris, {required bool includeTrash}) async { + if (uris.isEmpty) return; + + final entries = _rawEntries.where((entry) => uris.contains(entry.uri)).toSet(); + if (!includeTrash) { + entries.removeWhere(TrashFilter.instance.test); + } + if (entries.isEmpty) return; + + final ids = entries.map((entry) => entry.id).toSet(); + await favourites.removeIds(ids); + await covers.removeIds(ids); + await localMediaDb.removeIds(ids); + + ids.forEach((id) => _entryById.remove); + _rawEntries.removeAll(entries); + updateDerivedFilters(entries); + eventBus.fire(EntryRemovedEvent(entries)); + } + + void clearEntries() { + _entryById.clear(); + _rawEntries.clear(); + _invalidate(); + + // do not update directories/locations/tags here + // as it could reset filter dependent settings (pins, bookmarks, etc.) + // caller should take care of updating these at the right time + } + + /// Carica dal DB tutte le entry **remote** (`origin=${RemoteOrigin.value}`) non cestinate + /// e le aggiunge alla sorgente corrente (evitando duplicati per ID). + /// + /// 👉 Va chiamato **dopo** che la sorgente locale è stata inizializzata + /// (es. subito dopo `await source.init(...)` nel tuo `home_page.dart`). + Future<void> appendRemoteEntries({bool notify = true}) async { + try { + final remotes = await localMediaDb.loadEntries(origin: RemoteOrigin.value); + if (remotes.isEmpty) return; + + // Manteniamo visibili solo quelli non cestinati + final visibleRemotes = remotes.where((e) => !e.trashed).toSet(); + if (visibleRemotes.isEmpty) return; + + // Merge usando la logica standard (aggiorna mappe, invalida, eventi, filtri, ecc.) + addEntries(visibleRemotes, notify: notify); + } catch (e, st) { + debugPrint('CollectionSource.appendRemoteEntries error: $e\n$st'); + } + } + + Future<void> _moveEntry(AvesEntry entry, Map newFields, {required bool persist}) async { + newFields.keys.forEach((key) { + final newValue = newFields[key]; + switch (key) { + case EntryFields.contentId: + entry.contentId = newValue as int?; + case EntryFields.dateModifiedMillis: + // `dateModifiedMillis` changes when moving entries to another directory, + // but it does not change when renaming the containing directory + entry.dateModifiedMillis = newValue as int?; + case EntryFields.path: + entry.path = newValue as String?; + case EntryFields.title: + entry.sourceTitle = newValue as String?; + case EntryFields.trashed: + final trashed = newValue as bool; + entry.trashed = trashed; + entry.trashDetails = trashed + ? TrashDetails( + id: entry.id, + path: newFields[EntryFields.trashPath] as String, + dateMillis: DateTime.now().millisecondsSinceEpoch, + ) + : null; + case EntryFields.uri: + entry.uri = newValue as String; + case EntryFields.origin: + entry.origin = newValue as int; + } + }); + if (entry.trashed) { + final trashPath = entry.trashDetails?.path; + if (trashPath != null) { + entry.contentId = null; + entry.uri = Uri.file(trashPath).toString(); + } else { + debugPrint('failed to update uri from unknown trash path for uri=${entry.uri}'); + } + } + + if (persist) { + await covers.moveEntry(entry); + final id = entry.id; + await localMediaDb.updateEntry(id, entry); + await localMediaDb.updateCatalogMetadata(id, entry.catalogMetadata); + await localMediaDb.updateAddress(id, entry.addressDetails); + await localMediaDb.updateTrash(id, entry.trashDetails); + } + } + +Future<void> updateAfterMove({ + required Set<AvesEntry> todoEntries, + required MoveType moveType, + required Set<String> destinationAlbums, // <-- non più usato + required Set<MoveOpEvent> movedOps, +}) async { + if (movedOps.isEmpty) return; + + // 1) Rimuovi eventuali entry duplicate (stesso path) + final replacedUris = movedOps + .map((movedOp) => movedOp.newFields[EntryFields.path] as String?) + .map((targetPath) { + final existingEntry = _rawEntries.firstWhereOrNull( + (entry) => entry.path == targetPath && !entry.trashed, + ); + return existingEntry?.uri; + }) + .nonNulls + .toSet(); + + await removeEntries(replacedUris, includeTrash: false); + + // 2) Prepara set di entry modificate + final movedEntries = <AvesEntry>{}; + final copy = moveType == MoveType.copy; + + if (copy) { + // COPY → crea nuove entry + for (final movedOp in movedOps) { + final sourceUri = movedOp.uri; + final newFields = movedOp.newFields; + final sourceEntry = todoEntries.firstWhereOrNull((e) => e.uri == sourceUri); + + if (sourceEntry != null) { + movedEntries.add( + sourceEntry.copyWith( + id: localMediaDb.nextId, + uri: newFields[EntryFields.uri] as String?, + path: newFields[EntryFields.path] as String?, + contentId: newFields[EntryFields.contentId] as int?, + title: newFields[EntryFields.title] as String?, + dateAddedSecs: newFields[EntryFields.dateAddedSecs] as int?, + dateModifiedMillis: newFields[EntryFields.dateModifiedMillis] as int?, + origin: newFields[EntryFields.origin] as int?, + ), + ); + } else { + debugPrint('failed to find source entry with uri=$sourceUri'); + } + } + + await localMediaDb.insertEntries(movedEntries); + await localMediaDb.saveCatalogMetadata( + movedEntries.map((e) => e.catalogMetadata).nonNulls.toSet(), + ); + await localMediaDb.saveAddresses( + movedEntries.map((e) => e.addressDetails).nonNulls.toSet(), + ); + } else { + // MOVE / EXPORT / BIN → aggiorna entry esistenti + await Future.forEach<MoveOpEvent>(movedOps, (movedOp) async { + final newFields = movedOp.newFields; + if (newFields.isEmpty) return; + + final sourceUri = movedOp.uri; + final entry = todoEntries.firstWhereOrNull((e) => e.uri == sourceUri); + + if (entry != null) { + if (moveType == MoveType.fromBin) { + newFields[EntryFields.trashed] = false; + } + movedEntries.add(entry); + await _moveEntry(entry, newFields, persist: true); + } + }); + } + + // 3) Aggiorna CollectionSource + switch (moveType) { + case MoveType.copy: + addEntries(movedEntries); + case MoveType.move: + case MoveType.export: + break; + case MoveType.toBin: + case MoveType.fromBin: + updateDerivedFilters(movedEntries); + } + + + _invalidate(entries: movedEntries); + eventBus.fire(EntryMovedEvent(moveType, movedEntries)); +} + + Future<void> updateAfterRename({ + required Set<AvesEntry> todoEntries, + required Set<MoveOpEvent> movedOps, + required bool persist, + }) async { + if (movedOps.isEmpty) return; + + final movedEntries = <AvesEntry>{}; + await Future.forEach<MoveOpEvent>(movedOps, (movedOp) async { + final newFields = movedOp.newFields; + if (newFields.isNotEmpty) { + final sourceUri = movedOp.uri; + final entry = todoEntries.firstWhereOrNull((entry) => entry.uri == sourceUri); + if (entry != null) { + movedEntries.add(entry); + await _moveEntry(entry, newFields, persist: persist); + } + } + }); + + eventBus.fire(EntryMovedEvent(MoveType.move, movedEntries)); + } + + SourceScope get loadedScope; + + SourceScope get targetScope; + + Future<void> init({ + required SourceScope scope, + AnalysisController? analysisController, + bool loadTopEntriesFirst = false, + }); + + Future<Set<String>> refreshUris(Set<String> changedUris, {AnalysisController? analysisController}); + + Future<void> refreshEntries(Set<AvesEntry> entries, Set<EntryDataType> dataTypes) async { + const background = false; + const persist = true; + + await Future.forEach(entries, (entry) async { + await entry.refresh(background: background, persist: persist, dataTypes: dataTypes); + }); + + if (dataTypes.contains(EntryDataType.aspectRatio)) { + onAspectRatioChanged(); + } + + if (dataTypes.contains(EntryDataType.catalog)) { + // explicit GC before cataloguing multiple items + await deviceService.requestGarbageCollection(); + await Future.forEach(entries, (entry) async { + await entry.catalog(background: background, force: dataTypes.contains(EntryDataType.catalog), persist: persist); + await localMediaDb.updateCatalogMetadata(entry.id, entry.catalogMetadata); + }); + onCatalogMetadataChanged(); + } + + if (dataTypes.contains(EntryDataType.address)) { + await Future.forEach(entries, (entry) async { + await entry.locate(background: background, force: dataTypes.contains(EntryDataType.address), geocoderLocale: settings.appliedLocale); + await localMediaDb.updateAddress(entry.id, entry.addressDetails); + }); + onAddressMetadataChanged(); + } + + updateDerivedFilters(entries); + eventBus.fire(EntryRefreshedEvent(entries)); + } + + Future<void> analyze(AnalysisController? analysisController, {Set<AvesEntry>? entries}) async { + // not only visible entries, as hidden and vault items may be analyzed + final todoEntries = entries ?? allEntries; + final defaultAnalysisController = AnalysisController(); + final _analysisController = analysisController ?? defaultAnalysisController; + final force = _analysisController.force; + if (!_analysisController.isStopping) { + var startAnalysisService = false; + if (_analysisController.canStartService && settings.canUseAnalysisService) { + // cataloguing + if (!startAnalysisService) { + final opCount = (force ? todoEntries : todoEntries.where(TagMixin.catalogEntriesTest)).length; + startAnalysisService = opCount > TagMixin.commitCountThreshold; + } + // ignore locating countries + // locating places + if (!startAnalysisService && await availability.canLocatePlaces) { + final opCount = (force ? todoEntries.where((entry) => entry.hasGps) : todoEntries.where(LocationMixin.locatePlacesTest)).length; + startAnalysisService = opCount > LocationMixin.commitCountThreshold; + } + } + + debugPrint('analyze ${todoEntries.length} entries, force=$force, starting service=$startAnalysisService'); + if (startAnalysisService) { + final lifecycleState = AvesApp.lifecycleStateNotifier.value; + switch (lifecycleState) { + case AppLifecycleState.resumed: + case AppLifecycleState.inactive: + await AnalysisService.startService( + force: force, + entryIds: entries?.map((entry) => entry.id).toList(), + ); + default: + unawaited(reportService.log('analysis service not started because app is in state=$lifecycleState')); + } + } else { + // explicit GC before cataloguing multiple items + await deviceService.requestGarbageCollection(); + await catalogEntries(_analysisController, todoEntries); + updateDerivedFilters(todoEntries); + await locateEntries(_analysisController, todoEntries); + updateDerivedFilters(todoEntries); + } + } + defaultAnalysisController.dispose(); + state = SourceState.ready; + } + + void onAspectRatioChanged() => eventBus.fire(AspectRatioChangedEvent()); + + // monitoring + + bool _canRefresh = true; + + void pauseMonitoring() => _canRefresh = false; + + void resumeMonitoring() => _canRefresh = true; + + bool get canRefresh => _canRefresh; + + // filter summary + + int count(CollectionFilter filter) { + switch (filter) { + case AlbumBaseFilter _: + return 0; + case LocationFilter(level: LocationLevel.country): + return countryEntryCount(filter); + case LocationFilter(level: LocationLevel.state): + return stateEntryCount(filter); + case LocationFilter(level: LocationLevel.place): + return placeEntryCount(filter); + case TagBaseFilter _: + return tagEntryCount(filter); + } + return 0; + } + + int size(CollectionFilter filter) { + switch (filter) { + case AlbumBaseFilter _: + return 0; + case LocationFilter(level: LocationLevel.country): + return countrySize(filter); + case LocationFilter(level: LocationLevel.state): + return stateSize(filter); + case LocationFilter(level: LocationLevel.place): + return placeSize(filter); + case TagBaseFilter _: + return tagSize(filter); + } + return 0; + } + + AvesEntry? recentEntry(CollectionFilter filter) { + switch (filter) { + case AlbumBaseFilter _: + return null; + case LocationFilter(level: LocationLevel.country): + return countryRecentEntry(filter); + case LocationFilter(level: LocationLevel.state): + return stateRecentEntry(filter); + case LocationFilter(level: LocationLevel.place): + return placeRecentEntry(filter); + case TagBaseFilter _: + return tagRecentEntry(filter); + } + return null; + } + +AvesEntry? coverEntry(CollectionFilter filter) { + final id = covers.of(filter)?.$1; + if (id != null) { + return visibleEntries.firstWhereOrNull((e) => e.id == id); + } + return recentEntry(filter); +} + + void _onFilterVisibilityChanged(Set<CollectionFilter> newlyVisibleFilters) { + updateDerivedFilters(); + eventBus.fire(const FilterVisibilityChangedEvent()); + + if (newlyVisibleFilters.isNotEmpty) { + final candidateEntries = visibleEntries.where((entry) => newlyVisibleFilters.any((f) => f.test(entry))).toSet(); + analyze(null, entries: candidateEntries); + } + } + + void _onVaultsChanged() { + _onFilterVisibilityChanged({}); + } +} + +class AspectRatioChangedEvent {} diff --git a/lib/model/source/events.dart b/lib/model/source/events.dart new file mode 100644 index 0000000..ec8dc28 --- /dev/null +++ b/lib/model/source/events.dart @@ -0,0 +1,44 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class EntryAddedEvent { + final Set<AvesEntry>? entries; + + const EntryAddedEvent([this.entries]); +} + +@immutable +class EntryRemovedEvent { + final Set<AvesEntry> entries; + + const EntryRemovedEvent(this.entries); +} + +@immutable +class EntryMovedEvent { + final MoveType type; + final Set<AvesEntry> entries; + + const EntryMovedEvent(this.type, this.entries); +} + +@immutable +class EntryRefreshedEvent { + final Set<AvesEntry> entries; + + const EntryRefreshedEvent(this.entries); +} + +@immutable +class FilterVisibilityChangedEvent { + const FilterVisibilityChangedEvent(); +} + +@immutable +class ProgressEvent { + final int done, total; + + const ProgressEvent({required this.done, required this.total}); +} diff --git a/lib/model/source/folder_album_filter.dart b/lib/model/source/folder_album_filter.dart new file mode 100644 index 0000000..eb456ce --- /dev/null +++ b/lib/model/source/folder_album_filter.dart @@ -0,0 +1,43 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/entry/entry.dart'; + +class FolderAlbumFilter extends CollectionFilter { + final String path; + final String displayName; + final bool isRemote; + + FolderAlbumFilter({ + required this.path, + required this.displayName, + required this.isRemote, + }) : super(reversed: false); + + @override + String get key => 'folder:$path'; + + @override + String get category => 'album'; + + @override + bool get exclusiveProp => true; + + @override + EntryPredicate get positiveTest => (AvesEntry entry) => entry.directory == path; + + @override + Map<String, dynamic> toMap() => { + 'type': 'folder', + 'path': path, + 'displayName': displayName, + 'isRemote': isRemote, + 'reversed': reversed, + }; + + @override + String get universalLabel => displayName; + + @override + List<Object?> get props => [path, displayName, isRemote, reversed]; + + String get label => displayName; +} diff --git a/lib/model/source/folder_album_source.dart b/lib/model/source/folder_album_source.dart new file mode 100644 index 0000000..1acb296 --- /dev/null +++ b/lib/model/source/folder_album_source.dart @@ -0,0 +1,39 @@ +import 'folder_album_filter.dart'; +import 'package:aves/model/db/folder_stats.dart'; +import 'package:aves/model/entry/entry.dart'; + +/// Costruisce FolderAlbumFilter da folderMap + entriesMap +class FolderAlbumSource { + final Map<String, FolderStats> folderMap; + final Map<int, AvesEntry> entriesMap; + + FolderAlbumSource({ + required this.folderMap, + required this.entriesMap, + }); + + /// Ritorna tutti gli album come FolderAlbumFilter + List<FolderAlbumFilter> get allAlbums { + return folderMap.values.map((f) { + return FolderAlbumFilter( + path: f.path, + displayName: f.displayName, + isRemote: f.isRemote == 1, // FIX: int → bool + ); + }).toList(); + } + + /// Sorting semplice: per nome + List<FolderAlbumFilter> sortedAlbums(dynamic sortFactor) { + final list = allAlbums; + list.sort((a, b) => a.displayName.toLowerCase().compareTo(b.displayName.toLowerCase())); + return list; + } + + /// Grouping disattivato (AlbumPage patchata non lo usa) + Map<String, List<FolderAlbumFilter>> groupedAlbums(dynamic groupFactor) { + return { + 'all': sortedAlbums(null), + }; + } +} diff --git a/lib/model/source/location/country.dart b/lib/model/source/location/country.dart new file mode 100644 index 0000000..f799407 --- /dev/null +++ b/lib/model/source/location/country.dart @@ -0,0 +1,64 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:collection/collection.dart'; + +mixin CountryMixin on SourceBase { + // by country code + final Map<String, int> _filterEntryCountMap = {}, _filterSizeMap = {}; + final Map<String, AvesEntry?> _filterRecentEntryMap = {}; + + void invalidateCountryFilterSummary({ + Set<AvesEntry>? entries, + Set<String>? countryCodes, + bool notify = true, + }) { + if (_filterEntryCountMap.isEmpty && _filterSizeMap.isEmpty && _filterRecentEntryMap.isEmpty) return; + + if (entries == null && countryCodes == null) { + _filterEntryCountMap.clear(); + _filterSizeMap.clear(); + _filterRecentEntryMap.clear(); + } else { + countryCodes ??= {}; + if (entries != null) { + countryCodes.addAll(entries.where((entry) => entry.hasAddress).map((entry) => entry.addressDetails?.countryCode).nonNulls); + } + countryCodes.forEach((countryCode) { + _filterEntryCountMap.remove(countryCode); + _filterSizeMap.remove(countryCode); + _filterRecentEntryMap.remove(countryCode); + }); + } + if (notify) { + eventBus.fire(CountrySummaryInvalidatedEvent(countryCodes)); + } + } + + int countryEntryCount(LocationFilter filter) { + final countryCode = filter.code; + if (countryCode == null) return 0; + return _filterEntryCountMap.putIfAbsent(countryCode, () => visibleEntries.where(filter.test).length); + } + + int countrySize(LocationFilter filter) { + final countryCode = filter.code; + if (countryCode == null) return 0; + return _filterSizeMap.putIfAbsent(countryCode, () => visibleEntries.where(filter.test).map((v) => v.sizeBytes).sum); + } + + AvesEntry? countryRecentEntry(LocationFilter filter) { + final countryCode = filter.code; + if (countryCode == null) return null; + return _filterRecentEntryMap.putIfAbsent(countryCode, () => sortedEntriesByDate.firstWhereOrNull(filter.test)); + } +} + +class CountriesChangedEvent {} + +class CountrySummaryInvalidatedEvent { + final Set<String>? countryCodes; + + const CountrySummaryInvalidatedEvent(this.countryCodes); +} diff --git a/lib/model/source/location/location.dart b/lib/model/source/location/location.dart new file mode 100644 index 0000000..d204b3f --- /dev/null +++ b/lib/model/source/location/location.dart @@ -0,0 +1,209 @@ +import 'dart:math'; + +import 'package:aves/geo/countries.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/metadata/address.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/analysis_controller.dart'; +import 'package:aves/model/source/location/country.dart'; +import 'package:aves/model/source/location/place.dart'; +import 'package:aves/model/source/location/state.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; + +mixin LocationMixin on CountryMixin, StateMixin { + static const commitCountThreshold = 200; + static const _stopCheckCountThreshold = 50; + + List<String> sortedCountries = List.unmodifiable([]); + List<String> sortedStates = List.unmodifiable([]); + List<String> sortedPlaces = List.unmodifiable([]); + + Future<void> loadAddresses({Set<int>? ids}) async { + final saved = await (ids != null ? localMediaDb.loadAddressesById(ids) : localMediaDb.loadAddresses()); + final idMap = entryById; + saved.forEach((metadata) => idMap[metadata.id]?.addressDetails = metadata); + invalidateEntries(); + onAddressMetadataChanged(); + } + + Future<void> locateEntries(AnalysisController controller, Set<AvesEntry> candidateEntries) async { + await _locateCountries(controller, candidateEntries); + await _locatePlaces(controller, candidateEntries); + + final unlocatedIds = candidateEntries.where((entry) => !entry.hasGps).map((entry) => entry.id).toSet(); + if (unlocatedIds.isNotEmpty) { + await localMediaDb.removeIds(unlocatedIds, dataTypes: {EntryDataType.address}); + onAddressMetadataChanged(); + } + } + + static bool locateCountriesTest(AvesEntry entry) => entry.hasGps && !entry.hasAddress; + + static bool locatePlacesTest(AvesEntry entry) => entry.hasGps && !entry.hasFineAddress; + + // quick reverse geocoding to find the countries, using an offline asset + Future<void> _locateCountries(AnalysisController controller, Set<AvesEntry> candidateEntries) async { + if (controller.isStopping) return; + + final force = controller.force; + final todo = (force ? candidateEntries.where((entry) => entry.hasGps) : candidateEntries.where(locateCountriesTest)).toSet(); + if (todo.isEmpty) return; + + state = SourceState.locatingCountries; + var progressDone = 0; + final progressTotal = todo.length; + setProgress(done: progressDone, total: progressTotal); + + final countryCodeMap = await countryTopology.countryCodeMap(todo.map((entry) => entry.latLng!).toSet()); + final newAddresses = <AddressDetails>{}; + todo.forEach((entry) { + final position = entry.latLng; + final countryCode = countryCodeMap.entries.firstWhereOrNull((kv) => kv.value.contains(position))?.key; + entry.setCountry(countryCode); + if (entry.hasAddress) { + newAddresses.add(entry.addressDetails!); + } + setProgress(done: ++progressDone, total: progressTotal); + }); + if (newAddresses.isNotEmpty) { + await localMediaDb.saveAddresses(Set.unmodifiable(newAddresses)); + onAddressMetadataChanged(); + } + } + + // full reverse geocoding, requiring geocoder and some connectivity + Future<void> _locatePlaces(AnalysisController controller, Set<AvesEntry> candidateEntries) async { + if (controller.isStopping) return; + if (!await availability.canLocatePlaces) return; + + final force = controller.force; + final todo = (force ? candidateEntries.where((entry) => entry.hasGps) : candidateEntries.where(locatePlacesTest)).toSet(); + if (todo.isEmpty) return; + + // geocoder calls take between 150ms and 250ms + // approximation and caching can reduce geocoder usage + // for example, for a set of 2932 entries: + // - 2476 calls (84%) when approximating to 6 decimal places (~10cm - individual humans) + // - 2433 calls (83%) when approximating to 5 decimal places (~1m - individual trees, houses) + // - 2277 calls (78%) when approximating to 4 decimal places (~10m - individual street, large buildings) + // - 1521 calls (52%) when approximating to 3 decimal places (~100m - neighborhood, street) + // - 652 calls (22%) when approximating to 2 decimal places (~1km - town or village) + // cf https://en.wikipedia.org/wiki/Decimal_degrees#Precision + final latLngFactor = pow(10, 2); + (int latitude, int longitude) approximateLatLng(AvesEntry entry) { + // entry has coordinates + final catalogMetadata = entry.catalogMetadata!; + final lat = catalogMetadata.latitude!; + final lng = catalogMetadata.longitude!; + return ((lat * latLngFactor).round(), (lng * latLngFactor).round()); + } + + final located = visibleEntries.where((entry) => entry.hasGps).toSet().difference(todo); + final knownLocations = <(int, int), AddressDetails?>{}; + located.forEach((entry) { + knownLocations.putIfAbsent(approximateLatLng(entry), () => entry.addressDetails); + }); + + state = SourceState.locatingPlaces; + var progressDone = 0; + final progressTotal = todo.length; + setProgress(done: progressDone, total: progressTotal); + + var stopCheckCount = 0; + final newAddresses = <AddressDetails>{}; + for (final entry in todo) { + final latLng = approximateLatLng(entry); + if (knownLocations.containsKey(latLng)) { + entry.addressDetails = knownLocations[latLng]?.copyWith(id: entry.id); + } else { + await entry.locatePlace(background: true, force: force, geocoderLocale: settings.appliedLocale); + // it is intended to insert `null` if the geocoder failed, + // so that we skip geocoding of following entries with the same coordinates + knownLocations[latLng] = entry.addressDetails; + } + if (entry.hasFineAddress) { + newAddresses.add(entry.addressDetails!); + if (newAddresses.length >= commitCountThreshold) { + await localMediaDb.saveAddresses(Set.unmodifiable(newAddresses)); + onAddressMetadataChanged(); + newAddresses.clear(); + } + if (++stopCheckCount >= _stopCheckCountThreshold) { + stopCheckCount = 0; + if (controller.isStopping) return; + } + } + setProgress(done: ++progressDone, total: progressTotal); + } + if (newAddresses.isNotEmpty) { + await localMediaDb.saveAddresses(Set.unmodifiable(newAddresses)); + onAddressMetadataChanged(); + } + } + + void onAddressMetadataChanged() { + updateLocations(); + eventBus.fire(AddressMetadataChangedEvent()); + } + + void updateLocations() { + final locations = visibleEntries.map((entry) => entry.addressDetails).nonNulls.toList(); + + final updatedPlaces = locations.map((address) => address.place).nonNulls.where((v) => v.isNotEmpty).toSet().toList()..sort(compareAsciiUpperCase); + if (!listEquals(updatedPlaces, sortedPlaces)) { + sortedPlaces = List.unmodifiable(updatedPlaces); + eventBus.fire(PlacesChangedEvent()); + } + + final updatedStates = _getAreaByCode( + locations: locations, + getCode: (v) => v.stateCode, + getName: (v) => v.stateName, + ); + if (!listEquals(updatedStates, sortedStates)) { + sortedStates = List.unmodifiable(updatedStates); + invalidateStateFilterSummary(); + eventBus.fire(StatesChangedEvent()); + } + + final updatedCountries = _getAreaByCode( + locations: locations, + getCode: (v) => v.countryCode, + getName: (v) => v.countryName, + ); + if (!listEquals(updatedCountries, sortedCountries)) { + sortedCountries = List.unmodifiable(updatedCountries); + invalidateCountryFilterSummary(); + eventBus.fire(CountriesChangedEvent()); + } + } + + // the same country/state code could be found with different country/state names + // e.g. if the locale changed between geocoding calls + // so we merge countries/states by code, keeping only one name for each code + List<String> _getAreaByCode({ + required List<AddressDetails> locations, + required String? Function(AddressDetails address) getCode, + required String? Function(AddressDetails address) getName, + }) { + final namesByCode = Map.fromEntries( + locations.map((address) { + final code = getCode(address); + if (code == null || code.isEmpty) return null; + return MapEntry(code, getName(address)); + }).nonNulls, + ); + return namesByCode.entries.map((kv) { + final code = kv.key; + final name = kv.value; + return '${name != null && name.isNotEmpty ? name : code}${LocationFilter.locationSeparator}$code'; + }).toList()..sort(compareAsciiUpperCase); + } +} + +class AddressMetadataChangedEvent {} diff --git a/lib/model/source/location/place.dart b/lib/model/source/location/place.dart new file mode 100644 index 0000000..42d7cd3 --- /dev/null +++ b/lib/model/source/location/place.dart @@ -0,0 +1,58 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:collection/collection.dart'; + +mixin PlaceMixin on SourceBase { + // by place + final Map<String, int> _filterEntryCountMap = {}, _filterSizeMap = {}; + final Map<String, AvesEntry?> _filterRecentEntryMap = {}; + + void invalidatePlaceFilterSummary({ + Set<AvesEntry>? entries, + Set<String>? places, + bool notify = true, + }) { + if (_filterEntryCountMap.isEmpty && _filterSizeMap.isEmpty && _filterRecentEntryMap.isEmpty) return; + + if (entries == null && places == null) { + _filterEntryCountMap.clear(); + _filterSizeMap.clear(); + _filterRecentEntryMap.clear(); + } else { + places ??= {}; + if (entries != null) { + places.addAll(entries.map((entry) => entry.addressDetails?.place).nonNulls); + } + places.forEach((place) { + _filterEntryCountMap.remove(place); + _filterSizeMap.remove(place); + _filterRecentEntryMap.remove(place); + }); + } + if (notify) { + eventBus.fire(PlaceSummaryInvalidatedEvent(places)); + } + } + + int placeEntryCount(LocationFilter filter) { + return _filterEntryCountMap.putIfAbsent(filter.place, () => visibleEntries.where(filter.test).length); + } + + int placeSize(LocationFilter filter) { + return _filterSizeMap.putIfAbsent(filter.place, () => visibleEntries.where(filter.test).map((v) => v.sizeBytes).sum); + } + + AvesEntry? placeRecentEntry(LocationFilter filter) { + return _filterRecentEntryMap.putIfAbsent(filter.place, () => sortedEntriesByDate.firstWhereOrNull(filter.test)); + } +} + +class PlacesChangedEvent {} + +class PlaceSummaryInvalidatedEvent { + final Set<String>? places; + + const PlaceSummaryInvalidatedEvent(this.places); +} diff --git a/lib/model/source/location/state.dart b/lib/model/source/location/state.dart new file mode 100644 index 0000000..8eb4abd --- /dev/null +++ b/lib/model/source/location/state.dart @@ -0,0 +1,64 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:collection/collection.dart'; + +mixin StateMixin on SourceBase { + // by state code + final Map<String, int> _filterEntryCountMap = {}, _filterSizeMap = {}; + final Map<String, AvesEntry?> _filterRecentEntryMap = {}; + + void invalidateStateFilterSummary({ + Set<AvesEntry>? entries, + Set<String>? stateCodes, + bool notify = true, + }) { + if (_filterEntryCountMap.isEmpty && _filterSizeMap.isEmpty && _filterRecentEntryMap.isEmpty) return; + + if (entries == null && stateCodes == null) { + _filterEntryCountMap.clear(); + _filterSizeMap.clear(); + _filterRecentEntryMap.clear(); + } else { + stateCodes ??= {}; + if (entries != null) { + stateCodes.addAll(entries.where((entry) => entry.hasAddress).map((entry) => entry.addressDetails?.stateCode).nonNulls); + } + stateCodes.forEach((stateCode) { + _filterEntryCountMap.remove(stateCode); + _filterSizeMap.remove(stateCode); + _filterRecentEntryMap.remove(stateCode); + }); + } + if (notify) { + eventBus.fire(StateSummaryInvalidatedEvent(stateCodes)); + } + } + + int stateEntryCount(LocationFilter filter) { + final stateCode = filter.code; + if (stateCode == null) return 0; + return _filterEntryCountMap.putIfAbsent(stateCode, () => visibleEntries.where(filter.test).length); + } + + int stateSize(LocationFilter filter) { + final stateCode = filter.code; + if (stateCode == null) return 0; + return _filterSizeMap.putIfAbsent(stateCode, () => visibleEntries.where(filter.test).map((v) => v.sizeBytes).sum); + } + + AvesEntry? stateRecentEntry(LocationFilter filter) { + final stateCode = filter.code; + if (stateCode == null) return null; + return _filterRecentEntryMap.putIfAbsent(stateCode, () => sortedEntriesByDate.firstWhereOrNull(filter.test)); + } +} + +class StatesChangedEvent {} + +class StateSummaryInvalidatedEvent { + final Set<String>? stateCodes; + + const StateSummaryInvalidatedEvent(this.stateCodes); +} diff --git a/lib/model/source/media_store_source.dart b/lib/model/source/media_store_source.dart new file mode 100644 index 0000000..bb2b739 --- /dev/null +++ b/lib/model/source/media_store_source.dart @@ -0,0 +1,508 @@ +// lib/model/source/media_store_source.dart +import 'dart:async'; + +import 'package:aves/model/covers.dart'; +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/origins.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/analysis_controller.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/utils/debouncer.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; + +// ⭐⭐⭐ (temporaneo) origine remota come nel tuo corrente. +// ATTENZIONE: poi la cambieremo perché colliderebbe con EntryOrigins.unknownContent (=1) +const int ORIGIN_REMOTE = 1; + +class MediaStoreSource extends CollectionSource { + final Debouncer _changeDebouncer = Debouncer(delay: ADurations.mediaContentChangeDebounceDelay); + final Set<String> _changedUris = {}; + int? _lastGeneration; + SourceScope _loadedScope, _targetScope; + bool _canAnalyze = true; + + @override + set canAnalyze(bool enabled) => _canAnalyze = enabled; + + @override + SourceScope get loadedScope => _loadedScope; + + @override + SourceScope get targetScope => _targetScope; + + @override + Future<void> init({ + required SourceScope scope, + AnalysisController? analysisController, + bool loadTopEntriesFirst = false, + }) async { + _targetScope = scope; + await reportService.log('$runtimeType init target scope=$scope'); + await _loadEssentials(); + + addDirectories(albums: settings.pinnedFilters.whereType<StoredAlbumFilter>().map((v) => v.album).toSet()); + await updateGeneration(); + unawaited( + _loadEntries( + analysisController: analysisController, + loadTopEntriesFirst: loadTopEntriesFirst, + ), + ); + } + + +Future<void> _loadEssentials() async { + final stopwatch = Stopwatch()..start(); + state = SourceState.loading; + + // 1) Inizializza DB + await localMediaDb.init(); + debugPrint('[MediaStoreSource] localMediaDb instance hashCode after init = ${localMediaDb.hashCode}'); + + + // 2) Inizializza tutto il resto + await vaults.init(); + await favourites.init(); + + albumGrouping.init(); + albumGrouping.setGroups(settings.albumGroups); + albumGrouping.registerSource(this); + + tagGrouping.init(); + tagGrouping.setGroups(settings.tagGroups); + tagGrouping.registerSource(this); + + await covers.init(); + await dynamicAlbums.init(); + + // 3) Timezone fix + final deviceOffset = DateTime.now().timeZoneOffset.inMilliseconds; + final catalogOffset = settings.catalogTimeZoneOffsetMillis; + if (deviceOffset != catalogOffset) { + unawaited(reportService.log( + 'Time zone offset change: $catalogOffset -> $deviceOffset. Clear catalog metadata to get correct date/times.')); + await localMediaDb.clearDates(); + await localMediaDb.clearCatalogMetadata(); + settings.catalogTimeZoneOffsetMillis = deviceOffset; + } + + // ⭐⭐⭐ PATCH: loadDates SOLO ALLA FINE +debugPrint('[MediaStoreSource] calling loadDates()...'); +await loadDates(); +debugPrint('[MediaStoreSource] localMediaDb instance hashCode before loadDates = ${localMediaDb.hashCode}'); +debugPrint('[MediaStoreSource] BEFORE loadDates: rawDb is null? ${localMediaDb.rawDb == null}'); +debugPrint('[MediaStoreSource] loadDates() DONE'); + + debugPrint('$runtimeType load essentials complete in ${stopwatch.elapsed.inMilliseconds}ms'); +} + + Future<void> _loadEntries({ + AnalysisController? analysisController, + required bool loadTopEntriesFirst, + }) async { + unawaited(reportService.log('$runtimeType load (known) start')); + final stopwatch = Stopwatch()..start(); + state = SourceState.loading; + + // ✅ STEP A: come Aves originale — pulizia SOLO in memoria, NON nel DB + clearEntries(); + + final scopeAlbumFilters = _targetScope?.whereType<StoredAlbumFilter>(); + final scopeDirectory = + scopeAlbumFilters != null && scopeAlbumFilters.length == 1 ? scopeAlbumFilters.first.album : null; + + final Set<AvesEntry> topEntries = {}; + if (loadTopEntriesFirst) { + final topIds = settings.topEntryIds?.toSet(); + if (topIds != null) { + debugPrint('$runtimeType load ${stopwatch.elapsed} load ${topIds.length} top entries'); + topEntries.addAll(await localMediaDb.loadEntriesById(topIds)); + addEntries(topEntries); + } + } + + debugPrint('$runtimeType load ${stopwatch.elapsed} fetch known entries'); + final knownEntries = + await localMediaDb.loadEntries(origin: EntryOrigins.mediaStoreContent, directory: scopeDirectory); + final knownLiveEntries = knownEntries.where((entry) => !entry.trashed).toSet(); + final isLargeCollection = knownEntries.length > 80000; + if (isLargeCollection && settings.isErrorReportingAllowed) { + settings.isErrorReportingAllowed = false; + } + unawaited(reportService.setCustomKey('is_large_collection', isLargeCollection)); + unawaited(reportService.log('$runtimeType found ${knownEntries.length} known entries')); + + debugPrint('$runtimeType load ${stopwatch.elapsed} check obsolete entries'); + final knownDateByContentId = + Map.fromEntries(knownLiveEntries.map((entry) => MapEntry(entry.contentId, entry.dateModifiedMillis))); + final knownContentIds = knownDateByContentId.keys.toList(); + + final removedContentIds = (await mediaStoreService.checkObsoleteContentIds(knownContentIds)).toSet(); + debugPrint('[media_store_source] removedContentIds count=${removedContentIds.length} sample=${removedContentIds.take(10)}'); + + if (topEntries.isNotEmpty) { + final removedTopEntries = topEntries.where((entry) => removedContentIds.contains(entry.contentId)); + await removeEntries(removedTopEntries.map((entry) => entry.uri).toSet(), includeTrash: false); + } + final removedEntries = knownEntries.where((entry) => removedContentIds.contains(entry.contentId)).toSet(); + knownEntries.removeAll(removedEntries); + + // ⭐⭐⭐ PATCH: rimuovi solo locali, non remote ⭐⭐⭐ + final localRemovedEntries = removedEntries.where((e) => e.origin != ORIGIN_REMOTE).toSet(); + debugPrint('[media_store_source] removedEntries total=${removedEntries.length} localRemovedEntries=${localRemovedEntries.length}'); + + if (localRemovedEntries.isNotEmpty) { + await localMediaDb.removeIds(localRemovedEntries.map((entry) => entry.id).toSet()); + } + + // show known entries + debugPrint('$runtimeType load ${stopwatch.elapsed} add known entries'); + addEntries(knownEntries, notify: false); + notifyAlbumsChanged(); + + await _loadVaultEntries(scopeDirectory); + + debugPrint('$runtimeType load ${stopwatch.elapsed} load metadata'); + if (scopeDirectory != null) { + final ids = knownLiveEntries.map((entry) => entry.id).toSet(); + await loadCatalogMetadata(ids: ids); + await loadAddresses(ids: ids); + } else { + await loadCatalogMetadata(); + await loadAddresses(); + + await loadTrashDetails(); + unawaited( + deleteExpiredTrash().then( + (deletedUris) { + if (deletedUris.isNotEmpty) { + debugPrint('evicted ${deletedUris.length} expired items from the trash'); + removeEntries(deletedUris, includeTrash: true); + } + }, + ), + ); + } + updateDerivedFilters(); + + _loadedScope = _targetScope; + + if (_canAnalyze) { + await _loadNewEntries( + analysisController: analysisController, + directory: scopeDirectory, + knownLiveEntries: knownLiveEntries, + knownDateByContentId: knownDateByContentId, + ); + } else { + state = SourceState.ready; + } + } + + Future<void> _loadNewEntries({ + required AnalysisController? analysisController, + required String? directory, + required Set<AvesEntry> knownLiveEntries, + required Map<int?, int?> knownDateByContentId, + }) async { + unawaited(reportService.log('$runtimeType load (new) start')); + final stopwatch = Stopwatch()..start(); + + final newEntries = <AvesEntry>{}; + final folderSet = <String>{}; + + if (directory == null) { + newEntries.addAll(await recoverUntrackedTrashItems()); + } + + debugPrint('$runtimeType load ${stopwatch.elapsed} check obsolete paths'); + + // ⭐⭐⭐ PATCH: escludi remote ⭐⭐⭐ + final knownPathByContentId = Map.fromEntries( + knownLiveEntries + .where((entry) => entry.origin != ORIGIN_REMOTE) + .map((entry) => MapEntry(entry.contentId, entry.path)), + ); + + final movedContentIds = (await mediaStoreService.checkObsoletePaths(knownPathByContentId)).toSet(); + movedContentIds.forEach((contentId) { + knownDateByContentId[contentId] = 0; + }); + + debugPrint('$runtimeType load ${stopwatch.elapsed} fetch new entries'); + final knownContentIds = knownDateByContentId.keys.toSet(); + + mediaStoreService.getEntries(knownDateByContentId, directory: directory).listen( + (entry) { + final dir = entry.directory; + if (dir != null) { + folderSet.add(dir); + } + + final contentId = entry.contentId; + final existingEntry = knownContentIds.contains(contentId) + ? knownLiveEntries.firstWhereOrNull((entry) => entry.contentId == contentId) + : null; + entry.id = existingEntry?.id ?? localMediaDb.nextId; + + newEntries.add(entry); + setProgress(done: newEntries.length, total: 0); + }, + + +onDone: () async { + // 🔹 Inserisci nuove entries nel DB + if (newEntries.isNotEmpty) { + await localMediaDb.insertEntries(newEntries); + + final duplicates = await localMediaDb.searchLiveDuplicates( + EntryOrigins.mediaStoreContent, + newEntries, + ); + if (duplicates.isNotEmpty) { + await localMediaDb.removeIds(duplicates.map((v) => v.id).toSet()); + for (final duplicate in duplicates) { + final duplicateId = duplicate.id; + newEntries.removeWhere((v) => v.id == duplicateId); + } + } + + addEntries(newEntries); + invalidateAlbumFilterSummary(); + } + + // 🔹 Analisi (come prima) + Set<AvesEntry>? analysisEntries; + final analysisIds = analysisController?.entryIds; + if (analysisIds != null) { + analysisEntries = allEntries + .where((entry) => analysisIds.contains(entry.id)) + .toSet(); + } + await analyze(analysisController, entries: analysisEntries); + + // 🔥 PATCH FOLDERS: comportamento incrementale, NON distruttivo + + // Se non ci sono nuove directory → NON toccare il DB + if (folderSet.isEmpty) { + debugPrint('[folders] Nessuna nuova cartella → DB invariato'); + state = SourceState.ready; + return; + } + + // Recupera cartelle già presenti nel DB + final existing = await localMediaDb.getLocalFolderPaths(); + final newOnes = folderSet.difference(existing.toSet()); + + if (newOnes.isEmpty) { + debugPrint('[folders] Nessuna cartella nuova → DB invariato'); + state = SourceState.ready; + return; + } + + // Inserisci SOLO le nuove cartelle + debugPrint('[folders] Aggiungo ${newOnes.length} nuove cartelle'); + //await localMediaDb.insertLocalFolders(newOnes.toList()); + + // Aggiorna cache e UI + await updateDirectories(); + notifyAlbumsChanged(); + + state = SourceState.ready; +}, + + ); + } + + @override + Future<Set<String>> refreshUris(Set<String> changedUris, {AnalysisController? analysisController}) async { + if (!canRefresh || !isReady) return changedUris; + + state = SourceState.loading; + + final changedUriByContentId = Map.fromEntries( + changedUris.map((uri) { + final pathSegments = Uri.parse(uri).pathSegments; + if (pathSegments.isEmpty) return null; + final idString = pathSegments.last; + final contentId = int.tryParse(idString); + if (contentId == null) return null; + return MapEntry(contentId, uri); + }).nonNulls, + ); + + final obsoleteContentIds = + (await mediaStoreService.checkObsoleteContentIds(changedUriByContentId.keys.toList())).toSet(); + + final obsoleteUris = obsoleteContentIds.map((contentId) => changedUriByContentId[contentId]).nonNulls.toSet(); + + // ⭐⭐⭐ PATCH: rimuovi solo locali ⭐⭐⭐ + final localObsoleteUris = <String>{}; + for (final uri in obsoleteUris) { + final existingEntry = allEntries.firstWhereOrNull((entry) => entry.uri == uri); + if (existingEntry == null) { + final sourceEntry = await mediaFetchService.getEntry(uri, null, allowUnsized: true); + if (sourceEntry != null && sourceEntry.origin != ORIGIN_REMOTE) { + localObsoleteUris.add(uri); + } + } else { + if (existingEntry.origin != ORIGIN_REMOTE) { + localObsoleteUris.add(uri); + } + } + } + + if (localObsoleteUris.isNotEmpty) { + await removeEntries(localObsoleteUris, includeTrash: false); + } + + obsoleteContentIds.forEach(changedUriByContentId.remove); + + final tempUris = <String>{}; + final newEntries = <AvesEntry>{}, entriesToRefresh = <AvesEntry>{}; + final existingDirectories = <String>{}; + + for (final kv in changedUriByContentId.entries) { + final contentId = kv.key; + final uri = kv.value; + final sourceEntry = await mediaFetchService.getEntry(uri, null); + if (sourceEntry != null) { + final existingEntry = allEntries.firstWhereOrNull((entry) => entry.contentId == contentId); + if (existingEntry == null || + (sourceEntry.dateModifiedMillis ?? 0) > (existingEntry.dateModifiedMillis ?? 0) || + sourceEntry.path != existingEntry.path) { + final newPath = sourceEntry.path; + final volume = newPath != null ? androidFileUtils.getStorageVolume(newPath) : null; + if (volume != null) { + if (existingEntry != null) { + entriesToRefresh.add(existingEntry); + } else if (_canAnalyze) { + sourceEntry.id = localMediaDb.nextId; + newEntries.add(sourceEntry); + } + final existingDirectory = existingEntry?.directory; + if (existingDirectory != null) { + existingDirectories.add(existingDirectory); + } + } else { + tempUris.add(uri); + } + } + } + } + + await _refreshVaultEntries( + changedUris: changedUris.where(vaults.isVaultEntryUri).toSet(), + newEntries: newEntries, + entriesToRefresh: entriesToRefresh, + existingDirectories: existingDirectories, + ); + + invalidateAlbumFilterSummary(directories: existingDirectories); + + if (newEntries.isNotEmpty) { + await localMediaDb.insertEntries(newEntries); + + final duplicates = await localMediaDb.searchLiveDuplicates(EntryOrigins.mediaStoreContent, newEntries); + if (duplicates.isNotEmpty) { + await localMediaDb.removeIds(duplicates.map((v) => v.id).toSet()); + for (final duplicate in duplicates) { + final duplicateId = duplicate.id; + newEntries.removeWhere((v) => v.id == duplicateId); + tempUris.add(duplicate.uri); + } + } + + addEntries(newEntries); + await analyze(analysisController, entries: newEntries); + } + + if (entriesToRefresh.isNotEmpty) { + await refreshEntries(entriesToRefresh, EntryDataType.values.toSet()); + } + + state = SourceState.ready; + +// ⭐ PATCH: elimina cartelle vuote dal DB +cleanEmptyAlbums(); + +// ⭐ PATCH: aggiorna la lista album dopo la pulizia +await updateDirectories(); +notifyAlbumsChanged(); + + + return tempUris; + } + + void onStoreChanged(String? uri) { + if (uri != null) _changedUris.add(uri); + if (_changedUris.isNotEmpty) { + _changeDebouncer(() async { + final todo = _changedUris.toSet(); + _changedUris.clear(); + final tempUris = await refreshUris(todo); + if (tempUris.isNotEmpty) { + _changedUris.addAll(tempUris); + onStoreChanged(null); + } + }); + } + } + + Future<void> checkForChanges() async { + final sinceGeneration = _lastGeneration; + if (sinceGeneration != null) { + _changedUris.addAll(await mediaStoreService.getChangedUris(sinceGeneration)); + onStoreChanged(null); + } + await updateGeneration(); + } + + Future<void> updateGeneration() async { + _lastGeneration = await mediaStoreService.getGeneration(); + } + + // vault + + Future<void> _loadVaultEntries(String? directory) async { + addEntries(await localMediaDb.loadEntries(origin: EntryOrigins.vault, directory: directory)); + } + + Future<void> _refreshVaultEntries({ + required Set<String> changedUris, + required Set<AvesEntry> newEntries, + required Set<AvesEntry> entriesToRefresh, + required Set<String> existingDirectories, + }) async { + for (final uri in changedUris) { + final existingEntry = allEntries.firstWhereOrNull((entry) => entry.uri == uri); + if (existingEntry != null) { + entriesToRefresh.add(existingEntry); + final existingDirectory = existingEntry.directory; + if (existingDirectory != null) { + existingDirectories.add(existingDirectory); + } + } else { + final sourceEntry = await mediaFetchService.getEntry(uri, null, allowUnsized: true); + if (sourceEntry != null) { + newEntries.add( + sourceEntry.copyWith( + id: localMediaDb.nextId, + origin: EntryOrigins.vault, + ), + ); + } + } + } + } +} diff --git a/lib/model/source/section_keys.dart b/lib/model/source/section_keys.dart new file mode 100644 index 0000000..52cfb48 --- /dev/null +++ b/lib/model/source/section_keys.dart @@ -0,0 +1,34 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class SectionKey { + const SectionKey(); +} + +class EntryAlbumSectionKey extends SectionKey with EquatableMixin { + final String? directory; + + @override + List<Object?> get props => [directory]; + + const EntryAlbumSectionKey(this.directory); +} + +class EntryDateSectionKey extends SectionKey with EquatableMixin { + final DateTime? date; + + @override + List<Object?> get props => [date]; + + const EntryDateSectionKey(this.date); +} + +class EntryRatingSectionKey extends SectionKey with EquatableMixin { + final int rating; + + @override + List<Object?> get props => [rating]; + + const EntryRatingSectionKey(this.rating); +} diff --git a/lib/model/source/tag.dart b/lib/model/source/tag.dart new file mode 100644 index 0000000..7f8bf28 --- /dev/null +++ b/lib/model/source/tag.dart @@ -0,0 +1,155 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/catalog.dart'; +import 'package:aves/model/filters/container/tag_group.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/source/analysis_controller.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; + +mixin TagMixin on SourceBase { + static const commitCountThreshold = 400; + static const _stopCheckCountThreshold = 100; + + List<String> sortedTags = List.unmodifiable([]); + + Future<void> loadCatalogMetadata({Set<int>? ids}) async { + final saved = await (ids != null ? localMediaDb.loadCatalogMetadataById(ids) : localMediaDb.loadCatalogMetadata()); + final idMap = entryById; + saved.forEach((metadata) => idMap[metadata.id]?.catalogMetadata = metadata); + invalidateEntries(); + onCatalogMetadataChanged(); + } + + static bool catalogEntriesTest(AvesEntry entry) => !entry.isCatalogued; + + Future<void> catalogEntries(AnalysisController controller, Set<AvesEntry> candidateEntries) async { + if (controller.isStopping) return; + + final force = controller.force; + final todo = force ? candidateEntries : candidateEntries.where(catalogEntriesTest).toSet(); + if (todo.isEmpty) return; + + state = SourceState.cataloguing; + var progressDone = controller.progressOffset; + var progressTotal = controller.progressTotal; + if (progressTotal == 0) { + progressTotal = todo.length; + } + setProgress(done: progressDone, total: progressTotal); + + var stopCheckCount = 0; + final newMetadata = <CatalogMetadata>{}; + for (final entry in todo) { + await entry.catalog(background: true, force: force, persist: true); + if (entry.isCatalogued) { + newMetadata.add(entry.catalogMetadata!); + if (newMetadata.length >= commitCountThreshold) { + await localMediaDb.saveCatalogMetadata(Set.unmodifiable(newMetadata)); + onCatalogMetadataChanged(); + newMetadata.clear(); + } + if (++stopCheckCount >= _stopCheckCountThreshold) { + stopCheckCount = 0; + if (controller.isStopping) return; + } + } + setProgress(done: ++progressDone, total: progressTotal); + } + await localMediaDb.saveCatalogMetadata(Set.unmodifiable(newMetadata)); + onCatalogMetadataChanged(); + } + + void onCatalogMetadataChanged() { + updateTags(); + eventBus.fire(CatalogMetadataChangedEvent()); + } + + void updateTags() { + final updatedTags = visibleEntries.expand((entry) => entry.tags).toSet().toList()..sort(compareAsciiUpperCaseNatural); + if (!listEquals(updatedTags, sortedTags)) { + sortedTags = List.unmodifiable(updatedTags); + invalidateTagFilterSummary(); + eventBus.fire(TagsChangedEvent()); + } + } + + // filter summary + + // by tag + final Map<String, int> _filterEntryCountMap = {}, _filterSizeMap = {}; + final Map<String, AvesEntry?> _filterRecentEntryMap = {}; + + void invalidateTagFilterSummary({ + Set<AvesEntry>? entries, + Set<String>? tags, + bool notify = true, + }) { + if (_filterEntryCountMap.isEmpty && _filterSizeMap.isEmpty && _filterRecentEntryMap.isEmpty) return; + + if (entries == null && tags == null) { + _filterEntryCountMap.clear(); + _filterSizeMap.clear(); + _filterRecentEntryMap.clear(); + } else { + tags ??= {}; + if (entries != null) { + tags.addAll(entries.where((entry) => entry.isCatalogued).expand((entry) => entry.tags)); + } + tags.map((v) => TagFilter(v).key).forEach((key) { + _filterEntryCountMap.remove(key); + _filterSizeMap.remove(key); + _filterRecentEntryMap.remove(key); + }); + + // clear entries for all groups + invalidateTagGroupFilterSummary(notify: false); + } + if (notify) { + eventBus.fire(TagSummaryInvalidatedEvent(tags)); + eventBus.fire(const TagGroupSummaryInvalidatedEvent()); + } + } + + void invalidateTagGroupFilterSummary({bool notify = true}) { + _filterEntryCountMap.removeWhere(_isTagGroupKey); + _filterSizeMap.removeWhere(_isTagGroupKey); + _filterRecentEntryMap.removeWhere(_isTagGroupKey); + + if (notify) { + eventBus.fire(const TagGroupSummaryInvalidatedEvent()); + } + } + + bool _isTagGroupKey(String key, _) => key.startsWith('${TagGroupFilter.type}-'); + + int tagEntryCount(TagBaseFilter filter) { + return _filterEntryCountMap.putIfAbsent(filter.key, () => visibleEntries.where(filter.test).length); + } + + int tagSize(TagBaseFilter filter) { + return _filterSizeMap.putIfAbsent(filter.key, () => visibleEntries.where(filter.test).map((v) => v.sizeBytes).sum); + } + + AvesEntry? tagRecentEntry(TagBaseFilter filter) { + return _filterRecentEntryMap.putIfAbsent(filter.key, () => sortedEntriesByDate.firstWhereOrNull(filter.test)); + } +} + +class CatalogMetadataChangedEvent {} + +class TagsChangedEvent {} + +class TagGroupSummaryInvalidatedEvent { + const TagGroupSummaryInvalidatedEvent(); +} + +class TagSummaryInvalidatedEvent { + final Set<String>? tags; + + const TagSummaryInvalidatedEvent(this.tags); +} diff --git a/lib/model/source/trash.dart b/lib/model/source/trash.dart new file mode 100644 index 0000000..e75ef0a --- /dev/null +++ b/lib/model/source/trash.dart @@ -0,0 +1,96 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/metadata/trash.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/common/image_op_events.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; + +mixin TrashMixin on SourceBase { + static const Duration binKeepDuration = Duration(days: 30); + + Future<void> loadTrashDetails() async { + final saved = await localMediaDb.loadAllTrashDetails(); + final idMap = entryById; + saved.forEach((details) => idMap[details.id]?.trashDetails = details); + } + + Future<Set<String>> deleteExpiredTrash() async { + final expiredEntries = trashedEntries.where((entry) => entry.isExpiredTrash).toSet(); + if (expiredEntries.isEmpty) return {}; + + final processed = <ImageOpEvent>{}; + final opCompleter = Completer<Set<String>>(); + mediaEditService + .delete(entries: expiredEntries) + .listen( + processed.add, + onError: opCompleter.completeError, + onDone: () async { + final successOps = processed.where((e) => e.success).toSet(); + final deletedOps = successOps.where((e) => !e.skipped).toSet(); + final deletedUris = deletedOps.map((event) => event.uri).toSet(); + opCompleter.complete(deletedUris); + }, + ); + return await opCompleter.future; + } + + Future<Set<AvesEntry>> recoverUntrackedTrashItems() async { + final newEntries = <AvesEntry>{}; + + final knownPaths = allEntries.map((v) => v.trashDetails?.path).nonNulls.toSet(); + final untrackedPaths = await storageService.getUntrackedTrashPaths(knownPaths); + if (untrackedPaths.isNotEmpty) { + debugPrint('Recovering ${untrackedPaths.length} untracked bin items'); + final recoveryPath = pContext.join(androidFileUtils.picturesPath, AndroidFileUtils.recoveryDir); + await Future.forEach(untrackedPaths, (untrackedPath) async { + TrashDetails _buildTrashDetails(int id) => TrashDetails( + id: id, + path: untrackedPath, + dateMillis: DateTime.now().millisecondsSinceEpoch, + ); + + final uri = Uri.file(untrackedPath).toString(); + final entry = allEntries.firstWhereOrNull((v) => v.uri == uri); + if (entry != null) { + // there is already a matching entry + // but missing trash details, and possibly not marked as trash + final id = entry.id; + entry.contentId = null; + entry.trashed = true; + entry.trashDetails = _buildTrashDetails(id); + // persist + await localMediaDb.updateEntry(id, entry); + await localMediaDb.updateTrash(id, entry.trashDetails); + } else { + // there is no matching entry + final sourceEntry = await mediaFetchService.getEntry(uri, null, allowUnsized: true); + if (sourceEntry != null) { + final id = localMediaDb.nextId; + sourceEntry.id = id; + sourceEntry.path = pContext.join(recoveryPath, pContext.basename(untrackedPath)); + sourceEntry.trashed = true; + sourceEntry.trashDetails = _buildTrashDetails(id); + newEntries.add(sourceEntry); + } else { + await reportService.recordError('Failed to recover untracked bin item at uri=$uri'); + + // remove it, as it is likely not a valid media file + try { + await File(untrackedPath).delete(); + } catch (error, stack) { + await reportService.recordError('Failed to remove invalid untracked bin item at path=$untrackedPath with error=$error\n$stack'); + } + } + } + }); + } + return newEntries; + } +} diff --git a/lib/model/vaults/details.dart b/lib/model/vaults/details.dart new file mode 100644 index 0000000..f53eb3f --- /dev/null +++ b/lib/model/vaults/details.dart @@ -0,0 +1,57 @@ +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class VaultDetails extends Equatable { + final String name; + final bool autoLockScreenOff, useBin; + final VaultLockType lockType; + + @override + List<Object?> get props => [name, autoLockScreenOff, useBin, lockType]; + + const VaultDetails({ + required this.name, + required this.autoLockScreenOff, + required this.useBin, + required this.lockType, + }); + + VaultDetails copyWith({ + String? name, + }) { + return VaultDetails( + name: name ?? this.name, + autoLockScreenOff: autoLockScreenOff, + useBin: useBin, + lockType: lockType, + ); + } + + factory VaultDetails.fromMap(Map map) { + return VaultDetails( + name: map['name'] as String, + autoLockScreenOff: (map['autoLock'] as int? ?? 0) != 0, + useBin: (map['useBin'] as int? ?? 0) != 0, + lockType: VaultLockType.values.safeByName(map['lockType'] as String, VaultLockType.system), + ); + } + + Map<String, dynamic> toMap() => { + 'name': name, + 'autoLock': autoLockScreenOff ? 1 : 0, + 'useBin': useBin ? 1 : 0, + 'lockType': lockType.name, + }; + + String get passKey => 'vault_pass_$name'; + + String get path => '${androidFileUtils.vaultRoot}$name'; + + static String? nameFromPath(String path) { + return path.startsWith(androidFileUtils.vaultRoot) ? path.substring(androidFileUtils.vaultRoot.length) : null; + } +} diff --git a/lib/model/vaults/vaults.dart b/lib/model/vaults/vaults.dart new file mode 100644 index 0000000..c2bfd65 --- /dev/null +++ b/lib/model/vaults/vaults.dart @@ -0,0 +1,193 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/origins.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/vaults/details.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves_screen_state/aves_screen_state.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +final Vaults vaults = Vaults._private(); + +class Vaults extends ChangeNotifier { + final Set<StreamSubscription> _subscriptions = {}; + Set<VaultDetails> _rows = {}; + final Set<String> _unlockedDirPaths = {}; + + static const _fileScheme = 'file'; + + Vaults._private() { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); + } + + Future<void> init() async { + _rows = await localMediaDb.loadAllVaults(); + _vaultDirPaths = null; + final screenStateStream = Platform.isAndroid ? AvesScreenState().screenStateStream : null; + if (screenStateStream != null) { + _subscriptions.add(screenStateStream.where((event) => event == ScreenStateEvent.off).listen((event) => _onScreenOff())); + } + } + + @override + void dispose() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + super.dispose(); + } + + Set<VaultDetails> get all => Set.unmodifiable(_rows); + + VaultDetails? detailsForPath(String dirPath) => _rows.firstWhereOrNull((v) => v.path == dirPath); + + Future<void> create(VaultDetails details) async { + await localMediaDb.addVaults({details}); + + _rows.add(details); + _vaultDirPaths = null; + _unlockedDirPaths.add(details.path); + _onLockStateChanged(); + } + + Future<void> remove(Set<String> dirPaths) async { + final details = dirPaths.map(detailsForPath).nonNulls.toSet(); + if (details.isEmpty) return; + + await localMediaDb.removeVaults(details); + + await Future.forEach(details, (v) => securityService.writeValue(v.passKey, null)); + + _rows.removeAll(details); + _vaultDirPaths = null; + _unlockedDirPaths.removeAll(dirPaths); + _onLockStateChanged(); + } + + Future<void> rename(String oldDirPath, String newDirPath) async { + final oldDetails = detailsForPath(oldDirPath); + if (oldDetails == null) return; + + final newName = VaultDetails.nameFromPath(newDirPath); + if (newName == null) return; + + final newDetails = oldDetails.copyWith(name: newName); + await localMediaDb.updateVault(oldDetails.name, newDetails); + + final pass = await securityService.readValue(oldDetails.passKey); + if (pass != null) { + await securityService.writeValue(newDetails.passKey, pass); + } + + _rows + ..remove(oldDetails) + ..add(newDetails); + _vaultDirPaths = null; + _unlockedDirPaths + ..remove(oldDirPath) + ..add(newDirPath); + _onLockStateChanged(); + } + + // update details, except name + Future<void> update(VaultDetails newDetails) async { + final oldDetails = detailsForPath(newDetails.path); + if (oldDetails == null) return; + + await localMediaDb.updateVault(newDetails.name, newDetails); + + _rows + ..remove(oldDetails) + ..add(newDetails); + } + + Future<void> clear() async { + await localMediaDb.clearVaults(); + _rows.clear(); + _vaultDirPaths = null; + } + + Set<String>? _vaultDirPaths; + + Set<String> get vaultDirectories { + _vaultDirPaths ??= _rows.map((v) => v.path).toSet(); + return _vaultDirPaths!; + } + + VaultDetails? getVault(String? dirPath) => all.firstWhereOrNull((v) => v.path == dirPath); + + bool isVault(String dirPath) => vaultDirectories.contains(dirPath); + + bool isLocked(String dirPath) => isVault(dirPath) && !_unlockedDirPaths.contains(dirPath); + + bool isVaultEntryUri(String uriString) { + final uri = Uri.parse(uriString); + if (uri.scheme != _fileScheme) return false; + + final path = uri.pathSegments.fold('', (prev, v) => '$prev${pContext.separator}$v'); + return vaultDirectories.any(path.startsWith); + } + + void lock(Set<String> dirPaths) { + final unlocked = dirPaths.where((v) => isVault(v) && !isLocked(v)).toSet(); + if (unlocked.isEmpty) return; + + _unlockedDirPaths.removeAll(unlocked); + _onLockStateChanged(); + } + + Future<void> unlock(BuildContext context, String dirPath) async { + if (!vaults.isVault(dirPath) || !vaults.isLocked(dirPath)) return; + + // recover untracked vault items + final source = context.read<CollectionSource>(); + final newEntries = await recoverUntrackedItems(source, dirPath); + if (newEntries.isNotEmpty) { + source.addEntries(newEntries); + await localMediaDb.insertEntries(newEntries); + unawaited(source.analyze(null, entries: newEntries)); + } + + _unlockedDirPaths.add(dirPath); + _onLockStateChanged(); + } + + Future<Set<AvesEntry>> recoverUntrackedItems(CollectionSource source, String dirPath) async { + final newEntries = <AvesEntry>{}; + + final vaultName = detailsForPath(dirPath)?.name; + if (vaultName == null) return newEntries; + + final knownPaths = source.allEntries.where((v) => v.origin == EntryOrigins.vault && v.directory == dirPath).map((v) => v.path).nonNulls.toSet(); + final untrackedPaths = await storageService.getUntrackedVaultPaths(vaultName, knownPaths); + if (untrackedPaths.isNotEmpty) { + debugPrint('Recovering ${untrackedPaths.length} untracked vault items'); + await Future.forEach(untrackedPaths, (untrackedPath) async { + final uri = Uri.file(untrackedPath).toString(); + final sourceEntry = await mediaFetchService.getEntry(uri, null, allowUnsized: true); + if (sourceEntry != null) { + sourceEntry.id = localMediaDb.nextId; + sourceEntry.origin = EntryOrigins.vault; + newEntries.add(sourceEntry); + } else { + await reportService.recordError('Failed to recover untracked vault item at uri=$uri'); + } + }); + } + return newEntries; + } + + void _onScreenOff() => lock(all.where((v) => v.autoLockScreenOff).map((v) => v.path).toSet()); + + bool get needProtection => _unlockedDirPaths.isNotEmpty; + + void _onLockStateChanged() { + windowService.secureScreen(needProtection); + notifyListeners(); + } +} diff --git a/lib/model/viewer/video_playback.dart b/lib/model/viewer/video_playback.dart new file mode 100644 index 0000000..d46294e --- /dev/null +++ b/lib/model/viewer/video_playback.dart @@ -0,0 +1,27 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class VideoPlaybackRow extends Equatable { + final int entryId, resumeTimeMillis; + + @override + List<Object?> get props => [entryId, resumeTimeMillis]; + + const VideoPlaybackRow({ + required this.entryId, + required this.resumeTimeMillis, + }); + + static VideoPlaybackRow? fromMap(Map map) { + return VideoPlaybackRow( + entryId: map['id'], + resumeTimeMillis: map['resumeTimeMillis'], + ); + } + + Map<String, dynamic> toMap() => { + 'id': entryId, + 'resumeTimeMillis': resumeTimeMillis, + }; +} diff --git a/lib/model/viewer/view_state.dart b/lib/model/viewer/view_state.dart new file mode 100644 index 0000000..e703448 --- /dev/null +++ b/lib/model/viewer/view_state.dart @@ -0,0 +1,54 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/widgets.dart'; + +@immutable +class ViewState extends Equatable { + final Offset position; + final double? scale; + final Size? viewportSize, contentSize; + + static const ViewState zero = ViewState( + position: Offset.zero, + scale: 0, + viewportSize: null, + contentSize: null, + ); + + @override + List<Object?> get props => [position, scale, viewportSize, contentSize]; + + const ViewState({ + required this.position, + required this.scale, + required this.viewportSize, + required this.contentSize, + }); + + ViewState copyWith({ + Offset? position, + double? scale, + Size? viewportSize, + Size? contentSize, + }) { + return ViewState( + position: position ?? this.position, + scale: scale ?? this.scale, + viewportSize: viewportSize ?? this.viewportSize, + contentSize: contentSize ?? this.contentSize, + ); + } + + Matrix4 get matrix { + final _viewportSize = viewportSize ?? Size.zero; + final _contentSize = contentSize ?? Size.zero; + final _scale = scale ?? 1.0; + + final scaledContentSize = _contentSize * _scale; + final viewOffset = _viewportSize.center(Offset.zero) - scaledContentSize.center(Offset.zero); + + return Matrix4.identity() + ..translateByDouble(position.dx, position.dy, 0, 1) + ..translateByDouble(viewOffset.dx, viewOffset.dy, 0, 1) + ..scaleByDouble(_scale, _scale, 1, 1); + } +} diff --git a/lib/ref/brand_colors.dart b/lib/ref/brand_colors.dart new file mode 100644 index 0000000..08dc7fe --- /dev/null +++ b/lib/ref/brand_colors.dart @@ -0,0 +1,22 @@ +import 'dart:ui'; + +class BrandColors { + static const adobeAfterEffects = Color(0xFF9A9AFF); + static const adobeIllustrator = Color(0xFFFF9B00); + static const adobePhotoshop = Color(0xFF2DAAFF); + static const android = Color(0xFF3DDC84); + static const flutter = Color(0xFF47D1FD); + + static Color? get(String text) { + switch (text.toLowerCase()) { + case 'after effects': + return adobeAfterEffects; + case 'illustrator': + return adobeIllustrator; + case 'photoshop': + case 'lightroom': + return adobePhotoshop; + } + return null; + } +} diff --git a/lib/ref/bursts.dart b/lib/ref/bursts.dart new file mode 100644 index 0000000..5fe8371 --- /dev/null +++ b/lib/ref/bursts.dart @@ -0,0 +1,62 @@ +class BurstPatterns { + static const _keyGroupName = 'key'; + + static const fairphoneMotorola = r'^IMG_(?<key>\d{8}_\d{6,9})_BURST(\d+)(_COVER)?$'; + static const samsung = r'^(?<key>\d{8}_\d{6})_(\d+)$'; + static const sony = r'^DSC(PDC)?_\d+_BURST(?<key>\d{17})(_COVER)?$'; + + static final options = [ + BurstPatterns.fairphoneMotorola, + BurstPatterns.samsung, + BurstPatterns.sony, + ]; + + static String getName(String pattern) { + return switch (pattern) { + fairphoneMotorola => 'Fairphone, Motorola', + samsung => 'Samsung', + sony => 'Sony', + _ => pattern, + }; + } + + static String getExample(String pattern) { + return switch (pattern) { + fairphoneMotorola => 'IMG_20151021_072800_BURST007', + samsung => '20151021_072800_007', + sony => 'DSC_0007_BURST20151021072800123', + _ => '?', + }; + } + + static const byManufacturer = { + _Manufacturers.fairphone: fairphoneMotorola, + _Manufacturers.motorola: fairphoneMotorola, + _Manufacturers.samsung: samsung, + _Manufacturers.sony: sony, + }; + + static String? getKeyForName(String? filename, List<String> patterns) { + if (filename != null) { + for (final pattern in patterns) { + final match = RegExp(pattern).firstMatch(filename); + if (match != null) { + if (match.groupNames.contains(_keyGroupName)) { + return match.namedGroup(_keyGroupName); + } + // fallback to fetching group by index for backward compatibility + return match.group(1); + } + } + } + return null; + } +} + +// values as returned by `DeviceInfoPlugin().androidInfo` (lower-cased) +class _Manufacturers { + static const fairphone = 'fairphone'; + static const motorola = 'motorola'; + static const samsung = 'samsung'; + static const sony = 'sony'; +} diff --git a/lib/ref/languages.dart b/lib/ref/languages.dart new file mode 100644 index 0000000..a26cc98 --- /dev/null +++ b/lib/ref/languages.dart @@ -0,0 +1,403 @@ +class Language { + final String iso639_2, name; + final String? native; + + const Language({ + required this.iso639_2, + required this.name, + this.native, + }); + + // subset of ISO 639-2 codes for living languages (including macrolanguages, excluding constructed and collective ones) + // synonyms for terminology and bibliographic applications (ISO 639-2/T and ISO 639-2/B) are separate entries + // some entries have been simplified to keep only one name for one code + static const living639_2 = [ + Language(iso639_2: 'aar', name: 'Afar', native: 'Qafaraf; ’Afar Af; Afaraf; Qafar af'), + Language(iso639_2: 'abk', name: 'Abkhazian', native: 'Аҧсуа бызшәа Aƥsua bızšwa; Аҧсшәа Aƥsua'), + Language(iso639_2: 'ace', name: 'Achinese', native: 'بهسا اچيه'), + Language(iso639_2: 'ach', name: 'Acoli', native: 'Lwo'), + Language(iso639_2: 'ada', name: 'Adangme', native: 'Dangme'), + Language(iso639_2: 'ady', name: 'Adyghe; Adygei', native: 'Адыгабзэ; Кӏахыбзэ'), + Language(iso639_2: 'afr', name: 'Afrikaans', native: 'Afrikaans'), + Language(iso639_2: 'ain', name: 'Ainu', native: 'アイヌ・イタㇰ Ainu-itak'), + Language(iso639_2: 'aka', name: 'Akan', native: 'Akan'), + Language(iso639_2: 'ale', name: 'Aleut', native: 'Уна́ӈам тунуу́; Унаӈан умсуу'), + Language(iso639_2: 'alt', name: 'Southern Altai', native: 'Алтай тили'), + Language(iso639_2: 'amh', name: 'Amharic', native: 'አማርኛ Amârıñâ'), + Language(iso639_2: 'anp', name: 'Angika'), + Language(iso639_2: 'ara', name: 'Arabic', native: 'العربية'), + Language(iso639_2: 'arg', name: 'Aragonese', native: 'aragonés'), + Language(iso639_2: 'arn', name: 'Mapudungun; Mapuche'), + Language(iso639_2: 'arp', name: 'Arapaho', native: 'Hinónoʼeitíít'), + Language(iso639_2: 'arw', name: 'Arawak', native: 'Lokono'), + Language(iso639_2: 'asm', name: 'Assamese', native: 'অসমীয়া'), + Language(iso639_2: 'ast', name: 'Asturian', native: 'asturianu'), + Language(iso639_2: 'ava', name: 'Avaric', native: 'Магӏарул мацӏ; Авар мацӏ'), + Language(iso639_2: 'awa', name: 'Awadhi', native: 'अवधी'), + Language(iso639_2: 'aym', name: 'Aymara', native: 'Aymar aru'), + Language(iso639_2: 'aze', name: 'Azerbaijani', native: 'Azərbaycan dili; آذربایجان دیلی; Азәрбајҹан дили'), + Language(iso639_2: 'bak', name: 'Bashkir', native: 'Башҡорт теле; Başqort tele'), + Language(iso639_2: 'bal', name: 'Baluchi', native: 'بلوچی'), + Language(iso639_2: 'bam', name: 'Bambara', native: 'ߓߊߡߊߣߊߣߞߊߣ'), + Language(iso639_2: 'ban', name: 'Balinese', native: 'ᬪᬵᬱᬩᬮᬶ; ᬩᬲᬩᬮᬶ; Basa Bali'), + Language(iso639_2: 'bas', name: 'Basa', native: 'Mbene; Ɓasaá'), + Language(iso639_2: 'bej', name: 'Beja; Bedawiyet', native: 'Bidhaawyeet'), + Language(iso639_2: 'bel', name: 'Belarusian', native: 'Беларуская мова Belaruskaâ mova'), + Language(iso639_2: 'bem', name: 'Bemba', native: 'Chibemba'), + Language(iso639_2: 'ben', name: 'Bengali', native: 'বাংলা Bāŋlā'), + Language(iso639_2: 'bho', name: 'Bhojpuri', native: 'भोजपुरी'), + Language(iso639_2: 'bik', name: 'Bikol'), + Language(iso639_2: 'bin', name: 'Bini; Edo', native: 'Ẹ̀dó'), + Language(iso639_2: 'bis', name: 'Bislama'), + Language(iso639_2: 'bla', name: 'Siksika', native: 'ᓱᖽᐧᖿ'), + Language(iso639_2: 'bod', name: 'Tibetan', native: 'བོད་སྐད་; ལྷ་སའི་སྐད་'), + Language(iso639_2: 'tib', name: 'Tibetan', native: 'བོད་སྐད་; ལྷ་སའི་སྐད་'), + Language(iso639_2: 'bos', name: 'Bosnian', native: 'bosanski'), + Language(iso639_2: 'bra', name: 'Braj'), + Language(iso639_2: 'bre', name: 'Breton', native: 'Brezhoneg'), + Language(iso639_2: 'bua', name: 'Buriat', native: 'буряад хэлэн'), + Language(iso639_2: 'bug', name: 'Buginese', native: 'ᨅᨔ ᨕᨘᨁᨗ'), + Language(iso639_2: 'bul', name: 'Bulgarian', native: 'български'), + Language(iso639_2: 'byn', name: 'Blin; Bilin', native: 'ብሊና; ብሊን'), + Language(iso639_2: 'cad', name: 'Caddo', native: 'Hasí:nay'), + Language(iso639_2: 'car', name: 'Galibi Carib', native: 'Kari\'nja'), + Language(iso639_2: 'cat', name: 'Catalan', native: 'català'), + Language(iso639_2: 'ceb', name: 'Cebuano', native: 'Sinugbuanong Binisayâ'), + Language(iso639_2: 'ces', name: 'Czech', native: 'čeština'), + Language(iso639_2: 'cze', name: 'Czech', native: 'čeština'), + Language(iso639_2: 'cha', name: 'Chamorro', native: 'Finu\' Chamoru'), + Language(iso639_2: 'che', name: 'Chechen', native: 'Нохчийн мотт; نَاخچیین موٓتت; ნახჩიე მუოთთ'), + Language(iso639_2: 'chk', name: 'Chuukese'), + Language(iso639_2: 'chm', name: 'Mari', native: 'марий йылме'), + Language(iso639_2: 'chn', name: 'Chinook jargon', native: 'chinuk wawa; wawa; chinook lelang; lelang'), + Language(iso639_2: 'cho', name: 'Choctaw', native: 'Chahta\''), + Language(iso639_2: 'chp', name: 'Chipewyan; Dene Suline', native: 'ᑌᓀᓱᒼᕄᓀ (Dënesųłiné)'), + Language(iso639_2: 'chr', name: 'Cherokee', native: 'ᏣᎳᎩ ᎦᏬᏂᎯᏍᏗ Tsalagi gawonihisdi'), + Language(iso639_2: 'chv', name: 'Chuvash', native: 'Чӑвашла'), + Language(iso639_2: 'chy', name: 'Cheyenne', native: 'Tsėhésenėstsestȯtse'), + Language(iso639_2: 'cnr', name: 'Montenegrin', native: 'crnogorski / црногорски'), + Language(iso639_2: 'cor', name: 'Cornish', native: 'Kernowek'), + Language(iso639_2: 'cos', name: 'Corsican', native: 'Corsu; Lingua corsa'), + Language(iso639_2: 'cre', name: 'Cree'), + Language(iso639_2: 'crh', name: 'Crimean Tatar; Crimean Turkish', native: 'Къырымтатарджа; Къырымтатар тили; Ҡырымтатарҗа; Ҡырымтатар тили'), + Language(iso639_2: 'csb', name: 'Kashubian', native: 'Kaszëbsczi jãzëk'), + Language(iso639_2: 'cym', name: 'Welsh', native: 'Cymraeg; y Gymraeg'), + Language(iso639_2: 'wel', name: 'Welsh', native: 'Cymraeg; y Gymraeg'), + Language(iso639_2: 'dak', name: 'Dakota', native: 'Dakhótiyapi; Dakȟótiyapi'), + Language(iso639_2: 'dan', name: 'Danish', native: 'dansk'), + Language(iso639_2: 'dar', name: 'Dargwa', native: 'дарган мез'), + Language(iso639_2: 'del', name: 'Delaware'), + Language(iso639_2: 'den', name: 'Slave (Athapascan)', native: 'Dene K\'e'), + Language(iso639_2: 'deu', name: 'German', native: 'Deutsch'), + Language(iso639_2: 'ger', name: 'German', native: 'Deutsch'), + Language(iso639_2: 'dgr', name: 'Dogrib'), + Language(iso639_2: 'din', name: 'Dinka', native: 'Thuɔŋjäŋ'), + Language(iso639_2: 'div', name: 'Divehi; Dhivehi; Maldivian', native: 'ދިވެހި; ދިވެހިބަސް Divehi'), + Language(iso639_2: 'doi', name: 'Dogri', native: '𑠖𑠵𑠌𑠤𑠮; डोगरी; ڈوگرى'), + Language(iso639_2: 'dsb', name: 'Lower Sorbian', native: 'Dolnoserbski; Dolnoserbšćina'), + Language(iso639_2: 'dua', name: 'Duala'), + Language(iso639_2: 'dyu', name: 'Dyula', native: 'Julakan'), + Language(iso639_2: 'dzo', name: 'Dzongkha', native: 'རྫོང་ཁ་ Ĵoŋkha'), + Language(iso639_2: 'efi', name: 'Efik'), + Language(iso639_2: 'eka', name: 'Ekajuk'), + Language(iso639_2: 'ell', name: 'Greek', native: 'Ελληνικά'), + Language(iso639_2: 'gre', name: 'Greek', native: 'Ελληνικά'), + Language(iso639_2: 'eng', name: 'English', native: 'English'), + Language(iso639_2: 'est', name: 'Estonian', native: 'eesti'), + Language(iso639_2: 'eus', name: 'Basque', native: 'euskara'), + Language(iso639_2: 'baq', name: 'Basque', native: 'euskara'), + Language(iso639_2: 'ewe', name: 'Ewe', native: 'Èʋegbe'), + Language(iso639_2: 'ewo', name: 'Ewondo'), + Language(iso639_2: 'fan', name: 'Fang'), + Language(iso639_2: 'fao', name: 'Faroese', native: 'føroyskt'), + Language(iso639_2: 'fas', name: 'Persian', native: 'فارسی'), + Language(iso639_2: 'per', name: 'Persian', native: 'فارسی'), + Language(iso639_2: 'fat', name: 'Fanti', native: 'Mfantse; Fante; Fanti'), + Language(iso639_2: 'fij', name: 'Fijian', native: 'Na Vosa Vakaviti'), + Language(iso639_2: 'fil', name: 'Filipino; Pilipino', native: 'Wikang Filipino'), + Language(iso639_2: 'fin', name: 'Finnish', native: 'suomi'), + Language(iso639_2: 'fon', name: 'Fon', native: 'Fon gbè'), + Language(iso639_2: 'fra', name: 'French', native: 'français'), + Language(iso639_2: 'fre', name: 'French', native: 'français'), + Language(iso639_2: 'frr', name: 'Northern Frisian', native: 'Frasch; Fresk; Freesk; Friisk'), + Language(iso639_2: 'frs', name: 'East Frisian Low Saxon', native: 'Oostfreesk; Plattdüütsk'), + Language(iso639_2: 'fry', name: 'Western Frisian', native: 'Frysk'), + Language(iso639_2: 'ful', name: 'Fulah', native: 'Fulfulde; Pulaar; Pular'), + Language(iso639_2: 'fur', name: 'Friulian', native: 'Furlan'), + Language(iso639_2: 'gaa', name: 'Ga', native: 'Gã'), + Language(iso639_2: 'gay', name: 'Gayo', native: 'Basa Gayo'), + Language(iso639_2: 'gba', name: 'Gbaya'), + Language(iso639_2: 'gil', name: 'Gilbertese', native: 'Taetae ni Kiribati'), + Language(iso639_2: 'gla', name: 'Gaelic; Scottish Gaelic', native: 'Gàidhlig'), + Language(iso639_2: 'gle', name: 'Irish', native: 'Gaeilge'), + Language(iso639_2: 'glg', name: 'Galician', native: 'galego'), + Language(iso639_2: 'glv', name: 'Manx', native: 'Gaelg; Gailck'), + Language(iso639_2: 'gon', name: 'Gondi'), + Language(iso639_2: 'gor', name: 'Gorontalo', native: 'Bahasa Hulontalo'), + Language(iso639_2: 'grb', name: 'Grebo'), + Language(iso639_2: 'grn', name: 'Guarani', native: 'Avañe\'ẽ'), + Language(iso639_2: 'gsw', name: 'Swiss German; Alemannic; Alsatian', native: 'Schwiizerdütsch'), + Language(iso639_2: 'guj', name: 'Gujarati', native: 'ગુજરાતી Gujarātī'), + Language(iso639_2: 'gwi', name: 'Gwich\'in', native: 'Dinjii Zhu’ Ginjik'), + Language(iso639_2: 'hai', name: 'Haida', native: 'X̱aat Kíl; X̱aadas Kíl; X̱aayda Kil; Xaad kil'), + Language(iso639_2: 'hat', name: 'Haitian; Haitian Creole', native: 'kreyòl ayisyen'), + Language(iso639_2: 'hau', name: 'Hausa', native: 'Harshen Hausa; هَرْشَن'), + Language(iso639_2: 'haw', name: 'Hawaiian', native: 'ʻŌlelo Hawaiʻi'), + Language(iso639_2: 'heb', name: 'Hebrew', native: 'עברית'), + Language(iso639_2: 'her', name: 'Herero', native: 'Otjiherero'), + Language(iso639_2: 'hil', name: 'Hiligaynon', native: 'Ilonggo'), + Language(iso639_2: 'hin', name: 'Hindi', native: 'हिन्दी Hindī'), + Language(iso639_2: 'hmn', name: 'Hmong; Mong', native: 'lus Hmoob; lug Moob; lol Hmongb; 𖬇𖬰𖬞 𖬌𖬣𖬵'), + Language(iso639_2: 'hmo', name: 'Hiri Motu'), + Language(iso639_2: 'hrv', name: 'Croatian', native: 'hrvatski'), + Language(iso639_2: 'hsb', name: 'Upper Sorbian', native: 'hornjoserbšćina'), + Language(iso639_2: 'hun', name: 'Hungarian', native: 'magyar'), + Language(iso639_2: 'hup', name: 'Hupa', native: 'Na:tinixwe Mixine:whe\''), + Language(iso639_2: 'hye', name: 'Armenian', native: 'Հայերէն; Հայերեն'), + Language(iso639_2: 'arm', name: 'Armenian', native: 'Հայերէն; Հայերեն'), + Language(iso639_2: 'iba', name: 'Iban', native: 'Jaku Iban'), + Language(iso639_2: 'ibo', name: 'Igbo', native: 'Asụsụ Igbo'), + Language(iso639_2: 'iii', name: 'Sichuan Yi; Nuosu', native: 'ꆈꌠꉙ'), + Language(iso639_2: 'iku', name: 'Inuktitut', native: 'ᐃᓄᒃᑎᑐᑦ'), + Language(iso639_2: 'ilo', name: 'Iloko', native: 'Pagsasao nga Ilokano; Ilokano'), + Language(iso639_2: 'ind', name: 'Indonesian', native: 'Bahasa Indonesia'), + Language(iso639_2: 'inh', name: 'Ingush', native: 'ГӀалгӀай мотт'), + Language(iso639_2: 'ipk', name: 'Inupiaq', native: 'Iñupiaq'), + Language(iso639_2: 'isl', name: 'Icelandic', native: 'íslenska'), + Language(iso639_2: 'ice', name: 'Icelandic', native: 'íslenska'), + Language(iso639_2: 'ita', name: 'Italian', native: 'italiano'), + Language(iso639_2: 'jav', name: 'Javanese', native: 'ꦧꦱꦗꦮ / Basa Jawa'), + Language(iso639_2: 'jpn', name: 'Japanese', native: '日本語'), + Language(iso639_2: 'jpr', name: 'Judeo-Persian', native: 'Dzhidi'), + Language(iso639_2: 'jrb', name: 'Judeo-Arabic', native: 'عربية يهودية / ערבית יהודית'), + Language(iso639_2: 'kaa', name: 'Kara-Kalpak', native: 'Qaraqalpaq tili; Қарақалпақ тили'), + Language(iso639_2: 'kab', name: 'Kabyle', native: 'Tamaziɣt Taqbaylit; Tazwawt'), + Language(iso639_2: 'kac', name: 'Kachin; Jingpho', native: 'Jingpho'), + Language(iso639_2: 'kal', name: 'Kalaallisut; Greenlandic'), + Language(iso639_2: 'kam', name: 'Kamba'), + Language(iso639_2: 'kan', name: 'Kannada', native: 'ಕನ್ನಡ Kannađa'), + Language(iso639_2: 'kas', name: 'Kashmiri', native: 'कॉशुर / كأشُر'), + Language(iso639_2: 'kat', name: 'Georgian', native: 'ქართული'), + Language(iso639_2: 'geo', name: 'Georgian', native: 'ქართული'), + Language(iso639_2: 'kau', name: 'Kanuri'), + Language(iso639_2: 'kaz', name: 'Kazakh', native: 'қазақ тілі qazaq tili; қазақша qazaqşa'), + Language(iso639_2: 'kbd', name: 'Kabardian', native: 'Адыгэбзэ (Къэбэрдейбзэ) Adıgăbză (Qăbărdeĭbză)'), + Language(iso639_2: 'kha', name: 'Khasi', native: 'কা কতিয়েন খাশি'), + Language(iso639_2: 'khm', name: 'Central Khmer', native: 'ភាសាខ្មែរ Phiəsaakhmær'), + Language(iso639_2: 'kik', name: 'Kikuyu; Gikuyu', native: 'Gĩkũyũ'), + Language(iso639_2: 'kin', name: 'Kinyarwanda', native: 'Ikinyarwanda'), + Language(iso639_2: 'kir', name: 'Kirghiz; Kyrgyz', native: 'кыргызча kırgızça; кыргыз тили kırgız tili'), + Language(iso639_2: 'kmb', name: 'Kimbundu'), + Language(iso639_2: 'kok', name: 'Konkani', native: 'कोंकणी'), + Language(iso639_2: 'kom', name: 'Komi', native: 'Коми кыв'), + Language(iso639_2: 'kon', name: 'Kongo'), + Language(iso639_2: 'kor', name: 'Korean', native: '한국어'), + Language(iso639_2: 'kos', name: 'Kosraean'), + Language(iso639_2: 'kpe', name: 'Kpelle', native: 'Kpɛlɛwoo'), + Language(iso639_2: 'krc', name: 'Karachay-Balkar', native: 'Къарачай-Малкъар тил; Таулу тил'), + Language(iso639_2: 'krl', name: 'Karelian', native: 'karjal; kariela; karjala'), + Language(iso639_2: 'kru', name: 'Kurukh', native: 'कुड़ुख़'), + Language(iso639_2: 'kua', name: 'Kuanyama; Kwanyama'), + Language(iso639_2: 'kum', name: 'Kumyk', native: 'къумукъ тил/qumuq til'), + Language(iso639_2: 'kur', name: 'Kurdish', native: 'kurdî / کوردی'), + Language(iso639_2: 'kut', name: 'Kutenai'), + Language(iso639_2: 'lad', name: 'Ladino', native: 'Judeo-español'), + Language(iso639_2: 'lah', name: 'Lahnda', native: 'بھارت کا'), + Language(iso639_2: 'lam', name: 'Lamba'), + Language(iso639_2: 'lao', name: 'Lao', native: 'ພາສາລາວ Phasalaw'), + Language(iso639_2: 'lav', name: 'Latvian', native: 'latviešu'), + Language(iso639_2: 'lez', name: 'Lezghian', native: 'Лезги чӏал'), + Language(iso639_2: 'lim', name: 'Limburgan; Limburger; Limburgish', native: 'Lèmburgs'), + Language(iso639_2: 'lin', name: 'Lingala'), + Language(iso639_2: 'lit', name: 'Lithuanian', native: 'lietuvių'), + Language(iso639_2: 'lol', name: 'Mongo', native: 'Lomongo'), + Language(iso639_2: 'loz', name: 'Lozi'), + Language(iso639_2: 'ltz', name: 'Luxembourgish; Letzeburgesch', native: 'Lëtzebuergesch'), + Language(iso639_2: 'lua', name: 'Luba-Lulua', native: 'Tshiluba'), + Language(iso639_2: 'lub', name: 'Luba-Katanga', native: 'Kiluba'), + Language(iso639_2: 'lug', name: 'Ganda', native: 'Luganda'), + Language(iso639_2: 'lun', name: 'Lunda', native: 'Chilunda'), + Language(iso639_2: 'luo', name: 'Luo (Kenya and Tanzania)', native: 'Dholuo'), + Language(iso639_2: 'lus', name: 'Lushai', native: 'Mizo ṭawng'), + Language(iso639_2: 'mad', name: 'Madurese', native: 'Madhura'), + Language(iso639_2: 'mag', name: 'Magahi', native: 'मगही'), + Language(iso639_2: 'mah', name: 'Marshallese', native: 'Kajin M̧ajeļ'), + Language(iso639_2: 'mai', name: 'Maithili', native: 'मैथिली; মৈথিলী'), + Language(iso639_2: 'mak', name: 'Makasar', native: 'Basa Mangkasara\' / ᨅᨔ ᨆᨀᨔᨑ'), + Language(iso639_2: 'mal', name: 'Malayalam', native: 'മലയാളം'), + Language(iso639_2: 'man', name: 'Mandingo', native: 'Mandi\'nka kango'), + Language(iso639_2: 'mar', name: 'Marathi', native: 'मराठी Marāţhī'), + Language(iso639_2: 'mas', name: 'Masai', native: 'ɔl'), + Language(iso639_2: 'mdf', name: 'Moksha', native: 'мокшень кяль'), + Language(iso639_2: 'mdr', name: 'Mandar'), + Language(iso639_2: 'men', name: 'Mende', native: 'Mɛnde yia'), + Language(iso639_2: 'mic', name: 'Mi\'kmaq; Micmac', native: 'Míkmawísimk'), + Language(iso639_2: 'min', name: 'Minangkabau', native: 'Baso Minang'), + Language(iso639_2: 'mkd', name: 'Macedonian', native: 'македонски'), + Language(iso639_2: 'mac', name: 'Macedonian', native: 'македонски'), + Language(iso639_2: 'mlg', name: 'Malagasy'), + Language(iso639_2: 'mlt', name: 'Maltese', native: 'Malti'), + Language(iso639_2: 'mnc', name: 'Manchu', native: 'ᠮᠠᠨᠵᡠ ᡤᡳᠰᡠᠨ Manju gisun'), + Language(iso639_2: 'mni', name: 'Manipuri'), + Language(iso639_2: 'moh', name: 'Mohawk', native: 'Kanien’kéha'), + Language(iso639_2: 'mon', name: 'Mongolian', native: 'монгол хэл mongol xel; ᠮᠣᠩᠭᠣᠯ ᠬᠡᠯᠡ'), + Language(iso639_2: 'mos', name: 'Mossi', native: 'Mooré'), + Language(iso639_2: 'mri', name: 'Māori', native: 'Te Reo Māori'), + Language(iso639_2: 'mao', name: 'Māori', native: 'Te Reo Māori'), + Language(iso639_2: 'msa', name: 'Malay', native: 'Bahasa Melayu'), + Language(iso639_2: 'may', name: 'Malay', native: 'Bahasa Melayu'), + Language(iso639_2: 'mus', name: 'Creek', native: 'Mvskoke'), + Language(iso639_2: 'mwl', name: 'Mirandese', native: 'mirandés; lhéngua mirandesa'), + Language(iso639_2: 'mwr', name: 'Marwari', native: 'मारवाड़ी'), + Language(iso639_2: 'mya', name: 'Burmese', native: 'မြန်မာစာ; မြန်မာစကား'), + Language(iso639_2: 'bur', name: 'Burmese', native: 'မြန်မာစာ; မြန်မာစကား'), + Language(iso639_2: 'myv', name: 'Erzya', native: 'эрзянь кель'), + Language(iso639_2: 'nap', name: 'Neapolitan', native: 'napulitano'), + Language(iso639_2: 'nau', name: 'Nauru', native: 'dorerin Naoero'), + Language(iso639_2: 'nav', name: 'Navajo; Navaho', native: 'Diné bizaad; Naabeehó bizaad'), + Language(iso639_2: 'nbl', name: 'Ndebele, South; South Ndebele', native: 'isiNdebele seSewula'), + Language(iso639_2: 'nde', name: 'Ndebele, North; North Ndebele', native: 'siNdebele saseNyakatho'), + Language(iso639_2: 'ndo', name: 'Ndonga', native: 'ndonga'), + Language(iso639_2: 'nds', name: 'Low German; Low Saxon; German, Low; Saxon, Low', native: 'Plattdütsch; Plattdüütsch'), + Language(iso639_2: 'nep', name: 'Nepali', native: 'नेपाली भाषा Nepālī bhāśā'), + Language(iso639_2: 'new', name: 'Nepal Bhasa; Newari', native: 'नेपाल भाषा; नेवाः भाय्'), + Language(iso639_2: 'nia', name: 'Nias', native: 'Li Niha'), + Language(iso639_2: 'niu', name: 'Niuean', native: 'ko e vagahau Niuē'), + Language(iso639_2: 'nld', name: 'Dutch', native: 'Nederlands'), + Language(iso639_2: 'dut', name: 'Dutch', native: 'Nederlands'), + Language(iso639_2: 'nno', name: 'Nynorsk', native: 'nynorsk'), + Language(iso639_2: 'nob', name: 'Bokmål', native: 'bokmål'), + Language(iso639_2: 'nog', name: 'Nogai', native: 'Ногай тили'), + Language(iso639_2: 'nor', name: 'Norwegian', native: 'Norsk'), + Language(iso639_2: 'nqo', name: 'N\'Ko'), + Language(iso639_2: 'nso', name: 'Pedi; Sepedi; Northern Sotho', native: 'Sesotho sa Leboa'), + Language(iso639_2: 'nya', name: 'Chichewa; Chewa; Nyanja', native: 'Chichewa; Chinyanja'), + Language(iso639_2: 'nym', name: 'Nyamwezi'), + Language(iso639_2: 'nyn', name: 'Nyankole'), + Language(iso639_2: 'nyo', name: 'Nyoro', native: 'Runyoro'), + Language(iso639_2: 'nzi', name: 'Nzima'), + Language(iso639_2: 'oci', name: 'Occitan (post 1500)', native: 'occitan; lenga d\'òc'), + Language(iso639_2: 'oji', name: 'Ojibwa'), + Language(iso639_2: 'ori', name: 'Oriya', native: 'ଓଡ଼ିଆ'), + Language(iso639_2: 'orm', name: 'Oromo', native: 'Afaan Oromoo'), + Language(iso639_2: 'osa', name: 'Osage', native: 'Wazhazhe ie / 𐓏𐓘𐓻𐓘𐓻𐓟 𐒻𐓟'), + Language(iso639_2: 'oss', name: 'Ossetian; Ossetic', native: 'Ирон æвзаг Iron ævzag'), + Language(iso639_2: 'pag', name: 'Pangasinan', native: 'Salitan Pangasinan'), + Language(iso639_2: 'pam', name: 'Pampanga; Kapampangan', native: 'Amánung Kapampangan; Amánung Sísuan'), + Language(iso639_2: 'pan', name: 'Panjabi; Punjabi', native: 'ਪੰਜਾਬੀ / پنجابی Pãjābī'), + Language(iso639_2: 'pap', name: 'Papiamento', native: 'Papiamentu'), + Language(iso639_2: 'pau', name: 'Palauan', native: 'a tekoi er a Belau'), + Language(iso639_2: 'pol', name: 'Polish', native: 'polski'), + Language(iso639_2: 'pon', name: 'Pohnpeian'), + Language(iso639_2: 'por', name: 'Portuguese', native: 'português'), + Language(iso639_2: 'pus', name: 'Pushto; Pashto', native: 'پښتو Pax̌tow'), + Language(iso639_2: 'que', name: 'Quechua', native: 'Runa simi; kichwa simi; Nuna shimi'), + Language(iso639_2: 'raj', name: 'Rajasthani', native: 'राजस्थानी'), + Language(iso639_2: 'rap', name: 'Rapanui', native: 'Vananga rapa nui'), + Language(iso639_2: 'rar', name: 'Rarotongan; Cook Islands Māori', native: 'Māori Kūki \'Āirani'), + Language(iso639_2: 'roh', name: 'Romansh', native: 'Rumantsch; Rumàntsch; Romauntsch; Romontsch'), + Language(iso639_2: 'rom', name: 'Romany', native: 'romani čhib'), + Language(iso639_2: 'ron', name: 'Romanian', native: 'română'), + Language(iso639_2: 'rum', name: 'Romanian', native: 'română'), + Language(iso639_2: 'run', name: 'Rundi', native: 'Ikirundi'), + Language(iso639_2: 'rup', name: 'Aromanian; Arumanian; Macedo-Romanian', native: 'armãneashce; armãneashti; rrãmãneshti'), + Language(iso639_2: 'rus', name: 'Russian', native: 'русский'), + Language(iso639_2: 'sad', name: 'Sandawe', native: 'Sandaweeki'), + Language(iso639_2: 'sag', name: 'Sango', native: 'yângâ tî sängö'), + Language(iso639_2: 'sah', name: 'Yakut', native: 'Сахалыы'), + Language(iso639_2: 'sas', name: 'Sasak'), + Language(iso639_2: 'sat', name: 'Santali', native: 'ᱥᱟᱱᱛᱟᱲᱤ'), + Language(iso639_2: 'scn', name: 'Sicilian', native: 'Sicilianu'), + Language(iso639_2: 'sco', name: 'Scots', native: 'Braid Scots; Lallans'), + Language(iso639_2: 'sel', name: 'Selkup'), + Language(iso639_2: 'shn', name: 'Shan', native: 'ၵႂၢမ်းတႆးယႂ်'), + Language(iso639_2: 'sid', name: 'Sidamo', native: 'Sidaamu Afoo'), + Language(iso639_2: 'sin', name: 'Sinhala; Sinhalese', native: 'සිංහල Sĩhala'), + Language(iso639_2: 'slk', name: 'Slovak', native: 'slovenčina'), + Language(iso639_2: 'slo', name: 'Slovak', native: 'slovenčina'), + Language(iso639_2: 'slv', name: 'Slovenian', native: 'slovenščina'), + Language(iso639_2: 'sma', name: 'Southern Sami', native: 'Åarjelsaemien gïele'), + Language(iso639_2: 'sme', name: 'Northern Sami', native: 'davvisámegiella'), + Language(iso639_2: 'smj', name: 'Lule Sami', native: 'julevsámegiella'), + Language(iso639_2: 'smn', name: 'Inari Sami', native: 'anarâškielâ'), + Language(iso639_2: 'smo', name: 'Samoan', native: 'Gagana faʻa Sāmoa'), + Language(iso639_2: 'sms', name: 'Skolt Sami', native: 'sääʹmǩiõll'), + Language(iso639_2: 'sna', name: 'Shona', native: 'chiShona'), + Language(iso639_2: 'snd', name: 'Sindhi', native: 'سنڌي / सिन्धी / ਸਿੰਧੀ'), + Language(iso639_2: 'snk', name: 'Soninke', native: 'Sooninkanxanne'), + Language(iso639_2: 'som', name: 'Somali', native: 'af Soomaali'), + Language(iso639_2: 'sot', name: 'Sotho, Southern', native: 'Sesotho [southern]'), + Language(iso639_2: 'spa', name: 'Spanish', native: 'español'), + Language(iso639_2: 'sqi', name: 'Albanian', native: 'Shqip'), + Language(iso639_2: 'alb', name: 'Albanian', native: 'Shqip'), + Language(iso639_2: 'srd', name: 'Sardinian', native: 'sardu; limba sarda; lingua sarda'), + Language(iso639_2: 'srn', name: 'Sranan Tongo'), + Language(iso639_2: 'srp', name: 'Serbian', native: 'српски / srpski'), + Language(iso639_2: 'srr', name: 'Serer', native: 'Seereer'), + Language(iso639_2: 'ssw', name: 'Swati', native: 'siSwati'), + Language(iso639_2: 'suk', name: 'Sukuma', native: 'Kɪsukuma'), + Language(iso639_2: 'sun', name: 'Sundanese', native: 'ᮘᮞ ᮞᮥᮔ᮪ᮓ / Basa Sunda'), + Language(iso639_2: 'sus', name: 'Susu', native: 'Sosoxui'), + Language(iso639_2: 'swa', name: 'Swahili', native: 'Kiswahili'), + Language(iso639_2: 'swe', name: 'Swedish', native: 'svenska'), + Language(iso639_2: 'syr', name: 'Syriac', native: 'ܠܫܢܐ ܣܘܪܝܝܐ Lešānā Suryāyā'), + Language(iso639_2: 'tah', name: 'Tahitian', native: 'Reo Tahiti; Reo Mā\'ohi'), + Language(iso639_2: 'tam', name: 'Tamil', native: 'தமிழ் Tamił'), + Language(iso639_2: 'tat', name: 'Tatar', native: 'татар теле / tatar tele / تاتار'), + Language(iso639_2: 'tel', name: 'Telugu', native: 'తెలుగు Telugu'), + Language(iso639_2: 'tem', name: 'Timne', native: 'KʌThemnɛ'), + Language(iso639_2: 'ter', name: 'Tereno', native: 'Terêna'), + Language(iso639_2: 'tet', name: 'Tetum', native: 'Lia-Tetun'), + Language(iso639_2: 'tgk', name: 'Tajik', native: 'тоҷикӣ toçikī'), + Language(iso639_2: 'tgl', name: 'Tagalog', native: 'Wikang Tagalog'), + Language(iso639_2: 'tha', name: 'Thai', native: 'ไทย'), + Language(iso639_2: 'tig', name: 'Tigre', native: 'ትግረ; ትግሬ; ኻሳ; ትግራይት'), + Language(iso639_2: 'tir', name: 'Tigrinya', native: 'ትግርኛ'), + Language(iso639_2: 'tiv', name: 'Tiv'), + Language(iso639_2: 'tkl', name: 'Tokelau'), + Language(iso639_2: 'tli', name: 'Tlingit', native: 'Lingít'), + Language(iso639_2: 'tmh', name: 'Tamashek'), + Language(iso639_2: 'tog', name: 'Tonga (Nyasa)', native: 'chiTonga'), + Language(iso639_2: 'ton', name: 'Tonga (Tonga Islands)', native: 'lea faka-Tonga'), + Language(iso639_2: 'tpi', name: 'Tok Pisin'), + Language(iso639_2: 'tsi', name: 'Tsimshian'), + Language(iso639_2: 'tsn', name: 'Tswana', native: 'Setswana'), + Language(iso639_2: 'tso', name: 'Tsonga', native: 'Xitsonga'), + Language(iso639_2: 'tuk', name: 'Turkmen', native: 'Türkmençe / Түркменче / تورکمن تیلی تورکمنچ; türkmen dili / түркмен дили'), + Language(iso639_2: 'tum', name: 'Tumbuka', native: 'chiTumbuka'), + Language(iso639_2: 'tur', name: 'Turkish', native: 'Türkçe'), + Language(iso639_2: 'tvl', name: 'Tuvalu', native: 'Te Ggana Tuuvalu; Te Gagana Tuuvalu'), + Language(iso639_2: 'twi', name: 'Twi'), + Language(iso639_2: 'tyv', name: 'Tuvinian', native: 'тыва дыл'), + Language(iso639_2: 'udm', name: 'Udmurt', native: 'удмурт кыл'), + Language(iso639_2: 'uig', name: 'Uighur; Uyghur', native: 'ئۇيغۇرچە  ; ئۇيغۇر تىلى'), + Language(iso639_2: 'ukr', name: 'Ukrainian', native: 'українська'), + Language(iso639_2: 'umb', name: 'Umbundu', native: 'Úmbúndú'), + Language(iso639_2: 'urd', name: 'Urdu', native: 'اُردُو Urduw'), + Language(iso639_2: 'uzb', name: 'Uzbek', native: 'Oʻzbekcha / Ózbekça / ўзбекча / ئوزبېچه; oʻzbek tili / ўзбек тили / ئوبېک تیلی'), + Language(iso639_2: 'vai', name: 'Vai', native: 'ꕙꔤ'), + Language(iso639_2: 'ven', name: 'Venda', native: 'Tshivenḓa'), + Language(iso639_2: 'vie', name: 'Vietnamese', native: 'Tiếng Việt'), + Language(iso639_2: 'vot', name: 'Votic', native: 'vađđa ceeli'), + Language(iso639_2: 'wal', name: 'Wolaitta; Wolaytta'), + Language(iso639_2: 'war', name: 'Waray', native: 'Winaray; Samareño; Lineyte-Samarnon; Binisayâ nga Winaray; Binisayâ nga Samar-Leyte; “Binisayâ nga Waray”'), + Language(iso639_2: 'was', name: 'Washo', native: 'wá:šiw ʔítlu'), + Language(iso639_2: 'wln', name: 'Walloon', native: 'Walon'), + Language(iso639_2: 'wol', name: 'Wolof'), + Language(iso639_2: 'xal', name: 'Kalmyk; Oirat', native: 'Хальмг келн / Xaľmg keln'), + Language(iso639_2: 'xho', name: 'Xhosa', native: 'isiXhosa'), + Language(iso639_2: 'yao', name: 'Yao'), + Language(iso639_2: 'yap', name: 'Yapese'), + Language(iso639_2: 'yid', name: 'Yiddish', native: 'ייִדיש; יידיש; אידיש Yidiš'), + Language(iso639_2: 'yor', name: 'Yoruba', native: 'èdè Yorùbá'), + Language(iso639_2: 'zap', name: 'Zapotec', native: 'Diidxazá'), + Language(iso639_2: 'zen', name: 'Zenaga', native: 'Tuḍḍungiyya'), + Language(iso639_2: 'zgh', name: 'Standard Moroccan Tamazight', native: 'ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ'), + Language(iso639_2: 'zha', name: 'Zhuang; Chuang', native: 'Vahcuengh / 話僮'), + Language(iso639_2: 'zho', name: 'Chinese', native: '中文'), + Language(iso639_2: 'chi', name: 'Chinese', native: '中文'), + Language(iso639_2: 'zul', name: 'Zulu', native: 'isiZulu'), + Language(iso639_2: 'zun', name: 'Zuni', native: 'Shiwi\'ma'), + Language(iso639_2: 'zza', name: 'Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki', native: 'kirmanckî; dimilkî; kirdkî; zazakî'), + ]; +} diff --git a/lib/ref/locales.dart b/lib/ref/locales.dart new file mode 100644 index 0000000..8ceb04a --- /dev/null +++ b/lib/ref/locales.dart @@ -0,0 +1,63 @@ +import 'dart:ui'; + +const String asciiLocale = 'en_US'; + +// time components hours/minutes/seconds are always displayed in that order +const TextDirection timeComponentsDirection = TextDirection.ltr; + +// represents direction of tape being played, not direction of time +const TextDirection videoPlaybackDirection = TextDirection.ltr; + +// cf https://en.wikipedia.org/wiki/Eastern_Arabic_numerals +bool shouldUseNativeDigits(Locale? countrifiedLocale) { + switch (countrifiedLocale?.toString()) { + // Maghreb + case 'ar_DZ': // Algeria + case 'ar_EH': // Western Sahara + case 'ar_LY': // Libya + case 'ar_MA': // Morocco + case 'ar_MR': // Mauritania + case 'ar_TN': // Tunisia + return false; + // Mashriq + case 'ar_AE': // United Arab Emirates + case 'ar_BH': // Bahrain + case 'ar_EG': // Egypt + case 'ar_IQ': // Iraq + case 'ar_JO': // Jordan + case 'ar_KW': // Kuwait + case 'ar_LB': // Lebanon + case 'ar_OM': // Oman + case 'ar_PS': // Palestinian Territories + case 'ar_QA': // Qatar + case 'ar_SA': // Saudi Arabia + case 'ar_SD': // Sudan + case 'ar_SS': // South Sudan + case 'ar_SY': // Syria + case 'ar_YE': // Yemen + return true; + // Horn of Africa + case 'ar_DJ': // Djibouti + case 'ar_ER': // Eritrea + case 'ar_KM': // Comoros + case 'ar_SO': // Somalia + return true; + // others + case 'ar_IL': // Israel + case 'ar_TD': // Chad + return true; + case null: + default: + return true; + } +} + +bool canHaveLetterSpacing(String locale) { + switch (locale) { + case 'ar': + case 'fa': + return false; + default: + return true; + } +} diff --git a/lib/ref/metadata/exif.dart b/lib/ref/metadata/exif.dart new file mode 100644 index 0000000..cd3ecad --- /dev/null +++ b/lib/ref/metadata/exif.dart @@ -0,0 +1,646 @@ +class Exif { + // constants used by GPS related Exif tags + // they are locale independent + static const String latitudeNorth = 'N'; + static const String latitudeSouth = 'S'; + static const String longitudeEast = 'E'; + static const String longitudeWest = 'W'; + + static String getColorSpaceDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 1: + return 'sRGB'; + case 65535: + return 'Uncalibrated'; + default: + return 'Unknown ($value)'; + } + } + + static String getContrastDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'Normal'; + case 1: + return 'Soft'; + case 2: + return 'Hard'; + default: + return 'Unknown ($value)'; + } + } + + // adapted from `metadata-extractor` + static String getCompressionDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 1: + return 'Uncompressed'; + case 2: + return 'CCITT 1D'; + case 3: + return 'T4/Group 3 Fax'; + case 4: + return 'T6/Group 4 Fax'; + case 5: + return 'LZW'; + case 6: + return 'JPEG (old-style)'; + case 7: + return 'JPEG'; + case 8: + return 'Adobe Deflate'; + case 9: + return 'JBIG B&W'; + case 10: + return 'JBIG Color'; + case 99: + return 'JPEG'; + case 262: + return 'Kodak 262'; + case 32766: + return 'Next'; + case 32767: + return 'Sony ARW Compressed'; + case 32769: + return 'Packed RAW'; + case 32770: + return 'Samsung SRW Compressed'; + case 32771: + return 'CCIRLEW'; + case 32772: + return 'Samsung SRW Compressed 2'; + case 32773: + return 'PackBits'; + case 32809: + return 'Thunderscan'; + case 32867: + return 'Kodak KDC Compressed'; + case 32895: + return 'IT8CTPAD'; + case 32896: + return 'IT8LW'; + case 32897: + return 'IT8MP'; + case 32898: + return 'IT8BL'; + case 32908: + return 'PixarFilm'; + case 32909: + return 'PixarLog'; + case 32946: + return 'Deflate'; + case 32947: + return 'DCS'; + case 34661: + return 'JBIG'; + case 34676: + return 'SGILog'; + case 34677: + return 'SGILog24'; + case 34712: + return 'JPEG 2000'; + case 34713: + return 'Nikon NEF Compressed'; + case 34715: + return 'JBIG2 TIFF FX'; + case 34718: + return 'Microsoft Document Imaging (MDI) Binary Level Codec'; + case 34719: + return 'Microsoft Document Imaging (MDI) Progressive Transform Codec'; + case 34720: + return 'Microsoft Document Imaging (MDI) Vector'; + case 34892: + return 'Lossy JPEG'; + case 65000: + return 'Kodak DCR Compressed'; + case 65535: + return 'Pentax PEF Compressed'; + default: + return 'Unknown ($value)'; + } + } + + static String getCustomRenderedDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'Normal process'; + case 1: + return 'Custom process'; + default: + return 'Unknown ($value)'; + } + } + + static String getExifVersionDescription(String valueString) { + if (valueString.length == 4) { + final major = int.tryParse(valueString.substring(0, 2)); + final minor = int.tryParse(valueString.substring(2, 4)); + if (major != null && minor != null) { + return '$major.$minor'; + } + } + return valueString; + } + + static String getExposureModeDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'Auto exposure'; + case 1: + return 'Manual exposure'; + case 2: + return 'Auto bracket'; + default: + return 'Unknown ($value)'; + } + } + + static String getExposureProgramDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 1: + return 'Manual'; + case 2: + return 'Normal program'; + case 3: + return 'Aperture priority'; + case 4: + return 'Shutter priority'; + case 5: + return 'Creative program'; + case 6: + return 'Action program'; + case 7: + return 'Portrait mode'; + case 8: + return 'Landscape mode'; + default: + return 'Unknown ($value)'; + } + } + + // adapted from `metadata-extractor` + static String getFileSourceDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 1: + return 'Film Scanner'; + case 2: + return 'Reflection Print Scanner'; + case 3: + return 'Digital Still Camera (DSC)'; + default: + return 'Unknown ($value)'; + } + } + + static String getLightSourceDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'Unknown'; + case 1: + return 'Daylight'; + case 2: + return 'Fluorescent'; + case 3: + return 'Tungsten (Incandescent)'; + case 4: + return 'Flash'; + case 9: + return 'Fine Weather'; + case 10: + return 'Cloudy Weather'; + case 11: + return 'Shade'; + case 12: + return 'Daylight Fluorescent (D 5700 – 7100K)'; + case 13: + return 'Day White Fluorescent (N 4600 – 5400K)'; + case 14: + return 'Cool White Fluorescent (W 3900 – 4500K)'; + case 15: + return 'White Fluorescent (WW 3200 – 3700K)'; + case 16: + return 'Warm White Fluorescent (WW 2600 - 3250K)'; + case 17: + return 'Standard light A'; + case 18: + return 'Standard light B'; + case 19: + return 'Standard light C'; + case 20: + return 'D55'; + case 21: + return 'D65'; + case 22: + return 'D75'; + case 23: + return 'D50'; + case 24: + return 'ISO Studio Tungsten'; + case 255: + return 'Other'; + default: + return 'Unknown ($value)'; + } + } + + // adapted from `metadata-extractor` + static String getOrientationDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 1: + return 'Top, left side (Horizontal / normal)'; + case 2: + return 'Top, right side (Mirror horizontal)'; + case 3: + return 'Bottom, right side (Rotate 180)'; + case 4: + return 'Bottom, left side (Mirror vertical)'; + case 5: + return 'Left side, top (Mirror horizontal and rotate 270 CW)'; + case 6: + return 'Right side, top (Rotate 90 CW)'; + case 7: + return 'Right side, bottom (Mirror horizontal and rotate 90 CW)'; + case 8: + return 'Left side, bottom (Rotate 270 CW)'; + default: + return 'Unknown ($value)'; + } + } + + // adapted from `metadata-extractor` + static String getPhotometricInterpretationDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'WhiteIsZero'; + case 1: + return 'BlackIsZero'; + case 2: + return 'RGB'; + case 3: + return 'RGB Palette'; + case 4: + return 'Transparency Mask'; + case 5: + return 'CMYK'; + case 6: + return 'YCbCr'; + case 8: + return 'CIELab'; + case 9: + return 'ICCLab'; + case 10: + return 'ITULab'; + case 32803: + return 'Color Filter Array'; + case 32844: + return 'Pixar LogL'; + case 32845: + return 'Pixar LogLuv'; + case 32892: + return 'Linear Raw'; + default: + return 'Unknown ($value)'; + } + } + + // adapted from `metadata-extractor` + static String getPlanarConfigurationDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 1: + return 'Chunky (contiguous for each subsampling pixel)'; + case 2: + return 'Separate (Y-plane/Cb-plane/Cr-plane format)'; + default: + return 'Unknown ($value)'; + } + } + + // adapted from `metadata-extractor` + static String getResolutionUnitDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 1: + return '(No unit)'; + case 2: + return 'Inch'; + case 3: + return 'cm'; + default: + return 'Unknown ($value)'; + } + } + + static String getGainControlDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'None'; + case 1: + return 'Low gain up'; + case 2: + return 'High gain up'; + case 3: + return 'Low gain down'; + case 4: + return 'High gain down'; + default: + return 'Unknown ($value)'; + } + } + + static String getMeteringModeDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'Unknown'; + case 1: + return 'Average'; + case 2: + return 'Center weighted average'; + case 3: + return 'Spot'; + case 4: + return 'Multi-spot'; + case 5: + return 'Pattern'; + case 6: + return 'Partial'; + case 255: + return 'Other'; + default: + return 'Unknown ($value)'; + } + } + + static String getSaturationDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'Normal'; + case 1: + return 'Low saturation'; + case 2: + return 'High saturation'; + default: + return 'Unknown ($value)'; + } + } + + static String getSceneCaptureTypeDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'Standard'; + case 1: + return 'Landscape'; + case 2: + return 'Portrait'; + case 3: + return 'Night scene'; + default: + return 'Unknown ($value)'; + } + } + + static String getSceneTypeDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 1: + return 'Directly photographed image'; + default: + return 'Unknown ($value)'; + } + } + + static String getSensingMethodDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 1: + return 'Not defined'; + case 2: + return 'One-chip colour area sensor'; + case 3: + return 'Two-chip colour area sensor'; + case 4: + return 'Three-chip colour area sensor'; + case 5: + return 'Colour sequential area sensor'; + case 7: + return 'Trilinear sensor'; + case 8: + return 'Colour sequential linear sensor'; + default: + return 'Unknown ($value)'; + } + } + + static String getSharpnessDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'Normal'; + case 1: + return 'Soft'; + case 2: + return 'Hard'; + default: + return 'Unknown ($value)'; + } + } + + static String getSubjectDistanceRangeDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'Unknown'; + case 1: + return 'Macro'; + case 2: + return 'Close view'; + case 3: + return 'Distant view'; + default: + return 'Unknown ($value)'; + } + } + + static String getWhiteBalanceDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'Auto'; + case 1: + return 'Manual'; + default: + return 'Unknown ($value)'; + } + } + + static String getYCbCrPositioningDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 1: + return 'Centered'; + case 2: + return 'Co-sited'; + default: + return 'Unknown ($value)'; + } + } + + // Flash + + static String getFlashModeDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'Unknown'; + case 1: + return 'Compulsory flash firing'; + case 2: + return 'Compulsory flash suppression'; + case 3: + return 'Auto mode'; + default: + return 'Unknown ($value)'; + } + } + + static String getFlashReturnDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'No strobe return detection'; + case 2: + return 'Strobe return light not detected'; + case 3: + return 'Strobe return light detected'; + default: + return 'Unknown ($value)'; + } + } + + // GPS + + static String getGPSAltitudeRefDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'Above sea level'; + case 1: + return 'Below sea level'; + default: + return 'Unknown ($value)'; + } + } + + static String getGPSDifferentialDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'Without correction'; + case 1: + return 'Correction applied'; + default: + return 'Unknown ($value)'; + } + } + + static String getGPSDirectionRefDescription(String value) { + switch (value) { + case 'T': + return 'True direction'; + case 'M': + return 'Magnetic direction'; + default: + return 'Unknown ($value)'; + } + } + + static String getGPSMeasureModeDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 2: + return 'Two-dimensional measurement'; + case 3: + return 'Three-dimensional measurement'; + default: + return 'Unknown ($value)'; + } + } + + static String getGPSDestDistanceRefDescription(String value) { + switch (value) { + case 'K': + return 'kilometers'; + case 'M': + return 'miles'; + case 'N': + return 'knots'; + default: + return 'Unknown ($value)'; + } + } + + static String getGPSSpeedRefDescription(String value) { + switch (value) { + case 'K': + return 'kilometers per hour'; + case 'M': + return 'miles per hour'; + case 'N': + return 'knots'; + default: + return 'Unknown ($value)'; + } + } + + static String getGPSStatusDescription(String value) { + switch (value) { + case 'A': + return 'Measurement in progress'; + case 'V': + return 'Measurement is interoperability'; + default: + return 'Unknown ($value)'; + } + } +} diff --git a/lib/ref/metadata/geotiff.dart b/lib/ref/metadata/geotiff.dart new file mode 100644 index 0000000..d8c5dec --- /dev/null +++ b/lib/ref/metadata/geotiff.dart @@ -0,0 +1,29 @@ +class GeoTiffExifTags { + static const int modelPixelScale = 0x830e; + static const int modelTiePoints = 0x8482; + static const int modelTransformation = 0x85d8; + static const int geoKeyDirectory = 0x87af; + static const int geoDoubleParams = 0x87b0; + static const int geoAsciiParams = 0x87b1; +} + +class GeoTiffKeys { + static const int modelType = 0x0400; + static const int rasterType = 0x0401; + static const int geographicType = 0x0800; + static const int geogGeodeticDatum = 0x0802; + static const int geogAngularUnits = 0x0806; + static const int geogEllipsoid = 0x0808; + static const int projCSType = 0x0c00; + static const int projection = 0x0c02; + static const int projCoordinateTransform = 0x0c03; + static const int projLinearUnits = 0x0c04; + static const int verticalUnits = 0x1003; +} + +class GeoTiffUnits { + static const int linearMeter = 9001; + static const int linearFootUSSurvey = 9003; + + double footUSSurveyToMeter(double input) => input * 1200 / 3937; +} diff --git a/lib/ref/metadata/iptc.dart b/lib/ref/metadata/iptc.dart new file mode 100644 index 0000000..5ef584d --- /dev/null +++ b/lib/ref/metadata/iptc.dart @@ -0,0 +1,8 @@ +class IPTC { + static const int applicationRecord = 2; + + // ApplicationRecord tags + static const int objectName = 5; + static const int keywordsTag = 25; + static const int captionAbstractTag = 120; +} diff --git a/lib/ref/metadata/xmp.dart b/lib/ref/metadata/xmp.dart new file mode 100644 index 0000000..311d7a4 --- /dev/null +++ b/lib/ref/metadata/xmp.dart @@ -0,0 +1,114 @@ +class XmpNamespaces { + static const acdsee = 'http://ns.acdsee.com/iptc/1.0/'; + static const adsmlat = 'http://adsml.org/xmlns/'; + static const appleDepthData = 'http://ns.apple.com/depthData/1.0/'; + static const appleDesktop = 'http://ns.apple.com/namespace/1.0/'; + static const appleHDRGainMap = 'http://ns.apple.com/HDRGainMap/1.0/'; + static const applePixelDataInfo = 'http://ns.apple.com/pixeldatainfo/1.0/'; + static const avm = 'http://www.communicatingastronomy.org/avm/1.0/'; + static const camera = 'http://pix4d.com/camera/1.0/'; + static const cc = 'http://creativecommons.org/ns#'; + static const creatorAtom = 'http://ns.adobe.com/creatorAtom/1.0/'; + static const crd = 'http://ns.adobe.com/camera-raw-defaults/1.0/'; + static const crlcp = 'http://ns.adobe.com/camera-raw-embedded-lens-profile/1.0/'; + static const crs = 'http://ns.adobe.com/camera-raw-settings/1.0/'; + static const crss = 'http://ns.adobe.com/camera-raw-saved-settings/1.0/'; + static const darktable = 'http://darktable.sf.net/'; + static const dc = 'http://purl.org/dc/elements/1.1/'; + static const dcterms = 'http://purl.org/dc/terms/'; + static const dicom = 'http://ns.adobe.com/DICOM/'; + static const digiKam = 'http://www.digikam.org/ns/1.0/'; + static const droneDji = 'http://www.dji.com/drone-dji/1.0/'; + static const dwc = 'http://rs.tdwg.org/dwc/index.htm'; + static const dwciri = 'http://rs.tdwg.org/dwc/iri/'; + static const exif = 'http://ns.adobe.com/exif/1.0/'; + static const exifAux = 'http://ns.adobe.com/exif/1.0/aux/'; + static const exifEx = 'http://cipa.jp/exif/1.0/'; + static const fstop = 'http://www.fstopapp.com/xmp/'; + static const gAudio = 'http://ns.google.com/photos/1.0/audio/'; + static const gCamera = 'http://ns.google.com/photos/1.0/camera/'; + static const gContainer = 'http://ns.google.com/photos/1.0/container/'; + static const gContainerItem = 'http://ns.google.com/photos/1.0/container/item/'; + static const gCreations = 'http://ns.google.com/photos/1.0/creations/'; + static const gDepth = 'http://ns.google.com/photos/1.0/depthmap/'; + static const gDevice = 'http://ns.google.com/photos/dd/1.0/device/'; + static const gDeviceCamera = 'http://ns.google.com/photos/dd/1.0/camera/'; + static const gDeviceContainer = 'http://ns.google.com/photos/dd/1.0/container/'; + static const gDeviceItem = 'http://ns.google.com/photos/dd/1.0/item/'; + static const gFocus = 'http://ns.google.com/photos/1.0/focus/'; + static const gImage = 'http://ns.google.com/photos/1.0/image/'; + static const gPano = 'http://ns.google.com/photos/1.0/panorama/'; + static const gPhotoScan = 'http://ns.google.com/photos/1.0/photoscan/'; + static const gSpherical = 'http://ns.google.com/videos/1.0/spherical/'; + static const gettyImagesGift = 'http://xmp.gettyimages.com/gift/1.0/'; + static const gimp210 = 'http://www.gimp.org/ns/2.10/'; + static const gimpXmp = 'http://www.gimp.org/xmp/'; + static const hdrgm = 'http://ns.adobe.com/hdr-gain-map/1.0/'; + static const illustrator = 'http://ns.adobe.com/illustrator/1.0/'; + static const iptc4xmpCore = 'http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/'; + static const iptc4xmpExt = 'http://iptc.org/std/Iptc4xmpExt/2008-02-29/'; + static const lr = 'http://ns.adobe.com/lightroom/1.0/'; + static const mediapro = 'http://ns.iview-multimedia.com/mediapro/1.0/'; + static const miCamera = 'http://ns.xiaomi.com/photos/1.0/camera/'; + + // also seen in the wild for prefix `MicrosoftPhoto`: 'http://ns.microsoft.com/photo/1.0' + static const microsoftPhoto = 'http://ns.microsoft.com/photo/1.0/'; + static const mp1 = 'http://ns.microsoft.com/photo/1.1'; + static const mp = 'http://ns.microsoft.com/photo/1.2/'; + static const mpri = 'http://ns.microsoft.com/photo/1.2/t/RegionInfo#'; + static const mpreg = 'http://ns.microsoft.com/photo/1.2/t/Region#'; + static const mwgrs = 'http://www.metadataworkinggroup.com/schemas/regions/'; + static const nga = 'https://standards.nga.gov/metadata/media/image/artobject/1.0'; + static const opMedia = 'http://ns.oneplus.com/media/1.0/'; + static const panorama = 'http://ns.adobe.com/photoshop/1.0/panorama-profile'; + static const panoStudio = 'http://www.tshsoft.com/xmlns'; + static const pdf = 'http://ns.adobe.com/pdf/1.3/'; + static const pdfX = 'http://ns.adobe.com/pdfx/1.3/'; + static const photoMechanic = 'http://ns.camerabits.com/photomechanic/1.0/'; + static const photoshop = 'http://ns.adobe.com/photoshop/1.0/'; + static const plus = 'http://ns.useplus.org/ldf/xmp/1.0/'; + static const pmtm = 'http://www.hdrsoft.com/photomatix_settings01'; + static const rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; + static const stCamera = 'http://ns.adobe.com/photoshop/1.0/camera-profile'; + static const stEvt = 'http://ns.adobe.com/xap/1.0/sType/ResourceEvent#'; + static const stRef = 'http://ns.adobe.com/xap/1.0/sType/ResourceRef#'; + static const tiff = 'http://ns.adobe.com/tiff/1.0/'; + static const x = 'adobe:ns:meta/'; + static const xmp = 'http://ns.adobe.com/xap/1.0/'; + static const xmpBJ = 'http://ns.adobe.com/xap/1.0/bj/'; + static const xmpDM = 'http://ns.adobe.com/xmp/1.0/DynamicMedia/'; + static const xmpGImg = 'http://ns.adobe.com/xap/1.0/g/img/'; + static const xmpMM = 'http://ns.adobe.com/xap/1.0/mm/'; + static const xmpNote = 'http://ns.adobe.com/xmp/note/'; + static const xmpRights = 'http://ns.adobe.com/xap/1.0/rights/'; + static const xmpTPg = 'http://ns.adobe.com/xap/1.0/t/pg/'; + static const xperiaCamera = 'http://xmlns.sony.net/xperia/camera/1.0/'; +} + +class XmpElements { + static const xXmpmeta = 'xmpmeta'; + static const rdfRoot = 'RDF'; + static const rdfDescription = 'Description'; + static const containerDirectory = 'Directory'; + static const dcDescription = 'description'; + static const dcSubject = 'subject'; + static const dcTitle = 'title'; + static const msPhotoRating = 'Rating'; + static const xmpRating = 'Rating'; +} + +class XmpAttributes { + static const xXmptk = 'xmptk'; + static const rdfAbout = 'about'; + static const gCameraMicroVideo = 'MicroVideo'; + static const gCameraMicroVideoVersion = 'MicroVideoVersion'; + static const gCameraMicroVideoOffset = 'MicroVideoOffset'; + static const gCameraMicroVideoPresentationTimestampUs = 'MicroVideoPresentationTimestampUs'; + static const gCameraMotionPhoto = 'MotionPhoto'; + static const gCameraMotionPhotoVersion = 'MotionPhotoVersion'; + static const gCameraMotionPhotoPresentationTimestampUs = 'MotionPhotoPresentationTimestampUs'; + static const xmpCreateDate = 'CreateDate'; + static const xmpMetadataDate = 'MetadataDate'; + static const xmpModifyDate = 'ModifyDate'; + static const xmpNoteHasExtendedXMP = 'HasExtendedXMP'; +} diff --git a/lib/ref/mime_types.dart b/lib/ref/mime_types.dart new file mode 100644 index 0000000..edeb8ef --- /dev/null +++ b/lib/ref/mime_types.dart @@ -0,0 +1,174 @@ +class MimeTypes { + static const anyImage = 'image/*'; + + // supported + static const avif = 'image/avif'; + static const bmp = 'image/bmp'; + static const bmpX = 'image/x-ms-bmp'; + static const gif = 'image/gif'; + static const heic = 'image/heic'; + static const heif = 'image/heif'; + static const ico = 'image/ico'; + static const icoX = 'image/x-icon'; + static const jpeg = 'image/jpeg'; + static const png = 'image/png'; + static const svg = 'image/svg+xml'; + static const tiff = 'image/tiff'; + static const webp = 'image/webp'; + static const wbmp = 'image/vnd.wap.wbmp'; + + // unsupported + static const art = 'image/x-jg'; + static const cdr = 'image/x-coreldraw'; + static const cdrt = 'image/x-coreldrawtemplate'; + static const cpt = 'image/x-corelphotopaint'; + static const djvu = 'image/vnd.djvu'; + static const dwg = 'image/vnd.dwg'; + static const dxf = 'image/vnd.dxf'; + static const jpeg2000 = 'image/jp2'; + static const jpx = 'image/jpx'; + static const jxl = 'image/jxl'; + static const pat = 'image/x-coreldrawpattern'; + static const pcx = 'image/x-pcx'; + static const pnm = 'image/x-portable-anymap'; + static const ppm = 'image/x-portable-pixmap'; + static const psdVnd = 'image/vnd.adobe.photoshop'; + static const psdX = 'image/x-photoshop'; + static const rgbe = 'image/vnd.radiance'; + static const tap = 'image/vnd.tencent.tap'; + static const vtf = 'image/vnd.valve.source.texture'; + static const wmf = 'image/wmf'; + + // RAW + static const arw = 'image/x-sony-arw'; + static const cr2 = 'image/x-canon-cr2'; + static const crw = 'image/x-canon-crw'; + static const dcr = 'image/x-kodak-dcr'; + static const dcraw = 'image/x-dcraw'; + static const dng = 'image/dng'; + static const dngX = 'image/x-adobe-dng'; + static const erf = 'image/x-epson-erf'; + static const k25 = 'image/x-kodak-k25'; + static const kdc = 'image/x-kodak-kdc'; + static const mrw = 'image/x-minolta-mrw'; + static const nef = 'image/x-nikon-nef'; + static const nrw = 'image/x-nikon-nrw'; + static const orf = 'image/x-olympus-orf'; + static const pef = 'image/x-pentax-pef'; + static const raf = 'image/x-fuji-raf'; + static const raw = 'image/x-panasonic-raw'; + static const rw2 = 'image/x-panasonic-rw2'; + static const sr2 = 'image/x-sony-sr2'; + static const srf = 'image/x-sony-srf'; + static const srw = 'image/x-samsung-srw'; + static const x3f = 'image/x-sigma-x3f'; + + static const anyVideo = 'video/*'; + + static const v3gpp = 'video/3gpp'; + static const asf = 'video/x-ms-asf'; + static const avi = 'video/avi'; + static const aviMSVideo = 'video/msvideo'; + static const aviVnd = 'video/vnd.avi'; + static const aviXMSVideo = 'video/x-msvideo'; + static const dl = 'video/dl'; + static const dv = 'video/dv'; + static const dvd = 'video/dvd'; + static const flic = 'video/fli'; + static const flv = 'video/flv'; + static const flvX = 'video/x-flv'; + static const gl = 'video/gl'; + static const lsf = 'x-la-asf'; + static const mkv = 'video/mkv'; + static const mkvX = 'video/x-matroska'; + static const mov = 'video/quicktime'; + static const movX = 'video/x-quicktime'; + static const mp2p = 'video/mp2p'; + static const mp2t = 'video/mp2t'; // .m2ts, .ts + static const mp2ts = 'video/mp2ts'; // .ts (prefer `mp2t` when possible) + static const mp4 = 'video/mp4'; + static const mpeg = 'video/mpeg'; + static const ogv = 'video/ogg'; + static const realVideo = 'video/x-pn-realvideo'; + static const webm = 'video/webm'; + static const wmv = 'video/x-ms-wmv'; + + // non-media + static const csv = 'text/csv'; + static const json = 'application/json'; + static const octetStream = 'application/octet-stream'; + static const plainText = 'text/plain'; + static const sqlite3 = 'application/vnd.sqlite3'; + static const zip = 'application/zip'; + + // groups + + // formats that support transparency + static const Set<String> alphaImages = {avif, bmp, bmpX, gif, heic, heif, ico, icoX, png, svg, tiff, webp}; + + static const Set<String> rawImages = {arw, cr2, crw, dcr, dcraw, dng, dngX, erf, k25, kdc, mrw, nef, nrw, orf, pef, raf, raw, rw2, sr2, srf, srw, x3f}; + + static const Set<String> developedRawImages = {jpeg, heic, heif}; + + static bool canHaveAlpha(String mimeType) => MimeTypes.alphaImages.contains(mimeType); + + static bool isRaw(String mimeType) => MimeTypes.rawImages.contains(mimeType); + + static bool isImage(String mimeType) => mimeType.startsWith('image'); + + static bool isVideo(String mimeType) => mimeType.startsWith('video'); + + static bool isVisual(String mimeType) => isImage(mimeType) || isVideo(mimeType); + + static String normalize(String mimeType) { + switch (mimeType) { + case avi: + case aviMSVideo: + case aviVnd: + case aviXMSVideo: + return avi; + case bmp: + case bmpX: + return bmp; + case flv: + case flvX: + return flv; + case heic: + case heif: + return heic; + case mov: + case movX: + return mov; + case psdVnd: + case psdX: + return psdVnd; + default: + return mimeType; + } + } + + static bool refersToSameType(String a, b) => normalize(a) == normalize(b); + + static String? forExtension(String extension) { + switch (extension) { + case '.jpg': + return jpeg; + case '.svg': + return svg; + } + return null; + } + + static const Map<String, String> _defaultExtensions = { + bmp: '.bmp', + csv: '.csv', + gif: '.gif', + jpeg: '.jpg', + json: '.json', + png: '.png', + svg: '.svg', + webp: '.webp', + }; + + static String? extensionFor(String mimeType) => _defaultExtensions[mimeType]; +} diff --git a/lib/ref/mp4.dart b/lib/ref/mp4.dart new file mode 100644 index 0000000..572157a --- /dev/null +++ b/lib/ref/mp4.dart @@ -0,0 +1,88 @@ +class Mp4 { + // adapted from `metadata-extractor` + static final brands = <String, String>{ + '3g2a': '3GPP2 Media compliant with 3GPP2 C.S0050-0 V1.0', + '3g2b': '3GPP2 Media compliant with 3GPP2 C.S0050-A V1.0.0', + '3g2c': '3GPP2 Media compliant with 3GPP2 C.S0050-B v1.0', + '3ge6': '3GPP Release 6 MBMS Extended Presentations', + '3ge7': '3GPP Release 7 MBMS Extended Presentations', + '3gg6': '3GPP Release 6 General Profile', + '3gp1': '3GPP Media Release 1', + '3gp2': '3GPP Media Release 2', + '3gp3': '3GPP Media Release 3', + '3gp4': '3GPP Media Release 4', + '3gp5': '3GPP Media Release 5', + '3gp6': '3GPP Media Release 6', + '3gs7': '3GPP Media Release 7', + 'avc1': 'MP4 Base w/ AVC ext', + 'CAEP': 'Canon Digital Camera', + 'caqv': 'Casio Digital Camera', + 'CDes': 'Convergent Design', + 'da0a': 'DMB MAF w/ MPEG Layer II aud, MOT slides, DLS, JPG/PNG/MNG images', + 'da0b': 'DMB MAF, extending DA0A, with 3GPP timed text, DID, TVA, REL, IPMP', + 'da1a': 'DMB MAF audio with ER-BSAC audio, JPG/PNG/MNG images', + 'da1b': 'DMB MAF, extending da1a, with 3GPP timed text, DID, TVA, REL, IPMP', + 'da2a': 'DMB MAF aud w/ HE-AAC v2 aud, MOT slides, DLS, JPG/PNG/MNG images', + 'da2b': 'DMB MAF, extending da2a, with 3GPP timed text, DID, TVA, REL, IPMP', + 'da3a': 'DMB MAF aud with HE-AAC aud, JPG/PNG/MNG images', + 'da3b': 'DMB MAF, extending da3a w/ BIFS, 3GPP timed text, DID, TVA, REL, IPMP', + 'dmb1': 'DMB MAF supporting all the components defined in the specification', + 'dmpf': 'Digital Media Project', + 'drc1': 'Dirac (wavelet compression), encapsulated in ISO base media (MP4)', + 'dv1a': 'DMB MAF vid w/ AVC vid, ER-BSAC aud, BIFS, JPG/PNG/MNG images, TS', + 'dv1b': 'DMB MAF, extending dv1a, with 3GPP timed text, DID, TVA, REL, IPMP', + 'dv2a': 'DMB MAF vid w/ AVC vid, HE-AAC v2 aud, BIFS, JPG/PNG/MNG images, TS', + 'dv2b': 'DMB MAF, extending dv2a, with 3GPP timed text, DID, TVA, REL, IPMP', + 'dv3a': 'DMB MAF vid w/ AVC vid, HE-AAC aud, BIFS, JPG/PNG/MNG images, TS', + 'dv3b': 'DMB MAF, extending dv3a, with 3GPP timed text, DID, TVA, REL, IPMP', + 'dvr1': 'DVB over RTP', + 'dvt1': 'DVB over MPEG-2 Transport Stream', + 'F4V ': 'Video for Adobe Flash Player 9+', + 'F4P ': 'Protected Video for Adobe Flash Player 9+', + 'F4A ': 'Audio for Adobe Flash Player 9+', + 'F4B ': 'Audio Book for Adobe Flash Player 9+', + 'isc2': 'ISMACryp 2.0 Encrypted File', + 'iso2': 'MP4 Base Media v2', + 'isom': 'MP4 Base Media v1', + 'JP2 ': 'JPEG 2000 Image', + 'jpm ': 'JPEG 2000 Compound Image', + 'jpx ': 'JPEG 2000 w/ extensions', + 'KDDI': '3GPP2 EZmovie for KDDI 3G cellphones', + 'M4A ': 'Apple iTunes AAC-LC Audio', + 'M4B ': 'Apple iTunes AAC-LC Audio Book', + 'M4P ': 'Apple iTunes AAC-LC AES Protected Audio', + 'M4V ': 'Apple iTunes Video', + 'M4VH': 'Apple TV', + 'M4VP': 'Apple iPhone', + 'mj2s': 'Motion JPEG 2000 Simple Profile', + 'mjp2': 'Motion JPEG 2000 General Profile', + 'mmp4': 'MPEG-4/3GPP Mobile Profile', + 'mp21': 'MPEG-21', + 'mp41': 'MP4 v1', + 'mp42': 'MP4 v2', + 'mp71': 'MP4 w/ MPEG-7 Metadata', + 'MPPI': 'Photo Player, MAF', + 'mqt ': 'Sony / Mobile QuickTime', + 'MSNV': 'MPEG-4 for SonyPSP', + 'NDAS': 'MP4 v2 Nero Digital AAC Audio', + 'NDSC': 'MPEG-4 Nero Cinema Profile', + 'NDSH': 'MPEG-4 Nero HDTV Profile', + 'NDSM': 'MPEG-4 Nero Mobile Profile', + 'NDSP': 'MPEG-4 Nero Portable Profile', + 'NDSS': 'MPEG-4 Nero Standard Profile', + 'NDXC': 'H.264/MPEG-4 AVC Nero Cinema Profile', + 'NDXH': 'H.264/MPEG-4 AVC Nero HDTV Profile', + 'NDXM': 'H.264/MPEG-4 AVC Nero Mobile Profile', + 'NDXP': 'H.264/MPEG-4 AVC Nero Portable Profile', + 'NDXS': 'H.264/MPEG-4 AVC Nero Standard Profile', + 'odcf': 'OMA DCF DRM Format 2.0', + 'opf2': 'OMA PDCF DRM Format 2.1', + 'opx2': 'OMA PDCF DRM + XBS extensions', + 'pana': 'Panasonic Digital Camera', + 'qt ': 'Apple QuickTime', + 'ROSS': 'Ross Video', + 'sdv ': 'SD Memory Card Video', + 'ssc1': 'Samsung stereoscopic, single stream', + 'ssc2': 'Samsung stereoscopic, dual stream', + }; +} diff --git a/lib/ref/poi.dart b/lib/ref/poi.dart new file mode 100644 index 0000000..1b7b3ee --- /dev/null +++ b/lib/ref/poi.dart @@ -0,0 +1,15 @@ +import 'package:latlong2/latlong.dart'; + +class PointsOfInterest { + static const pointNemo = LatLng(-48.876667, -123.393333); + + static const wonders = [ + LatLng(29.979167, 31.134167), + LatLng(36.451000, 28.223615), + LatLng(32.5355, 44.4275), + LatLng(31.213889, 29.885556), + LatLng(37.0379, 27.4241), + LatLng(37.637861, 21.63), + LatLng(37.949722, 27.363889), + ]; +} diff --git a/lib/ref/unicode.dart b/lib/ref/unicode.dart new file mode 100644 index 0000000..4da540a --- /dev/null +++ b/lib/ref/unicode.dart @@ -0,0 +1,311 @@ +// cf Flutter's `foundation/unicode.dart` for bidi related characters +class UniChars { + static const noBreakSpace = '\u00A0'; + static const multiplicationSign = '\u00D7'; // × + static const emDash = '\u2014'; // — + static const bullet = '\u2022'; // • + static const ratio = '\u2236'; // ∶ + static const whiteMediumStar = '\u2B50'; // ⭐ +} + +class UniCodes { + // Block: Basic Latin + static const latinCapitalLetterA = 0x0041; + + // Block: Enclosed Alphanumeric Supplement + static const regionalIndicatorSymbolLetterA = 0x1F1E6; + + // Block: Miscellaneous Symbols and Pictographs + static const wavingBlackFlag = 0x1F3F4; + + // Block: Tags + static const tagLatinSmallLetterA = 0xE0061; + static const cancelTag = 0xE007F; +} + +class EmojiStateCodes { + // AU + static const auAustralianCapitalTerritory = 'auact'; + static const auNewSouthWales = 'aunsw'; + static const auNorthernTerritory = 'aunt'; + static const auQueensland = 'auqld'; + static const auSouthAustralia = 'ausa'; + static const auTasmania = 'autas'; + static const auVictoria = 'auvic'; + static const auWesternAustralia = 'auwa'; + + static const aus = { + auAustralianCapitalTerritory, + auNewSouthWales, + auNorthernTerritory, + auQueensland, + auSouthAustralia, + auTasmania, + auVictoria, + auWesternAustralia, + }; + + // GB + static const gbEngland = 'gbeng'; + static const gbNorthernIreland = 'gbnir'; + static const gbScotland = 'gbsct'; + static const gbWales = 'gbwls'; + + static const gbr = { + gbEngland, + gbNorthernIreland, + gbScotland, + gbWales, + }; + + // IN + static const inAndamanAndNicobarIslands = 'inan'; + static const inAndhraPradesh = 'inap'; + static const inArunachalPradesh = 'inar'; + static const inAssam = 'inas'; + static const inBihar = 'inbr'; + static const inChandigarh = 'inch'; + static const inChhattisgarh = 'inct'; + static const inDamanAndDiu = 'indd'; + static const inDelhi = 'indl'; + static const inDadraAndNagarHaveli = 'indn'; + static const inGoa = 'inga'; + static const inGujarat = 'ingj'; + static const inHimachalPradesh = 'inhp'; + static const inHaryana = 'inhr'; + static const inJharkhand = 'injh'; + static const inJammuAndKashmir = 'injk'; + static const inKarnataka = 'inka'; + static const inKerala = 'inkl'; + static const inLakshadweep = 'inld'; + static const inMaharashtra = 'inmh'; + static const inMeghalaya = 'inml'; + static const inManipur = 'inmn'; + static const inMadhyaPradesh = 'inmp'; + static const inMizoram = 'inmz'; + static const inNagaland = 'innl'; + static const inOdisha = 'inor'; + static const inPunjab = 'inpb'; + static const inPuducherry = 'inpy'; + static const inRajasthan = 'inrj'; + static const inSikkim = 'insk'; + static const inTelangana = 'intg'; + static const inTamilNadu = 'intn'; + static const inTripura = 'intr'; + static const inUttarPradesh = 'inup'; + static const inUttarakhand = 'inut'; + static const inWestBengal = 'inwb'; + + static const ind = { + inAndamanAndNicobarIslands, + inAndhraPradesh, + inArunachalPradesh, + inAssam, + inBihar, + inChandigarh, + inChhattisgarh, + inDamanAndDiu, + inDelhi, + inDadraAndNagarHaveli, + inGoa, + inGujarat, + inHimachalPradesh, + inHaryana, + inJharkhand, + inJammuAndKashmir, + inKarnataka, + inKerala, + inLakshadweep, + inMaharashtra, + inMeghalaya, + inManipur, + inMadhyaPradesh, + inMizoram, + inNagaland, + inOdisha, + inPunjab, + inPuducherry, + inRajasthan, + inSikkim, + inTelangana, + inTamilNadu, + inTripura, + inUttarPradesh, + inUttarakhand, + inWestBengal, + }; + + // MX + static const mxAguascalientes = 'mxagu'; + static const mxBajaCalifornia = 'mxbcn'; + static const mxBajaCaliforniaSur = 'mxbcs'; + static const mxCampeche = 'mxcam'; + static const mxChiapas = 'mxchp'; + static const mxChihuahua = 'mxchh'; + static const mxCiudadDeMexico = 'mxcmx'; + static const mxCoahuila = 'mxcoa'; + static const mxColima = 'mxcol'; + static const mxDurango = 'mxdur'; + static const mxGuanajuato = 'mxgua'; + static const mxGuerrero = 'mxgro'; + static const mxHidalgo = 'mxhid'; + static const mxJalisco = 'mxjal'; + static const mxMexicoState = 'mxmex'; + static const mxMichoacan = 'mxmic'; + static const mxMorelos = 'mxmor'; + static const mxNayarit = 'mxnay'; + static const mxNuevoLeon = 'mxnle'; + static const mxOaxaca = 'mxoax'; + static const mxPuebla = 'mxpue'; + static const mxQueretaro = 'mxque'; + static const mxQuintanaRoo = 'mxroo'; + static const mxSanLuisPotosi = 'mxslp'; + static const mxSinaloa = 'mxsin'; + static const mxSonora = 'mxson'; + static const mxTabasco = 'mxtab'; + static const mxTamaulipas = 'mxtam'; + static const mxTlaxcala = 'mxtla'; + static const mxVeracruz = 'mxver'; + static const mxYucatan = 'mxyuc'; + static const mxZacatecas = 'mxzac'; + + static const mex = { + mxAguascalientes, + mxBajaCalifornia, + mxBajaCaliforniaSur, + mxCampeche, + mxChiapas, + mxChihuahua, + mxCiudadDeMexico, + mxCoahuila, + mxColima, + mxDurango, + mxGuanajuato, + mxGuerrero, + mxHidalgo, + mxJalisco, + mxMexicoState, + mxMichoacan, + mxMorelos, + mxNayarit, + mxNuevoLeon, + mxOaxaca, + mxPuebla, + mxQueretaro, + mxQuintanaRoo, + mxSanLuisPotosi, + mxSinaloa, + mxSonora, + mxTabasco, + mxTamaulipas, + mxTlaxcala, + mxVeracruz, + mxYucatan, + mxZacatecas, + }; + + // US + static const usAlabama = 'usal'; + static const usAlaska = 'usak'; + static const usArizona = 'usaz'; + static const usArkansas = 'usar'; + static const usCalifornia = 'usca'; + static const usColorado = 'usco'; + static const usConnecticut = 'usct'; + static const usDelaware = 'usde'; + static const usFlorida = 'usfl'; + static const usGeorgia = 'usga'; + static const usHawaii = 'ushi'; + static const usIdaho = 'usid'; + static const usIllinois = 'usil'; + static const usIndiana = 'usin'; + static const usIowa = 'usia'; + static const usKansas = 'usks'; + static const usKentucky = 'usky'; + static const usLouisiana = 'usla'; + static const usMaine = 'usme'; + static const usMaryland = 'usmd'; + static const usMassachusetts = 'usma'; + static const usMichigan = 'usmi'; + static const usMinnesota = 'usmn'; + static const usMississippi = 'usms'; + static const usMissouri = 'usmo'; + static const usMontana = 'usmt'; + static const usNebraska = 'usne'; + static const usNevada = 'usnv'; + static const usNewHampshire = 'usnh'; + static const usNewJersey = 'usnj'; + static const usNewMexico = 'usnm'; + static const usNewYork = 'usny'; + static const usNorthCarolina = 'usnc'; + static const usNorthDakota = 'usnd'; + static const usOhio = 'usoh'; + static const usOklahoma = 'usok'; + static const usOregon = 'usor'; + static const usPennsylvania = 'uspa'; + static const usRhodeIsland = 'usri'; + static const usSouthCarolina = 'ussc'; + static const usSouthDakota = 'ussd'; + static const usTennessee = 'ustn'; + static const usUtah = 'usut'; + static const usVermont = 'usvt'; + static const usVirginia = 'usva'; + static const usWashington = 'uswa'; + static const usWashingtonDC = 'usdc'; + static const usWestVirginia = 'uswv'; + static const usWisconsin = 'uswi'; + static const usWyoming = 'uswy'; + + static const usa = { + usAlabama, + usAlaska, + usArizona, + usArkansas, + usCalifornia, + usColorado, + usConnecticut, + usDelaware, + usFlorida, + usGeorgia, + usHawaii, + usIdaho, + usIllinois, + usIndiana, + usIowa, + usKansas, + usKentucky, + usLouisiana, + usMaine, + usMaryland, + usMassachusetts, + usMichigan, + usMinnesota, + usMississippi, + usMissouri, + usMontana, + usNebraska, + usNevada, + usNewHampshire, + usNewJersey, + usNewMexico, + usNewYork, + usNorthCarolina, + usNorthDakota, + usOhio, + usOklahoma, + usOregon, + usPennsylvania, + usRhodeIsland, + usSouthCarolina, + usSouthDakota, + usTennessee, + usUtah, + usVermont, + usVirginia, + usWashington, + usWashingtonDC, + usWestVirginia, + usWisconsin, + usWyoming, + }; +} diff --git a/lib/ref/upnp.dart b/lib/ref/upnp.dart new file mode 100644 index 0000000..c6ee033 --- /dev/null +++ b/lib/ref/upnp.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; + +class Upnp { + static const String upnpDeviceTypeMediaRenderer = 'urn:schemas-upnp-org:device:MediaRenderer:1'; + static const String upnpServiceTypeConnectionManager = 'urn:schemas-upnp-org:service:ConnectionManager:1'; + + static String getProtocolInfoActionXml() { + return '''<?xml version='1.0' encoding='utf-8' standalone='yes' ?> +<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> + <s:Body> + <u:GetProtocolInfo xmlns:u="urn:schemas-upnp-org:service:ConnectionManager:1"> + <InstanceID>0</InstanceID> + </u:GetProtocolInfo> + </s:Body> +</s:Envelope>'''; + } +} + +class UpnpProtocolInfo { + late final Set<UpnpProtocolInfoEntry> entries; + + UpnpProtocolInfo(String text) { + entries = text.split(',').where((v) => v.isNotEmpty).map(UpnpProtocolInfoEntry.new).toSet(); + } +} + +@immutable +class UpnpProtocolInfoEntry { + late final String protocol, network, contentFormat, additionalInfo; + + UpnpProtocolInfoEntry(String text) { + final parts = text.split(':'); + protocol = parts[0]; + network = parts[1]; + contentFormat = parts[2]; + additionalInfo = parts[3]; + } +} diff --git a/lib/remote/auth_client.dart b/lib/remote/auth_client.dart new file mode 100644 index 0000000..0e071a8 --- /dev/null +++ b/lib/remote/auth_client.dart @@ -0,0 +1,96 @@ +// lib/remote/auth_client.dart +import 'dart:convert'; +import 'package:http/http.dart' as http; + +/// Gestisce autenticazione remota e caching del Bearer token. +/// - [baseUrl]: URL base del server (con o senza '/') +/// - [email]/[password]: credenziali +/// - [loginPath]: path dell'endpoint di login (default 'auth/login') +/// - [timeout]: timeout per le richieste (default 20s) +class RemoteAuth { + final Uri base; + final String email; + final String password; + final String loginPath; + final Duration timeout; + + String? _token; + + RemoteAuth({ + required String baseUrl, + required this.email, + required this.password, + this.loginPath = 'auth/login', + this.timeout = const Duration(seconds: 20), + }) : base = Uri.parse(baseUrl.endsWith('/') ? baseUrl : '$baseUrl/'); + + Uri get _loginUri => base.resolve(loginPath); + + /// Esegue il login e memorizza il token. + /// Lancia eccezione con messaggio chiaro in caso di errore HTTP, rete o JSON. + Future<String> login() async { + final uri = _loginUri; + final headers = {'Content-Type': 'application/json'}; + final bodyStr = json.encode({'email': email, 'password': password}); + + http.Response res; + try { + res = await http + .post(uri, headers: headers, body: bodyStr) + .timeout(timeout); + } catch (e) { + throw Exception('Login fallito: errore di rete verso $uri: $e'); + } + + // Follow esplicito per redirect POST moderni (307/308) mantenendo metodo e body + if ({307, 308}.contains(res.statusCode) && res.headers['location'] != null) { + final redirectUri = uri.resolve(res.headers['location']!); + try { + res = await http + .post(redirectUri, headers: headers, body: bodyStr) + .timeout(timeout); + } catch (e) { + throw Exception('Login fallito: errore di rete verso $redirectUri: $e'); + } + } + + if (res.statusCode != 200) { + final snippet = utf8.decode(res.bodyBytes.take(200).toList()); + throw Exception( + 'Login fallito: HTTP ${res.statusCode} ${res.reasonPhrase} – $snippet', + ); + } + + // Parsing JSON robusto + Map<String, dynamic> map; + try { + map = json.decode(utf8.decode(res.bodyBytes)) as Map<String, dynamic>; + } catch (_) { + throw Exception('Login fallito: risposta non è un JSON valido'); + } + + // Supporto sia 'token' sia 'access_token' + final token = (map['token'] ?? map['access_token']) as String?; + if (token == null || token.isEmpty) { + throw Exception('Login fallito: token assente nella risposta'); + } + + _token = token; + return token; + } + + /// Ritorna gli header con Bearer; se non hai token, esegue login. + Future<Map<String, String>> authHeaders() async { + _token ??= await login(); + return {'Authorization': 'Bearer $_token'}; + } + + /// Forza il rinnovo del token (es. dopo 401) e ritorna i nuovi header. + Future<Map<String, String>> refreshAndHeaders() async { + _token = null; + return await authHeaders(); + } + + /// Accesso in sola lettura al token corrente (può essere null). + String? get token => _token; +} \ No newline at end of file diff --git a/lib/remote/collection_source_remote_ext.dart b/lib/remote/collection_source_remote_ext.dart new file mode 100644 index 0000000..766cbb9 --- /dev/null +++ b/lib/remote/collection_source_remote_ext.dart @@ -0,0 +1,58 @@ +// lib/remote/collection_source_remote_ext.dart +// +// Versione riscritta, semplice e stabile. +// Nessuna cache remota, nessun diff complicato. +// Aggiunge sempre i remoti dal DB alla Collection. +// Compatibile con il tuo remote_controller attuale. + +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/events.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:flutter/foundation.dart'; + +import 'remote_origin.dart'; +import 'package:aves/remote/remote_sync_bus.dart'; + +extension CollectionSourceRemoteExt on CollectionSource { + // ============================================================ + // CARICAMENTO REMOTI DAL DB (VERSIONE SEMPLICE) + // ============================================================ + + Future<void> appendRemoteEntriesFromDb() async { + try { + // 1) carica tutte le entry remote dal DB + final remotiDb = await localMediaDb.loadEntries(origin: RemoteOrigin.value); + + if (remotiDb.isEmpty) { + debugPrint('[remote-append] nessun remoto nel DB'); + return; + } + + // 2) tieni solo quelli non cestinati + final visibili = remotiDb.where((e) => !e.trashed).toSet(); + if (visibili.isEmpty) { + debugPrint('[remote-append] tutti remoti cestinati → nessun add'); + return; + } + + // 3) aggiungi alla Collection (merge automatico) + addEntries(visibili); + + // 4) notifica la UI + eventBus.fire(EntryAddedEvent(visibili)); + + debugPrint('[remote-append] aggiunti=${visibili.length}'); + } catch (e, st) { + debugPrint('[remote-append] errore: $e\n$st'); + } + } +} + +/// Visibilità dei remoti (usata da CollectionLens) +extension RemoteVisibilityExt on CollectionSource { + bool get remoteVisible { + final state = RemoteSyncBus.instance.stateNotifier.value; + return state == RemoteSyncState.syncing || + state == RemoteSyncState.upToDate; + } +} diff --git a/lib/remote/collection_source_remote_ws_ext.dart b/lib/remote/collection_source_remote_ws_ext.dart new file mode 100644 index 0000000..9bb16d5 --- /dev/null +++ b/lib/remote/collection_source_remote_ws_ext.dart @@ -0,0 +1,14 @@ +// lib/remote/collection_source_remote_ws_ext.dart + +import 'package:aves/model/source/collection_source.dart'; +import 'remote_ws_client.dart'; +import 'remote_services.dart'; // dove tieni l'istanza globale del WS client + +extension CollectionSourceRemoteWsExt on CollectionSource { + RemoteWsClient? get remoteWsClient => RemoteServices.wsClient; + + // ⭐ aggiungi questo + set remoteWsClient(RemoteWsClient? client) { + RemoteServices.wsClient = client; + } +} diff --git a/lib/remote/remote_added_queue.dart b/lib/remote/remote_added_queue.dart new file mode 100644 index 0000000..8546498 --- /dev/null +++ b/lib/remote/remote_added_queue.dart @@ -0,0 +1,142 @@ +// lib/remote/remote_added_queue.dart +// +// Queue per gestire eventi "added" dal WS: +// - dedupe (dinamico) per evitare dipendenze da file mancanti +// - batching byIds (batchSize) +// - debounce flush (debounce) +// - fallback a progressiveSync se burst troppo grande (tooManyThreshold) +// - upsert massivo delegato a RemoteSyncEngine.upsertRemoteEntries +// - notifica UI tramite onUiRefresh (debounced lato UI) + +import 'dart:async'; +import 'package:flutter/foundation.dart'; + +import 'remote_http_api.dart'; +import 'remote_sync_engine.dart'; +// per SyncManager.instance se serve + +class RemoteAddedQueue { + RemoteAddedQueue({ + required this.api, + required this.engine, + required this.deduper, + required this.onUiRefresh, + this.batchSize = 200, + this.tooManyThreshold = 1200, + this.debounce = const Duration(milliseconds: 250), + }); + + final RemoteHttpApi api; + final RemoteSyncEngine engine; + final dynamic deduper; // dynamic per compatibilità con diverse implementazioni + final VoidCallback onUiRefresh; + final int batchSize; + final int tooManyThreshold; + final Duration debounce; + + final List<String> _queue = []; + final Set<String> _set = {}; + Timer? _timer; + bool _flushing = false; + bool _disposed = false; + + /// opzionale init se serve (es. caricare stato persistente) + Future<void> init() async { + // placeholder: se vuoi ripristinare queue persistente, fallo qui + return; + } + + void enqueue(String? id) { + if (_disposed) return; + if (id == null) return; + final sid = id.toString(); + if (_set.contains(sid)) return; + + // se deduper ha has, evita duplicati già processati + try { + if (deduper != null && (deduper.has as dynamic) != null) { + final already = (deduper.has as dynamic)(sid); + if (already == true) return; + } + } catch (_) {} + + _set.add(sid); + _queue.add(sid); + + // se burst troppo grande -> fallback a progressiveSync + if (_queue.length >= tooManyThreshold) { + debugPrint('[remote][addedQueue] TOO_MANY_THRESHOLD reached (${_queue.length}) -> fallback progressiveSync'); + _timer?.cancel(); + _timer = null; + _queue.clear(); + _set.clear(); + unawaited(engine.progressiveSync()); + return; + } + + _timer ??= Timer(debounce, () { + _timer = null; + unawaited(_flush()); + }); + } + + Future<void> _flush() async { + if (_disposed) return; + if (_flushing) return; + if (_queue.isEmpty) return; + + _flushing = true; + try { + // prendi chunk + final chunk = <String>[]; + final take = _queue.length < batchSize ? _queue.length : batchSize; + for (var i = 0; i < take; i++) { + chunk.add(_queue.removeAt(0)); + } + chunk.forEach(_set.remove); + + if (chunk.isEmpty) return; + + debugPrint('[remote][addedQueue] flushing chunk size=${chunk.length}'); + + // fetch by ids + final items = await api.getPhotosByIds(chunk); + if (items.isNotEmpty) { + // delega all'engine: centralizza upsert + creazione folders + append + // engine.upsertRemoteEntries accetta sia Map che RemotePhotoItem (dynamic) + await engine.upsertRemoteEntries(items); + } + + // Non tentiamo di leggere event_id come Map: il payload può essere RemotePhotoItem. + // Se vuoi markare event_id, fallo dove il server fornisce esplicitamente event_id. + + // refresh UI una sola volta per batch (debounced lato UI) + try { + onUiRefresh(); + } catch (e, st) { + debugPrint('[remote][addedQueue] onUiRefresh error: $e\n$st'); + } + + // se ci sono ancora elementi, schedule immediato per continuare + if (_queue.isNotEmpty) { + Future.microtask(_flush); + } + } catch (e, st) { + debugPrint('[remote][addedQueue] flush error: $e\n$st'); + // svuota e fallback a progressiveSync + _queue.clear(); + _set.clear(); + await engine.progressiveSync(); + } finally { + _flushing = false; + } + } + + Future<void> dispose() async { + _disposed = true; + _timer?.cancel(); + _timer = null; + _queue.clear(); + _set.clear(); + } +} diff --git a/lib/remote/remote_client.dart b/lib/remote/remote_client.dart new file mode 100644 index 0000000..9d208b5 --- /dev/null +++ b/lib/remote/remote_client.dart @@ -0,0 +1,117 @@ +// lib/remote/remote_client.dart +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'package:http/http.dart' as http; + +import 'remote_models.dart'; +import 'auth_client.dart'; + +class RemoteJsonClient { + final Uri indexUri; + final RemoteAuth? auth; + + RemoteJsonClient( + String baseUrl, + String indexPath, { + this.auth, + }) : indexUri = Uri.parse( + baseUrl.endsWith('/') ? baseUrl : '$baseUrl/', + ).resolve(indexPath); + + // 🔥 PING SUPER LEGGERO → usa /ping + Future<void> ping() async { + final client = HttpClient(); + client.connectionTimeout = const Duration(seconds: 2); + + // Costruisce l’URL /ping a partire dalla baseUrl + final pingUri = Uri.parse('${indexUri.origin}/ping'); + + try { + final req = await client.getUrl(pingUri); + req.followRedirects = false; + + final res = await req.close().timeout(const Duration(seconds: 2)); + + print('[remote-client] PING url=$pingUri status=${res.statusCode}'); + + // 5xx → errore server + if (res.statusCode >= 500) { + throw HttpException('HTTP ${res.statusCode}', uri: pingUri); + } + + // 200, 401, 403, 404 → server raggiungibile + } on TimeoutException { + throw TimeoutException('Ping timeout'); + } on SocketException catch (e) { + throw SocketException('Network error: ${e.message}'); + } on HttpException { + rethrow; + } catch (e) { + rethrow; + } finally { + client.close(); + } + } + + // FETCH ALL (come prima) + Future<List<RemotePhotoItem>> fetchAll() async { + Map<String, String> headers = {}; + if (auth != null) { + headers = await auth!.authHeaders(); + } + + print('[remote-client] GET $indexUri'); + + http.Response res; + try { + res = await http + .get(indexUri, headers: headers) + .timeout(const Duration(seconds: 20)); + } catch (e) { + throw Exception('Errore rete su $indexUri: $e'); + } + + if (res.statusCode == 401 && auth != null) { + headers = await auth!.refreshAndHeaders(); + res = await http + .get(indexUri, headers: headers) + .timeout(const Duration(seconds: 20)); + } + + if ({301, 302, 307, 308}.contains(res.statusCode) && + res.headers['location'] != null) { + final loc = res.headers['location']!; + final redirectUri = indexUri.resolve(loc); + res = await http + .get(redirectUri, headers: headers) + .timeout(const Duration(seconds: 20)); + } + + if (res.statusCode != 200) { + final snippet = utf8.decode(res.bodyBytes.take(200).toList()); + throw HttpException( + 'HTTP ${res.statusCode} ${res.reasonPhrase}. Body: $snippet', + uri: indexUri, + ); + } + + final body = utf8.decode(res.bodyBytes); + final dynamic decoded = json.decode(body); + + if (decoded is! List) { + throw Exception( + 'JSON inatteso: atteso array top-level, ricevuto ${decoded.runtimeType}', + ); + } + + final rawList = decoded; + + return rawList.map<RemotePhotoItem>((e) { + if (e is! Map<String, dynamic>) { + throw Exception('Elemento JSON non è una mappa: ${e.runtimeType} -> $e'); + } + return RemotePhotoItem.fromJson(e); + }).toList(); + } +} diff --git a/lib/remote/remote_controller.dart b/lib/remote/remote_controller.dart new file mode 100644 index 0000000..8993432 --- /dev/null +++ b/lib/remote/remote_controller.dart @@ -0,0 +1,689 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/events.dart'; + +import 'package:aves/remote/remote_settings.dart'; +import 'package:aves/remote/remote_sync_bus.dart'; +import 'package:aves/remote/remote_repository.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/remote/remote_client.dart'; +import 'package:aves/remote/auth_client.dart'; +import 'package:aves/remote/collection_source_remote_ext.dart'; +import 'package:aves/remote/collection_source_remote_ws_ext.dart'; + +import 'remote_origin.dart'; +import 'remote_http_api.dart'; +import 'remote_sync_engine.dart'; +import 'remote_state_store.dart'; +import 'remote_ws_client.dart'; +import 'remote_http.dart'; +import 'remote_added_queue.dart'; + + +class RemoteController { + RemoteController._(); + static final RemoteController instance = RemoteController._(); + + static const _kBootstrapDone = 'remote_bootstrap_done'; + + bool _syncInFlight = false; + + DateTime? _retryStartTime; + Timer? _retryTimer; + + RemoteAuth? _auth; + RemoteHttpApi? _api; + RemoteSyncEngine? _engine; + RemoteWsClient? _ws; + RemoteStateStore? _stateStore; + RemoteAddedQueue? _addedQueue; + EventRingDeduper? _deduper; + + Future<void>? _ensureStackFuture; + bool _wsConnectInFlight = false; + + // coalescing progressive + Timer? _progressiveTimer; + bool _progressiveScheduled = false; + String? _pendingSinceIso; + + // ------------------------------------------------------------ + // helper: forza refresh lens quando cambia remoteVisible + // ------------------------------------------------------------ + void _notifyRemoteVisibilityChanged(CollectionSource source) { + try { + source.eventBus.fire(const FilterVisibilityChangedEvent()); + } catch (_) { + // ignore + } + } + + // refresh “forte” (la lens ascolta EntryRefreshedEvent e fa refresh()) + void _forceCollectionRefresh(CollectionSource source) { + try { + source.eventBus.fire(const EntryRefreshedEvent(<AvesEntry>{})); + } catch (_) { + // ignore + } + } + + // ------------------------------------------------------------ + // bootstrap flag + // ------------------------------------------------------------ + Future<bool> bootstrapDone() async { + const storage = FlutterSecureStorage(); + return (await storage.read(key: _kBootstrapDone)) == '1'; + } + + Future<void> _setBootstrapDone() async { + const storage = FlutterSecureStorage(); + await storage.write(key: _kBootstrapDone, value: '1'); + } + + // ------------------------------------------------------------ + // init bus (usata da HomePage init) + // ------------------------------------------------------------ + Future<void> initBusFromSettings() async { + final s = await RemoteSettings.load(); + if (!s.enabled) { + RemoteSyncBus.instance.setDisabled(); + return; + } + RemoteSyncBus.instance.stateNotifier.value = RemoteSyncState.syncing; + RemoteSyncBus.instance.progressNotifier.value = const RemoteSyncProgress( + done: 0, + total: 0, + showOverlay: false, + ); + } + + // ------------------------------------------------------------ + // ws url + // ------------------------------------------------------------ + String _deriveWsUrl(String baseUrl) { + final uri = Uri.parse(baseUrl); + final scheme = uri.scheme == 'http' ? 'ws' : 'wss'; + final parts = uri.host.split('.'); + if (parts.isEmpty) return '$scheme://${uri.host}'; + parts[0] = '${parts[0]}-ws'; + return '$scheme://${parts.join('.')}'; + } + + String _resolveWsUrl(RemoteSettings s) => + s.wsUrl.trim().isNotEmpty ? s.wsUrl.trim() : _deriveWsUrl(s.baseUrl); + + // ------------------------------------------------------------ + // ensure stack single-flight + // ------------------------------------------------------------ + Future<void> _ensureRealtimeStack(CollectionSource source) { + final existing = _ensureStackFuture; + if (existing != null) return existing; + + final fut = _ensureRealtimeStackImpl(source); + _ensureStackFuture = fut; + return fut.whenComplete(() { + if (identical(_ensureStackFuture, fut)) _ensureStackFuture = null; + }); + } + +Future<void> _ensureRealtimeStackImpl(CollectionSource source) async { + final s = await RemoteSettings.load(); + + _stateStore ??= RemoteStateStore(); + _deduper ??= EventRingDeduper(_stateStore!); + + final wsUrl = _resolveWsUrl(s); + + final rebuildAuth = + _auth == null || + _auth!.email != s.email || + _auth!.password != s.password || + _auth!.base.toString() != (s.baseUrl.endsWith('/') ? s.baseUrl : '${s.baseUrl}/'); + + final rebuildWs = _ws == null || _ws!.wsUrl != wsUrl; + +if (rebuildAuth || rebuildWs) { + _auth = RemoteAuth(baseUrl: s.baseUrl, email: s.email, password: s.password); + + // allinea RemoteHttp (thumbs) allo stesso auth/token + RemoteHttp.attach(baseUrl: s.baseUrl, auth: _auth!); + await RemoteHttp.warmUp(); + + _api = RemoteHttpApi(baseUrl: s.baseUrl, auth: _auth!); + + _engine = RemoteSyncEngine( + api: _api!, + repo: RemoteRepository(localMediaDb.rawDb), + source: source, + state: _stateStore!, + ); + + // chiudi eventuale ws precedente + _ws?.close(); // ignore: unawaited_futures + + // crea la queue per batch di "added" con deduper e callback UI debounced + final addedQueue = RemoteAddedQueue( + api: _api!, + engine: _engine!, + deduper: _deduper!, + onUiRefresh: () => _forceCollectionRefresh(source), + ); + + // dichiariamo la variabile prima per poterla referenziare nelle closure + late RemoteWsClient wsClient; + + wsClient = RemoteWsClient( + wsUrl: wsUrl, + store: _stateStore!, + deduper: _deduper!, + // quando il server richiede recovery, esegui la progressive sync (con UI/Bus) e poi invia recovery_done + onNeedRecoverySync: () async { + try { + await _runProgressiveSync(source); + } finally { + // notifica al WS client che la recovery è completata + wsClient.notifyRecoveryCompleted(); + } + }, + // delega gli altri eventi al controller (bulk, del, updated, ecc.) + onEvent: (msg) => _handleWsEvent(source, msg), + ); + + // registra la queue nel client WS + wsClient.setAddedQueue(addedQueue); + + // salva la queue e il client nello stato del controller + _addedQueue = addedQueue; + _ws = wsClient; + source.remoteWsClient = wsClient; + + // opzionale: inizializza la queue se ha init/async setup + try { + await _addedQueue?.init(); + } catch (_) { + // ignore init errors, queue funzionerà comunque + } +} else { + await _deduper!.init(); +} + + +} + + // ------------------------------------------------------------ + // progressive coalescing + // ------------------------------------------------------------ + void _requestProgressiveSync({ + required CollectionSource source, + String? sinceIso, + Duration delay = const Duration(milliseconds: 600), + }) { + if (sinceIso != null && sinceIso.trim().isNotEmpty) { + _pendingSinceIso = _minIso(_pendingSinceIso, sinceIso.trim()); + } + + if (_progressiveScheduled) return; + _progressiveScheduled = true; + + _progressiveTimer?.cancel(); + _progressiveTimer = Timer(delay, () async { + _progressiveScheduled = false; + final since = _pendingSinceIso; + _pendingSinceIso = null; + + try { + await _runProgressiveSync(source, since: since); + } catch (_) {} + }); + } + + String? _minIso(String? a, String b) { + if (a == null || a.isEmpty) return b; + final da = DateTime.tryParse(a); + final db = DateTime.tryParse(b); + if (da == null) return b; + if (db == null) return a; + return db.isBefore(da) ? b : a; + } + + // ------------------------------------------------------------ + // PATCH 1: progressive NON deve far tornare arancione se eri già verde + // ------------------------------------------------------------ + Future<void> _runProgressiveSync(CollectionSource source, {String? since}) async { + await _ensureRealtimeStack(source); + final engine = _engine; + if (engine == null) return; + + final prev = RemoteSyncBus.instance.stateNotifier.value; + + // ✅ Se eri già "verde", non flashare l’icona su "syncing" + final bool keepGreen = prev == RemoteSyncState.upToDate; + + int? opId; + if (!keepGreen) { + opId = RemoteSyncBus.instance.start(total: 0, showOverlay: false); + _notifyRemoteVisibilityChanged(source); + } + + try { + if (since != null && since.trim().isNotEmpty) { + await engine.progressiveSyncFrom(since.trim()); + } else { + await engine.progressiveSync(); + } + + if (opId != null) { + RemoteSyncBus.instance.finishUpToDate(opId: opId); + _notifyRemoteVisibilityChanged(source); + } else { + // resta verde + RemoteSyncBus.instance.stateNotifier.value = RemoteSyncState.upToDate; + RemoteSyncBus.instance.progressNotifier.value = null; + } + + _forceCollectionRefresh(source); + } catch (e, st) { + debugPrint('[remote] progressive sync failed: $e\n$st'); + + if (opId != null) { + RemoteSyncBus.instance.failServerDown(opId: opId); + _notifyRemoteVisibilityChanged(source); + } else { + RemoteSyncBus.instance.stateNotifier.value = RemoteSyncState.serverDown; + RemoteSyncBus.instance.progressNotifier.value = null; + _notifyRemoteVisibilityChanged(source); + } + + _forceCollectionRefresh(source); + rethrow; + } + } + + // ------------------------------------------------------------ + // ws start/stop + // ------------------------------------------------------------ + Future<void> _startWsAlreadyEnsured() async { + if (_wsConnectInFlight) return; + _wsConnectInFlight = true; + + try { + final s = await RemoteSettings.load(); + if (!s.enabled) return; + if (_ws == null || _auth == null) return; + if (_ws!.isConnected) return; + + final token = _auth!.token ?? await _auth!.login(); + await _ws!.connect(token: token); + } finally { + _wsConnectInFlight = false; + } + } + + Future<void> _stopWs(CollectionSource source) async { + _progressiveTimer?.cancel(); + _progressiveTimer = null; + _progressiveScheduled = false; + _pendingSinceIso = null; + + try { + await _ws?.close(); + } catch (_) {} + + try { + await _addedQueue?.dispose(); + } catch (_) {} + _addedQueue = null; + + _ws = null; + _engine = null; + _api = null; + _auth = null; + _ensureStackFuture = null; + _wsConnectInFlight = false; + + _notifyRemoteVisibilityChanged(source); + _forceCollectionRefresh(source); + } + + // ------------------------------------------------------------ + // ws events + // ------------------------------------------------------------ + +Future<bool> _handleWsEvent(CollectionSource source, Map<String, dynamic> msg) async { + final type = msg['type']?.toString(); + if (type == null) return true; + + // BULK add_dir / del_dir: se il server fornisce "since", esegui subito la sync mirata + if ((type == 'add_dir' || type == 'del_dir') && msg['mode'] == 'bulk') { + final since = msg['since']?.toString(); + if (since != null && since.isNotEmpty) { + try { + await _runProgressiveSync(source, since: since); + return true; + } catch (_) { + // se fallisce, segnala al caller che non è stato applicato + return false; + } + } + // se non c'è since, accetta l'evento e aspetta eventuale add_dir_done + return true; + } + + // add_dir_done / del_dir_done: server conferma fine bulk, esegui la sync mirata se presente + if ((type == 'add_dir_done' || type == 'del_dir_done') && msg['mode'] == 'bulk') { + final since = msg['since']?.toString(); + try { + await _runProgressiveSync(source, since: since); + return true; + } catch (_) { + return false; + } + } + + // added / del / removed / updated + // - per added: la RemoteAddedQueue è già registrata nel WS client e gestisce batching + // - per del/removed/updated: chiediamo una progressive coalesced (puoi ottimizzare per id) + if (type == 'added' || type == 'del' || type == 'removed' || type == 'updated') { + _requestProgressiveSync(source: source); + return true; + } + + return true; +} + + + // ------------------------------------------------------------ + // lifecycle + // ------------------------------------------------------------ +Future<void> onAppStart({ + required CollectionSource source, + bool resumeBootstrapIfEnabled = true, +}) async { + final s = await RemoteSettings.load(); + debugPrint('[remote-debug] onAppStart start settings.enabled=${s.enabled} bus=${RemoteSyncBus.instance.stateNotifier.value}'); + + if (!s.enabled) { + debugPrint('[remote-debug] remote disabled in settings -> disabling bus and clearing remotes'); + RemoteSyncBus.instance.setDisabled(); + _notifyRemoteVisibilityChanged(source); + _forceCollectionRefresh(source); + + final remotes = source.allEntries.where((e) => e.origin == RemoteOrigin.value).toSet(); + if (remotes.isNotEmpty) { + debugPrint('[remote-debug] removing ${remotes.length} remote entries from memory'); + source.removeEntriesFromMemory(remotes); + } + + await _stopWs(source); + debugPrint('[remote-debug] onAppStart end (remote disabled) bus=${RemoteSyncBus.instance.stateNotifier.value}'); + return; + } + + final done = await bootstrapDone(); + debugPrint('[remote-debug] bootstrapDone=$done'); + + if (!done) { + debugPrint('[remote-debug] first bootstrap -> ensure stack and run fullSyncImpl'); + await _ensureRealtimeStack(source); + await _engine!.fullSyncImpl(); + try { + await _setBootstrapDone(); + debugPrint('[remote-debug] bootstrap complete: flag set'); + } catch (e, st) { + debugPrint('[remote-debug] _setBootstrapDone failed: $e\n$st'); + } + return; + } + + // prima di append: syncing + refresh + RemoteSyncBus.instance.stateNotifier.value = RemoteSyncState.syncing; + RemoteSyncBus.instance.progressNotifier.value = + const RemoteSyncProgress(done: 0, total: 0, showOverlay: false); + _notifyRemoteVisibilityChanged(source); + debugPrint('[remote-debug] set state=syncing before append'); + + // append remoti dal DB (batching nella collection) + debugPrint('[remote-debug] calling appendRemoteEntriesFromDb()'); + await source.appendRemoteEntriesFromDb(); + debugPrint('[remote-debug] after append state=${RemoteSyncBus.instance.stateNotifier.value} progress=${RemoteSyncBus.instance.progressNotifier.value}'); + + // forza refresh Home (cache/lens) + _notifyRemoteVisibilityChanged(source); + debugPrint('[remote-debug] notified visibility after append'); + + // avvia lo stack realtime (await per assicurare init, ma non bloccare la UI con full sync) + debugPrint('[remote-debug] ensuring realtime stack'); + await _ensureRealtimeStack(source); + debugPrint('[remote-debug] ensureRealtimeStack done, starting WS (unawaited)'); + unawaited(_startWsAlreadyEnsured()); + + // DEBUG: log stato WS se disponibile (non bloccante) + try { + debugPrint('[remote-debug] ws client present=${_ws != null} wsConnected=${_ws?.isConnected}'); + } catch (_) {} + + // Imposta lo stato UP-TO-DATE solo dopo aver avviato lo stack realtime + RemoteSyncBus.instance.stateNotifier.value = RemoteSyncState.upToDate; + RemoteSyncBus.instance.progressNotifier.value = null; + _notifyRemoteVisibilityChanged(source); + debugPrint('[remote-debug] set state=upToDate after starting WS'); + + // avvia progressive sync coalesced + _requestProgressiveSync(source: source, delay: const Duration(milliseconds: 200)); + debugPrint('[remote-debug] requested progressive sync and exiting onAppStart'); +} + + + Future<void> toggleRemote({required CollectionSource source}) async { + final s = await RemoteSettings.load(); + + final upd = RemoteSettings( + enabled: !s.enabled, + baseUrl: s.baseUrl, + indexPath: s.indexPath, + email: s.email, + password: s.password, + wsUrl: s.wsUrl, + ); + await upd.save(); + + if (!upd.enabled) { + RemoteSyncBus.instance.setDisabled(); + _notifyRemoteVisibilityChanged(source); + _forceCollectionRefresh(source); + + final remotes = source.allEntries.where((e) => e.origin == RemoteOrigin.value).toSet(); + if (remotes.isNotEmpty) source.removeEntriesFromMemory(remotes); + + await _stopWs(source); + return; + } + + // ------------------------------------------------------------ + // PATCH 2: se è la prima volta, mostra overlay (barra progresso) al bootstrap + // ------------------------------------------------------------ + final first = !(await bootstrapDone()); + await onAppStart(source: source, resumeBootstrapIfEnabled: first); + } + + // ------------------------------------------------------------ + // full sync legacy (progress + overlay) + // ------------------------------------------------------------ +Future<void> fullSync({ + required CollectionSource source, + required bool showOverlay, + bool markBootstrapDoneOnSuccess = false, +}) async { + if (_syncInFlight) return; + _syncInFlight = true; + + final s = await RemoteSettings.load(); + if (!s.enabled) { + RemoteSyncBus.instance.setDisabled(); + _notifyRemoteVisibilityChanged(source); + _forceCollectionRefresh(source); + _syncInFlight = false; + return; + } + + try { + if (s.baseUrl.trim().isEmpty) { + RemoteSyncBus.instance.stateNotifier.value = RemoteSyncState.serverDown; + RemoteSyncBus.instance.progressNotifier.value = null; + _notifyRemoteVisibilityChanged(source); + _forceCollectionRefresh(source); + _syncInFlight = false; + return; + } + + RemoteAuth? auth; + if (s.email.isNotEmpty && s.password.isNotEmpty) { + auth = RemoteAuth(baseUrl: s.baseUrl, email: s.email, password: s.password); + } + + final client = RemoteJsonClient(s.baseUrl, s.indexPath, auth: auth); + await client.ping().timeout(const Duration(seconds: 3)); + + final items = await client.fetchAll().timeout(const Duration(seconds: 30)); + final total = items.length; + + final opId = RemoteSyncBus.instance.start(total: total, showOverlay: showOverlay); + _notifyRemoteVisibilityChanged(source); + + final repo = RemoteRepository(localMediaDb.rawDb); + + // Decide se è bootstrap (solo in quel caso deleteAllRemotes) + final isBootstrap = !(await bootstrapDone()); + final serverIds = items.map((e) => e.id).where((v) => v.isNotEmpty).toSet(); + + if (isBootstrap) { + debugPrint('[remote-debug] fullSync bootstrap: deleteAllRemotes + upsert chunked'); + await repo.deleteAllRemotes(); + // upsert in chunk più piccoli per non bloccare il main thread + const chunk = 40; + int done = 0; + for (var i = 0; i < total; i += chunk) { + final end = (i + chunk < total) ? i + chunk : total; + await repo.upsertAll(items.sublist(i, end), chunkSize: chunk); + done = end; + RemoteSyncBus.instance.update(opId: opId, done: done, total: total); + } + try { + await _setBootstrapDone(); + debugPrint('[remote-debug] bootstrap flag set after fullSync'); + } catch (e, st) { + debugPrint('[remote-debug] _setBootstrapDone failed: $e\n$st'); + } + } else { + debugPrint('[remote-debug] fullSync incremental: upsert chunked + pruneMissingRemotes'); + const chunk = 40; + int done = 0; + for (var i = 0; i < total; i += chunk) { + final end = (i + chunk < total) ? i + chunk : total; + await repo.upsertAll(items.sublist(i, end), chunkSize: chunk); + done = end; + RemoteSyncBus.instance.update(opId: opId, done: done, total: total); + } + await repo.pruneMissingRemotes(serverIds); + } + + // append remoti dal DB (collection batching) + await source.appendRemoteEntriesFromDb(); + + _notifyRemoteVisibilityChanged(source); + + RemoteSyncBus.instance.finishUpToDate(opId: opId); + _notifyRemoteVisibilityChanged(source); + + // assicurati che lo stack realtime sia avviato e poi avvia WS + await _ensureRealtimeStack(source); + unawaited(_startWsAlreadyEnsured()); + _requestProgressiveSync(source: source, delay: const Duration(milliseconds: 300)); + } catch (e, st) { + debugPrint('[remote] fullSync error: $e\n$st'); + RemoteSyncBus.instance.stateNotifier.value = RemoteSyncState.serverDown; + RemoteSyncBus.instance.progressNotifier.value = null; + _notifyRemoteVisibilityChanged(source); + _forceCollectionRefresh(source); + + _retryStartTime ??= DateTime.now(); + _scheduleRetry(source); + } finally { + _syncInFlight = false; + } +} + + // ------------------------------------------------------------ + // retry + // ------------------------------------------------------------ + void _scheduleRetry(CollectionSource source) { + _retryTimer?.cancel(); + + _retryTimer = Timer(const Duration(seconds: 30), () async { + final s = await RemoteSettings.load(); + if (!s.enabled) return; + + if (_retryStartTime != null) { + final elapsed = DateTime.now().difference(_retryStartTime!); + if (elapsed > const Duration(minutes: 5)) { + debugPrint('[remote] retry timeout -> disattivo remote'); + + final remotes = source.allEntries.where((e) => e.origin == RemoteOrigin.value).toSet(); + if (remotes.isNotEmpty) source.removeEntriesFromMemory(remotes); + + final upd = RemoteSettings( + enabled: false, + baseUrl: s.baseUrl, + indexPath: s.indexPath, + email: s.email, + password: s.password, + wsUrl: s.wsUrl, + ); + await upd.save(); + + RemoteSyncBus.instance.setDisabled(); + _notifyRemoteVisibilityChanged(source); + _forceCollectionRefresh(source); + + await _stopWs(source); + return; + } + } + + debugPrint('[remote] retry ping…'); + + final auth = (s.email.isNotEmpty && s.password.isNotEmpty) + ? RemoteAuth(baseUrl: s.baseUrl, email: s.email, password: s.password) + : null; + + final retryClient = RemoteJsonClient(s.baseUrl, s.indexPath, auth: auth); + + try { + await retryClient.ping().timeout(const Duration(seconds: 3)); + debugPrint('[remote] retry OK -> riprendo sync'); + + _retryTimer = null; + _retryStartTime = null; + + unawaited(fullSync(source: source, showOverlay: false)); + } catch (_) { + debugPrint('[remote] retry fallito'); + _scheduleRetry(source); + } + }); + } + + Future<void> onResume(CollectionSource source) async { + final s = await RemoteSettings.load(); + if (!s.enabled) return; + + await _ensureRealtimeStack(source); + unawaited(_startWsAlreadyEnsured()); + _requestProgressiveSync(source: source, delay: const Duration(milliseconds: 200)); + } +} diff --git a/lib/remote/remote_db_uris.dart b/lib/remote/remote_db_uris.dart new file mode 100644 index 0000000..2201a6a --- /dev/null +++ b/lib/remote/remote_db_uris.dart @@ -0,0 +1,27 @@ +// lib/remote/remote_db_uris.dart +import 'dart:convert'; + +class RemoteDbUris { + // Schema personalizzato che non attiva ContentResolver. + static const _scheme = 'aves-remote'; + + /// Costruisce un URI fittizio univoco e stabile per un elemento remoto. + /// - Se hai un remoteId (hash/uuid) usa quello (preferibile). + /// - In alternativa, codifica il remotePath. + static String make({String? remoteId, String? remotePath}) { + if (remoteId != null && remoteId.trim().isNotEmpty) { + // Esempio: aves-remote://rid/<remoteId> + return '$_scheme://rid/${Uri.encodeComponent(remoteId.trim())}'; + } + if (remotePath != null && remotePath.trim().isNotEmpty) { + // Esempio: aves-remote://path/<base64url(remotePath)> + final b64 = base64Url.encode(utf8.encode(remotePath.trim())); + return '$_scheme://path/$b64'; + } + // Estremo fallback (pochissimo probabile) + return '$_scheme://anon/${DateTime.now().microsecondsSinceEpoch}'; + } + + /// Riconosce se un uri è fittizio remoto + static bool isSynthetic(String? uri) => uri != null && uri.startsWith('$_scheme://'); +} diff --git a/lib/remote/remote_gallery_bridge.dart b/lib/remote/remote_gallery_bridge.dart new file mode 100644 index 0000000..c338b19 --- /dev/null +++ b/lib/remote/remote_gallery_bridge.dart @@ -0,0 +1,12 @@ +// lib/remote/remote_gallery_bridge.dart +import 'package:aves/services/common/services.dart'; +import 'package:aves/model/entry/entry.dart'; + +import 'remote_origin.dart'; + +class RemoteGalleryBridge { + static Future<Set<AvesEntry>> loadRemoteEntries() async { + final allRemotes = await localMediaDb.loadEntries(origin: RemoteOrigin.value); + return allRemotes.where((e) => e.trashed == 0).toSet(); + } +} diff --git a/lib/remote/remote_http.dart b/lib/remote/remote_http.dart new file mode 100644 index 0000000..3cbc72d --- /dev/null +++ b/lib/remote/remote_http.dart @@ -0,0 +1,151 @@ +// lib/remote/remote_http.dart +import 'dart:convert'; +import 'dart:developer' as dev; +import 'package:flutter/services.dart'; + +import 'remote_settings.dart'; +import 'auth_client.dart'; + +/// Helper HTTP per risorse remote (URL + headers di autenticazione). +class RemoteHttp { + static RemoteAuth? _auth; + static String? _base; + + // Cache dell'ultimo set di header (mai null: {} se non autenticato) + static Map<String, String> _cachedHeaders = const {}; + + static Future<void>? _initFuture; // evita init concorrenti + + /// ✅ Inietta l'istanza di RemoteAuth usata dal controller, + /// così API e immagini condividono lo stesso token/cache. + static void attach({required String baseUrl, required RemoteAuth auth}) { + _base = baseUrl.trim().isEmpty ? null : baseUrl.trim(); + _auth = auth; + _cachedHeaders = const {}; + _initFuture = Future.value(); // init "risolta" + dev.log('[RemoteHttp] attach: base=$_base (shared auth)', name: 'RemoteHttp'); + } + + /// Inizializza auth e base URL dai settings sicuri (robusto: non lancia). + static Future<void> init() { + _initFuture ??= _doInit(); + return _initFuture!; + } + + static Future<void> _doInit() async { + try { + final s = await RemoteSettings.load(); + final base = s.baseUrl.trim(); + _base = base.isEmpty ? null : base; + _auth = RemoteAuth(baseUrl: s.baseUrl, email: s.email, password: s.password); + dev.log('[RemoteHttp] init: base=$_base, email=${s.email.isNotEmpty ? '***' : '(none)'}', + name: 'RemoteHttp'); + } catch (e, st) { + dev.log('[RemoteHttp] init ERROR: $e', name: 'RemoteHttp', error: e, stackTrace: st); + _auth = null; + _base = null; + } + } + + /// ✅ Se il token JWT è quasi scaduto, forziamo refresh prima di usarlo per le immagini. + static bool _isJwtExpiringSoon(String token, {Duration skew = const Duration(seconds: 60)}) { + try { + final parts = token.split('.'); + if (parts.length < 2) return false; + final payload = parts[1]; + + String normalized = payload.replaceAll('-', '+').replaceAll('_', '/'); + while (normalized.length % 4 != 0) { + normalized += '='; + } + + final decoded = utf8.decode(base64.decode(normalized)); + final map = jsonDecode(decoded); + if (map is! Map) return false; + final exp = map['exp']; + if (exp is! num) return false; + + final expMs = (exp.toInt()) * 1000; + final nowMs = DateTime.now().millisecondsSinceEpoch; + return (expMs - nowMs) <= skew.inMilliseconds; + } catch (_) { + return false; + } + } + + /// Headers correnti (login on‑demand). Non lancia; ritorna {} se non disponibili. + static Future<Map<String, String>> headers() async { + if (_auth == null) { + await init(); + if (_auth == null) { + _cachedHeaders = const {}; + dev.log('[RemoteHttp] headers: init failed → NO TOKEN', name: 'RemoteHttp'); + return _cachedHeaders; + } + } + + try { + // ✅ refresh proattivo se token vicino a scadenza + final tok = _auth!.token; + if (tok != null && tok.isNotEmpty && _isJwtExpiringSoon(tok)) { + dev.log('[RemoteHttp] token expiring soon -> refresh', name: 'RemoteHttp'); + final h = await _auth!.refreshAndHeaders(); + _cachedHeaders = Map<String, String>.from(h); + return _cachedHeaders; + } + + final h = await _auth!.authHeaders(); // login on-demand + _cachedHeaders = Map<String, String>.from(h); + + if ((_cachedHeaders['Authorization']?.isEmpty ?? true)) { + dev.log('[RemoteHttp] headers: NO Authorization', name: 'RemoteHttp'); + } else { + dev.log('[RemoteHttp] headers: Authorization: Bearer ***', name: 'RemoteHttp'); + } + return _cachedHeaders; + } on PlatformException catch (e, st) { + dev.log('[RemoteHttp] headers PlatformException: $e → returning {}', + name: 'RemoteHttp', error: e, stackTrace: st); + _cachedHeaders = const {}; + return _cachedHeaders; + } catch (e, st) { + dev.log('[RemoteHttp] headers ERROR: $e → returning {}', + name: 'RemoteHttp', error: e, stackTrace: st); + _cachedHeaders = const {}; + return _cachedHeaders; + } + } + + /// Ultimi header noti (sincrono). Mai null; {} se non autenticato. + static Map<String, String> peekHeaders() => _cachedHeaders; + + /// Converte path relativo in assoluto. Se è già http/https lo ritorna com’è. + static String absUrl(String? relativePath) { + if (relativePath == null || relativePath.isEmpty) return ''; + final lp = relativePath.trim().toLowerCase(); + if (lp.startsWith('http://') || lp.startsWith('https://')) { + return relativePath; + } + if (_base == null || _base!.isEmpty) return ''; + final b = _base!.endsWith('/') ? _base! : '${_base!}/'; + final rel = relativePath.startsWith('/') ? relativePath.substring(1) : relativePath; + return '$b$rel'; + } + + /// Warm-up: scaldare gli header. + static Future<void> warmUp() async { + await init(); + try { + await headers(); + } catch (_) { + // già loggato + } + } + + /// Rilegge i settings a runtime (es. utente cambia base/email/password). + static Future<void> refreshFromSettings() async { + _initFuture = null; + await init(); + _cachedHeaders = const {}; + } +} diff --git a/lib/remote/remote_http_api.dart b/lib/remote/remote_http_api.dart new file mode 100644 index 0000000..60cb7b2 --- /dev/null +++ b/lib/remote/remote_http_api.dart @@ -0,0 +1,179 @@ +import 'dart:convert'; +import 'package:http/http.dart' as http; +import 'package:flutter/foundation.dart'; + + +import 'auth_client.dart'; +import 'remote_models.dart'; + + +class RemoteHttpApi { + RemoteHttpApi({ + required this.baseUrl, + required this.auth, + this.timeout = const Duration(seconds: 20), + }) : _base = Uri.parse(baseUrl.endsWith('/') ? baseUrl : '$baseUrl/'); + + final String baseUrl; + final Uri _base; + final RemoteAuth auth; + final Duration timeout; + +/// Recupera i photo items per una lista di ids. +Future<List<RemotePhotoItem>> getPhotosByIds(List<String> ids) async { + if (ids.isEmpty) return <RemotePhotoItem>[]; + + const int chunkSize = 100; + final List<RemotePhotoItem> out = []; + + for (var i = 0; i < ids.length; i += chunkSize) { + final end = (i + chunkSize < ids.length) ? i + chunkSize : ids.length; + final chunk = ids.sublist(i, end); + + // prova batch endpoint + try { + final idsParam = chunk.map(Uri.encodeComponent).join(','); + final uri = _base.resolve('photos?ids=$idsParam'); + final r = await _getWithAuth(uri); + final list = _decodeList(r, label: 'getPhotosByIds'); + out.addAll(list.map(RemotePhotoItem.fromJson)); + continue; + } catch (e) { + debugPrint('[remote][api] batch getPhotosByIds failed for chunk starting at $i: $e'); + // fallback: prova richieste singole per questo chunk + } + + // fallback per chunk: richieste singole + for (final id in chunk) { + try { + final map = await getPhotoById(id); + if (map != null) out.add(RemotePhotoItem.fromJson(map)); + } catch (e) { + debugPrint('[remote][api] getPhotosByIds fallback error for id=$id: $e'); + } + } + } + + return out; +} + + + // ------------------------- + // Helpers + // ------------------------- + + Future<http.Response> _getWithAuth(Uri uri) async { + var headers = await auth.authHeaders(); + + http.Response res; + try { + res = await http.get(uri, headers: headers).timeout(timeout); + } catch (e) { + throw Exception('GET fallita: errore di rete verso $uri: $e'); + } + + // Follow redirect 307/308 se presenti (raro ma possibile) + if ({307, 308}.contains(res.statusCode) && res.headers['location'] != null) { + final redirectUri = uri.resolve(res.headers['location']!); + try { + res = await http.get(redirectUri, headers: headers).timeout(timeout); + } catch (e) { + throw Exception('GET fallita: errore di rete verso $redirectUri: $e'); + } + } + + // Se token scaduto -> refresh e retry una sola volta + if (res.statusCode == 401) { + headers = await auth.refreshAndHeaders(); + try { + res = await http.get(uri, headers: headers).timeout(timeout); + } catch (e) { + throw Exception('GET fallita dopo refresh token verso $uri: $e'); + } + } + + // Gestione errori HTTP + if (res.statusCode < 200 || res.statusCode >= 300) { + final snippet = utf8.decode(res.bodyBytes.take(300).toList()); + throw Exception('HTTP ${res.statusCode} ${res.reasonPhrase} su $uri – $snippet'); + } + + return res; + } + + List<Map<String, dynamic>> _decodeList(http.Response r, {required String label}) { + final decoded = jsonDecode(utf8.decode(r.bodyBytes)); + if (decoded is! List) { + throw Exception('$label: risposta non è una lista JSON'); + } + return decoded.cast<Map<String, dynamic>>(); + } + + // ------------------------- + // API + // ------------------------- +Future<void> sendSyncDone({ + required String sessionId, + required String deviceId, + required int lastSyncMs, +}) async { + final uri = _base.resolve('photos/sync_done'); + + final headers = await auth.authHeaders(); + headers['Content-Type'] = 'application/json'; + + final body = jsonEncode({ + 'session_id': sessionId, + 'device_id': deviceId, + 'last_sync': lastSyncMs, + }); + + final res = await http + .post(uri, headers: headers, body: body) + .timeout(timeout); + + if (res.statusCode < 200 || res.statusCode >= 300) { + final snippet = utf8.decode(res.bodyBytes.take(300).toList()); + throw Exception('sync_done: HTTP ${res.statusCode} – $snippet'); + } +} + + + Future<List<Map<String, dynamic>>> getAllPhotos() async { + final uri = _base.resolve('photos'); + final r = await _getWithAuth(uri); + return _decodeList(r, label: 'getAllPhotos'); + } + + Future<List<Map<String, dynamic>>> getChanges(String sinceIso) async { + final uri = _base.resolve('photos/changes?since=${Uri.encodeComponent(sinceIso)}'); + final r = await _getWithAuth(uri); + return _decodeList(r, label: 'getChanges'); + } + + Future<List<Map<String, dynamic>>> getDeletedHard(String sinceIso) async { + final uri = _base.resolve('photos/deleted_hard?since=${Uri.encodeComponent(sinceIso)}'); + final r = await _getWithAuth(uri); + + final decoded = jsonDecode(utf8.decode(r.bodyBytes)); + if (decoded is! Map<String, dynamic>) { + throw Exception('getDeletedHard: risposta non è un oggetto JSON'); + } + + final deleted = (decoded['deleted'] ?? []) as List; + return deleted.cast<Map<String, dynamic>>(); + } + + Future<Map<String, dynamic>?> getPhotoById(String id) async { + final uri = _base.resolve('photos/$id'); + final r = await _getWithAuth(uri); + + final decoded = jsonDecode(utf8.decode(r.bodyBytes)); + if (decoded is List && decoded.isNotEmpty) { + final first = decoded.first; + if (first is Map<String, dynamic>) return first; + throw Exception('getPhotoById: primo elemento non è un oggetto JSON'); + } + return null; + } +} diff --git a/lib/remote/remote_image_tile.dart b/lib/remote/remote_image_tile.dart new file mode 100644 index 0000000..d57c7d5 --- /dev/null +++ b/lib/remote/remote_image_tile.dart @@ -0,0 +1,290 @@ +// lib/remote/remote_image_tile.dart + +import 'package:flutter/material.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/props.dart'; // entry.isVideo, durationText +import 'package:aves/remote/remote_http.dart'; + +import 'remote_origin.dart'; + +/// Miniatura per contenuti **remoti** con overlay coerente a quello dei locali: +/// - Icona Play in basso-sinistra se è video +/// - Chip durata in basso-destra se `entry.durationMillis` è disponibile +/// +/// Fix principali: +/// 1) Mai "grigio stuck": retry automatico se la prima richiesta fallisce +/// 2) Preload: precache del thumb corrente + (opzionale) prefetch dei prossimi N thumb +class RemoteImageTile extends StatefulWidget { + final AvesEntry entry; + final double borderRadius; + final BoxFit fit; + + // personalizzazioni overlay + final Color? overlayIconBg; + final Color? overlayIconFg; + final Color? durationBg; + final Color? durationFg; + + /// (Opzionale) lista di path relativi (thumb/path) da precaricare + /// Es: [nextRel1, nextRel2, ...] in ordine di priorità. + final List<String>? prefetchRelPaths; + + /// Quanti prefetch eseguire al massimo (se prefetchRelPaths != null) + final int prefetchCount; + + /// Quanti tentativi di retry per la stessa tile (consigliato 1 o 2) + final int maxRetry; + + const RemoteImageTile({ + super.key, + required this.entry, + this.borderRadius = 12.0, + this.fit = BoxFit.cover, + this.overlayIconBg, + this.overlayIconFg, + this.durationBg, + this.durationFg, + this.prefetchRelPaths, + this.prefetchCount = 18, + this.maxRetry = 1, + }); + + @override + State<RemoteImageTile> createState() => _RemoteImageTileState(); +} + +class _RemoteImageTileState extends State<RemoteImageTile> { + late Future<Map<String, String>> _headersFuture; + int _attempt = 0; + bool _selfPrecached = false; + bool _neighborsPrecached = false; + + bool get _isRemote => widget.entry.origin == RemoteOrigin.value; + + @override + void initState() { + super.initState(); + // headers() dovrebbe essere già “cacheata” nel tuo RemoteHttp, ma la + // memorizziamo per non ricreare il Future ad ogni build. + _headersFuture = RemoteHttp.headers(); + } + + @override + void didUpdateWidget(covariant RemoteImageTile oldWidget) { + super.didUpdateWidget(oldWidget); + + // Se cambia entry o cambia url base, resettare stato retry/precache + if (oldWidget.entry.id != widget.entry.id || + oldWidget.entry.remoteThumb2 != widget.entry.remoteThumb2 || + oldWidget.entry.remoteThumb1 != widget.entry.remoteThumb1 || + oldWidget.entry.remotePath != widget.entry.remotePath || + oldWidget.entry.path != widget.entry.path) { + _attempt = 0; + _selfPrecached = false; + _neighborsPrecached = false; + _headersFuture = RemoteHttp.headers(); + } + + // Se cambia lista prefetch, consentiamo di rifarla + if (oldWidget.prefetchRelPaths != widget.prefetchRelPaths) { + _neighborsPrecached = false; + } + } + + @override + Widget build(BuildContext context) { + final entry = widget.entry; + + final rel = entry.remoteThumb2 ?? entry.remoteThumb1 ?? entry.remotePath ?? entry.path; + if (!_isRemote || rel == null || rel.isEmpty) { + return _frame(context, const ColoredBox(color: Colors.black12)); + } + + final url = RemoteHttp.absUrl(rel); + final ar = (entry.displayAspectRatio > 0) ? entry.displayAspectRatio : 1.0; + + return AspectRatio( + aspectRatio: ar, + child: FutureBuilder<Map<String, String>>( + future: _headersFuture, + builder: (context, snap) { + if (snap.connectionState != ConnectionState.done) { + return _frame(context, const ColoredBox(color: Colors.black12), showProgress: true); + } + + final hdrs = snap.data ?? const {}; + + // ImageProvider “canonico” (serve anche per precache) + final provider = NetworkImage(url, headers: hdrs.isEmpty ? null : hdrs); + + // ✅ Precache del thumb corrente (una volta sola) + if (!_selfPrecached) { + _selfPrecached = true; + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; + precacheImage(provider, context); + }); + } + + // ✅ Prefetch dei prossimi N (se forniti) + if (!_neighborsPrecached && widget.prefetchRelPaths != null && widget.prefetchRelPaths!.isNotEmpty) { + _neighborsPrecached = true; + final next = widget.prefetchRelPaths! + .where((p) => p.isNotEmpty) + .take(widget.prefetchCount) + .map(RemoteHttp.absUrl) + .toList(growable: false); + + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; + for (final u in next) { + precacheImage(NetworkImage(u, headers: hdrs.isEmpty ? null : hdrs), context); + } + }); + } + + final img = Image( + image: provider, + fit: widget.fit, + // ✅ mentre scarica: spinner (così non è "grigio stuck") + loadingBuilder: (context, child, progress) { + if (progress == null) return child; + return _frame(context, const ColoredBox(color: Colors.black12), showProgress: true); + }, + // ✅ se fallisce: retry automatico (1 volta di default) poi fallback soft + errorBuilder: (_, __, ___) { + if (_attempt < widget.maxRetry) { + // piccolo delay per evitare loop immediati + Future.delayed(const Duration(milliseconds: 150), () { + if (!mounted) return; + setState(() => _attempt++); + }); + // nel frattempo spinner (non grigio fisso) + return _frame(context, const ColoredBox(color: Colors.black12), showProgress: true); + } + // fallback definitivo: box neutro (ma NON rimane bloccato al primo errore) + return _frame(context, const ColoredBox(color: Colors.black26)); + }, + ); + + return _frame(context, img); + }, + ), + ); + } + + Widget _frame(BuildContext context, Widget child, {bool showProgress = false}) { + final theme = Theme.of(context); + final radius = BorderRadius.circular(widget.borderRadius); + + // Video detection robusta (isVideo + mime + estensione path) + final mime = (widget.entry.sourceMimeType ?? widget.entry.mimeType ?? '').toLowerCase(); + final p = (widget.entry.path ?? widget.entry.remotePath ?? '').toLowerCase(); + final looksVideo = p.endsWith('.mp4') || p.endsWith('.mov') || p.endsWith('.m4v') || p.endsWith('.mkv') || p.endsWith('.webm'); + final isVideo = widget.entry.isVideo || mime.startsWith('video/') || looksVideo; + + final showDuration = isVideo && (widget.entry.durationMillis ?? 0) > 0; + + return ClipRRect( + borderRadius: radius, + child: Stack( + fit: StackFit.expand, + children: [ + Positioned.fill(child: child), + + if (showProgress) + const Center( + child: SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator(strokeWidth: 1.5), + ), + ), + + if (isVideo) ...[ + Positioned( + left: 6, + bottom: 6, + child: _PlayBadge( + bg: widget.overlayIconBg ?? Colors.black.withOpacity(.55), + fg: widget.overlayIconFg ?? Colors.white, + ), + ), + if (showDuration) + Positioned( + right: 6, + bottom: 6, + child: _DurationChip( + text: widget.entry.durationText, + bg: widget.durationBg ?? Colors.black.withOpacity(.65), + fg: widget.durationFg ?? Colors.white, + borderRadius: 10, + padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), + textStyle: theme.textTheme.labelSmall?.copyWith( + color: widget.durationFg ?? Colors.white, + fontFeatures: const [FontFeature.tabularFigures()], + ), + ), + ), + ], + ], + ), + ); + } +} + +class _PlayBadge extends StatelessWidget { + final Color bg; + final Color fg; + + const _PlayBadge({ + required this.bg, + required this.fg, + }); + + @override + Widget build(BuildContext context) { + return DecoratedBox( + decoration: BoxDecoration(color: bg, shape: BoxShape.circle), + child: Padding( + padding: const EdgeInsets.all(6), + child: Icon(Icons.play_arrow_rounded, color: fg, size: 16), + ), + ); + } +} + +class _DurationChip extends StatelessWidget { + final String text; + final Color bg; + final Color fg; + final double borderRadius; + final EdgeInsets padding; + final TextStyle? textStyle; + + const _DurationChip({ + required this.text, + required this.bg, + required this.fg, + this.borderRadius = 10, + this.padding = const EdgeInsets.symmetric(horizontal: 6, vertical: 2), + this.textStyle, + }); + + @override + Widget build(BuildContext context) { + return DecoratedBox( + decoration: BoxDecoration( + color: bg, + borderRadius: BorderRadius.circular(borderRadius), + ), + child: Padding( + padding: padding, + child: Text( + text, + style: textStyle ?? Theme.of(context).textTheme.labelSmall?.copyWith(color: fg), + ), + ), + ); + } +} diff --git a/lib/remote/remote_models.dart b/lib/remote/remote_models.dart new file mode 100644 index 0000000..0d1a29d --- /dev/null +++ b/lib/remote/remote_models.dart @@ -0,0 +1,178 @@ +// lib/remote/remote_models.dart +import 'url_utils.dart'; + +class RemotePhotoItem { + final String id; + final String name; + final String path; + final String? thub1, thub2; + final String? mimeType; + final int? width, height, sizeBytes; + final int? rotation; + + /// EXIF/metadata + final DateTime? takenAtUtc; + final String? dataExifLegacy; + + /// GPS + location + final double? lat, lng, alt; + final RemoteLocation? location; + + /// extra + final String? user; + final String? cartella; // ✅ utile (folder) + final String? fastHash; // ✅ utile per link locale<->remoto + final int? durationMillis; + + /// ✅ Timestamp server-side per sync robusta + final DateTime? createdAtUtc; + final DateTime? updatedAtUtc; + final DateTime? deletedAtUtc; // soft delete + + /// ✅ timestamp file (ms) dal server (per dateModifiedMillis DB) + final int? mtimeMs; + + RemotePhotoItem({ + required this.id, + required this.name, + required this.path, + this.thub1, + this.thub2, + this.mimeType, + this.width, + this.height, + this.rotation, + this.sizeBytes, + this.takenAtUtc, + this.dataExifLegacy, + this.lat, + this.lng, + this.alt, + this.user, + this.cartella, + this.fastHash, + this.durationMillis, + this.location, + this.createdAtUtc, + this.updatedAtUtc, + this.deletedAtUtc, + this.mtimeMs, + }); + + // Costruzione URL assoluto delegata a utility (in base alle impostazioni) + String absoluteUrl(String baseUrl) => buildAbsoluteUri(baseUrl, path).toString(); + + static DateTime? _tryParseIsoUtc(dynamic v) { + if (v == null) return null; + try { + return DateTime.parse(v.toString()).toUtc(); + } catch (_) { + return null; + } + } + + static double? _toDouble(dynamic v) { + if (v == null) return null; + if (v is num) return v.toDouble(); + return double.tryParse(v.toString()); + } + + /// Converte secondi→ms se < 1000, altrimenti assume già millisecondi. + static int? _toMillis(dynamic v) { + if (v == null) return null; + final num? n = (v is num) ? v : num.tryParse(v.toString()); + if (n == null) return null; + return n >= 1000 ? n.toInt() : (n * 1000).toInt(); + } + + static int? _toIntMs(dynamic v) { + if (v == null) return null; + final num? n = (v is num) ? v : num.tryParse(v.toString()); + if (n == null) return null; + // mtimeMs nel tuo esempio è float: 1775724485418.3494 + return n.round(); + } + + /// ✅ helper: soft delete? + bool get isSoftDeleted => deletedAtUtc != null; + + factory RemotePhotoItem.fromJson(Map<String, dynamic> j) { + final gps = j['gps'] as Map<String, dynamic>?; + final loc = j['location'] is Map<String, dynamic> + ? RemoteLocation.fromJson(j['location'] as Map<String, dynamic>) + : null; + + return RemotePhotoItem( + id: (j['id'] ?? j['name']).toString(), + name: (j['name'] ?? '').toString(), + path: (j['path'] ?? '').toString(), + thub1: j['thub1']?.toString(), + thub2: j['thub2']?.toString(), + mimeType: j['mime_type']?.toString(), + width: (j['width'] as num?)?.toInt(), + height: (j['height'] as num?)?.toInt(), + rotation: (j['rotation'] as num?)?.toInt(), + sizeBytes: (j['size_bytes'] as num?)?.toInt(), + + takenAtUtc: _tryParseIsoUtc(j['taken_at']), + dataExifLegacy: j['data']?.toString(), + + lat: gps != null ? _toDouble(gps['lat']) : null, + lng: gps != null ? _toDouble(gps['lng']) : null, + alt: gps != null ? _toDouble(gps['alt']) : null, + + user: j['user']?.toString(), + cartella: j['cartella']?.toString(), + fastHash: j['fast_hash']?.toString(), + + // durata: dal server è duration_ms + durationMillis: _toMillis(j['duration_ms']), + + location: loc, + + // ✅ campi sync + createdAtUtc: _tryParseIsoUtc(j['created_at']), + updatedAtUtc: _tryParseIsoUtc(j['updated_at']), + deletedAtUtc: _tryParseIsoUtc(j['deleted_at']), + + // ✅ per DB dateModifiedMillis + mtimeMs: _toIntMs(j['mtimeMs']), + ); + } +} + +class RemoteLocation { + final String? continent; + final String? country; + final String? region; + final String? postcode; + final String? city; + final String? countyCode; + final String? address; + final String? timezone; + final String? timeOffset; + + RemoteLocation({ + this.continent, + this.country, + this.region, + this.postcode, + this.city, + this.countyCode, + this.address, + this.timezone, + this.timeOffset, + }); + + factory RemoteLocation.fromJson(Map<String, dynamic> j) => RemoteLocation( + continent: j['continent']?.toString(), + country: j['country']?.toString(), + region: j['region']?.toString(), + postcode: j['postcode']?.toString(), + city: j['city']?.toString(), + countyCode: j['county_code']?.toString(), + address: j['address']?.toString(), + timezone: j['timezone']?.toString(), + timeOffset: j['time']?.toString(), + ); +} diff --git a/lib/remote/remote_origin.dart b/lib/remote/remote_origin.dart new file mode 100644 index 0000000..3efb29c --- /dev/null +++ b/lib/remote/remote_origin.dart @@ -0,0 +1,3 @@ +class RemoteOrigin { + static const int value = 1000; +} diff --git a/lib/remote/remote_repository.dart b/lib/remote/remote_repository.dart new file mode 100644 index 0000000..974b55d --- /dev/null +++ b/lib/remote/remote_repository.dart @@ -0,0 +1,735 @@ +// lib/remote/remote_repository.dart +import 'package:flutter/foundation.dart' show debugPrint; +import 'package:sqflite/sqflite.dart'; + +import 'remote_models.dart'; +import 'remote_db_uris.dart'; // helper per URI fittizi aves-remote://... +import 'remote_origin.dart'; + +class RemoteRepository { + final Database db; + RemoteRepository(this.db); + +/// Assicura che le folders esistano per le entries remote fornite. +/// Usa accesso dinamico ai campi di RemotePhotoItem per compatibilità con diverse versioni. +Future<void> ensureFoldersFromEntries(List<dynamic> items) async { + final dirs = <String>{}; + + for (final it in items) { + try { + String? dir; + + // 1) se l'oggetto è già una Map + if (it is Map) { + dir = (it['directory'] ?? it['dir'] ?? it['folder'] ?? it['path'])?.toString(); + if (dir == null || dir.isEmpty) { + final rp = (it['remotePath'] ?? it['remote_path'] ?? it['path_remote'])?.toString(); + if (rp != null && rp.isNotEmpty) dir = _extractDirFromRemotePath(rp); + } + } else { + // 2) oggetto custom: prova a leggere proprietà dinamicamente + try { + final dynamic d = it; + // prova campi comuni + try { dir = (d.directory as String?); } catch (_) {} + if (dir == null || dir.isEmpty) { + try { dir = (d.dir as String?); } catch (_) {} + } + if (dir == null || dir.isEmpty) { + try { dir = (d.folder as String?); } catch (_) {} + } + if (dir == null || dir.isEmpty) { + try { final rp = (d.remotePath as String?); if (rp != null && rp.isNotEmpty) dir = _extractDirFromRemotePath(rp); } catch (_) {} + } + // 3) fallback: se l'oggetto espone toJson(), usa quello + if ((dir == null || dir.isEmpty) && (d as dynamic).toJson is Function) { + try { + final m = (d as dynamic).toJson(); + if (m is Map) { + dir = (m['directory'] ?? m['dir'] ?? m['folder'] ?? m['path'])?.toString(); + if (dir == null || dir.isEmpty) { + final rp = (m['remotePath'] ?? m['remote_path'] ?? m['path_remote'])?.toString(); + if (rp != null && rp.isNotEmpty) dir = _extractDirFromRemotePath(rp); + } + } + } catch (_) {} + } + } catch (_) {} + } + + if (dir != null && dir.isNotEmpty) dirs.add(dir); + } catch (_) { + // ignora item malformati + } + } + + if (dirs.isEmpty) return; + + // Ottieni l'istanza DB dinamicamente (rawDb, db, database) + final dynamic db = (this as dynamic).rawDb ?? (this as dynamic).db ?? (this as dynamic).database; + if (db == null) { + // Se non trovi il DB, esci silenziosamente (la cache verrà ricostruita altrove) + return; + } + + try { + await db.transaction((txn) async { + for (final d in dirs) { + try { + await txn.insert( + 'folders', + { + 'path': d, + 'display_name': d.split('/').isNotEmpty ? d.split('/').last : d, + 'is_remote': 1, + 'album_type': 0, + 'priority': 0, + }, + conflictAlgorithm: ConflictAlgorithm.ignore, + ); + } catch (_) { + // ignora errori su singolo insert + } + } + }); + } catch (e, st) { + // log e continua: non vogliamo far fallire l'intero flusso per problemi di folders + debugPrint('[remote][repo] ensureFoldersFromEntries transaction failed: $e\n$st'); + } +} + +/// Estrae la directory da un remotePath (es. "/a/b/c/file.jpg" -> "/a/b/c") +String _extractDirFromRemotePath(String remotePath) { + try { + final idx = remotePath.lastIndexOf('/'); + if (idx <= 0) return remotePath; + return remotePath.substring(0, idx); + } catch (_) { + return remotePath; + } +} + + + // ========================= + // Helpers PRAGMA / schema + // ========================= + + Future<void> _ensureColumns( + DatabaseExecutor dbExec, { + required String table, + required Map<String, String> columnsAndTypes, + }) async { + try { + final rows = await dbExec.rawQuery('PRAGMA table_info($table);'); + final existing = rows.map((r) => (r['name'] as String)).toSet(); + + for (final entry in columnsAndTypes.entries) { + final col = entry.key; + final typ = entry.value; + if (!existing.contains(col)) { + final sql = 'ALTER TABLE $table ADD COLUMN $col $typ;'; + try { + await dbExec.execute(sql); + debugPrint('[RemoteRepository] executed: $sql'); + } catch (e, st) { + debugPrint('[RemoteRepository] failed to execute $sql: $e\n$st'); + } + } + } + } catch (e, st) { + debugPrint('[RemoteRepository] _ensureColumns($table) error: $e\n$st'); + } + } + + /// Assicura che tutte le entry remote abbiano un uri costruito da remoteId. + /// (coerente con aves-remote://rid/...) + Future<void> ensureRemoteUris(DatabaseExecutor dbExec) async { + try { + await dbExec.execute(''' + UPDATE entry + SET uri = 'aves-remote://rid/' || replace(remoteId, ' ', '') + WHERE origin = ${RemoteOrigin.value} + AND remoteId IS NOT NULL + AND trim(remoteId) != '' + AND (uri IS NULL OR trim(uri) = '' OR uri NOT LIKE 'aves-remote://%'); + '''); + debugPrint('[RemoteRepository] ensureRemoteUris: migration applied'); + } catch (e, st) { + debugPrint('[RemoteRepository] ensureRemoteUris error: $e\n$st'); + } + } + + /// Assicura che le colonne necessarie esistano nella tabella `entry`. + Future<void> _ensureEntryColumns(DatabaseExecutor dbExec) async { + await _ensureColumns(dbExec, table: 'entry', columnsAndTypes: const { + // Core + 'uri': 'TEXT', + + // GPS + 'latitude': 'REAL', + 'longitude': 'REAL', + 'altitude': 'REAL', + + // Campi remoti + 'remoteId': 'TEXT', + 'remotePath': 'TEXT', + 'remoteThumb1': 'TEXT', + 'remoteThumb2': 'TEXT', + 'origin': 'INTEGER', + 'provider': 'TEXT', + 'trashed': 'INTEGER', + 'remoteRotation': 'INTEGER', + + // ✅ Durata video (ms) + 'durationMillis': 'INTEGER', + }); + + // indice lookup + try { + await dbExec.execute('CREATE INDEX IF NOT EXISTS idx_entry_remoteId ON entry(remoteId);'); + } catch (e, st) { + debugPrint('[RemoteRepository] create index error: $e\n$st'); + } + } + + // ========================= + // Retry su SQLITE_BUSY + // ========================= + + bool _isBusy(Object e) { + final s = e.toString(); + return s.contains('SQLITE_BUSY') || s.contains('database is locked'); + } + + Future<T> _withRetryBusy<T>(Future<T> Function() fn) async { + const maxAttempts = 3; + var delay = const Duration(milliseconds: 250); + for (var i = 0; i < maxAttempts; i++) { + try { + return await fn(); + } catch (e) { + if (!_isBusy(e) || i == maxAttempts - 1) rethrow; + await Future.delayed(delay); + delay *= 2; + } + } + return await fn(); + } + + // ========================= + // Normalizzazione (solo supporto) + // ========================= + + String _normPath(String? p) { + if (p == null || p.isEmpty) return ''; + var s = p.trim().replaceAll(RegExp(r'/+'), '/'); + if (!s.startsWith('/')) s = '/$s'; + return s; + } + + /// Candidato canonico: inserisce '/original/' dopo '/photos/<User>/' + /// se manca. Usato per lookup/fallback. + String _canonCandidate(String? rawPath, String fileName) { + var s = _normPath(rawPath); + final seg = s.split('/'); // ['', 'photos', '<User>', maybe 'original', ...] + if (seg.length >= 4 && seg[1] == 'photos' && seg[3] != 'original' && seg[3] != 'thumbs') { + seg.insert(3, 'original'); + } + if (fileName.isNotEmpty) { + seg[seg.length - 1] = fileName; + } + return seg.join('/'); + } + + // ========================= + // Utilities + // ========================= + + bool _isVideoItem(RemotePhotoItem it) { + final mt = (it.mimeType ?? '').toLowerCase(); + final p = it.path.toLowerCase(); + return mt.startsWith('video/') || + p.endsWith('.mp4') || + p.endsWith('.mov') || + p.endsWith('.m4v') || + p.endsWith('.mkv') || + p.endsWith('.webm'); + } + + Map<String, Object?> _buildEntryRow(RemotePhotoItem it, {int? existingId}) { + final syntheticUri = RemoteDbUris.make(remoteId: it.id, remotePath: it.path); + + int _makeContentId() { + final base = (it.id.isNotEmpty ? it.id : it.path); + final h = base.hashCode & 0x7fffffff; + return 1_000_000_000 + (h % 900_000_000); + } + + final nowMs = DateTime.now().millisecondsSinceEpoch; + + // ✅ dateModifiedMillis: preferisci mtimeMs, poi updatedAtUtc, poi takenAtUtc, poi now + final dateModMs = + it.mtimeMs ?? + it.updatedAtUtc?.millisecondsSinceEpoch ?? + it.takenAtUtc?.millisecondsSinceEpoch ?? + nowMs; + + // ✅ trashed: soft delete dal server (deleted_at != null) + final trashed = it.deletedAtUtc != null ? 1 : 0; + + // provider: tieni il tuo default ma se c’è user dal server, salvalo (utile debug) + final provider = (it.user != null && it.user!.trim().isNotEmpty) + ? it.user!.trim() + : 'json@patachina'; + + return <String, Object?>{ + 'id': existingId, + 'contentId': _makeContentId(), + + 'uri': syntheticUri, + 'path': it.path, + + // ✅ fallback MIME video se mancante + 'sourceMimeType': it.mimeType ?? (_isVideoItem(it) ? 'video/mp4' : 'image/jpeg'), + + 'width': it.width ?? 0, + 'height': it.height ?? 0, + 'sourceRotationDegrees': it.rotation ?? 0, + + 'sizeBytes': it.sizeBytes, + + 'title': it.name, + 'dateAddedSecs': nowMs ~/ 1000, + 'dateModifiedMillis': dateModMs, + 'sourceDateTakenMillis': it.takenAtUtc?.millisecondsSinceEpoch, + + // ✅ durata video (ms) (può essere null per foto) + 'durationMillis': it.durationMillis, + + 'trashed': trashed, + 'origin': RemoteOrigin.value, + 'provider': provider, + + 'latitude': it.lat, + 'longitude': it.lng, + 'altitude': it.alt, + + 'remoteId': it.id, + 'remotePath': it.path, + 'remoteThumb1': it.thub1, + 'remoteThumb2': it.thub2, + 'remoteRotation': it.rotation ?? 0, + + 'remoteWidth': it.width ?? 0, + 'remoteHeight': it.height ?? 0, + }; + } + + Map<String, Object?> _buildAddressRow(int newId, RemoteLocation location) { + return <String, Object?>{ + 'id': newId, + 'addressLine': location.address, + 'countryCode': null, + 'countryName': location.country, + 'adminArea': location.region, + 'locality': location.city, + }; + } + + // ========================= + // Upsert a chunk + // ========================= + +Future<void> upsertAll(List<RemotePhotoItem> items, {int chunkSize = 200}) async { + final t0 = DateTime.now(); + debugPrint('[RemoteRepository] upsertAll start items=${items.length}'); + if (items.isEmpty) { + debugPrint('[RemoteRepository] upsertAll: no items, returning'); + return; + } + + await _withRetryBusy(() => _ensureEntryColumns(db)); + + // Protezione DB: crea indici unici dove mancano + await ensureUniqueRemoteId(); + await ensureUniqueRemotePath(); + + // Ordina: prima immagini, poi video + final images = <RemotePhotoItem>[]; + final videos = <RemotePhotoItem>[]; + for (final it in items) { + (_isVideoItem(it) ? videos : images).add(it); + } + final ordered = <RemotePhotoItem>[...images, ...videos]; + + for (var offset = 0; offset < ordered.length; offset += chunkSize) { + final end = (offset + chunkSize < ordered.length) ? offset + chunkSize : ordered.length; + final chunk = ordered.sublist(offset, end); + + try { + final chunkT0 = DateTime.now(); + await _withRetryBusy(() => db.transaction((txn) async { + final batch = txn.batch(); + + for (final it in chunk) { + final raw = it.path; + final norm = _normPath(raw); + final cand = _canonCandidate(raw, it.name); + debugPrint('[repo-upsert] in: rid=${it.id.substring(0, 8)} name=${it.name} raw="$raw"'); + + int? existingId; + + // 1) lookup per remoteId + try { + final existing = await txn.query( + 'entry', + columns: ['id'], + where: 'origin=? AND remoteId = ?', + whereArgs: [RemoteOrigin.value, it.id], + limit: 1, + ); + existingId = existing.isNotEmpty ? (existing.first['id'] as int?) : null; + } catch (e, st) { + debugPrint('[RemoteRepository] lookup by remoteId failed for remoteId=${it.id}: $e\n$st'); + } + + // 2) fallback per remotePath canonico + if (existingId == null) { + try { + final byCanon = await txn.query( + 'entry', + columns: ['id'], + where: 'origin=? AND remotePath = ?', + whereArgs: [RemoteOrigin.value, cand], + limit: 1, + ); + if (byCanon.isNotEmpty) existingId = byCanon.first['id'] as int?; + } catch (e, st) { + debugPrint('[RemoteRepository] lookup by canonical path failed "$cand": $e\n$st'); + } + } + + // 3) fallback per remotePath normalizzato + if (existingId == null) { + try { + final byNorm = await txn.query( + 'entry', + columns: ['id'], + where: 'origin=? AND remotePath = ?', + whereArgs: [RemoteOrigin.value, norm], + limit: 1, + ); + if (byNorm.isNotEmpty) existingId = byNorm.first['id'] as int?; + } catch (e, st) { + debugPrint('[RemoteRepository] lookup by normalized path failed "$norm": $e\n$st'); + } + } + + final row = _buildEntryRow(it, existingId: existingId); + + try { + batch.insert( + 'entry', + row, + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } on DatabaseException catch (e, st) { + debugPrint('[RemoteRepository] batch insert failed for remoteId=${it.id}: $e\n$st'); + + // fallback: rimuovi gps se causa problemi + final rowNoGps = Map<String, Object?>.from(row) + ..remove('latitude') + ..remove('longitude') + ..remove('altitude'); + + batch.insert( + 'entry', + rowNoGps, + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + } + + await batch.commit(noResult: true); + + // Secondo pass per address (se disponibile) + for (final it in chunk) { + if (it.location == null) continue; + + try { + final rows = await txn.query( + 'entry', + columns: ['id'], + where: 'origin=? AND remoteId = ?', + whereArgs: [RemoteOrigin.value, it.id], + limit: 1, + ); + if (rows.isEmpty) continue; + final newId = rows.first['id'] as int; + + final addr = _buildAddressRow(newId, it.location!); + await txn.insert( + 'address', + addr, + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } catch (e, st) { + debugPrint('[RemoteRepository] insert address failed for remoteId=${it.id}: $e\n$st'); + } + } + })); + + // log chunk timing e yield per permettere redraw UI + debugPrint('[RemoteRepository] upsert chunk $offset..${end - 1} committed size=${chunk.length} took=${DateTime.now().difference(chunkT0)}'); + // yield to event loop so UI can repaint between chunks + await Future.delayed(Duration.zero); + } catch (e, st) { + debugPrint('[RemoteRepository] upsert chunk $offset..${end - 1} ERROR: $e\n$st'); + rethrow; + } + } + + debugPrint('[RemoteRepository] upsertAll completed totalItems=${items.length} totalTime=${DateTime.now().difference(t0)}'); +} + + // ========================= + // Hard delete mirato (per deleted_hard progressive sync) + // ========================= + + /// Cancella (hard-delete) le entry remote con remoteId nei [remoteIds]. + /// Chunked per limiti SQLite sui bind parameters. + Future<int> deleteRemotesByRemoteIds(Set<String> remoteIds, {int chunkSize = 400}) async { + if (remoteIds.isEmpty) return 0; + + int deletedTotal = 0; + final ids = remoteIds.where((s) => s.trim().isNotEmpty).toList(growable: false); + + for (var i = 0; i < ids.length; i += chunkSize) { + final chunk = ids.sublist(i, (i + chunkSize > ids.length) ? ids.length : i + chunkSize); + final placeholders = List.filled(chunk.length, '?').join(','); + + final deleted = await db.rawDelete( + 'DELETE FROM entry WHERE origin=? AND remoteId IN ($placeholders)', + [RemoteOrigin.value, ...chunk], + ); + + deletedTotal += deleted; + } + + debugPrint('[RemoteRepository] deleteRemotesByRemoteIds deleted=$deletedTotal'); + return deletedTotal; + } + + // ========================= + // Unicità & deduplica + // ========================= + + Future<void> ensureUniqueRemoteId() async { + try { + await db.execute( + 'CREATE UNIQUE INDEX IF NOT EXISTS uq_entry_remote_remoteId ' + 'ON entry(remoteId) WHERE origin=${RemoteOrigin.value}', + ); + debugPrint('[RemoteRepository] ensured UNIQUE index on entry(remoteId) for origin=${RemoteOrigin.value}'); + } catch (e, st) { + debugPrint('[RemoteRepository] ensureUniqueRemoteId error: $e\n$st'); + } + } + + Future<void> ensureUniqueRemotePath() async { + try { + await db.execute( + 'CREATE UNIQUE INDEX IF NOT EXISTS uq_entry_remote_remotePath ' + 'ON entry(remotePath) WHERE origin=${RemoteOrigin.value} AND remotePath IS NOT NULL', + ); + debugPrint('[RemoteRepository] ensured UNIQUE index on entry(remotePath) for origin=${RemoteOrigin.value}'); + } catch (e, st) { + debugPrint('[RemoteRepository] ensureUniqueRemotePath error: $e\n$st'); + } + } + + Future<int> deduplicateRemotes() async { + try { + final deleted = await db.rawDelete( + 'DELETE FROM entry ' + 'WHERE origin=${RemoteOrigin.value} AND remoteId IS NOT NULL AND id NOT IN (' + ' SELECT MAX(id) FROM entry ' + ' WHERE origin=${RemoteOrigin.value} AND remoteId IS NOT NULL ' + ' GROUP BY remoteId' + ')', + ); + debugPrint('[RemoteRepository] deduplicateRemotes deleted=$deleted'); + return deleted; + } catch (e, st) { + debugPrint('[RemoteRepository] deduplicateRemotes error: $e\n$st'); + return 0; + } + } + + Future<int> deduplicateByRemotePath() async { + try { + final deleted = await db.rawDelete( + 'DELETE FROM entry ' + 'WHERE origin=${RemoteOrigin.value} AND remotePath IS NOT NULL AND id NOT IN (' + ' SELECT MAX(id) FROM entry ' + ' WHERE origin=${RemoteOrigin.value} AND remotePath IS NOT NULL ' + ' GROUP BY remotePath' + ')', + ); + debugPrint('[RemoteRepository] deduplicateByRemotePath deleted=$deleted'); + return deleted; + } catch (e, st) { + debugPrint('[RemoteRepository] deduplicateByRemotePath error: $e\n$st'); + return 0; + } + } + + // ========================= + // Bootstrap / prune remoti + // ========================= + + /// Bootstrap: cancella TUTTI i remoti + Future<int> deleteAllRemotes() async { + try { + final deleted = await db.rawDelete('DELETE FROM entry WHERE origin=${RemoteOrigin.value}'); + debugPrint('[RemoteRepository] deleteAllRemotes deleted=$deleted'); + return deleted; + } catch (e, st) { + debugPrint('[RemoteRepository] deleteAllRemotes error: $e\n$st'); + return 0; + } + } + + /// FULL sync: elimina i remoti NON più presenti nel serverRemoteIds (hard-delete) + Future<int> pruneMissingRemotes(Set<String> serverRemoteIds) async { + if (serverRemoteIds.isEmpty) return 0; + + try { + final deleted = await db.transaction((txn) async { + await txn.execute('CREATE TEMP TABLE IF NOT EXISTS tmp_remote_ids(remoteId TEXT PRIMARY KEY);'); + await txn.execute('DELETE FROM tmp_remote_ids;'); + + final batch = txn.batch(); + for (final id in serverRemoteIds) { + batch.insert( + 'tmp_remote_ids', + {'remoteId': id}, + conflictAlgorithm: ConflictAlgorithm.ignore, + ); + } + await batch.commit(noResult: true); + + final deleted = await txn.rawDelete(''' + DELETE FROM entry + WHERE origin=${RemoteOrigin.value} + AND remoteId IS NOT NULL + AND remoteId NOT IN (SELECT remoteId FROM tmp_remote_ids) + '''); + return deleted; + }); + + debugPrint('[RemoteRepository] pruneMissingRemotes deleted=$deleted'); + return deleted; + } catch (e, st) { + debugPrint('[RemoteRepository] pruneMissingRemotes error: $e\n$st'); + return 0; + } + } + + // ========================= + // Backfill URI fittizi per remoti legacy + // ========================= + + Future<void> backfillRemoteUris() async { + try { + final updated = await db.rawUpdate( + 'UPDATE entry ' + "SET uri = 'aves-remote://rid/' || replace(remoteId, ' ', '') " + "WHERE origin=${RemoteOrigin.value} AND (uri IS NULL OR trim(uri)='') AND remoteId IS NOT NULL", + ); + debugPrint('[RemoteRepository] backfill URIs via SQL (remoteId) updated=$updated'); + } catch (e, st) { + debugPrint('[RemoteRepository] backfill URIs (SQL) error: $e\n$st'); + } + + try { + final rows = await db.rawQuery( + 'SELECT id, remotePath FROM entry ' + "WHERE origin=${RemoteOrigin.value} AND (uri IS NULL OR trim(uri)='') " + "AND (remoteId IS NULL OR trim(remoteId)='') " + 'AND remotePath IS NOT NULL', + ); + + if (rows.isNotEmpty) { + for (final r in rows) { + final id = (r['id'] as num).toInt(); + final rp = (r['remotePath'] as String?) ?? ''; + final synthetic = RemoteDbUris.make(remotePath: rp); + await db.update( + 'entry', + {'uri': synthetic}, + where: 'id=?', + whereArgs: [id], + conflictAlgorithm: ConflictAlgorithm.ignore, + ); + } + debugPrint('[RemoteRepository] backfill URIs via Dart (remotePath) updated=${rows.length}'); + } + } catch (e, st) { + debugPrint('[RemoteRepository] backfill URIs (Dart) error: $e\n$st'); + } + } + + // ========================= + // Backfill essentials per remoti legacy + // ========================= + + Future<void> backfillRemoteEssentials() async { + try { + final rows = await db.rawQuery( + 'SELECT id, remoteId, remotePath FROM entry ' + 'WHERE origin=${RemoteOrigin.value} AND (contentId IS NULL OR contentId<=0)', + ); + if (rows.isNotEmpty) { + for (final r in rows) { + final id = (r['id'] as num).toInt(); + final rid = (r['remoteId'] as String?) ?? ''; + final rpath = (r['remotePath'] as String?) ?? ''; + final base = rid.isNotEmpty ? rid : rpath; + final h = base.hashCode & 0x7fffffff; + final cid = 1_000_000_000 + (h % 900_000_000); + await db.update('entry', {'contentId': cid}, where: 'id=?', whereArgs: [id]); + } + debugPrint('[RemoteRepository] backfill contentId updated=${rows.length}'); + } + } catch (e, st) { + debugPrint('[RemoteRepository] backfill contentId error: $e\n$st'); + } + + try { + final nowMs = DateTime.now().millisecondsSinceEpoch; + final updated = await db.rawUpdate( + 'UPDATE entry SET dateModifiedMillis = COALESCE(sourceDateTakenMillis, ?) ' + 'WHERE origin=${RemoteOrigin.value} AND (dateModifiedMillis IS NULL OR dateModifiedMillis=0)', + [nowMs], + ); + debugPrint('[RemoteRepository] backfill dateModifiedMillis updated=$updated'); + } catch (e, st) { + debugPrint('[RemoteRepository] backfill dateModifiedMillis error: $e\n$st'); + } + } + + Future<void> sanitizeRemotes() async { + await deduplicateRemotes(); + await deduplicateByRemotePath(); + await ensureUniqueRemoteId(); + await ensureUniqueRemotePath(); + await backfillRemoteUris(); + await backfillRemoteEssentials(); + } + + Future<int> countRemote() async { + final rows = await db.rawQuery('SELECT COUNT(1) AS c FROM entry WHERE origin=${RemoteOrigin.value}'); + return (rows.first['c'] as int?) ?? 0; + } +} diff --git a/lib/remote/remote_services.dart b/lib/remote/remote_services.dart new file mode 100644 index 0000000..81ffe1f --- /dev/null +++ b/lib/remote/remote_services.dart @@ -0,0 +1,5 @@ +import 'remote_ws_client.dart'; + +class RemoteServices { + static RemoteWsClient? wsClient; +} diff --git a/lib/remote/remote_settings.dart b/lib/remote/remote_settings.dart new file mode 100644 index 0000000..ba7c158 --- /dev/null +++ b/lib/remote/remote_settings.dart @@ -0,0 +1,148 @@ +// lib/remote/remote_settings.dart +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +class RemoteSettings { + static const _storage = FlutterSecureStorage( + aOptions: AndroidOptions( + encryptedSharedPreferences: true, + resetOnError: true, + ), + ); + + static const _kEnabled = 'remote_enabled'; + static const _kBaseUrl = 'remote_base_url'; + static const _kIndexPath = 'remote_index_path'; + static const _kEmail = 'remote_email'; + static const _kPassword = 'remote_password'; + + // ✅ NEW: WS URL + static const _kWsUrl = 'remote_ws_url'; + + // ✅ remote OFF by default ALWAYS + static const bool defaultEnabled = false; + + // ✅ in debug puoi precompilare credenziali/URL, ma NON attivare automaticamente + static const String defaultBaseUrl = kDebugMode ? 'https://prova.patachina.it' : ''; + static const String defaultIndexPath = kDebugMode ? 'photos/' : ''; + static const String defaultEmail = kDebugMode ? 'fabio@gmail.com' : ''; + static const String defaultPassword = kDebugMode ? 'master66' : ''; + + /// ✅ Deriva ws/wss URL dal baseUrl in modo coerente: + /// https://prova.patachina.it -> wss://prova-ws.patachina.it + /// http://prova.patachina.it -> ws://prova-ws.patachina.it + static String deriveWsUrlFromBase(String baseUrl) { + final uri = Uri.tryParse(baseUrl.trim()); + if (uri == null || uri.host.isEmpty) return ''; + + final scheme = (uri.scheme == 'http') ? 'ws' : 'wss'; + final parts = uri.host.split('.'); + if (parts.isEmpty) return '$scheme://${uri.host}'; + + // "prova" -> "prova-ws" + parts[0] = '${parts[0]}-ws'; + return '$scheme://${parts.join('.')}'; + } + + // ✅ default WS URL in debug: derivato dal defaultBaseUrl (coerente) + // In release: vuoto (utente lo inserisce se serve, altrimenti fallback su derivazione runtime). + static final String defaultWsUrl = kDebugMode ? deriveWsUrlFromBase(defaultBaseUrl) : ''; + + bool enabled; + String baseUrl; + String indexPath; + String email; + String password; + + /// WS URL opzionale. Se vuoto, il client può derivarlo da baseUrl (fallback). + String wsUrl; + + RemoteSettings({ + required this.enabled, + required this.baseUrl, + required this.indexPath, + required this.email, + required this.password, + required this.wsUrl, + }); + + static Future<String?> _readKeySafe(String key) async { + try { + return await _storage.read(key: key); + } on PlatformException { + await _storage.delete(key: key); + return null; + } + } + + static String _sanitizeUrl(String s) { + const _invisibles = r'[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]'; + final cleaned = s.replaceAll(RegExp(_invisibles), ''); + return cleaned.trim(); + } + + static Future<RemoteSettings> load() async { + final enabledStr = await _readKeySafe(_kEnabled); + final rawBase = await _readKeySafe(_kBaseUrl); + final indexPath = await _readKeySafe(_kIndexPath) ?? defaultIndexPath; + final email = await _readKeySafe(_kEmail) ?? defaultEmail; + final password = await _readKeySafe(_kPassword) ?? defaultPassword; + + // ✅ NEW: wsUrl + final rawWs = await _readKeySafe(_kWsUrl) ?? defaultWsUrl; + + // ✅ defaultEnabled è false sempre + final enabled = (enabledStr ?? (defaultEnabled ? 'true' : 'false')) == 'true'; + final baseUrl = _sanitizeUrl(rawBase ?? defaultBaseUrl); + final wsUrl = _sanitizeUrl(rawWs); + + return RemoteSettings( + enabled: enabled, + baseUrl: baseUrl, + indexPath: indexPath, + email: email, + password: password, + wsUrl: wsUrl, + ); + } + + Future<void> save() async { + await _storage.write(key: _kEnabled, value: enabled ? 'true' : 'false'); + await _storage.write(key: _kBaseUrl, value: _sanitizeUrl(baseUrl)); + await _storage.write(key: _kIndexPath, value: indexPath.trim()); + await _storage.write(key: _kEmail, value: email.trim()); + await _storage.write(key: _kPassword, value: password); + + // ✅ NEW + await _storage.write(key: _kWsUrl, value: _sanitizeUrl(wsUrl)); + } + + static Future<void> debugSeedIfEmpty() async { + if (!kDebugMode) return; + + Future<void> _seed(String key, String value) async { + try { + final existing = await _storage.read(key: key); + if (existing == null) { + await _storage.write(key: key, value: value); + } + } on PlatformException { + await _storage.delete(key: key); + await _storage.write(key: key, value: value); + } + } + + // ✅ anche in debug: remote parte SPENTO + await _seed(_kEnabled, 'false'); + + // ✅ precompila gli altri campi per comodità + await _seed(_kBaseUrl, defaultBaseUrl); + await _seed(_kIndexPath, defaultIndexPath); + await _seed(_kEmail, defaultEmail); + await _seed(_kPassword, defaultPassword); + + // ✅ NEW: precompila wsUrl derivato dal defaultBaseUrl + await _seed(_kWsUrl, defaultWsUrl); + } +} diff --git a/lib/remote/remote_settings_dialog.dart b/lib/remote/remote_settings_dialog.dart new file mode 100644 index 0000000..2eb700c --- /dev/null +++ b/lib/remote/remote_settings_dialog.dart @@ -0,0 +1,326 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/remote/collection_source_remote_ext.dart'; // appendRemoteEntriesFromDb() +import 'package:aves/remote/remote_controller.dart'; +import 'package:aves/remote/remote_settings.dart'; +import 'package:aves/remote/remote_http.dart'; +import 'package:aves/remote/remote_sync_bus.dart'; + +import 'remote_origin.dart'; +import 'remote_state_store.dart'; + +class RemoteSettingsDialog { + static Future<void> show(BuildContext context) async { + final s = await RemoteSettings.load(); + + final formKey = GlobalKey<FormState>(); + + bool enabled = s.enabled; + + final baseUrlC = TextEditingController(text: s.baseUrl); + final wsUrlC = TextEditingController(text: s.wsUrl); + final indexC = TextEditingController(text: s.indexPath); + final emailC = TextEditingController(text: s.email); + final pwC = TextEditingController(text: s.password); + + final store = RemoteStateStore(); + + String deriveWsUrl(String baseUrl) { + final uri = Uri.tryParse(baseUrl.trim()); + if (uri == null) return ''; + final host = uri.host; + final scheme = uri.scheme == 'http' ? 'ws' : 'wss'; + final parts = host.split('.'); + if (parts.isEmpty) return '$scheme://$host'; + parts[0] = '${parts[0]}-ws'; + return '$scheme://${parts.join('.')}'; + } + + // AUTO se vuoto o uguale al derivato + bool wsUrlAuto = wsUrlC.text.trim().isEmpty || + wsUrlC.text.trim() == deriveWsUrl(baseUrlC.text.trim()); + bool updatingWs = false; + String lastBaseForWs = baseUrlC.text.trim(); + + String resolvedWsUrlForUi() { + final w = wsUrlC.text.trim(); + if (w.isNotEmpty) return w; + return deriveWsUrl(baseUrlC.text.trim()); + } + + String? validateBaseUrl(String? v) { + final txt = (v ?? '').trim(); + if (txt.isEmpty) return 'Obbligatorio'; + final uri = Uri.tryParse(txt); + if (uri == null || !(uri.hasScheme && (uri.scheme == 'http' || uri.scheme == 'https'))) { + return 'URL non valida (deve iniziare con http/https)'; + } + if (RegExp(r'[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]').hasMatch(txt)) { + return 'URL contiene caratteri non validi (invisibili)'; + } + return null; + } + + String? validateWsUrl(String? v) { + final txt = (v ?? '').trim(); + if (txt.isEmpty) return null; + final uri = Uri.tryParse(txt); + if (uri == null || !(uri.hasScheme && (uri.scheme == 'ws' || uri.scheme == 'wss'))) { + return 'WS URL non valida (deve iniziare con ws/wss)'; + } + if (RegExp(r'[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]').hasMatch(txt)) { + return 'WS URL contiene caratteri non validi (invisibili)'; + } + return null; + } + + String? validateIndex(String? v) { + final txt = (v ?? '').trim(); + if (txt.isEmpty) return 'Obbligatorio'; + return null; + } + + Future<void> applyRuntimeEffects({ + required bool newEnabled, + required bool oldEnabled, + }) async { + CollectionSource? source; + try { + source = context.read<CollectionSource>(); + } catch (_) { + source = null; + } + + if (!newEnabled) { + RemoteSyncBus.instance.setDisabled(); + if (source != null) { + final remotesInMemory = + source.allEntries.where((e) => e.origin == RemoteOrigin.value).toSet(); + if (remotesInMemory.isNotEmpty) { + source.removeEntriesFromMemory(remotesInMemory); + } + await RemoteController.instance.onAppStart( + source: source, + resumeBootstrapIfEnabled: false, + ); + } + return; + } + + if (source == null) { + await RemoteController.instance.initBusFromSettings(); + return; + } + + await source.appendRemoteEntriesFromDb(); + await RemoteController.instance.initBusFromSettings(); + + await RemoteController.instance.onAppStart( + source: source, + resumeBootstrapIfEnabled: false, + ); + } + + Widget kv(String k, String v) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: 135, + child: Text(k, style: const TextStyle(fontWeight: FontWeight.w600)), + ), + Expanded(child: SelectableText(v)), + ], + ); + } + + Widget buildDebugPanel(StateSetter setStateDialog) { + final resolvedWs = resolvedWsUrlForUi(); + + return Card( + elevation: 0, + child: ExpansionTile( + title: const Text('Debug (WS / Sync)'), + subtitle: const Text('Stato runtime, sessione WS, lastSync, ring buffer'), + childrenPadding: const EdgeInsets.fromLTRB(16, 0, 16, 16), + children: [ + ValueListenableBuilder<RemoteSyncState>( + valueListenable: RemoteSyncBus.instance.stateNotifier, + builder: (context, st, _) => kv('Sync state', st.name), + ), + const SizedBox(height: 6), + kv('WS URL (usato)', resolvedWs.isEmpty ? '—' : resolvedWs), + const SizedBox(height: 6), + kv('WS URL mode', wsUrlAuto ? 'AUTO (segue Base URL)' : 'MANUAL'), + const SizedBox(height: 6), + FutureBuilder<String?>( + future: store.getLastSyncIso(), + builder: (context, snap) { + final v = snap.data; + return kv('lastSyncIso', (v == null || v.isEmpty) ? '—' : v); + }, + ), + const SizedBox(height: 6), + FutureBuilder<String>( + future: store.getOrCreateSessionId(), + builder: (context, snap) { + final v = snap.data; + return kv('ws_session_id', (v == null || v.isEmpty) ? '—' : v); + }, + ), + const SizedBox(height: 6), + FutureBuilder<List<String>>( + future: store.loadProcessedRing(), + builder: (context, snap) { + final n = snap.data?.length ?? 0; + return kv('processed_ring', '$n'); + }, + ), + const SizedBox(height: 10), + const Text( + 'Note:\n' + '• AUTO: wsUrl segue Base URL.\n' + '• MANUAL: wsUrl non viene modificato.\n' + '• Cancellando wsUrl torni in AUTO.', + style: TextStyle(fontSize: 12), + ), + ], + ), + ); + } + + await showDialog<void>( + context: context, + builder: (_) => StatefulBuilder( + builder: (context, setStateDialog) => AlertDialog( + title: const Text('Remote Settings'), + content: Form( + key: formKey, + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SwitchListTile( + title: const Text('Abilita remote'), + value: enabled, + onChanged: (v) => setStateDialog(() => enabled = v), + contentPadding: EdgeInsets.zero, + ), + const SizedBox(height: 8), + + TextFormField( + controller: baseUrlC, + decoration: const InputDecoration(labelText: 'Base URL'), + validator: validateBaseUrl, + onChanged: (v) { + final base = v.trim(); + if (base.isEmpty) return; + if (base == lastBaseForWs) return; + + if (wsUrlAuto) { + final derived = deriveWsUrl(base); + updatingWs = true; + wsUrlC.text = derived; + updatingWs = false; + setStateDialog(() {}); + } + + lastBaseForWs = base; + }, + ), + const SizedBox(height: 8), + + TextFormField( + controller: wsUrlC, + decoration: const InputDecoration( + labelText: 'WebSocket URL (opzionale)', + hintText: 'wss://example-ws.org', + ), + validator: validateWsUrl, + onChanged: (v) { + if (updatingWs) return; + + final txt = v.trim(); + + if (txt.isEmpty) { + wsUrlAuto = true; + setStateDialog(() {}); + return; + } + + wsUrlAuto = false; + setStateDialog(() {}); + }, + ), + const SizedBox(height: 8), + + TextFormField( + controller: indexC, + decoration: const InputDecoration(labelText: 'Index path'), + validator: validateIndex, + ), + const SizedBox(height: 8), + TextFormField( + controller: emailC, + decoration: const InputDecoration(labelText: 'User/Email'), + ), + const SizedBox(height: 8), + TextFormField( + controller: pwC, + obscureText: true, + decoration: const InputDecoration(labelText: 'Password'), + ), + const SizedBox(height: 12), + + buildDebugPanel(setStateDialog), + ], + ), + ), + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).maybePop(), + child: const Text('Annulla'), + ), + ElevatedButton.icon( + onPressed: () async { + if (!formKey.currentState!.validate()) return; + + final oldEnabled = s.enabled; + final newEnabled = enabled; + + final upd = RemoteSettings( + enabled: newEnabled, + baseUrl: baseUrlC.text.trim(), + indexPath: indexC.text.trim(), + email: emailC.text.trim(), + password: pwC.text, + wsUrl: wsUrlC.text.trim(), + ); + + await upd.save(); + + await RemoteHttp.refreshFromSettings(); + await RemoteHttp.warmUp(); + + await applyRuntimeEffects(newEnabled: newEnabled, oldEnabled: oldEnabled); + + if (context.mounted) Navigator.of(context).pop(); + }, + icon: const Icon(Icons.save), + label: const Text('Salva'), + ), + ], + ), + ), + ); + + baseUrlC.dispose(); + wsUrlC.dispose(); + indexC.dispose(); + emailC.dispose(); + pwC.dispose(); + } +} diff --git a/lib/remote/remote_settings_page.dart b/lib/remote/remote_settings_page.dart new file mode 100644 index 0000000..321d665 --- /dev/null +++ b/lib/remote/remote_settings_page.dart @@ -0,0 +1,437 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/remote/collection_source_remote_ext.dart'; // per appendRemoteEntriesFromDb() +import 'package:aves/remote/remote_controller.dart'; +import 'package:aves/remote/remote_sync_bus.dart'; + +import 'remote_settings.dart'; +import 'remote_http.dart'; +import 'remote_origin.dart'; + +// debug store +import 'remote_state_store.dart'; + +class RemoteSettingsPage extends StatefulWidget { + const RemoteSettingsPage({super.key}); + + @override + State<RemoteSettingsPage> createState() => _RemoteSettingsPageState(); +} + +class _RemoteSettingsPageState extends State<RemoteSettingsPage> { + final _form = GlobalKey<FormState>(); + + bool _loaded = false; + bool _saving = false; + + bool _enabled = RemoteSettings.defaultEnabled; + final _baseUrl = TextEditingController(text: RemoteSettings.defaultBaseUrl); + final _indexPath = TextEditingController(text: RemoteSettings.defaultIndexPath); + final _email = TextEditingController(); + final _password = TextEditingController(); + + // ✅ WS URL (opzionale) + final _wsUrl = TextEditingController(text: RemoteSettings.defaultWsUrl); + + // ✅ Debug store + final _store = RemoteStateStore(); + + // ✅ Auto-mode tracking for wsUrl + bool _wsUrlAuto = true; + bool _updatingWsUrl = false; + String _lastBaseUrlForWs = ''; + + @override + void initState() { + super.initState(); + _baseUrl.addListener(_onBaseUrlChanged); + _wsUrl.addListener(_onWsUrlChanged); + _load(); + } + + @override + void dispose() { + _baseUrl.removeListener(_onBaseUrlChanged); + _wsUrl.removeListener(_onWsUrlChanged); + + _baseUrl.dispose(); + _indexPath.dispose(); + _email.dispose(); + _password.dispose(); + _wsUrl.dispose(); + super.dispose(); + } + + Future<void> _load() async { + try { + final s = await RemoteSettings.load(); + if (!mounted) return; + + setState(() { + _enabled = s.enabled; + _baseUrl.text = s.baseUrl; + _indexPath.text = s.indexPath; + _email.text = s.email; + _password.text = s.password; + _wsUrl.text = s.wsUrl; + _loaded = true; + }); + + // init auto-mode after controllers are filled + _lastBaseUrlForWs = _baseUrl.text.trim(); + final currentWs = _wsUrl.text.trim(); + final derived = _deriveWsUrl(_lastBaseUrlForWs); + _wsUrlAuto = currentWs.isEmpty || currentWs == derived; + } catch (e) { + _showSnack('Impossibile leggere le impostazioni sicure: $e'); + if (!mounted) return; + + setState(() { + _enabled = RemoteSettings.defaultEnabled; + _baseUrl.text = RemoteSettings.defaultBaseUrl; + _indexPath.text = RemoteSettings.defaultIndexPath; + _email.text = ''; + _password.text = ''; + _wsUrl.text = RemoteSettings.defaultWsUrl; + _loaded = true; + }); + + _lastBaseUrlForWs = _baseUrl.text.trim(); + final currentWs = _wsUrl.text.trim(); + final derived = _deriveWsUrl(_lastBaseUrlForWs); + _wsUrlAuto = currentWs.isEmpty || currentWs == derived; + } + } + + // ---------- validators ---------- + + String? _validateBaseUrl(String? v) { + final s = (v ?? '').trim(); + if (s.isEmpty) return 'Obbligatorio'; + final uri = Uri.tryParse(s); + if (uri == null || !(uri.hasScheme && (uri.scheme == 'http' || uri.scheme == 'https'))) { + return 'URL non valida (deve iniziare con http/https)'; + } + if (RegExp(r'[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]').hasMatch(s)) { + return 'URL contiene caratteri non validi (invisibili)'; + } + return null; + } + + String? _validateIndex(String? v) { + final s = (v ?? '').trim(); + if (s.isEmpty) return 'Obbligatorio'; + return null; + } + + String? _validateWsUrl(String? v) { + final s = (v ?? '').trim(); + if (s.isEmpty) return null; // vuoto = derivazione automatica + final uri = Uri.tryParse(s); + if (uri == null || !(uri.hasScheme && (uri.scheme == 'ws' || uri.scheme == 'wss'))) { + return 'WS URL non valida (deve iniziare con ws/wss)'; + } + if (RegExp(r'[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]').hasMatch(s)) { + return 'WS URL contiene caratteri non validi (invisibili)'; + } + return null; + } + + // ---------- ws url derive + auto-update ---------- + + String _deriveWsUrl(String baseUrl) { + final uri = Uri.tryParse(baseUrl.trim()); + if (uri == null) return ''; + final host = uri.host; + final scheme = uri.scheme == 'http' ? 'ws' : 'wss'; + + final parts = host.split('.'); + if (parts.isEmpty) return '$scheme://$host'; + + parts[0] = '${parts[0]}-ws'; + return '$scheme://${parts.join('.')}'; + } + + void _onWsUrlChanged() { + if (_updatingWsUrl) return; + + final txt = _wsUrl.text.trim(); + + // Se l'utente cancella -> torna automatico + if (txt.isEmpty) { + _wsUrlAuto = true; + return; + } + + // Se l'utente scrive qualcosa -> manuale + _wsUrlAuto = false; + } + + void _onBaseUrlChanged() { + final base = _baseUrl.text.trim(); + if (base.isEmpty) return; + + // evita rumore: aggiorna solo se davvero cambiato + if (base == _lastBaseUrlForWs) return; + + if (_wsUrlAuto) { + final derived = _deriveWsUrl(base); + _updatingWsUrl = true; + _wsUrl.text = derived; + _updatingWsUrl = false; + } + + _lastBaseUrlForWs = base; + } + + String _resolvedWsUrlForUi() { + final ws = _wsUrl.text.trim(); + if (ws.isNotEmpty) return ws; + return _deriveWsUrl(_baseUrl.text.trim()); + } + + // ---------- runtime effects ---------- + + Future<void> _applyRuntimeEffects() async { + try { + final source = context.read<CollectionSource>(); + + if (!_enabled) { + final remotesInMemory = + source.allEntries.where((e) => e.origin == RemoteOrigin.value).toSet(); + if (remotesInMemory.isNotEmpty) { + source.removeEntriesFromMemory(remotesInMemory); + } + RemoteSyncBus.instance.setDisabled(); + } else { + await source.appendRemoteEntriesFromDb(); + await RemoteController.instance.initBusFromSettings(); + } + + // Delego al controller la gestione completa (WS/progressive) + await RemoteController.instance.onAppStart( + source: source, + resumeBootstrapIfEnabled: false, + ); + } catch (_) { + // ignore: se non c'è CollectionSource nel contesto + } + } + + Future<void> _save() async { + if (!(_form.currentState?.validate() ?? false)) return; + + setState(() => _saving = true); + try { + final s = RemoteSettings( + enabled: _enabled, + baseUrl: _baseUrl.text.trim(), + indexPath: _indexPath.text.trim(), + email: _email.text.trim(), + password: _password.text, + wsUrl: _wsUrl.text.trim(), + ); + + await s.save(); + + await RemoteHttp.refreshFromSettings(); + await RemoteHttp.warmUp(); + + await _applyRuntimeEffects(); + + if (!mounted) return; + _showSnack('Impostazioni remote salvate'); + Navigator.of(context).maybePop(); + } catch (e) { + if (!mounted) return; + _showSnack('Salvataggio fallito: $e'); + } finally { + if (mounted) setState(() => _saving = false); + } + } + + void _showSnack(String msg) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + behavior: SnackBarBehavior.fixed, + content: Text(msg), + duration: const Duration(seconds: 3), + ), + ); + } + + Widget _kv(String k, String v) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: 150, + child: Text( + k, + style: const TextStyle(fontWeight: FontWeight.w600), + ), + ), + Expanded( + child: SelectableText(v), + ), + ], + ); + } + + Widget _buildDebugPanel() { + final resolvedWs = _resolvedWsUrlForUi(); + + return Card( + elevation: 0, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + child: ExpansionTile( + title: const Text('Debug (WS / Sync)'), + subtitle: const Text('Stato runtime, sessione WS, lastSync, ring buffer'), + childrenPadding: const EdgeInsets.fromLTRB(16, 0, 16, 16), + children: [ + ValueListenableBuilder<RemoteSyncState>( + valueListenable: RemoteSyncBus.instance.stateNotifier, + builder: (context, st, _) => _kv('Sync state', st.name), + ), + const SizedBox(height: 6), + _kv('WS URL (usato)', resolvedWs.isEmpty ? '—' : resolvedWs), + const SizedBox(height: 6), + _kv('WS URL mode', _wsUrlAuto ? 'AUTO (segue Base URL)' : 'MANUAL'), + const SizedBox(height: 6), + FutureBuilder<String?>( + future: _store.getLastSyncIso(), + builder: (context, snap) { + final v = snap.data; + return _kv('lastSyncIso', (v == null || v.isEmpty) ? '—' : v); + }, + ), + const SizedBox(height: 6), + FutureBuilder<String>( + future: _store.getOrCreateSessionId(), + builder: (context, snap) { + final v = snap.data; + return _kv('ws_session_id', (v == null || v.isEmpty) ? '—' : v); + }, + ), + const SizedBox(height: 6), + FutureBuilder<List<String>>( + future: _store.loadProcessedRing(), + builder: (context, snap) { + final n = snap.data?.length ?? 0; + return _kv('processed_events_ring', '$n'); + }, + ), + const SizedBox(height: 12), + const Divider(), + const Text( + 'Note:\n' + '• Se WS URL è vuoto oppure coincide col derivato, resta in AUTO.\n' + '• Se scrivi WS URL manualmente, passa in MANUAL e non viene più toccato.\n' + '• Cancellando WS URL torni in AUTO.', + style: TextStyle(fontSize: 12), + ), + ], + ), + ); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + appBar: AppBar(title: const Text('Remote Settings')), + body: !_loaded + ? const Center(child: CircularProgressIndicator()) + : AbsorbPointer( + absorbing: _saving, + child: Form( + key: _form, + child: ListView( + padding: const EdgeInsets.all(16), + children: [ + SwitchListTile( + title: const Text('Abilita sync remoto'), + value: _enabled, + onChanged: (v) => setState(() => _enabled = v), + ), + const SizedBox(height: 8), + TextFormField( + controller: _baseUrl, + decoration: const InputDecoration( + labelText: 'Base URL (es. https://server.tld)', + hintText: 'https://example.org', + ), + keyboardType: TextInputType.url, + autovalidateMode: AutovalidateMode.onUserInteraction, + validator: _validateBaseUrl, + ), + const SizedBox(height: 12), + TextFormField( + controller: _wsUrl, + decoration: const InputDecoration( + labelText: 'WebSocket URL (opzionale)', + hintText: 'wss://example-ws.org', + ), + keyboardType: TextInputType.url, + autovalidateMode: AutovalidateMode.onUserInteraction, + validator: _validateWsUrl, + ), + const SizedBox(height: 12), + TextFormField( + controller: _indexPath, + decoration: const InputDecoration( + labelText: 'Index path (es. photos/)', + hintText: 'photos/', + ), + autovalidateMode: AutovalidateMode.onUserInteraction, + validator: _validateIndex, + ), + const SizedBox(height: 12), + TextFormField( + controller: _email, + decoration: const InputDecoration( + labelText: 'User/Email', + hintText: 'utente@example.org', + ), + keyboardType: TextInputType.emailAddress, + ), + const SizedBox(height: 12), + TextFormField( + controller: _password, + obscureText: true, + decoration: const InputDecoration( + labelText: 'Password', + ), + ), + const SizedBox(height: 16), + _buildDebugPanel(), + const SizedBox(height: 20), + SizedBox( + width: double.infinity, + child: ElevatedButton.icon( + onPressed: _saving ? null : _save, + icon: _saving + ? SizedBox( + width: 18, + height: 18, + child: CircularProgressIndicator( + strokeWidth: 2, + valueColor: AlwaysStoppedAnimation<Color>( + theme.colorScheme.onPrimary, + ), + ), + ) + : const Icon(Icons.save), + label: Text(_saving ? 'Salvataggio in corso...' : 'Salva'), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/remote/remote_state_store.dart b/lib/remote/remote_state_store.dart new file mode 100644 index 0000000..4eff3b4 --- /dev/null +++ b/lib/remote/remote_state_store.dart @@ -0,0 +1,144 @@ +import 'dart:convert'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:uuid/uuid.dart'; + +class RemoteStateStore { + static const _storage = FlutterSecureStorage( + aOptions: AndroidOptions( + encryptedSharedPreferences: true, + resetOnError: true, + ), + ); + + static const _kWsSessionId = 'ws_session_id'; + static const _kDeviceId = 'device_id'; + static const _kProcessedRing = 'ws_processed_events_ring'; + static const _kLastSyncIso = 'remote_last_sync_iso'; + + // ✅ NEW: last seen timestamp (ms) come sync.js: ws_last_seen + static const _kWsLastSeenMs = 'ws_last_seen_ms'; + + // --------------------------- + // WS session id + // --------------------------- + + Future<String> getOrCreateSessionId() async { + var id = await _storage.read(key: _kWsSessionId); + if (id == null || id.isEmpty) { + id = const Uuid().v4(); + await _storage.write(key: _kWsSessionId, value: id); + } + return id; + } + + Future<void> clearSessionId() => _storage.delete(key: _kWsSessionId); + + /// ✅ Alias “sync.js-like”: reset session id (usato quando sessione dormiente > 2 min) + Future<void> resetSessionId() => clearSessionId(); + + // --------------------------- + // Last sync ISO + // --------------------------- + + Future<String?> getLastSyncIso() => _storage.read(key: _kLastSyncIso); + + Future<void> setLastSyncIso(String iso) => + _storage.write(key: _kLastSyncIso, value: iso); + + // --------------------------- + // WS last seen (ms) + // --------------------------- + + /// Ritorna l’ultimo timestamp (ms) in cui abbiamo ricevuto un messaggio WS. + Future<int> getWsLastSeenMs() async { + final raw = await _storage.read(key: _kWsLastSeenMs); + if (raw == null || raw.isEmpty) return 0; + final v = int.tryParse(raw); + return v ?? 0; + } + + /// Salva l’ultimo timestamp (ms) in cui abbiamo ricevuto un messaggio WS. + Future<void> setWsLastSeenMs(int ms) async { + await _storage.write(key: _kWsLastSeenMs, value: ms.toString()); + } + + Future<void> clearWsLastSeenMs() => _storage.delete(key: _kWsLastSeenMs); + + // --------------------------- + // Processed events ring + // --------------------------- + + Future<List<String>> loadProcessedRing({int maxSize = 2000}) async { + final raw = await _storage.read(key: _kProcessedRing); + if (raw == null || raw.isEmpty) return <String>[]; + try { + final v = jsonDecode(raw); + if (v is List) { + final list = v.whereType<String>().toList(); + return list.length > maxSize ? list.sublist(list.length - maxSize) : list; + } + } catch (_) {} + return <String>[]; + } + + Future<void> saveProcessedRing(List<String> ring, {int maxSize = 2000}) async { + final trimmed = ring.length > maxSize ? ring.sublist(ring.length - maxSize) : ring; + await _storage.write(key: _kProcessedRing, value: jsonEncode(trimmed)); + } + +// --------------------------- +// Device ID (persistente) +// --------------------------- + +Future<String> getOrCreateDeviceId() async { + var id = await _storage.read(key: _kDeviceId); + if (id == null || id.isEmpty) { + id = const Uuid().v4(); + await _storage.write(key: _kDeviceId, value: id); + } + return id; +} + +// Alias richiesti dal RemoteSyncEngine +Future<String> getSessionId() => getOrCreateSessionId(); +Future<String> getDeviceId() => getOrCreateDeviceId(); + +} + +class EventRingDeduper { + EventRingDeduper(this.store, {this.maxSize = 2000}); + + final RemoteStateStore store; + final int maxSize; + + final List<String> _ring = []; + final Set<String> _set = {}; + + Future<void> init() async { + final saved = await store.loadProcessedRing(maxSize: maxSize); + _ring + ..clear() + ..addAll(saved); + _set + ..clear() + ..addAll(saved); + } + + bool has(String? id) => id != null && id.isNotEmpty && _set.contains(id); + + Future<void> mark(String? id) async { + if (id == null || id.isEmpty) return; + if (_set.contains(id)) return; + + _ring.add(id); + _set.add(id); + + while (_ring.length > maxSize) { + final old = _ring.removeAt(0); + _set.remove(old); + } + + await store.saveProcessedRing(_ring, maxSize: maxSize); + } + +} diff --git a/lib/remote/remote_sync_bus.dart b/lib/remote/remote_sync_bus.dart new file mode 100644 index 0000000..6519e77 --- /dev/null +++ b/lib/remote/remote_sync_bus.dart @@ -0,0 +1,104 @@ +// lib/remote/remote_sync_bus.dart +import 'package:flutter/foundation.dart'; + +enum RemoteSyncState { + disabled, + syncing, + upToDate, + timeout, + networkError, + badGateway, + serverError, + serverDown, +} + +class RemoteSyncProgress { + final int done; + final int total; + final bool showOverlay; + + const RemoteSyncProgress({ + required this.done, + required this.total, + this.showOverlay = false, + }); +} + +class RemoteSyncBus { + RemoteSyncBus._(); + static final RemoteSyncBus instance = RemoteSyncBus._(); + + final ValueNotifier<RemoteSyncState> stateNotifier = + ValueNotifier(RemoteSyncState.disabled); + + final ValueNotifier<RemoteSyncProgress?> progressNotifier = + ValueNotifier(null); + + int _opId = 0; + + int nextOp() => ++_opId; + bool _isStale(int opId) => opId != _opId; + + void setDisabled() { + _opId++; + stateNotifier.value = RemoteSyncState.disabled; + progressNotifier.value = null; + } + + int start({required int total, required bool showOverlay}) { + final opId = nextOp(); + stateNotifier.value = RemoteSyncState.syncing; + progressNotifier.value = RemoteSyncProgress( + done: 0, + total: total, + showOverlay: showOverlay, + ); + return opId; + } + + void update({required int opId, required int done, required int total}) { + if (_isStale(opId)) return; + final cur = progressNotifier.value; + progressNotifier.value = RemoteSyncProgress( + done: done, + total: total, + showOverlay: cur?.showOverlay ?? false, + ); + } + + void finishUpToDate({required int opId}) { + if (_isStale(opId)) return; + stateNotifier.value = RemoteSyncState.upToDate; + progressNotifier.value = null; + } + + void failTimeout({required int opId}) { + if (_isStale(opId)) return; + stateNotifier.value = RemoteSyncState.timeout; + progressNotifier.value = null; + } + + void failNetwork({required int opId}) { + if (_isStale(opId)) return; + stateNotifier.value = RemoteSyncState.networkError; + progressNotifier.value = null; + } + + void failBadGateway({required int opId}) { + if (_isStale(opId)) return; + stateNotifier.value = RemoteSyncState.badGateway; + progressNotifier.value = null; + } + + void failServerError({required int opId}) { + if (_isStale(opId)) return; + stateNotifier.value = RemoteSyncState.serverError; + progressNotifier.value = null; + } + + void failServerDown({required int opId}) { + if (_isStale(opId)) return; + stateNotifier.value = RemoteSyncState.serverDown; + progressNotifier.value = null; + } +} diff --git a/lib/remote/remote_sync_engine.dart b/lib/remote/remote_sync_engine.dart new file mode 100644 index 0000000..9df2f55 --- /dev/null +++ b/lib/remote/remote_sync_engine.dart @@ -0,0 +1,341 @@ +import 'package:flutter/foundation.dart'; +import 'package:aves/model/source/collection_source.dart'; + +import 'remote_http_api.dart'; +import 'remote_models.dart'; +import 'remote_repository.dart'; +import 'remote_state_store.dart'; + +import 'package:aves/remote/collection_source_remote_ext.dart'; +import 'package:aves/remote/collection_source_remote_ws_ext.dart'; +import 'package:aves/remote/remote_controller.dart'; + + +class RemoteSyncEngine { + RemoteSyncEngine({ + required this.api, + required this.repo, + required this.source, + required this.state, + }); + + final RemoteHttpApi api; + final RemoteRepository repo; + final CollectionSource source; + final RemoteStateStore state; + + static const int retentionDays = 30; + static const Duration overlap = Duration(seconds: 3); + + bool _syncInFlight = false; + bool _pendingSync = false; + + bool _isTooOld(String iso) { + final t = DateTime.tryParse(iso); + if (t == null) return true; + return DateTime.now().toUtc().difference(t.toUtc()).inDays > retentionDays; + } + + String _applyOverlap(String iso) { + final t = DateTime.tryParse(iso); + if (t == null) return iso; + return t.toUtc().subtract(overlap).toIso8601String(); + } + + + // ------------------------------------------------------------ + // Public API + // ------------------------------------------------------------ + + Future<void> progressiveSync() async { + return _runExclusive(() async { + final last = await state.getLastSyncIso(); + + if (last == null || last.isEmpty || _isTooOld(last)) { + await fullSyncImpl(); + return; + } + + await _deltaSyncImpl(_applyOverlap(last)); + }); + } + + Future<void> progressiveSyncFrom(String sinceIso) async { + return _runExclusive(() async { + if (sinceIso.isEmpty || _isTooOld(sinceIso)) { + await fullSyncImpl(); + return; + } + + await _deltaSyncImpl(_applyOverlap(sinceIso)); + }); + } + + // ------------------------------------------------------------ + // FULL SYNC (senza _runExclusive) + // ------------------------------------------------------------ + +Future<void> fullSyncImpl() async { + debugPrint('[remote] fullSync start'); + + final list = await api.getAllPhotos(); + final items = list.map(RemotePhotoItem.fromJson).toList(); + + // decide se siamo in bootstrap (solo in quel caso deleteAllRemotes) + final isBootstrap = !(await RemoteController.instance.bootstrapDone()); + final serverIds = items.map((e) => e.id).where((v) => v.isNotEmpty).toSet(); + + if (isBootstrap) { + debugPrint('[remote] fullSync bootstrap -> deleteAllRemotes'); + await repo.deleteAllRemotes(); + } else { + debugPrint('[remote] fullSync incremental -> no deleteAllRemotes'); + } + + // upsert chunked con yield per non bloccare il main thread + const int chunk = 40; // prova 40, abbassa a 20 se serve + final t0 = DateTime.now(); + for (var i = 0; i < items.length; i += chunk) { + final end = (i + chunk < items.length) ? i + chunk : items.length; + final sub = items.sublist(i, end); + final chunkT0 = DateTime.now(); + await repo.upsertAll(sub, chunkSize: chunk); + debugPrint('[remote] fullSync upsert chunk $i..${end - 1} size=${sub.length} took=${DateTime.now().difference(chunkT0)}'); + // yield per permettere redraw UI + await Future.delayed(const Duration(milliseconds: 20)); + } + debugPrint('[remote] fullSync upsertAll total=${items.length} totalTime=${DateTime.now().difference(t0)}'); + + // se non era bootstrap, rimuovi i remoti mancanti (prune) + if (!isBootstrap) { + final pruned = await repo.pruneMissingRemotes(serverIds); + debugPrint('[remote] fullSync pruneMissingRemotes deleted=$pruned'); + } + + // append remoti in collection (collection batching dovrebbe gestire il carico) + await source.appendRemoteEntriesFromDb(); + + final nextIso = _maxIsoFromItems(items) ?? DateTime.now().toUtc().toIso8601String(); + await state.setLastSyncIso(nextIso); + + final nextMs = DateTime.parse(nextIso).millisecondsSinceEpoch; + final sessionId = await state.getSessionId(); + final deviceId = await state.getDeviceId(); + + final ws = source.remoteWsClient; + ws?.notifyRecoveryCompleted(); + + debugPrint('[remote] sending sync_done session=$sessionId device=$deviceId ms=$nextMs'); + + await api.sendSyncDone( + sessionId: sessionId, + deviceId: deviceId, + lastSyncMs: nextMs, + ); + + debugPrint('[remote] fullSync done items=${items.length} lastSync=$nextIso'); +} + + // ------------------------------------------------------------ + // DELTA SYNC (senza _runExclusive) + // ------------------------------------------------------------ + + Future<void> _deltaSyncImpl(String sinceIso, + {bool appendAfter = true}) async { + debugPrint('[remote] deltaSyncFrom since=$sinceIso'); + + final List<Map<String, dynamic>> changed = await api.getChanges(sinceIso); + final List<Map<String, dynamic>> deleted = + await api.getDeletedHard(sinceIso); + + var didChange = false; + + List<RemotePhotoItem> changedItems = const []; +if (changed.isNotEmpty) { + changedItems = changed.map(RemotePhotoItem.fromJson).toList(); + + const int deltaChunk = 40; + const int maxChunkAttempts = 2; // numero di tentativi per chunk + for (var i = 0; i < changedItems.length; i += deltaChunk) { + final end = (i + deltaChunk < changedItems.length) ? i + deltaChunk : changedItems.length; + final sub = changedItems.sublist(i, end); + + var attempt = 0; + var success = false; + final chunkT0 = DateTime.now(); + + while (!success && attempt < maxChunkAttempts) { + attempt++; + try { + await repo.upsertAll(sub, chunkSize: deltaChunk); + success = true; + debugPrint('[remote] delta upsert chunk $i..${end - 1} size=${sub.length} took=${DateTime.now().difference(chunkT0)} attempt=$attempt'); + } catch (e, st) { + debugPrint('[remote] delta upsert chunk $i..${end - 1} FAILED attempt=$attempt: $e\n$st'); + // piccolo backoff prima del retry + if (attempt < maxChunkAttempts) await Future.delayed(const Duration(milliseconds: 50)); + } + } + + if (!success) { + // segnala ma continua con i chunk successivi + debugPrint('[remote] delta upsert chunk $i..${end - 1} permanently failed after $maxChunkAttempts attempts'); + } + + // yield per non bloccare il renderer + await Future.delayed(const Duration(milliseconds: 10)); + } + + debugPrint('[remote] delta upsert total=${changedItems.length}'); + didChange = true; +} + + if (deleted.isNotEmpty) { + final ids = deleted + .map((e) => e['id']?.toString()) + .whereType<String>() + .where((s) => s.isNotEmpty) + .toSet(); + + if (ids.isNotEmpty) { + await repo.deleteRemotesByRemoteIds(ids); + debugPrint('[remote] delta hardDeleted=${ids.length}'); + didChange = true; + } + } + + if (appendAfter && didChange) { + await source.appendRemoteEntriesFromDb(); + } + + final next = _computeNextSyncIso( + changedItems: changedItems, + hardDeletedRaw: deleted, + ) ?? + DateTime.now().toUtc().toIso8601String(); + + await state.setLastSyncIso(next); + debugPrint('[remote] delta lastSync -> $next'); + } +/// Upsert massivo di items ricevuti dal WS (items: List<Map|RemotePhotoItem>) +/// - chunked per non bloccare il main thread +/// - accetta sia Map<String,dynamic> che RemotePhotoItem +/// - assicura append in-memory via source.appendRemoteEntriesFromDb() +Future<void> upsertRemoteEntries(List<dynamic> items) async { + if (items.isEmpty) return; + + // Normalizza in RemotePhotoItem + final List<RemotePhotoItem> photos = []; + for (final it in items) { + try { + if (it is RemotePhotoItem) { + photos.add(it); + } else if (it is Map<String, dynamic>) { + photos.add(RemotePhotoItem.fromJson(it)); + } else { + // ignora tipi non riconosciuti + } + } catch (e, st) { + debugPrint('[remote] upsertRemoteEntries: item parse error: $e\n$st'); + } + } + + if (photos.isEmpty) return; + + // chunk per non bloccare il renderer + const int chunk = 40; + for (var i = 0; i < photos.length; i += chunk) { + final end = (i + chunk < photos.length) ? i + chunk : photos.length; + final sub = photos.sublist(i, end); + final chunkT0 = DateTime.now(); + try { + // usa il repository per l'upsert (repo.upsertAll già chunked) + await repo.upsertAll(sub, chunkSize: chunk); + debugPrint('[remote] upsertRemoteEntries chunk $i..${end - 1} size=${sub.length} took=${DateTime.now().difference(chunkT0)}'); + } catch (e, st) { + debugPrint('[remote] upsertRemoteEntries chunk FAILED $i..${end - 1}: $e\n$st'); + // continua con i chunk successivi + } + // piccolo yield per permettere redraw UI + await Future.delayed(const Duration(milliseconds: 10)); + } + + // Nota: non facciamo riferimento a repo.ensureFoldersFromEntries o a metodi non esistenti. + // Ci affidiamo a source.appendRemoteEntriesFromDb() per aggiornare la cache in-memory e + // alla logica esistente che ricostruisce folders se necessario. + + try { + await source.appendRemoteEntriesFromDb(); + } catch (e, st) { + debugPrint('[remote] appendRemoteEntriesFromDb error: $e\n$st'); + } +} + + + // ------------------------------------------------------------ + // Exclusive wrapper (FIXATO) + // ------------------------------------------------------------ + + Future<void> _runExclusive(Future<void> Function() fn) async { + if (_syncInFlight) { + _pendingSync = true; + debugPrint('[remote] sync already in flight -> pending=true'); + return; + } + + _syncInFlight = true; + try { + await fn(); + } finally { + _syncInFlight = false; + + if (_pendingSync) { + _pendingSync = false; + debugPrint('[remote] run pending sync'); + + // ❗ NON ricorsivo + Future.microtask(() => _runExclusive(fn)); + } + } + } + + // ------------------------------------------------------------ + // Helpers + // ------------------------------------------------------------ + + String? _maxIsoFromItems(List<RemotePhotoItem> items) { + DateTime? maxDt; + for (final it in items) { + final dt = it.updatedAtUtc ?? it.createdAtUtc; + if (dt != null && (maxDt == null || dt.isAfter(maxDt))) { + maxDt = dt; + } + } + return maxDt?.toUtc().toIso8601String(); + } + + String? _computeNextSyncIso({ + required List<RemotePhotoItem> changedItems, + required List<Map<String, dynamic>> hardDeletedRaw, + }) { + DateTime? maxDt; + + void consider(DateTime? dt) { + if (dt == null) return; + if (maxDt == null || dt.isAfter(maxDt!)) maxDt = dt; + } + + for (final it in changedItems) { + consider(it.updatedAtUtc ?? it.createdAtUtc); + } + + for (final d in hardDeletedRaw) { + final s = d['deleted_at']?.toString(); + if (s != null && s.isNotEmpty) { + consider(DateTime.tryParse(s)?.toUtc()); + } + } + + return maxDt?.toUtc().toIso8601String(); + } +} diff --git a/lib/remote/remote_test_page.dart b/lib/remote/remote_test_page.dart new file mode 100644 index 0000000..3f1c576 --- /dev/null +++ b/lib/remote/remote_test_page.dart @@ -0,0 +1,682 @@ +// lib/remote/remote_test_page.dart +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:sqflite/sqflite.dart'; + +// Integrazione impostazioni & auth remota +import 'remote_settings.dart'; +import 'auth_client.dart'; +import 'remote_origin.dart'; + +enum _RemoteFilter { all, visibleOnly, trashedOnly } + +class RemoteTestPage extends StatefulWidget { + final Database db; + + /// Base URL preferita (es. https://prova.patachina.it). + /// Se non la passi o è vuota, verrà usata quella in RemoteSettings. + final String? baseUrl; + + const RemoteTestPage({ + super.key, + required this.db, + this.baseUrl, + }); + + @override + State<RemoteTestPage> createState() => _RemoteTestPageState(); +} + +class _RemoteTestPageState extends State<RemoteTestPage> { + Future<List<_RemoteRow>>? _future; + String _baseUrl = ''; + Map<String, String>? _authHeaders; + bool _navigating = false; // debounce del tap + + // Default: mostriamo di base solo i visibili + _RemoteFilter _filter = _RemoteFilter.visibleOnly; + + // contatori diagnostici + int _countAll = 0; + int _countVisible = 0; // trashed=0 + int _countTrashed = 0; // trashed=1 + + // (Opzionale) limita alla tua sorgente server + // Se non vuoi filtrare per provider, metti _providerFilter = null + static const String _providerFilter = 'json@patachina'; + + @override + void initState() { + super.initState(); + _init(); // prepara baseUrl + header auth (se necessari), poi carica i dati + } + + Future<void> _init() async { + // 1) Base URL: parametro > settings (fail-open) + try { + final s = await RemoteSettings.load(); + final candidate = (widget.baseUrl ?? '').trim(); + _baseUrl = candidate.isNotEmpty ? candidate : s.baseUrl.trim(); + } catch (_) { + _baseUrl = (widget.baseUrl ?? '').trim(); // se vuoto → resterà vuoto + } + + // 2) Header Authorization (opzionale; fail-open) + _authHeaders = null; + try { + if (_baseUrl.isNotEmpty) { + final s = await RemoteSettings.load(); + if (s.email.isNotEmpty || s.password.isNotEmpty) { + final auth = RemoteAuth(baseUrl: _baseUrl, email: s.email, password: s.password); + final token = await auth.login(); + _authHeaders = {'Authorization': 'Bearer $token'}; + } + } + } catch (_) { + // In debug non bloccare la pagina se il login immagini fallisce + _authHeaders = null; + } + + // 3) Carica contatori e lista + await _refreshCounters(); + _future = _load(); + + if (mounted) setState(() {}); + } + + Future<void> _refreshCounters() async { + // Totale remoti (origin=RemoteOrigin.value), visibili e cestinati + final all = await widget.db.rawQuery( + 'SELECT COUNT(*) AS c FROM entry WHERE origin=?', + [RemoteOrigin.value], + ); + final vis = await widget.db.rawQuery( + 'SELECT COUNT(*) AS c FROM entry WHERE origin=? AND trashed=0', + [RemoteOrigin.value], + ); + final tra = await widget.db.rawQuery( + 'SELECT COUNT(*) AS c FROM entry WHERE origin=? AND trashed=1', + [RemoteOrigin.value], + ); + _countAll = (all.first['c'] as int?) ?? 0; + _countVisible = (vis.first['c'] as int?) ?? 0; + _countTrashed = (tra.first['c'] as int?) ?? 0; + } + + Future<List<_RemoteRow>> _load() async { + // Costruisco WHERE dinamico ma parametrizzato + final where = <String>['origin=?']; + final args = <Object?>[RemoteOrigin.value]; + + // filtro trash + switch (_filter) { + case _RemoteFilter.visibleOnly: + where.add('trashed=0'); + break; + case _RemoteFilter.trashedOnly: + where.add('trashed=1'); + break; + case _RemoteFilter.all: + default: + break; + } + + // (Opzionale) filtro provider + // prima era: provider IS NULL OR provider="json@patachina" + where.add('(provider IS NULL OR provider=?)'); + args.add(_providerFilter); + + // Prende le prime 300 entry remote + // Ordinamento "fotografico": data scatto -> id + final rows = await widget.db.rawQuery( + 'SELECT id, remoteId, title, remotePath, remoteThumb2, sourceMimeType, trashed ' + 'FROM entry ' + 'WHERE ${where.join(' AND ')} ' + 'ORDER BY COALESCE(sourceDateTakenMillis, dateAddedSecs*1000, 0) DESC, id DESC ' + 'LIMIT 300', + args, + ); + + return rows.map((r) { + return _RemoteRow( + id: r['id'] as int, + remoteId: (r['remoteId'] as String?) ?? '', + title: (r['title'] as String?) ?? '', + remotePath: r['remotePath'] as String?, + remoteThumb2: r['remoteThumb2'] as String?, + mime: r['sourceMimeType'] as String?, + trashed: (r['trashed'] as int?) ?? 0, + ); + }).toList(); + } + + // Costruzione robusta dell’URL assoluto: + // - se già assoluto → ritorna com’è + // - se relativo → risolve contro _baseUrl (accetta con/senza '/') + String _absUrl(String? relativePath) { + if (relativePath == null || relativePath.isEmpty) return ''; + final p = relativePath.trim(); + + // URL già assoluto + if (p.startsWith('http://') || p.startsWith('https://')) return p; + + if (_baseUrl.isEmpty) return ''; + try { + final base = Uri.parse(_baseUrl.endsWith('/') ? _baseUrl : '$_baseUrl/'); + // normalizza: se inizia con '/', togliamo per usare resolve coerente + final rel = p.startsWith('/') ? p.substring(1) : p; + final resolved = base.resolve(rel); + return resolved.toString(); + } catch (_) { + return ''; + } + } + + bool _isVideo(String? mime, String? path) { + final m = (mime ?? '').toLowerCase(); + final p = (path ?? '').toLowerCase(); + return m.startsWith('video/') || + p.endsWith('.mp4') || + p.endsWith('.mov') || + p.endsWith('.m4v') || + p.endsWith('.mkv') || + p.endsWith('.webm'); + } + + Future<void> _onRefresh() async { + await _refreshCounters(); + _future = _load(); + if (mounted) setState(() {}); + await _future; + } + + Future<void> _diagnosticaDb() async { + try { + final dup = await widget.db.rawQuery(''' + SELECT remoteId, COUNT(*) AS cnt + FROM entry + WHERE origin=? AND remoteId IS NOT NULL + GROUP BY remoteId + HAVING cnt > 1 + ''', [RemoteOrigin.value]); + + final vis = await widget.db.rawQuery(''' + SELECT COUNT(*) AS visible_remotes + FROM entry + WHERE origin=? AND trashed=0 + ''', [RemoteOrigin.value]); + + final idx = await widget.db.rawQuery("PRAGMA index_list('entry')"); + + if (!mounted) return; + await showModalBottomSheet<void>( + context: context, + builder: (_) => Padding( + padding: const EdgeInsets.all(16), + child: SingleChildScrollView( + child: DefaultTextStyle( + style: Theme.of(context).textTheme.bodyMedium!, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text('Diagnostica DB', style: TextStyle(fontWeight: FontWeight.bold)), + const SizedBox(height: 12), + Text('Duplicati per remoteId:\n${dup.isEmpty ? "nessuno" : dup.map((e) => e.toString()).join('\n')}'), + const SizedBox(height: 12), + Text('Remoti visibili in Aves (trashed=0): ${vis.first.values.first}'), + const SizedBox(height: 12), + Text('Indici su entry:\n${idx.map((e) => e.toString()).join('\n')}'), + ], + ), + ), + ), + ), + ); + } catch (e) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Diagnostica DB fallita: $e')), + ); + } + } + + /// 🔧 Pulisce duplicati per `remotePath` (tiene MAX(id)) e righe senza `remoteId`. + Future<void> _pulisciDuplicatiPath() async { + try { + final delNoId = await widget.db.rawDelete( + "DELETE FROM entry WHERE origin=? AND (remoteId IS NULL OR TRIM(remoteId)='')", + [RemoteOrigin.value], + ); + + final delByPath = await widget.db.rawDelete( + 'DELETE FROM entry ' + 'WHERE origin=? AND remotePath IS NOT NULL AND id NOT IN (' + ' SELECT MAX(id) FROM entry ' + ' WHERE origin=? AND remotePath IS NOT NULL ' + ' GROUP BY remotePath' + ')', + [RemoteOrigin.value, RemoteOrigin.value], + ); + + await _onRefresh(); + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Pulizia completata: noId=$delNoId, dupPath=$delByPath')), + ); + } catch (e) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Pulizia fallita: $e')), + ); + } + } + + Future<void> _nascondiRemotiInCollection() async { + try { + final changed = await widget.db.rawUpdate(''' + UPDATE entry SET trashed=1 + WHERE origin=? AND trashed=0 + ''', [RemoteOrigin.value]); + + if (!mounted) return; + await _onRefresh(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Remoti nascosti dalla Collection: $changed')), + ); + } on DatabaseException catch (e) { + final msg = e.toString(); + if (!mounted) return; + // Probabile connessione R/O: istruisci a riaprire il DB in R/W + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + duration: const Duration(seconds: 5), + content: Text( + 'UPDATE fallito (DB in sola lettura?): $msg\n' + 'Apri il DB in R/W in HomePage._openRemoteTestPage (no readOnly).', + ), + ), + ); + } catch (e) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Errore UPDATE: $e')), + ); + } + } + + @override + Widget build(BuildContext context) { + final ready = (_baseUrl.isNotEmpty && _future != null); + + return Scaffold( + appBar: AppBar( + title: const Text('[DEBUG] Remote Test'), + actions: [ + IconButton( + icon: const Icon(Icons.bug_report_outlined), + tooltip: 'Diagnostica DB', + onPressed: _diagnosticaDb, + ), + IconButton( + icon: const Icon(Icons.cleaning_services_outlined), + tooltip: 'Pulisci duplicati (path)', + onPressed: _pulisciDuplicatiPath, + ), + IconButton( + icon: const Icon(Icons.visibility_off_outlined), + tooltip: 'Nascondi remoti in Collection', + onPressed: _nascondiRemotiInCollection, + ), + ], + ), + body: !ready + ? const Center(child: CircularProgressIndicator()) + : Column( + children: [ + // Header contatori + filtro + Padding( + padding: const EdgeInsets.fromLTRB(12, 8, 12, 4), + child: Row( + children: [ + Expanded( + child: Wrap( + spacing: 8, + runSpacing: -6, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Chip(label: Text('Tot: $_countAll')), + Chip(label: Text('Visibili: $_countVisible')), + Chip(label: Text('Cestinati: $_countTrashed')), + ], + ), + ), + const SizedBox(width: 8), + SegmentedButton<_RemoteFilter>( + segments: const [ + ButtonSegment(value: _RemoteFilter.all, label: Text('Tutti')), + ButtonSegment(value: _RemoteFilter.visibleOnly, label: Text('Visibili')), + ButtonSegment(value: _RemoteFilter.trashedOnly, label: Text('Cestinati')), + ], + selected: {_filter}, + onSelectionChanged: (sel) async { + setState(() => _filter = sel.first); + await _onRefresh(); + }, + ), + ], + ), + ), + const Divider(height: 1), + Expanded( + child: RefreshIndicator( + onRefresh: _onRefresh, + child: FutureBuilder<List<_RemoteRow>>( + future: _future, + builder: (context, snap) { + if (snap.connectionState != ConnectionState.done) { + return const Center(child: CircularProgressIndicator()); + } + if (snap.hasError) { + return SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), + child: SizedBox( + height: MediaQuery.of(context).size.height * .6, + child: Center(child: Text('Errore: ${snap.error}')), + ), + ); + } + + final items = snap.data ?? const <_RemoteRow>[]; + if (items.isEmpty) { + return SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), + child: SizedBox( + height: MediaQuery.of(context).size.height * .6, + child: const Center(child: Text('Nessuna entry remota (origin=${RemoteOrigin.value})')), + ), + ); + } + + return GridView.builder( + padding: const EdgeInsets.all(8), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + mainAxisSpacing: 4, + crossAxisSpacing: 4, + ), + itemCount: items.length, + itemBuilder: (context, i) { + final it = items[i]; + final isVideo = _isVideo(it.mime, it.remotePath); + final thumbUrl = _absUrl(it.remoteThumb2); + final fullUrl = _absUrl(it.remotePath); + final hasThumb = thumbUrl.isNotEmpty; + final hasFull = fullUrl.isNotEmpty; + final heroTag = 'remote_${it.id}'; + + return GestureDetector( + onLongPress: () async { + if (!context.mounted) return; + await showModalBottomSheet<void>( + context: context, + builder: (_) => Padding( + padding: const EdgeInsets.all(16), + child: SingleChildScrollView( + child: DefaultTextStyle( + style: Theme.of(context).textTheme.bodyMedium!, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('ID: ${it.id} remoteId: ${it.remoteId} trashed: ${it.trashed}'), + const SizedBox(height: 8), + Text('MIME: ${it.mime}'), + const Divider(), + SelectableText('FULL URL:\n$fullUrl'), + const SizedBox(height: 8), + SelectableText('THUMB URL:\n$thumbUrl'), + const SizedBox(height: 12), + Wrap( + spacing: 8, + children: [ + ElevatedButton.icon( + onPressed: hasFull + ? () async { + await Clipboard.setData(ClipboardData(text: fullUrl)); + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('FULL URL copiato')), + ); + } + } + : null, + icon: const Icon(Icons.copy), + label: const Text('Copia FULL'), + ), + ElevatedButton.icon( + onPressed: hasThumb + ? () async { + await Clipboard.setData(ClipboardData(text: thumbUrl)); + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('THUMB URL copiato')), + ); + } + } + : null, + icon: const Icon(Icons.copy_all), + label: const Text('Copia THUMB'), + ), + ], + ), + ], + ), + ), + ), + ), + ); + }, + onTap: () async { + if (_navigating) return; // debounce + _navigating = true; + + try { + if (isVideo) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Video remoto: anteprima full non disponibile (thumb richiesta).'), + duration: Duration(seconds: 2), + ), + ); + return; + } + if (!hasFull) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('URL non valido')), + ); + return; + } + + await Navigator.of(context).push( + PageRouteBuilder( + pageBuilder: (_, __, ___) => _RemoteFullPage( + title: it.title, + url: fullUrl, + headers: _authHeaders, + heroTag: heroTag, // pairing Hero + ), + transitionDuration: const Duration(milliseconds: 220), + ), + ); + } finally { + _navigating = false; + } + }, + child: Hero( + tag: heroTag, // pairing Hero + child: DecoratedBox( + decoration: BoxDecoration(border: Border.all(color: Colors.black12)), + child: Stack( + fit: StackFit.expand, + children: [ + _buildGridTile(isVideo, thumbUrl, fullUrl), + // Informazioni utili per capire cosa stiamo vedendo + Positioned( + left: 2, + bottom: 2, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2), + color: Colors.black54, + child: Text( + 'id:${it.id} rid:${it.remoteId}${it.trashed == 1 ? " (T)" : ""}', + style: const TextStyle(fontSize: 10, color: Colors.white), + ), + ), + ), + Positioned( + right: 2, + top: 2, + child: Wrap( + spacing: 4, + children: [ + if (hasFull) + const _MiniBadge(label: 'URL') + else + const _MiniBadge(label: 'NOURL', color: Colors.red), + if (hasThumb) + const _MiniBadge(label: 'THUMB') + else + const _MiniBadge(label: 'NOTH', color: Colors.orange), + ], + ), + ), + ], + ), + ), + ), + ); + }, + ); + }, + ), + ), + ), + ], + ), + ); + } + + Widget _buildGridTile(bool isVideo, String thumbUrl, String fullUrl) { + if (isVideo) { + // Per i video: NON usiamo Image.network(fullUrl). + // Usiamo la thumb se c'è, altrimenti placeholder con icona "play". + final base = thumbUrl.isEmpty + ? const ColoredBox(color: Colors.black12) + : Image.network( + thumbUrl, + fit: BoxFit.cover, + headers: _authHeaders, + errorBuilder: (_, __, ___) => const Center(child: Icon(Icons.broken_image)), + ); + + return Stack( + fit: StackFit.expand, + children: [ + base, + const Align( + alignment: Alignment.center, + child: Icon(Icons.play_circle_fill, color: Colors.white70, size: 48), + ), + ], + ); + } + + // Per le immagini: se non c'è thumb, posso usare direttamente l'URL full. + final displayUrl = thumbUrl.isEmpty ? fullUrl : thumbUrl; + + if (displayUrl.isEmpty) { + return const ColoredBox(color: Colors.black12); + } + + return Image.network( + displayUrl, + fit: BoxFit.cover, + headers: _authHeaders, + errorBuilder: (_, __, ___) => const Center(child: Icon(Icons.broken_image)), + ); + } +} + +class _RemoteRow { + final int id; + final String remoteId; + final String title; + final String? remotePath; + final String? remoteThumb2; + final String? mime; + final int trashed; + + _RemoteRow({ + required this.id, + required this.remoteId, + required this.title, + this.remotePath, + this.remoteThumb2, + this.mime, + required this.trashed, + }); +} + +class _MiniBadge extends StatelessWidget { + final String label; + final Color color; + const _MiniBadge({required this.label, this.color = Colors.black54}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 1), + decoration: BoxDecoration( + color: color, + borderRadius: BorderRadius.circular(3), + ), + child: Text(label, style: const TextStyle(fontSize: 9, color: Colors.white)), + ); + } +} + +class _RemoteFullPage extends StatelessWidget { + final String title; + final String url; + final Map<String, String>? headers; + final String heroTag; // pairing Hero + + const _RemoteFullPage({ + required this.title, + required this.url, + required this.heroTag, + this.headers, + }); + + @override + Widget build(BuildContext context) { + final body = url.isEmpty + ? const Text('URL non valido') + : Hero( + tag: heroTag, // pairing con la griglia + child: InteractiveViewer( + maxScale: 5, + child: Image.network( + url, + fit: BoxFit.contain, + headers: headers, // Authorization se il server lo richiede + errorBuilder: (_, __, ___) => const Icon(Icons.broken_image, size: 64), + ), + ), + ); + + return Scaffold( + appBar: AppBar(title: Text(title.isEmpty ? 'Remote' : title)), + body: Center(child: body), + ); + } +} diff --git a/lib/remote/remote_view_helpers.dart b/lib/remote/remote_view_helpers.dart new file mode 100644 index 0000000..cbc6980 --- /dev/null +++ b/lib/remote/remote_view_helpers.dart @@ -0,0 +1,75 @@ +// lib/remote/remote_view_helpers.dart +import 'package:flutter/material.dart'; +import 'package:aves/model/entry/entry.dart'; + +import 'remote_http.dart'; +import 'remote_origin.dart'; + +/// Un entry è "remoto" se origin == RemoteOrigin.value +bool isRemote(AvesEntry e) => e.origin == RemoteOrigin.value; + +/// Heuristics base per capire se è video (MIME o estensione) +bool isVideo(AvesEntry e) { + final mt = (e.sourceMimeType ?? '').toLowerCase(); + final p = (e.remotePath ?? e.path ?? '').toLowerCase(); + return mt.startsWith('video/') || + p.endsWith('.mp4') || + p.endsWith('.mov') || + p.endsWith('.webm') || + p.endsWith('.mkv') || + p.endsWith('.m4v'); +} + +/// Normalizza la rotazione a {0,90,180,270}. +/// Se non presente o non valida → 0. +int rotationDegOf(AvesEntry e) { + final raw = e.sourceRotationDegrees ?? 0; + final n = ((raw % 360) + 360) % 360; + if (n % 90 != 0) return 0; + return n; +} + +/// Aspect ratio "effettivo" per il layout: +/// se la rotazione è 90/270 → scambia width/height. +double effectiveAspectRatio(AvesEntry e) { + final w = (e.width ?? 0).toDouble(); + final h = (e.height ?? 0).toDouble(); + if (w <= 0 || h <= 0) return 1.0; // fallback sicuro + final rot = rotationDegOf(e); + final swap = rot == 90 || rot == 270; + return swap ? (h / w) : (w / h); +} + +/// Versione compatibile (chiama quella con rotazione). +Future<Widget> remoteImageFull(AvesEntry e) => remoteImageFullWithRotate(e); + +/// Mostra l'immagine remota rispettando rotazione e aspect ratio. +/// - Usa AspectRatio per non "schiacciare" l'immagine. +/// - Usa RotatedBox (rotazioni a quarti di giro) per non perdere qualità. +/// - Carica via HTTP + Bearer (RemoteHttp). +Future<Widget> remoteImageFullWithRotate(AvesEntry e) async { + final url = RemoteHttp.absUrl(e.remotePath ?? e.path); + final hdr = await RemoteHttp.headers(); + if (url.isEmpty) return const Icon(Icons.broken_image, size: 64); + + final rot = rotationDegOf(e); + final quarterTurns = (rot ~/ 90) % 4; // 0..3 + + return Center( + child: AspectRatio( + aspectRatio: effectiveAspectRatio(e), + child: InteractiveViewer( + maxScale: 5, + child: RotatedBox( + quarterTurns: quarterTurns, + child: Image.network( + url, + fit: BoxFit.contain, + headers: hdr, + errorBuilder: (_, __, ___) => const Icon(Icons.broken_image, size: 64), + ), + ), + ), + ), + ); +} diff --git a/lib/remote/remote_ws_client.dart b/lib/remote/remote_ws_client.dart new file mode 100644 index 0000000..7296258 --- /dev/null +++ b/lib/remote/remote_ws_client.dart @@ -0,0 +1,430 @@ +// lib/remote/remote_ws_client.dart +// +// Patched version with small robustness improvements, extra debug logging, +// and clearer backoff/reconnect behavior. Integrate with RemoteAddedQueue +// via setAddedQueue(...) and call notifyRecoveryCompleted() from your +// SyncManager after recovery sync completes. + +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:web_socket_channel/web_socket_channel.dart'; +import 'package:web_socket_channel/io.dart'; + +import 'remote_state_store.dart'; +import 'remote_added_queue.dart'; + +typedef WsEventHandler = Future<bool> Function(Map<String, dynamic> msg); + +class RemoteWsClient { + RemoteWsClient({ + required this.wsUrl, + required this.store, + required this.deduper, + required this.onEvent, + required this.onNeedRecoverySync, + this.autoReconnect = true, + this.reconnectDelay = const Duration(milliseconds: 1500), + this.maxReconnectDelay = const Duration(seconds: 30), + this.dormantWindow = const Duration(minutes: 2), // come sync.js WS_DORMANT_MS + this.pingInterval = const Duration(seconds: 25), // keepalive mobile + this.needFullSyncDelay = const Duration(milliseconds: 800), // come sync.js WS_NEED_FULLSYNC_DELAY_MS + }); + + final String wsUrl; + final RemoteStateStore store; + final EventRingDeduper deduper; + + /// Deve ritornare true SOLO quando l’evento è applicato con successo + /// (o quando hai schedulato un lavoro "durable" che completerai sicuramente). + final WsEventHandler onEvent; + + /// Trigger per fare una sync di recovery (progressive o full) + final VoidCallback onNeedRecoverySync; + + final bool autoReconnect; + final Duration reconnectDelay; + final Duration maxReconnectDelay; + final Duration dormantWindow; + final Duration pingInterval; + final Duration needFullSyncDelay; + + // --- stato e risorse interne --- + WebSocketChannel? _ch; + StreamSubscription? _sub; + + bool _connecting = false; + bool _closing = false; + + Timer? _reconnectTimer; + Duration _currentReconnectDelay = Duration.zero; + + String? _lastToken; + + // optional: queue per batch di "added" (byIds) + RemoteAddedQueue? _addedQueue; + + /// Imposta la queue per gestire gli eventi "added" internamente. + void setAddedQueue(RemoteAddedQueue queue) { + _addedQueue = queue; + debugPrint('[remote][ws] addedQueue set'); + } + + // "last seen" come sync.js (persistito in RemoteStateStore) + int _lastSeenMs = 0; + + // stato handshake + bool _authed = false; + + // server ha richiesto recovery (need_full_sync=true) e aspetta "recovery_done" + bool _needRecoveryDoneAck = false; + + // debounce recovery (evita storm) + Timer? _recoveryDebounce; + bool _recoveryScheduled = false; + + bool get isConnected => _ch != null && _authed; + + Future<void> connect({required String token}) async { + _lastToken = token; + + // evita doppia connect + if (_connecting) return; + if (isConnected) return; + + _connecting = true; + _closing = false; + + try { + // chiudi connessioni precedenti + await close(); + + await deduper.init(); + final sessionId = await store.getOrCreateSessionId(); + + // carica lastSeen persistito (se c’è) + _lastSeenMs = await store.getWsLastSeenMs(); + + // se era dormiente > dormantWindow prima ancora di connettere, reset session id (come sync.js) + final now = DateTime.now().millisecondsSinceEpoch; + final dormant = _lastSeenMs != 0 && (now - _lastSeenMs) > dormantWindow.inMilliseconds; + if (dormant) { + debugPrint('[remote][ws] dormant (> ${dormantWindow.inSeconds}s) before connect -> reset session_id'); + await store.resetSessionId(); + await store.clearWsLastSeenMs(); + } + + // nuova sessionId dopo reset (se necessario) + final finalSessionId = dormant ? await store.getOrCreateSessionId() : sessionId; + + final uri = Uri.parse(wsUrl); + + // ✅ IOWebSocketChannel con pingInterval (mobile) + _ch = IOWebSocketChannel.connect( + uri, + pingInterval: pingInterval, + ); + + _authed = false; + _needRecoveryDoneAck = false; + + // reset backoff all’apertura + _currentReconnectDelay = reconnectDelay; + + _sub = _ch!.stream.listen( + (raw) async { + // --- debug: raw + decoded (pretty) con redaction per token) --- + try { + final rawStr = raw is String ? raw : raw.toString(); + debugPrint('[remote][ws][raw] $rawStr'); + + final decodedForLog = _decode(raw); + if (decodedForLog != null) { + // non modificare il msg originale: crea una copia per il logging + final Map<String, dynamic> copy = Map<String, dynamic>.from(decodedForLog); + if (copy.containsKey('token')) copy['token'] = '<redacted>'; + if (copy.containsKey('auth') && copy['auth'] is Map) { + final authMap = Map<String, dynamic>.from(copy['auth'] as Map); + if (authMap.containsKey('token')) authMap['token'] = '<redacted>'; + copy['auth'] = authMap; + } + debugPrint('[remote][ws][decoded]\n${const JsonEncoder.withIndent(' ').convert(copy)}'); + } else { + debugPrint('[remote][ws][decoded] null (parse failed)'); + } + } catch (e, st) { + debugPrint('[remote][ws][debug-print] error=$e\n$st'); + } + + _touchLastSeen(); + + final msg = _decode(raw); + if (msg == null) return; + + final type = msg['type']?.toString(); + + // log sintetico dei campi più utili + try { + final eventId = msg['event_id']?.toString(); + final id = msg['id']?.toString(); + debugPrint('[remote][ws][evt] type=$type event_id=$eventId id=$id'); + } catch (_) {} + + // auth_error dal server + if (type == 'auth_error') { + debugPrint('[remote][ws] auth_error=${msg['error']}'); + _scheduleRecovery(); + await close(); + return; + } + + // auth_ok: se server chiede recovery + if (type == 'auth_ok') { + _authed = true; + final needFull = msg['need_full_sync'] == true; + debugPrint('[remote][ws] auth_ok user=${msg['user']} session=${msg['session_id']} need_full_sync=$needFull'); + + if (needFull) { + _needRecoveryDoneAck = true; + // come sync.js: recovery ritardata + _scheduleRecovery(delay: needFullSyncDelay); + } else { + // ⭐ PATCH: progressive sync handshake + // notify server that client recovered and is ready for pending events + _send({'type': 'client_recovered'}); + } + return; + } + + // ping/pong + if (type == 'ping') { + _send({'type': 'pong'}); + return; + } + + final eventId = msg['event_id']?.toString(); + + // dedupe -> ACK e stop + if (eventId != null && deduper.has(eventId)) { + _send({'type': 'ack', 'event_id': eventId}); + return; + } + + // --- gestione rapida "added" tramite queue se presente --- + final msgType = msg['type']?.toString(); + if (msgType == 'added') { + final id = msg['id']?.toString(); + if (_addedQueue != null) { + try { + _addedQueue!.enqueue(id); + // mark handled locally so we ACK and avoid delega + if (eventId != null) { + await deduper.mark(eventId); + _send({'type': 'ack', 'event_id': eventId}); + } + return; + } catch (e, st) { + debugPrint('[remote][ws] addedQueue error=$e\n$st'); + // fallthrough: delegate to onEvent as fallback + } + } + } + + // Gestione evento: ACK SOLO se handled=true + bool handled = false; + try { + handled = await onEvent(msg); + } catch (e, st) { + debugPrint('[remote][ws] onEvent error=$e\n$st'); + handled = false; + // se fallisce, chiedi recovery ma NON ACK + _scheduleRecovery(); + } + + if (eventId != null && handled) { + await deduper.mark(eventId); + _send({'type': 'ack', 'event_id': eventId}); + } else { + // NO ACK: server ritenterà (reliable delivery) + } + }, + onDone: () { + debugPrint('[remote][ws] stream closed'); + _cleanupChannelOnly(); + if (!_closing) { + _scheduleRecovery(); + _scheduleReconnect(); + } + }, + onError: (e) { + debugPrint('[remote][ws] stream error=$e'); + _cleanupChannelOnly(); + if (!_closing) { + _scheduleRecovery(); + _scheduleReconnect(); + } + }, + cancelOnError: false, + ); + + // auth handshake + _send({'type': 'auth', 'token': token, 'session_id': finalSessionId}); + } finally { + _connecting = false; + } + } + + Future<void> close() async { + _closing = true; + _reconnectTimer?.cancel(); + _reconnectTimer = null; + + _recoveryDebounce?.cancel(); + _recoveryDebounce = null; + _recoveryScheduled = false; + + try { + await _sub?.cancel(); + _sub = null; + + final ch = _ch; + _ch = null; + + _authed = false; + + if (ch != null) { + await ch.sink.close(); + } + } catch (_) { + // ignore + } finally { + _cleanupAll(); + } + } + + /// ✅ Da chiamare quando hai completato una recovery richiesta dal server (need_full_sync=true). + /// Invia "recovery_done" una sola volta per sessione (finché non arriva un nuovo need_full_sync). + void notifyRecoveryCompleted() { + if (!_needRecoveryDoneAck) return; + if (!isConnected) return; + + _needRecoveryDoneAck = false; + _send({'type': 'recovery_done'}); + } + + // -------------------------- + // reconnect logic (sync.js-like) + // -------------------------- + + void _scheduleReconnect() { + if (!autoReconnect) return; + + // ❗ evita di programmare reconnect se già connesso + if (isConnected) return; + + // ❗ evita di programmare reconnect se già in fase di connessione + if (_connecting) return; + + // ❗ evita doppio timer + if (_reconnectTimer != null) return; + + final token = _lastToken; + if (token == null || token.isEmpty) return; + + final delay = _currentReconnectDelay == Duration.zero + ? reconnectDelay + : _currentReconnectDelay; + + // update backoff for next attempt + _currentReconnectDelay = _nextDelay(delay); + + debugPrint('[remote][ws] scheduling reconnect in ${delay.inMilliseconds}ms'); + + _reconnectTimer = Timer(delay, () async { + _reconnectTimer = null; + + // ❗ doppia sicurezza: non riconnettere se già connesso + if (_closing) return; + if (isConnected) return; + if (_connecting) return; + + try { + await connect(token: token); + } catch (e, st) { + debugPrint('[remote][ws] reconnect failed: $e\n$st'); + _cleanupChannelOnly(); + _scheduleReconnect(); + } + }); + } + + Duration _nextDelay(Duration current) { + final nextMs = (current.inMilliseconds * 2).clamp( + reconnectDelay.inMilliseconds, + maxReconnectDelay.inMilliseconds, + ); + return Duration(milliseconds: nextMs); + } + + // -------------------------- + // recovery debounce + // -------------------------- + + void _scheduleRecovery({Duration delay = const Duration(milliseconds: 250)}) { + if (_recoveryScheduled) return; + _recoveryScheduled = true; + + _recoveryDebounce?.cancel(); + _recoveryDebounce = Timer(delay, () { + _recoveryScheduled = false; + try { + onNeedRecoverySync(); + } catch (e, st) { + debugPrint('[remote][ws] onNeedRecoverySync error: $e\n$st'); + } + }); + } + + // -------------------------- + // utils + // -------------------------- + + void _touchLastSeen() { + _lastSeenMs = DateTime.now().millisecondsSinceEpoch; + unawaited(store.setWsLastSeenMs(_lastSeenMs)); + } + + void _send(Map<String, dynamic> obj) { + try { + final payload = jsonEncode(obj); + _ch?.sink.add(payload); + debugPrint('[remote][ws] send: ${obj['type'] ?? '<unknown>'}'); + } catch (e, st) { + debugPrint('[remote][ws] send failed: $e\n$st'); + } + } + + Map<String, dynamic>? _decode(dynamic raw) { + try { + final s = raw is String ? raw : raw.toString(); + final v = jsonDecode(s); + return v is Map<String, dynamic> ? v : null; + } catch (_) { + return null; + } + } + + void _cleanupChannelOnly() { + _sub?.cancel(); + _sub = null; + _ch = null; + _authed = false; + _connecting = false; + } + + void _cleanupAll() { + _cleanupChannelOnly(); + _closing = false; + } +} diff --git a/lib/remote/run_remote_sync.dart b/lib/remote/run_remote_sync.dart new file mode 100644 index 0000000..36c6ccd --- /dev/null +++ b/lib/remote/run_remote_sync.dart @@ -0,0 +1,72 @@ +// lib/remote/run_remote_sync.dart +import 'package:aves/services/common/services.dart'; +import 'package:aves/model/db/db.dart'; // LocalMediaDb +import 'package:aves/remote/remote_repository.dart'; +import 'package:aves/remote/remote_models.dart'; // RemotePhotoItem +import 'package:flutter/foundation.dart' show debugPrint; +import 'package:sqflite/sqflite.dart'; + +import 'remote_origin.dart'; + +/// Esegue un giro di sync remoto riusando **la stessa connessione** del loader (4A). +/// Passa una funzione `fetch` che ritorna la lista di RemotePhotoItem da importare. +/// Ritorna il numero di elementi **nuovi/aggiornati** importati. +Future<int> runRemoteSyncOnceManaged({ + required Future<List<RemotePhotoItem>> Function() fetch, +}) async { + try { + // 1) Usa la **stessa connessione** del loader + final localDb = getIt<LocalMediaDb>(); + final db = localDb.rawDb; + final repo = RemoteRepository(db); + + // 2) Conteggio pre (diagnostica) + final pre = (Sqflite.firstIntValue( + await db.rawQuery( + 'SELECT COUNT(*) FROM entry WHERE origin=?', + [RemoteOrigin.value], + ), + ) ?? + 0); + debugPrint('[remote-sync][pre] count origin=${RemoteOrigin.value} = $pre'); + + // 3) Fetch dal server + final items = await fetch(); + debugPrint('[remote-sync] fetchAll done, items=${items.length}'); + + if (items.isEmpty) { + debugPrint('[remote-sync] no items to import, exiting'); + return 0; + } + + // 4) Upsert + sanitize + final sw = Stopwatch()..start(); + await repo.upsertAll(items); + await repo.sanitizeRemotes(); + sw.stop(); + debugPrint('[remote-sync] upsert+sanitize completed in ${sw.elapsedMilliseconds}ms'); + + // 5) Conteggio post e sample (diagnostica) + final post = (Sqflite.firstIntValue( + await db.rawQuery( + 'SELECT COUNT(*) FROM entry WHERE origin=?', + [RemoteOrigin.value], + ), + ) ?? + 0); + debugPrint('[remote-sync][post] count origin=${RemoteOrigin.value} = $post'); + + final sample = await db.rawQuery( + 'SELECT id, remoteId, provider, uri, trashed, dateModifiedMillis ' + 'FROM entry WHERE origin=? ORDER BY id DESC LIMIT 3', + [RemoteOrigin.value], + ); + debugPrint('[remote-sync][post] sample origin=${RemoteOrigin.value} = $sample'); + + return (post - pre).clamp(0, items.length); + } catch (e, st) { + debugPrint('[remote-sync] ERROR: $e\n$st'); + return 0; + } +} + diff --git a/lib/remote/url_utils.dart b/lib/remote/url_utils.dart new file mode 100644 index 0000000..9b0450b --- /dev/null +++ b/lib/remote/url_utils.dart @@ -0,0 +1,7 @@ +// lib/remote/url_utils.dart +Uri buildAbsoluteUri(String baseUrl, String relativePath) { + final base = Uri.parse(baseUrl.endsWith('/') ? baseUrl : '$baseUrl/'); + final cleaned = relativePath.startsWith('/') ? relativePath.substring(1) : relativePath; + final segments = cleaned.split('/').where((s) => s.isNotEmpty).toList(); + return base.replace(pathSegments: [...base.pathSegments, ...segments]); +} diff --git a/lib/services/accessibility_service.dart b/lib/services/accessibility_service.dart new file mode 100644 index 0000000..da67f74 --- /dev/null +++ b/lib/services/accessibility_service.dart @@ -0,0 +1,80 @@ +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/services.dart'; + +class AccessibilityService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/accessibility'); + + static Future<bool> areAnimationsRemoved() async { + try { + final result = await _platform.invokeMethod('areAnimationsRemoved'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + static Future<int> getLongPressTimeout() async { + try { + final result = await _platform.invokeMethod('getLongPressTimeout'); + if (result != null) return result as int; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return kLongPressTimeout.inMilliseconds; + } + + static bool? _hasRecommendedTimeouts; + + static Future<bool> hasRecommendedTimeouts() async { + if (_hasRecommendedTimeouts != null) return SynchronousFuture(_hasRecommendedTimeouts!); + try { + final result = await _platform.invokeMethod('hasRecommendedTimeouts'); + _hasRecommendedTimeouts = result as bool?; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return _hasRecommendedTimeouts ?? false; + } + + static Future<int> getRecommendedTimeToRead(Duration originalTimeoutDuration) async { + final originalTimeoutMillis = originalTimeoutDuration.inMilliseconds; + try { + final result = await _platform.invokeMethod('getRecommendedTimeoutMillis', <String, dynamic>{ + 'originalTimeoutMillis': originalTimeoutMillis, + 'content': ['icons', 'text'], + }); + if (result != null) return result as int; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return originalTimeoutMillis; + } + + static Future<int> getRecommendedTimeToTakeAction(Duration originalTimeoutDuration) async { + final originalTimeoutMillis = originalTimeoutDuration.inMilliseconds; + try { + final result = await _platform.invokeMethod('getRecommendedTimeoutMillis', <String, dynamic>{ + 'originalTimeoutMillis': originalTimeoutMillis, + 'content': ['controls', 'icons', 'text'], + }); + if (result != null) return result as int; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return originalTimeoutMillis; + } + + static Future<bool> shouldUseBoldFont() async { + try { + final result = await _platform.invokeMethod('shouldUseBoldFont'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } +} diff --git a/lib/services/analysis_service.dart b/lib/services/analysis_service.dart new file mode 100644 index 0000000..07f7e3c --- /dev/null +++ b/lib/services/analysis_service.dart @@ -0,0 +1,214 @@ +import 'dart:async'; +import 'dart:ui'; + +import 'package:aves/l10n/l10n.dart'; +import 'package:aves/model/device.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/analysis_controller.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/media_store_source.dart'; +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:leak_tracker/leak_tracker.dart'; +import 'package:permission_handler/permission_handler.dart'; + +class AnalysisService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/analysis'); + + static Future<void> registerCallback() async { + try { + await _platform.invokeMethod('registerCallback', <String, dynamic>{ + // callback needs to be annotated with `@pragma('vm:entry-point')` to work in release mode + 'callbackHandle': PluginUtilities.getCallbackHandle(_init)?.toRawHandle(), + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + static Future<void> startService({required bool force, List<int>? entryIds}) async { + // from Android 13 (API 33), notifications are off by default, + // so the user needs to grant the permission to see the service notification + unawaited(Permission.notification.request()); + + await reportService.log('Start analysis service${entryIds != null ? ' for ${entryIds.length} items' : ''}'); + try { + await _platform.invokeMethod('startAnalysis', <String, dynamic>{ + 'entryIds': entryIds, + 'force': force, + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } +} + +const _channel = AvesMethodChannel('deckers.thibault/aves/analysis_service_background'); + +@pragma('vm:entry-point') +Future<void> _init() async { + WidgetsFlutterBinding.ensureInitialized(); + initPlatformServices(); + await androidFileUtils.init(); + await localMediaDb.init(); + await device.init(); + await mobileServices.init(); + await settings.init(monitorPlatformSettings: false, shouldSanitize: false); + await reportService.init(); + videoMetadataFetcher.init(); + + final analyzer = Analyzer(); + _channel.setMethodCallHandler((call) { + switch (call.method) { + case 'start': + analyzer.start(call.arguments); + return Future.value(true); + case 'stop': + analyzer.stop(); + return Future.value(true); + default: + throw PlatformException(code: 'not-implemented', message: 'failed to handle method=${call.method}'); + } + }); + try { + await _channel.invokeMethod('initialized'); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } +} + +enum AnalyzerState { running, stopping, stopped } + +class Analyzer with WidgetsBindingObserver { + late AppLocalizations _l10n; + final ValueNotifier<AnalyzerState> _serviceStateNotifier = ValueNotifier<AnalyzerState>(AnalyzerState.stopped); + AnalysisController? _controller; + Timer? _notificationUpdateTimer; + final _source = MediaStoreSource(); + + AnalyzerState get serviceState => _serviceStateNotifier.value; + + bool get isRunning => serviceState == AnalyzerState.running; + + SourceState get sourceState => _source.state; + + static const notificationUpdateInterval = Duration(seconds: 1); + + Analyzer() { + debugPrint('$runtimeType create'); + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$Analyzer', + object: this, + ); + } + _serviceStateNotifier.addListener(_onServiceStateChanged); + _source.stateNotifier.addListener(_onSourceStateChanged); + WidgetsBinding.instance.addObserver(this); + } + + void dispose() { + debugPrint('$runtimeType dispose'); + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + _stopUpdateTimer(); + _controller?.dispose(); + WidgetsBinding.instance.removeObserver(this); + _serviceStateNotifier.removeListener(_onServiceStateChanged); + _source.stateNotifier.removeListener(_onSourceStateChanged); + _source.dispose(); + } + + @override + void didHaveMemoryPressure() { + super.didHaveMemoryPressure(); + reportService.log('Analyzer memory pressure'); + } + + Future<void> start(dynamic args) async { + List<int>? entryIds; + var force = false; + if (args is Map) { + entryIds = (args['entryIds'] as List?)?.cast<int>(); + force = args['force'] ?? false; + } + await reportService.log('Analyzer start for ${entryIds?.length ?? 'all'} entries'); + _controller?.dispose(); + _controller = AnalysisController( + canStartService: false, + entryIds: entryIds, + force: force, + ); + + settings.systemLocalesFallback = await deviceService.getLocales(); + _l10n = await AppLocalizations.delegate.load(settings.appliedLocale); + _serviceStateNotifier.value = AnalyzerState.running; + await _source.init(scope: CollectionSource.fullScope, analysisController: _controller); + + _notificationUpdateTimer = Timer.periodic(notificationUpdateInterval, (_) async { + if (!isRunning) return; + await _updateNotification(); + }); + } + + Future<void> stop() async { + await reportService.log('Analyzer stop'); + _serviceStateNotifier.value = AnalyzerState.stopped; + } + + void _stopUpdateTimer() => _notificationUpdateTimer?.cancel(); + + Future<void> _onServiceStateChanged() async { + switch (serviceState) { + case AnalyzerState.running: + break; + case AnalyzerState.stopping: + await _stopPlatformService(); + _serviceStateNotifier.value = AnalyzerState.stopped; + case AnalyzerState.stopped: + _controller?.enableStopSignal(); + _stopUpdateTimer(); + } + } + + void _onSourceStateChanged() { + if (_source.isReady) { + _serviceStateNotifier.value = AnalyzerState.stopping; + } + } + + Future<void> _updateNotification() async { + if (!isRunning) return; + + final title = sourceState.getName(_l10n); + if (title == null) return; + + final progress = _source.progressNotifier.value; + final progressive = progress.total != 0 && sourceState != SourceState.locatingCountries; + + try { + await _channel.invokeMethod('updateNotification', <String, dynamic>{ + 'title': title, + 'message': progressive ? '${progress.done}/${progress.total}' : null, + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + Future<void> _stopPlatformService() async { + try { + await _channel.invokeMethod('stop'); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } +} diff --git a/lib/services/android_debug_service.dart b/lib/services/android_debug_service.dart new file mode 100644 index 0000000..47ff17c --- /dev/null +++ b/lib/services/android_debug_service.dart @@ -0,0 +1,189 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:flutter/services.dart'; + +class AndroidDebugService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/debug'); + + static Future<void> crash() async { + try { + await _platform.invokeMethod('crash'); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + static Future<void> exception() async { + try { + await _platform.invokeMethod('exception'); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + static Future<void> safeException() async { + try { + await _platform.invokeMethod('safeException'); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + static Future<void> exceptionInCoroutine() async { + try { + await _platform.invokeMethod('exceptionInCoroutine'); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + static Future<void> safeExceptionInCoroutine() async { + try { + await _platform.invokeMethod('safeExceptionInCoroutine'); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + static Future<Map> getContextDirs() async { + try { + final result = await _platform.invokeMethod('getContextDirs'); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + static Future<List<Map>> getCodecs() async { + try { + final result = await _platform.invokeMethod('getCodecs'); + if (result != null) return (result as List).cast<Map>(); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return []; + } + + static Future<Map> getEnv() async { + try { + final result = await _platform.invokeMethod('getEnv'); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + static Future<Map> getBitmapFactoryInfo(AvesEntry entry) async { + try { + // returns map with all data available when decoding image bounds with `BitmapFactory` + final result = await _platform.invokeMethod('getBitmapFactoryInfo', <String, dynamic>{ + 'uri': entry.uri, + }); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + static Future<Map> getContentResolverMetadata(AvesEntry entry) async { + try { + // returns map with all data available from the content resolver + final result = await _platform.invokeMethod('getContentResolverMetadata', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + }); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + static Future<Map> getExifInterfaceMetadata(AvesEntry entry) async { + try { + // returns map with all data available from the `ExifInterface` library + final result = await _platform.invokeMethod('getExifInterfaceMetadata', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + }); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + static Future<Map> getMediaMetadataRetrieverMetadata(AvesEntry entry) async { + try { + // returns map with all data available from `MediaMetadataRetriever` + final result = await _platform.invokeMethod('getMediaMetadataRetrieverMetadata', <String, dynamic>{ + 'uri': entry.uri, + }); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + static Future<Map> getMetadataExtractorSummary(AvesEntry entry) async { + try { + // returns map with the MIME type and tag count for each directory found by `metadata-extractor` + final result = await _platform.invokeMethod('getMetadataExtractorSummary', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + }); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + static Future<String?> getMp4ParserDump(AvesEntry entry) async { + try { + return await _platform.invokeMethod('getMp4ParserDump', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return null; + } + + static Future<Map> getPixyMetadata(AvesEntry entry) async { + try { + // returns map with all data available from the `PixyMeta` library + final result = await _platform.invokeMethod('getPixyMetadata', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + }); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + static Future<Map> getTiffStructure(AvesEntry entry) async { + if (entry.mimeType != MimeTypes.tiff) return {}; + + try { + final result = await _platform.invokeMethod('getTiffStructure', <String, dynamic>{ + 'uri': entry.uri, + }); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } +} diff --git a/lib/services/app_profile_service.dart b/lib/services/app_profile_service.dart new file mode 100644 index 0000000..c540bab --- /dev/null +++ b/lib/services/app_profile_service.dart @@ -0,0 +1,90 @@ +import 'dart:async'; + +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:flutter/services.dart'; + +abstract class AppProfileService { + Future<bool> canInteractAcrossProfiles(); + + Future<bool> canRequestInteractAcrossProfiles(); + + Future<bool> requestInteractAcrossProfiles(); + + Future<String> getProfileSwitchingLabel(); + + Future<void> switchProfile(); + + Future<List<String>> getTargetUserProfiles(); +} + +class PlatformAppProfileService implements AppProfileService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/app_profile'); + + @override + Future<bool> canInteractAcrossProfiles() async { + try { + final result = await _platform.invokeMethod('canInteractAcrossProfiles'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<bool> canRequestInteractAcrossProfiles() async { + try { + final result = await _platform.invokeMethod('canRequestInteractAcrossProfiles'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<bool> requestInteractAcrossProfiles() async { + try { + final result = await _platform.invokeMethod('requestInteractAcrossProfiles'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<void> switchProfile() async { + try { + await _platform.invokeMethod('switchProfile'); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return; + } + + @override + Future<String> getProfileSwitchingLabel() async { + try { + final result = await _platform.invokeMethod('getProfileSwitchingLabel'); + return result as String; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return ''; + } + + @override + Future<List<String>> getTargetUserProfiles() async { + try { + final result = await _platform.invokeMethod('getTargetUserProfiles'); + if (result != null) { + return (result as List).cast<String>(); + } + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return []; + } +} diff --git a/lib/services/app_service.dart b/lib/services/app_service.dart new file mode 100644 index 0000000..4c3f2ce --- /dev/null +++ b/lib/services/app_service.dart @@ -0,0 +1,273 @@ +import 'dart:async'; +import 'dart:ui' as ui; +import 'dart:ui'; + +import 'package:aves/geo/uri.dart'; +import 'package:aves/image_providers/thumbnail_provider.dart'; +import 'package:aves/model/app_inventory.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/decoding.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/painting.dart'; +import 'package:flutter/services.dart'; +import 'package:latlong2/latlong.dart'; + +abstract class AppService { + Future<Set<Package>> getPackages(); + + Future<ui.ImageDescriptor?> getAppIcon(String packageName, double size); + + Future<bool> copyToClipboard({String? label, String? text, String? uri}); + + Future<Map<String, dynamic>> edit(String uri, String mimeType); + + Future<bool> open(String uri, String mimeType, {required bool forceChooser}); + + Future<bool> openMap(LatLng latLng); + + Future<bool> setAs(String uri, String mimeType); + + Future<bool> shareEntries(Iterable<AvesEntry> entries); + + Future<bool> shareSingle(String uri, String mimeType); + + Future<void> pinToHomeScreen( + String label, + AvesEntry? coverEntry, { + required String route, + Set<CollectionFilter>? filters, + String? path, + String? viewUri, + String? geoUri, + }); +} + +class PlatformAppService implements AppService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/app'); + static final _stream = AvesStreamsChannel('deckers.thibault/aves/activity_result_stream'); + + static final _knownAppDirs = { + 'com.google.android.apps.photos': {'Google Photos'}, + 'com.kakao.talk': {'KakaoTalkDownload'}, + 'com.sony.playmemories.mobile': {'Imaging Edge Mobile'}, + 'nekox.messenger': {'NekoX'}, + 'org.telegram.messenger': {'Telegram Images', 'Telegram Video'}, + 'com.whatsapp': {'WhatsApp Animated Gifs', 'WhatsApp Documents', 'WhatsApp Images', 'WhatsApp Video'}, + }; + + @override + Future<Set<Package>> getPackages() async { + try { + final result = await _platform.invokeMethod('getPackages'); + final packages = (result as List).cast<Map>().map(Package.fromMap).toSet(); + // additional info for known directories + _knownAppDirs.forEach((packageName, dirs) { + final package = packages.firstWhereOrNull((package) => package.packageName == packageName); + if (package != null) { + package.ownedDirs.addAll(dirs); + } + }); + return packages; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + @override + Future<ui.ImageDescriptor?> getAppIcon(String packageName, double size) async { + try { + final result = await _platform.invokeMethod('getAppIcon', <String, dynamic>{ + 'packageName': packageName, + 'sizeDip': size, + }); + if (result != null) { + final bytes = result as Uint8List; + return InteropDecoding.rawBytesToDescriptor(bytes); + } + } on PlatformException catch (_) { + // ignore, as some packages legitimately do not have icons + } + return null; + } + + @override + Future<bool> copyToClipboard({String? label, String? text, String? uri}) async { + try { + final result = await _platform.invokeMethod('copyToClipboard', <String, dynamic>{ + 'label': label, + 'text': text, + 'uri': uri, + }); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<Map<String, dynamic>> edit(String uri, String mimeType) async { + try { + final opCompleter = Completer<Map?>(); + _stream + .receiveBroadcastStream(<String, dynamic>{ + 'op': 'edit', + 'uri': uri, + 'mimeType': mimeType, + }) + .listen( + (data) => opCompleter.complete(data as Map?), + onError: opCompleter.completeError, + onDone: () { + if (!opCompleter.isCompleted) opCompleter.complete({'error': 'cancelled'}); + }, + cancelOnError: true, + ); + // `await` here, so that `completeError` will be caught below + final result = await opCompleter.future; + if (result == null) return {'error': 'cancelled'}; + return result.cast<String, dynamic>(); + } on PlatformException catch (e, stack) { + if (e.code != 'edit-resolve') { + await reportService.recordError(e, stack); + } + return {'error': e.code}; + } + } + + @override + Future<bool> open(String uri, String mimeType, {required bool forceChooser}) async { + try { + final result = await _platform.invokeMethod('open', <String, dynamic>{ + 'uri': uri, + 'mimeType': mimeType, + 'forceChooser': forceChooser, + }); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<bool> openMap(LatLng latLng) async { + try { + final result = await _platform.invokeMethod('openMap', <String, dynamic>{ + 'geoUri': toGeoUri(latLng), + }); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<bool> setAs(String uri, String mimeType) async { + try { + final result = await _platform.invokeMethod('setAs', <String, dynamic>{ + 'uri': uri, + 'mimeType': mimeType, + }); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<bool> shareEntries(Iterable<AvesEntry> entries) { + return _share( + groupBy<AvesEntry, String>( + entries, + // loosen MIME type to a generic one, so we can share with badly defined apps + // e.g. Google Lens declares receiving "image/jpeg" only, but it can actually handle more formats + (e) => e.mimeTypeAnySubtype, + ).map((k, v) => MapEntry(k, v.map((e) => e.uri).toList())), + ); + } + + @override + Future<bool> shareSingle(String uri, String mimeType) { + return _share({ + mimeType: [uri], + }); + } + + Future<bool> _share(Map<String, List<String>> urisByMimeType) async { + try { + final result = await _platform.invokeMethod('share', <String, dynamic>{ + 'urisByMimeType': urisByMimeType, + }); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + if (e.code == 'share-large') { + throw TooManyItemsException(); + } else { + await reportService.recordError(e, stack); + } + } + return false; + } + + // app shortcuts + + @override + Future<void> pinToHomeScreen( + String label, + AvesEntry? coverEntry, { + required String route, + Set<CollectionFilter>? filters, + String? path, + String? viewUri, + String? geoUri, + }) async { + Uint8List? iconBytes; + if (coverEntry != null) { + final size = coverEntry.isVideo ? 0.0 : 256.0; + try { + final codec = await mediaFetchService.getThumbnail( + decoded: false, + request: ThumbnailProviderKey( + uri: coverEntry.uri, + mimeType: coverEntry.mimeType, + pageId: coverEntry.pageId, + rotationDegrees: coverEntry.rotationDegrees, + isFlipped: coverEntry.isFlipped, + dateModifiedMillis: coverEntry.dateModifiedMillis ?? -1, + extent: size, + ), + decode: PaintingBinding.instance.instantiateImageCodecWithSize, + ); + final frameInfo = await codec.getNextFrame(); + final byteData = await frameInfo.image.toByteData(format: ImageByteFormat.png); + iconBytes = byteData?.buffer.asUint8List(); + } catch (error) { + debugPrint('failed to get home pin thumbnail for entry=$coverEntry, error=$error'); + } + } + try { + await _platform.invokeMethod('pinShortcut', <String, dynamic>{ + 'label': label, + 'iconBytes': iconBytes, + 'route': route, + 'filters': filters?.map((filter) => filter.toJson()).toList(), + 'path': path, + 'viewUri': viewUri, + 'geoUri': geoUri, + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } +} + +class TooManyItemsException implements Exception {} diff --git a/lib/services/cast/cast_backend_switcher.dart b/lib/services/cast/cast_backend_switcher.dart new file mode 100644 index 0000000..45e125d --- /dev/null +++ b/lib/services/cast/cast_backend_switcher.dart @@ -0,0 +1,46 @@ +// lib/services/cast/cast_backend_switcher.dart + +import 'package:flutter/services.dart'; +import 'package:aves/widgets/cast/cast_controller.dart'; +import 'package:aves/widgets/cast/google_cast_controller.dart'; + +class CastBackendSwitcher { + static const MethodChannel _pluginChannel = + MethodChannel('google_cast'); // plugin unico + + // ------------------------------------------------------------ + // ⭐ Attiva Google Cast (CAF) + // ------------------------------------------------------------ + static Future<void> activateGoogleCast() async { + // 1) abilita plugin nativo Google Cast + await _pluginChannel.invokeMethod('setEnabled', true); + + // 2) reset Google Cast (chiude sessioni, pulisce stato) + GoogleCastController.instance.forceReset(); + + // 3) seleziona backend Google + await CastController.instance.setBackend(CastBackend.google); + } + + // ------------------------------------------------------------ + // ⭐ Attiva FAST (usa Google Cast SDK ma NON richiede reset) + // ------------------------------------------------------------ + static Future<void> activateFastCast() async { + // FAST usa il Cast SDK → NON disabilitare Google Cast + // NON chiudere sessioni + // NON resettare GoogleCastController + + // seleziona backend FAST + await CastController.instance.setBackend(CastBackend.fast); + } + + // ------------------------------------------------------------ + // ⭐ Attiva DLNA (NON usa Google Cast SDK) + // ------------------------------------------------------------ + static Future<void> activateDlnaCast() async { + // DLNA non usa il Cast SDK → NON toccare setEnabled() + + // seleziona backend DLNA + await CastController.instance.setBackend(CastBackend.dlna); + } +} diff --git a/lib/services/cast/cast_server.dart b/lib/services/cast/cast_server.dart new file mode 100644 index 0000000..f7c5097 --- /dev/null +++ b/lib/services/cast/cast_server.dart @@ -0,0 +1,291 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter/services.dart'; +import 'package:mime/mime.dart'; +import 'package:shelf/shelf.dart'; +import 'package:shelf/shelf_io.dart' as shelf_io; + +class CastServer { + HttpServer? _server; + String? _ip; + + bool get isRunning => _server != null; + + // ------------------------------------------------------------ + // TIMING DEBUG + // ------------------------------------------------------------ + static final Stopwatch _timingSw = Stopwatch()..start(); + + static int _ms() => _timingSw.elapsedMilliseconds; + + static String _isoNow() => DateTime.now().toIso8601String(); + + static void _tlog(String message) { + print('CASTT [${_ms()} ms][${_isoNow()}] $message'); + } + + // ============================================================ + // START SERVER — Versione identica al vecchio AVES + timing logs + // ============================================================ + Future<void> start() async { + if (_server != null) { + _tlog('castServer.start skip already-running ip=$_ip port=${_server?.port}'); + return; + } + + final sw = Stopwatch()..start(); + _tlog('castServer.start begin'); + + // 1) Ottieni IP Wi-Fi reale + final interfaces = await NetworkInterface.list( + includeLoopback: false, + type: InternetAddressType.IPv4, + ); + + _tlog('castServer.start interfaces found count=${interfaces.length} ms=${sw.elapsedMilliseconds}'); + + final wifi = interfaces.firstWhere( + (i) => i.name == 'wlan0' || i.name.contains('wifi'), + orElse: () => interfaces.first, + ); + + _ip = wifi.addresses.first.address; + _tlog('castServer.start selected interface=${wifi.name} ip=$_ip ms=${sw.elapsedMilliseconds}'); + + // 2) Bind su 0.0.0.0 e porta random (0) + _server = await HttpServer.bind( + InternetAddress.anyIPv4, + 0, + shared: true, + ); + + final port = _server!.port; + _tlog('castServer.start bound ip=$_ip port=$port ms=${sw.elapsedMilliseconds}'); + + // 3) Avvia Shelf sopra HttpServer esistente + final handler = const Pipeline().addHandler(_handleRequest); + shelf_io.serveRequests(_server!, handler); + + _tlog('castServer.start serveRequests active url=http://$_ip:$port ms=${sw.elapsedMilliseconds}'); + } + + // ============================================================ + // URL BUILDER — usa ID reale del MediaStore + // ============================================================ + String buildUrlForEntry(dynamic entry) { + final uri = entry.uri; + final mediaId = uri.split('/').last; + + final port = _server?.port ?? 0; + final url = 'http://$_ip:$port/media/$mediaId'; + _tlog('castServer.buildUrlForEntry mediaId=$mediaId url=$url'); + return url; + } + + // ============================================================ + // HANDLER HTTP + // ============================================================ + static Future<Response> _handleRequest(Request request) async { + final sw = Stopwatch()..start(); + final path = request.requestedUri.path; + final range = request.headers['range']; + + _tlog('CAST SERVER request start method=${request.method} path=$path range=$range'); + + // URL tipo: /media/1000113738 + if (request.url.pathSegments.isEmpty || + request.url.pathSegments.first != 'media') { + _tlog('CAST SERVER invalid path path=$path ms=${sw.elapsedMilliseconds}'); + return Response.notFound('Invalid path'); + } + + final idStr = request.url.pathSegments.length > 1 + ? request.url.pathSegments[1] + : null; + + final id = int.tryParse(idStr ?? ''); + if (id == null) { + _tlog('CAST SERVER invalid id raw=$idStr ms=${sw.elapsedMilliseconds}'); + return Response.notFound('Invalid ID'); + } + + final lookupSw = Stopwatch()..start(); + final filePath = await _getFilePath(id); + _tlog('CAST SERVER getFilePath done id=$id ms=${lookupSw.elapsedMilliseconds} path=$filePath'); + + if (filePath == null) { + _tlog('CAST SERVER No file for ID=$id totalMs=${sw.elapsedMilliseconds}'); + return Response.notFound('No file for ID=$id'); + } + + final file = File(filePath); + final exists = await file.exists(); + if (!exists) { + _tlog('CAST SERVER file missing id=$id path=$filePath totalMs=${sw.elapsedMilliseconds}'); + return Response.notFound('File not found'); + } + + final fileLength = await file.length(); + final mime = lookupMimeType(file.path) ?? 'application/octet-stream'; + _tlog('CAST SERVER file ready id=$id size=$fileLength mime=$mime totalMs=${sw.elapsedMilliseconds}'); + + return _serveFileWithRange( + file, + request, + id: id, + requestStopwatch: sw, + fileLength: fileLength, + mime: mime, + ); + } + + // ============================================================ + // RANGE / 206 (necessario per Chromecast) + // ============================================================ + static Future<Response> _serveFileWithRange( + File file, + Request request, { + required int id, + required Stopwatch requestStopwatch, + required int fileLength, + required String mime, + }) async { + final range = request.headers['range']; + + _tlog('CAST SERVER response preparing id=$id method=${request.method} range=$range totalMs=${requestStopwatch.elapsedMilliseconds}'); + + // HEAD + if (request.method == 'HEAD') { + _tlog('CAST SERVER HEAD response id=$id size=$fileLength totalMs=${requestStopwatch.elapsedMilliseconds}'); + return Response.ok( + null, + headers: { + 'Content-Type': mime, + 'Content-Length': '$fileLength', + 'Accept-Ranges': 'bytes', + }, + ); + } + + // Nessun range → 200 + if (range == null || !range.startsWith('bytes=')) { + final stream = _logStreamCompletion( + file.openRead(), + label: 'CAST SERVER 200 stream', + id: id, + startOffset: 0, + endOffset: fileLength - 1, + declaredLength: fileLength, + requestStopwatch: requestStopwatch, + ); + + _tlog('CAST SERVER 200 response start id=$id bytes=0-${fileLength - 1}/$fileLength totalMs=${requestStopwatch.elapsedMilliseconds}'); + return Response.ok( + stream, + headers: { + 'Content-Type': mime, + 'Content-Length': '$fileLength', + 'Accept-Ranges': 'bytes', + }, + ); + } + + // Range parsing + final spec = range.substring('bytes='.length).trim(); + final parts = spec.split('-'); + int? start = int.tryParse(parts.first); + int? end = parts.length > 1 ? int.tryParse(parts[1]) : null; + + if (start == null && end != null) { + final suffix = end; + start = (fileLength - suffix).clamp(0, fileLength); + end = fileLength - 1; + } + + start ??= 0; + end ??= fileLength - 1; + + if (start < 0) start = 0; + if (end >= fileLength) end = fileLength - 1; + + final contentLength = end - start + 1; + final rawStream = file.openRead(start, end + 1); + final stream = _logStreamCompletion( + rawStream, + label: 'CAST SERVER 206 stream', + id: id, + startOffset: start, + endOffset: end, + declaredLength: contentLength, + requestStopwatch: requestStopwatch, + ); + + _tlog('CAST SERVER 206 response start id=$id range=$start-$end/$fileLength contentLength=$contentLength totalMs=${requestStopwatch.elapsedMilliseconds}'); + + return Response( + 206, + body: stream, + headers: { + 'Content-Type': mime, + 'Content-Length': '$contentLength', + 'Content-Range': 'bytes $start-$end/$fileLength', + 'Accept-Ranges': 'bytes', + }, + ); + } + + static Stream<List<int>> _logStreamCompletion( + Stream<List<int>> source, { + required String label, + required int id, + required int startOffset, + required int endOffset, + required int declaredLength, + required Stopwatch requestStopwatch, + }) async* { + int sentBytes = 0; + final streamSw = Stopwatch()..start(); + _tlog('$label begin id=$id from=$startOffset to=$endOffset declaredLength=$declaredLength totalMs=${requestStopwatch.elapsedMilliseconds}'); + + try { + await for (final chunk in source) { + sentBytes += chunk.length; + yield chunk; + } + _tlog('$label end id=$id sentBytes=$sentBytes streamMs=${streamSw.elapsedMilliseconds} totalMs=${requestStopwatch.elapsedMilliseconds}'); + } catch (e) { + _tlog('$label error id=$id sentBytes=$sentBytes streamMs=${streamSw.elapsedMilliseconds} totalMs=${requestStopwatch.elapsedMilliseconds} error=$e'); + rethrow; + } + } + + // ============================================================ + // Recupero path dal DB AVES + // ============================================================ + static Future<String?> _getFilePath(int id) async { + const channel = MethodChannel('aves/entry_path'); + final sw = Stopwatch()..start(); + _tlog('CAST SERVER getFilePath start id=$id'); + + try { + final path = await channel.invokeMethod<String>( + 'getEntryPath', + {'id': id}, + ); + _tlog('CAST SERVER getFilePath end id=$id ms=${sw.elapsedMilliseconds} path=$path'); + return path; + } catch (e) { + _tlog('CAST SERVER getFilePath error id=$id ms=${sw.elapsedMilliseconds} error=$e'); + return null; + } + } + + Future<void> ensureStarted() async { + if (!isRunning) { + await start(); + } + } +} + +final castServer = CastServer(); diff --git a/lib/services/common/channel.dart b/lib/services/common/channel.dart new file mode 100644 index 0000000..d3bfbfc --- /dev/null +++ b/lib/services/common/channel.dart @@ -0,0 +1,29 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:streams_channel/streams_channel.dart'; + +const bool debugAvesPlatformChannels = kDebugMode; + +class AvesMethodChannel extends MethodChannel { + const AvesMethodChannel(super.name); + + @override + Future<T?> invokeMethod<T>(String method, [arguments]) { + if (debugAvesPlatformChannels) { + debugPrint('$runtimeType invokeMethod name=$name method=$method arguments=$arguments'); + } + return super.invokeMethod(method, arguments); + } +} + +class AvesStreamsChannel extends StreamsChannel { + AvesStreamsChannel(super.name); + + @override + Stream receiveBroadcastStream([arguments]) { + if (debugAvesPlatformChannels) { + debugPrint('$runtimeType invokeMethod name=$name arguments=$arguments'); + } + return super.receiveBroadcastStream(arguments); + } +} diff --git a/lib/services/common/custom_exception.dart b/lib/services/common/custom_exception.dart new file mode 100644 index 0000000..68da3ee --- /dev/null +++ b/lib/services/common/custom_exception.dart @@ -0,0 +1,27 @@ +import 'package:flutter/services.dart'; + +class CustomPlatformException { + final String code; + final String? message; + final dynamic details; + final String? stacktrace; + + CustomPlatformException({ + required this.code, + this.message, + this.details, + this.stacktrace, + }); + + factory CustomPlatformException.fromStandard(PlatformException e) { + return CustomPlatformException( + code: e.code, + message: e.message, + details: e.details, + stacktrace: e.stacktrace, + ); + } + + @override + String toString() => '$runtimeType($code, $message, $details, $stacktrace)'; +} diff --git a/lib/services/common/decoding.dart b/lib/services/common/decoding.dart new file mode 100644 index 0000000..67ee61e --- /dev/null +++ b/lib/services/common/decoding.dart @@ -0,0 +1,55 @@ +import 'dart:async'; +import 'dart:ui' as ui; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/painting.dart'; +import 'package:flutter/services.dart'; + +class InteropDecoding { + // bytes are expected to be in a basic format decodable by Flutter + static Future<ui.Codec?> encodedBytesToCodec(Uint8List? bytes, ImageDecoderCallback? decode) async { + if (bytes == null || decode == null) return null; + + const trailerLength = 1; // decoded/encoded format byte + final byteCount = bytes.lengthInBytes; + if (byteCount < trailerLength) return null; + + final trailerOffset = byteCount - trailerLength; + + // trim custom trailer + // a view does not reallocate memory and uses the underlying buffer + final imageBytes = Uint8List.sublistView(bytes, 0, trailerOffset); + + final buffer = await ui.ImmutableBuffer.fromUint8List(imageBytes); + return await decode(buffer); + } + + // bytes are expected to be in ARGB_8888 + // with a custom trailer from the platform side + static Future<ui.ImageDescriptor?> rawBytesToDescriptor(Uint8List? bytes) async { + if (bytes == null) return null; + + const trailerLength = 4 * 2 + 1; // 2 integers + decoded/encoded format byte + final byteCount = bytes.lengthInBytes; + if (byteCount < trailerLength) return null; + + final trailerOffset = byteCount - trailerLength; + + // fetch trailer + final trailer = ByteData.sublistView(bytes, trailerOffset); + final bitmapWidth = trailer.getUint32(0); + final bitmapHeight = trailer.getUint32(4); + + // trim custom trailer + // a view does not reallocate memory and uses the underlying buffer + final imageBytes = Uint8List.sublistView(bytes, 0, trailerOffset); + + final buffer = await ui.ImmutableBuffer.fromUint8List(imageBytes); + return ui.ImageDescriptor.raw( + buffer, + width: bitmapWidth, + height: bitmapHeight, + pixelFormat: ui.PixelFormat.rgba8888, + ); + } +} diff --git a/lib/services/common/image_op_events.dart b/lib/services/common/image_op_events.dart new file mode 100644 index 0000000..3054c7e --- /dev/null +++ b/lib/services/common/image_op_events.dart @@ -0,0 +1,86 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class ImageOpEvent extends Equatable { + final bool success, skipped; + final String uri; + + @override + List<Object?> get props => [success, skipped, uri]; + + const ImageOpEvent({ + required this.success, + required this.skipped, + required this.uri, + }); + + factory ImageOpEvent.fromMap(Map map) { + final skipped = map['skipped'] ?? false; + return ImageOpEvent( + success: (map['success'] ?? false) || skipped, + skipped: skipped, + uri: map['uri'], + ); + } +} + +@immutable +class MoveOpEvent extends ImageOpEvent { + final Map newFields; + final bool deleted; + + @override + List<Object?> get props => [success, skipped, uri, newFields, deleted]; + + const MoveOpEvent({ + required super.success, + required super.skipped, + required super.uri, + required this.newFields, + required this.deleted, + }); + + factory MoveOpEvent.fromMap(Map map) { + final newFields = map['newFields'] ?? {}; + final skipped = (map['skipped'] ?? false) || (newFields['skipped'] ?? false); + final deleted = (map['deleted'] ?? false) || (newFields['deleted'] ?? false); + return MoveOpEvent( + success: (map['success'] ?? false) || skipped, + skipped: skipped, + uri: map['uri'], + newFields: newFields, + deleted: deleted, + ); + } +} + +@immutable +class ExportOpEvent extends MoveOpEvent { + final int? pageId; + + @override + List<Object?> get props => [success, skipped, uri, pageId, newFields]; + + const ExportOpEvent({ + required super.success, + required super.skipped, + required super.uri, + this.pageId, + required super.newFields, + }) : super( + deleted: false, + ); + + factory ExportOpEvent.fromMap(Map map) { + final newFields = map['newFields'] ?? {}; + final skipped = (map['skipped'] ?? false) || (newFields['skipped'] ?? false); + return ExportOpEvent( + success: (map['success'] ?? false) || skipped, + skipped: skipped, + uri: map['uri'], + pageId: map['pageId'], + newFields: newFields, + ); + } +} diff --git a/lib/services/common/output_buffer.dart b/lib/services/common/output_buffer.dart new file mode 100644 index 0000000..e64f046 --- /dev/null +++ b/lib/services/common/output_buffer.dart @@ -0,0 +1,36 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +// adapted from Flutter `_OutputBuffer` in `/foundation/consolidate_response.dart` +class OutputBuffer extends ByteConversionSinkBase { + List<List<int>>? _chunks = <List<int>>[]; + int _contentLength = 0; + Uint8List? _bytes; + + @override + void add(List<int> chunk) { + assert(_bytes == null); + _chunks!.add(chunk); + _contentLength += chunk.length; + } + + @override + void close() { + if (_bytes != null) { + // We've already been closed; this is a no-op + return; + } + _bytes = Uint8List(_contentLength); + int offset = 0; + for (final List<int> chunk in _chunks!) { + _bytes!.setRange(offset, offset + chunk.length, chunk); + offset += chunk.length; + } + _chunks = null; + } + + Uint8List get bytes { + assert(_bytes != null); + return _bytes!; + } +} diff --git a/lib/services/common/service_policy.dart b/lib/services/common/service_policy.dart new file mode 100644 index 0000000..1b53ccc --- /dev/null +++ b/lib/services/common/service_policy.dart @@ -0,0 +1,135 @@ +import 'dart:async'; +import 'dart:collection'; + +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; + +final ServicePolicy servicePolicy = ServicePolicy._private(); + +class ServicePolicy { + final StreamController<QueueState> _queueStreamController = StreamController.broadcast(); + final Map<Object, (int, _Task)> _paused = {}; + final SplayTreeMap<int, LinkedHashMap<Object, _Task>> _queues = SplayTreeMap(); + final LinkedHashMap<Object, _Task> _runningQueue = LinkedHashMap(); + + // magic number + static const concurrentTaskMax = 4; + + Stream<QueueState> get queueStream => _queueStreamController.stream; + + ServicePolicy._private(); + + Future<T> call<T>( + Future<T> Function() platformCall, { + int priority = ServiceCallPriority.normal, + Object? key, + }) { + Completer<T> taskCompleter; + _Task<T> task; + key ??= platformCall.hashCode; + final toResume = _paused.remove(key); + if (toResume != null) { + priority = toResume.$1; + task = toResume.$2 as _Task<T>; + taskCompleter = task.completer; + } else { + taskCompleter = Completer<T>(); + task = _Task<T>( + () async { + try { + taskCompleter.complete(await platformCall()); + } catch (error, stack) { + taskCompleter.completeError(error, stack); + } + _runningQueue.remove(key); + _pickNext(); + }, + taskCompleter, + ); + } + _getQueue(priority)[key] = task; + _pickNext(); + return taskCompleter.future; + } + + Future<T>? resume<T>(Object key) { + final toResume = _paused.remove(key); + if (toResume != null) { + final priority = toResume.$1; + final task = toResume.$2 as _Task<T>; + _getQueue(priority)[key] = task; + _pickNext(); + return task.completer.future; + } else { + return null; + } + } + + LinkedHashMap<Object, _Task> _getQueue(int priority) => _queues.putIfAbsent(priority, LinkedHashMap.new); + + void _pickNext() { + _notifyQueueState(); + if (_runningQueue.length >= concurrentTaskMax) return; + final queue = _queues.entries.firstWhereOrNull((kv) => kv.value.isNotEmpty)?.value; + if (queue != null && queue.isNotEmpty) { + final key = queue.keys.first; + final task = queue.remove(key)!; + _runningQueue[key] = task; + task.callback(); + } + } + + bool _takeOut(Object key, Iterable<int> priorities, void Function(int priority, _Task task) action) { + var out = false; + priorities.forEach((priority) { + final task = _getQueue(priority).remove(key); + if (task != null) { + out = true; + action(priority, task); + } + }); + return out; + } + + bool cancel(Object key, Iterable<int> priorities) { + return _takeOut(key, priorities, (priority, task) => task.completer.completeError(CancelledException())); + } + + bool pause(Object key, Iterable<int> priorities) { + return _takeOut(key, priorities, (priority, task) => _paused.putIfAbsent(key, () => (priority, task))); + } + + bool isPaused(Object key) => _paused.containsKey(key); + + void _notifyQueueState() { + if (!_queueStreamController.hasListener) return; + + final queueByPriority = Map.fromEntries(_queues.entries.map((kv) => MapEntry(kv.key, kv.value.length))); + _queueStreamController.add(QueueState(queueByPriority, _runningQueue.length, _paused.length)); + } +} + +class _Task<T> { + final VoidCallback callback; + final Completer<T> completer; + + const _Task(this.callback, this.completer); +} + +class CancelledException {} + +class ServiceCallPriority { + static const int getFastThumbnail = 100; + static const int getRegion = 150; + static const int getSizedThumbnail = 200; + static const int normal = 500; + static const int getMetadata = 1000; + static const int getLocation = 1000; +} + +class QueueState { + final Map<int, int> queueByPriority; + final int runningCount, pausedCount; + + const QueueState(this.queueByPriority, this.runningCount, this.pausedCount); +} diff --git a/lib/services/common/services.dart b/lib/services/common/services.dart new file mode 100644 index 0000000..eae00cb --- /dev/null +++ b/lib/services/common/services.dart @@ -0,0 +1,77 @@ +import 'package:aves/model/availability.dart'; +import 'package:aves/model/db/db.dart'; +import 'package:aves/model/db/db_sqflite.dart'; +import 'package:aves/model/settings/store_shared_pref.dart'; +import 'package:aves/services/app_profile_service.dart'; +import 'package:aves/services/app_service.dart'; +import 'package:aves/services/device_service.dart'; +import 'package:aves/services/media/embedded_data_service.dart'; +import 'package:aves/services/media/media_edit_service.dart'; +import 'package:aves/services/media/media_fetch_service.dart'; +import 'package:aves/services/media/media_session_service.dart'; +import 'package:aves/services/media/media_store_service.dart'; +import 'package:aves/services/metadata/metadata_edit_service.dart'; +import 'package:aves/services/metadata/metadata_fetch_service.dart'; +import 'package:aves/services/security_service.dart'; +import 'package:aves/services/storage_service.dart'; +import 'package:aves/services/window_service.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_report/aves_report.dart'; +import 'package:aves_report_platform/aves_report_platform.dart'; +import 'package:aves_services/aves_services.dart'; +import 'package:aves_services_platform/aves_services_platform.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:aves_video_mpv/aves_video_mpv.dart'; +import 'package:get_it/get_it.dart'; +import 'package:path/path.dart' as p; + +final getIt = GetIt.instance; + +// fixed implementation is easier for test driver setup +final SettingsStore settingsStore = SharedPrefSettingsStore(); + +final p.Context pContext = getIt<p.Context>(); +final AvesAvailability availability = getIt<AvesAvailability>(); +final LocalMediaDb localMediaDb = getIt<LocalMediaDb>(); +final AvesVideoControllerFactory videoControllerFactory = getIt<AvesVideoControllerFactory>(); +final AvesVideoMetadataFetcher videoMetadataFetcher = getIt<AvesVideoMetadataFetcher>(); + +final AppService appService = getIt<AppService>(); +final AppProfileService appProfileService = getIt<AppProfileService>(); +final DeviceService deviceService = getIt<DeviceService>(); +final EmbeddedDataService embeddedDataService = getIt<EmbeddedDataService>(); +final MediaEditService mediaEditService = getIt<MediaEditService>(); +final MediaFetchService mediaFetchService = getIt<MediaFetchService>(); +final MediaSessionService mediaSessionService = getIt<MediaSessionService>(); +final MediaStoreService mediaStoreService = getIt<MediaStoreService>(); +final MetadataEditService metadataEditService = getIt<MetadataEditService>(); +final MetadataFetchService metadataFetchService = getIt<MetadataFetchService>(); +final MobileServices mobileServices = getIt<MobileServices>(); +final ReportService reportService = getIt<ReportService>(); +final SecurityService securityService = getIt<SecurityService>(); +final StorageService storageService = getIt<StorageService>(); +final WindowService windowService = getIt<WindowService>(); + +void initPlatformServices() { + getIt.registerLazySingleton<p.Context>(p.Context.new); + getIt.registerLazySingleton<AvesAvailability>(LiveAvesAvailability.new); + getIt.registerLazySingleton<LocalMediaDb>(SqfliteLocalMediaDb.new); + getIt.registerLazySingleton<AvesVideoControllerFactory>(MpvVideoControllerFactory.new); + getIt.registerLazySingleton<AvesVideoMetadataFetcher>(MpvVideoMetadataFetcher.new); + + getIt.registerLazySingleton<AppService>(PlatformAppService.new); + getIt.registerLazySingleton<AppProfileService>(PlatformAppProfileService.new); + getIt.registerLazySingleton<DeviceService>(PlatformDeviceService.new); + getIt.registerLazySingleton<EmbeddedDataService>(PlatformEmbeddedDataService.new); + getIt.registerLazySingleton<MediaEditService>(PlatformMediaEditService.new); + getIt.registerLazySingleton<MediaFetchService>(PlatformMediaFetchService.new); + getIt.registerLazySingleton<MediaSessionService>(PlatformMediaSessionService.new); + getIt.registerLazySingleton<MediaStoreService>(PlatformMediaStoreService.new); + getIt.registerLazySingleton<MetadataEditService>(PlatformMetadataEditService.new); + getIt.registerLazySingleton<MetadataFetchService>(PlatformMetadataFetchService.new); + getIt.registerLazySingleton<MobileServices>(PlatformMobileServices.new); + getIt.registerLazySingleton<ReportService>(PlatformReportService.new); + getIt.registerLazySingleton<SecurityService>(PlatformSecurityService.new); + getIt.registerLazySingleton<StorageService>(PlatformStorageService.new); + getIt.registerLazySingleton<WindowService>(PlatformWindowService.new); +} diff --git a/lib/services/device_service.dart b/lib/services/device_service.dart new file mode 100644 index 0000000..9619210 --- /dev/null +++ b/lib/services/device_service.dart @@ -0,0 +1,179 @@ +import 'dart:ui'; + +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:flutter/services.dart'; + +abstract class DeviceService { + Future<bool> canManageMedia(); + + Future<Map<String, dynamic>> getCapabilities(); + + Future<List<Locale>> getLocales(); + + Future<void> setLocaleConfig(List<Locale> locales); + + // 0 is Sunday + Future<int?> getFirstDayOfWeekIndex(); + + Future<int> getPerformanceClass(); + + Future<double?> getWidgetCornerRadiusPx(); + + Future<bool> isLocked(); + + Future<bool> isSystemFilePickerEnabled(); + + Future<void> requestMediaManagePermission(); + + Future<int> getAvailableHeapSize(); + + Future<void> requestGarbageCollection(); +} + +class PlatformDeviceService implements DeviceService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/device'); + + @override + Future<bool> canManageMedia() async { + try { + final result = await _platform.invokeMethod('canManageMedia'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<Map<String, dynamic>> getCapabilities() async { + try { + final result = await _platform.invokeMethod('getCapabilities'); + if (result != null) return (result as Map).cast<String, dynamic>(); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + @override + Future<List<Locale>> getLocales() async { + try { + final result = await _platform.invokeMethod('getLocales'); + if (result != null) { + return (result as List).cast<Map>().map((tags) { + final language = tags['language'] as String?; + final country = tags['country'] as String?; + return Locale( + language ?? 'und', + (country != null && country.isEmpty) ? null : country, + ); + }).toList(); + } + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return []; + } + + @override + Future<void> setLocaleConfig(List<Locale> locales) async { + try { + await _platform.invokeMethod('setLocaleConfig', <String, dynamic>{ + 'locales': locales.map((v) => v.toLanguageTag()).toList(), + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + @override + Future<int?> getFirstDayOfWeekIndex() async { + try { + final result = await _platform.invokeMethod('getFirstDayOfWeek'); + if (result != null) { + final day = result as String; + final index = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'].indexOf(day); + if (index >= 0) { + return index; + } + } + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return null; + } + + @override + Future<int> getPerformanceClass() async { + try { + final result = await _platform.invokeMethod('getPerformanceClass'); + if (result != null) return result as int; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return 0; + } + + @override + Future<double?> getWidgetCornerRadiusPx() async { + try { + final result = await _platform.invokeMethod('getWidgetCornerRadiusPx'); + if (result != null) return result as double; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return null; + } + + @override + Future<bool> isLocked() async { + try { + final result = await _platform.invokeMethod('isLocked'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<bool> isSystemFilePickerEnabled() async { + try { + final result = await _platform.invokeMethod('isSystemFilePickerEnabled'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<void> requestMediaManagePermission() async { + try { + await _platform.invokeMethod('requestMediaManagePermission'); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + @override + Future<int> getAvailableHeapSize() async { + try { + final result = await _platform.invokeMethod('getAvailableHeapSize'); + if (result != null) return result as int; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return 0; + } + + @override + Future<void> requestGarbageCollection() async { + try { + await _platform.invokeMethod('requestGarbageCollection'); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } +} diff --git a/lib/services/geocoding_service.dart b/lib/services/geocoding_service.dart new file mode 100644 index 0000000..4cf04ef --- /dev/null +++ b/lib/services/geocoding_service.dart @@ -0,0 +1,66 @@ +import 'dart:async'; +import 'dart:ui'; + +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:aves/services/common/channel.dart'; + +class GeocodingService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/geocoding'); + + // geocoding requires Google Play Services + static Future<List<Address>> getAddress(LatLng coordinates, Locale locale) async { + try { + final result = await _platform.invokeMethod('getAddress', <String, dynamic>{ + 'latitude': coordinates.latitude, + 'longitude': coordinates.longitude, + 'localeLanguageTag': locale.toLanguageTag(), + // we only really need one address, but sometimes the native geocoder + // returns nothing with `maxResults` of 1, but succeeds with `maxResults` of 2+ + 'maxResults': 2, + }); + return (result as List).cast<Map>().map(Address.fromMap).toList(); + } on PlatformException catch (_) { + // do not report + } + return []; + } +} + +@immutable +class Address extends Equatable { + final String? addressLine, adminArea, countryCode, countryName, featureName, locality, postalCode, subAdminArea, subLocality, subThoroughfare, thoroughfare; + + @override + List<Object?> get props => [addressLine, adminArea, countryCode, countryName, featureName, locality, postalCode, subAdminArea, subLocality, subThoroughfare, thoroughfare]; + + const Address({ + this.addressLine, + this.adminArea, + this.countryCode, + this.countryName, + this.featureName, + this.locality, + this.postalCode, + this.subAdminArea, + this.subLocality, + this.subThoroughfare, + this.thoroughfare, + }); + + factory Address.fromMap(Map map) => Address( + addressLine: map['addressLine'], + adminArea: map['adminArea'], + countryCode: map['countryCode'], + countryName: map['countryName'], + featureName: map['featureName'], + locality: map['locality'], + postalCode: map['postalCode'], + subAdminArea: map['subAdminArea'], + subLocality: map['subLocality'], + subThoroughfare: map['subThoroughfare'], + thoroughfare: map['thoroughfare'], + ); +} diff --git a/lib/services/global_search.dart b/lib/services/global_search.dart new file mode 100644 index 0000000..33249eb --- /dev/null +++ b/lib/services/global_search.dart @@ -0,0 +1,79 @@ +import 'dart:ui'; + +import 'package:aves/model/entry/sort.dart'; +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/format.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:intl/date_symbol_data_local.dart'; + +class GlobalSearch { + static const _platform = AvesMethodChannel('deckers.thibault/aves/global_search'); + + static Future<void> registerCallback() async { + try { + await _platform.invokeMethod('registerCallback', <String, dynamic>{ + // callback needs to be annotated with `@pragma('vm:entry-point')` to work in release mode + 'callbackHandle': PluginUtilities.getCallbackHandle(_init)?.toRawHandle(), + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } +} + +@pragma('vm:entry-point') +Future<void> _init() async { + WidgetsFlutterBinding.ensureInitialized(); + + // service initialization for path context, database + initPlatformServices(); + await localMediaDb.init(); + + // `intl` initialization for date formatting + await initializeDateFormatting(); + + const _channel = AvesMethodChannel('deckers.thibault/aves/global_search_background'); + _channel.setMethodCallHandler((call) async { + switch (call.method) { + case 'getSuggestions': + return await _getSuggestions(call.arguments); + default: + throw PlatformException(code: 'not-implemented', message: 'failed to handle method=${call.method}'); + } + }); + await _channel.invokeMethod('initialized'); +} + +Future<List<Map<String, String?>>> _getSuggestions(dynamic args) async { + final suggestions = <Map<String, String?>>[]; + if (args is Map) { + final query = args['query']; + final locale = args['locale']; + final use24hour = args['use24hour']; + debugPrint('getSuggestions query=$query, locale=$locale use24hour=$use24hour'); + + if (query is String && locale is String) { + final entries = (await localMediaDb.searchLiveEntries(query, limit: 9)).toList(); + final catalogMetadata = await localMediaDb.loadCatalogMetadataById(entries.map((entry) => entry.id).toSet()); + catalogMetadata.forEach((metadata) => entries.firstWhereOrNull((entry) => entry.id == metadata.id)?.catalogMetadata = metadata); + entries.sort(AvesEntrySort.compareByDate); + + suggestions.addAll( + entries.map((entry) { + final date = entry.bestDate; + return { + 'data': entry.uri, + 'mimeType': entry.mimeType, + 'title': entry.bestTitle, + 'subtitle': date != null ? formatDateTime(date, locale, use24hour) : null, + 'iconUri': entry.uri, + }; + }), + ); + } + } + return suggestions; +} diff --git a/lib/services/intent_service.dart b/lib/services/intent_service.dart new file mode 100644 index 0000000..90ffde9 --- /dev/null +++ b/lib/services/intent_service.dart @@ -0,0 +1,74 @@ +import 'dart:async'; + +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/services/app_service.dart'; +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:flutter/services.dart'; + +class IntentService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/intent'); + static final _stream = AvesStreamsChannel('deckers.thibault/aves/activity_result_stream'); + + static Future<Map<String, dynamic>> getIntentData() async { + try { + // returns nullable map with 'action' and possibly 'uri' 'mimeType' + final result = await _platform.invokeMethod('getIntentData'); + if (result != null) return (result as Map).cast<String, dynamic>(); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + static Future<void> submitPickedItems(List<String> uris) async { + try { + await _platform.invokeMethod('submitPickedItems', <String, dynamic>{ + 'uris': uris, + }); + } on PlatformException catch (e, stack) { + if (e.code == 'submitPickedItems-large') { + throw TooManyItemsException(); + } else { + await reportService.recordError(e, stack); + } + } + } + + static Future<void> submitPickedCollectionFilters(Set<CollectionFilter>? filters) async { + try { + await _platform.invokeMethod('submitPickedCollectionFilters', <String, dynamic>{ + 'filters': filters?.map((filter) => filter.toJson()).toList(), + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + static Future<Set<CollectionFilter>?> pickCollectionFilters(Set<CollectionFilter>? initialFilters) async { + try { + final opCompleter = Completer<Set<CollectionFilter>?>(); + _stream + .receiveBroadcastStream(<String, dynamic>{ + 'op': 'pickCollectionFilters', + 'initialFilters': initialFilters?.map((filter) => filter.toJson()).toList(), + }) + .listen( + (data) { + final result = (data as List?)?.cast<String>().map(CollectionFilter.fromJson).nonNulls.toSet(); + opCompleter.complete(result); + }, + onError: opCompleter.completeError, + onDone: () { + if (!opCompleter.isCompleted) opCompleter.complete(null); + }, + cancelOnError: true, + ); + // `await` here, so that `completeError` will be caught below + return await opCompleter.future; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return null; + } +} diff --git a/lib/services/media/embedded_data_service.dart b/lib/services/media/embedded_data_service.dart new file mode 100644 index 0000000..9564c2c --- /dev/null +++ b/lib/services/media/embedded_data_service.dart @@ -0,0 +1,147 @@ +import 'dart:ui' as ui; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/decoding.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/text.dart'; +import 'package:flutter/services.dart'; + +abstract class EmbeddedDataService { + Future<List<ui.ImageDescriptor?>> getExifThumbnails(AvesEntry entry); + + Future<Map> extractGoogleDeviceItem(AvesEntry entry, String dataUri); + + Future<Map> extractMotionPhotoImage(AvesEntry entry); + + Future<Map> extractMotionPhotoVideo(AvesEntry entry); + + Future<Map> extractJpegMpfItem(AvesEntry entry, int index); + + Future<Map> extractVideoEmbeddedPicture(AvesEntry entry); + + Future<Map> extractXmpDataProp(AvesEntry entry, List<dynamic>? props, String? propMimeType); +} + +class PlatformEmbeddedDataService implements EmbeddedDataService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/embedded'); + + @override + Future<List<ui.ImageDescriptor?>> getExifThumbnails(AvesEntry entry) async { + try { + final result = await _platform.invokeMethod('getExifThumbnails', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + }); + if (result != null) { + final descriptors = <ui.ImageDescriptor?>[]; + await Future.forEach((result as List).cast<Uint8List>(), (bytes) async { + descriptors.add(await InteropDecoding.rawBytesToDescriptor(bytes)); + }); + return descriptors; + } + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return []; + } + + @override + Future<Map> extractGoogleDeviceItem(AvesEntry entry, String dataUri) async { + try { + final result = await _platform.invokeMethod('extractGoogleDeviceItem', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + 'displayName': ['${entry.bestTitle}', dataUri].join(AText.separator), + 'dataUri': dataUri, + }); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + @override + Future<Map> extractMotionPhotoImage(AvesEntry entry) async { + try { + final result = await _platform.invokeMethod('extractMotionPhotoImage', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + 'displayName': ['${entry.bestTitle}', 'Image'].join(AText.separator), + }); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + @override + Future<Map> extractMotionPhotoVideo(AvesEntry entry) async { + try { + final result = await _platform.invokeMethod('extractMotionPhotoVideo', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + 'displayName': ['${entry.bestTitle}', 'Video'].join(AText.separator), + }); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + @override + Future<Map> extractJpegMpfItem(AvesEntry entry, int id) async { + try { + final result = await _platform.invokeMethod('extractJpegMpfItem', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + 'displayName': ['${entry.bestTitle}', 'MPF #$id'].join(AText.separator), + 'id': id, + }); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + @override + Future<Map> extractVideoEmbeddedPicture(AvesEntry entry) async { + try { + final result = await _platform.invokeMethod('extractVideoEmbeddedPicture', <String, dynamic>{ + 'uri': entry.uri, + 'displayName': ['${entry.bestTitle}', 'Cover'].join(AText.separator), + }); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + @override + Future<Map> extractXmpDataProp(AvesEntry entry, List<dynamic>? props, String? propMimeType) async { + try { + final result = await _platform.invokeMethod('extractXmpDataProp', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + 'displayName': ['${entry.bestTitle}', '$props'].join(AText.separator), + 'propPath': props, + 'propMimeType': propMimeType, + }); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } +} diff --git a/lib/services/media/enums.dart b/lib/services/media/enums.dart new file mode 100644 index 0000000..4f47d6d --- /dev/null +++ b/lib/services/media/enums.dart @@ -0,0 +1,18 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +// names should match possible values on platform +enum NameConflictStrategy { rename, replace, skip } + +extension ExtraNameConflictStrategy on NameConflictStrategy { + String toPlatform() => name; + + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + NameConflictStrategy.rename => l10n.nameConflictStrategyRename, + NameConflictStrategy.replace => l10n.nameConflictStrategyReplace, + NameConflictStrategy.skip => l10n.nameConflictStrategySkip, + }; + } +} diff --git a/lib/services/media/media_edit_service.dart b/lib/services/media/media_edit_service.dart new file mode 100644 index 0000000..a7dd0f4 --- /dev/null +++ b/lib/services/media/media_edit_service.dart @@ -0,0 +1,209 @@ +import 'dart:async'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/image_op_events.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/media/enums.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +abstract class MediaEditService { + String get newOpId; + + Future<void> cancelFileOp(String opId); + + Stream<ImageOpEvent> delete({ + String? opId, + required Iterable<AvesEntry> entries, + }); + + Stream<MoveOpEvent> move({ + String? opId, + required Map<String, Iterable<AvesEntry>> entriesByDestination, + required bool copy, + required NameConflictStrategy nameConflictStrategy, + }); + + Stream<ExportOpEvent> export( + Iterable<AvesEntry> entries, { + required EntryConvertOptions options, + required String destinationAlbum, + required NameConflictStrategy nameConflictStrategy, + }); + + Stream<MoveOpEvent> rename({ + String? opId, + required Map<AvesEntry, String> entriesToNewName, + }); + + Future<Map<String, dynamic>> captureFrame( + AvesEntry entry, { + required String desiredName, + required Map<String, dynamic> exif, + required Uint8List bytes, + required String destinationAlbum, + required NameConflictStrategy nameConflictStrategy, + }); +} + +class PlatformMediaEditService implements MediaEditService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/media_edit'); + static final _opStream = AvesStreamsChannel('deckers.thibault/aves/media_op_stream'); + + @override + String get newOpId => DateTime.now().millisecondsSinceEpoch.toString(); + + @override + Future<void> cancelFileOp(String opId) async { + try { + await _platform.invokeMethod('cancelFileOp', <String, dynamic>{ + 'opId': opId, + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + @override + Stream<ImageOpEvent> delete({ + String? opId, + required Iterable<AvesEntry> entries, + }) { + try { + return _opStream + .receiveBroadcastStream(<String, dynamic>{ + 'op': 'delete', + 'id': opId, + 'entries': entries.map((entry) => entry.toPlatformEntryMap()).toList(), + }) + .where((event) => event is Map) + .map((event) => ImageOpEvent.fromMap(event as Map)); + } on PlatformException catch (e, stack) { + reportService.recordError(e, stack); + return Stream.error(e); + } + } + + @override + Stream<MoveOpEvent> move({ + String? opId, + required Map<String, Iterable<AvesEntry>> entriesByDestination, + required bool copy, + required NameConflictStrategy nameConflictStrategy, + }) { + try { + return _opStream + .receiveBroadcastStream(<String, dynamic>{ + 'op': 'move', + 'id': opId, + 'entriesByDestination': entriesByDestination.map((destination, entries) => MapEntry(destination, entries.map((entry) => entry.toPlatformEntryMap()).toList())), + 'copy': copy, + 'nameConflictStrategy': nameConflictStrategy.toPlatform(), + }) + .where((event) => event is Map) + .map((event) => MoveOpEvent.fromMap(event as Map)); + } on PlatformException catch (e, stack) { + reportService.recordError(e, stack); + return Stream.error(e); + } + } + + @override + Stream<ExportOpEvent> export( + Iterable<AvesEntry> entries, { + required EntryConvertOptions options, + required String destinationAlbum, + required NameConflictStrategy nameConflictStrategy, + }) { + try { + return _opStream + .receiveBroadcastStream(<String, dynamic>{ + 'op': 'convert', + 'entries': entries.map((entry) => entry.toPlatformEntryMap()).toList(), + 'mimeType': options.mimeType, + 'quality': options.quality, + 'lengthUnit': options.lengthUnit.name, + 'width': options.width, + 'height': options.height, + 'writeMetadata': options.writeMetadata, + 'destinationPath': destinationAlbum, + 'nameConflictStrategy': nameConflictStrategy.toPlatform(), + }) + .where((event) => event is Map) + .map((event) => ExportOpEvent.fromMap(event as Map)); + } on PlatformException catch (e, stack) { + reportService.recordError(e, stack); + return Stream.error(e); + } + } + + @override + Stream<MoveOpEvent> rename({ + String? opId, + required Map<AvesEntry, String> entriesToNewName, + }) { + try { + return _opStream + .receiveBroadcastStream(<String, dynamic>{ + 'op': 'rename', + 'id': opId, + 'entriesToNewName': entriesToNewName.map((entry, name) => MapEntry(entry.toPlatformEntryMap(), name)), + }) + .where((event) => event is Map) + .map((event) => MoveOpEvent.fromMap(event as Map)); + } on PlatformException catch (e, stack) { + reportService.recordError(e, stack); + return Stream.error(e); + } + } + + @override + Future<Map<String, dynamic>> captureFrame( + AvesEntry entry, { + required String desiredName, + required Map<String, dynamic> exif, + required Uint8List bytes, + required String destinationAlbum, + required NameConflictStrategy nameConflictStrategy, + }) async { + try { + final result = await _platform.invokeMethod('captureFrame', <String, dynamic>{ + 'uri': entry.uri, + 'desiredName': desiredName, + 'exif': exif, + 'bytes': bytes, + 'destinationPath': destinationAlbum, + 'nameConflictStrategy': nameConflictStrategy.toPlatform(), + }); + if (result != null) return (result as Map).cast<String, dynamic>(); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } +} + +@immutable +class EntryConvertOptions extends Equatable { + final EntryConvertAction action; + final String mimeType; + final bool writeMetadata; + final LengthUnit lengthUnit; + final int width, height, quality; + + @override + List<Object?> get props => [action, mimeType, writeMetadata, lengthUnit, width, height, quality]; + + const EntryConvertOptions({ + required this.action, + required this.mimeType, + required this.writeMetadata, + required this.lengthUnit, + required this.width, + required this.height, + required this.quality, + }); +} diff --git a/lib/services/media/media_fetch_service.dart b/lib/services/media/media_fetch_service.dart new file mode 100644 index 0000000..913a92b --- /dev/null +++ b/lib/services/media/media_fetch_service.dart @@ -0,0 +1,392 @@ +import 'dart:async'; +import 'dart:ui' as ui; + +import 'package:aves/image_providers/region_provider.dart'; +import 'package:aves/image_providers/thumbnail_provider.dart'; +import 'package:aves/model/app/support.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/decoding.dart'; +import 'package:aves/services/common/output_buffer.dart'; +import 'package:aves/services/common/service_policy.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves_report/aves_report.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/painting.dart'; +import 'package:flutter/services.dart'; + +abstract class MediaFetchService { + Future<AvesEntry?> getEntry(String uri, String? mimeType, {bool allowUnsized = false}); + + Future<Uint8List> getOriginalBytes(AvesEntry entry); + + Future<ui.Codec> getFullImage({ + required bool decoded, + required ImageRequest request, + required ImageDecoderCallback decode, + }); + + // `rect`: region to decode, with coordinates in reference to `imageSize` + Future<ui.Codec> getRegion({ + required bool decoded, + required RegionProviderKey request, + required ImageDecoderCallback decode, + Object? taskKey, + int? priority, + }); + + Future<ui.Codec> getThumbnail({ + required bool decoded, + required ThumbnailProviderKey request, + ImageDecoderCallback? decode, + Object? taskKey, + int? priority, + }); + + Future<void> clearImageDiskCache(); + + Future<void> clearImageMemoryCache(); + + bool cancelRegion(Object taskKey); + + bool cancelThumbnail(Object taskKey); + + Future<T>? resumeLoading<T>(Object taskKey); +} + +class PlatformMediaFetchService implements MediaFetchService { + static const _platformObject = AvesMethodChannel('deckers.thibault/aves/media_fetch_object'); + static final _byteStream = AvesStreamsChannel('deckers.thibault/aves/media_byte_stream'); + static const double _thumbnailDefaultSize = 64.0; + + static const int formatTrailerLength = 1; // single format byte + static const int formatByteEncoded = 0xCA; + static const int formatByteDecoded = 0xFE; + + @override + Future<AvesEntry?> getEntry(String uri, String? mimeType, {bool allowUnsized = false}) async { + try { + final result = + await _platformObject.invokeMethod('getEntry', <String, dynamic>{ + 'uri': uri, + 'mimeType': mimeType, + 'allowUnsized': allowUnsized, + }) + as Map; + AvesEntry.normalizeMimeTypeFields(result); + return AvesEntry.fromMap(result); + } on PlatformException catch (e, stack) { + // ignore media content URIs as it is likely an obsolete Media Store entry + if (!uri.startsWith('content://media/')) { + // ignore undecodable types + if (mimeType != null && !AppSupport.undecodableImages.contains(mimeType)) { + await reportService.recordError(e, stack); + } + } + } + return null; + } + + Map<String, dynamic> _requestToArgs(ImageRequest request, {required bool decoded}) { + return <String, dynamic>{ + 'op': 'getFullImage', + 'decoded': decoded, + 'uri': request.uri, + 'pageId': request.pageId, + 'mimeType': request.mimeType, + 'sizeBytes': request.sizeBytes, + 'rotationDegrees': request.rotationDegrees ?? 0, + 'isFlipped': request.isFlipped, + }; + } + + Future<Uint8List> _getBytes({ + required String mimeType, + required Map<String, dynamic> arguments, + BytesReceivedCallback? onBytesReceived, + int? sizeBytes, + }) async { + var bytesReceived = 0; + final opCompleter = Completer<Uint8List>(); + final sink = OutputBuffer(); + try { + _byteStream + .receiveBroadcastStream(arguments) + .listen( + (data) { + final chunk = data as Uint8List; + sink.add(chunk); + if (onBytesReceived != null) { + bytesReceived += chunk.length; + try { + onBytesReceived(bytesReceived, sizeBytes); + } catch (error, stack) { + opCompleter.completeError(error, stack); + return; + } + } + }, + onError: opCompleter.completeError, + onDone: () { + sink.close(); + opCompleter.complete(sink.bytes); + }, + cancelOnError: true, + ); + // `await` here, so that `completeError` will be caught below + return await opCompleter.future; + } on PlatformException catch (e, stack) { + debugPrint('$runtimeType _getBytes failed with error=$e'); + if (MimeTypes.isVisual(mimeType) && !_knownMediaTypes.contains(mimeType)) { + await reportService.recordError(e, stack); + } + } + return Uint8List(0); + } + + Future<ui.Codec> _bytesToCodec(Map<String, dynamic> args, Uint8List bytes, ImageDecoderCallback? decode) async { + final byteCount = bytes.lengthInBytes; + if (byteCount < formatTrailerLength) { + throw UnreportedStateError('failed to get image bytes for args=$args'); + } + + final trailerOffset = byteCount - formatTrailerLength; + final format = bytes[trailerOffset]; + switch (format) { + case formatByteEncoded: + if (decode == null) { + throw Exception('failed to decode encoded image bytes because decoder callback is missing for args=$args'); + } + // bytes are expected to be in a basic format decodable by Flutter + final codec = await InteropDecoding.encodedBytesToCodec(bytes, decode); + if (codec == null) { + throw UnreportedStateError('failed to get codec from encoded image bytes for args=$args'); + } + return codec; + case formatByteDecoded: + // bytes are expected to be in ARGB_8888, necessary for wide gamut or HDR + final descriptor = await InteropDecoding.rawBytesToDescriptor(bytes); + if (descriptor == null) { + throw UnreportedStateError('failed to get descriptor from decoded image bytes for args=$args'); + } + return descriptor.instantiateCodec(); + default: + throw UnreportedStateError('unsupported image format byte=$format for args=$args'); + } + } + + @override + Future<Uint8List> getOriginalBytes(AvesEntry entry) async { + final request = ImageRequest( + entry.uri, + entry.mimeType, + rotationDegrees: entry.rotationDegrees, + isFlipped: entry.isFlipped, + isAnimated: entry.isAnimated, + pageId: entry.pageId, + sizeBytes: entry.sizeBytes, + ); + final bytes = await _getBytes( + mimeType: request.mimeType, + arguments: _requestToArgs(request, decoded: false), + onBytesReceived: request.onBytesReceived, + sizeBytes: request.sizeBytes, + ); + + final byteCount = bytes.lengthInBytes; + if (byteCount <= formatTrailerLength) { + throw UnreportedStateError('failed to get image bytes for request=$request'); + } + + // trim custom trailer + // a view does not reallocate memory and uses the underlying buffer + return Uint8List.sublistView(bytes, 0, byteCount - formatTrailerLength); + } + + @override + Future<ui.Codec> getFullImage({ + required bool decoded, + required ImageRequest request, + required ImageDecoderCallback decode, + }) async { + final args = _requestToArgs(request, decoded: decoded); + final bytes = await _getBytes( + mimeType: request.mimeType, + arguments: args, + onBytesReceived: request.onBytesReceived, + sizeBytes: request.sizeBytes, + ); + return await _bytesToCodec(args, bytes, decode); + } + + @override + Future<ui.Codec> getRegion({ + required bool decoded, + required RegionProviderKey request, + required ImageDecoderCallback decode, + Object? taskKey, + int? priority, + }) { + final args = <String, dynamic>{ + 'op': 'getRegion', + 'decoded': decoded, + 'uri': request.uri, + 'pageId': request.pageId, + 'mimeType': request.mimeType, + 'sizeBytes': request.sizeBytes, + 'sampleSize': request.sampleSize, + 'regionX': request.regionRect.left, + 'regionY': request.regionRect.top, + 'regionWidth': request.regionRect.width, + 'regionHeight': request.regionRect.height, + 'imageWidth': request.imageSize.width.toInt(), + 'imageHeight': request.imageSize.height.toInt(), + }; + return servicePolicy.call( + () async { + final bytes = await _getBytes( + mimeType: request.mimeType, + arguments: args, + ); + return await _bytesToCodec(args, bytes, decode); + }, + priority: priority ?? ServiceCallPriority.getRegion, + key: taskKey, + ); + } + + @override + Future<ui.Codec> getThumbnail({ + required bool decoded, + required ThumbnailProviderKey request, + ImageDecoderCallback? decode, + Object? taskKey, + int? priority, + }) { + final args = <String, dynamic>{ + 'op': 'getThumbnail', + 'decoded': decoded, + 'uri': request.uri, + 'pageId': request.pageId, + 'mimeType': request.mimeType, + 'dateModifiedMillis': request.dateModifiedMillis, + 'rotationDegrees': request.rotationDegrees, + 'isFlipped': request.isFlipped, + 'widthDip': request.extent, + 'heightDip': request.extent, + 'defaultSizeDip': _thumbnailDefaultSize, + 'quality': 100, + }; + return servicePolicy.call( + () async { + final bytes = await _getBytes( + mimeType: request.mimeType, + arguments: args, + ); + return await _bytesToCodec(args, bytes, decode); + }, + priority: priority ?? (request.extent == 0 ? ServiceCallPriority.getFastThumbnail : ServiceCallPriority.getSizedThumbnail), + key: taskKey, + ); + } + + @override + Future<void> clearImageDiskCache() async { + try { + return _platformObject.invokeMethod('clearImageDiskCache'); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + @override + Future<void> clearImageMemoryCache() async { + try { + return _platformObject.invokeMethod('clearImageMemoryCache'); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + @override + bool cancelRegion(Object taskKey) => servicePolicy.pause(taskKey, [ServiceCallPriority.getRegion]); + + @override + bool cancelThumbnail(Object taskKey) => servicePolicy.pause(taskKey, [ServiceCallPriority.getFastThumbnail, ServiceCallPriority.getSizedThumbnail]); + + @override + Future<T>? resumeLoading<T>(Object taskKey) => servicePolicy.resume<T>(taskKey); + + // convenience methods + + static const Set<String> _knownOpaqueImages = { + MimeTypes.jpeg, + }; + + static const Set<String> _knownVideos = { + MimeTypes.v3gpp, + MimeTypes.asf, + MimeTypes.avi, + MimeTypes.aviMSVideo, + MimeTypes.aviVnd, + MimeTypes.aviXMSVideo, + MimeTypes.dl, + MimeTypes.dv, + MimeTypes.dvd, + MimeTypes.flv, + MimeTypes.flvX, + MimeTypes.gl, + MimeTypes.lsf, + MimeTypes.mkv, + MimeTypes.mkvX, + MimeTypes.mov, + MimeTypes.movX, + MimeTypes.mp2p, + MimeTypes.mp2t, + MimeTypes.mp2ts, + MimeTypes.mp4, + MimeTypes.mpeg, + MimeTypes.ogv, + MimeTypes.realVideo, + MimeTypes.webm, + MimeTypes.wmv, + }; + + static final Set<String> _knownMediaTypes = { + MimeTypes.anyImage, + ..._knownOpaqueImages, + ...MimeTypes.alphaImages, + ...MimeTypes.rawImages, + ...AppSupport.undecodableImages, + MimeTypes.anyVideo, + ..._knownVideos, + }; +} + +@immutable +class ImageRequest extends Equatable { + final String uri; + final String mimeType; + final int? rotationDegrees; + final bool isFlipped; + final bool isAnimated; + final int? pageId; + final int? sizeBytes; + final BytesReceivedCallback? onBytesReceived; + + @override + List<Object?> get props => [uri, mimeType, rotationDegrees, isFlipped, isAnimated, pageId, sizeBytes, onBytesReceived]; + + const ImageRequest( + this.uri, + this.mimeType, { + required this.rotationDegrees, + required this.isFlipped, + required this.isAnimated, + required this.pageId, + required this.sizeBytes, + this.onBytesReceived, + }); +} diff --git a/lib/services/media/media_session_service.dart b/lib/services/media/media_session_service.dart new file mode 100644 index 0000000..49a535e --- /dev/null +++ b/lib/services/media/media_session_service.dart @@ -0,0 +1,140 @@ +import 'dart:async'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:get_it/get_it.dart'; + +abstract class MediaSessionService { + Stream<MediaCommandEvent> get mediaCommands; + + Future<void> update({ + required AvesEntry entry, + required AvesVideoController controller, + required bool canSkipToNext, + required bool canSkipToPrevious, + }); + + Future<void> release(); +} + +class PlatformMediaSessionService implements MediaSessionService, Disposable { + static const _platformObject = AvesMethodChannel('deckers.thibault/aves/media_session'); + + final Set<StreamSubscription> _subscriptions = {}; + final EventChannel _mediaCommandChannel = const OptionalEventChannel('deckers.thibault/aves/media_command'); + final StreamController _streamController = StreamController.broadcast(); + + PlatformMediaSessionService() { + _subscriptions.add(_mediaCommandChannel.receiveBroadcastStream().listen((event) => _onMediaCommand(event as Map?))); + } + + @override + void onDispose() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + @override + Stream<MediaCommandEvent> get mediaCommands => _streamController.stream.where((event) => event is MediaCommandEvent).cast<MediaCommandEvent>(); + + @override + Future<void> update({ + required AvesEntry entry, + required AvesVideoController controller, + required bool canSkipToNext, + required bool canSkipToPrevious, + }) async { + try { + await _platformObject.invokeMethod('update', <String, dynamic>{ + 'uri': entry.uri, + 'title': entry.bestTitle, + 'durationMillis': controller.duration, + 'state': _toPlatformState(controller.status), + 'positionMillis': controller.currentPosition, + 'playbackSpeed': controller.speed, + 'canSkipToNext': canSkipToNext, + 'canSkipToPrevious': canSkipToPrevious, + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + @override + Future<void> release() async { + try { + await _platformObject.invokeMethod('release'); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + String _toPlatformState(VideoStatus status) { + switch (status) { + case VideoStatus.paused: + return 'paused'; + case VideoStatus.playing: + return 'playing'; + case VideoStatus.idle: + case VideoStatus.initialized: + case VideoStatus.completed: + case VideoStatus.error: + return 'stopped'; + } + } + + void _onMediaCommand(Map? fields) { + if (fields == null) return; + final command = fields['command'] as String?; + MediaCommandEvent? event; + switch (command) { + case 'play': + event = const MediaCommandEvent(MediaCommand.play); + case 'pause': + event = const MediaCommandEvent(MediaCommand.pause); + case 'skip_to_next': + event = const MediaCommandEvent(MediaCommand.skipToNext); + case 'skip_to_previous': + event = const MediaCommandEvent(MediaCommand.skipToPrevious); + case 'stop': + event = const MediaCommandEvent(MediaCommand.stop); + case 'seek': + final position = fields['position'] as int?; + if (position != null) { + event = MediaSeekCommandEvent(MediaCommand.stop, position: position); + } + } + if (event != null) { + _streamController.add(event); + } + } +} + +enum MediaCommand { play, pause, skipToNext, skipToPrevious, stop, seek } + +@immutable +class MediaCommandEvent extends Equatable { + final MediaCommand command; + + @override + List<Object?> get props => [command]; + + const MediaCommandEvent(this.command); +} + +@immutable +class MediaSeekCommandEvent extends MediaCommandEvent { + final int position; + + @override + List<Object?> get props => [...super.props, position]; + + const MediaSeekCommandEvent(super.command, {required this.position}); +} diff --git a/lib/services/media/media_store_service.dart b/lib/services/media/media_store_service.dart new file mode 100644 index 0000000..c33e248 --- /dev/null +++ b/lib/services/media/media_store_service.dart @@ -0,0 +1,113 @@ +import 'dart:async'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:flutter/services.dart'; + +abstract class MediaStoreService { + Future<List<int>> checkObsoleteContentIds(List<int?> knownContentIds); + + Future<List<int>> checkObsoletePaths(Map<int?, String?> knownPathById); + + Future<List<String>> getChangedUris(int sinceGeneration); + + Future<int?> getGeneration(); + + // knownEntries: map of contentId -> dateModifiedMillis + Stream<AvesEntry> getEntries(Map<int?, int?> knownEntries, {String? directory}); + + // returns media URI + Future<Uri?> scanFile(String path, String mimeType); +} + +class PlatformMediaStoreService implements MediaStoreService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/media_store'); + static final _stream = AvesStreamsChannel('deckers.thibault/aves/media_store_stream'); + + @override + Future<List<int>> checkObsoleteContentIds(List<int?> knownContentIds) async { + try { + final result = await _platform.invokeMethod('checkObsoleteContentIds', <String, dynamic>{ + 'knownContentIds': knownContentIds, + }); + return (result as List).cast<int>(); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return []; + } + + @override + Future<List<int>> checkObsoletePaths(Map<int?, String?> knownPathById) async { + try { + final result = await _platform.invokeMethod('checkObsoletePaths', <String, dynamic>{ + 'knownPathById': knownPathById, + }); + return (result as List).cast<int>(); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return []; + } + + @override + Future<List<String>> getChangedUris(int sinceGeneration) async { + try { + final result = await _platform.invokeMethod('getChangedUris', <String, dynamic>{ + 'sinceGeneration': sinceGeneration, + }); + return (result as List).cast<String>(); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return []; + } + + @override + Future<int?> getGeneration() async { + try { + return await _platform.invokeMethod('getGeneration'); + } on PlatformException catch (e, stack) { + if (e.code != 'getGeneration-primary') { + await reportService.recordError(e, stack); + } + } + return null; + } + + @override + Stream<AvesEntry> getEntries(Map<int?, int?> knownEntries, {String? directory}) { + try { + return _stream + .receiveBroadcastStream(<String, dynamic>{ + 'knownEntries': knownEntries, + 'directory': directory, + }) + .where((event) => event is Map) + .map((event) { + final fields = event as Map; + AvesEntry.normalizeMimeTypeFields(fields); + return AvesEntry.fromMap(fields); + }); + } on PlatformException catch (e, stack) { + reportService.recordError(e, stack); + return Stream.error(e); + } + } + + // returns media URI + @override + Future<Uri?> scanFile(String path, String mimeType) async { + try { + final result = await _platform.invokeMethod('scanFile', <String, dynamic>{ + 'path': path, + 'mimeType': mimeType, + }); + if (result != null) return Uri.tryParse(result); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return null; + } +} diff --git a/lib/services/metadata/metadata_edit_service.dart b/lib/services/metadata/metadata_edit_service.dart new file mode 100644 index 0000000..bfe5d0e --- /dev/null +++ b/lib/services/metadata/metadata_edit_service.dart @@ -0,0 +1,169 @@ +import 'dart:async'; + +import 'package:aves/convert/convert.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/metadata/date_modifier.dart'; +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/custom_exception.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +abstract class MetadataEditService { + Future<Map<String, dynamic>> rotate(AvesEntry entry, {required bool clockwise}); + + Future<Map<String, dynamic>> flip(AvesEntry entry); + + Future<Map<String, dynamic>> editExifDate(AvesEntry entry, DateModifier modifier); + + Future<Map<String, dynamic>> editMetadata(AvesEntry entry, Map<MetadataType, dynamic> modifier, {bool autoCorrectTrailerOffset = true}); + + Future<Map<String, dynamic>> removeTrailerVideo(AvesEntry entry); + + Future<Map<String, dynamic>> removeTypes(AvesEntry entry, Set<MetadataType> types); +} + +class PlatformMetadataEditService implements MetadataEditService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/metadata_edit'); + + @override + Future<Map<String, dynamic>> rotate(AvesEntry entry, {required bool clockwise}) async { + try { + // returns map with: 'rotationDegrees' 'isFlipped' + final result = await _platform.invokeMethod('rotate', <String, dynamic>{ + 'entry': entry.toPlatformEntryMap(), + 'clockwise': clockwise, + }); + if (result != null) return (result as Map).cast<String, dynamic>(); + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + return {}; + } + + @override + Future<Map<String, dynamic>> flip(AvesEntry entry) async { + try { + // returns map with: 'rotationDegrees' 'isFlipped' + final result = await _platform.invokeMethod('flip', <String, dynamic>{ + 'entry': entry.toPlatformEntryMap(), + }); + if (result != null) return (result as Map).cast<String, dynamic>(); + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + return {}; + } + + @override + Future<Map<String, dynamic>> editExifDate(AvesEntry entry, DateModifier modifier) async { + try { + final result = await _platform.invokeMethod('editDate', <String, dynamic>{ + 'entry': entry.toPlatformEntryMap(), + 'dateMillis': modifier.setDateTime?.millisecondsSinceEpoch, + 'shiftSeconds': modifier.shiftSeconds, + 'fields': modifier.fields.where((v) => v.type == MetadataType.exif).map((v) => v.toPlatform).nonNulls.toList(), + }); + if (result != null) return (result as Map).cast<String, dynamic>(); + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + return {}; + } + + @override + Future<Map<String, dynamic>> editMetadata( + AvesEntry entry, + Map<MetadataType, dynamic> metadata, { + bool autoCorrectTrailerOffset = true, + }) async { + try { + final result = await _platform.invokeMethod('editMetadata', <String, dynamic>{ + 'entry': entry.toPlatformEntryMap(), + 'metadata': metadata.map((type, value) => MapEntry(type.toPlatform, value)), + 'autoCorrectTrailerOffset': autoCorrectTrailerOffset, + }); + if (result != null) return (result as Map).cast<String, dynamic>(); + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + return {}; + } + + @override + Future<Map<String, dynamic>> removeTrailerVideo(AvesEntry entry) async { + try { + final result = await _platform.invokeMethod('removeTrailerVideo', <String, dynamic>{ + 'entry': entry.toPlatformEntryMap(), + }); + if (result != null) return (result as Map).cast<String, dynamic>(); + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + return {}; + } + + @override + Future<Map<String, dynamic>> removeTypes(AvesEntry entry, Set<MetadataType> types) async { + try { + final result = await _platform.invokeMethod('removeTypes', <String, dynamic>{ + 'entry': entry.toPlatformEntryMap(), + 'types': types.map((v) => v.toPlatform).toList(), + }); + if (result != null) return (result as Map).cast<String, dynamic>(); + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + return {}; + } + + Future<void> _processPlatformException(AvesEntry entry, PlatformException e, StackTrace stack) async { + if (entry.isValid) { + final code = e.code; + final customException = CustomPlatformException.fromStandard(e); + if (code.endsWith('mp4fragmented')) { + await mp4Fragmented(customException); + } else if (code.endsWith('mp4zerosizebox')) { + await mp4ZeroSizeBox(customException); + } else if (code.endsWith('mp4largemoov')) { + await mp4LargeMoov(customException); + } else if (code.endsWith('mp4largeother')) { + await mp4LargeOther(customException); + } else if (code.endsWith('filenotfound')) { + await fileNotFound(customException); + } else { + await reportService.recordError(e, stack); + } + } + } + + // distinct exceptions to convince Crashlytics to split reports into distinct issues + // The distinct debug statement is there to make the body unique, so that the methods are not merged at compile time. + + Future<void> mp4Fragmented(CustomPlatformException e) { + debugPrint('mp4Fragmented $e'); + return reportService.recordError(e); + } + + Future<void> mp4ZeroSizeBox(CustomPlatformException e) { + debugPrint('mp4ZeroSizeBox $e'); + return reportService.recordError(e); + } + + Future<void> mp4LargeMoov(CustomPlatformException e) { + debugPrint('mp4LargeMoov $e'); + return reportService.recordError(e); + } + + Future<void> mp4LargeOther(CustomPlatformException e) { + debugPrint('mp4LargeOther $e'); + return reportService.recordError(e); + } + + Future<void> fileNotFound(CustomPlatformException e) { + debugPrint('fileNotFound $e'); + return reportService.recordError(e); + } +} diff --git a/lib/services/metadata/metadata_fetch_service.dart b/lib/services/metadata/metadata_fetch_service.dart new file mode 100644 index 0000000..63e1cc3 --- /dev/null +++ b/lib/services/metadata/metadata_fetch_service.dart @@ -0,0 +1,315 @@ +import 'package:aves/convert/convert.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/media/geotiff.dart'; +import 'package:aves/model/media/panorama.dart'; +import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/metadata/overlay.dart'; +import 'package:aves/model/multipage.dart'; +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/custom_exception.dart'; +import 'package:aves/services/common/service_policy.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/metadata/xmp.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +abstract class MetadataFetchService { + // returns Map<Map<Key, Value>> (map of directories, each directory being a map of metadata label and value description) + Future<Map> getAllMetadata(AvesEntry entry); + + Future<CatalogMetadata?> getCatalogMetadata(AvesEntry entry, {bool background = false}); + + Future<OverlayMetadata> getOverlayMetadata(AvesEntry entry, Set<MetadataSyntheticField> fields); + + Future<GeoTiffInfo?> getGeoTiffInfo(AvesEntry entry); + + Future<MultiPageInfo?> getMultiPageInfo(AvesEntry entry); + + Future<PanoramaInfo?> getPanoramaInfo(AvesEntry entry); + + Future<List<Map<String, dynamic>>?> getIptc(AvesEntry entry); + + Future<AvesXmp?> getXmp(AvesEntry entry); + + Future<bool> hasContentResolverProp(String prop); + + Future<String?> getContentResolverProp(AvesEntry entry, String prop); + + Future<DateTime?> getDate(AvesEntry entry, MetadataField field); + + Future<Map<String, dynamic>> getFields(AvesEntry entry, Set<MetadataField> fields); +} + +class PlatformMetadataFetchService implements MetadataFetchService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/metadata_fetch'); + + @override + Future<Map> getAllMetadata(AvesEntry entry) async { + if (entry.isSvg) return {}; + + try { + final result = await _platform.invokeMethod('getAllMetadata', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + }); + if (result != null) return result as Map; + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + return {}; + } + + @override + Future<CatalogMetadata?> getCatalogMetadata(AvesEntry entry, {bool background = false}) async { + if (entry.isSvg) return null; + + Future<CatalogMetadata?> call() async { + try { + // returns map with: + // 'mimeType': MIME type as reported by metadata extractors, not Media Store (string) + // 'dateMillis': date taken in milliseconds since Epoch (long) + // 'isAnimated': animated gif/webp (bool) + // 'isFlipped': flipped according to EXIF orientation (bool) + // 'rating': rating in [-1,5] (int) + // 'rotationDegrees': rotation degrees according to EXIF orientation or other metadata (int) + // 'latitude': latitude (double) + // 'longitude': longitude (double) + // 'xmpSubjects': ';' separated XMP subjects (string) + // 'xmpTitle': XMP title (string) + final result = + await _platform.invokeMethod('getCatalogMetadata', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'path': entry.path, + 'sizeBytes': entry.sizeBytes, + }) + as Map; + result['id'] = entry.id; + AvesEntry.normalizeMimeTypeFields(result); + return CatalogMetadata.fromMap(result); + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + return null; + } + + return background + ? servicePolicy.call( + call, + priority: ServiceCallPriority.getMetadata, + ) + : call(); + } + + @override + Future<OverlayMetadata> getOverlayMetadata(AvesEntry entry, Set<MetadataSyntheticField> fields) async { + if (fields.isNotEmpty && !entry.isSvg) { + try { + // returns fields on demand, with various value types: + // 'aperture' (double), + // 'description' (string) + // 'exposureTime' (string), + // 'focalLength' (double), + // 'iso' (int), + final result = + await _platform.invokeMethod('getOverlayMetadata', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + 'fields': fields.map((v) => v.toPlatform).toList(), + }) + as Map; + return OverlayMetadata.fromMap(result); + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + } + return const OverlayMetadata(); + } + + @override + Future<GeoTiffInfo?> getGeoTiffInfo(AvesEntry entry) async { + try { + final result = + await _platform.invokeMethod('getGeoTiffInfo', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + }) + as Map; + return GeoTiffInfo.fromMap(result); + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + return null; + } + + @override + Future<MultiPageInfo?> getMultiPageInfo(AvesEntry entry) async { + try { + final result = await _platform.invokeMethod('getMultiPageInfo', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + 'isMotionPhoto': entry.isMotionPhoto, + }); + final pageMaps = ((result as List?) ?? []).cast<Map>(); + if (entry.isMotionPhoto && pageMaps.isNotEmpty) { + final imagePage = pageMaps[0]; + imagePage['width'] = entry.width; + imagePage['height'] = entry.height; + imagePage['rotationDegrees'] = entry.rotationDegrees; + } + pageMaps.forEach(AvesEntry.normalizeMimeTypeFields); + return MultiPageInfo.fromPageMaps(entry, pageMaps); + } on PlatformException catch (e, stack) { + if (e.code != 'getMultiPageInfo-empty') { + await _processPlatformException(entry, e, stack); + } + } + return null; + } + + @override + Future<PanoramaInfo?> getPanoramaInfo(AvesEntry entry) async { + try { + // returns map with values for: + // 'croppedAreaLeft' (int), 'croppedAreaTop' (int), 'croppedAreaWidth' (int), 'croppedAreaHeight' (int), + // 'fullPanoWidth' (int), 'fullPanoHeight' (int) + final result = + await _platform.invokeMethod('getPanoramaInfo', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + }) + as Map; + return PanoramaInfo.fromMap(result); + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + return null; + } + + @override + Future<List<Map<String, dynamic>>?> getIptc(AvesEntry entry) async { + try { + final result = await _platform.invokeMethod('getIptc', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + }); + if (result != null) return (result as List).cast<Map>().map((fields) => fields.cast<String, dynamic>()).toList(); + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + return null; + } + + @override + Future<AvesXmp?> getXmp(AvesEntry entry) async { + try { + final result = await _platform.invokeMethod('getXmp', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + }); + if (result != null) return AvesXmp.fromList((result as List).cast<String>()); + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + return null; + } + + final Map<String, bool> _contentResolverProps = {}; + + @override + Future<bool> hasContentResolverProp(String prop) async { + var exists = _contentResolverProps[prop]; + if (exists != null) return SynchronousFuture(exists); + + try { + exists = await _platform.invokeMethod('hasContentResolverProp', <String, dynamic>{ + 'prop': prop, + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + exists ??= false; + _contentResolverProps[prop] = exists; + return exists; + } + + @override + Future<String?> getContentResolverProp(AvesEntry entry, String prop) async { + try { + return await _platform.invokeMethod('getContentResolverProp', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'prop': prop, + }); + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + return null; + } + + @override + Future<DateTime?> getDate(AvesEntry entry, MetadataField field) async { + try { + final result = await _platform.invokeMethod('getDate', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + 'field': field.toPlatform, + }); + if (result is int) { + return dateTimeFromMillis(result, isUtc: false); + } + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + return null; + } + + @override + Future<Map<String, dynamic>> getFields(AvesEntry entry, Set<MetadataField> fields) async { + if (fields.isNotEmpty && !entry.isSvg) { + try { + final result = await _platform.invokeMethod('getFields', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + 'sizeBytes': entry.sizeBytes, + 'fields': fields.map((v) => v.toPlatform).toList(), + }); + if (result != null) return (result as Map).cast<String, dynamic>(); + } on PlatformException catch (e, stack) { + await _processPlatformException(entry, e, stack); + } + } + return {}; + } + + Future<void> _processPlatformException(AvesEntry entry, PlatformException e, StackTrace stack) async { + if (entry.isValid) { + final code = e.code; + final customException = CustomPlatformException.fromStandard(e); + if (code.endsWith('filenotfound')) { + await fileNotFound(customException); + } else { + await reportService.recordError(e, stack); + } + } + } + + // distinct exceptions to convince Crashlytics to split reports into distinct issues + // The distinct debug statement is there to make the body unique, so that the methods are not merged at compile time. + + Future<void> fileNotFound(CustomPlatformException e) { + debugPrint('fileNotFound $e'); + return reportService.recordError(e); + } +} diff --git a/lib/services/metadata/svg_metadata_service.dart b/lib/services/metadata/svg_metadata_service.dart new file mode 100644 index 0000000..4160f1b --- /dev/null +++ b/lib/services/metadata/svg_metadata_service.dart @@ -0,0 +1,92 @@ +import 'dart:convert'; +import 'dart:ui'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/string_utils.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:xml/xml.dart'; + +class SvgMetadataService { + static const docDirectory = 'Document'; + static const metadataDirectory = 'Metadata'; + + static const _attributes = ['x', 'y', 'width', 'height', 'preserveAspectRatio', 'viewBox']; + static const _textElements = ['title', 'desc']; + static const _metadataElement = 'metadata'; + + static Future<Size?> getSize(AvesEntry entry) async { + try { + final data = await mediaFetchService.getOriginalBytes(entry); + final document = XmlDocument.parse(utf8.decode(data)); + final root = document.rootElement; + + String? getAttribute(String attributeName) => root.attributes.firstWhereOrNull((a) => a.name.qualified == attributeName)?.value; + double? tryParseWithoutUnit(String? s) => s == null ? null : double.tryParse(s.replaceAll(RegExp(r'[a-z%]'), '')); + + // prefer the viewbox over the viewport to determine size + + // viewbox + final viewBox = getAttribute('viewBox'); + if (viewBox != null) { + final parts = viewBox.split(RegExp(r'[\s,]+')); + if (parts.length == 4) { + final vbWidth = tryParseWithoutUnit(parts[2]); + final vbHeight = tryParseWithoutUnit(parts[3]); + if (vbWidth != null && vbWidth > 0 && vbHeight != null && vbHeight > 0) { + return Size(vbWidth, vbHeight); + } + } + } + + // viewport + final width = tryParseWithoutUnit(getAttribute('width')); + final height = tryParseWithoutUnit(getAttribute('height')); + if (width != null && height != null) { + return Size(width, height); + } + } catch (error, stack) { + debugPrint('failed to parse XML from SVG with error=$error\n$stack'); + } + return null; + } + + static Future<Map<String, Map<String, String>>> getAllMetadata(AvesEntry entry) async { + String formatKey(String key) { + switch (key) { + case 'desc': + return 'Description'; + default: + return key.toSentenceCase(); + } + } + + try { + final data = await mediaFetchService.getOriginalBytes(entry); + final document = XmlDocument.parse(utf8.decode(data)); + final root = document.rootElement; + + final docDir = Map.fromEntries([ + ...root.attributes.where((a) => _attributes.contains(a.name.qualified)).map((a) => MapEntry(formatKey(a.name.qualified), a.value)), + ..._textElements.map((name) { + final value = root.getElement(name)?.innerText; + return value != null ? MapEntry(formatKey(name), value) : null; + }).nonNulls, + ]); + + final metadata = root.getElement(_metadataElement); + final metadataDir = Map.fromEntries([ + if (metadata != null) MapEntry('Metadata', metadata.toXmlString(pretty: true)), + ]); + + return { + if (docDir.isNotEmpty) docDirectory: docDir, + if (metadataDir.isNotEmpty) metadataDirectory: metadataDir, + }; + } catch (error, stack) { + debugPrint('failed to parse XML from SVG with error=$error\n$stack'); + } + return {}; + } +} diff --git a/lib/services/metadata/xmp.dart b/lib/services/metadata/xmp.dart new file mode 100644 index 0000000..e56adec --- /dev/null +++ b/lib/services/metadata/xmp.dart @@ -0,0 +1,40 @@ +import 'package:collection/collection.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class AvesXmp extends Equatable { + final String? xmpString; + final String? extendedXmpString; + + @override + List<Object?> get props => [xmpString, extendedXmpString]; + + const AvesXmp({ + required this.xmpString, + this.extendedXmpString, + }); + + static AvesXmp fromList(List<String> xmpStrings) { + switch (xmpStrings.length) { + case 0: + return const AvesXmp(xmpString: null); + case 1: + return AvesXmp(xmpString: xmpStrings.single); + default: + final byExtending = groupBy<String, bool>(xmpStrings, (v) => v.contains(':HasExtendedXMP=')); + final extending = byExtending[true] ?? []; + final extension = byExtending[false] ?? []; + if (extending.length == 1 && extension.length == 1) { + return AvesXmp( + xmpString: extending.single, + extendedXmpString: extension.single, + ); + } + + // take the first XMP and ignore the rest when the file is weirdly constructed + debugPrint('warning: entry has ${xmpStrings.length} XMP directories, xmpStrings=$xmpStrings'); + return AvesXmp(xmpString: xmpStrings.firstOrNull); + } + } +} diff --git a/lib/services/security_service.dart b/lib/services/security_service.dart new file mode 100644 index 0000000..12ac359 --- /dev/null +++ b/lib/services/security_service.dart @@ -0,0 +1,40 @@ +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:flutter/services.dart'; + +abstract class SecurityService { + Future<bool> writeValue<T>(String key, T? value); + + Future<T?> readValue<T>(String key); +} + +class PlatformSecurityService implements SecurityService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/security'); + + @override + Future<bool> writeValue<T>(String key, T? value) async { + try { + await _platform.invokeMethod('writeValue', <String, dynamic>{ + 'key': key, + 'value': value, + }); + return true; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<T?> readValue<T>(String key) async { + try { + final result = await _platform.invokeMethod('readValue', <String, dynamic>{ + 'key': key, + }); + if (result != null) return result as T; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return null; + } +} diff --git a/lib/services/storage_service.dart b/lib/services/storage_service.dart new file mode 100644 index 0000000..636ac8f --- /dev/null +++ b/lib/services/storage_service.dart @@ -0,0 +1,412 @@ +import 'dart:async'; + +import 'package:aves/model/covers.dart'; +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/output_buffer.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/services.dart'; + +abstract class StorageService { + Future<Map<String, int>> getDataUsage(); + + Future<Set<StorageVolume>> getStorageVolumes(); + + Future<String> getExternalCacheDirectory(); + + Future<Set<String>> getUntrackedTrashPaths(Iterable<String> knownPaths); + + Future<Set<String>> getUntrackedVaultPaths(String vaultName, Iterable<String> knownPaths); + + Future<String> getVaultRoot(); + + Future<int?> getFreeSpace(StorageVolume volume); + + Future<List<String>> getGrantedDirectories(); + + Future<Set<VolumeRelativeDirectory>> getInaccessibleDirectories(Iterable<String> dirPaths); + + // returns directories with restricted access, + // with the relative part in lowercase, for case-insensitive comparison + Future<Set<VolumeRelativeDirectory>> getRestrictedDirectoriesLowerCase(); + + Future<void> revokeDirectoryAccess(String path); + + // returns number of deleted directories + Future<int> deleteEmptyRegularDirectories(Set<String> dirPaths); + + Future<bool> deleteTempDirectory(); + + Future<bool> deleteExternalCache(); + + // returns whether user granted access to a directory of his choosing + Future<bool> requestDirectoryAccess(String path); + + Future<bool> canRequestMediaFileBulkAccess(); + + Future<bool> canInsertMedia(Set<VolumeRelativeDirectory> directories); + + // returns whether user granted access to URIs + Future<bool> requestMediaFileAccess(List<String> uris, List<String> mimeTypes); + + // returns whether operation succeeded (`null` if user cancelled) + Future<bool?> createFile(String name, String mimeType, Uint8List bytes); + + Future<Uint8List> openFile([String? mimeType]); + + // returns whether operation succeeded (`null` if user cancelled) + Future<bool?> copyFile(String name, String mimeType, String sourceUri); +} + +class PlatformStorageService implements StorageService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/storage'); + static final _stream = AvesStreamsChannel('deckers.thibault/aves/activity_result_stream'); + + @override + Future<Map<String, int>> getDataUsage() async { + try { + final result = await _platform.invokeMethod('getDataUsage'); + if (result != null) return (result as Map).cast<String, int>(); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + @override + Future<Set<StorageVolume>> getStorageVolumes() async { + try { + final result = await _platform.invokeMethod('getStorageVolumes'); + return (result as List).cast<Map>().map(StorageVolume.fromMap).toSet(); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + @override + Future<String> getExternalCacheDirectory() async { + try { + final result = await _platform.invokeMethod('getCacheDirectory', <String, dynamic>{ + 'external': true, + }); + return result as String; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return ''; + } + + @override + Future<Set<String>> getUntrackedTrashPaths(Iterable<String> knownPaths) async { + try { + final result = await _platform.invokeMethod('getUntrackedTrashPaths', <String, dynamic>{ + 'knownPaths': knownPaths.toList(), + }); + return (result as List).cast<String>().toSet(); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + @override + Future<Set<String>> getUntrackedVaultPaths(String vaultName, Iterable<String> knownPaths) async { + try { + final result = await _platform.invokeMethod('getUntrackedVaultPaths', <String, dynamic>{ + 'vault': vaultName, + 'knownPaths': knownPaths.toList(), + }); + return (result as List).cast<String>().toSet(); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + @override + Future<String> getVaultRoot() async { + try { + final result = await _platform.invokeMethod('getVaultRoot'); + return result as String; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return ''; + } + + @override + Future<int?> getFreeSpace(StorageVolume volume) async { + try { + final result = await _platform.invokeMethod('getFreeSpace', <String, dynamic>{ + 'path': volume.path, + }); + return result as int?; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return null; + } + + @override + Future<List<String>> getGrantedDirectories() async { + try { + final result = await _platform.invokeMethod('getGrantedDirectories'); + return (result as List).cast<String>(); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return []; + } + + @override + Future<Set<VolumeRelativeDirectory>> getInaccessibleDirectories(Iterable<String> dirPaths) async { + try { + final result = await _platform.invokeMethod('getInaccessibleDirectories', <String, dynamic>{ + 'dirPaths': dirPaths.toList(), + }); + if (result != null) { + return (result as List).cast<Map>().map(VolumeRelativeDirectory.fromMap).toSet(); + } + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + @override + Future<Set<VolumeRelativeDirectory>> getRestrictedDirectoriesLowerCase() async { + try { + final result = await _platform.invokeMethod('getRestrictedDirectories'); + if (result != null) { + return (result as List) + .cast<Map>() + .map(VolumeRelativeDirectory.fromMap) + .map( + (dir) => dir.copyWith( + relativeDir: dir.relativeDir.toLowerCase(), + ), + ) + .toSet(); + } + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return {}; + } + + @override + Future<void> revokeDirectoryAccess(String path) async { + try { + await _platform.invokeMethod('revokeDirectoryAccess', <String, dynamic>{ + 'path': path, + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + // returns number of deleted directories + @override + Future<int> deleteEmptyRegularDirectories(Set<String> dirPaths) async { + try { + final result = await _platform.invokeMethod('deleteEmptyDirectories', <String, dynamic>{ + 'dirPaths': dirPaths.where((v) => covers.effectiveAlbumType(v) == AlbumType.regular).toList(), + }); + if (result != null) return result as int; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return 0; + } + + @override + Future<bool> deleteTempDirectory() async { + try { + final result = await _platform.invokeMethod('deleteTempDirectory'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<bool> deleteExternalCache() async { + try { + final result = await _platform.invokeMethod('deleteExternalCache'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<bool> canRequestMediaFileBulkAccess() async { + try { + final result = await _platform.invokeMethod('canRequestMediaFileBulkAccess'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<bool> canInsertMedia(Set<VolumeRelativeDirectory> directories) async { + try { + final result = await _platform.invokeMethod('canInsertMedia', <String, dynamic>{ + 'directories': directories.map((v) => v.toMap()).toList(), + }); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + // returns whether user granted access to a directory of his choosing + @override + Future<bool> requestDirectoryAccess(String path) async { + try { + final opCompleter = Completer<bool>(); + _stream + .receiveBroadcastStream(<String, dynamic>{ + 'op': 'requestDirectoryAccess', + 'path': path, + }) + .listen( + (data) => opCompleter.complete(data as bool), + onError: opCompleter.completeError, + onDone: () { + if (!opCompleter.isCompleted) opCompleter.complete(false); + }, + cancelOnError: true, + ); + // `await` here, so that `completeError` will be caught below + return await opCompleter.future; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + // returns whether user granted access to URIs + @override + Future<bool> requestMediaFileAccess(List<String> uris, List<String> mimeTypes) async { + try { + final opCompleter = Completer<bool>(); + _stream + .receiveBroadcastStream(<String, dynamic>{ + 'op': 'requestMediaFileAccess', + 'uris': uris, + 'mimeTypes': mimeTypes, + }) + .listen( + (data) => opCompleter.complete(data as bool), + onError: opCompleter.completeError, + onDone: () { + if (!opCompleter.isCompleted) opCompleter.complete(false); + }, + cancelOnError: true, + ); + // `await` here, so that `completeError` will be caught below + return await opCompleter.future; + } on PlatformException catch (e, stack) { + final message = e.message; + // mute issue in the specific case when an item: + // 1) is a Media Store `file` content, + // 2) has no `images` or `video` entry, + // 3) is in a restricted directory + if (message == null || !message.contains('/external/file/')) { + await reportService.recordError(e, stack); + } + } + return false; + } + + @override + Future<bool?> createFile(String name, String mimeType, Uint8List bytes) async { + try { + final opCompleter = Completer<bool?>(); + _stream + .receiveBroadcastStream(<String, dynamic>{ + 'op': 'createFile', + 'name': name, + 'mimeType': mimeType, + 'bytes': bytes, + }) + .listen( + (data) => opCompleter.complete(data as bool?), + onError: opCompleter.completeError, + onDone: () { + if (!opCompleter.isCompleted) opCompleter.complete(false); + }, + cancelOnError: true, + ); + // `await` here, so that `completeError` will be caught below + return await opCompleter.future; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<Uint8List> openFile([String? mimeType]) async { + try { + final opCompleter = Completer<Uint8List>(); + final sink = OutputBuffer(); + _stream + .receiveBroadcastStream(<String, dynamic>{ + 'op': 'openFile', + 'mimeType': mimeType, + }) + .listen( + (data) { + final chunk = data as Uint8List; + sink.add(chunk); + }, + onError: opCompleter.completeError, + onDone: () { + sink.close(); + opCompleter.complete(sink.bytes); + }, + cancelOnError: true, + ); + // `await` here, so that `completeError` will be caught below + return await opCompleter.future; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return Uint8List(0); + } + + @override + Future<bool?> copyFile(String name, String mimeType, String sourceUri) async { + try { + final opCompleter = Completer<bool?>(); + _stream + .receiveBroadcastStream(<String, dynamic>{ + 'op': 'copyFile', + 'name': name, + 'mimeType': mimeType, + 'sourceUri': sourceUri, + }) + .listen( + (data) => opCompleter.complete(data as bool?), + onError: opCompleter.completeError, + onDone: () { + if (!opCompleter.isCompleted) opCompleter.complete(false); + }, + cancelOnError: true, + ); + // `await` here, so that `completeError` will be caught below + return await opCompleter.future; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } +} diff --git a/lib/services/wallpaper_service.dart b/lib/services/wallpaper_service.dart new file mode 100644 index 0000000..42d935b --- /dev/null +++ b/lib/services/wallpaper_service.dart @@ -0,0 +1,22 @@ +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/services.dart'; + +class WallpaperService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/wallpaper'); + + static Future<bool> set(Uint8List bytes, WallpaperTarget target) async { + try { + await _platform.invokeMethod('setWallpaper', <String, dynamic>{ + 'bytes': bytes, + 'home': {WallpaperTarget.home, WallpaperTarget.homeLock}.contains(target), + 'lock': {WallpaperTarget.lock, WallpaperTarget.homeLock}.contains(target), + }); + return true; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } +} diff --git a/lib/services/widget_service.dart b/lib/services/widget_service.dart new file mode 100644 index 0000000..21d1181 --- /dev/null +++ b/lib/services/widget_service.dart @@ -0,0 +1,30 @@ +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:flutter/services.dart'; + +class WidgetService { + static const _configureChannel = AvesMethodChannel('deckers.thibault/aves/widget_configure'); + static const _updateChannel = AvesMethodChannel('deckers.thibault/aves/widget_update'); + + static Future<bool> configure() async { + try { + await _configureChannel.invokeMethod('configure'); + return true; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + static Future<bool> update(int widgetId) async { + try { + await _updateChannel.invokeMethod('update', <String, dynamic>{ + 'widgetId': widgetId, + }); + return true; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } +} diff --git a/lib/services/window_service.dart b/lib/services/window_service.dart new file mode 100644 index 0000000..2d67281 --- /dev/null +++ b/lib/services/window_service.dart @@ -0,0 +1,246 @@ +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; + +abstract class WindowService { + Future<bool> isActivity(); + + Future<void> keepScreenOn(bool on); + + Future<void> secureScreen(bool on); + + Future<bool> isInMultiWindowMode(); + + Future<bool> isInPictureInPictureMode(); + + Future<bool> isRotationLocked(); + + Future<int> getOrientation(); + + Future<void> requestOrientation([Orientation? orientation]); + + Future<bool> isCutoutAware(); + + Future<EdgeInsets> getCutoutInsets(); + + Future<bool> supportsWideGamut(); + + Future<bool> supportsHdr(); + + Future<void> setColorMode({required bool wideColorGamut, required bool hdr}); + + Future<bool> startGlobalDrag(String uri, String? label, Size shadowSize, Uint8List shadowBytes); +} + +class PlatformWindowService implements WindowService { + static const _platform = AvesMethodChannel('deckers.thibault/aves/window'); + + bool? _isCutoutAware, _supportsHdr, _supportsWideGamut; + + @override + Future<bool> isActivity() async { + try { + final result = await _platform.invokeMethod('isActivity'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<void> keepScreenOn(bool on) async { + try { + await _platform.invokeMethod('keepScreenOn', <String, dynamic>{ + 'on': on, + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + @override + Future<void> secureScreen(bool on) async { + try { + await _platform.invokeMethod('secureScreen', <String, dynamic>{ + 'on': on, + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + @override + Future<bool> isInMultiWindowMode() async { + try { + final result = await _platform.invokeMethod('isInMultiWindowMode'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<bool> isInPictureInPictureMode() async { + try { + final result = await _platform.invokeMethod('isInPictureInPictureMode'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<bool> isRotationLocked() async { + try { + final result = await _platform.invokeMethod('isRotationLocked'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + + @override + Future<int> getOrientation() async { + try { + final result = await _platform.invokeMethod('getOrientation'); + if (result != null) return result as int; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return 0; + } + + // cf https://developer.android.com/reference/android/R.attr#screenOrientation + // cf Android `ActivityInfo.ScreenOrientation` + static const screenOrientationUnspecified = -1; // SCREEN_ORIENTATION_UNSPECIFIED + static const screenOrientationLandscape = 0; // SCREEN_ORIENTATION_LANDSCAPE + static const screenOrientationPortrait = 1; // SCREEN_ORIENTATION_PORTRAIT + static const screenOrientationSensorLandscape = 6; // SCREEN_ORIENTATION_SENSOR_LANDSCAPE + static const screenOrientationSensorPortrait = 7; // SCREEN_ORIENTATION_SENSOR_PORTRAIT + static const screenOrientationReverseLandscape = 8; // SCREEN_ORIENTATION_REVERSE_LANDSCAPE + static const screenOrientationReversePortrait = 9; // SCREEN_ORIENTATION_REVERSE_PORTRAIT + static const screenOrientationUserLandscape = 11; // SCREEN_ORIENTATION_USER_LANDSCAPE + static const screenOrientationUserPortrait = 12; // SCREEN_ORIENTATION_USER_PORTRAIT + + @override + Future<void> requestOrientation([Orientation? orientation]) async { + Future<void> apply(int orientationCode) async { + try { + await _platform.invokeMethod('requestOrientation', <String, dynamic>{ + 'orientation': orientationCode, + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + + switch (orientation) { + case Orientation.landscape: + // first use the `sensor` variant to flip according to the sensor, + // then switch to a specific landscape orientation + // so that it no longer listens to the sensor + await apply(screenOrientationSensorLandscape); + switch (await getOrientation()) { + case 270: + await apply(screenOrientationReverseLandscape); + case 90: + default: + await apply(screenOrientationLandscape); + } + case Orientation.portrait: + await apply(screenOrientationUserPortrait); + default: + await apply(screenOrientationUnspecified); + } + } + + @override + Future<bool> isCutoutAware() async { + if (_isCutoutAware != null) return SynchronousFuture(_isCutoutAware!); + try { + final result = await _platform.invokeMethod('isCutoutAware'); + _isCutoutAware = result as bool?; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return _isCutoutAware ?? false; + } + + @override + Future<EdgeInsets> getCutoutInsets() async { + try { + final result = await _platform.invokeMethod('getCutoutInsets'); + if (result != null) { + return EdgeInsets.only( + left: result['left']?.toDouble() ?? 0, + top: result['top']?.toDouble() ?? 0, + right: result['right']?.toDouble() ?? 0, + bottom: result['bottom']?.toDouble() ?? 0, + ); + } + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return EdgeInsets.zero; + } + + @override + Future<bool> supportsWideGamut() async { + if (_supportsWideGamut != null) return SynchronousFuture(_supportsWideGamut!); + try { + final result = await _platform.invokeMethod('supportsWideGamut'); + _supportsWideGamut = result as bool?; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return _supportsWideGamut ?? false; + } + + @override + Future<bool> supportsHdr() async { + if (_supportsHdr != null) return SynchronousFuture(_supportsHdr!); + try { + final result = await _platform.invokeMethod('supportsHdr'); + _supportsHdr = result as bool?; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return _supportsHdr ?? false; + } + + @override + Future<void> setColorMode({required bool wideColorGamut, required bool hdr}) async { + // TODO TLAD [hdr] enable when ready + // try { + // await _platform.invokeMethod('setColorMode', <String, dynamic>{ + // 'wideColorGamut': wideColorGamut, + // 'hdr': hdr, + // }); + // } on PlatformException catch (e, stack) { + // await reportService.recordError(e, stack); + // } + } + + @override + Future<bool> startGlobalDrag(String uri, String? label, Size shadowSize, Uint8List shadowBytes) async { + try { + final result = await _platform.invokeMethod('startGlobalDrag', <String, dynamic>{ + 'uri': uri, + 'label': label, + 'shadowWidthDip': shadowSize.width, + 'shadowHeightDip': shadowSize.height, + 'shadowBytes': shadowBytes, + }); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } +} diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart new file mode 100644 index 0000000..b319728 --- /dev/null +++ b/lib/theme/colors.dart @@ -0,0 +1,198 @@ +import 'package:aves/image_providers/app_icon_image_provider.dart'; +import 'package:aves/model/covers.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:palette_generator/palette_generator.dart'; +import 'package:provider/provider.dart'; + +class AColors { + static const starEnabled = Colors.amber; + static const starDisabled = Colors.grey; + static const warning = Colors.amber; + + static const boraBoraGradient = [ + Color(0xff2bc0e4), + Color(0xffeaecc6), + ]; +} + +class AvesColorsProvider extends StatelessWidget { + final bool allowMonochrome; + final Widget child; + + const AvesColorsProvider({ + super.key, + this.allowMonochrome = true, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return ProxyProvider<Settings, AvesColorsData>( + update: (context, settings, _) { + final isDark = Theme.of(context).isDark; + var mode = settings.themeColorMode; + if (!allowMonochrome && mode == AvesThemeColorMode.monochrome) { + mode = AvesThemeColorMode.polychrome; + } + return switch (mode) { + AvesThemeColorMode.monochrome => isDark ? _MonochromeOnDark() : _MonochromeOnLight(), + AvesThemeColorMode.polychrome => isDark ? NeonOnDark() : PastelOnLight(), + }; + }, + child: child, + ); + } +} + +abstract class AvesColorsData { + static const defaultAccent = Colors.indigoAccent; + static const _neutralOnDark = Colors.white; + static const _neutralOnLight = Color(0xAA000000); + + Color get neutral; + + Color fromHue(double hue); + + Color? fromBrandColor(Color? color); + + final Map<String, Color> _stringColors = {}, _appColors = {}; + + Color fromString(String string) { + var color = _stringColors[string]; + if (color == null) { + final hash = string.codeUnits.fold<int>(0, (prev, v) => prev = v + ((prev << 5) - prev)); + final hue = (hash % 360).toDouble(); + color = fromHue(hue); + _stringColors[string] = color; + } + return color; + } + + Future<Color>? appColor(String album) { + if (_appColors.containsKey(album)) return SynchronousFuture(_appColors[album]!); + + final packageName = covers.effectiveAlbumPackage(album); + if (packageName == null) return null; + + return PaletteGenerator.fromImageProvider( + AppIconImage(packageName: packageName, size: 24), + ).then((palette) async { + // `dominantColor` is most representative but can have low contrast with a dark background + // `vibrantColor` is usually representative and has good contrast with a dark background + final color = palette.vibrantColor?.color ?? palette.dominantColor?.color ?? fromString(album); + _appColors[album] = color; + return color; + }); + } + + void clearAppColor(String album) => _appColors.remove(album); + + // mime + Color get image => fromHue(243); + + Color get video => fromHue(323); + + // type + Color get favourite => fromHue(0); + + Color get animated => fromHue(83); + + Color get geotiff => fromHue(70); + + Color get motionPhoto => fromHue(104); + + Color get panorama => fromHue(5); + + Color get raw => fromHue(208); + + Color get sphericalVideo => fromHue(174); + + // albums + Color get albumCamera => fromHue(165); + + Color get albumDownload => fromHue(104); + + Color get albumScreenshots => fromHue(149); + + Color get albumScreenRecordings => fromHue(222); + + Color get albumVideoCaptures => fromHue(266); + + // info + Color get xmp => fromHue(275); + + // settings + Color get accessibility => fromHue(134); + + Color get display => fromHue(50); + + Color get language => fromHue(264); + + Color get navigation => fromHue(140); + + Color get privacy => fromHue(344); + + Color get thumbnails => fromHue(87); + + // debug + static const debugGradient = LinearGradient( + begin: Alignment.bottomCenter, + end: Alignment.topCenter, + colors: [ + Colors.red, + Colors.amber, + ], + ); +} + +abstract class _Monochrome extends AvesColorsData { + @override + Color fromHue(double hue) => neutral; + + @override + Color? fromBrandColor(Color? color) => neutral; + + @override + Color fromString(String string) => neutral; + + @override + Future<Color>? appColor(String album) => SynchronousFuture(neutral); +} + +class _MonochromeOnDark extends _Monochrome { + @override + Color get neutral => AvesColorsData._neutralOnDark; +} + +class _MonochromeOnLight extends _Monochrome { + @override + Color get neutral => AvesColorsData._neutralOnLight; +} + +class NeonOnDark extends AvesColorsData { + @override + Color get neutral => AvesColorsData._neutralOnDark; + + @override + Color fromHue(double hue) => HSLColor.fromAHSL(1.0, hue, .8, .6).toColor(); + + @override + Color? fromBrandColor(Color? color) => color; +} + +class PastelOnLight extends AvesColorsData { + @override + Color get neutral => AvesColorsData._neutralOnLight; + + @override + Color fromHue(double hue) => _pastellize(HSLColor.fromAHSL(1.0, hue, .8, .6).toColor()); + + @override + Color? fromBrandColor(Color? color) => color != null ? _pastellize(color) : null; + + Color _pastellize(Color color) => Color.lerp(color, Colors.white, .5)!; +} diff --git a/lib/theme/durations.dart b/lib/theme/durations.dart new file mode 100644 index 0000000..69bcd7d --- /dev/null +++ b/lib/theme/durations.dart @@ -0,0 +1,130 @@ +import 'package:flutter/foundation.dart'; + +class ADurations { + // Flutter animations (with margin) + static const transitionMarginMillis = 20; + + // page transition duration also available via `ModalRoute.of(context)!.transitionDuration * timeDilation` + static const pageTransitionExact = Duration(milliseconds: 300); // ref `transitionDuration` used in `MaterialRouteTransitionMixin` + static const pageTransitionLoose = Duration(milliseconds: 300 + transitionMarginMillis); // ref `transitionDuration` used in `MaterialRouteTransitionMixin` + static const dialogTransitionLoose = Duration(milliseconds: 150 + transitionMarginMillis); // ref `transitionDuration` used in `DialogRoute` + static const drawerTransitionLoose = Duration(milliseconds: 246 + transitionMarginMillis); // ref `_kBaseSettleDuration` used in `DrawerControllerState` + static const toggleableTransitionLoose = Duration(milliseconds: 200 + transitionMarginMillis); // ref `_kToggleDuration` used in `ToggleableStateMixin` + + // common animations + static const sweeperOpacityAnimation = Duration(milliseconds: 150); + static const sweepingAnimation = Duration(milliseconds: 650); + static const dialogFieldReachAnimation = Duration(milliseconds: 300); + + static const appBarTitleAnimation = Duration(milliseconds: 300); + static const appBarActionChangeAnimation = Duration(milliseconds: 200); + static const popupMenuAnimation = Duration(milliseconds: 300); + + // filter grids animations + static const chipDecorationAnimation = Duration(milliseconds: 200); + static const highlightScrollAnimationMinMillis = 400; + static const highlightScrollAnimationMaxMillis = 2000; + static const scalingGridBackgroundAnimation = Duration(milliseconds: 200); + static const scalingGridPositionAnimation = Duration(milliseconds: 150); + + // collection animations + static const filterBarRemovalAnimation = Duration(milliseconds: 400); + static const collectionOpOverlayAnimation = Duration(milliseconds: 300); + + // search animations + static const filterRowExpandAnimation = Duration(milliseconds: 300); + static const searchBodyTransition = Duration(milliseconds: 300); + + // viewer animations + static const thumbnailScrollerScrollAnimation = Duration(milliseconds: 200); + static const thumbnailScrollerShadeAnimation = Duration(milliseconds: 150); + static const viewerVideoPlayerTransition = Duration(milliseconds: 500); + static const viewerActionFeedbackAnimation = Duration(milliseconds: 600); + static const viewerHorizontalPageAnimation = Duration(seconds: 1); + + // info animations + static const mapStyleSwitchAnimation = Duration(milliseconds: 300); + static const xmpStructArrayCardTransition = Duration(milliseconds: 300); + static const tagEditorTransition = Duration(milliseconds: 200); + + // settings animations + static const themeColorModeAnimation = Duration(milliseconds: 400); + static const quickActionListAnimation = Duration(milliseconds: 200); + static const quickActionHighlightAnimation = Duration(milliseconds: 200); + + // delays & refresh intervals + static const opToastTextDisplay = Duration(seconds: 3); + static const opToastActionDisplay = Duration(seconds: 5); + static const infoScrollMonitoringTimerDelay = Duration(milliseconds: 100); + static const collectionScrollMonitoringTimerDelay = Duration(milliseconds: 100); + static const highlightJumpDelay = Duration(milliseconds: 400); + static const highlightScrollInitDelay = Duration(milliseconds: 800); + static const motionPhotoAutoPlayDelay = Duration(milliseconds: 700); + static const appInactiveReactionDelay = Duration(milliseconds: 300); + static const videoOverlayHideDelay = Duration(milliseconds: 500); + static const videoProgressTimerInterval = Duration(milliseconds: 300); + static const doubleBackTimerDelay = Duration(milliseconds: 1000); + static const softKeyboardDisplayDelay = Duration(milliseconds: 300); + static const searchDebounceDelay = Duration(milliseconds: 250); + static const mediaContentChangeDebounceDelay = Duration(milliseconds: 1000); + static const mapInfoDebounceDelay = Duration(milliseconds: 150); + static const mapIdleDebounceDelay = Duration(milliseconds: 100); +} + +@immutable +class DurationsData { + // common animations + final Duration expansionTileAnimation; + final Duration formTransition; + final Duration formTextStyleTransition; + final Duration textDiffAnimation; + final Duration chartTransition; + final Duration iconAnimation; + final Duration staggeredAnimation; + final Duration staggeredAnimationPageTarget; + final Duration quickChooserAnimation; + final Duration tvImageFocusAnimation; + + // viewer animations + final Duration viewerHorizontalPageScrollAnimation; + final Duration viewerOverlayAnimation; + final Duration viewerOverlayChangeAnimation; + + // delays & refresh intervals + final Duration staggeredAnimationDelay; + + const DurationsData({ + this.expansionTileAnimation = const Duration(milliseconds: 200), + this.formTransition = const Duration(milliseconds: 200), + this.formTextStyleTransition = const Duration(milliseconds: 800), + this.textDiffAnimation = const Duration(milliseconds: 150), + this.chartTransition = const Duration(milliseconds: 400), + this.iconAnimation = const Duration(milliseconds: 300), + this.staggeredAnimation = const Duration(milliseconds: 375), + this.staggeredAnimationPageTarget = const Duration(milliseconds: 800), + this.quickChooserAnimation = const Duration(milliseconds: 100), + this.tvImageFocusAnimation = const Duration(milliseconds: 150), + this.viewerHorizontalPageScrollAnimation = const Duration(milliseconds: 400), + this.viewerOverlayAnimation = const Duration(milliseconds: 200), + this.viewerOverlayChangeAnimation = const Duration(milliseconds: 150), + }) : staggeredAnimationDelay = staggeredAnimation ~/ 6; + + factory DurationsData.noAnimation() { + return DurationsData( + // as of Flutter v2.5.1, `ExpansionPanelList` throws if animation duration is zero + expansionTileAnimation: const Duration(microseconds: 1), + formTransition: Duration.zero, + formTextStyleTransition: Duration.zero, + textDiffAnimation: Duration.zero, + chartTransition: Duration.zero, + iconAnimation: Duration.zero, + staggeredAnimation: Duration.zero, + staggeredAnimationPageTarget: Duration.zero, + quickChooserAnimation: Duration.zero, + tvImageFocusAnimation: Duration.zero, + viewerHorizontalPageScrollAnimation: Duration.zero, + viewerOverlayAnimation: Duration.zero, + viewerOverlayChangeAnimation: Duration.zero, + ); + } +} diff --git a/lib/theme/format.dart b/lib/theme/format.dart new file mode 100644 index 0000000..650f372 --- /dev/null +++ b/lib/theme/format.dart @@ -0,0 +1,34 @@ +import 'package:aves/theme/text.dart'; +import 'package:intl/intl.dart'; + +String formatDay(DateTime date, String locale) => DateFormat.yMMMd(locale).format(date); + +String formatTime(DateTime date, String locale, bool use24hour) => (use24hour ? DateFormat.Hm(locale) : DateFormat.jm(locale)).format(date); + +String formatDateTime(DateTime date, String locale, bool use24hour) => [ + formatDay(date, locale), + formatTime(date, locale, use24hour), +].join(AText.separator); + +String formatFriendlyDuration(Duration d) { + final isNegative = d.isNegative; + final sign = isNegative ? '-' : ''; + d = d.abs(); + final hours = d.inHours; + d -= Duration(hours: hours); + final minutes = d.inMinutes; + d -= Duration(minutes: minutes); + final seconds = d.inSeconds; + + if (hours == 0) return '$sign$minutes:${seconds.toString().padLeft(2, '0')}'; + + return '$sign$hours:${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; +} + +String formatPreciseDuration(Duration d) { + final millis = ((d.inMicroseconds / 1000.0).round() % 1000).toString().padLeft(3, '0'); + final seconds = (d.inSeconds.remainder(Duration.secondsPerMinute)).toString().padLeft(2, '0'); + final minutes = (d.inMinutes.remainder(Duration.minutesPerHour)).toString().padLeft(2, '0'); + final hours = (d.inHours).toString().padLeft(2, '0'); + return '$hours:$minutes:$seconds.$millis'; +} diff --git a/lib/theme/icons.dart b/lib/theme/icons.dart new file mode 100644 index 0000000..1e843c4 --- /dev/null +++ b/lib/theme/icons.dart @@ -0,0 +1,223 @@ +import 'package:flutter/material.dart'; +import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; +import 'package:material_symbols_icons/symbols.dart'; + +class AIcons { + static const allCollection = Symbols.collections; + static const image = Symbols.photo; + static const video = Symbols.movie; + static const vector = Symbols.code; + + static const accessibility = Symbols.accessibility_new; + static const android = Symbols.android; + static const app = Symbols.apps; + static const apply = Symbols.done; + static const aspectRatio = Symbols.aspect_ratio; + static const bin = Symbols.delete; + static const broken = Symbols.broken_image; + static const brightnessMin = Symbols.brightness_low; + static const brightnessMax = Symbols.brightness_high; + static const checked = Symbols.done; + static const circle = Symbols.fiber_manual_record; + static final count = MdiIcons.counter; + static const counter = Symbols.plus_one; + static const description = Symbols.description; + static const descriptionUntitled = Symbols.comments_disabled; + static const display = Symbols.light_mode; + static const duration = Symbols.timelapse; + static const error = Symbols.error; + static const explorer = Symbols.account_tree; + static const folder = Symbols.folder; + static final github = MdiIcons.github; + static const height = Symbols.fit_page_height; + static const histogram = Symbols.area_chart; + static const home = Symbols.home; + + // as of Flutter v3.16.3, + // `label_important_outlined` matches text direction but is filled + // `label_important_outline` is outlined but does not match text direction + static const important = IconData(labelImportantOutlineCodePoint, fontFamily: materialIconsFontFamily, matchTextDirection: true); + + static const language = Symbols.translate; + static final legal = MdiIcons.scaleBalance; + static const mimeType = Symbols.code; + static const minimap = Symbols.picture_in_picture; + static const name = Symbols.match_word; + static const newTier = Symbols.fiber_new; + static const opacity = Symbols.opacity; + static const palette = Symbols.palette; + static const path = Symbols.account_tree; + static const privacy = Symbols.shield_person; + static const rating = Symbols.star; + static final ratingRejected = MdiIcons.starMinusOutline; + static final ratingUnrated = MdiIcons.starOffOutline; + static const raw = Symbols.raw_on; + static const sensorControlEnabled = Symbols.explore; + static const sensorControlDisabled = Symbols.explore_off; + static const settings = Symbols.settings; + static const shooting = Symbols.camera; + static const size = Symbols.data_usage; + static const storageCard = Symbols.sd_storage; + static const storageMain = Symbols.smartphone; + static const streamVideo = Symbols.movie; + static const streamAudio = Symbols.audiotrack; + static const streamText = Symbols.closed_caption; + static const tag = Symbols.sell; + static final tagUntagged = MdiIcons.tagOffOutline; + static const text = Symbols.format_quote; + static const thumbnails = Symbols.grid_on; + static const thumbnailBar = Symbols.view_carousel; + static const volumeMin = Symbols.volume_mute; + static const volumeMax = Symbols.volume_up; + static const width = Symbols.fit_page_width; + static const zoomLevel = Symbols.loupe; + + // time/space + static const date = Symbols.calendar_today; + static const dateByDay = Symbols.today; + static const dateByMonth = Symbols.calendar_month; + static const dateRecent = Symbols.today; + static const dateUndated = Symbols.event_busy; + static const dateWeekday = Symbols.today; + static const geoBounds = Symbols.public; + static const location = Symbols.place; + static const locationUnlocated = Symbols.location_off; + static const country = Symbols.flag; + static const state = Symbols.flag; + static const place = Symbols.place; + + // view + static const section = Symbols.subheader; + static const layout = Symbols.grid_view; + static const layoutMosaic = Symbols.view_comfy; + static const layoutGrid = Symbols.view_compact; + static const layoutList = Symbols.list; + static const sort = Symbols.sort; + static const sortOrder = Symbols.swap_vert; + static const thumbnailLarge = Symbols.photo_size_select_large; + static const thumbnailSmall = Symbols.photo_size_select_small; + + // actions + static const add = Symbols.add_circle; + static const addShortcut = Symbols.add_to_home_screen; + static const cancel = Symbols.cancel; + static const cast = Symbols.cast; + static const clear = Symbols.clear; + static const clipboard = Symbols.content_copy; + static const convert = Symbols.transform; + static final convertToStillImage = MdiIcons.movieRemoveOutline; + static const copy = Symbols.file_copy; + static const debug = Symbols.mode_heat; + static const delete = Symbols.delete; + static const edit = Symbols.edit; + static const emptyBin = Symbols.delete_sweep; + static const export = Symbols.open_with; + static final fileExport = MdiIcons.fileExportOutline; + static final fileImport = MdiIcons.fileImportOutline; + static const flip = Symbols.flip; + static const favourite = Symbols.favorite; + static const filter = Symbols.filter_alt; + static const filterOff = Symbols.filter_alt_off; + static const goUp = Symbols.arrow_upward; + static const group = Symbols.stack_group; + static const hide = Symbols.visibility_off; + static const info = Symbols.info; + static const layers = Symbols.layers; + static const map = Symbols.map; + static const more = Symbols.more_horiz; + static final move = MdiIcons.fileMoveOutline; + static const rename = Symbols.match_word; + static const openOutside = Symbols.open_in_new; + static final openVideoPart = MdiIcons.moviePlayOutline; + static const pin = Symbols.keep; + static const unpin = Symbols.keep_off; + static const print = Symbols.print; + static const refresh = Symbols.refresh; + static const remove = Symbols.remove; + static final resetBounds = MdiIcons.rayStartEnd; + static const reverse = Symbols.invert_colors; + static const reset = Symbols.restart_alt; + static const restore = Symbols.restore; + static const rotateLeft = Symbols.rotate_left; + static const rotateRight = Symbols.rotate_right; + static const rotateScreen = Symbols.screen_rotation; + static const search = Symbols.search; + static const select = Symbols.select_all; + static const setAs = Symbols.wallpaper; + static final setBoundEnd = MdiIcons.rayEnd; + static final setBoundStart = MdiIcons.rayStart; + static final setCover = MdiIcons.imageEditOutline; + static const share = Symbols.share; + static const show = Symbols.visibility; + static const showFullscreenArrows = Symbols.open_in_full; + static const showFullscreenCorners = Symbols.fullscreen; + static const slideshow = Symbols.slideshow; + static const split = Symbols.call_split; + static const stats = Symbols.donut_small; + static const vaultLock = Symbols.lock; + static const vaultAdd = Symbols.enhanced_encryption; + static final vaultConfigure = MdiIcons.shieldLockOutline; + static const view = Symbols.grid_view; + static const viewerLock = Symbols.lock; + static const viewerUnlock = Symbols.lock_open; + static const zoomIn = Symbols.add; + static const zoomOut = Symbols.remove; + static const collapse = Symbols.expand_less; + static const expand = Symbols.expand_more; + static const up = Symbols.keyboard_arrow_up; + static const down = Symbols.keyboard_arrow_down; + static const previous = Symbols.chevron_left; + static const next = Symbols.chevron_right; + + // video actions + // `play` and `pause` icon should be consistent with `AnimatedIcons.play_pause` + static const play = Symbols.play_arrow; + static const pause = Symbols.pause; + static const previousFrame = Symbols.skip_previous; + static const nextFrame = Symbols.skip_next; + static const replay10 = Symbols.replay_10; + static const skip10 = Symbols.forward_10; + static const mute = Symbols.volume_off; + static const unmute = Symbols.volume_up; + static const captureFrame = Symbols.screenshot; + static const repeat = Symbols.repeat; + static final repeatOff = MdiIcons.repeatOff; + static const selectStreams = Symbols.translate; + static const setSpeed = Symbols.speed; + static const videoSettings = Symbols.video_settings; + + // editor + static const transform = Symbols.crop_rotate; + static const aspectRatioFree = Symbols.crop_free; + static const aspectRatioOriginal = Symbols.crop_original; + static const aspectRatioSquare = Symbols.crop_square; + static const aspectRatio_16_9 = Symbols.crop_16_9; + static const aspectRatio_4_3 = Symbols.crop_landscape; + + // albums + static const album = Symbols.photo_album; + static const dynamicAlbum = Symbols.image_search; + static const cameraAlbum = Symbols.photo_camera; + static const downloadAlbum = Symbols.file_download; + static const screenshotAlbum = Symbols.screenshot; + static const recordingAlbum = Symbols.smartphone; + static const locked = Symbols.lock; + static const unlocked = Symbols.lock_open; + + // thumbnail overlay + static const animated = Symbols.animated_images; + static const geo = Symbols.language; + static const hdr = Symbols.hdr_on; + static const motionPhoto = Symbols.motion_photos_on; + static const multiPage = Symbols.burst_mode; + static const panorama = Symbols.vrpano; + static const sphericalVideo = Symbols.threesixty; + static const videoPlay = Symbols.play_circle; + static const selected = Symbols.check_circle; + static const unselected = Symbols.radio_button_unchecked; + + // Material Icons references to make constant instances of `IconData` + // as non-constant instances of `IconData` prevent icon font tree shaking + static const labelImportantOutlineCodePoint = 0xe362; + static const materialIconsFontFamily = 'MaterialIcons'; +} diff --git a/lib/theme/styles.dart b/lib/theme/styles.dart new file mode 100644 index 0000000..dcf7ac0 --- /dev/null +++ b/lib/theme/styles.dart @@ -0,0 +1,23 @@ +import 'package:flutter/painting.dart'; + +class AStyles { + static const knownTitleText = TextStyle( + fontSize: 20, + fontWeight: FontWeight.w300, + fontFeatures: [FontFeature.enable('smcp')], + ); + + static TextStyle unknownTitleText = knownTitleText; + + static void updateStylesForLocale(Locale locale) { + final smcp = locale.languageCode != 'el'; + unknownTitleText = smcp ? knownTitleText : knownTitleText.copyWith(fontFeatures: []); + } + + static const embossShadows = [ + Shadow( + color: Color(0xFF000000), + offset: Offset(0.5, 1.0), + ), + ]; +} diff --git a/lib/theme/text.dart b/lib/theme/text.dart new file mode 100644 index 0000000..27501eb --- /dev/null +++ b/lib/theme/text.dart @@ -0,0 +1,7 @@ +import 'package:aves/ref/unicode.dart'; + +class AText { + static const separator = ' ${UniChars.bullet} '; + static const resolutionSeparator = ' ${UniChars.multiplicationSign} '; + static const valueNotAvailable = UniChars.emDash; +} diff --git a/lib/theme/themes.dart b/lib/theme/themes.dart new file mode 100644 index 0000000..1b1baaf --- /dev/null +++ b/lib/theme/themes.dart @@ -0,0 +1,293 @@ +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:flutter/material.dart'; + +class Themes { + static const _titleTextStyle = TextStyle( + fontSize: 20, + fontWeight: FontWeight.normal, + fontFeatures: [FontFeature.enable('smcp')], + ); + + static String asButtonLabel(String s) => s.toUpperCase(); + + static TextStyle searchFieldStyle(BuildContext context) => Theme.of(context).textTheme.bodyLarge!; + + static Color overlayBackgroundColor({ + required Brightness brightness, + required bool blurred, + }) { + switch (brightness) { + case Brightness.dark: + return blurred ? Colors.black26 : Colors.black45; + case Brightness.light: + return blurred ? Colors.white54 : const Color(0xCCFFFFFF); + } + } + + static bool _isDarkTheme(ColorScheme colors) => colors.brightness == Brightness.dark && colors.surface != Colors.black; + + static Color firstLayerColor(BuildContext context) => _schemeFirstLayer(Theme.of(context).colorScheme); + + static Color _schemeFirstLayer(ColorScheme colors) => _isDarkTheme(colors) ? colors.surfaceContainer : colors.surface; + + static Color _schemeCardLayer(ColorScheme colors) => _isDarkTheme(colors) ? _schemeSecondLayer(colors) : colors.surfaceContainerLow; + + static Color secondLayerColor(BuildContext context) => _schemeSecondLayer(Theme.of(context).colorScheme); + + static Color _schemeSecondLayer(ColorScheme colors) => _isDarkTheme(colors) ? colors.surfaceContainerHigh : colors.surfaceContainer; + + static Color thirdLayerColor(BuildContext context) => _schemeThirdLayer(Theme.of(context).colorScheme); + + static Color _schemeThirdLayer(ColorScheme colors) => _isDarkTheme(colors) ? colors.surfaceContainerHighest : colors.surfaceContainerHigh; + + static Color _unselectedWidgetColor(ColorScheme colors) => colors.onSurface.withValues(alpha: .6); + + static Color backgroundTextColor(BuildContext context) { + final colors = Theme.of(context).colorScheme; + return Color.alphaBlend(colors.surfaceTint, colors.onSurface).withValues(alpha: .5); + } + + static final _typography = Typography.material2021(platform: TargetPlatform.android); + + static ThemeData _baseTheme(ColorScheme colors, bool deviceInitialized) { + return ThemeData( + // COLOR + brightness: colors.brightness, + canvasColor: _schemeSecondLayer(colors), + cardColor: _schemeCardLayer(colors), + colorScheme: colors, + dividerColor: colors.outlineVariant, + scaffoldBackgroundColor: _schemeFirstLayer(colors), + // TYPOGRAPHY & ICONOGRAPHY + iconTheme: _iconTheme(colors), + typography: _typography, + // COMPONENT THEMES + bottomNavigationBarTheme: _bottomNavigationBarTheme(colors), + checkboxTheme: _checkboxTheme(colors), + drawerTheme: _drawerTheme(colors), + floatingActionButtonTheme: _floatingActionButtonTheme(colors), + navigationRailTheme: NavigationRailThemeData( + backgroundColor: _schemeFirstLayer(colors), + selectedIconTheme: IconThemeData(color: colors.primary), + unselectedIconTheme: IconThemeData(color: _unselectedWidgetColor(colors)), + selectedLabelTextStyle: TextStyle(color: colors.primary), + unselectedLabelTextStyle: TextStyle(color: _unselectedWidgetColor(colors)), + ), + radioTheme: _radioTheme(colors), + sliderTheme: _sliderTheme(colors), + tabBarTheme: TabBarThemeData(indicatorColor: colors.primary), + tooltipTheme: _tooltipTheme, + ); + } + + static BottomNavigationBarThemeData _bottomNavigationBarTheme(ColorScheme colors) { + final iconTheme = _iconTheme(colors); + return BottomNavigationBarThemeData( + elevation: 0, + selectedIconTheme: iconTheme.copyWith(color: colors.primary), + unselectedIconTheme: iconTheme.copyWith(color: _unselectedWidgetColor(colors)), + ); + } + + static CheckboxThemeData _checkboxTheme(ColorScheme colors) => CheckboxThemeData( + side: BorderSide(width: 2.0, color: _unselectedWidgetColor(colors)), + ); + + static DrawerThemeData _drawerTheme(ColorScheme colors) => DrawerThemeData( + backgroundColor: _schemeSecondLayer(colors), + ); + + static IconThemeData _iconTheme(ColorScheme colors) => IconThemeData( + // increased weight (from default 400 to 600) + // applied to variable fonts from `material_symbols_icons`, + // to match the fixed-weight icons from `material_design_icons_flutter` + weight: 600, + grade: 0, + opticalSize: 48, + color: colors.onSurface, + ); + + static const _listTileTheme = ListTileThemeData( + contentPadding: EdgeInsets.symmetric(horizontal: 16), + ); + + static PopupMenuThemeData _popupMenuTheme(ColorScheme colors, TextTheme textTheme) { + return PopupMenuThemeData( + color: _schemeSecondLayer(colors), + labelTextStyle: WidgetStateProperty.resolveWith((states) { + // adapted from M3 defaults + final TextStyle style = textTheme.labelLarge!; + if (states.contains(WidgetState.disabled)) { + return style.apply(color: colors.onSurface.withValues(alpha: .38)); + } + return style.apply(color: colors.onSurface); + }), + iconColor: colors.onSurface, + ); + } + + static FloatingActionButtonThemeData _floatingActionButtonTheme(ColorScheme colors) { + return FloatingActionButtonThemeData( + foregroundColor: colors.onPrimary, + backgroundColor: colors.primary, + ); + } + + // adapted from M3 defaults + static RadioThemeData _radioTheme(ColorScheme colors) => RadioThemeData( + fillColor: WidgetStateProperty.resolveWith<Color>((states) { + if (states.contains(WidgetState.selected)) { + if (states.contains(WidgetState.disabled)) { + return colors.onSurface.withValues(alpha: .38); + } + return colors.primary; + } + if (states.contains(WidgetState.disabled)) { + return colors.onSurface.withValues(alpha: .38); + } + if (states.contains(WidgetState.pressed)) { + return colors.onSurface; + } + if (states.contains(WidgetState.hovered)) { + return colors.onSurface; + } + if (states.contains(WidgetState.focused)) { + return colors.onSurface; + } + return _unselectedWidgetColor(colors); + }), + ); + + static SliderThemeData _sliderTheme(ColorScheme colors) => SliderThemeData( + inactiveTrackColor: colors.primary.withValues(alpha: .24), + ); + + static SnackBarThemeData _snackBarTheme(ColorScheme colors) => SnackBarThemeData( + actionTextColor: colors.primary, + behavior: SnackBarBehavior.floating, + ); + + static const _tooltipTheme = TooltipThemeData( + verticalOffset: 32, + ); + + // light + + static final _lightThemeTypo = _typography.black; + static final _lightTitleColor = _lightThemeTypo.titleMedium!.color!; + static final _lightLabelColor = _lightThemeTypo.labelMedium!.color!; + static const _lightActionIconColor = Color(0xAA000000); + static const _lightOnSurface = Colors.black; + + static ThemeData lightTheme(Color accentColor, bool deviceInitialized) { + final onAccent = ColorUtils.textColorOn(accentColor); + final colors = ColorScheme.fromSeed( + seedColor: accentColor, + brightness: Brightness.light, + primary: accentColor, + onPrimary: onAccent, + secondary: accentColor, + onSecondary: onAccent, + onSurface: _lightOnSurface, + ); + final textTheme = _lightThemeTypo; + return _baseTheme(colors, deviceInitialized).copyWith( + // TYPOGRAPHY & ICONOGRAPHY + textTheme: textTheme, + // COMPONENT THEMES + appBarTheme: AppBarTheme( + backgroundColor: _schemeFirstLayer(colors), + // `foregroundColor` is used by icons + foregroundColor: _lightActionIconColor, + // `titleTextStyle.color` is used by text + titleTextStyle: _titleTextStyle.copyWith(color: _lightTitleColor), + systemOverlayStyle: deviceInitialized ? AvesApp.systemUIStyleForBrightness(colors.brightness, _schemeFirstLayer(colors)) : null, + ), + dialogTheme: DialogThemeData( + backgroundColor: _schemeSecondLayer(colors), + titleTextStyle: _titleTextStyle.copyWith(color: _lightTitleColor), + ), + listTileTheme: _listTileTheme.copyWith( + iconColor: _lightActionIconColor, + ), + popupMenuTheme: _popupMenuTheme(colors, textTheme), + snackBarTheme: _snackBarTheme(colors), + textButtonTheme: TextButtonThemeData( + style: TextButton.styleFrom( + foregroundColor: _lightLabelColor, + ), + ), + ); + } + + // dark + + static final _darkThemeTypo = _typography.white; + static final _darkTitleColor = _darkThemeTypo.titleMedium!.color!; + static final _darkBodyColor = _darkThemeTypo.bodyMedium!.color!; + static final _darkLabelColor = _darkThemeTypo.labelMedium!.color!; + static const _darkOnSurface = Colors.white; + + static ColorScheme _darkColorScheme(Color accentColor) { + final onAccent = ColorUtils.textColorOn(accentColor); + final colors = ColorScheme.fromSeed( + seedColor: accentColor, + brightness: Brightness.dark, + primary: accentColor, + onPrimary: onAccent, + secondary: accentColor, + onSecondary: onAccent, + onSurface: _darkOnSurface, + ); + return colors; + } + + static ThemeData _baseDarkTheme(ColorScheme colors, bool deviceInitialized) { + final textTheme = _darkThemeTypo; + return _baseTheme(colors, deviceInitialized).copyWith( + // TYPOGRAPHY & ICONOGRAPHY + textTheme: textTheme, + // COMPONENT THEMES + appBarTheme: AppBarTheme( + backgroundColor: _schemeFirstLayer(colors), + // `foregroundColor` is used by icons + foregroundColor: _darkTitleColor, + // `titleTextStyle.color` is used by text + titleTextStyle: _titleTextStyle.copyWith(color: _darkTitleColor), + systemOverlayStyle: deviceInitialized ? AvesApp.systemUIStyleForBrightness(colors.brightness, _schemeFirstLayer(colors)) : null, + ), + dialogTheme: DialogThemeData( + backgroundColor: _schemeSecondLayer(colors), + titleTextStyle: _titleTextStyle.copyWith(color: _darkTitleColor), + ), + listTileTheme: _listTileTheme, + popupMenuTheme: _popupMenuTheme(colors, textTheme), + snackBarTheme: _snackBarTheme(colors).copyWith( + backgroundColor: _schemeSecondLayer(colors), + contentTextStyle: TextStyle( + color: _darkBodyColor, + ), + ), + textButtonTheme: TextButtonThemeData( + style: TextButton.styleFrom( + foregroundColor: _darkLabelColor, + ), + ), + ); + } + + static ThemeData darkTheme(Color accentColor, bool deviceInitialized) { + final colors = _darkColorScheme(accentColor); + return _baseDarkTheme(colors, deviceInitialized); + } + + // black + + static ThemeData blackTheme(Color accentColor, bool deviceInitialized) { + final colors = _darkColorScheme(accentColor).copyWith( + surface: Colors.black, + ); + return _baseDarkTheme(colors, deviceInitialized); + } +} diff --git a/lib/utils/android_file_utils.dart b/lib/utils/android_file_utils.dart new file mode 100644 index 0000000..637fbbb --- /dev/null +++ b/lib/utils/android_file_utils.dart @@ -0,0 +1,124 @@ +import 'dart:async'; + +import 'package:aves/model/app_inventory.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; + +final AndroidFileUtils androidFileUtils = AndroidFileUtils._private(); + +class AndroidFileUtils { + // cf https://developer.android.com/reference/android/content/ContentResolver#SCHEME_CONTENT + static const contentScheme = 'content'; + + // cf https://developer.android.com/reference/android/provider/MediaStore#AUTHORITY + static const mediaStoreAuthority = 'media'; + + // cf https://developer.android.com/reference/android/provider/MediaStore#VOLUME_EXTERNAL + static const externalVolume = 'external'; + + static const standardDirDcim = 'DCIM'; + static const standardDirDownloads = 'Download'; + static const standardDirMovies = 'Movies'; + static const standardDirPictures = 'Pictures'; + + static const mediaStoreUriRoot = '$contentScheme://$mediaStoreAuthority/'; + static const mediaUriPathRoots = {'/$externalVolume/images/', '/$externalVolume/video/'}; + + static const recoveryDir = 'Lost & Found'; + static const trashDirPath = '#trash'; + + late final String separator, vaultRoot, primaryStorage; + late final String dcimPath, downloadPath, moviesPath, picturesPath, avesVideoCapturesPath; + late final Set<String> videoCapturesPaths; + Set<StorageVolume> storageVolumes = {}; + Future<void>? _loader; + + AndroidFileUtils._private(); + + Future<void> init() async { + _loader ??= _doInit(); + await _loader; + } + + Future<void> _doInit() async { + separator = pContext.separator; + await _initStorageVolumes(); + vaultRoot = await storageService.getVaultRoot(); + primaryStorage = storageVolumes.firstWhereOrNull((volume) => volume.isPrimary)?.path ?? separator; + // standard dirs + dcimPath = pContext.join(primaryStorage, standardDirDcim); + // effective download path may have a different case + downloadPath = pContext.join(primaryStorage, standardDirDownloads).toLowerCase(); + moviesPath = pContext.join(primaryStorage, standardDirMovies); + picturesPath = pContext.join(primaryStorage, standardDirPictures); + // custom dirs + avesVideoCapturesPath = pContext.join(dcimPath, 'Video Captures'); + videoCapturesPaths = { + // from Samsung + pContext.join(dcimPath, 'Videocaptures'), + // from Aves + avesVideoCapturesPath, + }; + } + + Future<void> _initStorageVolumes() async { + storageVolumes = await storageService.getStorageVolumes(); + if (storageVolumes.isEmpty) { + // this can happen when the device is booting up + debugPrint('Storage volume list is empty. Retrying in a second...'); + await Future.delayed(const Duration(seconds: 1)); + await _initStorageVolumes(); + } + } + + bool isCameraPath(String path) => path.startsWith(dcimPath) && (path.endsWith('${separator}Camera') || path.endsWith('${separator}100ANDRO')); + + bool isScreenshotsPath(String path) => (path.startsWith(dcimPath) || path.startsWith(picturesPath)) && path.endsWith('${separator}Screenshots'); + + bool isScreenRecordingsPath(String path) => (path.startsWith(dcimPath) || path.startsWith(moviesPath)) && (path.endsWith('${separator}Screen recordings') || path.endsWith('${separator}ScreenRecords')); + + bool isVideoCapturesPath(String path) => videoCapturesPaths.contains(path); + + bool isDownloadPath(String path) => path.toLowerCase() == downloadPath; + + StorageVolume? getStorageVolume(String? path) { + if (path == null) return null; + final volume = storageVolumes.firstWhereOrNull((v) => path.startsWith(v.path)); + // storage volume path includes trailing '/', but argument path may or may not, + // which is an issue when the path is at the root + return volume != null || path.endsWith(separator) ? volume : getStorageVolume('$path$separator'); + } + + // prefer static method over a null returning factory constructor + VolumeRelativeDirectory? relativeDirectoryFromPath(String dirPath) { + final volume = getStorageVolume(dirPath); + if (volume == null) return null; + + final root = volume.path; + final rootLength = root.length; + return VolumeRelativeDirectory( + volumePath: root, + relativeDir: dirPath.length < rootLength ? '' : dirPath.substring(rootLength), + ); + } + + bool isOnRemovableStorage(String path) => getStorageVolume(path)?.isRemovable ?? false; + + AlbumType getAlbumType(String dirPath) { + if (vaults.isVault(dirPath)) return AlbumType.vault; + + if (isCameraPath(dirPath)) return AlbumType.camera; + if (isDownloadPath(dirPath)) return AlbumType.download; + if (isScreenRecordingsPath(dirPath)) return AlbumType.screenRecordings; + if (isScreenshotsPath(dirPath)) return AlbumType.screenshots; + if (isVideoCapturesPath(dirPath)) return AlbumType.videoCaptures; + + final dir = pContext.split(dirPath).lastOrNull; + if (dir != null && dirPath.startsWith(primaryStorage) && appInventory.isPotentialAppDir(dir)) return AlbumType.app; + + return AlbumType.regular; + } +} diff --git a/lib/utils/collection_utils.dart b/lib/utils/collection_utils.dart new file mode 100644 index 0000000..505f487 --- /dev/null +++ b/lib/utils/collection_utils.dart @@ -0,0 +1,46 @@ +extension ExtraList<E> on List<E> { + bool replace(E old, E newItem) { + final index = indexOf(old); + if (index == -1) return false; + + this[index] = newItem; + return true; + } +} + +extension ExtraSet<E> on Set<E> { + bool replace(E old, E newItem) { + if (!remove(old)) return false; + + add(newItem); + return true; + } +} + +extension ExtraMapNullableKey<K extends Object, V> on Map<K?, V> { + Map<K, V> whereNotNullKey() => <K, V>{for (var v in keys.nonNulls) v: this[v] as V}; +} + +extension ExtraMapNullableValue<K extends Object, V> on Map<K, V?> { + Map<K, V> whereNotNullValue() => <K, V>{for (var kv in entries.where((kv) => kv.value != null)) kv.key: kv.value as V}; +} + +extension ExtraMapNullableKeyValue<K extends Object, V> on Map<K?, V?> { + Map<K, V?> whereNotNullKey() => <K, V?>{for (var v in keys.nonNulls) v: this[v]}; + + Map<K?, V> whereNotNullValue() => <K?, V>{for (var kv in entries.where((kv) => kv.value != null)) kv.key: kv.value as V}; +} + +extension ExtraNumIterable on Iterable<int?> { + int get sum => fold(0, (prev, v) => prev + (v ?? 0)); +} + +extension ExtraEnum<T extends Enum> on Iterable<T> { + T safeByName(String name, T defaultValue) { + try { + return byName(name); + } catch (error) { + return defaultValue; + } + } +} diff --git a/lib/utils/debouncer.dart b/lib/utils/debouncer.dart new file mode 100644 index 0000000..0fc03fc --- /dev/null +++ b/lib/utils/debouncer.dart @@ -0,0 +1,16 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; + +class Debouncer { + final Duration delay; + + Timer? _timer; + + Debouncer({required this.delay}); + + void call(VoidCallback action) { + _timer?.cancel(); + _timer = Timer(delay, action); + } +} diff --git a/lib/utils/diff_match.dart b/lib/utils/diff_match.dart new file mode 100644 index 0000000..04058f0 --- /dev/null +++ b/lib/utils/diff_match.dart @@ -0,0 +1,1482 @@ +/* + * Diff Match and Patch + * Copyright 2018 The diff-match-patch Authors. + * https://github.com/google/diff-match-patch + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * Functions for diff, match and patch. + * Computes the difference between two texts to create a patch. + * Applies the patch onto another text, allowing for errors. + * + * @author fraser@google.com (Neil Fraser) + */ + +// ignore_for_file: no_leading_underscores_for_local_identifiers +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: unnecessary_this + +import 'dart:collection'; +import 'dart:math'; + +// adapted from Google's `Diff Match and Patch` Dart implementation +// cf https://github.com/google/diff-match-patch/tree/master/dart + +/// Class representing one diff operation. +class Diff { + /// One of: Operation.insert, Operation.delete or Operation.equal. + Operation operation; + + /// The text associated with this diff operation. + String text; + + /// Constructor. Initializes the diff with the provided values. + /// [operation] is one of Operation.insert, Operation.delete or Operation.equal. + /// [text] is the text being applied. + Diff(this.operation, this.text); + + /// Display a human-readable version of this Diff. + /// Returns a text version. + @override + String toString() { + String prettyText = this.text.replaceAll('\n', '\u00b6'); + return 'Diff(${this.operation},"$prettyText")'; + } + + /// Is this Diff equivalent to another Diff? + /// [other] is another Diff to compare against. + /// Returns true or false. + @override + bool operator ==(Object other) => identical(this, other) || other is Diff && runtimeType == other.runtimeType && operation == other.operation && text == other.text; + + /// Generate a uniquely identifiable hashcode for this Diff. + /// Returns numeric hashcode. + @override + int get hashCode => operation.hashCode ^ text.hashCode; +} + +/// The data structure representing a diff is a List of Diff objects: +/// {Diff(Operation.delete, 'Hello'), Diff(Operation.insert, 'Goodbye'), +/// Diff(Operation.equal, ' world.')} +/// which means: delete 'Hello', add 'Goodbye' and keep ' world.' +enum Operation { delete, insert, equal } + +/// Class containing the diff, match and patch methods. +/// Also contains the behaviour settings. +class DiffMatchPatch { + // Defaults. + // Set these on your diff_match_patch instance to override the defaults. + + /// Number of seconds to map a diff before giving up (0 for infinity). + double Diff_Timeout = 1.0; + + /// Cost of an empty edit operation in terms of edit characters. + int Diff_EditCost = 4; + + /// At what point is no match declared (0.0 = perfection, 1.0 = very loose). + double Match_Threshold = 0.5; + + /// How far to search for a match (0 = exact location, 1000+ = broad match). + /// A match this many characters away from the expected location will add + /// 1.0 to the score (0.0 is a perfect match). + int Match_Distance = 1000; + + /// When deleting a large block of text (over ~64 characters), how close do + /// the contents have to be to match the expected contents. (0.0 = perfection, + /// 1.0 = very loose). Note that Match_Threshold controls how closely the + /// end points of a delete need to match. + double Patch_DeleteThreshold = 0.5; + + /// Chunk size for context length. + int Patch_Margin = 4; + + /// The number of bits in an int. + int Match_MaxBits = 32; + + // DIFF FUNCTIONS + + /// Find the differences between two texts. Simplifies the problem by + /// stripping any common prefix or suffix off the texts before diffing. + /// [text1] is the old string to be diffed. + /// [text2] is the new string to be diffed. + /// [checklines] is an optional speedup flag. If present and false, then don't + /// run a line-level diff first to identify the changed areas. + /// Defaults to true, which does a faster, slightly less optimal diff. + /// [deadline] is an optional time when the diff should be complete by. Used + /// internally for recursive calls. Users should set DiffTimeout instead. + /// Returns a List of Diff objects. + List<Diff> diff_main(String? text1, String? text2, [bool checklines = true, DateTime? deadline]) { + // Set a deadline by which time the diff must be complete. + if (deadline == null) { + deadline = DateTime.now(); + if (Diff_Timeout <= 0) { + // One year should be sufficient for 'infinity'. + deadline = deadline.add(const Duration(days: 365)); + } else { + deadline = deadline.add(Duration(milliseconds: (Diff_Timeout * 1000).toInt())); + } + } + // Check for null inputs. + if (text1 == null || text2 == null) { + throw ArgumentError('Null inputs. (diff_main)'); + } + + // Check for equality (speedup). + List<Diff> diffs; + if (text1 == text2) { + diffs = []; + if (text1.isNotEmpty) { + diffs.add(Diff(Operation.equal, text1)); + } + return diffs; + } + + // Trim off common prefix (speedup). + int commonlength = diff_commonPrefix(text1, text2); + String commonprefix = text1.substring(0, commonlength); + text1 = text1.substring(commonlength); + text2 = text2.substring(commonlength); + + // Trim off common suffix (speedup). + commonlength = diff_commonSuffix(text1, text2); + String commonsuffix = text1.substring(text1.length - commonlength); + text1 = text1.substring(0, text1.length - commonlength); + text2 = text2.substring(0, text2.length - commonlength); + + // Compute the diff on the middle block. + diffs = _diff_compute(text1, text2, checklines, deadline); + + // Restore the prefix and suffix. + if (commonprefix.isNotEmpty) { + diffs.insert(0, Diff(Operation.equal, commonprefix)); + } + if (commonsuffix.isNotEmpty) { + diffs.add(Diff(Operation.equal, commonsuffix)); + } + + diff_cleanupMerge(diffs); + return diffs; + } + + /// Find the differences between two texts. Assumes that the texts do not + /// have any common prefix or suffix. + /// [text1] is the old string to be diffed. + /// [text2] is the new string to be diffed. + /// [checklines] is a speedup flag. If false, then don't run a + /// line-level diff first to identify the changed areas. + /// If true, then run a faster slightly less optimal diff. + /// [deadline] is the time when the diff should be complete by. + /// Returns a List of Diff objects. + List<Diff> _diff_compute(String text1, String text2, bool checklines, DateTime deadline) { + List<Diff> diffs = <Diff>[]; + + if (text1.isEmpty) { + // Just add some text (speedup). + diffs.add(Diff(Operation.insert, text2)); + return diffs; + } + + if (text2.isEmpty) { + // Just delete some text (speedup). + diffs.add(Diff(Operation.delete, text1)); + return diffs; + } + + String longtext = text1.length > text2.length ? text1 : text2; + String shorttext = text1.length > text2.length ? text2 : text1; + int i = longtext.indexOf(shorttext); + if (i != -1) { + // Shorter text is inside the longer text (speedup). + Operation op = (text1.length > text2.length) ? Operation.delete : Operation.insert; + diffs.add(Diff(op, longtext.substring(0, i))); + diffs.add(Diff(Operation.equal, shorttext)); + diffs.add(Diff(op, longtext.substring(i + shorttext.length))); + return diffs; + } + + if (shorttext.length == 1) { + // Single character string. + // After the previous speedup, the character can't be an equality. + diffs.add(Diff(Operation.delete, text1)); + diffs.add(Diff(Operation.insert, text2)); + return diffs; + } + + // Check to see if the problem can be split in two. + final hm = _diff_halfMatch(text1, text2); + if (hm != null) { + // A half-match was found, sort out the return data. + final text1_a = hm[0]; + final text1_b = hm[1]; + final text2_a = hm[2]; + final text2_b = hm[3]; + final mid_common = hm[4]; + // Send both pairs off for separate processing. + final diffs_a = diff_main(text1_a, text2_a, checklines, deadline); + final diffs_b = diff_main(text1_b, text2_b, checklines, deadline); + // Merge the results. + diffs = diffs_a; + diffs.add(Diff(Operation.equal, mid_common)); + diffs.addAll(diffs_b); + return diffs; + } + + if (checklines && text1.length > 100 && text2.length > 100) { + return _diff_lineMode(text1, text2, deadline); + } + + return _diff_bisect(text1, text2, deadline); + } + + /// Do a quick line-level diff on both strings, then rediff the parts for + /// greater accuracy. + /// This speedup can produce non-minimal diffs. + /// [text1] is the old string to be diffed. + /// [text2] is the new string to be diffed. + /// [deadline] is the time when the diff should be complete by. + /// Returns a List of Diff objects. + List<Diff> _diff_lineMode(String text1, String text2, DateTime deadline) { + // Scan the text on a line-by-line basis first. + final a = _diff_linesToChars(text1, text2); + text1 = a['chars1']; + text2 = a['chars2']; + final linearray = a['lineArray']; + + final diffs = diff_main(text1, text2, false, deadline); + + // Convert the diff back to original text. + _diff_charsToLines(diffs, linearray); + // Eliminate freak matches (e.g. blank lines) + diff_cleanupSemantic(diffs); + + // Rediff any replacement blocks, this time character-by-character. + // Add a dummy entry at the end. + diffs.add(Diff(Operation.equal, '')); + int pointer = 0; + int count_delete = 0; + int count_insert = 0; + final text_delete = StringBuffer(); + final text_insert = StringBuffer(); + while (pointer < diffs.length) { + switch (diffs[pointer].operation) { + case Operation.insert: + count_insert++; + text_insert.write(diffs[pointer].text); + case Operation.delete: + count_delete++; + text_delete.write(diffs[pointer].text); + case Operation.equal: + // Upon reaching an equality, check for prior redundancies. + if (count_delete >= 1 && count_insert >= 1) { + // Delete the offending records and add the merged ones. + diffs.removeRange(pointer - count_delete - count_insert, pointer); + pointer = pointer - count_delete - count_insert; + final subDiff = diff_main(text_delete.toString(), text_insert.toString(), false, deadline); + for (int j = subDiff.length - 1; j >= 0; j--) { + diffs.insert(pointer, subDiff[j]); + } + pointer = pointer + subDiff.length; + } + count_insert = 0; + count_delete = 0; + text_delete.clear(); + text_insert.clear(); + } + pointer++; + } + diffs.removeLast(); // Remove the dummy entry at the end. + + return diffs; + } + + /// Find the 'middle snake' of a diff, split the problem in two + /// and return the recursively constructed diff. + /// See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations. + /// [text1] is the old string to be diffed. + /// [text2] is the new string to be diffed. + /// [deadline] is the time at which to bail if not yet complete. + /// Returns a List of Diff objects. + List<Diff> _diff_bisect(String text1, String text2, DateTime deadline) { + // Cache the text lengths to prevent multiple calls. + final text1_length = text1.length; + final text2_length = text2.length; + final max_d = (text1_length + text2_length + 1) ~/ 2; + final v_offset = max_d; + final v_length = 2 * max_d; + final v1 = List<int>.filled(v_length, -1); + final v2 = List<int>.filled(v_length, -1); + v1[v_offset + 1] = 0; + v2[v_offset + 1] = 0; + final delta = text1_length - text2_length; + // If the total number of characters is odd, then the front path will + // collide with the reverse path. + final front = (delta % 2 != 0); + // Offsets for start and end of k loop. + // Prevents mapping of space beyond the grid. + int k1start = 0; + int k1end = 0; + int k2start = 0; + int k2end = 0; + for (int d = 0; d < max_d; d++) { + // Bail out if deadline is reached. + if ((DateTime.now()).compareTo(deadline) == 1) { + break; + } + + // Walk the front path one step. + for (int k1 = -d + k1start; k1 <= d - k1end; k1 += 2) { + int k1_offset = v_offset + k1; + int x1; + if (k1 == -d || k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1]) { + x1 = v1[k1_offset + 1]; + } else { + x1 = v1[k1_offset - 1] + 1; + } + int y1 = x1 - k1; + while (x1 < text1_length && y1 < text2_length && text1[x1] == text2[y1]) { + x1++; + y1++; + } + v1[k1_offset] = x1; + if (x1 > text1_length) { + // Ran off the right of the graph. + k1end += 2; + } else if (y1 > text2_length) { + // Ran off the bottom of the graph. + k1start += 2; + } else if (front) { + int k2_offset = v_offset + delta - k1; + if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) { + // Mirror x2 onto top-left coordinate system. + int x2 = text1_length - v2[k2_offset]; + if (x1 >= x2) { + // Overlap detected. + return _diff_bisectSplit(text1, text2, x1, y1, deadline); + } + } + } + } + + // Walk the reverse path one step. + for (int k2 = -d + k2start; k2 <= d - k2end; k2 += 2) { + int k2_offset = v_offset + k2; + int x2; + if (k2 == -d || k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1]) { + x2 = v2[k2_offset + 1]; + } else { + x2 = v2[k2_offset - 1] + 1; + } + int y2 = x2 - k2; + while (x2 < text1_length && y2 < text2_length && text1[text1_length - x2 - 1] == text2[text2_length - y2 - 1]) { + x2++; + y2++; + } + v2[k2_offset] = x2; + if (x2 > text1_length) { + // Ran off the left of the graph. + k2end += 2; + } else if (y2 > text2_length) { + // Ran off the top of the graph. + k2start += 2; + } else if (!front) { + int k1_offset = v_offset + delta - k2; + if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) { + int x1 = v1[k1_offset]; + int y1 = v_offset + x1 - k1_offset; + // Mirror x2 onto top-left coordinate system. + x2 = text1_length - x2; + if (x1 >= x2) { + // Overlap detected. + return _diff_bisectSplit(text1, text2, x1, y1, deadline); + } + } + } + } + } + // Diff took too long and hit the deadline or + // number of diffs equals number of characters, no commonality at all. + return [Diff(Operation.delete, text1), Diff(Operation.insert, text2)]; + } + + /// Hack to allow unit tests to call private method. Do not use. + List<Diff> test_diff_bisect(String text1, String text2, DateTime deadline) { + return _diff_bisect(text1, text2, deadline); + } + + /// Given the location of the 'middle snake', split the diff in two parts + /// and recurse. + /// [text1] is the old string to be diffed. + /// [text2] is the new string to be diffed. + /// [x] is the index of split point in text1. + /// [y] is the index of split point in text2. + /// [deadline] is the time at which to bail if not yet complete. + /// Returns a List of Diff objects. + List<Diff> _diff_bisectSplit(String text1, String text2, int x, int y, DateTime deadline) { + final text1a = text1.substring(0, x); + final text2a = text2.substring(0, y); + final text1b = text1.substring(x); + final text2b = text2.substring(y); + + // Compute both diffs serially. + final diffs = diff_main(text1a, text2a, false, deadline); + final diffsb = diff_main(text1b, text2b, false, deadline); + + diffs.addAll(diffsb); + return diffs; + } + + /// Split two texts into a list of strings. Reduce the texts to a string of + /// hashes where each Unicode character represents one line. + /// [text1] is the first string. + /// [text2] is the second string. + /// Returns a Map containing the encoded text1, the encoded text2 and + /// the List of unique strings. The zeroth element of the List of + /// unique strings is intentionally blank. + Map<String, dynamic> _diff_linesToChars(String text1, String text2) { + final lineArray = <String>[]; + final lineHash = HashMap<String, int>(); + // e.g. linearray[4] == 'Hello\n' + // e.g. linehash['Hello\n'] == 4 + + // '\x00' is a valid character, but various debuggers don't like it. + // So we'll insert a junk entry to avoid generating a null character. + lineArray.add(''); + + // Allocate 2/3rds of the space for text1, the rest for text2. + String chars1 = _diff_linesToCharsMunge(text1, lineArray, lineHash, 40000); + String chars2 = _diff_linesToCharsMunge(text2, lineArray, lineHash, 65535); + return {'chars1': chars1, 'chars2': chars2, 'lineArray': lineArray}; + } + + /// Hack to allow unit tests to call private method. Do not use. + Map<String, dynamic> test_diff_linesToChars(String text1, String text2) { + return _diff_linesToChars(text1, text2); + } + + /// Split a text into a list of strings. Reduce the texts to a string of + /// hashes where each Unicode character represents one line. + /// [text] is the string to encode. + /// [lineArray] is a List of unique strings. + /// [lineHash] is a Map of strings to indices. + /// [maxLines] is the maximum length for lineArray. + /// Returns an encoded string. + String _diff_linesToCharsMunge(String text, List<String> lineArray, Map<String, int> lineHash, int maxLines) { + int lineStart = 0; + int lineEnd = -1; + String line; + final chars = StringBuffer(); + // Walk the text, pulling out a substring for each line. + // text.split('\n') would would temporarily double our memory footprint. + // Modifying text would create many large strings to garbage collect. + while (lineEnd < text.length - 1) { + lineEnd = text.indexOf('\n', lineStart); + if (lineEnd == -1) { + lineEnd = text.length - 1; + } + line = text.substring(lineStart, lineEnd + 1); + + if (lineHash.containsKey(line)) { + chars.writeCharCode(lineHash[line]!); + } else { + if (lineArray.length == maxLines) { + // Bail out at 65535 because + // final chars1 = StringBuffer(); + // chars1.writeCharCode(65536); + // chars1.toString().codeUnitAt(0) == 55296; + line = text.substring(lineStart); + lineEnd = text.length; + } + lineArray.add(line); + lineHash[line] = lineArray.length - 1; + chars.writeCharCode(lineArray.length - 1); + } + lineStart = lineEnd + 1; + } + return chars.toString(); + } + + /// Rehydrate the text in a diff from a string of line hashes to real lines of + /// text. + /// [diffs] is a List of Diff objects. + /// [lineArray] is a List of unique strings. + void _diff_charsToLines(List<Diff> diffs, List<String> lineArray) { + final text = StringBuffer(); + for (Diff diff in diffs) { + for (int j = 0; j < diff.text.length; j++) { + text.write(lineArray[diff.text.codeUnitAt(j)]); + } + diff.text = text.toString(); + text.clear(); + } + } + + /// Hack to allow unit tests to call private method. Do not use. + void test_diff_charsToLines(List<Diff> diffs, List<String> lineArray) { + _diff_charsToLines(diffs, lineArray); + } + + /// Determine the common prefix of two strings + /// [text1] is the first string. + /// [text2] is the second string. + /// Returns the number of characters common to the start of each string. + int diff_commonPrefix(String text1, String text2) { + // TODO: Once Dart's performance stabilizes, determine if linear or binary + // search is better. + // Performance analysis: https://neil.fraser.name/news/2007/10/09/ + final n = min(text1.length, text2.length); + for (int i = 0; i < n; i++) { + if (text1[i] != text2[i]) { + return i; + } + } + return n; + } + + /// Determine the common suffix of two strings + /// [text1] is the first string. + /// [text2] is the second string. + /// Returns the number of characters common to the end of each string. + int diff_commonSuffix(String text1, String text2) { + // TODO: Once Dart's performance stabilizes, determine if linear or binary + // search is better. + // Performance analysis: https://neil.fraser.name/news/2007/10/09/ + final text1_length = text1.length; + final text2_length = text2.length; + final n = min(text1_length, text2_length); + for (int i = 1; i <= n; i++) { + if (text1[text1_length - i] != text2[text2_length - i]) { + return i - 1; + } + } + return n; + } + + /// Determine if the suffix of one string is the prefix of another. + /// [text1] is the first string. + /// [text2] is the second string. + /// Returns the number of characters common to the end of the first + /// string and the start of the second string. + int _diff_commonOverlap(String text1, String text2) { + // Eliminate the null case. + if (text1.isEmpty || text2.isEmpty) { + return 0; + } + // Cache the text lengths to prevent multiple calls. + final text1_length = text1.length; + final text2_length = text2.length; + // Truncate the longer string. + if (text1_length > text2_length) { + text1 = text1.substring(text1_length - text2_length); + } else if (text1_length < text2_length) { + text2 = text2.substring(0, text1_length); + } + final text_length = min(text1_length, text2_length); + // Quick check for the worst case. + if (text1 == text2) { + return text_length; + } + + // Start by looking for a single character match + // and increase length until no match is found. + // Performance analysis: https://neil.fraser.name/news/2010/11/04/ + int best = 0; + int length = 1; + while (true) { + String pattern = text1.substring(text_length - length); + int found = text2.indexOf(pattern); + if (found == -1) { + return best; + } + length += found; + if (found == 0 || text1.substring(text_length - length) == text2.substring(0, length)) { + best = length; + length++; + } + } + } + + /// Hack to allow unit tests to call private method. Do not use. + int test_diff_commonOverlap(String text1, String text2) { + return _diff_commonOverlap(text1, text2); + } + + /// Do the two texts share a substring which is at least half the length of + /// the longer text? + /// This speedup can produce non-minimal diffs. + /// [text1] is the first string. + /// [text2] is the second string. + /// Returns a five element List of Strings, containing the prefix of text1, + /// the suffix of text1, the prefix of text2, the suffix of text2 and the + /// common middle. Or null if there was no match. + List<String>? _diff_halfMatch(String text1, String text2) { + if (Diff_Timeout <= 0) { + // Don't risk returning a non-optimal diff if we have unlimited time. + return null; + } + final longtext = text1.length > text2.length ? text1 : text2; + final shorttext = text1.length > text2.length ? text2 : text1; + if (longtext.length < 4 || shorttext.length * 2 < longtext.length) { + return null; // Pointless. + } + + // First check if the second quarter is the seed for a half-match. + final hm1 = _diff_halfMatchI(longtext, shorttext, ((longtext.length + 3) / 4).ceil().toInt()); + // Check again based on the third quarter. + final hm2 = _diff_halfMatchI(longtext, shorttext, ((longtext.length + 1) / 2).ceil().toInt()); + List<String> hm; + if (hm1 == null && hm2 == null) { + return null; + } else if (hm2 == null) { + hm = hm1!; + } else if (hm1 == null) { + hm = hm2; + } else { + // Both matched. Select the longest. + hm = hm1[4].length > hm2[4].length ? hm1 : hm2; + } + + // A half-match was found, sort out the return data. + if (text1.length > text2.length) { + return hm; + //return [hm[0], hm[1], hm[2], hm[3], hm[4]]; + } else { + return [hm[2], hm[3], hm[0], hm[1], hm[4]]; + } + } + + /// Hack to allow unit tests to call private method. Do not use. + List<String>? test_diff_halfMatch(String text1, String text2) { + return _diff_halfMatch(text1, text2); + } + + /// Does a substring of shorttext exist within longtext such that the + /// substring is at least half the length of longtext? + /// [longtext] is the longer string. + /// [shorttext is the shorter string. + /// [i] Start index of quarter length substring within longtext. + /// Returns a five element String array, containing the prefix of longtext, + /// the suffix of longtext, the prefix of shorttext, the suffix of + /// shorttext and the common middle. Or null if there was no match. + List<String>? _diff_halfMatchI(String longtext, String shorttext, int i) { + // Start with a 1/4 length substring at position i as a seed. + final seed = longtext.substring(i, i + (longtext.length / 4).floor().toInt()); + int j = -1; + String best_common = ''; + String best_longtext_a = '', best_longtext_b = ''; + String best_shorttext_a = '', best_shorttext_b = ''; + while ((j = shorttext.indexOf(seed, j + 1)) != -1) { + int prefixLength = diff_commonPrefix(longtext.substring(i), shorttext.substring(j)); + int suffixLength = diff_commonSuffix(longtext.substring(0, i), shorttext.substring(0, j)); + if (best_common.length < suffixLength + prefixLength) { + best_common = shorttext.substring(j - suffixLength, j) + shorttext.substring(j, j + prefixLength); + best_longtext_a = longtext.substring(0, i - suffixLength); + best_longtext_b = longtext.substring(i + prefixLength); + best_shorttext_a = shorttext.substring(0, j - suffixLength); + best_shorttext_b = shorttext.substring(j + prefixLength); + } + } + if (best_common.length * 2 >= longtext.length) { + return [best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b, best_common]; + } else { + return null; + } + } + + /// Reduce the number of edits by eliminating semantically trivial equalities. + /// [diffs] is a List of Diff objects. + void diff_cleanupSemantic(List<Diff> diffs) { + bool changes = false; + // Stack of indices where equalities are found. + final equalities = <int>[]; + // Always equal to diffs[equalities.last()].text + String? lastEquality; + int pointer = 0; // Index of current position. + // Number of characters that changed prior to the equality. + int length_insertions1 = 0; + int length_deletions1 = 0; + // Number of characters that changed after the equality. + int length_insertions2 = 0; + int length_deletions2 = 0; + while (pointer < diffs.length) { + if (diffs[pointer].operation == Operation.equal) { + // Equality found. + equalities.add(pointer); + length_insertions1 = length_insertions2; + length_deletions1 = length_deletions2; + length_insertions2 = 0; + length_deletions2 = 0; + lastEquality = diffs[pointer].text; + } else { + // An insertion or deletion. + if (diffs[pointer].operation == Operation.insert) { + length_insertions2 += diffs[pointer].text.length; + } else { + length_deletions2 += diffs[pointer].text.length; + } + // Eliminate an equality that is smaller or equal to the edits on both + // sides of it. + if (lastEquality != null && (lastEquality.length <= max(length_insertions1, length_deletions1)) && (lastEquality.length <= max(length_insertions2, length_deletions2))) { + // Duplicate record. + diffs.insert(equalities.last, Diff(Operation.delete, lastEquality)); + // Change second copy to insert. + diffs[equalities.last + 1].operation = Operation.insert; + // Throw away the equality we just deleted. + equalities.removeLast(); + // Throw away the previous equality (it needs to be reevaluated). + if (equalities.isNotEmpty) { + equalities.removeLast(); + } + pointer = equalities.isEmpty ? -1 : equalities.last; + length_insertions1 = 0; // Reset the counters. + length_deletions1 = 0; + length_insertions2 = 0; + length_deletions2 = 0; + lastEquality = null; + changes = true; + } + } + pointer++; + } + + // Normalize the diff. + if (changes) { + diff_cleanupMerge(diffs); + } + _diff_cleanupSemanticLossless(diffs); + + // Find any overlaps between deletions and insertions. + // e.g: <del>abcxxx</del><ins>xxxdef</ins> + // -> <del>abc</del>xxx<ins>def</ins> + // e.g: <del>xxxabc</del><ins>defxxx</ins> + // -> <ins>def</ins>xxx<del>abc</del> + // Only extract an overlap if it is as big as the edit ahead or behind it. + pointer = 1; + while (pointer < diffs.length) { + if (diffs[pointer - 1].operation == Operation.delete && diffs[pointer].operation == Operation.insert) { + String deletion = diffs[pointer - 1].text; + String insertion = diffs[pointer].text; + int overlap_length1 = _diff_commonOverlap(deletion, insertion); + int overlap_length2 = _diff_commonOverlap(insertion, deletion); + if (overlap_length1 >= overlap_length2) { + if (overlap_length1 >= deletion.length / 2 || overlap_length1 >= insertion.length / 2) { + // Overlap found. + // Insert an equality and trim the surrounding edits. + diffs.insert(pointer, Diff(Operation.equal, insertion.substring(0, overlap_length1))); + diffs[pointer - 1].text = deletion.substring(0, deletion.length - overlap_length1); + diffs[pointer + 1].text = insertion.substring(overlap_length1); + pointer++; + } + } else { + if (overlap_length2 >= deletion.length / 2 || overlap_length2 >= insertion.length / 2) { + // Reverse overlap found. + // Insert an equality and swap and trim the surrounding edits. + diffs.insert(pointer, Diff(Operation.equal, deletion.substring(0, overlap_length2))); + diffs[pointer - 1] = Diff(Operation.insert, insertion.substring(0, insertion.length - overlap_length2)); + diffs[pointer + 1] = Diff(Operation.delete, deletion.substring(overlap_length2)); + pointer++; + } + } + pointer++; + } + pointer++; + } + } + + /// Look for single edits surrounded on both sides by equalities + /// which can be shifted sideways to align the edit to a word boundary. + /// e.g: The c<ins>at c</ins>ame. -> The <ins>cat </ins>came. + /// [diffs] is a List of Diff objects. + void _diff_cleanupSemanticLossless(List<Diff> diffs) { + /// Given two strings, compute a score representing whether the internal + /// boundary falls on logical boundaries. + /// Scores range from 6 (best) to 0 (worst). + /// Closure, but does not reference any external variables. + /// [one] the first string. + /// [two] the second string. + /// Returns the score. + int _diff_cleanupSemanticScore(String one, String two) { + if (one.isEmpty || two.isEmpty) { + // Edges are the best. + return 6; + } + + // Each port of this function behaves slightly differently due to + // subtle differences in each language's definition of things like + // 'whitespace'. Since this function's purpose is largely cosmetic, + // the choice has been made to use each language's native features + // rather than force total conformity. + String char1 = one[one.length - 1]; + String char2 = two[0]; + bool nonAlphaNumeric1 = char1.contains(nonAlphaNumericRegex_); + bool nonAlphaNumeric2 = char2.contains(nonAlphaNumericRegex_); + bool whitespace1 = nonAlphaNumeric1 && char1.contains(whitespaceRegex_); + bool whitespace2 = nonAlphaNumeric2 && char2.contains(whitespaceRegex_); + bool lineBreak1 = whitespace1 && char1.contains(linebreakRegex_); + bool lineBreak2 = whitespace2 && char2.contains(linebreakRegex_); + bool blankLine1 = lineBreak1 && one.contains(blanklineEndRegex_); + bool blankLine2 = lineBreak2 && two.contains(blanklineStartRegex_); + + if (blankLine1 || blankLine2) { + // Five points for blank lines. + return 5; + } else if (lineBreak1 || lineBreak2) { + // Four points for line breaks. + return 4; + } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) { + // Three points for end of sentences. + return 3; + } else if (whitespace1 || whitespace2) { + // Two points for whitespace. + return 2; + } else if (nonAlphaNumeric1 || nonAlphaNumeric2) { + // One point for non-alphanumeric. + return 1; + } + return 0; + } + + int pointer = 1; + // Intentionally ignore the first and last element (don't need checking). + while (pointer < diffs.length - 1) { + if (diffs[pointer - 1].operation == Operation.equal && diffs[pointer + 1].operation == Operation.equal) { + // This is a single edit surrounded by equalities. + String equality1 = diffs[pointer - 1].text; + String edit = diffs[pointer].text; + String equality2 = diffs[pointer + 1].text; + + // First, shift the edit as far left as possible. + int commonOffset = diff_commonSuffix(equality1, edit); + if (commonOffset != 0) { + String commonString = edit.substring(edit.length - commonOffset); + equality1 = equality1.substring(0, equality1.length - commonOffset); + edit = commonString + edit.substring(0, edit.length - commonOffset); + equality2 = commonString + equality2; + } + + // Second, step character by character right, looking for the best fit. + String bestEquality1 = equality1; + String bestEdit = edit; + String bestEquality2 = equality2; + int bestScore = _diff_cleanupSemanticScore(equality1, edit) + _diff_cleanupSemanticScore(edit, equality2); + while (edit.isNotEmpty && equality2.isNotEmpty && edit[0] == equality2[0]) { + equality1 = equality1 + edit[0]; + edit = edit.substring(1) + equality2[0]; + equality2 = equality2.substring(1); + int score = _diff_cleanupSemanticScore(equality1, edit) + _diff_cleanupSemanticScore(edit, equality2); + // The >= encourages trailing rather than leading whitespace on edits. + if (score >= bestScore) { + bestScore = score; + bestEquality1 = equality1; + bestEdit = edit; + bestEquality2 = equality2; + } + } + + if (diffs[pointer - 1].text != bestEquality1) { + // We have an improvement, save it back to the diff. + if (bestEquality1.isNotEmpty) { + diffs[pointer - 1].text = bestEquality1; + } else { + diffs.removeAt(pointer - 1); + pointer--; + } + diffs[pointer].text = bestEdit; + if (bestEquality2.isNotEmpty) { + diffs[pointer + 1].text = bestEquality2; + } else { + diffs.removeAt(pointer + 1); + pointer--; + } + } + } + pointer++; + } + } + + /// Hack to allow unit tests to call private method. Do not use. + void test_diff_cleanupSemanticLossless(List<Diff> diffs) { + _diff_cleanupSemanticLossless(diffs); + } + + // Define some regex patterns for matching boundaries. + RegExp nonAlphaNumericRegex_ = RegExp(r'[^a-zA-Z0-9]'); + RegExp whitespaceRegex_ = RegExp(r'\s'); + RegExp linebreakRegex_ = RegExp(r'[\r\n]'); + RegExp blanklineEndRegex_ = RegExp(r'\n\r?\n$'); + RegExp blanklineStartRegex_ = RegExp(r'^\r?\n\r?\n'); + + /// Reduce the number of edits by eliminating operationally trivial equalities. + /// [diffs] is a List of Diff objects. + void diff_cleanupEfficiency(List<Diff> diffs) { + bool changes = false; + // Stack of indices where equalities are found. + final equalities = <int>[]; + // Always equal to diffs[equalities.last()].text + String? lastEquality; + int pointer = 0; // Index of current position. + // Is there an insertion operation before the last equality. + bool pre_ins = false; + // Is there a deletion operation before the last equality. + bool pre_del = false; + // Is there an insertion operation after the last equality. + bool post_ins = false; + // Is there a deletion operation after the last equality. + bool post_del = false; + while (pointer < diffs.length) { + if (diffs[pointer].operation == Operation.equal) { + // Equality found. + if (diffs[pointer].text.length < Diff_EditCost && (post_ins || post_del)) { + // Candidate found. + equalities.add(pointer); + pre_ins = post_ins; + pre_del = post_del; + lastEquality = diffs[pointer].text; + } else { + // Not a candidate, and can never become one. + equalities.clear(); + lastEquality = null; + } + post_ins = post_del = false; + } else { + // An insertion or deletion. + if (diffs[pointer].operation == Operation.delete) { + post_del = true; + } else { + post_ins = true; + } + /* + * Five types to be split: + * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del> + * <ins>A</ins>X<ins>C</ins><del>D</del> + * <ins>A</ins><del>B</del>X<ins>C</ins> + * <ins>A</del>X<ins>C</ins><del>D</del> + * <ins>A</ins><del>B</del>X<del>C</del> + */ + if (lastEquality != null && ((pre_ins && pre_del && post_ins && post_del) || ((lastEquality.length < Diff_EditCost / 2) && ((pre_ins ? 1 : 0) + (pre_del ? 1 : 0) + (post_ins ? 1 : 0) + (post_del ? 1 : 0)) == 3))) { + // Duplicate record. + diffs.insert(equalities.last, Diff(Operation.delete, lastEquality)); + // Change second copy to insert. + diffs[equalities.last + 1].operation = Operation.insert; + equalities.removeLast(); // Throw away the equality we just deleted. + lastEquality = null; + if (pre_ins && pre_del) { + // No changes made which could affect previous entry, keep going. + post_ins = post_del = true; + equalities.clear(); + } else { + if (equalities.isNotEmpty) { + equalities.removeLast(); + } + pointer = equalities.isEmpty ? -1 : equalities.last; + post_ins = post_del = false; + } + changes = true; + } + } + pointer++; + } + + if (changes) { + diff_cleanupMerge(diffs); + } + } + + /// Reorder and merge like edit sections. Merge equalities. + /// Any edit section can move as long as it doesn't cross an equality. + /// [diffs] is a List of Diff objects. + void diff_cleanupMerge(List<Diff> diffs) { + diffs.add(Diff(Operation.equal, '')); // Add a dummy entry at the end. + int pointer = 0; + int count_delete = 0; + int count_insert = 0; + String text_delete = ''; + String text_insert = ''; + int commonlength; + while (pointer < diffs.length) { + switch (diffs[pointer].operation) { + case Operation.insert: + count_insert++; + text_insert += diffs[pointer].text; + pointer++; + case Operation.delete: + count_delete++; + text_delete += diffs[pointer].text; + pointer++; + case Operation.equal: + // Upon reaching an equality, check for prior redundancies. + if (count_delete + count_insert > 1) { + if (count_delete != 0 && count_insert != 0) { + // Factor out any common prefixies. + commonlength = diff_commonPrefix(text_insert, text_delete); + if (commonlength != 0) { + if ((pointer - count_delete - count_insert) > 0 && diffs[pointer - count_delete - count_insert - 1].operation == Operation.equal) { + final i = pointer - count_delete - count_insert - 1; + diffs[i].text = diffs[i].text + text_insert.substring(0, commonlength); + } else { + diffs.insert(0, Diff(Operation.equal, text_insert.substring(0, commonlength))); + pointer++; + } + text_insert = text_insert.substring(commonlength); + text_delete = text_delete.substring(commonlength); + } + + // Factor out any common suffixies. + commonlength = diff_commonSuffix(text_insert, text_delete); + if (commonlength != 0) { + diffs[pointer].text = text_insert.substring(text_insert.length - commonlength) + diffs[pointer].text; + text_insert = text_insert.substring(0, text_insert.length - commonlength); + text_delete = text_delete.substring(0, text_delete.length - commonlength); + } + } + // Delete the offending records and add the merged ones. + pointer -= count_delete + count_insert; + diffs.removeRange(pointer, pointer + count_delete + count_insert); + if (text_delete.isNotEmpty) { + diffs.insert(pointer, Diff(Operation.delete, text_delete)); + pointer++; + } + if (text_insert.isNotEmpty) { + diffs.insert(pointer, Diff(Operation.insert, text_insert)); + pointer++; + } + pointer++; + } else if (pointer != 0 && diffs[pointer - 1].operation == Operation.equal) { + // Merge this equality with the previous one. + diffs[pointer - 1].text = diffs[pointer - 1].text + diffs[pointer].text; + diffs.removeAt(pointer); + } else { + pointer++; + } + count_insert = 0; + count_delete = 0; + text_delete = ''; + text_insert = ''; + } + } + if (diffs.last.text.isEmpty) { + diffs.removeLast(); // Remove the dummy entry at the end. + } + + // Second pass: look for single edits surrounded on both sides by equalities + // which can be shifted sideways to eliminate an equality. + // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC + bool changes = false; + pointer = 1; + // Intentionally ignore the first and last element (don't need checking). + while (pointer < diffs.length - 1) { + if (diffs[pointer - 1].operation == Operation.equal && diffs[pointer + 1].operation == Operation.equal) { + // This is a single edit surrounded by equalities. + if (diffs[pointer].text.endsWith(diffs[pointer - 1].text)) { + // Shift the edit over the previous equality. + diffs[pointer].text = diffs[pointer - 1].text + diffs[pointer].text.substring(0, diffs[pointer].text.length - diffs[pointer - 1].text.length); + diffs[pointer + 1].text = diffs[pointer - 1].text + diffs[pointer + 1].text; + diffs.removeAt(pointer - 1); + changes = true; + } else if (diffs[pointer].text.startsWith(diffs[pointer + 1].text)) { + // Shift the edit over the next equality. + diffs[pointer - 1].text = diffs[pointer - 1].text + diffs[pointer + 1].text; + diffs[pointer].text = diffs[pointer].text.substring(diffs[pointer + 1].text.length) + diffs[pointer + 1].text; + diffs.removeAt(pointer + 1); + changes = true; + } + } + pointer++; + } + // If shifts were made, the diff needs reordering and another shift sweep. + if (changes) { + diff_cleanupMerge(diffs); + } + } + + /// loc is a location in text1, compute and return the equivalent location in + /// text2. + /// e.g. "The cat" vs "The big cat", 1->1, 5->8 + /// [diffs] is a List of Diff objects. + /// [loc] is the location within text1. + /// Returns the location within text2. + int diff_xIndex(List<Diff> diffs, int loc) { + int chars1 = 0; + int chars2 = 0; + int last_chars1 = 0; + int last_chars2 = 0; + Diff? lastDiff; + for (Diff aDiff in diffs) { + if (aDiff.operation != Operation.insert) { + // Equality or deletion. + chars1 += aDiff.text.length; + } + if (aDiff.operation != Operation.delete) { + // Equality or insertion. + chars2 += aDiff.text.length; + } + if (chars1 > loc) { + // Overshot the location. + lastDiff = aDiff; + break; + } + last_chars1 = chars1; + last_chars2 = chars2; + } + if (lastDiff != null && lastDiff.operation == Operation.delete) { + // The location was deleted. + return last_chars2; + } + // Add the remaining character length. + return last_chars2 + (loc - last_chars1); + } + + /// Convert a Diff list into a pretty HTML report. + /// [diffs] is a List of Diff objects. + /// Returns an HTML representation. + String diff_prettyHtml(List<Diff> diffs) { + final html = StringBuffer(); + for (Diff aDiff in diffs) { + String text = aDiff.text.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('\n', '&para;<br>'); + switch (aDiff.operation) { + case Operation.insert: + html.write('<ins style="background:#e6ffe6;">'); + html.write(text); + html.write('</ins>'); + case Operation.delete: + html.write('<del style="background:#ffe6e6;">'); + html.write(text); + html.write('</del>'); + case Operation.equal: + html.write('<span>'); + html.write(text); + html.write('</span>'); + } + } + return html.toString(); + } + + /// Compute and return the source text (all equalities and deletions). + /// [diffs] is a List of Diff objects. + /// Returns the source text. + String diff_text1(List<Diff> diffs) { + final text = StringBuffer(); + for (Diff aDiff in diffs) { + if (aDiff.operation != Operation.insert) { + text.write(aDiff.text); + } + } + return text.toString(); + } + + /// Compute and return the destination text (all equalities and insertions). + /// [diffs] is a List of Diff objects. + /// Returns the destination text. + String diff_text2(List<Diff> diffs) { + final text = StringBuffer(); + for (Diff aDiff in diffs) { + if (aDiff.operation != Operation.delete) { + text.write(aDiff.text); + } + } + return text.toString(); + } + + /// Compute the Levenshtein distance; the number of inserted, deleted or + /// substituted characters. + /// [diffs] is a List of Diff objects. + /// Returns the number of changes. + int diff_levenshtein(List<Diff> diffs) { + int levenshtein = 0; + int insertions = 0; + int deletions = 0; + for (Diff aDiff in diffs) { + switch (aDiff.operation) { + case Operation.insert: + insertions += aDiff.text.length; + case Operation.delete: + deletions += aDiff.text.length; + case Operation.equal: + // A deletion and an insertion is one substitution. + levenshtein += max(insertions, deletions); + insertions = 0; + deletions = 0; + } + } + levenshtein += max(insertions, deletions); + return levenshtein; + } + + /// Crush the diff into an encoded string which describes the operations + /// required to transform text1 into text2. + /// E.g. =3\t-2\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'. + /// Operations are tab-separated. Inserted text is escaped using %xx notation. + /// [diffs] is a List of Diff objects. + /// Returns the delta text. + String diff_toDelta(List<Diff> diffs) { + final text = StringBuffer(); + for (Diff aDiff in diffs) { + switch (aDiff.operation) { + case Operation.insert: + text.write('+'); + text.write(Uri.encodeFull(aDiff.text)); + text.write('\t'); + case Operation.delete: + text.write('-'); + text.write(aDiff.text.length); + text.write('\t'); + case Operation.equal: + text.write('='); + text.write(aDiff.text.length); + text.write('\t'); + } + } + String delta = text.toString(); + if (delta.isNotEmpty) { + // Strip off trailing tab character. + delta = delta.substring(0, delta.length - 1); + } + return delta.replaceAll('%20', ' '); + } + + /// Given the original text1, and an encoded string which describes the + /// operations required to transform text1 into text2, compute the full diff. + /// [text1] is the source string for the diff. + /// [delta] is the delta text. + /// Returns a List of Diff objects or null if invalid. + /// Throws ArgumentError if invalid input. + List<Diff> diff_fromDelta(String text1, String delta) { + final diffs = <Diff>[]; + int pointer = 0; // Cursor in text1 + final tokens = delta.split('\t'); + for (String token in tokens) { + if (token.isEmpty) { + // Blank tokens are ok (from a trailing \t). + continue; + } + // Each token begins with a one character parameter which specifies the + // operation of this token (delete, insert, equality). + String param = token.substring(1); + switch (token[0]) { + case '+': + // decode would change all "+" to " " + param = param.replaceAll('+', '%2B'); + try { + param = Uri.decodeFull(param); + } on ArgumentError { + // Malformed URI sequence. + throw ArgumentError('Illegal escape in diff_fromDelta: $param'); + } + diffs.add(Diff(Operation.insert, param)); + case '-': + // Fall through. + case '=': + int n; + try { + n = int.parse(param); + } on FormatException { + throw ArgumentError('Invalid number in diff_fromDelta: $param'); + } + if (n < 0) { + throw ArgumentError('Negative number in diff_fromDelta: $param'); + } + String text; + try { + text = text1.substring(pointer, pointer += n); + } on RangeError { + throw ArgumentError( + 'Delta length ($pointer)' + ' larger than source text length (${text1.length}).', + ); + } + if (token[0] == '=') { + diffs.add(Diff(Operation.equal, text)); + } else { + diffs.add(Diff(Operation.delete, text)); + } + default: + // Anything else is an error. + throw ArgumentError('Invalid diff operation in diff_fromDelta: ${token[0]}'); + } + } + if (pointer != text1.length) { + throw ArgumentError( + 'Delta length ($pointer)' + ' smaller than source text length (${text1.length}).', + ); + } + return diffs; + } + + // MATCH FUNCTIONS + + /// Locate the best instance of 'pattern' in 'text' near 'loc'. + /// Returns -1 if no match found. + /// [text] is the text to search. + /// [pattern] is the pattern to search for. + /// [loc] is the location to search around. + /// Returns the best match index or -1. + int match_main(String? text, String? pattern, int loc) { + // Check for null inputs. + if (text == null || pattern == null) { + throw ArgumentError('Null inputs. (match_main)'); + } + + loc = max(0, min(loc, text.length)); + if (text == pattern) { + // Shortcut (potentially not guaranteed by the algorithm) + return 0; + } else if (text.isEmpty) { + // Nothing to match. + return -1; + } else if (loc + pattern.length <= text.length && text.substring(loc, loc + pattern.length) == pattern) { + // Perfect match at the perfect spot! (Includes case of null pattern) + return loc; + } else { + // Do a fuzzy compare. + return _match_bitap(text, pattern, loc); + } + } + + /// Locate the best instance of 'pattern' in 'text' near 'loc' using the + /// Bitap algorithm. Returns -1 if no match found. + /// [text] is the the text to search. + /// [pattern] is the pattern to search for. + /// [loc] is the location to search around. + /// Returns the best match index or -1. + int _match_bitap(String text, String pattern, int loc) { + if (Match_MaxBits != 0 && pattern.length > Match_MaxBits) { + throw Exception('Pattern too long for this application.'); + } + // Initialise the alphabet. + Map<String, int> s = _match_alphabet(pattern); + + // Highest score beyond which we give up. + double score_threshold = Match_Threshold; + // Is there a nearby exact match? (speedup) + int best_loc = text.indexOf(pattern, loc); + if (best_loc != -1) { + score_threshold = min(_match_bitapScore(0, best_loc, loc, pattern), score_threshold); + // What about in the other direction? (speedup) + best_loc = text.lastIndexOf(pattern, loc + pattern.length); + if (best_loc != -1) { + score_threshold = min(_match_bitapScore(0, best_loc, loc, pattern), score_threshold); + } + } + + // Initialise the bit arrays. + final matchmask = 1 << (pattern.length - 1); + best_loc = -1; + + int bin_min, bin_mid; + int bin_max = pattern.length + text.length; + late List<int> last_rd; + for (int d = 0; d < pattern.length; d++) { + // Scan for the best match; each iteration allows for one more error. + // Run a binary search to determine how far from 'loc' we can stray at + // this error level. + bin_min = 0; + bin_mid = bin_max; + while (bin_min < bin_mid) { + if (_match_bitapScore(d, loc + bin_mid, loc, pattern) <= score_threshold) { + bin_min = bin_mid; + } else { + bin_max = bin_mid; + } + bin_mid = ((bin_max - bin_min) / 2 + bin_min).toInt(); + } + // Use the result from this iteration as the maximum for the next. + bin_max = bin_mid; + int start = max(1, loc - bin_mid + 1); + int finish = min(loc + bin_mid, text.length) + pattern.length; + + final rd = List<int>.filled(finish + 2, -1); + rd[finish + 1] = (1 << d) - 1; + for (int j = finish; j >= start; j--) { + int charMatch; + if (text.length <= j - 1 || !s.containsKey(text[j - 1])) { + // Out of range. + charMatch = 0; + } else { + charMatch = s[text[j - 1]]!; + } + if (d == 0) { + // First pass: exact match. + rd[j] = ((rd[j + 1] << 1) | 1) & charMatch; + } else { + // Subsequent passes: fuzzy match. + rd[j] = ((rd[j + 1] << 1) | 1) & charMatch | (((last_rd[j + 1] | last_rd[j]) << 1) | 1) | last_rd[j + 1]; + } + if ((rd[j] & matchmask) != 0) { + double score = _match_bitapScore(d, j - 1, loc, pattern); + // This match will almost certainly be better than any existing + // match. But check anyway. + if (score <= score_threshold) { + // Told you so. + score_threshold = score; + best_loc = j - 1; + if (best_loc > loc) { + // When passing loc, don't exceed our current distance from loc. + start = max(1, 2 * loc - best_loc); + } else { + // Already passed loc, downhill from here on in. + break; + } + } + } + } + if (_match_bitapScore(d + 1, loc, loc, pattern) > score_threshold) { + // No hope for a (better) match at greater error levels. + break; + } + last_rd = rd; + } + return best_loc; + } + + /// Hack to allow unit tests to call private method. Do not use. + int test_match_bitap(String text, String pattern, int loc) { + return _match_bitap(text, pattern, loc); + } + + /// Compute and return the score for a match with e errors and x location. + /// [e] is the number of errors in match. + /// [x] is the location of match. + /// [loc] is the expected location of match. + /// [pattern] is the pattern being sought. + /// Returns the overall score for match (0.0 = good, 1.0 = bad). + double _match_bitapScore(int e, int x, int loc, String pattern) { + final accuracy = e / pattern.length; + final proximity = (loc - x).abs(); + if (Match_Distance == 0) { + // Dodge divide by zero error. + return proximity == 0 ? accuracy : 1.0; + } + return accuracy + proximity / Match_Distance; + } + + /// Initialise the alphabet for the Bitap algorithm. + /// [pattern] is the the text to encode. + /// Returns a Map of character locations. + Map<String, int> _match_alphabet(String pattern) { + final s = HashMap<String, int>(); + for (int i = 0; i < pattern.length; i++) { + s[pattern[i]] = 0; + } + for (int i = 0; i < pattern.length; i++) { + s[pattern[i]] = s[pattern[i]]! | (1 << (pattern.length - i - 1)); + } + return s; + } + + /// Hack to allow unit tests to call private method. Do not use. + Map<String, int> test_match_alphabet(String pattern) { + return _match_alphabet(pattern); + } +} diff --git a/lib/utils/emoji_utils.dart b/lib/utils/emoji_utils.dart new file mode 100644 index 0000000..d3b06d4 --- /dev/null +++ b/lib/utils/emoji_utils.dart @@ -0,0 +1,22 @@ +import 'package:aves/ref/unicode.dart'; + +class EmojiUtils { + static const _countryCodeToFlagDiff = UniCodes.regionalIndicatorSymbolLetterA - UniCodes.latinCapitalLetterA; + static const _stateCodeToFlagDiff = UniCodes.tagLatinSmallLetterA - UniCodes.latinCapitalLetterA; + static const _subFlagStart = UniCodes.wavingBlackFlag; + static const _subFlagEnd = UniCodes.cancelTag; + + static String? countryCodeToFlag(String? code) { + if (code == null || code.length != 2) return null; + return String.fromCharCodes(code.toUpperCase().codeUnits.map((letter) => letter += _countryCodeToFlagDiff)); + } + + static String? stateCodeToFlag(String? code) { + if (code == null) return null; + return String.fromCharCodes([ + _subFlagStart, + ...code.toUpperCase().codeUnits.map((letter) => letter += _stateCodeToFlagDiff), + _subFlagEnd, + ]); + } +} diff --git a/lib/utils/file_utils.dart b/lib/utils/file_utils.dart new file mode 100644 index 0000000..4f3f0b7 --- /dev/null +++ b/lib/utils/file_utils.dart @@ -0,0 +1,16 @@ +import 'package:intl/intl.dart'; + +const kilo = 1024; +const mega = kilo * kilo; +const giga = mega * kilo; +const tera = giga * kilo; + +String formatFileSize(String locale, int size, {int round = 2}) { + if (size < kilo) return '$size B'; + + final compactFormatter = NumberFormat('0${round > 0 ? '.${'0' * round}' : ''}', locale); + if (size < mega) return '${compactFormatter.format(size / kilo)} KB'; + if (size < giga) return '${compactFormatter.format(size / mega)} MB'; + if (size < tera) return '${compactFormatter.format(size / giga)} GB'; + return '${compactFormatter.format(size / tera)} TB'; +} diff --git a/lib/utils/math_utils.dart b/lib/utils/math_utils.dart new file mode 100644 index 0000000..5a57506 --- /dev/null +++ b/lib/utils/math_utils.dart @@ -0,0 +1,49 @@ +import 'dart:math'; +import 'dart:ui'; + +int highestPowerOf2(num x) => x < 1 ? 0 : pow(2, (log(x) / ln2).floor()).toInt(); + +num smallestPowerOf2(num x, {bool allowNegativePower = false}) { + if ((x < 1 && !allowNegativePower) || x <= 0) return 1; + return pow(2, (log(x) / ln2).ceil()); +} + +double roundToPrecision(final double value, {required final int decimals}) => (value * pow(10, decimals)).round() / pow(10, decimals); + +// cf https://en.wikipedia.org/wiki/Intersection_(geometry)#Two_line_segments +Offset? segmentIntersection((Offset, Offset) s1, (Offset, Offset) s2) { + final x1 = s1.$1.dx; + final y1 = s1.$1.dy; + final x2 = s1.$2.dx; + final y2 = s1.$2.dy; + + final x3 = s2.$1.dx; + final y3 = s2.$1.dy; + final x4 = s2.$2.dx; + final y4 = s2.$2.dy; + + final a1 = x2 - x1; + final b1 = -(x4 - x3); + final c1 = x3 - x1; + final a2 = y2 - y1; + final b2 = -(y4 - y3); + final c2 = y3 - y1; + + final denom = a1 * b2 - a2 * b1; + if (denom == 0) { + // lines are parallel + return null; + } + + final s0 = (c1 * b2 - c2 * b1) / denom; + final t0 = (a1 * c2 - a2 * c1) / denom; + + if (!(0 <= s0 && s0 <= 1 && 0 <= t0 && t0 <= 1)) { + // segments do not intersect + return null; + } + + final x0 = x1 + s0 * (x2 - x1); + final y0 = y1 + s0 * (y2 - y1); + return Offset(x0, y0); +} diff --git a/lib/utils/mime_utils.dart b/lib/utils/mime_utils.dart new file mode 100644 index 0000000..577684d --- /dev/null +++ b/lib/utils/mime_utils.dart @@ -0,0 +1,28 @@ +import 'package:aves/ref/mime_types.dart'; + +class MimeUtils { + static String displayType(String mime) { + switch (mime) { + case MimeTypes.art: + return 'ART'; + case MimeTypes.ico: + case MimeTypes.icoX: + return 'ICO'; + case MimeTypes.mov: + case MimeTypes.movX: + return 'MOV'; + case MimeTypes.psdVnd: + case MimeTypes.psdX: + return 'PSD'; + default: + final patterns = [ + RegExp('.*/'), // remove type, keep subtype + RegExp('(X-|VND.(WAP.)?)'), // noisy prefixes + '+XML', // noisy suffix + ]; + mime = mime.toUpperCase(); + patterns.forEach((pattern) => mime = mime.replaceFirst(pattern, '')); + return mime; + } + } +} diff --git a/lib/utils/string_utils.dart b/lib/utils/string_utils.dart new file mode 100644 index 0000000..5199285 --- /dev/null +++ b/lib/utils/string_utils.dart @@ -0,0 +1,12 @@ +extension ExtraString on String { + static final _sentenceCaseStep1 = RegExp(r'([A-Z][a-z]|\[)'); + static final _sentenceCaseStep2 = RegExp(r'_([a-z])'); + static final _sentenceCaseStep3 = RegExp(r'([a-z])([A-Z])'); + + String toSentenceCase() { + var s = replaceFirstMapped(RegExp('.'), (m) => m.group(0)!.toUpperCase()); + s = s.replaceAllMapped(_sentenceCaseStep1, (m) => ' ${m.group(1)}'); + s = s.replaceAllMapped(_sentenceCaseStep2, (m) => m.group(0)!.toUpperCase()).replaceAll('_', ' '); + return s.replaceAllMapped(_sentenceCaseStep3, (m) => '${m.group(1)} ${m.group(2)}').trim(); + } +} diff --git a/lib/utils/time_utils.dart b/lib/utils/time_utils.dart new file mode 100644 index 0000000..55c305e --- /dev/null +++ b/lib/utils/time_utils.dart @@ -0,0 +1,152 @@ +import 'package:flutter/foundation.dart'; + +const hoursInDay = 24; +const minutesInHour = 60; +const secondsInMinute = 60; + +extension ExtraDateTime on DateTime { + bool isAtSameYearAs(DateTime? other) => year == other?.year; + + bool isAtSameMonthAs(DateTime? other) => isAtSameYearAs(other) && month == other?.month; + + bool isAtSameDayAs(DateTime? other) => isAtSameMonthAs(other) && day == other?.day; + + bool get isToday => isAtSameDayAs(DateTime.now()); + + bool get isYesterday => isAtSameDayAs(DateTime.now().subtract(const Duration(days: 1))); + + bool get isThisMonth => isAtSameMonthAs(DateTime.now()); + + bool get isThisYear => isAtSameYearAs(DateTime.now()); + + DateTime get date => DateTime(year, month, day); + + DateTime addMonths(int months) => DateTime(year, month + months, day, hour, minute, second, millisecond, microsecond); + + DateTime addDays(int days) => DateTime(year, month, day + days, hour, minute, second, millisecond, microsecond); +} + +extension ExtraDuration on Duration { + // using `Duration.inDays` may yield surprising results when crossing DST boundaries + // because a day will not have 24 hours, so we use the following approximation instead + int get inHumanDays => (inMicroseconds / Duration.microsecondsPerDay).round(); +} + +final epoch = DateTime.fromMillisecondsSinceEpoch(0, isUtc: true); + +// Overflowing timestamps that are supposed to be in milliseconds +// will be retried after stripping extra digits. +const _millisMaxDigits = 13; // 13 digits can go up to 2286/11/20 + +DateTime? dateTimeFromMillis(int? millis, {bool isUtc = false}) { + // exclude `0` and `-1` as they are both used as default values + if (millis == null || millis == 0 || millis == -1) return null; + try { + return DateTime.fromMillisecondsSinceEpoch(millis, isUtc: isUtc); + } catch (error) { + // `DateTime`s can represent time values that are at a distance of at most 100,000,000 + // days from epoch (1970-01-01 UTC): -271821-04-20 to 275760-09-13. + debugPrint('failed to build DateTime from timestamp in millis=$millis'); + } + final digits = '$millis'.length; + if (digits > _millisMaxDigits) { + millis = int.tryParse('$millis'.substring(0, _millisMaxDigits)); + return dateTimeFromMillis(millis, isUtc: isUtc); + } + return null; +} + +final _unixStampMillisPattern = RegExp(r'\d{13}'); +final _unixStampSecPattern = RegExp(r'\d{10}'); +final _dateYMD8Hms6Sub3Pattern = RegExp(r'(\d{8})([_\s-](\d{6})([_\s-](\d{3}))?)?'); +final _dateY4M2D2H2m2s2Sub3Pattern = RegExp(r'(\d{4})-(\d{1,2})-(\d{1,2})[_\s-](\d{1,2})[.-](\d{1,2})[.-](\d{1,2})([.-](\d{1,3})?)?'); +final _dateY4M2D2Hms6Pattern = RegExp(r'(\d{4})-(\d{1,2})-(\d{1,2})[_\s-](\d{6})'); + +DateTime? parseUnknownDateFormat(String? s) { + if (s == null) return null; + + var match = _unixStampMillisPattern.firstMatch(s); + if (match != null) { + final stampMillisString = match.group(0); + if (stampMillisString != null) { + final stampMillis = int.tryParse(stampMillisString); + if (stampMillis != null) { + return dateTimeFromMillis(stampMillis, isUtc: false); + } + } + } + + match = _unixStampSecPattern.firstMatch(s); + if (match != null) { + final stampSecString = match.group(0); + if (stampSecString != null) { + final stampSec = int.tryParse(stampSecString); + if (stampSec != null) { + return dateTimeFromMillis(stampSec * 1000, isUtc: false); + } + } + } + + match = _dateYMD8Hms6Sub3Pattern.firstMatch(s); + if (match != null) { + final dateString = match.group(1); + final timeString = match.group(3); + final millisString = match.group(5); + + if (dateString != null) { + final year = int.tryParse(dateString.substring(0, 4)); + final month = int.tryParse(dateString.substring(4, 6)); + final day = int.tryParse(dateString.substring(6, 8)); + + if (year != null && month != null && day != null) { + var hour = 0, minute = 0, second = 0, millis = 0; + if (timeString != null) { + hour = int.tryParse(timeString.substring(0, 2)) ?? 0; + minute = int.tryParse(timeString.substring(2, 4)) ?? 0; + second = int.tryParse(timeString.substring(4, 6)) ?? 0; + + if (millisString != null) { + millis = int.tryParse(millisString) ?? 0; + } + } + return DateTime(year, month, day, hour, minute, second, millis); + } + } + } + + match = _dateY4M2D2H2m2s2Sub3Pattern.firstMatch(s); + if (match != null) { + final year = int.tryParse(match.group(1)!); + final month = int.tryParse(match.group(2)!); + final day = int.tryParse(match.group(3)!); + final hour = int.tryParse(match.group(4)!); + final minute = int.tryParse(match.group(5)!); + final second = int.tryParse(match.group(6)!); + final millis = match.groupCount >= 8 ? int.tryParse(match.group(8) ?? '0') : 0; + + if (year != null && month != null && day != null && hour != null && minute != null && second != null && millis != null) { + return DateTime(year, month, day, hour, minute, second, millis); + } + } + + match = _dateY4M2D2Hms6Pattern.firstMatch(s); + if (match != null) { + final year = int.tryParse(match.group(1)!); + final month = int.tryParse(match.group(2)!); + final day = int.tryParse(match.group(3)!); + final timeString = match.group(4); + + var hour = 0, minute = 0, second = 0; + if (timeString != null) { + hour = int.tryParse(timeString.substring(0, 2)) ?? 0; + minute = int.tryParse(timeString.substring(2, 4)) ?? 0; + second = int.tryParse(timeString.substring(4, 6)) ?? 0; + } + + if (year != null && month != null && day != null) { + return DateTime(year, month, day, hour, minute, second); + } + } + + return null; +} diff --git a/lib/utils/xmp_utils.dart b/lib/utils/xmp_utils.dart new file mode 100644 index 0000000..c643798 --- /dev/null +++ b/lib/utils/xmp_utils.dart @@ -0,0 +1,305 @@ +import 'package:aves/ref/locales.dart'; +import 'package:aves/ref/metadata/xmp.dart'; +import 'package:intl/intl.dart'; +import 'package:xml/xml.dart'; + +class XMP { + static const xmlnsPrefix = 'xmlns'; + static const propNamespaceSeparator = ':'; + static const structFieldSeparator = '/'; + + static final _defaultPrefixes = { + XmpNamespaces.gContainer: 'Container', + XmpNamespaces.dc: 'dc', + XmpNamespaces.gCamera: 'GCamera', + XmpNamespaces.microsoftPhoto: 'MicrosoftPhoto', + XmpNamespaces.rdf: 'rdf', + XmpNamespaces.x: 'x', + XmpNamespaces.xmp: 'xmp', + XmpNamespaces.xmpGImg: 'xmpGImg', + XmpNamespaces.xmpNote: 'xmpNote', + }; + + static String prefixOf(String ns) => _defaultPrefixes[ns] ?? ''; + + static const nsRdf = XmpNamespaces.rdf; + static const nsX = XmpNamespaces.x; + static const nsXmp = XmpNamespaces.xmp; + + // for `rdf:Description` node only + static bool _hasMeaningfulChildren(XmlNode node) => node.children.any((v) => v.nodeType != XmlNodeType.TEXT || v.innerText.trim().isNotEmpty); + + // for `rdf:Description` node only + static bool _hasMeaningfulAttributes(XmlNode description) { + final hasMeaningfulAttributes = description.attributes.any((v) { + switch (v.name.local) { + case XmpAttributes.rdfAbout: + case XmpAttributes.xmpMetadataDate: + case XmpAttributes.xmpModifyDate: + return false; + default: + switch (v.name.prefix) { + case xmlnsPrefix: + return false; + default: + // if the attribute got defined with the prefix as part of the name, + // the prefix is not recognized as such, so we check the full name + return !v.name.qualified.startsWith(xmlnsPrefix); + } + } + }); + return hasMeaningfulAttributes; + } + + // returns time zone designator, formatted as `Z` or `+hh:mm` or `-hh:mm` + // as of intl v0.17.0, formatting time zone offset is not implemented + static String _xmpTimeZoneDesignator(DateTime date) { + final offsetMinutes = date.timeZoneOffset.inMinutes; + final abs = offsetMinutes.abs(); + final h = abs ~/ Duration.minutesPerHour; + final m = abs % Duration.minutesPerHour; + return '${offsetMinutes.isNegative ? '-' : '+'}${h.toString().padLeft(2, '0')}:${m.toString().padLeft(2, '0')}'; + } + + static String toXmpDate(DateTime date) => '${DateFormat('yyyy-MM-ddTHH:mm:ss', asciiLocale).format(date)}${_xmpTimeZoneDesignator(date)}'; + + static String? getString( + List<XmlNode> nodes, + String name, { + required String namespace, + }) { + for (final node in nodes) { + final attribute = node.getAttribute(name, namespace: namespace); + if (attribute != null) return attribute; + + final element = node.getElement(name, namespace: namespace); + if (element != null) return element.innerText; + } + return null; + } + + static void _addNamespaces(XmlNode node, Map<String, String> namespaces) => namespaces.forEach((uri, prefix) => node.setAttribute('$xmlnsPrefix:$prefix', uri)); + + // remove elements and attributes + static bool removeElements(List<XmlNode> nodes, String name, String namespace) { + var removed = false; + nodes.forEach((node) { + final elements = node.findElements(name, namespace: namespace).toSet(); + if (elements.isNotEmpty) { + elements.forEach(node.children.remove); + removed = true; + } + + if (node.getAttributeNode(name, namespace: namespace) != null) { + node.removeAttribute(name, namespace: namespace); + removed = true; + } + }); + return removed; + } + + // remove attribute/element from all nodes, and set attribute with new value, if any, in the first node + static bool setAttribute( + List<XmlNode> nodes, + String name, + String? value, { + required String namespace, + required XmpEditStrategy strat, + }) { + final removed = removeElements(nodes, name, namespace); + + if (value == null) return removed; + + bool modified = removed; + if (strat == XmpEditStrategy.always || (strat == XmpEditStrategy.updateIfPresent && removed)) { + final node = nodes.first; + _addNamespaces(node, {namespace: prefixOf(namespace)}); + + // use qualified name, otherwise the namespace prefix is not added + final qualifiedName = '${prefixOf(namespace)}$propNamespaceSeparator$name'; + node.setAttribute(qualifiedName, value); + modified = true; + } + + return modified; + } + + // remove attribute/element from all nodes, and create element with new value, if any, in the first node + static void setElement( + List<XmlNode> nodes, + String name, + String? value, { + required String namespace, + required XmpEditStrategy strat, + }) { + final removed = removeElements(nodes, name, namespace); + + if (value == null) return; + + if (strat == XmpEditStrategy.always || (strat == XmpEditStrategy.updateIfPresent && removed)) { + final node = nodes.first; + _addNamespaces(node, {namespace: prefixOf(namespace)}); + + final builder = XmlBuilder(); + builder.namespace(namespace, prefixOf(namespace)); + builder.element( + name, + namespace: namespace, + nest: () { + builder.text(value); + }, + ); + node.children.add(builder.buildFragment()); + } + } + + // remove bag from all nodes, and create bag with new values, if any, in the first node + static bool setStringBag( + List<XmlNode> nodes, + String name, + Set<String> values, { + required String namespace, + required XmpEditStrategy strat, + }) { + // remove existing + final removed = removeElements(nodes, name, namespace); + + if (values.isEmpty) return removed; + + bool modified = removed; + if (strat == XmpEditStrategy.always || (strat == XmpEditStrategy.updateIfPresent && removed)) { + final node = nodes.first; + _addNamespaces(node, {namespace: prefixOf(namespace)}); + + // add new bag + final rootBuilder = XmlBuilder(); + rootBuilder.namespace(namespace, prefixOf(namespace)); + rootBuilder.element(name, namespace: namespace); + node.children.add(rootBuilder.buildFragment()); + + final bagBuilder = XmlBuilder(); + bagBuilder.namespace(nsRdf, prefixOf(nsRdf)); + bagBuilder.element( + 'Bag', + namespace: nsRdf, + nest: () { + values.forEach((v) { + bagBuilder.element('li', namespace: nsRdf, nest: v); + }); + }, + ); + node.children.last.children.add(bagBuilder.buildFragment()); + modified = true; + } + + return modified; + } + + static Future<String?> edit( + String? xmpString, + String toolkit, + bool Function(List<XmlNode> descriptions) apply, { + DateTime? modifyDate, + }) async { + XmlDocument? xmpDoc; + if (xmpString != null) { + xmpDoc = XmlDocument.parse(xmpString); + } + if (xmpDoc == null) { + final builder = XmlBuilder(); + builder.namespace(nsX, prefixOf(nsX)); + builder.element( + XmpElements.xXmpmeta, + namespace: nsX, + namespaces: { + nsX: prefixOf(nsX), + }, + attributes: { + '${prefixOf(nsX)}$propNamespaceSeparator${XmpAttributes.xXmptk}': toolkit, + }, + ); + xmpDoc = builder.buildDocument(); + } + + final root = xmpDoc.rootElement; + XmlNode? rdf = root.getElement(XmpElements.rdfRoot, namespace: nsRdf); + if (rdf == null) { + final builder = XmlBuilder(); + builder.namespace(nsRdf, prefixOf(nsRdf)); + builder.element( + XmpElements.rdfRoot, + namespace: nsRdf, + namespaces: { + nsRdf: prefixOf(nsRdf), + }, + ); + // get element because doc fragment cannot be used to edit + root.children.add(builder.buildFragment()); + rdf = root.getElement(XmpElements.rdfRoot, namespace: nsRdf)!; + } + + // content can be split in multiple `rdf:Description` elements + List<XmlNode> descriptions = rdf.children.where((node) { + return node is XmlElement && node.name.local == XmpElements.rdfDescription && node.name.namespaceUri == nsRdf; + }).toList(); + + if (descriptions.isEmpty) { + final builder = XmlBuilder(); + builder.namespace(nsRdf, prefixOf(nsRdf)); + builder.element( + XmpElements.rdfDescription, + namespace: nsRdf, + attributes: { + '${prefixOf(nsRdf)}$propNamespaceSeparator${XmpAttributes.rdfAbout}': '', + }, + ); + rdf.children.add(builder.buildFragment()); + // get element because doc fragment cannot be used to edit + descriptions.add(rdf.getElement(XmpElements.rdfDescription, namespace: nsRdf)!); + } + final modified = apply(descriptions); + + // clean description nodes with no children + descriptions.where((v) => !_hasMeaningfulChildren(v)).forEach((v) => v.children.clear()); + + // remove superfluous description nodes + rdf.children.removeWhere((v) => !_hasMeaningfulChildren(v) && !_hasMeaningfulAttributes(v)); + + if (rdf.children.isNotEmpty) { + if (modified) { + _addNamespaces(descriptions.first, {nsXmp: prefixOf(nsXmp)}); + final xmpDate = toXmpDate(modifyDate ?? DateTime.now()); + setAttribute(descriptions, XmpAttributes.xmpMetadataDate, xmpDate, namespace: nsXmp, strat: XmpEditStrategy.always); + setAttribute(descriptions, XmpAttributes.xmpModifyDate, xmpDate, namespace: nsXmp, strat: XmpEditStrategy.always); + } + } else { + // clear XMP if there are no attributes or elements worth preserving + xmpDoc = null; + } + + return xmpDoc?.toXmlString(); + } + + static String? toMsPhotoRating(int? rating) { + if (rating == null) return null; + switch (rating) { + case 5: + return '99'; + case 4: + return '75'; + case 3: + return '50'; + case 2: + return '25'; + case 1: + return '1'; + case 0: + return null; + case -1: + return '-1'; + } + return null; + } +} + +enum XmpEditStrategy { always, updateIfPresent } diff --git a/lib/view/src/actions/chip.dart b/lib/view/src/actions/chip.dart new file mode 100644 index 0000000..5f8470e --- /dev/null +++ b/lib/view/src/actions/chip.dart @@ -0,0 +1,41 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraChipActionView on ChipAction { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + ChipAction.goToAlbumPage => l10n.chipActionGoToAlbumPage, + ChipAction.goToCountryPage => l10n.chipActionGoToCountryPage, + ChipAction.goToPlacePage => l10n.chipActionGoToPlacePage, + ChipAction.goToTagPage => l10n.chipActionGoToTagPage, + ChipAction.goToExplorerPage => l10n.chipActionGoToExplorerPage, + ChipAction.ratingOrGreater || ChipAction.ratingOrLower => + // different data depending on state + toString(), + ChipAction.decompose => l10n.chipActionDecompose, + ChipAction.reverse => + // different data depending on state + l10n.chipActionFilterOut, + ChipAction.hide => l10n.chipActionHide, + ChipAction.lockVault => l10n.chipActionLock, + }; + } + + Widget getIcon() => Icon(_getIconData()); + + IconData _getIconData() => switch (this) { + ChipAction.goToAlbumPage => AIcons.album, + ChipAction.goToCountryPage => AIcons.country, + ChipAction.goToPlacePage => AIcons.place, + ChipAction.goToTagPage => AIcons.tag, + ChipAction.goToExplorerPage => AIcons.explorer, + ChipAction.ratingOrGreater || ChipAction.ratingOrLower => AIcons.rating, + ChipAction.decompose => AIcons.split, + ChipAction.reverse => AIcons.reverse, + ChipAction.hide => AIcons.hide, + ChipAction.lockVault => AIcons.vaultLock, + }; +} diff --git a/lib/view/src/actions/chip_set.dart b/lib/view/src/actions/chip_set.dart new file mode 100644 index 0000000..1c104b4 --- /dev/null +++ b/lib/view/src/actions/chip_set.dart @@ -0,0 +1,81 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +extension ExtraChipSetActionView on ChipSetAction { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + // general + ChipSetAction.configureView => l10n.menuActionConfigureView, + ChipSetAction.select => l10n.menuActionSelect, + ChipSetAction.selectAll => l10n.menuActionSelectAll, + ChipSetAction.selectNone => l10n.menuActionSelectNone, + // browsing + ChipSetAction.search => MaterialLocalizations.of(context).searchFieldLabel, + ChipSetAction.toggleTitleSearch => + // different data depending on toggle state + l10n.collectionActionShowTitleSearch, + ChipSetAction.createGroup => l10n.chipActionCreateGroup, + ChipSetAction.createAlbum => l10n.chipActionCreateAlbum, + ChipSetAction.createVault => l10n.chipActionCreateVault, + // browsing or selecting + ChipSetAction.map => l10n.menuActionMap, + ChipSetAction.slideshow => l10n.menuActionSlideshow, + ChipSetAction.stats => l10n.menuActionStats, + // selecting (single/multiple filters) + ChipSetAction.delete => l10n.chipActionDelete, + ChipSetAction.remove => l10n.chipActionRemove, + ChipSetAction.hide => l10n.chipActionHide, + ChipSetAction.pin => l10n.chipActionPin, + ChipSetAction.unpin => l10n.chipActionUnpin, + ChipSetAction.group => l10n.chipActionGroup, + ChipSetAction.lockVault => l10n.chipActionLock, + ChipSetAction.showCountryStates => l10n.chipActionShowCountryStates, + ChipSetAction.showCollection => l10n.chipActionShowCollection, + // selecting (single filter) + ChipSetAction.rename => l10n.chipActionRename, + ChipSetAction.setCover => l10n.chipActionSetCover, + ChipSetAction.configureVault => l10n.chipActionConfigureVault, + }; + } + + Widget getIcon() => Icon(_getIconData()); + + IconData _getIconData() { + return switch (this) { + // general + ChipSetAction.configureView => AIcons.view, + ChipSetAction.select => AIcons.select, + ChipSetAction.selectAll => AIcons.selected, + ChipSetAction.selectNone => AIcons.unselected, + // browsing + ChipSetAction.search => AIcons.search, + ChipSetAction.toggleTitleSearch => + // different data depending on toggle state + AIcons.filter, + ChipSetAction.createGroup => AIcons.add, + ChipSetAction.createAlbum => AIcons.add, + ChipSetAction.createVault => AIcons.vaultAdd, + // browsing or selecting + ChipSetAction.map => AIcons.map, + ChipSetAction.slideshow => AIcons.slideshow, + ChipSetAction.stats => AIcons.stats, + // selecting (single/multiple filters) + ChipSetAction.delete => AIcons.delete, + ChipSetAction.remove => AIcons.remove, + ChipSetAction.hide => AIcons.hide, + ChipSetAction.pin => AIcons.pin, + ChipSetAction.unpin => AIcons.unpin, + ChipSetAction.group => AIcons.group, + ChipSetAction.lockVault => AIcons.vaultLock, + ChipSetAction.showCountryStates => AIcons.state, + ChipSetAction.showCollection => AIcons.allCollection, + // selecting (single filter) + ChipSetAction.rename => AIcons.rename, + ChipSetAction.setCover => AIcons.setCover, + ChipSetAction.configureVault => AIcons.vaultConfigure, + }; + } +} diff --git a/lib/view/src/actions/entry.dart b/lib/view/src/actions/entry.dart new file mode 100644 index 0000000..79c84f7 --- /dev/null +++ b/lib/view/src/actions/entry.dart @@ -0,0 +1,152 @@ +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraEntryActionView on EntryAction { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + EntryAction.info => l10n.entryActionInfo, + EntryAction.addShortcut => l10n.collectionActionAddShortcut, + EntryAction.copyToClipboard => l10n.entryActionCopyToClipboard, + EntryAction.delete => l10n.entryActionDelete, + EntryAction.restore => l10n.entryActionRestore, + EntryAction.convert => l10n.entryActionConvert, + EntryAction.print => l10n.entryActionPrint, + EntryAction.rename => l10n.entryActionRename, + EntryAction.copy => l10n.collectionActionCopy, + EntryAction.move => l10n.collectionActionMove, + EntryAction.share => l10n.entryActionShare, + EntryAction.toggleFavourite => + // different data depending on toggle state + l10n.entryActionAddFavourite, + // raster + EntryAction.rotateCCW => l10n.entryActionRotateCCW, + EntryAction.rotateCW => l10n.entryActionRotateCW, + EntryAction.flip => l10n.entryActionFlip, + // vector + EntryAction.viewSource => l10n.entryActionViewSource, + // video + EntryAction.lockViewer => l10n.viewerActionLock, + EntryAction.videoCaptureFrame => l10n.videoActionCaptureFrame, + EntryAction.videoToggleMute => + // different data depending on toggle state + l10n.videoActionMute, + EntryAction.videoSelectStreams => l10n.videoActionSelectStreams, + EntryAction.videoSetSpeed => l10n.videoActionSetSpeed, + EntryAction.videoABRepeat => l10n.videoActionABRepeat, + EntryAction.videoSettings => l10n.viewerActionSettings, + EntryAction.videoTogglePlay => + // different data depending on toggle state + l10n.videoActionPlay, + EntryAction.videoReplay10 => l10n.videoActionReplay10, + EntryAction.videoSkip10 => l10n.videoActionSkip10, + EntryAction.videoShowPreviousFrame => l10n.videoActionShowPreviousFrame, + EntryAction.videoShowNextFrame => l10n.videoActionShowNextFrame, + // external + EntryAction.edit => l10n.entryActionEdit, + EntryAction.open => l10n.entryActionOpen, + EntryAction.openVideoPlayer => l10n.videoControlsPlayOutside, + EntryAction.openMap => l10n.entryActionOpenMap, + EntryAction.setAs => l10n.entryActionSetAs, + EntryAction.cast => l10n.entryActionCast, + // platform + EntryAction.rotateScreen => l10n.entryActionRotateScreen, + // metadata + EntryAction.editDate => l10n.entryInfoActionEditDate, + EntryAction.editLocation => l10n.entryInfoActionEditLocation, + EntryAction.editTitleDescription => l10n.entryInfoActionEditTitleDescription, + EntryAction.editRating => l10n.entryInfoActionEditRating, + EntryAction.editTags => l10n.entryInfoActionEditTags, + EntryAction.removeMetadata => l10n.entryInfoActionRemoveMetadata, + EntryAction.exportMetadata => l10n.entryInfoActionExportMetadata, + // metadata / GeoTIFF + EntryAction.showGeoTiffOnMap => l10n.entryActionShowGeoTiffOnMap, + // metadata / motion photo + EntryAction.convertMotionPhotoToStillImage => l10n.entryActionConvertMotionPhotoToStillImage, + EntryAction.viewMotionPhotoVideo => l10n.entryActionViewMotionPhotoVideo, + // debug + EntryAction.debug => 'Debug', + }; + } + + Widget getIcon() { + final child = Icon(getIconData()); + return switch (this) { + EntryAction.debug => ShaderMask( + shaderCallback: AvesColorsData.debugGradient.createShader, + blendMode: BlendMode.srcIn, + child: child, + ), + _ => child, + }; + } + + IconData getIconData() { + return switch (this) { + EntryAction.info => AIcons.info, + EntryAction.addShortcut => AIcons.addShortcut, + EntryAction.copyToClipboard => AIcons.clipboard, + EntryAction.delete => AIcons.delete, + EntryAction.restore => AIcons.restore, + EntryAction.convert => AIcons.convert, + EntryAction.print => AIcons.print, + EntryAction.rename => AIcons.rename, + EntryAction.copy => AIcons.copy, + EntryAction.move => AIcons.move, + EntryAction.share => AIcons.share, + EntryAction.toggleFavourite => + // different data depending on toggle state + AIcons.favourite, + // raster + EntryAction.rotateCCW => AIcons.rotateLeft, + EntryAction.rotateCW => AIcons.rotateRight, + EntryAction.flip => AIcons.flip, + // vector + EntryAction.viewSource => AIcons.vector, + // video + EntryAction.lockViewer => AIcons.viewerLock, + EntryAction.videoCaptureFrame => AIcons.captureFrame, + EntryAction.videoToggleMute => + // different data depending on toggle state + AIcons.mute, + EntryAction.videoSelectStreams => AIcons.selectStreams, + EntryAction.videoSetSpeed => AIcons.setSpeed, + EntryAction.videoABRepeat => AIcons.repeat, + EntryAction.videoSettings => AIcons.videoSettings, + EntryAction.videoTogglePlay => + // different data depending on toggle state + AIcons.play, + EntryAction.videoReplay10 => AIcons.replay10, + EntryAction.videoSkip10 => AIcons.skip10, + EntryAction.videoShowPreviousFrame => AIcons.previousFrame, + EntryAction.videoShowNextFrame => AIcons.nextFrame, + // external + EntryAction.edit => AIcons.edit, + EntryAction.open => AIcons.openOutside, + EntryAction.openVideoPlayer => AIcons.openOutside, + EntryAction.openMap => AIcons.map, + EntryAction.setAs => AIcons.setAs, + EntryAction.cast => AIcons.cast, + // platform + EntryAction.rotateScreen => AIcons.rotateScreen, + // metadata + EntryAction.editDate => AIcons.date, + EntryAction.editLocation => AIcons.location, + EntryAction.editTitleDescription => AIcons.description, + EntryAction.editRating => AIcons.rating, + EntryAction.editTags => AIcons.tag, + EntryAction.removeMetadata => AIcons.clear, + EntryAction.exportMetadata => AIcons.fileExport, + // metadata / GeoTIFF + EntryAction.showGeoTiffOnMap => AIcons.map, + // metadata / motion photo + EntryAction.convertMotionPhotoToStillImage => AIcons.convertToStillImage, + EntryAction.viewMotionPhotoVideo => AIcons.openVideoPart, + // debug + EntryAction.debug => AIcons.debug, + }; + } +} diff --git a/lib/view/src/actions/entry_set.dart b/lib/view/src/actions/entry_set.dart new file mode 100644 index 0000000..f227867 --- /dev/null +++ b/lib/view/src/actions/entry_set.dart @@ -0,0 +1,113 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +extension ExtraEntrySetActionView on EntrySetAction { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + // general + EntrySetAction.configureView => l10n.menuActionConfigureView, + EntrySetAction.select => l10n.menuActionSelect, + EntrySetAction.selectAll => l10n.menuActionSelectAll, + EntrySetAction.selectNone => l10n.menuActionSelectNone, + + // browsing + EntrySetAction.searchCollection => MaterialLocalizations.of(context).searchFieldLabel, + EntrySetAction.toggleTitleSearch => + // different data depending on toggle state + l10n.collectionActionShowTitleSearch, + EntrySetAction.addDynamicAlbum => l10n.collectionActionAddDynamicAlbum, + EntrySetAction.addShortcut => l10n.collectionActionAddShortcut, + EntrySetAction.setHome => l10n.collectionActionSetHome, + EntrySetAction.emptyBin => l10n.collectionActionEmptyBin, + + // browsing or selecting + EntrySetAction.map => l10n.menuActionMap, + EntrySetAction.slideshow => l10n.menuActionSlideshow, + EntrySetAction.stats => l10n.menuActionStats, + EntrySetAction.rescan => l10n.collectionActionRescan, + + // selecting + EntrySetAction.share => l10n.entryActionShare, + + // ✅ NEW: Cast (enter casting mode; no autoplay) + // Reuse existing localized string already present in the app. + EntrySetAction.cast => l10n.castDialogTitle, + + EntrySetAction.delete => l10n.entryActionDelete, + EntrySetAction.restore => l10n.entryActionRestore, + EntrySetAction.copy => l10n.collectionActionCopy, + EntrySetAction.move => l10n.collectionActionMove, + EntrySetAction.rename => l10n.entryActionRename, + EntrySetAction.convert => l10n.entryActionConvert, + EntrySetAction.toggleFavourite => + // different data depending on toggle state + l10n.entryActionAddFavourite, + EntrySetAction.rotateCCW => l10n.entryActionRotateCCW, + EntrySetAction.rotateCW => l10n.entryActionRotateCW, + EntrySetAction.flip => l10n.entryActionFlip, + EntrySetAction.editDate => l10n.entryInfoActionEditDate, + EntrySetAction.editLocation => l10n.entryInfoActionEditLocation, + EntrySetAction.editTitleDescription => l10n.entryInfoActionEditTitleDescription, + EntrySetAction.editRating => l10n.entryInfoActionEditRating, + EntrySetAction.editTags => l10n.entryInfoActionEditTags, + EntrySetAction.removeMetadata => l10n.entryInfoActionRemoveMetadata, + }; + } + + Widget getIcon() => Icon(_getIconData()); + + IconData _getIconData() { + return switch (this) { + // general + EntrySetAction.configureView => AIcons.view, + EntrySetAction.select => AIcons.select, + EntrySetAction.selectAll => AIcons.selected, + EntrySetAction.selectNone => AIcons.unselected, + + // browsing + EntrySetAction.searchCollection => AIcons.search, + EntrySetAction.toggleTitleSearch => + // different data depending on toggle state + AIcons.filter, + EntrySetAction.addDynamicAlbum => AIcons.dynamicAlbum, + EntrySetAction.addShortcut => AIcons.addShortcut, + EntrySetAction.setHome => AIcons.home, + EntrySetAction.emptyBin => AIcons.emptyBin, + + // browsing or selecting + EntrySetAction.map => AIcons.map, + EntrySetAction.slideshow => AIcons.slideshow, + EntrySetAction.stats => AIcons.stats, + EntrySetAction.rescan => AIcons.refresh, + + // selecting + EntrySetAction.share => AIcons.share, + + // ✅ NEW: Cast (Material icon, since AIcons.cast does not exist) + EntrySetAction.cast => Icons.cast, + + EntrySetAction.delete => AIcons.delete, + EntrySetAction.restore => AIcons.restore, + EntrySetAction.copy => AIcons.copy, + EntrySetAction.move => AIcons.move, + EntrySetAction.rename => AIcons.rename, + EntrySetAction.convert => AIcons.convert, + EntrySetAction.toggleFavourite => + // different data depending on toggle state + AIcons.favourite, + EntrySetAction.rotateCCW => AIcons.rotateLeft, + EntrySetAction.rotateCW => AIcons.rotateRight, + EntrySetAction.flip => AIcons.flip, + EntrySetAction.editDate => AIcons.date, + EntrySetAction.editLocation => AIcons.location, + EntrySetAction.editTitleDescription => AIcons.description, + EntrySetAction.editRating => AIcons.rating, + EntrySetAction.editTags => AIcons.tag, + EntrySetAction.removeMetadata => AIcons.clear, + }; + } +} + diff --git a/lib/view/src/actions/explorer.dart b/lib/view/src/actions/explorer.dart new file mode 100644 index 0000000..b23c8fc --- /dev/null +++ b/lib/view/src/actions/explorer.dart @@ -0,0 +1,27 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +extension ExtraExplorerActionView on ExplorerAction { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + ExplorerAction.addShortcut => l10n.collectionActionAddShortcut, + ExplorerAction.setHome => l10n.collectionActionSetHome, + ExplorerAction.hide => l10n.chipActionHide, + ExplorerAction.stats => l10n.menuActionStats, + }; + } + + Widget getIcon() => Icon(_getIconData()); + + IconData _getIconData() { + return switch (this) { + ExplorerAction.addShortcut => AIcons.addShortcut, + ExplorerAction.setHome => AIcons.home, + ExplorerAction.hide => AIcons.hide, + ExplorerAction.stats => AIcons.stats, + }; + } +} diff --git a/lib/view/src/actions/map.dart b/lib/view/src/actions/map.dart new file mode 100644 index 0000000..5e521a0 --- /dev/null +++ b/lib/view/src/actions/map.dart @@ -0,0 +1,29 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraMapActionView on MapAction { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + MapAction.selectStyle => l10n.mapStyleTooltip, + MapAction.openMapApp => l10n.entryActionOpenMap, + MapAction.zoomIn => l10n.mapZoomInTooltip, + MapAction.zoomOut => l10n.mapZoomOutTooltip, + MapAction.addShortcut => l10n.collectionActionAddShortcut, + }; + } + + Widget getIcon() => Icon(_getIconData()); + + IconData _getIconData() { + return switch (this) { + MapAction.selectStyle => AIcons.layers, + MapAction.openMapApp => AIcons.openOutside, + MapAction.zoomIn => AIcons.zoomIn, + MapAction.zoomOut => AIcons.zoomOut, + MapAction.addShortcut => AIcons.addShortcut, + }; + } +} diff --git a/lib/view/src/actions/map_cluster.dart b/lib/view/src/actions/map_cluster.dart new file mode 100644 index 0000000..cf01679 --- /dev/null +++ b/lib/view/src/actions/map_cluster.dart @@ -0,0 +1,23 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraMapClusterActionView on MapClusterAction { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + MapClusterAction.editLocation => l10n.entryInfoActionEditLocation, + MapClusterAction.removeLocation => l10n.entryInfoActionRemoveLocation, + }; + } + + Widget getIcon() => Icon(_getIconData()); + + IconData _getIconData() { + return switch (this) { + MapClusterAction.editLocation => AIcons.edit, + MapClusterAction.removeLocation => AIcons.clear, + }; + } +} diff --git a/lib/view/src/actions/share.dart b/lib/view/src/actions/share.dart new file mode 100644 index 0000000..fd1042e --- /dev/null +++ b/lib/view/src/actions/share.dart @@ -0,0 +1,23 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraShareActionView on ShareAction { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + ShareAction.imageOnly => l10n.entryActionShareImageOnly, + ShareAction.videoOnly => l10n.entryActionShareVideoOnly, + }; + } + + Widget getIcon() => Icon(_getIconData()); + + IconData _getIconData() { + return switch (this) { + ShareAction.imageOnly => AIcons.image, + ShareAction.videoOnly => AIcons.video, + }; + } +} diff --git a/lib/view/src/actions/slideshow.dart b/lib/view/src/actions/slideshow.dart new file mode 100644 index 0000000..a047322 --- /dev/null +++ b/lib/view/src/actions/slideshow.dart @@ -0,0 +1,27 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraSlideshowActionView on SlideshowAction { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + SlideshowAction.resume => l10n.slideshowActionResume, + SlideshowAction.showInCollection => l10n.slideshowActionShowInCollection, + SlideshowAction.cast => l10n.entryActionCast, + SlideshowAction.settings => l10n.viewerActionSettings, + }; + } + + Widget getIcon() => Icon(_getIconData()); + + IconData _getIconData() { + return switch (this) { + SlideshowAction.resume => AIcons.play, + SlideshowAction.showInCollection => AIcons.allCollection, + SlideshowAction.cast => AIcons.cast, + SlideshowAction.settings => AIcons.settings, + }; + } +} diff --git a/lib/view/src/editor/enums.dart b/lib/view/src/editor/enums.dart new file mode 100644 index 0000000..13282f8 --- /dev/null +++ b/lib/view/src/editor/enums.dart @@ -0,0 +1,47 @@ +import 'package:aves/ref/unicode.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraEditorActionView on EditorAction { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + EditorAction.transform => l10n.editorActionTransform, + }; + } + + Widget getIcon() => Icon(_getIconData()); + + IconData _getIconData() { + return switch (this) { + EditorAction.transform => AIcons.transform, + }; + } +} + +extension ExtraCropAspectRatioView on CropAspectRatio { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + CropAspectRatio.free => l10n.cropAspectRatioFree, + CropAspectRatio.original => l10n.cropAspectRatioOriginal, + CropAspectRatio.square => l10n.cropAspectRatioSquare, + CropAspectRatio.ar_16_9 => '16${UniChars.ratio}9', + CropAspectRatio.ar_4_3 => '4${UniChars.ratio}3', + }; + } + + Widget getIcon() => Icon(_getIconData()); + + IconData _getIconData() { + return switch (this) { + CropAspectRatio.free => AIcons.aspectRatioFree, + CropAspectRatio.original => AIcons.aspectRatioOriginal, + CropAspectRatio.square => AIcons.aspectRatioSquare, + CropAspectRatio.ar_16_9 => AIcons.aspectRatio_16_9, + CropAspectRatio.ar_4_3 => AIcons.aspectRatio_4_3, + }; + } +} diff --git a/lib/view/src/metadata/convert_action.dart b/lib/view/src/metadata/convert_action.dart new file mode 100644 index 0000000..54f9f98 --- /dev/null +++ b/lib/view/src/metadata/convert_action.dart @@ -0,0 +1,21 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraEntryConvertActionView on EntryConvertAction { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + EntryConvertAction.convert => l10n.entryActionConvert, + EntryConvertAction.convertMotionPhotoToStillImage => l10n.entryActionConvertMotionPhotoToStillImage, + }; + } + + IconData getIconData() { + return switch (this) { + EntryConvertAction.convert => AIcons.convert, + EntryConvertAction.convertMotionPhotoToStillImage => AIcons.convertToStillImage, + }; + } +} diff --git a/lib/view/src/metadata/date_edit_action.dart b/lib/view/src/metadata/date_edit_action.dart new file mode 100644 index 0000000..6b90054 --- /dev/null +++ b/lib/view/src/metadata/date_edit_action.dart @@ -0,0 +1,17 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraDateEditActionView on DateEditAction { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + DateEditAction.setCustom => l10n.editEntryDateDialogSetCustom, + DateEditAction.copyField => l10n.editEntryDateDialogCopyField, + DateEditAction.copyItem => l10n.editEntryDialogCopyFromItem, + DateEditAction.extractFromTitle => l10n.editEntryDateDialogExtractFromTitle, + DateEditAction.shift => l10n.editEntryDateDialogShift, + DateEditAction.remove => l10n.actionRemove, + }; + } +} diff --git a/lib/view/src/metadata/date_field_source.dart b/lib/view/src/metadata/date_field_source.dart new file mode 100644 index 0000000..ccb58d8 --- /dev/null +++ b/lib/view/src/metadata/date_field_source.dart @@ -0,0 +1,15 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraDateFieldSourceView on DateFieldSource { + String getText(BuildContext context) { + return switch (this) { + DateFieldSource.fileModifiedDate => context.l10n.editEntryDateDialogSourceFileModifiedDate, + DateFieldSource.exifDate => 'Exif date', + DateFieldSource.exifDateOriginal => 'Exif original date', + DateFieldSource.exifDateDigitized => 'Exif digitized date', + DateFieldSource.exifGpsDate => 'Exif GPS date', + }; + } +} diff --git a/lib/view/src/metadata/exportable_fields.dart b/lib/view/src/metadata/exportable_fields.dart new file mode 100644 index 0000000..5e57579 --- /dev/null +++ b/lib/view/src/metadata/exportable_fields.dart @@ -0,0 +1,23 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraExportableEntryFields on ExportableEntryField { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + ExportableEntryField.uri => l10n.viewerInfoLabelUri, + ExportableEntryField.path => l10n.viewerInfoLabelPath, + ExportableEntryField.title => l10n.viewerInfoLabelTitle, + ExportableEntryField.date => l10n.viewerInfoLabelDate, + ExportableEntryField.size => l10n.viewerInfoLabelSize, + ExportableEntryField.resolution => l10n.viewerInfoLabelResolution, + ExportableEntryField.width => l10n.exportEntryDialogWidth, + ExportableEntryField.height => l10n.exportEntryDialogHeight, + ExportableEntryField.duration => l10n.viewerInfoLabelDuration, + ExportableEntryField.coordinates => l10n.viewerInfoLabelCoordinates, + ExportableEntryField.address => l10n.viewerInfoLabelAddress, + ExportableEntryField.tags => l10n.searchTagsSectionTitle, + }; + } +} diff --git a/lib/view/src/metadata/fields.dart b/lib/view/src/metadata/fields.dart new file mode 100644 index 0000000..3c9bfe2 --- /dev/null +++ b/lib/view/src/metadata/fields.dart @@ -0,0 +1,24 @@ +import 'package:aves_model/aves_model.dart'; + +extension ExtraMetadataFieldView on MetadataField { + String get title { + switch (this) { + case MetadataField.exifDate: + return 'Exif date'; + case MetadataField.exifDateOriginal: + return 'Exif original date'; + case MetadataField.exifDateDigitized: + return 'Exif digitized date'; + case MetadataField.exifGpsDatestamp: + return 'Exif GPS date'; + case MetadataField.exifMake: + return 'Exif make'; + case MetadataField.exifModel: + return 'Exif model'; + case MetadataField.xmpXmpCreateDate: + return 'XMP xmp:CreateDate'; + default: + return name; + } + } +} diff --git a/lib/view/src/metadata/length_unit.dart b/lib/view/src/metadata/length_unit.dart new file mode 100644 index 0000000..2ec818d --- /dev/null +++ b/lib/view/src/metadata/length_unit.dart @@ -0,0 +1,13 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraLengthUnitView on LengthUnit { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + LengthUnit.px => l10n.lengthUnitPixel, + LengthUnit.percent => l10n.lengthUnitPercent, + }; + } +} diff --git a/lib/view/src/metadata/location_edit_action.dart b/lib/view/src/metadata/location_edit_action.dart new file mode 100644 index 0000000..a48e29a --- /dev/null +++ b/lib/view/src/metadata/location_edit_action.dart @@ -0,0 +1,16 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraLocationEditActionView on LocationEditAction { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + LocationEditAction.chooseOnMap => l10n.editEntryLocationDialogChooseOnMap, + LocationEditAction.copyItem => l10n.editEntryDialogCopyFromItem, + LocationEditAction.setCustom => l10n.editEntryLocationDialogSetCustom, + LocationEditAction.importGpx => l10n.editEntryLocationDialogImportGpx, + LocationEditAction.remove => l10n.actionRemove, + }; + } +} diff --git a/lib/view/src/metadata/metadata_type.dart b/lib/view/src/metadata/metadata_type.dart new file mode 100644 index 0000000..45db454 --- /dev/null +++ b/lib/view/src/metadata/metadata_type.dart @@ -0,0 +1,20 @@ +import 'package:aves_model/aves_model.dart'; + +extension ExtraMetadataTypeView on MetadataType { + // match `metadata-extractor` directory names + String getText() { + return switch (this) { + MetadataType.comment => 'Comment', + MetadataType.exif => 'Exif', + MetadataType.iccProfile => 'ICC Profile', + MetadataType.iptc => 'IPTC', + MetadataType.jfif => 'JFIF', + MetadataType.jpegAdobe => 'Adobe JPEG', + MetadataType.jpegDucky => 'Ducky', + MetadataType.mp4 => 'MP4', + MetadataType.photoshopIrb => 'Photoshop', + MetadataType.xmp => 'XMP', + MetadataType.file => 'File', + }; + } +} diff --git a/lib/view/src/settings/enums.dart b/lib/view/src/settings/enums.dart new file mode 100644 index 0000000..4760a1e --- /dev/null +++ b/lib/view/src/settings/enums.dart @@ -0,0 +1,246 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraAccessibilityAnimationsView on AccessibilityAnimations { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + AccessibilityAnimations.system => l10n.settingsSystemDefault, + AccessibilityAnimations.disabled => l10n.accessibilityAnimationsRemove, + AccessibilityAnimations.enabled => l10n.accessibilityAnimationsKeep, + }; + } +} + +extension ExtraAccessibilityTimeoutView on AccessibilityTimeout { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + AccessibilityTimeout.system => l10n.settingsSystemDefault, + AccessibilityTimeout.s1 => l10n.timeSeconds(1), + AccessibilityTimeout.s3 => l10n.timeSeconds(3), + AccessibilityTimeout.s5 => l10n.timeSeconds(5), + AccessibilityTimeout.s10 => l10n.timeSeconds(10), + AccessibilityTimeout.s30 => l10n.timeSeconds(30), + }; + } +} + +extension ExtraAvesThemeBrightnessView on AvesThemeBrightness { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + AvesThemeBrightness.system => l10n.settingsSystemDefault, + AvesThemeBrightness.light => l10n.themeBrightnessLight, + AvesThemeBrightness.dark => l10n.themeBrightnessDark, + AvesThemeBrightness.black => l10n.themeBrightnessBlack, + }; + } +} + +extension ExtraCoordinateFormatView on CoordinateFormat { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + CoordinateFormat.dms => l10n.coordinateFormatDms, + CoordinateFormat.ddm => l10n.coordinateFormatDdm, + CoordinateFormat.decimal => l10n.coordinateFormatDecimal, + }; + } +} + +extension ExtraDisplayRefreshRateModeView on DisplayRefreshRateMode { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + DisplayRefreshRateMode.auto => l10n.settingsSystemDefault, + DisplayRefreshRateMode.highest => l10n.displayRefreshRatePreferHighest, + DisplayRefreshRateMode.lowest => l10n.displayRefreshRatePreferLowest, + }; + } +} + +extension ExtraEntryMapStyleView on EntryMapStyle { + String getName(BuildContext context) { + final l10n = context.l10n; + if (this == EntryMapStyles.googleNormal) return l10n.mapStyleGoogleNormal; + if (this == EntryMapStyles.googleHybrid) return l10n.mapStyleGoogleHybrid; + if (this == EntryMapStyles.googleTerrain) return l10n.mapStyleGoogleTerrain; + if (this == EntryMapStyles.osmLiberty) return l10n.mapStyleOsmLiberty; + if (this == EntryMapStyles.openTopoMap) return l10n.mapStyleOpenTopoMap; + if (this == EntryMapStyles.osmHot) return l10n.mapStyleOsmHot; + if (this == EntryMapStyles.stamenWatercolor) return l10n.mapStyleStamenWatercolor; + final _name = name; + if (_name != null) return _name; + throw Exception('Name is undefined for map style=$this'); + } +} + +extension ExtraHomePageSettingView on HomePageSetting { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + HomePageSetting.collection => l10n.drawerCollectionAll, + HomePageSetting.albums => l10n.drawerAlbumPage, + HomePageSetting.tags => l10n.drawerTagPage, + HomePageSetting.explorer => l10n.explorerPageTitle, + }; + } +} + +extension ExtraKeepScreenOnView on KeepScreenOn { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + KeepScreenOn.never => l10n.keepScreenOnNever, + KeepScreenOn.videoPlayback => l10n.keepScreenOnVideoPlayback, + KeepScreenOn.viewerOnly => l10n.keepScreenOnViewerOnly, + KeepScreenOn.always => l10n.keepScreenOnAlways, + }; + } +} + +extension ExtraMaxBrightnessView on MaxBrightness { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + MaxBrightness.never => l10n.maxBrightnessNever, + MaxBrightness.viewerOnly => l10n.keepScreenOnViewerOnly, + MaxBrightness.always => l10n.maxBrightnessAlways, + }; + } +} + +extension ExtraSlideshowVideoPlaybackView on SlideshowVideoPlayback { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + SlideshowVideoPlayback.skip => l10n.videoPlaybackSkip, + SlideshowVideoPlayback.playMuted => l10n.videoPlaybackMuted, + SlideshowVideoPlayback.playWithSound => l10n.videoPlaybackWithSound, + }; + } +} + +extension ExtraOverlayHistogramStyleView on OverlayHistogramStyle { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + OverlayHistogramStyle.none => l10n.overlayHistogramNone, + OverlayHistogramStyle.rgb => l10n.overlayHistogramRGB, + OverlayHistogramStyle.luminance => l10n.overlayHistogramLuminance, + }; + } +} + +extension ExtraSubtitlePositionView on SubtitlePosition { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + SubtitlePosition.top => l10n.subtitlePositionTop, + SubtitlePosition.bottom => l10n.subtitlePositionBottom, + }; + } +} + +extension ExtraUnitSystemView on UnitSystem { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + UnitSystem.metric => l10n.unitSystemMetric, + UnitSystem.imperial => l10n.unitSystemImperial, + }; + } +} + +extension ExtraVideoAutoPlayModeView on VideoAutoPlayMode { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + VideoAutoPlayMode.disabled => l10n.settingsDisabled, + VideoAutoPlayMode.playMuted => l10n.videoPlaybackMuted, + VideoAutoPlayMode.playWithSound => l10n.videoPlaybackWithSound, + }; + } +} + +extension ExtraVideoBackgroundModeView on VideoBackgroundMode { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + VideoBackgroundMode.disabled => l10n.settingsDisabled, + VideoBackgroundMode.pip => l10n.settingsVideoEnablePip, + }; + } +} + +extension ExtraVideoHardwareAccelerationView on VideoHardwareAcceleration { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + VideoHardwareAcceleration.disabled => l10n.settingsDisabled, + VideoHardwareAcceleration.enabled => l10n.settingsEnabled, + VideoHardwareAcceleration.forced => l10n.settingsForced, + }; + } +} + +extension ExtraVideoLoopModeView on VideoLoopMode { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + VideoLoopMode.never => l10n.videoLoopModeNever, + VideoLoopMode.shortOnly => l10n.videoLoopModeShortOnly, + VideoLoopMode.always => l10n.videoLoopModeAlways, + }; + } +} + +extension ExtraVideoResumptionModeView on VideoResumptionMode { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + VideoResumptionMode.never => l10n.videoResumptionModeNever, + VideoResumptionMode.ask => l10n.settingsAskEverytime, + VideoResumptionMode.always => l10n.videoResumptionModeAlways, + }; + } +} + +extension ExtraViewerTransitionView on ViewerTransition { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + ViewerTransition.slide => l10n.viewerTransitionSlide, + ViewerTransition.parallax => l10n.viewerTransitionParallax, + ViewerTransition.fade => l10n.viewerTransitionFade, + ViewerTransition.zoomIn => l10n.viewerTransitionZoomIn, + ViewerTransition.none => l10n.viewerTransitionNone, + ViewerTransition.random => l10n.widgetDisplayedItemRandom, + }; + } +} + +extension ExtraWidgetDisplayedItemView on WidgetDisplayedItem { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + WidgetDisplayedItem.random => l10n.widgetDisplayedItemRandom, + WidgetDisplayedItem.mostRecent => l10n.widgetDisplayedItemMostRecent, + }; + } +} + +extension ExtraWidgetOpenPageView on WidgetOpenPage { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + WidgetOpenPage.home => l10n.widgetOpenPageHome, + WidgetOpenPage.collection => l10n.widgetOpenPageCollection, + WidgetOpenPage.viewer => l10n.widgetOpenPageViewer, + WidgetOpenPage.updateWidget => l10n.widgetTapUpdateWidget, + }; + } +} diff --git a/lib/view/src/settings/thumbnail_overlay_location_icon.dart b/lib/view/src/settings/thumbnail_overlay_location_icon.dart new file mode 100644 index 0000000..3ff80ed --- /dev/null +++ b/lib/view/src/settings/thumbnail_overlay_location_icon.dart @@ -0,0 +1,22 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraThumbnailOverlayLocationIconView on ThumbnailOverlayLocationIcon { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + ThumbnailOverlayLocationIcon.located => l10n.filterLocatedLabel, + ThumbnailOverlayLocationIcon.unlocated => l10n.filterNoLocationLabel, + ThumbnailOverlayLocationIcon.none => l10n.settingsDisabled, + }; + } + + IconData getIcon(BuildContext context) { + return switch (this) { + ThumbnailOverlayLocationIcon.unlocated => AIcons.locationUnlocated, + ThumbnailOverlayLocationIcon.located || ThumbnailOverlayLocationIcon.none => AIcons.location, + }; + } +} diff --git a/lib/view/src/settings/thumbnail_overlay_tag_icon.dart b/lib/view/src/settings/thumbnail_overlay_tag_icon.dart new file mode 100644 index 0000000..deae99e --- /dev/null +++ b/lib/view/src/settings/thumbnail_overlay_tag_icon.dart @@ -0,0 +1,23 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraThumbnailOverlayTagIconView on ThumbnailOverlayTagIcon { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + ThumbnailOverlayTagIcon.tagged => l10n.filterTaggedLabel, + ThumbnailOverlayTagIcon.untagged => l10n.filterNoTagLabel, + ThumbnailOverlayTagIcon.none => l10n.settingsDisabled, + }; + } + + IconData getIcon(BuildContext context) { + return switch (this) { + ThumbnailOverlayTagIcon.tagged => AIcons.tag, + ThumbnailOverlayTagIcon.untagged => AIcons.tagUntagged, + ThumbnailOverlayTagIcon.none => AIcons.tag, + }; + } +} diff --git a/lib/view/src/source/album.dart b/lib/view/src/source/album.dart new file mode 100644 index 0000000..2ac7946 --- /dev/null +++ b/lib/view/src/source/album.dart @@ -0,0 +1,17 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraAlbumTypeView on AlbumType { + String? getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + AlbumType.camera => l10n.albumCamera, + AlbumType.download => l10n.albumDownload, + AlbumType.screenshots => l10n.albumScreenshots, + AlbumType.screenRecordings => l10n.albumScreenRecordings, + AlbumType.videoCaptures => l10n.albumVideoCaptures, + AlbumType.regular || AlbumType.vault || AlbumType.app => null, + }; + } +} diff --git a/lib/view/src/source/group.dart b/lib/view/src/source/group.dart new file mode 100644 index 0000000..3e8eab7 --- /dev/null +++ b/lib/view/src/source/group.dart @@ -0,0 +1,46 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraEntryGroupFactorView on EntrySectionFactor { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + EntrySectionFactor.album => l10n.collectionGroupAlbum, + EntrySectionFactor.month => l10n.collectionGroupMonth, + EntrySectionFactor.day => l10n.collectionGroupDay, + EntrySectionFactor.none => l10n.sectionNone, + }; + } + + IconData get icon { + return switch (this) { + EntrySectionFactor.album => AIcons.album, + EntrySectionFactor.month => AIcons.dateByMonth, + EntrySectionFactor.day => AIcons.dateByDay, + EntrySectionFactor.none => AIcons.clear, + }; + } +} + +extension ExtraAlbumChipGroupFactorView on AlbumChipSectionFactor { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + AlbumChipSectionFactor.importance => l10n.albumGroupTier, + AlbumChipSectionFactor.mimeType => l10n.albumGroupType, + AlbumChipSectionFactor.volume => l10n.albumGroupVolume, + AlbumChipSectionFactor.none => l10n.sectionNone, + }; + } + + IconData get icon { + return switch (this) { + AlbumChipSectionFactor.importance => AIcons.important, + AlbumChipSectionFactor.mimeType => AIcons.mimeType, + AlbumChipSectionFactor.volume => AIcons.storageCard, + AlbumChipSectionFactor.none => AIcons.clear, + }; + } +} diff --git a/lib/view/src/source/layout.dart b/lib/view/src/source/layout.dart new file mode 100644 index 0000000..bb17e11 --- /dev/null +++ b/lib/view/src/source/layout.dart @@ -0,0 +1,23 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraTileLayoutView on TileLayout { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + TileLayout.mosaic => l10n.tileLayoutMosaic, + TileLayout.grid => l10n.tileLayoutGrid, + TileLayout.list => l10n.tileLayoutList, + }; + } + + IconData get icon { + return switch (this) { + TileLayout.mosaic => AIcons.layoutMosaic, + TileLayout.grid => AIcons.layoutGrid, + TileLayout.list => AIcons.layoutList, + }; + } +} diff --git a/lib/view/src/source/sort.dart b/lib/view/src/source/sort.dart new file mode 100644 index 0000000..de67dbe --- /dev/null +++ b/lib/view/src/source/sort.dart @@ -0,0 +1,73 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraEntrySortFactorView on EntrySortFactor { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + EntrySortFactor.date => l10n.sortByDate, + EntrySortFactor.name => l10n.sortByAlbumFileName, + EntrySortFactor.rating => l10n.sortByRating, + EntrySortFactor.size => l10n.sortBySize, + EntrySortFactor.duration => l10n.sortByDuration, + EntrySortFactor.path => l10n.sortByPath, + }; + } + + IconData get icon { + return switch (this) { + EntrySortFactor.date => AIcons.date, + EntrySortFactor.name => AIcons.name, + EntrySortFactor.rating => AIcons.rating, + EntrySortFactor.size => AIcons.size, + EntrySortFactor.duration => AIcons.duration, + EntrySortFactor.path => AIcons.path, + }; + } + + String getOrderName(BuildContext context, bool reverse) { + final l10n = context.l10n; + return switch (this) { + EntrySortFactor.date => reverse ? l10n.sortOrderOldestFirst : l10n.sortOrderNewestFirst, + EntrySortFactor.name => reverse ? l10n.sortOrderZtoA : l10n.sortOrderAtoZ, + EntrySortFactor.rating => reverse ? l10n.sortOrderLowestFirst : l10n.sortOrderHighestFirst, + EntrySortFactor.size => reverse ? l10n.sortOrderSmallestFirst : l10n.sortOrderLargestFirst, + EntrySortFactor.duration => reverse ? l10n.sortOrderShortestFirst : l10n.sortOrderLongestFirst, + EntrySortFactor.path => reverse ? l10n.sortOrderZtoA : l10n.sortOrderAtoZ, + }; + } +} + +extension ExtraChipSortFactorView on ChipSortFactor { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + ChipSortFactor.date => l10n.sortByDate, + ChipSortFactor.name => l10n.sortByName, + ChipSortFactor.count => l10n.sortByItemCount, + ChipSortFactor.size => l10n.sortBySize, + ChipSortFactor.path => l10n.sortByPath, + }; + } + + IconData get icon { + return switch (this) { + ChipSortFactor.date => AIcons.date, + ChipSortFactor.name => AIcons.name, + ChipSortFactor.count => AIcons.count, + ChipSortFactor.size => AIcons.size, + ChipSortFactor.path => AIcons.path, + }; + } + + String getOrderName(BuildContext context, bool reverse) { + final l10n = context.l10n; + return switch (this) { + ChipSortFactor.date => reverse ? l10n.sortOrderOldestFirst : l10n.sortOrderNewestFirst, + ChipSortFactor.name || ChipSortFactor.path => reverse ? l10n.sortOrderZtoA : l10n.sortOrderAtoZ, + ChipSortFactor.count || ChipSortFactor.size => reverse ? l10n.sortOrderSmallestFirst : l10n.sortOrderLargestFirst, + }; + } +} diff --git a/lib/view/src/source/state.dart b/lib/view/src/source/state.dart new file mode 100644 index 0000000..9adc287 --- /dev/null +++ b/lib/view/src/source/state.dart @@ -0,0 +1,14 @@ +import 'package:aves/l10n/l10n.dart'; +import 'package:aves_model/aves_model.dart'; + +extension ExtraSourceStateView on SourceState { + String? getName(AppLocalizations l10n) { + return switch (this) { + SourceState.loading => l10n.sourceStateLoading, + SourceState.cataloguing => l10n.sourceStateCataloguing, + SourceState.locatingCountries => l10n.sourceStateLocatingCountries, + SourceState.locatingPlaces => l10n.sourceStateLocatingPlaces, + SourceState.ready => null, + }; + } +} diff --git a/lib/view/src/source/vault.dart b/lib/view/src/source/vault.dart new file mode 100644 index 0000000..10c9ad1 --- /dev/null +++ b/lib/view/src/source/vault.dart @@ -0,0 +1,15 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraVaultLockTypeView on VaultLockType { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + VaultLockType.system => l10n.settingsSystemDefault, + VaultLockType.pattern => l10n.vaultLockTypePattern, + VaultLockType.pin => l10n.vaultLockTypePin, + VaultLockType.password => l10n.vaultLockTypePassword, + }; + } +} diff --git a/lib/view/src/storage/relative_dir.dart b/lib/view/src/storage/relative_dir.dart new file mode 100644 index 0000000..23a6efc --- /dev/null +++ b/lib/view/src/storage/relative_dir.dart @@ -0,0 +1,12 @@ +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraVolumeRelativeDirectoryView on VolumeRelativeDirectory { + String getVolumeDescription(BuildContext context) { + final volume = androidFileUtils.storageVolumes.firstWhereOrNull((volume) => volume.path == volumePath); + return volume?.getDescription(context) ?? volumePath; + } +} diff --git a/lib/view/src/storage/volume.dart b/lib/view/src/storage/volume.dart new file mode 100644 index 0000000..4a77b7f --- /dev/null +++ b/lib/view/src/storage/volume.dart @@ -0,0 +1,15 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraStorageVolumeView on StorageVolume { + String getDescription(BuildContext? context) { + if (description != null) return description!; + // ideally, the context should always be provided, but in some cases (e.g. album comparison), + // this would require numerous additional methods to have the context as argument + // for such a minor benefit: fallback volume description on Android < N + final l10n = context?.l10n; + if (isPrimary) return l10n?.storageVolumeDescriptionFallbackPrimary ?? 'Internal Storage'; + return l10n?.storageVolumeDescriptionFallbackNonPrimary ?? 'SD card'; + } +} diff --git a/lib/view/src/wallpaper_target.dart b/lib/view/src/wallpaper_target.dart new file mode 100644 index 0000000..23d4dcb --- /dev/null +++ b/lib/view/src/wallpaper_target.dart @@ -0,0 +1,14 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraWallpaperTargetView on WallpaperTarget { + String getName(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + WallpaperTarget.home => l10n.wallpaperTargetHome, + WallpaperTarget.lock => l10n.wallpaperTargetLock, + WallpaperTarget.homeLock => l10n.wallpaperTargetHomeLock, + }; + } +} diff --git a/lib/view/src/xmp.dart b/lib/view/src/xmp.dart new file mode 100644 index 0000000..f94299e --- /dev/null +++ b/lib/view/src/xmp.dart @@ -0,0 +1,74 @@ +import 'package:aves/ref/metadata/xmp.dart'; + +class XmpNamespaceView { + // cf https://exiftool.org/TagNames/XMP.html + static const Map<String, String> nsTitles = { + XmpNamespaces.acdsee: 'ACDSee', + XmpNamespaces.adsmlat: 'AdsML', + XmpNamespaces.exifAux: 'Exif Aux', + XmpNamespaces.avm: 'Astronomy Visualization', + XmpNamespaces.appleDepthData: 'Apple Depth Data', + XmpNamespaces.appleDesktop: 'Apple Desktop', + XmpNamespaces.appleHDRGainMap: 'Apple HDR Gain Map', + XmpNamespaces.applePixelDataInfo: 'Apple Pixel Data Info', + XmpNamespaces.camera: 'Pix4D Camera', + XmpNamespaces.cc: 'Creative Commons', + XmpNamespaces.crd: 'Camera Raw Defaults', + XmpNamespaces.creatorAtom: 'After Effects', + XmpNamespaces.crs: 'Camera Raw Settings', + XmpNamespaces.crss: 'Camera Raw Saved Settings', + XmpNamespaces.darktable: 'darktable', + XmpNamespaces.dc: 'Dublin Core', + XmpNamespaces.dicom: 'DICOM', + XmpNamespaces.digiKam: 'digiKam', + XmpNamespaces.droneDji: 'DJI Drone', + XmpNamespaces.dwc: 'Darwin Core', + XmpNamespaces.exif: 'Exif', + XmpNamespaces.exifEx: 'Exif Ex', + XmpNamespaces.fstop: 'F-Stop', + XmpNamespaces.gAudio: 'Google Audio', + XmpNamespaces.gCamera: 'Google Camera', + XmpNamespaces.gContainer: 'Google Container', + XmpNamespaces.gCreations: 'Google Creations', + XmpNamespaces.gDepth: 'Google Depth', + XmpNamespaces.gDevice: 'Google Device', + XmpNamespaces.gFocus: 'Google Focus', + XmpNamespaces.gImage: 'Google Image', + XmpNamespaces.gPano: 'Google Panorama', + XmpNamespaces.gSpherical: 'Google Spherical', + XmpNamespaces.gPhotoScan: 'Google PhotoScan', + XmpNamespaces.gettyImagesGift: 'Getty Images', + XmpNamespaces.gimp210: 'GIMP 2.10', + XmpNamespaces.gimpXmp: 'GIMP', + XmpNamespaces.hdrgm: 'HDR Gain Map', + XmpNamespaces.illustrator: 'Illustrator', + XmpNamespaces.iptc4xmpCore: 'IPTC Core', + XmpNamespaces.iptc4xmpExt: 'IPTC Extension', + XmpNamespaces.lr: 'Lightroom', + XmpNamespaces.mediapro: 'MediaPro', + XmpNamespaces.miCamera: 'Mi Camera', + XmpNamespaces.microsoftPhoto: 'Microsoft Photo 1.0', + XmpNamespaces.mp1: 'Microsoft Photo 1.1', + XmpNamespaces.mp: 'Microsoft Photo 1.2', + XmpNamespaces.mwgrs: 'Regions', + XmpNamespaces.nga: 'National Gallery of Art', + XmpNamespaces.opMedia: 'OnePlus Media', + XmpNamespaces.panorama: 'Panorama', + XmpNamespaces.panoStudio: 'PanoramaStudio', + XmpNamespaces.pdf: 'PDF', + XmpNamespaces.pdfX: 'PDF/X', + XmpNamespaces.photoMechanic: 'Photo Mechanic', + XmpNamespaces.photoshop: 'Photoshop', + XmpNamespaces.plus: 'PLUS', + XmpNamespaces.pmtm: 'Photomatix', + XmpNamespaces.tiff: 'TIFF', + XmpNamespaces.xmp: 'Basic', + XmpNamespaces.xmpBJ: 'Basic Job Ticket', + XmpNamespaces.xmpDM: 'Dynamic Media', + XmpNamespaces.xmpMM: 'Media Management', + XmpNamespaces.xmpNote: 'Note', + XmpNamespaces.xmpRights: 'Rights Management', + XmpNamespaces.xmpTPg: 'Paged-Text', + XmpNamespaces.xperiaCamera: 'Xperia Camera', + }; +} diff --git a/lib/view/view.dart b/lib/view/view.dart new file mode 100644 index 0000000..6096c09 --- /dev/null +++ b/lib/view/view.dart @@ -0,0 +1,30 @@ +export 'src/actions/chip.dart'; +export 'src/actions/chip_set.dart'; +export 'src/actions/entry.dart'; +export 'src/actions/entry_set.dart'; +export 'src/actions/explorer.dart'; +export 'src/actions/map.dart'; +export 'src/actions/map_cluster.dart'; +export 'src/actions/share.dart'; +export 'src/actions/slideshow.dart'; +export 'src/editor/enums.dart'; +export 'src/metadata/convert_action.dart'; +export 'src/metadata/date_edit_action.dart'; +export 'src/metadata/date_field_source.dart'; +export 'src/metadata/fields.dart'; +export 'src/metadata/length_unit.dart'; +export 'src/metadata/location_edit_action.dart'; +export 'src/metadata/metadata_type.dart'; +export 'src/settings/enums.dart'; +export 'src/settings/thumbnail_overlay_location_icon.dart'; +export 'src/settings/thumbnail_overlay_tag_icon.dart'; +export 'src/source/album.dart'; +export 'src/source/group.dart'; +export 'src/source/layout.dart'; +export 'src/source/sort.dart'; +export 'src/source/state.dart'; +export 'src/source/vault.dart'; +export 'src/storage/relative_dir.dart'; +export 'src/storage/volume.dart'; +export 'src/wallpaper_target.dart'; +export 'src/xmp.dart'; diff --git a/lib/widget_common.dart b/lib/widget_common.dart new file mode 100644 index 0000000..e42ed11 --- /dev/null +++ b/lib/widget_common.dart @@ -0,0 +1,117 @@ +import 'dart:async'; + +import 'package:aves/app_flavor.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/sort.dart'; +import 'package:aves/model/settings/enums/widget_outline.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/media_store_source.dart'; +import 'package:aves/services/common/channel.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/widgets/home_widget.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +const _widgetDrawChannel = AvesMethodChannel('deckers.thibault/aves/widget_draw'); + +void widgetMainCommon(AppFlavor flavor) async { + debugPrint('Widget main start'); + WidgetsFlutterBinding.ensureInitialized(); + initPlatformServices(); + await settings.init(monitorPlatformSettings: false, shouldSanitize: false); + await reportService.init(); + + debugPrint('Widget channel method handling setup'); + _widgetDrawChannel.setMethodCallHandler((call) async { + // widget settings may be modified in a different process after channel setup + await settings.reload(); + + switch (call.method) { + case 'drawWidget': + return _drawWidget(call.arguments); + default: + throw PlatformException(code: 'not-implemented', message: 'failed to handle method=${call.method}'); + } + }); +} + +Future<Map<String, dynamic>> _drawWidget(dynamic args) async { + final widgetId = args['widgetId'] as int; + final sizesDip = (args['sizesDip'] as List).cast<Map>().map((kv) { + return Size(kv['widthDip'] as double, kv['heightDip'] as double); + }).toList(); + final cornerRadiusPx = args['cornerRadiusPx'] as double?; + final devicePixelRatio = args['devicePixelRatio'] as double; + final drawEntryImage = args['drawEntryImage'] as bool; + final reuseEntry = args['reuseEntry'] as bool; + final isSystemThemeDark = args['isSystemThemeDark'] as bool; + + await reportService.log('Draw widget with widgetId=$widgetId'); + + final brightness = isSystemThemeDark ? Brightness.dark : Brightness.light; + final outline = await settings.getWidgetOutline(widgetId).color(brightness); + + final entry = drawEntryImage ? await _getWidgetEntry(widgetId, reuseEntry) : null; + final painter = HomeWidgetPainter( + entry: entry, + devicePixelRatio: devicePixelRatio, + ); + final bytesBySizeDip = <Map<String, dynamic>>[]; + await Future.forEach(sizesDip, (sizeDip) async { + final bytes = await painter.drawWidget( + sizeDip: sizeDip, + cornerRadiusPx: cornerRadiusPx, + outline: outline, + shape: settings.getWidgetShape(widgetId), + ); + bytesBySizeDip.add({ + 'widthDip': sizeDip.width, + 'heightDip': sizeDip.height, + 'bytes': bytes, + }); + }); + return { + 'bytesBySizeDip': bytesBySizeDip, + 'updateOnTap': settings.getWidgetOpenPage(widgetId) == WidgetOpenPage.updateWidget, + }; +} + +Future<AvesEntry?> _getWidgetEntry(int widgetId, bool reuseEntry) async { + final uri = reuseEntry ? settings.getWidgetUri(widgetId) : null; + if (uri != null) { + final entry = await mediaFetchService.getEntry(uri, null); + if (entry != null) return entry; + } + + await androidFileUtils.init(); + + final filters = settings.getWidgetCollectionFilters(widgetId); + final source = MediaStoreSource(); + final readyCompleter = Completer(); + source.stateNotifier.addListener(() { + if (source.isReady) { + readyCompleter.complete(); + } + }); + source.canAnalyze = false; + await source.init(scope: filters); + await readyCompleter.future; + + final entries = CollectionLens(source: source, filters: filters).sortedEntries; + switch (settings.getWidgetDisplayedItem(widgetId)) { + case WidgetDisplayedItem.random: + entries.shuffle(); + case WidgetDisplayedItem.mostRecent: + entries.sort(AvesEntrySort.compareByDate); + } + final entry = entries.firstOrNull; + if (entry != null) { + settings.setWidgetUri(widgetId, entry.uri); + } + source.dispose(); + return entry; +} diff --git a/lib/widgets/about/about_mobile_page.dart b/lib/widgets/about/about_mobile_page.dart new file mode 100644 index 0000000..53aee33 --- /dev/null +++ b/lib/widgets/about/about_mobile_page.dart @@ -0,0 +1,53 @@ +import 'package:aves/widgets/about/app_ref.dart'; +import 'package:aves/widgets/about/bug_report.dart'; +import 'package:aves/widgets/about/credits.dart'; +import 'package:aves/widgets/about/data_usage.dart'; +import 'package:aves/widgets/about/licenses.dart'; +import 'package:aves/widgets/about/translators.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; + +class AboutMobilePage extends StatelessWidget { + const AboutMobilePage({super.key}); + + @override + Widget build(BuildContext context) { + return AvesScaffold( + appBar: AppBar( + title: Text(context.l10n.aboutPageTitle), + ), + body: GestureAreaProtectorStack( + child: SafeArea( + bottom: false, + child: CustomScrollView( + slivers: [ + SliverPadding( + padding: const EdgeInsets.only(top: 16), + sliver: SliverList( + delegate: SliverChildListDelegate( + [ + const AppReference(), + const Divider(), + const BugReport(), + const Divider(), + const AboutDataUsage(), + const Divider(), + const AboutCredits(), + const Divider(), + const AboutTranslators(), + const Divider(), + ], + ), + ), + ), + const Licenses(), + const BottomPaddingSliver(), + ], + ), + ), + ), + ); + } +} diff --git a/lib/widgets/about/about_page.dart b/lib/widgets/about/about_page.dart new file mode 100644 index 0000000..10388dc --- /dev/null +++ b/lib/widgets/about/about_page.dart @@ -0,0 +1,19 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/about/about_mobile_page.dart'; +import 'package:aves/widgets/about/about_tv_page.dart'; +import 'package:flutter/material.dart'; + +class AboutPage extends StatelessWidget { + static const routeName = '/about'; + + const AboutPage({super.key}); + + @override + Widget build(BuildContext context) { + if (settings.useTvLayout) { + return const AboutTvPage(); + } else { + return const AboutMobilePage(); + } + } +} diff --git a/lib/widgets/about/about_tv_page.dart b/lib/widgets/about/about_tv_page.dart new file mode 100644 index 0000000..d6086af --- /dev/null +++ b/lib/widgets/about/about_tv_page.dart @@ -0,0 +1,213 @@ +import 'package:aves/model/device.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/about/app_ref.dart'; +import 'package:aves/widgets/about/credits.dart'; +import 'package:aves/widgets/about/translators.dart'; +import 'package:aves/widgets/about/tv_license_page.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/behaviour/pop/scope.dart'; +import 'package:aves/widgets/common/behaviour/pop/tv_navigation.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; +import 'package:aves/widgets/navigation/tv_rail.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class AboutTvPage extends StatelessWidget { + const AboutTvPage({super.key}); + + @override + Widget build(BuildContext context) { + return AvesScaffold( + body: AvesPopScope( + handlers: [tvNavigationPopHandler], + child: Row( + children: [ + TvRail( + controller: context.read<TvRailController>(), + ), + Expanded( + child: Column( + children: [ + const SizedBox(height: 8), + DirectionalSafeArea( + start: false, + bottom: false, + child: AppBar( + automaticallyImplyLeading: false, + title: Text(context.l10n.aboutPageTitle), + elevation: 0, + primary: false, + ), + ), + Expanded( + child: MediaQuery.removePadding( + context: context, + removeLeft: true, + removeTop: true, + removeRight: true, + removeBottom: true, + child: const _Content(), + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} + +class _Content extends StatefulWidget { + const _Content(); + + @override + State<_Content> createState() => _ContentState(); +} + +enum _Section { links, credits, translators, licenses } + +class _ContentState extends State<_Content> { + final FocusNode _railFocusNode = FocusNode(); + final ValueNotifier<int> _railIndexNotifier = ValueNotifier(0); + + static const double railWidth = 256; + + @override + void dispose() { + _railIndexNotifier.dispose(); + _railFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder<int>( + valueListenable: _railIndexNotifier, + builder: (context, selectedIndex, child) { + final rail = Focus( + focusNode: _railFocusNode, + skipTraversal: true, + canRequestFocus: false, + child: ConstrainedBox( + constraints: BoxConstraints.loose(const Size.fromWidth(railWidth)), + child: Center( + child: ListView.builder( + itemBuilder: (context, index) { + final isSelected = index == selectedIndex; + final theme = Theme.of(context); + final colors = theme.colorScheme; + return ListTile( + title: DefaultTextStyle( + style: theme.textTheme.bodyLarge!.copyWith( + color: isSelected ? colors.primary : colors.onSurface.withValues(alpha: .64), + ), + child: _getTitle(_Section.values[index]), + ), + selected: isSelected, + contentPadding: const EdgeInsets.symmetric(vertical: 8, horizontal: 24), + onTap: () => _railIndexNotifier.value = index, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(123)), + ), + ); + }, + itemCount: _Section.values.length, + ), + ), + ), + ); + + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + rail, + Expanded( + child: MediaQuery.removePadding( + context: context, + removeLeft: !context.isRtl, + removeRight: context.isRtl, + child: _getBody(_Section.values[selectedIndex]), + ), + ), + ], + ); + }, + ); + } + + Widget _getTitle(_Section key) { + switch (key) { + case _Section.links: + return Text('${context.l10n.appName} ${device.packageVersion}'); + case _Section.credits: + return Text(context.l10n.aboutCreditsSectionTitle); + case _Section.translators: + return Text(context.l10n.aboutTranslatorsSectionTitle); + case _Section.licenses: + return Text(context.l10n.aboutLicensesSectionTitle); + } + } + + Widget _getBody(_Section key) { + switch (key) { + case _Section.links: + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: AppReference.buildLinks(context) + .map( + (v) => Padding( + padding: const EdgeInsets.all(16), + child: v, + ), + ) + .toList(), + ); + case _Section.credits: + return Padding( + padding: const EdgeInsets.all(16), + child: AboutCredits.buildBody(context), + ); + case _Section.translators: + return Padding( + padding: const EdgeInsets.all(16), + child: AboutTranslators.buildBody(context), + ); + case _Section.licenses: + return Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(context.l10n.aboutLicensesBanner), + const SizedBox(height: 16), + Center( + child: AvesOutlinedButton( + label: context.l10n.aboutLicensesShowAllButtonLabel, + onPressed: () => Navigator.maybeOf(context)?.push( + MaterialPageRoute( + builder: (context) { + final theme = Theme.of(context); + final listTileTheme = theme.listTileTheme; + return Theme( + data: theme.copyWith( + listTileTheme: listTileTheme.copyWith( + tileColor: Themes.firstLayerColor(context), + ), + ), + child: const TvLicensePage(), + ); + }, + ), + ), + ), + ), + ], + ), + ); + } + } +} diff --git a/lib/widgets/about/app_ref.dart b/lib/widgets/about/app_ref.dart new file mode 100644 index 0000000..b1c3be7 --- /dev/null +++ b/lib/widgets/about/app_ref.dart @@ -0,0 +1,101 @@ +import 'package:aves/model/device.dart'; +import 'package:aves/ref/locales.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/about/policy_page.dart'; +import 'package:aves/widgets/common/basic/link_chip.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_logo.dart'; +import 'package:flutter/material.dart'; + +class AppReference extends StatelessWidget { + static const avesGithub = 'https://github.com/deckerst/aves'; + + const AppReference({super.key}); + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + children: [ + _buildAvesLine(context), + const SizedBox(height: 16), + Wrap( + alignment: WrapAlignment.center, + spacing: 16, + crossAxisAlignment: WrapCrossAlignment.center, + children: AppReference.buildLinks(context), + ), + ], + ), + ); + } + + Widget _buildAvesLine(BuildContext context) { + final locale = context.locale; + final textScaler = MediaQuery.textScalerOf(context); + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + AvesLogo( + size: textScaler.scale(_getAppTitleStyle(locale).fontSize!) * 1.3, + ), + const SizedBox(width: 8), + Text( + context.l10n.appName, + style: _getAppTitleStyle(locale), + ), + const SizedBox(width: 8), + Text( + device.packageVersion, + style: _getAppTitleStyle(locale), + ), + ], + ); + } + + TextStyle _getAppTitleStyle(String locale) => TextStyle( + fontSize: 20, + fontWeight: FontWeight.normal, + letterSpacing: canHaveLetterSpacing(locale) ? 1 : 0, + fontFeatures: const [FontFeature.enable('smcp')], + ); + + static List<Widget> buildLinks(BuildContext context) { + final l10n = context.l10n; + return [ + LinkChip( + leading: Icon( + AIcons.github, + size: 24, + ), + text: 'GitHub', + urlString: AppReference.avesGithub, + ), + LinkChip( + leading: Icon( + AIcons.legal, + size: 22, + ), + text: l10n.aboutLinkLicense, + urlString: '${AppReference.avesGithub}/blob/main/LICENSE', + ), + LinkChip( + leading: const Icon( + AIcons.privacy, + size: 22, + ), + text: l10n.aboutLinkPolicy, + onTap: () => _goToPolicyPage(context), + ), + ]; + } + + static void _goToPolicyPage(BuildContext context) { + Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: PolicyPage.routeName), + builder: (context) => const PolicyPage(), + ), + ); + } +} diff --git a/lib/widgets/about/bug_report.dart b/lib/widgets/about/bug_report.dart new file mode 100644 index 0000000..bc647d4 --- /dev/null +++ b/lib/widgets/about/bug_report.dart @@ -0,0 +1,221 @@ +import 'dart:convert'; +import 'dart:io'; +import 'dart:ui' as ui; + +import 'package:aves/app_flavor.dart'; +import 'package:aves/model/device.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/ref/locales.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/about/app_ref.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:intl/intl.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:provider/provider.dart'; + +class BugReport extends StatefulWidget { + const BugReport({super.key}); + + @override + State<BugReport> createState() => _BugReportState(); +} + +class _BugReportState extends State<BugReport> { + bool _showInstructions = false; + + @override + Widget build(BuildContext context) { + final animationDuration = context.select<DurationsData, Duration>((v) => v.expansionTileAnimation); + return ExpansionPanelList( + expansionCallback: (index, isExpanded) { + setState(() => _showInstructions = isExpanded); + }, + animationDuration: animationDuration, + expandedHeaderPadding: EdgeInsets.zero, + elevation: 0, + children: [ + ExpansionPanel( + headerBuilder: (context, isExpanded) => ConstrainedBox( + constraints: const BoxConstraints(minHeight: kMinInteractiveDimension), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + alignment: AlignmentDirectional.centerStart, + child: Text(context.l10n.aboutBugSectionTitle, style: AStyles.knownTitleText), + ), + ), + body: const BugReportContent(), + isExpanded: _showInstructions, + canTapOnHeader: true, + backgroundColor: Colors.transparent, + ), + ], + ); + } +} + +class BugReportContent extends StatefulWidget { + const BugReportContent({super.key}); + + @override + State<BugReportContent> createState() => _BugReportContentState(); +} + +class _BugReportContentState extends State<BugReportContent> with FeedbackMixin { + late Future<String> _infoLoader; + static const bugReportUrl = '${AppReference.avesGithub}/issues/new?labels=type%3Abug&template=bug_report.md'; + + @override + void initState() { + super.initState(); + _infoLoader = _getInfo(context); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildStep(1, l10n.aboutBugSaveLogInstruction, l10n.saveTooltip, _saveLogs), + _buildStep(2, l10n.aboutBugCopyInfoInstruction, l10n.aboutBugCopyInfoButton, _copySystemInfo), + FutureBuilder<String>( + future: _infoLoader, + builder: (context, snapshot) { + final info = snapshot.data; + if (info == null) return const SizedBox(); + + return Container( + decoration: BoxDecoration( + color: Themes.secondLayerColor(context), + border: Border.all( + color: Theme.of(context).dividerColor, + width: AvesBorder.curvedBorderWidth(context), + ), + borderRadius: const BorderRadius.all(Radius.circular(16)), + ), + constraints: const BoxConstraints(maxHeight: 100), + margin: const EdgeInsets.symmetric(vertical: 8), + clipBehavior: Clip.antiAlias, + child: SingleChildScrollView( + padding: const EdgeInsets.all(8), + // to show a scroll bar, we would need to provide a scroll controller + // to both the `Scrollable` and the `Scrollbar`, but + // as of Flutter v3.0.0, `SelectableText` does not allow passing the `scrollController` + child: SelectableText( + info, + textDirection: ui.TextDirection.ltr, + style: Theme.of(context).textTheme.bodySmall, + ), + ), + ); + }, + ), + _buildStep(3, l10n.aboutBugReportInstruction, l10n.aboutBugReportButton, _goToGithub), + const SizedBox(height: 8), + ], + ), + ); + } + + Widget _buildStep(int step, String text, String buttonText, VoidCallback onPressed) { + final isMonochrome = settings.themeColorMode == AvesThemeColorMode.monochrome; + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + border: Border.fromBorderSide( + BorderSide( + color: isMonochrome ? context.select<AvesColorsData, Color>((v) => v.neutral) : Theme.of(context).colorScheme.primary, + width: AvesFilterChip.outlineWidth, + ), + ), + shape: BoxShape.circle, + ), + child: Text(NumberFormat('0', context.locale).format(step)), + ), + const SizedBox(width: 8), + Expanded(child: Text(text)), + const SizedBox(width: 8), + AvesOutlinedButton( + label: buttonText, + onPressed: onPressed, + ), + ], + ), + ); + } + + Future<String> _getInfo(BuildContext context) async { + final flavor = context.read<AppFlavor>().toString().split('.')[1]; + final packageInfo = await PackageInfo.fromPlatform(); + final androidInfo = await DeviceInfoPlugin().androidInfo; + final mediaQuery = MediaQuery.of(context); + final view = View.of(context); + final supportsHdr = await windowService.supportsHdr(); + final supportsWideGamut = await windowService.supportsWideGamut(); + final connections = await Connectivity().checkConnectivity(); + final storageVolumes = await storageService.getStorageVolumes(); + final storageGrants = await storageService.getGrantedDirectories(); + return [ + 'Package: ${device.packageName}', + 'Installer: ${packageInfo.installerStore}', + 'Aves version: ${device.packageVersion}-$flavor, build ${packageInfo.buildNumber}', + 'Flutter: ${FlutterVersion.channel} ${FlutterVersion.version}', + 'Android version: ${androidInfo.version.release}, API ${androidInfo.version.sdkInt}', + 'Android build: ${androidInfo.display}', + 'Device: ${androidInfo.manufacturer} ${androidInfo.model}', + 'Display: pixel ratio=${view.devicePixelRatio}, logical=${mediaQuery.size.width}x${mediaQuery.size.height}, physical=${view.physicalSize.width}x${view.physicalSize.height}', + 'Support: dynamic colors=${device.isDynamicColorAvailable}, geocoder=${device.hasGeocoder}, HDR=$supportsHdr, wide gamut=$supportsWideGamut', + 'Mobile services: ${mobileServices.isServiceAvailable ? 'ready' : 'not available'}', + 'Connectivity: ${connections.map((v) => v.name).join(', ')}', + 'System locales: ${WidgetsBinding.instance.platformDispatcher.locales.join(', ')}', + 'Storage volumes: ${storageVolumes.map((v) => v.path).join(', ')}', + 'Storage grants: ${storageGrants.join(', ')}', + 'Error reporting: ${settings.isErrorReportingAllowed}', + ].join('\n'); + } + + Future<void> _saveLogs() async { + final result = await Process.run('logcat', ['-d']); + final logs = result.stdout; + final success = await storageService.createFile( + 'aves-logs-${DateFormat('yyyyMMdd_HHmmss', asciiLocale).format(DateTime.now())}.txt', + MimeTypes.plainText, + Uint8List.fromList(utf8.encode(logs)), + ); + if (success != null) { + if (success) { + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } else { + showFeedback(context, FeedbackType.warn, context.l10n.genericFailureFeedback); + } + } + } + + Future<void> _copySystemInfo() async { + await Clipboard.setData(ClipboardData(text: await _infoLoader)); + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } + + Future<void> _goToGithub() => AvesApp.launchUrl(bugReportUrl); +} diff --git a/lib/widgets/about/credits.dart b/lib/widgets/about/credits.dart new file mode 100644 index 0000000..1aa6e61 --- /dev/null +++ b/lib/widgets/about/credits.dart @@ -0,0 +1,44 @@ +import 'package:aves/widgets/about/title.dart'; +import 'package:aves/widgets/common/basic/link_chip.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; + +class AboutCredits extends StatelessWidget { + const AboutCredits({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AboutSectionTitle(text: context.l10n.aboutCreditsSectionTitle), + const SizedBox(height: 8), + buildBody(context), + const SizedBox(height: 8), + ], + ), + ); + } + + static Widget buildBody(BuildContext context) { + final l10n = context.l10n; + return Text.rich( + TextSpan( + children: [ + TextSpan(text: l10n.aboutCreditsWorldAtlas1), + const WidgetSpan( + child: LinkChip( + text: 'World Atlas', + urlString: 'https://github.com/topojson/world-atlas', + textStyle: TextStyle(fontWeight: FontWeight.bold), + ), + alignment: PlaceholderAlignment.middle, + ), + TextSpan(text: l10n.aboutCreditsWorldAtlas2), + ], + ), + ); + } +} diff --git a/lib/widgets/about/data_usage.dart b/lib/widgets/about/data_usage.dart new file mode 100644 index 0000000..c87667a --- /dev/null +++ b/lib/widgets/about/data_usage.dart @@ -0,0 +1,183 @@ +import 'package:aves/ref/brand_colors.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_donut.dart'; +import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:provider/provider.dart'; + +class AboutDataUsage extends StatefulWidget { + const AboutDataUsage({super.key}); + + @override + State<AboutDataUsage> createState() => _AboutDataUsageState(); +} + +class _AboutDataUsageState extends State<AboutDataUsage> with FeedbackMixin { + late Future<Map<String, int>> _loader; + bool _isExpanded = false; + + @override + void initState() { + super.initState(); + _reload(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final animationDuration = context.select<DurationsData, Duration>((v) => v.expansionTileAnimation); + return ExpansionPanelList( + expansionCallback: (index, isExpanded) { + setState(() => _isExpanded = isExpanded); + }, + animationDuration: animationDuration, + expandedHeaderPadding: EdgeInsets.zero, + elevation: 0, + children: [ + ExpansionPanel( + headerBuilder: (context, isExpanded) => ConstrainedBox( + constraints: const BoxConstraints(minHeight: kMinInteractiveDimension), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + alignment: AlignmentDirectional.centerStart, + child: Text(l10n.aboutDataUsageSectionTitle, style: AStyles.knownTitleText), + ), + ), + body: FutureBuilder<Map<String, int>>( + future: _loader, + builder: (context, snapshot) { + final data = snapshot.data; + if (data == null) return const SizedBox(); + + final dataMap = { + DataUsageDonut.bin: data['trash'] ?? 0, + DataUsageDonut.database: data['database'] ?? 0, + DataUsageDonut.vaults: data['vaults'] ?? 0, + DataUsageDonut.misc: data['miscData'] ?? 0, + }; + final flutter = data['flutter'] ?? 0; + if (flutter > 0) { + dataMap[DataUsageDonut.flutter] = flutter; + } + final cacheMap = { + DataUsageDonut.internal: data['internalCache'] ?? 0, + DataUsageDonut.external: data['externalCache'] ?? 0, + }; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + DataUsageDonut( + title: l10n.aboutDataUsageData, + byTypes: dataMap, + animationDuration: animationDuration, + ), + DataUsageDonut( + title: l10n.aboutDataUsageCache, + byTypes: cacheMap, + animationDuration: animationDuration, + ), + Center( + child: AvesOutlinedButton( + label: context.l10n.aboutDataUsageClearCache, + onPressed: () async { + await storageService.deleteTempDirectory(); + await storageService.deleteExternalCache(); + // Glide cache by default in `cache/image_manager_disk_cache/` + await mediaFetchService.clearImageDiskCache(); + // flutter_map cache in `cache/fm_cache/` + await BuiltInMapCachingProvider.getOrCreateInstance().destroy(deleteCache: true); + imageCache.clear(); + _reload(); + setState(() {}); + }, + ), + ), + ], + ); + }, + ), + isExpanded: _isExpanded, + canTapOnHeader: true, + backgroundColor: Colors.transparent, + ), + ], + ); + } + + void _reload() { + _loader = storageService.getDataUsage(); + } +} + +class DataUsageDonut extends StatelessWidget { + final String title; + final Map<String, int> byTypes; + final Duration animationDuration; + + // data + static const String bin = 'bin'; + static const String database = 'database'; + static const String flutter = 'flutter'; + static const String vaults = 'vaults'; + static const String misc = 'misc'; + + // cache + static const String internal = 'internal'; + static const String external = 'external'; + + const DataUsageDonut({ + super.key, + required this.title, + required this.byTypes, + required this.animationDuration, + }); + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final locale = context.locale; + + return AvesDonut( + title: Text(title), + byTypes: byTypes, + animationDuration: animationDuration, + formatKey: (d) { + switch (d.key) { + case bin: + return l10n.binPageTitle; + case database: + return l10n.aboutDataUsageDatabase; + case flutter: + return 'Flutter'; + case vaults: + return l10n.albumTierVaults; + case misc: + return l10n.aboutDataUsageMisc; + case internal: + return l10n.aboutDataUsageInternal; + case external: + return l10n.aboutDataUsageExternal; + default: + return d.key; + } + }, + formatValue: (v) => formatFileSize(locale, v, round: 0), + colorize: (context, d) { + final colors = context.read<AvesColorsData>(); + Color? color; + switch (d.key) { + case flutter: + color = colors.fromBrandColor(BrandColors.flutter); + } + return color ?? colors.fromString(d.key); + }, + ); + } +} diff --git a/lib/widgets/about/licenses.dart b/lib/widgets/about/licenses.dart new file mode 100644 index 0000000..3661364 --- /dev/null +++ b/lib/widgets/about/licenses.dart @@ -0,0 +1,139 @@ +import 'package:aves/app_flavor.dart'; +import 'package:aves/model/app/dependencies.dart'; +import 'package:aves/ref/brand_colors.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/about/title.dart'; +import 'package:aves/widgets/common/basic/link_chip.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class Licenses extends StatefulWidget { + const Licenses({super.key}); + + @override + State<Licenses> createState() => _LicensesState(); +} + +class _LicensesState extends State<Licenses> { + final ValueNotifier<String?> _expandedNotifier = ValueNotifier(null); + late List<Dependency> _platform, _flutterPlugins, _flutterPackages, _dartPackages; + + @override + void initState() { + super.initState(); + _platform = List<Dependency>.from(Dependencies.androidDependencies); + _flutterPlugins = List<Dependency>.from(Dependencies.flutterPlugins(context.read<AppFlavor>())); + _flutterPackages = List<Dependency>.from(Dependencies.flutterPackages); + _dartPackages = List<Dependency>.from(Dependencies.dartPackages); + _sortPackages(); + } + + @override + void dispose() { + _expandedNotifier.dispose(); + super.dispose(); + } + + void _sortPackages() { + int compare(Dependency a, Dependency b) => compareAsciiUpperCase(a.name, b.name); + _platform.sort(compare); + _flutterPlugins.sort(compare); + _flutterPackages.sort(compare); + _dartPackages.sort(compare); + } + + @override + Widget build(BuildContext context) { + final colors = context.watch<AvesColorsData>(); + return SliverPadding( + padding: const EdgeInsets.symmetric(horizontal: 8), + sliver: SliverList( + delegate: SliverChildListDelegate( + [ + _buildHeader(), + const SizedBox(height: 16), + AvesExpansionTile( + title: context.l10n.aboutLicensesAndroidLibrariesSectionTitle, + highlightColor: colors.fromBrandColor(BrandColors.android), + expandedNotifier: _expandedNotifier, + children: _platform.map((package) => _LicenseRow(package: package)).toList(), + ), + AvesExpansionTile( + title: context.l10n.aboutLicensesFlutterPluginsSectionTitle, + highlightColor: colors.fromBrandColor(BrandColors.flutter), + expandedNotifier: _expandedNotifier, + children: _flutterPlugins.map((package) => _LicenseRow(package: package)).toList(), + ), + AvesExpansionTile( + title: context.l10n.aboutLicensesFlutterPackagesSectionTitle, + highlightColor: colors.fromBrandColor(BrandColors.flutter), + expandedNotifier: _expandedNotifier, + children: _flutterPackages.map((package) => _LicenseRow(package: package)).toList(), + ), + AvesExpansionTile( + title: context.l10n.aboutLicensesDartPackagesSectionTitle, + highlightColor: colors.fromBrandColor(BrandColors.flutter), + expandedNotifier: _expandedNotifier, + children: _dartPackages.map((package) => _LicenseRow(package: package)).toList(), + ), + Center( + child: AvesOutlinedButton( + label: context.l10n.aboutLicensesShowAllButtonLabel, + onPressed: () => Navigator.maybeOf(context)?.push( + MaterialPageRoute( + builder: (context) => Theme( + data: Theme.of(context).copyWith( + // as of Flutter v3.22.0, `cardColor` is used as a background color by `LicensePage` + cardColor: Themes.firstLayerColor(context), + ), + child: const LicensePage(), + ), + ), + ), + ), + ), + const SizedBox(height: 16), + ], + ), + ), + ); + } + + Widget _buildHeader() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AboutSectionTitle(text: context.l10n.aboutLicensesSectionTitle), + const SizedBox(height: 8), + Text(context.l10n.aboutLicensesBanner), + ], + ), + ); + } +} + +class _LicenseRow extends StatelessWidget { + final Dependency package; + + const _LicenseRow({ + required this.package, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), + child: LinkChip( + text: package.name, + urlString: package.sourceUrl, + ), + ); + } +} diff --git a/lib/widgets/about/policy_page.dart b/lib/widgets/about/policy_page.dart new file mode 100644 index 0000000..0621368 --- /dev/null +++ b/lib/widgets/about/policy_page.dart @@ -0,0 +1,64 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/basic/markdown_container.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class PolicyPage extends StatefulWidget { + static const routeName = '/about/policy'; + + const PolicyPage({super.key}); + + @override + State<PolicyPage> createState() => _PolicyPageState(); +} + +class _PolicyPageState extends State<PolicyPage> { + late Future<String> _termsLoader; + + static const termsPath = 'assets/terms.md'; + static const termsDirection = TextDirection.ltr; + + @override + void initState() { + super.initState(); + _termsLoader = rootBundle.loadString(termsPath); + } + + @override + Widget build(BuildContext context) { + return AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: !settings.useTvLayout, + title: Text(context.l10n.policyPageTitle), + ), + body: SafeArea( + child: FocusableActionDetector( + autofocus: true, + shortcuts: const { + SingleActivator(LogicalKeyboardKey.arrowUp): ScrollIntent(direction: AxisDirection.up, type: ScrollIncrementType.page), + SingleActivator(LogicalKeyboardKey.arrowDown): ScrollIntent(direction: AxisDirection.down, type: ScrollIncrementType.page), + }, + child: Center( + child: FutureBuilder<String>( + future: _termsLoader, + builder: (context, snapshot) { + if (snapshot.hasError || snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final terms = snapshot.data!; + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: MarkdownContainer( + scrollController: PrimaryScrollController.of(context), + data: terms, + textDirection: termsDirection, + ), + ); + }, + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/about/title.dart b/lib/widgets/about/title.dart new file mode 100644 index 0000000..ece76b3 --- /dev/null +++ b/lib/widgets/about/title.dart @@ -0,0 +1,37 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:flutter/material.dart'; + +class AboutSectionTitle extends StatelessWidget { + final String text; + + const AboutSectionTitle({ + super.key, + required this.text, + }); + + @override + Widget build(BuildContext context) { + Widget child = Container( + alignment: AlignmentDirectional.centerStart, + constraints: const BoxConstraints(minHeight: kMinInteractiveDimension), + child: Text(text, style: AStyles.knownTitleText), + ); + + if (settings.useTvLayout) { + child = InkWell( + borderRadius: const BorderRadius.all(Radius.circular(123)), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + child, + ], + ), + ), + ); + } + return child; + } +} diff --git a/lib/widgets/about/translators.dart b/lib/widgets/about/translators.dart new file mode 100644 index 0000000..59ea377 --- /dev/null +++ b/lib/widgets/about/translators.dart @@ -0,0 +1,124 @@ +import 'dart:math'; + +import 'package:aves/model/app/contributors.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/widgets/about/title.dart'; +import 'package:aves/widgets/common/basic/text/change_highlight.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +class AboutTranslators extends StatelessWidget { + const AboutTranslators({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AboutSectionTitle(text: context.l10n.aboutTranslatorsSectionTitle), + const SizedBox(height: 8), + buildBody(context), + const SizedBox(height: 16), + ], + ), + ); + } + + static Widget buildBody(BuildContext context) { + return _RandomTextSpanHighlighter( + spans: Contributors.translators.map((v) => v.name).toList(), + color: Theme.of(context).colorScheme.onSurface, + ); + } +} + +class _RandomTextSpanHighlighter extends StatefulWidget { + final List<String> spans; + final Color color; + + const _RandomTextSpanHighlighter({ + required this.spans, + required this.color, + }); + + @override + State<_RandomTextSpanHighlighter> createState() => _RandomTextSpanHighlighterState(); +} + +class _RandomTextSpanHighlighterState extends State<_RandomTextSpanHighlighter> with SingleTickerProviderStateMixin { + late final AnimationController _controller; + late final CurvedAnimation _animation; + late final Animation<TextStyle> _animatedStyle; + late final TextStyle _baseStyle; + int _highlightedIndex = 0; + + @override + void initState() { + super.initState(); + + final color = widget.color; + _baseStyle = TextStyle( + color: color.withValues(alpha: .7), + shadows: [ + Shadow( + color: color.withValues(alpha: 0), + blurRadius: 0, + ), + ], + ); + final highlightStyle = TextStyle( + color: color.withValues(alpha: 1), + shadows: [ + Shadow( + color: color.withValues(alpha: 1), + blurRadius: 3, + ), + ], + ); + + _controller = + AnimationController( + duration: const Duration(seconds: 1), + vsync: this, + ) + ..addListener(() => setState(() {})) + ..addStatusListener((status) { + if (status == AnimationStatus.forward) { + _highlightedIndex = Random().nextInt(widget.spans.length); + } + }) + ..repeat(reverse: true); + _animation = CurvedAnimation( + parent: _controller, + curve: Curves.easeInOutCubic, + ); + _animatedStyle = ShadowedTextStyleTween(begin: _baseStyle, end: highlightStyle).animate(_animation); + } + + @override + void dispose() { + _animation.dispose(); + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Text.rich( + TextSpan( + children: [ + ...widget.spans.expandIndexed( + (i, v) => [ + if (i != 0) const TextSpan(text: AText.separator), + TextSpan(text: '${Unicode.FSI}$v${Unicode.PDI}', style: i == _highlightedIndex ? _animatedStyle.value : _baseStyle), + ], + ), + ], + ), + ); + } +} diff --git a/lib/widgets/about/tv_license_page.dart b/lib/widgets/about/tv_license_page.dart new file mode 100644 index 0000000..c4c56f3 --- /dev/null +++ b/lib/widgets/about/tv_license_page.dart @@ -0,0 +1,404 @@ +import 'dart:developer' show Flow, Timeline; + +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/behaviour/intents.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart' hide Flow; +import 'package:flutter/scheduler.dart'; +import 'package:flutter/services.dart'; + +// as of Flutter v3.7.7, `LicensePage` is not designed for Android TV +// and gets rejected from Google Play review: +// ``` +// Your app’s text is cut off at the edge of the screen. +// Apps should not display any text or functionality that is partially cut off by the edges of the screen. +// For example, your app (version code 94) in the "Show All Licenses" section text is cut off from the bottom of the screen. +// ``` +class TvLicensePage extends StatefulWidget { + const TvLicensePage({super.key}); + + @override + State<TvLicensePage> createState() => _TvLicensePageState(); +} + +class _TvLicensePageState extends State<TvLicensePage> { + final FocusNode _railFocusNode = FocusNode(); + final ScrollController _detailsScrollController = ScrollController(); + final ValueNotifier<int> _railIndexNotifier = ValueNotifier(0); + + static const double railWidth = 256; + + final Future<_LicenseData> licenses = LicenseRegistry.licenses + .fold<_LicenseData>( + _LicenseData(), + (prev, license) => prev..addLicense(license), + ) + .then((licenseData) => licenseData..sortPackages()); + + @override + void dispose() { + _railIndexNotifier.dispose(); + _railFocusNode.dispose(); + _detailsScrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + title: Text(MaterialLocalizations.of(context).licensesPageTitle), + ), + body: ValueListenableBuilder<int>( + valueListenable: _railIndexNotifier, + builder: (context, selectedIndex, child) { + return FutureBuilder<_LicenseData>( + future: licenses, + builder: (context, snapshot) { + final data = snapshot.data; + if (data == null) { + return const Center( + child: CircularProgressIndicator(), + ); + } + + final packages = data.packages; + final rail = Focus( + focusNode: _railFocusNode, + skipTraversal: true, + canRequestFocus: false, + child: ConstrainedBox( + constraints: BoxConstraints.loose(const Size.fromWidth(railWidth)), + child: ListView.builder( + itemBuilder: (context, index) { + final packageName = packages[index]; + final bindings = data.packageLicenseBindings[packageName]!; + final isSelected = index == selectedIndex; + final theme = Theme.of(context); + return Ink( + color: isSelected ? theme.highlightColor : Themes.firstLayerColor(context), + child: ListTile( + title: Text(packageName), + subtitle: Text(MaterialLocalizations.of(context).licensesPackageDetailText(bindings.length)), + selected: isSelected, + onTap: () => _railIndexNotifier.value = index, + ), + ); + }, + itemCount: packages.length, + ), + ), + ); + + final packageName = packages[selectedIndex]; + final bindings = data.packageLicenseBindings[packageName]!; + + return SafeArea( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(width: 16), + rail, + Expanded( + child: FocusableActionDetector( + shortcuts: const { + SingleActivator(LogicalKeyboardKey.arrowUp): ScrollIntent(direction: AxisDirection.up, type: ScrollIncrementType.page), + SingleActivator(LogicalKeyboardKey.arrowDown): ScrollIntent(direction: AxisDirection.down, type: ScrollIncrementType.page), + }, + actions: { + ScrollIntent: ScrollControllerAction(scrollController: _detailsScrollController), + }, + child: KeyedSubtree( + key: Key(packageName), + child: _PackageLicensePage( + packageName: packageName, + licenseEntries: bindings.map((i) => data.licenses[i]).toList(growable: false), + scrollController: _detailsScrollController, + ), + ), + ), + ), + ], + ), + ); + }, + ); + }, + ), + ); + } +} + +// adapted from Flutter `_LicenseData` in `/material/about.dart` +class _LicenseData { + final List<LicenseEntry> licenses = <LicenseEntry>[]; + final Map<String, List<int>> packageLicenseBindings = <String, List<int>>{}; + final List<String> packages = <String>[]; + + // Special treatment for the first package since it should be the package + // for delivered application. + String? firstPackage; + + void addLicense(LicenseEntry entry) { + // Before the license can be added, we must first record the packages to + // which it belongs. + for (final String package in entry.packages) { + _addPackage(package); + // Bind this license to the package using the next index value. This + // creates a contract that this license must be inserted at this same + // index value. + packageLicenseBindings[package]!.add(licenses.length); + } + licenses.add(entry); // Completion of the contract above. + } + + /// Add a package and initialize package license binding. This is a no-op if + /// the package has been seen before. + void _addPackage(String package) { + if (!packageLicenseBindings.containsKey(package)) { + packageLicenseBindings[package] = <int>[]; + firstPackage ??= package; + packages.add(package); + } + } + + /// Sort the packages using some comparison method, or by the default manner, + /// which is to put the application package first, followed by every other + /// package in case-insensitive alphabetical order. + void sortPackages([int Function(String a, String b)? compare]) { + packages.sort( + compare ?? + (a, b) { + // Based on how LicenseRegistry currently behaves, the first package + // returned is the end user application license. This should be + // presented first in the list. So here we make sure that first package + // remains at the front regardless of alphabetical sorting. + if (a == firstPackage) { + return -1; + } + if (b == firstPackage) { + return 1; + } + return a.toLowerCase().compareTo(b.toLowerCase()); + }, + ); + } +} + +// adapted from Flutter `_PackageLicensePage` in `/material/about.dart` +class _PackageLicensePage extends StatefulWidget { + const _PackageLicensePage({ + required this.packageName, + required this.licenseEntries, + required this.scrollController, + }); + + final String packageName; + final List<LicenseEntry> licenseEntries; + final ScrollController? scrollController; + + @override + _PackageLicensePageState createState() => _PackageLicensePageState(); +} + +class _PackageLicensePageState extends State<_PackageLicensePage> { + @override + void initState() { + super.initState(); + _initLicenses(); + } + + final List<Widget> _licenses = <Widget>[]; + bool _loaded = false; + + Future<void> _initLicenses() async { + int debugFlowId = -1; + assert(() { + final Flow flow = Flow.begin(); + Timeline.timeSync('_initLicenses()', () {}, flow: flow); + debugFlowId = flow.id; + return true; + }()); + for (final LicenseEntry license in widget.licenseEntries) { + if (!mounted) return; + assert(() { + Timeline.timeSync('_initLicenses()', () {}, flow: Flow.step(debugFlowId)); + return true; + }()); + final List<LicenseParagraph> paragraphs = await SchedulerBinding.instance.scheduleTask<List<LicenseParagraph>>( + license.paragraphs.toList, + Priority.animation, + debugLabel: 'License', + ); + if (!mounted) return; + setState(() { + _licenses.add( + const Padding( + padding: EdgeInsets.all(18), + child: Divider(), + ), + ); + for (final LicenseParagraph paragraph in paragraphs) { + if (paragraph.indent == LicenseParagraph.centeredIndent) { + _licenses.add( + Padding( + padding: const EdgeInsets.only(top: 16), + child: Text( + paragraph.text, + style: const TextStyle(fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + ), + ); + } else { + assert(paragraph.indent >= 0); + _licenses.add( + Padding( + padding: EdgeInsetsDirectional.only(top: 8, start: 16.0 * paragraph.indent), + child: Text(paragraph.text), + ), + ); + } + } + }); + } + setState(() { + _loaded = true; + }); + assert(() { + Timeline.timeSync('Build scheduled', () {}, flow: Flow.end(debugFlowId)); + return true; + }()); + } + + @override + Widget build(BuildContext context) { + assert(debugCheckHasMaterialLocalizations(context)); + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final ThemeData theme = Theme.of(context); + final String title = widget.packageName; + final String subtitle = localizations.licensesPackageDetailText(widget.licenseEntries.length); + final double pad = _getGutterSize(context); + final EdgeInsets padding = EdgeInsets.only(left: pad, right: pad, bottom: pad); + final List<Widget> listWidgets = <Widget>[ + ..._licenses, + if (!_loaded) + const Padding( + padding: EdgeInsets.symmetric(vertical: 24), + child: Center( + child: CircularProgressIndicator(), + ), + ), + ]; + + final Widget page; + if (widget.scrollController == null) { + page = Scaffold( + appBar: AppBar( + title: _PackageLicensePageTitle( + title: title, + subtitle: subtitle, + theme: theme.useMaterial3 ? theme.textTheme : theme.primaryTextTheme, + titleTextStyle: theme.appBarTheme.titleTextStyle, + foregroundColor: theme.appBarTheme.foregroundColor, + ), + ), + body: Center( + child: Material( + color: Themes.firstLayerColor(context), + elevation: 4.0, + child: Container( + constraints: BoxConstraints.loose(const Size.fromWidth(600.0)), + child: Localizations.override( + locale: const Locale('en', 'US'), + context: context, + child: ScrollConfiguration( + // A Scrollbar is built-in below. + behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false), + child: Scrollbar( + child: ListView( + primary: true, + padding: padding, + children: listWidgets, + ), + ), + ), + ), + ), + ), + ), + ); + } else { + page = CustomScrollView( + controller: widget.scrollController, + slivers: <Widget>[ + SliverAppBar( + automaticallyImplyLeading: false, + pinned: true, + backgroundColor: Themes.firstLayerColor(context), + title: _PackageLicensePageTitle( + title: title, + subtitle: subtitle, + theme: theme.textTheme, + titleTextStyle: theme.textTheme.titleLarge, + ), + ), + SliverPadding( + padding: padding, + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) => Localizations.override( + locale: const Locale('en', 'US'), + context: context, + child: listWidgets[index], + ), + childCount: listWidgets.length, + ), + ), + ), + ], + ); + } + return DefaultTextStyle( + style: theme.textTheme.bodySmall!, + child: page, + ); + } +} + +class _PackageLicensePageTitle extends StatelessWidget { + const _PackageLicensePageTitle({ + required this.title, + required this.subtitle, + required this.theme, + this.titleTextStyle, + this.foregroundColor, + }); + + final String title; + final String subtitle; + final TextTheme theme; + final TextStyle? titleTextStyle; + final Color? foregroundColor; + + @override + Widget build(BuildContext context) { + final TextStyle? effectiveTitleTextStyle = titleTextStyle ?? theme.titleLarge; + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: <Widget>[ + Text(title, style: effectiveTitleTextStyle?.copyWith(color: foregroundColor)), + Text(subtitle, style: theme.titleSmall?.copyWith(color: foregroundColor)), + ], + ); + } +} + +const int _materialGutterThreshold = 720; +const double _wideGutterSize = 24.0; +const double _narrowGutterSize = 12.0; + +double _getGutterSize(BuildContext context) => MediaQuery.sizeOf(context).width >= _materialGutterThreshold ? _wideGutterSize : _narrowGutterSize; diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart new file mode 100644 index 0000000..6ca8781 --- /dev/null +++ b/lib/widgets/aves_app.dart @@ -0,0 +1,764 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/app_flavor.dart'; +import 'package:aves/app_mode.dart'; +import 'package:aves/geo/uri.dart'; +import 'package:aves/l10n/l10n.dart'; +import 'package:aves/model/app/intent.dart'; +import 'package:aves/model/app_inventory.dart'; +import 'package:aves/model/device.dart'; +import 'package:aves/model/filters/recent.dart'; +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves/model/settings/enums/display_refresh_rate_mode.dart'; +import 'package:aves/model/settings/enums/screen_on.dart'; +import 'package:aves/model/settings/enums/theme_brightness.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/media_store_source.dart'; +import 'package:aves/ref/locales.dart'; +import 'package:aves/services/accessibility_service.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/collection/collection_grid.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/basic/derived_material_localization.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/behaviour/pop/scope.dart'; +import 'package:aves/widgets/common/behaviour/route_tracker.dart'; +import 'package:aves/widgets/common/behaviour/routes.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/providers/durations_provider.dart'; +import 'package:aves/widgets/common/providers/highlight_info_provider.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/common/providers/viewer_entry_provider.dart'; +import 'package:aves/widgets/dialogs/entry_editors/edit_location_dialog.dart'; +import 'package:aves/widgets/home/home_page.dart'; +import 'package:aves/widgets/navigation/tv_page_transitions.dart'; +import 'package:aves/widgets/navigation/tv_rail.dart'; +import 'package:aves/widgets/welcome_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:collection/collection.dart'; +import 'package:dynamic_color/dynamic_color.dart'; +import 'package:equatable/equatable.dart'; +import 'package:event_bus/event_bus.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_localizations_plus/flutter_localizations_plus.dart'; +import 'package:intl/intl.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:overlay_support/overlay_support.dart'; +import 'package:provider/provider.dart'; +import 'package:screen_brightness/screen_brightness.dart'; +import 'package:url_launcher/url_launcher.dart' as ul; +import 'package:aves/remote/remote_controller.dart'; + +class AvesApp extends StatefulWidget { + final AppFlavor flavor; + final Map? debugIntentData; + + // temporary exclude locales not ready yet for prime time + // `ckb`: add `flutter_ckb_localization` and necessary app localization delegates when ready + static final _unsupportedLocales = { + 'az', // Azerbaijani + 'bn', // Bengali + 'ckb', // Kurdish (Central) + 'he', // Hebrew + 'hi', // Hindi + 'hr', // Croatian + 'kmr', // Kurdish (Northern) + 'ml', // Malayalam + 'my', // Burmese + 'ne', // Nepali + 'or', // Odia + 'sat', // Santali + 'sl', // Slovenian + 'sr', // Serbian + 'th', // Thai + 'ur', // Urdu + }.map(Locale.new).toSet(); + static final List<Locale> supportedLocales = AppLocalizations.supportedLocales.where((v) => !_unsupportedLocales.contains(v)).toList(); + static final ValueNotifier<bool> canGestureToOtherApps = ValueNotifier(false); + static final ValueNotifier<bool> isInPictureInPictureMode = ValueNotifier(false); + static final ValueNotifier<EdgeInsets> cutoutInsetsNotifier = ValueNotifier(EdgeInsets.zero); + + // children widgets registering as `WidgetsBinding` observers and implementing `didChangeAppLifecycleState` + // do not receive events fast enough for time sensitive actions (like PiP when leaving by gesture to home) + // so we use this notifier to propagate events as soon as received by the top widget `AvesApp` + static final ValueNotifier<AppLifecycleState> lifecycleStateNotifier = ValueNotifier(AppLifecycleState.detached); + + // do not monitor all `ModalRoute`s, which would include popup menus, + // so that we can react to fullscreen `PageRoute`s only + static final RouteObserver<PageRoute> pageRouteObserver = RouteObserver<PageRoute>(); + + static ScreenBrightness? get screenBrightness => _AvesAppState._screenBrightness; + + static EventBus get intentEventBus => _AvesAppState._intentEventBus; + + const AvesApp({ + super.key, + required this.flavor, + this.debugIntentData, + }); + + @override + State<AvesApp> createState() => _AvesAppState(); + + static void setSystemUIStyle(ThemeData theme) { + final style = systemUIStyleForBrightness(theme.brightness, theme.colorScheme.surfaceContainer); + SystemChrome.setSystemUIOverlayStyle(style); + } + + static SystemUiOverlayStyle systemUIStyleForBrightness(Brightness themeBrightness, Color backgroundColor) { + final barBrightness = themeBrightness == Brightness.dark ? Brightness.light : Brightness.dark; + const statusBarColor = Colors.transparent; + // as of Flutter v3.3.0-0.2.pre, setting `SystemUiOverlayStyle` (whether manually or automatically because of `AppBar`) + // prevents the canvas from drawing behind the nav bar on Android <10 (API <29), + // so the nav bar is opaque, even when requesting `SystemUiMode.edgeToEdge` from Flutter + // or setting `android:windowTranslucentNavigation` in Android themes. + final navBarColor = device.supportEdgeToEdgeUIMode ? Colors.transparent : backgroundColor; + return SystemUiOverlayStyle( + systemNavigationBarColor: navBarColor, + systemNavigationBarDividerColor: navBarColor, + systemNavigationBarIconBrightness: barBrightness, + // shows background scrim when using navigation buttons, but not when using gesture navigation + systemNavigationBarContrastEnforced: true, + statusBarColor: statusBarColor, + statusBarBrightness: barBrightness, + statusBarIconBrightness: barBrightness, + systemStatusBarContrastEnforced: false, + ); + } + + static Future<void> showSystemUI() async { + if (device.supportEdgeToEdgeUIMode) { + await SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); + } else { + await SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); + } + } + + static Future<void> hideSystemUI() async { + await SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); + } + + static Future<void> launchUrl(String? urlString) async { + if (urlString != null) { + final url = Uri.parse(urlString); + if (await ul.canLaunchUrl(url)) { + // address `TV-WB` requirement from https://developer.android.com/docs/quality-guidelines/tv-app-quality + final mode = device.isTelevision ? ul.LaunchMode.inAppWebView : ul.LaunchMode.externalApplication; + try { + await ul.launchUrl(url, mode: mode); + } catch (error, stack) { + debugPrint('failed to open url=$urlString with error=$error\n$stack'); + } + } + } + } +} + +class _AvesAppState extends State<AvesApp> with WidgetsBindingObserver { + final Set<StreamSubscription> _subscriptions = {}; + late final Future<void> _appSetup; + late final Future<bool> _shouldUseBoldFontLoader; + final TvRailController _tvRailController = TvRailController(); + final MediaStoreSource _mediaStoreSource = MediaStoreSource(); + Size? _screenSize; + + final ValueNotifier<PageTransitionsBuilder> _pageTransitionsBuilderNotifier = ValueNotifier(_defaultPageTransitionsBuilder); + final ValueNotifier<TvMediaQueryModifier?> _tvMediaQueryModifierNotifier = ValueNotifier(null); + final ValueNotifier<AppMode> _appModeNotifier = ValueNotifier(AppMode.initialization); + + // observers are not registered when using the same list object with different items + // the list itself needs to be reassigned + List<NavigatorObserver> _navigatorObservers = [AvesApp.pageRouteObserver]; + final EventChannel _mediaStoreChangeChannel = const OptionalEventChannel('deckers.thibault/aves/media_store_change'); + final EventChannel _newIntentChannel = const OptionalEventChannel('deckers.thibault/aves/new_intent_stream'); + final EventChannel _analysisCompletionChannel = const OptionalEventChannel('deckers.thibault/aves/analysis_events'); + final EventChannel _errorChannel = const OptionalEventChannel('deckers.thibault/aves/error'); + final EventChannel _platformWindowChangeChannel = const OptionalEventChannel('deckers.thibault/aves/window_change'); + + static const _defaultPageTransitionsBuilder = PredictiveBackPageTransitionsBuilder(); + static final GlobalKey<NavigatorState> _navigatorKey = GlobalKey(debugLabel: 'app-navigator'); + static ScreenBrightness? _screenBrightness; + static bool _exitedMainByPop = false; + static final EventBus _intentEventBus = EventBus(); + + @override + void initState() { + super.initState(); + EquatableConfig.stringify = true; + _appSetup = _setup(); + _shouldUseBoldFontLoader = AccessibilityService.shouldUseBoldFont(); + _subscriptions.add(_mediaStoreChangeChannel.receiveBroadcastStream().cast<String?>().listen(_mediaStoreSource.onStoreChanged)); + _subscriptions.add(_newIntentChannel.receiveBroadcastStream().cast<Map?>().listen(_onNewIntent)); + _subscriptions.add(_analysisCompletionChannel.receiveBroadcastStream().listen((_) => _onAnalysisCompletion())); + _subscriptions.add(_errorChannel.receiveBroadcastStream().cast<String>().listen(_onError)); + _subscriptions.add(_platformWindowChangeChannel.receiveBroadcastStream().cast<String>().listen(_onWindowChange)); + _updateCutoutInsets(); + _updateWindowMode(); + _appModeNotifier.addListener(_onAppModeChanged); + + debugPrint('start listening to app lifecycle'); + WidgetsBinding.instance.addObserver(this); + AvesApp.lifecycleStateNotifier.value = WidgetsBinding.instance.lifecycleState ?? AppLifecycleState.detached; + } + + @override + void dispose() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + + debugPrint('stop listening to app lifecycle'); + WidgetsBinding.instance.removeObserver(this); + + _pageTransitionsBuilderNotifier.dispose(); + _tvMediaQueryModifierNotifier.dispose(); + _appModeNotifier.dispose(); + _mediaStoreSource.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + // remember screen size to use it later, when `context` and `window` are no longer reliable + _screenSize ??= _getScreenSize(context); + + // place the settings provider above `MaterialApp` + // so it can be used during navigation transitions + return MultiProvider( + providers: [ + Provider<AppFlavor>.value(value: widget.flavor), + ChangeNotifierProvider<Settings>.value(value: settings), + ListenableProvider<ValueNotifier<AppMode>>.value(value: _appModeNotifier), + Provider<CollectionSource>.value(value: _mediaStoreSource), + Provider<TvRailController>.value(value: _tvRailController), + DurationsProvider(), + HighlightInfoProvider(), + ViewerEntryProvider(), + ], + child: NotificationListener<PopExitNotification>( + onNotification: (notification) { + if (_appModeNotifier.value == AppMode.main) { + _exitedMainByPop = true; + } + return true; + }, + child: OverlaySupport( + child: FutureBuilder<void>( + future: _appSetup, + builder: (context, snapshot) { + final initialized = !snapshot.hasError && snapshot.connectionState == ConnectionState.done; + if (initialized) { + AvesApp.showSystemUI(); + } + final home = initialized + ? _getFirstPage(intentData: widget.debugIntentData) + : AvesScaffold( + body: snapshot.hasError ? _buildError(snapshot.error!) : const SizedBox(), + ); + return Selector<Settings, (Locale?, AvesThemeBrightness, bool)>( + selector: (context, s) => ( + s.locale, + s.initialized ? s.themeBrightness : SettingsDefaults.themeBrightness, + s.initialized ? s.enableDynamicColor : SettingsDefaults.enableDynamicColor, + ), + builder: (context, s, child) { + final (settingsLocale, themeBrightness, enableDynamicColor) = s; + return DynamicColorBuilder( + builder: (lightScheme, darkScheme) { + const defaultAccent = AvesColorsData.defaultAccent; + Color lightAccent = defaultAccent, darkAccent = defaultAccent; + if (enableDynamicColor) { + lightAccent = lightScheme?.primary ?? lightAccent; + darkAccent = darkScheme?.primary ?? darkAccent; + } + final lightTheme = Themes.lightTheme(lightAccent, initialized); + final darkTheme = themeBrightness == AvesThemeBrightness.black ? Themes.blackTheme(darkAccent, initialized) : Themes.darkTheme(darkAccent, initialized); + return Shortcuts( + shortcuts: { + // handle Android TV remote `select` button (KEYCODE_DPAD_CENTER) + // the following keys are already handled by default: + // KEYCODE_ENTER, KEYCODE_BUTTON_A, KEYCODE_NUMPAD_ENTER + LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(), + }, + child: Builder( + builder: (context) { + return MediaQuery( + data: MediaQuery.of(context).copyWith( + // disable accessible navigation, as it impacts snack bar action timer + // for all users of apps registered as accessibility services, + // even though they are not for accessibility purposes (like TalkBack is) + accessibleNavigation: false, + ), + child: MaterialApp( + navigatorKey: _navigatorKey, + home: home, + navigatorObservers: _navigatorObservers, + builder: (context, child) => _decorateAppChild( + context: context, + initialized: initialized, + child: child, + ), + onGenerateTitle: (context) => context.l10n.appName, + theme: lightTheme, + darkTheme: darkTheme, + themeMode: themeBrightness.appThemeMode, + locale: settingsLocale, + localizationsDelegates: const [ + // order matters for resolution of sublocales (e.g. `en_Shaw` before `en`) + ...LocalizationsEnShaw.delegates, + ...LocalizationsNn.delegates, + ...AppLocalizations.localizationsDelegates, + ], + supportedLocales: AvesApp.supportedLocales, + scrollBehavior: AvesScrollBehavior(), + ), + ); + }, + ), + ); + }, + ); + }, + ); + }, + ), + ), + ), + ); + } + + Widget _decorateAppChild({ + required BuildContext context, + required bool initialized, + required Widget? child, + }) { + if (initialized) { + WidgetsBinding.instance.addPostFrameCallback((_) => AvesApp.setSystemUIStyle(Theme.of(context))); + } + return Selector<Settings, bool>( + selector: (context, s) => s.initialized ? s.animate : true, + builder: (context, areAnimationsEnabled, child) { + return MaterialLocalizationsRegionalizer( + child: FutureBuilder<bool>( + future: _shouldUseBoldFontLoader, + builder: (context, snapshot) { + // Flutter v3.4 already checks the system `Configuration.fontWeightAdjustment` to update `MediaQuery` + // but we need to also check the non-standard Samsung field `bf` representing the bold font toggle + final shouldUseBoldFont = snapshot.data ?? false; + final mq = MediaQuery.of(context).copyWith( + boldText: shouldUseBoldFont, + ); + return ValueListenableBuilder<TvMediaQueryModifier?>( + valueListenable: _tvMediaQueryModifierNotifier, + builder: (context, modifier, child) { + return MediaQuery( + data: modifier?.call(mq) ?? mq, + child: AvesColorsProvider( + child: ValueListenableBuilder<PageTransitionsBuilder>( + valueListenable: _pageTransitionsBuilderNotifier, + builder: (context, pageTransitionsBuilder, child) { + final theme = Theme.of(context); + return Theme( + data: theme.copyWith( + pageTransitionsTheme: areAnimationsEnabled + ? PageTransitionsTheme(builders: {TargetPlatform.android: pageTransitionsBuilder}) + // strip page transitions used by `MaterialPageRoute` + : const DirectPageTransitionsTheme(), + splashFactory: areAnimationsEnabled ? theme.splashFactory : NoSplash.splashFactory, + ), + child: MediaQueryDataProvider(child: child!), + ); + }, + child: child, + ), + ), + ); + }, + child: child, + ); + }, + ), + ); + }, + child: child, + ); + } + + Widget _buildError(Object error) { + return Container( + alignment: Alignment.center, + padding: const EdgeInsets.all(16), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(AIcons.error), + const SizedBox(height: 16), + Text(error.toString()), + ], + ), + ); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + reportService.log('Lifecycle ${state.name}'); + AvesApp.lifecycleStateNotifier.value = state; + switch (state) { + case AppLifecycleState.inactive: + switch (_appModeNotifier.value) { + case AppMode.main: + case AppMode.pickSingleMediaExternal: + case AppMode.pickMultipleMediaExternal: + _saveTopEntries(); + default: + break; + } + case AppLifecycleState.resumed: + availability.onResume(); + RecentlyAddedFilter.updateNow(); + _mediaStoreSource.checkForChanges(); + RemoteController.instance.onResume(_mediaStoreSource); + break; + + default: + break; + } + } + + @override + void didChangeLocales(List<Locale>? locales) => _applyLocale(); + + Future<void> _onWindowChange(String? code) async { + if (code == null) return; + switch (code) { + case 'cutout_insets': + await _updateCutoutInsets(); + break; + case 'window_mode': + await _updateWindowMode(); + break; + } + } + + Future<void> _updateCutoutInsets() async { + AvesApp.cutoutInsetsNotifier.value = await windowService.getCutoutInsets(); + } + + Future<void> _updateWindowMode() async { + final isInPipMode = await windowService.isInPictureInPictureMode(); + AvesApp.isInPictureInPictureMode.value = isInPipMode; + AvesApp.canGestureToOtherApps.value = await windowService.isInMultiWindowMode() && !isInPipMode; + } + + void _applyLocale() { + settings.resetAppliedLocale(); + + final appliedLocale = settings.appliedLocale; + AStyles.updateStylesForLocale(appliedLocale); + + Locale? countrifiedLocale; + if (appliedLocale.countryCode == null) { + final languageCode = appliedLocale.languageCode; + countrifiedLocale = WidgetsBinding.instance.platformDispatcher.locales.firstWhereOrNull((v) => v.languageCode == languageCode); + } + + final useNativeDigits = !settings.forceWesternArabicNumerals && shouldUseNativeDigits(countrifiedLocale); + DateFormat.useNativeDigitsByDefaultFor(appliedLocale.toString(), useNativeDigits); + DateFormat.useNativeDigitsByDefaultFor(countrifiedLocale.toString(), useNativeDigits); + } + + Widget _getFirstPage({Map? intentData}) => settings.hasAcceptedTerms ? HomePage(intentData: intentData) : const WelcomePage(); + + Size? _getScreenSize(BuildContext context) { + final view = View.of(context); + final physicalSize = view.physicalSize; + final ratio = view.devicePixelRatio; + return physicalSize > Size.zero && ratio > 0 ? physicalSize / ratio : null; + } + + // save IDs of entries visible at the top of the collection page with current layout settings + void _saveTopEntries() { + if (!settings.initialized) return; + + final screenSize = _screenSize; + if (screenSize == null) return; + + var tileExtent = settings.getTileExtent(CollectionPage.routeName); + if (tileExtent == 0) { + tileExtent = screenSize.shortestSide / CollectionGrid.columnCountDefault; + } + final rows = (screenSize.height / tileExtent).ceil(); + final columns = (screenSize.width / tileExtent).ceil(); + final count = rows * columns; + final collection = CollectionLens(source: _mediaStoreSource, listenToSource: false); + settings.topEntryIds = collection.sortedEntries.take(count).map((entry) => entry.id).toList(); + collection.dispose(); + } + + // setup before the first page is displayed. keep it short + Future<void> _setup() async { + final stopwatch = Stopwatch()..start(); + + await device.init(); + await mobileServices.init(); + await settings.init(monitorPlatformSettings: true, shouldSanitize: true); + settings.isRotationLocked = await windowService.isRotationLocked(); + settings.longPressTimeoutMillis = await AccessibilityService.getLongPressTimeout(); + settings.areAnimationsRemoved = await AccessibilityService.areAnimationsRemoved(); + await _onTvLayoutChanged(); + _monitorSettings(); + videoControllerFactory.init(); + videoMetadataFetcher.init(); + + unawaited(deviceService.setLocaleConfig(AvesApp.supportedLocales)); + unawaited(storageService.deleteTempDirectory()); + unawaited(_setupErrorReporting()); + + debugPrint('App setup in ${stopwatch.elapsed.inMilliseconds}ms'); + } + + Future<void> _onTvLayoutChanged() async { + if (settings.useTvLayout) { + settings.applyTvSettings(); + + _pageTransitionsBuilderNotifier.value = const TvPageTransitionsBuilder(); + _tvMediaQueryModifierNotifier.value = (mq) { + // cf https://developer.android.com/training/tv/start/layouts.html#overscan + final screenSize = mq.size; + const overscanFactor = .05; + final overscanInsets = EdgeInsets.symmetric( + vertical: screenSize.shortestSide * overscanFactor, + horizontal: screenSize.longestSide * overscanFactor, + ); + final oldViewPadding = mq.viewPadding; + final newViewPadding = EdgeInsets.only( + top: max(oldViewPadding.top, overscanInsets.top), + right: max(oldViewPadding.right, overscanInsets.right), + bottom: max(oldViewPadding.bottom, overscanInsets.bottom), + left: max(oldViewPadding.left, overscanInsets.left), + ); + var newPadding = newViewPadding - mq.viewInsets; + newPadding = EdgeInsets.only( + top: max(0.0, newPadding.top), + right: max(0.0, newPadding.right), + bottom: max(0.0, newPadding.bottom), + left: max(0.0, newPadding.left), + ); + + return mq.copyWith( + textScaler: const TextScaler.linear(1.1), + padding: newPadding, + viewPadding: newViewPadding, + navigationMode: NavigationMode.directional, + ); + }; + if (settings.forceTvLayout) { + await windowService.requestOrientation(Orientation.landscape); + } + } else { + _pageTransitionsBuilderNotifier.value = _defaultPageTransitionsBuilder; + _tvMediaQueryModifierNotifier.value = null; + await windowService.requestOrientation(null); + } + } + + void _monitorSettings() { + void _applyIsInstalledAppAccessAllowed() { + if (settings.isInstalledAppAccessAllowed) { + appInventory.initAppNames(); + } else { + appInventory.resetAppNames(); + } + } + + void _applyDisplayRefreshRateMode() => settings.displayRefreshRateMode.apply(); + + void _applyMaxBrightness() { + try { + switch (settings.maxBrightness) { + case MaxBrightness.never: + case MaxBrightness.viewerOnly: + AvesApp.screenBrightness?.resetApplicationScreenBrightness(); + case MaxBrightness.always: + AvesApp.screenBrightness?.setApplicationScreenBrightness(1); + } + } on PlatformException catch (e, stack) { + // `screen_brightness` plugin may fail + reportService.recordError(e, stack); + } + } + + void _applyKeepScreenOn() => settings.keepScreenOn.apply(); + + void _applyIsRotationLocked() { + if (!settings.isRotationLocked && !settings.useTvLayout) { + windowService.requestOrientation(); + } + } + + void applyForceTvLayout() { + _onTvLayoutChanged(); + unawaited( + _navigatorKey.currentState!.pushAndRemoveUntil( + MaterialPageRoute( + settings: const RouteSettings(name: HomePage.routeName), + builder: (_) => _getFirstPage(), + ), + (route) => false, + ), + ); + } + + final settingStream = settings.updateStream; + // app + settingStream.where((event) => event.key == SettingKeys.isInstalledAppAccessAllowedKey).listen((_) => _applyIsInstalledAppAccessAllowed()); + settingStream.where((event) => event.key == SettingKeys.localeKey || event.key == SettingKeys.forceWesternArabicNumeralsKey).listen((_) => _applyLocale()); + // display + settingStream.where((event) => event.key == SettingKeys.displayRefreshRateModeKey).listen((_) => _applyDisplayRefreshRateMode()); + settingStream.where((event) => event.key == SettingKeys.maxBrightnessKey).listen((_) => _applyMaxBrightness()); + settingStream.where((event) => event.key == SettingKeys.forceTvLayoutKey).listen((_) => applyForceTvLayout()); + // navigation + settingStream.where((event) => event.key == SettingKeys.keepScreenOnKey).listen((_) => _applyKeepScreenOn()); + // platform settings + settingStream.where((event) => event.key == SettingKeys.platformAccelerometerRotationKey).listen((_) => _applyIsRotationLocked()); + + _applyLocale(); + _applyDisplayRefreshRateMode(); + _applyMaxBrightness(); + _applyKeepScreenOn(); + _applyIsRotationLocked(); + } + + Future<void> _setupErrorReporting() async { + await reportService.init(); + settings.updateStream + .where((event) => event.key == SettingKeys.isErrorReportingAllowedKey) + .listen( + (_) => reportService.setCollectionEnabled(settings.isErrorReportingAllowed), + ); + await reportService.setCollectionEnabled(settings.isErrorReportingAllowed); + + FlutterError.onError = reportService.recordFlutterError; + final now = DateTime.now(); + await reportService.setCustomKeys({ + 'build_mode': kReleaseMode + ? 'release' + : kProfileMode + ? 'profile' + : 'debug', + 'has_mobile_services': mobileServices.isServiceAvailable, + 'is_television': device.isTelevision, + 'locales': WidgetsBinding.instance.platformDispatcher.locales.join(', '), + 'time_zone': '${now.timeZoneName} (${now.timeZoneOffset})', + }); + await reportService.log('Launch'); + setState( + () => _navigatorObservers = [ + AvesApp.pageRouteObserver, + ReportingRouteTracker(), + ], + ); + } + + // at this level `ModalRoute.of(context)` is null, + // so we use the global navigator as a workaround + String? getCurrentRouteName() { + String? currentRoute; + _navigatorKey.currentState?.popUntil((route) { + currentRoute = route.settings.name; + return true; + }); + return currentRoute; + } + + void _onNewIntent(Map<dynamic, dynamic>? intentData) { + reportService.log('New intent data=$intentData'); + + if (_appModeNotifier.value == AppMode.main) { + // do not reset when relaunching the app, except when exiting by pop + final shouldReset = _exitedMainByPop; + _exitedMainByPop = false; + + if (!shouldReset && (intentData ?? {}).values.nonNulls.isEmpty) { + reportService.log('Relaunch'); + return; + } + } + + if (intentData != null) { + final intentAction = intentData[IntentDataKeys.action] as String?; + if (intentAction == IntentActions.viewGeo) { + final locationZoom = parseGeoUri(intentData[IntentDataKeys.uri] as String?); + if (locationZoom != null && getCurrentRouteName() == EditEntryLocationDialog.routeName) { + // do not push a new route but pass the provided location to the dialog + final location = locationZoom.$1; + debugPrint('Use received location $location for input'); + _intentEventBus.fire(LocationReceivedEvent(location)); + return; + } + } + } + + _navigatorKey.currentState!.pushReplacement( + DirectMaterialPageRoute( + settings: const RouteSettings(name: HomePage.routeName), + builder: (_) => _getFirstPage(intentData: intentData), + ), + ); + } + + Future<void> _onAnalysisCompletion() async { + debugPrint('Analysis completed'); + await _mediaStoreSource.loadCatalogMetadata(); + await _mediaStoreSource.loadAddresses(); + _mediaStoreSource.updateDerivedFilters(); + } + + void _onError(String error) => reportService.recordError(error); + + void _onAppModeChanged() { + final appMode = _appModeNotifier.value; + debugPrint('App mode set to $appMode'); + switch (appMode) { + case AppMode.screenSaver: + // we cannot modify brightness without access to the activity + _screenBrightness = null; + default: + _screenBrightness = ScreenBrightness(); + } + } +} + +// Flutter has various overscroll indicator implementations for Android: +// - `StretchingOverscrollIndicator`, default when using Material 3 +// - `GlowingOverscrollIndicator`, default when not using Material 3 +class AvesScrollBehavior extends MaterialScrollBehavior { + @override + Widget buildOverscrollIndicator(BuildContext context, Widget child, ScrollableDetails details) { + final animate = context.select<Settings, bool>((v) => v.animate); + return animate + ? StretchingOverscrollIndicator( + axisDirection: details.direction, + child: child, + ) + : child; + } +} + +typedef TvMediaQueryModifier = MediaQueryData Function(MediaQueryData); + +class LocationReceivedEvent { + final LatLng location; + + const LocationReceivedEvent(this.location); +} diff --git a/lib/widgets/cast/animated_cast_icon.dart b/lib/widgets/cast/animated_cast_icon.dart new file mode 100644 index 0000000..9fe0397 --- /dev/null +++ b/lib/widgets/cast/animated_cast_icon.dart @@ -0,0 +1,103 @@ +// lib/widgets/cast/animated_cast_icon.dart + +import 'package:flutter/material.dart'; +import 'package:aves/widgets/cast/cast_controller.dart'; + +class AnimatedCastIcon extends StatefulWidget { + const AnimatedCastIcon({super.key}); + + @override + State<AnimatedCastIcon> createState() => _AnimatedCastIconState(); +} + +class _AnimatedCastIconState extends State<AnimatedCastIcon> + with SingleTickerProviderStateMixin { + late AnimationController _controller; + + @override + void initState() { + super.initState(); + + _controller = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 700), + )..repeat(reverse: true); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder<CastIconState>( + valueListenable: CastController.instance.castIconState, + builder: (context, state, _) { + switch (state) { + case CastIconState.idle: + return const Icon( + Icons.cast, + color: Colors.black, + size: 26, + ); + + case CastIconState.connected: + return const Icon( + Icons.cast, + color: Colors.blue, + size: 26, + ); + + case CastIconState.connecting: + return _BlinkingCastIcon(controller: _controller); + } + }, + ); + } +} + +// ------------------------------------------------------------ +// ⭐ WIDGET CHE LAMPEGGIA NERO ↔ BLU ↔ NERO +// ------------------------------------------------------------ +class _BlinkingCastIcon extends StatelessWidget { + final AnimationController controller; + + const _BlinkingCastIcon({required this.controller}); + + @override +/* Widget build(BuildContext context) { + return AnimatedBuilder( + animation: controller, + builder: (_, __) { + final color = Color.lerp( + Colors.grey, + Colors.blue, + controller.value, + )!; + + return Icon( + Icons.cast, + color: color, + size: 26, + ); + }, + ); + }*/ +Widget build(BuildContext context) { + return AnimatedBuilder( + animation: controller, + builder: (_, __) { + final opacity = controller.value; // 0 → 1 → 0 + + return Icon( + Icons.cast, + color: Colors.blue.withOpacity(opacity), + size: 26, + ); + }, + ); +} + +} diff --git a/lib/widgets/cast/backends/dlna_cast_backend.dart b/lib/widgets/cast/backends/dlna_cast_backend.dart new file mode 100644 index 0000000..05c3c2e --- /dev/null +++ b/lib/widgets/cast/backends/dlna_cast_backend.dart @@ -0,0 +1,366 @@ +// lib/widgets/cast/backends/dlna_cast_backend.dart +// +// Backend DLNA estratto dal vecchio CastController. +// Gestisce: +// - selezione renderer +// - avvio media server locale +// - cast di una entry +// - slideshow DLNA +// - next/prev manuali +// - heartbeat +// - stop DLNA + +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/cast/cast_server.dart'; +import 'package:aves/widgets/cast/dlna.dart'; + +import '../cast_controller.dart'; + +class DlnaCastBackend extends CastBackendBase { + DlnaCastBackend(super.controller); + + DLNADevice? _renderer; + HttpServer? _mediaServer; + + Timer? _slideshowTimer; + Timer? _heartbeatTimer; + + int _currentIndex = 0; + List<AvesEntry>? _entries; + + // ------------------------------------------------------------ + // API: set renderer dall’esterno (CastIconButton) + // ------------------------------------------------------------ + void setRenderer(DLNADevice device) { + _renderer = device; + } + + // ------------------------------------------------------------ + // FOTO/VIDEO → delay slideshow + // ------------------------------------------------------------ + @override + Duration? getNextDelay(AvesEntry entry) { + final isVideo = entry.mimeType?.startsWith('video') ?? false; + + if (isVideo) { + // 🎬 VIDEO → nessun timer → aspettiamo STOPPED + return null; + } + + // 📸 FOTO → timer 5 secondi + return const Duration(seconds: 5); + } + + // ------------------------------------------------------------ + // Prewarm media server + // ------------------------------------------------------------ + Future<void> ensureMediaServerPrewarm() async { + await _ensureMediaServer(); + } + + // ------------------------------------------------------------ + // START CAST (equivale a fullscreen DLNA) + // ------------------------------------------------------------ + @override + Future<void> startCast(List<AvesEntry> entries, int index) => + startFullscreen(entries, index); + + // ------------------------------------------------------------ + // FULLSCREEN DLNA + // ------------------------------------------------------------ + @override + Future<void> startFullscreen(List<AvesEntry> entries, int index) async { + _entries = entries; + _currentIndex = index; + + controller.castIconState.value = CastIconState.connecting; + controller.isCastingNotifier.value = true; + + await _ensureRenderer(); + await _waitForDlnaReady(); + await _ensureMediaServer(); + + await _castEntry(entries[index]); + + controller.castIconState.value = CastIconState.connected; + } + + // ------------------------------------------------------------ + // SLIDESHOW DLNA (manuale) + // ------------------------------------------------------------ + @override + Future<void> startSlideshow(List<AvesEntry> entries, int index) async { + await startFullscreen(entries, index); + + _slideshowTimer?.cancel(); + _slideshowTimer = Timer.periodic( + const Duration(seconds: 5), + (_) => nextManual(), + ); + } + + // ------------------------------------------------------------ + // QUEUE MANUALE DLNA + // ------------------------------------------------------------ + @override + Future<void> startManualQueue(List<AvesEntry> entries, int index) async { + _entries = entries; + _currentIndex = index; + + controller.castIconState.value = CastIconState.connecting; + controller.isCastingNotifier.value = true; + + await _ensureRenderer(); + await _waitForDlnaReady(); + await _ensureMediaServer(); + + await _castEntry(entries[index]); + + controller.castIconState.value = CastIconState.connected; + } + + // ------------------------------------------------------------ + // NEXT / PREV + // ------------------------------------------------------------ + @override + Future<void> nextManual() async { + if (_entries == null) return; + + _currentIndex++; + if (_currentIndex >= _entries!.length) _currentIndex = 0; + + await _castEntry(_entries![_currentIndex]); + } + + @override + Future<void> prevManual() async { + if (_entries == null) return; + + _currentIndex--; + if (_currentIndex < 0) _currentIndex = _entries!.length - 1; + + await _castEntry(_entries![_currentIndex]); + } + + // ------------------------------------------------------------ + // STOP DLNA + // ------------------------------------------------------------ + @override + Future<void> stopCast() async { + _slideshowTimer?.cancel(); + _slideshowTimer = null; + + _heartbeatTimer?.cancel(); + _heartbeatTimer = null; + + try { + await _renderer?.stop(); + } catch (_) {} + + controller.castIconState.value = CastIconState.idle; + controller.isCastingNotifier.value = false; + } + + // ------------------------------------------------------------ + // CAST ENTRY DLNA + // ------------------------------------------------------------ + Future<void> _castEntry(AvesEntry entry) async { + debugPrint('DLNA: castEntry() renderer=$_renderer entry=${entry.id}'); + + if (_renderer == null) { + debugPrint('DLNA: _castEntry chiamato senza renderer'); + return; + } + + await castServer.ensureStarted(); + + // URL corretto per DLNA: usa il media server DLNA locale + final url = + 'http://${_mediaServer!.address.host}:${_mediaServer!.port}/${entry.id}'; + debugPrint('DLNA: URL generato = $url'); + debugPrint('DLNA: serving entry ${entry.id} at $url'); + + final bool isVideo = (entry.durationMillis ?? 0) > 0; + + try { + await _renderer!.setUrl( + url, + title: entry.bestTitle ?? '', + type: isVideo ? PlayType.Video : PlayType.Image, + ); + } catch (e) { + // Fallback Sony Bravia + if (_isSonyBravia) { + debugPrint('DLNA: fallback Sony Bravia, ritento senza metadata'); + await _renderer!.setUrl( + url, + title: '', + type: PlayType.Image, + ); + } else { + debugPrint('DLNA: errore setUrl → $e'); + return; + } + } + + try { + await _renderer!.play(); + } catch (e) { + debugPrint('DLNA: play non supportato → $e'); + } + + _startHeartbeat(); + } + + // ------------------------------------------------------------ + // HEARTBEAT DLNA + // ------------------------------------------------------------ + void _startHeartbeat() { + _heartbeatTimer?.cancel(); + _heartbeatTimer = Timer.periodic( + const Duration(seconds: 5), + (_) async { + try { + await DLNAHttp.postSoap( + url: _renderer!.avTransportUrl, + serviceType: 'urn:schemas-upnp-org:service:AVTransport:1', + action: 'GetTransportInfo', + body: ''' +<u:GetTransportInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"> + <InstanceID>0</InstanceID> +</u:GetTransportInfo> +''', + ); + } catch (_) {} + }, + ); + } + + // ------------------------------------------------------------ + // MEDIA SERVER LOCALE + // ------------------------------------------------------------ + Future<void> _ensureMediaServer() async { + if (_mediaServer != null) return; + + final interfaces = await NetworkInterface.list( + includeLoopback: false, + type: InternetAddressType.IPv4, + ); + + String? ip; + for (final iface in interfaces) { + for (final addr in iface.addresses) { + if (!addr.isLoopback && addr.address.startsWith('192.168.')) { + ip = addr.address; + break; + } + } + if (ip != null) break; + } + + if (ip == null) return; + + _mediaServer = await HttpServer.bind(ip, 0, shared: true); + + _mediaServer!.listen((req) async { + final id = int.tryParse(req.uri.path.substring(1)); + if (id == null) { + req.response.statusCode = 404; + return req.response.close(); + } + + final entry = _entries?.firstWhere((e) => e.id == id); + if (entry == null) { + req.response.statusCode = 404; + return req.response.close(); + } + + final file = File(entry.path!); + if (!await file.exists()) { + req.response.statusCode = 404; + return req.response.close(); + } + + final length = await file.length(); + final range = req.headers.value('range'); + + if (range == null) { + req.response.headers.set('Content-Type', entry.mimeType); + req.response.headers.set('Content-Length', '$length'); + req.response.headers.set('Accept-Ranges', 'bytes'); + await req.response.addStream(file.openRead()); + return req.response.close(); + } + + final spec = range.substring('bytes='.length); + final parts = spec.split('-'); + int start = int.tryParse(parts[0]) ?? 0; + int end = + parts.length > 1 ? int.tryParse(parts[1]) ?? length - 1 : length - 1; + + start = start.clamp(0, length - 1); + end = end.clamp(start, length - 1); + + req.response.statusCode = 206; + req.response.headers.set('Content-Type', entry.mimeType); + req.response.headers.set('Content-Length', '${end - start + 1}'); + req.response.headers + .set('Content-Range', 'bytes $start-$end/$length'); + req.response.headers.set('Accept-Ranges', 'bytes'); + + await req.response.addStream(file.openRead(start, end + 1)); + return req.response.close(); + }); + } + + // ------------------------------------------------------------ + // RENDERER READY + // ------------------------------------------------------------ + Future<void> _waitForDlnaReady() async { + if (_renderer == null) return; + + for (int i = 0; i < 20; i++) { + try { + final resp = await DLNAHttp.postSoap( + url: _renderer!.avTransportUrl, + serviceType: 'urn:schemas-upnp-org:service:AVTransport:1', + action: 'GetTransportInfo', + body: ''' +<u:GetTransportInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"> + <InstanceID>0</InstanceID> +</u:GetTransportInfo> +''', + ); + + final body = resp.body; + + if (body.contains('STOPPED') || + body.contains('NO_MEDIA_PRESENT')) { + return; + } + } catch (_) {} + + await Future.delayed(const Duration(milliseconds: 300)); + } + } + + // ------------------------------------------------------------ + // HELPERS + // ------------------------------------------------------------ + bool get _isSonyBravia { + final name = _renderer?.info.friendlyName.toLowerCase() ?? ''; + return name.contains('bravia') || name.contains('sony'); + } + + // ------------------------------------------------------------ + // SELEZIONE RENDERER DLNA + // ------------------------------------------------------------ + Future<void> _ensureRenderer() async { + if (_renderer != null) return; + debugPrint('DLNA: _ensureRenderer chiamato senza renderer (setRenderer non ancora usato)'); + } +} diff --git a/lib/widgets/cast/backends/fast_cast_backend.dart b/lib/widgets/cast/backends/fast_cast_backend.dart new file mode 100644 index 0000000..cdee859 --- /dev/null +++ b/lib/widgets/cast/backends/fast_cast_backend.dart @@ -0,0 +1,107 @@ +import 'package:flutter/services.dart'; +import 'package:aves/model/entry/entry.dart'; +import '../cast_controller.dart'; + +class FastCastBackend extends CastBackendBase { + FastCastBackend(super.controller); + + static const _channel = MethodChannel('google_cast'); + + // FAST non usa timer Dart → tutto gestito da CAF + @override + Duration? getNextDelay(AvesEntry entry) => null; + + // ------------------------------------------------------------ + // START CAST (slideshow veloce) + // ------------------------------------------------------------ + @override + Future<void> startCast(List<AvesEntry> entries, int index) => + startSlideshow(entries, index); + + @override + Future<void> startSlideshow(List<AvesEntry> entries, int index) async { + controller.castIconState.value = CastIconState.connecting; + controller.isCastingNotifier.value = true; + + final payload = _buildQueuePayload( + entries: entries, + startIndex: index, + mode: "slideshow", + ); + + await _channel.invokeMethod("fast.loadQueue", payload); + + controller.castIconState.value = CastIconState.connected; + } + + // ------------------------------------------------------------ + // FULLSCREEN = slideshow veloce + // ------------------------------------------------------------ + @override + Future<void> startFullscreen(List<AvesEntry> entries, int index) => + startSlideshow(entries, index); + + // ------------------------------------------------------------ + // START MANUAL QUEUE (slideshow lento) + // ------------------------------------------------------------ + @override + Future<void> startManualQueue(List<AvesEntry> entries, int index) async { + controller.castIconState.value = CastIconState.connecting; + controller.isCastingNotifier.value = true; + + final payload = _buildQueuePayload( + entries: entries, + startIndex: index, + mode: "manual", + ); + + await _channel.invokeMethod("fast.loadQueue", payload); + + controller.castIconState.value = CastIconState.connected; + } + + // ------------------------------------------------------------ + // NEXT / PREV + // ------------------------------------------------------------ + @override + Future<void> nextManual() => + _channel.invokeMethod("fast.next"); + + @override + Future<void> prevManual() => + _channel.invokeMethod("fast.prev"); + + // ------------------------------------------------------------ + // STOP + // ------------------------------------------------------------ + @override + Future<void> stopCast() async { + await _channel.invokeMethod("fast.stop"); + controller.castIconState.value = CastIconState.idle; + controller.isCastingNotifier.value = false; + } + + // ------------------------------------------------------------ + // COSTRUZIONE PAYLOAD PER CAF + // ------------------------------------------------------------ + Map<String, dynamic> _buildQueuePayload({ + required List<AvesEntry> entries, + required int startIndex, + required String mode, // "slideshow" / "manual" + }) { + return { + "mode": mode, + "startIndex": startIndex, + "items": entries.map((e) { + final isVideo = e.mimeType?.startsWith('video') ?? false; + + return { + "id": e.id.toString(), + "url": e.uri, // corretto per AVES + "isVideo": isVideo, + "title": e.bestTitle ?? "", + }; + }).toList(), + }; + } +} diff --git a/lib/widgets/cast/backends/google_cast_backend.dart b/lib/widgets/cast/backends/google_cast_backend.dart new file mode 100644 index 0000000..4d9ba6d --- /dev/null +++ b/lib/widgets/cast/backends/google_cast_backend.dart @@ -0,0 +1,125 @@ +// lib/widgets/cast/backends/google_cast_backend.dart +// +// Backend Google Cast moderno (CAF) +// - Nessuna logica slideshow interna +// - Nessun timer Dart +// - Nessun playerStateNotifier +// - Tutto delegato a GoogleCastController (CAF) + +import 'package:aves/model/entry/entry.dart'; +import '../cast_controller.dart'; +import '../google_cast_controller.dart'; + +class GoogleCastBackend extends CastBackendBase { + GoogleCastBackend(super.controller) { + _bindGoogleNotifiers(); + } + + final google = GoogleCastController.instance; + + // ------------------------------------------------------------ + // SYNC GOOGLE → CastController + // ------------------------------------------------------------ + void _bindGoogleNotifiers() { + google.castIconState.addListener(_sync); + google.isCastingNotifier.addListener(_sync); + google.currentIndexNotifier.addListener(_sync); + google.isPlayingNotifier.addListener(_sync); + google.isBufferingNotifier.addListener(_sync); + google.positionNotifier.addListener(_sync); + google.durationNotifier.addListener(_sync); + google.volumeNotifier.addListener(_sync); + google.isMutedNotifier.addListener(_sync); + + _sync(); + } + + void _sync() { + controller.castIconState.value = google.castIconState.value; + controller.isCastingNotifier.value = google.isCastingNotifier.value; + controller.currentIndexNotifier.value = google.currentIndexNotifier.value; + controller.isPlayingNotifier.value = google.isPlayingNotifier.value; + controller.isBufferingNotifier.value = google.isBufferingNotifier.value; + controller.positionNotifier.value = google.positionNotifier.value; + controller.durationNotifier.value = google.durationNotifier.value; + controller.volumeNotifier.value = google.volumeNotifier.value; + controller.isMutedNotifier.value = google.isMutedNotifier.value; + } + + // ------------------------------------------------------------ + // START CAST (CAF queue) + // ------------------------------------------------------------ + @override + Future<void> startCast(List<AvesEntry> entries, int index) async { + controller.castIconState.value = CastIconState.connecting; + controller.isCastingNotifier.value = true; + + await google.startManualQueue( + entries: entries, + startIndex: index, + ); + + controller.castIconState.value = CastIconState.connected; + } + + @override + Future<void> startFullscreen(List<AvesEntry> entries, int index) => + startCast(entries, index); + + // ------------------------------------------------------------ + // SLIDESHOW (CAF) + // ------------------------------------------------------------ + @override + Future<void> startSlideshow(List<AvesEntry> entries, int index) async { + controller.castIconState.value = CastIconState.connecting; + controller.isCastingNotifier.value = true; + + await google.startSlideshow( + entries: entries, + startIndex: index, + ); + + controller.castIconState.value = CastIconState.connected; + } + + // ------------------------------------------------------------ + // QUEUE MANUALE (CAF) + // ------------------------------------------------------------ + @override + Future<void> startManualQueue(List<AvesEntry> entries, int index) async { + controller.castIconState.value = CastIconState.connecting; + controller.isCastingNotifier.value = true; + + await google.startManualQueue( + entries: entries, + startIndex: index, + ); + + controller.castIconState.value = CastIconState.connected; + } + + // ------------------------------------------------------------ + // NEXT / PREV + // ------------------------------------------------------------ + @override + Future<void> nextManual() => google.nextManual(); + + @override + Future<void> prevManual() => google.prevManual(); + + // ------------------------------------------------------------ + // STOP + // ------------------------------------------------------------ + @override + Future<void> stopCast() async { + await google.stopGoogleCast(); + controller.castIconState.value = CastIconState.idle; + controller.isCastingNotifier.value = false; + } + + // ------------------------------------------------------------ + // CAF gestisce tutto → nessun timer Dart + // ------------------------------------------------------------ + @override + Duration? getNextDelay(AvesEntry entry) => null; +} diff --git a/lib/widgets/cast/cast_controller.dart b/lib/widgets/cast/cast_controller.dart new file mode 100644 index 0000000..5262260 --- /dev/null +++ b/lib/widgets/cast/cast_controller.dart @@ -0,0 +1,147 @@ +// lib/widgets/cast/cast_controller.dart +// NUOVA VERSIONE MODULARE +// - Orchestratore leggero +// - Nessuna logica Google/DLNA/FAST +// - Delega tutto ai backend specializzati + +import 'package:flutter/material.dart'; +import 'package:aves/model/entry/entry.dart'; + +import 'backends/google_cast_backend.dart'; +import 'backends/fast_cast_backend.dart'; +import 'backends/dlna_cast_backend.dart'; + +import 'google_cast_controller.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +enum CastBackend { google, fast, dlna } +enum CastIconState { idle, connecting, connected } + +class CastController { + CastController._(); + static final CastController instance = CastController._(); + + static const _prefBackend = 'cast_backend'; + + // Stato UI unificato (rimane qui) + final castIconState = ValueNotifier(CastIconState.idle); + final isCastingNotifier = ValueNotifier(false); + final currentIndexNotifier = ValueNotifier(0); + + final isPlayingNotifier = ValueNotifier(false); + final isBufferingNotifier = ValueNotifier(false); + final positionNotifier = ValueNotifier(Duration.zero); + final durationNotifier = ValueNotifier(Duration.zero); + + final volumeNotifier = ValueNotifier(1.0); + final isMutedNotifier = ValueNotifier(false); + + // Backend selezionato (persistenza opzionale) + final backendNotifier = ValueNotifier(CastBackend.google); + + // Backend attivo + late CastBackendBase backend; + + // ------------------------------------------------------------ + // SELEZIONE BACKEND + // ------------------------------------------------------------ + Future<void> setBackend(CastBackend type) async { + backendNotifier.value = type; + + // Persistenza + final prefs = await SharedPreferences.getInstance(); + await prefs.setString(_prefBackend, type.name); + + // Ricrea backend + switch (type) { + case CastBackend.google: + backend = GoogleCastBackend(this); + GoogleCastController.instance.activateMethodChannelHandler(); + break; + + case CastBackend.fast: + backend = FastCastBackend(this); + // FAST non deve toccare il MethodChannel Google + break; + + case CastBackend.dlna: + backend = DlnaCastBackend(this); + // DLNA non deve toccare il MethodChannel Google + break; + } + + // Reset stato icona + castIconState.value = CastIconState.idle; + isCastingNotifier.value = false; + } + + Future<void> loadSavedBackend() async { + final prefs = await SharedPreferences.getInstance(); + final saved = prefs.getString(_prefBackend); + + CastBackend type; + + switch (saved) { + case 'google': + type = CastBackend.google; + break; + case 'fast': + type = CastBackend.fast; + break; + case 'dlna': + type = CastBackend.dlna; + break; + default: + type = CastBackend.google; + } + + await setBackend(type); + } + + // ------------------------------------------------------------ + // API UNIFICATA (DELEGA AI BACKEND) + // ------------------------------------------------------------ + + Future<void> startCast(List<AvesEntry> entries, int index) => + backend.startCast(entries, index); + + Future<void> startFullscreen(List<AvesEntry> entries, int index) => + backend.startFullscreen(entries, index); + + Future<void> startSlideshow(List<AvesEntry> entries, int index) => + backend.startSlideshow(entries, index); + + Future<void> startManualQueue(List<AvesEntry> entries, int index) => + backend.startManualQueue(entries, index); + + Future<void> nextManual() => backend.nextManual(); + + Future<void> prevManual() => backend.prevManual(); + + Future<void> stopCast() => backend.stopCast(); + + // ------------------------------------------------------------ + // Accesso diretto al controller Google Cast (per dialog Android) + // ------------------------------------------------------------ + GoogleCastController get google => GoogleCastController.instance; +} + +// ------------------------------------------------------------ +// CLASSE BASE PER TUTTI I BACKEND +// ------------------------------------------------------------ +abstract class CastBackendBase { + final CastController controller; + CastBackendBase(this.controller); + + Future<void> startCast(List<AvesEntry> entries, int index); + Future<void> startFullscreen(List<AvesEntry> entries, int index); + Future<void> startSlideshow(List<AvesEntry> entries, int index); + Future<void> startManualQueue(List<AvesEntry> entries, int index); + + Future<void> nextManual(); + Future<void> prevManual(); + Future<void> stopCast(); + + // PATCH: ogni backend decide il delay dello slideshow + Duration? getNextDelay(AvesEntry entry); +} diff --git a/lib/widgets/cast/cast_state.dart b/lib/widgets/cast/cast_state.dart new file mode 100644 index 0000000..eecb044 --- /dev/null +++ b/lib/widgets/cast/cast_state.dart @@ -0,0 +1,145 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/widgets/dialogs/cast_dialog.dart'; +import 'package:flutter/foundation.dart'; + +class CastState { + CastState._(); + static final CastState instance = CastState._(); + + // Target selezionato (DLNA o altri target custom) + final ValueNotifier<CastTarget?> targetNotifier = ValueNotifier(null); + + // Cast armato (mostra la cast bar) + final ValueNotifier<bool> armedNotifier = ValueNotifier(false); + + // Queue selezionata + final ValueNotifier<List<AvesEntry>> pendingQueueNotifier = + ValueNotifier(const []); + + // Indice corrente + final ValueNotifier<int> currentIndexNotifier = ValueNotifier(0); + + // Da dove è stato armato + final ValueNotifier<String?> sourceRouteNotifier = ValueNotifier(null); + + // --------------------------------------------------------------------------- + // GETTER + // --------------------------------------------------------------------------- + + /// Nome del device mostrato nella Cast Bar + /// + /// NOTA: + /// - Google Cast rimosso (non esiste nella tua build) + /// - DLNA: device noto lato Dart + String? get deviceName { + final t = targetNotifier.value; + + // 🔥 GoogleCastTarget rimosso + // if (t is GoogleCastTarget) return 'Google Cast'; + + if (t is DlnaTarget) { + return t.device.info.friendlyName; + } + + return null; + } + + bool get isArmed => + armedNotifier.value && targetNotifier.value != null; + + List<AvesEntry> get queue => pendingQueueNotifier.value; + + bool get hasPendingQueue => queue.isNotEmpty; + + int get currentIndex => currentIndexNotifier.value; + + set currentIndex(int value) { + if (queue.isEmpty) { + currentIndexNotifier.value = 0; + } else { + if (value < 0) value = 0; + if (value >= queue.length) value = queue.length - 1; + currentIndexNotifier.value = value; + } + currentIndexNotifier.notifyListeners(); + } + + bool get hasPrevious => + queue.isNotEmpty && currentIndex > 0; + + bool get hasNext => + queue.isNotEmpty && currentIndex < queue.length - 1; + + AvesEntry? get previousEntry { + if (!hasPrevious) return null; + currentIndexNotifier.value -= 1; + currentIndexNotifier.notifyListeners(); + return queue[currentIndexNotifier.value]; + } + + AvesEntry? get nextEntry { + if (!hasNext) return null; + currentIndexNotifier.value += 1; + currentIndexNotifier.notifyListeners(); + return queue[currentIndexNotifier.value]; + } + + // --------------------------------------------------------------------------- + // SET QUEUE + // --------------------------------------------------------------------------- + + void setQueue(List<AvesEntry> entries) { + pendingQueueNotifier.value = entries; + currentIndexNotifier.value = 0; + + pendingQueueNotifier.notifyListeners(); + currentIndexNotifier.notifyListeners(); + } + + // --------------------------------------------------------------------------- + // ARM / DISARM + // --------------------------------------------------------------------------- + + void arm( + CastTarget target, { + List<AvesEntry> queue = const [], + String? sourceRoute, + }) { + targetNotifier.value = target; + pendingQueueNotifier.value = queue; + currentIndexNotifier.value = 0; + sourceRouteNotifier.value = sourceRoute; + armedNotifier.value = true; + + targetNotifier.notifyListeners(); + pendingQueueNotifier.notifyListeners(); + currentIndexNotifier.notifyListeners(); + armedNotifier.notifyListeners(); + } + + void updateQueue(List<AvesEntry> queue) { + pendingQueueNotifier.value = queue; + + if (currentIndex >= queue.length) { + currentIndexNotifier.value = 0; + } + + pendingQueueNotifier.notifyListeners(); + currentIndexNotifier.notifyListeners(); + } + + /// Disarma il cast e resetta lo stato UI + /// + /// NOTA: + /// - Non azzeriamo `targetNotifier` per evitare glitch di rebuild + void disarm() { + armedNotifier.value = false; + pendingQueueNotifier.value = const []; + currentIndexNotifier.value = 0; + sourceRouteNotifier.value = null; + + armedNotifier.notifyListeners(); + pendingQueueNotifier.notifyListeners(); + currentIndexNotifier.notifyListeners(); + } +} diff --git a/lib/widgets/cast/dlna.dart b/lib/widgets/cast/dlna.dart new file mode 100644 index 0000000..fd29876 --- /dev/null +++ b/lib/widgets/cast/dlna.dart @@ -0,0 +1,235 @@ +// lib/widgets/cast/dlna.dart +// +// Implementazione DLNA minimale ma reale, pensata per funzionare +// con dlna_cast_controller.dart e upnp.dart, inclusi Sony Bravia. +// +// Espone: +// - DLNADevice +// - DLNAInfo +// - PlayType +// - DLNAHttp +// +// Richiede nel pubspec: +// http: +// xml: +// +// E usa: +// lib/ref/upnp.dart +// + +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:http/http.dart' as http; +import 'package:xml/xml.dart'; + +import 'package:aves/ref/upnp.dart'; + +@immutable +class DLNAInfo { + final String friendlyName; + + const DLNAInfo({ + required this.friendlyName, + }); +} + +enum PlayType { + Video, + Image, +} + +class DLNAHttp { + const DLNAHttp._(); + + static Future<http.Response> postSoap({ + required Uri url, + required String serviceType, + required String action, + required String body, + Duration timeout = const Duration(seconds: 5), + }) async { + final envelope = ''' +<?xml version="1.0" encoding="utf-8"?> +<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" + s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> + <s:Body> + $body + </s:Body> +</s:Envelope> +'''; + + final headers = <String, String>{ + 'Content-Type': 'text/xml; charset="utf-8"', + 'SOAPACTION': '"$serviceType#$action"', + 'Connection': 'Close', + }; + + final resp = await http + .post(url, headers: headers, body: utf8.encode(envelope)) + .timeout(timeout); + + if (resp.statusCode >= 400) { + throw HttpException( + 'DLNA SOAP error ${resp.statusCode} for $action on $url', + uri: url, + ); + } + + return resp; + } +} + +class DLNADevice { + final Uri avTransportUrl; + final Uri connectionManagerUrl; + final DLNAInfo info; + + DLNADevice({ + required this.avTransportUrl, + required this.connectionManagerUrl, + required this.info, + }); + + //────────────────────────────────────────────── + // AVTransport: SetAVTransportURI + //────────────────────────────────────────────── + Future<void> setUrl( + String url, { + required String title, + required PlayType type, + }) async { + // Molti renderer (inclusi Sony Bravia) accettano metadata vuoto. + // Se servirà, si può estendere con DIDL-Lite completo. + final escapedUrl = _xmlEscape(url); + + final body = ''' +<u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"> + <InstanceID>0</InstanceID> + <CurrentURI>$escapedUrl</CurrentURI> + <CurrentURIMetaData></CurrentURIMetaData> +</u:SetAVTransportURI> +'''; + + await DLNAHttp.postSoap( + url: avTransportUrl, + serviceType: 'urn:schemas-upnp-org:service:AVTransport:1', + action: 'SetAVTransportURI', + body: body, + ); + } + + //────────────────────────────────────────────── + // AVTransport: Play + //────────────────────────────────────────────── + Future<void> play() async { + final body = ''' +<u:Play xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"> + <InstanceID>0</InstanceID> + <Speed>1</Speed> +</u:Play> +'''; + + await DLNAHttp.postSoap( + url: avTransportUrl, + serviceType: 'urn:schemas-upnp-org:service:AVTransport:1', + action: 'Play', + body: body, + ); + } + + //────────────────────────────────────────────── + // AVTransport: Stop + //────────────────────────────────────────────── + Future<void> stop() async { + final body = ''' +<u:Stop xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"> + <InstanceID>0</InstanceID> +</u:Stop> +'''; + + await DLNAHttp.postSoap( + url: avTransportUrl, + serviceType: 'urn:schemas-upnp-org:service:AVTransport:1', + action: 'Stop', + body: body, + ); + } + + //────────────────────────────────────────────── + // ConnectionManager: GetProtocolInfo + //────────────────────────────────────────────── + Future<Set<String>> getSinkSupportedMimeTypes() async { + final body = Upnp.getProtocolInfoActionXml(); + + final resp = await DLNAHttp.postSoap( + url: connectionManagerUrl, + serviceType: Upnp.upnpServiceTypeConnectionManager, + action: 'GetProtocolInfo', + body: _extractBody(body), + ); + + final text = resp.body; + final doc = XmlDocument.parse(text); + + // Cerchiamo l'elemento che contiene il sink protocol info. + // I nomi variano tra device, quindi cerchiamo per contenuto. + final sinkNode = doc + .findAllElements('Sink') + .followedBy(doc.findAllElements('SinkProtocolInfo')) + .cast<XmlElement?>() + .firstWhere( + (e) => e != null && e.innerText.trim().isNotEmpty, + orElse: () => null, + ); + + if (sinkNode == null) { + return <String>{}; + } + + final sinkText = sinkNode.innerText.trim(); + if (sinkText.isEmpty) { + return <String>{}; + } + + final protocolInfo = UpnpProtocolInfo(sinkText); + // Ritorniamo solo i MIME type (contentFormat). + return protocolInfo.entries.map((e) => e.contentFormat).toSet(); + } + + //────────────────────────────────────────────── + // Helper + //────────────────────────────────────────────── + static String _xmlEscape(String value) { + return value + .replaceAll('&', '&amp;') + .replaceAll('<', '&lt;') + .replaceAll('>', '&gt;') + .replaceAll('"', '&quot;') + .replaceAll("'", '&apos;'); + } + + // Upnp.getProtocolInfoActionXml() restituisce già un envelope completo. + // Qui estraiamo solo il body interno per riusarlo nel nostro envelope. + static String _extractBody(String envelope) { + try { + final doc = XmlDocument.parse(envelope); + final body = doc.findAllElements('s:Body').firstOrNull ?? + doc.findAllElements('Body').first; + return body.children.map((n) => n.toXmlString()).join(); + } catch (_) { + // In caso di problemi, usiamo l'XML così com'è. + return envelope; + } + } +} + +extension _FirstOrNull<E> on Iterable<E> { + E? get firstOrNull { + final it = iterator; + if (!it.moveNext()) return null; + return it.current; + } +} diff --git a/lib/widgets/cast/dlna_dialog.dart b/lib/widgets/cast/dlna_dialog.dart new file mode 100644 index 0000000..2948e90 --- /dev/null +++ b/lib/widgets/cast/dlna_dialog.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'dlna_manager.dart'; +import 'package:aves/widgets/cast/dlna.dart'; // ⭐ IMPORT NECESSARIO + +class CastDialogDlna extends StatefulWidget { + const CastDialogDlna({super.key}); + + @override + State<CastDialogDlna> createState() => _CastDialogDlnaState(); +} + +class _CastDialogDlnaState extends State<CastDialogDlna> { + final manager = DLNAManager.instance; + List<DLNADevice> devices = []; + bool loading = true; + + @override + void initState() { + super.initState(); + _discover(); + } + + Future<void> _discover() async { + final found = await manager.discover(); + setState(() { + devices = found; + loading = false; + }); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: const Text("Dispositivi DLNA"), + content: SizedBox( + width: 300, + height: 300, + child: loading + ? const Center(child: CircularProgressIndicator()) + : devices.isEmpty + ? const Center(child: Text("Nessun dispositivo trovato")) + : ListView.builder( + itemCount: devices.length, + itemBuilder: (_, i) { + final d = devices[i]; + return ListTile( + title: Text(d.info.friendlyName), + subtitle: Text(d.avTransportUrl.host), + onTap: () => Navigator.pop(context, d), + ); + }, + ), + ), + ); + } +} diff --git a/lib/widgets/cast/dlna_manager.dar b/lib/widgets/cast/dlna_manager.dar new file mode 100644 index 0000000..765c15d --- /dev/null +++ b/lib/widgets/cast/dlna_manager.dar @@ -0,0 +1,232 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/services.dart'; +import 'package:flutter/material.dart'; +import 'package:xml/xml.dart'; + +// ⭐ Usa il DLNADevice VERO (quello con setUrl/play/stop) +import 'package:aves/widgets/cast/dlna.dart'; + +// ⭐ Serve per aprire dialog da qualsiasi punto +import 'package:aves/main.dart' show navigatorKey; + +class DLNAManager { + // ------------------------------------------------------------ + // SINGLETON + // ------------------------------------------------------------ + DLNAManager._(); + static final instance = DLNAManager._(); + + static const _ssdpAddress = "239.255.255.250"; + static const _ssdpPort = 1900; + + static const _channel = MethodChannel("aves/dlna"); + + // ------------------------------------------------------------ + // DISCOVERY DLNA + // ------------------------------------------------------------ + Future<List<DLNADevice>> discover() async { + print("DLNA: discover() START"); + + // 🔥 Acquire multicast lock + try { + print("DLNA: acquiring multicast lock…"); + await _channel.invokeMethod("dlnaAcquireLock"); + print("DLNA: multicast lock ACQUIRED"); + } catch (e) { + print("DLNA: ERROR acquiring lock → $e"); + } + + // 🔥 Bind UDP socket + print("DLNA: binding UDP socket…"); + final socket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 0); + socket.broadcastEnabled = true; + print("DLNA: socket bound on port ${socket.port}"); + + // 🔥 M-SEARCH + const search = ''' +M-SEARCH * HTTP/1.1 +HOST: 239.255.255.250:1900 +MAN: "ssdp:discover" +MX: 2 +ST: urn:schemas-upnp-org:device:MediaRenderer:1 + +'''; + + print("DLNA: sending M-SEARCH…"); + + socket.send( + utf8.encode(search), + InternetAddress(_ssdpAddress), + _ssdpPort, + ); + + print("DLNA: M-SEARCH SENT"); + + final devices = <DLNADevice>[]; + + final completer = Completer<void>(); + final timer = Timer(const Duration(seconds: 2), () { + print("DLNA: timeout reached, finishing discovery"); + completer.complete(); + }); + + socket.listen((event) async { + if (event == RawSocketEvent.read) { + final dg = socket.receive(); + if (dg == null) return; + + print("DLNA: received UDP packet from ${dg.address.address}"); + + final response = utf8.decode(dg.data); + + if (!response.contains("200 OK")) { + print("DLNA: packet ignored (not 200 OK)"); + return; + } + + print("DLNA: SSDP response:\n$response"); + + final location = _extractHeader(response, "LOCATION"); + if (location == null) { + print("DLNA: LOCATION header missing"); + return; + } + + print("DLNA: LOCATION = $location"); + + final device = await _loadDevice(location); + if (device != null) { + print("DLNA: DEVICE FOUND → ${device.info.friendlyName}"); + devices.add(device); + } else { + print("DLNA: device load FAILED"); + } + } + }); + + await completer.future; + timer.cancel(); + socket.close(); + + print("DLNA: discovery FINISHED → ${devices.length} devices found"); + + // 🔥 Release multicast lock + try { + print("DLNA: releasing multicast lock…"); + await _channel.invokeMethod("dlnaReleaseLock"); + print("DLNA: multicast lock RELEASED"); + } catch (e) { + print("DLNA: ERROR releasing lock → $e"); + } + + return devices; + } + + // ------------------------------------------------------------ + // UI DI SELEZIONE DEVICE DLNA + // ------------------------------------------------------------ + Future<DLNADevice?> pickDevice() async { + final devices = await discover(); + if (devices.isEmpty) return null; + + return showDialog<DLNADevice>( + context: navigatorKey.currentContext!, + builder: (context) { + return AlertDialog( + title: const Text("DLNA Devices"), + content: SizedBox( + width: 300, + height: 300, + child: ListView.builder( + itemCount: devices.length, + itemBuilder: (_, i) { + final d = devices[i]; + return ListTile( + title: Text(d.info.friendlyName), + onTap: () => Navigator.pop(context, d), + ); + }, + ), + ), + ); + }, + ); + } + + // ------------------------------------------------------------ + // CARICA DEVICE DESCRIPTION + // ------------------------------------------------------------ + Future<DLNADevice?> _loadDevice(String url) async { + print("DLNA: loading device description from $url"); + + try { + final client = HttpClient(); + final req = await client.getUrl(Uri.parse(url)); + final res = await req.close(); + final xmlStr = await res.transform(utf8.decoder).join(); + + final doc = XmlDocument.parse(xmlStr); + final device = doc.findAllElements("device").first; + + final friendly = device.getElement("friendlyName")?.innerText ?? "DLNA"; + + Uri? avTransport; + Uri? connectionManager; + + for (final s in device.findAllElements("service")) { + final type = s.getElement("serviceType")?.innerText ?? ""; + + if (type.contains("AVTransport")) { + final ctrl = s.getElement("controlURL")?.innerText ?? ""; + avTransport = Uri.parse(_resolveUrl(url, ctrl)); + } + + if (type.contains("ConnectionManager")) { + final ctrl = s.getElement("controlURL")?.innerText ?? ""; + connectionManager = Uri.parse(_resolveUrl(url, ctrl)); + } + } + + if (avTransport == null || connectionManager == null) { + print("DLNA: missing AVTransport or ConnectionManager"); + return null; + } + + return DLNADevice( + avTransportUrl: avTransport, + connectionManagerUrl: connectionManager, + info: DLNAInfo(friendlyName: friendly), + ); + } catch (e) { + print("DLNA: ERROR parsing device → $e"); + return null; + } + } + + // ------------------------------------------------------------ + // HELPERS + // ------------------------------------------------------------ + String _resolveUrl(String base, String path) { + final b = Uri.parse(base); + return Uri( + scheme: b.scheme, + host: b.host, + port: b.port, + path: path.startsWith("/") ? path : "/$path", + ).toString(); + } + + String? _extractHeader(String response, String header) { + for (final line in response.split("\r\n")) { + if (line.toUpperCase().startsWith("$header:")) { + final idx = line.indexOf(":"); + if (idx == -1) return null; + return line.substring(idx + 1).trim(); + } + } + return null; + } +} diff --git a/lib/widgets/cast/dlna_manager.dart b/lib/widgets/cast/dlna_manager.dart new file mode 100644 index 0000000..4618b67 --- /dev/null +++ b/lib/widgets/cast/dlna_manager.dart @@ -0,0 +1,232 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/services.dart'; +import 'package:xml/xml.dart'; + +// ⭐ Usa il DLNADevice VERO (quello con setUrl/play/stop) +import 'package:aves/widgets/cast/dlna.dart'; + +class DLNAManager { + DLNAManager._(); + static final instance = DLNAManager._(); + + static const _ssdpAddress = "239.255.255.250"; + static const _ssdpPort = 1900; + + static const _channel = MethodChannel("aves/dlna"); + + Future<List<DLNADevice>> discover() async { + print("DLNA: discover() START"); + + // 🔥 Acquire multicast lock + try { + print("DLNA: acquiring multicast lock…"); + await _channel.invokeMethod("dlnaAcquireLock"); + print("DLNA: multicast lock ACQUIRED"); + } catch (e) { + print("DLNA: ERROR acquiring lock → $e"); + } + + // 🔥 Bind UDP socket + print("DLNA: binding UDP socket…"); + final socket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 0); + socket.broadcastEnabled = true; + print("DLNA: socket bound on port ${socket.port}"); + + print("DLNA: sending multi‑ST M‑SEARCH…"); + + // ⭐ Lista completa ST per compatibilità massima + final searchTargets = [ + "urn:schemas-upnp-org:device:MediaRenderer:1", // AirScreen, AirReceiver + "ssdp:all", // Sony Bravia + "upnp:rootdevice", // Sony Bravia + "urn:schemas-upnp-org:service:AVTransport:1", // Sony Bravia + "urn:schemas-upnp-org:service:ConnectionManager:1", + ]; + + // ⭐ Multicast M-SEARCH + for (final st in searchTargets) { + final msg = ''' +M-SEARCH * HTTP/1.1 +HOST: 239.255.255.250:1900 +MAN: "ssdp:discover" +MX: 2 +ST: $st + +'''; + + print("DLNA: sending MULTICAST M-SEARCH for ST=$st"); + socket.send( + utf8.encode(msg), + InternetAddress(_ssdpAddress), + _ssdpPort, + ); + } + + // ⭐ Broadcast M-SEARCH (compatibilità router strani) + print("DLNA: sending BROADCAST M‑SEARCH…"); + + for (final st in searchTargets) { + final msg = ''' +M-SEARCH * HTTP/1.1 +HOST: 255.255.255.255:1900 +MAN: "ssdp:discover" +MX: 2 +ST: $st + +'''; + + socket.send( + utf8.encode(msg), + InternetAddress("255.255.255.255"), + 1900, + ); + } + + print("DLNA: M-SEARCH SENT"); + + final devices = <DLNADevice>[]; + + final completer = Completer<void>(); + final timer = Timer(const Duration(seconds: 2), () { + print("DLNA: timeout reached, finishing discovery"); + completer.complete(); + }); + + socket.listen((event) async { + if (event == RawSocketEvent.read) { + final dg = socket.receive(); + if (dg == null) return; + + print("DLNA: received UDP packet from ${dg.address.address}"); + + final response = utf8.decode(dg.data); + + if (!response.contains("200 OK")) { + print("DLNA: packet ignored (not 200 OK)"); + return; + } + + print("DLNA: SSDP response:\n$response"); + + final location = _extractHeader(response, "LOCATION"); + if (location == null) { + print("DLNA: LOCATION header missing"); + return; + } + + print("DLNA: LOCATION = $location"); + + final device = await _loadDevice(location); + if (device != null) { + final loc = Uri.parse(location); + + // ⭐ Filtro anti‑duplicati basato su LOCATION (origin) + friendlyName + final already = devices.any((d) { + return d.avTransportUrl.origin == loc.origin && + d.info.friendlyName == device.info.friendlyName; + }); + + if (!already) { + print("DLNA: DEVICE ADDED (unique) → ${device.info.friendlyName}"); + devices.add(device); + } else { + print("DLNA: DUPLICATE IGNORED for ${device.info.friendlyName}"); + } + } else { + print("DLNA: device load FAILED"); + } + } + }); + + await completer.future; + timer.cancel(); + socket.close(); + + print("DLNA: discovery FINISHED → ${devices.length} devices found"); + + try { + print("DLNA: releasing multicast lock…"); + await _channel.invokeMethod("dlnaReleaseLock"); + print("DLNA: multicast lock RELEASED"); + } catch (e) { + print("DLNA: ERROR releasing lock → $e"); + } + + return devices; + } + + // ⭐ Carica il device description e costruisce il DLNADevice VERO + Future<DLNADevice?> _loadDevice(String url) async { + print("DLNA: loading device description from $url"); + + try { + final client = HttpClient(); + final req = await client.getUrl(Uri.parse(url)); + final res = await req.close(); + final xmlStr = await res.transform(utf8.decoder).join(); + + final doc = XmlDocument.parse(xmlStr); + final device = doc.findAllElements("device").first; + + final friendly = device.getElement("friendlyName")?.innerText ?? "DLNA"; + + // ⭐ Trova i servizi AVTransport e ConnectionManager + Uri? avTransport; + Uri? connectionManager; + + for (final s in device.findAllElements("service")) { + final type = s.getElement("serviceType")?.innerText ?? ""; + + if (type.contains("AVTransport")) { + final ctrl = s.getElement("controlURL")?.innerText ?? ""; + avTransport = Uri.parse(_resolveUrl(url, ctrl)); + } + + if (type.contains("ConnectionManager")) { + final ctrl = s.getElement("controlURL")?.innerText ?? ""; + connectionManager = Uri.parse(_resolveUrl(url, ctrl)); + } + } + + if (avTransport == null || connectionManager == null) { + print("DLNA: missing AVTransport or ConnectionManager"); + return null; + } + + return DLNADevice( + avTransportUrl: avTransport, + connectionManagerUrl: connectionManager, + info: DLNAInfo(friendlyName: friendly), + ); + } catch (e) { + print("DLNA: ERROR parsing device → $e"); + return null; + } + } + + // ⭐ Risolve URL relativi + String _resolveUrl(String base, String path) { + final b = Uri.parse(base); + return Uri( + scheme: b.scheme, + host: b.host, + port: b.port, + path: path.startsWith("/") ? path : "/$path", + ).toString(); + } + + // ⭐ Fix definitivo per LOCATION + String? _extractHeader(String response, String header) { + for (final line in response.split("\r\n")) { + if (line.toUpperCase().startsWith("$header:")) { + final idx = line.indexOf(":"); + if (idx == -1) return null; + return line.substring(idx + 1).trim(); + } + } + return null; + } +} diff --git a/lib/widgets/cast/fast_cast_controller.dart b/lib/widgets/cast/fast_cast_controller.dart new file mode 100644 index 0000000..6f5da66 --- /dev/null +++ b/lib/widgets/cast/fast_cast_controller.dart @@ -0,0 +1,112 @@ +import 'dart:convert'; +import 'package:flutter/services.dart'; +import 'package:aves/model/entry/entry.dart'; +import '../cast_controller.dart'; + +class FastCastBackend extends CastBackendBase { + FastCastBackend(super.controller); + + static const _channel = MethodChannel('google_cast'); + + // FAST non usa timer Dart → tutto gestito da CAF + @override + Duration? getNextDelay(AvesEntry entry) => null; + + // ------------------------------------------------------------ + // START CAST (slideshow veloce) + // ------------------------------------------------------------ + @override + Future<void> startCast(List<AvesEntry> entries, int index) => + startSlideshow(entries, index); + + @override + Future<void> startSlideshow(List<AvesEntry> entries, int index) async { + controller.castIconState.value = CastIconState.connecting; + controller.isCastingNotifier.value = true; + + final json = _buildQueueJson( + entries: entries, + startIndex: index, + mode: "slideshow", + ); + + await _channel.invokeMethod( + "fast.loadQueue", + json, + ); + + controller.castIconState.value = CastIconState.connected; + } + + // ------------------------------------------------------------ + // FULLSCREEN = slideshow veloce + // ------------------------------------------------------------ + @override + Future<void> startFullscreen(List<AvesEntry> entries, int index) => + startSlideshow(entries, index); + + // ------------------------------------------------------------ + // START MANUAL QUEUE (slideshow lento) + // ------------------------------------------------------------ + @override + Future<void> startManualQueue(List<AvesEntry> entries, int index) async { + controller.castIconState.value = CastIconState.connecting; + controller.isCastingNotifier.value = true; + + final json = _buildQueueJson( + entries: entries, + startIndex: index, + mode: "manual", + ); + + await _channel.invokeMethod( + "fast.loadQueue", + json, + ); + + controller.castIconState.value = CastIconState.connected; + } + + // ------------------------------------------------------------ + // NEXT / PREV + // ------------------------------------------------------------ + @override + Future<void> nextManual() => + _channel.invokeMethod("fast.next"); + + @override + Future<void> prevManual() => + _channel.invokeMethod("fast.prev"); + + // ------------------------------------------------------------ + // STOP + // ------------------------------------------------------------ + @override + Future<void> stopCast() async { + await _channel.invokeMethod("fast.stop"); + controller.castIconState.value = CastIconState.idle; + controller.isCastingNotifier.value = false; + } + + // ------------------------------------------------------------ + // COSTRUZIONE QUEUE JSON (CAF) + // ------------------------------------------------------------ + Map<String, dynamic> _buildQueueJson({ + required List<AvesEntry> entries, + required int startIndex, + required String mode, // "slideshow" / "manual" + }) { + return { + "mode": mode, + "startIndex": startIndex, + "items": entries.map((e) { + return { + "id": e.id.toString(), + "url": e.bestUri, + "isVideo": e.isVideo, + "title": e.bestTitle ?? "", + }; + }).toList(), + }; + } +} diff --git a/lib/widgets/cast/google_cast_controller.dart b/lib/widgets/cast/google_cast_controller.dart new file mode 100644 index 0000000..f1c3052 --- /dev/null +++ b/lib/widgets/cast/google_cast_controller.dart @@ -0,0 +1,416 @@ +// lib/widgets/cast/google_cast_controller.dart + +import 'dart:async'; +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:http/http.dart' as http; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/cast/cast_server.dart'; +import 'package:aves/remote/remote_settings.dart'; +import 'package:aves/widgets/cast/cast_controller.dart'; + +class GoogleCastController { + GoogleCastController._() { + _channel.setMethodCallHandler(_onNativeEvent); + + // Timer leggero: aggiorna progress bar ogni 1 secondo + Timer.periodic(const Duration(seconds: 1), (_) { + if (isPlayingNotifier.value) { + final pos = positionNotifier.value + const Duration(seconds: 1); + if (pos < durationNotifier.value) { + positionNotifier.value = pos; + positionNotifier.notifyListeners(); + } + } + }); + } + + static final GoogleCastController instance = GoogleCastController._(); + static const MethodChannel _channel = MethodChannel('google_cast'); + + // ⭐ Attiva Google Cast come proprietario del channel + void activateMethodChannelHandler() { + _channel.setMethodCallHandler(_onNativeEvent); + } + + // ⭐ Disattiva Google Cast quando passi al backend custom + void deactivateMethodChannelHandler() { + } + + // UI state + final ValueNotifier<CastIconState> castIconState = + ValueNotifier(CastIconState.idle); + + final ValueNotifier<bool> isCastingNotifier = ValueNotifier(false); + final ValueNotifier<int> currentIndexNotifier = ValueNotifier(0); + + final ValueNotifier<bool> isPlayingNotifier = ValueNotifier(false); + final ValueNotifier<bool> isBufferingNotifier = ValueNotifier(false); + + final ValueNotifier<Duration> positionNotifier = + ValueNotifier(Duration.zero); + final ValueNotifier<Duration> durationNotifier = + ValueNotifier(Duration.zero); + + final ValueNotifier<double> volumeNotifier = ValueNotifier(1.0); + final ValueNotifier<bool> isMutedNotifier = ValueNotifier(false); + + // slideshow + Timer? _slideshowTimer; + bool _slideshowActive = false; + int _slideshowIntervalSeconds = 5; + + // remote share cache + final Map<String, String> _shareCache = {}; + String? _cachedToken; + DateTime? _tokenExpiry; + + List<String>? resolvedUrls; + List<bool>? resolvedIsVideo; + + int _currentIndex = 0; + bool _currentIsVideo = false; + + Completer<void> _castReadyCompleter = Completer<void>(); + + // ------------------------------------------------------------ + // RESET TOTALE (usato dal selettore backend) + // ------------------------------------------------------------ + void forceReset() { + stopSlideshow(); + resolvedUrls = null; + resolvedIsVideo = null; + _currentIsVideo = false; + _currentIndex = 0; + + castIconState.value = CastIconState.idle; + isCastingNotifier.value = false; + + _castReadyCompleter = Completer<void>(); + _resetPlaybackState(); + } + + // ------------------------------------------------------------ + // TOKEN + // ------------------------------------------------------------ + Future<String> _getToken(RemoteSettings settings) async { + if (_cachedToken != null && + _tokenExpiry != null && + DateTime.now().isBefore(_tokenExpiry!)) { + return _cachedToken!; + } + + final res = await http.post( + Uri.parse("${settings.baseUrl}/auth/login"), + headers: {"Content-Type": "application/json"}, + body: jsonEncode({ + "email": settings.email, + "password": settings.password, + }), + ); + + if (res.statusCode != 200) { + throw Exception("Login remoto fallito"); + } + + final data = jsonDecode(res.body); + _cachedToken = data["token"]; + _tokenExpiry = DateTime.now().add(const Duration(minutes: 10)); + return _cachedToken!; + } + + Future<String> _resolveCastUrl(AvesEntry e) async { + if ((e.origin ?? 0) == 0) { + return castServer.buildUrlForEntry(e); + } + + final remoteId = e.remoteId!; + if (_shareCache.containsKey(remoteId)) { + return _shareCache[remoteId]!; + } + + final settings = await RemoteSettings.load(); + final token = await _getToken(settings); + + final res = await http.post( + Uri.parse("${settings.baseUrl}/share/create"), + headers: { + "Authorization": "Bearer $token", + "Content-Type": "application/json", + }, + body: jsonEncode({ + "entryId": remoteId, + "ttlSeconds": 600, + }), + ); + + final data = jsonDecode(res.body); + final url = (data["url"] as String).replaceFirst("http://", "https://"); + + _shareCache[remoteId] = url; + return url; + } + + // ------------------------------------------------------------ + // EVENTI NATIVI + // ------------------------------------------------------------ + Future<void> _onNativeEvent(MethodCall call) async { + switch (call.method) { + case "onCastReady": + castIconState.value = CastIconState.connected; + isCastingNotifier.value = true; + + if (!_castReadyCompleter.isCompleted) { + _castReadyCompleter.complete(); + } + break; + + case "onCastStopped": + castIconState.value = CastIconState.idle; + isCastingNotifier.value = false; + + resolvedUrls = null; + resolvedIsVideo = null; + _currentIsVideo = false; + _castReadyCompleter = Completer<void>(); + + stopSlideshow(); + _resetPlaybackState(); + break; + + case "onQueueIndexChanged": + final args = (call.arguments as Map?) ?? {}; + final index = args["index"] ?? 0; + final isVideo = args["isVideo"] == true; + + _currentIndex = index; + currentIndexNotifier.value = index; + + _currentIsVideo = isVideo; + + if (_slideshowActive && !isVideo) { + _scheduleNextPhoto(); + } else if (_slideshowActive && isVideo) { + _slideshowTimer?.cancel(); + } + break; + + case "onVideoFinished": + if (_slideshowActive) { + await _channel.invokeMethod('next'); + } + break; + + case "onMediaStatus": + final data = (call.arguments as Map?) ?? {}; + + isPlayingNotifier.value = data["isPlaying"] == true; + isBufferingNotifier.value = data["isBuffering"] == true; + + final pos = (data["position"] as num?)?.toInt() ?? 0; + final dur = (data["duration"] as num?)?.toInt() ?? 0; + + positionNotifier.value = Duration(milliseconds: pos); + durationNotifier.value = Duration(milliseconds: dur); + + positionNotifier.notifyListeners(); + durationNotifier.notifyListeners(); + break; + + case "onVolumeChanged": + final data = (call.arguments as Map?) ?? {}; + + volumeNotifier.value = + ((data["volume"] as num?)?.toDouble() ?? 1.0) + .clamp(0.0, 1.0); + + isMutedNotifier.value = data["isMuted"] == true; + + volumeNotifier.notifyListeners(); + isMutedNotifier.notifyListeners(); + break; + } + } + + void _resetPlaybackState() { + isPlayingNotifier.value = false; + isBufferingNotifier.value = false; + positionNotifier.value = Duration.zero; + durationNotifier.value = Duration.zero; + } + + Future<void> _waitReady() async { + if (_castReadyCompleter.isCompleted) return; + await _castReadyCompleter.future; + } + + // ------------------------------------------------------------ + // QUEUE + // ------------------------------------------------------------ + Future<List<Map<String, dynamic>>> _buildQueue( + List<AvesEntry> entries) async { + + // ⭐⭐⭐ PATCH FONDAMENTALE ⭐⭐⭐ + // Avvia il server Google Cast se non è già attivo + await castServer.ensureStarted(); + + final resolved = await Future.wait(entries.map((e) async { + final url = await _resolveCastUrl(e); + final isVideo = (e.durationMillis ?? 0) > 0; + return { + "url": url, + "isVideo": isVideo, + "mimeType": e.mimeType, + "title": e.bestTitle ?? "", + }; + })); + + resolvedUrls = resolved.map((it) => it["url"] as String).toList(); + resolvedIsVideo = resolved.map((it) => it["isVideo"] as bool).toList(); + + return resolved; + } + + Future<void> startManualQueue({ + required List<AvesEntry> entries, + required int startIndex, + }) async { + currentIndexNotifier.value = startIndex; + _currentIndex = startIndex; + + await _waitReady(); + + final items = await _buildQueue(entries); + + _currentIsVideo = resolvedIsVideo?[startIndex] ?? false; + + await _channel.invokeMethod('loadQueue', { + "items": items, + "startIndex": startIndex, + }); + } + + // ------------------------------------------------------------ + // SLIDESHOW + // ------------------------------------------------------------ + Future<void> startSlideshow({ + required List<AvesEntry> entries, + required int startIndex, + int intervalSeconds = 5, + }) async { + stopSlideshow(); + + _slideshowActive = true; + _slideshowIntervalSeconds = intervalSeconds; + + await _waitReady(); + + await startManualQueue(entries: entries, startIndex: startIndex); + } + + void _scheduleNextPhoto() { + _slideshowTimer?.cancel(); + + if (_currentIsVideo) return; + + _slideshowTimer = Timer( + Duration(seconds: _slideshowIntervalSeconds), + () async { + if (!_slideshowActive) return; + await _channel.invokeMethod('next'); + }, + ); + } + + void stopSlideshow() { + _slideshowTimer?.cancel(); + _slideshowTimer = null; + _slideshowActive = false; + } + + // ------------------------------------------------------------ + // CONTROLLI + // ------------------------------------------------------------ + Future<void> playCast() => _channel.invokeMethod('play'); + + Future<void> pauseCast() => _channel.invokeMethod('pause'); + + Future<void> seekCast(Duration position) async { + final ms = position.inMilliseconds; + + if ((positionNotifier.value.inMilliseconds - ms).abs() < 500) return; + + await _channel.invokeMethod('seekTo', { + "position": ms, + }); + + positionNotifier.value = position; + positionNotifier.notifyListeners(); + } + + Future<void> setCastVolume(double value) async { + final clamped = value.clamp(0.0, 1.0); + + volumeNotifier.value = clamped; + volumeNotifier.notifyListeners(); + + await _channel.invokeMethod('setVolume', { + "volume": clamped, + }); + } + + Future<void> toggleMuteCast() async { + final mute = !isMutedNotifier.value; + + await _channel.invokeMethod('setMute', { + "mute": mute, + }); + + isMutedNotifier.value = mute; + isMutedNotifier.notifyListeners(); + } + + Future<void> nextManual() => _channel.invokeMethod('next'); + Future<void> prevManual() => _channel.invokeMethod('prev'); + + // ------------------------------------------------------------ + // STOP + // ------------------------------------------------------------ + Future<void> stopGoogleCast() async { + stopSlideshow(); + resolvedUrls = null; + resolvedIsVideo = null; + + castIconState.value = CastIconState.idle; + isCastingNotifier.value = false; + + _currentIsVideo = false; + _castReadyCompleter = Completer<void>(); + _resetPlaybackState(); + + return _channel.invokeMethod('stopCast'); + } + + // ------------------------------------------------------------ + // UI + // ------------------------------------------------------------ + Future<void> showGoogleCastDialog() { + CastController.instance.castIconState.value = CastIconState.connecting; + return _channel.invokeMethod('showCastDialog'); + } + + + // ------------------------------------------------------------ + // API pubbliche per FAST backend + // ------------------------------------------------------------ + Future<List<Map<String, dynamic>>> buildQueue(List<AvesEntry> entries) { + return _buildQueue(entries); + } + + MethodChannel get channel => _channel; + + +} + diff --git a/lib/widgets/collection/actions/entry_action_cast.dart b/lib/widgets/collection/actions/entry_action_cast.dart new file mode 100644 index 0000000..2614f62 --- /dev/null +++ b/lib/widgets/collection/actions/entry_action_cast.dart @@ -0,0 +1,104 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/services.dart'; + +/// Gestione CAST. +/// Versione ultra‑ottimizzata, senza album, senza grouping, senza filter_grids. +/// Funziona con il tuo nuovo modello folder‑based + remote origin. +class EntryActionCast { + final BuildContext context; + final List<AvesEntry> entries; + + EntryActionCast(this.context, this.entries); + + // ------------------------------------------------------------ + // ENTRY POINT + // ------------------------------------------------------------ + + Future<void> startCast() async { + if (entries.isEmpty) { + _show('Nessun elemento da inviare al Cast'); + return; + } + + try { + final ok = await _connect(); + if (!ok) { + _show('Nessun dispositivo Cast disponibile'); + return; + } + + await _sendMedia(entries); + _show('Invio al Cast in corso…'); + } catch (e) { + _show('Errore Cast: $e'); + } + } + + // ------------------------------------------------------------ + // CONNECTION + // ------------------------------------------------------------ + + Future<bool> _connect() async { + try { + final connected = await castService.connect(); + return connected; + } catch (_) { + return false; + } + } + + // ------------------------------------------------------------ + // SEND MEDIA + // ------------------------------------------------------------ + + Future<void> _sendMedia(List<AvesEntry> entries) async { + for (final entry in entries) { + await castService.sendMedia( + uri: entry.uri, + mimeType: entry.mimeType, + title: entry.bestTitle, + ); + } + } + + // ------------------------------------------------------------ + // CONTROLS + // ------------------------------------------------------------ + + Future<void> next() async { + try { + await castService.next(); + } catch (e) { + _show('Errore next: $e'); + } + } + + Future<void> previous() async { + try { + await castService.previous(); + } catch (e) { + _show('Errore previous: $e'); + } + } + + Future<void> stop() async { + try { + await castService.stop(); + _show('Cast terminato'); + } catch (e) { + _show('Errore stop: $e'); + } + } + + // ------------------------------------------------------------ + // UTILS + // ------------------------------------------------------------ + + void _show(String msg) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(msg)), + ); + } +} diff --git a/lib/widgets/collection/actions/entry_action_dialogs.dart b/lib/widgets/collection/actions/entry_action_dialogs.dart new file mode 100644 index 0000000..d5900b7 --- /dev/null +++ b/lib/widgets/collection/actions/entry_action_dialogs.dart @@ -0,0 +1,113 @@ +import 'package:flutter/material.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/dialogs/convert_entry_dialog.dart'; + +/// Questo file contiene SOLO i dialog. +/// Nessuna logica, nessuna azione, nessuna dipendenza pesante. +/// Versione ultra‑ottimizzata. + +class EntryActionDialogs { + static Future<bool?> confirmDelete( + BuildContext context, + List<AvesEntry> entries, + ) { + return showDialog<bool>( + context: context, + builder: (_) => AvesConfirmationDialog( + title: 'Elimina', + message: 'Vuoi eliminare ${entries.length} elementi?', + ), + ); + } + + static Future<void> showConvertDialog( + BuildContext context, + AvesEntry entry, + ) { + return showDialog( + context: context, + builder: (_) => ConvertEntryDialog(entry: entry), + ); + } + + static Future<void> showEditDateDialog( + BuildContext context, + List<AvesEntry> entries, + ) { + return showDialog( + context: context, + builder: (_) => EditDateDialog(entries: entries), + ); + } + + static Future<void> showEditLocationDialog( + BuildContext context, + List<AvesEntry> entries, + ) { + return showDialog( + context: context, + builder: (_) => EditLocationDialog(entries: entries), + ); + } + + static Future<void> showEditTitleDescriptionDialog( + BuildContext context, + List<AvesEntry> entries, + ) { + return showDialog( + context: context, + builder: (_) => EditTitleDescriptionDialog(entries: entries), + ); + } + + static Future<void> showEditRatingDialog( + BuildContext context, + List<AvesEntry> entries, + ) { + return showDialog( + context: context, + builder: (_) => EditRatingDialog(entries: entries), + ); + } + + static Future<void> showEditTagsDialog( + BuildContext context, + List<AvesEntry> entries, + ) { + return showDialog( + context: context, + builder: (_) => EditTagsDialog(entries: entries), + ); + } + + static Future<void> showRemoveMetadataDialog( + BuildContext context, + List<AvesEntry> entries, + ) { + return showDialog( + context: context, + builder: (_) => RemoveMetadataDialog(entries: entries), + ); + } + + static Future<void> showSlideshowDialog( + BuildContext context, + List<AvesEntry> entries, + ) { + return showDialog( + context: context, + builder: (_) => SlideshowDialog(entries: entries), + ); + } + + static Future<void> showStatsDialog( + BuildContext context, + List<AvesEntry> entries, + ) { + return showDialog( + context: context, + builder: (_) => StatsDialog(entries: entries), + ); + } +} diff --git a/lib/widgets/collection/actions/entry_action_edit.dart b/lib/widgets/collection/actions/entry_action_edit.dart new file mode 100644 index 0000000..aa1b0de --- /dev/null +++ b/lib/widgets/collection/actions/entry_action_edit.dart @@ -0,0 +1,165 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/services.dart'; + +/// Funzioni di editing sugli entry. +/// Versione ultra‑ottimizzata, senza album, senza grouping, senza filter_grids. +/// Tutta logica pura, nessun dialog. +class EntryActionEdit { + // ------------------------------------------------------------ + // ROTATE + // ------------------------------------------------------------ + + static Future<void> rotateCW( + BuildContext context, + List<AvesEntry> entries, + ) async { + for (final entry in entries) { + try { + await mediaEditService.rotate(entry, clockwise: true); + } catch (e) { + _show(context, 'Errore rotazione: $e'); + } + } + } + + static Future<void> rotateCCW( + BuildContext context, + List<AvesEntry> entries, + ) async { + for (final entry in entries) { + try { + await mediaEditService.rotate(entry, clockwise: false); + } catch (e) { + _show(context, 'Errore rotazione: $e'); + } + } + } + + // ------------------------------------------------------------ + // FLIP + // ------------------------------------------------------------ + + static Future<void> flip( + BuildContext context, + List<AvesEntry> entries, + ) async { + for (final entry in entries) { + try { + await mediaEditService.flip(entry); + } catch (e) { + _show(context, 'Errore flip: $e'); + } + } + } + + // ------------------------------------------------------------ + // METADATA (logica pura, i dialog sono nel file 3) + // ------------------------------------------------------------ + + static Future<void> editDate( + BuildContext context, + List<AvesEntry> entries, + int? newDateMillis, + ) async { + if (newDateMillis == null) return; + + for (final entry in entries) { + try { + await mediaEditService.editDate(entry, newDateMillis); + } catch (e) { + _show(context, 'Errore modifica data: $e'); + } + } + } + + static Future<void> editLocation( + BuildContext context, + List<AvesEntry> entries, + double? lat, + double? lon, + ) async { + if (lat == null || lon == null) return; + + for (final entry in entries) { + try { + await mediaEditService.editLocation(entry, lat, lon); + } catch (e) { + _show(context, 'Errore modifica posizione: $e'); + } + } + } + + static Future<void> editTitleDescription( + BuildContext context, + List<AvesEntry> entries, + String? title, + String? description, + ) async { + for (final entry in entries) { + try { + await mediaEditService.editTitleDescription( + entry, + title: title, + description: description, + ); + } catch (e) { + _show(context, 'Errore modifica titolo/descrizione: $e'); + } + } + } + + static Future<void> editRating( + BuildContext context, + List<AvesEntry> entries, + int? rating, + ) async { + if (rating == null) return; + + for (final entry in entries) { + try { + await mediaEditService.editRating(entry, rating); + } catch (e) { + _show(context, 'Errore modifica rating: $e'); + } + } + } + + static Future<void> editTags( + BuildContext context, + List<AvesEntry> entries, + Set<String> tags, + ) async { + for (final entry in entries) { + try { + await mediaEditService.editTags(entry, tags); + } catch (e) { + _show(context, 'Errore modifica tag: $e'); + } + } + } + + static Future<void> removeMetadata( + BuildContext context, + List<AvesEntry> entries, + ) async { + for (final entry in entries) { + try { + await mediaEditService.removeMetadata(entry); + } catch (e) { + _show(context, 'Errore rimozione metadata: $e'); + } + } + } + + // ------------------------------------------------------------ + // UTILS + // ------------------------------------------------------------ + + static void _show(BuildContext context, String msg) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(msg)), + ); + } +} diff --git a/lib/widgets/collection/actions/entry_action_handlers.dart b/lib/widgets/collection/actions/entry_action_handlers.dart new file mode 100644 index 0000000..9dfc816 --- /dev/null +++ b/lib/widgets/collection/actions/entry_action_handlers.dart @@ -0,0 +1,263 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/collection/actions/entry_actions.dart'; +import 'package:aves/widgets/collection/actions/entry_action_dialogs.dart'; +import 'package:aves/widgets/collection/actions/entry_action_edit.dart'; +import 'package:aves/widgets/collection/actions/entry_action_cast.dart'; +import 'package:aves/widgets/collection/actions/entry_action_utils.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/dialogs/convert_entry_dialog.dart'; +import 'package:aves/widgets/map/map_page.dart'; +import 'package:aves/widgets/common/search/route.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; + +/// Gestore principale delle azioni sugli entry. +/// Versione ultra‑ottimizzata, senza album, senza filter_grids. +class EntryActionHandlers { + final BuildContext context; + final CollectionLens collection; + final AvesSelection selection; + + EntryActionHandlers({ + required this.context, + required this.collection, + required this.selection, + }); + + /// Esegue l’azione richiesta. + Future<void> run(EntryAction action) async { + final entries = selection.selectedEntries.toList(); + if (entries.isEmpty && !_actionAllowsEmptySelection(action)) { + return; + } + + switch (action) { + // Navigazione + case EntryAction.configureView: + return _configureView(); + case EntryAction.searchCollection: + return _search(); + case EntryAction.map: + return _openMap(entries); + case EntryAction.slideshow: + return _slideshow(entries); + case EntryAction.stats: + return _stats(entries); + case EntryAction.rescan: + return _rescan(); + + // Selezione + case EntryAction.select: + return selection.toggle(entries.first); + case EntryAction.selectAll: + return selection.selectAll(); + case EntryAction.selectNone: + return selection.clear(); + + // Cast + case EntryAction.cast: + return EntryActionCast(context, entries).startCast(); + + // File operations + case EntryAction.share: + return _share(entries); + case EntryAction.delete: + return _delete(entries); + case EntryAction.copy: + return _copy(entries); + case EntryAction.move: + return _move(entries); + case EntryAction.rename: + return _rename(entries); + case EntryAction.convert: + return _convert(entries); + + // Metadata + case EntryAction.toggleFavourite: + return _toggleFavourite(entries); + case EntryAction.rotateCW: + return EntryActionEdit.rotateCW(context, entries); + case EntryAction.rotateCCW: + return EntryActionEdit.rotateCCW(context, entries); + case EntryAction.flip: + return EntryActionEdit.flip(context, entries); + case EntryAction.editDate: + return _editDate(entries); + case EntryAction.editLocation: + return _editLocation(entries); + case EntryAction.editTitleDescription: + return _editTitleDescription(entries); + case EntryAction.editRating: + return _editRating(entries); + case EntryAction.editTags: + return _editTags(entries); + case EntryAction.removeMetadata: + return _removeMetadata(entries); + } + } + + // ------------------------------------------------------------ + // NAVIGAZIONE + // ------------------------------------------------------------ + + Future<void> _configureView() async { + settings.configureView = !settings.configureView; + } + + Future<void> _search() async { + Navigator.push( + context, + SearchPageRoute( + collection: collection, + ), + ); + } + + Future<void> _openMap(List<AvesEntry> entries) async { + if (entries.isEmpty) return; + Navigator.push( + context, + MaterialPageRoute( + builder: (_) => MapPage(entries: entries), + ), + ); + } + + Future<void> _slideshow(List<AvesEntry> entries) async { + await showDialog( + context: context, + builder: (_) => SlideshowDialog(entries: entries), + ); + } + + Future<void> _stats(List<AvesEntry> entries) async { + await showDialog( + context: context, + builder: (_) => StatsDialog(entries: entries), + ); + } + + Future<void> _rescan() async { + await collection.source.reload(); + } + + // ------------------------------------------------------------ + // FILE OPERATIONS + // ------------------------------------------------------------ + + Future<void> _share(List<AvesEntry> entries) async { + await appService.share(entries); + } + + Future<void> _delete(List<AvesEntry> entries) async { + final confirmed = await showDialog<bool>( + context: context, + builder: (_) => AvesConfirmationDialog( + title: 'Elimina', + message: 'Vuoi eliminare ${entries.length} elementi?', + ), + ); + if (confirmed != true) return; + + await appService.delete(entries); + selection.clear(); + } + + Future<void> _copy(List<AvesEntry> entries) async { + await EntryActionUtils.copyEntries(context, entries); + } + + Future<void> _move(List<AvesEntry> entries) async { + await EntryActionUtils.moveEntries(context, entries); + } + + Future<void> _rename(List<AvesEntry> entries) async { + if (entries.length != 1) return; + + await Navigator.push( + context, + MaterialPageRoute( + builder: (_) => RenameEntrySetPage(entries: entries), + ), + ); + } + + Future<void> _convert(List<AvesEntry> entries) async { + if (entries.length != 1) return; + + await showDialog( + context: context, + builder: (_) => ConvertEntryDialog(entry: entries.first), + ); + } + + // ------------------------------------------------------------ + // METADATA + // ------------------------------------------------------------ + + Future<void> _toggleFavourite(List<AvesEntry> entries) async { + for (final entry in entries) { + entry.toggleFavourite(); + } + } + + Future<void> _editDate(List<AvesEntry> entries) async { + await showDialog( + context: context, + builder: (_) => EditDateDialog(entries: entries), + ); + } + + Future<void> _editLocation(List<AvesEntry> entries) async { + await showDialog( + context: context, + builder: (_) => EditLocationDialog(entries: entries), + ); + } + + Future<void> _editTitleDescription(List<AvesEntry> entries) async { + await showDialog( + context: context, + builder: (_) => EditTitleDescriptionDialog(entries: entries), + ); + } + + Future<void> _editRating(List<AvesEntry> entries) async { + await showDialog( + context: context, + builder: (_) => EditRatingDialog(entries: entries), + ); + } + + Future<void> _editTags(List<AvesEntry> entries) async { + await showDialog( + context: context, + builder: (_) => EditTagsDialog(entries: entries), + ); + } + + Future<void> _removeMetadata(List<AvesEntry> entries) async { + await showDialog( + context: context, + builder: (_) => RemoveMetadataDialog(entries: entries), + ); + } + + // ------------------------------------------------------------ + // UTILS + // ------------------------------------------------------------ + + bool _actionAllowsEmptySelection(EntryAction action) { + return { + EntryAction.configureView, + EntryAction.searchCollection, + EntryAction.rescan, + }.contains(action); + } +} diff --git a/lib/widgets/collection/actions/entry_action_utils.dart b/lib/widgets/collection/actions/entry_action_utils.dart new file mode 100644 index 0000000..5ccc9ed --- /dev/null +++ b/lib/widgets/collection/actions/entry_action_utils.dart @@ -0,0 +1,99 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; + +/// Funzioni di utilità per le azioni sugli entry. +/// Versione ultra‑ottimizzata, senza album, senza grouping, senza filter_grids. +class EntryActionUtils { + // ------------------------------------------------------------ + // COPY + // ------------------------------------------------------------ + + static Future<void> copyEntries( + BuildContext context, + List<AvesEntry> entries, + ) async { + if (entries.isEmpty) return; + + final targetDir = await _pickTargetDirectory(context); + if (targetDir == null) return; + + for (final entry in entries) { + try { + await mediaEditService.copyEntry(entry, targetDir); + } catch (e) { + _show(context, 'Errore copia: $e'); + } + } + + _show(context, 'Copia completata'); + } + + // ------------------------------------------------------------ + // MOVE + // ------------------------------------------------------------ + + static Future<void> moveEntries( + BuildContext context, + List<AvesEntry> entries, + ) async { + if (entries.isEmpty) return; + + final targetDir = await _pickTargetDirectory(context); + if (targetDir == null) return; + + for (final entry in entries) { + try { + await mediaEditService.moveEntry(entry, targetDir); + } catch (e) { + _show(context, 'Errore spostamento: $e'); + } + } + + _show(context, 'Spostamento completato'); + } + + // ------------------------------------------------------------ + // DIRECTORY PICKER (semplice e moderno) + // ------------------------------------------------------------ + + static Future<String?> _pickTargetDirectory(BuildContext context) async { + try { + final dir = await appService.pickDirectory(); + return dir; + } catch (e) { + _show(context, 'Errore selezione cartella: $e'); + return null; + } + } + + // ------------------------------------------------------------ + // DELETE CONFIRMATION (usato anche da altri handler) + // ------------------------------------------------------------ + + static Future<bool> confirmDelete( + BuildContext context, + int count, + ) async { + final result = await showDialog<bool>( + context: context, + builder: (_) => AvesConfirmationDialog( + title: 'Elimina', + message: 'Vuoi eliminare $count elementi?', + ), + ); + return result == true; + } + + // ------------------------------------------------------------ + // UTILS + // ------------------------------------------------------------ + + static void _show(BuildContext context, String msg) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(msg)), + ); + } +} diff --git a/lib/widgets/collection/actions/entry_actions.dart b/lib/widgets/collection/actions/entry_actions.dart new file mode 100644 index 0000000..1fadf67 --- /dev/null +++ b/lib/widgets/collection/actions/entry_actions.dart @@ -0,0 +1,190 @@ +import 'package:flutter/material.dart'; + +/// Tutte le azioni disponibili nella Collection. +/// Versione ultra‑ottimizzata, senza album, senza filter_grids. +enum EntryAction { + // Navigazione + configureView, + searchCollection, + map, + slideshow, + stats, + rescan, + + // Selezione + select, + selectAll, + selectNone, + + // Cast + cast, + + // File operations + share, + delete, + copy, + move, + rename, + convert, + + // Metadata + toggleFavourite, + rotateCW, + rotateCCW, + flip, + editDate, + editLocation, + editTitleDescription, + editRating, + editTags, + removeMetadata, +} + +/// Categoria per raggruppare le azioni nel menu. +enum EntryActionCategory { + navigation, + selection, + cast, + fileOps, + metadata, +} + +/// Mappa azione → categoria +const Map<EntryAction, EntryActionCategory> entryActionCategory = { + // Navigazione + EntryAction.configureView: EntryActionCategory.navigation, + EntryAction.searchCollection: EntryActionCategory.navigation, + EntryAction.map: EntryActionCategory.navigation, + EntryAction.slideshow: EntryActionCategory.navigation, + EntryAction.stats: EntryActionCategory.navigation, + EntryAction.rescan: EntryActionCategory.navigation, + + // Selezione + EntryAction.select: EntryActionCategory.selection, + EntryAction.selectAll: EntryActionCategory.selection, + EntryAction.selectNone: EntryActionCategory.selection, + + // Cast + EntryAction.cast: EntryActionCategory.cast, + + // File operations + EntryAction.share: EntryActionCategory.fileOps, + EntryAction.delete: EntryActionCategory.fileOps, + EntryAction.copy: EntryActionCategory.fileOps, + EntryAction.move: EntryActionCategory.fileOps, + EntryAction.rename: EntryActionCategory.fileOps, + EntryAction.convert: EntryActionCategory.fileOps, + + // Metadata + EntryAction.toggleFavourite: EntryActionCategory.metadata, + EntryAction.rotateCW: EntryActionCategory.metadata, + EntryAction.rotateCCW: EntryActionCategory.metadata, + EntryAction.flip: EntryActionCategory.metadata, + EntryAction.editDate: EntryActionCategory.metadata, + EntryAction.editLocation: EntryActionCategory.metadata, + EntryAction.editTitleDescription: EntryActionCategory.metadata, + EntryAction.editRating: EntryActionCategory.metadata, + EntryAction.editTags: EntryActionCategory.metadata, + EntryAction.removeMetadata: EntryActionCategory.metadata, +}; + +/// Icone per ogni azione +const Map<EntryAction, IconData> entryActionIcon = { + // Navigazione + EntryAction.configureView: Icons.tune, + EntryAction.searchCollection: Icons.search, + EntryAction.map: Icons.map, + EntryAction.slideshow: Icons.slideshow, + EntryAction.stats: Icons.bar_chart, + EntryAction.rescan: Icons.refresh, + + // Selezione + EntryAction.select: Icons.check_circle, + EntryAction.selectAll: Icons.select_all, + EntryAction.selectNone: Icons.remove_done, + + // Cast + EntryAction.cast: Icons.cast, + + // File operations + EntryAction.share: Icons.share, + EntryAction.delete: Icons.delete, + EntryAction.copy: Icons.copy, + EntryAction.move: Icons.drive_file_move, + EntryAction.rename: Icons.edit, + EntryAction.convert: Icons.transform, + + // Metadata + EntryAction.toggleFavourite: Icons.favorite, + EntryAction.rotateCW: Icons.rotate_right, + EntryAction.rotateCCW: Icons.rotate_left, + EntryAction.flip: Icons.flip, + EntryAction.editDate: Icons.event, + EntryAction.editLocation: Icons.place, + EntryAction.editTitleDescription: Icons.text_fields, + EntryAction.editRating: Icons.star, + EntryAction.editTags: Icons.label, + EntryAction.removeMetadata: Icons.no_accounts, +}; + +/// Etichette leggibili +String entryActionLabel(EntryAction action) { + switch (action) { + case EntryAction.configureView: + return 'Configura vista'; + case EntryAction.searchCollection: + return 'Cerca'; + case EntryAction.map: + return 'Mappa'; + case EntryAction.slideshow: + return 'Slideshow'; + case EntryAction.stats: + return 'Statistiche'; + case EntryAction.rescan: + return 'Riscansiona'; + + case EntryAction.select: + return 'Seleziona'; + case EntryAction.selectAll: + return 'Seleziona tutto'; + case EntryAction.selectNone: + return 'Deseleziona tutto'; + + case EntryAction.cast: + return 'Cast'; + + case EntryAction.share: + return 'Condividi'; + case EntryAction.delete: + return 'Elimina'; + case EntryAction.copy: + return 'Copia'; + case EntryAction.move: + return 'Sposta'; + case EntryAction.rename: + return 'Rinomina'; + case EntryAction.convert: + return 'Converti'; + + case EntryAction.toggleFavourite: + return 'Preferito'; + case EntryAction.rotateCW: + return 'Ruota CW'; + case EntryAction.rotateCCW: + return 'Ruota CCW'; + case EntryAction.flip: + return 'Specchia'; + case EntryAction.editDate: + return 'Modifica data'; + case EntryAction.editLocation: + return 'Modifica posizione'; + case EntryAction.editTitleDescription: + return 'Modifica titolo/descrizione'; + case EntryAction.editRating: + return 'Modifica rating'; + case EntryAction.editTags: + return 'Modifica tag'; + case EntryAction.removeMetadata: + return 'Rimuovi metadata'; + } +} diff --git a/lib/widgets/collection/album_actions.dart b/lib/widgets/collection/album_actions.dart new file mode 100644 index 0000000..18d4eb7 --- /dev/null +++ b/lib/widgets/collection/album_actions.dart @@ -0,0 +1,307 @@ +import 'package:flutter/material.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/file_utils.dart'; + +import 'album_controller.dart'; +import 'album_sort.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; + +class AlbumActions { + // ============================================================ + // MENU RAPIDO (3 dots) + // ============================================================ + static void showMenu(BuildContext context, AlbumRow album) { + showModalBottomSheet<void>( + context: context, + backgroundColor: Colors.grey.shade900, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(16)), + ), + builder: (context) { + return buildBottomSheet( + context: context, + controller: AlbumController.of(context), + album: album, + ); + }, + ); + } + + // ============================================================ + // BOTTOM SHEET COMPLETO + // ============================================================ + static Widget buildBottomSheet({ + required BuildContext context, + required AlbumController controller, + required AlbumRow album, + }) { + return SafeArea( + child: Wrap( + children: [ + _item( + icon: Icons.folder_open, + text: 'Apri album', + onTap: () { + Navigator.pop(context); + openAlbum(context, album); + }, + ), + _item( + icon: Icons.drive_file_rename_outline, + text: 'Rinomina', + onTap: () { + Navigator.pop(context); + renameAlbum(context, controller, album); + }, + ), + _item( + icon: Icons.image, + text: 'Cambia cover', + onTap: () { + Navigator.pop(context); + changeCover(context, controller, album); + }, + ), + _item( + icon: album.priority > 0 ? Icons.push_pin : Icons.push_pin_outlined, + text: album.priority > 0 ? 'Unpin' : 'Pin', + onTap: () { + Navigator.pop(context); + controller.togglePin(album); + }, + ), + _item( + icon: album.hidden ? Icons.visibility : Icons.visibility_off, + text: album.hidden ? 'Mostra album' : 'Nascondi album', + onTap: () { + Navigator.pop(context); + controller.toggleHidden(album); + }, + ), + _item( + icon: Icons.delete, + text: 'Elimina album', + onTap: () { + Navigator.pop(context); + deleteAlbum(context, controller, album); + }, + ), + _item( + icon: Icons.share, + text: 'Condividi album', + onTap: () { + Navigator.pop(context); + shareAlbum(album); + }, + ), + _item( + icon: Icons.info, + text: 'Info album', + onTap: () { + Navigator.pop(context); + showInfo(context, album); + }, + ), + _item( + icon: Icons.folder, + text: 'Apri nel file manager', + onTap: () { + Navigator.pop(context); + openInFileManager(album); + }, + ), + ], + ), + ); + } + + static Widget _item({ + required IconData icon, + required String text, + required VoidCallback onTap, + }) { + return ListTile( + leading: Icon(icon, color: Colors.white), + title: Text(text, style: const TextStyle(color: Colors.white)), + onTap: onTap, + ); + } + + // ============================================================ + // APRI ALBUM → CollectionPage + // ============================================================ + static void openAlbum(BuildContext context, AlbumRow album) { + Navigator.push( + context, + MaterialPageRoute( + builder: (_) => CollectionPage( + folderPath: album.path, // ⭐ niente PathFilter + albumName: album.displayName, + ), + ), + ); + } + + // ============================================================ + // RINOMINA + // ============================================================ + static Future<void> renameAlbum( + BuildContext context, + AlbumController controller, + AlbumRow album, + ) async { + final controllerText = TextEditingController(text: album.displayName); + + final newName = await showDialog<String>( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Colors.grey.shade900, + title: const Text('Rinomina album', style: TextStyle(color: Colors.white)), + content: TextField( + controller: controllerText, + autofocus: true, + style: const TextStyle(color: Colors.white), + decoration: const InputDecoration( + hintText: 'Nuovo nome', + hintStyle: TextStyle(color: Colors.white54), + ), + ), + actions: [ + TextButton( + child: const Text('Annulla'), + onPressed: () => Navigator.pop(context), + ), + TextButton( + child: const Text('OK'), + onPressed: () => Navigator.pop(context, controllerText.text.trim()), + ), + ], + ); + }, + ); + + if (newName != null && newName.isNotEmpty) { + await controller.renameAlbum(album, newName); + } + } + + // ============================================================ + // CAMBIA COVER + // ============================================================ + static Future<void> changeCover( + BuildContext context, + AlbumController controller, + AlbumRow album, + ) async { + final entry = await pickEntry(context); + if (entry != null) { + await controller.setCover(album, entry); + } + } + + static Future<AvesEntry?> pickEntry(BuildContext context) async { + return await Navigator.push<AvesEntry>( + context, + MaterialPageRoute( + builder: (_) => CollectionPage( + pickMode: true, + onPick: (entry) => Navigator.pop(context, entry), + ), + ), + ); + } + + // ============================================================ + // ELIMINA ALBUM + // ============================================================ + static Future<void> deleteAlbum( + BuildContext context, + AlbumController controller, + AlbumRow album, + ) async { + final ok = await showDialog<bool>( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Colors.grey.shade900, + title: const Text('Elimina album', style: TextStyle(color: Colors.white)), + content: Text('Vuoi eliminare l\'album "${album.displayName}"?'), + actions: [ + TextButton( + child: const Text('Annulla'), + onPressed: () => Navigator.pop(context, false), + ), + TextButton( + child: const Text('Elimina'), + onPressed: () => Navigator.pop(context, true), + ), + ], + ); + }, + ); + + if (ok == true) { + await controller.deleteAlbum(album); + } + } + + // ============================================================ + // SHARE ALBUM + // ============================================================ + static Future<void> shareAlbum(AlbumRow album) async { + await shareService.shareText(album.path); + } + + // ============================================================ + // INFO ALBUM + // ============================================================ + static Future<void> showInfo(BuildContext context, AlbumRow album) async { + showDialog<void>( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Colors.grey.shade900, + title: Text(album.displayName, style: const TextStyle(color: Colors.white)), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('Percorso: ${album.path}', style: const TextStyle(color: Colors.white70)), + Text('Elementi: ${album.fileCount}', style: const TextStyle(color: Colors.white70)), + Text('Dimensione: ${_formatSize(album.totalSize)}', style: const TextStyle(color: Colors.white70)), + Text('Remoto: ${album.isRemote}', style: const TextStyle(color: Colors.white70)), + Text('Vault: ${album.isVault}', style: const TextStyle(color: Colors.white70)), + Text('Hybrid: ${album.hybridType}', style: const TextStyle(color: Colors.white70)), + Text('Pinned: ${album.priority > 0}', style: const TextStyle(color: Colors.white70)), + Text('Hidden: ${album.hidden}', style: const TextStyle(color: Colors.white70)), + ], + ), + actions: [ + TextButton( + child: const Text('OK'), + onPressed: () => Navigator.pop(context), + ), + ], + ); + }, + ); + } + + // ============================================================ + // APRI IN FILE MANAGER + // ============================================================ + static Future<void> openInFileManager(AlbumRow album) async { + await deviceService.openFile(album.path); + } + + // ============================================================ + // UTILS + // ============================================================ + static String _formatSize(int bytes) { + if (bytes < 1024) return '$bytes B'; + if (bytes < 1024 * 1024) return '${(bytes / 1024).toStringAsFixed(1)} KB'; + if (bytes < 1024 * 1024 * 1024) return '${(bytes / 1024 / 1024).toStringAsFixed(1)} MB'; + return '${(bytes / 1024 / 1024 / 1024).toStringAsFixed(1)} GB'; + } +} diff --git a/lib/widgets/collection/album_controller.dart b/lib/widgets/collection/album_controller.dart new file mode 100644 index 0000000..944dbf7 --- /dev/null +++ b/lib/widgets/collection/album_controller.dart @@ -0,0 +1,181 @@ +import 'package:flutter/material.dart'; +import 'package:aves/model/db/local_media_db.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'album_sort.dart'; + +/// Controller che gestisce la lista degli album (basato su tabella `folders`) +class AlbumController extends ChangeNotifier { + final LocalMediaDb localMediaDb; + + AlbumController({required this.localMediaDb}); + + bool loading = true; + + // Lista completa degli album (AlbumRow) + List<AlbumRow> _allAlbums = []; + + AlbumSortType _sortType = AlbumSortType.priorityThenName; + + // ============================================================ + // CARICAMENTO + // ============================================================ + Future<void> load() async { + loading = true; + notifyListeners(); + + // 1) Carica tutte le righe della tabella `folders` + final rows = await localMediaDb.loadFolders(); + + // 2) Nessun loadEntriesMap(): thumbEntry = null + final list = <AlbumRow>[]; + final entriesMap = await localMediaDb.loadEntriesMap(); + + for (final row in rows) { + list.add( + AlbumRow( + path: row.path, + displayName: row.displayName, + albumType: row.albumType, + priority: row.priority, + totalSize: row.totalSize, + fileCount: row.fileCount, + isRemote: row.isRemote == 1, + isVault: vaults.vaultDirectories.contains(row.path), + hybridType: row.hybridType, + hidden: row.hidden == 1, + thumbEntry: row.thumbEntryId != null ? entriesMap[row.thumbEntryId] : null, + ), + ); + } + + // 3) Ordina + _allAlbums = sortAlbums(list, _sortType); + + loading = false; + notifyListeners(); + } + + Future<void> refresh() async => load(); + + // ============================================================ + // SEZIONI: PINNED + NORMAL + // ============================================================ + List<AlbumRow> get pinnedAlbums { + final list = _allAlbums.where((a) => a.priority > 0 && !a.hidden).toList(); + list.sort((a, b) => a.priority.compareTo(b.priority)); + return list; + } + + List<AlbumRow> get normalAlbums { + final list = _allAlbums.where((a) => a.priority == 0 && !a.hidden).toList(); + list.sort((a, b) => a.displayName.toLowerCase().compareTo(b.displayName.toLowerCase())); + return list; + } + + // ============================================================ + // SORT + // ============================================================ + void sortBy(AlbumSortType type) { + _sortType = type; + + switch (type) { + case AlbumSortType.priorityThenName: + _allAlbums.sort((a, b) { + final aPinned = a.priority > 0; + final bPinned = b.priority > 0; + + if (aPinned && !bPinned) return -1; + if (!aPinned && bPinned) return 1; + + if (aPinned && bPinned) { + return a.priority.compareTo(b.priority); + } + + return a.displayName.toLowerCase().compareTo(b.displayName.toLowerCase()); + }); + break; + + case AlbumSortType.nameAsc: + _allAlbums.sort((a, b) => a.displayName.toLowerCase().compareTo(b.displayName.toLowerCase())); + break; + + case AlbumSortType.nameDesc: + _allAlbums.sort((a, b) => b.displayName.toLowerCase().compareTo(a.displayName.toLowerCase())); + break; + } + + notifyListeners(); + } + + // ============================================================ + // PIN / UNPIN + // ============================================================ + Future<void> togglePin(AlbumRow album) async { + final newPriority = album.priority > 0 ? 0 : _computeNewPinPriority(); + await localMediaDb.updateFolderPriority(album.path, newPriority); + await load(); + } + + int _computeNewPinPriority() { + final pinned = pinnedAlbums; + if (pinned.isEmpty) return 1000; + return pinned.first.priority + 1000; + } + + // ============================================================ + // DRAG & DROP PINNED + // ============================================================ + Future<void> reorderPinned(int oldIndex, int newIndex) async { + final pinned = pinnedAlbums; + + if (newIndex > oldIndex) newIndex -= 1; + + final item = pinned.removeAt(oldIndex); + pinned.insert(newIndex, item); + + for (int i = 0; i < pinned.length; i++) { + final album = pinned[i]; + final newPriority = i + 1; + + if (album.priority != newPriority) { + await localMediaDb.updateFolderPriority(album.path, newPriority); + } + } + + await load(); + } + + // ============================================================ + // NASCONDI / MOSTRA + // ============================================================ + Future<void> toggleHidden(AlbumRow album) async { + final newHidden = album.hidden ? 0 : 1; + await localMediaDb.updateFolderHidden(album.path, newHidden); + await load(); + } + + // ============================================================ + // RINOMINA + // ============================================================ + Future<void> renameAlbum(AlbumRow album, String newName) async { + await localMediaDb.updateFolderDisplayName(album.path, newName); + await load(); + } + + // ============================================================ + // CAMBIA COVER + // ============================================================ + Future<void> setCover(AlbumRow album, AvesEntry entry) async { + await localMediaDb.updateFolderCover(album.path, entry.id); + await load(); + } + + // ============================================================ + // ELIMINA ALBUM + // ============================================================ + Future<void> deleteAlbum(AlbumRow album) async { + await localMediaDb.deleteFolder(album.path); + await load(); + } +} diff --git a/lib/widgets/collection/album_sort.dart b/lib/widgets/collection/album_sort.dart new file mode 100644 index 0000000..7a6d084 --- /dev/null +++ b/lib/widgets/collection/album_sort.dart @@ -0,0 +1,134 @@ +import 'package:aves/model/entry/entry.dart'; + +/// Rappresenta un album costruito dalla tabella `folders` (FolderStats) +class AlbumRow { + final String path; + final String displayName; + final int albumType; + final int priority; + final int totalSize; + final int fileCount; + final bool isRemote; + final bool isVault; + final int hybridType; + final bool hidden; + final AvesEntry? thumbEntry; + + AlbumRow({ + required this.path, + required this.displayName, + required this.albumType, + required this.priority, + required this.totalSize, + required this.fileCount, + required this.isRemote, + required this.isVault, + required this.hybridType, + required this.hidden, + required this.thumbEntry, + }); + + AlbumRow copyWith({ + String? path, + String? displayName, + int? albumType, + int? priority, + int? totalSize, + int? fileCount, + bool? isRemote, + bool? isVault, + int? hybridType, + bool? hidden, + AvesEntry? thumbEntry, + }) { + return AlbumRow( + path: path ?? this.path, + displayName: displayName ?? this.displayName, + albumType: albumType ?? this.albumType, + priority: priority ?? this.priority, + totalSize: totalSize ?? this.totalSize, + fileCount: fileCount ?? this.fileCount, + isRemote: isRemote ?? this.isRemote, + isVault: isVault ?? this.isVault, + hybridType: hybridType ?? this.hybridType, + hidden: hidden ?? this.hidden, + thumbEntry: thumbEntry ?? this.thumbEntry, + ); + } +} + +/// Tipi di ordinamento disponibili +enum AlbumSortType { + priorityThenName, + nameAsc, + nameDesc, + sizeAsc, + sizeDesc, + countAsc, + countDesc, +} + +/// Ordinamento principale degli album +List<AlbumRow> sortAlbums(List<AlbumRow> albums, AlbumSortType sortType) { + final list = [...albums]; + + int byNameAsc(AlbumRow a, AlbumRow b) => + a.displayName.toLowerCase().compareTo(b.displayName.toLowerCase()); + + int byNameDesc(AlbumRow a, AlbumRow b) => -byNameAsc(a, b); + + int bySizeAsc(AlbumRow a, AlbumRow b) => a.totalSize.compareTo(b.totalSize); + + int bySizeDesc(AlbumRow a, AlbumRow b) => -bySizeAsc(a, b); + + int byCountAsc(AlbumRow a, AlbumRow b) => a.fileCount.compareTo(b.fileCount); + + int byCountDesc(AlbumRow a, AlbumRow b) => -byCountAsc(a, b); + + switch (sortType) { + case AlbumSortType.priorityThenName: + list.sort((a, b) { + // ⭐ 1. pinned prima (priority > 0) + final aPinned = a.priority > 0; + final bPinned = b.priority > 0; + + if (aPinned && !bPinned) return -1; + if (!aPinned && bPinned) return 1; + + // ⭐ 2. se entrambi pinned → priority ASC + if (aPinned && bPinned) { + return a.priority.compareTo(b.priority); + } + + // ⭐ 3. se entrambi normali → nome ASC + return byNameAsc(a, b); + }); + break; + + case AlbumSortType.nameAsc: + list.sort(byNameAsc); + break; + + case AlbumSortType.nameDesc: + list.sort(byNameDesc); + break; + + case AlbumSortType.sizeAsc: + list.sort(bySizeAsc); + break; + + case AlbumSortType.sizeDesc: + list.sort(bySizeDesc); + break; + + case AlbumSortType.countAsc: + list.sort(byCountAsc); + break; + + case AlbumSortType.countDesc: + list.sort(byCountDesc); + break; + } + + return list; +} diff --git a/lib/widgets/collection/album_tile.dart b/lib/widgets/collection/album_tile.dart new file mode 100644 index 0000000..0ffcd70 --- /dev/null +++ b/lib/widgets/collection/album_tile.dart @@ -0,0 +1,195 @@ +import 'package:flutter/material.dart'; +import 'album_controller.dart'; +import 'album_actions.dart'; +import 'package:aves/widgets/common/thumbnail/aves_thumbnail_widget.dart'; + +/// Tile principale usato nella griglia "Tutti gli album" +/// Basato su AlbumRow (derivato da FolderStats) +class AlbumTile extends StatelessWidget { + final AlbumRow album; + final VoidCallback onTap; + final VoidCallback onLongPress; + + const AlbumTile({ + super.key, + required this.album, + required this.onTap, + required this.onLongPress, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + onLongPress: onLongPress, + child: ClipRRect( + borderRadius: BorderRadius.circular(12), + child: Stack( + children: [ + // COVER + Positioned.fill( + child: Hero( + tag: 'album:${album.path}', + child: AlbumTileThumbnail(album: album), + ), + ), + + // GRADIENT OVERLAY + Positioned.fill( + child: DecoratedBox( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.bottomCenter, + end: Alignment.center, + colors: [ + Colors.black.withOpacity(0.7), + Colors.black.withOpacity(0.2), + Colors.transparent, + ], + stops: const [0.0, 0.4, 1.0], + ), + ), + ), + ), + + // BADGES (remoto, vault, hybrid, pinned, hidden) + Positioned( + top: 6, + right: 6, + child: Row( + children: [ + if (album.isRemote) + const _Badge(icon: Icons.cloud_outlined), + + if (album.isVault) + const _Badge(icon: Icons.lock_outline), + + if (album.hybridType != 0) + const _Badge(icon: Icons.all_inclusive), + + if (album.priority > 0) + const _Badge(icon: Icons.push_pin_outlined), + + if (album.hidden) + const _Badge(icon: Icons.visibility_off_outlined), + ], + ), + ), + + // TESTO (nome + count + size) + Positioned( + left: 8, + right: 8, + bottom: 8, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + album.displayName, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.w600, + fontSize: 15, + ), + ), + const SizedBox(height: 2), + Text( + '${album.fileCount} file', + style: const TextStyle( + color: Colors.white70, + fontSize: 12, + ), + ), + Text( + _formatSize(album.totalSize), + style: const TextStyle( + color: Colors.white60, + fontSize: 11, + ), + ), + ], + ), + ), + + // MENU RAPIDO (3 dots) + Positioned( + top: 0, + right: 0, + child: IconButton( + icon: const Icon(Icons.more_vert, color: Colors.white), + onPressed: () { + AlbumActions.showMenu(context, album); + }, + ), + ), + ], + ), + ), + ); + } + + String _formatSize(int bytes) { + if (bytes < 1024) return '$bytes B'; + if (bytes < 1024 * 1024) return '${(bytes / 1024).toStringAsFixed(1)} KB'; + if (bytes < 1024 * 1024 * 1024) return '${(bytes / 1024 / 1024).toStringAsFixed(1)} MB'; + return '${(bytes / 1024 / 1024 / 1024).toStringAsFixed(1)} GB'; + } +} + +/// Thumbnail con fallback +class AlbumTileThumbnail extends StatelessWidget { + final AlbumRow album; + final double radius; + + const AlbumTileThumbnail({ + super.key, + required this.album, + this.radius = 12, + }); + + @override + Widget build(BuildContext context) { + final entry = album.thumbEntry; + + if (entry == null) { + return Container( + decoration: BoxDecoration( + color: Colors.grey.shade900, + borderRadius: BorderRadius.circular(radius), + ), + child: const Icon(Icons.folder, size: 48, color: Colors.white54), + ); + } + + return ClipRRect( + borderRadius: BorderRadius.circular(radius), + child: AvesThumbnailWidget( + entry: entry, + heroTag: 'album:${album.path}', + fit: BoxFit.cover, + ), + ); + } +} + +/// Badge icona piccolo +class _Badge extends StatelessWidget { + final IconData icon; + + const _Badge({required this.icon}); + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.only(left: 4), + padding: const EdgeInsets.all(5), + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.55), + borderRadius: BorderRadius.circular(6), + ), + child: Icon(icon, color: Colors.white, size: 16), + ); + } +} diff --git a/lib/widgets/collection/app_bar/cast/cast_actions.dart b/lib/widgets/collection/app_bar/cast/cast_actions.dart new file mode 100644 index 0000000..f78af59 --- /dev/null +++ b/lib/widgets/collection/app_bar/cast/cast_actions.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:provider/provider.dart'; +import 'package:aves/widgets/cast/cast_controller.dart'; + +class CastActions { + static List<AvesEntry> getEntries(BuildContext context) { + try { + final selection = context.read<Selection<AvesEntry>>(); + final selected = selection.selectedItems.toList(); + if (selected.isNotEmpty) return selected; + } catch (_) {} + + try { + final lens = context.read<CollectionLens>(); + final lensEntries = lens.sortedEntries; + if (lensEntries != null && lensEntries.isNotEmpty) { + return List<AvesEntry>.from(lensEntries); + } + } catch (_) {} + + try { + final single = Provider.of<AvesEntry>(context, listen: false); + return [single]; + } catch (_) {} + + return []; + } +} diff --git a/lib/widgets/collection/app_bar/cast/cast_bar_inline.dart b/lib/widgets/collection/app_bar/cast/cast_bar_inline.dart new file mode 100644 index 0000000..e041ba0 --- /dev/null +++ b/lib/widgets/collection/app_bar/cast/cast_bar_inline.dart @@ -0,0 +1,186 @@ +// lib/widgets/collection/app_bar/cast/cast_bar_inline.dart + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/source/collection_lens.dart'; + +import 'package:aves/services/cast/cast_server.dart'; +import 'package:aves/widgets/cast/cast_controller.dart'; + +import 'package:aves/widgets/viewer/fullscreen_cast_viewer.dart'; +import 'package:aves/widgets/viewer/fullscreen_cast_viewer_dlna.dart'; + +import 'cast_controls_sheet.dart'; + +class CastBarInline extends StatelessWidget { + const CastBarInline({super.key}); + + // ------------------------------------------------------------ + // RISOLVE LE ENTRY DA CASTARE + // ------------------------------------------------------------ + List<AvesEntry> _resolveEntries(BuildContext context) { + List<AvesEntry> entries = []; + + try { + final selection = context.read<Selection<AvesEntry>>(); + entries = selection.selectedItems.toList(); + } catch (_) {} + + if (entries.isEmpty) { + try { + final lens = context.read<CollectionLens>(); + final lensEntries = lens.sortedEntries; + if (lensEntries != null && lensEntries.isNotEmpty) { + entries = List<AvesEntry>.from(lensEntries); + } + } catch (_) {} + } + + if (entries.isEmpty) { + try { + final single = Provider.of<AvesEntry>(context, listen: false); + entries = [single]; + } catch (_) {} + } + + return entries; + } + + // ------------------------------------------------------------ + // MOSTRA CONTROLLI CAST + // ------------------------------------------------------------ + void _showCastControlsSheet(BuildContext context) { + showModalBottomSheet( + context: context, + backgroundColor: Colors.black87, + builder: (_) => const CastControlsSheet(), + ); + } + + // ------------------------------------------------------------ + // BUILD + // ------------------------------------------------------------ + @override + Widget build(BuildContext context) { + final controller = CastController.instance; + + return Container( + height: 48, + padding: const EdgeInsets.symmetric(horizontal: 8), + color: Theme.of(context).colorScheme.surfaceVariant, + child: Row( + children: [ + // ------------------------------------------------------------ + // 1) CAST + VIEWER FULLSCREEN + // ------------------------------------------------------------ + IconButton( + icon: const Icon(Icons.aspect_ratio), + tooltip: 'Cast + viewer fullscreen', + onPressed: () async { + final entries = _resolveEntries(context); + if (entries.isEmpty) return; + + await castServer.start(); + + await controller.startFullscreen(entries, 0); + + if (!context.mounted) return; + + await Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => controller.backendNotifier.value == CastBackend.dlna + ? FullscreenCastViewerDlna( + entries: entries, + startIndex: 0, + ) + : FullscreenCastViewer( + entries: entries, + startIndex: 0, + ), + fullscreenDialog: true, + ), + ); + }, + ), + + // ------------------------------------------------------------ + // 2) CAST NORMALE (manuale) + // ------------------------------------------------------------ + IconButton( + icon: const Icon(Icons.screen_share), + tooltip: 'Cast normale', + onPressed: () async { + final entries = _resolveEntries(context); + if (entries.isEmpty) return; + + await castServer.start(); + await controller.startManualQueue(entries, 0); + }, + ), + + // ------------------------------------------------------------ + // 3) SLIDESHOW + // ------------------------------------------------------------ + IconButton( + icon: const Icon(Icons.play_arrow), + tooltip: 'Avvia slideshow', + onPressed: () async { + final entries = _resolveEntries(context); + if (entries.isEmpty) return; + + await controller.startSlideshow(entries, 0); + }, + ), + + // ------------------------------------------------------------ + // 4) CONTROLLI CAST + // ------------------------------------------------------------ + IconButton( + icon: const Icon(Icons.cast_connected), + tooltip: 'Controlli Cast', + onPressed: () => _showCastControlsSheet(context), + ), + + // ------------------------------------------------------------ + // 5) STOP CAST + // ------------------------------------------------------------ + IconButton( + icon: const Icon(Icons.stop), + tooltip: 'Stop cast', + onPressed: () => controller.stopCast(), + ), + + // ------------------------------------------------------------ + // 6) PREV + // ------------------------------------------------------------ + ValueListenableBuilder<int>( + valueListenable: controller.currentIndexNotifier, + builder: (context, index, _) { + return IconButton( + icon: const Icon(Icons.skip_previous), + tooltip: 'Precedente', + onPressed: () async { + await controller.prevManual(); + }, + ); + }, + ), + + // ------------------------------------------------------------ + // 7) NEXT + // ------------------------------------------------------------ + IconButton( + icon: const Icon(Icons.skip_next), + tooltip: 'Successivo', + onPressed: () async { + await controller.nextManual(); + }, + ), + ], + ), + ); + } +} diff --git a/lib/widgets/collection/app_bar/cast/cast_controls_sheet.dart b/lib/widgets/collection/app_bar/cast/cast_controls_sheet.dart new file mode 100644 index 0000000..c880c89 --- /dev/null +++ b/lib/widgets/collection/app_bar/cast/cast_controls_sheet.dart @@ -0,0 +1,247 @@ +// lib/widgets/collection/app_bar/cast/cast_controls_sheet.dart + +import 'package:flutter/material.dart'; +import 'package:aves/widgets/cast/cast_controller.dart'; + +class CastControlsSheet extends StatelessWidget { + const CastControlsSheet({super.key}); + + String _formatDuration(Duration d) { + final totalSeconds = d.inSeconds; + final hours = totalSeconds ~/ 3600; + final minutes = (totalSeconds % 3600) ~/ 60; + final seconds = totalSeconds % 60; + + if (hours > 0) { + return '${hours.toString().padLeft(2, '0')}:' + '${minutes.toString().padLeft(2, '0')}:' + '${seconds.toString().padLeft(2, '0')}'; + } + + return '${minutes.toString().padLeft(2, '0')}:' + '${seconds.toString().padLeft(2, '0')}'; + } + + @override + Widget build(BuildContext context) { + final controller = CastController.instance; + + return SafeArea( + child: Container( + color: Colors.black87, + padding: const EdgeInsets.fromLTRB(16, 12, 16, 20), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Text( + 'Controlli Cast', + style: TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.w600, + ), + ), + + const SizedBox(height: 16), + + // ------------------------------------------------------------ + // SEEK SOLO PER GOOGLE + // ------------------------------------------------------------ + ValueListenableBuilder<CastBackend>( + valueListenable: controller.backendNotifier, + builder: (context, backend, _) { + if (backend != CastBackend.google) { + return const SizedBox.shrink(); + } + + return ValueListenableBuilder<Duration>( + valueListenable: controller.durationNotifier, + builder: (context, duration, _) { + return ValueListenableBuilder<Duration>( + valueListenable: controller.positionNotifier, + builder: (context, position, __) { + final maxMs = duration.inMilliseconds <= 0 + ? 1 + : duration.inMilliseconds; + final valueMs = + position.inMilliseconds.clamp(0, maxMs); + + return Column( + children: [ + Slider( + value: valueMs.toDouble(), + min: 0, + max: maxMs.toDouble(), + + // aggiorna UI locale mentre trascini + onChanged: (v) { + controller.positionNotifier.value = + Duration(milliseconds: v.toInt()); + }, + + // invia seek al Chromecast + onChangeEnd: (v) { + controller.google.seekCast( + Duration(milliseconds: v.toInt()), + ); + }, + ), + Row( + children: [ + Text( + _formatDuration(position), + style: const TextStyle(color: Colors.white70), + ), + const Spacer(), + Text( + _formatDuration(duration), + style: const TextStyle(color: Colors.white70), + ), + ], + ), + ], + ); + }, + ); + }, + ); + }, + ), + + const SizedBox(height: 16), + + // ------------------------------------------------------------ + // CONTROLLI PLAYBACK + // ------------------------------------------------------------ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + IconButton( + iconSize: 32, + color: Colors.white, + icon: const Icon(Icons.skip_previous), + onPressed: () async { + await controller.google.prevManual(); + }, + ), + + const SizedBox(width: 8), + + ValueListenableBuilder<CastBackend>( + valueListenable: controller.backendNotifier, + builder: (context, backend, _) { + if (backend != CastBackend.google) { + return const SizedBox.shrink(); + } + + return ValueListenableBuilder<bool>( + valueListenable: controller.isPlayingNotifier, + builder: (context, isPlaying, _) { + return IconButton( + iconSize: 40, + color: Colors.white, + icon: Icon( + isPlaying + ? Icons.pause_circle + : Icons.play_circle, + ), + onPressed: () { + if (isPlaying) { + controller.google.pauseCast(); + } else { + controller.google.playCast(); + } + }, + ); + }, + ); + }, + ), + + const SizedBox(width: 8), + + IconButton( + iconSize: 32, + color: Colors.white, + icon: const Icon(Icons.skip_next), + onPressed: () async { + await controller.google.nextManual(); + }, + ), + ], + ), + + const SizedBox(height: 16), + + // ------------------------------------------------------------ + // VOLUME SOLO PER GOOGLE + // ------------------------------------------------------------ + ValueListenableBuilder<CastBackend>( + valueListenable: controller.backendNotifier, + builder: (context, backend, _) { + if (backend != CastBackend.google) { + return const SizedBox.shrink(); + } + + return Column( + children: [ + ValueListenableBuilder<double>( + valueListenable: controller.volumeNotifier, + builder: (context, volume, _) { + return Row( + children: [ + IconButton( + color: Colors.white, + icon: const Icon(Icons.volume_up), + onPressed: () { + controller.google.toggleMuteCast(); + }, + ), + Expanded( + child: Slider( + value: volume.clamp(0.0, 1.0), + min: 0, + max: 1, + + // aggiorna UI locale + onChanged: (v) { + controller.volumeNotifier.value = v; + }, + + // invia volume al Chromecast + onChangeEnd: (v) { + controller.google.setCastVolume(v); + }, + ), + ), + ], + ); + }, + ), + const SizedBox(height: 16), + ], + ); + }, + ), + + Wrap( + spacing: 8, + runSpacing: 8, + alignment: WrapAlignment.center, + children: [ + ElevatedButton.icon( + onPressed: () async { + await controller.google.stopGoogleCast(); + if (context.mounted) Navigator.of(context).pop(); + }, + icon: const Icon(Icons.stop_circle_outlined), + label: const Text('Stop Cast'), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/collection/app_bar/cast/cast_icon_button.dart b/lib/widgets/collection/app_bar/cast/cast_icon_button.dart new file mode 100644 index 0000000..ea2e034 --- /dev/null +++ b/lib/widgets/collection/app_bar/cast/cast_icon_button.dart @@ -0,0 +1,206 @@ +// lib/widgets/collection/app_bar/cast/cast_icon_button.dart + +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'package:aves/model/selection.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/source/collection_lens.dart'; + +import 'package:aves/widgets/cast/animated_cast_icon.dart'; +import 'package:aves/widgets/cast/cast_controller.dart'; +import 'package:aves/widgets/cast/dlna_dialog.dart'; +import 'package:aves/widgets/cast/dlna.dart'; +import 'package:aves/widgets/cast/backends/dlna_cast_backend.dart'; + +class CastIconButton extends StatefulWidget { + const CastIconButton({super.key}); + + @override + State<CastIconButton> createState() => _CastIconButtonState(); +} + +class _CastIconButtonState extends State<CastIconButton> { + Timer? _lpTimer; + bool _longPressFired = false; + + static const _longPressDelay = Duration(milliseconds: 600); + + @override + void dispose() { + _lpTimer?.cancel(); + super.dispose(); + } + + // ------------------------------------------------------------ + // Recupera entries come nel vecchio app_bar.dart + // ------------------------------------------------------------ + List<AvesEntry> _resolveEntries() { + List<AvesEntry> entries = []; + + try { + final selection = context.read<Selection<AvesEntry>>(); + entries = selection.selectedItems.toList(); + } catch (_) {} + + if (entries.isEmpty) { + try { + final lens = context.read<CollectionLens>(); + final lensEntries = lens.sortedEntries; + if (lensEntries != null && lensEntries.isNotEmpty) { + entries = List<AvesEntry>.from(lensEntries); + } + } catch (_) {} + } + + if (entries.isEmpty) { + try { + final single = Provider.of<AvesEntry>(context, listen: false); + entries = [single]; + } catch (_) {} + } + + return entries; + } + + // ------------------------------------------------------------ + // TAP BREVE → toggle ON/OFF + // ------------------------------------------------------------ + Future<void> _onTap() async { + final controller = CastController.instance; + final backend = controller.backendNotifier.value; + final state = controller.castIconState.value; + + debugPrint('CastIconButton: TAP state=$state backend=$backend'); + + // Se sto già castando → STOP + if (state == CastIconState.connecting || state == CastIconState.connected) { + await controller.stopCast(); + return; + } + + // Stato = idle → avvia backend selezionato + final entries = _resolveEntries(); + if (entries.isEmpty) return; + + switch (backend) { + case CastBackend.google: + // Dialog nativo Android + await controller.google.showGoogleCastDialog(); + return; + + case CastBackend.fast: + // FAST usa lo stesso dialog Android + await controller.google.showGoogleCastDialog(); + return; + +case CastBackend.dlna: + // DLNA → selezione renderer via dialog + final device = await showDialog<DLNADevice>( + context: context, + builder: (_) => const CastDialogDlna(), + ); + + if (device != null) { + final dlna = controller.backend as DlnaCastBackend; + + // 1️⃣ Imposta renderer + dlna.setRenderer(device); + + // 2️⃣ Mostra la cast bar + controller.isCastingNotifier.value = true; + + // 3️⃣ Mostra stato “sto connettendo” + controller.castIconState.value = CastIconState.connecting; + + // 4️⃣ Prepara il media server in anticipo (opzionale ma consigliato) + unawaited(dlna.ensureMediaServerPrewarm()); + } + return; + + } + } + + // ------------------------------------------------------------ + // TAP LUNGO → selettore backend + // ------------------------------------------------------------ + Future<void> _onLongPress() async { + final controller = CastController.instance; + + final backend = await showModalBottomSheet<CastBackend>( + context: context, + builder: (context) { + return SafeArea( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + leading: const Icon(Icons.cast), + title: const Text('Google Cast'), + onTap: () => Navigator.pop(context, CastBackend.google), + ), + ListTile( + leading: const Icon(Icons.flash_on), + title: const Text('FAST Receiver'), + onTap: () => Navigator.pop(context, CastBackend.fast), + ), + ListTile( + leading: const Icon(Icons.wifi), + title: const Text('DLNA'), + onTap: () => Navigator.pop(context, CastBackend.dlna), + ), + ], + ), + ); + }, + ); + + if (backend != null) { + await controller.setBackend(backend); + } + } + + // ------------------------------------------------------------ + // Gestione long press manuale + // ------------------------------------------------------------ + void _startLongPressTimer() { + _lpTimer?.cancel(); + _longPressFired = false; + + _lpTimer = Timer(_longPressDelay, () async { + if (!mounted) return; + _longPressFired = true; + await _onLongPress(); + }); + } + + void _cancelLongPressTimer() { + _lpTimer?.cancel(); + _lpTimer = null; + } + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 48, + height: 48, + child: Listener( + behavior: HitTestBehavior.opaque, + onPointerDown: (_) => _startLongPressTimer(), + onPointerUp: (_) async { + _cancelLongPressTimer(); + if (_longPressFired) { + _longPressFired = false; + return; + } + await _onTap(); + }, + onPointerCancel: (_) => _cancelLongPressTimer(), + child: const Center( + child: AnimatedCastIcon(), + ), + ), + ); + } +} diff --git a/lib/widgets/collection/app_bar/collection_app_bar.dart b/lib/widgets/collection/app_bar/collection_app_bar.dart new file mode 100644 index 0000000..374af77 --- /dev/null +++ b/lib/widgets/collection/app_bar/collection_app_bar.dart @@ -0,0 +1,1086 @@ +// lib/widgets/collection/app_bar/collection_app_bar.dart + +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/container/set_and.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/query.dart'; +import 'package:aves/model/filters/trash.dart'; +import 'package:aves/model/query.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/collection/entry_set_action_delegate.dart'; +import 'package:aves/widgets/collection/filter_bar.dart'; +import 'package:aves/widgets/collection/query_bar.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/move_button.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/rate_button.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/tag_button.dart'; +import 'package:aves/widgets/common/action_controls/togglers/favourite.dart'; +import 'package:aves/widgets/common/action_controls/togglers/title_search.dart'; +import 'package:aves/widgets/common/app_bar/app_bar_subtitle.dart'; +import 'package:aves/widgets/common/app_bar/app_bar_title.dart'; +import 'package:aves/widgets/common/basic/popup/container.dart'; +import 'package:aves/widgets/common/basic/popup/expansion_panel.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_app_bar.dart'; +import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; +import 'package:aves/widgets/common/search/route.dart'; +import 'package:aves/widgets/common/tile_extent_controller.dart'; +import 'package:aves/widgets/dialogs/tile_view_dialog.dart'; +import 'package:aves/widgets/search/collection_search_delegate.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves_model/aves_model.dart'; + +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +// Remote +import 'package:aves/widgets/collection/remote_status_button.dart'; + +// Cast (modulare) +import 'cast/cast_icon_button.dart'; +import 'cast/cast_bar_inline.dart'; + +import 'package:aves/widgets/cast/cast_controller.dart'; + +class CollectionAppBar extends StatefulWidget { + final ValueNotifier<double> appBarHeightNotifier; + final ScrollController scrollController; + final CollectionLens collection; + + const CollectionAppBar({ + super.key, + required this.appBarHeightNotifier, + required this.scrollController, + required this.collection, + }); + + @override + State<CollectionAppBar> createState() => _CollectionAppBarState(); +} + +class _CollectionAppBarState extends State<CollectionAppBar> + with RouteAware, SingleTickerProviderStateMixin, WidgetsBindingObserver { + final Set<StreamSubscription> _subscriptions = {}; + final EntrySetActionDelegate _actionDelegate = EntrySetActionDelegate(); + late AnimationController _browseToSelectAnimation; + final ValueNotifier<bool> _isSelectingNotifier = ValueNotifier(false); + final FocusNode _queryBarFocusNode = FocusNode(); + late final Listenable _queryFocusRequestNotifier; + double _statusBarHeight = 0; + + static const double _castBarHeight = 48; + + CollectionLens get collection => widget.collection; + + bool get isTrash => collection.filters.contains(TrashFilter.instance); + + CollectionSource get source => collection.source; + + Set<CollectionFilter> get visibleFilters => collection.filters + .where((v) => !(v is QueryFilter && v.live) && v is! TrashFilter) + .toSet(); + + bool get showFilterBar => visibleFilters.isNotEmpty; + + void _onBackendChanged() { + if (!mounted) return; + setState(() {}); + } + + + static const _sortOptions = [ + EntrySortFactor.date, + EntrySortFactor.size, + EntrySortFactor.name, + EntrySortFactor.rating, + EntrySortFactor.duration, + EntrySortFactor.path, + ]; + + static const _sectionOptions = [ + EntrySectionFactor.album, + EntrySectionFactor.month, + EntrySectionFactor.day, + EntrySectionFactor.none, + ]; + + static const _layoutOptions = [ + TileLayout.mosaic, + TileLayout.grid, + TileLayout.list, + ]; + + static const _trashSelectionQuickActions = [ + EntrySetAction.delete, + EntrySetAction.restore, + ]; + + @override + void initState() { + super.initState(); + CastController.instance.backendNotifier.addListener(_onBackendChanged); + + + final query = context.read<Query>(); + _subscriptions.add(query.enabledStream.listen((e) => _updateAppBarHeight())); + _queryFocusRequestNotifier = query.focusRequestNotifier; + _queryFocusRequestNotifier.addListener(_onQueryFocusRequest); + _queryBarFocusNode.addListener(_onQueryBarFocusChanged); + + _browseToSelectAnimation = AnimationController( + duration: context.read<DurationsData>().iconAnimation, + vsync: this, + ); + + _isSelectingNotifier.addListener(_onActivityChanged); + + // Importante: ricostruisce la AppBar quando appare/scompare la cast bar + CastController.instance.isCastingNotifier.addListener(_onCastVisibilityChanged); + + _registerWidget(widget); + WidgetsBinding.instance.addObserver(this); + + WidgetsBinding.instance.addPostFrameCallback((_) { + _updateStatusBarHeight(); + _onFilterChanged(); + }); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final route = ModalRoute.of(context); + if (route is PageRoute) { + AvesApp.pageRouteObserver.subscribe(this, route); + } + } + + @override + void didUpdateWidget(covariant CollectionAppBar oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + + CastController.instance.isCastingNotifier.removeListener(_onCastVisibilityChanged); + CastController.instance.backendNotifier.removeListener(_onBackendChanged); + + + _queryBarFocusNode.dispose(); + _queryFocusRequestNotifier.removeListener(_onQueryFocusRequest); + _queryBarFocusNode.removeListener(_onQueryBarFocusChanged); + _isSelectingNotifier.dispose(); + _browseToSelectAnimation.dispose(); + + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + + WidgetsBinding.instance.removeObserver(this); + AvesApp.pageRouteObserver.unsubscribe(this); + super.dispose(); + } + + void _registerWidget(CollectionAppBar widget) { + widget.collection.filterChangeNotifier.addListener(_onFilterChanged); + } + + void _unregisterWidget(CollectionAppBar widget) { + widget.collection.filterChangeNotifier.removeListener(_onFilterChanged); + } + + void _onCastVisibilityChanged() { + if (!mounted) return; + setState(() {}); + _updateAppBarHeight(); + } + + void _onQueryFocusRequest() { + if (_queryFocusRequestNotifier is ValueNotifier<bool> && + (_queryFocusRequestNotifier as ValueNotifier<bool>).value) { + _queryBarFocusNode.requestFocus(); + } + } + + void _onQueryBarFocusChanged() { + if (_queryBarFocusNode.hasFocus) { + _scrollToTop(); + } + _updateAppBarHeight(); + } + + void _onActivityChanged() { + if (!mounted) return; + + if (context.read<Selection<AvesEntry>>().isSelecting) { + _browseToSelectAnimation.forward(); + } else { + _browseToSelectAnimation.reverse(); + } + _updateAppBarHeight(); + } + + void _onFilterChanged() { + _updateAppBarHeight(); + + final filters = collection.filters; + if (filters.isNotEmpty) { + final selection = context.read<Selection<AvesEntry>>(); + if (selection.isSelecting) { + final toRemove = selection.selectedItems + .where((entry) => !filters.every((f) => f.test(entry))) + .toSet(); + selection.removeFromSelection(toRemove); + } + } + } + + void _scrollToTop() => widget.scrollController.jumpTo(0); + + void _updateStatusBarHeight() { + if (!mounted) return; + final padding = MediaQuery.paddingOf(context); + if (_statusBarHeight != padding.top) { + setState(() => _statusBarHeight = padding.top); + _updateAppBarHeight(); + } + } + + // FIX PRINCIPALE: altezza reale completa della AppBar + void _updateAppBarHeight() { + widget.appBarHeightNotifier.value = + _statusBarHeight + + AvesAppBar.appBarHeightForContentHeight(appBarContentHeight); + } + + @override + void didPushNext() { + _queryBarFocusNode.unfocus(); + } + + @override + void didChangeMetrics() { + WidgetsBinding.instance.addPostFrameCallback((_) => _updateStatusBarHeight()); + } + + @override + Widget build(BuildContext context) { + final appMode = context.watch<ValueNotifier<AppMode>>().value; + final selection = context.watch<Selection<AvesEntry>>(); + final isSelecting = selection.isSelecting; + _isSelectingNotifier.value = isSelecting; + + return NotificationListener<ScrollNotification>( + onNotification: (notification) => false, + child: AnimatedBuilder( + animation: collection.filterChangeNotifier, + builder: (context, child) { + final canRemoveFilters = appMode != AppMode.pickFilteredMediaInternal; + + return Selector<Query, bool>( + selector: (context, query) => query.enabled, + builder: (context, queryEnabled, child) { + return Selector<Settings, List<EntrySetAction>>( + selector: (context, s) => s.collectionBrowsingQuickActions, + builder: (context, _, child) { + final useTvLayout = settings.useTvLayout; + final onFilterTap = + canRemoveFilters ? collection.removeFilter : null; + + return AvesAppBar( + contentHeight: appBarContentHeight, + pinned: context.select<Selection<AvesEntry>, bool>( + (selection) => selection.isSelecting, + ), + leading: _buildAppBarLeading( + hasDrawer: appMode.canNavigate, + isSelecting: isSelecting, + ), + title: _buildAppBarTitle(isSelecting), + actions: (context, maxWidth) => _buildAppBarActions( + context: context, + selection: selection, + maxWidth: maxWidth, + useTvLayout: useTvLayout, + ), + bottom: PreferredSize( + preferredSize: Size.fromHeight( + _computeBottomHeight(context, queryEnabled), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (CastController.instance.isCastingNotifier.value) + const CastBarInline(), + + if (useTvLayout) + SizedBox( + height: CaptionedButton.getTelevisionButtonHeight(context), + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 8), + scrollDirection: Axis.horizontal, + children: _buildActions( + context, + selection, + double.infinity, + ), + ), + ), + + if (showFilterBar) + NotificationListener( + onNotification: (notification) { + if (notification is SelectFilterNotification) { + collection.addFilters({notification.filter}); + return true; + } else if (notification is DecomposeFilterNotification) { + final filter = notification.filter; + if (filter is DynamicAlbumFilter) { + final innerFilter = filter.filter; + final newFilters = + innerFilter is SetAndFilter + ? innerFilter.innerFilters + : {innerFilter}; + collection.addFilters(newFilters); + collection.removeFilter(filter); + return true; + } + } + return false; + }, + child: FilterBar( + filters: visibleFilters, + onTap: onFilterTap, + onRemove: onFilterTap, + ), + ), + + if (queryEnabled) + EntryQueryBar( + queryNotifier: + context.select<Query, ValueNotifier<String>>( + (query) => query.queryNotifier, + ), + focusNode: _queryBarFocusNode, + ), + ], + ), + ), + transitionKey: isSelecting, + ); + }, + ); + }, + ); + }, + ), + ); + } + + double _computeBottomHeight(BuildContext context, bool queryEnabled) { + double height = 0; + + if (CastController.instance.isCastingNotifier.value) { + height += _castBarHeight; + } + + if (settings.useTvLayout) { + height += CaptionedButton.getTelevisionButtonHeight(context); + } + + if (showFilterBar) { + height += FilterBar.preferredHeight; + } + + if (queryEnabled) { + final textScaler = MediaQuery.textScalerOf(context); + height += EntryQueryBar.getPreferredHeight(textScaler); + } + + return height; + } + + // ------------------------------------------------------------- + // ACTIONS + // ------------------------------------------------------------- + List<Widget> _buildAppBarActions({ + required BuildContext context, + required Selection<AvesEntry> selection, + required double maxWidth, + required bool useTvLayout, + }) { + final statusButton = Padding( + padding: const EdgeInsets.symmetric(horizontal: 6), + child: RemoteStatusButton(source: source), + ); + + if (useTvLayout) { + return [ + statusButton, + const CastIconButton(), + ]; + } + + +/*return [ + statusButton, + + SizedBox( + width: 48, + height: kToolbarHeight, + child: Center( + child: Stack( + alignment: Alignment.center, + children: [ + // LETTERA SOPRA, IN ALTO A DESTRA, STESSO COLORE DELL’ICONA + Positioned( + top: 2, + right: 6, + child: ValueListenableBuilder( + valueListenable: CastController.instance.backendNotifier, + builder: (_, __, ___) { + return ValueListenableBuilder( + valueListenable: CastController.instance.castIconState, + builder: (_, __, ___) { + return Text( + CastController.instance.backendLetter, + style: TextStyle( + fontSize: 11, + fontWeight: FontWeight.bold, + color: CastController.instance.iconColor, // ← ECCO QUI + //color: Colors.red, + height: 1.0, + ), + ); + }, + ); + }, + ), + ), + + const CastIconButton(), + ], + ), + ), + ), + + ..._buildActions(context, selection, maxWidth), +]; +*/ +return [ + statusButton, + + SizedBox( + width: 48, + height: kToolbarHeight, + child: Center( + child: Stack( + alignment: Alignment.center, + children: [ + // SCRITTA IN BASSO, CENTRATA, STESSO COLORE DELL’ICONA + Positioned( + bottom: 0, // leggermente sotto l’icona + child: ValueListenableBuilder( + +valueListenable: CastController.instance.backendNotifier, +builder: (_, __, ___) { + return ValueListenableBuilder( + valueListenable: CastController.instance.castIconState, + builder: (_, __, ___) { + return Text( + CastController.instance.backendNotifier.value.name, + style: TextStyle( + fontSize: 10, + fontWeight: FontWeight.w600, + color: CastController.instance.castIconState.value == CastIconState.connected + ? Colors.blueAccent + : Colors.black, + height: 1.0, + ), + ); + }, + ); +} + + ), + ), + + const CastIconButton(), + ], + ), + ), + ), + + ..._buildActions(context, selection, maxWidth), +]; + + } + + double get appBarContentHeight { + final textScaler = MediaQuery.textScalerOf(context); + double height = textScaler.scale(kToolbarHeight); + + if (settings.useTvLayout) { + height += CaptionedButton.getTelevisionButtonHeight(context); + } + if (showFilterBar) { + height += FilterBar.preferredHeight; + } + if (context.read<Query>().enabled) { + height += EntryQueryBar.getPreferredHeight(textScaler); + } + + if (CastController.instance.isCastingNotifier.value) { + height += _castBarHeight; + } + + return height; + } + + Widget? _buildAppBarLeading({ + required bool hasDrawer, + required bool isSelecting, + }) { + if (settings.useTvLayout) return null; + + if (!hasDrawer) { + return const CloseButton(); + } + + VoidCallback? onPressed; + String? tooltip; + + if (isSelecting) { + onPressed = () => context.read<Selection<AvesEntry>>().browse(); + tooltip = MaterialLocalizations.of(context).backButtonTooltip; + } else { + onPressed = Scaffold.of(context).openDrawer; + tooltip = MaterialLocalizations.of(context).openAppDrawerTooltip; + } + + return IconButton( + key: const Key('appbar-leading-button'), + icon: AnimatedIcon( + icon: AnimatedIcons.menu_arrow, + progress: _browseToSelectAnimation, + ), + onPressed: onPressed, + tooltip: tooltip, + ); + } + + Widget _buildAppBarTitle(bool isSelecting) { + final l10n = context.l10n; + + if (isSelecting) { + return Selector<Selection<AvesEntry>?, int>( + selector: (context, selection) => selection?.selectedItems.length ?? 0, + builder: (context, count, child) => Text( + count == 0 ? l10n.collectionSelectPageTitle : l10n.itemCount(count), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ); + } else { + final appMode = context.watch<ValueNotifier<AppMode>>().value; + + Widget title = Text( + appMode.isPickingMedia + ? l10n.collectionPickPageTitle + : (isTrash ? l10n.binPageTitle : l10n.collectionPageTitle), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ); + + if (appMode == AppMode.main) { + title = SourceStateAwareAppBarTitle( + title: title, + source: source, + ); + } + + return InteractiveAppBarTitle( + onTap: appMode.canNavigate ? _goToSearch : null, + child: title, + ); + } + } + + void _goToSearch() { + Navigator.maybeOf(context)?.push( + SearchPageRoute( + delegate: CollectionSearchDelegate( + searchFieldLabel: context.l10n.searchCollectionFieldHint, + searchFieldStyle: Themes.searchFieldStyle(context), + source: collection.source, + parentCollection: collection, + ), + ), + ); + } + + List<Widget> _buildActions( + BuildContext context, Selection<AvesEntry> selection, double maxWidth) { + final appMode = context.watch<ValueNotifier<AppMode>>().value; + final isSelecting = selection.isSelecting; + final selectedItemCount = selection.selectedItems.length; + + bool isVisible(EntrySetAction action) => _actionDelegate.isVisible( + action, + appMode: appMode, + isSelecting: isSelecting, + itemCount: collection.entryCount, + selectedItemCount: selectedItemCount, + isTrash: isTrash, + ); + + bool canApply(EntrySetAction action) => _actionDelegate.canApply( + action, + isSelecting: isSelecting, + collection: collection, + selectedItemCount: selectedItemCount, + ); + + return settings.useTvLayout + ? _buildTelevisionActions( + context: context, + appMode: appMode, + selection: selection, + isVisible: isVisible, + canApply: canApply, + ) + : _buildMobileActions( + context: context, + appMode: appMode, + selection: selection, + maxWidth: maxWidth, + isVisible: isVisible, + canApply: canApply, + ); + } + + List<Widget> _buildTelevisionActions({ + required BuildContext context, + required AppMode appMode, + required Selection<AvesEntry> selection, + required bool Function(EntrySetAction action) isVisible, + required bool Function(EntrySetAction action) canApply, + }) { + final isSelecting = selection.isSelecting; + + return [ + ...EntrySetActions.general, + ...isSelecting + ? EntrySetActions.pageSelection + : EntrySetActions.pageBrowsing, + ].nonNulls.where(isVisible).map((action) { + final enabled = canApply(action); + return CaptionedButton( + iconButtonBuilder: (context, focusNode) => _buildButtonIcon( + context, + action, + enabled: enabled, + selection: selection, + focusNode: focusNode, + ), + captionText: _buildButtonCaption( + context, + action, + enabled: enabled, + ), + onPressed: enabled ? () => _onActionSelected(action) : null, + ); + }).toList(); + } + + static double _iconButtonWidth(BuildContext context) { + const defaultPadding = EdgeInsets.all(8); + const defaultIconSize = 24.0; + return defaultPadding.horizontal + + MediaQuery.textScalerOf(context).scale(defaultIconSize); + } + + List<Widget> _buildMobileActions({ + required BuildContext context, + required AppMode appMode, + required Selection<AvesEntry> selection, + required double maxWidth, + required bool Function(EntrySetAction action) isVisible, + required bool Function(EntrySetAction action) canApply, + }) { + final availableCount = (maxWidth / _iconButtonWidth(context)).floor(); + + final isSelecting = selection.isSelecting; + final selectedItemCount = selection.selectedItems.length; + final hasSelection = selectedItemCount > 0; + + final browsingQuickActions = settings.collectionBrowsingQuickActions; + final selectionQuickActions = + isTrash ? _trashSelectionQuickActions : settings.collectionSelectionQuickActions; + + final quickActions = (isSelecting ? selectionQuickActions : browsingQuickActions) + .take(max(0, availableCount - 1)) + .toList(); + + final quickActionButtons = quickActions + .where(isVisible) + .map((action) => _buildButtonIcon( + context, + action, + enabled: canApply(action), + selection: selection, + )); + + final animations = + context.select<Settings, AccessibilityAnimations>((v) => v.accessibilityAnimations); + + return [ + ...quickActionButtons, + PopupMenuButton<EntrySetAction>( + key: const Key('appbar-menu-button'), + itemBuilder: (context) { + bool isValidForMenu(EntrySetAction? v) => + v == null || (!quickActions.contains(v) && isVisible(v)); + + final generalMenuItems = EntrySetActions.general + .where(isValidForMenu) + .map((action) => + _toMenuItem(action, enabled: canApply(action), selection: selection)); + + final allContextualActions = + isSelecting ? EntrySetActions.pageSelection : EntrySetActions.pageBrowsing; + + final contextualMenuActions = + allContextualActions.where(isValidForMenu).fold<List<EntrySetAction?>>( + [], + (prev, v) { + if (v == null && (prev.isEmpty || prev.last == null)) return prev; + return [...prev, v]; + }, + ); + + if (contextualMenuActions.isNotEmpty && contextualMenuActions.last == null) { + contextualMenuActions.removeLast(); + } + + final contextualMenuItems = <PopupMenuEntry<EntrySetAction>>[ + ...contextualMenuActions.map((action) { + if (action == null) return const PopupMenuDivider(); + return _toMenuItem( + action, + enabled: canApply(action), + selection: selection, + ); + }), + if (isSelecting && + !settings.isReadOnly && + appMode == AppMode.main && + !isTrash) + PopupMenuExpansionPanel<EntrySetAction>( + enabled: hasSelection, + value: 'edit', + icon: AIcons.edit, + title: context.l10n.collectionActionEdit, + items: [ + _buildRotateAndFlipMenuItems(context, canApply: canApply), + ...EntrySetActions.edit + .where((v) => isVisible(v) && !quickActions.contains(v)) + .map((action) => _toMenuItem( + action, + enabled: canApply(action), + selection: selection, + )), + ], + ), + ]; + + return [ + ...generalMenuItems, + if (contextualMenuItems.isNotEmpty) ...[ + const PopupMenuDivider(), + ...contextualMenuItems, + ], + ]; + }, + onSelected: (action) async { + await Future.delayed(animations.popUpAnimationDelay * timeDilation); + await _onActionSelected(action); + }, + popUpAnimationStyle: animations.popUpAnimationStyle, + ), + ]; + } + + Set<AvesEntry> _getExpandedSelectedItems(Selection<AvesEntry> selection) { + return selection.selectedItems + .expand((entry) => entry.stackedEntries ?? {entry}) + .toSet(); + } + + Key _getActionKey(EntrySetAction action) => Key('menu-${action.name}'); + + Widget _buildButtonIcon( + BuildContext context, + EntrySetAction action, { + required bool enabled, + FocusNode? focusNode, + required Selection<AvesEntry> selection, + }) { + final blurred = settings.enableBlurEffect; + final onPressed = enabled ? () => _onActionSelected(action) : null; + + switch (action) { + case EntrySetAction.toggleTitleSearch: + return Selector<Query?, bool>( + selector: (context, query) => query?.enabled ?? false, + builder: (context, queryEnabled, child) { + return TitleSearchToggler( + queryEnabled: queryEnabled, + onPressed: onPressed, + focusNode: focusNode, + ); + }, + ); + + case EntrySetAction.copy: + return MoveButton( + copy: true, + blurred: blurred, + onChooserValue: (album) => + _actionDelegate.quickMove(context, album, copy: true), + onPressed: onPressed, + ); + + case EntrySetAction.move: + return MoveButton( + copy: false, + blurred: blurred, + onChooserValue: (album) => + _actionDelegate.quickMove(context, album, copy: false), + onPressed: onPressed, + ); + + case EntrySetAction.editRating: + return RateButton( + blurred: blurred, + onChooserValue: (rating) => _actionDelegate.quickRate(context, rating), + focusNode: focusNode, + onPressed: onPressed, + ); + + case EntrySetAction.editTags: + return TagButton( + blurred: blurred, + onChooserValue: (filter) => _actionDelegate.quickTag(context, filter), + focusNode: focusNode, + onPressed: onPressed, + ); + + case EntrySetAction.toggleFavourite: + return FavouriteToggler( + entries: _getExpandedSelectedItems(selection), + focusNode: focusNode, + onPressed: onPressed, + ); + + default: + return IconButton( + key: _getActionKey(action), + icon: action.getIcon(), + onPressed: onPressed, + focusNode: focusNode, + tooltip: action.getText(context), + ); + } + } + + Widget _buildButtonCaption( + BuildContext context, + EntrySetAction action, { + required bool enabled, + }) { + switch (action) { + case EntrySetAction.toggleTitleSearch: + return TitleSearchTogglerCaption(enabled: enabled); + default: + return CaptionedButtonText( + text: action.getText(context), + enabled: enabled, + ); + } + } + + PopupMenuItem<EntrySetAction> _toMenuItem( + EntrySetAction action, { + required bool enabled, + required Selection<AvesEntry> selection, + }) { + late Widget child; + + switch (action) { + case EntrySetAction.toggleTitleSearch: + child = TitleSearchToggler( + queryEnabled: context.read<Query>().enabled, + isMenuItem: true, + ); + break; + + case EntrySetAction.toggleFavourite: + child = FavouriteToggler( + entries: _getExpandedSelectedItems(selection), + isMenuItem: true, + ); + break; + + default: + child = MenuRow( + text: action.getText(context), + icon: action.getIcon(), + ); + } + + return PopupMenuItem( + key: _getActionKey(action), + value: action, + enabled: enabled, + child: child, + ); + } + + PopupMenuEntry<EntrySetAction> _buildRotateAndFlipMenuItems( + BuildContext context, { + required bool Function(EntrySetAction action) canApply, + }) { + Widget buildDivider() => const SizedBox( + height: 16, + child: VerticalDivider(width: 1, thickness: 1), + ); + + Widget buildItem(EntrySetAction action) => Expanded( + child: Material( + color: Colors.transparent, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(8)), + ), + clipBehavior: Clip.antiAlias, + child: PopupMenuItem( + value: action, + enabled: canApply(action), + child: Tooltip( + message: action.getText(context), + child: Center(child: action.getIcon()), + ), + ), + ), + ); + + return PopupMenuItemContainer( + child: Row( + children: [ + buildDivider(), + buildItem(EntrySetAction.rotateCCW), + buildDivider(), + buildItem(EntrySetAction.rotateCW), + buildDivider(), + buildItem(EntrySetAction.flip), + buildDivider(), + ], + ), + ); + } + + Future<void> _onActionSelected(EntrySetAction action) async { + switch (action) { + case EntrySetAction.configureView: + await _configureView(); + break; + case EntrySetAction.select: + context.read<Selection<AvesEntry>>().select(); + break; + case EntrySetAction.selectAll: + context.read<Selection<AvesEntry>>().addToSelection(collection.sortedEntries); + break; + case EntrySetAction.selectNone: + context.read<Selection<AvesEntry>>().clearSelection(); + break; + default: + _actionDelegate.onActionSelected(context, action); + } + } + + Future<void> _configureView() async { + final initialValue = ( + settings.collectionSortFactor, + settings.collectionSectionFactor, + settings.getTileLayout(CollectionPage.routeName), + settings.collectionSortReverse, + ); + + final extentController = context.read<TileExtentController>(); + final value = + await showDialog<(EntrySortFactor?, EntrySectionFactor?, TileLayout?, bool)>( + context: context, + builder: (context) { + return TileViewDialog<EntrySortFactor, EntrySectionFactor, TileLayout>( + initialValue: initialValue, + sortOptions: _sortOptions + .map((v) => TileViewDialogOption( + value: v, + title: v.getName(context), + icon: v.icon, + )) + .toList(), + sectionOptions: _sectionOptions + .map((v) => TileViewDialogOption( + value: v, + title: v.getName(context), + icon: v.icon, + )) + .toList(), + layoutOptions: _layoutOptions + .map((v) => TileViewDialogOption( + value: v, + title: v.getName(context), + icon: v.icon, + )) + .toList(), + sortOrder: (factor, reverse) => factor.getOrderName(context, reverse), + canSection: (s, g, l) => s == EntrySortFactor.date, + tileExtentController: extentController, + ); + }, + routeSettings: const RouteSettings(name: TileViewDialog.routeName), + ); + + await Future.delayed(ADurations.dialogTransitionLoose * timeDilation); + + if (value != null && initialValue != value) { + settings.collectionSortFactor = value.$1!; + settings.collectionSectionFactor = value.$2!; + settings.setTileLayout(CollectionPage.routeName, value.$3!); + settings.collectionSortReverse = value.$4; + } + } +} diff --git a/lib/widgets/collection/app_bar/remote/remote_bar.dart b/lib/widgets/collection/app_bar/remote/remote_bar.dart new file mode 100644 index 0000000..56626c7 --- /dev/null +++ b/lib/widgets/collection/app_bar/remote/remote_bar.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:aves/widgets/collection/remote_status_button.dart'; +import 'package:aves/model/source/collection_source.dart'; + +class RemoteBar extends StatelessWidget { + final CollectionSource source; + + const RemoteBar({super.key, required this.source}); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 48, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RemoteStatusButton(source: source), + ], + ), + ); + } +} diff --git a/lib/widgets/collection/app_bar/remote/remote_controls_sheet.dart b/lib/widgets/collection/app_bar/remote/remote_controls_sheet.dart new file mode 100644 index 0000000..3c6c845 --- /dev/null +++ b/lib/widgets/collection/app_bar/remote/remote_controls_sheet.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +import 'package:aves/widgets/collection/remote_status_button.dart'; +import 'package:aves/model/source/collection_source.dart'; + +class RemoteControlsSheet extends StatelessWidget { + final CollectionSource source; + + const RemoteControlsSheet({super.key, required this.source}); + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.black87, + padding: const EdgeInsets.all(16), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Text( + 'Controlli Remote', + style: TextStyle(color: Colors.white, fontSize: 18), + ), + const SizedBox(height: 16), + RemoteStatusButton(source: source), + ], + ), + ); + } +} diff --git a/lib/widgets/collection/collection_grid.dart b/lib/widgets/collection/collection_grid.dart new file mode 100644 index 0000000..13a1b8d --- /dev/null +++ b/lib/widgets/collection/collection_grid.dart @@ -0,0 +1,931 @@ +import 'dart:async'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/app/permissions.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/filters/favourite.dart'; +import 'package:aves/model/filters/mime.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:aves/widgets/collection/app_bar/collection_app_bar.dart'; +import 'package:aves/widgets/collection/draggable_thumb_label.dart'; +import 'package:aves/widgets/collection/grid/list_details_theme.dart'; +import 'package:aves/widgets/collection/grid/section_layout.dart'; +import 'package:aves/widgets/collection/grid/tile.dart'; +import 'package:aves/widgets/collection/loading.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/scrollbar.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/behaviour/routes.dart'; +import 'package:aves/widgets/common/behaviour/sloppy_scroll_physics.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:aves/widgets/common/grid/draggable_thumb_label.dart'; +import 'package:aves/widgets/common/grid/item_tracker.dart'; +import 'package:aves/widgets/common/grid/scaling.dart'; +import 'package:aves/widgets/common/grid/sections/fixed/scale_grid.dart'; +import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:aves/widgets/common/grid/sections/section_layout.dart'; +import 'package:aves/widgets/common/grid/selector.dart'; +import 'package:aves/widgets/common/grid/sliver.dart'; +import 'package:aves/widgets/common/grid/theme.dart'; +import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/common/identity/scroll_thumb.dart'; +import 'package:aves/widgets/common/providers/tile_extent_controller_provider.dart'; +import 'package:aves/widgets/common/providers/viewer_entry_provider.dart'; +import 'package:aves/widgets/common/thumbnail/decorated.dart'; +import 'package:aves/widgets/common/thumbnail/image.dart'; +import 'package:aves/widgets/common/thumbnail/notifications.dart'; +import 'package:aves/widgets/common/tile_extent_controller.dart'; +import 'package:aves/widgets/navigation/nav_bar/nav_bar.dart'; +import 'package:aves/widgets/viewer/entry_viewer_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:intl/intl.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:provider/provider.dart'; + +// ✅ accesso al DB per capire se esiste cache (evita "scanner" alle riaperture) +import 'package:aves/services/common/services.dart'; + +// REMOTE: import per le thumb di rete +import 'package:aves/remote/remote_image_tile.dart'; + +// ✅ Remote origin costante +import 'package:aves/remote/remote_origin.dart'; + +// ✅ Flag remoti (locale+remoto) +import 'package:aves/model/entry/extensions/remote_flags.dart'; + +// ✅ Cornice ibrida (rettangolare + smussata) +import 'package:aves/widgets/common/hybrid_frame.dart'; + +class CollectionGrid extends StatefulWidget { + final String settingsRouteKey; + + static const double extentMin = 46; + static const double extentMax = 300; + static const double fixedExtentLayoutSpacing = 2; + static const double mosaicLayoutSpacing = 4; + + static int get columnCountDefault => settings.useTvLayout ? 6 : 4; + + const CollectionGrid({ + super.key, + required this.settingsRouteKey, + }); + + @override + State<CollectionGrid> createState() => _CollectionGridState(); +} + +class _CollectionGridState extends State<CollectionGrid> { + TileExtentController? _tileExtentController; + + String get settingsRouteKey => widget.settingsRouteKey; + + @override + void dispose() { + _tileExtentController?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final spacing = context.select<Settings, double>((v) => + v.getTileLayout(settingsRouteKey) == TileLayout.mosaic + ? CollectionGrid.mosaicLayoutSpacing + : CollectionGrid.fixedExtentLayoutSpacing); + + if (_tileExtentController?.spacing != spacing) { + _tileExtentController = TileExtentController( + settingsRouteKey: settingsRouteKey, + columnCountDefault: CollectionGrid.columnCountDefault, + extentMin: CollectionGrid.extentMin, + extentMax: CollectionGrid.extentMax, + spacing: spacing, + horizontalPadding: 2, + ); + } + + return TileExtentControllerProvider( + controller: _tileExtentController!, + child: const _CollectionGridContent(), + ); + } +} + +class _CollectionGridContent extends StatefulWidget { + const _CollectionGridContent(); + + @override + State<_CollectionGridContent> createState() => _CollectionGridContentState(); +} + +class _CollectionGridContentState extends State<_CollectionGridContent> { + final ValueNotifier<AvesEntry?> _focusedItemNotifier = ValueNotifier(null); + final ValueNotifier<bool> _isScrollingNotifier = ValueNotifier(false); + final ValueNotifier<AppMode> _selectingAppModeNotifier = + ValueNotifier(AppMode.pickFilteredMediaInternal); + + @override + void initState() { + super.initState(); + WidgetsBinding.instance + .addPostFrameCallback((_) => context.read<ViewerEntryNotifier>().value = null); + } + + @override + void dispose() { + _focusedItemNotifier.dispose(); + _isScrollingNotifier.dispose(); + _selectingAppModeNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final selectable = + context.select<ValueNotifier<AppMode>, bool>((v) => v.value.canSelectMedia); + final settingsRouteKey = context.read<TileExtentController>().settingsRouteKey; + final tileLayout = + context.select<Settings, TileLayout>((v) => v.getTileLayout(settingsRouteKey)); + + return Consumer<CollectionLens>( + builder: (context, collection, child) { + final sectionedListLayoutProvider = ValueListenableBuilder<double>( + valueListenable: context.select<TileExtentController, ValueNotifier<double>>( + (controller) => controller.extentNotifier), + builder: (context, thumbnailExtent, child) { + assert(thumbnailExtent > 0); + return Selector<TileExtentController, (double, int, double, double)>( + selector: (context, c) => + (c.viewportSize.width, c.columnCount, c.spacing, c.horizontalPadding), + builder: (context, c, child) { + final (scrollableWidth, columnCount, tileSpacing, horizontalPadding) = c; + final source = collection.source; + + return GridTheme( + extent: thumbnailExtent, + child: EntryListDetailsTheme( + extent: thumbnailExtent, + child: ValueListenableBuilder<SourceState>( + valueListenable: source.stateNotifier, + builder: (context, sourceState, child) { + late final Duration tileAnimationDelay; + if (sourceState == SourceState.ready) { + final target = context.read<DurationsData>().staggeredAnimationPageTarget; + tileAnimationDelay = context + .read<TileExtentController>() + .getTileAnimationDelay(target); + } else { + tileAnimationDelay = Duration.zero; + } + + return NotificationListener<OpenViewerNotification>( + onNotification: (notification) { + _goToViewer(collection, notification.entry); + return true; + }, + child: StreamBuilder( + stream: source.eventBus.on<AspectRatioChangedEvent>(), + builder: (context, snapshot) => SectionedEntryListLayoutProvider( + collection: collection, + selectable: selectable, + scrollableWidth: scrollableWidth, + tileLayout: tileLayout, + columnCount: columnCount, + spacing: tileSpacing, + horizontalPadding: horizontalPadding, + tileExtent: thumbnailExtent, + tileBuilder: (entry, tileSize) { + final extent = tileSize.shortestSide; + + // REMOTE: ramo dedicato per le entry remote (origin==RemoteOrigin.value) + if (entry.origin == RemoteOrigin.value) { + return RemoteInteractiveTile( + key: ValueKey('remote_${entry.id}'), + entry: entry, + thumbnailExtent: extent, + ); + } + + // Locale: flusso preesistente (ma con cornice ibrida se locale+remote) + return AnimatedBuilder( + animation: favourites, + builder: (context, child) { + Widget tile = InteractiveTile( + key: ValueKey(entry.id), + collection: collection, + entry: entry, + thumbnailExtent: extent, + tileLayout: tileLayout, + isScrollingNotifier: _isScrollingNotifier, + ); + + // ✅ Cornice speciale SOLO per locali che hanno anche remote link + if (entry.isLocalAndRemote) { + tile = HybridFrame(child: tile); + } + + if (!settings.useTvLayout) return tile; + + return Focus( + onFocusChange: (focused) { + if (focused) { + _focusedItemNotifier.value = entry; + } else if (_focusedItemNotifier.value == entry) { + _focusedItemNotifier.value = null; + } + }, + child: ValueListenableBuilder<AvesEntry?>( + valueListenable: _focusedItemNotifier, + builder: (context, focusedItem, child) { + return AnimatedScale( + scale: focusedItem == entry ? 1 : .9, + curve: Curves.fastOutSlowIn, + duration: context.select<DurationsData, Duration>( + (v) => v.tvImageFocusAnimation), + child: child!, + ); + }, + child: tile, + ), + ); + }, + ); + }, + tileAnimationDelay: tileAnimationDelay, + child: child!, + ), + ), + ); + }, + child: child, + ), + ), + ); + }, + child: child, + ); + }, + child: _CollectionSectionedContent( + collection: collection, + isScrollingNotifier: _isScrollingNotifier, + scrollController: PrimaryScrollController.of(context), + tileLayout: tileLayout, + selectable: selectable, + ), + ); + return sectionedListLayoutProvider; + }, + ); + } + + Future<void> _goToViewer(CollectionLens collection, AvesEntry entry) async { + final viewerEntryNotifier = context.read<ViewerEntryNotifier>(); + + if (viewerEntryNotifier.value == entry) return; + WidgetsBinding.instance.addPostFrameCallback((_) => viewerEntryNotifier.value = entry); + + final selection = context.read<Selection<AvesEntry>>(); + await Navigator.maybeOf(context)?.push( + TransparentMaterialPageRoute( + settings: const RouteSettings(name: EntryViewerPage.routeName), + pageBuilder: (context, a, sa) { + final viewerCollection = collection.copyWith( + listenToSource: false, + ); + Widget child = EntryViewerPage( + collection: viewerCollection, + initialEntry: entry, + ); + + if (selection.isSelecting) { + child = MultiProvider( + providers: [ + ListenableProvider<ValueNotifier<AppMode>>.value(value: _selectingAppModeNotifier), + ChangeNotifierProvider<Selection<AvesEntry>>.value(value: selection), + ], + child: child, + ); + } + + return child; + }, + ), + ); + + final animate = context.read<Settings>().animate; + if (animate) { + await Future.delayed(ADurations.pageTransitionExact * timeDilation); + } + viewerEntryNotifier.value = null; + } +} + +class _CollectionSectionedContent extends StatefulWidget { + final CollectionLens collection; + final ValueNotifier<bool> isScrollingNotifier; + final ScrollController scrollController; + final TileLayout tileLayout; + final bool selectable; + + const _CollectionSectionedContent({ + required this.collection, + required this.isScrollingNotifier, + required this.scrollController, + required this.tileLayout, + required this.selectable, + }); + + @override + State<_CollectionSectionedContent> createState() => _CollectionSectionedContentState(); +} + +class _CollectionSectionedContentState extends State<_CollectionSectionedContent> { + final ValueNotifier<double> _appBarHeightNotifier = ValueNotifier(0); + final GlobalKey _scrollableKey = GlobalKey(debugLabel: 'thumbnail-collection-scrollable'); + + CollectionLens get collection => widget.collection; + TileLayout get tileLayout => widget.tileLayout; + ScrollController get scrollController => widget.scrollController; + + @override + void initState() { + super.initState(); + _appBarHeightNotifier.addListener(_onAppBarHeightChanged); + } + + @override + void dispose() { + _appBarHeightNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final scrollView = AnimationLimiter( + child: _CollectionScrollView( + scrollableKey: _scrollableKey, + collection: collection, + appBar: CollectionAppBar( + appBarHeightNotifier: _appBarHeightNotifier, + scrollController: scrollController, + collection: collection, + ), + appBarHeightNotifier: _appBarHeightNotifier, + isScrollingNotifier: widget.isScrollingNotifier, + scrollController: scrollController, + ), + ); + + final scaler = _CollectionScaler( + scrollableKey: _scrollableKey, + appBarHeightNotifier: _appBarHeightNotifier, + tileLayout: tileLayout, + child: scrollView, + ); + + final selector = GridSelectionGestureDetector<AvesEntry>( + scrollableKey: _scrollableKey, + selectable: widget.selectable, + items: collection.sortedEntries, + scrollController: scrollController, + appBarHeightNotifier: _appBarHeightNotifier, + child: scaler, + ); + + return GridItemTracker<AvesEntry>( + scrollableKey: _scrollableKey, + tileLayout: tileLayout, + appBarHeightNotifier: _appBarHeightNotifier, + scrollController: scrollController, + child: selector, + ); + } + + void _onAppBarHeightChanged() => setState(() {}); +} + +class _CollectionScaler extends StatelessWidget { + final GlobalKey scrollableKey; + final ValueNotifier<double> appBarHeightNotifier; + final TileLayout tileLayout; + final Widget child; + + const _CollectionScaler({ + required this.scrollableKey, + required this.appBarHeightNotifier, + required this.tileLayout, + required this.child, + }); + + @override + Widget build(BuildContext context) { + final (tileSpacing, horizontalPadding) = + context.select<TileExtentController, (double, double)>((v) => (v.spacing, v.horizontalPadding)); + final brightness = Theme.of(context).brightness; + final borderColor = DecoratedThumbnail.borderColor(context); + final borderWidth = DecoratedThumbnail.borderWidth(context); + + return GridScaleGestureDetector<AvesEntry>( + scrollableKey: scrollableKey, + tileLayout: tileLayout, + heightForWidth: (width) => width, + gridBuilder: (center, tileSize, child) => CustomPaint( + painter: FixedExtentGridPainter( + tileLayout: tileLayout, + tileCenter: center, + tileSize: tileSize, + spacing: tileSpacing, + horizontalPadding: horizontalPadding, + borderWidth: borderWidth, + borderRadius: Radius.zero, + color: borderColor, + textDirection: Directionality.of(context), + ), + child: child, + ), + scaledItemBuilder: (entry, tileSize) => EntryListDetailsTheme( + extent: tileSize.height, + child: Builder( + builder: (_) { + if (entry.origin == RemoteOrigin.value) { + return RemoteInteractiveTile( + key: ValueKey('remote_scaled_${entry.id}'), + entry: entry, + thumbnailExtent: context.read<TileExtentController>().effectiveExtentMax, + ); + } + + Widget tile = Tile( + entry: entry, + thumbnailExtent: context.read<TileExtentController>().effectiveExtentMax, + tileLayout: tileLayout, + ); + + if (entry.isLocalAndRemote) { + tile = HybridFrame(child: tile); + } + + return tile; + }, + ), + ), + mosaicItemBuilder: (index, targetExtent) => DecoratedBox( + decoration: BoxDecoration( + color: ThumbnailImage.computeLoadingBackgroundColor(index * 10, brightness).withValues(alpha: .9), + border: Border.all( + color: borderColor, + width: borderWidth, + ), + ), + ), + child: child, + ); + } +} + +class _CollectionScrollView extends StatefulWidget { + final GlobalKey scrollableKey; + final CollectionLens collection; + final Widget appBar; + final ValueNotifier<double> appBarHeightNotifier; + final ValueNotifier<bool> isScrollingNotifier; + final ScrollController scrollController; + + const _CollectionScrollView({ + required this.scrollableKey, + required this.collection, + required this.appBar, + required this.appBarHeightNotifier, + required this.isScrollingNotifier, + required this.scrollController, + }); + + @override + State<_CollectionScrollView> createState() => _CollectionScrollViewState(); +} + +class _CollectionScrollViewState extends State<_CollectionScrollView> with WidgetsBindingObserver { + Timer? _scrollMonitoringTimer; + bool _checkingStoragePermission = false; + + late final Future<bool> _hasAnyDbCacheFuture; + + @override + void initState() { + super.initState(); + _hasAnyDbCacheFuture = _hasAnyDbCache(); + _registerWidget(widget); + WidgetsBinding.instance.addObserver(this); + } + + Future<bool> _hasAnyDbCache() async { + try { + final rows = await localMediaDb.rawDb.rawQuery( + 'SELECT 1 FROM entry WHERE trashed=0 LIMIT 1', + ); + return rows.isNotEmpty; + } catch (_) { + return false; + } + } + + @override + void didUpdateWidget(covariant _CollectionScrollView oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + _unregisterWidget(widget); + _stopScrollMonitoringTimer(); + super.dispose(); + } + + void _registerWidget(_CollectionScrollView widget) { + widget.collection.filterChangeNotifier.addListener(_scrollToTop); + widget.collection.sortSectionChangeNotifier.addListener(_scrollToTop); + widget.scrollController.addListener(_onScrollChanged); + } + + void _unregisterWidget(_CollectionScrollView widget) { + widget.collection.filterChangeNotifier.removeListener(_scrollToTop); + widget.collection.sortSectionChangeNotifier.removeListener(_scrollToTop); + widget.scrollController.removeListener(_onScrollChanged); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed && _checkingStoragePermission) { + _checkingStoragePermission = false; + _isStoragePermissionGranted.then((granted) { + if (granted) { + widget.collection.source.init(scope: CollectionSource.fullScope); + } + }); + } + } + + @override + Widget build(BuildContext context) { + final scrollView = _buildScrollView(widget.appBar, widget.collection); + return settings.useTvLayout ? scrollView : _buildDraggableScrollView(scrollView, widget.collection); + } + + Widget _buildDraggableScrollView(Widget scrollView, CollectionLens collection) { + return ValueListenableBuilder<double>( + valueListenable: widget.appBarHeightNotifier, + builder: (context, appBarHeight, child) { + return Selector<MediaQueryData, double>( + selector: (context, mq) => mq.effectiveBottomPadding, + builder: (context, mqPaddingBottom, child) { + return Selector<Settings, bool>( + selector: (context, s) => s.enableBottomNavigationBar, + builder: (context, enableBottomNavigationBar, child) { + final canNavigate = + context.select<ValueNotifier<AppMode>, bool>((v) => v.value.canNavigate); + final showBottomNavigationBar = canNavigate && enableBottomNavigationBar; + final navBarHeight = showBottomNavigationBar ? AppBottomNavBar.height : 0; + return Selector<SectionedListLayout<AvesEntry>, List<SectionLayout>>( + selector: (context, layout) => layout.sectionLayouts, + builder: (context, sectionLayouts, child) { + final scrollController = widget.scrollController; + final offsetIncrementSnapThreshold = + context.select<TileExtentController, double>((v) => (v.extentNotifier.value + v.spacing) / 4); + return DraggableScrollbar( + backgroundColor: Colors.white, + scrollThumbSize: Size(avesScrollThumbWidth, avesScrollThumbHeight), + scrollThumbBuilder: avesScrollThumbBuilder( + height: avesScrollThumbHeight, + backgroundColor: Colors.white, + ), + controller: scrollController, + dragOffsetSnapper: (scrollOffset, offsetIncrement) { + if (offsetIncrement > offsetIncrementSnapThreshold && + scrollOffset < scrollController.position.maxScrollExtent) { + final section = + sectionLayouts.firstWhereOrNull((section) => section.hasChildAtOffset(scrollOffset)); + if (section != null) { + if (section.maxOffset - section.minOffset < + scrollController.position.viewportDimension) { + return section.minOffset; + } else { + final index = section.getMinChildIndexForScrollOffset(scrollOffset); + return section.indexToLayoutOffset(index); + } + } + } + return scrollOffset; + }, + crumbsBuilder: () => _getCrumbs(sectionLayouts), + padding: EdgeInsets.only( + top: appBarHeight, + bottom: navBarHeight + mqPaddingBottom, + ), + labelTextBuilder: (offsetY) => CollectionDraggableThumbLabel( + collection: collection, + offsetY: offsetY, + ), + crumbTextBuilder: (label) => DraggableCrumbLabel(label: label), + child: scrollView, + ); + }, + ); + }, + ); + }, + ); + }, + ); + } + + Widget _buildScrollView(Widget appBar, CollectionLens collection) { + return CustomScrollView( + key: widget.scrollableKey, + primary: true, + physics: collection.isEmpty + ? const NeverScrollableScrollPhysics() + : SloppyScrollPhysics( + gestureSettings: MediaQuery.gestureSettingsOf(context), + parent: const AlwaysScrollableScrollPhysics(), + ), + cacheExtent: (() { + final base = context.select<TileExtentController, double>((c) => c.effectiveExtentMax); + final h = MediaQuery.of(context).size.height; + final target = h * 2; + return target < base ? base : target; + })(), + slivers: [ + appBar, + collection.isEmpty + ? SliverFillRemaining( + hasScrollBody: false, + child: _buildEmptyContent(collection), + ) + : const SectionedListSliver<AvesEntry>(), + const NavBarPaddingSliver(), + const BottomPaddingSliver(), + const TvTileGridBottomPaddingSliver(), + ], + ); + } + + Widget _buildEmptyContent(CollectionLens collection) { + final source = collection.source; + return ValueListenableBuilder<SourceState>( + valueListenable: source.stateNotifier, + builder: (context, sourceState, child) { + if (sourceState == SourceState.loading) { + return FutureBuilder<bool>( + future: _hasAnyDbCacheFuture, + builder: (context, snapshot) { + final hasCache = snapshot.data ?? false; + if (hasCache) { + return const Center( + child: SizedBox( + width: 18, + height: 18, + child: CircularProgressIndicator(strokeWidth: 1.6), + ), + ); + } + return LoadingEmptyContent(source: source); + }, + ); + } + + return FutureBuilder<bool>( + future: _isStoragePermissionGranted, + builder: (context, snapshot) { + final granted = snapshot.data ?? true; + Widget? bottom = granted + ? null + : Padding( + padding: const EdgeInsets.only(top: 16), + child: AvesOutlinedButton( + label: context.l10n.collectionEmptyGrantAccessButtonLabel, + onPressed: () async { + if (await openAppSettings()) { + _checkingStoragePermission = true; + } + }, + ), + ); + + if (collection.filters.any((filter) => filter is FavouriteFilter)) { + return EmptyContent( + icon: AIcons.favourite, + text: context.l10n.collectionEmptyFavourites, + bottom: bottom, + ); + } + if (collection.filters.any((filter) => + filter is MimeFilter && filter.mime == MimeTypes.anyVideo)) { + return EmptyContent( + icon: AIcons.video, + text: context.l10n.collectionEmptyVideos, + bottom: bottom, + ); + } + return EmptyContent( + icon: AIcons.image, + text: context.l10n.collectionEmptyImages, + bottom: bottom, + ); + }, + ); + }, + ); + } + + void _scrollToTop() => widget.scrollController.jumpTo(0); + + void _onScrollChanged() { + widget.isScrollingNotifier.value = true; + _stopScrollMonitoringTimer(); + _scrollMonitoringTimer = Timer(ADurations.collectionScrollMonitoringTimerDelay, () { + widget.isScrollingNotifier.value = false; + }); + } + + void _stopScrollMonitoringTimer() => _scrollMonitoringTimer?.cancel(); + + Map<double, String> _getCrumbs(List<SectionLayout> sectionLayouts) { + final crumbs = <double, String>{}; + if (sectionLayouts.length <= 1) return crumbs; + + final maxOffset = sectionLayouts.last.maxOffset; + void addAlbums(CollectionLens collection, List<SectionLayout> sectionLayouts, Map<double, String> crumbs) { + final source = collection.source; + sectionLayouts.forEach((section) { + final directory = (section.sectionKey as EntryAlbumSectionKey).directory; + if (directory != null) { + final label = source.getStoredAlbumDisplayName(context, directory); + crumbs[section.minOffset / maxOffset] = label; + } + }); + } + + final collection = widget.collection; + switch (collection.sortFactor) { + case EntrySortFactor.date: + switch (collection.sectionFactor) { + case EntrySectionFactor.album: + addAlbums(collection, sectionLayouts, crumbs); + case EntrySectionFactor.month: + case EntrySectionFactor.day: + final firstKey = sectionLayouts.first.sectionKey; + final lastKey = sectionLayouts.last.sectionKey; + if (firstKey is EntryDateSectionKey && lastKey is EntryDateSectionKey) { + final newest = firstKey.date; + final oldest = lastKey.date; + if (newest != null && oldest != null) { + final locale = context.locale; + final dateFormat = (newest.difference(oldest).inHumanDays).abs() > 365 + ? DateFormat.y(locale) + : DateFormat.MMM(locale); + String? lastLabel; + sectionLayouts.forEach((section) { + final date = (section.sectionKey as EntryDateSectionKey).date; + if (date != null) { + final label = dateFormat.format(date); + if (label != lastLabel) { + crumbs[section.minOffset / maxOffset] = label; + lastLabel = label; + } + } + }); + } + } + case EntrySectionFactor.none: + break; + } + case EntrySortFactor.name: + case EntrySortFactor.path: + addAlbums(collection, sectionLayouts, crumbs); + case EntrySortFactor.rating: + case EntrySortFactor.size: + case EntrySortFactor.duration: + break; + } + return crumbs; + } + + Future<bool> get _isStoragePermissionGranted => + Future.wait(Permissions.storage.map((v) => v.status)) + .then((v) => v.any((status) => status.isGranted)); +} + +// ✅ REMOTE: Tile remota con supporto selezione (check + highlight) come Aves +class RemoteInteractiveTile extends StatelessWidget { + final AvesEntry entry; + final double thumbnailExtent; + + const RemoteInteractiveTile({ + super.key, + required this.entry, + required this.thumbnailExtent, + }); + + @override + Widget build(BuildContext context) { + final selection = context.watch<Selection<AvesEntry>>(); + final isSelecting = selection.isSelecting; + final isSelected = selection.selectedItems.contains(entry); + + final cs = Theme.of(context).colorScheme; + final highlight = cs.secondary.withOpacity(.28); + final border = cs.secondary.withOpacity(.95); + + final VoidCallback? onTap = + isSelecting ? null : () => OpenViewerNotification(entry).dispatch(context); + + return GestureDetector( + onTap: onTap, + child: ClipRRect( + borderRadius: BorderRadius.zero, + child: Stack( + fit: StackFit.expand, + children: [ + SizedBox( + width: thumbnailExtent, + height: thumbnailExtent, + child: RemoteImageTile(entry: entry), + ), + + // ✅ FIX: overlay viola + bordo SOLO durante selection mode + if (isSelecting && isSelected) ...[ + Positioned.fill( + child: ColoredBox(color: highlight), + ), + Positioned.fill( + child: DecoratedBox( + decoration: BoxDecoration( + border: Border.all(color: border, width: 2), + ), + ), + ), + ], + + // badge selezione (cerchio/check) in alto a destra durante selection mode + if (isSelecting) ...[ + Positioned( + top: 6, + right: 6, + child: _SelectionBadge( + selected: isSelected, + color: cs.secondary, + ), + ), + ], + ], + ), + ), + ); + } +} + +class _SelectionBadge extends StatelessWidget { + final bool selected; + final Color color; + + const _SelectionBadge({ + required this.selected, + required this.color, + }); + + @override + Widget build(BuildContext context) { + final borderColor = Colors.white.withOpacity(.95); + return Container( + width: 20, + height: 20, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: selected ? color : Colors.black.withOpacity(.25), + border: Border.all( + color: selected ? Colors.transparent : borderColor, + width: 1.5, + ), + ), + child: selected ? const Icon(Icons.check, size: 14, color: Colors.white) : null, + ); + } +} diff --git a/lib/widgets/collection/collection_page.dart b/lib/widgets/collection/collection_page.dart new file mode 100644 index 0000000..5fa6c6b --- /dev/null +++ b/lib/widgets/collection/collection_page.dart @@ -0,0 +1,244 @@ +import 'dart:async'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/query.dart'; +import 'package:aves/model/filters/trash.dart'; +import 'package:aves/model/highlight.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/app_service.dart'; +import 'package:aves/services/intent_service.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/collection/collection_grid.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/notifications.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/behaviour/pop/double_back.dart'; +import 'package:aves/widgets/common/behaviour/pop/scope.dart'; +import 'package:aves/widgets/common/behaviour/pop/tv_navigation.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_fab.dart'; +import 'package:aves/widgets/common/providers/query_provider.dart'; +import 'package:aves/widgets/common/providers/selection_provider.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/navigation/drawer/app_drawer.dart'; +import 'package:aves/widgets/navigation/nav_bar/nav_bar.dart'; +import 'package:aves/widgets/navigation/tv_rail.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +// ✅ STEP 2: banner progresso remoti (overlay sopra la griglia) +import 'package:aves/widgets/collection/remote_progress_banner.dart'; + +class CollectionPage extends StatefulWidget { + static const routeName = '/collection'; + + final CollectionSource source; + final Set<CollectionFilter?>? filters; + final bool Function(AvesEntry element)? highlightTest; + + const CollectionPage({ + super.key, + required this.source, + required this.filters, + this.highlightTest, + }); + + @override + State<CollectionPage> createState() => _CollectionPageState(); +} + +class _CollectionPageState extends State<CollectionPage> { + final Set<StreamSubscription> _subscriptions = {}; + late CollectionLens _collection; + final StreamController<DraggableScrollbarEvent> _draggableScrollBarEventStreamController = + StreamController.broadcast(); + + @override + void initState() { + // do not seed this widget with the collection, but control its lifecycle here instead, + // as the collection properties may change and they should not be reset by a widget update (e.g. with theme change) + _collection = CollectionLens( + source: widget.source, + filters: widget.filters, + ); + super.initState(); + _subscriptions.add( + settings.updateStream + .where((event) => event.key == SettingKeys.enableBinKey) + .listen((_) { + if (!settings.enableBin) { + _collection.removeFilter(TrashFilter.instance); + } + }), + ); + WidgetsBinding.instance.addPostFrameCallback((_) => _checkInitHighlight()); + } + + @override + void dispose() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + _collection.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final useTvLayout = settings.useTvLayout; + final liveFilter = + _collection.filters.firstWhereOrNull((v) => v is QueryFilter && v.live) as QueryFilter?; + return SelectionProvider<AvesEntry>( + child: Selector<Selection<AvesEntry>, bool>( + selector: (context, selection) => selection.selectedItems.isNotEmpty, + builder: (context, hasSelection, child) { + final body = QueryProvider( + startEnabled: settings.getShowTitleQuery(context.currentRouteName!), + initialQuery: liveFilter?.query, + child: Builder( + builder: (context) { + return AvesPopScope( + handlers: [ + APopHandler( + canPop: (context) => context.select<Selection<AvesEntry>, bool>((v) => !v.isSelecting), + onPopBlocked: (context) => context.read<Selection<AvesEntry>>().browse(), + ), + tvNavigationPopHandler, + doubleBackPopHandler, + ], + child: GestureAreaProtectorStack( + // ✅ STEP 2: overlay in Stack (griglia + banner progresso remoti) + child: Stack( + children: [ + DirectionalSafeArea( + start: !useTvLayout, + top: false, + bottom: false, + child: const CollectionGrid( + // key is expected by test driver + key: Key('collection-grid'), + settingsRouteKey: CollectionPage.routeName, + ), + ), + const RemoteProgressBanner(), + ], + ), + ), + ); + }, + ), + ); + + Widget page; + if (useTvLayout) { + page = AvesScaffold( + body: Row( + children: [ + TvRail( + controller: context.read<TvRailController>(), + currentCollection: _collection, + ), + Expanded(child: body), + ], + ), + resizeToAvoidBottomInset: false, + extendBody: true, + ); + } else { + page = Selector<Settings, bool>( + selector: (context, s) => s.enableBottomNavigationBar, + builder: (context, enableBottomNavigationBar, child) { + final canNavigate = + context.select<ValueNotifier<AppMode>, bool>((v) => v.value.canNavigate); + final showBottomNavigationBar = canNavigate && enableBottomNavigationBar; + + return NotificationListener<DraggableScrollbarNotification>( + onNotification: (notification) { + _draggableScrollBarEventStreamController.add(notification.event); + return false; + }, + child: AvesScaffold( + body: body, + floatingActionButton: _buildFab(context, hasSelection), + drawer: canNavigate ? AppDrawer(currentCollection: _collection) : null, + bottomNavigationBar: showBottomNavigationBar + ? AppBottomNavBar( + events: _draggableScrollBarEventStreamController.stream, + currentCollection: _collection, + ) + : null, + resizeToAvoidBottomInset: false, + extendBody: true, + ), + ); + }, + ); + } + + // this provider should be above `TvRail` + return ChangeNotifierProvider<CollectionLens>.value( + value: _collection, + child: page, + ); + }, + ), + ); + } + + Widget? _buildFab(BuildContext context, bool hasSelection) { + final appMode = context.watch<ValueNotifier<AppMode>>().value; + final l10n = context.l10n; + switch (appMode) { + case AppMode.pickMultipleMediaExternal: + return hasSelection + ? AvesFab( + tooltip: l10n.pickTooltip, + onPressed: () async { + final items = context.read<Selection<AvesEntry>>().selectedItems; + final uris = items.map((entry) => entry.uri).toList(); + try { + await IntentService.submitPickedItems(uris); + } on TooManyItemsException catch (_) { + await showWarningDialog( + context: context, + message: l10n.tooManyItemsErrorDialogMessage, + ); + } + }, + ) + : null; + case AppMode.pickCollectionFiltersExternal: + return AvesFab( + tooltip: l10n.pickTooltip, + onPressed: () { + final filters = _collection.filters; + IntentService.submitPickedCollectionFilters(filters); + }, + ); + default: + return null; + } + } + + Future<void> _checkInitHighlight() async { + final highlightTest = widget.highlightTest; + if (highlightTest == null) return; + + final item = _collection.sortedEntries.firstWhereOrNull(highlightTest); + if (item == null) return; + + final delayDuration = context.read<DurationsData>().staggeredAnimationPageTarget; + await Future.delayed(delayDuration + ADurations.highlightScrollInitDelay); + + if (!mounted) return; + final animate = context.read<Settings>().animate; + context.read<HighlightInfo>().trackItem(item, animate: animate, highlightItem: item); + } +} diff --git a/lib/widgets/collection/draggable_thumb_label.dart b/lib/widgets/collection/draggable_thumb_label.dart new file mode 100644 index 0000000..bf7fa3b --- /dev/null +++ b/lib/widgets/collection/draggable_thumb_label.dart @@ -0,0 +1,82 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/rating.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/grid/draggable_thumb_label.dart'; +import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class CollectionDraggableThumbLabel extends StatelessWidget { + final CollectionLens collection; + final double offsetY; + + const CollectionDraggableThumbLabel({ + super.key, + required this.collection, + required this.offsetY, + }); + + @override + Widget build(BuildContext context) { + return DraggableThumbLabel<AvesEntry>( + offsetY: offsetY, + lineBuilder: (context, entry) { + switch (collection.sortFactor) { + case EntrySortFactor.date: + final date = entry.bestDate; + switch (collection.sectionFactor) { + case EntrySectionFactor.album: + return [ + DraggableThumbLabel.formatMonthThumbLabel(context, date), + if (_showAlbumName(context, entry)) _getAlbumName(context, entry), + ]; + case EntrySectionFactor.month: + case EntrySectionFactor.none: + return [ + DraggableThumbLabel.formatMonthThumbLabel(context, date), + ]; + case EntrySectionFactor.day: + return [ + DraggableThumbLabel.formatDayThumbLabel(context, date), + ]; + } + case EntrySortFactor.name: + return [ + if (_showAlbumName(context, entry)) _getAlbumName(context, entry), + ?entry.bestTitle, + ]; + case EntrySortFactor.rating: + return [ + RatingFilter.formatRating(context, entry.rating), + DraggableThumbLabel.formatMonthThumbLabel(context, entry.bestDate), + ]; + case EntrySortFactor.size: + final sizeBytes = entry.sizeBytes; + return [ + if (sizeBytes != null) formatFileSize(context.locale, sizeBytes, round: 0), + ]; + case EntrySortFactor.duration: + return [ + if (entry.durationMillis != null) entry.durationText, + ]; + case EntrySortFactor.path: + final entryFilename = entry.filenameWithoutExtension; + return [ + if (_showAlbumName(context, entry)) _getAlbumName(context, entry), + ?entryFilename, + ]; + } + }, + ); + } + + bool _hasMultipleSections(BuildContext context) => context.read<SectionedListLayout<AvesEntry>>().sections.length > 1; + + bool _showAlbumName(BuildContext context, AvesEntry entry) => _hasMultipleSections(context) && entry.directory != null; + + String _getAlbumName(BuildContext context, AvesEntry entry) => context.read<CollectionSource>().getStoredAlbumDisplayName(context, entry.directory!); +} diff --git a/lib/widgets/collection/entry_set_action_delegate.dart b/lib/widgets/collection/entry_set_action_delegate.dart new file mode 100644 index 0000000..83d1091 --- /dev/null +++ b/lib/widgets/collection/entry_set_action_delegate.dart @@ -0,0 +1,986 @@ +import 'dart:async'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/device.dart'; +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/favourites.dart'; +import 'package:aves/model/entry/extensions/metadata_edition.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/container/set_and.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/highlight.dart'; +import 'package:aves/model/metadata/date_modifier.dart'; +import 'package:aves/model/naming_pattern.dart'; +import 'package:aves/model/query.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/analysis_controller.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/services/app_service.dart'; +import 'package:aves/services/common/image_op_events.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/media/media_edit_service.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:aves/utils/mime_utils.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/action_mixins/entry_editor.dart'; +import 'package:aves/widgets/common/action_mixins/entry_storage.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; +import 'package:aves/widgets/common/action_mixins/size_aware.dart'; +import 'package:aves/widgets/common/action_mixins/vault_aware.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/search/route.dart'; +import 'package:aves/widgets/dialogs/add_shortcut_dialog.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/convert_entry_dialog.dart'; +import 'package:aves/widgets/dialogs/entry_editors/rename_entry_set_page.dart'; +import 'package:aves/widgets/dialogs/filter_editors/create_dynamic_album_dialog.dart'; +import 'package:aves/widgets/dialogs/pick_dialogs/location_pick_page.dart'; +import 'package:aves/widgets/filter_grids/albums_page.dart'; +import 'package:aves/widgets/map/map_page.dart'; +import 'package:aves/widgets/search/collection_search_delegate.dart'; +import 'package:aves/widgets/stats/stats_page.dart'; +import 'package:aves/widgets/viewer/slideshow_page.dart'; +import 'package:aves/widgets/dialogs/cast_dialog.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:provider/provider.dart'; +import 'package:aves/widgets/cast/cast_state.dart'; + + +class EntrySetActionDelegate + with + FeedbackMixin, + PermissionAwareMixin, + SizeAwareMixin, + EntryEditorMixin, + EntryStorageMixin, + VaultAwareMixin { + // ---------------------------------------------------------------------------------------------------------------------------------- + // VISIBILITY / ENABLE + // ---------------------------------------------------------------------------------------------------------------------------------- + + bool isVisible( + EntrySetAction action, { + required AppMode appMode, + required bool isSelecting, + required int itemCount, + required int selectedItemCount, + required bool isTrash, + }) { + final canWrite = !settings.isReadOnly; + final isMain = appMode == AppMode.main; + final useTvLayout = settings.useTvLayout; + + switch (action) { + // general + case EntrySetAction.configureView: + return true; + case EntrySetAction.select: + return appMode.canSelectMedia && !isSelecting; + case EntrySetAction.selectAll: + return (isSelecting && selectedItemCount < itemCount) || + (!isSelecting && settings.collectionBrowsingQuickActions.contains(action)); + case EntrySetAction.selectNone: + return isSelecting && selectedItemCount == itemCount; + + // browsing + case EntrySetAction.searchCollection: + return appMode.canNavigate && !isSelecting && !useTvLayout; + case EntrySetAction.toggleTitleSearch: + return !isSelecting && !useTvLayout; + case EntrySetAction.addShortcut: + return isMain && !isSelecting && !isTrash && device.canPinShortcut; + case EntrySetAction.addDynamicAlbum: + case EntrySetAction.setHome: + return isMain && !isSelecting && !isTrash && !useTvLayout; + case EntrySetAction.emptyBin: + return isMain && isTrash && canWrite; + + // browsing or selecting + case EntrySetAction.map: + case EntrySetAction.slideshow: + case EntrySetAction.stats: + return isMain; + case EntrySetAction.rescan: + return isMain && isSelecting && !useTvLayout; + + // selecting + case EntrySetAction.cast: + return isMain && isSelecting && !isTrash && !useTvLayout; + case EntrySetAction.share: + case EntrySetAction.toggleFavourite: + return isMain && isSelecting && !isTrash; + case EntrySetAction.delete: + return isMain && isSelecting && canWrite; + case EntrySetAction.copy: + case EntrySetAction.move: + case EntrySetAction.rename: + case EntrySetAction.convert: + case EntrySetAction.rotateCCW: + case EntrySetAction.rotateCW: + case EntrySetAction.flip: + case EntrySetAction.editDate: + case EntrySetAction.editLocation: + case EntrySetAction.editTitleDescription: + case EntrySetAction.editRating: + case EntrySetAction.editTags: + case EntrySetAction.removeMetadata: + return isMain && isSelecting && !isTrash && canWrite; + case EntrySetAction.restore: + return isMain && isSelecting && isTrash && canWrite; + } + } + + bool canApply( + EntrySetAction action, { + required bool isSelecting, + required CollectionLens collection, + required int selectedItemCount, + }) { + final itemCount = collection.entryCount; + final hasItems = itemCount > 0; + final hasSelection = selectedItemCount > 0; + + switch (action) { + case EntrySetAction.configureView: + return true; + case EntrySetAction.select: + return hasItems; + case EntrySetAction.selectAll: + return selectedItemCount < itemCount || + (!isSelecting && settings.collectionBrowsingQuickActions.contains(action)); + case EntrySetAction.selectNone: + return hasSelection; + + case EntrySetAction.searchCollection: + case EntrySetAction.toggleTitleSearch: + case EntrySetAction.addShortcut: + case EntrySetAction.setHome: + return true; + case EntrySetAction.addDynamicAlbum: + return collection.filters.isNotEmpty; + case EntrySetAction.emptyBin: + return !isSelecting && hasItems; + + case EntrySetAction.map: + case EntrySetAction.slideshow: + case EntrySetAction.stats: + case EntrySetAction.rescan: + return (!isSelecting && hasItems) || (isSelecting && hasSelection); + + case EntrySetAction.cast: + return hasSelection; // NEW + + case EntrySetAction.share: + case EntrySetAction.delete: + case EntrySetAction.restore: + case EntrySetAction.copy: + case EntrySetAction.move: + case EntrySetAction.rename: + case EntrySetAction.convert: + case EntrySetAction.toggleFavourite: + case EntrySetAction.rotateCCW: + case EntrySetAction.rotateCW: + case EntrySetAction.flip: + case EntrySetAction.editDate: + case EntrySetAction.editLocation: + case EntrySetAction.editTitleDescription: + case EntrySetAction.editRating: + case EntrySetAction.editTags: + case EntrySetAction.removeMetadata: + return hasSelection; + } + } + + // ---------------------------------------------------------------------------------------------------------------------------------- + // ACTION DISPATCH + // ---------------------------------------------------------------------------------------------------------------------------------- + + void onActionSelected(BuildContext context, EntrySetAction action) { + reportService.log('$runtimeType handles $action'); + + switch (action) { + // ------------------NEW: CAST (ARM ONLY)--------------------- + case EntrySetAction.cast: + unawaited(_enterCastMode(context)); + return; + + // general + case EntrySetAction.configureView: + case EntrySetAction.select: + case EntrySetAction.selectAll: + case EntrySetAction.selectNone: + break; + + // browsing + case EntrySetAction.searchCollection: + _goToSearch(context); + break; + case EntrySetAction.toggleTitleSearch: + final routeName = context.currentRouteName!; + settings.setShowTitleQuery(routeName, !settings.getShowTitleQuery(routeName)); + context.read<Query>().toggle(); + break; + case EntrySetAction.addDynamicAlbum: + _addDynamicAlbum(context); + break; + case EntrySetAction.addShortcut: + _addShortcut(context); + break; + case EntrySetAction.setHome: + _setHome(context); + break; + + // browsing or selecting + case EntrySetAction.map: + _goToMap(context); + break; + case EntrySetAction.slideshow: + _goToSlideshow(context); + break; + case EntrySetAction.stats: + _goToStats(context); + break; + case EntrySetAction.rescan: + _rescan(context); + break; + + // selecting + case EntrySetAction.share: + _share(context); + break; + case EntrySetAction.delete: + case EntrySetAction.emptyBin: + _delete(context); + break; + case EntrySetAction.restore: + _move(context, moveType: MoveType.fromBin); + break; + case EntrySetAction.copy: + _move(context, moveType: MoveType.copy); + break; + case EntrySetAction.move: + _move(context, moveType: MoveType.move); + break; + case EntrySetAction.rename: + _rename(context); + break; + case EntrySetAction.convert: + _convert(context); + break; + case EntrySetAction.toggleFavourite: + _toggleFavourite(context); + break; + case EntrySetAction.rotateCCW: + _rotate(context, clockwise: false); + break; + case EntrySetAction.rotateCW: + _rotate(context, clockwise: true); + break; + case EntrySetAction.flip: + _flip(context); + break; + case EntrySetAction.editDate: + editDate(context); + break; + case EntrySetAction.editLocation: + _editLocation(context); + break; + case EntrySetAction.editTitleDescription: + _editTitleDescription(context); + break; + case EntrySetAction.editRating: + _editRating(context); + break; + case EntrySetAction.editTags: + _editTags(context); + break; + case EntrySetAction.removeMetadata: + _removeMetadata(context); + break; + } + } + + // ---------------------------------------------------------------------------------------------------------------------------------- + // CAST MODE (ARM ONLY) + // ---------------------------------------------------------------------------------------------------------------------------------- + +Future<void> _enterCastMode(BuildContext context) async { + final selection = context.read<Selection<AvesEntry>>(); + final selected = selection.selectedItems; + if (selected.isEmpty) return; + + // Espandi eventuali stack (coerente con Aves) + final expanded = selected.expand((entry) => entry.stackedEntries ?? {entry}).toList(); + + // 1) Scegli dispositivo (Google Cast / DLNA) + final target = await showDialog<CastTarget?>( + context: context, + builder: (context) => const CastDialog(), + routeSettings: const RouteSettings(name: CastDialog.routeName), + ); + if (target == null) return; + + // 2) Arma il cast (NON avvia playback) + CastState.instance.arm( + target, + queue: expanded, // queue = selezione → stile Google Photos + sourceRoute: context.currentRouteName, + ); + + // 3) Feedback + final deviceName = CastState.instance.deviceName; + showFeedback( + context, + FeedbackType.info, + deviceName == null + ? context.l10n.castDialogTitle + : '${context.l10n.castDialogTitle}: $deviceName', + ); + + // 4) Esci dalla modalità selezione → mostra Cast Bar + selection.browse(); +} + // ---------------------------------------------------------------------------------------------------------------------------------- + // (RESTO DEL FILE: invariato rispetto ad Aves originale) + // ---------------------------------------------------------------------------------------------------------------------------------- + + void _browse(BuildContext context) { + context.read<Selection<AvesEntry>?>()?.browse(); + } + + Set<AvesEntry> _getTargetItems(BuildContext context) { + final selection = context.read<Selection<AvesEntry>>(); + final groupedEntries = (selection.isSelecting ? selection.selectedItems : context.read<CollectionLens>().sortedEntries); + return groupedEntries.expand((entry) => entry.stackedEntries ?? {entry}).toSet(); + } + + Future<void> _share(BuildContext context) async { + final entries = _getTargetItems(context); + try { + if (!await appService.shareEntries(entries)) { + await showNoMatchingAppDialog(context); + } + } on TooManyItemsException catch (_) { + await showWarningDialog( + context: context, + message: context.l10n.tooManyItemsErrorDialogMessage, + ); + } + } + + void _rescan(BuildContext context) { + final entries = _getTargetItems(context); + + final controller = AnalysisController(canStartService: true, force: true); + final collection = context.read<CollectionLens>(); + collection.source.analyze(controller, entries: entries).then((_) => controller.dispose()); + + _browse(context); + } + + Future<void> _delete(BuildContext context) async { + final entries = _getTargetItems(context); + final byBinUsage = groupBy<AvesEntry, bool>(entries, (entry) { + final details = vaults.getVault(entry.directory); + return details?.useBin ?? settings.enableBin; + }); + var completed = true; + await Future.forEach(byBinUsage.entries, (kv) async { + completed &= await doDelete( + context: context, + entries: kv.value.toSet(), + enableBin: kv.key, + ); + }); + + if (completed) { + _browse(context); + } + } + + // returns whether it completed the action (with or without failures) + Future<bool> doDelete({ + required BuildContext context, + required Set<AvesEntry> entries, + required bool enableBin, + }) async { + final pureTrash = entries.every((entry) => entry.trashed); + if (enableBin && !pureTrash) { + return await doMove(context, moveType: MoveType.toBin, entries: entries); + } + + final l10n = context.l10n; + final source = context.read<CollectionSource>(); + final storageDirs = entries.map((e) => e.storageDirectory).nonNulls.toSet(); + final todoCount = entries.length; + + if (!await showSkippableConfirmationDialog( + context: context, + type: ConfirmationDialog.deleteForever, + message: l10n.deleteEntriesConfirmationDialogMessage(todoCount), + confirmationButtonLabel: l10n.deleteButtonLabel, + )) { + return false; + } + + if (!await checkStoragePermissionForAlbums(context, storageDirs, entries: entries)) return false; + + source.pauseMonitoring(); + final opId = mediaEditService.newOpId; + await showOpReport<ImageOpEvent>( + context: context, + opStream: mediaEditService.delete(opId: opId, entries: entries), + itemCount: todoCount, + onCancel: () => mediaEditService.cancelFileOp(opId), + onDone: (processed) async { + final successOps = processed.where((op) => op.success).toSet(); + final deletedOps = successOps.where((op) => !op.skipped).toSet(); + final deletedUris = deletedOps.map((op) => op.uri).toSet(); + await source.removeEntries(deletedUris, includeTrash: true); + source.resumeMonitoring(); + + final successCount = successOps.length; + if (successCount < todoCount) { + final count = todoCount - successCount; + showFeedback(context, FeedbackType.warn, context.l10n.collectionDeleteFailureFeedback(count)); + } + + // cleanup + await storageService.deleteEmptyRegularDirectories(storageDirs); + }, + ); + return true; + } + + Future<void> quickMove(BuildContext context, String destinationAlbum, {required bool copy}) async { + if (!await unlockAlbum(context, destinationAlbum)) return; + + final entries = _getTargetItems(context); + final completed = await doQuickMove( + context, + moveType: copy ? MoveType.copy : MoveType.move, + entriesByDestination: { + destinationAlbum: entries, + }, + ); + + if (completed) { + _browse(context); + } + } + + Future<void> _move(BuildContext context, {required MoveType moveType}) async { + final entries = _getTargetItems(context); + final completed = await doMove(context, moveType: moveType, entries: entries); + + if (completed) { + _browse(context); + } + } + + Future<void> _rename(BuildContext context) async { + final entries = _getTargetItems(context).toList(); + + final pattern = await Navigator.maybeOf(context)?.push<NamingPattern>( + MaterialPageRoute( + settings: const RouteSettings(name: RenameEntrySetPage.routeName), + builder: (context) => RenameEntrySetPage( + entries: entries, + ), + ), + ); + if (pattern == null) return; + + final namingFutures = entries.mapIndexed((index, entry) async { + final newName = await pattern.apply(entry, index); + return MapEntry(entry, '$newName${entry.extension}'); + }); + final entriesToNewName = Map.fromEntries(await Future.wait(namingFutures)).whereNotNullValue(); + final completed = await rename(context, entriesToNewName: entriesToNewName, persist: true); + + if (completed) { + _browse(context); + } + } + + Future<void> _convert(BuildContext context) async { + final entries = _getTargetItems(context); + + final options = await showDialog<EntryConvertOptions>( + context: context, + builder: (context) => ConvertEntryDialog(entries: entries), + routeSettings: const RouteSettings(name: ConvertEntryDialog.routeName), + ); + if (options == null) return; + + switch (options.action) { + case EntryConvertAction.convert: + final completed = await doExport(context, entries, options); + if (completed) { + _browse(context); + } + case EntryConvertAction.convertMotionPhotoToStillImage: + final todoItems = entries.where((entry) => entry.isMotionPhoto).toSet(); + await _edit(context, todoItems, (entry) => entry.removeTrailerVideo()); + } + } + + Future<void> _toggleFavourite(BuildContext context) async { + final entries = _getTargetItems(context); + if (entries.every((entry) => entry.isFavourite)) { + await favourites.removeEntries(entries); + } else { + await favourites.add(entries); + } + + _browse(context); + } + + Future<void> _edit( + BuildContext context, + Set<AvesEntry> todoItems, + Future<Set<EntryDataType>> Function(AvesEntry entry) op, { + bool showResult = true, + }) async { + final selectionDirs = todoItems.map((e) => e.directory).nonNulls.toSet(); + final todoCount = todoItems.length; + + if (!await checkStoragePermissionForAlbums(context, selectionDirs, entries: todoItems)) return; + + Set<String> obsoleteTags = todoItems.expand((entry) => entry.tags).toSet(); + Set<String> obsoleteCountryCodes = todoItems.where((entry) => entry.hasAddress).map((entry) => entry.addressDetails?.countryCode).nonNulls.toSet(); + Set<String> obsoleteStateCodes = todoItems.where((entry) => entry.hasAddress).map((entry) => entry.addressDetails?.stateCode).nonNulls.toSet(); + + final dataTypes = <EntryDataType>{}; + final source = context.read<CollectionSource>(); + source.pauseMonitoring(); + var cancelled = false; + await showOpReport<ImageOpEvent>( + context: context, + opStream: Stream.fromIterable(todoItems).asyncMap((entry) async { + if (cancelled) { + return ImageOpEvent(success: true, skipped: true, uri: entry.uri); + } else { + final opDataTypes = await op(entry); + dataTypes.addAll(opDataTypes); + return ImageOpEvent(success: opDataTypes.isNotEmpty, skipped: false, uri: entry.uri); + } + }).asBroadcastStream(), + itemCount: todoCount, + onCancel: () => cancelled = true, + onDone: (processed) async { + final successOps = processed.where((op) => op.success).toSet(); + final editedOps = successOps.where((op) => !op.skipped).toSet(); + source.resumeMonitoring(); + + unawaited( + source.refreshUris(editedOps.map((op) => op.uri).toSet()).then((_) { + // invalidate filters derived from values before edition + // this invalidation must happen after the source is refreshed, + // otherwise filter chips may eagerly rebuild in between with the old state + if (obsoleteCountryCodes.isNotEmpty) { + source.invalidateCountryFilterSummary(countryCodes: obsoleteCountryCodes); + } + if (obsoleteStateCodes.isNotEmpty) { + source.invalidateStateFilterSummary(stateCodes: obsoleteStateCodes); + } + if (obsoleteTags.isNotEmpty) { + source.invalidateTagFilterSummary(tags: obsoleteTags); + } + }), + ); + + if (dataTypes.contains(EntryDataType.aspectRatio)) { + source.onAspectRatioChanged(); + } + + if (showResult) { + final l10n = context.l10n; + final successCount = successOps.length; + if (successCount < todoCount) { + final count = todoCount - successCount; + showFeedback(context, FeedbackType.warn, l10n.collectionEditFailureFeedback(count)); + } else { + final count = editedOps.length; + showFeedback(context, FeedbackType.info, l10n.collectionEditSuccessFeedback(count)); + } + } + }, + ); + _browse(context); + } + + Future<Set<AvesEntry>?> _getEditableTargetItems( + BuildContext context, { + required bool Function(AvesEntry entry) canEdit, + }) => _getEditableItems(context, _getTargetItems(context), canEdit: canEdit); + + Future<Set<AvesEntry>?> _getEditableItems( + BuildContext context, + Set<AvesEntry> entries, { + required bool Function(AvesEntry entry) canEdit, + }) async { + final bySupported = groupBy<AvesEntry, bool>(entries, canEdit); + final supported = (bySupported[true] ?? []).toSet(); + final unsupported = (bySupported[false] ?? []).toSet(); + + if (unsupported.isEmpty) return supported; + + final unsupportedTypes = unsupported.map((entry) => entry.mimeType).toSet().map(MimeUtils.displayType).toList()..sort(); + final l10n = context.l10n; + final message = l10n.unsupportedTypeDialogMessage(unsupportedTypes.length, unsupportedTypes.join(', ')); + if (supported.isEmpty) { + await showWarningDialog( + context: context, + message: message, + ); + return null; + } + + if (!await showConfirmationDialog( + context: context, + message: message, + ok: l10n.continueButtonLabel, + )) { + return null; + } + + // wait for the dialog to hide + await Future.delayed(ADurations.dialogTransitionLoose * timeDilation); + return supported; + } + + Future<void> _rotate(BuildContext context, {required bool clockwise}) async { + final entries = await _getEditableTargetItems(context, canEdit: (entry) => entry.canRotate); + if (entries == null || entries.isEmpty) return; + + await _edit(context, entries, (entry) => entry.rotate(clockwise: clockwise)); + } + + Future<void> _flip(BuildContext context) async { + final entries = await _getEditableTargetItems(context, canEdit: (entry) => entry.canFlip); + if (entries == null || entries.isEmpty) return; + + await _edit(context, entries, (entry) => entry.flip()); + } + + Future<void> editDate(BuildContext context, {Set<AvesEntry>? entries, DateModifier? modifier, bool showResult = true}) async { + entries ??= await _getEditableTargetItems(context, canEdit: (entry) => entry.canEditDate); + if (entries == null || entries.isEmpty) return; + + if (modifier == null) { + final collection = context.read<CollectionLens>(); + modifier = await selectDateModifier(context, entries, collection); + } + if (modifier == null) return; + + await _edit(context, entries, (entry) => entry.editDate(modifier!), showResult: showResult); + } + + Future<void> _editLocation(BuildContext context) async { + final entries = await _getEditableTargetItems(context, canEdit: (entry) => entry.canEditLocation); + if (entries == null || entries.isEmpty) return; + + final collection = context.read<CollectionLens>(); + final locationByEntry = await selectLocation(context, entries, collection); + if (locationByEntry == null) return; + + await _edit(context, locationByEntry.keys.toSet(), (entry) => entry.editLocation(locationByEntry[entry])); + } + + Future<LatLng?> editLocationByMap(BuildContext context, Set<AvesEntry> entries, LatLng clusterLocation, CollectionLens mapCollection) async { + final editableEntries = await _getEditableItems(context, entries, canEdit: (entry) => entry.canEditLocation); + if (editableEntries == null || editableEntries.isEmpty) return null; + + final location = await Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: LocationPickPage.routeName), + builder: (context) => LocationPickPage( + collection: mapCollection, + initialLocation: clusterLocation, + ), + fullscreenDialog: true, + ), + ); + if (location == null) return null; + + await _edit(context, editableEntries, (entry) => entry.editLocation(location)); + return location; + } + + Future<void> removeLocation(BuildContext context, Set<AvesEntry> entries) async { + final l10n = context.l10n; + if (!await showConfirmationDialog( + context: context, + message: l10n.genericDangerWarningDialogMessage, + ok: l10n.applyButtonLabel, + )) { + return; + } + + final editableEntries = await _getEditableItems(context, entries, canEdit: (entry) => entry.canEditLocation); + if (editableEntries == null || editableEntries.isEmpty) return; + + await _edit(context, editableEntries, (entry) => entry.editLocation(ExtraAvesEntryMetadataEdition.removalLocation)); + } + + Future<void> _editTitleDescription(BuildContext context) async { + final entries = await _getEditableTargetItems(context, canEdit: (entry) => entry.canEditTitleDescription); + if (entries == null || entries.isEmpty) return; + + final modifier = await selectTitleDescriptionModifier(context, entries); + if (modifier == null) return; + + await _edit(context, entries, (entry) => entry.editTitleDescription(modifier)); + } + + Future<void> quickRate(BuildContext context, int rating) => _editRating(context, rating: rating); + + Future<void> _editRating(BuildContext context, {int? rating}) async { + final entries = await _getEditableTargetItems(context, canEdit: (entry) => entry.canEditRating); + if (entries == null || entries.isEmpty) return; + + rating ??= await selectRating(context, entries); + if (rating == null) return; + + await _edit(context, entries, (entry) => entry.editRating(rating)); + } + + Future<void> quickTag(BuildContext context, CollectionFilter filter) async { + final entries = await _getEditableTargetItems(context, canEdit: (entry) => entry.canEditTags); + if (entries == null || entries.isEmpty) return; + + final newTagsByEntry = <AvesEntry, Set<String>>{}; + await Future.forEach(entries, (entry) async { + newTagsByEntry[entry] = { + ...entry.tags, + ...await getTagsFromFilters({filter}, entry), + }; + }); + + await _doEditTags(context, newTagsByEntry); + } + + Future<void> _editTags(BuildContext context) async { + final entries = await _getEditableTargetItems(context, canEdit: (entry) => entry.canEditTags); + if (entries == null || entries.isEmpty) return; + + final newTagsByEntry = await selectTags(context, entries); + if (newTagsByEntry == null) return; + + await _doEditTags(context, newTagsByEntry); + } + + Future<void> _doEditTags(BuildContext context, Map<AvesEntry, Set<String>> newTagsByEntry) async { + final entries = newTagsByEntry.keys.toSet(); + + // only process modified items + entries.removeWhere((entry) { + final newTags = newTagsByEntry[entry] ?? entry.tags; + final currentTags = entry.tags; + return newTags.length == currentTags.length && newTags.every(currentTags.contains); + }); + if (entries.isEmpty) return; + + await _edit(context, entries, (entry) => entry.editTags(newTagsByEntry[entry]!)); + } + + Future<void> removeTags(BuildContext context, {required Set<AvesEntry> entries, required Set<String> tags}) async { + final newTagsByEntry = Map.fromEntries( + entries.map((v) { + return MapEntry(v, v.tags.whereNot(tags.contains).toSet()); + }), + ); + + await _edit(context, entries, (entry) => entry.editTags(newTagsByEntry[entry]!)); + } + + Future<void> _removeMetadata(BuildContext context) async { + final entries = await _getEditableTargetItems(context, canEdit: (entry) => entry.isMetadataRemovalSupported); + if (entries == null || entries.isEmpty) return; + + final types = await selectMetadataToRemove(context, entries); + if (types == null || types.isEmpty) return; + + await _edit(context, entries, (entry) => entry.removeMetadata(types)); + } + + Future<void> _goToMap(BuildContext context) async { + final collection = context.read<CollectionLens>(); + final entries = _getTargetItems(context); + + // need collection with fresh ID to prevent hero from scroller on Map page to Collection page + final mapCollection = CollectionLens( + source: collection.source, + filters: collection.filters, + fixedSelection: entries.where((entry) => entry.hasGps).toList(), + ); + await Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: MapPage.routeName), + builder: (context) => MapPage(collection: mapCollection), + ), + ); + } + + void _goToSlideshow(BuildContext context) { + final collection = context.read<CollectionLens>(); + final entries = _getTargetItems(context); + + Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: SlideshowPage.routeName), + builder: (context) { + return SlideshowPage( + collection: CollectionLens( + source: collection.source, + filters: collection.filters, + fixedSelection: entries.toList(), + ), + ); + }, + ), + ); + } + + void _goToStats(BuildContext context) { + final collection = context.read<CollectionLens>(); + final entries = _getTargetItems(context); + + Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: StatsPage.routeName), + builder: (context) => StatsPage( + entries: entries, + source: collection.source, + parentCollection: collection, + ), + ), + ); + } + + void _goToSearch(BuildContext context) { + final collection = context.read<CollectionLens>(); + + Navigator.maybeOf(context)?.push( + SearchPageRoute( + delegate: CollectionSearchDelegate( + searchFieldLabel: context.l10n.searchCollectionFieldHint, + searchFieldStyle: Themes.searchFieldStyle(context), + source: collection.source, + parentCollection: collection, + ), + ), + ); + } + + static String? _getDefaultNameForFilters(BuildContext context, Set<CollectionFilter> filters) { + String? defaultName; + if (filters.isNotEmpty) { + // we compute the default name beforehand + // because some filter labels need localization + final sortedFilters = List<CollectionFilter>.from(filters)..sort(); + defaultName = sortedFilters.first.getLabel(context).replaceAll('\n', ' '); + } + return defaultName; + } + + Future<void> _addDynamicAlbum(BuildContext context) async { + final l10n = context.l10n; + final collection = context.read<CollectionLens>(); + final filters = collection.filters; + if (filters.isEmpty) return; + + // get navigator beforehand because + // local context may be deactivated when action is triggered after navigation + final navigator = Navigator.maybeOf(context); + + final name = await showDialog<String>( + context: context, + builder: (context) => const CreateDynamicAlbumDialog(), + routeSettings: const RouteSettings(name: CreateDynamicAlbumDialog.routeName), + ); + if (name == null) return; + + final existingAlbum = dynamicAlbums.get(name); + if (existingAlbum != null) { + // album already exists, so we just need to highlight it + await _showDynamicAlbum(navigator, existingAlbum); + } else { + final album = DynamicAlbumFilter(name, filters.length == 1 ? filters.first : SetAndFilter(filters)); + await dynamicAlbums.add(album); + + final showAction = SnackBarAction( + label: l10n.showButtonLabel, + onPressed: () => _showDynamicAlbum(navigator, album), + ); + showFeedback(context, FeedbackType.info, l10n.genericSuccessFeedback, showAction); + } + } + + Future<void> _showDynamicAlbum(NavigatorState? navigator, DynamicAlbumFilter albumFilter) async { + // local context may be deactivated when action is triggered after navigation + if (navigator != null) { + final context = navigator.context; + final highlightInfo = context.read<HighlightInfo>(); + if (context.currentRouteName == AlbumListPage.routeName) { + highlightInfo.trackItem(FilterGridItem(albumFilter, null), highlightItem: albumFilter); + } else { + highlightInfo.set(albumFilter); + final initialGroup = albumGrouping.getFilterParent(albumFilter); + await navigator.pushAndRemoveUntil( + MaterialPageRoute( + settings: const RouteSettings(name: AlbumListPage.routeName), + builder: (_) => const AlbumListPage(initialGroup: null), + ), + (route) => false, + ); + } + } + } + + Future<void> _addShortcut(BuildContext context) async { + final collection = context.read<CollectionLens>(); + final filters = collection.filters; + + String? defaultName = _getDefaultNameForFilters(context, filters); + final result = await showDialog<(AvesEntry?, String)>( + context: context, + builder: (context) => AddShortcutDialog( + defaultName: defaultName ?? '', + collection: collection, + ), + routeSettings: const RouteSettings(name: AddShortcutDialog.routeName), + ); + if (result == null) return; + + final (coverEntry, name) = result; + if (name.isEmpty) return; + + await appService.pinToHomeScreen(name, coverEntry, route: CollectionPage.routeName, filters: filters); + if (!device.showPinShortcutFeedback) { + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } + } + + void _setHome(BuildContext context) async { + settings.setHome(HomePageSetting.collection, customCollection: context.read<CollectionLens>().filters); + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } +} diff --git a/lib/widgets/collection/filter_bar.dart b/lib/widgets/collection/filter_bar.dart new file mode 100644 index 0000000..b565d7b --- /dev/null +++ b/lib/widgets/collection/filter_bar.dart @@ -0,0 +1,163 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/identity/aves_app_bar.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class FilterBar extends StatefulWidget { + static const EdgeInsets chipPadding = EdgeInsets.symmetric(horizontal: 4); + static const EdgeInsets rowPadding = EdgeInsets.symmetric(horizontal: 4); + static const EdgeInsets padding = EdgeInsets.only(top: 4, bottom: 8); + static final double preferredHeight = AvesFilterChip.minChipHeight + padding.vertical; + + final List<CollectionFilter> filters; + final bool interactive; + final AFilterCallback? onTap, onRemove; + + FilterBar({ + super.key, + required Set<CollectionFilter> filters, + this.interactive = true, + this.onTap, + this.onRemove, + }) : filters = List<CollectionFilter>.from(filters)..sort(); + + @override + State<FilterBar> createState() => _FilterBarState(); +} + +class _FilterBarState extends State<FilterBar> { + final GlobalKey<AnimatedListState> _animatedListKey = GlobalKey(debugLabel: 'filter-bar-animated-list'); + CollectionFilter? _userTappedFilter; + + List<CollectionFilter> get filters => widget.filters; + + @override + void didUpdateWidget(covariant FilterBar oldWidget) { + super.didUpdateWidget(oldWidget); + final current = widget.filters; + final existing = oldWidget.filters; + final removed = existing.where((filter) => !current.contains(filter)).toList(); + final added = current.where((filter) => !existing.contains(filter)).toList(); + final listState = _animatedListKey.currentState; + removed.forEach((filter) { + final index = existing.indexOf(filter); + existing.removeAt(index); + // only animate item removal when triggered by a user interaction with the chip, + // not from automatic chip replacement following chip selection + final animate = context.read<Settings>().animate && _userTappedFilter == filter; + listState!.removeItem( + index, + animate + ? (context, animation) { + animation = animation.drive(CurveTween(curve: Curves.easeInOutBack)); + return FadeTransition( + opacity: animation, + child: SizeTransition( + axis: Axis.horizontal, + sizeFactor: animation, + child: ScaleTransition( + scale: animation, + child: _buildChip(filter), + ), + ), + ); + } + : (context, animation) => const SizedBox(), + duration: animate ? ADurations.filterBarRemovalAnimation : Duration.zero, + ); + }); + added.forEach((filter) { + final index = current.indexOf(filter); + listState!.insertItem( + index, + duration: Duration.zero, + ); + }); + _userTappedFilter = null; + } + + @override + Widget build(BuildContext context) { + return Container( + // specify transparent as a workaround to prevent + // chip border clipping when the floating app bar is fading + padding: FilterBar.padding, + color: Colors.transparent, + height: FilterBar.preferredHeight, + child: AnimatedList( + key: _animatedListKey, + initialItemCount: filters.length, + scrollDirection: Axis.horizontal, + padding: FilterBar.rowPadding, + itemBuilder: (context, index, animation) { + if (index >= filters.length) return const SizedBox(); + return _buildChip(filters.toList()[index]); + }, + ), + ); + } + + Widget _buildChip(CollectionFilter filter) { + final onTap = widget.onTap != null + ? (filter) { + _userTappedFilter = filter; + widget.onTap?.call(filter); + } + : null; + final onRemove = widget.onRemove != null + ? (filter) { + _userTappedFilter = filter; + widget.onRemove?.call(filter); + } + : null; + return _Chip( + filter: filter, + single: filters.length == 1, + interactive: widget.interactive, + onTap: onTap, + onRemove: onRemove, + ); + } +} + +class _Chip extends StatelessWidget { + final CollectionFilter filter; + final bool single, interactive; + final AFilterCallback? onTap, onRemove; + + const _Chip({ + required this.filter, + required this.single, + required this.interactive, + required this.onTap, + required this.onRemove, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: FilterBar.chipPadding, + child: Center( + child: AvesFilterChip( + key: ValueKey(filter), + filter: filter, + maxWidth: single + ? AvesFilterChip.computeMaxWidthForRow( + context, + minChipPerRow: 1, + chipPadding: FilterBar.chipPadding.horizontal, + rowPadding: FilterBar.rowPadding.horizontal + AvesFloatingBar.margin.horizontal, + ) + : null, + heroType: HeroType.always, + onTap: onTap, + onRemove: onRemove, + onLongPress: interactive ? AvesFilterChip.showDefaultLongPressMenu : null, + ), + ), + ); + } +} diff --git a/lib/widgets/collection/grid/headers/album.dart b/lib/widgets/collection/grid/headers/album.dart new file mode 100644 index 0000000..9c1f248 --- /dev/null +++ b/lib/widgets/collection/grid/headers/album.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +/// Header semplice per sezioni della pagina Album. +/// Compatibile con il nuovo sistema basato su AlbumRow. +class AlbumSectionHeader extends StatelessWidget { + final String title; + final IconData? icon; + + const AlbumSectionHeader({ + super.key, + required this.title, + this.icon, + }); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.fromLTRB(16, 12, 16, 6), + child: Row( + children: [ + if (icon != null) + Icon(icon, size: 18, color: Colors.white70), + if (icon != null) + const SizedBox(width: 8), + Text( + title, + style: const TextStyle( + color: Colors.white70, + fontSize: 14, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ); + } +} diff --git a/lib/widgets/collection/grid/headers/any.dart b/lib/widgets/collection/grid/headers/any.dart new file mode 100644 index 0000000..af6d79f --- /dev/null +++ b/lib/widgets/collection/grid/headers/any.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +/// Header stub per la CollectionPage. +/// Nel nuovo sistema non esistono più header dinamici. +class CollectionSectionHeader extends StatelessWidget { + final double height; + + const CollectionSectionHeader({ + super.key, + required this.height, + }); + + @override + Widget build(BuildContext context) { + return const SizedBox.shrink(); + } + + static double getPreferredHeight( + BuildContext context, + double maxWidth, + dynamic source, + dynamic sectionKey, + ) { + return 0; + } +} diff --git a/lib/widgets/collection/grid/headers/date.dart b/lib/widgets/collection/grid/headers/date.dart new file mode 100644 index 0000000..2dd5138 --- /dev/null +++ b/lib/widgets/collection/grid/headers/date.dart @@ -0,0 +1,87 @@ +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/grid/header.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class DaySectionHeader<T> extends StatelessWidget { + final DateTime? date; + final bool selectable; + + const DaySectionHeader({ + super.key, + required this.date, + required this.selectable, + }); + + // Examples (en_US): + // `MMMMd`: `April 15` + // `yMMMMd`: `April 15, 2020` + // `MMMEd`: `Wed, Apr 15` + // `yMMMEd`: `Wed, Apr 15, 2020` + // `MMMMEEEEd`: `Wednesday, April 15` + // `yMMMMEEEEd`: `Wednesday, April 15, 2020` + // `MEd`: `Wed, 4/15` + // `yMEd`: `Wed, 4/15/2020` + + // Examples (ko): + // `MMMMd`: `1월 26일` + // `yMMMMd`: `2021년 1월 26일` + // `MMMEd`: `1월 26일 (화)` + // `yMMMEd`: `2021년 1월 26일 (화)` + // `MMMMEEEEd`: `1월 26일 화요일` + // `yMMMMEEEEd`: `2021년 1월 26일 화요일` + // `MEd`: `1. 26. (화)` + // `yMEd`: `2021. 1. 26. (화)` + + static String _formatDate(BuildContext context, DateTime? date) { + final l10n = context.l10n; + if (date == null) return l10n.sectionUnknown; + if (date.isToday) return l10n.dateToday; + if (date.isYesterday) return l10n.dateYesterday; + + final locale = context.locale; + if (date.isThisYear) return '${DateFormat.MMMMd(locale).format(date)} (${DateFormat.E(locale).format(date)})'; + return '${DateFormat.yMMMMd(locale).format(date)} (${DateFormat.E(locale).format(date)})'; + } + + @override + Widget build(BuildContext context) { + return SectionHeader<T>( + sectionKey: EntryDateSectionKey(date), + title: _formatDate(context, date), + selectable: selectable, + ); + } +} + +class MonthSectionHeader<T> extends StatelessWidget { + final DateTime? date; + final bool selectable; + + const MonthSectionHeader({ + super.key, + required this.date, + required this.selectable, + }); + + static String _formatDate(BuildContext context, DateTime? date) { + final l10n = context.l10n; + if (date == null) return l10n.sectionUnknown; + if (date.isThisMonth) return l10n.dateThisMonth; + + final locale = context.locale; + final localized = date.isThisYear ? DateFormat.MMMM(locale).format(date) : DateFormat.yMMMM(locale).format(date); + return '${localized.substring(0, 1).toUpperCase()}${localized.substring(1)}'; + } + + @override + Widget build(BuildContext context) { + return SectionHeader<T>( + sectionKey: EntryDateSectionKey(date), + title: _formatDate(context, date), + selectable: selectable, + ); + } +} diff --git a/lib/widgets/collection/grid/headers/rating.dart b/lib/widgets/collection/grid/headers/rating.dart new file mode 100644 index 0000000..4cdfc3e --- /dev/null +++ b/lib/widgets/collection/grid/headers/rating.dart @@ -0,0 +1,24 @@ +import 'package:aves/model/filters/rating.dart'; +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/widgets/common/grid/header.dart'; +import 'package:flutter/material.dart'; + +class RatingSectionHeader<T> extends StatelessWidget { + final int rating; + final bool selectable; + + const RatingSectionHeader({ + super.key, + required this.rating, + required this.selectable, + }); + + @override + Widget build(BuildContext context) { + return SectionHeader<T>( + sectionKey: EntryRatingSectionKey(rating), + title: RatingFilter.formatRating(context, rating), + selectable: selectable, + ); + } +} diff --git a/lib/widgets/collection/grid/list_details.dart b/lib/widgets/collection/grid/list_details.dart new file mode 100644 index 0000000..0c30a73 --- /dev/null +++ b/lib/widgets/collection/grid/list_details.dart @@ -0,0 +1,109 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/settings/enums/coordinate_format.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/format.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/widgets/collection/grid/list_details_theme.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class EntryListDetails extends StatelessWidget { + final AvesEntry entry; + + const EntryListDetails({ + super.key, + required this.entry, + }); + + @override + Widget build(BuildContext context) { + final detailsTheme = context.watch<EntryListDetailsThemeData>(); + + return Container( + padding: EntryListDetailsTheme.contentPadding, + foregroundDecoration: BoxDecoration( + border: Border(top: AvesBorder.straightSide(context)), + ), + margin: EntryListDetailsTheme.contentMargin, + child: IconTheme.merge( + data: detailsTheme.iconTheme, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + entry.bestTitle ?? context.l10n.viewerInfoUnknown, + style: detailsTheme.titleStyle, + softWrap: false, + overflow: detailsTheme.titleMaxLines == 1 ? TextOverflow.fade : TextOverflow.ellipsis, + maxLines: detailsTheme.titleMaxLines, + ), + const SizedBox(height: EntryListDetailsTheme.titleDetailPadding), + if (detailsTheme.showDate) _buildDateRow(context, detailsTheme.captionStyle), + if (detailsTheme.showLocation && entry.hasGps) _buildLocationRow(context, detailsTheme.captionStyle), + ], + ), + ), + ); + } + + Widget _buildRow(List<InlineSpan> spans, TextStyle style) { + return Text.rich( + TextSpan( + children: spans, + ), + style: style, + softWrap: false, + overflow: TextOverflow.fade, + ); + } + + WidgetSpan _buildIconSpan(IconData icon, {EdgeInsetsDirectional padding = EdgeInsetsDirectional.zero}) { + return WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Padding( + padding: const EdgeInsetsDirectional.only(end: 8, bottom: 1) + padding, + child: Icon(icon), + ), + ); + } + + Widget _buildDateRow(BuildContext context, TextStyle style) { + final locale = context.locale; + final use24hour = MediaQuery.alwaysUse24HourFormatOf(context); + final date = entry.bestDate; + final dateText = date != null ? formatDateTime(date, locale, use24hour) : AText.valueNotAvailable; + + final size = entry.stackedEntries?.map((v) => v.sizeBytes).sum ?? entry.sizeBytes; + final sizeText = size != null ? formatFileSize(locale, size) : AText.valueNotAvailable; + + return Wrap( + spacing: 8, + children: [ + _buildRow( + [_buildIconSpan(AIcons.date), TextSpan(text: dateText)], + style, + ), + _buildRow( + [_buildIconSpan(AIcons.size), TextSpan(text: sizeText)], + style, + ), + ], + ); + } + + Widget _buildLocationRow(BuildContext context, TextStyle style) { + final location = entry.hasAddress ? entry.shortAddress : settings.coordinateFormat.format(context, entry.latLng!); + + return _buildRow( + [_buildIconSpan(AIcons.location), TextSpan(text: location)], + style, + ); + } +} diff --git a/lib/widgets/collection/grid/list_details_theme.dart b/lib/widgets/collection/grid/list_details_theme.dart new file mode 100644 index 0000000..bc93023 --- /dev/null +++ b/lib/widgets/collection/grid/list_details_theme.dart @@ -0,0 +1,113 @@ +import 'package:aves/theme/format.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/tile_extent_controller.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:provider/provider.dart'; + +class EntryListDetailsTheme extends StatelessWidget { + final double extent; + final Widget child; + + static const EdgeInsets contentMargin = EdgeInsets.symmetric(horizontal: 8); + static const EdgeInsets contentPadding = EdgeInsets.symmetric(vertical: 4); + static const double titleDetailPadding = 6; + + const EntryListDetailsTheme({ + super.key, + required this.extent, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return ProxyProvider<MediaQueryData, EntryListDetailsThemeData>( + update: (context, mq, previous) { + final use24hour = mq.alwaysUse24HourFormat; + final textScaler = mq.textScaler; + + final textTheme = Theme.of(context).textTheme; + var titleStyle = textTheme.bodyMedium!; + var captionStyle = textTheme.bodySmall!; + // specify `height` for accurate paragraph height measurement + final defaultTextHeight = DefaultTextStyle.of(context).style.height; + titleStyle = titleStyle.copyWith(height: titleStyle.height ?? defaultTextHeight); + captionStyle = captionStyle.copyWith(height: captionStyle.height ?? defaultTextHeight); + + final titleLineHeightParagraph = RenderParagraph( + TextSpan( + text: 'Fake Title', + style: titleStyle, + ), + textDirection: TextDirection.ltr, + textScaler: textScaler, + )..layout(const BoxConstraints(), parentUsesSize: true); + final titleLineHeight = titleLineHeightParagraph.getMaxIntrinsicHeight(double.infinity); + titleLineHeightParagraph.dispose(); + + final captionLineHeightParagraph = RenderParagraph( + TextSpan( + text: formatDateTime(DateTime.now(), context.locale, use24hour), + style: captionStyle, + ), + textDirection: TextDirection.ltr, + textScaler: textScaler, + )..layout(const BoxConstraints(), parentUsesSize: true); + final captionLineHeight = captionLineHeightParagraph.getMaxIntrinsicHeight(double.infinity); + + var titleMaxLines = 1; + var showDate = false; + var showLocation = false; + + final gridExtentMin = context.read<TileExtentController>().effectiveExtentMin; + final isMinExtent = (extent - gridExtentMin).abs() < precisionErrorTolerance; + + var availableHeight = extent - contentMargin.vertical - contentPadding.vertical; + if (availableHeight >= titleLineHeight + titleDetailPadding + captionLineHeight) { + showDate = true; + availableHeight -= titleLineHeight + titleDetailPadding + captionLineHeight; + if (availableHeight >= captionLineHeight) { + showLocation = true; + availableHeight -= captionLineHeight; + titleMaxLines += availableHeight ~/ titleLineHeight; + } + } + + return EntryListDetailsThemeData( + extent: extent, + titleMaxLines: titleMaxLines, + isMinExtent: isMinExtent, + showDate: showDate, + showLocation: showLocation, + titleStyle: titleStyle, + captionStyle: captionStyle, + iconTheme: IconThemeData( + color: captionStyle.color, + size: textScaler.scale(captionStyle.fontSize!), + ), + ); + }, + child: child, + ); + } +} + +class EntryListDetailsThemeData { + final double extent; + final int titleMaxLines; + final bool isMinExtent, showDate, showLocation; + final TextStyle titleStyle, captionStyle; + final IconThemeData iconTheme; + + const EntryListDetailsThemeData({ + required this.extent, + required this.titleMaxLines, + required this.isMinExtent, + required this.showDate, + required this.showLocation, + required this.titleStyle, + required this.captionStyle, + required this.iconTheme, + }); +} diff --git a/lib/widgets/collection/grid/section_layout.dart b/lib/widgets/collection/grid/section_layout.dart new file mode 100644 index 0000000..64c749e --- /dev/null +++ b/lib/widgets/collection/grid/section_layout.dart @@ -0,0 +1,53 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/widgets/collection/grid/headers/any.dart'; +import 'package:aves/widgets/common/grid/sections/provider.dart'; +import 'package:flutter/material.dart'; + +class SectionedEntryListLayoutProvider extends SectionedListLayoutProvider<AvesEntry> { + final CollectionLens collection; + final bool selectable; + + SectionedEntryListLayoutProvider({ + super.key, + required this.collection, + required this.selectable, + required super.scrollableWidth, + required super.tileLayout, + required super.columnCount, + required super.spacing, + required super.horizontalPadding, + required double tileExtent, + required super.tileBuilder, + required super.tileAnimationDelay, + required super.child, + }) : super( + tileWidth: tileExtent, + tileHeight: tileExtent, + coverRatioResolver: (item) => item.displayAspectRatio, + ); + + @override + bool get showHeaders => collection.showHeaders; + + @override + Map<SectionKey, List<AvesEntry>> get sections => collection.sections; + + @override + double getHeaderExtent(BuildContext context, SectionKey sectionKey) { + return CollectionSectionHeader.getPreferredHeight( + context, + scrollableWidth, + null, + null, + ); + } + + @override + Widget buildHeader(BuildContext context, SectionKey sectionKey, double headerExtent) { + return CollectionSectionHeader( + height: headerExtent, + ); + } +} diff --git a/lib/widgets/collection/grid/tile.dart b/lib/widgets/collection/grid/tile.dart new file mode 100644 index 0000000..b7af421 --- /dev/null +++ b/lib/widgets/collection/grid/tile.dart @@ -0,0 +1,272 @@ +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/services/intent_service.dart'; +import 'package:aves/widgets/collection/grid/list_details.dart'; +import 'package:aves/widgets/collection/grid/list_details_theme.dart'; +import 'package:aves/widgets/common/grid/scaling.dart'; +import 'package:aves/widgets/common/providers/viewer_entry_provider.dart'; +import 'package:aves/widgets/common/thumbnail/decorated.dart'; +import 'package:aves/widgets/common/thumbnail/notifications.dart'; +import 'package:aves/widgets/viewer/hero.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +// ✅ REMOTE +import 'package:aves/remote/remote_origin.dart'; +import 'package:aves/remote/remote_image_tile.dart'; + +class InteractiveTile extends StatelessWidget { + final CollectionLens collection; + final AvesEntry entry; + final double thumbnailExtent; + final TileLayout tileLayout; + final ValueNotifier<bool>? isScrollingNotifier; + + const InteractiveTile({ + super.key, + required this.collection, + required this.entry, + required this.thumbnailExtent, + required this.tileLayout, + this.isScrollingNotifier, + }); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + final appMode = context.read<ValueNotifier<AppMode>>().value; + switch (appMode) { + case AppMode.main: + final selection = context.read<Selection<AvesEntry>>(); + if (selection.isSelecting) { + selection.toggleSelection(entry); + } else { + OpenViewerNotification(entry).dispatch(context); + } + case AppMode.pickSingleMediaExternal: + IntentService.submitPickedItems([entry.uri]); + case AppMode.pickMultipleMediaExternal: + final selection = context.read<Selection<AvesEntry>>(); + selection.toggleSelection(entry); + case AppMode.pickFilteredMediaInternal: + case AppMode.pickUnfilteredMediaInternal: + Navigator.maybeOf(context)?.pop(entry); + default: + break; + } + }, + child: MetaData( + metaData: ScalerMetadata(entry), + child: Tile( + entry: entry, + thumbnailExtent: thumbnailExtent, + tileLayout: tileLayout, + selectable: true, + highlightable: true, + isScrollingNotifier: isScrollingNotifier, + heroTagger: () => EntryHeroInfo(collection, entry).tag, + ), + ), + ); + } +} + +class Tile extends StatelessWidget { + final AvesEntry entry; + final double thumbnailExtent; + final TileLayout tileLayout; + final bool selectable, highlightable; + final ValueNotifier<bool>? isScrollingNotifier; + final Object? Function()? heroTagger; + + const Tile({ + super.key, + required this.entry, + required this.thumbnailExtent, + required this.tileLayout, + this.selectable = false, + this.highlightable = false, + this.isScrollingNotifier, + this.heroTagger, + }); + + @override + Widget build(BuildContext context) { + switch (tileLayout) { + case TileLayout.mosaic: + case TileLayout.grid: + return _buildThumbnail(context); + case TileLayout.list: + return Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SizedBox.square( + dimension: context.select<EntryListDetailsThemeData, double>((v) => v.extent), + child: _buildThumbnail(context), + ), + Expanded( + child: EntryListDetails( + entry: entry, + ), + ), + ], + ); + } + } + + Widget _buildThumbnail(BuildContext context) { + // ✅ REMOTE: usa RemoteImageTile + overlay selezione stile Aves + if (entry.origin == RemoteOrigin.value) { + return _RemoteDecoratedThumbnail( + entry: entry, + tileExtent: thumbnailExtent, + selectable: selectable, + highlightable: highlightable, + ); + } + + // ✅ LOCALE: comportamento originale (DecoratedThumbnail) + return DecoratedThumbnail( + entry: entry, + tileExtent: thumbnailExtent, + isMosaic: tileLayout == TileLayout.mosaic, + // when the user is scrolling faster than we can retrieve the thumbnails, + // the retrieval task queue can pile up for thumbnails that got disposed + // in this case we pause the image retrieval task to get it out of the queue + cancellableNotifier: isScrollingNotifier, + selectable: selectable, + highlightable: highlightable, + heroTagger: heroTagger, + // do not use a hero placeholder but hide the thumbnail matching the viewer entry, + // so that it can hero out on an entry and come back with a hero to a different entry + heroPlaceholderBuilder: (context, heroSize, child) => child, + imageDecorator: (context, child) { + return Selector<ViewerEntryNotifier, bool>( + selector: (context, v) => v.value == entry, + builder: (context, isViewerEntry, child) { + return Visibility.maintain( + visible: !isViewerEntry, + child: child!, + ); + }, + child: child, + ); + }, + ); + } +} + +/// ✅ Thumbnail per entry remote che replica: +/// - overlay viola + bordo SOLO in selection mode +/// - badge/check in alto a destra in selection mode +/// - nasconde la thumb quando è l’entry aperta nel viewer (come DecoratedThumbnail) +class _RemoteDecoratedThumbnail extends StatelessWidget { + final AvesEntry entry; + final double tileExtent; + final bool selectable; + final bool highlightable; + + const _RemoteDecoratedThumbnail({ + required this.entry, + required this.tileExtent, + required this.selectable, + required this.highlightable, + }); + + @override + Widget build(BuildContext context) { + // Selezione + final selection = context.watch<Selection<AvesEntry>>(); + final isSelecting = selectable && selection.isSelecting; + final isSelected = selectable && selection.selectedItems.contains(entry); + + // Colori (violetto simile ad Aves) + final cs = Theme.of(context).colorScheme; + final highlight = cs.secondary.withOpacity(.28); + final border = cs.secondary.withOpacity(.95); + + Widget content = RemoteImageTile( + entry: entry, + borderRadius: 0, + fit: BoxFit.cover, + ); + + // come DecoratedThumbnail: non mostrare la thumb se è l’entry nel viewer + content = Selector<ViewerEntryNotifier, bool>( + selector: (context, v) => v.value == entry, + builder: (context, isViewerEntry, child) { + return Visibility.maintain( + visible: !isViewerEntry, + child: child!, + ); + }, + child: content, + ); + + return SizedBox( + width: tileExtent, + height: tileExtent, + child: Stack( + fit: StackFit.expand, + children: [ + content, + + // ✅ FIX: overlay viola + bordo SOLO durante selection mode + if (isSelecting && isSelected) ...[ + Positioned.fill(child: ColoredBox(color: highlight)), + Positioned.fill( + child: DecoratedBox( + decoration: BoxDecoration( + border: Border.all(color: border, width: 2), + ), + ), + ), + ], + + // badge selezione in alto a destra durante selection mode + if (isSelecting) + Positioned( + top: 6, + right: 6, + child: _SelectionBadge( + selected: isSelected, + color: cs.secondary, + ), + ), + ], + ), + ); + } +} + +class _SelectionBadge extends StatelessWidget { + final bool selected; + final Color color; + + const _SelectionBadge({ + required this.selected, + required this.color, + }); + + @override + Widget build(BuildContext context) { + final borderColor = Colors.white.withOpacity(.95); + return Container( + width: 20, + height: 20, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: selected ? color : Colors.black.withOpacity(.25), + border: Border.all( + color: selected ? Colors.transparent : borderColor, + width: 1.5, + ), + ), + child: selected ? const Icon(Icons.check, size: 14, color: Colors.white) : null, + ); + } +} diff --git a/lib/widgets/collection/loading.dart b/lib/widgets/collection/loading.dart new file mode 100644 index 0000000..dbe4298 --- /dev/null +++ b/lib/widgets/collection/loading.dart @@ -0,0 +1,83 @@ +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/events.dart'; +import 'package:aves/remote/remote_sync_bus.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class LoadingEmptyContent extends StatelessWidget { + final CollectionSource source; + + const LoadingEmptyContent({ + super.key, + required this.source, + }); + + @override + Widget build(BuildContext context) { + final countFormatter = NumberFormat.decimalPattern(context.locale); + final progressTextStyle = TextStyle( + color: Theme.of(context).colorScheme.primary.withValues(alpha: .5), + fontSize: 18, + ); + + return EmptyContent( + text: context.l10n.sourceStateLoading, + bottom: Padding( + padding: const EdgeInsets.only(top: 16), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // === PROGRESS LOCALE (Aves originale) === + Stack( + alignment: Alignment.center, + children: [ + const ReportProgressIndicator(), + ValueListenableBuilder<ProgressEvent>( + valueListenable: source.progressNotifier, + builder: (context, progress, snapshot) { + final done = progress.done; + return done > 0 + ? Text( + countFormatter.format(done), + style: progressTextStyle, + ) + : const SizedBox(); + }, + ), + ], + ), + + // === PROGRESS REMOTO (solo bootstrap, stile "Aves") === + ValueListenableBuilder<RemoteSyncProgress?>( + valueListenable: RemoteSyncBus.instance.progressNotifier, + builder: (context, prog, _) { + if (prog == null || !prog.showOverlay) return const SizedBox.shrink(); + + final done = prog.done; + final total = prog.total; + + // stesso stile "numerone", ma per remoti preferiamo X/Y + final text = total > 0 + ? 'Agg remoti ${countFormatter.format(done)}/${countFormatter.format(total)}' + : 'Agg remoti ${countFormatter.format(done)}'; + + return Padding( + padding: const EdgeInsets.only(top: 12), + child: Text( + text, + style: progressTextStyle, + textAlign: TextAlign.center, + ), + ); + }, + ), + ], + ), + ), + ); + } +} + diff --git a/lib/widgets/collection/query_bar.dart b/lib/widgets/collection/query_bar.dart new file mode 100644 index 0000000..cc50804 --- /dev/null +++ b/lib/widgets/collection/query_bar.dart @@ -0,0 +1,75 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/widgets/common/basic/query_bar.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class EntryQueryBar extends StatefulWidget { + final ValueNotifier<String> queryNotifier; + final FocusNode focusNode; + + const EntryQueryBar({ + super.key, + required this.queryNotifier, + required this.focusNode, + }); + + @override + State<EntryQueryBar> createState() => _EntryQueryBarState(); + + static double getPreferredHeight(TextScaler textScaler) => QueryBar.getPreferredHeight(textScaler); +} + +class _EntryQueryBarState extends State<EntryQueryBar> { + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant EntryQueryBar oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(EntryQueryBar widget) { + widget.queryNotifier.addListener(_onQueryChanged); + } + + void _unregisterWidget(EntryQueryBar widget) { + widget.queryNotifier.removeListener(_onQueryChanged); + } + + @override + Widget build(BuildContext context) { + final textScaler = MediaQuery.textScalerOf(context); + return Container( + height: EntryQueryBar.getPreferredHeight(textScaler), + alignment: Alignment.topCenter, + child: Selector<Selection<AvesEntry>, bool>( + selector: (context, selection) => !selection.isSelecting, + builder: (context, editable, child) => QueryBar( + queryNotifier: widget.queryNotifier, + focusNode: widget.focusNode, + hintText: context.l10n.collectionSearchTitlesHintText, + editable: editable, + ), + ), + ); + } + + void _onQueryChanged() { + final query = widget.queryNotifier.value; + context.read<CollectionLens>().setLiveQuery(query); + } +} diff --git a/lib/widgets/collection/remote_progress_banner.dart b/lib/widgets/collection/remote_progress_banner.dart new file mode 100644 index 0000000..2c23bc9 --- /dev/null +++ b/lib/widgets/collection/remote_progress_banner.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:aves/remote/remote_sync_bus.dart'; + +class RemoteProgressBanner extends StatelessWidget { + const RemoteProgressBanner({super.key}); + + @override + Widget build(BuildContext context) { + final bus = RemoteSyncBus.instance; + + return ValueListenableBuilder<RemoteSyncProgress?>( + valueListenable: bus.progressNotifier, + builder: (context, prog, _) { + // Mostra SOLO quando è bootstrap (showOverlay=true) + if (prog == null || !prog.showOverlay) return const SizedBox.shrink(); + + final total = prog.total; + final done = prog.done; + final value = total > 0 ? done / total : null; + + final label = 'Agg remoti $done/$total'; + + return SafeArea( + child: Align( + alignment: Alignment.topCenter, + child: Container( + margin: const EdgeInsets.all(12), + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + width: 380, + decoration: BoxDecoration( + color: Colors.black87, + borderRadius: BorderRadius.circular(12), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, style: const TextStyle(color: Colors.white)), + const SizedBox(height: 6), + ClipRRect( + borderRadius: BorderRadius.circular(6), + child: LinearProgressIndicator( + value: value, // determinata se total>0, altrimenti indeterminata + minHeight: 4, + backgroundColor: Colors.white24, + color: Colors.lightBlueAccent, + ), + ), + ], + ), + ), + ), + ); + }, + ); + } +} diff --git a/lib/widgets/collection/remote_status_button.dart b/lib/widgets/collection/remote_status_button.dart new file mode 100644 index 0000000..3aee0bb --- /dev/null +++ b/lib/widgets/collection/remote_status_button.dart @@ -0,0 +1,161 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/remote/remote_sync_bus.dart'; +import 'package:aves/remote/remote_controller.dart'; +import 'package:aves/remote/remote_settings_dialog.dart'; + +class RemoteStatusButton extends StatefulWidget { + final CollectionSource source; + const RemoteStatusButton({super.key, required this.source}); + + @override + State<RemoteStatusButton> createState() => _RemoteStatusButtonState(); +} + +class _RemoteStatusButtonState extends State<RemoteStatusButton> + with SingleTickerProviderStateMixin { + late final AnimationController _blink = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 700), + lowerBound: 0.25, + upperBound: 1.0, + ); + + bool _busy = false; + + Timer? _lpTimer; + bool _longPressFired = false; + Offset? _downPos; + + static const _longPressDelay = Duration(milliseconds: 600); + static const double _moveSlop = 10.0; + + @override + void dispose() { + _lpTimer?.cancel(); + _blink.dispose(); + super.dispose(); + } + + Future<void> _toggle() async { + if (_busy) return; + setState(() => _busy = true); + try { + await RemoteController.instance.toggleRemote(source: widget.source); + } finally { + if (mounted) setState(() => _busy = false); + } + } + + Future<void> _openSettings() async { + if (_busy) return; + await RemoteSettingsDialog.show(context); + } + + void _startLongPressTimer(Offset globalPos) { + _lpTimer?.cancel(); + _longPressFired = false; + _downPos = globalPos; + + _lpTimer = Timer(_longPressDelay, () async { + if (!mounted || _busy) return; + _longPressFired = true; + await _openSettings(); + }); + } + + void _cancelLongPressTimer() { + _lpTimer?.cancel(); + _lpTimer = null; + } + + @override + Widget build(BuildContext context) { + final bus = RemoteSyncBus.instance; + + return ValueListenableBuilder<RemoteSyncState>( + valueListenable: bus.stateNotifier, + builder: (context, st, _) { + Color color; + bool blinking; + + switch (st) { + case RemoteSyncState.disabled: + color = Colors.grey; + blinking = false; + break; + + case RemoteSyncState.syncing: + color = Colors.orangeAccent; + blinking = true; // 🔥 arancione lampeggiante + break; + + case RemoteSyncState.upToDate: + color = Colors.greenAccent; + blinking = false; // verde fisso + break; + + // 🔥 TUTTI GLI ERRORI → ROSSO FISSO + case RemoteSyncState.serverDown: + case RemoteSyncState.timeout: + case RemoteSyncState.networkError: + case RemoteSyncState.badGateway: + case RemoteSyncState.serverError: + color = Colors.redAccent; + blinking = false; // 🔥 rosso NON lampeggiante + break; + } + + // Gestione blinking + if (blinking) { + if (!_blink.isAnimating) _blink.repeat(reverse: true); + } else { + if (_blink.isAnimating) _blink.stop(); + _blink.value = 1.0; + } + + final icon = FadeTransition( + opacity: _blink, + child: Icon(Icons.satellite_alt_rounded, color: color), + ); + + return SizedBox.square( + dimension: kMinInteractiveDimension, + child: Listener( + onPointerDown: (e) { + if (_busy) return; + _startLongPressTimer(e.position); + }, + onPointerMove: (e) { + final start = _downPos; + if (start != null) { + final dx = (e.position.dx - start.dx).abs(); + final dy = (e.position.dy - start.dy).abs(); + if (dx > _moveSlop || dy > _moveSlop) { + _cancelLongPressTimer(); + } + } + }, + onPointerUp: (e) async { + if (_busy) return; + _cancelLongPressTimer(); + + if (_longPressFired) { + _longPressFired = false; + return; + } + + await _toggle(); + }, + onPointerCancel: (e) { + _cancelLongPressTimer(); + }, + behavior: HitTestBehavior.opaque, + child: Center(child: icon), + ), + ); + }, + ); + } +} diff --git a/lib/widgets/collection/remote_status_icon.dart b/lib/widgets/collection/remote_status_icon.dart new file mode 100644 index 0000000..62150d4 --- /dev/null +++ b/lib/widgets/collection/remote_status_icon.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import 'package:aves/remote/remote_sync_bus.dart'; + +class RemoteStatusIcon extends StatefulWidget { + const RemoteStatusIcon({super.key}); + + @override + State<RemoteStatusIcon> createState() => _RemoteStatusIconState(); +} + +class _RemoteStatusIconState extends State<RemoteStatusIcon> with SingleTickerProviderStateMixin { + late final AnimationController _blink = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 700), + lowerBound: 0.25, + upperBound: 1.0, + ); + + @override + void dispose() { + _blink.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final bus = RemoteSyncBus.instance; + + return ValueListenableBuilder<RemoteSyncState>( + valueListenable: bus.stateNotifier, + builder: (context, st, _) { + Color color; + bool blinking = false; + + switch (st) { + case RemoteSyncState.syncing: + color = Colors.redAccent; + blinking = true; + break; + case RemoteSyncState.upToDate: + color = Colors.greenAccent; + blinking = false; + break; + case RemoteSyncState.error: + color = Colors.amberAccent; + blinking = true; + break; + case RemoteSyncState.idle: + default: + // se vuoi "non aggiornato" rosso fisso: + color = Colors.redAccent; + blinking = false; + break; + } + + if (blinking) { + if (!_blink.isAnimating) _blink.repeat(reverse: true); + } else { + if (_blink.isAnimating) _blink.stop(); + _blink.value = 1.0; + } + + return FadeTransition( + opacity: _blink, + // icona "parabola" (puoi cambiare se vuoi) + child: Icon(Icons.wifi_tethering_rounded, color: color), + ); + }, + ); + } +} diff --git a/lib/widgets/common/action_controls/quick_choosers/album_chooser.dart b/lib/widgets/common/action_controls/quick_choosers/album_chooser.dart new file mode 100644 index 0000000..da5a017 --- /dev/null +++ b/lib/widgets/common/action_controls/quick_choosers/album_chooser.dart @@ -0,0 +1,51 @@ +import 'dart:async'; + +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/common/menu.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class AlbumQuickChooser extends StatelessWidget with FilterQuickChooserMixin<String> { + final ValueNotifier<String?> valueNotifier; + @override + final List<String> options; + final bool blurred; + final PopupMenuPosition chooserPosition; + final Stream<Offset> pointerGlobalPosition; + + const AlbumQuickChooser({ + super.key, + required this.valueNotifier, + required this.options, + required this.blurred, + required this.chooserPosition, + required this.pointerGlobalPosition, + }); + + @override + Widget build(BuildContext context) { + return MenuQuickChooser<String>( + valueNotifier: valueNotifier, + options: options, + autoReverse: true, + blurred: blurred, + chooserPosition: chooserPosition, + pointerGlobalPosition: pointerGlobalPosition, + maxTotalOptionCount: FilterQuickChooserMixin.maxTotalOptionCount, + itemHeight: computeItemHeight(context), + contentWidth: computeLargestItemWidth, + itemBuilder: itemBuilder, + emptyBuilder: (context) => Text(context.l10n.albumEmpty), + ); + } + + @override + CollectionFilter buildFilter(BuildContext context, String option) { + final source = context.read<CollectionSource>(); + return StoredAlbumFilter(option, source.getStoredAlbumDisplayName(context, option)); + } +} diff --git a/lib/widgets/common/action_controls/quick_choosers/common/button.dart b/lib/widgets/common/action_controls/quick_choosers/common/button.dart new file mode 100644 index 0000000..fadcaa8 --- /dev/null +++ b/lib/widgets/common/action_controls/quick_choosers/common/button.dart @@ -0,0 +1,150 @@ +import 'dart:async'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/common/route_layout.dart'; +import 'package:aves/widgets/common/basic/gestures/gesture_detector.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +abstract class ChooserQuickButton<T> extends StatefulWidget { + final bool blurred; + final ValueSetter<T>? onChooserValue; + final FocusNode? focusNode; + final VoidCallback? onPressed; + + const ChooserQuickButton({ + super.key, + required this.blurred, + this.onChooserValue, + this.focusNode, + required this.onPressed, + }); +} + +abstract class ChooserQuickButtonState<T extends ChooserQuickButton<U>, U> extends State<T> with SingleTickerProviderStateMixin { + AnimationController? _animationController; + CurvedAnimation? _animation; + OverlayEntry? _chooserOverlayEntry; + final ValueNotifier<U?> _chooserValueNotifier = ValueNotifier(null); + final StreamController<LongPressMoveUpdateDetails> _moveUpdateStreamController = StreamController.broadcast(); + + Widget get icon; + + String get tooltip; + + U? get defaultValue => null; + + Duration get animationDuration => context.read<DurationsData>().quickChooserAnimation; + + Curve get animationCurve => Curves.easeOutQuad; + + bool get hasChooser => widget.onChooserValue != null; + + Widget buildChooser(Animation<double> animation, PopupMenuPosition chooserPosition); + + ValueNotifier<U?> get chooserValueNotifier => _chooserValueNotifier; + + Stream<Offset> get pointerGlobalPosition => _moveUpdateStreamController.stream.map((event) => event.globalPosition); + + @override + void dispose() { + _animation?.dispose(); + _animationController?.dispose(); + _clearChooserOverlayEntry(); + _chooserValueNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final _hasChooser = hasChooser; + + Widget child = IconButton( + icon: icon, + onPressed: widget.onPressed, + focusNode: widget.focusNode, + tooltip: _hasChooser ? null : tooltip, + ); + if (_hasChooser) { + child = Semantics( + tooltip: tooltip, + child: child, + ); + } + + final theme = Theme.of(context); + final colorScheme = theme.colorScheme; + return Theme( + data: theme.copyWith( + colorScheme: colorScheme.copyWith( + onSurfaceVariant: colorScheme.onSurface, + ), + ), + child: AGestureDetector( + behavior: HitTestBehavior.opaque, + onLongPressStart: _hasChooser ? _showChooser : null, + onLongPressMoveUpdate: _hasChooser ? _moveUpdateStreamController.add : null, + onLongPressEnd: _hasChooser + ? (details) { + _clearChooserOverlayEntry(); + final selectedValue = _chooserValueNotifier.value; + if (selectedValue != null) { + widget.onChooserValue?.call(selectedValue); + } + } + : null, + onLongPressCancel: _clearChooserOverlayEntry, + longPressTimeout: settings.longPressTimeout, + child: child, + ), + ); + } + + void _clearChooserOverlayEntry() { + _chooserOverlayEntry + ?..remove() + ..dispose(); + _chooserOverlayEntry = null; + } + + void _showChooser(LongPressStartDetails details) { + final overlay = Overlay.of(context); + final triggerBox = context.findRenderObject() as RenderBox; + final overlayBox = overlay.context.findRenderObject() as RenderBox; + final triggerRect = RelativeRect.fromRect( + triggerBox.localToGlobal(Offset.zero, ancestor: overlayBox) & triggerBox.size, + Offset.zero & overlayBox.size, + ); + + _chooserValueNotifier.value = defaultValue; + _chooserOverlayEntry = OverlayEntry( + builder: (context) { + final mq = MediaQuery.of(context); + final chooserPosition = (details.globalPosition.dy > mq.size.height / 2) ? PopupMenuPosition.over : PopupMenuPosition.under; + return CustomSingleChildLayout( + delegate: QuickChooserRouteLayout( + triggerRect, + chooserPosition, + mq.padding, + DisplayFeatureSubScreen.avoidBounds(mq).toSet(), + ), + child: buildChooser(_animation!, chooserPosition), + ); + }, + ); + if (_animationController == null) { + _animationController = AnimationController( + duration: animationDuration, + vsync: this, + ); + _animation = CurvedAnimation( + parent: _animationController!, + curve: animationCurve, + ); + } + _animationController!.reset(); + overlay.insert(_chooserOverlayEntry!); + _animationController!.forward(); + } +} diff --git a/lib/widgets/common/action_controls/quick_choosers/common/menu.dart b/lib/widgets/common/action_controls/quick_choosers/common/menu.dart new file mode 100644 index 0000000..6866085 --- /dev/null +++ b/lib/widgets/common/action_controls/quick_choosers/common/menu.dart @@ -0,0 +1,318 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/common/quick_chooser.dart'; +import 'package:aves_ui/aves_ui.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:provider/provider.dart'; + +class MenuQuickChooser<T> extends StatefulWidget { + final ValueNotifier<T?> valueNotifier; + final List<T> options; + final bool autoReverse; + final bool blurred; + final PopupMenuPosition chooserPosition; + final Stream<Offset> pointerGlobalPosition; + final int maxTotalOptionCount; + final double itemHeight; + final double? Function(BuildContext context)? contentWidth; + final Widget Function(BuildContext context, T menuItem) itemBuilder; + final WidgetBuilder? emptyBuilder; + + static const int maxVisibleOptionCount = 5; + + MenuQuickChooser({ + super.key, + required this.valueNotifier, + required List<T> options, + required this.autoReverse, + required this.blurred, + required this.chooserPosition, + required this.pointerGlobalPosition, + this.maxTotalOptionCount = maxVisibleOptionCount, + this.itemHeight = kMinInteractiveDimension, + this.contentWidth, + required this.itemBuilder, + this.emptyBuilder, + }) : options = options.take(maxTotalOptionCount).toList(); + + @override + State<MenuQuickChooser<T>> createState() => _MenuQuickChooserState<T>(); +} + +class _MenuQuickChooserState<T> extends State<MenuQuickChooser<T>> { + final Set<StreamSubscription> _subscriptions = {}; + final ValueNotifier<Rect> _selectedRowRect = ValueNotifier(Rect.zero); + final ScrollController _scrollController = ScrollController(); + int _scrollDirection = 0; + Timer? _scrollUpdateTimer; + Offset _globalPosition = Offset.zero; + + ValueNotifier<T?> get valueNotifier => widget.valueNotifier; + + List<T> get options => widget.options; + + bool get reversed => widget.autoReverse && widget.chooserPosition == PopupMenuPosition.over; + + bool get scrollable => options.length > MenuQuickChooser.maxVisibleOptionCount; + + int get visibleOptionCount => min(MenuQuickChooser.maxVisibleOptionCount, options.length); + + double get itemHeight => widget.itemHeight; + + double get contentHeight => max(0, itemHeight * visibleOptionCount + _intraPadding * (visibleOptionCount - 1)); + + static const double _selectorMargin = 24; + static const double _intraPadding = 8; + static const double _nonScrollablePaddingHeight = _intraPadding; + static const double _scrollerAreaHeight = kMinInteractiveDimension; + static const double scrollMaxPixelPerSecond = 600.0; + static const Duration scrollUpdateInterval = Duration(milliseconds: 100); + + @override + void initState() { + super.initState(); + _registerWidget(widget); + WidgetsBinding.instance.addPostFrameCallback((_) => setState(() {})); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _selectedRowRect.value = Rect.fromLTWH(0, MediaQuery.sizeOf(context).height * (reversed ? 1 : -1), 0, 0); + } + + @override + void didUpdateWidget(covariant MenuQuickChooser<T> oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + _selectedRowRect.dispose(); + _scrollController.dispose(); + _scrollUpdateTimer?.cancel(); + super.dispose(); + } + + void _registerWidget(MenuQuickChooser<T> widget) { + _subscriptions.add(widget.pointerGlobalPosition.listen(_onPointerMove)); + } + + void _unregisterWidget(MenuQuickChooser<T> widget) { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + @override + Widget build(BuildContext context) { + return QuickChooser( + blurred: widget.blurred, + child: ValueListenableBuilder<T?>( + valueListenable: valueNotifier, + builder: (context, selectedValue, child) { + final durations = context.watch<DurationsData>(); + + if (options.isEmpty) { + return Padding( + padding: const EdgeInsets.all(16), + child: widget.emptyBuilder?.call(context) ?? const SizedBox(), + ); + } + + return Stack( + children: [ + ValueListenableBuilder<Rect>( + valueListenable: _selectedRowRect, + builder: (context, selectedRowRect, child) { + Widget child = const Center(child: AvesDot()); + child = AnimatedOpacity( + opacity: selectedValue != null ? 1 : 0, + curve: Curves.easeInOutCubic, + duration: const Duration(milliseconds: 200), + child: child, + ); + child = AnimatedPositioned( + top: selectedRowRect.top, + height: selectedRowRect.height, + curve: Curves.easeInOutCubic, + duration: const Duration(milliseconds: 200), + child: child, + ); + return child; + }, + ), + Container( + width: widget.contentWidth?.call(context), + margin: const EdgeInsetsDirectional.only(start: _selectorMargin), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + scrollable + ? ListenableBuilder( + listenable: _scrollController, + builder: (context, child) => Opacity( + opacity: canGoUp ? 1 : .5, + child: child, + ), + child: _buildScrollerArea(AIcons.up), + ) + : const SizedBox(height: _nonScrollablePaddingHeight), + ConstrainedBox( + constraints: BoxConstraints.tightFor(height: contentHeight), + child: ListView.separated( + reverse: reversed, + controller: _scrollController, + shrinkWrap: true, + padding: EdgeInsets.zero, + itemBuilder: (context, index) { + final child = Container( + alignment: AlignmentDirectional.centerStart, + constraints: BoxConstraints.tightFor(height: itemHeight), + child: widget.itemBuilder(context, options[index]), + ); + if (index < MenuQuickChooser.maxVisibleOptionCount) { + // only animate items visible on first render + return AnimationConfiguration.staggeredList( + position: index, + duration: durations.staggeredAnimation * .5, + delay: durations.staggeredAnimationDelay * .5 * timeDilation, + child: SlideAnimation( + verticalOffset: 50.0 * (widget.chooserPosition == PopupMenuPosition.over ? 1 : -1), + child: FadeInAnimation( + child: child, + ), + ), + ); + } else { + return child; + } + }, + separatorBuilder: (context, index) => const SizedBox(height: _intraPadding), + itemCount: options.length, + ), + ), + scrollable + ? ListenableBuilder( + listenable: _scrollController, + builder: (context, child) => Opacity( + opacity: canGoDown ? 1 : .5, + child: child, + ), + child: _buildScrollerArea(AIcons.down), + ) + : const SizedBox(height: _nonScrollablePaddingHeight), + ], + ), + ), + ], + ); + }, + ), + ); + } + + bool get canGoUp { + if (!_scrollController.hasClients) return false; + final position = _scrollController.position; + if (!position.hasContentDimensions) return false; + return reversed ? position.pixels < position.maxScrollExtent : 0 < position.pixels; + } + + bool get canGoDown { + if (!_scrollController.hasClients) return false; + final position = _scrollController.position; + if (!position.hasContentDimensions) return false; + return reversed ? 0 < position.pixels : position.pixels < position.maxScrollExtent; + } + + Widget _buildScrollerArea(IconData icon) { + return Container( + alignment: Alignment.center, + height: _scrollerAreaHeight, + margin: const EdgeInsetsDirectional.only(end: _selectorMargin), + child: Icon(icon), + ); + } + + void _onPointerMove(Offset globalPosition) { + _globalPosition = globalPosition; + final chooserBox = context.findRenderObject() as RenderBox?; + if (chooserBox == null) return; + + final chooserSize = chooserBox.size; + final contentWidth = chooserSize.width; + final chooserBoxEdgeHeight = (QuickChooser.margin.vertical + QuickChooser.padding.vertical) / 2; + + final localPosition = chooserBox.globalToLocal(globalPosition); + final dx = localPosition.dx; + if (!(0 < dx && dx < contentWidth)) { + valueNotifier.value = null; + return; + } + + double dy = localPosition.dy - chooserBoxEdgeHeight; + int scrollDirection = 0; + if (scrollable) { + dy -= _scrollerAreaHeight; + if (-_scrollerAreaHeight < dy && dy < 0) { + scrollDirection = reversed ? 1 : -1; + } else if (contentHeight < dy && dy < contentHeight + _scrollerAreaHeight) { + scrollDirection = reversed ? -1 : 1; + } + _scroll(scrollDirection); + } else { + dy -= _nonScrollablePaddingHeight; + } + + T? selectedValue; + if (scrollDirection == 0 && 0 < dy && dy < contentHeight) { + final visibleOffset = reversed ? contentHeight - dy : dy; + final fullItemHeight = itemHeight + _intraPadding; + final scrollOffset = _scrollController.offset; + final index = (visibleOffset + _intraPadding + scrollOffset) ~/ (fullItemHeight); + if (0 <= index && index < options.length) { + selectedValue = options[index]; + double fromEdge = fullItemHeight * index; + fromEdge += (scrollable ? _scrollerAreaHeight - scrollOffset : _nonScrollablePaddingHeight); + final top = reversed ? chooserSize.height - chooserBoxEdgeHeight - fromEdge - fullItemHeight : fromEdge; + _selectedRowRect.value = Rect.fromLTWH(0, top, contentWidth, itemHeight); + } + } + valueNotifier.value = selectedValue; + } + + void _scroll(int scrollDirection) { + if (scrollDirection == _scrollDirection) return; + _scrollDirection = scrollDirection; + _scrollUpdateTimer?.cancel(); + + final current = _scrollController.offset; + if (scrollDirection == 0) { + _scrollController.jumpTo(current); + return; + } + + final target = scrollDirection > 0 ? _scrollController.position.maxScrollExtent : .0; + if (target != current) { + final distance = target - current; + final millis = distance * 1000 / scrollMaxPixelPerSecond / scrollDirection; + _scrollController.animateTo( + target, + duration: Duration(milliseconds: millis.round()), + curve: Curves.linear, + ); + // use a timer to update the selection, because `_onPointerMove` + // is not called when the pointer stays still while the view is scrolling + _scrollUpdateTimer = Timer.periodic(scrollUpdateInterval, (_) => _onPointerMove(_globalPosition)); + } + } +} diff --git a/lib/widgets/common/action_controls/quick_choosers/common/quick_chooser.dart b/lib/widgets/common/action_controls/quick_choosers/common/quick_chooser.dart new file mode 100644 index 0000000..b1430d8 --- /dev/null +++ b/lib/widgets/common/action_controls/quick_choosers/common/quick_chooser.dart @@ -0,0 +1,47 @@ +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/fx/blurred.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/material.dart'; + +class QuickChooser extends StatelessWidget { + final bool blurred; + final Widget child; + + static const margin = EdgeInsets.all(8); + static const padding = EdgeInsets.symmetric(horizontal: 8); + + const QuickChooser({ + super.key, + required this.blurred, + required this.child, + }); + + @override + Widget build(BuildContext context) { + final brightness = Theme.of(context).brightness; + final backgroundColor = blurred ? Themes.overlayBackgroundColor(brightness: brightness, blurred: blurred) : null; + const borderRadius = BorderRadius.all(AvesDialog.cornerRadius); + return Padding( + padding: margin, + child: BlurredRRect( + enabled: blurred, + borderRadius: borderRadius, + child: Material( + borderRadius: borderRadius, + color: backgroundColor, + child: Ink( + decoration: BoxDecoration( + border: AvesBorder.border(context), + borderRadius: borderRadius, + ), + child: Padding( + padding: padding, + child: child, + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/common/action_controls/quick_choosers/common/route_layout.dart b/lib/widgets/common/action_controls/quick_choosers/common/route_layout.dart new file mode 100644 index 0000000..835f691 --- /dev/null +++ b/lib/widgets/common/action_controls/quick_choosers/common/route_layout.dart @@ -0,0 +1,80 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +// adapted from Flutter `_PopupMenuRouteLayout` in `/material/popup_menu.dart` +class QuickChooserRouteLayout extends SingleChildLayoutDelegate { + final RelativeRect triggerRect; + final PopupMenuPosition menuPosition; + final EdgeInsets padding; + final Set<Rect> avoidBounds; + + static const double _kMenuScreenPadding = 8.0; + + QuickChooserRouteLayout( + this.triggerRect, + this.menuPosition, + this.padding, + this.avoidBounds, + ); + + @override + BoxConstraints getConstraintsForChild(BoxConstraints constraints) { + return BoxConstraints.loose(constraints.biggest).deflate( + const EdgeInsets.all(_kMenuScreenPadding) + padding, + ); + } + + @override + Offset getPositionForChild(Size size, Size childSize) { + // size: The size of the overlay. + // childSize: The size of the menu, when fully open, as determined by getConstraintsForChild. + + double y; + switch (menuPosition) { + case PopupMenuPosition.over: + y = triggerRect.top - childSize.height; + case PopupMenuPosition.under: + y = size.height - triggerRect.bottom; + } + double x = (triggerRect.left + (size.width - triggerRect.right) - childSize.width) / 2; + final wantedPosition = Offset(x, y); + final originCenter = triggerRect.toRect(Offset.zero & size).center; + final subScreens = DisplayFeatureSubScreen.subScreensInBounds(Offset.zero & size, avoidBounds); + final subScreen = _closestScreen(subScreens, originCenter); + return _fitInsideScreen(subScreen, childSize, wantedPosition); + } + + Rect _closestScreen(Iterable<Rect> screens, Offset point) { + Rect closest = screens.first; + for (final Rect screen in screens) { + if ((screen.center - point).distance < (closest.center - point).distance) { + closest = screen; + } + } + return closest; + } + + Offset _fitInsideScreen(Rect screen, Size childSize, Offset wantedPosition) { + double x = wantedPosition.dx; + double y = wantedPosition.dy; + // Avoid going outside an area defined as the rectangle 8.0 pixels from the + // edge of the screen in every direction. + if (x < screen.left + _kMenuScreenPadding + padding.left) { + x = screen.left + _kMenuScreenPadding + padding.left; + } else if (x + childSize.width > screen.right - _kMenuScreenPadding - padding.right) { + x = screen.right - childSize.width - _kMenuScreenPadding - padding.right; + } + if (y < screen.top + _kMenuScreenPadding + padding.top) { + y = _kMenuScreenPadding + padding.top; + } else if (y + childSize.height > screen.bottom - _kMenuScreenPadding - padding.bottom) { + y = screen.bottom - childSize.height - _kMenuScreenPadding - padding.bottom; + } + + return Offset(x, y); + } + + @override + bool shouldRelayout(QuickChooserRouteLayout oldDelegate) { + return triggerRect != oldDelegate.triggerRect || padding != oldDelegate.padding || !setEquals(avoidBounds, oldDelegate.avoidBounds); + } +} diff --git a/lib/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart b/lib/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart new file mode 100644 index 0000000..ba6577d --- /dev/null +++ b/lib/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart @@ -0,0 +1,58 @@ +import 'dart:math'; + +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/modules/app.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +mixin FilterQuickChooserMixin<T> { + List<T> get options; + + static const int maxTotalOptionCount = AppSettings.recentFilterHistoryMax; + static const double _chipPadding = AvesFilterChip.defaultPadding; + static const bool _chipAllowGenericIcon = false; + + CollectionFilter buildFilter(BuildContext context, T option); + + Widget itemBuilder(BuildContext context, T option) { + return AvesFilterChip( + filter: buildFilter(context, option), + allowGenericIcon: _chipAllowGenericIcon, + padding: _chipPadding, + maxWidth: double.infinity, + ); + } + + double computeItemHeight(BuildContext context) => AvesFilterChip.minChipHeight; + + double? computeLargestItemWidth(BuildContext context) { + if (options.isEmpty) return null; + + final textStyle = DefaultTextStyle.of(context).style.copyWith( + fontSize: AvesFilterChip.fontSize, + ); + final textDirection = Directionality.of(context); + final textScaler = MediaQuery.textScalerOf(context); + final iconSize = textScaler.scale(AvesFilterChip.iconSize); + + return options + .map((option) { + final filter = buildFilter(context, option); + final icon = filter.iconBuilder(context, iconSize, allowGenericIcon: _chipAllowGenericIcon); + final label = filter.getLabel(context); + final paragraph = RenderParagraph( + TextSpan(text: label, style: textStyle), + textDirection: textDirection, + textScaler: textScaler, + )..layout(const BoxConstraints(), parentUsesSize: true); + final labelWidth = paragraph.getMaxIntrinsicWidth(double.infinity); + double chipWidth = labelWidth + _chipPadding * 4; + if (icon != null) { + chipWidth += iconSize + _chipPadding; + } + return max(AvesFilterChip.minChipWidth, chipWidth); + }) + .reduce(max); + } +} diff --git a/lib/widgets/common/action_controls/quick_choosers/move_button.dart b/lib/widgets/common/action_controls/quick_choosers/move_button.dart new file mode 100644 index 0000000..a3cc61b --- /dev/null +++ b/lib/widgets/common/action_controls/quick_choosers/move_button.dart @@ -0,0 +1,70 @@ +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/album_chooser.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/common/button.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/filter_grids/common/filter_nav_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class MoveButton extends ChooserQuickButton<String> { + final bool copy; + + const MoveButton({ + super.key, + required this.copy, + required super.blurred, + super.onChooserValue, + required super.onPressed, + }); + + @override + State<MoveButton> createState() => _MoveButtonState(); +} + +class _MoveButtonState extends ChooserQuickButtonState<MoveButton, String> { + EntryAction get action => widget.copy ? EntryAction.copy : EntryAction.move; + + @override + Widget get icon => action.getIcon(); + + @override + String get tooltip => action.getText(context); + + @override + Widget buildChooser(Animation<double> animation, PopupMenuPosition chooserPosition) { + final source = context.read<CollectionSource>(); + final rawAlbums = source.rawAlbums; + final options = settings.recentDestinationAlbums.where(rawAlbums.contains).toList(); + final takeCount = FilterQuickChooserMixin.maxTotalOptionCount - options.length; + if (takeCount > 0) { + final filters = rawAlbums.whereNot(options.contains).map((album) => StoredAlbumFilter(album, null)).toSet(); + final allMapEntries = filters.map((filter) => FilterGridItem(filter, source.recentEntry(filter))).toList(); + allMapEntries.sort(FilterNavigationPage.compareFiltersByDate); + options.addAll(allMapEntries.take(takeCount).map((v) => v.filter.album)); + } + + return MediaQueryDataProvider( + child: FadeTransition( + opacity: animation, + child: ScaleTransition( + scale: animation, + alignment: chooserPosition == PopupMenuPosition.over ? Alignment.bottomCenter : Alignment.topCenter, + child: AlbumQuickChooser( + valueNotifier: chooserValueNotifier, + options: options, + blurred: widget.blurred, + chooserPosition: chooserPosition, + pointerGlobalPosition: pointerGlobalPosition, + ), + ), + ), + ); + } +} diff --git a/lib/widgets/common/action_controls/quick_choosers/rate_button.dart b/lib/widgets/common/action_controls/quick_choosers/rate_button.dart new file mode 100644 index 0000000..874e2bf --- /dev/null +++ b/lib/widgets/common/action_controls/quick_choosers/rate_button.dart @@ -0,0 +1,47 @@ +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/common/button.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/rate_chooser.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +class RateButton extends ChooserQuickButton<int> { + const RateButton({ + super.key, + required super.blurred, + super.onChooserValue, + super.focusNode, + required super.onPressed, + }); + + @override + State<RateButton> createState() => _RateButtonState(); +} + +class _RateButtonState extends ChooserQuickButtonState<RateButton, int> { + static const _action = EntryAction.editRating; + + @override + Widget get icon => _action.getIcon(); + + @override + String get tooltip => _action.getText(context); + + @override + int? get defaultValue => 3; + + @override + Widget buildChooser(Animation<double> animation, PopupMenuPosition chooserPosition) { + return FadeTransition( + opacity: animation, + child: ScaleTransition( + scale: animation, + alignment: chooserPosition == PopupMenuPosition.over ? Alignment.bottomCenter : Alignment.topCenter, + child: RateQuickChooser( + blurred: widget.blurred, + valueNotifier: chooserValueNotifier, + pointerGlobalPosition: pointerGlobalPosition, + ), + ), + ); + } +} diff --git a/lib/widgets/common/action_controls/quick_choosers/rate_chooser.dart b/lib/widgets/common/action_controls/quick_choosers/rate_chooser.dart new file mode 100644 index 0000000..687d4ea --- /dev/null +++ b/lib/widgets/common/action_controls/quick_choosers/rate_chooser.dart @@ -0,0 +1,100 @@ +import 'dart:async'; + +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/common/quick_chooser.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; + +class RateQuickChooser extends StatefulWidget { + final bool blurred; + final ValueNotifier<int?> valueNotifier; + final Stream<Offset> pointerGlobalPosition; + + const RateQuickChooser({ + super.key, + required this.blurred, + required this.valueNotifier, + required this.pointerGlobalPosition, + }); + + @override + State<RateQuickChooser> createState() => _RateQuickChooserState(); +} + +class _RateQuickChooserState extends State<RateQuickChooser> { + final Set<StreamSubscription> _subscriptions = {}; + + ValueNotifier<int?> get valueNotifier => widget.valueNotifier; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant RateQuickChooser oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(RateQuickChooser widget) { + _subscriptions.add(widget.pointerGlobalPosition.listen(_onPointerMove)); + } + + void _unregisterWidget(RateQuickChooser widget) { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + @override + Widget build(BuildContext context) { + return QuickChooser( + blurred: widget.blurred, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: ValueListenableBuilder<int?>( + valueListenable: valueNotifier, + builder: (context, selectedValue, child) { + final _rating = selectedValue ?? 0; + return Row( + mainAxisSize: MainAxisSize.min, + children: List.generate(5, (i) { + final disabled = _rating < i + 1; + return Padding( + padding: const EdgeInsets.all(4), + child: Icon( + AIcons.rating, + fill: disabled ? 0 : 1, + color: disabled ? AColors.starDisabled : AColors.starEnabled, + ), + ); + }).toList(), + ); + }, + ), + ), + ); + } + + void _onPointerMove(Offset globalPosition) { + final padding = QuickChooser.margin.horizontal + QuickChooser.padding.horizontal; + + final chooserBox = context.findRenderObject() as RenderBox; + final chooserSize = chooserBox.size; + final contentWidth = chooserSize.width - padding; + + final local = chooserBox.globalToLocal(globalPosition); + final t = (local.dx - padding / 2) / contentWidth; + valueNotifier.value = (5 * (context.isRtl ? 1 - t : t)).ceil().clamp(0, 5); + } +} diff --git a/lib/widgets/common/action_controls/quick_choosers/share_button.dart b/lib/widgets/common/action_controls/quick_choosers/share_button.dart new file mode 100644 index 0000000..a58055b --- /dev/null +++ b/lib/widgets/common/action_controls/quick_choosers/share_button.dart @@ -0,0 +1,61 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/common/button.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/share_chooser.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +class ShareButton extends ChooserQuickButton<ShareAction> { + final Set<AvesEntry> entries; + + const ShareButton({ + super.key, + required super.blurred, + required this.entries, + super.onChooserValue, + super.focusNode, + required super.onPressed, + }); + + @override + State<ShareButton> createState() => _ShareButtonState(); +} + +class _ShareButtonState extends ChooserQuickButtonState<ShareButton, ShareAction> { + EntryAction get action => EntryAction.share; + + @override + Widget get icon => action.getIcon(); + + @override + String get tooltip => action.getText(context); + + @override + bool get hasChooser => super.hasChooser && options.isNotEmpty; + + List<ShareAction> get options => [ + if (widget.entries.any((entry) => entry.isMotionPhoto)) ...[ + ShareAction.imageOnly, + ShareAction.videoOnly, + ], + ]; + + @override + Widget buildChooser(Animation<double> animation, PopupMenuPosition chooserPosition) { + return FadeTransition( + opacity: animation, + child: ScaleTransition( + scale: animation, + alignment: chooserPosition == PopupMenuPosition.over ? Alignment.bottomCenter : Alignment.topCenter, + child: ShareQuickChooser( + valueNotifier: chooserValueNotifier, + options: options, + blurred: widget.blurred, + chooserPosition: chooserPosition, + pointerGlobalPosition: pointerGlobalPosition, + ), + ), + ); + } +} diff --git a/lib/widgets/common/action_controls/quick_choosers/share_chooser.dart b/lib/widgets/common/action_controls/quick_choosers/share_chooser.dart new file mode 100644 index 0000000..3290596 --- /dev/null +++ b/lib/widgets/common/action_controls/quick_choosers/share_chooser.dart @@ -0,0 +1,71 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/common/menu.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +class ShareQuickChooser extends StatelessWidget { + final ValueNotifier<ShareAction?> valueNotifier; + final List<ShareAction> options; + final bool blurred; + final PopupMenuPosition chooserPosition; + final Stream<Offset> pointerGlobalPosition; + + static const _itemPadding = EdgeInsetsDirectional.only(end: 8); + + const ShareQuickChooser({ + super.key, + required this.valueNotifier, + required this.options, + required this.blurred, + required this.chooserPosition, + required this.pointerGlobalPosition, + }); + + @override + Widget build(BuildContext context) { + return MenuQuickChooser<ShareAction>( + valueNotifier: valueNotifier, + options: options, + autoReverse: false, + blurred: blurred, + chooserPosition: chooserPosition, + pointerGlobalPosition: pointerGlobalPosition, + itemHeight: kMinInteractiveDimension, + contentWidth: _computeLargestItemWidth, + itemBuilder: (context, action) => Padding( + padding: _itemPadding, + child: MenuRow( + text: action.getText(context), + icon: action.getIcon(), + ), + ), + ); + } + + double? _computeLargestItemWidth(BuildContext context) { + if (options.isEmpty) return null; + + final textStyle = DefaultTextStyle.of(context).style; + final textDirection = Directionality.of(context); + final textScaler = MediaQuery.textScalerOf(context); + final iconSize = IconTheme.of(context).size ?? 24; + + return options + .map((action) { + final text = action.getText(context); + final paragraph = RenderParagraph( + TextSpan(text: text, style: textStyle), + textDirection: textDirection, + textScaler: textScaler, + )..layout(const BoxConstraints(), parentUsesSize: true); + final labelWidth = paragraph.getMaxIntrinsicWidth(double.infinity); + return iconSize + MenuRow.leadingPadding.horizontal + labelWidth + _itemPadding.horizontal; + }) + .reduce(max); + } +} diff --git a/lib/widgets/common/action_controls/quick_choosers/tag_button.dart b/lib/widgets/common/action_controls/quick_choosers/tag_button.dart new file mode 100644 index 0000000..8de2068 --- /dev/null +++ b/lib/widgets/common/action_controls/quick_choosers/tag_button.dart @@ -0,0 +1,76 @@ +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/common/button.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/tag_chooser.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/filter_grids/common/filter_nav_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class TagButton extends ChooserQuickButton<CollectionFilter> { + const TagButton({ + super.key, + required super.blurred, + super.onChooserValue, + super.focusNode, + required super.onPressed, + }); + + @override + State<TagButton> createState() => _TagButtonState(); +} + +class _TagButtonState extends ChooserQuickButtonState<TagButton, CollectionFilter> { + EntryAction get action => EntryAction.editTags; + + @override + Widget get icon => action.getIcon(); + + @override + String get tooltip => action.getText(context); + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + final source = context.read<CollectionSource?>(); + settings.removeObsoleteRecentTags(source); + }); + } + + @override + Widget buildChooser(Animation<double> animation, PopupMenuPosition chooserPosition) { + final options = settings.recentTags; + final takeCount = FilterQuickChooserMixin.maxTotalOptionCount - options.length; + if (takeCount > 0) { + final source = context.read<CollectionSource>(); + final filters = source.sortedTags.map(TagFilter.new).whereNot(options.contains).toSet(); + final allMapEntries = filters.map((filter) => FilterGridItem(filter, source.recentEntry(filter))).toList(); + allMapEntries.sort(FilterNavigationPage.compareFiltersByDate); + options.addAll(allMapEntries.take(takeCount).map((v) => v.filter)); + } + + return MediaQueryDataProvider( + child: FadeTransition( + opacity: animation, + child: ScaleTransition( + scale: animation, + alignment: chooserPosition == PopupMenuPosition.over ? Alignment.bottomCenter : Alignment.topCenter, + child: TagQuickChooser( + valueNotifier: chooserValueNotifier, + options: options, + blurred: widget.blurred, + chooserPosition: chooserPosition, + pointerGlobalPosition: pointerGlobalPosition, + ), + ), + ), + ); + } +} diff --git a/lib/widgets/common/action_controls/quick_choosers/tag_chooser.dart b/lib/widgets/common/action_controls/quick_choosers/tag_chooser.dart new file mode 100644 index 0000000..1b139e5 --- /dev/null +++ b/lib/widgets/common/action_controls/quick_choosers/tag_chooser.dart @@ -0,0 +1,45 @@ +import 'dart:async'; + +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/common/menu.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/filter_quick_chooser_mixin.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; + +class TagQuickChooser extends StatelessWidget with FilterQuickChooserMixin<CollectionFilter> { + final ValueNotifier<CollectionFilter?> valueNotifier; + @override + final List<CollectionFilter> options; + final bool blurred; + final PopupMenuPosition chooserPosition; + final Stream<Offset> pointerGlobalPosition; + + const TagQuickChooser({ + super.key, + required this.valueNotifier, + required this.options, + required this.blurred, + required this.chooserPosition, + required this.pointerGlobalPosition, + }); + + @override + Widget build(BuildContext context) { + return MenuQuickChooser<CollectionFilter>( + valueNotifier: valueNotifier, + options: options, + autoReverse: true, + blurred: blurred, + chooserPosition: chooserPosition, + pointerGlobalPosition: pointerGlobalPosition, + maxTotalOptionCount: FilterQuickChooserMixin.maxTotalOptionCount, + itemHeight: computeItemHeight(context), + contentWidth: computeLargestItemWidth, + itemBuilder: itemBuilder, + emptyBuilder: (context) => Text(context.l10n.tagEmpty), + ); + } + + @override + CollectionFilter buildFilter(BuildContext context, CollectionFilter option) => option; +} diff --git a/lib/widgets/common/action_controls/togglers/favourite.dart b/lib/widgets/common/action_controls/togglers/favourite.dart new file mode 100644 index 0000000..cfc28d7 --- /dev/null +++ b/lib/widgets/common/action_controls/togglers/favourite.dart @@ -0,0 +1,162 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/favourites.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/fx/sweeper.dart'; +import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class FavouriteToggler extends StatefulWidget { + final Set<AvesEntry> entries; + final bool isMenuItem; + final FocusNode? focusNode; + final VoidCallback? onPressed; + + const FavouriteToggler({ + super.key, + required this.entries, + this.isMenuItem = false, + this.focusNode, + this.onPressed, + }); + + @override + State<FavouriteToggler> createState() => _FavouriteTogglerState(); +} + +class _FavouriteTogglerState extends State<FavouriteToggler> { + final ValueNotifier<bool> _isFavouriteNotifier = ValueNotifier(false); + + Set<AvesEntry> get entries => widget.entries; + + static const isFavouriteIcon = Icon(AIcons.favourite, fill: 1); + static const isNotFavouriteIcon = Icon(AIcons.favourite, fill: 0); + + @override + void initState() { + super.initState(); + favourites.addListener(_onChanged); + _onChanged(); + } + + @override + void didUpdateWidget(covariant FavouriteToggler oldWidget) { + super.didUpdateWidget(oldWidget); + _onChanged(); + } + + @override + void dispose() { + favourites.removeListener(_onChanged); + _isFavouriteNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder<bool>( + valueListenable: _isFavouriteNotifier, + builder: (context, isFavourite, child) { + if (widget.isMenuItem) { + return isFavourite + ? MenuRow( + text: context.l10n.entryActionRemoveFavourite, + icon: isFavouriteIcon, + ) + : MenuRow( + text: context.l10n.entryActionAddFavourite, + icon: isNotFavouriteIcon, + ); + } + final animate = context.select<Settings, bool>((v) => v.animate); + return Stack( + alignment: Alignment.center, + children: [ + IconButton( + icon: isFavourite ? isFavouriteIcon : isNotFavouriteIcon, + onPressed: widget.onPressed, + focusNode: widget.focusNode, + tooltip: isFavourite ? context.l10n.entryActionRemoveFavourite : context.l10n.entryActionAddFavourite, + ), + if (animate) + Sweeper( + key: ValueKey(entries.length == 1 ? entries.first : entries.length), + builder: (context) => Icon( + AIcons.favourite, + fill: 0, + color: context.select<AvesColorsData, Color>((v) => v.favourite), + ), + toggledNotifier: _isFavouriteNotifier, + ), + ], + ); + }, + ); + } + + void _onChanged() { + _isFavouriteNotifier.value = entries.isNotEmpty && entries.every((entry) => entry.isFavourite); + } +} + +class FavouriteTogglerCaption extends StatefulWidget { + final Set<AvesEntry> entries; + final bool enabled; + + const FavouriteTogglerCaption({ + super.key, + required this.entries, + required this.enabled, + }); + + @override + State<FavouriteTogglerCaption> createState() => _FavouriteTogglerCaptionState(); +} + +class _FavouriteTogglerCaptionState extends State<FavouriteTogglerCaption> { + final ValueNotifier<bool> _isFavouriteNotifier = ValueNotifier(false); + + Set<AvesEntry> get entries => widget.entries; + + @override + void initState() { + super.initState(); + favourites.addListener(_onChanged); + _onChanged(); + } + + @override + void didUpdateWidget(covariant FavouriteTogglerCaption oldWidget) { + super.didUpdateWidget(oldWidget); + _onChanged(); + } + + @override + void dispose() { + favourites.removeListener(_onChanged); + _isFavouriteNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder<bool>( + valueListenable: _isFavouriteNotifier, + builder: (context, isFavourite, child) { + return CaptionedButtonText( + text: isFavourite ? context.l10n.entryActionRemoveFavourite : context.l10n.entryActionAddFavourite, + enabled: widget.enabled, + ); + }, + ); + } + + void _onChanged() { + _isFavouriteNotifier.value = entries.isNotEmpty && entries.every((entry) => entry.isFavourite); + } +} diff --git a/lib/widgets/common/action_controls/togglers/mute.dart b/lib/widgets/common/action_controls/togglers/mute.dart new file mode 100644 index 0000000..caff772 --- /dev/null +++ b/lib/widgets/common/action_controls/togglers/mute.dart @@ -0,0 +1,87 @@ +import 'dart:async'; + +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:flutter/material.dart'; + +class MuteToggler extends StatelessWidget { + final AvesVideoController? controller; + final bool isMenuItem; + final FocusNode? focusNode; + final VoidCallback? onPressed; + + const MuteToggler({ + super.key, + required this.controller, + this.isMenuItem = false, + this.focusNode, + this.onPressed, + }); + + bool get isMuted => controller?.isMuted ?? false; + + @override + Widget build(BuildContext context) { + return NullableValueListenableBuilder<bool>( + valueListenable: controller?.canMuteNotifier, + builder: (context, value, child) { + final canDo = value ?? false; + return StreamBuilder<double>( + stream: controller?.volumeStream ?? Stream.value(1.0), + builder: (context, snapshot) { + final icon = Icon(isMuted ? AIcons.unmute : AIcons.mute); + final text = isMuted ? context.l10n.videoActionUnmute : context.l10n.videoActionMute; + + return isMenuItem + ? MenuRow( + text: text, + icon: icon, + ) + : IconButton( + icon: icon, + onPressed: canDo ? onPressed : null, + focusNode: focusNode, + tooltip: text, + ); + }, + ); + }, + ); + } +} + +class MuteTogglerCaption extends StatelessWidget { + final AvesVideoController? controller; + final bool enabled; + + const MuteTogglerCaption({ + super.key, + required this.controller, + required this.enabled, + }); + + bool get isMuted => controller?.isMuted ?? false; + + @override + Widget build(BuildContext context) { + return NullableValueListenableBuilder<bool>( + valueListenable: controller?.canMuteNotifier, + builder: (context, value, child) { + final canDo = value ?? false; + return StreamBuilder<double>( + stream: controller?.volumeStream ?? Stream.value(1.0), + builder: (context, snapshot) { + return CaptionedButtonText( + text: isMuted ? context.l10n.videoActionUnmute : context.l10n.videoActionMute, + enabled: canDo && enabled, + ); + }, + ); + }, + ); + } +} diff --git a/lib/widgets/common/action_controls/togglers/play.dart b/lib/widgets/common/action_controls/togglers/play.dart new file mode 100644 index 0000000..67c5a5b --- /dev/null +++ b/lib/widgets/common/action_controls/togglers/play.dart @@ -0,0 +1,130 @@ +import 'dart:async'; + +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class PlayToggler extends StatefulWidget { + final AvesVideoController? controller; + final bool isMenuItem; + final FocusNode? focusNode; + final VoidCallback? onPressed; + + const PlayToggler({ + super.key, + required this.controller, + this.isMenuItem = false, + this.focusNode, + this.onPressed, + }); + + @override + State<PlayToggler> createState() => _PlayTogglerState(); +} + +class _PlayTogglerState extends State<PlayToggler> with SingleTickerProviderStateMixin { + final Set<StreamSubscription> _subscriptions = {}; + late AnimationController _playPauseAnimation; + + AvesVideoController? get controller => widget.controller; + + bool get isPlaying => controller?.isPlaying ?? false; + + @override + void initState() { + super.initState(); + _playPauseAnimation = AnimationController( + duration: context.read<DurationsData>().iconAnimation, + vsync: this, + ); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant PlayToggler oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + _playPauseAnimation.dispose(); + super.dispose(); + } + + void _registerWidget(PlayToggler widget) { + final controller = widget.controller; + if (controller != null) { + _subscriptions.add(controller.statusStream.listen(_onStatusChanged)); + _onStatusChanged(controller.status); + } + } + + void _unregisterWidget(PlayToggler widget) { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + @override + Widget build(BuildContext context) { + final text = isPlaying ? context.l10n.videoActionPause : context.l10n.videoActionPlay; + + return widget.isMenuItem + ? MenuRow( + text: text, + icon: Icon(isPlaying ? AIcons.pause : AIcons.play), + ) + : IconButton( + icon: AnimatedIcon( + icon: AnimatedIcons.play_pause, + progress: _playPauseAnimation, + ), + onPressed: widget.onPressed, + focusNode: widget.focusNode, + tooltip: text, + ); + } + + void _onStatusChanged(VideoStatus status) { + final status = _playPauseAnimation.status; + if (isPlaying && !status.isForwardOrCompleted) { + _playPauseAnimation.forward(); + } else if (!isPlaying && status.isForwardOrCompleted) { + _playPauseAnimation.reverse(); + } + } +} + +class PlayTogglerCaption extends StatelessWidget { + final AvesVideoController? controller; + final bool enabled; + + const PlayTogglerCaption({ + super.key, + required this.controller, + required this.enabled, + }); + + bool get isPlaying => controller?.isPlaying ?? false; + + @override + Widget build(BuildContext context) { + return StreamBuilder<VideoStatus>( + stream: controller?.statusStream ?? Stream.value(VideoStatus.idle), + builder: (context, snapshot) { + return CaptionedButtonText( + text: isPlaying ? context.l10n.videoActionPause : context.l10n.videoActionPlay, + enabled: enabled, + ); + }, + ); + } +} diff --git a/lib/widgets/common/action_controls/togglers/title_search.dart b/lib/widgets/common/action_controls/togglers/title_search.dart new file mode 100644 index 0000000..b7badcd --- /dev/null +++ b/lib/widgets/common/action_controls/togglers/title_search.dart @@ -0,0 +1,61 @@ +import 'package:aves/model/query.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class TitleSearchToggler extends StatelessWidget { + final bool queryEnabled, isMenuItem; + final FocusNode? focusNode; + final VoidCallback? onPressed; + + const TitleSearchToggler({ + super.key, + required this.queryEnabled, + this.isMenuItem = false, + this.focusNode, + this.onPressed, + }); + + @override + Widget build(BuildContext context) { + final icon = Icon(queryEnabled ? AIcons.filterOff : AIcons.filter); + final text = queryEnabled ? context.l10n.collectionActionHideTitleSearch : context.l10n.collectionActionShowTitleSearch; + return isMenuItem + ? MenuRow( + text: text, + icon: icon, + ) + : IconButton( + icon: icon, + onPressed: onPressed, + focusNode: focusNode, + tooltip: text, + ); + } +} + +class TitleSearchTogglerCaption extends StatelessWidget { + final bool enabled; + + const TitleSearchTogglerCaption({ + super.key, + required this.enabled, + }); + + @override + Widget build(BuildContext context) { + // `Query` may not be available during hero + return Selector<Query?, bool>( + selector: (context, query) => query?.enabled ?? false, + builder: (context, queryEnabled, child) { + return CaptionedButtonText( + text: queryEnabled ? context.l10n.collectionActionHideTitleSearch : context.l10n.collectionActionShowTitleSearch, + enabled: enabled, + ); + }, + ); + } +} diff --git a/lib/widgets/common/action_mixins/entry_editor.dart b/lib/widgets/common/action_mixins/entry_editor.dart new file mode 100644 index 0000000..b202b6c --- /dev/null +++ b/lib/widgets/common/action_mixins/entry_editor.dart @@ -0,0 +1,140 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/metadata_edition.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/placeholder.dart'; +import 'package:aves/model/metadata/date_modifier.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/dialogs/entry_editors/edit_date_dialog.dart'; +import 'package:aves/widgets/dialogs/entry_editors/edit_description_dialog.dart'; +import 'package:aves/widgets/dialogs/entry_editors/edit_location_dialog.dart'; +import 'package:aves/widgets/dialogs/entry_editors/edit_rating_dialog.dart'; +import 'package:aves/widgets/dialogs/entry_editors/remove_metadata_dialog.dart'; +import 'package:aves/widgets/dialogs/entry_editors/tag_editor_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +mixin EntryEditorMixin { + Future<DateModifier?> selectDateModifier(BuildContext context, Set<AvesEntry> entries, CollectionLens? collection) async { + if (entries.isEmpty) return null; + + return showDialog<DateModifier>( + context: context, + builder: (context) => EditEntryDateDialog( + entry: entries.first, + collection: collection, + ), + routeSettings: const RouteSettings(name: EditEntryDateDialog.routeName), + ); + } + + Future<LocationEditActionResult?> selectLocation(BuildContext context, Set<AvesEntry> entries, CollectionLens? collection) async { + if (entries.isEmpty) return null; + + return showDialog<LocationEditActionResult>( + context: context, + builder: (context) => EditEntryLocationDialog( + entries: entries, + collection: collection, + ), + routeSettings: const RouteSettings(name: EditEntryLocationDialog.routeName), + ); + } + + Future<Map<DescriptionField, String?>?> selectTitleDescriptionModifier(BuildContext context, Set<AvesEntry> entries) async { + if (entries.isEmpty) return null; + + final entry = entries.first; + final initialTitle = entry.catalogMetadata?.xmpTitle ?? ''; + final fields = await metadataFetchService.getOverlayMetadata(entry, {MetadataSyntheticField.description}); + final initialDescription = fields.description ?? ''; + + return showDialog<Map<DescriptionField, String?>>( + context: context, + builder: (context) => EditEntryTitleDescriptionDialog( + initialTitle: initialTitle, + initialDescription: initialDescription, + ), + routeSettings: const RouteSettings(name: EditEntryTitleDescriptionDialog.routeName), + ); + } + + Future<int?> selectRating(BuildContext context, Set<AvesEntry> entries) async { + if (entries.isEmpty) return null; + + return showDialog<int>( + context: context, + builder: (context) => EditEntryRatingDialog( + entry: entries.first, + ), + routeSettings: const RouteSettings(name: EditEntryRatingDialog.routeName), + ); + } + + Future<Map<AvesEntry, Set<String>>?> selectTags(BuildContext context, Set<AvesEntry> entries) async { + if (entries.isEmpty) return null; + + final oldTagsByEntry = Map.fromEntries( + entries.map((v) { + return MapEntry(v, v.tags.map(TagFilter.new).toSet()); + }), + ); + final filtersByEntry = + await Navigator.maybeOf(context)?.push<Map<AvesEntry, Set<CollectionFilter>>>( + MaterialPageRoute( + settings: const RouteSettings(name: TagEditorPage.routeName), + builder: (context) => TagEditorPage( + tagsByEntry: oldTagsByEntry, + ), + ), + ) ?? + oldTagsByEntry; + + final newTagsByEntry = <AvesEntry, Set<String>>{}; + await Future.forEach(filtersByEntry.entries, (kv) async { + final entry = kv.key; + final filters = kv.value; + newTagsByEntry[entry] = await getTagsFromFilters(filters, entry); + }); + + return newTagsByEntry; + } + + Future<Set<String>> getTagsFromFilters(Set<CollectionFilter> filters, AvesEntry entry) async { + final tags = filters.whereType<TagFilter>().map((v) => v.tag).toSet(); + final placeholderTags = await Future.wait(filters.whereType<PlaceholderFilter>().map((v) => v.toTag(entry))); + tags.addAll(placeholderTags.nonNulls.where((v) => v.isNotEmpty)); + return tags; + } + + Future<Set<MetadataType>?> selectMetadataToRemove(BuildContext context, Set<AvesEntry> entries) async { + if (entries.isEmpty) return null; + + final types = await showDialog<Set<MetadataType>>( + context: context, + builder: (context) => RemoveEntryMetadataDialog( + showJpegTypes: entries.any((entry) => entry.mimeType == MimeTypes.jpeg), + ), + routeSettings: const RouteSettings(name: RemoveEntryMetadataDialog.routeName), + ); + if (types == null || types.isEmpty) return null; + + if (entries.any((entry) => entry.isMotionPhoto) && types.contains(MetadataType.xmp)) { + final l10n = context.l10n; + if (!await showConfirmationDialog( + context: context, + message: l10n.removeEntryMetadataMotionPhotoXmpWarningDialogMessage, + ok: l10n.applyButtonLabel, + )) { + return null; + } + } + + return types; + } +} diff --git a/lib/widgets/common/action_mixins/entry_storage.dart b/lib/widgets/common/action_mixins/entry_storage.dart new file mode 100644 index 0000000..6720c92 --- /dev/null +++ b/lib/widgets/common/action_mixins/entry_storage.dart @@ -0,0 +1,656 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/favourites.dart'; +import 'package:aves/model/entry/extensions/keys.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/trash.dart'; +import 'package:aves/model/highlight.dart'; +import 'package:aves/model/metadata/date_modifier.dart'; +import 'package:aves/model/multipage.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/image_op_events.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/media/enums.dart'; +import 'package:aves/services/media/media_edit_service.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/collection/entry_set_action_delegate.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; +import 'package:aves/widgets/common/action_mixins/size_aware.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/dialogs/pick_dialogs/pick_album_stub.dart'; +import 'package:aves/widgets/dialogs/selection_dialogs/single_selection.dart'; +import 'package:aves/widgets/filter_grids/common/enums.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +// ✅ NEW: usa “Crea album” di Aves quando la destinazione è solo remota +import 'package:aves/widgets/dialogs/filter_editors/create_stored_album_dialog.dart'; + +mixin EntryStorageMixin on FeedbackMixin, PermissionAwareMixin, SizeAwareMixin { + // ------------------------------------------------------------ + // Helpers: remote-only destination -> create local album via Aves dialog + // ------------------------------------------------------------ + + bool _isRemoteOnlyAlbumPath(String path) => path.startsWith('/photos/'); + + Future<String?> _ensureLocalAlbumForRemoteDestination( + BuildContext context, { + required String destinationAlbum, + }) async { + // già locale + if (!_isRemoteOnlyAlbumPath(destinationAlbum)) { + return destinationAlbum; + } + + // suggerisci il nome come basename della cartella remota + final suggestedName = pContext.basename(destinationAlbum); + + // dialog “Crea album” (Aves), precompilato col nome + final localAlbum = await showDialog<String>( + context: context, + builder: (_) => CreateStoredAlbumDialog(initialName: suggestedName), + routeSettings: const RouteSettings(name: CreateStoredAlbumDialog.routeName), + ); + + if (localAlbum == null || localAlbum.trim().isEmpty) return null; + + final path = localAlbum.trim(); + + // se non esiste ancora, chiedi permesso sul parent (come fa Aves in rename/move), + // poi prova a creare la directory + final parent = pContext.dirname(path); + final exists = await Directory(path).exists(); + if (!exists) { + if (!await checkStoragePermissionForAlbums(context, {parent})) return null; + try { + await Directory(path).create(recursive: true); + } catch (_) { + // se fallisce per scoped storage, lasciamo che il native move/export gestisca (se previsto) + } + } + + // registra l’album nella source (per farlo comparire subito) + context.read<CollectionSource>().createStoredAlbum(path); + + return path; + } + + // ------------------------------------------------------------ + // Export/Convert + // ------------------------------------------------------------ + + // returns whether it completed the action (with or without failures) + Future<bool> doExport(BuildContext context, Set<AvesEntry> targetEntries, EntryConvertOptions options) async { + final destinationAlbumFilter = await pickAlbum( + context: context, + moveType: MoveType.export, + chipTypes: {AlbumChipType.stored}, + initialGroup: null, + ); + if (destinationAlbumFilter == null || destinationAlbumFilter is! StoredAlbumFilter) return false; + + // ✅ se la destinazione è un album “solo remoto”, crea prima la cartella locale via dialog Aves + var destinationAlbum = destinationAlbumFilter.album; + final ensured = await _ensureLocalAlbumForRemoteDestination( + context, + destinationAlbum: destinationAlbum, + ); + if (ensured == null) return false; + destinationAlbum = ensured; + + if (!await checkStoragePermissionForAlbums(context, {destinationAlbum})) return false; + + if (!await checkFreeSpaceForMove(context, targetEntries, destinationAlbum, MoveType.export)) return false; + + final transientMultiPageInfo = <MultiPageInfo>{}; + final selection = <AvesEntry>{}; + await Future.forEach(targetEntries, (targetEntry) async { + if (targetEntry.isMultiPage) { + final multiPageInfo = await targetEntry.getMultiPageInfo(); + if (multiPageInfo != null) { + transientMultiPageInfo.add(multiPageInfo); + if (targetEntry.isMotionPhoto) { + await multiPageInfo.extractMotionPhotoVideo(); + } + if (multiPageInfo.pageCount > 1) { + selection.addAll(multiPageInfo.exportEntries); + } + } + } else { + selection.add(targetEntry); + } + }); + + final l10n = context.l10n; + + var nameConflictStrategy = NameConflictStrategy.rename; + final destinationDirectory = Directory(destinationAlbum); + final destinationExtension = MimeTypes.extensionFor(options.mimeType); + final names = [ + ...selection.map((v) => '${v.filenameWithoutExtension}$destinationExtension'), + // do not guard up front based on directory existence, + // as conflicts could be within moved entries scattered across multiple albums + if (await destinationDirectory.exists()) ...destinationDirectory.listSync().map((v) => pContext.basename(v.path)), + ].map((v) => v.toLowerCase()).toList(); + // case insensitive comparison + final uniqueNames = names.toSet(); + if (uniqueNames.length < names.length) { + final value = await showDialog<NameConflictStrategy>( + context: context, + builder: (context) => AvesSingleSelectionDialog<NameConflictStrategy>( + initialValue: nameConflictStrategy, + options: Map.fromEntries(NameConflictStrategy.values.map((v) => MapEntry(v, v.getName(context)))), + message: l10n.nameConflictDialogSingleSourceMessage, + confirmationButtonLabel: l10n.continueButtonLabel, + ), + routeSettings: const RouteSettings(name: AvesSingleSelectionDialog.routeName), + ); + if (value == null) return false; + nameConflictStrategy = value; + } + + final selectionCount = selection.length; + final source = context.read<CollectionSource>(); + source.pauseMonitoring(); + await showOpReport<ExportOpEvent>( + context: context, + opStream: mediaEditService.export( + selection, + options: options, + destinationAlbum: destinationAlbum, + nameConflictStrategy: nameConflictStrategy, + ), + itemCount: selectionCount, + onDone: (processed) async { + final successOps = processed.where((op) => op.success).toSet(); + final exportedOps = successOps.where((op) => !op.skipped && op.newFields[EntryFields.uri] != null).toSet(); + final newUris = exportedOps.map((op) => op.newFields[EntryFields.uri] as String).toSet(); + final isMainMode = context.read<ValueNotifier<AppMode>>().value == AppMode.main; + + // check source favourite status + final favouriteSourceUris = selection.where((entry) => entry.isFavourite).map((entry) => entry.uri).toSet(); + final favouriteNewUris = <String>{}; + exportedOps.forEach((op) { + final sourceUri = op.uri; + if (favouriteSourceUris.contains(sourceUri)) { + final newUri = op.newFields[EntryFields.uri] as String; + favouriteNewUris.add(newUri); + } + }); + + source.resumeMonitoring(); + unawaited( + source.refreshUris(newUris).then((_) { + // transfer favourite status on exports + final newFavouriteEntries = source.allEntries.where((entry) => favouriteNewUris.contains(entry.uri)).toSet(); + favourites.add(newFavouriteEntries); + }), + ); + + // get navigator beforehand because + // local context may be deactivated when action is triggered after navigation + final navigator = Navigator.maybeOf(context); + final showAction = isMainMode && newUris.isNotEmpty + ? SnackBarAction( + label: l10n.showButtonLabel, + onPressed: () { + if (navigator != null) { + navigator.pushAndRemoveUntil( + MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) => CollectionPage( + source: source, + filters: {StoredAlbumFilter(destinationAlbum, source.getStoredAlbumDisplayName(context, destinationAlbum))}, + highlightTest: (entry) => newUris.contains(entry.uri), + ), + ), + (route) => false, + ); + } + }, + ) + : null; + final successCount = successOps.length; + if (successCount < selectionCount) { + final count = selectionCount - successCount; + showFeedback( + context, + FeedbackType.warn, + l10n.collectionExportFailureFeedback(count), + showAction, + ); + } else { + showFeedback( + context, + FeedbackType.info, + l10n.genericSuccessFeedback, + showAction, + ); + } + }, + ); + transientMultiPageInfo.forEach((v) => v.dispose()); + return true; + } + + // ------------------------------------------------------------ + // Quick move/copy + // ------------------------------------------------------------ + + // returns whether it completed the action (with or without failures) + Future<bool> doQuickMove( + BuildContext context, { + required MoveType moveType, + required Map<String, Set<AvesEntry>> entriesByDestination, + bool hideShowAction = false, + VoidCallback? onSuccess, + }) async { + if (moveType == MoveType.move) { + // skip moving entries to their directory + entriesByDestination.forEach((destinationAlbum, entries) { + entries.removeWhere((entry) => entry.directory == destinationAlbum); + }); + entriesByDestination.removeWhere((_, entries) => entries.isEmpty); + } + + final entries = entriesByDestination.values.expand((v) => v).toSet(); + final todoCount = entries.length; + if (todoCount == 0) return true; + + final toBin = moveType == MoveType.toBin; + final copy = moveType == MoveType.copy; + + // permission for modification at destinations + final destinationAlbums = entriesByDestination.keys.toSet(); + if (!await checkStoragePermissionForAlbums(context, destinationAlbums)) return false; + + // permission for modification at origins + final originAlbums = entries.map((e) => e.directory).nonNulls.toSet(); + if ({MoveType.move, MoveType.toBin}.contains(moveType) && !await checkStoragePermissionForAlbums(context, originAlbums, entries: entries)) return false; + + final hasEnoughSpaceByDestination = await Future.wait( + destinationAlbums.map((destinationAlbum) { + return checkFreeSpaceForMove(context, entries, destinationAlbum, moveType); + }), + ); + if (hasEnoughSpaceByDestination.any((v) => !v)) return false; + + final l10n = context.l10n; + var nameConflictStrategy = NameConflictStrategy.rename; + if (!toBin && destinationAlbums.length == 1) { + final destinationDirectory = Directory(destinationAlbums.single); + final names = [ + ...entries.map((v) => '${v.filenameWithoutExtension}${v.extension}'), + // do not guard up front based on directory existence, + // as conflicts could be within moved entries scattered across multiple albums + if (await destinationDirectory.exists()) ...destinationDirectory.listSync().map((v) => pContext.basename(v.path)), + ].map((v) => v.toLowerCase()).toList(); + // case insensitive comparison + final uniqueNames = names.toSet(); + if (uniqueNames.length < names.length) { + final value = await showDialog<NameConflictStrategy>( + context: context, + builder: (context) => AvesSingleSelectionDialog<NameConflictStrategy>( + initialValue: nameConflictStrategy, + options: Map.fromEntries(NameConflictStrategy.values.map((v) => MapEntry(v, v.getName(context)))), + message: originAlbums.length == 1 ? l10n.nameConflictDialogSingleSourceMessage : l10n.nameConflictDialogMultipleSourceMessage, + confirmationButtonLabel: l10n.continueButtonLabel, + ), + routeSettings: const RouteSettings(name: AvesSingleSelectionDialog.routeName), + ); + if (value == null) return false; + nameConflictStrategy = value; + } + } + + if ({MoveType.move, MoveType.copy, MoveType.toBin}.contains(moveType) && !await _checkUndatedItems(context, entries)) return false; + + final source = context.read<CollectionSource>(); + source.pauseMonitoring(); + final opId = mediaEditService.newOpId; + await showOpReport<MoveOpEvent>( + context: context, + opStream: mediaEditService.move( + opId: opId, + entriesByDestination: entriesByDestination, + copy: copy, + nameConflictStrategy: nameConflictStrategy, + ), + itemCount: todoCount, + onCancel: () => mediaEditService.cancelFileOp(opId), + onDone: (processed) async { + final successOps = processed.where((op) => op.success).toSet(); + + // move + final movedOps = successOps.where((op) => !op.skipped && !op.deleted).toSet(); + final movedEntries = movedOps.map((op) => op.uri).map((uri) => entries.firstWhereOrNull((entry) => entry.uri == uri)).nonNulls.toSet(); + await source.updateAfterMove( + todoEntries: entries, + moveType: moveType, + destinationAlbums: destinationAlbums, + movedOps: movedOps, + ); + + // delete (when trying to move to bin obsolete entries) + final deletedOps = successOps.where((op) => op.deleted).toSet(); + final deletedUris = deletedOps.map((op) => op.uri).toSet(); + await source.removeEntries(deletedUris, includeTrash: true); + + source.resumeMonitoring(); + + // cleanup + if ({MoveType.move, MoveType.toBin}.contains(moveType)) { + await storageService.deleteEmptyRegularDirectories(originAlbums); + } + + final successCount = successOps.length; + if (successCount < todoCount) { + final count = todoCount - successCount; + showFeedback( + context, + FeedbackType.warn, + copy ? l10n.collectionCopyFailureFeedback(count) : l10n.collectionMoveFailureFeedback(count), + ); + } else { + final count = movedOps.length; + final appMode = context.read<ValueNotifier<AppMode>?>()?.value; + + SnackBarAction? action; + if (count > 0 && appMode == AppMode.main) { + // get navigator beforehand because + // local context may be deactivated when action is triggered after navigation + final navigator = Navigator.maybeOf(context); + if (toBin) { + if (movedEntries.isNotEmpty) { + action = SnackBarAction( + label: Themes.asButtonLabel(l10n.entryActionRestore), + onPressed: () { + if (navigator != null) { + doMove( + navigator.context, + moveType: MoveType.fromBin, + entries: movedEntries, + hideShowAction: true, + ); + } + }, + ); + } + } else if (!hideShowAction) { + action = SnackBarAction( + label: l10n.showButtonLabel, + onPressed: () { + if (navigator != null) { + _showMovedItems(navigator.context, destinationAlbums, movedOps); + } + }, + ); + } + } + + if (!toBin || (toBin && settings.confirmAfterMoveToBin)) { + showFeedback( + context, + FeedbackType.info, + copy ? l10n.collectionCopySuccessFeedback(count) : l10n.collectionMoveSuccessFeedback(count), + action, + ); + } + + EntryMovedNotification(moveType, movedEntries).dispatch(context); + onSuccess?.call(); + } + }, + ); + return true; + } + + // ------------------------------------------------------------ + // Move/copy entry set + // ------------------------------------------------------------ + + // returns whether it completed the action (with or without failures) + Future<bool> doMove( + BuildContext context, { + required MoveType moveType, + required Set<AvesEntry> entries, + bool hideShowAction = false, + VoidCallback? onSuccess, + }) async { + if (moveType == MoveType.toBin) { + final l10n = context.l10n; + if (!await showSkippableConfirmationDialog( + context: context, + type: ConfirmationDialog.moveToBin, + message: l10n.binEntriesConfirmationDialogMessage(entries.length), + confirmationButtonLabel: l10n.deleteButtonLabel, + )) { + return false; + } + } + + final entriesByDestination = <String, Set<AvesEntry>>{}; + switch (moveType) { + case MoveType.copy: + case MoveType.move: + case MoveType.export: + final destinationAlbumFilter = await pickAlbum( + context: context, + moveType: moveType, + chipTypes: {AlbumChipType.stored}, + initialGroup: null, + ); + if (destinationAlbumFilter == null || destinationAlbumFilter is! StoredAlbumFilter) return false; + + var destinationAlbum = destinationAlbumFilter.album; + + // ✅ se era solo remoto, crea prima l’album locale via dialog Aves e usa quello + final ensured = await _ensureLocalAlbumForRemoteDestination( + context, + destinationAlbum: destinationAlbum, + ); + if (ensured == null) return false; + destinationAlbum = ensured; + + settings.recentDestinationAlbums = settings.recentDestinationAlbums + ..remove(destinationAlbum) + ..insert(0, destinationAlbum); + + entriesByDestination[destinationAlbum] = entries; + + case MoveType.toBin: + entriesByDestination[AndroidFileUtils.trashDirPath] = entries; + + case MoveType.fromBin: + groupBy<AvesEntry, String?>(entries, (e) => e.directory).forEach((originAlbum, dirEntries) { + if (originAlbum != null) { + entriesByDestination[originAlbum] = dirEntries.toSet(); + } + }); + } + + return await doQuickMove( + context, + moveType: moveType, + entriesByDestination: entriesByDestination, + onSuccess: onSuccess, + ); + } + + // ------------------------------------------------------------ + // Rename + // ------------------------------------------------------------ + + // returns whether it completed the action (with or without failures) + Future<bool> rename( + BuildContext context, { + required Map<AvesEntry, String> entriesToNewName, + required bool persist, + VoidCallback? onSuccess, + }) async { + final entries = entriesToNewName.keys.toSet(); + final todoCount = entries.length; + assert(todoCount > 0); + + if (!await checkStoragePermission(context, entries)) return false; + + if (!await _checkUndatedItems(context, entries)) return false; + + final source = context.read<CollectionSource>(); + source.pauseMonitoring(); + final opId = mediaEditService.newOpId; + await showOpReport<MoveOpEvent>( + context: context, + opStream: mediaEditService.rename( + opId: opId, + entriesToNewName: entriesToNewName, + ), + itemCount: todoCount, + onCancel: () => mediaEditService.cancelFileOp(opId), + onDone: (processed) async { + final successOps = processed.where((op) => op.success).toSet(); + final movedOps = successOps.where((op) => !op.skipped).toSet(); + await source.updateAfterRename( + todoEntries: entries, + movedOps: movedOps, + persist: persist, + ); + source.resumeMonitoring(); + + final l10n = context.l10n; + final successCount = successOps.length; + if (successCount < todoCount) { + final count = todoCount - successCount; + showFeedback(context, FeedbackType.warn, l10n.collectionRenameFailureFeedback(count)); + } else { + final count = movedOps.length; + showFeedback(context, FeedbackType.info, l10n.collectionRenameSuccessFeedback(count)); + onSuccess?.call(); + } + }, + ); + return true; + } + + Future<bool> _checkUndatedItems(BuildContext context, Set<AvesEntry> entries) async { + final undatedItems = entries.where((entry) { + if (!entry.isCatalogued) return false; + final dateMillis = entry.catalogMetadata?.dateMillis; + return dateMillis == null || dateMillis == 0; + }).toSet(); + if (undatedItems.isNotEmpty) { + final confirmationDialogDelegate = MoveUndatedConfirmationDialogDelegate(); + final confirmed = await showSkippableConfirmationDialog( + context: context, + type: ConfirmationDialog.moveUndatedItems, + delegate: confirmationDialogDelegate, + confirmationButtonLabel: context.l10n.continueButtonLabel, + ); + confirmationDialogDelegate.dispose(); + if (!confirmed) return false; + + if (settings.setMetadataDateBeforeFileOp) { + final entriesToDate = undatedItems.where((entry) => entry.canEditDate).toSet(); + if (entriesToDate.isNotEmpty) { + await EntrySetActionDelegate().editDate( + context, + entries: entriesToDate, + modifier: DateModifier.copyField(DateFieldSource.fileModifiedDate), + showResult: false, + ); + } + } + } + return true; + } + + Future<void> _showMovedItems( + BuildContext context, + Set<String> destinationAlbums, + Set<MoveOpEvent> movedOps, + ) async { + final newUris = movedOps.map((op) => op.newFields[EntryFields.uri] as String?).toSet(); + bool highlightTest(AvesEntry entry) => newUris.contains(entry.uri); + + final collection = context.read<CollectionLens?>(); + if (collection == null || collection.filters.any((f) => f is StoredAlbumFilter || f is TrashFilter)) { + final source = context.read<CollectionSource>(); + final targetFilters = collection?.filters.where((f) => f != TrashFilter.instance).toSet() ?? {}; + // we could simply add the filter to the current collection + // but navigating makes the change less jarring + if (destinationAlbums.length == 1) { + final destinationAlbum = destinationAlbums.single; + targetFilters.removeWhere((f) => f is StoredAlbumFilter); + targetFilters.add(StoredAlbumFilter(destinationAlbum, source.getStoredAlbumDisplayName(context, destinationAlbum))); + } + unawaited( + Navigator.maybeOf(context)?.pushAndRemoveUntil( + MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) => CollectionPage( + source: source, + filters: targetFilters, + highlightTest: highlightTest, + ), + ), + (route) => false, + ), + ); + } else { + // track in current page, without navigation + await Future.delayed(ADurations.highlightScrollInitDelay); + final targetEntry = collection.sortedEntries.firstWhereOrNull(highlightTest); + if (targetEntry != null) { + context.read<HighlightInfo>().trackItem(targetEntry, highlightItem: targetEntry); + } + } + } +} + +class MoveUndatedConfirmationDialogDelegate extends ConfirmationDialogDelegate { + final ValueNotifier<bool> _setMetadataDate = ValueNotifier(false); + + MoveUndatedConfirmationDialogDelegate() { + _setMetadataDate.value = settings.setMetadataDateBeforeFileOp; + } + + void dispose() { + _setMetadataDate.dispose(); + } + + @override + List<Widget> build(BuildContext context) => [ + Padding( + padding: const EdgeInsets.all(16) + const EdgeInsets.only(top: 8), + child: Text(context.l10n.moveUndatedConfirmationDialogMessage), + ), + ValueListenableBuilder<bool>( + valueListenable: _setMetadataDate, + builder: (context, flag, child) => SwitchListTile( + value: flag, + onChanged: (v) => _setMetadataDate.value = v, + title: Text(context.l10n.moveUndatedConfirmationDialogSetDate), + ), + ), + ]; + + @override + void apply() => settings.setMetadataDateBeforeFileOp = _setMetadataDate.value; +} diff --git a/lib/widgets/common/action_mixins/feedback.dart b/lib/widgets/common/action_mixins/feedback.dart new file mode 100644 index 0000000..3666f08 --- /dev/null +++ b/lib/widgets/common/action_mixins/feedback.dart @@ -0,0 +1,536 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/model/settings/enums/accessibility_timeout.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/action_mixins/overlay_snack_bar.dart'; +import 'package:aves/widgets/common/basic/circle.dart'; +import 'package:aves/widgets/common/basic/text/change_highlight.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:overlay_support/overlay_support.dart'; +import 'package:percent_indicator/circular_percent_indicator.dart'; +import 'package:provider/provider.dart'; + +enum FeedbackType { info, warn } + +typedef MarginComputer = EdgeInsets Function(BuildContext context); + +mixin FeedbackMixin { + static final ValueNotifier<MarginComputer?> snackBarMarginOverrideNotifier = ValueNotifier(null); + static OverlaySupportEntry? _overlayNotificationEntry; + + static EdgeInsets snackBarMarginDefault(BuildContext context) { + return EdgeInsets.only( + bottom: context.select<MediaQueryData, double>((mq) => max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom)), + ); + } + + void dismissFeedback(BuildContext context) { + ScaffoldMessenger.of(context).hideCurrentSnackBar(); + _overlayNotificationEntry?.dismiss(); + _overlayNotificationEntry = null; + } + + void showFeedback(BuildContext context, FeedbackType type, String message, [SnackBarAction? action]) { + ScaffoldMessengerState? scaffoldMessenger; + try { + scaffoldMessenger = ScaffoldMessenger.of(context); + } catch (error) { + // minor issue: the page triggering this feedback likely + // allows the user to navigate away and they did so + debugPrint('failed to find ScaffoldMessenger in context'); + } + if (scaffoldMessenger != null) { + showFeedbackWithMessenger(context, scaffoldMessenger, type, message, action); + } + } + + // provide the messenger if feedback happens as the widget is disposed + void showFeedbackWithMessenger(BuildContext context, ScaffoldMessengerState messenger, FeedbackType type, String message, [SnackBarAction? action]) { + settings.timeToTakeAction.getSnackBarDuration(action != null).then((duration) { + final start = DateTime.now(); + final theme = Theme.of(context); + final snackBarTheme = theme.snackBarTheme; + + final snackBarContent = _FeedbackMessage( + type: type, + message: message, + progressColor: theme.colorScheme.primary, + start: start, + stop: action != null ? start.add(duration) : null, + ); + + if (snackBarMarginOverrideNotifier.value != null) { + // as of Flutter v2.10.4, `SnackBar` can only be positioned at the bottom, + // and space under the snack bar `margin` does not receive gestures + // (because it is used by the `Dismissible` wrapping the snack bar) + // so we use `showOverlayNotification` instead + _overlayNotificationEntry = showOverlayNotification( + (context) => SafeArea( + bottom: false, + child: ValueListenableBuilder<MarginComputer?>( + valueListenable: snackBarMarginOverrideNotifier, + builder: (context, marginComputer, child) { + final margin = (marginComputer ?? snackBarMarginDefault).call(context); + return AnimatedPadding( + padding: margin, + duration: ADurations.pageTransitionLoose, + child: child, + ); + }, + child: OverlaySnackBar( + content: snackBarContent, + action: action != null + ? TextButton( + style: ButtonStyle( + foregroundColor: WidgetStateProperty.all(snackBarTheme.actionTextColor), + ), + onPressed: () { + dismissFeedback(context); + action.onPressed(); + }, + child: Text(action.label), + ) + : null, + animation: kAlwaysCompleteAnimation, + dismissDirection: DismissDirection.horizontal, + onDismiss: () => dismissFeedback(context), + ), + ), + ), + duration: duration, + // reuse the same key to dismiss previous snack bar when a new one is shown + key: const Key('snack'), + position: NotificationPosition.bottom, + context: context, + ); + } else { + messenger.showSnackBar( + SnackBar( + content: snackBarContent, + padding: action != null ? EdgeInsetsDirectional.only(start: snackBarHorizontalPadding(snackBarTheme)) : null, + action: action, + duration: duration, + dismissDirection: DismissDirection.horizontal, + ), + ); + } + }); + } + + static double snackBarHorizontalPadding(SnackBarThemeData snackBarTheme) { + final isFloatingSnackBar = (snackBarTheme.behavior ?? SnackBarBehavior.fixed) == SnackBarBehavior.floating; + final double horizontalPadding = isFloatingSnackBar ? 16.0 : 24.0; + return horizontalPadding; + } + + // report overlay for multiple operations + + Future<void> showOpReport<T>({ + required BuildContext context, + required Stream<T> opStream, + int? itemCount, + VoidCallback? onCancel, + Future<void> Function(Set<T> processed)? onDone, + }) async { + final opCompleter = Completer(); + await showDialog( + context: context, + barrierDismissible: false, + builder: (context) => ReportOverlay<T>( + opStream: opStream, + itemCount: itemCount, + onCancel: onCancel, + onDone: (processed) async { + Navigator.maybeOf(context)?.pop(); + await onDone?.call(processed); + opCompleter.complete(); + }, + ), + routeSettings: const RouteSettings(name: ReportOverlay.routeName), + ); + return opCompleter.future; + } +} + +class ReportOverlay<T> extends StatefulWidget { + static const routeName = '/dialog/report_overlay'; + + final Stream<T> opStream; + final int? itemCount; + final VoidCallback? onCancel; + final void Function(Set<T> processed) onDone; + + static const double diameter = 160.0; + static const double strokeWidth = 8.0; + + const ReportOverlay({ + super.key, + required this.opStream, + required this.itemCount, + required this.onCancel, + required this.onDone, + }); + + @override + State<ReportOverlay<T>> createState() => _ReportOverlayState<T>(); +} + +class _ReportOverlayState<T> extends State<ReportOverlay<T>> with SingleTickerProviderStateMixin { + final processed = <T>{}; + late AnimationController _animationController; + late CurvedAnimation _animation; + + Stream<T> get opStream => widget.opStream; + + static const double fontSize = 18.0; + + @override + void initState() { + super.initState(); + + _animationController = AnimationController( + duration: ADurations.collectionOpOverlayAnimation, + vsync: this, + ); + _animation = CurvedAnimation( + parent: _animationController, + curve: Curves.easeOutQuad, + ); + _animationController.forward(); + + // do not handle completion inside `StreamBuilder` + // as it could be called multiple times + Future<void> onComplete() => _animationController.reverse().then((_) => widget.onDone(processed)); + opStream.listen( + processed.add, + onError: (error) => debugPrint('_showOpReport error=$error'), + onDone: onComplete, + ); + } + + @override + void dispose() { + _animation.dispose(); + _animationController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + const diameter = ReportOverlay.diameter; + const strokeWidth = ReportOverlay.strokeWidth; + final percentFormatter = NumberFormat.percentPattern(context.locale); + + final theme = Theme.of(context); + final colorScheme = theme.colorScheme; + final progressColor = colorScheme.primary; + final animate = context.select<Settings, bool>((v) => v.animate); + return PopScope( + canPop: false, + child: StreamBuilder<T>( + stream: opStream, + builder: (context, snapshot) { + final processedCount = processed.length.toDouble(); + final total = widget.itemCount; + final percent = total == null || total == 0 ? 0.0 : min(1.0, processedCount / total); + return FadeTransition( + opacity: _animation, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + width: diameter + 2, + height: diameter + 2, + decoration: BoxDecoration( + color: theme.isDark ? const Color(0xBB000000) : const Color(0xEEFFFFFF), + shape: BoxShape.circle, + ), + ), + if (animate) const ReportProgressIndicator(opacity: .1), + CircularPercentIndicator( + percent: percent, + lineWidth: strokeWidth, + radius: diameter / 2, + backgroundColor: colorScheme.onSurface.withValues(alpha: .2), + progressColor: progressColor, + animation: animate, + center: total != null + ? Text( + percentFormatter.format(percent), + style: const TextStyle(fontSize: fontSize), + ) + : null, + animateFromLastPercent: true, + ), + if (widget.onCancel != null) + Material( + color: Colors.transparent, + child: Container( + width: diameter, + height: diameter, + margin: const EdgeInsets.only(top: fontSize), + alignment: const FractionalOffset(0.5, 0.75), + child: Tooltip( + message: context.l10n.cancelTooltip, + preferBelow: false, + child: IconButton( + icon: const Icon(AIcons.cancel), + onPressed: widget.onCancel, + ), + ), + ), + ), + ], + ), + ); + }, + ), + ); + } +} + +class ReportProgressIndicator extends StatelessWidget { + final double opacity; + + const ReportProgressIndicator({ + super.key, + this.opacity = 1, + }); + + @override + Widget build(BuildContext context) { + const diameter = ReportOverlay.diameter; + const strokeWidth = ReportOverlay.strokeWidth; + final progressColor = Theme.of(context).colorScheme.primary; + + return Container( + width: diameter, + height: diameter, + padding: const EdgeInsets.all(strokeWidth / 2), + child: CircularProgressIndicator( + color: progressColor.withValues(alpha: opacity), + strokeWidth: strokeWidth, + ), + ); + } +} + +class _FeedbackMessage extends StatefulWidget { + final FeedbackType type; + final String message; + final DateTime? start, stop; + final Color progressColor; + + const _FeedbackMessage({ + required this.type, + required this.message, + required this.progressColor, + this.start, + this.stop, + }); + + @override + State<_FeedbackMessage> createState() => _FeedbackMessageState(); +} + +class _FeedbackMessageState extends State<_FeedbackMessage> with SingleTickerProviderStateMixin { + AnimationController? _animationController; + CurvedAnimation? _animation; + Animation<int>? _remainingDurationMillis; + int? _totalDurationMillis; + + @override + void initState() { + super.initState(); + final start = widget.start; + final stop = widget.stop; + if (start != null && stop != null) { + _totalDurationMillis = stop.difference(start).inMilliseconds; + final remainingDuration = stop.difference(DateTime.now()); + final effectiveDuration = remainingDuration > Duration.zero ? remainingDuration : const Duration(milliseconds: 1); + _animationController = AnimationController( + duration: effectiveDuration, + vsync: this, + ); + _animation = CurvedAnimation( + parent: _animationController!, + curve: Curves.linear, + ); + _remainingDurationMillis = IntTween( + begin: effectiveDuration.inMilliseconds, + end: 0, + ).animate(_animation!); + _animationController!.forward(); + } + } + + @override + void dispose() { + _animation?.dispose(); + _animationController?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final durationFormatter = NumberFormat('0', context.locale); + + final textScaler = MediaQuery.textScalerOf(context); + final theme = Theme.of(context); + final colorScheme = theme.colorScheme; + final contentTextStyle = + theme.snackBarTheme.contentTextStyle ?? + theme.textTheme.bodyMedium!.copyWith( + color: colorScheme.onInverseSurface, + ); + final contentTextFontSize = contentTextStyle.fontSize ?? theme.textTheme.bodyMedium!.fontSize!; + final timerChangeShadowColor = colorScheme.primary; + + final remainingDurationAnimation = _remainingDurationMillis; + return Row( + children: [ + if (widget.type == FeedbackType.warn) ...[ + CustomPaint( + painter: const _WarnIndicator(AColors.warning), + size: Size(4, textScaler.scale(contentTextFontSize)), + ), + const SizedBox(width: 8), + ], + Expanded(child: Text(widget.message)), + if (remainingDurationAnimation != null) ...[ + const SizedBox(width: 16), + AnimatedBuilder( + animation: remainingDurationAnimation, + builder: (context, child) { + final remainingDurationMillis = remainingDurationAnimation.value; + final totalDurationMillis = _totalDurationMillis; + return CircularIndicator( + radius: 16, + lineWidth: 2, + percent: totalDurationMillis != null && totalDurationMillis > 0 ? remainingDurationMillis / totalDurationMillis : 0, + background: Colors.grey, + // progress color is provided by the caller, + // because we cannot use the app context theme here + foreground: widget.progressColor, + center: ChangeHighlightText( + durationFormatter.format((remainingDurationMillis / 1000).ceil()), + style: contentTextStyle.copyWith( + shadows: [ + Shadow( + color: timerChangeShadowColor.withAlpha(0), + blurRadius: 0, + ), + ], + ), + changedStyle: contentTextStyle.copyWith( + shadows: [ + Shadow( + color: timerChangeShadowColor, + blurRadius: 5, + ), + ], + ), + duration: context.read<DurationsData>().formTextStyleTransition, + ), + ); + }, + ), + ], + ], + ); + } +} + +class _WarnIndicator extends CustomPainter { + final Color color; + + const _WarnIndicator(this.color); + + @override + void paint(Canvas canvas, Size size) { + canvas.drawRRect( + RRect.fromLTRBR(0, 0, size.width, size.height, Radius.circular(size.shortestSide / 2)), + Paint() + ..style = PaintingStyle.fill + ..color = color, + ); + } + + @override + bool shouldRepaint(_WarnIndicator oldDelegate) => false; +} + +class ActionFeedback extends StatefulWidget { + final Widget? child; + + const ActionFeedback({ + super.key, + required this.child, + }); + + @override + State<ActionFeedback> createState() => _ActionFeedbackState(); +} + +class _ActionFeedbackState extends State<ActionFeedback> with SingleTickerProviderStateMixin { + late final AnimationController _animationController; + + @override + void initState() { + super.initState(); + _animationController = AnimationController( + duration: ADurations.viewerActionFeedbackAnimation, + vsync: this, + ); + } + + @override + void didUpdateWidget(covariant ActionFeedback oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.child != widget.child) { + _animationController.reset(); + if (widget.child != null) { + _animationController.forward(); + } + } + } + + @override + void dispose() { + _animationController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return IgnorePointer( + child: Center( + child: AnimatedBuilder( + animation: _animationController, + builder: (context, child) { + final t = _animationController.value; + final opacity = Curves.easeOutQuad.transform(t > .5 ? (1 - t) * 2 : t * 2); + final scale = Curves.slowMiddle.transform(t) * 2; + return Opacity( + opacity: opacity, + child: Transform.scale( + scale: scale, + child: child, + ), + ); + }, + child: widget.child, + ), + ), + ); + } +} diff --git a/lib/widgets/common/action_mixins/overlay_snack_bar.dart b/lib/widgets/common/action_mixins/overlay_snack_bar.dart new file mode 100644 index 0000000..3ae98f9 --- /dev/null +++ b/lib/widgets/common/action_mixins/overlay_snack_bar.dart @@ -0,0 +1,431 @@ +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:flutter/material.dart'; + +// adapted from Flutter `SnackBar` in `/material/snack_bar.dart` + +// As of Flutter v3.23.0, `SnackBar` is not customizable enough to add margin +// and ignore pointers in that area, so we use an overlay entry instead. +// This overlay entry is not under a `Scaffold` (which is expected by `SnackBar` +// and `SnackBarAction`), and is not dismissed the same way. + +const double _singleLineVerticalPadding = 14.0; +const Duration _snackBarDisplayDuration = Duration(milliseconds: 4000); +const Curve _snackBarHeightCurve = Curves.fastOutSlowIn; +const Curve _snackBarM3HeightCurve = Curves.easeInOutQuart; + +const Curve _snackBarFadeInCurve = Interval(0.4, 1.0); +const Curve _snackBarM3FadeInCurve = Interval(0.4, 0.6, curve: Curves.easeInCirc); +const Curve _snackBarFadeOutCurve = Interval(0.72, 1.0, curve: Curves.fastOutSlowIn); + +class OverlaySnackBar extends StatefulWidget { + final Widget content; + final Color? backgroundColor; + final double? elevation; + final EdgeInsetsGeometry? margin; + final EdgeInsetsGeometry? padding; + final double? width; + final ShapeBorder? shape; + final HitTestBehavior? hitTestBehavior; + final SnackBarBehavior? behavior; + final Widget? action; + final double? actionOverflowThreshold; + final bool? showCloseIcon; + final Color? closeIconColor; + final Duration duration; + final Animation<double>? animation; + final VoidCallback? onVisible; + final DismissDirection dismissDirection; + final Clip clipBehavior; + final VoidCallback onDismiss; + + const OverlaySnackBar({ + super.key, + required this.content, + this.backgroundColor, + this.elevation, + this.margin, + this.padding, + this.width, + this.shape, + this.hitTestBehavior, + this.behavior, + this.action, + this.actionOverflowThreshold, + this.showCloseIcon, + this.closeIconColor, + this.duration = _snackBarDisplayDuration, + this.animation, + this.onVisible, + this.dismissDirection = DismissDirection.down, + this.clipBehavior = Clip.hardEdge, + required this.onDismiss, + }) : assert(elevation == null || elevation >= 0.0), + assert( + width == null || margin == null, + 'Width and margin can not be used together', + ), + assert(actionOverflowThreshold == null || (actionOverflowThreshold >= 0 && actionOverflowThreshold <= 1), 'Action overflow threshold must be between 0 and 1 inclusive'); + + @override + State<OverlaySnackBar> createState() => _OverlaySnackBarState(); +} + +class _OverlaySnackBarState extends State<OverlaySnackBar> { + bool _wasVisible = false; + + CurvedAnimation? _heightAnimation; + CurvedAnimation? _fadeInAnimation; + CurvedAnimation? _fadeInM3Animation; + CurvedAnimation? _fadeOutAnimation; + CurvedAnimation? _heightM3Animation; + + @override + void initState() { + super.initState(); + widget.animation!.addStatusListener(_onAnimationStatusChanged); + _setAnimations(); + } + + @override + void didUpdateWidget(OverlaySnackBar oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.animation != oldWidget.animation) { + oldWidget.animation!.removeStatusListener(_onAnimationStatusChanged); + widget.animation!.addStatusListener(_onAnimationStatusChanged); + _disposeAnimations(); + _setAnimations(); + } + } + + void _setAnimations() { + assert(widget.animation != null); + _heightAnimation = CurvedAnimation(parent: widget.animation!, curve: _snackBarHeightCurve); + _fadeInAnimation = CurvedAnimation(parent: widget.animation!, curve: _snackBarFadeInCurve); + _fadeInM3Animation = CurvedAnimation(parent: widget.animation!, curve: _snackBarM3FadeInCurve); + _fadeOutAnimation = CurvedAnimation( + parent: widget.animation!, + curve: _snackBarFadeOutCurve, + reverseCurve: const Threshold(0.0), + ); + // Material 3 Animation has a height animation on entry, but a direct fade out on exit. + _heightM3Animation = CurvedAnimation( + parent: widget.animation!, + curve: _snackBarM3HeightCurve, + reverseCurve: const Threshold(0.0), + ); + } + + void _disposeAnimations() { + _heightAnimation?.dispose(); + _fadeInAnimation?.dispose(); + _fadeInM3Animation?.dispose(); + _fadeOutAnimation?.dispose(); + _heightM3Animation?.dispose(); + _heightAnimation = null; + _fadeInAnimation = null; + _fadeInM3Animation = null; + _fadeOutAnimation = null; + _heightM3Animation = null; + } + + @override + void dispose() { + widget.animation!.removeStatusListener(_onAnimationStatusChanged); + _disposeAnimations(); + super.dispose(); + } + + void _onAnimationStatusChanged(AnimationStatus status) { + if (status.isCompleted) { + if (widget.onVisible != null && !_wasVisible) { + widget.onVisible!(); + } + _wasVisible = true; + } + } + + @override + Widget build(BuildContext context) { + assert(debugCheckHasMediaQuery(context)); + final bool accessibleNavigation = MediaQuery.accessibleNavigationOf(context); + assert(widget.animation != null); + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + final SnackBarThemeData snackBarTheme = theme.snackBarTheme; + final bool isThemeDark = theme.isDark; + final Color buttonColor = isThemeDark ? colorScheme.primary : colorScheme.secondary; + final SnackBarThemeData defaults = _SnackbarDefaultsM3(context); + + // SnackBar uses a theme that is the opposite brightness from + // the surrounding theme. + final Brightness brightness = isThemeDark ? Brightness.light : Brightness.dark; + + // Invert the theme values for Material 2. Material 3 values are tokenized to pre-inverted values. + final ThemeData effectiveTheme = theme.useMaterial3 + ? theme + : theme.copyWith( + colorScheme: ColorScheme( + primary: colorScheme.onPrimary, + secondary: buttonColor, + surface: colorScheme.onSurface, + error: colorScheme.onError, + onPrimary: colorScheme.primary, + onSecondary: colorScheme.secondary, + onSurface: colorScheme.surface, + onError: colorScheme.error, + brightness: brightness, + ), + ); + + final TextStyle? contentTextStyle = snackBarTheme.contentTextStyle ?? defaults.contentTextStyle; + final SnackBarBehavior snackBarBehavior = widget.behavior ?? snackBarTheme.behavior ?? defaults.behavior!; + final double? width = widget.width ?? snackBarTheme.width; + assert(() { + // Whether the behavior is set through the constructor or the theme, + // assert that our other properties are configured properly. + if (snackBarBehavior != SnackBarBehavior.floating) { + String message(String parameter) { + final String prefix = '$parameter can only be used with floating behavior.'; + if (widget.behavior != null) { + return '$prefix SnackBarBehavior.fixed was set in the SnackBar constructor.'; + } else if (snackBarTheme.behavior != null) { + return '$prefix SnackBarBehavior.fixed was set by the inherited SnackBarThemeData.'; + } else { + return '$prefix SnackBarBehavior.fixed was set by default.'; + } + } + + assert(widget.margin == null, message('Margin')); + assert(width == null, message('Width')); + } + return true; + }()); + + final bool showCloseIcon = widget.showCloseIcon ?? snackBarTheme.showCloseIcon ?? defaults.showCloseIcon!; + + final bool isFloatingSnackBar = snackBarBehavior == SnackBarBehavior.floating; + final double horizontalPadding = isFloatingSnackBar ? 16.0 : 24.0; + final EdgeInsetsGeometry padding = widget.padding ?? EdgeInsetsDirectional.only(start: horizontalPadding, end: widget.action != null || showCloseIcon ? 0 : horizontalPadding); + + final double iconHorizontalMargin = (widget.padding?.resolve(TextDirection.ltr).right ?? horizontalPadding) / 12.0; + + final IconButton? iconButton = showCloseIcon + ? IconButton( + icon: const Icon(Icons.close), + iconSize: 24, + color: widget.closeIconColor ?? snackBarTheme.closeIconColor ?? defaults.closeIconColor, + onPressed: () => ScaffoldMessenger.of(context).hideCurrentSnackBar(reason: SnackBarClosedReason.dismiss), + tooltip: MaterialLocalizations.of(context).closeButtonTooltip, + ) + : null; + + final EdgeInsets margin = widget.margin?.resolve(TextDirection.ltr) ?? snackBarTheme.insetPadding ?? defaults.insetPadding!; + + Widget snackBar = Padding( + padding: padding, + child: Row( + children: <Widget>[ + Expanded( + child: Container( + padding: widget.action != null ? null : const EdgeInsets.symmetric(vertical: _singleLineVerticalPadding), + child: DefaultTextStyle( + style: contentTextStyle!, + child: widget.content, + ), + ), + ), + if (widget.action != null) + TextButtonTheme( + data: TextButtonThemeData( + style: TextButton.styleFrom( + foregroundColor: buttonColor, + padding: EdgeInsets.symmetric(horizontal: horizontalPadding), + ), + ), + child: widget.action!, + ), + if (showCloseIcon) + Padding( + padding: EdgeInsets.symmetric(horizontal: iconHorizontalMargin), + child: iconButton, + ), + ], + ), + ); + + if (!isFloatingSnackBar) { + snackBar = SafeArea( + top: false, + child: snackBar, + ); + } + + final double elevation = widget.elevation ?? snackBarTheme.elevation ?? defaults.elevation!; + final Color backgroundColor = widget.backgroundColor ?? snackBarTheme.backgroundColor ?? defaults.backgroundColor!; + final ShapeBorder? shape = widget.shape ?? snackBarTheme.shape ?? (isFloatingSnackBar ? defaults.shape : null); + + snackBar = Material( + shape: shape, + elevation: elevation, + color: backgroundColor, + clipBehavior: widget.clipBehavior, + child: Theme( + data: effectiveTheme, + child: accessibleNavigation || theme.useMaterial3 + ? snackBar + : FadeTransition( + opacity: _fadeOutAnimation!, + child: snackBar, + ), + ), + ); + + if (isFloatingSnackBar) { + // If width is provided, do not include horizontal margins. + if (width != null) { + snackBar = Container( + margin: EdgeInsets.only(top: margin.top, bottom: margin.bottom), + width: width, + child: snackBar, + ); + } else { + snackBar = Padding( + padding: margin, + child: snackBar, + ); + } + snackBar = SafeArea( + top: false, + bottom: false, + child: snackBar, + ); + } + + snackBar = Semantics( + container: true, + liveRegion: true, + onDismiss: widget.onDismiss, + child: Dismissible( + key: const Key('dismissible'), + direction: widget.dismissDirection, + resizeDuration: null, + behavior: widget.hitTestBehavior ?? (widget.margin != null || snackBarTheme.insetPadding != null ? HitTestBehavior.deferToChild : HitTestBehavior.opaque), + onDismissed: (direction) => widget.onDismiss(), + child: snackBar, + ), + ); + + final Widget snackBarTransition; + if (accessibleNavigation) { + snackBarTransition = snackBar; + } else if (isFloatingSnackBar && !theme.useMaterial3) { + snackBarTransition = FadeTransition( + opacity: _fadeInAnimation!, + child: snackBar, + ); + // Is Material 3 Floating Snack Bar. + } else if (isFloatingSnackBar && theme.useMaterial3) { + snackBarTransition = FadeTransition( + opacity: _fadeInM3Animation!, + child: ValueListenableBuilder<double>( + valueListenable: _heightM3Animation!, + builder: (context, value, child) { + return Align( + alignment: Alignment.bottomLeft, + heightFactor: value, + child: child, + ); + }, + child: snackBar, + ), + ); + } else { + snackBarTransition = ValueListenableBuilder<double>( + valueListenable: _heightAnimation!, + builder: (context, value, child) { + return Align( + alignment: AlignmentDirectional.topStart, + heightFactor: value, + child: child, + ); + }, + child: snackBar, + ); + } + + return Hero( + tag: '<SnackBar Hero tag - ${widget.content}>', + transitionOnUserGestures: true, + child: ClipRect( + clipBehavior: widget.clipBehavior, + child: snackBarTransition, + ), + ); + } +} + +// BEGIN GENERATED TOKEN PROPERTIES - Snackbar + +// Do not edit by hand. The code between the "BEGIN GENERATED" and +// "END GENERATED" comments are generated from data in the Material +// Design token database by the script: +// dev/tools/gen_defaults/bin/gen_defaults.dart. + +class _SnackbarDefaultsM3 extends SnackBarThemeData { + _SnackbarDefaultsM3(this.context); + + final BuildContext context; + late final ThemeData _theme = Theme.of(context); + late final ColorScheme _colors = _theme.colorScheme; + + @override + Color get backgroundColor => _colors.inverseSurface; + + @override + Color get actionTextColor => WidgetStateColor.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return _colors.inversePrimary; + } + if (states.contains(WidgetState.pressed)) { + return _colors.inversePrimary; + } + if (states.contains(WidgetState.hovered)) { + return _colors.inversePrimary; + } + if (states.contains(WidgetState.focused)) { + return _colors.inversePrimary; + } + return _colors.inversePrimary; + }); + + @override + Color get disabledActionTextColor => _colors.inversePrimary; + + @override + TextStyle get contentTextStyle => Theme.of(context).textTheme.bodyMedium!.copyWith( + color: _colors.onInverseSurface, + ); + + @override + double get elevation => 6.0; + + @override + ShapeBorder get shape => const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(4.0))); + + @override + SnackBarBehavior get behavior => SnackBarBehavior.fixed; + + @override + EdgeInsets get insetPadding => const EdgeInsets.fromLTRB(15.0, 5.0, 15.0, 10.0); + + @override + bool get showCloseIcon => false; + + @override + Color? get closeIconColor => _colors.onInverseSurface; + + @override + double get actionOverflowThreshold => 0.25; +} + +// END GENERATED TOKEN PROPERTIES - Snackbar diff --git a/lib/widgets/common/action_mixins/permission_aware.dart b/lib/widgets/common/action_mixins/permission_aware.dart new file mode 100644 index 0000000..f3a749d --- /dev/null +++ b/lib/widgets/common/action_mixins/permission_aware.dart @@ -0,0 +1,102 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +mixin PermissionAwareMixin { + Future<bool> checkStoragePermission(BuildContext context, Set<AvesEntry> entries) { + final storageDirs = entries.map((e) => e.storageDirectory).nonNulls.toSet(); + return checkStoragePermissionForAlbums(context, storageDirs, entries: entries); + } + + Future<bool> checkStoragePermissionForAlbums(BuildContext context, Set<String> storageDirs, {Set<AvesEntry>? entries}) async { + final restrictedDirsLowerCase = await storageService.getRestrictedDirectoriesLowerCase(); + while (true) { + final inaccessibleDirs = await storageService.getInaccessibleDirectories(storageDirs); + + final restrictedInaccessibleDirsLowerCase = inaccessibleDirs + .map( + (dir) => dir.copyWith( + relativeDir: dir.relativeDir.toLowerCase(), + ), + ) + .where(restrictedDirsLowerCase.contains) + .toSet(); + if (restrictedInaccessibleDirsLowerCase.isNotEmpty) { + if (entries != null && await storageService.canRequestMediaFileBulkAccess()) { + // request media file access for items in restricted directories + final uris = <String>[], mimeTypes = <String>[]; + entries + .where((entry) { + final dirPath = entry.directory; + if (dirPath == null) return false; + final dir = androidFileUtils.relativeDirectoryFromPath(dirPath); + return restrictedInaccessibleDirsLowerCase.contains(dir?.copyWith(relativeDir: dir.relativeDir.toLowerCase())); + }) + .forEach((entry) { + uris.add(entry.uri); + mimeTypes.add(entry.mimeType); + }); + final granted = await storageService.requestMediaFileAccess(uris, mimeTypes); + if (!granted) return false; + } else if (entries == null && await storageService.canInsertMedia(restrictedInaccessibleDirsLowerCase)) { + // insertion in restricted directories + } else { + // cannot proceed further + await showRestrictedDirectoryDialog(context, restrictedInaccessibleDirsLowerCase.first); + return false; + } + // clear restricted directories + inaccessibleDirs.removeWhere((dir) => restrictedInaccessibleDirsLowerCase.contains(dir.copyWith(relativeDir: dir.relativeDir.toLowerCase()))); + } + + if (inaccessibleDirs.isEmpty) return true; + + // abort if the user cancels in Flutter + final l10n = context.l10n; + final dir = inaccessibleDirs.first; + final directoryName = dir.relativeDir.isEmpty ? l10n.rootDirectoryDescription : l10n.otherDirectoryDescription(dir.relativeDir); + final volume = dir.getVolumeDescription(context); + if (!await showConfirmationDialog( + context: context, + message: l10n.storageAccessDialogMessage(directoryName, volume), + )) { + return false; + } + + if (!await _checkSystemFilePickerEnabled(context)) return false; + + final granted = await storageService.requestDirectoryAccess(dir.dirPath); + if (!granted) { + // abort if the user denies access from the native dialog + return false; + } + } + } + + Future<void> showRestrictedDirectoryDialog(BuildContext context, VolumeRelativeDirectory dir) { + final l10n = context.l10n; + final directory = dir.relativeDir.isEmpty ? l10n.rootDirectoryDescription : l10n.otherDirectoryDescription(dir.relativeDir); + final volume = dir.getVolumeDescription(context); + return showWarningDialog( + context: context, + message: l10n.restrictedAccessDialogMessage(directory, volume), + ); + } + + Future<bool> _checkSystemFilePickerEnabled(BuildContext context) async { + if (await deviceService.isSystemFilePickerEnabled()) return true; + + await showWarningDialog( + context: context, + message: context.l10n.missingSystemFilePickerDialogMessage, + ); + return false; + } +} diff --git a/lib/widgets/common/action_mixins/size_aware.dart b/lib/widgets/common/action_mixins/size_aware.dart new file mode 100644 index 0000000..00db93d --- /dev/null +++ b/lib/widgets/common/action_mixins/size_aware.dart @@ -0,0 +1,86 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +mixin SizeAwareMixin { + Future<bool> checkFreeSpaceForMove( + BuildContext context, + Set<AvesEntry> selection, + String destinationAlbum, + MoveType moveType, + ) async { + if (moveType == MoveType.toBin) return true; + + // assume we have enough space if we cannot find the volume or its remaining free space + final destinationVolume = androidFileUtils.getStorageVolume(destinationAlbum); + if (destinationVolume == null) return true; + + final free = await storageService.getFreeSpace(destinationVolume); + if (free == null) return true; + + late int needed; + int sumSize(int sum, AvesEntry entry) => sum + (entry.sizeBytes ?? 0); + switch (moveType) { + case MoveType.copy: + case MoveType.export: + needed = selection.fold(0, sumSize); + case MoveType.move: + case MoveType.toBin: + case MoveType.fromBin: + // when moving, we only need space for the entries that are not already on the destination volume + final byVolume = groupBy<AvesEntry, StorageVolume?>(selection, (entry) => androidFileUtils.getStorageVolume(entry.path)).whereNotNullKey(); + final otherVolumes = byVolume.keys.where((volume) => volume != destinationVolume); + final fromOtherVolumes = otherVolumes.fold<int>(0, (sum, volume) => sum + byVolume[volume]!.fold(0, sumSize)); + // and we need at least as much space as the largest entry because individual entries are copied then deleted + final largestSingle = selection.fold<int>(0, (largest, entry) => max(largest, entry.sizeBytes ?? 0)); + needed = max(fromOtherVolumes, largestSingle); + } + + final hasEnoughSpace = needed < free; + if (!hasEnoughSpace) { + await _showNotEnoughSpaceDialog(context, needed, free, destinationVolume); + } + return hasEnoughSpace; + } + + Future<bool> checkFreeSpace( + BuildContext context, + int needed, + String destinationAlbum, + ) async { + // assume we have enough space if we cannot find the volume or its remaining free space + final destinationVolume = androidFileUtils.getStorageVolume(destinationAlbum); + if (destinationVolume == null) return true; + + final free = await storageService.getFreeSpace(destinationVolume); + if (free == null) return true; + + final hasEnoughSpace = needed < free; + if (!hasEnoughSpace) { + await _showNotEnoughSpaceDialog(context, needed, free, destinationVolume); + } + return hasEnoughSpace; + } + + Future<void> _showNotEnoughSpaceDialog(BuildContext context, int needed, int free, StorageVolume destinationVolume) async { + final locale = context.locale; + final neededSize = formatFileSize(locale, needed); + final freeSize = formatFileSize(locale, free); + final volume = destinationVolume.getDescription(context); + await showWarningDialog( + context: context, + message: context.l10n.notEnoughSpaceDialogMessage(neededSize, freeSize, volume), + ); + } +} diff --git a/lib/widgets/common/action_mixins/vault_aware.dart b/lib/widgets/common/action_mixins/vault_aware.dart new file mode 100644 index 0000000..0e7cfb8 --- /dev/null +++ b/lib/widgets/common/action_mixins/vault_aware.dart @@ -0,0 +1,142 @@ +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/vaults/details.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/filter_editors/password_dialog.dart'; +import 'package:aves/widgets/dialogs/filter_editors/pattern_dialog.dart'; +import 'package:aves/widgets/dialogs/filter_editors/pin_dialog.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:local_auth/local_auth.dart'; + +mixin VaultAwareMixin on FeedbackMixin { + Future<bool> _tryUnlock(BuildContext context, String dirPath) async { + if (!vaults.isVault(dirPath) || !vaults.isLocked(dirPath)) return true; + + final details = vaults.detailsForPath(dirPath); + if (details == null) return false; + + bool? confirmed; + switch (details.lockType) { + case VaultLockType.system: + try { + confirmed = await LocalAuthentication().authenticate( + localizedReason: context.l10n.authenticateToUnlockVault, + ); + } on PlatformException catch (e, stack) { + if (!{'auth_in_progress', 'NotAvailable'}.contains(e.code)) { + // `auth_in_progress`: `Authentication in progress` + // `NotAvailable`: `Required security features not enabled` + await reportService.recordError(e, stack); + } + } + case VaultLockType.pattern: + final pattern = await showDialog<String>( + context: context, + builder: (context) => const PatternDialog(needConfirmation: false), + routeSettings: const RouteSettings(name: PatternDialog.routeName), + ); + if (pattern != null) { + confirmed = pattern == await securityService.readValue(details.passKey); + } + case VaultLockType.pin: + final pin = await showDialog<String>( + context: context, + builder: (context) => const PinDialog(needConfirmation: false), + routeSettings: const RouteSettings(name: PinDialog.routeName), + ); + if (pin != null) { + confirmed = pin == await securityService.readValue(details.passKey); + } + case VaultLockType.password: + final password = await showDialog<String>( + context: context, + builder: (context) => const PasswordDialog(needConfirmation: false), + routeSettings: const RouteSettings(name: PasswordDialog.routeName), + ); + if (password != null) { + confirmed = password == await securityService.readValue(details.passKey); + } + } + + if (confirmed == null || !confirmed) return false; + + await vaults.unlock(context, dirPath); + return true; + } + + Future<bool> unlockAlbum(BuildContext context, String dirPath) async { + final success = await _tryUnlock(context, dirPath); + if (!success) { + showFeedback(context, FeedbackType.warn, context.l10n.genericFailureFeedback); + } + return success; + } + + Future<bool> unlockFilter(BuildContext context, CollectionFilter filter) { + return filter is StoredAlbumFilter ? unlockAlbum(context, filter.album) : Future.value(true); + } + + Future<bool> unlockFilters(BuildContext context, Set<CollectionFilter> filters) async { + var unlocked = true; + await Future.forEach(filters, (filter) async { + if (unlocked) { + unlocked = await unlockFilter(context, filter); + } + }); + return unlocked; + } + + void lockFilters(Set<StoredAlbumFilter> filters) => vaults.lock(filters.map((v) => v.album).toSet()); + + Future<bool> setVaultPass(BuildContext context, VaultDetails details) async { + switch (details.lockType) { + case VaultLockType.system: + final l10n = context.l10n; + try { + return await LocalAuthentication().authenticate( + localizedReason: l10n.authenticateToConfigureVault, + ); + } on PlatformException catch (e, stack) { + await showWarningDialog( + context: context, + message: e.message ?? l10n.genericFailureFeedback, + ); + await reportService.recordError(e, stack); + } + case VaultLockType.pattern: + final pattern = await showDialog<String>( + context: context, + builder: (context) => const PatternDialog(needConfirmation: true), + routeSettings: const RouteSettings(name: PatternDialog.routeName), + ); + if (pattern != null) { + return await securityService.writeValue(details.passKey, pattern); + } + case VaultLockType.pin: + final pin = await showDialog<String>( + context: context, + builder: (context) => const PinDialog(needConfirmation: true), + routeSettings: const RouteSettings(name: PinDialog.routeName), + ); + if (pin != null) { + return await securityService.writeValue(details.passKey, pin); + } + case VaultLockType.password: + final password = await showDialog<String>( + context: context, + builder: (context) => const PasswordDialog(needConfirmation: true), + routeSettings: const RouteSettings(name: PasswordDialog.routeName), + ); + if (password != null) { + return await securityService.writeValue(details.passKey, password); + } + } + return false; + } +} diff --git a/lib/widgets/common/app_bar/app_bar_subtitle.dart b/lib/widgets/common/app_bar/app_bar_subtitle.dart new file mode 100644 index 0000000..b3c6085 --- /dev/null +++ b/lib/widgets/common/app_bar/app_bar_subtitle.dart @@ -0,0 +1,93 @@ +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/events.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +class SourceStateAwareAppBarTitle extends StatelessWidget { + final Widget title; + final CollectionSource source; + + const SourceStateAwareAppBarTitle({ + super.key, + required this.title, + required this.source, + }); + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + title, + ValueListenableBuilder<SourceState>( + valueListenable: source.stateNotifier, + builder: (context, sourceState, child) { + return AnimatedSwitcher( + duration: ADurations.appBarTitleAnimation, + transitionBuilder: (child, animation) => FadeTransition( + opacity: animation, + child: SizeTransition( + sizeFactor: animation, + child: child, + ), + ), + child: sourceState == SourceState.ready + ? const SizedBox() + : SourceStateSubtitle( + source: source, + ), + ); + }, + ), + ], + ); + } +} + +class SourceStateSubtitle extends StatelessWidget { + final CollectionSource source; + + const SourceStateSubtitle({ + super.key, + required this.source, + }); + + @override + Widget build(BuildContext context) { + final sourceState = source.state; + final subtitle = sourceState.getName(context.l10n); + if (subtitle == null) return const SizedBox(); + + final theme = Theme.of(context); + return DefaultTextStyle.merge( + style: theme.textTheme.bodySmall!.copyWith(fontFeatures: const [FontFeature.disable('smcp')]), + child: ValueListenableBuilder<ProgressEvent>( + valueListenable: source.progressNotifier, + builder: (context, progress, snapshot) { + return Text.rich( + TextSpan( + children: [ + TextSpan(text: subtitle), + if (progress.total != 0 && sourceState != SourceState.locatingCountries) ...[ + const WidgetSpan(child: SizedBox(width: 8)), + TextSpan( + text: '${progress.done}/${progress.total}', + style: TextStyle(color: theme.isDark ? Colors.white30 : Colors.black26), + ), + ], + ], + ), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ); + }, + ), + ); + } +} diff --git a/lib/widgets/common/app_bar/app_bar_title.dart b/lib/widgets/common/app_bar/app_bar_title.dart new file mode 100644 index 0000000..cd9f0f9 --- /dev/null +++ b/lib/widgets/common/app_bar/app_bar_title.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +class InteractiveAppBarTitle extends StatelessWidget { + final GestureTapCallback? onTap; + final Widget child; + + const InteractiveAppBarTitle({ + super.key, + this.onTap, + required this.child, + }); + + @override + Widget build(BuildContext context) { + final textScaler = MediaQuery.textScalerOf(context); + return GestureDetector( + onTap: onTap, + // use a `Container` with a dummy color to make it expand + // so that we can also detect taps around the title `Text` + child: Container( + alignment: AlignmentDirectional.centerStart, + color: Colors.transparent, + height: textScaler.scale(kToolbarHeight), + child: child, + ), + ); + } +} diff --git a/lib/widgets/common/app_bar/crumb_line.dart b/lib/widgets/common/app_bar/crumb_line.dart new file mode 100644 index 0000000..704cb7f --- /dev/null +++ b/lib/widgets/common/app_bar/crumb_line.dart @@ -0,0 +1,106 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class CrumbLine<T> extends StatefulWidget { + final List<String> Function(BuildContext context) split; + final T Function(BuildContext context, int index) combine; + final void Function(T combined) onTap; + + static const EdgeInsets padding = EdgeInsets.only(top: 6, bottom: 20); + + const CrumbLine({ + super.key, + required this.split, + required this.combine, + required this.onTap, + }); + + @override + State<CrumbLine<T>> createState() => _CrumbLineState<T>(); + + static double getPreferredHeight(TextScaler textScaler) => textScaler.scale(22) + padding.vertical; +} + +class _CrumbLineState<T> extends State<CrumbLine<T>> { + final ScrollController _scrollController = ScrollController(); + + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); + } + + @override + void didUpdateWidget(covariant CrumbLine<T> oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.split(context).length < widget.split(context).length) { + // scroll to show last crumb + WidgetsBinding.instance.addPostFrameCallback((_) { + final animate = context.read<Settings>().animate; + final extent = _scrollController.position.maxScrollExtent; + if (animate) { + _scrollController.animateTo( + extent, + duration: const Duration(milliseconds: 500), + curve: Curves.easeOutQuad, + ); + } else { + _scrollController.jumpTo(extent); + } + }); + } + } + + @override + Widget build(BuildContext context) { + final parts = widget.split(context); + + final crumbColor = DefaultTextStyle.of(context).style.color; + return ListView.builder( + scrollDirection: Axis.horizontal, + controller: _scrollController, + padding: const EdgeInsets.symmetric(horizontal: 8), + itemBuilder: (context, index) { + Widget _buildText(String text) => Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Text(text), + ); + + if (index >= parts.length) return const SizedBox(); + final text = parts[index]; + if (index == parts.length - 1) { + return Center( + child: DefaultTextStyle.merge( + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + ), + child: _buildText(text), + ), + ); + } + return GestureDetector( + onTap: parts.isNotEmpty ? () => widget.onTap(widget.combine(context, index)) : null, + child: Container( + // use a `Container` with a dummy color to make it expand + // so that we can also detect taps around the title `Text` + color: Colors.transparent, + child: Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _buildText(text), + Icon( + AIcons.next, + color: crumbColor, + ), + ], + ), + ), + ); + }, + itemCount: parts.length, + ); + } +} diff --git a/lib/widgets/common/app_bar/sliver_app_bar_title.dart b/lib/widgets/common/app_bar/sliver_app_bar_title.dart new file mode 100644 index 0000000..08b15cf --- /dev/null +++ b/lib/widgets/common/app_bar/sliver_app_bar_title.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +// as of Flutter v2.8.1, fading opacity in `SliverAppBar` +// is not applied to title when `appBarTheme.titleTextStyle` is defined, +// so this wrapper manually applies opacity to the default text style +class SliverAppBarTitleWrapper extends StatelessWidget { + final Widget child; + + const SliverAppBarTitleWrapper({ + super.key, + required this.child, + }); + + @override + Widget build(BuildContext context) { + final toolbarOpacity = context.dependOnInheritedWidgetOfExactType<FlexibleSpaceBarSettings>()!.toolbarOpacity; + final baseColor = (DefaultTextStyle.of(context).style.color ?? Theme.of(context).textTheme.titleLarge!.color!); + return DefaultTextStyle.merge( + style: TextStyle(color: baseColor.withValues(alpha: toolbarOpacity)), + child: child, + ); + } +} diff --git a/lib/widgets/common/aves_highlight.dart b/lib/widgets/common/aves_highlight.dart new file mode 100644 index 0000000..3a2f4f0 --- /dev/null +++ b/lib/widgets/common/aves_highlight.dart @@ -0,0 +1,103 @@ +// ignore_for_file: depend_on_referenced_packages +import 'package:flutter/material.dart'; +import 'package:highlight/highlight.dart' show highlight, Node; + +// adapted from package `flutter_highlight` v0.7.0 `HighlightView` +// TODO TLAD use the TextSpan getter when this is fixed: https://github.com/git-touch/highlight/issues/6 + +/// Highlight Flutter Widget +class AvesHighlightView extends StatelessWidget { + /// The original code to be highlighted + final String source; + + /// Highlight language + /// + /// It is recommended to give it a value for performance + /// + /// [All available languages](https://github.com/pd4d10/highlight/tree/master/highlight/lib/languages) + final String? language; + + /// Highlight theme + /// + /// [All available themes](https://github.com/pd4d10/highlight/blob/master/flutter_highlight/lib/themes) + final Map<String, TextStyle> theme; + + /// Padding + final EdgeInsetsGeometry? padding; + + /// Text styles + /// + /// Specify text styles such as font family and font size + final TextStyle? textStyle; + + AvesHighlightView({ + super.key, + required String input, + this.language, + this.theme = const {}, + this.padding, + this.textStyle, + int tabSize = 8, // TODO: https://github.com/flutter/flutter/issues/50087 + }) : source = input.replaceAll('\t', ' ' * tabSize); + + List<TextSpan> _convert(List<Node> nodes) { + final spans = <TextSpan>[]; + var currentSpans = spans; + final stack = <List<TextSpan>>[]; + + void _traverse(Node node) { + if (node.value != null) { + currentSpans.add(node.className == null ? TextSpan(text: node.value) : TextSpan(text: node.value, style: theme[node.className!])); + } else if (node.children != null) { + final tmp = <TextSpan>[]; + currentSpans.add(TextSpan(children: tmp, style: theme[node.className!])); + stack.add(currentSpans); + currentSpans = tmp; + + node.children!.forEach((n) { + _traverse(n); + if (n == node.children!.last) { + currentSpans = stack.isEmpty ? spans : stack.removeLast(); + } + }); + } + } + + for (var node in nodes) { + _traverse(node); + } + + return spans; + } + + static const _rootKey = 'root'; + static const _defaultFontColor = Color(0xff000000); + static const _defaultBackgroundColor = Color(0xffffffff); + + // TODO: dart:io is not available at web platform currently + // See: https://github.com/flutter/flutter/issues/39998 + // So we just use monospace here for now + static const _defaultFontFamily = 'monospace'; + + @override + Widget build(BuildContext context) { + var _textStyle = TextStyle( + fontFamily: _defaultFontFamily, + color: theme[_rootKey]?.color ?? _defaultFontColor, + ); + if (textStyle != null) { + _textStyle = _textStyle.merge(textStyle); + } + + return Container( + color: theme[_rootKey]?.backgroundColor ?? _defaultBackgroundColor, + padding: padding, + child: SelectableText.rich( + TextSpan( + style: _textStyle, + children: _convert(highlight.parse(source, language: language).nodes!), + ), + ), + ); + } +} diff --git a/lib/widgets/common/basic/circle.dart b/lib/widgets/common/basic/circle.dart new file mode 100644 index 0000000..0b3fdba --- /dev/null +++ b/lib/widgets/common/basic/circle.dart @@ -0,0 +1,108 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +class CircularIndicator extends StatefulWidget { + final double radius, lineWidth, percent; + final Color background, foreground; + final Widget center; + + const CircularIndicator({ + super.key, + required this.radius, + required this.lineWidth, + required this.percent, + required this.background, + required this.foreground, + required this.center, + }); + + @override + State<CircularIndicator> createState() => _CircularIndicatorState(); +} + +class _CircularIndicatorState extends State<CircularIndicator> { + @override + Widget build(BuildContext context) { + return SizedBox.square( + dimension: widget.radius * 2, + child: Stack( + alignment: Alignment.center, + children: [ + _Circle( + radius: widget.radius, + lineWidth: widget.lineWidth, + percent: 1.0, + color: widget.background, + ), + _Circle( + radius: widget.radius, + lineWidth: widget.lineWidth, + percent: widget.percent, + color: widget.foreground, + ), + widget.center, + ], + ), + ); + } +} + +class _Circle extends StatelessWidget { + final double radius, lineWidth, percent; + final Color color; + + const _Circle({ + required this.radius, + required this.lineWidth, + required this.percent, + required this.color, + }); + + @override + Widget build(BuildContext context) { + return CustomPaint( + size: Size.square(radius), + painter: _CirclePainter( + lineWidth: lineWidth, + radius: radius - lineWidth / 2, + color: color, + percent: percent, + ), + ); + } +} + +class _CirclePainter extends CustomPainter { + final double radius, lineWidth, percent; + final Color color; + + const _CirclePainter({ + required this.radius, + required this.lineWidth, + required this.percent, + required this.color, + }); + + @override + void paint(Canvas canvas, Size size) { + final center = Offset(size.width / 2, size.height / 2); + final paint = Paint() + ..style = PaintingStyle.stroke + ..color = color + ..strokeWidth = lineWidth; + + canvas.translate(center.dx, center.dy); + canvas.rotate(-pi / 2); + canvas.drawArc( + Rect.fromCircle(center: Offset.zero, radius: radius), + 0, + 2 * pi * percent, + false, + paint, + ); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => true; +} diff --git a/lib/widgets/common/basic/color_indicator.dart b/lib/widgets/common/basic/color_indicator.dart new file mode 100644 index 0000000..85b5da0 --- /dev/null +++ b/lib/widgets/common/basic/color_indicator.dart @@ -0,0 +1,46 @@ +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:flutter/widgets.dart'; + +class ColorIndicator extends StatelessWidget { + final Color? value; + final Color? alternate; + final Widget? child; + + static const double radius = 16; + + const ColorIndicator({ + super.key, + required this.value, + this.alternate, + this.child, + }); + + @override + Widget build(BuildContext context) { + const dimension = radius * 2; + + Gradient? gradient; + final _value = value; + final _alternate = alternate; + if (_value != null && _alternate != null && _alternate != _value) { + gradient = LinearGradient( + begin: AlignmentDirectional.topStart, + end: AlignmentDirectional.bottomEnd, + colors: [_value, _value, _alternate, _alternate], + stops: const [0, .5, .5, 1], + ); + } + + return Container( + height: dimension, + width: dimension, + decoration: BoxDecoration( + color: _value, + border: AvesBorder.border(context), + gradient: gradient, + shape: BoxShape.circle, + ), + child: child, + ); + } +} diff --git a/lib/widgets/common/basic/derived_material_localization.dart b/lib/widgets/common/basic/derived_material_localization.dart new file mode 100644 index 0000000..59bdca1 --- /dev/null +++ b/lib/widgets/common/basic/derived_material_localization.dart @@ -0,0 +1,524 @@ +import 'package:aves/services/common/services.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +// apply custom regional preferences on context localization +// until this is fixed: https://github.com/flutter/flutter/issues/122274 +class MaterialLocalizationsRegionalizer extends StatefulWidget { + final Widget child; + + const MaterialLocalizationsRegionalizer({ + super.key, + required this.child, + }); + + @override + State<MaterialLocalizationsRegionalizer> createState() => _MaterialLocalizationsRegionalizerState(); +} + +class _MaterialLocalizationsRegionalizerState extends State<MaterialLocalizationsRegionalizer> { + late final Future<int?> _firstDayOfWeekLoader; + + @override + void initState() { + super.initState(); + _firstDayOfWeekLoader = deviceService.getFirstDayOfWeekIndex(); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder<int?>( + future: _firstDayOfWeekLoader, + builder: (context, snapshot) { + final firstDayOfWeekIndex = snapshot.data; + final localizationsDelegate = DerivedMaterialLocalizationsDelegate( + Localizations.localeOf(context), + DerivedMaterialLocalizations( + parent: MaterialLocalizations.of(context), + firstDayOfWeekIndex: firstDayOfWeekIndex, + ), + ); + return Localizations.override( + context: context, + delegates: [localizationsDelegate], + child: widget.child, + ); + }, + ); + } +} + +class DerivedMaterialLocalizationsDelegate extends LocalizationsDelegate<MaterialLocalizations> { + final Locale locale; + final MaterialLocalizations localizations; + + const DerivedMaterialLocalizationsDelegate(this.locale, this.localizations); + + @override + bool isSupported(Locale locale) => locale == this.locale; + + @override + Future<MaterialLocalizations> load(Locale locale) async { + return SynchronousFuture<MaterialLocalizations>(localizations); + } + + @override + bool shouldReload(DerivedMaterialLocalizationsDelegate old) => true; +} + +class DerivedMaterialLocalizations extends MaterialLocalizations { + final MaterialLocalizations parent; + final int? _firstDayOfWeekIndex; + + DerivedMaterialLocalizations({ + required this.parent, + int? firstDayOfWeekIndex, + }) : _firstDayOfWeekIndex = firstDayOfWeekIndex; + + @override + String aboutListTileTitle(String applicationName) => parent.aboutListTileTitle(applicationName); + + @override + String get alertDialogLabel => parent.alertDialogLabel; + + @override + String get anteMeridiemAbbreviation => parent.anteMeridiemAbbreviation; + + @override + String get backButtonTooltip => parent.backButtonTooltip; + + @override + String get bottomSheetLabel => parent.bottomSheetLabel; + + @override + String get calendarModeButtonLabel => parent.calendarModeButtonLabel; + + @override + String get cancelButtonLabel => parent.cancelButtonLabel; + + @override + String get clearButtonTooltip => parent.clearButtonTooltip; + + @override + String get closeButtonLabel => parent.closeButtonLabel; + + @override + String get closeButtonTooltip => parent.closeButtonTooltip; + + @override + String get continueButtonLabel => parent.continueButtonLabel; + + @override + String get copyButtonLabel => parent.copyButtonLabel; + + @override + String get currentDateLabel => parent.currentDateLabel; + + @override + String get cutButtonLabel => parent.cutButtonLabel; + + @override + String get dateHelpText => parent.dateHelpText; + + @override + String get dateInputLabel => parent.dateInputLabel; + + @override + String get dateOutOfRangeLabel => parent.dateOutOfRangeLabel; + + @override + String get datePickerHelpText => parent.datePickerHelpText; + + @override + String dateRangeEndDateSemanticLabel(String formattedDate) => parent.dateRangeEndDateSemanticLabel(formattedDate); + + @override + String get dateRangeEndLabel => parent.dateRangeEndLabel; + + @override + String get dateRangePickerHelpText => parent.dateRangePickerHelpText; + + @override + String dateRangeStartDateSemanticLabel(String formattedDate) => parent.dateRangeStartDateSemanticLabel(formattedDate); + + @override + String get dateRangeStartLabel => parent.dateRangeStartLabel; + + @override + String get dateSeparator => parent.dateSeparator; + + @override + String get deleteButtonTooltip => parent.deleteButtonTooltip; + + @override + String get dialModeButtonLabel => parent.dialModeButtonLabel; + + @override + String get dialogLabel => parent.dialogLabel; + + @override + String get drawerLabel => parent.drawerLabel; + + @override + int get firstDayOfWeekIndex => _firstDayOfWeekIndex ?? parent.firstDayOfWeekIndex; + + @override + String get firstPageTooltip => parent.firstPageTooltip; + + @override + String formatCompactDate(DateTime date) => parent.formatCompactDate(date); + + @override + String formatDecimal(int number) => parent.formatDecimal(number); + + @override + String formatFullDate(DateTime date) => parent.formatFullDate(date); + + @override + String formatHour(TimeOfDay timeOfDay, {bool alwaysUse24HourFormat = false}) => parent.formatHour(timeOfDay, alwaysUse24HourFormat: alwaysUse24HourFormat); + + @override + String formatMediumDate(DateTime date) => parent.formatMediumDate(date); + + @override + String formatMinute(TimeOfDay timeOfDay) => parent.formatMinute(timeOfDay); + + @override + String formatMonthYear(DateTime date) => parent.formatMonthYear(date); + + @override + String formatShortDate(DateTime date) => parent.formatShortDate(date); + + @override + String formatShortMonthDay(DateTime date) => parent.formatShortMonthDay(date); + + @override + String formatTimeOfDay(TimeOfDay timeOfDay, {bool alwaysUse24HourFormat = false}) => parent.formatTimeOfDay(timeOfDay); + + @override + String formatYear(DateTime date) => parent.formatYear(date); + + @override + String get hideAccountsLabel => parent.hideAccountsLabel; + + @override + String get inputDateModeButtonLabel => parent.inputDateModeButtonLabel; + + @override + String get inputTimeModeButtonLabel => parent.inputTimeModeButtonLabel; + + @override + String get invalidDateFormatLabel => parent.invalidDateFormatLabel; + + @override + String get invalidDateRangeLabel => parent.invalidDateRangeLabel; + + @override + String get invalidTimeLabel => parent.invalidTimeLabel; + + @override + String get keyboardKeyAlt => parent.keyboardKeyAlt; + + @override + String get keyboardKeyAltGraph => parent.keyboardKeyAltGraph; + + @override + String get keyboardKeyBackspace => parent.keyboardKeyBackspace; + + @override + String get keyboardKeyCapsLock => parent.keyboardKeyCapsLock; + + @override + String get keyboardKeyChannelDown => parent.keyboardKeyChannelDown; + + @override + String get keyboardKeyChannelUp => parent.keyboardKeyChannelUp; + + @override + String get keyboardKeyControl => parent.keyboardKeyControl; + + @override + String get keyboardKeyDelete => parent.keyboardKeyDelete; + + @override + String get keyboardKeyEject => parent.keyboardKeyEject; + + @override + String get keyboardKeyEnd => parent.keyboardKeyEnd; + + @override + String get keyboardKeyEscape => parent.keyboardKeyEscape; + + @override + String get keyboardKeyFn => parent.keyboardKeyFn; + + @override + String get keyboardKeyHome => parent.keyboardKeyHome; + + @override + String get keyboardKeyInsert => parent.keyboardKeyInsert; + + @override + String get keyboardKeyMeta => parent.keyboardKeyMeta; + + @override + String get keyboardKeyMetaMacOs => parent.keyboardKeyMetaMacOs; + + @override + String get keyboardKeyMetaWindows => parent.keyboardKeyMetaWindows; + + @override + String get keyboardKeyNumLock => parent.keyboardKeyNumLock; + + @override + String get keyboardKeyNumpad0 => parent.keyboardKeyNumpad0; + + @override + String get keyboardKeyNumpad1 => parent.keyboardKeyNumpad1; + + @override + String get keyboardKeyNumpad2 => parent.keyboardKeyNumpad2; + + @override + String get keyboardKeyNumpad3 => parent.keyboardKeyNumpad3; + + @override + String get keyboardKeyNumpad4 => parent.keyboardKeyNumpad4; + + @override + String get keyboardKeyNumpad5 => parent.keyboardKeyNumpad5; + + @override + String get keyboardKeyNumpad6 => parent.keyboardKeyNumpad6; + + @override + String get keyboardKeyNumpad7 => parent.keyboardKeyNumpad7; + + @override + String get keyboardKeyNumpad8 => parent.keyboardKeyNumpad8; + + @override + String get keyboardKeyNumpad9 => parent.keyboardKeyNumpad9; + + @override + String get keyboardKeyNumpadAdd => parent.keyboardKeyNumpadAdd; + + @override + String get keyboardKeyNumpadComma => parent.keyboardKeyNumpadComma; + + @override + String get keyboardKeyNumpadDecimal => parent.keyboardKeyNumpadDecimal; + + @override + String get keyboardKeyNumpadDivide => parent.keyboardKeyNumpadDivide; + + @override + String get keyboardKeyNumpadEnter => parent.keyboardKeyNumpadEnter; + + @override + String get keyboardKeyNumpadEqual => parent.keyboardKeyNumpadEqual; + + @override + String get keyboardKeyNumpadMultiply => parent.keyboardKeyNumpadMultiply; + + @override + String get keyboardKeyNumpadParenLeft => parent.keyboardKeyNumpadParenLeft; + + @override + String get keyboardKeyNumpadParenRight => parent.keyboardKeyNumpadParenRight; + + @override + String get keyboardKeyNumpadSubtract => parent.keyboardKeyNumpadSubtract; + + @override + String get keyboardKeyPageDown => parent.keyboardKeyPageDown; + + @override + String get keyboardKeyPageUp => parent.keyboardKeyPageUp; + + @override + String get keyboardKeyPower => parent.keyboardKeyPower; + + @override + String get keyboardKeyPowerOff => parent.keyboardKeyPowerOff; + + @override + String get keyboardKeyPrintScreen => parent.keyboardKeyPrintScreen; + + @override + String get keyboardKeyScrollLock => parent.keyboardKeyScrollLock; + + @override + String get keyboardKeySelect => parent.keyboardKeySelect; + + @override + String get keyboardKeyShift => parent.keyboardKeyShift; + + @override + String get keyboardKeySpace => parent.keyboardKeySpace; + + @override + String get lastPageTooltip => parent.lastPageTooltip; + + @override + String licensesPackageDetailText(int licenseCount) => parent.licensesPackageDetailText(licenseCount); + + @override + String get licensesPageTitle => parent.licensesPageTitle; + + @override + String get lookUpButtonLabel => parent.lookUpButtonLabel; + + @override + String get menuBarMenuLabel => parent.menuBarMenuLabel; + + @override + String get menuDismissLabel => parent.menuDismissLabel; + + @override + String get modalBarrierDismissLabel => parent.modalBarrierDismissLabel; + + @override + String get moreButtonTooltip => parent.moreButtonTooltip; + + @override + List<String> get narrowWeekdays => parent.narrowWeekdays; + + @override + String get nextMonthTooltip => parent.nextMonthTooltip; + + @override + String get nextPageTooltip => parent.nextPageTooltip; + + @override + String get okButtonLabel => parent.okButtonLabel; + + @override + String get openAppDrawerTooltip => parent.openAppDrawerTooltip; + + @override + String pageRowsInfoTitle(int firstRow, int lastRow, int rowCount, bool rowCountIsApproximate) => parent.pageRowsInfoTitle(firstRow, lastRow, rowCount, rowCountIsApproximate); + + @override + DateTime? parseCompactDate(String? inputString) => parent.parseCompactDate(inputString); + + @override + String get pasteButtonLabel => parent.pasteButtonLabel; + + @override + String get popupMenuLabel => parent.popupMenuLabel; + + @override + String get postMeridiemAbbreviation => parent.postMeridiemAbbreviation; + + @override + String get previousMonthTooltip => parent.previousMonthTooltip; + + @override + String get previousPageTooltip => parent.previousPageTooltip; + + @override + String get refreshIndicatorSemanticLabel => parent.refreshIndicatorSemanticLabel; + + @override + String remainingTextFieldCharacterCount(int remaining) => parent.remainingTextFieldCharacterCount(remaining); + + @override + String get reorderItemDown => throw UnimplementedError(); + + @override + String get reorderItemLeft => throw UnimplementedError(); + + @override + String get reorderItemRight => throw UnimplementedError(); + + @override + String get reorderItemToEnd => throw UnimplementedError(); + + @override + String get reorderItemToStart => throw UnimplementedError(); + + @override + String get reorderItemUp => throw UnimplementedError(); + + @override + String get rowsPerPageTitle => parent.rowsPerPageTitle; + + @override + String get saveButtonLabel => parent.saveButtonLabel; + + @override + String get scanTextButtonLabel => parent.scanTextButtonLabel; + + @override + String get scrimLabel => parent.scrimLabel; + + @override + String scrimOnTapHint(String modalRouteContentName) => parent.scrimOnTapHint(modalRouteContentName); + + @override + ScriptCategory get scriptCategory => parent.scriptCategory; + + @override + String get searchFieldLabel => parent.searchFieldLabel; + + @override + String get searchWebButtonLabel => parent.searchWebButtonLabel; + + @override + String get selectAllButtonLabel => parent.selectAllButtonLabel; + + @override + String get selectYearSemanticsLabel => parent.selectYearSemanticsLabel; + + @override + String get selectedDateLabel => parent.selectedDateLabel; + + @override + String selectedRowCountTitle(int selectedRowCount) => parent.selectedRowCountTitle(selectedRowCount); + + @override + String get shareButtonLabel => parent.shareButtonLabel; + + @override + String get showAccountsLabel => parent.showAccountsLabel; + + @override + String get showMenuTooltip => parent.showMenuTooltip; + + @override + String get signedInLabel => parent.signedInLabel; + + @override + String tabLabel({required int tabIndex, required int tabCount}) => parent.tabLabel(tabIndex: tabIndex, tabCount: tabCount); + + @override + TimeOfDayFormat timeOfDayFormat({bool alwaysUse24HourFormat = false}) => parent.timeOfDayFormat(alwaysUse24HourFormat: alwaysUse24HourFormat); + + @override + String get timePickerDialHelpText => parent.timePickerDialHelpText; + + @override + String get timePickerHourLabel => parent.timePickerHourLabel; + + @override + String get timePickerHourModeAnnouncement => parent.timePickerHourModeAnnouncement; + + @override + String get timePickerInputHelpText => parent.timePickerInputHelpText; + + @override + String get timePickerMinuteLabel => parent.timePickerMinuteLabel; + + @override + String get timePickerMinuteModeAnnouncement => parent.timePickerMinuteModeAnnouncement; + + @override + String get unspecifiedDate => parent.unspecifiedDate; + + @override + String get unspecifiedDateRange => parent.unspecifiedDateRange; + + @override + String get viewLicensesButtonLabel => parent.viewLicensesButtonLabel; +} diff --git a/lib/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart b/lib/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart new file mode 100644 index 0000000..94deba5 --- /dev/null +++ b/lib/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart @@ -0,0 +1,38 @@ +import 'package:flutter/rendering.dart'; + +class ArrowClipper extends CustomClipper<Path> { + @override + Path getClip(Size size) { + final path = Path(); + path.lineTo(0.0, size.height); + path.lineTo(size.width, size.height); + path.lineTo(size.width, 0.0); + path.lineTo(0.0, 0.0); + path.close(); + + const double arrowWidth = 8.0; + final startPointX = (size.width - arrowWidth) / 2; + var startPointY = size.height / 2 - arrowWidth / 2; + path.moveTo(startPointX, startPointY); + path.lineTo(startPointX + arrowWidth / 2, startPointY - arrowWidth / 2); + path.lineTo(startPointX + arrowWidth, startPointY); + path.lineTo(startPointX + arrowWidth, startPointY + 1.0); + path.lineTo(startPointX + arrowWidth / 2, startPointY - arrowWidth / 2 + 1.0); + path.lineTo(startPointX, startPointY + 1.0); + path.close(); + + startPointY = size.height / 2 + arrowWidth / 2; + path.moveTo(startPointX + arrowWidth, startPointY); + path.lineTo(startPointX + arrowWidth / 2, startPointY + arrowWidth / 2); + path.lineTo(startPointX, startPointY); + path.lineTo(startPointX, startPointY - 1.0); + path.lineTo(startPointX + arrowWidth / 2, startPointY + arrowWidth / 2 - 1.0); + path.lineTo(startPointX + arrowWidth, startPointY - 1.0); + path.close(); + + return path; + } + + @override + bool shouldReclip(covariant CustomClipper<Path> oldClipper) => false; +} diff --git a/lib/widgets/common/basic/draggable_scrollbar/notifications.dart b/lib/widgets/common/basic/draggable_scrollbar/notifications.dart new file mode 100644 index 0000000..28ca11d --- /dev/null +++ b/lib/widgets/common/basic/draggable_scrollbar/notifications.dart @@ -0,0 +1,10 @@ +import 'package:flutter/widgets.dart'; + +@immutable +class DraggableScrollbarNotification extends Notification { + final DraggableScrollbarEvent event; + + const DraggableScrollbarNotification(this.event); +} + +enum DraggableScrollbarEvent { dragStart, dragEnd } diff --git a/lib/widgets/common/basic/draggable_scrollbar/scroll_label.dart b/lib/widgets/common/basic/draggable_scrollbar/scroll_label.dart new file mode 100644 index 0000000..e42c171 --- /dev/null +++ b/lib/widgets/common/basic/draggable_scrollbar/scroll_label.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + +class ScrollLabel extends StatelessWidget { + final Animation<double> animation; + final Color backgroundColor; + final Widget child; + + const ScrollLabel({ + super.key, + required this.child, + required this.animation, + required this.backgroundColor, + }); + + @override + Widget build(BuildContext context) { + return FadeTransition( + opacity: animation, + child: Container( + margin: const EdgeInsetsDirectional.only(end: 12.0), + child: Material( + elevation: 4.0, + color: backgroundColor, + borderRadius: const BorderRadius.all(Radius.circular(16)), + child: child, + ), + ), + ); + } +} diff --git a/lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart b/lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart new file mode 100644 index 0000000..b166347 --- /dev/null +++ b/lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart @@ -0,0 +1,365 @@ +import 'dart:async'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/notifications.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/scroll_label.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/transition.dart'; +import 'package:aves/widgets/common/basic/gestures/gesture_detector.dart'; +import 'package:flutter/widgets.dart'; + +/* + adapted from package `draggable_scrollbar` v0.0.4: + - removed default thumb builders + - allow any `ScrollView` as child + - allow any `Widget` as label content + - moved out constraints responsibility + - various extent & thumb positioning fixes + - null safety + - directionality aware + */ + +/// Build the Scroll Thumb and label using the current configuration +typedef ScrollThumbBuilder = + Widget Function( + Color backgroundColor, + Animation<double> thumbAnimation, + Animation<double> labelAnimation, + double height, { + Widget? labelText, + }); + +/// Build a Text widget using the current scroll offset +typedef OffsetLabelBuilder = Widget Function(double offsetY); +typedef TextLabelBuilder = Widget Function(String label); + +/// A widget that will display a BoxScrollView with a ScrollThumb that can be dragged +/// for quick navigation of the BoxScrollView. +class DraggableScrollbar extends StatefulWidget { + /// The background color of the label and thumb + final Color backgroundColor; + + final Map<double, String> Function()? crumbsBuilder; + + final Size scrollThumbSize; + + /// A function that builds a thumb using the current configuration + final ScrollThumbBuilder scrollThumbBuilder; + + /// The amount of padding that should surround the thumb + final EdgeInsets padding; + + /// Determines how quickly the scrollbar will animate in and out + final Duration scrollbarAnimationDuration; + + /// How long should the thumb be visible before fading out + final Duration scrollbarTimeToFade; + + /// Build a Text widget from the current offset in the BoxScrollView + final OffsetLabelBuilder labelTextBuilder; + + final TextLabelBuilder crumbTextBuilder; + + /// The ScrollController for the BoxScrollView + final ScrollController controller; + + final double Function(double scrollOffset, double offsetIncrement)? dragOffsetSnapper; + + /// The view that will be scrolled with the scroll thumb + final Widget child; + + const DraggableScrollbar({ + super.key, + required this.backgroundColor, + required this.scrollThumbSize, + required this.scrollThumbBuilder, + required this.controller, + this.dragOffsetSnapper, + this.crumbsBuilder, + this.padding = EdgeInsets.zero, + this.scrollbarAnimationDuration = const Duration(milliseconds: 300), + this.scrollbarTimeToFade = const Duration(milliseconds: 1000), + required this.labelTextBuilder, + required this.crumbTextBuilder, + required this.child, + }); + + @override + State<DraggableScrollbar> createState() => _DraggableScrollbarState(); + + static const double labelThumbPadding = 16; + + static Widget buildScrollThumbAndLabel({ + required Widget scrollThumb, + required Color backgroundColor, + required Animation<double> thumbAnimation, + required Animation<double> labelAnimation, + required Widget? labelText, + }) { + final scrollThumbAndLabel = labelText == null + ? scrollThumb + : Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + ScrollLabel( + animation: labelAnimation, + backgroundColor: backgroundColor, + child: labelText, + ), + const SizedBox(width: labelThumbPadding), + scrollThumb, + ], + ); + return SlideFadeTransition( + animation: thumbAnimation, + child: scrollThumbAndLabel, + ); + } +} + +class _DraggableScrollbarState extends State<DraggableScrollbar> with TickerProviderStateMixin { + final ValueNotifier<double> _thumbOffsetNotifier = ValueNotifier(0), _viewOffsetNotifier = ValueNotifier(0); + bool _isDragInProcess = false; + double _boundlessThumbOffset = 0, _offsetIncrement = 0; + late Offset _longPressLastGlobalPosition; + + late AnimationController _thumbAnimationController; + late CurvedAnimation _thumbAnimation; + late AnimationController _labelAnimationController; + late CurvedAnimation _labelAnimation; + Timer? _fadeoutTimer; + Map<double, String>? _percentCrumbs; + final Map<double, String> _viewportCrumbs = {}; + + static const double crumbPadding = 30; + static const double crumbMinViewportRatio = 4; + + @override + void initState() { + super.initState(); + + _thumbAnimationController = AnimationController( + vsync: this, + duration: widget.scrollbarAnimationDuration, + ); + + _thumbAnimation = CurvedAnimation( + parent: _thumbAnimationController, + curve: Curves.fastOutSlowIn, + ); + + _labelAnimationController = AnimationController( + vsync: this, + duration: widget.scrollbarAnimationDuration, + ); + + _labelAnimation = CurvedAnimation( + parent: _labelAnimationController, + curve: Curves.fastOutSlowIn, + ); + } + + @override + void didUpdateWidget(covariant DraggableScrollbar oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.crumbsBuilder != widget.crumbsBuilder) { + _percentCrumbs = null; + } + } + + @override + void dispose() { + _thumbAnimation.dispose(); + _thumbAnimationController.dispose(); + _labelAnimation.dispose(); + _labelAnimationController.dispose(); + _fadeoutTimer?.cancel(); + super.dispose(); + } + + ScrollController get controller => widget.controller; + + double get scrollBarHeight => context.size!.height - widget.padding.vertical; + + double get thumbMaxScrollExtent => scrollBarHeight - widget.scrollThumbSize.height; + + double get thumbMinScrollExtent => 0.0; + + @override + Widget build(BuildContext context) { + return NotificationListener<ScrollNotification>( + onNotification: (notification) { + _onScrollNotification(notification); + return false; + }, + child: Stack( + children: [ + RepaintBoundary( + child: widget.child, + ), + if (_isDragInProcess) + ..._viewportCrumbs.entries.map((kv) { + final offset = kv.key; + final label = kv.value; + return Positioned.directional( + textDirection: Directionality.of(context), + top: offset, + end: DraggableScrollbar.labelThumbPadding + widget.scrollThumbSize.width, + child: Padding( + padding: widget.padding, + child: ConstrainedBox( + constraints: BoxConstraints(minHeight: widget.scrollThumbSize.height), + child: Center( + child: ScrollLabel( + animation: kAlwaysCompleteAnimation, + backgroundColor: widget.backgroundColor, + child: widget.crumbTextBuilder(label), + ), + ), + ), + ), + ); + }), + // exclude semantics, otherwise this layer will block access to content layers below when using TalkBack + ExcludeSemantics( + child: RepaintBoundary( + child: AGestureDetector( + onLongPressStart: (details) { + _longPressLastGlobalPosition = details.globalPosition; + _onVerticalDragStart(); + }, + onLongPressMoveUpdate: (details) { + final dy = (details.globalPosition - _longPressLastGlobalPosition).dy; + _longPressLastGlobalPosition = details.globalPosition; + _onVerticalDragUpdate(dy); + }, + onLongPressEnd: (_) => _onVerticalDragEnd(), + onVerticalDragStart: (_) => _onVerticalDragStart(), + onVerticalDragUpdate: (details) => _onVerticalDragUpdate(details.delta.dy), + onVerticalDragEnd: (_) => _onVerticalDragEnd(), + longPressTimeout: settings.longPressTimeout, + child: ValueListenableBuilder<double>( + valueListenable: _thumbOffsetNotifier, + builder: (context, thumbOffset, child) => Container( + alignment: AlignmentDirectional.topEnd, + padding: EdgeInsets.only(top: thumbOffset) + widget.padding, + child: widget.scrollThumbBuilder( + widget.backgroundColor, + _thumbAnimation, + _labelAnimation, + widget.scrollThumbSize.height, + labelText: _isDragInProcess + ? ValueListenableBuilder<double>( + valueListenable: _viewOffsetNotifier, + builder: (context, viewOffset, child) => widget.labelTextBuilder(viewOffset + thumbOffset), + ) + : null, + ), + ), + ), + ), + ), + ), + ], + ), + ); + } + + void _onScrollNotification(ScrollNotification notification) { + final scrollMetrics = notification.metrics; + + // do not update the thumb if we cannot actually scroll + if (scrollMetrics.minScrollExtent >= scrollMetrics.maxScrollExtent) return; + + _viewOffsetNotifier.value = scrollMetrics.pixels; + + // we update the thumb position from the scrolled offset + // when the user is not dragging the thumb + if (!_isDragInProcess) { + if (notification is ScrollUpdateNotification) { + final scrollExtent = (scrollMetrics.pixels / scrollMetrics.maxScrollExtent * thumbMaxScrollExtent); + _thumbOffsetNotifier.value = thumbMaxScrollExtent > thumbMinScrollExtent ? scrollExtent.clamp(thumbMinScrollExtent, thumbMaxScrollExtent) : thumbMinScrollExtent; + } + + if (notification is ScrollUpdateNotification || notification is OverscrollNotification) { + _showThumb(); + _scheduleFadeout(); + } + } + } + + void _onVerticalDragStart() { + const DraggableScrollbarNotification(DraggableScrollbarEvent.dragStart).dispatch(context); + _boundlessThumbOffset = _thumbOffsetNotifier.value; + _offsetIncrement = 1 / thumbMaxScrollExtent * controller.position.maxScrollExtent; + _labelAnimationController.forward(); + _fadeoutTimer?.cancel(); + _showThumb(); + _updateViewportCrumbs(); + setState(() => _isDragInProcess = true); + } + + void _onVerticalDragUpdate(double deltaY) { + _showThumb(); + if (_isDragInProcess && thumbMinScrollExtent < thumbMaxScrollExtent) { + // thumb offset + _boundlessThumbOffset += deltaY; + _thumbOffsetNotifier.value = _boundlessThumbOffset.clamp(thumbMinScrollExtent, thumbMaxScrollExtent); + + // scroll offset + final min = controller.position.minScrollExtent; + final max = controller.position.maxScrollExtent; + final scrollOffset = _thumbOffsetNotifier.value / thumbMaxScrollExtent * max; + controller.jumpTo((widget.dragOffsetSnapper?.call(scrollOffset, _offsetIncrement) ?? scrollOffset).clamp(min, max)); + } + } + + void _onVerticalDragEnd() { + const DraggableScrollbarNotification(DraggableScrollbarEvent.dragEnd).dispatch(context); + _scheduleFadeout(); + setState(() => _isDragInProcess = false); + } + + void _showThumb() { + if (_thumbAnimationController.status != AnimationStatus.forward) { + _thumbAnimationController.forward(); + } + } + + void _scheduleFadeout() { + _fadeoutTimer?.cancel(); + _fadeoutTimer = Timer(widget.scrollbarTimeToFade, () { + _thumbAnimationController.reverse(); + _labelAnimationController.reverse(); + _fadeoutTimer = null; + }); + } + + void _updateViewportCrumbs() { + _viewportCrumbs.clear(); + final crumbsBuilder = widget.crumbsBuilder; + if (crumbsBuilder != null) { + final maxOffset = thumbMaxScrollExtent; + final position = controller.position; + if (position.maxScrollExtent / position.viewportDimension > crumbMinViewportRatio) { + double lastLabelOffset = -crumbPadding; + _percentCrumbs ??= crumbsBuilder(); + _percentCrumbs!.entries.forEach((kv) { + final percent = kv.key; + final label = kv.value; + final labelOffset = percent * maxOffset; + if (labelOffset >= lastLabelOffset + crumbPadding) { + lastLabelOffset = labelOffset; + _viewportCrumbs[labelOffset] = label; + } + }); + // hide lonesome crumb, whether it is because of a single section, + // or because multiple sections collapsed to a single crumb + if (_viewportCrumbs.length == 1) { + _viewportCrumbs.clear(); + } + } + } + } +} diff --git a/lib/widgets/common/basic/draggable_scrollbar/transition.dart b/lib/widgets/common/basic/draggable_scrollbar/transition.dart new file mode 100644 index 0000000..2eeb3a3 --- /dev/null +++ b/lib/widgets/common/basic/draggable_scrollbar/transition.dart @@ -0,0 +1,31 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +class SlideFadeTransition extends StatelessWidget { + final Animation<double> animation; + final Widget child; + + const SlideFadeTransition({ + super.key, + required this.animation, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: animation, + builder: (context, child) => animation.value == 0.0 ? Container() : child!, + child: SlideTransition( + position: Tween( + begin: Offset((context.isRtl ? -1 : 1) * .3, 0), + end: Offset.zero, + ).animate(animation), + child: FadeTransition( + opacity: animation, + child: child, + ), + ), + ); + } +} diff --git a/lib/widgets/common/basic/font_size_icon_theme.dart b/lib/widgets/common/basic/font_size_icon_theme.dart new file mode 100644 index 0000000..0ef46d6 --- /dev/null +++ b/lib/widgets/common/basic/font_size_icon_theme.dart @@ -0,0 +1,23 @@ +import 'package:flutter/widgets.dart'; + +// scale icons according to text scale +class FontSizeIconTheme extends StatelessWidget { + final Widget child; + + const FontSizeIconTheme({ + super.key, + required this.child, + }); + + @override + Widget build(BuildContext context) { + final textScaler = MediaQuery.textScalerOf(context); + final iconTheme = IconTheme.of(context); + return IconTheme( + data: iconTheme.copyWith( + size: textScaler.scale(iconTheme.size!), + ), + child: child, + ); + } +} diff --git a/lib/widgets/common/basic/gestures/gesture_detector.dart b/lib/widgets/common/basic/gestures/gesture_detector.dart new file mode 100644 index 0000000..9e4d9bf --- /dev/null +++ b/lib/widgets/common/basic/gestures/gesture_detector.dart @@ -0,0 +1,1022 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; + +// as of Flutter v3.27.1, `GestureDetector` does not allow setting long press delay +// adapted from Flutter `GestureDetector` in `/widgets/gesture_detector.dart` +class AGestureDetector extends StatelessWidget { + /// Creates a widget that detects gestures. + /// + /// Pan and scale callbacks cannot be used simultaneously because scale is a + /// superset of pan. Use the scale callbacks instead. + /// + /// Horizontal and vertical drag callbacks cannot be used simultaneously + /// because a combination of a horizontal and vertical drag is a pan. + /// Use the pan callbacks instead. + /// + /// {@youtube 560 315 https://www.youtube.com/watch?v=WhVXkCFPmK4} + /// + /// By default, gesture detectors contribute semantic information to the tree + /// that is used by assistive technology. + AGestureDetector({ + super.key, + this.child, + this.onTapDown, + this.onTapUp, + this.onTap, + this.onTapCancel, + this.onSecondaryTap, + this.onSecondaryTapDown, + this.onSecondaryTapUp, + this.onSecondaryTapCancel, + this.onTertiaryTapDown, + this.onTertiaryTapUp, + this.onTertiaryTapCancel, + this.onDoubleTapDown, + this.onDoubleTap, + this.onDoubleTapCancel, + this.onLongPressDown, + this.onLongPressCancel, + this.onLongPress, + this.onLongPressStart, + this.onLongPressMoveUpdate, + this.onLongPressUp, + this.onLongPressEnd, + this.onSecondaryLongPressDown, + this.onSecondaryLongPressCancel, + this.onSecondaryLongPress, + this.onSecondaryLongPressStart, + this.onSecondaryLongPressMoveUpdate, + this.onSecondaryLongPressUp, + this.onSecondaryLongPressEnd, + this.onTertiaryLongPressDown, + this.onTertiaryLongPressCancel, + this.onTertiaryLongPress, + this.onTertiaryLongPressStart, + this.onTertiaryLongPressMoveUpdate, + this.onTertiaryLongPressUp, + this.onTertiaryLongPressEnd, + this.onVerticalDragDown, + this.onVerticalDragStart, + this.onVerticalDragUpdate, + this.onVerticalDragEnd, + this.onVerticalDragCancel, + this.onHorizontalDragDown, + this.onHorizontalDragStart, + this.onHorizontalDragUpdate, + this.onHorizontalDragEnd, + this.onHorizontalDragCancel, + this.onForcePressStart, + this.onForcePressPeak, + this.onForcePressUpdate, + this.onForcePressEnd, + this.onPanDown, + this.onPanStart, + this.onPanUpdate, + this.onPanEnd, + this.onPanCancel, + this.onScaleStart, + this.onScaleUpdate, + this.onScaleEnd, + this.behavior, + this.excludeFromSemantics = false, + this.dragStartBehavior = DragStartBehavior.start, + this.trackpadScrollCausesScale = false, + this.trackpadScrollToScaleFactor = kDefaultTrackpadScrollToScaleFactor, + this.supportedDevices, + this.longPressTimeout = kLongPressTimeout, + }) : assert(() { + final bool haveVerticalDrag = onVerticalDragStart != null || onVerticalDragUpdate != null || onVerticalDragEnd != null; + final bool haveHorizontalDrag = onHorizontalDragStart != null || onHorizontalDragUpdate != null || onHorizontalDragEnd != null; + final bool havePan = onPanStart != null || onPanUpdate != null || onPanEnd != null; + final bool haveScale = onScaleStart != null || onScaleUpdate != null || onScaleEnd != null; + if (havePan || haveScale) { + if (havePan && haveScale) { + throw FlutterError.fromParts(<DiagnosticsNode>[ + ErrorSummary('Incorrect GestureDetector arguments.'), + ErrorDescription( + 'Having both a pan gesture recognizer and a scale gesture recognizer is redundant; scale is a superset of pan.', + ), + ErrorHint('Just use the scale gesture recognizer.'), + ]); + } + final String recognizer = havePan ? 'pan' : 'scale'; + if (haveVerticalDrag && haveHorizontalDrag) { + throw FlutterError( + 'Incorrect GestureDetector arguments.\n' + 'Simultaneously having a vertical drag gesture recognizer, a horizontal drag gesture recognizer, and a $recognizer gesture recognizer ' + 'will result in the $recognizer gesture recognizer being ignored, since the other two will catch all drags.', + ); + } + } + return true; + }()); + + /// The widget below this widget in the tree. + /// + /// {@macro flutter.widgets.ProxyWidget.child} + final Widget? child; + + /// A pointer that might cause a tap with a primary button has contacted the + /// screen at a particular location. + /// + /// This is called after a short timeout, even if the winning gesture has not + /// yet been selected. If the tap gesture wins, [onTapUp] will be called, + /// otherwise [onTapCancel] will be called. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureTapDownCallback? onTapDown; + + /// A pointer that will trigger a tap with a primary button has stopped + /// contacting the screen at a particular location. + /// + /// This triggers immediately before [onTap] in the case of the tap gesture + /// winning. If the tap gesture did not win, [onTapCancel] is called instead. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureTapUpCallback? onTapUp; + + /// A tap with a primary button has occurred. + /// + /// This triggers when the tap gesture wins. If the tap gesture did not win, + /// [onTapCancel] is called instead. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + /// * [onTapUp], which is called at the same time but includes details + /// regarding the pointer position. + final GestureTapCallback? onTap; + + /// The pointer that previously triggered [onTapDown] will not end up causing + /// a tap. + /// + /// This is called after [onTapDown], and instead of [onTapUp] and [onTap], if + /// the tap gesture did not win. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureTapCancelCallback? onTapCancel; + + /// A tap with a secondary button has occurred. + /// + /// This triggers when the tap gesture wins. If the tap gesture did not win, + /// [onSecondaryTapCancel] is called instead. + /// + /// See also: + /// + /// * [kSecondaryButton], the button this callback responds to. + /// * [onSecondaryTapUp], which is called at the same time but includes details + /// regarding the pointer position. + final GestureTapCallback? onSecondaryTap; + + /// A pointer that might cause a tap with a secondary button has contacted the + /// screen at a particular location. + /// + /// This is called after a short timeout, even if the winning gesture has not + /// yet been selected. If the tap gesture wins, [onSecondaryTapUp] will be + /// called, otherwise [onSecondaryTapCancel] will be called. + /// + /// See also: + /// + /// * [kSecondaryButton], the button this callback responds to. + final GestureTapDownCallback? onSecondaryTapDown; + + /// A pointer that will trigger a tap with a secondary button has stopped + /// contacting the screen at a particular location. + /// + /// This triggers in the case of the tap gesture winning. If the tap gesture + /// did not win, [onSecondaryTapCancel] is called instead. + /// + /// See also: + /// + /// * [onSecondaryTap], a handler triggered right after this one that doesn't + /// pass any details about the tap. + /// * [kSecondaryButton], the button this callback responds to. + final GestureTapUpCallback? onSecondaryTapUp; + + /// The pointer that previously triggered [onSecondaryTapDown] will not end up + /// causing a tap. + /// + /// This is called after [onSecondaryTapDown], and instead of + /// [onSecondaryTapUp], if the tap gesture did not win. + /// + /// See also: + /// + /// * [kSecondaryButton], the button this callback responds to. + final GestureTapCancelCallback? onSecondaryTapCancel; + + /// A pointer that might cause a tap with a tertiary button has contacted the + /// screen at a particular location. + /// + /// This is called after a short timeout, even if the winning gesture has not + /// yet been selected. If the tap gesture wins, [onTertiaryTapUp] will be + /// called, otherwise [onTertiaryTapCancel] will be called. + /// + /// See also: + /// + /// * [kTertiaryButton], the button this callback responds to. + final GestureTapDownCallback? onTertiaryTapDown; + + /// A pointer that will trigger a tap with a tertiary button has stopped + /// contacting the screen at a particular location. + /// + /// This triggers in the case of the tap gesture winning. If the tap gesture + /// did not win, [onTertiaryTapCancel] is called instead. + /// + /// See also: + /// + /// * [kTertiaryButton], the button this callback responds to. + final GestureTapUpCallback? onTertiaryTapUp; + + /// The pointer that previously triggered [onTertiaryTapDown] will not end up + /// causing a tap. + /// + /// This is called after [onTertiaryTapDown], and instead of + /// [onTertiaryTapUp], if the tap gesture did not win. + /// + /// See also: + /// + /// * [kTertiaryButton], the button this callback responds to. + final GestureTapCancelCallback? onTertiaryTapCancel; + + /// A pointer that might cause a double tap has contacted the screen at a + /// particular location. + /// + /// Triggered immediately after the down event of the second tap. + /// + /// If the user completes the double tap and the gesture wins, [onDoubleTap] + /// will be called after this callback. Otherwise, [onDoubleTapCancel] will + /// be called after this callback. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureTapDownCallback? onDoubleTapDown; + + /// The user has tapped the screen with a primary button at the same location + /// twice in quick succession. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureTapCallback? onDoubleTap; + + /// The pointer that previously triggered [onDoubleTapDown] will not end up + /// causing a double tap. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureTapCancelCallback? onDoubleTapCancel; + + /// The pointer has contacted the screen with a primary button, which might + /// be the start of a long-press. + /// + /// This triggers after the pointer down event. + /// + /// If the user completes the long-press, and this gesture wins, + /// [onLongPressStart] will be called after this callback. Otherwise, + /// [onLongPressCancel] will be called after this callback. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + /// * [onSecondaryLongPressDown], a similar callback but for a secondary button. + /// * [onTertiaryLongPressDown], a similar callback but for a tertiary button. + /// * [LongPressGestureRecognizer.onLongPressDown], which exposes this + /// callback at the gesture layer. + final GestureLongPressDownCallback? onLongPressDown; + + /// A pointer that previously triggered [onLongPressDown] will not end up + /// causing a long-press. + /// + /// This triggers once the gesture loses if [onLongPressDown] has previously + /// been triggered. + /// + /// If the user completed the long-press, and the gesture won, then + /// [onLongPressStart] and [onLongPress] are called instead. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onLongPressCancel], which exposes this + /// callback at the gesture layer. + final GestureLongPressCancelCallback? onLongPressCancel; + + /// Called when a long press gesture with a primary button has been recognized. + /// + /// Triggered when a pointer has remained in contact with the screen at the + /// same location for a long period of time. + /// + /// This is equivalent to (and is called immediately after) [onLongPressStart]. + /// The only difference between the two is that this callback does not + /// contain details of the position at which the pointer initially contacted + /// the screen. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onLongPress], which exposes this + /// callback at the gesture layer. + final GestureLongPressCallback? onLongPress; + + /// Called when a long press gesture with a primary button has been recognized. + /// + /// Triggered when a pointer has remained in contact with the screen at the + /// same location for a long period of time. + /// + /// This is equivalent to (and is called immediately before) [onLongPress]. + /// The only difference between the two is that this callback contains + /// details of the position at which the pointer initially contacted the + /// screen, whereas [onLongPress] does not. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onLongPressStart], which exposes this + /// callback at the gesture layer. + final GestureLongPressStartCallback? onLongPressStart; + + /// A pointer has been drag-moved after a long-press with a primary button. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onLongPressMoveUpdate], which exposes this + /// callback at the gesture layer. + final GestureLongPressMoveUpdateCallback? onLongPressMoveUpdate; + + /// A pointer that has triggered a long-press with a primary button has + /// stopped contacting the screen. + /// + /// This is equivalent to (and is called immediately after) [onLongPressEnd]. + /// The only difference between the two is that this callback does not + /// contain details of the state of the pointer when it stopped contacting + /// the screen. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onLongPressUp], which exposes this + /// callback at the gesture layer. + final GestureLongPressUpCallback? onLongPressUp; + + /// A pointer that has triggered a long-press with a primary button has + /// stopped contacting the screen. + /// + /// This is equivalent to (and is called immediately before) [onLongPressUp]. + /// The only difference between the two is that this callback contains + /// details of the state of the pointer when it stopped contacting the + /// screen, whereas [onLongPressUp] does not. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onLongPressEnd], which exposes this + /// callback at the gesture layer. + final GestureLongPressEndCallback? onLongPressEnd; + + /// The pointer has contacted the screen with a secondary button, which might + /// be the start of a long-press. + /// + /// This triggers after the pointer down event. + /// + /// If the user completes the long-press, and this gesture wins, + /// [onSecondaryLongPressStart] will be called after this callback. Otherwise, + /// [onSecondaryLongPressCancel] will be called after this callback. + /// + /// See also: + /// + /// * [kSecondaryButton], the button this callback responds to. + /// * [onLongPressDown], a similar callback but for a secondary button. + /// * [onTertiaryLongPressDown], a similar callback but for a tertiary button. + /// * [LongPressGestureRecognizer.onSecondaryLongPressDown], which exposes + /// this callback at the gesture layer. + final GestureLongPressDownCallback? onSecondaryLongPressDown; + + /// A pointer that previously triggered [onSecondaryLongPressDown] will not + /// end up causing a long-press. + /// + /// This triggers once the gesture loses if [onSecondaryLongPressDown] has + /// previously been triggered. + /// + /// If the user completed the long-press, and the gesture won, then + /// [onSecondaryLongPressStart] and [onSecondaryLongPress] are called instead. + /// + /// See also: + /// + /// * [kSecondaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onSecondaryLongPressCancel], which exposes + /// this callback at the gesture layer. + final GestureLongPressCancelCallback? onSecondaryLongPressCancel; + + /// Called when a long press gesture with a secondary button has been + /// recognized. + /// + /// Triggered when a pointer has remained in contact with the screen at the + /// same location for a long period of time. + /// + /// This is equivalent to (and is called immediately after) + /// [onSecondaryLongPressStart]. The only difference between the two is that + /// this callback does not contain details of the position at which the + /// pointer initially contacted the screen. + /// + /// See also: + /// + /// * [kSecondaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onSecondaryLongPress], which exposes + /// this callback at the gesture layer. + final GestureLongPressCallback? onSecondaryLongPress; + + /// Called when a long press gesture with a secondary button has been + /// recognized. + /// + /// Triggered when a pointer has remained in contact with the screen at the + /// same location for a long period of time. + /// + /// This is equivalent to (and is called immediately before) + /// [onSecondaryLongPress]. The only difference between the two is that this + /// callback contains details of the position at which the pointer initially + /// contacted the screen, whereas [onSecondaryLongPress] does not. + /// + /// See also: + /// + /// * [kSecondaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onSecondaryLongPressStart], which exposes + /// this callback at the gesture layer. + final GestureLongPressStartCallback? onSecondaryLongPressStart; + + /// A pointer has been drag-moved after a long press with a secondary button. + /// + /// See also: + /// + /// * [kSecondaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onSecondaryLongPressMoveUpdate], which exposes + /// this callback at the gesture layer. + final GestureLongPressMoveUpdateCallback? onSecondaryLongPressMoveUpdate; + + /// A pointer that has triggered a long-press with a secondary button has + /// stopped contacting the screen. + /// + /// This is equivalent to (and is called immediately after) + /// [onSecondaryLongPressEnd]. The only difference between the two is that + /// this callback does not contain details of the state of the pointer when + /// it stopped contacting the screen. + /// + /// See also: + /// + /// * [kSecondaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onSecondaryLongPressUp], which exposes + /// this callback at the gesture layer. + final GestureLongPressUpCallback? onSecondaryLongPressUp; + + /// A pointer that has triggered a long-press with a secondary button has + /// stopped contacting the screen. + /// + /// This is equivalent to (and is called immediately before) + /// [onSecondaryLongPressUp]. The only difference between the two is that + /// this callback contains details of the state of the pointer when it + /// stopped contacting the screen, whereas [onSecondaryLongPressUp] does not. + /// + /// See also: + /// + /// * [kSecondaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onSecondaryLongPressEnd], which exposes + /// this callback at the gesture layer. + final GestureLongPressEndCallback? onSecondaryLongPressEnd; + + /// The pointer has contacted the screen with a tertiary button, which might + /// be the start of a long-press. + /// + /// This triggers after the pointer down event. + /// + /// If the user completes the long-press, and this gesture wins, + /// [onTertiaryLongPressStart] will be called after this callback. Otherwise, + /// [onTertiaryLongPressCancel] will be called after this callback. + /// + /// See also: + /// + /// * [kTertiaryButton], the button this callback responds to. + /// * [onLongPressDown], a similar callback but for a primary button. + /// * [onSecondaryLongPressDown], a similar callback but for a secondary button. + /// * [LongPressGestureRecognizer.onTertiaryLongPressDown], which exposes + /// this callback at the gesture layer. + final GestureLongPressDownCallback? onTertiaryLongPressDown; + + /// A pointer that previously triggered [onTertiaryLongPressDown] will not + /// end up causing a long-press. + /// + /// This triggers once the gesture loses if [onTertiaryLongPressDown] has + /// previously been triggered. + /// + /// If the user completed the long-press, and the gesture won, then + /// [onTertiaryLongPressStart] and [onTertiaryLongPress] are called instead. + /// + /// See also: + /// + /// * [kTertiaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onTertiaryLongPressCancel], which exposes + /// this callback at the gesture layer. + final GestureLongPressCancelCallback? onTertiaryLongPressCancel; + + /// Called when a long press gesture with a tertiary button has been + /// recognized. + /// + /// Triggered when a pointer has remained in contact with the screen at the + /// same location for a long period of time. + /// + /// This is equivalent to (and is called immediately after) + /// [onTertiaryLongPressStart]. The only difference between the two is that + /// this callback does not contain details of the position at which the + /// pointer initially contacted the screen. + /// + /// See also: + /// + /// * [kTertiaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onTertiaryLongPress], which exposes + /// this callback at the gesture layer. + final GestureLongPressCallback? onTertiaryLongPress; + + /// Called when a long press gesture with a tertiary button has been + /// recognized. + /// + /// Triggered when a pointer has remained in contact with the screen at the + /// same location for a long period of time. + /// + /// This is equivalent to (and is called immediately before) + /// [onTertiaryLongPress]. The only difference between the two is that this + /// callback contains details of the position at which the pointer initially + /// contacted the screen, whereas [onTertiaryLongPress] does not. + /// + /// See also: + /// + /// * [kTertiaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onTertiaryLongPressStart], which exposes + /// this callback at the gesture layer. + final GestureLongPressStartCallback? onTertiaryLongPressStart; + + /// A pointer has been drag-moved after a long press with a tertiary button. + /// + /// See also: + /// + /// * [kTertiaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onTertiaryLongPressMoveUpdate], which exposes + /// this callback at the gesture layer. + final GestureLongPressMoveUpdateCallback? onTertiaryLongPressMoveUpdate; + + /// A pointer that has triggered a long-press with a tertiary button has + /// stopped contacting the screen. + /// + /// This is equivalent to (and is called immediately after) + /// [onTertiaryLongPressEnd]. The only difference between the two is that + /// this callback does not contain details of the state of the pointer when + /// it stopped contacting the screen. + /// + /// See also: + /// + /// * [kTertiaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onTertiaryLongPressUp], which exposes + /// this callback at the gesture layer. + final GestureLongPressUpCallback? onTertiaryLongPressUp; + + /// A pointer that has triggered a long-press with a tertiary button has + /// stopped contacting the screen. + /// + /// This is equivalent to (and is called immediately before) + /// [onTertiaryLongPressUp]. The only difference between the two is that + /// this callback contains details of the state of the pointer when it + /// stopped contacting the screen, whereas [onTertiaryLongPressUp] does not. + /// + /// See also: + /// + /// * [kTertiaryButton], the button this callback responds to. + /// * [LongPressGestureRecognizer.onTertiaryLongPressEnd], which exposes + /// this callback at the gesture layer. + final GestureLongPressEndCallback? onTertiaryLongPressEnd; + + /// A pointer has contacted the screen with a primary button and might begin + /// to move vertically. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragDownCallback? onVerticalDragDown; + + /// A pointer has contacted the screen with a primary button and has begun to + /// move vertically. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragStartCallback? onVerticalDragStart; + + /// A pointer that is in contact with the screen with a primary button and + /// moving vertically has moved in the vertical direction. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragUpdateCallback? onVerticalDragUpdate; + + /// A pointer that was previously in contact with the screen with a primary + /// button and moving vertically is no longer in contact with the screen and + /// was moving at a specific velocity when it stopped contacting the screen. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragEndCallback? onVerticalDragEnd; + + /// The pointer that previously triggered [onVerticalDragDown] did not + /// complete. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragCancelCallback? onVerticalDragCancel; + + /// A pointer has contacted the screen with a primary button and might begin + /// to move horizontally. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragDownCallback? onHorizontalDragDown; + + /// A pointer has contacted the screen with a primary button and has begun to + /// move horizontally. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragStartCallback? onHorizontalDragStart; + + /// A pointer that is in contact with the screen with a primary button and + /// moving horizontally has moved in the horizontal direction. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragUpdateCallback? onHorizontalDragUpdate; + + /// A pointer that was previously in contact with the screen with a primary + /// button and moving horizontally is no longer in contact with the screen and + /// was moving at a specific velocity when it stopped contacting the screen. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragEndCallback? onHorizontalDragEnd; + + /// The pointer that previously triggered [onHorizontalDragDown] did not + /// complete. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragCancelCallback? onHorizontalDragCancel; + + /// A pointer has contacted the screen with a primary button and might begin + /// to move. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragDownCallback? onPanDown; + + /// A pointer has contacted the screen with a primary button and has begun to + /// move. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragStartCallback? onPanStart; + + /// A pointer that is in contact with the screen with a primary button and + /// moving has moved again. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragUpdateCallback? onPanUpdate; + + /// A pointer that was previously in contact with the screen with a primary + /// button and moving is no longer in contact with the screen and was moving + /// at a specific velocity when it stopped contacting the screen. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragEndCallback? onPanEnd; + + /// The pointer that previously triggered [onPanDown] did not complete. + /// + /// See also: + /// + /// * [kPrimaryButton], the button this callback responds to. + final GestureDragCancelCallback? onPanCancel; + + /// The pointers in contact with the screen have established a focal point and + /// initial scale of 1.0. + final GestureScaleStartCallback? onScaleStart; + + /// The pointers in contact with the screen have indicated a new focal point + /// and/or scale. + final GestureScaleUpdateCallback? onScaleUpdate; + + /// The pointers are no longer in contact with the screen. + final GestureScaleEndCallback? onScaleEnd; + + /// The pointer is in contact with the screen and has pressed with sufficient + /// force to initiate a force press. The amount of force is at least + /// [ForcePressGestureRecognizer.startPressure]. + /// + /// This callback will only be fired on devices with pressure + /// detecting screens. + final GestureForcePressStartCallback? onForcePressStart; + + /// The pointer is in contact with the screen and has pressed with the maximum + /// force. The amount of force is at least + /// [ForcePressGestureRecognizer.peakPressure]. + /// + /// This callback will only be fired on devices with pressure + /// detecting screens. + final GestureForcePressPeakCallback? onForcePressPeak; + + /// A pointer is in contact with the screen, has previously passed the + /// [ForcePressGestureRecognizer.startPressure] and is either moving on the + /// plane of the screen, pressing the screen with varying forces or both + /// simultaneously. + /// + /// This callback will only be fired on devices with pressure + /// detecting screens. + final GestureForcePressUpdateCallback? onForcePressUpdate; + + /// The pointer tracked by [onForcePressStart] is no longer in contact with the screen. + /// + /// This callback will only be fired on devices with pressure + /// detecting screens. + final GestureForcePressEndCallback? onForcePressEnd; + + /// How this gesture detector should behave during hit testing when deciding + /// how the hit test propagates to children and whether to consider targets + /// behind this one. + /// + /// This defaults to [HitTestBehavior.deferToChild] if [child] is not null and + /// [HitTestBehavior.translucent] if child is null. + /// + /// See [HitTestBehavior] for the allowed values and their meanings. + final HitTestBehavior? behavior; + + /// Whether to exclude these gestures from the semantics tree. For + /// example, the long-press gesture for showing a tooltip is + /// excluded because the tooltip itself is included in the semantics + /// tree directly and so having a gesture to show it would result in + /// duplication of information. + final bool excludeFromSemantics; + + /// Determines the way that drag start behavior is handled. + /// + /// If set to [DragStartBehavior.start], gesture drag behavior will + /// begin at the position where the drag gesture won the arena. If set to + /// [DragStartBehavior.down] it will begin at the position where a down event + /// is first detected. + /// + /// In general, setting this to [DragStartBehavior.start] will make drag + /// animation smoother and setting it to [DragStartBehavior.down] will make + /// drag behavior feel slightly more reactive. + /// + /// By default, the drag start behavior is [DragStartBehavior.start]. + /// + /// Only the [DragGestureRecognizer.onStart] callbacks for the + /// [VerticalDragGestureRecognizer], [HorizontalDragGestureRecognizer] and + /// [PanGestureRecognizer] are affected by this setting. + /// + /// See also: + /// + /// * [DragGestureRecognizer.dragStartBehavior], which gives an example for the different behaviors. + final DragStartBehavior dragStartBehavior; + + /// The kind of devices that are allowed to be recognized. + /// + /// If set to null, events from all device types will be recognized. Defaults to null. + final Set<PointerDeviceKind>? supportedDevices; + + /// {@macro flutter.gestures.scale.trackpadScrollCausesScale} + final bool trackpadScrollCausesScale; + + /// {@macro flutter.gestures.scale.trackpadScrollToScaleFactor} + final Offset trackpadScrollToScaleFactor; + + final Duration longPressTimeout; + + @override + Widget build(BuildContext context) { + final Map<Type, GestureRecognizerFactory> gestures = <Type, GestureRecognizerFactory>{}; + final DeviceGestureSettings? gestureSettings = MediaQuery.maybeGestureSettingsOf(context); + final ScrollBehavior configuration = ScrollConfiguration.of(context); + + if (onTapDown != null || + onTapUp != null || + onTap != null || + onTapCancel != null || + onSecondaryTap != null || + onSecondaryTapDown != null || + onSecondaryTapUp != null || + onSecondaryTapCancel != null || + onTertiaryTapDown != null || + onTertiaryTapUp != null || + onTertiaryTapCancel != null) { + gestures[TapGestureRecognizer] = GestureRecognizerFactoryWithHandlers<TapGestureRecognizer>( + () => TapGestureRecognizer(debugOwner: this, supportedDevices: supportedDevices), + (instance) { + instance + ..onTapDown = onTapDown + ..onTapUp = onTapUp + ..onTap = onTap + ..onTapCancel = onTapCancel + ..onSecondaryTap = onSecondaryTap + ..onSecondaryTapDown = onSecondaryTapDown + ..onSecondaryTapUp = onSecondaryTapUp + ..onSecondaryTapCancel = onSecondaryTapCancel + ..onTertiaryTapDown = onTertiaryTapDown + ..onTertiaryTapUp = onTertiaryTapUp + ..onTertiaryTapCancel = onTertiaryTapCancel + ..gestureSettings = gestureSettings + ..supportedDevices = supportedDevices; + }, + ); + } + + if (onDoubleTap != null || onDoubleTapDown != null || onDoubleTapCancel != null) { + gestures[DoubleTapGestureRecognizer] = GestureRecognizerFactoryWithHandlers<DoubleTapGestureRecognizer>( + () => DoubleTapGestureRecognizer(debugOwner: this, supportedDevices: supportedDevices), + (instance) { + instance + ..onDoubleTapDown = onDoubleTapDown + ..onDoubleTap = onDoubleTap + ..onDoubleTapCancel = onDoubleTapCancel + ..gestureSettings = gestureSettings + ..supportedDevices = supportedDevices; + }, + ); + } + + if (onLongPressDown != null || + onLongPressCancel != null || + onLongPress != null || + onLongPressStart != null || + onLongPressMoveUpdate != null || + onLongPressUp != null || + onLongPressEnd != null || + onSecondaryLongPressDown != null || + onSecondaryLongPressCancel != null || + onSecondaryLongPress != null || + onSecondaryLongPressStart != null || + onSecondaryLongPressMoveUpdate != null || + onSecondaryLongPressUp != null || + onSecondaryLongPressEnd != null || + onTertiaryLongPressDown != null || + onTertiaryLongPressCancel != null || + onTertiaryLongPress != null || + onTertiaryLongPressStart != null || + onTertiaryLongPressMoveUpdate != null || + onTertiaryLongPressUp != null || + onTertiaryLongPressEnd != null) { + gestures[LongPressGestureRecognizer] = GestureRecognizerFactoryWithHandlers<LongPressGestureRecognizer>( + () => LongPressGestureRecognizer(duration: longPressTimeout, debugOwner: this, supportedDevices: supportedDevices), + (instance) { + instance + ..onLongPressDown = onLongPressDown + ..onLongPressCancel = onLongPressCancel + ..onLongPress = onLongPress + ..onLongPressStart = onLongPressStart + ..onLongPressMoveUpdate = onLongPressMoveUpdate + ..onLongPressUp = onLongPressUp + ..onLongPressEnd = onLongPressEnd + ..onSecondaryLongPressDown = onSecondaryLongPressDown + ..onSecondaryLongPressCancel = onSecondaryLongPressCancel + ..onSecondaryLongPress = onSecondaryLongPress + ..onSecondaryLongPressStart = onSecondaryLongPressStart + ..onSecondaryLongPressMoveUpdate = onSecondaryLongPressMoveUpdate + ..onSecondaryLongPressUp = onSecondaryLongPressUp + ..onSecondaryLongPressEnd = onSecondaryLongPressEnd + ..onTertiaryLongPressDown = onTertiaryLongPressDown + ..onTertiaryLongPressCancel = onTertiaryLongPressCancel + ..onTertiaryLongPress = onTertiaryLongPress + ..onTertiaryLongPressStart = onTertiaryLongPressStart + ..onTertiaryLongPressMoveUpdate = onTertiaryLongPressMoveUpdate + ..onTertiaryLongPressUp = onTertiaryLongPressUp + ..onTertiaryLongPressEnd = onTertiaryLongPressEnd + ..gestureSettings = gestureSettings + ..supportedDevices = supportedDevices; + }, + ); + } + + if (onVerticalDragDown != null || onVerticalDragStart != null || onVerticalDragUpdate != null || onVerticalDragEnd != null || onVerticalDragCancel != null) { + gestures[VerticalDragGestureRecognizer] = GestureRecognizerFactoryWithHandlers<VerticalDragGestureRecognizer>( + () => VerticalDragGestureRecognizer(debugOwner: this, supportedDevices: supportedDevices), + (instance) { + instance + ..onDown = onVerticalDragDown + ..onStart = onVerticalDragStart + ..onUpdate = onVerticalDragUpdate + ..onEnd = onVerticalDragEnd + ..onCancel = onVerticalDragCancel + ..dragStartBehavior = dragStartBehavior + ..multitouchDragStrategy = configuration.getMultitouchDragStrategy(context) + ..gestureSettings = gestureSettings + ..supportedDevices = supportedDevices; + }, + ); + } + + if (onHorizontalDragDown != null || onHorizontalDragStart != null || onHorizontalDragUpdate != null || onHorizontalDragEnd != null || onHorizontalDragCancel != null) { + gestures[HorizontalDragGestureRecognizer] = GestureRecognizerFactoryWithHandlers<HorizontalDragGestureRecognizer>( + () => HorizontalDragGestureRecognizer(debugOwner: this, supportedDevices: supportedDevices), + (instance) { + instance + ..onDown = onHorizontalDragDown + ..onStart = onHorizontalDragStart + ..onUpdate = onHorizontalDragUpdate + ..onEnd = onHorizontalDragEnd + ..onCancel = onHorizontalDragCancel + ..dragStartBehavior = dragStartBehavior + ..multitouchDragStrategy = configuration.getMultitouchDragStrategy(context) + ..gestureSettings = gestureSettings + ..supportedDevices = supportedDevices; + }, + ); + } + + if (onPanDown != null || onPanStart != null || onPanUpdate != null || onPanEnd != null || onPanCancel != null) { + gestures[PanGestureRecognizer] = GestureRecognizerFactoryWithHandlers<PanGestureRecognizer>( + () => PanGestureRecognizer(debugOwner: this, supportedDevices: supportedDevices), + (instance) { + instance + ..onDown = onPanDown + ..onStart = onPanStart + ..onUpdate = onPanUpdate + ..onEnd = onPanEnd + ..onCancel = onPanCancel + ..dragStartBehavior = dragStartBehavior + ..multitouchDragStrategy = configuration.getMultitouchDragStrategy(context) + ..gestureSettings = gestureSettings + ..supportedDevices = supportedDevices; + }, + ); + } + + if (onScaleStart != null || onScaleUpdate != null || onScaleEnd != null) { + gestures[ScaleGestureRecognizer] = GestureRecognizerFactoryWithHandlers<ScaleGestureRecognizer>( + () => ScaleGestureRecognizer(debugOwner: this, supportedDevices: supportedDevices), + (instance) { + instance + ..onStart = onScaleStart + ..onUpdate = onScaleUpdate + ..onEnd = onScaleEnd + ..dragStartBehavior = dragStartBehavior + ..gestureSettings = gestureSettings + ..trackpadScrollCausesScale = trackpadScrollCausesScale + ..trackpadScrollToScaleFactor = trackpadScrollToScaleFactor + ..supportedDevices = supportedDevices; + }, + ); + } + + if (onForcePressStart != null || onForcePressPeak != null || onForcePressUpdate != null || onForcePressEnd != null) { + gestures[ForcePressGestureRecognizer] = GestureRecognizerFactoryWithHandlers<ForcePressGestureRecognizer>( + () => ForcePressGestureRecognizer(debugOwner: this, supportedDevices: supportedDevices), + (instance) { + instance + ..onStart = onForcePressStart + ..onPeak = onForcePressPeak + ..onUpdate = onForcePressUpdate + ..onEnd = onForcePressEnd + ..gestureSettings = gestureSettings + ..supportedDevices = supportedDevices; + }, + ); + } + + return RawGestureDetector( + gestures: gestures, + behavior: behavior, + excludeFromSemantics: excludeFromSemantics, + child: child, + ); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(EnumProperty<DragStartBehavior>('startBehavior', dragStartBehavior)); + } +} diff --git a/lib/widgets/common/basic/gestures/ink_well.dart b/lib/widgets/common/basic/gestures/ink_well.dart new file mode 100644 index 0000000..f3da864 --- /dev/null +++ b/lib/widgets/common/basic/gestures/ink_well.dart @@ -0,0 +1,1092 @@ +import 'dart:async'; +import 'dart:collection'; + +import 'package:aves/widgets/common/basic/gestures/gesture_detector.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +// as of Flutter v3.27.1, `InkResponse` does not allow setting long press delay +// adapted from Flutter `InkResponse` and related classes in `/material/ink_well.dart` +class AInkResponse extends StatelessWidget { + /// Creates an area of a [Material] that responds to touch. + /// + /// Must have an ancestor [Material] widget in which to cause ink reactions. + const AInkResponse({ + super.key, + this.child, + this.onTap, + this.onTapDown, + this.onTapUp, + this.onTapCancel, + this.onDoubleTap, + this.onLongPress, + this.onSecondaryTap, + this.onSecondaryTapUp, + this.onSecondaryTapDown, + this.onSecondaryTapCancel, + this.onHighlightChanged, + this.onHover, + this.mouseCursor, + this.containedInkWell = false, + this.highlightShape = BoxShape.circle, + this.radius, + this.borderRadius, + this.customBorder, + this.focusColor, + this.hoverColor, + this.highlightColor, + this.overlayColor, + this.splashColor, + this.splashFactory, + this.enableFeedback = true, + this.excludeFromSemantics = false, + this.focusNode, + this.canRequestFocus = true, + this.onFocusChange, + this.autofocus = false, + this.statesController, + this.hoverDuration, + this.longPressTimeout = kLongPressTimeout, + }); + + /// The widget below this widget in the tree. + /// + /// {@macro flutter.widgets.ProxyWidget.child} + final Widget? child; + + /// Called when the user taps this part of the material. + final GestureTapCallback? onTap; + + /// Called when the user taps down this part of the material. + final GestureTapDownCallback? onTapDown; + + /// Called when the user releases a tap that was started on this part of the + /// material. [onTap] is called immediately after. + final GestureTapUpCallback? onTapUp; + + /// Called when the user cancels a tap that was started on this part of the + /// material. + final GestureTapCallback? onTapCancel; + + /// Called when the user double taps this part of the material. + final GestureTapCallback? onDoubleTap; + + /// Called when the user long-presses on this part of the material. + final GestureLongPressCallback? onLongPress; + + /// Called when the user taps this part of the material with a secondary button. + final GestureTapCallback? onSecondaryTap; + + /// Called when the user taps down on this part of the material with a + /// secondary button. + final GestureTapDownCallback? onSecondaryTapDown; + + /// Called when the user releases a secondary button tap that was started on + /// this part of the material. [onSecondaryTap] is called immediately after. + final GestureTapUpCallback? onSecondaryTapUp; + + /// Called when the user cancels a secondary button tap that was started on + /// this part of the material. + final GestureTapCallback? onSecondaryTapCancel; + + /// Called when this part of the material either becomes highlighted or stops + /// being highlighted. + /// + /// The value passed to the callback is true if this part of the material has + /// become highlighted and false if this part of the material has stopped + /// being highlighted. + /// + /// If all of [onTap], [onDoubleTap], and [onLongPress] become null while a + /// gesture is ongoing, then [onTapCancel] will be fired and + /// [onHighlightChanged] will be fired with the value false _during the + /// build_. This means, for instance, that in that scenario [State.setState] + /// cannot be called. + final ValueChanged<bool>? onHighlightChanged; + + /// Called when a pointer enters or exits the ink response area. + /// + /// The value passed to the callback is true if a pointer has entered this + /// part of the material and false if a pointer has exited this part of the + /// material. + final ValueChanged<bool>? onHover; + + /// The cursor for a mouse pointer when it enters or is hovering over the + /// widget. + /// + /// If [mouseCursor] is a [WidgetStateProperty<MouseCursor>], + /// [WidgetStateProperty.resolve] is used for the following [WidgetState]s: + /// + /// * [WidgetState.hovered]. + /// * [WidgetState.focused]. + /// * [WidgetState.disabled]. + /// + /// If this property is null, [WidgetStateMouseCursor.clickable] will be used. + final MouseCursor? mouseCursor; + + /// Whether this ink response should be clipped its bounds. + /// + /// This flag also controls whether the splash migrates to the center of the + /// [InkResponse] or not. If [containedInkWell] is true, the splash remains + /// centered around the tap location. If it is false, the splash migrates to + /// the center of the [InkResponse] as it grows. + /// + /// See also: + /// + /// * [highlightShape], the shape of the focus, hover, and pressed + /// highlights. + /// * [borderRadius], which controls the corners when the box is a rectangle. + /// * [getRectCallback], which controls the size and position of the box when + /// it is a rectangle. + final bool containedInkWell; + + /// The shape (e.g., circle, rectangle) to use for the highlight drawn around + /// this part of the material when pressed, hovered over, or focused. + /// + /// The same shape is used for the pressed highlight (see [highlightColor]), + /// the focus highlight (see [focusColor]), and the hover highlight (see + /// [hoverColor]). + /// + /// If the shape is [BoxShape.circle], then the highlight is centered on the + /// [InkResponse]. If the shape is [BoxShape.rectangle], then the highlight + /// fills the [InkResponse], or the rectangle provided by [getRectCallback] if + /// the callback is specified. + /// + /// See also: + /// + /// * [containedInkWell], which controls clipping behavior. + /// * [borderRadius], which controls the corners when the box is a rectangle. + /// * [highlightColor], the color of the highlight. + /// * [getRectCallback], which controls the size and position of the box when + /// it is a rectangle. + final BoxShape highlightShape; + + /// The radius of the ink splash. + /// + /// Splashes grow up to this size. By default, this size is determined from + /// the size of the rectangle provided by [getRectCallback], or the size of + /// the [InkResponse] itself. + /// + /// See also: + /// + /// * [splashColor], the color of the splash. + /// * [splashFactory], which defines the appearance of the splash. + final double? radius; + + /// The border radius of the containing rectangle. This is effective only if + /// [highlightShape] is [BoxShape.rectangle]. + /// + /// If this is null, it is interpreted as [BorderRadius.zero]. + final BorderRadius? borderRadius; + + /// The custom clip border. + /// + /// If this is null, the ink response will not clip its content. + final ShapeBorder? customBorder; + + /// The color of the ink response when the parent widget is focused. If this + /// property is null then the focus color of the theme, + /// [ThemeData.focusColor], will be used. + /// + /// See also: + /// + /// * [highlightShape], the shape of the focus, hover, and pressed + /// highlights. + /// * [hoverColor], the color of the hover highlight. + /// * [splashColor], the color of the splash. + /// * [splashFactory], which defines the appearance of the splash. + final Color? focusColor; + + /// The color of the ink response when a pointer is hovering over it. If this + /// property is null then the hover color of the theme, + /// [ThemeData.hoverColor], will be used. + /// + /// See also: + /// + /// * [highlightShape], the shape of the focus, hover, and pressed + /// highlights. + /// * [highlightColor], the color of the pressed highlight. + /// * [focusColor], the color of the focus highlight. + /// * [splashColor], the color of the splash. + /// * [splashFactory], which defines the appearance of the splash. + final Color? hoverColor; + + /// The highlight color of the ink response when pressed. If this property is + /// null then the highlight color of the theme, [ThemeData.highlightColor], + /// will be used. + /// + /// See also: + /// + /// * [hoverColor], the color of the hover highlight. + /// * [focusColor], the color of the focus highlight. + /// * [highlightShape], the shape of the focus, hover, and pressed + /// highlights. + /// * [splashColor], the color of the splash. + /// * [splashFactory], which defines the appearance of the splash. + final Color? highlightColor; + + /// Defines the ink response focus, hover, and splash colors. + /// + /// This default null property can be used as an alternative to + /// [focusColor], [hoverColor], [highlightColor], and + /// [splashColor]. If non-null, it is resolved against one of + /// [WidgetState.focused], [WidgetState.hovered], and + /// [WidgetState.pressed]. It's convenient to use when the parent + /// widget can pass along its own WidgetStateProperty value for + /// the overlay color. + /// + /// [WidgetState.pressed] triggers a ripple (an ink splash), per + /// the current Material Design spec. The [overlayColor] doesn't map + /// a state to [highlightColor] because a separate highlight is not + /// used by the current design guidelines. See + /// https://material.io/design/interaction/states.html#pressed + /// + /// If the overlay color is null or resolves to null, then [focusColor], + /// [hoverColor], [splashColor] and their defaults are used instead. + /// + /// See also: + /// + /// * The Material Design specification for overlay colors and how they + /// match a component's state: + /// <https://material.io/design/interaction/states.html#anatomy>. + final WidgetStateProperty<Color?>? overlayColor; + + /// The splash color of the ink response. If this property is null then the + /// splash color of the theme, [ThemeData.splashColor], will be used. + /// + /// See also: + /// + /// * [splashFactory], which defines the appearance of the splash. + /// * [radius], the (maximum) size of the ink splash. + /// * [highlightColor], the color of the highlight. + final Color? splashColor; + + /// Defines the appearance of the splash. + /// + /// Defaults to the value of the theme's splash factory: [ThemeData.splashFactory]. + /// + /// See also: + /// + /// * [radius], the (maximum) size of the ink splash. + /// * [splashColor], the color of the splash. + /// * [highlightColor], the color of the highlight. + /// * [InkSplash.splashFactory], which defines the default splash. + /// * [InkRipple.splashFactory], which defines a splash that spreads out + /// more aggressively than the default. + final InteractiveInkFeatureFactory? splashFactory; + + /// Whether detected gestures should provide acoustic and/or haptic feedback. + /// + /// For example, on Android a tap will produce a clicking sound and a + /// long-press will produce a short vibration, when feedback is enabled. + /// + /// See also: + /// + /// * [Feedback] for providing platform-specific feedback to certain actions. + final bool enableFeedback; + + /// Whether to exclude the gestures introduced by this widget from the + /// semantics tree. + /// + /// For example, a long-press gesture for showing a tooltip is usually + /// excluded because the tooltip itself is included in the semantics + /// tree directly and so having a gesture to show it would result in + /// duplication of information. + final bool excludeFromSemantics; + + /// {@template flutter.material.inkwell.onFocusChange} + /// Handler called when the focus changes. + /// + /// Called with true if this widget's node gains focus, and false if it loses + /// focus. + /// {@endtemplate} + final ValueChanged<bool>? onFocusChange; + + /// {@macro flutter.widgets.Focus.autofocus} + final bool autofocus; + + /// {@macro flutter.widgets.Focus.focusNode} + final FocusNode? focusNode; + + /// {@macro flutter.widgets.Focus.canRequestFocus} + final bool canRequestFocus; + + /// The rectangle to use for the highlight effect and for clipping + /// the splash effects if [containedInkWell] is true. + /// + /// This method is intended to be overridden by descendants that + /// specialize [InkResponse] for unusual cases. For example, + /// [TableRowInkWell] implements this method to return the rectangle + /// corresponding to the row that the widget is in. + /// + /// The default behavior returns null, which is equivalent to + /// returning the referenceBox argument's bounding box (though + /// slightly more efficient). + RectCallback? getRectCallback(RenderBox referenceBox) => null; + + /// {@template flutter.material.inkwell.statesController} + /// Represents the interactive "state" of this widget in terms of + /// a set of [WidgetState]s, like [WidgetState.pressed] and + /// [WidgetState.focused]. + /// + /// Classes based on this one can provide their own + /// [WidgetStatesController] to which they've added listeners. + /// They can also update the controller's [WidgetStatesController.value] + /// however, this may only be done when it's safe to call + /// [State.setState], like in an event handler. + /// {@endtemplate} + final WidgetStatesController? statesController; + + /// The duration of the animation that animates the hover effect. + /// + /// The default is 50ms. + final Duration? hoverDuration; + + final Duration longPressTimeout; + + @override + Widget build(BuildContext context) { + final _ParentInkResponseState? parentState = _ParentInkResponseProvider.maybeOf(context); + return _InkResponseStateWidget( + onTap: onTap, + onTapDown: onTapDown, + onTapUp: onTapUp, + onTapCancel: onTapCancel, + onDoubleTap: onDoubleTap, + onLongPress: onLongPress, + onSecondaryTap: onSecondaryTap, + onSecondaryTapUp: onSecondaryTapUp, + onSecondaryTapDown: onSecondaryTapDown, + onSecondaryTapCancel: onSecondaryTapCancel, + onHighlightChanged: onHighlightChanged, + onHover: onHover, + mouseCursor: mouseCursor, + containedInkWell: containedInkWell, + highlightShape: highlightShape, + radius: radius, + borderRadius: borderRadius, + customBorder: customBorder, + focusColor: focusColor, + hoverColor: hoverColor, + highlightColor: highlightColor, + overlayColor: overlayColor, + splashColor: splashColor, + splashFactory: splashFactory, + enableFeedback: enableFeedback, + excludeFromSemantics: excludeFromSemantics, + focusNode: focusNode, + canRequestFocus: canRequestFocus, + onFocusChange: onFocusChange, + autofocus: autofocus, + parentState: parentState, + getRectCallback: getRectCallback, + debugCheckContext: debugCheckContext, + statesController: statesController, + hoverDuration: hoverDuration, + longPressTimeout: longPressTimeout, + child: child, + ); + } + + /// Asserts that the given context satisfies the prerequisites for + /// this class. + /// + /// This method is intended to be overridden by descendants that + /// specialize [InkResponse] for unusual cases. For example, + /// [TableRowInkWell] implements this method to verify that the widget is + /// in a table. + @mustCallSuper + bool debugCheckContext(BuildContext context) { + assert(debugCheckHasMaterial(context)); + assert(debugCheckHasDirectionality(context)); + return true; + } +} + +abstract class _ParentInkResponseState { + void markChildInkResponsePressed(_ParentInkResponseState childState, bool value); +} + +class _ParentInkResponseProvider extends InheritedWidget { + const _ParentInkResponseProvider({ + required this.state, + required super.child, + }); + + final _ParentInkResponseState state; + + @override + bool updateShouldNotify(_ParentInkResponseProvider oldWidget) => state != oldWidget.state; + + static _ParentInkResponseState? maybeOf(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType<_ParentInkResponseProvider>()?.state; + } +} + +typedef _GetRectCallback = RectCallback? Function(RenderBox referenceBox); +typedef _CheckContext = bool Function(BuildContext context); + +class _InkResponseStateWidget extends StatefulWidget { + const _InkResponseStateWidget({ + this.child, + this.onTap, + this.onTapDown, + this.onTapUp, + this.onTapCancel, + this.onDoubleTap, + this.onLongPress, + this.onSecondaryTap, + this.onSecondaryTapUp, + this.onSecondaryTapDown, + this.onSecondaryTapCancel, + this.onHighlightChanged, + this.onHover, + this.mouseCursor, + this.containedInkWell = false, + this.highlightShape = BoxShape.circle, + this.radius, + this.borderRadius, + this.customBorder, + this.focusColor, + this.hoverColor, + this.highlightColor, + this.overlayColor, + this.splashColor, + this.splashFactory, + this.enableFeedback = true, + this.excludeFromSemantics = false, + this.focusNode, + this.canRequestFocus = true, + this.onFocusChange, + this.autofocus = false, + this.parentState, + this.getRectCallback, + required this.debugCheckContext, + this.statesController, + this.hoverDuration, + required this.longPressTimeout, + }); + + final Widget? child; + final GestureTapCallback? onTap; + final GestureTapDownCallback? onTapDown; + final GestureTapUpCallback? onTapUp; + final GestureTapCallback? onTapCancel; + final GestureTapCallback? onDoubleTap; + final GestureLongPressCallback? onLongPress; + final GestureTapCallback? onSecondaryTap; + final GestureTapUpCallback? onSecondaryTapUp; + final GestureTapDownCallback? onSecondaryTapDown; + final GestureTapCallback? onSecondaryTapCancel; + final ValueChanged<bool>? onHighlightChanged; + final ValueChanged<bool>? onHover; + final MouseCursor? mouseCursor; + final bool containedInkWell; + final BoxShape highlightShape; + final double? radius; + final BorderRadius? borderRadius; + final ShapeBorder? customBorder; + final Color? focusColor; + final Color? hoverColor; + final Color? highlightColor; + final WidgetStateProperty<Color?>? overlayColor; + final Color? splashColor; + final InteractiveInkFeatureFactory? splashFactory; + final bool enableFeedback; + final bool excludeFromSemantics; + final ValueChanged<bool>? onFocusChange; + final bool autofocus; + final FocusNode? focusNode; + final bool canRequestFocus; + final _ParentInkResponseState? parentState; + final _GetRectCallback? getRectCallback; + final _CheckContext debugCheckContext; + final WidgetStatesController? statesController; + final Duration? hoverDuration; + final Duration longPressTimeout; + + @override + _InkResponseState createState() => _InkResponseState(); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + final List<String> gestures = <String>[ + if (onTap != null) 'tap', + if (onDoubleTap != null) 'double tap', + if (onLongPress != null) 'long press', + if (onTapDown != null) 'tap down', + if (onTapUp != null) 'tap up', + if (onTapCancel != null) 'tap cancel', + if (onSecondaryTap != null) 'secondary tap', + if (onSecondaryTapUp != null) 'secondary tap up', + if (onSecondaryTapDown != null) 'secondary tap down', + if (onSecondaryTapCancel != null) 'secondary tap cancel', + ]; + properties.add(IterableProperty<String>('gestures', gestures, ifEmpty: '<none>')); + properties.add(DiagnosticsProperty<MouseCursor>('mouseCursor', mouseCursor)); + properties.add(DiagnosticsProperty<bool>('containedInkWell', containedInkWell, level: DiagnosticLevel.fine)); + properties.add( + DiagnosticsProperty<BoxShape>( + 'highlightShape', + highlightShape, + description: '${containedInkWell ? "clipped to " : ""}$highlightShape', + showName: false, + ), + ); + } +} + +/// Used to index the allocated highlights for the different types of highlights +/// in [_InkResponseState]. +enum _HighlightType { + pressed, + hover, + focus, +} + +class _InkResponseState extends State<_InkResponseStateWidget> with AutomaticKeepAliveClientMixin<_InkResponseStateWidget> implements _ParentInkResponseState { + Set<InteractiveInkFeature>? _splashes; + InteractiveInkFeature? _currentSplash; + bool _hovering = false; + final Map<_HighlightType, InkHighlight?> _highlights = <_HighlightType, InkHighlight?>{}; + late final Map<Type, Action<Intent>> _actionMap = <Type, Action<Intent>>{ + ActivateIntent: CallbackAction<ActivateIntent>(onInvoke: activateOnIntent), + ButtonActivateIntent: CallbackAction<ButtonActivateIntent>(onInvoke: activateOnIntent), + }; + WidgetStatesController? internalStatesController; + + bool get highlightsExist => _highlights.values.where((highlight) => highlight != null).isNotEmpty; + + final ObserverList<_ParentInkResponseState> _activeChildren = ObserverList<_ParentInkResponseState>(); + + static const Duration _activationDuration = Duration(milliseconds: 100); + Timer? _activationTimer; + + @override + void markChildInkResponsePressed(_ParentInkResponseState childState, bool value) { + final bool lastAnyPressed = _anyChildInkResponsePressed; + if (value) { + _activeChildren.add(childState); + } else { + _activeChildren.remove(childState); + } + final bool nowAnyPressed = _anyChildInkResponsePressed; + if (nowAnyPressed != lastAnyPressed) { + widget.parentState?.markChildInkResponsePressed(this, nowAnyPressed); + } + } + + bool get _anyChildInkResponsePressed => _activeChildren.isNotEmpty; + + void activateOnIntent(Intent? intent) { + _activationTimer?.cancel(); + _activationTimer = null; + _startNewSplash(context: context); + _currentSplash?.confirm(); + _currentSplash = null; + if (widget.onTap != null) { + if (widget.enableFeedback) { + Feedback.forTap(context); + } + widget.onTap?.call(); + } + // Delay the call to `updateHighlight` to simulate a pressed delay + // and give MaterialStatesController listeners a chance to react. + _activationTimer = Timer(_activationDuration, () { + updateHighlight(_HighlightType.pressed, value: false); + }); + } + + void simulateTap([Intent? intent]) { + _startNewSplash(context: context); + handleTap(); + } + + void simulateLongPress() { + _startNewSplash(context: context); + handleLongPress(); + } + + void handleStatesControllerChange() { + // Force a rebuild to resolve widget.overlayColor, widget.mouseCursor + setState(() {}); + } + + WidgetStatesController get statesController => widget.statesController ?? internalStatesController!; + + void initStatesController() { + if (widget.statesController == null) { + internalStatesController = WidgetStatesController(); + } + statesController.update(WidgetState.disabled, !enabled); + statesController.addListener(handleStatesControllerChange); + } + + @override + void initState() { + super.initState(); + initStatesController(); + FocusManager.instance.addHighlightModeListener(handleFocusHighlightModeChange); + } + + @override + void didUpdateWidget(_InkResponseStateWidget oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.statesController != oldWidget.statesController) { + oldWidget.statesController?.removeListener(handleStatesControllerChange); + if (widget.statesController != null) { + internalStatesController?.dispose(); + internalStatesController = null; + } + initStatesController(); + } + if (widget.radius != oldWidget.radius || widget.highlightShape != oldWidget.highlightShape || widget.borderRadius != oldWidget.borderRadius) { + final InkHighlight? hoverHighlight = _highlights[_HighlightType.hover]; + if (hoverHighlight != null) { + hoverHighlight.dispose(); + updateHighlight(_HighlightType.hover, value: _hovering, callOnHover: false); + } + final InkHighlight? focusHighlight = _highlights[_HighlightType.focus]; + if (focusHighlight != null) { + focusHighlight.dispose(); + // Do not call updateFocusHighlights() here because it is called below + } + } + if (widget.customBorder != oldWidget.customBorder) { + _updateHighlightsAndSplashes(); + } + if (enabled != isWidgetEnabled(oldWidget)) { + statesController.update(WidgetState.disabled, !enabled); + if (!enabled) { + statesController.update(WidgetState.pressed, false); + // Remove the existing hover highlight immediately when enabled is false. + // Do not rely on updateHighlight or InkHighlight.deactivate to not break + // the expected lifecycle which is updating _hovering when the mouse exit. + // Manually updating _hovering here or calling InkHighlight.deactivate + // will lead to onHover not being called or call when it is not allowed. + final InkHighlight? hoverHighlight = _highlights[_HighlightType.hover]; + hoverHighlight?.dispose(); + } + // Don't call widget.onHover because many widgets, including the button + // widgets, apply setState to an ancestor context from onHover. + updateHighlight(_HighlightType.hover, value: _hovering, callOnHover: false); + } + updateFocusHighlights(); + } + + @override + void dispose() { + FocusManager.instance.removeHighlightModeListener(handleFocusHighlightModeChange); + statesController.removeListener(handleStatesControllerChange); + internalStatesController?.dispose(); + _activationTimer?.cancel(); + _activationTimer = null; + super.dispose(); + } + + @override + bool get wantKeepAlive => highlightsExist || (_splashes != null && _splashes!.isNotEmpty); + + Duration getFadeDurationForType(_HighlightType type) { + switch (type) { + case _HighlightType.pressed: + return const Duration(milliseconds: 200); + case _HighlightType.hover: + case _HighlightType.focus: + return widget.hoverDuration ?? const Duration(milliseconds: 50); + } + } + + void updateHighlight(_HighlightType type, {required bool value, bool callOnHover = true}) { + final InkHighlight? highlight = _highlights[type]; + void handleInkRemoval() { + assert(_highlights[type] != null); + _highlights[type] = null; + updateKeepAlive(); + } + + switch (type) { + case _HighlightType.pressed: + statesController.update(WidgetState.pressed, value); + case _HighlightType.hover: + if (callOnHover) { + statesController.update(WidgetState.hovered, value); + } + case _HighlightType.focus: + // see handleFocusUpdate() + break; + } + + if (type == _HighlightType.pressed) { + widget.parentState?.markChildInkResponsePressed(this, value); + } + if (value == (highlight != null && highlight.active)) { + return; + } + + if (value) { + if (highlight == null) { + final Color resolvedOverlayColor = + widget.overlayColor?.resolve(statesController.value) ?? + switch (type) { + // Use the backwards compatible defaults + _HighlightType.pressed => widget.highlightColor ?? Theme.of(context).highlightColor, + _HighlightType.focus => widget.focusColor ?? Theme.of(context).focusColor, + _HighlightType.hover => widget.hoverColor ?? Theme.of(context).hoverColor, + }; + final RenderBox referenceBox = context.findRenderObject()! as RenderBox; + _highlights[type] = InkHighlight( + controller: Material.of(context), + referenceBox: referenceBox, + color: enabled ? resolvedOverlayColor : resolvedOverlayColor.withAlpha(0), + shape: widget.highlightShape, + radius: widget.radius, + borderRadius: widget.borderRadius, + customBorder: widget.customBorder, + rectCallback: widget.getRectCallback!(referenceBox), + onRemoved: handleInkRemoval, + textDirection: Directionality.of(context), + fadeDuration: getFadeDurationForType(type), + ); + updateKeepAlive(); + } else { + highlight.activate(); + } + } else { + highlight!.deactivate(); + } + assert(value == (_highlights[type] != null && _highlights[type]!.active)); + + switch (type) { + case _HighlightType.pressed: + widget.onHighlightChanged?.call(value); + case _HighlightType.hover: + if (callOnHover) { + widget.onHover?.call(value); + } + case _HighlightType.focus: + break; + } + } + + void _updateHighlightsAndSplashes() { + for (final InkHighlight? highlight in _highlights.values) { + highlight?.customBorder = widget.customBorder; + } + _currentSplash?.customBorder = widget.customBorder; + + if (_splashes != null && _splashes!.isNotEmpty) { + for (final InteractiveInkFeature inkFeature in _splashes!) { + inkFeature.customBorder = widget.customBorder; + } + } + } + + InteractiveInkFeature _createSplash(Offset globalPosition) { + final MaterialInkController inkController = Material.of(context); + final RenderBox referenceBox = context.findRenderObject()! as RenderBox; + final Offset position = referenceBox.globalToLocal(globalPosition); + final Color color = widget.overlayColor?.resolve(statesController.value) ?? widget.splashColor ?? Theme.of(context).splashColor; + final RectCallback? rectCallback = widget.containedInkWell ? widget.getRectCallback!(referenceBox) : null; + final BorderRadius? borderRadius = widget.borderRadius; + final ShapeBorder? customBorder = widget.customBorder; + + InteractiveInkFeature? splash; + void onRemoved() { + if (_splashes != null) { + assert(_splashes!.contains(splash)); + _splashes!.remove(splash); + if (_currentSplash == splash) { + _currentSplash = null; + } + updateKeepAlive(); + } // else we're probably in deactivate() + } + + splash = (widget.splashFactory ?? Theme.of(context).splashFactory).create( + controller: inkController, + referenceBox: referenceBox, + position: position, + color: color, + containedInkWell: widget.containedInkWell, + rectCallback: rectCallback, + radius: widget.radius, + borderRadius: borderRadius, + customBorder: customBorder, + onRemoved: onRemoved, + textDirection: Directionality.of(context), + ); + + return splash; + } + + void handleFocusHighlightModeChange(FocusHighlightMode mode) { + if (!mounted) { + return; + } + setState(updateFocusHighlights); + } + + bool get _shouldShowFocus { + return switch (MediaQuery.maybeNavigationModeOf(context)) { + NavigationMode.traditional || null => enabled && _hasFocus, + NavigationMode.directional => _hasFocus, + }; + } + + void updateFocusHighlights() { + final bool showFocus = switch (FocusManager.instance.highlightMode) { + FocusHighlightMode.touch => false, + FocusHighlightMode.traditional => _shouldShowFocus, + }; + updateHighlight(_HighlightType.focus, value: showFocus); + } + + bool _hasFocus = false; + + void handleFocusUpdate(bool hasFocus) { + _hasFocus = hasFocus; + // Set here rather than updateHighlight because this widget's + // (MaterialState) states include MaterialState.focused if + // the InkWell _has_ the focus, rather than if it's showing + // the focus per FocusManager.instance.highlightMode. + statesController.update(WidgetState.focused, hasFocus); + updateFocusHighlights(); + widget.onFocusChange?.call(hasFocus); + } + + void handleAnyTapDown(TapDownDetails details) { + if (_anyChildInkResponsePressed) { + return; + } + _startNewSplash(details: details); + } + + void handleTapDown(TapDownDetails details) { + handleAnyTapDown(details); + widget.onTapDown?.call(details); + } + + void handleTapUp(TapUpDetails details) { + widget.onTapUp?.call(details); + } + + void handleSecondaryTapDown(TapDownDetails details) { + handleAnyTapDown(details); + widget.onSecondaryTapDown?.call(details); + } + + void handleSecondaryTapUp(TapUpDetails details) { + widget.onSecondaryTapUp?.call(details); + } + + void _startNewSplash({TapDownDetails? details, BuildContext? context}) { + assert(details != null || context != null); + + final Offset globalPosition; + if (context != null) { + final RenderBox referenceBox = context.findRenderObject()! as RenderBox; + assert(referenceBox.hasSize, 'InkResponse must be done with layout before starting a splash.'); + globalPosition = referenceBox.localToGlobal(referenceBox.paintBounds.center); + } else { + globalPosition = details!.globalPosition; + } + statesController.update(WidgetState.pressed, true); // ... before creating the splash + final InteractiveInkFeature splash = _createSplash(globalPosition); + _splashes ??= HashSet<InteractiveInkFeature>(); + _splashes!.add(splash); + _currentSplash?.cancel(); + _currentSplash = splash; + updateKeepAlive(); + updateHighlight(_HighlightType.pressed, value: true); + } + + void handleTap() { + _currentSplash?.confirm(); + _currentSplash = null; + updateHighlight(_HighlightType.pressed, value: false); + if (widget.onTap != null) { + if (widget.enableFeedback) { + Feedback.forTap(context); + } + widget.onTap?.call(); + } + } + + void handleTapCancel() { + _currentSplash?.cancel(); + _currentSplash = null; + widget.onTapCancel?.call(); + updateHighlight(_HighlightType.pressed, value: false); + } + + void handleDoubleTap() { + _currentSplash?.confirm(); + _currentSplash = null; + updateHighlight(_HighlightType.pressed, value: false); + widget.onDoubleTap?.call(); + } + + void handleLongPress() { + _currentSplash?.confirm(); + _currentSplash = null; + if (widget.onLongPress != null) { + if (widget.enableFeedback) { + Feedback.forLongPress(context); + } + widget.onLongPress!(); + } + } + + void handleSecondaryTap() { + _currentSplash?.confirm(); + _currentSplash = null; + updateHighlight(_HighlightType.pressed, value: false); + widget.onSecondaryTap?.call(); + } + + void handleSecondaryTapCancel() { + _currentSplash?.cancel(); + _currentSplash = null; + widget.onSecondaryTapCancel?.call(); + updateHighlight(_HighlightType.pressed, value: false); + } + + @override + void deactivate() { + if (_splashes != null) { + final Set<InteractiveInkFeature> splashes = _splashes!; + _splashes = null; + for (final InteractiveInkFeature splash in splashes) { + splash.dispose(); + } + _currentSplash = null; + } + assert(_currentSplash == null); + for (final _HighlightType highlight in _highlights.keys) { + _highlights[highlight]?.dispose(); + _highlights[highlight] = null; + } + widget.parentState?.markChildInkResponsePressed(this, false); + super.deactivate(); + } + + bool isWidgetEnabled(_InkResponseStateWidget widget) { + return _primaryButtonEnabled(widget) || _secondaryButtonEnabled(widget); + } + + bool _primaryButtonEnabled(_InkResponseStateWidget widget) { + return widget.onTap != null || widget.onDoubleTap != null || widget.onLongPress != null || widget.onTapUp != null || widget.onTapDown != null; + } + + bool _secondaryButtonEnabled(_InkResponseStateWidget widget) { + return widget.onSecondaryTap != null || widget.onSecondaryTapUp != null || widget.onSecondaryTapDown != null; + } + + bool get enabled => isWidgetEnabled(widget); + + bool get _primaryEnabled => _primaryButtonEnabled(widget); + + bool get _secondaryEnabled => _secondaryButtonEnabled(widget); + + void handleMouseEnter(PointerEnterEvent event) { + _hovering = true; + if (enabled) { + handleHoverChange(); + } + } + + void handleMouseExit(PointerExitEvent event) { + _hovering = false; + // If the exit occurs after we've been disabled, we still + // want to take down the highlights and run widget.onHover. + handleHoverChange(); + } + + void handleHoverChange() { + updateHighlight(_HighlightType.hover, value: _hovering); + } + + bool get _canRequestFocus { + return switch (MediaQuery.maybeNavigationModeOf(context)) { + NavigationMode.traditional || null => enabled && widget.canRequestFocus, + NavigationMode.directional => true, + }; + } + + @override + Widget build(BuildContext context) { + assert(widget.debugCheckContext(context)); + super.build(context); // See AutomaticKeepAliveClientMixin. + + Color getHighlightColorForType(_HighlightType type) { + const Set<WidgetState> pressed = <WidgetState>{WidgetState.pressed}; + const Set<WidgetState> focused = <WidgetState>{WidgetState.focused}; + const Set<WidgetState> hovered = <WidgetState>{WidgetState.hovered}; + + final ThemeData theme = Theme.of(context); + return switch (type) { + // The pressed state triggers a ripple (ink splash), per the current + // Material Design spec. A separate highlight is no longer used. + // See https://material.io/design/interaction/states.html#pressed + _HighlightType.pressed => widget.overlayColor?.resolve(pressed) ?? widget.highlightColor ?? theme.highlightColor, + _HighlightType.focus => widget.overlayColor?.resolve(focused) ?? widget.focusColor ?? theme.focusColor, + _HighlightType.hover => widget.overlayColor?.resolve(hovered) ?? widget.hoverColor ?? theme.hoverColor, + }; + } + + for (final _HighlightType type in _highlights.keys) { + _highlights[type]?.color = getHighlightColorForType(type); + } + + _currentSplash?.color = widget.overlayColor?.resolve(statesController.value) ?? widget.splashColor ?? Theme.of(context).splashColor; + + final MouseCursor effectiveMouseCursor = WidgetStateProperty.resolveAs<MouseCursor>( + widget.mouseCursor ?? WidgetStateMouseCursor.clickable, + statesController.value, + ); + + return _ParentInkResponseProvider( + state: this, + child: Actions( + actions: _actionMap, + child: Focus( + focusNode: widget.focusNode, + canRequestFocus: _canRequestFocus, + onFocusChange: handleFocusUpdate, + autofocus: widget.autofocus, + child: MouseRegion( + cursor: effectiveMouseCursor, + onEnter: handleMouseEnter, + onExit: handleMouseExit, + child: DefaultSelectionStyle.merge( + mouseCursor: effectiveMouseCursor, + child: Semantics( + onTap: widget.excludeFromSemantics || widget.onTap == null ? null : simulateTap, + onLongPress: widget.excludeFromSemantics || widget.onLongPress == null ? null : simulateLongPress, + child: AGestureDetector( + onTapDown: _primaryEnabled ? handleTapDown : null, + onTapUp: _primaryEnabled ? handleTapUp : null, + onTap: _primaryEnabled ? handleTap : null, + onTapCancel: _primaryEnabled ? handleTapCancel : null, + onDoubleTap: widget.onDoubleTap != null ? handleDoubleTap : null, + onLongPress: widget.onLongPress != null ? handleLongPress : null, + onSecondaryTapDown: _secondaryEnabled ? handleSecondaryTapDown : null, + onSecondaryTapUp: _secondaryEnabled ? handleSecondaryTapUp : null, + onSecondaryTap: _secondaryEnabled ? handleSecondaryTap : null, + onSecondaryTapCancel: _secondaryEnabled ? handleSecondaryTapCancel : null, + behavior: HitTestBehavior.opaque, + excludeFromSemantics: true, + longPressTimeout: widget.longPressTimeout, + child: widget.child, + ), + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/common/basic/insets.dart b/lib/widgets/common/basic/insets.dart new file mode 100644 index 0000000..1e083a3 --- /dev/null +++ b/lib/widgets/common/basic/insets.dart @@ -0,0 +1,225 @@ +import 'dart:math'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/common/tile_extent_controller.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +// This widget should be added on top of Scaffolds with: +// - `resizeToAvoidBottomInset` set to false, +// - a vertically scrollable body. +// It will prevent the body from scrolling when a user swipe from bottom to use Android 10 style navigation gestures. +class BottomGestureAreaProtector extends StatelessWidget { + const BottomGestureAreaProtector({super.key}); + + @override + Widget build(BuildContext context) { + return Positioned( + left: 0, + right: 0, + bottom: 0, + height: MediaQuery.systemGestureInsetsOf(context).bottom, + child: GestureDetector( + // absorb vertical gestures only + onVerticalDragDown: (details) {}, + behavior: HitTestBehavior.translucent, + ), + ); + } +} + +// It will prevent the body from scrolling when a user swipe from top to show the status bar when system UI is hidden. +class TopGestureAreaProtector extends StatelessWidget { + const TopGestureAreaProtector({super.key}); + + @override + Widget build(BuildContext context) { + return Positioned( + left: 0, + top: 0, + right: 0, + height: MediaQuery.systemGestureInsetsOf(context).top, + child: GestureDetector( + // absorb vertical gestures only + onVerticalDragDown: (details) {}, + behavior: HitTestBehavior.translucent, + ), + ); + } +} + +// It will prevent the body from scrolling when a user swipe from edges to use Android 10 style navigation gestures. +class SideGestureAreaProtector extends StatelessWidget { + const SideGestureAreaProtector({super.key}); + + @override + Widget build(BuildContext context) { + return Positioned.fill( + child: Row( + // `systemGestureInsets` are not directional + textDirection: TextDirection.ltr, + children: [ + SizedBox( + width: MediaQuery.systemGestureInsetsOf(context).left, + child: GestureDetector( + // absorb horizontal gestures only + onHorizontalDragDown: (details) {}, + behavior: HitTestBehavior.translucent, + ), + ), + const Spacer(), + SizedBox( + width: MediaQuery.systemGestureInsetsOf(context).right, + child: GestureDetector( + // absorb horizontal gestures only + onHorizontalDragDown: (details) {}, + behavior: HitTestBehavior.translucent, + ), + ), + ], + ), + ); + } +} + +class GestureAreaProtectorStack extends StatelessWidget { + final Widget child; + + const GestureAreaProtectorStack({ + super.key, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + child, + const BottomGestureAreaProtector(), + ], + ); + } +} + +class BottomPaddingSliver extends StatelessWidget { + const BottomPaddingSliver({super.key}); + + @override + Widget build(BuildContext context) { + return SliverToBoxAdapter( + child: Selector<MediaQueryData, double>( + selector: (context, mq) => mq.effectiveBottomPadding, + builder: (context, mqPaddingBottom, child) { + return SizedBox(height: mqPaddingBottom); + }, + ), + ); + } +} + +class TvTileGridBottomPaddingSliver extends StatelessWidget { + const TvTileGridBottomPaddingSliver({super.key}); + + @override + Widget build(BuildContext context) { + return SliverToBoxAdapter( + child: SizedBox( + height: settings.useTvLayout ? context.select<TileExtentController, double>((controller) => controller.spacing) : 0, + ), + ); + } +} + +// `MediaQuery.padding` matches cutout areas but also includes other system UI like the status bar +// so we cannot use `SafeArea` along `MediaQuery.removePadding()` to remove cutout areas +class SafeCutoutArea extends StatelessWidget { + final Animation<double>? animation; + final Widget child; + + const SafeCutoutArea({ + super.key, + this.animation, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder<EdgeInsets>( + valueListenable: AvesApp.cutoutInsetsNotifier, + builder: (context, cutoutInsets, child) { + return NullableValueListenableBuilder<double>( + valueListenable: animation, + builder: (context, value, child) { + final double factor = value ?? 1.0; + final effectiveInsets = cutoutInsets * factor; + return Padding( + padding: effectiveInsets, + child: MediaQueryDataProvider( + value: MediaQuery.of(context).removeCutoutInsets(effectiveInsets), + child: child!, + ), + ); + }, + child: child, + ); + }, + child: child, + ); + } +} + +extension ExtraMediaQueryData on MediaQueryData { + MediaQueryData removeCutoutInsets(EdgeInsets cutoutInsets) { + return copyWith( + padding: EdgeInsets.only( + left: max(0.0, padding.left - cutoutInsets.left), + top: max(0.0, padding.top - cutoutInsets.top), + right: max(0.0, padding.right - cutoutInsets.right), + bottom: max(0.0, padding.bottom - cutoutInsets.bottom), + ), + viewPadding: EdgeInsets.only( + left: max(0.0, viewPadding.left - cutoutInsets.left), + top: max(0.0, viewPadding.top - cutoutInsets.top), + right: max(0.0, viewPadding.right - cutoutInsets.right), + bottom: max(0.0, viewPadding.bottom - cutoutInsets.bottom), + ), + ); + } +} + +class DirectionalSafeArea extends StatelessWidget { + final bool start, top, end, bottom; + final EdgeInsets minimum; + final bool maintainBottomViewPadding; + final Widget child; + + const DirectionalSafeArea({ + super.key, + this.start = true, + this.top = true, + this.end = true, + this.bottom = true, + this.minimum = EdgeInsets.zero, + this.maintainBottomViewPadding = false, + required this.child, + }); + + @override + Widget build(BuildContext context) { + final isRtl = context.isRtl; + return SafeArea( + left: isRtl ? end : start, + top: top, + right: isRtl ? start : end, + bottom: bottom, + minimum: minimum, + maintainBottomViewPadding: maintainBottomViewPadding, + child: child, + ); + } +} diff --git a/lib/widgets/common/basic/labeled_checkbox.dart b/lib/widgets/common/basic/labeled_checkbox.dart new file mode 100644 index 0000000..c106e07 --- /dev/null +++ b/lib/widgets/common/basic/labeled_checkbox.dart @@ -0,0 +1,55 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; + +class LabeledCheckbox extends StatefulWidget { + final bool value; + final ValueChanged<bool?> onChanged; + final String text; + + const LabeledCheckbox({ + super.key, + required this.value, + required this.onChanged, + required this.text, + }); + + @override + State<LabeledCheckbox> createState() => _LabeledCheckboxState(); +} + +class _LabeledCheckboxState extends State<LabeledCheckbox> { + late TapGestureRecognizer _tapRecognizer; + + @override + void initState() { + super.initState(); + _tapRecognizer = TapGestureRecognizer()..onTap = () => widget.onChanged(!widget.value); + } + + @override + void dispose() { + _tapRecognizer.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Text.rich( + TextSpan( + children: [ + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Checkbox( + value: widget.value, + onChanged: widget.onChanged, + ), + ), + TextSpan( + text: widget.text, + recognizer: _tapRecognizer, + ), + ], + ), + ); + } +} diff --git a/lib/widgets/common/basic/link_chip.dart b/lib/widgets/common/basic/link_chip.dart new file mode 100644 index 0000000..53ddc65 --- /dev/null +++ b/lib/widgets/common/basic/link_chip.dart @@ -0,0 +1,63 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:flutter/material.dart'; + +class LinkChip extends StatelessWidget { + final Widget? leading; + final String text; + final String? urlString; + final Color? color; + final TextStyle? textStyle; + final VoidCallback? onTap; + + static const borderRadius = BorderRadius.all(Radius.circular(8)); + + const LinkChip({ + super.key, + this.leading, + required this.text, + this.urlString, + this.color, + this.textStyle, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + return DefaultTextStyle.merge( + style: (textStyle ?? const TextStyle()).copyWith(color: color), + child: InkWell( + borderRadius: borderRadius, + onTap: onTap ?? () => AvesApp.launchUrl(urlString), + child: Padding( + padding: const EdgeInsets.all(8), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (leading != null) ...[ + leading!, + const SizedBox(width: 8), + ], + Flexible( + child: Text( + text, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ), + const SizedBox(width: 8), + Builder( + builder: (context) => Icon( + AIcons.openOutside, + size: DefaultTextStyle.of(context).style.fontSize, + color: color, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/widgets/common/basic/list_tiles/color.dart b/lib/widgets/common/basic/list_tiles/color.dart new file mode 100644 index 0000000..cbae833 --- /dev/null +++ b/lib/widgets/common/basic/list_tiles/color.dart @@ -0,0 +1,99 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/basic/color_indicator.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flex_color_picker/flex_color_picker.dart' show ColorPicker, ColorPickerType; +import 'package:flutter/material.dart'; + +class ColorListTile extends StatelessWidget { + final String title; + final Color value; + final ValueSetter<Color> onChanged; + + const ColorListTile({ + super.key, + required this.title, + required this.value, + required this.onChanged, + }); + + @override + Widget build(BuildContext context) { + return ListTile( + title: Text(title), + trailing: ColorIndicator( + value: value, + ), + contentPadding: const EdgeInsetsDirectional.only(start: 16, end: 36 - ColorIndicator.radius), + onTap: () async { + final color = await showDialog<Color>( + context: context, + builder: (context) => ColorPickerDialog( + initialValue: value, + ), + routeSettings: const RouteSettings(name: ColorPickerDialog.routeName), + ); + if (color != null) { + onChanged(color); + } + }, + ); + } +} + +class ColorPickerDialog extends StatefulWidget { + static const routeName = '/dialog/pick_color'; + + final Color initialValue; + + const ColorPickerDialog({ + super.key, + required this.initialValue, + }); + + @override + State<ColorPickerDialog> createState() => _ColorPickerDialogState(); +} + +class _ColorPickerDialogState extends State<ColorPickerDialog> { + late Color color; + + @override + void initState() { + super.initState(); + color = widget.initialValue; + } + + @override + Widget build(BuildContext context) { + final useTvLayout = settings.useTvLayout; + return AvesDialog( + scrollableContent: [ + ColorPicker( + color: color, + onColorChanged: (v) => color = v, + pickersEnabled: useTvLayout + ? const { + ColorPickerType.primary: true, + ColorPickerType.accent: false, + } + : const { + ColorPickerType.primary: false, + ColorPickerType.accent: false, + ColorPickerType.wheel: true, + }, + hasBorder: true, + borderRadius: 20, + subheading: useTvLayout ? const SizedBox(height: 16) : null, + ), + ], + actions: [ + const CancelButton(), + TextButton( + onPressed: () => Navigator.maybeOf(context)?.pop(color), + child: Text(context.l10n.applyButtonLabel), + ), + ], + ); + } +} diff --git a/lib/widgets/common/basic/list_tiles/reselectable_radio.dart b/lib/widgets/common/basic/list_tiles/reselectable_radio.dart new file mode 100644 index 0000000..29d2242 --- /dev/null +++ b/lib/widgets/common/basic/list_tiles/reselectable_radio.dart @@ -0,0 +1,81 @@ +import 'package:flutter/material.dart'; + +// `RadioListTile` that can trigger `onChanged` on tap when already selected, if `reselectable` is true +class ReselectableRadioListTile<T> extends StatelessWidget { + final T value; + final bool toggleable; + final bool reselectable; + final Color? activeColor; + final Widget? title; + final Widget? subtitle; + final Widget? secondary; + final bool isThreeLine; + final bool? dense; + final bool selected; + final ListTileControlAffinity controlAffinity; + final bool autofocus; + + const ReselectableRadioListTile({ + super.key, + required this.value, + this.toggleable = false, + this.reselectable = false, + this.activeColor, + this.title, + this.subtitle, + this.isThreeLine = false, + this.dense, + this.secondary, + this.selected = false, + this.controlAffinity = ListTileControlAffinity.platform, + this.autofocus = false, + }) : assert(!isThreeLine || subtitle != null); + + @override + Widget build(BuildContext context) { + final Widget control = Radio<T>( + value: value, + toggleable: toggleable, + activeColor: activeColor, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + autofocus: autofocus, + ); + Widget? leading, trailing; + switch (controlAffinity) { + case ListTileControlAffinity.leading: + case ListTileControlAffinity.platform: + leading = control; + trailing = secondary; + case ListTileControlAffinity.trailing: + leading = secondary; + trailing = control; + } + final groupRegistry = RadioGroup.maybeOf<T>(context); + return MergeSemantics( + child: ListTileTheme.merge( + selectedColor: activeColor ?? Theme.of(context).colorScheme.primary, + child: ListTile( + leading: leading, + title: title, + subtitle: subtitle, + trailing: trailing, + isThreeLine: isThreeLine, + dense: dense, + enabled: groupRegistry != null, + onTap: groupRegistry != null + ? () { + final selected = value == groupRegistry.groupValue; + if (toggleable && selected) { + groupRegistry.onChanged(null); + } else if (reselectable || !selected) { + groupRegistry.onChanged(value); + } + } + : null, + selected: selected, + autofocus: autofocus, + ), + ), + ); + } +} diff --git a/lib/widgets/common/basic/list_tiles/slider.dart b/lib/widgets/common/basic/list_tiles/slider.dart new file mode 100644 index 0000000..1a95a2e --- /dev/null +++ b/lib/widgets/common/basic/list_tiles/slider.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; + +class SliderListTile extends StatelessWidget { + final String title; + final double value; + final ValueChanged<double>? onChanged; + final double min; + final double max; + final int? divisions; + final EdgeInsetsGeometry titlePadding; + final Widget Function(BuildContext context, double value)? titleTrailing; + + const SliderListTile({ + super.key, + required this.title, + required this.value, + required this.onChanged, + this.min = 0.0, + this.max = 1.0, + this.divisions, + this.titlePadding = const EdgeInsetsDirectional.only(start: 16), + this.titleTrailing, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final listTileTitleTextStyle = ListTileTheme.of(context).titleTextStyle ?? theme.textTheme.bodyLarge!.copyWith(color: theme.colorScheme.onSurface); + return SliderTheme( + data: SliderTheme.of(context).copyWith( + overlayShape: const RoundSliderOverlayShape( + // align `Slider`s on `Switch`es by matching their overlay/reaction radius + // `kRadialReactionRadius` is used when `SwitchThemeData.splashRadius` is undefined + overlayRadius: kRadialReactionRadius, + ), + ), + child: Padding( + padding: const EdgeInsets.only(top: 16, bottom: 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: titlePadding, + child: Row( + children: [ + Text( + title, + style: listTileTitleTextStyle, + ), + const Spacer(), + if (titleTrailing != null) titleTrailing!(context, value), + ], + ), + ), + Padding( + // match `SwitchListTile.contentPadding` + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Slider( + value: value, + onChanged: onChanged, + min: min, + max: max, + divisions: divisions, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/common/basic/markdown_container.dart b/lib/widgets/common/basic/markdown_container.dart new file mode 100644 index 0000000..391b34a --- /dev/null +++ b/lib/widgets/common/basic/markdown_container.dart @@ -0,0 +1,71 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_markdown_plus/flutter_markdown_plus.dart'; + +class MarkdownContainer extends StatelessWidget { + final String data; + final TextDirection? textDirection; + final ScrollController? scrollController; + + const MarkdownContainer({ + super.key, + required this.data, + this.textDirection, + this.scrollController, + }); + + static const double mobileMaxWidth = 460; + + @override + Widget build(BuildContext context) { + final useTvLayout = settings.useTvLayout; + + Widget child = Directionality( + textDirection: textDirection ?? Directionality.of(context), + child: Markdown( + data: data, + selectable: true, + onTapLink: (text, href, title) => AvesApp.launchUrl(href), + controller: scrollController, + shrinkWrap: true, + ), + ); + + if (!useTvLayout) { + child = Theme( + data: Theme.of(context).copyWith( + scrollbarTheme: ScrollbarThemeData( + thumbVisibility: WidgetStateProperty.all(true), + radius: const Radius.circular(16), + crossAxisMargin: 6, + mainAxisMargin: 16, + interactive: true, + ), + ), + child: Scrollbar( + child: child, + ), + ); + } + + return Container( + margin: const EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + color: Themes.secondLayerColor(context), + border: Border.all( + color: Theme.of(context).dividerColor, + width: AvesBorder.curvedBorderWidth(context), + ), + borderRadius: const BorderRadius.all(Radius.circular(16)), + ), + constraints: BoxConstraints(maxWidth: useTvLayout ? double.infinity : mobileMaxWidth), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(16)), + child: child, + ), + ); + } +} diff --git a/lib/widgets/common/basic/multi_cross_fader.dart b/lib/widgets/common/basic/multi_cross_fader.dart new file mode 100644 index 0000000..df65a57 --- /dev/null +++ b/lib/widgets/common/basic/multi_cross_fader.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +class MultiCrossFader extends StatefulWidget { + final Duration duration; + final Curve fadeCurve, sizeCurve; + final AlignmentGeometry alignment; + final AnimatedCrossFadeBuilder layoutBuilder; + final Widget child; + + const MultiCrossFader({ + super.key, + required this.duration, + this.fadeCurve = Curves.linear, + this.sizeCurve = Curves.linear, + this.alignment = Alignment.topCenter, + this.layoutBuilder = AnimatedCrossFade.defaultLayoutBuilder, + required this.child, + }); + + @override + State<MultiCrossFader> createState() => _MultiCrossFaderState(); +} + +class _MultiCrossFaderState extends State<MultiCrossFader> { + late Widget _first, _second; + CrossFadeState _fadeState = CrossFadeState.showFirst; + + @override + void initState() { + super.initState(); + _first = widget.child; + _second = const SizedBox(); + } + + @override + void didUpdateWidget(covariant MultiCrossFader oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.child == _first) { + _second = widget.child; + _fadeState = CrossFadeState.showSecond; + } else { + _first = widget.child; + _fadeState = CrossFadeState.showFirst; + } + } + + @override + Widget build(BuildContext context) { + return AnimatedCrossFade( + firstChild: _first, + secondChild: _second, + firstCurve: widget.fadeCurve, + secondCurve: widget.fadeCurve, + sizeCurve: widget.sizeCurve, + alignment: widget.alignment, + crossFadeState: _fadeState, + duration: widget.duration, + reverseDuration: widget.duration, + layoutBuilder: widget.layoutBuilder, + ); + } +} diff --git a/lib/widgets/common/basic/popup/container.dart b/lib/widgets/common/basic/popup/container.dart new file mode 100644 index 0000000..30a0323 --- /dev/null +++ b/lib/widgets/common/basic/popup/container.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +class PopupMenuItemContainer<T> extends PopupMenuEntry<T> { + final Widget child; + + const PopupMenuItemContainer({ + super.key, + this.height = kMinInteractiveDimension, + required this.child, + }); + + @override + final double height; + + @override + bool represents(void value) => false; + + @override + State<PopupMenuItemContainer> createState() => _PopupMenuItemContainerState(); +} + +class _PopupMenuItemContainerState extends State<PopupMenuItemContainer> { + @override + Widget build(BuildContext context) { + return TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: widget.child, + ), + ); + } +} diff --git a/lib/widgets/common/basic/popup/expansion_panel.dart b/lib/widgets/common/basic/popup/expansion_panel.dart new file mode 100644 index 0000000..63bc94e --- /dev/null +++ b/lib/widgets/common/basic/popup/expansion_panel.dart @@ -0,0 +1,105 @@ +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class PopupMenuExpansionPanel<T> extends PopupMenuEntry<T> { + final bool enabled; + final String value; + final ValueNotifier<String?>? expandedNotifier; + final IconData icon; + final String title; + final List<PopupMenuEntry<T>> items; + + const PopupMenuExpansionPanel({ + super.key, + this.enabled = true, + this.height = kMinInteractiveDimension, + required this.value, + this.expandedNotifier, + required this.icon, + required this.title, + required this.items, + }); + + @override + final double height; + + @override + bool represents(void value) => false; + + @override + State<PopupMenuExpansionPanel<T>> createState() => _PopupMenuExpansionPanelState<T>(); +} + +class _PopupMenuExpansionPanelState<T> extends State<PopupMenuExpansionPanel<T>> { + final ValueNotifier<String?> _internalExpandedNotifier = ValueNotifier(null); + + ValueNotifier<String?> get expandedNotifier => widget.expandedNotifier ?? _internalExpandedNotifier; + + @override + void dispose() { + _internalExpandedNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final style = PopupMenuTheme.of(context).labelTextStyle!.resolve( + <WidgetState>{ + if (!widget.enabled) WidgetState.disabled, + }, + )!; + final animationDuration = context.select<DurationsData, Duration>((v) => v.expansionTileAnimation); + + Widget child = ValueListenableBuilder<String?>( + valueListenable: expandedNotifier, + builder: (context, expandedValue, child) { + return ExpansionPanelList( + expansionCallback: (index, isExpanded) { + expandedNotifier.value = isExpanded ? widget.value : null; + }, + animationDuration: animationDuration, + expandedHeaderPadding: EdgeInsets.zero, + elevation: 0, + children: [ + ExpansionPanel( + headerBuilder: (context, isExpanded) { + return DefaultTextStyle( + style: style, + child: IconTheme.merge( + data: IconThemeData( + color: widget.enabled ? null : Theme.of(context).disabledColor, + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: MenuRow( + text: widget.title, + icon: Icon(widget.icon), + ), + ), + ), + ); + }, + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const PopupMenuDivider(height: 0), + ...widget.items, + const PopupMenuDivider(height: 0), + ], + ), + isExpanded: expandedValue == widget.value, + canTapOnHeader: true, + backgroundColor: Colors.transparent, + ), + ], + ); + }, + ); + if (!widget.enabled) { + child = IgnorePointer(child: child); + } + return child; + } +} diff --git a/lib/widgets/common/basic/popup/menu_row.dart b/lib/widgets/common/basic/popup/menu_row.dart new file mode 100644 index 0000000..23f77b4 --- /dev/null +++ b/lib/widgets/common/basic/popup/menu_row.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +class MenuRow extends StatelessWidget { + final String text; + final Widget? icon; + + const MenuRow({ + super.key, + required this.text, + this.icon, + }); + + static const leadingPadding = EdgeInsetsDirectional.only(end: 12); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (icon != null) + Padding( + padding: leadingPadding, + child: IconTheme.merge( + data: IconThemeData( + color: ListTileTheme.of(context).iconColor, + ), + child: icon!, + ), + ), + Flexible( + child: Text(text), + ), + ], + ); + } +} diff --git a/lib/widgets/common/basic/query_bar.dart b/lib/widgets/common/basic/query_bar.dart new file mode 100644 index 0000000..e2ddb31 --- /dev/null +++ b/lib/widgets/common/basic/query_bar.dart @@ -0,0 +1,112 @@ +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/utils/debouncer.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; + +class QueryBar extends StatefulWidget { + final ValueNotifier<String> queryNotifier; + final FocusNode? focusNode; + final EdgeInsetsGeometry? leadingPadding; + final IconData? icon; + final String? hintText; + final bool editable; + + const QueryBar({ + super.key, + required this.queryNotifier, + this.focusNode, + this.leadingPadding, + this.icon, + this.hintText, + this.editable = true, + }); + + @override + State<QueryBar> createState() => _QueryBarState(); + + static double getPreferredHeight(TextScaler textScaler) => textScaler.scale(kToolbarHeight); +} + +class _QueryBarState extends State<QueryBar> { + final Debouncer _debouncer = Debouncer(delay: ADurations.searchDebounceDelay); + late TextEditingController _controller; + + ValueNotifier<String> get queryNotifier => widget.queryNotifier; + + @override + void initState() { + super.initState(); + _controller = TextEditingController(text: queryNotifier.value); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final clearButton = IconButton( + icon: const Icon(AIcons.clear), + onPressed: widget.editable + ? () { + _controller.clear(); + queryNotifier.value = ''; + } + : null, + tooltip: context.l10n.clearTooltip, + ); + + return DefaultTextStyle( + style: Theme.of(context).textTheme.bodyMedium!, + child: FontSizeIconTheme( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: TextField( + controller: _controller, + focusNode: widget.focusNode, + decoration: InputDecoration( + icon: Padding( + padding: widget.leadingPadding ?? const EdgeInsetsDirectional.only(start: 16), + // set theme at this level because `InputDecoration` defines its own `IconTheme` with a fixed size + child: FontSizeIconTheme( + child: Icon(widget.icon ?? AIcons.filter), + ), + ), + hintText: widget.hintText ?? MaterialLocalizations.of(context).searchFieldLabel, + hintStyle: Theme.of(context).inputDecorationTheme.hintStyle, + ), + textInputAction: TextInputAction.search, + onChanged: (s) => _debouncer(() => queryNotifier.value = s.trim()), + enabled: widget.editable, + ), + ), + ConstrainedBox( + constraints: const BoxConstraints(minWidth: 16), + child: ValueListenableBuilder<TextEditingValue>( + valueListenable: _controller, + builder: (context, value, child) => AnimatedSwitcher( + duration: ADurations.appBarActionChangeAnimation, + transitionBuilder: (child, animation) => FadeTransition( + opacity: animation, + child: SizeTransition( + axis: Axis.horizontal, + sizeFactor: animation, + child: child, + ), + ), + child: value.text.isNotEmpty ? clearButton : const SizedBox(), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/common/basic/scaffold.dart b/lib/widgets/common/basic/scaffold.dart new file mode 100644 index 0000000..81058a6 --- /dev/null +++ b/lib/widgets/common/basic/scaffold.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +class AvesScaffold extends StatelessWidget { + final PreferredSizeWidget? appBar; + final Widget? body; + final Widget? floatingActionButton; + final Widget? drawer; + final Widget? bottomNavigationBar; + final Color? backgroundColor; + final bool? resizeToAvoidBottomInset; + final bool extendBody; + + const AvesScaffold({ + super.key, + this.appBar, + this.body, + this.floatingActionButton, + this.drawer, + this.bottomNavigationBar, + this.backgroundColor, + this.resizeToAvoidBottomInset, + this.extendBody = false, + }); + + @override + Widget build(BuildContext context) { + // prevent conflict between drawer drag gesture and Android navigation gestures + final drawerEnableOpenDragGesture = MediaQuery.systemGestureInsetsOf(context).horizontal == 0; + + return Scaffold( + appBar: appBar, + body: body, + floatingActionButton: floatingActionButton, + drawer: drawer, + bottomNavigationBar: bottomNavigationBar, + backgroundColor: backgroundColor, + resizeToAvoidBottomInset: resizeToAvoidBottomInset, + extendBody: extendBody, + drawerEnableOpenDragGesture: drawerEnableOpenDragGesture, + ); + } +} diff --git a/lib/widgets/common/basic/text/animated_diff.dart b/lib/widgets/common/basic/text/animated_diff.dart new file mode 100644 index 0000000..a2577bf --- /dev/null +++ b/lib/widgets/common/basic/text/animated_diff.dart @@ -0,0 +1,185 @@ +import 'dart:math'; + +import 'package:aves/utils/diff_match.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; + +class AnimatedDiffText extends StatefulWidget { + final String text; + final TextStyle? textStyle; + final StrutStyle? strutStyle; + final Curve curve; + final Duration duration; + + const AnimatedDiffText( + this.text, { + super.key, + this.textStyle, + this.strutStyle, + this.curve = Curves.easeInOutCubic, + required this.duration, + }); + + @override + State<AnimatedDiffText> createState() => _AnimatedDiffTextState(); +} + +class _AnimatedDiffTextState extends State<AnimatedDiffText> with SingleTickerProviderStateMixin { + late final AnimationController _controller; + late final CurvedAnimation _animation; + final List<_TextDiff> _diffs = []; + + TextStyle get _textStyle { + final style = widget.textStyle ?? const TextStyle(); + // specify `height` for accurate paragraph height measurement + return style.copyWith(height: style.height ?? DefaultTextStyle.of(context).style.height); + } + + StrutStyle? get _strutStyle => widget.strutStyle; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + duration: widget.duration, + vsync: this, + ); + _animation = CurvedAnimation(parent: _controller, curve: widget.curve); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _computeDiff(widget.text, widget.text); + } + + @override + void didUpdateWidget(covariant AnimatedDiffText oldWidget) { + super.didUpdateWidget(oldWidget); + final oldText = oldWidget.text; + final newText = widget.text; + if (oldText != newText) { + _computeDiff(oldText, newText); + _controller.forward(from: 0); + } + } + + @override + void dispose() { + _animation.dispose(); + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: _animation, + builder: (context, child) { + return Text.rich( + TextSpan( + children: _diffs.map((diff) { + final (oldText, newText, oldSize, newSize) = diff; + final text = (_animation.value == 0 ? oldText : newText) ?? ''; + return WidgetSpan( + child: AnimatedSize( + key: ValueKey(diff), + curve: widget.curve, + duration: widget.duration, + child: AnimatedSwitcher( + duration: widget.duration, + switchInCurve: widget.curve, + switchOutCurve: widget.curve, + layoutBuilder: (currentChild, previousChildren) { + return Stack( + alignment: Alignment.center, + children: [ + ...previousChildren.map( + (child) => ConstrainedBox( + constraints: BoxConstraints.tight( + Size( + min(oldSize.width, newSize.width), + min(oldSize.height, newSize.height), + ), + ), + child: child, + ), + ), + ?currentChild, + ], + ); + }, + child: Text( + text, + key: Key(text), + style: _textStyle, + ), + ), + ), + ); + }).toList(), + ), + strutStyle: _strutStyle, + ); + }, + ); + } + + Size _textSize(String text) { + final paragraph = RenderParagraph( + TextSpan(text: text, style: _textStyle), + textDirection: Directionality.of(context), + textScaler: MediaQuery.textScalerOf(context), + strutStyle: _strutStyle, + )..layout(const BoxConstraints(), parentUsesSize: true); + final width = paragraph.getMaxIntrinsicWidth(double.infinity); + final height = paragraph.getMaxIntrinsicHeight(double.infinity); + paragraph.dispose(); + return Size(width, height); + } + + // use an adaptation of Google's `Diff Match and Patch` + // as package `diffutil_dart` (as of v3.0.0) is unreliable + void _computeDiff(String oldText, String newText) { + final oldCharacters = oldText.characters.join(); + final newCharacters = newText.characters.join(); + + final dmp = DiffMatchPatch(); + final d = dmp.diff_main(oldCharacters, newCharacters); + dmp.diff_cleanupSemantic(d); + + _diffs + ..clear() + ..addAll( + d + .map((diff) { + final text = diff.text; + final size = _textSize(text); + return switch (diff.operation) { + Operation.delete => (text, null, size, Size.zero), + Operation.insert => (null, text, Size.zero, size), + Operation.equal || _ => (text, text, size, size), + }; + }) + .fold<List<_TextDiff>>([], (prev, v) { + if (prev.isNotEmpty) { + final last = prev.last; + final prevNewText = last.$2; + if (prevNewText == null) { + // previous diff is a deletion + final thisOldText = v.$1; + if (thisOldText == null) { + // this diff is an insertion + // merge deletion and insertion as a change operation + final change = (last.$1, v.$2, last.$3, v.$4); + return [...prev.take(prev.length - 1), change]; + } + } + } + return [...prev, v]; + }), + ); + } +} + +typedef _TextDiff = (String?, String?, Size, Size); diff --git a/lib/widgets/common/basic/text/background_painter.dart b/lib/widgets/common/basic/text/background_painter.dart new file mode 100644 index 0000000..e3757c1 --- /dev/null +++ b/lib/widgets/common/basic/text/background_painter.dart @@ -0,0 +1,77 @@ +import 'dart:ui' as ui; + +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +// as of Flutter v3.3.7, text style background does not have consistent height +// when rendering multi-script text, so we paint the background behind via a stack instead +class TextBackgroundPainter extends StatelessWidget { + final List<TextSpan> spans; + final TextStyle style; + final TextAlign textAlign; + final Widget child; + + const TextBackgroundPainter({ + super.key, + required this.spans, + required this.style, + required this.textAlign, + required this.child, + }); + + @override + Widget build(BuildContext context) { + final backgroundColor = style.backgroundColor; + if (backgroundColor == null || backgroundColor.a == 0) { + return child; + } + + return LayoutBuilder( + builder: (context, constraints) { + final paragraph = RenderParagraph( + TextSpan( + children: spans, + style: style, + ), + textAlign: textAlign, + textDirection: Directionality.of(context), + textScaler: MediaQuery.textScalerOf(context), + )..layout(constraints, parentUsesSize: true); + + final textLength = spans.map((v) => v.text?.length ?? 0).sum; + final allBoxes = paragraph.getBoxesForSelection( + TextSelection(baseOffset: 0, extentOffset: textLength), + boxHeightStyle: ui.BoxHeightStyle.max, + ); + paragraph.dispose(); + + // merge boxes to avoid artifacts at box edges, from anti-aliasing and rounding hacks + final lineRects = groupBy<TextBox, double>(allBoxes, (v) => v.top).entries.map((kv) { + final top = kv.key; + final lineBoxes = kv.value; + return Rect.fromLTRB( + lineBoxes.map((v) => v.left).min, + top, + lineBoxes.map((v) => v.right).max, + lineBoxes.first.bottom, + ); + }); + + return Stack( + children: [ + ...lineRects.map((rect) { + return Positioned.fromRect( + rect: rect, + child: ColoredBox( + color: backgroundColor, + ), + ); + }), + child, + ], + ); + }, + ); + } +} diff --git a/lib/widgets/common/basic/text/change_highlight.dart b/lib/widgets/common/basic/text/change_highlight.dart new file mode 100644 index 0000000..3c1029f --- /dev/null +++ b/lib/widgets/common/basic/text/change_highlight.dart @@ -0,0 +1,90 @@ +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class ChangeHighlightText extends StatefulWidget { + final String data; + final TextStyle style, changedStyle; + final Curve curve; + final Duration duration; + + const ChangeHighlightText( + this.data, { + super.key, + required this.style, + required this.changedStyle, + this.curve = Curves.linear, + required this.duration, + }); + + @override + State<ChangeHighlightText> createState() => _ChangeHighlightTextState(); +} + +class _ChangeHighlightTextState extends State<ChangeHighlightText> with SingleTickerProviderStateMixin { + late final AnimationController _controller; + late final CurvedAnimation _animation; + late final Animation<TextStyle> _style; + + @override + void initState() { + super.initState(); + _controller = + AnimationController( + duration: widget.duration, + vsync: this, + ) + ..value = 1 + ..addListener(() => setState(() {})); + _animation = CurvedAnimation( + parent: _controller, + curve: widget.curve, + ); + _style = ShadowedTextStyleTween(begin: widget.changedStyle, end: widget.style).animate(_animation); + } + + @override + void didUpdateWidget(ChangeHighlightText oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.data != widget.data) { + _controller + ..value = 0 + ..forward(); + } + } + + @override + void dispose() { + _animation.dispose(); + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Text( + widget.data, + style: _style.value, + ); + } +} + +class ShadowedTextStyleTween extends Tween<TextStyle> { + ShadowedTextStyleTween({super.begin, super.end}); + + @override + TextStyle lerp(double t) { + final textStyle = TextStyle.lerp(begin, end, t)!; + final beginShadows = begin!.shadows; + final endShadows = end!.shadows; + if (beginShadows != null && endShadows != null && beginShadows.length == endShadows.length) { + return textStyle.copyWith( + shadows: beginShadows.mapIndexed((i, a) { + final b = endShadows[i]; + return Shadow.lerp(a, b, t)!; + }).toList(), + ); + } else { + return textStyle; + } + } +} diff --git a/lib/widgets/common/basic/text/outlined.dart b/lib/widgets/common/basic/text/outlined.dart new file mode 100644 index 0000000..a728268 --- /dev/null +++ b/lib/widgets/common/basic/text/outlined.dart @@ -0,0 +1,102 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +class OutlinedText extends StatelessWidget { + final List<TextSpan> textSpans; + final double outlineWidth; + final Color outlineColor; + final double outlineBlurSigma; + final TextAlign? textAlign; + final bool? softWrap; + final TextOverflow? overflow; + final int? maxLines; + + static const widgetSpanAlignment = PlaceholderAlignment.middle; + + const OutlinedText({ + super.key, + required this.textSpans, + double? outlineWidth, + Color? outlineColor, + double? outlineBlurSigma, + this.textAlign, + this.softWrap, + this.overflow, + this.maxLines, + }) : outlineWidth = outlineWidth ?? 1, + outlineColor = outlineColor ?? Colors.black, + outlineBlurSigma = outlineBlurSigma ?? 0; + + @override + Widget build(BuildContext context) { + // TODO TLAD [subtitles] fix background area for mixed alphabetic-ideographic text + // as of Flutter v3.10.0, the area computed for `backgroundColor` has inconsistent height + // in case of mixed alphabetic-ideographic text. The painted boxes depend on the script. + // Possible workarounds would be to use metrics from: + // - `TextPainter.getBoxesForSelection` + // - `Paragraph.getBoxesForRange` + // and paint the background at the bottom of the `Stack` + + final hasOutline = outlineWidth > 0; + + Widget? outline; + if (hasOutline) { + outline = Text.rich( + TextSpan( + children: textSpans.map(_toStrokeSpan).toList(), + ), + textAlign: textAlign, + softWrap: softWrap, + overflow: overflow, + maxLines: maxLines, + ); + if (outlineBlurSigma > 0) { + outline = ImageFiltered( + imageFilter: ImageFilter.blur( + sigmaX: outlineBlurSigma, + sigmaY: outlineBlurSigma, + ), + child: outline, + ); + } + } + + final fill = Text.rich( + TextSpan( + children: hasOutline ? textSpans.map(_toFillSpan).toList() : textSpans, + ), + textAlign: textAlign, + softWrap: softWrap, + overflow: overflow, + maxLines: maxLines, + ); + + return Stack( + children: [ + ?outline, + fill, + ], + ); + } + + TextSpan _toStrokeSpan(TextSpan span) => TextSpan( + text: span.text, + children: span.children, + style: (span.style ?? const TextStyle()).copyWith( + foreground: Paint() + ..style = PaintingStyle.stroke + ..color = outlineColor + ..strokeWidth = outlineWidth, + ), + ); + + TextSpan _toFillSpan(TextSpan span) => TextSpan( + text: span.text, + children: span.children, + style: (span.style ?? const TextStyle()).copyWith( + backgroundColor: Colors.transparent, + shadows: [], + ), + ); +} diff --git a/lib/widgets/common/basic/text_dropdown_button.dart b/lib/widgets/common/basic/text_dropdown_button.dart new file mode 100644 index 0000000..5d52225 --- /dev/null +++ b/lib/widgets/common/basic/text_dropdown_button.dart @@ -0,0 +1,100 @@ +import 'package:flutter/material.dart'; + +class TextDropdownButton<T> extends StatefulWidget { + final List<T> values; + final String Function(T value) valueText; + final IconData Function(T value)? valueIcon; + final T? value; + final Widget? underline; + final bool isExpanded; + final double? itemHeight; + final Color? dropdownColor; + final EdgeInsetsGeometry? padding; + final ValueChanged<T?>? onChanged; + + const TextDropdownButton({ + super.key, + required this.values, + required this.valueText, + this.valueIcon, + this.value, + this.underline, + this.isExpanded = false, + this.itemHeight = kMinInteractiveDimension, + this.dropdownColor, + this.padding, + required this.onChanged, + }); + + @override + State<TextDropdownButton<T>> createState() => _TextDropdownButtonState<T>(); +} + +class _TextDropdownButtonState<T> extends State<TextDropdownButton<T>> { + @override + Widget build(BuildContext context) { + return DropdownButton( + items: widget.values + .map( + (v) => DropdownMenuItem<T>( + value: v, + child: _buildItem(widget.valueText(v), widget.valueIcon?.call(v), selected: false), + ), + ) + .toList(), + selectedItemBuilder: (context) => widget.values + .map( + (v) => DropdownMenuItem<T>( + value: v, + child: _buildItem(widget.valueText(v), widget.valueIcon?.call(v), selected: true), + ), + ) + .toList(), + value: widget.value, + style: Theme.of(context).textTheme.titleMedium!.copyWith(fontWeight: FontWeight.normal), + underline: widget.underline, + isExpanded: widget.isExpanded, + itemHeight: widget.itemHeight, + dropdownColor: widget.dropdownColor, + padding: widget.padding, + onChanged: widget.onChanged, + ); + } + + static Widget _buildItem<T>(String text, IconData? icon, {required bool selected}) { + final softWrap = selected ? false : null; + final overflow = selected ? TextOverflow.fade : null; + + Widget child = icon != null + ? Text.rich( + TextSpan( + children: [ + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Padding( + padding: const EdgeInsetsDirectional.only(end: 8, bottom: 2), + child: Icon(icon), + ), + ), + TextSpan(text: text), + ], + ), + softWrap: softWrap, + overflow: overflow, + ) + : Text( + text, + softWrap: softWrap, + overflow: overflow, + ); + + if (selected) { + child = Align( + alignment: AlignmentDirectional.centerStart, + child: child, + ); + } + + return child; + } +} diff --git a/lib/widgets/common/basic/time_shift_selector.dart b/lib/widgets/common/basic/time_shift_selector.dart new file mode 100644 index 0000000..05f7704 --- /dev/null +++ b/lib/widgets/common/basic/time_shift_selector.dart @@ -0,0 +1,152 @@ +import 'package:aves/ref/locales.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:aves/widgets/common/basic/wheel.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class TimeShiftSelector extends StatefulWidget { + final TimeShiftController controller; + + const TimeShiftSelector({ + super.key, + required this.controller, + }); + + @override + State<TimeShiftSelector> createState() => _TimeShiftSelectorState(); +} + +class _TimeShiftSelectorState extends State<TimeShiftSelector> { + late ValueNotifier<int> _shiftHour, _shiftMinute, _shiftSecond; + late ValueNotifier<String> _shiftSign; + + static const _positiveSign = '+'; + static const _negativeSign = '-'; + + @override + void initState() { + super.initState(); + + var initialValue = widget.controller.initialValue; + final sign = initialValue.isNegative ? _negativeSign : _positiveSign; + initialValue = initialValue.abs(); + final hours = initialValue.inHours; + initialValue -= Duration(hours: hours); + final minutes = initialValue.inMinutes; + initialValue -= Duration(minutes: minutes); + final seconds = initialValue.inSeconds; + + _shiftSign = ValueNotifier(sign); + _shiftHour = ValueNotifier(hours); + _shiftMinute = ValueNotifier(minutes); + _shiftSecond = ValueNotifier(seconds); + + _shiftSign.addListener(_updateValue); + _shiftHour.addListener(_updateValue); + _shiftMinute.addListener(_updateValue); + _shiftSecond.addListener(_updateValue); + } + + @override + void dispose() { + _shiftSign.dispose(); + _shiftHour.dispose(); + _shiftMinute.dispose(); + _shiftSecond.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final timeComponentFormatter = NumberFormat('0', context.locale); + + const textStyle = TextStyle(fontSize: 34); + const digitsAlign = TextAlign.right; + + return Center( + child: Table( + textDirection: timeComponentsDirection, + children: [ + TableRow( + children: [ + const SizedBox(), + Center(child: Text(l10n.durationDialogHours)), + const SizedBox(width: 16), + Center(child: Text(l10n.durationDialogMinutes)), + const SizedBox(width: 16), + Center(child: Text(l10n.durationDialogSeconds)), + ], + ), + TableRow( + children: [ + WheelSelector( + valueNotifier: _shiftSign, + values: const [_positiveSign, _negativeSign], + textStyle: textStyle, + textAlign: TextAlign.center, + format: (v) => v, + ), + Align( + alignment: Alignment.centerRight, + child: WheelSelector( + valueNotifier: _shiftHour, + values: List.generate(hoursInDay, (i) => i), + textStyle: textStyle, + textAlign: digitsAlign, + format: timeComponentFormatter.format, + ), + ), + const Text( + ':', + style: textStyle, + ), + Align( + alignment: Alignment.centerLeft, + child: WheelSelector( + valueNotifier: _shiftMinute, + values: List.generate(minutesInHour, (i) => i), + textStyle: textStyle, + textAlign: digitsAlign, + format: timeComponentFormatter.format, + ), + ), + const Text( + ':', + style: textStyle, + ), + Align( + alignment: Alignment.centerLeft, + child: WheelSelector( + valueNotifier: _shiftSecond, + values: List.generate(secondsInMinute, (i) => i), + textStyle: textStyle, + textAlign: digitsAlign, + format: timeComponentFormatter.format, + ), + ), + ], + ), + ], + defaultColumnWidth: const IntrinsicColumnWidth(), + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + ), + ); + } + + void _updateValue() { + final sign = _shiftSign.value == _positiveSign ? 1 : -1; + final hours = _shiftHour.value; + final minutes = _shiftMinute.value; + final seconds = _shiftSecond.value; + widget.controller.value = Duration(hours: hours, minutes: minutes, seconds: seconds) * sign; + } +} + +class TimeShiftController { + final Duration initialValue; + Duration value; + + TimeShiftController({required this.initialValue}) : value = initialValue; +} diff --git a/lib/widgets/common/basic/tv_edge_focus.dart b/lib/widgets/common/basic/tv_edge_focus.dart new file mode 100644 index 0000000..190d047 --- /dev/null +++ b/lib/widgets/common/basic/tv_edge_focus.dart @@ -0,0 +1,25 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +// to be placed at the edges of lists and grids, +// so that TV can reach them with D-pad +class TvEdgeFocus extends StatelessWidget { + final FocusNode? focusNode; + + const TvEdgeFocus({ + super.key, + this.focusNode, + }); + + @override + Widget build(BuildContext context) { + final useTvLayout = context.select<Settings, bool>((v) => v.useTvLayout); + return useTvLayout + ? Focus( + focusNode: focusNode, + child: const SizedBox(), + ) + : const SizedBox(); + } +} diff --git a/lib/widgets/common/basic/wheel.dart b/lib/widgets/common/basic/wheel.dart new file mode 100644 index 0000000..e7076e1 --- /dev/null +++ b/lib/widgets/common/basic/wheel.dart @@ -0,0 +1,175 @@ +import 'package:aves/theme/durations.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; + +class WheelSelector<T> extends StatefulWidget { + final ValueNotifier<T> valueNotifier; + final List<T> values; + final TextStyle textStyle; + final TextAlign textAlign; + final String Function(T v) format; + + const WheelSelector({ + super.key, + required this.valueNotifier, + required this.values, + required this.textStyle, + required this.textAlign, + required this.format, + }); + + @override + State<WheelSelector<T>> createState() => _WheelSelectorState<T>(); +} + +class _WheelSelectorState<T> extends State<WheelSelector<T>> { + late final FixedExtentScrollController _controller; + final ValueNotifier<bool> _focusedNotifier = ValueNotifier(false); + + ValueNotifier<T> get valueNotifier => widget.valueNotifier; + + List<T> get values => widget.values; + + @override + void initState() { + super.initState(); + _controller = FixedExtentScrollController( + initialItem: values.indexOf(valueNotifier.value), + ); + } + + @override + void dispose() { + _controller.dispose(); + _focusedNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final textScaler = MediaQuery.textScalerOf(context); + const background = Colors.transparent; + final foreground = DefaultTextStyle.of(context).style.color!; + final transitionDuration = context.select<DurationsData, Duration>((v) => v.formTransition); + final itemSize = Size.square(textScaler.scale(40)); + + return FocusableActionDetector( + shortcuts: const { + SingleActivator(LogicalKeyboardKey.arrowUp): _AdjustValueIntent.up(), + SingleActivator(LogicalKeyboardKey.arrowDown): _AdjustValueIntent.down(), + }, + actions: { + _AdjustValueIntent: CallbackAction<_AdjustValueIntent>(onInvoke: _onAdjustValueIntent), + }, + onShowFocusHighlight: (v) => _focusedNotifier.value = v, + child: NotificationListener<ScrollNotification>( + // cancel notification bubbling so that the dialog scroll bar + // does not misinterpret wheel scrolling for dialog content scrolling + onNotification: (notification) => true, + child: Padding( + padding: const EdgeInsets.all(8), + child: Stack( + children: [ + Positioned.fill( + child: Center( + child: ValueListenableBuilder<bool>( + valueListenable: _focusedNotifier, + builder: (context, focused, child) { + return AnimatedContainer( + width: itemSize.width, + height: itemSize.height, + duration: transitionDuration, + decoration: BoxDecoration( + color: foreground.withValues(alpha: focused ? .2 : 0), + borderRadius: const BorderRadius.all(Radius.circular(8)), + ), + ); + }, + ), + ), + ), + SizedBox( + width: itemSize.width, + height: itemSize.height * 3, + child: ShaderMask( + shaderCallback: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + background, + foreground, + foreground, + background, + ], + ).createShader, + child: Theme( + data: Theme.of(context).copyWith( + scrollbarTheme: ScrollbarThemeData( + thumbVisibility: WidgetStateProperty.all(false), + ), + ), + child: ListWheelScrollView( + controller: _controller, + physics: const FixedExtentScrollPhysics(parent: BouncingScrollPhysics()), + diameterRatio: 1.2, + itemExtent: itemSize.height, + squeeze: 1.3, + onSelectedItemChanged: (i) => valueNotifier.value = values[i], + children: values + .map( + (i) => SizedBox.fromSize( + size: itemSize, + child: Text( + widget.format(i), + textAlign: widget.textAlign, + style: widget.textStyle, + ), + ), + ) + .toList(), + ), + ), + ), + ), + ], + ), + ), + ), + ); + } + + void _onAdjustValueIntent(_AdjustValueIntent intent) { + late int delta; + switch (intent.type) { + case _ValueAdjustmentType.up: + delta = -1; + case _ValueAdjustmentType.down: + delta = 1; + } + final targetItem = _controller.selectedItem + delta; + final duration = context.read<DurationsData>().formTransition; + if (duration > Duration.zero) { + _controller.animateToItem(targetItem, duration: duration, curve: Curves.easeInOutCubic); + } else { + _controller.jumpToItem(targetItem); + } + } +} + +class _AdjustValueIntent extends Intent { + const _AdjustValueIntent({ + required this.type, + }); + + const _AdjustValueIntent.up() : type = _ValueAdjustmentType.up; + + const _AdjustValueIntent.down() : type = _ValueAdjustmentType.down; + + final _ValueAdjustmentType type; +} + +enum _ValueAdjustmentType { + up, + down, +} diff --git a/lib/widgets/common/behaviour/eager_scale_gesture_recognizer.dart b/lib/widgets/common/behaviour/eager_scale_gesture_recognizer.dart new file mode 100644 index 0000000..987d31a --- /dev/null +++ b/lib/widgets/common/behaviour/eager_scale_gesture_recognizer.dart @@ -0,0 +1,576 @@ +// ignore_for_file: depend_on_referenced_packages +import 'dart:math' as math; + +import 'package:flutter/gestures.dart'; + +// adapted from Flutter `ScaleGestureRecognizer` in `/gestures/scale.dart` +// ignore_for_file: avoid_types_on_closure_parameters, unnecessary_null_comparison + +/// The possible states of a [ScaleGestureRecognizer]. +enum _ScaleState { + /// The recognizer is ready to start recognizing a gesture. + ready, + + /// The sequence of pointer events seen thus far is consistent with a scale + /// gesture but the gesture has not been accepted definitively. + possible, + + /// The sequence of pointer events seen thus far has been accepted + /// definitively as a scale gesture. + accepted, + + /// The sequence of pointer events seen thus far has been accepted + /// definitively as a scale gesture and the pointers established a focal point + /// and initial scale. + started, +} + +class _PointerPanZoomData { + _PointerPanZoomData.fromStartEvent(this.parent, PointerPanZoomStartEvent event) : _position = event.position, _pan = Offset.zero, _scale = 1, _rotation = 0; + + _PointerPanZoomData.fromUpdateEvent(this.parent, PointerPanZoomUpdateEvent event) : _position = event.position, _pan = event.pan, _scale = event.scale, _rotation = event.rotation; + + final EagerScaleGestureRecognizer parent; + final Offset _position; + final Offset _pan; + final double _scale; + final double _rotation; + + Offset get focalPoint { + if (parent.trackpadScrollCausesScale) { + return _position; + } + return _position + _pan; + } + + double get scale { + if (parent.trackpadScrollCausesScale) { + return _scale * math.exp((_pan.dx * parent.trackpadScrollToScaleFactor.dx) + (_pan.dy * parent.trackpadScrollToScaleFactor.dy)); + } + return _scale; + } + + double get rotation => _rotation; + + @override + String toString() => '_PointerPanZoomData(parent: $parent, _position: $_position, _pan: $_pan, _scale: $_scale, _rotation: $_rotation)'; +} + +//////////////////////////////////////////////////////////////////////////////// + +bool _isFlingGesture(Velocity velocity) { + final double speedSquared = velocity.pixelsPerSecond.distanceSquared; + return speedSquared > kMinFlingVelocity * kMinFlingVelocity; +} + +/// Defines a line between two pointers on screen. +/// +/// [_LineBetweenPointers] is an abstraction of a line between two pointers in +/// contact with the screen. Used to track the rotation of a scale gesture. +class _LineBetweenPointers { + /// Creates a [_LineBetweenPointers]. None of the [pointerStartLocation], [pointerStartId] + /// [pointerEndLocation] and [pointerEndId] must be null. [pointerStartId] and [pointerEndId] + /// should be different. + _LineBetweenPointers({ + this.pointerStartLocation = Offset.zero, + this.pointerStartId = 0, + this.pointerEndLocation = Offset.zero, + this.pointerEndId = 1, + }) : assert(pointerStartId != pointerEndId); + + // The location and the id of the pointer that marks the start of the line. + final Offset pointerStartLocation; + final int pointerStartId; + + // The location and the id of the pointer that marks the end of the line. + final Offset pointerEndLocation; + final int pointerEndId; +} + +/// Recognizes a scale gesture. +/// +/// [ScaleGestureRecognizer] tracks the pointers in contact with the screen and +/// calculates their focal point, indicated scale, and rotation. When a focal +/// point is established, the recognizer calls [onStart]. As the focal point, +/// scale, and rotation change, the recognizer calls [onUpdate]. When the +/// pointers are no longer in contact with the screen, the recognizer calls +/// [onEnd]. +class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer { + /// Create a gesture recognizer for interactions intended for scaling content. + /// + /// {@macro flutter.gestures.GestureRecognizer.supportedDevices} + EagerScaleGestureRecognizer({ + super.debugOwner, + super.supportedDevices, + super.allowedButtonsFilter, + this.dragStartBehavior = DragStartBehavior.down, + this.trackpadScrollCausesScale = false, + this.trackpadScrollToScaleFactor = kDefaultTrackpadScrollToScaleFactor, + }); + + /// Determines what point is used as the starting point in all calculations + /// involving this gesture. + /// + /// When set to [DragStartBehavior.down], the scale is calculated starting + /// from the position where the pointer first contacted the screen. + /// + /// When set to [DragStartBehavior.start], the scale is calculated starting + /// from the position where the scale gesture began. The scale gesture may + /// begin after the time that the pointer first contacted the screen if there + /// are multiple listeners competing for the gesture. In that case, the + /// gesture arena waits to determine whether or not the gesture is a scale + /// gesture before giving the gesture to this GestureRecognizer. This happens + /// in the case of nested GestureDetectors, for example. + /// + /// Defaults to [DragStartBehavior.down]. + /// + /// See also: + /// + /// * https://flutter.dev/docs/development/ui/advanced/gestures#gesture-disambiguation, + /// which provides more information about the gesture arena. + DragStartBehavior dragStartBehavior; + + /// The pointers in contact with the screen have established a focal point and + /// initial scale of 1.0. + /// + /// This won't be called until the gesture arena has determined that this + /// GestureRecognizer has won the gesture. + /// + /// See also: + /// + /// * https://flutter.dev/docs/development/ui/advanced/gestures#gesture-disambiguation, + /// which provides more information about the gesture arena. + GestureScaleStartCallback? onStart; + + /// The pointers in contact with the screen have indicated a new focal point + /// and/or scale. + GestureScaleUpdateCallback? onUpdate; + + /// The pointers are no longer in contact with the screen. + GestureScaleEndCallback? onEnd; + + _ScaleState _state = _ScaleState.ready; + + Matrix4? _lastTransform; + + /// {@template flutter.gestures.scale.trackpadScrollCausesScale} + /// Whether scrolling up/down on a trackpad should cause scaling instead of + /// panning. + /// + /// Defaults to false. + /// {@endtemplate} + bool trackpadScrollCausesScale; + + /// {@template flutter.gestures.scale.trackpadScrollToScaleFactor} + /// A factor to control the direction and magnitude of scale when converting + /// trackpad scrolling. + /// + /// Incoming trackpad pan offsets will be divided by this factor to get scale + /// values. Increasing this offset will reduce the amount of scaling caused by + /// a fixed amount of trackpad scrolling. + /// + /// Defaults to [kDefaultTrackpadScrollToScaleFactor]. + /// {@endtemplate} + Offset trackpadScrollToScaleFactor; + + /// The number of pointers being tracked by the gesture recognizer. + /// + /// Typically this is the number of fingers being used to pan the widget using the gesture + /// recognizer. + int get pointerCount { + return _pointerPanZooms.length + _pointerQueue.length; + } + + late Offset _initialFocalPoint; + Offset? _currentFocalPoint; + late double _initialSpan; + late double _currentSpan; + late double _initialHorizontalSpan; + late double _currentHorizontalSpan; + late double _initialVerticalSpan; + late double _currentVerticalSpan; + late Offset _localFocalPoint; + _LineBetweenPointers? _initialLine; + _LineBetweenPointers? _currentLine; + final Map<int, Offset> _pointerLocations = <int, Offset>{}; + final List<int> _pointerQueue = <int>[]; // A queue to sort pointers in order of entrance + final Map<int, VelocityTracker> _velocityTrackers = <int, VelocityTracker>{}; + VelocityTracker? _scaleVelocityTracker; + late Offset _delta; + final Map<int, _PointerPanZoomData> _pointerPanZooms = <int, _PointerPanZoomData>{}; + double _initialPanZoomScaleFactor = 1; + double _initialPanZoomRotationFactor = 0; + + double get _pointerScaleFactor => _initialSpan > 0.0 ? _currentSpan / _initialSpan : 1.0; + + double get _pointerHorizontalScaleFactor => _initialHorizontalSpan > 0.0 ? _currentHorizontalSpan / _initialHorizontalSpan : 1.0; + + double get _pointerVerticalScaleFactor => _initialVerticalSpan > 0.0 ? _currentVerticalSpan / _initialVerticalSpan : 1.0; + + double get _scaleFactor { + double scale = _pointerScaleFactor; + for (final _PointerPanZoomData p in _pointerPanZooms.values) { + scale *= p.scale / _initialPanZoomScaleFactor; + } + return scale; + } + + double get _horizontalScaleFactor { + double scale = _pointerHorizontalScaleFactor; + for (final _PointerPanZoomData p in _pointerPanZooms.values) { + scale *= p.scale / _initialPanZoomScaleFactor; + } + return scale; + } + + double get _verticalScaleFactor { + double scale = _pointerVerticalScaleFactor; + for (final _PointerPanZoomData p in _pointerPanZooms.values) { + scale *= p.scale / _initialPanZoomScaleFactor; + } + return scale; + } + + double _computeRotationFactor() { + double factor = 0.0; + if (_initialLine != null && _currentLine != null) { + final double fx = _initialLine!.pointerStartLocation.dx; + final double fy = _initialLine!.pointerStartLocation.dy; + final double sx = _initialLine!.pointerEndLocation.dx; + final double sy = _initialLine!.pointerEndLocation.dy; + + final double nfx = _currentLine!.pointerStartLocation.dx; + final double nfy = _currentLine!.pointerStartLocation.dy; + final double nsx = _currentLine!.pointerEndLocation.dx; + final double nsy = _currentLine!.pointerEndLocation.dy; + + final double angle1 = math.atan2(fy - sy, fx - sx); + final double angle2 = math.atan2(nfy - nsy, nfx - nsx); + + factor = angle2 - angle1; + } + for (final _PointerPanZoomData p in _pointerPanZooms.values) { + factor += p.rotation; + } + factor -= _initialPanZoomRotationFactor; + return factor; + } + + @override + void addAllowedPointer(PointerDownEvent event) { + super.addAllowedPointer(event); + _velocityTrackers[event.pointer] = VelocityTracker.withKind(event.kind); + if (_state == _ScaleState.ready) { + _state = _ScaleState.possible; + _initialSpan = 0.0; + _currentSpan = 0.0; + _initialHorizontalSpan = 0.0; + _currentHorizontalSpan = 0.0; + _initialVerticalSpan = 0.0; + _currentVerticalSpan = 0.0; + } + } + + @override + bool isPointerPanZoomAllowed(PointerPanZoomStartEvent event) => true; + + @override + void addAllowedPointerPanZoom(PointerPanZoomStartEvent event) { + super.addAllowedPointerPanZoom(event); + startTrackingPointer(event.pointer, event.transform); + _velocityTrackers[event.pointer] = VelocityTracker.withKind(event.kind); + if (_state == _ScaleState.ready) { + _state = _ScaleState.possible; + _initialPanZoomScaleFactor = 1.0; + _initialPanZoomRotationFactor = 0.0; + } + } + + @override + void handleEvent(PointerEvent event) { + assert(_state != _ScaleState.ready); + bool didChangeConfiguration = false; + bool shouldStartIfAccepted = false; + if (event is PointerMoveEvent) { + final VelocityTracker tracker = _velocityTrackers[event.pointer]!; + if (!event.synthesized) { + tracker.addPosition(event.timeStamp, event.position); + } + _pointerLocations[event.pointer] = event.position; + shouldStartIfAccepted = true; + _lastTransform = event.transform; + } else if (event is PointerDownEvent) { + _pointerLocations[event.pointer] = event.position; + _pointerQueue.add(event.pointer); + didChangeConfiguration = true; + shouldStartIfAccepted = true; + _lastTransform = event.transform; + } else if (event is PointerUpEvent || event is PointerCancelEvent) { + _pointerLocations.remove(event.pointer); + _pointerQueue.remove(event.pointer); + didChangeConfiguration = true; + _lastTransform = event.transform; + } else if (event is PointerPanZoomStartEvent) { + assert(_pointerPanZooms[event.pointer] == null); + _pointerPanZooms[event.pointer] = _PointerPanZoomData.fromStartEvent(this, event); + didChangeConfiguration = true; + shouldStartIfAccepted = true; + _lastTransform = event.transform; + } else if (event is PointerPanZoomUpdateEvent) { + assert(_pointerPanZooms[event.pointer] != null); + if (!event.synthesized && !trackpadScrollCausesScale) { + _velocityTrackers[event.pointer]!.addPosition(event.timeStamp, event.pan); + } + _pointerPanZooms[event.pointer] = _PointerPanZoomData.fromUpdateEvent(this, event); + _lastTransform = event.transform; + shouldStartIfAccepted = true; + } else if (event is PointerPanZoomEndEvent) { + assert(_pointerPanZooms[event.pointer] != null); + _pointerPanZooms.remove(event.pointer); + didChangeConfiguration = true; + } + + _updateLines(); + _update(); + + if (!didChangeConfiguration || _reconfigure(event.pointer)) { + _advanceStateMachine(shouldStartIfAccepted, event); + } + stopTrackingIfPointerNoLongerDown(event); + } + + void _update() { + final Offset? previousFocalPoint = _currentFocalPoint; + + // Compute the focal point + Offset focalPoint = Offset.zero; + for (final int pointer in _pointerLocations.keys) { + focalPoint += _pointerLocations[pointer]!; + } + for (final _PointerPanZoomData p in _pointerPanZooms.values) { + focalPoint += p.focalPoint; + } + _currentFocalPoint = pointerCount > 0 ? focalPoint / pointerCount.toDouble() : Offset.zero; + + if (previousFocalPoint == null) { + _localFocalPoint = PointerEvent.transformPosition( + _lastTransform, + _currentFocalPoint!, + ); + _delta = Offset.zero; + } else { + final Offset localPreviousFocalPoint = _localFocalPoint; + _localFocalPoint = PointerEvent.transformPosition( + _lastTransform, + _currentFocalPoint!, + ); + _delta = _localFocalPoint - localPreviousFocalPoint; + } + + final int count = _pointerLocations.keys.length; + + Offset pointerFocalPoint = Offset.zero; + for (final int pointer in _pointerLocations.keys) { + pointerFocalPoint += _pointerLocations[pointer]!; + } + if (count > 0) { + pointerFocalPoint = pointerFocalPoint / count.toDouble(); + } + + // Span is the average deviation from focal point. Horizontal and vertical + // spans are the average deviations from the focal point's horizontal and + // vertical coordinates, respectively. + double totalDeviation = 0.0; + double totalHorizontalDeviation = 0.0; + double totalVerticalDeviation = 0.0; + for (final int pointer in _pointerLocations.keys) { + totalDeviation += (pointerFocalPoint - _pointerLocations[pointer]!).distance; + totalHorizontalDeviation += (pointerFocalPoint.dx - _pointerLocations[pointer]!.dx).abs(); + totalVerticalDeviation += (pointerFocalPoint.dy - _pointerLocations[pointer]!.dy).abs(); + } + _currentSpan = count > 0 ? totalDeviation / count : 0.0; + _currentHorizontalSpan = count > 0 ? totalHorizontalDeviation / count : 0.0; + _currentVerticalSpan = count > 0 ? totalVerticalDeviation / count : 0.0; + } + + /// Updates [_initialLine] and [_currentLine] accordingly to the situation of + /// the registered pointers. + void _updateLines() { + final int count = _pointerLocations.keys.length; + assert(_pointerQueue.length >= count); + + /// In case of just one pointer registered, reconfigure [_initialLine] + if (count < 2) { + _initialLine = _currentLine; + } else if (_initialLine != null && _initialLine!.pointerStartId == _pointerQueue[0] && _initialLine!.pointerEndId == _pointerQueue[1]) { + /// Rotation updated, set the [_currentLine] + _currentLine = _LineBetweenPointers( + pointerStartId: _pointerQueue[0], + pointerStartLocation: _pointerLocations[_pointerQueue[0]]!, + pointerEndId: _pointerQueue[1], + pointerEndLocation: _pointerLocations[_pointerQueue[1]]!, + ); + } else { + /// A new rotation process is on the way, set the [_initialLine] + _initialLine = _LineBetweenPointers( + pointerStartId: _pointerQueue[0], + pointerStartLocation: _pointerLocations[_pointerQueue[0]]!, + pointerEndId: _pointerQueue[1], + pointerEndLocation: _pointerLocations[_pointerQueue[1]]!, + ); + _currentLine = _initialLine; + } + } + + bool _reconfigure(int pointer) { + _initialFocalPoint = _currentFocalPoint!; + _initialSpan = _currentSpan; + _initialLine = _currentLine; + _initialHorizontalSpan = _currentHorizontalSpan; + _initialVerticalSpan = _currentVerticalSpan; + if (_pointerPanZooms.isEmpty) { + _initialPanZoomScaleFactor = 1.0; + _initialPanZoomRotationFactor = 0.0; + } else { + _initialPanZoomScaleFactor = _scaleFactor / _pointerScaleFactor; + _initialPanZoomRotationFactor = _pointerPanZooms.values.map((_PointerPanZoomData x) => x.rotation).reduce((double a, double b) => a + b); + } + if (_state == _ScaleState.started) { + if (onEnd != null) { + final VelocityTracker tracker = _velocityTrackers[pointer]!; + + Velocity velocity = tracker.getVelocity(); + if (_isFlingGesture(velocity)) { + final Offset pixelsPerSecond = velocity.pixelsPerSecond; + if (pixelsPerSecond.distanceSquared > kMaxFlingVelocity * kMaxFlingVelocity) { + velocity = Velocity(pixelsPerSecond: (pixelsPerSecond / pixelsPerSecond.distance) * kMaxFlingVelocity); + } + invokeCallback<void>('onEnd', () => onEnd!(ScaleEndDetails(velocity: velocity, scaleVelocity: _scaleVelocityTracker?.getVelocity().pixelsPerSecond.dx ?? -1, pointerCount: pointerCount))); + } else { + invokeCallback<void>('onEnd', () => onEnd!(ScaleEndDetails(scaleVelocity: _scaleVelocityTracker?.getVelocity().pixelsPerSecond.dx ?? -1, pointerCount: pointerCount))); + } + } + _state = _ScaleState.accepted; + _scaleVelocityTracker = VelocityTracker.withKind(PointerDeviceKind.touch); // arbitrary PointerDeviceKind + return false; + } + _scaleVelocityTracker = VelocityTracker.withKind(PointerDeviceKind.touch); // arbitrary PointerDeviceKind + return true; + } + + void _advanceStateMachine(bool shouldStartIfAccepted, PointerEvent event) { + if (_state == _ScaleState.ready) { + _state = _ScaleState.possible; + } + + // TLAD insert start + if (_pointerQueue.length == 2) { + resolve(GestureDisposition.accepted); + } + // TLAD insert end + + if (_state == _ScaleState.possible) { + final double spanDelta = (_currentSpan - _initialSpan).abs(); + final double focalPointDelta = (_currentFocalPoint! - _initialFocalPoint).distance; + if (spanDelta > computeScaleSlop(event.kind) || focalPointDelta > computePanSlop(event.kind, gestureSettings) || math.max(_scaleFactor / _pointerScaleFactor, _pointerScaleFactor / _scaleFactor) > 1.05) { + resolve(GestureDisposition.accepted); + } + } else if (_state.index >= _ScaleState.accepted.index) { + resolve(GestureDisposition.accepted); + } + + if (_state == _ScaleState.accepted && shouldStartIfAccepted) { + _state = _ScaleState.started; + _dispatchOnStartCallbackIfNeeded(); + } + + if (_state == _ScaleState.started) { + _scaleVelocityTracker?.addPosition(event.timeStamp, Offset(_scaleFactor, 0)); + if (onUpdate != null) { + invokeCallback<void>('onUpdate', () { + onUpdate!( + ScaleUpdateDetails( + scale: _scaleFactor, + horizontalScale: _horizontalScaleFactor, + verticalScale: _verticalScaleFactor, + focalPoint: _currentFocalPoint!, + localFocalPoint: _localFocalPoint, + rotation: _computeRotationFactor(), + pointerCount: pointerCount, + focalPointDelta: _delta, + ), + ); + }); + } + } + } + + void _dispatchOnStartCallbackIfNeeded() { + assert(_state == _ScaleState.started); + if (onStart != null) { + invokeCallback<void>('onStart', () { + onStart!( + ScaleStartDetails( + focalPoint: _currentFocalPoint!, + localFocalPoint: _localFocalPoint, + pointerCount: pointerCount, + ), + ); + }); + } + } + + @override + void acceptGesture(int pointer) { + if (_state == _ScaleState.possible) { + _state = _ScaleState.started; + _dispatchOnStartCallbackIfNeeded(); + if (dragStartBehavior == DragStartBehavior.start) { + _initialFocalPoint = _currentFocalPoint!; + _initialSpan = _currentSpan; + _initialLine = _currentLine; + _initialHorizontalSpan = _currentHorizontalSpan; + _initialVerticalSpan = _currentVerticalSpan; + if (_pointerPanZooms.isEmpty) { + _initialPanZoomScaleFactor = 1.0; + _initialPanZoomRotationFactor = 0.0; + } else { + _initialPanZoomScaleFactor = _scaleFactor / _pointerScaleFactor; + _initialPanZoomRotationFactor = _pointerPanZooms.values.map((_PointerPanZoomData x) => x.rotation).reduce((double a, double b) => a + b); + } + } + } + } + + @override + void rejectGesture(int pointer) { + _pointerPanZooms.remove(pointer); + _pointerLocations.remove(pointer); + _pointerQueue.remove(pointer); + stopTrackingPointer(pointer); + } + + @override + void didStopTrackingLastPointer(int pointer) { + switch (_state) { + case _ScaleState.possible: + resolve(GestureDisposition.rejected); + case _ScaleState.ready: + assert(false); // We should have not seen a pointer yet + case _ScaleState.accepted: + break; + case _ScaleState.started: + assert(false); // We should be in the accepted state when user is done + } + _state = _ScaleState.ready; + } + + @override + void dispose() { + _velocityTrackers.clear(); + super.dispose(); + } + + @override + String get debugDescription => 'scale'; +} diff --git a/lib/widgets/common/behaviour/intents.dart b/lib/widgets/common/behaviour/intents.dart new file mode 100644 index 0000000..98dcfd7 --- /dev/null +++ b/lib/widgets/common/behaviour/intents.dart @@ -0,0 +1,27 @@ +import 'package:flutter/widgets.dart'; + +class ScrollControllerAction extends CallbackAction<ScrollIntent> { + ScrollControllerAction({ + required ScrollController scrollController, + }) : super(onInvoke: (intent) => _onScrollIntent(intent, scrollController)); + + static void _onScrollIntent( + ScrollIntent intent, + ScrollController scrollController, + ) { + late int factor; + switch (intent.direction) { + case AxisDirection.up: + case AxisDirection.left: + factor = -1; + case AxisDirection.down: + case AxisDirection.right: + factor = 1; + } + scrollController.animateTo( + scrollController.offset + factor * 150, + duration: const Duration(milliseconds: 500), + curve: Curves.easeOutCubic, + ); + } +} diff --git a/lib/widgets/common/behaviour/known_extent_scroll_physics.dart b/lib/widgets/common/behaviour/known_extent_scroll_physics.dart new file mode 100644 index 0000000..018a049 --- /dev/null +++ b/lib/widgets/common/behaviour/known_extent_scroll_physics.dart @@ -0,0 +1,83 @@ +import 'package:flutter/physics.dart'; +import 'package:flutter/widgets.dart'; + +// adapted from Flutter `FixedExtentScrollPhysics` in `/widgets/list_wheel_scroll_view.dart` +class KnownExtentScrollPhysics extends ScrollPhysics { + final double Function(int index) indexToScrollOffset; + final int Function(double offset) scrollOffsetToIndex; + + const KnownExtentScrollPhysics({ + required this.indexToScrollOffset, + required this.scrollOffsetToIndex, + super.parent, + }); + + @override + KnownExtentScrollPhysics applyTo(ScrollPhysics? ancestor) { + return KnownExtentScrollPhysics( + indexToScrollOffset: indexToScrollOffset, + scrollOffsetToIndex: scrollOffsetToIndex, + parent: buildParent(ancestor), + ); + } + + @override + Simulation? createBallisticSimulation(ScrollMetrics position, double velocity) { + final ScrollMetrics metrics = position; + + // Scenario 1: + // If we're out of range and not headed back in range, defer to the parent + // ballistics, which should put us back in range at the scrollable's boundary. + if ((velocity <= 0.0 && metrics.pixels <= metrics.minScrollExtent) || (velocity >= 0.0 && metrics.pixels >= metrics.maxScrollExtent)) { + return super.createBallisticSimulation(metrics, velocity); + } + + // Create a test simulation to see where it would have ballistically fallen + // naturally without settling onto items. + final Simulation? testFrictionSimulation = super.createBallisticSimulation(metrics, velocity); + + // Scenario 2: + // If it was going to end up past the scroll extent, defer back to the + // parent physics' ballistics again which should put us on the scrollable's + // boundary. + if (testFrictionSimulation != null && (testFrictionSimulation.x(double.infinity) == metrics.minScrollExtent || testFrictionSimulation.x(double.infinity) == metrics.maxScrollExtent)) { + return super.createBallisticSimulation(metrics, velocity); + } + + // From the natural final position, find the nearest item it should have + // settled to. + final offset = (testFrictionSimulation?.x(double.infinity) ?? metrics.pixels).clamp(metrics.minScrollExtent, metrics.maxScrollExtent); + final int settlingItemIndex = scrollOffsetToIndex(offset); + final double settlingPixels = indexToScrollOffset(settlingItemIndex); + + // Scenario 3: + // If there's no velocity and we're already at where we intend to land, + // do nothing. + if (velocity.abs() < toleranceFor(position).velocity && (settlingPixels - metrics.pixels).abs() < toleranceFor(position).distance) { + return null; + } + + // Scenario 4: + // If we're going to end back at the same item because initial velocity + // is too low to break past it, use a spring simulation to get back. + if (settlingItemIndex == scrollOffsetToIndex(metrics.pixels)) { + return SpringSimulation( + spring, + metrics.pixels, + settlingPixels, + velocity, + tolerance: toleranceFor(position), + ); + } + + // Scenario 5: + // Create a new friction simulation except the drag will be tweaked to land + // exactly on the item closest to the natural stopping point. + return FrictionSimulation.through( + metrics.pixels, + settlingPixels, + velocity, + toleranceFor(position).velocity * velocity.sign, + ); + } +} diff --git a/lib/widgets/common/behaviour/pop/double_back.dart b/lib/widgets/common/behaviour/pop/double_back.dart new file mode 100644 index 0000000..d73aa56 --- /dev/null +++ b/lib/widgets/common/behaviour/pop/double_back.dart @@ -0,0 +1,49 @@ +import 'dart:async'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/behaviour/pop/scope.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:overlay_support/overlay_support.dart'; +import 'package:provider/provider.dart'; + +final DoubleBackPopHandler doubleBackPopHandler = DoubleBackPopHandler._private(); + +class DoubleBackPopHandler extends PopHandler { + bool _backOnce = false; + Timer? _backTimer; + + DoubleBackPopHandler._private(); + + @override + bool canPop(BuildContext context) { + if (context.select<Settings, bool>((v) => !v.mustBackTwiceToExit)) return true; + if (Navigator.canPop(context)) return true; + return false; + } + + @override + void onPopBlocked(BuildContext context) { + if (_backOnce) { + if (Navigator.canPop(context)) { + Navigator.maybeOf(context)?.pop(); + } else { + // exit + reportService.log('Exit by pop'); + PopExitNotification().dispatch(context); + SystemNavigator.pop(); + } + } else { + _backOnce = true; + _backTimer?.cancel(); + _backTimer = Timer(ADurations.doubleBackTimerDelay, () => _backOnce = false); + toast( + context.l10n.doubleBackExitMessage, + duration: ADurations.doubleBackTimerDelay, + ); + } + } +} diff --git a/lib/widgets/common/behaviour/pop/scope.dart b/lib/widgets/common/behaviour/pop/scope.dart new file mode 100644 index 0000000..916d27e --- /dev/null +++ b/lib/widgets/common/behaviour/pop/scope.dart @@ -0,0 +1,54 @@ +import 'package:collection/collection.dart'; +import 'package:flutter/widgets.dart'; + +// this widget combines multiple pop handlers with a guaranteed order +class AvesPopScope extends StatelessWidget { + final List<PopHandler> handlers; + final Widget child; + + const AvesPopScope({ + super.key, + required this.handlers, + required this.child, + }); + + @override + Widget build(BuildContext context) { + final blocker = handlers.firstWhereOrNull((v) => !v.canPop(context)); + return PopScope( + canPop: blocker == null, + onPopInvokedWithResult: (didPop, result) { + if (!didPop) { + blocker?.onPopBlocked(context); + } + }, + child: child, + ); + } +} + +abstract class PopHandler { + bool canPop(BuildContext context); + + void onPopBlocked(BuildContext context); +} + +class APopHandler implements PopHandler { + final bool Function(BuildContext context) _canPop; + final void Function(BuildContext context) _onPopBlocked; + + APopHandler({ + required bool Function(BuildContext context) canPop, + required void Function(BuildContext context) onPopBlocked, + }) : _canPop = canPop, + _onPopBlocked = onPopBlocked; + + @override + bool canPop(BuildContext context) => _canPop(context); + + @override + void onPopBlocked(BuildContext context) => _onPopBlocked(context); +} + +@immutable +class PopExitNotification extends Notification {} diff --git a/lib/widgets/common/behaviour/pop/tv_navigation.dart b/lib/widgets/common/behaviour/pop/tv_navigation.dart new file mode 100644 index 0000000..4935907 --- /dev/null +++ b/lib/widgets/common/behaviour/pop/tv_navigation.dart @@ -0,0 +1,43 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/behaviour/pop/scope.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +final TvNavigationPopHandler tvNavigationPopHandler = TvNavigationPopHandler._private(); + +// address `TV-DB` requirement from https://developer.android.com/docs/quality-guidelines/tv-app-quality +class TvNavigationPopHandler implements PopHandler { + TvNavigationPopHandler._private(); + + @override + bool canPop(BuildContext context) { + if (context.select<Settings, bool>((v) => !v.useTvLayout)) return true; + if (_isHome(context)) return true; + return false; + } + + @override + void onPopBlocked(BuildContext context) { + Navigator.maybeOf(context)?.pushAndRemoveUntil( + settings.homeNavItem.routeBuilder(context, topLevel: true), + (route) => false, + ); + } + + static bool _isHome(BuildContext context) { + final home = settings.homeNavItem; + final currentRoute = context.currentRouteName; + + if (currentRoute != home.route) return false; + + switch (home.route) { + case CollectionPage.routeName: + return context.read<CollectionLens>().filters.isEmpty; + default: + return true; + } + } +} diff --git a/lib/widgets/common/behaviour/route_tracker.dart b/lib/widgets/common/behaviour/route_tracker.dart new file mode 100644 index 0000000..274e08a --- /dev/null +++ b/lib/widgets/common/behaviour/route_tracker.dart @@ -0,0 +1,18 @@ +import 'package:aves/services/common/services.dart'; +import 'package:flutter/material.dart'; + +class ReportingRouteTracker extends NavigatorObserver { + @override + void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) => reportService.log('Nav push to ${_name(route)}'); + + @override + void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) => reportService.log('Nav pop to ${_name(previousRoute)}'); + + @override + void didRemove(Route<dynamic> route, Route<dynamic>? previousRoute) => reportService.log('Nav remove to ${_name(previousRoute)}'); + + @override + void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) => reportService.log('Nav replace to ${_name(newRoute)}'); + + String _name(Route<dynamic>? route) => route?.settings.name ?? 'unnamed ${route?.runtimeType}'; +} diff --git a/lib/widgets/common/behaviour/routes.dart b/lib/widgets/common/behaviour/routes.dart new file mode 100644 index 0000000..848043a --- /dev/null +++ b/lib/widgets/common/behaviour/routes.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +class DirectPageTransitionsTheme extends PageTransitionsTheme { + const DirectPageTransitionsTheme(); + + @override + Widget buildTransitions<T>( + PageRoute<T> route, + BuildContext context, + Animation<double> animation, + Animation<double> secondaryAnimation, + Widget child, + ) => child; +} + +class DirectMaterialPageRoute<T> extends PageRouteBuilder<T> { + DirectMaterialPageRoute({ + super.settings, + required WidgetBuilder builder, + }) : super( + transitionDuration: Duration.zero, + pageBuilder: (context, a, sa) => builder(context), + ); + + @override + Widget buildTransitions(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) { + return child; + } +} + +class TransparentMaterialPageRoute<T> extends PageRouteBuilder<T> { + TransparentMaterialPageRoute({ + super.settings, + required super.pageBuilder, + }); + + @override + bool get opaque => false; + + @override + Widget buildTransitions(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) { + final theme = Theme.of(context).pageTransitionsTheme; + return theme.buildTransitions<T>(this, context, animation, secondaryAnimation, child); + } +} diff --git a/lib/widgets/common/behaviour/sloppy_scroll_physics.dart b/lib/widgets/common/behaviour/sloppy_scroll_physics.dart new file mode 100644 index 0000000..f850795 --- /dev/null +++ b/lib/widgets/common/behaviour/sloppy_scroll_physics.dart @@ -0,0 +1,30 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/widgets.dart'; + +// TODO TLAD merge with `MagnifierScrollerPhysics` +class SloppyScrollPhysics extends ScrollPhysics { + final DeviceGestureSettings? gestureSettings; + + // in [0, 1] + // 0: most reactive but will not let Magnifier recognizers accept gestures + // 1: less reactive but gives the most leeway to Magnifier recognizers + final double touchSlopFactor; + + const SloppyScrollPhysics({ + required this.gestureSettings, + this.touchSlopFactor = 1, + super.parent, + }); + + @override + SloppyScrollPhysics applyTo(ScrollPhysics? ancestor) { + return SloppyScrollPhysics( + gestureSettings: gestureSettings, + touchSlopFactor: touchSlopFactor, + parent: buildParent(ancestor), + ); + } + + @override + double get dragStartDistanceMotionThreshold => (gestureSettings?.touchSlop ?? kTouchSlop) * touchSlopFactor; +} diff --git a/lib/widgets/common/behaviour/springy_scroll_physics.dart b/lib/widgets/common/behaviour/springy_scroll_physics.dart new file mode 100644 index 0000000..51b887c --- /dev/null +++ b/lib/widgets/common/behaviour/springy_scroll_physics.dart @@ -0,0 +1,19 @@ +import 'package:flutter/widgets.dart'; + +class SpringyScrollPhysics extends ScrollPhysics { + @override + final SpringDescription spring; + + const SpringyScrollPhysics({ + required this.spring, + super.parent, + }); + + @override + SpringyScrollPhysics applyTo(ScrollPhysics? ancestor) { + return SpringyScrollPhysics( + spring: spring, + parent: buildParent(ancestor), + ); + } +} diff --git a/lib/widgets/common/expandable_filter_row.dart b/lib/widgets/common/expandable_filter_row.dart new file mode 100644 index 0000000..0775e5f --- /dev/null +++ b/lib/widgets/common/expandable_filter_row.dart @@ -0,0 +1,181 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:flutter/material.dart'; + +class TitledExpandableFilterRow extends StatelessWidget { + final String title; + final List<CollectionFilter> filters; + final ValueNotifier<String?> expandedNotifier; + final bool showGenericIcon; + final HeroType Function(CollectionFilter filter)? heroTypeBuilder; + final AFilterCallback onTap; + final OffsetFilterCallback? onLongPress; + + const TitledExpandableFilterRow({ + super.key, + required this.title, + required this.filters, + required this.expandedNotifier, + this.showGenericIcon = true, + this.heroTypeBuilder, + required this.onTap, + required this.onLongPress, + }); + + @override + Widget build(BuildContext context) { + if (filters.isEmpty) return const SizedBox(); + + final isExpanded = expandedNotifier.value == title; + + Widget header = Text( + title, + style: AStyles.knownTitleText, + ); + void toggle() => expandedNotifier.value = isExpanded ? null : title; + if (settings.useTvLayout) { + header = Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: InkWell( + onTap: toggle, + borderRadius: const BorderRadius.all(Radius.circular(123)), + child: Padding( + padding: const EdgeInsets.all(16), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + header, + const SizedBox(width: 16), + Icon(isExpanded ? AIcons.collapse : AIcons.expand), + ], + ), + ), + ), + ); + } else { + header = Padding( + padding: const EdgeInsets.all(16), + child: Row( + children: [ + header, + const Spacer(), + IconButton( + icon: Icon(isExpanded ? AIcons.collapse : AIcons.expand), + onPressed: toggle, + tooltip: isExpanded ? MaterialLocalizations.of(context).expandedIconTapHint : MaterialLocalizations.of(context).collapsedIconTapHint, + ), + ], + ), + ); + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + header, + ExpandableFilterRow( + filters: filters, + isExpanded: isExpanded, + showGenericIcon: showGenericIcon, + heroTypeBuilder: heroTypeBuilder, + onTap: onTap, + onLongPress: onLongPress, + ), + ], + ); + } +} + +class ExpandableFilterRow extends StatelessWidget { + final List<CollectionFilter> filters; + final bool isExpanded; + final bool showGenericIcon; + final Widget? Function(CollectionFilter)? leadingBuilder; + final HeroType Function(CollectionFilter filter)? heroTypeBuilder; + final AFilterCallback onTap; + final AFilterCallback? onRemove; + final OffsetFilterCallback? onLongPress; + + static const double horizontalPadding = 8; + static const double verticalPadding = 8; + + const ExpandableFilterRow({ + super.key, + required this.filters, + required this.isExpanded, + this.showGenericIcon = true, + this.leadingBuilder, + this.heroTypeBuilder, + required this.onTap, + this.onRemove, + required this.onLongPress, + }); + + @override + Widget build(BuildContext context) { + if (filters.isEmpty) return const SizedBox(); + return AnimatedSwitcher( + duration: ADurations.filterRowExpandAnimation, + layoutBuilder: (currentChild, previousChildren) => Stack( + children: [ + ...previousChildren, + ?currentChild, + ], + ), + child: isExpanded ? _buildExpanded() : _buildCollapsed(), + ); + } + + Widget _buildExpanded() { + return Container( + key: const Key('wrap'), + padding: const EdgeInsets.symmetric(horizontal: horizontalPadding), + // specify transparent as a workaround to prevent + // chip border clipping when the floating app bar is fading + color: Colors.transparent, + child: Wrap( + spacing: horizontalPadding, + runSpacing: verticalPadding, + children: filters.map(_buildChip).toList(), + ), + ); + } + + Widget _buildCollapsed() { + final list = Container( + key: const Key('list'), + // specify transparent as a workaround to prevent + // chip border clipping when the floating app bar is fading + color: Colors.transparent, + height: AvesFilterChip.minChipHeight, + child: ListView.separated( + scrollDirection: Axis.horizontal, + padding: const EdgeInsets.symmetric(horizontal: horizontalPadding), + itemBuilder: (context, index) { + return index < filters.length ? _buildChip(filters[index]) : const SizedBox(); + }, + separatorBuilder: (context, index) => const SizedBox(width: 8), + itemCount: filters.length, + ), + ); + return list; + } + + Widget _buildChip(CollectionFilter filter) { + return AvesFilterChip( + // key is expected by test driver + key: Key(filter.key), + filter: filter, + allowGenericIcon: showGenericIcon, + leadingOverride: leadingBuilder?.call(filter), + heroType: heroTypeBuilder?.call(filter) ?? HeroType.onTap, + onTap: onTap, + onRemove: onRemove, + onLongPress: onLongPress, + ); + } +} diff --git a/lib/widgets/common/extensions/build_context.dart b/lib/widgets/common/extensions/build_context.dart new file mode 100644 index 0000000..ba02734 --- /dev/null +++ b/lib/widgets/common/extensions/build_context.dart @@ -0,0 +1,25 @@ +import 'package:aves/l10n/l10n.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraContext on BuildContext { + String? get currentRouteName => ModalRoute.of(this)?.settings.name; + + AppLocalizations get l10n => AppLocalizations.of(this)!; + + String get locale => l10n.localeName; + + bool get isArabic => locale.startsWith('ar'); + + bool get isRtl => Directionality.of(this) == TextDirection.rtl; + + String applyDirectionality(String text) => '$_directionalityMark$text'; + + String get _directionalityMark { + if (isRtl) { + return isArabic ? Unicode.ALM : Unicode.RLM; + } else { + return Unicode.LRM; + } + } +} diff --git a/lib/widgets/common/extensions/geometry.dart b/lib/widgets/common/extensions/geometry.dart new file mode 100644 index 0000000..3979c4a --- /dev/null +++ b/lib/widgets/common/extensions/geometry.dart @@ -0,0 +1,7 @@ +import 'dart:ui'; + +extension ExtraRect on Rect { + bool containsIncludingBottomRight(Offset offset, {double tolerance = 0}) { + return offset.dx >= left - tolerance && offset.dx <= right + tolerance && offset.dy >= top - tolerance && offset.dy <= bottom + tolerance; + } +} diff --git a/lib/widgets/common/extensions/media_query.dart b/lib/widgets/common/extensions/media_query.dart new file mode 100644 index 0000000..f3a1cfc --- /dev/null +++ b/lib/widgets/common/extensions/media_query.dart @@ -0,0 +1,65 @@ +import 'dart:math'; + +import 'package:flutter/widgets.dart'; + +extension ExtraMediaQueryData on MediaQueryData { + /* + examples of MediaQuery props in practice + + -- Flutter v1.22.5 + + S20, Android 11, portrait, notch top, button nav bar bottom + padding EdgeInsets(0.0, 26.0, 0.0, 48.0) + viewPadding EdgeInsets(0.0, 26.0, 0.0, 48.0) + viewInsets EdgeInsets.zero + + S20, Android 11, landscape, notch left, button nav bar right + padding EdgeInsets(26.0, 24.0, 0.0, 0.0) + viewPadding EdgeInsets(26.0, 24.0, 0.0, 0.0) + viewInsets EdgeInsets.zero + + S10e, Android 10, portrait, notch top, button nav bar bottom + padding EdgeInsets(0.0, 39.0, 0.0, 0.0) + viewPadding EdgeInsets(0.0, 39.0, 0.0, 0.0) + viewInsets EdgeInsets(0.0, 0.0, 0.0, 48.0) + + S10e, Android 10, portrait, notch top, gesture nav bar bottom + padding EdgeInsets(0.0, 39.0, 0.0, 0.0) + viewPadding EdgeInsets(0.0, 39.0, 0.0, 0.0) + viewInsets EdgeInsets(0.0, 0.0, 0.0, 15.0) + + S10e, Android 10, landscape, notch left, button nav bar right + padding EdgeInsets(38.7, 24.0, 0.0, 0.0) + viewPadding EdgeInsets(38.7, 24.0, 0.0, 0.0) + viewInsets EdgeInsets.zero + + S7, portrait/landscape, no notch, no nav bar + padding EdgeInsets(0.0, 24.0, 0.0, 0.0) + viewPadding EdgeInsets(0.0, 24.0, 0.0, 0.0) + viewInsets EdgeInsets.zero + + -- Flutter v2.2.1 + + S10e, Android 11, portrait, notch top, button nav bar bottom, keyboard off + padding EdgeInsets(0.0, 39.0, 0.0, 48.0) + viewPadding EdgeInsets(0.0, 39.0, 0.0, 48.0) + viewInsets EdgeInsets.zero + + S10e, Android 11, portrait, notch top, button nav bar bottom, keyboard on + padding EdgeInsets(0.0, 39.0, 0.0, 0.0) + viewPadding EdgeInsets(0.0, 39.0, 0.0, 48.0) + viewInsets EdgeInsets(0.0, 0.0, 0.0, 338.0) + + S10e, Android 11, portrait, notch top, gesture nav bar bottom, keyboard off + padding EdgeInsets(0.0, 39.0, 0.0, 15.0) + viewPadding EdgeInsets(0.0, 39.0, 0.0, 15.0) + viewInsets EdgeInsets.zero + + S10e, Android 11, portrait, notch top, gesture nav bar bottom, keyboard on + padding EdgeInsets(0.0, 39.0, 0.0, 0.0) + viewPadding EdgeInsets(0.0, 39.0, 0.0, 15.0) + viewInsets EdgeInsets(0.0, 0.0, 0.0, 338.0) + */ + + double get effectiveBottomPadding => max(viewPadding.bottom, viewInsets.bottom); +} diff --git a/lib/widgets/common/extensions/theme.dart b/lib/widgets/common/extensions/theme.dart new file mode 100644 index 0000000..0ad34a6 --- /dev/null +++ b/lib/widgets/common/extensions/theme.dart @@ -0,0 +1,5 @@ +import 'package:flutter/material.dart'; + +extension ExtraThemeData on ThemeData { + bool get isDark => brightness == Brightness.dark; +} diff --git a/lib/widgets/common/fx/blurred.dart b/lib/widgets/common/fx/blurred.dart new file mode 100644 index 0000000..f1e4139 --- /dev/null +++ b/lib/widgets/common/fx/blurred.dart @@ -0,0 +1,94 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +final _filter = ImageFilter.blur(sigmaX: 4, sigmaY: 4); +// do not use `ColorFilter.matrix` for identity, +// as it yields performance issues when there are other layers on top +final _identity = ImageFilter.matrix(Matrix4.identity().storage); + +class BlurredRect extends StatelessWidget { + final bool enabled; + final Widget child; + + const BlurredRect({ + super.key, + this.enabled = true, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return ClipRect( + // TODO TLAD [flutter vNext] use `BackdropFilter.grouped` + child: BackdropFilter( + // do not modify tree when disabling filter + filter: enabled ? _filter : _identity, + child: child, + ), + ); + } +} + +class BlurredRRect extends StatelessWidget { + final bool enabled; + final BorderRadius? borderRadius; + final Widget child; + + const BlurredRRect({ + super.key, + this.enabled = true, + required this.borderRadius, + required this.child, + }); + + factory BlurredRRect.all({ + Key? key, + bool enabled = true, + required double borderRadius, + required Widget child, + }) { + return BlurredRRect( + key: key, + enabled: enabled, + borderRadius: BorderRadius.all(Radius.circular(borderRadius)), + child: child, + ); + } + + @override + Widget build(BuildContext context) { + return ClipRRect( + borderRadius: borderRadius ?? BorderRadius.zero, + // TODO TLAD [flutter vNext] use `BackdropFilter.grouped` + child: BackdropFilter( + // do not modify tree when disabling filter + filter: enabled ? _filter : _identity, + child: child, + ), + ); + } +} + +class BlurredOval extends StatelessWidget { + final bool enabled; + final Widget child; + + const BlurredOval({ + super.key, + this.enabled = true, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return ClipOval( + // TODO TLAD [flutter vNext] use `BackdropFilter.grouped` + child: BackdropFilter( + // do not modify tree when disabling filter + filter: enabled ? _filter : _identity, + child: child, + ), + ); + } +} diff --git a/lib/widgets/common/fx/borders.dart b/lib/widgets/common/fx/borders.dart new file mode 100644 index 0000000..a8cf9df --- /dev/null +++ b/lib/widgets/common/fx/borders.dart @@ -0,0 +1,24 @@ +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:flutter/material.dart'; + +class AvesBorder { + static Color _borderColor(BuildContext context) => Theme.of(context).isDark ? Colors.white30 : Colors.black26; + + // 1 device pixel for straight lines is fine + static double straightBorderWidth(BuildContext context) => 1 / MediaQuery.devicePixelRatioOf(context); + + // 1 device pixel for curves is too thin + static double curvedBorderWidth(BuildContext context) => MediaQuery.devicePixelRatioOf(context) > 2 ? 0.5 : 1.0; + + static BorderSide straightSide(BuildContext context, {double? width}) => BorderSide( + color: _borderColor(context), + width: width ?? straightBorderWidth(context), + ); + + static BorderSide curvedSide(BuildContext context, {double? width}) => BorderSide( + color: _borderColor(context), + width: width ?? curvedBorderWidth(context), + ); + + static Border border(BuildContext context, {double? width}) => Border.fromBorderSide(curvedSide(context, width: width)); +} diff --git a/lib/widgets/common/fx/checkered_decoration.dart b/lib/widgets/common/fx/checkered_decoration.dart new file mode 100644 index 0000000..eb93902 --- /dev/null +++ b/lib/widgets/common/fx/checkered_decoration.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +class CheckeredPainter extends CustomPainter { + final Paint lightPaint, darkPaint; + final double checkSize; + final Offset offset; + + CheckeredPainter({ + Color light = const Color(0xFF999999), + Color dark = const Color(0xFF666666), + this.checkSize = 20, + this.offset = Offset.zero, + }) : lightPaint = Paint()..color = light, + darkPaint = Paint()..color = dark; + + @override + void paint(Canvas canvas, Size size) { + final background = Offset.zero & size; + canvas.drawRect(background, lightPaint); + + final dx = offset.dx % (checkSize * 2); + final dy = offset.dy % (checkSize * 2); + + final xMax = (size.width / checkSize).ceil(); + final yMax = (size.height / checkSize).ceil(); + for (var x = -2; x < xMax; x++) { + for (var y = -2; y < yMax; y++) { + if ((x + y) % 2 == 0) { + final check = Rect.fromLTWH(dx + x * checkSize, dy + y * checkSize, checkSize, checkSize); + if (check.overlaps(background)) { + canvas.drawRect(check.intersect(background), darkPaint); + } + } + } + } + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} diff --git a/lib/widgets/common/fx/colors.dart b/lib/widgets/common/fx/colors.dart new file mode 100644 index 0000000..0b7646f --- /dev/null +++ b/lib/widgets/common/fx/colors.dart @@ -0,0 +1,26 @@ +import 'package:flutter/painting.dart'; + +class MatrixColorFilters { + static const ColorFilter greyscale = ColorFilter.matrix(<double>[ + 0.2126, + 0.7152, + 0.0722, + 0, + 0, + 0.2126, + 0.7152, + 0.0722, + 0, + 0, + 0.2126, + 0.7152, + 0.0722, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + ]); +} diff --git a/lib/widgets/common/fx/dashed_path_painter.dart b/lib/widgets/common/fx/dashed_path_painter.dart new file mode 100644 index 0000000..903cf15 --- /dev/null +++ b/lib/widgets/common/fx/dashed_path_painter.dart @@ -0,0 +1,143 @@ +import 'dart:math' as math; +import 'dart:ui' as ui; + +import 'package:flutter/material.dart'; + +// from https://stackoverflow.com/a/71099304/786656 +class DashedPathPainter extends CustomPainter { + final Path originalPath; + final Color pathColor; + final double strokeWidth; + final double dashGapLength; + final double dashLength; + late DashedPathProperties _dashedPathProperties; + + DashedPathPainter({ + required this.originalPath, + required this.pathColor, + this.strokeWidth = 3.0, + this.dashGapLength = 5.0, + this.dashLength = 10.0, + }); + + @override + void paint(Canvas canvas, Size size) { + _dashedPathProperties = DashedPathProperties( + path: Path(), + dashLength: dashLength, + dashGapLength: dashGapLength, + ); + final dashedPath = _getDashedPath(originalPath, dashLength, dashGapLength); + canvas.drawPath( + dashedPath, + Paint() + ..style = PaintingStyle.stroke + ..color = pathColor + ..strokeWidth = strokeWidth, + ); + } + + @override + bool shouldRepaint(DashedPathPainter oldDelegate) => + oldDelegate.originalPath != originalPath || oldDelegate.pathColor != pathColor || oldDelegate.strokeWidth != strokeWidth || oldDelegate.dashGapLength != dashGapLength || oldDelegate.dashLength != dashLength; + + Path _getDashedPath( + Path originalPath, + double dashLength, + double dashGapLength, + ) { + final metricsIterator = originalPath.computeMetrics().iterator; + while (metricsIterator.moveNext()) { + final metric = metricsIterator.current; + _dashedPathProperties.extractedPathLength = 0.0; + while (_dashedPathProperties.extractedPathLength < metric.length) { + if (_dashedPathProperties.addDashNext) { + _dashedPathProperties.addDash(metric, dashLength); + } else { + _dashedPathProperties.addDashGap(metric, dashGapLength); + } + } + } + return _dashedPathProperties.path; + } +} + +class DashedPathProperties { + double extractedPathLength; + Path path; + + final double _dashLength; + double _remainingDashLength; + double _remainingDashGapLength; + bool _previousWasDash; + + DashedPathProperties({ + required this.path, + required double dashLength, + required double dashGapLength, + }) : assert(dashLength > 0.0, 'dashLength must be > 0.0'), + assert(dashGapLength > 0.0, 'dashGapLength must be > 0.0'), + _dashLength = dashLength, + _remainingDashLength = dashLength, + _remainingDashGapLength = dashGapLength, + _previousWasDash = false, + extractedPathLength = 0.0; + + bool get addDashNext { + if (!_previousWasDash || _remainingDashLength != _dashLength) { + return true; + } + return false; + } + + void addDash(ui.PathMetric metric, double dashLength) { + // Calculate lengths (actual + available) + final end = _calculateLength(metric, _remainingDashLength); + final availableEnd = _calculateLength(metric, dashLength); + // Add path + final pathSegment = metric.extractPath(extractedPathLength, end); + path.addPath(pathSegment, Offset.zero); + // Update + final delta = _remainingDashLength - (end - extractedPathLength); + _remainingDashLength = _updateRemainingLength( + delta: delta, + end: end, + availableEnd: availableEnd, + initialLength: dashLength, + ); + extractedPathLength = end; + _previousWasDash = true; + } + + void addDashGap(ui.PathMetric metric, double dashGapLength) { + // Calculate lengths (actual + available) + final end = _calculateLength(metric, _remainingDashGapLength); + final availableEnd = _calculateLength(metric, dashGapLength); + // Move path's end point + ui.Tangent tangent = metric.getTangentForOffset(end)!; + path.moveTo(tangent.position.dx, tangent.position.dy); + // Update + final delta = end - extractedPathLength; + _remainingDashGapLength = _updateRemainingLength( + delta: delta, + end: end, + availableEnd: availableEnd, + initialLength: dashGapLength, + ); + extractedPathLength = end; + _previousWasDash = false; + } + + double _calculateLength(ui.PathMetric metric, double addedLength) { + return math.min(extractedPathLength + addedLength, metric.length); + } + + double _updateRemainingLength({ + required double delta, + required double end, + required double availableEnd, + required double initialLength, + }) { + return (delta > 0 && availableEnd == end) ? delta : initialLength; + } +} diff --git a/lib/widgets/common/fx/highlight_decoration.dart b/lib/widgets/common/fx/highlight_decoration.dart new file mode 100644 index 0000000..f3a323a --- /dev/null +++ b/lib/widgets/common/fx/highlight_decoration.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +class HighlightDecoration extends Decoration { + final Color color; + + const HighlightDecoration({required this.color}); + + @override + BoxPainter createBoxPainter([VoidCallback? onChanged]) { + return _HighlightDecorationPainter(this, onChanged); + } +} + +class _HighlightDecorationPainter extends BoxPainter { + final HighlightDecoration decoration; + + const _HighlightDecorationPainter(this.decoration, VoidCallback? onChanged) : super(onChanged); + + @override + void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) { + final size = configuration.size; + if (size == null) return; + + final confHeight = size.height; + final paintHeight = confHeight * .32; + final rect = Rect.fromLTWH(offset.dx, offset.dy + size.height * .58, size.width, paintHeight); + final rrect = RRect.fromRectAndRadius(rect, Radius.circular(paintHeight)); + final paint = Paint()..color = decoration.color; + canvas.drawRRect(rrect, paint); + } +} diff --git a/lib/widgets/common/fx/sweeper.dart b/lib/widgets/common/fx/sweeper.dart new file mode 100644 index 0000000..8e9812e --- /dev/null +++ b/lib/widgets/common/fx/sweeper.dart @@ -0,0 +1,158 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/theme/durations.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; + +class Sweeper extends StatefulWidget { + final WidgetBuilder builder; + final double startAngle; + final double sweepAngle; + final Curve curve; + final ValueNotifier<bool> toggledNotifier; + final bool centerSweep; + final VoidCallback? onSweepEnd; + + const Sweeper({ + super.key, + required this.builder, + this.startAngle = -pi / 2, + this.sweepAngle = pi / 4, + this.curve = Curves.easeInOutCubic, + required this.toggledNotifier, + this.centerSweep = true, + this.onSweepEnd, + }); + + @override + State<Sweeper> createState() => _SweeperState(); +} + +class _SweeperState extends State<Sweeper> with SingleTickerProviderStateMixin { + late AnimationController _angleAnimationController; + late CurvedAnimation _angleAnimation; + late Animation<double> _angle; + bool _isAppearing = false; + + bool get isToggled => widget.toggledNotifier.value; + + @override + void initState() { + super.initState(); + _angleAnimationController = AnimationController( + duration: ADurations.sweepingAnimation, + vsync: this, + ); + final startAngle = widget.startAngle; + final sweepAngle = widget.sweepAngle; + final centerSweep = widget.centerSweep; + _angleAnimation = CurvedAnimation( + parent: _angleAnimationController, + curve: widget.curve, + ); + _angle = Tween( + begin: startAngle - sweepAngle * (centerSweep ? .5 : 0), + end: startAngle + pi * 2 - sweepAngle * (centerSweep ? .5 : 1), + ).animate(_angleAnimation); + _angleAnimationController.addStatusListener(_onAnimationStatusChanged); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant Sweeper oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _angleAnimation.dispose(); + _angleAnimationController.dispose(); + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(Sweeper widget) { + widget.toggledNotifier.addListener(_onToggle); + } + + void _unregisterWidget(Sweeper widget) { + widget.toggledNotifier.removeListener(_onToggle); + } + + @override + Widget build(BuildContext context) { + return IgnorePointer( + child: AnimatedOpacity( + opacity: isToggled && (_isAppearing || _angleAnimationController.status == AnimationStatus.forward) ? 1 : 0, + duration: ADurations.sweeperOpacityAnimation, + child: ValueListenableBuilder<double>( + valueListenable: _angleAnimationController, + builder: (context, value, child) { + return ClipPath( + clipper: _SweepClipPath( + startAngle: _angle.value, + sweepAngle: widget.sweepAngle, + ), + child: widget.builder(context), + ); + }, + ), + ), + ); + } + + void _onAnimationStatusChanged(AnimationStatus status) { + setState(() {}); + if (status.isCompleted) { + widget.onSweepEnd?.call(); + } + } + + Future<void> _onToggle() async { + if (isToggled) { + _isAppearing = true; + setState(() {}); + await Future.delayed(ADurations.sweeperOpacityAnimation * timeDilation); + _isAppearing = false; + if (!mounted) return; + _angleAnimationController.reset(); + unawaited(_angleAnimationController.forward()); + } + if (!mounted) return; + setState(() {}); + } +} + +class _SweepClipPath extends CustomClipper<Path> { + final double startAngle; + final double sweepAngle; + + const _SweepClipPath({required this.startAngle, required this.sweepAngle}); + + @override + Path getClip(Size size) { + final width = size.width; + final height = size.height; + final centerX = width / 2; + final centerY = height / 2; + final diagonal = sqrt(width * width + height * height); + return Path() + ..moveTo(centerX, centerY) + ..addArc( + Rect.fromCenter( + center: Offset(centerX, centerY), + width: diagonal, + height: diagonal, + ), + startAngle, + sweepAngle, + ) + ..lineTo(centerX, centerY); + } + + @override + bool shouldReclip(covariant CustomClipper<Path> oldClipper) => true; +} diff --git a/lib/widgets/common/fx/transition_image.dart b/lib/widgets/common/fx/transition_image.dart new file mode 100644 index 0000000..044b708 --- /dev/null +++ b/lib/widgets/common/fx/transition_image.dart @@ -0,0 +1,246 @@ +import 'dart:ui' as ui; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; + +// adapted from Flutter `_ImageState` in `/widgets/image.dart` +// and `DecorationImagePainter` in `/painting/decoration_image.dart` +// to transition between 2 different fits during hero animation: +// - BoxFit.cover at t=0 +// - BoxFit.contain at t=1 + +class TransitionImage extends StatefulWidget { + final ImageProvider image; + final ValueListenable<double> animation; + final BoxFit thumbnailFit, viewerFit; + final Color? background; + + const TransitionImage({ + super.key, + required this.image, + required this.animation, + required this.thumbnailFit, + required this.viewerFit, + this.background, + }); + + @override + State<TransitionImage> createState() => _TransitionImageState(); +} + +class _TransitionImageState extends State<TransitionImage> with WidgetsBindingObserver { + ImageStream? _imageStream; + ImageInfo? _imageInfo; + bool _isListeningToStream = false; + bool _wasSynchronouslyLoaded = false; + late DisposableBuildContext<State<TransitionImage>> _scrollAwareContext; + ImageStreamCompleterHandle? _completerHandle; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addObserver(this); + _scrollAwareContext = DisposableBuildContext<State<TransitionImage>>(this); + } + + @override + void dispose() { + assert(_imageStream != null); + WidgetsBinding.instance.removeObserver(this); + _stopListeningToStream(); + _completerHandle?.dispose(); + _scrollAwareContext.dispose(); + _replaceImage(info: null); + super.dispose(); + } + + @override + void didChangeDependencies() { + _resolveImage(); + + if (TickerMode.of(context)) { + _listenToStream(); + } else { + _stopListeningToStream(keepStreamAlive: true); + } + + super.didChangeDependencies(); + } + + @override + void didUpdateWidget(TransitionImage oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.image != oldWidget.image) { + _resolveImage(); + } + } + + @override + void reassemble() { + _resolveImage(); // in case the image cache was flushed + super.reassemble(); + } + + void _resolveImage() { + final ScrollAwareImageProvider provider = ScrollAwareImageProvider<Object>( + context: _scrollAwareContext, + imageProvider: widget.image, + ); + final ImageStream newStream = provider.resolve(createLocalImageConfiguration(context)); + _updateSourceStream(newStream); + } + + ImageStreamListener? _imageStreamListener; + + ImageStreamListener _getListener({bool recreateListener = false}) { + if (_imageStreamListener == null || recreateListener) { + _imageStreamListener = ImageStreamListener(_handleImageFrame); + } + return _imageStreamListener!; + } + + void _handleImageFrame(ImageInfo imageInfo, bool synchronousCall) { + setState(() { + _replaceImage(info: imageInfo); + _wasSynchronouslyLoaded = _wasSynchronouslyLoaded | synchronousCall; + }); + } + + void _replaceImage({required ImageInfo? info}) { + final ImageInfo? oldImageInfo = _imageInfo; + SchedulerBinding.instance.addPostFrameCallback((_) => oldImageInfo?.dispose()); + _imageInfo = info; + } + + // Updates _imageStream to newStream, and moves the stream listener + // registration from the old stream to the new stream (if a listener was + // registered). + void _updateSourceStream(ImageStream newStream) { + if (_imageStream?.key == newStream.key) { + return; + } + + if (_isListeningToStream) { + _imageStream!.removeListener(_getListener()); + } + + setState(() { + _replaceImage(info: null); + _wasSynchronouslyLoaded = false; + }); + + _imageStream = newStream; + if (_isListeningToStream) { + _imageStream!.addListener(_getListener()); + } + } + + void _listenToStream() { + if (_isListeningToStream) { + return; + } + + _imageStream!.addListener(_getListener()); + _completerHandle?.dispose(); + _completerHandle = null; + + _isListeningToStream = true; + } + + /// Stops listening to the image stream, if this state object has attached a + /// listener. + /// + /// If the listener from this state is the last listener on the stream, the + /// stream will be disposed. To keep the stream alive, set `keepStreamAlive` + /// to true, which create [ImageStreamCompleterHandle] to keep the completer + /// alive and is compatible with the [TickerMode] being off. + void _stopListeningToStream({bool keepStreamAlive = false}) { + if (!_isListeningToStream) { + return; + } + + if (keepStreamAlive && _completerHandle == null && _imageStream?.completer != null) { + _completerHandle = _imageStream!.completer!.keepAlive(); + } + + _imageStream!.removeListener(_getListener()); + _isListeningToStream = false; + } + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder<double>( + valueListenable: widget.animation, + builder: (context, t, child) => CustomPaint( + painter: _TransitionImagePainter( + image: _imageInfo?.image, + scale: _imageInfo?.scale ?? 1.0, + t: t, + thumbnailFit: widget.thumbnailFit, + viewerFit: widget.viewerFit, + background: widget.background, + ), + ), + ); + } +} + +class _TransitionImagePainter extends CustomPainter { + final ui.Image? image; + final double scale, t; + final Color? background; + final BoxFit thumbnailFit, viewerFit; + + static final _paint = Paint() + ..isAntiAlias = false + ..filterQuality = FilterQuality.low; + static const _alignment = Alignment.center; + + const _TransitionImagePainter({ + required this.image, + required this.scale, + required this.t, + required this.thumbnailFit, + required this.viewerFit, + required this.background, + }); + + @override + void paint(Canvas canvas, Size size) { + final _image = image; + if (_image == null) return; + + if (size.isEmpty) { + return; + } + + final outputSize = size; + final inputSize = Size(_image.width.toDouble(), _image.height.toDouble()); + + final thumbnailSizes = applyBoxFit(thumbnailFit, inputSize / scale, size); + final viewerSizes = applyBoxFit(viewerFit, inputSize / scale, size); + final sourceSize = Size.lerp(thumbnailSizes.source, viewerSizes.source, t)! * scale; + final destinationSize = Size.lerp(thumbnailSizes.destination, viewerSizes.destination, t)!; + + final halfWidthDelta = (outputSize.width - destinationSize.width) / 2.0; + final halfHeightDelta = (outputSize.height - destinationSize.height) / 2.0; + final dx = halfWidthDelta + _alignment.x * halfWidthDelta; + final dy = halfHeightDelta + _alignment.y * halfHeightDelta; + final destinationPosition = Offset(dx, dy); + + final destinationRect = destinationPosition & destinationSize; + final sourceRect = _alignment.inscribe( + sourceSize, + Offset.zero & inputSize, + ); + if (background != null) { + // deflate to avoid background artifact around opaque image + canvas.drawRect(destinationRect.deflate(1), Paint()..color = background!); + } + canvas.drawImageRect(_image, sourceRect, destinationRect, _paint); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => true; +} diff --git a/lib/widgets/common/fx/transitions.dart b/lib/widgets/common/fx/transitions.dart new file mode 100644 index 0000000..b4b7f16 --- /dev/null +++ b/lib/widgets/common/fx/transitions.dart @@ -0,0 +1,14 @@ +import 'package:flutter/widgets.dart'; + +class AvesTransitions { + static Widget formTransitionBuilder(Widget child, Animation<double> animation) { + return FadeTransition( + opacity: animation, + child: SizeTransition( + sizeFactor: animation, + axisAlignment: -1, + child: child, + ), + ); + } +} diff --git a/lib/widgets/common/grid/draggable_thumb_label.dart b/lib/widgets/common/grid/draggable_thumb_label.dart new file mode 100644 index 0000000..b744323 --- /dev/null +++ b/lib/widgets/common/grid/draggable_thumb_label.dart @@ -0,0 +1,88 @@ +import 'package:aves/theme/format.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; + +class DraggableCrumbLabel extends StatelessWidget { + final String label; + + const DraggableCrumbLabel({ + super.key, + required this.label, + }); + + @override + Widget build(BuildContext context) { + return ConstrainedBox( + constraints: const BoxConstraints(maxWidth: _crumbLabelMaxWidth), + child: Padding( + padding: _padding, + child: _buildText(label, isCrumb: true), + ), + ); + } +} + +class DraggableThumbLabel<T> extends StatelessWidget { + final double offsetY; + final List<String> Function(BuildContext context, T item) lineBuilder; + + const DraggableThumbLabel({ + super.key, + required this.offsetY, + required this.lineBuilder, + }); + + @override + Widget build(BuildContext context) { + final sll = context.read<SectionedListLayout<T>>(); + final sectionLayout = sll.getSectionAt(offsetY); + if (sectionLayout == null) return const SizedBox(); + + final item = sll.getItemAt(Offset(0, offsetY)) ?? sll.sections[sectionLayout.sectionKey]!.first; + + final lines = lineBuilder(context, item); + if (lines.isEmpty) return const SizedBox(); + + return ConstrainedBox( + constraints: const BoxConstraints(maxWidth: _thumbLabelMaxWidth), + child: Padding( + padding: _padding, + child: lines.length > 1 + ? Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.end, + children: lines.map((v) => _buildText(v, isCrumb: false)).toList(), + ) + : _buildText(lines.first, isCrumb: false), + ), + ); + } + + static String formatMonthThumbLabel(BuildContext context, DateTime? date) { + if (date == null) return context.l10n.sectionUnknown; + return DateFormat.yMMM(context.locale).format(date); + } + + static String formatDayThumbLabel(BuildContext context, DateTime? date) { + if (date == null) return context.l10n.sectionUnknown; + return formatDay(date, context.locale); + } +} + +const double _crumbLabelMaxWidth = 96; +const double _thumbLabelMaxWidth = 144; +const EdgeInsets _padding = EdgeInsets.symmetric(vertical: 4, horizontal: 8); + +Widget _buildText(String text, {required bool isCrumb}) => Text( + text, + style: TextStyle( + color: Colors.black, + fontSize: isCrumb ? 10 : 14, + ), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, +); diff --git a/lib/widgets/common/grid/header.dart b/lib/widgets/common/grid/header.dart new file mode 100644 index 0000000..107d34a --- /dev/null +++ b/lib/widgets/common/grid/header.dart @@ -0,0 +1,289 @@ +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/widgets/common/basic/gestures/gesture_detector.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:provider/provider.dart'; + +class SectionHeader<T> extends StatelessWidget { + final SectionKey sectionKey; + final Widget? leading, trailing; + final String title; + final bool selectable; + + const SectionHeader({ + super.key, + required this.sectionKey, + this.leading, + required this.title, + this.trailing, + this.selectable = true, + }); + + static const leadingSize = Size.square(32); + static const widgetSpanAlignmentMargin = EdgeInsetsDirectional.only(bottom: 4); + static final leadingMargin = const EdgeInsetsDirectional.only(end: 8) + widgetSpanAlignmentMargin; + static final trailingMargin = const EdgeInsetsDirectional.only(start: 8) + widgetSpanAlignmentMargin; + static const margin = EdgeInsets.symmetric(vertical: 0, horizontal: 8); + static const padding = EdgeInsets.symmetric(vertical: 16, horizontal: 8); + static const widgetSpanAlignment = PlaceholderAlignment.middle; + + @override + Widget build(BuildContext context) { + final onTap = selectable ? () => _toggleSectionSelection(context) : null; + + final theme = Theme.of(context); + + Widget child = Container( + padding: padding, + constraints: BoxConstraints(minHeight: leadingSize.height), + child: AGestureDetector( + onTap: onTap, + onLongPress: selectable + ? Feedback.wrapForLongPress(() { + final selection = context.read<Selection<T>>(); + if (selection.isSelecting) { + _toggleSectionSelection(context); + } else { + selection.select(); + selection.addToSelection(_getSectionEntries(context)); + } + }, context) + : null, + longPressTimeout: settings.longPressTimeout, + child: Text.rich( + TextSpan( + children: [ + WidgetSpan( + alignment: widgetSpanAlignment, + child: Theme( + data: theme.copyWith( + iconTheme: theme.iconTheme.copyWith( + color: theme.colorScheme.onSurface, + ), + ), + child: _SectionSelectableLeading<T>( + selectable: selectable, + sectionKey: sectionKey, + browsingBuilder: leading != null + ? (context) => Container( + width: leadingSize.width, + height: leadingSize.height, + margin: leadingMargin, + child: leading, + ) + : null, + onPressed: onTap, + ), + ), + ), + TextSpan( + text: title, + style: _headerTextStyle(context), + ), + if (trailing != null) + WidgetSpan( + alignment: widgetSpanAlignment, + child: Container( + margin: trailingMargin, + child: trailing, + ), + ), + ], + ), + ), + ), + ); + if (settings.useTvLayout) { + // prevent ink response when tapping the header does nothing, + // because otherwise Play Store reviewers think it is broken navigation + child = context.select<Selection<T>, bool>((v) => v.isSelecting) + ? InkWell( + onTap: onTap, + borderRadius: const BorderRadius.all(Radius.circular(123)), + child: child, + ) + : Focus(child: child); + } + return Container( + alignment: AlignmentDirectional.centerStart, + margin: margin, + child: child, + ); + } + + List<T> _getSectionEntries(BuildContext context) => context.read<SectionedListLayout<T>>().sections[sectionKey] ?? []; + + void _toggleSectionSelection(BuildContext context) { + final sectionEntries = _getSectionEntries(context); + final selection = context.read<Selection<T>>(); + final isSelected = selection.isSelected(sectionEntries); + if (isSelected) { + selection.removeFromSelection(sectionEntries); + } else { + selection.addToSelection(sectionEntries); + } + } + + // TODO TLAD [perf] cache header extent computation? + static double getPreferredHeight({ + required BuildContext context, + required double maxWidth, + required String title, + bool hasLeading = false, + bool hasTrailing = false, + }) { + final textScaler = MediaQuery.textScalerOf(context); + final leadingFontSize = leadingSize.height; + final textScaleFactor = textScaler.scale(leadingFontSize) / leadingFontSize; + final maxContentWidth = maxWidth - (SectionHeader.padding.horizontal + SectionHeader.margin.horizontal); + final paragraph = RenderParagraph( + TextSpan( + children: [ + // as of Flutter v3.7.7, `RenderParagraph` fails to lay out `WidgetSpan` offscreen + // so we use a hair space times a magic number to match width + TextSpan( + // 23 hair spaces match a width of 40.0 + text: '\u200A' * (hasLeading ? 23 : 1), + // force a higher first line to match leading icon/selector dimension + style: TextStyle(height: 2.3 * textScaleFactor), + ), + if (hasTrailing) TextSpan(text: '\u200A' * 17), + TextSpan( + text: title, + style: _headerTextStyle(context), + ), + ], + ), + textDirection: TextDirection.ltr, + textScaler: textScaler, + )..layout(BoxConstraints(maxWidth: maxContentWidth), parentUsesSize: true); + final height = paragraph.getMaxIntrinsicHeight(maxContentWidth); + paragraph.dispose(); + return height; + } + + static TextStyle _headerTextStyle(BuildContext context) { + // specify `height` for accurate paragraph height measurement + final defaultTextHeight = DefaultTextStyle.of(context).style.height; + return AStyles.unknownTitleText.copyWith(height: defaultTextHeight); + } +} + +class _SectionSelectableLeading<T> extends StatelessWidget { + final bool selectable; + final SectionKey sectionKey; + final WidgetBuilder? browsingBuilder; + final VoidCallback? onPressed; + + const _SectionSelectableLeading({ + super.key, + this.selectable = true, + required this.sectionKey, + required this.browsingBuilder, + required this.onPressed, + }); + + @override + Widget build(BuildContext context) { + if (!selectable) return _buildBrowsing(context); + + final duration = context.select<DurationsData, Duration>((v) => v.formTransition); + final isSelecting = context.select<Selection<T>, bool>((selection) => selection.isSelecting); + final Widget child = isSelecting + ? _SectionSelectingLeading<T>( + sectionKey: sectionKey, + onPressed: onPressed, + ) + : _buildBrowsing(context); + + return FocusTraversalGroup( + descendantsAreFocusable: false, + descendantsAreTraversable: false, + child: AnimatedSwitcher( + duration: duration, + switchInCurve: Curves.easeInOut, + switchOutCurve: Curves.easeInOut, + transitionBuilder: (child, animation) { + Widget transition = ScaleTransition( + scale: animation, + child: child, + ); + if (browsingBuilder == null) { + // when switching with a header that has no icon, + // we also transition the size for a smooth push to the text + transition = SizeTransition( + axis: Axis.horizontal, + sizeFactor: animation, + child: transition, + ); + } + return transition; + }, + child: child, + ), + ); + } + + Widget _buildBrowsing(BuildContext context) => browsingBuilder?.call(context) ?? SizedBox(height: SectionHeader.leadingSize.height + SectionHeader.widgetSpanAlignmentMargin.vertical); +} + +class _SectionSelectingLeading<T> extends StatelessWidget { + final SectionKey sectionKey; + final VoidCallback? onPressed; + + const _SectionSelectingLeading({ + super.key, + required this.sectionKey, + required this.onPressed, + }); + + @override + Widget build(BuildContext context) { + final duration = context.select<DurationsData, Duration>((v) => v.formTransition); + final sectionEntries = context.watch<SectionedListLayout<T>>().sections[sectionKey] ?? []; + final selection = context.watch<Selection<T>>(); + final isSelected = selection.isSelected(sectionEntries); + return AnimatedSwitcher( + duration: duration, + switchInCurve: Curves.easeOutBack, + switchOutCurve: Curves.easeOutBack, + transitionBuilder: (child, animation) => ScaleTransition( + scale: animation, + child: child, + ), + child: TooltipTheme( + key: ValueKey(isSelected), + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: Container( + width: SectionHeader.leadingSize.width, + height: SectionHeader.leadingSize.height, + margin: SectionHeader.leadingMargin, + child: Theme( + data: Theme.of(context).copyWith( + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + child: IconButton( + iconSize: 26, + onPressed: onPressed, + tooltip: isSelected ? context.l10n.collectionDeselectSectionTooltip : context.l10n.collectionSelectSectionTooltip, + style: ButtonStyle( + padding: WidgetStateProperty.all<EdgeInsetsGeometry>(EdgeInsets.zero), + minimumSize: WidgetStateProperty.all<Size>(SectionHeader.leadingSize), + ), + icon: Icon(isSelected ? AIcons.selected : AIcons.unselected), + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/common/grid/item_tracker.dart b/lib/widgets/common/grid/item_tracker.dart new file mode 100644 index 0000000..ea8aadf --- /dev/null +++ b/lib/widgets/common/grid/item_tracker.dart @@ -0,0 +1,170 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/model/highlight.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class GridItemTracker<T> extends StatefulWidget { + final GlobalKey scrollableKey; + final ValueNotifier<double> appBarHeightNotifier; + final TileLayout tileLayout; + final ScrollController scrollController; + final Widget child; + + const GridItemTracker({ + super.key, + required this.scrollableKey, + required this.appBarHeightNotifier, + required this.tileLayout, + required this.scrollController, + required this.child, + }); + + @override + State<GridItemTracker<T>> createState() => _GridItemTrackerState<T>(); +} + +class _GridItemTrackerState<T> extends State<GridItemTracker<T>> with WidgetsBindingObserver { + ValueNotifier<double> get appBarHeightNotifier => widget.appBarHeightNotifier; + + ScrollController get scrollController => widget.scrollController; + + @override + Widget build(BuildContext context) { + return widget.child; + } + + Size get scrollableSize { + final scrollableContext = widget.scrollableKey.currentContext!; + return (scrollableContext.findRenderObject() as RenderBox).size; + } + + final Set<StreamSubscription> _subscriptions = {}; + + // grid section metrics before the app is laid out with the new orientation + late SectionedListLayout<T> _lastSectionedListLayout; + late Size _lastScrollableSize; + Orientation _lastOrientation = Orientation.portrait; + + @override + void initState() { + super.initState(); + final highlightInfo = context.read<HighlightInfo>(); + _subscriptions.add(highlightInfo.eventBus.on<TrackEvent<T>>().listen(_trackItem)); + WidgetsBinding.instance.addObserver(this); + _saveLayoutMetrics(); + } + + @override + void didUpdateWidget(covariant GridItemTracker<T> oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.tileLayout != widget.tileLayout) { + _onLayoutChanged(); + } + _saveLayoutMetrics(); + } + + @override + void didChangeMetrics() { + // the order of `WidgetsBindingObserver` metrics change notification is unreliable + // w.r.t. the `View` update, and consequentially to this widget update: + // `WidgetsBindingObserver` is notified mostly before, sometimes after, the widget update + final size = View.of(context).physicalSize; + final orientation = size.width > size.height ? Orientation.landscape : Orientation.portrait; + if (_lastOrientation != orientation) { + _lastOrientation = orientation; + _onLayoutChanged(); + _saveLayoutMetrics(); + } + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + super.dispose(); + } + + // about scrolling & offset retrieval: + // `Scrollable.ensureVisible` only works on already rendered objects + // `RenderViewport.showOnScreen` can find any `RenderSliver`, but not always a `RenderMetadata` + // `RenderViewport.scrollOffsetOf` is a good alternative + Future<void> _trackItem(TrackEvent event) async { + final sectionedListLayout = context.read<SectionedListLayout<T>>(); + final tileRect = sectionedListLayout.getTileRect(event.item); + if (tileRect == null) return; + + final viewportRect = Offset(0, scrollController.offset) & scrollableSize; + final itemVisibility = max(0, tileRect.intersect(viewportRect).height) / tileRect.height; + if (!event.predicate(itemVisibility)) return; + + double scrollOffset = tileRect.top + (tileRect.height - scrollableSize.height) * ((event.alignment.y + 1) / 2); + // most of the time the app bar will be scrolled away after scaling, + // so we compensate for it to center the focal point thumbnail + scrollOffset += appBarHeightNotifier.value; + scrollOffset = scrollOffset.clamp(0, scrollController.position.maxScrollExtent); + + if (scrollOffset > 0) { + if (event.animate) { + await scrollController.animateTo( + scrollOffset, + duration: Duration(milliseconds: (scrollOffset / 2).round().clamp(ADurations.highlightScrollAnimationMinMillis, ADurations.highlightScrollAnimationMaxMillis)), + curve: Curves.easeInOutCubic, + ); + } else { + scrollController.jumpTo(scrollOffset); + await Future.delayed(ADurations.highlightJumpDelay); + } + } + + final highlightItem = event.highlightItem; + if (highlightItem != null) { + context.read<HighlightInfo>().set(highlightItem); + } + } + + Future<void> _saveLayoutMetrics() async { + // use a delay to obtain current layout metrics + // so that we can handle window orientation change with the previous metrics, + // regardless of the `View`/`WidgetsBindingObserver` order uncertainty + await Future.delayed(const Duration(milliseconds: 500)); + if (!mounted) return; + _lastSectionedListLayout = context.read<SectionedListLayout<T>>(); + _lastScrollableSize = scrollableSize; + } + + void _onLayoutChanged() { + if (scrollController.positions.length != 1) return; + + // do not track when view shows top edge + if (scrollController.offset == 0) return; + + final layout = _lastSectionedListLayout; + final halfSize = _lastScrollableSize / 2; + final center = Offset( + halfSize.width, + halfSize.height + scrollController.offset - appBarHeightNotifier.value, + ); + var pivotItem = layout.getItemAt(center) ?? layout.getItemAt(Offset(0, center.dy)); + if (pivotItem == null) { + final pivotSectionKey = layout.getSectionAt(center.dy)?.sectionKey; + if (pivotSectionKey != null) { + pivotItem = layout.sections[pivotSectionKey]?.firstOrNull; + } + } + + if (pivotItem != null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; + context.read<HighlightInfo>().trackItem(pivotItem, animate: false); + }); + } + } +} diff --git a/lib/widgets/common/grid/overlay.dart b/lib/widgets/common/grid/overlay.dart new file mode 100644 index 0000000..8d0149d --- /dev/null +++ b/lib/widgets/common/grid/overlay.dart @@ -0,0 +1,58 @@ +import 'package:aves/model/selection.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/identity/aves_icons.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class GridItemSelectionOverlay<T> extends StatelessWidget { + final T item; + final BorderRadius? borderRadius; + final EdgeInsets? padding; + + const GridItemSelectionOverlay({ + super.key, + required this.item, + this.borderRadius, + this.padding, + }); + + @override + Widget build(BuildContext context) { + final duration = context.select<DurationsData, Duration>((v) => v.formTransition); + final isSelecting = context.select<Selection<T>, bool>((selection) => selection.isSelecting); + return AnimatedSwitcher( + duration: duration, + child: isSelecting + ? Selector<Selection<T>, bool>( + selector: (context, selection) => selection.isSelected({item}), + builder: (context, isSelected, child) { + return AnimatedContainer( + alignment: AlignmentDirectional.topEnd, + padding: padding, + decoration: BoxDecoration( + color: isSelected ? Theme.of(context).colorScheme.primary.withValues(alpha: .6) : Colors.transparent, + borderRadius: borderRadius, + ), + duration: duration, + child: AnimatedSwitcher( + duration: duration, + switchInCurve: Curves.easeOutBack, + switchOutCurve: Curves.easeOutBack, + transitionBuilder: (child, animation) => ScaleTransition( + scale: animation, + child: child, + ), + child: OverlayIcon( + key: ValueKey(isSelected), + icon: isSelected ? AIcons.selected : AIcons.unselected, + margin: EdgeInsets.zero, + ), + ), + ); + }, + ) + : const SizedBox(), + ); + } +} diff --git a/lib/widgets/common/grid/scaling.dart b/lib/widgets/common/grid/scaling.dart new file mode 100644 index 0000000..fe29b4b --- /dev/null +++ b/lib/widgets/common/grid/scaling.dart @@ -0,0 +1,248 @@ +import 'package:aves/model/highlight.dart'; +import 'package:aves/widgets/common/behaviour/eager_scale_gesture_recognizer.dart'; +import 'package:aves/widgets/common/grid/sections/fixed/scale_overlay.dart'; +import 'package:aves/widgets/common/grid/sections/mosaic/scale_overlay.dart'; +import 'package:aves/widgets/common/grid/sections/section_layout_builder.dart'; +import 'package:aves/widgets/common/grid/theme.dart'; +import 'package:aves/widgets/common/providers/tile_extent_controller_provider.dart'; +import 'package:aves/widgets/common/tile_extent_controller.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:provider/provider.dart'; + +// metadata to identify entry from RenderObject hit test during collection scaling +class ScalerMetadata<T> { + final T item; + + const ScalerMetadata(this.item); +} + +class GridScaleGestureDetector<T> extends StatefulWidget { + final GlobalKey scrollableKey; + final TileLayout tileLayout; + final double Function(double width) heightForWidth; + final Widget Function(Offset center, Size tileSize, Widget child) gridBuilder; + final TileBuilder<T> scaledItemBuilder; + final MosaicItemBuilder mosaicItemBuilder; + final Object Function(T item)? highlightItem; + final Widget child; + + const GridScaleGestureDetector({ + super.key, + required this.scrollableKey, + required this.tileLayout, + required this.heightForWidth, + required this.gridBuilder, + required this.scaledItemBuilder, + required this.mosaicItemBuilder, + this.highlightItem, + required this.child, + }); + + @override + State<GridScaleGestureDetector<T>> createState() => _GridScaleGestureDetectorState<T>(); +} + +class _GridScaleGestureDetectorState<T> extends State<GridScaleGestureDetector<T>> { + Size? _startSize; + double? _extentMin, _extentMax; + bool _applyingScale = false; + ValueNotifier<Size>? _scaledSizeNotifier; + OverlayEntry? _overlayEntry; + ScalerMetadata<T>? _metadata; + + TileLayout get tileLayout => widget.tileLayout; + + @override + void dispose() { + _scaledSizeNotifier?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final gestureSettings = MediaQuery.gestureSettingsOf(context); + + final child = GestureDetector( + // Horizontal/vertical drag gestures are interpreted as scaling + // if they are not handled by `onHorizontalDragStart`/`onVerticalDragStart` + // at the scaling `GestureDetector` level, or handled beforehand down the widget tree. + // Setting `onHorizontalDragStart`, `onVerticalDragStart`, and `onScaleStart` + // all at once is not allowed, so we use another `GestureDetector` for that. + onVerticalDragStart: (details) {}, + onHorizontalDragStart: (details) {}, + child: widget.child, + ); + + // as of Flutter v2.5.3, `ScaleGestureRecognizer` does not work well + // when combined with the `VerticalDragGestureRecognizer` inside a `GridView`, + // so it is modified to eagerly accept the gesture + // when multiple pointers are involved, and take priority over drag gestures. + return RawGestureDetector( + gestures: <Type, GestureRecognizerFactory>{ + EagerScaleGestureRecognizer: GestureRecognizerFactoryWithHandlers<EagerScaleGestureRecognizer>( + () => EagerScaleGestureRecognizer(debugOwner: this), + (instance) { + instance + ..onStart = _onScaleStart + ..onUpdate = _onScaleUpdate + ..onEnd = _onScaleEnd + ..dragStartBehavior = DragStartBehavior.start + ..gestureSettings = gestureSettings; + }, + ), + }, + child: child, + ); + } + + void _onScaleStart(ScaleStartDetails details) { + // the gesture detector wrongly detects a new scaling gesture + // when scaling ends and we apply the new extent, so we prevent this + // until we scaled and scrolled to the tile in the new grid + if (_applyingScale) return; + + final tileExtentController = context.read<TileExtentController>(); + + final scrollableContext = widget.scrollableKey.currentContext!; + final scrollableBox = scrollableContext.findRenderObject() as RenderBox; + final renderMetaData = _getClosestRenderMetadata( + box: scrollableBox, + localFocalPoint: details.localFocalPoint, + spacing: tileExtentController.spacing, + ); + // abort if we cannot find an image to show on overlay + if (renderMetaData == null) return; + final metadata = renderMetaData.metaData; + if (metadata is! ScalerMetadata<T>) return; + _metadata = metadata; + + switch (tileLayout) { + case TileLayout.mosaic: + _startSize = Size.square(tileExtentController.extentNotifier.value); + case TileLayout.grid: + case TileLayout.list: + _startSize = renderMetaData.size; + } + _scaledSizeNotifier = ValueNotifier(_startSize!); + + // not the same as `MediaQuery` metrics, because of screen insets/padding + final scrollViewRect = scrollableBox.localToGlobal(Offset.zero) & scrollableBox.size; + final contentRect = scrollViewRect.deflate(tileExtentController.horizontalPadding); + + _extentMin = tileExtentController.effectiveExtentMin; + _extentMax = tileExtentController.effectiveExtentMax; + + final halfSize = _startSize! / 2; + switch (tileLayout) { + case TileLayout.mosaic: + _overlayEntry = OverlayEntry( + builder: (context) => MosaicScaleOverlay( + contentRect: contentRect, + spacing: tileExtentController.spacing, + extentMax: _extentMax!, + scaledSizeNotifier: _scaledSizeNotifier!, + itemBuilder: widget.mosaicItemBuilder, + ), + ); + case TileLayout.grid: + case TileLayout.list: + final tileCenter = renderMetaData.localToGlobal(Offset(halfSize.width, halfSize.height)); + _overlayEntry = OverlayEntry( + builder: (context) => TileExtentControllerProvider( + controller: tileExtentController, + child: FixedExtentScaleOverlay( + tileLayout: tileLayout, + tileCenter: tileCenter, + contentRect: contentRect, + scaledSizeNotifier: _scaledSizeNotifier!, + gridBuilder: widget.gridBuilder, + builder: (scaledTileSize) => SizedBox.fromSize( + size: scaledTileSize, + child: GridTheme( + extent: tileLayout == TileLayout.grid ? scaledTileSize.width : scaledTileSize.height, + child: widget.scaledItemBuilder(_metadata!.item, scaledTileSize), + ), + ), + ), + ), + ); + } + Overlay.of(scrollableContext).insert(_overlayEntry!); + } + + void _onScaleUpdate(ScaleUpdateDetails details) { + if (_scaledSizeNotifier == null) return; + + final s = details.scale; + switch (tileLayout) { + case TileLayout.mosaic: + case TileLayout.grid: + final scaledWidth = (_startSize!.width * s).clamp(_extentMin!, _extentMax!); + _scaledSizeNotifier!.value = Size(scaledWidth, widget.heightForWidth(scaledWidth)); + case TileLayout.list: + final scaledHeight = (_startSize!.height * s).clamp(_extentMin!, _extentMax!); + _scaledSizeNotifier!.value = Size(_startSize!.width, scaledHeight); + } + } + + void _onScaleEnd(ScaleEndDetails details) { + if (_scaledSizeNotifier == null) return; + + final scaledSize = _scaledSizeNotifier!.value; + _scaledSizeNotifier!.dispose(); + _scaledSizeNotifier = null; + + _overlayEntry + ?..remove() + ..dispose(); + _overlayEntry = null; + + _applyingScale = true; + final tileExtentController = context.read<TileExtentController>(); + final oldExtent = tileExtentController.extentNotifier.value; + // sanitize and update grid layout if necessary + late final double preferredExtent; + switch (tileLayout) { + case TileLayout.mosaic: + case TileLayout.grid: + preferredExtent = scaledSize.width; + case TileLayout.list: + preferredExtent = scaledSize.height; + } + final newExtent = tileExtentController.setUserPreferredExtent(preferredExtent); + if (newExtent == oldExtent) { + _applyingScale = false; + } else { + // scroll to show the focal point thumbnail at its new position + WidgetsBinding.instance.addPostFrameCallback((_) { + final trackItem = _metadata!.item; + final highlightItem = widget.highlightItem?.call(trackItem) ?? trackItem; + context.read<HighlightInfo>().trackItem(trackItem, animate: false, highlightItem: highlightItem); + _applyingScale = false; + }); + } + } + + RenderMetaData? _getClosestRenderMetadata({ + required RenderBox box, + required Offset localFocalPoint, + required double spacing, + }) { + var position = localFocalPoint; + while (position.dx > 0 && position.dy > 0) { + final result = BoxHitTestResult(); + box.hitTest(result, position: position); + + // find `RenderObject`s at the gesture focal point + U? firstOf<U>(BoxHitTestResult result) => result.path.firstWhereOrNull((el) => el.target is U)?.target as U?; + final renderMetaData = firstOf<RenderMetaData>(result); + if (renderMetaData != null) return renderMetaData; + position = position.translate(-spacing, -spacing); + } + return null; + } +} diff --git a/lib/widgets/common/grid/sections/fixed/list_layout.dart b/lib/widgets/common/grid/sections/fixed/list_layout.dart new file mode 100644 index 0000000..162fcc8 --- /dev/null +++ b/lib/widgets/common/grid/sections/fixed/list_layout.dart @@ -0,0 +1,62 @@ +import 'dart:math'; + +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +class FixedExtentSectionedListLayout<T> extends SectionedListLayout<T> { + final int columnCount; + final double tileWidth, tileHeight; + + const FixedExtentSectionedListLayout({ + required super.sections, + required super.showHeaders, + required this.columnCount, + required this.tileWidth, + required this.tileHeight, + required super.spacing, + required super.horizontalPadding, + required super.sectionLayouts, + }); + + @override + Rect? getTileRect(T item) { + final MapEntry<SectionKey?, List<T>>? section = sections.entries.firstWhereOrNull((kv) => kv.value.contains(item)); + if (section == null) return null; + + final sectionKey = section.key; + final sectionLayout = sectionLayouts.firstWhereOrNull((sl) => sl.sectionKey == sectionKey); + if (sectionLayout == null) return null; + + final sectionItemIndex = section.value.indexOf(item); + final column = sectionItemIndex % columnCount; + final row = (sectionItemIndex / columnCount).floor(); + final listIndex = sectionLayout.firstIndex + 1 + row; + + final left = horizontalPadding + tileWidth * column + spacing * (column - 1); + final top = sectionLayout.indexToLayoutOffset(listIndex); + return Rect.fromLTWH(left, top, tileWidth, tileHeight); + } + + @override + T? getItemAt(Offset position) { + var dy = position.dy; + final sectionLayout = getSectionAt(dy); + if (sectionLayout == null) return null; + + final section = sections[sectionLayout.sectionKey]; + if (section == null) return null; + + dy -= sectionLayout.minOffset + sectionLayout.headerExtent; + if (dy < 0) return null; + + final row = dy ~/ (tileHeight + spacing); + final column = max(0, position.dx - horizontalPadding) ~/ (tileWidth + spacing); + final index = row * columnCount + column; + if (index >= section.length) return null; + + return section[index]; + } +} diff --git a/lib/widgets/common/grid/sections/fixed/row.dart b/lib/widgets/common/grid/sections/fixed/row.dart new file mode 100644 index 0000000..0813bfa --- /dev/null +++ b/lib/widgets/common/grid/sections/fixed/row.dart @@ -0,0 +1,162 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +class FixedExtentGridRow extends MultiChildRenderObjectWidget { + final double width, height, spacing; + final TextDirection textDirection; + + const FixedExtentGridRow({ + super.key, + required this.width, + required this.height, + required this.spacing, + required this.textDirection, + required super.children, + }); + + @override + RenderObject createRenderObject(BuildContext context) { + return RenderFixedExtentGridRow( + width: width, + height: height, + spacing: spacing, + textDirection: textDirection, + ); + } + + @override + void updateRenderObject(BuildContext context, RenderFixedExtentGridRow renderObject) { + renderObject.width = width; + renderObject.height = height; + renderObject.spacing = spacing; + renderObject.textDirection = textDirection; + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DoubleProperty('width', width)); + properties.add(DoubleProperty('height', height)); + properties.add(DoubleProperty('spacing', spacing)); + properties.add(EnumProperty<TextDirection>('textDirection', textDirection)); + } +} + +class _GridRowParentData extends ContainerBoxParentData<RenderBox> {} + +class RenderFixedExtentGridRow extends RenderBox with ContainerRenderObjectMixin<RenderBox, _GridRowParentData>, RenderBoxContainerDefaultsMixin<RenderBox, _GridRowParentData> { + RenderFixedExtentGridRow({ + List<RenderBox>? children, + required double width, + required double height, + required double spacing, + required TextDirection textDirection, + }) : _width = width, + _height = height, + _spacing = spacing, + _textDirection = textDirection { + addAll(children); + } + + double get width => _width; + double _width; + + set width(double value) { + if (_width == value) return; + _width = value; + markNeedsLayout(); + } + + double get height => _height; + double _height; + + set height(double value) { + if (_height == value) return; + _height = value; + markNeedsLayout(); + } + + double get spacing => _spacing; + double _spacing; + + set spacing(double value) { + if (_spacing == value) return; + _spacing = value; + markNeedsLayout(); + } + + TextDirection get textDirection => _textDirection; + TextDirection _textDirection; + + set textDirection(TextDirection value) { + if (_textDirection == value) return; + _textDirection = value; + markNeedsLayout(); + } + + @override + void setupParentData(RenderBox child) { + if (child.parentData is! _GridRowParentData) { + child.parentData = _GridRowParentData(); + } + } + + double get intrinsicWidth => width * childCount + spacing * (childCount - 1); + + @override + double computeMinIntrinsicWidth(double height) => intrinsicWidth; + + @override + double computeMaxIntrinsicWidth(double height) => intrinsicWidth; + + @override + double computeMinIntrinsicHeight(double width) => height; + + @override + double computeMaxIntrinsicHeight(double width) => height; + + @override + void performLayout() { + var child = firstChild; + if (child == null) { + size = constraints.smallest; + return; + } + size = Size(constraints.maxWidth, height); + final childConstraints = BoxConstraints.tight(Size(width, height)); + final flipMainAxis = textDirection == TextDirection.rtl; + var offset = Offset(flipMainAxis ? size.width - width : 0, 0); + final dx = (flipMainAxis ? -1 : 1) * (width + spacing); + while (child != null) { + child.layout(childConstraints, parentUsesSize: false); + final childParentData = child.parentData! as _GridRowParentData; + childParentData.offset = offset; + offset += Offset(dx, 0); + child = childParentData.nextSibling; + } + } + + @override + double? computeDistanceToActualBaseline(TextBaseline baseline) { + return defaultComputeDistanceToHighestActualBaseline(baseline); + } + + @override + bool hitTestChildren(BoxHitTestResult result, {required Offset position}) { + return defaultHitTestChildren(result, position: position); + } + + @override + void paint(PaintingContext context, Offset offset) { + defaultPaint(context, offset); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DoubleProperty('width', width)); + properties.add(DoubleProperty('height', height)); + properties.add(DoubleProperty('spacing', spacing)); + properties.add(EnumProperty<TextDirection>('textDirection', textDirection)); + } +} diff --git a/lib/widgets/common/grid/sections/fixed/scale_grid.dart b/lib/widgets/common/grid/sections/fixed/scale_grid.dart new file mode 100644 index 0000000..c31b6ea --- /dev/null +++ b/lib/widgets/common/grid/sections/fixed/scale_grid.dart @@ -0,0 +1,111 @@ +import 'dart:ui' as ui; + +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +class FixedExtentGridPainter extends CustomPainter { + final TileLayout tileLayout; + final Offset tileCenter; + final Size tileSize; + final double spacing, horizontalPadding, borderWidth; + final Radius borderRadius; + final Color color; + final TextDirection textDirection; + + const FixedExtentGridPainter({ + required this.tileLayout, + required this.tileCenter, + required this.tileSize, + required this.spacing, + required this.horizontalPadding, + required this.borderWidth, + required this.borderRadius, + required this.color, + required this.textDirection, + }); + + @override + void paint(Canvas canvas, Size size) { + late final Offset chipCenter; + late final Size chipSize; + late final int deltaColumn; + late final Shader strokeShader; + switch (tileLayout) { + case TileLayout.mosaic: + return; + case TileLayout.grid: + chipCenter = tileCenter; + chipSize = tileSize; + deltaColumn = 2; + strokeShader = ui.Gradient.radial( + tileCenter, + chipSize.shortestSide * 2, + [ + color, + Colors.transparent, + ], + [ + .8, + 1, + ], + ); + case TileLayout.list: + chipSize = Size.square(tileSize.shortestSide); + final chipCenterToEdge = chipSize.width / 2; + chipCenter = Offset(textDirection == TextDirection.rtl ? size.width - (chipCenterToEdge + horizontalPadding) : chipCenterToEdge + horizontalPadding, tileCenter.dy); + deltaColumn = 0; + strokeShader = ui.Gradient.linear( + tileCenter - Offset(0, chipSize.shortestSide * 3), + tileCenter + Offset(0, chipSize.shortestSide * 3), + [ + Colors.transparent, + color, + color, + Colors.transparent, + ], + [ + 0, + .2, + .8, + 1, + ], + ); + } + final strokePaint = Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = borderWidth + ..shader = strokeShader; + final fillPaint = Paint() + ..style = PaintingStyle.fill + ..color = color.withValues(alpha: .25); + + final chipWidth = chipSize.width; + final chipHeight = chipSize.height; + + final deltaX = tileSize.width + spacing; + final deltaY = tileSize.height + spacing; + for (var i = -deltaColumn; i <= deltaColumn; i++) { + final dx = deltaX * i; + for (var j = -2; j <= 2; j++) { + if (i == 0 && j == 0) continue; + final dy = deltaY * j; + final rect = RRect.fromRectAndRadius( + Rect.fromCenter( + center: chipCenter + Offset(dx, dy), + width: chipWidth - borderWidth, + height: chipHeight - borderWidth, + ), + borderRadius, + ); + + if ((i.abs() == 1 && j == 0) || (j.abs() == 1 && i == 0)) { + canvas.drawRRect(rect, fillPaint); + } + canvas.drawRRect(rect, strokePaint); + } + } + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => true; +} diff --git a/lib/widgets/common/grid/sections/fixed/scale_overlay.dart b/lib/widgets/common/grid/sections/fixed/scale_overlay.dart new file mode 100644 index 0000000..9a5ed52 --- /dev/null +++ b/lib/widgets/common/grid/sections/fixed/scale_overlay.dart @@ -0,0 +1,136 @@ +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:flutter/material.dart'; + +class FixedExtentScaleOverlay extends StatelessWidget { + final TileLayout tileLayout; + final Offset tileCenter; + final double xMin, xMax; + final ValueNotifier<Size> scaledSizeNotifier; + final Widget Function(Offset center, Size tileSize, Widget child) gridBuilder; + final Widget Function(Size scaledTileSize) builder; + + FixedExtentScaleOverlay({ + super.key, + required this.tileLayout, + required this.tileCenter, + required Rect contentRect, + required this.scaledSizeNotifier, + required this.gridBuilder, + required this.builder, + }) : xMin = contentRect.left, + xMax = contentRect.right; + + @override + Widget build(BuildContext context) { + return MediaQueryDataProvider( + child: IgnorePointer( + child: _OverlayBackground( + gradientCenter: tileLayout == TileLayout.grid ? tileCenter : Offset(context.isRtl ? xMax : xMin, tileCenter.dy), + child: ValueListenableBuilder<Size>( + valueListenable: scaledSizeNotifier, + builder: (context, scaledSize, child) { + final width = scaledSize.width; + final height = scaledSize.height; + // keep scaled thumbnail within the screen + var dx = .0; + if (tileCenter.dx - width / 2 < xMin) { + dx = xMin - (tileCenter.dx - width / 2); + } else if (tileCenter.dx + width / 2 > xMax) { + dx = xMax - (tileCenter.dx + width / 2); + } + final clampedCenter = tileCenter.translate(dx, 0); + + var child = builder(scaledSize); + child = Stack( + children: [ + Positioned( + left: clampedCenter.dx - width / 2, + top: clampedCenter.dy - height / 2, + child: DefaultTextStyle( + style: const TextStyle(), + child: child, + ), + ), + ], + ); + child = gridBuilder(clampedCenter, scaledSize, child); + return child; + }, + ), + ), + ), + ); + } +} + +class _OverlayBackground extends StatefulWidget { + final Offset gradientCenter; + final Widget child; + + const _OverlayBackground({ + required this.gradientCenter, + required this.child, + }); + + @override + State<_OverlayBackground> createState() => _OverlayBackgroundState(); +} + +class _OverlayBackgroundState extends State<_OverlayBackground> { + bool _initialized = false; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) => setState(() => _initialized = true)); + } + + @override + Widget build(BuildContext context) { + return AnimatedContainer( + decoration: _buildBackgroundDecoration(context), + duration: ADurations.scalingGridBackgroundAnimation, + child: widget.child, + ); + } + + BoxDecoration _buildBackgroundDecoration(BuildContext context) { + final isDark = Theme.of(context).isDark; + final gradientCenter = widget.gradientCenter; + return _initialized + ? BoxDecoration( + gradient: RadialGradient( + center: FractionalOffset.fromOffsetAndSize(gradientCenter, MediaQuery.sizeOf(context)), + radius: 1, + colors: isDark + ? const [ + Colors.black, + Colors.black54, + ] + : const [ + Colors.white, + Colors.white38, + ], + ), + ) + : BoxDecoration( + // provide dummy gradient to lerp to the other one during animation + gradient: RadialGradient( + colors: isDark + ? const [ + ColorUtils.transparentBlack, + ColorUtils.transparentBlack, + ] + : const [ + ColorUtils.transparentWhite, + ColorUtils.transparentWhite, + ], + ), + ); + } +} diff --git a/lib/widgets/common/grid/sections/fixed/section_layout.dart b/lib/widgets/common/grid/sections/fixed/section_layout.dart new file mode 100644 index 0000000..7cdfbc9 --- /dev/null +++ b/lib/widgets/common/grid/sections/fixed/section_layout.dart @@ -0,0 +1,41 @@ +import 'package:aves/widgets/common/grid/sections/section_layout.dart'; + +class FixedExtentSectionLayout extends SectionLayout { + final double tileHeight, mainAxisStride; + + @override + List<Object?> get props => [sectionKey, firstIndex, lastIndex, minOffset, maxOffset, headerExtent, tileHeight, spacing]; + + const FixedExtentSectionLayout({ + required super.sectionKey, + required super.firstIndex, + required super.lastIndex, + required super.minOffset, + required super.maxOffset, + required super.headerExtent, + required this.tileHeight, + required super.spacing, + required super.builder, + }) : mainAxisStride = tileHeight + spacing; + + @override + double indexToLayoutOffset(int index) { + index -= bodyFirstIndex; + if (index < 0) return minOffset; + return bodyMinOffset + index * mainAxisStride; + } + + @override + int getMinChildIndexForScrollOffset(double scrollOffset) { + scrollOffset -= bodyMinOffset; + if (mainAxisStride == 0 || !scrollOffset.isFinite || scrollOffset < 0) return firstIndex; + return bodyFirstIndex + scrollOffset ~/ mainAxisStride; + } + + @override + int getMaxChildIndexForScrollOffset(double scrollOffset) { + scrollOffset -= bodyMinOffset; + if (mainAxisStride == 0 || !scrollOffset.isFinite || scrollOffset < 0) return firstIndex; + return bodyFirstIndex + (scrollOffset / mainAxisStride).ceil() - 1; + } +} diff --git a/lib/widgets/common/grid/sections/fixed/section_layout_builder.dart b/lib/widgets/common/grid/sections/fixed/section_layout_builder.dart new file mode 100644 index 0000000..3336a5c --- /dev/null +++ b/lib/widgets/common/grid/sections/fixed/section_layout_builder.dart @@ -0,0 +1,111 @@ +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/widgets/common/grid/sections/fixed/list_layout.dart'; +import 'package:aves/widgets/common/grid/sections/fixed/row.dart'; +import 'package:aves/widgets/common/grid/sections/fixed/section_layout.dart'; +import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:aves/widgets/common/grid/sections/section_layout.dart'; +import 'package:aves/widgets/common/grid/sections/section_layout_builder.dart'; +import 'package:flutter/material.dart'; + +class FixedExtentSectionLayoutBuilder<T> extends SectionLayoutBuilder<T> { + int _currentIndex = 0; + double _currentOffset = 0; + final List<Size> _itemSizes; + + FixedExtentSectionLayoutBuilder({ + required super.sections, + required super.showHeaders, + required super.getHeaderExtent, + required super.buildHeader, + required super.scrollableWidth, + required super.tileLayout, + required super.columnCount, + required super.spacing, + required super.horizontalPadding, + required super.tileWidth, + required super.tileHeight, + required super.tileBuilder, + required super.tileAnimationDelay, + }) : _itemSizes = List.generate(columnCount, (index) => Size(tileWidth, tileHeight)); + + @override + SectionedListLayout<T> updateLayouts(BuildContext context) { + final sectionLayouts = sections.keys + .map( + (sectionKey) => buildSectionLayout( + headerExtent: showHeaders ? getHeaderExtent(context, sectionKey) : 0.0, + sectionKey: sectionKey, + section: sections[sectionKey]!, + animate: animate, + ), + ) + .toList(); + + return FixedExtentSectionedListLayout<T>( + sections: sections, + showHeaders: showHeaders, + columnCount: columnCount, + tileWidth: tileWidth, + tileHeight: tileHeight, + spacing: spacing, + horizontalPadding: horizontalPadding, + sectionLayouts: sectionLayouts, + ); + } + + @override + SectionLayout buildSectionLayout({ + required double headerExtent, + required SectionKey sectionKey, + required List<T> section, + required bool animate, + }) { + final sectionItemCount = section.length; + final rowCount = (sectionItemCount / columnCount).ceil(); + final sectionChildCount = 1 + rowCount; + + final sectionFirstIndex = _currentIndex; + _currentIndex += sectionChildCount; + final sectionLastIndex = _currentIndex - 1; + + final sectionMinOffset = _currentOffset; + _currentOffset += headerExtent + tileHeight * rowCount + spacing * (rowCount - 1); + final sectionMaxOffset = _currentOffset; + + return FixedExtentSectionLayout( + sectionKey: sectionKey, + firstIndex: sectionFirstIndex, + lastIndex: sectionLastIndex, + minOffset: sectionMinOffset, + maxOffset: sectionMaxOffset, + headerExtent: headerExtent, + tileHeight: tileHeight, + spacing: spacing, + builder: (context, listIndex) { + final textDirection = Directionality.of(context); + final sectionChildIndex = listIndex - sectionFirstIndex; + return buildSectionWidget( + context: context, + section: section, + sectionGridIndex: listIndex * columnCount, + sectionChildIndex: sectionChildIndex, + itemIndexRange: () => ( + (sectionChildIndex - 1) * columnCount, + sectionChildIndex * columnCount, + ), + sectionKey: sectionKey, + headerExtent: headerExtent, + itemSizes: _itemSizes, + animate: animate, + buildGridRow: (children) => FixedExtentGridRow( + width: tileWidth, + height: tileHeight, + spacing: spacing, + textDirection: textDirection, + children: children, + ), + ); + }, + ); + } +} diff --git a/lib/widgets/common/grid/sections/list_layout.dart b/lib/widgets/common/grid/sections/list_layout.dart new file mode 100644 index 0000000..06e9f05 --- /dev/null +++ b/lib/widgets/common/grid/sections/list_layout.dart @@ -0,0 +1,28 @@ +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/widgets/common/grid/sections/section_layout.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +abstract class SectionedListLayout<T> { + final Map<SectionKey, List<T>> sections; + final bool showHeaders; + final double spacing, horizontalPadding; + final List<SectionLayout> sectionLayouts; + + const SectionedListLayout({ + required this.sections, + required this.showHeaders, + required this.spacing, + required this.horizontalPadding, + required this.sectionLayouts, + }); + + // returns tile rectangle in layout space, i.e. x=0 is start + Rect? getTileRect(T item); + + SectionLayout? getSectionAt(double offsetY) => sectionLayouts.firstWhereOrNull((sl) => offsetY < sl.maxOffset); + + // `position` in layout space, i.e. x=0 is start + T? getItemAt(Offset position); +} diff --git a/lib/widgets/common/grid/sections/mosaic/list_layout.dart b/lib/widgets/common/grid/sections/mosaic/list_layout.dart new file mode 100644 index 0000000..4590bf9 --- /dev/null +++ b/lib/widgets/common/grid/sections/mosaic/list_layout.dart @@ -0,0 +1,78 @@ +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:aves/widgets/common/grid/sections/mosaic/section_layout.dart'; +import 'package:aves/widgets/common/grid/sections/section_layout.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +class MosaicSectionedListLayout<T> extends SectionedListLayout<T> { + const MosaicSectionedListLayout({ + required super.sections, + required super.showHeaders, + required super.spacing, + required super.horizontalPadding, + required super.sectionLayouts, + }); + + List<MosaicRowLayout> _rowsFor(SectionLayout sectionLayout) => (sectionLayout as MosaicSectionLayout).rows; + + @override + Rect? getTileRect(T item) { + final MapEntry<SectionKey?, List<T>>? section = sections.entries.firstWhereOrNull((kv) => kv.value.contains(item)); + if (section == null) return null; + + final sectionKey = section.key; + final sectionLayout = sectionLayouts.firstWhereOrNull((sl) => sl.sectionKey == sectionKey); + if (sectionLayout == null) return null; + + final sectionItemIndex = section.value.indexOf(item); + final row = _rowsFor(sectionLayout).firstWhereOrNull((row) => sectionItemIndex <= row.lastIndex); + if (row == null) return null; + + final rowItemIndex = sectionItemIndex - row.firstIndex; + final tileWidth = row.itemWidths[rowItemIndex]; + final tileHeight = row.height - spacing; + + var left = horizontalPadding; + row.itemWidths.forEachIndexedWhile((i, width) { + if (i == rowItemIndex) return true; + + left += width + spacing; + return false; + }); + final listIndex = sectionLayout.firstIndex + 1 + _rowsFor(sectionLayout).indexOf(row); + + final top = sectionLayout.indexToLayoutOffset(listIndex); + return Rect.fromLTWH(left, top, tileWidth, tileHeight); + } + + @override + T? getItemAt(Offset position) { + var dy = position.dy; + final sectionLayout = getSectionAt(dy); + if (sectionLayout == null) return null; + + final section = sections[sectionLayout.sectionKey]; + if (section == null) return null; + + dy -= sectionLayout.minOffset + sectionLayout.headerExtent; + if (dy < 0) return null; + + final row = _rowsFor(sectionLayout).firstWhereOrNull((v) => dy < v.maxOffset); + if (row == null) return null; + + var dx = position.dx - horizontalPadding; + var index = -1; + row.itemWidths.forEachIndexedWhile((i, width) { + dx -= width + spacing; + if (dx > 0) return true; + + index = row.firstIndex + i; + return false; + }); + + if (index < 0 || index >= section.length) return null; + return section[index]; + } +} diff --git a/lib/widgets/common/grid/sections/mosaic/row.dart b/lib/widgets/common/grid/sections/mosaic/row.dart new file mode 100644 index 0000000..5716cf3 --- /dev/null +++ b/lib/widgets/common/grid/sections/mosaic/row.dart @@ -0,0 +1,159 @@ +import 'package:aves/widgets/common/grid/sections/mosaic/section_layout.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +class MosaicGridRow extends MultiChildRenderObjectWidget { + final MosaicRowLayout rowLayout; + final double spacing; + final TextDirection textDirection; + + const MosaicGridRow({ + super.key, + required this.rowLayout, + required this.spacing, + required this.textDirection, + required super.children, + }); + + @override + RenderObject createRenderObject(BuildContext context) { + return RenderMosaicGridRow( + rowLayout: rowLayout, + spacing: spacing, + textDirection: textDirection, + ); + } + + @override + void updateRenderObject(BuildContext context, RenderMosaicGridRow renderObject) { + renderObject.rowLayout = rowLayout; + renderObject.spacing = spacing; + renderObject.textDirection = textDirection; + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DiagnosticsProperty<MosaicRowLayout>('rowLayout', rowLayout)); + properties.add(DoubleProperty('spacing', spacing)); + properties.add(EnumProperty<TextDirection>('textDirection', textDirection)); + } +} + +class _GridRowParentData extends ContainerBoxParentData<RenderBox> {} + +class RenderMosaicGridRow extends RenderBox with ContainerRenderObjectMixin<RenderBox, _GridRowParentData>, RenderBoxContainerDefaultsMixin<RenderBox, _GridRowParentData> { + RenderMosaicGridRow({ + List<RenderBox>? children, + required MosaicRowLayout rowLayout, + required double spacing, + required TextDirection textDirection, + }) : _rowLayout = rowLayout, + _spacing = spacing, + _textDirection = textDirection { + addAll(children); + } + + MosaicRowLayout get rowLayout => _rowLayout; + MosaicRowLayout _rowLayout; + + set rowLayout(MosaicRowLayout value) { + if (_rowLayout == value) return; + _rowLayout = value; + markNeedsLayout(); + } + + double get spacing => _spacing; + double _spacing; + + set spacing(double value) { + if (_spacing == value) return; + _spacing = value; + markNeedsLayout(); + } + + TextDirection get textDirection => _textDirection; + TextDirection _textDirection; + + set textDirection(TextDirection value) { + if (_textDirection == value) return; + _textDirection = value; + markNeedsLayout(); + } + + @override + void setupParentData(RenderBox child) { + if (child.parentData is! _GridRowParentData) { + child.parentData = _GridRowParentData(); + } + } + + double get intrinsicWidth => rowLayout.itemWidths.sum + spacing * (childCount - 1); + + @override + double computeMinIntrinsicWidth(double height) => intrinsicWidth; + + @override + double computeMaxIntrinsicWidth(double height) => intrinsicWidth; + + @override + double computeMinIntrinsicHeight(double width) => rowLayout.height; + + @override + double computeMaxIntrinsicHeight(double width) => rowLayout.height; + + @override + void performLayout() { + var child = firstChild; + if (child == null) { + size = constraints.smallest; + return; + } + final thumbnailHeight = rowLayout.height - spacing; + size = Size(constraints.maxWidth, rowLayout.height); + final flipMainAxis = textDirection == TextDirection.rtl; + var i = 0; + double offsetX = flipMainAxis ? size.width : 0; + while (child != null) { + final thumbnailWidth = rowLayout.itemWidths[i]; + final childConstraints = BoxConstraints.tight(Size(thumbnailWidth, thumbnailHeight)); + child.layout(childConstraints, parentUsesSize: false); + final childParentData = child.parentData! as _GridRowParentData; + if (flipMainAxis) { + offsetX -= thumbnailWidth; + } + childParentData.offset = Offset(offsetX, 0); + if (flipMainAxis) { + offsetX -= spacing; + } else { + offsetX += thumbnailWidth + spacing; + } + child = childParentData.nextSibling; + i++; + } + } + + @override + double? computeDistanceToActualBaseline(TextBaseline baseline) { + return defaultComputeDistanceToHighestActualBaseline(baseline); + } + + @override + bool hitTestChildren(BoxHitTestResult result, {required Offset position}) { + return defaultHitTestChildren(result, position: position); + } + + @override + void paint(PaintingContext context, Offset offset) { + defaultPaint(context, offset); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DiagnosticsProperty<MosaicRowLayout>('rowLayout', rowLayout)); + properties.add(DoubleProperty('spacing', spacing)); + properties.add(EnumProperty<TextDirection>('textDirection', textDirection)); + } +} diff --git a/lib/widgets/common/grid/sections/mosaic/scale_grid.dart b/lib/widgets/common/grid/sections/mosaic/scale_grid.dart new file mode 100644 index 0000000..820d5c7 --- /dev/null +++ b/lib/widgets/common/grid/sections/mosaic/scale_grid.dart @@ -0,0 +1,74 @@ +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/grid/sections/mosaic/scale_overlay.dart'; +import 'package:aves/widgets/common/grid/sections/mosaic/section_layout_builder.dart'; +import 'package:flutter/material.dart'; + +class MosaicGrid extends StatelessWidget { + final Rect contentRect; + final Size tileSize; + final double spacing; + final MosaicItemBuilder builder; + + static const _itemRatios = <double>[ + 3 / 4, + 16 / 9, + 9 / 16, + 3 / 4, + 4 / 3, + 4 / 3, + 3 / 4, + 4 / 3, + 4 / 3, + 4 / 3, + ]; + + const MosaicGrid({ + super.key, + required this.contentRect, + required this.tileSize, + required this.spacing, + required this.builder, + }); + + @override + Widget build(BuildContext context) { + final children = <Widget>[]; + + final targetExtent = tileSize.width; + final rows = MosaicSectionLayoutBuilder.computeMosaicRows( + section: List.generate(5, (i) => _itemRatios).expand((v) => v).toList(), + availableWidthFor: (itemCount) => contentRect.width - (itemCount - 1) * spacing, + heightMax: targetExtent * MosaicSectionLayoutBuilder.heightMaxFactor, + targetExtent: targetExtent, + spacing: spacing, + bottom: tileSize.height - tileSize.width, + coverRatioResolver: (item) => item, + ); + + var i = 0; + var dy = contentRect.top; + rows.forEach((row) { + var dx = contentRect.left; + final itemHeight = row.height - spacing; + row.itemWidths.forEach((itemWidth) { + children.add( + AnimatedPositioned( + left: dx, + top: dy, + width: itemWidth, + height: itemHeight, + duration: ADurations.scalingGridPositionAnimation, + child: builder(i, targetExtent), + ), + ); + dx += itemWidth + spacing; + i++; + }); + dy += row.height; + }); + + return Stack( + children: children, + ); + } +} diff --git a/lib/widgets/common/grid/sections/mosaic/scale_overlay.dart b/lib/widgets/common/grid/sections/mosaic/scale_overlay.dart new file mode 100644 index 0000000..009d5db --- /dev/null +++ b/lib/widgets/common/grid/sections/mosaic/scale_overlay.dart @@ -0,0 +1,117 @@ +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves/widgets/common/grid/sections/mosaic/scale_grid.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:flutter/material.dart'; + +typedef MosaicItemBuilder = Widget Function(int index, double targetExtent); + +class MosaicScaleOverlay extends StatelessWidget { + final Rect contentRect; + final double spacing, extentMax; + final ValueNotifier<Size> scaledSizeNotifier; + final MosaicItemBuilder itemBuilder; + + const MosaicScaleOverlay({ + super.key, + required this.contentRect, + required this.spacing, + required this.extentMax, + required this.scaledSizeNotifier, + required this.itemBuilder, + }); + + @override + Widget build(BuildContext context) { + return MediaQueryDataProvider( + child: IgnorePointer( + child: _OverlayBackground( + child: ValueListenableBuilder<Size>( + valueListenable: scaledSizeNotifier, + builder: (context, scaledSize, child) { + final theme = Theme.of(context); + final colorScheme = theme.colorScheme; + Widget _buildBar(double width, Color color) => ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(4)), + child: Container( + color: color, + width: width, + height: 4, + ), + ); + return SafeArea( + left: false, + right: false, + bottom: false, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 4), + child: Stack( + alignment: Alignment.center, + children: [ + _buildBar(extentMax, colorScheme.onSurface.withValues(alpha: .2)), + _buildBar(scaledSize.width, colorScheme.primary), + ], + ), + ), + Expanded( + child: MosaicGrid( + contentRect: contentRect, + tileSize: scaledSize, + spacing: spacing, + builder: itemBuilder, + ), + ), + ], + ), + ); + }, + ), + ), + ), + ); + } +} + +class _OverlayBackground extends StatefulWidget { + final Widget child; + + const _OverlayBackground({ + required this.child, + }); + + @override + State<_OverlayBackground> createState() => _OverlayBackgroundState(); +} + +class _OverlayBackgroundState extends State<_OverlayBackground> { + bool _initialized = false; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) => setState(() => _initialized = true)); + } + + @override + Widget build(BuildContext context) { + return AnimatedContainer( + decoration: _buildBackgroundDecoration(context), + duration: ADurations.scalingGridBackgroundAnimation, + child: widget.child, + ); + } + + BoxDecoration _buildBackgroundDecoration(BuildContext context) { + final isDark = Theme.of(context).isDark; + return _initialized + ? BoxDecoration( + color: isDark ? Colors.black87 : const Color(0xDDFFFFFF), + ) + : BoxDecoration( + color: isDark ? ColorUtils.transparentBlack : ColorUtils.transparentWhite, + ); + } +} diff --git a/lib/widgets/common/grid/sections/mosaic/section_layout.dart b/lib/widgets/common/grid/sections/mosaic/section_layout.dart new file mode 100644 index 0000000..0cba43a --- /dev/null +++ b/lib/widgets/common/grid/sections/mosaic/section_layout.dart @@ -0,0 +1,61 @@ +import 'package:aves/widgets/common/grid/sections/section_layout.dart'; +import 'package:collection/collection.dart'; +import 'package:equatable/equatable.dart'; + +class MosaicSectionLayout extends SectionLayout { + final List<MosaicRowLayout> rows; + + @override + List<Object?> get props => [sectionKey, firstIndex, lastIndex, minOffset, maxOffset, headerExtent, rows, spacing]; + + const MosaicSectionLayout({ + required super.sectionKey, + required super.firstIndex, + required super.lastIndex, + required super.minOffset, + required super.maxOffset, + required super.headerExtent, + required this.rows, + required super.spacing, + required super.builder, + }); + + @override + double indexToLayoutOffset(int index) { + index -= bodyFirstIndex; + if (index < 0) return minOffset; + return bodyMinOffset + (index < rows.length ? rows[index].minOffset : rows.lastOrNull?.maxOffset ?? 0); + } + + @override + int getMinChildIndexForScrollOffset(double scrollOffset) { + scrollOffset -= bodyMinOffset; + if (scrollOffset < 0) return firstIndex; + return bodyFirstIndex + rows.indexWhere((v) => scrollOffset < v.maxOffset); + } + + @override + int getMaxChildIndexForScrollOffset(double scrollOffset) { + scrollOffset -= bodyMinOffset; + if (scrollOffset < 0) return firstIndex; + final rowIndex = rows.indexWhere((v) => scrollOffset < v.maxOffset); + return bodyFirstIndex + (rowIndex == -1 ? rows.length - 1 : rowIndex); + } +} + +class MosaicRowLayout extends Equatable { + final int firstIndex, lastIndex; + final double minOffset, maxOffset, height; + final List<double> itemWidths; + + @override + List<Object?> get props => [firstIndex, lastIndex, minOffset, maxOffset, height, itemWidths]; + + const MosaicRowLayout({ + required this.firstIndex, + required this.lastIndex, + required this.minOffset, + required this.height, + required this.itemWidths, + }) : maxOffset = minOffset + height; +} diff --git a/lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart b/lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart new file mode 100644 index 0000000..c173c34 --- /dev/null +++ b/lib/widgets/common/grid/sections/mosaic/section_layout_builder.dart @@ -0,0 +1,202 @@ +import 'dart:math'; + +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:aves/widgets/common/grid/sections/mosaic/list_layout.dart'; +import 'package:aves/widgets/common/grid/sections/mosaic/row.dart'; +import 'package:aves/widgets/common/grid/sections/mosaic/section_layout.dart'; +import 'package:aves/widgets/common/grid/sections/provider.dart'; +import 'package:aves/widgets/common/grid/sections/section_layout.dart'; +import 'package:aves/widgets/common/grid/sections/section_layout_builder.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +class MosaicSectionLayoutBuilder<T> extends SectionLayoutBuilder<T> { + int _currentIndex = 0; + double _currentOffset = 0; + late double Function(int itemCount) rowAvailableWidth; + late double rowHeightMax; + final CoverRatioResolver<T> coverRatioResolver; + + static const double heightMaxFactor = 2.4; + static const double minThumbnailAspectRatio = 9 / 32; + static const double maxThumbnailAspectRatio = 32 / 9; + + MosaicSectionLayoutBuilder({ + required super.sections, + required super.showHeaders, + required super.getHeaderExtent, + required super.buildHeader, + required super.scrollableWidth, + required super.tileLayout, + required super.columnCount, + required super.spacing, + required super.horizontalPadding, + required super.tileWidth, + required super.tileHeight, + required super.tileBuilder, + required Duration tileAnimationDelay, + required this.coverRatioResolver, + }) : super(tileAnimationDelay: Duration(milliseconds: (tileAnimationDelay.inMilliseconds / columnCount).ceil())) { + final rowWidth = scrollableWidth - horizontalPadding * 2; + rowAvailableWidth = (itemCount) => rowWidth - (itemCount - 1) * spacing; + rowHeightMax = tileWidth * heightMaxFactor; + } + + @override + SectionedListLayout<T> updateLayouts(BuildContext context) { + final sectionLayouts = sections.keys + .map( + (sectionKey) => buildSectionLayout( + headerExtent: showHeaders ? getHeaderExtent(context, sectionKey) : 0.0, + sectionKey: sectionKey, + section: sections[sectionKey]!, + animate: animate, + ), + ) + .toList(); + + return MosaicSectionedListLayout<T>( + sections: sections, + showHeaders: showHeaders, + spacing: spacing, + horizontalPadding: horizontalPadding, + sectionLayouts: sectionLayouts, + ); + } + + @override + SectionLayout buildSectionLayout({ + required double headerExtent, + required SectionKey sectionKey, + required List<T> section, + required bool animate, + }) { + final rows = computeMosaicRows( + section: section, + availableWidthFor: rowAvailableWidth, + heightMax: rowHeightMax, + targetExtent: tileWidth, + spacing: spacing, + bottom: bottom, + coverRatioResolver: (item) => coverRatioResolver(item).clamp(minThumbnailAspectRatio, maxThumbnailAspectRatio), + ); + final rowCount = rows.length; + final sectionChildCount = 1 + rowCount; + + final sectionFirstIndex = _currentIndex; + _currentIndex += sectionChildCount; + final sectionLastIndex = _currentIndex - 1; + + final sectionMinOffset = _currentOffset; + _currentOffset += headerExtent + rows.map((v) => v.height).sum - spacing; + final sectionMaxOffset = _currentOffset; + + return MosaicSectionLayout( + sectionKey: sectionKey, + firstIndex: sectionFirstIndex, + lastIndex: sectionLastIndex, + minOffset: sectionMinOffset, + maxOffset: sectionMaxOffset, + headerExtent: headerExtent, + rows: rows, + spacing: spacing, + builder: (context, listIndex) { + final textDirection = Directionality.of(context); + final sectionChildIndex = listIndex - sectionFirstIndex; + final isHeader = sectionChildIndex == 0; + final row = isHeader ? rows.first : rows[sectionChildIndex - 1]; + final sectionGridIndex = isHeader ? sectionFirstIndex * columnCount : (sectionChildIndex + 1) * columnCount + row.firstIndex; + return buildSectionWidget( + context: context, + section: section, + sectionGridIndex: sectionGridIndex, + sectionChildIndex: sectionChildIndex, + itemIndexRange: () => isHeader ? const (0, 0) : (row.firstIndex, row.lastIndex + 1), + sectionKey: sectionKey, + headerExtent: headerExtent, + itemSizes: row.itemWidths.map((v) => Size(v, row.height)).toList(), + animate: animate, + buildGridRow: (children) { + return isHeader + ? const SizedBox() + : MosaicGridRow( + rowLayout: row, + spacing: spacing, + textDirection: textDirection, + children: children, + ); + }, + ); + }, + ); + } + + static List<MosaicRowLayout> computeMosaicRows<T>({ + required List<T> section, + required double Function(int itemCount) availableWidthFor, + required double heightMax, + required double targetExtent, + required double spacing, + required double bottom, + required CoverRatioResolver<T> coverRatioResolver, + }) { + final rows = <MosaicRowLayout>[]; + final items = <T>[]; + double ratioSum = 0, ratioMin = double.infinity; + int firstIndex = 0; + double minOffset = 0; + + void addRow(int i, {required bool complete}) { + if (items.isEmpty) return; + + final availableWidth = availableWidthFor(items.length); + var height = availableWidth / ratioSum + spacing; + if (height > heightMax + precisionErrorTolerance) { + if (!complete) { + ratioSum = availableWidth / (heightMax - spacing); + addRow(i, complete: complete); + } + return; + } + + height += bottom; + rows.add( + MosaicRowLayout( + firstIndex: firstIndex, + lastIndex: i - 1, + minOffset: minOffset, + height: height, + itemWidths: items.map((item) => availableWidth * coverRatioResolver(item) / ratioSum).toList(), + ), + ); + firstIndex = i; + minOffset += height; + ratioMin = double.infinity; + ratioSum = 0; + items.clear(); + } + + section.forEachIndexed((i, item) { + final ratio = coverRatioResolver(item); + final nextAvailableWidth = availableWidthFor(items.length + 1); + final nextRatioSum = ratio + ratioSum; + final nextItemMinWidth = nextAvailableWidth * min(ratio, ratioMin) / nextRatioSum; + final nextHeight = nextAvailableWidth / nextRatioSum + spacing; + if (nextItemMinWidth < targetExtent || nextHeight < targetExtent) { + // add row when appending the next item would make other items too small + addRow(i, complete: true); + } + items.add(item); + ratioMin = min(ratio, ratioMin); + ratioSum += ratio; + }); + if (items.isNotEmpty) { + // add last row, possibly incomplete + addRow(section.length, complete: false); + } + + return rows; + } +} diff --git a/lib/widgets/common/grid/sections/provider.dart b/lib/widgets/common/grid/sections/provider.dart new file mode 100644 index 0000000..087bc7c --- /dev/null +++ b/lib/widgets/common/grid/sections/provider.dart @@ -0,0 +1,105 @@ +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/widgets/common/grid/sections/fixed/section_layout_builder.dart'; +import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:aves/widgets/common/grid/sections/mosaic/section_layout_builder.dart'; +import 'package:aves/widgets/common/grid/sections/section_layout_builder.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:provider/provider.dart'; + +typedef CoverRatioResolver<T> = double Function(T item); + +abstract class SectionedListLayoutProvider<T> extends StatelessWidget { + final double scrollableWidth; + final TileLayout tileLayout; + final int columnCount; + final double spacing, horizontalPadding, tileWidth, tileHeight; + final TileBuilder<T> tileBuilder; + final Duration tileAnimationDelay; + final CoverRatioResolver<T> coverRatioResolver; + final Widget child; + + const SectionedListLayoutProvider({ + super.key, + required this.scrollableWidth, + required this.tileLayout, + required int columnCount, + required this.spacing, + required this.horizontalPadding, + required double tileWidth, + required this.tileHeight, + required this.tileBuilder, + required this.tileAnimationDelay, + required this.coverRatioResolver, + required this.child, + }) : assert(scrollableWidth != 0), + columnCount = tileLayout == TileLayout.list ? 1 : columnCount, + tileWidth = tileLayout == TileLayout.list ? scrollableWidth - (horizontalPadding * 2) : tileWidth; + + @override + Widget build(BuildContext context) { + return ProxyProvider0<SectionedListLayout<T>>( + update: (context, _) { + switch (tileLayout) { + case TileLayout.mosaic: + return MosaicSectionLayoutBuilder<T>( + sections: sections, + showHeaders: showHeaders, + getHeaderExtent: getHeaderExtent, + buildHeader: buildHeader, + scrollableWidth: scrollableWidth, + tileLayout: tileLayout, + columnCount: columnCount, + spacing: spacing, + horizontalPadding: horizontalPadding, + tileWidth: tileWidth, + tileHeight: tileHeight, + tileBuilder: tileBuilder, + tileAnimationDelay: tileAnimationDelay, + coverRatioResolver: coverRatioResolver, + ).updateLayouts(context); + case TileLayout.grid: + case TileLayout.list: + return FixedExtentSectionLayoutBuilder<T>( + sections: sections, + showHeaders: showHeaders, + buildHeader: buildHeader, + getHeaderExtent: getHeaderExtent, + scrollableWidth: scrollableWidth, + tileLayout: tileLayout, + columnCount: columnCount, + spacing: spacing, + horizontalPadding: horizontalPadding, + tileWidth: tileWidth, + tileHeight: tileHeight, + tileBuilder: tileBuilder, + tileAnimationDelay: tileAnimationDelay, + ).updateLayouts(context); + } + }, + child: child, + ); + } + + bool get showHeaders; + + Map<SectionKey, List<T>> get sections; + + double getHeaderExtent(BuildContext context, SectionKey sectionKey); + + Widget buildHeader(BuildContext context, SectionKey sectionKey, double headerExtent); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DoubleProperty('scrollableWidth', scrollableWidth)); + properties.add(EnumProperty<TileLayout>('tileLayout', tileLayout)); + properties.add(IntProperty('columnCount', columnCount)); + properties.add(DoubleProperty('spacing', spacing)); + properties.add(DoubleProperty('horizontalPadding', horizontalPadding)); + properties.add(DoubleProperty('tileWidth', tileWidth)); + properties.add(DoubleProperty('tileHeight', tileHeight)); + properties.add(DiagnosticsProperty<bool>('showHeaders', showHeaders)); + } +} diff --git a/lib/widgets/common/grid/sections/section_layout.dart b/lib/widgets/common/grid/sections/section_layout.dart new file mode 100644 index 0000000..4a48b9d --- /dev/null +++ b/lib/widgets/common/grid/sections/section_layout.dart @@ -0,0 +1,37 @@ +import 'package:aves/model/source/section_keys.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; + +@immutable +abstract class SectionLayout extends Equatable { + final SectionKey sectionKey; + final int firstIndex, lastIndex, bodyFirstIndex; + final double minOffset, maxOffset, bodyMinOffset; + final double headerExtent, spacing; + final IndexedWidgetBuilder builder; + + @override + List<Object?> get props => [sectionKey, firstIndex, lastIndex, minOffset, maxOffset, headerExtent, spacing]; + + const SectionLayout({ + required this.sectionKey, + required this.firstIndex, + required this.lastIndex, + required this.minOffset, + required this.maxOffset, + required this.headerExtent, + required this.spacing, + required this.builder, + }) : bodyFirstIndex = firstIndex + 1, + bodyMinOffset = minOffset + headerExtent; + + bool hasChild(int index) => firstIndex <= index && index <= lastIndex; + + bool hasChildAtOffset(double scrollOffset) => minOffset <= scrollOffset && scrollOffset <= maxOffset; + + double indexToLayoutOffset(int index); + + int getMinChildIndexForScrollOffset(double scrollOffset); + + int getMaxChildIndexForScrollOffset(double scrollOffset); +} diff --git a/lib/widgets/common/grid/sections/section_layout_builder.dart b/lib/widgets/common/grid/sections/section_layout_builder.dart new file mode 100644 index 0000000..b14c00d --- /dev/null +++ b/lib/widgets/common/grid/sections/section_layout_builder.dart @@ -0,0 +1,105 @@ +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:aves/widgets/common/grid/sections/section_layout.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:provider/provider.dart'; + +typedef TileBuilder<T> = Widget Function(T item, Size tileSize); + +abstract class SectionLayoutBuilder<T> { + final Map<SectionKey, List<T>> sections; + final bool showHeaders; + final double Function(BuildContext context, SectionKey sectionKey) getHeaderExtent; + final Widget Function(BuildContext context, SectionKey sectionKey, double headerExtent) buildHeader; + final double scrollableWidth; + final TileLayout tileLayout; + final int columnCount; + final double spacing, horizontalPadding, tileWidth, tileHeight, bottom; + final TileBuilder<T> tileBuilder; + final Duration tileAnimationDelay; + final bool animate; + + const SectionLayoutBuilder({ + required this.sections, + required this.showHeaders, + required this.getHeaderExtent, + required this.buildHeader, + required this.scrollableWidth, + required this.tileLayout, + required this.columnCount, + required this.spacing, + required this.horizontalPadding, + required this.tileWidth, + required this.tileHeight, + required this.tileBuilder, + required this.tileAnimationDelay, + }) : animate = tileAnimationDelay > Duration.zero, + bottom = tileHeight - tileWidth; + + SectionedListLayout<T> updateLayouts(BuildContext context); + + SectionLayout buildSectionLayout({ + required double headerExtent, + required SectionKey sectionKey, + required List<T> section, + required bool animate, + }); + + Widget buildSectionWidget({ + required BuildContext context, + required List<T> section, + required int sectionGridIndex, + required int sectionChildIndex, + required (int, int) Function() itemIndexRange, + required SectionKey sectionKey, + required double headerExtent, + required List<Size> itemSizes, + required bool animate, + required Widget Function(List<Widget> children) buildGridRow, + }) { + if (sectionChildIndex == 0) { + final header = headerExtent > 0 ? buildHeader(context, sectionKey, headerExtent) : const SizedBox(); + return animate ? _buildAnimation(context, sectionGridIndex, header) : header; + } + + final sectionItemCount = section.length; + final itemMinMax = itemIndexRange(); + final minItemIndex = itemMinMax.$1.clamp(0, sectionItemCount); + final maxItemIndex = itemMinMax.$2.clamp(0, sectionItemCount); + final childrenCount = maxItemIndex - minItemIndex; + final children = <Widget>[]; + for (var i = 0; i < childrenCount; i++) { + final item = RepaintBoundary( + child: tileBuilder(section[minItemIndex + i], itemSizes[i]), + ); + if (animate) { + children.add(_buildAnimation(context, sectionGridIndex + i, item)); + } else { + children.add(item); + } + } + return Padding( + padding: EdgeInsets.symmetric(horizontal: horizontalPadding), + child: buildGridRow(children), + ); + } + + Widget _buildAnimation(BuildContext context, int index, Widget child) { + final durations = context.watch<DurationsData>(); + return AnimationConfiguration.staggeredGrid( + position: index, + columnCount: tileLayout == TileLayout.mosaic ? 1 : columnCount, + duration: durations.staggeredAnimation, + delay: tileAnimationDelay, + child: SlideAnimation( + verticalOffset: 50.0, + child: FadeInAnimation( + child: child, + ), + ), + ); + } +} diff --git a/lib/widgets/common/grid/selector.dart b/lib/widgets/common/grid/selector.dart new file mode 100644 index 0000000..8f92217 --- /dev/null +++ b/lib/widgets/common/grid/selector.dart @@ -0,0 +1,244 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/utils/math_utils.dart'; +import 'package:aves/widgets/common/basic/gestures/gesture_detector.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class GridSelectionGestureDetector<T> extends StatefulWidget { + final GlobalKey scrollableKey; + final bool selectable; + final List<T> items; + final ScrollController scrollController; + final ValueNotifier<double> appBarHeightNotifier; + final Widget child; + + const GridSelectionGestureDetector({ + super.key, + required this.scrollableKey, + this.selectable = true, + required this.items, + required this.scrollController, + required this.appBarHeightNotifier, + required this.child, + }); + + @override + State<GridSelectionGestureDetector<T>> createState() => _GridSelectionGestureDetectorState<T>(); +} + +class _GridSelectionGestureDetectorState<T> extends State<GridSelectionGestureDetector<T>> { + bool _pressing = false, _selecting = false; + late int _fromIndex, _lastToIndex; + late Offset _localPosition; + late EdgeInsets _scrollableInsets; + late double _scrollSpeedFactor; + Timer? _selectionUpdateTimer; + Timer? _scrollMonitoringTimer; + var _isScrolling = false; + + List<T> get items => widget.items; + + ScrollController get scrollController => widget.scrollController; + + double get appBarHeight => widget.appBarHeightNotifier.value; + + double get scrollableWidth { + final scrollableContext = widget.scrollableKey.currentContext!; + final scrollableBox = scrollableContext.findRenderObject() as RenderBox; + // not the same as `MediaQuery.size.width`, because of screen insets/padding + return scrollableBox.size.width; + } + + static const double _scrollEdgeRatio = .15; + static const double _scrollMaxPixelPerSecond = 600.0; + static const Duration _scrollUpdateInterval = Duration(milliseconds: 100); + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant GridSelectionGestureDetector<T> oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + _stopScrollMonitoringTimer(); + super.dispose(); + } + + void _registerWidget(GridSelectionGestureDetector<T> widget) { + widget.scrollController.addListener(_onScrollChanged); + } + + void _unregisterWidget(GridSelectionGestureDetector<T> widget) { + widget.scrollController.removeListener(_onScrollChanged); + } + + @override + Widget build(BuildContext context) { + final selectable = widget.selectable; + return AGestureDetector( + onLongPressStart: selectable + ? (details) { + if (_isScrolling) return; + + final fromItem = _getItemAt(details.localPosition); + if (fromItem == null) return; + + Feedback.forLongPress(context); + final selection = context.read<Selection<T>>(); + selection.toggleSelection(fromItem); + _selecting = selection.isSelected([fromItem]); + _fromIndex = items.indexOf(fromItem); + _lastToIndex = _fromIndex; + _scrollableInsets = EdgeInsets.only( + top: appBarHeight, + bottom: context.read<MediaQueryData>().effectiveBottomPadding, + ); + _scrollSpeedFactor = 0; + _pressing = true; + } + : null, + onLongPressMoveUpdate: selectable + ? (details) { + if (!_pressing) return; + _localPosition = details.localPosition; + _onLongPressUpdate(); + } + : null, + onLongPressEnd: selectable + ? (details) { + if (!_pressing) return; + _setScrollSpeed(0); + _pressing = false; + } + : null, + onTapUp: selectable && context.select<Selection<T>, bool>((selection) => selection.isSelecting) + ? (details) { + if (_isScrolling) return; + + final item = _getItemAt(details.localPosition); + if (item == null) return; + + final selection = context.read<Selection<T>>(); + selection.toggleSelection(item); + } + : null, + longPressTimeout: settings.longPressTimeout, + child: widget.child, + ); + } + + void _onScrollChanged() { + _isScrolling = true; + _stopScrollMonitoringTimer(); + _scrollMonitoringTimer = Timer(settings.longPressTimeout + const Duration(milliseconds: 150), () { + _isScrolling = false; + }); + } + + void _stopScrollMonitoringTimer() => _scrollMonitoringTimer?.cancel(); + + void _onLongPressUpdate() { + final dy = _localPosition.dy; + + final height = scrollController.position.viewportDimension; + final top = dy < height / 2; + + final distanceToEdge = max(0, top ? dy - _scrollableInsets.top : height - dy - _scrollableInsets.bottom); + final threshold = height * _scrollEdgeRatio; + if (distanceToEdge < threshold) { + _setScrollSpeed((top ? -1 : 1) * roundToPrecision((threshold - distanceToEdge) / threshold, decimals: 1)); + } else { + _setScrollSpeed(0); + } + + final toItem = _getItemAt(_localPosition); + if (toItem != null) { + _toggleSelectionToIndex(items.indexOf(toItem)); + } + } + + void _setScrollSpeed(double speedFactor) { + if (speedFactor == _scrollSpeedFactor) return; + _scrollSpeedFactor = speedFactor; + _selectionUpdateTimer?.cancel(); + + final current = scrollController.offset; + if (speedFactor == 0) { + scrollController.jumpTo(current); + return; + } + + final target = speedFactor > 0 ? scrollController.position.maxScrollExtent : .0; + if (target != current) { + final distance = target - current; + final millis = distance * 1000 / _scrollMaxPixelPerSecond / speedFactor; + scrollController.animateTo( + target, + duration: Duration(milliseconds: millis.round()), + curve: Curves.linear, + ); + // use a timer to update the selection, because `onLongPressMoveUpdate` + // is not called when the pointer stays still while the view is scrolling + _selectionUpdateTimer = Timer.periodic(_scrollUpdateInterval, (_) => _onLongPressUpdate()); + } + } + + T? _getItemAt(Offset localPosition) { + // as of Flutter v1.22.5, `hitTest` on the `ScrollView` render object works fine when it is static, + // but when it is scrolling (through controller animation), result is incomplete and children are missing, + // so we use custom layout computation instead to find the item. + final offset = Offset(0, scrollController.offset - appBarHeight) + localPosition; + final sectionedListLayout = context.read<SectionedListLayout<T>>(); + return sectionedListLayout.getItemAt(context.isRtl ? Offset(scrollableWidth - offset.dx, offset.dy) : offset); + } + + void _toggleSelectionToIndex(int toIndex) { + if (toIndex == -1) return; + + Iterable<T> getRange(int start, int end) => start < end && 0 <= start && end <= items.length ? items.getRange(start, end) : {}; + final selection = context.read<Selection<T>>(); + void addRange(int start, int end) => selection.addToSelection(getRange(start, end)); + void removeRange(int start, int end) => selection.removeFromSelection(getRange(start, end)); + + if (_selecting) { + if (toIndex <= _fromIndex) { + if (toIndex < _lastToIndex) { + addRange(toIndex, min(_fromIndex, _lastToIndex)); + if (_fromIndex < _lastToIndex) { + removeRange(_fromIndex + 1, _lastToIndex + 1); + } + } else if (_lastToIndex < toIndex) { + removeRange(_lastToIndex, toIndex); + } + } else if (_fromIndex < toIndex) { + if (_lastToIndex < toIndex) { + addRange(max(_fromIndex, _lastToIndex), toIndex + 1); + if (_lastToIndex < _fromIndex) { + removeRange(_lastToIndex, _fromIndex); + } + } else if (toIndex < _lastToIndex) { + removeRange(toIndex + 1, _lastToIndex + 1); + } + } + _lastToIndex = toIndex; + } else { + removeRange(min(_fromIndex, toIndex), max(_fromIndex, toIndex) + 1); + } + } +} diff --git a/lib/widgets/common/grid/sliver.dart b/lib/widgets/common/grid/sliver.dart new file mode 100644 index 0000000..3d7ed75 --- /dev/null +++ b/lib/widgets/common/grid/sliver.dart @@ -0,0 +1,264 @@ +import 'dart:math' as math; + +import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:aves/widgets/common/grid/sections/section_layout.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +// Use a `SliverList` instead of multiple `SliverGrid` because having one `SliverGrid` per section does not scale up. +// With the multiple `SliverGrid` solution, thumbnails at the beginning of each sections are built even though they are offscreen +// because of `RenderSliverMultiBoxAdaptor.addInitialChild` called by `RenderSliverGrid.performLayout` (line 591), as of Flutter v3.3.3. +// cf https://github.com/flutter/flutter/issues/49027 +// adapted from Flutter `RenderSliverFixedExtentBoxAdaptor` in `/rendering/sliver_fixed_extent_list.dart` +class SectionedListSliver<T> extends StatelessWidget { + const SectionedListSliver({super.key}); + + @override + Widget build(BuildContext context) { + final sectionLayouts = context.watch<SectionedListLayout<T>>().sectionLayouts; + final childCount = sectionLayouts.isEmpty ? 0 : sectionLayouts.last.lastIndex + 1; + return _SliverKnownExtentList( + sectionLayouts: sectionLayouts, + delegate: SliverChildBuilderDelegate( + (context, index) { + if (index >= childCount) return null; + final sectionLayout = sectionLayouts.firstWhereOrNull((section) => section.hasChild(index)); + return sectionLayout?.builder(context, index) ?? const SizedBox(); + }, + childCount: childCount, + addAutomaticKeepAlives: false, + addRepaintBoundaries: false, + ), + ); + } +} + +class _SliverKnownExtentList extends SliverMultiBoxAdaptorWidget { + final List<SectionLayout> sectionLayouts; + + const _SliverKnownExtentList({ + required super.delegate, + required this.sectionLayouts, + }); + + @override + _RenderSliverKnownExtentBoxAdaptor createRenderObject(BuildContext context) { + final element = context as SliverMultiBoxAdaptorElement; + return _RenderSliverKnownExtentBoxAdaptor(childManager: element, sectionLayouts: sectionLayouts); + } + + @override + void updateRenderObject(BuildContext context, _RenderSliverKnownExtentBoxAdaptor renderObject) { + renderObject.sectionLayouts = sectionLayouts; + } +} + +class _RenderSliverKnownExtentBoxAdaptor extends RenderSliverMultiBoxAdaptor { + List<SectionLayout> _sectionLayouts; + + List<SectionLayout> get sectionLayouts => _sectionLayouts; + + set sectionLayouts(List<SectionLayout> value) { + if (_sectionLayouts == value) return; + _sectionLayouts = value; + markNeedsLayout(); + } + + _RenderSliverKnownExtentBoxAdaptor({ + required super.childManager, + required List<SectionLayout> sectionLayouts, + }) : _sectionLayouts = sectionLayouts; + + SectionLayout? sectionAtIndex(int index) => sectionLayouts.firstWhereOrNull((section) => section.hasChild(index)); + + SectionLayout? sectionAtOffset(double scrollOffset) => sectionLayouts.firstWhereOrNull((section) => section.hasChildAtOffset(scrollOffset)) ?? sectionLayouts.lastOrNull; + + double indexToLayoutOffset(int index) { + return (sectionAtIndex(index) ?? sectionLayouts.lastOrNull)?.indexToLayoutOffset(index) ?? 0; + } + + int getMinChildIndexForScrollOffset(double scrollOffset) { + return sectionAtOffset(scrollOffset)?.getMinChildIndexForScrollOffset(scrollOffset) ?? 0; + } + + int getMaxChildIndexForScrollOffset(double scrollOffset) { + return sectionAtOffset(scrollOffset)?.getMaxChildIndexForScrollOffset(scrollOffset) ?? 0; + } + + double estimateMaxScrollOffset( + SliverConstraints constraints, { + int? firstIndex, + int? lastIndex, + double? leadingScrollOffset, + double? trailingScrollOffset, + }) { + // default implementation is an estimation via `childManager.estimateMaxScrollOffset()` + // but we have the accurate offset via pre-computed section layouts + return _sectionLayouts.last.maxOffset; + } + + double computeMaxScrollOffset(SliverConstraints constraints) { + return sectionLayouts.last.maxOffset; + } + + int _calculateLeadingGarbage(int firstIndex) { + var walker = firstChild; + var leadingGarbage = 0; + while (walker != null && indexOf(walker) < firstIndex) { + leadingGarbage += 1; + walker = childAfter(walker); + } + return leadingGarbage; + } + + int _calculateTrailingGarbage(int targetLastIndex) { + var walker = lastChild; + var trailingGarbage = 0; + while (walker != null && indexOf(walker) > targetLastIndex) { + trailingGarbage += 1; + walker = childBefore(walker); + } + return trailingGarbage; + } + + @override + void performLayout() { + final constraints = this.constraints; + childManager.didStartLayout(); + childManager.setDidUnderflow(false); + + final scrollOffset = constraints.scrollOffset + constraints.cacheOrigin; + assert(scrollOffset >= 0.0); + final remainingExtent = constraints.remainingCacheExtent; + assert(remainingExtent >= 0.0); + final targetEndScrollOffset = scrollOffset + remainingExtent; + + final childConstraints = constraints.asBoxConstraints(); + + final firstIndex = getMinChildIndexForScrollOffset(scrollOffset); + final targetLastIndex = targetEndScrollOffset.isFinite ? getMaxChildIndexForScrollOffset(targetEndScrollOffset) : null; + + if (firstChild != null) { + final leadingGarbage = _calculateLeadingGarbage(firstIndex); + final trailingGarbage = targetLastIndex != null ? _calculateTrailingGarbage(targetLastIndex) : 0; + collectGarbage(leadingGarbage, trailingGarbage); + } else { + collectGarbage(0, 0); + } + + if (firstChild == null) { + if (!addInitialChild(index: firstIndex, layoutOffset: indexToLayoutOffset(firstIndex))) { + // There are either no children, or we are past the end of all our children. + double max; + if (firstIndex <= 0) { + max = 0.0; + } else { + max = computeMaxScrollOffset(constraints); + } + geometry = SliverGeometry( + scrollExtent: max, + maxPaintExtent: max, + ); + childManager.didFinishLayout(); + return; + } + } + + RenderBox? trailingChildWithLayout; + + for (var index = indexOf(firstChild!) - 1; index >= firstIndex; --index) { + final child = insertAndLayoutLeadingChild(childConstraints); + if (child == null) { + // Items before the previously first child are no longer present. + // Reset the scroll offset to offset all items prior and up to the + // missing item. Let parent re-layout everything. + final layout = sectionAtIndex(index) ?? sectionLayouts.first; + geometry = SliverGeometry(scrollOffsetCorrection: layout.indexToLayoutOffset(index)); + return; + } + final childParentData = child.parentData as SliverMultiBoxAdaptorParentData; + childParentData.layoutOffset = indexToLayoutOffset(index); + assert(childParentData.index == index); + trailingChildWithLayout ??= child; + } + + if (trailingChildWithLayout == null) { + firstChild!.layout(childConstraints); + final childParentData = firstChild!.parentData as SliverMultiBoxAdaptorParentData; + childParentData.layoutOffset = indexToLayoutOffset(firstIndex); + trailingChildWithLayout = firstChild; + } + + var estimatedMaxScrollOffset = double.infinity; + for (var index = indexOf(trailingChildWithLayout!) + 1; targetLastIndex == null || index <= targetLastIndex; ++index) { + var child = childAfter(trailingChildWithLayout!); + if (child == null || indexOf(child) != index) { + child = insertAndLayoutChild(childConstraints, after: trailingChildWithLayout); + if (child == null) { + // We have run out of children. + final layout = sectionAtIndex(index) ?? sectionLayouts.last; + estimatedMaxScrollOffset = layout.maxOffset; + break; + } + } else { + child.layout(childConstraints); + } + trailingChildWithLayout = child; + final childParentData = child.parentData as SliverMultiBoxAdaptorParentData; + assert(childParentData.index == index); + childParentData.layoutOffset = indexToLayoutOffset(childParentData.index!); + } + + final lastIndex = indexOf(lastChild!); + final leadingScrollOffset = indexToLayoutOffset(firstIndex); + final trailingScrollOffset = indexToLayoutOffset(lastIndex + 1); + + assert(firstIndex == 0 || childScrollOffset(firstChild!)! - scrollOffset <= precisionErrorTolerance); + assert(debugAssertChildListIsNonEmptyAndContiguous()); + assert(indexOf(firstChild!) == firstIndex); + assert(targetLastIndex == null || lastIndex <= targetLastIndex); + + estimatedMaxScrollOffset = math.min( + estimatedMaxScrollOffset, + estimateMaxScrollOffset( + constraints, + firstIndex: firstIndex, + lastIndex: lastIndex, + leadingScrollOffset: leadingScrollOffset, + trailingScrollOffset: trailingScrollOffset, + ), + ); + + final paintExtent = calculatePaintOffset( + constraints, + from: math.min(constraints.scrollOffset, leadingScrollOffset), + to: trailingScrollOffset, + ); + + final cacheExtent = calculateCacheOffset( + constraints, + from: leadingScrollOffset, + to: trailingScrollOffset, + ); + + final targetEndScrollOffsetForPaint = constraints.scrollOffset + constraints.remainingPaintExtent; + final targetLastIndexForPaint = targetEndScrollOffsetForPaint.isFinite ? getMaxChildIndexForScrollOffset(targetEndScrollOffsetForPaint) : null; + geometry = SliverGeometry( + scrollExtent: estimatedMaxScrollOffset, + paintExtent: math.min(paintExtent, estimatedMaxScrollOffset), + cacheExtent: cacheExtent, + maxPaintExtent: estimatedMaxScrollOffset, + // Conservative to avoid flickering away the clip during scroll. + hasVisualOverflow: (targetLastIndexForPaint != null && lastIndex >= targetLastIndexForPaint) || constraints.scrollOffset > 0.0, + ); + + // We may have started the layout while scrolled to the end, which would not + // expose a new child. + if (estimatedMaxScrollOffset == trailingScrollOffset) childManager.setDidUnderflow(true); + childManager.didFinishLayout(); + } +} diff --git a/lib/widgets/common/grid/theme.dart b/lib/widgets/common/grid/theme.dart new file mode 100644 index 0000000..12ba4d3 --- /dev/null +++ b/lib/widgets/common/grid/theme.dart @@ -0,0 +1,111 @@ +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/favourites.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/identity/aves_icons.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class GridTheme extends StatelessWidget { + final double extent; + final bool showLocation; + final bool? showTrash; + final Widget child; + + const GridTheme({ + super.key, + required this.extent, + this.showLocation = true, + this.showTrash, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return ProxyProvider2<Settings, MediaQueryData, GridThemeData>( + update: (context, settings, mq, previous) { + final margin = OverlayIcon.defaultMargin.vertical; + var iconSize = min<double>(24.0, ((extent - margin) / 5).floorToDouble() - margin); + final fontSize = (iconSize * .7).floorToDouble(); + iconSize = mq.textScaler.scale(iconSize); + final highlightBorderWidth = extent * .1; + final interactiveDimension = min(iconSize * 2, kMinInteractiveDimension); + return GridThemeData( + iconSize: iconSize, + fontSize: fontSize, + highlightBorderWidth: highlightBorderWidth, + interactiveDimension: interactiveDimension, + showFavourite: settings.showThumbnailFavourite, + showHdr: settings.showThumbnailHdr, + locationIcon: showLocation ? settings.thumbnailLocationIcon : ThumbnailOverlayLocationIcon.none, + tagIcon: settings.thumbnailTagIcon, + showMotionPhoto: settings.showThumbnailMotionPhoto, + showRating: settings.showThumbnailRating, + showRaw: settings.showThumbnailRaw, + showTrash: showTrash ?? true, + showVideoDuration: settings.showThumbnailVideoDuration, + ); + }, + child: child, + ); + } +} + +typedef GridThemeIconBuilder = List<Widget> Function(BuildContext context, AvesEntry entry); + +class GridThemeData { + final double iconSize, fontSize, highlightBorderWidth, interactiveDimension; + final bool showFavourite, showHdr, showMotionPhoto, showRating, showRaw, showTrash, showVideoDuration; + final bool showLocated, showUnlocated, showTagged, showUntagged; + late final GridThemeIconBuilder iconBuilder; + + GridThemeData({ + required this.iconSize, + required this.fontSize, + required this.highlightBorderWidth, + required this.interactiveDimension, + required this.showFavourite, + required this.showHdr, + required ThumbnailOverlayLocationIcon locationIcon, + required ThumbnailOverlayTagIcon tagIcon, + required this.showMotionPhoto, + required this.showRating, + required this.showRaw, + required this.showTrash, + required this.showVideoDuration, + }) : showLocated = locationIcon == ThumbnailOverlayLocationIcon.located, + showUnlocated = locationIcon == ThumbnailOverlayLocationIcon.unlocated, + showTagged = tagIcon == ThumbnailOverlayTagIcon.tagged, + showUntagged = tagIcon == ThumbnailOverlayTagIcon.untagged { + iconBuilder = (context, entry) { + final located = entry.hasGps; + final tagged = entry.tags.isNotEmpty; + final isMultiPage = entry.isMultiPage; + return [ + if (entry.isFavourite && showFavourite) const FavouriteIcon(), + if (tagged && showTagged) TagIcon.tagged(), + if (!tagged && showUntagged) TagIcon.untagged(), + if (located && showLocated) LocationIcon.located(), + if (!located && showUnlocated) LocationIcon.unlocated(), + if (entry.rating != 0 && showRating) RatingIcon(entry: entry), + if (entry.isHdr && showHdr) const HdrIcon(), + if (entry.isPureVideo) + VideoIcon(entry: entry) + else if (entry.isAnimated) + const AnimatedImageIcon() + else ...[ + if ((entry.isRaw || (isMultiPage && entry.stackedEntries?.any((v) => v.isRaw) == true)) && showRaw) const RawIcon(), + if (entry.is360) const PanoramaIcon(), + ], + if (entry.isMotionPhoto && showMotionPhoto) const MotionPhotoIcon(), + if (isMultiPage && !entry.isMotionPhoto) MultiPageIcon(entry: entry), + if (entry.isGeotiff) const GeoTiffIcon(), + if (entry.trashed && showTrash) TrashIcon(trashDaysLeft: entry.trashDaysLeft), + ]; + }; + } +} diff --git a/lib/widgets/common/hybrid_frame.dart b/lib/widgets/common/hybrid_frame.dart new file mode 100644 index 0000000..913bda6 --- /dev/null +++ b/lib/widgets/common/hybrid_frame.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; + +/// Cornice "ibrida": bordo esterno rettangolare + bordo interno smussato. +class HybridFrame extends StatelessWidget { + final Widget child; + + /// raggio della cornice interna + final double radius; + + /// spessore dei bordi + final double stroke; + + /// distanza tra bordo esterno e interno + final double inset; + + /// colori personalizzabili + final Color? outerColor; + final Color? innerColor; + + const HybridFrame({ + super.key, + required this.child, + this.radius = 12, + this.stroke = 2, + this.inset = 3, + this.outerColor, + this.innerColor, + }); + + @override + Widget build(BuildContext context) { + final oc = outerColor ?? Colors.white.withOpacity(.85); + final ic = innerColor ?? Colors.black.withOpacity(.55); + + return Stack( + fit: StackFit.expand, + children: [ + child, + + // bordo esterno: rettangolare + Positioned.fill( + child: IgnorePointer( + child: DecoratedBox( + decoration: BoxDecoration( + border: Border.all(color: oc, width: stroke), + ), + ), + ), + ), + + // bordo interno: smussato + Positioned.fill( + child: IgnorePointer( + child: Padding( + padding: EdgeInsets.all(inset), + child: DecoratedBox( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(radius), + border: Border.all(color: ic, width: stroke), + ), + ), + ), + ), + ), + ], + ); + } +} + diff --git a/lib/widgets/common/identity/aves_app_bar.dart b/lib/widgets/common/identity/aves_app_bar.dart new file mode 100644 index 0000000..d060d6f --- /dev/null +++ b/lib/widgets/common/identity/aves_app_bar.dart @@ -0,0 +1,305 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/basic/gestures/ink_well.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/fx/blurred.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class AvesAppBar extends StatelessWidget { + final double contentHeight; + final bool pinned; + final Widget? leading; + final Widget title; + final List<Widget> Function(BuildContext context, double maxWidth) actions; + final Widget? bottom; + final Object? transitionKey; + + static const leadingHeroTag = 'appbar-leading'; + static const titleHeroTag = 'appbar-title'; + static const double _titleMinWidth = 96; + + const AvesAppBar({ + super.key, + required this.contentHeight, + required this.pinned, + required this.leading, + required this.title, + required this.actions, + this.bottom, + this.transitionKey, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final colorScheme = theme.colorScheme; + final textScaler = MediaQuery.textScalerOf(context); + final useTvLayout = settings.useTvLayout; + + Widget? _leading = leading; + if (_leading != null) { + _leading = FontSizeIconTheme( + child: _leading, + ); + } + + Widget _title = FontSizeIconTheme( + child: LayoutBuilder( + builder: (context, constraints) { + return Row( + key: ValueKey(transitionKey), + children: [ + Expanded(child: title), + ...(actions(context, max(0, constraints.maxWidth - _titleMinWidth))), + ], + ); + }, + ), + ); + + final animate = context.select<Settings, bool>((v) => v.animate); + if (animate) { + _title = Hero( + tag: titleHeroTag, + flightShuttleBuilder: _flightShuttleBuilder, + transitionOnUserGestures: true, + child: AnimatedSwitcher( + duration: context.read<DurationsData>().iconAnimation, + child: _title, + ), + ); + + if (_leading != null) { + _leading = Hero( + tag: leadingHeroTag, + flightShuttleBuilder: _flightShuttleBuilder, + transitionOnUserGestures: true, + child: _leading, + ); + } + } + + return SliverPersistentHeader( + floating: !useTvLayout, + pinned: pinned, + delegate: _SliverAppBarDelegate( + height: MediaQuery.paddingOf(context).top + + appBarHeightForContentHeight(contentHeight), + child: DirectionalSafeArea( + start: !useTvLayout, + bottom: false, + child: AvesFloatingBar( + builder: (context, backgroundColor, child) => Material( + color: backgroundColor, + child: AInkResponse( + // assorbe i tap sull'area della app bar, evitando + // che arrivino alle foto sottostanti + onTap: () {}, + onLongPress: () {}, + containedInkWell: true, + highlightShape: BoxShape.rectangle, + longPressTimeout: settings.longPressTimeout, + child: child, + ), + ), + child: Theme( + data: theme.copyWith( + colorScheme: colorScheme.copyWith( + onSurfaceVariant: colorScheme.onSurface, + ), + ), + child: Column( + children: [ + SizedBox( + height: textScaler.scale(kToolbarHeight), + child: Row( + children: [ + _leading != null + ? Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: _leading, + ) + : const SizedBox(width: 16), + Expanded( + child: DefaultTextStyle( + style: theme.appBarTheme.titleTextStyle!, + child: _title, + ), + ), + ], + ), + ), + if (bottom != null) bottom!, + ], + ), + ), + ), + ), + ), + ); + } + + static Widget _flightShuttleBuilder( + BuildContext flightContext, + Animation<double> animation, + HeroFlightDirection flightDirection, + BuildContext fromHeroContext, + BuildContext toHeroContext, + ) { + final pushing = flightDirection == HeroFlightDirection.push; + + Widget popBuilder(context, child) => + Opacity(opacity: 1 - animation.value, child: child); + + Widget pushBuilder(context, child) => + Opacity(opacity: animation.value, child: child); + + return Material( + type: MaterialType.transparency, + child: DefaultTextStyle( + style: DefaultTextStyle.of(toHeroContext).style, + child: Stack( + children: [ + AnimatedBuilder( + animation: animation, + builder: pushing ? popBuilder : pushBuilder, + child: fromHeroContext.widget, + ), + AnimatedBuilder( + animation: animation, + builder: pushing ? pushBuilder : popBuilder, + child: toHeroContext.widget, + ), + ], + ), + ), + ); + } + + static double appBarHeightForContentHeight(double contentHeight) => + AvesFloatingBar.margin.vertical + contentHeight; +} + +class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate { + final double height; + final Widget child; + + const _SliverAppBarDelegate({ + required this.height, + required this.child, + }); + + @override + double get minExtent => height; + + @override + double get maxExtent => height; + + @override + Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) => + child; + + @override + bool shouldRebuild(covariant _SliverAppBarDelegate oldDelegate) => true; +} + +class AvesFloatingBar extends StatefulWidget { + final Widget Function(BuildContext context, Color backgroundColor, Widget? child) + builder; + final Widget? child; + + static const margin = EdgeInsets.all(8); + static const borderRadius = BorderRadius.all(Radius.circular(8)); + + const AvesFloatingBar({ + super.key, + required this.builder, + this.child, + }); + + @override + State<AvesFloatingBar> createState() => _AvesFloatingBarState(); +} + +class _AvesFloatingBarState extends State<AvesFloatingBar> with RouteAware { + final ValueNotifier<bool> _isBlurAllowedNotifier = ValueNotifier(true); + Timer? _blurBlockTimer; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final route = ModalRoute.of(context); + if (route is PageRoute) { + AvesApp.pageRouteObserver.subscribe(this, route); + } + } + + @override + void dispose() { + AvesApp.pageRouteObserver.unsubscribe(this); + _isBlurAllowedNotifier.dispose(); + super.dispose(); + } + + @override + void didPopNext() { + _blurBlockTimer?.cancel(); + _blurBlockTimer = null; + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; + _isBlurAllowedNotifier.value = true; + }); + } + + @override + void didPushNext() { + _blurBlockTimer?.cancel(); + _blurBlockTimer = Timer(ADurations.pageTransitionLoose, () { + if (mounted) { + _isBlurAllowedNotifier.value = false; + } + }); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final backgroundColor = + theme.appBarTheme.backgroundColor ?? Themes.firstLayerColor(context); + + return ValueListenableBuilder<bool>( + valueListenable: _isBlurAllowedNotifier, + builder: (context, isBlurAllowed, child) { + final blurred = + isBlurAllowed && context.select<Settings, bool>((v) => v.enableBlurEffect); + + return Container( + foregroundDecoration: BoxDecoration( + border: Border.all( + color: theme.dividerColor, + ), + borderRadius: AvesFloatingBar.borderRadius, + ), + margin: AvesFloatingBar.margin, + child: BlurredRRect( + enabled: blurred, + borderRadius: AvesFloatingBar.borderRadius, + child: widget.builder( + context, + blurred ? backgroundColor.withValues(alpha: .85) : backgroundColor, + widget.child, + ), + ), + ); + }, + ); + } +} + diff --git a/lib/widgets/common/identity/aves_caption.dart b/lib/widgets/common/identity/aves_caption.dart new file mode 100644 index 0000000..243eba6 --- /dev/null +++ b/lib/widgets/common/identity/aves_caption.dart @@ -0,0 +1,42 @@ +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/basic/text/change_highlight.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class AvesCaption extends StatelessWidget { + final String data; + + const AvesCaption( + this.data, { + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final subtitleStyle = theme.textTheme.bodySmall!; + final subtitleChangeShadowColor = theme.colorScheme.onSurface; + return ChangeHighlightText( + // provide key to refresh on theme brightness change + key: ValueKey(subtitleChangeShadowColor), + data, + style: subtitleStyle.copyWith( + shadows: [ + Shadow( + color: subtitleChangeShadowColor.withAlpha(0), + blurRadius: 0, + ), + ], + ), + changedStyle: subtitleStyle.copyWith( + shadows: [ + Shadow( + color: subtitleChangeShadowColor, + blurRadius: 3, + ), + ], + ), + duration: context.read<DurationsData>().formTextStyleTransition, + ); + } +} diff --git a/lib/widgets/common/identity/aves_donut.dart b/lib/widgets/common/identity/aves_donut.dart new file mode 100644 index 0000000..6f42a3a --- /dev/null +++ b/lib/widgets/common/identity/aves_donut.dart @@ -0,0 +1,203 @@ +import 'dart:math'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:charts_flutter/flutter.dart' as charts; +import 'package:collection/collection.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +typedef DatumKeyFormatter = String Function(AvesDonutDatum d); +typedef DatumValueFormatter = String Function(int d); +typedef DatumColorizer = Color Function(BuildContext context, AvesDonutDatum d); +typedef DatumCallback = void Function(AvesDonutDatum d); + +class AvesDonut extends StatefulWidget { + final Widget title; + final Map<String, int> byTypes; + final Duration animationDuration; + final DatumKeyFormatter formatKey; + final DatumValueFormatter formatValue; + final DatumColorizer colorize; + final DatumCallback? onTap; + + const AvesDonut({ + super.key, + required this.title, + required this.byTypes, + required this.animationDuration, + required this.formatKey, + required this.formatValue, + required this.colorize, + this.onTap, + }); + + @override + State<AvesDonut> createState() => _AvesDonutState(); +} + +class _AvesDonutState extends State<AvesDonut> with AutomaticKeepAliveClientMixin { + Map<String, int> get byTypes => widget.byTypes; + + DatumKeyFormatter get formatKey => widget.formatKey; + + DatumValueFormatter get formatValue => widget.formatValue; + + DatumColorizer get colorize => widget.colorize; + + static const avesDonutMinWidth = 124.0; + + @override + Widget build(BuildContext context) { + super.build(context); + + if (byTypes.isEmpty) return const SizedBox(); + + final sum = byTypes.values.sum; + + final seriesData = byTypes.entries.map((kv) { + final type = kv.key; + return AvesDonutDatum( + key: type, + value: kv.value, + ); + }).toList(); + seriesData.sort((d1, d2) { + final c = d2.value.compareTo(d1.value); + return c != 0 ? c : compareAsciiUpperCase(formatKey(d1), formatKey(d2)); + }); + + return AvesColorsProvider( + allowMonochrome: false, + child: LayoutBuilder( + builder: (context, constraints) { + final series = [ + charts.Series<AvesDonutDatum, String>( + id: 'type', + colorFn: (d, i) => charts.ColorUtil.fromDartColor(colorize(context, d)), + domainFn: (d, i) => formatKey(d), + measureFn: (d, i) => d.value, + data: seriesData, + labelAccessorFn: (d, _) => '${formatKey(d)}: ${d.value}', + ), + ]; + + final textScaler = MediaQuery.textScalerOf(context); + final minWidth = textScaler.scale(avesDonutMinWidth); + final availableWidth = constraints.maxWidth; + final dim = max(minWidth, availableWidth / (availableWidth > 4 * minWidth ? 4 : (availableWidth > 2 * minWidth ? 2 : 1))); + + final donut = SizedBox( + width: dim, + height: dim, + child: Stack( + alignment: Alignment.center, + children: [ + ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(dim)), + child: Container( + width: dim * .7, + height: dim * .7, + color: Themes.secondLayerColor(context), + ), + ), + charts.PieChart( + series, + animate: context.select<Settings, bool>((v) => v.animate), + animationDuration: widget.animationDuration, + defaultRenderer: charts.ArcRendererConfig<String>( + arcWidth: 16, + ), + ), + Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + widget.title, + Text( + formatValue(sum), + textAlign: TextAlign.center, + ), + ], + ), + ), + ], + ), + ); + final onTap = widget.onTap; + final legend = SizedBox( + width: dim, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: seriesData + .map( + (d) => InkWell( + onTap: onTap != null ? () => onTap(d) : null, + borderRadius: const BorderRadius.all(Radius.circular(123)), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(AIcons.circle, fill: 1, color: colorize(context, d)), + const SizedBox(width: 8), + Flexible( + child: Text( + formatKey(d), + overflow: TextOverflow.fade, + softWrap: false, + maxLines: 1, + ), + ), + const SizedBox(width: 8), + Text( + formatValue(d.value), + style: TextStyle( + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), + const SizedBox(width: 4), + ], + ), + ), + ) + .toList(), + ), + ); + final children = [ + donut, + legend, + ]; + return availableWidth > minWidth * 2 + ? Row( + mainAxisSize: MainAxisSize.min, + children: children, + ) + : Column( + mainAxisSize: MainAxisSize.min, + children: children, + ); + }, + ), + ); + } + + @override + bool get wantKeepAlive => true; +} + +@immutable +class AvesDonutDatum extends Equatable { + final String key; + final int value; + + @override + List<Object?> get props => [key, value]; + + const AvesDonutDatum({ + required this.key, + required this.value, + }); +} diff --git a/lib/widgets/common/identity/aves_expansion_tile.dart b/lib/widgets/common/identity/aves_expansion_tile.dart new file mode 100644 index 0000000..ad856f6 --- /dev/null +++ b/lib/widgets/common/identity/aves_expansion_tile.dart @@ -0,0 +1,74 @@ +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/identity/highlight_title.dart'; +import 'package:expansion_tile_card/expansion_tile_card.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class AvesExpansionTile extends StatelessWidget { + final String value; + final Widget? leading; + final String title; + final Color? highlightColor; + final ValueNotifier<String?>? expandedNotifier; + final bool initiallyExpanded, showHighlight; + final List<Widget> children; + + const AvesExpansionTile({ + super.key, + String? value, + this.leading, + required this.title, + this.highlightColor, + this.expandedNotifier, + this.initiallyExpanded = false, + this.showHighlight = true, + required this.children, + }) : value = value ?? title; + + @override + Widget build(BuildContext context) { + final enabled = children.isNotEmpty == true; + Widget titleChild = HighlightTitle( + title: title, + color: highlightColor, + enabled: enabled, + showHighlight: showHighlight, + ); + if (leading != null) { + titleChild = Row( + children: [ + leading!, + const SizedBox(width: 8), + Expanded(child: titleChild), + ], + ); + } + + final animationDuration = context.select<DurationsData, Duration>((v) => v.expansionTileAnimation); + final theme = Theme.of(context); + final colorScheme = theme.colorScheme; + return ExpansionTileCard( + // key is expected by test driver + key: Key('tilecard-$value'), + value: value, + expandedNotifier: expandedNotifier, + title: titleChild, + expandable: enabled, + initiallyExpanded: initiallyExpanded, + finalPadding: const EdgeInsets.symmetric(vertical: 6.0), + baseColor: Themes.firstLayerColor(context), + expandedTextColor: colorScheme.onSurface, + duration: animationDuration, + shadowColor: theme.shadowColor, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Divider(thickness: 1, height: 1), + const SizedBox(height: 4), + if (enabled) ...children, + ], + ), + ); + } +} diff --git a/lib/widgets/common/identity/aves_fab.dart b/lib/widgets/common/identity/aves_fab.dart new file mode 100644 index 0000000..2c943ca --- /dev/null +++ b/lib/widgets/common/identity/aves_fab.dart @@ -0,0 +1,27 @@ +import 'package:aves/theme/icons.dart'; +import 'package:flutter/material.dart'; + +class AvesFab extends StatelessWidget { + final String tooltip; + final VoidCallback onPressed; + + const AvesFab({ + super.key, + required this.tooltip, + required this.onPressed, + }); + + @override + Widget build(BuildContext context) { + return TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: FloatingActionButton( + tooltip: tooltip, + onPressed: onPressed, + child: const Icon(AIcons.apply), + ), + ); + } +} diff --git a/lib/widgets/common/identity/aves_filter_chip.dart b/lib/widgets/common/identity/aves_filter_chip.dart new file mode 100644 index 0000000..d9b18d8 --- /dev/null +++ b/lib/widgets/common/identity/aves_filter_chip.dart @@ -0,0 +1,432 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/covers.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/rating.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/collection/filter_bar.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/basic/gestures/ink_well.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/chip.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +typedef AFilterCallback<T extends CollectionFilter> = void Function(T filter); +typedef OffsetFilterCallback<T extends CollectionFilter> = void Function(BuildContext context, T filter, Offset tapPosition); + +enum HeroType { always, onTap, never } + +@immutable +class AvesFilterDecoration { + final Radius radius; + final Widget widget; + + const AvesFilterDecoration({ + required this.radius, + required this.widget, + }); + + BorderRadius get textBorderRadius => BorderRadius.vertical(bottom: radius); + + BorderRadius get chipBorderRadius => BorderRadius.all(radius); +} + +class AvesFilterChip extends StatefulWidget { + final CollectionFilter filter; + final bool showLeading, showText, allowGenericIcon, useFilterColor; + final AvesFilterDecoration? decoration; + final Color? background; + final String? banner; + final Widget? leadingOverride, details; + final double padding; + final double? maxWidth; + final HeroType heroType; + final AFilterCallback? onTap, onRemove; + final OffsetFilterCallback? onLongPress; + + static const double defaultPadding = 6.0; + static const double defaultRadius = 32; + static const double outlineWidth = 2; + static const double minChipHeight = kMinInteractiveDimension; + static const double minChipWidth = kMinInteractiveDimension; + static const double iconSize = 18; + static const double fontSize = 14; + static const double decoratedContentVerticalPadding = 5; + + const AvesFilterChip({ + super.key, + required this.filter, + this.showLeading = true, + this.showText = true, + this.allowGenericIcon = true, + this.useFilterColor = true, + this.decoration, + this.background, + this.banner, + this.leadingOverride, + this.details, + this.padding = defaultPadding, + this.maxWidth, + this.heroType = HeroType.onTap, + this.onTap, + this.onRemove, + this.onLongPress = showDefaultLongPressMenu, + }); + + static double computeMaxWidthForRow( + BuildContext context, { + required int minChipPerRow, + required double chipPadding, + required double rowPadding, + }) { + final mqWidth = MediaQuery.sizeOf(context).width; + final mqHorizontalPadding = MediaQuery.paddingOf(context).horizontal; + return (mqWidth - mqHorizontalPadding - chipPadding * minChipPerRow - rowPadding) / minChipPerRow; + } + + static Future<void> showDefaultLongPressMenu(BuildContext context, CollectionFilter filter, Offset tapPosition) async { + if (context.read<ValueNotifier<AppMode>>().value.canNavigate) { + // remove focus, if any, to prevent the keyboard from showing up + // after the user is done with the popup menu + FocusManager.instance.primaryFocus?.unfocus(); + + final overlay = Overlay.of(context).context.findRenderObject() as RenderBox; + const touchArea = Size(kMinInteractiveDimension, kMinInteractiveDimension); + final actionDelegate = ChipActionDelegate(); + final animations = context.read<Settings>().accessibilityAnimations; + + final selectedAction = await showMenu<ChipAction>( + context: context, + position: RelativeRect.fromRect(tapPosition & touchArea, Offset.zero & overlay.size), + items: [ + PopupMenuItem( + child: Text(filter.getTooltip(context)), + ), + const PopupMenuDivider(), + ...ChipAction.values.where((action) => actionDelegate.isVisible(action, filter: filter)).map((action) { + late String text; + switch (action) { + case ChipAction.reverse: + text = filter.reversed ? context.l10n.chipActionFilterIn : context.l10n.chipActionFilterOut; + case ChipAction.ratingOrGreater: + text = RatingFilter.formatRatingRange(context, (filter as RatingFilter).rating, RatingFilter.opOrGreater); + case ChipAction.ratingOrLower: + text = RatingFilter.formatRatingRange(context, (filter as RatingFilter).rating, RatingFilter.opOrLower); + default: + text = action.getText(context); + } + return PopupMenuItem( + value: action, + child: FontSizeIconTheme( + child: MenuRow(text: text, icon: action.getIcon()), + ), + ); + }), + ], + popUpAnimationStyle: animations.popUpAnimationStyle, + ); + if (selectedAction != null) { + // wait for the popup menu to hide before proceeding with the action + await Future.delayed(animations.popUpAnimationDelay * timeDilation); + actionDelegate.onActionSelected(context, filter, selectedAction); + } + } + } + + @override + State<AvesFilterChip> createState() => _AvesFilterChipState(); +} + +class _AvesFilterChipState extends State<AvesFilterChip> { + final Set<StreamSubscription> _subscriptions = {}; + late Future<Color> _colorFuture; + late Color _outlineColor; + late bool _tapped; + Offset? _tapPosition; + + CollectionFilter get filter => widget.filter; + + double get padding => widget.padding; + + @override + void initState() { + super.initState(); + _tapped = false; + _subscriptions.add(covers.packageChangeStream.listen(_onCoverColorChanged)); + _subscriptions.add(covers.colorChangeStream.listen(_onCoverColorChanged)); + _subscriptions.add( + settings.updateStream.where((event) => event.key == SettingKeys.themeColorModeKey).listen((_) { + // delay so that contextual colors reflect the new settings + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; + _onCoverColorChanged(null); + }); + }), + ); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _initColorLoader(); + } + + @override + void didUpdateWidget(covariant AvesFilterChip oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.filter != filter) { + _initColorLoader(); + _tapped = false; + } + } + + @override + void dispose() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + super.dispose(); + } + + void _initColorLoader() { + // For app albums, `filter.color` yields a regular async `Future` the first time + // but it yields a `SynchronousFuture` when called again on a known album. + // This works fine to avoid a frame with no Future data, for new widgets. + // However, when the user moves away and back to a page with a chip using the async future, + // the existing widget FutureBuilder cycles again from the start, with a frame in `waiting` state and no data. + // So we save the result of the Future to a local variable because of this specific case. + _colorFuture = filter.color(context); + _outlineColor = context.read<AvesColorsData>().neutral; + } + + void _onCoverColorChanged(Set<CollectionFilter>? event) { + if (event == null || event.contains(filter)) { + _initColorLoader(); + setState(() {}); + } + } + + @override + Widget build(BuildContext context) { + final decoration = widget.decoration; + final chipBackground = widget.background ?? Themes.firstLayerColor(context); + + final onTap = widget.onTap != null + ? () { + WidgetsBinding.instance.addPostFrameCallback((_) => widget.onTap?.call(filter)); + setState(() => _tapped = true); + } + : null; + final onRemove = widget.onRemove != null + ? () { + WidgetsBinding.instance.addPostFrameCallback((_) => widget.onRemove?.call(filter)); + setState(() => _tapped = true); + } + : null; + final onLongPress = widget.onLongPress != null + ? Feedback.wrapForLongPress(() { + if (_tapPosition != null) { + widget.onLongPress?.call(context, filter, _tapPosition!); + } + }, context) + : null; + + Widget? content; + final showLeading = widget.showLeading; + final showText = widget.showText; + if (showLeading || showText) { + final textScaler = MediaQuery.textScalerOf(context); + final iconSize = textScaler.scale(AvesFilterChip.iconSize); + final leading = showLeading ? widget.leadingOverride ?? filter.iconBuilder(context, iconSize, allowGenericIcon: widget.allowGenericIcon) : null; + final trailing = onRemove != null + ? Theme( + data: Theme.of(context).copyWith( + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + child: IconButton( + icon: Icon(AIcons.clear, size: iconSize), + padding: EdgeInsets.zero, + splashRadius: IconTheme.of(context).size, + constraints: const BoxConstraints(), + onPressed: onRemove, + ), + ) + : null; + + content = Row( + mainAxisSize: decoration != null ? MainAxisSize.max : MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ?leading, + if (leading != null && showText) SizedBox(width: padding), + if (showText) + Flexible( + child: Text( + filter.getLabel(context), + style: TextStyle( + fontSize: AvesFilterChip.fontSize, + decoration: filter.reversed ? TextDecoration.lineThrough : null, + decorationThickness: 2, + ), + softWrap: false, + overflow: TextOverflow.fade, + ), + ), + if (trailing != null) ...[ + SizedBox(width: padding), + trailing, + ], + ], + ); + + final details = widget.details; + if (details != null) { + content = Column( + mainAxisSize: MainAxisSize.min, + children: [ + content, + Flexible(child: details), + ], + ); + } + + if (decoration != null) { + content = Align( + alignment: Alignment.bottomCenter, + child: ClipRRect( + borderRadius: decoration.textBorderRadius, + child: Container( + padding: EdgeInsets.symmetric(horizontal: padding * 2, vertical: AvesFilterChip.decoratedContentVerticalPadding), + color: chipBackground, + child: content, + ), + ), + ); + } else { + content = Padding( + padding: EdgeInsets.symmetric(horizontal: padding * 2), + child: content, + ); + } + } + + final borderRadius = decoration?.chipBorderRadius ?? const BorderRadius.all(Radius.circular(AvesFilterChip.defaultRadius)); + final banner = widget.banner; + Widget chip = Container( + constraints: BoxConstraints( + minWidth: AvesFilterChip.minChipWidth, + maxWidth: max( + AvesFilterChip.minChipWidth, + widget.maxWidth ?? + AvesFilterChip.computeMaxWidthForRow( + context, + minChipPerRow: 2, + chipPadding: FilterBar.chipPadding.horizontal, + rowPadding: FilterBar.rowPadding.horizontal, + ), + ), + minHeight: AvesFilterChip.minChipHeight, + ), + child: Stack( + fit: StackFit.passthrough, + children: [ + if (decoration != null) + ClipRRect( + borderRadius: decoration.chipBorderRadius, + child: decoration.widget, + ), + Material( + color: decoration != null ? Colors.transparent : chipBackground, + shape: RoundedRectangleBorder( + borderRadius: borderRadius, + ), + child: AInkResponse( + // as of Flutter v2.8.0, `InkWell` does not have `onLongPressStart` like `GestureDetector`, + // so we get the long press details from the tap instead + onTapDown: onLongPress != null ? (details) => _tapPosition = details.globalPosition : null, + onTap: onTap, + onLongPress: onLongPress, + containedInkWell: true, + highlightShape: BoxShape.rectangle, + borderRadius: borderRadius, + longPressTimeout: settings.longPressTimeout, + child: FutureBuilder<Color>( + future: _colorFuture, + builder: (context, snapshot) { + if (snapshot.hasData) { + _outlineColor = snapshot.data!; + } + return DecoratedBox( + decoration: BoxDecoration( + border: Border.fromBorderSide( + BorderSide( + color: widget.useFilterColor ? _outlineColor : context.select<AvesColorsData, Color>((v) => v.neutral), + width: AvesFilterChip.outlineWidth, + ), + ), + borderRadius: borderRadius, + ), + position: DecorationPosition.foreground, + child: content, + ); + }, + ), + ), + ), + if (banner != null) + LayoutBuilder( + builder: (context, constraints) { + final scale = (constraints.maxHeight / 90 - .4).clamp(.45, 1.0); + return ClipRRect( + borderRadius: borderRadius, + child: Align( + // align to corner the scaled down banner in RTL + alignment: AlignmentDirectional.topStart, + child: Transform( + transform: Matrix4.identity().scaledByDouble(scale, scale, scale, 1), + child: Banner( + message: banner.toUpperCase(), + location: BannerLocation.topStart, + color: Theme.of(context).colorScheme.primary, + child: const SizedBox(), + ), + ), + ), + ); + }, + ), + ], + ), + ); + + final animate = context.select<Settings, bool>((v) => v.animate); + if (animate) { + final heroType = widget.heroType; + if (heroType == HeroType.always || (heroType == HeroType.onTap && _tapped)) { + chip = Hero( + tag: filter, + transitionOnUserGestures: true, + child: MediaQueryDataProvider( + child: DefaultTextStyle( + style: const TextStyle(), + child: chip, + ), + ), + ); + } + } + return chip; + } +} diff --git a/lib/widgets/common/identity/aves_icons.dart b/lib/widgets/common/identity/aves_icons.dart new file mode 100644 index 0000000..3f67d63 --- /dev/null +++ b/lib/widgets/common/identity/aves_icons.dart @@ -0,0 +1,363 @@ +import 'package:aves/image_providers/app_icon_image_provider.dart'; +import 'package:aves/model/covers.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves/widgets/common/grid/theme.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class VideoIcon extends StatelessWidget { + final AvesEntry entry; + + const VideoIcon({ + super.key, + required this.entry, + }); + + @override + Widget build(BuildContext context) { + final gridTheme = context.watch<GridThemeData>(); + final showDuration = gridTheme.showVideoDuration; + Widget child = OverlayIcon( + icon: entry.is360 ? AIcons.sphericalVideo : AIcons.videoPlay, + text: showDuration ? entry.durationText : null, + iconScale: entry.is360 && showDuration ? .9 : 1, + ); + if (showDuration) { + child = DefaultTextStyle( + style: TextStyle( + fontSize: gridTheme.fontSize, + ), + child: child, + ); + } + return child; + } +} + +class AnimatedImageIcon extends StatelessWidget { + const AnimatedImageIcon({super.key}); + + static const scale = .8; + + @override + Widget build(BuildContext context) { + return const OverlayIcon( + icon: AIcons.animated, + iconScale: scale, + ); + } +} + +class GeoTiffIcon extends StatelessWidget { + const GeoTiffIcon({super.key}); + + @override + Widget build(BuildContext context) { + return const OverlayIcon( + icon: AIcons.geo, + ); + } +} + +class HdrIcon extends StatelessWidget { + const HdrIcon({super.key}); + + @override + Widget build(BuildContext context) { + return const OverlayIcon( + icon: AIcons.hdr, + ); + } +} + +class PanoramaIcon extends StatelessWidget { + const PanoramaIcon({super.key}); + + static const scale = .85; + + @override + Widget build(BuildContext context) { + return const OverlayIcon( + icon: AIcons.panorama, + iconScale: scale, + ); + } +} + +class FavouriteIcon extends StatelessWidget { + const FavouriteIcon({super.key}); + + static const scale = .9; + + @override + Widget build(BuildContext context) { + return const OverlayIcon( + icon: AIcons.favourite, + iconScale: scale, + ); + } +} + +class TagIcon extends StatelessWidget { + final IconData icon; + + const TagIcon._private({required this.icon}); + + factory TagIcon.tagged() => const TagIcon._private(icon: AIcons.tag); + + factory TagIcon.untagged() => TagIcon._private(icon: AIcons.tagUntagged); + + static const scale = .9; + + @override + Widget build(BuildContext context) { + return OverlayIcon( + icon: icon, + iconScale: scale, + relativeOffset: const Offset(.05, .05), + ); + } +} + +class LocationIcon extends StatelessWidget { + final IconData icon; + + const LocationIcon._private({required this.icon}); + + factory LocationIcon.located() => const LocationIcon._private(icon: AIcons.location); + + factory LocationIcon.unlocated() => const LocationIcon._private(icon: AIcons.locationUnlocated); + + @override + Widget build(BuildContext context) { + return OverlayIcon( + icon: icon, + ); + } +} + +class RawIcon extends StatelessWidget { + const RawIcon({super.key}); + + @override + Widget build(BuildContext context) { + return const OverlayIcon( + icon: AIcons.raw, + ); + } +} + +class MotionPhotoIcon extends StatelessWidget { + const MotionPhotoIcon({super.key}); + + static const scale = .8; + + @override + Widget build(BuildContext context) { + return const OverlayIcon( + icon: AIcons.motionPhoto, + iconScale: scale, + ); + } +} + +class MultiPageIcon extends StatelessWidget { + final AvesEntry entry; + + static const scale = .8; + + const MultiPageIcon({ + super.key, + required this.entry, + }); + + @override + Widget build(BuildContext context) { + String? text; + if (entry.isStack) { + text = '${entry.stackedEntries?.length}'; + } + final child = OverlayIcon( + icon: AIcons.multiPage, + iconScale: scale, + text: text, + ); + return DefaultTextStyle( + style: TextStyle( + fontSize: context.select<GridThemeData, double>((t) => t.fontSize), + ), + child: child, + ); + } +} + +class RatingIcon extends StatelessWidget { + final AvesEntry entry; + + const RatingIcon({ + super.key, + required this.entry, + }); + + @override + Widget build(BuildContext context) { + return DefaultTextStyle( + style: TextStyle( + fontSize: context.select<GridThemeData, double>((t) => t.fontSize), + ), + child: OverlayIcon( + icon: AIcons.rating, + text: '${entry.rating}', + ), + ); + } +} + +class TrashIcon extends StatelessWidget { + final int? trashDaysLeft; + + const TrashIcon({ + super.key, + required this.trashDaysLeft, + }); + + @override + Widget build(BuildContext context) { + final child = OverlayIcon( + icon: AIcons.bin, + text: trashDaysLeft != null ? context.l10n.timeDays(trashDaysLeft!) : null, + ); + + return DefaultTextStyle( + style: TextStyle( + fontSize: context.select<GridThemeData, double>((t) => t.fontSize), + ), + child: child, + ); + } +} + +class OverlayIcon extends StatelessWidget { + final IconData icon; + final String? text; + final double iconScale; + final EdgeInsetsGeometry margin; + final Offset? relativeOffset; + + static const defaultMargin = EdgeInsets.only(left: 1, right: 1, bottom: 1); + + const OverlayIcon({ + super.key, + required this.icon, + this.iconScale = 1, + this.text, + // default margin for multiple icons in a `Column` + this.margin = defaultMargin, + this.relativeOffset, + }); + + @override + Widget build(BuildContext context) { + final size = context.select<GridThemeData, double>((t) => t.iconSize); + Widget iconChild = Icon( + icon, + size: size, + ); + + if (relativeOffset != null) { + iconChild = FractionalTranslation( + translation: relativeOffset!, + child: iconChild, + ); + } + + if (iconScale != 1) { + // using a transform is better than modifying the icon size to properly center the scaled icon + iconChild = Transform.scale( + scale: iconScale, + child: iconChild, + ); + } + + iconChild = SizedBox( + width: size, + height: size, + child: iconChild, + ); + + return Container( + margin: margin, + padding: text != null ? EdgeInsetsDirectional.only(end: size / 4) : null, + decoration: BoxDecoration( + color: Theme.of(context).isDark ? const Color(0xAA000000) : const Color(0xCCFFFFFF), + borderRadius: BorderRadius.all(Radius.circular(size)), + ), + child: text == null + ? iconChild + : Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + iconChild, + const SizedBox(width: 2), + Flexible( + child: Text( + text!, + // consistent with the color used for the icon next to it + style: TextStyle(color: IconTheme.of(context).color), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ), + ], + ), + ); + } +} + +class IconUtils { + static Widget? getAlbumIcon({ + required BuildContext context, + required String albumPath, + double? size, + }) { + size ??= IconTheme.of(context).size; + Widget buildIcon(IconData icon) => Icon(icon, size: size); + + switch (covers.effectiveAlbumType(albumPath)) { + case AlbumType.camera: + return buildIcon(AIcons.cameraAlbum); + case AlbumType.screenshots: + case AlbumType.videoCaptures: + return buildIcon(AIcons.screenshotAlbum); + case AlbumType.screenRecordings: + return buildIcon(AIcons.recordingAlbum); + case AlbumType.download: + return buildIcon(AIcons.downloadAlbum); + case AlbumType.app: + final package = covers.effectiveAlbumPackage(albumPath); + return package != null + ? Image( + image: AppIconImage( + packageName: package, + size: size!, + ), + width: size, + height: size, + ) + : null; + case AlbumType.vault: + return buildIcon(vaults.isLocked(albumPath) ? AIcons.locked : AIcons.unlocked); + case AlbumType.regular: + return null; + } + } +} diff --git a/lib/widgets/common/identity/aves_logo.dart b/lib/widgets/common/identity/aves_logo.dart new file mode 100644 index 0000000..177ccd0 --- /dev/null +++ b/lib/widgets/common/identity/aves_logo.dart @@ -0,0 +1,152 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:aves/widgets/common/fx/colors.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class AvesLogo extends StatelessWidget { + final double size; + + const AvesLogo({ + super.key, + required this.size, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + Widget child = CustomPaint( + size: Size(size / 1.4, size / 1.4), + painter: AvesLogoPainter(), + ); + if (context.select<Settings, bool>((v) => v.themeColorMode == AvesThemeColorMode.monochrome)) { + final tint = Color.lerp(theme.colorScheme.primary, Colors.white, .5)!; + child = ColorFiltered( + colorFilter: ColorFilter.mode(tint, BlendMode.modulate), + child: ColorFiltered( + colorFilter: MatrixColorFilters.greyscale, + child: child, + ), + ); + } + + return CircleAvatar( + backgroundColor: theme.dividerColor, + radius: size / 2, + child: CircleAvatar( + backgroundColor: Colors.white, + radius: size / 2 - AvesBorder.curvedBorderWidth(context), + child: child, + ), + ); + } +} + +class AvesLogoPainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final dim = size.width / 100; + final strokePaint = Paint() + ..style = PaintingStyle.stroke + ..color = Colors.black + ..strokeWidth = dim * 3.050970 + ..strokeCap = StrokeCap.round + ..strokeJoin = StrokeJoin.round; + + final path0 = Path(); + path0.moveTo(31.784 * dim, 63.612 * dim); + path0.lineTo(48.252 * dim, 80.08 * dim); + final radius = Radius.elliptical(2.911 * dim, 2.911 * dim); + path0.arcToPoint(Offset(48.252 * dim, 84.196 * dim), radius: radius, rotation: 0, largeArc: false, clockwise: true); + path0.lineTo(40.379000000000005 * dim, 92.069 * dim); + path0.arcToPoint(Offset(19.072000000000006 * dim, 92.069 * dim), radius: Radius.elliptical(15.067 * dim, 15.067 * dim), rotation: 0, largeArc: false, clockwise: true); + path0.lineTo(11.2 * dim, 84.197 * dim); + path0.arcToPoint(Offset(11.2 * dim, 80.08 * dim), radius: radius, rotation: 0, largeArc: false, clockwise: true); + path0.lineTo(27.668 * dim, 63.611999999999995 * dim); + path0.arcToPoint(Offset(31.785 * dim, 63.611999999999995 * dim), radius: radius, rotation: 0, largeArc: false, clockwise: true); + path0.close(); + + final path1 = Path(); + path1.moveTo(56.368 * dim, 39.026 * dim); + path1.lineTo(72.837 * dim, 55.494 * dim); + final radius2 = Radius.elliptical(2.904 * dim, 2.904 * dim); + path1.arcToPoint(Offset(72.837 * dim, 59.611 * dim), radius: radius2, rotation: 0, largeArc: false, clockwise: true); + path1.lineTo(56.367000000000004 * dim, 76.079 * dim); + path1.arcToPoint(Offset(52.252 * dim, 76.079 * dim), radius: radius2, rotation: 0, largeArc: false, clockwise: true); + path1.lineTo(35.784 * dim, 59.611 * dim); + path1.arcToPoint(Offset(35.784 * dim, 55.495 * dim), radius: radius2, rotation: 0, largeArc: false, clockwise: true); + path1.lineTo(52.251999999999995 * dim, 39.027 * dim); + path1.arcToPoint(Offset(56.367999999999995 * dim, 39.027 * dim), radius: radius2, rotation: 0, largeArc: false, clockwise: true); + path1.close(); + + final path2 = Path(); + path2.moveTo(60.37 * dim, 30.908 * dim); + final radius4 = Radius.elliptical(2.91 * dim, 2.91 * dim); + path2.arcToPoint(Offset(60.37 * dim, 35.025 * dim), radius: radius4, rotation: 0, largeArc: false, clockwise: false); + path2.lineTo(76.838 * dim, 51.492 * dim); + path2.arcToPoint(Offset(80.954 * dim, 51.492 * dim), radius: radius4, rotation: 0, largeArc: false, clockwise: false); + path2.lineTo(97.422 * dim, 35.025 * dim); + path2.arcToPoint(Offset(97.422 * dim, 30.907999999999998 * dim), radius: radius4, rotation: 0, largeArc: false, clockwise: false); + path2.lineTo(89.24799999999999 * dim, 22.733999999999998 * dim); + path2.arcToPoint(Offset(68.54399999999998 * dim, 22.733999999999998 * dim), radius: Radius.elliptical(14.64 * dim, 14.64 * dim), rotation: 0, largeArc: false, clockwise: false); + path2.close(); + path2.moveTo(76.624 * dim, 30.695 * dim); + final radius5 = Radius.elliptical(3.213 * dim, 3.213 * dim); + path2.arcToPoint(Offset(81.167 * dim, 30.695 * dim), radius: radius5, rotation: 0, largeArc: false, clockwise: true); + path2.arcToPoint(Offset(81.167 * dim, 35.237 * dim), radius: radius5, rotation: 0, largeArc: false, clockwise: true); + path2.arcToPoint(Offset(76.624 * dim, 35.237 * dim), radius: radius5, rotation: 0, largeArc: false, clockwise: true); + path2.arcToPoint(Offset(76.624 * dim, 30.694000000000003 * dim), radius: radius5, rotation: 0, largeArc: false, clockwise: true); + path2.close(); + + final path3 = Path(); + path3.moveTo(24.305 * dim, 6.96 * dim); + path3.lineTo(48.35 * dim, 31.004 * dim); + path3.arcToPoint(Offset(48.35 * dim, 35.121 * dim), radius: radius, rotation: 0, largeArc: false, clockwise: true); + path3.lineTo(31.882 * dim, 51.588 * dim); + path3.arcToPoint(Offset(27.765 * dim, 51.588 * dim), radius: radius, rotation: 0, largeArc: false, clockwise: true); + path3.lineTo(17.084 * dim, 40.907 * dim); + path3.arcToPoint(Offset(17.084 * dim, 8.75 * dim), radius: Radius.elliptical(22.738 * dim, 22.738 * dim), rotation: 0, largeArc: false, clockwise: true); + path3.lineTo(18.874 * dim, 6.96 * dim); + path3.arcToPoint(Offset(24.305 * dim, 6.96 * dim), radius: Radius.elliptical(3.84 * dim, 3.84 * dim), rotation: 0, largeArc: false, clockwise: true); + path3.close(); + + canvas.drawPath( + path0, + Paint() + ..style = PaintingStyle.fill + ..color = const Color(0xffef435a), + ); + + canvas.drawPath( + path1, + Paint() + ..style = PaintingStyle.fill + ..color = const Color(0xffe0e0e0), + ); + + canvas.drawPath( + path2, + Paint() + ..style = PaintingStyle.fill + ..color = const Color(0xffffc11f), + ); + + canvas.drawPath( + path3, + Paint() + ..style = PaintingStyle.fill + ..color = const Color(0xff1cc8eb), + ); + + // stroke should be painted over fill + canvas.drawPath(path0, strokePaint); + canvas.drawPath(path1, strokePaint); + canvas.drawPath(path2, strokePaint); + canvas.drawPath(path3, strokePaint); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => true; +} diff --git a/lib/widgets/common/identity/buttons/captioned_button.dart b/lib/widgets/common/identity/buttons/captioned_button.dart new file mode 100644 index 0000000..4c4a212 --- /dev/null +++ b/lib/widgets/common/identity/buttons/captioned_button.dart @@ -0,0 +1,184 @@ +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +typedef CaptionedIconButtonBuilder = Widget Function(BuildContext context, FocusNode focusNode); + +class CaptionedButton extends StatefulWidget { + final Animation<double> scale; + final Widget captionText; + final CaptionedIconButtonBuilder iconButtonBuilder; + final bool autofocus, showCaption; + final VoidCallback? onPressed; + + static const EdgeInsets padding = EdgeInsets.symmetric(horizontal: 8); + static const double iconTextPadding = 8; + + CaptionedButton({ + super.key, + this.scale = kAlwaysCompleteAnimation, + Widget? icon, + CaptionedIconButtonBuilder? iconButtonBuilder, + String? caption, + Widget? captionText, + this.autofocus = false, + this.showCaption = true, + required this.onPressed, + }) : assert(icon != null || iconButtonBuilder != null), + assert(caption != null || captionText != null), + iconButtonBuilder = iconButtonBuilder ?? ((_, focusNode) => IconButton(icon: icon!, onPressed: onPressed, focusNode: focusNode)), + captionText = captionText ?? CaptionedButtonText(text: caption!, enabled: onPressed != null); + + @override + State<CaptionedButton> createState() => _CaptionedButtonState(); + + static double getWidth(BuildContext context) => OverlayButton.getSize(context) + padding.horizontal; + + static Size getSize(BuildContext context, String text, {required bool showCaption}) { + final width = getWidth(context); + var height = width; + if (showCaption) { + final paragraph = RenderParagraph( + TextSpan(text: text, style: CaptionedButtonText._textStyle(context)), + textDirection: TextDirection.ltr, + textScaler: MediaQuery.textScalerOf(context), + maxLines: CaptionedButtonText.maxLines, + )..layout(const BoxConstraints(), parentUsesSize: true); + height += paragraph.getMaxIntrinsicHeight(width) + padding.vertical; + paragraph.dispose(); + } + return Size(width, height); + } + + static double getTelevisionButtonHeight(BuildContext context) { + final text = 'whatever' * 42; + return CaptionedButton.getSize(context, text, showCaption: true).height; + } +} + +class _CaptionedButtonState extends State<CaptionedButton> { + final FocusNode _focusNode = FocusNode(); + final ValueNotifier<bool> _focusedNotifier = ValueNotifier(false); + bool _didAutofocus = false; + + @override + void initState() { + super.initState(); + _updateTraversal(); + _focusNode.addListener(_onFocusChanged); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _handleAutofocus(); + } + + @override + void didUpdateWidget(covariant CaptionedButton oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.onPressed != widget.onPressed) { + _updateTraversal(); + } + if (oldWidget.autofocus != widget.autofocus) { + _handleAutofocus(); + } + } + + @override + void dispose() { + _focusNode.dispose(); + _focusedNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + width: CaptionedButton.getWidth(context), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox(height: CaptionedButton.padding.top), + OverlayButton( + scale: widget.scale, + focusNode: _focusNode, + child: widget.iconButtonBuilder(context, _focusNode), + ), + if (widget.showCaption) ...[ + const SizedBox(height: CaptionedButton.iconTextPadding), + ScaleTransition( + scale: widget.scale, + child: ValueListenableBuilder<bool>( + valueListenable: _focusedNotifier, + builder: (context, focused, child) { + final style = CaptionedButtonText._textStyle(context); + return AnimatedDefaultTextStyle( + style: focused + ? style.copyWith( + color: Theme.of(context).colorScheme.primary, + ) + : style, + duration: const Duration(milliseconds: 200), + child: widget.captionText, + ); + }, + ), + ), + ], + SizedBox(height: CaptionedButton.padding.bottom), + ], + ), + ); + } + + void _handleAutofocus() { + if (!_didAutofocus && widget.autofocus) { + FocusScope.of(context).autofocus(_focusNode); + _didAutofocus = true; + } + } + + void _onFocusChanged() => _focusedNotifier.value = _focusNode.hasFocus; + + void _updateTraversal() { + final enabled = widget.onPressed != null; + _focusNode.skipTraversal = !enabled; + _focusNode.canRequestFocus = enabled; + } +} + +class CaptionedButtonText extends StatelessWidget { + final String text; + final bool enabled; + + static const int maxLines = 2; + + const CaptionedButtonText({ + super.key, + required this.text, + required this.enabled, + }); + + @override + Widget build(BuildContext context) { + var style = DefaultTextStyle.of(context).style; + if (!enabled) { + style = style.copyWith(color: style.color!.withValues(alpha: .2)); + } + + return Text( + text, + style: style, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + maxLines: maxLines, + ); + } + + static TextStyle _textStyle(BuildContext context) { + // specify `height` for accurate paragraph height measurement + final defaultTextHeight = DefaultTextStyle.of(context).style.height; + return Theme.of(context).textTheme.bodySmall!.copyWith(height: defaultTextHeight); + } +} diff --git a/lib/widgets/common/identity/buttons/outlined_button.dart b/lib/widgets/common/identity/buttons/outlined_button.dart new file mode 100644 index 0000000..851ef93 --- /dev/null +++ b/lib/widgets/common/identity/buttons/outlined_button.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; + +class AvesOutlinedButton extends StatelessWidget { + final Widget? icon; + final String label; + final VoidCallback? onPressed; + + const AvesOutlinedButton({ + super.key, + this.icon, + required this.label, + required this.onPressed, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final foreground = WidgetStateProperty.resolveWith<Color>((states) { + return states.contains(WidgetState.disabled) ? theme.disabledColor : theme.colorScheme.onSurface; + }); + final style = ButtonStyle( + foregroundColor: foreground, + iconColor: foreground, + side: WidgetStateProperty.resolveWith<BorderSide>((states) { + return BorderSide( + color: states.contains(WidgetState.disabled) ? theme.disabledColor : theme.colorScheme.primary, + ); + }), + ); + return icon != null + ? OutlinedButton.icon( + onPressed: onPressed, + style: style, + icon: icon!, + label: Text(label), + ) + : OutlinedButton( + onPressed: onPressed, + style: style, + child: Text(label), + ); + } +} diff --git a/lib/widgets/common/identity/buttons/overlay_button.dart b/lib/widgets/common/identity/buttons/overlay_button.dart new file mode 100644 index 0000000..1310dd7 --- /dev/null +++ b/lib/widgets/common/identity/buttons/overlay_button.dart @@ -0,0 +1,193 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves/widgets/common/fx/blurred.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:flutter/material.dart'; + +class OverlayButton extends StatefulWidget { + final Animation<double> scale; + final BorderRadius? borderRadius; + final FocusNode? focusNode; + final Widget child; + + const OverlayButton({ + super.key, + this.scale = kAlwaysCompleteAnimation, + this.borderRadius, + this.focusNode, + required this.child, + }); + + @override + State<OverlayButton> createState() => _OverlayButtonState(); + + // icon (24) + icon padding (8) + button padding (16) + static double getSize(BuildContext context) => 48; +} + +class _OverlayButtonState extends State<OverlayButton> { + final ValueNotifier<bool> _focusedNotifier = ValueNotifier(false); + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant OverlayButton oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + _focusedNotifier.dispose(); + super.dispose(); + } + + void _registerWidget(OverlayButton widget) { + widget.focusNode?.addListener(_onFocusChanged); + } + + void _unregisterWidget(OverlayButton widget) { + widget.focusNode?.removeListener(_onFocusChanged); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final colorScheme = theme.colorScheme; + final borderRadius = widget.borderRadius; + + final blurred = settings.enableBlurEffect; + final overlayBackground = Themes.overlayBackgroundColor( + brightness: colorScheme.brightness, + blurred: blurred, + ); + + return Theme( + data: theme.copyWith( + colorScheme: colorScheme.copyWith( + onSurfaceVariant: colorScheme.onSurface, + ), + ), + child: ScaleTransition( + scale: widget.scale, + child: ValueListenableBuilder<bool>( + valueListenable: _focusedNotifier, + builder: (context, focused, child) { + final border = AvesBorder.border( + context, + width: AvesBorder.curvedBorderWidth(context) * (focused ? 3 : 1), + ); + return borderRadius != null + ? BlurredRRect( + enabled: blurred, + borderRadius: borderRadius, + child: Material( + type: MaterialType.button, + borderRadius: borderRadius, + color: overlayBackground, + child: AnimatedContainer( + foregroundDecoration: BoxDecoration( + border: border, + borderRadius: borderRadius, + ), + duration: const Duration(milliseconds: 200), + child: widget.child, + ), + ), + ) + : BlurredOval( + enabled: blurred, + child: Material( + type: MaterialType.circle, + color: overlayBackground, + child: AnimatedContainer( + foregroundDecoration: BoxDecoration( + border: border, + shape: BoxShape.circle, + ), + duration: const Duration(milliseconds: 200), + child: widget.child, + ), + ), + ); + }, + ), + ), + ); + } + + void _onFocusChanged() => _focusedNotifier.value = widget.focusNode?.hasFocus ?? false; +} + +class ScalingOverlayTextButton extends StatelessWidget { + final Animation<double> scale; + final VoidCallback? onPressed; + final Widget child; + + const ScalingOverlayTextButton({ + super.key, + required this.scale, + this.onPressed, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return SizeTransition( + sizeFactor: scale, + child: OverlayTextButton( + onPressed: onPressed, + child: child, + ), + ); + } +} + +class OverlayTextButton extends StatelessWidget { + final VoidCallback? onPressed; + final Widget child; + + const OverlayTextButton({ + super.key, + this.onPressed, + required this.child, + }); + + static const _borderRadius = 123.0; + static final _minSize = WidgetStateProperty.all<Size>(const Size(kMinInteractiveDimension, kMinInteractiveDimension)); + + @override + Widget build(BuildContext context) { + final blurred = settings.enableBlurEffect; + final theme = Theme.of(context); + final foreground = theme.colorScheme.onSurface; + return BlurredRRect.all( + enabled: blurred, + borderRadius: _borderRadius, + child: OutlinedButton( + onPressed: onPressed, + style: ButtonStyle( + backgroundColor: WidgetStateProperty.all<Color>(Themes.overlayBackgroundColor(brightness: theme.brightness, blurred: blurred)), + foregroundColor: WidgetStateProperty.all<Color>(foreground), + overlayColor: theme.isDark ? WidgetStateProperty.all<Color>(Colors.white.withValues(alpha: .12)) : null, + minimumSize: _minSize, + iconColor: WidgetStateProperty.all<Color>(foreground), + side: WidgetStateProperty.all<BorderSide>(AvesBorder.curvedSide(context)), + shape: WidgetStateProperty.all<OutlinedBorder>( + const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(_borderRadius)), + ), + ), + ), + child: child, + ), + ); + } +} diff --git a/lib/widgets/common/identity/empty.dart b/lib/widgets/common/identity/empty.dart new file mode 100644 index 0000000..abd5b44 --- /dev/null +++ b/lib/widgets/common/identity/empty.dart @@ -0,0 +1,74 @@ +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:provider/provider.dart'; + +class EmptyContent extends StatelessWidget { + final IconData? icon; + final String text; + final Widget? bottom; + final AlignmentGeometry alignment; + final double fontSize; + final bool safeBottom; + + const EmptyContent({ + super.key, + this.icon, + required this.text, + this.bottom, + this.alignment = const FractionalOffset(.5, .35), + this.fontSize = 22, + this.safeBottom = true, + }); + + @override + Widget build(BuildContext context) { + final color = Theme.of(context).colorScheme.primary.withValues(alpha: .5); + final durations = context.watch<DurationsData>(); + return Padding( + padding: safeBottom + ? EdgeInsets.only( + bottom: context.select<MediaQueryData, double>((mq) => mq.effectiveBottomPadding), + ) + : EdgeInsets.zero, + child: Align( + alignment: alignment, + child: Column( + mainAxisSize: MainAxisSize.min, + children: AnimationConfiguration.toStaggeredList( + duration: durations.staggeredAnimation, + delay: durations.staggeredAnimationDelay * timeDilation, + childAnimationBuilder: (child) => SlideAnimation( + verticalOffset: 50.0, + child: FadeInAnimation( + child: child, + ), + ), + children: [ + if (icon != null) ...[ + Icon( + icon, + size: 64, + color: color, + ), + const SizedBox(height: 16), + ], + if (text.isNotEmpty) + Text( + text, + style: TextStyle( + color: color, + fontSize: fontSize, + ), + textAlign: TextAlign.center, + ), + ?bottom, + ], + ), + ), + ), + ); + } +} diff --git a/lib/widgets/common/identity/highlight_title.dart b/lib/widgets/common/identity/highlight_title.dart new file mode 100644 index 0000000..75c43b1 --- /dev/null +++ b/lib/widgets/common/identity/highlight_title.dart @@ -0,0 +1,74 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/ref/locales.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/basic/text/outlined.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves/widgets/common/fx/highlight_decoration.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class HighlightTitle extends StatelessWidget { + final String title; + final Color? color; + final double fontSize; + final bool enabled; + final bool showHighlight; + + const HighlightTitle({ + super.key, + required this.title, + this.color, + this.fontSize = 18, + this.enabled = true, + this.showHighlight = true, + }); + + static const disabledColor = Colors.grey; + + static List<Shadow> shadows(BuildContext context) => [ + Shadow( + color: Theme.of(context).isDark ? Colors.black : Colors.white, + offset: const Offset(0, 1), + blurRadius: 2, + ), + ]; + + @override + Widget build(BuildContext context) { + final style = TextStyle( + shadows: shadows(context), + fontSize: fontSize, + letterSpacing: canHaveLetterSpacing(context.locale) ? 1 : 0, + fontFeatures: const [FontFeature.enable('smcp')], + ); + + final colors = context.watch<AvesColorsData>(); + return Align( + alignment: AlignmentDirectional.centerStart, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 2), + decoration: showHighlight && context.select<Settings, bool>((v) => v.themeColorMode == AvesThemeColorMode.polychrome) + ? HighlightDecoration( + color: enabled ? color ?? colors.fromString(title) : disabledColor, + ) + : null, + margin: const EdgeInsets.symmetric(vertical: 4.0), + child: OutlinedText( + textSpans: [ + TextSpan( + text: title, + style: style, + ), + ], + outlineColor: Themes.firstLayerColor(context), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ), + ); + } +} diff --git a/lib/widgets/common/identity/scroll_thumb.dart b/lib/widgets/common/identity/scroll_thumb.dart new file mode 100644 index 0000000..718abf2 --- /dev/null +++ b/lib/widgets/common/identity/scroll_thumb.dart @@ -0,0 +1,47 @@ +import 'package:aves/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/scrollbar.dart'; +import 'package:flutter/material.dart'; + +const double avesScrollThumbHeight = 48; + +// height and background color do not change +// so we do not rely on the builder props +ScrollThumbBuilder avesScrollThumbBuilder({ + required double height, + required Color backgroundColor, +}) { + final scrollThumb = Container( + decoration: const BoxDecoration( + color: Colors.black26, + borderRadius: BorderRadius.all(Radius.circular(12)), + ), + height: height, + margin: _margin, + padding: _padding, + child: ClipPath( + clipper: ArrowClipper(), + child: Container( + width: _width, + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: const BorderRadius.all(Radius.circular(12)), + ), + ), + ), + ); + return (backgroundColor, thumbAnimation, labelAnimation, height, {labelText}) { + return DraggableScrollbar.buildScrollThumbAndLabel( + scrollThumb: scrollThumb, + backgroundColor: backgroundColor, + thumbAnimation: thumbAnimation, + labelAnimation: labelAnimation, + labelText: labelText, + ); + }; +} + +const _margin = EdgeInsetsDirectional.only(end: 1); +const _padding = EdgeInsets.all(2); +const _width = 20.0; + +double get avesScrollThumbWidth => _width + _padding.horizontal + _margin.horizontal; diff --git a/lib/widgets/common/map/attribution.dart b/lib/widgets/common/map/attribution.dart new file mode 100644 index 0000000..1031779 --- /dev/null +++ b/lib/widgets/common/map/attribution.dart @@ -0,0 +1,67 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_markdown_plus/flutter_markdown_plus.dart'; +import 'package:provider/provider.dart'; + +class Attribution extends StatelessWidget { + final EntryMapStyle? style; + + const Attribution({ + super.key, + required this.style, + }); + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + if (style == EntryMapStyles.osmLiberty) return _buildOsmAttributionMarkdown(context, l10n.mapAttributionOsmLiberty); + if (style == EntryMapStyles.openTopoMap) return _buildOsmAttributionMarkdown(context, l10n.mapAttributionOpenTopoMap); + if (style == EntryMapStyles.osmHot) return _buildOsmAttributionMarkdown(context, l10n.mapAttributionOsmHot); + if (style == EntryMapStyles.stamenWatercolor) return _buildOsmAttributionMarkdown(context, l10n.mapAttributionStamen); + return const SizedBox(); + } + + Widget _buildOsmAttributionMarkdown(BuildContext context, String data) { + final theme = Theme.of(context); + Widget child = MarkdownBody( + data: '${context.l10n.mapAttributionOsmData}${AText.separator}$data', + selectable: true, + styleSheet: MarkdownStyleSheet( + a: TextStyle(color: theme.colorScheme.primary), + p: theme.textTheme.bodySmall!.merge(const TextStyle(fontSize: InfoRowGroup.fontSize)), + ), + onTapLink: (text, href, title) => AvesApp.launchUrl(href), + ); + + final animate = context.select<Settings, bool>((v) => v.animate); + if (animate) { + child = Hero( + tag: 'map-attribution', + flightShuttleBuilder: (flightContext, animation, flightDirection, fromHeroContext, toHeroContext) { + return DefaultTextStyle( + style: DefaultTextStyle.of(toHeroContext).style, + child: MediaQuery.removeViewPadding( + context: context, + removeLeft: true, + removeTop: true, + removeRight: true, + removeBottom: true, + child: toHeroContext.widget, + ), + ); + }, + child: child, + ); + } + + return Padding( + padding: const EdgeInsets.only(top: 4), + child: child, + ); + } +} diff --git a/lib/widgets/common/map/buttons/button.dart b/lib/widgets/common/map/buttons/button.dart new file mode 100644 index 0000000..0d3f6da --- /dev/null +++ b/lib/widgets/common/map/buttons/button.dart @@ -0,0 +1,48 @@ +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class MapOverlayButton extends StatelessWidget { + final ValueWidgetBuilder<VisualDensity> builder; + + const MapOverlayButton({ + super.key, + required this.builder, + }); + + factory MapOverlayButton.icon({ + Key? buttonKey, + required Widget icon, + required String tooltip, + VoidCallback? onPressed, + }) { + return MapOverlayButton( + builder: (context, visualDensity, child) => IconButton( + key: buttonKey, + iconSize: iconSize(visualDensity), + visualDensity: visualDensity, + icon: icon, + onPressed: onPressed, + tooltip: tooltip, + ), + ); + } + + @override + Widget build(BuildContext context) { + return Selector<MapThemeData, Animation<double>>( + selector: (context, v) => v.scale, + builder: (context, scale, child) => OverlayButton( + scale: scale, + child: child!, + ), + child: Selector<MapThemeData, VisualDensity>( + selector: (context, v) => v.visualDensity, + builder: builder, + ), + ); + } + + static double iconSize(VisualDensity visualDensity) => 20 + 1.5 * visualDensity.horizontal; +} diff --git a/lib/widgets/common/map/buttons/coordinate_filter.dart b/lib/widgets/common/map/buttons/coordinate_filter.dart new file mode 100644 index 0000000..80405f3 --- /dev/null +++ b/lib/widgets/common/map/buttons/coordinate_filter.dart @@ -0,0 +1,108 @@ +import 'package:aves/model/filters/coordinate.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/utils/debouncer.dart'; +import 'package:aves/widgets/common/fx/blurred.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class OverlayCoordinateFilterChip extends StatefulWidget { + final ValueNotifier<ZoomedBounds> boundsNotifier; + final double padding; + + const OverlayCoordinateFilterChip({ + super.key, + required this.boundsNotifier, + required this.padding, + }); + + @override + State<OverlayCoordinateFilterChip> createState() => _OverlayCoordinateFilterChipState(); +} + +class _OverlayCoordinateFilterChipState extends State<OverlayCoordinateFilterChip> { + final Debouncer _debouncer = Debouncer(delay: ADurations.mapInfoDebounceDelay); + final ValueNotifier<ZoomedBounds?> _idleBoundsNotifier = ValueNotifier(null); + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant OverlayCoordinateFilterChip oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + _idleBoundsNotifier.dispose(); + super.dispose(); + } + + void _registerWidget(OverlayCoordinateFilterChip widget) { + widget.boundsNotifier.addListener(_onBoundsChanged); + } + + void _unregisterWidget(OverlayCoordinateFilterChip widget) { + widget.boundsNotifier.removeListener(_onBoundsChanged); + } + + @override + Widget build(BuildContext context) { + final blurred = settings.enableBlurEffect; + final theme = Theme.of(context); + return Align( + alignment: Alignment.topLeft, + child: Selector<MapThemeData, Animation<double>>( + selector: (context, v) => v.scale, + builder: (context, scale, child) => SizeTransition( + sizeFactor: scale, + axisAlignment: 1, + child: FadeTransition( + opacity: scale, + child: child, + ), + ), + child: ValueListenableBuilder<ZoomedBounds?>( + valueListenable: _idleBoundsNotifier, + builder: (context, bounds, child) { + if (bounds == null) return const SizedBox(); + final filter = CoordinateFilter( + bounds.sw, + bounds.ne, + // more stable format when bounds change + minuteSecondPadding: true, + ); + return Padding( + padding: EdgeInsets.all(widget.padding), + child: BlurredRRect.all( + enabled: blurred, + borderRadius: AvesFilterChip.defaultRadius, + child: AvesFilterChip( + filter: filter, + useFilterColor: false, + background: Themes.overlayBackgroundColor(brightness: theme.brightness, blurred: blurred), + maxWidth: double.infinity, + onTap: (filter) => SelectFilterNotification(CoordinateFilter(bounds.sw, bounds.ne)).dispatch(context), + ), + ), + ); + }, + ), + ), + ); + } + + void _onBoundsChanged() { + _debouncer(() => _idleBoundsNotifier.value = widget.boundsNotifier.value); + } +} diff --git a/lib/widgets/common/map/buttons/panel.dart b/lib/widgets/common/map/buttons/panel.dart new file mode 100644 index 0000000..d693a8c --- /dev/null +++ b/lib/widgets/common/map/buttons/panel.dart @@ -0,0 +1,268 @@ +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/map/buttons/button.dart'; +import 'package:aves/widgets/common/map/buttons/coordinate_filter.dart'; +import 'package:aves/widgets/common/map/compass.dart'; +import 'package:aves/widgets/common/map/map_action_delegate.dart'; +import 'package:aves/widgets/common/providers/map_theme_provider.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter/services.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:provider/provider.dart'; + +class MapButtonPanel extends StatefulWidget { + final AvesMapController controller; + final ValueNotifier<ZoomedBounds> boundsNotifier; + final void Function(BuildContext context)? openMapPage; + + const MapButtonPanel({ + super.key, + required this.controller, + required this.boundsNotifier, + this.openMapPage, + }); + + @override + State<MapButtonPanel> createState() => _MapButtonPanelState(); +} + +class _MapButtonPanelState extends State<MapButtonPanel> { + late MapActionDelegate _actionDelegate; + + @override + void initState() { + super.initState(); + _updateDelegate(); + } + + @override + void didUpdateWidget(covariant MapButtonPanel oldWidget) { + super.didUpdateWidget(oldWidget); + _updateDelegate(); + } + + void _updateDelegate() => _actionDelegate = MapActionDelegate(widget.controller); + + @override + Widget build(BuildContext context) { + final showCoordinateFilter = context.select<MapThemeData, bool>((v) => v.showCoordinateFilter); + final visualDensity = context.select<MapThemeData, VisualDensity>((v) => v.visualDensity); + final double padding = 8 + visualDensity.horizontal * 2; + + Widget? topLeftButton = _buildNavigationButton(context); + Widget? topRightButton = _buildTopRightButton(context); + + return Positioned.fill( + child: TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: SafeArea( + bottom: false, + child: Stack( + children: [ + Positioned( + left: padding, + right: padding, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(top: padding), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (topLeftButton != null) ...[ + topLeftButton, + SizedBox(height: padding), + ], + _buildCompass(context), + ], + ), + ), + showCoordinateFilter + ? Expanded( + child: OverlayCoordinateFilterChip( + boundsNotifier: widget.boundsNotifier, + padding: padding, + ), + ) + : const Spacer(), + Padding( + padding: EdgeInsets.only(top: padding), + // key is expected by test driver + child: Column( + children: [ + if (topRightButton != null) ...[ + topRightButton, + SizedBox(height: padding), + ], + // key is expected by test driver + _buildActionButton(context, MapAction.selectStyle, buttonKey: const Key('map-menu-layers')), + ], + ), + ), + ], + ), + ), + Positioned( + right: padding, + bottom: padding, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildActionButton(context, MapAction.zoomIn), + SizedBox(height: padding), + _buildActionButton(context, MapAction.zoomOut), + ], + ), + ), + ], + ), + ), + ), + ); + } + + Widget? _buildNavigationButton(BuildContext context) { + Widget? child; + switch (context.select<MapThemeData, MapNavigationButton>((v) => v.navigationButton)) { + case MapNavigationButton.back: + if (!settings.useTvLayout) { + child = MapOverlayButton.icon( + icon: const BackButtonIcon(), + onPressed: () => Navigator.maybeOf(context)?.pop(), + tooltip: MaterialLocalizations.of(context).backButtonTooltip, + ); + } + case MapNavigationButton.close: + child = MapOverlayButton.icon( + icon: const CloseButtonIcon(), + onPressed: SystemNavigator.pop, + tooltip: MaterialLocalizations.of(context).closeButtonTooltip, + ); + case MapNavigationButton.map: + final _openMapPage = widget.openMapPage; + if (_openMapPage != null) { + child = MapOverlayButton.icon( + icon: const Icon(AIcons.showFullscreenCorners), + onPressed: () => _openMapPage.call(context), + tooltip: context.l10n.openMapPageTooltip, + ); + } + case MapNavigationButton.none: + break; + } + if (child != null) { + child = _heroify(context, 'top-left', child); + } + return child; + } + + Widget? _buildTopRightButton(BuildContext context) { + const heroTag = 'top-right'; + + final actions = [ + MapAction.openMapApp, + MapAction.addShortcut, + ].where((action) => _actionDelegate.isVisible(context, action)).toList(); + + Widget? child; + if (actions.length == 1) { + child = _buildActionButton(context, actions.first, heroTag: heroTag); + } else if (actions.length > 1) { + child = MapOverlayButton( + builder: (context, visualDensity, child) { + final animations = context.read<Settings>().accessibilityAnimations; + return PopupMenuButton<MapAction>( + itemBuilder: (context) => actions + .map( + (action) => PopupMenuItem( + value: action, + child: MenuRow( + text: action.getText(context), + icon: action.getIcon(), + ), + ), + ) + .toList(), + onSelected: (action) async { + // wait for the popup menu to hide before proceeding with the action + await Future.delayed(animations.popUpAnimationDelay * timeDilation); + _actionDelegate.onActionSelected(context, action); + }, + iconSize: MapOverlayButton.iconSize(visualDensity), + popUpAnimationStyle: animations.popUpAnimationStyle, + ); + }, + ); + child = _heroify(context, heroTag, child); + } + return child; + } + + Widget _buildCompass(BuildContext context) { + final iconTheme = IconTheme.of(context); + final iconSize = Size.square(iconTheme.size!); + return ValueListenableBuilder<ZoomedBounds>( + valueListenable: widget.boundsNotifier, + builder: (context, bounds, child) { + final degrees = bounds.rotation; + final opacity = degrees == 0 ? .0 : 1.0; + return IgnorePointer( + ignoring: opacity == 0, + child: AnimatedOpacity( + opacity: opacity, + duration: context.select<DurationsData, Duration>((v) => v.viewerOverlayAnimation), + child: MapOverlayButton.icon( + icon: Transform( + origin: iconSize.center(Offset.zero), + transform: Matrix4.rotationZ(degToRadian(degrees)), + child: CustomPaint( + painter: CompassPainter( + color: iconTheme.color!, + ), + size: iconSize, + ), + ), + onPressed: widget.controller.resetRotation, + tooltip: context.l10n.mapPointNorthUpTooltip, + ), + ), + ); + }, + ); + } + + Widget _buildActionButton(BuildContext context, MapAction action, {Key? buttonKey, String? heroTag}) { + final child = MapOverlayButton.icon( + buttonKey: buttonKey, + icon: action.getIcon(), + onPressed: () => _actionDelegate.onActionSelected(context, action), + tooltip: action.getText(context), + ); + return _heroify(context, heroTag ?? action.name, child); + } + + Widget _heroify(BuildContext context, String? tag, Widget child) { + if (tag != null) { + final animate = context.select<Settings, bool>((v) => v.animate); + if (animate) { + return Hero( + tag: 'map-button-$tag', + flightShuttleBuilder: MapTheme.heroFlightShuttleBuilder, + child: child, + ); + } + } + return child; + } +} diff --git a/lib/widgets/common/map/compass.dart b/lib/widgets/common/map/compass.dart new file mode 100644 index 0000000..2563ecf --- /dev/null +++ b/lib/widgets/common/map/compass.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; + +class CompassPainter extends CustomPainter { + final Color color; + + const CompassPainter({ + required this.color, + }); + + @override + void paint(Canvas canvas, Size size) { + final center = Offset(size.width / 2, size.height / 2); + final base = size.width * .3; + final height = size.height * .4; + + final northTriangle = Path() + ..moveTo(center.dx - base / 2, center.dy) + ..lineTo(center.dx, center.dy - height) + ..lineTo(center.dx + base / 2, center.dy) + ..close(); + final southTriangle = Path() + ..moveTo(center.dx - base / 2, center.dy) + ..lineTo(center.dx + base / 2, center.dy) + ..lineTo(center.dx, center.dy + height) + ..close(); + + final fillPaint = Paint() + ..style = PaintingStyle.fill + ..color = color.withValues(alpha: .6); + final strokePaint = Paint() + ..style = PaintingStyle.stroke + ..color = color + ..strokeWidth = 1.7 + ..strokeJoin = StrokeJoin.round; + + canvas.drawPath(northTriangle, fillPaint); + canvas.drawPath(northTriangle, strokePaint); + canvas.drawPath(southTriangle, strokePaint); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => true; +} diff --git a/lib/widgets/common/map/decorator.dart b/lib/widgets/common/map/decorator.dart new file mode 100644 index 0000000..3de7a72 --- /dev/null +++ b/lib/widgets/common/map/decorator.dart @@ -0,0 +1,67 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:aves/widgets/common/providers/map_theme_provider.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class MapDecorator extends StatelessWidget { + final Widget child; + + static const mapBorderRadius = BorderRadius.all(Radius.circular(24)); // to match button circles + static const mapBackground = Color(0xFFDBD5D3); + static const mapLoadingGrid = Color(0xFFC4BEBB); + + const MapDecorator({ + super.key, + required this.child, + }); + + @override + Widget build(BuildContext context) { + Widget _child = ClipRRect( + borderRadius: mapBorderRadius, + child: Container( + color: mapBackground, + foregroundDecoration: BoxDecoration( + border: AvesBorder.border(context), + borderRadius: mapBorderRadius, + ), + child: Stack( + children: [ + const GridPaper( + color: mapLoadingGrid, + interval: 10, + divisions: 1, + subdivisions: 1, + child: CustomPaint( + size: Size.infinite, + ), + ), + child, + ], + ), + ), + ); + + final animate = context.select<Settings, bool>((v) => v.animate); + if (animate) { + _child = Hero( + tag: 'map-canvas', + flightShuttleBuilder: MapTheme.heroFlightShuttleBuilder, + child: _child, + ); + } + + final interactive = context.select<MapThemeData, bool>((v) => v.interactive); + return GestureDetector( + onScaleStart: interactive + ? null + : (details) { + // absorb scale gesture here to prevent scrolling + // and triggering by mistake a move to the image page above + }, + child: _child, + ); + } +} diff --git a/lib/widgets/common/map/geo_map.dart b/lib/widgets/common/map/geo_map.dart new file mode 100644 index 0000000..8093248 --- /dev/null +++ b/lib/widgets/common/map/geo_map.dart @@ -0,0 +1,543 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/images.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/entry/sort.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/ref/poi.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/utils/math_utils.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/common/map/attribution.dart'; +import 'package:aves/widgets/common/map/buttons/panel.dart'; +import 'package:aves/widgets/common/map/decorator.dart'; +import 'package:aves/widgets/common/map/leaflet/map.dart'; +import 'package:aves/widgets/common/map/map_action_delegate.dart'; +import 'package:aves/widgets/common/thumbnail/image.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:collection/collection.dart'; +import 'package:fluster/fluster.dart'; +import 'package:flutter/material.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:provider/provider.dart'; + +// ✅ REMOTE support per marker thumbs +import 'package:aves/remote/remote_origin.dart'; +import 'package:aves/remote/remote_image_tile.dart'; + +class GeoMap extends StatefulWidget { + final AvesMapController controller; + final CollectionLens? collection; + final List<AvesEntry>? entries; + final Size availableSize; + final LatLng? initialCenter; + final double? initialZoom; + final ValueNotifier<bool> isAnimatingNotifier; + final ValueNotifier<LatLng?>? dotLocationNotifier; + final ValueNotifier<double>? overlayOpacityNotifier; + final MapOverlay? overlayEntry; + final Set<List<LatLng>>? tracks; + final UserZoomChangeCallback? onUserZoomChange; + final MapTapCallback? onMapTap; + final void Function( + LatLng markerLocation, + AvesEntry markerEntry, + )? + onMarkerTap; + final void Function( + LatLng markerLocation, + AvesEntry markerEntry, + Set<AvesEntry> clusterEntries, + Offset tapLocalPosition, + WidgetBuilder markerBuilder, + )? + onMarkerLongPress; + final void Function(BuildContext context)? openMapPage; + + const GeoMap({ + super.key, + required this.controller, + this.collection, + this.entries, + required this.availableSize, + this.initialCenter, + this.initialZoom, + required this.isAnimatingNotifier, + this.dotLocationNotifier, + this.overlayOpacityNotifier, + this.overlayEntry, + this.tracks, + this.onUserZoomChange, + this.onMapTap, + this.onMarkerTap, + this.onMarkerLongPress, + this.openMapPage, + }) : assert(collection != null || entries != null); + + @override + State<GeoMap> createState() => _GeoMapState(); +} + +class _GeoMapState extends State<GeoMap> { + final Set<StreamSubscription> _subscriptions = {}; + + // as of google_maps_flutter v2.0.6, Google map initialization is blocking + // cf https://github.com/flutter/flutter/issues/28493 + // it is especially severe the first time, but still significant afterwards + // so we prevent loading it while scrolling or animating + bool _heavyMapLoaded = false; + late final ValueNotifier<ZoomedBounds> _boundsNotifier; + Fluster<GeoEntry<AvesEntry>>? _defaultMarkerCluster; + Fluster<GeoEntry<AvesEntry>>? _slowMarkerCluster; + final AChangeNotifier _clusterChangeNotifier = AChangeNotifier(); + + List<AvesEntry> get entries => widget.collection?.sortedEntries ?? widget.entries ?? []; + + // cap initial zoom to avoid a zoom change + // when toggling overlay on Google map initial state + static const double minInitialZoom = 3; + + @override + void initState() { + super.initState(); + _boundsNotifier = ValueNotifier(_initBounds()); + _registerWidget(widget); + _onCollectionChanged(); + } + + @override + void didUpdateWidget(covariant GeoMap oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _clusterChangeNotifier.dispose(); + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(GeoMap widget) { + widget.collection?.addListener(_onCollectionChanged); + _subscriptions.add(widget.controller.markerLocationChanges.listen((event) => _onCollectionChanged())); + } + + void _unregisterWidget(GeoMap widget) { + widget.collection?.removeListener(_onCollectionChanged); + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + // ✅ Helper: marker thumb locale vs remoto + Widget _buildMarkerThumb({ + required AvesEntry entry, + required double extent, + required double devicePixelRatio, + required bool progressive, + }) { + if (entry.origin == RemoteOrigin.value) { + return SizedBox( + width: extent, + height: extent, + child: RemoteImageTile( + entry: entry, + borderRadius: 0, + fit: BoxFit.cover, + ), + ); + } + + return ThumbnailImage( + entry: entry, + extent: extent, + devicePixelRatio: devicePixelRatio, + progressive: progressive, + ); + } + + @override + Widget build(BuildContext context) { + final devicePixelRatio = MediaQuery.devicePixelRatioOf(context); + void onMarkerLongPress(GeoEntry<AvesEntry> geoEntry, LatLng tapLocation) => _onMarkerLongPress( + geoEntry: geoEntry, + tapLocation: tapLocation, + devicePixelRatio: devicePixelRatio, + ); + + return Selector<Settings, EntryMapStyle?>( + selector: (context, s) => s.mapStyle, + builder: (context, mapStyle, child) { + final isHeavy = mapStyle?.isHeavy ?? false; + final locale = context.locale; + + Widget _buildMarkerWidget(MarkerKey<AvesEntry> key) => ImageMarker( + key: key, + count: key.count, + locale: locale, + buildThumbnailImage: (extent) => _buildMarkerThumb( + entry: key.entry, + extent: extent, + devicePixelRatio: devicePixelRatio, + progressive: !isHeavy, + ), + ); + + bool _isMarkerImageReady(MarkerKey<AvesEntry> key) { + // ✅ per i remoti consideriamo “ready” (RemoteImageTile gestisce il fetch) + if (key.entry.origin == RemoteOrigin.value) return true; + return key.entry.isThumbnailReady(extent: MapThemeData.markerImageExtent); + } + + Widget child = const SizedBox(); + if (mapStyle != null) { + if (mapStyle.needMobileService) { + child = mobileServices.buildMap<AvesEntry>( + controller: widget.controller, + clusterListenable: _clusterChangeNotifier, + boundsNotifier: _boundsNotifier, + style: mapStyle, + decoratorBuilder: _decorateMap, + buttonPanelBuilder: _buildButtonPanel, + markerClusterBuilder: _buildMarkerClusters, + markerWidgetBuilder: _buildMarkerWidget, + markerImageReadyChecker: _isMarkerImageReady, + dotLocationNotifier: widget.dotLocationNotifier, + overlayOpacityNotifier: widget.overlayOpacityNotifier, + overlayEntry: widget.overlayEntry, + tracks: widget.tracks, + onUserZoomChange: widget.onUserZoomChange, + onMapTap: widget.onMapTap, + onMarkerTap: _onMarkerTap, + onMarkerLongPress: onMarkerLongPress, + ); + } else { + child = EntryLeafletMap<AvesEntry>( + controller: widget.controller, + clusterListenable: _clusterChangeNotifier, + boundsNotifier: _boundsNotifier, + minZoom: 2, + maxZoom: 16, + style: mapStyle, + decoratorBuilder: _decorateMap, + buttonPanelBuilder: _buildButtonPanel, + markerClusterBuilder: _buildMarkerClusters, + markerWidgetBuilder: _buildMarkerWidget, + dotLocationNotifier: widget.dotLocationNotifier, + markerSize: Size( + MapThemeData.markerImageExtent + MapThemeData.markerOuterBorderWidth * 2, + MapThemeData.markerImageExtent + MapThemeData.markerOuterBorderWidth * 2 + MapThemeData.markerArrowSize.height, + ), + dotMarkerSize: const Size( + MapThemeData.markerDotDiameter + MapThemeData.markerOuterBorderWidth * 2, + MapThemeData.markerDotDiameter + MapThemeData.markerOuterBorderWidth * 2, + ), + overlayOpacityNotifier: widget.overlayOpacityNotifier, + overlayEntry: widget.overlayEntry, + tracks: widget.tracks, + onUserZoomChange: widget.onUserZoomChange, + onMapTap: widget.onMapTap, + onMarkerTap: _onMarkerTap, + onMarkerLongPress: onMarkerLongPress, + ); + } + } else { + final overlay = Center( + child: OverlayTextButton( + onPressed: () => MapActionDelegate.selectStyle(context), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(AIcons.layers), + const SizedBox(width: 8), + Text(context.l10n.mapStyleTooltip), + ], + ), + ), + ); + child = _decorateMap(context, overlay); + } + + final mapHeight = context.select<MapThemeData, double?>((v) => v.mapHeight); + child = Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // TODO TLAD [flutter vNext] wrap into `BackdropGroup` + mapHeight != null + ? SizedBox( + height: mapHeight, + child: child, + ) + : Expanded(child: child), + SafeArea( + top: false, + bottom: false, + child: Padding( + padding: context.select<MapThemeData, EdgeInsets>((v) => v.attributionPadding), + child: Attribution(style: mapStyle), + ), + ), + ], + ); + + return AnimatedSize( + alignment: Alignment.topCenter, + curve: Curves.easeInOutCubic, + duration: ADurations.mapStyleSwitchAnimation, + child: ValueListenableBuilder<bool>( + valueListenable: widget.isAnimatingNotifier, + builder: (context, animating, child) { + if (!animating && isHeavy) { + _heavyMapLoaded = true; + } + Widget replacement = Stack( + children: [ + const MapDecorator( + child: SizedBox(), + ), + _buildButtonPanel(context), + ], + ); + if (mapHeight != null) { + replacement = SizedBox( + height: mapHeight, + child: replacement, + ); + } + return Visibility( + visible: !isHeavy || _heavyMapLoaded, + replacement: replacement, + child: child!, + ); + }, + child: child, + ), + ); + }, + ); + } + + ZoomedBounds _initBounds() { + ZoomedBounds? bounds; + + final overlayEntry = widget.overlayEntry; + if (overlayEntry != null) { + // fit map to overlaid item + final corner1 = overlayEntry.topLeft; + final corner2 = overlayEntry.bottomRight; + if (corner1 != null && corner2 != null) { + bounds = ZoomedBounds.fromPoints( + points: {corner1, corner2}, + ); + } + } + + final initialZoom = widget.initialZoom ?? settings.infoMapZoom; + if (bounds == null) { + LatLng? centerToSave; + final initialCenter = widget.initialCenter; + if (initialCenter != null) { + // fit map for specified center and user zoom + bounds = ZoomedBounds.fromPoints( + points: {initialCenter}, + collocationZoom: initialZoom, + ); + centerToSave = initialCenter; + } else { + // fit map for all located items if possible, falling back to most recent items + bounds = _initBoundsForEntries(entries: entries); + centerToSave = bounds?.projectedCenter; + } + + if (centerToSave != null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; + settings.mapDefaultCenter = centerToSave; + }); + } + } + if (bounds == null) { + // fallback to default center + var center = settings.mapDefaultCenter; + if (center == null) { + center = PointsOfInterest.wonders[Random().nextInt(PointsOfInterest.wonders.length)]; + WidgetsBinding.instance.addPostFrameCallback((_) => settings.mapDefaultCenter = center); + } + bounds = ZoomedBounds.fromPoints( + points: {center}, + collocationZoom: initialZoom, + ); + } + + return bounds.copyWith( + zoom: max(bounds.zoom, minInitialZoom), + ); + } + + ZoomedBounds? _initBoundsForEntries({required List<AvesEntry> entries, int? recentCount}) { + if (recentCount != null) { + entries = List.of(entries)..sort(AvesEntrySort.compareByDate); + entries = entries.take(recentCount).toList(); + } + + if (entries.isEmpty) return null; + + final points = entries.map((v) => v.latLng!).toSet(); + var bounds = ZoomedBounds.fromPoints( + points: points, + collocationZoom: settings.infoMapZoom, + ); + bounds = bounds.copyWith(zoom: max(minInitialZoom, bounds.zoom.floorToDouble())); + + final neededSize = bounds.toDisplaySize(); + final availableSize = widget.availableSize; + if (neededSize.width > availableSize.width || neededSize.height > availableSize.height) { + return _initBoundsForEntries(entries: entries, recentCount: (recentCount ?? 10000) ~/ 10); + } + return bounds; + } + + void _onCollectionChanged() { + _defaultMarkerCluster = _buildFluster(); + _slowMarkerCluster = null; + _clusterChangeNotifier.notify(); + } + + Fluster<GeoEntry<AvesEntry>> _buildFluster({int nodeSize = 64}) { + final markers = entries + .map((entry) { + final latLng = entry.latLng; + return latLng != null + ? GeoEntry<AvesEntry>( + entry: entry, + latitude: latLng.latitude, + longitude: latLng.longitude, + markerId: entry.uri, + ) + : null; + }) + .nonNulls + .toList(); + + return Fluster<GeoEntry<AvesEntry>>( + minZoom: 0, + maxZoom: 22, + radius: 240, + extent: 2 << 9, + nodeSize: nodeSize, + points: markers, + createCluster: (base, lng, lat) => GeoEntry<AvesEntry>.createCluster(base, lng, lat), + ); + } + + Map<MarkerKey<AvesEntry>, GeoEntry<AvesEntry>> _buildMarkerClusters() { + final bounds = _boundsNotifier.value; + final geoEntries = _defaultMarkerCluster?.clusters(bounds.boundingBox, bounds.zoom.round()) ?? []; + return Map.fromEntries( + geoEntries.map((v) { + if (v.isCluster!) { + final uri = v.childMarkerId; + final entry = entries.firstWhere((v) => v.uri == uri); + return MapEntry(MarkerKey(entry, v.pointsSize), v); + } + return MapEntry(MarkerKey(v.entry!, null), v); + }), + ); + } + + Set<AvesEntry> _getClusterEntries(GeoEntry<AvesEntry> geoEntry) { + final clusterId = geoEntry.clusterId; + if (clusterId == null) { + return {geoEntry.entry!}; + } + + var points = _defaultMarkerCluster?.points(clusterId) ?? []; + if (points.length != geoEntry.pointsSize) { + _slowMarkerCluster ??= _buildFluster(nodeSize: smallestPowerOf2(entries.length).toInt()); + points = _slowMarkerCluster!.points(clusterId); + assert(points.length == geoEntry.pointsSize, 'got ${points.length}/${geoEntry.pointsSize} for geoEntry=$geoEntry'); + } + return points.map((geoEntry) => geoEntry.entry!).toSet(); + } + + void _onMarkerTap(GeoEntry<AvesEntry> geoEntry) { + final onTap = widget.onMarkerTap; + if (onTap == null) return; + + final clusterId = geoEntry.clusterId; + AvesEntry? markerEntry; + if (clusterId != null) { + final uri = geoEntry.childMarkerId; + markerEntry = entries.firstWhereOrNull((v) => v.uri == uri); + } else { + markerEntry = geoEntry.entry; + } + if (markerEntry == null) return; + + final markerLocation = LatLng(geoEntry.latitude!, geoEntry.longitude!); + onTap(markerLocation, markerEntry); + } + + Future<void> _onMarkerLongPress({ + required GeoEntry<AvesEntry> geoEntry, + required LatLng tapLocation, + required double devicePixelRatio, + }) async { + final onMarkerLongPress = widget.onMarkerLongPress; + if (onMarkerLongPress == null) return; + + final clusterEntries = _getClusterEntries(geoEntry); + final tapLocalPosition = _boundsNotifier.value.offset(tapLocation); + + AvesEntry markerEntry; + if (geoEntry.isCluster!) { + final uri = geoEntry.childMarkerId; + markerEntry = entries.firstWhere((v) => v.uri == uri); + } else { + markerEntry = geoEntry.entry!; + } + final locale = context.locale; + final markerLocation = LatLng(geoEntry.latitude!, geoEntry.longitude!); + + // ✅ long press marker builder (remote-aware) + Widget markerBuilder(BuildContext context) => ImageMarker( + count: geoEntry.pointsSize, + locale: locale, + drawArrow: false, + buildThumbnailImage: (extent) => _buildMarkerThumb( + entry: markerEntry, + extent: extent, + devicePixelRatio: devicePixelRatio, + progressive: true, + ), + ); + + onMarkerLongPress( + markerLocation, + markerEntry, + clusterEntries, + tapLocalPosition, + markerBuilder, + ); + } + + Widget _decorateMap(BuildContext context, Widget? child) => MapDecorator(child: child!); + + Widget _buildButtonPanel(BuildContext context) { + if (settings.useTvLayout) return const SizedBox(); + return MapButtonPanel( + controller: widget.controller, + boundsNotifier: _boundsNotifier, + openMapPage: widget.openMapPage, + ); + } +} diff --git a/lib/widgets/common/map/leaflet/latlng_tween.dart b/lib/widgets/common/map/leaflet/latlng_tween.dart new file mode 100644 index 0000000..1593c9c --- /dev/null +++ b/lib/widgets/common/map/leaflet/latlng_tween.dart @@ -0,0 +1,13 @@ +import 'package:aves/widgets/common/map/leaflet/latlng_utils.dart'; +import 'package:flutter/widgets.dart'; +import 'package:latlong2/latlong.dart'; + +class LatLngTween extends Tween<LatLng?> { + LatLngTween({ + required super.begin, + required super.end, + }); + + @override + LatLng? lerp(double t) => LatLngUtils.lerp(begin, end, t); +} diff --git a/lib/widgets/common/map/leaflet/latlng_utils.dart b/lib/widgets/common/map/leaflet/latlng_utils.dart new file mode 100644 index 0000000..adec5d1 --- /dev/null +++ b/lib/widgets/common/map/leaflet/latlng_utils.dart @@ -0,0 +1,14 @@ +import 'package:latlong2/latlong.dart'; + +class LatLngUtils { + static LatLng? lerp(LatLng? a, LatLng? b, double t) { + if (a == null && b == null) return null; + + final _a = a ?? const LatLng(0, 0); + final _b = b ?? const LatLng(0, 0); + return LatLng( + _a.latitude + (_b.latitude - _a.latitude) * t, + _a.longitude + (_b.longitude - _a.longitude) * t, + ); + } +} diff --git a/lib/widgets/common/map/leaflet/map.dart b/lib/widgets/common/map/leaflet/map.dart new file mode 100644 index 0000000..63a9c2b --- /dev/null +++ b/lib/widgets/common/map/leaflet/map.dart @@ -0,0 +1,339 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/model/device.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/utils/debouncer.dart'; +import 'package:aves/widgets/common/basic/gestures/gesture_detector.dart'; +import 'package:aves/widgets/common/map/leaflet/latlng_tween.dart' as llt; +import 'package:aves/widgets/common/map/leaflet/scale_layer.dart'; +import 'package:aves/widgets/common/map/leaflet/tile_layers.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:provider/provider.dart'; + +class EntryLeafletMap<T> extends StatefulWidget { + final AvesMapController controller; + final Listenable clusterListenable; + final ValueNotifier<ZoomedBounds> boundsNotifier; + final double minZoom, maxZoom; + final EntryMapStyle style; + final TransitionBuilder decoratorBuilder; + final WidgetBuilder buttonPanelBuilder; + final MarkerClusterBuilder<T> markerClusterBuilder; + final MarkerWidgetBuilder<T> markerWidgetBuilder; + final ValueNotifier<LatLng?>? dotLocationNotifier; + final Size markerSize, dotMarkerSize; + final ValueNotifier<double>? overlayOpacityNotifier; + final MapOverlay? overlayEntry; + final Set<List<LatLng>>? tracks; + final UserZoomChangeCallback? onUserZoomChange; + final MapTapCallback? onMapTap; + final MarkerTapCallback<T>? onMarkerTap; + final MarkerLongPressCallback<T>? onMarkerLongPress; + + const EntryLeafletMap({ + super.key, + required this.controller, + required this.clusterListenable, + required this.boundsNotifier, + this.minZoom = 0, + this.maxZoom = 22, + required this.style, + required this.decoratorBuilder, + required this.buttonPanelBuilder, + required this.markerClusterBuilder, + required this.markerWidgetBuilder, + required this.dotLocationNotifier, + required this.markerSize, + required this.dotMarkerSize, + this.overlayOpacityNotifier, + this.overlayEntry, + this.tracks, + this.onUserZoomChange, + this.onMapTap, + this.onMarkerTap, + this.onMarkerLongPress, + }); + + @override + State<EntryLeafletMap<T>> createState() => _EntryLeafletMapState<T>(); +} + +class _EntryLeafletMapState<T> extends State<EntryLeafletMap<T>> with TickerProviderStateMixin { + final MapController _leafletMapController = MapController(); + final Set<StreamSubscription> _subscriptions = {}; + Map<MarkerKey<T>, GeoEntry<T>> _geoEntryByMarkerKey = {}; + final Debouncer _debouncer = Debouncer(delay: ADurations.mapIdleDebounceDelay); + + ValueNotifier<ZoomedBounds> get boundsNotifier => widget.boundsNotifier; + + ZoomedBounds get bounds => boundsNotifier.value; + + // duration should match the uncustomizable Google map duration + static const _cameraAnimationDuration = Duration(milliseconds: 600); + + @override + void initState() { + super.initState(); + _registerWidget(widget); + WidgetsBinding.instance.addPostFrameCallback((_) => _updateVisibleRegion()); + } + + @override + void didUpdateWidget(covariant EntryLeafletMap<T> oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(EntryLeafletMap<T> widget) { + final avesMapController = widget.controller; + _subscriptions.add(avesMapController.moveCommands.listen((event) => _moveTo(event.latLng))); + _subscriptions.add(avesMapController.zoomCommands.listen((event) => _zoomBy(event.delta))); + _subscriptions.add(avesMapController.rotationResetCommands.listen((_) => _resetRotation())); + _subscriptions.add(_leafletMapController.mapEventStream.listen((_) => _updateVisibleRegion())); + widget.clusterListenable.addListener(_updateMarkers); + widget.boundsNotifier.addListener(_onBoundsChanged); + } + + void _unregisterWidget(EntryLeafletMap<T> widget) { + widget.clusterListenable.removeListener(_updateMarkers); + widget.boundsNotifier.removeListener(_onBoundsChanged); + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + widget.decoratorBuilder(context, _buildMap()), + widget.buttonPanelBuilder(context), + ], + ); + } + + Widget _buildMap() { + final markerSize = widget.markerSize; + final dotMarkerSize = widget.dotMarkerSize; + + final interactive = context.select<MapThemeData, bool>((v) => v.interactive); + + final markers = _geoEntryByMarkerKey.entries.map((kv) { + final markerKey = kv.key; + final geoEntry = kv.value; + final latLng = LatLng(geoEntry.latitude!, geoEntry.longitude!); + final onMarkerLongPress = widget.onMarkerLongPress; + final onLongPress = onMarkerLongPress != null ? Feedback.wrapForLongPress(() => onMarkerLongPress.call(geoEntry, LatLng(geoEntry.latitude!, geoEntry.longitude!)), context) : null; + return Marker( + point: latLng, + child: AGestureDetector( + onTap: () => widget.onMarkerTap?.call(geoEntry), + // marker tap handling prevents the default handling of focal zoom on double tap, + // so we reimplement the double tap gesture here + onDoubleTap: interactive ? () => _zoomBy(1, focalPoint: latLng) : null, + onLongPress: onLongPress, + // `MapInteractiveViewer` already declares a `LongPressGestureRecognizer` with the default delay (`kLongPressTimeout`), + // so this one should have a shorter delay to win in the gesture arena + longPressTimeout: Duration(milliseconds: min(settings.longPressTimeout.inMilliseconds, kLongPressTimeout.inMilliseconds)), + child: widget.markerWidgetBuilder(markerKey), + ), + width: markerSize.width, + height: markerSize.height, + alignment: Alignment.topCenter, + ); + }).toList(); + + return FlutterMap( + options: MapOptions( + initialCenter: bounds.projectedCenter, + initialZoom: bounds.zoom, + initialRotation: bounds.rotation, + minZoom: widget.minZoom, + maxZoom: widget.maxZoom, + backgroundColor: Colors.transparent, + interactionOptions: InteractionOptions( + // TODO TLAD [map] as of flutter_map v0.14.0, `doubleTapZoom` does not move when zoom is already maximal + // this could be worked around with https://github.com/fleaflet/flutter_map/pull/960 + flags: interactive ? InteractiveFlag.all : InteractiveFlag.none, + // prevent triggering multiple gestures at once (e.g. rotating a bit when mostly zooming) + enableMultiFingerGestureRace: true, + ), + onTap: (tapPosition, point) => widget.onMapTap?.call(point), + ), + mapController: _leafletMapController, + children: [ + _buildMapLayer(), + if (widget.overlayEntry != null) _buildOverlayImageLayer(), + if (widget.tracks != null) _buildTracksLayer(), + MarkerLayer( + markers: markers, + rotate: true, + alignment: Alignment.bottomCenter, + ), + NullableValueListenableBuilder<LatLng?>( + valueListenable: widget.dotLocationNotifier, + builder: (context, dotLocation, child) => MarkerLayer( + markers: [ + if (dotLocation != null) + Marker( + point: dotLocation, + child: const DotMarker(), + width: dotMarkerSize.width, + height: dotMarkerSize.height, + ), + ], + ), + ), + ScaleLayerWidget( + options: ScaleLayerOptions( + unitSystem: settings.unitSystem, + ), + ), + ], + ); + } + + Widget _buildMapLayer() { + final style = widget.style; + if (style == EntryMapStyles.osmLiberty) { + return const OsmLibertyLayer(); + } + + final urlTemplate = style.url; + if (urlTemplate != null) { + final userAgent = style.userAgent; + return TileLayer( + urlTemplate: urlTemplate, + subdomains: style.subdomains, + tileProvider: NetworkTileProvider( + headers: { + 'User-Agent': ?userAgent, + }, + ), + // similar to `RetinaMode.isHighDensity` from `flutter_map`, but only rebuild for target aspect + retinaMode: MediaQuery.devicePixelRatioOf(context) > 1, + userAgentPackageName: device.userAgent, + ); + } + return const SizedBox(); + } + + Widget _buildOverlayImageLayer() { + final overlayEntry = widget.overlayEntry; + if (overlayEntry == null) return const SizedBox(); + + final corner1 = overlayEntry.topLeft; + final corner2 = overlayEntry.bottomRight; + if (corner1 == null || corner2 == null) return const SizedBox(); + + return NullableValueListenableBuilder<double>( + valueListenable: widget.overlayOpacityNotifier, + builder: (context, value, child) { + final double overlayOpacity = value ?? 1.0; + return OverlayImageLayer( + overlayImages: [ + OverlayImage( + bounds: LatLngBounds(corner1, corner2), + imageProvider: overlayEntry.imageProvider, + opacity: overlayOpacity, + ), + ], + ); + }, + ); + } + + Widget _buildTracksLayer() { + final tracks = widget.tracks; + if (tracks == null) return const SizedBox(); + + final trackColor = Theme.of(context).colorScheme.primary; + return PolylineLayer( + polylines: tracks + .map( + (v) => Polyline( + points: v, + strokeWidth: MapThemeData.trackWidth.toDouble(), + color: trackColor, + ), + ) + .toList(), + ); + } + + void _onBoundsChanged() => _debouncer(_onIdle); + + void _onIdle() { + if (!mounted) return; + widget.controller.notifyIdle(bounds); + _updateMarkers(); + } + + void _updateMarkers() { + setState(() => _geoEntryByMarkerKey = widget.markerClusterBuilder()); + } + + void _updateVisibleRegion() { + final camera = _leafletMapController.camera; + final bounds = camera.visibleBounds; + boundsNotifier.value = ZoomedBounds( + sw: bounds.southWest, + ne: bounds.northEast, + zoom: camera.zoom, + rotation: camera.rotation, + ); + } + + Future<void> _resetRotation() async { + final rotation = _leafletMapController.camera.rotation; + // prevent multiple turns + final begin = (rotation.abs() % 360) * rotation.sign; + final rotationTween = Tween<double>(begin: begin, end: 0); + await _animateCamera((animation) => _leafletMapController.rotate(rotationTween.evaluate(animation))); + } + + Future<void> _zoomBy(double amount, {LatLng? focalPoint}) async { + final camera = _leafletMapController.camera; + final endZoom = (camera.zoom + amount).clamp(widget.minZoom, widget.maxZoom); + widget.onUserZoomChange?.call(endZoom); + + final center = camera.center; + final centerTween = llt.LatLngTween(begin: center, end: focalPoint ?? center); + + final zoomTween = Tween<double>(begin: camera.zoom, end: endZoom); + await _animateCamera((animation) => _leafletMapController.move(centerTween.evaluate(animation)!, zoomTween.evaluate(animation))); + } + + Future<void> _moveTo(LatLng point) async { + final camera = _leafletMapController.camera; + final centerTween = llt.LatLngTween(begin: camera.center, end: point); + await _animateCamera((animation) => _leafletMapController.move(centerTween.evaluate(animation)!, camera.zoom)); + } + + Future<void> _animateCamera(void Function(Animation<double> animation) animate) async { + final controller = AnimationController(duration: _cameraAnimationDuration, vsync: this); + final animation = CurvedAnimation(parent: controller, curve: Curves.fastOutSlowIn); + controller.addListener(() => animate(animation)); + animation.addStatusListener((status) { + if (!status.isAnimating) { + animation.dispose(); + controller.dispose(); + } + }); + await controller.forward(); + } +} diff --git a/lib/widgets/common/map/leaflet/scale_layer.dart b/lib/widgets/common/map/leaflet/scale_layer.dart new file mode 100644 index 0000000..6c642b3 --- /dev/null +++ b/lib/widgets/common/map/leaflet/scale_layer.dart @@ -0,0 +1,166 @@ +import 'dart:math'; + +import 'package:aves/widgets/common/basic/text/outlined.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:latlong2/latlong.dart'; + +class ScaleLayerOptions { + final UnitSystem unitSystem; + final Widget Function(double width, String distance) builder; + + ScaleLayerOptions({ + this.unitSystem = UnitSystem.metric, + this.builder = defaultBuilder, + }); + + static Widget defaultBuilder(double width, String distance) { + return ScaleBar( + distance: distance, + width: width, + ); + } +} + +class ScaleLayerWidget extends StatelessWidget { + final ScaleLayerOptions options; + + final Distance _distanceCalculator = const Distance(); + + const ScaleLayerWidget({ + super.key, + required this.options, + }); + + static const List<double> scaleMeters = [ + 25000000, + 15000000, + 8000000, + 4000000, + 2000000, + 1000000, + 500000, + 250000, + 100000, + 50000, + 25000, + 15000, + 8000, + 4000, + 2000, + 1000, + 500, + 250, + 100, + 50, + 25, + 10, + 5, + ]; + + static const double metersInAKilometer = 1000; + static const double metersInAMile = 1609.344; + static const double metersInAFoot = 0.3048; + + @override + Widget build(BuildContext context) { + final map = MapCamera.of(context); + final center = map.center; + final latitude = center.latitude.abs(); + final level = + map.zoom.round() + + (latitude > 80 + ? 4 + : latitude > 60 + ? 3 + : 2); + final scaleLevel = level.clamp(0, 20); + late final double distanceMeters; + late final String displayDistance; + switch (options.unitSystem) { + case UnitSystem.metric: + // meters + distanceMeters = scaleMeters[scaleLevel]; + displayDistance = distanceMeters >= metersInAKilometer ? '${(distanceMeters / metersInAKilometer).toStringAsFixed(0)} km' : '${distanceMeters.toStringAsFixed(0)} m'; + case UnitSystem.imperial: + if (scaleLevel < 15) { + // miles + final distanceMiles = scaleMeters[scaleLevel + 1] / 1000; + distanceMeters = distanceMiles * metersInAMile; + displayDistance = '${distanceMiles.toStringAsFixed(0)} mi'; + } else { + // feet + final distanceFeet = scaleMeters[scaleLevel - 1]; + distanceMeters = distanceFeet * metersInAFoot; + displayDistance = '${distanceFeet.toStringAsFixed(0)} ft'; + } + } + + final start = map.projectAtZoom(center); + final targetPoint = _distanceCalculator.offset(center, distanceMeters, 90); + final end = map.projectAtZoom(targetPoint); + final width = max(0, end.dx - start.dx).toDouble(); + + return options.builder(width, displayDistance); + } +} + +class ScaleBar extends StatelessWidget { + final String distance; + final double width; + + static const Color fillColor = Colors.black; + static const Color outlineColor = Colors.white; + static const double outlineWidth = .5; + static const double barThickness = 1; + + const ScaleBar({ + super.key, + required this.distance, + required this.width, + }); + + @override + Widget build(BuildContext context) { + return Container( + // keep `left` (and not `start`) because zoom buttons are kept right + // because `Google` logo on Google layers are always in the bottom left + alignment: Alignment.bottomLeft, + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + OutlinedText( + textSpans: [ + TextSpan( + text: distance, + style: const TextStyle( + color: fillColor, + fontSize: 11, + ), + ), + ], + outlineWidth: outlineWidth * 2, + outlineColor: outlineColor, + ), + Container( + height: barThickness + outlineWidth * 2, + width: width, + decoration: const BoxDecoration( + color: fillColor, + border: Border.fromBorderSide( + BorderSide( + color: outlineColor, + width: outlineWidth, + ), + ), + borderRadius: BorderRadius.all(Radius.circular(8)), + ), + ), + ], + ), + ); + } +} diff --git a/lib/widgets/common/map/leaflet/tile_layers.dart b/lib/widgets/common/map/leaflet/tile_layers.dart new file mode 100644 index 0000000..c9cdbec --- /dev/null +++ b/lib/widgets/common/map/leaflet/tile_layers.dart @@ -0,0 +1,98 @@ +import 'dart:io' as io; + +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/map/leaflet/vector_style_reader_extra.dart'; +import 'package:flutter/material.dart'; +import 'package:vector_map_tiles/src/io/io.dart' as vmtio show Directory; // ignore: implementation_imports +import 'package:vector_map_tiles/vector_map_tiles.dart'; +import 'package:vector_tile_renderer/vector_tile_renderer.dart' as vtr; + +class OsmLibertyLayer extends StatefulWidget { + const OsmLibertyLayer({super.key}); + + @override + State<OsmLibertyLayer> createState() => _OsmLibertyLayerState(); +} + +class _OsmLibertyLayerState extends State<OsmLibertyLayer> { + late final Future<TileProviders> _tileProviderFuture; + late final Future<Style> _styleFuture; + + static const _openMapTileProviderSource = 'openmaptiles'; + + // `Americana` provides tiles, but it uses layer syntax that is not supported by the vector tile renderer. + // Full style is at 'https://americanamap.org/style.json' but it is heavy (1.0 MB, mostly for the layers). + static const _americanaTileProviderUri = 'https://tile.ourmap.us/data/v3.json'; + + // `OSM Liberty` is well supported by the vector tile renderer, but it requires an API key for the tiles. + static const _osmLibertyStyleUri = 'https://maputnik.github.io/osm-liberty/style.json'; + + // as of 2024/09/25, + // Americana provider JSON: 39.4 kB + // OSM Liberty style JSON: 48.3 kB + // OSM Liberty sprites JSON 1x: 16.6 kB + // OSM Liberty sprites PNG 1x: 30.4 kB + // OSM Liberty sprites JSON 2x: 16.6 kB + // OSM Liberty sprites PNG 2x: 82.5 kB + // -> total overhead: 233.8 kB + + @override + void initState() { + super.initState(); + + _tileProviderFuture = ExtraStyleReader.readProviderByName( + { + _openMapTileProviderSource: { + 'url': _americanaTileProviderUri, + 'type': 'vector', + }, + }, + ).then(TileProviders.new); + + _styleFuture = StyleReader( + uri: _osmLibertyStyleUri, + logger: const vtr.Logger.console(), + ).readExtra(skipSources: true); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder<TileProviders>( + future: _tileProviderFuture, + builder: (context, tileProviderSnapshot) { + return FutureBuilder<Style>( + future: _styleFuture, + builder: (context, styleSnapshot) { + if (tileProviderSnapshot.hasError) return Text(tileProviderSnapshot.error.toString()); + if (styleSnapshot.hasError) return Text(styleSnapshot.error.toString()); + + final tileProviders = tileProviderSnapshot.data; + final style = styleSnapshot.data; + if (tileProviders == null || style == null) return const SizedBox(); + + return VectorTileLayer( + tileProviders: tileProviders, + theme: style.theme, + sprites: style.sprites, + // `vector` is higher quality and follows map orientation, but it is slower + layerMode: VectorTileLayerMode.raster, + cacheFolder: () async { + final cacheRoot = await storageService.getExternalCacheDirectory(); + final path = pContext.join(cacheRoot, 'map_vector_tiles'); + dynamic result; + if (vmtio.Directory == String) { + result = path; + } else if (vmtio.Directory == io.Directory) { + result = io.Directory(path); + } else { + throw Exception('vmtio.Directory type is not supported'); + } + return result; + }, + ); + }, + ); + }, + ); + } +} diff --git a/lib/widgets/common/map/leaflet/vector_style_reader_extra.dart b/lib/widgets/common/map/leaflet/vector_style_reader_extra.dart new file mode 100644 index 0000000..3723c08 --- /dev/null +++ b/lib/widgets/common/map/leaflet/vector_style_reader_extra.dart @@ -0,0 +1,123 @@ +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:http/http.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:vector_map_tiles/vector_map_tiles.dart'; +import 'package:vector_tile_renderer/vector_tile_renderer.dart'; + +extension ExtraStyleReader on StyleReader { + Future<Style> readExtra({required bool skipSources}) async { + final styleText = await _httpGet(uri); + final style = await compute(jsonDecode, styleText); + if (style is! Map<String, dynamic>) { + throw _invalidStyle(uri); + } + final sources = style['sources'] as Map<String, dynamic>; + final Map<String, VectorTileProvider> providerByName = skipSources ? {} : await readProviderByName(sources); + final name = style['name'] as String?; + + final center = style['center']; + LatLng? centerPoint; + if (center is List && center.length == 2) { + centerPoint = LatLng((center[1] as num).toDouble(), (center[0] as num).toDouble()); + } + + double? zoom = (style['zoom'] as num?)?.toDouble(); + if (zoom != null && zoom < 2) { + zoom = null; + centerPoint = null; + } + + final spriteUri = style['sprite']; + SpriteStyle? sprites; + if (spriteUri is String && spriteUri.trim().isNotEmpty) { + final spriteUris = [ + _SpriteUri(json: '$spriteUri@2x.json?secure', image: '$spriteUri@2x.png?secure'), + _SpriteUri(json: '$spriteUri.json?secure', image: '$spriteUri.png?secure'), + ]; + for (final spriteUri in spriteUris) { + dynamic spritesJson; + try { + final spritesJsonText = await _httpGet(spriteUri.json); + spritesJson = await compute(jsonDecode, spritesJsonText); + } catch (e) { + logger.log(() => 'error reading sprite uri: ${spriteUri.json}'); + continue; + } + sprites = SpriteStyle( + atlasProvider: () => _loadBinary(spriteUri.image), + index: SpriteIndexReader(logger: logger).read(spritesJson), + ); + break; + } + } + return Style( + theme: ThemeReader(logger: logger).read(style), + providers: TileProviders(providerByName), + sprites: sprites, + name: name, + center: centerPoint, + zoom: zoom, + ); + } + + static Future<Map<String, VectorTileProvider>> readProviderByName(Map<String, dynamic> sources) async { + final providers = <String, VectorTileProvider>{}; + final sourceEntries = sources.entries.toList(); + for (final entry in sourceEntries) { + final type = TileProviderType.values.where((e) => e.name == entry.value['type']).firstOrNull; + if (type == null) continue; + dynamic source; + var entryUrl = entry.value['url'] as String?; + if (entryUrl != null) { + final sourceUrl = entryUrl; + source = await compute(jsonDecode, await _httpGet(sourceUrl)); + if (source is! Map) { + throw _invalidStyle(sourceUrl); + } + } else { + source = entry.value; + } + final entryTiles = source['tiles']; + final maxzoom = source['maxzoom'] as int? ?? 14; + final minzoom = source['minzoom'] as int? ?? 1; + if (entryTiles is List && entryTiles.isNotEmpty) { + final tileUri = entryTiles[0] as String; + final tileUrl = tileUri; + providers[entry.key] = NetworkVectorTileProvider(type: type, urlTemplate: tileUrl, maximumZoom: maxzoom, minimumZoom: minzoom); + } + } + if (providers.isEmpty) { + throw 'Unexpected response'; + } + return providers; + } + + static String _invalidStyle(String url) => 'Uri does not appear to be a valid style: $url'; + + static Future<String> _httpGet(String url) async { + final response = await get(Uri.parse(url)); + if (response.statusCode == 200) { + return response.body; + } else { + throw 'HTTP ${response.statusCode}: ${response.body}'; + } + } + + static Future<Uint8List> _loadBinary(String url) async { + final response = await get(Uri.parse(url)); + if (response.statusCode == 200) { + return response.bodyBytes; + } else { + throw 'HTTP ${response.statusCode}: ${response.body}'; + } + } +} + +class _SpriteUri { + final String json; + final String image; + + const _SpriteUri({required this.json, required this.image}); +} diff --git a/lib/widgets/common/map/map_action_delegate.dart b/lib/widgets/common/map/map_action_delegate.dart new file mode 100644 index 0000000..d9183d7 --- /dev/null +++ b/lib/widgets/common/map/map_action_delegate.dart @@ -0,0 +1,92 @@ +import 'package:aves/geo/uri.dart'; +import 'package:aves/model/device.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/add_shortcut_dialog.dart'; +import 'package:aves/widgets/dialogs/map/style_selection_dialog.dart'; +import 'package:aves/widgets/map/map_page.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class MapActionDelegate with FeedbackMixin { + final AvesMapController controller; + + const MapActionDelegate(this.controller); + + bool isVisible(BuildContext context, MapAction action) { + switch (action) { + case MapAction.selectStyle: + case MapAction.openMapApp: + case MapAction.zoomIn: + case MapAction.zoomOut: + return true; + case MapAction.addShortcut: + return device.canPinShortcut && context.currentRouteName == MapPage.routeName; + } + } + + void onActionSelected(BuildContext context, MapAction action) { + switch (action) { + case MapAction.selectStyle: + selectStyle(context); + case MapAction.openMapApp: + OpenMapAppNotification().dispatch(context); + case MapAction.zoomIn: + controller.zoomBy(1); + case MapAction.zoomOut: + controller.zoomBy(-1); + case MapAction.addShortcut: + _addShortcut(context); + } + } + + static void selectStyle(BuildContext context) { + Navigator.maybeOf(context)?.push<EntryMapStyle>( + MaterialPageRoute( + settings: const RouteSettings(name: MapStyleSelectionDialog.routeName), + builder: (context) => const MapStyleSelectionDialog(), + ), + ); + } + + Future<void> _addShortcut(BuildContext context) async { + final idleBounds = controller.idleBounds; + if (idleBounds == null) { + showFeedback(context, FeedbackType.warn, context.l10n.genericFailureFeedback); + return; + } + + final collection = context.read<CollectionLens>(); + final result = await showDialog<(AvesEntry?, String)>( + context: context, + builder: (context) => AddShortcutDialog( + defaultName: '', + collection: collection, + ), + routeSettings: const RouteSettings(name: AddShortcutDialog.routeName), + ); + if (result == null) return; + + final (coverEntry, name) = result; + if (name.isEmpty) return; + + final geoUri = toGeoUri(idleBounds.projectedCenter, zoom: idleBounds.zoom); + await appService.pinToHomeScreen( + name, + coverEntry, + route: MapPage.routeName, + filters: collection.filters, + geoUri: geoUri, + ); + if (!device.showPinShortcutFeedback) { + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } + } +} + +class OpenMapAppNotification extends Notification {} diff --git a/lib/widgets/common/providers/durations_provider.dart b/lib/widgets/common/providers/durations_provider.dart new file mode 100644 index 0000000..47c0dd3 --- /dev/null +++ b/lib/widgets/common/providers/durations_provider.dart @@ -0,0 +1,14 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:provider/provider.dart'; + +class DurationsProvider extends ProxyProvider<Settings, DurationsData> { + DurationsProvider({ + super.key, + super.child, + }) : super( + update: (context, settings, _) { + return settings.animate ? DurationsData() : DurationsData.noAnimation(); + }, + ); +} diff --git a/lib/widgets/common/providers/filter_group_provider.dart b/lib/widgets/common/providers/filter_group_provider.dart new file mode 100644 index 0000000..5aff122 --- /dev/null +++ b/lib/widgets/common/providers/filter_group_provider.dart @@ -0,0 +1,17 @@ +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +class FilterGroupProvider extends ListenableProvider<FilterGroupNotifier> { + FilterGroupProvider({ + super.key, + Uri? initialValue, + super.child, + }) : super( + create: (context) => FilterGroupNotifier(initialValue), + dispose: (context, value) => value.dispose(), + ); +} + +class FilterGroupNotifier extends ValueNotifier<Uri?> { + FilterGroupNotifier(super.value); +} diff --git a/lib/widgets/common/providers/highlight_info_provider.dart b/lib/widgets/common/providers/highlight_info_provider.dart new file mode 100644 index 0000000..5690f28 --- /dev/null +++ b/lib/widgets/common/providers/highlight_info_provider.dart @@ -0,0 +1,11 @@ +import 'package:aves/model/highlight.dart'; +import 'package:provider/provider.dart'; + +class HighlightInfoProvider extends ChangeNotifierProvider<HighlightInfo> { + HighlightInfoProvider({ + super.key, + super.child, + }) : super( + create: (context) => HighlightInfo(), + ); +} diff --git a/lib/widgets/common/providers/map_theme_provider.dart b/lib/widgets/common/providers/map_theme_provider.dart new file mode 100644 index 0000000..daa82e8 --- /dev/null +++ b/lib/widgets/common/providers/map_theme_provider.dart @@ -0,0 +1,90 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class MapTheme extends StatelessWidget { + final bool interactive, showCoordinateFilter; + final MapNavigationButton navigationButton; + final Animation<double> scale; + final VisualDensity visualDensity; + final double? mapHeight; + final EdgeInsets attributionPadding; + final Widget child; + + const MapTheme({ + super.key, + required this.interactive, + required this.showCoordinateFilter, + required this.navigationButton, + this.scale = kAlwaysCompleteAnimation, + this.visualDensity = VisualDensity.standard, + this.mapHeight, + this.attributionPadding = EdgeInsets.zero, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return ProxyProvider<Settings, MapThemeData>( + update: (context, settings, _) { + return MapThemeData( + interactive: interactive, + showCoordinateFilter: showCoordinateFilter, + navigationButton: navigationButton, + scale: scale, + visualDensity: visualDensity, + mapHeight: mapHeight, + attributionPadding: attributionPadding, + ); + }, + child: child, + ); + } + + static Widget heroFlightShuttleBuilder( + BuildContext flightContext, + Animation<double> animation, + HeroFlightDirection flightDirection, + BuildContext fromHeroContext, + BuildContext toHeroContext, + ) { + final pushing = flightDirection == HeroFlightDirection.push; + final fromMediaQuery = MediaQuery.of(fromHeroContext); + final toMediaQuery = MediaQuery.of(toHeroContext); + final fromRenderBox = fromHeroContext.findRenderObject()! as RenderBox; + final toRenderBox = toHeroContext.findRenderObject()! as RenderBox; + final fromTheme = fromHeroContext.read<MapThemeData>(); + final toTheme = toHeroContext.read<MapThemeData>(); + + return DefaultTextStyle( + style: DefaultTextStyle.of(toHeroContext).style, + child: AnimatedBuilder( + animation: animation, + builder: (context, child) { + final t = pushing ? animation.value : 1 - animation.value; + return MapTheme( + interactive: false, + showCoordinateFilter: false, + navigationButton: toTheme.navigationButton, + visualDensity: VisualDensity.lerp(fromTheme.visualDensity, toTheme.visualDensity, t), + child: MediaQuery( + data: toMediaQuery.copyWith( + padding: EdgeInsets.lerp(fromMediaQuery.padding, toMediaQuery.padding, t), + viewPadding: EdgeInsets.lerp(fromMediaQuery.viewPadding, toMediaQuery.viewPadding, t), + ), + child: Align( + alignment: Alignment.topCenter, + child: SizedBox.fromSize( + size: Size.lerp(fromRenderBox.size, toRenderBox.size, t), + child: child, + ), + ), + ), + ); + }, + child: toHeroContext.widget, + ), + ); + } +} diff --git a/lib/widgets/common/providers/media_query_data_provider.dart b/lib/widgets/common/providers/media_query_data_provider.dart new file mode 100644 index 0000000..742c775 --- /dev/null +++ b/lib/widgets/common/providers/media_query_data_provider.dart @@ -0,0 +1,21 @@ +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +class MediaQueryDataProvider extends StatelessWidget { + final MediaQueryData? value; + final Widget child; + + const MediaQueryDataProvider({ + super.key, + this.value, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return Provider<MediaQueryData>.value( + value: value ?? MediaQuery.of(context), + child: child, + ); + } +} diff --git a/lib/widgets/common/providers/query_provider.dart b/lib/widgets/common/providers/query_provider.dart new file mode 100644 index 0000000..8c05061 --- /dev/null +++ b/lib/widgets/common/providers/query_provider.dart @@ -0,0 +1,27 @@ +import 'package:aves/model/query.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +class QueryProvider extends StatelessWidget { + final bool startEnabled; + final String? initialQuery; + final Widget child; + + const QueryProvider({ + super.key, + this.startEnabled = false, + this.initialQuery, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider<Query>( + create: (context) => Query( + enabled: startEnabled, + initialValue: initialQuery, + ), + child: child, + ); + } +} diff --git a/lib/widgets/common/providers/selection_provider.dart b/lib/widgets/common/providers/selection_provider.dart new file mode 100644 index 0000000..b1bd9b6 --- /dev/null +++ b/lib/widgets/common/providers/selection_provider.dart @@ -0,0 +1,20 @@ +import 'package:aves/model/selection.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +class SelectionProvider<T> extends StatelessWidget { + final Widget child; + + const SelectionProvider({ + super.key, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider<Selection<T>>( + create: (context) => Selection<T>(), + child: child, + ); + } +} diff --git a/lib/widgets/common/providers/tile_extent_controller_provider.dart b/lib/widgets/common/providers/tile_extent_controller_provider.dart new file mode 100644 index 0000000..519f09e --- /dev/null +++ b/lib/widgets/common/providers/tile_extent_controller_provider.dart @@ -0,0 +1,24 @@ +import 'package:aves/widgets/common/tile_extent_controller.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +class TileExtentControllerProvider extends StatelessWidget { + final TileExtentController controller; + final Widget child; + + const TileExtentControllerProvider({ + super.key, + required this.controller, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) => ProxyProvider0<TileExtentController>( + update: (context, _) => controller..setViewportSize(constraints.biggest), + child: child, + ), + ); + } +} diff --git a/lib/widgets/common/providers/viewer_entry_provider.dart b/lib/widgets/common/providers/viewer_entry_provider.dart new file mode 100644 index 0000000..3b264b9 --- /dev/null +++ b/lib/widgets/common/providers/viewer_entry_provider.dart @@ -0,0 +1,17 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +class ViewerEntryProvider extends ListenableProvider<ViewerEntryNotifier> { + ViewerEntryProvider({ + super.key, + super.child, + }) : super( + create: (context) => ViewerEntryNotifier(null), + dispose: (context, value) => value.dispose(), + ); +} + +class ViewerEntryNotifier extends ValueNotifier<AvesEntry?> { + ViewerEntryNotifier(super.value); +} diff --git a/lib/widgets/common/search/delegate.dart b/lib/widgets/common/search/delegate.dart new file mode 100644 index 0000000..e48a21f --- /dev/null +++ b/lib/widgets/common/search/delegate.dart @@ -0,0 +1,150 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/search/route.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:leak_tracker/leak_tracker.dart'; +import 'package:provider/provider.dart'; + +abstract class AvesSearchDelegate extends SearchDelegate { + final String routeName; + final bool canPop; + final TextEditingController queryTextController = TextEditingController(); + final ValueNotifier<SearchBody?> currentBodyNotifier = ValueNotifier(null); + + AvesSearchDelegate({ + required this.routeName, + this.canPop = true, + String? initialQuery, + required super.searchFieldLabel, + required super.searchFieldStyle, + }) { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$AvesSearchDelegate', + object: this, + ); + } + query = initialQuery ?? ''; + } + + @override + Widget? buildLeading(BuildContext context) { + if (settings.useTvLayout) { + return const Icon(AIcons.search); + } + + // use a property instead of checking `Navigator.canPop(context)` + // because the navigator state changes as soon as we press back + // so the leading may mistakenly switch to the close button + final animate = context.read<Settings>().animate; + return canPop + ? IconButton( + icon: animate + ? AnimatedIcon( + icon: AnimatedIcons.menu_arrow, + progress: transitionAnimation, + ) + : const Icon(Icons.arrow_back), + onPressed: () => goBack(context), + tooltip: MaterialLocalizations.of(context).backButtonTooltip, + ) + : const CloseButton( + onPressed: SystemNavigator.pop, + ); + } + + @override + List<Widget>? buildActions(BuildContext context) { + return [ + if (!settings.useTvLayout && query.isNotEmpty) + IconButton( + icon: const Icon(AIcons.clear), + onPressed: () { + query = ''; + showSuggestions(context); + }, + tooltip: context.l10n.clearTooltip, + ), + ]; + } + + void goBack(BuildContext context) { + clean(); + Navigator.maybeOf(context)?.pop(); + } + + void clean() { + currentBody = null; + searchFieldFocusNode?.unfocus(); + } + + // adapted from Flutter `SearchDelegate` in `/material/search.dart` + + @override + void showResults(BuildContext context) { + if (settings.useTvLayout) { + suggestionsScrollController?.jumpTo(0); + WidgetsBinding.instance.addPostFrameCallback((_) { + suggestionsFocusNode?.requestFocus(); + FocusScope.of(context).nextFocus(); + }); + } else { + searchFieldFocusNode?.unfocus(); + currentBody = SearchBody.results; + } + } + + @override + void showSuggestions(BuildContext context) { + assert(searchFieldFocusNode != null, '_focusNode must be set by route before showSuggestions is called.'); + searchFieldFocusNode!.requestFocus(); + currentBody = SearchBody.suggestions; + } + + @override + Animation<double> get transitionAnimation => proxyAnimation; + + FocusNode? searchFieldFocusNode; + + FocusNode? get suggestionsFocusNode => null; + + ScrollController? get suggestionsScrollController => null; + + final ProxyAnimation proxyAnimation = ProxyAnimation(kAlwaysDismissedAnimation); + + @override + String get query => queryTextController.text; + + @override + set query(String value) { + queryTextController.text = value; + if (queryTextController.text.isNotEmpty) { + queryTextController.selection = TextSelection.fromPosition(TextPosition(offset: queryTextController.text.length)); + } + } + + SearchBody? get currentBody => currentBodyNotifier.value; + + set currentBody(SearchBody? value) { + currentBodyNotifier.value = value; + } + + SearchPageRoute? route; + + /// Releases the resources. + @override + @mustCallSuper + void dispose() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + currentBodyNotifier.dispose(); + queryTextController.dispose(); + proxyAnimation.parent = null; + super.dispose(); + } +} diff --git a/lib/widgets/common/search/page.dart b/lib/widgets/common/search/page.dart new file mode 100644 index 0000000..7f218e6 --- /dev/null +++ b/lib/widgets/common/search/page.dart @@ -0,0 +1,173 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/utils/debouncer.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/behaviour/pop/double_back.dart'; +import 'package:aves/widgets/common/behaviour/pop/scope.dart'; +import 'package:aves/widgets/common/behaviour/pop/tv_navigation.dart'; +import 'package:aves/widgets/common/identity/aves_app_bar.dart'; +import 'package:aves/widgets/common/search/delegate.dart'; +import 'package:aves/widgets/common/search/route.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +class SearchPage extends StatefulWidget { + static const routeName = '/search'; + + final AvesSearchDelegate delegate; + final Animation<double> animation; + + const SearchPage({ + super.key, + required this.delegate, + required this.animation, + }); + + @override + State<SearchPage> createState() => _SearchPageState(); +} + +class _SearchPageState extends State<SearchPage> { + final Debouncer _debouncer = Debouncer(delay: ADurations.searchDebounceDelay); + final FocusNode _searchFieldFocusNode = FocusNode(); + + @override + void initState() { + super.initState(); + _registerWidget(widget); + widget.animation.addStatusListener(_onAnimationStatusChanged); + _searchFieldFocusNode.addListener(_onFocusChanged); + } + + @override + void didUpdateWidget(covariant SearchPage oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.delegate != widget.delegate) { + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + } + + @override + void dispose() { + _unregisterWidget(widget); + widget.animation.removeStatusListener(_onAnimationStatusChanged); + _searchFieldFocusNode.dispose(); + super.dispose(); + } + + void _registerWidget(SearchPage widget) { + widget.delegate.queryTextController.addListener(_onQueryChanged); + widget.delegate.currentBodyNotifier.addListener(_onSearchBodyChanged); + widget.delegate.searchFieldFocusNode = _searchFieldFocusNode; + } + + void _unregisterWidget(SearchPage widget) { + widget.delegate.queryTextController.removeListener(_onQueryChanged); + widget.delegate.currentBodyNotifier.removeListener(_onSearchBodyChanged); + widget.delegate.searchFieldFocusNode = null; + } + + void _onAnimationStatusChanged(AnimationStatus status) { + if (!status.isCompleted) { + return; + } + widget.animation.removeStatusListener(_onAnimationStatusChanged); + Future.delayed(ADurations.pageTransitionLoose * timeDilation).then((_) { + if (!mounted) return; + _searchFieldFocusNode.requestFocus(); + }); + } + + void _onFocusChanged() { + if (_searchFieldFocusNode.hasFocus && widget.delegate.currentBody != SearchBody.suggestions) { + widget.delegate.showSuggestions(context); + } + } + + void _onQueryChanged() { + _debouncer(() { + if (!mounted) return; + // rebuild ourselves because query changed. + setState(() {}); + }); + } + + void _onSearchBodyChanged() { + setState(() { + // rebuild ourselves because search body changed. + }); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + Widget leading = Center(child: widget.delegate.buildLeading(context)); + Widget title = DefaultTextStyle.merge( + style: const TextStyle(fontFeatures: [FontFeature.disable('smcp')]), + child: TextField( + controller: widget.delegate.queryTextController, + focusNode: _searchFieldFocusNode, + decoration: InputDecoration( + border: InputBorder.none, + hintText: widget.delegate.searchFieldLabel, + hintStyle: theme.inputDecorationTheme.hintStyle, + ), + textInputAction: TextInputAction.search, + style: Themes.searchFieldStyle(context), + onSubmitted: (_) => widget.delegate.showResults(context), + ), + ); + Widget body; + switch (widget.delegate.currentBody) { + case SearchBody.suggestions: + body = KeyedSubtree( + key: const ValueKey<SearchBody>(SearchBody.suggestions), + child: widget.delegate.buildSuggestions(context), + ); + case SearchBody.results: + body = KeyedSubtree( + key: const ValueKey<SearchBody>(SearchBody.results), + child: widget.delegate.buildResults(context), + ); + case null: + body = const SizedBox(); + } + + final animate = context.select<Settings, bool>((v) => v.animate); + if (animate) { + leading = Hero( + tag: AvesAppBar.leadingHeroTag, + transitionOnUserGestures: true, + child: leading, + ); + title = Hero( + tag: AvesAppBar.titleHeroTag, + transitionOnUserGestures: true, + child: title, + ); + body = AnimatedSwitcher( + duration: ADurations.searchBodyTransition, + child: body, + ); + } + + return AvesScaffold( + appBar: AppBar( + leading: leading, + title: title, + actions: widget.delegate.buildActions(context), + ), + body: AvesPopScope( + handlers: [ + tvNavigationPopHandler, + doubleBackPopHandler, + ], + child: body, + ), + ); + } +} diff --git a/lib/widgets/common/search/route.dart b/lib/widgets/common/search/route.dart new file mode 100644 index 0000000..e69a1b8 --- /dev/null +++ b/lib/widgets/common/search/route.dart @@ -0,0 +1,90 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/search/delegate.dart'; +import 'package:aves/widgets/common/search/page.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +// adapted from Flutter `_SearchBody` in `/material/search.dart` +enum SearchBody { suggestions, results } + +// adapted from Flutter `_SearchPageRoute` in `/material/search.dart` +class SearchPageRoute<T> extends PageRoute<T> { + SearchPageRoute({ + required this.delegate, + }) : super(settings: RouteSettings(name: delegate.routeName)) { + assert( + delegate.route == null, + 'The ${delegate.runtimeType} instance is currently used by another active ' + 'search. Please close that search by calling close() on the SearchDelegate ' + 'before opening another search with the same delegate instance.', + ); + delegate.route = this; + } + + @override + void dispose() { + // `delegate` is always created by the caller at route creation time, + // so it should always be disposed when the route is disposed + delegate.dispose(); + super.dispose(); + } + + final AvesSearchDelegate delegate; + + @override + Color? get barrierColor => null; + + @override + String? get barrierLabel => null; + + @override + Duration get transitionDuration => const Duration(milliseconds: 300); + + @override + bool get maintainState => false; + + @override + Widget buildTransitions( + BuildContext context, + Animation<double> animation, + Animation<double> secondaryAnimation, + Widget child, + ) { + // a simple fade is usually more fitting for a search page, + // instead of the `pageTransitionsTheme` used by the rest of the app + final animate = context.read<Settings>().animate; + return animate + ? FadeTransition( + opacity: animation, + child: child, + ) + : child; + } + + @override + Animation<double> createAnimation() { + final Animation<double> animation = super.createAnimation(); + delegate.proxyAnimation.parent = animation; + return animation; + } + + @override + Widget buildPage( + BuildContext context, + Animation<double> animation, + Animation<double> secondaryAnimation, + ) { + return SearchPage( + delegate: delegate, + animation: animation, + ); + } + + @override + void didComplete(T? result) { + super.didComplete(result); + assert(delegate.route == this); + delegate.route = null; + delegate.currentBody = null; + } +} diff --git a/lib/widgets/common/thumbnail/decorated.dart b/lib/widgets/common/thumbnail/decorated.dart new file mode 100644 index 0000000..bf9d7b0 --- /dev/null +++ b/lib/widgets/common/thumbnail/decorated.dart @@ -0,0 +1,95 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:aves/widgets/common/grid/overlay.dart'; +import 'package:aves/widgets/common/grid/sections/mosaic/section_layout_builder.dart'; +import 'package:aves/widgets/common/thumbnail/image.dart'; +import 'package:aves/widgets/common/thumbnail/notifications.dart'; +import 'package:aves/widgets/common/thumbnail/overlay.dart'; +import 'package:flutter/material.dart'; + +class DecoratedThumbnail extends StatelessWidget { + final AvesEntry entry; + final double tileExtent; + final ValueNotifier<bool>? cancellableNotifier; + final bool isMosaic, selectable, highlightable; + final Object? Function()? heroTagger; + final HeroPlaceholderBuilder? heroPlaceholderBuilder; + final TransitionBuilder? imageDecorator; + + static Color borderColor(BuildContext context) => Theme.of(context).dividerColor; + + static double borderWidth(BuildContext context) => AvesBorder.straightBorderWidth(context); + + const DecoratedThumbnail({ + super.key, + required this.entry, + required this.tileExtent, + this.cancellableNotifier, + this.isMosaic = false, + this.selectable = true, + this.highlightable = true, + this.heroTagger, + this.heroPlaceholderBuilder, + this.imageDecorator, + }); + + @override + Widget build(BuildContext context) { + final double thumbnailHeight = tileExtent; + final double thumbnailWidth; + if (isMosaic) { + thumbnailWidth = + thumbnailHeight * + entry.displayAspectRatio.clamp( + MosaicSectionLayoutBuilder.minThumbnailAspectRatio, + MosaicSectionLayoutBuilder.maxThumbnailAspectRatio, + ); + } else { + thumbnailWidth = tileExtent; + } + + Widget child = ThumbnailImage( + entry: entry, + extent: tileExtent, + devicePixelRatio: MediaQuery.devicePixelRatioOf(context), + isMosaic: isMosaic, + cancellableNotifier: cancellableNotifier, + heroTag: heroTagger?.call(), + heroPlaceholderBuilder: heroPlaceholderBuilder, + ); + + child = Stack( + fit: StackFit.passthrough, + children: [ + imageDecorator?.call(context, child) ?? child, + ThumbnailEntryOverlay(entry: entry), + if (selectable) ...[ + GridItemSelectionOverlay<AvesEntry>( + item: entry, + padding: const EdgeInsets.all(2), + ), + ThumbnailZoomOverlay( + onZoom: () => OpenViewerNotification(entry).dispatch(context), + ), + ], + if (highlightable) ThumbnailHighlightOverlay(entry: entry), + ], + ); + + return Container( + // `decoration` with sub logical pixel width yields scintillating borders + // so we use `foregroundDecoration` instead + foregroundDecoration: BoxDecoration( + border: Border.fromBorderSide( + BorderSide( + color: borderColor(context), + width: borderWidth(context), + ), + ), + ), + width: thumbnailWidth, + height: thumbnailHeight, + child: child, + ); + } +} diff --git a/lib/widgets/common/thumbnail/error.dart b/lib/widgets/common/thumbnail/error.dart new file mode 100644 index 0000000..dc8336f --- /dev/null +++ b/lib/widgets/common/thumbnail/error.dart @@ -0,0 +1,80 @@ +import 'dart:io'; +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/utils/mime_utils.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +class ErrorThumbnail extends StatefulWidget { + final AvesEntry entry; + final double extent; + + const ErrorThumbnail({ + super.key, + required this.entry, + required this.extent, + }); + + @override + State<ErrorThumbnail> createState() => _ErrorThumbnailState(); +} + +class _ErrorThumbnailState extends State<ErrorThumbnail> { + late Future<bool> _exists; + + AvesEntry get entry => widget.entry; + + double get extent => widget.extent; + + @override + void initState() { + super.initState(); + final path = entry.trashDetails?.path ?? entry.path; + _exists = path != null ? File(path).exists() : SynchronousFuture(true); + } + + @override + Widget build(BuildContext context) { + final color = Themes.backgroundTextColor(context); + return FutureBuilder<bool>( + future: _exists, + builder: (context, snapshot) { + Widget child; + if (snapshot.connectionState != ConnectionState.done) { + child = const SizedBox(); + } else { + final exists = snapshot.data!; + child = exists + ? LayoutBuilder( + builder: (context, constraints) { + final fontSize = min(extent, constraints.biggest.width) / 5; + return Text( + MimeUtils.displayType(entry.mimeType), + style: TextStyle( + color: color, + fontSize: fontSize, + ), + textAlign: TextAlign.center, + ); + }, + ) + : Icon( + AIcons.broken, + size: extent / 2, + color: color, + ); + } + return Container( + alignment: Alignment.center, + color: Themes.firstLayerColor(context), + width: extent, + height: extent, + child: child, + ); + }, + ); + } +} diff --git a/lib/widgets/common/thumbnail/image.dart b/lib/widgets/common/thumbnail/image.dart new file mode 100644 index 0000000..942b05c --- /dev/null +++ b/lib/widgets/common/thumbnail/image.dart @@ -0,0 +1,353 @@ +import 'dart:math'; + +import 'package:aves/image_providers/thumbnail_provider.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/images.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/settings/enums/entry_background.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/fx/checkered_decoration.dart'; +import 'package:aves/widgets/common/fx/transition_image.dart'; +import 'package:aves/widgets/common/grid/sections/mosaic/section_layout_builder.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/common/thumbnail/error.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ThumbnailImage extends StatefulWidget { + final AvesEntry entry; + final double extent, devicePixelRatio; + final bool isMosaic, progressive; + final BoxFit? fit; + final bool showLoadingBackground; + final ValueNotifier<bool>? cancellableNotifier; + final Object? heroTag; + final HeroPlaceholderBuilder? heroPlaceholderBuilder; + + const ThumbnailImage({ + super.key, + required this.entry, + required this.extent, + required this.devicePixelRatio, + this.progressive = true, + this.isMosaic = false, + this.fit, + this.showLoadingBackground = true, + this.cancellableNotifier, + this.heroTag, + this.heroPlaceholderBuilder, + }); + + @override + State<ThumbnailImage> createState() => _ThumbnailImageState(); + + static Color computeLoadingBackgroundColor(int hashCode, Brightness brightness) { + var rgb = 0x30 + hashCode % 0x20; + if (brightness == Brightness.light) { + rgb = 0xFF - rgb; + } + return Color.fromARGB(0xFF, rgb, rgb, rgb); + } +} + +class _ThumbnailImageState extends State<ThumbnailImage> { + final _providers = <_ConditionalImageProvider>[]; + _ProviderStream? _currentProviderStream; + ImageInfo? _lastImageInfo; + Object? _lastException; + late final ImageStreamListener _streamListener; + + AvesEntry get entry => widget.entry; + + double get extent => widget.extent; + + bool get isMosaic => widget.isMosaic; + + @override + void initState() { + super.initState(); + _streamListener = ImageStreamListener(_onImageLoad, onError: _onError); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant ThumbnailImage oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.entry != entry) { + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + } + + @override + void dispose() { + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(ThumbnailImage widget) { + // TODO TLAD [leak] `widget.entry.visualChangeNotifier` + widget.entry.visualChangeNotifier.addListener(_onVisualChanged); + _initProvider(); + } + + void _unregisterWidget(ThumbnailImage widget) { + widget.entry.visualChangeNotifier.removeListener(_onVisualChanged); + _pauseProvider(); + _currentProviderStream?.stopListening(); + _currentProviderStream = null; + _replaceImage(null); + } + + void _initProvider() { + if (!entry.isDecodingSupported) return; + + _lastException = null; + _providers.clear(); + + final highQuality = entry.getThumbnail(extent: extent); + ThumbnailProvider? lowQuality; + if (widget.progressive && !entry.isSvg) { + if (entry.isVideo) { + // previously fetched thumbnail + final cached = entry.bestCachedThumbnail; + final lowQualityExtent = cached.key.extent; + if (lowQualityExtent > 0 && lowQualityExtent != extent) { + lowQuality = cached; + } + } else { + // default platform thumbnail + lowQuality = entry.getThumbnail(); + } + } + _providers.addAll([ + if (lowQuality != null) + _ConditionalImageProvider( + lowQuality, + ), + _ConditionalImageProvider( + highQuality, + _needSizedProvider, + ), + ]); + _loadNextProvider(); + } + + void _loadNextProvider([ImageInfo? imageInfo]) { + final nextIndex = _currentProviderStream == null ? 0 : (_providers.indexOf(_currentProviderStream!.provider) + 1); + if (nextIndex < _providers.length) { + final provider = _providers[nextIndex]; + if (provider.predicate?.call(imageInfo) ?? true) { + _currentProviderStream?.stopListening(); + _currentProviderStream = _ProviderStream(provider, _streamListener); + _currentProviderStream!.startListening(); + } + } + } + + void _onImageLoad(ImageInfo imageInfo, bool synchronousCall) { + _replaceImage(imageInfo); + _loadNextProvider(imageInfo); + } + + void _replaceImage(ImageInfo? imageInfo) { + _lastImageInfo?.dispose(); + _lastImageInfo = imageInfo; + if (imageInfo != null) { + setState(() {}); + } + } + + void _onError(Object exception, StackTrace? stackTrace) { + if (!mounted) return; + setState(() => _lastException = exception); + } + + bool _needSizedProvider(ImageInfo? currentImageInfo) { + if (currentImageInfo == null) return true; + final currentImage = currentImageInfo.image; + final sizedThreshold = extent * widget.devicePixelRatio; + return sizedThreshold > min(currentImage.width, currentImage.height); + } + + void _pauseProvider() async { + if (widget.cancellableNotifier?.value ?? false) { + final key = await _currentProviderStream?.provider.provider.obtainKey(ImageConfiguration.empty); + if (key is ThumbnailProviderKey) { + mediaFetchService.cancelThumbnail(key); + } + } + } + + Color? _loadingBackgroundColor; + + Color loadingBackgroundColor(BuildContext context) { + _loadingBackgroundColor ??= ThumbnailImage.computeLoadingBackgroundColor(entry.uri.hashCode, Theme.of(context).brightness); + return _loadingBackgroundColor!; + } + + @override + Widget build(BuildContext context) { + final animate = context.select<Settings, bool>((v) => v.animate); + if (!entry.isDecodingSupported || _lastException != null) { + return _buildError(context, animate); + } + + // use `RawImage` instead of `Image`, using `ImageInfo` to check dimensions + // and have more control when chaining image providers + + final thumbnailHeight = extent; + final double thumbnailWidth; + if (isMosaic) { + thumbnailWidth = + thumbnailHeight * + entry.displayAspectRatio.clamp( + MosaicSectionLayoutBuilder.minThumbnailAspectRatio, + MosaicSectionLayoutBuilder.maxThumbnailAspectRatio, + ); + } else { + thumbnailWidth = extent; + } + final canHaveAlpha = entry.canHaveAlpha; + + final fit = widget.fit ?? (entry.isSvg ? BoxFit.contain : BoxFit.cover); + final imageInfo = _lastImageInfo; + Widget image = imageInfo == null + ? Container( + color: widget.showLoadingBackground ? loadingBackgroundColor(context) : Colors.transparent, + width: thumbnailWidth, + height: thumbnailHeight, + ) + : Selector<Settings, EntryBackground>( + selector: (context, s) => s.imageBackground, + builder: (context, background, child) { + // avoid background color filter or layer when the entry cannot be transparent + final backgroundColor = canHaveAlpha && background.isColor ? background.color : null; + + if (canHaveAlpha && background == EntryBackground.checkered) { + return LayoutBuilder( + builder: (context, constraints) { + final availableSize = constraints.biggest; + final fitSize = applyBoxFit(fit, entry.displaySize, availableSize).destination; + final offset = (fitSize / 2 - availableSize / 2) as Offset; + final child = CustomPaint( + painter: CheckeredPainter(checkSize: extent / 8, offset: offset), + child: RawImage( + image: imageInfo.image, + debugImageLabel: imageInfo.debugLabel, + width: fitSize.width, + height: fitSize.height, + scale: imageInfo.scale, + fit: BoxFit.cover, + ), + ); + // the thumbnail is centered for correct decoration sizing + // when constraints are tight during hero animation + return constraints.isTight ? Center(child: child) : child; + }, + ); + } + + return RawImage( + image: imageInfo.image, + debugImageLabel: imageInfo.debugLabel, + width: thumbnailWidth, + height: thumbnailHeight, + scale: imageInfo.scale, + color: backgroundColor, + colorBlendMode: BlendMode.dstOver, + fit: fit, + ); + }, + ); + + final heroTag = widget.heroTag; + if (animate && heroTag != null) { + final background = settings.imageBackground; + final backgroundColor = background.isColor ? background.color : null; + image = Hero( + tag: heroTag, + flightShuttleBuilder: (flightContext, animation, flightDirection, fromHeroContext, toHeroContext) { + // as of Flutter v3.27.0-0.1.pre, the flight `animation` is incorrect when diverting a pop: + // - diverting a push (t = 0 -> 1) with a pop (t = 1 -> 0) works as expected (t = 0 -> [0,1] -> 0) + // - diverting a pop (t = 1 -> 0) with a push (t = 0 -> 1) finishes the pop (t = 1 -> [0,1] -> 0) instead of diverting (t = 1 -> [0,1] -> 1) + Widget child = TransitionImage( + image: entry.bestCachedThumbnail, + animation: animation, + thumbnailFit: BoxFit.cover, + viewerFit: BoxFit.contain, + background: backgroundColor, + ); + if (!settings.viewerUseCutout) { + child = SafeCutoutArea( + animation: animation, + child: child, + ); + } + return child; + }, + placeholderBuilder: widget.heroPlaceholderBuilder, + transitionOnUserGestures: true, + child: image, + ); + } + + return image; + } + + Widget _buildError(BuildContext context, bool animate) { + Widget child = ErrorThumbnail( + entry: entry, + extent: extent, + ); + + final heroTag = widget.heroTag; + if (animate && heroTag != null) { + child = Hero( + tag: heroTag, + flightShuttleBuilder: (flightContext, animation, flightDirection, fromHeroContext, toHeroContext) { + return MediaQueryDataProvider( + child: DefaultTextStyle( + style: DefaultTextStyle.of(toHeroContext).style, + child: toHeroContext.widget, + ), + ); + }, + transitionOnUserGestures: true, + child: child, + ); + } + + return child; + } + + // when the entry image itself changed (e.g. after rotation) + void _onVisualChanged() async { + // rebuild to refresh the thumbnails + _pauseProvider(); + _initProvider(); + setState(() {}); + } +} + +class _ConditionalImageProvider { + final ImageProvider provider; + final bool Function(ImageInfo?)? predicate; + + const _ConditionalImageProvider(this.provider, [this.predicate]); +} + +class _ProviderStream { + final _ConditionalImageProvider provider; + final ImageStream _stream; + final ImageStreamListener listener; + + _ProviderStream(this.provider, this.listener) : _stream = provider.provider.resolve(ImageConfiguration.empty); + + void startListening() => _stream.addListener(listener); + + void stopListening() => _stream.removeListener(listener); +} diff --git a/lib/widgets/common/thumbnail/notifications.dart b/lib/widgets/common/thumbnail/notifications.dart new file mode 100644 index 0000000..d5edca4 --- /dev/null +++ b/lib/widgets/common/thumbnail/notifications.dart @@ -0,0 +1,9 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:flutter/widgets.dart'; + +@immutable +class OpenViewerNotification extends Notification { + final AvesEntry entry; + + const OpenViewerNotification(this.entry); +} diff --git a/lib/widgets/common/thumbnail/overlay.dart b/lib/widgets/common/thumbnail/overlay.dart new file mode 100644 index 0000000..5ce5055 --- /dev/null +++ b/lib/widgets/common/thumbnail/overlay.dart @@ -0,0 +1,123 @@ +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/highlight.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/fx/sweeper.dart'; +import 'package:aves/widgets/common/grid/theme.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ThumbnailEntryOverlay extends StatelessWidget { + final AvesEntry entry; + + const ThumbnailEntryOverlay({ + super.key, + required this.entry, + }); + + @override + Widget build(BuildContext context) { + final iconBuilder = context.select<GridThemeData, GridThemeIconBuilder>((t) => t.iconBuilder); + final children = iconBuilder(context, entry); + if (children.isEmpty) return const SizedBox(); + return Align( + alignment: AlignmentDirectional.bottomStart, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: children, + ), + ); + } +} + +class ThumbnailHighlightOverlay extends StatefulWidget { + final AvesEntry entry; + + const ThumbnailHighlightOverlay({ + super.key, + required this.entry, + }); + + @override + State<ThumbnailHighlightOverlay> createState() => _ThumbnailHighlightOverlayState(); +} + +class _ThumbnailHighlightOverlayState extends State<ThumbnailHighlightOverlay> { + final ValueNotifier<bool> _highlightedNotifier = ValueNotifier(false); + + AvesEntry get entry => widget.entry; + + static const startAngle = pi * -3 / 4; + + @override + void dispose() { + _highlightedNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final highlightInfo = context.watch<HighlightInfo>(); + _highlightedNotifier.value = highlightInfo.contains(entry); + return Sweeper( + builder: (context) => Container( + decoration: BoxDecoration( + border: Border.fromBorderSide( + BorderSide( + color: Theme.of(context).colorScheme.primary, + width: context.select<GridThemeData, double>((t) => t.highlightBorderWidth), + ), + ), + ), + ), + toggledNotifier: _highlightedNotifier, + startAngle: startAngle, + centerSweep: false, + onSweepEnd: highlightInfo.clear, + ); + } +} + +class ThumbnailZoomOverlay extends StatelessWidget { + final VoidCallback? onZoom; + + const ThumbnailZoomOverlay({ + super.key, + this.onZoom, + }); + + static const alignment = AlignmentDirectional.bottomEnd; + + @override + Widget build(BuildContext context) { + final duration = context.select<DurationsData, Duration>((v) => v.formTransition); + final isSelecting = context.select<Selection<AvesEntry>, bool>((selection) => selection.isSelecting); + final interactiveDimension = context.select<GridThemeData, double>((t) => t.interactiveDimension); + return AnimatedSwitcher( + duration: duration, + child: isSelecting + ? Align( + alignment: alignment, + child: GestureDetector( + onTap: onZoom, + child: Container( + alignment: alignment, + padding: const EdgeInsets.symmetric(vertical: 1, horizontal: 2), + width: interactiveDimension, + height: interactiveDimension, + child: Icon( + AIcons.showFullscreenArrows, + size: context.select<GridThemeData, double>((t) => t.iconSize), + color: Colors.white70, + ), + ), + ), + ) + : const SizedBox(), + ); + } +} diff --git a/lib/widgets/common/thumbnail/scroller.dart b/lib/widgets/common/thumbnail/scroller.dart new file mode 100644 index 0000000..5597933 --- /dev/null +++ b/lib/widgets/common/thumbnail/scroller.dart @@ -0,0 +1,226 @@ +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/behaviour/known_extent_scroll_physics.dart'; +import 'package:aves/widgets/common/grid/theme.dart'; +import 'package:aves/widgets/common/thumbnail/decorated.dart'; +import 'package:flutter/material.dart'; + +// ✅ REMOTE support +import 'package:aves/remote/remote_origin.dart'; +import 'package:aves/remote/remote_image_tile.dart'; + +class ThumbnailScroller extends StatefulWidget { + final double availableWidth; + final int entryCount; + final AvesEntry? Function(int index) entryBuilder; + final ValueNotifier<int?> indexNotifier; + final void Function(int index)? onTap; + final Object? Function(AvesEntry entry)? heroTagger; + final bool scrollable, highlightable, showLocation; + + const ThumbnailScroller({ + super.key, + required this.availableWidth, + required this.entryCount, + required this.entryBuilder, + required this.indexNotifier, + this.onTap, + this.heroTagger, + this.highlightable = false, + this.showLocation = true, + this.scrollable = true, + }); + + @override + State<ThumbnailScroller> createState() => _ThumbnailScrollerState(); + + static double get preferredHeight => _ThumbnailScrollerState.thumbnailExtent; +} + +class _ThumbnailScrollerState extends State<ThumbnailScroller> { + final ValueNotifier<bool> _cancellableNotifier = ValueNotifier(true); + late ScrollController _scrollController; + bool _isAnimating = false, _isScrolling = false; + + static const double thumbnailExtent = 48; + static const double separatorWidth = 2; + static const double itemExtent = thumbnailExtent + separatorWidth; + + int get entryCount => widget.entryCount; + + ValueNotifier<int?> get indexNotifier => widget.indexNotifier; + + bool get scrollable => widget.scrollable; + + static double widthFor(int pageCount) => + pageCount == 0 ? 0 : pageCount * thumbnailExtent + (pageCount - 1) * separatorWidth; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant ThumbnailScroller oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.indexNotifier != widget.indexNotifier) { + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + } + + @override + void dispose() { + _unregisterWidget(widget); + _cancellableNotifier.dispose(); + super.dispose(); + } + + void _registerWidget(ThumbnailScroller widget) { + final scrollOffset = indexToScrollOffset(indexNotifier.value ?? 0); + _scrollController = ScrollController(initialScrollOffset: scrollOffset); + _scrollController.addListener(_onScrollChanged); + widget.indexNotifier.addListener(_onIndexChanged); + } + + void _unregisterWidget(ThumbnailScroller widget) { + _scrollController.removeListener(_onScrollChanged); + _scrollController.dispose(); + widget.indexNotifier.removeListener(_onIndexChanged); + } + + @override + Widget build(BuildContext context) { + final marginWidth = max(0.0, (widget.availableWidth - thumbnailExtent) / 2 - separatorWidth); + final padding = scrollable + ? EdgeInsets.only(left: marginWidth + separatorWidth, right: marginWidth) + : EdgeInsets.zero; + + return GridTheme( + extent: thumbnailExtent, + showLocation: widget.showLocation, + showTrash: false, + child: SizedBox( + width: scrollable ? null : widthFor(entryCount), + height: thumbnailExtent, + child: ListView.builder( + scrollDirection: Axis.horizontal, + controller: _scrollController, + physics: scrollable + ? KnownExtentScrollPhysics( + indexToScrollOffset: indexToScrollOffset, + scrollOffsetToIndex: scrollOffsetToIndex, + ) + : const NeverScrollableScrollPhysics(), + padding: padding, + itemExtent: itemExtent, + itemBuilder: (context, index) => _buildThumbnail(index), + itemCount: entryCount, + ), + ), + ); + } + + Widget _buildThumbnail(int index) { + final pageEntry = widget.entryBuilder(index); + if (pageEntry == null) return const SizedBox(); + + return Stack( + children: [ + GestureDetector( + onTap: () { + indexNotifier.value = index; + widget.onTap?.call(index); + }, + child: _buildThumbImage(pageEntry), + ), + IgnorePointer( + child: ValueListenableBuilder<int?>( + valueListenable: indexNotifier, + builder: (context, currentIndex, child) { + return AnimatedContainer( + color: currentIndex == index ? Colors.transparent : Colors.black45, + width: thumbnailExtent, + height: thumbnailExtent, + duration: ADurations.thumbnailScrollerShadeAnimation, + ); + }, + ), + ), + ], + ); + } + + // ✅ NEW: thumbnail remoto vs locale + Widget _buildThumbImage(AvesEntry entry) { + // REMOTE: usa RemoteImageTile (con stessa size della scroller) + if (entry.origin == RemoteOrigin.value) { + return SizedBox( + width: thumbnailExtent, + height: thumbnailExtent, + child: RemoteImageTile( + entry: entry, + borderRadius: 0, + fit: BoxFit.cover, + ), + ); + } + + // LOCALE: comportamento originale + return DecoratedThumbnail( + entry: entry, + tileExtent: thumbnailExtent, + cancellableNotifier: _cancellableNotifier, + selectable: false, + highlightable: widget.highlightable, + heroTagger: () => widget.heroTagger?.call(entry), + ); + } + + Future<void> _goTo(int index) async { + if (!scrollable) return; + + final targetOffset = indexToScrollOffset(index); + final offsetDelta = (targetOffset - _scrollController.offset).abs(); + + if (offsetDelta > widget.availableWidth * 2) { + _scrollController.jumpTo(targetOffset); + } else { + _isAnimating = true; + await _scrollController.animateTo( + targetOffset, + duration: ADurations.thumbnailScrollerScrollAnimation, + curve: Curves.easeOutCubic, + ); + _isAnimating = false; + } + } + + void _onScrollChanged() { + if (!_isAnimating) { + final index = scrollOffsetToIndex(_scrollController.offset); + if (indexNotifier.value != index) { + _isScrolling = true; + indexNotifier.value = index; + } + } + } + + void _onIndexChanged() { + if (!_isScrolling && !_isAnimating) { + final index = indexNotifier.value; + if (index != null) { + _goTo(index); + } + } + _isScrolling = false; + } + + double indexToScrollOffset(int index) => index * itemExtent; + + int scrollOffsetToIndex(double offset) => (offset / itemExtent).round(); +} diff --git a/lib/widgets/common/tile_extent_controller.dart b/lib/widgets/common/tile_extent_controller.dart new file mode 100644 index 0000000..bf4567d --- /dev/null +++ b/lib/widgets/common/tile_extent_controller.dart @@ -0,0 +1,126 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter/widgets.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +class TileExtentController { + final String settingsRouteKey; + final int columnCountMin, columnCountDefault; + final double extentMin, extentMax, spacing, horizontalPadding; + late final ValueNotifier<double> extentNotifier; + + late double userPreferredExtent; + Size _viewportSize = Size.zero; + final Set<StreamSubscription> _subscriptions = {}; + + Size get viewportSize => _viewportSize; + + TileExtentController({ + required this.settingsRouteKey, + this.columnCountMin = 2, + required this.columnCountDefault, + required this.extentMin, + required this.extentMax, + required this.spacing, + required this.horizontalPadding, + }) { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$TileExtentController', + object: this, + ); + } + // initialize extent to 0, so that it will be dynamically sized on first launch + extentNotifier = ValueNotifier(0); + userPreferredExtent = settings.getTileExtent(settingsRouteKey); + _subscriptions.add(settings.updateTileExtentStream.listen((_) => _onSettingsChanged())); + } + + void dispose() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + void _onSettingsChanged() { + if (userPreferredExtent != settings.getTileExtent(settingsRouteKey)) { + _update(); + } + } + + void setViewportSize(Size viewportSize) { + // sanitize screen size (useful when reloading while screen is off, reporting a 0,0 size) + final viewportSizeMin = Size.square(extentMin * columnCountMin); + // dimensions are rounded to prevent updates on minor changes + // e.g. available space on S10e is `Size(360.0, 721.0)` when status bar is visible, `Size(360.0, 721.3)` when it is not + final newViewportSize = Size(max(viewportSize.width, viewportSizeMin.width).roundToDouble(), max(viewportSize.height, viewportSizeMin.height).roundToDouble()); + if (_viewportSize != newViewportSize) { + _viewportSize = newViewportSize; + _update(); + } + } + + double setUserPreferredColumnCount(int columnCount) => _update(userPreferredExtent: _extentForColumnCount(columnCount)); + + double setUserPreferredExtent(double extent) => _update(userPreferredExtent: extent.roundToDouble()); + + double _update({double? userPreferredExtent}) { + final preferredExtent = userPreferredExtent ?? settings.getTileExtent(settingsRouteKey); + final targetExtent = preferredExtent > 0 ? preferredExtent : extentNotifier.value; + + final columnCount = _effectiveColumnCountForExtent(targetExtent); + final newExtent = _extentForColumnCount(columnCount).clamp(effectiveExtentMin, effectiveExtentMax); + + if (this.userPreferredExtent != preferredExtent) { + this.userPreferredExtent = preferredExtent; + settings.setTileExtent(settingsRouteKey, preferredExtent); + } + if (extentNotifier.value != newExtent) { + extentNotifier.value = newExtent; + } + return newExtent; + } + + double _extentMax() => min(extentMax, (viewportSize.shortestSide - (horizontalPadding * 2) - spacing * (columnCountMin - 1)) / columnCountMin); + + double _columnCountForExtent(double extent) => (viewportSize.width - (horizontalPadding * 2) + spacing) / (extent + spacing); + + double _extentForColumnCount(int columnCount) => (viewportSize.width - (horizontalPadding * 2) - spacing * (columnCount - 1)) / columnCount; + + int _effectiveColumnCountMin() => max(columnCountMin, _columnCountForExtent(_extentMax()).ceil()); + + int _effectiveColumnCountMax() => max(columnCountMin, _columnCountForExtent(extentMin).floor()); + + int _effectiveColumnCountForExtent(double extent) { + if (extent > 0) { + final columnCount = _columnCountForExtent(extent); + final countMax = _effectiveColumnCountMax(); + final countMin = min(_effectiveColumnCountMin(), countMax); + return columnCount.round().clamp(countMin, countMax); + } + return columnCountDefault; + } + + double get effectiveExtentMin => min(_extentForColumnCount(_effectiveColumnCountMax()), effectiveExtentMax); + + double get effectiveExtentMax => _extentForColumnCount(_effectiveColumnCountMin()); + + (int min, int max) get effectiveColumnRange => (_effectiveColumnCountMin(), _effectiveColumnCountMax()); + + int get columnCount => _effectiveColumnCountForExtent(extentNotifier.value); + + Duration getTileAnimationDelay(Duration pageTarget) { + final extent = extentNotifier.value; + final columnCount = ((viewportSize.width - (horizontalPadding * 2) + spacing) / (extent + spacing)).round(); + final rowCount = (viewportSize.height + spacing) ~/ (extent + spacing); + return pageTarget ~/ (columnCount + rowCount) * timeDilation; + } +} diff --git a/lib/widgets/debug/app_debug_action.dart b/lib/widgets/debug/app_debug_action.dart new file mode 100644 index 0000000..d126cce --- /dev/null +++ b/lib/widgets/debug/app_debug_action.dart @@ -0,0 +1,7 @@ +enum AppDebugAction { + prepScreenshotThumbnails, + prepScreenshotStats, + prepScreenshotCountries, + mediaStoreScanDir, + greenScreen, +} diff --git a/lib/widgets/debug/app_debug_page.dart b/lib/widgets/debug/app_debug_page.dart new file mode 100644 index 0000000..166c2fa --- /dev/null +++ b/lib/widgets/debug/app_debug_page.dart @@ -0,0 +1,138 @@ +import 'dart:async'; + +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/path.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/behaviour/pop/scope.dart'; +import 'package:aves/widgets/common/behaviour/pop/tv_navigation.dart'; +import 'package:aves/widgets/debug/app_debug_action.dart'; +import 'package:aves/widgets/debug/cache.dart'; +import 'package:aves/widgets/debug/capabilities.dart'; +import 'package:aves/widgets/debug/colors.dart'; +import 'package:aves/widgets/debug/database.dart'; +import 'package:aves/widgets/debug/general.dart'; +import 'package:aves/widgets/debug/leaking.dart'; +import 'package:aves/widgets/debug/media_store_scan_dialog.dart'; +import 'package:aves/widgets/debug/os_apps.dart'; +import 'package:aves/widgets/debug/os_codecs.dart'; +import 'package:aves/widgets/debug/os_paths.dart'; +import 'package:aves/widgets/debug/os_storage.dart'; +import 'package:aves/widgets/debug/report.dart'; +import 'package:aves/widgets/debug/settings.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +class AppDebugPage extends StatelessWidget { + static const routeName = '/debug'; + + const AppDebugPage({super.key}); + + @override + Widget build(BuildContext context) { + final animations = context.select<Settings, AccessibilityAnimations>((v) => v.accessibilityAnimations); + return Directionality( + textDirection: TextDirection.ltr, + child: AvesScaffold( + appBar: AppBar( + title: const Text('Debug'), + actions: [ + FontSizeIconTheme( + child: PopupMenuButton<AppDebugAction>( + // key is expected by test driver + key: const Key('appbar-menu-button'), + itemBuilder: (context) => AppDebugAction.values + .map( + (v) => PopupMenuItem( + // key is expected by test driver + key: Key('menu-${v.name}'), + value: v, + child: MenuRow(text: v.name), + ), + ) + .toList(), + onSelected: (action) async { + // wait for the popup menu to hide before proceeding with the action + await Future.delayed(animations.popUpAnimationDelay * timeDilation); + unawaited(_onActionSelected(context, action)); + }, + popUpAnimationStyle: animations.popUpAnimationStyle, + ), + ), + ], + ), + body: AvesPopScope( + handlers: [tvNavigationPopHandler], + child: SafeArea( + child: ListView( + padding: const EdgeInsets.all(8), + children: const [ + DebugGeneralSection(), + DebugLeakingSection(), + DebugCacheSection(), + DebugCapabilitiesSection(), + DebugColorSection(), + DebugAppDatabaseSection(), + DebugErrorReportingSection(), + DebugSettingsSection(), + DebugOSAppSection(), + DebugOSCodecSection(), + DebugOSPathSection(), + DebugOSStorageSection(), + ], + ), + ), + ), + ), + ); + } + + Future<void> _onActionSelected(BuildContext context, AppDebugAction action) async { + switch (action) { + case AppDebugAction.prepScreenshotThumbnails: + // get source beforehand, as widget may be unmounted during action handling + final source = context.read<CollectionSource>(); + settings.changeFilterVisibility(settings.hiddenFilters, true); + settings.changeFilterVisibility({ + TagFilter('aves-thumbnail', reversed: true), + }, false); + await favourites.clear(); + await favourites.add(source.visibleEntries); + case AppDebugAction.prepScreenshotStats: + settings.changeFilterVisibility(settings.hiddenFilters, true); + settings.changeFilterVisibility({ + PathFilter('/storage/emulated/0/Pictures/Dev'), + }, false); + case AppDebugAction.prepScreenshotCountries: + settings.changeFilterVisibility({ + LocationFilter(LocationLevel.country, 'Belgium;BE'), + LocationFilter(LocationLevel.country, 'Croatia;HR'), + }, false); + case AppDebugAction.mediaStoreScanDir: + // scan files copied from test assets + // we do it via the app instead of broadcasting via ADB + // because `MEDIA_SCANNER_SCAN_FILE` intent got deprecated in API 29 + await showDialog<String>( + context: context, + builder: (context) => const MediaStoreScanDirDialog(), + ); + case AppDebugAction.greenScreen: + await Navigator.maybeOf(context)?.push( + MaterialPageRoute( + builder: (context) => const Scaffold( + backgroundColor: Colors.green, + body: SizedBox(), + ), + ), + ); + } + } +} diff --git a/lib/widgets/debug/cache.dart b/lib/widgets/debug/cache.dart new file mode 100644 index 0000000..419e3c0 --- /dev/null +++ b/lib/widgets/debug/cache.dart @@ -0,0 +1,116 @@ +import 'package:aves/ref/locales.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:flutter/material.dart'; + +class DebugCacheSection extends StatefulWidget { + const DebugCacheSection({super.key}); + + @override + State<DebugCacheSection> createState() => _DebugCacheSectionState(); +} + +class _DebugCacheSectionState extends State<DebugCacheSection> with AutomaticKeepAliveClientMixin { + final TextEditingController _imageCacheSizeTextController = TextEditingController(); + + @override + void initState() { + super.initState(); + _imageCacheSizeTextController.text = '${imageCache.maximumSizeBytes}'; + } + + @override + void dispose() { + _imageCacheSizeTextController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + super.build(context); + + final currentSizeBytes = formatFileSize(asciiLocale, imageCache.currentSizeBytes); + final maxSizeBytes = formatFileSize(asciiLocale, imageCache.maximumSizeBytes); + return AvesExpansionTile( + title: 'Cache', + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Text('Image cache:\n\t${imageCache.currentSize}/${imageCache.maximumSize} items\n\t$currentSizeBytes/$maxSizeBytes'), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () { + imageCache.clear(); + + setState(() {}); + }, + child: const Text('Clear'), + ), + ], + ), + Row( + children: [ + Expanded( + child: TextField( + controller: _imageCacheSizeTextController, + decoration: const InputDecoration(labelText: 'imageCache size bytes'), + keyboardType: TextInputType.number, + ), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () { + final size = int.tryParse(_imageCacheSizeTextController.text); + if (size != null) { + imageCache.maximumSizeBytes = size; + } else { + _imageCacheSizeTextController.text = '${imageCache.maximumSizeBytes}'; + } + setState(() {}); + }, + child: const Text('Apply'), + ), + ], + ), + const Divider(), + Row( + children: [ + const Expanded( + child: Text('Glide disk cache: ?'), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: mediaFetchService.clearImageDiskCache, + child: const Text('Clear'), + ), + ], + ), + Row( + children: [ + const Expanded( + child: Text('Glide memory cache: ?'), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: mediaFetchService.clearImageMemoryCache, + child: const Text('Clear'), + ), + ], + ), + ], + ), + ), + ], + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/widgets/debug/capabilities.dart b/lib/widgets/debug/capabilities.dart new file mode 100644 index 0000000..7f8d45a --- /dev/null +++ b/lib/widgets/debug/capabilities.dart @@ -0,0 +1,134 @@ +import 'package:aves/model/device.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/identity/highlight_title.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:flutter/material.dart'; + +class DebugCapabilitiesSection extends StatefulWidget { + const DebugCapabilitiesSection({super.key}); + + @override + State<DebugCapabilitiesSection> createState() => _DebugCapabilitiesSectionState(); +} + +class _DebugCapabilitiesSectionState extends State<DebugCapabilitiesSection> with AutomaticKeepAliveClientMixin { + late final Future<List<dynamic>> _appFuture, _windowFuture; + + @override + void initState() { + super.initState(); + _appFuture = Future.wait([ + appProfileService.canInteractAcrossProfiles(), + appProfileService.canRequestInteractAcrossProfiles(), + appProfileService.getTargetUserProfiles(), + ]); + _windowFuture = Future.wait([ + windowService.isCutoutAware(), + windowService.isRotationLocked(), + windowService.supportsHdr(), + windowService.supportsWideGamut(), + ]); + } + + @override + Widget build(BuildContext context) { + super.build(context); + return AvesExpansionTile( + title: 'Capabilities', + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const HighlightTitle(title: 'Device'), + InfoRowGroup( + info: { + 'canAuthenticateUser': '${device.canAuthenticateUser}', + 'canPinShortcut': '${device.canPinShortcut}', + 'canRenderSubdivisionFlagEmojis': '${device.canRenderSubdivisionFlagEmojis}', + 'canRequestManageMedia': '${device.canRequestManageMedia}', + 'hasGeocoder': '${device.hasGeocoder}', + 'isDynamicColorAvailable': '${device.isDynamicColorAvailable}', + 'isTelevision': '${device.isTelevision}', + 'showPinShortcutFeedback': '${device.showPinShortcutFeedback}', + 'supportEdgeToEdgeUIMode': '${device.supportEdgeToEdgeUIMode}', + 'supportPictureInPicture': '${device.supportPictureInPicture}', + }, + ), + ], + ), + ), + FutureBuilder<List<dynamic>>( + future: _windowFuture, + builder: (context, snapshot) { + final data = snapshot.data; + if (data == null) { + return const SizedBox(); + } + final [ + bool isCutoutAware, + bool isRotationLocked, + bool supportsHdr, + bool supportsWideGamut, + ] = data; + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const HighlightTitle(title: 'Window'), + InfoRowGroup( + info: { + 'isCutoutAware': '$isCutoutAware', + 'isRotationLocked': '$isRotationLocked', + 'supportsHdr': '$supportsHdr', + 'supportsWideGamut': '$supportsWideGamut', + }, + ), + ], + ), + ); + }, + ), + FutureBuilder<List<dynamic>>( + future: _appFuture, + builder: (context, snapshot) { + final data = snapshot.data; + if (data == null) { + return const SizedBox(); + } + final [ + bool canInteractAcrossProfiles, + bool canRequestInteractAcrossProfiles, + List<String> targetUserProfiles, + ] = data; + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const HighlightTitle(title: 'App'), + InfoRowGroup( + info: { + 'userAgent': device.userAgent, + 'canInteractAcrossProfiles': '$canInteractAcrossProfiles', + 'canRequestInteractAcrossProfiles': '$canRequestInteractAcrossProfiles', + 'targetUserProfiles': '$targetUserProfiles', + }, + ), + ], + ), + ); + }, + ), + ], + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/widgets/debug/colors.dart b/lib/widgets/debug/colors.dart new file mode 100644 index 0000000..52bebdc --- /dev/null +++ b/lib/widgets/debug/colors.dart @@ -0,0 +1,99 @@ +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:flex_color_picker/flex_color_picker.dart'; +import 'package:flutter/material.dart'; + +class DebugColorSection extends StatefulWidget { + const DebugColorSection({super.key}); + + @override + State<DebugColorSection> createState() => _DebugColorSectionState(); +} + +class _DebugColorSectionState extends State<DebugColorSection> with AutomaticKeepAliveClientMixin { + @override + Widget build(BuildContext context) { + super.build(context); + + final scheme = Theme.of(context).colorScheme; + final List<(String, Color)> colors = [ + ('primary', scheme.primary), + ('onPrimary', scheme.onPrimary), + ('primaryContainer', scheme.primaryContainer), + ('onPrimaryContainer', scheme.onPrimaryContainer), + ('primaryFixed', scheme.primaryFixed), + ('primaryFixedDim', scheme.primaryFixedDim), + ('onPrimaryFixed', scheme.onPrimaryFixed), + ('onPrimaryFixedVariant', scheme.onPrimaryFixedVariant), + ('secondary', scheme.secondary), + ('onSecondary', scheme.onSecondary), + ('secondaryContainer', scheme.secondaryContainer), + ('onSecondaryContainer', scheme.onSecondaryContainer), + ('secondaryFixed', scheme.secondaryFixed), + ('secondaryFixedDim', scheme.secondaryFixedDim), + ('onSecondaryFixed', scheme.onSecondaryFixed), + ('onSecondaryFixedVariant', scheme.onSecondaryFixedVariant), + ('tertiary', scheme.tertiary), + ('onTertiary', scheme.onTertiary), + ('tertiaryContainer', scheme.tertiaryContainer), + ('onTertiaryContainer', scheme.onTertiaryContainer), + ('tertiaryFixed', scheme.tertiaryFixed), + ('tertiaryFixedDim', scheme.tertiaryFixedDim), + ('onTertiaryFixed', scheme.onTertiaryFixed), + ('onTertiaryFixedVariant', scheme.onTertiaryFixedVariant), + ('error', scheme.error), + ('onError', scheme.onError), + ('errorContainer', scheme.errorContainer), + ('onErrorContainer', scheme.onErrorContainer), + ('surface', scheme.surface), + ('onSurface', scheme.onSurface), + ('surfaceDim', scheme.surfaceDim), + ('surfaceBright', scheme.surfaceBright), + ('surfaceContainerLowest', scheme.surfaceContainerLowest), + ('surfaceContainerLow', scheme.surfaceContainerLow), + ('surfaceContainer', scheme.surfaceContainer), + ('surfaceContainerHigh', scheme.surfaceContainerHigh), + ('surfaceContainerHighest', scheme.surfaceContainerHighest), + ('onSurfaceVariant', scheme.onSurfaceVariant), + ('outline', scheme.outline), + ('outlineVariant', scheme.outlineVariant), + ('shadow', scheme.shadow), + ('scrim', scheme.scrim), + ('inverseSurface', scheme.inverseSurface), + ('onInverseSurface', scheme.onInverseSurface), + ('inversePrimary', scheme.inversePrimary), + ('surfaceTint', scheme.surfaceTint), + ]; + return AvesExpansionTile( + title: 'Colors', + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Column( + children: colors.map((kv) { + final (text, color) = kv; + return Row( + children: [ + Text(text), + const Spacer(), + Text( + color.hex, + style: const TextStyle(fontFamily: 'monospace'), + ), + const SizedBox(width: 4), + Container( + width: 20, + height: 20, + color: color, + ), + ], + ); + }).toList(), + ), + ), + ], + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/widgets/debug/database.dart b/lib/widgets/debug/database.dart new file mode 100644 index 0000000..88e6aeb --- /dev/null +++ b/lib/widgets/debug/database.dart @@ -0,0 +1,324 @@ +import 'package:aves/model/covers.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/metadata/address.dart'; +import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/metadata/trash.dart'; +import 'package:aves/model/vaults/details.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/model/viewer/video_playback.dart'; +import 'package:aves/ref/locales.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class DebugAppDatabaseSection extends StatefulWidget { + const DebugAppDatabaseSection({super.key}); + + @override + State<DebugAppDatabaseSection> createState() => _DebugAppDatabaseSectionState(); +} + +class _DebugAppDatabaseSectionState extends State<DebugAppDatabaseSection> + with AutomaticKeepAliveClientMixin { + late Future<int> _dbFileSizeLoader; + late Future<Set<AvesEntry>> _dbEntryLoader; + late Future<Map<int?, int?>> _dbDateLoader; + late Future<Set<CatalogMetadata>> _dbMetadataLoader; + late Future<Set<AddressDetails>> _dbAddressLoader; + late Future<Set<TrashDetails>> _dbTrashLoader; + late Future<Set<VaultDetails>> _dbVaultsLoader; + late Future<Set<FavouriteRow>> _dbFavouritesLoader; + late Future<Set<CoverRow>> _dbCoversLoader; + late Future<Set<VideoPlaybackRow>> _dbVideoPlaybackLoader; + + @override + void initState() { + super.initState(); + _startDbReport(); + } + + @override + void dispose() { + _disposeLoadedContent(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + super.build(context); + + return AvesExpansionTile( + title: 'Database', + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Column( + children: [ + FutureBuilder<int>( + future: _dbFileSizeLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + + return Row( + children: [ + Expanded( + child: Text( + 'DB file size: ${formatFileSize(asciiLocale, snapshot.data!)}', + ), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () => localMediaDb.reset().then((_) => _reload()), + child: const Text('Reset'), + ), + ], + ); + }, + ), + + // ENTRIES + FutureBuilder<Set<AvesEntry>>( + future: _dbEntryLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + + final entries = snapshot.data!; + final byOrigin = groupBy<AvesEntry, int>(entries, (entry) => entry.origin); + + return Row( + children: [ + Expanded( + child: Text( + 'entry rows: ${entries.length} ' + '(${byOrigin.entries.map((kv) => '${kv.key}: ${kv.value.length}').join(', ')})', + ), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () => localMediaDb.clearEntries().then((_) => _reload()), + child: const Text('Clear'), + ), + ], + ); + }, + ), + + // DATES + FutureBuilder<Map<int?, int?>>( + future: _dbDateLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + + return Row( + children: [ + Expanded(child: Text('date rows: ${snapshot.data!.length}')), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () => localMediaDb.clearDates().then((_) => _reload()), + child: const Text('Clear'), + ), + ], + ); + }, + ), + + // METADATA + FutureBuilder<Set>( + future: _dbMetadataLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + + return Row( + children: [ + Expanded(child: Text('metadata rows: ${snapshot.data!.length}')), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () => localMediaDb.clearCatalogMetadata().then((_) => _reload()), + child: const Text('Clear'), + ), + ], + ); + }, + ), + + // ADDRESSES + FutureBuilder<Set>( + future: _dbAddressLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + + return Row( + children: [ + Expanded(child: Text('address rows: ${snapshot.data!.length}')), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () => localMediaDb.clearAddresses().then((_) => _reload()), + child: const Text('Clear'), + ), + ], + ); + }, + ), + + // TRASH + FutureBuilder<Set>( + future: _dbTrashLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + + return Row( + children: [ + Expanded(child: Text('trash rows: ${snapshot.data!.length}')), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () => localMediaDb.clearTrashDetails().then((_) => _reload()), + child: const Text('Clear'), + ), + ], + ); + }, + ), + + // VAULTS + FutureBuilder<Set>( + future: _dbVaultsLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + + return Row( + children: [ + Expanded( + child: Text( + 'vault rows: ${snapshot.data!.length} (${vaults.all.length} in memory)', + ), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () => vaults.clear().then((_) => _reload()), + child: const Text('Clear'), + ), + ], + ); + }, + ), + + // FAVOURITES + FutureBuilder<Set>( + future: _dbFavouritesLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + + return Row( + children: [ + Expanded( + child: Text( + 'favourite rows: ${snapshot.data!.length} (${favourites.count} in memory)', + ), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () => favourites.clear().then((_) => _reload()), + child: const Text('Clear'), + ), + ], + ); + }, + ), + + // COVERS + FutureBuilder<Set>( + future: _dbCoversLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + + return Row( + children: [ + Expanded( + child: Text( + 'covers: ${snapshot.data!.length} rows\n(${covers.count} in memory)', + ), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () => localMediaDb.loadAllCovers().then((list) { + debugPrint('covers dump start'); + list.forEach((v) => debugPrint(' $v')); + debugPrint('covers dump end'); + }), + child: const Text('Dump'), + ), + ElevatedButton( + onPressed: () => covers.clear().then((_) => _reload()), + child: const Text('Clear'), + ), + ], + ); + }, + ), + + // VIDEO PLAYBACK + FutureBuilder<Set>( + future: _dbVideoPlaybackLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + + return Row( + children: [ + Expanded( + child: Text('video playback rows: ${snapshot.data!.length}'), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () => localMediaDb.clearVideoPlayback().then((_) => _reload()), + child: const Text('Clear'), + ), + ], + ); + }, + ), + ], + ), + ), + ], + ); + } + + Future<void> _reload() async { + await _disposeLoadedContent(); + _startDbReport(); + } + + void _startDbReport() { + _dbFileSizeLoader = localMediaDb.dbFileSize(); + _dbEntryLoader = localMediaDb.loadEntries(); + _dbDateLoader = localMediaDb.loadDates(); + _dbMetadataLoader = localMediaDb.loadCatalogMetadata(); + _dbAddressLoader = localMediaDb.loadAddresses(); + _dbTrashLoader = localMediaDb.loadAllTrashDetails(); + _dbVaultsLoader = localMediaDb.loadAllVaults(); + _dbFavouritesLoader = localMediaDb.loadAllFavourites(); + _dbCoversLoader = localMediaDb.loadAllCovers(); + _dbVideoPlaybackLoader = localMediaDb.loadAllVideoPlayback(); + setState(() {}); + } + + Future<void> _disposeLoadedContent() async { + (await _dbEntryLoader).forEach((v) => v.dispose()); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/widgets/debug/general.dart b/lib/widgets/debug/general.dart new file mode 100644 index 0000000..48ba404 --- /dev/null +++ b/lib/widgets/debug/general.dart @@ -0,0 +1,137 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/analysis_service.dart'; +import 'package:aves/services/common/service_policy.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +class DebugGeneralSection extends StatefulWidget { + const DebugGeneralSection({super.key}); + + @override + State<DebugGeneralSection> createState() => _DebugGeneralSectionState(); +} + +class _DebugGeneralSectionState extends State<DebugGeneralSection> with AutomaticKeepAliveClientMixin { + static OverlayEntry? _taskQueueOverlayEntry; + + @override + Widget build(BuildContext context) { + super.build(context); + + final source = context.read<CollectionSource>(); + final visibleEntries = source.visibleEntries; + final catalogued = visibleEntries.where((entry) => entry.isCatalogued); + final withGps = catalogued.where((entry) => entry.hasGps); + final withAddress = withGps.where((entry) => entry.hasAddress); + final withFineAddress = withGps.where((entry) => entry.hasFineAddress); + + return AvesExpansionTile( + title: 'General', + children: [ + const Padding( + padding: EdgeInsets.all(8), + child: Text('Time dilation'), + ), + Slider( + value: timeDilation, + onChanged: (v) => setState(() => timeDilation = v), + min: 1.0, + max: 10.0, + divisions: 9, + label: '$timeDilation', + ), + SwitchListTile( + value: _taskQueueOverlayEntry != null, + onChanged: (v) { + _taskQueueOverlayEntry + ?..remove() + ..dispose(); + _taskQueueOverlayEntry = null; + if (v) { + _taskQueueOverlayEntry = OverlayEntry( + builder: (context) => const _TaskQueueOverlay(), + ); + Overlay.of(context).insert(_taskQueueOverlayEntry!); + } + setState(() {}); + }, + title: const Text('Show tasks overlay'), + ), + SettingsSwitchListTile( + selector: (context, s) => s.debugShowViewerTiles, + onChanged: (v) => settings.debugShowViewerTiles = v, + title: 'Show viewer tiles', + ), + ElevatedButton( + onPressed: () => AnalysisService.startService(force: false), + child: const Text('Start analysis service'), + ), + const Divider(), + Padding( + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), + child: InfoRowGroup( + info: { + 'All entries': '${source.allEntries.length}', + 'Visible entries': '${visibleEntries.length}', + 'Catalogued': '${catalogued.length}', + 'With GPS': '${withGps.length}', + 'With address': '${withAddress.length}', + 'With fine address': '${withFineAddress.length}', + }, + ), + ), + ], + ); + } + + @override + bool get wantKeepAlive => true; +} + +class _TaskQueueOverlay extends StatelessWidget { + const _TaskQueueOverlay(); + + @override + Widget build(BuildContext context) { + return IgnorePointer( + child: DefaultTextStyle( + style: const TextStyle(), + child: Align( + alignment: AlignmentDirectional.bottomStart, + child: SafeArea( + child: Container( + color: Colors.indigo.shade900.withAlpha(0xCC), + padding: const EdgeInsets.all(8), + child: StreamBuilder<QueueState>( + stream: servicePolicy.queueStream, + builder: (context, snapshot) { + if (snapshot.hasError) return const SizedBox(); + final queuedEntries = <MapEntry<dynamic, int>>[]; + if (snapshot.hasData) { + final state = snapshot.data!; + queuedEntries.add(MapEntry('run', state.runningCount)); + queuedEntries.add(MapEntry('paused', state.pausedCount)); + queuedEntries.addAll(state.queueByPriority.entries.map((kv) => MapEntry(kv.key.toString(), kv.value))); + } + queuedEntries.sort((a, b) => a.key.compareTo(b.key)); + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text(queuedEntries.map((kv) => '${kv.key}: ${kv.value}').join(', ')), + ], + ); + }, + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/debug/leaking.dart b/lib/widgets/debug/leaking.dart new file mode 100644 index 0000000..7a97808 --- /dev/null +++ b/lib/widgets/debug/leaking.dart @@ -0,0 +1,180 @@ +import 'dart:io'; + +import 'package:aves/ref/locales.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +class DebugLeakingSection extends StatefulWidget { + const DebugLeakingSection({super.key}); + + @override + State<DebugLeakingSection> createState() => _DebugLeakingSectionState(); +} + +class _DebugLeakingSectionState extends State<DebugLeakingSection> with AutomaticKeepAliveClientMixin { + static OverlayEntry? _collectorOverlayEntry; + + static const _leakIgnoreConfig = IgnoredLeaks( + experimentalNotGCed: IgnoredLeaksSet(), + notDisposed: IgnoredLeaksSet(), + ); + + @override + Widget build(BuildContext context) { + super.build(context); + + return AvesExpansionTile( + title: 'Leaking', + children: [ + SwitchListTile( + value: _collectorOverlayEntry != null, + onChanged: (v) { + _collectorOverlayEntry + ?..remove() + ..dispose(); + _collectorOverlayEntry = null; + if (v) { + _collectorOverlayEntry = OverlayEntry( + builder: (context) => const _CollectorOverlay(), + ); + Overlay.of(context).insert(_collectorOverlayEntry!); + } + setState(() {}); + }, + title: const Text('Show leak report overlay'), + ), + ElevatedButton( + onPressed: () => LeakTracking.collectLeaks().then((leaks) { + LeakTracking.phase = const PhaseSettings( + ignoredLeaks: _leakIgnoreConfig, + leakDiagnosticConfig: LeakDiagnosticConfig( + collectRetainingPathForNotGCed: true, + collectStackTraceOnStart: true, + collectStackTraceOnDisposal: true, + ), + ); + }), + child: const Text('Track leaks with stacks'), + ), + ElevatedButton( + onPressed: () => LeakTracking.collectLeaks().then((leaks) { + LeakTracking.phase = const PhaseSettings( + ignoredLeaks: _leakIgnoreConfig, + leakDiagnosticConfig: LeakDiagnosticConfig( + collectRetainingPathForNotGCed: true, + collectStackTraceOnStart: false, + collectStackTraceOnDisposal: false, + ), + ); + }), + child: const Text('Track leaks without stacks'), + ), + ], + ); + } + + @override + bool get wantKeepAlive => true; +} + +class _CollectorOverlay extends StatefulWidget { + const _CollectorOverlay(); + + @override + State<_CollectorOverlay> createState() => _CollectorOverlayState(); +} + +class _CollectorOverlayState extends State<_CollectorOverlay> { + AlignmentGeometry _alignment = AlignmentDirectional.bottomStart; + + @override + Widget build(BuildContext context) { + return DefaultTextStyle( + style: const TextStyle(), + child: Align( + alignment: _alignment, + child: SafeArea( + child: Container( + color: Colors.indigo.shade900.withAlpha(0xCC), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + IconButton( + onPressed: () => setState(() => _alignment = _alignment == AlignmentDirectional.bottomStart ? AlignmentDirectional.topStart : AlignmentDirectional.bottomStart), + icon: Icon(_alignment == AlignmentDirectional.bottomStart ? Icons.vertical_align_top_outlined : Icons.vertical_align_bottom_outlined), + ), + ...LeakType.values.map((type) { + return OutlinedButton( + style: ButtonStyle( + padding: WidgetStateProperty.all(const EdgeInsets.all(6)), + minimumSize: WidgetStateProperty.all(Size.zero), + ), + onPressed: () => LeakTracking.collectLeaks().then((leaks) { + final reports = leaks.byType[type] ?? []; + _printLeaks(type, reports); + }), + child: Text(type.name), + ); + }), + ], + ), + Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + StreamBuilder( + stream: Stream.periodic(const Duration(seconds: 1)), + builder: (context, snapshot) { + final currentRss = formatFileSize(asciiLocale, ProcessInfo.currentRss); + final maxRss = formatFileSize(asciiLocale, ProcessInfo.maxRss); + return Text('RSS: $currentRss / $maxRss'); + }, + ), + ], + ), + Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + StreamBuilder( + stream: Stream.periodic(const Duration(seconds: 1)), + builder: (context, snapshot) { + final currentImageCache = formatFileSize(asciiLocale, imageCache.currentSizeBytes); + final maxImageCache = formatFileSize(asciiLocale, imageCache.maximumSizeBytes); + return Text('imageCache: $currentImageCache / $maxImageCache'); + }, + ), + ], + ), + ], + ), + ), + ), + ), + ); + } + + void _printLeaks(LeakType type, List<LeakReport> reports) { + debugPrint('* leak type=$type, ${reports.length} reports'); + groupBy(reports, (report) => report.type).forEach((reportType, typedReports) { + debugPrint(' * report type=$reportType'); + groupBy(typedReports, (report) => report.trackedClass).forEach((trackedClass, classedReports) { + debugPrint(' trackedClass=$trackedClass reports=${classedReports.length}'); + classedReports.forEach((report) { + final phase = report.phase; + final retainingPath = report.retainingPath; + final detailedPath = report.detailedPath; + final context = report.context; + if (phase != null || retainingPath != null || detailedPath != null || context != null) { + debugPrint(' phase=$phase retainingPath=$retainingPath detailedPath=$detailedPath context=$context'); + } + }); + }); + }); + } +} diff --git a/lib/widgets/debug/media_store_scan_dialog.dart b/lib/widgets/debug/media_store_scan_dialog.dart new file mode 100644 index 0000000..1189d2a --- /dev/null +++ b/lib/widgets/debug/media_store_scan_dialog.dart @@ -0,0 +1,51 @@ +import 'dart:io'; + +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/material.dart'; + +class MediaStoreScanDirDialog extends StatefulWidget { + const MediaStoreScanDirDialog({super.key}); + + @override + State<MediaStoreScanDirDialog> createState() => _MediaStoreScanDirDialogState(); +} + +class _MediaStoreScanDirDialogState extends State<MediaStoreScanDirDialog> { + final TextEditingController _pathController = TextEditingController(); + bool _processing = false; + + @override + void dispose() { + _pathController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AvesDialog( + content: _processing ? const CircularProgressIndicator() : TextField(controller: _pathController), + actions: [ + TextButton( + onPressed: _processing + ? null + : () async { + final dir = _pathController.text; + if (dir.isNotEmpty) { + setState(() => _processing = true); + await Future.forEach<FileSystemEntity>(Directory(dir).listSync(recursive: true), (file) async { + if (file is File) { + final mimeType = MimeTypes.forExtension(pContext.extension(file.path)); + await mediaStoreService.scanFile(file.path, mimeType!); + } + }); + } + Navigator.maybeOf(context)?.pop(); + }, + child: const Text('Scan'), + ), + ], + ); + } +} diff --git a/lib/widgets/debug/os_apps.dart b/lib/widgets/debug/os_apps.dart new file mode 100644 index 0000000..684be93 --- /dev/null +++ b/lib/widgets/debug/os_apps.dart @@ -0,0 +1,122 @@ +import 'package:aves/image_providers/app_icon_image_provider.dart'; +import 'package:aves/model/app_inventory.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/basic/query_bar.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class DebugOSAppSection extends StatefulWidget { + const DebugOSAppSection({super.key}); + + @override + State<DebugOSAppSection> createState() => _DebugOSAppSectionState(); +} + +class _DebugOSAppSectionState extends State<DebugOSAppSection> with AutomaticKeepAliveClientMixin { + late Future<Set<Package>> _loader; + final ValueNotifier<String> _queryNotifier = ValueNotifier(''); + + static const iconSize = 20.0; + + @override + void initState() { + super.initState(); + _loader = appService.getPackages(); + } + + @override + void dispose() { + _queryNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + super.build(context); + + return AvesExpansionTile( + title: 'OS Apps', + children: [ + Padding( + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), + child: FutureBuilder<Set<Package>>( + future: _loader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final packages = snapshot.data!.toList()..sort((a, b) => compareAsciiUpperCase(a.packageName, b.packageName)); + final enabledTheme = IconTheme.of(context); + final disabledTheme = enabledTheme.merge(const IconThemeData(opacity: .2)); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + QueryBar(queryNotifier: _queryNotifier), + ...packages.map((package) { + return ValueListenableBuilder<String>( + valueListenable: _queryNotifier, + builder: (context, query, child) { + if ({package.packageName, ...package.potentialDirs}.none((v) => v.toLowerCase().contains(query.toLowerCase()))) { + return const SizedBox(); + } + return Text.rich( + TextSpan( + children: [ + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Image( + image: AppIconImage( + packageName: package.packageName, + size: iconSize, + ), + width: iconSize, + height: iconSize, + ), + ), + TextSpan( + text: ' ${package.packageName}\n', + style: InfoRowGroup.keyStyle(context), + ), + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: IconTheme( + data: package.categoryLauncher ? enabledTheme : disabledTheme, + child: const Icon( + Icons.launch_outlined, + size: iconSize, + ), + ), + ), + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: IconTheme( + data: package.isSystem ? enabledTheme : disabledTheme, + child: const Icon( + Icons.android, + size: iconSize, + ), + ), + ), + TextSpan( + text: ' ${package.potentialDirs.join(', ')}\n', + style: InfoRowGroup.valueStyle, + ), + ], + ), + ); + }, + ); + }), + ], + ); + }, + ), + ), + ], + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/widgets/debug/os_codecs.dart b/lib/widgets/debug/os_codecs.dart new file mode 100644 index 0000000..067c47d --- /dev/null +++ b/lib/widgets/debug/os_codecs.dart @@ -0,0 +1,86 @@ +import 'package:aves/services/android_debug_service.dart'; +import 'package:aves/widgets/common/basic/query_bar.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/identity/highlight_title.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class DebugOSCodecSection extends StatefulWidget { + const DebugOSCodecSection({super.key}); + + @override + State<DebugOSCodecSection> createState() => _DebugOSCodecSectionState(); +} + +class _DebugOSCodecSectionState extends State<DebugOSCodecSection> with AutomaticKeepAliveClientMixin { + late Future<List<Map>> _loader; + final ValueNotifier<String> _queryNotifier = ValueNotifier(''); + + @override + void initState() { + super.initState(); + _loader = AndroidDebugService.getCodecs(); + } + + @override + void dispose() { + _queryNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + super.build(context); + + return AvesExpansionTile( + title: 'OS Codecs', + children: [ + Padding( + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), + child: FutureBuilder<List<Map>>( + future: _loader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final codecs = snapshot.data!.map((codec) { + return codec.map((k, v) => MapEntry(k.toString(), v.toString())); + }).toList()..sort((a, b) => compareAsciiUpperCase(a['supportedTypes'] ?? '', b['supportedTypes'] ?? '')); + final byEncoder = groupBy<Map<String, String>, bool>(codecs, (v) => v['isEncoder'] == 'true'); + final decoders = byEncoder[false] ?? []; + final encoders = byEncoder[true] ?? []; + Widget _toCodecColumn(List<Map<String, String>> codecs) => ValueListenableBuilder<String>( + valueListenable: _queryNotifier, + builder: (context, query, child) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: codecs.expand((v) { + final types = v['supportedTypes']; + return (query.isEmpty || types == null || types.contains(query)) + ? [ + InfoRowGroup(info: Map.fromEntries(v.entries.where((kv) => kv.key != 'isEncoder'))), + const Divider(), + ] + : <Widget>[]; + }).toList(), + ), + ); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + QueryBar(queryNotifier: _queryNotifier), + const HighlightTitle(title: 'Decoders'), + _toCodecColumn(decoders), + const HighlightTitle(title: 'Encoders'), + _toCodecColumn(encoders), + ], + ); + }, + ), + ), + ], + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/widgets/debug/os_paths.dart b/lib/widgets/debug/os_paths.dart new file mode 100644 index 0000000..1b1734a --- /dev/null +++ b/lib/widgets/debug/os_paths.dart @@ -0,0 +1,49 @@ +import 'dart:collection'; + +import 'package:aves/services/android_debug_service.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:flutter/material.dart'; + +class DebugOSPathSection extends StatefulWidget { + const DebugOSPathSection({super.key}); + + @override + State<DebugOSPathSection> createState() => _DebugOSPathSectionState(); +} + +class _DebugOSPathSectionState extends State<DebugOSPathSection> with AutomaticKeepAliveClientMixin { + late Future<Map> _loader; + + @override + void initState() { + super.initState(); + _loader = AndroidDebugService.getContextDirs(); + } + + @override + Widget build(BuildContext context) { + super.build(context); + + return AvesExpansionTile( + title: 'OS Paths', + children: [ + Padding( + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), + child: FutureBuilder<Map>( + future: _loader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final data = SplayTreeMap.of(snapshot.data!.map((k, v) => MapEntry(k.toString(), v?.toString() ?? 'null'))); + return InfoRowGroup(info: data); + }, + ), + ), + ], + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/widgets/debug/os_storage.dart b/lib/widgets/debug/os_storage.dart new file mode 100644 index 0000000..a54d2ca --- /dev/null +++ b/lib/widgets/debug/os_storage.dart @@ -0,0 +1,64 @@ +import 'package:aves/ref/locales.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:flutter/material.dart'; + +class DebugOSStorageSection extends StatefulWidget { + const DebugOSStorageSection({super.key}); + + @override + State<DebugOSStorageSection> createState() => _DebugOSStorageSectionState(); +} + +class _DebugOSStorageSectionState extends State<DebugOSStorageSection> with AutomaticKeepAliveClientMixin { + final Map<String, int?> _freeSpaceByVolume = {}; + + @override + void initState() { + super.initState(); + androidFileUtils.storageVolumes.forEach((volume) async { + final byteCount = await storageService.getFreeSpace(volume); + setState(() => _freeSpaceByVolume[volume.path] = byteCount); + }); + } + + @override + Widget build(BuildContext context) { + super.build(context); + + return AvesExpansionTile( + title: 'OS Storage', + children: [ + ...androidFileUtils.storageVolumes.expand((v) { + final freeSpace = _freeSpaceByVolume[v.path]; + return [ + Padding( + padding: const EdgeInsets.all(8), + child: Text(v.path), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: InfoRowGroup( + info: { + 'description': v.getDescription(context), + 'isPrimary': '${v.isPrimary}', + 'isRemovable': '${v.isRemovable}', + 'state': v.state, + if (freeSpace != null) 'freeSpace': formatFileSize(asciiLocale, freeSpace), + }, + ), + ), + const Divider(), + ]; + }), + ], + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/widgets/debug/report.dart b/lib/widgets/debug/report.dart new file mode 100644 index 0000000..d618e71 --- /dev/null +++ b/lib/widgets/debug/report.dart @@ -0,0 +1,69 @@ +import 'package:aves/services/android_debug_service.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:flutter/material.dart'; + +class DebugErrorReportingSection extends StatefulWidget { + const DebugErrorReportingSection({super.key}); + + @override + State<DebugErrorReportingSection> createState() => _DebugErrorReportingSectionState(); +} + +class _DebugErrorReportingSectionState extends State<DebugErrorReportingSection> with AutomaticKeepAliveClientMixin { + @override + Widget build(BuildContext context) { + super.build(context); + + return AvesExpansionTile( + title: 'Reporting', + children: [ + const Padding( + padding: EdgeInsets.symmetric(horizontal: 8), + child: ElevatedButton( + onPressed: AndroidDebugService.crash, + child: Text('Crash'), + ), + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 8), + child: ElevatedButton( + onPressed: AndroidDebugService.exception, + child: Text('Throw exception'), + ), + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 8), + child: ElevatedButton( + onPressed: AndroidDebugService.safeException, + child: Text('Throw exception (safe)'), + ), + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 8), + child: ElevatedButton( + onPressed: AndroidDebugService.exceptionInCoroutine, + child: Text('Throw exception in coroutine'), + ), + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 8), + child: ElevatedButton( + onPressed: AndroidDebugService.safeExceptionInCoroutine, + child: Text('Throw exception in coroutine (safe)'), + ), + ), + Padding( + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), + child: InfoRowGroup( + info: reportService.state, + ), + ), + ], + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/widgets/debug/settings.dart b/lib/widgets/debug/settings.dart new file mode 100644 index 0000000..beb0177 --- /dev/null +++ b/lib/widgets/debug/settings.dart @@ -0,0 +1,95 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/filter_grids/albums_page.dart'; +import 'package:aves/widgets/filter_grids/countries_page.dart'; +import 'package:aves/widgets/filter_grids/places_page.dart'; +import 'package:aves/widgets/filter_grids/tags_page.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class DebugSettingsSection extends StatefulWidget { + const DebugSettingsSection({super.key}); + + @override + State<DebugSettingsSection> createState() => _DebugSettingsSectionState(); +} + +class _DebugSettingsSectionState extends State<DebugSettingsSection> with AutomaticKeepAliveClientMixin { + @override + Widget build(BuildContext context) { + super.build(context); + + return Consumer<Settings>( + builder: (context, settings, child) { + String toMultiline(Iterable? l) => l != null && l.isNotEmpty ? '\n${l.join('\n')}' : '$l'; + return AvesExpansionTile( + title: 'Settings', + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: ElevatedButton( + onPressed: () => settings.reset(includeInternalKeys: true), + child: const Text('Reset (all store)'), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: ElevatedButton( + onPressed: () => settings.reset(includeInternalKeys: false), + child: const Text('Reset (user preferences)'), + ), + ), + SwitchListTile( + value: settings.hasAcceptedTerms, + onChanged: (v) => settings.hasAcceptedTerms = v, + title: const Text('hasAcceptedTerms'), + ), + SwitchListTile( + value: settings.canUseAnalysisService, + onChanged: (v) => settings.canUseAnalysisService = v, + title: const Text('canUseAnalysisService'), + ), + Padding( + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), + child: InfoRowGroup( + info: { + 'catalogTimeZoneRawOffsetMillis': '${settings.catalogTimeZoneOffsetMillis}', + 'tileExtent - Collection': '${settings.getTileExtent(CollectionPage.routeName)}', + 'tileExtent - Albums': '${settings.getTileExtent(AlbumListPage.routeName)}', + 'tileExtent - Countries': '${settings.getTileExtent(CountryListPage.routeName)}', + 'tileExtent - Places': '${settings.getTileExtent(PlaceListPage.routeName)}', + 'tileExtent - Tags': '${settings.getTileExtent(TagListPage.routeName)}', + 'mapStyle': '${settings.mapStyle}', + 'infoMapZoom': '${settings.infoMapZoom}', + 'customMapStyles': toMultiline(settings.customMapStyles), + 'collectionSelectionQuickActions': '${settings.collectionSelectionQuickActions}', + 'viewerQuickActions': '${settings.viewerQuickActions}', + 'drawerTypeBookmarks': toMultiline(settings.drawerTypeBookmarks), + 'drawerAlbumBookmarks': toMultiline(settings.drawerAlbumBookmarks), + 'drawerPageBookmarks': toMultiline(settings.drawerPageBookmarks), + 'pinnedFilters': toMultiline(settings.pinnedFilters), + 'hiddenFilters': toMultiline(settings.hiddenFilters), + 'deactivatedHiddenFilters': toMultiline(settings.deactivatedHiddenFilters), + 'searchHistory': toMultiline(settings.searchHistory), + 'recentDestinationAlbums': toMultiline(settings.recentDestinationAlbums), + 'recentTags': toMultiline(settings.recentTags), + 'locale': '${settings.locale}', + 'systemLocales': '${WidgetsBinding.instance.platformDispatcher.locales}', + 'topEntryIds': '${settings.topEntryIds}', + 'longPressTimeout': '${settings.longPressTimeout}', + 'albumGroups': toMultiline(settings.albumGroups.entries), + 'tagGroups': toMultiline(settings.tagGroups.entries), + }, + ), + ), + ], + ); + }, + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/widgets/dialogs/add_shortcut_dialog.dart b/lib/widgets/dialogs/add_shortcut_dialog.dart new file mode 100644 index 0000000..3b3d042 --- /dev/null +++ b/lib/widgets/dialogs/add_shortcut_dialog.dart @@ -0,0 +1,149 @@ +import 'package:aves/model/covers.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/query.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/dialogs/item_picker.dart'; +import 'package:aves/widgets/dialogs/pick_dialogs/item_pick_page.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +import 'aves_dialog.dart'; + +class AddShortcutDialog extends StatefulWidget { + static const routeName = '/dialog/add_shortcut'; + + final CollectionLens? collection; + final String defaultName; + + const AddShortcutDialog({ + super.key, + required this.defaultName, + this.collection, + }); + + @override + State<AddShortcutDialog> createState() => _AddShortcutDialogState(); +} + +class _AddShortcutDialogState extends State<AddShortcutDialog> { + final TextEditingController _nameController = TextEditingController(); + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + AvesEntry? _coverEntry; + + @override + void initState() { + super.initState(); + final _collection = widget.collection; + if (_collection != null) { + final entries = _collection.sortedEntries; + if (entries.isNotEmpty) { + final coverEntries = _collection.filters.map((filter) => covers.of(filter)?.$1).nonNulls.map((id) => entries.firstWhereOrNull((entry) => entry.id == id)).nonNulls; + _coverEntry = coverEntries.firstOrNull ?? entries.first; + } + } + _nameController.text = widget.defaultName; + _validate(); + } + + @override + void dispose() { + _nameController.dispose(); + _isValidNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return MediaQueryDataProvider( + child: Builder( + builder: (context) { + final shortestSide = MediaQuery.sizeOf(context).shortestSide; + final extent = (shortestSide / 3.0).clamp(60.0, 160.0); + return AvesDialog( + scrollableContent: [ + if (_coverEntry != null) + Container( + alignment: Alignment.center, + padding: const EdgeInsets.only(top: 16), + child: ItemPicker( + extent: extent, + entry: _coverEntry!, + onTap: _pickEntry, + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 24), + child: TextField( + controller: _nameController, + decoration: InputDecoration( + labelText: context.l10n.addShortcutDialogLabel, + ), + autofocus: true, + maxLength: 25, + onChanged: (_) => _validate(), + onSubmitted: (_) => _submit(context), + ), + ), + ], + actions: [ + const CancelButton(), + ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(context.l10n.addShortcutButtonLabel), + ); + }, + ), + ], + ); + }, + ), + ); + } + + Future<void> _pickEntry() async { + final _collection = widget.collection; + if (_collection == null) return; + + final entry = await Navigator.maybeOf(context)?.push<AvesEntry>( + MaterialPageRoute( + settings: const RouteSettings(name: ItemPickPage.routeName), + builder: (context) { + final pickFilters = _collection.filters.toSet(); + final liveFilters = pickFilters.whereType<QueryFilter>().where((v) => v.live).toSet(); + liveFilters.forEach((filter) { + pickFilters.remove(filter); + pickFilters.add(QueryFilter(filter.query)); + }); + return ItemPickPage( + collection: CollectionLens( + source: _collection.source, + filters: pickFilters, + ), + canRemoveFilters: false, + ); + }, + fullscreenDialog: true, + ), + ); + if (entry != null) { + _coverEntry = entry; + setState(() {}); + } + } + + Future<void> _validate() async { + final name = _nameController.text; + _isValidNotifier.value = name.isNotEmpty; + } + + void _submit(BuildContext context) { + if (_isValidNotifier.value) { + Navigator.maybeOf(context)?.pop<(AvesEntry?, String)>((_coverEntry, _nameController.text)); + } + } +} diff --git a/lib/widgets/dialogs/aves_confirmation_dialog.dart b/lib/widgets/dialogs/aves_confirmation_dialog.dart new file mode 100644 index 0000000..eac4369 --- /dev/null +++ b/lib/widgets/dialogs/aves_confirmation_dialog.dart @@ -0,0 +1,156 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +import 'aves_dialog.dart'; + +Future<bool> showConfirmationDialog({ + required BuildContext context, + required String message, + String? ok, + String? cancel, +}) async { + final confirmed = await showDialog<bool>( + context: context, + builder: (context) => AvesMessageDialog( + message: message, + actions: [ + CancelButton<bool>(text: cancel, result: false), + OkButton<bool>(text: ok, result: true), + ], + ), + routeSettings: const RouteSettings(name: AvesDialog.confirmationRouteName), + ); + return confirmed ?? false; +} + +Future<bool> showSkippableConfirmationDialog({ + required BuildContext context, + required ConfirmationDialog type, + String? message, + ConfirmationDialogDelegate? delegate, + required String confirmationButtonLabel, +}) async { + if (!_shouldConfirm(type)) return true; + + assert((message != null) ^ (delegate != null)); + final effectiveDelegate = delegate ?? MessageConfirmationDialogDelegate(message!); + final confirmed = await showDialog<bool>( + context: context, + builder: (context) => _SkippableConfirmationDialog( + type: type, + delegate: effectiveDelegate, + confirmationButtonLabel: confirmationButtonLabel, + ), + routeSettings: const RouteSettings(name: _SkippableConfirmationDialog.routeName), + ); + if (confirmed == null) return false; + + if (confirmed) { + effectiveDelegate.apply(); + } + return confirmed; +} + +bool _shouldConfirm(ConfirmationDialog type) { + switch (type) { + case ConfirmationDialog.createVault: + return settings.confirmCreateVault; + case ConfirmationDialog.deleteForever: + return settings.confirmDeleteForever; + case ConfirmationDialog.moveToBin: + return settings.confirmMoveToBin; + case ConfirmationDialog.moveUndatedItems: + return settings.confirmMoveUndatedItems; + } +} + +void _skipConfirmation(ConfirmationDialog type) { + switch (type) { + case ConfirmationDialog.createVault: + settings.confirmCreateVault = false; + case ConfirmationDialog.deleteForever: + settings.confirmDeleteForever = false; + case ConfirmationDialog.moveToBin: + settings.confirmMoveToBin = false; + case ConfirmationDialog.moveUndatedItems: + settings.confirmMoveUndatedItems = false; + } +} + +abstract class ConfirmationDialogDelegate { + List<Widget> build(BuildContext context); + + void apply() {} +} + +class MessageConfirmationDialogDelegate extends ConfirmationDialogDelegate { + final String message; + + MessageConfirmationDialogDelegate(this.message); + + @override + List<Widget> build(BuildContext context) => [ + Padding( + padding: const EdgeInsets.all(16) + const EdgeInsets.only(top: 8), + child: Text(message), + ), + ]; +} + +class _SkippableConfirmationDialog extends StatefulWidget { + static const routeName = '/dialog/skippable_confirmation'; + + final ConfirmationDialog type; + final ConfirmationDialogDelegate delegate; + final String confirmationButtonLabel; + + const _SkippableConfirmationDialog({ + required this.type, + required this.delegate, + required this.confirmationButtonLabel, + }); + + @override + State<_SkippableConfirmationDialog> createState() => _SkippableConfirmationDialogState(); +} + +class _SkippableConfirmationDialogState extends State<_SkippableConfirmationDialog> { + final ValueNotifier<bool> _skipNotifier = ValueNotifier(false); + + @override + void dispose() { + _skipNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AvesDialog( + scrollableContent: [ + ...widget.delegate.build(context), + ValueListenableBuilder<bool>( + valueListenable: _skipNotifier, + builder: (context, flag, child) => SwitchListTile( + value: flag, + onChanged: (v) => _skipNotifier.value = v, + title: Text(context.l10n.doNotAskAgain), + ), + ), + ], + actions: [ + const CancelButton(), + TextButton( + onPressed: () { + if (_skipNotifier.value) { + _skipConfirmation(widget.type); + } + Navigator.maybeOf(context)?.pop(true); + }, + child: Text(widget.confirmationButtonLabel), + ), + ], + ); + } +} diff --git a/lib/widgets/dialogs/aves_dialog.dart b/lib/widgets/dialogs/aves_dialog.dart new file mode 100644 index 0000000..3db64bb --- /dev/null +++ b/lib/widgets/dialogs/aves_dialog.dart @@ -0,0 +1,230 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; + +class AvesDialog extends StatelessWidget { + static const confirmationRouteName = '/dialog/confirmation'; + static const warningRouteName = '/dialog/warning'; + + final String? title; + final ScrollController scrollController; + final List<Widget>? scrollableContent; + final double horizontalContentPadding; + final Widget? content; + final List<Widget> actions; + + static const Radius cornerRadius = Radius.circular(24); + static const double defaultHorizontalContentPadding = 24; + static const double controlCaptionPadding = 16; + static const double borderWidth = 1.0; + static const EdgeInsets actionsPadding = EdgeInsets.symmetric(vertical: 4, horizontal: 16); + static const EdgeInsets buttonPadding = EdgeInsets.symmetric(horizontal: 8); + + AvesDialog({ + super.key, + this.title, + ScrollController? scrollController, + this.scrollableContent, + this.horizontalContentPadding = defaultHorizontalContentPadding, + this.content, + this.actions = const [], + }) : assert((scrollableContent != null) ^ (content != null)), + scrollController = scrollController ?? ScrollController(); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: title != null + ? Padding( + // padding to avoid transparent border overlapping + padding: const EdgeInsets.symmetric(horizontal: borderWidth), + child: DialogTitle(title: title!), + ) + : null, + titlePadding: EdgeInsets.zero, + // the `scrollable` flag of `AlertDialog` makes it + // scroll both the title and the content together, + // and overflow feedback ignores the dialog shape, + // so we restrict scrolling to the content instead + content: _buildContent(context), + contentPadding: scrollableContent != null ? EdgeInsets.zero : EdgeInsets.only(left: horizontalContentPadding, top: 20, right: horizontalContentPadding), + actions: actions, + actionsPadding: actionsPadding, + buttonPadding: buttonPadding, + // clipping to prevent highlighted material to bleed through rounded corners + clipBehavior: Clip.antiAlias, + shape: shape(context), + ); + } + + Widget _buildContent(BuildContext context) { + if (content != null) { + return content!; + } + + if (scrollableContent != null) { + Widget child = ListView( + controller: scrollController, + shrinkWrap: true, + children: scrollableContent!, + ); + + if (!settings.useTvLayout) { + child = Theme( + data: Theme.of(context).copyWith( + scrollbarTheme: ScrollbarThemeData( + thumbVisibility: WidgetStateProperty.all(true), + radius: const Radius.circular(16), + crossAxisMargin: 4, + // adapt margin when corner is around content itself, not outside for the title + mainAxisMargin: 4 + (title != null ? 0 : cornerRadius.y / 2), + interactive: true, + ), + ), + child: Scrollbar( + controller: scrollController, + notificationPredicate: (notification) { + // as of Flutter v3.0.1, the `Scrollbar` does not only respond to the nearest `ScrollView` + // despite the `defaultScrollNotificationPredicate` checking notification depth, + // as the notifications coming from the controller in `ListWheelScrollView` in `WheelSelector` still have a depth of 0. + // Cancelling notification bubbling seems ineffective, so we check the metrics type as a workaround. + return defaultScrollNotificationPredicate(notification) && notification.metrics is! FixedExtentMetrics; + }, + child: child, + ), + ); + } + + return Container( + // padding to avoid transparent border overlapping + padding: const EdgeInsets.symmetric(horizontal: borderWidth), + // workaround because the dialog tries + // to size itself to the content intrinsic size, + // but the `ListView` viewport does not have one + width: MediaQuery.sizeOf(context).width / 2, + child: DecoratedBox( + decoration: contentDecoration(context), + child: child, + ), + ); + } + + return const SizedBox(); + } + + static Decoration contentDecoration(BuildContext context) => BoxDecoration( + border: Border( + bottom: Divider.createBorderSide(context, width: borderWidth), + ), + ); + + static ShapeBorder shape(BuildContext context) { + return RoundedRectangleBorder( + side: Divider.createBorderSide(context, width: borderWidth), + borderRadius: const BorderRadius.all(cornerRadius), + ); + } +} + +class DialogTitle extends StatelessWidget { + final String title; + + const DialogTitle({ + super.key, + required this.title, + }); + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(vertical: 18, horizontal: 16), + decoration: AvesDialog.contentDecoration(context), + child: Text( + title, + textAlign: TextAlign.center, + ), + ); + } +} + +Future<void> showNoMatchingAppDialog(BuildContext context) => showWarningDialog( + context: context, + message: context.l10n.noMatchingAppDialogMessage, +); + +Future<void> showWarningDialog({ + required BuildContext context, + required String message, +}) => showDialog( + context: context, + builder: (context) => AvesMessageDialog.info(message), + routeSettings: const RouteSettings(name: AvesDialog.warningRouteName), +); + +class CancelButton<T> extends StatelessWidget { + final String? text; + final T? result; + + const CancelButton({ + super.key, + this.text, + this.result, + }); + + @override + Widget build(BuildContext context) { + return TextButton( + onPressed: () => Navigator.maybeOf(context)?.pop(result), + // MD2 button labels were upper case but they are lower case in MD3 + child: Text(text ?? Themes.asButtonLabel(context.l10n.cancelTooltip)), + ); + } +} + +class OkButton<T> extends StatelessWidget { + final String? text; + final T? result; + + const OkButton({ + super.key, + this.text, + this.result, + }); + + @override + Widget build(BuildContext context) { + return TextButton( + onPressed: () => Navigator.maybeOf(context)?.pop(result), + // MD2 button labels were upper case but they are lower case in MD3 + child: Text(text ?? Themes.asButtonLabel(MaterialLocalizations.of(context).okButtonLabel)), + ); + } +} + +class AvesMessageDialog extends StatelessWidget { + final String message; + final List<Widget> actions; + + const AvesMessageDialog({ + super.key, + required this.message, + required this.actions, + }); + + factory AvesMessageDialog.info(String message) { + return AvesMessageDialog( + message: message, + actions: const [OkButton()], + ); + } + + @override + Widget build(BuildContext context) { + return AvesDialog( + content: Text(message), + actions: actions, + ); + } +} diff --git a/lib/widgets/dialogs/cast_dialog.dart b/lib/widgets/dialogs/cast_dialog.dart new file mode 100644 index 0000000..4603d03 --- /dev/null +++ b/lib/widgets/dialogs/cast_dialog.dart @@ -0,0 +1,83 @@ +// lib/widgets/dialogs/cast_dialog.dart + +import 'dart:async'; +import 'package:flutter/material.dart'; + +import 'package:aves/widgets/cast/dlna.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; + +/// Target astratto (rimane per compatibilità) +abstract class CastTarget { + const CastTarget(); +} + +/// DLNA target +class DlnaTarget extends CastTarget { + final DLNADevice device; + const DlnaTarget(this.device); +} + +/// Dialog dedicata SOLO al DLNA. +/// Google Cast Standard e Custom Receiver NON passano da qui. +class CastDialog extends StatefulWidget { + static const routeName = '/dialog/cast'; + + const CastDialog({super.key}); + + @override + State<CastDialog> createState() => _CastDialogState(); +} + +class _CastDialogState extends State<CastDialog> { + // Ora i renderer DLNA devono essere passati dall’esterno + // oppure gestiti da un discovery che aggiungeremo dopo. + final Map<String, DLNADevice> _seenRenderers = {}; + + @override + void initState() { + super.initState(); + // Nessuna discovery automatica: il controller o il chiamante + // deve popolare _seenRenderers. + } + + @override + Widget build(BuildContext context) { + return AvesDialog( + title: context.l10n.castDialogTitle, + scrollableContent: [ + const SizedBox(height: 12), + _buildDlnaList(context), + ], + actions: const [ + CancelButton(), + ], + ); + } + + // ------------------------------------------- + // DLNA LIST + // ------------------------------------------- + Widget _buildDlnaList(BuildContext context) { + if (_seenRenderers.isEmpty) { + return const Padding( + padding: EdgeInsets.all(16), + child: Center(child: Text("Nessun dispositivo DLNA trovato")), + ); + } + + return ListView( + shrinkWrap: true, + children: _seenRenderers.values + .map( + (dev) => ListTile( + leading: const Icon(Icons.tv), + title: Text(dev.info.friendlyName), + onTap: () => + Navigator.of(context).pop<CastTarget>(DlnaTarget(dev)), + ), + ) + .toList(), + ); + } +} diff --git a/lib/widgets/dialogs/convert_entry_dialog.dart b/lib/widgets/dialogs/convert_entry_dialog.dart new file mode 100644 index 0000000..2c41938 --- /dev/null +++ b/lib/widgets/dialogs/convert_entry_dialog.dart @@ -0,0 +1,374 @@ +import 'package:aves/model/app/support.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/media/media_edit_service.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/utils/mime_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/basic/list_tiles/slider.dart'; +import 'package:aves/widgets/common/basic/text/change_highlight.dart'; +import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/fx/transitions.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'aves_dialog.dart'; + +class ConvertEntryDialog extends StatefulWidget { + static const routeName = '/dialog/convert_entry'; + + final Set<AvesEntry> entries; + + const ConvertEntryDialog({ + super.key, + required this.entries, + }); + + @override + State<ConvertEntryDialog> createState() => _ConvertEntryDialogState(); +} + +class _ConvertEntryDialogState extends State<ConvertEntryDialog> { + late List<EntryConvertAction> _actionOptions; + EntryConvertAction _action = EntryConvertAction.convert; + final TextEditingController _widthController = TextEditingController(), _heightController = TextEditingController(); + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + late ValueNotifier<String> _mimeTypeNotifier; + late int _quality; + late bool _writeMetadata, _sameSized; + late List<LengthUnit> _lengthUnitOptions; + late LengthUnit _lengthUnit; + + Set<AvesEntry> get entries => widget.entries; + + EdgeInsets get contentHorizontalPadding => const EdgeInsets.symmetric(horizontal: AvesDialog.defaultHorizontalContentPadding); + + static const _imageExportFormats = [ + MimeTypes.bmp, + MimeTypes.jpeg, + MimeTypes.png, + MimeTypes.webp, + ]; + + static const _qualityFormats = [ + MimeTypes.jpeg, + MimeTypes.webp, + ]; + + @override + void initState() { + super.initState(); + _actionOptions = [ + EntryConvertAction.convert, + if (entries.any((entry) => entry.isMotionPhoto)) EntryConvertAction.convertMotionPhotoToStillImage, + ]; + _mimeTypeNotifier = ValueNotifier(settings.convertMimeType); + _quality = settings.convertQuality; + _writeMetadata = settings.convertWriteMetadata; + _sameSized = entries.map((entry) => entry.displaySize).toSet().length == 1; + _lengthUnitOptions = [ + if (_sameSized) LengthUnit.px, + LengthUnit.percent, + ]; + _lengthUnit = _lengthUnitOptions.first; + _initDimensions(); + _validate(); + } + + void _initDimensions() { + switch (_lengthUnit) { + case LengthUnit.px: + final displaySize = entries.first.displaySize; + _widthController.text = '${displaySize.width.round()}'; + _heightController.text = '${displaySize.height.round()}'; + case LengthUnit.percent: + _widthController.text = '100'; + _heightController.text = '100'; + } + } + + @override + void dispose() { + _widthController.dispose(); + _heightController.dispose(); + _isValidNotifier.dispose(); + _mimeTypeNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AvesDialog( + scrollableContent: [ + const SizedBox(height: 16), + if (_actionOptions.length > 1) + Padding( + padding: contentHorizontalPadding, + child: TextDropdownButton<EntryConvertAction>( + values: _actionOptions, + valueText: (v) => v.getText(context), + valueIcon: (v) => v.getIconData(), + value: _action, + onChanged: (v) { + _action = v!; + _validate(); + setState(() {}); + }, + isExpanded: true, + dropdownColor: Themes.thirdLayerColor(context), + ), + ), + AnimatedSwitcher( + duration: context.read<DurationsData>().formTransition, + switchInCurve: Curves.easeInOutCubic, + switchOutCurve: Curves.easeInOutCubic, + transitionBuilder: AvesTransitions.formTransitionBuilder, + child: Column( + key: ValueKey(_action), + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (_action == EntryConvertAction.convert) ..._buildConvertContent(context), + if (_action == EntryConvertAction.convertMotionPhotoToStillImage) const SizedBox(height: 16), + ], + ), + ), + ], + actions: [ + const CancelButton(), + ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid + ? () { + final width = int.tryParse(_widthController.text); + final height = int.tryParse(_heightController.text); + final options = (width != null && height != null) + ? EntryConvertOptions( + action: _action, + mimeType: _mimeTypeNotifier.value, + writeMetadata: _writeMetadata, + lengthUnit: _lengthUnit, + width: width, + height: height, + quality: _quality, + ) + : null; + + if (options != null) { + settings.convertMimeType = options.mimeType; + settings.convertQuality = options.quality; + settings.convertWriteMetadata = options.writeMetadata; + } + + Navigator.maybeOf(context)?.pop(options); + } + : null, + child: Text(context.l10n.applyButtonLabel), + ); + }, + ), + ], + ); + } + + List<Widget> _buildConvertContent(BuildContext context) { + final l10n = context.l10n; + final colorScheme = Theme.of(context).colorScheme; + final trailingStyle = TextStyle(color: colorScheme.onSurfaceVariant); + final trailingChangeShadowColor = colorScheme.onSurface; + + // used by the drop down to match input decoration + final textFieldDecorationBorder = Border( + bottom: BorderSide( + color: colorScheme.onSurface.withValues(alpha: .38), + width: 1.0, + ), + ); + + return [ + Padding( + padding: contentHorizontalPadding, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text(l10n.exportEntryDialogFormat), + const SizedBox(width: AvesDialog.controlCaptionPadding), + TextDropdownButton<String>( + values: _imageExportFormats, + valueText: MimeUtils.displayType, + value: _mimeTypeNotifier.value, + onChanged: (selected) { + if (selected != null) { + setState(() => _mimeTypeNotifier.value = selected); + } + }, + ), + ], + ), + ), + Padding( + padding: contentHorizontalPadding, + child: Row( + crossAxisAlignment: CrossAxisAlignment.baseline, + textBaseline: TextBaseline.alphabetic, + children: [ + Expanded( + child: TextField( + controller: _widthController, + decoration: InputDecoration(labelText: l10n.exportEntryDialogWidth), + keyboardType: TextInputType.number, + onChanged: (value) { + final width = int.tryParse(value); + if (width != null) { + switch (_lengthUnit) { + case LengthUnit.px: + _heightController.text = '${(width / entries.first.displayAspectRatio).round()}'; + case LengthUnit.percent: + _heightController.text = '$width'; + } + } else { + _heightController.text = ''; + } + _validate(); + }, + ), + ), + const SizedBox(width: 8), + const Text(AText.resolutionSeparator), + const SizedBox(width: 8), + Expanded( + child: TextField( + controller: _heightController, + decoration: InputDecoration(labelText: l10n.exportEntryDialogHeight), + keyboardType: TextInputType.number, + onChanged: (value) { + final height = int.tryParse(value); + if (height != null) { + switch (_lengthUnit) { + case LengthUnit.px: + _widthController.text = '${(height * entries.first.displayAspectRatio).round()}'; + case LengthUnit.percent: + _widthController.text = '$height'; + } + } else { + _widthController.text = ''; + } + _validate(); + }, + ), + ), + const SizedBox(width: 16), + TextDropdownButton<LengthUnit>( + values: _lengthUnitOptions, + valueText: (v) => v.getText(context), + value: _lengthUnit, + onChanged: _lengthUnitOptions.length > 1 + ? (v) { + if (v != null && _lengthUnit != v) { + _lengthUnit = v; + _initDimensions(); + _validate(); + setState(() {}); + } + } + : null, + underline: Container( + height: 1.0, + decoration: BoxDecoration( + border: textFieldDecorationBorder, + ), + ), + itemHeight: 60, + dropdownColor: Themes.thirdLayerColor(context), + ), + ], + ), + ), + ValueListenableBuilder<String>( + valueListenable: _mimeTypeNotifier, + builder: (context, mimeType, child) { + Widget child; + if (_qualityFormats.contains(mimeType)) { + child = SliderListTile( + value: _quality.toDouble(), + onChanged: (v) => setState(() => _quality = v.round()), + min: 0, + max: 100, + title: context.l10n.exportEntryDialogQuality, + titlePadding: contentHorizontalPadding, + titleTrailing: (context, value) => ChangeHighlightText( + '${value.round()}', + style: trailingStyle.copyWith( + shadows: [ + Shadow( + color: trailingChangeShadowColor.withAlpha(0), + blurRadius: 0, + ), + ], + ), + changedStyle: trailingStyle.copyWith( + shadows: [ + Shadow( + color: trailingChangeShadowColor, + blurRadius: 3, + ), + ], + ), + duration: context.read<DurationsData>().formTextStyleTransition, + ), + ); + } else { + child = const SizedBox(); + } + return AnimatedSwitcher( + duration: context.read<DurationsData>().formTransition, + switchInCurve: Curves.easeInOutCubic, + switchOutCurve: Curves.easeInOutCubic, + transitionBuilder: AvesTransitions.formTransitionBuilder, + child: child, + ); + }, + ), + ValueListenableBuilder<String>( + valueListenable: _mimeTypeNotifier, + builder: (context, mimeType, child) { + Widget child; + if (AppSupport.canEditExif(mimeType) || AppSupport.canEditIptc(mimeType) || AppSupport.canEditXmp(mimeType)) { + child = SwitchListTile( + value: _writeMetadata, + onChanged: (v) => setState(() => _writeMetadata = v), + title: Text(context.l10n.exportEntryDialogWriteMetadata), + contentPadding: const EdgeInsetsDirectional.only( + start: AvesDialog.defaultHorizontalContentPadding, + end: AvesDialog.defaultHorizontalContentPadding - 8, + ), + ); + } else { + child = const SizedBox(height: 16); + } + return AnimatedSwitcher( + duration: context.read<DurationsData>().formTransition, + switchInCurve: Curves.easeInOutCubic, + switchOutCurve: Curves.easeInOutCubic, + transitionBuilder: AvesTransitions.formTransitionBuilder, + child: child, + ); + }, + ), + ]; + } + + Future<void> _validate() async { + final width = int.tryParse(_widthController.text); + final height = int.tryParse(_heightController.text); + _isValidNotifier.value = (width ?? 0) > 0 && (height ?? 0) > 0; + } +} diff --git a/lib/widgets/dialogs/duration_dialog.dart b/lib/widgets/dialogs/duration_dialog.dart new file mode 100644 index 0000000..a747f47 --- /dev/null +++ b/lib/widgets/dialogs/duration_dialog.dart @@ -0,0 +1,125 @@ +import 'package:aves/ref/locales.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:aves/widgets/common/basic/wheel.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class DurationDialog extends StatefulWidget { + final int initialSeconds; + + const DurationDialog({ + super.key, + required this.initialSeconds, + }); + + @override + State<DurationDialog> createState() => _DurationDialogState(); +} + +class _DurationDialogState extends State<DurationDialog> { + late ValueNotifier<int> _minutes, _seconds; + + @override + void initState() { + super.initState(); + final seconds = widget.initialSeconds; + _minutes = ValueNotifier(seconds ~/ secondsInMinute); + _seconds = ValueNotifier(seconds % secondsInMinute); + } + + @override + void dispose() { + _minutes.dispose(); + _seconds.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return MediaQueryDataProvider( + child: Builder( + builder: (context) { + final l10n = context.l10n; + final timeComponentFormatter = NumberFormat('0', context.locale); + + const textStyle = TextStyle(fontSize: 34); + const digitsAlign = TextAlign.right; + + return AvesDialog( + scrollableContent: [ + Padding( + padding: const EdgeInsets.only(top: 16), + child: Center( + child: Table( + textDirection: timeComponentsDirection, + children: [ + TableRow( + children: [ + Center(child: Text(l10n.durationDialogMinutes)), + const SizedBox(width: 16), + Center(child: Text(l10n.durationDialogSeconds)), + ], + ), + TableRow( + children: [ + Align( + alignment: Alignment.centerRight, + child: WheelSelector( + valueNotifier: _minutes, + values: List.generate(minutesInHour, (i) => i), + textStyle: textStyle, + textAlign: digitsAlign, + format: timeComponentFormatter.format, + ), + ), + const Padding( + padding: EdgeInsets.only(bottom: 2), + child: Text( + ':', + style: textStyle, + ), + ), + Align( + alignment: Alignment.centerLeft, + child: WheelSelector( + valueNotifier: _seconds, + values: List.generate(secondsInMinute, (i) => i), + textStyle: textStyle, + textAlign: digitsAlign, + format: timeComponentFormatter.format, + ), + ), + ], + ), + ], + defaultColumnWidth: const IntrinsicColumnWidth(), + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + ), + ), + ), + ], + actions: [ + const CancelButton(), + AnimatedBuilder( + animation: Listenable.merge([_minutes, _seconds]), + builder: (context, child) { + final isValid = _minutes.value > 0 || _seconds.value > 0; + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: child!, + ); + }, + child: Text(l10n.applyButtonLabel), + ), + ], + ); + }, + ), + ); + } + + void _submit(BuildContext context) => Navigator.maybeOf(context)?.pop(_minutes.value * secondsInMinute + _seconds.value); +} diff --git a/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart new file mode 100644 index 0000000..a74a504 --- /dev/null +++ b/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart @@ -0,0 +1,338 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/metadata/date_modifier.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/format.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; +import 'package:aves/widgets/common/basic/time_shift_selector.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/fx/transitions.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/item_picker.dart'; +import 'package:aves/widgets/dialogs/pick_dialogs/item_pick_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class EditEntryDateDialog extends StatefulWidget { + static const routeName = '/dialog/edit_entry_date'; + + final AvesEntry entry; + final CollectionLens? collection; + + const EditEntryDateDialog({ + super.key, + required this.entry, + this.collection, + }); + + @override + State<EditEntryDateDialog> createState() => _EditEntryDateDialogState(); +} + +class _EditEntryDateDialogState extends State<EditEntryDateDialog> { + DateEditAction _action = DateEditAction.setCustom; + DateFieldSource _copyFieldSource = DateFieldSource.fileModifiedDate; + late AvesEntry _copyItemSource; + late DateTime _customDateTime; + late TimeShiftController _timeShiftController; + bool _showOptions = false; + final Set<MetadataField> _fields = {...DateModifier.writableFields}; + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + + DateTime get copyItemDate => _copyItemSource.bestDate ?? DateTime.now(); + + @override + void initState() { + super.initState(); + _initCustom(); + _initCopyItem(); + _initShift(); + _validate(); + } + + @override + void dispose() { + _isValidNotifier.dispose(); + super.dispose(); + } + + void _initCustom() { + _customDateTime = widget.entry.bestDate ?? DateTime.now(); + } + + void _initCopyItem() { + _copyItemSource = widget.entry; + } + + void _initShift() { + _timeShiftController = TimeShiftController( + initialValue: const Duration(hours: 1), + ); + } + + @override + Widget build(BuildContext context) { + return MediaQueryDataProvider( + child: TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: Builder( + builder: (context) { + final l10n = context.l10n; + + return AvesDialog( + title: l10n.editEntryDateDialogTitle, + scrollableContent: [ + Padding( + padding: const EdgeInsets.only(left: 16, top: 8, right: 16), + child: TextDropdownButton<DateEditAction>( + values: DateEditAction.values, + valueText: (v) => v.getText(context), + value: _action, + onChanged: (v) { + _action = v!; + _validate(); + setState(() {}); + }, + isExpanded: true, + dropdownColor: Themes.thirdLayerColor(context), + ), + ), + AnimatedSwitcher( + duration: context.read<DurationsData>().formTransition, + switchInCurve: Curves.easeInOutCubic, + switchOutCurve: Curves.easeInOutCubic, + transitionBuilder: AvesTransitions.formTransitionBuilder, + child: Column( + key: ValueKey(_action), + mainAxisSize: MainAxisSize.min, + children: [ + if (_action == DateEditAction.setCustom) _buildSetCustomContent(context), + if (_action == DateEditAction.copyField) _buildCopyFieldContent(context), + if (_action == DateEditAction.copyItem) _buildCopyItemContent(context), + if (_action == DateEditAction.shift) _buildShiftContent(context), + (_action == DateEditAction.shift || _action == DateEditAction.remove) ? _buildDestinationFields(context) : const SizedBox(height: 8), + ], + ), + ), + ], + actions: [ + const CancelButton(), + ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(l10n.applyButtonLabel), + ); + }, + ), + ], + ); + }, + ), + ), + ); + } + + Widget _buildSetCustomContent(BuildContext context) { + final use24hour = MediaQuery.alwaysUse24HourFormatOf(context); + + return Padding( + padding: const EdgeInsetsDirectional.only(start: 16, end: 8), + child: Row( + children: [ + Expanded(child: Text(formatDateTime(_customDateTime, context.locale, use24hour))), + IconButton( + icon: const Icon(AIcons.edit), + onPressed: _editDate, + tooltip: context.l10n.changeTooltip, + ), + ], + ), + ); + } + + Widget _buildCopyFieldContent(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(left: 16, top: 0, right: 16), + child: TextDropdownButton<DateFieldSource>( + values: DateFieldSource.values, + valueText: (v) => v.getText(context), + value: _copyFieldSource, + onChanged: (v) => setState(() => _copyFieldSource = v!), + isExpanded: true, + dropdownColor: Themes.thirdLayerColor(context), + ), + ); + } + + Widget _buildCopyItemContent(BuildContext context) { + final use24hour = MediaQuery.alwaysUse24HourFormatOf(context); + + return Padding( + padding: const EdgeInsetsDirectional.only(start: 16, end: 8), + child: Row( + children: [ + Expanded(child: Text(formatDateTime(copyItemDate, context.locale, use24hour))), + const SizedBox(width: 8), + ItemPicker( + extent: 48, + entry: _copyItemSource, + onTap: _pickCopyItemSource, + ), + ], + ), + ); + } + + Widget _buildShiftContent(BuildContext context) { + return TimeShiftSelector(controller: _timeShiftController); + } + + Widget _buildDestinationFields(BuildContext context) { + return Padding( + // small padding as a workaround to show dialog action divider + padding: const EdgeInsets.only(bottom: 1), + child: ExpansionPanelList( + expansionCallback: (index, isExpanded) { + setState(() => _showOptions = isExpanded); + }, + animationDuration: context.read<DurationsData>().expansionTileAnimation, + expandedHeaderPadding: EdgeInsets.zero, + elevation: 0, + children: [ + ExpansionPanel( + headerBuilder: (context, isExpanded) => ListTile( + title: Text(context.l10n.editEntryDialogTargetFieldsHeader), + ), + body: Column( + children: DateModifier.writableFields + .map( + (field) => SwitchListTile( + value: _fields.contains(field), + onChanged: (selected) { + selected ? _fields.add(field) : _fields.remove(field); + _validate(); + setState(() {}); + }, + title: Text(field.title), + ), + ) + .toList(), + ), + isExpanded: _showOptions, + canTapOnHeader: true, + backgroundColor: Colors.transparent, + ), + ], + ), + ); + } + + Future<void> _editDate() async { + final l10n = context.l10n; + final cancelText = Themes.asButtonLabel(l10n.cancelTooltip); + + final _date = await showDatePicker( + context: context, + initialDate: _customDateTime, + firstDate: DateTime(0), + lastDate: DateTime(2100), + cancelText: cancelText, + confirmText: l10n.nextButtonLabel, + ); + if (_date == null) return; + + final _time = await showTimePicker( + context: context, + initialTime: TimeOfDay.fromDateTime(_customDateTime), + cancelText: cancelText, + ); + if (_time == null) return; + + setState( + () => _customDateTime = DateTime( + _date.year, + _date.month, + _date.day, + _time.hour, + _time.minute, + ), + ); + } + + CollectionLens? _createPickCollection() { + final baseCollection = widget.collection; + return baseCollection != null + ? CollectionLens( + source: baseCollection.source, + filters: baseCollection.filters, + ) + : null; + } + + Future<void> _pickCopyItemSource() async { + final pickCollection = _createPickCollection(); + if (pickCollection == null) return; + + final entry = await Navigator.maybeOf(context)?.push<AvesEntry>( + MaterialPageRoute( + settings: const RouteSettings(name: ItemPickPage.routeName), + builder: (context) => ItemPickPage( + collection: pickCollection, + canRemoveFilters: true, + ), + fullscreenDialog: true, + ), + ); + if (entry != null) { + setState(() => _copyItemSource = entry); + } + } + + DateModifier _getModifier() { + // fields to modify are only set for the `shift` and `remove` actions, + // as the effective fields for the other actions will depend on + // whether each item supports Exif edition + switch (_action) { + case DateEditAction.setCustom: + return DateModifier.setCustom(const {}, _customDateTime); + case DateEditAction.copyField: + return DateModifier.copyField(_copyFieldSource); + case DateEditAction.copyItem: + return DateModifier.setCustom(const {}, copyItemDate); + case DateEditAction.extractFromTitle: + return DateModifier.extractFromTitle(); + case DateEditAction.shift: + return DateModifier.shift(_fields, _timeShiftController.value.inSeconds); + case DateEditAction.remove: + return DateModifier.remove(_fields); + } + } + + void _validate() { + switch (_action) { + case DateEditAction.setCustom: + case DateEditAction.copyField: + case DateEditAction.copyItem: + case DateEditAction.extractFromTitle: + _isValidNotifier.value = true; + case DateEditAction.shift: + case DateEditAction.remove: + _isValidNotifier.value = _fields.isNotEmpty; + } + } + + void _submit(BuildContext context) { + if (_isValidNotifier.value) { + Navigator.maybeOf(context)?.pop(_getModifier()); + } + } +} diff --git a/lib/widgets/dialogs/entry_editors/edit_description_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_description_dialog.dart new file mode 100644 index 0000000..9c85790 --- /dev/null +++ b/lib/widgets/dialogs/entry_editors/edit_description_dialog.dart @@ -0,0 +1,120 @@ +import 'package:aves/model/entry/extensions/metadata_edition.dart'; +import 'package:aves/widgets/common/basic/labeled_checkbox.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/material.dart'; + +class EditEntryTitleDescriptionDialog extends StatefulWidget { + static const routeName = '/dialog/edit_entry_title_description'; + + final String initialTitle, initialDescription; + + const EditEntryTitleDescriptionDialog({ + super.key, + required this.initialTitle, + required this.initialDescription, + }); + + @override + State<EditEntryTitleDescriptionDialog> createState() => _EditEntryTitleDescriptionDialogState(); +} + +class _EditEntryTitleDescriptionDialogState extends State<EditEntryTitleDescriptionDialog> { + final Set<DescriptionField> fields = { + DescriptionField.title, + DescriptionField.description, + }; + late final TextEditingController _titleTextController, _descriptionTextController; + + @override + void initState() { + super.initState(); + _titleTextController = TextEditingController(text: widget.initialTitle); + _descriptionTextController = TextEditingController(text: widget.initialDescription); + } + + @override + void dispose() { + _titleTextController.dispose(); + _descriptionTextController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return MediaQueryDataProvider( + child: Builder( + builder: (context) { + return AvesDialog( + scrollableContent: [ + const SizedBox(height: 8), + ..._buildFieldEditor(DescriptionField.title), + ..._buildFieldEditor(DescriptionField.description), + const SizedBox(height: 8), + ], + actions: [ + const CancelButton(), + TextButton( + onPressed: fields.isEmpty ? null : () => _submit(context), + child: Text(context.l10n.applyButtonLabel), + ), + ], + ); + }, + ), + ); + } + + List<Widget> _buildFieldEditor(DescriptionField field) { + final editing = fields.contains(field); + return [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: LabeledCheckbox( + value: editing, + onChanged: (v) => setState(() => editing ? fields.remove(field) : fields.add(field)), + text: _fieldName(field), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: TextField( + controller: _fieldController(field), + decoration: const InputDecoration( + border: OutlineInputBorder(), + ), + maxLines: null, + enabled: editing, + ), + ), + ]; + } + + TextEditingController _fieldController(DescriptionField field) { + switch (field) { + case DescriptionField.title: + return _titleTextController; + case DescriptionField.description: + return _descriptionTextController; + } + } + + String _fieldName(DescriptionField field) { + final l10n = context.l10n; + return switch (field) { + DescriptionField.title => l10n.viewerInfoLabelTitle, + DescriptionField.description => l10n.viewerInfoLabelDescription, + }; + } + + void _submit(BuildContext context) { + final modifier = Map.fromEntries( + fields.map((field) { + final text = _fieldController(field).text; + return MapEntry(field, text.isEmpty ? null : text); + }), + ); + return Navigator.maybeOf(context)?.pop<Map<DescriptionField, String?>>(modifier); + } +} diff --git a/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart new file mode 100644 index 0000000..90d62ce --- /dev/null +++ b/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart @@ -0,0 +1,633 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:ui'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/entry/extensions/metadata_edition.dart'; +import 'package:aves/model/entry/sort.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/settings/enums/coordinate_format.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/ref/poi.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/format.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/fx/transitions.dart'; +import 'package:aves/widgets/common/identity/aves_caption.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/item_picker.dart'; +import 'package:aves/widgets/dialogs/pick_dialogs/item_pick_page.dart'; +import 'package:aves/widgets/dialogs/pick_dialogs/location_pick_page.dart'; +import 'package:aves/widgets/dialogs/time_shift_dialog.dart'; +import 'package:aves/widgets/map/map_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:gpx/gpx.dart'; +import 'package:intl/intl.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:provider/provider.dart'; + +class EditEntryLocationDialog extends StatefulWidget { + static const routeName = '/dialog/edit_entry_location'; + + final Set<AvesEntry> entries; + final CollectionLens? collection; + + const EditEntryLocationDialog({ + super.key, + required this.entries, + this.collection, + }); + + @override + State<EditEntryLocationDialog> createState() => _EditEntryLocationDialogState(); +} + +class _EditEntryLocationDialogState extends State<EditEntryLocationDialog> with FeedbackMixin { + final Set<StreamSubscription> _subscriptions = {}; + LocationEditAction _action = LocationEditAction.chooseOnMap; + LatLng? _mapCoordinates; + late final AvesEntry mainEntry; + late AvesEntry _copyItemSource; + Gpx? _gpx; + Duration _gpxShift = Duration.zero; + final Map<AvesEntry, LatLng> _gpxMap = {}; + final TextEditingController _latitudeController = TextEditingController(), _longitudeController = TextEditingController(); + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + + late NumberFormat coordinateFormatter; + static const _gpxProjection = SphericalMercator(); + static const _minDurationToGpxPoint = Duration(hours: 1); + + @override + void initState() { + super.initState(); + final entries = widget.entries; + mainEntry = entries.firstWhereOrNull((entry) => entry.hasGps) ?? entries.first; + _mapCoordinates = mainEntry.latLng; + _copyItemSource = mainEntry; + WidgetsBinding.instance.addPostFrameCallback((_) { + coordinateFormatter = NumberFormat('0.000000', context.locale); + final latLng = mainEntry.latLng; + if (latLng != null) { + _latitudeController.text = coordinateFormatter.format(latLng.latitude); + _longitudeController.text = coordinateFormatter.format(latLng.longitude); + } else { + _latitudeController.text = ''; + _longitudeController.text = ''; + } + setState(_validate); + }); + _subscriptions.add(AvesApp.intentEventBus.on<LocationReceivedEvent>().listen((event) => _setCustomLocation(event.location))); + } + + @override + void dispose() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + _latitudeController.dispose(); + _longitudeController.dispose(); + _isValidNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return MediaQueryDataProvider( + child: TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: Builder( + builder: (context) { + final l10n = context.l10n; + + return AvesDialog( + title: l10n.editEntryLocationDialogTitle, + scrollableContent: [ + Padding( + padding: const EdgeInsets.only(left: 16, top: 8, right: 16), + child: TextDropdownButton<LocationEditAction>( + values: LocationEditAction.values, + valueText: (v) => v.getText(context), + value: _action, + onChanged: (v) => setState(() { + _action = v!; + _validate(); + }), + isExpanded: true, + dropdownColor: Themes.thirdLayerColor(context), + ), + ), + AnimatedSwitcher( + duration: context.read<DurationsData>().formTransition, + switchInCurve: Curves.easeInOutCubic, + switchOutCurve: Curves.easeInOutCubic, + transitionBuilder: AvesTransitions.formTransitionBuilder, + child: KeyedSubtree( + key: ValueKey(_action), + child: _buildContent(), + ), + ), + const SizedBox(height: 8), + ], + actions: [ + const CancelButton(), + ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(l10n.applyButtonLabel), + ); + }, + ), + ], + ); + }, + ), + ), + ); + } + + Widget _buildContent() { + switch (_action) { + case LocationEditAction.chooseOnMap: + return _buildChooseOnMapContent(context); + case LocationEditAction.copyItem: + return _buildCopyItemContent(context); + case LocationEditAction.setCustom: + return _buildSetCustomContent(context); + case LocationEditAction.importGpx: + return _buildImportGpxContent(context); + case LocationEditAction.remove: + return const SizedBox(); + } + } + + Widget _buildChooseOnMapContent(BuildContext context) { + return Padding( + padding: const EdgeInsetsDirectional.only(start: 16, end: 8), + child: Row( + children: [ + Expanded(child: _coordinatesText(context, _mapCoordinates)), + const SizedBox(width: 8), + IconButton( + icon: const Icon(AIcons.map), + onPressed: _pickLocation, + tooltip: context.l10n.editEntryLocationDialogChooseOnMap, + ), + ], + ), + ); + } + + void _setCustomLocation(LatLng latLng) { + _latitudeController.text = coordinateFormatter.format(latLng.latitude); + _longitudeController.text = coordinateFormatter.format(latLng.longitude); + _action = LocationEditAction.setCustom; + setState(_validate); + } + + CollectionLens? _createPickCollection() { + final baseCollection = widget.collection; + return baseCollection != null + ? CollectionLens( + source: baseCollection.source, + filters: { + ...baseCollection.filters.whereNot((filter) => filter == LocationFilter.unlocated), + LocationFilter.located, + }, + ) + : null; + } + + Future<void> _pickLocation() async { + final pickCollection = _createPickCollection(); + final latLng = await Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: LocationPickPage.routeName), + builder: (context) => LocationPickPage( + collection: pickCollection, + initialLocation: _mapCoordinates, + ), + fullscreenDialog: true, + ), + ); + if (latLng != null) { + settings.mapDefaultCenter = latLng; + setState(() { + _mapCoordinates = latLng; + _validate(); + }); + } + } + + Widget _buildCopyItemContent(BuildContext context) { + return Padding( + padding: const EdgeInsetsDirectional.only(start: 16, end: 8), + child: Row( + children: [ + Expanded(child: _coordinatesText(context, _copyItemSource.latLng)), + const SizedBox(width: 8), + ItemPicker( + extent: 48, + entry: _copyItemSource, + onTap: _pickCopyItemSource, + ), + ], + ), + ); + } + + Future<void> _pickCopyItemSource() async { + final pickCollection = _createPickCollection(); + if (pickCollection == null) return; + + final entry = await Navigator.maybeOf(context)?.push<AvesEntry>( + MaterialPageRoute( + settings: const RouteSettings(name: ItemPickPage.routeName), + builder: (context) => ItemPickPage( + collection: pickCollection, + canRemoveFilters: true, + ), + fullscreenDialog: true, + ), + ); + if (entry != null) { + setState(() { + _copyItemSource = entry; + _validate(); + }); + } + } + + Widget _buildSetCustomContent(BuildContext context) { + final l10n = context.l10n; + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + children: [ + TextField( + controller: _latitudeController, + decoration: InputDecoration( + labelText: l10n.editEntryLocationDialogLatitude, + hintText: coordinateFormatter.format(PointsOfInterest.pointNemo.latitude), + ), + onChanged: (_) => _validate(), + ), + TextField( + controller: _longitudeController, + decoration: InputDecoration( + labelText: l10n.editEntryLocationDialogLongitude, + hintText: coordinateFormatter.format(PointsOfInterest.pointNemo.longitude), + ), + onChanged: (_) => _validate(), + ), + ], + ), + ), + ], + ), + ); + } + + Widget _buildImportGpxContent(BuildContext context) { + final l10n = context.l10n; + return Padding( + padding: const EdgeInsetsDirectional.only(start: 16, end: 8), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded(child: _gpxDateRangeText(context, _gpx)), + const SizedBox(width: 8), + IconButton( + icon: Icon(AIcons.fileImport), + onPressed: _pickGpx, + tooltip: l10n.pickTooltip, + ), + ], + ), + if (_gpx != null) ...[ + Row( + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(l10n.editEntryLocationDialogTimeShift), + AvesCaption(_formatShiftDuration(_gpxShift)), + ], + ), + ), + const SizedBox(width: 8), + IconButton( + icon: const Icon(AIcons.edit), + onPressed: _pickGpxShift, + tooltip: l10n.changeTooltip, + ), + ], + ), + Row( + children: [ + Expanded(child: Text(l10n.statsWithGps(_gpxMap.length))), + const SizedBox(width: 8), + IconButton( + icon: const Icon(AIcons.map), + onPressed: _previewGpx, + tooltip: l10n.openMapPageTooltip, + ), + ], + ), + ], + ], + ), + ); + } + + Future<void> _pickGpx() async { + final bytes = await storageService.openFile(); + if (bytes.isNotEmpty) { + try { + final allXmlString = utf8.decode(bytes); + final gpx = GpxReader().fromString(allXmlString); + + _gpx = gpx; + _gpxShift = Duration.zero; + _updateGpxMapping(); + + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } catch (error, stack) { + debugPrint('failed to import GPX, error=$error\n$stack'); + showFeedback(context, FeedbackType.warn, context.l10n.genericFailureFeedback); + } + } + } + + Future<void> _pickGpxShift() async { + final newShift = await showDialog<Duration>( + context: context, + builder: (context) => TimeShiftDialog( + initialValue: _gpxShift, + ), + routeSettings: const RouteSettings(name: TimeShiftDialog.routeName), + ); + if (newShift == null) return; + + _gpxShift = newShift; + _updateGpxMapping(); + } + + String _formatShiftDuration(Duration duration) { + final sign = duration.isNegative ? '-' : '+'; + duration = duration.abs(); + final hours = duration.inHours; + duration -= Duration(hours: hours); + final minutes = duration.inMinutes; + duration -= Duration(minutes: minutes); + final seconds = duration.inSeconds; + return '$sign$hours:${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; + } + + void _updateGpxMapping() { + _gpxMap.clear(); + + final gpx = _gpx; + if (gpx == null) return; + + // dated items and points, oldest first + final sortedEntries = widget.entries.where((v) => v.bestDate != null).sorted(AvesEntrySort.compareByDate).reversed.toList(); + final sortedPoints = gpx.trks.expand((trk) => trk.trksegs).expand((trkSeg) => trkSeg.trkpts).where((v) => v.time != null && v.lat != null && v.lon != null).sortedBy((v) => v.time!); + if (sortedEntries.isNotEmpty && sortedPoints.isNotEmpty) { + int entryIndex = 0; + int pointIndex = 0; + + DateTime getEntryDate(AvesEntry entry) => entry.bestDate!; + DateTime getCorrectedPointDate(Wpt wpt) => wpt.time!.add(_gpxShift); + Duration getDurationToPoint(AvesEntry entry, Wpt wpt) => getEntryDate(entry).difference(getCorrectedPointDate(wpt)).abs(); + + while (entryIndex < sortedEntries.length && pointIndex < sortedPoints.length) { + final entry = sortedEntries[entryIndex]; + final wpt = sortedPoints[pointIndex]; + + final entryDate = getEntryDate(entry); + final wptDate = getCorrectedPointDate(wpt); + final durationToPoint = getDurationToPoint(entry, wpt); + + if (entryDate.isAfter(wptDate)) { + if (wpt == sortedPoints.last) { + if (durationToPoint < _minDurationToGpxPoint) { + // assign late entry to last point + _gpxMap[entry] = LatLng(wpt.lat!, wpt.lon!); + } + entryIndex++; + } else { + pointIndex++; + } + } else if (entryDate.isAtSameMomentAs(wptDate)) { + // assign entry to current point + _gpxMap[entry] = LatLng(wpt.lat!, wpt.lon!); + entryIndex++; + } else { + if (wpt == sortedPoints.first) { + if (durationToPoint < _minDurationToGpxPoint) { + // assign early entry to first point + _gpxMap[entry] = LatLng(wpt.lat!, wpt.lon!); + } + } else { + // interpolate entry between previous and current point + final from = sortedPoints[pointIndex - 1]; + final to = wpt; + + final secondsFromStart = getDurationToPoint(entry, from).inSeconds; + final secondsToEnd = getDurationToPoint(entry, to).inSeconds; + final t = (secondsFromStart.toDouble()) / (secondsFromStart + secondsToEnd); + + final fromXY = _gpxProjection.projectXY(LatLng(from.lat!, from.lon!)); + final toXY = _gpxProjection.projectXY(LatLng(to.lat!, to.lon!)); + final entryXY = ( + lerpDouble(fromXY.$1, toXY.$1, t)!, + lerpDouble(fromXY.$2, toXY.$2, t)!, + ); + _gpxMap[entry] = _gpxProjection.unprojectXY(entryXY.$1, entryXY.$2); + } + entryIndex++; + } + } + } + + setState(_validate); + } + + Future<void> _previewGpx() async { + final source = widget.collection?.source; + if (source == null) return; + + final previewEntries = _gpxMap.entries.map((kv) { + final entry = kv.key.copyWith(); + final latLng = kv.value; + final catalogMetadata = entry.catalogMetadata?.copyWith() ?? CatalogMetadata(id: entry.id); + catalogMetadata.latitude = latLng.latitude; + catalogMetadata.longitude = latLng.longitude; + entry.catalogMetadata = catalogMetadata; + return entry; + }).toList(); + + final mapCollection = CollectionLens( + source: source, + listenToSource: false, + fixedSelection: previewEntries, + ); + + final tracks = _gpx?.trks + .expand((trk) => trk.trksegs) + .map( + (trkSeg) => trkSeg.trkpts + .map((wpt) { + final lat = wpt.lat; + final lon = wpt.lon; + return (lat != null && lon != null) ? LatLng(lat, lon) : null; + }) + .nonNulls + .toList(), + ) + .toSet(); + + await Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: LocationPickPage.routeName), + builder: (context) { + return ListenableProvider<ValueNotifier<AppMode>>.value( + value: ValueNotifier(AppMode.previewMap), + child: MapPage( + collection: mapCollection, + tracks: tracks, + ), + ); + }, + fullscreenDialog: true, + ), + ); + } + + Text _unknownText(BuildContext context) { + final l10n = context.l10n; + return Text( + l10n.viewerInfoUnknown, + style: TextStyle( + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ); + } + + (DateTime, DateTime)? _gpxDateRange(Gpx? gpx) { + final firstDate = gpx?.trks.firstOrNull?.trksegs.firstOrNull?.trkpts.firstOrNull?.time; + final lastDate = gpx?.trks.lastOrNull?.trksegs.lastOrNull?.trkpts.lastOrNull?.time; + return firstDate != null && lastDate != null ? (firstDate, lastDate) : null; + } + + Text _gpxDateRangeText(BuildContext context, Gpx? gpx) { + final dateRange = _gpxDateRange(gpx); + if (dateRange != null) { + final (firstDate, lastDate) = dateRange; + final locale = context.locale; + final use24hour = MediaQuery.alwaysUse24HourFormatOf(context); + return Text( + [ + formatDateTime(firstDate.toLocal(), locale, use24hour), + formatDateTime(lastDate.toLocal(), locale, use24hour), + ].join('\n'), + ); + } else { + return _unknownText(context); + } + } + + Text _coordinatesText(BuildContext context, LatLng? latLng) { + final l10n = context.l10n; + if (latLng != null) { + return Text( + ExtraCoordinateFormat.toDMS(l10n, latLng).join('\n'), + ); + } else { + return _unknownText(context); + } + } + + LatLng? _parseLatLng() { + double? tryParse(String text) { + try { + return double.tryParse(text) ?? (coordinateFormatter.parse(text).toDouble()); + } catch (error) { + // ignore + return null; + } + } + + final lat = tryParse(_latitudeController.text); + final lng = tryParse(_longitudeController.text); + if (lat == null || lng == null) return null; + if (lat < -90 || lat > 90 || lng < -180 || lng > 180) return null; + return LatLng(lat, lng); + } + + void _validate() { + switch (_action) { + case LocationEditAction.chooseOnMap: + _isValidNotifier.value = _mapCoordinates != null; + case LocationEditAction.copyItem: + _isValidNotifier.value = _copyItemSource.hasGps; + case LocationEditAction.setCustom: + _isValidNotifier.value = _parseLatLng() != null; + case LocationEditAction.importGpx: + _isValidNotifier.value = _gpxMap.isNotEmpty; + case LocationEditAction.remove: + _isValidNotifier.value = true; + } + } + + void _submit(BuildContext context) { + final navigator = Navigator.maybeOf(context); + final entries = widget.entries; + final LocationEditActionResult result = {}; + void addLocationForAllEntries(LatLng? latLng) => result.addEntries(entries.map((v) => MapEntry(v, latLng))); + switch (_action) { + case LocationEditAction.chooseOnMap: + addLocationForAllEntries(_mapCoordinates); + case LocationEditAction.copyItem: + addLocationForAllEntries(_copyItemSource.latLng); + case LocationEditAction.setCustom: + addLocationForAllEntries(_parseLatLng()); + case LocationEditAction.importGpx: + result.addAll(_gpxMap); + case LocationEditAction.remove: + addLocationForAllEntries(ExtraAvesEntryMetadataEdition.removalLocation); + } + navigator?.pop(result); + } +} + +typedef LocationEditActionResult = Map<AvesEntry, LatLng?>; diff --git a/lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart new file mode 100644 index 0000000..4c68667 --- /dev/null +++ b/lib/widgets/dialogs/entry_editors/edit_rating_dialog.dart @@ -0,0 +1,137 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/material.dart'; + +class EditEntryRatingDialog extends StatefulWidget { + static const routeName = '/dialog/edit_entry_rating'; + + final AvesEntry entry; + + const EditEntryRatingDialog({ + super.key, + required this.entry, + }); + + @override + State<EditEntryRatingDialog> createState() => _EditEntryRatingDialogState(); +} + +class _EditEntryRatingDialogState extends State<EditEntryRatingDialog> { + late _RatingAction _action; + late int _rating; + + @override + void initState() { + super.initState(); + final entryRating = widget.entry.rating; + switch (entryRating) { + case -1: + _action = _RatingAction.rejected; + _rating = 0; + case 0: + _action = _RatingAction.unrated; + _rating = 0; + default: + _action = _RatingAction.set; + _rating = entryRating; + } + } + + @override + Widget build(BuildContext context) { + return MediaQueryDataProvider( + child: TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: Builder( + builder: (context) { + final l10n = context.l10n; + + return AvesDialog( + title: l10n.editEntryRatingDialogTitle, + scrollableContent: [ + RadioGroup( + groupValue: _action, + onChanged: (v) { + if (v != _RatingAction.set) { + _rating = 0; + } + setState(() => _action = v!); + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RadioListTile<_RatingAction>( + value: _RatingAction.set, + title: Wrap( + children: [ + ...List.generate(5, (i) { + final thisRating = i + 1; + final disabled = _rating < thisRating; + return GestureDetector( + onTap: () => setState(() { + _action = _RatingAction.set; + _rating = thisRating; + }), + behavior: HitTestBehavior.opaque, + child: Padding( + padding: const EdgeInsets.all(4), + child: Icon( + AIcons.rating, + fill: disabled ? 0 : 1, + color: disabled ? AColors.starDisabled : AColors.starEnabled, + ), + ), + ); + }), + ], + ), + ), + RadioListTile<_RatingAction>( + value: _RatingAction.rejected, + title: Text(l10n.filterRatingRejectedLabel), + ), + RadioListTile<_RatingAction>( + value: _RatingAction.unrated, + title: Text(l10n.filterNoRatingLabel), + ), + ], + ), + ), + ], + actions: [ + const CancelButton(), + TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(l10n.applyButtonLabel), + ), + ], + ); + }, + ), + ), + ); + } + + bool get isValid => !(_action == _RatingAction.set && _rating <= 0); + + void _submit(BuildContext context) { + late int entryRating; + switch (_action) { + case _RatingAction.set: + entryRating = _rating; + case _RatingAction.rejected: + entryRating = -1; + case _RatingAction.unrated: + entryRating = 0; + } + Navigator.maybeOf(context)?.pop(entryRating); + } +} + +enum _RatingAction { set, rejected, unrated } diff --git a/lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart b/lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart new file mode 100644 index 0000000..adebe66 --- /dev/null +++ b/lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart @@ -0,0 +1,158 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/ref/brand_colors.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/basic/text/outlined.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/fx/highlight_decoration.dart'; +import 'package:aves/widgets/common/identity/highlight_title.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class RemoveEntryMetadataDialog extends StatefulWidget { + static const routeName = '/dialog/remove_entry_metadata'; + + final bool showJpegTypes; + + const RemoveEntryMetadataDialog({ + super.key, + required this.showJpegTypes, + }); + + @override + State<RemoveEntryMetadataDialog> createState() => _RemoveEntryMetadataDialogState(); +} + +class _RemoveEntryMetadataDialogState extends State<RemoveEntryMetadataDialog> { + late final List<MetadataType> _allOptions, _mainOptions, _moreOptions; + final Set<MetadataType> _types = {}; + bool _showMore = false; + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + + @override + void initState() { + super.initState(); + _allOptions = [ + ...MetadataTypes.common, + if (widget.showJpegTypes) ...MetadataTypes.jpeg, + ]; + final byMain = groupBy(_allOptions, MetadataTypes.main.contains); + _mainOptions = (byMain[true] ?? [])..sort(_compareTypeText); + _moreOptions = (byMain[false] ?? [])..sort(_compareTypeText); + _validate(); + } + + @override + void dispose() { + _isValidNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final animationDuration = context.select<DurationsData, Duration>((v) => v.expansionTileAnimation); + return AvesDialog( + title: l10n.removeEntryMetadataDialogTitle, + scrollableContent: [ + SwitchListTile( + value: _types.length == _allOptions.length, + onChanged: (selected) { + selected ? _types.addAll(_allOptions) : _types.clear(); + setState(_validate); + }, + title: Align( + alignment: Alignment.centerLeft, + child: Text(l10n.removeEntryMetadataDialogAll), + ), + ), + ..._mainOptions.map(_toTile), + if (_moreOptions.isNotEmpty) + Padding( + padding: const EdgeInsets.only(bottom: 1), + child: ExpansionPanelList( + expansionCallback: (index, isExpanded) { + setState(() => _showMore = isExpanded); + }, + animationDuration: animationDuration, + expandedHeaderPadding: EdgeInsets.zero, + elevation: 0, + children: [ + ExpansionPanel( + headerBuilder: (context, isExpanded) => ListTile( + title: Text(l10n.removeEntryMetadataDialogMore), + ), + body: Column( + children: _moreOptions.map(_toTile).toList(), + ), + isExpanded: _showMore, + canTapOnHeader: true, + backgroundColor: Colors.transparent, + ), + ], + ), + ), + ], + actions: [ + const CancelButton(), + ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(context.l10n.applyButtonLabel), + ); + }, + ), + ], + ); + } + + int _compareTypeText(MetadataType a, MetadataType b) => a.getText().compareTo(b.getText()); + + Widget _toTile(MetadataType type) { + final text = type.getText(); + Widget child = OutlinedText( + textSpans: [ + TextSpan( + text: text, + style: TextStyle( + shadows: HighlightTitle.shadows(context), + ), + ), + ], + outlineColor: Themes.firstLayerColor(context), + ); + if (context.select<Settings, bool>((v) => v.themeColorMode == AvesThemeColorMode.polychrome)) { + final colors = context.watch<AvesColorsData>(); + child = Container( + padding: const EdgeInsets.symmetric(horizontal: 2), + decoration: HighlightDecoration( + color: colors.fromBrandColor(BrandColors.get(text)) ?? colors.fromString(text), + ), + child: child, + ); + } + + return SwitchListTile( + value: _types.contains(type), + onChanged: (selected) { + selected ? _types.add(type) : _types.remove(type); + setState(_validate); + }, + title: Align( + alignment: Alignment.centerLeft, + child: child, + ), + ); + } + + void _validate() => _isValidNotifier.value = _types.isNotEmpty; + + void _submit(BuildContext context) => Navigator.maybeOf(context)?.pop(_types); +} diff --git a/lib/widgets/dialogs/entry_editors/rename_entry_dialog.dart b/lib/widgets/dialogs/entry_editors/rename_entry_dialog.dart new file mode 100644 index 0000000..05d4f89 --- /dev/null +++ b/lib/widgets/dialogs/entry_editors/rename_entry_dialog.dart @@ -0,0 +1,105 @@ +import 'dart:io'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +class RenameEntryDialog extends StatefulWidget { + static const routeName = '/dialog/rename_entry'; + + final AvesEntry entry; + + const RenameEntryDialog({ + super.key, + required this.entry, + }); + + @override + State<RenameEntryDialog> createState() => _RenameEntryDialogState(); +} + +class _RenameEntryDialogState extends State<RenameEntryDialog> { + final TextEditingController _nameController = TextEditingController(); + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + + AvesEntry get entry => widget.entry; + + @override + void initState() { + super.initState(); + _nameController.text = entry.filenameWithoutExtension ?? entry.sourceTitle ?? ''; + _validate(); + } + + @override + void dispose() { + _nameController.dispose(); + _isValidNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AvesDialog( + content: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded( + child: TextField( + controller: _nameController, + decoration: InputDecoration( + labelText: context.l10n.renameEntryDialogLabel, + ), + autofocus: true, + maxLines: null, + onChanged: (_) => _validate(), + onSubmitted: (_) => _submit(context), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.only(start: 4, bottom: 12), + child: Text( + '${Unicode.FSI}${entry.extension}${Unicode.PDI}', + style: TextStyle(color: Theme.of(context).hintColor), + ), + ), + ], + ), + actions: [ + const CancelButton(), + ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(context.l10n.applyButtonLabel), + ); + }, + ), + ], + ); + } + + String _buildEntryPath(String name) { + if (name.isEmpty) return ''; + return pContext.join(entry.directory!, '$name${entry.extension}'); + } + + String get newName => _nameController.text.trimLeft().replaceAll('\n', ''); + + Future<void> _validate() async { + final _newName = newName; + final path = _buildEntryPath(_newName); + final exists = _newName.isNotEmpty && await FileSystemEntity.type(path) != FileSystemEntityType.notFound; + _isValidNotifier.value = _newName.isNotEmpty && !exists; + } + + void _submit(BuildContext context) { + if (_isValidNotifier.value) { + Navigator.maybeOf(context)?.pop(newName); + } + } +} diff --git a/lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart b/lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart new file mode 100644 index 0000000..131fc63 --- /dev/null +++ b/lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart @@ -0,0 +1,266 @@ +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/naming_pattern.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/collection/collection_grid.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/basic/popup/expansion_panel.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/grid/theme.dart'; +import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; +import 'package:aves/widgets/common/thumbnail/decorated.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +class RenameEntrySetPage extends StatefulWidget { + static const routeName = '/rename_entry_set'; + + final List<AvesEntry> entries; + + const RenameEntrySetPage({ + super.key, + required this.entries, + }); + + @override + State<RenameEntrySetPage> createState() => _RenameEntrySetPageState(); +} + +class _RenameEntrySetPageState extends State<RenameEntrySetPage> { + final TextEditingController _patternTextController = TextEditingController(); + final ValueNotifier<NamingPattern> _namingPatternNotifier = ValueNotifier<NamingPattern>(const NamingPattern([])); + late final String locale; + + static const int previewMax = 10; + static const double thumbnailExtent = 48; + + List<AvesEntry> get entries => widget.entries; + + int get entryCount => entries.length; + + @override + void initState() { + super.initState(); + _patternTextController.text = settings.entryRenamingPattern; + _patternTextController.addListener(_onUserPatternChanged); + + WidgetsBinding.instance.addPostFrameCallback((_) { + locale = context.locale; + _onUserPatternChanged(); + }); + } + + @override + void dispose() { + _patternTextController.dispose(); + _namingPatternNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final textScaler = MediaQuery.textScalerOf(context); + final effectiveThumbnailExtent = max(thumbnailExtent, textScaler.scale(thumbnailExtent)); + final animations = context.select<Settings, AccessibilityAnimations>((v) => v.accessibilityAnimations); + return AvesScaffold( + appBar: AppBar( + title: Text(l10n.renameEntrySetPageTitle), + ), + body: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded( + child: TextField( + controller: _patternTextController, + decoration: InputDecoration( + labelText: l10n.renameEntrySetPagePatternFieldLabel, + ), + autofocus: true, + ), + ), + FontSizeIconTheme( + child: PopupMenuButton<String>( + itemBuilder: (context) { + return [ + PopupMenuItem( + value: NameNamingProcessor.key, + child: MenuRow(text: l10n.renameProcessorName, icon: const Icon(AIcons.name)), + ), + PopupMenuItem( + value: CounterNamingProcessor.key, + child: MenuRow(text: l10n.renameProcessorCounter, icon: const Icon(AIcons.counter)), + ), + PopupMenuItem( + value: DateNamingProcessor.key, + child: MenuRow(text: l10n.viewerInfoLabelDate, icon: const Icon(AIcons.date)), + ), + PopupMenuItem( + value: TagsNamingProcessor.key, + child: MenuRow(text: l10n.tagPageTitle, icon: const Icon(AIcons.tag)), + ), + PopupMenuItem( + value: WidthNamingProcessor.key, + child: MenuRow(text: l10n.exportEntryDialogWidth, icon: const Icon(AIcons.width)), + ), + PopupMenuItem( + value: HeightNamingProcessor.key, + child: MenuRow(text: l10n.exportEntryDialogHeight, icon: const Icon(AIcons.height)), + ), + PopupMenuExpansionPanel<String>( + value: MetadataFieldNamingProcessor.key, + icon: AIcons.more, + title: MaterialLocalizations.of(context).moreButtonTooltip, + items: [ + ...[ + MetadataField.exifMake, + MetadataField.exifModel, + ].map( + (field) => PopupMenuItem( + value: MetadataFieldNamingProcessor.keyWithField(field), + child: MenuRow(text: field.title), + ), + ), + PopupMenuItem( + value: HashNamingProcessor.key, + child: MenuRow(text: l10n.renameProcessorHash), + ), + ], + ), + ]; + }, + onSelected: (key) async { + // wait for the popup menu to hide before proceeding with the action + await Future.delayed(animations.popUpAnimationDelay * timeDilation); + _insertProcessor(key); + }, + tooltip: l10n.renameEntrySetPageInsertTooltip, + icon: const Icon(AIcons.add), + popUpAnimationStyle: animations.popUpAnimationStyle, + ), + ), + ], + ), + ), + const Divider(), + Padding( + padding: const EdgeInsets.all(16), + child: Text( + l10n.renameEntrySetPagePreviewSectionTitle, + style: AStyles.knownTitleText, + ), + ), + Expanded( + child: GridTheme( + extent: effectiveThumbnailExtent, + child: ListView.separated( + physics: const NeverScrollableScrollPhysics(), + padding: const EdgeInsets.symmetric(vertical: 12), + itemBuilder: (context, index) { + final entry = entries[index]; + final sourceName = entry.filenameWithoutExtension ?? ''; + return Row( + children: [ + DecoratedThumbnail( + entry: entry, + tileExtent: effectiveThumbnailExtent, + selectable: false, + highlightable: false, + ), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + sourceName, + style: TextStyle(color: Theme.of(context).colorScheme.onSurfaceVariant), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + const SizedBox(height: 4), + ValueListenableBuilder<NamingPattern>( + valueListenable: _namingPatternNotifier, + builder: (context, pattern, child) { + return FutureBuilder<String>( + future: pattern.apply(entry, index), + builder: (context, snapshot) { + final info = snapshot.data; + return Text( + info ?? '…', + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ); + }, + ); + }, + ), + ], + ), + ), + ], + ); + }, + separatorBuilder: (context, index) => const SizedBox( + height: CollectionGrid.fixedExtentLayoutSpacing, + ), + itemCount: min(entryCount, previewMax), + ), + ), + ), + const Divider(height: 0), + Center( + child: Padding( + padding: const EdgeInsets.all(8), + child: AvesOutlinedButton( + label: l10n.entryActionRename, + onPressed: () { + settings.entryRenamingPattern = _patternTextController.text; + Navigator.maybeOf(context)?.pop<NamingPattern>(_namingPatternNotifier.value); + }, + ), + ), + ), + ], + ), + ), + ); + } + + void _onUserPatternChanged() { + _namingPatternNotifier.value = NamingPattern.from( + userPattern: _patternTextController.text, + entryCount: entryCount, + locale: locale, + ); + } + + void _insertProcessor(String key) { + final userPattern = _patternTextController.text; + final selection = _patternTextController.selection; + _patternTextController.value = _patternTextController.value.replaced( + TextRange( + start: NamingPattern.getInsertionOffset(userPattern, selection.start), + end: NamingPattern.getInsertionOffset(userPattern, selection.end), + ), + NamingPattern.defaultPatternFor(key), + ); + } +} diff --git a/lib/widgets/dialogs/entry_editors/tag_editor_page.dart b/lib/widgets/dialogs/entry_editors/tag_editor_page.dart new file mode 100644 index 0000000..6904550 --- /dev/null +++ b/lib/widgets/dialogs/entry_editors/tag_editor_page.dart @@ -0,0 +1,368 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/placeholder.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/expandable_filter_row.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class TagEditorPage extends StatefulWidget { + static const routeName = '/info/tag_editor'; + + final Map<AvesEntry, Set<TagFilter>> tagsByEntry; + + const TagEditorPage({ + super.key, + required this.tagsByEntry, + }); + + @override + State<TagEditorPage> createState() => _TagEditorPageState(); +} + +class _TagEditorPageState extends State<TagEditorPage> { + final TextEditingController _newTagTextController = TextEditingController(); + final FocusNode _newTagTextFocusNode = FocusNode(); + final ValueNotifier<String?> _expandedSectionNotifier = ValueNotifier(null); + late final Map<AvesEntry, Set<CollectionFilter>> filtersByEntry; + late final List<CollectionFilter> _topTags; + final List<CollectionFilter> _userAddedFilters = []; + + static final List<PlaceholderFilter> _placeholders = [ + PlaceholderFilter.country, + PlaceholderFilter.state, + PlaceholderFilter.place, + ]; + + @override + void initState() { + super.initState(); + filtersByEntry = widget.tagsByEntry.map((key, value) => MapEntry(key, value.cast<CollectionFilter>().toSet())); + _expandedSectionNotifier.value = settings.tagEditorExpandedSection; + _expandedSectionNotifier.addListener(() => settings.tagEditorExpandedSection = _expandedSectionNotifier.value); + _initTopTags(); + WidgetsBinding.instance.addPostFrameCallback((_) { + final source = context.read<CollectionSource?>(); + settings.removeObsoleteRecentTags(source); + }); + } + + @override + void dispose() { + _newTagTextController.dispose(); + _newTagTextFocusNode.dispose(); + _expandedSectionNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final showCount = filtersByEntry.length > 1; + final Map<CollectionFilter, int> entryCountByTag = {}; + filtersByEntry.entries.forEach((kv) { + kv.value.forEach((tag) => entryCountByTag[tag] = (entryCountByTag[tag] ?? 0) + 1); + }); + List<MapEntry<CollectionFilter, int>> sortedTags = _sortCurrentTags(entryCountByTag); + + final untaggedColor = Themes.backgroundTextColor(context); + + return PopScope( + canPop: !_isModified, + onPopInvokedWithResult: (didPop, result) async { + if (didPop) return; + + final NavigatorState navigator = Navigator.of(context); + if (await showConfirmationDialog( + context: context, + message: context.l10n.tagEditorDiscardDialogMessage, + )) { + navigator.pop(); + } + }, + child: AvesScaffold( + appBar: AppBar( + title: Text(l10n.tagEditorPageTitle), + actions: [ + IconButton( + icon: const Icon(AIcons.reset), + onPressed: _reset, + tooltip: l10n.resetTooltip, + ), + IconButton( + icon: const Icon(AIcons.apply), + onPressed: () => Navigator.maybeOf(context)?.pop(filtersByEntry), + tooltip: l10n.saveTooltip, + ), + const SizedBox(width: 16), + ], + ), + body: SafeArea( + child: ValueListenableBuilder<String?>( + valueListenable: _expandedSectionNotifier, + builder: (context, expandedSection, child) { + return ValueListenableBuilder<TextEditingValue>( + valueListenable: _newTagTextController, + builder: (context, value, child) { + final upQuery = value.text.trim().toUpperCase(); + bool containQuery(CollectionFilter v) => v.getLabel(context).toUpperCase().contains(upQuery); + final recentFilters = settings.recentTags.where(containQuery).toList(); + final topTagFilters = _topTags.where(containQuery).toList(); + final placeholderFilters = _placeholders.where(containQuery).toList(); + return ListView( + children: [ + Padding( + padding: const EdgeInsetsDirectional.only(start: 8, end: 16), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded( + child: TextField( + controller: _newTagTextController, + focusNode: _newTagTextFocusNode, + decoration: InputDecoration( + labelText: l10n.tagEditorPageNewTagFieldLabel, + ), + autofocus: true, + onSubmitted: (newTag) { + _addCustomTag(newTag); + _newTagTextFocusNode.requestFocus(); + }, + ), + ), + ValueListenableBuilder<TextEditingValue>( + valueListenable: _newTagTextController, + builder: (context, value, child) { + return IconButton( + icon: const Icon(AIcons.add), + onPressed: value.text.trim().isEmpty ? null : () => _addCustomTag(_newTagTextController.text), + tooltip: l10n.tagEditorPageAddTagTooltip, + ); + }, + ), + Selector<Settings, bool>( + selector: (context, s) => s.tagEditorCurrentFilterSectionExpanded, + builder: (context, isExpanded, child) { + return IconButton( + icon: Icon(isExpanded ? AIcons.collapse : AIcons.expand), + onPressed: sortedTags.isEmpty ? null : () => settings.tagEditorCurrentFilterSectionExpanded = !isExpanded, + tooltip: isExpanded ? MaterialLocalizations.of(context).expandedIconTapHint : MaterialLocalizations.of(context).collapsedIconTapHint, + ); + }, + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: AnimatedCrossFade( + firstChild: ConstrainedBox( + constraints: const BoxConstraints(minHeight: AvesFilterChip.minChipHeight), + child: Center( + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(AIcons.tagUntagged, color: untaggedColor), + const SizedBox(width: 8), + Text( + l10n.filterNoTagLabel, + style: TextStyle(color: untaggedColor), + ), + ], + ), + ), + ), + secondChild: ExpandableFilterRow( + filters: sortedTags.map((kv) => kv.key).toList(), + isExpanded: context.select<Settings, bool>((v) => v.tagEditorCurrentFilterSectionExpanded), + showGenericIcon: false, + leadingBuilder: showCount + ? (filter) => _TagCount( + count: sortedTags.firstWhere((kv) => kv.key == filter).value, + ) + : null, + onTap: (filter) { + if (filtersByEntry.keys.length > 1) { + // for multiple entries, set tag for all of them + filtersByEntry.forEach((entry, filters) => filters.add(filter)); + setState(() {}); + } else { + // for single entry, remove tag (like pressing on the remove icon) + _removeTag(filter); + } + }, + onRemove: _removeTag, + onLongPress: null, + ), + crossFadeState: sortedTags.isEmpty ? CrossFadeState.showFirst : CrossFadeState.showSecond, + duration: ADurations.tagEditorTransition, + ), + ), + const Divider(height: 0), + _FilterRow( + title: l10n.statsTopTagsSectionTitle, + filters: topTagFilters, + expandedNotifier: _expandedSectionNotifier, + onTap: _addTag, + ), + _FilterRow( + title: l10n.tagEditorSectionRecent, + filters: recentFilters, + expandedNotifier: _expandedSectionNotifier, + onTap: _addTag, + ), + _FilterRow( + title: l10n.tagEditorSectionPlaceholders, + filters: placeholderFilters, + expandedNotifier: _expandedSectionNotifier, + onTap: _addTag, + ), + ], + ); + }, + ); + }, + ), + ), + ), + ); + } + + void _initTopTags() { + final Map<String, int> entryCountByTag = {}; + final visibleEntries = context.read<CollectionSource?>()?.visibleEntries; + visibleEntries?.forEach((entry) { + entry.tags.forEach((tag) => entryCountByTag[tag] = (entryCountByTag[tag] ?? 0) + 1); + }); + List<MapEntry<CollectionFilter, int>> sortedTopTags = _sortCurrentTags(entryCountByTag.map((key, value) => MapEntry(TagFilter(key), value))); + _topTags = sortedTopTags.map((kv) => kv.key).toList(); + } + + List<MapEntry<CollectionFilter, int>> _sortCurrentTags(Map<CollectionFilter, int> entryCountByTag) { + return entryCountByTag.entries.toList()..sort((kv1, kv2) { + final filter1 = kv1.key; + final filter2 = kv2.key; + + final recent1 = _userAddedFilters.indexOf(filter1); + final recent2 = _userAddedFilters.indexOf(filter2); + var c = recent2.compareTo(recent1); + if (c != 0) return c; + + final count1 = kv1.value; + final count2 = kv2.value; + c = count2.compareTo(count1); + if (c != 0) return c; + + return filter1.compareTo(filter2); + }); + } + + bool get _isModified { + for (final kv in filtersByEntry.entries) { + final oldFilters = kv.key.tags.map(TagFilter.new).toSet(); + final newFilters = kv.value; + if (newFilters.length != oldFilters.length || !newFilters.containsAll(oldFilters)) return true; + } + return false; + } + + void _reset() { + _userAddedFilters.clear(); + filtersByEntry.forEach((entry, tags) { + final originalFilters = entry.tags.map(TagFilter.new).toSet(); + tags + ..clear() + ..addAll(originalFilters); + }); + setState(() {}); + } + + void _addCustomTag(String newTag) { + newTag = newTag.trim(); + if (newTag.isNotEmpty) { + _addTag(TagFilter(newTag)); + } + } + + void _addTag(CollectionFilter filter) { + settings.recentTags = settings.recentTags + ..remove(filter) + ..insert(0, filter); + _userAddedFilters + ..remove(filter) + ..add(filter); + filtersByEntry.forEach((entry, tags) => tags.add(filter)); + _newTagTextController.clear(); + setState(() {}); + } + + void _removeTag(CollectionFilter filter) { + _userAddedFilters.remove(filter); + filtersByEntry.forEach((entry, filters) => filters.remove(filter)); + setState(() {}); + } +} + +class _FilterRow extends StatelessWidget { + final String title; + final List<CollectionFilter> filters; + final ValueNotifier<String?> expandedNotifier; + final void Function(CollectionFilter filter) onTap; + + const _FilterRow({ + required this.title, + required this.filters, + required this.expandedNotifier, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return filters.isEmpty + ? const SizedBox() + : TitledExpandableFilterRow( + title: title, + filters: filters, + expandedNotifier: expandedNotifier, + showGenericIcon: false, + onTap: onTap, + onLongPress: null, + ); + } +} + +class _TagCount extends StatelessWidget { + final int count; + + const _TagCount({ + required this.count, + }); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(vertical: 2, horizontal: 6), + decoration: BoxDecoration( + border: Border.fromBorderSide( + BorderSide( + color: DefaultTextStyle.of(context).style.color!, + ), + ), + borderRadius: const BorderRadius.all(Radius.circular(123)), + ), + child: Text( + '$count', + style: const TextStyle(fontSize: AvesFilterChip.fontSize), + ), + ); + } +} diff --git a/lib/widgets/dialogs/export_collection_stats_page.dart b/lib/widgets/dialogs/export_collection_stats_page.dart new file mode 100644 index 0000000..308785f --- /dev/null +++ b/lib/widgets/dialogs/export_collection_stats_page.dart @@ -0,0 +1,143 @@ +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/utils/mime_utils.dart'; +import 'package:aves/view/src/metadata/exportable_fields.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/basic/text/outlined.dart'; +import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; +import 'package:aves/widgets/common/identity/highlight_title.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +class ExportCollectionStatsPage extends StatefulWidget { + static const routeName = '/collection/stats/export'; + + final String Function(ExportableEntryField field) previewer; + + const ExportCollectionStatsPage({ + super.key, + required this.previewer, + }); + + @override + State<ExportCollectionStatsPage> createState() => _ExportCollectionStatsPageState(); +} + +class _ExportCollectionStatsPageState extends State<ExportCollectionStatsPage> { + static const List<ExportableEntryField> _entryFieldOptions = ExportableEntryField.values; + final Set<ExportableEntryField> _selectedFields = {}; + static const List<String> _exportMimeTypeOptions = [MimeTypes.csv, MimeTypes.json]; + late String _exportMimeType; + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + + @override + void initState() { + super.initState(); + _exportMimeType = MimeTypes.csv; + _validate(); + } + + @override + void dispose() { + _isValidNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return AvesScaffold( + appBar: AppBar( + title: Text(l10n.settingsActionExport), + ), + body: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: ListView( + children: _entryFieldOptions.map(_toTile).toList(), + ), + ), + const Divider(height: 0), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text(l10n.exportEntryDialogFormat), + const SizedBox(width: 16), + TextDropdownButton<String>( + values: _exportMimeTypeOptions, + valueText: MimeUtils.displayType, + value: _exportMimeType, + onChanged: (v) { + _exportMimeType = v!; + setState(() {}); + }, + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return Wrap( + alignment: WrapAlignment.end, + spacing: 16, + children: [ + AvesOutlinedButton( + label: context.l10n.entryActionCopyToClipboard, + onPressed: isValid ? () => _submit(context, ExportTarget.clipboard) : null, + ), + AvesOutlinedButton( + label: context.l10n.saveTooltip, + onPressed: isValid ? () => _submit(context, ExportTarget.file) : null, + ), + ], + ); + }, + ), + ), + ], + ), + ), + ); + } + + Widget _toTile(ExportableEntryField field) { + final preview = widget.previewer(field); + return SwitchListTile( + value: _selectedFields.contains(field), + subtitle: preview.isNotEmpty ? Text(preview) : null, + onChanged: (selected) { + selected ? _selectedFields.add(field) : _selectedFields.remove(field); + setState(_validate); + }, + title: Align( + alignment: Alignment.centerLeft, + child: OutlinedText( + textSpans: [ + TextSpan( + text: field.getText(context), + style: TextStyle( + shadows: HighlightTitle.shadows(context), + ), + ), + ], + outlineColor: Themes.firstLayerColor(context), + ), + ), + ); + } + + void _validate() => _isValidNotifier.value = _selectedFields.isNotEmpty; + + void _submit(BuildContext context, ExportTarget target) => Navigator.maybeOf(context)?.pop((_exportMimeType, _selectedFields, target)); +} + +enum ExportTarget { clipboard, file } diff --git a/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart b/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart new file mode 100644 index 0000000..3817fdd --- /dev/null +++ b/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart @@ -0,0 +1,466 @@ +import 'dart:math'; + +import 'package:aves/image_providers/app_icon_image_provider.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/color_indicator.dart'; +import 'package:aves/widgets/common/basic/list_tiles/color.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/item_picker.dart'; +import 'package:aves/widgets/dialogs/pick_dialogs/app_pick_page.dart'; +import 'package:aves/widgets/dialogs/pick_dialogs/item_pick_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:provider/provider.dart'; + +class CoverSelectionDialog extends StatefulWidget { + static const routeName = '/dialog/select_cover'; + + final CollectionFilter filter; + final AvesEntry? customEntry; + final String? customPackage; + final Color? customColor; + + const CoverSelectionDialog({ + super.key, + required this.filter, + required this.customEntry, + required this.customPackage, + required this.customColor, + }); + + @override + State<CoverSelectionDialog> createState() => _CoverSelectionDialogState(); +} + +class _CoverSelectionDialogState extends State<CoverSelectionDialog> { + late bool _isCustomEntry, _isCustomPackage, _isCustomColor; + AvesEntry? _customEntry; + String? _customPackage; + Color? _customColor; + + CollectionFilter get filter => widget.filter; + + bool get showAppTab => filter is StoredAlbumFilter && settings.isInstalledAppAccessAllowed; + + bool get showColorTab => settings.themeColorMode == AvesThemeColorMode.polychrome; + + static const double itemPickerExtent = 46; + static const double appPickerExtent = 32; + + double tabBarHeight(BuildContext context) { + return MediaQuery.textScalerOf(context).clamp(minScaleFactor: 1).scale(64); + } + + static const double tabIndicatorWeight = 2; + + @override + void initState() { + super.initState(); + + _customEntry = widget.customEntry; + _isCustomEntry = _customEntry != null; + + _customPackage = widget.customPackage; + _isCustomPackage = _customPackage != null; + + _customColor = widget.customColor; + _isCustomColor = _customColor != null; + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final tabs = <(Tab, Widget)>[ + ( + _buildTab( + context, + const Key('tab-entry'), + AIcons.image, + l10n.coverDialogTabCover, + ), + RadioGroup( + groupValue: _isCustomEntry, + onChanged: (v) { + if (v == null) return; + if (v && _customEntry == null) { + _pickEntry(); + return; + } + _isCustomEntry = v; + setState(() {}); + }, + child: Column(children: _buildEntryOptions()), + ), + ), + if (showAppTab) + ( + _buildTab( + context, + const Key('tab-package'), + AIcons.app, + l10n.coverDialogTabApp, + ), + RadioGroup( + groupValue: _isCustomPackage, + onChanged: (v) { + if (v == null) return; + if (v && _customPackage == null) { + _pickPackage(); + return; + } + _isCustomPackage = v; + setState(() {}); + }, + child: Column(children: _buildAppOptions()), + ), + ), + if (showColorTab) + ( + _buildTab( + context, + const Key('tab-color'), + AIcons.palette, + l10n.coverDialogTabColor, + ), + RadioGroup( + groupValue: _isCustomColor, + onChanged: (v) { + if (v == null) return; + if (v && _customColor == null) { + _pickColor(); + return; + } + _isCustomColor = v; + setState(() {}); + }, + child: Column(children: _buildColorOptions()), + ), + ), + ]; + + final contentWidget = DecoratedBox( + decoration: AvesDialog.contentDecoration(context), + child: LayoutBuilder( + builder: (context, constraints) { + final availableBodyHeight = constraints.maxHeight - tabBarHeight(context) - tabIndicatorWeight; + final maxHeight = min(availableBodyHeight, tabBodyMaxHeight(context)); + return DefaultTabController( + length: 1 + (showAppTab ? 1 : 0) + (showColorTab ? 1 : 0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Material( + borderRadius: const BorderRadius.vertical( + top: AvesDialog.cornerRadius, + ), + clipBehavior: Clip.antiAlias, + child: TabBar( + indicatorWeight: tabIndicatorWeight, + tabs: tabs.map((t) => t.$1).toList(), + ), + ), + ConstrainedBox( + constraints: BoxConstraints(maxHeight: maxHeight), + child: TabBarView( + physics: const NeverScrollableScrollPhysics(), + children: tabs + .map( + (t) => SingleChildScrollView( + child: t.$2, + ), + ) + .toList(), + ), + ), + ], + ), + ); + }, + ), + ); + + final actionsWidget = Padding( + padding: AvesDialog.actionsPadding, + child: OverflowBar( + alignment: MainAxisAlignment.end, + spacing: AvesDialog.buttonPadding.horizontal / 2, + overflowAlignment: OverflowBarAlignment.end, + children: [ + const CancelButton(), + TextButton( + onPressed: () { + final entry = _isCustomEntry ? _customEntry : null; + final package = _isCustomPackage ? _customPackage : null; + final color = _isCustomColor ? _customColor : null; + return Navigator.maybeOf(context)?.pop<(AvesEntry?, String?, Color?)>((entry, package, color)); + }, + child: Text(l10n.applyButtonLabel), + ), + ], + ), + ); + + Widget dialogChild = LayoutBuilder( + builder: (context, constraints) { + final availableBodyWidth = constraints.maxWidth; + final maxWidth = min(availableBodyWidth, tabBodyMaxWidth(context)); + return ConstrainedBox( + constraints: BoxConstraints(maxWidth: maxWidth), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Flexible(child: contentWidget), + actionsWidget, + ], + ), + ); + }, + ); + + return Dialog( + shape: AvesDialog.shape(context), + child: dialogChild, + ); + } + + List<Widget> _buildEntryOptions() { + final l10n = context.l10n; + return [false, true].map( + (isCustom) { + final title = Text( + isCustom ? l10n.setCoverDialogCustom : l10n.setCoverDialogLatest, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ); + return ListTileTheme.merge( + minVerticalPadding: isCustom && _customEntry != null ? 0 : null, + child: RadioListTile<bool>( + value: isCustom, + title: isCustom + ? Row( + children: [ + title, + const Spacer(), + if (_customEntry != null) + ItemPicker( + extent: itemPickerExtent, + entry: _customEntry!, + onTap: _pickEntry, + ), + ], + ) + : title, + ), + ); + }, + ).toList(); + } + + List<Widget> _buildAppOptions() { + final l10n = context.l10n; + return [false, true].map( + (isCustom) { + final title = Text( + isCustom ? l10n.setCoverDialogCustom : l10n.setCoverDialogAuto, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ); + return RadioListTile<bool>( + value: isCustom, + title: isCustom + ? Row( + children: [ + title, + const Spacer(), + if (_customPackage != null) + GestureDetector( + onTap: _pickPackage, + child: _customPackage!.isNotEmpty + ? Image( + image: AppIconImage( + packageName: _customPackage!, + size: appPickerExtent, + ), + width: appPickerExtent, + height: appPickerExtent, + ) + : Container( + height: appPickerExtent, + width: appPickerExtent, + decoration: BoxDecoration( + border: AvesBorder.border(context), + shape: BoxShape.circle, + ), + child: const Icon(AIcons.clear), + ), + ), + ], + ) + : title, + ); + }, + ).toList(); + } + + List<Widget> _buildColorOptions() { + final l10n = context.l10n; + return [false, true].map( + (isCustom) { + final title = Text( + isCustom ? l10n.setCoverDialogCustom : l10n.setCoverDialogAuto, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ); + return RadioListTile<bool>( + value: isCustom, + title: isCustom + ? Row( + children: [ + title, + const Spacer(), + if (_customColor != null) + GestureDetector( + onTap: _pickColor, + child: ColorIndicator( + value: _customColor, + ), + ), + ], + ) + : title, + ); + }, + ).toList(); + } + + Future<void> _pickEntry() async { + final entry = await Navigator.maybeOf(context)?.push<AvesEntry>( + MaterialPageRoute( + settings: const RouteSettings(name: ItemPickPage.routeName), + builder: (context) => ItemPickPage( + collection: CollectionLens( + source: context.read<CollectionSource>(), + filters: {filter}, + ), + canRemoveFilters: false, + ), + fullscreenDialog: true, + ), + ); + if (entry != null) { + _customEntry = entry; + _isCustomEntry = true; + setState(() {}); + } + } + + Future<void> _pickPackage() async { + final package = await Navigator.maybeOf(context)?.push<String>( + MaterialPageRoute( + settings: const RouteSettings(name: AppPickPage.routeName), + builder: (context) => AppPickPage( + initialValue: _customPackage, + ), + fullscreenDialog: true, + ), + ); + if (package != null) { + _customPackage = package; + _isCustomPackage = true; + setState(() {}); + } + } + + Future<void> _pickColor() async { + final color = await showDialog<Color>( + context: context, + builder: (context) => ColorPickerDialog( + // avoid a pure material color as the default, so that + // picker controls are not on edge and palette panel is more stable + initialValue: _customColor ?? const Color(0xff3f51b5), + ), + routeSettings: const RouteSettings(name: ColorPickerDialog.routeName), + ); + if (color != null) { + _customColor = color; + _isCustomColor = true; + setState(() {}); + } + } + + // tabs + + Tab _buildTab( + BuildContext context, + Key key, + IconData icon, + String text, { + Color? color, + }) { + // cannot use `IconTheme` over `TabBar` to change size, + // because `TabBar` does so internally + final textScaler = MediaQuery.textScalerOf(context); + final iconSize = textScaler.scale(IconTheme.of(context).size!); + return Tab( + key: key, + height: tabBarHeight(context), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + icon, + size: iconSize, + color: color, + ), + const SizedBox(height: 4), + Text( + text, + style: TextStyle(color: color), + softWrap: false, + overflow: TextOverflow.fade, + ), + ], + ), + ); + } + + // based on `ListTile` height computation (one line, no subtitle, not dense) + double singleOptionTileHeight(BuildContext context) => 56.0 + Theme.of(context).visualDensity.baseSizeAdjustment.dy; + + double tabBodyMaxWidth(BuildContext context) { + final l10n = context.l10n; + final _optionLines = { + l10n.setCoverDialogLatest, + l10n.setCoverDialogAuto, + l10n.setCoverDialogCustom, + }.fold('', (previousValue, element) => '$previousValue\n$element'); + + final paragraph = RenderParagraph( + TextSpan(text: _optionLines, style: Theme.of(context).textTheme.titleMedium!), + textDirection: TextDirection.ltr, + textScaler: MediaQuery.textScalerOf(context), + )..layout(const BoxConstraints(), parentUsesSize: true); + final textWidth = paragraph.getMaxIntrinsicWidth(double.infinity); + paragraph.dispose(); + + // from `RadioListTile` layout + const contentPadding = 32; + const leadingWidth = kMinInteractiveDimension + 8; + return contentPadding + leadingWidth + textWidth + itemPickerExtent; + } + + double tabBodyMaxHeight(BuildContext context) => 2 * singleOptionTileHeight(context); +} diff --git a/lib/widgets/dialogs/filter_editors/create_dynamic_album_dialog.dart b/lib/widgets/dialogs/filter_editors/create_dynamic_album_dialog.dart new file mode 100644 index 0000000..3b53da0 --- /dev/null +++ b/lib/widgets/dialogs/filter_editors/create_dynamic_album_dialog.dart @@ -0,0 +1,93 @@ +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/material.dart'; + +class CreateDynamicAlbumDialog extends StatefulWidget { + static const routeName = '/dialog/create_dynamic_album'; + + const CreateDynamicAlbumDialog({super.key}); + + @override + State<CreateDynamicAlbumDialog> createState() => _CreateDynamicAlbumDialogState(); +} + +class _CreateDynamicAlbumDialogState extends State<CreateDynamicAlbumDialog> { + final TextEditingController _nameController = TextEditingController(); + final ValueNotifier<bool> _existsNotifier = ValueNotifier(false); + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + + @override + void initState() { + super.initState(); + _validate(); + } + + @override + void dispose() { + _nameController.dispose(); + _existsNotifier.dispose(); + _isValidNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + + return AvesDialog( + title: l10n.newDynamicAlbumDialogTitle, + content: ValueListenableBuilder<bool>( + valueListenable: _existsNotifier, + builder: (context, exists, child) { + return TextField( + controller: _nameController, + decoration: InputDecoration( + labelText: l10n.newAlbumDialogNameLabel, + helperText: exists ? l10n.dynamicAlbumAlreadyExists : '', + ), + autofocus: true, + onChanged: (_) => _validate(), + onSubmitted: (_) => _submit(context), + ); + }, + ), + actions: [ + const CancelButton(), + ValueListenableBuilder<bool>( + valueListenable: _existsNotifier, + builder: (context, exists, child) { + return ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(exists ? l10n.showButtonLabel : l10n.createAlbumButtonLabel), + ); + }, + ); + }, + ), + ], + ); + } + + String? _formatAlbumName() { + final name = _nameController.text.trim(); + if (name.isEmpty) return null; + + return name; + } + + void _validate() { + final name = _formatAlbumName(); + _isValidNotifier.value = name != null; + _existsNotifier.value = dynamicAlbums.contains(name); + } + + void _submit(BuildContext context) { + if (_isValidNotifier.value) { + Navigator.maybeOf(context)?.pop(_formatAlbumName()); + } + } +} diff --git a/lib/widgets/dialogs/filter_editors/create_group_dialog.dart b/lib/widgets/dialogs/filter_editors/create_group_dialog.dart new file mode 100644 index 0000000..055c5fb --- /dev/null +++ b/lib/widgets/dialogs/filter_editors/create_group_dialog.dart @@ -0,0 +1,99 @@ +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/material.dart'; + +class CreateGroupDialog extends StatefulWidget { + static const routeName = '/dialog/create_group'; + + final FilterGrouping grouping; + final Uri? parentGroupUri; + + const CreateGroupDialog({ + super.key, + required this.grouping, + required this.parentGroupUri, + }); + + @override + State<CreateGroupDialog> createState() => _CreateGroupDialogState(); +} + +class _CreateGroupDialogState extends State<CreateGroupDialog> { + final TextEditingController _nameController = TextEditingController(); + final ValueNotifier<bool> _existsNotifier = ValueNotifier(false); + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + + FilterGrouping get grouping => widget.grouping; + + Uri? get parentGroupUri => widget.parentGroupUri; + + @override + void initState() { + super.initState(); + _validate(); + } + + @override + void dispose() { + _nameController.dispose(); + _existsNotifier.dispose(); + _isValidNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + + return AvesDialog( + title: l10n.newGroupDialogTitle, + content: ValueListenableBuilder<bool>( + valueListenable: _existsNotifier, + builder: (context, exists, child) { + return TextField( + controller: _nameController, + decoration: InputDecoration( + labelText: l10n.newGroupDialogNameLabel, + helperText: exists ? l10n.groupAlreadyExists : '', + ), + autofocus: true, + onChanged: (_) => _validate(), + onSubmitted: (_) => _submit(context), + ); + }, + ), + actions: [ + const CancelButton(), + ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(l10n.createButtonLabel), + ); + }, + ), + ], + ); + } + + Uri? _getNewGroupUri() { + final name = _nameController.text.trim(); + if (name.isEmpty) return null; + return grouping.buildGroupUri(parentGroupUri, name); + } + + void _validate() { + final newGroupUri = _getNewGroupUri(); + final exists = grouping.exists(newGroupUri); + _isValidNotifier.value = newGroupUri != null && !exists; + _existsNotifier.value = exists; + } + + void _submit(BuildContext context) { + if (_isValidNotifier.value) { + Navigator.maybeOf(context)?.pop(_getNewGroupUri()); + } + } +} diff --git a/lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart b/lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart new file mode 100644 index 0000000..a3bf046 --- /dev/null +++ b/lib/widgets/dialogs/filter_editors/create_stored_album_dialog.dart @@ -0,0 +1,231 @@ +import 'dart:io'; + +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class CreateStoredAlbumDialog extends StatefulWidget { + static const routeName = '/dialog/create_stored_album'; + + /// ✅ NEW: prefill nome cartella (es. basename dell’album remoto) + final String? initialName; + + /// ✅ NEW: pre-selezione volume (opzionale, non indispensabile) + final StorageVolume? initialVolume; + + const CreateStoredAlbumDialog({ + super.key, + this.initialName, + this.initialVolume, + }); + + @override + State<CreateStoredAlbumDialog> createState() => _CreateStoredAlbumDialogState(); +} + +class _CreateStoredAlbumDialogState extends State<CreateStoredAlbumDialog> { + final ScrollController _scrollController = ScrollController(); + final TextEditingController _nameController = TextEditingController(); + final FocusNode _nameFieldFocusNode = FocusNode(); + final ValueNotifier<bool> _directoryExistsNotifier = ValueNotifier(false); + final ValueNotifier<bool> _albumExistsNotifier = ValueNotifier(false); + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + late Set<StorageVolume> _allVolumes; + late StorageVolume? _primaryVolume, _selectedVolume; + + @override + void initState() { + super.initState(); + _allVolumes = androidFileUtils.storageVolumes; + _primaryVolume = _allVolumes.firstWhereOrNull((volume) => volume.isPrimary) ?? _allVolumes.firstOrNull; + + // ✅ pre-seleziona volume se passato, altrimenti primario + _selectedVolume = widget.initialVolume ?? _primaryVolume; + + // ✅ prefill nome se passato + final initName = widget.initialName?.trim(); + if (initName != null && initName.isNotEmpty) { + _nameController.text = initName; + // valida appena la UI è pronta + WidgetsBinding.instance.addPostFrameCallback((_) => _validate()); + } + + _nameFieldFocusNode.addListener(_onFocus); + } + + @override + void dispose() { + _scrollController.dispose(); + _nameController.dispose(); + _nameFieldFocusNode.removeListener(_onFocus); + _nameFieldFocusNode.dispose(); + _directoryExistsNotifier.dispose(); + _isValidNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + const contentHorizontalPadding = EdgeInsets.symmetric(horizontal: AvesDialog.defaultHorizontalContentPadding); + + final volumeTiles = <Widget>[]; + if (_allVolumes.length > 1) { + final byPrimary = groupBy<StorageVolume, bool>(_allVolumes, (volume) => volume.isPrimary); + int compare(StorageVolume a, StorageVolume b) => compareAsciiUpperCaseNatural(a.path, b.path); + final primaryVolumes = (byPrimary[true] ?? [])..sort(compare); + final otherVolumes = (byPrimary[false] ?? [])..sort(compare); + volumeTiles.addAll([ + Padding( + padding: contentHorizontalPadding + const EdgeInsets.only(top: 20), + child: Text(l10n.newAlbumDialogStorageLabel), + ), + ...primaryVolumes.map((volume) => _buildVolumeTile(context, volume)), + ...otherVolumes.map((volume) => _buildVolumeTile(context, volume)), + const SizedBox(height: 8), + ]); + } + + return AvesDialog( + title: l10n.newAlbumDialogTitle, + scrollController: _scrollController, + scrollableContent: [ + RadioGroup( + groupValue: _selectedVolume, + onChanged: (volume) { + _selectedVolume = volume!; + _validate(); + setState(() {}); + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: volumeTiles, + ), + ), + Padding( + padding: contentHorizontalPadding + const EdgeInsets.only(bottom: 8), + child: AnimatedBuilder( + animation: Listenable.merge([_albumExistsNotifier, _directoryExistsNotifier]), + builder: (context, child) { + var helperText = ''; + if (_albumExistsNotifier.value) { + helperText = l10n.newAlbumDialogAlbumAlreadyExistsHelper; + } else if (_directoryExistsNotifier.value) { + helperText = l10n.newAlbumDialogNameLabelAlreadyExistsHelper; + } + return TextField( + controller: _nameController, + focusNode: _nameFieldFocusNode, + decoration: InputDecoration( + labelText: l10n.newAlbumDialogNameLabel, + helperText: helperText, + ), + autofocus: _allVolumes.length == 1 && (widget.initialName == null || widget.initialName!.isEmpty), + onChanged: (_) => _validate(), + onSubmitted: (_) => _submit(context), + ); + }, + ), + ), + ], + actions: [ + const CancelButton(), + ValueListenableBuilder<bool>( + valueListenable: _albumExistsNotifier, + builder: (context, albumExists, child) { + return ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(albumExists ? l10n.showButtonLabel : l10n.createAlbumButtonLabel), + ); + }, + ); + }, + ), + ], + ); + } + + Widget _buildVolumeTile(BuildContext context, StorageVolume volume) => RadioListTile<StorageVolume>( + value: volume, + title: Text( + volume.getDescription(context), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + subtitle: Text( + volume.path, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ); + + void _onFocus() async { + // when the field gets focus, we wait for the soft keyboard to appear + // then scroll to the bottom to make sure the field is in view + if (_nameFieldFocusNode.hasFocus) { + await Future.delayed(ADurations.softKeyboardDisplayDelay + const Duration(milliseconds: 500)); + _scrollToBottom(); + } + } + + void _scrollToBottom() { + _scrollController.animateTo( + _scrollController.position.maxScrollExtent, + duration: ADurations.dialogFieldReachAnimation, + curve: Curves.easeInOut, + ); + } + + Future<String?> _buildAlbumPath() async { + final name = _nameController.text.trim(); + if (name.isEmpty) return null; + + final volumePath = _selectedVolume?.path; + if (volumePath == null) return null; + + final candidatePath = pContext.join(volumePath, AndroidFileUtils.standardDirPictures, name); + + // uses resolved directory name case if it exists + var resolvedPath = volumePath; + final relativePathSegments = pContext.split(pContext.relative(candidatePath, from: volumePath)); + for (final targetSegment in relativePathSegments) { + String? resolvedSegment; + final directory = Directory(resolvedPath); + if (await directory.exists()) { + final lowerTargetSegment = targetSegment.toLowerCase(); + resolvedSegment = directory.listSync().map((v) => pContext.basename(v.path)).firstWhereOrNull((v) => v.toLowerCase() == lowerTargetSegment); + } + resolvedPath = pContext.join(resolvedPath, resolvedSegment ?? targetSegment); + } + + return resolvedPath; + } + + Future<void> _validate() async { + final path = await _buildAlbumPath(); + final isValid = path != null; + _isValidNotifier.value = isValid; + _directoryExistsNotifier.value = isValid && await Directory(path!).exists(); + _albumExistsNotifier.value = isValid && context.read<CollectionSource>().rawAlbums.contains(path); + } + + Future<void> _submit(BuildContext context) async { + final path = await _buildAlbumPath(); + if (path == null) return; + + Navigator.maybeOf(context)?.pop(path); + } +} diff --git a/lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart b/lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart new file mode 100644 index 0000000..99c9c06 --- /dev/null +++ b/lib/widgets/dialogs/filter_editors/edit_vault_dialog.dart @@ -0,0 +1,191 @@ +import 'package:aves/model/device.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/vaults/details.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/vault_aware.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_caption.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/selection_dialogs/common.dart'; +import 'package:aves/widgets/dialogs/selection_dialogs/single_selection.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class EditVaultDialog extends StatefulWidget { + static const routeName = '/dialog/edit_vault'; + + final VaultDetails? initialDetails; + + const EditVaultDialog({ + super.key, + this.initialDetails, + }); + + @override + State<EditVaultDialog> createState() => _EditVaultDialogState(); +} + +class _EditVaultDialogState extends State<EditVaultDialog> with FeedbackMixin, VaultAwareMixin { + final TextEditingController _nameController = TextEditingController(); + late bool _useBin; + late bool _autoLockScreenOff; + late VaultLockType _lockType; + + final ValueNotifier<bool> _existsNotifier = ValueNotifier(false); + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + + final List<VaultLockType> _lockTypeOptions = [ + if (device.canAuthenticateUser) VaultLockType.system, + VaultLockType.pattern, + VaultLockType.pin, + VaultLockType.password, + ]; + + VaultDetails? get initialDetails => widget.initialDetails; + + String get newName => _nameController.text; + + @override + void initState() { + super.initState(); + final details = + initialDetails ?? + VaultDetails( + name: '', + autoLockScreenOff: true, + useBin: settings.enableBin, + lockType: _lockTypeOptions.first, + ); + _nameController.text = details.name; + _useBin = details.useBin; + _autoLockScreenOff = details.autoLockScreenOff; + _lockType = details.lockType; + _validate(); + } + + @override + void dispose() { + _nameController.dispose(); + _existsNotifier.dispose(); + _isValidNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final isNew = initialDetails == null; + return AvesDialog( + title: isNew ? l10n.newVaultDialogTitle : l10n.configureVaultDialogTitle, + scrollableContent: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: ValueListenableBuilder<bool>( + valueListenable: _existsNotifier, + builder: (context, exists, child) { + return TextField( + controller: _nameController, + decoration: InputDecoration( + labelText: l10n.newAlbumDialogNameLabel, + helperText: exists ? l10n.newAlbumDialogNameLabelAlreadyExistsHelper : '', + ), + onChanged: (_) => _validate(), + onSubmitted: (_) => _submit(context), + ); + }, + ), + ), + if (_lockTypeOptions.length > 1) + ListTile( + title: Text(l10n.vaultDialogLockTypeLabel), + subtitle: AvesCaption(_lockType.getText(context)), + onTap: () { + _unfocus(); + showSelectionDialog<VaultLockType>( + context: context, + builder: (context) => AvesSingleSelectionDialog<VaultLockType>( + initialValue: _lockType, + options: Map.fromEntries(_lockTypeOptions.map((v) => MapEntry(v, v.getText(context)))), + ), + onSelection: (v) => setState(() => _lockType = v), + ); + }, + ), + SwitchListTile( + value: _autoLockScreenOff, + onChanged: (v) => setState(() => _autoLockScreenOff = v), + title: Text(l10n.vaultDialogLockModeWhenScreenOff), + ), + if (settings.enableBin) + SwitchListTile( + value: _useBin, + onChanged: (v) async { + if (!v) { + final album = initialDetails?.path; + if (album != null) { + final filter = StoredAlbumFilter(album, null); + final source = context.read<CollectionSource>(); + if (source.trashedEntries.any(filter.test)) { + if (!await showConfirmationDialog( + context: context, + message: l10n.settingsDisablingBinWarningDialogMessage, + ok: l10n.applyButtonLabel, + )) { + return; + } + } + } + } + setState(() => _useBin = v); + }, + title: Text(l10n.settingsEnableBin), + ), + ], + actions: [ + const CancelButton(), + ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(isNew ? l10n.createAlbumButtonLabel : l10n.applyButtonLabel), + ); + }, + ), + ], + ); + } + + // remove focus, if any, to prevent the keyboard from showing up + // after the user is done with the dialog + void _unfocus() => FocusManager.instance.primaryFocus?.unfocus(); + + Future<void> _validate() async { + final notEmpty = newName.isNotEmpty; + final exists = notEmpty && vaults.all.map((v) => v.name).contains(newName) && newName != initialDetails?.name; + _existsNotifier.value = exists; + _isValidNotifier.value = notEmpty && !exists; + } + + Future<void> _submit(BuildContext context) async { + if (!_isValidNotifier.value) return; + + _unfocus(); + + final details = VaultDetails( + name: newName, + autoLockScreenOff: _autoLockScreenOff, + useBin: _useBin, + lockType: _lockType, + ); + if (!await setVaultPass(context, details)) return; + + Navigator.maybeOf(context)?.pop(details); + } +} diff --git a/lib/widgets/dialogs/filter_editors/password_dialog.dart b/lib/widgets/dialogs/filter_editors/password_dialog.dart new file mode 100644 index 0000000..194b600 --- /dev/null +++ b/lib/widgets/dialogs/filter_editors/password_dialog.dart @@ -0,0 +1,81 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/material.dart'; + +class PasswordDialog extends StatefulWidget { + static const routeName = '/dialog/password'; + + final bool needConfirmation; + + const PasswordDialog({ + super.key, + required this.needConfirmation, + }); + + @override + State<PasswordDialog> createState() => _PasswordDialogState(); +} + +class _PasswordDialogState extends State<PasswordDialog> { + final _controller = TextEditingController(); + final _focusNode = FocusNode(); + bool _confirming = false; + String? _firstPassword; + + @override + void initState() { + super.initState(); + _focusNode.requestFocus(); + } + + @override + void dispose() { + _controller.dispose(); + _focusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AvesDialog( + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text(_confirming ? context.l10n.passwordDialogConfirm : context.l10n.passwordDialogEnter), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: TextField( + controller: _controller, + focusNode: _focusNode, + obscureText: true, + onSubmitted: _submit, + autofillHints: const [AutofillHints.password], + ), + ), + ], + ), + ); + } + + void _submit(String password) { + if (widget.needConfirmation) { + if (_confirming) { + final match = _firstPassword == password; + Navigator.maybeOf(context)?.pop<String>(match ? password : null); + if (!match) { + showWarningDialog( + context: context, + message: context.l10n.genericFailureFeedback, + ); + } + } else { + _firstPassword = password; + _controller.clear(); + setState(() => _confirming = true); + WidgetsBinding.instance.addPostFrameCallback((_) => _focusNode.requestFocus()); + } + } else { + Navigator.maybeOf(context)?.pop<String>(password); + } + } +} diff --git a/lib/widgets/dialogs/filter_editors/pattern_dialog.dart b/lib/widgets/dialogs/filter_editors/pattern_dialog.dart new file mode 100644 index 0000000..1d00af6 --- /dev/null +++ b/lib/widgets/dialogs/filter_editors/pattern_dialog.dart @@ -0,0 +1,70 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:pattern_lock/pattern_lock.dart'; + +class PatternDialog extends StatefulWidget { + static const routeName = '/dialog/pattern'; + + final bool needConfirmation; + + const PatternDialog({ + super.key, + required this.needConfirmation, + }); + + @override + State<PatternDialog> createState() => _PatternDialogState(); +} + +class _PatternDialogState extends State<PatternDialog> { + bool _confirming = false; + String? _firstPattern; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + return AvesDialog( + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text(_confirming ? context.l10n.patternDialogConfirm : context.l10n.patternDialogEnter), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: SizedBox.square( + dimension: MediaQuery.sizeOf(context).shortestSide / 2, + child: PatternLock( + relativePadding: .4, + selectedColor: colorScheme.primary, + notSelectedColor: colorScheme.onSurface, + pointRadius: 8, + fillPoints: true, + onInputComplete: (input) => _submit(input.join()), + ), + ), + ), + ], + ), + ); + } + + void _submit(String pattern) { + if (widget.needConfirmation) { + if (_confirming) { + final match = _firstPattern == pattern; + Navigator.maybeOf(context)?.pop<String>(match ? pattern : null); + if (!match) { + showWarningDialog( + context: context, + message: context.l10n.genericFailureFeedback, + ); + } + } else { + _firstPattern = pattern; + setState(() => _confirming = true); + } + } else { + Navigator.maybeOf(context)?.pop<String>(pattern); + } + } +} diff --git a/lib/widgets/dialogs/filter_editors/pin_dialog.dart b/lib/widgets/dialogs/filter_editors/pin_dialog.dart new file mode 100644 index 0000000..fdb47df --- /dev/null +++ b/lib/widgets/dialogs/filter_editors/pin_dialog.dart @@ -0,0 +1,87 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:pin_code_fields/pin_code_fields.dart'; + +class PinDialog extends StatefulWidget { + static const routeName = '/dialog/pin'; + + final bool needConfirmation; + + const PinDialog({ + super.key, + required this.needConfirmation, + }); + + @override + State<PinDialog> createState() => _PinDialogState(); +} + +class _PinDialogState extends State<PinDialog> { + final _controller = TextEditingController(); + bool _confirming = false; + String? _firstPin; + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + return AvesDialog( + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text(_confirming ? context.l10n.pinDialogConfirm : context.l10n.pinDialogEnter), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: PinCodeTextField( + appContext: context, + length: 4, + controller: _controller, + obscureText: true, + onChanged: (v) {}, + onCompleted: _submit, + animationType: AnimationType.scale, + keyboardType: TextInputType.number, + autoFocus: true, + autoDismissKeyboard: !widget.needConfirmation || _confirming, + pinTheme: PinTheme( + activeColor: colorScheme.onSurface, + inactiveColor: colorScheme.onSurface, + selectedColor: colorScheme.primary, + selectedFillColor: colorScheme.primary, + borderRadius: BorderRadius.circular(8), + shape: PinCodeFieldShape.box, + ), + ), + ), + ], + ), + ); + } + + void _submit(String pin) { + if (widget.needConfirmation) { + if (_confirming) { + final match = _firstPin == pin; + Navigator.maybeOf(context)?.pop<String>(match ? pin : null); + if (!match) { + showWarningDialog( + context: context, + message: context.l10n.genericFailureFeedback, + ); + } + } else { + _firstPin = pin; + _controller.clear(); + setState(() => _confirming = true); + } + } else { + Navigator.maybeOf(context)?.pop<String>(pin); + } + } +} diff --git a/lib/widgets/dialogs/filter_editors/rename_dynamic_album_dialog.dart b/lib/widgets/dialogs/filter_editors/rename_dynamic_album_dialog.dart new file mode 100644 index 0000000..a61c162 --- /dev/null +++ b/lib/widgets/dialogs/filter_editors/rename_dynamic_album_dialog.dart @@ -0,0 +1,94 @@ +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/material.dart'; + +class RenameDynamicAlbumDialog extends StatefulWidget { + static const routeName = '/dialog/rename_dynamic_album'; + + final String name; + + const RenameDynamicAlbumDialog({ + super.key, + required this.name, + }); + + @override + State<RenameDynamicAlbumDialog> createState() => _RenameDynamicAlbumDialogState(); +} + +class _RenameDynamicAlbumDialogState extends State<RenameDynamicAlbumDialog> { + final TextEditingController _nameController = TextEditingController(); + final ValueNotifier<bool> _existsNotifier = ValueNotifier(false); + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + + String get initialValue => widget.name; + + @override + void initState() { + super.initState(); + _nameController.text = initialValue; + _validate(); + } + + @override + void dispose() { + _nameController.dispose(); + _existsNotifier.dispose(); + _isValidNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AvesDialog( + content: ValueListenableBuilder<bool>( + valueListenable: _existsNotifier, + builder: (context, exists, child) { + return TextField( + controller: _nameController, + decoration: InputDecoration( + labelText: context.l10n.renameAlbumDialogLabel, + helperText: exists ? context.l10n.dynamicAlbumAlreadyExists : '', + ), + autofocus: true, + onChanged: (_) => _validate(), + onSubmitted: (_) => _submit(context), + ); + }, + ), + actions: [ + const CancelButton(), + ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(context.l10n.applyButtonLabel), + ); + }, + ), + ], + ); + } + + String? _formatAlbumName() { + final name = _nameController.text.trim(); + if (name.isEmpty) return null; + + return name; + } + + Future<void> _validate() async { + final newName = _formatAlbumName(); + final exists = dynamicAlbums.contains(newName); + _isValidNotifier.value = newName != null && !exists; + _existsNotifier.value = exists && newName != initialValue; + } + + void _submit(BuildContext context) { + if (_isValidNotifier.value) { + Navigator.maybeOf(context)?.pop(_formatAlbumName()); + } + } +} diff --git a/lib/widgets/dialogs/filter_editors/rename_group_dialog.dart b/lib/widgets/dialogs/filter_editors/rename_group_dialog.dart new file mode 100644 index 0000000..7cf9d4c --- /dev/null +++ b/lib/widgets/dialogs/filter_editors/rename_group_dialog.dart @@ -0,0 +1,101 @@ +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/material.dart'; + +class RenameGroupDialog extends StatefulWidget { + static const routeName = '/dialog/rename_group'; + + final FilterGrouping grouping; + final Uri groupUri; + + const RenameGroupDialog({ + super.key, + required this.grouping, + required this.groupUri, + }); + + @override + State<RenameGroupDialog> createState() => _RenameGroupDialogState(); +} + +class _RenameGroupDialogState extends State<RenameGroupDialog> { + final TextEditingController _nameController = TextEditingController(); + final ValueNotifier<bool> _existsNotifier = ValueNotifier(false); + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + + FilterGrouping get grouping => widget.grouping; + + Uri get initialGroupUri => widget.groupUri; + + Uri? get parentGroupUri => FilterGrouping.getParentGroup(initialGroupUri); + + @override + void initState() { + super.initState(); + _nameController.text = FilterGrouping.getGroupName(initialGroupUri) ?? ''; + _validate(); + } + + @override + void dispose() { + _nameController.dispose(); + _existsNotifier.dispose(); + _isValidNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + + return AvesDialog( + content: ValueListenableBuilder<bool>( + valueListenable: _existsNotifier, + builder: (context, exists, child) { + return TextField( + controller: _nameController, + decoration: InputDecoration( + labelText: l10n.renameAlbumDialogLabel, + helperText: exists ? l10n.groupAlreadyExists : '', + ), + autofocus: true, + onChanged: (_) => _validate(), + onSubmitted: (_) => _submit(context), + ); + }, + ), + actions: [ + const CancelButton(), + ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(l10n.applyButtonLabel), + ); + }, + ), + ], + ); + } + + Uri? _getNewGroupUri() { + final name = _nameController.text.trim(); + if (name.isEmpty) return null; + return grouping.buildGroupUri(parentGroupUri, name); + } + + void _validate() { + final newGroupUri = _getNewGroupUri(); + final exists = grouping.exists(newGroupUri); + _isValidNotifier.value = newGroupUri != null && !exists; + _existsNotifier.value = exists && newGroupUri != initialGroupUri; + } + + void _submit(BuildContext context) { + if (_isValidNotifier.value) { + Navigator.maybeOf(context)?.pop(_getNewGroupUri()); + } + } +} diff --git a/lib/widgets/dialogs/filter_editors/rename_stored_album_dialog.dart b/lib/widgets/dialogs/filter_editors/rename_stored_album_dialog.dart new file mode 100644 index 0000000..51cc9ce --- /dev/null +++ b/lib/widgets/dialogs/filter_editors/rename_stored_album_dialog.dart @@ -0,0 +1,97 @@ +import 'dart:io'; + +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/material.dart'; + +class RenameStoredAlbumDialog extends StatefulWidget { + static const routeName = '/dialog/rename_stored_album'; + + final String album; + + const RenameStoredAlbumDialog({ + super.key, + required this.album, + }); + + @override + State<RenameStoredAlbumDialog> createState() => _RenameStoredAlbumDialogState(); +} + +class _RenameStoredAlbumDialogState extends State<RenameStoredAlbumDialog> { + final TextEditingController _nameController = TextEditingController(); + final ValueNotifier<bool> _existsNotifier = ValueNotifier(false); + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + + String get album => widget.album; + + String get initialValue => pContext.basename(album); + + @override + void initState() { + super.initState(); + _nameController.text = initialValue; + _validate(); + } + + @override + void dispose() { + _nameController.dispose(); + _existsNotifier.dispose(); + _isValidNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AvesDialog( + content: ValueListenableBuilder<bool>( + valueListenable: _existsNotifier, + builder: (context, exists, child) { + return TextField( + controller: _nameController, + decoration: InputDecoration( + labelText: context.l10n.renameAlbumDialogLabel, + helperText: exists ? context.l10n.renameAlbumDialogLabelAlreadyExistsHelper : '', + ), + autofocus: true, + onChanged: (_) => _validate(), + onSubmitted: (_) => _submit(context), + ); + }, + ), + actions: [ + const CancelButton(), + ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(context.l10n.applyButtonLabel), + ); + }, + ), + ], + ); + } + + String _buildAlbumPath(String name) { + if (name.isEmpty) return ''; + return pContext.join(pContext.dirname(album), name); + } + + Future<void> _validate() async { + final newName = _nameController.text; + final path = _buildAlbumPath(newName); + final exists = newName.isNotEmpty && await FileSystemEntity.type(path) != FileSystemEntityType.notFound; + _existsNotifier.value = exists && newName != initialValue; + _isValidNotifier.value = newName.isNotEmpty; + } + + void _submit(BuildContext context) { + if (_isValidNotifier.value) { + Navigator.maybeOf(context)?.pop(_nameController.text); + } + } +} diff --git a/lib/widgets/dialogs/folder_picker_page.dart b/lib/widgets/dialogs/folder_picker_page.dart new file mode 100644 index 0000000..4117fcf --- /dev/null +++ b/lib/widgets/dialogs/folder_picker_page.dart @@ -0,0 +1,180 @@ +import 'package:flutter/material.dart'; +//import 'package:aves/database/local_media_db.dart'; +import 'package:aves/model/entry/entry.dart'; +//import 'package:aves/utils/file_utils.dart'; +import 'package:aves/services/common/services.dart'; + +class FolderPickerPage extends StatefulWidget { + static const routeName = '/folder_picker'; + + const FolderPickerPage({super.key}); + + @override + State<FolderPickerPage> createState() => _FolderPickerPageState(); +} + +class _FolderPickerPageState extends State<FolderPickerPage> { + late Future<List<_FolderRow>> _future; + + @override + void initState() { + super.initState(); + _future = _loadFolders(); + } + + Future<List<_FolderRow>> _loadFolders() async { + final rows = await localMediaDb.loadAllFolders(); + final entries = await localMediaDb.loadEntriesMap(); + + final list = <_FolderRow>[]; + + for (final row in rows) { + final thumbEntry = row.thumbEntryId != null ? entries[row.thumbEntryId] : null; + + list.add( + _FolderRow( + path: row.path, + displayName: row.displayName, + albumType: row.albumType, + priority: row.priority, + totalSize: row.totalSize, + fileCount: row.fileCount, + isRemote: row.isRemote == 1, + hybridType: row.hybridType, + thumbEntry: thumbEntry, + ), + ); + } + + return _sortFolders(list); + } + + List<_FolderRow> _sortFolders(List<_FolderRow> folders) { + folders.sort((a, b) { + final p = b.priority.compareTo(a.priority); + if (p != 0) return p; + + if (a.albumType == 3 && b.albumType != 3) return -1; + if (b.albumType == 3 && a.albumType != 3) return 1; + + if (a.isRemote != b.isRemote) { + return a.isRemote ? 1 : -1; + } + + return a.displayName.toLowerCase().compareTo(b.displayName.toLowerCase()); + }); + + return folders; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Scegli cartella')), + body: FutureBuilder<List<_FolderRow>>( + future: _future, + builder: (context, snapshot) { + if (!snapshot.hasData) { + return const Center(child: CircularProgressIndicator()); + } + + final folders = snapshot.data!; + if (folders.isEmpty) { + return const Center(child: Text('Nessuna cartella')); + } + + return ListView.builder( + itemCount: folders.length, + itemBuilder: (context, index) { + return _FolderTile( + folder: folders[index], + onTap: () => Navigator.pop(context, folders[index].path), + ); + }, + ); + }, + ), + ); + } +} + +class _FolderRow { + final String path; + final String displayName; + final int albumType; + final int priority; + final int totalSize; + final int fileCount; + final bool isRemote; + final int hybridType; + final AvesEntry? thumbEntry; + + _FolderRow({ + required this.path, + required this.displayName, + required this.albumType, + required this.priority, + required this.totalSize, + required this.fileCount, + required this.isRemote, + required this.hybridType, + required this.thumbEntry, + }); +} + +class _FolderTile extends StatelessWidget { + final _FolderRow folder; + final VoidCallback onTap; + + const _FolderTile({ + required this.folder, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + final thumb = folder.thumbEntry; + + return ListTile( + leading: ClipRRect( + borderRadius: BorderRadius.circular(6), + child: SizedBox( + width: 56, + height: 56, + child: thumb != null + ? Image( + image: thumb.thumbnailProvider(), + fit: BoxFit.cover, + ) + : Container( + color: Colors.grey.shade300, + child: const Icon(Icons.folder, size: 32, color: Colors.black54), + ), + ), + ), + title: Text(folder.displayName), + subtitle: Text( + '${folder.fileCount} elementi • ${_formatSize(folder.totalSize)}', + ), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (folder.isRemote) + const Icon(Icons.cloud, size: 18), + if (folder.albumType == 3) + const Icon(Icons.lock, size: 18), + if (folder.hybridType != 0) + const Icon(Icons.link, size: 18), + ], + ), + onTap: onTap, + ); + } + + String _formatSize(int bytes) { + if (bytes < 1024) return '$bytes B'; + if (bytes < 1024 * 1024) return '${(bytes / 1024).toStringAsFixed(1)} KB'; + if (bytes < 1024 * 1024 * 1024) return '${(bytes / 1024 / 1024).toStringAsFixed(1)} MB'; + return '${(bytes / 1024 / 1024 / 1024).toStringAsFixed(1)} GB'; + } +} diff --git a/lib/widgets/dialogs/item_picker.dart b/lib/widgets/dialogs/item_picker.dart new file mode 100644 index 0000000..91fff90 --- /dev/null +++ b/lib/widgets/dialogs/item_picker.dart @@ -0,0 +1,74 @@ +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:aves/widgets/common/thumbnail/image.dart'; +import 'package:flutter/material.dart'; + +class ItemPicker extends StatelessWidget { + final double extent; + final AvesEntry entry; + final GestureTapCallback? onTap; + + const ItemPicker({ + super.key, + required this.extent, + required this.entry, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + final imageBorderRadius = BorderRadius.all(Radius.circular(extent * .25)); + final actionBoxDimension = min(40.0, extent * .4); + final actionBoxBorderRadius = BorderRadiusDirectional.only(topStart: Radius.circular(actionBoxDimension * .6)); + return Tooltip( + message: context.l10n.changeTooltip, + child: GestureDetector( + onTap: onTap, + child: Container( + decoration: BoxDecoration( + border: AvesBorder.border(context), + borderRadius: imageBorderRadius, + ), + child: ClipRRect( + borderRadius: imageBorderRadius, + child: SizedBox( + width: extent, + height: extent, + child: Stack( + children: [ + ThumbnailImage( + entry: entry, + extent: extent, + devicePixelRatio: MediaQuery.devicePixelRatioOf(context), + ), + PositionedDirectional( + end: -1, + bottom: -1, + child: Container( + decoration: BoxDecoration( + color: Theme.of(context).isDark ? const Color(0xAA000000) : const Color(0xCCFFFFFF), + border: AvesBorder.border(context), + borderRadius: actionBoxBorderRadius, + ), + width: actionBoxDimension, + height: actionBoxDimension, + child: Icon( + AIcons.edit, + size: actionBoxDimension * .6, + ), + ), + ), + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/dialogs/map/style_editor_dialog.dart b/lib/widgets/dialogs/map/style_editor_dialog.dart new file mode 100644 index 0000000..265bb8e --- /dev/null +++ b/lib/widgets/dialogs/map/style_editor_dialog.dart @@ -0,0 +1,146 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:flutter/material.dart'; + +class MapStyleEditorDialog extends StatefulWidget { + static const routeName = '/dialog/map_style_editor'; + + final EntryMapStyle? initialValue; + + const MapStyleEditorDialog({ + super.key, + this.initialValue, + }); + + @override + State<MapStyleEditorDialog> createState() => _MapStyleEditorDialogState(); +} + +class _MapStyleEditorDialogState extends State<MapStyleEditorDialog> { + late final Set<EntryMapStyle> _otherCustomStyles; + final TextEditingController _nameController = TextEditingController(); + final TextEditingController _urlController = TextEditingController(); + final TextEditingController _subdomainsController = TextEditingController(); + final TextEditingController _userAgentController = TextEditingController(); + final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); + + @override + void initState() { + super.initState(); + final initialValue = widget.initialValue; + _otherCustomStyles = settings.customMapStyles.where((v) => v != initialValue).toSet(); + _nameController.text = initialValue?.name ?? ''; + _urlController.text = initialValue?.url ?? ''; + _subdomainsController.text = initialValue?.subdomains.join(',') ?? ''; + _userAgentController.text = initialValue?.userAgent ?? ''; + _validate(); + } + + @override + void dispose() { + _nameController.dispose(); + _urlController.dispose(); + _subdomainsController.dispose(); + _userAgentController.dispose(); + _isValidNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return AvesDialog( + scrollableContent: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: TextField( + controller: _nameController, + decoration: InputDecoration( + labelText: l10n.mapStyleEditorDialogName, + ), + autofocus: true, + onChanged: (_) => _validate(), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: TextField( + controller: _urlController, + decoration: InputDecoration( + labelText: l10n.mapStyleEditorDialogUrl, + ), + keyboardType: TextInputType.url, + onChanged: (_) => _validate(), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: TextField( + controller: _subdomainsController, + decoration: InputDecoration( + labelText: l10n.mapStyleEditorDialogSubdomains, + ), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: TextField( + controller: _userAgentController, + decoration: InputDecoration( + labelText: l10n.mapStyleEditorDialogUserAgent, + ), + ), + ), + ], + actions: [ + const CancelButton(), + ValueListenableBuilder<bool>( + valueListenable: _isValidNotifier, + builder: (context, isValid, child) { + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: Text(widget.initialValue != null ? l10n.applyButtonLabel : l10n.createButtonLabel), + ); + }, + ), + ], + ); + } + + EntryMapStyle _buildStyle() { + final name = _nameController.text.trim(); + final url = _urlController.text.trim(); + final subdomains = _subdomainsController.text.split(',').map((v) => v.trim()).toList(); + final userAgent = _userAgentController.text.trim(); + return EntryMapStyle( + key: 'custom_$name', + name: name, + url: url, + subdomains: subdomains, + userAgent: userAgent.isNotEmpty ? userAgent : null, + ); + } + + Future<void> _validate() async { + final style = _buildStyle(); + + final name = style.name ?? ''; + final url = style.url ?? ''; + if (name.isEmpty || url.isEmpty) { + _isValidNotifier.value = false; + return; + } + + final key = style.key; + final duplicate = _otherCustomStyles.any((v) => v.key == key || v.url == url); + _isValidNotifier.value = !duplicate; + } + + void _submit(BuildContext context) { + if (_isValidNotifier.value) { + Navigator.maybeOf(context)?.pop<EntryMapStyle>(_buildStyle()); + } + } +} diff --git a/lib/widgets/dialogs/map/style_selection_dialog.dart b/lib/widgets/dialogs/map/style_selection_dialog.dart new file mode 100644 index 0000000..dc4a221 --- /dev/null +++ b/lib/widgets/dialogs/map/style_selection_dialog.dart @@ -0,0 +1,183 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/utils/collection_utils.dart'; +import 'package:aves/view/src/settings/enums.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/dialogs/map/style_editor_dialog.dart'; +import 'package:aves/widgets/dialogs/selection_dialogs/radio_list_tile.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class MapStyleSelectionDialog extends StatefulWidget { + static const routeName = '/dialog/map_style_selection'; + + const MapStyleSelectionDialog({super.key}); + + @override + State<MapStyleSelectionDialog> createState() => _MapStyleSelectionDialogState(); +} + +class _MapStyleSelectionDialogState extends State<MapStyleSelectionDialog> { + late EntryMapStyle? _selectedValue; + + @override + void initState() { + super.initState(); + _selectedValue = settings.mapStyle; + } + + @override + Widget build(BuildContext context) { + final useTvLayout = settings.useTvLayout; + final l10n = context.l10n; + final defaultStyles = availability.mapStyles; + final customStyles = context.select<Settings, Set<EntryMapStyle>>((v) => v.customMapStyles).sortedBy((v) => v.getName(context)); + + return PopScope( + onPopInvokedWithResult: (didPop, result) => settings.mapStyle = _selectedValue, + child: AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: !useTvLayout, + title: Text(context.l10n.mapStyleDialogTitle), + ), + body: SafeArea( + bottom: false, + child: RadioGroup<EntryMapStyle>( + groupValue: _selectedValue, + onChanged: (v) { + // always update the group value even when popping afterwards, + // so that the group value can be used in pop handlers + // as well as the regular return value from navigation + _setGroupValue(v); + // validate without confirmation + Navigator.maybeOf(context)?.pop(v); + }, + child: ListView( + children: [ + ...defaultStyles.map((v) { + return SelectionRadioListTile<EntryMapStyle>( + // key is expected by test driver + key: Key(v.key), + value: v, + title: v.getName(context), + secondary: _getDefaultStylePreview(v), + ); + }), + ...customStyles.map((v) { + return SelectionRadioListTile<EntryMapStyle>( + // key is expected by test driver + key: Key(v.key), + value: v, + title: v.getName(context), + secondary: _buildCustomStyleButtons(v), + ); + }), + if (!settings.useTvLayout) + Container( + alignment: Alignment.center, + padding: const EdgeInsets.only(top: 4, bottom: 8), + child: AvesOutlinedButton( + icon: const Icon(AIcons.add), + label: l10n.mapStyleDialogAddStyle, + onPressed: _add, + ), + ), + ], + ), + ), + ), + ), + ); + } + + void _setGroupValue(EntryMapStyle? style) => setState(() => _selectedValue = style); + + Widget? _getDefaultStylePreview(EntryMapStyle style) { + final assetName = _getImageAssetName(style); + if (assetName == null) return null; + + return ImageMarker( + count: null, + locale: null, + drawArrow: false, + buildThumbnailImage: (_) => Image.asset('assets/$assetName'), + ); + } + + String? _getImageAssetName(EntryMapStyle style) { + if (style == EntryMapStyles.googleNormal) return 'map_tile_128_google_normal.png'; + if (style == EntryMapStyles.googleHybrid) return 'map_tile_128_google_hybrid.png'; + if (style == EntryMapStyles.googleTerrain) return 'map_tile_128_google_terrain.png'; + if (style == EntryMapStyles.osmLiberty) return 'map_tile_128_osm_liberty.png'; + if (style == EntryMapStyles.openTopoMap) return 'map_tile_128_opentopomap.png'; + if (style == EntryMapStyles.osmHot) return 'map_tile_128_osm_hot.png'; + if (style == EntryMapStyles.stamenWatercolor) return 'map_tile_128_stamen_watercolor.png'; + return null; + } + + Widget _buildCustomStyleButtons(EntryMapStyle style) { + final l10n = context.l10n; + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + icon: const Icon(AIcons.edit), + onPressed: () => _edit(style), + tooltip: l10n.changeTooltip, + ), + IconButton( + icon: const Icon(AIcons.clear), + onPressed: () => _remove(style), + tooltip: l10n.actionRemove, + ), + ], + ); + } + + Future<void> _add() async { + final newStyle = await showDialog<EntryMapStyle>( + context: context, + builder: (context) => const MapStyleEditorDialog(), + routeSettings: const RouteSettings(name: MapStyleEditorDialog.routeName), + ); + if (newStyle == null) return; + + settings.customMapStyles = settings.customMapStyles..add(newStyle); + _setGroupValue(newStyle); + } + + Future<void> _edit(EntryMapStyle style) async { + final newStyle = await showDialog<EntryMapStyle>( + context: context, + builder: (context) => MapStyleEditorDialog(initialValue: style), + routeSettings: const RouteSettings(name: MapStyleEditorDialog.routeName), + ); + if (newStyle == null) return; + + settings.customMapStyles = settings.customMapStyles..replace(style, newStyle); + _setGroupValue(newStyle); + } + + Future<void> _remove(EntryMapStyle style) async { + final l10n = context.l10n; + + if (!await showConfirmationDialog( + context: context, + message: l10n.genericDangerWarningDialogMessage, + ok: l10n.applyButtonLabel, + )) { + return; + } + + settings.customMapStyles = settings.customMapStyles..remove(style); + if (_selectedValue == style) { + _setGroupValue(null); + } + } +} diff --git a/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart b/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart new file mode 100644 index 0000000..e3b78ef --- /dev/null +++ b/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'package:aves/widgets/collection/album_controller.dart'; +import 'package:aves/widgets/collection/album_sort.dart'; + +/// Pagina per selezionare un album (basata su AlbumRow) +class AlbumPickPage extends StatelessWidget { + const AlbumPickPage({super.key}); + + @override + Widget build(BuildContext context) { + final controller = context.watch<AlbumController>(); + + if (controller.loading) { + return const Scaffold( + body: Center(child: CircularProgressIndicator()), + ); + } + + final pinned = controller.pinnedAlbums; + final normal = controller.normalAlbums; + + return Scaffold( + appBar: AppBar( + title: const Text('Seleziona album'), + ), + body: ListView( + children: [ + if (pinned.isNotEmpty) + const _SectionHeader(title: 'Pinned'), + + ...pinned.map( + (album) => _AlbumPickTile( + album: album, + onTap: () => Navigator.pop(context, album), + ), + ), + + if (normal.isNotEmpty) + const _SectionHeader(title: 'Albums'), + + ...normal.map( + (album) => _AlbumPickTile( + album: album, + onTap: () => Navigator.pop(context, album), + ), + ), + ], + ), + ); + } +} + +class _AlbumPickTile extends StatelessWidget { + final AlbumRow album; + final VoidCallback onTap; + + const _AlbumPickTile({ + required this.album, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return ListTile( + leading: const Icon(Icons.folder, color: Colors.white70), + title: Text(album.displayName), + subtitle: Text('${album.fileCount} file'), + onTap: onTap, + ); + } +} + +class _SectionHeader extends StatelessWidget { + final String title; + + const _SectionHeader({required this.title}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.fromLTRB(16, 12, 16, 6), + child: Text( + title, + style: const TextStyle( + color: Colors.white70, + fontSize: 14, + fontWeight: FontWeight.w600, + ), + ), + ); + } +} diff --git a/lib/widgets/dialogs/pick_dialogs/app_pick_page.dart b/lib/widgets/dialogs/pick_dialogs/app_pick_page.dart new file mode 100644 index 0000000..dc43122 --- /dev/null +++ b/lib/widgets/dialogs/pick_dialogs/app_pick_page.dart @@ -0,0 +1,155 @@ +import 'package:aves/image_providers/app_icon_image_provider.dart'; +import 'package:aves/model/app_inventory.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/basic/list_tiles/reselectable_radio.dart'; +import 'package:aves/widgets/common/basic/query_bar.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class AppPickPage extends StatefulWidget { + static const routeName = '/app_pick'; + + final String? initialValue; + + const AppPickPage({ + super.key, + required this.initialValue, + }); + + @override + State<AppPickPage> createState() => _AppPickPageState(); +} + +class _AppPickPageState extends State<AppPickPage> { + late String? _selectedValue; + late Future<Set<Package>> _loader; + final ValueNotifier<String> _queryNotifier = ValueNotifier(''); + + static const double iconSize = 32; + + @override + void initState() { + super.initState(); + _selectedValue = widget.initialValue; + _loader = appService.getPackages(); + } + + @override + void dispose() { + _queryNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final useTvLayout = settings.useTvLayout; + return AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: !useTvLayout, + title: Text(context.l10n.appPickDialogTitle), + ), + body: SafeArea( + bottom: false, + child: FutureBuilder<Set<Package>>( + future: _loader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) { + return const Center( + child: CircularProgressIndicator(), + ); + } + + final allPackages = snapshot.data; + if (allPackages == null) return const SizedBox(); + final packages = allPackages.where((package) => package.categoryLauncher).toList()..sort((a, b) => compareAsciiUpperCase(_displayName(a), _displayName(b))); + return Column( + children: [ + if (!useTvLayout) QueryBar(queryNotifier: _queryNotifier), + ValueListenableBuilder<String>( + valueListenable: _queryNotifier, + builder: (context, query, child) { + final upQuery = query.toUpperCase().trim(); + final visiblePackages = packages.where((package) { + return { + package.packageName, + package.currentLabel, + package.englishLabel, + ...package.potentialDirs, + }.any((v) => v != null && v.toUpperCase().contains(upQuery)); + }).toList(); + final showNoneOption = upQuery.isEmpty; + final itemCount = visiblePackages.length + (showNoneOption ? 1 : 0); + return Expanded( + child: RadioGroup<String?>( + groupValue: _selectedValue, + onChanged: (v) => Navigator.maybeOf(context)?.pop(v), + child: ListView.builder( + itemBuilder: (context, index) { + if (showNoneOption) { + if (index == 0) { + return ReselectableRadioListTile<String?>( + value: '', + reselectable: true, + title: Text( + context.l10n.appPickDialogNone, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ); + } + index--; + } + + final package = visiblePackages[index]; + return ReselectableRadioListTile<String?>( + value: package.packageName, + reselectable: true, + title: Text.rich( + TextSpan( + children: [ + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Padding( + padding: const EdgeInsetsDirectional.only(end: 16), + child: Image( + image: AppIconImage( + packageName: package.packageName, + size: iconSize, + ), + width: iconSize, + height: iconSize, + ), + ), + ), + TextSpan( + text: _displayName(package), + ), + ], + ), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ); + }, + itemCount: itemCount, + ), + ), + ); + }, + ), + ], + ); + }, + ), + ), + ); + } + + String _displayName(Package package) => package.currentLabel ?? package.packageName; +} diff --git a/lib/widgets/dialogs/pick_dialogs/item_pick_page.dart b/lib/widgets/dialogs/pick_dialogs/item_pick_page.dart new file mode 100644 index 0000000..25d3607 --- /dev/null +++ b/lib/widgets/dialogs/pick_dialogs/item_pick_page.dart @@ -0,0 +1,74 @@ +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/query.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/widgets/collection/collection_grid.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/providers/query_provider.dart'; +import 'package:aves/widgets/common/providers/selection_provider.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ItemPickPage extends StatefulWidget { + static const routeName = '/item_pick'; + + final CollectionLens collection; + final bool canRemoveFilters; + + const ItemPickPage({ + super.key, + required this.collection, + required this.canRemoveFilters, + }); + + @override + State<ItemPickPage> createState() => _ItemPickPageState(); +} + +class _ItemPickPageState extends State<ItemPickPage> { + final ValueNotifier<AppMode> _appModeNotifier = ValueNotifier(AppMode.initialization); + + @override + void dispose() { + _appModeNotifier.dispose(); + // provided collection should be a new instance specifically created + // for the `ItemPickPage` widget, so it can be safely disposed here + widget.collection.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final collection = widget.collection; + final liveFilter = collection.filters.firstWhereOrNull((v) => v is QueryFilter && v.live) as QueryFilter?; + _appModeNotifier.value = widget.canRemoveFilters ? AppMode.pickUnfilteredMediaInternal : AppMode.pickFilteredMediaInternal; + return ListenableProvider<ValueNotifier<AppMode>>.value( + value: _appModeNotifier, + child: AvesScaffold( + body: SelectionProvider<AvesEntry>( + child: QueryProvider( + startEnabled: settings.getShowTitleQuery(context.currentRouteName!), + initialQuery: liveFilter?.query, + child: GestureAreaProtectorStack( + child: SafeArea( + top: false, + bottom: false, + child: ChangeNotifierProvider<CollectionLens>.value( + value: collection, + child: const CollectionGrid( + settingsRouteKey: CollectionPage.routeName, + ), + ), + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/dialogs/pick_dialogs/location_pick_page.dart b/lib/widgets/dialogs/pick_dialogs/location_pick_page.dart new file mode 100644 index 0000000..2182888 --- /dev/null +++ b/lib/widgets/dialogs/pick_dialogs/location_pick_page.dart @@ -0,0 +1,342 @@ +import 'dart:async'; + +import 'package:aves/model/settings/enums/coordinate_format.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/geocoding_service.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/utils/debouncer.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; +import 'package:aves/widgets/common/map/geo_map.dart'; +import 'package:aves/widgets/common/providers/map_theme_provider.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:latlong2/latlong.dart'; + +class LocationPickPage extends StatelessWidget { + static const routeName = '/location_pick'; + + final CollectionLens? collection; + final LatLng? initialLocation; + + const LocationPickPage({ + super.key, + required this.collection, + required this.initialLocation, + }); + + @override + Widget build(BuildContext context) { + return AvesScaffold( + body: SafeArea( + left: false, + top: false, + right: false, + bottom: true, + child: _Content( + collection: collection, + initialLocation: initialLocation, + ), + ), + ); + } +} + +class _Content extends StatefulWidget { + final CollectionLens? collection; + final LatLng? initialLocation; + + const _Content({ + required this.collection, + required this.initialLocation, + }); + + @override + State<_Content> createState() => _ContentState(); +} + +class _ContentState extends State<_Content> with SingleTickerProviderStateMixin { + final Set<StreamSubscription> _subscriptions = {}; + final AvesMapController _mapController = AvesMapController(); + late final ValueNotifier<bool> _isPageAnimatingNotifier; + final ValueNotifier<LatLng?> _dotLocationNotifier = ValueNotifier(null), _infoLocationNotifier = ValueNotifier(null); + final Debouncer _infoDebouncer = Debouncer(delay: ADurations.mapInfoDebounceDelay); + + CollectionLens? get openingCollection => widget.collection; + + @override + void initState() { + super.initState(); + + if (settings.mapStyle?.isHeavy ?? false) { + _isPageAnimatingNotifier = ValueNotifier(true); + Future.delayed(ADurations.pageTransitionLoose * timeDilation).then((_) { + if (!mounted) return; + _isPageAnimatingNotifier.value = false; + }); + } else { + _isPageAnimatingNotifier = ValueNotifier(false); + } + + _dotLocationNotifier.addListener(_updateLocationInfo); + + _subscriptions.add(_mapController.idleUpdates.listen((event) => _onIdle(event.bounds))); + } + + @override + void dispose() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + _mapController.dispose(); + _isPageAnimatingNotifier.dispose(); + _dotLocationNotifier.dispose(); + _infoLocationNotifier.dispose(); + // provided collection should be a new instance specifically created + // for the `LocationPickPage` widget, so it can be safely disposed here + widget.collection?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Expanded(child: _buildMap()), + Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 8), + const Divider(height: 0), + SafeArea( + top: false, + bottom: false, + child: _LocationInfo(locationNotifier: _infoLocationNotifier), + ), + const SizedBox(height: 8), + AvesOutlinedButton( + label: context.l10n.locationPickerUseThisLocationButton, + onPressed: () => Navigator.maybeOf(context)?.pop(_dotLocationNotifier.value), + ), + ], + ), + ], + ); + } + + Widget _buildMap() { + return MapTheme( + interactive: true, + showCoordinateFilter: false, + navigationButton: MapNavigationButton.back, + attributionPadding: const EdgeInsets.symmetric(horizontal: 8), + child: GeoMap( + controller: _mapController, + collection: openingCollection, + availableSize: MediaQuery.sizeOf(context), + initialCenter: widget.initialLocation, + isAnimatingNotifier: _isPageAnimatingNotifier, + dotLocationNotifier: _dotLocationNotifier, + onMapTap: _setLocation, + onMarkerTap: (location, entry) => _setLocation(location), + ), + ); + } + + void _setLocation(LatLng location) { + _dotLocationNotifier.value = location; + _mapController.moveTo(location); + } + + void _onIdle(ZoomedBounds bounds) { + _dotLocationNotifier.value = bounds.projectedCenter; + } + + void _updateLocationInfo() { + final selectedLocation = _dotLocationNotifier.value; + if (_infoLocationNotifier.value == null || selectedLocation == null) { + _infoLocationNotifier.value = selectedLocation; + } else { + _infoDebouncer(() => _infoLocationNotifier.value = selectedLocation); + } + } +} + +class _LocationInfo extends StatelessWidget { + final ValueNotifier<LatLng?> locationNotifier; + + static const double iconPadding = 8.0; + static const double _interRowPadding = 2.0; + + const _LocationInfo({ + required this.locationNotifier, + }); + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder<LatLng?>( + valueListenable: locationNotifier, + builder: (context, location, child) { + final isPortrait = MediaQuery.orientationOf(context) == Orientation.portrait; + final content = isPortrait + ? [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _AddressRow(location: location), + const SizedBox(height: _interRowPadding), + _CoordinateRow(location: location), + ], + ), + ), + ] + : [ + _CoordinateRow(location: location), + Expanded( + child: _AddressRow(location: location), + ), + ]; + + return Opacity( + opacity: location != null ? 1 : 0, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(width: iconPadding), + const DotMarker(), + ...content, + ], + ), + ); + }, + ); + } + + static double getIconSize(BuildContext context) { + final textScaler = MediaQuery.textScalerOf(context); + return textScaler.scale(16); + } +} + +class _AddressRow extends StatefulWidget { + final LatLng? location; + + const _AddressRow({ + required this.location, + }); + + @override + State<_AddressRow> createState() => _AddressRowState(); +} + +class _AddressRowState extends State<_AddressRow> { + final ValueNotifier<String?> _addressLineNotifier = ValueNotifier(null); + + @override + void initState() { + super.initState(); + _updateAddress(); + } + + @override + void didUpdateWidget(covariant _AddressRow oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.location != widget.location) { + _updateAddress(); + } + } + + @override + void dispose() { + _addressLineNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final textScaler = MediaQuery.textScalerOf(context); + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(width: _LocationInfo.iconPadding), + Icon(AIcons.location, size: _LocationInfo.getIconSize(context)), + const SizedBox(width: _LocationInfo.iconPadding), + Expanded( + child: Container( + alignment: AlignmentDirectional.centerStart, + // addresses can include non-latin scripts with inconsistent line height, + // which is especially an issue for relayout/painting of heavy Google map, + // so we give extra height to give breathing room to the text and stabilize layout + height: textScaler.scale(Theme.of(context).textTheme.bodyMedium!.fontSize!) * 2, + child: ValueListenableBuilder<String?>( + valueListenable: _addressLineNotifier, + builder: (context, addressLine, child) { + return Text( + addressLine ?? AText.valueNotAvailable, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ); + }, + ), + ), + ), + ], + ); + } + + Future<void> _updateAddress() async { + final location = widget.location; + final addressLine = await _getAddressLine(location); + if (!mounted) return; + if (location == widget.location) { + _addressLineNotifier.value = addressLine; + } + } + + Future<String?> _getAddressLine(LatLng? location) async { + if (location != null && await availability.canLocatePlaces) { + final addresses = await GeocodingService.getAddress(location, settings.appliedLocale); + if (addresses.isNotEmpty) { + final address = addresses.first; + return address.addressLine; + } + } + return null; + } +} + +class _CoordinateRow extends StatelessWidget { + final LatLng? location; + + const _CoordinateRow({ + required this.location, + }); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + const SizedBox(width: _LocationInfo.iconPadding), + Icon(AIcons.geoBounds, size: _LocationInfo.getIconSize(context)), + const SizedBox(width: _LocationInfo.iconPadding), + Expanded( + child: Text( + location != null ? settings.coordinateFormat.format(context, location!) : AText.valueNotAvailable, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ), + ], + ); + } +} diff --git a/lib/widgets/dialogs/pick_dialogs/pick_album_stub.dart b/lib/widgets/dialogs/pick_dialogs/pick_album_stub.dart new file mode 100644 index 0000000..db8db9f --- /dev/null +++ b/lib/widgets/dialogs/pick_dialogs/pick_album_stub.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +/// Stub minimale per eliminare gli errori di compilazione. +/// Restituisce sempre `null` e non apre nessun dialogo. +Future<T?> pickAlbum<T>({ + required BuildContext context, + dynamic moveType, + Iterable<dynamic>? chipTypes, + Uri? initialGroup, +}) async { + return null; +} diff --git a/lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart b/lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart new file mode 100644 index 0000000..32ed140 --- /dev/null +++ b/lib/widgets/dialogs/pick_dialogs/tag_pick_page.dart @@ -0,0 +1,316 @@ +import 'package:aves/app_mode.dart'; +import 'package:aves/model/filters/container/tag_group.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/tag.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/common/providers/filter_group_provider.dart'; +import 'package:aves/widgets/common/providers/query_provider.dart'; +import 'package:aves/widgets/common/providers/selection_provider.dart'; +import 'package:aves/widgets/dialogs/filter_editors/create_group_dialog.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/tag_set.dart'; +import 'package:aves/widgets/filter_grids/common/app_bar.dart'; +import 'package:aves/widgets/filter_grids/common/enums.dart'; +import 'package:aves/widgets/filter_grids/common/filter_grid_page.dart'; +import 'package:aves/widgets/filter_grids/tags_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +Future<TagBaseFilter?> pickTag({ + required BuildContext context, + required Iterable<ChipType> chipTypes, + required Uri? initialGroup, +}) async { + final source = context.read<CollectionSource>(); + if (source.targetScope != CollectionSource.fullScope) { + await reportService.log('Complete source initialization to pick tag'); + // source may not be fully initialized in view mode + source.canAnalyze = true; + await source.init(scope: CollectionSource.fullScope); + } + return await Navigator.maybeOf(context)?.push( + MaterialPageRoute<TagBaseFilter>( + settings: const RouteSettings(name: _TagPickPage.routeName), + builder: (context) => _TagPickPage( + source: source, + chipTypes: chipTypes, + initialGroup: initialGroup, + ), + ), + ); +} + +class _TagPickPage extends StatefulWidget { + static const routeName = '/tag_pick'; + + final CollectionSource source; + final Iterable<ChipType> chipTypes; + final Uri? initialGroup; + + const _TagPickPage({ + required this.source, + required this.chipTypes, + required this.initialGroup, + }); + + @override + State<_TagPickPage> createState() => _TagPickPageState(); +} + +class _TagPickPageState extends State<_TagPickPage> with FeedbackMixin { + final ValueNotifier<double> _appBarHeightNotifier = ValueNotifier(0); + final ValueNotifier<AppMode> _appModeNotifier = ValueNotifier(AppMode.pickFilterInternal); + + CollectionSource get source => widget.source; + + Iterable<ChipType> get chipTypes => widget.chipTypes; + + bool get isPickingGroup => chipTypes.length == 1 && chipTypes.contains(ChipType.group); + + String get title { + final l10n = context.l10n; + if (isPickingGroup) { + return l10n.groupPickerTitle; + } else { + return l10n.tagPickPageTitle; + } + } + + @override + void dispose() { + _appBarHeightNotifier.dispose(); + _appModeNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ListenableProvider<ValueNotifier<AppMode>>.value( + value: _appModeNotifier, + child: MultiProvider( + providers: [ + ChangeNotifierProvider<FilterGrouping>.value(value: tagGrouping), + FilterGroupProvider(initialValue: widget.initialGroup), + ], + child: Builder( + // to access filter group provider from subtree context + builder: (context) { + return Selector<Settings, ChipSortFactor>( + selector: (context, s) => s.tagSortFactor, + builder: (context, s, child) { + return StreamBuilder( + stream: source.eventBus.on<TagsChangedEvent>(), + builder: (context, snapshot) { + final groupUri = context.watch<FilterGroupNotifier>().value; + final gridItems = TagListPage.getGridItems(source, chipTypes, groupUri); + final scrollController = PrimaryScrollController.of(context); + return SelectionProvider<FilterGridItem<TagBaseFilter>>( + child: QueryProvider( + startEnabled: settings.getShowTitleQuery(context.currentRouteName!), + child: FilterGridPage<TagBaseFilter>( + settingsRouteKey: TagListPage.routeName, + appBar: FilterGridAppBar( + source: source, + title: title, + actionDelegate: TagChipSetActionDelegate(gridItems), + actionsBuilder: _buildActions, + isEmpty: false, + appBarHeightNotifier: _appBarHeightNotifier, + scrollController: scrollController, + ), + appBarHeightNotifier: _appBarHeightNotifier, + scrollController: scrollController, + sections: TagListPage.groupToSections(gridItems), + newFilters: const {}, + sortFactor: settings.tagSortFactor, + showHeaders: false, + selectable: false, + emptyBuilder: () => isPickingGroup + ? EmptyContent( + icon: AIcons.group, + text: context.l10n.groupEmpty, + ) + : EmptyContent( + icon: AIcons.tag, + text: context.l10n.tagEmpty, + ), + heroType: HeroType.never, + floatingActionButton: _buildFab(context), + onTileTap: (gridItem, _) async { + final filter = gridItem.filter; + switch (filter) { + case TagGroupFilter _: + context.read<FilterGroupNotifier>().value = filter.uri; + case TagFilter _: + _pickFilter(context, filter); + } + }, + ), + ), + ); + }, + ); + }, + ); + }, + ), + ), + ); + } + + Widget? _buildFab(BuildContext context) { + return isPickingGroup + ? FloatingActionButton.extended( + onPressed: () { + final groupUri = context.read<FilterGroupNotifier>().value; + final filter = groupUri != null ? tagGrouping.uriToFilter(groupUri) : TagGroupFilter.root; + if (filter is TagBaseFilter) { + _pickFilter(context, filter); + } + }, + icon: const Icon(AIcons.apply), + label: Text(context.l10n.groupPickerUseThisGroupButton), + ) + : null; + } + + List<Widget> _buildActions( + BuildContext context, + AppMode appMode, + Selection<FilterGridItem<TagBaseFilter>> selection, + TagChipSetActionDelegate actionDelegate, + ) { + final itemCount = actionDelegate.allItems.length; + final isSelecting = selection.isSelecting; + final selectedItems = selection.selectedItems; + final selectedFilters = selectedItems.map((v) => v.filter).toSet(); + + bool isVisible(ChipSetAction action) => actionDelegate.isVisible( + action, + appMode: appMode, + isSelecting: isSelecting, + itemCount: itemCount, + selectedFilters: selectedFilters, + ); + + void onActionSelected(ChipSetAction action) { + switch (action) { + case ChipSetAction.createGroup: + final parentGroupUri = context.read<FilterGroupNotifier>().value; + _createGroup(parentGroupUri); + default: + actionDelegate.onActionSelected(context, action); + } + } + + return settings.useTvLayout + ? _buildTelevisionActions( + context: context, + isVisible: isVisible, + onActionSelected: onActionSelected, + ) + : _buildMobileActions( + context: context, + isVisible: isVisible, + onActionSelected: onActionSelected, + ); + } + + List<Widget> _buildTelevisionActions({ + required BuildContext context, + required bool Function(ChipSetAction action) isVisible, + required void Function(ChipSetAction action) onActionSelected, + }) { + return [ + ...ChipSetActions.general, + ].where(isVisible).map((action) { + return CaptionedButton( + icon: action.getIcon(), + caption: action.getText(context), + onPressed: () => onActionSelected(action), + ); + }).toList(); + } + + List<Widget> _buildMobileActions({ + required BuildContext context, + required bool Function(ChipSetAction action) isVisible, + required void Function(ChipSetAction action) onActionSelected, + }) { + final animations = context.select<Settings, AccessibilityAnimations>((v) => v.accessibilityAnimations); + + final quickActions = [ + if (isPickingGroup) ChipSetAction.createGroup, + ]; + + // `null` items are converted to dividers + final menuActions = [ + ...ChipSetActions.general, + null, + ChipSetAction.toggleTitleSearch, + ]; + + return [ + ...quickActions + .where(isVisible) + .map( + (action) => IconButton( + icon: action.getIcon(), + onPressed: () => onActionSelected(action), + tooltip: action.getText(context), + ), + ), + PopupMenuButton<ChipSetAction>( + itemBuilder: (context) { + return menuActions.where((v) => v == null || isVisible(v)).map((action) { + if (action == null) return const PopupMenuDivider(); + return FilterGridAppBar.toMenuItem(context, action, enabled: true); + }).toList(); + }, + onSelected: (action) async { + // remove focus, if any, to prevent the keyboard from showing up + // after the user is done with the popup menu + FocusManager.instance.primaryFocus?.unfocus(); + + // wait for the popup menu to hide before proceeding with the action + await Future.delayed(animations.popUpAnimationDelay * timeDilation); + onActionSelected(action); + }, + popUpAnimationStyle: animations.popUpAnimationStyle, + ), + ]; + } + + Future<void> _createGroup(Uri? parentGroupUri) async { + final uri = await showDialog<Uri>( + context: context, + builder: (context) => CreateGroupDialog(grouping: tagGrouping, parentGroupUri: parentGroupUri), + routeSettings: const RouteSettings(name: CreateGroupDialog.routeName), + ); + if (uri == null) return; + + // wait for the dialog to hide + await Future.delayed(ADurations.dialogTransitionLoose * timeDilation); + + _pickFilter(context, TagGroupFilter.empty(uri)); + } + + void _pickFilter(BuildContext context, TagBaseFilter filter) async { + Navigator.maybeOf(context)?.pop<TagBaseFilter>(filter); + } +} diff --git a/lib/widgets/dialogs/select_storage_dialog.dart b/lib/widgets/dialogs/select_storage_dialog.dart new file mode 100644 index 0000000..44b7d3e --- /dev/null +++ b/lib/widgets/dialogs/select_storage_dialog.dart @@ -0,0 +1,82 @@ +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class SelectStorageDialog extends StatefulWidget { + static const routeName = '/dialog/select_storage'; + + final StorageVolume? initialVolume; + + const SelectStorageDialog({super.key, this.initialVolume}); + + @override + State<SelectStorageDialog> createState() => _SelectStorageDialogState(); +} + +class _SelectStorageDialogState extends State<SelectStorageDialog> { + late Set<StorageVolume> _allVolumes; + late StorageVolume? _primaryVolume, _selectedVolume; + + @override + void initState() { + super.initState(); + _allVolumes = androidFileUtils.storageVolumes; + _primaryVolume = _allVolumes.firstWhereOrNull((volume) => volume.isPrimary) ?? _allVolumes.firstOrNull; + _selectedVolume = widget.initialVolume ?? _primaryVolume; + } + + @override + Widget build(BuildContext context) { + final byPrimary = groupBy<StorageVolume, bool>(_allVolumes, (volume) => volume.isPrimary); + int compare(StorageVolume a, StorageVolume b) => compareAsciiUpperCaseNatural(a.path, b.path); + final primaryVolumes = (byPrimary[true] ?? [])..sort(compare); + final otherVolumes = (byPrimary[false] ?? [])..sort(compare); + + return AvesDialog( + title: context.l10n.selectStorageVolumeDialogTitle, + scrollableContent: [ + RadioGroup( + groupValue: _selectedVolume, + onChanged: (volume) { + _selectedVolume = volume!; + setState(() {}); + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ...primaryVolumes.map((volume) => _buildVolumeTile(context, volume)), + ...otherVolumes.map((volume) => _buildVolumeTile(context, volume)), + ], + ), + ), + ], + actions: [ + const CancelButton(), + TextButton( + onPressed: () => Navigator.maybeOf(context)?.pop(_selectedVolume), + child: Text(context.l10n.applyButtonLabel), + ), + ], + ); + } + + Widget _buildVolumeTile(BuildContext context, StorageVolume volume) => RadioListTile<StorageVolume>( + value: volume, + title: Text( + volume.getDescription(context), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + subtitle: Text( + volume.path, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ); +} diff --git a/lib/widgets/dialogs/selection_dialogs/common.dart b/lib/widgets/dialogs/selection_dialogs/common.dart new file mode 100644 index 0000000..fe34e4f --- /dev/null +++ b/lib/widgets/dialogs/selection_dialogs/common.dart @@ -0,0 +1,23 @@ +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/dialogs/selection_dialogs/single_selection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; + +Future<void> showSelectionDialog<T>({ + required BuildContext context, + required WidgetBuilder builder, + required void Function(T value) onSelection, +}) async { + final value = await showDialog<T>( + context: context, + builder: builder, + routeSettings: const RouteSettings(name: AvesSingleSelectionDialog.routeName), + ); + // wait for the dialog to hide + await Future.delayed(ADurations.dialogTransitionLoose * timeDilation); + if (value != null) { + onSelection(value); + } +} + +typedef TextBuilder<T> = String? Function(T value); diff --git a/lib/widgets/dialogs/selection_dialogs/multi_selection.dart b/lib/widgets/dialogs/selection_dialogs/multi_selection.dart new file mode 100644 index 0000000..a9079b3 --- /dev/null +++ b/lib/widgets/dialogs/selection_dialogs/multi_selection.dart @@ -0,0 +1,91 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/selection_dialogs/common.dart'; +import 'package:flutter/material.dart'; + +class AvesMultiSelectionDialog<T> extends StatefulWidget { + static const routeName = '/dialog/multi_selection'; + + final Set<T> initialValue; + final Map<T, String> options; + final TextBuilder<T>? optionSubtitleBuilder; + final String? title, message; + final bool? dense; + + const AvesMultiSelectionDialog({ + super.key, + required this.initialValue, + required this.options, + this.optionSubtitleBuilder, + this.title, + this.message, + this.dense, + }); + + @override + State<AvesMultiSelectionDialog<T>> createState() => _AvesMultiSelectionDialogState<T>(); +} + +class _AvesMultiSelectionDialogState<T> extends State<AvesMultiSelectionDialog<T>> { + late Set<T> _selectedValues; + + @override + void initState() { + super.initState(); + _selectedValues = widget.initialValue; + } + + @override + Widget build(BuildContext context) { + final title = widget.title; + final message = widget.message; + final verticalPadding = (title == null && message == null) ? AvesDialog.cornerRadius.y / 2 : .0; + return AvesDialog( + title: title, + scrollableContent: [ + if (verticalPadding != 0) SizedBox(height: verticalPadding), + if (message != null) + Padding( + padding: const EdgeInsets.all(16), + child: Text(message), + ), + ...widget.options.entries.map((kv) { + final value = kv.key; + final title = kv.value; + final subtitle = widget.optionSubtitleBuilder?.call(value); + return SwitchListTile( + value: _selectedValues.contains(value), + onChanged: (v) { + if (v) { + _selectedValues.add(value); + } else { + _selectedValues.remove(value); + } + setState(() {}); + }, + title: Align( + alignment: AlignmentDirectional.centerStart, + child: Text(title), + ), + subtitle: subtitle != null + ? Text( + subtitle, + softWrap: false, + overflow: TextOverflow.fade, + ) + : null, + dense: widget.dense, + ); + }), + if (verticalPadding != 0) SizedBox(height: verticalPadding), + ], + actions: [ + const CancelButton(), + TextButton( + onPressed: () => Navigator.maybeOf(context)?.pop(widget.options.keys.where(_selectedValues.contains).toList()), + child: Text(context.l10n.applyButtonLabel), + ), + ], + ); + } +} diff --git a/lib/widgets/dialogs/selection_dialogs/radio_list_tile.dart b/lib/widgets/dialogs/selection_dialogs/radio_list_tile.dart new file mode 100644 index 0000000..e8104d6 --- /dev/null +++ b/lib/widgets/dialogs/selection_dialogs/radio_list_tile.dart @@ -0,0 +1,45 @@ +import 'package:aves/widgets/common/basic/list_tiles/reselectable_radio.dart'; +import 'package:aves/widgets/dialogs/selection_dialogs/common.dart'; +import 'package:flutter/material.dart'; + +class SelectionRadioListTile<T> extends StatelessWidget { + final T value; + final String title; + final TextBuilder<T>? optionSubtitleBuilder; + final bool? dense; + final Widget? secondary; + + const SelectionRadioListTile({ + super.key, + required this.value, + required this.title, + this.optionSubtitleBuilder, + this.dense, + this.secondary, + }); + + @override + Widget build(BuildContext context) { + final subtitle = optionSubtitleBuilder?.call(value); + return ReselectableRadioListTile<T>( + // key is expected by test driver + key: Key('$value'), + value: value, + reselectable: true, + title: Text( + title, + overflow: TextOverflow.ellipsis, + maxLines: 2, + ), + subtitle: subtitle != null + ? Text( + subtitle, + softWrap: false, + overflow: TextOverflow.fade, + ) + : null, + dense: dense, + secondary: secondary, + ); + } +} diff --git a/lib/widgets/dialogs/selection_dialogs/single_selection.dart b/lib/widgets/dialogs/selection_dialogs/single_selection.dart new file mode 100644 index 0000000..60e3acc --- /dev/null +++ b/lib/widgets/dialogs/selection_dialogs/single_selection.dart @@ -0,0 +1,99 @@ +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/selection_dialogs/common.dart'; +import 'package:aves/widgets/dialogs/selection_dialogs/radio_list_tile.dart'; +import 'package:flutter/material.dart'; + +// do not use as `T` a record containing a collection +// because radio value comparison will fail without deep equality +class AvesSingleSelectionDialog<T> extends StatefulWidget { + static const routeName = '/dialog/selection'; + + final T initialValue; + final Map<T, String> options; + final TextBuilder<T>? optionSubtitleBuilder; + final String? title, message, confirmationButtonLabel; + final bool? dense; + + const AvesSingleSelectionDialog({ + super.key, + required this.initialValue, + required this.options, + this.optionSubtitleBuilder, + this.title, + this.message, + this.confirmationButtonLabel, + this.dense, + }); + + @override + State<AvesSingleSelectionDialog<T>> createState() => _AvesSingleSelectionDialogState<T>(); +} + +class _AvesSingleSelectionDialogState<T> extends State<AvesSingleSelectionDialog<T>> { + late T _selectedValue; + + @override + void initState() { + super.initState(); + _selectedValue = widget.initialValue; + } + + @override + Widget build(BuildContext context) { + final title = widget.title; + final message = widget.message; + final verticalPadding = (title == null && message == null) ? AvesDialog.cornerRadius.y / 2 : .0; + final confirmationButtonLabel = widget.confirmationButtonLabel; + final needConfirmation = confirmationButtonLabel != null; + return AvesDialog( + title: title, + scrollableContent: [ + RadioGroup<T>( + groupValue: _selectedValue, + onChanged: (v) { + // always update the group value even when popping afterwards, + // so that the group value can be used in pop handlers + // as well as the regular return value from navigation + _selectedValue = v as T; + if (!needConfirmation) { + // validate without confirmation + Navigator.maybeOf(context)?.pop(v); + } else { + setState(() {}); + } + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (verticalPadding != 0) SizedBox(height: verticalPadding), + if (message != null) + Padding( + padding: const EdgeInsets.all(16), + child: Text(message), + ), + ...widget.options.entries.map((kv) { + final radioValue = kv.key; + final radioTitle = kv.value; + return SelectionRadioListTile( + value: radioValue, + title: radioTitle, + optionSubtitleBuilder: widget.optionSubtitleBuilder, + dense: widget.dense, + ); + }), + if (verticalPadding != 0) SizedBox(height: verticalPadding), + ], + ), + ), + ], + actions: [ + const CancelButton(), + if (needConfirmation) + TextButton( + onPressed: () => Navigator.maybeOf(context)?.pop(_selectedValue), + child: Text(confirmationButtonLabel), + ), + ], + ); + } +} diff --git a/lib/widgets/dialogs/tile_view_dialog.dart b/lib/widgets/dialogs/tile_view_dialog.dart new file mode 100644 index 0000000..9d3cd88 --- /dev/null +++ b/lib/widgets/dialogs/tile_view_dialog.dart @@ -0,0 +1,264 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/fx/transitions.dart'; +import 'package:aves/widgets/common/identity/aves_caption.dart'; +import 'package:aves/widgets/common/identity/highlight_title.dart'; +import 'package:aves/widgets/common/tile_extent_controller.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'aves_dialog.dart'; + +class TileViewDialog<S, G, L> extends StatefulWidget { + static const routeName = '/dialog/tile_view'; + + final (S? sort, G? section, L? layout, bool reverse) initialValue; + final List<TileViewDialogOption<S>> sortOptions; + final List<TileViewDialogOption<G>> sectionOptions; + final List<TileViewDialogOption<L>> layoutOptions; + final String Function(S sort, bool reverse) sortOrder; + final TileExtentController tileExtentController; + final bool Function(S? sort, G? section, L? layout)? canSection; + + const TileViewDialog({ + super.key, + required this.initialValue, + this.sortOptions = const [], + this.sectionOptions = const [], + this.layoutOptions = const [], + required this.sortOrder, + this.canSection, + required this.tileExtentController, + }); + + @override + State<TileViewDialog> createState() => _TileViewDialogState<S, G, L>(); +} + +class _TileViewDialogState<S, G, L> extends State<TileViewDialog<S, G, L>> with SingleTickerProviderStateMixin { + late S? _selectedSort; + late G? _selectedSection; + late L? _selectedLayout; + late bool _reverseSort; + late int _columnMin, _columnMax; + late final ValueNotifier<int> _columnCountNotifier = ValueNotifier(tileExtentController.columnCount); + + List<TileViewDialogOption<S>> get sortOptions => widget.sortOptions; + + List<TileViewDialogOption<G>> get sectionOptions => widget.sectionOptions; + + List<TileViewDialogOption<L>> get layoutOptions => widget.layoutOptions; + + TileExtentController get tileExtentController => widget.tileExtentController; + + bool get canSection => (widget.canSection ?? (s, g, l) => true).call(_selectedSort, _selectedSection, _selectedLayout); + + @override + void initState() { + super.initState(); + final initialValue = widget.initialValue; + _selectedSort = initialValue.$1; + _selectedSection = initialValue.$2; + _selectedLayout = initialValue.$3; + _reverseSort = initialValue.$4; + + final extentController = tileExtentController; + final columnRange = extentController.effectiveColumnRange; + _columnMin = columnRange.$1; + _columnMax = columnRange.$2; + } + + @override + void dispose() { + _columnCountNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + + return AvesDialog( + scrollableContent: [ + _buildSection( + icon: AIcons.sort, + title: l10n.viewDialogSortSectionTitle, + trailing: IconButton( + icon: const Icon(AIcons.sortOrder), + onPressed: () => setState(() => _reverseSort = !_reverseSort), + tooltip: l10n.viewDialogReverseSortOrder, + ), + options: sortOptions, + value: _selectedSort, + onChanged: (v) { + _selectedSort = v; + _reverseSort = false; + }, + bottom: _selectedSort != null ? AvesCaption(widget.sortOrder(_selectedSort as S, _reverseSort)) : null, + ), + AnimatedSwitcher( + duration: context.read<DurationsData>().formTransition, + switchInCurve: Curves.easeInOutCubic, + switchOutCurve: Curves.easeInOutCubic, + transitionBuilder: AvesTransitions.formTransitionBuilder, + child: _buildSection( + show: canSection, + icon: AIcons.section, + title: l10n.viewDialogGroupSectionTitle, + options: sectionOptions, + value: _selectedSection, + onChanged: (v) => _selectedSection = v, + ), + ), + _buildSection( + icon: AIcons.layout, + title: l10n.viewDialogLayoutSectionTitle, + options: layoutOptions, + value: _selectedLayout, + onChanged: (v) => _selectedLayout = v, + ), + if (settings.showPinchGestureAlternatives) + Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: Row( + children: [ + const Icon(AIcons.thumbnailLarge), + Expanded( + child: ValueListenableBuilder<int>( + valueListenable: _columnCountNotifier, + builder: (context, columnCount, child) => Slider( + label: context.l10n.columnCount(columnCount), + value: columnCount.toDouble(), + onChanged: (v) => _columnCountNotifier.value = v.round(), + min: _columnMin.toDouble(), + max: _columnMax.toDouble(), + divisions: (_columnMax - _columnMin), + ), + ), + ), + const Icon(AIcons.thumbnailSmall), + ], + ), + ), + ], + actions: [ + const CancelButton(), + TextButton( + key: const Key('button-apply'), + onPressed: () { + tileExtentController.setUserPreferredColumnCount(_columnCountNotifier.value); + Navigator.maybeOf(context)?.pop<(S?, G?, L?, bool)>((_selectedSort, _selectedSection, _selectedLayout, _reverseSort)); + }, + child: Text(l10n.applyButtonLabel), + ), + ], + ); + } + + Widget _buildSection<T>({ + bool show = true, + required IconData icon, + required String title, + Widget? trailing, + required List<TileViewDialogOption<T>> options, + required T value, + required ValueChanged<T?> onChanged, + Widget? bottom, + }) { + if (options.isEmpty || !show) return const SizedBox(); + + final label = ConstrainedBox( + constraints: const BoxConstraints(minHeight: kMinInteractiveDimension), + child: FontSizeIconTheme( + child: Row( + children: [ + Icon(icon), + const SizedBox(width: 16), + Expanded( + child: HighlightTitle( + title: title, + showHighlight: false, + ), + ), + ?trailing, + ], + ), + ), + ); + final selector = TextDropdownButton<T>( + values: options.map((v) => v.value).toList(), + valueText: (v) => options.firstWhere((option) => option.value == v).title, + valueIcon: (v) => options.firstWhere((option) => option.value == v).icon, + value: value, + onChanged: (v) => setState(() => onChanged(v)), + isExpanded: true, + dropdownColor: Themes.thirdLayerColor(context), + ); + + final textScaler = MediaQuery.textScalerOf(context); + final iconSize = textScaler.scale(IconTheme.of(context).size!); + final isPortrait = MediaQuery.orientationOf(context) == Orientation.portrait; + final child = isPortrait + ? Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + label, + Padding( + padding: EdgeInsetsDirectional.only(start: iconSize + 16, end: 12), + child: selector, + ), + if (bottom != null) + Padding( + padding: EdgeInsetsDirectional.only(start: iconSize + 16), + child: bottom, + ), + ], + ) + : Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded(child: label), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + selector, + ?bottom, + ], + ), + ), + ], + ); + + return TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: Padding( + padding: const EdgeInsets.only(left: 16, top: 8, right: 16), + child: child, + ), + ); + } +} + +@immutable +class TileViewDialogOption<T> { + final T value; + final String title; + final IconData icon; + + const TileViewDialogOption({ + required this.value, + required this.title, + required this.icon, + }); +} diff --git a/lib/widgets/dialogs/time_shift_dialog.dart b/lib/widgets/dialogs/time_shift_dialog.dart new file mode 100644 index 0000000..92f3a74 --- /dev/null +++ b/lib/widgets/dialogs/time_shift_dialog.dart @@ -0,0 +1,52 @@ +import 'package:aves/widgets/common/basic/time_shift_selector.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; + +import 'aves_dialog.dart'; + +class TimeShiftDialog extends StatefulWidget { + static const routeName = '/dialog/time_shift'; + + final Duration initialValue; + + const TimeShiftDialog({ + super.key, + required this.initialValue, + }); + + @override + State<TimeShiftDialog> createState() => _TimeShiftDialogState(); +} + +class _TimeShiftDialogState extends State<TimeShiftDialog> { + late TimeShiftController _timeShiftController; + + @override + void initState() { + super.initState(); + _timeShiftController = TimeShiftController( + initialValue: widget.initialValue, + ); + } + + @override + Widget build(BuildContext context) { + return AvesDialog( + scrollableContent: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: TimeShiftSelector(controller: _timeShiftController), + ), + ], + actions: [ + const CancelButton(), + TextButton( + onPressed: () => _submit(context), + child: Text(context.l10n.applyButtonLabel), + ), + ], + ); + } + + void _submit(BuildContext context) => Navigator.maybeOf(context)?.pop(_timeShiftController.value); +} diff --git a/lib/widgets/dialogs/video_speed_dialog.dart b/lib/widgets/dialogs/video_speed_dialog.dart new file mode 100644 index 0000000..eb1f671 --- /dev/null +++ b/lib/widgets/dialogs/video_speed_dialog.dart @@ -0,0 +1,76 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; + +import 'aves_dialog.dart'; + +class VideoSpeedDialog extends StatefulWidget { + static const routeName = '/dialog/select_video_speed'; + + final double current, min, max; + + const VideoSpeedDialog({ + super.key, + required this.current, + required this.min, + required this.max, + }); + + @override + State<VideoSpeedDialog> createState() => _VideoSpeedDialogState(); +} + +class _VideoSpeedDialogState extends State<VideoSpeedDialog> { + late double _speed; + + static const interval = .25; + + @override + void initState() { + super.initState(); + _speed = widget.current; + } + + @override + Widget build(BuildContext context) { + return AvesDialog( + horizontalContentPadding: 4, + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Wrap( + children: [ + Text(context.l10n.videoSpeedDialogLabel), + const SizedBox(width: 16), + Text('x$_speed'), + ], + ), + ), + const SizedBox(height: 16), + Slider( + value: _speed, + onChanged: (v) => setState(() { + // provided value may be imprecise on some platforms + // e.g. 1.7499999999999998 instead of 1.75 + _speed = (v / interval).round() * interval; + }), + min: widget.min, + max: widget.max, + divisions: ((widget.max - widget.min) / interval).round(), + ), + ], + ), + actions: [ + const CancelButton(), + TextButton( + onPressed: () => _submit(context), + child: Text(context.l10n.applyButtonLabel), + ), + ], + ); + } + + void _submit(BuildContext context) => Navigator.maybeOf(context)?.pop(_speed); +} diff --git a/lib/widgets/dialogs/video_stream_selection_dialog.dart b/lib/widgets/dialogs/video_stream_selection_dialog.dart new file mode 100644 index 0000000..8a9fc64 --- /dev/null +++ b/lib/widgets/dialogs/video_stream_selection_dialog.dart @@ -0,0 +1,163 @@ +import 'package:aves/ref/languages.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +import 'aves_dialog.dart'; + +class VideoStreamSelectionDialog extends StatefulWidget { + static const routeName = '/dialog/select_video_stream'; + + final Map<MediaStreamSummary, bool> streams; + + const VideoStreamSelectionDialog({ + super.key, + required this.streams, + }); + + @override + State<VideoStreamSelectionDialog> createState() => _VideoStreamSelectionDialogState(); +} + +class _VideoStreamSelectionDialogState extends State<VideoStreamSelectionDialog> { + late List<MediaStreamSummary?> _videoStreams, _audioStreams, _textStreams; + MediaStreamSummary? _currentVideo, _currentAudio, _currentText; + + @override + void initState() { + super.initState(); + + final byType = groupBy<MediaStreamSummary, MediaStreamType>(widget.streams.keys, (v) => v.type); + // check width/height to exclude image streams (that are included among video streams) + _videoStreams = (byType[MediaStreamType.video] ?? []).where((v) => v.width != null && v.height != null).toList(); + _audioStreams = (byType[MediaStreamType.audio] ?? []); + _textStreams = [null, ...byType[MediaStreamType.text] ?? []]; + + final streamEntries = widget.streams.entries; + _currentVideo = streamEntries.firstWhereOrNull((kv) => kv.key.type == MediaStreamType.video && kv.value)?.key; + _currentAudio = streamEntries.firstWhereOrNull((kv) => kv.key.type == MediaStreamType.audio && kv.value)?.key; + _currentText = streamEntries.firstWhereOrNull((kv) => kv.key.type == MediaStreamType.text && kv.value)?.key; + } + + @override + Widget build(BuildContext context) { + final canSelectVideo = _videoStreams.length > 1; + final canSelectAudio = _audioStreams.length > 1; + final canSelectText = _textStreams.length > 1; + final canSelect = canSelectVideo || canSelectAudio || canSelectText; + if (!canSelect) { + return AvesMessageDialog.info(context.l10n.videoStreamSelectionDialogNoSelection); + } + return AvesDialog( + scrollableContent: [ + if (canSelectVideo) + ..._buildSection( + icon: AIcons.streamVideo, + title: context.l10n.videoStreamSelectionDialogVideo, + streams: _videoStreams, + current: _currentVideo, + setter: (v) => _currentVideo = v, + ), + if (canSelectAudio) + ..._buildSection( + icon: AIcons.streamAudio, + title: context.l10n.videoStreamSelectionDialogAudio, + streams: _audioStreams, + current: _currentAudio, + setter: (v) => _currentAudio = v, + ), + if (canSelectText) + ..._buildSection( + icon: AIcons.streamText, + title: context.l10n.videoStreamSelectionDialogText, + streams: _textStreams, + current: _currentText, + setter: (v) => _currentText = v, + ), + const SizedBox(height: 8), + ], + actions: [ + const CancelButton(), + TextButton( + onPressed: () => _submit(context), + child: Text(context.l10n.applyButtonLabel), + ), + ], + ); + } + + static String _formatLanguage(String value) { + final language = Language.living639_2.firstWhereOrNull((language) => language.iso639_2 == value); + return language?.native ?? value; + } + + String _commonStreamName(MediaStreamSummary? stream) { + if (stream == null) return context.l10n.videoStreamSelectionDialogOff; + final title = stream.title; + final language = stream.language; + if (language != null && language != 'und') { + final formattedLanguage = _formatLanguage(language); + return '$formattedLanguage${title != null && title != formattedLanguage ? ' • $title' : ''}'; + } else if (title != null) { + return title; + } else { + return '${context.l10n.videoStreamSelectionDialogTrack} ${stream.index} (${stream.codecName})'; + } + } + + String _streamName(MediaStreamSummary? stream) { + final common = _commonStreamName(stream); + if (stream != null && stream.type == MediaStreamType.video) { + final w = stream.width; + final h = stream.height; + if (w != null && h != null) { + return '$common • $w${AText.resolutionSeparator}$h'; + } + } + return common; + } + + List<Widget> _buildSection({ + required IconData icon, + required String title, + required List<MediaStreamSummary?> streams, + required MediaStreamSummary? current, + required ValueSetter<MediaStreamSummary?> setter, + }) { + return [ + Padding( + padding: const EdgeInsets.only(left: 16, top: 16, right: 16), + child: Row( + children: [ + Icon(icon), + const SizedBox(width: 16), + Text(title), + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + // allow `null` subtitle stream to disable subtitles + child: TextDropdownButton<MediaStreamSummary?>( + values: streams, + valueText: _streamName, + value: current, + onChanged: streams.length > 1 ? (newValue) => setState(() => setter(newValue)) : null, + isExpanded: true, + dropdownColor: Themes.thirdLayerColor(context), + ), + ), + ]; + } + + void _submit(BuildContext context) => Navigator.maybeOf(context)?.pop({ + MediaStreamType.video: _currentVideo, + MediaStreamType.audio: _currentAudio, + MediaStreamType.text: _currentText, + }); +} diff --git a/lib/widgets/dialogs/wallpaper_settings_dialog.dart b/lib/widgets/dialogs/wallpaper_settings_dialog.dart new file mode 100644 index 0000000..59f9d83 --- /dev/null +++ b/lib/widgets/dialogs/wallpaper_settings_dialog.dart @@ -0,0 +1,55 @@ +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/selection_dialogs/radio_list_tile.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +class WallpaperSettingsDialog extends StatefulWidget { + static const routeName = '/dialog/wallpaper_settings'; + + const WallpaperSettingsDialog({super.key}); + + @override + State<WallpaperSettingsDialog> createState() => _WallpaperSettingsDialogState(); +} + +class _WallpaperSettingsDialogState extends State<WallpaperSettingsDialog> { + WallpaperTarget _selectedTarget = WallpaperTarget.home; + bool _useScrollEffect = true; + + @override + Widget build(BuildContext context) { + return AvesDialog( + scrollableContent: [ + RadioGroup<WallpaperTarget>( + groupValue: _selectedTarget, + onChanged: (volume) => setState(() => _selectedTarget = volume!), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ...WallpaperTarget.values.map((value) { + return SelectionRadioListTile<WallpaperTarget>( + value: value, + title: value.getName(context), + ); + }), + SwitchListTile( + value: _useScrollEffect, + onChanged: (v) => setState(() => _useScrollEffect = v), + title: Text(context.l10n.wallpaperUseScrollEffect), + ), + ], + ), + ), + ], + actions: [ + const CancelButton(), + TextButton( + onPressed: () => Navigator.maybeOf(context)?.pop<(WallpaperTarget, bool)>((_selectedTarget, _useScrollEffect)), + child: Text(context.l10n.applyButtonLabel), + ), + ], + ); + } +} diff --git a/lib/widgets/editor/control_panel.dart b/lib/widgets/editor/control_panel.dart new file mode 100644 index 0000000..e938b88 --- /dev/null +++ b/lib/widgets/editor/control_panel.dart @@ -0,0 +1,137 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/basic/multi_cross_fader.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/editor/transform/control_panel.dart'; +import 'package:aves/widgets/editor/transform/controller.dart'; +import 'package:aves/widgets/viewer/overlay/viewer_buttons.dart'; +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class EditorControlPanel extends StatelessWidget { + final AvesEntry entry; + final ValueNotifier<EditorAction?> actionNotifier; + + static const padding = ViewerButtonRowContent.padding; + static const actions = [ + EditorAction.transform, + ]; + + const EditorControlPanel({ + super.key, + required this.entry, + required this.actionNotifier, + }); + + @override + Widget build(BuildContext context) { + return PopScope( + canPop: actionNotifier.value == null, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + + _cancelAction(context); + }, + child: Padding( + padding: const EdgeInsets.all(padding), + child: TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: ValueListenableBuilder<EditorAction?>( + valueListenable: actionNotifier, + builder: (context, action, child) { + return MultiCrossFader( + duration: context.select<DurationsData, Duration>((v) => v.formTransition), + alignment: Alignment.bottomCenter, + layoutBuilder: (topChild, topChildKey, bottomChild, bottomChildKey) { + return Stack( + clipBehavior: Clip.none, + children: <Widget>[ + Positioned( + key: bottomChildKey, + left: 0.0, + bottom: 0.0, + right: 0.0, + child: bottomChild, + ), + Positioned( + key: topChildKey, + child: topChild, + ), + ], + ); + }, + child: action == null ? _buildTopLevelPanel(context) : _buildActionPanel(context, action), + ); + }, + ), + ), + ), + ); + } + + Widget _buildTopLevelPanel(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + ...actions.map( + (action) => Padding( + padding: const EdgeInsetsDirectional.symmetric(horizontal: padding / 2), + child: OverlayButton( + child: IconButton( + icon: action.getIcon(), + onPressed: () => actionNotifier.value = action, + tooltip: action.getText(context), + ), + ), + ), + ), + ], + ), + const SizedBox(height: padding), + Row( + children: [ + const OverlayButton( + child: CloseButton(), + ), + const Spacer(), + OverlayTextButton( + onPressed: () {}, + child: Text(context.l10n.saveCopyButtonLabel), + ), + ], + ), + ], + ); + } + + Widget _buildActionPanel(BuildContext context, EditorAction action) { + switch (action) { + case EditorAction.transform: + return TransformControlPanel( + entry: entry, + onCancel: () => _cancelAction(context), + onApply: (transformation) => _applyAction(context), + ); + } + } + + void _cancelAction(BuildContext context) { + actionNotifier.value = null; + context.read<AvesMagnifierController>().reset(); + context.read<TransformController>().reset(); + } + + void _applyAction(BuildContext context) { + actionNotifier.value = null; + context.read<TransformController>().reset(); + } +} diff --git a/lib/widgets/editor/entry_editor_page.dart b/lib/widgets/editor/entry_editor_page.dart new file mode 100644 index 0000000..87eca78 --- /dev/null +++ b/lib/widgets/editor/entry_editor_page.dart @@ -0,0 +1,140 @@ +import 'dart:async'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/viewer/view_state.dart'; +import 'package:aves/widgets/editor/control_panel.dart'; +import 'package:aves/widgets/editor/image.dart'; +import 'package:aves/widgets/editor/transform/controller.dart'; +import 'package:aves/widgets/editor/transform/cropper.dart'; +import 'package:aves/widgets/viewer/overlay/minimap.dart'; +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ImageEditorPage extends StatefulWidget { + static const routeName = '/image_editor'; + + final AvesEntry entry; + + const ImageEditorPage({ + super.key, + required this.entry, + }); + + @override + State<ImageEditorPage> createState() => _ImageEditorPageState(); +} + +class _ImageEditorPageState extends State<ImageEditorPage> { + final Set<StreamSubscription> _subscriptions = {}; + final ValueNotifier<EditorAction?> _actionNotifier = ValueNotifier(null); + final ValueNotifier<EdgeInsets> _marginNotifier = ValueNotifier(EdgeInsets.zero); + final ValueNotifier<ViewState> _viewStateNotifier = ValueNotifier<ViewState>(ViewState.zero); + final AvesMagnifierController _magnifierController = AvesMagnifierController(); + late final TransformController _transformController; + + @override + void initState() { + super.initState(); + _transformController = TransformController(widget.entry.displaySize); + _actionNotifier.addListener(_onActionChanged); + _subscriptions.add(_transformController.transformationStream.map((v) => v.matrix).distinct().listen(_onTransformationMatrixChanged)); + } + + @override + void dispose() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + _actionNotifier.dispose(); + _marginNotifier.dispose(); + _viewStateNotifier.dispose(); + _magnifierController.dispose(); + _transformController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: MultiProvider( + providers: [ + Provider<AvesMagnifierController>.value(value: _magnifierController), + Provider<TransformController>.value(value: _transformController), + ], + child: SafeArea( + child: Column( + children: [ + Expanded( + child: Stack( + children: [ + ClipRect( + child: EditorImage( + magnifierController: _magnifierController, + transformController: _transformController, + actionNotifier: _actionNotifier, + marginNotifier: _marginNotifier, + viewStateNotifier: _viewStateNotifier, + entry: widget.entry, + ), + ), + if (settings.showOverlayMinimap) + PositionedDirectional( + start: 8, + bottom: 8, + child: Minimap(viewStateNotifier: _viewStateNotifier), + ), + ValueListenableBuilder<EditorAction?>( + valueListenable: _actionNotifier, + builder: (context, action, child) { + switch (action) { + case EditorAction.transform: + return Cropper( + magnifierController: _magnifierController, + transformController: _transformController, + marginNotifier: _marginNotifier, + ); + case null: + return const SizedBox(); + } + }, + ), + ], + ), + ), + const Divider(height: 0), + EditorControlPanel( + entry: widget.entry, + actionNotifier: _actionNotifier, + ), + ], + ), + ), + ), + resizeToAvoidBottomInset: false, + ); + } + + void _onActionChanged() { + switch (_actionNotifier.value) { + case EditorAction.transform: + _transformController.reset(); + _marginNotifier.value = Cropper.imageMargin; + default: + _marginNotifier.value = EdgeInsets.zero; + } + } + + void _onTransformationMatrixChanged(Matrix4 transformationMatrix) { + final boundaries = _magnifierController.scaleBoundaries; + if (boundaries != null) { + _magnifierController.setScaleBoundaries( + boundaries.copyWith( + externalTransform: transformationMatrix, + ), + ); + } + } +} diff --git a/lib/widgets/editor/image.dart b/lib/widgets/editor/image.dart new file mode 100644 index 0000000..df62135 --- /dev/null +++ b/lib/widgets/editor/image.dart @@ -0,0 +1,224 @@ +import 'dart:async'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/viewer/view_state.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/editor/transform/controller.dart'; +import 'package:aves/widgets/editor/transform/painter.dart'; +import 'package:aves/widgets/editor/transform/transformation.dart'; +import 'package:aves/widgets/viewer/visual/error.dart'; +import 'package:aves/widgets/viewer/visual/raster.dart'; +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class EditorImage extends StatefulWidget { + final AvesMagnifierController magnifierController; + final TransformController transformController; + final ValueNotifier<EditorAction?> actionNotifier; + final ValueNotifier<EdgeInsets> marginNotifier; + final ValueNotifier<ViewState> viewStateNotifier; + final AvesEntry entry; + + const EditorImage({ + super.key, + required this.magnifierController, + required this.transformController, + required this.actionNotifier, + required this.marginNotifier, + required this.viewStateNotifier, + required this.entry, + }); + + @override + State<EditorImage> createState() => _EditorImageState(); +} + +class _EditorImageState extends State<EditorImage> { + final Set<StreamSubscription> _subscriptions = {}; + final ValueNotifier<double> _scrimOpacityNotifier = ValueNotifier(0); + + AvesEntry get entry => widget.entry; + + TransformController get transformController => widget.transformController; + + ValueNotifier<ViewState> get viewStateNotifier => widget.viewStateNotifier; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant EditorImage oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(EditorImage widget) { + widget.actionNotifier.addListener(_onActionChanged); + _subscriptions.add(widget.magnifierController.stateStream.listen(_onViewStateChanged)); + _subscriptions.add(widget.magnifierController.scaleBoundariesStream.listen(_onViewScaleBoundariesChanged)); + _subscriptions.add(widget.transformController.activityStream.listen(_onTransformActivity)); + } + + void _unregisterWidget(EditorImage widget) { + widget.actionNotifier.removeListener(_onActionChanged); + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + @override + Widget build(BuildContext context) { + return MagnifierGestureDetectorScope( + axis: const [Axis.horizontal, Axis.vertical], + child: StreamBuilder<Transformation>( + stream: transformController.transformationStream, + builder: (context, snapshot) { + final transformation = (snapshot.data ?? Transformation.zero); + final highlightRegionCorners = transformation.region.corners; + final imageToUserMatrix = transformation.matrix; + + final mediaSize = entry.displaySize; + final canvasSize = MatrixUtils.transformRect(imageToUserMatrix, Offset.zero & mediaSize).size; + + return ValueListenableBuilder<EdgeInsets>( + valueListenable: widget.marginNotifier, + builder: (context, margin, child) { + return Transform( + alignment: Alignment.center, + transform: imageToUserMatrix, + child: ValueListenableBuilder<EditorAction?>( + valueListenable: widget.actionNotifier, + builder: (context, action, child) { + return LayoutBuilder( + builder: (context, constraints) { + final viewportSize = margin.deflateSize(constraints.biggest); + final minScale = ScaleLevel(factor: ScaleLevel.scaleForContained(viewportSize, canvasSize)); + return AvesMagnifier( + key: Key('${entry.uri}_${entry.pageId}_${entry.dateModifiedMillis}'), + controller: widget.magnifierController, + viewportPadding: margin, + contentSize: mediaSize, + allowOriginalScaleBeyondRange: false, + allowGestureScaleBeyondRange: false, + panInertia: _getActionPanInertia(action), + minScale: minScale, + maxScale: const ScaleLevel(factor: 1), + initialScale: minScale, + scaleStateCycle: defaultScaleStateCycle, + applyScale: false, + onScaleStart: (details, doubleTap, boundaries) { + transformController.activity = TransformActivity.pan; + }, + onScaleEnd: (details) { + transformController.activity = TransformActivity.none; + }, + child: child!, + ); + }, + ); + }, + child: Stack( + children: [ + RasterImageView( + entry: entry, + viewStateNotifier: viewStateNotifier, + errorBuilder: (context, error, stackTrace) => ErrorView( + entry: entry, + onTap: () {}, + ), + ), + Positioned.fill( + child: ValueListenableBuilder<ViewState>( + valueListenable: viewStateNotifier, + builder: (context, viewState, child) { + final scale = viewState.scale ?? 1; + final highlightRegionPath = Path()..addPolygon(highlightRegionCorners.map((v) => v * scale).toList(), true); + return ValueListenableBuilder<double>( + valueListenable: _scrimOpacityNotifier, + builder: (context, opacity, child) { + return AnimatedOpacity( + opacity: opacity, + duration: context.read<DurationsData>().viewerOverlayAnimation, + child: CustomPaint( + painter: ScrimPainter( + excludePath: highlightRegionPath, + opacity: opacity, + ), + ), + ); + }, + ); + }, + ), + ), + ], + ), + ), + ); + }, + ); + }, + ), + ); + } + + void _onViewStateChanged(MagnifierState v) { + viewStateNotifier.value = viewStateNotifier.value.copyWith( + position: v.position, + scale: v.scale, + ); + } + + void _onViewScaleBoundariesChanged(ScaleBoundaries v) { + viewStateNotifier.value = viewStateNotifier.value.copyWith( + viewportSize: v.viewportSize, + contentSize: v.contentSize, + ); + } + + void _onActionChanged() => _updateScrim(); + + void _onTransformActivity(TransformActivity activity) => _updateScrim(); + + void _updateScrim() => _scrimOpacityNotifier.value = _getActionScrimOpacity(widget.actionNotifier.value, transformController.activity); + + static double _getActionPanInertia(EditorAction? action) { + switch (action) { + case EditorAction.transform: + return 0; + case null: + return AvesMagnifier.defaultPanInertia; + } + } + + static double _getActionScrimOpacity(EditorAction? action, TransformActivity activity) { + switch (action) { + case EditorAction.transform: + switch (activity) { + case TransformActivity.none: + return .9; + case TransformActivity.pan: + case TransformActivity.resize: + case TransformActivity.straighten: + return .6; + } + case null: + return 0; + } + } +} diff --git a/lib/widgets/editor/transform/control_panel.dart b/lib/widgets/editor/transform/control_panel.dart new file mode 100644 index 0000000..57a0ce3 --- /dev/null +++ b/lib/widgets/editor/transform/control_panel.dart @@ -0,0 +1,202 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/editor/control_panel.dart'; +import 'package:aves/widgets/editor/transform/controller.dart'; +import 'package:aves/widgets/editor/transform/transformation.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; + +class TransformControlPanel extends StatefulWidget { + final AvesEntry entry; + final VoidCallback onCancel; + final void Function(Transformation transformation) onApply; + + const TransformControlPanel({ + super.key, + required this.entry, + required this.onCancel, + required this.onApply, + }); + + @override + State<TransformControlPanel> createState() => _TransformControlPanelState(); +} + +class _TransformControlPanelState extends State<TransformControlPanel> with TickerProviderStateMixin { + late final List<(WidgetBuilder, WidgetBuilder)> _tabs; + late final TabController _tabController; + + static const padding = EditorControlPanel.padding; + + @override + void initState() { + super.initState(); + _tabs = [ + ( + (context) => Tab(text: context.l10n.editorTransformCrop), + (context) => const CropControlPanel(), + ), + ( + (context) => Tab(text: context.l10n.editorTransformRotate), + (context) => const RotationControlPanel(), + ), + ]; + _tabController = TabController( + length: _tabs.length, + vsync: this, + ); + } + + @override + void dispose() { + _tabController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final transformController = context.watch<TransformController>(); + return Column( + children: [ + SizedBox( + height: CropControlPanel.preferredHeight(context), + child: AnimatedBuilder( + animation: _tabController, + builder: (context, child) { + return AnimatedSwitcher( + duration: context.select<DurationsData, Duration>((v) => v.formTransition), + child: _tabs[_tabController.index].$2(context), + ); + }, + ), + ), + const SizedBox(height: padding), + Row( + children: [ + OverlayButton( + child: BackButton( + onPressed: widget.onCancel, + ), + ), + Expanded( + child: TabBar( + tabs: _tabs.map((v) => v.$1(context)).toList(), + controller: _tabController, + padding: const EdgeInsets.symmetric(horizontal: padding), + indicatorSize: TabBarIndicatorSize.label, + ), + ), + OverlayButton( + child: StreamBuilder<Transformation>( + stream: transformController.transformationStream, + builder: (context, _) { + return IconButton( + icon: const Icon(AIcons.apply), + onPressed: transformController.modified ? () => widget.onApply(transformController.transformation) : null, + tooltip: context.l10n.applyTooltip, + ); + }, + ), + ), + ], + ), + ], + ); + } +} + +class CropControlPanel extends StatelessWidget { + const CropControlPanel({super.key}); + + static double preferredHeight(BuildContext context) => CropAspectRatio.values.map((v) { + return CaptionedButton.getSize(context, v.getText(context), showCaption: true).height; + }).max; + + @override + Widget build(BuildContext context) { + final controller = context.watch<TransformController>(); + return ListView.builder( + scrollDirection: Axis.horizontal, + shrinkWrap: true, + itemBuilder: (context, index) { + final ratio = CropAspectRatio.values[index]; + void setAspectRatio() => controller.setAspectRatio(ratio); + return CaptionedButton( + iconButtonBuilder: (context, focusNode) { + return ValueListenableBuilder<CropAspectRatio>( + valueListenable: controller.aspectRatioNotifier, + builder: (context, selectedRatio, child) { + return IconButton( + color: ratio == selectedRatio ? Theme.of(context).colorScheme.primary : null, + onPressed: setAspectRatio, + focusNode: focusNode, + icon: ratio.getIcon(), + ); + }, + ); + }, + caption: ratio.getText(context), + onPressed: setAspectRatio, + ); + }, + itemCount: CropAspectRatio.values.length, + ); + } +} + +class RotationControlPanel extends StatelessWidget { + const RotationControlPanel({super.key}); + + @override + Widget build(BuildContext context) { + final controller = context.watch<TransformController>(); + final angleFormatter = NumberFormat('0.0°', context.locale); + + return Row( + children: [ + _buildButton(context, EntryAction.flip, controller.flipHorizontally), + Expanded( + child: StreamBuilder<Transformation>( + stream: controller.transformationStream, + builder: (context, _) { + final degrees = controller.transformation.straightenDegrees; + return SliderTheme( + data: SliderTheme.of(context).copyWith( + showValueIndicator: ShowValueIndicator.onDrag, + ), + child: Slider( + value: degrees, + min: TransformController.straightenDegreesMin, + max: TransformController.straightenDegreesMax, + onChangeStart: (v) => controller.activity = TransformActivity.straighten, + onChangeEnd: (v) => controller.activity = TransformActivity.none, + label: angleFormatter.format(degrees), + onChanged: (v) => controller.straightenDegrees = v, + ), + ); + }, + ), + ), + _buildButton(context, EntryAction.rotateCW, controller.rotateClockwise), + ], + ); + } + + Widget _buildButton(BuildContext context, EntryAction action, VoidCallback onPressed) { + return OverlayButton( + child: IconButton( + icon: action.getIcon(), + onPressed: onPressed, + tooltip: action.getText(context), + ), + ); + } +} diff --git a/lib/widgets/editor/transform/controller.dart b/lib/widgets/editor/transform/controller.dart new file mode 100644 index 0000000..57328ca --- /dev/null +++ b/lib/widgets/editor/transform/controller.dart @@ -0,0 +1,102 @@ +import 'dart:async'; +import 'dart:ui'; + +import 'package:aves/widgets/editor/transform/crop_region.dart'; +import 'package:aves/widgets/editor/transform/transformation.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +class TransformController { + ValueNotifier<CropAspectRatio> aspectRatioNotifier = ValueNotifier(CropAspectRatio.free); + + TransformActivity _activity = TransformActivity.none; + + TransformActivity get activity => _activity; + + Transformation _transformation = Transformation.zero; + + Transformation get transformation => _transformation; + + bool get modified => _transformation != Transformation.zero; + + final StreamController<Transformation> _transformationStreamController = StreamController.broadcast(); + + Stream<Transformation> get transformationStream => _transformationStreamController.stream; + + final StreamController<TransformActivity> _activityStreamController = StreamController.broadcast(); + + Stream<TransformActivity> get activityStream => _activityStreamController.stream; + + static const double straightenDegreesMin = -45; + static const double straightenDegreesMax = 45; + + final Size displaySize; + + TransformController(this.displaySize) { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$TransformController', + object: this, + ); + } + reset(); + aspectRatioNotifier.addListener(_onAspectRatioChanged); + } + + void dispose() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + aspectRatioNotifier.dispose(); + } + + void reset() { + _transformation = Transformation.zero.copyWith( + region: CropRegion.fromRect(Offset.zero & displaySize), + ); + _transformationStreamController.add(_transformation); + setAspectRatio(CropAspectRatio.free); + } + + void flipHorizontally() { + _transformation = _transformation.copyWith( + orientation: _transformation.orientation.flipHorizontally(), + straightenDegrees: -transformation.straightenDegrees, + ); + _transformationStreamController.add(_transformation); + } + + void rotateClockwise() { + _transformation = _transformation.copyWith( + orientation: _transformation.orientation.rotateClockwise(), + ); + _transformationStreamController.add(_transformation); + } + + set straightenDegrees(double straightenDegrees) { + _transformation = _transformation.copyWith( + straightenDegrees: straightenDegrees.clamp(straightenDegreesMin, straightenDegreesMax), + ); + _transformationStreamController.add(_transformation); + } + + set cropRegion(CropRegion region) { + _transformation = _transformation.copyWith( + region: region, + ); + _transformationStreamController.add(_transformation); + } + + set activity(TransformActivity activity) { + _activity = activity; + _activityStreamController.add(_activity); + } + + void setAspectRatio(CropAspectRatio ratio) => aspectRatioNotifier.value = ratio; + + void _onAspectRatioChanged() { + // TODO TLAD [crop] apply + } +} diff --git a/lib/widgets/editor/transform/crop_region.dart b/lib/widgets/editor/transform/crop_region.dart new file mode 100644 index 0000000..5a4e921 --- /dev/null +++ b/lib/widgets/editor/transform/crop_region.dart @@ -0,0 +1,40 @@ +import 'dart:ui'; + +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class CropRegion extends Equatable { + // region corners in image pixel coordinates + final Offset topLeft, topRight, bottomRight, bottomLeft; + + List<Offset> get corners => [topLeft, topRight, bottomRight, bottomLeft]; + + Offset get center => (topLeft + bottomRight) / 2; + + @override + List<Object?> get props => [topLeft, topRight, bottomRight, bottomLeft]; + + const CropRegion({ + required this.topLeft, + required this.topRight, + required this.bottomRight, + required this.bottomLeft, + }); + + static const zero = CropRegion( + topLeft: Offset.zero, + topRight: Offset.zero, + bottomRight: Offset.zero, + bottomLeft: Offset.zero, + ); + + factory CropRegion.fromRect(Rect rect) { + return CropRegion( + topLeft: rect.topLeft, + topRight: rect.topRight, + bottomRight: rect.bottomRight, + bottomLeft: rect.bottomLeft, + ); + } +} diff --git a/lib/widgets/editor/transform/cropper.dart b/lib/widgets/editor/transform/cropper.dart new file mode 100644 index 0000000..4a0df95 --- /dev/null +++ b/lib/widgets/editor/transform/cropper.dart @@ -0,0 +1,787 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/model/viewer/view_state.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/extensions/geometry.dart'; +import 'package:aves/widgets/common/fx/dashed_path_painter.dart'; +import 'package:aves/widgets/editor/transform/controller.dart'; +import 'package:aves/widgets/editor/transform/crop_region.dart'; +import 'package:aves/widgets/editor/transform/handles.dart'; +import 'package:aves/widgets/editor/transform/painter.dart'; +import 'package:aves/widgets/editor/transform/transformation.dart'; +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class Cropper extends StatefulWidget { + final AvesMagnifierController magnifierController; + final TransformController transformController; + final ValueNotifier<EdgeInsets> marginNotifier; + + static const double handleDimension = kMinInteractiveDimension; + static const EdgeInsets imageMargin = EdgeInsets.all(kMinInteractiveDimension); + + const Cropper({ + super.key, + required this.magnifierController, + required this.transformController, + required this.marginNotifier, + }); + + @override + State<Cropper> createState() => _CropperState(); +} + +class _CropperState extends State<Cropper> with SingleTickerProviderStateMixin { + final Set<StreamSubscription> _subscriptions = {}; + final ValueNotifier<Rect> _outlineNotifier = ValueNotifier(Rect.zero); + final ValueNotifier<int> _gridDivisionNotifier = ValueNotifier(0); + late AnimationController _gridAnimationController; + late CurvedAnimation _gridOpacity; + + static const double minDimension = Cropper.handleDimension; + static const int panResizeGridDivision = 3; + static const int straightenGridDivision = 9; + static const double overOutlineFactor = .25; + + AvesMagnifierController get magnifierController => widget.magnifierController; + + TransformController get transformController => widget.transformController; + + Transformation get transformation => transformController.transformation; + + CropAspectRatio get cropAspectRatio => transformController.aspectRatioNotifier.value; + + @override + void initState() { + super.initState(); + _gridAnimationController = AnimationController( + duration: context.read<DurationsData>().viewerOverlayAnimation, + vsync: this, + ); + _gridOpacity = CurvedAnimation( + parent: _gridAnimationController, + curve: Curves.easeOutQuad, + ); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant Cropper oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _outlineNotifier.dispose(); + _gridDivisionNotifier.dispose(); + _gridOpacity.dispose(); + _gridAnimationController.dispose(); + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(Cropper widget) { + _subscriptions.add(widget.magnifierController.stateStream.listen(_onViewStateChanged)); + _subscriptions.add(widget.magnifierController.scaleBoundariesStream.map((v) => v.viewportSize).distinct().listen(_onViewportSizeChanged)); + _subscriptions.add(widget.transformController.activityStream.listen(_onTransformActivity)); + _subscriptions.add(widget.transformController.transformationStream.map((v) => v.orientation).distinct().listen(_onOrientationChanged)); + _subscriptions.add(widget.transformController.transformationStream.map((v) => v.straightenDegrees).distinct().listen(_onStraightenDegreesChanged)); + widget.transformController.aspectRatioNotifier.addListener(_onCropAspectRatioChanged); + } + + void _unregisterWidget(Cropper widget) { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + widget.transformController.aspectRatioNotifier.removeListener(_onCropAspectRatioChanged); + } + + @override + Widget build(BuildContext context) { + return Positioned.fill( + child: ValueListenableBuilder<EdgeInsets>( + valueListenable: widget.marginNotifier, + builder: (context, margin, child) { + return ValueListenableBuilder<Rect>( + valueListenable: _outlineNotifier, + builder: (context, outline, child) { + if (outline.isEmpty) return const SizedBox(); + + final outlineVisualRect = outline.translate(margin.left, margin.top); + return Stack( + children: [ + Positioned.fill( + child: IgnorePointer( + child: Stack( + children: [ + _buildDashLine([outlineVisualRect.topLeft, outlineVisualRect.topRight]), + _buildDashLine([outlineVisualRect.bottomLeft, outlineVisualRect.bottomRight]), + _buildDashLine([outlineVisualRect.topLeft, outlineVisualRect.bottomLeft]), + _buildDashLine([outlineVisualRect.topRight, outlineVisualRect.bottomRight]), + Positioned.fill( + child: ValueListenableBuilder<int>( + valueListenable: _gridDivisionNotifier, + builder: (context, gridDivision, child) { + return ValueListenableBuilder<double>( + valueListenable: _gridOpacity, + builder: (context, gridOpacity, child) { + return CustomPaint( + painter: CropperPainter( + rect: outlineVisualRect, + gridOpacity: gridOpacity, + gridDivision: gridDivision, + ), + ); + }, + ); + }, + ), + ), + ], + ), + ), + ), + _buildVertexHandle( + margin: margin, + getPosition: () => outline.topLeft, + setPosition: (v) => _handleOutline( + left: min(outline.right - minDimension, v.dx), + top: min(outline.bottom - minDimension, v.dy), + ), + ), + _buildVertexHandle( + margin: margin, + getPosition: () => outline.topRight, + setPosition: (v) => _handleOutline( + right: max(outline.left + minDimension, v.dx), + top: min(outline.bottom - minDimension, v.dy), + ), + ), + _buildVertexHandle( + margin: margin, + getPosition: () => outline.bottomRight, + setPosition: (v) => _handleOutline( + right: max(outline.left + minDimension, v.dx), + bottom: max(outline.top + minDimension, v.dy), + ), + ), + _buildVertexHandle( + margin: margin, + getPosition: () => outline.bottomLeft, + setPosition: (v) => _handleOutline( + left: min(outline.right - minDimension, v.dx), + bottom: max(outline.top + minDimension, v.dy), + ), + ), + _buildEdgeHandle( + margin: margin, + getEdge: () => Rect.fromPoints(outline.bottomLeft, outline.topLeft), + setEdge: (v) => _handleOutline( + left: min(outline.right - minDimension, v.left), + ), + ), + _buildEdgeHandle( + margin: margin, + getEdge: () => Rect.fromPoints(outline.topLeft, outline.topRight), + setEdge: (v) => _handleOutline( + top: min(outline.bottom - minDimension, v.top), + ), + ), + _buildEdgeHandle( + margin: margin, + getEdge: () => Rect.fromPoints(outline.bottomRight, outline.topRight), + setEdge: (v) => _handleOutline( + right: max(outline.left + minDimension, v.right), + ), + ), + _buildEdgeHandle( + margin: margin, + getEdge: () => Rect.fromPoints(outline.bottomLeft, outline.bottomRight), + setEdge: (v) => _handleOutline( + bottom: max(outline.top + minDimension, v.bottom), + ), + ), + ], + ); + }, + ); + }, + ), + ); + } + + // use 1 painter per line so that the dashes of one line + // do not get offset depending on the previous line length + Widget _buildDashLine(List<Offset> points) => CustomPaint( + painter: DashedPathPainter( + originalPath: Path()..addPolygon(points, false), + pathColor: CropperPainter.borderColor, + strokeWidth: CropperPainter.borderWidth, + ), + ); + + void _handleOutline({ + double? left, + double? top, + double? right, + double? bottom, + }) { + final currentOutline = _outlineNotifier.value; + var targetOutline = Rect.fromLTRB( + left ?? currentOutline.left, + top ?? currentOutline.top, + right ?? currentOutline.right, + bottom ?? currentOutline.bottom, + ); + + _RatioStrategy? ratioStrategy; + if (left != null && top != null && right != null) { + ratioStrategy = _RatioStrategy.pinBottom; + } else if (top != null && right != null && bottom != null) { + ratioStrategy = _RatioStrategy.pinLeft; + } else if (left != null && right != null && bottom != null) { + ratioStrategy = _RatioStrategy.pinTop; + } else if (left != null && top != null && bottom != null) { + ratioStrategy = _RatioStrategy.pinRight; + } else if (left != null && top != null) { + ratioStrategy = _RatioStrategy.pinBottomRight; + } else if (left != null) { + ratioStrategy = _RatioStrategy.pinTopRight; + } else if (top != null) { + ratioStrategy = _RatioStrategy.pinBottomLeft; + } else if (right != null) { + ratioStrategy = _RatioStrategy.pinTopLeft; + } else if (bottom != null) { + ratioStrategy = _RatioStrategy.pinTopLeft; + } + if (ratioStrategy != null) { + targetOutline = _applyCropRatioToOutline(targetOutline, ratioStrategy); + } + + // do not try to coerce outline handled outside tilted image + if (transformation.straightenDegrees != 0 && !_isOutlineContained(targetOutline)) return; + + // dismiss if we could not honour aspect ratio + if (cropAspectRatio != CropAspectRatio.free && !_isOutlineContained(targetOutline)) return; + + final currentState = _getViewState(); + final boundaries = magnifierController.scaleBoundaries; + if (currentState == null || boundaries == null) return; + + final gestureRegion = _regionFromOutline(currentState, targetOutline); + final viewportSize = boundaries.viewportSize; + + final gestureOutline = _containedOutlineFromRegion(currentState, gestureRegion); + final clampedOutline = Rect.fromLTRB( + max(gestureOutline.left, 0), + max(gestureOutline.top, 0), + min(gestureOutline.right, viewportSize.width), + min(gestureOutline.bottom, viewportSize.height), + ); + var nextOutline = clampedOutline; + + if (max(gestureOutline.width - clampedOutline.width, gestureOutline.height - clampedOutline.height) > precisionErrorTolerance) { + // zoom out when user gesture reaches outer edges + final targetOutline = Rect.lerp(clampedOutline, gestureOutline, overOutlineFactor)!; + final targetRegion = _regionFromOutline(currentState, targetOutline); + + final nextState = _viewStateForContainedRegion(boundaries, targetRegion); + if (nextState != currentState) { + magnifierController.update( + position: nextState.position, + scale: nextState.scale, + source: ChangeSource.animation, + ); + nextOutline = _containedOutlineFromRegion(nextState, targetRegion); + } + } + + _setOutline(nextOutline); + } + + bool _isOutlineContained(Rect outline) { + final currentState = _getViewState(); + final boundaries = magnifierController.scaleBoundaries; + if (currentState == null || boundaries == null) return false; + + final regionToOutlineMatrix = _getRegionToOutlineMatrix(currentState); + final outlineToRegionMatrix = Matrix4.inverted(regionToOutlineMatrix); + final regionCorners = { + outline.topLeft, + outline.topRight, + outline.bottomRight, + outline.bottomLeft, + }.map(outlineToRegionMatrix.transformOffset).toSet(); + + final contentRect = Offset.zero & boundaries.contentSize; + return regionCorners.every((v) => contentRect.containsIncludingBottomRight(v, tolerance: precisionErrorTolerance)); + } + + VertexHandle _buildVertexHandle({ + required EdgeInsets margin, + required ValueGetter<Offset> getPosition, + required ValueSetter<Offset> setPosition, + }) { + return VertexHandle( + margin: margin, + getPosition: getPosition, + setPosition: setPosition, + onDragStart: _onResizeStart, + onDragEnd: _onResizeEnd, + ); + } + + EdgeHandle _buildEdgeHandle({ + required EdgeInsets margin, + required ValueGetter<Rect> getEdge, + required ValueSetter<Rect> setEdge, + }) { + return EdgeHandle( + margin: margin, + getEdge: getEdge, + setEdge: setEdge, + onDragStart: _onResizeStart, + onDragEnd: _onResizeEnd, + ); + } + + void _onResizeStart() { + transformController.activity = TransformActivity.resize; + } + + void _onResizeEnd() { + transformController.activity = TransformActivity.none; + _showRegion(); + } + + void _showRegion() { + final boundaries = magnifierController.scaleBoundaries; + if (boundaries == null) return; + + final region = transformation.region; + final nextState = _viewStateForContainedRegion(boundaries, region); + + magnifierController.update( + position: nextState.position, + scale: nextState.scale, + source: ChangeSource.animation, + ); + _setOutline(_containedOutlineFromRegion(nextState, region)); + } + + ViewState _viewStateForContainedRegion(ScaleBoundaries boundaries, CropRegion imageRegion) { + final matrix = transformation.matrix; + final displayRegion = imageRegion.corners.map(matrix.transformOffset).toSet(); + final xMin = displayRegion.map((v) => v.dx).min; + final xMax = displayRegion.map((v) => v.dx).max; + final yMin = displayRegion.map((v) => v.dy).min; + final yMax = displayRegion.map((v) => v.dy).max; + final displayRegionSize = Size(xMax - xMin, yMax - yMin); + + final nextScale = boundaries.clampScale(ScaleLevel.scaleForContained(boundaries.viewportSize, displayRegionSize)); + final nextPosition = boundaries.clampPosition( + position: boundaries.contentToStatePosition(nextScale, imageRegion.center), + scale: nextScale, + ); + return ViewState( + position: nextPosition, + scale: nextScale, + viewportSize: boundaries.viewportSize, + contentSize: boundaries.contentSize, + ); + } + + void _onTransformActivity(TransformActivity activity) { + switch (activity) { + case TransformActivity.none: + _showRegion(); + case TransformActivity.pan: + case TransformActivity.resize: + _gridDivisionNotifier.value = panResizeGridDivision; + case TransformActivity.straighten: + _gridDivisionNotifier.value = straightenGridDivision; + } + if (activity == TransformActivity.none) { + _gridAnimationController.reverse(); + } else { + _gridAnimationController.forward(); + } + } + + void _onOrientationChanged(TransformOrientation orientation) { + _showRegion(); + } + + void _onStraightenDegreesChanged(double degrees) { + _updateCropRegion(); + } + + void _onCropAspectRatioChanged() { + final viewState = _getViewState(); + if (viewState == null) return; + + var targetOutline = _applyCropRatioToOutline(_outlineNotifier.value, _RatioStrategy.keepArea); + if (!_isOutlineContained(targetOutline)) { + targetOutline = _applyCropRatioToOutline(_outlineNotifier.value, _RatioStrategy.contain); + } + transformController.cropRegion = _regionFromOutline(viewState, targetOutline); + _showRegion(); + } + + void _onViewStateChanged(MagnifierState state) { + switch (transformController.activity) { + case TransformActivity.none: + break; + case TransformActivity.straighten: + case TransformActivity.pan: + final currentOutline = _outlineNotifier.value; + _setOutline(_applyCropRatioToOutline(currentOutline, _RatioStrategy.contain)); + case TransformActivity.resize: + break; + } + } + + void _onViewportSizeChanged(Size viewportSize) { + final boundaries = magnifierController.scaleBoundaries; + if (boundaries != null) { + magnifierController.setScaleBoundaries( + boundaries.copyWith( + padding: _getBoundariesPadding, + ), + ); + } + _showRegion(); + } + + EdgeInsets _getBoundariesPadding(double scale) { + // TODO TLAD handle orientation + if (transformation.orientation != TransformOrientation.normal) { + return const EdgeInsets.all(double.infinity); + } + // TODO TLAD handle straightening + if (transformation.straightenDegrees != 0) { + return const EdgeInsets.all(double.infinity); + } + + final viewState = _getViewState(); + if (viewState != null) { + final viewportSize = viewState.viewportSize; + final contentSize = viewState.contentSize; + if (viewportSize != null && contentSize != null) { + final fullRegion = CropRegion.fromRect(Offset.zero & contentSize); + final fullOutline = _containingOutlineFromRegion(viewState, fullRegion); + final cropOutline = _outlineNotifier.value; + + final paddingWidth = max(0.0, (min(fullOutline.width, viewportSize.width) - cropOutline.width) / 2); + final paddingHeight = max(0.0, (min(fullOutline.height, viewportSize.height) - cropOutline.height) / 2); + return EdgeInsets.symmetric(vertical: paddingHeight, horizontal: paddingWidth); + } + } + + return EdgeInsets.zero; + } + + ViewState? _getViewState() { + final scaleBoundaries = magnifierController.scaleBoundaries; + if (scaleBoundaries == null) return null; + + final state = magnifierController.currentState; + return ViewState( + position: state.position, + scale: state.scale, + viewportSize: scaleBoundaries.viewportSize, + contentSize: scaleBoundaries.contentSize, + ); + } + + void _setOutline(Rect targetOutline) { + final viewState = _getViewState(); + final viewportSize = viewState?.viewportSize; + if (targetOutline.isEmpty || viewState == null || viewportSize == null) return; + + // ensure outline is within content + var targetRegion = _regionFromOutline(viewState, targetOutline); + var newOutline = _containedOutlineFromRegion(viewState, targetRegion); + final outlineWidthDelta = targetOutline.width - newOutline.width; + final outlineHeightDelta = targetOutline.height - newOutline.height; + if (outlineWidthDelta > precisionErrorTolerance || outlineHeightDelta > precisionErrorTolerance) { + // keep outline area if possible, otherwise trim + final regionToOutlineMatrix = _getRegionToOutlineMatrix(viewState); + final rect = Offset.zero & viewState.contentSize!; + final edgeRegionCorners = targetRegion.corners.where((v) => v.dx == rect.left || v.dx == rect.right || v.dy == rect.top || v.dy == rect.bottom).toSet(); + final edgeOutlineCorners = edgeRegionCorners.map(regionToOutlineMatrix.transformOffset).toSet(); + if (edgeOutlineCorners.isNotEmpty) { + final direction = edgeOutlineCorners.map((v) => newOutline.center - v).reduce((prev, v) => prev + v); + final movedOutline = targetOutline.shift( + Offset( + outlineWidthDelta * direction.dx.sign, + outlineHeightDelta * direction.dy.sign, + ), + ); + targetRegion = _regionFromOutline(viewState, movedOutline); + newOutline = _containedOutlineFromRegion(viewState, targetRegion); + } + } + + // ensure outline is large enough to be handled + newOutline = Rect.fromLTWH( + newOutline.left, + newOutline.top, + max(newOutline.width, minDimension), + max(newOutline.height, minDimension), + ); + + _outlineNotifier.value = newOutline; + switch (transformController.activity) { + case TransformActivity.pan: + case TransformActivity.resize: + _updateCropRegion(); + break; + case TransformActivity.none: + case TransformActivity.straighten: + break; + } + } + + void _updateCropRegion() { + final viewState = _getViewState(); + final outline = _outlineNotifier.value; + if (viewState != null && !outline.isEmpty) { + transformController.cropRegion = _regionFromOutline(viewState, outline); + } + } + + Matrix4 _getRegionToOutlineMatrix(ViewState viewState) { + final magnifierMatrix = viewState.matrix; + + final viewportCenter = viewState.viewportSize!.center(Offset.zero); + final transformOrigin = Matrix4.inverted(magnifierMatrix).transformOffset(viewportCenter); + final transformMatrix = Matrix4.identity() + ..translateByDouble(transformOrigin.dx, transformOrigin.dy, 0, 1) + ..multiply(transformation.matrix) + ..translateByDouble(-transformOrigin.dx, -transformOrigin.dy, 0, 1); + + return magnifierMatrix..multiply(transformMatrix); + } + + CropRegion _regionFromOutline(ViewState viewState, Rect outline) { + final regionToOutlineMatrix = _getRegionToOutlineMatrix(viewState); + final outlineToRegionMatrix = regionToOutlineMatrix..invert(); + + final rect = Offset.zero & viewState.contentSize!; + double clampX(double dx) => dx.clamp(rect.left, rect.right); + double clampY(double dy) => dy.clamp(rect.top, rect.bottom); + Offset clampPoint(Offset v) => Offset(clampX(v.dx), clampY(v.dy)); + Offset transform(Offset v) => clampPoint(outlineToRegionMatrix.transformOffset(v)); + final clampedRegion = CropRegion( + topLeft: transform(outline.topLeft), + topRight: transform(outline.topRight), + bottomRight: transform(outline.bottomRight), + bottomLeft: transform(outline.bottomLeft), + ); + return clampedRegion; + } + + Rect _containingOutlineFromRegion(ViewState viewState, CropRegion region) { + final regionToOutlineMatrix = _getRegionToOutlineMatrix(viewState); + final points = region.corners.map(regionToOutlineMatrix.transformOffset).toList(); + final dxSet = points.map((v) => v.dx).toSet(); + final dySet = points.map((v) => v.dy).toSet(); + final topLeft = Offset(dxSet.reduce(min), dySet.reduce(min)); + final bottomRight = Offset(dxSet.reduce(max), dySet.reduce(max)); + return Rect.fromPoints(topLeft, bottomRight); + } + + Rect _containedOutlineFromRegion(ViewState viewState, CropRegion region) { + final regionToOutlineMatrix = _getRegionToOutlineMatrix(viewState); + final points = region.corners.map(regionToOutlineMatrix.transformOffset).toList(); + final sortedX = points.map((v) => v.dx).toList()..sort(); + final sortedY = points.map((v) => v.dy).toList()..sort(); + final topLeft = Offset(sortedX[1], sortedY[1]); + final bottomRight = Offset(sortedX[2], sortedY[2]); + return Rect.fromPoints(topLeft, bottomRight); + } + + Rect _applyCropRatioToOutline(Rect outline, _RatioStrategy strategy) { + final currentState = _getViewState(); + final boundaries = magnifierController.scaleBoundaries; + if (currentState == null || boundaries == null) return outline; + + final contentSize = boundaries.contentSize; + + late int longCoef; + late int shortCoef; + switch (cropAspectRatio) { + case CropAspectRatio.free: + return outline; + case CropAspectRatio.original: + longCoef = contentSize.longestSide.round(); + shortCoef = contentSize.shortestSide.round(); + case CropAspectRatio.square: + longCoef = 1; + shortCoef = 1; + case CropAspectRatio.ar_16_9: + longCoef = 16; + shortCoef = 9; + case CropAspectRatio.ar_4_3: + longCoef = 4; + shortCoef = 3; + } + + final contentRect = Offset.zero & contentSize; + final isLandscape = (outline.width - outline.height).abs() > precisionErrorTolerance ? outline.width > outline.height : contentSize.width > contentSize.height; + final newRatio = isLandscape ? longCoef / shortCoef : shortCoef / longCoef; + + Size sizeToKeepArea() { + final f = (outline.longestSide + outline.shortestSide) / (longCoef + shortCoef); + final newLongest = f * longCoef; + final newShortest = f * shortCoef; + return isLandscape ? Size(newLongest, newShortest) : Size(newShortest, newLongest); + } + + final regionToOutlineMatrix = _getRegionToOutlineMatrix(currentState); + final outlineToRegionMatrix = Matrix4.inverted(regionToOutlineMatrix); + + Rect pinnedRect(Rect Function(Size targetSize) forSize) { + final targetSize = sizeToKeepArea(); + final rect = forSize(targetSize); + + // do not try to coerce outline handled outside tilted image + if (transformation.straightenDegrees != 0) return rect; + + final regionCorners = { + rect.topLeft, + rect.topRight, + rect.bottomRight, + rect.bottomLeft, + }.map(outlineToRegionMatrix.transformOffset).toSet(); + + if (regionCorners.every((v) => contentRect.containsIncludingBottomRight(v, tolerance: precisionErrorTolerance))) return rect; + + final clampedOutlineCorners = regionCorners.map((v) => regionToOutlineMatrix.transformOffset(Offset(v.dx.clamp(0, contentSize.width), v.dy.clamp(0, contentSize.height)))).toSet(); + final minX = clampedOutlineCorners.map((v) => v.dx).min; + final maxX = clampedOutlineCorners.map((v) => v.dx).max; + final minY = clampedOutlineCorners.map((v) => v.dy).min; + final maxY = clampedOutlineCorners.map((v) => v.dy).max; + + var width = rect.width; + var height = rect.height; + if (rect.left < minX - precisionErrorTolerance) { + width = rect.right - minX; + height = width / newRatio; + } else if (rect.top < minY - precisionErrorTolerance) { + height = rect.bottom - minY; + width = height * newRatio; + } else if (rect.right > maxX + precisionErrorTolerance) { + width = maxX - rect.left; + height = width / newRatio; + } else if (rect.bottom > maxY + precisionErrorTolerance) { + height = maxY - rect.top; + width = height * newRatio; + } + final clampedSize = Size(width, height); + return clampedSize < targetSize ? forSize(clampedSize) : rect; + } + + switch (strategy) { + case _RatioStrategy.keepArea: + final targetSize = sizeToKeepArea(); + return Rect.fromCenter( + center: outline.center, + width: targetSize.width, + height: targetSize.height, + ); + case _RatioStrategy.contain: + final currentRatio = outline.width / outline.height; + if ((newRatio - currentRatio).abs() < precisionErrorTolerance) { + return outline; + } else { + late final Size targetSize; + if (newRatio > currentRatio) { + targetSize = Size(outline.width, outline.width / newRatio); + } else { + targetSize = Size(outline.height * newRatio, outline.height); + } + return Rect.fromCenter( + center: outline.center, + width: targetSize.width, + height: targetSize.height, + ); + } + case _RatioStrategy.pinTopLeft: + return pinnedRect( + (targetSize) => Rect.fromPoints( + outline.topLeft, + outline.topLeft.translate(targetSize.width, targetSize.height), + ), + ); + case _RatioStrategy.pinTopRight: + return pinnedRect( + (targetSize) => Rect.fromPoints( + outline.topRight, + outline.topRight.translate(-targetSize.width, targetSize.height), + ), + ); + case _RatioStrategy.pinBottomRight: + return pinnedRect( + (targetSize) => Rect.fromPoints( + outline.bottomRight, + outline.bottomRight.translate(-targetSize.width, -targetSize.height), + ), + ); + case _RatioStrategy.pinBottomLeft: + return pinnedRect( + (targetSize) => Rect.fromPoints( + outline.bottomLeft, + outline.bottomLeft.translate(targetSize.width, -targetSize.height), + ), + ); + case _RatioStrategy.pinLeft: + return pinnedRect( + (targetSize) => Rect.fromLTRB( + outline.left, + outline.center.dy - targetSize.height / 2, + outline.left + targetSize.width, + outline.center.dy + targetSize.height / 2, + ), + ); + case _RatioStrategy.pinTop: + return pinnedRect( + (targetSize) => Rect.fromLTRB( + outline.center.dx - targetSize.width / 2, + outline.top, + outline.center.dx + targetSize.width / 2, + outline.top + targetSize.height, + ), + ); + case _RatioStrategy.pinRight: + return pinnedRect( + (targetSize) => Rect.fromLTRB( + outline.right - targetSize.width, + outline.center.dy - targetSize.height / 2, + outline.right, + outline.center.dy + targetSize.height / 2, + ), + ); + case _RatioStrategy.pinBottom: + return pinnedRect( + (targetSize) => Rect.fromLTRB( + outline.center.dx - targetSize.width / 2, + outline.bottom - targetSize.height, + outline.center.dx + targetSize.width / 2, + outline.bottom, + ), + ); + } + } +} + +enum _RatioStrategy { keepArea, contain, pinTopLeft, pinTopRight, pinBottomRight, pinBottomLeft, pinLeft, pinTop, pinRight, pinBottom } diff --git a/lib/widgets/editor/transform/handles.dart b/lib/widgets/editor/transform/handles.dart new file mode 100644 index 0000000..50884c4 --- /dev/null +++ b/lib/widgets/editor/transform/handles.dart @@ -0,0 +1,120 @@ +import 'package:aves/widgets/editor/transform/cropper.dart'; +import 'package:flutter/material.dart'; + +class VertexHandle extends StatefulWidget { + final EdgeInsets margin; + final ValueGetter<Offset> getPosition; + final ValueSetter<Offset> setPosition; + final VoidCallback onDragStart, onDragEnd; + + const VertexHandle({ + super.key, + required this.margin, + required this.getPosition, + required this.setPosition, + required this.onDragStart, + required this.onDragEnd, + }); + + @override + State<VertexHandle> createState() => _VertexHandleState(); +} + +class _VertexHandleState extends State<VertexHandle> { + Offset _start = Offset.zero; + Offset _totalDelta = Offset.zero; + + static const double _handleDim = Cropper.handleDimension; + + EdgeInsets get margin => widget.margin; + + @override + Widget build(BuildContext context) { + return Positioned.fromRect( + rect: Rect.fromCenter( + center: widget.getPosition().translate(margin.left, margin.right), + width: _handleDim, + height: _handleDim, + ), + child: GestureDetector( + onPanStart: (details) { + _totalDelta = Offset.zero; + _start = widget.getPosition(); + widget.onDragStart(); + }, + onPanUpdate: (details) { + _totalDelta += details.delta; + widget.setPosition(_start + _totalDelta); + }, + onPanEnd: (details) { + widget.onDragEnd(); + }, + child: const ColoredBox( + color: Colors.transparent, + ), + ), + ); + } +} + +class EdgeHandle extends StatefulWidget { + final EdgeInsets margin; + final ValueGetter<Rect> getEdge; + final ValueSetter<Rect> setEdge; + final VoidCallback onDragStart, onDragEnd; + + const EdgeHandle({ + super.key, + required this.margin, + required this.getEdge, + required this.setEdge, + required this.onDragStart, + required this.onDragEnd, + }); + + @override + State<EdgeHandle> createState() => _EdgeHandleState(); +} + +class _EdgeHandleState extends State<EdgeHandle> { + Rect _start = Rect.zero; + Offset _totalDelta = Offset.zero; + + static const double _handleDim = Cropper.handleDimension; + + EdgeInsets get margin => widget.margin; + + @override + Widget build(BuildContext context) { + var edge = widget.getEdge(); + if (edge.width > _handleDim && edge.height == 0) { + // horizontal edge + edge = Rect.fromLTWH(edge.left + _handleDim / 2, edge.top - _handleDim / 2, edge.width - _handleDim, _handleDim); + } else if (edge.height > _handleDim && edge.width == 0) { + // vertical edge + edge = Rect.fromLTWH(edge.left - _handleDim / 2, edge.top + _handleDim / 2, _handleDim, edge.height - _handleDim); + } + edge = edge.translate(margin.left, margin.right); + + return Positioned.fromRect( + rect: edge, + child: GestureDetector( + onPanStart: (details) { + _totalDelta = Offset.zero; + _start = widget.getEdge(); + widget.onDragStart(); + }, + onPanUpdate: (details) { + _totalDelta += details.delta; + widget.setEdge(Rect.fromLTWH(_start.left + _totalDelta.dx, _start.top + _totalDelta.dy, _start.width, _start.height)); + }, + onPanEnd: (details) { + widget.onDragEnd(); + }, + child: const ColoredBox( + color: Colors.transparent, + ), + ), + ); + } +} diff --git a/lib/widgets/editor/transform/painter.dart b/lib/widgets/editor/transform/painter.dart new file mode 100644 index 0000000..6b859c6 --- /dev/null +++ b/lib/widgets/editor/transform/painter.dart @@ -0,0 +1,119 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +class CropperPainter extends CustomPainter { + final Rect rect; + final double gridOpacity; + final int gridDivision; + + const CropperPainter({ + required this.rect, + required this.gridOpacity, + required this.gridDivision, + }); + + static const double handleLength = kMinInteractiveDimension / 3 - 4; + static const double handleWidth = 3; + static const double borderWidth = 1; + static const double gridWidth = 1; + + static const cornerColor = Colors.white; + static final borderColor = Colors.white.withValues(alpha: .5); + static final gridColor = Colors.white.withValues(alpha: .5); + + @override + void paint(Canvas canvas, Size size) { + final cornerPaint = Paint() + ..style = PaintingStyle.fill + ..strokeCap = StrokeCap.round + ..strokeWidth = handleWidth + ..color = cornerColor; + final gridPaint = Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = gridWidth + ..color = gridColor.withValues(alpha: gridColor.a * gridOpacity); + + final xLeft = rect.left; + final yTop = rect.top; + final xRight = rect.right; + final yBottom = rect.bottom; + + final gridLeft = xLeft + borderWidth / 2; + final gridRight = xRight - borderWidth / 2; + final yStep = (yBottom - yTop) / gridDivision; + for (var i = 1; i < gridDivision; i++) { + canvas.drawLine( + Offset(gridLeft, yTop + i * yStep), + Offset(gridRight, yTop + i * yStep), + gridPaint, + ); + } + final gridTop = yTop + borderWidth / 2; + final gridBottom = yBottom - borderWidth / 2; + final xStep = (xRight - xLeft) / gridDivision; + for (var i = 1; i < gridDivision; i++) { + canvas.drawLine( + Offset(xLeft + i * xStep, gridTop), + Offset(xLeft + i * xStep, gridBottom), + gridPaint, + ); + } + + canvas.drawPoints(PointMode.polygon, [ + rect.topLeft.translate(0, handleLength), + rect.topLeft, + rect.topLeft.translate(handleLength, 0), + ], cornerPaint); + + canvas.drawPoints(PointMode.polygon, [ + rect.topRight.translate(-handleLength, 0), + rect.topRight, + rect.topRight.translate(0, handleLength), + ], cornerPaint); + + canvas.drawPoints(PointMode.polygon, [ + rect.bottomRight.translate(0, -handleLength), + rect.bottomRight, + rect.bottomRight.translate(-handleLength, 0), + ], cornerPaint); + + canvas.drawPoints(PointMode.polygon, [ + rect.bottomLeft.translate(handleLength, 0), + rect.bottomLeft, + rect.bottomLeft.translate(0, -handleLength), + ], cornerPaint); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => true; +} + +class ScrimPainter extends CustomPainter { + final Path excludePath; + final double opacity; + + const ScrimPainter({ + required this.excludePath, + required this.opacity, + }); + + static const double borderWidth = 1; + + static const scrimColor = Colors.black; + + @override + void paint(Canvas canvas, Size size) { + final scrimPaint = Paint() + ..style = PaintingStyle.fill + ..color = scrimColor.withValues(alpha: opacity); + + final outside = Path() + ..addRect(Rect.fromLTWH(0, 0, size.width, size.height).inflate(.5)) + ..close(); + canvas.drawPath(Path.combine(PathOperation.difference, outside, excludePath), scrimPaint); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => true; +} diff --git a/lib/widgets/editor/transform/transformation.dart b/lib/widgets/editor/transform/transformation.dart new file mode 100644 index 0000000..6e0ebfa --- /dev/null +++ b/lib/widgets/editor/transform/transformation.dart @@ -0,0 +1,71 @@ +import 'dart:math' as math; + +import 'package:aves/widgets/editor/transform/crop_region.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:vector_math/vector_math_64.dart'; + +@immutable +class Transformation extends Equatable { + final TransformOrientation orientation; + final double straightenDegrees; + final CropRegion region; + + @override + List<Object?> get props => [orientation, straightenDegrees, region]; + + static const zero = Transformation( + orientation: TransformOrientation.normal, + straightenDegrees: 0, + region: CropRegion.zero, + ); + + const Transformation({ + required this.orientation, + required this.straightenDegrees, + required this.region, + }); + + Transformation copyWith({ + TransformOrientation? orientation, + double? straightenDegrees, + CropRegion? region, + }) { + return Transformation( + orientation: orientation ?? this.orientation, + straightenDegrees: straightenDegrees ?? this.straightenDegrees, + region: region ?? this.region, + ); + } + + Matrix4 get matrix => _orientationMatrix..multiply(_straightenMatrix); + + Matrix4 get _orientationMatrix { + final matrix = Matrix4.identity(); + switch (orientation) { + case TransformOrientation.normal: + break; + case TransformOrientation.rotate90: + matrix.rotateZ(math.pi / 2); + case TransformOrientation.rotate180: + matrix.rotateZ(math.pi); + case TransformOrientation.rotate270: + matrix.rotateZ(3 * math.pi / 2); + case TransformOrientation.transverse: + matrix.scaleByDouble(-1.0, 1.0, 1.0, 1.0); + matrix.rotateZ(-3 * math.pi / 2); + case TransformOrientation.flipVertical: + matrix.scaleByDouble(1.0, -1.0, 1.0, 1.0); + case TransformOrientation.transpose: + matrix.scaleByDouble(-1.0, 1.0, 1.0, 1.0); + matrix.rotateZ(-1 * math.pi / 2); + case TransformOrientation.flipHorizontal: + matrix.scaleByDouble(-1.0, 1.0, 1.0, 1.0); + } + return matrix; + } + + Matrix4 get _straightenMatrix => Matrix4.rotationZ(degToRadian((orientation.isFlipped ? -1 : 1) * straightenDegrees)); +} diff --git a/lib/widgets/explorer/app_bar.dart b/lib/widgets/explorer/app_bar.dart new file mode 100644 index 0000000..c0da008 --- /dev/null +++ b/lib/widgets/explorer/app_bar.dart @@ -0,0 +1,209 @@ +import 'dart:async'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/app_bar/app_bar_subtitle.dart'; +import 'package:aves/widgets/common/app_bar/app_bar_title.dart'; +import 'package:aves/widgets/common/app_bar/crumb_line.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_app_bar.dart'; +import 'package:aves/widgets/common/search/route.dart'; +import 'package:aves/widgets/dialogs/select_storage_dialog.dart'; +import 'package:aves/widgets/explorer/crumb_line.dart'; +import 'package:aves/widgets/explorer/explorer_action_delegate.dart'; +import 'package:aves/widgets/search/collection_search_delegate.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +class ExplorerAppBar extends StatefulWidget { + final ValueNotifier<VolumeRelativeDirectory?> directoryNotifier; + final void Function(VolumeRelativeDirectory? dir) goToDir; + + const ExplorerAppBar({ + super.key, + required this.directoryNotifier, + required this.goToDir, + }); + + @override + State<ExplorerAppBar> createState() => _ExplorerAppBarState(); +} + +class _ExplorerAppBarState extends State<ExplorerAppBar> with WidgetsBindingObserver { + Set<StorageVolume> get _volumes => androidFileUtils.storageVolumes; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addObserver(this); + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AvesAppBar( + contentHeight: appBarContentHeight, + pinned: true, + leading: const DrawerButton(), + title: _buildAppBarTitle(context), + actions: _buildActions, + bottom: LayoutBuilder( + builder: (context, constraints) { + return Container( + padding: CrumbLine.padding, + width: constraints.maxWidth, + height: CrumbLine.getPreferredHeight(MediaQuery.textScalerOf(context)), + child: ValueListenableBuilder<VolumeRelativeDirectory?>( + valueListenable: widget.directoryNotifier, + builder: (context, directory, child) { + return ExplorerCrumbLine( + key: const Key('crumbs'), + directory: directory, + onTap: widget.goToDir, + ); + }, + ), + ); + }, + ), + ); + } + + InteractiveAppBarTitle _buildAppBarTitle(BuildContext context) { + final appMode = context.watch<ValueNotifier<AppMode>>().value; + Widget title = Text( + context.l10n.explorerPageTitle, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ); + if (appMode == AppMode.main) { + title = SourceStateAwareAppBarTitle( + title: title, + source: context.read<CollectionSource>(), + ); + } + return InteractiveAppBarTitle( + onTap: () => _goToSearch(context), + child: title, + ); + } + + List<Widget> _buildActions(BuildContext context, double maxWidth) { + final animations = context.select<Settings, AccessibilityAnimations>((v) => v.accessibilityAnimations); + return [ + IconButton( + icon: const Icon(AIcons.search), + onPressed: () => _goToSearch(context), + tooltip: MaterialLocalizations.of(context).searchFieldLabel, + ), + if (_volumes.length > 1) _buildVolumeSelector(context), + PopupMenuButton<ExplorerAction>( + itemBuilder: (context) { + return [ + ExplorerAction.addShortcut, + ExplorerAction.setHome, + ExplorerAction.hide, + null, + ExplorerAction.stats, + ].map<PopupMenuEntry<ExplorerAction>>((v) { + if (v == null) return const PopupMenuDivider(); + return PopupMenuItem( + value: v, + child: MenuRow(text: v.getText(context), icon: v.getIcon()), + ); + }).toList(); + }, + onSelected: (action) async { + // wait for the popup menu to hide before proceeding with the action + await Future.delayed(animations.popUpAnimationDelay * timeDilation); + final directory = widget.directoryNotifier.value; + if (directory != null) { + ExplorerActionDelegate(directory: directory).onActionSelected(context, action); + } + }, + popUpAnimationStyle: animations.popUpAnimationStyle, + ), + ].map((v) => FontSizeIconTheme(child: v)).toList(); + } + + Widget _buildVolumeSelector(BuildContext context) { + if (_volumes.length == 2) { + return ValueListenableBuilder<VolumeRelativeDirectory?>( + valueListenable: widget.directoryNotifier, + builder: (context, directory, child) { + final currentVolume = directory?.volumePath; + final otherVolume = _volumes.firstWhere((volume) => volume.path != currentVolume); + final icon = otherVolume.isRemovable ? AIcons.storageCard : AIcons.storageMain; + return IconButton( + icon: Icon(icon), + onPressed: () => widget.goToDir(VolumeRelativeDirectory.volume(otherVolume)), + tooltip: otherVolume.getDescription(context), + ); + }, + ); + } else { + return IconButton( + icon: const Icon(AIcons.storageCard), + onPressed: () async { + _volumes.map((v) { + final selected = widget.directoryNotifier.value?.volumePath == v.path; + final icon = v.isRemovable ? AIcons.storageCard : AIcons.storageMain; + return PopupMenuItem( + value: v, + enabled: !selected, + child: MenuRow( + text: v.getDescription(context), + icon: Icon(icon), + ), + ); + }).toList(); + final volumePath = widget.directoryNotifier.value?.volumePath; + final initialVolume = _volumes.firstWhereOrNull((v) => v.path == volumePath); + final volume = await showDialog<StorageVolume?>( + context: context, + builder: (context) => SelectStorageDialog(initialVolume: initialVolume), + routeSettings: const RouteSettings(name: SelectStorageDialog.routeName), + ); + if (volume != null) { + widget.goToDir(VolumeRelativeDirectory.volume(volume)); + } + }, + tooltip: context.l10n.explorerActionSelectStorageVolume, + ); + } + } + + double get appBarContentHeight { + final textScaler = MediaQuery.textScalerOf(context); + return textScaler.scale(kToolbarHeight) + CrumbLine.getPreferredHeight(textScaler); + } + + void _goToSearch(BuildContext context) { + Navigator.maybeOf(context)?.push( + SearchPageRoute( + delegate: CollectionSearchDelegate( + searchFieldLabel: context.l10n.searchCollectionFieldHint, + searchFieldStyle: Themes.searchFieldStyle(context), + source: context.read<CollectionSource>(), + ), + ), + ); + } +} diff --git a/lib/widgets/explorer/crumb_line.dart b/lib/widgets/explorer/crumb_line.dart new file mode 100644 index 0000000..596a626 --- /dev/null +++ b/lib/widgets/explorer/crumb_line.dart @@ -0,0 +1,46 @@ +import 'package:aves/services/common/services.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/app_bar/crumb_line.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +class ExplorerCrumbLine extends StatelessWidget { + final VolumeRelativeDirectory? directory; + final void Function(VolumeRelativeDirectory? combinedPath) onTap; + + const ExplorerCrumbLine({ + super.key, + required this.directory, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return CrumbLine<VolumeRelativeDirectory?>( + split: _split, + combine: _combine, + onTap: onTap, + ); + } + + List<String> _split(BuildContext context) { + final _directory = directory; + if (_directory == null) return []; + return [ + _directory.getVolumeDescription(context), + ...pContext.split(_directory.relativeDir), + ]; + } + + VolumeRelativeDirectory? _combine(BuildContext context, int index) { + final _directory = directory; + if (_directory == null) return null; + + final path = pContext.joinAll([ + _directory.volumePath, + ..._split(context).skip(1).take(index), + ]); + return androidFileUtils.relativeDirectoryFromPath(path); + } +} diff --git a/lib/widgets/explorer/explorer_action_delegate.dart b/lib/widgets/explorer/explorer_action_delegate.dart new file mode 100644 index 0000000..3d8641c --- /dev/null +++ b/lib/widgets/explorer/explorer_action_delegate.dart @@ -0,0 +1,124 @@ +import 'package:aves/app_mode.dart'; +import 'package:aves/model/device.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/path.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/add_shortcut_dialog.dart'; +import 'package:aves/widgets/explorer/explorer_page.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/chip.dart'; +import 'package:aves/widgets/stats/stats_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ExplorerActionDelegate with FeedbackMixin { + final VolumeRelativeDirectory directory; + + ExplorerActionDelegate({required this.directory}); + + bool isVisible( + ExplorerAction action, { + required AppMode appMode, + }) { + final isMain = appMode == AppMode.main; + final useTvLayout = settings.useTvLayout; + switch (action) { + case ExplorerAction.addShortcut: + return isMain && device.canPinShortcut; + case ExplorerAction.setHome: + return isMain && !useTvLayout; + case ExplorerAction.hide: + case ExplorerAction.stats: + return isMain; + } + } + + bool canApply(ExplorerAction action) { + switch (action) { + case ExplorerAction.addShortcut: + case ExplorerAction.setHome: + case ExplorerAction.hide: + case ExplorerAction.stats: + return true; + } + } + + void onActionSelected(BuildContext context, ExplorerAction action) { + reportService.log('$runtimeType handles $action'); + switch (action) { + case ExplorerAction.addShortcut: + _addShortcut(context); + case ExplorerAction.setHome: + _setHome(context); + case ExplorerAction.hide: + _hide(context); + case ExplorerAction.stats: + _goToStats(context); + } + } + + PathFilter _getPathFilter() => PathFilter(directory.dirPath); + + Future<void> _addShortcut(BuildContext context) async { + final filter = _getPathFilter(); + final defaultName = filter.getLabel(context); + final collection = CollectionLens( + source: context.read<CollectionSource>(), + filters: {filter}, + ); + + final result = await showDialog<(AvesEntry?, String)>( + context: context, + builder: (context) => AddShortcutDialog( + defaultName: defaultName, + collection: collection, + ), + routeSettings: const RouteSettings(name: AddShortcutDialog.routeName), + ); + if (result == null) return; + + final (coverEntry, name) = result; + if (name.isEmpty) return; + + await appService.pinToHomeScreen(name, coverEntry, route: ExplorerPage.routeName, path: filter.path); + if (!device.showPinShortcutFeedback) { + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } + } + + void _setHome(BuildContext context) async { + settings.setHome(HomePageSetting.explorer, customExplorerPath: directory.dirPath); + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } + + void _hide(BuildContext context) { + final chipActionDelegate = ChipActionDelegate(); + const action = ChipAction.hide; + final pathFilter = _getPathFilter(); + if (chipActionDelegate.isVisible(action, filter: pathFilter)) { + chipActionDelegate.onActionSelected(context, pathFilter, action); + } + } + + void _goToStats(BuildContext context) { + final collection = CollectionLens( + source: context.read<CollectionSource>(), + filters: {_getPathFilter()}, + ); + + Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: StatsPage.routeName), + builder: (context) => StatsPage( + entries: collection.sortedEntries.toSet(), + source: collection.source, + ), + ), + ); + } +} diff --git a/lib/widgets/explorer/explorer_page.dart b/lib/widgets/explorer/explorer_page.dart new file mode 100644 index 0000000..289faa8 --- /dev/null +++ b/lib/widgets/explorer/explorer_page.dart @@ -0,0 +1,300 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/path.dart'; +import 'package:aves/model/source/album.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/collection/loading.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/behaviour/pop/double_back.dart'; +import 'package:aves/widgets/common/behaviour/pop/scope.dart'; +import 'package:aves/widgets/common/behaviour/pop/tv_navigation.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/explorer/app_bar.dart'; +import 'package:aves/widgets/navigation/drawer/app_drawer.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:provider/provider.dart'; + +class ExplorerPage extends StatefulWidget { + static const routeName = '/explorer'; + + final String? path; + + const ExplorerPage({super.key, this.path}); + + @override + State<ExplorerPage> createState() => _ExplorerPageState(); +} + +class _ExplorerPageState extends State<ExplorerPage> { + final Set<StreamSubscription> _subscriptions = {}; + final ValueNotifier<VolumeRelativeDirectory?> _directory = ValueNotifier(null); + final ValueNotifier<VolumeRelativeDirectory?> _contentsDirectory = ValueNotifier(null); + final ValueNotifier<List<Directory>> _contents = ValueNotifier([]); + + Set<StorageVolume> get _volumes => androidFileUtils.storageVolumes; + + String? _pathOf(VolumeRelativeDirectory? dir) => dir != null ? pContext.join(dir.volumePath, dir.relativeDir) : null; + + @override + void initState() { + super.initState(); + final path = widget.path; + if (path != null && androidFileUtils.getStorageVolume(path) != null) { + _goToPath(path); + } else { + final primaryVolume = _volumes.firstWhereOrNull((v) => v.isPrimary); + if (primaryVolume != null) { + _goToPath(primaryVolume.path); + } + } + _contents.addListener(() => PrimaryScrollController.of(context).jumpTo(0)); + WidgetsBinding.instance.addPostFrameCallback((_) { + final source = context.read<CollectionSource>(); + _subscriptions.add(source.eventBus.on<AlbumsChangedEvent>().listen((event) => _updateContents())); + }); + } + + @override + void dispose() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + _directory.dispose(); + _contents.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder<VolumeRelativeDirectory?>( + valueListenable: _directory, + builder: (context, directory, child) { + final atRoot = directory?.relativeDir.isEmpty ?? true; + final path = _pathOf(directory); + return AvesPopScope( + handlers: [ + APopHandler( + canPop: (context) => atRoot, + onPopBlocked: (context) { + if (path != null) { + _goToPath(pContext.dirname(path)); + } + }, + ), + tvNavigationPopHandler, + doubleBackPopHandler, + ], + child: AvesScaffold( + drawer: AppDrawer(currentExplorerPath: path), + body: GestureAreaProtectorStack( + child: Column( + children: [ + Expanded( + child: ValueListenableBuilder<List<Directory>>( + valueListenable: _contents, + builder: (context, contents, child) { + final durations = context.watch<DurationsData>(); + return CustomScrollView( + // workaround to prevent scrolling the app bar away + // when there is no content and we use `SliverFillRemaining` + physics: contents.isEmpty ? const NeverScrollableScrollPhysics() : null, + slivers: [ + ExplorerAppBar( + key: const Key('appbar'), + directoryNotifier: _directory, + goToDir: _goToDir, + ), + AnimationLimiter( + // animation limiter should not be above the app bar + // so that the crumb line can automatically scroll + key: ValueKey(contents), + child: SliverList.builder( + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( + position: index, + duration: durations.staggeredAnimation, + delay: durations.staggeredAnimationDelay * timeDilation, + child: SlideAnimation( + verticalOffset: 50.0, + child: FadeInAnimation( + child: _buildContentLine(context, contents[index]), + ), + ), + ); + }, + itemCount: contents.length, + ), + ), + contents.isEmpty + ? SliverFillRemaining( + hasScrollBody: false, + child: _buildEmptyContent(), + ) + : const SliverPadding(padding: EdgeInsets.only(bottom: 8)), + ], + ); + }, + ), + ), + const Divider(height: 0), + ValueListenableBuilder<VolumeRelativeDirectory?>( + valueListenable: _contentsDirectory, + builder: (context, contentsDirectory, child) { + final dirPath = _pathOf(contentsDirectory); + return dirPath != null + ? SafeArea( + top: false, + bottom: true, + child: Padding( + padding: const EdgeInsets.all(8), + child: AvesFilterChip( + filter: PathFilter(dirPath), + maxWidth: double.infinity, + onTap: (filter) => _goToCollectionPage(context, filter), + onLongPress: null, + ), + ), + ) + : const SizedBox(); + }, + ), + ], + ), + ), + ), + ); + }, + ); + } + + Widget _buildEmptyContent() { + final source = context.read<CollectionSource>(); + return ValueListenableBuilder<SourceState>( + valueListenable: source.stateNotifier, + builder: (context, sourceState, child) { + if (sourceState == SourceState.loading) { + return LoadingEmptyContent(source: source); + } + + Widget? bottom; + final dirPath = _pathOf(_contentsDirectory.value); + if (dirPath != null) { + final album = _getAlbumPath(source, Directory(dirPath)); + if (album != null) { + bottom = AvesFilterChip( + filter: StoredAlbumFilter(album, source.getStoredAlbumDisplayName(context, album)), + maxWidth: double.infinity, + onTap: (filter) => _goToCollectionPage(context, filter), + onLongPress: null, + ); + } + } + + return EmptyContent( + icon: AIcons.folder, + text: '', + bottom: bottom, + ); + }, + ); + } + + String? _getAlbumPath(CollectionSource source, FileSystemEntity content) { + final contentPath = content.path.toLowerCase(); + return source.rawAlbums.firstWhereOrNull((v) => v.toLowerCase() == contentPath); + } + + Widget _buildContentLine(BuildContext context, FileSystemEntity content) { + final source = context.read<CollectionSource>(); + final album = _getAlbumPath(source, content); + final baseIconTheme = IconTheme.of(context); + + const leadingDim = AvesFilterChip.minChipWidth; + return ListTile( + leading: album != null + ? IconTheme.merge( + data: baseIconTheme, + child: AvesFilterChip( + filter: StoredAlbumFilter(album, source.getStoredAlbumDisplayName(context, album)), + showText: false, + maxWidth: leadingDim, + onTap: (filter) => _goToCollectionPage(context, filter), + onLongPress: null, + ), + ) + : const SizedBox( + width: leadingDim, + height: leadingDim, + child: Icon(AIcons.folder), + ), + title: Text('${Unicode.FSI}${pContext.split(content.path).last}${Unicode.PDI}'), + onTap: () => _goToPath(content.path), + ); + } + + void _goToDir(VolumeRelativeDirectory? dir) { + if (dir != null) { + _directory.value = dir; + _updateContents(); + } + } + + void _goToPath(String path) => _goToDir(androidFileUtils.relativeDirectoryFromPath(path)); + + void _updateContents() { + final directory = _directory.value; + final dirPath = _pathOf(directory); + if (dirPath == null) return; + + final contents = <Directory>[]; + final source = context.read<CollectionSource>(); + final albums = source.rawAlbums.map((v) => v.toLowerCase()).toSet(); + Directory(dirPath).list().listen( + (event) { + final entity = event.absolute; + if (entity is Directory) { + final dirPath = entity.path.toLowerCase(); + if (albums.any((v) => v.startsWith(dirPath))) { + contents.add(entity); + } + } + }, + onDone: () { + _contents.value = contents + ..sort((a, b) { + final nameA = pContext.split(a.path).last; + final nameB = pContext.split(b.path).last; + return compareAsciiUpperCaseNatural(nameA, nameB); + }); + _contentsDirectory.value = directory; + }, + ); + } + + void _goToCollectionPage(BuildContext context, CollectionFilter filter) { + Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) => CollectionPage( + source: context.read<CollectionSource>(), + filters: {filter}, + ), + ), + ); + } +} diff --git a/lib/widgets/filter_grids/albums_page.dart b/lib/widgets/filter_grids/albums_page.dart new file mode 100644 index 0000000..a78a479 --- /dev/null +++ b/lib/widgets/filter_grids/albums_page.dart @@ -0,0 +1,406 @@ +// lib/widgets/filter_grids/albums_page.dart +import 'package:aves/model/app_inventory.dart'; +import 'package:aves/model/covers.dart'; +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/album.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/common/providers/filter_group_provider.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/album_set.dart'; +import 'package:aves/widgets/filter_grids/common/enums.dart'; +import 'package:aves/widgets/filter_grids/common/filter_nav_page.dart'; +import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:aves/remote/remote_origin.dart'; + +class AlbumListPage extends StatelessWidget { + static const routeName = '/albums'; + + final Uri? initialGroup; + + const AlbumListPage({ + super.key, + required this.initialGroup, + }); + + @override + Widget build(BuildContext context) { + return MultiProvider( + providers: [ + ChangeNotifierProvider<FilterGrouping>.value(value: albumGrouping), + FilterGroupProvider(initialValue: initialGroup), + ], + child: Builder( + builder: (context) { + final source = context.read<CollectionSource>(); + + return Selector<Settings, (AlbumChipSectionFactor, ChipSortFactor, bool, Set<CollectionFilter>, Set<CollectionFilter>)>( + selector: (context, s) => ( + s.albumSectionFactor, + s.albumSortFactor, + s.albumSortReverse, + s.hiddenFilters, + s.pinnedFilters, + ), + shouldRebuild: (t1, t2) { + const eq = DeepCollectionEquality(); + return !( + eq.equals(t1.$1, t2.$1) && + eq.equals(t1.$2, t2.$2) && + eq.equals(t1.$3, t2.$3) && + eq.equals(t1.$4, t2.$4) && + eq.equals(t1.$5, t2.$5) + ); + }, + builder: (context, s, child) { + return ValueListenableBuilder<bool>( + valueListenable: appInventory.areAppNamesReadyNotifier, + builder: (context, areAppNamesReady, child) { + return AnimatedBuilder( + animation: Listenable.merge({albumGrouping, dynamicAlbums}), + builder: (context, child) => StreamBuilder( + stream: source.eventBus.on<AlbumsChangedEvent>(), + builder: (context, snapshot) { + final groupUri = context.watch<FilterGroupNotifier>().value; + + final gridItems = getGridItems( + context, + source, + AlbumChipType.values, + groupUri, + ); + + debugPrint( + '[albums_page] build ' + 'gridItems=${gridItems.length} ' + 'folderMap=${source.folderMap.length} ' + 'visibleEntries=${source.visibleEntries.length}', + ); + + return StreamBuilder<Set<CollectionFilter>?>( + stream: covers.packageChangeStream, + builder: (context, snapshot) => FilterNavigationPage<CollectionFilter, AlbumChipSetActionDelegate>( + source: source, + title: context.l10n.albumPageTitle, + sortFactor: settings.albumSortFactor, + showHeaders: settings.albumSectionFactor != AlbumChipSectionFactor.none, + actionDelegate: AlbumChipSetActionDelegate(gridItems), + filterSections: groupToSections( + context, + source, + gridItems, + ), + newFilters: source.getNewAlbumFilters(context), + emptyBuilder: () => EmptyContent( + icon: AIcons.album, + text: context.l10n.albumEmpty, + ), + ), + ); + }, + ), + ); + }, + ); + }, + ); + }, + ), + ); + } + + // Common with picking page. + // FolderMap-only: + // - album list viene solo da source.folderMap + // - UI resta compatibile Aves usando StoredAlbumFilter + static List<FilterGridItem<CollectionFilter>> getGridItems( + BuildContext context, + CollectionSource source, + Iterable<AlbumChipType> albumChipTypes, + Uri? groupUri, + ) { + final groupContent = albumGrouping.getDirectChildren(groupUri); + + Set<T> whereTypeRecursively<T>(Set<CollectionFilter> filters) { + return { + ...filters.whereType<T>(), + ...filters + .whereType<AlbumGroupFilter>() + .expand((v) => whereTypeRecursively<T>(v.filter.innerFilters)), + }; + } + + final pinned = settings.pinnedFilters.whereType<CollectionFilter>(); + final hidden = settings.hiddenFilters.whereNot(pinned.contains).toSet(); + + final listedStoredAlbums = <StoredAlbumFilter>{}; + + if (albumChipTypes.contains(AlbumChipType.stored)) { + final folderStats = source.folderMap.values + .where((f) => f.hidden != 1) + .where((f) => source.remoteVisible || f.isRemote != RemoteOrigin.value) + .toList(); + + final allFolderPaths = folderStats.map((f) => f.path).toSet(); + + debugPrint( + '[albums_page] getGridItems folderMap-only ' + 'folderMap=${source.folderMap.length} ' + 'folders=${folderStats.length} ' + 'groupUri=$groupUri', + ); + + if (groupUri == null) { + // Root: + // esclude gli album già presenti nei gruppi configurati. + // Qui usiamo il path esatto, non basename, così non c'è dedup. + final withinGroupPaths = whereTypeRecursively<StoredAlbumFilter>(groupContent) + .map((v) => v.album) + .toSet(); + + for (final stats in folderStats) { + if (withinGroupPaths.contains(stats.path)) continue; + + final filter = StoredAlbumFilter( + stats.path, + stats.displayName, + ); + + if (hidden.contains(filter)) continue; + + listedStoredAlbums.add(filter); + } + } else { + // Dentro un gruppo: + // mostra solo gli album dichiarati nel gruppo e ancora presenti in folderMap. + for (final groupedAlbum in groupContent.whereType<StoredAlbumFilter>()) { + final albumPath = groupedAlbum.album; + if (!allFolderPaths.contains(albumPath)) continue; + + final stats = source.folderMap[albumPath]; + + if (stats == null) continue; + if (stats.hidden == 1) continue; + if (!source.remoteVisible && stats.isRemote == RemoteOrigin.value) continue; + + final filter = StoredAlbumFilter( + albumPath, + stats.displayName, + ); + + if (hidden.contains(filter)) continue; + + listedStoredAlbums.add(filter); + } + } + } + + final listedDynamicAlbums = <DynamicAlbumFilter>{}; + + if (albumChipTypes.contains(AlbumChipType.dynamic)) { + final allDynamicAlbums = dynamicAlbums.all.whereNot(hidden.contains).toSet(); + + if (groupUri == null) { + final withinGroups = whereTypeRecursively<DynamicAlbumFilter>(groupContent).toSet(); + listedDynamicAlbums.addAll(allDynamicAlbums.whereNot(withinGroups.contains)); + } else { + listedDynamicAlbums.addAll( + groupContent + .whereType<DynamicAlbumFilter>() + .where(allDynamicAlbums.contains), + ); + } + } + + // Sempre mostra i gruppi, necessari per navigare nei contenuti. + final albumGroupFilters = groupContent + .whereType<AlbumGroupFilter>() + .whereNot(hidden.contains) + .toSet(); + + final filters = <CollectionFilter>{ + ...albumGroupFilters, + ...listedStoredAlbums, + ...listedDynamicAlbums, + }; + + debugPrint( + '[albums_page] getGridItems filters ' + 'stored=${listedStoredAlbums.length} ' + 'dynamic=${listedDynamicAlbums.length} ' + 'groups=${albumGroupFilters.length} ' + 'total=${filters.length}', + ); + + final sorted = FilterNavigationPage.sort( + settings.albumSortFactor, + settings.albumSortReverse, + source, + filters, + ); + + debugPrint( + '[albums_page] getGridItems sorted=${sorted.length}', + ); + + return sorted; + } + + static Map<ChipSectionKey, List<FilterGridItem<CollectionFilter>>> groupToSections( + BuildContext context, + CollectionSource source, + Iterable<FilterGridItem<CollectionFilter>> sortedMapEntries, + ) { + final newFilters = source.getNewAlbumFilters(context); + final pinned = settings.pinnedFilters.whereType<CollectionFilter>(); + + final newMapEntries = <FilterGridItem<CollectionFilter>>[]; + final pinnedMapEntries = <FilterGridItem<CollectionFilter>>[]; + final unpinnedMapEntries = <FilterGridItem<CollectionFilter>>[]; + + for (final item in sortedMapEntries) { + final filter = item.filter; + + if (newFilters.contains(filter)) { + newMapEntries.add(item); + } else if (pinned.contains(filter)) { + pinnedMapEntries.add(item); + } else { + unpinnedMapEntries.add(item); + } + } + + var sections = <ChipSectionKey, List<FilterGridItem<CollectionFilter>>>{}; + + switch (settings.albumSectionFactor) { + case AlbumChipSectionFactor.importance: + final groupKey = AlbumImportanceSectionKey.group(context); + final specialKey = AlbumImportanceSectionKey.special(context); + final appsKey = AlbumImportanceSectionKey.apps(context); + final vaultKey = AlbumImportanceSectionKey.vault(context); + final regularKey = AlbumImportanceSectionKey.regular(context); + final dynamicKey = AlbumImportanceSectionKey.dynamic(context); + + sections = groupBy<FilterGridItem<CollectionFilter>, ChipSectionKey>( + unpinnedMapEntries, + (kv) { + final filter = kv.filter; + + switch (filter) { + case StoredAlbumFilter _: + switch (covers.effectiveAlbumType(filter.album)) { + case AlbumType.regular: + return regularKey; + case AlbumType.app: + return appsKey; + case AlbumType.vault: + return vaultKey; + default: + return specialKey; + } + + case DynamicAlbumFilter _: + return dynamicKey; + + case AlbumGroupFilter _: + return groupKey; + } + + return specialKey; + }, + ); + + sections = { + if (sections.containsKey(groupKey)) groupKey: sections[groupKey]!, + if (sections.containsKey(specialKey)) specialKey: sections[specialKey]!, + if (sections.containsKey(appsKey)) appsKey: sections[appsKey]!, + if (sections.containsKey(vaultKey)) vaultKey: sections[vaultKey]!, + if (sections.containsKey(dynamicKey)) dynamicKey: sections[dynamicKey]!, + if (sections.containsKey(regularKey)) regularKey: sections[regularKey]!, + }; + + case AlbumChipSectionFactor.mimeType: + final visibleEntries = source.visibleEntries; + + sections = groupBy<FilterGridItem<CollectionFilter>, ChipSectionKey>( + unpinnedMapEntries, + (kv) { + final matches = visibleEntries.where(kv.filter.test); + final hasImage = matches.any((v) => v.isImage); + final hasVideo = matches.any((v) => v.isVideo); + + if (hasImage && !hasVideo) return MimeTypeSectionKey.images(context); + if (!hasImage && hasVideo) return MimeTypeSectionKey.videos(context); + + return MimeTypeSectionKey.mixed(context); + }, + ); + + case AlbumChipSectionFactor.volume: + sections = groupBy<FilterGridItem<CollectionFilter>, ChipSectionKey>( + unpinnedMapEntries, + (kv) { + final filter = kv.filter; + + return StorageVolumeSectionKey( + context, + filter is StoredAlbumFilter ? filter.storageVolume : null, + ); + }, + ); + + case AlbumChipSectionFactor.none: + return { + if (sortedMapEntries.isNotEmpty) + const ChipSectionKey(): [ + ...newMapEntries, + ...pinnedMapEntries, + ...unpinnedMapEntries, + ], + }; + } + + if (pinnedMapEntries.isNotEmpty) { + sections = Map.fromEntries([ + MapEntry( + AlbumImportanceSectionKey.pinned(context), + pinnedMapEntries, + ), + ...sections.entries, + ]); + } + + if (newMapEntries.isNotEmpty) { + sections = Map.fromEntries([ + MapEntry( + AlbumImportanceSectionKey.newAlbum(context), + newMapEntries, + ), + ...sections.entries, + ]); + } + + debugPrint( + '[albums_page] groupToSections ' + 'sectionFactor=${settings.albumSectionFactor} ' + 'new=${newMapEntries.length} ' + 'pinned=${pinnedMapEntries.length} ' + 'unpinned=${unpinnedMapEntries.length} ' + 'sections=${sections.length}', + ); + + return sections; + } +} diff --git a/lib/widgets/filter_grids/albums_page.dart.ok b/lib/widgets/filter_grids/albums_page.dart.ok new file mode 100644 index 0000000..05940cd --- /dev/null +++ b/lib/widgets/filter_grids/albums_page.dart.ok @@ -0,0 +1,400 @@ +// lib/widgets/filter_grids/albums_page.dart +import 'package:aves/model/app_inventory.dart'; +import 'package:aves/model/covers.dart'; +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/album.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/common/providers/filter_group_provider.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/album_set.dart'; +import 'package:aves/widgets/filter_grids/common/enums.dart'; +import 'package:aves/widgets/filter_grids/common/filter_nav_page.dart'; +import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class AlbumListPage extends StatelessWidget { + static const routeName = '/albums'; + + final Uri? initialGroup; + + const AlbumListPage({ + super.key, + required this.initialGroup, + }); + + @override + Widget build(BuildContext context) { + return MultiProvider( + providers: [ + ChangeNotifierProvider<FilterGrouping>.value(value: albumGrouping), + FilterGroupProvider(initialValue: initialGroup), + ], + child: Builder( + builder: (context) { + final source = context.read<CollectionSource>(); + + return Selector<Settings, (AlbumChipSectionFactor, ChipSortFactor, bool, Set<CollectionFilter>, Set<CollectionFilter>)>( + selector: (context, s) => ( + s.albumSectionFactor, + s.albumSortFactor, + s.albumSortReverse, + s.hiddenFilters, + s.pinnedFilters, + ), + shouldRebuild: (t1, t2) { + const eq = DeepCollectionEquality(); + return !( + eq.equals(t1.$1, t2.$1) && + eq.equals(t1.$2, t2.$2) && + eq.equals(t1.$3, t2.$3) && + eq.equals(t1.$4, t2.$4) && + eq.equals(t1.$5, t2.$5) + ); + }, + builder: (context, s, child) { + return ValueListenableBuilder<bool>( + valueListenable: appInventory.areAppNamesReadyNotifier, + builder: (context, areAppNamesReady, child) { + return AnimatedBuilder( + animation: Listenable.merge({albumGrouping, dynamicAlbums}), + builder: (context, child) => StreamBuilder( + stream: source.eventBus.on<AlbumsChangedEvent>(), + builder: (context, snapshot) { + final groupUri = context.watch<FilterGroupNotifier>().value; + + final gridItems = getGridItems( + context, + source, + AlbumChipType.values, + groupUri, + ); + + debugPrint( + '[albums_page] build ' + 'gridItems=${gridItems.length} ' + 'folderMap=${source.folderMap.length} ' + 'visibleEntries=${source.visibleEntries.length}', + ); + + return StreamBuilder<Set<CollectionFilter>?>( + stream: covers.packageChangeStream, + builder: (context, snapshot) => FilterNavigationPage<CollectionFilter, AlbumChipSetActionDelegate>( + source: source, + title: context.l10n.albumPageTitle, + sortFactor: settings.albumSortFactor, + showHeaders: settings.albumSectionFactor != AlbumChipSectionFactor.none, + actionDelegate: AlbumChipSetActionDelegate(gridItems), + filterSections: groupToSections( + context, + source, + gridItems, + ), + newFilters: source.getNewAlbumFilters(context), + emptyBuilder: () => EmptyContent( + icon: AIcons.album, + text: context.l10n.albumEmpty, + ), + ), + ); + }, + ), + ); + }, + ); + }, + ); + }, + ), + ); + } + + // Common with picking page. + // FolderMap-only: + // - album list viene solo da source.folderMap + // - UI resta compatibile Aves usando StoredAlbumFilter + static List<FilterGridItem<CollectionFilter>> getGridItems( + BuildContext context, + CollectionSource source, + Iterable<AlbumChipType> albumChipTypes, + Uri? groupUri, + ) { + final groupContent = albumGrouping.getDirectChildren(groupUri); + + Set<T> whereTypeRecursively<T>(Set<CollectionFilter> filters) { + return { + ...filters.whereType<T>(), + ...filters + .whereType<AlbumGroupFilter>() + .expand((v) => whereTypeRecursively<T>(v.filter.innerFilters)), + }; + } + + final pinned = settings.pinnedFilters.whereType<CollectionFilter>(); + final hidden = settings.hiddenFilters.whereNot(pinned.contains).toSet(); + + final listedStoredAlbums = <StoredAlbumFilter>{}; + + if (albumChipTypes.contains(AlbumChipType.stored)) { + final folderStats = source.folderMap.values + .where((f) => f.hidden != 1) + .toList(); + + final allFolderPaths = folderStats.map((f) => f.path).toSet(); + + debugPrint( + '[albums_page] getGridItems folderMap-only ' + 'folderMap=${source.folderMap.length} ' + 'folders=${folderStats.length} ' + 'groupUri=$groupUri', + ); + + if (groupUri == null) { + // Root: + // esclude gli album già presenti nei gruppi configurati. + // Qui usiamo il path esatto, non basename, così non c'è dedup. + final withinGroupPaths = whereTypeRecursively<StoredAlbumFilter>(groupContent) + .map((v) => v.album) + .toSet(); + + for (final stats in folderStats) { + if (withinGroupPaths.contains(stats.path)) continue; + + final filter = StoredAlbumFilter( + stats.path, + stats.displayName, + ); + + if (hidden.contains(filter)) continue; + + listedStoredAlbums.add(filter); + } + } else { + // Dentro un gruppo: + // mostra solo gli album dichiarati nel gruppo e ancora presenti in folderMap. + for (final groupedAlbum in groupContent.whereType<StoredAlbumFilter>()) { + final albumPath = groupedAlbum.album; + if (!allFolderPaths.contains(albumPath)) continue; + + final stats = source.folderMap[albumPath]; + + final filter = StoredAlbumFilter( + albumPath, + stats?.displayName ?? source.getStoredAlbumDisplayName(context, albumPath), + ); + + if (hidden.contains(filter)) continue; + + listedStoredAlbums.add(filter); + } + } + } + + final listedDynamicAlbums = <DynamicAlbumFilter>{}; + + if (albumChipTypes.contains(AlbumChipType.dynamic)) { + final allDynamicAlbums = dynamicAlbums.all.whereNot(hidden.contains).toSet(); + + if (groupUri == null) { + final withinGroups = whereTypeRecursively<DynamicAlbumFilter>(groupContent).toSet(); + listedDynamicAlbums.addAll(allDynamicAlbums.whereNot(withinGroups.contains)); + } else { + listedDynamicAlbums.addAll( + groupContent + .whereType<DynamicAlbumFilter>() + .where(allDynamicAlbums.contains), + ); + } + } + + // Sempre mostra i gruppi, necessari per navigare nei contenuti. + final albumGroupFilters = groupContent + .whereType<AlbumGroupFilter>() + .whereNot(hidden.contains) + .toSet(); + + final filters = <CollectionFilter>{ + ...albumGroupFilters, + ...listedStoredAlbums, + ...listedDynamicAlbums, + }; + + debugPrint( + '[albums_page] getGridItems filters ' + 'stored=${listedStoredAlbums.length} ' + 'dynamic=${listedDynamicAlbums.length} ' + 'groups=${albumGroupFilters.length} ' + 'total=${filters.length}', + ); + + final sorted = FilterNavigationPage.sort( + settings.albumSortFactor, + settings.albumSortReverse, + source, + filters, + ); + + debugPrint( + '[albums_page] getGridItems sorted=${sorted.length}', + ); + + return sorted; + } + + static Map<ChipSectionKey, List<FilterGridItem<CollectionFilter>>> groupToSections( + BuildContext context, + CollectionSource source, + Iterable<FilterGridItem<CollectionFilter>> sortedMapEntries, + ) { + final newFilters = source.getNewAlbumFilters(context); + final pinned = settings.pinnedFilters.whereType<CollectionFilter>(); + + final newMapEntries = <FilterGridItem<CollectionFilter>>[]; + final pinnedMapEntries = <FilterGridItem<CollectionFilter>>[]; + final unpinnedMapEntries = <FilterGridItem<CollectionFilter>>[]; + + for (final item in sortedMapEntries) { + final filter = item.filter; + + if (newFilters.contains(filter)) { + newMapEntries.add(item); + } else if (pinned.contains(filter)) { + pinnedMapEntries.add(item); + } else { + unpinnedMapEntries.add(item); + } + } + + var sections = <ChipSectionKey, List<FilterGridItem<CollectionFilter>>>{}; + + switch (settings.albumSectionFactor) { + case AlbumChipSectionFactor.importance: + final groupKey = AlbumImportanceSectionKey.group(context); + final specialKey = AlbumImportanceSectionKey.special(context); + final appsKey = AlbumImportanceSectionKey.apps(context); + final vaultKey = AlbumImportanceSectionKey.vault(context); + final regularKey = AlbumImportanceSectionKey.regular(context); + final dynamicKey = AlbumImportanceSectionKey.dynamic(context); + + sections = groupBy<FilterGridItem<CollectionFilter>, ChipSectionKey>( + unpinnedMapEntries, + (kv) { + final filter = kv.filter; + + switch (filter) { + case StoredAlbumFilter _: + switch (covers.effectiveAlbumType(filter.album)) { + case AlbumType.regular: + return regularKey; + case AlbumType.app: + return appsKey; + case AlbumType.vault: + return vaultKey; + default: + return specialKey; + } + + case DynamicAlbumFilter _: + return dynamicKey; + + case AlbumGroupFilter _: + return groupKey; + } + + return specialKey; + }, + ); + + sections = { + if (sections.containsKey(groupKey)) groupKey: sections[groupKey]!, + if (sections.containsKey(specialKey)) specialKey: sections[specialKey]!, + if (sections.containsKey(appsKey)) appsKey: sections[appsKey]!, + if (sections.containsKey(vaultKey)) vaultKey: sections[vaultKey]!, + if (sections.containsKey(dynamicKey)) dynamicKey: sections[dynamicKey]!, + if (sections.containsKey(regularKey)) regularKey: sections[regularKey]!, + }; + + case AlbumChipSectionFactor.mimeType: + final visibleEntries = source.visibleEntries; + + sections = groupBy<FilterGridItem<CollectionFilter>, ChipSectionKey>( + unpinnedMapEntries, + (kv) { + final matches = visibleEntries.where(kv.filter.test); + final hasImage = matches.any((v) => v.isImage); + final hasVideo = matches.any((v) => v.isVideo); + + if (hasImage && !hasVideo) return MimeTypeSectionKey.images(context); + if (!hasImage && hasVideo) return MimeTypeSectionKey.videos(context); + + return MimeTypeSectionKey.mixed(context); + }, + ); + + case AlbumChipSectionFactor.volume: + sections = groupBy<FilterGridItem<CollectionFilter>, ChipSectionKey>( + unpinnedMapEntries, + (kv) { + final filter = kv.filter; + + return StorageVolumeSectionKey( + context, + filter is StoredAlbumFilter ? filter.storageVolume : null, + ); + }, + ); + + case AlbumChipSectionFactor.none: + return { + if (sortedMapEntries.isNotEmpty) + const ChipSectionKey(): [ + ...newMapEntries, + ...pinnedMapEntries, + ...unpinnedMapEntries, + ], + }; + } + + if (pinnedMapEntries.isNotEmpty) { + sections = Map.fromEntries([ + MapEntry( + AlbumImportanceSectionKey.pinned(context), + pinnedMapEntries, + ), + ...sections.entries, + ]); + } + + if (newMapEntries.isNotEmpty) { + sections = Map.fromEntries([ + MapEntry( + AlbumImportanceSectionKey.newAlbum(context), + newMapEntries, + ), + ...sections.entries, + ]); + } + + debugPrint( + '[albums_page] groupToSections ' + 'sectionFactor=${settings.albumSectionFactor} ' + 'new=${newMapEntries.length} ' + 'pinned=${pinnedMapEntries.length} ' + 'unpinned=${unpinnedMapEntries.length} ' + 'sections=${sections.length}', + ); + + return sections; + } +} diff --git a/lib/widgets/filter_grids/common/action_delegates/album_set.dart b/lib/widgets/filter_grids/common/action_delegates/album_set.dart new file mode 100644 index 0000000..313a383 --- /dev/null +++ b/lib/widgets/filter_grids/common/action_delegates/album_set.dart @@ -0,0 +1,53 @@ +// Stub per compatibilità con il nuovo sistema Album. +// Tutta la logica legacy basata su StoredAlbumFilter, DynamicAlbumFilter, +// AlbumGroupFilter, vaults, covers, chip actions, ecc. è stata rimossa. + +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; +import 'package:aves_model/aves_model.dart'; + +class AlbumChipSetActionDelegate extends ChipSetActionDelegate<CollectionFilter> { + final Iterable<FilterGridItem<CollectionFilter>> _items; + + ChipSortFactor _sortFactor = ChipSortFactor.name; + bool _sortReverse = false; + TileLayout _tileLayout = TileLayout.grid; + + AlbumChipSetActionDelegate(this._items); + + @override + Iterable<FilterGridItem<CollectionFilter>> get allItems => _items; + + @override + ChipSortFactor get sortFactor => _sortFactor; + + @override + set sortFactor(ChipSortFactor factor) { + _sortFactor = factor; + } + + @override + bool get sortReverse => _sortReverse; + + @override + set sortReverse(bool value) { + _sortReverse = value; + } + + @override + TileLayout get tileLayout => _tileLayout; + + @override + set tileLayout(TileLayout layout) { + _tileLayout = layout; + } + + @override + void onActionSelected(_, __) {} + + @override + Future<void> configureView(_) async {} + + @override + Set<CollectionFilter> getSelectedFilters(_) => const {}; +} diff --git a/lib/widgets/filter_grids/common/action_delegates/chip.dart b/lib/widgets/filter_grids/common/action_delegates/chip.dart new file mode 100644 index 0000000..a1de602 --- /dev/null +++ b/lib/widgets/filter_grids/common/action_delegates/chip.dart @@ -0,0 +1,135 @@ +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/path.dart'; +import 'package:aves/model/filters/rating.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/highlight.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/vault_aware.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/explorer/explorer_page.dart'; +import 'package:aves/widgets/filter_grids/albums_page.dart'; +import 'package:aves/widgets/filter_grids/countries_page.dart'; +import 'package:aves/widgets/filter_grids/places_page.dart'; +import 'package:aves/widgets/filter_grids/tags_page.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ChipActionDelegate with FeedbackMixin, VaultAwareMixin { + bool isVisible( + ChipAction action, { + required CollectionFilter filter, + }) { + switch (action) { + case ChipAction.goToAlbumPage: + return filter is AlbumBaseFilter; + case ChipAction.goToCountryPage: + return filter is LocationFilter && filter.level == LocationLevel.country; + case ChipAction.goToPlacePage: + return filter is LocationFilter && filter.level == LocationLevel.place; + case ChipAction.goToTagPage: + return filter is TagFilter; + case ChipAction.goToExplorerPage: + return filter is StoredAlbumFilter || filter is PathFilter; + case ChipAction.ratingOrGreater: + return filter is RatingFilter && 1 <= filter.rating && filter.rating < 5 && filter.op != RatingFilter.opOrGreater; + case ChipAction.ratingOrLower: + return filter is RatingFilter && 1 < filter.rating && filter.rating <= 5 && filter.op != RatingFilter.opOrLower; + case ChipAction.decompose: + return filter is DynamicAlbumFilter; + case ChipAction.reverse: + case ChipAction.hide: + return true; + case ChipAction.lockVault: + return (filter is StoredAlbumFilter && vaults.isVault(filter.album) && !vaults.isLocked(filter.album)); + } + } + + void onActionSelected(BuildContext context, CollectionFilter filter, ChipAction action) { + reportService.log('$runtimeType handles $action'); + switch (action) { + case ChipAction.goToAlbumPage: + final initialGroup = albumGrouping.getFilterParent(filter); + _goTo(context, filter, AlbumListPage.routeName, (context) => const AlbumListPage(initialGroup: null)); + case ChipAction.goToCountryPage: + _goTo(context, filter, CountryListPage.routeName, (context) => const CountryListPage()); + case ChipAction.goToPlacePage: + _goTo(context, filter, PlaceListPage.routeName, (context) => const PlaceListPage()); + case ChipAction.goToTagPage: + final initialGroup = tagGrouping.getFilterParent(filter); + _goTo(context, filter, TagListPage.routeName, (context) => TagListPage(initialGroup: initialGroup)); + case ChipAction.goToExplorerPage: + String? path; + if (filter is StoredAlbumFilter) { + path = filter.album; + } else if (filter is PathFilter) { + path = filter.path; + } + if (path != null) { + Navigator.maybeOf(context)?.pushAndRemoveUntil( + MaterialPageRoute( + settings: const RouteSettings(name: ExplorerPage.routeName), + builder: (context) => ExplorerPage(path: path), + ), + (route) => false, + ); + } + case ChipAction.ratingOrGreater: + SelectFilterNotification((filter as RatingFilter).copyWith(RatingFilter.opOrGreater)).dispatch(context); + case ChipAction.ratingOrLower: + SelectFilterNotification((filter as RatingFilter).copyWith(RatingFilter.opOrLower)).dispatch(context); + case ChipAction.decompose: + DecomposeFilterNotification(filter).dispatch(context); + case ChipAction.reverse: + SelectFilterNotification(filter.reverse()).dispatch(context); + case ChipAction.hide: + _hide(context, filter); + case ChipAction.lockVault: + if (filter is StoredAlbumFilter) { + lockFilters({filter}); + } + } + } + + void _goTo( + BuildContext context, + CollectionFilter filter, + String routeName, + WidgetBuilder pageBuilder, + ) { + context.read<HighlightInfo>().set(filter); + Navigator.maybeOf(context)?.pushAndRemoveUntil( + MaterialPageRoute( + settings: RouteSettings(name: routeName), + builder: pageBuilder, + ), + (route) => false, + ); + } + + Future<void> _hide(BuildContext context, CollectionFilter filter) async { + final l10n = context.l10n; + + if (!await showConfirmationDialog( + context: context, + message: l10n.hideFilterConfirmationDialogMessage, + ok: l10n.hideButtonLabel, + )) { + return; + } + + if (!await unlockFilter(context, filter)) return; + + settings.changeFilterVisibility({filter}, false); + } +} diff --git a/lib/widgets/filter_grids/common/action_delegates/chip_set.dart b/lib/widgets/filter_grids/common/action_delegates/chip_set.dart new file mode 100644 index 0000000..ebd7ab0 --- /dev/null +++ b/lib/widgets/filter_grids/common/action_delegates/chip_set.dart @@ -0,0 +1,429 @@ +import 'package:aves/app_mode.dart'; +import 'package:aves/model/covers.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/container/set_or.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/query.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; +import 'package:aves/widgets/common/action_mixins/size_aware.dart'; +import 'package:aves/widgets/common/action_mixins/vault_aware.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/providers/filter_group_provider.dart'; +import 'package:aves/widgets/common/search/route.dart'; +import 'package:aves/widgets/common/tile_extent_controller.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/dialogs/filter_editors/cover_selection_dialog.dart'; +import 'package:aves/widgets/dialogs/tile_view_dialog.dart'; +import 'package:aves/widgets/map/map_page.dart'; +import 'package:aves/widgets/search/collection_search_delegate.dart'; +import 'package:aves/widgets/stats/stats_page.dart'; +import 'package:aves/widgets/viewer/slideshow_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +abstract class ChipSetActionDelegate<T extends CollectionFilter> with FeedbackMixin, PermissionAwareMixin, SizeAwareMixin, VaultAwareMixin { + Iterable<FilterGridItem<T>> get allItems; + + ChipSortFactor get sortFactor; + + set sortFactor(ChipSortFactor factor); + + bool get sortReverse; + + set sortReverse(bool value); + + TileLayout get tileLayout; + + set tileLayout(TileLayout tileLayout); + + static const sortOptions = [ + ChipSortFactor.date, + ChipSortFactor.name, + ChipSortFactor.count, + ChipSortFactor.size, + ]; + + static const albumSortOptions = [ + ...sortOptions, + ChipSortFactor.path, + ]; + + static const layoutOptions = [ + TileLayout.mosaic, + TileLayout.grid, + TileLayout.list, + ]; + + bool isVisible( + ChipSetAction action, { + required AppMode appMode, + required bool isSelecting, + required int itemCount, + required Set<T> selectedFilters, + }) { + final selectedItemCount = selectedFilters.length; + final hasSelection = selectedFilters.isNotEmpty; + final isMain = appMode == AppMode.main; + final useTvLayout = settings.useTvLayout; + switch (action) { + // general + case ChipSetAction.configureView: + return true; + case ChipSetAction.select: + return appMode.canSelectFilter && !isSelecting; + case ChipSetAction.selectAll: + return isSelecting && selectedItemCount < itemCount; + case ChipSetAction.selectNone: + return isSelecting && selectedItemCount == itemCount; + // browsing + case ChipSetAction.search: + return !useTvLayout && appMode.canNavigate && !isSelecting; + case ChipSetAction.toggleTitleSearch: + return !useTvLayout && !isSelecting; + case ChipSetAction.createGroup: + case ChipSetAction.createAlbum: + case ChipSetAction.createVault: + return false; + // browsing or selecting + case ChipSetAction.map: + case ChipSetAction.slideshow: + case ChipSetAction.stats: + return isMain; + // selecting (single/multiple filters) + case ChipSetAction.hide: + return isMain; + case ChipSetAction.pin: + return isMain && (!hasSelection || !settings.pinnedFilters.containsAll(selectedFilters)); + case ChipSetAction.unpin: + return isMain && (hasSelection && settings.pinnedFilters.containsAll(selectedFilters)); + case ChipSetAction.showCollection: + return appMode.canNavigate; + case ChipSetAction.delete: + case ChipSetAction.remove: + case ChipSetAction.group: + case ChipSetAction.lockVault: + case ChipSetAction.showCountryStates: + return false; + // selecting (single filter) + case ChipSetAction.setCover: + return isMain; + case ChipSetAction.rename: + case ChipSetAction.configureVault: + return false; + } + } + + bool canApply( + ChipSetAction action, { + required bool isSelecting, + required int itemCount, + required Set<T> selectedFilters, + }) { + final selectedItemCount = selectedFilters.length; + final hasItems = itemCount > 0; + final hasSelection = selectedItemCount > 0; + + switch (action) { + // general + case ChipSetAction.select: + return hasItems; + case ChipSetAction.configureView: + case ChipSetAction.selectAll: + case ChipSetAction.selectNone: + // browsing + case ChipSetAction.search: + case ChipSetAction.toggleTitleSearch: + case ChipSetAction.createGroup: + case ChipSetAction.createAlbum: + case ChipSetAction.createVault: + return true; + // browsing or selecting + case ChipSetAction.map: + case ChipSetAction.slideshow: + case ChipSetAction.stats: + return (!isSelecting && hasItems) || (isSelecting && hasSelection); + // selecting (single/multiple filters) + case ChipSetAction.delete: + case ChipSetAction.remove: + case ChipSetAction.hide: + case ChipSetAction.pin: + case ChipSetAction.unpin: + case ChipSetAction.group: + case ChipSetAction.lockVault: + case ChipSetAction.showCountryStates: + case ChipSetAction.showCollection: + return hasSelection; + // selecting (single filter) + case ChipSetAction.rename: + case ChipSetAction.setCover: + case ChipSetAction.configureVault: + return selectedItemCount == 1; + } + } + + void onActionSelected(BuildContext context, ChipSetAction action) { + reportService.log('$runtimeType handles $action'); + switch (action) { + // general + case ChipSetAction.configureView: + configureView(context); + case ChipSetAction.select: + context.read<Selection<FilterGridItem<T>>>().select(); + case ChipSetAction.selectAll: + context.read<Selection<FilterGridItem<T>>>().addToSelection(allItems); + case ChipSetAction.selectNone: + context.read<Selection<FilterGridItem<T>>>().clearSelection(); + // browsing + case ChipSetAction.search: + _goToSearch(context); + case ChipSetAction.toggleTitleSearch: + final routeName = context.currentRouteName!; + settings.setShowTitleQuery(routeName, !settings.getShowTitleQuery(routeName)); + context.read<Query>().toggle(); + case ChipSetAction.createGroup: + case ChipSetAction.createAlbum: + case ChipSetAction.createVault: + break; + // browsing or selecting + case ChipSetAction.map: + _goToMap(context); + case ChipSetAction.slideshow: + _goToSlideshow(context); + case ChipSetAction.stats: + _goToStats(context); + // selecting (single/multiple filters) + case ChipSetAction.hide: + _hide(context); + case ChipSetAction.pin: + settings.pinnedFilters = settings.pinnedFilters..addAll(getSelectedFilters(context)); + browse(context); + case ChipSetAction.unpin: + settings.pinnedFilters = settings.pinnedFilters..removeAll(getSelectedFilters(context)); + browse(context); + case ChipSetAction.showCollection: + _goToCollection(context); + case ChipSetAction.delete: + case ChipSetAction.remove: + case ChipSetAction.group: + case ChipSetAction.lockVault: + case ChipSetAction.showCountryStates: + break; + // selecting (single filter) + case ChipSetAction.setCover: + _setCover(context); + case ChipSetAction.rename: + case ChipSetAction.configureVault: + break; + } + } + + void browse(BuildContext context) => context.read<Selection<FilterGridItem<T>>?>()?.browse(); + + Set<T> getSelectedFilters(BuildContext context) { + final selection = context.read<Selection<FilterGridItem<T>>>(); + return selection.isSelecting ? selection.selectedItems.map((v) => v.filter).toSet() : {}; + } + + Iterable<AvesEntry> _selectedEntries(BuildContext context) { + final source = context.read<CollectionSource>(); + final visibleEntries = source.visibleEntries; + + final filters = <CollectionFilter>{}; + // use user selected filters, if any + filters.addAll(getSelectedFilters(context)); + + if (filters.isEmpty) { + // use current group filters, if any + final groupUri = context.read<FilterGroupNotifier?>()?.value; + if (groupUri != null) { + final grouping = FilterGrouping.forUri(groupUri); + if (grouping != null) { + final groupContent = grouping.getDirectChildren(groupUri); + filters.addAll(groupContent); + } + } + } + + if (filters.isNotEmpty) { + return visibleEntries.where((entry) => filters.any((f) => f.test(entry))); + } + + // default to all content + return visibleEntries; + } + + Future<void> configureView(BuildContext context) async { + final initialValue = ( + sortFactor, + null, + tileLayout, + sortReverse, + ); + final extentController = context.read<TileExtentController>(); + final value = await showDialog<(ChipSortFactor?, void, TileLayout?, bool)>( + context: context, + builder: (context) { + return TileViewDialog<ChipSortFactor, void, TileLayout>( + initialValue: initialValue, + sortOptions: sortOptions.map((v) => TileViewDialogOption(value: v, title: v.getName(context), icon: v.icon)).toList(), + layoutOptions: layoutOptions.map((v) => TileViewDialogOption(value: v, title: v.getName(context), icon: v.icon)).toList(), + sortOrder: (factor, reverse) => factor.getOrderName(context, reverse), + tileExtentController: extentController, + ); + }, + routeSettings: const RouteSettings(name: TileViewDialog.routeName), + ); + // wait for the dialog to hide + await Future.delayed(ADurations.dialogTransitionLoose * timeDilation); + if (value != null && initialValue != value) { + sortFactor = value.$1!; + tileLayout = value.$3!; + sortReverse = value.$4; + } + } + + Future<void> _goToCollection(BuildContext context) async { + final filters = getSelectedFilters(context); + if (filters.isEmpty) return; + + final filter = filters.length > 1 ? SetOrFilter(filters) : filters.first; + await Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) => CollectionPage( + source: context.read<CollectionSource>(), + filters: {filter}, + ), + ), + ); + } + + Future<void> _goToMap(BuildContext context) async { + final mapCollection = CollectionLens( + source: context.read<CollectionSource>(), + fixedSelection: _selectedEntries(context).where((entry) => entry.hasGps).toList(), + ); + await Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: MapPage.routeName), + builder: (context) => MapPage(collection: mapCollection), + ), + ); + } + + Future<void> _goToSlideshow(BuildContext context) async { + final entries = _selectedEntries(context).toList(); + await Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: SlideshowPage.routeName), + builder: (context) { + return SlideshowPage( + collection: CollectionLens( + source: context.read<CollectionSource>(), + fixedSelection: entries, + ), + ); + }, + ), + ); + } + + Future<void> _goToStats(BuildContext context) async { + final entries = _selectedEntries(context).toSet(); + await Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: StatsPage.routeName), + builder: (context) { + return StatsPage( + entries: entries, + source: context.read<CollectionSource>(), + ); + }, + ), + ); + } + + Future<void> _goToSearch(BuildContext context) async { + await Navigator.maybeOf(context)?.push( + SearchPageRoute( + delegate: CollectionSearchDelegate( + searchFieldLabel: context.l10n.searchCollectionFieldHint, + searchFieldStyle: Themes.searchFieldStyle(context), + source: context.read<CollectionSource>(), + ), + ), + ); + } + + Future<void> _hide(BuildContext context) async { + final l10n = context.l10n; + + if (!await showConfirmationDialog( + context: context, + message: l10n.hideFilterConfirmationDialogMessage, + ok: l10n.hideButtonLabel, + )) { + return; + } + + final filters = getSelectedFilters(context); + if (!await unlockFilters(context, filters)) return; + + settings.changeFilterVisibility(filters, false); + + browse(context); + } + + void _setCover(BuildContext context) async { + final filters = getSelectedFilters(context); + if (filters.isEmpty) return; + + final filter = filters.first; + if (!await unlockFilter(context, filter)) return; + + final existingCover = covers.of(filter); + final entryId = existingCover?.$1; + final customEntry = entryId != null ? context.read<CollectionSource>().visibleEntries.firstWhereOrNull((entry) => entry.id == entryId) : null; + final selectedCover = await showDialog<(AvesEntry?, String?, Color?)>( + context: context, + builder: (context) => CoverSelectionDialog( + filter: filter, + customEntry: customEntry, + customPackage: existingCover?.$2, + customColor: existingCover?.$3, + ), + routeSettings: const RouteSettings(name: CoverSelectionDialog.routeName), + ); + if (selectedCover == null) return; + + if (filter is StoredAlbumFilter) { + context.read<AvesColorsData>().clearAppColor(filter.album); + } + + final (selectedEntry, selectedPackage, selectedColor) = selectedCover; + await covers.set( + filter: filter, + entryId: selectedEntry?.id, + packageName: selectedPackage, + color: selectedColor, + ); + + browse(context); + } +} diff --git a/lib/widgets/filter_grids/common/action_delegates/country_set.dart b/lib/widgets/filter_grids/common/action_delegates/country_set.dart new file mode 100644 index 0000000..8aae1fc --- /dev/null +++ b/lib/widgets/filter_grids/common/action_delegates/country_set.dart @@ -0,0 +1,105 @@ +import 'package:aves/app_mode.dart'; +import 'package:aves/geo/states.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; +import 'package:aves/widgets/filter_grids/countries_page.dart'; +import 'package:aves/widgets/filter_grids/states_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +class CountryChipSetActionDelegate extends ChipSetActionDelegate<LocationFilter> { + final Iterable<FilterGridItem<LocationFilter>> _items; + + CountryChipSetActionDelegate(Iterable<FilterGridItem<LocationFilter>> items) : _items = items; + + @override + Iterable<FilterGridItem<LocationFilter>> get allItems => _items; + + @override + ChipSortFactor get sortFactor => settings.countrySortFactor; + + @override + set sortFactor(ChipSortFactor factor) => settings.countrySortFactor = factor; + + @override + bool get sortReverse => settings.countrySortReverse; + + @override + set sortReverse(bool value) => settings.countrySortReverse = value; + + @override + TileLayout get tileLayout => settings.getTileLayout(CountryListPage.routeName); + + @override + set tileLayout(TileLayout tileLayout) => settings.setTileLayout(CountryListPage.routeName, tileLayout); + + @override + bool isVisible( + ChipSetAction action, { + required AppMode appMode, + required bool isSelecting, + required int itemCount, + required Set<LocationFilter> selectedFilters, + }) { + switch (action) { + case ChipSetAction.showCountryStates: + return isSelecting; + default: + return super.isVisible( + action, + appMode: appMode, + isSelecting: isSelecting, + itemCount: itemCount, + selectedFilters: selectedFilters, + ); + } + } + + @override + bool canApply( + ChipSetAction action, { + required bool isSelecting, + required int itemCount, + required Set<LocationFilter> selectedFilters, + }) { + switch (action) { + case ChipSetAction.showCountryStates: + return selectedFilters.any((v) => GeoStates.stateCountryCodes.contains(v.code)); + default: + return super.canApply( + action, + isSelecting: isSelecting, + itemCount: itemCount, + selectedFilters: selectedFilters, + ); + } + } + + @override + void onActionSelected(BuildContext context, ChipSetAction action) { + reportService.log('$runtimeType handles $action'); + switch (action) { + // single/multiple filters + case ChipSetAction.showCountryStates: + _showStates(context); + browse(context); + default: + break; + } + super.onActionSelected(context, action); + } + + void _showStates(BuildContext context) { + final filters = getSelectedFilters(context); + final countryCodes = filters.map((v) => v.code).where(GeoStates.stateCountryCodes.contains).nonNulls.toSet(); + Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: StateListPage.routeName), + builder: (_) => StateListPage(countryCodes: countryCodes), + ), + ); + } +} diff --git a/lib/widgets/filter_grids/common/action_delegates/place_set.dart b/lib/widgets/filter_grids/common/action_delegates/place_set.dart new file mode 100644 index 0000000..3d80882 --- /dev/null +++ b/lib/widgets/filter_grids/common/action_delegates/place_set.dart @@ -0,0 +1,33 @@ +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; +import 'package:aves/widgets/filter_grids/places_page.dart'; +import 'package:aves_model/aves_model.dart'; + +class PlaceChipSetActionDelegate extends ChipSetActionDelegate<LocationFilter> { + final Iterable<FilterGridItem<LocationFilter>> _items; + + PlaceChipSetActionDelegate(Iterable<FilterGridItem<LocationFilter>> items) : _items = items; + + @override + Iterable<FilterGridItem<LocationFilter>> get allItems => _items; + + @override + ChipSortFactor get sortFactor => settings.placeSortFactor; + + @override + set sortFactor(ChipSortFactor factor) => settings.placeSortFactor = factor; + + @override + bool get sortReverse => settings.placeSortReverse; + + @override + set sortReverse(bool value) => settings.placeSortReverse = value; + + @override + TileLayout get tileLayout => settings.getTileLayout(PlaceListPage.routeName); + + @override + set tileLayout(TileLayout tileLayout) => settings.setTileLayout(PlaceListPage.routeName, tileLayout); +} diff --git a/lib/widgets/filter_grids/common/action_delegates/state_set.dart b/lib/widgets/filter_grids/common/action_delegates/state_set.dart new file mode 100644 index 0000000..469c655 --- /dev/null +++ b/lib/widgets/filter_grids/common/action_delegates/state_set.dart @@ -0,0 +1,33 @@ +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; +import 'package:aves/widgets/filter_grids/states_page.dart'; +import 'package:aves_model/aves_model.dart'; + +class StateChipSetActionDelegate extends ChipSetActionDelegate<LocationFilter> { + final Iterable<FilterGridItem<LocationFilter>> _items; + + StateChipSetActionDelegate(Iterable<FilterGridItem<LocationFilter>> items) : _items = items; + + @override + Iterable<FilterGridItem<LocationFilter>> get allItems => _items; + + @override + ChipSortFactor get sortFactor => settings.stateSortFactor; + + @override + set sortFactor(ChipSortFactor factor) => settings.stateSortFactor = factor; + + @override + bool get sortReverse => settings.stateSortReverse; + + @override + set sortReverse(bool value) => settings.stateSortReverse = value; + + @override + TileLayout get tileLayout => settings.getTileLayout(StateListPage.routeName); + + @override + set tileLayout(TileLayout tileLayout) => settings.setTileLayout(StateListPage.routeName, tileLayout); +} diff --git a/lib/widgets/filter_grids/common/action_delegates/tag_set.dart b/lib/widgets/filter_grids/common/action_delegates/tag_set.dart new file mode 100644 index 0000000..955c808 --- /dev/null +++ b/lib/widgets/filter_grids/common/action_delegates/tag_set.dart @@ -0,0 +1,154 @@ +import 'package:aves/app_mode.dart'; +import 'package:aves/model/filters/container/tag_group.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/grouping/convert.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/collection/entry_set_action_delegate.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/providers/filter_group_provider.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/dialogs/pick_dialogs/tag_pick_page.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; +import 'package:aves/widgets/filter_grids/common/enums.dart'; +import 'package:aves/widgets/filter_grids/tags_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class TagChipSetActionDelegate extends ChipSetActionDelegate<TagBaseFilter> { + final Iterable<FilterGridItem<TagBaseFilter>> _items; + + TagChipSetActionDelegate(Iterable<FilterGridItem<TagBaseFilter>> items) : _items = items; + + @override + Iterable<FilterGridItem<TagBaseFilter>> get allItems => _items; + + @override + ChipSortFactor get sortFactor => settings.tagSortFactor; + + @override + set sortFactor(ChipSortFactor factor) => settings.tagSortFactor = factor; + + @override + bool get sortReverse => settings.tagSortReverse; + + @override + set sortReverse(bool value) => settings.tagSortReverse = value; + + @override + TileLayout get tileLayout => settings.getTileLayout(TagListPage.routeName); + + @override + set tileLayout(TileLayout tileLayout) => settings.setTileLayout(TagListPage.routeName, tileLayout); + + @override + bool isVisible( + ChipSetAction action, { + required AppMode appMode, + required bool isSelecting, + required int itemCount, + required Set<TagBaseFilter> selectedFilters, + }) { + final isMain = appMode == AppMode.main; + + switch (action) { + case ChipSetAction.createGroup: + return true; + case ChipSetAction.group: + return isMain && isSelecting; + case ChipSetAction.remove: + return isMain && isSelecting && !settings.isReadOnly && (selectedFilters.isEmpty || selectedFilters.every((v) => v is TagFilter)); + default: + return super.isVisible( + action, + appMode: appMode, + isSelecting: isSelecting, + itemCount: itemCount, + selectedFilters: selectedFilters, + ); + } + } + + @override + bool canApply( + ChipSetAction action, { + required bool isSelecting, + required int itemCount, + required Set<TagBaseFilter> selectedFilters, + }) { + switch (action) { + case ChipSetAction.delete: + return selectedFilters.isNotEmpty && selectedFilters.every((v) => v is TagFilter); + default: + return super.canApply( + action, + isSelecting: isSelecting, + itemCount: itemCount, + selectedFilters: selectedFilters, + ); + } + } + + @override + void onActionSelected(BuildContext context, ChipSetAction action) { + reportService.log('$runtimeType handles $action'); + switch (action) { + // single/multiple filters + case ChipSetAction.remove: + _remove(context); + case ChipSetAction.group: + _group(context); + default: + break; + } + super.onActionSelected(context, action); + } + + Future<void> _remove(BuildContext context) async { + final l10n = context.l10n; + + if (!await showConfirmationDialog( + context: context, + message: l10n.genericDangerWarningDialogMessage, + ok: l10n.applyButtonLabel, + )) { + return; + } + + final filters = getSelectedFilters(context).whereType<TagFilter>().toSet(); + final source = context.read<CollectionSource>(); + + await EntrySetActionDelegate().removeTags( + context, + entries: source.visibleEntries.where((entry) => filters.any((f) => f.test(entry))).toSet(), + tags: filters.map((v) => v.tag).toSet(), + ); + + browse(context); + } + + Future<void> _group(BuildContext context) async { + final filters = getSelectedFilters(context); + final childrenUris = filters.map(GroupingConversion.filterToUri).nonNulls.toSet(); + + final initialGroup = tagGrouping.getFilterParent(filters.first); + final filter = await pickTag( + context: context, + chipTypes: {ChipType.group}, + initialGroup: initialGroup, + ); + if (filter == null) return; + + final destinationGroupUri = filter is TagGroupFilter ? filter.uri : null; + tagGrouping.addToGroup(childrenUris, destinationGroupUri); + context.read<FilterGroupNotifier>().value = destinationGroupUri; + + final source = context.read<CollectionSource>(); + source.invalidateTagGroupFilterSummary(notify: true); + browse(context); + } +} diff --git a/lib/widgets/filter_grids/common/app_bar.dart b/lib/widgets/filter_grids/common/app_bar.dart new file mode 100644 index 0000000..978e710 --- /dev/null +++ b/lib/widgets/filter_grids/common/app_bar.dart @@ -0,0 +1,524 @@ +import 'dart:async'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/query.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves/widgets/common/action_controls/togglers/title_search.dart'; +import 'package:aves/widgets/common/app_bar/app_bar_subtitle.dart'; +import 'package:aves/widgets/common/app_bar/app_bar_title.dart'; +import 'package:aves/widgets/common/app_bar/crumb_line.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_app_bar.dart'; +import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; +import 'package:aves/widgets/common/providers/filter_group_provider.dart'; +import 'package:aves/widgets/common/search/route.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; +import 'package:aves/widgets/filter_grids/common/group_crumb_line.dart'; +import 'package:aves/widgets/filter_grids/common/query_bar.dart'; +import 'package:aves/widgets/search/collection_search_delegate.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +typedef ActionsBuilder<T extends CollectionFilter, CSAD extends ChipSetActionDelegate<T>> = + List<Widget> Function( + BuildContext context, + AppMode appMode, + Selection<FilterGridItem<T>> selection, + CSAD actionDelegate, + ); + +class FilterGridAppBar<T extends CollectionFilter, CSAD extends ChipSetActionDelegate<T>> extends StatefulWidget { + final CollectionSource source; + final String title; + final CSAD actionDelegate; + final ActionsBuilder<T, CSAD>? actionsBuilder; + final bool isEmpty; + final ValueNotifier<double> appBarHeightNotifier; + final ScrollController scrollController; + + const FilterGridAppBar({ + super.key, + required this.source, + required this.title, + required this.actionDelegate, + this.actionsBuilder, + required this.isEmpty, + required this.appBarHeightNotifier, + required this.scrollController, + }); + + @override + State<FilterGridAppBar<T, CSAD>> createState() => _FilterGridAppBarState<T, CSAD>(); + + static PopupMenuEntry<ChipSetAction> toMenuItem(BuildContext context, ChipSetAction action, {required bool enabled}) { + late Widget child; + switch (action) { + case ChipSetAction.toggleTitleSearch: + child = TitleSearchToggler( + queryEnabled: context.read<Query>().enabled, + isMenuItem: true, + ); + default: + child = MenuRow(text: action.getText(context), icon: action.getIcon()); + } + + return PopupMenuItem( + value: action, + enabled: enabled, + child: child, + ); + } +} + +class _FilterGridAppBarState<T extends CollectionFilter, CSAD extends ChipSetActionDelegate<T>> extends State<FilterGridAppBar<T, CSAD>> with RouteAware, SingleTickerProviderStateMixin, WidgetsBindingObserver { + final Set<StreamSubscription> _subscriptions = {}; + late AnimationController _browseToSelectAnimation; + final ValueNotifier<bool> _isSelectingNotifier = ValueNotifier(false); + final FocusNode _queryBarFocusNode = FocusNode(); + late final Listenable _queryFocusRequestNotifier; + + CollectionSource get source => widget.source; + + static const browsingQuickActions = [ + ChipSetAction.search, + ]; + static const selectionQuickActions = [ + ChipSetAction.setCover, + ChipSetAction.pin, + ChipSetAction.unpin, + ]; + + @override + void initState() { + super.initState(); + final query = context.read<Query>(); + _subscriptions.add(query.enabledStream.listen((e) => _updateAppBarHeight())); + _queryFocusRequestNotifier = query.focusRequestNotifier; + _queryFocusRequestNotifier.addListener(_onQueryFocusRequest); + _queryBarFocusNode.addListener(_onQueryBarFocusChanged); + _browseToSelectAnimation = AnimationController( + duration: context.read<DurationsData>().iconAnimation, + vsync: this, + ); + _isSelectingNotifier.addListener(_onActivityChanged); + WidgetsBinding.instance.addObserver(this); + WidgetsBinding.instance.addPostFrameCallback((_) => _updateAppBarHeight()); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final route = ModalRoute.of(context); + if (route is PageRoute) { + AvesApp.pageRouteObserver.subscribe(this, route); + } + } + + @override + void dispose() { + _queryBarFocusNode.dispose(); + _queryFocusRequestNotifier.removeListener(_onQueryFocusRequest); + _queryBarFocusNode.removeListener(_onQueryBarFocusChanged); + _isSelectingNotifier.dispose(); + _browseToSelectAnimation.dispose(); + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + WidgetsBinding.instance.removeObserver(this); + AvesApp.pageRouteObserver.unsubscribe(this); + super.dispose(); + } + + @override + void didPushNext() { + // unfocus when navigating away, so that when navigating back, + // the query bar does not get back focus and bring the keyboard + _queryBarFocusNode.unfocus(); + } + + @override + void didChangeMetrics() { + // when text scale factor changes + _updateAppBarHeight(); + } + + @override + Widget build(BuildContext context) { + final appMode = context.watch<ValueNotifier<AppMode>>().value; + final selection = context.watch<Selection<FilterGridItem<T>>>(); + final isSelecting = selection.isSelecting; + _isSelectingNotifier.value = isSelecting; + return NotificationListener<ScrollNotification>( + // cancel notification bubbling so that the draggable scroll bar + // does not misinterpret filter bar scrolling for collection scrolling + onNotification: (notification) => true, + child: Selector<Query, bool>( + selector: (context, query) => query.enabled, + builder: (context, queryEnabled, child) { + final actionDelegate = widget.actionDelegate; + final ActionsBuilder<T, CSAD> actionsBuilder = widget.actionsBuilder ?? _buildActions; + final useTvLayout = settings.useTvLayout; + return AvesAppBar( + contentHeight: appBarContentHeight, + pinned: context.select<Selection<FilterGridItem<T>>, bool>((selection) => selection.isSelecting), + leading: _buildAppBarLeading( + hasDrawer: appMode.canNavigate, + isSelecting: isSelecting, + ), + title: _buildAppBarTitle(isSelecting), + actions: (context, maxWidth) => useTvLayout ? [] : actionsBuilder(context, appMode, selection, actionDelegate), + bottom: Column( + children: [ + if (useTvLayout) + SizedBox( + height: CaptionedButton.getTelevisionButtonHeight(context), + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 8), + scrollDirection: Axis.horizontal, + children: actionsBuilder(context, appMode, selection, actionDelegate), + ), + ), + if (_showGroupCrumbLine(context)) + LayoutBuilder( + builder: (context, constraints) { + return Container( + padding: CrumbLine.padding, + width: constraints.maxWidth, + height: CrumbLine.getPreferredHeight(MediaQuery.textScalerOf(context)), + child: Selector<FilterGroupNotifier, Uri?>( + selector: (context, notifier) => notifier.value, + builder: (context, groupUri, child) { + return FilterGroupCrumbLine( + key: const Key('crumbs'), + groupUri: groupUri, + onTap: (uri) => context.read<FilterGroupNotifier?>()?.value = uri, + ); + }, + ), + ); + }, + ), + if (queryEnabled) + FilterQueryBar<T>( + queryNotifier: context.select<Query, ValueNotifier<String>>((query) => query.queryNotifier), + focusNode: _queryBarFocusNode, + ), + ], + ), + transitionKey: isSelecting, + ); + }, + ), + ); + } + + bool _showGroupCrumbLine(BuildContext context) => context.read<FilterGrouping?>()?.isNotEmpty ?? false; + + double get appBarContentHeight { + final textScaler = MediaQuery.textScalerOf(context); + double height = textScaler.scale(kToolbarHeight); + if (settings.useTvLayout) { + height += CaptionedButton.getTelevisionButtonHeight(context); + } + if (_showGroupCrumbLine(context)) { + height += CrumbLine.getPreferredHeight(textScaler); + } + if (context.read<Query>().enabled) { + height += FilterQueryBar.getPreferredHeight(textScaler); + } + return height; + } + + Widget? _buildAppBarLeading({required bool hasDrawer, required bool isSelecting}) { + if (settings.useTvLayout) return null; + + if (!hasDrawer) { + return const CloseButton(); + } + + VoidCallback? onPressed; + String? tooltip; + if (isSelecting) { + onPressed = () => context.read<Selection<FilterGridItem<T>>>().browse(); + tooltip = MaterialLocalizations.of(context).backButtonTooltip; + } else { + onPressed = Scaffold.of(context).openDrawer; + tooltip = MaterialLocalizations.of(context).openAppDrawerTooltip; + } + return IconButton( + // key is expected by test driver + key: const Key('appbar-leading-button'), + icon: AnimatedIcon( + icon: AnimatedIcons.menu_arrow, + progress: _browseToSelectAnimation, + ), + onPressed: onPressed, + tooltip: tooltip, + ); + } + + Widget _buildAppBarTitle(bool isSelecting) { + if (isSelecting) { + final l10n = context.l10n; + return Selector<Selection<FilterGridItem<T>>?, int>( + selector: (context, selection) => selection?.selectedItems.length ?? 0, + builder: (context, count, child) => Text( + count == 0 ? l10n.collectionSelectPageTitle : l10n.itemCount(count), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ); + } else { + final appMode = context.watch<ValueNotifier<AppMode>>().value; + return InteractiveAppBarTitle( + onTap: appMode.canNavigate ? _goToSearch : null, + child: SourceStateAwareAppBarTitle( + title: Text( + widget.title, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + source: source, + ), + ); + } + } + + List<Widget> _buildActions( + BuildContext context, + AppMode appMode, + Selection<FilterGridItem<T>> selection, + CSAD actionDelegate, + ) { + final itemCount = actionDelegate.allItems.length; + final isSelecting = selection.isSelecting; + final selectedItems = selection.selectedItems; + final selectedFilters = selectedItems.map((v) => v.filter).toSet(); + + bool isVisible(ChipSetAction action) => actionDelegate.isVisible( + action, + appMode: appMode, + isSelecting: isSelecting, + itemCount: itemCount, + selectedFilters: selectedFilters, + ); + bool canApply(ChipSetAction action) => actionDelegate.canApply( + action, + isSelecting: isSelecting, + itemCount: itemCount, + selectedFilters: selectedFilters, + ); + + return settings.useTvLayout + ? _buildTelevisionActions( + context: context, + selection: selection, + isVisible: isVisible, + canApply: canApply, + actionDelegate: actionDelegate, + ) + : _buildMobileActions( + context: context, + selection: selection, + isVisible: isVisible, + canApply: canApply, + actionDelegate: actionDelegate, + ); + } + + List<Widget> _buildTelevisionActions({ + required BuildContext context, + required Selection<FilterGridItem<T>> selection, + required bool Function(ChipSetAction action) isVisible, + required bool Function(ChipSetAction action) canApply, + required CSAD actionDelegate, + }) { + final isSelecting = selection.isSelecting; + + return [ + ...ChipSetActions.general, + ...isSelecting ? ChipSetActions.selection : ChipSetActions.browsing, + ].nonNulls.where(isVisible).map((action) { + final enabled = canApply(action); + return CaptionedButton( + iconButtonBuilder: (context, focusNode) => _buildButtonIcon( + context, + actionDelegate, + action, + enabled: enabled, + focusNode: focusNode, + ), + captionText: _buildButtonCaption(context, action, enabled: enabled), + onPressed: enabled ? () => _onActionSelected(context, action, actionDelegate) : null, + ); + }).toList(); + } + + List<Widget> _buildMobileActions({ + required BuildContext context, + required Selection<FilterGridItem<T>> selection, + required bool Function(ChipSetAction action) isVisible, + required bool Function(ChipSetAction action) canApply, + required CSAD actionDelegate, + }) { + final isSelecting = selection.isSelecting; + + final quickActionButtons = (isSelecting ? selectionQuickActions : browsingQuickActions) + .where(isVisible) + .map( + (action) => _buildButtonIcon(context, actionDelegate, action, enabled: canApply(action)), + ); + + final animations = context.select<Settings, AccessibilityAnimations>((v) => v.accessibilityAnimations); + return [ + ...quickActionButtons, + PopupMenuButton<ChipSetAction>( + itemBuilder: (context) { + final generalMenuItems = ChipSetActions.general + .where(isVisible) + .map( + (action) => FilterGridAppBar.toMenuItem(context, action, enabled: canApply(action)), + ); + + final browsingMenuActions = ChipSetActions.browsing.where((v) => !browsingQuickActions.contains(v)); + final selectionMenuActions = ChipSetActions.selection.where((v) => !selectionQuickActions.contains(v)); + final contextualMenuActions = (isSelecting ? selectionMenuActions : browsingMenuActions).where((v) => v == null || isVisible(v)).fold(<ChipSetAction?>[], (prev, v) { + if (v == null && (prev.isEmpty || prev.last == null)) return prev; + return [...prev, v]; + }); + if (contextualMenuActions.isNotEmpty && contextualMenuActions.last == null) { + contextualMenuActions.removeLast(); + } + + return [ + ...generalMenuItems, + if (contextualMenuActions.isNotEmpty) ...[ + const PopupMenuDivider(), + ...contextualMenuActions.map( + (action) { + if (action == null) return const PopupMenuDivider(); + return FilterGridAppBar.toMenuItem(context, action, enabled: canApply(action)); + }, + ), + ], + ]; + }, + onSelected: (action) async { + // remove focus, if any, to prevent the keyboard from showing up + // after the user is done with the popup menu + FocusManager.instance.primaryFocus?.unfocus(); + + // wait for the popup menu to hide before proceeding with the action + await Future.delayed(animations.popUpAnimationDelay * timeDilation); + _onActionSelected(context, action, actionDelegate); + }, + popUpAnimationStyle: animations.popUpAnimationStyle, + ), + ]; + } + + Widget _buildButtonIcon( + BuildContext context, + CSAD actionDelegate, + ChipSetAction action, { + required bool enabled, + FocusNode? focusNode, + }) { + final onPressed = enabled ? () => _onActionSelected(context, action, actionDelegate) : null; + switch (action) { + case ChipSetAction.toggleTitleSearch: + // `Query` may not be available during hero + return Selector<Query?, bool>( + selector: (context, query) => query?.enabled ?? false, + builder: (context, queryEnabled, child) { + return TitleSearchToggler( + queryEnabled: queryEnabled, + focusNode: focusNode, + onPressed: onPressed, + ); + }, + ); + default: + return IconButton( + icon: action.getIcon(), + onPressed: onPressed, + focusNode: focusNode, + tooltip: action.getText(context), + ); + } + } + + Widget _buildButtonCaption( + BuildContext context, + ChipSetAction action, { + required bool enabled, + }) { + switch (action) { + case ChipSetAction.toggleTitleSearch: + return TitleSearchTogglerCaption( + enabled: enabled, + ); + default: + return CaptionedButtonText( + text: action.getText(context), + enabled: enabled, + ); + } + } + + void _onActivityChanged() { + if (context.read<Selection<FilterGridItem<T>>>().isSelecting) { + _browseToSelectAnimation.forward(); + } else { + _browseToSelectAnimation.reverse(); + } + } + + void _onQueryFocusRequest() => _queryBarFocusNode.requestFocus(); + + void _onQueryBarFocusChanged() { + if (_queryBarFocusNode.hasFocus) { + // the query bar is in the top sliver of the page scrollable, + // so when the bar text field gets focus and requests to be on screen, + // it will scroll to show it by default, but it may not end at the very top, + // so we do it manually for a more predicable end position + _scrollToTop(); + } + } + + void _scrollToTop() => widget.scrollController.jumpTo(0); + + void _updateAppBarHeight() { + widget.appBarHeightNotifier.value = AvesAppBar.appBarHeightForContentHeight(appBarContentHeight); + } + + void _onActionSelected(BuildContext context, ChipSetAction action, ChipSetActionDelegate<T> actionDelegate) { + actionDelegate.onActionSelected(context, action); + } + + void _goToSearch() { + Navigator.maybeOf(context)?.push( + SearchPageRoute( + delegate: CollectionSearchDelegate( + searchFieldLabel: context.l10n.searchCollectionFieldHint, + searchFieldStyle: Themes.searchFieldStyle(context), + source: source, + ), + ), + ); + } +} diff --git a/lib/widgets/filter_grids/common/covered_filter_chip.dart b/lib/widgets/filter_grids/common/covered_filter_chip.dart new file mode 100644 index 0000000..b2f7d54 --- /dev/null +++ b/lib/widgets/filter_grids/common/covered_filter_chip.dart @@ -0,0 +1,282 @@ +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/app_inventory.dart'; +import 'package:aves/model/covers.dart'; +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/container/tag_group.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/source/album.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/location/country.dart'; +import 'package:aves/model/source/tag.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/common/thumbnail/image.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; + +// ✅ REMOTE support per cover album remota +import 'package:aves/remote/remote_origin.dart'; +import 'package:aves/remote/remote_image_tile.dart'; + +class CoveredFilterChip<T extends CollectionFilter> extends StatelessWidget { + final T filter; + final double extent, thumbnailExtent; + final bool showText, pinned, locked; + final String? banner; + final AFilterCallback? onTap; + final HeroType heroType; + + const CoveredFilterChip({ + super.key, + required this.filter, + required this.extent, + double? thumbnailExtent, + this.showText = true, + this.pinned = false, + required this.locked, + this.banner, + this.onTap, + this.heroType = HeroType.onTap, + }) : thumbnailExtent = thumbnailExtent ?? extent; + + static double tileHeight({required double extent, required TextScaler textScaler, required bool showText}) { + return extent + infoHeight(extent: extent, textScaler: textScaler, showText: showText); + } + + // info includes title and content details + static double infoHeight({required double extent, required TextScaler textScaler, required bool showText}) { + if (!showText) return 0; + + // height can actually be a little larger or smaller, when info includes icons or non-latin scripts + // but it's not worth measuring text metrics, as the widget is flexible enough to absorb the difference + return textScaler.scale(AvesFilterChip.fontSize + detailFontSize(extent) + 4) + AvesFilterChip.decoratedContentVerticalPadding * 2; + } + + static Radius radius(double extent) => Radius.circular(min<double>(AvesFilterChip.defaultRadius, extent / 4)); + + static double detailIconSize(double extent) => min<double>(AvesFilterChip.fontSize, extent / 7); + + static double detailFontSize(double extent) => min<double>(AvesFilterChip.fontSize, extent / 7); + + static double detailIconPadding(double extent) => min<double>(8.0, extent / 16); + + static double detailIconTextPadding(double extent) => detailIconPadding(extent) / 2; + + @override + Widget build(BuildContext context) { + return StreamBuilder<Set<CollectionFilter>?>( + stream: covers.entryChangeStream.where((event) => event == null || event.contains(filter)), + builder: (context, snapshot) => Consumer<CollectionSource>( + builder: (context, source, child) { + switch (filter) { + case StoredAlbumFilter filter: + { + final album = filter.album; + return StreamBuilder<StoredAlbumSummaryInvalidatedEvent>( + stream: source.eventBus.on<StoredAlbumSummaryInvalidatedEvent>().where((event) => event.directories == null || event.directories!.contains(album)), + builder: (context, snapshot) => _buildChip(context, source), + ); + } + case DynamicAlbumFilter _: + { + return StreamBuilder<DynamicAlbumSummaryInvalidatedEvent>( + stream: source.eventBus.on<DynamicAlbumSummaryInvalidatedEvent>(), + builder: (context, snapshot) => _buildChip(context, source), + ); + } + case AlbumGroupFilter _: + { + return StreamBuilder<AlbumGroupSummaryInvalidatedEvent>( + stream: source.eventBus.on<AlbumGroupSummaryInvalidatedEvent>(), + builder: (context, snapshot) => _buildChip(context, source), + ); + } + case TagGroupFilter _: + { + return StreamBuilder<TagGroupSummaryInvalidatedEvent>( + stream: source.eventBus.on<TagGroupSummaryInvalidatedEvent>(), + builder: (context, snapshot) => _buildChip(context, source), + ); + } + case LocationFilter filter: + { + final countryCode = filter.code; + return StreamBuilder<CountrySummaryInvalidatedEvent>( + stream: source.eventBus.on<CountrySummaryInvalidatedEvent>().where((event) => event.countryCodes == null || event.countryCodes!.contains(countryCode)), + builder: (context, snapshot) => _buildChip(context, source), + ); + } + case TagFilter filter: + { + final tag = filter.tag; + return StreamBuilder<TagSummaryInvalidatedEvent>( + stream: source.eventBus.on<TagSummaryInvalidatedEvent>().where((event) => event.tags == null || event.tags!.contains(tag)), + builder: (context, snapshot) => _buildChip(context, source), + ); + } + default: + return const SizedBox(); + } + }, + ), + ); + } + + Widget _buildChip(BuildContext context, CollectionSource source) { + final _filter = filter; + + // cover entry (null se vault locked) + final entry = _filter is StoredAlbumFilter && vaults.isLocked(_filter.album) ? null : source.coverEntry(_filter); + + final titlePadding = min<double>(4.0, extent / 32); + Key? chipKey; + if (_filter is StoredAlbumFilter) { + // when we asynchronously fetch installed app names, + // album filters themselves do not change, but decoration derived from it does + chipKey = ValueKey(appInventory.areAppNamesReadyNotifier.value); + } + final textScaler = MediaQuery.textScalerOf(context); + + return AvesFilterChip( + key: chipKey, + filter: _filter, + showLeading: showText, + showText: showText, + allowGenericIcon: false, + decoration: AvesFilterDecoration( + radius: radius(extent), + widget: Padding( + padding: EdgeInsets.only( + bottom: infoHeight( + extent: extent, + textScaler: textScaler, + showText: showText, + ), + ), + child: entry == null + ? StreamBuilder<Set<CollectionFilter>?>( + stream: covers.colorChangeStream.where((event) => event == null || event.contains(_filter)), + builder: (context, snapshot) { + return FutureBuilder<Color>( + future: _filter.color(context), + builder: (context, snapshot) { + final color = snapshot.data; + const neutral = Colors.white; + return Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + neutral, + color ?? neutral, + ], + ), + ), + ); + }, + ); + }, + ) + : _buildCoverImage(context, entry), + ), + ), + banner: banner, + details: showText ? _buildDetails(context, source, _filter) : null, + padding: titlePadding, + heroType: heroType, + onTap: onTap, + onLongPress: null, + ); + } + + // ✅ Cover locale vs remota (robusta: clip + size esplicita) + Widget _buildCoverImage(BuildContext context, AvesEntry entry) { + final r = radius(extent).x; + + if (entry.origin == RemoteOrigin.value) { + return ClipRRect( + borderRadius: BorderRadius.circular(r), + child: SizedBox.expand( + child: RemoteImageTile( + entry: entry, + borderRadius: 0, + fit: BoxFit.cover, + ), + ), + ); + } + + return ThumbnailImage( + entry: entry, + extent: thumbnailExtent, + devicePixelRatio: MediaQuery.devicePixelRatioOf(context), + ); + } + + Color _detailColor(BuildContext context) => Theme.of(context).colorScheme.onSurfaceVariant; + + Widget _buildDetails(BuildContext context, CollectionSource source, T filter) { + final textStyle = TextStyle( + color: _detailColor(context), + fontSize: detailFontSize(extent), + ); + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (pinned) _buildDetailIcon(context, AIcons.pin), + if (filter is StoredAlbumFilter && androidFileUtils.isOnRemovableStorage(filter.album)) _buildDetailIcon(context, AIcons.storageCard), + if (filter is StoredAlbumFilter && vaults.isVault(filter.album)) _buildDetailIcon(context, AIcons.locked), + if (filter is DynamicAlbumFilter) _buildDetailIcon(context, AIcons.dynamicAlbum), + if (filter is AlbumGroupFilter) ...[ + _buildDetailIcon(context, AIcons.album, padding: detailIconTextPadding(extent)), + Text( + '${NumberFormat.decimalPattern(context.locale).format(albumGrouping.countLeaves(filter.uri))}${AText.separator}', + style: textStyle, + ), + ], + if (filter is TagGroupFilter) ...[ + _buildDetailIcon(context, AIcons.tag, padding: detailIconTextPadding(extent)), + Text( + '${NumberFormat.decimalPattern(context.locale).format(tagGrouping.countLeaves(filter.uri))}${AText.separator}', + style: textStyle, + ), + ], + Flexible( + child: Text( + locked ? AText.valueNotAvailable : NumberFormat.decimalPattern(context.locale).format(source.count(filter)), + style: textStyle, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ), + ], + ); + } + + Widget _buildDetailIcon(BuildContext context, IconData icon, {double? padding}) { + return AnimatedPadding( + padding: EdgeInsetsDirectional.only(end: padding ?? detailIconPadding(extent)), + duration: ADurations.chipDecorationAnimation, + child: Icon( + icon, + color: _detailColor(context), + size: detailIconSize(extent), + ), + ); + } +} diff --git a/lib/widgets/filter_grids/common/draggable_thumb_label.dart b/lib/widgets/filter_grids/common/draggable_thumb_label.dart new file mode 100644 index 0000000..bff3488 --- /dev/null +++ b/lib/widgets/filter_grids/common/draggable_thumb_label.dart @@ -0,0 +1,47 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/grid/draggable_thumb_label.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class FilterDraggableThumbLabel<T extends CollectionFilter> extends StatelessWidget { + final ChipSortFactor sortFactor; + final double offsetY; + + const FilterDraggableThumbLabel({ + super.key, + required this.sortFactor, + required this.offsetY, + }); + + @override + Widget build(BuildContext context) { + return DraggableThumbLabel<FilterGridItem<T>>( + offsetY: offsetY, + lineBuilder: (context, filterGridItem) { + switch (sortFactor) { + case ChipSortFactor.date: + return [ + DraggableThumbLabel.formatMonthThumbLabel(context, filterGridItem.entry?.bestDate), + ]; + case ChipSortFactor.name: + case ChipSortFactor.path: + return [ + filterGridItem.filter.getLabel(context), + ]; + case ChipSortFactor.count: + return [ + context.l10n.itemCount(context.read<CollectionSource>().count(filterGridItem.filter)), + ]; + case ChipSortFactor.size: + return [ + formatFileSize(context.locale, context.read<CollectionSource>().size(filterGridItem.filter)), + ]; + } + }, + ); + } +} diff --git a/lib/widgets/filter_grids/common/enums.dart b/lib/widgets/filter_grids/common/enums.dart new file mode 100644 index 0000000..806e640 --- /dev/null +++ b/lib/widgets/filter_grids/common/enums.dart @@ -0,0 +1,59 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; + +enum ChipType { regular, group } + +enum AlbumChipType { stored, dynamic, group } + +enum AlbumImportance { newAlbum, pinned, group, special, apps, vaults, dynamic, regular } + +extension ExtraAlbumImportance on AlbumImportance { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + AlbumImportance.newAlbum => l10n.albumTierNew, + AlbumImportance.pinned => l10n.albumTierPinned, + AlbumImportance.group => l10n.albumTierGroups, + AlbumImportance.special => l10n.albumTierSpecial, + AlbumImportance.apps => l10n.albumTierApps, + AlbumImportance.vaults => l10n.albumTierVaults, + AlbumImportance.dynamic => l10n.albumTierDynamic, + AlbumImportance.regular => l10n.albumTierRegular, + }; + } + + IconData getIcon() { + return switch (this) { + AlbumImportance.newAlbum => AIcons.newTier, + AlbumImportance.pinned => AIcons.pin, + AlbumImportance.group => AIcons.group, + AlbumImportance.special => AIcons.important, + AlbumImportance.apps => AIcons.app, + AlbumImportance.vaults => AIcons.locked, + AlbumImportance.dynamic => AIcons.dynamicAlbum, + AlbumImportance.regular => AIcons.album, + }; + } +} + +enum AlbumMimeType { images, videos, mixed } + +extension ExtraAlbumMimeType on AlbumMimeType { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + AlbumMimeType.images => l10n.drawerCollectionImages, + AlbumMimeType.videos => l10n.drawerCollectionVideos, + AlbumMimeType.mixed => l10n.albumMimeTypeMixed, + }; + } + + IconData getIcon() { + return switch (this) { + AlbumMimeType.images => AIcons.image, + AlbumMimeType.videos => AIcons.video, + AlbumMimeType.mixed => AIcons.mimeType, + }; + } +} diff --git a/lib/widgets/filter_grids/common/filter_chip_grid_decorator.dart b/lib/widgets/filter_grids/common/filter_chip_grid_decorator.dart new file mode 100644 index 0000000..1ed8368 --- /dev/null +++ b/lib/widgets/filter_grids/common/filter_chip_grid_decorator.dart @@ -0,0 +1,48 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/widgets/common/grid/overlay.dart'; +import 'package:aves/widgets/filter_grids/common/covered_filter_chip.dart'; +import 'package:aves/widgets/filter_grids/common/overlay.dart'; +import 'package:flutter/widgets.dart'; + +class FilterChipGridDecorator<T extends CollectionFilter, U extends FilterGridItem<T>> extends StatelessWidget { + final U gridItem; + final double extent; + final bool selectable, highlightable; + final Widget child; + + const FilterChipGridDecorator({ + super.key, + required this.gridItem, + required this.extent, + this.selectable = true, + this.highlightable = true, + required this.child, + }); + + @override + Widget build(BuildContext context) { + final borderRadius = BorderRadius.all(CoveredFilterChip.radius(extent)); + return SizedBox( + width: extent, + height: extent, + child: Stack( + fit: StackFit.passthrough, + children: [ + child, + if (selectable) + GridItemSelectionOverlay<FilterGridItem<T>>( + item: gridItem, + borderRadius: borderRadius, + padding: EdgeInsets.all(extent / 24), + ), + if (highlightable) + ChipHighlightOverlay( + filter: gridItem.filter, + extent: extent, + borderRadius: borderRadius, + ), + ], + ), + ); + } +} diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart new file mode 100644 index 0000000..ec28225 --- /dev/null +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -0,0 +1,764 @@ +import 'dart:async'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/highlight.dart'; +import 'package:aves/model/query.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/collection/loading.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/notifications.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/scrollbar.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/behaviour/pop/double_back.dart'; +import 'package:aves/widgets/common/behaviour/pop/scope.dart'; +import 'package:aves/widgets/common/behaviour/pop/tv_navigation.dart'; +import 'package:aves/widgets/common/behaviour/sloppy_scroll_physics.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:aves/widgets/common/grid/item_tracker.dart'; +import 'package:aves/widgets/common/grid/scaling.dart'; +import 'package:aves/widgets/common/grid/sections/fixed/scale_grid.dart'; +import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:aves/widgets/common/grid/selector.dart'; +import 'package:aves/widgets/common/grid/sliver.dart'; +import 'package:aves/widgets/common/grid/theme.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/common/identity/scroll_thumb.dart'; +import 'package:aves/widgets/common/providers/filter_group_provider.dart'; +import 'package:aves/widgets/common/providers/tile_extent_controller_provider.dart'; +import 'package:aves/widgets/common/thumbnail/image.dart'; +import 'package:aves/widgets/common/tile_extent_controller.dart'; +import 'package:aves/widgets/filter_grids/common/covered_filter_chip.dart'; +import 'package:aves/widgets/filter_grids/common/draggable_thumb_label.dart'; +import 'package:aves/widgets/filter_grids/common/filter_tile.dart'; +import 'package:aves/widgets/filter_grids/common/list_details_theme.dart'; +import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:aves/widgets/filter_grids/common/section_layout.dart'; +import 'package:aves/widgets/navigation/drawer/app_drawer.dart'; +import 'package:aves/widgets/navigation/nav_bar/nav_bar.dart'; +import 'package:aves/widgets/navigation/tv_rail.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:provider/provider.dart'; + +typedef QueryTest<T extends CollectionFilter> = List<FilterGridItem<T>> Function(BuildContext context, List<FilterGridItem<T>> filters, String query); + +class FilterGridPage<T extends CollectionFilter> extends StatelessWidget { + final String? settingsRouteKey; + final Widget appBar; + final ValueNotifier<double> appBarHeightNotifier; + final ScrollController scrollController; + final Map<ChipSectionKey, List<FilterGridItem<T>>> sections; + final Set<T> newFilters; + final ChipSortFactor sortFactor; + final bool showHeaders, selectable; + final Widget Function() emptyBuilder; + final HeroType heroType; + final Widget? floatingActionButton; + final FilterTileTapCallback<T> onTileTap; + final StreamController<DraggableScrollbarEvent> _draggableScrollBarEventStreamController = StreamController.broadcast(); + + FilterGridPage({ + super.key, + this.settingsRouteKey, + required this.appBar, + required this.appBarHeightNotifier, + required this.scrollController, + required this.sections, + required this.newFilters, + required this.sortFactor, + required this.showHeaders, + required this.selectable, + required this.emptyBuilder, + required this.heroType, + this.floatingActionButton, + required this.onTileTap, + }); + + @override + Widget build(BuildContext context) { + final useTvLayout = settings.useTvLayout; + final body = GestureAreaProtectorStack( + child: DirectionalSafeArea( + start: !useTvLayout, + top: false, + bottom: false, + child: ValueListenableBuilder<double>( + valueListenable: appBarHeightNotifier, + builder: (context, appBarHeight, child) { + return _FilterGrid<T>( + // key is expected by test driver + key: const Key('filter-grid'), + settingsRouteKey: settingsRouteKey, + appBar: appBar, + appBarHeight: MediaQuery.paddingOf(context).top + appBarHeight, + scrollController: scrollController, + sections: sections, + newFilters: newFilters, + sortFactor: sortFactor, + showHeaders: showHeaders, + selectable: selectable, + emptyBuilder: emptyBuilder, + heroType: heroType, + onTileTap: onTileTap, + ); + }, + ), + ), + ); + + if (useTvLayout) { + final canNavigate = context.select<ValueNotifier<AppMode>, bool>((v) => v.value.canNavigate); + return AvesScaffold( + body: canNavigate + ? Row( + children: [ + TvRail( + controller: context.read<TvRailController>(), + ), + Expanded(child: body), + ], + ) + : DirectionalSafeArea( + top: false, + end: false, + bottom: false, + child: body, + ), + resizeToAvoidBottomInset: false, + extendBody: true, + ); + } else { + return Selector<Settings, bool>( + selector: (context, s) => s.enableBottomNavigationBar, + builder: (context, enableBottomNavigationBar, child) { + final canNavigate = context.select<ValueNotifier<AppMode>, bool>((v) => v.value.canNavigate); + final showBottomNavigationBar = canNavigate && enableBottomNavigationBar; + + return NotificationListener<DraggableScrollbarNotification>( + onNotification: (notification) { + _draggableScrollBarEventStreamController.add(notification.event); + return false; + }, + child: AvesScaffold( + body: body, + floatingActionButton: floatingActionButton, + drawer: canNavigate ? const AppDrawer() : null, + bottomNavigationBar: showBottomNavigationBar + ? AppBottomNavBar( + events: _draggableScrollBarEventStreamController.stream, + ) + : null, + resizeToAvoidBottomInset: false, + extendBody: true, + ), + ); + }, + ); + } + } +} + +class _FilterGrid<T extends CollectionFilter> extends StatefulWidget { + final String? settingsRouteKey; + final Widget appBar; + final double appBarHeight; + final ScrollController scrollController; + final Map<ChipSectionKey, List<FilterGridItem<T>>> sections; + final Set<T> newFilters; + final ChipSortFactor sortFactor; + final bool showHeaders, selectable; + final Widget Function() emptyBuilder; + final HeroType heroType; + final FilterTileTapCallback<T> onTileTap; + + const _FilterGrid({ + super.key, + required this.settingsRouteKey, + required this.appBar, + required this.appBarHeight, + required this.scrollController, + required this.sections, + required this.newFilters, + required this.sortFactor, + required this.showHeaders, + required this.selectable, + required this.emptyBuilder, + required this.heroType, + required this.onTileTap, + }); + + @override + State<_FilterGrid<T>> createState() => _FilterGridState<T>(); +} + +class _FilterGridState<T extends CollectionFilter> extends State<_FilterGrid<T>> { + TileExtentController? _tileExtentController; + + @override + void dispose() { + _tileExtentController?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + _tileExtentController ??= TileExtentController( + settingsRouteKey: widget.settingsRouteKey ?? context.currentRouteName!, + columnCountDefault: settings.useTvLayout ? 4 : 3, + extentMin: 60, + extentMax: 300, + spacing: 8, + horizontalPadding: 2, + ); + return AvesPopScope( + handlers: [ + APopHandler( + canPop: (context) => context.select<Selection<FilterGridItem<T>>, bool>((v) => !v.isSelecting), + onPopBlocked: (context) => context.read<Selection<FilterGridItem<T>>>().browse(), + ), + APopHandler( + canPop: (context) => context.read<FilterGroupNotifier?>()?.value == null, + onPopBlocked: (context) { + final filterGroupNotifier = context.read<FilterGroupNotifier>(); + filterGroupNotifier.value = FilterGrouping.getParentGroup(filterGroupNotifier.value); + }, + ), + tvNavigationPopHandler, + doubleBackPopHandler, + ], + child: TileExtentControllerProvider( + controller: _tileExtentController!, + child: _FilterGridContent<T>( + appBar: widget.appBar, + appBarHeight: widget.appBarHeight, + scrollController: widget.scrollController, + sections: widget.sections, + newFilters: widget.newFilters, + sortFactor: widget.sortFactor, + showHeaders: widget.showHeaders, + selectable: widget.selectable, + emptyBuilder: widget.emptyBuilder, + heroType: widget.heroType, + onTileTap: widget.onTileTap, + ), + ), + ); + } +} + +class _FilterGridContent<T extends CollectionFilter> extends StatefulWidget { + final Widget appBar; + final double appBarHeight; + final ScrollController scrollController; + final Map<ChipSectionKey, List<FilterGridItem<T>>> sections; + final Set<T> newFilters; + final ChipSortFactor sortFactor; + final bool showHeaders, selectable; + final Widget Function() emptyBuilder; + final HeroType heroType; + final FilterTileTapCallback<T> onTileTap; + + const _FilterGridContent({ + super.key, + required this.appBar, + required this.appBarHeight, + required this.scrollController, + required this.sections, + required this.newFilters, + required this.sortFactor, + required this.showHeaders, + required this.selectable, + required this.emptyBuilder, + required this.heroType, + required this.onTileTap, + }); + + @override + State<_FilterGridContent<T>> createState() => _FilterGridContentState<T>(); +} + +class _FilterGridContentState<T extends CollectionFilter> extends State<_FilterGridContent<T>> { + final ValueNotifier<double> _appBarHeightNotifier = ValueNotifier(0); + final ValueNotifier<FilterGridItem<T>?> _focusedItemNotifier = ValueNotifier(null); + + @override + void didUpdateWidget(covariant _FilterGridContent<T> oldWidget) { + super.didUpdateWidget(oldWidget); + _appBarHeightNotifier.value = widget.appBarHeight; + } + + @override + void dispose() { + _appBarHeightNotifier.dispose(); + _focusedItemNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final source = context.read<CollectionSource>(); + final settingsRouteKey = context.read<TileExtentController>().settingsRouteKey; + final tileLayout = context.select<Settings, TileLayout>((v) => v.getTileLayout(settingsRouteKey)); + return Selector<Query, bool>( + selector: (context, query) => query.enabled, + builder: (context, queryEnabled, child) { + return ValueListenableBuilder<String>( + valueListenable: context.select<Query, ValueNotifier<String>>((query) => query.queryNotifier), + builder: (context, query, child) { + Map<ChipSectionKey, List<FilterGridItem<T>>> visibleSections; + if (queryEnabled && query.isNotEmpty) { + visibleSections = {}; + final queryUp = query.toUpperCase(); + widget.sections.forEach((sectionKey, sectionFilters) { + final visibleFilters = sectionFilters.where((item) => item.filter.matchLabel(context, queryUp)).toList(); + if (visibleFilters.isNotEmpty) { + visibleSections[sectionKey] = visibleFilters; + } + }); + } else { + visibleSections = widget.sections; + } + + final sectionedListLayoutProvider = ValueListenableBuilder<double>( + valueListenable: context.select<TileExtentController, ValueNotifier<double>>((controller) => controller.extentNotifier), + builder: (context, thumbnailExtent, child) { + return Selector<TileExtentController, (double, int, double, double)>( + selector: (context, c) => (c.viewportSize.width, c.columnCount, c.spacing, c.horizontalPadding), + builder: (context, c, child) { + final (scrollableWidth, columnCount, tileSpacing, horizontalPadding) = c; + // do not listen for animation delay change + final target = context.read<DurationsData>().staggeredAnimationPageTarget; + final tileAnimationDelay = context.read<TileExtentController>().getTileAnimationDelay(target); + + final textScaler = MediaQuery.textScalerOf(context); + final tileHeight = CoveredFilterChip.tileHeight( + extent: thumbnailExtent, + textScaler: textScaler, + showText: tileLayout != TileLayout.list, + ); + return GridTheme( + extent: thumbnailExtent, + child: FilterListDetailsTheme( + extent: thumbnailExtent, + child: AnimatedBuilder( + animation: vaults, + builder: (context, child) { + return SectionedFilterListLayoutProvider<T>( + sections: visibleSections, + showHeaders: widget.showHeaders, + selectable: widget.selectable, + tileLayout: tileLayout, + scrollableWidth: scrollableWidth, + columnCount: columnCount, + spacing: tileSpacing, + horizontalPadding: horizontalPadding, + tileWidth: thumbnailExtent, + tileHeight: tileHeight, + tileBuilder: (gridItem, tileSize) { + final extent = tileSize.shortestSide; + final tile = InteractiveFilterTile( + gridItem: gridItem, + chipExtent: extent, + thumbnailExtent: extent, + tileLayout: tileLayout, + banner: _getFilterBanner(context, gridItem.filter), + heroType: widget.heroType, + onTap: widget.onTileTap, + ); + if (!settings.useTvLayout) return tile; + + return Focus( + onFocusChange: (focused) { + if (focused) { + _focusedItemNotifier.value = gridItem; + } else if (_focusedItemNotifier.value == gridItem) { + _focusedItemNotifier.value = null; + } + }, + child: ValueListenableBuilder<FilterGridItem<T>?>( + valueListenable: _focusedItemNotifier, + builder: (context, focusedItem, child) { + return AnimatedScale( + scale: focusedItem == gridItem ? 1 : .9, + curve: Curves.fastOutSlowIn, + duration: context.select<DurationsData, Duration>((v) => v.tvImageFocusAnimation), + child: child!, + ); + }, + child: tile, + ), + ); + }, + tileAnimationDelay: tileAnimationDelay, + coverRatioResolver: (item) { + final coverEntry = source.coverEntry(item.filter) ?? item.entry; + return coverEntry?.displayAspectRatio ?? 1; + }, + child: child!, + ); + }, + child: child, + ), + ), + ); + }, + child: child, + ); + }, + child: _FilterSectionedContent<T>( + appBar: widget.appBar, + appBarHeightNotifier: _appBarHeightNotifier, + visibleSections: visibleSections, + sortFactor: widget.sortFactor, + selectable: widget.selectable, + emptyBuilder: widget.emptyBuilder, + bannerBuilder: _getFilterBanner, + scrollController: widget.scrollController, + tileLayout: tileLayout, + ), + ); + return sectionedListLayoutProvider; + }, + ); + }, + ); + } + + String? _getFilterBanner(BuildContext context, T filter) { + final isNew = widget.newFilters.contains(filter); + return isNew ? context.l10n.newFilterBanner : null; + } +} + +class _FilterSectionedContent<T extends CollectionFilter> extends StatefulWidget { + final Widget appBar; + final ValueNotifier<double> appBarHeightNotifier; + final Map<ChipSectionKey, List<FilterGridItem<T>>> visibleSections; + final ChipSortFactor sortFactor; + final bool selectable; + final Widget Function() emptyBuilder; + final String? Function(BuildContext context, T filter) bannerBuilder; + final ScrollController scrollController; + final TileLayout tileLayout; + + const _FilterSectionedContent({ + required this.appBar, + required this.appBarHeightNotifier, + required this.visibleSections, + required this.sortFactor, + required this.selectable, + required this.emptyBuilder, + required this.bannerBuilder, + required this.scrollController, + required this.tileLayout, + }); + + @override + State<_FilterSectionedContent<T>> createState() => _FilterSectionedContentState<T>(); +} + +class _FilterSectionedContentState<T extends CollectionFilter> extends State<_FilterSectionedContent<T>> { + Widget get appBar => widget.appBar; + + ValueNotifier<double> get appBarHeightNotifier => widget.appBarHeightNotifier; + + TileLayout get tileLayout => widget.tileLayout; + + Map<ChipSectionKey, List<FilterGridItem<T>>> get visibleSections => widget.visibleSections; + + Widget Function() get emptyBuilder => widget.emptyBuilder; + + ScrollController get scrollController => widget.scrollController; + + final GlobalKey scrollableKey = GlobalKey(debugLabel: 'filter-grid-page-scrollable'); + + FilterGroupNotifier? _groupNotifier; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + WidgetsBinding.instance.addPostFrameCallback((_) => _checkInitHighlight()); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _unregisterDependencies(); + _groupNotifier = context.read<FilterGroupNotifier?>(); + _registerDependencies(); + } + + @override + void didUpdateWidget(covariant _FilterSectionedContent<T> oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterDependencies(); + _unregisterWidget(widget); + super.dispose(); + } + + void _registerDependencies() { + _groupNotifier?.addListener(_scrollToTop); + } + + void _unregisterDependencies() { + _groupNotifier?.removeListener(_scrollToTop); + } + + void _registerWidget(_FilterSectionedContent<T> widget) { + widget.appBarHeightNotifier.addListener(_onAppBarHeightChanged); + } + + void _unregisterWidget(_FilterSectionedContent<T> widget) { + widget.appBarHeightNotifier.removeListener(_onAppBarHeightChanged); + } + + @override + Widget build(BuildContext context) { + final scrollView = _FilterScrollView<T>( + scrollableKey: scrollableKey, + appBar: appBar, + appBarHeightNotifier: appBarHeightNotifier, + sortFactor: widget.sortFactor, + emptyBuilder: emptyBuilder, + scrollController: scrollController, + ); + + final scaler = _FilterScaler<T>( + scrollableKey: scrollableKey, + appBarHeightNotifier: appBarHeightNotifier, + tileLayout: tileLayout, + bannerBuilder: widget.bannerBuilder, + child: scrollView, + ); + + final selector = GridSelectionGestureDetector<FilterGridItem<T>>( + scrollableKey: scrollableKey, + selectable: context.select<ValueNotifier<AppMode>, bool>((v) => v.value.canSelectFilter) && widget.selectable, + items: visibleSections.values.expand((v) => v).toList(), + scrollController: scrollController, + appBarHeightNotifier: appBarHeightNotifier, + child: scaler, + ); + + return GridItemTracker<FilterGridItem<T>>( + scrollableKey: scrollableKey, + tileLayout: tileLayout, + appBarHeightNotifier: appBarHeightNotifier, + scrollController: scrollController, + child: selector, + ); + } + + void _onAppBarHeightChanged() => setState(() {}); + + Future<void> _checkInitHighlight() async { + final highlightInfo = context.read<HighlightInfo>(); + final filter = highlightInfo.clear(); + if (filter is! T) return; + + final item = visibleSections.values.expand((list) => list).firstWhereOrNull((gridItem) => gridItem.filter == filter); + if (item == null) return; + + await Future.delayed(ADurations.highlightScrollInitDelay); + + final animate = context.read<Settings>().animate; + highlightInfo.trackItem(item, animate: animate, highlightItem: filter); + } + + void _scrollToTop() => widget.scrollController.jumpTo(0); +} + +class _FilterScaler<T extends CollectionFilter> extends StatelessWidget { + final GlobalKey scrollableKey; + final ValueNotifier<double> appBarHeightNotifier; + final TileLayout tileLayout; + final String? Function(BuildContext context, T filter) bannerBuilder; + final Widget child; + + const _FilterScaler({ + required this.scrollableKey, + required this.appBarHeightNotifier, + required this.tileLayout, + required this.bannerBuilder, + required this.child, + }); + + @override + Widget build(BuildContext context) { + final textScaler = MediaQuery.textScalerOf(context); + final (tileSpacing, horizontalPadding) = context.select<TileExtentController, (double, double)>((v) => (v.spacing, v.horizontalPadding)); + final brightness = Theme.of(context).brightness; + return GridScaleGestureDetector<FilterGridItem<T>>( + scrollableKey: scrollableKey, + tileLayout: tileLayout, + heightForWidth: (width) => CoveredFilterChip.tileHeight(extent: width, textScaler: textScaler, showText: true), + gridBuilder: (center, tileSize, child) => CustomPaint( + painter: FixedExtentGridPainter( + tileLayout: tileLayout, + tileCenter: center, + tileSize: tileSize, + spacing: tileSpacing, + horizontalPadding: horizontalPadding, + borderWidth: AvesFilterChip.outlineWidth, + borderRadius: CoveredFilterChip.radius(tileSize.shortestSide), + color: Colors.grey.shade700, + textDirection: Directionality.of(context), + ), + child: child, + ), + scaledItemBuilder: (item, tileSize) => FilterListDetailsTheme( + extent: tileSize.height, + child: FilterTile( + gridItem: item, + chipExtent: tileLayout == TileLayout.grid ? tileSize.width : tileSize.height, + thumbnailExtent: context.read<TileExtentController>().effectiveExtentMax, + tileLayout: tileLayout, + banner: bannerBuilder(context, item.filter), + ), + ), + mosaicItemBuilder: (index, targetExtent) => DecoratedBox( + decoration: BoxDecoration( + color: ThumbnailImage.computeLoadingBackgroundColor(index * 10, brightness).withValues(alpha: .9), + border: Border.all( + color: context.read<AvesColorsData>().neutral, + width: AvesFilterChip.outlineWidth, + ), + borderRadius: BorderRadius.all(CoveredFilterChip.radius(targetExtent)), + ), + ), + highlightItem: (item) => item.filter, + child: child, + ); + } +} + +class _FilterScrollView<T extends CollectionFilter> extends StatelessWidget { + final GlobalKey scrollableKey; + final Widget appBar; + final ValueNotifier<double> appBarHeightNotifier; + final ChipSortFactor sortFactor; + final Widget Function() emptyBuilder; + final ScrollController scrollController; + + const _FilterScrollView({ + required this.scrollableKey, + required this.appBar, + required this.appBarHeightNotifier, + required this.sortFactor, + required this.emptyBuilder, + required this.scrollController, + }); + + @override + Widget build(BuildContext context) { + final scrollView = _buildScrollView(context); + return settings.useTvLayout ? scrollView : _buildDraggableScrollView(scrollView); + } + + Widget _buildDraggableScrollView(Widget scrollView) { + return ValueListenableBuilder<double>( + valueListenable: appBarHeightNotifier, + builder: (context, appBarHeight, child) { + return Selector<MediaQueryData, double>( + selector: (context, mq) => mq.effectiveBottomPadding, + builder: (context, mqPaddingBottom, child) { + return Selector<Settings, bool>( + selector: (context, s) => s.enableBottomNavigationBar, + builder: (context, enableBottomNavigationBar, child) { + final canNavigate = context.select<ValueNotifier<AppMode>, bool>((v) => v.value.canNavigate); + final showBottomNavigationBar = canNavigate && enableBottomNavigationBar; + final navBarHeight = showBottomNavigationBar ? AppBottomNavBar.height : 0; + return DraggableScrollbar( + backgroundColor: Colors.white, + scrollThumbSize: Size(avesScrollThumbWidth, avesScrollThumbHeight), + scrollThumbBuilder: avesScrollThumbBuilder( + height: avesScrollThumbHeight, + backgroundColor: Colors.white, + ), + controller: scrollController, + padding: EdgeInsets.only( + // padding to keep scroll thumb between app bar above and nav bar below + top: appBarHeight, + bottom: navBarHeight + mqPaddingBottom, + ), + labelTextBuilder: (offsetY) => FilterDraggableThumbLabel<T>( + sortFactor: sortFactor, + offsetY: offsetY, + ), + crumbTextBuilder: (offsetY) => const SizedBox(), + child: scrollView, + ); + }, + ); + }, + ); + }, + ); + } + + Widget _buildScrollView(BuildContext context) { + return Selector<SectionedListLayout<FilterGridItem<T>>, bool>( + selector: (context, layout) => layout.sections.isEmpty, + builder: (context, isEmpty, child) { + return CustomScrollView( + key: scrollableKey, + controller: scrollController, + // workaround to prevent scrolling the app bar away + // when there is no content and we use `SliverFillRemaining` + physics: isEmpty + ? const NeverScrollableScrollPhysics() + : SloppyScrollPhysics( + gestureSettings: MediaQuery.gestureSettingsOf(context), + parent: const AlwaysScrollableScrollPhysics(), + ), + slivers: [ + appBar, + AnimationLimiter( + key: ValueKey(context.select<FilterGroupNotifier?, Uri?>((v) => v?.value)), + child: isEmpty + ? SliverFillRemaining( + hasScrollBody: false, + child: _buildEmptyContent(context), + ) + : SectionedListSliver<FilterGridItem<T>>(), + ), + const NavBarPaddingSliver(), + const BottomPaddingSliver(), + const TvTileGridBottomPaddingSliver(), + ], + ); + }, + ); + } + + Widget _buildEmptyContent(BuildContext context) { + final source = context.read<CollectionSource>(); + return ValueListenableBuilder<SourceState>( + valueListenable: source.stateNotifier, + builder: (context, sourceState, child) { + if (sourceState == SourceState.loading) { + return LoadingEmptyContent(source: source); + } + + return emptyBuilder(); + }, + ); + } +} diff --git a/lib/widgets/filter_grids/common/filter_nav_page.dart b/lib/widgets/filter_grids/common/filter_nav_page.dart new file mode 100644 index 0000000..d4498e3 --- /dev/null +++ b/lib/widgets/filter_grids/common/filter_nav_page.dart @@ -0,0 +1,194 @@ +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/group_base.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/vault_aware.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/common/providers/filter_group_provider.dart'; +import 'package:aves/widgets/common/providers/query_provider.dart'; +import 'package:aves/widgets/common/providers/selection_provider.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; +import 'package:aves/widgets/filter_grids/common/app_bar.dart'; +import 'package:aves/widgets/filter_grids/common/filter_grid_page.dart'; +import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class FilterNavigationPage<T extends CollectionFilter, CSAD extends ChipSetActionDelegate<T>> extends StatefulWidget { + final CollectionSource source; + final String title; + final ChipSortFactor sortFactor; + final bool showHeaders; + final CSAD actionDelegate; + final Map<ChipSectionKey, List<FilterGridItem<T>>> filterSections; + final Set<T>? newFilters; + final Widget Function() emptyBuilder; + + const FilterNavigationPage({ + super.key, + required this.source, + required this.title, + required this.sortFactor, + this.showHeaders = false, + required this.actionDelegate, + required this.filterSections, + this.newFilters, + required this.emptyBuilder, + }); + + @override + State<FilterNavigationPage<T, CSAD>> createState() => _FilterNavigationPageState<T, CSAD>(); + + static int compareFiltersByDate(FilterGridItem<CollectionFilter> a, FilterGridItem<CollectionFilter> b) { + final c = (b.entry?.bestDate ?? epoch).compareTo(a.entry?.bestDate ?? epoch); + return c != 0 ? c : a.filter.compareTo(b.filter); + } + + static int compareFiltersByEntryCount(MapEntry<CollectionFilter, num> a, MapEntry<CollectionFilter, num> b) { + final c = b.value.compareTo(a.value); + return c != 0 ? c : a.key.compareTo(b.key); + } + + static int compareFiltersBySize(MapEntry<CollectionFilter, num> a, MapEntry<CollectionFilter, num> b) { + final c = b.value.compareTo(a.value); + return c != 0 ? c : a.key.compareTo(b.key); + } + + static int compareFiltersByName(FilterGridItem<CollectionFilter> a, FilterGridItem<CollectionFilter> b) { + return a.filter.compareTo(b.filter); + } + + static int compareFiltersByPath<T extends CollectionFilter>(FilterGridItem<T> a, FilterGridItem<T> b) { + if (T == AlbumBaseFilter) { + final filterA = a.filter; + final filterB = b.filter; + final pathA = filterA is StoredAlbumFilter ? filterA.album : ''; + final pathB = filterB is StoredAlbumFilter ? filterB.album : ''; + final c = pathA.compareTo(pathB); + return c != 0 ? c : a.filter.compareTo(b.filter); + } + return 0; + } + + static List<FilterGridItem<T>> sort<T extends CollectionFilter, CSAD extends ChipSetActionDelegate<T>>( + ChipSortFactor sortFactor, + bool reverse, + CollectionSource source, + Set<T> filters, + ) { + List<FilterGridItem<T>> toGridItem(CollectionSource source, Set<T> filters) { + return filters + .map( + (filter) => FilterGridItem( + filter, + source.recentEntry(filter), + ), + ) + .toList(); + } + + List<FilterGridItem<T>> allMapEntries = []; + switch (sortFactor) { + case ChipSortFactor.name: + allMapEntries = toGridItem(source, filters)..sort(compareFiltersByName); + case ChipSortFactor.date: + allMapEntries = toGridItem(source, filters)..sort(compareFiltersByDate); + case ChipSortFactor.count: + final filtersWithCount = List.of(filters.map((filter) => MapEntry(filter, source.count(filter)))); + filtersWithCount.sort(compareFiltersByEntryCount); + filters = filtersWithCount.map((kv) => kv.key).toSet(); + allMapEntries = toGridItem(source, filters); + case ChipSortFactor.size: + final filtersWithSize = List.of(filters.map((filter) => MapEntry(filter, source.size(filter)))); + filtersWithSize.sort(compareFiltersBySize); + filters = filtersWithSize.map((kv) => kv.key).toSet(); + allMapEntries = toGridItem(source, filters); + case ChipSortFactor.path: + allMapEntries = toGridItem(source, filters)..sort(compareFiltersByPath); + } + if (reverse) { + allMapEntries = allMapEntries.reversed.toList(); + } + return allMapEntries; + } +} + +class _FilterNavigationPageState<T extends CollectionFilter, CSAD extends ChipSetActionDelegate<T>> extends State<FilterNavigationPage<T, CSAD>> with FeedbackMixin, VaultAwareMixin { + final ValueNotifier<double> _appBarHeightNotifier = ValueNotifier(0); + + @override + void dispose() { + _appBarHeightNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SelectionProvider<FilterGridItem<T>>( + child: Builder( + builder: (context) { + final scrollController = PrimaryScrollController.of(context); + return QueryProvider( + startEnabled: settings.getShowTitleQuery(context.currentRouteName!), + child: FilterGridPage<T>( + appBar: FilterGridAppBar<T, CSAD>( + source: widget.source, + title: widget.title, + actionDelegate: widget.actionDelegate, + isEmpty: widget.filterSections.isEmpty, + appBarHeightNotifier: _appBarHeightNotifier, + scrollController: scrollController, + ), + appBarHeightNotifier: _appBarHeightNotifier, + scrollController: scrollController, + sections: widget.filterSections, + newFilters: widget.newFilters ?? {}, + sortFactor: widget.sortFactor, + showHeaders: widget.showHeaders, + selectable: true, + emptyBuilder: () => ValueListenableBuilder<SourceState>( + valueListenable: widget.source.stateNotifier, + builder: (context, sourceState, child) { + return sourceState != SourceState.loading ? widget.emptyBuilder() : const SizedBox(); + }, + ), + // do not always enable hero, otherwise unwanted hero gets triggered + // when using `Show in [...]` action from a chip in the Collection filter bar + heroType: HeroType.onTap, + onTileTap: (gridItem, navigate) async { + final selection = context.read<Selection<FilterGridItem<T>>?>(); + if (selection != null && selection.isSelecting) { + selection.toggleSelection(gridItem); + } else { + final filter = gridItem.filter; + if (!await unlockFilter(context, filter)) return; + + if (filter is GroupBaseFilter) { + context.read<FilterGroupNotifier>().value = filter.uri; + } else { + final route = MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) => CollectionPage( + source: context.read<CollectionSource>(), + filters: {gridItem.filter}, + ), + ); + navigate(route); + } + } + }, + ), + ); + }, + ), + ); + } +} diff --git a/lib/widgets/filter_grids/common/filter_tile.dart b/lib/widgets/filter_grids/common/filter_tile.dart new file mode 100644 index 0000000..6386dd1 --- /dev/null +++ b/lib/widgets/filter_grids/common/filter_tile.dart @@ -0,0 +1,167 @@ +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/grid/scaling.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/filter_grids/common/covered_filter_chip.dart'; +import 'package:aves/widgets/filter_grids/common/filter_chip_grid_decorator.dart'; +import 'package:aves/widgets/filter_grids/common/list_details.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +typedef FilterTileTapCallback<T extends CollectionFilter> = void Function(FilterGridItem<T> gridItem, void Function(Route route) navigate); + +class InteractiveFilterTile<T extends CollectionFilter> extends StatefulWidget { + final FilterGridItem<T> gridItem; + final double chipExtent, thumbnailExtent; + final TileLayout tileLayout; + final String? banner; + final HeroType heroType; + final FilterTileTapCallback<T> onTap; + + const InteractiveFilterTile({ + super.key, + required this.gridItem, + required this.chipExtent, + required this.thumbnailExtent, + required this.tileLayout, + this.banner, + required this.heroType, + required this.onTap, + }); + + @override + State<InteractiveFilterTile<T>> createState() => _InteractiveFilterTileState<T>(); +} + +class _InteractiveFilterTileState<T extends CollectionFilter> extends State<InteractiveFilterTile<T>> { + HeroType? _heroTypeOverride; + + FilterGridItem<T> get gridItem => widget.gridItem; + + HeroType get effectiveHeroType => _heroTypeOverride ?? widget.heroType; + + @override + Widget build(BuildContext context) { + return MetaData( + metaData: ScalerMetadata(gridItem), + child: FilterTile( + gridItem: gridItem, + chipExtent: widget.chipExtent, + thumbnailExtent: widget.thumbnailExtent, + tileLayout: widget.tileLayout, + banner: widget.banner, + selectable: true, + highlightable: true, + onTap: (_) => widget.onTap(gridItem, _navigate), + heroType: effectiveHeroType, + ), + ); + } + + void _navigate(Route route) { + if (effectiveHeroType == HeroType.onTap) { + // make sure the chip hero triggers, even when tapping on the list view details + setState(() => _heroTypeOverride = HeroType.always); + } + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; + Navigator.maybeOf(context)?.push(route); + }); + } +} + +class FilterTile<T extends CollectionFilter> extends StatelessWidget { + final FilterGridItem<T> gridItem; + final double chipExtent, thumbnailExtent; + final TileLayout tileLayout; + final String? banner; + final bool selectable, highlightable; + final AFilterCallback? onTap; + final HeroType heroType; + + const FilterTile({ + super.key, + required this.gridItem, + required this.chipExtent, + required this.thumbnailExtent, + required this.tileLayout, + this.banner, + this.selectable = false, + this.highlightable = false, + this.onTap, + this.heroType = HeroType.never, + }); + + @override + Widget build(BuildContext context) { + final filter = gridItem.filter; + final pinned = settings.pinnedFilters.contains(filter); + final locked = filter is StoredAlbumFilter && vaults.isLocked(filter.album); + final _onTap = onTap; + + switch (tileLayout) { + case TileLayout.mosaic: + case TileLayout.grid: + return FilterChipGridDecorator<T, FilterGridItem<T>>( + gridItem: gridItem, + extent: chipExtent, + selectable: selectable, + highlightable: highlightable, + child: CoveredFilterChip( + filter: filter, + extent: chipExtent, + thumbnailExtent: thumbnailExtent, + showText: true, + pinned: pinned, + locked: locked, + banner: banner, + onTap: _onTap, + heroType: heroType, + ), + ); + case TileLayout.list: + Widget child = Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + FilterChipGridDecorator<T, FilterGridItem<T>>( + gridItem: gridItem, + extent: chipExtent, + selectable: selectable, + highlightable: highlightable, + child: CoveredFilterChip( + filter: filter, + extent: chipExtent, + thumbnailExtent: thumbnailExtent, + showText: false, + locked: locked, + banner: banner, + onTap: _onTap, + heroType: heroType, + ), + ), + Expanded( + child: FilterListDetails( + gridItem: gridItem, + pinned: pinned, + locked: locked, + ), + ), + ], + ); + if (_onTap != null) { + // larger than the chip corner radius, so ink effects will be effectively clipped from the leading chip corners + const radius = Radius.circular(123); + child = InkWell( + // as of Flutter v2.8.1, `InkWell` does not use `BorderRadiusGeometry` + borderRadius: context.isRtl ? const BorderRadius.only(topRight: radius, bottomRight: radius) : const BorderRadius.only(topLeft: radius, bottomLeft: radius), + onTap: () => _onTap(filter), + child: child, + ); + } + return child; + } + } +} diff --git a/lib/widgets/filter_grids/common/group_crumb_line.dart b/lib/widgets/filter_grids/common/group_crumb_line.dart new file mode 100644 index 0000000..b0d8546 --- /dev/null +++ b/lib/widgets/filter_grids/common/group_crumb_line.dart @@ -0,0 +1,44 @@ +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/app_bar/crumb_line.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; + +class FilterGroupCrumbLine extends StatelessWidget { + final Uri? groupUri; + final void Function(Uri? groupUri) onTap; + + const FilterGroupCrumbLine({ + super.key, + required this.groupUri, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return CrumbLine<Uri?>( + split: _split, + combine: _combine, + onTap: onTap, + ); + } + + List<String> _split(BuildContext context) { + final path = FilterGrouping.getGroupPath(groupUri); + final crumbs = [context.l10n.ungrouped]; + if (path != null) { + crumbs.addAll(pContext.split(path)); + } + return crumbs; + } + + Uri? _combine(BuildContext context, int index) { + if (groupUri == null || index == 0) return null; + + var targetGroupUri = groupUri; + for (var i = _split(context).length - 1; i > index; i--) { + targetGroupUri = FilterGrouping.getParentGroup(targetGroupUri); + } + return targetGroupUri; + } +} diff --git a/lib/widgets/filter_grids/common/list_details.dart b/lib/widgets/filter_grids/common/list_details.dart new file mode 100644 index 0000000..b8e6e10 --- /dev/null +++ b/lib/widgets/filter_grids/common/list_details.dart @@ -0,0 +1,169 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/container/group_base.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/theme/format.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:aves/widgets/filter_grids/common/list_details_theme.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class FilterListDetails<T extends CollectionFilter> extends StatelessWidget { + final FilterGridItem<T> gridItem; + final bool pinned, locked; + + T get filter => gridItem.filter; + + AvesEntry? get entry => gridItem.entry; + + const FilterListDetails({ + super.key, + required this.gridItem, + required this.pinned, + required this.locked, + }); + + @override + Widget build(BuildContext context) { + final detailsTheme = context.watch<FilterListDetailsThemeData>(); + + final leading = filter.iconBuilder(context, detailsTheme.titleIconSize, allowGenericIcon: false); + final hasTitleLeading = leading != null; + + return Container( + padding: FilterListDetailsTheme.contentPadding, + foregroundDecoration: BoxDecoration( + border: Border(top: AvesBorder.straightSide(context)), + ), + margin: FilterListDetailsTheme.contentMargin, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text.rich( + TextSpan( + children: [ + if (hasTitleLeading) + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Padding( + padding: const EdgeInsetsDirectional.only(end: FilterListDetailsTheme.titleIconPadding), + child: IconTheme( + data: IconThemeData(color: detailsTheme.titleStyle.color), + child: leading, + ), + ), + ), + TextSpan( + text: filter.getLabel(context), + style: detailsTheme.titleStyle, + ), + ], + ), + softWrap: false, + overflow: detailsTheme.titleMaxLines == 1 ? TextOverflow.fade : TextOverflow.ellipsis, + maxLines: detailsTheme.titleMaxLines, + // `textScaler` is applied to font size and icon size at the theme level, + // otherwise the leading icon will be low-res scaled up/down + textScaler: TextScaler.noScaling, + ), + if (!locked) ...[ + const SizedBox(height: FilterListDetailsTheme.titleDetailPadding), + if (detailsTheme.showDate) _buildDateRow(context, detailsTheme, hasTitleLeading), + if (detailsTheme.showCount) _buildCountRow(context, detailsTheme, hasTitleLeading), + ], + ], + ), + ); + } + + Widget _buildDateRow(BuildContext context, FilterListDetailsThemeData detailsTheme, bool hasTitleLeading) { + final use24hour = MediaQuery.alwaysUse24HourFormatOf(context); + final date = entry?.bestDate; + final dateText = date != null ? formatDateTime(date, context.locale, use24hour) : AText.valueNotAvailable; + + Widget leading = const Icon(AIcons.date); + if (hasTitleLeading) { + leading = ConstrainedBox( + constraints: BoxConstraints(minWidth: detailsTheme.titleIconSize), + child: leading, + ); + } + return IconTheme.merge( + data: detailsTheme.captionIconTheme, + child: Row( + children: [ + leading, + const SizedBox(width: 8), + Expanded( + child: Text( + dateText, + style: detailsTheme.captionStyle, + softWrap: false, + overflow: TextOverflow.fade, + ), + ), + ], + ), + ); + } + + Widget _buildCountRow(BuildContext context, FilterListDetailsThemeData detailsTheme, bool hasTitleLeading) { + final _filter = filter; + final removableStorage = _filter is StoredAlbumFilter && androidFileUtils.isOnRemovableStorage(_filter.album); + + List<Widget> leadingIcons = [ + if (pinned) const Icon(AIcons.pin), + if (removableStorage) const Icon(AIcons.storageCard), + if (_filter is DynamicAlbumFilter) const Icon(AIcons.dynamicAlbum), + if (_filter is GroupBaseFilter) const Icon(AIcons.group), + ]; + + Widget? leading; + if (leadingIcons.isNotEmpty) { + leading = Row( + children: leadingIcons + .mapIndexed( + (i, child) => i > 0 + ? Padding( + padding: const EdgeInsetsDirectional.only(start: 8), + child: child, + ) + : child, + ) + .toList(), + ); + } + + leading = ConstrainedBox( + constraints: BoxConstraints(minWidth: hasTitleLeading ? detailsTheme.titleIconSize : detailsTheme.captionIconTheme.size!), + child: Center(child: leading ?? const SizedBox()), + ); + + final source = context.read<CollectionSource>(); + + return IconTheme.merge( + data: detailsTheme.captionIconTheme, + child: Row( + children: [ + leading, + const SizedBox(width: 8), + Text( + '${context.l10n.itemCount(source.count(filter))} • ${formatFileSize(context.locale, source.size(filter))}', + style: detailsTheme.captionStyle, + softWrap: false, + overflow: TextOverflow.fade, + ), + ], + ), + ); + } +} diff --git a/lib/widgets/filter_grids/common/list_details_theme.dart b/lib/widgets/filter_grids/common/list_details_theme.dart new file mode 100644 index 0000000..b828d16 --- /dev/null +++ b/lib/widgets/filter_grids/common/list_details_theme.dart @@ -0,0 +1,120 @@ +import 'dart:math'; + +import 'package:aves/theme/format.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/common/tile_extent_controller.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:provider/provider.dart'; + +class FilterListDetailsTheme extends StatelessWidget { + final double extent; + final Widget child; + + static const EdgeInsets contentMargin = EdgeInsets.symmetric(horizontal: 8); + static const EdgeInsets contentPadding = EdgeInsets.symmetric(vertical: 4); + static const double titleIconPadding = 8; + static const double titleDetailPadding = 6; + + const FilterListDetailsTheme({ + super.key, + required this.extent, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return ProxyProvider<MediaQueryData, FilterListDetailsThemeData>( + update: (context, mq, previous) { + final use24hour = mq.alwaysUse24HourFormat; + final textScaler = mq.textScaler; + + final textTheme = Theme.of(context).textTheme; + var titleStyle = textTheme.bodyMedium!; + var captionStyle = textTheme.bodySmall!; + // specify `height` for accurate paragraph height measurement + final defaultTextHeight = DefaultTextStyle.of(context).style.height; + titleStyle = titleStyle.copyWith( + fontSize: textScaler.scale(titleStyle.fontSize!), + height: titleStyle.height ?? defaultTextHeight, + ); + captionStyle = captionStyle.copyWith(height: captionStyle.height ?? defaultTextHeight); + + final titleIconSize = textScaler.scale(AvesFilterChip.iconSize); + final titleLineHeightParagraph = RenderParagraph( + TextSpan(text: 'Fake Title', style: titleStyle), + textDirection: TextDirection.ltr, + textScaler: textScaler, + )..layout(const BoxConstraints(), parentUsesSize: true); + final titleLineHeight = titleLineHeightParagraph.getMaxIntrinsicHeight(double.infinity); + titleLineHeightParagraph.dispose(); + + final captionLineHeightParagraph = RenderParagraph( + TextSpan(text: formatDateTime(DateTime.now(), context.locale, use24hour), style: captionStyle), + textDirection: TextDirection.ltr, + textScaler: textScaler, + )..layout(const BoxConstraints(), parentUsesSize: true); + final captionLineHeight = captionLineHeightParagraph.getMaxIntrinsicHeight(double.infinity); + captionLineHeightParagraph.dispose(); + + var titleMaxLines = 1; + var showCount = false; + var showDate = false; + + final gridExtentMin = context.read<TileExtentController>().effectiveExtentMin; + final isMinExtent = (extent - gridExtentMin).abs() < precisionErrorTolerance; + + var availableHeight = extent - contentMargin.vertical - contentPadding.vertical; + final firstTitleLineHeight = max(titleLineHeight, titleIconSize); + if (availableHeight >= firstTitleLineHeight + titleDetailPadding + captionLineHeight) { + showCount = true; + availableHeight -= firstTitleLineHeight + titleDetailPadding + captionLineHeight; + if (availableHeight >= captionLineHeight) { + showDate = true; + availableHeight -= captionLineHeight; + titleMaxLines += availableHeight ~/ titleLineHeight; + } + } + + return FilterListDetailsThemeData( + extent: extent, + titleMaxLines: titleMaxLines, + isMinExtent: isMinExtent, + showCount: showCount, + showDate: showDate, + titleStyle: titleStyle, + captionStyle: captionStyle, + titleIconSize: titleIconSize, + captionIconTheme: IconThemeData( + color: captionStyle.color, + size: textScaler.scale(captionStyle.fontSize!), + ), + ); + }, + child: child, + ); + } +} + +class FilterListDetailsThemeData { + final double extent; + final int titleMaxLines; + final bool isMinExtent, showCount, showDate; + final TextStyle titleStyle, captionStyle; + final double titleIconSize; + final IconThemeData captionIconTheme; + + const FilterListDetailsThemeData({ + required this.extent, + required this.titleMaxLines, + required this.isMinExtent, + required this.showCount, + required this.showDate, + required this.titleStyle, + required this.captionStyle, + required this.titleIconSize, + required this.captionIconTheme, + }); +} diff --git a/lib/widgets/filter_grids/common/overlay.dart b/lib/widgets/filter_grids/common/overlay.dart new file mode 100644 index 0000000..eeaca60 --- /dev/null +++ b/lib/widgets/filter_grids/common/overlay.dart @@ -0,0 +1,58 @@ +import 'dart:math'; + +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/highlight.dart'; +import 'package:aves/widgets/common/fx/sweeper.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ChipHighlightOverlay extends StatefulWidget { + final CollectionFilter filter; + final double extent; + final BorderRadius borderRadius; + + const ChipHighlightOverlay({ + super.key, + required this.filter, + required this.extent, + required this.borderRadius, + }); + + @override + State<ChipHighlightOverlay> createState() => _ChipHighlightOverlayState(); +} + +class _ChipHighlightOverlayState extends State<ChipHighlightOverlay> { + final ValueNotifier<bool> _highlightedNotifier = ValueNotifier(false); + + CollectionFilter get filter => widget.filter; + + @override + void dispose() { + _highlightedNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final highlightInfo = context.watch<HighlightInfo>(); + _highlightedNotifier.value = highlightInfo.contains(filter); + return Sweeper( + builder: (context) => Container( + decoration: BoxDecoration( + border: Border.fromBorderSide( + BorderSide( + color: Theme.of(context).colorScheme.primary, + width: widget.extent * .1, + ), + ), + borderRadius: widget.borderRadius, + ), + ), + toggledNotifier: _highlightedNotifier, + startAngle: pi * -3 / 4, + centerSweep: false, + onSweepEnd: highlightInfo.clear, + ); + } +} diff --git a/lib/widgets/filter_grids/common/query_bar.dart b/lib/widgets/filter_grids/common/query_bar.dart new file mode 100644 index 0000000..5e4452b --- /dev/null +++ b/lib/widgets/filter_grids/common/query_bar.dart @@ -0,0 +1,37 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/widgets/common/basic/query_bar.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class FilterQueryBar<T extends CollectionFilter> extends StatelessWidget { + final ValueNotifier<String> queryNotifier; + final FocusNode focusNode; + + const FilterQueryBar({ + super.key, + required this.queryNotifier, + required this.focusNode, + }); + + @override + Widget build(BuildContext context) { + final textScaler = MediaQuery.textScalerOf(context); + return Container( + height: getPreferredHeight(textScaler), + alignment: Alignment.topCenter, + child: Selector<Selection<FilterGridItem<T>>, bool>( + selector: (context, selection) => !selection.isSelecting, + builder: (context, editable, child) => QueryBar( + queryNotifier: queryNotifier, + focusNode: focusNode, + hintText: context.l10n.collectionSearchTitlesHintText, + editable: editable, + ), + ), + ); + } + + static double getPreferredHeight(TextScaler textScaler) => QueryBar.getPreferredHeight(textScaler); +} diff --git a/lib/widgets/filter_grids/common/section_header.dart b/lib/widgets/filter_grids/common/section_header.dart new file mode 100644 index 0000000..597f0ab --- /dev/null +++ b/lib/widgets/filter_grids/common/section_header.dart @@ -0,0 +1,29 @@ +import 'package:aves/widgets/common/grid/header.dart'; +import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:flutter/material.dart'; + +class FilterChipSectionHeader<T> extends StatelessWidget { + final ChipSectionKey sectionKey; + final bool selectable; + + const FilterChipSectionHeader({ + super.key, + required this.sectionKey, + required this.selectable, + }); + + @override + Widget build(BuildContext context) { + return SectionHeader<T>( + sectionKey: sectionKey, + leading: sectionKey.leading, + title: sectionKey.title, + selectable: selectable, + ); + } + + static double getPreferredHeight(BuildContext context) { + final textScaler = MediaQuery.textScalerOf(context); + return textScaler.scale(SectionHeader.leadingSize.height) + SectionHeader.padding.vertical + SectionHeader.margin.vertical; + } +} diff --git a/lib/widgets/filter_grids/common/section_keys.dart b/lib/widgets/filter_grids/common/section_keys.dart new file mode 100644 index 0000000..6d8a1ea --- /dev/null +++ b/lib/widgets/filter_grids/common/section_keys.dart @@ -0,0 +1,70 @@ +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/filter_grids/common/enums.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; + +class ChipSectionKey extends SectionKey with EquatableMixin { + final String title; + + @override + List<Object?> get props => [title]; + + const ChipSectionKey({ + this.title = '', + }); + + Widget? get leading => null; +} + +class AlbumImportanceSectionKey extends ChipSectionKey { + final AlbumImportance importance; + + AlbumImportanceSectionKey._private(BuildContext context, this.importance) : super(title: importance.getText(context)); + + factory AlbumImportanceSectionKey.newAlbum(BuildContext context) => AlbumImportanceSectionKey._private(context, AlbumImportance.newAlbum); + + factory AlbumImportanceSectionKey.pinned(BuildContext context) => AlbumImportanceSectionKey._private(context, AlbumImportance.pinned); + + factory AlbumImportanceSectionKey.group(BuildContext context) => AlbumImportanceSectionKey._private(context, AlbumImportance.group); + + factory AlbumImportanceSectionKey.special(BuildContext context) => AlbumImportanceSectionKey._private(context, AlbumImportance.special); + + factory AlbumImportanceSectionKey.apps(BuildContext context) => AlbumImportanceSectionKey._private(context, AlbumImportance.apps); + + factory AlbumImportanceSectionKey.vault(BuildContext context) => AlbumImportanceSectionKey._private(context, AlbumImportance.vaults); + + factory AlbumImportanceSectionKey.dynamic(BuildContext context) => AlbumImportanceSectionKey._private(context, AlbumImportance.dynamic); + + factory AlbumImportanceSectionKey.regular(BuildContext context) => AlbumImportanceSectionKey._private(context, AlbumImportance.regular); + + @override + Widget get leading => Icon(importance.getIcon()); +} + +class MimeTypeSectionKey extends ChipSectionKey { + final AlbumMimeType mimeType; + + MimeTypeSectionKey._private(BuildContext context, this.mimeType) : super(title: mimeType.getText(context)); + + factory MimeTypeSectionKey.images(BuildContext context) => MimeTypeSectionKey._private(context, AlbumMimeType.images); + + factory MimeTypeSectionKey.videos(BuildContext context) => MimeTypeSectionKey._private(context, AlbumMimeType.videos); + + factory MimeTypeSectionKey.mixed(BuildContext context) => MimeTypeSectionKey._private(context, AlbumMimeType.mixed); + + @override + Widget get leading => Icon(mimeType.getIcon()); +} + +class StorageVolumeSectionKey extends ChipSectionKey { + final StorageVolume? volume; + + StorageVolumeSectionKey(BuildContext context, this.volume) : super(title: volume?.getDescription(context) ?? context.l10n.sectionUnknown); + + @override + Widget? get leading => (volume?.isRemovable ?? false) ? const Icon(AIcons.storageCard) : null; +} diff --git a/lib/widgets/filter_grids/common/section_layout.dart b/lib/widgets/filter_grids/common/section_layout.dart new file mode 100644 index 0000000..c275b9e --- /dev/null +++ b/lib/widgets/filter_grids/common/section_layout.dart @@ -0,0 +1,47 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/source/section_keys.dart'; +import 'package:aves/widgets/common/grid/sections/provider.dart'; +import 'package:aves/widgets/filter_grids/common/section_header.dart'; +import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:flutter/material.dart'; + +class SectionedFilterListLayoutProvider<T extends CollectionFilter> extends SectionedListLayoutProvider<FilterGridItem<T>> { + final bool selectable; + + const SectionedFilterListLayoutProvider({ + super.key, + required this.sections, + required this.showHeaders, + required this.selectable, + required super.scrollableWidth, + required super.tileLayout, + required super.columnCount, + required super.spacing, + required super.horizontalPadding, + required super.tileWidth, + required super.tileHeight, + required super.tileBuilder, + required super.tileAnimationDelay, + required super.coverRatioResolver, + required super.child, + }); + + @override + final Map<SectionKey, List<FilterGridItem<T>>> sections; + + @override + final bool showHeaders; + + @override + double getHeaderExtent(BuildContext context, SectionKey sectionKey) { + return FilterChipSectionHeader.getPreferredHeight(context); + } + + @override + Widget buildHeader(BuildContext context, SectionKey sectionKey, double headerExtent) { + return FilterChipSectionHeader<FilterGridItem<T>>( + sectionKey: sectionKey as ChipSectionKey, + selectable: selectable, + ); + } +} diff --git a/lib/widgets/filter_grids/countries_page.dart b/lib/widgets/filter_grids/countries_page.dart new file mode 100644 index 0000000..d0c9934 --- /dev/null +++ b/lib/widgets/filter_grids/countries_page.dart @@ -0,0 +1,74 @@ +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/location/country.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/country_set.dart'; +import 'package:aves/widgets/filter_grids/common/filter_nav_page.dart'; +import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class CountryListPage extends StatelessWidget { + static const routeName = '/countries'; + + const CountryListPage({super.key}); + + @override + Widget build(BuildContext context) { + final source = context.read<CollectionSource>(); + return Selector<Settings, (ChipSortFactor, bool, Set<CollectionFilter>)>( + selector: (context, s) => (s.countrySortFactor, s.countrySortReverse, s.pinnedFilters), + shouldRebuild: (t1, t2) { + // `Selector` by default uses `DeepCollectionEquality`, which does not go deep in collections within records + const eq = DeepCollectionEquality(); + return !(eq.equals(t1.$1, t2.$1) && eq.equals(t1.$2, t2.$2) && eq.equals(t1.$3, t2.$3)); + }, + builder: (context, s, child) { + return StreamBuilder( + stream: source.eventBus.on<CountriesChangedEvent>(), + builder: (context, snapshot) { + final gridItems = _getGridItems(source); + return FilterNavigationPage<LocationFilter, CountryChipSetActionDelegate>( + source: source, + title: context.l10n.countryPageTitle, + sortFactor: settings.countrySortFactor, + actionDelegate: CountryChipSetActionDelegate(gridItems), + filterSections: _groupToSections(gridItems), + emptyBuilder: () => EmptyContent( + icon: AIcons.country, + text: context.l10n.countryEmpty, + ), + ); + }, + ); + }, + ); + } + + List<FilterGridItem<LocationFilter>> _getGridItems(CollectionSource source) { + final filters = source.sortedCountries.map((location) => LocationFilter(LocationLevel.country, location)).toSet(); + + return FilterNavigationPage.sort(settings.countrySortFactor, settings.countrySortReverse, source, filters); + } + + static Map<ChipSectionKey, List<FilterGridItem<LocationFilter>>> _groupToSections(Iterable<FilterGridItem<LocationFilter>> sortedMapEntries) { + final pinned = settings.pinnedFilters.whereType<LocationFilter>(); + final byPin = groupBy<FilterGridItem<LocationFilter>, bool>(sortedMapEntries, (e) => pinned.contains(e.filter)); + final pinnedMapEntries = (byPin[true] ?? []); + final unpinnedMapEntries = (byPin[false] ?? []); + + return { + if (pinnedMapEntries.isNotEmpty || unpinnedMapEntries.isNotEmpty) + const ChipSectionKey(): [ + ...pinnedMapEntries, + ...unpinnedMapEntries, + ], + }; + } +} diff --git a/lib/widgets/filter_grids/places_page.dart b/lib/widgets/filter_grids/places_page.dart new file mode 100644 index 0000000..8a0af4a --- /dev/null +++ b/lib/widgets/filter_grids/places_page.dart @@ -0,0 +1,74 @@ +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/location/place.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/place_set.dart'; +import 'package:aves/widgets/filter_grids/common/filter_nav_page.dart'; +import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class PlaceListPage extends StatelessWidget { + static const routeName = '/places'; + + const PlaceListPage({super.key}); + + @override + Widget build(BuildContext context) { + final source = context.read<CollectionSource>(); + return Selector<Settings, (ChipSortFactor, bool, Set<CollectionFilter>)>( + selector: (context, s) => (s.placeSortFactor, s.placeSortReverse, s.pinnedFilters), + shouldRebuild: (t1, t2) { + // `Selector` by default uses `DeepCollectionEquality`, which does not go deep in collections within records + const eq = DeepCollectionEquality(); + return !(eq.equals(t1.$1, t2.$1) && eq.equals(t1.$2, t2.$2) && eq.equals(t1.$3, t2.$3)); + }, + builder: (context, s, child) { + return StreamBuilder( + stream: source.eventBus.on<PlacesChangedEvent>(), + builder: (context, snapshot) { + final gridItems = _getGridItems(source); + return FilterNavigationPage<LocationFilter, PlaceChipSetActionDelegate>( + source: source, + title: context.l10n.placePageTitle, + sortFactor: settings.placeSortFactor, + actionDelegate: PlaceChipSetActionDelegate(gridItems), + filterSections: _groupToSections(gridItems), + emptyBuilder: () => EmptyContent( + icon: AIcons.place, + text: context.l10n.placeEmpty, + ), + ); + }, + ); + }, + ); + } + + List<FilterGridItem<LocationFilter>> _getGridItems(CollectionSource source) { + final filters = source.sortedPlaces.map((location) => LocationFilter(LocationLevel.place, location)).toSet(); + + return FilterNavigationPage.sort(settings.placeSortFactor, settings.placeSortReverse, source, filters); + } + + static Map<ChipSectionKey, List<FilterGridItem<LocationFilter>>> _groupToSections(Iterable<FilterGridItem<LocationFilter>> sortedMapEntries) { + final pinned = settings.pinnedFilters.whereType<LocationFilter>(); + final byPin = groupBy<FilterGridItem<LocationFilter>, bool>(sortedMapEntries, (e) => pinned.contains(e.filter)); + final pinnedMapEntries = (byPin[true] ?? []); + final unpinnedMapEntries = (byPin[false] ?? []); + + return { + if (pinnedMapEntries.isNotEmpty || unpinnedMapEntries.isNotEmpty) + const ChipSectionKey(): [ + ...pinnedMapEntries, + ...unpinnedMapEntries, + ], + }; + } +} diff --git a/lib/widgets/filter_grids/states_page.dart b/lib/widgets/filter_grids/states_page.dart new file mode 100644 index 0000000..1402926 --- /dev/null +++ b/lib/widgets/filter_grids/states_page.dart @@ -0,0 +1,81 @@ +import 'package:aves/geo/states.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/location/place.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/state_set.dart'; +import 'package:aves/widgets/filter_grids/common/filter_nav_page.dart'; +import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class StateListPage extends StatelessWidget { + static const routeName = '/states'; + + final Set<String> countryCodes; + + const StateListPage({ + super.key, + required this.countryCodes, + }); + + @override + Widget build(BuildContext context) { + final source = context.read<CollectionSource>(); + return Selector<Settings, (ChipSortFactor, bool, Set<CollectionFilter>)>( + selector: (context, s) => (s.stateSortFactor, s.stateSortReverse, s.pinnedFilters), + shouldRebuild: (t1, t2) { + // `Selector` by default uses `DeepCollectionEquality`, which does not go deep in collections within records + const eq = DeepCollectionEquality(); + return !(eq.equals(t1.$1, t2.$1) && eq.equals(t1.$2, t2.$2) && eq.equals(t1.$3, t2.$3)); + }, + builder: (context, s, child) { + return StreamBuilder( + stream: source.eventBus.on<PlacesChangedEvent>(), + builder: (context, snapshot) { + final gridItems = _getGridItems(source); + return FilterNavigationPage<LocationFilter, StateChipSetActionDelegate>( + source: source, + title: context.l10n.statePageTitle, + sortFactor: settings.stateSortFactor, + actionDelegate: StateChipSetActionDelegate(gridItems), + filterSections: _groupToSections(gridItems), + emptyBuilder: () => EmptyContent( + icon: AIcons.state, + text: context.l10n.stateEmpty, + ), + ); + }, + ); + }, + ); + } + + List<FilterGridItem<LocationFilter>> _getGridItems(CollectionSource source) { + final selectedStateCodes = countryCodes.expand((v) => GeoStates.stateCodesByCountryCode[v] ?? <String>{}).toSet(); + final filters = source.sortedStates.where((v) => selectedStateCodes.any(v.endsWith)).map((location) => LocationFilter(LocationLevel.state, location)).toSet(); + + return FilterNavigationPage.sort(settings.stateSortFactor, settings.stateSortReverse, source, filters); + } + + static Map<ChipSectionKey, List<FilterGridItem<LocationFilter>>> _groupToSections(Iterable<FilterGridItem<LocationFilter>> sortedMapEntries) { + final pinned = settings.pinnedFilters.whereType<LocationFilter>(); + final byPin = groupBy<FilterGridItem<LocationFilter>, bool>(sortedMapEntries, (e) => pinned.contains(e.filter)); + final pinnedMapEntries = (byPin[true] ?? []); + final unpinnedMapEntries = (byPin[false] ?? []); + + return { + if (pinnedMapEntries.isNotEmpty || unpinnedMapEntries.isNotEmpty) + const ChipSectionKey(): [ + ...pinnedMapEntries, + ...unpinnedMapEntries, + ], + }; + } +} diff --git a/lib/widgets/filter_grids/tags_page.dart b/lib/widgets/filter_grids/tags_page.dart new file mode 100644 index 0000000..8054699 --- /dev/null +++ b/lib/widgets/filter_grids/tags_page.dart @@ -0,0 +1,131 @@ +import 'package:aves/model/filters/container/tag_group.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/tag.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/common/providers/filter_group_provider.dart'; +import 'package:aves/widgets/filter_grids/common/action_delegates/tag_set.dart'; +import 'package:aves/widgets/filter_grids/common/enums.dart'; +import 'package:aves/widgets/filter_grids/common/filter_nav_page.dart'; +import 'package:aves/widgets/filter_grids/common/section_keys.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class TagListPage extends StatelessWidget { + static const routeName = '/tags'; + + final Uri? initialGroup; + + const TagListPage({ + super.key, + required this.initialGroup, + }); + + @override + Widget build(BuildContext context) { + return MultiProvider( + providers: [ + ChangeNotifierProvider<FilterGrouping>.value(value: tagGrouping), + FilterGroupProvider(initialValue: initialGroup), + ], + child: Builder( + // to access filter group provider from subtree context + builder: (context) { + final source = context.read<CollectionSource>(); + return Selector<Settings, (ChipSortFactor, bool, Set<CollectionFilter>)>( + selector: (context, s) => (s.tagSortFactor, s.tagSortReverse, s.pinnedFilters), + shouldRebuild: (t1, t2) { + // `Selector` by default uses `DeepCollectionEquality`, which does not go deep in collections within records + const eq = DeepCollectionEquality(); + return !(eq.equals(t1.$1, t2.$1) && eq.equals(t1.$2, t2.$2) && eq.equals(t1.$3, t2.$3)); + }, + builder: (context, s, child) { + return AnimatedBuilder( + animation: tagGrouping, + builder: (context, child) => StreamBuilder( + stream: source.eventBus.on<TagsChangedEvent>(), + builder: (context, snapshot) { + final groupUri = context.watch<FilterGroupNotifier>().value; + final gridItems = getGridItems(source, ChipType.values, groupUri); + return FilterNavigationPage<TagBaseFilter, TagChipSetActionDelegate>( + source: source, + title: context.l10n.tagPageTitle, + sortFactor: settings.tagSortFactor, + actionDelegate: TagChipSetActionDelegate(gridItems), + filterSections: groupToSections(gridItems), + emptyBuilder: () => EmptyContent( + icon: AIcons.tag, + text: context.l10n.tagEmpty, + ), + ); + }, + ), + ); + }, + ); + }, + ), + ); + } + + // common with picking page + + static List<FilterGridItem<TagBaseFilter>> getGridItems( + CollectionSource source, + Iterable<ChipType> chipTypes, + Uri? groupUri, + ) { + final groupContent = tagGrouping.getDirectChildren(groupUri); + + Set<T> whereTypeRecursively<T>(Set<CollectionFilter> filters) { + return { + ...filters.whereType<T>(), + ...filters.whereType<TagGroupFilter>().expand((v) => whereTypeRecursively<T>(v.filter.innerFilters)), + }; + } + + final listedTags = <String>{}; + if (chipTypes.contains(ChipType.regular)) { + final allTags = source.sortedTags; + if (groupUri == null) { + final withinGroups = whereTypeRecursively<TagFilter>(groupContent).map((v) => v.tag).toSet(); + listedTags.addAll(allTags.whereNot(withinGroups.contains)); + } else { + // check that group content is listed from source, to prevent displaying hidden content + listedTags.addAll(groupContent.whereType<TagFilter>().map((v) => v.tag).where(allTags.contains)); + } + } + + // always show groups, which are needed to navigate to other types + final tagGroupFilters = groupContent.whereType<TagGroupFilter>().whereNot(settings.hiddenFilters.contains).toSet(); + + final filters = <TagBaseFilter>{ + ...tagGroupFilters, + ...listedTags.map(TagFilter.new), + }; + + return FilterNavigationPage.sort(settings.tagSortFactor, settings.tagSortReverse, source, filters); + } + + static Map<ChipSectionKey, List<FilterGridItem<TagBaseFilter>>> groupToSections(Iterable<FilterGridItem<TagBaseFilter>> sortedMapEntries) { + final pinned = settings.pinnedFilters.whereType<TagFilter>(); + final byPin = groupBy<FilterGridItem<TagBaseFilter>, bool>(sortedMapEntries, (e) => pinned.contains(e.filter)); + final pinnedMapEntries = (byPin[true] ?? []); + final unpinnedMapEntries = (byPin[false] ?? []); + + return { + if (pinnedMapEntries.isNotEmpty || unpinnedMapEntries.isNotEmpty) + const ChipSectionKey(): [ + ...pinnedMapEntries, + ...unpinnedMapEntries, + ], + }; + } +} diff --git a/lib/widgets/home/home_error.dart b/lib/widgets/home/home_error.dart new file mode 100644 index 0000000..296ffb4 --- /dev/null +++ b/lib/widgets/home/home_error.dart @@ -0,0 +1,107 @@ +import 'package:aves/ref/locales.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/about/bug_report.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class HomeError extends StatefulWidget { + final Object error; + final StackTrace stack; + + const HomeError({ + super.key, + required this.error, + required this.stack, + }); + + @override + State<HomeError> createState() => _HomeErrorState(); +} + +class _HomeErrorState extends State<HomeError> with FeedbackMixin { + final ValueNotifier<String?> _expandedNotifier = ValueNotifier(null); + + @override + void dispose() { + _expandedNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return SafeArea( + bottom: false, + child: CustomScrollView( + slivers: [ + SliverPadding( + padding: const EdgeInsets.symmetric(horizontal: 8), + sliver: SliverList( + delegate: SliverChildListDelegate( + [ + AvesExpansionTile( + title: 'Error', + expandedNotifier: _expandedNotifier, + showHighlight: false, + children: [ + Padding( + padding: const EdgeInsets.all(8), + child: SelectableText( + '${widget.error}:\n${widget.stack}', + style: Theme.of(context).textTheme.bodySmall, + ), + ), + ], + ), + AvesExpansionTile( + title: l10n.aboutBugSectionTitle, + expandedNotifier: _expandedNotifier, + showHighlight: false, + children: const [BugReportContent()], + ), + AvesExpansionTile( + title: l10n.aboutDataUsageDatabase, + expandedNotifier: _expandedNotifier, + showHighlight: false, + children: [ + Row( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: AvesOutlinedButton( + label: l10n.settingsActionExport, + onPressed: () async { + final sourcePath = await localMediaDb.path; + final success = await storageService.copyFile( + 'aves-database-${DateFormat('yyyyMMdd_HHmmss', asciiLocale).format(DateTime.now())}.db', + MimeTypes.sqlite3, + Uri.file(sourcePath).toString(), + ); + if (success != null) { + if (success) { + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } else { + showFeedback(context, FeedbackType.warn, context.l10n.genericFailureFeedback); + } + } + }, + ), + ), + ], + ), + ], + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/widgets/home/home_page.dart b/lib/widgets/home/home_page.dart new file mode 100644 index 0000000..c0c2a6a --- /dev/null +++ b/lib/widgets/home/home_page.dart @@ -0,0 +1,484 @@ +//lib/widgets/home/home_page.dart +import 'dart:async'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/geo/uri.dart'; +import 'package:aves/model/app/intent.dart'; +import 'package:aves/model/app/permissions.dart'; +import 'package:aves/model/app_inventory.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/catalog.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/analysis_service.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/global_search.dart'; +import 'package:aves/services/intent_service.dart'; +import 'package:aves/services/widget_service.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/behaviour/routes.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/search/page.dart'; +import 'package:aves/widgets/common/search/route.dart'; +import 'package:aves/widgets/editor/entry_editor_page.dart'; +import 'package:aves/widgets/explorer/explorer_page.dart'; +import 'package:aves/widgets/filter_grids/albums_page.dart'; +import 'package:aves/widgets/filter_grids/tags_page.dart'; +import 'package:aves/widgets/home/home_error.dart'; +import 'package:aves/widgets/map/map_page.dart'; +import 'package:aves/widgets/search/collection_search_delegate.dart'; +import 'package:aves/widgets/settings/home_widget_settings_page.dart'; +import 'package:aves/widgets/settings/screen_saver_settings_page.dart'; +import 'package:aves/widgets/viewer/entry_viewer_page.dart'; +import 'package:aves/widgets/viewer/screen_saver_page.dart'; +import 'package:aves/widgets/wallpaper_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:provider/provider.dart'; + +// ✅ Remote +import 'package:aves/remote/remote_controller.dart'; +import 'package:aves/remote/remote_settings.dart'; + +class HomePage extends StatefulWidget { + static const routeName = '/'; + + // compatibile con aves_app.dart + final Map? intentData; + + const HomePage({ + super.key, + this.intentData, + }); + + @override + State<HomePage> createState() => _HomePageState(); +} + +class _HomePageState extends State<HomePage> { + AvesEntry? _viewerEntry; + int? _widgetId; + String? _initialRouteName, _initialSearchQuery; + Set<CollectionFilter>? _initialFilters; + String? _initialExplorerPath; + (LatLng, double?)? _initialLocationZoom; + List<String>? _secureUris; + (Object, StackTrace)? _setupError; + + static const allowedShortcutRoutes = [ + AlbumListPage.routeName, + CollectionPage.routeName, + ExplorerPage.routeName, + MapPage.routeName, + SearchPage.routeName, + ]; + + @override + void initState() { + super.initState(); + _setup(); + imageCache.maximumSizeBytes = 512 * (1 << 20); + } + + @override + Widget build(BuildContext context) => AvesScaffold( + body: _setupError != null + ? HomeError( + error: _setupError!.$1, + stack: _setupError!.$2, + ) + : null, + ); + + Map<String, Object?> _safeCastIntentMap(Object? raw) { + if (raw is Map) { + final out = <String, Object?>{}; + for (final entry in raw.entries) { + final k = entry.key; + if (k is String) out[k] = entry.value as Object?; + } + return out; + } + return <String, Object?>{}; + } + + Future<void> _setup() async { + try { + final stopwatch = Stopwatch()..start(); + + if (await windowService.isActivity()) { + // ✅ Permessi Aves originali + await Permissions.mediaAccess.request(); + } + + var appMode = AppMode.main; + var error = false; + + final rawIntentData = widget.intentData ?? await IntentService.getIntentData(); + final intentData = _safeCastIntentMap(rawIntentData); + final intentAction = intentData[IntentDataKeys.action] as String?; + + _initialFilters = null; + _initialExplorerPath = null; + _secureUris = null; + + await availability.onNewIntent(); + await androidFileUtils.init(); + + if (!{ + IntentActions.edit, + IntentActions.screenSaver, + IntentActions.setWallpaper, + }.contains(intentAction) && + settings.isInstalledAppAccessAllowed) { + unawaited(appInventory.initAppNames()); + } + + if (intentData.values.nonNulls.isNotEmpty) { + await reportService.log('Intent data=$intentData'); + + var intentUri = intentData[IntentDataKeys.uri] as String?; + final intentMimeType = intentData[IntentDataKeys.mimeType] as String?; + + switch (intentAction) { + case IntentActions.view: + appMode = AppMode.view; + _secureUris = (intentData[IntentDataKeys.secureUris] as List?)?.cast<String>(); + case IntentActions.viewGeo: + error = true; + if (intentUri != null) { + final locationZoom = parseGeoUri(intentUri); + if (locationZoom != null) { + _initialRouteName = MapPage.routeName; + _initialLocationZoom = locationZoom; + error = false; + } + } + break; + + case IntentActions.edit: + appMode = AppMode.edit; + case IntentActions.setWallpaper: + appMode = AppMode.setWallpaper; + + case IntentActions.pickItems: + final multiple = (intentData[IntentDataKeys.allowMultiple] as bool?) ?? false; + debugPrint('pick mimeType=$intentMimeType multiple=$multiple'); + appMode = multiple ? AppMode.pickMultipleMediaExternal : AppMode.pickSingleMediaExternal; + + case IntentActions.pickCollectionFilters: + appMode = AppMode.pickCollectionFiltersExternal; + + case IntentActions.screenSaver: + appMode = AppMode.screenSaver; + _initialRouteName = ScreenSaverPage.routeName; + + case IntentActions.screenSaverSettings: + _initialRouteName = ScreenSaverSettingsPage.routeName; + + case IntentActions.search: + _initialRouteName = SearchPage.routeName; + _initialSearchQuery = intentData[IntentDataKeys.query] as String?; + + case IntentActions.widgetSettings: + _initialRouteName = HomeWidgetSettingsPage.routeName; + _widgetId = (intentData[IntentDataKeys.widgetId] as int?) ?? 0; + + case IntentActions.widgetOpen: + final widgetId = intentData[IntentDataKeys.widgetId] as int?; + if (widgetId == null) { + error = true; + } else { + await settings.reload(); + final page = settings.getWidgetOpenPage(widgetId); + switch (page) { + case WidgetOpenPage.collection: + _initialFilters = settings.getWidgetCollectionFilters(widgetId); + case WidgetOpenPage.viewer: + appMode = AppMode.view; + intentUri = settings.getWidgetUri(widgetId); + case WidgetOpenPage.home: + case WidgetOpenPage.updateWidget: + break; + } + unawaited(WidgetService.update(widgetId)); + } + + default: + final extraRoute = intentData[IntentDataKeys.page] as String?; + if (allowedShortcutRoutes.contains(extraRoute)) { + _initialRouteName = extraRoute; + } + } + + if (_initialFilters == null) { + final extraFilters = (intentData[IntentDataKeys.filters] as List?)?.cast<String>(); + _initialFilters = extraFilters?.map(CollectionFilter.fromJson).nonNulls.toSet(); + } + _initialExplorerPath = intentData[IntentDataKeys.explorerPath] as String?; + + switch (appMode) { + case AppMode.view: + case AppMode.edit: + case AppMode.setWallpaper: + if (intentUri != null) { + _viewerEntry = await _initViewerEntry(uri: intentUri, mimeType: intentMimeType); + } + error = _viewerEntry == null; + default: + break; + } + } + + if (error) { + debugPrint('Failed to init app mode=$appMode for intent data=$intentData. Fallback to main mode.'); + appMode = AppMode.main; + } + + context.read<ValueNotifier<AppMode>>().value = appMode; + unawaited(reportService.setCustomKey('app_mode', appMode.toString())); + + // ✅ Remote: seed debug + icona coerente + unawaited(RemoteSettings.debugSeedIfEmpty()); + unawaited(RemoteController.instance.initBusFromSettings()); + + switch (appMode) { + case AppMode.main: + case AppMode.pickCollectionFiltersExternal: + case AppMode.pickSingleMediaExternal: + case AppMode.pickMultipleMediaExternal: + unawaited(GlobalSearch.registerCallback()); + unawaited(AnalysisService.registerCallback()); + + final source = context.read<CollectionSource>(); + + + + + // ✅ Aves originale: init SOLO se non già full scope + if (source.loadedScope != CollectionSource.fullScope) { + await reportService.log( + 'Initialize source to start app with mode=$appMode, loaded scope=${source.loadedScope}', + ); + final loadTopEntriesFirst = + settings.homeNavItem.route == CollectionPage.routeName && + settings.homeCustomCollection.isEmpty; + source.canAnalyze = true; + + debugPrint('DEBUG home_page: starting source.init (loadTopEntriesFirst=$loadTopEntriesFirst)'); + + +try { + await source.init( + scope: CollectionSource.fullScope, + loadTopEntriesFirst: loadTopEntriesFirst, + ); + + final folders = await localMediaDb.buildFoldersInMemory(source); + await localMediaDb.saveFoldersBatch(folders.values.toList()); + + await source.initFoldersCache(); + +} catch (e, st) { + debugPrint('ERROR home_page: source.init failed: $e\n$st'); + rethrow; +} + +} + + + // ✅ Remote: dopo init locale, ma non blocca + unawaited(RemoteController.instance.onAppStart( + source: source, + resumeBootstrapIfEnabled: true, + )); + + case AppMode.screenSaver: + await reportService.log('Initialize source to start screen saver'); + final source = context.read<CollectionSource>(); + source.canAnalyze = false; + await source.init(scope: settings.screenSaverCollectionFilters); + + case AppMode.view: + if (_isViewerSourceable(_viewerEntry) && _secureUris == null) { + final directory = _viewerEntry?.directory; + if (directory != null) { + unawaited(AnalysisService.registerCallback()); + await reportService.log('Initialize source to view item in directory $directory'); + final source = context.read<CollectionSource>(); + source.canAnalyze = true; + await source.init(scope: {StoredAlbumFilter(directory, null)}); + } + } else { + await _initViewerEssentials(); + } + + case AppMode.edit: + case AppMode.setWallpaper: + await _initViewerEssentials(); + + default: + break; + } + + debugPrint('Home setup complete in ${stopwatch.elapsed.inMilliseconds}ms'); + + unawaited( + Navigator.maybeOf(context)?.pushAndRemoveUntil( + await _getRedirectRoute(appMode), + (route) => false, + ), + ); + } catch (error, stack) { + debugPrint('failed to setup app with error=$error\n$stack'); + setState(() => _setupError = (error, stack)); + } + } + + Future<void> _initViewerEssentials() async { + await localMediaDb.init(); + } + + bool _isViewerSourceable(AvesEntry? viewerEntry) { + return viewerEntry != null && + viewerEntry.directory != null && + !settings.hiddenFilters.any((filter) => filter.test(viewerEntry)); + } + + Future<AvesEntry?> _initViewerEntry({required String uri, required String? mimeType}) async { + if (uri.startsWith('/')) { + uri = Uri.file(uri).toString(); + } + final entry = await mediaFetchService.getEntry(uri, mimeType); + if (entry != null) { + await entry.catalog(background: false, force: false, persist: false); + } + return entry; + } + + Future<Route> _getRedirectRoute(AppMode appMode) async { + String routeName; + Set<CollectionFilter?>? filters; + + switch (appMode) { + case AppMode.setWallpaper: + return DirectMaterialPageRoute( + settings: const RouteSettings(name: WallpaperPage.routeName), + builder: (_) => WallpaperPage(entry: _viewerEntry), + ); + + case AppMode.view: + AvesEntry viewerEntry = _viewerEntry!; + CollectionLens? collection; + + final source = context.read<CollectionSource>(); + final album = viewerEntry.directory; + if (album != null) { + final loadingCompleter = Completer(); + final stateNotifier = source.stateNotifier; + void _onSourceStateChanged() { + if (stateNotifier.value != SourceState.loading) { + stateNotifier.removeListener(_onSourceStateChanged); + loadingCompleter.complete(); + } + } + + stateNotifier.addListener(_onSourceStateChanged); + _onSourceStateChanged(); + await loadingCompleter.future; + + collection = CollectionLens( + source: source, + filters: {StoredAlbumFilter(album, source.getStoredAlbumDisplayName(context, album))}, + listenToSource: false, + stackBursts: false, + ); + + final viewerEntryPath = viewerEntry.path; + final collectionEntry = + collection.sortedEntries.firstWhereOrNull((entry) => entry.path == viewerEntryPath); + if (collectionEntry != null) { + viewerEntry = collectionEntry; + } else { + collection = null; + } + } + + return DirectMaterialPageRoute( + settings: const RouteSettings(name: EntryViewerPage.routeName), + builder: (_) => EntryViewerPage(collection: collection, initialEntry: viewerEntry), + ); + + case AppMode.edit: + return DirectMaterialPageRoute( + settings: const RouteSettings(name: EntryViewerPage.routeName), + builder: (_) => ImageEditorPage(entry: _viewerEntry!), + ); + + default: + routeName = _initialRouteName ?? settings.homeNavItem.route; + filters = _initialFilters ?? + (settings.homeNavItem.route == CollectionPage.routeName ? settings.homeCustomCollection : {}); + } + + Route buildRoute(WidgetBuilder builder) => DirectMaterialPageRoute( + settings: RouteSettings(name: routeName), + builder: builder, + ); + + final source = context.read<CollectionSource>(); + switch (routeName) { + case AlbumListPage.routeName: + return buildRoute((context) => const AlbumListPage(initialGroup: null)); + case TagListPage.routeName: + return buildRoute((context) => const TagListPage(initialGroup: null)); + case MapPage.routeName: + return buildRoute((context) { + final mapCollection = CollectionLens( + source: source, + filters: { + LocationFilter.located, + if (filters != null) ...filters!, + }, + ); + return MapPage( + collection: mapCollection, + initialLocation: _initialLocationZoom?.$1, + initialZoom: _initialLocationZoom?.$2, + ); + }); + case ExplorerPage.routeName: + final path = _initialExplorerPath ?? settings.homeCustomExplorerPath; + return buildRoute((context) => ExplorerPage(path: path)); + case HomeWidgetSettingsPage.routeName: + return buildRoute((context) => HomeWidgetSettingsPage(widgetId: _widgetId!)); + case ScreenSaverPage.routeName: + return buildRoute((context) => ScreenSaverPage(source: source)); + case ScreenSaverSettingsPage.routeName: + return buildRoute((context) => const ScreenSaverSettingsPage()); + case SearchPage.routeName: + return SearchPageRoute( + delegate: CollectionSearchDelegate( + searchFieldLabel: context.l10n.searchCollectionFieldHint, + searchFieldStyle: Themes.searchFieldStyle(context), + source: source, + canPop: false, + initialQuery: _initialSearchQuery, + ), + ); + case CollectionPage.routeName: + default: + return buildRoute((context) => CollectionPage(source: source, filters: filters)); + } + } +} diff --git a/lib/widgets/home_widget.dart b/lib/widgets/home_widget.dart new file mode 100644 index 0000000..70d5308 --- /dev/null +++ b/lib/widgets/home_widget.dart @@ -0,0 +1,98 @@ +import 'dart:async'; +import 'dart:typed_data'; +import 'dart:ui' as ui; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/images.dart'; +import 'package:aves/model/settings/enums/widget_shape.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +class HomeWidgetPainter { + final AvesEntry? entry; + final double devicePixelRatio; + + // do not use `AlignmentDirectional` as there is no `TextDirection` in context + static const backgroundGradient = LinearGradient( + begin: Alignment.bottomLeft, + end: Alignment.topRight, + colors: AColors.boraBoraGradient, + ); + + HomeWidgetPainter({ + required this.entry, + required this.devicePixelRatio, + }); + + Future<Uint8List> drawWidget({ + required Size sizeDip, + required double? cornerRadiusPx, + required Color? outline, + required WidgetShape shape, + ui.ImageByteFormat format = ui.ImageByteFormat.rawRgba, + }) async { + final widthPx = sizeDip.width * devicePixelRatio; + final heightPx = sizeDip.height * devicePixelRatio; + final widgetSizePx = Size(widthPx, heightPx); + debugPrint('Draw widget for ${sizeDip.width}x${sizeDip.height} dp (${widgetSizePx.width}x${widgetSizePx.height} px), entry=$entry'); + final ui.Image? entryImage; + if (entry != null) { + final extent = shape.extentPx(widgetSizePx, entry!) / devicePixelRatio; + entryImage = await _getEntryImage(entry, extent); + } else { + entryImage = null; + } + + final recorder = ui.PictureRecorder(); + final rect = Offset.zero & widgetSizePx; + final canvas = Canvas(recorder, rect); + final path = shape.path(widgetSizePx, devicePixelRatio, cornerRadiusPx: cornerRadiusPx); + canvas.clipPath(path); + if (entryImage != null) { + canvas.drawImage(entryImage, Offset(widgetSizePx.width - entryImage.width, widgetSizePx.height - entryImage.height) / 2, Paint()); + entryImage.dispose(); + } else { + canvas.drawPaint(Paint()..shader = backgroundGradient.createShader(rect)); + } + if (outline != null) { + drawOutline(canvas, path, devicePixelRatio, outline); + } + final widgetImage = await recorder.endRecording().toImage(widthPx.round(), heightPx.round()); + final byteData = await widgetImage.toByteData(format: format); + return byteData?.buffer.asUint8List() ?? Uint8List(0); + } + + static void drawOutline(ui.Canvas canvas, ui.Path outlinePath, double devicePixelRatio, Color color) { + canvas.drawPath( + outlinePath, + Paint() + ..style = PaintingStyle.stroke + ..color = color + ..strokeWidth = AvesFilterChip.outlineWidth * devicePixelRatio * 2 + ..strokeCap = StrokeCap.round, + ); + } + + Future<ui.Image?> _getEntryImage(AvesEntry? entry, double extent) async { + if (entry == null) return null; + + final provider = entry.getThumbnail(extent: extent); + + final imageInfoCompleter = Completer<ImageInfo?>(); + final imageStream = provider.resolve(ImageConfiguration.empty); + final imageStreamListener = ImageStreamListener((image, synchronousCall) async { + imageInfoCompleter.complete(image); + }, onError: imageInfoCompleter.completeError); + imageStream.addListener(imageStreamListener); + ImageInfo? regionImageInfo; + try { + regionImageInfo = await imageInfoCompleter.future; + } catch (error) { + debugPrint('failed to get widget image for entry=$entry with error=$error'); + } + imageStream.removeListener(imageStreamListener); + return regionImageInfo?.image; + } +} diff --git a/lib/widgets/map/address_row.dart b/lib/widgets/map/address_row.dart new file mode 100644 index 0000000..915da69 --- /dev/null +++ b/lib/widgets/map/address_row.dart @@ -0,0 +1,109 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/settings/enums/coordinate_format.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/geocoding_service.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; +import 'package:flutter/material.dart'; + +import 'info_row.dart'; + +class MapAddressRow extends StatefulWidget { + final AvesEntry? entry; + + const MapAddressRow({ + super.key, + required this.entry, + }); + + @override + State<MapAddressRow> createState() => _MapAddressRowState(); +} + +class _MapAddressRowState extends State<MapAddressRow> { + final ValueNotifier<String?> _addressLineNotifier = ValueNotifier(null); + + @override + void initState() { + super.initState(); + _updateAddress(); + } + + @override + void didUpdateWidget(covariant MapAddressRow oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.entry != widget.entry) { + _updateAddress(); + } + } + + @override + void dispose() { + _addressLineNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final textScaler = MediaQuery.textScalerOf(context); + return Container( + alignment: AlignmentDirectional.centerStart, + // addresses can include non-latin scripts with inconsistent line height, + // which is especially an issue for relayout/painting of heavy Google map, + // so we give extra height to give breathing room to the text and stabilize layout + height: textScaler.scale(Theme.of(context).textTheme.bodyMedium!.fontSize!) * 2, + child: ValueListenableBuilder<String?>( + valueListenable: _addressLineNotifier, + builder: (context, addressLine, child) { + final entry = widget.entry; + final location = + addressLine ?? + (entry == null + ? AText.valueNotAvailable + : entry.hasAddress + ? entry.shortAddress + : settings.coordinateFormat.format(context, entry.latLng!)); + return Text.rich( + TextSpan( + children: [ + WidgetSpan( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: MapInfoRow.iconPadding), + child: Icon(AIcons.location, size: MapInfoRow.getIconSize(context)), + ), + alignment: PlaceholderAlignment.middle, + ), + TextSpan(text: location), + ], + ), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ); + }, + ), + ); + } + + Future<void> _updateAddress() async { + final entry = widget.entry; + final addressLine = await _getAddressLine(entry); + if (!mounted) return; + if (entry == widget.entry) { + _addressLineNotifier.value = addressLine; + } + } + + Future<String?> _getAddressLine(AvesEntry? entry) async { + if (entry != null && await availability.canLocatePlaces) { + final addresses = await GeocodingService.getAddress(entry.latLng!, settings.appliedLocale); + if (addresses.isNotEmpty) { + final address = addresses.first; + return address.addressLine; + } + } + return null; + } +} diff --git a/lib/widgets/map/date_row.dart b/lib/widgets/map/date_row.dart new file mode 100644 index 0000000..d83e715 --- /dev/null +++ b/lib/widgets/map/date_row.dart @@ -0,0 +1,41 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/theme/format.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/map/info_row.dart'; +import 'package:flutter/material.dart'; + +class MapDateRow extends StatelessWidget { + final AvesEntry? entry; + + const MapDateRow({ + super.key, + required this.entry, + }); + + @override + Widget build(BuildContext context) { + final use24hour = MediaQuery.alwaysUse24HourFormatOf(context); + + final date = entry?.bestDate; + final dateText = date != null ? formatDateTime(date, context.locale, use24hour) : AText.valueNotAvailable; + return Text.rich( + TextSpan( + children: [ + WidgetSpan( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: MapInfoRow.iconPadding), + child: Icon(AIcons.date, size: MapInfoRow.getIconSize(context)), + ), + alignment: PlaceholderAlignment.middle, + ), + TextSpan(text: dateText), + ], + ), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ); + } +} diff --git a/lib/widgets/map/info_row.dart b/lib/widgets/map/info_row.dart new file mode 100644 index 0000000..2313c47 --- /dev/null +++ b/lib/widgets/map/info_row.dart @@ -0,0 +1,64 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/widgets/map/address_row.dart'; +import 'package:aves/widgets/map/date_row.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:flutter/material.dart'; + +class MapInfoRow extends StatelessWidget { + final ValueNotifier<AvesEntry?> entryNotifier; + + static const double iconPadding = 8.0; + static const double _interRowPadding = 2.0; + + const MapInfoRow({ + super.key, + required this.entryNotifier, + }); + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder<AvesEntry?>( + valueListenable: entryNotifier, + builder: (context, entry, child) { + final isPortrait = MediaQuery.orientationOf(context) == Orientation.portrait; + final content = isPortrait + ? [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + MapAddressRow(entry: entry), + const SizedBox(height: _interRowPadding), + MapDateRow(entry: entry), + ], + ), + ), + ] + : [ + MapDateRow(entry: entry), + Expanded( + child: MapAddressRow(entry: entry), + ), + ]; + + return Opacity( + opacity: entry != null ? 1 : 0, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(width: iconPadding), + const DotMarker(), + ...content, + ], + ), + ); + }, + ); + } + + static double getIconSize(BuildContext context) { + final textScaler = MediaQuery.textScalerOf(context); + return textScaler.scale(16); + } +} diff --git a/lib/widgets/map/map_page.dart b/lib/widgets/map/map_page.dart new file mode 100644 index 0000000..1427654 --- /dev/null +++ b/lib/widgets/map/map_page.dart @@ -0,0 +1,573 @@ +import 'dart:async'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/filters/coordinate.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/highlight.dart'; +import 'package:aves/model/media/geotiff.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/tag.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/collection/entry_set_action_delegate.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/behaviour/routes.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; +import 'package:aves/widgets/common/map/geo_map.dart'; +import 'package:aves/widgets/common/map/map_action_delegate.dart'; +import 'package:aves/widgets/common/providers/highlight_info_provider.dart'; +import 'package:aves/widgets/common/providers/map_theme_provider.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/map/scroller.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves/widgets/viewer/entry_viewer_page.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:provider/provider.dart'; + +class MapPage extends StatelessWidget { + static const routeName = '/map'; + + final CollectionLens collection; + final LatLng? initialLocation; + final double? initialZoom; + final AvesEntry? initialEntry; + final MappedGeoTiff? overlayEntry; + final Set<List<LatLng>>? tracks; + + const MapPage({ + super.key, + required this.collection, + this.initialLocation, + this.initialZoom, + this.initialEntry, + this.overlayEntry, + this.tracks, + }); + + @override + Widget build(BuildContext context) { + return MultiProvider( + providers: [ + // do not rely on the `HighlightInfoProvider` app level + // as the map can be stacked on top of other pages + // that catch highlight events and will not let it bubble up + HighlightInfoProvider(), + // opening collection can be used by map actions + ChangeNotifierProvider<CollectionLens>.value(value: collection), + ], + child: AvesScaffold( + body: SafeArea( + left: false, + top: false, + right: false, + bottom: true, + child: _Content( + collection: collection, + initialLocation: initialLocation, + initialZoom: initialZoom, + initialEntry: initialEntry, + overlayEntry: overlayEntry, + tracks: tracks, + ), + ), + ), + ); + } +} + +class _Content extends StatefulWidget { + final CollectionLens collection; + final LatLng? initialLocation; + final double? initialZoom; + final AvesEntry? initialEntry; + final MappedGeoTiff? overlayEntry; + final Set<List<LatLng>>? tracks; + + const _Content({ + required this.collection, + this.initialLocation, + this.initialZoom, + this.initialEntry, + this.overlayEntry, + this.tracks, + }); + + @override + State<_Content> createState() => _ContentState(); +} + +class _ContentState extends State<_Content> with SingleTickerProviderStateMixin { + final Set<StreamSubscription> _subscriptions = {}; + final AvesMapController _mapController = AvesMapController(); + final ValueNotifier<bool> _isPageAnimatingNotifier = ValueNotifier(false); + final ValueNotifier<int?> _selectedIndexNotifier = ValueNotifier(0); + final ValueNotifier<CollectionLens?> _regionCollectionNotifier = ValueNotifier(null); + final ValueNotifier<LatLng?> _dotLocationNotifier = ValueNotifier(null); + final ValueNotifier<AvesEntry?> _dotEntryNotifier = ValueNotifier(null); + final ValueNotifier<double> _overlayOpacityNotifier = ValueNotifier(1); + final ValueNotifier<bool> _overlayVisible = ValueNotifier(true); + late AnimationController _overlayAnimationController; + late CurvedAnimation _overlayScale, _scrollerSize; + CoordinateFilter? _regionFilter; + + CollectionLens? get regionCollection => _regionCollectionNotifier.value; + + CollectionLens get openingCollection => widget.collection; + + @override + void initState() { + super.initState(); + + if (settings.mapStyle?.isHeavy ?? false) { + _isPageAnimatingNotifier.value = true; + Future.delayed(ADurations.pageTransitionLoose * timeDilation).then((_) { + if (!mounted) return; + _isPageAnimatingNotifier.value = false; + }); + } + + _overlayAnimationController = AnimationController( + duration: context.read<DurationsData>().viewerOverlayAnimation, + vsync: this, + ); + _overlayScale = CurvedAnimation( + parent: _overlayAnimationController, + curve: Curves.easeOutBack, + ); + _scrollerSize = CurvedAnimation( + parent: _overlayAnimationController, + curve: Curves.easeOutQuad, + ); + _overlayVisible.addListener(_onOverlayVisibleChanged); + + _subscriptions.add(_mapController.idleUpdates.listen((event) => _onIdle(event.bounds))); + _subscriptions.add(openingCollection.source.eventBus.on<CatalogMetadataChangedEvent>().listen((e) => _updateRegionCollection())); + + _selectedIndexNotifier.addListener(_onThumbnailIndexChanged); + Future.delayed(ADurations.pageTransitionLoose * timeDilation + const Duration(seconds: 1), () { + if (!mounted) return; + final regionEntries = regionCollection?.sortedEntries ?? []; + final initialEntry = widget.initialEntry ?? regionEntries.firstOrNull; + if (initialEntry != null) { + final index = regionEntries.indexOf(initialEntry); + if (index != -1) { + _selectedIndexNotifier.value = index; + } + _onEntrySelected(initialEntry); + } + }); + + WidgetsBinding.instance.addPostFrameCallback((_) => _onOverlayVisibleChanged(animate: false)); + } + + @override + void dispose() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + _mapController.dispose(); + _isPageAnimatingNotifier.dispose(); + _selectedIndexNotifier.dispose(); + _regionCollectionNotifier.value?.dispose(); + _regionCollectionNotifier.dispose(); + _dotLocationNotifier.dispose(); + _dotEntryNotifier.value?.metadataChangeNotifier.removeListener(_onMarkerEntryMetadataChanged); + _dotEntryNotifier.dispose(); + _overlayOpacityNotifier.dispose(); + _overlayVisible.dispose(); + _overlayScale.dispose(); + _scrollerSize.dispose(); + _overlayAnimationController.dispose(); + + // provided collection should be a new instance specifically created + // for the `MapPage` widget, so it can be safely disposed here + widget.collection.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return NotificationListener( + onNotification: (notification) { + if (notification is SelectFilterNotification) { + _goToCollection(notification.filter); + } else if (notification is OpenMapAppNotification) { + _openMapApp(); + } else { + return false; + } + return true; + }, + child: Selector<Settings, EntryMapStyle?>( + selector: (context, s) => s.mapStyle, + builder: (context, mapStyle, child) { + late Widget scroller; + if (mapStyle?.isHeavy ?? false) { + // the map widget is too heavy for a smooth resizing animation + // so we just toggle visibility when overlay animation is done + scroller = ValueListenableBuilder<double>( + valueListenable: _overlayAnimationController, + builder: (context, animation, child) { + return Visibility( + visible: !_overlayAnimationController.isDismissed, + child: child!, + ); + }, + child: child, + ); + } else { + // the map widget is light enough for a smooth resizing animation + scroller = FadeTransition( + opacity: _scrollerSize, + child: SizeTransition( + sizeFactor: _scrollerSize, + axisAlignment: 1.0, + child: child, + ), + ); + } + + return Column( + children: [ + Expanded(child: _buildMap()), + scroller, + ], + ); + }, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 8), + const Divider(height: 0), + _buildOverlayControls(), + MapEntryScroller( + regionCollectionNotifier: _regionCollectionNotifier, + dotEntryNotifier: _dotEntryNotifier, + selectedIndexNotifier: _selectedIndexNotifier, + onTap: (index) => _goToViewer(_getRegionEntry(index)), + ), + ], + ), + ), + ); + } + + Widget _buildMap() { + final appMode = context.watch<ValueNotifier<AppMode>>().value; + final canPop = Navigator.maybeOf(context)?.canPop() == true; + Widget child = MapTheme( + interactive: true, + showCoordinateFilter: true, + navigationButton: canPop ? MapNavigationButton.back : MapNavigationButton.close, + scale: _overlayScale, + attributionPadding: const EdgeInsets.symmetric(horizontal: 8), + child: GeoMap( + // key is expected by test driver + key: const Key('map_view'), + controller: _mapController, + collection: openingCollection, + availableSize: MediaQuery.sizeOf(context), + initialCenter: widget.initialLocation ?? widget.initialEntry?.latLng ?? widget.overlayEntry?.center, + initialZoom: widget.initialZoom, + isAnimatingNotifier: _isPageAnimatingNotifier, + dotLocationNotifier: _dotLocationNotifier, + overlayOpacityNotifier: _overlayOpacityNotifier, + overlayEntry: widget.overlayEntry, + tracks: widget.tracks, + onMapTap: (_) => _toggleOverlay(), + onMarkerTap: (location, entry) async { + final index = regionCollection?.sortedEntries.indexOf(entry); + if (index != null && _selectedIndexNotifier.value != index) { + _selectedIndexNotifier.value = index; + } + await Future.delayed(const Duration(milliseconds: 500)); + context.read<HighlightInfo>().set(entry); + }, + onMarkerLongPress: appMode.canEditEntry ? _onMarkerLongPress : null, + ), + ); + if (settings.useTvLayout) { + child = DirectionalSafeArea( + top: false, + end: false, + bottom: false, + child: Row( + children: [ + Column( + mainAxisSize: MainAxisSize.min, + children: + [ + MapAction.selectStyle, + MapAction.zoomIn, + MapAction.zoomOut, + ] + .mapIndexed( + (i, action) => Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: CaptionedButton( + icon: action.getIcon(), + caption: action.getText(context), + autofocus: i == 0, + onPressed: () => MapActionDelegate(_mapController).onActionSelected(context, action), + ), + ), + ) + .toList(), + ), + const SizedBox(width: 16), + Expanded(child: child), + ], + ), + ); + } + return child; + } + + Widget _buildOverlayControls() { + if (widget.overlayEntry == null) return const SizedBox(); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: ValueListenableBuilder<double>( + valueListenable: _overlayOpacityNotifier, + builder: (context, overlayOpacity, child) { + return Row( + children: [ + const Icon(AIcons.opacity), + Expanded( + child: Slider( + value: _overlayOpacityNotifier.value, + onChanged: (v) => _overlayOpacityNotifier.value = v, + min: 0, + max: 1, + ), + ), + ], + ); + }, + ), + ); + } + + void _onIdle(ZoomedBounds bounds) { + _regionFilter = CoordinateFilter(bounds.sw, bounds.ne); + _updateRegionCollection(); + } + + void _updateRegionCollection() { + final regionFilter = _regionFilter; + if (regionFilter == null) return; + + AvesEntry? selectedEntry; + if (regionCollection != null) { + final regionEntries = regionCollection!.sortedEntries; + final selectedIndex = _selectedIndexNotifier.value; + selectedEntry = selectedIndex != null && 0 <= selectedIndex && selectedIndex < regionEntries.length ? regionEntries[selectedIndex] : null; + } + + final oldRegionCollection = regionCollection; + final newRegionCollection = openingCollection.copyWith( + filters: { + ...openingCollection.filters.whereNot((v) => v is CoordinateFilter), + regionFilter, + }, + ); + _regionCollectionNotifier.value = newRegionCollection; + oldRegionCollection?.dispose(); + + // get entries from the new collection, so the entry order is the same + // as the one used by the thumbnail scroller (considering sort/section/group) + final regionEntries = regionCollection!.sortedEntries; + final selectedIndex = (selectedEntry != null && regionEntries.contains(selectedEntry)) + ? regionEntries.indexOf(selectedEntry) + : regionEntries.isEmpty + ? null + : 0; + _selectedIndexNotifier.value = selectedIndex; + // force update, as the region entries may change without a change of index + _onThumbnailIndexChanged(); + } + + AvesEntry? _getRegionEntry(int? index) { + if (index != null && index >= 0 && regionCollection != null) { + final regionEntries = regionCollection!.sortedEntries; + if (index < regionEntries.length) { + return regionEntries[index]; + } + } + return null; + } + + void _onThumbnailIndexChanged() => _onEntrySelected(_getRegionEntry(_selectedIndexNotifier.value)); + + void _onEntrySelected(AvesEntry? selectedEntry) { + _dotEntryNotifier.value?.metadataChangeNotifier.removeListener(_onMarkerEntryMetadataChanged); + _dotEntryNotifier.value = selectedEntry; + selectedEntry?.metadataChangeNotifier.addListener(_onMarkerEntryMetadataChanged); + _onMarkerEntryMetadataChanged(); + } + + void _onMarkerEntryMetadataChanged() { + _dotLocationNotifier.value = _dotEntryNotifier.value?.latLng; + } + + void _goToViewer(AvesEntry? initialEntry) { + if (initialEntry == null) return; + + final appModeNotifier = context.read<ValueNotifier<AppMode>>(); + Navigator.maybeOf(context)?.push( + TransparentMaterialPageRoute( + settings: const RouteSettings(name: EntryViewerPage.routeName), + pageBuilder: (context, a, sa) { + final viewerCollection = regionCollection?.copyWith( + listenToSource: false, + ); + // propagate app mode from the map page, as it could be locally overridden + // and differ from the real app mode above the `Navigator` + return ListenableProvider<ValueNotifier<AppMode>>.value( + value: appModeNotifier, + child: EntryViewerPage( + collection: viewerCollection, + initialEntry: initialEntry, + ), + ); + }, + ), + ); + } + + void _goToCollection(CollectionFilter filter) { + final isMainMode = context.read<ValueNotifier<AppMode>>().value == AppMode.main; + if (!isMainMode) return; + + Navigator.maybeOf(context)?.pushAndRemoveUntil( + MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) { + final filters = {...openingCollection.filters, filter}; + if (filter is CoordinateFilter) { + filters.removeWhere((v) => (v is CoordinateFilter && v != filter) || v == LocationFilter.located); + } + return CollectionPage( + source: openingCollection.source, + filters: filters, + ); + }, + ), + (route) => false, + ); + } + + Future<void> _openMapApp() async { + final latLng = _dotEntryNotifier.value?.latLng ?? _mapController.idleBounds?.projectedCenter; + if (latLng != null) { + await appService.openMap(latLng).then((success) { + if (!success) showNoMatchingAppDialog(context); + }); + } + } + + // overlay + + void _toggleOverlay() => _overlayVisible.value = !_overlayVisible.value; + + Future<void> _onOverlayVisibleChanged({bool animate = true}) async { + if (_overlayVisible.value) { + if (animate) { + await _overlayAnimationController.forward(); + } else { + _overlayAnimationController.value = _overlayAnimationController.upperBound; + } + } else { + if (animate) { + await _overlayAnimationController.reverse(); + } else { + _overlayAnimationController.reset(); + } + } + } + + // cluster context menu + + Future<void> _onMarkerLongPress( + LatLng markerLocation, + AvesEntry markerEntry, + Set<AvesEntry> clusterEntries, + Offset tapLocalPosition, + WidgetBuilder markerBuilder, + ) async { + final overlay = Overlay.of(context).context.findRenderObject() as RenderBox; + const touchArea = Size(kMinInteractiveDimension, kMinInteractiveDimension); + final animations = context.read<Settings>().accessibilityAnimations; + final selectedAction = await showMenu<MapClusterAction>( + context: context, + position: RelativeRect.fromRect(tapLocalPosition & touchArea, Offset.zero & overlay.size), + items: [ + PopupMenuItem( + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + markerBuilder(context), + const SizedBox(width: 16), + Text(context.l10n.itemCount(clusterEntries.length)), + ], + ), + ), + const PopupMenuDivider(), + ...[ + MapClusterAction.editLocation, + MapClusterAction.removeLocation, + ].map(_buildMenuItem), + ], + popUpAnimationStyle: animations.popUpAnimationStyle, + ); + if (selectedAction != null) { + // wait for the popup menu to hide before proceeding with the action + await Future.delayed(animations.popUpAnimationDelay * timeDilation); + final delegate = EntrySetActionDelegate(); + switch (selectedAction) { + case MapClusterAction.editLocation: + final regionEntries = regionCollection?.sortedEntries ?? []; + final markerIndex = regionEntries.indexOf(markerEntry); + final location = await delegate.editLocationByMap(context, clusterEntries, markerLocation, openingCollection.copyWith()); + if (location != null) { + if (markerIndex != -1) { + _selectedIndexNotifier.value = markerIndex; + } + _mapController.moveTo(location); + } + case MapClusterAction.removeLocation: + await delegate.removeLocation(context, clusterEntries); + } + } + } + + PopupMenuItem<MapClusterAction> _buildMenuItem(MapClusterAction action) { + return PopupMenuItem( + value: action, + child: FontSizeIconTheme( + child: MenuRow( + text: action.getText(context), + icon: action.getIcon(), + ), + ), + ); + } +} diff --git a/lib/widgets/map/scroller.dart b/lib/widgets/map/scroller.dart new file mode 100644 index 0000000..f58f19e --- /dev/null +++ b/lib/widgets/map/scroller.dart @@ -0,0 +1,130 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/utils/debouncer.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/common/thumbnail/scroller.dart'; +import 'package:aves/widgets/map/info_row.dart'; +import 'package:aves/widgets/viewer/hero.dart'; +import 'package:flutter/material.dart'; + +class MapEntryScroller extends StatefulWidget { + final ValueNotifier<CollectionLens?> regionCollectionNotifier; + final ValueNotifier<AvesEntry?> dotEntryNotifier; + final ValueNotifier<int?> selectedIndexNotifier; + final void Function(int index) onTap; + + const MapEntryScroller({ + super.key, + required this.regionCollectionNotifier, + required this.dotEntryNotifier, + required this.selectedIndexNotifier, + required this.onTap, + }); + + @override + State<MapEntryScroller> createState() => _MapEntryScrollerState(); +} + +class _MapEntryScrollerState extends State<MapEntryScroller> { + final ValueNotifier<AvesEntry?> _infoEntryNotifier = ValueNotifier(null); + final Debouncer _infoDebouncer = Debouncer(delay: ADurations.mapInfoDebounceDelay); + + @override + void initState() { + super.initState(); + _registerWidget(widget); + WidgetsBinding.instance.addPostFrameCallback((_) => _onSelectedEntryChanged()); + } + + @override + void didUpdateWidget(covariant MapEntryScroller oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(MapEntryScroller widget) { + widget.dotEntryNotifier.addListener(_onSelectedEntryChanged); + } + + void _unregisterWidget(MapEntryScroller widget) { + widget.dotEntryNotifier.removeListener(_onSelectedEntryChanged); + } + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SafeArea( + top: false, + bottom: false, + child: MapInfoRow(entryNotifier: _infoEntryNotifier), + ), + const SizedBox(height: 8), + ValueListenableBuilder<CollectionLens?>( + valueListenable: widget.regionCollectionNotifier, + builder: (context, regionCollection, child) { + return AnimatedBuilder( + // update when entries are added/removed + animation: regionCollection ?? ChangeNotifier(), + builder: (context, child) { + final regionEntries = regionCollection?.sortedEntries ?? []; + return ThumbnailScroller( + availableWidth: MediaQuery.sizeOf(context).width, + entryCount: regionEntries.length, + entryBuilder: (index) => index < regionEntries.length ? regionEntries[index] : null, + indexNotifier: widget.selectedIndexNotifier, + onTap: widget.onTap, + heroTagger: (entry) => EntryHeroInfo(regionCollection, entry).tag, + highlightable: true, + showLocation: false, + ); + }, + ); + }, + ), + ], + ), + Positioned.fill( + child: ValueListenableBuilder<AvesEntry?>( + valueListenable: _infoEntryNotifier, + builder: (context, infoEntry, child) { + return ValueListenableBuilder<CollectionLens?>( + valueListenable: widget.regionCollectionNotifier, + builder: (context, regionCollection, child) { + return infoEntry == null && regionCollection != null && regionCollection.isEmpty + ? EmptyContent( + text: context.l10n.mapEmptyRegion, + alignment: Alignment.center, + fontSize: 18, + ) + : const SizedBox(); + }, + ); + }, + ), + ), + ], + ); + } + + void _onSelectedEntryChanged() { + final selectedEntry = widget.dotEntryNotifier.value; + if (_infoEntryNotifier.value == null || selectedEntry == null) { + _infoEntryNotifier.value = selectedEntry; + } else { + _infoDebouncer(() => _infoEntryNotifier.value = selectedEntry); + } + } +} diff --git a/lib/widgets/navigation/drawer/app_drawer.dart b/lib/widgets/navigation/drawer/app_drawer.dart new file mode 100644 index 0000000..b6f6b99 --- /dev/null +++ b/lib/widgets/navigation/drawer/app_drawer.dart @@ -0,0 +1,438 @@ +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/trash.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/album.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/location/country.dart'; +import 'package:aves/model/source/location/place.dart'; +import 'package:aves/model/source/tag.dart'; +import 'package:aves/ref/locales.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/widgets/about/about_page.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/basic/text/outlined.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:aves/widgets/common/identity/aves_logo.dart'; +import 'package:aves/widgets/debug/app_debug_page.dart'; +import 'package:aves/widgets/explorer/explorer_page.dart'; +import 'package:aves/widgets/filter_grids/albums_page.dart'; +import 'package:aves/widgets/filter_grids/countries_page.dart'; +import 'package:aves/widgets/filter_grids/places_page.dart'; +import 'package:aves/widgets/filter_grids/tags_page.dart'; +import 'package:aves/widgets/home/home_page.dart'; +import 'package:aves/widgets/navigation/drawer/collection_nav_tile.dart'; +import 'package:aves/widgets/navigation/drawer/page_nav_tile.dart'; +import 'package:aves/widgets/navigation/drawer/tile.dart'; +import 'package:aves/widgets/navigation/nav_item.dart'; +import 'package:aves/widgets/settings/settings_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class AppDrawer extends StatefulWidget { + // collection loaded in the `CollectionPage`, if any + final CollectionLens? currentCollection; + + // current path loaded in the `ExplorerPage`, if any + final String? currentExplorerPath; + + const AppDrawer({ + super.key, + this.currentCollection, + this.currentExplorerPath, + }); + + @override + State<AppDrawer> createState() => _AppDrawerState(); + + static List<AlbumBaseFilter> _getDefaultAlbums(BuildContext context) { + final source = context.read<CollectionSource>(); + final specialAlbums = source.rawAlbums.where((album) { + final type = androidFileUtils.getAlbumType(album); + return [AlbumType.camera, AlbumType.download, AlbumType.screenshots].contains(type); + }).toList()..sort(source.compareAlbumsByName); + return specialAlbums.map((v) => StoredAlbumFilter(v, source.getStoredAlbumDisplayName(context, v))).toList(); + } + + static List<AlbumBaseFilter>? _getCustomAlbums(BuildContext context) { + final source = context.read<CollectionSource>(); + return settings.drawerAlbumBookmarks?.map((v) { + if (v is StoredAlbumFilter) { + final album = v.album; + return StoredAlbumFilter(album, source.getStoredAlbumDisplayName(context, album)); + } + return v; + }).toList(); + } + + static List<AlbumBaseFilter> effectiveAlbumBookmarks(BuildContext context) { + return _getCustomAlbums(context) ?? _getDefaultAlbums(context); + } +} + +class _AppDrawerState extends State<AppDrawer> with WidgetsBindingObserver { + // using the default controller conflicts + // with bottom nav bar primary scroll monitoring + final ScrollController _scrollController = ScrollController(); + late Future<List<dynamic>> _profileSwitchFuture; + bool _profileSwitchPermissionRequested = false; + + CollectionLens? get currentCollection => widget.currentCollection; + + @override + void initState() { + super.initState(); + _initProfileSwitchFuture(); + WidgetsBinding.instance.addObserver(this); + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + switch (state) { + case AppLifecycleState.resumed: + if (_profileSwitchPermissionRequested) { + _profileSwitchPermissionRequested = false; + _initProfileSwitchFuture(); + setState(() {}); + } + default: + break; + } + } + + void _initProfileSwitchFuture() { + _profileSwitchFuture = Future.wait([ + appProfileService.canRequestInteractAcrossProfiles(), + appProfileService.canInteractAcrossProfiles(), + appProfileService.getProfileSwitchingLabel(), + ]); + } + + @override + Widget build(BuildContext context) { + final drawerItems = <Widget>[ + _buildHeader(context), + _buildHomeLink(), + ..._buildTypeLinks(), + _buildAlbumLinks(context), + ..._buildPageLinks(context), + if (settings.enableBin) ...[ + const Divider(), + binTile(context), + ], + if (!kReleaseMode) ...[ + const Divider(), + debugTile, + ], + ]; + + return Drawer( + child: ListTileTheme.merge( + selectedColor: Theme.of(context).colorScheme.primary, + horizontalTitleGap: 20, + visualDensity: VisualDensity.comfortable, + child: Selector<MediaQueryData, double>( + selector: (context, mq) => mq.effectiveBottomPadding, + builder: (context, mqPaddingBottom, child) { + final textScaler = MediaQuery.textScalerOf(context); + final iconTheme = IconTheme.of(context); + return SingleChildScrollView( + controller: _scrollController, + // key is expected by test driver + key: const Key('drawer-scrollview'), + padding: EdgeInsets.only(bottom: mqPaddingBottom), + child: IconTheme( + data: iconTheme.copyWith( + size: textScaler.scale(iconTheme.size!), + ), + child: Column( + children: drawerItems, + ), + ), + ); + }, + ), + ), + ); + } + + Widget _buildHeader(BuildContext context) { + final l10n = context.l10n; + + Future<void> goTo(String routeName, WidgetBuilder pageBuilder) async { + Navigator.maybeOf(context)?.pop(); + await Future.delayed(ADurations.drawerTransitionLoose); + await Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: RouteSettings(name: routeName), + builder: pageBuilder, + ), + ); + } + + final colorScheme = Theme.of(context).colorScheme; + final onPrimary = colorScheme.onPrimary; + + final drawerButtonStyle = ButtonStyle( + padding: WidgetStateProperty.all(const EdgeInsetsDirectional.only(start: 12, end: 16)), + ); + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + color: colorScheme.primary, + child: SafeArea( + bottom: false, + child: OutlinedButtonTheme( + data: OutlinedButtonThemeData( + style: ButtonStyle( + foregroundColor: WidgetStateProperty.all<Color>(onPrimary), + overlayColor: WidgetStateProperty.all<Color>(onPrimary.withValues(alpha: .12)), + iconColor: WidgetStateProperty.all<Color>(onPrimary), + side: WidgetStateProperty.all<BorderSide>(BorderSide(width: 1, color: onPrimary.withValues(alpha: .24))), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 6), + Align( + alignment: AlignmentDirectional.centerStart, + child: Wrap( + spacing: 16, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + const AvesLogo(size: 48), + OutlinedText( + textSpans: [ + TextSpan( + text: l10n.appName, + style: TextStyle( + color: Colors.white, + fontSize: 38, + fontWeight: FontWeight.w300, + letterSpacing: canHaveLetterSpacing(context.locale) ? 1 : 0, + fontFeatures: const [FontFeature.enable('smcp')], + ), + ), + ], + ), + ], + ), + ), + const SizedBox(height: 8), + Wrap( + spacing: 8, + children: [ + OutlinedButton.icon( + // key is expected by test driver + key: const Key('drawer-about-button'), + onPressed: () => goTo(AboutPage.routeName, (_) => const AboutPage()), + style: drawerButtonStyle, + icon: const Icon(AIcons.info), + label: Text(l10n.drawerAboutButton), + ), + OutlinedButton.icon( + // key is expected by test driver + key: const Key('drawer-settings-button'), + onPressed: () => goTo(SettingsPage.routeName, (_) => const SettingsPage()), + style: drawerButtonStyle, + icon: const Icon(AIcons.settings), + label: Text(l10n.drawerSettingsButton), + ), + ], + ), + FutureBuilder<List<dynamic>>( + future: _profileSwitchFuture, + builder: (context, snapshot) { + final flags = snapshot.data; + if (flags == null) return const SizedBox(); + + final [ + bool canRequestInteractAcrossProfiles, + bool canSwitchProfile, + String profileSwitchingLabel, + ] = flags; + if ((!canRequestInteractAcrossProfiles && !canSwitchProfile) || profileSwitchingLabel.isEmpty) return const SizedBox(); + + return OutlinedButton( + onPressed: () async { + if (canSwitchProfile) { + await appProfileService.switchProfile(); + } else { + _profileSwitchPermissionRequested = await appProfileService.requestInteractAcrossProfiles(); + } + }, + child: Text(profileSwitchingLabel), + ); + }, + ), + const SizedBox(height: 8), + ], + ), + ), + ), + ); + } + + Widget _buildHomeLink() { + // route name used for display purposes, no actual routing + const displayRoute = HomePage.routeName; + const leading = DrawerPageIcon(route: displayRoute); + const title = DrawerPageTitle(route: displayRoute); + + switch (settings.homeNavItem.route) { + case CollectionPage.routeName: + final filters = settings.homeCustomCollection; + if (filters.isNotEmpty) { + return CollectionNavTile( + leading: leading, + title: title, + filters: filters, + isSelected: () => setEquals(currentCollection?.filters, filters), + ); + } + case ExplorerPage.routeName: + final path = settings.homeCustomExplorerPath; + if (path != null) { + return PageNavTile( + leading: leading, + title: title, + navItem: AvesNavItem(route: ExplorerPage.routeName, path: path), + isSelected: () => widget.currentExplorerPath == path, + ); + } + } + return const SizedBox(); + } + + List<Widget> _buildTypeLinks() { + final hiddenFilters = settings.hiddenFilters; + final typeBookmarks = settings.drawerTypeBookmarks; + final currentFilters = currentCollection?.filters; + return typeBookmarks + .where((filter) => !hiddenFilters.contains(filter)) + .map( + (filter) => CollectionNavTile( + // key is expected by test driver + key: Key('drawer-type-${filter?.key}'), + leading: DrawerFilterIcon(filter: filter), + title: DrawerFilterTitle(filter: filter), + filters: {filter}, + isSelected: () { + if (currentFilters == null || currentFilters.length > 1) return false; + return currentFilters.firstOrNull == filter; + }, + ), + ) + .toList(); + } + + Widget _buildAlbumLinks(BuildContext context) { + final source = context.read<CollectionSource>(); + final currentFilters = currentCollection?.filters; + return StreamBuilder( + stream: source.eventBus.on<AlbumsChangedEvent>(), + builder: (context, snapshot) { + final albums = AppDrawer.effectiveAlbumBookmarks(context); + if (albums.isEmpty) return const SizedBox(); + return Column( + children: [ + const Divider(), + ...albums.map( + (filter) => AlbumNavTile( + filter: filter, + isSelected: () { + if (currentFilters == null || currentFilters.length > 1) return false; + final currentFilter = currentFilters.firstOrNull; + if (currentFilter is StoredAlbumFilter && filter is StoredAlbumFilter) { + return currentFilter.album == filter.album; + } else if (currentFilter is DynamicAlbumFilter && filter is DynamicAlbumFilter) { + return currentFilter.name == filter.name; + } + return false; + }, + ), + ), + ], + ); + }, + ); + } + + List<Widget> _buildPageLinks(BuildContext context) { + final pageBookmarks = settings.drawerPageBookmarks; + if (pageBookmarks.isEmpty) return []; + + final source = context.read<CollectionSource>(); + return [ + const Divider(), + ...pageBookmarks.map((route) { + Widget? trailing; + switch (route) { + case AlbumListPage.routeName: + trailing = StreamBuilder( + stream: source.eventBus.on<AlbumsChangedEvent>(), + builder: (context, _) => Text('${source.rawAlbums.length}'), + ); + case CountryListPage.routeName: + trailing = StreamBuilder( + stream: source.eventBus.on<CountriesChangedEvent>(), + builder: (context, _) => Text('${source.sortedCountries.length}'), + ); + case PlaceListPage.routeName: + trailing = StreamBuilder( + stream: source.eventBus.on<PlacesChangedEvent>(), + builder: (context, _) => Text('${source.sortedPlaces.length}'), + ); + case TagListPage.routeName: + trailing = StreamBuilder( + stream: source.eventBus.on<TagsChangedEvent>(), + builder: (context, _) => Text('${source.sortedTags.length}'), + ); + } + + return PageNavTile( + // key is expected by test driver + key: Key('drawer-page-$route'), + trailing: trailing, + navItem: AvesNavItem(route: route), + ); + }), + ]; + } + + Widget binTile(BuildContext context) { + final source = context.read<CollectionSource>(); + final trashSize = source.trashedEntries.fold<int>(0, (sum, entry) => sum + (entry.sizeBytes ?? 0)); + + const filter = TrashFilter.instance; + return CollectionNavTile( + leading: const DrawerFilterIcon(filter: filter), + title: const DrawerFilterTitle(filter: filter), + trailing: Text(formatFileSize(context.locale, trashSize, round: 0)), + filters: {filter}, + isSelected: () => currentCollection?.filters.contains(filter) ?? false, + ); + } + + Widget get debugTile => const PageNavTile( + // key is expected by test driver + key: Key('drawer-debug'), + navItem: AvesNavItem(route: AppDebugPage.routeName), + ); +} diff --git a/lib/widgets/navigation/drawer/collection_nav_tile.dart b/lib/widgets/navigation/drawer/collection_nav_tile.dart new file mode 100644 index 0000000..8661a74 --- /dev/null +++ b/lib/widgets/navigation/drawer/collection_nav_tile.dart @@ -0,0 +1,113 @@ +import 'dart:async'; + +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/vault_aware.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/navigation/drawer/tile.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class CollectionNavTile extends StatelessWidget with FeedbackMixin, VaultAwareMixin { + final Widget? leading; + final Widget title; + final Widget? trailing; + final Set<CollectionFilter?>? filters; + final bool Function() isSelected; + + const CollectionNavTile({ + super.key, + required this.leading, + required this.title, + this.trailing, + required this.filters, + required this.isSelected, + }); + + @override + Widget build(BuildContext context) { + return SafeArea( + top: false, + bottom: false, + child: ListTile( + leading: leading, + title: title, + trailing: trailing != null + ? Builder( + builder: (context) { + final trailingColor = IconTheme.of(context).color!.withValues(alpha: .6); + return IconTheme.merge( + data: IconThemeData(color: trailingColor), + child: DefaultTextStyle.merge( + style: TextStyle(color: trailingColor), + child: trailing!, + ), + ); + }, + ) + : null, + onTap: () => _goToCollection(context), + selected: context.currentRouteName == CollectionPage.routeName && isSelected(), + ), + ); + } + + Future<void> _goToCollection(BuildContext context) async { + final _filters = filters; + if (_filters != null) { + for (final filter in _filters) { + if (filter != null) { + if (!await unlockFilter(context, filter)) return; + } + } + } + + Navigator.maybeOf(context)?.pop(); + unawaited( + Navigator.maybeOf(context)?.pushAndRemoveUntil( + MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) => CollectionPage( + source: context.read<CollectionSource>(), + filters: _filters, + ), + ), + (route) => false, + ), + ); + } +} + +class AlbumNavTile extends StatelessWidget { + final AlbumBaseFilter filter; + final bool Function() isSelected; + + const AlbumNavTile({ + super.key, + required this.filter, + required this.isSelected, + }); + + @override + Widget build(BuildContext context) { + final _filter = filter; + final storageVolume = _filter is StoredAlbumFilter ? _filter.storageVolume : null; + return CollectionNavTile( + leading: DrawerFilterIcon(filter: _filter), + title: DrawerFilterTitle(filter: _filter), + trailing: storageVolume?.isRemovable ?? false + ? const Icon( + AIcons.storageCard, + size: 16, + ) + : null, + filters: {_filter}, + isSelected: isSelected, + ); + } +} diff --git a/lib/widgets/navigation/drawer/page_nav_tile.dart b/lib/widgets/navigation/drawer/page_nav_tile.dart new file mode 100644 index 0000000..a5332b4 --- /dev/null +++ b/lib/widgets/navigation/drawer/page_nav_tile.dart @@ -0,0 +1,53 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/navigation/drawer/tile.dart'; +import 'package:aves/widgets/navigation/nav_item.dart'; +import 'package:flutter/material.dart'; + +typedef TileRouteBuilder = Route Function(BuildContext context, String routeName, bool topLevel); + +class PageNavTile extends StatelessWidget { + final Widget? leading; + final Widget? title; + final Widget? trailing; + final AvesNavItem navItem; + final bool Function()? isSelected; + + const PageNavTile({ + super.key, + this.leading, + this.title, + this.trailing, + required this.navItem, + this.isSelected, + }); + + @override + Widget build(BuildContext context) { + final routeName = navItem.route; + return SafeArea( + top: false, + bottom: false, + child: ListTile( + // key is expected by test driver + key: Key('$routeName-tile'), + leading: leading ?? DrawerPageIcon(route: routeName), + title: title ?? DrawerPageTitle(route: routeName), + trailing: trailing != null + ? Builder( + builder: (context) => DefaultTextStyle.merge( + style: TextStyle( + color: IconTheme.of(context).color!.withValues(alpha: .6), + ), + child: trailing!, + ), + ) + : null, + onTap: () { + Navigator.maybeOf(context)?.pop(); + navItem.goTo(context); + }, + selected: context.currentRouteName == routeName && (isSelected?.call() ?? true), + ), + ); + } +} diff --git a/lib/widgets/navigation/drawer/tile.dart b/lib/widgets/navigation/drawer/tile.dart new file mode 100644 index 0000000..10b5a7e --- /dev/null +++ b/lib/widgets/navigation/drawer/tile.dart @@ -0,0 +1,76 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/debug/app_debug_page.dart'; +import 'package:aves/widgets/navigation/nav_display.dart'; +import 'package:flutter/material.dart'; + +class DrawerFilterIcon extends StatelessWidget { + final CollectionFilter? filter; + + const DrawerFilterIcon({ + super.key, + required this.filter, + }); + + @override + Widget build(BuildContext context) { + final textScaler = MediaQuery.textScalerOf(context); + final iconSize = textScaler.scale(24); + + final _filter = filter; + if (_filter == null) return Icon(AIcons.allCollection, size: iconSize); + return _filter.iconBuilder(context, iconSize) ?? const SizedBox(); + } +} + +class DrawerFilterTitle extends StatelessWidget { + final CollectionFilter? filter; + + const DrawerFilterTitle({ + super.key, + required this.filter, + }); + + @override + Widget build(BuildContext context) => Text(NavigationDisplay.getFilterTitle(context, filter)); +} + +class DrawerPageIcon extends StatelessWidget { + final String route; + + const DrawerPageIcon({ + super.key, + required this.route, + }); + + @override + Widget build(BuildContext context) { + final icon = NavigationDisplay.getPageIcon(route); + if (icon != null) { + switch (route) { + case AppDebugPage.routeName: + return ShaderMask( + shaderCallback: AvesColorsData.debugGradient.createShader, + blendMode: BlendMode.srcIn, + child: Icon(icon), + ); + default: + return Icon(icon); + } + } + return const SizedBox(); + } +} + +class DrawerPageTitle extends StatelessWidget { + final String route; + + const DrawerPageTitle({ + super.key, + required this.route, + }); + + @override + Widget build(BuildContext context) => Text(NavigationDisplay.getPageTitle(context, route)); +} diff --git a/lib/widgets/navigation/nav_bar/floating.dart b/lib/widgets/navigation/nav_bar/floating.dart new file mode 100644 index 0000000..15f4cba --- /dev/null +++ b/lib/widgets/navigation/nav_bar/floating.dart @@ -0,0 +1,123 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/widgets/common/basic/draggable_scrollbar/notifications.dart'; +import 'package:flutter/material.dart'; + +class FloatingNavBar extends StatefulWidget { + final ScrollController? scrollController; + final Stream<DraggableScrollbarEvent> events; + final double childHeight; + final Widget child; + + const FloatingNavBar({ + super.key, + required this.scrollController, + required this.events, + required this.childHeight, + required this.child, + }); + + @override + State<FloatingNavBar> createState() => _FloatingNavBarState(); +} + +class _FloatingNavBarState extends State<FloatingNavBar> with SingleTickerProviderStateMixin { + final Set<StreamSubscription> _subscriptions = {}; + late AnimationController _controller; + late CurvedAnimation _animation; + late Animation<Offset> _offset; + double? _lastOffset; + bool _isDragging = false; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + duration: const Duration(milliseconds: 200), + vsync: this, + ); + _animation = CurvedAnimation( + parent: _controller, + curve: Curves.linear, + ); + _offset = + Tween<Offset>( + begin: const Offset(0, 0), + end: const Offset(0, 1), + ).animate(_animation)..addListener(() { + if (!mounted) return; + setState(() {}); + }); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant FloatingNavBar oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.scrollController != widget.scrollController) { + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + } + + @override + void dispose() { + _unregisterWidget(widget); + _animation.dispose(); + _controller.dispose(); + super.dispose(); + } + + void _registerWidget(FloatingNavBar widget) { + _lastOffset = null; + widget.scrollController?.addListener(_onScrollChanged); + _subscriptions.add(widget.events.listen(_onDraggableScrollBarEvent)); + } + + void _unregisterWidget(FloatingNavBar widget) { + widget.scrollController?.removeListener(_onScrollChanged); + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + @override + Widget build(BuildContext context) { + return SlideTransition( + position: _offset, + child: widget.child, + ); + } + + void _onScrollChanged() { + final scrollController = widget.scrollController; + if (scrollController == null) return; + + final offset = scrollController.offset; + final delta = offset - (_lastOffset ?? offset); + _lastOffset = offset; + + double? newValue; + final childHeight = widget.childHeight; + final after = scrollController.position.extentAfter; + if (after < childHeight && delta > 0) { + newValue = min(_controller.value, after / childHeight); + } else if (!_isDragging || delta > 0) { + newValue = _controller.value + delta / childHeight; + } + if (newValue != null) { + _controller.value = newValue.clamp(0.0, 1.0); + } + } + + void _onDraggableScrollBarEvent(DraggableScrollbarEvent event) { + switch (event) { + case DraggableScrollbarEvent.dragStart: + _isDragging = true; + case DraggableScrollbarEvent.dragEnd: + _isDragging = false; + } + } +} diff --git a/lib/widgets/navigation/nav_bar/nav_bar.dart b/lib/widgets/navigation/nav_bar/nav_bar.dart new file mode 100644 index 0000000..3ec4b5e --- /dev/null +++ b/lib/widgets/navigation/nav_bar/nav_bar.dart @@ -0,0 +1,153 @@ +import 'package:aves/app_mode.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/notifications.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:aves/widgets/common/identity/aves_app_bar.dart'; +import 'package:aves/widgets/navigation/nav_bar/floating.dart'; +import 'package:aves/widgets/navigation/nav_item.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class AppBottomNavBar extends StatefulWidget { + final Stream<DraggableScrollbarEvent> events; + + // collection loaded in the `CollectionPage`, if any + final CollectionLens? currentCollection; + + static double get height => kBottomNavigationBarHeight + AvesFloatingBar.margin.vertical; + + const AppBottomNavBar({ + super.key, + required this.events, + this.currentCollection, + }); + + @override + State<AppBottomNavBar> createState() => _AppBottomNavBarState(); +} + +class _AppBottomNavBarState extends State<AppBottomNavBar> { + String? _lastRoute; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant AppBottomNavBar oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(AppBottomNavBar widget) { + widget.currentCollection?.filterChangeNotifier.addListener(_onCollectionFilterChanged); + } + + void _unregisterWidget(AppBottomNavBar widget) { + widget.currentCollection?.filterChangeNotifier.removeListener(_onCollectionFilterChanged); + } + + @override + Widget build(BuildContext context) { + final items = context.select<Settings, List<AvesNavItem>>((v) => v.bottomNavigationActions); + if (items.length < 2) return const SizedBox(); + + Widget child = FloatingNavBar( + scrollController: PrimaryScrollController.of(context), + events: widget.events, + childHeight: AppBottomNavBar.height + context.select<MediaQueryData, double>((mq) => mq.effectiveBottomPadding), + child: SafeArea( + child: AvesFloatingBar( + builder: (context, backgroundColor, child) => BottomNavigationBar( + items: items.map((item) { + final label = item.getText(context); + return BottomNavigationBarItem( + icon: item.getIcon(context), + label: label, + tooltip: label, + ); + }).toList(), + onTap: (index) => _goTo(context, items, index), + currentIndex: _getCurrentIndex(context, items), + type: BottomNavigationBarType.fixed, + backgroundColor: backgroundColor, + showSelectedLabels: false, + showUnselectedLabels: false, + ), + ), + ), + ); + + final animate = context.select<Settings, bool>((v) => v.animate); + if (animate) { + child = Hero( + tag: 'nav-bar', + flightShuttleBuilder: (flightContext, animation, flightDirection, fromHeroContext, toHeroContext) { + return MediaQuery.removeViewInsets( + context: context, + removeBottom: true, + child: toHeroContext.widget, + ); + }, + child: child, + ); + } + + return child; + } + + void _onCollectionFilterChanged() => setState(() {}); + + int _getCurrentIndex(BuildContext context, List<AvesNavItem> items) { + // current route may be null during navigation + final currentRoute = context.currentRouteName ?? _lastRoute; + _lastRoute = currentRoute; + + final currentItem = items.firstWhereOrNull((item) { + final itemRoute = item.route; + if (currentRoute != itemRoute) return false; + + switch (itemRoute) { + case CollectionPage.routeName: + final currentFilters = widget.currentCollection?.filters ?? {}; + return const SetEquality().equals(currentFilters, item.filters ?? {}); + default: + return true; + } + }); + final currentIndex = currentItem != null ? items.indexOf(currentItem) : 0; + return currentIndex; + } + + void _goTo(BuildContext context, List<AvesNavItem> items, int index) { + final item = items[index]; + item.goTo(context, topLevel: null); + } +} + +class NavBarPaddingSliver extends StatelessWidget { + const NavBarPaddingSliver({super.key}); + + @override + Widget build(BuildContext context) { + final canNavigate = context.select<ValueNotifier<AppMode>, bool>((v) => v.value.canNavigate); + final enableBottomNavigationBar = context.select<Settings, bool>((v) => v.enableBottomNavigationBar); + final showBottomNavigationBar = canNavigate && enableBottomNavigationBar; + return SliverToBoxAdapter( + child: SizedBox(height: showBottomNavigationBar ? AppBottomNavBar.height : 0), + ); + } +} diff --git a/lib/widgets/navigation/nav_display.dart b/lib/widgets/navigation/nav_display.dart new file mode 100644 index 0000000..20ac5dd --- /dev/null +++ b/lib/widgets/navigation/nav_display.dart @@ -0,0 +1,88 @@ +import 'package:aves/model/filters/favourite.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/mime.dart'; +import 'package:aves/model/filters/type.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/about/about_page.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/search/page.dart'; +import 'package:aves/widgets/debug/app_debug_page.dart'; +import 'package:aves/widgets/explorer/explorer_page.dart'; +import 'package:aves/widgets/filter_grids/albums_page.dart'; +import 'package:aves/widgets/filter_grids/countries_page.dart'; +import 'package:aves/widgets/filter_grids/places_page.dart'; +import 'package:aves/widgets/filter_grids/tags_page.dart'; +import 'package:aves/widgets/home/home_page.dart'; +import 'package:aves/widgets/settings/settings_page.dart'; +import 'package:flutter/material.dart'; + +class NavigationDisplay { + static String getFilterTitle(BuildContext context, CollectionFilter? filter) { + final l10n = context.l10n; + if (filter == null) return l10n.drawerCollectionAll; + if (filter == FavouriteFilter.instance) return l10n.drawerCollectionFavourites; + if (filter == MimeFilter.image) return l10n.drawerCollectionImages; + if (filter == MimeFilter.video) return l10n.drawerCollectionVideos; + if (filter == TypeFilter.animated) return l10n.drawerCollectionAnimated; + if (filter == TypeFilter.motionPhoto) return l10n.drawerCollectionMotionPhotos; + if (filter == TypeFilter.panorama) return l10n.drawerCollectionPanoramas; + if (filter == TypeFilter.raw) return l10n.drawerCollectionRaws; + if (filter == TypeFilter.sphericalVideo) return l10n.drawerCollectionSphericalVideos; + return filter.getLabel(context); + } + + static String getPageTitle(BuildContext context, route) { + final l10n = context.l10n; + switch (route) { + case HomePage.routeName: + return l10n.settingsHomeTile; + case AlbumListPage.routeName: + return l10n.drawerAlbumPage; + case CountryListPage.routeName: + return l10n.drawerCountryPage; + case PlaceListPage.routeName: + return l10n.drawerPlacePage; + case TagListPage.routeName: + return l10n.drawerTagPage; + case AboutPage.routeName: + return l10n.aboutPageTitle; + case AppDebugPage.routeName: + return 'Debug'; + case ExplorerPage.routeName: + return l10n.explorerPageTitle; + case SearchPage.routeName: + return MaterialLocalizations.of(context).searchFieldLabel; + case SettingsPage.routeName: + return l10n.settingsPageTitle; + default: + return route; + } + } + + static IconData? getPageIcon(String route) { + switch (route) { + case HomePage.routeName: + return AIcons.home; + case AlbumListPage.routeName: + return AIcons.album; + case CountryListPage.routeName: + return AIcons.country; + case PlaceListPage.routeName: + return AIcons.place; + case TagListPage.routeName: + return AIcons.tag; + case AboutPage.routeName: + return AIcons.info; + case AppDebugPage.routeName: + return AIcons.debug; + case ExplorerPage.routeName: + return AIcons.explorer; + case SearchPage.routeName: + return AIcons.search; + case SettingsPage.routeName: + return AIcons.settings; + default: + return null; + } + } +} diff --git a/lib/widgets/navigation/nav_item.dart b/lib/widgets/navigation/nav_item.dart new file mode 100644 index 0000000..eab221a --- /dev/null +++ b/lib/widgets/navigation/nav_item.dart @@ -0,0 +1,167 @@ +import 'dart:convert'; + +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/about/about_page.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/search/page.dart'; +import 'package:aves/widgets/common/search/route.dart'; +import 'package:aves/widgets/debug/app_debug_page.dart'; +import 'package:aves/widgets/explorer/explorer_page.dart'; +import 'package:aves/widgets/filter_grids/albums_page.dart'; +import 'package:aves/widgets/filter_grids/countries_page.dart'; +import 'package:aves/widgets/filter_grids/places_page.dart'; +import 'package:aves/widgets/filter_grids/tags_page.dart'; +import 'package:aves/widgets/home/home_page.dart'; +import 'package:aves/widgets/navigation/drawer/tile.dart'; +import 'package:aves/widgets/navigation/nav_display.dart'; +import 'package:aves/widgets/search/collection_search_delegate.dart'; +import 'package:aves/widgets/settings/settings_page.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class AvesNavItem extends Equatable { + final String route; + final Set<CollectionFilter>? filters; + final String? path; + + @override + List<Object?> get props => [route, filters, path]; + + const AvesNavItem({ + required this.route, + this.filters, + this.path, + }); + + Widget getIcon(BuildContext context) { + if (route == CollectionPage.routeName) { + return DrawerFilterIcon(filter: filters?.firstOrNull); + } + + final textScaler = MediaQuery.textScalerOf(context); + final iconSize = textScaler.scale(24); + return Icon(NavigationDisplay.getPageIcon(route), size: iconSize); + } + + String getText(BuildContext context) { + if (route == CollectionPage.routeName) { + return NavigationDisplay.getFilterTitle(context, filters?.firstOrNull); + } + return NavigationDisplay.getPageTitle(context, route); + } + + Future<void> goTo(BuildContext context, {bool? topLevel}) async { + topLevel ??= _defaultTopLevel; + final route = routeBuilder(context, topLevel: topLevel); + if (topLevel) { + await Navigator.maybeOf(context)?.pushAndRemoveUntil( + route, + (route) => false, + ); + } else { + await Navigator.maybeOf(context)?.push(route); + } + } + + bool get _defaultTopLevel { + switch (route) { + case AboutPage.routeName: + case AppDebugPage.routeName: + case SearchPage.routeName: + case SettingsPage.routeName: + return false; + default: + return true; + } + } + + Route routeBuilder(BuildContext context, {required bool topLevel}) { + switch (route) { + case HomePage.routeName: + return settings.homeNavItem.routeBuilder(context, topLevel: topLevel); + case SearchPage.routeName: + final currentCollection = context.read<CollectionLens?>(); + return SearchPageRoute( + delegate: CollectionSearchDelegate( + searchFieldLabel: context.l10n.searchCollectionFieldHint, + searchFieldStyle: Themes.searchFieldStyle(context), + source: context.read<CollectionSource>(), + parentCollection: topLevel ? currentCollection?.copyWith() : currentCollection, + ), + ); + default: + return MaterialPageRoute( + settings: RouteSettings(name: route), + builder: _materialPageBuilder(route), + ); + } + } + + WidgetBuilder _materialPageBuilder(String route) { + switch (route) { + case CollectionPage.routeName: + return (context) => CollectionPage( + source: context.read<CollectionSource>(), + filters: filters, + ); + case AlbumListPage.routeName: + return (_) => const AlbumListPage(initialGroup: null); + case CountryListPage.routeName: + return (_) => const CountryListPage(); + case PlaceListPage.routeName: + return (_) => const PlaceListPage(); + case TagListPage.routeName: + return (_) => const TagListPage(initialGroup: null); + case AboutPage.routeName: + return (_) => const AboutPage(); + case AppDebugPage.routeName: + return (_) => const AppDebugPage(); + case ExplorerPage.routeName: + return (_) => ExplorerPage(path: path); + case SettingsPage.routeName: + return (_) => const SettingsPage(); + default: + throw Exception('unknown route=$route'); + } + } + + // serialization + + static AvesNavItem _fromMap(Map<String, dynamic> json) { + return AvesNavItem( + route: json['route'], + filters: (json['filters'] as List?)?.cast<String>().map(CollectionFilter.fromJson).nonNulls.toSet(), + path: json['path'], + ); + } + + Map<String, dynamic> _toMap() => { + 'route': route, + if (filters != null) 'filters': filters?.map((v) => v.toJson()).toList(), + if (path != null) 'path': path, + }; + + String toJson() => jsonEncode(_toMap()); + + static AvesNavItem? fromJson(String? jsonString) { + if (jsonString == null || jsonString.isEmpty) return null; + + try { + final jsonMap = jsonDecode(jsonString); + if (jsonMap is Map<String, dynamic>) { + return _fromMap(jsonMap); + } + debugPrint('failed to parse navigation item from json=$jsonString'); + } catch (error) { + // no need for stack + debugPrint('failed to parse navigation item from json=$jsonString error=$error'); + } + return null; + } +} diff --git a/lib/widgets/navigation/tv_page_transitions.dart b/lib/widgets/navigation/tv_page_transitions.dart new file mode 100644 index 0000000..69f21d0 --- /dev/null +++ b/lib/widgets/navigation/tv_page_transitions.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +class TvPageTransitionsBuilder extends PageTransitionsBuilder { + const TvPageTransitionsBuilder(); + + @override + Widget buildTransitions<T>( + PageRoute<T>? route, + BuildContext? context, + Animation<double> animation, + Animation<double>? secondaryAnimation, + Widget child, + ) { + return _TvPageTransition(routeAnimation: animation, child: child); + } +} + +class _TvPageTransition extends StatelessWidget { + final Animation<double> _opacityAnimation; + final Widget child; + + static final Animatable<double> _easeInTween = CurveTween(curve: Curves.easeIn); + + _TvPageTransition({ + required Animation<double> routeAnimation, + required this.child, + }) : _opacityAnimation = routeAnimation.drive(_easeInTween); + + @override + Widget build(BuildContext context) { + return FadeTransition( + opacity: _opacityAnimation, + child: child, + ); + } +} diff --git a/lib/widgets/navigation/tv_rail.dart b/lib/widgets/navigation/tv_rail.dart new file mode 100644 index 0000000..e8665c7 --- /dev/null +++ b/lib/widgets/navigation/tv_rail.dart @@ -0,0 +1,302 @@ +import 'dart:math'; + +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/ref/locales.dart'; +import 'package:aves/widgets/about/about_page.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_logo.dart'; +import 'package:aves/widgets/debug/app_debug_page.dart'; +import 'package:aves/widgets/navigation/drawer/app_drawer.dart'; +import 'package:aves/widgets/navigation/drawer/tile.dart'; +import 'package:aves/widgets/navigation/nav_item.dart'; +import 'package:aves/widgets/settings/settings_page.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class TvRailController { + int? focusedIndex; + double offset = 0; +} + +class TvRail extends StatefulWidget { + // collection loaded in the `CollectionPage`, if any + final CollectionLens? currentCollection; + final TvRailController controller; + + static const double minExtendedWidth = 256; + + const TvRail({ + super.key, + required this.controller, + this.currentCollection, + }); + + @override + State<TvRail> createState() => _TvRailState(); +} + +class _TvRailState extends State<TvRail> { + late final ScrollController _scrollController; + final ValueNotifier<bool> _extendedNotifier = ValueNotifier(true); + final FocusNode _focusNode = FocusNode(); + + TvRailController get controller => widget.controller; + + CollectionLens? get currentCollection => widget.currentCollection; + + @override + void initState() { + super.initState(); + _scrollController = ScrollController(initialScrollOffset: controller.offset); + _scrollController.addListener(_onScrollChanged); + + _registerWidget(widget); + WidgetsBinding.instance.addPostFrameCallback((_) => _initFocus()); + } + + @override + void didUpdateWidget(covariant TvRail oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + _scrollController.removeListener(_onScrollChanged); + _scrollController.dispose(); + _extendedNotifier.dispose(); + _focusNode.dispose(); + super.dispose(); + } + + void _registerWidget(TvRail widget) { + widget.currentCollection?.filterChangeNotifier.addListener(_onCollectionFilterChanged); + } + + void _unregisterWidget(TvRail widget) { + widget.currentCollection?.filterChangeNotifier.removeListener(_onCollectionFilterChanged); + } + + @override + Widget build(BuildContext context) { + final navEntries = _getNavEntries(context); + return DirectionalSafeArea( + end: false, + child: ValueListenableBuilder<bool>( + valueListenable: _extendedNotifier, + builder: (context, extended, child) { + const logo = AvesLogo(size: 48); + final header = extended + ? Row( + children: [ + logo, + const SizedBox(width: 16), + Text( + context.l10n.appName, + style: TextStyle( + color: Colors.white, + fontSize: 32, + fontWeight: FontWeight.w300, + letterSpacing: canHaveLetterSpacing(context.locale) ? 1 : 0, + fontFeatures: const [FontFeature.enable('smcp')], + ), + ), + ], + ) + : logo; + + final railTheme = Theme.of(context).navigationRailTheme; + const double labelFontSize = 16; + final rail = Focus( + focusNode: _focusNode, + skipTraversal: true, + child: NavigationRail( + extended: extended, + destinations: navEntries + .map( + (v) => NavigationRailDestination( + icon: v.icon, + label: v.label, + padding: const EdgeInsets.symmetric(vertical: 8), + ), + ) + .toList(), + selectedIndex: max(0, navEntries.indexWhere(((v) => v.isSelected))), + onDestinationSelected: (index) { + controller.focusedIndex = index; + navEntries[index].onSelection(); + }, + unselectedLabelTextStyle: railTheme.unselectedLabelTextStyle?.copyWith(fontSize: labelFontSize), + selectedLabelTextStyle: railTheme.selectedLabelTextStyle?.copyWith(fontSize: labelFontSize), + minExtendedWidth: TvRail.minExtendedWidth, + ), + ); + + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox(height: 8), + header, + const SizedBox(height: 4), + Expanded( + child: LayoutBuilder( + builder: (context, constraints) { + return SingleChildScrollView( + controller: _scrollController, + child: ConstrainedBox( + constraints: BoxConstraints(minHeight: constraints.maxHeight), + child: IntrinsicHeight(child: rail), + ), + ); + }, + ), + ), + ], + ); + }, + ), + ); + } + + void _initFocus() { + var index = controller.focusedIndex ?? -1; + controller.focusedIndex = null; + + if (index == -1) { + final navEntries = _getNavEntries(context); + index = navEntries.indexWhere((v) => v.isHome); + } + + final nodes = _focusNode.children.toList(); + if (0 <= index && index < nodes.length) { + nodes[index].requestFocus(); + } + } + + List<_NavEntry> _getNavEntries(BuildContext context) { + final navEntries = <_NavEntry>[ + ..._buildTypeLinks(), + ..._buildAlbumLinks(context), + ..._buildPageLinks(context), + ...[ + SettingsPage.routeName, + AboutPage.routeName, + if (!kReleaseMode) AppDebugPage.routeName, + ].map(_routeNavEntry), + ]; + return navEntries; + } + + List<_NavEntry> _buildTypeLinks() { + final hiddenFilters = settings.hiddenFilters; + final typeBookmarks = settings.drawerTypeBookmarks; + final currentFilters = currentCollection?.filters; + return typeBookmarks.where((filter) => !hiddenFilters.contains(filter)).map((filter) { + bool isSelected() { + if (currentFilters == null || currentFilters.length > 1) return false; + return currentFilters.firstOrNull == filter; + } + + final homeRoute = settings.homeNavItem.route; + return _NavEntry( + icon: DrawerFilterIcon(filter: filter), + label: DrawerFilterTitle(filter: filter), + isHome: homeRoute == CollectionPage.routeName && filter == null, + isSelected: isSelected(), + onSelection: () => _goToCollection(context, filter), + ); + }).toList(); + } + + List<_NavEntry> _buildAlbumLinks(BuildContext context) { + final currentFilters = currentCollection?.filters; + final albums = AppDrawer.effectiveAlbumBookmarks(context); + return albums.map((filter) { + bool isSelected() { + if (currentFilters == null || currentFilters.length > 1) return false; + final currentFilter = currentFilters.firstOrNull; + if (currentFilter is StoredAlbumFilter && filter is StoredAlbumFilter) { + return currentFilter.album == filter.album; + } else if (currentFilter is DynamicAlbumFilter && filter is DynamicAlbumFilter) { + return currentFilter.name == filter.name; + } + return false; + } + + return _NavEntry( + icon: DrawerFilterIcon(filter: filter), + label: DrawerFilterTitle(filter: filter), + isHome: false, + isSelected: isSelected(), + onSelection: () => _goToCollection(context, filter), + ); + }).toList(); + } + + List<_NavEntry> _buildPageLinks(BuildContext context) { + final pageBookmarks = settings.drawerPageBookmarks; + return pageBookmarks.map(_routeNavEntry).toList(); + } + + _NavEntry _routeNavEntry(String routeName) { + final homeRoute = settings.homeNavItem.route; + return _NavEntry( + icon: DrawerPageIcon(route: routeName), + label: DrawerPageTitle(route: routeName), + isHome: homeRoute != CollectionPage.routeName && routeName == homeRoute, + isSelected: context.currentRouteName == routeName, + onSelection: () => _goTo(routeName), + ); + } + + void _goTo(String routeName) { + final navItem = AvesNavItem(route: routeName); + Navigator.maybeOf(context)?.pushAndRemoveUntil( + navItem.routeBuilder(context, topLevel: true), + (route) => false, + ); + } + + void _goToCollection(BuildContext context, CollectionFilter? filter) { + Navigator.maybeOf(context)?.pushAndRemoveUntil( + MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) => CollectionPage( + source: context.read<CollectionSource>(), + filters: {filter}, + ), + ), + (route) => false, + ); + } + + void _onScrollChanged() => controller.offset = _scrollController.offset; + + void _onCollectionFilterChanged() => setState(() {}); +} + +@immutable +class _NavEntry { + final Widget icon, label; + final bool isHome, isSelected; + final VoidCallback onSelection; + + const _NavEntry({ + required this.icon, + required this.label, + required this.isHome, + required this.isSelected, + required this.onSelection, + }); +} diff --git a/lib/widgets/search/collection_search_delegate.dart b/lib/widgets/search/collection_search_delegate.dart new file mode 100644 index 0000000..a79e3fd --- /dev/null +++ b/lib/widgets/search/collection_search_delegate.dart @@ -0,0 +1,406 @@ +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/filters/aspect_ratio.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/container/set_and.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/date.dart'; +import 'package:aves/model/filters/favourite.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/mime.dart'; +import 'package:aves/model/filters/missing.dart'; +import 'package:aves/model/filters/query.dart'; +import 'package:aves/model/filters/rating.dart'; +import 'package:aves/model/filters/recent.dart'; +import 'package:aves/model/filters/type.dart'; +import 'package:aves/model/filters/weekday.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/album.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/location/country.dart'; +import 'package:aves/model/source/location/place.dart'; +import 'package:aves/model/source/tag.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/vault_aware.dart'; +import 'package:aves/widgets/common/basic/tv_edge_focus.dart'; +import 'package:aves/widgets/common/expandable_filter_row.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/common/search/delegate.dart'; +import 'package:aves/widgets/common/search/page.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class CollectionSearchDelegate extends AvesSearchDelegate with FeedbackMixin, VaultAwareMixin { + final CollectionSource source; + final CollectionLens? parentCollection; + final ValueNotifier<String?> _expandedSectionNotifier = ValueNotifier(null); + final FocusNode _suggestionsTopFocusNode = FocusNode(); + final ScrollController _suggestionsScrollController = ScrollController(); + late final List<MimeFilter> _mimeTypeFilters; + + @override + FocusNode? get suggestionsFocusNode => _suggestionsTopFocusNode; + + @override + ScrollController get suggestionsScrollController => _suggestionsScrollController; + + static const int searchHistoryCount = 10; + static final typeFilters = [ + FavouriteFilter.instance, + MimeFilter.image, + MimeFilter.video, + TypeFilter.animated, + TypeFilter.motionPhoto, + AspectRatioFilter.portrait, + AspectRatioFilter.landscape, + TypeFilter.panorama, + TypeFilter.sphericalVideo, + TypeFilter.geotiff, + TypeFilter.hdr, + TypeFilter.raw, + ]; + + static final _monthFilters = List.generate(12, (i) => DateFilter(DateLevel.m, DateTime(1, i + 1))); + + CollectionSearchDelegate({ + required super.searchFieldLabel, + required super.searchFieldStyle, + required this.source, + this.parentCollection, + super.canPop, + String? initialQuery, + }) : super( + routeName: SearchPage.routeName, + ) { + query = initialQuery ?? ''; + _mimeTypeFilters = source.visibleEntries.map((entry) => entry.mimeType).toSet().map(MimeFilter.new).toList()..sort(); + } + + @override + void dispose() { + _expandedSectionNotifier.dispose(); + _suggestionsTopFocusNode.dispose(); + _suggestionsScrollController.dispose(); + super.dispose(); + } + + @override + Widget buildSuggestions(BuildContext context) { + final upQuery = query.trim().toUpperCase(); + bool containQuery(CollectionFilter filter) => filter.matchLabel(context, upQuery); + return SafeArea( + child: NotificationListener( + onNotification: (notification) { + if (notification is SelectFilterNotification) { + _select(context, {notification.filter}); + return true; + } else if (notification is DecomposeFilterNotification) { + final filter = notification.filter; + if (filter is DynamicAlbumFilter) { + final innerFilter = filter.filter; + final newFilters = innerFilter is SetAndFilter ? innerFilter.innerFilters : {innerFilter}; + _select(context, newFilters); + return true; + } + } + return false; + }, + child: ValueListenableBuilder<String?>( + valueListenable: _expandedSectionNotifier, + builder: (context, expandedSection, child) { + final queryFilter = _buildQueryFilter(false); + return Selector<Settings, Set<CollectionFilter>>( + selector: (context, s) => s.hiddenFilters, + builder: (context, hiddenFilters, child) { + bool notHidden(CollectionFilter filter) => !hiddenFilters.contains(filter); + bool isVisible(CollectionFilter filter) => containQuery(filter) && notHidden(filter); + + final visibleTypeFilters = typeFilters.where(notHidden).toList(); + if (hiddenFilters.contains(MimeFilter.video)) { + [MimeFilter.image, TypeFilter.sphericalVideo].forEach(visibleTypeFilters.remove); + } + + final history = settings.searchHistory.where(isVisible).toList(); + + return ListView( + controller: _suggestionsScrollController, + padding: const EdgeInsets.only(top: 8), + children: [ + TvEdgeFocus( + focusNode: _suggestionsTopFocusNode, + ), + _buildFilterRow( + context: context, + filters: [ + queryFilter, + ...visibleTypeFilters, + ].nonNulls.where(isVisible).toList(), + // usually perform hero animation only on tapped chips, + // but we also need to animate the query chip when it is selected by submitting the search query + heroTypeBuilder: (filter) => filter == queryFilter ? HeroType.always : HeroType.onTap, + ), + if (upQuery.isEmpty && history.isNotEmpty) + _buildFilterRow( + context: context, + title: context.l10n.searchRecentSectionTitle, + filters: history, + ), + _buildDateFilters(context, isVisible), + _buildMimeTypeFilters(context, isVisible), + _buildAlbumFilters(isVisible), + _buildCountryFilters(isVisible), + _buildStateFilters(isVisible), + _buildPlaceFilters(isVisible), + _buildTagFilters(isVisible), + _buildRatingFilters(context, isVisible), + _buildMetadataFilters(context, isVisible), + ], + ); + }, + ); + }, + ), + ), + ); + } + + Widget _buildFilterRow({ + required BuildContext context, + String? title, + required List<CollectionFilter> filters, + HeroType Function(CollectionFilter filter)? heroTypeBuilder, + }) { + void onTap(filter) => _select(context, {filter is QueryFilter ? QueryFilter(filter.query) : filter}); + const onLongPress = AvesFilterChip.showDefaultLongPressMenu; + return title != null + ? TitledExpandableFilterRow( + title: title, + filters: filters, + expandedNotifier: _expandedSectionNotifier, + heroTypeBuilder: heroTypeBuilder, + onTap: onTap, + onLongPress: onLongPress, + ) + : ExpandableFilterRow( + filters: filters, + isExpanded: false, + heroTypeBuilder: heroTypeBuilder, + onTap: onTap, + onLongPress: onLongPress, + ); + } + + Widget _buildDateFilters(BuildContext context, CollectionFilterPredicate containQuery) { + final firstDayOfWeekIndex = MaterialLocalizations.of(context).firstDayOfWeekIndex; + const daysPerWeek = DateTime.daysPerWeek; + final _weekdayFilters = List.generate(daysPerWeek, (i) => WeekDayFilter((i + firstDayOfWeekIndex - 1) % daysPerWeek + 1)); + + final filters = [ + DateFilter.onThisDay, + RecentlyAddedFilter.instance, + ..._monthFilters, + ..._weekdayFilters, + ].where(containQuery).toList(); + + return _buildFilterRow( + context: context, + title: context.l10n.searchDateSectionTitle, + filters: filters, + ); + } + + Widget _buildMimeTypeFilters(BuildContext context, CollectionFilterPredicate containQuery) { + final filters = _mimeTypeFilters.where(containQuery).toList(); + return _buildFilterRow( + context: context, + title: context.l10n.searchFormatSectionTitle, + filters: filters, + ); + } + + Widget _buildAlbumFilters(CollectionFilterPredicate containQuery) { + return AnimatedBuilder( + animation: dynamicAlbums, + builder: (context, child) => StreamBuilder( + stream: source.eventBus.on<AlbumsChangedEvent>(), + builder: (context, snapshot) { + final filters = [ + ...albumGrouping.getGroups().map(albumGrouping.uriToFilter), + ...source.rawAlbums.map( + (album) => StoredAlbumFilter( + album, + source.getStoredAlbumDisplayName(context, album), + ), + ), + ...dynamicAlbums.all, + ].nonNulls.where(containQuery).toList()..sort(); + return _buildFilterRow( + context: context, + title: context.l10n.searchAlbumsSectionTitle, + filters: filters, + ); + }, + ), + ); + } + + Widget _buildCountryFilters(CollectionFilterPredicate containQuery) { + return StreamBuilder( + stream: source.eventBus.on<CountriesChangedEvent>(), + builder: (context, snapshot) { + return _buildFilterRow( + context: context, + title: context.l10n.searchCountriesSectionTitle, + filters: source.sortedCountries.map((s) => LocationFilter(LocationLevel.country, s)).where(containQuery).toList(), + ); + }, + ); + } + + Widget _buildStateFilters(CollectionFilterPredicate containQuery) { + return StreamBuilder( + stream: source.eventBus.on<PlacesChangedEvent>(), + builder: (context, snapshot) { + return _buildFilterRow( + context: context, + title: context.l10n.searchStatesSectionTitle, + filters: source.sortedStates.map((s) => LocationFilter(LocationLevel.state, s)).where(containQuery).toList(), + ); + }, + ); + } + + Widget _buildPlaceFilters(CollectionFilterPredicate containQuery) { + return StreamBuilder( + stream: source.eventBus.on<PlacesChangedEvent>(), + builder: (context, snapshot) { + return _buildFilterRow( + context: context, + title: context.l10n.searchPlacesSectionTitle, + filters: source.sortedPlaces.map((s) => LocationFilter(LocationLevel.place, s)).where(containQuery).toList(), + ); + }, + ); + } + + Widget _buildTagFilters(CollectionFilterPredicate containQuery) { + return StreamBuilder( + stream: source.eventBus.on<TagsChangedEvent>(), + builder: (context, snapshot) { + final filters = [ + ...tagGrouping.getGroups().map(tagGrouping.uriToFilter), + ...source.sortedTags.map(TagFilter.new), + ].nonNulls.where(containQuery).toList()..sort(); + return _buildFilterRow( + context: context, + title: context.l10n.searchTagsSectionTitle, + filters: filters, + ); + }, + ); + } + + Widget _buildRatingFilters(BuildContext context, CollectionFilterPredicate containQuery) { + return _buildFilterRow( + context: context, + title: context.l10n.searchRatingSectionTitle, + filters: [5, 4, 3, 2, 1, -1].map(RatingFilter.new).where(containQuery).toList(), + ); + } + + Widget _buildMetadataFilters(BuildContext context, CollectionFilterPredicate containQuery) { + return _buildFilterRow( + context: context, + title: context.l10n.searchMetadataSectionTitle, + filters: [ + MissingFilter.date, + LocationFilter.unlocated, + MissingFilter.fineAddress, + TagFilter(''), + RatingFilter(0), + MissingFilter.title, + ].where(containQuery).toList(), + ); + } + + var _selectingFromQuery = false; + + @override + Widget buildResults(BuildContext context) { + // guard against multiple build calls + if (!_selectingFromQuery) { + _selectingFromQuery = true; + WidgetsBinding.instance.addPostFrameCallback((_) { + // `buildResults` is called in the build phase, + // so we post the call that will filter the collection + // and possibly trigger a rebuild here + _select(context, {_buildQueryFilter(true)}); + }); + } + return const SizedBox(); + } + + QueryFilter? _buildQueryFilter(bool colorful) { + final cleanQuery = query.trim(); + return cleanQuery.isNotEmpty ? QueryFilter(cleanQuery, colorful: colorful) : null; + } + + Future<void> _select(BuildContext context, Set<CollectionFilter?> filters) async { + final newFilters = filters.nonNulls.toSet(); + if (newFilters.isEmpty) { + goBack(context); + return; + } + + for (final filter in newFilters) { + if (!await unlockFilter(context, filter)) return; + + if (settings.saveSearchHistory) { + final history = settings.searchHistory + ..remove(filter) + ..insert(0, filter); + settings.searchHistory = history.take(searchHistoryCount).toList(); + } + } + + if (parentCollection != null) { + _applyToParentCollectionPage(context, newFilters); + } else { + _jumpToCollectionPage(context, newFilters); + } + } + + void _applyToParentCollectionPage(BuildContext context, Set<CollectionFilter> filters) { + parentCollection!.addFilters(filters); + if (Navigator.canPop(context)) { + // We delay closing the current page after applying the filter selection + // so that hero animation target is ready in the `FilterBar`, + // even when the target is a child of an `AnimatedList`. + // Do not use `WidgetsBinding.instance.addPostFrameCallback`, + // as it may not trigger if there is no subsequent build. + Future.delayed(const Duration(milliseconds: 100), () => goBack(context)); + } else { + _jumpToCollectionPage(context, parentCollection!.filters); + } + } + + void _jumpToCollectionPage(BuildContext context, Set<CollectionFilter> filters) { + clean(); + Navigator.maybeOf(context)?.pushAndRemoveUntil( + MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) => CollectionPage( + source: source, + filters: filters, + ), + ), + (route) => false, + ); + } +} diff --git a/lib/widgets/settings/accessibility/accessibility.dart b/lib/widgets/settings/accessibility/accessibility.dart new file mode 100644 index 0000000..b744e83 --- /dev/null +++ b/lib/widgets/settings/accessibility/accessibility.dart @@ -0,0 +1,70 @@ +import 'dart:async'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/accessibility/time_to_take_action.dart'; +import 'package:aves/widgets/settings/common/tile_leading.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves/widgets/settings/settings_definition.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class AccessibilitySection extends SettingsSection { + @override + String get key => 'accessibility'; + + @override + Widget icon(BuildContext context) => SettingsTileLeading( + icon: AIcons.accessibility, + color: context.select<AvesColorsData, Color>((v) => v.accessibility), + ); + + @override + String title(BuildContext context) => context.l10n.settingsAccessibilitySectionTitle; + + @override + Future<List<SettingsTile>> tiles(BuildContext context) => Future.value([ + if (!settings.useTvLayout) SettingsTileAccessibilityShowPinchGestureAlternatives(), + SettingsTileAccessibilityAnimations(), + SettingsTileAccessibilityTimeToTakeAction(), + ]); +} + +class SettingsTileAccessibilityShowPinchGestureAlternatives extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsAccessibilityShowPinchGestureAlternatives; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.showPinchGestureAlternatives, + onChanged: (v) => settings.showPinchGestureAlternatives = v, + title: title(context), + ); +} + +class SettingsTileAccessibilityAnimations extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsRemoveAnimationsTile; + + @override + Widget build(BuildContext context) => SettingsSelectionListTile<AccessibilityAnimations>( + values: AccessibilityAnimations.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.accessibilityAnimations, + onSelection: (v) => settings.accessibilityAnimations = v, + tileTitle: title(context), + dialogTitle: context.l10n.settingsRemoveAnimationsDialogTitle, + ); +} + +class SettingsTileAccessibilityTimeToTakeAction extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsTimeToTakeActionTile; + + @override + Widget build(BuildContext context) => const TimeToTakeActionTile(); +} diff --git a/lib/widgets/settings/accessibility/time_to_take_action.dart b/lib/widgets/settings/accessibility/time_to_take_action.dart new file mode 100644 index 0000000..34455b6 --- /dev/null +++ b/lib/widgets/settings/accessibility/time_to_take_action.dart @@ -0,0 +1,44 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/accessibility_service.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +class TimeToTakeActionTile extends StatefulWidget { + const TimeToTakeActionTile({super.key}); + + @override + State<TimeToTakeActionTile> createState() => _TimeToTakeActionTileState(); +} + +class _TimeToTakeActionTileState extends State<TimeToTakeActionTile> { + late Future<bool> _hasSystemOptionLoader; + + @override + void initState() { + super.initState(); + _hasSystemOptionLoader = AccessibilityService.hasRecommendedTimeouts(); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder<bool>( + future: _hasSystemOptionLoader, + builder: (context, snapshot) { + if (snapshot.hasError || !snapshot.hasData) return const SizedBox(); + final hasSystemOption = snapshot.data!; + final optionValues = hasSystemOption ? AccessibilityTimeout.values : AccessibilityTimeout.values.where((v) => v != AccessibilityTimeout.system).toList(); + + return SettingsSelectionListTile<AccessibilityTimeout>( + values: optionValues, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.timeToTakeAction, + onSelection: (v) => settings.timeToTakeAction = v, + tileTitle: context.l10n.settingsTimeToTakeActionTile, + ); + }, + ); + } +} diff --git a/lib/widgets/settings/app_export/items.dart b/lib/widgets/settings/app_export/items.dart new file mode 100644 index 0000000..a0cb669 --- /dev/null +++ b/lib/widgets/settings/app_export/items.dart @@ -0,0 +1,46 @@ +import 'package:aves/model/covers.dart'; +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +enum AppExportItem { covers, dynamicAlbums, favourites, settings } + +extension ExtraAppExportItem on AppExportItem { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + AppExportItem.covers => l10n.appExportCovers, + AppExportItem.dynamicAlbums => l10n.appExportDynamicAlbums, + AppExportItem.favourites => l10n.appExportFavourites, + AppExportItem.settings => l10n.appExportSettings, + }; + } + + dynamic export(CollectionSource source) { + return switch (this) { + AppExportItem.covers => covers.export(source), + AppExportItem.dynamicAlbums => dynamicAlbums.export(), + AppExportItem.favourites => favourites.export(source), + AppExportItem.settings => settings.export(), + }; + } + + Future<void> import(Object jsonObject, CollectionSource source) async { + switch (this) { + case AppExportItem.covers: + covers.import(jsonObject, source); + case AppExportItem.dynamicAlbums: + dynamicAlbums.import(jsonObject); + case AppExportItem.favourites: + favourites.import(jsonObject, source); + case AppExportItem.settings: + await settings.import(jsonObject); + albumGrouping.setGroups(settings.albumGroups); + tagGrouping.setGroups(settings.tagGroups); + } + } +} diff --git a/lib/widgets/settings/app_export/selection_dialog.dart b/lib/widgets/settings/app_export/selection_dialog.dart new file mode 100644 index 0000000..b057741 --- /dev/null +++ b/lib/widgets/settings/app_export/selection_dialog.dart @@ -0,0 +1,65 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/settings/app_export/items.dart'; +import 'package:flutter/material.dart'; + +class AppExportItemSelectionDialog extends StatefulWidget { + final String title; + final Set<AppExportItem>? selectableItems, initialSelection; + + const AppExportItemSelectionDialog({ + super.key, + required this.title, + this.selectableItems, + this.initialSelection, + }); + + @override + State<AppExportItemSelectionDialog> createState() => _AppExportItemSelectionDialogState(); +} + +class _AppExportItemSelectionDialogState extends State<AppExportItemSelectionDialog> { + final Set<AppExportItem> _selectableItems = {}, _selectedItems = {}; + + @override + void initState() { + super.initState(); + _selectableItems.addAll(widget.selectableItems ?? AppExportItem.values); + _selectedItems.addAll(widget.initialSelection ?? _selectableItems); + } + + @override + Widget build(BuildContext context) { + return AvesDialog( + title: widget.title, + scrollableContent: AppExportItem.values.map((v) { + return SwitchListTile( + value: _selectedItems.contains(v), + onChanged: _selectableItems.contains(v) + ? (selected) { + if (selected == true) { + _selectedItems.add(v); + } else { + _selectedItems.remove(v); + } + setState(() {}); + } + : null, + title: Text( + v.getText(context), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ); + }).toList(), + actions: [ + const CancelButton(), + TextButton( + onPressed: _selectedItems.isEmpty ? null : () => Navigator.maybeOf(context)?.pop(_selectedItems), + child: Text(context.l10n.applyButtonLabel), + ), + ], + ); + } +} diff --git a/lib/widgets/settings/common/collection_tile.dart b/lib/widgets/settings/common/collection_tile.dart new file mode 100644 index 0000000..6543bd7 --- /dev/null +++ b/lib/widgets/settings/common/collection_tile.dart @@ -0,0 +1,71 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/services/intent_service.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/collection/filter_bar.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_caption.dart'; +import 'package:flutter/material.dart'; + +class SettingsCollectionTile extends StatelessWidget { + final Set<CollectionFilter> filters; + final void Function(Set<CollectionFilter>) onSelection; + + const SettingsCollectionTile({ + super.key, + required this.filters, + required this.onSelection, + }); + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final theme = Theme.of(context); + final hasSubtitle = filters.isEmpty; + + // size and padding to match `ListTile` + return ConstrainedBox( + constraints: BoxConstraints( + minHeight: (hasSubtitle ? 72.0 : 56.0) + theme.visualDensity.baseSizeAdjustment.dy, + ), + child: Center( + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + l10n.settingsCollectionTile, + // fallback to `ListTile` M3 default style + style: theme.listTileTheme.titleTextStyle ?? theme.textTheme.bodyLarge!.copyWith(color: theme.colorScheme.onSurface), + ), + if (hasSubtitle) AvesCaption(l10n.drawerCollectionAll), + ], + ), + const Spacer(), + IconButton( + onPressed: () async { + final selection = await IntentService.pickCollectionFilters(filters); + if (selection != null) { + onSelection(selection); + } + }, + icon: const Icon(AIcons.edit), + ), + ], + ), + ), + if (filters.isNotEmpty) + FilterBar( + filters: filters, + interactive: false, + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/settings/common/quick_actions/action_panel.dart b/lib/widgets/settings/common/quick_actions/action_panel.dart new file mode 100644 index 0000000..1593a4d --- /dev/null +++ b/lib/widgets/settings/common/quick_actions/action_panel.dart @@ -0,0 +1,38 @@ +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:flutter/material.dart'; + +class ActionPanel extends StatelessWidget { + final bool highlight; + final Widget child; + + const ActionPanel({ + super.key, + this.highlight = false, + required this.child, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final color = highlight ? theme.colorScheme.primary : Color.alphaBlend(theme.colorScheme.surfaceTint.withValues(alpha: .2), Themes.secondLayerColor(context)); + return AnimatedContainer( + foregroundDecoration: BoxDecoration( + color: color.withValues(alpha: .2), + border: Border.fromBorderSide( + BorderSide( + color: color, + width: highlight ? 2 : 1, + ), + ), + borderRadius: const BorderRadius.all(Radius.circular(8)), + ), + margin: const EdgeInsets.all(16), + duration: ADurations.quickActionHighlightAnimation, + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(8)), + child: child, + ), + ); + } +} diff --git a/lib/widgets/settings/common/quick_actions/available_actions.dart b/lib/widgets/settings/common/quick_actions/available_actions.dart new file mode 100644 index 0000000..064bc60 --- /dev/null +++ b/lib/widgets/settings/common/quick_actions/available_actions.dart @@ -0,0 +1,134 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/settings/common/quick_actions/placeholder.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +class AvailableActionPanel<T extends Object> extends StatelessWidget { + final List<T> allActions, quickActions; + final Listenable quickActionsChangeNotifier; + final ValueNotifier<bool> panelHighlight; + final ValueNotifier<T?> draggedQuickAction; + final ValueNotifier<T?> draggedAvailableAction; + final bool Function(T? action) removeQuickAction; + final Widget Function(BuildContext context, T action) actionIcon; + final String Function(BuildContext context, T action) actionText; + + static const double spacing = 8; + static const double runSpacing = 20; + static const padding = EdgeInsets.symmetric(vertical: 16, horizontal: 8); + + const AvailableActionPanel({ + super.key, + required this.allActions, + required this.quickActions, + required this.quickActionsChangeNotifier, + required this.panelHighlight, + required this.draggedQuickAction, + required this.draggedAvailableAction, + required this.removeQuickAction, + required this.actionIcon, + required this.actionText, + }); + + @override + Widget build(BuildContext context) { + return DragTarget<T>( + onWillAcceptWithDetails: (details) { + if (draggedQuickAction.value != null) { + _setPanelHighlight(true); + } + return true; + }, + onAcceptWithDetails: (details) { + removeQuickAction(draggedQuickAction.value); + _setDraggedQuickAction(null); + _setPanelHighlight(false); + }, + onLeave: (data) => _setPanelHighlight(false), + builder: (context, accepted, rejected) { + return AnimatedBuilder( + animation: Listenable.merge([quickActionsChangeNotifier, draggedAvailableAction]), + builder: (context, child) { + return Padding( + padding: padding, + child: Wrap( + alignment: WrapAlignment.spaceEvenly, + spacing: spacing, + runSpacing: runSpacing, + children: allActions.map((action) { + final dragged = action == draggedAvailableAction.value; + final enabled = dragged || !quickActions.contains(action); + var child = _buildActionButton(context, action, enabled: enabled); + if (dragged) { + child = DraggedPlaceholder(child: child); + } + if (enabled) { + child = _buildDraggable(context, action, child); + } + return child; + }).toList(), + ), + ); + }, + ); + }, + ); + } + + Widget _buildDraggable( + BuildContext context, + T action, + Widget child, + ) => LongPressDraggable<T>( + feedback: MediaQueryDataProvider( + child: _buildActionButton( + context, + action, + showCaption: false, + ), + ), + data: action, + dragAnchorStrategy: (draggable, context, position) { + return childDragAnchorStrategy(draggable, context, position) + Offset(0, OverlayButton.getSize(context)); + }, + maxSimultaneousDrags: 1, + onDragStarted: () => _setDraggedAvailableAction(action), + onDragEnd: (details) => _setDraggedAvailableAction(null), + delay: settings.longPressTimeout, + childWhenDragging: child, + child: child, + ); + + Widget _buildActionButton( + BuildContext context, + T action, { + bool enabled = true, + bool showCaption = true, + }) => CaptionedButton( + icon: actionIcon(context, action), + caption: actionText(context, action), + showCaption: showCaption, + onPressed: enabled ? () {} : null, + ); + + void _setDraggedQuickAction(T? action) => draggedQuickAction.value = action; + + void _setDraggedAvailableAction(T? action) => draggedAvailableAction.value = action; + + void _setPanelHighlight(bool flag) => panelHighlight.value = flag; + + static double heightFor(BuildContext context, List<String> captions, double width) { + final buttonSizes = captions.map((v) => CaptionedButton.getSize(context, v, showCaption: true)); + final actionsPerRun = (width - padding.horizontal + spacing) ~/ (buttonSizes.first.width + spacing); + final runCount = (captions.length / actionsPerRun).ceil(); + var height = runSpacing * (runCount - 1) + padding.vertical / 2; + for (var i = 0; i < runCount; i++) { + height += buttonSizes.skip(i * actionsPerRun).take(actionsPerRun).map((v) => v.height).max; + } + return height; + } +} diff --git a/lib/widgets/settings/common/quick_actions/editor_page.dart b/lib/widgets/settings/common/quick_actions/editor_page.dart new file mode 100644 index 0000000..e11cf13 --- /dev/null +++ b/lib/widgets/settings/common/quick_actions/editor_page.dart @@ -0,0 +1,464 @@ +import 'dart:async'; + +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/settings/common/quick_actions/action_panel.dart'; +import 'package:aves/widgets/settings/common/quick_actions/available_actions.dart'; +import 'package:aves/widgets/settings/common/quick_actions/placeholder.dart'; +import 'package:aves/widgets/settings/common/quick_actions/quick_actions.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:smooth_page_indicator/smooth_page_indicator.dart'; + +class QuickActionEditorController<T extends Object> with ChangeNotifier { + final List<T> Function() load; + final void Function(List<T> actions) save; + + List<T> _currentItems = []; + final StreamController<EditorControllerEvent<T>> _eventsController = StreamController.broadcast(); + + Stream<EditorControllerEvent<T>> get events => _eventsController.stream; + + QuickActionEditorController({ + required this.load, + required this.save, + }); + + void notify() { + notifyListeners(); + } + + bool add(T? item) => insert(_currentItems.length, item); + + bool insert(int index, T? item) { + if (item == null || _currentItems.contains(item)) return false; + + _currentItems.insert(index, item); + _eventsController.add(_ItemAddedEvent(index, item)); + notify(); + return true; + } + + bool remove(T? item) { + if (item == null || !_currentItems.contains(item)) return false; + + final index = _currentItems.indexOf(item); + _currentItems.removeAt(index); + _eventsController.add(_ItemRemovedEvent(index, item)); + notify(); + return true; + } +} + +class EditorControllerEvent<T> { + final int index; + final T item; + + EditorControllerEvent(this.index, this.item); +} + +class _ItemAddedEvent<T> extends EditorControllerEvent<T> { + _ItemAddedEvent(super.index, super.item); +} + +class _ItemRemovedEvent<T> extends EditorControllerEvent<T> { + _ItemRemovedEvent(super.index, super.item); +} + +class QuickActionEditorPage<T extends Object> extends StatelessWidget { + final String title, bannerText; + final List<Widget>? appBarActions; + final TextDirection? displayedButtonsDirection; + final List<List<T>> allAvailableActions; + final Widget Function(BuildContext context, T action) actionIcon; + final String Function(BuildContext context, T action) actionText; + final QuickActionEditorController<T> controller; + + const QuickActionEditorPage({ + super.key, + required this.title, + this.appBarActions, + required this.bannerText, + this.displayedButtonsDirection, + required this.allAvailableActions, + required this.actionIcon, + required this.actionText, + required this.controller, + }); + + @override + Widget build(BuildContext context) { + return AvesScaffold( + appBar: AppBar( + title: Text(title), + actions: appBarActions, + ), + body: SafeArea( + bottom: false, + child: QuickActionEditorBody( + bannerText: bannerText, + displayedButtonsDirection: displayedButtonsDirection, + allAvailableActions: allAvailableActions, + actionIcon: actionIcon, + actionText: actionText, + controller: controller, + ), + ), + ); + } +} + +class QuickActionEditorBody<T extends Object> extends StatefulWidget { + final String bannerText; + final TextDirection? displayedButtonsDirection; + final List<List<T>> allAvailableActions; + final Widget Function(BuildContext context, T action) actionIcon; + final String Function(BuildContext context, T action) actionText; + final QuickActionEditorController<T> controller; + + const QuickActionEditorBody({ + super.key, + required this.bannerText, + this.displayedButtonsDirection, + required this.allAvailableActions, + required this.actionIcon, + required this.actionText, + required this.controller, + }); + + @override + State<QuickActionEditorBody<T>> createState() => _QuickActionEditorBodyState<T>(); +} + +class _QuickActionEditorBodyState<T extends Object> extends State<QuickActionEditorBody<T>> with AutomaticKeepAliveClientMixin { + final Set<StreamSubscription> _subscriptions = {}; + final GlobalKey<AnimatedListState> _animatedListKey = GlobalKey(debugLabel: 'quick-actions-animated-list'); + Timer? _targetLeavingTimer; + final ValueNotifier<T?> _draggedQuickAction = ValueNotifier(null); + final ValueNotifier<T?> _draggedAvailableAction = ValueNotifier(null); + final ValueNotifier<bool> _quickActionHighlight = ValueNotifier(false); + final ValueNotifier<bool> _availableActionHighlight = ValueNotifier(false); + final PageController _availableActionPageController = PageController(); + + // use a flag to prevent quick action target accept/leave when already animating reorder + // as dragging a button against axis direction messes index resolution while items pop in and out + bool _reordering = false; + + QuickActionEditorController<T> get controller => widget.controller; + + static const _listAnimation = ADurations.quickActionListAnimation; + static const double _quickActionVerticalPadding = 16.0; + + @override + void initState() { + super.initState(); + controller._currentItems = controller.load().toList(); + _subscriptions.add( + controller.events.listen((e) { + switch (e) { + case _ItemAddedEvent(): + _animatedListKey.currentState!.insertItem( + e.index, + duration: _listAnimation, + ); + case _ItemRemovedEvent(): + _animatedListKey.currentState!.removeItem( + e.index, + (context, animation) => DraggedPlaceholder(child: _buildQuickActionButton(e.item, animation)), + duration: _listAnimation, + ); + } + }), + ); + } + + @override + void dispose() { + _draggedQuickAction.dispose(); + _draggedAvailableAction.dispose(); + _quickActionHighlight.dispose(); + _availableActionHighlight.dispose(); + _availableActionPageController.dispose(); + + _stopLeavingTimer(); + super.dispose(); + } + + void _onQuickActionTargetLeave() { + _stopLeavingTimer(); + final action = _draggedAvailableAction.value; + _targetLeavingTimer = Timer(_listAnimation + const Duration(milliseconds: 50), () { + _removeQuickAction(action); + _quickActionHighlight.value = false; + }); + } + + @override + Widget build(BuildContext context) { + super.build(context); + + final _quickActions = controller._currentItems; + final theme = Theme.of(context); + final colorScheme = theme.colorScheme; + final header = QuickActionButton<T>( + placement: QuickActionPlacement.header, + panelHighlight: _quickActionHighlight, + draggedQuickAction: _draggedQuickAction, + draggedAvailableAction: _draggedAvailableAction, + insertAction: _insertQuickAction, + removeAction: _removeQuickAction, + onTargetLeave: _onQuickActionTargetLeave, + ); + final footer = QuickActionButton<T>( + placement: QuickActionPlacement.footer, + panelHighlight: _quickActionHighlight, + draggedQuickAction: _draggedQuickAction, + draggedAvailableAction: _draggedAvailableAction, + insertAction: _insertQuickAction, + removeAction: _removeQuickAction, + onTargetLeave: _onQuickActionTargetLeave, + ); + final originalDirection = Directionality.of(context); + return PopScope( + onPopInvokedWithResult: (didPop, result) => widget.controller.save(_quickActions), + child: ListView( + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Row( + children: [ + const FontSizeIconTheme(child: Icon(AIcons.info)), + const SizedBox(width: 16), + Expanded(child: Text(widget.bannerText)), + ], + ), + ), + const Divider(height: 0), + Padding( + padding: const EdgeInsets.only(left: 16, top: 16, right: 16), + child: Text( + context.l10n.settingsViewerQuickActionEditorDisplayedButtonsSectionTitle, + style: AStyles.knownTitleText, + ), + ), + ValueListenableBuilder<bool>( + valueListenable: _quickActionHighlight, + builder: (context, highlight, child) => ActionPanel( + highlight: highlight, + child: child!, + ), + child: Directionality( + textDirection: widget.displayedButtonsDirection ?? originalDirection, + child: SizedBox( + height: OverlayButton.getSize(context) + _quickActionVerticalPadding * 2, + child: Stack( + children: [ + Positioned.fill( + child: FractionallySizedBox( + alignment: AlignmentDirectional.centerStart, + widthFactor: .5, + child: header, + ), + ), + Positioned.fill( + child: FractionallySizedBox( + alignment: AlignmentDirectional.centerEnd, + widthFactor: .5, + child: footer, + ), + ), + Container( + alignment: Alignment.center, + child: AnimatedList( + key: _animatedListKey, + initialItemCount: _quickActions.length, + scrollDirection: Axis.horizontal, + shrinkWrap: true, + padding: EdgeInsets.zero, + itemBuilder: (context, index, animation) { + if (index >= _quickActions.length) return const SizedBox(); + final action = _quickActions[index]; + return Directionality( + textDirection: originalDirection, + child: QuickActionButton<T>( + placement: QuickActionPlacement.action, + action: action, + panelHighlight: _quickActionHighlight, + draggedQuickAction: _draggedQuickAction, + draggedAvailableAction: _draggedAvailableAction, + insertAction: _insertQuickAction, + removeAction: _removeQuickAction, + onTargetLeave: _onQuickActionTargetLeave, + draggableFeedbackBuilder: (action) => CaptionedButton( + icon: widget.actionIcon(context, action), + caption: widget.actionText(context, action), + showCaption: false, + onPressed: () {}, + ), + child: _buildQuickActionButton(action, animation), + ), + ); + }, + ), + ), + AnimatedBuilder( + animation: controller, + builder: (context, child) => _quickActions.isEmpty + ? Center( + child: Text( + context.l10n.settingsViewerQuickActionEmpty, + style: theme.textTheme.bodySmall, + ), + ) + : const SizedBox(), + ), + ], + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Text( + context.l10n.settingsViewerQuickActionEditorAvailableButtonsSectionTitle, + style: AStyles.knownTitleText, + ), + ), + ValueListenableBuilder<bool>( + valueListenable: _availableActionHighlight, + builder: (context, highlight, child) => ActionPanel( + highlight: highlight, + child: child!, + ), + child: LayoutBuilder( + builder: (context, constraints) { + final allAvailableActions = widget.allAvailableActions; + final maxWidth = constraints.maxWidth; + final maxHeight = allAvailableActions + .map( + (page) => AvailableActionPanel.heightFor( + context, + page.map((v) => widget.actionText(context, v)).toList(), + maxWidth, + ), + ) + .max; + return Column( + children: [ + if (allAvailableActions.length > 1) + Padding( + padding: const EdgeInsets.only(top: 8), + child: SmoothPageIndicator( + controller: _availableActionPageController, + count: allAvailableActions.length, + effect: WormEffect( + dotWidth: 8, + dotHeight: 8, + dotColor: colorScheme.onSurface.withValues(alpha: .2), + activeDotColor: colorScheme.primary, + ), + ), + ), + SizedBox( + height: maxHeight, + child: PageView( + controller: _availableActionPageController, + children: allAvailableActions + .map( + (allActions) => AvailableActionPanel<T>( + allActions: allActions, + quickActions: _quickActions, + quickActionsChangeNotifier: controller, + panelHighlight: _availableActionHighlight, + draggedQuickAction: _draggedQuickAction, + draggedAvailableAction: _draggedAvailableAction, + removeQuickAction: _removeQuickAction, + actionIcon: widget.actionIcon, + actionText: widget.actionText, + ), + ) + .toList(), + ), + ), + ], + ); + }, + ), + ), + ], + ), + ); + } + + void _stopLeavingTimer() => _targetLeavingTimer?.cancel(); + + bool _insertQuickAction(T action, QuickActionPlacement placement, T? overAction) { + _stopLeavingTimer(); + if (_reordering) return false; + + final _quickActions = controller._currentItems; + final currentIndex = _quickActions.indexOf(action); + final contained = currentIndex != -1; + int? targetIndex; + switch (placement) { + case QuickActionPlacement.header: + targetIndex = 0; + case QuickActionPlacement.footer: + targetIndex = _quickActions.length - (contained ? 1 : 0); + case QuickActionPlacement.action: + targetIndex = _quickActions.indexOf(overAction!); + } + if (currentIndex == targetIndex) return false; + + _reordering = true; + _removeQuickAction(action); + controller.insert(targetIndex, action); + Future.delayed(_listAnimation).then((value) => _reordering = false); + return true; + } + + bool _removeQuickAction(T? action) => controller.remove(action); + + Widget _buildQuickActionButton(T action, Animation<double> animation) { + animation = animation.drive(CurveTween(curve: Curves.easeInOut)); + Widget child = FadeTransition( + opacity: animation, + child: SizeTransition( + axis: Axis.horizontal, + sizeFactor: animation, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: _QuickActionEditorBodyState._quickActionVerticalPadding, horizontal: 4), + child: OverlayButton( + child: IconButton( + icon: widget.actionIcon(context, action), + onPressed: () {}, + ), + ), + ), + ), + ); + + child = AnimatedBuilder( + animation: Listenable.merge([_draggedQuickAction, _draggedAvailableAction]), + builder: (context, child) { + final dragged = _draggedQuickAction.value == action || _draggedAvailableAction.value == action; + if (dragged) { + child = DraggedPlaceholder(child: child!); + } + return child!; + }, + child: child, + ); + + return child; + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/widgets/settings/common/quick_actions/placeholder.dart b/lib/widgets/settings/common/quick_actions/placeholder.dart new file mode 100644 index 0000000..8024dcc --- /dev/null +++ b/lib/widgets/settings/common/quick_actions/placeholder.dart @@ -0,0 +1,18 @@ +import 'package:flutter/widgets.dart'; + +class DraggedPlaceholder extends StatelessWidget { + final Widget child; + + const DraggedPlaceholder({ + super.key, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return Opacity( + opacity: .2, + child: child, + ); + } +} diff --git a/lib/widgets/settings/common/quick_actions/quick_actions.dart b/lib/widgets/settings/common/quick_actions/quick_actions.dart new file mode 100644 index 0000000..2e46d3d --- /dev/null +++ b/lib/widgets/settings/common/quick_actions/quick_actions.dart @@ -0,0 +1,84 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:flutter/widgets.dart'; + +enum QuickActionPlacement { header, action, footer } + +class QuickActionButton<T extends Object> extends StatelessWidget { + final QuickActionPlacement placement; + final T? action; + final ValueNotifier<bool> panelHighlight; + final ValueNotifier<T?> draggedQuickAction; + final ValueNotifier<T?> draggedAvailableAction; + final bool Function(T action, QuickActionPlacement placement, T? overAction) insertAction; + final bool Function(T action) removeAction; + final VoidCallback onTargetLeave; + final Widget Function(T action)? draggableFeedbackBuilder; + final Widget? child; + + const QuickActionButton({ + super.key, + required this.placement, + this.action, + required this.panelHighlight, + required this.draggedQuickAction, + required this.draggedAvailableAction, + required this.insertAction, + required this.removeAction, + required this.onTargetLeave, + this.draggableFeedbackBuilder, + this.child, + }); + + @override + Widget build(BuildContext context) { + var child = this.child; + child = _buildDragTarget(child); + if (action != null) { + child = _buildDraggable(child, action!); + } + return child; + } + + DragTarget<T> _buildDragTarget(Widget? child) { + return DragTarget<T>( + onWillAcceptWithDetails: (details) { + if (draggedQuickAction.value != null) { + insertAction(draggedQuickAction.value!, placement, action); + } + if (draggedAvailableAction.value != null) { + insertAction(draggedAvailableAction.value!, placement, action); + _setPanelHighlight(true); + } + return true; + }, + onAcceptWithDetails: (details) => _setPanelHighlight(false), + onLeave: (data) => onTargetLeave(), + builder: (context, accepted, rejected) => child ?? const SizedBox(), + ); + } + + Widget _buildDraggable(Widget child, T action) => LongPressDraggable( + feedback: MediaQueryDataProvider( + child: draggableFeedbackBuilder!(action), + ), + data: action, + dragAnchorStrategy: (draggable, context, position) { + return childDragAnchorStrategy(draggable, context, position) + Offset(0, OverlayButton.getSize(context)); + }, + maxSimultaneousDrags: 1, + onDragStarted: () => _setDraggedQuickAction(action), + // `onDragEnd` is only called when the widget is mounted, + // so we rely on `onDraggableCanceled` and `onDragCompleted` instead + onDraggableCanceled: (velocity, offset) => _setDraggedQuickAction(null), + onDragCompleted: () => _setDraggedQuickAction(null), + delay: settings.longPressTimeout, + childWhenDragging: child, + child: child, + ); + + void _setDraggedQuickAction(T? action) => draggedQuickAction.value = action; + + void _setPanelHighlight(bool flag) => panelHighlight.value = flag; +} diff --git a/lib/widgets/settings/common/switch_icon.dart b/lib/widgets/settings/common/switch_icon.dart new file mode 100644 index 0000000..ff176a2 --- /dev/null +++ b/lib/widgets/settings/common/switch_icon.dart @@ -0,0 +1,40 @@ +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class SettingSwitchTrailingIcon extends StatelessWidget { + final IconData icon; + final bool disabled; + + const SettingSwitchTrailingIcon({ + super.key, + required this.icon, + required this.disabled, + }); + + @override + Widget build(BuildContext context) { + return Padding( + // Switch width (`_kSwitchWidth`) + tile content padding + padding: const EdgeInsetsDirectional.only(end: 59 + 16), + child: AnimatedSwitcher( + duration: context.read<DurationsData>().iconAnimation, + child: Icon( + icon, + key: key, + size: getIconSize(context), + color: getIconColor(context).withValues(alpha: disabled ? SettingsSwitchListTile.disabledOpacity : 1), + ), + ), + ); + } + + static double getIconSize(BuildContext context) { + final textScaler = MediaQuery.textScalerOf(context); + return textScaler.scale(IconTheme.of(context).size!); + } + + static Color getIconColor(BuildContext context) => context.select<AvesColorsData, Color>((v) => v.neutral); +} diff --git a/lib/widgets/settings/common/tile_leading.dart b/lib/widgets/settings/common/tile_leading.dart new file mode 100644 index 0000000..613ff87 --- /dev/null +++ b/lib/widgets/settings/common/tile_leading.dart @@ -0,0 +1,42 @@ +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:decorated_icon/decorated_icon.dart'; +import 'package:flutter/material.dart'; + +class SettingsTileLeading extends StatelessWidget { + final IconData icon; + final Color color; + + const SettingsTileLeading({ + super.key, + required this.icon, + required this.color, + }); + + @override + Widget build(BuildContext context) { + return AnimatedContainer( + padding: const EdgeInsets.all(6), + decoration: BoxDecoration( + color: Themes.firstLayerColor(context), + border: Border.fromBorderSide( + BorderSide( + color: color, + width: AvesFilterChip.outlineWidth, + ), + ), + shape: BoxShape.circle, + ), + duration: ADurations.themeColorModeAnimation, + child: DecoratedIcon( + icon, + size: 18, + color: DefaultTextStyle.of(context).style.color, + shadows: Theme.of(context).isDark ? AStyles.embossShadows : null, + ), + ); + } +} diff --git a/lib/widgets/settings/common/tiles.dart b/lib/widgets/settings/common/tiles.dart new file mode 100644 index 0000000..706c221 --- /dev/null +++ b/lib/widgets/settings/common/tiles.dart @@ -0,0 +1,241 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_caption.dart'; +import 'package:aves/widgets/dialogs/duration_dialog.dart'; +import 'package:aves/widgets/dialogs/selection_dialogs/common.dart'; +import 'package:aves/widgets/dialogs/selection_dialogs/multi_selection.dart'; +import 'package:aves/widgets/dialogs/selection_dialogs/single_selection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class SettingsSubPageTile extends StatelessWidget { + final String title, routeName; + final WidgetBuilder builder; + + const SettingsSubPageTile({ + super.key, + required this.title, + required this.routeName, + required this.builder, + }); + + @override + Widget build(BuildContext context) { + return ListTile( + title: Text(title), + onTap: () { + Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: RouteSettings(name: routeName), + builder: builder, + ), + ); + }, + ); + } +} + +class SettingsSwitchListTile extends StatelessWidget { + final bool Function(BuildContext, Settings) selector; + final ValueChanged<bool>? onChanged; + final String title; + final String? subtitle; + final Widget? trailing; + + static const disabledOpacity = .2; + + const SettingsSwitchListTile({ + super.key, + required this.selector, + required this.onChanged, + required this.title, + this.subtitle, + this.trailing, + }); + + @override + Widget build(BuildContext context) { + return Selector<Settings, bool>( + selector: selector, + builder: (context, current, child) { + Widget titleWidget = Text(title); + if (trailing != null) { + titleWidget = Row( + children: [ + Expanded(child: titleWidget), + AnimatedOpacity( + opacity: current && onChanged != null ? 1 : disabledOpacity, + duration: ADurations.toggleableTransitionLoose, + child: trailing, + ), + ], + ); + } + return SwitchListTile( + value: current, + onChanged: onChanged, + title: titleWidget, + subtitle: subtitle != null ? Text(subtitle!) : null, + ); + }, + ); + } +} + +class SettingsSelectionListTile<T> extends StatelessWidget { + final List<T> values; + final String Function(BuildContext, T) getName; + final T Function(BuildContext, Settings) selector; + final ValueChanged<T> onSelection; + final String tileTitle; + final WidgetBuilder? trailingBuilder; + final String? dialogTitle; + final TextBuilder<T>? optionSubtitleBuilder; + + const SettingsSelectionListTile({ + super.key, + required this.values, + required this.getName, + required this.selector, + required this.onSelection, + required this.tileTitle, + this.trailingBuilder, + this.dialogTitle, + this.optionSubtitleBuilder, + }); + + @override + Widget build(BuildContext context) { + return Selector<Settings, T>( + selector: selector, + builder: (context, current, child) { + Widget titleWidget = Text(tileTitle); + if (trailingBuilder != null) { + titleWidget = Row( + children: [ + Expanded(child: titleWidget), + trailingBuilder!(context), + ], + ); + } + return ListTile( + title: titleWidget, + subtitle: AvesCaption(getName(context, current)), + onTap: () => showSelectionDialog<T>( + context: context, + builder: (context) => AvesSingleSelectionDialog<T>( + initialValue: current, + options: Map.fromEntries(values.map((v) => MapEntry(v, getName(context, v)))), + optionSubtitleBuilder: optionSubtitleBuilder, + title: dialogTitle, + ), + onSelection: onSelection, + ), + ); + }, + ); + } +} + +class SettingsMultiSelectionListTile<T> extends StatelessWidget { + final List<T> values; + final String Function(BuildContext, T) getName; + final List<T> Function(BuildContext, Settings) selector; + final ValueChanged<List<T>> onSelection; + final String tileTitle, noneSubtitle; + final WidgetBuilder? trailingBuilder; + final String? dialogTitle; + final TextBuilder<T>? optionSubtitleBuilder; + + const SettingsMultiSelectionListTile({ + super.key, + required this.values, + required this.getName, + required this.selector, + required this.onSelection, + required this.tileTitle, + required this.noneSubtitle, + this.trailingBuilder, + this.dialogTitle, + this.optionSubtitleBuilder, + }); + + @override + Widget build(BuildContext context) { + return Selector<Settings, List<T>>( + selector: selector, + builder: (context, current, child) { + Widget titleWidget = Text(tileTitle); + if (trailingBuilder != null) { + titleWidget = Row( + children: [ + Expanded(child: titleWidget), + trailingBuilder!(context), + ], + ); + } + return ListTile( + title: titleWidget, + subtitle: AvesCaption(current.isEmpty ? noneSubtitle : current.map((v) => getName(context, v)).join(AText.separator)), + onTap: () => showSelectionDialog<List<T>>( + context: context, + builder: (context) => AvesMultiSelectionDialog<T>( + initialValue: current.toSet(), + options: Map.fromEntries(values.map((v) => MapEntry(v, getName(context, v)))), + optionSubtitleBuilder: optionSubtitleBuilder, + title: dialogTitle, + ), + onSelection: onSelection, + ), + ); + }, + ); + } +} + +class SettingsDurationListTile extends StatelessWidget { + final int Function(BuildContext, Settings) selector; + final ValueChanged<int> onChanged; + final String title; + + const SettingsDurationListTile({ + super.key, + required this.selector, + required this.onChanged, + required this.title, + }); + + @override + Widget build(BuildContext context) { + return Selector<Settings, int>( + selector: selector, + builder: (context, current, child) { + final currentMinutes = current ~/ secondsInMinute; + final currentSeconds = current % secondsInMinute; + + final l10n = context.l10n; + final subtitle = [ + if (currentMinutes > 0) l10n.timeMinutes(currentMinutes), + if (currentSeconds > 0) l10n.timeSeconds(currentSeconds), + ].join(' '); + + return ListTile( + title: Text(title), + subtitle: AvesCaption(subtitle), + onTap: () async { + final v = await showDialog<int>( + context: context, + builder: (context) => DurationDialog(initialSeconds: current), + ); + if (v != null) { + onChanged(v); + } + }, + ); + }, + ); + } +} diff --git a/lib/widgets/settings/display/display.dart b/lib/widgets/settings/display/display.dart new file mode 100644 index 0000000..4c66c43 --- /dev/null +++ b/lib/widgets/settings/display/display.dart @@ -0,0 +1,151 @@ +import 'dart:async'; + +import 'package:aves/model/device.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/settings/common/tile_leading.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves/widgets/settings/privacy/privacy.dart'; +import 'package:aves/widgets/settings/settings_definition.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class DisplaySection extends SettingsSection { + @override + String get key => 'display'; + + @override + Widget icon(BuildContext context) => SettingsTileLeading( + icon: AIcons.display, + color: context.select<AvesColorsData, Color>((v) => v.display), + ); + + @override + String title(BuildContext context) => context.l10n.settingsDisplaySectionTitle; + + @override + Future<List<SettingsTile>> tiles(BuildContext context) => Future.value([ + if (!settings.useTvLayout) SettingsTileDisplayThemeBrightness(), + SettingsTileDisplayThemeColorMode(), + if (device.isDynamicColorAvailable) SettingsTileDisplayEnableDynamicColor(), + SettingsTileDisplayEnableBlurEffect(), + if (!settings.useTvLayout) SettingsTileDisplayMaxBrightness(), + if (!settings.useTvLayout) SettingsTileDisplayRefreshRateMode(), + if (!device.isTelevision) SettingsTileDisplayForceTvLayout(), + ]); +} + +class SettingsTileDisplayThemeBrightness extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsThemeBrightnessTile; + + @override + Widget build(BuildContext context) => SettingsSelectionListTile<AvesThemeBrightness>( + values: AvesThemeBrightness.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.themeBrightness, + onSelection: (v) => settings.themeBrightness = v, + tileTitle: title(context), + dialogTitle: context.l10n.settingsThemeBrightnessDialogTitle, + ); +} + +class SettingsTileDisplayThemeColorMode extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsThemeColorHighlights; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.themeColorMode == AvesThemeColorMode.polychrome, + onChanged: (v) => settings.themeColorMode = v ? AvesThemeColorMode.polychrome : AvesThemeColorMode.monochrome, + title: title(context), + ); +} + +class SettingsTileDisplayEnableDynamicColor extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsThemeEnableDynamicColor; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.enableDynamicColor, + onChanged: (v) => settings.enableDynamicColor = v, + title: title(context), + ); +} + +class SettingsTileDisplayEnableBlurEffect extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsViewerEnableOverlayBlurEffect; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.enableBlurEffect, + onChanged: (v) => settings.enableBlurEffect = v, + title: title(context), + ); +} + +class SettingsTileDisplayMaxBrightness extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsViewerMaximumBrightness; + + @override + Widget build(BuildContext context) => SettingsSelectionListTile<MaxBrightness>( + values: MaxBrightness.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.maxBrightness, + onSelection: (v) => settings.maxBrightness = v, + tileTitle: title(context), + ); +} + +class SettingsTileDisplayRefreshRateMode extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsDisplayRefreshRateModeTile; + + @override + Widget build(BuildContext context) => SettingsSelectionListTile<DisplayRefreshRateMode>( + values: DisplayRefreshRateMode.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.displayRefreshRateMode, + onSelection: (v) => settings.displayRefreshRateMode = v, + tileTitle: title(context), + dialogTitle: context.l10n.settingsDisplayRefreshRateModeDialogTitle, + ); +} + +class SettingsTileDisplayForceTvLayout extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsDisplayUseTvInterface; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.forceTvLayout, + onChanged: (v) async { + if (v) { + final l10n = context.l10n; + if (!await showConfirmationDialog( + context: context, + message: [ + l10n.settingsModificationWarningDialogMessage, + l10n.genericDangerWarningDialogMessage, + ].join('\n\n'), + ok: l10n.applyButtonLabel, + )) { + return; + } + } + + if (v && !(await SettingsTilePrivacyEnableBin.setBinUsage(context, false))) return; + + settings.forceTvLayout = v; + }, + title: title(context), + ); +} diff --git a/lib/widgets/settings/home_widget_settings_page.dart b/lib/widgets/settings/home_widget_settings_page.dart new file mode 100644 index 0000000..e6f209f --- /dev/null +++ b/lib/widgets/settings/home_widget_settings_page.dart @@ -0,0 +1,316 @@ +import 'package:aves/model/device.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/enums/widget_outline.dart'; +import 'package:aves/model/settings/enums/widget_shape.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/widget_service.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/basic/color_indicator.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; +import 'package:aves/widgets/home_widget.dart'; +import 'package:aves/widgets/settings/common/collection_tile.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class HomeWidgetSettingsPage extends StatefulWidget { + static const routeName = '/settings/home_widget'; + + final int widgetId; + + const HomeWidgetSettingsPage({ + super.key, + required this.widgetId, + }); + + @override + State<HomeWidgetSettingsPage> createState() => _HomeWidgetSettingsPageState(); +} + +class _HomeWidgetSettingsPageState extends State<HomeWidgetSettingsPage> { + late Future<double?> _cornerRadiusPxLoader; + late WidgetShape _shape; + late WidgetOutline _outline; + late WidgetOpenPage _openPage; + late WidgetDisplayedItem _displayedItem; + late Set<CollectionFilter> _collectionFilters; + Future<Map<Brightness, Map<WidgetOutline, Color?>>> _outlineColorsByBrightness = Future.value({}); + + int get widgetId => widget.widgetId; + + static const gradient = HomeWidgetPainter.backgroundGradient; + static final deselectedGradient = LinearGradient( + begin: gradient.begin, + end: gradient.end, + colors: gradient.colors.map((v) { + final l = v.computeLuminance(); + return Color.from(alpha: 1, red: l, green: l, blue: l); + }).toList(), + stops: gradient.stops, + tileMode: gradient.tileMode, + transform: gradient.transform, + ); + + @override + void initState() { + super.initState(); + _cornerRadiusPxLoader = deviceService.getWidgetCornerRadiusPx(); + _shape = settings.getWidgetShape(widgetId); + _outline = settings.getWidgetOutline(widgetId); + _openPage = settings.getWidgetOpenPage(widgetId); + _displayedItem = settings.getWidgetDisplayedItem(widgetId); + _collectionFilters = settings.getWidgetCollectionFilters(widgetId); + WidgetsBinding.instance.addPostFrameCallback((_) => _updateOutlineColors()); + } + + void _updateOutlineColors() { + _outlineColorsByBrightness = _loadOutlineColors(); + setState(() {}); + } + + Future<Map<Brightness, Map<WidgetOutline, Color?>>> _loadOutlineColors() async { + final byBrightness = <Brightness, Map<WidgetOutline, Color?>>{}; + await Future.forEach(Brightness.values, (brightness) async { + final byOutline = <WidgetOutline, Color?>{}; + await Future.forEach(WidgetOutline.values, (outline) async { + byOutline[outline] = await outline.color(brightness); + }); + byBrightness[brightness] = byOutline; + }); + return byBrightness; + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return AvesScaffold( + appBar: AppBar( + title: Text(l10n.settingsWidgetPageTitle), + ), + body: SafeArea( + child: FutureBuilder<Map<Brightness, Map<WidgetOutline, Color?>>>( + future: _outlineColorsByBrightness, + builder: (context, snapshot) { + final outlineColorsByBrightness = snapshot.data; + if (outlineColorsByBrightness == null) return const SizedBox(); + + final effectiveOutlineColors = outlineColorsByBrightness[Theme.of(context).brightness]; + if (effectiveOutlineColors == null) return const SizedBox(); + + return Column( + children: [ + Expanded( + child: ListView( + children: [ + FutureBuilder<double?>( + future: _cornerRadiusPxLoader, + builder: (context, snapshot) { + final cornerRadiusPx = snapshot.data; + final cornerRadius = cornerRadiusPx != null ? cornerRadiusPx / MediaQuery.devicePixelRatioOf(context) : null; + return _buildShapeSelector(effectiveOutlineColors, cornerRadius); + }, + ), + ListTile( + title: Text(l10n.settingsWidgetShowOutline), + trailing: HomeWidgetOutlineSelector( + getter: () => _outline, + setter: (v) => setState(() => _outline = v), + outlineColorsByBrightness: outlineColorsByBrightness, + ), + ), + SettingsSelectionListTile<WidgetOpenPage>( + values: WidgetOpenPage.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => _openPage, + onSelection: (v) => setState(() => _openPage = v), + tileTitle: l10n.settingsWidgetOpenPage, + ), + SettingsSelectionListTile<WidgetDisplayedItem>( + values: WidgetDisplayedItem.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => _displayedItem, + onSelection: (v) => setState(() => _displayedItem = v), + tileTitle: l10n.settingsWidgetDisplayedItem, + ), + SettingsCollectionTile( + filters: _collectionFilters, + onSelection: (v) => setState(() => _collectionFilters = v), + ), + ], + ), + ), + const Divider(height: 0), + Padding( + padding: const EdgeInsets.all(8), + child: AvesOutlinedButton( + label: l10n.saveTooltip, + onPressed: () { + _saveSettings(); + WidgetService.configure(); + }, + ), + ), + ], + ); + }, + ), + ), + ); + } + + Widget _buildShapeSelector(Map<WidgetOutline, Color?> outlineColors, double? cornerRadius) { + const shapeHeight = 124.0; + const shapes = WidgetShape.values; + return Container( + height: shapeHeight, + margin: const EdgeInsets.symmetric(vertical: 8), + child: ListView.builder( + scrollDirection: Axis.horizontal, + padding: const EdgeInsets.symmetric(horizontal: 8), + itemBuilder: (context, index) { + final shape = WidgetShape.values[index]; + final selected = shape == _shape; + final duration = context.read<DurationsData>().formTransition; + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: GestureDetector( + onTap: () => setState(() => _shape = shape), + child: AnimatedOpacity( + duration: duration, + // as of Flutter beta v3.3.0-0.0.pre, decoration rendering is at the wrong position if opacity is > .998 + opacity: selected ? .998 : .4, + child: AnimatedContainer( + duration: duration, + width: 96, + height: shapeHeight, + decoration: ShapeDecoration( + gradient: selected ? gradient : deselectedGradient, + shape: _WidgetShapeBorder(_outline, shape, outlineColors, cornerRadius), + ), + ), + ), + ), + ); + }, + itemCount: shapes.length, + ), + ); + } + + void _saveSettings() { + final invalidateUri = _displayedItem != settings.getWidgetDisplayedItem(widgetId) || !const SetEquality().equals(_collectionFilters, settings.getWidgetCollectionFilters(widgetId)); + + settings.setWidgetShape(widgetId, _shape); + settings.setWidgetOutline(widgetId, _outline); + settings.setWidgetOpenPage(widgetId, _openPage); + settings.setWidgetDisplayedItem(widgetId, _displayedItem); + settings.setWidgetCollectionFilters(widgetId, _collectionFilters); + + if (invalidateUri) { + settings.setWidgetUri(widgetId, null); + } + } +} + +class _WidgetShapeBorder extends ShapeBorder { + final WidgetOutline outline; + final WidgetShape shape; + final Map<WidgetOutline, Color?> outlineColors; + final double? cornerRadius; + + static const _devicePixelRatio = 1.0; + + const _WidgetShapeBorder(this.outline, this.shape, this.outlineColors, this.cornerRadius); + + @override + EdgeInsetsGeometry get dimensions => EdgeInsets.zero; + + @override + Path getInnerPath(Rect rect, {TextDirection? textDirection}) { + return getOuterPath(rect, textDirection: textDirection); + } + + @override + Path getOuterPath(Rect rect, {TextDirection? textDirection}) { + return shape.path(rect.size, _devicePixelRatio, cornerRadiusPx: cornerRadius); + } + + @override + void paint(Canvas canvas, Rect rect, {TextDirection? textDirection}) { + final outlineColor = outlineColors[outline]; + if (outlineColor != null) { + final path = shape.path(rect.size, _devicePixelRatio, cornerRadiusPx: cornerRadius); + canvas.clipPath(path); + HomeWidgetPainter.drawOutline(canvas, path, _devicePixelRatio, outlineColor); + } + } + + @override + ShapeBorder scale(double t) => this; +} + +class HomeWidgetOutlineSelector extends StatefulWidget { + final ValueGetter<WidgetOutline> getter; + final ValueSetter<WidgetOutline> setter; + final Map<Brightness, Map<WidgetOutline, Color?>> outlineColorsByBrightness; + + const HomeWidgetOutlineSelector({ + super.key, + required this.getter, + required this.setter, + required this.outlineColorsByBrightness, + }); + + @override + State<HomeWidgetOutlineSelector> createState() => _HomeWidgetOutlineSelectorState(); +} + +class _HomeWidgetOutlineSelectorState extends State<HomeWidgetOutlineSelector> { + @override + Widget build(BuildContext context) { + return DropdownButtonHideUnderline( + child: DropdownButton<WidgetOutline>( + items: _buildItems(context), + value: widget.getter(), + onChanged: (selected) { + widget.setter(selected ?? WidgetOutline.none); + setState(() {}); + }, + ), + ); + } + + List<DropdownMenuItem<WidgetOutline>> _buildItems(BuildContext context) { + return supportedWidgetOutlines.map((selected) { + final lightColors = widget.outlineColorsByBrightness[Brightness.light]; + final darkColors = widget.outlineColorsByBrightness[Brightness.dark]; + return DropdownMenuItem<WidgetOutline>( + value: selected, + child: ColorIndicator( + value: lightColors?[selected], + alternate: darkColors?[selected], + child: lightColors?[selected] == null ? const Icon(AIcons.clear) : null, + ), + ); + }).toList(); + } + + List<WidgetOutline> get supportedWidgetOutlines => [ + WidgetOutline.none, + WidgetOutline.black, + WidgetOutline.white, + WidgetOutline.systemBlackAndWhite, + WidgetOutline.systemBlackAndWhiteHighContrast, + if (device.isDynamicColorAvailable) ...[ + WidgetOutline.systemDynamicLowContrast, + WidgetOutline.systemDynamic, + ], + ]; +} diff --git a/lib/widgets/settings/language/language.dart b/lib/widgets/settings/language/language.dart new file mode 100644 index 0000000..e7031b4 --- /dev/null +++ b/lib/widgets/settings/language/language.dart @@ -0,0 +1,89 @@ +import 'dart:async'; + +import 'package:aves/model/settings/enums/coordinate_format.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/ref/poi.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/tile_leading.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves/widgets/settings/language/locale_tile.dart'; +import 'package:aves/widgets/settings/settings_definition.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class LanguageSection extends SettingsSection { + @override + String get key => 'language'; + + @override + Widget icon(BuildContext context) => SettingsTileLeading( + icon: AIcons.language, + color: context.select<AvesColorsData, Color>((v) => v.language), + ); + + @override + String title(BuildContext context) => context.l10n.settingsLanguageSectionTitle; + + @override + Future<List<SettingsTile>> tiles(BuildContext context) => Future.value([ + SettingsTileLanguageLocale(), + SettingsTileLanguageCoordinateFormat(), + SettingsTileLanguageUnitSystem(), + SettingsTileLanguageNumerals(), + ]); +} + +class SettingsTileLanguageLocale extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsLanguageTile; + + @override + Widget build(BuildContext context) => const LocaleTile(); +} + +class SettingsTileLanguageCoordinateFormat extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsCoordinateFormatTile; + + @override + Widget build(BuildContext context) => SettingsSelectionListTile<CoordinateFormat>( + values: CoordinateFormat.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.coordinateFormat, + onSelection: (v) => settings.coordinateFormat = v, + tileTitle: title(context), + dialogTitle: context.l10n.settingsCoordinateFormatDialogTitle, + optionSubtitleBuilder: (value) => value.format(context, PointsOfInterest.pointNemo), + ); +} + +class SettingsTileLanguageUnitSystem extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsUnitSystemTile; + + @override + Widget build(BuildContext context) => SettingsSelectionListTile<UnitSystem>( + values: UnitSystem.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.unitSystem, + onSelection: (v) => settings.unitSystem = v, + tileTitle: title(context), + dialogTitle: context.l10n.settingsUnitSystemDialogTitle, + ); +} + +class SettingsTileLanguageNumerals extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsForceWesternArabicNumeralsTile; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.forceWesternArabicNumerals, + onChanged: (v) => settings.forceWesternArabicNumerals = v, + title: title(context), + ); +} diff --git a/lib/widgets/settings/language/locale_selection_page.dart b/lib/widgets/settings/language/locale_selection_page.dart new file mode 100644 index 0000000..81ae366 --- /dev/null +++ b/lib/widgets/settings/language/locale_selection_page.dart @@ -0,0 +1,101 @@ +import 'dart:collection'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves/widgets/common/basic/list_tiles/reselectable_radio.dart'; +import 'package:aves/widgets/common/basic/query_bar.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/language/locale_tile.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class LocaleSelectionPage extends StatefulWidget { + static const routeName = '/settings/locale'; + + const LocaleSelectionPage({super.key}); + + @override + State<LocaleSelectionPage> createState() => _LocaleSelectionPageState(); +} + +class _LocaleSelectionPageState extends State<LocaleSelectionPage> { + late Locale _selectedValue; + final ValueNotifier<String> _queryNotifier = ValueNotifier(''); + + @override + void initState() { + super.initState(); + _selectedValue = settings.locale ?? LocaleTile.systemLocaleOption; + } + + @override + void dispose() { + _queryNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final useTvLayout = settings.useTvLayout; + return AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: !useTvLayout, + title: Text(context.l10n.settingsLanguagePageTitle), + ), + body: SafeArea( + bottom: false, + child: ValueListenableBuilder<String>( + valueListenable: _queryNotifier, + builder: (context, query, child) { + final upQuery = query.toUpperCase().trim(); + return RadioGroup<Locale>( + groupValue: _selectedValue, + onChanged: (v) => Navigator.maybeOf(context)?.pop(v), + child: ListView( + children: [ + if (!useTvLayout) + QueryBar( + queryNotifier: _queryNotifier, + leadingPadding: const EdgeInsetsDirectional.only(start: 24, end: 8), + ), + ..._getLocaleOptions(context).entries + .where((kv) { + if (upQuery.isEmpty) return true; + final title = kv.value; + return title.toUpperCase().contains(upQuery); + }) + .map((kv) { + final value = kv.key; + final title = kv.value; + return ReselectableRadioListTile<Locale>( + // key is expected by test driver + key: Key(value.toString()), + value: value, + reselectable: true, + title: Text( + title, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ); + }), + ], + ), + ); + }, + ), + ), + ); + } + + LinkedHashMap<Locale, String> _getLocaleOptions(BuildContext context) { + final displayLocales = AvesApp.supportedLocales.map((locale) => MapEntry(locale, LocaleTile.getLocaleName(locale))).toList()..sort((a, b) => compareAsciiUpperCase(a.value, b.value)); + + return LinkedHashMap.of({ + LocaleTile.systemLocaleOption: context.l10n.settingsSystemDefault, + ...LinkedHashMap.fromEntries(displayLocales), + }); + } +} diff --git a/lib/widgets/settings/language/locale_tile.dart b/lib/widgets/settings/language/locale_tile.dart new file mode 100644 index 0000000..2469286 --- /dev/null +++ b/lib/widgets/settings/language/locale_tile.dart @@ -0,0 +1,49 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/language/locale_selection_page.dart'; +import 'package:aves/widgets/settings/language/locales.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +class LocaleTile extends StatelessWidget { + static const systemLocaleOption = Locale('system'); + + const LocaleTile({super.key}); + + @override + Widget build(BuildContext context) { + return ListTile( + // key is expected by test driver + key: const Key('tile-language'), + title: Text(context.l10n.settingsLanguageTile), + subtitle: Selector<Settings, Locale?>( + selector: (context, s) => settings.locale, + builder: (context, locale, child) { + return Text(locale == null ? context.l10n.settingsSystemDefault : getLocaleName(locale)); + }, + ), + onTap: () async { + final value = await Navigator.maybeOf(context)?.push<Locale>( + MaterialPageRoute( + settings: const RouteSettings(name: LocaleSelectionPage.routeName), + builder: (context) => const LocaleSelectionPage(), + ), + ); + // wait for the dialog to hide + await Future.delayed(ADurations.pageTransitionLoose * timeDilation); + if (value != null) { + settings.locale = value == systemLocaleOption ? null : value; + } + }, + ); + } + + static String getLocaleName(Locale locale) { + // the package `flutter_localized_locales` has the answer for all locales + // but it comes with 3 MB of assets + final localeString = locale.toString(); + return SupportedLocales.languagesByLanguageCode[localeString] ?? localeString; + } +} diff --git a/lib/widgets/settings/language/locales.dart b/lib/widgets/settings/language/locales.dart new file mode 100644 index 0000000..50598e6 --- /dev/null +++ b/lib/widgets/settings/language/locales.dart @@ -0,0 +1,47 @@ +// this class is kept minimal, without import +// so it can be reused in driver tests + +class SupportedLocales { + static const languagesByLanguageCode = { + 'ar': 'العربية', + 'be': 'Беларуская мова', + 'bg': 'Български', + 'ca': 'Català', + 'cs': 'Čeština', + 'da': 'Dansk', + 'de': 'Deutsch', + 'el': 'Ελληνικά', + 'en': 'English', + 'en_Shaw': '𐑦𐑙𐑜𐑤𐑦𐑖 (𐑖𐑱𐑝𐑰𐑩𐑯)', + 'es': 'Español (México)', + 'et': 'Eesti', + 'eu': 'Euskara', + 'fa': 'فارسی', + 'fr': 'Français', + 'fi': 'Suomi', + 'gl': 'Galego', + 'hu': 'Magyar', + 'id': 'Bahasa Indonesia', + 'is': 'Íslenska', + 'it': 'Italiano', + 'ja': '日本語', + 'kn': 'ಕನ್ನಡ', + 'ko': '한국어', + 'lt': 'Lietuvių', + 'nb': 'Norsk (Bokmål)', + 'nn': 'Norsk (Nynorsk)', + 'nl': 'Nederlands', + 'pl': 'Polski', + 'pt': 'Português (Brasil)', + 'ro': 'Română', + 'ru': 'Русский', + 'sk': 'Slovenčina', + 'sv': 'Svenska', + 'ta': 'தமிழ்', + 'tr': 'Türkçe', + 'uk': 'Українська', + 'vi': 'Tiếng Việt', + 'zh': '简体中文', + 'zh_Hant': '繁體中文', + }; +} diff --git a/lib/widgets/settings/navigation/bottom_nav_actions_editor.dart b/lib/widgets/settings/navigation/bottom_nav_actions_editor.dart new file mode 100644 index 0000000..4b04220 --- /dev/null +++ b/lib/widgets/settings/navigation/bottom_nav_actions_editor.dart @@ -0,0 +1,151 @@ +import 'dart:async'; + +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/pick_dialogs/pick_album_stub.dart'; +import 'package:aves/widgets/dialogs/pick_dialogs/tag_pick_page.dart'; +import 'package:aves/widgets/filter_grids/common/enums.dart'; +import 'package:aves/widgets/home/home_page.dart'; +import 'package:aves/widgets/navigation/nav_item.dart'; +import 'package:aves/widgets/settings/common/quick_actions/editor_page.dart'; +import 'package:aves/widgets/settings/navigation/drawer.dart'; +import 'package:aves/widgets/settings/settings_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +class BottomNavigationActionEditorPage extends StatefulWidget { + static const routeName = '/settings/navigation/bottom_actions'; + + const BottomNavigationActionEditorPage({super.key}); + + @override + State<BottomNavigationActionEditorPage> createState() => _BottomNavigationActionEditorPageState(); +} + +class _BottomNavigationActionEditorPageState extends State<BottomNavigationActionEditorPage> { + late final QuickActionEditorController<AvesNavItem> _controller; + + static final allAvailableActions = [ + NavigationDrawerEditorPage.collectionFilterOptions.map((filter) { + return AvesNavItem( + route: CollectionPage.routeName, + filters: filter != null ? {filter} : null, + ); + }).toList(), + [ + HomePage.routeName, + SettingsPage.routeName, + ...NavigationDrawerEditorPage.pageOptions, + ].map((v) { + return AvesNavItem( + route: v, + ); + }).toList(), + ]; + + @override + void initState() { + super.initState(); + _controller = QuickActionEditorController( + load: () => settings.bottomNavigationActions, + save: (actions) => settings.bottomNavigationActions = actions, + ); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return QuickActionEditorPage<AvesNavItem>( + title: context.l10n.settingsNavigationBottomActionEditorPageTitle, + appBarActions: _buildActions(context), + bannerText: context.l10n.settingsNavigationBottomActionEditorBanner, + allAvailableActions: allAvailableActions, + actionIcon: (context, action) => action.getIcon(context), + actionText: (context, action) => action.getText(context), + controller: _controller, + ); + } + + List<Widget> _buildActions(BuildContext context) { + final animations = context.select<Settings, AccessibilityAnimations>((v) => v.accessibilityAnimations); + return [ + PopupMenuButton<_EditorAction>( + itemBuilder: (context) { + return [ + _EditorAction.addAlbum, + _EditorAction.addTag, + ].map<PopupMenuEntry<_EditorAction>>((v) { + return PopupMenuItem( + value: v, + child: MenuRow(text: v.getText(context), icon: v.getIcon()), + ); + }).toList(); + }, + onSelected: (action) async { + // wait for the popup menu to hide before proceeding with the action + await Future.delayed(animations.popUpAnimationDelay * timeDilation); + await _onActionSelected(context, action); + }, + popUpAnimationStyle: animations.popUpAnimationStyle, + ), + ].map((v) => FontSizeIconTheme(child: v)).toList(); + } + + Future<void> _onActionSelected(BuildContext context, _EditorAction action) async { + switch (action) { + case _EditorAction.addAlbum: + final albumFilter = await pickAlbum( + context: context, + moveType: null, + chipTypes: AlbumChipType.values, + initialGroup: null, + ); + if (albumFilter == null) return; + _controller.add(AvesNavItem(route: CollectionPage.routeName, filters: {albumFilter})); + case _EditorAction.addTag: + final tagFilter = await pickTag( + context: context, + chipTypes: ChipType.values, + initialGroup: null, + ); + if (tagFilter == null) return; + _controller.add(AvesNavItem(route: CollectionPage.routeName, filters: {tagFilter})); + } + } +} + +enum _EditorAction { + addAlbum, + addTag, +} + +extension _ExtraEditorActionView on _EditorAction { + String getText(BuildContext context) { + final l10n = context.l10n; + return switch (this) { + _EditorAction.addAlbum => l10n.settingsNavigationDrawerAddAlbum, + _EditorAction.addTag => l10n.tagEditorPageAddTagTooltip, + }; + } + + Widget getIcon() => Icon(_getIconData()); + + IconData _getIconData() { + return switch (this) { + _EditorAction.addAlbum => AIcons.album, + _EditorAction.addTag => AIcons.tag, + }; + } +} diff --git a/lib/widgets/settings/navigation/confirmation_dialogs.dart b/lib/widgets/settings/navigation/confirmation_dialogs.dart new file mode 100644 index 0000000..e59fb24 --- /dev/null +++ b/lib/widgets/settings/navigation/confirmation_dialogs.dart @@ -0,0 +1,54 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:flutter/material.dart'; + +class ConfirmationDialogPage extends StatelessWidget { + static const routeName = '/settings/navigation_confirmation'; + + const ConfirmationDialogPage({super.key}); + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return AvesScaffold( + appBar: AppBar( + title: Text(l10n.settingsConfirmationDialogTitle), + ), + body: SafeArea( + child: ListView( + children: [ + SettingsSwitchListTile( + selector: (context, s) => s.confirmMoveUndatedItems, + onChanged: (v) => settings.confirmMoveUndatedItems = v, + title: l10n.settingsConfirmationBeforeMoveUndatedItems, + ), + SettingsSwitchListTile( + selector: (context, s) => s.confirmMoveToBin, + onChanged: (v) => settings.confirmMoveToBin = v, + title: l10n.settingsConfirmationBeforeMoveToBinItems, + ), + SettingsSwitchListTile( + selector: (context, s) => s.confirmDeleteForever, + onChanged: (v) => settings.confirmDeleteForever = v, + title: l10n.settingsConfirmationBeforeDeleteItems, + ), + const Divider(height: 32), + SettingsSwitchListTile( + selector: (context, s) => s.confirmAfterMoveToBin, + onChanged: (v) => settings.confirmAfterMoveToBin = v, + title: l10n.settingsConfirmationAfterMoveToBinItems, + ), + const Divider(height: 32), + SettingsSwitchListTile( + selector: (context, s) => s.confirmCreateVault, + onChanged: (v) => settings.confirmCreateVault = v, + title: l10n.settingsConfirmationVaultDataLoss, + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/settings/navigation/drawer.dart b/lib/widgets/settings/navigation/drawer.dart new file mode 100644 index 0000000..107a5bf --- /dev/null +++ b/lib/widgets/settings/navigation/drawer.dart @@ -0,0 +1,128 @@ +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/mime.dart'; +import 'package:aves/model/filters/recent.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/search/page.dart'; +import 'package:aves/widgets/explorer/explorer_page.dart'; +import 'package:aves/widgets/filter_grids/albums_page.dart'; +import 'package:aves/widgets/filter_grids/countries_page.dart'; +import 'package:aves/widgets/filter_grids/places_page.dart'; +import 'package:aves/widgets/filter_grids/tags_page.dart'; +import 'package:aves/widgets/navigation/drawer/app_drawer.dart'; +import 'package:aves/widgets/navigation/drawer/tile.dart'; +import 'package:aves/widgets/search/collection_search_delegate.dart'; +import 'package:aves/widgets/settings/navigation/drawer_tab_albums.dart'; +import 'package:aves/widgets/settings/navigation/drawer_tab_fixed.dart'; +import 'package:flutter/material.dart'; + +class NavigationDrawerEditorPage extends StatefulWidget { + static const routeName = '/settings/navigation/drawer'; + + static final List<CollectionFilter?> collectionFilterOptions = [ + null, + RecentlyAddedFilter.instance, + ...CollectionSearchDelegate.typeFilters, + MimeFilter(MimeTypes.svg), + ]; + + static const List<String> pageOptions = [ + AlbumListPage.routeName, + CountryListPage.routeName, + PlaceListPage.routeName, + TagListPage.routeName, + ExplorerPage.routeName, + SearchPage.routeName, + ]; + + const NavigationDrawerEditorPage({super.key}); + + @override + State<NavigationDrawerEditorPage> createState() => _NavigationDrawerEditorPageState(); +} + +class _NavigationDrawerEditorPageState extends State<NavigationDrawerEditorPage> { + final List<CollectionFilter?> _typeItems = []; + final Set<CollectionFilter?> _visibleTypes = {}; + final List<String> _pageItems = []; + final Set<String> _visiblePages = {}; + + @override + void initState() { + super.initState(); + + // Types + final userTypeLinks = settings.drawerTypeBookmarks; + _visibleTypes.addAll(userTypeLinks); + _typeItems.addAll(userTypeLinks); + _typeItems.addAll( + NavigationDrawerEditorPage.collectionFilterOptions.where((v) => !userTypeLinks.contains(v)), + ); + + // Pages + final userPageLinks = settings.drawerPageBookmarks; + _visiblePages.addAll(userPageLinks); + _pageItems.addAll(userPageLinks); + _pageItems.addAll( + NavigationDrawerEditorPage.pageOptions.where((v) => !userPageLinks.contains(v)), + ); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + + final tabs = <(Tab, Widget)>[ + ( + Tab(text: l10n.settingsNavigationDrawerTabTypes), + DrawerFixedListTab<CollectionFilter?>( + items: _typeItems, + visibleItems: _visibleTypes, + leading: (item) => DrawerFilterIcon(filter: item), + title: (item) => DrawerFilterTitle(filter: item), + ), + ), + ( + Tab(text: l10n.settingsNavigationDrawerTabAlbums), + const DrawerTabAlbums(), // PATCH: nessun parametro items + ), + ( + Tab(text: l10n.settingsNavigationDrawerTabPages), + DrawerFixedListTab<String>( + items: _pageItems, + visibleItems: _visiblePages, + leading: (item) => DrawerPageIcon(route: item), + title: (item) => DrawerPageTitle(route: item), + ), + ), + ]; + + return DefaultTabController( + length: tabs.length, + child: AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: !settings.useTvLayout, + title: Text(l10n.settingsNavigationDrawerEditorPageTitle), + bottom: TabBar( + tabs: tabs.map((t) => t.$1).toList(), + ), + ), + body: PopScope( + onPopInvokedWithResult: (didPop, result) { + settings.drawerTypeBookmarks = _typeItems.where(_visibleTypes.contains).toList(); + settings.drawerPageBookmarks = _pageItems.where(_visiblePages.contains).toList(); + }, + child: SafeArea( + bottom: false, + child: TabBarView( + children: tabs.map((t) => t.$2).toList(), + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/settings/navigation/drawer_editor_banner.dart b/lib/widgets/settings/navigation/drawer_editor_banner.dart new file mode 100644 index 0000000..b05e639 --- /dev/null +++ b/lib/widgets/settings/navigation/drawer_editor_banner.dart @@ -0,0 +1,22 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; + +class DrawerEditorBanner extends StatelessWidget { + const DrawerEditorBanner({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(16), + child: Row( + children: [ + const FontSizeIconTheme(child: Icon(AIcons.info)), + const SizedBox(width: 16), + Expanded(child: Text(context.l10n.settingsNavigationDrawerBanner)), + ], + ), + ); + } +} diff --git a/lib/widgets/settings/navigation/drawer_tab_albums.dart b/lib/widgets/settings/navigation/drawer_tab_albums.dart new file mode 100644 index 0000000..6105e92 --- /dev/null +++ b/lib/widgets/settings/navigation/drawer_tab_albums.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +/// Questo file apparteneva al vecchio sistema album basato su filtri. +/// Ora gli album non sono più gestiti dal drawer. +/// Il drawer mostra solo Types e Pages. +/// Questo widget è mantenuto solo come stub per compatibilità. +class DrawerTabAlbums extends StatelessWidget { + const DrawerTabAlbums({super.key}); + + @override + Widget build(BuildContext context) { + // Non mostra nulla + return const SizedBox.shrink(); + } +} diff --git a/lib/widgets/settings/navigation/drawer_tab_fixed.dart b/lib/widgets/settings/navigation/drawer_tab_fixed.dart new file mode 100644 index 0000000..0c38b81 --- /dev/null +++ b/lib/widgets/settings/navigation/drawer_tab_fixed.dart @@ -0,0 +1,90 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:aves/widgets/settings/navigation/drawer_editor_banner.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +typedef ItemWidgetBuilder<T> = Widget Function(T item); + +class DrawerFixedListTab<T> extends StatefulWidget { + final List<T> items; + final Set<T> visibleItems; + final ItemWidgetBuilder<T> leading; + final ItemWidgetBuilder<T> title; + + const DrawerFixedListTab({ + super.key, + required this.items, + required this.visibleItems, + required this.leading, + required this.title, + }); + + @override + State<DrawerFixedListTab<T>> createState() => _DrawerFixedListTabState<T>(); +} + +class _DrawerFixedListTabState<T> extends State<DrawerFixedListTab<T>> { + Set<T> get visibleItems => widget.visibleItems; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + if (!settings.useTvLayout) ...[ + const DrawerEditorBanner(), + const Divider(height: 0), + ], + Flexible( + child: Selector<MediaQueryData, double>( + selector: (context, mq) => mq.effectiveBottomPadding, + builder: (context, mqPaddingBottom, child) { + // `ReorderableListView` does not automatically pad + // for `MediaQuery` insets, like regular `ListView` + return ReorderableListView.builder( + padding: EdgeInsets.only(bottom: mqPaddingBottom), + itemBuilder: (context, index) { + final filter = widget.items[index]; + final visible = visibleItems.contains(filter); + void onPressed() { + setState(() { + if (visible) { + visibleItems.remove(filter); + } else { + visibleItems.add(filter); + } + }); + } + + return Opacity( + key: ValueKey(filter), + opacity: visible ? 1 : .4, + child: ListTile( + leading: widget.leading(filter), + title: widget.title(filter), + trailing: IconButton( + icon: Icon(visible ? AIcons.hide : AIcons.show), + onPressed: onPressed, + tooltip: visible ? context.l10n.hideTooltip : context.l10n.showTooltip, + ), + onTap: settings.useTvLayout ? onPressed : null, + ), + ); + }, + itemCount: widget.items.length, + onReorder: (oldIndex, newIndex) { + setState(() { + if (oldIndex < newIndex) newIndex -= 1; + widget.items.insert(newIndex, widget.items.removeAt(oldIndex)); + }); + }, + ); + }, + ), + ), + ], + ); + } +} diff --git a/lib/widgets/settings/navigation/navigation.dart b/lib/widgets/settings/navigation/navigation.dart new file mode 100644 index 0000000..16f4edf --- /dev/null +++ b/lib/widgets/settings/navigation/navigation.dart @@ -0,0 +1,179 @@ +import 'dart:async'; + +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/tile_leading.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves/widgets/settings/navigation/bottom_nav_actions_editor.dart'; +import 'package:aves/widgets/settings/navigation/confirmation_dialogs.dart'; +import 'package:aves/widgets/settings/navigation/drawer.dart'; +import 'package:aves/widgets/settings/settings_definition.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class NavigationSection extends SettingsSection { + @override + String get key => 'navigation'; + + @override + Widget icon(BuildContext context) => SettingsTileLeading( + icon: AIcons.home, + color: context.select<AvesColorsData, Color>((v) => v.navigation), + ); + + @override + String title(BuildContext context) => context.l10n.settingsNavigationSectionTitle; + + @override + Future<List<SettingsTile>> tiles(BuildContext context) => Future.value([ + SettingsTileNavigationHomePage(), + if (!settings.useTvLayout) SettingsTileNavigationKeepScreenOn(), + if (!settings.useTvLayout) SettingsTileNavigationDoubleBackExit(), + SettingsTileNavigationDrawer(), + if (!settings.useTvLayout) SettingsTileNavigationBottomActions(), + if (!settings.useTvLayout) SettingsTileNavigationConfirmationDialog(), + ]); +} + +class _HomeOption { + final HomePageSetting page; + final Set<CollectionFilter> customCollection; + final String? customExplorerPath; + + const _HomeOption( + this.page, { + this.customCollection = const {}, + this.customExplorerPath, + }); + + String getName(BuildContext context) { + final pageName = page.getName(context); + switch (page) { + case HomePageSetting.collection: + return customCollection.isNotEmpty ? context.l10n.setHomeCustom : pageName; + case HomePageSetting.explorer: + return customExplorerPath != null ? context.l10n.setHomeCustom : pageName; + default: + return pageName; + } + } + + String? getDetails(BuildContext context) { + switch (page) { + case HomePageSetting.collection: + final filters = customCollection; + return filters.isNotEmpty ? [context.l10n.collectionPageTitle, filters.map((v) => v.getLabel(context)).join(', ')].join(AText.separator) : null; + case HomePageSetting.explorer: + final path = customExplorerPath; + return path != null ? [context.l10n.explorerPageTitle, pContext.basename(path)].join(AText.separator) : null; + default: + return null; + } + } + + @override + bool operator ==(Object other) => + identical(this, other) || + (other is _HomeOption && runtimeType == other.runtimeType && page == other.page && const DeepCollectionEquality().equals(customCollection, other.customCollection) && customExplorerPath == other.customExplorerPath); + + @override + int get hashCode => page.hashCode ^ customCollection.hashCode ^ customExplorerPath.hashCode; +} + +class SettingsTileNavigationHomePage extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsHomeTile; + + @override + Widget build(BuildContext context) => SettingsSelectionListTile<_HomeOption>( + values: [ + const _HomeOption(HomePageSetting.collection), + const _HomeOption(HomePageSetting.albums), + const _HomeOption(HomePageSetting.tags), + const _HomeOption(HomePageSetting.explorer), + if (settings.homeCustomCollection.isNotEmpty) _HomeOption(HomePageSetting.collection, customCollection: settings.homeCustomCollection), + if (settings.homeCustomExplorerPath != null) _HomeOption(HomePageSetting.explorer, customExplorerPath: settings.homeCustomExplorerPath), + ], + getName: (context, v) => v.getName(context), + selector: (context, s) => _HomeOption(s.homePage, customCollection: s.homeCustomCollection, customExplorerPath: s.homeCustomExplorerPath), + onSelection: (v) => settings.setHome( + v.page, + customCollection: v.customCollection, + customExplorerPath: v.customExplorerPath, + ), + tileTitle: title(context), + dialogTitle: context.l10n.settingsHomeDialogTitle, + optionSubtitleBuilder: (v) => v.getDetails(context), + ); +} + +class SettingsTileNavigationDrawer extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsNavigationDrawerTile; + + @override + Widget build(BuildContext context) => SettingsSubPageTile( + title: title(context), + routeName: NavigationDrawerEditorPage.routeName, + builder: (context) => const NavigationDrawerEditorPage(), + ); +} + +class SettingsTileNavigationBottomActions extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsNavigationBottomActionsTile; + + @override + Widget build(BuildContext context) => SettingsSubPageTile( + title: title(context), + routeName: BottomNavigationActionEditorPage.routeName, + builder: (context) => const BottomNavigationActionEditorPage(), + ); +} + +class SettingsTileNavigationConfirmationDialog extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsConfirmationTile; + + @override + Widget build(BuildContext context) => SettingsSubPageTile( + title: title(context), + routeName: ConfirmationDialogPage.routeName, + builder: (context) => const ConfirmationDialogPage(), + ); +} + +class SettingsTileNavigationKeepScreenOn extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsKeepScreenOnTile; + + @override + Widget build(BuildContext context) => SettingsSelectionListTile<KeepScreenOn>( + values: KeepScreenOn.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.keepScreenOn, + onSelection: (v) => settings.keepScreenOn = v, + tileTitle: title(context), + dialogTitle: context.l10n.settingsKeepScreenOnDialogTitle, + ); +} + +class SettingsTileNavigationDoubleBackExit extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsDoubleBackExit; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.mustBackTwiceToExit, + onChanged: (v) => settings.mustBackTwiceToExit = v, + title: title(context), + ); +} diff --git a/lib/widgets/settings/privacy/access_grants_page.dart b/lib/widgets/settings/privacy/access_grants_page.dart new file mode 100644 index 0000000..8c3cb3a --- /dev/null +++ b/lib/widgets/settings/privacy/access_grants_page.dart @@ -0,0 +1,109 @@ +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:flutter/material.dart'; + +class StorageAccessPage extends StatefulWidget { + static const routeName = '/settings/storage_access'; + + const StorageAccessPage({super.key}); + + @override + State<StorageAccessPage> createState() => _StorageAccessPageState(); +} + +class _StorageAccessPageState extends State<StorageAccessPage> { + late Future<List<String>> _pathLoader; + List<String>? _lastPaths; + + @override + void initState() { + super.initState(); + _load(); + } + + void _load() => _pathLoader = storageService.getGrantedDirectories(); + + @override + Widget build(BuildContext context) { + return AvesScaffold( + appBar: AppBar( + title: Text(context.l10n.settingsStorageAccessPageTitle), + ), + body: SafeArea( + child: FutureBuilder<List<String>>( + future: _pathLoader, + builder: (context, snapshot) { + if (snapshot.hasError) { + return Text(snapshot.error.toString()); + } + if (snapshot.connectionState != ConnectionState.done && _lastPaths == null) { + return const SizedBox(); + } + _lastPaths = snapshot.data!..sort(); + if (_lastPaths!.isEmpty) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const _Header(), + const Divider(), + Expanded( + child: Padding( + padding: const EdgeInsets.all(8), + child: EmptyContent( + text: context.l10n.settingsStorageAccessEmpty, + ), + ), + ), + ], + ); + } + + return ListView( + children: [ + const _Header(), + const Divider(), + ..._lastPaths!.map( + (path) => ListTile( + title: Text(path), + dense: true, + trailing: IconButton( + icon: const Icon(AIcons.clear), + onPressed: () async { + await storageService.revokeDirectoryAccess(path); + _load(); + setState(() {}); + }, + tooltip: context.l10n.settingsStorageAccessRevokeTooltip, + ), + ), + ), + ], + ); + }, + ), + ), + ); + } +} + +class _Header extends StatelessWidget { + const _Header(); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: Row( + children: [ + const FontSizeIconTheme(child: Icon(AIcons.info)), + const SizedBox(width: 16), + Expanded(child: Text(context.l10n.settingsStorageAccessBanner)), + ], + ), + ); + } +} diff --git a/lib/widgets/settings/privacy/hidden_items_page.dart b/lib/widgets/settings/privacy/hidden_items_page.dart new file mode 100644 index 0000000..9337f62 --- /dev/null +++ b/lib/widgets/settings/privacy/hidden_items_page.dart @@ -0,0 +1,123 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class HiddenItemsPage extends StatelessWidget { + static const routeName = '/settings/hidden_items'; + + const HiddenItemsPage({super.key}); + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: !settings.useTvLayout, + title: Text(l10n.settingsHiddenItemsPageTitle), + ), + body: SafeArea( + child: Selector<Settings, Set<CollectionFilter>>( + selector: (context, s) => settings.hiddenFilters.toSet(), + builder: (context, activatedHiddenFilters, child) { + return Selector<Settings, Set<CollectionFilter>>( + selector: (context, s) => settings.deactivatedHiddenFilters.toSet(), + builder: (context, deactivatedHiddenFilters, child) { + final allHiddenFilters = { + ...activatedHiddenFilters, + ...deactivatedHiddenFilters, + }; + if (allHiddenFilters.isEmpty) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _Banner(bannerText: context.l10n.settingsHiddenFiltersBanner), + const Divider(height: 0), + Expanded( + child: Padding( + padding: const EdgeInsets.all(8), + child: EmptyContent( + icon: AIcons.hide, + text: context.l10n.settingsHiddenFiltersEmpty, + ), + ), + ), + ], + ); + } + + final filterList = allHiddenFilters.toList()..sort(); + return ListView( + children: [ + _Banner(bannerText: context.l10n.settingsHiddenFiltersBanner), + const Divider(height: 0), + const SizedBox(height: 8), + ...filterList.map((filter) { + void onRemove(CollectionFilter filter) => settings.changeFilterVisibility({filter}, true); + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), + child: Row( + children: [ + Expanded( + child: LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + AvesFilterChip( + filter: filter, + maxWidth: constraints.maxWidth, + onTap: onRemove, + onRemove: onRemove, + onLongPress: null, + ), + const Spacer(), + ], + ); + }, + ), + ), + const SizedBox(width: 8), + Switch( + value: activatedHiddenFilters.contains(filter), + onChanged: (v) => settings.activateHiddenFilter(filter, v), + ), + ], + ), + ); + }), + ], + ); + }, + ); + }, + ), + ), + ); + } +} + +class _Banner extends StatelessWidget { + final String bannerText; + + const _Banner({required this.bannerText}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(16), + child: Row( + children: [ + const FontSizeIconTheme(child: Icon(AIcons.info)), + const SizedBox(width: 16), + Expanded(child: Text(bannerText)), + ], + ), + ); + } +} diff --git a/lib/widgets/settings/privacy/privacy.dart b/lib/widgets/settings/privacy/privacy.dart new file mode 100644 index 0000000..80c38d3 --- /dev/null +++ b/lib/widgets/settings/privacy/privacy.dart @@ -0,0 +1,230 @@ +import 'dart:async'; + +import 'package:aves/app_flavor.dart'; +import 'package:aves/model/device.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/collection/entry_set_action_delegate.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/settings/common/tile_leading.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves/widgets/settings/privacy/access_grants_page.dart'; +import 'package:aves/widgets/settings/privacy/hidden_items_page.dart'; +import 'package:aves/widgets/settings/settings_definition.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class PrivacySection extends SettingsSection { + @override + String get key => 'privacy'; + + @override + Widget icon(BuildContext context) => SettingsTileLeading( + icon: AIcons.privacy, + color: context.select<AvesColorsData, Color>((v) => v.privacy), + ); + + @override + String title(BuildContext context) => context.l10n.settingsPrivacySectionTitle; + + @override + Future<List<SettingsTile>> tiles(BuildContext context) async { + final canEnableErrorReporting = context.select<AppFlavor, bool>((v) => v.canEnableErrorReporting); + return [ + SettingsTilePrivacyAllowInstalledAppAccess(), + if (canEnableErrorReporting) SettingsTilePrivacyAllowErrorReporting(), + if (!settings.useTvLayout && device.canRequestManageMedia) SettingsTilePrivacyManageMedia(), + SettingsTilePrivacySaveSearchHistory(), + if (!settings.useTvLayout) SettingsTilePrivacyEnableBin(), + SettingsTilePrivacyHiddenItems(), + if (!settings.useTvLayout) SettingsTilePrivacyStorageAccess(), + ]; + } +} + +class SettingsTilePrivacyAllowInstalledAppAccess extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsAllowInstalledAppAccess; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.isInstalledAppAccessAllowed, + onChanged: (v) => settings.isInstalledAppAccessAllowed = v, + title: title(context), + subtitle: context.l10n.settingsAllowInstalledAppAccessSubtitle, + ); +} + +class SettingsTilePrivacyAllowErrorReporting extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsAllowErrorReporting; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.isErrorReportingAllowed, + onChanged: (v) => settings.isErrorReportingAllowed = v, + title: title(context), + ); +} + +class SettingsTilePrivacySaveSearchHistory extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsSaveSearchHistory; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.saveSearchHistory, + onChanged: (v) { + settings.saveSearchHistory = v; + if (!v) { + settings.searchHistory = []; + } + }, + title: title(context), + ); +} + +class SettingsTilePrivacyEnableBin extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsEnableBin; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.enableBin, + onChanged: (v) => setBinUsage(context, v), + title: title(context), + subtitle: context.l10n.settingsEnableBinSubtitle, + ); + + static Future<bool> setBinUsage(BuildContext context, bool enabled) async { + final l10n = context.l10n; + if (!enabled) { + if (vaults.all.any((v) => v.useBin)) { + await showWarningDialog( + context: context, + message: l10n.vaultBinUsageDialogMessage, + ); + return false; + } + + final source = context.read<CollectionSource>(); + final trashedEntries = source.trashedEntries; + if (trashedEntries.isNotEmpty) { + if (!await showConfirmationDialog( + context: context, + message: l10n.settingsDisablingBinWarningDialogMessage, + ok: l10n.applyButtonLabel, + )) { + return false; + } + + // delete forever trashed items + await EntrySetActionDelegate().doDelete( + context: context, + entries: trashedEntries, + enableBin: false, + ); + + // in case of failure or cancellation + if (source.trashedEntries.isNotEmpty) return false; + } + + settings.searchHistory = []; + } + + settings.enableBin = enabled; + return true; + } +} + +class SettingsTilePrivacyHiddenItems extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsHiddenItemsTile; + + @override + Widget build(BuildContext context) => SettingsSubPageTile( + title: title(context), + routeName: HiddenItemsPage.routeName, + builder: (context) => const HiddenItemsPage(), + ); +} + +class SettingsTilePrivacyStorageAccess extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsStorageAccessTile; + + @override + Widget build(BuildContext context) => SettingsSubPageTile( + title: title(context), + routeName: StorageAccessPage.routeName, + builder: (context) => const StorageAccessPage(), + ); +} + +class SettingsTilePrivacyManageMedia extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsAllowMediaManagement; + + @override + Widget build(BuildContext context) => _ManageMediaTile(title: title(context)); +} + +class _ManageMediaTile extends StatefulWidget { + final String title; + + const _ManageMediaTile({ + required this.title, + }); + + @override + State<_ManageMediaTile> createState() => _ManageMediaTileState(); +} + +class _ManageMediaTileState extends State<_ManageMediaTile> with WidgetsBindingObserver { + late Future<bool> _loader; + + @override + void initState() { + super.initState(); + _initLoader(); + WidgetsBinding.instance.addObserver(this); + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + void _initLoader() => _loader = deviceService.canManageMedia(); + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + _initLoader(); + setState(() {}); + } + } + + @override + Widget build(BuildContext context) { + return FutureBuilder<bool>( + future: _loader, + builder: (context, snapshot) { + final loading = snapshot.connectionState != ConnectionState.done; + final current = snapshot.data ?? false; + return SwitchListTile( + value: current, + onChanged: loading ? null : (v) => deviceService.requestMediaManagePermission(), + title: Text(widget.title), + ); + }, + ); + } +} diff --git a/lib/widgets/settings/screen_saver_settings_page.dart b/lib/widgets/settings/screen_saver_settings_page.dart new file mode 100644 index 0000000..ca356f9 --- /dev/null +++ b/lib/widgets/settings/screen_saver_settings_page.dart @@ -0,0 +1,71 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/collection_tile.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ScreenSaverSettingsPage extends StatelessWidget { + static const routeName = '/settings/screen_saver'; + + const ScreenSaverSettingsPage({super.key}); + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return AvesScaffold( + appBar: AppBar( + title: Text(l10n.settingsScreenSaverPageTitle), + ), + body: SafeArea( + child: ListView( + children: [ + SettingsSwitchListTile( + selector: (context, s) => s.screenSaverFillScreen, + onChanged: (v) => settings.screenSaverFillScreen = v, + title: l10n.settingsSlideshowFillScreen, + ), + SettingsSwitchListTile( + selector: (context, s) => s.screenSaverAnimatedZoomEffect, + onChanged: (v) => settings.screenSaverAnimatedZoomEffect = v, + title: l10n.settingsSlideshowAnimatedZoomEffect, + ), + SettingsSelectionListTile<ViewerTransition>( + values: ViewerTransition.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.screenSaverTransition, + onSelection: (v) => settings.screenSaverTransition = v, + tileTitle: l10n.settingsSlideshowTransitionTile, + ), + SettingsDurationListTile( + selector: (context, s) => s.screenSaverInterval, + onChanged: (v) => settings.screenSaverInterval = v, + title: l10n.settingsSlideshowIntervalTile, + ), + SettingsSelectionListTile<SlideshowVideoPlayback>( + values: SlideshowVideoPlayback.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.screenSaverVideoPlayback, + onSelection: (v) => settings.screenSaverVideoPlayback = v, + tileTitle: l10n.settingsSlideshowVideoPlaybackTile, + dialogTitle: l10n.settingsSlideshowVideoPlaybackDialogTitle, + ), + Selector<Settings, Set<CollectionFilter>>( + selector: (context, s) => s.screenSaverCollectionFilters, + builder: (context, filters, child) { + return SettingsCollectionTile( + filters: filters, + onSelection: (v) => settings.screenSaverCollectionFilters = v, + ); + }, + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/settings/settings_definition.dart b/lib/widgets/settings/settings_definition.dart new file mode 100644 index 0000000..eb68d54 --- /dev/null +++ b/lib/widgets/settings/settings_definition.dart @@ -0,0 +1,44 @@ +import 'dart:async'; + +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:flutter/widgets.dart'; + +abstract class SettingsSection { + String get key; + + Widget icon(BuildContext context); + + String title(BuildContext context); + + Future<List<SettingsTile>> tiles(BuildContext context); + + Widget build(BuildContext sectionContext, ValueNotifier<String?> expandedNotifier) { + return FutureBuilder<List<SettingsTile>>( + future: tiles(sectionContext), + builder: (tileContext, snapshot) { + final tiles = snapshot.data; + if (tiles == null) return const SizedBox(); + + return AvesExpansionTile( + // key is expected by test driver + key: Key('section-$key'), + // use a fixed value instead of the title to identify this expansion tile + // so that the tile state is kept when the language is modified + value: key, + leading: icon(tileContext), + title: title(tileContext), + expandedNotifier: expandedNotifier, + showHighlight: false, + // reuse section context so that dialogs opened from tiles have the right text theme + children: tiles.map((v) => v.build(sectionContext)).toList(), + ); + }, + ); + } +} + +abstract class SettingsTile { + String title(BuildContext context); + + Widget build(BuildContext context); +} diff --git a/lib/widgets/settings/settings_mobile_page.dart b/lib/widgets/settings/settings_mobile_page.dart new file mode 100644 index 0000000..81d09ec --- /dev/null +++ b/lib/widgets/settings/settings_mobile_page.dart @@ -0,0 +1,193 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/ref/locales.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/app_bar/app_bar_title.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/search/route.dart'; +import 'package:aves/widgets/settings/app_export/items.dart'; +import 'package:aves/widgets/settings/app_export/selection_dialog.dart'; +import 'package:aves/widgets/settings/settings_page.dart'; +import 'package:aves/widgets/settings/settings_search_delegate.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; + +class SettingsMobilePage extends StatefulWidget { + const SettingsMobilePage({super.key}); + + @override + State<SettingsMobilePage> createState() => _SettingsMobilePageState(); +} + +class _SettingsMobilePageState extends State<SettingsMobilePage> with FeedbackMixin { + final ValueNotifier<String?> _expandedNotifier = ValueNotifier(null); + + @override + void dispose() { + _expandedNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final animations = context.select<Settings, AccessibilityAnimations>((v) => v.accessibilityAnimations); + return AvesScaffold( + appBar: AppBar( + title: InteractiveAppBarTitle( + onTap: () => _goToSearch(context), + child: Text(context.l10n.settingsPageTitle), + ), + actions: [ + IconButton( + icon: const Icon(AIcons.search), + onPressed: () => _goToSearch(context), + tooltip: MaterialLocalizations.of(context).searchFieldLabel, + ), + PopupMenuButton<SettingsAction>( + itemBuilder: (context) { + return [ + PopupMenuItem( + value: SettingsAction.export, + child: MenuRow(text: context.l10n.settingsActionExport, icon: Icon(AIcons.fileExport)), + ), + PopupMenuItem( + value: SettingsAction.import, + child: MenuRow(text: context.l10n.settingsActionImport, icon: Icon(AIcons.fileImport)), + ), + ]; + }, + onSelected: (action) async { + // wait for the popup menu to hide before proceeding with the action + await Future.delayed(animations.popUpAnimationDelay * timeDilation); + _onActionSelected(action); + }, + popUpAnimationStyle: animations.popUpAnimationStyle, + ), + ].map((v) => FontSizeIconTheme(child: v)).toList(), + ), + body: GestureAreaProtectorStack( + child: SafeArea( + bottom: false, + child: AnimationLimiter( + child: SettingsListView( + children: SettingsPage.sections.map((v) => v.build(context, _expandedNotifier)).toList(), + ), + ), + ), + ), + ); + } + + static const String exportVersionKey = 'version'; + static const int exportVersion = 1; + + void _onActionSelected(SettingsAction action) async { + final source = context.read<CollectionSource>(); + switch (action) { + case SettingsAction.export: + final toExport = await showDialog<Set<AppExportItem>>( + context: context, + builder: (context) => AppExportItemSelectionDialog( + title: context.l10n.settingsActionExportDialogTitle, + ), + ); + if (toExport == null || toExport.isEmpty) return; + + final allMap = Map.fromEntries( + toExport.map((v) { + final jsonMap = v.export(source); + return jsonMap != null ? MapEntry(v.name, jsonMap) : null; + }).nonNulls, + ); + allMap[exportVersionKey] = exportVersion; + final allJsonString = jsonEncode(allMap); + + const mimeType = MimeTypes.json; + final success = await storageService.createFile( + 'aves-settings-${DateFormat('yyyyMMdd_HHmmss', asciiLocale).format(DateTime.now())}${MimeTypes.extensionFor(mimeType)}', + mimeType, + Uint8List.fromList(utf8.encode(allJsonString)), + ); + if (success != null) { + if (success) { + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } else { + showFeedback(context, FeedbackType.warn, context.l10n.genericFailureFeedback); + } + } + case SettingsAction.import: + // specifying the JSON MIME type to restrict openable files is correct in theory, + // but older devices (e.g. SM-P580, API 27) that do not recognize JSON files as such would filter them out + final bytes = await storageService.openFile(); + if (bytes.isNotEmpty) { + try { + final allJsonString = utf8.decode(bytes); + final allJsonMap = jsonDecode(allJsonString) as Map<String, Object?>; + + final version = allJsonMap[exportVersionKey] as int?; + final importable = <AppExportItem, Object>{}; + if (version == null) { + // backward compatibility before versioning + importable[AppExportItem.settings] = allJsonMap; + } else { + allJsonMap.keys.where((v) => v != exportVersionKey).forEach((k) { + try { + importable[AppExportItem.values.byName(k)] = allJsonMap[k] as Object; + } catch (error, stack) { + debugPrint('failed to identify import app item=$k with error=$error\n$stack'); + } + }); + } + + final toImport = await showDialog<Set<AppExportItem>>( + context: context, + builder: (context) => AppExportItemSelectionDialog( + title: context.l10n.settingsActionImportDialogTitle, + selectableItems: importable.keys.toSet(), + ), + ); + if (toImport == null || toImport.isEmpty) return; + + await Future.forEach<AppExportItem>(toImport, (item) async { + final jsonObject = importable[item]; + if (jsonObject != null) { + await item.import(jsonObject, source); + } + }); + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } catch (error, stack) { + debugPrint('failed to import app json, error=$error\n$stack'); + showFeedback(context, FeedbackType.warn, context.l10n.genericFailureFeedback); + } + } + } + } + + void _goToSearch(BuildContext context) { + Navigator.maybeOf(context)?.push( + SearchPageRoute( + delegate: SettingsSearchDelegate( + searchFieldLabel: context.l10n.settingsSearchFieldLabel, + searchFieldStyle: Themes.searchFieldStyle(context), + sections: SettingsPage.sections, + ), + ), + ); + } +} diff --git a/lib/widgets/settings/settings_page.dart b/lib/widgets/settings/settings_page.dart new file mode 100644 index 0000000..f5eb8e0 --- /dev/null +++ b/lib/widgets/settings/settings_page.dart @@ -0,0 +1,88 @@ +import 'dart:math'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:aves/widgets/settings/accessibility/accessibility.dart'; +import 'package:aves/widgets/settings/display/display.dart'; +import 'package:aves/widgets/settings/language/language.dart'; +import 'package:aves/widgets/settings/navigation/navigation.dart'; +import 'package:aves/widgets/settings/privacy/privacy.dart'; +import 'package:aves/widgets/settings/settings_definition.dart'; +import 'package:aves/widgets/settings/settings_mobile_page.dart'; +import 'package:aves/widgets/settings/settings_tv_page.dart'; +import 'package:aves/widgets/settings/thumbnails/thumbnails.dart'; +import 'package:aves/widgets/settings/video/video.dart'; +import 'package:aves/widgets/settings/viewer/viewer.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:provider/provider.dart'; + +class SettingsPage extends StatelessWidget { + static const routeName = '/settings'; + + static final List<SettingsSection> sections = [ + NavigationSection(), + ThumbnailsSection(), + ViewerSection(), + VideoSection(), + PrivacySection(), + AccessibilitySection(), + DisplaySection(), + LanguageSection(), + ]; + + const SettingsPage({super.key}); + + @override + Widget build(BuildContext context) { + if (settings.useTvLayout) { + return const SettingsTvPage(); + } else { + return const SettingsMobilePage(); + } + } +} + +class SettingsListView extends StatelessWidget { + final List<Widget> children; + + const SettingsListView({ + super.key, + required this.children, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Theme( + data: theme.copyWith( + textTheme: theme.textTheme.copyWith( + // dense style font for tile subtitles, without modifying title font + bodyMedium: const TextStyle(fontSize: 12), + ), + ), + child: Selector<MediaQueryData, double>( + selector: (context, mq) => max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom), + builder: (context, mqPaddingBottom, child) { + final durations = context.watch<DurationsData>(); + return ListView( + padding: const EdgeInsets.all(8) + EdgeInsets.only(bottom: mqPaddingBottom), + children: AnimationConfiguration.toStaggeredList( + duration: durations.staggeredAnimation, + delay: durations.staggeredAnimationDelay * timeDilation, + childAnimationBuilder: (child) => SlideAnimation( + verticalOffset: 50.0, + child: FadeInAnimation( + child: child, + ), + ), + children: children, + ), + ); + }, + ), + ); + } +} diff --git a/lib/widgets/settings/settings_search_delegate.dart b/lib/widgets/settings/settings_search_delegate.dart new file mode 100644 index 0000000..cab4e98 --- /dev/null +++ b/lib/widgets/settings/settings_search_delegate.dart @@ -0,0 +1,86 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/common/identity/highlight_title.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/common/search/delegate.dart'; +import 'package:aves/widgets/settings/settings_definition.dart'; +import 'package:flutter/material.dart'; + +class SettingsSearchDelegate extends AvesSearchDelegate { + final List<SettingsSection> sections; + + static const pageRouteName = '/settings/search'; + + SettingsSearchDelegate({ + required super.searchFieldLabel, + required super.searchFieldStyle, + required this.sections, + }) : super( + routeName: pageRouteName, + ); + + @override + Widget buildSuggestions(BuildContext context) { + final upQuery = query.toUpperCase().trim(); + if (upQuery.isEmpty) return const SizedBox(); + + bool testKey(String key) => key.toUpperCase().contains(upQuery); + + final loader = Future.wait( + sections.map((section) async { + final allTiles = await section.tiles(context); + final filteredTiles = testKey(section.title(context)) ? allTiles : allTiles.where((v) => testKey(v.title(context))).toList(); + if (filteredTiles.isEmpty) return null; + + return (context) { + return <Widget>[ + Padding( + // match header layout in Settings page + padding: const EdgeInsets.symmetric(horizontal: 18, vertical: 13), + child: Row( + children: [ + section.icon(context), + const SizedBox(width: 8), + Expanded( + child: HighlightTitle( + title: section.title(context), + showHighlight: false, + ), + ), + ], + ), + ), + ...filteredTiles.map((v) => v.build(context)), + ]; + }; + }), + ); + + return MediaQueryDataProvider( + child: SafeArea( + child: FutureBuilder<List<List<Widget> Function(BuildContext)?>>( + future: loader, + builder: (context, snapshot) { + final loaders = snapshot.data; + if (loaders == null) return const SizedBox(); + + final children = loaders.nonNulls.expand((builder) => builder(context)).toList(); + return children.isEmpty + ? EmptyContent( + icon: AIcons.settings, + text: context.l10n.settingsSearchEmpty, + ) + : ListView( + padding: const EdgeInsets.all(8), + children: children, + ); + }, + ), + ), + ); + } + + @override + Widget buildResults(BuildContext context) => buildSuggestions(context); +} diff --git a/lib/widgets/settings/settings_tv_page.dart b/lib/widgets/settings/settings_tv_page.dart new file mode 100644 index 0000000..9defe2f --- /dev/null +++ b/lib/widgets/settings/settings_tv_page.dart @@ -0,0 +1,145 @@ +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/behaviour/pop/scope.dart'; +import 'package:aves/widgets/common/behaviour/pop/tv_navigation.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/navigation/tv_rail.dart'; +import 'package:aves/widgets/settings/settings_definition.dart'; +import 'package:aves/widgets/settings/settings_page.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class SettingsTvPage extends StatelessWidget { + const SettingsTvPage({super.key}); + + @override + Widget build(BuildContext context) { + return AvesScaffold( + body: AvesPopScope( + handlers: [tvNavigationPopHandler], + child: Row( + children: [ + TvRail( + controller: context.read<TvRailController>(), + ), + Expanded( + child: Column( + children: [ + const SizedBox(height: 8), + DirectionalSafeArea( + start: false, + bottom: false, + child: AppBar( + automaticallyImplyLeading: false, + title: Text(context.l10n.settingsPageTitle), + elevation: 0, + primary: false, + ), + ), + const Expanded( + child: _Content(), + ), + ], + ), + ), + ], + ), + ), + ); + } +} + +class _Content extends StatefulWidget { + const _Content(); + + @override + State<_Content> createState() => _ContentState(); +} + +class _ContentState extends State<_Content> { + final ValueNotifier<int> _indexNotifier = ValueNotifier(0); + + @override + void dispose() { + _indexNotifier.dispose(); + super.dispose(); + } + + static final List<SettingsSection> sections = SettingsPage.sections; + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder<int>( + valueListenable: _indexNotifier, + builder: (context, selectedIndex, child) { + final rail = NavigationRail( + extended: true, + destinations: sections + .map( + (section) => NavigationRailDestination( + icon: section.icon(context), + label: Text(section.title(context)), + ), + ) + .toList(), + selectedIndex: selectedIndex, + onDestinationSelected: (index) => _indexNotifier.value = index, + minExtendedWidth: TvRail.minExtendedWidth, + ); + return LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + MediaQuery.removePadding( + context: context, + removeLeft: true, + removeTop: true, + removeRight: true, + removeBottom: true, + child: SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints(minHeight: constraints.maxHeight), + child: IntrinsicHeight(child: rail), + ), + ), + ), + Expanded( + child: MediaQuery.removePadding( + context: context, + removeLeft: !context.isRtl, + removeRight: context.isRtl, + child: _Section( + loader: sections[selectedIndex].tiles(context), + ), + ), + ), + ], + ); + }, + ); + }, + ); + } +} + +class _Section extends StatelessWidget { + final Future<List<SettingsTile>> loader; + + const _Section({required this.loader}); + + @override + Widget build(BuildContext context) { + return FutureBuilder<List<SettingsTile>>( + future: loader, + builder: (context, snapshot) { + final tiles = snapshot.data; + if (tiles == null) return const SizedBox(); + + return SettingsListView( + key: ValueKey(loader), + children: tiles.map((v) => v.build(context)).toList(), + ); + }, + ); + } +} diff --git a/lib/widgets/settings/thumbnails/collection_actions_editor_page.dart b/lib/widgets/settings/thumbnails/collection_actions_editor_page.dart new file mode 100644 index 0000000..af5be42 --- /dev/null +++ b/lib/widgets/settings/thumbnails/collection_actions_editor_page.dart @@ -0,0 +1,90 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/quick_actions/editor_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +class CollectionActionEditorPage extends StatefulWidget { + static const routeName = '/settings/collection_actions'; + + const CollectionActionEditorPage({super.key}); + + @override + State<CollectionActionEditorPage> createState() => _CollectionActionEditorPageState(); +} + +class _CollectionActionEditorPageState extends State<CollectionActionEditorPage> { + late final QuickActionEditorController<EntrySetAction> _browsingController; + late final QuickActionEditorController<EntrySetAction> _selectingController; + + @override + void initState() { + super.initState(); + _browsingController = QuickActionEditorController( + load: () => settings.collectionBrowsingQuickActions, + save: (actions) => settings.collectionBrowsingQuickActions = actions, + ); + _selectingController = QuickActionEditorController( + load: () => settings.collectionSelectionQuickActions, + save: (actions) => settings.collectionSelectionQuickActions = actions, + ); + } + + @override + void dispose() { + _browsingController.dispose(); + _selectingController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final tabs = <(Tab, Widget)>[ + ( + Tab(text: l10n.settingsCollectionQuickActionTabBrowsing), + QuickActionEditorBody<EntrySetAction>( + bannerText: context.l10n.settingsCollectionBrowsingQuickActionEditorBanner, + allAvailableActions: const [ + EntrySetActions.collectionEditorBrowsing, + ], + actionIcon: (context, action) => action.getIcon(), + actionText: (context, action) => action.getText(context), + controller: _browsingController, + ), + ), + ( + Tab(text: l10n.settingsCollectionQuickActionTabSelecting), + QuickActionEditorBody<EntrySetAction>( + bannerText: context.l10n.settingsCollectionSelectionQuickActionEditorBanner, + allAvailableActions: const [ + EntrySetActions.collectionEditorSelectionRegular, + EntrySetActions.collectionEditorSelectionEdit, + ], + actionIcon: (context, action) => action.getIcon(), + actionText: (context, action) => action.getText(context), + controller: _selectingController, + ), + ), + ]; + + return DefaultTabController( + length: tabs.length, + child: AvesScaffold( + appBar: AppBar( + title: Text(context.l10n.settingsCollectionQuickActionEditorPageTitle), + bottom: TabBar( + tabs: tabs.map((t) => t.$1).toList(), + ), + ), + body: SafeArea( + child: TabBarView( + children: tabs.map((t) => t.$2).toList(), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/settings/thumbnails/overlay.dart b/lib/widgets/settings/thumbnails/overlay.dart new file mode 100644 index 0000000..5369d0b --- /dev/null +++ b/lib/widgets/settings/thumbnails/overlay.dart @@ -0,0 +1,148 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_icons.dart'; +import 'package:aves/widgets/settings/common/switch_icon.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves/widgets/settings/settings_definition.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ThumbnailOverlayPage extends StatelessWidget { + static const routeName = '/settings/thumbnail_overlay'; + + const ThumbnailOverlayPage({super.key}); + + @override + Widget build(BuildContext context) { + final iconSize = SettingSwitchTrailingIcon.getIconSize(context); + final iconColor = SettingSwitchTrailingIcon.getIconColor(context); + + return AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: !settings.useTvLayout, + title: Text(context.l10n.settingsThumbnailOverlayPageTitle), + ), + body: SafeArea( + child: ListView( + children: [ + SettingsSwitchListTile( + selector: (context, s) => s.showThumbnailFavourite, + onChanged: (v) => settings.showThumbnailFavourite = v, + title: context.l10n.settingsThumbnailShowFavouriteIcon, + trailing: Padding( + padding: EdgeInsets.symmetric(horizontal: iconSize * (1 - FavouriteIcon.scale) / 2), + child: Icon( + AIcons.favourite, + size: iconSize * FavouriteIcon.scale, + color: iconColor, + ), + ), + ), + SettingsSwitchListTile( + selector: (context, s) => s.showThumbnailMotionPhoto, + onChanged: (v) => settings.showThumbnailMotionPhoto = v, + title: context.l10n.settingsThumbnailShowMotionPhotoIcon, + trailing: Padding( + padding: EdgeInsets.symmetric(horizontal: iconSize * (1 - MotionPhotoIcon.scale) / 2), + child: Icon( + AIcons.motionPhoto, + size: iconSize * MotionPhotoIcon.scale, + color: iconColor, + ), + ), + ), + SettingsSwitchListTile( + selector: (context, s) => s.showThumbnailRating, + onChanged: (v) => settings.showThumbnailRating = v, + title: context.l10n.settingsThumbnailShowRating, + trailing: Icon( + AIcons.rating, + size: iconSize, + color: iconColor, + ), + ), + SettingsSwitchListTile( + selector: (context, s) => s.showThumbnailHdr, + onChanged: (v) => settings.showThumbnailHdr = v, + title: context.l10n.settingsThumbnailShowHdrIcon, + trailing: Icon( + AIcons.hdr, + size: iconSize, + color: iconColor, + ), + ), + SettingsSwitchListTile( + selector: (context, s) => s.showThumbnailRaw, + onChanged: (v) => settings.showThumbnailRaw = v, + title: context.l10n.settingsThumbnailShowRawIcon, + trailing: Icon( + AIcons.raw, + size: iconSize, + color: iconColor, + ), + ), + SettingsSwitchListTile( + selector: (context, s) => s.showThumbnailVideoDuration, + onChanged: (v) => settings.showThumbnailVideoDuration = v, + title: context.l10n.settingsThumbnailShowVideoDuration, + ), + SettingsTileThumbnailLocationIcon().build(context), + SettingsTileThumbnailTagIcon().build(context), + ], + ), + ), + ); + } +} + +class SettingsTileThumbnailLocationIcon extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsThumbnailShowLocationIcon; + + @override + Widget build(BuildContext context) => SettingsSelectionListTile<ThumbnailOverlayLocationIcon>( + values: ThumbnailOverlayLocationIcon.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.thumbnailLocationIcon, + onSelection: (v) => settings.thumbnailLocationIcon = v, + tileTitle: title(context), + trailingBuilder: _buildTrailing, + ); + + Widget _buildTrailing(BuildContext context) { + final iconType = context.select<Settings, ThumbnailOverlayLocationIcon>((v) => v.thumbnailLocationIcon); + return SettingSwitchTrailingIcon( + key: ValueKey(iconType), + icon: iconType.getIcon(context), + disabled: iconType == ThumbnailOverlayLocationIcon.none, + ); + } +} + +class SettingsTileThumbnailTagIcon extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsThumbnailShowTagIcon; + + @override + Widget build(BuildContext context) => SettingsSelectionListTile<ThumbnailOverlayTagIcon>( + values: ThumbnailOverlayTagIcon.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.thumbnailTagIcon, + onSelection: (v) => settings.thumbnailTagIcon = v, + tileTitle: title(context), + trailingBuilder: _buildTrailing, + ); + + Widget _buildTrailing(BuildContext context) { + final iconType = context.select<Settings, ThumbnailOverlayTagIcon>((v) => v.thumbnailTagIcon); + return SettingSwitchTrailingIcon( + key: ValueKey(iconType), + icon: iconType.getIcon(context), + disabled: iconType == ThumbnailOverlayTagIcon.none, + ); + } +} diff --git a/lib/widgets/settings/thumbnails/thumbnails.dart b/lib/widgets/settings/thumbnails/thumbnails.dart new file mode 100644 index 0000000..7439ef9 --- /dev/null +++ b/lib/widgets/settings/thumbnails/thumbnails.dart @@ -0,0 +1,74 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/ref/bursts.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/tile_leading.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves/widgets/settings/settings_definition.dart'; +import 'package:aves/widgets/settings/thumbnails/collection_actions_editor_page.dart'; +import 'package:aves/widgets/settings/thumbnails/overlay.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ThumbnailsSection extends SettingsSection { + @override + String get key => 'thumbnails'; + + @override + Widget icon(BuildContext context) => SettingsTileLeading( + icon: AIcons.thumbnails, + color: context.select<AvesColorsData, Color>((v) => v.thumbnails), + ); + + @override + String title(BuildContext context) => context.l10n.settingsThumbnailSectionTitle; + + @override + Future<List<SettingsTile>> tiles(BuildContext context) => Future.value([ + if (!settings.useTvLayout) SettingsTileCollectionQuickActions(), + SettingsTileThumbnailOverlay(), + SettingsTileBurstPatterns(), + ]); +} + +class SettingsTileCollectionQuickActions extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsCollectionQuickActionsTile; + + @override + Widget build(BuildContext context) => SettingsSubPageTile( + title: title(context), + routeName: CollectionActionEditorPage.routeName, + builder: (context) => const CollectionActionEditorPage(), + ); +} + +class SettingsTileThumbnailOverlay extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsThumbnailOverlayTile; + + @override + Widget build(BuildContext context) => SettingsSubPageTile( + title: title(context), + routeName: ThumbnailOverlayPage.routeName, + builder: (context) => const ThumbnailOverlayPage(), + ); +} + +class SettingsTileBurstPatterns extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsCollectionBurstPatternsTile; + + @override + Widget build(BuildContext context) => SettingsMultiSelectionListTile<String>( + values: BurstPatterns.options, + getName: (context, v) => BurstPatterns.getName(v), + selector: (context, s) => s.collectionBurstPatterns, + onSelection: (v) => settings.collectionBurstPatterns = v, + tileTitle: title(context), + noneSubtitle: context.l10n.settingsCollectionBurstPatternsNone, + optionSubtitleBuilder: (value) => '${Unicode.FSI}${BurstPatterns.getExample(value)}${Unicode.PDI}', + ); +} diff --git a/lib/widgets/settings/video/control_actions.dart b/lib/widgets/settings/video/control_actions.dart new file mode 100644 index 0000000..62dbb20 --- /dev/null +++ b/lib/widgets/settings/video/control_actions.dart @@ -0,0 +1,70 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/settings/common/quick_actions/action_panel.dart'; +import 'package:aves/widgets/viewer/overlay/video/controls.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class VideoControlButtonsPage extends StatelessWidget { + static const routeName = '/settings/video/control_buttons'; + static const _availableActions = [...EntryActions.videoPlayback, EntryAction.openVideoPlayer]; + + const VideoControlButtonsPage({super.key}); + + @override + Widget build(BuildContext context) { + return AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: !settings.useTvLayout, + title: Text(context.l10n.settingsVideoButtonsTile), + ), + body: SafeArea( + child: Selector<Settings, List<EntryAction>>( + selector: (context, s) => s.videoControlActions, + builder: (context, selectedActionList, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ActionPanel( + child: Container( + alignment: AlignmentDirectional.center, + height: OverlayButton.getSize(context) + 48, + child: selectedActionList.isNotEmpty + ? VideoControlRow(onActionSelected: (_) {}) + : Text( + context.l10n.settingsViewerQuickActionEmpty, + style: Theme.of(context).textTheme.bodySmall, + ), + ), + ), + Expanded( + child: ListView( + children: _availableActions.map((action) { + return SwitchListTile( + value: selectedActionList.contains(action), + onChanged: (v) { + final selectedActionSet = settings.videoControlActions.toSet(); + if (v) { + selectedActionSet.add(action); + } else { + selectedActionSet.remove(action); + } + settings.videoControlActions = _availableActions.where(selectedActionSet.contains).toList(); + }, + title: Text(action.getText(context)), + ); + }).toList(), + ), + ), + ], + ); + }, + ), + ), + ); + } +} diff --git a/lib/widgets/settings/video/controls.dart b/lib/widgets/settings/video/controls.dart new file mode 100644 index 0000000..da1ceee --- /dev/null +++ b/lib/widgets/settings/video/controls.dart @@ -0,0 +1,47 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves/widgets/settings/video/control_actions.dart'; +import 'package:flutter/material.dart'; + +class VideoControlsPage extends StatelessWidget { + static const routeName = '/settings/video/controls'; + + const VideoControlsPage({super.key}); + + @override + Widget build(BuildContext context) { + return AvesScaffold( + appBar: AppBar( + title: Text(context.l10n.settingsVideoControlsPageTitle), + ), + body: SafeArea( + child: ListView( + children: [ + SettingsSubPageTile( + title: context.l10n.settingsVideoButtonsTile, + routeName: VideoControlButtonsPage.routeName, + builder: (context) => const VideoControlButtonsPage(), + ), + SettingsSwitchListTile( + selector: (context, s) => s.videoGestureDoubleTapTogglePlay, + onChanged: (v) => settings.videoGestureDoubleTapTogglePlay = v, + title: context.l10n.settingsVideoGestureDoubleTapTogglePlay, + ), + SettingsSwitchListTile( + selector: (context, s) => s.videoGestureSideDoubleTapSeek, + onChanged: (v) => settings.videoGestureSideDoubleTapSeek = v, + title: context.l10n.settingsVideoGestureSideDoubleTapSeek, + ), + SettingsSwitchListTile( + selector: (context, s) => s.videoGestureVerticalDragBrightnessVolume, + onChanged: (v) => settings.videoGestureVerticalDragBrightnessVolume = v, + title: context.l10n.settingsVideoGestureVerticalDragBrightnessVolume, + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/settings/video/playback.dart b/lib/widgets/settings/video/playback.dart new file mode 100644 index 0000000..d1f9a21 --- /dev/null +++ b/lib/widgets/settings/video/playback.dart @@ -0,0 +1,68 @@ +import 'package:aves/model/device.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +class VideoPlaybackPage extends StatelessWidget { + static const routeName = '/settings/video/playback'; + + const VideoPlaybackPage({super.key}); + + @override + Widget build(BuildContext context) { + return AvesScaffold( + appBar: AppBar( + title: Text(context.l10n.settingsVideoPlaybackPageTitle), + ), + body: SafeArea( + child: ListView( + children: [ + SettingsSelectionListTile<VideoHardwareAcceleration>( + values: VideoHardwareAcceleration.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.videoHardwareAcceleration, + onSelection: (v) => settings.videoHardwareAcceleration = v, + tileTitle: context.l10n.settingsVideoEnableHardwareAcceleration, + ), + SettingsSelectionListTile<VideoAutoPlayMode>( + values: VideoAutoPlayMode.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.videoAutoPlayMode, + onSelection: (v) => settings.videoAutoPlayMode = v, + tileTitle: context.l10n.settingsVideoAutoPlay, + ), + SettingsSelectionListTile<VideoLoopMode>( + values: VideoLoopMode.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.videoLoopMode, + onSelection: (v) => settings.videoLoopMode = v, + tileTitle: context.l10n.settingsVideoLoopModeTile, + dialogTitle: context.l10n.settingsVideoLoopModeDialogTitle, + ), + SettingsSelectionListTile<VideoResumptionMode>( + values: VideoResumptionMode.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.videoResumptionMode, + onSelection: (v) => settings.videoResumptionMode = v, + tileTitle: context.l10n.settingsVideoResumptionModeTile, + dialogTitle: context.l10n.settingsVideoResumptionModeDialogTitle, + ), + if (!settings.useTvLayout && device.supportPictureInPicture) + SettingsSelectionListTile<VideoBackgroundMode>( + values: VideoBackgroundMode.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.videoBackgroundMode, + onSelection: (v) => settings.videoBackgroundMode = v, + tileTitle: context.l10n.settingsVideoBackgroundMode, + dialogTitle: context.l10n.settingsVideoBackgroundModeDialogTitle, + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/settings/video/subtitle_sample.dart b/lib/widgets/settings/video/subtitle_sample.dart new file mode 100644 index 0000000..cefa0bf --- /dev/null +++ b/lib/widgets/settings/video/subtitle_sample.dart @@ -0,0 +1,104 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/widgets/common/basic/text/background_painter.dart'; +import 'package:aves/widgets/common/basic/text/outlined.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:aves/widgets/viewer/visual/video/subtitle/subtitle.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class SubtitleSample extends StatelessWidget { + const SubtitleSample({super.key}); + + @override + Widget build(BuildContext context) { + final textSpans = [ + TextSpan(text: context.l10n.settingsSubtitleThemeSample), + ]; + + return Consumer<Settings>( + builder: (context, settings, child) { + final textAlign = settings.subtitleTextAlignment; + final textPosition = settings.subtitleTextPosition; + final outlineColor = Colors.black.withValues(alpha: settings.subtitleTextColor.a); + final shadows = [ + Shadow( + color: outlineColor, + offset: VideoSubtitles.baseShadowOffset, + ), + ]; + + return Container( + decoration: BoxDecoration( + gradient: const LinearGradient( + begin: AlignmentDirectional.bottomStart, + end: AlignmentDirectional.topEnd, + colors: AColors.boraBoraGradient, + ), + border: AvesBorder.border(context), + borderRadius: const BorderRadius.all(Radius.circular(24)), + ), + height: 128, + child: AnimatedAlign( + alignment: _getAlignment(textAlign, textPosition), + curve: Curves.easeInOutCubic, + duration: const Duration(milliseconds: 400), + child: Padding( + padding: const EdgeInsets.all(16), + child: AnimatedDefaultTextStyle( + style: TextStyle( + color: settings.subtitleTextColor, + fontSize: settings.subtitleFontSize, + shadows: settings.subtitleShowOutline ? shadows : null, + ), + textAlign: textAlign, + duration: const Duration(milliseconds: 200), + child: Builder( + builder: (context) => TextBackgroundPainter( + spans: textSpans, + style: DefaultTextStyle.of(context).style.copyWith( + backgroundColor: settings.subtitleBackgroundColor, + ), + textAlign: textAlign, + child: OutlinedText( + textSpans: textSpans, + outlineWidth: settings.subtitleShowOutline ? 1 : 0, + outlineColor: outlineColor, + ), + ), + ), + ), + ), + ), + ); + }, + ); + } + + Alignment _getAlignment(TextAlign textAlign, SubtitlePosition textPosition) { + switch (textPosition) { + case SubtitlePosition.top: + switch (textAlign) { + case TextAlign.left: + return Alignment.topLeft; + case TextAlign.right: + return Alignment.topRight; + case TextAlign.center: + default: + return Alignment.topCenter; + } + case SubtitlePosition.bottom: + switch (textAlign) { + case TextAlign.left: + return Alignment.bottomLeft; + case TextAlign.right: + return Alignment.bottomRight; + case TextAlign.center: + default: + return Alignment.bottomCenter; + } + } + } +} diff --git a/lib/widgets/settings/video/subtitle_theme.dart b/lib/widgets/settings/video/subtitle_theme.dart new file mode 100644 index 0000000..a68447d --- /dev/null +++ b/lib/widgets/settings/video/subtitle_theme.dart @@ -0,0 +1,108 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/basic/list_tiles/color.dart'; +import 'package:aves/widgets/common/basic/list_tiles/slider.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves/widgets/settings/video/subtitle_sample.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class SubtitleThemePage extends StatelessWidget { + static const routeName = '/settings/video/subtitle_theme'; + + const SubtitleThemePage({super.key}); + + @override + Widget build(BuildContext context) { + return AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: !settings.useTvLayout, + title: Text(context.l10n.settingsSubtitleThemePageTitle), + ), + body: SafeArea( + child: Consumer<Settings>( + builder: (context, settings, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Padding( + padding: EdgeInsets.all(16), + child: SubtitleSample(), + ), + const Divider(height: 0), + Expanded( + child: ListView( + children: [ + SettingsSelectionListTile<TextAlign>( + values: const [TextAlign.left, TextAlign.center, TextAlign.right], + getName: _getTextAlignName, + selector: (context, s) => s.subtitleTextAlignment, + onSelection: (v) => settings.subtitleTextAlignment = v, + tileTitle: context.l10n.settingsSubtitleThemeTextAlignmentTile, + dialogTitle: context.l10n.settingsSubtitleThemeTextAlignmentDialogTitle, + ), + SettingsSelectionListTile<SubtitlePosition>( + values: const [SubtitlePosition.top, SubtitlePosition.bottom], + getName: (context, v) => v.getName(context), + selector: (context, s) => s.subtitleTextPosition, + onSelection: (v) => settings.subtitleTextPosition = v, + tileTitle: context.l10n.settingsSubtitleThemeTextPositionTile, + dialogTitle: context.l10n.settingsSubtitleThemeTextPositionDialogTitle, + ), + SliderListTile( + title: context.l10n.settingsSubtitleThemeTextSize, + value: settings.subtitleFontSize, + onChanged: (v) => settings.subtitleFontSize = v, + min: 10, + max: 40, + divisions: 6, + ), + ColorListTile( + title: context.l10n.settingsSubtitleThemeTextColor, + value: settings.subtitleTextColor.withValues(alpha: 1), + onChanged: (v) => settings.subtitleTextColor = v.withValues(alpha: settings.subtitleTextColor.a), + ), + SliderListTile( + title: context.l10n.settingsSubtitleThemeTextOpacity, + value: settings.subtitleTextColor.a, + onChanged: (v) => settings.subtitleTextColor = settings.subtitleTextColor.withValues(alpha: v), + ), + ColorListTile( + title: context.l10n.settingsSubtitleThemeBackgroundColor, + value: settings.subtitleBackgroundColor.withValues(alpha: 1), + onChanged: (v) => settings.subtitleBackgroundColor = v.withValues(alpha: settings.subtitleBackgroundColor.a), + ), + SliderListTile( + title: context.l10n.settingsSubtitleThemeBackgroundOpacity, + value: settings.subtitleBackgroundColor.a, + onChanged: (v) => settings.subtitleBackgroundColor = settings.subtitleBackgroundColor.withValues(alpha: v), + ), + SettingsSwitchListTile( + selector: (context, s) => s.subtitleShowOutline, + onChanged: (v) => settings.subtitleShowOutline = v, + title: context.l10n.settingsSubtitleThemeShowOutline, + ), + ], + ), + ), + ], + ); + }, + ), + ), + ); + } + + String _getTextAlignName(BuildContext context, TextAlign align) { + final l10n = context.l10n; + return switch (align) { + TextAlign.left => l10n.settingsSubtitleThemeTextAlignmentLeft, + TextAlign.center => l10n.settingsSubtitleThemeTextAlignmentCenter, + TextAlign.right => l10n.settingsSubtitleThemeTextAlignmentRight, + _ => '', + }; + } +} diff --git a/lib/widgets/settings/video/video.dart b/lib/widgets/settings/video/video.dart new file mode 100644 index 0000000..98f9fc5 --- /dev/null +++ b/lib/widgets/settings/video/video.dart @@ -0,0 +1,93 @@ +import 'dart:async'; + +import 'package:aves/model/filters/mime.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/tile_leading.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves/widgets/settings/settings_definition.dart'; +import 'package:aves/widgets/settings/video/controls.dart'; +import 'package:aves/widgets/settings/video/playback.dart'; +import 'package:aves/widgets/settings/video/subtitle_theme.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class VideoSection extends SettingsSection { + final bool standalonePage; + + VideoSection({ + this.standalonePage = false, + }); + + @override + String get key => 'video'; + + @override + Widget icon(BuildContext context) => SettingsTileLeading( + icon: AIcons.video, + color: context.select<AvesColorsData, Color>((v) => v.video), + ); + + @override + String title(BuildContext context) => context.l10n.settingsVideoSectionTitle; + + @override + Future<List<SettingsTile>> tiles(BuildContext context) async { + return [ + if (!standalonePage) SettingsTileVideoShowVideos(), + SettingsTileVideoPlayback(), + if (!settings.useTvLayout) SettingsTileVideoControls(), + SettingsTileVideoSubtitleTheme(), + ]; + } +} + +class SettingsTileVideoShowVideos extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsVideoShowVideos; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => !s.hiddenFilters.contains(MimeFilter.video), + onChanged: (v) => settings.changeFilterVisibility({MimeFilter.video}, v), + title: title(context), + ); +} + +class SettingsTileVideoPlayback extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsVideoPlaybackTile; + + @override + Widget build(BuildContext context) => SettingsSubPageTile( + title: title(context), + routeName: VideoPlaybackPage.routeName, + builder: (context) => const VideoPlaybackPage(), + ); +} + +class SettingsTileVideoControls extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsVideoControlsTile; + + @override + Widget build(BuildContext context) => SettingsSubPageTile( + title: title(context), + routeName: VideoControlsPage.routeName, + builder: (context) => const VideoControlsPage(), + ); +} + +class SettingsTileVideoSubtitleTheme extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsSubtitleThemeTile; + + @override + Widget build(BuildContext context) => SettingsSubPageTile( + title: title(context), + routeName: SubtitleThemePage.routeName, + builder: (context) => const SubtitleThemePage(), + ); +} diff --git a/lib/widgets/settings/video/video_settings_page.dart b/lib/widgets/settings/video/video_settings_page.dart new file mode 100644 index 0000000..03df151 --- /dev/null +++ b/lib/widgets/settings/video/video_settings_page.dart @@ -0,0 +1,49 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/settings_definition.dart'; +import 'package:aves/widgets/settings/video/video.dart'; +import 'package:flutter/material.dart'; + +class VideoSettingsPage extends StatefulWidget { + static const routeName = '/settings/video'; + + const VideoSettingsPage({super.key}); + + @override + State<VideoSettingsPage> createState() => _VideoSettingsPageState(); +} + +class _VideoSettingsPageState extends State<VideoSettingsPage> { + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: !settings.useTvLayout, + title: Text(context.l10n.settingsVideoPageTitle), + ), + body: Theme( + data: theme.copyWith( + textTheme: theme.textTheme.copyWith( + // dense style font for tile subtitles, without modifying title font + bodyMedium: const TextStyle(fontSize: 12), + ), + ), + child: SafeArea( + child: FutureBuilder<List<SettingsTile>>( + future: VideoSection(standalonePage: true).tiles(context), + builder: (context, snapshot) { + final tiles = snapshot.data; + if (tiles == null) return const SizedBox(); + + return ListView( + children: tiles.map((v) => v.build(context)).toList(), + ); + }, + ), + ), + ), + ); + } +} diff --git a/lib/widgets/settings/viewer/entry_background.dart b/lib/widgets/settings/viewer/entry_background.dart new file mode 100644 index 0000000..53a3a0b --- /dev/null +++ b/lib/widgets/settings/viewer/entry_background.dart @@ -0,0 +1,61 @@ +import 'package:aves/model/settings/enums/entry_background.dart'; +import 'package:aves/widgets/common/basic/color_indicator.dart'; +import 'package:aves/widgets/common/fx/checkered_decoration.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +class EntryBackgroundSelector extends StatefulWidget { + final ValueGetter<EntryBackground> getter; + final ValueSetter<EntryBackground> setter; + + const EntryBackgroundSelector({ + super.key, + required this.getter, + required this.setter, + }); + + @override + State<EntryBackgroundSelector> createState() => _EntryBackgroundSelectorState(); +} + +class _EntryBackgroundSelectorState extends State<EntryBackgroundSelector> { + @override + Widget build(BuildContext context) { + return DropdownButtonHideUnderline( + child: DropdownButton<EntryBackground>( + items: _buildItems(context), + value: widget.getter(), + onChanged: (selected) { + if (selected != null) { + widget.setter(selected); + setState(() {}); + } + }, + ), + ); + } + + List<DropdownMenuItem<EntryBackground>> _buildItems(BuildContext context) { + return [ + EntryBackground.white, + EntryBackground.black, + EntryBackground.checkered, + ].map((selected) { + return DropdownMenuItem<EntryBackground>( + value: selected, + child: ColorIndicator( + value: selected.isColor ? selected.color : null, + child: selected == EntryBackground.checkered + ? ClipOval( + child: CustomPaint( + painter: CheckeredPainter( + checkSize: ColorIndicator.radius, + ), + ), + ) + : null, + ), + ); + }).toList(); + } +} diff --git a/lib/widgets/settings/viewer/overlay.dart b/lib/widgets/settings/viewer/overlay.dart new file mode 100644 index 0000000..35e8bb3 --- /dev/null +++ b/lib/widgets/settings/viewer/overlay.dart @@ -0,0 +1,125 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/switch_icon.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ViewerOverlayPage extends StatelessWidget { + static const routeName = '/settings/viewer/overlay'; + + const ViewerOverlayPage({super.key}); + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final useTvLayout = settings.useTvLayout; + + Widget _trailingIcon(BuildContext context, IconData data) => Icon( + data, + size: SettingSwitchTrailingIcon.getIconSize(context), + color: SettingSwitchTrailingIcon.getIconColor(context), + ); + + return AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: !useTvLayout, + title: Text(l10n.settingsViewerOverlayPageTitle), + ), + body: SafeArea( + child: ListView( + children: [ + if (!useTvLayout) ...[ + SettingsSwitchListTile( + selector: (context, s) => s.showOverlayOnOpening, + onChanged: (v) => settings.showOverlayOnOpening = v, + title: l10n.settingsViewerShowOverlayOnOpening, + ), + const Divider(height: 32), + ], + SettingsSwitchListTile( + selector: (context, s) => s.showOverlayInfo, + onChanged: (v) => settings.showOverlayInfo = v, + title: l10n.settingsViewerShowInformation, + subtitle: l10n.settingsViewerShowInformationSubtitle, + ), + Selector<Settings, bool>( + selector: (context, s) => s.showOverlayInfo, + builder: (context, showInfo, child) { + return SettingsSwitchListTile( + selector: (context, s) => s.showOverlayShootingDetails, + onChanged: showInfo ? (v) => settings.showOverlayShootingDetails = v : null, + title: l10n.settingsViewerShowShootingDetails, + trailing: _trailingIcon(context, AIcons.shooting), + ); + }, + ), + Selector<Settings, bool>( + selector: (context, s) => s.showOverlayInfo, + builder: (context, showInfo, child) { + return SettingsSwitchListTile( + selector: (context, s) => s.showOverlayRatingTags, + onChanged: showInfo ? (v) => settings.showOverlayRatingTags = v : null, + title: l10n.settingsViewerShowRatingTags, + trailing: _trailingIcon(context, AIcons.tag), + ); + }, + ), + Selector<Settings, bool>( + selector: (context, s) => s.showOverlayInfo, + builder: (context, showInfo, child) { + return SettingsSwitchListTile( + selector: (context, s) => s.showOverlayDescription, + onChanged: showInfo ? (v) => settings.showOverlayDescription = v : null, + title: l10n.settingsViewerShowDescription, + trailing: _trailingIcon(context, AIcons.description), + ); + }, + ), + if (!useTvLayout) ...[ + const Divider(height: 32), + SettingsSwitchListTile( + selector: (context, s) => s.showOverlayZoomLevel, + onChanged: (v) => settings.showOverlayZoomLevel = v, + title: l10n.settingsViewerShowZoomLevel, + trailing: _trailingIcon(context, AIcons.zoomLevel), + ), + SettingsSwitchListTile( + selector: (context, s) => s.showOverlayMinimap, + onChanged: (v) => settings.showOverlayMinimap = v, + title: l10n.settingsViewerShowMinimap, + trailing: _trailingIcon(context, AIcons.minimap), + ), + SettingsSelectionListTile<OverlayHistogramStyle>( + values: OverlayHistogramStyle.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.overlayHistogramStyle, + onSelection: (v) => settings.overlayHistogramStyle = v, + tileTitle: l10n.settingsViewerShowHistogram, + trailingBuilder: (context) { + final style = context.select<Settings, OverlayHistogramStyle>((v) => v.overlayHistogramStyle); + return SettingSwitchTrailingIcon( + key: ValueKey(style), + icon: AIcons.histogram, + disabled: style == OverlayHistogramStyle.none, + ); + }, + ), + const Divider(height: 32), + SettingsSwitchListTile( + selector: (context, s) => s.showOverlayThumbnailPreview, + onChanged: (v) => settings.showOverlayThumbnailPreview = v, + title: l10n.settingsViewerShowOverlayThumbnails, + trailing: _trailingIcon(context, AIcons.thumbnailBar), + ), + ], + ], + ), + ), + ); + } +} diff --git a/lib/widgets/settings/viewer/slideshow.dart b/lib/widgets/settings/viewer/slideshow.dart new file mode 100644 index 0000000..7a9294d --- /dev/null +++ b/lib/widgets/settings/viewer/slideshow.dart @@ -0,0 +1,70 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; + +class ViewerSlideshowPage extends StatelessWidget { + static const routeName = '/settings/viewer/slideshow'; + + const ViewerSlideshowPage({super.key}); + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: !settings.useTvLayout, + title: Text(l10n.settingsViewerSlideshowPageTitle), + ), + body: SafeArea( + child: ListView( + children: [ + SettingsSwitchListTile( + selector: (context, s) => s.slideshowRepeat, + onChanged: (v) => settings.slideshowRepeat = v, + title: l10n.settingsSlideshowRepeat, + ), + SettingsSwitchListTile( + selector: (context, s) => s.slideshowShuffle, + onChanged: (v) => settings.slideshowShuffle = v, + title: l10n.settingsSlideshowShuffle, + ), + SettingsSwitchListTile( + selector: (context, s) => s.slideshowFillScreen, + onChanged: (v) => settings.slideshowFillScreen = v, + title: l10n.settingsSlideshowFillScreen, + ), + SettingsSwitchListTile( + selector: (context, s) => s.slideshowAnimatedZoomEffect, + onChanged: (v) => settings.slideshowAnimatedZoomEffect = v, + title: l10n.settingsSlideshowAnimatedZoomEffect, + ), + SettingsSelectionListTile<ViewerTransition>( + values: ViewerTransition.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.slideshowTransition, + onSelection: (v) => settings.slideshowTransition = v, + tileTitle: l10n.settingsSlideshowTransitionTile, + ), + SettingsDurationListTile( + selector: (context, s) => s.slideshowInterval, + onChanged: (v) => settings.slideshowInterval = v, + title: l10n.settingsSlideshowIntervalTile, + ), + SettingsSelectionListTile<SlideshowVideoPlayback>( + values: SlideshowVideoPlayback.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => s.slideshowVideoPlayback, + onSelection: (v) => settings.slideshowVideoPlayback = v, + tileTitle: l10n.settingsSlideshowVideoPlaybackTile, + dialogTitle: l10n.settingsSlideshowVideoPlaybackDialogTitle, + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/settings/viewer/viewer.dart b/lib/widgets/settings/viewer/viewer.dart new file mode 100644 index 0000000..7f78f8a --- /dev/null +++ b/lib/widgets/settings/viewer/viewer.dart @@ -0,0 +1,193 @@ +import 'dart:async'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/tile_leading.dart'; +import 'package:aves/widgets/settings/common/tiles.dart'; +import 'package:aves/widgets/settings/settings_definition.dart'; +import 'package:aves/widgets/settings/viewer/entry_background.dart'; +import 'package:aves/widgets/settings/viewer/overlay.dart'; +import 'package:aves/widgets/settings/viewer/slideshow.dart'; +import 'package:aves/widgets/settings/viewer/viewer_actions_editor.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +// ✅ NEW: enum per la scelta sorgente dei contenuti locali durante il cast +import 'package:aves/model/settings/enums/local_cast_source_mode.dart'; + +class ViewerSection extends SettingsSection { + @override + String get key => 'viewer'; + + @override + Widget icon(BuildContext context) => SettingsTileLeading( + icon: AIcons.image, + color: context.select<AvesColorsData, Color>((v) => v.image), + ); + + @override + String title(BuildContext context) => context.l10n.settingsViewerSectionTitle; + + @override + Future<List<SettingsTile>> tiles(BuildContext context) async { + final isCutoutAware = await windowService.isCutoutAware(); + return [ + if (!settings.useTvLayout) SettingsTileViewerQuickActions(), + SettingsTileViewerOverlay(), + SettingsTileViewerSlideshow(), + + // ✅ NEW: impostazione solo per contenuti locali (Cast) + if (!settings.useTvLayout) SettingsTileViewerLocalCastSourceMode(), + + if (!settings.useTvLayout) SettingsTileViewerGestureSideTapNext(), + if (!settings.useTvLayout && isCutoutAware) SettingsTileViewerUseCutout(), + SettingsTileViewerMotionPhotoAutoPlay(), + SettingsTileViewerImageBackground(), + ]; + } +} + +class SettingsTileViewerQuickActions extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsViewerQuickActionsTile; + + @override + Widget build(BuildContext context) => SettingsSubPageTile( + title: title(context), + routeName: ViewerActionEditorPage.routeName, + builder: (context) => const ViewerActionEditorPage(), + ); +} + +class SettingsTileViewerOverlay extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsViewerOverlayTile; + + @override + Widget build(BuildContext context) => SettingsSubPageTile( + title: title(context), + routeName: ViewerOverlayPage.routeName, + builder: (context) => const ViewerOverlayPage(), + ); +} + +class SettingsTileViewerSlideshow extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsViewerSlideshowTile; + + @override + Widget build(BuildContext context) => SettingsSubPageTile( + title: title(context), + routeName: ViewerSlideshowPage.routeName, + builder: (context) => const ViewerSlideshowPage(), + ); +} + +// ✅ NEW TILE: scelta sorgente per i contenuti locali quando si fa Cast +class SettingsTileViewerLocalCastSourceMode extends SettingsTile { + @override + String title(BuildContext context) => 'Casting (solo contenuti locali)'; + + String _modeLabel(LocalCastSourceMode v) { + switch (v) { + case LocalCastSourceMode.automatic: + return 'Automatico'; + case LocalCastSourceMode.phone: + return 'Sempre Telefono (LAN)'; + case LocalCastSourceMode.server: + return 'Sempre Server (Cloud)'; + } + } + + String _modeSubtitle(LocalCastSourceMode v) { + switch (v) { + case LocalCastSourceMode.automatic: + return 'Se il server è raggiungibile usa il server; altrimenti usa il telefono (LAN).'; + case LocalCastSourceMode.phone: + return 'I file locali vengono serviti dal telefono tramite Wi‑Fi (funziona anche senza Internet).'; + case LocalCastSourceMode.server: + return 'I file locali vengono serviti dal server remoto (richiede server raggiungibile).'; + } + } + + @override + Widget build(BuildContext context) => Selector<Settings, LocalCastSourceMode>( + selector: (context, s) => s.localCastSourceMode, + builder: (context, mode, child) => ListTile( + title: Text(title(context)), + subtitle: Text(_modeSubtitle(mode)), + trailing: DropdownButton<LocalCastSourceMode>( + value: mode, + onChanged: (v) { + if (v != null) settings.localCastSourceMode = v; + }, + items: LocalCastSourceMode.values + .map( + (v) => DropdownMenuItem<LocalCastSourceMode>( + value: v, + child: Text(_modeLabel(v)), + ), + ) + .toList(), + ), + ), + ); +} + +class SettingsTileViewerGestureSideTapNext extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsViewerGestureSideTapNext; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.viewerGestureSideTapNext, + onChanged: (v) => settings.viewerGestureSideTapNext = v, + title: title(context), + ); +} + +class SettingsTileViewerUseCutout extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsViewerUseCutout; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.viewerUseCutout, + onChanged: (v) => settings.viewerUseCutout = v, + title: title(context), + ); +} + +class SettingsTileViewerMotionPhotoAutoPlay extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsMotionPhotoAutoPlay; + + @override + Widget build(BuildContext context) => SettingsSwitchListTile( + selector: (context, s) => s.enableMotionPhotoAutoPlay, + onChanged: (v) => settings.enableMotionPhotoAutoPlay = v, + title: title(context), + ); +} + +class SettingsTileViewerImageBackground extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsImageBackground; + + @override + Widget build(BuildContext context) => Selector<Settings, EntryBackground>( + selector: (context, s) => s.imageBackground, + builder: (context, current, child) => ListTile( + title: Text(title(context)), + trailing: EntryBackgroundSelector( + getter: () => current, + setter: (value) => settings.imageBackground = value, + ), + ), + ); +} + diff --git a/lib/widgets/settings/viewer/viewer_actions_editor.dart b/lib/widgets/settings/viewer/viewer_actions_editor.dart new file mode 100644 index 0000000..4871082 --- /dev/null +++ b/lib/widgets/settings/viewer/viewer_actions_editor.dart @@ -0,0 +1,73 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/settings/common/quick_actions/editor_page.dart'; +import 'package:aves/widgets/viewer/overlay/bottom.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class ViewerActionEditorPage extends StatefulWidget { + static const routeName = '/settings/viewer/actions'; + + const ViewerActionEditorPage({super.key}); + + @override + State<ViewerActionEditorPage> createState() => _ViewerActionEditorPageState(); +} + +class _ViewerActionEditorPageState extends State<ViewerActionEditorPage> { + late final QuickActionEditorController<EntryAction> _controller; + + static final allAvailableActions = [ + [ + EntryAction.share, + EntryAction.edit, + EntryAction.rename, + EntryAction.delete, + EntryAction.copy, + EntryAction.move, + EntryAction.toggleFavourite, + EntryAction.rotateScreen, + EntryAction.viewSource, + EntryAction.rotateCCW, + EntryAction.rotateCW, + EntryAction.flip, + ], + [ + ...EntryActions.export, + ], + [ + ...EntryActions.video.whereNot((v) => v == EntryAction.videoSettings), + ], + EntryActions.commonMetadataActions, + ]; + + @override + void initState() { + super.initState(); + _controller = QuickActionEditorController( + load: () => settings.viewerQuickActions, + save: (actions) => settings.viewerQuickActions = actions, + ); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return QuickActionEditorPage<EntryAction>( + title: context.l10n.settingsViewerQuickActionEditorPageTitle, + bannerText: context.l10n.settingsViewerQuickActionEditorBanner, + displayedButtonsDirection: ViewerBottomOverlay.actionsDirection, + allAvailableActions: allAvailableActions, + actionIcon: (context, action) => action.getIcon(), + actionText: (context, action) => action.getText(context), + controller: _controller, + ); + } +} diff --git a/lib/widgets/stats/date/axis.dart b/lib/widgets/stats/date/axis.dart new file mode 100644 index 0000000..01bca20 --- /dev/null +++ b/lib/widgets/stats/date/axis.dart @@ -0,0 +1,97 @@ +import 'dart:math'; + +import 'package:aves/model/filters/date.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:charts_flutter/flutter.dart' as charts; +import 'package:intl/intl.dart'; + +// cf charts.DateTimeTickFormatter factory internals for default formats +class TimeAxisSpec { + final List<charts.TickSpec<DateTime>> tickSpecs; + + TimeAxisSpec(this.tickSpecs); + + factory TimeAxisSpec.forLevel({ + required String locale, + required DateLevel level, + required DateTime first, + required DateTime last, + }) { + switch (level) { + case DateLevel.ymd: + return TimeAxisSpec.days(locale, first, last); + case DateLevel.ym: + return TimeAxisSpec.months(locale, first, last); + case DateLevel.y: + default: + return TimeAxisSpec.years(locale, first, last); + } + } + + factory TimeAxisSpec.days(String locale, DateTime first, DateTime last) { + final daysTickLongFormat = DateFormat.MMMd(locale); + final daysTickShortFormat = DateFormat.d(locale); + + first = first.date; + last = last.date; + final rangeDays = last.difference(first).inHumanDays; + final delta = max(1, (rangeDays / 5).ceil()); + + List<charts.TickSpec<DateTime>> ticks = []; + int lastContext = -1; + DateFormat dateFormat; + for (int i = 0; i < rangeDays; i += delta) { + final tickDate = first.addDays(i); + if (lastContext != tickDate.month) { + lastContext = tickDate.month; + dateFormat = daysTickLongFormat; + } else { + dateFormat = daysTickShortFormat; + } + ticks.add(charts.TickSpec<DateTime>(tickDate, label: dateFormat.format(tickDate))); + } + return TimeAxisSpec(ticks); + } + + factory TimeAxisSpec.months(String locale, DateTime first, DateTime last) { + final monthsTickLongFormat = DateFormat.yMMM(locale); + final monthsTickShortFormat = DateFormat.MMM(locale); + + first = DateTime(first.year, first.month); + last = DateTime(last.year, last.month); + final rangeMonths = last.month - first.month + (last.month < first.month ? 12 : 0); + if (rangeMonths < 12) { + first = first.addMonths(-((12 - rangeMonths) / 2).floor()); + } + + List<charts.TickSpec<DateTime>> ticks = []; + int lastContext = -1; + DateFormat dateFormat; + for (int i = 0; i < DateTime.monthsPerYear; i += 3) { + final tickDate = first.addMonths(2 + i); + if (lastContext != tickDate.year) { + lastContext = tickDate.year; + dateFormat = monthsTickLongFormat; + } else { + dateFormat = monthsTickShortFormat; + } + ticks.add(charts.TickSpec<DateTime>(tickDate, label: dateFormat.format(tickDate))); + } + return TimeAxisSpec(ticks); + } + + factory TimeAxisSpec.years(String locale, DateTime first, DateTime last) { + final dateFormat = DateFormat.y(locale); + + final firstYear = first.year; + final lastYear = last.year; + final delta = max(1, ((lastYear - firstYear) / 5).ceil()); + + List<charts.TickSpec<DateTime>> ticks = []; + for (int year = firstYear; year <= lastYear; year += delta) { + final tickDate = DateTime(year); + ticks.add(charts.TickSpec<DateTime>(tickDate, label: dateFormat.format(tickDate))); + } + return TimeAxisSpec(ticks); + } +} diff --git a/lib/widgets/stats/date/histogram.dart b/lib/widgets/stats/date/histogram.dart new file mode 100644 index 0000000..7627964 --- /dev/null +++ b/lib/widgets/stats/date/histogram.dart @@ -0,0 +1,387 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/sort.dart'; +import 'package:aves/model/filters/date.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/fx/transitions.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/stats/date/axis.dart'; +import 'package:charts_flutter/flutter.dart' as charts; +import 'package:collection/collection.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; + +class Histogram extends StatefulWidget { + final Set<AvesEntry> entries; + final Duration animationDuration; + final AFilterCallback onFilterSelection; + + const Histogram({ + super.key, + required this.entries, + required this.animationDuration, + required this.onFilterSelection, + }); + + @override + State<Histogram> createState() => _HistogramState(); +} + +class _HistogramState extends State<Histogram> with AutomaticKeepAliveClientMixin { + DateLevel _level = DateLevel.y; + DateTime? _firstDate, _lastDate; + final Map<DateTime, int> _entryCountPerDate = {}; + final ValueNotifier<_EntryByDate?> _selection = ValueNotifier(null); + List<_EntryByDate>? _seriesData; + late Future<List<_EntryByDate>?> _interpolatedDataLoader; + late Future<void> _areaChartLoader; + + static const histogramHeight = 200.0; + + Duration get animationDuration => widget.animationDuration; + + @override + void initState() { + super.initState(); + + final entriesByDateDescending = List.of(widget.entries)..sort(AvesEntrySort.compareByDate); + var lastDate = entriesByDateDescending.firstWhereOrNull((entry) => entry.bestDate != null)?.bestDate; + var firstDate = entriesByDateDescending.lastWhereOrNull((entry) => entry.bestDate != null)?.bestDate; + + if (lastDate != null && firstDate != null) { + final rangeDays = lastDate.difference(firstDate).inHumanDays; + if (rangeDays > 1) { + if (rangeDays <= 31) { + _level = DateLevel.ymd; + } else if (rangeDays <= 365) { + _level = DateLevel.ym; + } + + late DateTime Function(DateTime) normalizeDate; + switch (_level) { + case DateLevel.ymd: + normalizeDate = (v) => DateTime(v.year, v.month, v.day); + case DateLevel.ym: + normalizeDate = (v) => DateTime(v.year, v.month); + default: + normalizeDate = (v) => DateTime(v.year); + } + _firstDate = normalizeDate(firstDate); + _lastDate = normalizeDate(lastDate); + + final dates = entriesByDateDescending.map((entry) => entry.bestDate).nonNulls; + _entryCountPerDate.addAll(groupBy<DateTime, DateTime>(dates, normalizeDate).map((k, v) => MapEntry(k, v.length))); + if (_entryCountPerDate.isNotEmpty) { + // discrete points + _seriesData = _entryCountPerDate.entries.map((kv) { + return _EntryByDate(date: kv.key, entryCount: kv.value); + }).toList(); + + // smooth curve + _interpolatedDataLoader = compute<_DataInterpolationArg, List<_EntryByDate>?>( + _computeInterpolatedData, + _DataInterpolationArg( + firstDate: _firstDate, + lastDate: _lastDate, + level: _level, + entryCountPerDate: _entryCountPerDate, + ), + ); + _areaChartLoader = _interpolatedDataLoader.then((_) => Future.delayed(animationDuration * timeDilation)); + } + } + } + } + + static List<_EntryByDate>? _computeInterpolatedData(_DataInterpolationArg arg) { + final firstDate = arg.firstDate; + final lastDate = arg.lastDate; + final level = arg.level; + final entryCountPerDate = arg.entryCountPerDate; + + if (firstDate == null || lastDate == null) return null; + + final xRange = lastDate.difference(firstDate); + final xRangeInMillis = xRange.inMilliseconds; + late int xCount; + late DateTime Function(DateTime date) incrementDate; + switch (level) { + case DateLevel.ymd: + xCount = xRange.inHumanDays; + incrementDate = (date) => DateTime(date.year, date.month, date.day + 1); + case DateLevel.ym: + xCount = (xRange.inHumanDays / 30.5).round(); + incrementDate = (date) => DateTime(date.year, date.month + 1); + default: + xCount = lastDate.year - firstDate.year; + incrementDate = (date) => DateTime(date.year + 1); + } + final yMax = entryCountPerDate.values.reduce(max).toDouble(); + final xInterval = yMax / xCount; + final controlPoints = <Offset>[]; + var date = firstDate; + for (int i = 0; i <= xCount; i++) { + controlPoints.add(Offset(i * xInterval, (entryCountPerDate[date] ?? 0).toDouble())); + date = incrementDate(date); + } + final interpolatedPoints = controlPoints.length > 3 ? CatmullRomSpline(controlPoints).generateSamples().map((sample) => sample.value).toList() : controlPoints; + final interpolatedData = interpolatedPoints.map((p) { + final date = firstDate.add(Duration(milliseconds: p.dx * xRangeInMillis ~/ yMax)); + final entryCount = p.dy.clamp(0, yMax); + return _EntryByDate(date: date, entryCount: entryCount); + }).toList(); + + return interpolatedData; + } + + @override + Widget build(BuildContext context) { + super.build(context); + + if (_seriesData == null) return const SizedBox(); + + return FutureBuilder<List<_EntryByDate>?>( + future: _interpolatedDataLoader, + builder: (context, snapshot) { + final interpolatedData = snapshot.data; + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.symmetric(horizontal: 8), + height: histogramHeight, + child: AnimatedSwitcher( + duration: animationDuration, + child: interpolatedData != null + ? Stack( + children: [ + FutureBuilder<void>( + future: _areaChartLoader, + builder: (context, snapshot) { + Widget child = const SizedBox(); + if (snapshot.connectionState == ConnectionState.done) { + child = _buildChart(context, interpolatedData, isInterpolated: true, isArea: true); + } + return AnimatedSwitcher( + duration: animationDuration, + child: child, + ); + }, + ), + _buildChart(context, interpolatedData, isInterpolated: true, isArea: false), + _buildChart(context, _seriesData!, isInterpolated: false, isArea: false), + ], + ) + : const SizedBox(), + ), + ), + _buildSelectionRow(), + ], + ); + }, + ); + } + + Widget _buildChart(BuildContext context, List<_EntryByDate> seriesData, {required bool isInterpolated, required bool isArea}) { + final drawArea = isInterpolated && isArea; + final drawLine = isInterpolated && !isArea; + final drawPoints = !isInterpolated; + + final colorScheme = Theme.of(context).colorScheme; + final accentColor = colorScheme.primary; + final axisColor = charts.ColorUtil.fromDartColor(drawPoints ? colorScheme.onSurface : Colors.transparent); + final measureLineColor = charts.ColorUtil.fromDartColor(drawPoints ? colorScheme.onSurface.withValues(alpha: .1) : Colors.transparent); + final histogramLineColor = charts.ColorUtil.fromDartColor(drawLine ? accentColor : Colors.white); + final histogramPointStrikeColor = charts.ColorUtil.fromDartColor(drawPoints ? colorScheme.onSurface : Colors.transparent); + final histogramPointFillColor = charts.ColorUtil.fromDartColor(Themes.firstLayerColor(context)); + + final series = [ + if (drawLine || drawArea) + charts.Series<_EntryByDate, DateTime>( + id: 'curve', + data: seriesData, + domainFn: (d, i) => d.date, + measureFn: (d, i) => d.entryCount, + colorFn: (d, i) => histogramLineColor, + ), + if (drawPoints && !drawArea) + charts.Series<_EntryByDate, DateTime>( + id: 'points', + data: seriesData, + domainFn: (d, i) => d.date, + measureFn: (d, i) => d.entryCount, + colorFn: (d, i) => histogramPointStrikeColor, + fillColorFn: (d, i) => histogramPointFillColor, + )..setAttribute(charts.rendererIdKey, 'customPoint'), + ]; + + final locale = context.locale; + final timeAxisSpec = _firstDate != null && _lastDate != null + ? TimeAxisSpec.forLevel( + locale: locale, + level: _level, + first: _firstDate!, + last: _lastDate!, + ) + : null; + final tickFormatter = NumberFormat.decimalPattern(locale); + + final domainAxis = charts.DateTimeAxisSpec( + renderSpec: charts.SmallTickRendererSpec( + labelStyle: charts.TextStyleSpec(color: axisColor), + lineStyle: charts.LineStyleSpec(color: axisColor), + ), + tickProviderSpec: timeAxisSpec != null && timeAxisSpec.tickSpecs.isNotEmpty ? charts.StaticDateTimeTickProviderSpec(timeAxisSpec.tickSpecs) : null, + ); + + Widget chart = charts.TimeSeriesChart( + series, + animate: false, + animationDuration: animationDuration, + domainAxis: domainAxis, + primaryMeasureAxis: charts.NumericAxisSpec( + renderSpec: charts.GridlineRendererSpec( + labelStyle: charts.TextStyleSpec(color: axisColor), + lineStyle: charts.LineStyleSpec(color: measureLineColor), + ), + tickFormatterSpec: charts.BasicNumericTickFormatterSpec((v) { + // localize and hide 0 + return (v == null || v == 0) ? '' : tickFormatter.format(v); + }), + ), + defaultRenderer: charts.LineRendererConfig( + includeArea: drawArea, + areaOpacity: 1, + ), + customSeriesRenderers: [ + charts.PointRendererConfig( + customRendererId: 'customPoint', + strokeWidthPx: 2, + symbolRenderer: _CircleSymbolRenderer(isSolid: false), + ), + ], + defaultInteractions: false, + behaviors: drawPoints + ? [ + charts.SelectNearest(), + charts.LinePointHighlighter( + defaultRadiusPx: 8, + radiusPaddingPx: 2, + showHorizontalFollowLine: charts.LinePointHighlighterFollowLineType.nearest, + showVerticalFollowLine: charts.LinePointHighlighterFollowLineType.nearest, + ), + ] + : null, + selectionModels: [ + charts.SelectionModelConfig( + changedListener: (model) => _selection.value = model.selectedDatum.firstOrNull?.datum as _EntryByDate?, + ), + ], + ); + if (drawArea) { + chart = ShaderMask( + shaderCallback: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + accentColor, + accentColor.withAlpha(0), + ], + ).createShader, + blendMode: BlendMode.srcIn, + child: chart, + ); + } + return chart; + } + + Widget _buildSelectionRow() { + final countFormatter = NumberFormat.decimalPattern(context.locale); + + return ValueListenableBuilder<_EntryByDate?>( + valueListenable: _selection, + builder: (context, selection, child) { + late Widget child; + if (selection == null) { + child = const SizedBox(); + } else { + final filter = DateFilter(_level, selection.date); + final count = selection.entryCount; + child = Padding( + padding: const EdgeInsets.all(8), + child: Row( + children: [ + AvesFilterChip( + filter: filter, + onTap: widget.onFilterSelection, + ), + const Spacer(), + Text( + countFormatter.format(count), + style: TextStyle( + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + textAlign: TextAlign.end, + ), + ], + ), + ); + } + + return AnimatedSwitcher( + duration: context.read<DurationsData>().formTransition, + switchInCurve: Curves.easeInOutCubic, + switchOutCurve: Curves.easeInOutCubic, + transitionBuilder: AvesTransitions.formTransitionBuilder, + child: child, + ); + }, + ); + } + + @override + bool get wantKeepAlive => true; +} + +@immutable +class _EntryByDate extends Equatable { + final DateTime date; + final num entryCount; + + @override + List<Object?> get props => [date, entryCount]; + + const _EntryByDate({ + required this.date, + required this.entryCount, + }); +} + +class _CircleSymbolRenderer extends charts.CircleSymbolRenderer { + _CircleSymbolRenderer({super.isSolid = true}); + + @override + charts.Color? getSolidFillColor(charts.Color? fillColor) => fillColor; +} + +class _DataInterpolationArg { + final DateLevel level; + final DateTime? firstDate, lastDate; + final Map<DateTime, int> entryCountPerDate; + + const _DataInterpolationArg({ + required this.level, + required this.firstDate, + required this.lastDate, + required this.entryCountPerDate, + }); +} diff --git a/lib/widgets/stats/filter_table.dart b/lib/widgets/stats/filter_table.dart new file mode 100644 index 0000000..b3d36a4 --- /dev/null +++ b/lib/widgets/stats/filter_table.dart @@ -0,0 +1,124 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/stats/percent_text.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:percent_indicator/linear_percent_indicator.dart'; +import 'package:provider/provider.dart'; + +class FilterTable<T extends Comparable> extends StatelessWidget { + final int totalEntryCount; + final Map<T, int> entryCountMap; + final CollectionFilter Function(T key) filterBuilder; + final bool sortByCount; + final int? maxRowCount; + final AFilterCallback onFilterSelection; + + const FilterTable({ + super.key, + required this.totalEntryCount, + required this.entryCountMap, + required this.filterBuilder, + required this.sortByCount, + required this.maxRowCount, + required this.onFilterSelection, + }); + + static const chipWidth = 160.0; + static const countWidth = 32.0; + static const percentIndicatorMinWidth = 80.0; + + @override + Widget build(BuildContext context) { + final countFormatter = NumberFormat.decimalPattern(context.locale); + final animate = context.select<Settings, bool>((v) => v.animate); + + final sortedEntries = entryCountMap.entries.toList(); + if (sortByCount) { + sortedEntries.sort((kv1, kv2) { + final c = kv2.value.compareTo(kv1.value); + return c != 0 ? c : kv1.key.compareTo(kv2.key); + }); + } + + final textScaler = MediaQuery.textScalerOf(context); + final lineHeight = textScaler.scale(16); + final barRadius = Radius.circular(lineHeight / 2); + final isRtl = context.isRtl; + + return Padding( + padding: const EdgeInsetsDirectional.only(start: AvesFilterChip.outlineWidth / 2 + 6, end: 8), + child: LayoutBuilder( + builder: (context, constraints) { + final showPercentIndicator = constraints.maxWidth - (chipWidth + countWidth) > percentIndicatorMinWidth; + final displayedEntries = maxRowCount != null ? sortedEntries.take(maxRowCount!) : sortedEntries; + final isMonochrome = settings.themeColorMode == AvesThemeColorMode.monochrome; + return Table( + children: displayedEntries.map((kv) { + final filter = filterBuilder(kv.key); + final count = kv.value; + final percent = count / totalEntryCount; + final colorScheme = Theme.of(context).colorScheme; + return TableRow( + children: [ + Container( + // the `Table` `border` property paints on the cells and does not add margins, + // so we define margins here instead, but they should be symmetric + // to keep all cells vertically aligned on the center/middle + margin: const EdgeInsets.symmetric(vertical: 4), + alignment: AlignmentDirectional.centerStart, + child: AvesFilterChip( + filter: filter, + onTap: onFilterSelection, + ), + ), + if (showPercentIndicator) + FutureBuilder<Color>( + future: filter.color(context), + builder: (context, snapshot) { + final color = snapshot.data; + return Stack( + // use a stack instead of `center` field, so that the widgets + // are centered even when the center child has larger height + alignment: Alignment.center, + children: [ + LinearPercentIndicator( + percent: percent, + lineHeight: lineHeight, + backgroundColor: Themes.secondLayerColor(context), + progressColor: isMonochrome ? colorScheme.primary : color, + animation: animate, + isRTL: isRtl, + barRadius: barRadius, + padding: EdgeInsets.symmetric(horizontal: lineHeight), + ), + LinearPercentIndicatorText(percent: percent), + ], + ); + }, + ), + Text( + countFormatter.format(count), + style: TextStyle( + color: colorScheme.onSurfaceVariant, + ), + textAlign: TextAlign.end, + ), + ], + ); + }).toList(), + columnWidths: const { + 0: MaxColumnWidth(IntrinsicColumnWidth(), FixedColumnWidth(chipWidth)), + 2: MaxColumnWidth(IntrinsicColumnWidth(), FixedColumnWidth(countWidth)), + }, + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + ); + }, + ), + ); + } +} diff --git a/lib/widgets/stats/mime_donut.dart b/lib/widgets/stats/mime_donut.dart new file mode 100644 index 0000000..45fcf5a --- /dev/null +++ b/lib/widgets/stats/mime_donut.dart @@ -0,0 +1,43 @@ +import 'package:aves/model/filters/mime.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/utils/mime_utils.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_donut.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; + +class MimeDonut extends StatelessWidget { + final IconData icon; + final Map<String, int> byMimeTypes; + final Duration animationDuration; + final AFilterCallback onFilterSelection; + + const MimeDonut({ + super.key, + required this.icon, + required this.byMimeTypes, + required this.animationDuration, + required this.onFilterSelection, + }); + + @override + Widget build(BuildContext context) { + final countFormatter = NumberFormat.decimalPattern(context.locale); + + String formatKey(d) => MimeUtils.displayType(d.key); + return AvesDonut( + title: Icon(icon), + byTypes: byMimeTypes, + animationDuration: animationDuration, + formatKey: formatKey, + formatValue: countFormatter.format, + colorize: (context, d) { + final colors = context.read<AvesColorsData>(); + return colors.fromString(formatKey(d)); + }, + onTap: (d) => onFilterSelection(MimeFilter(d.key)), + ); + } +} diff --git a/lib/widgets/stats/percent_text.dart b/lib/widgets/stats/percent_text.dart new file mode 100644 index 0000000..971dee4 --- /dev/null +++ b/lib/widgets/stats/percent_text.dart @@ -0,0 +1,33 @@ +import 'package:aves/theme/styles.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/basic/text/outlined.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class LinearPercentIndicatorText extends StatelessWidget { + final double percent; + + const LinearPercentIndicatorText({ + super.key, + required this.percent, + }); + + @override + Widget build(BuildContext context) { + final percentFormatter = NumberFormat.percentPattern(context.locale); + + return OutlinedText( + textSpans: [ + TextSpan( + text: percentFormatter.format(percent), + style: TextStyle( + shadows: Theme.of(context).isDark ? AStyles.embossShadows : null, + ), + ), + ], + outlineColor: Themes.firstLayerColor(context), + ); + } +} diff --git a/lib/widgets/stats/stats_page.dart b/lib/widgets/stats/stats_page.dart new file mode 100644 index 0000000..46bafa7 --- /dev/null +++ b/lib/widgets/stats/stats_page.dart @@ -0,0 +1,554 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/rating.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/ref/locales.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/format.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/view/src/metadata/exportable_fields.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/vault_aware.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/basic/tv_edge_focus.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/dialogs/export_collection_stats_page.dart'; +import 'package:aves/widgets/stats/date/histogram.dart'; +import 'package:aves/widgets/stats/filter_table.dart'; +import 'package:aves/widgets/stats/mime_donut.dart'; +import 'package:aves/widgets/stats/percent_text.dart'; +import 'package:aves/widgets/stats/top_page.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:csv/csv.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:intl/intl.dart'; +import 'package:percent_indicator/linear_percent_indicator.dart'; +import 'package:provider/provider.dart'; + +class StatsPage extends StatefulWidget { + static const routeName = '/collection/stats'; + + final Set<AvesEntry> entries; + final CollectionSource source; + final CollectionLens? parentCollection; + + const StatsPage({ + super.key, + required this.entries, + required this.source, + this.parentCollection, + }); + + @override + State<StatsPage> createState() => _StatsPageState(); +} + +class _StatsPageState extends State<StatsPage> with FeedbackMixin, VaultAwareMixin { + final Map<String, int> _entryCountPerCountry = {}, _entryCountPerState = {}, _entryCountPerPlace = {}; + final Map<String, int> _entryCountPerTag = {}, _entryCountPerAlbum = {}; + final Map<int, int> _entryCountPerRating = Map.fromEntries(List.generate(7, (i) => MapEntry(5 - i, 0))); + late final ValueNotifier<bool> _isPageAnimatingNotifier; + int _totalSizeBytes = 0; + int _totalDurationMillis = 0; + + Set<AvesEntry> get entries => widget.entries; + + @override + void initState() { + super.initState(); + + _isPageAnimatingNotifier = ValueNotifier(true); + Future.delayed(ADurations.pageTransitionLoose * timeDilation).then((_) { + if (!mounted) return; + _isPageAnimatingNotifier.value = false; + }); + + entries.forEach((entry) { + _totalSizeBytes += entry.sizeBytes ?? 0; + _totalDurationMillis += entry.durationMillis ?? 0; + + if (entry.hasAddress) { + final address = entry.addressDetails!; + var country = address.countryName; + if (country != null && country.isNotEmpty) { + country += '${LocationFilter.locationSeparator}${address.countryCode}'; + _entryCountPerCountry[country] = (_entryCountPerCountry[country] ?? 0) + 1; + } + var state = address.stateName; + if (state != null && state.isNotEmpty) { + state += '${LocationFilter.locationSeparator}${address.stateCode}'; + _entryCountPerState[state] = (_entryCountPerState[state] ?? 0) + 1; + } + final place = address.place; + if (place != null && place.isNotEmpty) { + _entryCountPerPlace[place] = (_entryCountPerPlace[place] ?? 0) + 1; + } + } + + entry.tags.forEach((tag) { + _entryCountPerTag[tag] = (_entryCountPerTag[tag] ?? 0) + 1; + }); + + final album = entry.directory; + if (album != null) { + _entryCountPerAlbum[album] = (_entryCountPerAlbum[album] ?? 0) + 1; + } + + final rating = entry.rating; + _entryCountPerRating[rating] = (_entryCountPerRating[rating] ?? 0) + 1; + }); + } + + @override + void dispose() { + _isPageAnimatingNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final useTvLayout = settings.useTvLayout; + return ValueListenableBuilder<bool>( + valueListenable: _isPageAnimatingNotifier, + builder: (context, animating, child) { + final l10n = context.l10n; + + Widget child = const SizedBox(); + + if (!animating) { + final durations = context.watch<DurationsData>(); + + if (entries.isEmpty) { + child = EmptyContent( + icon: AIcons.image, + text: l10n.collectionEmptyImages, + ); + } else { + final chartAnimationDuration = context.read<DurationsData>().chartTransition; + + final byMimeTypes = groupBy<AvesEntry, String>(entries, (entry) => entry.mimeType).map<String, int>((k, v) => MapEntry(k, v.length)); + final imagesByMimeTypes = Map.fromEntries(byMimeTypes.entries.where((kv) => kv.key.startsWith('image'))); + final videoByMimeTypes = Map.fromEntries(byMimeTypes.entries.where((kv) => kv.key.startsWith('video'))); + final mimeDonuts = Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + MimeDonut( + icon: AIcons.image, + byMimeTypes: imagesByMimeTypes, + animationDuration: chartAnimationDuration, + onFilterSelection: (filter) => _onFilterSelection(context, filter), + ), + MimeDonut( + icon: AIcons.video, + byMimeTypes: videoByMimeTypes, + animationDuration: chartAnimationDuration, + onFilterSelection: (filter) => _onFilterSelection(context, filter), + ), + ], + ); + + final showRatings = _entryCountPerRating.entries.any((kv) => kv.key != 0 && kv.value > 0); + final source = widget.source; + child = NotificationListener<SelectFilterNotification>( + onNotification: (notification) { + _onFilterSelection(context, notification.filter); + return true; + }, + child: AnimationLimiter( + child: ListView( + children: AnimationConfiguration.toStaggeredList( + duration: durations.staggeredAnimation, + delay: durations.staggeredAnimationDelay * timeDilation, + childAnimationBuilder: (child) => SlideAnimation( + verticalOffset: 50.0, + child: FadeInAnimation( + child: child, + ), + ), + children: [ + const TvEdgeFocus(), + mimeDonuts, + Histogram( + entries: entries, + animationDuration: chartAnimationDuration, + onFilterSelection: (filter) => _onFilterSelection(context, filter), + ), + const SizedBox(height: 16), + _buildTotalSizeIndicator(context), + if (_totalDurationMillis > 0) ...[ + const SizedBox(height: 16), + _buildTotalDurationIndicator(), + ], + const SizedBox(height: 16), + _LocationIndicator(entries: entries), + ..._buildFilterSection<String>(context, l10n.statsTopCountriesSectionTitle, _entryCountPerCountry, (v) => LocationFilter(LocationLevel.country, v)), + ..._buildFilterSection<String>(context, l10n.statsTopStatesSectionTitle, _entryCountPerState, (v) => LocationFilter(LocationLevel.state, v)), + ..._buildFilterSection<String>(context, l10n.statsTopPlacesSectionTitle, _entryCountPerPlace, (v) => LocationFilter(LocationLevel.place, v)), + ..._buildFilterSection<String>(context, l10n.statsTopTagsSectionTitle, _entryCountPerTag, TagFilter.new), + ..._buildFilterSection<String>(context, l10n.statsTopAlbumsSectionTitle, _entryCountPerAlbum, (v) => StoredAlbumFilter(v, source.getStoredAlbumDisplayName(context, v))), + if (showRatings) ..._buildFilterSection<int>(context, l10n.searchRatingSectionTitle, _entryCountPerRating, RatingFilter.new, sortByCount: false, maxRowCount: null), + ], + ), + ), + ), + ); + } + } + + return AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: !useTvLayout, + title: Text(l10n.statsPageTitle), + actions: [ + IconButton( + icon: Icon(AIcons.fileExport), + onPressed: () => _export(context), + tooltip: context.l10n.settingsActionExport, + ), + ], + ), + body: GestureAreaProtectorStack( + child: SafeArea( + bottom: false, + child: TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: child, + ), + ), + ), + ); + }, + ); + } + + Widget _buildTotalSizeIndicator(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(AIcons.size), + const SizedBox(width: 16), + Expanded( + child: Text(formatFileSize(context.locale, _totalSizeBytes)), + ), + ], + ), + ); + } + + Widget _buildTotalDurationIndicator() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(AIcons.videoPlay), + const SizedBox(width: 16), + Expanded( + child: Text(formatFriendlyDuration(Duration(milliseconds: _totalDurationMillis))), + ), + ], + ), + ); + } + + List<Widget> _buildFilterSection<T extends Comparable>( + BuildContext context, + String title, + Map<T, int> entryCountMap, + CollectionFilter Function(T key) filterBuilder, { + bool sortByCount = true, + int? maxRowCount = 3, + }) { + if (entryCountMap.isEmpty) return []; + + final totalEntryCount = entries.length; + final hasMore = maxRowCount != null && entryCountMap.length > maxRowCount; + final onHeaderPressed = hasMore + ? () => Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: StatsTopPage.routeName), + builder: (context) => StatsTopPage( + title: title, + totalEntryCount: totalEntryCount, + entryCountMap: entryCountMap, + filterBuilder: filterBuilder, + sortByCount: sortByCount, + onFilterSelection: (filter) => _onFilterSelection(context, filter), + ), + ), + ) + : null; + Widget header = Text( + title, + style: AStyles.knownTitleText, + ); + if (settings.useTvLayout) { + header = Padding( + padding: const EdgeInsets.all(16), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + header, + const SizedBox(width: 16), + Icon(AIcons.next, color: hasMore ? null : Theme.of(context).disabledColor), + ], + ), + ); + header = Container( + padding: const EdgeInsets.symmetric(vertical: 12), + alignment: AlignmentDirectional.centerStart, + // prevent ink response when tapping the header does nothing, + // because otherwise Play Store reviewers think it is broken navigation + child: onHeaderPressed != null + ? InkWell( + onTap: onHeaderPressed, + borderRadius: const BorderRadius.all(Radius.circular(123)), + child: header, + ) + : Focus(child: header), + ); + } else { + header = Padding( + padding: const EdgeInsets.all(16), + child: Row( + children: [ + header, + const Spacer(), + IconButton( + icon: const Icon(AIcons.next), + onPressed: onHeaderPressed, + tooltip: MaterialLocalizations.of(context).moreButtonTooltip, + ), + ], + ), + ); + } + + return [ + header, + FilterTable( + totalEntryCount: totalEntryCount, + entryCountMap: entryCountMap, + filterBuilder: filterBuilder, + sortByCount: sortByCount, + maxRowCount: maxRowCount, + onFilterSelection: (filter) => _onFilterSelection(context, filter), + ), + ]; + } + + Future<void> _onFilterSelection(BuildContext context, CollectionFilter filter) async { + if (!await unlockFilter(context, filter)) return; + + if (widget.parentCollection != null) { + _applyToParentCollectionPage(context, filter); + } else { + _jumpToCollectionPage(context, filter); + } + } + + void _applyToParentCollectionPage(BuildContext context, CollectionFilter filter) { + widget.parentCollection!.addFilters({filter}); + // We delay closing the current page after applying the filter selection + // so that hero animation target is ready in the `FilterBar`, + // even when the target is a child of an `AnimatedList`. + // Do not use `WidgetsBinding.instance.addPostFrameCallback`, + // as it may not trigger if there is no subsequent build. + Future.delayed(const Duration(milliseconds: 100), () => Navigator.maybeOf(context)?.popUntil((route) => route.settings.name == CollectionPage.routeName)); + } + + void _jumpToCollectionPage(BuildContext context, CollectionFilter filter) { + Navigator.maybeOf(context)?.pushAndRemoveUntil( + MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) => CollectionPage( + source: widget.source, + filters: {filter}, + ), + ), + (route) => false, + ); + } + + Future<void> _export(BuildContext context) async { + final sample = entries.first; + final locale = context.locale; + String previewer(ExportableEntryField field) => _exportEntryField(field, sample, locale)?.toString() ?? ''; + + final options = await Navigator.maybeOf(context)?.push<(String, Set<ExportableEntryField>, ExportTarget)>( + MaterialPageRoute( + settings: const RouteSettings(name: ExportCollectionStatsPage.routeName), + builder: (context) => ExportCollectionStatsPage(previewer: previewer), + ), + ); + if (options == null) return; + + final (mimeType, fieldSet, target) = options; + final index = ExportableEntryField.values.indexOf; + final fieldList = fieldSet.sorted((a, b) => index(a).compareTo(index(b))); + + String body = ''; + switch (mimeType) { + case MimeTypes.csv: + body = _exportToCsv(fieldList, context); + case MimeTypes.json: + body = _exportToJson(fieldList); + } + + final bool? success; + switch (target) { + case ExportTarget.clipboard: + success = await appService.copyToClipboard(text: body); + case ExportTarget.file: + success = await storageService.createFile( + 'aves-stats-${DateFormat('yyyyMMdd_HHmmss', asciiLocale).format(DateTime.now())}${MimeTypes.extensionFor(mimeType)}', + mimeType, + Uint8List.fromList(utf8.encode(body)), + ); + } + if (success != null) { + if (success) { + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } else { + showFeedback(context, FeedbackType.warn, context.l10n.genericFailureFeedback); + } + } + } + + static Object? _exportEntryField(ExportableEntryField field, AvesEntry entry, String locale) { + switch (field) { + case ExportableEntryField.uri: + return entry.uri; + case ExportableEntryField.path: + return entry.path; + case ExportableEntryField.title: + return entry.bestTitle; + case ExportableEntryField.date: + return entry.bestDate?.toIso8601String(); + case ExportableEntryField.size: + return entry.sizeBytes; + case ExportableEntryField.resolution: + return entry.getResolutionText(locale); + case ExportableEntryField.width: + return entry.displaySize.width.toInt(); + case ExportableEntryField.height: + return entry.displaySize.height.toInt(); + case ExportableEntryField.duration: + final durationMillis = entry.durationMillis ?? 0; + return durationMillis > 0 ? durationMillis : null; + case ExportableEntryField.coordinates: + final latLng = entry.latLng; + return latLng != null ? '${latLng.latitude},${latLng.longitude}' : null; + case ExportableEntryField.address: + final shortAddress = entry.shortAddress; + return shortAddress.isNotEmpty ? shortAddress : null; + case ExportableEntryField.tags: + return entry.tags.join(';'); + } + } + + String _exportToCsv(List<ExportableEntryField> fields, BuildContext context) { + final locale = context.locale; + final headers = fields.map((v) => v.getText(context)).toList(); + List<String> toCsvValues(AvesEntry entry) => fields.map((field) { + return _exportEntryField(field, entry, locale)?.toString() ?? ''; + }).toList(); + return const ListToCsvConverter().convert( + [headers, ...entries.map(toCsvValues)], + ); + } + + String _exportToJson(List<ExportableEntryField> fields) { + final locale = context.locale; + Map<String, Object?> toJsonMap(AvesEntry entry) => Map.fromEntries( + fields.map((field) => MapEntry(field.name, _exportEntryField(field, entry, locale))), + ); + return jsonEncode(entries.map(toJsonMap).toList()); + } +} + +class _LocationIndicator extends StatelessWidget { + final Set<AvesEntry> entries; + + const _LocationIndicator({required this.entries}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final catalogued = entries.where((entry) => entry.isCatalogued); + final withGps = catalogued.where((entry) => entry.hasGps); + final withGpsCount = withGps.length; + final withGpsPercent = withGpsCount / entries.length; + final textScaler = MediaQuery.textScalerOf(context); + final lineHeight = textScaler.scale(16); + final barRadius = Radius.circular(lineHeight / 2); + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + children: [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(AIcons.location), + Expanded( + child: Stack( + // use a stack instead of `center` field, so that the widgets + // are centered even when the center child has larger height + alignment: Alignment.center, + children: [ + LinearPercentIndicator( + percent: withGpsPercent, + lineHeight: lineHeight, + backgroundColor: Themes.secondLayerColor(context), + progressColor: theme.colorScheme.primary, + animation: context.select<Settings, bool>((v) => v.animate), + isRTL: context.isRtl, + barRadius: barRadius, + padding: EdgeInsets.symmetric(horizontal: lineHeight), + ), + LinearPercentIndicatorText(percent: withGpsPercent), + ], + ), + ), + // end padding to match leading, so that inside label is aligned with outside label below + const SizedBox(width: 24), + ], + ), + const SizedBox(height: 8), + Text( + context.l10n.statsWithGps(withGpsCount), + textAlign: TextAlign.center, + ), + ], + ), + ); + } +} diff --git a/lib/widgets/stats/top_page.dart b/lib/widgets/stats/top_page.dart new file mode 100644 index 0000000..4628b31 --- /dev/null +++ b/lib/widgets/stats/top_page.dart @@ -0,0 +1,131 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/ref/locales.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/stats/filter_table.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:csv/csv.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; + +class StatsTopPage<T extends Comparable> extends StatelessWidget with FeedbackMixin { + static const routeName = '/collection/stats/top'; + + final String title; + final int totalEntryCount; + final Map<T, int> entryCountMap; + final CollectionFilter Function(T key) filterBuilder; + final bool sortByCount; + final AFilterCallback onFilterSelection; + + const StatsTopPage({ + super.key, + required this.title, + required this.totalEntryCount, + required this.entryCountMap, + required this.filterBuilder, + required this.sortByCount, + required this.onFilterSelection, + }); + + @override + Widget build(BuildContext context) { + return AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: !settings.useTvLayout, + title: Text(title), + actions: [ + IconButton( + icon: Icon(AIcons.fileExport), + onPressed: () => _export(context), + tooltip: context.l10n.settingsActionExport, + ), + ], + ), + body: GestureAreaProtectorStack( + child: SafeArea( + bottom: false, + child: Builder( + builder: (context) { + return NotificationListener<SelectFilterNotification>( + onNotification: (notification) { + onFilterSelection(notification.filter); + return true; + }, + child: SingleChildScrollView( + padding: + const EdgeInsets.symmetric(vertical: 8) + + EdgeInsets.only( + bottom: context.select<MediaQueryData, double>((mq) => mq.effectiveBottomPadding), + ), + child: FilterTable( + totalEntryCount: totalEntryCount, + entryCountMap: entryCountMap, + filterBuilder: filterBuilder, + sortByCount: sortByCount, + maxRowCount: null, + onFilterSelection: onFilterSelection, + ), + ), + ); + }, + ), + ), + ), + ); + } + + Future<void> _export(BuildContext context) async { + final sortedEntries = entryCountMap.entries.toList(); + if (sortByCount) { + sortedEntries.sort((kv1, kv2) { + final c = kv2.value.compareTo(kv1.value); + return c != 0 ? c : kv1.key.compareTo(kv2.key); + }); + } + + final csvContent = const ListToCsvConverter().convert([ + [title, '#'], + ...sortedEntries.map((kv) { + final filter = filterBuilder(kv.key); + final count = kv.value; + + String label; + switch (filter) { + case StoredAlbumFilter _: + label = filter.album; + default: + label = filter.getLabel(context); + } + return [label, count]; + }), + ]); + + const mimeType = MimeTypes.csv; + final success = await storageService.createFile( + 'aves-stats-${DateFormat('yyyyMMdd_HHmmss', asciiLocale).format(DateTime.now())}${MimeTypes.extensionFor(mimeType)}', + mimeType, + Uint8List.fromList(utf8.encode(csvContent)), + ); + if (success != null) { + if (success) { + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } else { + showFeedback(context, FeedbackType.warn, context.l10n.genericFailureFeedback); + } + } + } +} diff --git a/lib/widgets/viewer/action/entry_action_delegate.dart b/lib/widgets/viewer/action/entry_action_delegate.dart new file mode 100644 index 0000000..2211028 --- /dev/null +++ b/lib/widgets/viewer/action/entry_action_delegate.dart @@ -0,0 +1,518 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/device.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/favourites.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/entry/extensions/metadata_edition.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/vaults/vaults.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/media/media_edit_service.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/action_mixins/entry_storage.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; +import 'package:aves/widgets/common/action_mixins/size_aware.dart'; +import 'package:aves/widgets/common/action_mixins/vault_aware.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/add_shortcut_dialog.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/convert_entry_dialog.dart'; +import 'package:aves/widgets/dialogs/entry_editors/rename_entry_dialog.dart'; +import 'package:aves/widgets/viewer/action/entry_info_action_delegate.dart'; +import 'package:aves/widgets/viewer/action/printer.dart'; +import 'package:aves/widgets/viewer/action/single_entry_editor.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves/widgets/viewer/debug/debug_page.dart'; +import 'package:aves/widgets/viewer/entry_viewer_page.dart'; +import 'package:aves/widgets/viewer/multipage/conductor.dart'; +import 'package:aves/widgets/viewer/source_viewer_page.dart'; +import 'package:aves/widgets/viewer/video/conductor.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMixin, SingleEntryEditorMixin, EntryStorageMixin, VaultAwareMixin { + final AvesEntry mainEntry, pageEntry; + final CollectionLens? collection; + final EntryInfoActionDelegate _metadataActionDelegate = EntryInfoActionDelegate(); + + EntryActionDelegate(this.mainEntry, this.pageEntry, this.collection); + + bool isVisible({ + required AppMode appMode, + required EntryAction action, + }) { + if (mainEntry.trashed) { + switch (action) { + case EntryAction.delete: + case EntryAction.restore: + return true; + case EntryAction.debug: + return !kReleaseMode; + default: + return false; + } + } else { + final targetEntry = EntryActions.pageActions.contains(action) ? pageEntry : mainEntry; + final canWrite = appMode.canEditEntry && !settings.isReadOnly; + switch (action) { + case EntryAction.toggleFavourite: + return collection != null; + case EntryAction.delete: + case EntryAction.rename: + case EntryAction.move: + return canWrite && targetEntry.canEdit; + case EntryAction.copy: + return canWrite; + case EntryAction.rotateCCW: + case EntryAction.rotateCW: + return canWrite && targetEntry.canRotate; + case EntryAction.flip: + return canWrite && targetEntry.canFlip; + case EntryAction.convert: + return canWrite && !targetEntry.isPureVideo; + case EntryAction.print: + return !targetEntry.isPureVideo; + case EntryAction.openMap: + return !settings.useTvLayout && targetEntry.hasGps; + case EntryAction.viewSource: + return targetEntry.isSvg; + case EntryAction.videoCaptureFrame: + return canWrite && targetEntry.isPureVideo; + case EntryAction.lockViewer: + case EntryAction.videoToggleMute: + return !settings.useTvLayout && targetEntry.isPureVideo; + case EntryAction.videoSelectStreams: + case EntryAction.videoSetSpeed: + case EntryAction.videoABRepeat: + case EntryAction.videoSettings: + case EntryAction.videoTogglePlay: + case EntryAction.videoReplay10: + case EntryAction.videoSkip10: + case EntryAction.videoShowPreviousFrame: + case EntryAction.videoShowNextFrame: + case EntryAction.openVideoPlayer: + return targetEntry.isPureVideo; + case EntryAction.rotateScreen: + return !settings.useTvLayout && settings.isRotationLocked; + case EntryAction.addShortcut: + return device.canPinShortcut; + case EntryAction.edit: + return canWrite; + case EntryAction.copyToClipboard: + case EntryAction.open: + case EntryAction.setAs: + case EntryAction.cast: + return !settings.useTvLayout; + case EntryAction.info: + case EntryAction.share: + return true; + case EntryAction.restore: + return false; + case EntryAction.editDate: + case EntryAction.editLocation: + case EntryAction.editTitleDescription: + case EntryAction.editRating: + case EntryAction.editTags: + case EntryAction.removeMetadata: + case EntryAction.exportMetadata: + case EntryAction.showGeoTiffOnMap: + case EntryAction.convertMotionPhotoToStillImage: + case EntryAction.viewMotionPhotoVideo: + return _metadataActionDelegate.isVisible( + appMode: appMode, + targetEntry: targetEntry, + action: action, + ); + case EntryAction.debug: + return !kReleaseMode; + } + } + } + + bool canApply(EntryAction action) { + final targetEntry = EntryActions.pageActions.contains(action) ? pageEntry : mainEntry; + switch (action) { + case EntryAction.rotateCCW: + case EntryAction.rotateCW: + case EntryAction.flip: + case EntryAction.editDate: + case EntryAction.editLocation: + case EntryAction.editTitleDescription: + case EntryAction.editRating: + case EntryAction.editTags: + case EntryAction.removeMetadata: + case EntryAction.exportMetadata: + case EntryAction.showGeoTiffOnMap: + case EntryAction.convertMotionPhotoToStillImage: + case EntryAction.viewMotionPhotoVideo: + return _metadataActionDelegate.canApply(targetEntry, action); + case EntryAction.convert: + case EntryAction.rename: + case EntryAction.copy: + case EntryAction.move: + return !availability.isLocked; + default: + return true; + } + } + + AvesEntry _getTargetEntry(BuildContext context, EntryAction action) { + if (mainEntry.isMultiPage && (mainEntry.isStack || EntryActions.pageActions.contains(action))) { + final multiPageController = context.read<MultiPageConductor>().getController(mainEntry); + if (multiPageController != null) { + final multiPageInfo = multiPageController.info; + final pageEntry = multiPageInfo?.getPageEntryByIndex(multiPageController.page); + if (pageEntry != null) { + return pageEntry; + } + } + } + return mainEntry; + } + + void onActionSelected(BuildContext context, EntryAction action) { + reportService.log('$runtimeType handles $action'); + final targetEntry = _getTargetEntry(context, action); + + switch (action) { + case EntryAction.info: + ShowInfoPageNotification().dispatch(context); + case EntryAction.addShortcut: + _addShortcut(context, targetEntry); + case EntryAction.copyToClipboard: + appService.copyToClipboard(label: targetEntry.bestTitle, uri: targetEntry.uri).then((success) { + if (success) { + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } else { + showFeedback(context, FeedbackType.warn, context.l10n.genericFailureFeedback); + } + }); + case EntryAction.delete: + _delete(context, targetEntry); + case EntryAction.restore: + _move(context, targetEntry, moveType: MoveType.fromBin); + case EntryAction.convert: + _convert(context, targetEntry); + case EntryAction.print: + EntryPrinter(targetEntry).print(context); + case EntryAction.rename: + _rename(context, targetEntry); + case EntryAction.copy: + _move(context, targetEntry, moveType: MoveType.copy); + case EntryAction.move: + _move(context, targetEntry, moveType: MoveType.move); + case EntryAction.share: + appService.shareEntries({targetEntry}).then((success) { + if (!success) showNoMatchingAppDialog(context); + }); + case EntryAction.toggleFavourite: + targetEntry.toggleFavourite(); + // raster + case EntryAction.rotateCCW: + _rotate(context, targetEntry, clockwise: false); + case EntryAction.rotateCW: + _rotate(context, targetEntry, clockwise: true); + case EntryAction.flip: + _flip(context, targetEntry); + // vector + case EntryAction.viewSource: + _goToSourceViewer(context, targetEntry); + case EntryAction.lockViewer: + const LockViewNotification(locked: true).dispatch(context); + // video + case EntryAction.videoCaptureFrame: + case EntryAction.videoToggleMute: + case EntryAction.videoSelectStreams: + case EntryAction.videoSetSpeed: + case EntryAction.videoABRepeat: + case EntryAction.videoSettings: + case EntryAction.videoTogglePlay: + case EntryAction.videoReplay10: + case EntryAction.videoSkip10: + case EntryAction.videoShowPreviousFrame: + case EntryAction.videoShowNextFrame: + case EntryAction.openVideoPlayer: + final controller = context.read<VideoConductor>().getController(targetEntry); + if (controller != null) { + VideoActionNotification( + controller: controller, + entry: targetEntry, + action: action, + ).dispatch(context); + } + case EntryAction.edit: + appService.edit(targetEntry.uri, targetEntry.mimeType).then((fields) async { + final error = fields['error'] as String?; + if (error == null) { + final resultUri = fields['uri'] as String?; + final mimeType = fields['mimeType'] as String?; + await _handleEditResult(context, resultUri, mimeType); + } else if (error == 'edit-resolve') { + await showNoMatchingAppDialog(context); + } + }); + case EntryAction.open: + appService.open(targetEntry.uri, targetEntry.mimeTypeAnySubtype, forceChooser: true).then((success) { + if (!success) showNoMatchingAppDialog(context); + }); + case EntryAction.openMap: + appService.openMap(targetEntry.latLng!).then((success) { + if (!success) showNoMatchingAppDialog(context); + }); + case EntryAction.setAs: + appService.setAs(targetEntry.uri, targetEntry.mimeType).then((success) { + if (!success) showNoMatchingAppDialog(context); + }); + case EntryAction.cast: + const CastNotification(true).dispatch(context); + // platform + case EntryAction.rotateScreen: + _rotateScreen(context); + // metadata + case EntryAction.editDate: + case EntryAction.editLocation: + case EntryAction.editTitleDescription: + case EntryAction.editRating: + case EntryAction.editTags: + case EntryAction.removeMetadata: + case EntryAction.exportMetadata: + case EntryAction.showGeoTiffOnMap: + case EntryAction.convertMotionPhotoToStillImage: + case EntryAction.viewMotionPhotoVideo: + _metadataActionDelegate.onActionSelected(context, targetEntry, collection, action); + // debug + case EntryAction.debug: + _goToDebug(context, targetEntry); + } + } + + Future<void> _handleEditResult(BuildContext context, String? resultUri, String? mimeType) async { + final _collection = collection; + if (_collection == null || resultUri == null) return; + + final editedEntry = await mediaFetchService.getEntry(resultUri, mimeType); + if (editedEntry == null) { + debugPrint('failed to find edited entry with mimeType=$mimeType uri=$resultUri'); + return; + } + + final editedUri = editedEntry.uri; + final matchCurrentFilters = _collection.filters.every((filter) => filter.test(editedEntry)); + + final l10n = context.l10n; + // get navigator beforehand because + // local context may be deactivated when action is triggered after navigation + final navigator = Navigator.maybeOf(context); + final showAction = SnackBarAction( + label: l10n.showButtonLabel, + onPressed: () { + if (navigator != null) { + final source = _collection.source; + navigator.pushAndRemoveUntil( + MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) => CollectionPage( + source: source, + filters: matchCurrentFilters ? _collection.filters : {}, + highlightTest: (entry) => entry.uri == editedUri, + ), + ), + (route) => false, + ); + } + }, + ); + showFeedback(context, FeedbackType.info, l10n.genericSuccessFeedback, showAction); + } + + Future<void> quickMove(BuildContext context, String destinationAlbum, {required bool copy}) async { + if (!await unlockAlbum(context, destinationAlbum)) return; + + final targetEntry = _getTargetEntry(context, copy ? EntryAction.copy : EntryAction.move); + if (!copy && targetEntry.directory == destinationAlbum) return; + + await doQuickMove( + context, + moveType: copy ? MoveType.copy : MoveType.move, + entriesByDestination: { + destinationAlbum: {targetEntry}, + }, + ); + } + + Future<void> quickShare(BuildContext context, ShareAction action) async { + switch (action) { + case ShareAction.imageOnly: + if (mainEntry.isMotionPhoto) { + final fields = await embeddedDataService.extractMotionPhotoImage(mainEntry); + await _shareMotionPhotoPart(context, fields); + } + case ShareAction.videoOnly: + if (mainEntry.isMotionPhoto) { + final fields = await embeddedDataService.extractMotionPhotoVideo(mainEntry); + await _shareMotionPhotoPart(context, fields); + } + } + } + + Future<void> _shareMotionPhotoPart(BuildContext context, Map fields) async { + final uri = fields['uri'] as String?; + final mimeType = fields['mimeType'] as String?; + if (uri != null && mimeType != null) { + await appService.shareSingle(uri, mimeType).then((success) { + if (!success) showNoMatchingAppDialog(context); + }); + } + } + + void quickRate(BuildContext context, int rating) { + final targetEntry = _getTargetEntry(context, EntryAction.editRating); + _metadataActionDelegate.quickRate(context, targetEntry, rating); + } + + void quickTag(BuildContext context, CollectionFilter filter) { + final targetEntry = _getTargetEntry(context, EntryAction.editTags); + _metadataActionDelegate.quickTag(context, targetEntry, filter); + } + + Future<void> _addShortcut(BuildContext context, AvesEntry targetEntry) async { + final result = await showDialog<(AvesEntry?, String)>( + context: context, + builder: (context) => AddShortcutDialog( + defaultName: targetEntry.bestTitle ?? '', + ), + routeSettings: const RouteSettings(name: AddShortcutDialog.routeName), + ); + if (result == null) return; + + final name = result.$2; + if (name.isEmpty) return; + + await appService.pinToHomeScreen(name, targetEntry, route: EntryViewerPage.routeName, viewUri: targetEntry.uri); + if (!device.showPinShortcutFeedback) { + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } + } + + Future<void> _flip(BuildContext context, AvesEntry targetEntry) async { + await edit(context, targetEntry, targetEntry.flip); + } + + Future<void> _rotate(BuildContext context, AvesEntry targetEntry, {required bool clockwise}) async { + await edit(context, targetEntry, () => targetEntry.rotate(clockwise: clockwise)); + } + + Future<void> _rotateScreen(BuildContext context) async { + final isPortrait = MediaQuery.orientationOf(context) == Orientation.portrait; + await windowService.requestOrientation(isPortrait ? Orientation.landscape : Orientation.portrait); + } + + Future<void> _delete(BuildContext context, AvesEntry targetEntry) async { + final vault = vaults.getVault(targetEntry.directory); + final enableBin = vault?.useBin ?? settings.enableBin; + + if (enableBin && !targetEntry.trashed) { + await _move(context, targetEntry, moveType: MoveType.toBin); + return; + } + + final l10n = context.l10n; + if (!await showSkippableConfirmationDialog( + context: context, + type: ConfirmationDialog.deleteForever, + message: l10n.deleteEntriesConfirmationDialogMessage(1), + confirmationButtonLabel: l10n.deleteButtonLabel, + )) { + return; + } + + if (!await checkStoragePermission(context, {targetEntry})) return; + + if (!await targetEntry.delete()) { + showFeedback(context, FeedbackType.warn, l10n.genericFailureFeedback); + } else { + final source = context.read<CollectionSource>(); + await source.removeEntries({targetEntry.uri}, includeTrash: true); + EntryDeletedNotification({targetEntry}).dispatch(context); + } + } + + Future<void> _move(BuildContext context, AvesEntry targetEntry, {required MoveType moveType}) => doMove( + context, + moveType: moveType, + entries: {targetEntry}, + ); + + Future<void> _convert(BuildContext context, AvesEntry targetEntry) async { + final options = await showDialog<EntryConvertOptions>( + context: context, + builder: (context) => ConvertEntryDialog(entries: {targetEntry}), + routeSettings: const RouteSettings(name: ConvertEntryDialog.routeName), + ); + if (options == null) return; + + switch (options.action) { + case EntryConvertAction.convert: + await doExport(context, {targetEntry}, options); + case EntryConvertAction.convertMotionPhotoToStillImage: + await _metadataActionDelegate.onActionSelected(context, targetEntry, collection, EntryAction.convertMotionPhotoToStillImage); + } + } + + Future<void> _rename(BuildContext context, AvesEntry targetEntry) async { + final newName = await showDialog<String>( + context: context, + builder: (context) => RenameEntryDialog(entry: targetEntry), + routeSettings: const RouteSettings(name: RenameEntryDialog.routeName), + ); + if (newName == null || newName.isEmpty || newName == targetEntry.filenameWithoutExtension) return; + + // wait for the dialog to hide + await Future.delayed(ADurations.dialogTransitionLoose * timeDilation); + await rename( + context, + entriesToNewName: {targetEntry: '$newName${targetEntry.extension}'}, + persist: _isMainMode(context), + onSuccess: targetEntry.metadataChangeNotifier.notify, + ); + } + + bool _isMainMode(BuildContext context) => context.read<ValueNotifier<AppMode>>().value == AppMode.main; + + void _goToSourceViewer(BuildContext context, AvesEntry targetEntry) { + Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: SourceViewerPage.routeName), + builder: (context) => SourceViewerPage( + loader: () async { + final data = await mediaFetchService.getOriginalBytes(targetEntry); + return utf8.decode(data); + }, + ), + ), + ); + } + + void _goToDebug(BuildContext context, AvesEntry targetEntry) { + Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: ViewerDebugPage.routeName), + builder: (context) => ViewerDebugPage(entry: targetEntry), + ), + ); + } +} diff --git a/lib/widgets/viewer/action/entry_info_action_delegate.dart b/lib/widgets/viewer/action/entry_info_action_delegate.dart new file mode 100644 index 0000000..6c02f38 --- /dev/null +++ b/lib/widgets/viewer/action/entry_info_action_delegate.dart @@ -0,0 +1,287 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/info.dart'; +import 'package:aves/model/entry/extensions/metadata_edition.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/media/geotiff.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/action_mixins/entry_editor.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves/widgets/map/map_page.dart'; +import 'package:aves/widgets/viewer/action/single_entry_editor.dart'; +import 'package:aves/widgets/viewer/debug/debug_page.dart'; +import 'package:aves/widgets/viewer/info/embedded/notifications.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +class EntryInfoActionDelegate with FeedbackMixin, PermissionAwareMixin, EntryEditorMixin, SingleEntryEditorMixin { + final StreamController<ActionEvent<EntryAction>> _eventStreamController = StreamController.broadcast(); + + Stream<ActionEvent<EntryAction>> get eventStream => _eventStreamController.stream; + + bool isVisible({ + required AppMode appMode, + required AvesEntry targetEntry, + required EntryAction action, + }) { + final canWrite = appMode.canEditEntry && !settings.isReadOnly; + switch (action) { + // general + case EntryAction.editDate: + case EntryAction.editLocation: + case EntryAction.editTitleDescription: + case EntryAction.editRating: + case EntryAction.editTags: + case EntryAction.removeMetadata: + return canWrite; + case EntryAction.exportMetadata: + return true; + // GeoTIFF + case EntryAction.showGeoTiffOnMap: + return appMode.canNavigate && targetEntry.isGeotiff; + // motion photo + case EntryAction.convertMotionPhotoToStillImage: + return canWrite && targetEntry.isMotionPhoto; + case EntryAction.viewMotionPhotoVideo: + return appMode.canNavigate && targetEntry.isMotionPhoto; + // debug + case EntryAction.debug: + return !kReleaseMode; + default: + return false; + } + } + + bool canApply(AvesEntry targetEntry, EntryAction action) { + switch (action) { + // general + case EntryAction.rotateCCW: + case EntryAction.rotateCW: + return targetEntry.canRotate; + case EntryAction.flip: + return targetEntry.canFlip; + case EntryAction.editDate: + return targetEntry.canEditDate; + case EntryAction.editLocation: + return targetEntry.canEditLocation; + case EntryAction.editTitleDescription: + return targetEntry.canEditTitleDescription; + case EntryAction.editRating: + return targetEntry.canEditRating; + case EntryAction.editTags: + return targetEntry.canEditTags; + case EntryAction.removeMetadata: + return targetEntry.canEdit && targetEntry.isMetadataRemovalSupported; + case EntryAction.exportMetadata: + return !availability.isLocked; + // GeoTIFF + case EntryAction.showGeoTiffOnMap: + return true; + // motion photo + case EntryAction.convertMotionPhotoToStillImage: + return targetEntry.canEdit && targetEntry.isXmpEditionSupported; + case EntryAction.viewMotionPhotoVideo: + return true; + default: + return false; + } + } + + Future<void> onActionSelected(BuildContext context, AvesEntry targetEntry, CollectionLens? collection, EntryAction action) async { + await reportService.log('$runtimeType handles $action'); + _eventStreamController.add(ActionStartedEvent(action)); + switch (action) { + // general + case EntryAction.editDate: + await _editDate(context, targetEntry, collection); + case EntryAction.editLocation: + await _editLocation(context, targetEntry, collection); + case EntryAction.editTitleDescription: + await _editTitleDescription(context, targetEntry); + case EntryAction.editRating: + await _editRating(context, targetEntry); + case EntryAction.editTags: + await _editTags(context, targetEntry); + case EntryAction.removeMetadata: + await _removeMetadata(context, targetEntry); + case EntryAction.exportMetadata: + await _exportMetadata(context, targetEntry); + // GeoTIFF + case EntryAction.showGeoTiffOnMap: + await _showGeoTiffOnMap(context, targetEntry, collection); + // motion photo + case EntryAction.convertMotionPhotoToStillImage: + await _convertMotionPhotoToStillImage(context, targetEntry); + case EntryAction.viewMotionPhotoVideo: + OpenEmbeddedDataNotification.motionPhotoVideo().dispatch(context); + // debug + case EntryAction.debug: + _goToDebug(context, targetEntry); + default: + break; + } + _eventStreamController.add(ActionEndedEvent(action)); + } + + Future<void> _editDate(BuildContext context, AvesEntry targetEntry, CollectionLens? collection) async { + final modifier = await selectDateModifier(context, {targetEntry}, collection); + if (modifier == null) return; + + await edit(context, targetEntry, () => targetEntry.editDate(modifier)); + } + + Future<void> _editLocation(BuildContext context, AvesEntry targetEntry, CollectionLens? collection) async { + final locationByEntry = await selectLocation(context, {targetEntry}, collection); + if (locationByEntry == null) return; + + if (locationByEntry.containsKey(targetEntry)) { + await edit(context, targetEntry, () => targetEntry.editLocation(locationByEntry[targetEntry])); + } + } + + Future<void> _editTitleDescription(BuildContext context, AvesEntry targetEntry) async { + final modifier = await selectTitleDescriptionModifier(context, {targetEntry}); + if (modifier == null) return; + + await edit(context, targetEntry, () => targetEntry.editTitleDescription(modifier)); + } + + Future<void> _editRating(BuildContext context, AvesEntry targetEntry) async { + final rating = await selectRating(context, {targetEntry}); + if (rating == null) return; + + await quickRate(context, targetEntry, rating); + } + + Future<void> quickRate(BuildContext context, AvesEntry targetEntry, int rating) async { + if (targetEntry.rating == rating) return; + + await edit(context, targetEntry, () => targetEntry.editRating(rating)); + } + + Future<void> _editTags(BuildContext context, AvesEntry targetEntry) async { + final tagsByEntry = await selectTags(context, {targetEntry}); + if (tagsByEntry == null) return; + + final newTags = tagsByEntry[targetEntry] ?? targetEntry.tags; + await _applyTags(context, targetEntry, newTags); + } + + Future<void> quickTag(BuildContext context, AvesEntry targetEntry, CollectionFilter filter) async { + final newTags = { + ...targetEntry.tags, + ...await getTagsFromFilters({filter}, targetEntry), + }; + await _applyTags(context, targetEntry, newTags); + } + + Future<void> _applyTags(BuildContext context, AvesEntry targetEntry, Set<String> newTags) async { + final currentTags = targetEntry.tags; + if (newTags.length == currentTags.length && newTags.every(currentTags.contains)) return; + + await edit(context, targetEntry, () => targetEntry.editTags(newTags)); + } + + Future<void> _removeMetadata(BuildContext context, AvesEntry targetEntry) async { + final types = await selectMetadataToRemove(context, {targetEntry}); + if (types == null) return; + + await edit(context, targetEntry, () => targetEntry.removeMetadata(types)); + } + + Future<void> _exportMetadata(BuildContext context, AvesEntry targetEntry) async { + final lines = <String>[]; + final padding = ' ' * 2; + final titledDirectories = await targetEntry.getMetadataDirectories(context); + titledDirectories.forEach((kv) { + final title = kv.key; + final dir = kv.value; + + lines.add('[$title]'); + final dirContent = dir.allTags; + final tags = dirContent.keys.toList()..sort(); + tags.forEach((tag) { + final value = dirContent[tag]; + lines.add('$padding$tag: $value'); + }); + }); + final metadataString = lines.join('\n'); + + final success = await storageService.createFile( + '${targetEntry.filenameWithoutExtension}-metadata.txt', + MimeTypes.plainText, + Uint8List.fromList(utf8.encode(metadataString)), + ); + if (success != null) { + if (success) { + showFeedback(context, FeedbackType.info, context.l10n.genericSuccessFeedback); + } else { + showFeedback(context, FeedbackType.warn, context.l10n.genericFailureFeedback); + } + } + } + + Future<void> _convertMotionPhotoToStillImage(BuildContext context, AvesEntry targetEntry) async { + final l10n = context.l10n; + + if (!await showConfirmationDialog( + context: context, + message: l10n.genericDangerWarningDialogMessage, + ok: l10n.applyButtonLabel, + )) { + return; + } + + await edit(context, targetEntry, targetEntry.removeTrailerVideo); + } + + Future<void> _showGeoTiffOnMap(BuildContext context, AvesEntry targetEntry, CollectionLens? collection) async { + final info = await metadataFetchService.getGeoTiffInfo(targetEntry); + if (info == null) return; + + final mappedGeoTiff = MappedGeoTiff( + info: info, + entry: targetEntry, + devicePixelRatio: MediaQuery.devicePixelRatioOf(context), + ); + if (!mappedGeoTiff.canOverlay) return; + + final baseCollection = collection; + if (baseCollection == null) return; + + final mapCollection = baseCollection.copyWith( + listenToSource: true, + fixedSelection: baseCollection.sortedEntries.where((entry) => entry.hasGps).where((entry) => entry != targetEntry).toList(), + ); + await Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: MapPage.routeName), + builder: (context) => MapPage( + collection: mapCollection, + overlayEntry: mappedGeoTiff, + ), + ), + ); + } + + void _goToDebug(BuildContext context, AvesEntry targetEntry) { + Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: ViewerDebugPage.routeName), + builder: (context) => ViewerDebugPage(entry: targetEntry), + ), + ); + } +} diff --git a/lib/widgets/viewer/action/printer.dart b/lib/widgets/viewer/action/printer.dart new file mode 100644 index 0000000..2cbf3ad --- /dev/null +++ b/lib/widgets/viewer/action/printer.dart @@ -0,0 +1,131 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/images.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; +import 'package:pdf/pdf.dart'; +import 'package:pdf/widgets.dart' as pdf; +import 'package:printing/printing.dart'; + +class EntryPrinter with FeedbackMixin { + final AvesEntry entry; + + static const _fit = pdf.BoxFit.contain; + + EntryPrinter(this.entry); + + Future<void> print(BuildContext context) async { + final documentName = entry.bestTitle ?? context.l10n.appName; + + final imageWidgets = await _buildImageWidgets(context); + if (imageWidgets.isNotEmpty) { + unawaited( + Printing.layoutPdf( + onLayout: (pageFormat) { + final doc = pdf.Document(title: documentName); + imageWidgets.map((v) => _buildPdfPage(v, pageFormat)).forEach(doc.addPage); + return doc.save(); + }, + name: documentName, + ), + ); + } + } + + pdf.Page _buildPdfPage(pdf.Widget imageWidget, PdfPageFormat pageFormat) { + final displaySize = entry.displaySize; + final pageTheme = pdf.PageTheme( + pageFormat: pageFormat, + orientation: displaySize.aspectRatio < 1 ? pdf.PageOrientation.portrait : pdf.PageOrientation.landscape, + margin: pdf.EdgeInsets.zero, + theme: null, + clip: false, + textDirection: null, + ); + return pdf.Page( + pageTheme: pageTheme, + build: (context) => pdf.FullPage( + ignoreMargins: true, + child: pdf.Center( + child: pdf.Transform.scale( + scale: min(pageFormat.availableWidth / displaySize.width, pageFormat.availableHeight / displaySize.height), + child: pdf.Transform.rotateBox( + angle: 0, + unconstrained: true, + child: imageWidget, + ), + ), + ), + ), + ); + } + + Future<List<pdf.Widget>> _buildImageWidgets(BuildContext context) async { + final widgets = <pdf.Widget>[]; + + if (entry.isMultiPage && !entry.isMotionPhoto) { + final multiPageInfo = await entry.getMultiPageInfo(); + if (multiPageInfo != null) { + final pageCount = multiPageInfo.pageCount; + if (pageCount > 1) { + final streamController = StreamController<AvesEntry>.broadcast(); + unawaited( + showOpReport<AvesEntry>( + context: context, + opStream: streamController.stream, + itemCount: pageCount, + ), + ); + for (var page = 0; page < pageCount; page++) { + final pageEntry = multiPageInfo.getPageEntryByIndex(page); + final widget = await _buildPageImage(context, pageEntry); + if (widget != null) { + widgets.add(widget); + } + streamController.add(pageEntry); + } + await streamController.close(); + } + } + } + + if (widgets.isEmpty) { + final widget = await _buildPageImage(context, entry); + if (widget != null) { + widgets.add(widget); + } + } + + return widgets; + } + + Future<pdf.Widget?> _buildPageImage(BuildContext context, AvesEntry entry) async { + try { + if (entry.isSvg) { + final data = await mediaFetchService.getOriginalBytes(entry); + if (data.isNotEmpty) { + return pdf.SvgImage( + svg: utf8.decode(data), + fit: _fit, + ); + } + } else { + return pdf.Image( + await flutterImageProvider(entry.fullImage), + fit: _fit, + ); + } + } catch (error) { + debugPrint('failed to load image for entry=$entry, error=$error'); + } + showFeedback(context, FeedbackType.warn, context.l10n.genericFailureFeedback); + return null; + } +} diff --git a/lib/widgets/viewer/action/single_entry_editor.dart b/lib/widgets/viewer/action/single_entry_editor.dart new file mode 100644 index 0000000..46adba9 --- /dev/null +++ b/lib/widgets/viewer/action/single_entry_editor.dart @@ -0,0 +1,69 @@ +import 'dart:async'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/catalog.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +mixin SingleEntryEditorMixin on FeedbackMixin, PermissionAwareMixin { + bool _isMainMode(BuildContext context) => context.read<ValueNotifier<AppMode>>().value == AppMode.main; + + Future<void> edit(BuildContext context, AvesEntry targetEntry, Future<Set<EntryDataType>> Function() apply) async { + if (!await checkStoragePermission(context, {targetEntry})) return; + + // check before applying, because it relies on provider + // but the widget tree may be disposed if the user navigated away + final isMainMode = _isMainMode(context); + + final l10n = context.l10n; + final source = context.read<CollectionSource?>(); + source?.pauseMonitoring(); + + final dataTypes = await apply(); + final success = dataTypes.isNotEmpty; + try { + if (success) { + if (isMainMode && source != null) { + Set<String> obsoleteTags = targetEntry.tags; + String? obsoleteCountryCode = targetEntry.addressDetails?.countryCode; + String? obsoleteStateCode = targetEntry.addressDetails?.stateCode; + + await source.refreshEntries({targetEntry}, dataTypes); + + // invalidate filters derived from values before edition + // this invalidation must happen after the source is refreshed, + // otherwise filter chips may eagerly rebuild in between with the old state + if (obsoleteCountryCode != null) { + source.invalidateCountryFilterSummary(countryCodes: {obsoleteCountryCode}); + } + if (obsoleteStateCode != null) { + source.invalidateStateFilterSummary(stateCodes: {obsoleteStateCode}); + } + if (obsoleteTags.isNotEmpty) { + source.invalidateTagFilterSummary(tags: obsoleteTags); + } + } else { + const background = false; + const persist = false; + await targetEntry.refresh(background: background, persist: persist, dataTypes: dataTypes); + await targetEntry.catalog(background: background, force: dataTypes.contains(EntryDataType.catalog), persist: persist); + await targetEntry.locate(background: background, force: dataTypes.contains(EntryDataType.address), geocoderLocale: settings.appliedLocale); + } + showFeedback(context, FeedbackType.info, l10n.genericSuccessFeedback); + } else { + showFeedback(context, FeedbackType.warn, l10n.genericFailureFeedback); + } + } catch (e, stack) { + await reportService.recordError(e, stack); + } + source?.resumeMonitoring(); + } +} diff --git a/lib/widgets/viewer/action/video_action_delegate.dart b/lib/widgets/viewer/action/video_action_delegate.dart new file mode 100644 index 0000000..2de166d --- /dev/null +++ b/lib/widgets/viewer/action/video_action_delegate.dart @@ -0,0 +1,244 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/keys.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/media/enums.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; +import 'package:aves/widgets/common/action_mixins/size_aware.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/video_speed_dialog.dart'; +import 'package:aves/widgets/dialogs/video_stream_selection_dialog.dart'; +import 'package:aves/widgets/settings/video/video_settings_page.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:leak_tracker/leak_tracker.dart'; +import 'package:provider/provider.dart'; + +class VideoActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMixin { + Timer? _overlayHidingTimer; + final CollectionLens? collection; + + VideoActionDelegate({ + required this.collection, + }) { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$VideoActionDelegate', + object: this, + ); + } + } + + void dispose() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + stopOverlayHidingTimer(); + } + + Future<void> onActionSelected(BuildContext context, AvesEntry entry, AvesVideoController controller, EntryAction action) async { + // make sure overlay is not disappearing when selecting an action + stopOverlayHidingTimer(); + const ToggleOverlayNotification(visible: true).dispatch(context); + + switch (action) { + case EntryAction.videoCaptureFrame: + await _captureFrame(context, entry, controller); + case EntryAction.videoToggleMute: + await controller.mute(!controller.isMuted); + case EntryAction.videoSelectStreams: + await _showStreamSelectionDialog(context, controller); + case EntryAction.videoSetSpeed: + await _showSpeedDialog(context, controller); + case EntryAction.videoABRepeat: + controller.toggleABRepeat(); + case EntryAction.videoSettings: + await _showSettings(context, controller); + case EntryAction.videoTogglePlay: + await _togglePlayPause(context, controller); + case EntryAction.videoReplay10: + await controller.seekTo(max(controller.currentPosition - 10000, 0)); + case EntryAction.videoSkip10: + await controller.seekTo(controller.currentPosition + 10000); + case EntryAction.videoShowPreviousFrame: + await controller.skipFrames(-1); + case EntryAction.videoShowNextFrame: + await controller.skipFrames(1); + case EntryAction.openVideoPlayer: + await appService.open(entry.uri, entry.mimeTypeAnySubtype, forceChooser: false).then((success) { + if (!success) showNoMatchingAppDialog(context); + }); + default: + throw UnsupportedError('$action is not a video action'); + } + } + + Future<void> _captureFrame(BuildContext context, AvesEntry entry, AvesVideoController controller) async { + final destinationAlbum = androidFileUtils.avesVideoCapturesPath; + final positionMillis = controller.currentPosition; + final Map<String, dynamic> newFields = {}; + + final bytes = await controller.captureFrame(); + if (bytes != null) { + if (!await checkStoragePermissionForAlbums(context, {destinationAlbum})) return; + + if (!await checkFreeSpace(context, bytes.length, destinationAlbum)) return; + + final rotationDegrees = entry.rotationDegrees; + final dateTimeMillis = entry.catalogMetadata?.dateMillis; + final latLng = entry.latLng; + final exif = { + if (rotationDegrees != 0) 'rotationDegrees': rotationDegrees, + if (dateTimeMillis != null && dateTimeMillis != 0) 'dateTimeMillis': dateTimeMillis, + if (latLng != null) ...{ + 'latitude': latLng.latitude, + 'longitude': latLng.longitude, + }, + }; + + newFields.addAll( + await mediaEditService.captureFrame( + entry, + desiredName: '${entry.bestTitle}_${'$positionMillis'.padLeft(8, '0')}', + exif: exif, + bytes: bytes, + destinationAlbum: destinationAlbum, + nameConflictStrategy: NameConflictStrategy.rename, + ), + ); + } + final success = newFields.isNotEmpty; + + final l10n = context.l10n; + if (success) { + final _collection = collection; + // get navigator beforehand because + // local context may be deactivated when action is triggered after navigation + final navigator = Navigator.maybeOf(context); + final showAction = _collection != null + ? SnackBarAction( + label: l10n.showButtonLabel, + onPressed: () { + if (navigator != null) { + final source = _collection.source; + final newUri = newFields[EntryFields.uri] as String?; + navigator.pushAndRemoveUntil( + MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) => CollectionPage( + source: source, + filters: {StoredAlbumFilter(destinationAlbum, source.getStoredAlbumDisplayName(context, destinationAlbum))}, + highlightTest: (entry) => entry.uri == newUri, + ), + ), + (route) => false, + ); + } + }, + ) + : null; + showFeedback(context, FeedbackType.info, l10n.genericSuccessFeedback, showAction); + } else { + showFeedback(context, FeedbackType.warn, l10n.genericFailureFeedback); + } + } + + Future<void> _showStreamSelectionDialog(BuildContext context, AvesVideoController controller) async { + final streams = controller.streams; + final currentSelectedStreams = await Future.wait(MediaStreamType.values.map(controller.getSelectedStream)); + + final userSelectedStreams = await showDialog<Map<MediaStreamType, MediaStreamSummary?>>( + context: context, + builder: (context) => VideoStreamSelectionDialog( + streams: Map.fromEntries( + streams.map((stream) { + final selectedStream = currentSelectedStreams.nonNulls.firstWhereOrNull((v) => v.type == stream.type); + final selected = selectedStream != null && selectedStream.index == stream.index; + return MapEntry(stream, selected); + }), + ), + ), + routeSettings: const RouteSettings(name: VideoStreamSelectionDialog.routeName), + ); + if (userSelectedStreams == null || userSelectedStreams.isEmpty) return; + + await Future.forEach<MapEntry<MediaStreamType, MediaStreamSummary?>>( + userSelectedStreams.entries, + (kv) => controller.selectStream(kv.key, kv.value), + ); + } + + Future<void> _showSpeedDialog(BuildContext context, AvesVideoController controller) async { + final newSpeed = await showDialog<double>( + context: context, + builder: (context) => VideoSpeedDialog( + current: controller.speed, + min: controller.minSpeed, + max: controller.maxSpeed, + ), + routeSettings: const RouteSettings(name: VideoSpeedDialog.routeName), + ); + if (newSpeed == null) return; + + controller.speed = newSpeed; + } + + Future<void> _showSettings(BuildContext context, AvesVideoController controller) async { + int? resumePosition; + if (controller.isPlaying) { + resumePosition = controller.currentPosition; + await controller.pause(); + } + await Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: VideoSettingsPage.routeName), + builder: (context) => const VideoSettingsPage(), + ), + ); + if (resumePosition != null) { + if (!controller.isReady) { + await controller.seekTo(resumePosition); + } + await controller.play(); + } + } + + Future<void> _togglePlayPause(BuildContext context, AvesVideoController controller) async { + if (!context.mounted) return; + + if (controller.isPlaying) { + await controller.pause(); + } else { + final resumeTimeMillis = await controller.getResumeTime(context); + if (resumeTimeMillis != null) { + await controller.seekTo(resumeTimeMillis); + } else { + await controller.play(); + } + if (context.mounted) { + // hide overlay + _overlayHidingTimer = Timer(context.read<DurationsData>().iconAnimation + ADurations.videoOverlayHideDelay, () { + const ToggleOverlayNotification(visible: false).dispatch(context); + }); + } + } + } + + void stopOverlayHidingTimer() => _overlayHidingTimer?.cancel(); +} diff --git a/lib/widgets/viewer/controls/controller.dart b/lib/widgets/viewer/controls/controller.dart new file mode 100644 index 0000000..54b320a --- /dev/null +++ b/lib/widgets/viewer/controls/controller.dart @@ -0,0 +1,211 @@ +// lib/widgets/viewer/controls/controller.dart + +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; + +// 🔥 CastController rimosso: il viewer non deve più delegare nulla al Cast +// import 'package:aves/widgets/cast/cast_controller.dart'; +// import 'package:aves/widgets/dialogs/cast_dialog.dart'; + +import 'package:aves/widgets/viewer/controls/events.dart'; +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +class ViewerController { + final ValueNotifier<AvesEntry?> entryNotifier = ValueNotifier(null); + final ViewerTransition transition; + final Duration? autopilotInterval; + final bool autopilotAnimatedZoom; + final bool repeat; + + late final ScaleLevel _initialScale; + late final ValueNotifier<bool> _autopilotNotifier; + Timer? _playTimer; + final StreamController _streamController = StreamController.broadcast(); + final Map<TickerProvider, _AutopilotAnimators> _autopilotAnimators = {}; + ScaleLevel? _autopilotInitialScale; + + Stream<dynamic> get _events => _streamController.stream; + + Stream<ViewerShowNextEvent> get showNextCommands => + _events.where((event) => event is ViewerShowNextEvent).cast<ViewerShowNextEvent>(); + + Stream<ViewerOverlayToggleEvent> get overlayCommands => + _events.where((event) => event is ViewerOverlayToggleEvent).cast<ViewerOverlayToggleEvent>(); + + bool get autopilot => _autopilotNotifier.value; + set autopilot(bool enabled) => _autopilotNotifier.value = enabled; + + ScaleLevel get initialScale => _autopilotInitialScale ?? _initialScale; + + // ───────────────────────────────────────────────────────────── + // 🔥 CAST STUB (il viewer non controlla più il Cast) + // ───────────────────────────────────────────────────────────── + + bool get isCasting => false; + + Future<void> initCast(BuildContext context, List<AvesEntry> entries) async { + // no-op + } + + Future<void> initCastWithTarget( + BuildContext context, + List<AvesEntry> entries, + dynamic target, + ) async { + // no-op + } + + Future<void> castEntry(AvesEntry entry) async { + // no-op + } + + Future<void> stopCast() async { + // no-op + } + + // ───────────────────────────────────────────────────────────── + + static final _autopilotScaleTweens = [ + Tween<double>(begin: 1, end: 1.2), + Tween<double>(begin: 1.2, end: 1), + ]; + + ViewerController({ + ScaleLevel initialScale = const ScaleLevel(ref: ScaleReference.contained), + this.transition = ViewerTransition.parallax, + this.repeat = false, + bool autopilot = false, + this.autopilotInterval, + this.autopilotAnimatedZoom = false, + }) { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$ViewerController', + object: this, + ); + } + + _initialScale = initialScale; + entryNotifier.addListener(_onEntryChanged); + + _autopilotNotifier = ValueNotifier(autopilot); + _autopilotNotifier.addListener(_onAutopilotChanged); + _onAutopilotChanged(); + } + + void dispose() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + + // safe no-op + unawaited(stopCast()); + + entryNotifier.removeListener(_onEntryChanged); + windowService.setColorMode(wideColorGamut: false, hdr: false); + + _autopilotNotifier.dispose(); + _clearAutopilotAnimations(); + _stopPlayTimer(); + _streamController.close(); + } + + Future<void> _onEntryChanged() async { + if (await windowService.supportsHdr()) { + await windowService.setColorMode( + wideColorGamut: false, + hdr: entryNotifier.value?.isHdr ?? false, + ); + } + } + + void _onAutopilotChanged() { + _clearAutopilotAnimations(); + _stopPlayTimer(); + + if (autopilot && autopilotInterval != null) { + _playTimer = Timer.periodic( + autopilotInterval!, + (_) => _streamController.add(ViewerShowNextEvent()), + ); + _streamController.add(const ViewerOverlayToggleEvent(visible: false)); + } + } + + void _stopPlayTimer() => _playTimer?.cancel(); + + void _clearAutopilotAnimations() => + _autopilotAnimators.keys.toSet().forEach((v) => stopAutopilotAnimation(vsync: v)); + + void stopAutopilotAnimation({required TickerProvider vsync}) { + final animationController = _autopilotAnimators.remove(vsync); + animationController?.dispose(); + } + + void startAutopilotAnimation({ + required TickerProvider vsync, + required void Function({required ScaleLevel scaleLevel}) onUpdate, + }) { + stopAutopilotAnimation(vsync: vsync); + + if (!autopilot || !autopilotAnimatedZoom) return; + + final scaleLevelRef = _initialScale.ref; + final scaleFactorTween = + _autopilotScaleTweens[Random().nextInt(_autopilotScaleTweens.length)]; + + _autopilotInitialScale = + ScaleLevel(ref: scaleLevelRef, factor: scaleFactorTween.begin!); + + final animationController = AnimationController( + duration: autopilotInterval, + vsync: vsync, + ); + + final animation = CurvedAnimation( + parent: animationController, + curve: Curves.linear, + ); + + animationController.addListener(() { + onUpdate( + scaleLevel: ScaleLevel( + ref: scaleLevelRef, + factor: scaleFactorTween.evaluate(animation), + ), + ); + }); + + _autopilotAnimators[vsync] = _AutopilotAnimators( + controller: animationController, + animation: animation, + ); + + Future.delayed(ADurations.viewerHorizontalPageAnimation) + .then((_) => _autopilotAnimators[vsync]?.controller.forward()); + } +} + +class _AutopilotAnimators { + final AnimationController controller; + final CurvedAnimation animation; + + _AutopilotAnimators({ + required this.controller, + required this.animation, + }); + + void dispose() { + animation.dispose(); + controller.dispose(); + } +} diff --git a/lib/widgets/viewer/controls/events.dart b/lib/widgets/viewer/controls/events.dart new file mode 100644 index 0000000..e39c97e --- /dev/null +++ b/lib/widgets/viewer/controls/events.dart @@ -0,0 +1,11 @@ +import 'package:flutter/foundation.dart'; + +@immutable +class ViewerShowNextEvent {} + +@immutable +class ViewerOverlayToggleEvent { + final bool? visible; + + const ViewerOverlayToggleEvent({required this.visible}); +} diff --git a/lib/widgets/viewer/controls/intents.dart b/lib/widgets/viewer/controls/intents.dart new file mode 100644 index 0000000..66c76de --- /dev/null +++ b/lib/widgets/viewer/controls/intents.dart @@ -0,0 +1,50 @@ +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; + +class ShowPreviousIntent extends Intent { + const ShowPreviousIntent(); +} + +class ShowNextIntent extends Intent { + const ShowNextIntent(); +} + +class LeaveIntent extends Intent { + const LeaveIntent(); +} + +class ShowInfoIntent extends Intent { + const ShowInfoIntent(); +} + +class TvShowLessInfoIntent extends Intent { + const TvShowLessInfoIntent(); +} + +class TvShowMoreInfoIntent extends Intent { + const TvShowMoreInfoIntent(); +} + +class PlayPauseIntent extends Intent { + final TvPlayPauseType type; + + const PlayPauseIntent.play() : type = TvPlayPauseType.play; + + const PlayPauseIntent.pause() : type = TvPlayPauseType.pause; + + const PlayPauseIntent.toggle() : type = TvPlayPauseType.toggle; +} + +enum TvPlayPauseType { + play, + pause, + toggle, +} + +class EntryActionIntent extends Intent { + final EntryAction action; + + const EntryActionIntent({ + required this.action, + }); +} diff --git a/lib/widgets/viewer/controls/notifications.dart b/lib/widgets/viewer/controls/notifications.dart new file mode 100644 index 0000000..29ac67f --- /dev/null +++ b/lib/widgets/viewer/controls/notifications.dart @@ -0,0 +1,141 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/widgets.dart'; + +@immutable +class LockViewNotification extends Notification { + final bool locked; + + const LockViewNotification({required this.locked}); +} + +@immutable +class PopVisualNotification extends Notification {} + +@immutable +class ShowImageNotification extends Notification {} + +@immutable +class ShowInfoPageNotification extends Notification {} + +@immutable +class ShowPreviousEntryNotification extends Notification { + final bool animate; + + const ShowPreviousEntryNotification({required this.animate}); +} + +@immutable +class ShowNextEntryNotification extends Notification { + final bool animate; + + const ShowNextEntryNotification({required this.animate}); +} + +@immutable +class ShowEntryNotification extends Notification { + final bool animate; + final int index; + + const ShowEntryNotification({ + required this.animate, + required this.index, + }); +} + +@immutable +class ShowPreviousVideoNotification extends Notification {} + +@immutable +class ShowNextVideoNotification extends Notification {} + +@immutable +class ToggleOverlayNotification extends Notification { + final bool? visible; + + const ToggleOverlayNotification({this.visible}); +} + +@immutable +class TvShowLessInfoNotification extends Notification {} + +@immutable +class TvShowMoreInfoNotification extends Notification {} + +@immutable +class VideoActionNotification extends Notification { + final AvesVideoController controller; + final AvesEntry entry; + final EntryAction action; + + const VideoActionNotification({ + required this.controller, + required this.entry, + required this.action, + }); +} + +@immutable +class CastNotification extends Notification with EquatableMixin { + final bool enabled; + + @override + List<Object?> get props => [enabled]; + + const CastNotification(this.enabled); +} + +@immutable +class SelectFilterNotification extends Notification with EquatableMixin { + final CollectionFilter filter; + + @override + List<Object?> get props => [filter]; + + const SelectFilterNotification(this.filter); +} + +@immutable +class DecomposeFilterNotification extends Notification with EquatableMixin { + final CollectionFilter filter; + + @override + List<Object?> get props => [filter]; + + const DecomposeFilterNotification(this.filter); +} + +@immutable +class EntryDeletedNotification extends Notification with EquatableMixin { + final Set<AvesEntry> entries; + + @override + List<Object?> get props => [entries]; + + const EntryDeletedNotification(this.entries); +} + +@immutable +class EntryMovedNotification extends Notification with EquatableMixin { + final MoveType moveType; + final Set<AvesEntry> entries; + + @override + List<Object?> get props => [moveType, entries]; + + const EntryMovedNotification(this.moveType, this.entries); +} + +@immutable +class FullImageLoadedNotification extends Notification { + final AvesEntry entry; + final ImageProvider image; + + const FullImageLoadedNotification(this.entry, this.image); +} + +@immutable +class PopupMenuOpenedNotification extends Notification {} diff --git a/lib/widgets/viewer/controls/shortcuts.dart b/lib/widgets/viewer/controls/shortcuts.dart new file mode 100644 index 0000000..4bc5c97 --- /dev/null +++ b/lib/widgets/viewer/controls/shortcuts.dart @@ -0,0 +1,34 @@ +import 'package:aves/widgets/viewer/controls/intents.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; + +class ViewerShortcuts { + static const entryActions = { + SingleActivator(LogicalKeyboardKey.delete): EntryActionIntent(action: EntryAction.delete), + }; + + // cf https://developer.android.com/training/tv/start/controllers#media-events + static const media = { + // KEYCODE_MEDIA_PLAY_PAUSE / 85 / play/pause + SingleActivator(LogicalKeyboardKey.mediaPlayPause): PlayPauseIntent.toggle(), + // KEYCODE_MEDIA_STOP / 86 / stop + SingleActivator(LogicalKeyboardKey.mediaStop): PlayPauseIntent.pause(), + // KEYCODE_MEDIA_NEXT / 87 / skip to next + SingleActivator(LogicalKeyboardKey.mediaTrackNext): ShowNextIntent(), + // KEYCODE_MEDIA_PREVIOUS / 88 / skip to previous + SingleActivator(LogicalKeyboardKey.mediaTrackPrevious): ShowPreviousIntent(), + // KEYCODE_MEDIA_PLAY / 126 / play + SingleActivator(LogicalKeyboardKey.mediaPlay): PlayPauseIntent.play(), + // KEYCODE_MEDIA_PAUSE / 127 / pause + SingleActivator(LogicalKeyboardKey.mediaPause): PlayPauseIntent.pause(), + // KEYCODE_BUTTON_L1 / 102 / skip to previous + SingleActivator(LogicalKeyboardKey.gameButtonLeft1): ShowPreviousIntent(), + // KEYCODE_BUTTON_R1 / 103 / skip to next + SingleActivator(LogicalKeyboardKey.gameButtonRight1): ShowNextIntent(), + // KEYCODE_BUTTON_START / 108 / pause + SingleActivator(LogicalKeyboardKey.gameButtonStart): PlayPauseIntent.pause(), + // KEYCODE_BUTTON_SELECT / 109 / play/pause + SingleActivator(LogicalKeyboardKey.gameButtonSelect): PlayPauseIntent.toggle(), + }; +} diff --git a/lib/widgets/viewer/controls/transitions.dart b/lib/widgets/viewer/controls/transitions.dart new file mode 100644 index 0000000..2606486 --- /dev/null +++ b/lib/widgets/viewer/controls/transitions.dart @@ -0,0 +1,75 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +class PageTransitionEffects { + static TransitionBuilder fade( + PageController pageController, + int index, { + required bool zoomIn, + }) => (context, child) { + double opacity = 0; + double dx = 0; + double scale = 1; + if (pageController.hasClients && pageController.position.haveDimensions) { + final position = (pageController.page! - index).clamp(-1.0, 1.0); + final width = pageController.position.viewportDimension; + opacity = (1 - position.abs()).clamp(0, 1); + dx = position * width * (context.isRtl ? -1 : 1); + if (zoomIn) { + scale = 1 + position; + } + } + return Opacity( + opacity: opacity, + child: Transform.translate( + offset: Offset(dx, 0), + child: Transform.scale( + scale: scale, + child: child, + ), + ), + ); + }; + + static TransitionBuilder slide( + PageController pageController, + int index, { + required bool parallax, + }) => (context, child) { + double dx = 0; + if (pageController.hasClients && pageController.position.haveDimensions) { + final position = (pageController.page! - index).clamp(-1.0, 1.0); + final width = pageController.position.viewportDimension; + if (parallax) { + dx = position * width / 2 * (context.isRtl ? -1 : 1); + } + } + return ClipRect( + child: Transform.translate( + offset: Offset(dx, 0), + child: child, + ), + ); + }; + + static TransitionBuilder none( + PageController pageController, + int index, + ) => (context, child) { + double opacity = 0; + double dx = 0; + if (pageController.hasClients && pageController.position.haveDimensions) { + final position = (pageController.page! - index).clamp(-1.0, 1.0); + final width = pageController.position.viewportDimension; + opacity = (1 - position.abs()).roundToDouble().clamp(0, 1); + dx = position * width * (context.isRtl ? -1 : 1); + } + return Opacity( + opacity: opacity, + child: Transform.translate( + offset: Offset(dx, 0), + child: child, + ), + ); + }; +} diff --git a/lib/widgets/viewer/debug/db.dart b/lib/widgets/viewer/debug/db.dart new file mode 100644 index 0000000..c0dfe4c --- /dev/null +++ b/lib/widgets/viewer/debug/db.dart @@ -0,0 +1,206 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/metadata/address.dart'; +import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/metadata/trash.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/viewer/video_playback.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class DbTab extends StatefulWidget { + final AvesEntry entry; + + const DbTab({ + super.key, + required this.entry, + }); + + @override + State<DbTab> createState() => _DbTabState(); +} + +class _DbTabState extends State<DbTab> { + late Future<int?> _dbDateLoader; + late Future<AvesEntry?> _dbEntryLoader; + late Future<CatalogMetadata?> _dbMetadataLoader; + late Future<AddressDetails?> _dbAddressLoader; + late Future<TrashDetails?> _dbTrashDetailsLoader; + late Future<VideoPlaybackRow?> _dbVideoPlaybackLoader; + + AvesEntry get entry => widget.entry; + + @override + void initState() { + super.initState(); + _loadDatabase(); + } + + void _loadDatabase() { + final id = entry.id; + _dbDateLoader = localMediaDb.loadDates().then((values) => values[id]); + _dbEntryLoader = localMediaDb.loadEntriesById({id}).then((values) => values.firstOrNull); + _dbMetadataLoader = localMediaDb.loadCatalogMetadata().then((values) => values.firstWhereOrNull((row) => row.id == id)); + _dbAddressLoader = localMediaDb.loadAddresses().then((values) => values.firstWhereOrNull((row) => row.id == id)); + _dbTrashDetailsLoader = localMediaDb.loadAllTrashDetails().then((values) => values.firstWhereOrNull((row) => row.id == id)); + _dbVideoPlaybackLoader = localMediaDb.loadVideoPlayback(id); + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return ListView( + padding: const EdgeInsets.all(16), + children: [ + FutureBuilder<int?>( + future: _dbDateLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final data = snapshot.data; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('DB date:${data == null ? ' no row' : ''}'), + if (data != null) + InfoRowGroup( + info: { + 'dateMillis': '$data', + }, + ), + ], + ); + }, + ), + const SizedBox(height: 16), + FutureBuilder<AvesEntry?>( + future: _dbEntryLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final data = snapshot.data; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('DB entry:${data == null ? ' no row' : ''}'), + if (data != null) ...[ + ElevatedButton( + onPressed: () async { + final source = context.read<CollectionSource>(); + await source.removeEntries({entry.uri}, includeTrash: true); + }, + child: const Text('Untrack entry'), + ), + ElevatedButton( + onPressed: () async { + final duplicates = {entry.copyWith(id: localMediaDb.nextId)}; + final source = context.read<CollectionSource>(); + source.addEntries(duplicates); + await localMediaDb.insertEntries(duplicates); + }, + child: const Text('Duplicate entry'), + ), + InfoRowGroup( + info: Map.fromEntries(data.toDatabaseMap().entries.map((kv) => MapEntry(kv.key, kv.value?.toString() ?? ''))), + ), + ], + ], + ); + }, + ), + const SizedBox(height: 16), + FutureBuilder<CatalogMetadata?>( + future: _dbMetadataLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final data = snapshot.data; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('DB metadata:${data == null ? ' no row' : ''}'), + if (data != null) + InfoRowGroup( + info: Map.fromEntries(data.toMap().entries.map((kv) => MapEntry(kv.key, kv.value?.toString() ?? ''))), + ), + ], + ); + }, + ), + const SizedBox(height: 16), + FutureBuilder<AddressDetails?>( + future: _dbAddressLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final data = snapshot.data; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('DB address:${data == null ? ' no row' : ''}'), + if (data != null) + InfoRowGroup( + info: Map.fromEntries(data.toMap().entries.map((kv) => MapEntry(kv.key, kv.value?.toString() ?? ''))), + ), + ], + ); + }, + ), + const SizedBox(height: 16), + FutureBuilder<TrashDetails?>( + future: _dbTrashDetailsLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final data = snapshot.data; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('DB trash details:${data == null ? ' no row' : ''}'), + if (data != null) ...[ + ElevatedButton( + onPressed: () async { + entry.trashDetails = null; + await localMediaDb.updateTrash(entry.id, entry.trashDetails); + _loadDatabase(); + }, + child: const Text('Remove details'), + ), + InfoRowGroup( + info: { + 'dateMillis': '${data.dateMillis}', + 'path': data.path, + }, + ), + ], + ], + ); + }, + ), + const SizedBox(height: 16), + FutureBuilder<VideoPlaybackRow?>( + future: _dbVideoPlaybackLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final data = snapshot.data; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('DB video playback:${data == null ? ' no row' : ''}'), + if (data != null) + InfoRowGroup( + info: { + 'resumeTimeMillis': '${data.resumeTimeMillis}', + }, + ), + ], + ); + }, + ), + ], + ); + } +} diff --git a/lib/widgets/viewer/debug/debug_page.dart b/lib/widgets/viewer/debug/debug_page.dart new file mode 100644 index 0000000..4cd3475 --- /dev/null +++ b/lib/widgets/viewer/debug/debug_page.dart @@ -0,0 +1,192 @@ +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/favourites.dart'; +import 'package:aves/model/entry/extensions/images.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/viewer/debug/db.dart'; +import 'package:aves/widgets/viewer/debug/metadata.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ViewerDebugPage extends StatelessWidget { + static const routeName = '/viewer/debug'; + + final AvesEntry entry; + + const ViewerDebugPage({ + super.key, + required this.entry, + }); + + @override + Widget build(BuildContext context) { + final tabs = <(Tab, Widget)>[ + (const Tab(text: 'Entry'), _buildEntryTabView()), + if (context.select<ValueNotifier<AppMode>, bool>((vn) => vn.value != AppMode.view)) (const Tab(text: 'DB'), DbTab(entry: entry)), + (const Tab(icon: Icon(AIcons.android)), MetadataTab(entry: entry)), + (const Tab(icon: Icon(AIcons.image)), _buildThumbnailsTabView()), + ]; + return Directionality( + textDirection: TextDirection.ltr, + child: DefaultTabController( + length: tabs.length, + child: Scaffold( + appBar: AppBar( + title: const Text('Debug'), + bottom: TabBar( + tabs: tabs.map((t) => t.$1).toList(), + ), + ), + body: SafeArea( + child: TabBarView( + children: tabs.map((t) => t.$2).toList(), + ), + ), + ), + ), + ); + } + + Widget _buildEntryTabView() { + String toDateValue(int? time, {int factor = 1}) { + var value = '$time'; + if (time != null && time > 0) { + try { + value += ' (${DateTime.fromMillisecondsSinceEpoch(time * factor)})'; + } catch (error) { + value += ' (invalid DateTime})'; + } + } + return value; + } + + return ListView( + padding: const EdgeInsets.all(16), + children: [ + InfoRowGroup( + info: { + 'hash': '#${shortHash(entry)}', + 'id': '${entry.id}', + 'origin': '${entry.origin}', + 'contentId': '${entry.contentId}', + 'uri': entry.uri, + 'path': entry.path ?? '', + 'directory': entry.directory ?? '', + 'filenameWithoutExtension': entry.filenameWithoutExtension ?? '', + 'extension': entry.extension ?? '', + 'sourceTitle': entry.sourceTitle ?? '', + 'sourceMimeType': entry.sourceMimeType, + 'mimeType': entry.mimeType, + 'isMissingAtPath': '${entry.isMissingAtPath}', + }, + ), + const Divider(), + InfoRowGroup( + info: { + 'trashed': '${entry.trashed}', + 'trashPath': '${entry.trashDetails?.path}', + 'trashDateMillis': '${entry.trashDetails?.dateMillis}', + }, + ), + const Divider(), + InfoRowGroup( + info: { + 'catalogDateMillis': toDateValue(entry.catalogDateMillis), + 'dateAddedSecs': toDateValue(entry.dateAddedSecs, factor: 1000), + 'dateModifiedMillis': toDateValue(entry.dateModifiedMillis), + 'sourceDateTakenMillis': toDateValue(entry.sourceDateTakenMillis), + 'bestDate': '${entry.bestDate}', + }, + ), + const Divider(), + InfoRowGroup( + info: { + 'width': '${entry.width}', + 'height': '${entry.height}', + 'sourceRotationDegrees': '${entry.sourceRotationDegrees}', + 'rotationDegrees': '${entry.rotationDegrees}', + 'isRotated': '${entry.isRotated}', + 'isFlipped': '${entry.isFlipped}', + 'displayAspectRatio': '${entry.displayAspectRatio}', + 'displaySize': '${entry.displaySize.width}x${entry.displaySize.height}', + }, + ), + const Divider(), + InfoRowGroup( + info: { + 'durationMillis': '${entry.durationMillis}', + 'durationText': entry.durationText, + }, + ), + const Divider(), + InfoRowGroup( + info: { + 'sizeBytes': '${entry.sizeBytes}', + 'isFavourite': '${entry.isFavourite}', + 'isSvg': '${entry.isSvg}', + 'isVideo': '${entry.isVideo}', + 'isCatalogued': '${entry.isCatalogued}', + 'is360': '${entry.is360}', + 'isAnimated': '${entry.isAnimated}', + 'isGeotiff': '${entry.isGeotiff}', + 'isHdr': '${entry.isHdr}', + 'isMultiPage': '${entry.isMultiPage}', + 'isMotionPhoto': '${entry.isMotionPhoto}', + 'canEdit': '${entry.canEdit}', + 'canEditDate': '${entry.canEditDate}', + 'canEditTags': '${entry.canEditTags}', + 'canRotate': '${entry.canRotate}', + 'canFlip': '${entry.canFlip}', + 'tags': '${entry.tags}', + }, + ), + const Divider(), + InfoRowGroup( + info: { + 'hasGps': '${entry.hasGps}', + 'hasAddress': '${entry.hasAddress}', + 'hasFineAddress': '${entry.hasFineAddress}', + 'latLng': '${entry.latLng}', + }, + ), + ], + ); + } + + Widget _buildThumbnailsTabView() { + return ListView( + padding: const EdgeInsets.all(16), + children: entry.cachedThumbnails + .expand( + (provider) => [ + Text('Thumb extent: ${provider.key.extent}'), + Center( + child: Image( + image: provider, + frameBuilder: (context, child, frame, wasSynchronouslyLoaded) { + return Container( + foregroundDecoration: const BoxDecoration( + border: Border.fromBorderSide( + BorderSide( + color: Colors.amber, + width: .1, + ), + ), + ), + child: child, + ); + }, + ), + ), + const SizedBox(height: 16), + ], + ) + .toList(), + ); + } +} diff --git a/lib/widgets/viewer/debug/metadata.dart b/lib/widgets/viewer/debug/metadata.dart new file mode 100644 index 0000000..c4b0a1f --- /dev/null +++ b/lib/widgets/viewer/debug/metadata.dart @@ -0,0 +1,184 @@ +import 'dart:collection'; +import 'dart:typed_data'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/android_debug_service.dart'; +import 'package:aves/services/geocoding_service.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:flutter/material.dart'; + +class MetadataTab extends StatefulWidget { + final AvesEntry entry; + + const MetadataTab({ + super.key, + required this.entry, + }); + + @override + State<MetadataTab> createState() => _MetadataTabState(); +} + +class _MetadataTabState extends State<MetadataTab> { + late Future<Map> _bitmapFactoryLoader, _contentResolverMetadataLoader, _exifInterfaceMetadataLoader; + late Future<Map> _mediaMetadataLoader, _metadataExtractorLoader, _pixyMetaLoader, _tiffStructureLoader, _addressLoader; + late Future<String?> _mp4ParserDumpLoader; + + // MediaStore timestamp keys + static const secondTimestampKeys = ['date_added', 'date_modified', 'date_expires', 'isPlayed']; + static const millisecondTimestampKeys = ['datetaken', 'datetime']; + + AvesEntry get entry => widget.entry; + + @override + void initState() { + super.initState(); + _loadMetadata(); + } + + void _loadMetadata() { + _bitmapFactoryLoader = AndroidDebugService.getBitmapFactoryInfo(entry); + _contentResolverMetadataLoader = AndroidDebugService.getContentResolverMetadata(entry); + _exifInterfaceMetadataLoader = AndroidDebugService.getExifInterfaceMetadata(entry); + _mediaMetadataLoader = AndroidDebugService.getMediaMetadataRetrieverMetadata(entry); + _metadataExtractorLoader = AndroidDebugService.getMetadataExtractorSummary(entry); + _mp4ParserDumpLoader = AndroidDebugService.getMp4ParserDump(entry); + _pixyMetaLoader = AndroidDebugService.getPixyMetadata(entry); + _tiffStructureLoader = AndroidDebugService.getTiffStructure(entry); + _addressLoader = entry.hasGps + ? GeocodingService.getAddress(entry.latLng!, settings.appliedLocale).then((addresses) { + if (addresses.isNotEmpty) { + final address = addresses.first; + return { + 'addressLine': address.addressLine, + 'adminArea': address.adminArea, + 'countryCode': address.countryCode, + 'countryName': address.countryName, + 'featureName': address.featureName, + 'locality': address.locality, + 'postalCode': address.postalCode, + 'subAdminArea': address.subAdminArea, + 'subLocality': address.subLocality, + 'subThoroughfare': address.subThoroughfare, + 'thoroughfare': address.thoroughfare, + }; + } + return {}; + }) + : Future.value({}); + setState(() {}); + } + + @override + Widget build(BuildContext context) { + Widget builderFromSnapshotData(BuildContext context, Map snapshotData, String title) { + final data = SplayTreeMap.of( + snapshotData.map((k, v) { + final key = k.toString(); + var value = v?.toString() ?? 'null'; + if ([...secondTimestampKeys, ...millisecondTimestampKeys].contains(key) && v is int && v != 0) { + if (secondTimestampKeys.contains(key)) { + v *= 1000; + } + try { + value += ' (${DateTime.fromMillisecondsSinceEpoch(v)})'; + } catch (error) { + value += ' (invalid DateTime})'; + } + } + if (key == 'xmp' && v != null && v is Uint8List) { + value = String.fromCharCodes(v); + } + return MapEntry(key, value); + }), + ); + return AvesExpansionTile( + title: title, + children: [ + if (data.isNotEmpty) + Padding( + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), + child: InfoRowGroup(info: data), + ), + ], + ); + } + + Widget builderFromSnapshot(BuildContext context, AsyncSnapshot<Map> snapshot, String title) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + return builderFromSnapshotData(context, snapshot.data!, title); + } + + return ListView( + padding: const EdgeInsets.all(8), + children: [ + FutureBuilder<Map>( + future: _bitmapFactoryLoader, + builder: (context, snapshot) => builderFromSnapshot(context, snapshot, 'Bitmap Factory'), + ), + FutureBuilder<Map>( + future: _contentResolverMetadataLoader, + builder: (context, snapshot) => builderFromSnapshot(context, snapshot, 'Content Resolver'), + ), + FutureBuilder<Map>( + future: _exifInterfaceMetadataLoader, + builder: (context, snapshot) => builderFromSnapshot(context, snapshot, 'Exif Interface'), + ), + FutureBuilder<Map>( + future: _mediaMetadataLoader, + builder: (context, snapshot) => builderFromSnapshot(context, snapshot, 'Media Metadata Retriever'), + ), + FutureBuilder<Map>( + future: _metadataExtractorLoader, + builder: (context, snapshot) => builderFromSnapshot(context, snapshot, 'Metadata Extractor'), + ), + FutureBuilder<String?>( + future: _mp4ParserDumpLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final data = snapshot.data?.trim(); + return AvesExpansionTile( + title: 'MP4 Parser', + children: [ + if (data != null && data.isNotEmpty) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: SelectableText(data), + ), + ), + ], + ); + }, + ), + FutureBuilder<Map>( + future: _pixyMetaLoader, + builder: (context, snapshot) => builderFromSnapshot(context, snapshot, 'Pixy Meta'), + ), + if (entry.mimeType == MimeTypes.tiff) + FutureBuilder<Map>( + future: _tiffStructureLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: snapshot.data!.entries.map((kv) => builderFromSnapshotData(context, kv.value as Map, 'TIFF ${kv.key}')).toList(), + ); + }, + ), + FutureBuilder<Map>( + future: _addressLoader, + builder: (context, snapshot) => builderFromSnapshot(context, snapshot, 'Address'), + ), + ], + ); + } +} diff --git a/lib/widgets/viewer/entry_horizontal_pager.dart b/lib/widgets/viewer/entry_horizontal_pager.dart new file mode 100644 index 0000000..7ba47aa --- /dev/null +++ b/lib/widgets/viewer/entry_horizontal_pager.dart @@ -0,0 +1,189 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/settings/enums/viewer_transition.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/widgets/viewer/controls/controller.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves/widgets/viewer/multipage/conductor.dart'; +import 'package:aves/widgets/viewer/page_entry_builder.dart'; +import 'package:aves/widgets/viewer/visual/entry_page_view.dart'; +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class MultiEntryScroller extends StatefulWidget { + final CollectionLens collection; + final ViewerController viewerController; + final PageController pageController; + final ValueChanged<int> onPageChanged; + final void Function(AvesEntry mainEntry, AvesEntry? pageEntry) onViewDisposed; + + const MultiEntryScroller({ + super.key, + required this.collection, + required this.viewerController, + required this.pageController, + required this.onPageChanged, + required this.onViewDisposed, + }); + + @override + State<StatefulWidget> createState() => _MultiEntryScrollerState(); +} + +class _MultiEntryScrollerState extends State<MultiEntryScroller> with AutomaticKeepAliveClientMixin { + List<AvesEntry> get entries => widget.collection.sortedEntries; + + ViewerController get viewerController => widget.viewerController; + + PageController get pageController => widget.pageController; + + @override + Widget build(BuildContext context) { + super.build(context); + + return MagnifierGestureDetectorScope( + axis: const [Axis.horizontal, Axis.vertical], + child: NotificationListener( + onNotification: _handleNotification, + child: PageView.builder( + // key is expected by test driver + key: const Key('horizontal-pageview'), + scrollDirection: Axis.horizontal, + controller: pageController, + physics: MagnifierScrollerPhysics( + gestureSettings: MediaQuery.gestureSettingsOf(context), + parent: const BouncingScrollPhysics(), + ), + onPageChanged: widget.onPageChanged, + itemBuilder: (context, index) { + final mainEntry = entries[index % entries.length]; + + final child = mainEntry.isMultiPage + ? PageEntryBuilder( + multiPageController: context.read<MultiPageConductor>().getController(mainEntry), + builder: (pageEntry) => _buildViewer(mainEntry, pageEntry: pageEntry), + ) + : _buildViewer(mainEntry); + + return Selector<Settings, bool>( + selector: (context, s) => s.animate, + builder: (context, animate, child) { + if (!animate) return child!; + return AnimatedBuilder( + animation: pageController, + builder: viewerController.transition.builder(pageController, index), + child: child, + ); + }, + child: child, + ); + }, + itemCount: viewerController.repeat ? null : entries.length, + ), + ), + ); + } + + Widget _buildViewer(AvesEntry mainEntry, {AvesEntry? pageEntry}) { + return EntryPageView( + // key is expected by test driver + key: const Key('image_view'), + mainEntry: mainEntry, + pageEntry: pageEntry ?? mainEntry, + viewerController: viewerController, + onDisposed: () => widget.onViewDisposed(mainEntry, pageEntry), + ); + } + + bool _handleNotification(dynamic notification) { + if (notification is ShowPreviousVideoNotification) { + _showPreviousVideo(); + } else if (notification is ShowNextVideoNotification) { + _showNextVideo(); + } else { + return false; + } + return true; + } + + void _showPreviousVideo() { + final currentIndex = pageController.page?.round(); + if (currentIndex != null) { + final previousVideoEntry = entries.take(currentIndex).lastWhereOrNull((entry) => entry.isVideo); + if (previousVideoEntry != null) { + final previousIndex = entries.indexOf(previousVideoEntry); + if (previousIndex != -1) { + ShowEntryNotification(animate: false, index: previousIndex).dispatch(context); + } + } + } + } + + void _showNextVideo() { + final currentIndex = pageController.page?.round(); + if (currentIndex != null) { + final nextVideoEntry = entries.skip(currentIndex + 1).firstWhereOrNull((entry) => entry.isVideo); + if (nextVideoEntry != null) { + final nextIndex = entries.indexOf(nextVideoEntry); + if (nextIndex != -1) { + ShowEntryNotification(animate: false, index: nextIndex).dispatch(context); + } + } + } + } + + @override + bool get wantKeepAlive => true; +} + +class SingleEntryScroller extends StatefulWidget { + final AvesEntry entry; + final ViewerController viewerController; + + const SingleEntryScroller({ + super.key, + required this.entry, + required this.viewerController, + }); + + @override + State<StatefulWidget> createState() => _SingleEntryScrollerState(); +} + +class _SingleEntryScrollerState extends State<SingleEntryScroller> with AutomaticKeepAliveClientMixin { + AvesEntry get mainEntry => widget.entry; + + ViewerController get viewerController => widget.viewerController; + + @override + Widget build(BuildContext context) { + super.build(context); + + var child = mainEntry.isMultiPage + ? PageEntryBuilder( + multiPageController: context.read<MultiPageConductor>().getController(mainEntry), + builder: (pageEntry) => _buildViewer(pageEntry: pageEntry), + ) + : _buildViewer(); + + return MagnifierGestureDetectorScope( + axis: const [Axis.vertical], + child: child, + ); + } + + Widget _buildViewer({AvesEntry? pageEntry}) { + return EntryPageView( + mainEntry: mainEntry, + pageEntry: pageEntry ?? mainEntry, + viewerController: widget.viewerController, + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/widgets/viewer/entry_vertical_pager.dart b/lib/widgets/viewer/entry_vertical_pager.dart new file mode 100644 index 0000000..cf724c9 --- /dev/null +++ b/lib/widgets/viewer/entry_vertical_pager.dart @@ -0,0 +1,425 @@ +import 'dart:async'; +import 'dart:math'; +import 'dart:ui'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/catalog.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves/widgets/common/behaviour/springy_scroll_physics.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves/widgets/viewer/action/entry_action_delegate.dart'; +import 'package:aves/widgets/viewer/controls/controller.dart'; +import 'package:aves/widgets/viewer/controls/intents.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves/widgets/viewer/controls/shortcuts.dart'; +import 'package:aves/widgets/viewer/entry_horizontal_pager.dart'; +import 'package:aves/widgets/viewer/info/info_page.dart'; +import 'package:aves/widgets/viewer/multipage/conductor.dart'; +import 'package:aves/widgets/viewer/video/conductor.dart'; +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; + +class ViewerVerticalPageView extends StatefulWidget { + final CollectionLens? collection; + final ValueNotifier<AvesEntry?> entryNotifier; + final ViewerController viewerController; + final Animation<double> overlayOpacity; + final PageController verticalPager, horizontalPager; + final void Function(int page) onVerticalPageChanged, onHorizontalPageChanged; + final VoidCallback onImagePageRequested; + final void Function(AvesEntry mainEntry, AvesEntry? pageEntry) onViewDisposed; + + // critically damped spring (ratio = 1) a bit stiffer than `ScrollPhysics._kDefaultSpring` + static final spring = SpringDescription.withDampingRatio( + mass: 0.5, + stiffness: 140.0, + ratio: 1.0, + ); + + const ViewerVerticalPageView({ + super.key, + required this.collection, + required this.entryNotifier, + required this.viewerController, + required this.overlayOpacity, + required this.verticalPager, + required this.horizontalPager, + required this.onVerticalPageChanged, + required this.onHorizontalPageChanged, + required this.onImagePageRequested, + required this.onViewDisposed, + }); + + @override + State<ViewerVerticalPageView> createState() => _ViewerVerticalPageViewState(); +} + +class _ViewerVerticalPageViewState extends State<ViewerVerticalPageView> { + final Set<StreamSubscription> _subscriptions = {}; + final ValueNotifier<double> _backgroundOpacityNotifier = ValueNotifier(1); + final ValueNotifier<bool> _isVerticallyScrollingNotifier = ValueNotifier(false); + final ValueNotifier<bool> _isImageFocusedNotifier = ValueNotifier(true); + Timer? _verticalScrollMonitoringTimer; + AvesEntry? _oldEntry; + Future<double>? _systemBrightness; + + CollectionLens? get collection => widget.collection; + + bool get hasCollection => collection != null; + + AvesEntry? get entry => widget.entryNotifier.value; + + PageController get verticalPager => widget.verticalPager; + + PageController get horizontalPager => widget.horizontalPager; + + static const double maximumBrightness = 1.0; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + + if (settings.maxBrightness == MaxBrightness.viewerOnly) { + _systemBrightness = AvesApp.screenBrightness?.system; + } + } + + @override + void didUpdateWidget(covariant ViewerVerticalPageView oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + _stopScrollMonitoringTimer(); + _backgroundOpacityNotifier.dispose(); + _isVerticallyScrollingNotifier.dispose(); + _isImageFocusedNotifier.dispose(); + super.dispose(); + } + + void _registerWidget(ViewerVerticalPageView widget) { + _subscriptions.add( + widget.viewerController.showNextCommands.listen((event) { + _goToHorizontalPage(1, animate: true); + }), + ); + _subscriptions.add( + widget.viewerController.overlayCommands.listen((event) { + ToggleOverlayNotification(visible: event.visible).dispatch(context); + }), + ); + widget.verticalPager.addListener(_onVerticalPageControllerChanged); + widget.entryNotifier.addListener(_onEntryChanged); + if (_oldEntry != entry) _onEntryChanged(); + } + + void _unregisterWidget(ViewerVerticalPageView widget) { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + widget.verticalPager.removeListener(_onVerticalPageControllerChanged); + widget.entryNotifier.removeListener(_onEntryChanged); + _oldEntry?.visualChangeNotifier.removeListener(_onVisualChanged); + } + + @override + Widget build(BuildContext context) { + // fake page for opacity transition between collection and viewer + const transitionPage = SizedBox(); + + final pages = [ + transitionPage, + _buildImagePage(), + ]; + + final appMode = context.read<ValueNotifier<AppMode>>().value; + if (!{AppMode.screenSaver, AppMode.slideshow}.contains(appMode)) { + final infoPage = NotificationListener<ShowImageNotification>( + onNotification: (notification) { + widget.onImagePageRequested(); + return true; + }, + child: AnimatedBuilder( + animation: verticalPager, + builder: (context, child) { + return Visibility( + visible: verticalPager.page! > 1, + child: child!, + ); + }, + child: FocusScope( + child: InfoPage( + collection: collection, + entryNotifier: widget.entryNotifier, + isScrollingNotifier: _isVerticallyScrollingNotifier, + ), + ), + ), + ); + + pages.add(infoPage); + } + + return ValueListenableBuilder<double>( + valueListenable: _backgroundOpacityNotifier, + builder: (context, backgroundOpacity, child) { + return ValueListenableBuilder<double>( + valueListenable: widget.overlayOpacity, + builder: (context, overlayOpacity, child) { + final background = Theme.of(context).isDark ? Colors.black : Color.lerp(Colors.black, Colors.white, overlayOpacity)!; + return Container( + color: background.withValues(alpha: backgroundOpacity), + child: child, + ); + }, + child: child, + ); + }, + child: PageView( + // key is expected by test driver + key: const Key('vertical-pageview'), + scrollDirection: Axis.vertical, + controller: verticalPager, + physics: MagnifierScrollerPhysics( + gestureSettings: MediaQuery.gestureSettingsOf(context), + parent: SpringyScrollPhysics( + spring: ViewerVerticalPageView.spring, + ), + ), + onPageChanged: widget.onVerticalPageChanged, + children: pages, + ), + ); + } + + Widget _buildImagePage() { + final useTvLayout = settings.useTvLayout; + + Map<ShortcutActivator, Intent>? shortcuts = { + ...ViewerShortcuts.entryActions, + ...ViewerShortcuts.media, + const SingleActivator(LogicalKeyboardKey.arrowUp): useTvLayout ? const TvShowLessInfoIntent() : const LeaveIntent(), + const SingleActivator(LogicalKeyboardKey.arrowDown): useTvLayout ? const TvShowMoreInfoIntent() : const ShowInfoIntent(), + }; + + Widget? child; + if (hasCollection) { + shortcuts.addAll(const { + SingleActivator(LogicalKeyboardKey.arrowLeft): ShowPreviousIntent(), + SingleActivator(LogicalKeyboardKey.arrowRight): ShowNextIntent(), + }); + child = MultiEntryScroller( + collection: collection!, + viewerController: widget.viewerController, + pageController: horizontalPager, + onPageChanged: widget.onHorizontalPageChanged, + onViewDisposed: widget.onViewDisposed, + ); + } else if (entry != null) { + child = SingleEntryScroller( + viewerController: widget.viewerController, + entry: entry!, + ); + } + if (child != null) { + if (settings.useTvLayout) { + child = ValueListenableBuilder<bool>( + valueListenable: _isImageFocusedNotifier, + builder: (context, isImageFocused, child) { + return AnimatedScale( + scale: isImageFocused ? 1 : .6, + curve: Curves.fastOutSlowIn, + duration: context.select<DurationsData, Duration>((v) => v.tvImageFocusAnimation), + child: child!, + ); + }, + child: child, + ); + } + + // handle mouse wheel to jump to previous/next item + child = Listener( + onPointerSignal: _onPointerSignal, + child: child, + ); + + return FocusableActionDetector( + autofocus: true, + shortcuts: shortcuts, + actions: { + ShowPreviousIntent: CallbackAction<Intent>(onInvoke: (intent) => _goToHorizontalPage(-1, animate: false)), + ShowNextIntent: CallbackAction<Intent>(onInvoke: (intent) => _goToHorizontalPage(1, animate: false)), + LeaveIntent: CallbackAction<Intent>(onInvoke: (intent) => Navigator.maybeOf(context)?.pop()), + ShowInfoIntent: CallbackAction<Intent>(onInvoke: (intent) => ShowInfoPageNotification().dispatch(context)), + TvShowLessInfoIntent: CallbackAction<Intent>(onInvoke: (intent) => TvShowLessInfoNotification().dispatch(context)), + TvShowMoreInfoIntent: CallbackAction<Intent>(onInvoke: (intent) => TvShowMoreInfoNotification().dispatch(context)), + PlayPauseIntent: CallbackAction<PlayPauseIntent>(onInvoke: _onPlayPauseIntent), + EntryActionIntent: CallbackAction<EntryActionIntent>(onInvoke: (intent) => _onEntryActionIntent(intent.action)), + ActivateIntent: CallbackAction<Intent>( + onInvoke: (intent) { + if (useTvLayout) { + final _entry = entry; + if (_entry != null && _entry.isVideo) { + // address `TV-PC` requirement from https://developer.android.com/docs/quality-guidelines/tv-app-quality + final controller = context.read<VideoConductor>().getController(_entry); + if (controller != null) { + VideoActionNotification( + controller: controller, + entry: _entry, + action: EntryAction.videoTogglePlay, + ).dispatch(context); + } + } else { + const ToggleOverlayNotification().dispatch(context); + } + } + return null; + }, + ), + }, + onFocusChange: (focused) => _isImageFocusedNotifier.value = focused, + child: child, + ); + } + return const SizedBox(); + } + + void _onPointerSignal(PointerSignalEvent event) { + // use the resolver so that the pager scrollable does not handle the pointer + GestureBinding.instance.pointerSignalResolver.register(event, (event) { + if (event is PointerScrollEvent && event.kind == PointerDeviceKind.mouse) { + final verticalDelta = event.scrollDelta.dy; + _goToHorizontalPage(verticalDelta.sign.round(), animate: false); + } + }); + } + + void _onEntryActionIntent(EntryAction action) { + final mainEntry = entry; + if (mainEntry != null) { + AvesEntry? pageEntry; + final multiPageController = context.read<MultiPageConductor>().getController(mainEntry); + if (multiPageController != null) { + pageEntry = multiPageController.info?.getPageEntryByIndex(multiPageController.page); + } + final appMode = context.read<ValueNotifier<AppMode>>().value; + final actionDelegate = EntryActionDelegate(mainEntry, pageEntry ?? mainEntry, collection); + if (actionDelegate.isVisible(appMode: appMode, action: action) && actionDelegate.canApply(action)) { + actionDelegate.onActionSelected(context, action); + } + } + } + + void _goToHorizontalPage(int delta, {required bool animate}) { + final page = horizontalPager.page?.round(); + final _collection = collection; + if (page != null && _collection != null) { + var target = page + delta; + if (!widget.viewerController.repeat) { + target = target.clamp(0, _collection.entryCount - 1); + } + if (animate) { + horizontalPager.animateToPage( + target, + duration: ADurations.viewerHorizontalPageAnimation, + curve: Curves.easeInOutCubic, + ); + } else { + horizontalPager.jumpToPage(target); + } + } + } + + void _onVerticalPageControllerChanged() { + final page = verticalPager.page!; + + final opacity = min(1.0, page); + _backgroundOpacityNotifier.value = opacity * opacity; + + if (settings.maxBrightness == MaxBrightness.viewerOnly) { + _systemBrightness?.then((system) { + final value = lerpDouble(maximumBrightness, system, ((1 - page).abs() * 2).clamp(0, 1))!; + AvesApp.screenBrightness?.setApplicationScreenBrightness(value); + }); + } + + _isVerticallyScrollingNotifier.value = true; + _stopScrollMonitoringTimer(); + _verticalScrollMonitoringTimer = Timer(ADurations.infoScrollMonitoringTimerDelay, () { + _isVerticallyScrollingNotifier.value = false; + }); + } + + void _stopScrollMonitoringTimer() { + _verticalScrollMonitoringTimer?.cancel(); + } + + // when the entry changed (e.g. by scrolling through the PageView, or if the entry got deleted) + Future<void> _onEntryChanged() async { + _oldEntry?.visualChangeNotifier.removeListener(_onVisualChanged); + _oldEntry = entry; + + final _entry = entry; + if (_entry != null) { + _entry.visualChangeNotifier.addListener(_onVisualChanged); + // make sure to locate the entry, + // so that we can display the address instead of coordinates + // even when initial collection locating has not reached this entry yet + await _entry.catalog(background: false, force: false, persist: true); + await _entry.locate(background: false, force: false, geocoderLocale: settings.appliedLocale); + } else { + Navigator.maybeOf(context)?.pop(); + } + if (!mounted) return; + // needed to refresh when entry changes but the page does not (e.g. on page deletion) + setState(() {}); + } + + // when the entry image itself changed (e.g. after rotation) + void _onVisualChanged() async { + if (!mounted) return; + // rebuild to refresh the `Image` inside `ImagePage` + setState(() {}); + } + + void _onPlayPauseIntent(PlayPauseIntent intent) { + // address `TV-PP` requirement from https://developer.android.com/docs/quality-guidelines/tv-app-quality + final _entry = entry; + if (_entry != null && _entry.isVideo) { + final controller = context.read<VideoConductor>().getController(_entry); + if (controller != null) { + bool toggle; + switch (intent.type) { + case TvPlayPauseType.play: + toggle = !controller.isPlaying; + case TvPlayPauseType.pause: + toggle = controller.isPlaying; + case TvPlayPauseType.toggle: + toggle = true; + } + if (toggle) { + VideoActionNotification( + controller: controller, + entry: _entry, + action: EntryAction.videoTogglePlay, + ).dispatch(context); + } + } + } + } +} diff --git a/lib/widgets/viewer/entry_viewer_page.dart b/lib/widgets/viewer/entry_viewer_page.dart new file mode 100644 index 0000000..ed661bc --- /dev/null +++ b/lib/widgets/viewer/entry_viewer_page.dart @@ -0,0 +1,61 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves/widgets/viewer/controls/controller.dart'; +import 'package:aves/widgets/viewer/entry_viewer_stack.dart'; +import 'package:aves/widgets/viewer/providers.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class EntryViewerPage extends StatefulWidget { + static const routeName = '/viewer'; + + final CollectionLens? collection; + final AvesEntry initialEntry; + + const EntryViewerPage({ + super.key, + this.collection, + required this.initialEntry, + }); + + @override + State<EntryViewerPage> createState() => _EntryViewerPageState(); + + static Color getBackground(BuildContext context) => Theme.of(context).isDark ? Colors.black : Colors.white; +} + +class _EntryViewerPageState extends State<EntryViewerPage> { + final ViewerController _viewerController = ViewerController(); + + @override + void dispose() { + _viewerController.dispose(); + // provided collection should be a new instance specifically created + // for the `EntryViewerPage` widget, so it can be safely disposed here + widget.collection?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final collection = widget.collection; + return AvesScaffold( + body: MultiProvider( + providers: [ + ViewStateConductorProvider(), + VideoConductorProvider(collection: collection), + MultiPageConductorProvider(), + ], + child: EntryViewerStack( + collection: collection, + initialEntry: widget.initialEntry, + viewerController: _viewerController, + ), + ), + backgroundColor: Navigator.canPop(context) ? Colors.transparent : EntryViewerPage.getBackground(context), + resizeToAvoidBottomInset: false, + ); + } +} diff --git a/lib/widgets/viewer/entry_viewer_page_dlna.dart b/lib/widgets/viewer/entry_viewer_page_dlna.dart new file mode 100644 index 0000000..681f6c8 --- /dev/null +++ b/lib/widgets/viewer/entry_viewer_page_dlna.dart @@ -0,0 +1,90 @@ +// lib/widgets/viewer/entry_viewer_page_dlna.dart +// +// Viewer locale per DLNA. +// - Nessuna logica di cast qui dentro. +// - Il backend DLNA gestisce invio entry, next, prev, stop. +// - Questo widget notifica solo il cambio entry tramite onEntryChanged. + +import 'package:flutter/material.dart'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves/widgets/viewer/controls/controller.dart'; +import 'package:aves/widgets/viewer/entry_viewer_stack.dart'; +import 'package:aves/widgets/viewer/providers.dart'; +import 'package:provider/provider.dart'; +import 'package:aves/model/source/collection_lens.dart'; + +class EntryViewerPageDlna extends StatefulWidget { + final CollectionLens? collection; + final AvesEntry initialEntry; + + // Controller esterno (obbligatorio) + final ViewerController viewerController; + + // Callback quando cambia entry + final void Function(AvesEntry entry)? onEntryChanged; + + const EntryViewerPageDlna({ + super.key, + this.collection, + required this.initialEntry, + required this.viewerController, + this.onEntryChanged, + }); + + @override + State<EntryViewerPageDlna> createState() => _EntryViewerPageDlnaState(); + + static Color getBackground(BuildContext context) => + Theme.of(context).isDark ? Colors.black : Colors.white; +} + +class _EntryViewerPageDlnaState extends State<EntryViewerPageDlna> { + @override + void initState() { + super.initState(); + + // Ascolta cambio entry dal viewer + widget.viewerController.entryNotifier.addListener(_onEntryChanged); + } + + void _onEntryChanged() { + final entry = widget.viewerController.entryNotifier.value; + if (entry != null) { + widget.onEntryChanged?.call(entry); + } + } + + @override + void dispose() { + widget.viewerController.entryNotifier.removeListener(_onEntryChanged); + widget.collection?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final collection = widget.collection; + + return AvesScaffold( + body: MultiProvider( + providers: [ + ViewStateConductorProvider(), + VideoConductorProvider(collection: collection), + MultiPageConductorProvider(), + ], + child: EntryViewerStack( + collection: collection, + initialEntry: widget.initialEntry, + viewerController: widget.viewerController, + ), + ), + backgroundColor: Navigator.canPop(context) + ? Colors.transparent + : EntryViewerPageDlna.getBackground(context), + resizeToAvoidBottomInset: false, + ); + } +} diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart new file mode 100644 index 0000000..297e5a1 --- /dev/null +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -0,0 +1,1020 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/trash.dart'; +import 'package:aves/model/highlight.dart'; +import 'package:aves/model/settings/enums/accessibility_timeout.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/providers/viewer_entry_provider.dart'; +import 'package:aves/widgets/viewer/action/video_action_delegate.dart'; +import 'package:aves/widgets/viewer/controls/controller.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves/widgets/viewer/entry_vertical_pager.dart'; +import 'package:aves/widgets/viewer/hero.dart'; +import 'package:aves/widgets/viewer/multipage/conductor.dart'; +import 'package:aves/widgets/viewer/overlay/bottom.dart'; +import 'package:aves/widgets/viewer/overlay/locked.dart'; +import 'package:aves/widgets/viewer/overlay/panorama.dart'; +import 'package:aves/widgets/viewer/overlay/slideshow_buttons.dart'; +import 'package:aves/widgets/viewer/overlay/top.dart'; +import 'package:aves/widgets/viewer/overlay/video/video.dart'; +import 'package:aves/widgets/viewer/page_entry_builder.dart'; +import 'package:aves/widgets/viewer/video/conductor.dart'; +import 'package:aves/widgets/viewer/view/conductor.dart'; +import 'package:aves/widgets/viewer/visual/controller_mixin.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; + +class EntryViewerStack extends StatefulWidget { + final CollectionLens? collection; + final AvesEntry initialEntry; + final ViewerController viewerController; + + const EntryViewerStack({ + super.key, + this.collection, + required this.initialEntry, + required this.viewerController, + }); + + @override + State<EntryViewerStack> createState() => _EntryViewerStackState(); +} + +class _EntryViewerStackState extends State<EntryViewerStack> with EntryViewControllerMixin, FeedbackMixin, TickerProviderStateMixin, RouteAware { + late int _currentEntryIndex; + late ValueNotifier<int> _currentVerticalPage; + late PageController _horizontalPager, _verticalPager; + final AChangeNotifier _verticalScrollNotifier = AChangeNotifier(); + bool _overlayInitialized = false; + final ValueNotifier<bool> _overlayVisible = ValueNotifier(true); + final ValueNotifier<bool> _viewLocked = ValueNotifier(false); + final ValueNotifier<bool> _overlayExpandedNotifier = ValueNotifier(false); + late AnimationController _verticalPageAnimationController, _overlayAnimationController; + late CurvedAnimation _overlayButtonScale, _overlayVideoControlScale, _overlayOpacity, _overlayTopOffsetAnimation; + late Animation<Offset> _overlayTopOffset; + EdgeInsets? _frozenViewInsets, _frozenViewPadding; + late VideoActionDelegate _videoActionDelegate; + final ValueNotifier<EntryHeroInfo?> _heroInfoNotifier = ValueNotifier(null); + bool _isEntryTracked = true; + Timer? _overlayHidingTimer; + late ValueNotifier<AvesVideoController?> _playingVideoControllerNotifier; + + @override + bool get isViewingImage => _currentVerticalPage.value == imagePage; + + @override + late final ValueNotifier<AvesEntry?> entryNotifier; + + ViewerController get viewerController => widget.viewerController; + + CollectionLens? get collection => widget.collection; + + bool get hasCollection => collection != null; + + List<AvesEntry> get entries => hasCollection ? collection!.sortedEntries : [widget.initialEntry]; + + static const int transitionPage = 0; + + static const int imagePage = 1; + + static const int infoPage = 2; + + @override + void initState() { + super.initState(); + if (settings.maxBrightness == MaxBrightness.viewerOnly) { + AvesApp.screenBrightness?.setApplicationScreenBrightness(1); + } + if (settings.keepScreenOn == KeepScreenOn.viewerOnly) { + windowService.keepScreenOn(true); + } + + // make sure initial entry is actually among the filtered collection entries + // `initialEntry` may be a dynamic burst entry from another collection lens + // so it is, strictly speaking, not contained in the lens used by the viewer, + // but it can be found by content ID + final initialEntry = widget.initialEntry; + final entry = entries.firstWhereOrNull((entry) => entry.id == initialEntry.id) ?? entries.firstOrNull; + // opening hero, with viewer as target + _heroInfoNotifier.value = EntryHeroInfo(collection, entry); + entryNotifier = viewerController.entryNotifier; + entryNotifier.value = entry; + _currentEntryIndex = max(0, entry != null ? entries.indexOf(entry) : -1); + _currentVerticalPage = ValueNotifier(imagePage); + _horizontalPager = PageController(initialPage: _currentEntryIndex); + _verticalPager = PageController(initialPage: _currentVerticalPage.value)..addListener(_onVerticalPageControllerChanged); + _verticalPageAnimationController = AnimationController.unbounded(vsync: this); + _verticalPageAnimationController.addListener(() { + final offset = _verticalPageAnimationController.value; + final delta = (offset - _verticalPager.offset).abs(); + if (delta > precisionErrorTolerance) { + // snap instead of animating below pixel dimension so that the vertical drag gesture recognizer + // can handle a new gesture as soon as the animation appears to be complete to the user + if (delta >= 1) { + _verticalPager.jumpTo(offset); + } else { + _verticalPageAnimationController.stop(); + _verticalPager.jumpToPage(_verticalPager.page!.round()); + } + } + }); + _overlayAnimationController = AnimationController( + duration: context.read<DurationsData>().viewerOverlayAnimation, + vsync: this, + ); + _overlayButtonScale = CurvedAnimation( + parent: _overlayAnimationController, + // a little bounce at the top + curve: Curves.easeOutBack, + ); + _overlayVideoControlScale = CurvedAnimation( + parent: _overlayAnimationController, + // no bounce at the bottom, to avoid video controller displacement + curve: Curves.easeOutQuad, + ); + _overlayOpacity = CurvedAnimation( + parent: _overlayAnimationController, + curve: Curves.easeOutQuad, + ); + _overlayTopOffsetAnimation = CurvedAnimation( + parent: _overlayAnimationController, + curve: Curves.easeOutQuad, + ); + _overlayTopOffset = Tween(begin: const Offset(0, -1), end: const Offset(0, 0)).animate(_overlayTopOffsetAnimation); + _overlayVisible.value = settings.showOverlayOnOpening && !viewerController.autopilot; + _overlayVisible.addListener(_onOverlayVisibleChanged); + _viewLocked.addListener(_onViewLockedChanged); + _videoActionDelegate = VideoActionDelegate( + collection: collection, + ); + _playingVideoControllerNotifier = context.read<VideoConductor>().playingVideoControllerNotifier; + _playingVideoControllerNotifier.addListener(_onPlayingVideoControllerChanged); + initEntryControllers(entry); + _registerWidget(widget); + AvesApp.lifecycleStateNotifier.addListener(_onAppLifecycleStateChanged); + WidgetsBinding.instance.addPostFrameCallback((_) => _initOverlay()); + } + + @override + void didUpdateWidget(covariant EntryViewerStack oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + AvesApp.pageRouteObserver.unsubscribe(this); + cleanEntryControllers(entryNotifier.value); + _playingVideoControllerNotifier.removeListener(_onPlayingVideoControllerChanged); + updatePictureInPicture(context); + _videoActionDelegate.dispose(); + _verticalPageAnimationController.dispose(); + _overlayButtonScale.dispose(); + _overlayVideoControlScale.dispose(); + _overlayOpacity.dispose(); + _overlayTopOffsetAnimation.dispose(); + _overlayAnimationController.dispose(); + _overlayVisible.dispose(); + _viewLocked.dispose(); + _overlayExpandedNotifier.dispose(); + _currentVerticalPage.dispose(); + _horizontalPager.dispose(); + _verticalPager.dispose(); + _verticalScrollNotifier.dispose(); + _heroInfoNotifier.dispose(); + _stopOverlayHidingTimer(); + AvesApp.lifecycleStateNotifier.removeListener(_onAppLifecycleStateChanged); + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(EntryViewerStack widget) { + widget.collection?.addListener(_onCollectionChanged); + } + + void _unregisterWidget(EntryViewerStack widget) { + widget.collection?.removeListener(_onCollectionChanged); + } + + @override + Widget build(BuildContext context) { + final viewStateConductor = context.read<ViewStateConductor>(); + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + + _onPopInvoked(); + }, + child: ValueListenableProvider<EntryHeroInfo?>.value( + value: _heroInfoNotifier, + child: NotificationListener( + onNotification: _handleNotification, + child: LayoutBuilder( + builder: (context, constraints) { + final availableSize = Size(constraints.maxWidth, constraints.maxHeight); + final viewer = ViewerVerticalPageView( + collection: collection, + entryNotifier: entryNotifier, + viewerController: viewerController, + overlayOpacity: _overlayInitialized + ? _overlayOpacity + : settings.showOverlayOnOpening + ? kAlwaysCompleteAnimation + : kAlwaysDismissedAnimation, + verticalPager: _verticalPager, + horizontalPager: _horizontalPager, + onVerticalPageChanged: _onVerticalPageChanged, + onHorizontalPageChanged: _onHorizontalPageChanged, + onImagePageRequested: () => _goToVerticalPage(imagePage), + onViewDisposed: (mainEntry, pageEntry) => viewStateConductor.reset(pageEntry ?? mainEntry), + ); + return ValueListenableBuilder<bool>( + // as of floating v6.0.0, `Floating().pipStatusStream` is CPU intensive as it loops to query the platform, + // so we monitor the change on the platform and only notify changes + valueListenable: AvesApp.isInPictureInPictureMode, + builder: (context, pipEnabled, child) { + return ValueListenableBuilder<bool>( + valueListenable: _viewLocked, + builder: (context, locked, child) { + final children = [child!]; + if (!pipEnabled) { + if (locked) { + children.addAll([ + const Positioned.fill( + child: AbsorbPointer(), + ), + Positioned.fill( + child: GestureDetector( + onTap: () => _overlayVisible.value = !_overlayVisible.value, + ), + ), + _buildViewerLockedBottomOverlay(), + ]); + } else { + // regular overlay + children.addAll(_buildOverlays(availableSize).map(_decorateOverlay)); + } + + children.addAll([ + const TopGestureAreaProtector(), + const SideGestureAreaProtector(), + const BottomGestureAreaProtector(), + ]); + } + + // TODO TLAD [flutter vNext] wrap into `BackdropGroup` + return Stack( + children: children, + ); + }, + child: viewer, + ); + }, + ); + }, + ), + ), + ), + ); + } + + // route aware + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final route = ModalRoute.of(context); + if (route is PageRoute) { + AvesApp.pageRouteObserver.subscribe(this, route); + } + } + + @override + void didPopNext() => _overrideSnackBarMargin(); + + @override + void didPush() => _overrideSnackBarMargin(); + + @override + void didPop() => _resetSnackBarMargin(); + + @override + void didPushNext() => _resetSnackBarMargin(); + + void _overrideSnackBarMargin() { + MarginComputer marginComputer; + if (isViewingImage) { + marginComputer = (context) => EdgeInsets.only(bottom: ViewerBottomOverlay.actionSafeHeight(context)); + } else { + marginComputer = FeedbackMixin.snackBarMarginDefault; + } + FeedbackMixin.snackBarMarginOverrideNotifier.value = marginComputer; + } + + void _resetSnackBarMargin() => FeedbackMixin.snackBarMarginOverrideNotifier.value = null; + + // lifecycle + + // app lifecycle states: + // * rotating screen: resumed -> inactive -> resumed + // * going home: resumed -> inactive -> hidden -> paused + // * back from home: paused -> hidden -> inactive -> resumed + // * app switch / settings / etc: resumed -> inactive + void _onAppLifecycleStateChanged() { + switch (AvesApp.lifecycleStateNotifier.value) { + case AppLifecycleState.inactive: + // inactive: when losing focus + // also triggered when app is rotated on Android API >=33 + break; + case AppLifecycleState.hidden: + case AppLifecycleState.paused: + case AppLifecycleState.detached: + // hidden: transient state between `inactive` and `paused` + // paused: when using another app + // detached: when app is without a view + viewerController.autopilot = false; + pauseVideoControllers(); + case AppLifecycleState.resumed: + break; + } + } + + void _onPlayingVideoControllerChanged() => updatePictureInPicture(context); + + Widget _decorateOverlay(Widget overlay) { + return ValueListenableBuilder<double>( + valueListenable: _overlayAnimationController, + builder: (context, animation, child) { + return Visibility( + visible: !_overlayAnimationController.isDismissed, + child: child!, + ); + }, + child: overlay, + ); + } + + List<Widget> _buildOverlays(Size availableSize) { + final appMode = context.read<ValueNotifier<AppMode>>().value; + switch (appMode) { + case AppMode.screenSaver: + return []; + case AppMode.slideshow: + return [ + _buildViewerTopOverlay(availableSize), + _buildSlideshowBottomOverlay(availableSize), + ]; + default: + return [ + _buildViewerTopOverlay(availableSize), + _buildViewerBottomOverlay(availableSize), + ]; + } + } + + Widget _buildViewerLockedBottomOverlay() { + return TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: ViewerLockedOverlay( + animationController: _overlayAnimationController, + ), + ); + } + + Widget _buildSlideshowBottomOverlay(Size availableSize) { + return TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: Align( + alignment: AlignmentDirectional.bottomEnd, + child: SlideshowBottomOverlay( + animationController: _overlayAnimationController, + availableSize: availableSize, + viewInsets: _frozenViewInsets, + viewPadding: _frozenViewPadding, + ), + ), + ); + } + + Widget _buildViewerTopOverlay(Size availableSize) { + Widget child = ValueListenableBuilder<AvesEntry?>( + valueListenable: entryNotifier, + builder: (context, mainEntry, child) { + if (mainEntry == null) return const SizedBox(); + + return SlideTransition( + position: _overlayTopOffset, + child: ViewerTopOverlay( + entries: entries, + index: _currentEntryIndex, + mainEntry: mainEntry, + scale: _overlayButtonScale, + hasCollection: hasCollection, + expandedNotifier: _overlayExpandedNotifier, + availableSize: availableSize, + viewInsets: _frozenViewInsets, + viewPadding: _frozenViewPadding, + ), + ); + }, + ); + + child = ValueListenableBuilder<int>( + valueListenable: _currentVerticalPage, + builder: (context, page, child) { + return Visibility( + visible: page == imagePage, + child: child!, + ); + }, + child: child, + ); + + return child; + } + + Widget _buildViewerBottomOverlay(Size availableSize) { + Widget child = ValueListenableBuilder<AvesEntry?>( + valueListenable: entryNotifier, + builder: (context, mainEntry, child) { + if (mainEntry == null) return const SizedBox(); + + final multiPageController = mainEntry.isMultiPage ? context.read<MultiPageConductor>().getController(mainEntry) : null; + + Widget? _buildExtraBottomOverlay({AvesEntry? pageEntry}) { + final targetEntry = pageEntry ?? mainEntry; + Widget? child; + // a 360 video is both a video and a panorama but only the video controls are displayed + if (targetEntry.isPureVideo) { + child = Selector<VideoConductor, AvesVideoController?>( + selector: (context, vc) => vc.getController(targetEntry), + builder: (context, videoController, child) => VideoControlOverlay( + entry: targetEntry, + controller: videoController, + scale: _overlayVideoControlScale, + onActionSelected: (action) { + if (videoController != null) { + _onVideoAction( + context: context, + entry: targetEntry, + controller: videoController, + action: action, + ); + } + }, + ), + ); + } else if (targetEntry.is360) { + child = PanoramaOverlay( + entry: targetEntry, + scale: _overlayButtonScale, + ); + } + return child != null + ? ExtraBottomOverlay( + viewInsets: _frozenViewInsets, + viewPadding: _frozenViewPadding, + child: child, + ) + : null; + } + + final extraBottomOverlay = mainEntry.isMultiPage + ? PageEntryBuilder( + multiPageController: multiPageController, + builder: (pageEntry) => _buildExtraBottomOverlay(pageEntry: pageEntry) ?? const SizedBox(), + ) + : _buildExtraBottomOverlay(); + + return TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: Column( + children: [ + ?extraBottomOverlay, + ViewerBottomOverlay( + entries: entries, + index: _currentEntryIndex, + collection: collection, + animationController: _overlayAnimationController, + availableSize: availableSize, + viewInsets: _frozenViewInsets, + viewPadding: _frozenViewPadding, + multiPageController: multiPageController, + ), + ], + ), + ); + }, + ); + + child = Selector<MediaQueryData, double>( + selector: (context, mq) => mq.size.height, + builder: (context, mqHeight, child) { + // when orientation change, the `PageController` offset is not updated right away + // and it does not trigger its listeners when it does, so we force a refresh in the next frame + WidgetsBinding.instance.addPostFrameCallback((_) => _onVerticalPageControllerChanged()); + return AnimatedBuilder( + animation: _verticalScrollNotifier, + builder: (context, child) => Positioned( + bottom: (_verticalPager.hasClients && _verticalPager.position.hasPixels ? _verticalPager.offset : 0) - availableSize.height, + child: child!, + ), + child: child, + ); + }, + child: child, + ); + + return child; + } + + bool _handleNotification(dynamic notification) { + if (notification is SelectFilterNotification) { + _goToCollection(notification.filter); + } else if (notification is CastNotification) { + _cast(notification.enabled); + } else if (notification is FullImageLoadedNotification) { + // microtask so that listeners do not trigger during build + scheduleMicrotask(() { + if (!mounted) return; + final viewStateController = context.read<ViewStateConductor>().getController(notification.entry); + viewStateController?.fullImageNotifier.value = notification.image; + }); + } else if (notification is EntryDeletedNotification) { + _onEntryRemoved(context, notification.entries); + } else if (notification is EntryMovedNotification) { + // only add or remove entries following user actions, + // instead of applying all collection source changes + final isBin = collection?.filters.contains(TrashFilter.instance) ?? false; + final entries = notification.entries; + switch (notification.moveType) { + case MoveType.move: + _onEntryRemoved(context, entries); + case MoveType.toBin: + if (!isBin) { + _onEntryRemoved(context, entries); + } + case MoveType.fromBin: + if (isBin) { + _onEntryRemoved(context, entries); + } else { + _onEntryRestored(entries); + } + case MoveType.copy: + case MoveType.export: + break; + } + } else if (notification is PopupMenuOpenedNotification) { + // if the menu is opened while overlay is hiding, + // the popup menu button is disposed and menu items are ineffective, + // so we make sure overlay stays visible + _overlayVisible.value = true; + _videoActionDelegate.stopOverlayHidingTimer(); + dismissFeedback(context); + } else if (notification is ToggleOverlayNotification) { + _overlayVisible.value = notification.visible ?? !_overlayVisible.value; + } else if (notification is LockViewNotification) { + _viewLocked.value = notification.locked; + } else if (notification is VideoActionNotification) { + _onVideoAction( + context: context, + entry: notification.entry, + controller: notification.controller, + action: notification.action, + ); + } else if (notification is TvShowLessInfoNotification) { + if (_overlayVisible.value) { + _overlayVisible.value = false; + } else { + _onPopInvoked(); + } + } else if (notification is TvShowMoreInfoNotification) { + if (!_overlayVisible.value) { + _overlayVisible.value = true; + } + } else if (notification is PopVisualNotification) { + _popVisual(); + } else if (notification is ShowInfoPageNotification) { + _goToVerticalPage(infoPage); + } else if (notification is ShowPreviousEntryNotification) { + _goToHorizontalPageByDelta(delta: -1, animate: notification.animate); + } else if (notification is ShowNextEntryNotification) { + _goToHorizontalPageByDelta(delta: 1, animate: notification.animate); + } else if (notification is ShowEntryNotification) { + _goToHorizontalPageByIndex(page: notification.index, animate: notification.animate); + } else { + return false; + } + return true; + } + + Future<void> _cast(bool enabled) async { + if (enabled) { + final entries = collection?.sortedEntries; + if (entries != null) { + await viewerController.initCast(context, entries); + final entry = entryNotifier.value; + if (entry != null) { + await viewerController.castEntry(entry); + } + } + } else { + await viewerController.stopCast(); + } + } + + Future<void> _onVideoAction({ + required BuildContext context, + required AvesEntry entry, + required AvesVideoController controller, + required EntryAction action, + }) async { + if (action == EntryAction.videoToggleMute) { + final override = !controller.isMuted; + videoMutedOverride = override; + await context.read<VideoConductor>().muteAll(override); + } else { + await _videoActionDelegate.onActionSelected(context, entry, controller, action); + } + } + + void _onVerticalPageControllerChanged() { + if (!_isEntryTracked && _verticalPager.hasClients && _verticalPager.page?.floor() == transitionPage) { + _trackEntry(); + } + _verticalScrollNotifier.notify(); + } + + Future<void> _goToCollection(CollectionFilter filter) async { + final isMainMode = context.read<ValueNotifier<AppMode>>().value == AppMode.main; + if (!isMainMode) return; + + final baseCollection = collection; + if (baseCollection == null) return; + + await _onLeave(); + final uri = entryNotifier.value?.uri; + unawaited( + Navigator.maybeOf(context)?.pushAndRemoveUntil( + MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) => CollectionPage( + source: baseCollection.source, + filters: {...baseCollection.filters, filter}, + highlightTest: uri != null ? (entry) => entry.uri == uri : null, + ), + ), + (route) => false, + ), + ); + } + + Future<void> _goToVerticalPage(int page) async { + if (settings.animate) { + final start = _verticalPager.offset; + final end = _verticalPager.position.viewportDimension * page; + final simulation = ScrollSpringSimulation(ViewerVerticalPageView.spring, start, end, 0); + unawaited(_verticalPageAnimationController.animateWith(simulation)); + } else { + _verticalPager.jumpToPage(page); + } + } + + void _onVerticalPageChanged(int page) { + _currentVerticalPage.value = page; + _overrideSnackBarMargin(); + final animate = context.read<Settings>().animate; + switch (page) { + case transitionPage: + dismissFeedback(context); + _popVisual(); + if (!animate) { + _verticalPager.jumpToPage(page); + } + case imagePage: + reportService.log('Nav move to Image page'); + case infoPage: + reportService.log('Nav move to Info page'); + // prevent hero when viewer is offscreen + _heroInfoNotifier.value = null; + if (!animate) { + _verticalPager.jumpToPage(page); + } + } + } + + void _goToHorizontalPageByDelta({required int delta, required bool animate}) { + if (_horizontalPager.positions.isEmpty) return; + + final page = _horizontalPager.page?.round(); + if (page != null) { + _goToHorizontalPageByIndex(page: page + delta, animate: animate); + } + } + + Future<void> _goToHorizontalPageByIndex({required int page, required bool animate}) async { + final _collection = collection; + if (_collection != null) { + if (!widget.viewerController.repeat) { + page = page.clamp(0, _collection.entryCount - 1); + } + if (_currentEntryIndex != page) { + final animationDuration = animate ? context.read<DurationsData>().viewerHorizontalPageScrollAnimation : Duration.zero; + if (animationDuration > Duration.zero) { + // duration & curve should feel similar to changing page by fling + await _horizontalPager.animateToPage( + page, + duration: animationDuration, + curve: Curves.easeOutCubic, + ); + } else { + _horizontalPager.jumpToPage(page); + } + } + } + } + + void _onHorizontalPageChanged(int page) { + _currentEntryIndex = page; + if (viewerController.repeat) { + _currentEntryIndex %= entries.length; + } + _updateEntry(); + } + + void _onCollectionChanged() { + _updateEntry(); + } + + void _onEntryRestored(Set<AvesEntry> restoredEntries) { + if (restoredEntries.isEmpty) return; + + final _collection = collection; + if (_collection != null) { + _collection.refresh(); + final index = _collection.sortedEntries.indexOf(restoredEntries.first); + if (index != -1) { + _onHorizontalPageChanged(index); + } + _onCollectionChanged(); + } + } + + // deleted or moved to another album + void _onEntryRemoved(BuildContext context, Set<AvesEntry> removedEntries) { + if (removedEntries.isEmpty) return; + + if (hasCollection) { + final collectionEntries = collection!.sortedEntries; + removedEntries.forEach((removedEntry) { + // remove from collection + if (collectionEntries.remove(removedEntry)) return; + + // remove from burst + final mainEntry = collectionEntries.firstWhereOrNull((entry) => entry.stackedEntries?.contains(removedEntry) == true); + if (mainEntry != null) { + final multiPageController = context.read<MultiPageConductor>().getController(mainEntry); + if (multiPageController != null) { + mainEntry.stackedEntries!.remove(removedEntry); + multiPageController.reset(); + } + } + }); + if (collectionEntries.isNotEmpty) { + _onCollectionChanged(); + return; + } + } + + if (Navigator.canPop(context)) { + Navigator.maybeOf(context)?.pop(); + } else { + _leaveViewer(); + } + } + + Future<void> _updateEntry() async { + if (entries.isNotEmpty && _currentEntryIndex >= entries.length) { + // as of Flutter v1.22.2, `PageView` does not call `onPageChanged` when the last page is deleted + // so we manually track the page change, and let the entry update follow + _onHorizontalPageChanged(entries.length - 1); + return; + } + + final newEntry = _currentEntryIndex < entries.length ? entries[_currentEntryIndex] : null; + if (entryNotifier.value == newEntry) return; + cleanEntryControllers(entryNotifier.value); + entryNotifier.value = newEntry; + _isEntryTracked = false; + await pauseVideoControllers(); + await initEntryControllers(newEntry); + + if (viewerController.isCasting) { + final entry = entryNotifier.value; + if (entry != null) { + await viewerController.castEntry(entry); + } + } + } + + void _onPopInvoked() { + if (_currentVerticalPage.value == infoPage) { + // back from info to image + _goToVerticalPage(imagePage); + } else { + if (!_isEntryTracked) _trackEntry(); + _popVisual(); + } + } + + void _popVisual() { + if (Navigator.canPop(context)) { + Future<void> pop() async { + await _onLeave(); + Navigator.maybeOf(context)?.pop(); + } + + // closing hero, with viewer as source + final heroInfo = EntryHeroInfo(collection, entryNotifier.value); + if (_heroInfoNotifier.value != heroInfo) { + _heroInfoNotifier.value = heroInfo; + // we post closing the viewer page so that hero animation source is ready + WidgetsBinding.instance.addPostFrameCallback((_) => pop()); + } else { + // viewer already has correct hero info, no need to rebuild + pop(); + } + } else { + // exit app when trying to pop a viewer page + _leaveViewer(); + } + } + + Future<void> _leaveViewer() async { + // widgets do not get disposed normally when popping the `SystemNavigator` + // so we manually clean video controllers and save playback state + await context.read<VideoConductor>().dispose(); + await SystemNavigator.pop(); + } + + // track item when returning to collection, + // if they are not fully visible already + void _trackEntry() { + _isEntryTracked = true; + final entry = entryNotifier.value; + if (entry != null && hasCollection) { + context.read<HighlightInfo>().trackItem( + entry, + predicate: (v) => v < 1, + animate: false, + ); + context.read<ViewerEntryNotifier>().value = entry; + } + } + + Future<void> _onLeave() async { + // get the theme first, as the context is likely + // to be unmounted after the other async steps + final theme = Theme.of(context); + + await viewerController.stopCast(); + + try { + switch (settings.maxBrightness) { + case MaxBrightness.never: + case MaxBrightness.viewerOnly: + await AvesApp.screenBrightness?.resetApplicationScreenBrightness(); + case MaxBrightness.always: + await AvesApp.screenBrightness?.setApplicationScreenBrightness(1); + } + } on PlatformException catch (e, stack) { + // `screen_brightness` plugin may fail + unawaited(reportService.recordError(e, stack)); + } + if (settings.keepScreenOn == KeepScreenOn.viewerOnly) { + await windowService.keepScreenOn(false); + } + await mediaSessionService.release(); + await _showSystemUI(context, true); + AvesApp.setSystemUIStyle(theme); + if (!settings.useTvLayout) { + await windowService.requestOrientation(); + } + // delay to prevent white/black flash on page transition + // from a viewer with a transparent background and no system UI + // to a regular page with system UI + await Future.delayed(const Duration(milliseconds: 50)); + } + + // overlay + + Future<void> _initOverlay() async { + final appMode = context.read<ValueNotifier<AppMode>>().value; + if (appMode == AppMode.screenSaver) { + _overlayVisible.value = false; + await _onOverlayVisibleChanged(animate: false); + } else { + // wait for MaterialPageRoute.transitionDuration + // to show overlay after hero animation is complete + await Future.delayed(ModalRoute.of(context)!.transitionDuration * timeDilation); + await _onOverlayVisibleChanged(); + } + _overlayInitialized = true; + } + + Future<void> _onOverlayVisibleChanged({bool animate = true}) async { + if (!mounted) return; + if (_overlayVisible.value) { + if (_viewLocked.value) { + await _startOverlayHidingTimer(); + } else { + await _showSystemUI(context, true); + AvesApp.setSystemUIStyle(Theme.of(context)); + } + if (animate) { + await _overlayAnimationController.forward(); + } else { + _overlayAnimationController.value = _overlayAnimationController.upperBound; + } + viewerController.autopilot = false; + } else { + final mediaQuery = context.read<MediaQueryData>(); + setState(() { + _frozenViewInsets = mediaQuery.viewInsets; + _frozenViewPadding = mediaQuery.viewPadding; + }); + await _showSystemUI(context, false); + if (animate) { + await _overlayAnimationController.reverse(); + } else { + _overlayAnimationController.reset(); + } + setState(() { + _frozenViewInsets = null; + _frozenViewPadding = null; + }); + } + } + + Future<void> _onViewLockedChanged() async { + if (_viewLocked.value) { + await _showSystemUI(context, false); + await _startOverlayHidingTimer(); + } else { + await _showSystemUI(context, true); + AvesApp.setSystemUIStyle(Theme.of(context)); + _stopOverlayHidingTimer(); + _overlayVisible.value = true; + } + } + + Future<void> _startOverlayHidingTimer() async { + _stopOverlayHidingTimer(); + final duration = await settings.timeToTakeAction.getSnackBarDuration(true); + _overlayHidingTimer = Timer(duration, () => _overlayVisible.value = false); + } + + void _stopOverlayHidingTimer() => _overlayHidingTimer?.cancel(); + + Future<void> _showSystemUI(BuildContext context, bool show) async { + final appMode = context.read<ValueNotifier<AppMode>>().value; + if (appMode == AppMode.screenSaver) { + // as of Flutter v3.22.1, calls to `SystemChrome.setEnabledSystemUIMode` hang when app is used as a screen saver + return; + } + + if (show) { + await AvesApp.showSystemUI(); + } else { + await AvesApp.hideSystemUI(); + } + } +} diff --git a/lib/widgets/viewer/fullscreen_cast_viewer.dart b/lib/widgets/viewer/fullscreen_cast_viewer.dart new file mode 100644 index 0000000..de284e7 --- /dev/null +++ b/lib/widgets/viewer/fullscreen_cast_viewer.dart @@ -0,0 +1,372 @@ +// lib/widgets/viewer/fullscreen_cast_viewer.dart +// +// Viewer FULLSCREEN per Google Cast. +// FAST e DLNA hanno viewer separati. + +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:video_player/video_player.dart'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/widgets/cast/cast_controller.dart'; + +class FullscreenCastViewer extends StatefulWidget { + final List<AvesEntry> entries; + final int startIndex; + + const FullscreenCastViewer({ + super.key, + required this.entries, + required this.startIndex, + }); + + @override + State<FullscreenCastViewer> createState() => _FullscreenCastViewerState(); +} + +class _FullscreenCastViewerState extends State<FullscreenCastViewer> { + late final PageController _pageController; + late int _currentIndex; + + bool _isUpdatingFromCast = false; + bool _controlsVisible = true; + + @override + void initState() { + super.initState(); + + _currentIndex = widget.startIndex.clamp(0, widget.entries.length - 1); + _pageController = PageController(initialPage: _currentIndex); + + CastController.instance.currentIndexNotifier.addListener(_onCastIndexChanged); + } + + @override + void dispose() { + CastController.instance.currentIndexNotifier.removeListener(_onCastIndexChanged); + _pageController.dispose(); + super.dispose(); + } + + // ------------------------------------------------------------ + // SYNC CAST -> UI + // ------------------------------------------------------------ + void _onCastIndexChanged() { + final newIndex = CastController.instance.currentIndexNotifier.value; + + if (newIndex == _currentIndex) return; + + _isUpdatingFromCast = true; + _currentIndex = newIndex; + + if (_pageController.hasClients) { + _pageController.jumpToPage(newIndex); + } + + if (mounted) setState(() {}); + + Future.delayed(const Duration(milliseconds: 100), () { + _isUpdatingFromCast = false; + }); + } + + // ------------------------------------------------------------ + // SYNC UI -> CAST + // ------------------------------------------------------------ + void _onPageChanged(int index) { + if (_isUpdatingFromCast) return; + + if (index > _currentIndex) { + CastController.instance.nextManual(); + } else if (index < _currentIndex) { + CastController.instance.prevManual(); + } + + setState(() => _currentIndex = index); + } + + // ------------------------------------------------------------ + // Helpers UI + // ------------------------------------------------------------ + String _formatDuration(Duration d) { + final totalSeconds = d.inSeconds; + final hours = totalSeconds ~/ 3600; + final minutes = (totalSeconds % 3600) ~/ 60; + final seconds = totalSeconds % 60; + + if (hours > 0) { + return '${hours.toString().padLeft(2, '0')}:' + '${minutes.toString().padLeft(2, '0')}:' + '${seconds.toString().padLeft(2, '0')}'; + } + return '${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; + } + + Widget _buildTopBar(BuildContext context) { + return SafeArea( + child: Container( + color: Colors.black54, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Row( + children: [ + IconButton( + icon: const Icon(Icons.close, color: Colors.white), + onPressed: () => Navigator.of(context).maybePop(), + ), + Expanded( + child: Text( + '${_currentIndex + 1}/${widget.entries.length}', + style: const TextStyle(color: Colors.white), + textAlign: TextAlign.center, + ), + ), + IconButton( + icon: const Icon(Icons.stop, color: Colors.white), + onPressed: () async { + await CastController.instance.stopCast(); + if (mounted) Navigator.of(context).maybePop(); + }, + ), + ], + ), + ), + ); + } + + Widget _buildBottomControls() { + final controller = CastController.instance; + + return SafeArea( + top: false, + child: Container( + color: Colors.black54, + padding: const EdgeInsets.fromLTRB(12, 8, 12, 12), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // -------------------------------------------------- + // SEEK BAR (solo Google) + // -------------------------------------------------- + ValueListenableBuilder<CastBackend>( + valueListenable: controller.backendNotifier, + builder: (context, backend, _) { + if (backend != CastBackend.google) return const SizedBox.shrink(); + + return ValueListenableBuilder<Duration>( + valueListenable: controller.durationNotifier, + builder: (context, duration, _) { + return ValueListenableBuilder<Duration>( + valueListenable: controller.positionNotifier, + builder: (context, position, __) { + final maxMs = duration.inMilliseconds <= 0 ? 1 : duration.inMilliseconds; + final valueMs = position.inMilliseconds.clamp(0, maxMs); + + return Column( + children: [ + Slider( + value: valueMs.toDouble(), + min: 0, + max: maxMs.toDouble(), + onChanged: (_) {}, + onChangeEnd: (_) {}, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Row( + children: [ + Text(_formatDuration(position), style: const TextStyle(color: Colors.white70)), + const Spacer(), + Text(_formatDuration(duration), style: const TextStyle(color: Colors.white70)), + ], + ), + ), + ], + ); + }, + ); + }, + ); + }, + ), + + const SizedBox(height: 8), + + // -------------------------------------------------- + // PREV / PLAY-PAUSE / NEXT + // -------------------------------------------------- + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + IconButton( + iconSize: 34, + icon: const Icon(Icons.skip_previous, color: Colors.white), + onPressed: () => controller.prevManual(), + ), + + const SizedBox(width: 12), + + // PLAY/PAUSE solo Google + ValueListenableBuilder<CastBackend>( + valueListenable: controller.backendNotifier, + builder: (context, backend, _) { + if (backend != CastBackend.google) return const SizedBox.shrink(); + + return ValueListenableBuilder<bool>( + valueListenable: controller.isPlayingNotifier, + builder: (context, isPlaying, _) { + return IconButton( + iconSize: 40, + icon: Icon( + isPlaying ? Icons.pause_circle : Icons.play_circle, + color: Colors.white, + ), + onPressed: () {}, + ); + }, + ); + }, + ), + + const SizedBox(width: 12), + + IconButton( + iconSize: 34, + icon: const Icon(Icons.skip_next, color: Colors.white), + onPressed: () => controller.nextManual(), + ), + ], + ), + + const SizedBox(height: 12), + + // -------------------------------------------------- + // VOLUME solo Google + // -------------------------------------------------- + ValueListenableBuilder<CastBackend>( + valueListenable: controller.backendNotifier, + builder: (context, backend, _) { + if (backend != CastBackend.google) return const SizedBox.shrink(); + + return ValueListenableBuilder<double>( + valueListenable: controller.volumeNotifier, + builder: (context, volume, _) { + return Row( + children: [ + IconButton( + icon: const Icon(Icons.volume_up, color: Colors.white), + onPressed: () {}, + ), + Expanded( + child: Slider( + value: volume.clamp(0.0, 1.0), + min: 0, + max: 1, + onChanged: (_) {}, + ), + ), + ], + ); + }, + ); + }, + ), + ], + ), + ), + ); + } + + // ------------------------------------------------------------ + // RENDER ENTRY (locale o remoto) + // ------------------------------------------------------------ + Widget _buildEntry(AvesEntry entry) { + final isVideo = (entry.durationMillis ?? 0) > 0; + final path = entry.path; + + // VIDEO LOCALE + if (isVideo && path != null && File(path).existsSync()) { + return Center(child: VideoWidget.file(File(path))); + } + + // FOTO LOCALE + if (!isVideo && path != null && File(path).existsSync()) { + return InteractiveViewer( + child: Center(child: Image.file(File(path), fit: BoxFit.contain)), + ); + } + + return const Center( + child: Icon(Icons.broken_image, size: 64, color: Colors.white54), + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.black, + body: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => setState(() => _controlsVisible = !_controlsVisible), + child: Stack( + children: [ + PageView.builder( + controller: _pageController, + itemCount: widget.entries.length, + onPageChanged: _onPageChanged, + itemBuilder: (context, i) => _buildEntry(widget.entries[i]), + ), + + if (_controlsVisible) ...[ + Align(alignment: Alignment.topCenter, child: _buildTopBar(context)), + Align(alignment: Alignment.bottomCenter, child: _buildBottomControls()), + ], + ], + ), + ), + ); + } +} + +// ------------------------------------------------------------ +// VIDEO WIDGET (solo locale) +// ------------------------------------------------------------ +class VideoWidget extends StatefulWidget { + final File file; + + const VideoWidget.file(this.file, {super.key}); + + @override + State<VideoWidget> createState() => _VideoWidgetState(); +} + +class _VideoWidgetState extends State<VideoWidget> { + VideoPlayerController? controller; + + @override + void initState() { + super.initState(); + + controller = VideoPlayerController.file(widget.file) + ..initialize().then((_) { + if (mounted) setState(() {}); + }); + } + + @override + void dispose() { + controller?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + if (controller == null || !controller!.value.isInitialized) { + return const Center(child: CircularProgressIndicator()); + } + + return AspectRatio( + aspectRatio: controller!.value.aspectRatio, + child: VideoPlayer(controller!), + ); + } +} diff --git a/lib/widgets/viewer/fullscreen_cast_viewer_dlna.dart b/lib/widgets/viewer/fullscreen_cast_viewer_dlna.dart new file mode 100644 index 0000000..284606b --- /dev/null +++ b/lib/widgets/viewer/fullscreen_cast_viewer_dlna.dart @@ -0,0 +1,121 @@ +// lib/widgets/viewer/fullscreen_cast_viewer_dlna.dart +// +// Viewer FULLSCREEN per DLNA (solo locale). +// Il backend DLNA gestisce: +// - invio entry +// - next/prev +// - stop + +import 'package:flutter/material.dart'; +import 'package:aves/model/entry/entry.dart'; + +import 'package:aves/widgets/viewer/controls/controller.dart'; +import 'package:aves/widgets/viewer/entry_viewer_page_dlna.dart'; + +import 'package:aves/widgets/cast/cast_controller.dart'; + +class FullscreenCastViewerDlna extends StatefulWidget { + final List<AvesEntry> entries; + final int startIndex; + + const FullscreenCastViewerDlna({ + super.key, + required this.entries, + required this.startIndex, + }); + + @override + State<FullscreenCastViewerDlna> createState() => + _FullscreenCastViewerDlnaState(); +} + +class _FullscreenCastViewerDlnaState extends State<FullscreenCastViewerDlna> { + late int _currentIndex; + late ViewerController _viewerController; + + @override + void initState() { + super.initState(); + + _currentIndex = widget.startIndex; + _viewerController = ViewerController(); + + // ⭐ invia la prima entry tramite backend DLNA + CastController.instance.startManualQueue(widget.entries, _currentIndex); + } + + @override + Widget build(BuildContext context) { + final controller = CastController.instance; + + return Stack( + children: [ + // ------------------------------------------------------------ + // VIEWER DLNA (solo locale) + // ------------------------------------------------------------ + EntryViewerPageDlna( + collection: null, + initialEntry: widget.entries[_currentIndex], + viewerController: _viewerController, + + // ⭐ quando cambia entry → notifica il backend DLNA + onEntryChanged: (entry) { + final newIndex = widget.entries.indexOf(entry); + if (newIndex != -1) { + setState(() => _currentIndex = newIndex); + controller.startManualQueue(widget.entries, newIndex); + } + }, + ), + + // ------------------------------------------------------------ + // OVERLAY CONTROLLI DLNA + // ------------------------------------------------------------ + Positioned( + bottom: 20, + left: 0, + right: 0, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // PREV + IconButton( + iconSize: 40, + color: Colors.white, + icon: const Icon(Icons.skip_previous), + onPressed: () async { + await controller.prevManual(); + }, + ), + + const SizedBox(width: 20), + + // STOP + IconButton( + iconSize: 40, + color: Colors.white, + icon: const Icon(Icons.stop), + onPressed: () async { + await controller.stopCast(); + if (mounted) Navigator.of(context).maybePop(); + }, + ), + + const SizedBox(width: 20), + + // NEXT + IconButton( + iconSize: 40, + color: Colors.white, + icon: const Icon(Icons.skip_next), + onPressed: () async { + await controller.nextManual(); + }, + ), + ], + ), + ), + ], + ); + } +} diff --git a/lib/widgets/viewer/fullscreen_cast_viewer_fast.dart b/lib/widgets/viewer/fullscreen_cast_viewer_fast.dart new file mode 100644 index 0000000..7f27d0c --- /dev/null +++ b/lib/widgets/viewer/fullscreen_cast_viewer_fast.dart @@ -0,0 +1,271 @@ +// lib/widgets/viewer/fullscreen_cast_viewer_fast.dart +// +// Viewer FULLSCREEN per FAST backend. +// - Nessun seek +// - Nessun play/pause +// - Nessun volume +// - Solo next/prev/stop +// - Swipe sincronizzato con backend FAST + +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:video_player/video_player.dart'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/widgets/cast/cast_controller.dart'; + +class FullscreenCastViewerFast extends StatefulWidget { + final List<AvesEntry> entries; + final int startIndex; + + const FullscreenCastViewerFast({ + super.key, + required this.entries, + required this.startIndex, + }); + + @override + State<FullscreenCastViewerFast> createState() => + _FullscreenCastViewerFastState(); +} + +class _FullscreenCastViewerFastState extends State<FullscreenCastViewerFast> { + late final PageController _pageController; + late int _currentIndex; + + bool _isUpdatingFromCast = false; + bool _controlsVisible = true; + + @override + void initState() { + super.initState(); + + _currentIndex = widget.startIndex.clamp(0, widget.entries.length - 1); + _pageController = PageController(initialPage: _currentIndex); + + // Sync FAST → UI + CastController.instance.currentIndexNotifier.addListener(_onCastIndexChanged); + } + + @override + void dispose() { + CastController.instance.currentIndexNotifier.removeListener(_onCastIndexChanged); + _pageController.dispose(); + super.dispose(); + } + + // ------------------------------------------------------------ + // SYNC CAST → UI + // ------------------------------------------------------------ + void _onCastIndexChanged() { + final newIndex = CastController.instance.currentIndexNotifier.value; + + if (newIndex == _currentIndex) return; + + _isUpdatingFromCast = true; + _currentIndex = newIndex; + + if (_pageController.hasClients) { + _pageController.jumpToPage(newIndex); + } + + if (mounted) setState(() {}); + + Future.delayed(const Duration(milliseconds: 100), () { + _isUpdatingFromCast = false; + }); + } + + // ------------------------------------------------------------ + // SYNC UI → CAST + // ------------------------------------------------------------ + void _onPageChanged(int index) { + if (_isUpdatingFromCast) return; + + if (index > _currentIndex) { + CastController.instance.nextManual(); + } else if (index < _currentIndex) { + CastController.instance.prevManual(); + } + + setState(() => _currentIndex = index); + } + + // ------------------------------------------------------------ + // RENDER ENTRY (locale) + // ------------------------------------------------------------ + Widget _buildEntry(AvesEntry entry) { + final isVideo = (entry.durationMillis ?? 0) > 0; + final path = entry.path; + + if (path == null || !File(path).existsSync()) { + return const Center( + child: Icon(Icons.broken_image, size: 64, color: Colors.white54), + ); + } + + if (isVideo) { + return Center(child: VideoWidget.file(File(path))); + } + + return InteractiveViewer( + child: Center( + child: Image.file(File(path), fit: BoxFit.contain), + ), + ); + } + + // ------------------------------------------------------------ + // TOP BAR + // ------------------------------------------------------------ + Widget _buildTopBar(BuildContext context) { + return SafeArea( + child: Container( + color: Colors.black54, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Row( + children: [ + IconButton( + icon: const Icon(Icons.close, color: Colors.white), + onPressed: () => Navigator.of(context).maybePop(), + ), + Expanded( + child: Text( + '${_currentIndex + 1}/${widget.entries.length}', + style: const TextStyle(color: Colors.white), + textAlign: TextAlign.center, + ), + ), + IconButton( + icon: const Icon(Icons.stop, color: Colors.white), + onPressed: () async { + await CastController.instance.stopCast(); + if (mounted) Navigator.of(context).maybePop(); + }, + ), + ], + ), + ), + ); + } + + // ------------------------------------------------------------ + // BOTTOM CONTROLS (prev / next / stop) + // ------------------------------------------------------------ + Widget _buildBottomControls() { + final controller = CastController.instance; + + return SafeArea( + top: false, + child: Container( + color: Colors.black54, + padding: const EdgeInsets.fromLTRB(12, 8, 12, 12), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // PREV + IconButton( + iconSize: 40, + icon: const Icon(Icons.skip_previous, color: Colors.white), + onPressed: () => controller.prevManual(), + ), + + const SizedBox(width: 20), + + // STOP + IconButton( + iconSize: 40, + icon: const Icon(Icons.stop, color: Colors.white), + onPressed: () async { + await controller.stopCast(); + if (mounted) Navigator.of(context).maybePop(); + }, + ), + + const SizedBox(width: 20), + + // NEXT + IconButton( + iconSize: 40, + icon: const Icon(Icons.skip_next, color: Colors.white), + onPressed: () => controller.nextManual(), + ), + ], + ), + ), + ); + } + + // ------------------------------------------------------------ + // BUILD + // ------------------------------------------------------------ + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.black, + body: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => setState(() => _controlsVisible = !_controlsVisible), + child: Stack( + children: [ + PageView.builder( + controller: _pageController, + itemCount: widget.entries.length, + onPageChanged: _onPageChanged, + itemBuilder: (context, i) => _buildEntry(widget.entries[i]), + ), + + if (_controlsVisible) ...[ + Align(alignment: Alignment.topCenter, child: _buildTopBar(context)), + Align(alignment: Alignment.bottomCenter, child: _buildBottomControls()), + ], + ], + ), + ), + ); + } +} + +// ------------------------------------------------------------ +// VIDEO WIDGET (solo locale) +// ------------------------------------------------------------ +class VideoWidget extends StatefulWidget { + final File file; + + const VideoWidget.file(this.file, {super.key}); + + @override + State<VideoWidget> createState() => _VideoWidgetState(); +} + +class _VideoWidgetState extends State<VideoWidget> { + VideoPlayerController? controller; + + @override + void initState() { + super.initState(); + + controller = VideoPlayerController.file(widget.file) + ..initialize().then((_) { + if (mounted) setState(() {}); + }); + } + + @override + void dispose() { + controller?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + if (controller == null || !controller!.value.isInitialized) { + return const Center(child: CircularProgressIndicator()); + } + + return AspectRatio( + aspectRatio: controller!.value.aspectRatio, + child: VideoPlayer(controller!), + ); + } +} diff --git a/lib/widgets/viewer/hero.dart b/lib/widgets/viewer/hero.dart new file mode 100644 index 0000000..d1432d3 --- /dev/null +++ b/lib/widgets/viewer/hero.dart @@ -0,0 +1,20 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/widgets.dart'; + +@immutable +class EntryHeroInfo extends Equatable { + // hero tag should include a collection identifier, so that it animates + // between different views of the entry in the same collection (e.g. thumbnails <-> viewer) + // but not between different collection instances, even with the same attributes (e.g. reloading collection page via drawer) + final CollectionLens? collection; + final AvesEntry? entry; + + @override + List<Object?> get props => [collection?.id, entry?.uri]; + + const EntryHeroInfo(this.collection, this.entry); + + int get tag => Object.hashAll([collection?.id, entry?.uri]); +} diff --git a/lib/widgets/viewer/info/basic_section.dart b/lib/widgets/viewer/info/basic_section.dart new file mode 100644 index 0000000..3665514 --- /dev/null +++ b/lib/widgets/viewer/info/basic_section.dart @@ -0,0 +1,419 @@ +// lib/widgets/viewer/info/basic_section.dart + +import 'package:aves/app_mode.dart'; +import 'package:aves/image_providers/app_icon_image_provider.dart'; +import 'package:aves/model/app_inventory.dart'; +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/favourites.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/date.dart'; +import 'package:aves/model/filters/favourite.dart'; +import 'package:aves/model/filters/mime.dart'; +import 'package:aves/model/filters/rating.dart'; +import 'package:aves/model/filters/type.dart'; +import 'package:aves/model/filters/weekday.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/theme/format.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/rate_button.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/tag_button.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/viewer/action/entry_info_action_delegate.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; +import 'package:path/path.dart' as p; + + +class BasicSection extends StatefulWidget { + final AvesEntry entry; + final CollectionLens? collection; + final EntryInfoActionDelegate actionDelegate; + final ValueNotifier<bool> isScrollingNotifier; + final ValueNotifier<EntryAction?> isEditingMetadataNotifier; + final AFilterCallback onFilterSelection; + + const BasicSection({ + super.key, + required this.entry, + this.collection, + required this.actionDelegate, + required this.isScrollingNotifier, + required this.isEditingMetadataNotifier, + required this.onFilterSelection, + }); + + @override + State<BasicSection> createState() => _BasicSectionState(); +} + +class _BasicSectionState extends State<BasicSection> { + final FocusNode _chipFocusNode = FocusNode(); + + CollectionLens? get collection => widget.collection; + + EntryInfoActionDelegate get actionDelegate => widget.actionDelegate; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + _onScrollingChanged(); + } + + @override + void didUpdateWidget(covariant BasicSection oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + _chipFocusNode.dispose(); + super.dispose(); + } + + void _registerWidget(BasicSection widget) { + widget.isScrollingNotifier.addListener(_onScrollingChanged); + } + + void _unregisterWidget(BasicSection widget) { + widget.isScrollingNotifier.removeListener(_onScrollingChanged); + } + + @override + Widget build(BuildContext context) { + final entry = widget.entry; + return AnimatedBuilder( + animation: entry.metadataChangeNotifier, + builder: (context, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _BasicInfo(entry: entry, collection: collection), + Focus( + focusNode: _chipFocusNode, + skipTraversal: true, + canRequestFocus: false, + child: _buildChips(context), + ), + _buildEditButtons(context), + ], + ); + }, + ); + } + + Widget _buildChips(BuildContext context) { + final entry = widget.entry; + final tags = entry.tags.toList()..sort(compareAsciiUpperCaseNatural); + final dateTime = entry.bestDate; + final album = entry.directory; + final filters = { + MimeFilter(entry.mimeType), + if (entry.isAnimated) TypeFilter.animated, + if (entry.isGeotiff) TypeFilter.geotiff, + if (entry.isHdr) TypeFilter.hdr, + if (entry.isMotionPhoto) TypeFilter.motionPhoto, + if (entry.isRaw) TypeFilter.raw, + if (entry.isImage && entry.is360) TypeFilter.panorama, + if (entry.isPureVideo && entry.is360) TypeFilter.sphericalVideo, + if (entry.isPureVideo && !entry.is360) MimeFilter.video, + if (dateTime != null) ...[DateFilter(DateLevel.ymd, dateTime.date), WeekDayFilter(dateTime.weekday)], + if (album != null) StoredAlbumFilter(album, collection?.source.getStoredAlbumDisplayName(context, album)), + ...dynamicAlbums.all.where((v) => v.test(entry)).toSet(), + if (entry.rating != 0) RatingFilter(entry.rating), + ...tags.map(TagFilter.new), + }; + return AnimatedBuilder( + animation: favourites, + builder: (context, child) { + final effectiveFilters = [ + ...filters, + if (entry.isFavourite) FavouriteFilter.instance, + ]..sort(); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: AvesFilterChip.outlineWidth / 2) + const EdgeInsets.only(top: 8), + child: Wrap( + spacing: 8, + runSpacing: 8, + children: effectiveFilters + .map( + (filter) => AvesFilterChip( + filter: filter, + onTap: widget.onFilterSelection, + ), + ) + .toList(), + ), + ); + }, + ); + } + + Widget _buildEditButtons(BuildContext context) { + final appMode = context.watch<ValueNotifier<AppMode>>().value; + final entry = widget.entry; + final children = + [ + EntryAction.editRating, + EntryAction.editTags, + ] + .where( + (v) => actionDelegate.isVisible( + appMode: appMode, + targetEntry: entry, + action: v, + ), + ) + .where((v) => actionDelegate.canApply(entry, v)) + .map((v) => _buildEditMetadataButton(context, v)) + .toList(); + + return children.isEmpty + ? const SizedBox() + : TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: AvesFilterChip.outlineWidth / 2) + const EdgeInsets.only(top: 8), + child: Wrap( + spacing: 8, + runSpacing: 8, + children: children, + ), + ), + ); + } + + Widget _buildEditMetadataButton(BuildContext context, EntryAction action) { + final entry = widget.entry; + return ValueListenableBuilder<EntryAction?>( + valueListenable: widget.isEditingMetadataNotifier, + builder: (context, editingAction, child) { + final isEditing = editingAction != null; + final onPressed = isEditing ? null : () => actionDelegate.onActionSelected(context, entry, collection, action); + Widget button; + switch (action) { + case EntryAction.editRating: + button = RateButton( + blurred: false, + onChooserValue: (rating) => actionDelegate.quickRate(context, entry, rating), + onPressed: onPressed, + ); + case EntryAction.editTags: + button = TagButton( + blurred: false, + onChooserValue: (filter) => actionDelegate.quickTag(context, entry, filter), + onPressed: onPressed, + ); + default: + button = IconButton( + icon: action.getIcon(), + onPressed: onPressed, + tooltip: action.getText(context), + ); + } + return Stack( + children: [ + DecoratedBox( + decoration: BoxDecoration( + border: Border.fromBorderSide( + BorderSide( + color: isEditing ? Theme.of(context).disabledColor : context.select<AvesColorsData, Color>((v) => v.neutral), + width: AvesFilterChip.outlineWidth, + ), + ), + borderRadius: const BorderRadius.all(Radius.circular(AvesFilterChip.defaultRadius)), + ), + child: button, + ), + Positioned.fill( + child: Visibility( + visible: editingAction == action, + child: const Padding( + padding: EdgeInsets.all(1.0), + child: CircularProgressIndicator( + strokeWidth: AvesFilterChip.outlineWidth, + ), + ), + ), + ), + ], + ); + }, + ); + } + + void _onScrollingChanged() { + if (!widget.isScrollingNotifier.value) { + if (settings.useTvLayout) { + // using `autofocus` while scrolling seems to fail for widget built offscreen + // so we give focus to this page when the screen is no longer scrolling + _chipFocusNode.children.firstOrNull?.requestFocus(); + } + } + } +} + +class _BasicInfo extends StatefulWidget { + final AvesEntry entry; + final CollectionLens? collection; + + const _BasicInfo({ + required this.entry, + required this.collection, + }); + + @override + State<_BasicInfo> createState() => _BasicInfoState(); +} + +class _BasicInfoState extends State<_BasicInfo> { + Future<String?> _ownerPackageLoader = SynchronousFuture(null); + Future<void> _appNameLoader = SynchronousFuture(null); + + AvesEntry get entry => widget.entry; + + static const ownerPackageNamePropKey = 'owner_package_name'; + static const iconSize = 20.0; + + CollectionLens? get collection => widget.collection; + + @override + void initState() { + super.initState(); + if (!entry.trashed && entry.isMediaStoreMediaContent) { + _ownerPackageLoader = metadataFetchService.hasContentResolverProp(ownerPackageNamePropKey).then((exists) { + return exists ? metadataFetchService.getContentResolverProp(entry, ownerPackageNamePropKey) : SynchronousFuture(null); + }); + final isViewerMode = context.read<ValueNotifier<AppMode>>().value == AppMode.view; + if (isViewerMode && settings.isInstalledAppAccessAllowed) { + _appNameLoader = appInventory.initAppNames(); + } + } + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final infoUnknown = l10n.viewerInfoUnknown; + final locale = context.locale; + final use24hour = MediaQuery.alwaysUse24HourFormatOf(context); + + // TODO TLAD line break on all characters for the following fields when this is fixed: https://github.com/flutter/flutter/issues/61081 + // inserting ZWSP (\u200B) between characters does help, but it messes with width and height computation (another Flutter issue) + final title = entry.bestTitle ?? infoUnknown; + final date = entry.bestDate; + final dateText = date != null ? formatDateTime(date, locale, use24hour) : infoUnknown; + final showResolution = !entry.isSvg && entry.isSized; + final sizeText = entry.sizeBytes != null ? formatFileSize(locale, entry.sizeBytes!) : infoUnknown; + final path = entry.path; + + return FutureBuilder<String?>( + future: _ownerPackageLoader, + builder: (context, snapshot) { + final ownerPackage = snapshot.data; + return FutureBuilder<void>( + future: _appNameLoader, + builder: (context, snapshot) { + return InfoRowGroup( + info: { + l10n.viewerInfoLabelTitle: title, + l10n.viewerInfoLabelDate: dateText, + if (entry.isVideo) ..._buildVideoRows(context), + if (showResolution) l10n.viewerInfoLabelResolution: context.applyDirectionality(getRasterResolutionText(locale)), + l10n.viewerInfoLabelSize: context.applyDirectionality(sizeText), + if (!entry.trashed) l10n.viewerInfoLabelUri: entry.uri, + l10n.viewerInfoLabelPath: ?path, + if (path != null && path.isNotEmpty) + 'Album': (() { + final dir = p.dirname(path); + final isAlbum = collection?.source.rawAlbums.contains(dir) ?? false; + return isAlbum ? p.basename(dir) : '(non presente negli album)'; + })(), + l10n.viewerInfoLabelOwner: ?ownerPackage, + }, + spanBuilders: { + l10n.viewerInfoLabelOwner: _ownerHandler(ownerPackage), + }, + ); + }, + ); + }, + ); + } + + Map<String, String> _buildVideoRows(BuildContext context) { + return { + context.l10n.viewerInfoLabelDuration: entry.durationText, + }; + } + + InfoValueSpanBuilder _ownerHandler(String? ownerPackage) { + if (ownerPackage == null) return (context, key, value) => []; + + final appName = appInventory.getCurrentAppName(ownerPackage) ?? ownerPackage; + return (context, key, value) => [ + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Padding( + padding: const EdgeInsetsDirectional.only(start: 2, end: 4), + child: ConstrainedBox( + // use constraints instead of sizing `Image`, + // so that it can collapse when handling an empty image + constraints: const BoxConstraints( + maxWidth: iconSize, + maxHeight: iconSize, + ), + child: Image( + image: AppIconImage( + packageName: ownerPackage, + size: iconSize, + ), + ), + ), + ), + ), + TextSpan( + text: appName, + style: InfoRowGroup.valueStyle, + ), + ]; + } + + String getRasterResolutionText(String locale) { + var s = entry.getResolutionText(locale); + + // guess whether this is a photo, according to file type + final isPhoto = [MimeTypes.heic, MimeTypes.heif, MimeTypes.jpeg, MimeTypes.tiff].contains(entry.mimeType) || entry.isRaw; + if (isPhoto) { + final megaPixels = (entry.width * entry.height / 1000000).round(); + if (megaPixels > 0) { + s += ' • ${NumberFormat('0', locale).format(megaPixels)} MP'; + } + } + + return s; + } +} diff --git a/lib/widgets/viewer/info/color_section.dart b/lib/widgets/viewer/info/color_section.dart new file mode 100644 index 0000000..f72f96a --- /dev/null +++ b/lib/widgets/viewer/info/color_section.dart @@ -0,0 +1,126 @@ +import 'dart:async'; +import 'dart:isolate'; +import 'dart:math'; +import 'dart:ui' as ui; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/images.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/color_indicator.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:flex_color_picker/flex_color_picker.dart' as flex; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:palette_generator/palette_generator.dart'; +import 'package:provider/provider.dart'; + +class ColorSectionSliver extends StatefulWidget { + final AvesEntry entry; + + const ColorSectionSliver({super.key, required this.entry}); + + @override + State<ColorSectionSliver> createState() => _ColorSectionSliverState(); +} + +class _ColorSectionSliverState extends State<ColorSectionSliver> { + late final Future<List<Color>> _paletteLoader; + + @override + void initState() { + super.initState(); + final provider = widget.entry.getThumbnail(extent: min(200, widget.entry.displaySize.longestSide)); + _paletteLoader = _loadPalette(provider); + } + + @override + Widget build(BuildContext context) { + return SliverToBoxAdapter( + child: FutureBuilder<List<Color>>( + future: _paletteLoader, + builder: (context, snapshot) { + final colors = snapshot.data; + if (colors == null || colors.isEmpty) return const SizedBox(); + + final durations = context.watch<DurationsData>(); + return Wrap( + alignment: WrapAlignment.center, + children: AnimationConfiguration.toStaggeredList( + duration: durations.staggeredAnimation, + delay: durations.staggeredAnimationDelay * timeDilation, + childAnimationBuilder: (child) => SlideAnimation( + verticalOffset: 50.0, + child: FadeInAnimation( + child: child, + ), + ), + children: [ + const SectionRow(icon: AIcons.palette), + ...colors.map( + (v) => Padding( + padding: const EdgeInsets.all(8), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + ColorIndicator(value: v), + const SizedBox(width: 8), + Directionality( + textDirection: TextDirection.ltr, + child: SelectableText( + '#${v.hex}', + style: const TextStyle(fontFamily: 'monospace'), + ), + ), + ], + ), + ), + ), + ], + ), + ); + }, + ), + ); + } + + // `PaletteGenerator.fromImage()` directly blocks the main isolate, + // so we use another isolate to compute the palette + Future<List<Color>> _loadPalette(ImageProvider provider) async { + final stream = provider.resolve(ImageConfiguration.empty); + final imageCompleter = Completer<ui.Image>(); + late ImageStreamListener listener; + listener = ImageStreamListener((info, _) { + stream.removeListener(listener); + imageCompleter.complete(info.image); + }); + stream.addListener(listener); + final image = await imageCompleter.future; + final imageData = await image.toByteData(); + if (imageData == null) { + throw StateError('Failed to encode the image.'); + } + + final encodedImage = EncodedImage( + imageData, + width: image.width, + height: image.height, + ); + final generator = await _getPaletteGenerator(encodedImage); + return generator.paletteColors.map((v) => v.color).toList(); + } + + // the isolate does not start unless called from a static method + static Future<PaletteGenerator> _getPaletteGenerator(EncodedImage encodedImage) { + // `Isolate.run()` closure supports passing `EncodedImage` but not `ui.Image` + return Isolate.run( + () => PaletteGenerator.fromByteData( + encodedImage, + maximumColorCount: 10, + // do not use the default palette filter + filters: [], + ), + ); + } +} diff --git a/lib/widgets/viewer/info/common.dart b/lib/widgets/viewer/info/common.dart new file mode 100644 index 0000000..75f6945 --- /dev/null +++ b/lib/widgets/viewer/info/common.dart @@ -0,0 +1,198 @@ +import 'dart:math'; + +import 'package:aves/widgets/common/basic/link_chip.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +class SectionRow extends StatelessWidget { + final IconData icon; + + const SectionRow({ + super.key, + required this.icon, + }); + + @override + Widget build(BuildContext context) { + const dim = 32.0; + Widget buildDivider() => const SizedBox( + width: dim, + child: Divider( + thickness: AvesFilterChip.outlineWidth, + ), + ); + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + buildDivider(), + Padding( + padding: const EdgeInsets.all(16), + child: Icon( + icon, + size: dim, + ), + ), + buildDivider(), + ], + ); + } +} + +class InfoRowGroup extends StatefulWidget { + final Map<String, String> info; + final int maxValueLength; + final Map<String, InfoValueSpanBuilder> spanBuilders; + + static const int defaultMaxValueLength = 140; + static const double keyValuePadding = 16; + static const double fontSize = 13; + static const valueStyle = TextStyle(fontSize: fontSize); + static final _keyStyle = valueStyle.copyWith(height: 2.0); + + static TextStyle keyStyle(BuildContext context) { + final theme = Theme.of(context); + return theme.textTheme.bodySmall!.copyWith(color: theme.colorScheme.onSurfaceVariant).merge(_keyStyle); + } + + const InfoRowGroup({ + super.key, + required this.info, + this.maxValueLength = defaultMaxValueLength, + Map<String, InfoValueSpanBuilder>? spanBuilders, + }) : spanBuilders = spanBuilders ?? const {}; + + @override + State<InfoRowGroup> createState() => _InfoRowGroupState(); + + static InfoValueSpanBuilder linkSpanBuilder({ + required String Function(BuildContext context) linkText, + required void Function(BuildContext context) onTap, + }) { + return (context, key, value) { + value = linkText(context); + // `colorScheme.secondary` is overridden upstream as an `ExpansionTileCard` theming workaround, + // so we use `colorScheme.primary` instead + final linkColor = Theme.of(context).colorScheme.primary; + + return [ + WidgetSpan( + child: LinkChip( + text: value, + color: linkColor, + textStyle: InfoRowGroup.valueStyle, + // open link on tap + onTap: () => onTap(context), + ), + alignment: PlaceholderAlignment.middle, + ), + ]; + }; + } +} + +class _InfoRowGroupState extends State<InfoRowGroup> { + final List<String> _expandedKeys = []; + + Map<String, String> get keyValues => widget.info; + + int get maxValueLength => widget.maxValueLength; + + Map<String, InfoValueSpanBuilder> get spanBuilders => widget.spanBuilders; + + @override + Widget build(BuildContext context) { + if (keyValues.isEmpty) return const SizedBox(); + + final _keyStyle = InfoRowGroup.keyStyle(context); + + // compute the size of keys and space in order to align values + final textScaler = MediaQuery.textScalerOf(context); + final keySizes = Map.fromEntries(keyValues.keys.map((key) => MapEntry(key, _getSpanWidth(TextSpan(text: _buildTextValue(key), style: _keyStyle), textScaler)))); + + final lastKey = keyValues.keys.last; + return LayoutBuilder( + builder: (context, constraints) { + // find longest key below threshold + final maxBaseValueX = constraints.maxWidth / 3; + final baseValueX = keySizes.values.where((size) => size < maxBaseValueX).fold(0.0, max); + + return SelectableText.rich( + TextSpan( + children: keyValues.entries.expand( + (kv) { + final key = kv.key; + final value = kv.value; + final customSpanBuilder = spanBuilders[key]; + final spanBuilder = customSpanBuilder ?? _buildTextValueSpans; + final thisSpaceSize = max(0.0, (baseValueX - keySizes[key]!)) + InfoRowGroup.keyValuePadding; + + InlineSpan paddingSpan; + if (customSpanBuilder != null) { + // add padding using hair spaces instead of a straightforward `SizedBox` in a `WidgetSpan`, + // because ordering of multiple `WidgetSpan`s (e.g. with owner app icon) in Bidi context is tricky + final baseSpaceWidth = _getSpanWidth(TextSpan(text: '\u200A' * 100, style: _keyStyle), textScaler); + final spaceCount = (100 * thisSpaceSize / baseSpaceWidth).round(); + paddingSpan = TextSpan(text: '\u200A' * spaceCount); + } else { + final textScaleFactor = textScaler.scale(thisSpaceSize) / thisSpaceSize; + paddingSpan = WidgetSpan( + child: SizedBox( + width: thisSpaceSize / textScaleFactor, + // as of Flutter v3.0.0, the underline decoration from the following `TextSpan` + // is applied to the `WidgetSpan` too, so we add a dummy `Text` as a workaround + child: const Text(''), + ), + ); + } + + return [ + TextSpan(text: _buildTextValue(key), style: _keyStyle), + paddingSpan, + ...spanBuilder(context, key, value), + if (key != lastKey) const TextSpan(text: '\n'), + ]; + }, + ).toList(), + ), + style: InfoRowGroup.valueStyle, + ); + }, + ); + } + + double _getSpanWidth(TextSpan span, TextScaler textScaler) { + final paragraph = RenderParagraph( + span, + textDirection: TextDirection.ltr, + textScaler: textScaler, + )..layout(const BoxConstraints(), parentUsesSize: true); + final width = paragraph.getMaxIntrinsicWidth(double.infinity); + paragraph.dispose(); + return width; + } + + List<InlineSpan> _buildTextValueSpans(BuildContext context, String key, String value) { + GestureRecognizer? recognizer; + + // long values are clipped, and made expandable by tapping them + final showPreviewOnly = maxValueLength > 0 && value.length > maxValueLength && !_expandedKeys.contains(key); + if (showPreviewOnly) { + value = '${value.substring(0, maxValueLength)}…'; + // show full value on tap + recognizer = TapGestureRecognizer()..onTap = () => setState(() => _expandedKeys.add(key)); + } + + return [TextSpan(text: _buildTextValue(value), recognizer: recognizer)]; + } + + // each text span embeds and pops a Bidi isolate, + // so that layout of the spans follows the directionality of the locale + // (e.g. keys on the right for RTL locale, whatever the key intrinsic directionality) + // and each span respects the directionality of its inner text only + String _buildTextValue(String value) => '${Unicode.FSI}$value${Unicode.PDI}'; +} + +typedef InfoValueSpanBuilder = List<InlineSpan> Function(BuildContext context, String key, String value); diff --git a/lib/widgets/viewer/info/embedded/embedded_data_opener.dart b/lib/widgets/viewer/info/embedded/embedded_data_opener.dart new file mode 100644 index 0000000..513ee36 --- /dev/null +++ b/lib/widgets/viewer/info/embedded/embedded_data_opener.dart @@ -0,0 +1,91 @@ +import 'dart:async'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/keys.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/behaviour/routes.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/viewer/entry_viewer_page.dart'; +import 'package:aves/widgets/viewer/info/embedded/notifications.dart'; +import 'package:flutter/material.dart'; + +class EmbeddedDataOpener extends StatelessWidget with FeedbackMixin { + final bool enabled; + final AvesEntry entry; + final Widget child; + + const EmbeddedDataOpener({ + super.key, + required this.enabled, + required this.entry, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return NotificationListener<OpenEmbeddedDataNotification>( + onNotification: (notification) { + if (enabled) { + _openEmbeddedData(context, notification); + return true; + } + return false; + }, + child: child, + ); + } + + Future<void> _openEmbeddedData(BuildContext context, OpenEmbeddedDataNotification notification) async { + late Map fields; + switch (notification.source) { + case EmbeddedDataSource.googleDevice: + fields = await embeddedDataService.extractGoogleDeviceItem(entry, notification.dataUri!); + case EmbeddedDataSource.motionPhotoVideo: + fields = await embeddedDataService.extractMotionPhotoVideo(entry); + case EmbeddedDataSource.mpf: + fields = await embeddedDataService.extractJpegMpfItem(entry, notification.mpfId!); + case EmbeddedDataSource.videoCover: + fields = await embeddedDataService.extractVideoEmbeddedPicture(entry); + case EmbeddedDataSource.xmp: + fields = await embeddedDataService.extractXmpDataProp(entry, notification.props, notification.mimeType); + } + AvesEntry.normalizeMimeTypeFields(fields); + final mimeType = fields[EntryFields.mimeType] as String?; + final uri = fields[EntryFields.uri] as String?; + if (mimeType == null || uri == null) { + showFeedback(context, FeedbackType.warn, context.l10n.viewerInfoOpenEmbeddedFailureFeedback); + return; + } + + if (!MimeTypes.isImage(mimeType) && !MimeTypes.isVideo(mimeType)) { + // open with another app + unawaited( + appService.open(uri, mimeType, forceChooser: true).then((success) { + if (!success) { + // fallback to sharing, so that the file can be saved somewhere + appService.shareSingle(uri, mimeType).then((success) { + if (!success) showNoMatchingAppDialog(context); + }); + } + }), + ); + return; + } + + _openTempEntry(context, AvesEntry.fromMap(fields)); + } + + void _openTempEntry(BuildContext context, AvesEntry tempEntry) { + Navigator.maybeOf(context)?.push( + TransparentMaterialPageRoute( + settings: const RouteSettings(name: EntryViewerPage.routeName), + pageBuilder: (context, a, sa) => EntryViewerPage( + initialEntry: tempEntry, + ), + ), + ); + } +} diff --git a/lib/widgets/viewer/info/embedded/notifications.dart b/lib/widgets/viewer/info/embedded/notifications.dart new file mode 100644 index 0000000..08d7b4d --- /dev/null +++ b/lib/widgets/viewer/info/embedded/notifications.dart @@ -0,0 +1,52 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +enum EmbeddedDataSource { googleDevice, motionPhotoVideo, mpf, videoCover, xmp } + +@immutable +class OpenEmbeddedDataNotification extends Notification { + final EmbeddedDataSource source; + final List<dynamic>? props; + final String? mimeType, dataUri; + final int? mpfId; + + const OpenEmbeddedDataNotification._private({ + required this.source, + this.props, + this.mimeType, + this.dataUri, + this.mpfId, + }); + + factory OpenEmbeddedDataNotification.googleDevice({ + required String dataUri, + }) => OpenEmbeddedDataNotification._private( + source: EmbeddedDataSource.googleDevice, + dataUri: dataUri, + ); + + factory OpenEmbeddedDataNotification.motionPhotoVideo() => const OpenEmbeddedDataNotification._private( + source: EmbeddedDataSource.motionPhotoVideo, + ); + + factory OpenEmbeddedDataNotification.mpf(int id) => OpenEmbeddedDataNotification._private( + source: EmbeddedDataSource.mpf, + mpfId: id, + ); + + factory OpenEmbeddedDataNotification.videoCover() => const OpenEmbeddedDataNotification._private( + source: EmbeddedDataSource.videoCover, + ); + + factory OpenEmbeddedDataNotification.xmp({ + required List<dynamic> props, + required String mimeType, + }) => OpenEmbeddedDataNotification._private( + source: EmbeddedDataSource.xmp, + props: props, + mimeType: mimeType, + ); + + @override + String toString() => '$runtimeType#${shortHash(this)}{source=$source, props=$props, mimeType=$mimeType, dataUri=$dataUri, index=$mpfId}'; +} diff --git a/lib/widgets/viewer/info/info_app_bar.dart b/lib/widgets/viewer/info/info_app_bar.dart new file mode 100644 index 0000000..f6f1385 --- /dev/null +++ b/lib/widgets/viewer/info/info_app_bar.dart @@ -0,0 +1,127 @@ +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/app_bar/app_bar_title.dart'; +import 'package:aves/widgets/common/app_bar/sliver_app_bar_title.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/search/route.dart'; +import 'package:aves/widgets/viewer/action/entry_info_action_delegate.dart'; +import 'package:aves/widgets/viewer/info/info_search_delegate.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_dir.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +class InfoAppBar extends StatelessWidget { + final AvesEntry entry; + final CollectionLens? collection; + final EntryInfoActionDelegate actionDelegate; + final ValueNotifier<Map<String, MetadataDirectory>> metadataNotifier; + final VoidCallback onBackPressed; + + const InfoAppBar({ + super.key, + required this.entry, + required this.collection, + required this.actionDelegate, + required this.metadataNotifier, + required this.onBackPressed, + }); + + @override + Widget build(BuildContext context) { + final appMode = context.watch<ValueNotifier<AppMode>>().value; + bool isVisible(EntryAction action) => actionDelegate.isVisible( + appMode: appMode, + targetEntry: entry, + action: action, + ); + final commonActions = EntryActions.commonMetadataActions.where(isVisible); + final formatSpecificActions = EntryActions.formatSpecificMetadataActions.where(isVisible); + final useTvLayout = settings.useTvLayout; + final animations = context.select<Settings, AccessibilityAnimations>((v) => v.accessibilityAnimations); + return SliverAppBar( + leading: useTvLayout + ? null + : FontSizeIconTheme( + child: IconButton( + // key is expected by test driver + key: const Key('back-button'), + icon: const Icon(AIcons.goUp), + onPressed: onBackPressed, + tooltip: context.l10n.viewerInfoBackToViewerTooltip, + ), + ), + automaticallyImplyLeading: false, + title: SliverAppBarTitleWrapper( + child: InteractiveAppBarTitle( + onTap: () => _goToSearch(context), + child: Text(context.l10n.viewerInfoPageTitle), + ), + ), + actions: useTvLayout + ? [] + : [ + IconButton( + icon: const Icon(AIcons.search), + onPressed: () => _goToSearch(context), + tooltip: MaterialLocalizations.of(context).searchFieldLabel, + ), + if (entry.canEdit) + PopupMenuButton<EntryAction>( + itemBuilder: (context) => [ + ...commonActions.map((action) => _toMenuItem(context, action, enabled: actionDelegate.canApply(entry, action))), + if (formatSpecificActions.isNotEmpty) ...[ + const PopupMenuDivider(), + ...formatSpecificActions.map((action) => _toMenuItem(context, action, enabled: actionDelegate.canApply(entry, action))), + ], + if (isVisible(EntryAction.debug)) ...[ + const PopupMenuDivider(), + _toMenuItem(context, EntryAction.debug, enabled: true), + ], + ], + onSelected: (action) async { + // wait for the popup menu to hide before proceeding with the action + await Future.delayed(animations.popUpAnimationDelay * timeDilation); + await actionDelegate.onActionSelected(context, entry, collection, action); + }, + popUpAnimationStyle: animations.popUpAnimationStyle, + ), + ].map((v) => FontSizeIconTheme(child: v)).toList(), + floating: true, + ); + } + + PopupMenuItem<EntryAction> _toMenuItem(BuildContext context, EntryAction action, {required bool enabled}) { + return PopupMenuItem( + value: action, + enabled: enabled, + child: MenuRow(text: action.getText(context), icon: action.getIcon()), + ); + } + + void _goToSearch(BuildContext context) { + final isSelecting = context.read<Selection<AvesEntry>?>()?.isSelecting ?? false; + Navigator.maybeOf(context)?.push( + SearchPageRoute( + delegate: InfoSearchDelegate( + searchFieldLabel: context.l10n.viewerInfoSearchFieldLabel, + searchFieldStyle: Themes.searchFieldStyle(context), + entry: entry, + metadataNotifier: metadataNotifier, + isSelecting: isSelecting, + ), + ), + ); + } +} diff --git a/lib/widgets/viewer/info/info_page.dart b/lib/widgets/viewer/info/info_page.dart new file mode 100644 index 0000000..0326d63 --- /dev/null +++ b/lib/widgets/viewer/info/info_page.dart @@ -0,0 +1,292 @@ +import 'dart:async'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/basic/tv_edge_focus.dart'; +import 'package:aves/widgets/viewer/action/entry_info_action_delegate.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves/widgets/viewer/info/basic_section.dart'; +import 'package:aves/widgets/viewer/info/color_section.dart'; +import 'package:aves/widgets/viewer/info/embedded/embedded_data_opener.dart'; +import 'package:aves/widgets/viewer/info/info_app_bar.dart'; +import 'package:aves/widgets/viewer/info/location_section.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_dir.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_section.dart'; +import 'package:aves/widgets/viewer/multipage/conductor.dart'; +import 'package:aves/widgets/viewer/page_entry_builder.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class InfoPage extends StatefulWidget { + final CollectionLens? collection; + final ValueNotifier<AvesEntry?> entryNotifier; + final ValueNotifier<bool> isScrollingNotifier; + + const InfoPage({ + super.key, + required this.collection, + required this.entryNotifier, + required this.isScrollingNotifier, + }); + + @override + State<StatefulWidget> createState() => _InfoPageState(); +} + +class _InfoPageState extends State<InfoPage> { + final ScrollController _scrollController = ScrollController(); + bool _scrollStartFromTop = false; + + static const splitScreenWidthThreshold = 600; + + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AvesScaffold( + body: GestureAreaProtectorStack( + child: SafeArea( + bottom: false, + child: NotificationListener<ScrollNotification>( + onNotification: _handleTopScroll, + child: ValueListenableBuilder<AvesEntry?>( + valueListenable: widget.entryNotifier, + builder: (context, mainEntry, child) { + if (mainEntry == null) return const SizedBox(); + + final isSelecting = context.select<Selection<AvesEntry>?, bool>((v) => v?.isSelecting ?? false); + Widget _buildContent({AvesEntry? pageEntry}) { + final targetEntry = pageEntry ?? mainEntry; + return EmbeddedDataOpener( + enabled: !isSelecting, + entry: targetEntry, + child: _InfoPageContent( + collection: widget.collection, + entry: targetEntry, + isScrollingNotifier: widget.isScrollingNotifier, + scrollController: _scrollController, + split: MediaQuery.sizeOf(context).width > splitScreenWidthThreshold, + goToViewer: _goToViewer, + ), + ); + } + + return mainEntry.isStack + ? PageEntryBuilder( + multiPageController: context.read<MultiPageConductor>().getController(mainEntry), + builder: (pageEntry) => _buildContent(pageEntry: pageEntry), + ) + : _buildContent(); + }, + ), + ), + ), + ), + resizeToAvoidBottomInset: false, + ); + } + + bool _handleTopScroll(ScrollNotification notification) { + if (notification is ScrollStartNotification) { + final metrics = notification.metrics; + _scrollStartFromTop = metrics.pixels == metrics.minScrollExtent; + } + if (_scrollStartFromTop) { + if (notification is ScrollUpdateNotification) { + _scrollStartFromTop = notification.scrollDelta! < 0; + } else if (notification is ScrollEndNotification) { + _scrollStartFromTop = false; + } else if (notification is OverscrollNotification) { + if (notification.overscroll < 0) { + _goToViewer(); + _scrollStartFromTop = false; + } + } + } + return false; + } + + void _goToViewer() { + ShowImageNotification().dispatch(context); + _scrollController.animateTo( + 0, + duration: ADurations.pageTransitionLoose, + curve: Curves.easeInOut, + ); + } +} + +class _InfoPageContent extends StatefulWidget { + final CollectionLens? collection; + final AvesEntry entry; + final ValueNotifier<bool> isScrollingNotifier; + final ScrollController scrollController; + final bool split; + final VoidCallback goToViewer; + + const _InfoPageContent({ + required this.collection, + required this.entry, + required this.isScrollingNotifier, + required this.scrollController, + required this.split, + required this.goToViewer, + }); + + @override + State<_InfoPageContent> createState() => _InfoPageContentState(); +} + +class _InfoPageContentState extends State<_InfoPageContent> { + final Set<StreamSubscription> _subscriptions = {}; + late EntryInfoActionDelegate _actionDelegate; + final ValueNotifier<Map<String, MetadataDirectory>> _metadataNotifier = ValueNotifier({}); + final ValueNotifier<EntryAction?> _isEditingMetadataNotifier = ValueNotifier(null); + + static const horizontalPadding = EdgeInsets.symmetric(horizontal: 8); + + CollectionLens? get collection => widget.collection; + + AvesEntry get entry => widget.entry; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant _InfoPageContent oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.entry != widget.entry) { + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + } + + @override + void dispose() { + _metadataNotifier.dispose(); + _isEditingMetadataNotifier.dispose(); + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(_InfoPageContent widget) { + _actionDelegate = EntryInfoActionDelegate(); + _subscriptions.add(_actionDelegate.eventStream.listen(_onActionDelegateEvent)); + } + + void _unregisterWidget(_InfoPageContent widget) { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + @override + Widget build(BuildContext context) { + final basicSection = BasicSection( + entry: entry, + collection: collection, + actionDelegate: _actionDelegate, + isScrollingNotifier: widget.isScrollingNotifier, + isEditingMetadataNotifier: _isEditingMetadataNotifier, + onFilterSelection: _onFilterSelection, + ); + final locationAtTop = widget.split && entry.hasGps; + final locationSection = LocationSection( + collection: collection, + entry: entry, + showTitle: !locationAtTop, + isScrollingNotifier: widget.isScrollingNotifier, + onFilterSelection: _onFilterSelection, + ); + final basicAndLocationSliver = locationAtTop + ? SliverToBoxAdapter( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded(child: basicSection), + const SizedBox(width: 8), + Expanded(child: locationSection), + ], + ), + ) + : SliverList( + delegate: SliverChildListDelegate.fixed( + [ + basicSection, + locationSection, + ], + ), + ); + + return NotificationListener<SelectFilterNotification>( + onNotification: (notification) { + _onFilterSelection(notification.filter); + return true; + }, + child: CustomScrollView( + controller: widget.scrollController, + slivers: [ + const SliverToBoxAdapter( + child: TvEdgeFocus(), + ), + InfoAppBar( + entry: entry, + collection: collection, + actionDelegate: _actionDelegate, + metadataNotifier: _metadataNotifier, + onBackPressed: widget.goToViewer, + ), + SliverPadding( + padding: horizontalPadding + const EdgeInsets.only(top: 8), + sliver: basicAndLocationSliver, + ), + SliverPadding( + padding: horizontalPadding + const EdgeInsets.only(bottom: 8), + sliver: MetadataSectionSliver( + entry: entry, + metadataNotifier: _metadataNotifier, + ), + ), + if (!settings.useTvLayout) + SliverPadding( + padding: horizontalPadding + const EdgeInsets.only(bottom: 8), + sliver: ColorSectionSliver(entry: entry), + ), + const BottomPaddingSliver(), + ], + ), + ); + } + + void _onActionDelegateEvent(ActionEvent<EntryAction> event) { + Future.delayed(ADurations.dialogTransitionLoose).then((_) { + if (!mounted) return; + if (event is ActionStartedEvent) { + _isEditingMetadataNotifier.value = event.action; + } else if (event is ActionEndedEvent) { + _isEditingMetadataNotifier.value = null; + } + }); + } + + void _onFilterSelection(CollectionFilter filter) { + if (!mounted) return; + SelectFilterNotification(filter).dispatch(context); + } +} diff --git a/lib/widgets/viewer/info/info_search_delegate.dart b/lib/widgets/viewer/info/info_search_delegate.dart new file mode 100644 index 0000000..935c8a7 --- /dev/null +++ b/lib/widgets/viewer/info/info_search_delegate.dart @@ -0,0 +1,139 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/common/search/delegate.dart'; +import 'package:aves/widgets/viewer/info/embedded/embedded_data_opener.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_dir.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_dir_tile.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class InfoSearchDelegate extends AvesSearchDelegate { + final AvesEntry entry; + final ValueNotifier<Map<String, MetadataDirectory>> metadataNotifier; + final bool isSelecting; + + Map<String, MetadataDirectory> get metadata => metadataNotifier.value; + + static const pageRouteName = '/info/search'; + + InfoSearchDelegate({ + required super.searchFieldLabel, + required super.searchFieldStyle, + required this.entry, + required this.metadataNotifier, + required this.isSelecting, + }) : super( + routeName: pageRouteName, + ); + + @override + Widget? buildLeading(BuildContext context) { + return IconButton( + icon: AnimatedIcon( + icon: AnimatedIcons.menu_arrow, + progress: transitionAnimation, + ), + onPressed: () => Navigator.maybeOf(context)?.pop(), + tooltip: MaterialLocalizations.of(context).backButtonTooltip, + ); + } + + @override + List<Widget>? buildActions(BuildContext context) { + return [ + if (query.isNotEmpty) + IconButton( + icon: const Icon(AIcons.clear), + onPressed: () { + query = ''; + showSuggestions(context); + }, + tooltip: context.l10n.clearTooltip, + ), + ]; + } + + @override + Widget buildSuggestions(BuildContext context) { + final l10n = context.l10n; + final suggestions = { + l10n.viewerInfoSearchSuggestionDate: 'date or time or when -timer -uptime -exposure -timeline -verbatim', + l10n.viewerInfoSearchSuggestionDescription: 'description or title or comment or textual or abstract or object name -line', + l10n.viewerInfoSearchSuggestionDimensions: 'width or height or dimension or framesize or imagelength', + l10n.viewerInfoSearchSuggestionResolution: 'resolution', + l10n.viewerInfoSearchSuggestionRights: 'rights or copyright or attribution or license or artist or creator or by-line or credit -tool', + }; + return ListView( + children: suggestions.entries + .map( + (kv) => ListTile( + title: Text(kv.key), + onTap: () { + query = kv.value; + showResults(context); + }, + ), + ) + .toList(), + ); + } + + @override + Widget buildResults(BuildContext context) { + if (query.isEmpty) { + showSuggestions(context); + return const SizedBox(); + } + + final queryParts = query.toUpperCase().split(' ')..removeWhere((s) => s.isEmpty); + final queryExcludeIncludeGroups = groupBy<String, bool>(queryParts, (s) => s.startsWith('-')); + final queryExcludeAll = (queryExcludeIncludeGroups[true] ?? []).map((s) => s.substring(1)); + final queryIncludeAny = (queryExcludeIncludeGroups[false] ?? []).join(' ').split(' OR '); + + bool testKey(String key) { + key = key.toUpperCase(); + return queryIncludeAny.any(key.contains) && queryExcludeAll.every((q) => !key.contains(q)); + } + + final filteredMetadata = Map.fromEntries( + metadata.entries.map((kv) { + final filteredDir = kv.value.filterKeys(testKey); + return MapEntry(kv.key, filteredDir); + }), + ); + + final tiles = filteredMetadata.entries + .where((kv) => kv.value.tags.isNotEmpty) + .map( + (kv) => MetadataDirTile( + entry: entry, + title: kv.key, + dir: kv.value, + initiallyExpanded: true, + showThumbnails: false, + ), + ) + .toList(); + return MediaQueryDataProvider( + child: SafeArea( + child: tiles.isEmpty + ? EmptyContent( + icon: AIcons.info, + text: context.l10n.viewerInfoSearchEmpty, + ) + : EmbeddedDataOpener( + enabled: !isSelecting, + entry: entry, + child: ListView.builder( + padding: const EdgeInsets.all(8), + itemBuilder: (context, index) => tiles[index], + itemCount: tiles.length, + ), + ), + ), + ); + } +} diff --git a/lib/widgets/viewer/info/location_section.dart b/lib/widgets/viewer/info/location_section.dart new file mode 100644 index 0000000..73388c9 --- /dev/null +++ b/lib/widgets/viewer/info/location_section.dart @@ -0,0 +1,233 @@ +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/settings/enums/coordinate_format.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/common/map/geo_map.dart'; +import 'package:aves/widgets/common/map/map_action_delegate.dart'; +import 'package:aves/widgets/common/providers/map_theme_provider.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/map/map_page.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class LocationSection extends StatefulWidget { + final CollectionLens? collection; + final AvesEntry entry; + final bool showTitle; + final ValueNotifier<bool> isScrollingNotifier; + final AFilterCallback onFilterSelection; + + const LocationSection({ + super.key, + required this.collection, + required this.entry, + required this.showTitle, + required this.isScrollingNotifier, + required this.onFilterSelection, + }); + + @override + State<LocationSection> createState() => _LocationSectionState(); +} + +class _LocationSectionState extends State<LocationSection> { + final AvesMapController _mapController = AvesMapController(); + + CollectionLens? get collection => widget.collection; + + AvesEntry get entry => widget.entry; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant LocationSection oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(LocationSection widget) { + widget.entry.metadataChangeNotifier.addListener(_onMetadataChanged); + } + + void _unregisterWidget(LocationSection widget) { + widget.entry.metadataChangeNotifier.removeListener(_onMetadataChanged); + } + + @override + Widget build(BuildContext context) { + if (!entry.hasGps) return const SizedBox(); + + final canNavigate = context.select<ValueNotifier<AppMode>, bool>((v) => v.value.canNavigate); + return NotificationListener( + onNotification: (notification) { + if (notification is OpenMapAppNotification) { + _openMapApp(); + return true; + } + return false; + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (widget.showTitle) const SectionRow(icon: AIcons.location), + MapTheme( + interactive: false, + showCoordinateFilter: false, + navigationButton: canNavigate ? MapNavigationButton.map : MapNavigationButton.none, + visualDensity: VisualDensity.compact, + mapHeight: 200, + child: GeoMap( + controller: _mapController, + entries: [entry], + availableSize: MediaQuery.sizeOf(context), + isAnimatingNotifier: widget.isScrollingNotifier, + onUserZoomChange: (zoom) => settings.infoMapZoom = zoom.roundToDouble(), + onMarkerTap: collection != null && canNavigate ? (location, entry) => _openMapPage(context) : null, + openMapPage: collection != null ? _openMapPage : null, + ), + ), + AnimatedBuilder( + animation: entry.addressChangeNotifier, + builder: (context, child) { + final filters = <LocationFilter>[]; + if (entry.hasAddress) { + final address = entry.addressDetails!; + final country = address.countryName; + if (country != null && country.isNotEmpty) filters.add(LocationFilter(LocationLevel.country, '$country${LocationFilter.locationSeparator}${address.countryCode}')); + final state = address.stateName; + if (state != null && state.isNotEmpty) filters.add(LocationFilter(LocationLevel.state, '$state${LocationFilter.locationSeparator}${address.stateCode}')); + final place = address.place; + if (place != null && place.isNotEmpty) filters.add(LocationFilter(LocationLevel.place, place)); + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _AddressInfoGroup(entry: entry), + if (filters.isNotEmpty) + Padding( + padding: const EdgeInsets.symmetric(horizontal: AvesFilterChip.outlineWidth / 2) + const EdgeInsets.only(top: 8), + child: Wrap( + spacing: 8, + runSpacing: 8, + children: filters + .map( + (filter) => AvesFilterChip( + filter: filter, + onTap: widget.onFilterSelection, + ), + ) + .toList(), + ), + ), + ], + ); + }, + ), + ], + ), + ); + } + + Future<void> _openMapPage(BuildContext context) async { + final baseCollection = collection; + if (baseCollection == null) return; + + final mapCollection = baseCollection.copyWith( + listenToSource: true, + fixedSelection: baseCollection.sortedEntries.where((entry) => entry.hasGps).toList(), + ); + await Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: MapPage.routeName), + builder: (context) => MapPage( + collection: mapCollection, + initialEntry: entry, + ), + ), + ); + } + + Future<void> _openMapApp() async { + final latLng = entry.latLng; + if (latLng != null) { + await appService.openMap(latLng).then((success) { + if (!success) showNoMatchingAppDialog(context); + }); + } + } + + void _onMetadataChanged() { + setState(() {}); + + final location = entry.latLng; + if (location != null) { + _mapController.notifyMarkerLocationChange(); + _mapController.moveTo(location); + } + } +} + +class _AddressInfoGroup extends StatefulWidget { + final AvesEntry entry; + + const _AddressInfoGroup({required this.entry}); + + @override + State<_AddressInfoGroup> createState() => _AddressInfoGroupState(); +} + +class _AddressInfoGroupState extends State<_AddressInfoGroup> { + late Future<String?> _addressLineLoader; + + AvesEntry get entry => widget.entry; + + @override + void initState() { + super.initState(); + _addressLineLoader = availability.canLocatePlaces.then((connected) { + if (connected) { + return entry.findAddressLine(geocoderLocale: settings.appliedLocale); + } + return null; + }); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder<String?>( + future: _addressLineLoader, + builder: (context, snapshot) { + final fullAddress = !snapshot.hasError && snapshot.connectionState == ConnectionState.done ? snapshot.data : null; + final address = fullAddress ?? entry.shortAddress; + final l10n = context.l10n; + return InfoRowGroup( + info: { + l10n.viewerInfoLabelCoordinates: settings.coordinateFormat.format(context, entry.latLng!), + if (address.isNotEmpty) l10n.viewerInfoLabelAddress: address, + }, + ); + }, + ); + } +} diff --git a/lib/widgets/viewer/info/metadata/geotiff.dart b/lib/widgets/viewer/info/metadata/geotiff.dart new file mode 100644 index 0000000..fb647b9 --- /dev/null +++ b/lib/widgets/viewer/info/metadata/geotiff.dart @@ -0,0 +1,3847 @@ +import 'package:aves/ref/metadata/geotiff.dart'; + +class GeoTiffDirectory { + // TODO TLAD [geotiff] avoid string-based match + static int? tagForName(String name) { + switch (name) { + case 'Model Type': + return GeoTiffKeys.modelType; + case 'Raster Type': + return GeoTiffKeys.rasterType; + case 'Geographic Type': + return GeoTiffKeys.geographicType; + case 'Geographic Geodetic Datum': + return GeoTiffKeys.geogGeodeticDatum; + case 'Geographic Angular Units': + return GeoTiffKeys.geogAngularUnits; + case 'Geographic Ellipsoid': + return GeoTiffKeys.geogEllipsoid; + case 'Projected Coordinate System Type': + return GeoTiffKeys.projCSType; + case 'Projection': + return GeoTiffKeys.projection; + case 'Projected Coordinate Transform': + return GeoTiffKeys.projCoordinateTransform; + case 'Projection Linear Units': + return GeoTiffKeys.projLinearUnits; + case 'Vertical Units': + return GeoTiffKeys.verticalUnits; + default: + return null; + } + } + + static String formatValue(int? tag, String v) { + switch (tag) { + case GeoTiffKeys.modelType: + return getModelTypeDescription(v); + case GeoTiffKeys.rasterType: + return getRasterTypeDescription(v); + case GeoTiffKeys.geographicType: + return getGeographicTypeDescription(v); + case GeoTiffKeys.geogGeodeticDatum: + return getGeogGeodeticDatumDescription(v); + case GeoTiffKeys.geogEllipsoid: + return getGeogEllipsoidDescription(v); + case GeoTiffKeys.projCSType: + return getProjCSTypeDescription(v); + case GeoTiffKeys.projection: + return getProjectionDescription(v); + case GeoTiffKeys.projCoordinateTransform: + return getProjCoordinateTransformDescription(v); + case GeoTiffKeys.projLinearUnits: + case GeoTiffKeys.geogAngularUnits: + case GeoTiffKeys.verticalUnits: + return getGeoTiffUnitsDescription(v); + default: + return v; + } + } + + static String getModelTypeDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 1: + return 'Projected'; + case 2: + return 'Geographic'; + case 3: + return 'Geocentric'; + case 32767: + return 'User Defined'; + default: + return 'Unknown ($value)'; + } + } + + static String getRasterTypeDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 1: + return 'Pixel Is Area'; + case 2: + return 'Pixel Is Point'; + case 32767: + return 'User Defined'; + default: + return 'Unknown ($value)'; + } + } + + static String getGeographicTypeDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 4001: + return 'Airy 1830'; + case 4002: + return 'Airy Modified 1849'; + case 4003: + return 'Australian National Spheroid'; + case 4004: + return 'Bessel 1841'; + case 4005: + return 'Bessel Modified'; + case 4006: + return 'Bessel Namibia'; + case 4007: + return 'Clarke 1858'; + case 4008: + return 'Clarke 1866'; + case 4009: + return 'Clarke 1866 Michigan'; + case 4010: + return 'Clarke 1880 Benoit'; + case 4011: + return 'Clarke 1880 IGN'; + case 4012: + return 'Clarke 1880 RGS'; + case 4013: + return 'Clarke 1880 Arc'; + case 4014: + return 'Clarke 1880 SGA 1922'; + case 4015: + return 'Everest 1830 1937 Adjustment'; + case 4016: + return 'Everest 1830 1967 Definition'; + case 4017: + return 'Everest 1830 1975 Definition'; + case 4018: + return 'Everest 1830 Modified'; + case 4019: + return 'GRS 1980'; + case 4020: + return 'Helmert 1906'; + case 4021: + return 'Indonesian National Spheroid'; + case 4022: + return 'International 1924'; + case 4023: + return 'International 1967'; + case 4024: + return 'Krassowsky 1940'; + case 4025: + return 'NWL9D'; + case 4026: + return 'NWL10D'; + case 4027: + return 'Plessis 1817'; + case 4028: + return 'Struve 1860'; + case 4029: + return 'War Office'; + case 4030: + return 'WGS84'; + case 4031: + return 'GEM10C'; + case 4032: + return 'OSU86F'; + case 4033: + return 'OSU91A'; + case 4034: + return 'Clarke 1880'; + case 4035: + return 'Sphere'; + case 4120: + return 'Greek'; + case 4121: + return 'GGRS87'; + case 4123: + return 'KKJ'; + case 4124: + return 'RT90'; + case 4133: + return 'EST92'; + case 4201: + return 'Adindan'; + case 4202: + return 'AGD66'; + case 4203: + return 'AGD84'; + case 4204: + return 'Ain el Abd'; + case 4205: + return 'Afgooye'; + case 4206: + return 'Agadez'; + case 4207: + return 'Lisbon'; + case 4208: + return 'Aratu'; + case 4209: + return 'Arc 1950'; + case 4210: + return 'Arc 1960'; + case 4211: + return 'Batavia'; + case 4212: + return 'Barbados'; + case 4213: + return 'Beduaram'; + case 4214: + return 'Beijing 1954'; + case 4215: + return 'Belge 1950'; + case 4216: + return 'Bermuda 1957'; + case 4217: + return 'Bern 1898'; + case 4218: + return 'Bogota'; + case 4219: + return 'Bukit Rimpah'; + case 4220: + return 'Camacupa'; + case 4221: + return 'Campo Inchauspe'; + case 4222: + return 'Cape'; + case 4223: + return 'Carthage'; + case 4224: + return 'Chua'; + case 4225: + return 'Corrego Alegre'; + case 4226: + return 'Cote d Ivoire'; + case 4227: + return 'Deir ez Zor'; + case 4228: + return 'Douala'; + case 4229: + return 'Egypt 1907'; + case 4230: + return 'ED50'; + case 4231: + return 'ED87'; + case 4232: + return 'Fahud'; + case 4233: + return 'Gandajika 1970'; + case 4234: + return 'Garoua'; + case 4235: + return 'Guyane Francaise'; + case 4236: + return 'Hu Tzu Shan'; + case 4237: + return 'HD72'; + case 4238: + return 'ID74'; + case 4239: + return 'Indian 1954'; + case 4240: + return 'Indian 1975'; + case 4241: + return 'Jamaica 1875'; + case 4242: + return 'JAD69'; + case 4243: + return 'Kalianpur'; + case 4244: + return 'Kandawala'; + case 4245: + return 'Kertau'; + case 4246: + return 'KOC'; + case 4247: + return 'La Canoa'; + case 4248: + return 'PSAD56'; + case 4249: + return 'Lake'; + case 4250: + return 'Leigon'; + case 4251: + return 'Liberia 1964'; + case 4252: + return 'Lome'; + case 4253: + return 'Luzon 1911'; + case 4254: + return 'Hito XVIII 1963'; + case 4255: + return 'Herat North'; + case 4256: + return 'Mahe 1971'; + case 4257: + return 'Makassar'; + case 4258: + return 'EUREF89'; + case 4259: + return 'Malongo 1987'; + case 4260: + return 'Manoca'; + case 4261: + return 'Merchich'; + case 4262: + return 'Massawa'; + case 4263: + return 'Minna'; + case 4264: + return 'Mhast'; + case 4265: + return 'Monte Mario'; + case 4266: + return 'M poraloko'; + case 4267: + return 'NAD27'; + case 4268: + return 'NAD Michigan'; + case 4269: + return 'NAD83'; + case 4270: + return 'Nahrwan 1967'; + case 4271: + return 'Naparima 1972'; + case 4272: + return 'GD49'; + case 4273: + return 'NGO 1948'; + case 4274: + return '73'; + case 4275: + return 'NTF'; + case 4276: + return 'NSWC 9Z 2'; + case 4277: + return 'OSGB 1936'; + case 4278: + return 'OSGB70'; + case 4279: + return 'OS SN80'; + case 4280: + return 'Padang'; + case 4281: + return 'Palestine 1923'; + case 4282: + return 'Pointe Noire'; + case 4283: + return 'GDA94'; + case 4284: + return 'Pulkovo 1942'; + case 4285: + return 'Qatar'; + case 4286: + return 'Qatar 1948'; + case 4287: + return 'Qornoq'; + case 4288: + return 'Loma Quintana'; + case 4289: + return 'Amersfoort'; + case 4290: + return 'RT38'; + case 4291: + return 'SAD69'; + case 4292: + return 'Sapper Hill 1943'; + case 4293: + return 'Schwarzeck'; + case 4294: + return 'Segora'; + case 4295: + return 'Serindung'; + case 4296: + return 'Sudan'; + case 4297: + return 'Tananarive'; + case 4298: + return 'Timbalai 1948'; + case 4299: + return 'TM65'; + case 4300: + return 'TM75'; + case 4301: + return 'Tokyo'; + case 4302: + return 'Trinidad 1903'; + case 4303: + return 'TC 1948'; + case 4304: + return 'Voirol 1875'; + case 4305: + return 'Voirol Unifie'; + case 4306: + return 'Bern 1938'; + case 4307: + return 'Nord Sahara 1959'; + case 4308: + return 'Stockholm 1938'; + case 4309: + return 'Yacare'; + case 4310: + return 'Yoff'; + case 4311: + return 'Zanderij'; + case 4312: + return 'MGI'; + case 4313: + return 'Belge 1972'; + case 4314: + return 'DHDN'; + case 4315: + return 'Conakry 1905'; + case 4317: + return 'Dealul Piscului 1970'; + case 4322: + return 'WGS 72'; + case 4324: + return 'WGS 72BE'; + case 4326: + return 'WGS 84'; + case 4801: + return 'Bern 1898 Bern'; + case 4802: + return 'Bogota Bogota'; + case 4803: + return 'Lisbon Lisbon'; + case 4804: + return 'Makassar Jakarta'; + case 4805: + return 'MGI Ferro'; + case 4806: + return 'Monte Mario Rome'; + case 4807: + return 'NTF Paris'; + case 4808: + return 'Padang Jakarta'; + case 4809: + return 'Belge 1950 Brussels'; + case 4810: + return 'Tananarive Paris'; + case 4811: + return 'Voirol 1875 Paris'; + case 4812: + return 'Voirol Unifie Paris'; + case 4813: + return 'Batavia Jakarta'; + case 4815: + return 'Greek Athens'; + case 4901: + return 'ATF Paris'; + case 4902: + return 'NDG Paris'; + case 32767: + return 'User Defined'; + default: + return 'Unknown ($value)'; + } + } + + static String getGeogGeodeticDatumDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 6001: + return 'Airy 1830'; + case 6002: + return 'Airy Modified 1849'; + case 6003: + return 'Australian National Spheroid'; + case 6004: + return 'Bessel 1841'; + case 6005: + return 'Bessel Modified'; + case 6006: + return 'Bessel Namibia'; + case 6007: + return 'Clarke 1858'; + case 6008: + return 'Clarke 1866'; + case 6009: + return 'Clarke 1866 Michigan'; + case 6010: + return 'Clarke 1880 Benoit'; + case 6011: + return 'Clarke 1880 IGN'; + case 6012: + return 'Clarke 1880 RGS'; + case 6013: + return 'Clarke 1880 Arc'; + case 6014: + return 'Clarke 1880 SGA 1922'; + case 6015: + return 'Everest 1830 1937 Adjustment'; + case 6016: + return 'Everest 1830 1967 Definition'; + case 6017: + return 'Everest 1830 1975 Definition'; + case 6018: + return 'Everest 1830 Modified'; + case 6019: + return 'GRS 1980'; + case 6020: + return 'Helmert 1906'; + case 6021: + return 'Indonesian National Spheroid'; + case 6022: + return 'International 1924'; + case 6023: + return 'International 1967'; + case 6024: + return 'Krassowsky 1960'; + case 6025: + return 'NWL9D'; + case 6026: + return 'NWL10D'; + case 6027: + return 'Plessis 1817'; + case 6028: + return 'Struve 1860'; + case 6029: + return 'War Office'; + case 6030: + return 'WGS84'; + case 6031: + return 'GEM10C'; + case 6032: + return 'OSU86F'; + case 6033: + return 'OSU91A'; + case 6034: + return 'Clarke 1880'; + case 6035: + return 'Sphere'; + case 6201: + return 'Adindan'; + case 6202: + return 'Australian Geodetic Datum 1966'; + case 6203: + return 'Australian Geodetic Datum 1984'; + case 6204: + return 'Ain el Abd 1970'; + case 6205: + return 'Afgooye'; + case 6206: + return 'Agadez'; + case 6207: + return 'Lisbon'; + case 6208: + return 'Aratu'; + case 6209: + return 'Arc 1950'; + case 6210: + return 'Arc 1960'; + case 6211: + return 'Batavia'; + case 6212: + return 'Barbados'; + case 6213: + return 'Beduaram'; + case 6214: + return 'Beijing 1954'; + case 6215: + return 'Reseau National Belge 1950'; + case 6216: + return 'Bermuda 1957'; + case 6217: + return 'Bern 1898'; + case 6218: + return 'Bogota'; + case 6219: + return 'Bukit Rimpah'; + case 6220: + return 'Camacupa'; + case 6221: + return 'Campo Inchauspe'; + case 6222: + return 'Cape'; + case 6223: + return 'Carthage'; + case 6224: + return 'Chua'; + case 6225: + return 'Corrego Alegre'; + case 6226: + return 'Cote d Ivoire'; + case 6227: + return 'Deir ez Zor'; + case 6228: + return 'Douala'; + case 6229: + return 'Egypt 1907'; + case 6230: + return 'European Datum 1950'; + case 6231: + return 'European Datum 1987'; + case 6232: + return 'Fahud'; + case 6233: + return 'Gandajika 1970'; + case 6234: + return 'Garoua'; + case 6235: + return 'Guyane Francaise'; + case 6236: + return 'Hu Tzu Shan'; + case 6237: + return 'Hungarian Datum 1972'; + case 6238: + return 'Indonesian Datum 1974'; + case 6239: + return 'Indian 1954'; + case 6240: + return 'Indian 1975'; + case 6241: + return 'Jamaica 1875'; + case 6242: + return 'Jamaica 1969'; + case 6243: + return 'Kalianpur'; + case 6244: + return 'Kandawala'; + case 6245: + return 'Kertau'; + case 6246: + return 'Kuwait Oil Company'; + case 6247: + return 'La Canoa'; + case 6248: + return 'Provisional S American Datum 1956'; + case 6249: + return 'Lake'; + case 6250: + return 'Leigon'; + case 6251: + return 'Liberia 1964'; + case 6252: + return 'Lome'; + case 6253: + return 'Luzon 1911'; + case 6254: + return 'Hito XVIII 1963'; + case 6255: + return 'Herat North'; + case 6256: + return 'Mahe 1971'; + case 6257: + return 'Makassar'; + case 6258: + return 'European Reference System 1989'; + case 6259: + return 'Malongo 1987'; + case 6260: + return 'Manoca'; + case 6261: + return 'Merchich'; + case 6262: + return 'Massawa'; + case 6263: + return 'Minna'; + case 6264: + return 'Mhast'; + case 6265: + return 'Monte Mario'; + case 6266: + return 'M poraloko'; + case 6267: + return 'North American Datum 1927'; + case 6268: + return 'NAD Michigan'; + case 6269: + return 'North American Datum 1983'; + case 6270: + return 'Nahrwan 1967'; + case 6271: + return 'Naparima 1972'; + case 6272: + return 'New Zealand Geodetic Datum 1949'; + case 6273: + return 'NGO 1948'; + case 6274: + return 'Datum 73'; + case 6275: + return 'Nouvelle Triangulation Francaise'; + case 6276: + return 'NSWC 9Z 2'; + case 6277: + return 'OSGB 1936'; + case 6278: + return 'OSGB 1970 SN'; + case 6279: + return 'OS SN 1980'; + case 6280: + return 'Padang 1884'; + case 6281: + return 'Palestine 1923'; + case 6282: + return 'Pointe Noire'; + case 6283: + return 'Geocentric Datum of Australia 1994'; + case 6284: + return 'Pulkovo 1942'; + case 6285: + return 'Qatar'; + case 6286: + return 'Qatar 1948'; + case 6287: + return 'Qornoq'; + case 6288: + return 'Loma Quintana'; + case 6289: + return 'Amersfoort'; + case 6290: + return 'RT38'; + case 6291: + return 'South American Datum 1969'; + case 6292: + return 'Sapper Hill 1943'; + case 6293: + return 'Schwarzeck'; + case 6294: + return 'Segora'; + case 6295: + return 'Serindung'; + case 6296: + return 'Sudan'; + case 6297: + return 'Tananarive 1925'; + case 6298: + return 'Timbalai 1948'; + case 6299: + return 'TM65'; + case 6300: + return 'TM75'; + case 6301: + return 'Tokyo'; + case 6302: + return 'Trinidad 1903'; + case 6303: + return 'Trucial Coast 1948'; + case 6304: + return 'Voirol 1875'; + case 6305: + return 'Voirol Unifie 1960'; + case 6306: + return 'Bern 1938'; + case 6307: + return 'Nord Sahara 1959'; + case 6308: + return 'Stockholm 1938'; + case 6309: + return 'Yacare'; + case 6310: + return 'Yoff'; + case 6311: + return 'Zanderij'; + case 6312: + return 'Militar Geographische Institut'; + case 6313: + return 'Reseau National Belge 1972'; + case 6314: + return 'Deutsche Hauptdreiecksnetz'; + case 6315: + return 'Conakry 1905'; + case 6317: + return 'Dealul Piscului 1970'; + case 6322: + return 'WGS72'; + case 6324: + return 'WGS72 Transit Broadcast Ephemeris'; + case 6326: + return 'WGS84'; + case 6901: + return 'Ancienne Triangulation Francaise'; + case 6902: + return 'Nord de Guerre'; + case 32767: + return 'User Defined'; + default: + return 'Unknown ($value)'; + } + } + + static String getGeogEllipsoidDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 7001: + return 'Airy 1830'; + case 7002: + return 'Airy Modified 1849'; + case 7003: + return 'Australian National Spheroid'; + case 7004: + return 'Bessel 1841'; + case 7005: + return 'Bessel Modified'; + case 7006: + return 'Bessel Namibia'; + case 7007: + return 'Clarke 1858'; + case 7008: + return 'Clarke 1866'; + case 7009: + return 'Clarke 1866 Michigan'; + case 7010: + return 'Clarke 1880 Benoit'; + case 7011: + return 'Clarke 1880 IGN'; + case 7012: + return 'Clarke 1880 RGS'; + case 7013: + return 'Clarke 1880 Arc'; + case 7014: + return 'Clarke 1880 SGA 1922'; + case 7015: + return 'Everest 1830 1937 Adjustment'; + case 7016: + return 'Everest 1830 1967 Definition'; + case 7017: + return 'Everest 1830 1975 Definition'; + case 7018: + return 'Everest 1830 Modified'; + case 7019: + return 'GRS 1980'; + case 7020: + return 'Helmert 1906'; + case 7021: + return 'Indonesian National Spheroid'; + case 7022: + return 'International 1924'; + case 7023: + return 'International 1967'; + case 7024: + return 'Krassowsky 1940'; + case 7025: + return 'NWL 9D'; + case 7026: + return 'NWL 10D'; + case 7027: + return 'Plessis 1817'; + case 7028: + return 'Struve 1860'; + case 7029: + return 'War Office'; + case 7030: + return 'WGS 84'; + case 7031: + return 'GEM 10C'; + case 7032: + return 'OSU86F'; + case 7033: + return 'OSU91A'; + case 7034: + return 'Clarke 1880'; + case 7035: + return 'Sphere'; + case 32767: + return 'User Defined'; + default: + return 'Unknown ($value)'; + } + } + + static String getProjCSTypeDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 2100: + return 'GGRS87 Greek Grid'; + case 2176: + return 'ETRS89 Poland CS2000 zone 5'; + case 2177: + return 'ETRS89 Poland CS2000 zone 7'; + case 2178: + return 'ETRS89 Poland CS2000 zone 8'; + case 2180: + return 'ETRS89 Poland CS92'; + case 2204: + return 'NAD27 Tennessee'; + case 2205: + return 'NAD83 Kentucky North'; + case 2391: + return 'KKJ Finland zone 1'; + case 2392: + return 'KKJ Finland zone 2'; + case 2393: + return 'KKJ Finland zone 3'; + case 2394: + return 'KKJ Finland zone 4'; + case 2400: + return 'RT90 2 5 gon W'; + case 2600: + return 'Lietuvos Koordinoei Sistema 1994'; + case 3045: + return 'ETRS89 UTM zone 33N'; + case 3053: + return 'Hjorsey 1955 Lambert'; + case 3057: + return 'ISN93 Lambert 1993'; + case 3300: + return 'Estonian Coordinate System of 1992'; + case 3786: + return 'Popular Visualisation CRS / Mercator'; + case 3857: + return 'WGS 84 / Pseudo-Mercator'; + case 20137: + return 'Adindan UTM zone 37N'; + case 20138: + return 'Adindan UTM zone 38N'; + case 20248: + return 'AGD66 AMG zone 48'; + case 20249: + return 'AGD66 AMG zone 49'; + case 20250: + return 'AGD66 AMG zone 50'; + case 20251: + return 'AGD66 AMG zone 51'; + case 20252: + return 'AGD66 AMG zone 52'; + case 20253: + return 'AGD66 AMG zone 53'; + case 20254: + return 'AGD66 AMG zone 54'; + case 20255: + return 'AGD66 AMG zone 55'; + case 20256: + return 'AGD66 AMG zone 56'; + case 20257: + return 'AGD66 AMG zone 57'; + case 20258: + return 'AGD66 AMG zone 58'; + case 20348: + return 'AGD84 AMG zone 48'; + case 20349: + return 'AGD84 AMG zone 49'; + case 20350: + return 'AGD84 AMG zone 50'; + case 20351: + return 'AGD84 AMG zone 51'; + case 20352: + return 'AGD84 AMG zone 52'; + case 20353: + return 'AGD84 AMG zone 53'; + case 20354: + return 'AGD84 AMG zone 54'; + case 20355: + return 'AGD84 AMG zone 55'; + case 20356: + return 'AGD84 AMG zone 56'; + case 20357: + return 'AGD84 AMG zone 57'; + case 20358: + return 'AGD84 AMG zone 58'; + case 20437: + return 'Ain el Abd UTM zone 37N'; + case 20438: + return 'Ain el Abd UTM zone 38N'; + case 20439: + return 'Ain el Abd UTM zone 39N'; + case 20499: + return 'Ain el Abd Bahrain Grid'; + case 20538: + return 'Afgooye UTM zone 38N'; + case 20539: + return 'Afgooye UTM zone 39N'; + case 20700: + return 'Lisbon Portuguese Grid'; + case 20822: + return 'Aratu UTM zone 22S'; + case 20823: + return 'Aratu UTM zone 23S'; + case 20824: + return 'Aratu UTM zone 24S'; + case 20973: + return 'Arc 1950 Lo13'; + case 20975: + return 'Arc 1950 Lo15'; + case 20977: + return 'Arc 1950 Lo17'; + case 20979: + return 'Arc 1950 Lo19'; + case 20981: + return 'Arc 1950 Lo21'; + case 20983: + return 'Arc 1950 Lo23'; + case 20985: + return 'Arc 1950 Lo25'; + case 20987: + return 'Arc 1950 Lo27'; + case 20989: + return 'Arc 1950 Lo29'; + case 20991: + return 'Arc 1950 Lo31'; + case 20993: + return 'Arc 1950 Lo33'; + case 20995: + return 'Arc 1950 Lo35'; + case 21100: + return 'Batavia NEIEZ'; + case 21148: + return 'Batavia UTM zone 48S'; + case 21149: + return 'Batavia UTM zone 49S'; + case 21150: + return 'Batavia UTM zone 50S'; + case 21413: + return 'Beijing Gauss zone 13'; + case 21414: + return 'Beijing Gauss zone 14'; + case 21415: + return 'Beijing Gauss zone 15'; + case 21416: + return 'Beijing Gauss zone 16'; + case 21417: + return 'Beijing Gauss zone 17'; + case 21418: + return 'Beijing Gauss zone 18'; + case 21419: + return 'Beijing Gauss zone 19'; + case 21420: + return 'Beijing Gauss zone 20'; + case 21421: + return 'Beijing Gauss zone 21'; + case 21422: + return 'Beijing Gauss zone 22'; + case 21423: + return 'Beijing Gauss zone 23'; + case 21473: + return 'Beijing Gauss 13N'; + case 21474: + return 'Beijing Gauss 14N'; + case 21475: + return 'Beijing Gauss 15N'; + case 21476: + return 'Beijing Gauss 16N'; + case 21477: + return 'Beijing Gauss 17N'; + case 21478: + return 'Beijing Gauss 18N'; + case 21479: + return 'Beijing Gauss 19N'; + case 21480: + return 'Beijing Gauss 20N'; + case 21481: + return 'Beijing Gauss 21N'; + case 21482: + return 'Beijing Gauss 22N'; + case 21483: + return 'Beijing Gauss 23N'; + case 21500: + return 'Belge Lambert 50'; + case 21790: + return 'Bern 1898 Swiss Old'; + case 21817: + return 'Bogota UTM zone 17N'; + case 21818: + return 'Bogota UTM zone 18N'; + case 21891: + return 'Bogota Colombia 3W'; + case 21892: + return 'Bogota Colombia Bogota'; + case 21893: + return 'Bogota Colombia 3E'; + case 21894: + return 'Bogota Colombia 6E'; + case 22032: + return 'Camacupa UTM 32S'; + case 22033: + return 'Camacupa UTM 33S'; + case 22191: + return 'C Inchauspe Argentina 1'; + case 22192: + return 'C Inchauspe Argentina 2'; + case 22193: + return 'C Inchauspe Argentina 3'; + case 22194: + return 'C Inchauspe Argentina 4'; + case 22195: + return 'C Inchauspe Argentina 5'; + case 22196: + return 'C Inchauspe Argentina 6'; + case 22197: + return 'C Inchauspe Argentina 7'; + case 22332: + return 'Carthage UTM zone 32N'; + case 22391: + return 'Carthage Nord Tunisie'; + case 22392: + return 'Carthage Sud Tunisie'; + case 22523: + return 'Corrego Alegre UTM 23S'; + case 22524: + return 'Corrego Alegre UTM 24S'; + case 22832: + return 'Douala UTM zone 32N'; + case 22992: + return 'Egypt 1907 Red Belt'; + case 22993: + return 'Egypt 1907 Purple Belt'; + case 22994: + return 'Egypt 1907 Ext Purple'; + case 23028: + return 'ED50 UTM zone 28N'; + case 23029: + return 'ED50 UTM zone 29N'; + case 23030: + return 'ED50 UTM zone 30N'; + case 23031: + return 'ED50 UTM zone 31N'; + case 23032: + return 'ED50 UTM zone 32N'; + case 23033: + return 'ED50 UTM zone 33N'; + case 23034: + return 'ED50 UTM zone 34N'; + case 23035: + return 'ED50 UTM zone 35N'; + case 23036: + return 'ED50 UTM zone 36N'; + case 23037: + return 'ED50 UTM zone 37N'; + case 23038: + return 'ED50 UTM zone 38N'; + case 23239: + return 'Fahud UTM zone 39N'; + case 23240: + return 'Fahud UTM zone 40N'; + case 23433: + return 'Garoua UTM zone 33N'; + case 23700: + return 'HD72 EOV'; + case 23846: + return 'ID74 UTM zone 46N'; + case 23847: + return 'ID74 UTM zone 47N'; + case 23848: + return 'ID74 UTM zone 48N'; + case 23849: + return 'ID74 UTM zone 49N'; + case 23850: + return 'ID74 UTM zone 50N'; + case 23851: + return 'ID74 UTM zone 51N'; + case 23852: + return 'ID74 UTM zone 52N'; + case 23853: + return 'ID74 UTM zone 53N'; + case 23886: + return 'ID74 UTM zone 46S'; + case 23887: + return 'ID74 UTM zone 47S'; + case 23888: + return 'ID74 UTM zone 48S'; + case 23889: + return 'ID74 UTM zone 49S'; + case 23890: + return 'ID74 UTM zone 50S'; + case 23891: + return 'ID74 UTM zone 51S'; + case 23892: + return 'ID74 UTM zone 52S'; + case 23893: + return 'ID74 UTM zone 53S'; + case 23894: + return 'ID74 UTM zone 54S'; + case 23947: + return 'Indian 1954 UTM 47N'; + case 23948: + return 'Indian 1954 UTM 48N'; + case 24047: + return 'Indian 1975 UTM 47N'; + case 24048: + return 'Indian 1975 UTM 48N'; + case 24100: + return 'Jamaica 1875 Old Grid'; + case 24200: + return 'JAD69 Jamaica Grid'; + case 24370: + return 'Kalianpur India 0'; + case 24371: + return 'Kalianpur India I'; + case 24372: + return 'Kalianpur India IIa'; + case 24373: + return 'Kalianpur India IIIa'; + case 24374: + return 'Kalianpur India IVa'; + case 24382: + return 'Kalianpur India IIb'; + case 24383: + return 'Kalianpur India IIIb'; + case 24384: + return 'Kalianpur India IVb'; + case 24500: + return 'Kertau Singapore Grid'; + case 24547: + return 'Kertau UTM zone 47N'; + case 24548: + return 'Kertau UTM zone 48N'; + case 24720: + return 'La Canoa UTM zone 20N'; + case 24721: + return 'La Canoa UTM zone 21N'; + case 24818: + return 'PSAD56 UTM zone 18N'; + case 24819: + return 'PSAD56 UTM zone 19N'; + case 24820: + return 'PSAD56 UTM zone 20N'; + case 24821: + return 'PSAD56 UTM zone 21N'; + case 24877: + return 'PSAD56 UTM zone 17S'; + case 24878: + return 'PSAD56 UTM zone 18S'; + case 24879: + return 'PSAD56 UTM zone 19S'; + case 24880: + return 'PSAD56 UTM zone 20S'; + case 24891: + return 'PSAD56 Peru west zone'; + case 24892: + return 'PSAD56 Peru central'; + case 24893: + return 'PSAD56 Peru east zone'; + case 25000: + return 'Leigon Ghana Grid'; + case 25231: + return 'Lome UTM zone 31N'; + case 25391: + return 'Luzon Philippines I'; + case 25392: + return 'Luzon Philippines II'; + case 25393: + return 'Luzon Philippines III'; + case 25394: + return 'Luzon Philippines IV'; + case 25395: + return 'Luzon Philippines V'; + case 25700: + return 'Makassar NEIEZ'; + case 25932: + return 'Malongo 1987 UTM 32S'; + case 26191: + return 'Merchich Nord Maroc'; + case 26192: + return 'Merchich Sud Maroc'; + case 26193: + return 'Merchich Sahara'; + case 26237: + return 'Massawa UTM zone 37N'; + case 26331: + return 'Minna UTM zone 31N'; + case 26332: + return 'Minna UTM zone 32N'; + case 26391: + return 'Minna Nigeria West'; + case 26392: + return 'Minna Nigeria Mid Belt'; + case 26393: + return 'Minna Nigeria East'; + case 26432: + return 'Mhast UTM zone 32S'; + case 26591: + return 'Monte Mario Italy 1'; + case 26592: + return 'Monte Mario Italy 2'; + case 26632: + return 'M poraloko UTM 32N'; + case 26692: + return 'M poraloko UTM 32S'; + case 26703: + return 'NAD27 UTM zone 3N'; + case 26704: + return 'NAD27 UTM zone 4N'; + case 26705: + return 'NAD27 UTM zone 5N'; + case 26706: + return 'NAD27 UTM zone 6N'; + case 26707: + return 'NAD27 UTM zone 7N'; + case 26708: + return 'NAD27 UTM zone 8N'; + case 26709: + return 'NAD27 UTM zone 9N'; + case 26710: + return 'NAD27 UTM zone 10N'; + case 26711: + return 'NAD27 UTM zone 11N'; + case 26712: + return 'NAD27 UTM zone 12N'; + case 26713: + return 'NAD27 UTM zone 13N'; + case 26714: + return 'NAD27 UTM zone 14N'; + case 26715: + return 'NAD27 UTM zone 15N'; + case 26716: + return 'NAD27 UTM zone 16N'; + case 26717: + return 'NAD27 UTM zone 17N'; + case 26718: + return 'NAD27 UTM zone 18N'; + case 26719: + return 'NAD27 UTM zone 19N'; + case 26720: + return 'NAD27 UTM zone 20N'; + case 26721: + return 'NAD27 UTM zone 21N'; + case 26722: + return 'NAD27 UTM zone 22N'; + case 26729: + return 'NAD27 Alabama East'; + case 26730: + return 'NAD27 Alabama West'; + case 26731: + return 'NAD27 Alaska zone 1'; + case 26732: + return 'NAD27 Alaska zone 2'; + case 26733: + return 'NAD27 Alaska zone 3'; + case 26734: + return 'NAD27 Alaska zone 4'; + case 26735: + return 'NAD27 Alaska zone 5'; + case 26736: + return 'NAD27 Alaska zone 6'; + case 26737: + return 'NAD27 Alaska zone 7'; + case 26738: + return 'NAD27 Alaska zone 8'; + case 26739: + return 'NAD27 Alaska zone 9'; + case 26740: + return 'NAD27 Alaska zone 10'; + case 26741: + return 'NAD27 California I'; + case 26742: + return 'NAD27 California II'; + case 26743: + return 'NAD27 California III'; + case 26744: + return 'NAD27 California IV'; + case 26745: + return 'NAD27 California V'; + case 26746: + return 'NAD27 California VI'; + case 26747: + return 'NAD27 California VII'; + case 26748: + return 'NAD27 Arizona East'; + case 26749: + return 'NAD27 Arizona Central'; + case 26750: + return 'NAD27 Arizona West'; + case 26751: + return 'NAD27 Arkansas North'; + case 26752: + return 'NAD27 Arkansas South'; + case 26753: + return 'NAD27 Colorado North'; + case 26754: + return 'NAD27 Colorado Central'; + case 26755: + return 'NAD27 Colorado South'; + case 26756: + return 'NAD27 Connecticut'; + case 26757: + return 'NAD27 Delaware'; + case 26758: + return 'NAD27 Florida East'; + case 26759: + return 'NAD27 Florida West'; + case 26760: + return 'NAD27 Florida North'; + case 26761: + return 'NAD27 Hawaii zone 1'; + case 26762: + return 'NAD27 Hawaii zone 2'; + case 26763: + return 'NAD27 Hawaii zone 3'; + case 26764: + return 'NAD27 Hawaii zone 4'; + case 26765: + return 'NAD27 Hawaii zone 5'; + case 26766: + return 'NAD27 Georgia East'; + case 26767: + return 'NAD27 Georgia West'; + case 26768: + return 'NAD27 Idaho East'; + case 26769: + return 'NAD27 Idaho Central'; + case 26770: + return 'NAD27 Idaho West'; + case 26771: + return 'NAD27 Illinois East'; + case 26772: + return 'NAD27 Illinois West'; + case 26773: + return 'NAD27 Indiana East'; + case 26774: + return 'NAD27 Indiana West'; + case 26775: + return 'NAD27 Iowa North'; + case 26776: + return 'NAD27 Iowa South'; + case 26777: + return 'NAD27 Kansas North'; + case 26778: + return 'NAD27 Kansas South'; + case 26779: + return 'NAD27 Kentucky North'; + case 26780: + return 'NAD27 Kentucky South'; + case 26781: + return 'NAD27 Louisiana North'; + case 26782: + return 'NAD27 Louisiana South'; + case 26783: + return 'NAD27 Maine East'; + case 26784: + return 'NAD27 Maine West'; + case 26785: + return 'NAD27 Maryland'; + case 26786: + return 'NAD27 Massachusetts'; + case 26787: + return 'NAD27 Massachusetts Is'; + case 26788: + return 'NAD27 Michigan North'; + case 26789: + return 'NAD27 Michigan Central'; + case 26790: + return 'NAD27 Michigan South'; + case 26791: + return 'NAD27 Minnesota North'; + case 26792: + return 'NAD27 Minnesota Cent'; + case 26793: + return 'NAD27 Minnesota South'; + case 26794: + return 'NAD27 Mississippi East'; + case 26795: + return 'NAD27 Mississippi West'; + case 26796: + return 'NAD27 Missouri East'; + case 26797: + return 'NAD27 Missouri Central'; + case 26798: + return 'NAD27 Missouri West'; + case 26801: + return 'NAD Michigan Michigan East'; + case 26802: + return 'NAD Michigan Michigan Old Central'; + case 26803: + return 'NAD Michigan Michigan West'; + case 26903: + return 'NAD83 UTM zone 3N'; + case 26904: + return 'NAD83 UTM zone 4N'; + case 26905: + return 'NAD83 UTM zone 5N'; + case 26906: + return 'NAD83 UTM zone 6N'; + case 26907: + return 'NAD83 UTM zone 7N'; + case 26908: + return 'NAD83 UTM zone 8N'; + case 26909: + return 'NAD83 UTM zone 9N'; + case 26910: + return 'NAD83 UTM zone 10N'; + case 26911: + return 'NAD83 UTM zone 11N'; + case 26912: + return 'NAD83 UTM zone 12N'; + case 26913: + return 'NAD83 UTM zone 13N'; + case 26914: + return 'NAD83 UTM zone 14N'; + case 26915: + return 'NAD83 UTM zone 15N'; + case 26916: + return 'NAD83 UTM zone 16N'; + case 26917: + return 'NAD83 UTM zone 17N'; + case 26918: + return 'NAD83 UTM zone 18N'; + case 26919: + return 'NAD83 UTM zone 19N'; + case 26920: + return 'NAD83 UTM zone 20N'; + case 26921: + return 'NAD83 UTM zone 21N'; + case 26922: + return 'NAD83 UTM zone 22N'; + case 26923: + return 'NAD83 UTM zone 23N'; + case 26929: + return 'NAD83 Alabama East'; + case 26930: + return 'NAD83 Alabama West'; + case 26931: + return 'NAD83 Alaska zone 1'; + case 26932: + return 'NAD83 Alaska zone 2'; + case 26933: + return 'NAD83 Alaska zone 3'; + case 26934: + return 'NAD83 Alaska zone 4'; + case 26935: + return 'NAD83 Alaska zone 5'; + case 26936: + return 'NAD83 Alaska zone 6'; + case 26937: + return 'NAD83 Alaska zone 7'; + case 26938: + return 'NAD83 Alaska zone 8'; + case 26939: + return 'NAD83 Alaska zone 9'; + case 26940: + return 'NAD83 Alaska zone 10'; + case 26941: + return 'NAD83 California 1'; + case 26942: + return 'NAD83 California 2'; + case 26943: + return 'NAD83 California 3'; + case 26944: + return 'NAD83 California 4'; + case 26945: + return 'NAD83 California 5'; + case 26946: + return 'NAD83 California 6'; + case 26948: + return 'NAD83 Arizona East'; + case 26949: + return 'NAD83 Arizona Central'; + case 26950: + return 'NAD83 Arizona West'; + case 26951: + return 'NAD83 Arkansas North'; + case 26952: + return 'NAD83 Arkansas South'; + case 26953: + return 'NAD83 Colorado North'; + case 26954: + return 'NAD83 Colorado Central'; + case 26955: + return 'NAD83 Colorado South'; + case 26956: + return 'NAD83 Connecticut'; + case 26957: + return 'NAD83 Delaware'; + case 26958: + return 'NAD83 Florida East'; + case 26959: + return 'NAD83 Florida West'; + case 26960: + return 'NAD83 Florida North'; + case 26961: + return 'NAD83 Hawaii zone 1'; + case 26962: + return 'NAD83 Hawaii zone 2'; + case 26963: + return 'NAD83 Hawaii zone 3'; + case 26964: + return 'NAD83 Hawaii zone 4'; + case 26965: + return 'NAD83 Hawaii zone 5'; + case 26966: + return 'NAD83 Georgia East'; + case 26967: + return 'NAD83 Georgia West'; + case 26968: + return 'NAD83 Idaho East'; + case 26969: + return 'NAD83 Idaho Central'; + case 26970: + return 'NAD83 Idaho West'; + case 26971: + return 'NAD83 Illinois East'; + case 26972: + return 'NAD83 Illinois West'; + case 26973: + return 'NAD83 Indiana East'; + case 26974: + return 'NAD83 Indiana West'; + case 26975: + return 'NAD83 Iowa North'; + case 26976: + return 'NAD83 Iowa South'; + case 26977: + return 'NAD83 Kansas North'; + case 26978: + return 'NAD83 Kansas South'; + case 26979: + return 'NAD83 Kentucky North'; + case 26980: + return 'NAD83 Kentucky South'; + case 26981: + return 'NAD83 Louisiana North'; + case 26982: + return 'NAD83 Louisiana South'; + case 26983: + return 'NAD83 Maine East'; + case 26984: + return 'NAD83 Maine West'; + case 26985: + return 'NAD83 Maryland'; + case 26986: + return 'NAD83 Massachusetts'; + case 26987: + return 'NAD83 Massachusetts Is'; + case 26988: + return 'NAD83 Michigan North'; + case 26989: + return 'NAD83 Michigan Central'; + case 26990: + return 'NAD83 Michigan South'; + case 26991: + return 'NAD83 Minnesota North'; + case 26992: + return 'NAD83 Minnesota Cent'; + case 26993: + return 'NAD83 Minnesota South'; + case 26994: + return 'NAD83 Mississippi East'; + case 26995: + return 'NAD83 Mississippi West'; + case 26996: + return 'NAD83 Missouri East'; + case 26997: + return 'NAD83 Missouri Central'; + case 26998: + return 'NAD83 Missouri West'; + case 27038: + return 'Nahrwan 1967 UTM 38N'; + case 27039: + return 'Nahrwan 1967 UTM 39N'; + case 27040: + return 'Nahrwan 1967 UTM 40N'; + case 27120: + return 'Naparima UTM 20N'; + case 27200: + return 'GD49 NZ Map Grid'; + case 27291: + return 'GD49 North Island Grid'; + case 27292: + return 'GD49 South Island Grid'; + case 27429: + return 'Datum 73 UTM zone 29N'; + case 27500: + return 'ATF Nord de Guerre'; + case 27581: + return 'NTF France I'; + case 27582: + return 'NTF France II'; + case 27583: + return 'NTF France III'; + case 27591: + return 'NTF Nord France'; + case 27592: + return 'NTF Centre France'; + case 27593: + return 'NTF Sud France'; + case 27700: + return 'British National Grid'; + case 28232: + return 'Point Noire UTM 32S'; + case 28348: + return 'GDA94 MGA zone 48'; + case 28349: + return 'GDA94 MGA zone 49'; + case 28350: + return 'GDA94 MGA zone 50'; + case 28351: + return 'GDA94 MGA zone 51'; + case 28352: + return 'GDA94 MGA zone 52'; + case 28353: + return 'GDA94 MGA zone 53'; + case 28354: + return 'GDA94 MGA zone 54'; + case 28355: + return 'GDA94 MGA zone 55'; + case 28356: + return 'GDA94 MGA zone 56'; + case 28357: + return 'GDA94 MGA zone 57'; + case 28358: + return 'GDA94 MGA zone 58'; + case 28404: + return 'Pulkovo Gauss zone 4'; + case 28405: + return 'Pulkovo Gauss zone 5'; + case 28406: + return 'Pulkovo Gauss zone 6'; + case 28407: + return 'Pulkovo Gauss zone 7'; + case 28408: + return 'Pulkovo Gauss zone 8'; + case 28409: + return 'Pulkovo Gauss zone 9'; + case 28410: + return 'Pulkovo Gauss zone 10'; + case 28411: + return 'Pulkovo Gauss zone 11'; + case 28412: + return 'Pulkovo Gauss zone 12'; + case 28413: + return 'Pulkovo Gauss zone 13'; + case 28414: + return 'Pulkovo Gauss zone 14'; + case 28415: + return 'Pulkovo Gauss zone 15'; + case 28416: + return 'Pulkovo Gauss zone 16'; + case 28417: + return 'Pulkovo Gauss zone 17'; + case 28418: + return 'Pulkovo Gauss zone 18'; + case 28419: + return 'Pulkovo Gauss zone 19'; + case 28420: + return 'Pulkovo Gauss zone 20'; + case 28421: + return 'Pulkovo Gauss zone 21'; + case 28422: + return 'Pulkovo Gauss zone 22'; + case 28423: + return 'Pulkovo Gauss zone 23'; + case 28424: + return 'Pulkovo Gauss zone 24'; + case 28425: + return 'Pulkovo Gauss zone 25'; + case 28426: + return 'Pulkovo Gauss zone 26'; + case 28427: + return 'Pulkovo Gauss zone 27'; + case 28428: + return 'Pulkovo Gauss zone 28'; + case 28429: + return 'Pulkovo Gauss zone 29'; + case 28430: + return 'Pulkovo Gauss zone 30'; + case 28431: + return 'Pulkovo Gauss zone 31'; + case 28432: + return 'Pulkovo Gauss zone 32'; + case 28464: + return 'Pulkovo Gauss 4N'; + case 28465: + return 'Pulkovo Gauss 5N'; + case 28466: + return 'Pulkovo Gauss 6N'; + case 28467: + return 'Pulkovo Gauss 7N'; + case 28468: + return 'Pulkovo Gauss 8N'; + case 28469: + return 'Pulkovo Gauss 9N'; + case 28470: + return 'Pulkovo Gauss 10N'; + case 28471: + return 'Pulkovo Gauss 11N'; + case 28472: + return 'Pulkovo Gauss 12N'; + case 28473: + return 'Pulkovo Gauss 13N'; + case 28474: + return 'Pulkovo Gauss 14N'; + case 28475: + return 'Pulkovo Gauss 15N'; + case 28476: + return 'Pulkovo Gauss 16N'; + case 28477: + return 'Pulkovo Gauss 17N'; + case 28478: + return 'Pulkovo Gauss 18N'; + case 28479: + return 'Pulkovo Gauss 19N'; + case 28480: + return 'Pulkovo Gauss 20N'; + case 28481: + return 'Pulkovo Gauss 21N'; + case 28482: + return 'Pulkovo Gauss 22N'; + case 28483: + return 'Pulkovo Gauss 23N'; + case 28484: + return 'Pulkovo Gauss 24N'; + case 28485: + return 'Pulkovo Gauss 25N'; + case 28486: + return 'Pulkovo Gauss 26N'; + case 28487: + return 'Pulkovo Gauss 27N'; + case 28488: + return 'Pulkovo Gauss 28N'; + case 28489: + return 'Pulkovo Gauss 29N'; + case 28490: + return 'Pulkovo Gauss 30N'; + case 28491: + return 'Pulkovo Gauss 31N'; + case 28492: + return 'Pulkovo Gauss 32N'; + case 28600: + return 'Qatar National Grid'; + case 28991: + return 'RD Netherlands Old'; + case 28992: + return 'RD Netherlands New'; + case 29118: + return 'SAD69 UTM zone 18N'; + case 29119: + return 'SAD69 UTM zone 19N'; + case 29120: + return 'SAD69 UTM zone 20N'; + case 29121: + return 'SAD69 UTM zone 21N'; + case 29122: + return 'SAD69 UTM zone 22N'; + case 29177: + return 'SAD69 UTM zone 17S'; + case 29178: + return 'SAD69 UTM zone 18S'; + case 29179: + return 'SAD69 UTM zone 19S'; + case 29180: + return 'SAD69 UTM zone 20S'; + case 29181: + return 'SAD69 UTM zone 21S'; + case 29182: + return 'SAD69 UTM zone 22S'; + case 29183: + return 'SAD69 UTM zone 23S'; + case 29184: + return 'SAD69 UTM zone 24S'; + case 29185: + return 'SAD69 UTM zone 25S'; + case 29220: + return 'Sapper Hill UTM 20S'; + case 29221: + return 'Sapper Hill UTM 21S'; + case 29333: + return 'Schwarzeck UTM 33S'; + case 29635: + return 'Sudan UTM zone 35N'; + case 29636: + return 'Sudan UTM zone 36N'; + case 29700: + return 'Tananarive Laborde'; + case 29738: + return 'Tananarive UTM 38S'; + case 29739: + return 'Tananarive UTM 39S'; + case 29800: + return 'Timbalai 1948 Borneo'; + case 29849: + return 'Timbalai 1948 UTM 49N'; + case 29850: + return 'Timbalai 1948 UTM 50N'; + case 29900: + return 'TM65 Irish Nat Grid'; + case 30200: + return 'Trinidad 1903 Trinidad'; + case 30339: + return 'TC 1948 UTM zone 39N'; + case 30340: + return 'TC 1948 UTM zone 40N'; + case 30491: + return 'Voirol N Algerie ancien'; + case 30492: + return 'Voirol S Algerie ancien'; + case 30591: + return 'Voirol Unifie N Algerie'; + case 30592: + return 'Voirol Unifie S Algerie'; + case 30600: + return 'Bern 1938 Swiss New'; + case 30729: + return 'Nord Sahara UTM 29N'; + case 30730: + return 'Nord Sahara UTM 30N'; + case 30731: + return 'Nord Sahara UTM 31N'; + case 30732: + return 'Nord Sahara UTM 32N'; + case 31028: + return 'Yoff UTM zone 28N'; + case 31121: + return 'Zanderij UTM zone 21N'; + case 31291: + return 'MGI Austria West'; + case 31292: + return 'MGI Austria Central'; + case 31293: + return 'MGI Austria East'; + case 31300: + return 'Belge Lambert 72'; + case 31491: + return 'DHDN Germany zone 1'; + case 31492: + return 'DHDN Germany zone 2'; + case 31493: + return 'DHDN Germany zone 3'; + case 31494: + return 'DHDN Germany zone 4'; + case 31495: + return 'DHDN Germany zone 5'; + case 31700: + return 'Dealul Piscului 1970 Stereo 70'; + case 32001: + return 'NAD27 Montana North'; + case 32002: + return 'NAD27 Montana Central'; + case 32003: + return 'NAD27 Montana South'; + case 32005: + return 'NAD27 Nebraska North'; + case 32006: + return 'NAD27 Nebraska South'; + case 32007: + return 'NAD27 Nevada East'; + case 32008: + return 'NAD27 Nevada Central'; + case 32009: + return 'NAD27 Nevada West'; + case 32010: + return 'NAD27 New Hampshire'; + case 32011: + return 'NAD27 New Jersey'; + case 32012: + return 'NAD27 New Mexico East'; + case 32013: + return 'NAD27 New Mexico Cent'; + case 32014: + return 'NAD27 New Mexico West'; + case 32015: + return 'NAD27 New York East'; + case 32016: + return 'NAD27 New York Central'; + case 32017: + return 'NAD27 New York West'; + case 32018: + return 'NAD27 New York Long Is'; + case 32019: + return 'NAD27 North Carolina'; + case 32020: + return 'NAD27 North Dakota N'; + case 32021: + return 'NAD27 North Dakota S'; + case 32022: + return 'NAD27 Ohio North'; + case 32023: + return 'NAD27 Ohio South'; + case 32024: + return 'NAD27 Oklahoma North'; + case 32025: + return 'NAD27 Oklahoma South'; + case 32026: + return 'NAD27 Oregon North'; + case 32027: + return 'NAD27 Oregon South'; + case 32028: + return 'NAD27 Pennsylvania N'; + case 32029: + return 'NAD27 Pennsylvania S'; + case 32030: + return 'NAD27 Rhode Island'; + case 32031: + return 'NAD27 South Carolina N'; + case 32033: + return 'NAD27 South Carolina S'; + case 32034: + return 'NAD27 South Dakota N'; + case 32035: + return 'NAD27 South Dakota S'; + case 32036: + return 'NAD27 Tennessee'; + case 32037: + return 'NAD27 Texas North'; + case 32038: + return 'NAD27 Texas North Cen'; + case 32039: + return 'NAD27 Texas Central'; + case 32040: + return 'NAD27 Texas South Cen'; + case 32041: + return 'NAD27 Texas South'; + case 32042: + return 'NAD27 Utah North'; + case 32043: + return 'NAD27 Utah Central'; + case 32044: + return 'NAD27 Utah South'; + case 32045: + return 'NAD27 Vermont'; + case 32046: + return 'NAD27 Virginia North'; + case 32047: + return 'NAD27 Virginia South'; + case 32048: + return 'NAD27 Washington North'; + case 32049: + return 'NAD27 Washington South'; + case 32050: + return 'NAD27 West Virginia N'; + case 32051: + return 'NAD27 West Virginia S'; + case 32052: + return 'NAD27 Wisconsin North'; + case 32053: + return 'NAD27 Wisconsin Cen'; + case 32054: + return 'NAD27 Wisconsin South'; + case 32055: + return 'NAD27 Wyoming East'; + case 32056: + return 'NAD27 Wyoming E Cen'; + case 32057: + return 'NAD27 Wyoming W Cen'; + case 32058: + return 'NAD27 Wyoming West'; + case 32059: + return 'NAD27 Puerto Rico'; + case 32060: + return 'NAD27 St Croix'; + case 32100: + return 'NAD83 Montana'; + case 32104: + return 'NAD83 Nebraska'; + case 32107: + return 'NAD83 Nevada East'; + case 32108: + return 'NAD83 Nevada Central'; + case 32109: + return 'NAD83 Nevada West'; + case 32110: + return 'NAD83 New Hampshire'; + case 32111: + return 'NAD83 New Jersey'; + case 32112: + return 'NAD83 New Mexico East'; + case 32113: + return 'NAD83 New Mexico Cent'; + case 32114: + return 'NAD83 New Mexico West'; + case 32115: + return 'NAD83 New York East'; + case 32116: + return 'NAD83 New York Central'; + case 32117: + return 'NAD83 New York West'; + case 32118: + return 'NAD83 New York Long Is'; + case 32119: + return 'NAD83 North Carolina'; + case 32120: + return 'NAD83 North Dakota N'; + case 32121: + return 'NAD83 North Dakota S'; + case 32122: + return 'NAD83 Ohio North'; + case 32123: + return 'NAD83 Ohio South'; + case 32124: + return 'NAD83 Oklahoma North'; + case 32125: + return 'NAD83 Oklahoma South'; + case 32126: + return 'NAD83 Oregon North'; + case 32127: + return 'NAD83 Oregon South'; + case 32128: + return 'NAD83 Pennsylvania N'; + case 32129: + return 'NAD83 Pennsylvania S'; + case 32130: + return 'NAD83 Rhode Island'; + case 32133: + return 'NAD83 South Carolina'; + case 32134: + return 'NAD83 South Dakota N'; + case 32135: + return 'NAD83 South Dakota S'; + case 32136: + return 'NAD83 Tennessee'; + case 32137: + return 'NAD83 Texas North'; + case 32138: + return 'NAD83 Texas North Cen'; + case 32139: + return 'NAD83 Texas Central'; + case 32140: + return 'NAD83 Texas South Cen'; + case 32141: + return 'NAD83 Texas South'; + case 32142: + return 'NAD83 Utah North'; + case 32143: + return 'NAD83 Utah Central'; + case 32144: + return 'NAD83 Utah South'; + case 32145: + return 'NAD83 Vermont'; + case 32146: + return 'NAD83 Virginia North'; + case 32147: + return 'NAD83 Virginia South'; + case 32148: + return 'NAD83 Washington North'; + case 32149: + return 'NAD83 Washington South'; + case 32150: + return 'NAD83 West Virginia N'; + case 32151: + return 'NAD83 West Virginia S'; + case 32152: + return 'NAD83 Wisconsin North'; + case 32153: + return 'NAD83 Wisconsin Cen'; + case 32154: + return 'NAD83 Wisconsin South'; + case 32155: + return 'NAD83 Wyoming East'; + case 32156: + return 'NAD83 Wyoming E Cen'; + case 32157: + return 'NAD83 Wyoming W Cen'; + case 32158: + return 'NAD83 Wyoming West'; + case 32161: + return 'NAD83 Puerto Rico Virgin Is'; + case 32201: + return 'WGS72 UTM zone 1N'; + case 32202: + return 'WGS72 UTM zone 2N'; + case 32203: + return 'WGS72 UTM zone 3N'; + case 32204: + return 'WGS72 UTM zone 4N'; + case 32205: + return 'WGS72 UTM zone 5N'; + case 32206: + return 'WGS72 UTM zone 6N'; + case 32207: + return 'WGS72 UTM zone 7N'; + case 32208: + return 'WGS72 UTM zone 8N'; + case 32209: + return 'WGS72 UTM zone 9N'; + case 32210: + return 'WGS72 UTM zone 10N'; + case 32211: + return 'WGS72 UTM zone 11N'; + case 32212: + return 'WGS72 UTM zone 12N'; + case 32213: + return 'WGS72 UTM zone 13N'; + case 32214: + return 'WGS72 UTM zone 14N'; + case 32215: + return 'WGS72 UTM zone 15N'; + case 32216: + return 'WGS72 UTM zone 16N'; + case 32217: + return 'WGS72 UTM zone 17N'; + case 32218: + return 'WGS72 UTM zone 18N'; + case 32219: + return 'WGS72 UTM zone 19N'; + case 32220: + return 'WGS72 UTM zone 20N'; + case 32221: + return 'WGS72 UTM zone 21N'; + case 32222: + return 'WGS72 UTM zone 22N'; + case 32223: + return 'WGS72 UTM zone 23N'; + case 32224: + return 'WGS72 UTM zone 24N'; + case 32225: + return 'WGS72 UTM zone 25N'; + case 32226: + return 'WGS72 UTM zone 26N'; + case 32227: + return 'WGS72 UTM zone 27N'; + case 32228: + return 'WGS72 UTM zone 28N'; + case 32229: + return 'WGS72 UTM zone 29N'; + case 32230: + return 'WGS72 UTM zone 30N'; + case 32231: + return 'WGS72 UTM zone 31N'; + case 32232: + return 'WGS72 UTM zone 32N'; + case 32233: + return 'WGS72 UTM zone 33N'; + case 32234: + return 'WGS72 UTM zone 34N'; + case 32235: + return 'WGS72 UTM zone 35N'; + case 32236: + return 'WGS72 UTM zone 36N'; + case 32237: + return 'WGS72 UTM zone 37N'; + case 32238: + return 'WGS72 UTM zone 38N'; + case 32239: + return 'WGS72 UTM zone 39N'; + case 32240: + return 'WGS72 UTM zone 40N'; + case 32241: + return 'WGS72 UTM zone 41N'; + case 32242: + return 'WGS72 UTM zone 42N'; + case 32243: + return 'WGS72 UTM zone 43N'; + case 32244: + return 'WGS72 UTM zone 44N'; + case 32245: + return 'WGS72 UTM zone 45N'; + case 32246: + return 'WGS72 UTM zone 46N'; + case 32247: + return 'WGS72 UTM zone 47N'; + case 32248: + return 'WGS72 UTM zone 48N'; + case 32249: + return 'WGS72 UTM zone 49N'; + case 32250: + return 'WGS72 UTM zone 50N'; + case 32251: + return 'WGS72 UTM zone 51N'; + case 32252: + return 'WGS72 UTM zone 52N'; + case 32253: + return 'WGS72 UTM zone 53N'; + case 32254: + return 'WGS72 UTM zone 54N'; + case 32255: + return 'WGS72 UTM zone 55N'; + case 32256: + return 'WGS72 UTM zone 56N'; + case 32257: + return 'WGS72 UTM zone 57N'; + case 32258: + return 'WGS72 UTM zone 58N'; + case 32259: + return 'WGS72 UTM zone 59N'; + case 32260: + return 'WGS72 UTM zone 60N'; + case 32301: + return 'WGS72 UTM zone 1S'; + case 32302: + return 'WGS72 UTM zone 2S'; + case 32303: + return 'WGS72 UTM zone 3S'; + case 32304: + return 'WGS72 UTM zone 4S'; + case 32305: + return 'WGS72 UTM zone 5S'; + case 32306: + return 'WGS72 UTM zone 6S'; + case 32307: + return 'WGS72 UTM zone 7S'; + case 32308: + return 'WGS72 UTM zone 8S'; + case 32309: + return 'WGS72 UTM zone 9S'; + case 32310: + return 'WGS72 UTM zone 10S'; + case 32311: + return 'WGS72 UTM zone 11S'; + case 32312: + return 'WGS72 UTM zone 12S'; + case 32313: + return 'WGS72 UTM zone 13S'; + case 32314: + return 'WGS72 UTM zone 14S'; + case 32315: + return 'WGS72 UTM zone 15S'; + case 32316: + return 'WGS72 UTM zone 16S'; + case 32317: + return 'WGS72 UTM zone 17S'; + case 32318: + return 'WGS72 UTM zone 18S'; + case 32319: + return 'WGS72 UTM zone 19S'; + case 32320: + return 'WGS72 UTM zone 20S'; + case 32321: + return 'WGS72 UTM zone 21S'; + case 32322: + return 'WGS72 UTM zone 22S'; + case 32323: + return 'WGS72 UTM zone 23S'; + case 32324: + return 'WGS72 UTM zone 24S'; + case 32325: + return 'WGS72 UTM zone 25S'; + case 32326: + return 'WGS72 UTM zone 26S'; + case 32327: + return 'WGS72 UTM zone 27S'; + case 32328: + return 'WGS72 UTM zone 28S'; + case 32329: + return 'WGS72 UTM zone 29S'; + case 32330: + return 'WGS72 UTM zone 30S'; + case 32331: + return 'WGS72 UTM zone 31S'; + case 32332: + return 'WGS72 UTM zone 32S'; + case 32333: + return 'WGS72 UTM zone 33S'; + case 32334: + return 'WGS72 UTM zone 34S'; + case 32335: + return 'WGS72 UTM zone 35S'; + case 32336: + return 'WGS72 UTM zone 36S'; + case 32337: + return 'WGS72 UTM zone 37S'; + case 32338: + return 'WGS72 UTM zone 38S'; + case 32339: + return 'WGS72 UTM zone 39S'; + case 32340: + return 'WGS72 UTM zone 40S'; + case 32341: + return 'WGS72 UTM zone 41S'; + case 32342: + return 'WGS72 UTM zone 42S'; + case 32343: + return 'WGS72 UTM zone 43S'; + case 32344: + return 'WGS72 UTM zone 44S'; + case 32345: + return 'WGS72 UTM zone 45S'; + case 32346: + return 'WGS72 UTM zone 46S'; + case 32347: + return 'WGS72 UTM zone 47S'; + case 32348: + return 'WGS72 UTM zone 48S'; + case 32349: + return 'WGS72 UTM zone 49S'; + case 32350: + return 'WGS72 UTM zone 50S'; + case 32351: + return 'WGS72 UTM zone 51S'; + case 32352: + return 'WGS72 UTM zone 52S'; + case 32353: + return 'WGS72 UTM zone 53S'; + case 32354: + return 'WGS72 UTM zone 54S'; + case 32355: + return 'WGS72 UTM zone 55S'; + case 32356: + return 'WGS72 UTM zone 56S'; + case 32357: + return 'WGS72 UTM zone 57S'; + case 32358: + return 'WGS72 UTM zone 58S'; + case 32359: + return 'WGS72 UTM zone 59S'; + case 32360: + return 'WGS72 UTM zone 60S'; + case 32401: + return 'WGS72BE UTM zone 1N'; + case 32402: + return 'WGS72BE UTM zone 2N'; + case 32403: + return 'WGS72BE UTM zone 3N'; + case 32404: + return 'WGS72BE UTM zone 4N'; + case 32405: + return 'WGS72BE UTM zone 5N'; + case 32406: + return 'WGS72BE UTM zone 6N'; + case 32407: + return 'WGS72BE UTM zone 7N'; + case 32408: + return 'WGS72BE UTM zone 8N'; + case 32409: + return 'WGS72BE UTM zone 9N'; + case 32410: + return 'WGS72BE UTM zone 10N'; + case 32411: + return 'WGS72BE UTM zone 11N'; + case 32412: + return 'WGS72BE UTM zone 12N'; + case 32413: + return 'WGS72BE UTM zone 13N'; + case 32414: + return 'WGS72BE UTM zone 14N'; + case 32415: + return 'WGS72BE UTM zone 15N'; + case 32416: + return 'WGS72BE UTM zone 16N'; + case 32417: + return 'WGS72BE UTM zone 17N'; + case 32418: + return 'WGS72BE UTM zone 18N'; + case 32419: + return 'WGS72BE UTM zone 19N'; + case 32420: + return 'WGS72BE UTM zone 20N'; + case 32421: + return 'WGS72BE UTM zone 21N'; + case 32422: + return 'WGS72BE UTM zone 22N'; + case 32423: + return 'WGS72BE UTM zone 23N'; + case 32424: + return 'WGS72BE UTM zone 24N'; + case 32425: + return 'WGS72BE UTM zone 25N'; + case 32426: + return 'WGS72BE UTM zone 26N'; + case 32427: + return 'WGS72BE UTM zone 27N'; + case 32428: + return 'WGS72BE UTM zone 28N'; + case 32429: + return 'WGS72BE UTM zone 29N'; + case 32430: + return 'WGS72BE UTM zone 30N'; + case 32431: + return 'WGS72BE UTM zone 31N'; + case 32432: + return 'WGS72BE UTM zone 32N'; + case 32433: + return 'WGS72BE UTM zone 33N'; + case 32434: + return 'WGS72BE UTM zone 34N'; + case 32435: + return 'WGS72BE UTM zone 35N'; + case 32436: + return 'WGS72BE UTM zone 36N'; + case 32437: + return 'WGS72BE UTM zone 37N'; + case 32438: + return 'WGS72BE UTM zone 38N'; + case 32439: + return 'WGS72BE UTM zone 39N'; + case 32440: + return 'WGS72BE UTM zone 40N'; + case 32441: + return 'WGS72BE UTM zone 41N'; + case 32442: + return 'WGS72BE UTM zone 42N'; + case 32443: + return 'WGS72BE UTM zone 43N'; + case 32444: + return 'WGS72BE UTM zone 44N'; + case 32445: + return 'WGS72BE UTM zone 45N'; + case 32446: + return 'WGS72BE UTM zone 46N'; + case 32447: + return 'WGS72BE UTM zone 47N'; + case 32448: + return 'WGS72BE UTM zone 48N'; + case 32449: + return 'WGS72BE UTM zone 49N'; + case 32450: + return 'WGS72BE UTM zone 50N'; + case 32451: + return 'WGS72BE UTM zone 51N'; + case 32452: + return 'WGS72BE UTM zone 52N'; + case 32453: + return 'WGS72BE UTM zone 53N'; + case 32454: + return 'WGS72BE UTM zone 54N'; + case 32455: + return 'WGS72BE UTM zone 55N'; + case 32456: + return 'WGS72BE UTM zone 56N'; + case 32457: + return 'WGS72BE UTM zone 57N'; + case 32458: + return 'WGS72BE UTM zone 58N'; + case 32459: + return 'WGS72BE UTM zone 59N'; + case 32460: + return 'WGS72BE UTM zone 60N'; + case 32501: + return 'WGS72BE UTM zone 1S'; + case 32502: + return 'WGS72BE UTM zone 2S'; + case 32503: + return 'WGS72BE UTM zone 3S'; + case 32504: + return 'WGS72BE UTM zone 4S'; + case 32505: + return 'WGS72BE UTM zone 5S'; + case 32506: + return 'WGS72BE UTM zone 6S'; + case 32507: + return 'WGS72BE UTM zone 7S'; + case 32508: + return 'WGS72BE UTM zone 8S'; + case 32509: + return 'WGS72BE UTM zone 9S'; + case 32510: + return 'WGS72BE UTM zone 10S'; + case 32511: + return 'WGS72BE UTM zone 11S'; + case 32512: + return 'WGS72BE UTM zone 12S'; + case 32513: + return 'WGS72BE UTM zone 13S'; + case 32514: + return 'WGS72BE UTM zone 14S'; + case 32515: + return 'WGS72BE UTM zone 15S'; + case 32516: + return 'WGS72BE UTM zone 16S'; + case 32517: + return 'WGS72BE UTM zone 17S'; + case 32518: + return 'WGS72BE UTM zone 18S'; + case 32519: + return 'WGS72BE UTM zone 19S'; + case 32520: + return 'WGS72BE UTM zone 20S'; + case 32521: + return 'WGS72BE UTM zone 21S'; + case 32522: + return 'WGS72BE UTM zone 22S'; + case 32523: + return 'WGS72BE UTM zone 23S'; + case 32524: + return 'WGS72BE UTM zone 24S'; + case 32525: + return 'WGS72BE UTM zone 25S'; + case 32526: + return 'WGS72BE UTM zone 26S'; + case 32527: + return 'WGS72BE UTM zone 27S'; + case 32528: + return 'WGS72BE UTM zone 28S'; + case 32529: + return 'WGS72BE UTM zone 29S'; + case 32530: + return 'WGS72BE UTM zone 30S'; + case 32531: + return 'WGS72BE UTM zone 31S'; + case 32532: + return 'WGS72BE UTM zone 32S'; + case 32533: + return 'WGS72BE UTM zone 33S'; + case 32534: + return 'WGS72BE UTM zone 34S'; + case 32535: + return 'WGS72BE UTM zone 35S'; + case 32536: + return 'WGS72BE UTM zone 36S'; + case 32537: + return 'WGS72BE UTM zone 37S'; + case 32538: + return 'WGS72BE UTM zone 38S'; + case 32539: + return 'WGS72BE UTM zone 39S'; + case 32540: + return 'WGS72BE UTM zone 40S'; + case 32541: + return 'WGS72BE UTM zone 41S'; + case 32542: + return 'WGS72BE UTM zone 42S'; + case 32543: + return 'WGS72BE UTM zone 43S'; + case 32544: + return 'WGS72BE UTM zone 44S'; + case 32545: + return 'WGS72BE UTM zone 45S'; + case 32546: + return 'WGS72BE UTM zone 46S'; + case 32547: + return 'WGS72BE UTM zone 47S'; + case 32548: + return 'WGS72BE UTM zone 48S'; + case 32549: + return 'WGS72BE UTM zone 49S'; + case 32550: + return 'WGS72BE UTM zone 50S'; + case 32551: + return 'WGS72BE UTM zone 51S'; + case 32552: + return 'WGS72BE UTM zone 52S'; + case 32553: + return 'WGS72BE UTM zone 53S'; + case 32554: + return 'WGS72BE UTM zone 54S'; + case 32555: + return 'WGS72BE UTM zone 55S'; + case 32556: + return 'WGS72BE UTM zone 56S'; + case 32557: + return 'WGS72BE UTM zone 57S'; + case 32558: + return 'WGS72BE UTM zone 58S'; + case 32559: + return 'WGS72BE UTM zone 59S'; + case 32560: + return 'WGS72BE UTM zone 60S'; + case 32601: + return 'WGS84 UTM zone 1N'; + case 32602: + return 'WGS84 UTM zone 2N'; + case 32603: + return 'WGS84 UTM zone 3N'; + case 32604: + return 'WGS84 UTM zone 4N'; + case 32605: + return 'WGS84 UTM zone 5N'; + case 32606: + return 'WGS84 UTM zone 6N'; + case 32607: + return 'WGS84 UTM zone 7N'; + case 32608: + return 'WGS84 UTM zone 8N'; + case 32609: + return 'WGS84 UTM zone 9N'; + case 32610: + return 'WGS84 UTM zone 10N'; + case 32611: + return 'WGS84 UTM zone 11N'; + case 32612: + return 'WGS84 UTM zone 12N'; + case 32613: + return 'WGS84 UTM zone 13N'; + case 32614: + return 'WGS84 UTM zone 14N'; + case 32615: + return 'WGS84 UTM zone 15N'; + case 32616: + return 'WGS84 UTM zone 16N'; + case 32617: + return 'WGS84 UTM zone 17N'; + case 32618: + return 'WGS84 UTM zone 18N'; + case 32619: + return 'WGS84 UTM zone 19N'; + case 32620: + return 'WGS84 UTM zone 20N'; + case 32621: + return 'WGS84 UTM zone 21N'; + case 32622: + return 'WGS84 UTM zone 22N'; + case 32623: + return 'WGS84 UTM zone 23N'; + case 32624: + return 'WGS84 UTM zone 24N'; + case 32625: + return 'WGS84 UTM zone 25N'; + case 32626: + return 'WGS84 UTM zone 26N'; + case 32627: + return 'WGS84 UTM zone 27N'; + case 32628: + return 'WGS84 UTM zone 28N'; + case 32629: + return 'WGS84 UTM zone 29N'; + case 32630: + return 'WGS84 UTM zone 30N'; + case 32631: + return 'WGS84 UTM zone 31N'; + case 32632: + return 'WGS84 UTM zone 32N'; + case 32633: + return 'WGS84 UTM zone 33N'; + case 32634: + return 'WGS84 UTM zone 34N'; + case 32635: + return 'WGS84 UTM zone 35N'; + case 32636: + return 'WGS84 UTM zone 36N'; + case 32637: + return 'WGS84 UTM zone 37N'; + case 32638: + return 'WGS84 UTM zone 38N'; + case 32639: + return 'WGS84 UTM zone 39N'; + case 32640: + return 'WGS84 UTM zone 40N'; + case 32641: + return 'WGS84 UTM zone 41N'; + case 32642: + return 'WGS84 UTM zone 42N'; + case 32643: + return 'WGS84 UTM zone 43N'; + case 32644: + return 'WGS84 UTM zone 44N'; + case 32645: + return 'WGS84 UTM zone 45N'; + case 32646: + return 'WGS84 UTM zone 46N'; + case 32647: + return 'WGS84 UTM zone 47N'; + case 32648: + return 'WGS84 UTM zone 48N'; + case 32649: + return 'WGS84 UTM zone 49N'; + case 32650: + return 'WGS84 UTM zone 50N'; + case 32651: + return 'WGS84 UTM zone 51N'; + case 32652: + return 'WGS84 UTM zone 52N'; + case 32653: + return 'WGS84 UTM zone 53N'; + case 32654: + return 'WGS84 UTM zone 54N'; + case 32655: + return 'WGS84 UTM zone 55N'; + case 32656: + return 'WGS84 UTM zone 56N'; + case 32657: + return 'WGS84 UTM zone 57N'; + case 32658: + return 'WGS84 UTM zone 58N'; + case 32659: + return 'WGS84 UTM zone 59N'; + case 32660: + return 'WGS84 UTM zone 60N'; + case 32701: + return 'WGS84 UTM zone 1S'; + case 32702: + return 'WGS84 UTM zone 2S'; + case 32703: + return 'WGS84 UTM zone 3S'; + case 32704: + return 'WGS84 UTM zone 4S'; + case 32705: + return 'WGS84 UTM zone 5S'; + case 32706: + return 'WGS84 UTM zone 6S'; + case 32707: + return 'WGS84 UTM zone 7S'; + case 32708: + return 'WGS84 UTM zone 8S'; + case 32709: + return 'WGS84 UTM zone 9S'; + case 32710: + return 'WGS84 UTM zone 10S'; + case 32711: + return 'WGS84 UTM zone 11S'; + case 32712: + return 'WGS84 UTM zone 12S'; + case 32713: + return 'WGS84 UTM zone 13S'; + case 32714: + return 'WGS84 UTM zone 14S'; + case 32715: + return 'WGS84 UTM zone 15S'; + case 32716: + return 'WGS84 UTM zone 16S'; + case 32717: + return 'WGS84 UTM zone 17S'; + case 32718: + return 'WGS84 UTM zone 18S'; + case 32719: + return 'WGS84 UTM zone 19S'; + case 32720: + return 'WGS84 UTM zone 20S'; + case 32721: + return 'WGS84 UTM zone 21S'; + case 32722: + return 'WGS84 UTM zone 22S'; + case 32723: + return 'WGS84 UTM zone 23S'; + case 32724: + return 'WGS84 UTM zone 24S'; + case 32725: + return 'WGS84 UTM zone 25S'; + case 32726: + return 'WGS84 UTM zone 26S'; + case 32727: + return 'WGS84 UTM zone 27S'; + case 32728: + return 'WGS84 UTM zone 28S'; + case 32729: + return 'WGS84 UTM zone 29S'; + case 32730: + return 'WGS84 UTM zone 30S'; + case 32731: + return 'WGS84 UTM zone 31S'; + case 32732: + return 'WGS84 UTM zone 32S'; + case 32733: + return 'WGS84 UTM zone 33S'; + case 32734: + return 'WGS84 UTM zone 34S'; + case 32735: + return 'WGS84 UTM zone 35S'; + case 32736: + return 'WGS84 UTM zone 36S'; + case 32737: + return 'WGS84 UTM zone 37S'; + case 32738: + return 'WGS84 UTM zone 38S'; + case 32739: + return 'WGS84 UTM zone 39S'; + case 32740: + return 'WGS84 UTM zone 40S'; + case 32741: + return 'WGS84 UTM zone 41S'; + case 32742: + return 'WGS84 UTM zone 42S'; + case 32743: + return 'WGS84 UTM zone 43S'; + case 32744: + return 'WGS84 UTM zone 44S'; + case 32745: + return 'WGS84 UTM zone 45S'; + case 32746: + return 'WGS84 UTM zone 46S'; + case 32747: + return 'WGS84 UTM zone 47S'; + case 32748: + return 'WGS84 UTM zone 48S'; + case 32749: + return 'WGS84 UTM zone 49S'; + case 32750: + return 'WGS84 UTM zone 50S'; + case 32751: + return 'WGS84 UTM zone 51S'; + case 32752: + return 'WGS84 UTM zone 52S'; + case 32753: + return 'WGS84 UTM zone 53S'; + case 32754: + return 'WGS84 UTM zone 54S'; + case 32755: + return 'WGS84 UTM zone 55S'; + case 32756: + return 'WGS84 UTM zone 56S'; + case 32757: + return 'WGS84 UTM zone 57S'; + case 32758: + return 'WGS84 UTM zone 58S'; + case 32759: + return 'WGS84 UTM zone 59S'; + case 32760: + return 'WGS84 UTM zone 60S'; + case 32767: + return 'User Defined'; + default: + return 'Unknown ($value)'; + } + } + + static String getProjectionDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 10101: + return 'Alabama CS27 East'; + case 10102: + return 'Alabama CS27 West'; + case 10131: + return 'Alabama CS83 East'; + case 10132: + return 'Alabama CS83 West'; + case 10201: + return 'Arizona Coordinate System east'; + case 10202: + return 'Arizona Coordinate System Central'; + case 10203: + return 'Arizona Coordinate System west'; + case 10231: + return 'Arizona CS83 east'; + case 10232: + return 'Arizona CS83 Central'; + case 10233: + return 'Arizona CS83 west'; + case 10301: + return 'Arkansas CS27 North'; + case 10302: + return 'Arkansas CS27 South'; + case 10331: + return 'Arkansas CS83 North'; + case 10332: + return 'Arkansas CS83 South'; + case 10401: + return 'California CS27 I'; + case 10402: + return 'California CS27 II'; + case 10403: + return 'California CS27 III'; + case 10404: + return 'California CS27 IV'; + case 10405: + return 'California CS27 V'; + case 10406: + return 'California CS27 VI'; + case 10407: + return 'California CS27 VII'; + case 10431: + return 'California CS83 1'; + case 10432: + return 'California CS83 2'; + case 10433: + return 'California CS83 3'; + case 10434: + return 'California CS83 4'; + case 10435: + return 'California CS83 5'; + case 10436: + return 'California CS83 6'; + case 10501: + return 'Colorado CS27 North'; + case 10502: + return 'Colorado CS27 Central'; + case 10503: + return 'Colorado CS27 South'; + case 10531: + return 'Colorado CS83 North'; + case 10532: + return 'Colorado CS83 Central'; + case 10533: + return 'Colorado CS83 South'; + case 10600: + return 'Connecticut CS27'; + case 10630: + return 'Connecticut CS83'; + case 10700: + return 'Delaware CS27'; + case 10730: + return 'Delaware CS83'; + case 10901: + return 'Florida CS27 East'; + case 10902: + return 'Florida CS27 West'; + case 10903: + return 'Florida CS27 North'; + case 10931: + return 'Florida CS83 East'; + case 10932: + return 'Florida CS83 West'; + case 10933: + return 'Florida CS83 North'; + case 11001: + return 'Georgia CS27 East'; + case 11002: + return 'Georgia CS27 West'; + case 11031: + return 'Georgia CS83 East'; + case 11032: + return 'Georgia CS83 West'; + case 11101: + return 'Idaho CS27 East'; + case 11102: + return 'Idaho CS27 Central'; + case 11103: + return 'Idaho CS27 West'; + case 11131: + return 'Idaho CS83 East'; + case 11132: + return 'Idaho CS83 Central'; + case 11133: + return 'Idaho CS83 West'; + case 11201: + return 'Illinois CS27 East'; + case 11202: + return 'Illinois CS27 West'; + case 11231: + return 'Illinois CS83 East'; + case 11232: + return 'Illinois CS83 West'; + case 11301: + return 'Indiana CS27 East'; + case 11302: + return 'Indiana CS27 West'; + case 11331: + return 'Indiana CS83 East'; + case 11332: + return 'Indiana CS83 West'; + case 11401: + return 'Iowa CS27 North'; + case 11402: + return 'Iowa CS27 South'; + case 11431: + return 'Iowa CS83 North'; + case 11432: + return 'Iowa CS83 South'; + case 11501: + return 'Kansas CS27 North'; + case 11502: + return 'Kansas CS27 South'; + case 11531: + return 'Kansas CS83 North'; + case 11532: + return 'Kansas CS83 South'; + case 11601: + return 'Kentucky CS27 North'; + case 11602: + return 'Kentucky CS27 South'; + case 11631: + return 'Kentucky CS83 North'; + case 11632: + return 'Kentucky CS83 South'; + case 11701: + return 'Louisiana CS27 North'; + case 11702: + return 'Louisiana CS27 South'; + case 11731: + return 'Louisiana CS83 North'; + case 11732: + return 'Louisiana CS83 South'; + case 11801: + return 'Maine CS27 East'; + case 11802: + return 'Maine CS27 West'; + case 11831: + return 'Maine CS83 East'; + case 11832: + return 'Maine CS83 West'; + case 11900: + return 'Maryland CS27'; + case 11930: + return 'Maryland CS83'; + case 12001: + return 'Massachusetts CS27 Mainland'; + case 12002: + return 'Massachusetts CS27 Island'; + case 12031: + return 'Massachusetts CS83 Mainland'; + case 12032: + return 'Massachusetts CS83 Island'; + case 12101: + return 'Michigan State Plane East'; + case 12102: + return 'Michigan State Plane Old Central'; + case 12103: + return 'Michigan State Plane West'; + case 12111: + return 'Michigan CS27 North'; + case 12112: + return 'Michigan CS27 Central'; + case 12113: + return 'Michigan CS27 South'; + case 12141: + return 'Michigan CS83 North'; + case 12142: + return 'Michigan CS83 Central'; + case 12143: + return 'Michigan CS83 South'; + case 12201: + return 'Minnesota CS27 North'; + case 12202: + return 'Minnesota CS27 Central'; + case 12203: + return 'Minnesota CS27 South'; + case 12231: + return 'Minnesota CS83 North'; + case 12232: + return 'Minnesota CS83 Central'; + case 12233: + return 'Minnesota CS83 South'; + case 12301: + return 'Mississippi CS27 East'; + case 12302: + return 'Mississippi CS27 West'; + case 12331: + return 'Mississippi CS83 East'; + case 12332: + return 'Mississippi CS83 West'; + case 12401: + return 'Missouri CS27 East'; + case 12402: + return 'Missouri CS27 Central'; + case 12403: + return 'Missouri CS27 West'; + case 12431: + return 'Missouri CS83 East'; + case 12432: + return 'Missouri CS83 Central'; + case 12433: + return 'Missouri CS83 West'; + case 12501: + return 'Montana CS27 North'; + case 12502: + return 'Montana CS27 Central'; + case 12503: + return 'Montana CS27 South'; + case 12530: + return 'Montana CS83'; + case 12601: + return 'Nebraska CS27 North'; + case 12602: + return 'Nebraska CS27 South'; + case 12630: + return 'Nebraska CS83'; + case 12701: + return 'Nevada CS27 East'; + case 12702: + return 'Nevada CS27 Central'; + case 12703: + return 'Nevada CS27 West'; + case 12731: + return 'Nevada CS83 East'; + case 12732: + return 'Nevada CS83 Central'; + case 12733: + return 'Nevada CS83 West'; + case 12800: + return 'New Hampshire CS27'; + case 12830: + return 'New Hampshire CS83'; + case 12900: + return 'New Jersey CS27'; + case 12930: + return 'New Jersey CS83'; + case 13001: + return 'New Mexico CS27 East'; + case 13002: + return 'New Mexico CS27 Central'; + case 13003: + return 'New Mexico CS27 West'; + case 13031: + return 'New Mexico CS83 East'; + case 13032: + return 'New Mexico CS83 Central'; + case 13033: + return 'New Mexico CS83 West'; + case 13101: + return 'New York CS27 East'; + case 13102: + return 'New York CS27 Central'; + case 13103: + return 'New York CS27 West'; + case 13104: + return 'New York CS27 Long Island'; + case 13131: + return 'New York CS83 East'; + case 13132: + return 'New York CS83 Central'; + case 13133: + return 'New York CS83 West'; + case 13134: + return 'New York CS83 Long Island'; + case 13200: + return 'North Carolina CS27'; + case 13230: + return 'North Carolina CS83'; + case 13301: + return 'North Dakota CS27 North'; + case 13302: + return 'North Dakota CS27 South'; + case 13331: + return 'North Dakota CS83 North'; + case 13332: + return 'North Dakota CS83 South'; + case 13401: + return 'Ohio CS27 North'; + case 13402: + return 'Ohio CS27 South'; + case 13431: + return 'Ohio CS83 North'; + case 13432: + return 'Ohio CS83 South'; + case 13501: + return 'Oklahoma CS27 North'; + case 13502: + return 'Oklahoma CS27 South'; + case 13531: + return 'Oklahoma CS83 North'; + case 13532: + return 'Oklahoma CS83 South'; + case 13601: + return 'Oregon CS27 North'; + case 13602: + return 'Oregon CS27 South'; + case 13631: + return 'Oregon CS83 North'; + case 13632: + return 'Oregon CS83 South'; + case 13701: + return 'Pennsylvania CS27 North'; + case 13702: + return 'Pennsylvania CS27 South'; + case 13731: + return 'Pennsylvania CS83 North'; + case 13732: + return 'Pennsylvania CS83 South'; + case 13800: + return 'Rhode Island CS27'; + case 13830: + return 'Rhode Island CS83'; + case 13901: + return 'South Carolina CS27 North'; + case 13902: + return 'South Carolina CS27 South'; + case 13930: + return 'South Carolina CS83'; + case 14001: + return 'South Dakota CS27 North'; + case 14002: + return 'South Dakota CS27 South'; + case 14031: + return 'South Dakota CS83 North'; + case 14032: + return 'South Dakota CS83 South'; + case 14100: + return 'Tennessee CS27'; + case 14130: + return 'Tennessee CS83'; + case 14201: + return 'Texas CS27 North'; + case 14202: + return 'Texas CS27 North Central'; + case 14203: + return 'Texas CS27 Central'; + case 14204: + return 'Texas CS27 South Central'; + case 14205: + return 'Texas CS27 South'; + case 14231: + return 'Texas CS83 North'; + case 14232: + return 'Texas CS83 North Central'; + case 14233: + return 'Texas CS83 Central'; + case 14234: + return 'Texas CS83 South Central'; + case 14235: + return 'Texas CS83 South'; + case 14301: + return 'Utah CS27 North'; + case 14302: + return 'Utah CS27 Central'; + case 14303: + return 'Utah CS27 South'; + case 14331: + return 'Utah CS83 North'; + case 14332: + return 'Utah CS83 Central'; + case 14333: + return 'Utah CS83 South'; + case 14400: + return 'Vermont CS27'; + case 14430: + return 'Vermont CS83'; + case 14501: + return 'Virginia CS27 North'; + case 14502: + return 'Virginia CS27 South'; + case 14531: + return 'Virginia CS83 North'; + case 14532: + return 'Virginia CS83 South'; + case 14601: + return 'Washington CS27 North'; + case 14602: + return 'Washington CS27 South'; + case 14631: + return 'Washington CS83 North'; + case 14632: + return 'Washington CS83 South'; + case 14701: + return 'West Virginia CS27 North'; + case 14702: + return 'West Virginia CS27 South'; + case 14731: + return 'West Virginia CS83 North'; + case 14732: + return 'West Virginia CS83 South'; + case 14801: + return 'Wisconsin CS27 North'; + case 14802: + return 'Wisconsin CS27 Central'; + case 14803: + return 'Wisconsin CS27 South'; + case 14831: + return 'Wisconsin CS83 North'; + case 14832: + return 'Wisconsin CS83 Central'; + case 14833: + return 'Wisconsin CS83 South'; + case 14901: + return 'Wyoming CS27 East'; + case 14902: + return 'Wyoming CS27 East Central'; + case 14903: + return 'Wyoming CS27 West Central'; + case 14904: + return 'Wyoming CS27 West'; + case 14931: + return 'Wyoming CS83 East'; + case 14932: + return 'Wyoming CS83 East Central'; + case 14933: + return 'Wyoming CS83 West Central'; + case 14934: + return 'Wyoming CS83 West'; + case 15001: + return 'Alaska CS27 1'; + case 15002: + return 'Alaska CS27 2'; + case 15003: + return 'Alaska CS27 3'; + case 15004: + return 'Alaska CS27 4'; + case 15005: + return 'Alaska CS27 5'; + case 15006: + return 'Alaska CS27 6'; + case 15007: + return 'Alaska CS27 7'; + case 15008: + return 'Alaska CS27 8'; + case 15009: + return 'Alaska CS27 9'; + case 15010: + return 'Alaska CS27 10'; + case 15031: + return 'Alaska CS83 1'; + case 15032: + return 'Alaska CS83 2'; + case 15033: + return 'Alaska CS83 3'; + case 15034: + return 'Alaska CS83 4'; + case 15035: + return 'Alaska CS83 5'; + case 15036: + return 'Alaska CS83 6'; + case 15037: + return 'Alaska CS83 7'; + case 15038: + return 'Alaska CS83 8'; + case 15039: + return 'Alaska CS83 9'; + case 15040: + return 'Alaska CS83 10'; + case 15101: + return 'Hawaii CS27 1'; + case 15102: + return 'Hawaii CS27 2'; + case 15103: + return 'Hawaii CS27 3'; + case 15104: + return 'Hawaii CS27 4'; + case 15105: + return 'Hawaii CS27 5'; + case 15131: + return 'Hawaii CS83 1'; + case 15132: + return 'Hawaii CS83 2'; + case 15133: + return 'Hawaii CS83 3'; + case 15134: + return 'Hawaii CS83 4'; + case 15135: + return 'Hawaii CS83 5'; + case 15201: + return 'Puerto Rico CS27'; + case 15202: + return 'St Croix'; + case 15230: + return 'Puerto Rico Virgin Is'; + case 15302: + return 'Kentucky CS27'; + case 15303: + return 'Kentucky CS83 North'; + case 15914: + return 'BLM 14N feet'; + case 15915: + return 'BLM 15N feet'; + case 15916: + return 'BLM 16N feet'; + case 15917: + return 'BLM 17N feet'; + case 16001: + return 'UTM zone 1N'; + case 16002: + return 'UTM zone 2N'; + case 16003: + return 'UTM zone 3N'; + case 16004: + return 'UTM zone 4N'; + case 16005: + return 'UTM zone 5N'; + case 16006: + return 'UTM zone 6N'; + case 16007: + return 'UTM zone 7N'; + case 16008: + return 'UTM zone 8N'; + case 16009: + return 'UTM zone 9N'; + case 16010: + return 'UTM zone 10N'; + case 16011: + return 'UTM zone 11N'; + case 16012: + return 'UTM zone 12N'; + case 16013: + return 'UTM zone 13N'; + case 16014: + return 'UTM zone 14N'; + case 16015: + return 'UTM zone 15N'; + case 16016: + return 'UTM zone 16N'; + case 16017: + return 'UTM zone 17N'; + case 16018: + return 'UTM zone 18N'; + case 16019: + return 'UTM zone 19N'; + case 16020: + return 'UTM zone 20N'; + case 16021: + return 'UTM zone 21N'; + case 16022: + return 'UTM zone 22N'; + case 16023: + return 'UTM zone 23N'; + case 16024: + return 'UTM zone 24N'; + case 16025: + return 'UTM zone 25N'; + case 16026: + return 'UTM zone 26N'; + case 16027: + return 'UTM zone 27N'; + case 16028: + return 'UTM zone 28N'; + case 16029: + return 'UTM zone 29N'; + case 16030: + return 'UTM zone 30N'; + case 16031: + return 'UTM zone 31N'; + case 16032: + return 'UTM zone 32N'; + case 16033: + return 'UTM zone 33N'; + case 16034: + return 'UTM zone 34N'; + case 16035: + return 'UTM zone 35N'; + case 16036: + return 'UTM zone 36N'; + case 16037: + return 'UTM zone 37N'; + case 16038: + return 'UTM zone 38N'; + case 16039: + return 'UTM zone 39N'; + case 16040: + return 'UTM zone 40N'; + case 16041: + return 'UTM zone 41N'; + case 16042: + return 'UTM zone 42N'; + case 16043: + return 'UTM zone 43N'; + case 16044: + return 'UTM zone 44N'; + case 16045: + return 'UTM zone 45N'; + case 16046: + return 'UTM zone 46N'; + case 16047: + return 'UTM zone 47N'; + case 16048: + return 'UTM zone 48N'; + case 16049: + return 'UTM zone 49N'; + case 16050: + return 'UTM zone 50N'; + case 16051: + return 'UTM zone 51N'; + case 16052: + return 'UTM zone 52N'; + case 16053: + return 'UTM zone 53N'; + case 16054: + return 'UTM zone 54N'; + case 16055: + return 'UTM zone 55N'; + case 16056: + return 'UTM zone 56N'; + case 16057: + return 'UTM zone 57N'; + case 16058: + return 'UTM zone 58N'; + case 16059: + return 'UTM zone 59N'; + case 16060: + return 'UTM zone 60N'; + case 16101: + return 'UTM zone 1S'; + case 16102: + return 'UTM zone 2S'; + case 16103: + return 'UTM zone 3S'; + case 16104: + return 'UTM zone 4S'; + case 16105: + return 'UTM zone 5S'; + case 16106: + return 'UTM zone 6S'; + case 16107: + return 'UTM zone 7S'; + case 16108: + return 'UTM zone 8S'; + case 16109: + return 'UTM zone 9S'; + case 16110: + return 'UTM zone 10S'; + case 16111: + return 'UTM zone 11S'; + case 16112: + return 'UTM zone 12S'; + case 16113: + return 'UTM zone 13S'; + case 16114: + return 'UTM zone 14S'; + case 16115: + return 'UTM zone 15S'; + case 16116: + return 'UTM zone 16S'; + case 16117: + return 'UTM zone 17S'; + case 16118: + return 'UTM zone 18S'; + case 16119: + return 'UTM zone 19S'; + case 16120: + return 'UTM zone 20S'; + case 16121: + return 'UTM zone 21S'; + case 16122: + return 'UTM zone 22S'; + case 16123: + return 'UTM zone 23S'; + case 16124: + return 'UTM zone 24S'; + case 16125: + return 'UTM zone 25S'; + case 16126: + return 'UTM zone 26S'; + case 16127: + return 'UTM zone 27S'; + case 16128: + return 'UTM zone 28S'; + case 16129: + return 'UTM zone 29S'; + case 16130: + return 'UTM zone 30S'; + case 16131: + return 'UTM zone 31S'; + case 16132: + return 'UTM zone 32S'; + case 16133: + return 'UTM zone 33S'; + case 16134: + return 'UTM zone 34S'; + case 16135: + return 'UTM zone 35S'; + case 16136: + return 'UTM zone 36S'; + case 16137: + return 'UTM zone 37S'; + case 16138: + return 'UTM zone 38S'; + case 16139: + return 'UTM zone 39S'; + case 16140: + return 'UTM zone 40S'; + case 16141: + return 'UTM zone 41S'; + case 16142: + return 'UTM zone 42S'; + case 16143: + return 'UTM zone 43S'; + case 16144: + return 'UTM zone 44S'; + case 16145: + return 'UTM zone 45S'; + case 16146: + return 'UTM zone 46S'; + case 16147: + return 'UTM zone 47S'; + case 16148: + return 'UTM zone 48S'; + case 16149: + return 'UTM zone 49S'; + case 16150: + return 'UTM zone 50S'; + case 16151: + return 'UTM zone 51S'; + case 16152: + return 'UTM zone 52S'; + case 16153: + return 'UTM zone 53S'; + case 16154: + return 'UTM zone 54S'; + case 16155: + return 'UTM zone 55S'; + case 16156: + return 'UTM zone 56S'; + case 16157: + return 'UTM zone 57S'; + case 16158: + return 'UTM zone 58S'; + case 16159: + return 'UTM zone 59S'; + case 16160: + return 'UTM zone 60S'; + case 16200: + return 'Gauss Kruger zone 0'; + case 16201: + return 'Gauss Kruger zone 1'; + case 16202: + return 'Gauss Kruger zone 2'; + case 16203: + return 'Gauss Kruger zone 3'; + case 16204: + return 'Gauss Kruger zone 4'; + case 16205: + return 'Gauss Kruger zone 5'; + case 17348: + return 'Map Grid of Australia 48'; + case 17349: + return 'Map Grid of Australia 49'; + case 17350: + return 'Map Grid of Australia 50'; + case 17351: + return 'Map Grid of Australia 51'; + case 17352: + return 'Map Grid of Australia 52'; + case 17353: + return 'Map Grid of Australia 53'; + case 17354: + return 'Map Grid of Australia 54'; + case 17355: + return 'Map Grid of Australia 55'; + case 17356: + return 'Map Grid of Australia 56'; + case 17357: + return 'Map Grid of Australia 57'; + case 17358: + return 'Map Grid of Australia 58'; + case 17448: + return 'Australian Map Grid 48'; + case 17449: + return 'Australian Map Grid 49'; + case 17450: + return 'Australian Map Grid 50'; + case 17451: + return 'Australian Map Grid 51'; + case 17452: + return 'Australian Map Grid 52'; + case 17453: + return 'Australian Map Grid 53'; + case 17454: + return 'Australian Map Grid 54'; + case 17455: + return 'Australian Map Grid 55'; + case 17456: + return 'Australian Map Grid 56'; + case 17457: + return 'Australian Map Grid 57'; + case 17458: + return 'Australian Map Grid 58'; + case 18031: + return 'Argentina 1'; + case 18032: + return 'Argentina 2'; + case 18033: + return 'Argentina 3'; + case 18034: + return 'Argentina 4'; + case 18035: + return 'Argentina 5'; + case 18036: + return 'Argentina 6'; + case 18037: + return 'Argentina 7'; + case 18051: + return 'Colombia 3W'; + case 18052: + return 'Colombia Bogota'; + case 18053: + return 'Colombia 3E'; + case 18054: + return 'Colombia 6E'; + case 18072: + return 'Egypt Red Belt'; + case 18073: + return 'Egypt Purple Belt'; + case 18074: + return 'Extended Purple Belt'; + case 18141: + return 'New Zealand North Island Nat Grid'; + case 18142: + return 'New Zealand South Island Nat Grid'; + case 19900: + return 'Bahrain Grid'; + case 19905: + return 'Netherlands E Indies Equatorial'; + case 19912: + return 'RSO Borneo'; + case 19926: + return 'Stereo 70'; + case 32767: + return 'User Defined'; + default: + return 'Unknown ($value)'; + } + } + + static String getProjCoordinateTransformDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 1: + return 'Transverse Mercator'; + case 2: + return 'Transverse Mercator Modified Alaska'; + case 3: + return 'Oblique Mercator'; + case 4: + return 'Oblique Mercator Laborde'; + case 5: + return 'Oblique Mercator Rosenmund'; + case 6: + return 'Oblique Mercator Spherical'; + case 7: + return 'Mercator'; + case 8: + return 'Lambert Conf Conic 2SP'; + case 9: + return 'Lambert Conf Conic 1SP'; + case 10: + return 'Lambert Azim Equal Area'; + case 11: + return 'Albers Equal Area'; + case 12: + return 'Azimuthal Equidistant'; + case 13: + return 'Equidistant Conic'; + case 14: + return 'Stereographic'; + case 15: + return 'Polar Stereographic'; + case 16: + return 'Oblique Stereographic'; + case 17: + return 'Equirectangular'; + case 18: + return 'Cassini Soldner'; + case 19: + return 'Gnomonic'; + case 20: + return 'Miller Cylindrical'; + case 21: + return 'Orthographic'; + case 22: + return 'Polyconic'; + case 23: + return 'Robinson'; + case 24: + return 'Sinusoidal'; + case 25: + return 'VanDerGrinten'; + case 26: + return 'New Zealand Map Grid'; + case 27: + return 'Transverse Mercator South Orientated'; + case 28: + return 'Cylindrical Equal Area'; + case 32767: + return 'User Defined'; + default: + return 'Unknown ($value)'; + } + } + + static String getGeoTiffUnitsDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 9001: + return 'Linear Meter'; + case 9002: + return 'Linear Foot'; + case 9003: + return 'Linear Foot US Survey'; + case 9004: + return 'Linear Foot Modified American'; + case 9005: + return 'Linear Foot Clarke'; + case 9006: + return 'Linear Foot Indian'; + case 9007: + return 'Linear Link'; + case 9008: + return 'Linear Link Benoit'; + case 9009: + return 'Linear Link Sears'; + case 9010: + return 'Linear Chain Benoit'; + case 9011: + return 'Linear Chain Sears'; + case 9012: + return 'Linear Yard Sears'; + case 9013: + return 'Linear Yard Indian'; + case 9014: + return 'Linear Fathom'; + case 9015: + return 'Linear Mile International Nautical'; + case 9101: + return 'Angular Radian'; + case 9102: + return 'Angular Degree'; + case 9103: + return 'Angular Arc Minute'; + case 9104: + return 'Angular Arc Second'; + case 9105: + return 'Angular Grad'; + case 9106: + return 'Angular Gon'; + case 9107: + return 'Angular DMS'; + case 9108: + return 'Angular DMS Hemisphere'; + case 32767: + return 'User Defined'; + default: + return 'Unknown ($value)'; + } + } +} diff --git a/lib/widgets/viewer/info/metadata/metadata_dir.dart b/lib/widgets/viewer/info/metadata/metadata_dir.dart new file mode 100644 index 0000000..af71770 --- /dev/null +++ b/lib/widgets/viewer/info/metadata/metadata_dir.dart @@ -0,0 +1,41 @@ +import 'dart:collection'; + +import 'package:flutter/material.dart'; + +class MetadataDirectory { + final String name; + final Color? color; + final String? parent; + final int? index; + final SplayTreeMap<String, String> allTags; + final SplayTreeMap<String, String> tags; + + // special directory names + static const exifThumbnailDirectory = 'Exif Thumbnail'; // from metadata-extractor + static const xmpDirectory = 'XMP'; // from metadata-extractor + static const coverDirectory = 'Cover'; // custom + static const geoTiffDirectory = 'GeoTIFF'; // custom + static const mediaDirectory = 'Media'; // custom + static const mpfImageDirectoryPrefix = 'MPF Image #'; // custom + + const MetadataDirectory( + this.name, + this.allTags, { + SplayTreeMap<String, String>? tags, + this.color, + this.parent, + this.index, + }) : tags = tags ?? allTags; + + MetadataDirectory filterKeys(bool Function(String key) testKey) { + final filteredTags = SplayTreeMap.of(Map.fromEntries(allTags.entries.where((kv) => testKey(kv.key)))); + return MetadataDirectory( + name, + tags, + tags: filteredTags, + color: color, + parent: parent, + index: index, + ); + } +} diff --git a/lib/widgets/viewer/info/metadata/metadata_dir_tile.dart b/lib/widgets/viewer/info/metadata/metadata_dir_tile.dart new file mode 100644 index 0000000..13d4c64 --- /dev/null +++ b/lib/widgets/viewer/info/metadata/metadata_dir_tile.dart @@ -0,0 +1,170 @@ +import 'dart:collection'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/ref/brand_colors.dart'; +import 'package:aves/services/metadata/svg_metadata_service.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:aves/widgets/viewer/info/embedded/notifications.dart'; +import 'package:aves/widgets/viewer/info/metadata/geotiff.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_dir.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_thumbnail.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_tile.dart'; +import 'package:aves/widgets/viewer/source_viewer_page.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class MetadataDirTile extends StatelessWidget { + final AvesEntry entry; + final String title; + final MetadataDirectory dir; + final ValueNotifier<String?>? expandedDirectoryNotifier; + final bool initiallyExpanded, showThumbnails; + + const MetadataDirTile({ + super.key, + required this.entry, + required this.title, + required this.dir, + this.expandedDirectoryNotifier, + this.initiallyExpanded = false, + this.showThumbnails = true, + }); + + @override + Widget build(BuildContext context) { + var tags = dir.tags; + if (tags.isEmpty) return const SizedBox(); + + return AvesExpansionTile( + title: title, + highlightColor: getTitleColor(context, dir), + expandedNotifier: expandedDirectoryNotifier, + initiallyExpanded: initiallyExpanded, + children: [ + MetadataDirTileBody( + entry: entry, + dir: dir, + showThumbnails: showThumbnails, + ), + ], + ); + } + + static Color getTitleColor(BuildContext context, MetadataDirectory dir) { + final dirName = dir.name; + if (dirName == MetadataDirectory.xmpDirectory) { + return context.select<AvesColorsData, Color>((v) => v.xmp); + } else { + final colors = context.watch<AvesColorsData>(); + return dir.color ?? colors.fromBrandColor(BrandColors.get(dirName)) ?? colors.fromString(dirName); + } + } +} + +class MetadataDirTileBody extends StatelessWidget { + final AvesEntry entry; + final MetadataDirectory dir; + final bool showThumbnails; + + const MetadataDirTileBody({ + super.key, + required this.entry, + required this.dir, + this.showThumbnails = true, + }); + + @override + Widget build(BuildContext context) { + var tags = dir.tags; + + late final List<Widget> children; + final dirName = dir.name; + if (dirName == MetadataDirectory.xmpDirectory) { + children = [ + Padding( + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), + child: XmpDirTileBody( + allTags: dir.allTags, + tags: tags, + ), + ), + ]; + } else { + Map<String, InfoValueSpanBuilder>? linkHandlers; + switch (dirName) { + case SvgMetadataService.metadataDirectory: + linkHandlers = getSvgLinkHandlers(tags); + case MetadataDirectory.coverDirectory: + linkHandlers = getVideoCoverLinkHandlers(tags); + case MetadataDirectory.geoTiffDirectory: + tags = SplayTreeMap.from( + tags.map((name, value) { + final tag = GeoTiffDirectory.tagForName(name); + return MapEntry(name, GeoTiffDirectory.formatValue(tag, value)); + }), + ); + } + + children = [ + if (showThumbnails && dirName == MetadataDirectory.exifThumbnailDirectory) MetadataThumbnails(entry: entry), + if (dirName.startsWith(MetadataDirectory.mpfImageDirectoryPrefix)) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: AvesOutlinedButton( + label: context.l10n.viewerInfoOpenLinkText, + onPressed: () { + final id = int.tryParse(dirName.substring(MetadataDirectory.mpfImageDirectoryPrefix.length)); + if (id != null) { + OpenEmbeddedDataNotification.mpf(id).dispatch(context); + } + }, + ), + ), + Padding( + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), + child: InfoRowGroup( + info: tags, + spanBuilders: linkHandlers, + ), + ), + ]; + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: children, + ); + } + + static Map<String, InfoValueSpanBuilder> getSvgLinkHandlers(SplayTreeMap<String, String> tags) { + return { + 'Metadata': InfoRowGroup.linkSpanBuilder( + linkText: (context) => context.l10n.viewerInfoViewXmlLinkText, + onTap: (context) { + Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: SourceViewerPage.routeName), + builder: (context) => SourceViewerPage( + loader: () => SynchronousFuture(tags['Metadata'] ?? ''), + ), + ), + ); + }, + ), + }; + } + + static Map<String, InfoValueSpanBuilder> getVideoCoverLinkHandlers(SplayTreeMap<String, String> tags) { + return { + 'Image': InfoRowGroup.linkSpanBuilder( + linkText: (context) => context.l10n.viewerInfoOpenLinkText, + onTap: (context) => OpenEmbeddedDataNotification.videoCover().dispatch(context), + ), + }; + } +} diff --git a/lib/widgets/viewer/info/metadata/metadata_section.dart b/lib/widgets/viewer/info/metadata/metadata_section.dart new file mode 100644 index 0000000..1233178 --- /dev/null +++ b/lib/widgets/viewer/info/metadata/metadata_section.dart @@ -0,0 +1,155 @@ +import 'dart:async'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/info.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_dir.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_dir_tile.dart'; +import 'package:aves/widgets/viewer/info/metadata/tv_page.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:provider/provider.dart'; + +class MetadataSectionSliver extends StatefulWidget { + final AvesEntry entry; + final ValueNotifier<Map<String, MetadataDirectory>> metadataNotifier; + + const MetadataSectionSliver({ + super.key, + required this.entry, + required this.metadataNotifier, + }); + + @override + State<StatefulWidget> createState() => _MetadataSectionSliverState(); +} + +class _MetadataSectionSliverState extends State<MetadataSectionSliver> { + final ValueNotifier<String?> _expandedDirectoryNotifier = ValueNotifier(null); + + AvesEntry get entry => widget.entry; + + ValueNotifier<Map<String, MetadataDirectory>> get metadataNotifier => widget.metadataNotifier; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + metadataNotifier.value = {}; + _getMetadata(); + } + + @override + void didUpdateWidget(covariant MetadataSectionSliver oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + _getMetadata(); + } + + @override + void dispose() { + _unregisterWidget(widget); + _expandedDirectoryNotifier.dispose(); + super.dispose(); + } + + void _registerWidget(MetadataSectionSliver widget) { + widget.entry.metadataChangeNotifier.addListener(_onMetadataChanged); + } + + void _unregisterWidget(MetadataSectionSliver widget) { + widget.entry.metadataChangeNotifier.removeListener(_onMetadataChanged); + } + + @override + Widget build(BuildContext context) { + // use a `Column` inside a `SliverToBoxAdapter`, instead of a `SliverList`, + // so that we can have the metadata-dependent `AnimationLimiter` inside the metadata section + // warning: placing the `AnimationLimiter` as a parent to the `ScrollView` + // triggers dispose & reinitialization of other sections, including heavy widgets like maps + return SliverToBoxAdapter( + child: NotificationListener<ScrollNotification>( + // cancel notification bubbling so that the info page + // does not misinterpret content scrolling for page scrolling + onNotification: (notification) => true, + child: ValueListenableBuilder<Map<String, MetadataDirectory>>( + valueListenable: metadataNotifier, + builder: (context, metadata, child) { + Widget content; + if (metadata.isEmpty) { + content = const SizedBox(); + } else { + final durations = context.watch<DurationsData>(); + content = Column( + children: AnimationConfiguration.toStaggeredList( + duration: durations.staggeredAnimation, + delay: durations.staggeredAnimationDelay * timeDilation, + childAnimationBuilder: (child) => SlideAnimation( + verticalOffset: 50.0, + child: FadeInAnimation( + child: child, + ), + ), + children: settings.useTvLayout + ? [ + const SizedBox(height: 16), + AvesOutlinedButton( + label: MaterialLocalizations.of(context).moreButtonTooltip, + onPressed: () { + Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: TvMetadataPage.routeName), + builder: (context) => TvMetadataPage( + entry: entry, + metadata: metadata, + ), + ), + ); + }, + ), + ] + : [ + const SectionRow(icon: AIcons.info), + ...metadata.entries.map( + (kv) => MetadataDirTile( + entry: entry, + title: kv.key, + dir: kv.value, + expandedDirectoryNotifier: _expandedDirectoryNotifier, + ), + ), + ], + ), + ); + } + + return AnimationLimiter( + // we update the limiter key after fetching the metadata of a new entry, + // in order to restart the staggered animation of the metadata section + key: ValueKey(metadata.length), + child: content, + ); + }, + ), + ), + ); + } + + void _onMetadataChanged() { + metadataNotifier.value = {}; + _getMetadata(); + } + + Future<void> _getMetadata() async { + final titledDirectories = await entry.getMetadataDirectories(context); + if (!mounted) return; + metadataNotifier.value = Map.fromEntries(titledDirectories); + _expandedDirectoryNotifier.value = null; + } +} diff --git a/lib/widgets/viewer/info/metadata/metadata_thumbnail.dart b/lib/widgets/viewer/info/metadata/metadata_thumbnail.dart new file mode 100644 index 0000000..e0125fa --- /dev/null +++ b/lib/widgets/viewer/info/metadata/metadata_thumbnail.dart @@ -0,0 +1,60 @@ +import 'dart:async'; +import 'dart:ui' as ui; + +import 'package:aves/image_providers/descriptor_provider.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:flutter/material.dart'; + +class MetadataThumbnails extends StatefulWidget { + final AvesEntry entry; + + const MetadataThumbnails({ + super.key, + required this.entry, + }); + + @override + State<MetadataThumbnails> createState() => _MetadataThumbnailsState(); +} + +class _MetadataThumbnailsState extends State<MetadataThumbnails> { + late Future<List<ui.ImageDescriptor?>> _loader; + + AvesEntry get entry => widget.entry; + + String get uri => entry.uri; + + @override + void initState() { + super.initState(); + _loader = embeddedDataService.getExifThumbnails(entry); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder<List<ui.ImageDescriptor?>>( + future: _loader, + builder: (context, snapshot) { + if (!snapshot.hasError && snapshot.connectionState == ConnectionState.done && snapshot.data!.isNotEmpty) { + return Container( + alignment: AlignmentDirectional.topStart, + padding: const EdgeInsets.only(left: 8, top: 8, right: 8, bottom: 4), + child: Wrap( + children: snapshot.data!.map((descriptor) { + if (descriptor == null) return const SizedBox(); + return Image( + image: DescriptorImageProvider( + descriptor, + scale: MediaQuery.devicePixelRatioOf(context), + ), + ); + }).toList(), + ), + ); + } + return const SizedBox(); + }, + ); + } +} diff --git a/lib/widgets/viewer/info/metadata/tv_page.dart b/lib/widgets/viewer/info/metadata/tv_page.dart new file mode 100644 index 0000000..0cfbae5 --- /dev/null +++ b/lib/widgets/viewer/info/metadata/tv_page.dart @@ -0,0 +1,122 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/behaviour/intents.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/navigation/tv_rail.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_dir.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_dir_tile.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class TvMetadataPage extends StatefulWidget { + static const routeName = '/info/metadata'; + + final AvesEntry entry; + final Map<String, MetadataDirectory> metadata; + + const TvMetadataPage({ + super.key, + required this.entry, + required this.metadata, + }); + + @override + State<TvMetadataPage> createState() => _TvMetadataPageState(); +} + +class _TvMetadataPageState extends State<TvMetadataPage> { + final ValueNotifier<int> _railIndexNotifier = ValueNotifier(0); + final FocusNode _railFocusNode = FocusNode(); + final ScrollController _detailsScrollController = ScrollController(); + + Map<String, MetadataDirectory> get metadata => widget.metadata; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + _railFocusNode.children.firstOrNull?.requestFocus(); + }); + } + + @override + void dispose() { + _railIndexNotifier.dispose(); + _railFocusNode.dispose(); + _detailsScrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AvesScaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + title: Text(context.l10n.viewerInfoPageTitle), + ), + body: ValueListenableBuilder<int>( + valueListenable: _railIndexNotifier, + builder: (context, selectedIndex, child) { + final titles = metadata.keys.toList(); + final selectedDir = metadata[titles[selectedIndex]]; + if (selectedDir == null) return const SizedBox(); + + final rail = NavigationRail( + extended: true, + destinations: titles.mapIndexed((i, title) { + final dir = metadata[titles[i]]!; + final color = MetadataDirTile.getTitleColor(context, dir); + return NavigationRailDestination( + icon: Icon(AIcons.circle, fill: 1, color: color), + label: Text(title), + ); + }).toList(), + selectedIndex: selectedIndex, + onDestinationSelected: (index) => _railIndexNotifier.value = index, + minExtendedWidth: TvRail.minExtendedWidth, + ); + + return SafeArea( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(width: 16), + Focus( + focusNode: _railFocusNode, + skipTraversal: true, + canRequestFocus: false, + child: SingleChildScrollView( + child: IntrinsicHeight( + child: rail, + ), + ), + ), + Expanded( + child: FocusableActionDetector( + shortcuts: const { + SingleActivator(LogicalKeyboardKey.arrowUp): ScrollIntent(direction: AxisDirection.up, type: ScrollIncrementType.page), + SingleActivator(LogicalKeyboardKey.arrowDown): ScrollIntent(direction: AxisDirection.down, type: ScrollIncrementType.page), + }, + actions: { + ScrollIntent: ScrollControllerAction(scrollController: _detailsScrollController), + }, + child: SingleChildScrollView( + controller: _detailsScrollController, + padding: const EdgeInsets.all(16), + child: MetadataDirTileBody( + entry: widget.entry, + dir: selectedDir, + ), + ), + ), + ), + ], + ), + ); + }, + ), + ); + } +} diff --git a/lib/widgets/viewer/info/metadata/xmp_card.dart b/lib/widgets/viewer/info/metadata/xmp_card.dart new file mode 100644 index 0000000..2a89b8e --- /dev/null +++ b/lib/widgets/viewer/info/metadata/xmp_card.dart @@ -0,0 +1,158 @@ +import 'dart:math'; + +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/multi_cross_fader.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/highlight_title.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; +import 'package:flutter/material.dart'; + +typedef XmpExtractedCard = (Map<String, XmpProp>, List<XmpCardData>?); + +class XmpCard extends StatefulWidget { + final String title; + late final XmpExtractedCard? directStruct; + late final List<XmpExtractedCard>? indexedStructs; + final String Function(XmpProp prop) formatValue; + final Map<String, InfoValueSpanBuilder> Function(int? index)? spanBuilders; + + XmpCard({ + super.key, + required this.title, + required Map<int?, XmpExtractedCard> structByIndex, + required this.formatValue, + this.spanBuilders, + }) { + directStruct = structByIndex[null]; + + final length = structByIndex.keys.nonNulls.fold(0, max); + indexedStructs = length > 0 ? [for (var i = 0; i < length; i++) structByIndex[i + 1] ?? const ({}, null)] : null; + } + + @override + State<XmpCard> createState() => _XmpCardState(); +} + +class _XmpCardState extends State<XmpCard> { + final ValueNotifier<int> _indexNotifier = ValueNotifier(0); + + List<XmpExtractedCard>? get indexedStructs => widget.indexedStructs; + + bool get isIndexed => indexedStructs != null; + + int get indexedStructCount => indexedStructs?.length ?? 0; + + @override + void initState() { + super.initState(); + if (isIndexed) { + _indexNotifier.value = indexedStructCount - 1; + } + } + + @override + void didUpdateWidget(covariant XmpCard oldWidget) { + super.didUpdateWidget(oldWidget); + if (isIndexed && _indexNotifier.value >= indexedStructCount) { + _indexNotifier.value = indexedStructCount - 1; + } + } + + @override + void dispose() { + _indexNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final _isIndexed = isIndexed; + + return Container( + decoration: BoxDecoration( + border: Border.all( + color: Theme.of(context).dividerColor, + ), + borderRadius: const BorderRadius.all(Radius.circular(4)), + ), + child: ValueListenableBuilder<int>( + valueListenable: _indexNotifier, + builder: (context, index, child) { + final data = _isIndexed ? indexedStructs![index] : widget.directStruct!; + final props = data.$1.entries.map((kv) => XmpProp(kv.key, kv.value.value)).toList()..sort(); + final cards = data.$2; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(left: 8, top: 8, right: 8), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: HighlightTitle( + title: widget.title, + showHighlight: false, + ), + ), + if (_isIndexed) ...[ + IconButton( + visualDensity: VisualDensity.compact, + icon: const Icon(AIcons.previous), + onPressed: index > 0 ? () => _setIndex(index - 1) : null, + tooltip: context.l10n.previousTooltip, + ), + HighlightTitle( + title: '${index + 1}', + showHighlight: false, + ), + IconButton( + visualDensity: VisualDensity.compact, + icon: const Icon(AIcons.next), + onPressed: index < indexedStructCount - 1 ? () => _setIndex(index + 1) : null, + tooltip: context.l10n.nextTooltip, + ), + ], + ], + ), + ), + MultiCrossFader( + duration: ADurations.xmpStructArrayCardTransition, + sizeCurve: Curves.easeOutBack, + alignment: AlignmentDirectional.topStart, + child: Padding( + // add padding at this level (instead of the column level) + // so that the crossfader can animate the content size + // without clipping the text + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), + child: InfoRowGroup( + info: Map.fromEntries(props.map((prop) => MapEntry(prop.displayKey, widget.formatValue(prop)))), + spanBuilders: widget.spanBuilders?.call(_isIndexed ? index + 1 : null), + ), + ), + ), + if (cards != null) + ...cards.where((v) => !v.isEmpty).map((card) { + final spanBuilders = card.spanBuilders; + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), + child: XmpCard( + title: card.title, + structByIndex: card.data, + formatValue: widget.formatValue, + spanBuilders: spanBuilders != null ? (index) => spanBuilders(index, card.data[index]!.$1) : null, + ), + ); + }), + ], + ); + }, + ), + ); + } + + void _setIndex(int index) => _indexNotifier.value = index.clamp(0, indexedStructCount - 1); +} diff --git a/lib/widgets/viewer/info/metadata/xmp_namespaces.dart b/lib/widgets/viewer/info/metadata/xmp_namespaces.dart new file mode 100644 index 0000000..9172bf2 --- /dev/null +++ b/lib/widgets/viewer/info/metadata/xmp_namespaces.dart @@ -0,0 +1,250 @@ +import 'package:aves/ref/brand_colors.dart'; +import 'package:aves/ref/metadata/xmp.dart'; +import 'package:aves/theme/colors.dart'; +import 'package:aves/utils/string_utils.dart'; +import 'package:aves/utils/xmp_utils.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/identity/highlight_title.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_card.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_ns/crs.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_ns/exif.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_ns/google.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_ns/misc.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_ns/photoshop.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_ns/tiff.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_ns/xmp.dart'; +import 'package:collection/collection.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +@immutable +class XmpNamespace extends Equatable { + final Map<String, String> schemaRegistryPrefixes; + final String nsUri, nsPrefix; + final Map<String, String> rawProps; + + @override + List<Object?> get props => [nsUri, nsPrefix]; + + XmpNamespace({ + required this.nsUri, + required this.schemaRegistryPrefixes, + required this.rawProps, + }) : nsPrefix = prefixForUri(schemaRegistryPrefixes, nsUri); + + factory XmpNamespace.create(Map<String, String> schemaRegistryPrefixes, String nsPrefix, Map<String, String> rawProps) { + final nsUri = schemaRegistryPrefixes[nsPrefix] ?? ''; + switch (nsUri) { + case XmpNamespaces.creatorAtom: + return XmpCreatorAtom(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.crs: + return XmpCrsNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.darktable: + return XmpDarktableNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.dwc: + return XmpDwcNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.exif: + return XmpExifNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.gAudio: + return XmpGAudioNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.gCamera: + return XmpGCameraNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.gContainer: + return XmpGContainer(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.gDepth: + return XmpGDepthNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.gDevice: + return XmpGDeviceNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.gImage: + return XmpGImageNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.iptc4xmpCore: + return XmpIptcCoreNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.iptc4xmpExt: + return XmpIptc4xmpExtNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.mwgrs: + return XmpMgwRegionsNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.mp: + return XmpMPNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.photoshop: + return XmpPhotoshopNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.plus: + return XmpPlusNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.tiff: + return XmpTiffNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.xmp: + return XmpBasicNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.xmpMM: + return XmpMMNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + case XmpNamespaces.xperiaCamera: + return XmpXperiaCameraNamespace(schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + default: + return XmpNamespace(nsUri: nsUri, schemaRegistryPrefixes: schemaRegistryPrefixes, rawProps: rawProps); + } + } + + String get displayTitle => XmpNamespaceView.nsTitles[nsUri] ?? (nsPrefix.isEmpty ? nsUri : '${nsPrefix.substring(0, nsPrefix.length - 1)} ($nsUri)'); + + List<Widget> buildNamespaceSection(BuildContext context) { + final props = + rawProps.entries + .map((kv) { + final key = kv.key; + if (skippedProps.any((pattern) => pattern.allMatches(key).isNotEmpty)) { + return null; + } + final prop = XmpProp(key, kv.value); + var extracted = false; + cards.forEach((card) => extracted |= card.extract(prop)); + return extracted ? null : prop; + }) + .nonNulls + .toList() + ..sort(); + + final content = [ + if (props.isNotEmpty) + InfoRowGroup( + info: Map.fromEntries(props.map((v) => MapEntry(v.displayKey, formatValue(v)))), + spanBuilders: linkifyValues(props), + ), + ...cards.where((v) => !v.isEmpty).map((card) { + final spanBuilders = card.spanBuilders; + return Padding( + padding: const EdgeInsets.only(top: 8), + child: XmpCard( + title: card.title, + structByIndex: card.data, + formatValue: formatValue, + spanBuilders: spanBuilders != null ? (index) => spanBuilders(index, card.data[index]!.$1) : null, + ), + ); + }), + ]; + + return content.isNotEmpty + ? [ + if (displayTitle.isNotEmpty) + Padding( + padding: const EdgeInsets.only(top: 8, bottom: 4), + child: HighlightTitle( + title: displayTitle, + color: context.select<AvesColorsData, Color?>((v) => v.fromBrandColor(BrandColors.get(displayTitle))), + ), + ), + ...content, + ] + : []; + } + + Set<RegExp> get skippedProps => {}; + + List<XmpCardData> get cards => []; + + String formatValue(XmpProp prop) => prop.value; + + Map<String, InfoValueSpanBuilder> linkifyValues(List<XmpProp> props) => {}; + + static String prefixForUri(Map<String, String> schemaRegistryPrefixes, String nsUri) => schemaRegistryPrefixes.entries.firstWhereOrNull((kv) => kv.value == nsUri)?.key ?? ''; +} + +class XmpProp implements Comparable<XmpProp> { + final String path, value; + final String displayKey; + + XmpProp(this.path, this.value) : displayKey = formatKey(path); + + static String formatKey(String propPath) { + return propPath.splitMapJoin( + XMP.structFieldSeparator, + onMatch: (match) => ' ${match.group(0)} ', + onNonMatch: (s) { + // strip namespace + final key = s.split(XMP.propNamespaceSeparator).last; + // format + return key.replaceAll('_', ' ').toSentenceCase(); + }, + ); + } + + @override + int compareTo(XmpProp other) => compareAsciiUpperCaseNatural(displayKey, other.displayKey); + + @override + String toString() => '$runtimeType#${shortHash(this)}{path=$path, value=$value}'; +} + +class XmpCardData { + final String title; + final RegExp pattern; + final bool indexed; + final Map<String, InfoValueSpanBuilder> Function(int?, Map<String, XmpProp> data)? spanBuilders; + final List<XmpCardData>? cards; + final Map<int?, XmpExtractedCard> data = {}; + + bool get isEmpty => data.isEmpty && (cards?.every((card) => card.isEmpty) ?? true); + + static final titlePattern = RegExp(r'(.*?)[\\/]'); + + XmpCardData( + this.pattern, { + String? title, + this.spanBuilders, + this.cards, + }) : indexed = pattern.pattern.contains(r'\[(\d+)\]'), + title = title ?? XmpProp.formatKey(titlePattern.firstMatch(pattern.pattern)!.group(1)!); + + XmpCardData cloneEmpty() { + return XmpCardData( + pattern, + title: title, + spanBuilders: spanBuilders, + cards: cards?.map((v) => v.cloneEmpty()).toList(), + ); + } + + bool extract(XmpProp prop) => indexed ? _extractIndexedStruct(prop) : _extractDirectStruct(prop); + + bool _extractDirectStruct(XmpProp prop) { + final matches = pattern.allMatches(prop.path); + if (matches.isEmpty) return false; + + final match = matches.first; + final field = match.group(1)!; + + final fields = data.putIfAbsent(null, () => (<String, XmpProp>{}, cards?.map((v) => v.cloneEmpty()).toList())); + final _cards = fields.$2; + if (_cards != null) { + final fieldProp = XmpProp(field, prop.value); + if (_cards.any((v) => v.extract(fieldProp))) { + return true; + } + } + + fields.$1[field] = prop; + return true; + } + + bool _extractIndexedStruct(XmpProp prop) { + final matches = pattern.allMatches(prop.path); + if (matches.isEmpty) return false; + + final match = matches.first; + final index = int.parse(match.group(1)!); + final field = match.group(2)!; + + final fields = data.putIfAbsent(index, () => (<String, XmpProp>{}, cards?.map((v) => v.cloneEmpty()).toList())); + final _cards = fields.$2; + if (_cards != null) { + final fieldProp = XmpProp(field, prop.value); + if (_cards.any((v) => v.extract(fieldProp))) { + return true; + } + } + + fields.$1[field] = prop; + return true; + } +} diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart b/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart new file mode 100644 index 0000000..15e987d --- /dev/null +++ b/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart @@ -0,0 +1,50 @@ +import 'package:aves/ref/metadata/xmp.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; + +class XmpCrsNamespace extends XmpNamespace { + XmpCrsNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.crs); + + @override + late final List<XmpCardData> cards = [ + XmpCardData(RegExp(nsPrefix + r'CircularGradientBasedCorrections\[(\d+)\]/(.*)')), + XmpCardData( + RegExp(nsPrefix + r'GradientBasedCorrections\[(\d+)\]/(.*)'), + cards: [ + XmpCardData(RegExp(nsPrefix + r'CorrectionMasks\[(\d+)\]/(.*)')), + XmpCardData(RegExp(nsPrefix + r'CorrectionRangeMask/(.*)')), + ], + ), + XmpCardData( + RegExp(nsPrefix + r'Look/(.*)'), + cards: [ + XmpCardData(RegExp(nsPrefix + r'Parameters/(.*)')), + ], + ), + XmpCardData( + RegExp(nsPrefix + r'MaskGroupBasedCorrections\[(\d+)\]/(.*)'), + cards: [ + XmpCardData( + RegExp(nsPrefix + r'CorrectionMasks\[(\d+)\]/(.*)'), + cards: [ + XmpCardData(RegExp(nsPrefix + r'CorrectionRangeMask/(.*)')), + XmpCardData(RegExp(nsPrefix + r'Masks\[(\d+)\]/(.*)')), + ], + ), + ], + ), + XmpCardData( + RegExp(nsPrefix + r'PaintBasedCorrections\[(\d+)\]/(.*)'), + cards: [ + XmpCardData(RegExp(nsPrefix + r'CorrectionMasks\[(\d+)\]/(.*)')), + XmpCardData(RegExp(nsPrefix + r'CorrectionRangeMask/(.*)')), + ], + ), + XmpCardData( + RegExp(nsPrefix + r'RetouchAreas\[(\d+)\]/(.*)'), + cards: [ + XmpCardData(RegExp(nsPrefix + r'Masks\[(\d+)\]/(.*)')), + ], + ), + XmpCardData(RegExp(nsPrefix + r'RangeMaskMapInfo/' + nsPrefix + r'RangeMaskMapInfo/(.*)')), + ]; +} diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/exif.dart b/lib/widgets/viewer/info/metadata/xmp_ns/exif.dart new file mode 100644 index 0000000..bbbf677 --- /dev/null +++ b/lib/widgets/viewer/info/metadata/xmp_ns/exif.dart @@ -0,0 +1,75 @@ +import 'package:aves/ref/metadata/exif.dart'; +import 'package:aves/ref/metadata/xmp.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; + +// cf https://github.com/adobe/xmp-docs/blob/master/XMPNamespaces/exif.md +class XmpExifNamespace extends XmpNamespace { + XmpExifNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.exif); + + @override + String formatValue(XmpProp prop) { + final v = prop.value; + final field = prop.path.replaceAll(nsPrefix, ''); + switch (field) { + case 'ColorSpace': + return Exif.getColorSpaceDescription(v); + case 'Contrast': + return Exif.getContrastDescription(v); + case 'CustomRendered': + return Exif.getCustomRenderedDescription(v); + case 'ExifVersion': + case 'FlashpixVersion': + return Exif.getExifVersionDescription(v); + case 'ExposureMode': + return Exif.getExposureModeDescription(v); + case 'ExposureProgram': + return Exif.getExposureProgramDescription(v); + case 'FileSource': + return Exif.getFileSourceDescription(v); + case 'Flash/Mode': + return Exif.getFlashModeDescription(v); + case 'Flash/Return': + return Exif.getFlashReturnDescription(v); + case 'FocalPlaneResolutionUnit': + return Exif.getResolutionUnitDescription(v); + case 'GainControl': + return Exif.getGainControlDescription(v); + case 'LightSource': + return Exif.getLightSourceDescription(v); + case 'MeteringMode': + return Exif.getMeteringModeDescription(v); + case 'Saturation': + return Exif.getSaturationDescription(v); + case 'SceneCaptureType': + return Exif.getSceneCaptureTypeDescription(v); + case 'SceneType': + return Exif.getSceneTypeDescription(v); + case 'SensingMethod': + return Exif.getSensingMethodDescription(v); + case 'Sharpness': + return Exif.getSharpnessDescription(v); + case 'SubjectDistanceRange': + return Exif.getSubjectDistanceRangeDescription(v); + case 'WhiteBalance': + return Exif.getWhiteBalanceDescription(v); + case 'GPSAltitudeRef': + return Exif.getGPSAltitudeRefDescription(v); + case 'GPSDestBearingRef': + case 'GPSImgDirectionRef': + case 'GPSTrackRef': + return Exif.getGPSDirectionRefDescription(v); + case 'GPSDestDistanceRef': + return Exif.getGPSDestDistanceRefDescription(v); + case 'GPSDifferential': + return Exif.getGPSDifferentialDescription(v); + case 'GPSMeasureMode': + return Exif.getGPSMeasureModeDescription(v); + case 'GPSSpeedRef': + return Exif.getGPSSpeedRefDescription(v); + case 'GPSStatus': + return Exif.getGPSStatusDescription(v); + default: + return v; + } + } +} diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/google.dart b/lib/widgets/viewer/info/metadata/xmp_ns/google.dart new file mode 100644 index 0000000..28fb4a7 --- /dev/null +++ b/lib/widgets/viewer/info/metadata/xmp_ns/google.dart @@ -0,0 +1,178 @@ +import 'package:aves/ref/metadata/xmp.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:aves/widgets/viewer/info/embedded/notifications.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; +import 'package:collection/collection.dart'; + +abstract class XmpGoogleNamespace extends XmpNamespace { + XmpGoogleNamespace({ + required super.nsUri, + required super.schemaRegistryPrefixes, + required super.rawProps, + }); + + List<(String, String)> get dataProps; + + @override + Map<String, InfoValueSpanBuilder> linkifyValues(List<XmpProp> props) { + return Map.fromEntries( + dataProps.map((t) { + final (dataPropPath, mimePropPath) = t; + final dataProp = props.firstWhereOrNull((prop) => prop.path == dataPropPath); + final mimeProp = props.firstWhereOrNull((prop) => prop.path == mimePropPath); + return (dataProp != null && mimeProp != null) + ? MapEntry( + dataProp.displayKey, + InfoRowGroup.linkSpanBuilder( + linkText: (context) => context.l10n.viewerInfoOpenLinkText, + onTap: (context) { + final pattern = RegExp(r'(.+):(.+)([(\d)])?'); + final props = dataProp.path.split('/').expand((part) { + var match = pattern.firstMatch(part); + if (match == null) return []; + + // ignore namespace prefix + final propName = match.group(2); + final prop = [nsUri, propName]; + + final indexString = match.groupCount >= 4 ? match.group(4) : null; + final index = indexString != null ? int.tryParse(indexString) : null; + if (index != null) { + return [prop, index]; + } else { + return [prop]; + } + }).toList(); + return OpenEmbeddedDataNotification.xmp( + props: props, + mimeType: mimeProp.value, + ).dispatch(context); + }, + ), + ) + : null; + }).nonNulls, + ); + } +} + +class XmpGAudioNamespace extends XmpGoogleNamespace { + XmpGAudioNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.gAudio); + + @override + List<(String, String)> get dataProps => [ + ('${nsPrefix}Data', '${nsPrefix}Mime'), + ]; +} + +class XmpGCameraNamespace extends XmpGoogleNamespace { + XmpGCameraNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.gCamera); + + @override + List<(String, String)> get dataProps => [ + ('${nsPrefix}RelitInputImageData', '${nsPrefix}RelitInputImageMime'), + ]; +} + +class XmpGContainer extends XmpNamespace { + late final String _gContainerItemNsPrefix; + late final String _rdfNsPrefix; + + XmpGContainer({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.gContainer) { + _gContainerItemNsPrefix = XmpNamespace.prefixForUri(schemaRegistryPrefixes, XmpNamespaces.gContainerItem); + _rdfNsPrefix = XmpNamespace.prefixForUri(schemaRegistryPrefixes, XmpNamespaces.rdf); + } + + @override + late final Set<RegExp> skippedProps = { + // variant of `Container:Item` with `<rdf:li>` + RegExp(nsPrefix + r'Directory\[(\d+)\]/' + _rdfNsPrefix + r'type'), + }; + + @override + late final List<XmpCardData> cards = [ + // variant of `Container:Item` with `<rdf:li rdf:parseType="Resource">` + XmpCardData(RegExp(nsPrefix + r'Directory\[(\d+)\]/' + nsPrefix + r'Item/(.*)'), title: 'Directory Item'), + // variant of `Container:Item` with `<rdf:li>` + XmpCardData(RegExp(nsPrefix + r'Directory\[(\d+)\]/(' + _gContainerItemNsPrefix + r'.*)'), title: 'Directory Item'), + ]; +} + +class XmpGDepthNamespace extends XmpGoogleNamespace { + XmpGDepthNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.gDepth); + + @override + List<(String, String)> get dataProps => [ + ('${nsPrefix}Data', '${nsPrefix}Mime'), + ('${nsPrefix}Confidence', '${nsPrefix}ConfidenceMime'), + ]; +} + +class XmpGDeviceNamespace extends XmpNamespace { + late final String _cameraNsPrefix; + late final String _containerNsPrefix; + late final String _itemNsPrefix; + + XmpGDeviceNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.gDevice) { + _cameraNsPrefix = XmpNamespace.prefixForUri(schemaRegistryPrefixes, XmpNamespaces.gDeviceCamera); + _containerNsPrefix = XmpNamespace.prefixForUri(schemaRegistryPrefixes, XmpNamespaces.gDeviceContainer); + _itemNsPrefix = XmpNamespace.prefixForUri(schemaRegistryPrefixes, XmpNamespaces.gDeviceItem); + + final mimePattern = RegExp(nsPrefix + r'Container/' + _containerNsPrefix + r'Directory\[(\d+)\]/' + _itemNsPrefix + r'Mime'); + final originalProps = rawProps.entries.toList(); + originalProps.forEach((kv) { + final path = kv.key; + final match = mimePattern.firstMatch(path); + if (match != null) { + final indexString = match.group(1); + if (indexString != null) { + final index = int.tryParse(indexString); + if (index != null) { + final dataPath = '${nsPrefix}Container/${_containerNsPrefix}Directory[$index]/${_itemNsPrefix}Data'; + rawProps[dataPath] = '[skipped]'; + } + } + } + }); + } + + @override + late final List<XmpCardData> cards = [ + XmpCardData( + RegExp(nsPrefix + r'Cameras\[(\d+)\]/(.*)'), + cards: [ + XmpCardData(RegExp(_cameraNsPrefix + r'DepthMap/(.*)')), + XmpCardData(RegExp(_cameraNsPrefix + r'Image/(.*)')), + XmpCardData(RegExp(_cameraNsPrefix + r'ImagingModel/(.*)')), + ], + ), + XmpCardData( + RegExp(nsPrefix + r'Container/' + _containerNsPrefix + r'Directory\[(\d+)\]/(.*)'), + spanBuilders: (index, struct) { + if (struct.containsKey('${_itemNsPrefix}Data') && struct.containsKey('${_itemNsPrefix}DataURI')) { + final dataUriProp = struct['${_itemNsPrefix}DataURI']; + if (dataUriProp != null) { + return { + 'Data': InfoRowGroup.linkSpanBuilder( + linkText: (context) => context.l10n.viewerInfoOpenLinkText, + onTap: (context) => OpenEmbeddedDataNotification.googleDevice(dataUri: dataUriProp.value).dispatch(context), + ), + }; + } + } + return {}; + }, + ), + XmpCardData(RegExp(nsPrefix + r'Profiles\[(\d+)\]/(.*)')), + ]; +} + +class XmpGImageNamespace extends XmpGoogleNamespace { + XmpGImageNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.gImage); + + @override + List<(String, String)> get dataProps => [ + ('${nsPrefix}Data', '${nsPrefix}Mime'), + ]; +} diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart b/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart new file mode 100644 index 0000000..168d92d --- /dev/null +++ b/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart @@ -0,0 +1,113 @@ +import 'package:aves/ref/metadata/xmp.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; + +class XmpCreatorAtom extends XmpNamespace { + XmpCreatorAtom({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.creatorAtom); + + @override + late final List<XmpCardData> cards = [ + XmpCardData(RegExp(nsPrefix + r'aeProjectLink/(.*)'), title: 'AE Project Link'), + ]; +} + +class XmpDarktableNamespace extends XmpNamespace { + XmpDarktableNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.darktable); + + @override + late final List<XmpCardData> cards = [ + XmpCardData(RegExp(nsPrefix + r'history\[(\d+)\]/(.*)')), + ]; +} + +class XmpDwcNamespace extends XmpNamespace { + XmpDwcNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.dwc); + + @override + late final List<XmpCardData> cards = [ + XmpCardData(RegExp(nsPrefix + r'dctermsLocation/(.*)'), title: 'DC Terms Location'), + XmpCardData(RegExp(nsPrefix + r'Event/(.*)')), + XmpCardData(RegExp(nsPrefix + r'GeologicalContext/(.*)')), + XmpCardData(RegExp(nsPrefix + r'Identification/(.*)')), + XmpCardData(RegExp(nsPrefix + r'MeasurementOrFact/(.*)')), + XmpCardData(RegExp(nsPrefix + r'Occurrence/(.*)')), + XmpCardData(RegExp(nsPrefix + r'Record/(.*)')), + XmpCardData(RegExp(nsPrefix + r'ResourceRelationship/(.*)')), + XmpCardData(RegExp(nsPrefix + r'Taxon/(.*)')), + ]; +} + +class XmpIptcCoreNamespace extends XmpNamespace { + XmpIptcCoreNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.iptc4xmpCore); + + @override + late final List<XmpCardData> cards = [ + XmpCardData(RegExp(nsPrefix + r'CreatorContactInfo/(.*)')), + ]; +} + +class XmpIptc4xmpExtNamespace extends XmpNamespace { + XmpIptc4xmpExtNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.iptc4xmpExt); + + @override + late final List<XmpCardData> cards = [ + XmpCardData(RegExp(nsPrefix + r'ArtworkOrObject\[(\d+)\]/(.*)')), + ]; +} + +class XmpMPNamespace extends XmpNamespace { + XmpMPNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.mp); + + @override + late final List<XmpCardData> cards = [ + XmpCardData(RegExp(nsPrefix + r'RegionInfo/MPRI:Regions\[(\d+)\]/(.*)'), title: 'Regions'), + ]; +} + +// cf www.metadataworkinggroup.org/pdf/mwg_guidance.pdf (down, as of 2021/02/15) +class XmpMgwRegionsNamespace extends XmpNamespace { + XmpMgwRegionsNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.mwgrs); + + @override + late final List<XmpCardData> cards = [ + XmpCardData(RegExp(nsPrefix + r'Regions/mwg-rs:AppliedToDimensions/(.*)'), title: 'Applied to Dimensions'), + XmpCardData(RegExp(nsPrefix + r'Regions/mwg-rs:RegionList\[(\d+)\]/(.*)'), title: 'Region List'), + ]; +} + +class XmpPlusNamespace extends XmpNamespace { + XmpPlusNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.plus); + + @override + late final List<XmpCardData> cards = [ + XmpCardData(RegExp(nsPrefix + r'CopyrightOwner\[(\d+)\]/(.*)')), + XmpCardData(RegExp(nsPrefix + r'ImageCreator\[(\d+)\]/(.*)')), + XmpCardData(RegExp(nsPrefix + r'Licensor\[(\d+)\]/(.*)')), + ]; +} + +class XmpMMNamespace extends XmpNamespace { + XmpMMNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.xmpMM); + + @override + late final List<XmpCardData> cards = [ + XmpCardData(RegExp(nsPrefix + r'DerivedFrom/(.*)')), + XmpCardData(RegExp(nsPrefix + r'History\[(\d+)\]/(.*)')), + XmpCardData(RegExp(nsPrefix + r'Ingredients\[(\d+)\]/(.*)')), + XmpCardData( + RegExp(nsPrefix + r'Pantry\[(\d+)\]/(.*)'), + cards: [ + XmpCardData(RegExp(nsPrefix + r'DerivedFrom/(.*)')), + XmpCardData(RegExp(nsPrefix + r'History\[(\d+)\]/(.*)')), + ], + ), + ]; +} + +class XmpXperiaCameraNamespace extends XmpNamespace { + XmpXperiaCameraNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.xperiaCamera); + + @override + late final List<XmpCardData> cards = [ + XmpCardData(RegExp(nsPrefix + r'Face\[(\d+)\]/(.*)')), + ]; +} diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart b/lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart new file mode 100644 index 0000000..5449a89 --- /dev/null +++ b/lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart @@ -0,0 +1,53 @@ +import 'package:aves/ref/metadata/xmp.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; + +// cf https://github.com/adobe/xmp-docs/blob/master/XMPNamespaces/photoshop.md +class XmpPhotoshopNamespace extends XmpNamespace { + XmpPhotoshopNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.photoshop); + + @override + late final List<XmpCardData> cards = [ + XmpCardData( + RegExp(nsPrefix + r'CameraProfiles\[(\d+)\]/(.*)'), + cards: [ + XmpCardData(RegExp(r'crlcp:PerspectiveModel/(.*)')), + ], + ), + XmpCardData(RegExp(nsPrefix + r'TextLayers\[(\d+)\]/(.*)')), + ]; + + @override + String formatValue(XmpProp prop) { + final value = prop.value; + switch (prop.path) { + case 'photoshop:ColorMode': + return getColorModeDescription(value); + } + return value; + } + + static String getColorModeDescription(String valueString) { + final value = int.tryParse(valueString); + if (value == null) return valueString; + switch (value) { + case 0: + return 'Bitmap'; + case 1: + return 'Gray scale'; + case 2: + return 'Indexed colour'; + case 3: + return 'RGB colour'; + case 4: + return 'CMYK colour'; + case 7: + return 'Multi-channel'; + case 8: + return 'Duotone'; + case 9: + return 'LAB colour'; + default: + return 'Unknown ($value)'; + } + } +} diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart b/lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart new file mode 100644 index 0000000..b67df3a --- /dev/null +++ b/lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart @@ -0,0 +1,28 @@ +import 'package:aves/ref/metadata/exif.dart'; +import 'package:aves/ref/metadata/xmp.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; + +// cf https://github.com/adobe/xmp-docs/blob/master/XMPNamespaces/tiff.md +class XmpTiffNamespace extends XmpNamespace { + XmpTiffNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.tiff); + + @override + String formatValue(XmpProp prop) { + final value = prop.value; + switch (prop.path) { + case 'tiff:Compression': + return Exif.getCompressionDescription(value); + case 'tiff:Orientation': + return Exif.getOrientationDescription(value); + case 'tiff:PhotometricInterpretation': + return Exif.getPhotometricInterpretationDescription(value); + case 'tiff:PlanarConfiguration': + return Exif.getPlanarConfigurationDescription(value); + case 'tiff:ResolutionUnit': + return Exif.getResolutionUnitDescription(value); + case 'tiff:YCbCrPositioning': + return Exif.getYCbCrPositioningDescription(value); + } + return value; + } +} diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart b/lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart new file mode 100644 index 0000000..655a8fe --- /dev/null +++ b/lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart @@ -0,0 +1,33 @@ +import 'package:aves/ref/metadata/xmp.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:aves/widgets/viewer/info/embedded/notifications.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; + +class XmpBasicNamespace extends XmpNamespace { + XmpBasicNamespace({required super.schemaRegistryPrefixes, required super.rawProps}) : super(nsUri: XmpNamespaces.xmp); + + @override + late final List<XmpCardData> cards = [ + XmpCardData( + RegExp(nsPrefix + r'Thumbnails\[(\d+)\]/(.*)'), + spanBuilders: (index, struct) { + return { + if (struct.containsKey('xmpGImg:image')) + 'Image': InfoRowGroup.linkSpanBuilder( + linkText: (context) => context.l10n.viewerInfoOpenLinkText, + onTap: (context) => OpenEmbeddedDataNotification.xmp( + props: [ + const [XmpNamespaces.xmp, 'Thumbnails'], + index, + const [XmpNamespaces.xmpGImg, 'image'], + ], + mimeType: MimeTypes.jpeg, + ).dispatch(context), + ), + }; + }, + ), + ]; +} diff --git a/lib/widgets/viewer/info/metadata/xmp_tile.dart b/lib/widgets/viewer/info/metadata/xmp_tile.dart new file mode 100644 index 0000000..87ff756 --- /dev/null +++ b/lib/widgets/viewer/info/metadata/xmp_tile.dart @@ -0,0 +1,56 @@ +import 'dart:collection'; +import 'dart:convert'; + +import 'package:aves/utils/xmp_utils.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class XmpDirTileBody extends StatefulWidget { + final SplayTreeMap<String, String> allTags, tags; + + const XmpDirTileBody({ + super.key, + required this.allTags, + required this.tags, + }); + + @override + State<XmpDirTileBody> createState() => _XmpDirTileBodyState(); +} + +class _XmpDirTileBodyState extends State<XmpDirTileBody> { + late final Map<String, String> _schemaRegistryPrefixes, _tags; + + static const schemaRegistryPrefixesKey = 'schemaRegistryPrefixes'; + + @override + void initState() { + super.initState(); + _tags = Map.from(widget.tags)..remove(schemaRegistryPrefixesKey); + final prefixesJson = widget.allTags[schemaRegistryPrefixesKey]; + final Map<String, dynamic> prefixesDecoded = prefixesJson != null ? jsonDecode(prefixesJson) : {}; + _schemaRegistryPrefixes = Map.fromEntries(prefixesDecoded.entries.map((kv) => MapEntry(kv.key, kv.value as String))); + } + + @override + Widget build(BuildContext context) { + final sections = + groupBy<MapEntry<String, String>, String>(_tags.entries, (kv) { + final fullKey = kv.key; + final i = fullKey.indexOf(XMP.propNamespaceSeparator); + final nsPrefix = i == -1 ? '' : fullKey.substring(0, i + 1); + return nsPrefix; + }).entries.map((kv) { + final nsPrefix = kv.key; + final rawProps = Map.fromEntries(kv.value); + return XmpNamespace.create(_schemaRegistryPrefixes, nsPrefix, rawProps); + }).toList() + ..sort((a, b) => compareAsciiUpperCase(a.displayTitle, b.displayTitle)); + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: sections.expand((section) => section.buildNamespaceSection(context)).toList(), + ); + } +} diff --git a/lib/widgets/viewer/multipage/conductor.dart b/lib/widgets/viewer/multipage/conductor.dart new file mode 100644 index 0000000..3d70e0b --- /dev/null +++ b/lib/widgets/viewer/multipage/conductor.dart @@ -0,0 +1,53 @@ +import 'dart:async'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/widgets/viewer/multipage/controller.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +class MultiPageConductor { + final List<MultiPageController> _controllers = []; + + static const maxControllerCount = 3; + + MultiPageConductor() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$MultiPageConductor', + object: this, + ); + } + } + + Future<void> dispose() async { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + await _disposeAll(); + _controllers.clear(); + } + + MultiPageController getOrCreateController(AvesEntry entry) { + var controller = getController(entry); + if (controller != null) { + _controllers.remove(controller); + } else { + controller = MultiPageController(entry); + } + _controllers.insert(0, controller); + while (_controllers.length > maxControllerCount) { + _controllers.removeLast().dispose(); + } + return controller; + } + + MultiPageController? getController(AvesEntry entry) { + return _controllers.firstWhereOrNull((c) => c.entry.uri == entry.uri && c.entry.pageId == entry.pageId); + } + + Future<void> _applyToAll(void Function(MultiPageController controller) action) => Future.forEach<MultiPageController>(_controllers, action); + + Future<void> _disposeAll() => _applyToAll((controller) => controller.dispose()); +} diff --git a/lib/widgets/viewer/multipage/controller.dart b/lib/widgets/viewer/multipage/controller.dart new file mode 100644 index 0000000..a6be661 --- /dev/null +++ b/lib/widgets/viewer/multipage/controller.dart @@ -0,0 +1,61 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/multipage.dart'; +import 'package:flutter/foundation.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +class MultiPageController { + final AvesEntry entry; + final ValueNotifier<int?> pageNotifier = ValueNotifier(null); + + bool _disposed = false; + MultiPageInfo? _info; + + final StreamController<MultiPageInfo?> _infoStreamController = StreamController.broadcast(); + + Stream<MultiPageInfo?> get infoStream => _infoStreamController.stream; + + MultiPageInfo? get info => _info; + + int? get page => pageNotifier.value; + + set page(int? page) => pageNotifier.value = page; + + MultiPageController(this.entry) { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$MultiPageController', + object: this, + ); + } + reset(); + } + + void reset() => entry.getMultiPageInfo().then((info) { + if (info == null || _disposed) return; + final currentPage = pageNotifier.value; + if (currentPage == null) { + pageNotifier.value = info.defaultPage?.index ?? 0; + } else { + pageNotifier.value = min(currentPage, info.pageCount - 1); + } + _info = info; + _infoStreamController.add(_info); + }); + + void dispose() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + _info?.dispose(); + _disposed = true; + pageNotifier.dispose(); + } + + @override + String toString() => '$runtimeType#${shortHash(this)}{entry=$entry, page=$page, info=$info}'; +} diff --git a/lib/widgets/viewer/overlay/bottom.dart b/lib/widgets/viewer/overlay/bottom.dart new file mode 100644 index 0000000..8d4df71 --- /dev/null +++ b/lib/widgets/viewer/overlay/bottom.dart @@ -0,0 +1,305 @@ +import 'dart:math'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:aves/widgets/viewer/controls/intents.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves/widgets/viewer/multipage/controller.dart'; +import 'package:aves/widgets/viewer/overlay/multipage.dart'; +import 'package:aves/widgets/viewer/overlay/selection_button.dart'; +import 'package:aves/widgets/viewer/overlay/thumbnail_preview.dart'; +import 'package:aves/widgets/viewer/overlay/viewer_buttons.dart'; +import 'package:aves/widgets/viewer/overlay/wallpaper_buttons.dart'; +import 'package:aves/widgets/viewer/page_entry_builder.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; + +class ViewerBottomOverlay extends StatelessWidget { + final List<AvesEntry> entries; + final int index; + final CollectionLens? collection; + final AnimationController animationController; + final Size availableSize; + final EdgeInsets? viewInsets, viewPadding; + final MultiPageController? multiPageController; + + // always keep action buttons in the lower right corner, even with RTL locales + static const actionsDirection = TextDirection.ltr; + + AvesEntry? get entry { + return index < entries.length ? entries[index] : null; + } + + const ViewerBottomOverlay({ + super.key, + required this.entries, + required this.index, + required this.collection, + required this.animationController, + required this.availableSize, + this.viewInsets, + this.viewPadding, + required this.multiPageController, + }); + + @override + Widget build(BuildContext context) { + final mainEntry = entry; + if (mainEntry == null) return const SizedBox(); + + Widget _buildContent({AvesEntry? pageEntry}) => _BottomOverlayContent( + entries: entries, + index: index, + mainEntry: mainEntry, + pageEntry: pageEntry ?? mainEntry, + collection: collection, + availableSize: availableSize, + viewInsets: viewInsets, + viewPadding: viewPadding, + multiPageController: multiPageController, + animationController: animationController, + ); + + Widget child = multiPageController != null + ? PageEntryBuilder( + multiPageController: multiPageController!, + builder: (pageEntry) => _buildContent(pageEntry: pageEntry), + ) + : _buildContent(); + + return Selector<MediaQueryData, double>( + selector: (context, mq) => max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom), + builder: (context, mqPaddingBottom, child) { + return Padding( + padding: EdgeInsets.only(bottom: mqPaddingBottom), + child: child, + ); + }, + child: child, + ); + } + + static double actionSafeHeight(BuildContext context) { + final mqPaddingBottom = context.select<MediaQueryData, double>((mq) => max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom)); + final buttonHeight = ViewerButtons.preferredHeight(context); + final thumbnailHeight = (settings.showOverlayThumbnailPreview ? ViewerThumbnailPreview.preferredHeight : 0); + return mqPaddingBottom + buttonHeight + thumbnailHeight; + } +} + +class _BottomOverlayContent extends StatefulWidget { + final List<AvesEntry> entries; + final int index; + final AvesEntry mainEntry, pageEntry; + final CollectionLens? collection; + final Size availableSize; + final EdgeInsets? viewInsets, viewPadding; + final MultiPageController? multiPageController; + final AnimationController animationController; + + const _BottomOverlayContent({ + required this.entries, + required this.index, + required this.mainEntry, + required this.pageEntry, + required this.collection, + required this.availableSize, + required this.viewInsets, + required this.viewPadding, + required this.multiPageController, + required this.animationController, + }); + + @override + State<_BottomOverlayContent> createState() => _BottomOverlayContentState(); +} + +class _BottomOverlayContentState extends State<_BottomOverlayContent> { + final FocusScopeNode _buttonRowFocusScopeNode = FocusScopeNode(); + late CurvedAnimation _buttonScale, _thumbnailOpacity; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + WidgetsBinding.instance.addPostFrameCallback((_) => _requestFocus()); + } + + @override + void didUpdateWidget(covariant _BottomOverlayContent oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + _buttonRowFocusScopeNode.dispose(); + super.dispose(); + } + + void _registerWidget(_BottomOverlayContent widget) { + final animationController = widget.animationController; + _buttonScale = CurvedAnimation( + parent: animationController, + // a little bounce at the top + curve: Curves.easeOutBack, + ); + _thumbnailOpacity = CurvedAnimation( + parent: animationController, + curve: Curves.easeOutQuad, + ); + } + + void _unregisterWidget(_BottomOverlayContent widget) { + _buttonScale.dispose(); + _thumbnailOpacity.dispose(); + } + + @override + Widget build(BuildContext context) { + final mainEntry = widget.mainEntry; + final pageEntry = widget.pageEntry; + final multiPageController = widget.multiPageController; + final isWallpaperMode = context.read<ValueNotifier<AppMode>>().value == AppMode.setWallpaper; + + return AnimatedBuilder( + animation: Listenable.merge([ + mainEntry.metadataChangeNotifier, + pageEntry.metadataChangeNotifier, + ]), + builder: (context, child) { + final viewInsetsPadding = (widget.viewInsets ?? EdgeInsets.zero) + (widget.viewPadding ?? EdgeInsets.zero); + final selection = context.read<Selection<AvesEntry>?>(); + final viewerButtonRow = (selection?.isSelecting ?? false) + ? SelectionButton( + mainEntry: mainEntry, + scale: _buttonScale, + ) + : FocusableActionDetector( + focusNode: _buttonRowFocusScopeNode, + shortcuts: settings.useTvLayout + ? const { + SingleActivator(LogicalKeyboardKey.arrowUp): TvShowLessInfoIntent(), + } + : null, + actions: { + TvShowLessInfoIntent: CallbackAction<Intent>(onInvoke: (intent) => TvShowLessInfoNotification().dispatch(context)), + }, + child: SafeArea( + top: false, + bottom: false, + minimum: EdgeInsets.only( + left: viewInsetsPadding.left, + right: viewInsetsPadding.right, + ), + child: isWallpaperMode + ? WallpaperButtons( + entry: pageEntry, + scale: _buttonScale, + ) + : ViewerButtons( + mainEntry: mainEntry, + pageEntry: pageEntry, + collection: widget.collection, + scale: _buttonScale, + ), + ), + ); + + final showMultiPageOverlay = mainEntry.isMultiPage && multiPageController != null; + final collapsedPageScroller = mainEntry.isMotionPhoto; + + final availableWidth = widget.availableSize.width; + return SizedBox( + width: availableWidth, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (showMultiPageOverlay && !collapsedPageScroller) + Padding( + padding: const EdgeInsets.only(bottom: 8), + child: FadeTransition( + opacity: _thumbnailOpacity, + child: MultiPageOverlay( + controller: multiPageController, + availableWidth: availableWidth, + scrollable: true, + ), + ), + ), + (showMultiPageOverlay && collapsedPageScroller) + ? Row( + crossAxisAlignment: CrossAxisAlignment.center, + textDirection: ViewerBottomOverlay.actionsDirection, + children: [ + SafeArea( + top: false, + bottom: false, + child: Padding( + padding: const EdgeInsets.only(bottom: 8), + child: MultiPageOverlay( + controller: multiPageController, + availableWidth: availableWidth, + scrollable: false, + ), + ), + ), + Expanded(child: viewerButtonRow), + ], + ) + : viewerButtonRow, + if (settings.showOverlayThumbnailPreview && !isWallpaperMode) + FadeTransition( + opacity: _thumbnailOpacity, + child: ViewerThumbnailPreview( + availableWidth: availableWidth, + displayedIndex: widget.index, + entries: widget.entries, + ), + ), + ], + ), + ); + }, + ); + } + + void _requestFocus() => _buttonRowFocusScopeNode.children.firstOrNull?.requestFocus(); +} + +class ExtraBottomOverlay extends StatelessWidget { + final EdgeInsets? viewInsets, viewPadding; + final Widget child; + + const ExtraBottomOverlay({ + super.key, + this.viewInsets, + this.viewPadding, + required this.child, + }); + + @override + Widget build(BuildContext context) { + final viewInsets = this.viewInsets ?? MediaQuery.viewInsetsOf(context); + final viewPadding = this.viewPadding ?? MediaQuery.viewPaddingOf(context); + final safePadding = (viewInsets + viewPadding).copyWith(bottom: 8) + const EdgeInsets.symmetric(horizontal: 8); + + return Padding( + padding: safePadding, + child: SizedBox( + width: MediaQuery.sizeOf(context).width - safePadding.horizontal, + child: child, + ), + ); + } +} diff --git a/lib/widgets/viewer/overlay/details/date.dart b/lib/widgets/viewer/overlay/details/date.dart new file mode 100644 index 0000000..944dc7d --- /dev/null +++ b/lib/widgets/viewer/overlay/details/date.dart @@ -0,0 +1,44 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/theme/format.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/viewer/multipage/controller.dart'; +import 'package:aves/widgets/viewer/overlay/details/details.dart'; +import 'package:decorated_icon/decorated_icon.dart'; +import 'package:flutter/material.dart'; + +class OverlayDateRow extends StatelessWidget { + final AvesEntry entry; + final MultiPageController? multiPageController; + + const OverlayDateRow({ + super.key, + required this.entry, + required this.multiPageController, + }); + + @override + Widget build(BuildContext context) { + final locale = context.locale; + final use24hour = MediaQuery.alwaysUse24HourFormatOf(context); + + final date = entry.bestDate; + final dateText = date != null ? formatDateTime(date, locale, use24hour) : AText.valueNotAvailable; + final resolutionText = entry.isSvg + ? entry.aspectRatioText + : entry.isSized + ? entry.getResolutionText(locale) + : ''; + + return Row( + children: [ + DecoratedIcon(AIcons.date, size: ViewerDetailOverlayContent.iconSize, shadows: ViewerDetailOverlayContent.shadows(context)), + const SizedBox(width: ViewerDetailOverlayContent.iconPadding), + Expanded(flex: 3, child: Text(dateText)), + Expanded(flex: 2, child: Text(resolutionText)), + ], + ); + } +} diff --git a/lib/widgets/viewer/overlay/details/description.dart b/lib/widgets/viewer/overlay/details/description.dart new file mode 100644 index 0000000..18e6da3 --- /dev/null +++ b/lib/widgets/viewer/overlay/details/description.dart @@ -0,0 +1,35 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/viewer/overlay/details/details.dart'; +import 'package:decorated_icon/decorated_icon.dart'; +import 'package:flutter/material.dart'; + +class OverlayDescriptionRow extends StatelessWidget { + final String description; + + const OverlayDescriptionRow({ + super.key, + required this.description, + }); + + @override + Widget build(BuildContext context) { + return Text.rich( + TextSpan( + children: [ + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Padding( + padding: const EdgeInsetsDirectional.only(end: ViewerDetailOverlayContent.iconPadding), + child: DecoratedIcon( + AIcons.description, + size: ViewerDetailOverlayContent.iconSize, + shadows: ViewerDetailOverlayContent.shadows(context), + ), + ), + ), + TextSpan(text: description), + ], + ), + ); + } +} diff --git a/lib/widgets/viewer/overlay/details/details.dart b/lib/widgets/viewer/overlay/details/details.dart new file mode 100644 index 0000000..5d16157 --- /dev/null +++ b/lib/widgets/viewer/overlay/details/details.dart @@ -0,0 +1,341 @@ +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/metadata/overlay.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves/widgets/viewer/multipage/controller.dart'; +import 'package:aves/widgets/viewer/overlay/details/date.dart'; +import 'package:aves/widgets/viewer/overlay/details/description.dart'; +import 'package:aves/widgets/viewer/overlay/details/expander.dart'; +import 'package:aves/widgets/viewer/overlay/details/location.dart'; +import 'package:aves/widgets/viewer/overlay/details/position_title.dart'; +import 'package:aves/widgets/viewer/overlay/details/rating_tags.dart'; +import 'package:aves/widgets/viewer/overlay/details/shooting.dart'; +import 'package:aves/widgets/viewer/page_entry_builder.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ViewerDetailOverlay extends StatefulWidget { + final List<AvesEntry> entries; + final int index; + final bool hasCollection; + final MultiPageController? multiPageController; + final ValueNotifier<bool> expandedNotifier; + final Size availableSize; + + const ViewerDetailOverlay({ + super.key, + required this.entries, + required this.index, + required this.hasCollection, + required this.multiPageController, + required this.expandedNotifier, + required this.availableSize, + }); + + @override + State<ViewerDetailOverlay> createState() => _ViewerDetailOverlayState(); +} + +class _ViewerDetailOverlayState extends State<ViewerDetailOverlay> { + List<AvesEntry> get entries => widget.entries; + + AvesEntry? get entry => entryForIndex(widget.index); + + AvesEntry? entryForIndex(int index) => index < entries.length ? entries[index] : null; + + late Future<OverlayMetadata> _detailLoader; + AvesEntry? _lastEntry; + OverlayMetadata _lastDetails = const OverlayMetadata(); + + @override + void initState() { + super.initState(); + _initDetailLoader(); + } + + @override + void didUpdateWidget(covariant ViewerDetailOverlay oldWidget) { + super.didUpdateWidget(oldWidget); + final newEntry = entryForIndex(widget.index); + if (newEntry != entryForIndex(oldWidget.index) && newEntry != _lastEntry) { + _initDetailLoader(); + } + } + + void _initDetailLoader() { + final requestEntry = entry; + if (requestEntry == null) { + _detailLoader = SynchronousFuture(const OverlayMetadata()); + } else { + _detailLoader = metadataFetchService.getOverlayMetadata(requestEntry, { + if (settings.showOverlayShootingDetails) ...{ + MetadataSyntheticField.aperture, + MetadataSyntheticField.exposureTime, + MetadataSyntheticField.focalLength, + MetadataSyntheticField.iso, + }, + if (settings.showOverlayDescription) MetadataSyntheticField.description, + }); + } + } + + @override + Widget build(BuildContext context) { + return SafeArea( + top: false, + bottom: false, + child: FutureBuilder<OverlayMetadata>( + future: _detailLoader, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done && !snapshot.hasError) { + _lastDetails = snapshot.data!; + _lastEntry = entry; + } + if (_lastEntry == null) return const SizedBox(); + final mainEntry = _lastEntry!; + + final multiPageController = widget.multiPageController; + Widget _buildContent({AvesEntry? pageEntry}) => ViewerDetailOverlayContent( + pageEntry: pageEntry ?? mainEntry, + details: _lastDetails, + position: widget.hasCollection ? '${widget.index + 1}/${entries.length}' : null, + availableWidth: widget.availableSize.width, + multiPageController: multiPageController, + expandedNotifier: widget.expandedNotifier, + ); + + return multiPageController != null + ? PageEntryBuilder( + multiPageController: multiPageController, + builder: (pageEntry) => _buildContent(pageEntry: pageEntry), + ) + : _buildContent(); + }, + ), + ); + } +} + +class ViewerDetailOverlayContent extends StatelessWidget { + final AvesEntry pageEntry; + final OverlayMetadata details; + final String? position; + final double availableWidth; + final MultiPageController? multiPageController; + final ValueNotifier<bool> expandedNotifier; + + static const double _interRowPadding = 2.0; + static const double _subRowMinWidth = 300.0; + static const padding = EdgeInsets.symmetric(vertical: 4, horizontal: 8); + static const double iconPadding = 8.0; + static const double iconSize = 16.0; + + static List<Shadow>? shadows(BuildContext context) => Theme.of(context).isDark ? AStyles.embossShadows : null; + + const ViewerDetailOverlayContent({ + super.key, + required this.pageEntry, + required this.details, + required this.position, + required this.availableWidth, + required this.multiPageController, + required this.expandedNotifier, + }); + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: pageEntry.metadataChangeNotifier, + builder: (context, child) => DefaultTextStyle( + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + shadows: shadows(context), + ), + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + child: Padding( + padding: padding, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: _buildRows(context), + ), + ), + ), + ); + } + + List<Widget> _buildRows(BuildContext context) { + final infoMaxWidth = availableWidth - padding.horizontal; + final showRatingTags = settings.showOverlayRatingTags; + final showShootingDetails = settings.showOverlayShootingDetails; + final showDescription = settings.showOverlayDescription; + + final isLandscape = MediaQuery.orientationOf(context) == Orientation.landscape; + final twoColumns = isLandscape && infoMaxWidth / 2 > _subRowMinWidth; + final subRowWidth = twoColumns ? min(_subRowMinWidth, infoMaxWidth / 2) : infoMaxWidth; + final collapsedShooting = twoColumns && showShootingDetails; + final collapsedLocation = twoColumns && !showShootingDetails; + + final positionTitle = OverlayPositionTitleRow( + entry: pageEntry, + collectionPosition: position, + multiPageController: multiPageController, + ); + + final rows = <Widget>[]; + if (positionTitle.isNotEmpty) { + rows.add( + OverlayRowExpander( + expandedNotifier: expandedNotifier, + child: positionTitle, + ), + ); + rows.add(const SizedBox(height: _interRowPadding)); + } + if (twoColumns) { + rows.add( + Row( + children: [ + _buildDateSubRow(subRowWidth), + if (collapsedShooting) _buildShootingSubRow(context, subRowWidth), + if (collapsedLocation) _buildLocationSubRow(context, subRowWidth), + ], + ), + ); + } else { + rows.add(_buildDateSubRow(subRowWidth)); + if (showShootingDetails) { + rows.add(_buildShootingFullRow(context, subRowWidth)); + } + } + if (!collapsedLocation) { + rows.add(_buildLocationFullRow(context)); + } + if (showRatingTags) { + rows.add(_buildRatingTagsFullRow(context)); + } + if (showDescription) { + rows.add(_buildDescriptionFullRow(context, infoMaxWidth)); + } + return rows; + } + + Widget _buildDateSubRow(double subRowWidth) => SizedBox( + width: subRowWidth, + child: OverlayDateRow( + entry: pageEntry, + multiPageController: multiPageController, + ), + ); + + Widget _buildRatingTagsFullRow(BuildContext context) => _buildFullRowSwitcher( + context: context, + visible: pageEntry.rating != 0 || pageEntry.tags.isNotEmpty, + builder: (context) => OverlayRowExpander( + expandedNotifier: expandedNotifier, + child: OverlayRatingTagsRow(entry: pageEntry), + ), + ); + + Widget _buildDescriptionFullRow(BuildContext context, double infoMaxWidth) => _buildFullRowSwitcher( + context: context, + visible: details.description != null, + builder: (context) => SizedBox( + // size it so that a long description with multiple short lines + // expands to the full width and the scroll bar is at the edge + width: infoMaxWidth, + child: OverlayRowExpander( + expandedNotifier: expandedNotifier, + child: OverlayDescriptionRow(description: details.description!), + ), + ), + ); + + Widget _buildShootingFullRow(BuildContext context, double subRowWidth) => _buildFullRowSwitcher( + context: context, + visible: details.hasShootingDetails, + builder: (context) => SizedBox( + width: subRowWidth, + child: OverlayShootingRow(details: details), + ), + ); + + Widget _buildShootingSubRow(BuildContext context, double subRowWidth) => _buildSubRowSwitcher( + context: context, + subRowWidth: subRowWidth, + visible: details.hasShootingDetails, + builder: (context) => OverlayShootingRow(details: details), + ); + + Widget _buildLocationFullRow(BuildContext context) => _buildFullRowSwitcher( + context: context, + visible: pageEntry.hasGps, + builder: (context) => OverlayLocationRow(entry: pageEntry), + ); + + Widget _buildLocationSubRow(BuildContext context, double subRowWidth) => _buildSubRowSwitcher( + context: context, + subRowWidth: subRowWidth, + visible: pageEntry.hasGps, + builder: (context) => OverlayLocationRow(entry: pageEntry), + ); + + Widget _buildSubRowSwitcher({ + required BuildContext context, + required double subRowWidth, + required bool visible, + required WidgetBuilder builder, + }) { + final child = visible + ? SizedBox( + width: subRowWidth, + child: builder(context), + ) + : const SizedBox(); + return AnimatedSwitcher( + duration: context.select<DurationsData, Duration>((v) => v.viewerOverlayChangeAnimation), + switchInCurve: Curves.easeInOutCubic, + switchOutCurve: Curves.easeInOutCubic, + transitionBuilder: (child, animation) => FadeTransition( + opacity: animation, + child: child, + ), + child: child, + ); + } + + Widget _buildFullRowSwitcher({ + required BuildContext context, + required bool visible, + required WidgetBuilder builder, + }) { + final child = visible + ? Padding( + padding: const EdgeInsets.only(top: _interRowPadding), + child: builder(context), + ) + : const SizedBox(); + return AnimatedSwitcher( + duration: context.select<DurationsData, Duration>((v) => v.viewerOverlayChangeAnimation), + switchInCurve: Curves.easeInOutCubic, + switchOutCurve: Curves.easeInOutCubic, + transitionBuilder: (child, animation) => FadeTransition( + opacity: animation, + child: SizeTransition( + sizeFactor: animation, + axisAlignment: 1, + child: child, + ), + ), + child: child, + ); + } +} diff --git a/lib/widgets/viewer/overlay/details/expander.dart b/lib/widgets/viewer/overlay/details/expander.dart new file mode 100644 index 0000000..f7fd84d --- /dev/null +++ b/lib/widgets/viewer/overlay/details/expander.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class OverlayRowExpander extends StatefulWidget { + final ValueNotifier<bool> expandedNotifier; + final Widget child; + + const OverlayRowExpander({ + super.key, + required this.expandedNotifier, + required this.child, + }); + + @override + State<OverlayRowExpander> createState() => _OverlayRowExpanderState(); +} + +class _OverlayRowExpanderState extends State<OverlayRowExpander> { + final ScrollController _scrollController = ScrollController(); + + @override + void didUpdateWidget(covariant OverlayRowExpander oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.child != widget.child) { + if (_scrollController.hasClients && _scrollController.positions.every((v) => v.hasContentDimensions)) { + _scrollController.jumpTo(0); + } + } + } + + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder<bool>( + valueListenable: widget.expandedNotifier, + builder: (context, expanded, child) { + final parent = DefaultTextStyle.of(context); + child = DefaultTextStyle( + style: parent.style, + textAlign: parent.textAlign, + softWrap: expanded, + overflow: parent.overflow, + maxLines: expanded ? null : 1, + textWidthBasis: parent.textWidthBasis, + child: child!, + ); + if (expanded) { + child = ConstrainedBox( + constraints: BoxConstraints( + maxHeight: context.select<MediaQueryData, double>((mq) => mq.size.height / 5), + ), + child: MediaQuery.removePadding( + // remove padding so that scroll bar is consistent with the scroll view + context: context, + removeTop: true, + removeBottom: true, + child: Scrollbar( + controller: _scrollController, + thumbVisibility: true, + radius: const Radius.circular(16), + child: SingleChildScrollView( + controller: _scrollController, + child: child, + ), + ), + ), + ); + } + return child; + }, + child: widget.child, + ); + } +} diff --git a/lib/widgets/viewer/overlay/details/location.dart b/lib/widgets/viewer/overlay/details/location.dart new file mode 100644 index 0000000..4df7b89 --- /dev/null +++ b/lib/widgets/viewer/overlay/details/location.dart @@ -0,0 +1,39 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/location.dart'; +import 'package:aves/model/settings/enums/coordinate_format.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/widgets/viewer/overlay/details/details.dart'; +import 'package:decorated_icon/decorated_icon.dart'; +import 'package:flutter/material.dart'; + +class OverlayLocationRow extends AnimatedWidget { + final AvesEntry entry; + + OverlayLocationRow({ + super.key, + required this.entry, + }) : super(listenable: entry.addressChangeNotifier); + + @override + Widget build(BuildContext context) { + String? location; + if (entry.hasAddress) { + location = entry.shortAddress; + } + if (location == null || location.isEmpty) { + final latLng = entry.latLng; + if (latLng != null) { + location = settings.coordinateFormat.format(context, latLng); + } + } + return Row( + children: [ + DecoratedIcon(AIcons.location, size: ViewerDetailOverlayContent.iconSize, shadows: ViewerDetailOverlayContent.shadows(context)), + const SizedBox(width: ViewerDetailOverlayContent.iconPadding), + Expanded(child: Text(location ?? AText.valueNotAvailable)), + ], + ); + } +} diff --git a/lib/widgets/viewer/overlay/details/position_title.dart b/lib/widgets/viewer/overlay/details/position_title.dart new file mode 100644 index 0000000..9a8dc9c --- /dev/null +++ b/lib/widgets/viewer/overlay/details/position_title.dart @@ -0,0 +1,54 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/multipage.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/widgets/viewer/multipage/controller.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +class OverlayPositionTitleRow extends StatelessWidget { + final AvesEntry entry; + final String? collectionPosition; + final MultiPageController? multiPageController; + + const OverlayPositionTitleRow({ + super.key, + required this.entry, + required this.collectionPosition, + required this.multiPageController, + }); + + String? get title => entry.bestTitle; + + bool get isNotEmpty => collectionPosition != null || multiPageController != null || title != null; + + @override + Widget build(BuildContext context) { + Text toText({String? pagePosition}) => Text( + [ + if (collectionPosition != null) collectionPosition, + ?pagePosition, + if (title != null) '${Unicode.FSI}$title${Unicode.PDI}', + ].join(AText.separator), + ); + + if (multiPageController == null) return toText(); + + return StreamBuilder<MultiPageInfo?>( + stream: multiPageController!.infoStream, + builder: (context, snapshot) { + final multiPageInfo = multiPageController!.info; + String? pagePosition; + if (multiPageInfo != null) { + // page count may be 0 when we know an entry to have multiple pages + // but fail to get information about these pages + final pageCount = multiPageInfo.pageCount; + if (pageCount > 0) { + final page = multiPageInfo.getById(entry.pageId ?? entry.id) ?? multiPageInfo.defaultPage; + pagePosition = '${(page?.index ?? 0) + 1}/$pageCount'; + } + } + return toText(pagePosition: pagePosition); + }, + ); + } +} diff --git a/lib/widgets/viewer/overlay/details/rating_tags.dart b/lib/widgets/viewer/overlay/details/rating_tags.dart new file mode 100644 index 0000000..c6ec740 --- /dev/null +++ b/lib/widgets/viewer/overlay/details/rating_tags.dart @@ -0,0 +1,61 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/viewer/overlay/details/details.dart'; +import 'package:collection/collection.dart'; +import 'package:decorated_icon/decorated_icon.dart'; +import 'package:flutter/material.dart'; + +class OverlayRatingTagsRow extends AnimatedWidget { + final AvesEntry entry; + + OverlayRatingTagsRow({ + super.key, + required this.entry, + }) : super(listenable: entry.metadataChangeNotifier); + + @override + Widget build(BuildContext context) { + final String ratingString; + final rating = entry.rating.clamp(-1, 5); + switch (rating) { + case -1: + ratingString = context.l10n.filterRatingRejectedLabel; + case 0: + ratingString = ''; + default: + ratingString = '${'★' * rating}${'☆' * (5 - rating)}'; + } + + final textScaler = MediaQuery.textScalerOf(context); + final tags = entry.tags.toList()..sort(compareAsciiUpperCaseNatural); + final hasTags = tags.isNotEmpty; + + const iconSize = ViewerDetailOverlayContent.iconSize; + final textScaleFactor = textScaler.scale(iconSize) / iconSize; + + return Text.rich( + TextSpan( + children: [ + TextSpan(text: ratingString), + if (hasTags) ...[ + if (ratingString.isNotEmpty) const TextSpan(text: AText.separator), + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Padding( + padding: const EdgeInsetsDirectional.only(end: ViewerDetailOverlayContent.iconPadding), + child: DecoratedIcon( + AIcons.tag, + size: iconSize / textScaleFactor, + shadows: ViewerDetailOverlayContent.shadows(context), + ), + ), + ), + TextSpan(text: tags.join(AText.separator)), + ], + ], + ), + ); + } +} diff --git a/lib/widgets/viewer/overlay/details/shooting.dart b/lib/widgets/viewer/overlay/details/shooting.dart new file mode 100644 index 0000000..770d04e --- /dev/null +++ b/lib/widgets/viewer/overlay/details/shooting.dart @@ -0,0 +1,42 @@ +import 'package:aves/model/metadata/overlay.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/viewer/overlay/details/details.dart'; +import 'package:decorated_icon/decorated_icon.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class OverlayShootingRow extends StatelessWidget { + final OverlayMetadata details; + + const OverlayShootingRow({ + super.key, + required this.details, + }); + + @override + Widget build(BuildContext context) { + final locale = context.locale; + + final aperture = details.aperture; + final apertureText = aperture != null ? 'ƒ/${NumberFormat('0.0', locale).format(aperture)}' : AText.valueNotAvailable; + + final focalLength = details.focalLength; + final focalLengthText = focalLength != null ? context.l10n.focalLength(NumberFormat('0.#', locale).format(focalLength)) : AText.valueNotAvailable; + + final iso = details.iso; + final isoText = iso != null ? 'ISO$iso' : AText.valueNotAvailable; + + return Row( + children: [ + DecoratedIcon(AIcons.shooting, size: ViewerDetailOverlayContent.iconSize, shadows: ViewerDetailOverlayContent.shadows(context)), + const SizedBox(width: ViewerDetailOverlayContent.iconPadding), + Expanded(child: Text(apertureText)), + Expanded(child: Text(details.exposureTime ?? AText.valueNotAvailable)), + Expanded(child: Text(focalLengthText)), + Expanded(child: Text(isoText)), + ], + ); + } +} diff --git a/lib/widgets/viewer/overlay/histogram.dart b/lib/widgets/viewer/overlay/histogram.dart new file mode 100644 index 0000000..157b21e --- /dev/null +++ b/lib/widgets/viewer/overlay/histogram.dart @@ -0,0 +1,157 @@ +import 'dart:ui'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/widgets/viewer/overlay/top.dart'; +import 'package:aves/widgets/viewer/view/controller.dart'; +import 'package:aves/widgets/viewer/view/histogram.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class ImageHistogram extends StatefulWidget { + final ViewStateController viewStateController; + final ImageProvider image; + + const ImageHistogram({ + super.key, + required this.viewStateController, + required this.image, + }); + + @override + State<ImageHistogram> createState() => _ImageHistogramState(); +} + +class _ImageHistogramState extends State<ImageHistogram> { + HistogramLevels _levels = {}; + ImageStream? _imageStream; + late ImageStreamListener _imageListener; + + ViewStateController get viewStateController => widget.viewStateController; + + AvesEntry get entry => viewStateController.entry; + + ImageProvider get imageProvider => widget.image; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant ImageHistogram oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(ImageHistogram widget) { + _imageStream = imageProvider.resolve(ImageConfiguration.empty); + _imageListener = ImageStreamListener((image, synchronousCall) async { + // implementer is responsible for disposing the provided `ImageInfo` + await _updateLevels(image); + image.dispose(); + }); + _imageStream?.addListener(_imageListener); + } + + void _unregisterWidget(ImageHistogram widget) { + _imageStream?.removeListener(_imageListener); + } + + @override + Widget build(BuildContext context) { + return IgnorePointer( + child: CustomPaint( + painter: _HistogramPainter( + levels: _levels, + borderColor: ViewerTopOverlay.componentBorderColor, + ), + size: const Size(ViewerTopOverlay.componentDimension, ViewerTopOverlay.componentDimension * .6), + ), + ); + } + + Future<void> _updateLevels(ImageInfo info) async { + final targetEntry = entry; + final forceUpdate = targetEntry.isAnimated; + final newLevels = await viewStateController.getHistogramLevels(info, forceUpdate); + if (!mounted) return; + setState(() => _levels = targetEntry == entry ? newLevels : {}); + } +} + +class _HistogramPainter extends CustomPainter { + final HistogramLevels levels; + final Color borderColor; + + late final Paint fill, borderStroke; + + _HistogramPainter({ + required this.levels, + this.borderColor = Colors.white, + }) { + fill = Paint() + ..style = PaintingStyle.fill + ..color = const Color(0x33000000); + borderStroke = Paint() + ..style = PaintingStyle.stroke + ..color = borderColor; + } + + @override + void paint(Canvas canvas, Size size) { + if (levels.isEmpty) return; + + final backgroundRect = Rect.fromPoints(Offset.zero, Offset(size.width, size.height)); + canvas.drawRect(backgroundRect, fill); + levels.forEach((channel, values) { + final color = _getChannelColor(channel); + _drawLevels(canvas, size, color, values); + }); + canvas.drawRect(backgroundRect, borderStroke); + } + + void _drawLevels(Canvas canvas, Size size, Color color, List<double> values) { + if (values.length < 2) return; + + final xFactor = size.width / (values.length - 1); + final yFactor = size.height; + + final polyline = values.mapIndexed((i, v) => Offset(i * xFactor, size.height - v * yFactor)).toList(); + canvas.drawPoints( + PointMode.polygon, + polyline, + Paint() + ..style = PaintingStyle.stroke + ..color = color, + ); + + polyline.add(Offset(size.width, size.height)); + polyline.add(Offset(0, size.height)); + canvas.drawPath( + Path()..addPolygon(polyline, true), + Paint() + ..style = PaintingStyle.fill + ..color = color.withValues(alpha: .5), + ); + } + + Color _getChannelColor(HistogramChannel channel) { + return switch (channel) { + HistogramChannel.red => Colors.red, + HistogramChannel.green => Colors.green, + HistogramChannel.blue => Colors.blue, + HistogramChannel.luminance => Colors.white, + }; + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => true; +} diff --git a/lib/widgets/viewer/overlay/locked.dart b/lib/widgets/viewer/overlay/locked.dart new file mode 100644 index 0000000..ed4afe7 --- /dev/null +++ b/lib/widgets/viewer/overlay/locked.dart @@ -0,0 +1,90 @@ +import 'dart:math'; + +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves/widgets/viewer/overlay/viewer_buttons.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ViewerLockedOverlay extends StatefulWidget { + final AnimationController animationController; + final EdgeInsets? viewInsets, viewPadding; + + const ViewerLockedOverlay({ + super.key, + required this.animationController, + this.viewInsets, + this.viewPadding, + }); + + @override + State<StatefulWidget> createState() => _ViewerLockedOverlayState(); +} + +class _ViewerLockedOverlayState extends State<ViewerLockedOverlay> { + late CurvedAnimation _buttonScale; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant ViewerLockedOverlay oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(ViewerLockedOverlay widget) { + _buttonScale = CurvedAnimation( + parent: widget.animationController, + // a little bounce at the top + curve: Curves.easeOutBack, + ); + } + + void _unregisterWidget(ViewerLockedOverlay widget) { + _buttonScale.dispose(); + } + + @override + Widget build(BuildContext context) { + return Selector<MediaQueryData, double>( + selector: (context, mq) => max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom), + builder: (context, mqPaddingBottom, child) { + final viewInsetsPadding = (widget.viewInsets ?? EdgeInsets.zero) + (widget.viewPadding ?? EdgeInsets.zero); + return Container( + alignment: Alignment.bottomRight, + padding: EdgeInsets.only(bottom: mqPaddingBottom) + const EdgeInsets.all(ViewerButtonRowContent.padding), + child: SafeArea( + top: false, + bottom: false, + minimum: EdgeInsets.only( + left: viewInsetsPadding.left, + right: viewInsetsPadding.right, + ), + child: OverlayButton( + scale: _buttonScale, + child: IconButton( + icon: const Icon(AIcons.viewerUnlock), + onPressed: () => const LockViewNotification(locked: false).dispatch(context), + tooltip: context.l10n.viewerActionUnlock, + ), + ), + ), + ); + }, + ); + } +} diff --git a/lib/widgets/viewer/overlay/minimap.dart b/lib/widgets/viewer/overlay/minimap.dart new file mode 100644 index 0000000..d1ba91c --- /dev/null +++ b/lib/widgets/viewer/overlay/minimap.dart @@ -0,0 +1,150 @@ +import 'dart:math'; +import 'dart:ui'; + +import 'package:aves/model/viewer/view_state.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/editor/transform/controller.dart'; +import 'package:aves/widgets/editor/transform/transformation.dart'; +import 'package:aves/widgets/viewer/overlay/top.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class Minimap extends StatelessWidget { + final ValueNotifier<ViewState> viewStateNotifier; + + const Minimap({ + super.key, + required this.viewStateNotifier, + }); + + @override + Widget build(BuildContext context) { + return IgnorePointer( + child: ValueListenableBuilder<ViewState>( + valueListenable: viewStateNotifier, + builder: (context, viewState, child) { + final viewportSize = viewState.viewportSize; + final contentSize = viewState.contentSize; + if (viewportSize == null || contentSize == null) return const SizedBox(); + return StreamBuilder<Transformation?>( + stream: context.select<TransformController?, Stream<Transformation?>>((v) => v?.transformationStream ?? Stream.value(null)), + builder: (context, snapshot) { + final transformation = snapshot.data; + return CustomPaint( + painter: _MinimapPainter( + viewportSize: viewportSize, + contentSize: contentSize, + viewCenterOffset: viewState.position, + viewScale: viewState.scale!, + alignmentX: context.isRtl ? 1 : 0, + transformation: transformation, + minimapBorderColor: ViewerTopOverlay.componentBorderColor, + ), + size: const Size.square(ViewerTopOverlay.componentDimension), + ); + }, + ); + }, + ), + ); + } +} + +class _MinimapPainter extends CustomPainter { + final Size contentSize, viewportSize; + final Offset viewCenterOffset; + final double viewScale, alignmentX; + final Transformation? transformation; + final Color minimapBorderColor; + + late final Paint fill, minimapStroke, viewportStroke; + + _MinimapPainter({ + required this.viewportSize, + required this.contentSize, + required this.viewCenterOffset, + required this.viewScale, + required this.alignmentX, + this.transformation, + this.minimapBorderColor = Colors.white, + }) { + fill = Paint() + ..style = PaintingStyle.fill + ..color = const Color(0x33000000); + minimapStroke = Paint() + ..style = PaintingStyle.stroke + ..color = minimapBorderColor; + viewportStroke = Paint() + ..style = PaintingStyle.stroke + ..color = Colors.white; + } + + @override + void paint(Canvas canvas, Size size) { + if (contentSize.width <= 0 || contentSize.height <= 0) return; + + final viewSize = contentSize * viewScale; + if (viewSize.isEmpty) return; + + // hide minimap when image is in full view + if (viewportSize + const Offset(precisionErrorTolerance, precisionErrorTolerance) >= viewSize) return; + + final canvasCenter = size.center(Offset.zero); + final canvasScale = size.longestSide / viewSize.longestSide; + final scaledContentSize = viewSize * canvasScale; + final scaledViewportSize = viewportSize * canvasScale; + + final contentRect = Rect.fromCenter( + center: canvasCenter, + width: scaledContentSize.width, + height: scaledContentSize.height, + ); + final viewportRect = Rect.fromCenter( + center: canvasCenter - viewCenterOffset * canvasScale, + width: min(scaledContentSize.width, scaledViewportSize.width), + height: min(scaledContentSize.height, scaledViewportSize.height), + ); + + canvas.translate(lerpDouble(0, size.width - contentRect.width, alignmentX)!, 0); + + Matrix4? transformMatrix; + if (transformation != null) { + final viewportCenter = viewportRect.center; + final transformOrigin = viewportCenter; + transformMatrix = Matrix4.identity() + ..translateByDouble(transformOrigin.dx, transformOrigin.dy, 0, 1) + ..multiply(transformation!.matrix) + ..translateByDouble(-transformOrigin.dx, -transformOrigin.dy, 0, 1); + final transViewportCenter = transformMatrix.transformOffset(viewportCenter); + final transContentCenter = transformMatrix.transformOffset(contentRect.center); + + final minimapTranslation = size / 2 + (transViewportCenter - transContentCenter - viewportCenter); + canvas.translate(minimapTranslation.width, minimapTranslation.height); + } else { + canvas.translate((contentRect.width - size.width) / 2, (contentRect.height - size.height) / 2); + } + + canvas.drawRect(viewportRect, fill); + + if (transformMatrix != null) { + canvas.transform(transformMatrix.storage); + _drawContentRect(canvas, contentRect); + transformMatrix.invert(); + canvas.transform(transformMatrix.storage); + } else { + _drawContentRect(canvas, contentRect); + } + + canvas.drawRect(viewportRect, viewportStroke); + } + + void _drawContentRect(Canvas canvas, Rect contentRect) { + canvas.drawRect(contentRect, fill); + canvas.drawRect(contentRect, minimapStroke); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => true; +} diff --git a/lib/widgets/viewer/overlay/multipage.dart b/lib/widgets/viewer/overlay/multipage.dart new file mode 100644 index 0000000..50c775a --- /dev/null +++ b/lib/widgets/viewer/overlay/multipage.dart @@ -0,0 +1,87 @@ +import 'package:aves/model/multipage.dart'; +import 'package:aves/widgets/common/thumbnail/scroller.dart'; +import 'package:aves/widgets/viewer/multipage/controller.dart'; +import 'package:aves/widgets/viewer/view/conductor.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class MultiPageOverlay extends StatefulWidget { + final MultiPageController controller; + final double availableWidth; + final bool scrollable; + + const MultiPageOverlay({ + super.key, + required this.controller, + required this.availableWidth, + required this.scrollable, + }); + + @override + State<MultiPageOverlay> createState() => _MultiPageOverlayState(); +} + +class _MultiPageOverlayState extends State<MultiPageOverlay> { + int? _previousPage; + + MultiPageController get controller => widget.controller; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant MultiPageOverlay oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.controller != controller) { + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + } + + @override + void dispose() { + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(MultiPageOverlay widget) { + widget.controller.pageNotifier.addListener(_onPageChanged); + } + + void _unregisterWidget(MultiPageOverlay widget) { + widget.controller.pageNotifier.removeListener(_onPageChanged); + } + + @override + Widget build(BuildContext context) { + return StreamBuilder<MultiPageInfo?>( + stream: controller.infoStream, + builder: (context, snapshot) { + final multiPageInfo = controller.info; + return ThumbnailScroller( + key: ValueKey(multiPageInfo), + availableWidth: widget.availableWidth, + entryCount: multiPageInfo?.pageCount ?? 0, + entryBuilder: (page) => multiPageInfo?.getPageEntryByIndex(page), + indexNotifier: controller.pageNotifier, + scrollable: widget.scrollable, + ); + }, + ); + } + + void _onPageChanged() { + if (_previousPage != null) { + final info = controller.info; + if (info != null) { + final oldPageEntry = info.getPageEntryByIndex(_previousPage); + context.read<ViewStateConductor>().reset(oldPageEntry); + } + } + _previousPage = controller.page; + } +} diff --git a/lib/widgets/viewer/overlay/panorama.dart b/lib/widgets/viewer/overlay/panorama.dart new file mode 100644 index 0000000..2124c12 --- /dev/null +++ b/lib/widgets/viewer/overlay/panorama.dart @@ -0,0 +1,54 @@ +import 'dart:async'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/viewer/overlay/bottom.dart'; +import 'package:aves/widgets/viewer/panorama_page.dart'; +import 'package:flutter/material.dart'; + +class PanoramaOverlay extends StatelessWidget with FeedbackMixin { + final AvesEntry entry; + final Animation<double> scale; + + const PanoramaOverlay({ + super.key, + required this.entry, + required this.scale, + }); + + @override + Widget build(BuildContext context) { + return Row( + textDirection: ViewerBottomOverlay.actionsDirection, + children: [ + const Spacer(), + ScalingOverlayTextButton( + scale: scale, + onPressed: () async { + final info = await metadataFetchService.getPanoramaInfo(entry); + if (info == null) { + showFeedback(context, FeedbackType.warn, context.l10n.genericFailureFeedback); + } + if (info != null) { + unawaited( + Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: PanoramaPage.routeName), + builder: (context) => PanoramaPage( + entry: entry, + info: info, + ), + ), + ), + ); + } + }, + child: Text(context.l10n.viewerOpenPanoramaButtonLabel), + ), + ], + ); + } +} diff --git a/lib/widgets/viewer/overlay/selection_button.dart b/lib/widgets/viewer/overlay/selection_button.dart new file mode 100644 index 0000000..d7f9f94 --- /dev/null +++ b/lib/widgets/viewer/overlay/selection_button.dart @@ -0,0 +1,86 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/selection.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/widgets/common/basic/text/animated_diff.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/viewer/overlay/bottom.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class SelectionButton extends StatelessWidget { + final AvesEntry mainEntry; + final Animation<double> scale; + + static const double padding = 8; + + const SelectionButton({ + super.key, + required this.mainEntry, + required this.scale, + }); + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final selection = context.read<Selection<AvesEntry>>(); + final duration = context.select<DurationsData, Duration>((v) => v.formTransition); + return SafeArea( + top: false, + bottom: false, + child: Padding( + padding: const EdgeInsets.only(left: padding, right: padding, bottom: padding), + child: Row( + mainAxisSize: MainAxisSize.min, + textDirection: ViewerBottomOverlay.actionsDirection, + children: [ + const Spacer(), + ScalingOverlayTextButton( + scale: scale, + onPressed: () => selection.toggleSelection(mainEntry), + child: Selector<Selection<AvesEntry>?, int>( + selector: (context, selection) => selection?.selectedItems.length ?? 0, + builder: (context, count, child) { + return Row( + mainAxisSize: MainAxisSize.min, + textDirection: ViewerBottomOverlay.actionsDirection, + children: [ + AnimatedDiffText( + count == 0 ? l10n.collectionSelectPageTitle : l10n.itemCount(count), + duration: duration, + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 8), + child: Text(AText.separator), + ), + Selector<Selection<AvesEntry>, bool>( + selector: (context, selection) => selection.isSelected({mainEntry}), + builder: (context, isSelected, child) { + return AnimatedSwitcher( + duration: duration, + switchInCurve: Curves.easeOutBack, + switchOutCurve: Curves.easeOutBack, + transitionBuilder: (child, animation) => ScaleTransition( + scale: animation, + child: child, + ), + child: Icon( + isSelected ? AIcons.selected : AIcons.unselected, + key: ValueKey(isSelected), + ), + ); + }, + ), + ], + ); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/viewer/overlay/slideshow_buttons.dart b/lib/widgets/viewer/overlay/slideshow_buttons.dart new file mode 100644 index 0000000..6d4c7b1 --- /dev/null +++ b/lib/widgets/viewer/overlay/slideshow_buttons.dart @@ -0,0 +1,212 @@ +import 'dart:math'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/viewer/controls/intents.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves/widgets/viewer/overlay/bottom.dart'; +import 'package:aves/widgets/viewer/overlay/viewer_buttons.dart'; +import 'package:aves/widgets/viewer/slideshow_page.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; + +class SlideshowBottomOverlay extends StatelessWidget { + final AnimationController animationController; + final Size availableSize; + final EdgeInsets? viewInsets, viewPadding; + + const SlideshowBottomOverlay({ + super.key, + required this.animationController, + required this.availableSize, + this.viewInsets, + this.viewPadding, + }); + + @override + Widget build(BuildContext context) { + return Selector<MediaQueryData, double>( + selector: (context, mq) => max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom), + builder: (context, mqPaddingBottom, child) { + return Padding( + padding: EdgeInsets.only(bottom: mqPaddingBottom), + child: child, + ); + }, + child: SlideshowButtons( + availableSize: availableSize, + viewInsets: viewInsets, + viewPadding: viewPadding, + animationController: animationController, + ), + ); + } +} + +class SlideshowButtons extends StatefulWidget { + final Size availableSize; + final EdgeInsets? viewInsets, viewPadding; + final AnimationController animationController; + + const SlideshowButtons({ + super.key, + required this.availableSize, + required this.viewInsets, + required this.viewPadding, + required this.animationController, + }); + + @override + State<SlideshowButtons> createState() => _SlideshowButtonsState(); +} + +class _SlideshowButtonsState extends State<SlideshowButtons> { + final FocusScopeNode _buttonRowFocusScopeNode = FocusScopeNode(); + late CurvedAnimation _buttonScale; + + static const List<SlideshowAction> _actions = [ + SlideshowAction.resume, + SlideshowAction.showInCollection, + SlideshowAction.cast, + SlideshowAction.settings, + ]; + static const double _padding = ViewerButtonRowContent.padding; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + WidgetsBinding.instance.addPostFrameCallback((_) => _requestFocus()); + } + + @override + void didUpdateWidget(covariant SlideshowButtons oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + _buttonRowFocusScopeNode.dispose(); + super.dispose(); + } + + void _registerWidget(SlideshowButtons widget) { + _buttonScale = CurvedAnimation( + parent: widget.animationController, + // a little bounce at the top + curve: Curves.easeOutBack, + ); + } + + void _unregisterWidget(SlideshowButtons widget) { + _buttonScale.dispose(); + } + + @override + Widget build(BuildContext context) { + final viewInsetsPadding = (widget.viewInsets ?? EdgeInsets.zero) + (widget.viewPadding ?? EdgeInsets.zero); + final viewerButtonRow = FocusableActionDetector( + focusNode: _buttonRowFocusScopeNode, + shortcuts: settings.useTvLayout + ? const { + SingleActivator(LogicalKeyboardKey.arrowUp): TvShowLessInfoIntent(), + } + : null, + actions: { + TvShowLessInfoIntent: CallbackAction<Intent>(onInvoke: (intent) => TvShowLessInfoNotification().dispatch(context)), + }, + child: SafeArea( + top: false, + bottom: false, + minimum: EdgeInsets.only( + left: viewInsetsPadding.left, + right: viewInsetsPadding.right, + ), + child: _buildButtons(context), + ), + ); + + final availableWidth = widget.availableSize.width; + return SizedBox( + width: availableWidth, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + viewerButtonRow, + ], + ), + ); + } + + Widget _buildButtons(BuildContext context) { + if (settings.useTvLayout) { + return _buildTvButtonRowContent(context); + } + + return SafeArea( + top: false, + bottom: false, + child: Padding( + padding: const EdgeInsets.only(left: _padding / 2, right: _padding / 2, bottom: _padding), + child: Row( + textDirection: ViewerBottomOverlay.actionsDirection, + children: [ + const Spacer(), + ..._actions.map((action) => _buildOverlayButton(context, action)), + ], + ), + ), + ); + } + + Widget _buildOverlayButton(BuildContext context, SlideshowAction action) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: _padding / 2), + child: OverlayButton( + scale: _buttonScale, + child: IconButton( + icon: action.getIcon(), + onPressed: () => _onAction(context, action), + tooltip: action.getText(context), + ), + ), + ); + } + + Widget _buildTvButtonRowContent(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + textDirection: ViewerBottomOverlay.actionsDirection, + children: _actions.map((action) { + return CaptionedButton( + scale: _buttonScale, + icon: action.getIcon(), + caption: action.getText(context), + onPressed: () => _onAction(context, action), + ); + }).toList(), + ); + } + + void _onAction(BuildContext context, SlideshowAction action) { + switch (action) { + case SlideshowAction.cast: + const CastNotification(true).dispatch(context); + default: + SlideshowActionNotification(action).dispatch(context); + } + } + + void _requestFocus() => _buttonRowFocusScopeNode.children.firstOrNull?.requestFocus(); +} diff --git a/lib/widgets/viewer/overlay/thumbnail_preview.dart b/lib/widgets/viewer/overlay/thumbnail_preview.dart new file mode 100644 index 0000000..74b4502 --- /dev/null +++ b/lib/widgets/viewer/overlay/thumbnail_preview.dart @@ -0,0 +1,68 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/widgets/common/thumbnail/scroller.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:flutter/material.dart'; + +class ViewerThumbnailPreview extends StatefulWidget { + final List<AvesEntry> entries; + final int displayedIndex; + final double availableWidth; + + const ViewerThumbnailPreview({ + super.key, + required this.entries, + required this.displayedIndex, + required this.availableWidth, + }); + + @override + State<ViewerThumbnailPreview> createState() => _ViewerThumbnailPreviewState(); + + static double get preferredHeight => ThumbnailScroller.preferredHeight; +} + +class _ViewerThumbnailPreviewState extends State<ViewerThumbnailPreview> { + late final ValueNotifier<int> _entryIndexNotifier; + + List<AvesEntry> get entries => widget.entries; + + int get entryCount => entries.length; + + @override + void initState() { + super.initState(); + _entryIndexNotifier = ValueNotifier(widget.displayedIndex); + _entryIndexNotifier.addListener(_onScrollerIndexChanged); + } + + @override + void didUpdateWidget(covariant ViewerThumbnailPreview oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.displayedIndex != widget.displayedIndex) { + _entryIndexNotifier.value = widget.displayedIndex; + } + } + + @override + void dispose() { + _entryIndexNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ThumbnailScroller( + availableWidth: widget.availableWidth, + entryCount: entryCount, + entryBuilder: (index) => 0 <= index && index < entryCount ? entries[index] : null, + indexNotifier: _entryIndexNotifier, + onTap: (index) => ShowEntryNotification(animate: false, index: index).dispatch(context), + ); + } + + void _onScrollerIndexChanged() { + if (!mounted) return; + ShowEntryNotification(animate: false, index: _entryIndexNotifier.value).dispatch(context); + } +} diff --git a/lib/widgets/viewer/overlay/top.dart b/lib/widgets/viewer/overlay/top.dart new file mode 100644 index 0000000..b52ee7b --- /dev/null +++ b/lib/widgets/viewer/overlay/top.dart @@ -0,0 +1,216 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/viewer/view_state.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/fx/blurred.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:aves/widgets/viewer/multipage/conductor.dart'; +import 'package:aves/widgets/viewer/overlay/details/details.dart'; +import 'package:aves/widgets/viewer/overlay/histogram.dart'; +import 'package:aves/widgets/viewer/overlay/minimap.dart'; +import 'package:aves/widgets/viewer/page_entry_builder.dart'; +import 'package:aves/widgets/viewer/view/conductor.dart'; +import 'package:aves/widgets/viewer/view/controller.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ViewerTopOverlay extends StatelessWidget { + final List<AvesEntry> entries; + final int index; + final AvesEntry mainEntry; + final Animation<double> scale; + final bool hasCollection; + final ValueNotifier<bool> expandedNotifier; + final Size availableSize; + final EdgeInsets? viewInsets, viewPadding; + + static const Color componentBorderColor = Colors.white30; + static const double componentDimension = 96; + + const ViewerTopOverlay({ + super.key, + required this.entries, + required this.index, + required this.mainEntry, + required this.scale, + required this.hasCollection, + required this.expandedNotifier, + required this.availableSize, + required this.viewInsets, + required this.viewPadding, + }); + + @override + Widget build(BuildContext context) { + final multiPageController = mainEntry.isMultiPage ? context.read<MultiPageConductor>().getController(mainEntry) : null; + return PageEntryBuilder( + multiPageController: multiPageController, + builder: (pageEntry) { + pageEntry ??= mainEntry; + + final showInfo = settings.showOverlayInfo; + + final viewStateConductor = context.read<ViewStateConductor>(); + final viewStateNotifier = viewStateConductor.getOrCreateController(pageEntry).viewStateNotifier; + + final blurred = settings.enableBlurEffect; + final viewInsetsPadding = (viewInsets ?? EdgeInsets.zero) + (viewPadding ?? EdgeInsets.zero); + + Widget _decorateCornerChild(Widget child) => Padding( + padding: const EdgeInsets.symmetric(horizontal: 8) + const EdgeInsets.only(top: 8), + child: FadeTransition( + opacity: scale, + child: child, + ), + ); + + final startCornerChildren = [ + if (settings.showOverlayZoomLevel) + ZoomLevelIndicator( + viewStateNotifier: viewStateNotifier, + ), + if (settings.showOverlayMinimap) + Minimap( + viewStateNotifier: viewStateNotifier, + ), + ]; + + final endCornerChildren = [ + if (settings.overlayHistogramStyle != OverlayHistogramStyle.none) + Selector<ViewStateConductor, ViewStateController>( + selector: (context, vsc) => vsc.getOrCreateController(pageEntry!), + builder: (context, viewStateController, child) { + return ValueListenableBuilder<ImageProvider?>( + valueListenable: viewStateController.fullImageNotifier, + builder: (context, fullImage, child) { + if (fullImage == null || pageEntry == null) return const SizedBox(); + return ImageHistogram( + viewStateController: viewStateController, + image: fullImage, + ); + }, + ); + }, + ), + ]; + + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (showInfo) + GestureDetector( + onTap: () => expandedNotifier.value = !expandedNotifier.value, + child: BlurredRect( + enabled: blurred, + child: Container( + color: Themes.overlayBackgroundColor(brightness: Theme.of(context).brightness, blurred: blurred), + child: SafeArea( + bottom: false, + minimum: EdgeInsets.only( + left: viewInsetsPadding.left, + top: viewInsetsPadding.top, + right: viewInsetsPadding.right, + ), + child: ViewerDetailOverlay( + index: index, + entries: entries, + hasCollection: hasCollection, + multiPageController: multiPageController, + expandedNotifier: expandedNotifier, + availableSize: availableSize, + ), + ), + ), + ), + ), + SafeArea( + top: !showInfo, + minimum: EdgeInsets.only( + left: viewInsetsPadding.left, + right: viewInsetsPadding.right, + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (startCornerChildren.isNotEmpty) + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: startCornerChildren.map(_decorateCornerChild).toList(), + ), + const Spacer(), + if (endCornerChildren.isNotEmpty) + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: endCornerChildren.map(_decorateCornerChild).toList(), + ), + ], + ), + ), + ], + ); + }, + ); + } +} + +class ZoomLevelIndicator extends StatelessWidget { + final ValueNotifier<ViewState> viewStateNotifier; + + const ZoomLevelIndicator({ + super.key, + required this.viewStateNotifier, + }); + + @override + Widget build(BuildContext context) { + final blurred = settings.enableBlurEffect; + final border = AvesBorder.border( + context, + width: AvesBorder.curvedBorderWidth(context), + ); + final borderRadius = BorderRadius.circular(4); + final zoomScaleFactor = MediaQuery.devicePixelRatioOf(context) * 100; + + return IgnorePointer( + child: BlurredRRect( + enabled: blurred, + borderRadius: borderRadius, + child: Material( + type: MaterialType.button, + borderRadius: borderRadius, + color: Themes.overlayBackgroundColor(brightness: Theme.of(context).brightness, blurred: blurred), + child: ValueListenableBuilder<ViewState>( + valueListenable: viewStateNotifier, + builder: (context, viewState, child) { + final viewportSize = viewState.viewportSize; + final contentSize = viewState.contentSize; + if ((viewportSize == null || viewportSize.isEmpty) || (contentSize == null || contentSize.isEmpty)) { + return const SizedBox(); + } + final zoom = ((viewState.scale ?? 0) * zoomScaleFactor).round(); + return Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + foregroundDecoration: BoxDecoration( + border: border, + borderRadius: borderRadius, + ), + child: Text( + '$zoom${context.l10n.lengthUnitPercent}', + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + shadows: ViewerDetailOverlayContent.shadows(context), + ), + ), + ); + }, + ), + ), + ), + ); + } +} diff --git a/lib/widgets/viewer/overlay/video/ab_repeat.dart b/lib/widgets/viewer/overlay/video/ab_repeat.dart new file mode 100644 index 0000000..4b7ee76 --- /dev/null +++ b/lib/widgets/viewer/overlay/video/ab_repeat.dart @@ -0,0 +1,80 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/viewer/overlay/bottom.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:flutter/material.dart'; + +class VideoABRepeatOverlay extends StatefulWidget { + final AvesVideoController? controller; + final Animation<double> scale; + + const VideoABRepeatOverlay({ + super.key, + required this.controller, + required this.scale, + }); + + @override + State<StatefulWidget> createState() => _VideoABRepeatOverlayState(); +} + +class _VideoABRepeatOverlayState extends State<VideoABRepeatOverlay> { + Animation<double> get scale => widget.scale; + + AvesVideoController? get controller => widget.controller; + + ValueNotifier<ABRepeat?> get abRepeatNotifier => controller?.abRepeatNotifier ?? ValueNotifier(null); + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + + return ValueListenableBuilder<ABRepeat?>( + valueListenable: abRepeatNotifier, + builder: (context, abRepeat, child) { + if (abRepeat == null) return const SizedBox(); + + Widget boundButton; + if (abRepeat.start == null) { + boundButton = IconButton( + icon: Icon(AIcons.setBoundStart), + onPressed: controller?.setABRepeatStart, + tooltip: l10n.videoRepeatActionSetStart, + ); + } else if (abRepeat.end == null) { + boundButton = IconButton( + icon: Icon(AIcons.setBoundEnd), + onPressed: controller?.setABRepeatEnd, + tooltip: l10n.videoRepeatActionSetEnd, + ); + } else { + boundButton = IconButton( + icon: Icon(AIcons.resetBounds), + onPressed: controller?.resetABRepeat, + tooltip: l10n.resetTooltip, + ); + } + return Row( + textDirection: ViewerBottomOverlay.actionsDirection, + children: [ + const Spacer(), + OverlayButton( + scale: scale, + child: boundButton, + ), + const SizedBox(width: 8), + OverlayButton( + scale: scale, + child: IconButton( + icon: Icon(AIcons.repeatOff), + onPressed: () => controller?.toggleABRepeat(), + tooltip: l10n.stopTooltip, + ), + ), + ], + ); + }, + ); + } +} diff --git a/lib/widgets/viewer/overlay/video/controls.dart b/lib/widgets/viewer/overlay/video/controls.dart new file mode 100644 index 0000000..f2929db --- /dev/null +++ b/lib/widgets/viewer/overlay/video/controls.dart @@ -0,0 +1,94 @@ +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/action_controls/togglers/play.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/viewer/overlay/bottom.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class VideoControlRow extends StatelessWidget { + final AvesVideoController? controller; + final Animation<double> scale; + final bool canOpenVideoPlayer; + final Function(EntryAction value) onActionSelected; + + static const double padding = 8; + static const Radius radius = Radius.circular(123); + + const VideoControlRow({ + super.key, + this.controller, + this.scale = kAlwaysCompleteAnimation, + this.canOpenVideoPlayer = true, + required this.onActionSelected, + }); + + @override + Widget build(BuildContext context) { + return Selector<Settings, List<EntryAction>>( + selector: (context, s) => s.videoControlActions, + builder: (context, actions, child) { + return Padding( + padding: EdgeInsets.only(left: actions.isEmpty ? 0 : padding), + child: Row( + mainAxisSize: MainAxisSize.min, + textDirection: ViewerBottomOverlay.actionsDirection, + children: actions.map((action) { + // null radius yields a circular button + BorderRadius? borderRadius; + if (actions.length > 1) { + // zero radius yields a square button + borderRadius = BorderRadius.zero; + if (action == actions.first) { + borderRadius = const BorderRadius.horizontal(left: radius); + } else if (action == actions.last) { + borderRadius = const BorderRadius.horizontal(right: radius); + } + } + return _buildOverlayButton(context, action, borderRadius); + }).toList(), + ), + ); + }, + ); + } + + Widget _buildOverlayButton( + BuildContext context, + EntryAction action, + BorderRadius? borderRadius, + ) { + Widget child; + if (action == EntryAction.videoTogglePlay) { + child = PlayToggler( + controller: controller, + onPressed: () => onActionSelected(action), + ); + } else { + final enabled = action == EntryAction.openVideoPlayer ? canOpenVideoPlayer : true; + child = IconButton( + icon: action.getIcon(), + onPressed: enabled ? () => onActionSelected(action) : null, + tooltip: action.getText(context), + ); + } + + if (borderRadius != null) { + child = Padding( + padding: EdgeInsets.only( + left: borderRadius.topLeft.x > 0 ? padding / 3 : 0, + right: borderRadius.topRight.x > 0 ? padding / 3 : 0, + ), + child: child, + ); + } + + return OverlayButton( + scale: scale, + borderRadius: borderRadius, + child: child, + ); + } +} diff --git a/lib/widgets/viewer/overlay/video/progress_bar.dart b/lib/widgets/viewer/overlay/video/progress_bar.dart new file mode 100644 index 0000000..c08a948 --- /dev/null +++ b/lib/widgets/viewer/overlay/video/progress_bar.dart @@ -0,0 +1,225 @@ +import 'dart:async'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/ref/locales.dart'; +import 'package:aves/theme/format.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/theme/themes.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves/widgets/common/fx/blurred.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:decorated_icon/decorated_icon.dart'; +import 'package:flutter/material.dart'; + +class VideoProgressBar extends StatefulWidget { + final AvesVideoController? controller; + final Animation<double> scale; + + const VideoProgressBar({ + super.key, + required this.controller, + required this.scale, + }); + + @override + State<VideoProgressBar> createState() => _VideoProgressBarState(); +} + +class _VideoProgressBarState extends State<VideoProgressBar> { + final GlobalKey _progressBarKey = GlobalKey(debugLabel: 'video-progress-bar'); + bool _playingOnDragStart = false; + + static const double radius = 123; + + AvesVideoController? get controller => widget.controller; + + Stream<int> get positionStream => controller?.positionStream ?? Stream.value(0); + + bool get isPlaying => controller?.isPlaying ?? false; + + ValueNotifier<ABRepeat?> get abRepeatNotifier => controller?.abRepeatNotifier ?? ValueNotifier(null); + + @override + Widget build(BuildContext context) { + final blurred = settings.enableBlurEffect; + final theme = Theme.of(context); + return SizeTransition( + sizeFactor: widget.scale, + child: BlurredRRect.all( + enabled: blurred, + borderRadius: radius, + child: GestureDetector( + onTapDown: (details) { + _seekFromTap(details.globalPosition); + }, + onHorizontalDragStart: (details) { + _playingOnDragStart = isPlaying; + if (_playingOnDragStart) controller?.pause(); + }, + onHorizontalDragUpdate: (details) { + _seekFromTap(details.globalPosition); + }, + onHorizontalDragEnd: (details) { + if (_playingOnDragStart) controller?.play(); + }, + child: ConstrainedBox( + constraints: const BoxConstraints(minHeight: kMinInteractiveDimension), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: Themes.overlayBackgroundColor(brightness: theme.brightness, blurred: blurred), + border: AvesBorder.border(context), + borderRadius: const BorderRadius.all(Radius.circular(radius)), + ), + child: MediaQuery( + data: MediaQuery.of(context).copyWith( + textScaler: TextScaler.noScaling, + ), + child: ValueListenableBuilder<ABRepeat?>( + valueListenable: abRepeatNotifier, + builder: (context, abRepeat, child) { + return Stack( + fit: StackFit.passthrough, + children: [ + if (abRepeat != null) ...[ + _buildABRepeatMark(context, abRepeat.start), + _buildABRepeatMark(context, abRepeat.end), + ], + Container( + key: _progressBarKey, + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(vertical: 4), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + StreamBuilder<int>( + stream: positionStream, + builder: (context, snapshot) { + // do not use stream snapshot because it is obsolete when switching between videos + final position = controller?.currentPosition.floor() ?? 0; + return _buildText(formatFriendlyDuration(Duration(milliseconds: position))); + }, + ), + const Spacer(), + _buildText(formatFriendlyDuration(Duration(milliseconds: controller?.duration ?? 0))), + ], + ), + ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(4)), + child: Directionality( + textDirection: videoPlaybackDirection, + child: StreamBuilder<int>( + stream: positionStream, + builder: (context, snapshot) { + // do not use stream snapshot because it is obsolete when switching between videos + var progress = controller?.progress ?? 0.0; + if (!progress.isFinite) progress = 0.0; + return LinearProgressIndicator( + value: progress, + backgroundColor: theme.colorScheme.onSurface.withValues(alpha: .2), + ); + }, + ), + ), + ), + Row( + children: [ + _buildSpeedIndicator(), + _buildMuteIndicator(), + // fake text below to match the height of the text above and center the whole thing + _buildText(''), + ], + ), + ], + ), + ), + ], + ); + }, + ), + ), + ), + ), + ), + ), + ); + } + + Widget _buildText(String text) { + return Text( + text, + style: TextStyle( + shadows: Theme.of(context).isDark ? AStyles.embossShadows : null, + ), + strutStyle: const StrutStyle( + forceStrutHeight: true, + ), + ); + } + + Widget _buildABRepeatMark(BuildContext context, int? position) { + if (controller == null || position == null) return const SizedBox(); + return Positioned( + left: _progressToDx(position / controller!.duration), + top: 0, + bottom: 0, + child: Container( + decoration: BoxDecoration( + border: Border(left: AvesBorder.straightSide(context, width: 2)), + ), + ), + ); + } + + Widget _buildSpeedIndicator() => StreamBuilder<double>( + stream: controller?.speedStream ?? Stream.value(1.0), + builder: (context, snapshot) { + final speed = controller?.speed ?? 1.0; + return speed != 1 + ? Padding( + padding: const EdgeInsetsDirectional.only(end: 8), + child: _buildText('x$speed'), + ) + : const SizedBox(); + }, + ); + + Widget _buildMuteIndicator() => StreamBuilder<double>( + stream: controller?.volumeStream ?? Stream.value(1.0), + builder: (context, snapshot) { + final textScaler = MediaQuery.textScalerOf(context); + final isMuted = controller?.isMuted ?? false; + return isMuted + ? Padding( + padding: const EdgeInsetsDirectional.only(end: 8), + child: DecoratedIcon( + AIcons.mute, + size: textScaler.scale(16), + shadows: Theme.of(context).isDark ? AStyles.embossShadows : null, + ), + ) + : const SizedBox(); + }, + ); + + RenderBox? _getProgressBarRenderBox() { + return _progressBarKey.currentContext?.findRenderObject() as RenderBox?; + } + + void _seekFromTap(Offset globalPosition) async { + final box = _getProgressBarRenderBox(); + if (controller == null || box == null) return; + + final dx = box.globalToLocal(globalPosition).dx; + await controller!.seekToProgress(dx / box.size.width); + } + + double? _progressToDx(double progress) { + final box = _getProgressBarRenderBox(); + return box != null && box.hasSize ? progress * box.size.width : null; + } +} diff --git a/lib/widgets/viewer/overlay/video/video.dart b/lib/widgets/viewer/overlay/video/video.dart new file mode 100644 index 0000000..02ad52a --- /dev/null +++ b/lib/widgets/viewer/overlay/video/video.dart @@ -0,0 +1,93 @@ +import 'dart:async'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/viewer/overlay/bottom.dart'; +import 'package:aves/widgets/viewer/overlay/video/ab_repeat.dart'; +import 'package:aves/widgets/viewer/overlay/video/controls.dart'; +import 'package:aves/widgets/viewer/overlay/video/progress_bar.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:flutter/material.dart'; + +class VideoControlOverlay extends StatefulWidget { + final AvesEntry entry; + final AvesVideoController? controller; + final Animation<double> scale; + final Function(EntryAction value) onActionSelected; + + const VideoControlOverlay({ + super.key, + required this.entry, + required this.controller, + required this.scale, + required this.onActionSelected, + }); + + @override + State<StatefulWidget> createState() => _VideoControlOverlayState(); +} + +class _VideoControlOverlayState extends State<VideoControlOverlay> with SingleTickerProviderStateMixin { + AvesEntry get entry => widget.entry; + + Animation<double> get scale => widget.scale; + + AvesVideoController? get controller => widget.controller; + + Stream<VideoStatus> get statusStream => controller?.statusStream ?? Stream.value(VideoStatus.idle); + + @override + Widget build(BuildContext context) { + return StreamBuilder<VideoStatus>( + stream: statusStream, + builder: (context, snapshot) { + // do not use stream snapshot because it is obsolete when switching between videos + final status = controller?.status ?? VideoStatus.idle; + + if (status == VideoStatus.error) { + const action = EntryAction.openVideoPlayer; + return Align( + alignment: Alignment.centerRight, + child: OverlayButton( + scale: scale, + child: IconButton( + icon: action.getIcon(), + onPressed: entry.trashed ? null : () => widget.onActionSelected(action), + tooltip: action.getText(context), + ), + ), + ); + } + + return Column( + children: [ + VideoABRepeatOverlay( + controller: controller, + scale: scale, + ), + const SizedBox(height: 8), + Row( + textDirection: ViewerBottomOverlay.actionsDirection, + children: [ + Expanded( + child: VideoProgressBar( + controller: controller, + scale: scale, + ), + ), + VideoControlRow( + controller: controller, + scale: scale, + canOpenVideoPlayer: !entry.trashed, + onActionSelected: widget.onActionSelected, + ), + ], + ), + ], + ); + }, + ); + } +} diff --git a/lib/widgets/viewer/overlay/viewer_buttons.dart b/lib/widgets/viewer/overlay/viewer_buttons.dart new file mode 100644 index 0000000..b1506f9 --- /dev/null +++ b/lib/widgets/viewer/overlay/viewer_buttons.dart @@ -0,0 +1,544 @@ +import 'dart:math'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/move_button.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/rate_button.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/share_button.dart'; +import 'package:aves/widgets/common/action_controls/quick_choosers/tag_button.dart'; +import 'package:aves/widgets/common/action_controls/togglers/favourite.dart'; +import 'package:aves/widgets/common/action_controls/togglers/mute.dart'; +import 'package:aves/widgets/common/action_controls/togglers/play.dart'; +import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; +import 'package:aves/widgets/common/basic/popup/container.dart'; +import 'package:aves/widgets/common/basic/popup/expansion_panel.dart'; +import 'package:aves/widgets/common/basic/popup/menu_row.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/viewer/action/entry_action_delegate.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves/widgets/viewer/overlay/bottom.dart'; +import 'package:aves/widgets/viewer/video/conductor.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; + +class ViewerButtons extends StatelessWidget { + final AvesEntry mainEntry, pageEntry; + final CollectionLens? collection; + final Animation<double> scale; + + static const double outerPadding = 8; + static const double innerPadding = 8; + + static double preferredHeight(BuildContext context) => _buttonSize(context) + ViewerButtonRowContent.padding; + + static double _buttonSize(BuildContext context) => OverlayButton.getSize(context); + + const ViewerButtons({ + super.key, + required this.mainEntry, + required this.pageEntry, + required this.collection, + required this.scale, + }); + + @override + Widget build(BuildContext context) { + final actionDelegate = EntryActionDelegate(mainEntry, pageEntry, collection); + + if (settings.useTvLayout) { + return _TvButtonRowContent( + actionDelegate: actionDelegate, + scale: scale, + mainEntry: mainEntry, + pageEntry: pageEntry, + ); + } + + final appMode = context.watch<ValueNotifier<AppMode>>().value; + bool isVisible(EntryAction action) => actionDelegate.isVisible( + appMode: appMode, + action: action, + ); + + final trashed = mainEntry.trashed; + return SafeArea( + top: false, + bottom: false, + child: LayoutBuilder( + builder: (context, constraints) { + final buttonWidth = _buttonSize(context); + final availableCount = ((constraints.maxWidth - outerPadding * 2) / (buttonWidth + innerPadding)).floor(); + return Selector<Settings, bool>( + selector: (context, s) => s.isRotationLocked, + builder: (context, s, child) { + final quickActions = (trashed ? EntryActions.trashed : settings.viewerQuickActions).where(isVisible).where(actionDelegate.canApply).take(max(0, availableCount - 1)).toList(); + List<EntryAction> getMenuActions(List<EntryAction> categoryActions) { + return categoryActions.where((action) => !quickActions.contains(action)).where(isVisible).toList(); + } + + return ViewerButtonRowContent( + actionDelegate: actionDelegate, + quickActions: quickActions, + topLevelActions: getMenuActions(EntryActions.topLevel), + exportActions: getMenuActions(EntryActions.export), + videoActions: getMenuActions(EntryActions.video), + scale: scale, + mainEntry: mainEntry, + pageEntry: pageEntry, + ); + }, + ); + }, + ), + ); + } +} + +class _TvButtonRowContent extends StatelessWidget { + final EntryActionDelegate actionDelegate; + final Animation<double> scale; + final AvesEntry mainEntry, pageEntry; + + const _TvButtonRowContent({ + required this.actionDelegate, + required this.scale, + required this.mainEntry, + required this.pageEntry, + }); + + @override + Widget build(BuildContext context) { + final appMode = context.watch<ValueNotifier<AppMode>>().value; + return Selector<VideoConductor, AvesVideoController?>( + selector: (context, vc) => vc.getController(pageEntry), + builder: (context, videoController, child) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + textDirection: ViewerBottomOverlay.actionsDirection, + children: + [ + ...EntryActions.topLevel, + ...EntryActions.export, + ...EntryActions.videoPlayback, + ...EntryActions.video, + ] + .where( + (action) => actionDelegate.isVisible( + appMode: appMode, + action: action, + ), + ) + .map((action) { + final enabled = actionDelegate.canApply(action); + return CaptionedButton( + scale: scale, + iconButtonBuilder: (context, focusNode) => _ViewerButtonRowContentState._buildButtonIcon( + context: context, + action: action, + mainEntry: mainEntry, + pageEntry: pageEntry, + videoController: videoController, + actionDelegate: actionDelegate, + focusNode: focusNode, + ), + captionText: _buildButtonCaption( + context: context, + action: action, + mainEntry: mainEntry, + pageEntry: pageEntry, + videoController: videoController, + enabled: enabled, + ), + onPressed: enabled ? () => actionDelegate.onActionSelected(context, action) : null, + ); + }) + .toList(), + ); + }, + ); + } + + static Widget _buildButtonCaption({ + required BuildContext context, + required EntryAction action, + required AvesEntry mainEntry, + required AvesEntry pageEntry, + required AvesVideoController? videoController, + required bool enabled, + }) { + switch (action) { + case EntryAction.toggleFavourite: + final favouriteTargetEntry = mainEntry.isStack ? pageEntry : mainEntry; + return FavouriteTogglerCaption( + entries: {favouriteTargetEntry}, + enabled: enabled, + ); + case EntryAction.videoToggleMute: + return MuteTogglerCaption( + controller: videoController, + enabled: enabled, + ); + case EntryAction.videoTogglePlay: + return PlayTogglerCaption( + controller: videoController, + enabled: enabled, + ); + default: + return CaptionedButtonText( + text: action.getText(context), + enabled: enabled, + ); + } + } +} + +class ViewerButtonRowContent extends StatefulWidget { + final EntryActionDelegate actionDelegate; + final List<EntryAction> quickActions, topLevelActions, exportActions, videoActions; + final Animation<double> scale; + final AvesEntry mainEntry, pageEntry; + + static const double padding = 8; + + const ViewerButtonRowContent({ + super.key, + required this.actionDelegate, + required this.quickActions, + required this.topLevelActions, + required this.exportActions, + required this.videoActions, + required this.scale, + required this.mainEntry, + required this.pageEntry, + }); + + @override + State<ViewerButtonRowContent> createState() => _ViewerButtonRowContentState(); +} + +class _ViewerButtonRowContentState extends State<ViewerButtonRowContent> { + final ValueNotifier<String?> _popupExpandedNotifier = ValueNotifier(null); + + EntryActionDelegate get actionDelegate => widget.actionDelegate; + + AvesEntry get mainEntry => widget.mainEntry; + + AvesEntry get pageEntry => widget.pageEntry; + + AvesEntry get favouriteTargetEntry => mainEntry.isStack ? pageEntry : mainEntry; + + static const double padding = ViewerButtonRowContent.padding; + + @override + void dispose() { + _popupExpandedNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final appMode = context.watch<ValueNotifier<AppMode>>().value; + bool isVisible(EntryAction action) => actionDelegate.isVisible( + appMode: appMode, + action: action, + ); + final showOrientationActions = EntryActions.orientationActions.any(isVisible); + final topLevelActions = widget.topLevelActions; + final exportActions = widget.exportActions; + final videoActions = widget.videoActions; + + final hasOverflowMenu = showOrientationActions || topLevelActions.isNotEmpty || exportActions.isNotEmpty || videoActions.isNotEmpty; + final animations = context.select<Settings, AccessibilityAnimations>((v) => v.accessibilityAnimations); + return Selector<VideoConductor, AvesVideoController?>( + selector: (context, vc) => vc.getController(pageEntry), + builder: (context, videoController, child) { + return Padding( + padding: const EdgeInsets.only(left: padding / 2, right: padding / 2, bottom: padding), + child: Row( + textDirection: ViewerBottomOverlay.actionsDirection, + children: [ + const Spacer(), + ...widget.quickActions.map((action) => _buildOverlayButton(context, action, videoController)), + if (hasOverflowMenu) + Padding( + padding: const EdgeInsets.symmetric(horizontal: padding / 2), + child: OverlayButton( + scale: widget.scale, + child: FontSizeIconTheme( + child: PopupMenuButton<EntryAction>( + key: const Key('entry-menu-button'), + itemBuilder: (context) { + final exportInternalActions = exportActions.whereNot(EntryActions.exportExternal.contains).toList(); + final exportExternalActions = exportActions.where(EntryActions.exportExternal.contains).toList(); + return [ + if (showOrientationActions) _buildRotateAndFlipMenuItems(context), + ...topLevelActions.map((action) => _buildPopupMenuItem(context, action, videoController)), + if (exportActions.isNotEmpty) + PopupMenuExpansionPanel<EntryAction>( + enabled: !availability.isLocked, + value: 'export', + expandedNotifier: _popupExpandedNotifier, + icon: AIcons.export, + title: context.l10n.entryActionExport, + items: [ + ...exportInternalActions.map((action) => _buildPopupMenuItem(context, action, videoController)), + if (exportInternalActions.isNotEmpty && exportExternalActions.isNotEmpty) const PopupMenuDivider(height: 0), + ...exportExternalActions.map((action) => _buildPopupMenuItem(context, action, videoController)), + ], + ), + if (videoActions.isNotEmpty) + PopupMenuExpansionPanel<EntryAction>( + value: 'video', + expandedNotifier: _popupExpandedNotifier, + icon: AIcons.video, + title: context.l10n.settingsVideoSectionTitle, + items: [ + ...videoActions.map((action) => _buildPopupMenuItem(context, action, videoController)), + ], + ), + if (isVisible(EntryAction.debug)) ...[ + const PopupMenuDivider(), + _buildPopupMenuItem(context, EntryAction.debug, videoController), + ], + ]; + }, + onOpened: () => PopupMenuOpenedNotification().dispatch(context), + onSelected: (action) async { + _popupExpandedNotifier.value = null; + // wait for the popup menu to hide before proceeding with the action + await Future.delayed(animations.popUpAnimationDelay * timeDilation); + actionDelegate.onActionSelected(context, action); + }, + onCanceled: () { + _popupExpandedNotifier.value = null; + }, + iconSize: IconTheme.of(context).size, + popUpAnimationStyle: animations.popUpAnimationStyle, + ), + ), + ), + ), + ], + ), + ); + }, + ); + } + + Widget _buildOverlayButton(BuildContext context, EntryAction action, AvesVideoController? videoController) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: padding / 2), + child: OverlayButton( + scale: widget.scale, + child: _buildButtonIcon( + context: context, + action: action, + mainEntry: mainEntry, + pageEntry: pageEntry, + videoController: videoController, + actionDelegate: actionDelegate, + ), + ), + ); + } + + PopupMenuItem<EntryAction> _buildPopupMenuItem(BuildContext context, EntryAction action, AvesVideoController? videoController) { + var enabled = actionDelegate.canApply(action); + switch (action) { + case EntryAction.videoCaptureFrame: + enabled &= videoController?.canCaptureFrameNotifier.value ?? false; + case EntryAction.videoToggleMute: + enabled &= videoController?.canMuteNotifier.value ?? false; + case EntryAction.videoSelectStreams: + enabled &= videoController?.canSelectStreamNotifier.value ?? false; + case EntryAction.videoSetSpeed: + enabled &= videoController?.canSetSpeedNotifier.value ?? false; + default: + break; + } + + Widget? child; + switch (action) { + case EntryAction.toggleFavourite: + child = FavouriteToggler( + entries: {favouriteTargetEntry}, + isMenuItem: true, + ); + case EntryAction.videoToggleMute: + child = MuteToggler( + controller: videoController, + isMenuItem: true, + ); + case EntryAction.videoTogglePlay: + child = PlayToggler( + controller: videoController, + isMenuItem: true, + ); + default: + child = MenuRow(text: action.getText(context), icon: action.getIcon()); + } + return PopupMenuItem( + value: action, + enabled: enabled, + child: child, + ); + } + + PopupMenuEntry<EntryAction> _buildRotateAndFlipMenuItems(BuildContext context) { + Widget buildDivider() => const SizedBox( + height: 16, + child: VerticalDivider( + width: 1, + thickness: 1, + ), + ); + + Widget buildItem(EntryAction action) => Expanded( + child: Material( + color: Colors.transparent, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(8)), + ), + clipBehavior: Clip.antiAlias, + child: PopupMenuItem( + value: action, + enabled: actionDelegate.canApply(action), + child: Tooltip( + message: action.getText(context), + child: Center(child: action.getIcon()), + ), + ), + ), + ); + + return PopupMenuItemContainer( + child: Row( + children: [ + buildDivider(), + buildItem(EntryAction.rotateCCW), + buildDivider(), + buildItem(EntryAction.rotateCW), + buildDivider(), + buildItem(EntryAction.flip), + buildDivider(), + ], + ), + ); + } + + static Widget _buildButtonIcon({ + required BuildContext context, + required EntryAction action, + required AvesEntry mainEntry, + required AvesEntry pageEntry, + required AvesVideoController? videoController, + required EntryActionDelegate actionDelegate, + FocusNode? focusNode, + }) { + void onPressed() => actionDelegate.onActionSelected(context, action); + + Widget _buildFromListenable(ValueListenable<bool>? enabledNotifier) { + return NullableValueListenableBuilder<bool>( + valueListenable: enabledNotifier, + builder: (context, value, child) { + final canDo = value ?? false; + return IconButton( + icon: child!, + onPressed: canDo ? onPressed : null, + focusNode: focusNode, + tooltip: action.getText(context), + ); + }, + child: action.getIcon(), + ); + } + + final blurred = settings.enableBlurEffect; + switch (action) { + case EntryAction.copy: + return MoveButton( + copy: true, + blurred: blurred, + onChooserValue: (album) => actionDelegate.quickMove(context, album, copy: true), + onPressed: onPressed, + ); + case EntryAction.move: + return MoveButton( + copy: false, + blurred: blurred, + onChooserValue: (album) => actionDelegate.quickMove(context, album, copy: false), + onPressed: onPressed, + ); + case EntryAction.share: + return ShareButton( + blurred: blurred, + entries: {mainEntry}, + onChooserValue: (action) => actionDelegate.quickShare(context, action), + focusNode: focusNode, + onPressed: onPressed, + ); + case EntryAction.toggleFavourite: + final favouriteTargetEntry = mainEntry.isStack ? pageEntry : mainEntry; + return FavouriteToggler( + entries: {favouriteTargetEntry}, + focusNode: focusNode, + onPressed: onPressed, + ); + case EntryAction.videoToggleMute: + return MuteToggler( + controller: videoController, + focusNode: focusNode, + onPressed: onPressed, + ); + case EntryAction.videoTogglePlay: + return PlayToggler( + controller: videoController, + focusNode: focusNode, + onPressed: onPressed, + ); + case EntryAction.videoCaptureFrame: + return _buildFromListenable(videoController?.canCaptureFrameNotifier); + case EntryAction.videoSelectStreams: + return _buildFromListenable(videoController?.canSelectStreamNotifier); + case EntryAction.videoSetSpeed: + return _buildFromListenable(videoController?.canSetSpeedNotifier); + case EntryAction.editRating: + return RateButton( + blurred: blurred, + onChooserValue: (rating) => actionDelegate.quickRate(context, rating), + focusNode: focusNode, + onPressed: onPressed, + ); + case EntryAction.editTags: + return TagButton( + blurred: blurred, + onChooserValue: (filter) => actionDelegate.quickTag(context, filter), + focusNode: focusNode, + onPressed: onPressed, + ); + default: + return IconButton( + icon: action.getIcon(), + onPressed: onPressed, + focusNode: focusNode, + tooltip: action.getText(context), + ); + } + } +} diff --git a/lib/widgets/viewer/overlay/wallpaper_buttons.dart b/lib/widgets/viewer/overlay/wallpaper_buttons.dart new file mode 100644 index 0000000..095960c --- /dev/null +++ b/lib/widgets/viewer/overlay/wallpaper_buttons.dart @@ -0,0 +1,254 @@ +import 'dart:async'; +import 'dart:math'; +import 'dart:ui' as ui; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/images.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/services/wallpaper_service.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:aves/widgets/dialogs/wallpaper_settings_dialog.dart'; +import 'package:aves/widgets/viewer/overlay/bottom.dart'; +import 'package:aves/widgets/viewer/overlay/viewer_buttons.dart'; +import 'package:aves/widgets/viewer/video/conductor.dart'; +import 'package:aves/widgets/viewer/view/conductor.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:provider/provider.dart'; + +class WallpaperButtons extends StatelessWidget with FeedbackMixin { + final AvesEntry entry; + final Animation<double> scale; + + const WallpaperButtons({ + super.key, + required this.entry, + required this.scale, + }); + + @override + Widget build(BuildContext context) { + const padding = ViewerButtonRowContent.padding; + return SafeArea( + top: false, + bottom: false, + child: Padding( + padding: const EdgeInsets.only(left: padding / 2, right: padding / 2, bottom: padding), + child: Row( + textDirection: ViewerBottomOverlay.actionsDirection, + children: [ + const Spacer(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: padding / 2), + child: ScalingOverlayTextButton( + scale: scale, + onPressed: () => _setWallpaper(context), + child: Text(context.l10n.viewerSetWallpaperButtonLabel), + ), + ), + ], + ), + ), + ); + } + + Future<void> _setWallpaper(BuildContext context) async { + final l10n = context.l10n; + final value = await showDialog<(WallpaperTarget, bool)>( + context: context, + builder: (context) => const WallpaperSettingsDialog(), + routeSettings: const RouteSettings(name: WallpaperSettingsDialog.routeName), + ); + if (value == null) return; + + final reportController = StreamController.broadcast(); + unawaited( + showOpReport( + context: context, + opStream: reportController.stream, + ), + ); + + var region = _getVisibleRegion(context); + if (region == null) return; + + final (target, useScrollEffect) = value; + if (useScrollEffect) { + final deltaX = min(region.left, entry.displaySize.width - region.right); + region = Rect.fromLTRB(region.left - deltaX, region.top, region.right + deltaX, region.bottom); + } + + final bytes = await _getBytes(context, region); + + final success = bytes != null && await WallpaperService.set(bytes, target); + unawaited(reportController.close()); + + if (success) { + await SystemNavigator.pop(); + } else { + showFeedback(context, FeedbackType.warn, l10n.genericFailureFeedback); + } + } + + Rect? _getVisibleRegion(BuildContext context) { + final viewState = context.read<ViewStateConductor>().getOrCreateController(entry).viewState; + final viewportSize = viewState.viewportSize; + final contentSize = viewState.contentSize; + final scale = viewState.scale; + if (viewportSize == null || contentSize == null || contentSize.isEmpty || scale == null) return null; + + final center = (contentSize / 2 - viewState.position / scale) as Size; + final regionSize = viewportSize / scale; + final regionTopLeft = (center - regionSize / 2) as Offset; + return regionTopLeft & regionSize; + } + + Future<Uint8List?> _getBytes(BuildContext context, Rect displayRegion) async { + final viewState = context.read<ViewStateConductor>().getOrCreateController(entry).viewState; + final scale = viewState.scale; + + final displaySize = entry.displaySize; + if (displaySize.isEmpty || scale == null) return null; + + var storageRegion = Rectangle( + displayRegion.left, + displayRegion.top, + displayRegion.width, + displayRegion.height, + ); + + final rotationDegrees = entry.rotationDegrees; + final isFlipped = entry.isFlipped; + var needCrop = false, needOrientation = false; + + ImageProvider? provider; + if (entry.isSvg) { + provider = entry.getRegion( + scale: scale, + region: storageRegion, + ); + } else if (entry.isVideo) { + final videoController = context.read<VideoConductor>().getController(entry); + if (videoController != null) { + final bytes = await videoController.captureFrame(); + if (bytes != null) { + needOrientation = rotationDegrees != 0 || isFlipped; + needCrop = true; + provider = MemoryImage(bytes); + } + } + } else if (entry.isDecodingSupported) { + if (entry.useTiles) { + // provider image is already cropped, but not rotated + needOrientation = rotationDegrees != 0 || isFlipped; + if (needOrientation) { + final transform = Matrix4.identity() + ..translateByDouble(entry.width / 2.0, entry.height / 2.0, 0, 1) + ..scaleByDouble(isFlipped ? -1.0 : 1.0, 1.0, 1.0, 1.0) + ..rotateZ(-degToRadian(rotationDegrees.toDouble())) + ..translateByDouble(-displaySize.width / 2.0, -displaySize.height / 2.0, 0, 1); + + // apply EXIF orientation + final regionRectDouble = Rect.fromLTWH(displayRegion.left.toDouble(), displayRegion.top.toDouble(), displayRegion.width.toDouble(), displayRegion.height.toDouble()); + final tl = MatrixUtils.transformPoint(transform, regionRectDouble.topLeft); + final br = MatrixUtils.transformPoint(transform, regionRectDouble.bottomRight); + storageRegion = Rectangle<double>.fromPoints( + Point<double>(tl.dx, tl.dy), + Point<double>(br.dx, br.dy), + ); + } + + final devicePixelRatio = MediaQuery.of(context).devicePixelRatio; + final sampleSize = ExtraAvesEntryImages.sampleSizeForScale(magnifierScale: scale, devicePixelRatio: devicePixelRatio); + provider = entry.getRegion(sampleSize: sampleSize, region: storageRegion); + displayRegion = Rect.fromLTWH( + displayRegion.left / sampleSize, + displayRegion.top / sampleSize, + displayRegion.width / sampleSize, + displayRegion.height / sampleSize, + ); + } else { + // provider image is already rotated, but not cropped + needCrop = true; + provider = entry.fullImage; + } + } + if (provider == null) return null; + + final imageInfoCompleter = Completer<ImageInfo?>(); + final imageStream = provider.resolve(ImageConfiguration.empty); + final imageStreamListener = ImageStreamListener((image, synchronousCall) async { + imageInfoCompleter.complete(image); + }, onError: imageInfoCompleter.completeError); + imageStream.addListener(imageStreamListener); + ImageInfo? regionImageInfo; + try { + regionImageInfo = await imageInfoCompleter.future; + } catch (error) { + debugPrint('failed to get image for region=$displayRegion with error=$error'); + } + imageStream.removeListener(imageStreamListener); + var image = regionImageInfo?.image; + if (image == null) return null; + + if (needCrop || needOrientation) { + final recorder = ui.PictureRecorder(); + final canvas = Canvas(recorder); + + final w = image.width.toDouble(); + final h = image.height.toDouble(); + final imageDisplaySize = entry.isRotated ? Size(h, w) : Size(w, h); + var cropDx = -displayRegion.left.toDouble(); + var cropDy = -displayRegion.top.toDouble(); + + if (needOrientation) { + // apply EXIF orientation + if (isFlipped) { + canvas.scale(-1, 1); + switch (rotationDegrees) { + case 90: + canvas.translate(-imageDisplaySize.width, imageDisplaySize.height); + canvas.rotate(degToRadian(270)); + case 180: + canvas.translate(0, imageDisplaySize.height); + canvas.rotate(degToRadian(180)); + case 270: + canvas.rotate(degToRadian(90)); + } + } else { + switch (rotationDegrees) { + case 90: + canvas.translate(imageDisplaySize.width, 0); + cropDx = -displayRegion.top.toDouble(); + cropDy = displayRegion.left.toDouble(); + case 180: + canvas.translate(imageDisplaySize.width, imageDisplaySize.height); + case 270: + canvas.translate(0, imageDisplaySize.height); + } + if (rotationDegrees != 0) { + canvas.rotate(degToRadian(rotationDegrees.toDouble())); + } + } + } + + if (needCrop) { + canvas.translate(cropDx, cropDy); + } + canvas.drawImage(image, Offset.zero, Paint()); + final picture = recorder.endRecording(); + final renderSize = Size( + displayRegion.width.toDouble(), + displayRegion.height.toDouble(), + ); + image = await picture.toImage(renderSize.width.round(), renderSize.height.round()); + } + + // bytes should be compressed to be decodable on the platform side + return await image.toByteData(format: ui.ImageByteFormat.png).then((v) => v?.buffer.asUint8List()); + } +} diff --git a/lib/widgets/viewer/page_entry_builder.dart b/lib/widgets/viewer/page_entry_builder.dart new file mode 100644 index 0000000..b50c7fb --- /dev/null +++ b/lib/widgets/viewer/page_entry_builder.dart @@ -0,0 +1,34 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/multipage.dart'; +import 'package:aves/widgets/viewer/multipage/controller.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:flutter/widgets.dart'; + +class PageEntryBuilder extends StatelessWidget { + final MultiPageController? multiPageController; + final Widget Function(AvesEntry? pageEntry) builder; + + const PageEntryBuilder({ + super.key, + required this.multiPageController, + required this.builder, + }); + + @override + Widget build(BuildContext context) { + final controller = multiPageController; + return StreamBuilder<MultiPageInfo?>( + stream: controller != null ? controller.infoStream : Stream.value(null), + builder: (context, snapshot) { + final multiPageInfo = controller?.info; + return NullableValueListenableBuilder<int?>( + valueListenable: controller?.pageNotifier, + builder: (context, page, child) { + final pageEntry = multiPageInfo?.getPageEntryByIndex(page); + return builder(pageEntry); + }, + ); + }, + ); + } +} diff --git a/lib/widgets/viewer/panorama_page.dart b/lib/widgets/viewer/panorama_page.dart new file mode 100644 index 0000000..359e735 --- /dev/null +++ b/lib/widgets/viewer/panorama_page.dart @@ -0,0 +1,192 @@ +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/images.dart'; +import 'package:aves/model/media/panorama.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/extensions/media_query.dart'; +import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:panorama_viewer/panorama_viewer.dart'; +import 'package:provider/provider.dart'; + +class PanoramaPage extends StatefulWidget { + static const routeName = '/viewer/panorama'; + + final AvesEntry entry; + final PanoramaInfo info; + + const PanoramaPage({ + super.key, + required this.entry, + required this.info, + }); + + @override + State<PanoramaPage> createState() => _PanoramaPageState(); +} + +class _PanoramaPageState extends State<PanoramaPage> { + final ValueNotifier<bool> _overlayVisible = ValueNotifier(true); + final ValueNotifier<SensorControl> _sensorControl = ValueNotifier(SensorControl.none); + + AvesEntry get entry => widget.entry; + + PanoramaInfo get info => widget.info; + + static const _minZoom = .25; + + @override + void initState() { + super.initState(); + _overlayVisible.addListener(_onOverlayVisibleChanged); + WidgetsBinding.instance.addPostFrameCallback((_) => _initOverlay()); + } + + @override + void dispose() { + _overlayVisible.dispose(); + _sensorControl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return PopScope( + onPopInvokedWithResult: (didPop, result) => _onLeave(), + child: AvesScaffold( + body: Stack( + children: [ + ValueListenableBuilder<SensorControl>( + valueListenable: _sensorControl, + builder: (context, sensorControl, child) { + void onTap(longitude, latitude, tilt) => _overlayVisible.value = !_overlayVisible.value; + final imageChild = child as Image; + + if (info.hasCroppedArea) { + final croppedArea = info.croppedAreaRect!; + final fullSize = info.fullPanoSize!; + final longitude = ((croppedArea.left + croppedArea.width / 2) / fullSize.width - 1 / 2) * 360; + return PanoramaViewer( + longitude: longitude, + minZoom: _minZoom, + sensorControl: sensorControl, + croppedArea: croppedArea, + croppedFullWidth: fullSize.width, + croppedFullHeight: fullSize.height, + onTap: onTap, + child: imageChild, + ); + } else { + return PanoramaViewer( + minZoom: _minZoom, + sensorControl: sensorControl, + onTap: onTap, + child: imageChild, + ); + } + }, + child: Image( + image: entry.fullImage, + ), + ), + Positioned( + right: 0, + bottom: 0, + child: _buildOverlay(context), + ), + const TopGestureAreaProtector(), + const SideGestureAreaProtector(), + const BottomGestureAreaProtector(), + ], + ), + resizeToAvoidBottomInset: false, + ), + ); + } + + Widget _buildOverlay(BuildContext context) { + if (settings.useTvLayout) return const SizedBox(); + + return TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: ValueListenableBuilder<bool>( + valueListenable: _overlayVisible, + builder: (context, overlayVisible, child) { + return Visibility( + visible: overlayVisible, + child: Selector<MediaQueryData, double>( + selector: (context, mq) => max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom), + builder: (context, mqPaddingBottom, child) { + return SafeArea( + bottom: false, + child: Padding( + padding: const EdgeInsets.all(8) + EdgeInsets.only(bottom: mqPaddingBottom), + child: child, + ), + ); + }, + child: OverlayButton( + child: ValueListenableBuilder<SensorControl>( + valueListenable: _sensorControl, + builder: (context, sensorControl, child) { + return IconButton( + icon: Icon(sensorControl == SensorControl.none ? AIcons.sensorControlEnabled : AIcons.sensorControlDisabled), + onPressed: _toggleSensor, + tooltip: sensorControl == SensorControl.none + ? context.l10n.panoramaEnableSensorControl + : context.l10n.panoramaDisableSensorControl, + ); + }, + ), + ), + ), + ); + }, + ), + ); + } + + void _toggleSensor() { + switch (_sensorControl.value) { + case SensorControl.none: + _sensorControl.value = SensorControl.absoluteOrientation; + case SensorControl.absoluteOrientation: + case SensorControl.orientation: + _sensorControl.value = SensorControl.none; + } + } + + Future<void> _onLeave() async { + await AvesApp.showSystemUI(); + AvesApp.setSystemUIStyle(Theme.of(context)); + } + + // system UI + + // overlay + + Future<void> _initOverlay() async { + // wait for MaterialPageRoute.transitionDuration + // to show overlay after page animation is complete + await Future.delayed(ModalRoute.of(context)!.transitionDuration * timeDilation); + await _onOverlayVisibleChanged(); + } + + Future<void> _onOverlayVisibleChanged() async { + if (_overlayVisible.value) { + await AvesApp.showSystemUI(); + AvesApp.setSystemUIStyle(Theme.of(context)); + } else { + await AvesApp.hideSystemUI(); + } + } +} diff --git a/lib/widgets/viewer/providers.dart b/lib/widgets/viewer/providers.dart new file mode 100644 index 0000000..9f8f9af --- /dev/null +++ b/lib/widgets/viewer/providers.dart @@ -0,0 +1,41 @@ +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/widgets/viewer/multipage/conductor.dart'; +import 'package:aves/widgets/viewer/video/conductor.dart'; +import 'package:aves/widgets/viewer/view/conductor.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; + +class ViewStateConductorProvider extends ProxyProvider<MediaQueryData, ViewStateConductor> { + ViewStateConductorProvider({ + super.key, + super.child, + }) : super( + create: (context) => ViewStateConductor(), + update: (context, mq, value) { + value!.viewportSize = mq.size; + return value; + }, + dispose: (context, value) => value.dispose(), + ); +} + +class VideoConductorProvider extends Provider<VideoConductor> { + VideoConductorProvider({ + super.key, + CollectionLens? collection, + super.child, + }) : super( + create: (context) => VideoConductor(collection: collection), + dispose: (context, value) => value.dispose(), + ); +} + +class MultiPageConductorProvider extends Provider<MultiPageConductor> { + MultiPageConductorProvider({ + super.key, + super.child, + }) : super( + create: (context) => MultiPageConductor(), + dispose: (context, value) => value.dispose(), + ); +} diff --git a/lib/widgets/viewer/screen_saver_page.dart b/lib/widgets/viewer/screen_saver_page.dart new file mode 100644 index 0000000..90bc7fc --- /dev/null +++ b/lib/widgets/viewer/screen_saver_page.dart @@ -0,0 +1,132 @@ +import 'package:aves/model/filters/mime.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/viewer/controls/controller.dart'; +import 'package:aves/widgets/viewer/entry_viewer_stack.dart'; +import 'package:aves/widgets/viewer/providers.dart'; +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ScreenSaverPage extends StatefulWidget { + static const routeName = '/screen_saver'; + + final CollectionSource source; + + const ScreenSaverPage({ + super.key, + required this.source, + }); + + @override + State<ScreenSaverPage> createState() => _ScreenSaverPageState(); +} + +class _ScreenSaverPageState extends State<ScreenSaverPage> with WidgetsBindingObserver { + late final ViewerController _viewerController; + CollectionLens? _slideshowCollection; + + CollectionSource get source => widget.source; + + @override + void initState() { + super.initState(); + _viewerController = ViewerController( + initialScale: ScaleLevel(ref: settings.screenSaverFillScreen ? ScaleReference.covered : ScaleReference.contained), + transition: settings.screenSaverTransition, + repeat: true, + autopilot: true, + autopilotInterval: Duration(seconds: settings.screenSaverInterval), + autopilotAnimatedZoom: settings.screenSaverAnimatedZoomEffect, + ); + source.stateNotifier.addListener(_onSourceStateChanged); + _initSlideshowCollection(); + WidgetsBinding.instance.addObserver(this); + } + + @override + void dispose() { + source.stateNotifier.removeListener(_onSourceStateChanged); + _viewerController.dispose(); + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + _viewerController.autopilot = true; + } + } + + @override + Widget build(BuildContext context) { + Widget child; + + final collection = _slideshowCollection; + if (collection == null) { + child = const SizedBox(); + } else { + final entries = collection.sortedEntries; + if (entries.isEmpty) { + child = EmptyContent( + icon: AIcons.image, + text: context.l10n.collectionEmptyImages, + alignment: Alignment.center, + ); + } else { + child = MultiProvider( + providers: [ + ViewStateConductorProvider(), + VideoConductorProvider(), + MultiPageConductorProvider(), + ], + child: EntryViewerStack( + collection: collection, + initialEntry: entries.first, + viewerController: _viewerController, + ), + ); + } + } + + return AvesScaffold( + body: child, + ); + } + + void _onSourceStateChanged() { + if (_slideshowCollection == null) { + _initSlideshowCollection(); + if (_slideshowCollection != null) { + setState(() {}); + } + } + } + + void _initSlideshowCollection() { + if (!source.isReady || _slideshowCollection != null) return; + + final originalCollection = CollectionLens( + source: source, + filters: settings.screenSaverCollectionFilters, + ); + var entries = originalCollection.sortedEntries; + if (settings.screenSaverVideoPlayback == SlideshowVideoPlayback.skip) { + entries = entries.where((entry) => !MimeFilter.video.test(entry)).toList(); + } + entries.shuffle(); + _slideshowCollection = CollectionLens( + source: originalCollection.source, + listenToSource: false, + fixedSort: true, + fixedSelection: entries, + ); + } +} diff --git a/lib/widgets/viewer/slideshow_page.dart b/lib/widgets/viewer/slideshow_page.dart new file mode 100644 index 0000000..67ce7e9 --- /dev/null +++ b/lib/widgets/viewer/slideshow_page.dart @@ -0,0 +1,186 @@ +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/mime.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/settings/viewer/slideshow.dart'; +import 'package:aves/widgets/viewer/controls/controller.dart'; +import 'package:aves/widgets/viewer/entry_viewer_stack.dart'; +import 'package:aves/widgets/viewer/providers.dart'; +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class SlideshowPage extends StatefulWidget { + static const routeName = '/collection/slideshow'; + + final CollectionLens collection; + + const SlideshowPage({ + super.key, + required this.collection, + }); + + @override + State<SlideshowPage> createState() => _SlideshowPageState(); +} + +class _SlideshowPageState extends State<SlideshowPage> { + final ValueNotifier<AppMode> _appModeNotifier = ValueNotifier(AppMode.slideshow); + late ViewerController _viewerController; + late CollectionLens _slideshowCollection; + AvesEntry? _initialEntry; + + CollectionSource get source => widget.collection.source; + + @override + void initState() { + super.initState(); + _initViewerController(autopilot: true); + _initSlideshowCollection(); + _initialEntry = _slideshowCollection.sortedEntries.firstOrNull; + } + + @override + void dispose() { + _appModeNotifier.dispose(); + _disposeViewerController(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final initialEntry = _initialEntry; + return ListenableProvider<ValueNotifier<AppMode>>.value( + value: _appModeNotifier, + child: AvesScaffold( + body: initialEntry == null + ? EmptyContent( + icon: AIcons.image, + text: context.l10n.collectionEmptyImages, + alignment: Alignment.center, + ) + : MultiProvider( + providers: [ + ViewStateConductorProvider(), + VideoConductorProvider(), + MultiPageConductorProvider(), + ], + child: NotificationListener<SlideshowActionNotification>( + onNotification: (notification) { + _onActionSelected(notification.action); + return true; + }, + child: EntryViewerStack( + key: ValueKey(_viewerController), + collection: _slideshowCollection, + initialEntry: initialEntry, + viewerController: _viewerController, + ), + ), + ), + ), + ); + } + + void _initViewerController({required bool autopilot}) { + _viewerController = ViewerController( + initialScale: ScaleLevel(ref: settings.slideshowFillScreen ? ScaleReference.covered : ScaleReference.contained), + transition: settings.slideshowTransition, + repeat: settings.slideshowRepeat, + autopilot: autopilot, + autopilotInterval: Duration(seconds: settings.slideshowInterval), + autopilotAnimatedZoom: settings.slideshowAnimatedZoomEffect, + ); + } + + void _disposeViewerController() => _viewerController.dispose(); + + void _initSlideshowCollection() { + var entries = List.of(widget.collection.sortedEntries); + if (settings.slideshowVideoPlayback == SlideshowVideoPlayback.skip) { + entries = entries.where((entry) => !MimeFilter.video.test(entry)).toList(); + } + if (settings.slideshowShuffle) { + entries.shuffle(); + } + _slideshowCollection = CollectionLens( + source: source, + listenToSource: false, + fixedSort: true, + fixedSelection: entries, + ); + } + + void _onActionSelected(SlideshowAction action) { + switch (action) { + case SlideshowAction.resume: + _viewerController.autopilot = true; + case SlideshowAction.showInCollection: + _showInCollection(); + case SlideshowAction.cast: + // ignore, as it should be handled at the viewer level + break; + case SlideshowAction.settings: + _showSettings(context); + } + } + + void _showInCollection() { + final currentEntry = _viewerController.entryNotifier.value; + if (currentEntry == null) return; + + final album = currentEntry.directory; + final uri = currentEntry.uri; + + Navigator.maybeOf(context)?.pushAndRemoveUntil( + MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) => CollectionPage( + source: source, + filters: album != null ? {StoredAlbumFilter(album, source.getStoredAlbumDisplayName(context, album))} : null, + highlightTest: (entry) => entry.uri == uri, + ), + ), + (route) => false, + ); + } + + (bool, bool) get collectionSettings => (settings.slideshowShuffle, settings.slideshowVideoPlayback == SlideshowVideoPlayback.skip); + + Future<void> _showSettings(BuildContext context) async { + final oldCollectionSettings = collectionSettings; + final currentEntry = _viewerController.entryNotifier.value; + + await Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: ViewerSlideshowPage.routeName), + builder: (context) => const ViewerSlideshowPage(), + ), + ); + + _disposeViewerController(); + _initViewerController(autopilot: false); + if (oldCollectionSettings != collectionSettings) { + _initSlideshowCollection(); + } + final slideshowEntries = _slideshowCollection.sortedEntries; + _initialEntry = slideshowEntries.contains(currentEntry) ? currentEntry : slideshowEntries.firstOrNull; + setState(() {}); + } +} + +class SlideshowActionNotification extends Notification { + final SlideshowAction action; + + SlideshowActionNotification(this.action); +} diff --git a/lib/widgets/viewer/source_viewer_page.dart b/lib/widgets/viewer/source_viewer_page.dart new file mode 100644 index 0000000..a545eb2 --- /dev/null +++ b/lib/widgets/viewer/source_viewer_page.dart @@ -0,0 +1,70 @@ +import 'package:aves/widgets/common/aves_highlight.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_highlight/themes/darcula.dart'; + +class SourceViewerPage extends StatefulWidget { + static const routeName = '/viewer/source'; + + final Future<String> Function() loader; + + const SourceViewerPage({ + super.key, + required this.loader, + }); + + @override + State<SourceViewerPage> createState() => _SourceViewerPageState(); +} + +class _SourceViewerPageState extends State<SourceViewerPage> { + late Future<String> _loader; + + static const maxCodeSize = 2 << 16; // 128kB + + @override + void initState() { + super.initState(); + _loader = widget.loader(); + } + + @override + Widget build(BuildContext context) { + return AvesScaffold( + appBar: AppBar( + title: Text(context.l10n.sourceViewerPageTitle), + ), + body: SafeArea( + child: FutureBuilder<String>( + future: _loader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (!snapshot.hasData) return const SizedBox(); + + final data = snapshot.data!; + final source = data.length < maxCodeSize ? data : '${data.substring(0, maxCodeSize)}\n\n*** TRUNCATED ***'; + + return Container( + constraints: const BoxConstraints.expand(), + child: Scrollbar( + child: SingleChildScrollView( + child: AvesHighlightView( + input: source, + language: 'xml', + theme: darculaTheme, + padding: const EdgeInsets.all(8), + textStyle: const TextStyle( + fontSize: 10, + ), + tabSize: 4, + ), + ), + ), + ); + }, + ), + ), + ); + } +} diff --git a/lib/widgets/viewer/video/conductor.dart b/lib/widgets/viewer/video/conductor.dart new file mode 100644 index 0000000..de8e200 --- /dev/null +++ b/lib/widgets/viewer/video/conductor.dart @@ -0,0 +1,136 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/viewer/video/db_playback_state_handler.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +// ✅ NEW: Remote origin costante +import 'package:aves/remote/remote_origin.dart'; + +class VideoConductor { + final CollectionLens? _collection; + final List<AvesVideoController> _controllers = []; + final Map<AvesVideoController, StreamSubscription> _subscriptions = {}; + final PlaybackStateHandler _playbackStateHandler = DatabasePlaybackStateHandler(); + + final ValueNotifier<AvesVideoController?> playingVideoControllerNotifier = ValueNotifier(null); + + static const _defaultMaxControllerCount = 3; + + // ⬇️ NUOVO: factory remota (per origin==RemoteOrigin.value) + AvesVideoControllerFactory? _remoteFactory; + + VideoConductor({CollectionLens? collection}) : _collection = collection { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$VideoConductor', + object: this, + ); + } + } + + // ⬇️ NUOVO: registrazione factory remota + void registerRemoteFactory(AvesVideoControllerFactory factory) { + _remoteFactory = factory..init(); + } + + Future<void> dispose() async { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + await _disposeAll(); + playingVideoControllerNotifier.dispose(); + _controllers.clear(); + if (settings.keepScreenOn == KeepScreenOn.videoPlayback) { + await windowService.keepScreenOn(false); + } + } + + Future<AvesVideoController> getOrCreateController(AvesEntry entry, {int? maxControllerCount}) async { + var controller = getController(entry); + if (controller != null) { + _controllers.remove(controller); + } else { + maxControllerCount = max(_defaultMaxControllerCount, maxControllerCount ?? 0); + while (_controllers.length >= maxControllerCount) { + await _disposeController(_controllers.removeLast()); + } + await deviceService.requestGarbageCollection(); + + // ⬇️ NUOVO: se REMOTO (origin==RemoteOrigin.value) e ho la factory registrata, uso quella; + // altrimenti uso la factory "stock" globale (videoControllerFactory). + final builder = (entry.origin == RemoteOrigin.value && _remoteFactory != null) + ? _remoteFactory! + : videoControllerFactory; + + controller = builder.buildController( + entry, + playbackStateHandler: _playbackStateHandler, + settings: settings, + ); + + _subscriptions[controller] = + controller.statusStream.listen((event) => _onControllerStatusChanged(entry, controller!, event)); + } + _controllers.insert(0, controller); + return controller; + } + + AvesVideoController? getPlayingController() => _controllers.firstWhereOrNull((c) => c.isPlaying); + + AvesVideoController? getController(AvesEntry entry) { + // 🔒 Robusto anche per remoti: confronta (id, pageId) + return _controllers.firstWhereOrNull( + (c) => c.entry.id == entry.id && c.entry.pageId == entry.pageId, + ); + } + + Future<void> _onControllerStatusChanged(AvesEntry entry, AvesVideoController controller, VideoStatus status) async { + bool canSkipToNext = false, canSkipToPrevious = false; + final entries = _collection?.sortedEntries; + if (entries != null) { + final currentIndex = entries.indexOf(entry); + if (currentIndex != -1) { + bool isVideo(AvesEntry entry) => entry.isVideo; + canSkipToPrevious = entries.take(currentIndex).lastWhereOrNull(isVideo) != null; + canSkipToNext = entries.skip(currentIndex + 1).firstWhereOrNull(isVideo) != null; + } + } + + await mediaSessionService.update( + entry: entry, + controller: controller, + canSkipToNext: canSkipToNext, + canSkipToPrevious: canSkipToPrevious, + ); + if (settings.keepScreenOn == KeepScreenOn.videoPlayback) { + await windowService.keepScreenOn(status == VideoStatus.playing); + } + + playingVideoControllerNotifier.value = getPlayingController(); + } + + Future<void> _applyToAll(Future Function(AvesVideoController controller) action) => + Future.forEach<AvesVideoController>(_controllers, action); + + Future<void> _disposeAll() => _applyToAll(_disposeController); + + Future<void> pauseAll() => _applyToAll((controller) => controller.pause()); + + Future<void> muteAll(bool muted) => _applyToAll((controller) => controller.mute(muted)); + + Future<void> _disposeController(AvesVideoController controller) async { + await _subscriptions.remove(controller)?.cancel(); + await controller.dispose(); + } +} diff --git a/lib/widgets/viewer/video/db_playback_state_handler.dart b/lib/widgets/viewer/video/db_playback_state_handler.dart new file mode 100644 index 0000000..7c44c65 --- /dev/null +++ b/lib/widgets/viewer/video/db_playback_state_handler.dart @@ -0,0 +1,56 @@ +import 'dart:async'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/viewer/video_playback.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/format.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:flutter/material.dart'; + +class DatabasePlaybackStateHandler extends PlaybackStateHandler { + static const resumeTimeSaveMinProgress = .05; + static const resumeTimeSaveMaxProgress = .95; + + @override + Future<int?> getResumeTime({required int entryId, required BuildContext context}) async { + final playback = await localMediaDb.loadVideoPlayback(entryId); + final resumeTime = playback?.resumeTimeMillis ?? 0; + if (resumeTime == 0) return null; + + // clear on retrieval + await localMediaDb.removeVideoPlayback({entryId}); + + switch (settings.videoResumptionMode) { + case VideoResumptionMode.never: + return 0; + case VideoResumptionMode.ask: + final l10n = context.l10n; + final resume = await showConfirmationDialog( + context: context, + message: l10n.videoResumeDialogMessage(formatFriendlyDuration(Duration(milliseconds: resumeTime))), + ok: l10n.videoResumeButtonLabel, + cancel: l10n.videoStartOverButtonLabel, + ); + return resume ? resumeTime : 0; + case VideoResumptionMode.always: + return resumeTime; + } + } + + @override + Future<void> saveResumeTime({required int entryId, required int position, required double progress}) async { + if (resumeTimeSaveMinProgress < progress && progress < resumeTimeSaveMaxProgress) { + await localMediaDb.addVideoPlayback({ + VideoPlaybackRow( + entryId: entryId, + resumeTimeMillis: position, + ), + }); + } else { + await localMediaDb.removeVideoPlayback({entryId}); + } + } +} diff --git a/lib/widgets/viewer/video/remote_video_factory.dart b/lib/widgets/viewer/video/remote_video_factory.dart new file mode 100644 index 0000000..c962702 --- /dev/null +++ b/lib/widgets/viewer/video/remote_video_factory.dart @@ -0,0 +1,31 @@ +import 'package:aves/remote/remote_http.dart'; +import 'package:aves/model/entry/entry.dart'; // AvesEntry concreto (path/remotePath) +import 'package:aves_model/aves_model.dart'; // ✅ espone AvesEntryBase +import 'package:aves_video/aves_video.dart'; + +class RemoteVideoControllerFactory implements AvesVideoControllerFactory { + @override + void init() { + // opzionale (warm-up o logging) + } + + @override + AvesVideoController buildController( + AvesEntryBase entry, { + required PlaybackStateHandler playbackStateHandler, + required VideoSettings settings, + }) { + // Nel tuo app layer l’entry è AvesEntry concreto (per path/remotePath) + final e = entry as AvesEntry; + final url = RemoteHttp.absUrl(e.remotePath ?? e.path); + + return RemoteNetworkVideoController( + entry, + url: url, + // se la cache non è popolata, il controller farà RemoteHttp.headers() + httpHeaders: RemoteHttp.peekHeaders(), + playbackStateHandler: playbackStateHandler, + settings: settings, + ); + } +} diff --git a/lib/widgets/viewer/view/conductor.dart b/lib/widgets/viewer/view/conductor.dart new file mode 100644 index 0000000..0917c34 --- /dev/null +++ b/lib/widgets/viewer/view/conductor.dart @@ -0,0 +1,89 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/viewer/view_state.dart'; +import 'package:aves/widgets/viewer/view/controller.dart'; +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/rendering.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +class ViewStateConductor { + final List<ViewStateController> _controllers = []; + Size _viewportSize = Size.zero; + + static const maxControllerCount = 3; + + ViewStateConductor() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$ViewStateConductor', + object: this, + ); + } + } + + Future<void> dispose() async { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + _controllers.forEach((v) => v.dispose()); + _controllers.clear(); + } + + set viewportSize(Size size) => _viewportSize = size; + + ViewStateController getOrCreateController(AvesEntry entry) { + // Identificazione robusta anche per remoti (uri può essere null): + // usa SEMPRE (id, pageId) come chiave logica del controller. + var controller = getController(entry); + if (controller != null) { + _controllers.remove(controller); + } else { + // inizializza lo stato per combaciare lo stato iniziale del magnifier + const initialScale = ScaleLevel(ref: ScaleReference.contained); + final initialValue = ViewState( + position: Offset.zero, + scale: ScaleBoundaries( + allowOriginalScaleBeyondRange: true, + minScale: initialScale, + maxScale: initialScale, + initialScale: initialScale, + viewportSize: _viewportSize, + contentSize: entry.displaySize, + ).initialScale, + viewportSize: _viewportSize, + contentSize: entry.displaySize, + ); + controller = ViewStateController( + entry: entry, + viewStateNotifier: ValueNotifier<ViewState>(initialValue), + ); + } + _controllers.insert(0, controller); + while (_controllers.length > maxControllerCount) { + _controllers.removeLast().dispose(); + } + return controller; + } + + ViewStateController? getController(AvesEntry entry) { + // Confronto per (id, pageId) invece di (uri, pageId) + return _controllers.firstWhereOrNull( + (c) => c.entry.id == entry.id && c.entry.pageId == entry.pageId, + ); + } + + void reset(AvesEntry entry) { + // Reset per id (gli uri remoti possono essere null, quindi non affidabili) + final ids = <int>{ + entry.id, + ...?entry.stackedEntries?.map((e) => e.id), + }; + final entryControllers = _controllers.where((v) => ids.contains(v.entry.id)).toSet(); + entryControllers.forEach((controller) { + _controllers.remove(controller); + controller.dispose(); + }); + } +} diff --git a/lib/widgets/viewer/view/controller.dart b/lib/widgets/viewer/view/controller.dart new file mode 100644 index 0000000..ca487ba --- /dev/null +++ b/lib/widgets/viewer/view/controller.dart @@ -0,0 +1,35 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/viewer/view_state.dart'; +import 'package:aves/widgets/viewer/view/histogram.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +class ViewStateController with HistogramMixin { + final AvesEntry entry; + final ValueNotifier<ViewState> viewStateNotifier; + final ValueNotifier<ImageProvider?> fullImageNotifier = ValueNotifier(null); + + ViewState get viewState => viewStateNotifier.value; + + ViewStateController({ + required this.entry, + required this.viewStateNotifier, + }) { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$ViewStateController', + object: this, + ); + } + } + + void dispose() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + viewStateNotifier.dispose(); + fullImageNotifier.dispose(); + } +} diff --git a/lib/widgets/viewer/view/histogram.dart b/lib/widgets/viewer/view/histogram.dart new file mode 100644 index 0000000..b25451b --- /dev/null +++ b/lib/widgets/viewer/view/histogram.dart @@ -0,0 +1,97 @@ +import 'dart:async'; +import 'dart:ui'; + +import 'package:aves/model/settings/settings.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +enum HistogramChannel { red, green, blue, luminance } + +typedef HistogramLevels = Map<HistogramChannel, List<double>>; + +mixin HistogramMixin { + HistogramLevels _levels = {}; + Future<void>? _loader; + + static const int bins = 256; + + Future<HistogramLevels> getHistogramLevels(ImageInfo info, bool forceUpdate) async { + if (_levels.isEmpty || forceUpdate) { + _loader ??= _getLevels(info); + await _loader; + _loader = null; + } + return _levels; + } + + Future<void> _getLevels(ImageInfo info) async { + final data = (await info.image.toByteData(format: ImageByteFormat.rawStraightRgba))!; + _levels = switch (settings.overlayHistogramStyle) { + OverlayHistogramStyle.rgb => await compute<ByteData, HistogramLevels>(_computeRgbLevels, data), + OverlayHistogramStyle.luminance => await compute<ByteData, HistogramLevels>(_computeLuminanceLevels, data), + _ => <HistogramChannel, List<double>>{}, + }; + } + + static HistogramLevels _computeRgbLevels(ByteData data) { + final redLevels = List.filled(bins, 0); + final greenLevels = List.filled(bins, 0); + final blueLevels = List.filled(bins, 0); + + final view = Uint8List.view(data.buffer); + final viewSize = view.length; + for (var i = 0; i < viewSize; i += 4) { + final a = view[i + 3]; + if (a > 0) { + redLevels[view[i + 0]]++; + greenLevels[view[i + 1]]++; + blueLevels[view[i + 2]]++; + } + } + + final max = [ + redLevels.max, + greenLevels.max, + blueLevels.max, + ].max; + if (max == 0) return {}; + + final f = 1.0 / max; + return { + HistogramChannel.red: redLevels.map((v) => v * f).toList(), + HistogramChannel.green: greenLevels.map((v) => v * f).toList(), + HistogramChannel.blue: blueLevels.map((v) => v * f).toList(), + }; + } + + static HistogramLevels _computeLuminanceLevels(ByteData data) { + final lumLevels = List.filled(bins, 0); + const normMax = bins - 1; + + final view = Uint8List.view(data.buffer); + final viewSize = view.length; + for (var i = 0; i < viewSize; i += 4) { + final a = view[i + 3]; + if (a > 0) { + final r = view[i + 0]; + final g = view[i + 1]; + final b = view[i + 2]; + // `Color.computeLuminance()` is more accurate, but slower + // and photo software typically use the simpler formula + final l = ColorUtils.luma(r, g, b); + lumLevels[(l * normMax).round()]++; + } + } + + final max = lumLevels.max; + if (max == 0) return {}; + + final f = 1.0 / max; + return { + HistogramChannel.luminance: lumLevels.map((v) => v * f).toList(), + }; + } +} diff --git a/lib/widgets/viewer/visual/controller_mixin.dart b/lib/widgets/viewer/visual/controller_mixin.dart new file mode 100644 index 0000000..be4e91b --- /dev/null +++ b/lib/widgets/viewer/visual/controller_mixin.dart @@ -0,0 +1,276 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/device.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/viewer/multipage/conductor.dart'; +import 'package:aves/widgets/viewer/multipage/controller.dart'; +import 'package:aves/widgets/viewer/video/conductor.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:collection/collection.dart'; +import 'package:floating/floating.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; + +// state controllers/monitors +mixin EntryViewControllerMixin<T extends StatefulWidget> on State<T> { + final Map<AvesEntry, VoidCallback> _metadataChangeListeners = {}; + final Map<MultiPageController, Future<void> Function()> _multiPageControllerPageListeners = {}; + + bool? videoMutedOverride; + + bool get isViewingImage; + + ValueNotifier<AvesEntry?> get entryNotifier; + + Future<void> initEntryControllers(AvesEntry? entry) async { + if (!mounted || entry == null) return; + + if (entry.isVideo) { + await _initVideoController(entry); + } + if (entry.isMultiPage) { + await _initMultiPageController(entry); + } + void listener() => _onMetadataChanged(entry); + _metadataChangeListeners[entry] = listener; + entry.metadataChangeNotifier.addListener(listener); + } + + void cleanEntryControllers(AvesEntry? entry) { + if (entry == null) return; + + final listener = _metadataChangeListeners.remove(entry); + if (listener != null) { + entry.metadataChangeNotifier.removeListener(listener); + } + if (entry.isMultiPage) { + _cleanMultiPageController(entry); + } + } + + void _onMetadataChanged(AvesEntry entry) { + debugPrint('reinitialize controllers for entry=$entry because metadata changed'); + cleanEntryControllers(entry); + initEntryControllers(entry); + } + + SlideshowVideoPlayback? get videoPlaybackOverride { + if (!mounted) return null; + final appMode = context.read<ValueNotifier<AppMode>>().value; + switch (appMode) { + case AppMode.screenSaver: + return settings.screenSaverVideoPlayback; + case AppMode.slideshow: + return settings.slideshowVideoPlayback; + default: + return null; + } + } + + bool get videoAutoPlayEnabled { + if (!isViewingImage) return false; + + switch (videoPlaybackOverride) { + case SlideshowVideoPlayback.skip: + return false; + case SlideshowVideoPlayback.playMuted: + case SlideshowVideoPlayback.playWithSound: + return true; + case null: + break; + } + + switch (settings.videoAutoPlayMode) { + case VideoAutoPlayMode.disabled: + return false; + case VideoAutoPlayMode.playMuted: + case VideoAutoPlayMode.playWithSound: + return true; + } + } + + bool get shouldAutoPlayVideoMuted { + if (videoMutedOverride != null) { + return videoMutedOverride!; + } + + switch (videoPlaybackOverride) { + case SlideshowVideoPlayback.skip: + case SlideshowVideoPlayback.playWithSound: + return false; + case SlideshowVideoPlayback.playMuted: + return true; + case null: + break; + } + + switch (settings.videoAutoPlayMode) { + case VideoAutoPlayMode.disabled: + case VideoAutoPlayMode.playWithSound: + return false; + case VideoAutoPlayMode.playMuted: + return true; + } + } + + bool get shouldAutoPlayMotionPhoto { + if (!isViewingImage) return false; + + return settings.enableMotionPhotoAutoPlay; + } + + Future<void> _initVideoController(AvesEntry entry) async { + final controller = await context.read<VideoConductor>().getOrCreateController(entry); + setState(() {}); + + if (videoAutoPlayEnabled || entry.isAnimated) { + final resumeTimeMillis = await controller.getResumeTime(context); + await _autoPlayVideo(controller, () => entry == entryNotifier.value, resumeTimeMillis: resumeTimeMillis); + } + } + + Future<void> _initMultiPageController(AvesEntry entry) async { + if (!mounted) return; + + final multiPageController = context.read<MultiPageConductor>().getOrCreateController(entry); + setState(() {}); + + final multiPageInfo = multiPageController.info ?? await multiPageController.infoStream.first; + assert(multiPageInfo != null); + if (multiPageInfo == null) return; + + if (entry.isMotionPhoto) { + await multiPageInfo.extractMotionPhotoVideo(); + } + + final videoPageEntries = multiPageInfo.videoPageEntries; + if (videoPageEntries.isNotEmpty) { + // init video controllers for all pages that could need it + final videoConductor = context.read<VideoConductor>(); + await Future.forEach(videoPageEntries, (entry) async { + await videoConductor.getOrCreateController(entry, maxControllerCount: videoPageEntries.length); + }); + + // auto play/pause when changing page + Future<void> _onPageChanged() async { + await pauseVideoControllers(); + if (videoAutoPlayEnabled || (entry.isMotionPhoto && shouldAutoPlayMotionPhoto)) { + final page = multiPageController.page; + final pageInfo = multiPageInfo.getByIndex(page)!; + if (pageInfo.isVideo) { + final pageEntry = multiPageInfo.getPageEntryByIndex(page); + final pageVideoController = videoConductor.getController(pageEntry); + assert(pageVideoController != null); + if (pageVideoController != null) { + await _autoPlayVideo(pageVideoController, () => entry == entryNotifier.value && page == multiPageController.page); + } + } + } + } + + _multiPageControllerPageListeners[multiPageController] = _onPageChanged; + multiPageController.pageNotifier.addListener(_onPageChanged); + await _onPageChanged(); + + if (entry.isMotionPhoto && shouldAutoPlayMotionPhoto) { + await Future.delayed(ADurations.motionPhotoAutoPlayDelay); + if (entry == entryNotifier.value) { + multiPageController.page = 1; + } + } + } + } + + Future<void> _cleanMultiPageController(AvesEntry entry) async { + final multiPageController = _multiPageControllerPageListeners.keys.firstWhereOrNull((v) => v.entry == entry); + if (multiPageController != null) { + final _onPageChange = _multiPageControllerPageListeners.remove(multiPageController); + if (_onPageChange != null) { + multiPageController.pageNotifier.removeListener(_onPageChange); + } + } + } + + Future<void> _autoPlayVideo(AvesVideoController videoController, bool Function() isCurrent, {int? resumeTimeMillis}) async { + // video decoding may fail or have initial artifacts when the player initializes + // during this widget initialization (because of the page transition and hero animation?) + // so we play after a delay for increased stability + await Future.delayed(const Duration(milliseconds: 300) * timeDilation); + + if (!videoController.isMuted && (videoController.entry.isAnimated || shouldAutoPlayVideoMuted)) { + await videoController.mute(true); + } + + if (resumeTimeMillis != null) { + await videoController.seekTo(resumeTimeMillis); + } + await videoController.play(); + + // playing controllers are paused when the entry changes, + // but the controller may still be preparing (not yet playing) when this happens + // so we make sure the current entry is still the same to keep playing + if (!isCurrent()) { + await videoController.pause(); + } + } + + Future<void> pauseVideoControllers() => context.read<VideoConductor>().pauseAll(); + + static const _pipRatioMax = Rational(43, 18); + static const _pipRatioMin = Rational(18, 43); + + Future<void> updatePictureInPicture(BuildContext context) async { + if (!device.supportPictureInPicture) return; + + if (context.mounted && settings.videoBackgroundMode == VideoBackgroundMode.pip) { + final playingController = context.read<VideoConductor>().getPlayingController(); + if (playingController != null) { + final entrySize = playingController.entry.displaySize; + final entryAspectRatio = entrySize.aspectRatio; + final Rational pipAspectRatio; + if (entryAspectRatio > _pipRatioMax.aspectRatio) { + pipAspectRatio = _pipRatioMax; + } else if (entryAspectRatio < _pipRatioMin.aspectRatio) { + pipAspectRatio = _pipRatioMin; + } else { + pipAspectRatio = Rational(entrySize.width.round(), entrySize.height.round()); + } + + final viewSize = MediaQuery.sizeOf(context) * MediaQuery.devicePixelRatioOf(context); + final fittedSize = applyBoxFit(BoxFit.contain, entrySize, viewSize).destination; + final sourceRectHint = Rectangle<int>( + ((viewSize.width - fittedSize.width) / 2).round(), + ((viewSize.height - fittedSize.height) / 2).round(), + fittedSize.width.round(), + fittedSize.height.round(), + ); + + try { + final status = await Floating().enable( + OnLeavePiP( + aspectRatio: pipAspectRatio, + sourceRectHint: sourceRectHint, + ), + ); + debugPrint('Enabled picture-in-picture with status=$status'); + return; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } + } + + debugPrint('Cancelling picture-in-picture'); + await Floating().cancelOnLeavePiP(); + } +} diff --git a/lib/widgets/viewer/visual/entry_page_view.dart b/lib/widgets/viewer/visual/entry_page_view.dart new file mode 100644 index 0000000..78bf23e --- /dev/null +++ b/lib/widgets/viewer/visual/entry_page_view.dart @@ -0,0 +1,590 @@ +// lib/widgets/viewer/visual/entry_page_view.dart +import 'dart:async'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/settings/enums/widget_outline.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/viewer/view_state.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/media/media_session_service.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/view/view.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/home_widget.dart'; +import 'package:aves/widgets/viewer/controls/controller.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves/widgets/viewer/hero.dart'; +import 'package:aves/widgets/viewer/video/conductor.dart'; +import 'package:aves/widgets/viewer/view/conductor.dart'; +import 'package:aves/widgets/viewer/visual/error.dart'; +import 'package:aves/widgets/viewer/visual/raster.dart'; +import 'package:aves/widgets/viewer/visual/vector.dart'; +import 'package:aves/widgets/viewer/visual/video/cover.dart'; +import 'package:aves/widgets/viewer/visual/video/subtitle/subtitle.dart'; +import 'package:aves/widgets/viewer/visual/video/swipe_action.dart'; +import 'package:aves/widgets/viewer/visual/video/video_view.dart'; +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:decorated_icon/decorated_icon.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +// Factory remota per controller video unificato (remoti + locali tramite Conductor) +import 'package:aves/widgets/viewer/video/remote_video_factory.dart'; + +// ✅ NEW: Remote origin costante +import 'package:aves/remote/remote_origin.dart'; + +class EntryPageView extends StatefulWidget { + final AvesEntry mainEntry, pageEntry; + final ViewerController viewerController; + final VoidCallback? onDisposed; + + static const decorationCheckSize = 20.0; + static const rasterMaxScale = ScaleLevel(factor: 5); + static const vectorMaxScale = ScaleLevel(factor: 25); + + const EntryPageView({ + super.key, + required this.mainEntry, + required this.pageEntry, + required this.viewerController, + this.onDisposed, + }); + + @override + State<EntryPageView> createState() => _EntryPageViewState(); +} + +class _EntryPageViewState extends State<EntryPageView> with TickerProviderStateMixin { + late ValueNotifier<ViewState> _viewStateNotifier; + late AvesMagnifierController _magnifierController; + final Set<StreamSubscription> _subscriptions = {}; + final ValueNotifier<Widget?> _actionFeedbackChildNotifier = ValueNotifier(null); + OverlayEntry? _actionFeedbackOverlayEntry; + + AvesEntry get mainEntry => widget.mainEntry; + AvesEntry get entry => widget.pageEntry; + ViewerController get viewerController => widget.viewerController; + + bool get _isRemote => entry.origin == RemoteOrigin.value; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant EntryPageView oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.pageEntry != widget.pageEntry) { + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + } + + @override + void dispose() { + _unregisterWidget(widget); + widget.onDisposed?.call(); + _actionFeedbackChildNotifier.dispose(); + super.dispose(); + } + + void _registerWidget(EntryPageView widget) { + final entry = widget.pageEntry; + _viewStateNotifier = context.read<ViewStateConductor>().getOrCreateController(entry).viewStateNotifier; + _magnifierController = AvesMagnifierController(); + _subscriptions.add(_magnifierController.stateStream.listen(_onViewStateChanged)); + _subscriptions.add(_magnifierController.scaleBoundariesStream.listen(_onViewScaleBoundariesChanged)); + if (entry.isVideo) { + _subscriptions.add(mediaSessionService.mediaCommands.listen(_onMediaCommand)); + } + + // idempotente + context.read<VideoConductor>().registerRemoteFactory(RemoteVideoControllerFactory()); + + viewerController.startAutopilotAnimation( + vsync: this, + onUpdate: ({required scaleLevel}) { + final boundaries = _magnifierController.scaleBoundaries; + if (boundaries != null) { + final scale = boundaries.scaleForLevel(scaleLevel); + _magnifierController.update(scale: scale, source: ChangeSource.animation); + } + }, + ); + } + + void _unregisterWidget(EntryPageView oldWidget) { + viewerController.stopAutopilotAnimation(vsync: this); + _magnifierController.dispose(); + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + @override + Widget build(BuildContext context) { + Widget child = AnimatedBuilder( + animation: entry.visualChangeNotifier, + builder: (context, child) { + Widget? child; + + // Pipeline unificata: + // - SVG → _buildSvgView() + // - Video → _buildVideoView() + // - Raster (locali + remoti) → _buildRasterView() + if (entry.isSvg) { + child = _buildSvgView(); + } else if (!entry.displaySize.isEmpty) { + if (entry.isVideo) { + child = _buildVideoView(); + } else if (entry.isDecodingSupported || _isRemote) { + child = _buildRasterView(); + } + } + + child ??= ErrorView( + entry: entry, + onTap: _onTap, + ); + return child; + }, + ); + + if (!settings.viewerUseCutout) { + child = SafeCutoutArea( + child: ClipRect(child: child), + ); + } + + final animate = context.select<Settings, bool>((v) => v.animate); + if (animate) { + child = Consumer<EntryHeroInfo?>( + builder: (context, info, child) => Hero( + tag: info != null && info.entry == mainEntry ? info.tag : hashCode, + transitionOnUserGestures: true, + child: child!, + ), + child: child, + ); + } + + return child; + } + + // RASTER (locali + remoti) + Widget _buildRasterView() { + return _buildMagnifier( + applyScale: false, + child: RasterImageView( + entry: entry, + viewStateNotifier: _viewStateNotifier, + errorBuilder: (context, error, stackTrace) => ErrorView( + entry: entry, + onTap: _onTap, + ), + ), + ); + } + + Widget _buildSvgView() { + return _buildMagnifier( + maxScale: EntryPageView.vectorMaxScale, + scaleStateCycle: _vectorScaleStateCycle, + applyScale: false, + child: VectorImageView( + entry: entry, + viewStateNotifier: _viewStateNotifier, + errorBuilder: (context, error, stackTrace) => ErrorView( + entry: entry, + onTap: _onTap, + ), + ), + ); + } + + // === Helper: frame Magnifier per i VIDEO senza doppio SAR === + // - Remoto: usa remoteWidth/remoteHeight, swap se remoteRotation=90/270, NO SAR. + // - Locale: usa il calcolo stock (applica SAR tramite entry.videoDisplaySize). + Size _videoFrameSize(double? sar) { + if (_isRemote) { + double w = (entry.remoteWidth ?? entry.width).toDouble(); + double h = (entry.remoteHeight ?? entry.height).toDouble(); + final rot90 = ((entry.remoteRotation ?? 0) % 180) == 90; + if (rot90) { + final t = w; + w = h; + h = t; + } + if (w <= 0 || h <= 0) { + final ds = entry.displaySize; + if (!ds.isEmpty) return ds; + return const Size(1920, 1080); // fallback prudente + } + return Size(w, h); + } + // Locali: logica stock Aves (SAR incluso) + return entry.videoDisplaySize(sar); + } + + Widget _buildVideoView() { + final videoController = context.read<VideoConductor>().getController(entry); + if (videoController == null) return const SizedBox(); + + return ValueListenableBuilder<double?>( + valueListenable: videoController.sarNotifier, + builder: (context, sar, child) { + // REMOTE: evita doppio SAR nel frame; VideoView applicherà il SAR internamente + final videoDisplaySize = _videoFrameSize(sar); + final isPureVideo = entry.isPureVideo; + + return Selector<Settings, (bool, bool, bool)>( + selector: (context, s) => ( + isPureVideo && s.videoGestureDoubleTapTogglePlay, + isPureVideo && s.videoGestureSideDoubleTapSeek, + isPureVideo && s.videoGestureVerticalDragBrightnessVolume, + ), + builder: (context, s, child) { + final (playGesture, seekGesture, useVerticalDragGesture) = s; + final useTapGesture = playGesture || seekGesture; + + MagnifierDoubleTapCallback? onDoubleTap; + MagnifierGestureScaleStartCallback? onScaleStart; + MagnifierGestureScaleUpdateCallback? onScaleUpdate; + MagnifierGestureScaleEndCallback? onScaleEnd; + + if (useTapGesture) { + void _applyAction(EntryAction action, {IconData? Function()? icon}) { + _actionFeedbackChildNotifier.value = DecoratedIcon( + icon?.call() ?? action.getIconData(), + size: 48, + color: Colors.white, + shadows: const [Shadow(color: Colors.black, blurRadius: 4)], + ); + VideoActionNotification( + controller: videoController, + entry: entry, + action: action, + ).dispatch(context); + } + + onDoubleTap = (alignment) { + final x = alignment.x; + if (seekGesture) { + final sideRatio = _getSideRatio(); + if (sideRatio != null) { + if (x < sideRatio) { + _applyAction(EntryAction.videoReplay10); + return true; + } else if (x > 1 - sideRatio) { + _applyAction(EntryAction.videoSkip10); + return true; + } + } + } + if (playGesture) { + _applyAction( + EntryAction.videoTogglePlay, + icon: () => videoController.isPlaying ? AIcons.pause : AIcons.play, + ); + return true; + } + return false; + }; + } + + if (useVerticalDragGesture) { + SwipeAction? swipeAction; + var move = Offset.zero; + var dropped = false; + double? startValue; + ValueNotifier<double?>? valueNotifier; + + onScaleStart = (details, doubleTap, boundaries) { + dropped = details.pointerCount > 1 || doubleTap; + if (dropped) return; + + startValue = null; + valueNotifier = ValueNotifier<double?>(null); + final alignmentX = details.focalPoint.dx / boundaries.viewportSize.width; + final action = alignmentX > .5 ? SwipeAction.volume : SwipeAction.brightness; + action.get().then((v) => startValue = v); + swipeAction = action; + move = Offset.zero; + _actionFeedbackOverlayEntry = OverlayEntry( + builder: (context) => SwipeActionFeedback( + action: action, + valueNotifier: valueNotifier!, + ), + ); + Overlay.of(context).insert(_actionFeedbackOverlayEntry!); + }; + onScaleUpdate = (details) { + if (valueNotifier == null) return false; + + move += details.focalPointDelta; + dropped |= details.pointerCount > 1; + if (valueNotifier!.value == null) { + dropped |= MagnifierGestureRecognizer.isXPan(move); + } + if (dropped) return false; + + final _startValue = startValue; + if (_startValue != null) { + final double value = (_startValue - move.dy / SwipeActionFeedback.height).clamp(0, 1); + valueNotifier!.value = value; + swipeAction?.set(value); + } + return true; + }; + onScaleEnd = (details) { + valueNotifier?.dispose(); + + _actionFeedbackOverlayEntry + ?..remove() + ..dispose(); + _actionFeedbackOverlayEntry = null; + }; + } + + Widget videoChild = Stack( + children: [ + _buildMagnifier( + displaySize: videoDisplaySize, + onScaleStart: onScaleStart, + onScaleUpdate: onScaleUpdate, + onScaleEnd: onScaleEnd, + onDoubleTap: onDoubleTap, + child: VideoView( + entry: entry, + controller: videoController, + ), + ), + VideoSubtitles( + entry: entry, + controller: videoController, + viewStateNotifier: _viewStateNotifier, + ), + if (useTapGesture) + ValueListenableBuilder<Widget?>( + valueListenable: _actionFeedbackChildNotifier, + builder: (context, feedbackChild, child) => ActionFeedback( + child: feedbackChild, + ), + ), + ], + ); + if (useVerticalDragGesture) { + final scope = MagnifierGestureDetectorScope.maybeOf(context); + if (scope != null) { + videoChild = scope.copyWith( + acceptPointerEvent: MagnifierGestureRecognizer.isYPan, + child: videoChild, + ); + } + } + return Stack( + fit: StackFit.expand, + children: [ + videoChild, + VideoCover( + mainEntry: mainEntry, + pageEntry: entry, + magnifierController: _magnifierController, + videoController: videoController, + videoDisplaySize: videoDisplaySize, + onTap: _onTap, + magnifierBuilder: (coverController, coverSize, videoCoverUriImage) => _buildMagnifier( + controller: coverController, + displaySize: coverSize, + onDoubleTap: onDoubleTap, + child: Image(image: videoCoverUriImage), + ), + ), + ], + ); + }, + ); + }, + ); + } + + /// Wrapper del Magnifier con bound **remote‑friendly** + Widget _buildMagnifier({ + AvesMagnifierController? controller, + Size? displaySize, + ScaleLevel maxScale = EntryPageView.rasterMaxScale, + ScaleStateCycle scaleStateCycle = defaultScaleStateCycle, + bool applyScale = true, + MagnifierGestureScaleStartCallback? onScaleStart, + MagnifierGestureScaleUpdateCallback? onScaleUpdate, + MagnifierGestureScaleEndCallback? onScaleEnd, + MagnifierDoubleTapCallback? onDoubleTap, + required Widget child, + }) { + final isWallpaperMode = context.read<ValueNotifier<AppMode>>().value == AppMode.setWallpaper; + + const contained = ScaleLevel(ref: ScaleReference.contained); + const covered = ScaleLevel(ref: ScaleReference.covered); + + // REMOTO: + // - minScale sotto al fit per abilitare pinch‑out + // - initialScale al fit (poi RasterImageView lo “cappa” a <= 1.0) + final minScale = isWallpaperMode + ? covered + : (_isRemote ? const ScaleLevel(ref: ScaleReference.contained, factor: .5) : contained); + final initialScale = _isRemote ? contained : viewerController.initialScale; + + return ValueListenableBuilder<bool>( + valueListenable: AvesApp.canGestureToOtherApps, + builder: (context, canGestureToOtherApps, childWidget) { + return AvesMagnifier( + key: Key('${entry.uri}_${entry.pageId}_${entry.dateModifiedMillis}'), + controller: controller ?? _magnifierController, + contentSize: displaySize ?? entry.displaySize, + allowOriginalScaleBeyondRange: !isWallpaperMode, + allowDoubleTap: _allowDoubleTap, + minScale: minScale, + maxScale: maxScale, + initialScale: initialScale, + scaleStateCycle: scaleStateCycle, + applyScale: applyScale, + onScaleStart: onScaleStart, + onScaleUpdate: onScaleUpdate, + onScaleEnd: onScaleEnd, + onFling: _onFling, + onTap: (context, _, alignment, _) { + if (context.mounted) { + _onTap(alignment: alignment); + } + }, + onLongPress: canGestureToOtherApps ? _startGlobalDrag : null, + onDoubleTap: onDoubleTap, + child: childWidget!, + ); + }, + child: child, + ); + } + + Future<void> _startGlobalDrag() async { + const dragShadowSize = Size.square(128); + final cornerRadiusPx = await deviceService.getWidgetCornerRadiusPx(); + + final devicePixelRatio = MediaQuery.devicePixelRatioOf(context); + final brightness = Theme.of(context).brightness; + final outline = await WidgetOutline.systemBlackAndWhite.color(brightness); + + final dragShadowBytes = await HomeWidgetPainter( + entry: entry, + devicePixelRatio: devicePixelRatio, + ).drawWidget( + sizeDip: dragShadowSize, + cornerRadiusPx: cornerRadiusPx, + outline: outline, + shape: WidgetShape.rrect, + ); + + await windowService.startGlobalDrag(entry.uri, entry.bestTitle, dragShadowSize, dragShadowBytes); + } + + void _onFling(AxisDirection direction) { + const animate = true; + switch (direction) { + case AxisDirection.left: + (context.isRtl ? const ShowNextEntryNotification(animate: animate) : const ShowPreviousEntryNotification(animate: animate)).dispatch(context); + case AxisDirection.right: + (context.isRtl ? const ShowPreviousEntryNotification(animate: animate) : const ShowNextEntryNotification(animate: animate)).dispatch(context); + case AxisDirection.up: + PopVisualNotification().dispatch(context); + case AxisDirection.down: + ShowInfoPageNotification().dispatch(context); + } + } + + Notification? _handleSideSingleTap(Alignment? alignment) { + if (settings.viewerGestureSideTapNext && alignment != null) { + final x = alignment.x; + final sideRatio = _getSideRatio(); + if (sideRatio != null) { + const animate = false; + if (x < sideRatio) { + return context.isRtl ? const ShowNextEntryNotification(animate: animate) : const ShowPreviousEntryNotification(animate: animate); + } else if (x > 1 - sideRatio) { + return context.isRtl ? const ShowPreviousEntryNotification(animate: animate) : const ShowNextEntryNotification(animate: animate); + } + } + } + return null; + } + + void _onTap({Alignment? alignment}) => (_handleSideSingleTap(alignment) ?? const ToggleOverlayNotification()).dispatch(context); + + bool _allowDoubleTap(Alignment alignment) { + if (entry.isVideo && settings.videoGestureSideDoubleTapSeek) { + return true; + } + final actionNotification = _handleSideSingleTap(alignment); + return actionNotification == null; + } + + void _onMediaCommand(MediaCommandEvent event) { + final videoController = context.read<VideoConductor>().getController(entry); + if (videoController == null) return; + + switch (event.command) { + case MediaCommand.play: + videoController.play(); + case MediaCommand.pause: + videoController.pause(); + case MediaCommand.skipToNext: + ShowNextVideoNotification().dispatch(context); + case MediaCommand.skipToPrevious: + ShowPreviousVideoNotification().dispatch(context); + case MediaCommand.stop: + videoController.pause(); + case MediaCommand.seek: + if (event is MediaSeekCommandEvent) { + videoController.seekTo(event.position); + } + } + } + + void _onViewStateChanged(MagnifierState v) { + if (!mounted) return; + _viewStateNotifier.value = _viewStateNotifier.value.copyWith( + position: v.position, + scale: v.scale, + ); + } + + void _onViewScaleBoundariesChanged(ScaleBoundaries v) { + _viewStateNotifier.value = _viewStateNotifier.value.copyWith( + viewportSize: v.viewportSize, + contentSize: v.contentSize, + ); + } + + double? _getSideRatio() { + if (!mounted) return null; + final isPortrait = MediaQuery.orientationOf(context) == Orientation.portrait; + return isPortrait ? 1 / 6 : 1 / 8; + } + + static ScaleState _vectorScaleStateCycle(ScaleState actual) { + switch (actual) { + case ScaleState.initial: + return ScaleState.covering; + default: + return ScaleState.initial; + } + } +} diff --git a/lib/widgets/viewer/visual/error.dart b/lib/widgets/viewer/visual/error.dart new file mode 100644 index 0000000..e93eeff --- /dev/null +++ b/lib/widgets/viewer/visual/error.dart @@ -0,0 +1,61 @@ +import 'dart:io'; + +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/viewer/entry_viewer_page.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +class ErrorView extends StatefulWidget { + final AvesEntry entry; + final VoidCallback onTap; + + const ErrorView({ + super.key, + required this.entry, + required this.onTap, + }); + + @override + State<ErrorView> createState() => _ErrorViewState(); +} + +class _ErrorViewState extends State<ErrorView> { + late Future<bool> _exists; + + AvesEntry get entry => widget.entry; + + @override + void initState() { + super.initState(); + final path = entry.trashDetails?.path ?? entry.path; + _exists = path != null ? File(path).exists() : SynchronousFuture(true); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => widget.onTap(), + // use container to expand constraints, so that the user can tap anywhere + child: Container( + // opaque to cover potential lower quality layer below + color: EntryViewerPage.getBackground(context), + child: FutureBuilder<bool>( + future: _exists, + builder: (context, snapshot) { + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final exists = snapshot.data!; + return EmptyContent( + icon: exists ? AIcons.error : AIcons.broken, + text: exists ? context.l10n.viewerErrorUnknown : context.l10n.viewerErrorDoesNotExist, + alignment: Alignment.center, + safeBottom: false, + ); + }, + ), + ), + ); + } +} diff --git a/lib/widgets/viewer/visual/raster.dart b/lib/widgets/viewer/visual/raster.dart new file mode 100644 index 0000000..1166307 --- /dev/null +++ b/lib/widgets/viewer/visual/raster.dart @@ -0,0 +1,605 @@ +// lib/widgets/viewer/visual/raster.dart +import 'dart:math'; + +import 'package:aves/image_providers/region_provider.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/images.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/settings/enums/entry_background.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/viewer/view_state.dart'; +import 'package:aves/widgets/common/fx/checkered_decoration.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves/widgets/viewer/visual/entry_page_view.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:aves/remote/remote_http.dart'; + +// ✅ NEW: Remote origin costante +import 'package:aves/remote/remote_origin.dart'; + +class RasterImageView extends StatefulWidget { + final AvesEntry entry; + final ValueNotifier<ViewState> viewStateNotifier; + final ImageErrorWidgetBuilder errorBuilder; + + const RasterImageView({ + super.key, + required this.entry, + required this.viewStateNotifier, + required this.errorBuilder, + }); + + @override + State<RasterImageView> createState() => _RasterImageViewState(); +} + +class _RasterImageViewState extends State<RasterImageView> { + late Size _displaySize; + late bool _useTiles; + bool _isTilingInitialized = false; + late int _maxSampleSize; + late double _tileSide; + Matrix4? _tileTransform; + ImageStream? _fullImageStream; + late ImageStreamListener _fullImageListener; + final ValueNotifier<bool> _fullImageLoaded = ValueNotifier(false); + ImageInfo? _fullImageInfo; + + static const int _pixelArtMaxSize = 256; // px + static const double _tilesByShortestSide = 2; + + AvesEntry get entry => widget.entry; + + ValueNotifier<ViewState> get viewStateNotifier => widget.viewStateNotifier; + + ViewState get viewState => viewStateNotifier.value; + + ImageProvider get thumbnailProvider => entry.bestCachedThumbnail; + + bool get _isRemote => entry.origin == RemoteOrigin.value; + + // === FULL IMAGE: provider sincrono (necessario per il listener) + ImageProvider get fullImageProvider { + if (_isRemote) { + final abs = RemoteHttp.absUrl(entry.remotePath ?? entry.path); + final hdrs = RemoteHttp.peekHeaders(); + return NetworkImage(abs, headers: hdrs.isEmpty ? null : hdrs); + } + + if (_useTiles) { + assert(_isTilingInitialized); + return entry.getRegion( + sampleSize: _maxSampleSize, + region: entry.fullImageRegion, + ); + } else { + return entry.fullImage; + } + } + + @override + void initState() { + super.initState(); + _displaySize = entry.displaySize; + // REMOTO: disabilita tiling per i remoti + _useTiles = _isRemote ? false : entry.useTiles; + _fullImageListener = ImageStreamListener(_onFullImageCompleted); + if (!_useTiles) _registerFullImage(); + } + + @override + void didUpdateWidget(covariant RasterImageView oldWidget) { + super.didUpdateWidget(oldWidget); + + final oldViewState = oldWidget.viewStateNotifier.value; + final viewState = widget.viewStateNotifier.value; + if (oldWidget.entry != widget.entry || oldViewState.viewportSize != viewState.viewportSize) { + _isTilingInitialized = false; + _fullImageLoaded.value = false; + _unregisterFullImage(); + } + } + + @override + void dispose() { + _fullImageLoaded.dispose(); + _unregisterFullImage(); + super.dispose(); + } + + void _registerFullImage() { + _fullImageStream = fullImageProvider.resolve(ImageConfiguration.empty); + _fullImageStream!.addListener(_fullImageListener); + } + + void _unregisterFullImage() { + _fullImageStream?.removeListener(_fullImageListener); + _fullImageStream = null; + _fullImageInfo?.dispose(); + _fullImageInfo = null; + } + + void _onFullImageCompleted(ImageInfo image, bool synchronousCall) { + // implementer is responsible for disposing the provided `ImageInfo` + _unregisterFullImage(); + _fullImageInfo = image; + _fullImageLoaded.value = true; + + // ⚠️ REMOTO: NON aggiornare _displaySize quando arriva il full. + // Manteniamo quella di entry.displaySize (remoteWidth/remoteHeight), + // così il Magnifier non ricompone i limiti e non c'è "shrink". + FullImageLoadedNotification(entry, fullImageProvider).dispatch(context); + } + + // REMOTO: non applicare mai scala > 1.0 (evita “partenza zoomata”) + double _effectiveScale(double raw) => _isRemote ? min(raw, 1.0) : raw; + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder<ViewState>( + valueListenable: viewStateNotifier, + builder: (context, viewState, child) { + final viewportSize = viewState.viewportSize; + final viewportSized = viewportSize?.isEmpty == false; + if (viewportSized && _useTiles && !_isTilingInitialized) _initTiling(viewportSize!); + + final magnifierScale = _effectiveScale(viewState.scale!); + final sized = _displaySize * magnifierScale; + + return SizedBox.fromSize( + // evita 0×0 che può portare a overflow numerici in fase di layout + size: Size(max(1, sized.width), max(1, sized.height)), + child: Stack( + alignment: Alignment.center, + children: [ + if (entry.canHaveAlpha && viewportSized) _buildBackground(magnifierScale), + _buildLoading(), // placeholder (anche remoto) + if (_useTiles) ..._buildTiles() else _buildFullImage(magnifierScale), + ], + ), + ); + }, + ); + } + + // === FULL IMAGE (widget) === + Widget _buildFullImage(double magnifierScale) { + final devicePixelRatio = MediaQuery.of(context).devicePixelRatio; + final quality = _qualityForScaleAndSize( + magnifierScale: magnifierScale, + sampleSize: 1, + devicePixelRatio: devicePixelRatio, + ); + + Widget img = Image( + image: fullImageProvider, + gaplessPlayback: true, + errorBuilder: widget.errorBuilder, + width: (_displaySize * magnifierScale).width, + fit: BoxFit.contain, // naturale: niente crop + filterQuality: quality, + ); + + // EXIF solo per locali (per i remoti è neutralizzato in entry.dart) + if (!_isRemote) { + if (entry.isFlipped) { + final rotated = (entry.rotationDegrees ~/ 90) % 2 != 0; + final w = (rotated ? (_displaySize.height * magnifierScale) : (_displaySize.width * magnifierScale)) / 2.0; + final h = (rotated ? (_displaySize.width * magnifierScale) : (_displaySize.height * magnifierScale)) / 2.0; + final flipper = Matrix4.identity() + ..translateByDouble(w, h, 0, 1) + ..scaleByDouble(-1.0, 1.0, 1.0, 1.0) + ..translateByDouble(-w, -h, 0, 1); + img = Transform(transform: flipper, child: img); + } + final quarterTurns = (entry.rotationDegrees ~/ 90) % 4; + if (quarterTurns != 0) { + img = RotatedBox(quarterTurns: quarterTurns, child: img); + } + } + + return img; + } + + // === LOADING / PLACEHOLDER === + Widget _buildLoading() { + return ValueListenableBuilder<bool>( + valueListenable: _fullImageLoaded, + builder: (context, fullImageLoaded, child) { + if (fullImageLoaded) return const SizedBox(); + + // Per i remoti, mostra thumb remoto (o path) via HTTP + header async + if (_isRemote) { + final rel = entry.remoteThumb2 ?? entry.remoteThumb1 ?? entry.remotePath ?? entry.path; + if (rel != null && rel.isNotEmpty) { + final url = RemoteHttp.absUrl(rel); + return AspectRatio( + aspectRatio: entry.displayAspectRatio, + child: FutureBuilder<Map<String, String>>( + future: RemoteHttp.headers(), + builder: (context, snap) { + if (snap.connectionState != ConnectionState.done) { + return const ColoredBox(color: Colors.black12); + } + final hdrs = snap.data ?? const {}; + return Image.network( + url, + fit: BoxFit.contain, // evita “fill” (effetto zoomato) in loading + headers: hdrs.isEmpty ? null : hdrs, + ); + }, + ), + ); + } + } + + // Default: usa il thumbnail “migliore” in cache locale + return Center( + child: AspectRatio( + // mantieni l'aspect ratio originale + aspectRatio: entry.displayAspectRatio, + child: Image( + image: thumbnailProvider, + fit: BoxFit.contain, + ), + ), + ); + }, + ); + } + + void _initTiling(Size viewportSize) { + final devicePixelRatio = MediaQuery.of(context).devicePixelRatio; + _tileSide = viewportSize.shortestSide * devicePixelRatio / _tilesByShortestSide; + // scale for initial state `contained` + final containedScale = min(viewportSize.width / _displaySize.width, viewportSize.height / _displaySize.height); + _maxSampleSize = ExtraAvesEntryImages.sampleSizeForScale( + magnifierScale: containedScale, + devicePixelRatio: devicePixelRatio, + ); + + final rotationDegrees = entry.rotationDegrees; + final isFlipped = entry.isFlipped; + _tileTransform = null; + if (rotationDegrees != 0 || isFlipped) { + _tileTransform = Matrix4.identity() + ..translateByDouble(entry.width / 2.0, entry.height / 2.0, 0, 1) + ..scaleByDouble(isFlipped ? -1.0 : 1.0, 1.0, 1.0, 1.0) + ..rotateZ(-degToRadian(rotationDegrees.toDouble())) + ..translateByDouble(-_displaySize.width / 2.0, -_displaySize.height / 2.0, 0, 1); + } + _isTilingInitialized = true; + _registerFullImage(); + } + + Widget _buildBackground(double magnifierScale) { + final viewportSize = viewState.viewportSize!; + final viewSize = _displaySize * magnifierScale; + final decorationOffset = ((viewSize - viewportSize) as Offset) / 2 - viewState.position; + // deflate come “quick way” per evitare bleed + final decorationSize = (applyBoxFit(BoxFit.none, viewSize, viewportSize).source - const Offset(.5, .5)) as Size; + + Widget child; + final background = settings.imageBackground; + if (background == EntryBackground.checkered) { + final side = viewportSize.shortestSide; + final checkSize = side / ((side / EntryPageView.decorationCheckSize).round()); + final offset = ((decorationSize - viewportSize) as Offset) / 2; + child = ValueListenableBuilder<bool>( + valueListenable: _fullImageLoaded, + builder: (context, fullImageLoaded, child) { + if (!fullImageLoaded) return const SizedBox(); + + return CustomPaint( + painter: CheckeredPainter( + checkSize: checkSize, + offset: offset, + ), + ); + }, + ); + } else { + child = DecoratedBox( + decoration: BoxDecoration( + color: background.color, + ), + ); + } + return Positioned( + left: decorationOffset.dx >= 0 ? decorationOffset.dx : null, + top: decorationOffset.dy >= 0 ? decorationOffset.dy : null, + width: decorationSize.width, + height: decorationSize.height, + child: child, + ); + } + + List<Widget> _buildTiles() { + if (!_isTilingInitialized) return []; + + final displayWidth = _displaySize.width.round(); + final displayHeight = _displaySize.height.round(); + final viewRect = _getViewRect(displayWidth, displayHeight); + final magnifierScale = viewState.scale!; + final devicePixelRatio = MediaQuery.of(context).devicePixelRatio; + + // per la sample size massima (scala iniziale), l’intera immagine è in view + final fullImageRegionTile = _RegionTile( + entry: entry, + tileRect: Rect.fromLTWH(0, 0, displayWidth * magnifierScale, displayHeight * magnifierScale), + regionRect: entry.fullImageRegion, + sampleSize: _maxSampleSize, + quality: _qualityForScaleAndSize( + magnifierScale: magnifierScale, + sampleSize: _maxSampleSize, + devicePixelRatio: devicePixelRatio, + ), + ); + final tiles = [fullImageRegionTile]; + + final minSampleSize = min( + ExtraAvesEntryImages.sampleSizeForScale( + magnifierScale: magnifierScale, + devicePixelRatio: devicePixelRatio, + ), + _maxSampleSize, + ); + + int nextSampleSize(int sampleSize) => (sampleSize / 2).floor(); + for (var sampleSize = nextSampleSize(_maxSampleSize); sampleSize >= minSampleSize; sampleSize = nextSampleSize(sampleSize)) { + final regionSide = (_tileSide * sampleSize).round(); + for (var x = 0; x < displayWidth; x += regionSide) { + for (var y = 0; y < displayHeight; y += regionSide) { + final rects = _getTileRects( + x: x, + y: y, + regionSide: regionSide, + displayWidth: displayWidth, + displayHeight: displayHeight, + scale: magnifierScale, + viewRect: viewRect, + ); + if (rects != null) { + final (tileRect, regionRect) = rects; + tiles.add( + _RegionTile( + entry: entry, + tileRect: tileRect, + regionRect: regionRect, + sampleSize: sampleSize, + quality: _qualityForScaleAndSize( + magnifierScale: magnifierScale, + sampleSize: sampleSize, + devicePixelRatio: devicePixelRatio, + ), + ), + ); + } + } + } + } + return tiles; + } + + Rect _getViewRect(int displayWidth, int displayHeight) { + final scale = viewState.scale!; + final centerOffset = viewState.position; + final viewportSize = viewState.viewportSize!; + final viewOrigin = Offset( + ((displayWidth * scale - viewportSize.width) / 2 - centerOffset.dx), + ((displayHeight * scale - viewportSize.height) / 2 - centerOffset.dy), + ); + return viewOrigin & viewportSize; + } + + (Rect tileRect, Rectangle<num> regionRect)? _getTileRects({ + required int x, + required int y, + required int regionSide, + required int displayWidth, + required int displayHeight, + required double scale, + required Rect viewRect, + }) { + final nextX = x + regionSide; + final nextY = y + regionSide; + final thisRegionWidth = regionSide - (nextX >= displayWidth ? nextX - displayWidth : 0); + final thisRegionHeight = regionSide - (nextY >= displayHeight ? nextY - displayHeight : 0); + final tileRect = Rect.fromLTWH(x * scale, y * scale, thisRegionWidth * scale, thisRegionHeight * scale); + + // only build visible tiles + if (!viewRect.overlaps(tileRect)) return null; + + Rectangle<num> regionRect; + if (_tileTransform != null) { + // apply EXIF orientation + final regionRectDouble = Rect.fromLTWH(x.toDouble(), y.toDouble(), thisRegionWidth.toDouble(), thisRegionHeight.toDouble()); + final tl = MatrixUtils.transformPoint(_tileTransform!, regionRectDouble.topLeft); + final br = MatrixUtils.transformPoint(_tileTransform!, regionRectDouble.bottomRight); + regionRect = Rectangle<double>.fromPoints( + Point<double>(tl.dx, tl.dy), + Point<double>(br.dx, br.dy), + ); + } else { + regionRect = Rectangle<num>(x, y, thisRegionWidth, thisRegionHeight); + } + return (tileRect, regionRect); + } + + // follow recommended thresholds from `FilterQuality` documentation + static FilterQuality _qualityForScale({ + required double magnifierScale, + required int sampleSize, + required double devicePixelRatio, + }) { + final entryScale = magnifierScale * devicePixelRatio; + final renderingScale = entryScale * sampleSize; + if (renderingScale > 1) { + return renderingScale > 10 ? FilterQuality.high : FilterQuality.medium; + } else { + return renderingScale < .5 ? FilterQuality.medium : FilterQuality.high; + } + } + + // usually follow recommendations, except for small images + // (like icons, pixel art, etc.) for which the "nearest neighbor" algorithm is used + FilterQuality _qualityForScaleAndSize({ + required double magnifierScale, + required int sampleSize, + required double devicePixelRatio, + }) { + if (_displaySize.longestSide < _pixelArtMaxSize) { + return FilterQuality.none; + } + + return _qualityForScale( + magnifierScale: magnifierScale, + sampleSize: sampleSize, + devicePixelRatio: devicePixelRatio, + ); + } +} + +class _RegionTile extends StatefulWidget { + final AvesEntry entry; + + // `tileRect` uses Flutter view coordinates + // `regionRect` uses the raw image pixel coordinates + final Rect tileRect; + final Rectangle<num> regionRect; + final int sampleSize; + final FilterQuality quality; + + const _RegionTile({ + required this.entry, + required this.tileRect, + required this.regionRect, + required this.sampleSize, + required this.quality, + }); + + @override + State<_RegionTile> createState() => _RegionTileState(); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(IntProperty('id', entry.id)); + properties.add(IntProperty('contentId', entry.contentId)); + properties.add(DiagnosticsProperty<Rect>('tileRect', tileRect)); + properties.add(DiagnosticsProperty<Rectangle<num>>('regionRect', regionRect)); + properties.add(IntProperty('sampleSize', sampleSize)); + } +} + +class _RegionTileState extends State<_RegionTile> { + late RegionProvider _provider; + + AvesEntry get entry => widget.entry; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant _RegionTile oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.entry != widget.entry || + oldWidget.tileRect != widget.tileRect || + oldWidget.sampleSize != widget.sampleSize || + oldWidget.sampleSize != widget.sampleSize) { + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + } + + @override + void dispose() { + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(_RegionTile widget) { + _initProvider(); + } + + void _unregisterWidget(_RegionTile widget) { + _pauseProvider(); + } + + void _initProvider() { + _provider = entry.getRegion( + sampleSize: widget.sampleSize, + region: widget.regionRect, + ); + } + + void _pauseProvider() => _provider.pause(); + + @override + Widget build(BuildContext context) { + final tileRect = widget.tileRect; + + Widget child = Image( + image: _provider, + width: tileRect.width, + height: tileRect.height, + fit: BoxFit.fill, + filterQuality: widget.quality, + ); + + // apply EXIF orientation (tile path locale) + final quarterTurns = entry.rotationDegrees ~/ 90; + if (entry.isFlipped) { + final rotated = quarterTurns % 2 != 0; + final w = (rotated ? tileRect.height : tileRect.width) / 2.0; + final h = (rotated ? tileRect.width : tileRect.height) / 2.0; + final flipper = Matrix4.identity() + ..translateByDouble(w, h, 0, 1) + ..scaleByDouble(-1.0, 1.0, 1.0, 1.0) + ..translateByDouble(-w, -h, 0, 1); + child = Transform( + transform: flipper, + child: child, + ); + } + if (quarterTurns != 0) { + child = RotatedBox( + quarterTurns: quarterTurns, + child: child, + ); + } + + if (settings.debugShowViewerTiles) { + final regionRect = widget.regionRect; + child = Stack( + children: [ + Positioned.fill(child: child), + Text( + '\ntile=(${tileRect.left.round()}, ${tileRect.top.round()}) ${tileRect.width.round()} x ${tileRect.height.round()}' + '\nregion=(${regionRect.left.round()},{${regionRect.top.round()}) ${regionRect.width.round()} x ${regionRect.height.round()}' + '\nsampling=${widget.sampleSize} quality=${widget.quality.name}', + style: const TextStyle(backgroundColor: Colors.black87), + ), + Positioned.fill( + child: DecoratedBox( + decoration: BoxDecoration( + border: Border.all(color: Colors.red, width: 1), + ), + ), + ), + ], + ); + } + + return Positioned.fromRect( + rect: tileRect, + child: child, + ); + } +} diff --git a/lib/widgets/viewer/visual/vector.dart b/lib/widgets/viewer/visual/vector.dart new file mode 100644 index 0000000..1ae3dc3 --- /dev/null +++ b/lib/widgets/viewer/visual/vector.dart @@ -0,0 +1,444 @@ +import 'dart:math'; + +import 'package:aves/image_providers/region_provider.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/images.dart'; +import 'package:aves/model/settings/enums/entry_background.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/viewer/view_state.dart'; +import 'package:aves/utils/math_utils.dart'; +import 'package:aves/widgets/common/fx/checkered_decoration.dart'; +import 'package:aves/widgets/viewer/visual/entry_page_view.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +class VectorImageView extends StatefulWidget { + final AvesEntry entry; + final ValueNotifier<ViewState> viewStateNotifier; + final ImageErrorWidgetBuilder errorBuilder; + + const VectorImageView({ + super.key, + required this.entry, + required this.viewStateNotifier, + required this.errorBuilder, + }); + + @override + State<VectorImageView> createState() => _VectorImageViewState(); +} + +class _VectorImageViewState extends State<VectorImageView> { + late Size _displaySize; + bool _isTilingInitialized = false; + late double _minScale; + late double _tileSide; + ImageStream? _fullImageStream; + late ImageStreamListener _fullImageListener; + final ValueNotifier<bool> _fullImageLoaded = ValueNotifier(false); + ImageInfo? _fullImageInfo; + + AvesEntry get entry => widget.entry; + + ValueNotifier<ViewState> get viewStateNotifier => widget.viewStateNotifier; + + ViewState get viewState => viewStateNotifier.value; + + ImageProvider get thumbnailProvider => entry.bestCachedThumbnail; + + ImageProvider get fullImageProvider { + assert(_isTilingInitialized); + return entry.getRegion( + scale: _minScale, + region: entry.fullImageRegion, + ); + } + + @override + void initState() { + super.initState(); + _displaySize = entry.displaySize; + _fullImageListener = ImageStreamListener(_onFullImageCompleted); + } + + @override + void didUpdateWidget(covariant VectorImageView oldWidget) { + super.didUpdateWidget(oldWidget); + + final oldViewState = oldWidget.viewStateNotifier.value; + final viewState = widget.viewStateNotifier.value; + if (oldWidget.entry != widget.entry || oldViewState.viewportSize != viewState.viewportSize) { + _isTilingInitialized = false; + _fullImageLoaded.value = false; + _unregisterFullImage(); + } + } + + @override + void dispose() { + _fullImageLoaded.dispose(); + _unregisterFullImage(); + super.dispose(); + } + + void _registerFullImage() { + _fullImageStream = fullImageProvider.resolve(ImageConfiguration.empty); + _fullImageStream!.addListener(_fullImageListener); + } + + void _unregisterFullImage() { + _fullImageStream?.removeListener(_fullImageListener); + _fullImageStream = null; + _fullImageInfo?.dispose(); + } + + void _onFullImageCompleted(ImageInfo image, bool synchronousCall) { + // implementer is responsible for disposing the provided `ImageInfo` + _unregisterFullImage(); + _fullImageInfo = image; + _fullImageLoaded.value = true; + } + + @override + Widget build(BuildContext context) { + if (_displaySize == Size.zero) return widget.errorBuilder(context, 'Not sized', null); + + final devicePixelRatio = MediaQuery.devicePixelRatioOf(context); + return ValueListenableBuilder<ViewState>( + valueListenable: viewStateNotifier, + builder: (context, viewState, child) { + final viewportSize = viewState.viewportSize; + final viewportSized = viewportSize?.isEmpty == false; + if (viewportSized && !_isTilingInitialized) { + _initTiling( + viewportSize: viewportSize!, + devicePixelRatio: devicePixelRatio, + ); + } + + return SizedBox.fromSize( + size: _displaySize * viewState.scale!, + child: Stack( + alignment: Alignment.center, + children: [ + _buildLoading(), + ..._getTiles(devicePixelRatio), + ], + ), + ); + }, + ); + } + + void _initTiling({ + required Size viewportSize, + required double devicePixelRatio, + }) { + _tileSide = _displaySize.longestSide; + // scale for initial state `contained` + final containedScale = min(viewportSize.width / _displaySize.width, viewportSize.height / _displaySize.height); + _minScale = _imageScaleForViewScale(scale: containedScale, devicePixelRatio: devicePixelRatio); + + _isTilingInitialized = true; + _registerFullImage(); + } + + Widget _buildLoading() { + return ValueListenableBuilder<bool>( + valueListenable: _fullImageLoaded, + builder: (context, fullImageLoaded, child) { + if (fullImageLoaded) return const SizedBox(); + + return Center( + child: AspectRatio( + // enforce original aspect ratio, as some thumbnails aspect ratios slightly differ + aspectRatio: entry.displayAspectRatio, + child: Image( + image: thumbnailProvider, + fit: BoxFit.fill, + ), + ), + ); + }, + ); + } + + List<Widget> _getTiles(double devicePixelRatio) { + if (!_isTilingInitialized) return []; + + final displayWidth = _displaySize.width; + final displayHeight = _displaySize.height; + final viewRect = _getViewRect(displayWidth, displayHeight); + final viewScale = viewState.scale!; + final background = settings.imageBackground; + + Color? backgroundColor; + _BackgroundFrameBuilder? backgroundFrameBuilder; + if (background.isColor) { + backgroundColor = background.color; + } else if (background == EntryBackground.checkered) { + final viewportSize = viewState.viewportSize!; + final viewSize = _displaySize * viewState.scale!; + + final backgroundSize = applyBoxFit(BoxFit.none, viewSize, viewportSize).source; + var backgroundOffset = ((viewSize - viewportSize) as Offset) / 2 - viewState.position; + backgroundOffset = Offset(max(0, backgroundOffset.dx), max(0, backgroundOffset.dy)); + backgroundOffset += ((backgroundSize - viewportSize) as Offset) / 2; + + final side = viewportSize.shortestSide; + final checkSize = side / ((side / EntryPageView.decorationCheckSize).round()); + + backgroundFrameBuilder = (child, frame, tileRect) { + return frame == null + ? const SizedBox() + : DecoratedBox( + decoration: _CheckeredBackgroundDecoration( + viewportSize: viewportSize, + checkSize: checkSize, + offset: backgroundOffset - tileRect.topLeft, + ), + child: child, + ); + }; + } + + // for the largest sample size (matching the initial scale), the whole image is in view + // so we subsample the whole image without tiling + final fullImageRegionTile = _RegionTile( + entry: entry, + tileRect: Rect.fromLTWH(0, 0, displayWidth * viewScale, displayHeight * viewScale), + regionRect: entry.fullImageRegion, + scale: _minScale, + backgroundColor: backgroundColor, + backgroundFrameBuilder: backgroundFrameBuilder, + ); + final tiles = <Widget>[fullImageRegionTile]; + + final maxSvgScale = max(_imageScaleForViewScale(scale: viewScale, devicePixelRatio: devicePixelRatio), _minScale); + double nextScale(double scale) => scale * 2; + // add `alpha` to the region side so that tiles do not align across layers, + // which helps the checkered background deflation workaround + // for the tile background bleeding issue + var alpha = 0; + for (var svgScale = nextScale(_minScale); svgScale <= maxSvgScale; svgScale = nextScale(svgScale)) { + final regionSide = (_tileSide + alpha++) / (svgScale / _minScale); + for (var x = .0; x < displayWidth; x += regionSide) { + for (var y = .0; y < displayHeight; y += regionSide) { + final rects = _getTileRects( + x: x, + y: y, + regionSide: regionSide, + displayWidth: displayWidth, + displayHeight: displayHeight, + scale: viewScale, + viewRect: viewRect, + ); + if (rects != null) { + final (tileRect, regionRect) = rects; + tiles.add( + _RegionTile( + entry: entry, + tileRect: tileRect, + regionRect: regionRect, + scale: svgScale, + backgroundColor: backgroundColor, + backgroundFrameBuilder: backgroundFrameBuilder, + ), + ); + } + } + } + } + return tiles; + } + + Rect _getViewRect(double displayWidth, double displayHeight) { + final scale = viewState.scale!; + final centerOffset = viewState.position; + final viewportSize = viewState.viewportSize!; + final viewOrigin = Offset( + ((displayWidth * scale - viewportSize.width) / 2 - centerOffset.dx), + ((displayHeight * scale - viewportSize.height) / 2 - centerOffset.dy), + ); + return viewOrigin & viewportSize; + } + + (Rect tileRect, Rectangle<double> regionRect)? _getTileRects({ + required double x, + required double y, + required double regionSide, + required double displayWidth, + required double displayHeight, + required double scale, + required Rect viewRect, + }) { + final nextX = x + regionSide; + final nextY = y + regionSide; + final thisRegionWidth = regionSide - (nextX >= displayWidth ? nextX - displayWidth : 0); + final thisRegionHeight = regionSide - (nextY >= displayHeight ? nextY - displayHeight : 0); + final tileRect = Rect.fromLTWH(x * scale, y * scale, thisRegionWidth * scale, thisRegionHeight * scale); + + // only build visible tiles + if (!viewRect.overlaps(tileRect)) return null; + + final regionRect = Rectangle<double>(x, y, thisRegionWidth, thisRegionHeight); + return (tileRect, regionRect); + } + + double _imageScaleForViewScale({ + required double scale, + required double devicePixelRatio, + }) => smallestPowerOf2(scale * devicePixelRatio, allowNegativePower: true).toDouble(); +} + +typedef _BackgroundFrameBuilder = Widget Function(Widget child, int? frame, Rect tileRect); + +class _RegionTile extends StatefulWidget { + final AvesEntry entry; + + // `tileRect` uses Flutter view coordinates + // `regionRect` uses the raw image pixel coordinates + final Rect tileRect; + final Rectangle<double> regionRect; + final double scale; + final Color? backgroundColor; + final _BackgroundFrameBuilder? backgroundFrameBuilder; + + const _RegionTile({ + required this.entry, + required this.tileRect, + required this.regionRect, + required this.scale, + required this.backgroundColor, + required this.backgroundFrameBuilder, + }); + + @override + State<_RegionTile> createState() => _RegionTileState(); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(IntProperty('id', entry.id)); + properties.add(IntProperty('contentId', entry.contentId)); + properties.add(DiagnosticsProperty<Rect>('tileRect', tileRect)); + properties.add(DiagnosticsProperty<Rectangle<double>>('regionRect', regionRect)); + properties.add(DoubleProperty('scale', scale)); + } +} + +class _RegionTileState extends State<_RegionTile> { + late RegionProvider _provider; + + AvesEntry get entry => widget.entry; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant _RegionTile oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.entry != widget.entry || oldWidget.tileRect != widget.tileRect || oldWidget.scale != widget.scale || oldWidget.scale != widget.scale) { + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + } + + @override + void dispose() { + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(_RegionTile widget) { + _initProvider(); + } + + void _unregisterWidget(_RegionTile widget) { + _pauseProvider(); + } + + void _initProvider() { + _provider = entry.getRegion( + scale: widget.scale, + region: widget.regionRect, + ); + } + + void _pauseProvider() => _provider.pause(); + + @override + Widget build(BuildContext context) { + final tileRect = widget.tileRect; + + Widget child = Image( + image: _provider, + frameBuilder: (_, child, frame, _) => widget.backgroundFrameBuilder?.call(child, frame, tileRect) ?? child, + width: tileRect.width, + height: tileRect.height, + color: widget.backgroundColor, + colorBlendMode: BlendMode.dstOver, + fit: BoxFit.fill, + ); + + return Positioned.fromRect( + rect: tileRect, + child: child, + ); + } +} + +class _CheckeredBackgroundDecoration extends Decoration { + final Size viewportSize; + final double checkSize; + final Offset offset; + + const _CheckeredBackgroundDecoration({ + required this.viewportSize, + required this.checkSize, + required this.offset, + }); + + @override + _CheckeredBackgroundDecorationPainter createBoxPainter([VoidCallback? onChanged]) { + return _CheckeredBackgroundDecorationPainter(this, onChanged); + } +} + +class _CheckeredBackgroundDecorationPainter extends BoxPainter { + final _CheckeredBackgroundDecoration decoration; + + const _CheckeredBackgroundDecorationPainter(this.decoration, VoidCallback? onChanged) : super(onChanged); + + static const deflation = Offset(.5, .5); + + @override + void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) { + final size = configuration.size; + if (size == null) return; + + var decorated = offset & size; + // deflate background as a workaround for background bleeding beyond tile image + decorated = Rect.fromLTRB( + decorated.left + deflation.dx, + decorated.top + deflation.dy, + decorated.right - deflation.dx, + decorated.bottom - deflation.dy, + ); + + final visible = decorated.intersect(Offset.zero & decoration.viewportSize); + final checkOffset = decoration.offset + decorated.topLeft - visible.topLeft - deflation; + + final translation = Offset(max(0, offset.dx + deflation.dx), max(0, offset.dy + deflation.dy)); + canvas.translate(translation.dx, translation.dy); + CheckeredPainter( + checkSize: decoration.checkSize, + offset: checkOffset, + ).paint(canvas, visible.size); + canvas.translate(-translation.dx, -translation.dy); + } +} diff --git a/lib/widgets/viewer/visual/video/cover.dart b/lib/widgets/viewer/visual/video/cover.dart new file mode 100644 index 0000000..b81968c --- /dev/null +++ b/lib/widgets/viewer/visual/video/cover.dart @@ -0,0 +1,165 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/images.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/thumbnail/image.dart'; +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class VideoCover extends StatefulWidget { + final AvesEntry mainEntry, pageEntry; + final AvesMagnifierController magnifierController; + final AvesVideoController videoController; + final Size videoDisplaySize; + final void Function({Alignment? alignment}) onTap; + final Widget Function( + AvesMagnifierController coverController, + Size coverSize, + ImageProvider videoCoverUriImage, + ) + magnifierBuilder; + + const VideoCover({ + super.key, + required this.mainEntry, + required this.pageEntry, + required this.magnifierController, + required this.videoController, + required this.videoDisplaySize, + required this.onTap, + required this.magnifierBuilder, + }); + + @override + State<VideoCover> createState() => _VideoCoverState(); +} + +class _VideoCoverState extends State<VideoCover> { + ImageStream? _videoCoverStream; + late ImageStreamListener _videoCoverStreamListener; + final ValueNotifier<ImageInfo?> _videoCoverInfoNotifier = ValueNotifier(null); + + AvesMagnifierController? _dismissedCoverMagnifierController; + + AvesMagnifierController get dismissedCoverMagnifierController { + _dismissedCoverMagnifierController ??= AvesMagnifierController(); + return _dismissedCoverMagnifierController!; + } + + AvesEntry get mainEntry => widget.mainEntry; + + AvesEntry get entry => widget.pageEntry; + + AvesMagnifierController get magnifierController => widget.magnifierController; + + AvesVideoController get videoController => widget.videoController; + + Size get videoDisplaySize => widget.videoDisplaySize; + + // use the high res photo as cover for the video part of a motion photo + ImageProvider get videoCoverUriImage => (mainEntry.isMotionPhoto ? mainEntry : entry).fullImage; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant VideoCover oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.pageEntry != widget.pageEntry) { + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + } + + @override + void dispose() { + _unregisterWidget(widget); + _dismissedCoverMagnifierController?.dispose(); + _videoCoverInfoNotifier.dispose(); + super.dispose(); + } + + void _registerWidget(VideoCover widget) { + _videoCoverStreamListener = ImageStreamListener((image, _) => _videoCoverInfoNotifier.value = image); + _videoCoverStream = videoCoverUriImage.resolve(ImageConfiguration.empty); + _videoCoverStream!.addListener(_videoCoverStreamListener); + } + + void _unregisterWidget(VideoCover oldWidget) { + _videoCoverStream?.removeListener(_videoCoverStreamListener); + _videoCoverStream = null; + _videoCoverInfoNotifier.value = null; + } + + @override + Widget build(BuildContext context) { + // fade out image to ease transition with the player + return StreamBuilder<VideoStatus>( + stream: videoController.statusStream, + builder: (context, snapshot) { + final showCover = !videoController.isReady; + return IgnorePointer( + ignoring: !showCover, + child: AnimatedOpacity( + opacity: showCover ? 1 : 0, + curve: Curves.easeInCirc, + duration: ADurations.viewerVideoPlayerTransition, + onEnd: () { + // while cover is fading out, the same controller is used for both the cover and the video, + // and both fire scale boundaries events, so we make sure that in the end + // the scale boundaries from the video are used after the cover is gone + final boundaries = magnifierController.scaleBoundaries; + if (boundaries != null) { + magnifierController.setScaleBoundaries( + boundaries.copyWith( + contentSize: videoDisplaySize, + ), + ); + } + }, + child: ValueListenableBuilder<ImageInfo?>( + valueListenable: _videoCoverInfoNotifier, + builder: (context, videoCoverInfo, child) { + if (videoCoverInfo != null) { + // full cover image may have a different size and different aspect ratio + final coverSize = Size( + videoCoverInfo.image.width.toDouble(), + videoCoverInfo.image.height.toDouble(), + ); + // when the cover is the same size as the video itself + // (which is often the case when the cover is not embedded but just a frame), + // we can reuse the same magnifier and preserve its state when switching from cover to video + final coverController = showCover || coverSize == videoDisplaySize ? magnifierController : dismissedCoverMagnifierController; + return widget.magnifierBuilder(coverController, coverSize, videoCoverUriImage); + } + + // default to cached thumbnail, if any + final extent = entry.cachedThumbnails.firstOrNull?.key.extent; + if (extent != null && extent > 0) { + return GestureDetector( + onTap: widget.onTap, + child: ThumbnailImage( + entry: entry, + extent: extent, + devicePixelRatio: MediaQuery.devicePixelRatioOf(context), + fit: BoxFit.contain, + showLoadingBackground: false, + ), + ); + } + + return const SizedBox(); + }, + ), + ), + ); + }, + ); + } +} diff --git a/lib/widgets/viewer/visual/video/subtitle/ass_parser.dart b/lib/widgets/viewer/visual/video/subtitle/ass_parser.dart new file mode 100644 index 0000000..ff31ee2 --- /dev/null +++ b/lib/widgets/viewer/visual/video/subtitle/ass_parser.dart @@ -0,0 +1,575 @@ +import 'package:aves/ref/unicode.dart'; +import 'package:aves/widgets/viewer/visual/video/subtitle/line.dart'; +import 'package:aves/widgets/viewer/visual/video/subtitle/span.dart'; +import 'package:aves/widgets/viewer/visual/video/subtitle/style.dart'; +import 'package:flutter/material.dart'; + +class AssParser { + // the optional `*` before the tags seems to be used for inner overrides + // but specs for its usage are yet to be found + static final overridePattern = RegExp(r'{\*?(.*?)}'); + + static final tagPattern = RegExp( + r'(' + r'1a|2a|3a|4a' + r'|1c|2c|3c|4c' + r'|alpha|an|a' + r'|be|blur|bord|b' + r'|clip|c' + r'|fade|fad|fax|fay|fe|fn' + r'|frx|fry|frz|fr|fscx|fscy|fsp|fs' + r'|iclip|i' + r'|kf|ko|k|K' + r'|move|org' + r'|pbo|pos|p' + r'|q|r' + r'|shad|s' + r'|t|u' + r'|xbord|xshad|ybord|yshad' + r')', + ); + + // &H<aa> + static final alphaPattern = RegExp('&H(..)'); + + // &H<bb><gg><rr>& + static final colorPattern = RegExp('&H(..)(..)(..)&'); + + // (<X>,<Y>) + static final multiParamPattern = RegExp('\\((.*)\\)'); + + // e.g. m 937.5 472.67 b 937.5 472.67 937.25 501.25 960 501.5 960 501.5 937.5 500.33 937.5 529.83 + static final pathPattern = RegExp(r'([mnlbspc])([.\s\d]+)'); + + // Parse text with ASS style overrides + // cf https://aegi.vmoe.info/docs/3.0/ASS_Tags/ + // e.g. `And I'm like, "We can't {\i1}not{\i0} see it."` + // e.g. `{\fad(200,200)\blur3}lorem ipsum"` + // e.g. `{\fnCrapFLTSB\an9\bord5\fs70\c&H403A2D&\3c&HE5E5E8&\pos(1868.286,27.429)}lorem ipsum"` + static StyledSubtitleLine parse(String text, TextStyle baseStyle, double scale) { + final spans = <StyledSubtitleSpan>[]; + var line = StyledSubtitleLine(spans: spans); + var extraStyle = const SubtitleStyle(); + var textStyle = baseStyle; + var i = 0; + final overrideMatches = overridePattern.allMatches(text); + overrideMatches.forEach((overrideMatch) { + if (i != overrideMatch.start) { + final spanText = extraStyle.drawingPaths?.isNotEmpty == true ? null : _replaceChars(text.substring(i, overrideMatch.start)); + spans.add( + StyledSubtitleSpan( + textSpan: TextSpan( + text: spanText, + style: textStyle, + ), + extraStyle: extraStyle, + ), + ); + } + i = overrideMatch.end; + final tags = overrideMatch.group(1); + tags?.split('\\').where((v) => v.isNotEmpty).forEach((tagWithParam) { + final tag = tagPattern.firstMatch(tagWithParam)?.group(1); + if (tag != null) { + final param = tagWithParam.substring(tag.length); + switch (tag) { + case 'alpha': + { + // \alpha: alpha of all components at once + final a = _parseAlpha(param); + if (a != null) { + textStyle = textStyle.copyWith( + color: textStyle.color?.withAlpha(a), + shadows: textStyle.shadows + ?.map( + (v) => Shadow( + color: v.color.withAlpha(a), + offset: v.offset, + blurRadius: v.blurRadius, + ), + ) + .toList(), + ); + extraStyle = extraStyle.copyWith( + borderColor: extraStyle.borderColor?.withAlpha(a), + ); + } + } + case '1a': + { + // \1a: fill alpha + final a = _parseAlpha(param); + if (a != null) textStyle = textStyle.copyWith(color: textStyle.color?.withAlpha(a)); + } + case '3a': + { + // \3a: border alpha + final a = _parseAlpha(param); + if (a != null) extraStyle = extraStyle.copyWith(borderColor: extraStyle.borderColor?.withAlpha(a)); + } + case '4a': + { + // \4a: shadow alpha + final a = _parseAlpha(param); + if (a != null) { + textStyle = textStyle.copyWith( + shadows: textStyle.shadows + ?.map( + (v) => Shadow( + color: v.color.withAlpha(a), + offset: v.offset, + blurRadius: v.blurRadius, + ), + ) + .toList(), + ); + } + } + case 'a': + // \a: line alignment (legacy) + extraStyle = _copyWithAlignment(_parseLegacyAlignment(param), extraStyle); + case 'an': + // \an: line alignment + extraStyle = _copyWithAlignment(_parseNewAlignment(param), extraStyle); + case 'b': + { + // \b: bold + final weight = _parseFontWeight(param); + if (weight != null) textStyle = textStyle.copyWith(fontWeight: weight); + } + case 'be': + { + // \be: blurs the edges of the text + final times = int.tryParse(param); + if (times != null) extraStyle = extraStyle.copyWith(edgeBlur: times == 0 ? 0 : 1); + } + case 'blur': + { + // \blur: blurs the edges of the text (Gaussian kernel) + final strength = double.tryParse(param); + if (strength != null) extraStyle = extraStyle.copyWith(edgeBlur: strength / 2); + } + case 'bord': + { + // \bord: border width + final size = double.tryParse(param); + if (size != null) extraStyle = extraStyle.copyWith(borderWidth: size); + } + case 'c': + case '1c': + { + // \c or \1c: fill color + final color = _parseColor(param); + if (color != null) { + textStyle = textStyle.copyWith(color: color.withValues(alpha: textStyle.color?.a ?? 1)); + } + } + case '3c': + { + // \3c: border color + final color = _parseColor(param); + if (color != null) { + extraStyle = extraStyle.copyWith( + borderColor: color.withValues(alpha: extraStyle.borderColor?.a ?? 1), + ); + } + } + case '4c': + { + // \4c: shadow color + final color = _parseColor(param); + if (color != null) { + textStyle = textStyle.copyWith( + shadows: textStyle.shadows + ?.map( + (v) => Shadow( + color: color.withValues(alpha: v.color.a), + offset: v.offset, + blurRadius: v.blurRadius, + ), + ) + .toList(), + ); + } + } + case 'clip': + // \clip: clip (within rectangle or path) + line = line.copyWith(clip: _parseClip(param)); + case 'fax': + { + final factor = double.tryParse(param); + // ignore subsequent shearing when line is positioned + if (factor != null && (line.position == null || extraStyle.shearX == null)) { + extraStyle = extraStyle.copyWith(shearX: factor); + } + } + case 'fay': + { + final factor = double.tryParse(param); + // ignore subsequent shearing when line is positioned + if (factor != null && (line.position == null || extraStyle.shearY == null)) { + extraStyle = extraStyle.copyWith(shearY: factor); + } + } + case 'fn': + { + final name = param; + // TODO TLAD [subtitles] extract fonts from attachment streams, and load these fonts in Flutter + if (name.isNotEmpty) textStyle = textStyle.copyWith(fontFamily: name); + } + case 'frx': + { + // \frx: text rotation (X axis) + final amount = double.tryParse(param); + if (amount != null) extraStyle = extraStyle.copyWith(rotationX: amount); + } + case 'fry': + { + // \fry: text rotation (Y axis) + final amount = double.tryParse(param); + if (amount != null) extraStyle = extraStyle.copyWith(rotationY: amount); + } + case 'fr': + case 'frz': + { + // \frz: text rotation (Z axis) + final amount = double.tryParse(param); + if (amount != null) extraStyle = extraStyle.copyWith(rotationZ: amount); + } + case 'fs': + { + // \fs: font size + final size = int.tryParse(param); + if (size != null) textStyle = textStyle.copyWith(fontSize: size * scale); + } + case 'fscx': + { + // \fscx: font scale (horizontal) + final scale = int.tryParse(param); + if (scale != null) extraStyle = extraStyle.copyWith(scaleX: scale.toDouble() / 100); + } + case 'fscy': + { + // \fscx: font scale (vertical) + final scale = int.tryParse(param); + if (scale != null) extraStyle = extraStyle.copyWith(scaleY: scale.toDouble() / 100); + } + case 'fsp': + { + // \fsp: letter spacing + final spacing = double.tryParse(param); + textStyle = textStyle.copyWith(letterSpacing: spacing); + } + case 'i': + // \i: italics + textStyle = textStyle.copyWith(fontStyle: param == '1' ? FontStyle.italic : FontStyle.normal); + case 'p': + { + // \p drawing paths + final scale = int.tryParse(param); + if (scale != null) { + if (scale > 0) { + final start = overrideMatch.end; + final end = text.indexOf('{', start); + final commands = text.substring(start, end == -1 ? null : end); + extraStyle = extraStyle.copyWith(drawingPaths: _parsePaths(commands, scale)); + } else { + extraStyle = extraStyle.copyWith(drawingPaths: null); + } + } + } + case 'pos': + { + // \pos: line position + final match = multiParamPattern.firstMatch(param); + if (match != null) { + final g = match.group(1); + if (g != null) { + final params = g.split(','); + if (params.length == 2) { + final x = double.tryParse(params[0]); + final y = double.tryParse(params[1]); + if (x != null && y != null) { + line = line.copyWith(position: Offset(x, y)); + } + } + } + } + } + case 'r': + // \r: reset + textStyle = baseStyle; + case 's': + // \s: strikeout + textStyle = textStyle.copyWith(decoration: param == '1' ? TextDecoration.lineThrough : TextDecoration.none); + case 'u': + // \u: underline + textStyle = textStyle.copyWith(decoration: param == '1' ? TextDecoration.underline : TextDecoration.none); + // TODO TLAD [subtitles] SHOULD support the following + case 'shad': + case 't': // \t: animated transform + case 'xshad': + case 'yshad': + // line props: \pos, \move, \clip, \iclip, \org, \fade and \fad + case 'iclip': // \iclip: clip (inverse) + case 'fad': // \fad: fade + case 'fade': // \fade: fade (complex) + case 'move': // \move: movement + case 'org': // \org: rotation origin + // TODO TLAD [subtitles] MAY support the following + case 'fe': // \fe: font encoding + case 'pbo': // \pbo: baseline offset + case 'q': // \q: wrap style + // border size + case 'xbord': + case 'ybord': + // karaoke + case '2a': + case '2c': + case 'k': + case 'K': + case 'kf': + case 'ko': + default: + debugPrint('unhandled ASS tag=$tag'); + } + } + }); + }); + if (i != text.length) { + final spanText = extraStyle.drawingPaths?.isNotEmpty == true ? null : _replaceChars(text.substring(i)); + spans.add( + StyledSubtitleSpan( + textSpan: TextSpan( + text: spanText, + style: textStyle, + ), + extraStyle: extraStyle, + ), + ); + } + return line; + } + + static SubtitleStyle _copyWithAlignment(Alignment? alignment, SubtitleStyle extraStyle) { + if (alignment == null) return extraStyle; + + var hAlign = TextAlign.center; + var vAlign = TextAlignVertical.bottom; + if (alignment.x < 0) { + hAlign = TextAlign.left; + } else if (alignment.x > 0) { + hAlign = TextAlign.right; + } + if (alignment.y < 0) { + vAlign = TextAlignVertical.top; + } else if (alignment.y == 0) { + vAlign = TextAlignVertical.center; + } + return extraStyle.copyWith( + hAlign: hAlign, + vAlign: vAlign, + ); + } + + static String _replaceChars(String text) => text.replaceAll(r'\h', UniChars.noBreakSpace).replaceAll(r'\N', '\n'); + + static int? _parseAlpha(String param) { + final match = alphaPattern.firstMatch(param); + if (match != null) { + final as = match.group(1); + final ai = as != null ? int.tryParse(as, radix: 16) : null; + if (ai != null) { + return 0xFF - ai; + } + } + return null; + } + + static Color? _parseColor(String param) { + final match = colorPattern.firstMatch(param); + if (match != null) { + final bs = match.group(1); + final gs = match.group(2); + final rs = match.group(3); + final rgb = int.tryParse('ff$rs$gs$bs', radix: 16); + if (rgb != null) { + return Color(rgb); + } + } + return null; + } + + static FontWeight? _parseFontWeight(String param) { + switch (int.tryParse(param)) { + case 0: + return FontWeight.normal; + case 1: + return FontWeight.bold; + case 100: + return FontWeight.w100; + case 200: + return FontWeight.w200; + case 300: + return FontWeight.w300; + case 400: + return FontWeight.w400; + case 500: + return FontWeight.w500; + case 600: + return FontWeight.w600; + case 700: + return FontWeight.w700; + case 800: + return FontWeight.w800; + case 900: + return FontWeight.w900; + default: + return null; + } + } + + static Alignment? _parseNewAlignment(String param) { + switch (int.tryParse(param)) { + case 1: + return Alignment.bottomLeft; + case 2: + return Alignment.bottomCenter; + case 3: + return Alignment.bottomRight; + case 4: + return Alignment.centerLeft; + case 5: + return Alignment.center; + case 6: + return Alignment.centerRight; + case 7: + return Alignment.topLeft; + case 8: + return Alignment.topCenter; + case 9: + return Alignment.topRight; + default: + return null; + } + } + + static Alignment? _parseLegacyAlignment(String param) { + switch (int.tryParse(param)) { + case 1: + return Alignment.bottomLeft; + case 2: + return Alignment.bottomCenter; + case 3: + return Alignment.bottomRight; + case 5: + return Alignment.topLeft; + case 6: + return Alignment.topCenter; + case 7: + return Alignment.topRight; + case 9: + return Alignment.centerLeft; + case 10: + return Alignment.center; + case 11: + return Alignment.centerRight; + default: + return null; + } + } + + static List<Path> _parsePaths(String commands, int scale) { + final paths = <Path>[]; + Path? path; + pathPattern.allMatches(commands).forEach((match) { + if (match.groupCount == 2) { + final command = match.group(1)!; + final params = match.group(2)!.trim().split(' ').map(double.tryParse).nonNulls.map((v) => v / scale).toList(); + switch (command) { + case 'b': + if (path != null) { + const bParamCount = 6; + final steps = (params.length / bParamCount).floor(); + for (var i = 0; i < steps; i++) { + final points = params.skip(i * bParamCount).take(bParamCount).toList(); + path!.cubicTo(points[0], points[1], points[2], points[3], points[4], points[5]); + } + } + case 'c': + if (path != null) { + path!.close(); + } + path = null; + case 'l': + if (path != null) { + const lParamCount = 2; + final steps = (params.length / lParamCount).floor(); + for (var i = 0; i < steps; i++) { + final points = params.skip(i * lParamCount).take(lParamCount).toList(); + path!.lineTo(points[0], points[1]); + } + } + case 'm': + if (params.length == 2) { + if (path != null) { + path!.close(); + } + path = Path(); + paths.add(path!); + path!.moveTo(params[0], params[1]); + } + case 'n': + if (params.length == 2 && path != null) { + path!.moveTo(params[0], params[1]); + } + case 's': + case 'p': + debugPrint('unhandled ASS drawing command=$command'); + } + } + }); + if (path != null) { + path!.close(); + } + return paths; + } + + static List<Path>? _parseClip(String param) { + List<Path>? paths; + final match = multiParamPattern.firstMatch(param); + if (match != null) { + final g = match.group(1); + if (g != null) { + final params = g.split(','); + if (params.length == 4) { + final points = params.map(double.tryParse).nonNulls.toList(); + if (points.length == 4) { + paths = [ + Path()..addRect( + Rect.fromPoints( + Offset(points[0], points[1]), + Offset(points[2], points[3]), + ), + ), + ]; + } + } else { + int? scale; + String? commands; + if (params.length == 1) { + scale = 1; + commands = params[0]; + } else if (params.length == 2) { + scale = int.tryParse(params[0]); + commands = params[1]; + } + if (scale != null && commands != null) { + paths = _parsePaths(commands, scale); + } + } + } + } + return paths; + } +} diff --git a/lib/widgets/viewer/visual/video/subtitle/line.dart b/lib/widgets/viewer/visual/video/subtitle/line.dart new file mode 100644 index 0000000..f7a213b --- /dev/null +++ b/lib/widgets/viewer/visual/video/subtitle/line.dart @@ -0,0 +1,40 @@ +import 'package:aves/widgets/viewer/visual/video/subtitle/span.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +@immutable +class StyledSubtitleLine extends Equatable with Diagnosticable { + final List<StyledSubtitleSpan> spans; + final List<Path>? clip; + final Offset? position; + + @override + List<Object?> get props => [spans, clip, position]; + + const StyledSubtitleLine({ + required this.spans, + this.clip, + this.position, + }); + + StyledSubtitleLine copyWith({ + List<StyledSubtitleSpan>? spans, + List<Path>? clip, + Offset? position, + }) { + return StyledSubtitleLine( + spans: spans ?? this.spans, + clip: clip ?? this.clip, + position: position ?? this.position, + ); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DiagnosticsProperty<List<StyledSubtitleSpan>>('spans', spans)); + properties.add(DiagnosticsProperty<List<Path>>('clip', clip)); + properties.add(DiagnosticsProperty<Offset>('position', position)); + } +} diff --git a/lib/widgets/viewer/visual/video/subtitle/span.dart b/lib/widgets/viewer/visual/video/subtitle/span.dart new file mode 100644 index 0000000..0f58705 --- /dev/null +++ b/lib/widgets/viewer/visual/video/subtitle/span.dart @@ -0,0 +1,35 @@ +import 'package:aves/widgets/viewer/visual/video/subtitle/style.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +@immutable +class StyledSubtitleSpan extends Equatable with Diagnosticable { + final TextSpan textSpan; + final SubtitleStyle extraStyle; + + @override + List<Object?> get props => [textSpan, extraStyle]; + + const StyledSubtitleSpan({ + required this.textSpan, + required this.extraStyle, + }); + + StyledSubtitleSpan copyWith({ + TextSpan? textSpan, + SubtitleStyle? extraStyle, + }) { + return StyledSubtitleSpan( + textSpan: textSpan ?? this.textSpan, + extraStyle: extraStyle ?? this.extraStyle, + ); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DiagnosticsProperty<TextSpan>('textSpan', textSpan)); + properties.add(DiagnosticsProperty<SubtitleStyle>('extraStyle', extraStyle)); + } +} diff --git a/lib/widgets/viewer/visual/video/subtitle/style.dart b/lib/widgets/viewer/visual/video/subtitle/style.dart new file mode 100644 index 0000000..7bb1e20 --- /dev/null +++ b/lib/widgets/viewer/visual/video/subtitle/style.dart @@ -0,0 +1,101 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +@immutable +class SubtitleStyle extends Equatable with Diagnosticable { + final TextAlign? hAlign; + final TextAlignVertical? vAlign; + final Color? borderColor; + final double? borderWidth, edgeBlur, rotationX, rotationY, rotationZ, scaleX, scaleY, shearX, shearY; + final List<Path>? drawingPaths; + + bool get rotating => (rotationX ?? 0) != 0 || (rotationY ?? 0) != 0 || (rotationZ ?? 0) != 0; + + bool get scaling => (scaleX ?? 1) != 1 || (scaleY ?? 1) != 1; + + bool get shearing => (shearX ?? 0) != 0 || (shearY ?? 0) != 0; + + @override + List<Object?> get props => [ + hAlign, + vAlign, + borderColor, + borderWidth, + edgeBlur, + rotationX, + rotationY, + rotationZ, + scaleX, + scaleY, + shearX, + shearY, + drawingPaths?.length, + ]; + + const SubtitleStyle({ + this.hAlign, + this.vAlign, + this.borderColor, + this.borderWidth, + this.edgeBlur, + this.rotationX, + this.rotationY, + this.rotationZ, + this.scaleX, + this.scaleY, + this.shearX, + this.shearY, + this.drawingPaths, + }); + + SubtitleStyle copyWith({ + TextAlign? hAlign, + TextAlignVertical? vAlign, + Color? borderColor, + double? borderWidth, + double? edgeBlur, + double? rotationX, + double? rotationY, + double? rotationZ, + double? scaleX, + double? scaleY, + double? shearX, + double? shearY, + List<Path>? drawingPaths, + }) { + return SubtitleStyle( + hAlign: hAlign ?? this.hAlign, + vAlign: vAlign ?? this.vAlign, + borderColor: borderColor ?? this.borderColor, + borderWidth: borderWidth ?? this.borderWidth, + edgeBlur: edgeBlur ?? this.edgeBlur, + rotationX: rotationX ?? this.rotationX, + rotationY: rotationY ?? this.rotationY, + rotationZ: rotationZ ?? this.rotationZ, + scaleX: scaleX ?? this.scaleX, + scaleY: scaleY ?? this.scaleY, + shearX: shearX ?? this.shearX, + shearY: shearY ?? this.shearY, + drawingPaths: drawingPaths ?? this.drawingPaths, + ); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(EnumProperty<TextAlign>('hAlign', hAlign)); + properties.add(DiagnosticsProperty<TextAlignVertical>('vAlign', vAlign)); + properties.add(ColorProperty('borderColor', borderColor)); + properties.add(DoubleProperty('borderWidth', borderWidth)); + properties.add(DoubleProperty('edgeBlur', edgeBlur)); + properties.add(DoubleProperty('rotationX', rotationX)); + properties.add(DoubleProperty('rotationY', rotationY)); + properties.add(DoubleProperty('rotationZ', rotationZ)); + properties.add(DoubleProperty('scaleX', scaleX)); + properties.add(DoubleProperty('scaleY', scaleY)); + properties.add(DoubleProperty('shearX', shearX)); + properties.add(DoubleProperty('shearY', shearY)); + properties.add(DiagnosticsProperty<List<Path>>('drawingPaths', drawingPaths)); + } +} diff --git a/lib/widgets/viewer/visual/video/subtitle/subtitle.dart b/lib/widgets/viewer/visual/video/subtitle/subtitle.dart new file mode 100644 index 0000000..bfac173 --- /dev/null +++ b/lib/widgets/viewer/visual/video/subtitle/subtitle.dart @@ -0,0 +1,341 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/settings/enums/subtitle_position.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/viewer/view_state.dart'; +import 'package:aves/widgets/common/basic/text/background_painter.dart'; +import 'package:aves/widgets/common/basic/text/outlined.dart'; +import 'package:aves/widgets/viewer/visual/video/subtitle/ass_parser.dart'; +import 'package:aves/widgets/viewer/visual/video/subtitle/span.dart'; +import 'package:aves/widgets/viewer/visual/video/subtitle/style.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:latlong2/latlong.dart' as angles; +import 'package:provider/provider.dart'; + +class VideoSubtitles extends StatelessWidget { + final AvesEntry entry; + final AvesVideoController controller; + final ValueNotifier<ViewState> viewStateNotifier; + final bool debugMode; + + static const baseShadowOffset = Offset(1, 1); + + const VideoSubtitles({ + super.key, + required this.entry, + required this.controller, + required this.viewStateNotifier, + this.debugMode = false, + }); + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder<double?>( + valueListenable: controller.sarNotifier, + builder: (context, sar, child) { + final videoDisplaySize = entry.videoDisplaySize(sar); + + return IgnorePointer( + child: Consumer<Settings>( + builder: (context, settings, child) { + final baseTextAlign = settings.subtitleTextAlignment; + final baseTextAlignY = settings.subtitleTextPosition.toTextAlignVertical(); + final baseOutlineWidth = settings.subtitleShowOutline ? 1 : 0; + final baseOutlineColor = Colors.black.withValues(alpha: settings.subtitleTextColor.a); + final baseShadows = [ + Shadow( + color: baseOutlineColor, + offset: baseShadowOffset, + ), + ]; + final baseStyle = TextStyle( + color: settings.subtitleTextColor, + fontSize: settings.subtitleFontSize, + shadows: settings.subtitleShowOutline ? baseShadows : null, + ); + + final viewportSize = MediaQuery.sizeOf(context); + final isPortrait = MediaQuery.orientationOf(context) == Orientation.portrait; + final bottom = isPortrait ? .5 : .8; + return ValueListenableBuilder<ViewState>( + valueListenable: viewStateNotifier, + builder: (context, viewState, child) { + final viewPosition = viewState.position; + final viewScale = viewState.scale ?? 1; + final viewSize = videoDisplaySize * viewScale; + final viewOffset = Offset( + (viewportSize.width - viewSize.width) / 2, + (viewportSize.height - viewSize.height) / 2, + ); + + return StreamBuilder<String?>( + stream: controller.timedTextStream, + builder: (context, snapshot) { + final text = snapshot.data; + if (text == null) return const SizedBox(); + + if (debugMode) { + return Padding( + padding: const EdgeInsets.only(top: 100.0), + child: Align( + alignment: Alignment.topLeft, + child: OutlinedText( + textSpans: [ + TextSpan( + text: text, + style: const TextStyle(fontSize: 14), + ), + ], + outlineWidth: 1, + outlineColor: Colors.black, + ), + ), + ); + } + + final styledLine = AssParser.parse(text, baseStyle, viewScale); + final position = styledLine.position; + final clip = styledLine.clip; + final styledSpans = styledLine.spans; + final byExtraStyle = groupBy<StyledSubtitleSpan, SubtitleStyle>(styledSpans, (v) => v.extraStyle); + return Stack( + children: byExtraStyle.entries.map((kv) { + final extraStyle = kv.key; + final spans = kv.value.map((v) { + final span = v.textSpan; + final style = span.style; + if (position == null || style == null) return span; + + final letterSpacing = style.letterSpacing; + final shadows = style.shadows; + return TextSpan( + text: span.text, + style: style.copyWith( + letterSpacing: letterSpacing != null ? letterSpacing * viewScale : null, + shadows: shadows + ?.map( + (v) => Shadow( + color: v.color, + offset: v.offset * viewScale, + blurRadius: v.blurRadius * viewScale, + ), + ) + .toList(), + ), + ); + }).toList(); + final drawingPaths = extraStyle.drawingPaths; + final textHAlign = extraStyle.hAlign ?? (position != null ? TextAlign.center : baseTextAlign); + final textVAlign = extraStyle.vAlign ?? (position != null ? TextAlignVertical.bottom : baseTextAlignY); + + Widget child; + if (drawingPaths != null) { + child = CustomPaint( + painter: SubtitlePathPainter( + paths: drawingPaths, + scale: viewScale, + fillColor: spans.firstOrNull?.style?.color ?? Colors.white, + strokeColor: extraStyle.borderColor, + ), + ); + } else { + final outlineWidth = extraStyle.borderWidth ?? (extraStyle.edgeBlur != null ? 2 : 1); + child = OutlinedText( + textSpans: spans, + outlineWidth: outlineWidth * (position != null ? viewScale : baseOutlineWidth), + outlineColor: extraStyle.borderColor ?? baseOutlineColor, + outlineBlurSigma: extraStyle.edgeBlur ?? 0, + textAlign: textHAlign, + ); + } + + var transform = Matrix4.identity(); + + if (position != null) { + final paragraph = RenderParagraph( + TextSpan(children: spans), + textDirection: TextDirection.ltr, + textScaler: MediaQuery.textScalerOf(context), + )..layout(const BoxConstraints()); + final textWidth = paragraph.getMaxIntrinsicWidth(double.infinity); + final textHeight = paragraph.getMaxIntrinsicHeight(double.infinity); + paragraph.dispose(); + + late double anchorOffsetX, anchorOffsetY; + switch (textHAlign) { + case TextAlign.left: + anchorOffsetX = 0; + case TextAlign.right: + anchorOffsetX = -textWidth; + case TextAlign.center: + default: + anchorOffsetX = -textWidth / 2; + } + switch (textVAlign) { + case TextAlignVertical.top: + anchorOffsetY = 0; + case TextAlignVertical.center: + anchorOffsetY = -textHeight / 2; + case TextAlignVertical.bottom: + anchorOffsetY = -textHeight; + } + final alignOffset = Offset(anchorOffsetX, anchorOffsetY); + final lineOffset = position * viewScale + viewPosition; + final translateOffset = viewOffset + lineOffset + alignOffset; + transform.translateByDouble(translateOffset.dx, translateOffset.dy, 0, 1); + } + + if (extraStyle.rotating) { + // for perspective + transform.setEntry(3, 2, 0.001); + final x = -angles.degToRadian(extraStyle.rotationX ?? 0); + final y = -angles.degToRadian(extraStyle.rotationY ?? 0); + final z = -angles.degToRadian(extraStyle.rotationZ ?? 0); + if (x != 0) transform.rotateX(x); + if (y != 0) transform.rotateY(y); + if (z != 0) transform.rotateZ(z); + } + if (extraStyle.scaling) { + final x = extraStyle.scaleX ?? 1; + final y = extraStyle.scaleY ?? 1; + transform.scaleByDouble(x, y, x, 1); + } + if (extraStyle.shearing) { + final x = extraStyle.shearX ?? 0; + final y = extraStyle.shearY ?? 0; + transform.multiply(Matrix4(1, y, 0, 0, x, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)); + } + + if (!transform.isIdentity()) { + child = Transform( + transform: transform, + alignment: Alignment.center, + child: child, + ); + } + + if (position == null) { + late double alignX; + switch (textHAlign) { + case TextAlign.left: + alignX = -1; + case TextAlign.right: + alignX = 1; + case TextAlign.center: + default: + alignX = 0; + } + late double alignY; + switch (textVAlign) { + case TextAlignVertical.top: + alignY = -bottom; + case TextAlignVertical.center: + alignY = 0; + case TextAlignVertical.bottom: + default: + alignY = bottom; + } + child = Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Align( + alignment: Alignment(alignX, alignY), + child: TextBackgroundPainter( + spans: spans, + style: DefaultTextStyle.of(context).style.merge( + spans.first.style!.copyWith( + backgroundColor: settings.subtitleBackgroundColor, + ), + ), + textAlign: textHAlign, + child: child, + ), + ), + ); + } + + if (clip != null) { + final clipOffset = viewOffset + viewPosition; + final matrix = Matrix4.identity() + ..translateByDouble(clipOffset.dx, clipOffset.dy, 0, 1) + ..scaleByDouble(viewScale, viewScale, viewScale, 1); + final transform = matrix.storage; + child = ClipPath( + clipper: SubtitlePathClipper( + paths: clip.map((v) => v.transform(transform)).toList(), + scale: viewScale, + ), + child: child, + ); + } + + return child; + }).toList(), + ); + }, + ); + }, + ); + }, + ), + ); + }, + ); + } +} + +class SubtitlePathPainter extends CustomPainter { + final List<Path> paths; + final double scale; + final Paint? fillPaint, strokePaint; + + SubtitlePathPainter({ + required this.paths, + required this.scale, + required Color? fillColor, + required Color? strokeColor, + }) : fillPaint = fillColor != null + ? (Paint() + ..style = PaintingStyle.fill + ..color = fillColor) + : null, + strokePaint = strokeColor != null + ? (Paint() + ..style = PaintingStyle.stroke + ..color = strokeColor) + : null; + + @override + void paint(Canvas canvas, Size size) { + canvas.scale(scale, scale); + paths.forEach((path) { + if (fillPaint != null) { + canvas.drawPath(path, fillPaint!); + } + if (strokePaint != null) { + canvas.drawPath(path, strokePaint!); + } + }); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => true; +} + +class SubtitlePathClipper extends CustomClipper<Path> { + final List<Path> paths; + final double scale; + + const SubtitlePathClipper({ + required this.paths, + required this.scale, + }); + + @override + Path getClip(Size size) => paths.firstOrNull ?? Path(); + + @override + bool shouldReclip(covariant CustomClipper<Path> oldClipper) => true; +} diff --git a/lib/widgets/viewer/visual/video/swipe_action.dart b/lib/widgets/viewer/visual/video/swipe_action.dart new file mode 100644 index 0000000..fce8a78 --- /dev/null +++ b/lib/widgets/viewer/visual/video/swipe_action.dart @@ -0,0 +1,137 @@ +import 'dart:async'; + +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:decorated_icon/decorated_icon.dart'; +import 'package:flutter/material.dart'; +import 'package:volume_controller/volume_controller.dart'; + +enum SwipeAction { brightness, volume } + +extension ExtraSwipeAction on SwipeAction { + Future<double> get() { + switch (this) { + case SwipeAction.brightness: + return AvesApp.screenBrightness?.application ?? Future.value(1); + case SwipeAction.volume: + return VolumeController.instance.getVolume(); + } + } + + Future<void> set(double value) async { + switch (this) { + case SwipeAction.brightness: + await AvesApp.screenBrightness?.setApplicationScreenBrightness(value); + case SwipeAction.volume: + VolumeController.instance.showSystemUI = false; + await VolumeController.instance.setVolume(value); + } + } +} + +class SwipeActionFeedback extends StatelessWidget { + final SwipeAction action; + final ValueNotifier<double?> valueNotifier; + + const SwipeActionFeedback({ + super.key, + required this.action, + required this.valueNotifier, + }); + + static const double width = 32; + static const double height = 160; + static const Radius radius = Radius.circular(width / 2); + static const double borderWidth = 2; + static const Color borderColor = Colors.white; + static final Color fillColor = Colors.white.withValues(alpha: .8); + static final Color backgroundColor = Colors.black.withValues(alpha: .2); + static final Color innerBorderColor = Colors.black.withValues(alpha: .5); + static const Color iconColor = Colors.white; + static const Color shadowColor = Colors.black; + + @override + Widget build(BuildContext context) { + return Center( + child: ValueListenableBuilder<double?>( + valueListenable: valueNotifier, + builder: (context, value, child) { + if (value == null) return const SizedBox(); + + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildIcon(_getMaxIcon()), + Container( + decoration: BoxDecoration( + color: backgroundColor, + border: Border.all( + width: borderWidth * 2, + color: innerBorderColor, + ), + borderRadius: const BorderRadius.all(radius), + ), + foregroundDecoration: BoxDecoration( + border: Border.all( + color: borderColor, + width: borderWidth, + ), + borderRadius: const BorderRadius.all(radius), + ), + width: width, + height: height, + child: ClipRRect( + borderRadius: const BorderRadius.all(radius), + child: Align( + alignment: Alignment.bottomCenter, + child: Container( + color: fillColor, + width: width, + height: height * value, + ), + ), + ), + ), + _buildIcon(_getMinIcon()), + ], + ); + }, + ), + ); + } + + Widget _buildIcon(IconData icon) { + return Padding( + padding: const EdgeInsets.all(16), + child: DecoratedIcon( + icon, + size: width, + color: iconColor, + shadows: const [ + Shadow( + color: shadowColor, + blurRadius: 4, + ), + ], + ), + ); + } + + IconData _getMinIcon() { + switch (action) { + case SwipeAction.brightness: + return AIcons.brightnessMin; + case SwipeAction.volume: + return AIcons.volumeMin; + } + } + + IconData _getMaxIcon() { + switch (action) { + case SwipeAction.brightness: + return AIcons.brightnessMax; + case SwipeAction.volume: + return AIcons.volumeMax; + } + } +} diff --git a/lib/widgets/viewer/visual/video/video_view.dart b/lib/widgets/viewer/visual/video/video_view.dart new file mode 100644 index 0000000..c06c060 --- /dev/null +++ b/lib/widgets/viewer/visual/video/video_view.dart @@ -0,0 +1,61 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:flutter/material.dart'; + +class VideoView extends StatefulWidget { + final AvesEntry entry; + final AvesVideoController controller; + + const VideoView({ + super.key, + required this.entry, + required this.controller, + }); + + @override + State<StatefulWidget> createState() => _VideoViewState(); +} + +class _VideoViewState extends State<VideoView> { + AvesEntry get entry => widget.entry; + + AvesVideoController get controller => widget.controller; + + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant VideoView oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(VideoView widget) { + widget.controller.playCompletedListenable.addListener(_onPlayCompleted); + } + + void _unregisterWidget(VideoView widget) { + widget.controller.playCompletedListenable.removeListener(_onPlayCompleted); + } + + @override + Widget build(BuildContext context) { + return StreamBuilder<VideoStatus>( + stream: controller.statusStream, + builder: (context, snapshot) => controller.isReady ? controller.buildPlayerWidget(context) : const SizedBox(), + ); + } + + // not called when looping + void _onPlayCompleted() => controller.seekTo(0); +} diff --git a/lib/widgets/wallpaper_page.dart b/lib/widgets/wallpaper_page.dart new file mode 100644 index 0000000..37cf2fa --- /dev/null +++ b/lib/widgets/wallpaper_page.dart @@ -0,0 +1,282 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/multipage.dart'; +import 'package:aves/model/entry/extensions/props.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves/widgets/common/basic/insets.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/theme.dart'; +import 'package:aves/widgets/viewer/action/video_action_delegate.dart'; +import 'package:aves/widgets/viewer/controls/controller.dart'; +import 'package:aves/widgets/viewer/controls/notifications.dart'; +import 'package:aves/widgets/viewer/entry_horizontal_pager.dart'; +import 'package:aves/widgets/viewer/multipage/conductor.dart'; +import 'package:aves/widgets/viewer/overlay/bottom.dart'; +import 'package:aves/widgets/viewer/overlay/video/video.dart'; +import 'package:aves/widgets/viewer/page_entry_builder.dart'; +import 'package:aves/widgets/viewer/providers.dart'; +import 'package:aves/widgets/viewer/video/conductor.dart'; +import 'package:aves/widgets/viewer/visual/controller_mixin.dart'; +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class WallpaperPage extends StatelessWidget { + static const routeName = '/set_wallpaper'; + + final AvesEntry? entry; + + const WallpaperPage({ + super.key, + required this.entry, + }); + + @override + Widget build(BuildContext context) { + return AvesScaffold( + body: entry != null + ? MultiProvider( + providers: [ + ViewStateConductorProvider(), + VideoConductorProvider(), + MultiPageConductorProvider(), + ], + child: EntryEditor( + entry: entry!, + ), + ) + : const SizedBox(), + backgroundColor: Theme.of(context).isDark ? Colors.black : Colors.white, + resizeToAvoidBottomInset: false, + ); + } +} + +class EntryEditor extends StatefulWidget { + final AvesEntry entry; + + const EntryEditor({ + super.key, + required this.entry, + }); + + @override + State<EntryEditor> createState() => _EntryEditorState(); +} + +class _EntryEditorState extends State<EntryEditor> with EntryViewControllerMixin, SingleTickerProviderStateMixin { + final ValueNotifier<bool> _overlayVisible = ValueNotifier(true); + late AnimationController _overlayAnimationController; + late CurvedAnimation _overlayVideoControlScale; + EdgeInsets? _frozenViewInsets, _frozenViewPadding; + late VideoActionDelegate _videoActionDelegate; + late final ViewerController _viewerController; + + @override + bool get isViewingImage => true; + + @override + final ValueNotifier<AvesEntry?> entryNotifier = ValueNotifier(null); + + AvesEntry get entry => widget.entry; + + @override + void initState() { + super.initState(); + if (settings.maxBrightness == MaxBrightness.viewerOnly) { + AvesApp.screenBrightness?.setApplicationScreenBrightness(1); + } + if (settings.keepScreenOn == KeepScreenOn.viewerOnly) { + windowService.keepScreenOn(true); + } + + entryNotifier.value = entry; + _overlayAnimationController = AnimationController( + duration: context.read<DurationsData>().viewerOverlayAnimation, + vsync: this, + ); + _overlayVideoControlScale = CurvedAnimation( + parent: _overlayAnimationController, + // no bounce at the bottom, to avoid video controller displacement + curve: Curves.easeOutQuad, + ); + _overlayVisible.addListener(_onOverlayVisibleChanged); + _videoActionDelegate = VideoActionDelegate( + collection: null, + ); + + _viewerController = ViewerController( + initialScale: const ScaleLevel(ref: ScaleReference.covered), + ); + initEntryControllers(entry); + _onOverlayVisibleChanged(); + } + + @override + void dispose() { + cleanEntryControllers(entry); + _overlayVisible.dispose(); + _overlayVideoControlScale.dispose(); + _overlayAnimationController.dispose(); + _videoActionDelegate.dispose(); + _viewerController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return NotificationListener( + onNotification: (dynamic notification) { + if (notification is ToggleOverlayNotification) { + _overlayVisible.value = notification.visible ?? !_overlayVisible.value; + } else if (notification is VideoActionNotification) { + _onVideoAction( + context: context, + entry: notification.entry, + controller: notification.controller, + action: notification.action, + ); + } + return true; + }, + child: LayoutBuilder( + builder: (context, constraints) { + final viewSize = Size(constraints.maxWidth, constraints.maxHeight); + return Stack( + children: [ + SingleEntryScroller( + entry: entry, + viewerController: _viewerController, + ), + Positioned( + bottom: 0, + child: _buildBottomOverlay(viewSize), + ), + const TopGestureAreaProtector(), + const SideGestureAreaProtector(), + const BottomGestureAreaProtector(), + ], + ); + }, + ), + ); + } + + Widget _buildBottomOverlay(Size viewSize) { + final mainEntry = entry; + final multiPageController = mainEntry.isMultiPage ? context.read<MultiPageConductor>().getController(mainEntry) : null; + + Widget? _buildExtraBottomOverlay({AvesEntry? pageEntry}) { + final targetEntry = pageEntry ?? mainEntry; + Widget? child; + // a 360 video is both a video and a panorama but only the video controls are displayed + if (targetEntry.isPureVideo) { + child = Selector<VideoConductor, AvesVideoController?>( + selector: (context, vc) => vc.getController(targetEntry), + builder: (context, videoController, child) => VideoControlOverlay( + entry: targetEntry, + controller: videoController, + scale: _overlayVideoControlScale, + onActionSelected: (action) => _onVideoAction( + context: context, + entry: targetEntry, + controller: videoController, + action: action, + ), + ), + ); + } + return child != null + ? ExtraBottomOverlay( + viewInsets: _frozenViewInsets, + viewPadding: _frozenViewPadding, + child: child, + ) + : null; + } + + final extraBottomOverlay = mainEntry.isMultiPage + ? PageEntryBuilder( + multiPageController: multiPageController, + builder: (pageEntry) => _buildExtraBottomOverlay(pageEntry: pageEntry) ?? const SizedBox(), + ) + : _buildExtraBottomOverlay(); + + final child = TooltipTheme( + data: TooltipTheme.of(context).copyWith( + preferBelow: false, + ), + child: Column( + children: [ + ?extraBottomOverlay, + ViewerBottomOverlay( + entries: [widget.entry], + index: 0, + collection: null, + animationController: _overlayAnimationController, + availableSize: viewSize, + viewInsets: _frozenViewInsets, + viewPadding: _frozenViewPadding, + multiPageController: multiPageController, + ), + ], + ), + ); + + return ValueListenableBuilder<double>( + valueListenable: _overlayAnimationController, + builder: (context, animation, child) { + return Visibility( + visible: !_overlayAnimationController.isDismissed, + child: child!, + ); + }, + child: child, + ); + } + + void _onVideoAction({ + required BuildContext context, + required AvesEntry entry, + required AvesVideoController? controller, + required EntryAction action, + }) { + if (controller != null) { + _videoActionDelegate.onActionSelected(context, entry, controller, action); + } + } + + // overlay + + Future<void> _onOverlayVisibleChanged({bool animate = true}) async { + if (_overlayVisible.value) { + await AvesApp.showSystemUI(); + AvesApp.setSystemUIStyle(Theme.of(context)); + if (animate) { + await _overlayAnimationController.forward(); + } else { + _overlayAnimationController.value = _overlayAnimationController.upperBound; + } + } else { + final mediaQuery = context.read<MediaQueryData>(); + setState(() { + _frozenViewInsets = mediaQuery.viewInsets; + _frozenViewPadding = mediaQuery.viewPadding; + }); + await AvesApp.hideSystemUI(); + if (animate) { + await _overlayAnimationController.reverse(); + } else { + _overlayAnimationController.reset(); + } + setState(() { + _frozenViewInsets = null; + _frozenViewPadding = null; + }); + } + } +} diff --git a/lib/widgets/welcome_page.dart b/lib/widgets/welcome_page.dart new file mode 100644 index 0000000..42ddcee --- /dev/null +++ b/lib/widgets/welcome_page.dart @@ -0,0 +1,259 @@ +import 'package:aves/app_flavor.dart'; +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; +import 'package:aves/widgets/about/policy_page.dart'; +import 'package:aves/widgets/common/basic/link_chip.dart'; +import 'package:aves/widgets/common/basic/markdown_container.dart'; +import 'package:aves/widgets/common/basic/scaffold.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_logo.dart'; +import 'package:aves/widgets/common/identity/buttons/outlined_button.dart'; +import 'package:aves/widgets/home/home_page.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:provider/provider.dart'; + +class WelcomePage extends StatefulWidget { + const WelcomePage({super.key}); + + @override + State<WelcomePage> createState() => _WelcomePageState(); +} + +class _WelcomePageState extends State<WelcomePage> { + bool _hasAcceptedTerms = false; + late Future<String> _termsLoader; + + static const termsPath = 'assets/terms.md'; + static const termsDirection = TextDirection.ltr; + + @override + void initState() { + super.initState(); + _termsLoader = rootBundle.loadString(termsPath); + WidgetsBinding.instance.addPostFrameCallback((_) => _initWelcomeSettings()); + } + + void _initWelcomeSettings() { + // this should be done outside of `initState`/`build` + settings.setContextualDefaults(context.read<AppFlavor>()); + // explicitly set consent values to current defaults + // so they are not subject to future default changes + settings.isInstalledAppAccessAllowed = SettingsDefaults.isInstalledAppAccessAllowed; + settings.isErrorReportingAllowed = SettingsDefaults.isErrorReportingAllowed; + } + + @override + Widget build(BuildContext context) { + return AvesScaffold( + body: SafeArea( + child: Center( + child: FutureBuilder<String>( + future: _termsLoader, + builder: (context, snapshot) { + if (snapshot.hasError || snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final terms = snapshot.data!; + final durations = context.watch<DurationsData>(); + final isPortrait = MediaQuery.orientationOf(context) == Orientation.portrait; + return Column( + mainAxisSize: MainAxisSize.min, + children: _toStaggeredList( + duration: durations.staggeredAnimation, + delay: durations.staggeredAnimationDelay * timeDilation, + childAnimationBuilder: (child) => SlideAnimation( + verticalOffset: 50.0, + child: FadeInAnimation( + child: child, + ), + ), + children: settings.useTvLayout + ? [ + ..._buildHeader(context, isPortrait: isPortrait), + Padding( + padding: const EdgeInsets.all(16), + child: LinkChip( + leading: const Icon( + AIcons.privacy, + size: 22, + ), + text: context.l10n.aboutLinkPolicy, + textStyle: Theme.of(context).textTheme.titleLarge, + onTap: _goToPolicyPage, + ), + ), + ..._buildControls(context), + ] + : [ + ..._buildHeader(context, isPortrait: isPortrait), + if (isPortrait) ...[ + Flexible( + child: MarkdownContainer( + data: terms, + textDirection: termsDirection, + ), + ), + const SizedBox(height: 16), + ..._buildControls(context), + ] else + Flexible( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Flexible( + child: Padding( + padding: const EdgeInsets.only(bottom: 8), + child: MarkdownContainer( + data: terms, + textDirection: termsDirection, + ), + ), + ), + Flexible( + child: ListView( + shrinkWrap: true, + children: _buildControls(context), + ), + ), + ], + ), + ), + ], + ), + ); + }, + ), + ), + ), + ); + } + + List<Widget> _buildHeader(BuildContext context, {required bool isPortrait}) { + final message = Text( + context.l10n.welcomeMessage, + style: Theme.of(context).textTheme.headlineSmall, + ); + final double padding = isPortrait ? 16.0 : 8.0; + return [ + SizedBox(height: padding), + ...(isPortrait + ? [ + const AvesLogo(size: 64), + const SizedBox(height: 16), + message, + ] + : [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + const AvesLogo(size: 48), + const SizedBox(width: 16), + message, + ], + ), + ]), + SizedBox(height: padding), + ]; + } + + List<Widget> _buildControls(BuildContext context) { + final l10n = context.l10n; + final canEnableErrorReporting = context.select<AppFlavor, bool>((v) => v.canEnableErrorReporting); + const contentPadding = EdgeInsets.symmetric(horizontal: 8); + final switches = ConstrainedBox( + constraints: const BoxConstraints(maxWidth: MarkdownContainer.mobileMaxWidth), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SwitchListTile( + key: const Key('apps-checkbox'), + value: settings.isInstalledAppAccessAllowed, + onChanged: (v) => setState(() => settings.isInstalledAppAccessAllowed = v), + title: Text(l10n.settingsAllowInstalledAppAccess), + subtitle: Text([l10n.welcomeOptional, l10n.settingsAllowInstalledAppAccessSubtitle].join(AText.separator)), + contentPadding: contentPadding, + ), + if (canEnableErrorReporting) + SwitchListTile( + value: settings.isErrorReportingAllowed, + onChanged: (v) => setState(() => settings.isErrorReportingAllowed = v), + title: Text(l10n.settingsAllowErrorReporting), + subtitle: Text(l10n.welcomeOptional), + contentPadding: contentPadding, + ), + SwitchListTile( + // key is expected by test driver + key: const Key('terms-checkbox'), + value: _hasAcceptedTerms, + onChanged: (v) => setState(() => _hasAcceptedTerms = v), + title: Text(l10n.welcomeTermsToggle), + contentPadding: contentPadding, + ), + ], + ), + ); + + final button = AvesOutlinedButton( + // key is expected by test driver + key: const Key('continue-button'), + label: context.l10n.continueButtonLabel, + onPressed: _hasAcceptedTerms + ? () { + settings.hasAcceptedTerms = true; + Navigator.pushReplacement( + context, + MaterialPageRoute( + settings: const RouteSettings(name: HomePage.routeName), + builder: (context) => const HomePage(), + ), + ); + } + : null, + ); + + return [ + switches, + Center(child: button), + const SizedBox(height: 8), + ]; + } + + void _goToPolicyPage() { + Navigator.maybeOf(context)?.push( + MaterialPageRoute( + settings: const RouteSettings(name: PolicyPage.routeName), + builder: (context) => const PolicyPage(), + ), + ); + } + + // as of flutter_staggered_animations v0.1.2, `AnimationConfiguration.toStaggeredList` does not handle `Flexible` widgets + // so we use this workaround instead + static List<Widget> _toStaggeredList({ + required Duration duration, + required Duration delay, + required Widget Function(Widget) childAnimationBuilder, + required List<Widget> children, + }) => children + .asMap() + .map((index, widget) { + var child = widget is Flexible ? widget.child : widget; + child = AnimationConfiguration.staggeredList( + position: index, + duration: duration, + delay: delay, + child: childAnimationBuilder(child), + ); + child = widget is Flexible ? Flexible(child: child) : child; + return MapEntry( + index, + child, + ); + }) + .values + .toList(); +} diff --git a/log.sh b/log.sh new file mode 100644 index 0000000..4688fba --- /dev/null +++ b/log.sh @@ -0,0 +1 @@ +adb logcat -v time --pid=$(adb shell pidof -s deckers.thibault.aves.debug) diff --git a/logcat.sh b/logcat.sh new file mode 100644 index 0000000..bc72ddb --- /dev/null +++ b/logcat.sh @@ -0,0 +1,2 @@ +adb logcat --pid=$(adb shell pidof -s deckers.thibault.aves.debug) | grep -E \ +"Cast|cast|googlecast|MediaRoute|MediaControlChannel|MediaQueue|CastSession|CastContext|sessionManager|GCAST|CUSTOMCAST|AvesMethodChannel|AvesStreamsChannel|onCustomMessage|startCustomReceiver" diff --git a/mettere:.save b/mettere:.save new file mode 100644 index 0000000..8ba3a16 --- /dev/null +++ b/mettere:.save @@ -0,0 +1 @@ +n diff --git a/plugins/aves_magnifier/.gitignore b/plugins/aves_magnifier/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/plugins/aves_magnifier/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/plugins/aves_magnifier/.metadata b/plugins/aves_magnifier/.metadata new file mode 100644 index 0000000..b13014b --- /dev/null +++ b/plugins/aves_magnifier/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 098aac7ffeef2a1846eb3a7f14788520c8400a14 + channel: master + +project_type: package diff --git a/plugins/aves_magnifier/analysis_options.yaml b/plugins/aves_magnifier/analysis_options.yaml new file mode 100644 index 0000000..f04c6cf --- /dev/null +++ b/plugins/aves_magnifier/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/plugins/aves_magnifier/lib/aves_magnifier.dart b/plugins/aves_magnifier/lib/aves_magnifier.dart new file mode 100644 index 0000000..80a5d71 --- /dev/null +++ b/plugins/aves_magnifier/lib/aves_magnifier.dart @@ -0,0 +1,9 @@ +export 'src/controller/controller.dart'; +export 'src/controller/state.dart'; +export 'src/core/core.dart'; +export 'src/core/scale_gesture_recognizer.dart'; +export 'src/pan/gesture_detector_scope.dart'; +export 'src/pan/scroll_physics.dart'; +export 'src/scale/scale_boundaries.dart'; +export 'src/scale/scale_level.dart'; +export 'src/scale/state.dart'; diff --git a/plugins/aves_magnifier/lib/src/controller/controller.dart b/plugins/aves_magnifier/lib/src/controller/controller.dart new file mode 100644 index 0000000..d2d3695 --- /dev/null +++ b/plugins/aves_magnifier/lib/src/controller/controller.dart @@ -0,0 +1,144 @@ +import 'dart:async'; + +import 'package:aves_magnifier/src/controller/state.dart'; +import 'package:aves_magnifier/src/scale/scale_boundaries.dart'; +import 'package:aves_magnifier/src/scale/scale_level.dart'; +import 'package:aves_magnifier/src/scale/state.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +class AvesMagnifierController { + final StreamController<MagnifierState> _stateStreamController = StreamController.broadcast(); + final StreamController<ScaleBoundaries> _scaleBoundariesStreamController = StreamController.broadcast(); + final StreamController<ScaleStateChange> _scaleStateChangeStreamController = StreamController.broadcast(); + + bool _disposed = false; + late MagnifierState _currentState, initial, previousState; + ScaleBoundaries? _scaleBoundaries; + late ScaleStateChange _currentScaleState, previousScaleState; + + AvesMagnifierController({ + MagnifierState? initialState, + }) : super() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$AvesMagnifierController', + object: this, + ); + } + const source = ChangeSource.internal; + initial = initialState ?? const MagnifierState(position: Offset.zero, scale: null, source: source); + previousState = initial; + _currentState = initial; + reset(); + + const _initialScaleState = ScaleStateChange(state: ScaleState.initial, source: source); + previousScaleState = _initialScaleState; + _currentScaleState = _initialScaleState; + _setScaleState(_initialScaleState); + } + + void dispose() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + _disposed = true; + _stateStreamController.close(); + _scaleBoundariesStreamController.close(); + _scaleStateChangeStreamController.close(); + } + + Stream<MagnifierState> get stateStream => _stateStreamController.stream; + + Stream<ScaleBoundaries> get scaleBoundariesStream => _scaleBoundariesStreamController.stream; + + Stream<ScaleStateChange> get scaleStateChangeStream => _scaleStateChangeStreamController.stream; + + MagnifierState get currentState => _currentState; + + Offset get position => currentState.position; + + double? get scale => currentState.scale; + + ScaleBoundaries? get scaleBoundaries => _scaleBoundaries; + + ScaleStateChange get scaleState => _currentScaleState; + + bool get hasScaleSateChanged => previousScaleState != scaleState; + + bool get isZooming => scaleState.state == ScaleState.zoomedIn || scaleState.state == ScaleState.zoomedOut; + + void reset() => _setState(initial); + + void update({ + Offset? position, + double? scale, + required ChangeSource source, + }) { + position = position ?? this.position; + scale = scale ?? this.scale; + if (this.position == position && this.scale == scale) return; + assert((scale ?? 0) >= 0); + + previousState = currentState; + _setState(MagnifierState( + position: position, + scale: scale, + source: source, + )); + } + + void setScaleState(ScaleState newValue, ChangeSource source, {Offset? childFocalPoint}) { + if (_disposed || _currentScaleState.state == newValue) return; + + previousScaleState = _currentScaleState; + _currentScaleState = ScaleStateChange(state: newValue, source: source, childFocalPoint: childFocalPoint); + _scaleStateChangeStreamController.add(scaleState); + } + + void _setState(MagnifierState state) { + if (_disposed || _currentState == state) return; + + _currentState = state; + _stateStreamController.add(state); + } + + void setScaleBoundaries(ScaleBoundaries scaleBoundaries) { + if (_disposed || _scaleBoundaries == scaleBoundaries) return; + + _scaleBoundaries = scaleBoundaries; + _scaleBoundariesStreamController.add(scaleBoundaries); + + if (!isZooming) { + update( + scale: getScaleForScaleState(_currentScaleState.state), + source: ChangeSource.internal, + ); + } + } + + void _setScaleState(ScaleStateChange scaleState) { + if (_disposed || _currentScaleState == scaleState) return; + + _currentScaleState = scaleState; + _scaleStateChangeStreamController.add(_currentScaleState); + } + + double? getScaleForScaleState(ScaleState scaleState) { + final boundaries = scaleBoundaries; + if (boundaries == null) return null; + + switch (scaleState) { + case ScaleState.initial: + case ScaleState.zoomedIn: + case ScaleState.zoomedOut: + return boundaries.clampScale(boundaries.initialScale); + case ScaleState.covering: + return boundaries.clampScale(ScaleLevel.scaleForCovering(boundaries.viewportSize, boundaries.contentSize)); + case ScaleState.originalSize: + return boundaries.clampScale(boundaries.originalScale); + } + } +} diff --git a/plugins/aves_magnifier/lib/src/controller/controller_delegate.dart b/plugins/aves_magnifier/lib/src/controller/controller_delegate.dart new file mode 100644 index 0000000..57e1b98 --- /dev/null +++ b/plugins/aves_magnifier/lib/src/controller/controller_delegate.dart @@ -0,0 +1,130 @@ +import 'dart:async'; + +import 'package:aves_magnifier/src/controller/controller.dart'; +import 'package:aves_magnifier/src/controller/state.dart'; +import 'package:aves_magnifier/src/core/core.dart'; +import 'package:aves_magnifier/src/scale/scale_boundaries.dart'; +import 'package:aves_magnifier/src/scale/state.dart'; +import 'package:flutter/widgets.dart'; + +/// A class to hold internal layout logic to sync both controller states +/// +/// It reacts to layout changes (eg: enter landscape or widget resize) and syncs the two controllers. +mixin AvesMagnifierControllerDelegate on State<AvesMagnifier> { + AvesMagnifierController get controller => widget.controller; + + ScaleBoundaries? get scaleBoundaries => controller.scaleBoundaries; + + ScaleStateCycle get scaleStateCycle => widget.scaleStateCycle; + + Alignment get basePosition => ScaleBoundaries.basePosition; + + Function(double? prevScale, double? nextScale, Offset nextPosition)? _animateScale; + + final List<StreamSubscription> _subscriptions = []; + + void registerDelegate(AvesMagnifier widget) { + _subscriptions.add(widget.controller.stateStream.listen(_onMagnifierStateChanged)); + _subscriptions.add(widget.controller.scaleStateChangeStream.listen(_onScaleStateChanged)); + // _subscriptions.add(widget.controller.scaleBoundariesStream.listen(_onScaleBoundariesChanged)); + } + + void unregisterDelegate(AvesMagnifier oldWidget) { + _animateScale = null; + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + // TODO TLAD should not reset scale when boundaries change because of transform + // void _onScaleBoundariesChanged(ScaleBoundaries boundaries) { + // initScale(); + // } + + void _onScaleStateChanged(ScaleStateChange scaleStateChange) { + if (scaleStateChange.source == ChangeSource.internal) return; + if (!controller.hasScaleSateChanged) return; + + if (_animateScale == null || controller.isZooming) { + controller.update(scale: controller.scale, source: scaleStateChange.source); + return; + } + + final nextScaleState = scaleStateChange.state; + final nextScale = controller.getScaleForScaleState(nextScaleState); + var nextPosition = Offset.zero; + if (nextScaleState == ScaleState.covering || nextScaleState == ScaleState.originalSize) { + final childFocalPoint = scaleStateChange.childFocalPoint; + final boundaries = scaleBoundaries; + if (childFocalPoint != null && boundaries != null) { + nextPosition = boundaries.contentToStatePosition(nextScale!, childFocalPoint); + } + } + + final prevScale = controller.scale ?? controller.getScaleForScaleState(controller.previousScaleState.state); + _animateScale!(prevScale, nextScale, nextPosition); + } + + void setScaleStateUpdateAnimation(void Function(double? prevScale, double? nextScale, Offset nextPosition) animateScale) { + _animateScale = animateScale; + } + + void _onMagnifierStateChanged(MagnifierState state) { + final boundaries = scaleBoundaries; + final currentScale = controller.scale; + if (boundaries == null || currentScale == null) return; + + controller.update(position: boundaries.clampPosition(position: position, scale: currentScale), source: state.source); + final newScale = controller.scale; + if (newScale == null || newScale == currentScale) return; + + if (state.source == ChangeSource.internal || state.source == ChangeSource.animation) return; + final newScaleState = (newScale > boundaries.initialScale) ? ScaleState.zoomedIn : ScaleState.zoomedOut; + controller.setScaleState(newScaleState, state.source); + } + + Offset get position => controller.position; + + void initScale() { + final scaleState = controller.scaleState.state; + final newScale = controller.getScaleForScaleState(scaleState); + setScale(newScale, ChangeSource.internal); + } + + void setScale(double? scale, ChangeSource source) => controller.update(scale: scale, source: source); + + void updateScaleStateFromNewScale(double newScale, ChangeSource source) { + final boundaries = scaleBoundaries; + if (boundaries == null) return; + + var newScaleState = ScaleState.initial; + if (controller.scale != boundaries.initialScale) { + newScaleState = (newScale > boundaries.initialScale) ? ScaleState.zoomedIn : ScaleState.zoomedOut; + } + controller.setScaleState(newScaleState, source); + } + + void nextScaleState(ChangeSource source, {Offset? childFocalPoint}) { + final scaleState = controller.scaleState.state; + if (scaleState == ScaleState.zoomedIn || scaleState == ScaleState.zoomedOut) { + controller.setScaleState(scaleStateCycle(scaleState), source, childFocalPoint: childFocalPoint); + return; + } + final originalScale = controller.getScaleForScaleState(scaleState); + + var prevScale = originalScale; + var prevScaleState = scaleState; + var nextScale = originalScale; + var nextScaleState = scaleState; + + do { + prevScale = nextScale; + prevScaleState = nextScaleState; + nextScaleState = scaleStateCycle(prevScaleState); + nextScale = controller.getScaleForScaleState(nextScaleState); + } while (prevScale == nextScale && scaleState != nextScaleState); + + if (originalScale == nextScale) return; + controller.setScaleState(nextScaleState, source, childFocalPoint: childFocalPoint); + } +} diff --git a/plugins/aves_magnifier/lib/src/controller/range.dart b/plugins/aves_magnifier/lib/src/controller/range.dart new file mode 100644 index 0000000..116ceef --- /dev/null +++ b/plugins/aves_magnifier/lib/src/controller/range.dart @@ -0,0 +1,15 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class EdgeRange extends Equatable { + final double min; + final double max; + + @override + List<Object?> get props => [min, max]; + + const EdgeRange(this.min, this.max); + + static const EdgeRange zero = EdgeRange(0, 0); +} diff --git a/plugins/aves_magnifier/lib/src/controller/state.dart b/plugins/aves_magnifier/lib/src/controller/state.dart new file mode 100644 index 0000000..ee8313d --- /dev/null +++ b/plugins/aves_magnifier/lib/src/controller/state.dart @@ -0,0 +1,22 @@ +import 'dart:ui'; + +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class MagnifierState extends Equatable { + final Offset position; + final double? scale; + final ChangeSource source; + + @override + List<Object?> get props => [position, scale, source]; + + const MagnifierState({ + required this.position, + required this.scale, + required this.source, + }); +} + +enum ChangeSource { internal, gesture, animation } diff --git a/plugins/aves_magnifier/lib/src/core/core.dart b/plugins/aves_magnifier/lib/src/core/core.dart new file mode 100644 index 0000000..ad8978e --- /dev/null +++ b/plugins/aves_magnifier/lib/src/core/core.dart @@ -0,0 +1,557 @@ +import 'dart:math'; + +import 'package:aves_magnifier/src/controller/controller.dart'; +import 'package:aves_magnifier/src/controller/controller_delegate.dart'; +import 'package:aves_magnifier/src/controller/state.dart'; +import 'package:aves_magnifier/src/core/gesture_detector.dart'; +import 'package:aves_magnifier/src/pan/edge_hit_detector.dart'; +import 'package:aves_magnifier/src/scale/scale_boundaries.dart'; +import 'package:aves_magnifier/src/scale/scale_level.dart'; +import 'package:aves_magnifier/src/scale/state.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/widgets.dart'; + +/* + adapted from package `photo_view` v0.9.2: + - removed image related aspects to focus on a general purpose pan/scale viewer (à la `InteractiveViewer`) + - removed rotation and many customization parameters + - removed ignorable/ignoring partial notifiers + - formatted, renamed and reorganized + - fixed gesture recognizers when used inside a scrollable widget like `PageView` + - fixed corner hit detection when in containers scrollable in both axes + - fixed corner hit detection issues due to imprecise double comparisons + - added single & double tap position feedback + - fixed focus when scaling by double-tap/pinch + */ +class AvesMagnifier extends StatefulWidget { + static const double defaultPanInertia = .2; + + final AvesMagnifierController controller; + final EdgeInsets viewportPadding; + + // The size of the custom [child]. This value is used to compute the relation between the child and the container's size to calculate the scale value. + final Size contentSize; + + final bool allowOriginalScaleBeyondRange; + final bool allowGestureScaleBeyondRange; + final MagnifierDoubleTapCallback? allowDoubleTap; + final double panInertia; + + // Defines the minimum size in which the image will be allowed to assume, it is proportional to the original image size. + final ScaleLevel minScale; + + // Defines the maximum size in which the image will be allowed to assume, it is proportional to the original image size. + final ScaleLevel maxScale; + + // Defines the size the image will assume when the component is initialized, it is proportional to the original image size. + final ScaleLevel initialScale; + + final ScaleStateCycle scaleStateCycle; + final bool applyScale; + final MagnifierGestureScaleStartCallback? onScaleStart; + final MagnifierGestureScaleUpdateCallback? onScaleUpdate; + final MagnifierGestureScaleEndCallback? onScaleEnd; + final MagnifierGestureFlingCallback? onFling; + final MagnifierTapCallback? onTap; + final GestureLongPressCallback? onLongPress; + final MagnifierDoubleTapCallback? onDoubleTap; + final Widget child; + + const AvesMagnifier({ + super.key, + required this.controller, + required this.contentSize, + this.viewportPadding = EdgeInsets.zero, + this.allowOriginalScaleBeyondRange = true, + this.allowGestureScaleBeyondRange = true, + this.allowDoubleTap, + this.minScale = const ScaleLevel(factor: .0), + this.maxScale = const ScaleLevel(factor: double.infinity), + this.initialScale = const ScaleLevel(ref: ScaleReference.contained), + this.scaleStateCycle = defaultScaleStateCycle, + this.applyScale = true, + this.panInertia = defaultPanInertia, + this.onScaleStart, + this.onScaleUpdate, + this.onScaleEnd, + this.onFling, + this.onTap, + this.onLongPress, + this.onDoubleTap, + required this.child, + }); + + @override + State<StatefulWidget> createState() => _AvesMagnifierState(); +} + +class _AvesMagnifierState extends State<AvesMagnifier> with TickerProviderStateMixin, AvesMagnifierControllerDelegate, EdgeHitDetector { + Offset? _startFocalPoint, _lastViewportFocalPosition; + double? _startScale, _quickScaleLastY, _quickScaleLastDistance; + late bool _dropped, _doubleTap, _quickScaleMoved; + DateTime _lastScaleGestureDate = DateTime.now(); + + late AnimationController _scaleAnimationController; + late Animation<double> _scaleAnimation; + + late AnimationController _positionAnimationController; + late Animation<Offset> _positionAnimation; + + static const _flingPointerKind = PointerDeviceKind.unknown; + + @override + void initState() { + super.initState(); + _scaleAnimationController = AnimationController(vsync: this) + ..addListener(handleScaleAnimation) + ..addStatusListener(onAnimationStatus); + _positionAnimationController = AnimationController(vsync: this)..addListener(handlePositionAnimate); + _registerWidget(widget); + // force delegate scale computing on initialization + // so that it does not happen lazily at the beginning of a scale animation + initScale(); + } + + @override + void didUpdateWidget(covariant AvesMagnifier oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.controller != widget.controller) { + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + if (oldWidget.allowOriginalScaleBeyondRange != widget.allowOriginalScaleBeyondRange || oldWidget.minScale != widget.minScale || oldWidget.maxScale != widget.maxScale || oldWidget.initialScale != widget.initialScale || oldWidget.contentSize != widget.contentSize) { + controller.setScaleBoundaries((controller.scaleBoundaries ?? ScaleBoundaries.zero).copyWith( + allowOriginalScaleBeyondRange: widget.allowOriginalScaleBeyondRange, + minScale: widget.minScale, + maxScale: widget.maxScale, + initialScale: widget.initialScale, + contentSize: widget.contentSize.isEmpty == false ? widget.contentSize : null, + )); + } + } + + @override + void dispose() { + _unregisterWidget(widget); + _scaleAnimationController.dispose(); + _positionAnimationController.dispose(); + super.dispose(); + } + + void _registerWidget(AvesMagnifier widget) { + registerDelegate(widget); + setScaleStateUpdateAnimation(animateOnScaleStateUpdate); + } + + void _unregisterWidget(AvesMagnifier oldWidget) { + unregisterDelegate(oldWidget); + } + + void handleScaleAnimation() { + setScale(_scaleAnimation.value, ChangeSource.animation); + } + + void handlePositionAnimate() { + controller.update(position: _positionAnimation.value, source: ChangeSource.animation); + } + + Stopwatch? _scaleStopwatch; + VelocityTracker? _velocityTracker; + var _mayFlingLTRB = const (false, false, false, false); + + void onScaleStart(ScaleStartDetails details, bool doubleTap) { + final boundaries = scaleBoundaries; + if (boundaries == null) return; + + widget.onScaleStart?.call(details, doubleTap, boundaries); + + _scaleStopwatch = Stopwatch()..start(); + _velocityTracker = VelocityTracker.withKind(_flingPointerKind); + _mayFlingLTRB = const (true, true, true, true); + _updateMayFling(); + + _startScale = controller.scale; + _startFocalPoint = details.localFocalPoint; + _lastViewportFocalPosition = _startFocalPoint; + _dropped = false; + _doubleTap = doubleTap; + _quickScaleLastDistance = null; + _quickScaleLastY = _startFocalPoint!.dy; + _quickScaleMoved = false; + + _scaleAnimationController.stop(); + _positionAnimationController.stop(); + } + + void onScaleUpdate(ScaleUpdateDetails details) { + final boundaries = scaleBoundaries; + if (boundaries == null) return; + + _dropped |= widget.onScaleUpdate?.call(details) ?? false; + if (_dropped) return; + + final elapsed = _scaleStopwatch?.elapsed; + if (elapsed != null) { + _velocityTracker?.addPosition(elapsed, details.focalPoint); + } + _updateMayFling(); + + double newScale; + if (_doubleTap) { + // quick scale, aka one finger zoom + // magic numbers from `davemorrissey/subsampling-scale-image-view` + final focalPointY = details.localFocalPoint.dy; + final distance = (focalPointY - _startFocalPoint!.dy).abs() * 2 + 20; + _quickScaleLastDistance ??= distance; + final spanDiff = (1 - (distance / _quickScaleLastDistance!)).abs() * .5; + _quickScaleMoved |= spanDiff > .03; + final factor = _quickScaleMoved ? (focalPointY > _quickScaleLastY! ? (1 + spanDiff) : (1 - spanDiff)) : 1; + _quickScaleLastDistance = distance; + _quickScaleLastY = focalPointY; + newScale = controller.scale! * factor; + } else { + newScale = _startScale! * details.scale; + } + if (!widget.allowGestureScaleBeyondRange) { + newScale = boundaries.clampScale(newScale); + } + newScale = max(0, newScale); + // focal point is in viewport coordinates + final scaleFocalPoint = _doubleTap ? _startFocalPoint! : details.localFocalPoint; + + final viewportCenter = boundaries.viewportCenter; + final centerContentPosition = boundaries.viewportToContentPosition(controller, viewportCenter); + final scalePositionDelta = (scaleFocalPoint - viewportCenter) * (controller.scale! / newScale - 1); + final panPositionDelta = scaleFocalPoint - _lastViewportFocalPosition!; + + final newPosition = boundaries.clampPosition( + position: boundaries.contentToStatePosition(newScale, centerContentPosition) + scalePositionDelta + panPositionDelta, + scale: newScale, + ); + + updateScaleStateFromNewScale(newScale, ChangeSource.gesture); + controller.update(position: newPosition, scale: newScale, source: ChangeSource.gesture); + + _lastViewportFocalPosition = scaleFocalPoint; + } + + void onScaleEnd(ScaleEndDetails details) { + final boundaries = scaleBoundaries; + if (boundaries == null) return; + + widget.onScaleEnd?.call(details); + + _updateMayFling(); + final estimate = _velocityTracker?.getVelocityEstimate(); + final onFling = widget.onFling; + if (estimate != null && onFling != null) { + final (left, up, right, down) = _mayFlingLTRB; + if (_isFlingGesture(estimate, _flingPointerKind, Axis.horizontal)) { + if (left ^ right) { + if (left) { + onFling(AxisDirection.left); + } else if (right) { + onFling(AxisDirection.right); + } + } + } else if (_isFlingGesture(estimate, _flingPointerKind, Axis.vertical)) { + if (up ^ down) { + if (up) { + onFling(AxisDirection.up); + } else if (down) { + onFling(AxisDirection.down); + } + } + } + } + + final currentPosition = controller.position; + final currentScale = controller.scale!; + + // animate back to min/max scale if gesture yielded a scale exceeding them + final newScale = boundaries.clampScale(currentScale); + if (currentScale != newScale) { + final newPosition = boundaries.clampPosition( + position: currentPosition * newScale / currentScale, + scale: newScale, + ); + animateScale(currentScale, newScale); + animatePosition(currentPosition, newPosition); + return; + } + + // The gesture recognizer triggers a new `onScaleStart` every time a pointer/finger is added or removed. + // Following a pinch-to-zoom gesture, a new panning gesture may start if the user does not lift both fingers at the same time, + // so we dismiss such panning gestures when it looks like it followed a scaling gesture. + final isPanning = currentScale == _startScale && (DateTime.now().difference(_lastScaleGestureDate)).inMilliseconds > 100; + + // animate position only when panning without scaling + if (isPanning) { + var pps = details.velocity.pixelsPerSecond; + if (pps != Offset.zero) { + final externalTransform = boundaries.externalTransform; + if (externalTransform != null) { + pps = Matrix4.inverted(externalTransform).transformOffset(pps); + } + final newPosition = boundaries.clampPosition( + position: currentPosition + pps * widget.panInertia, + scale: currentScale, + ); + if (currentPosition != newPosition) { + final tween = Tween<Offset>(begin: currentPosition, end: newPosition); + const curve = Curves.easeOutCubic; + _positionAnimation = tween.animate(CurvedAnimation(parent: _positionAnimationController, curve: curve)); + _positionAnimationController + ..duration = _getAnimationDurationForVelocity(curve: curve, tween: tween, targetPixelPerSecond: pps) + ..forward(from: 0.0); + } + } + } + + if (currentScale != _startScale) { + _lastScaleGestureDate = DateTime.now(); + } + } + + void _updateMayFling() { + final xHit = getXEdgeHit(); + final yHit = getYEdgeHit(); + final (left, up, right, down) = _mayFlingLTRB; + _mayFlingLTRB = ( + xHit.hasHitMin && left, + yHit.hasHitMin && up, + xHit.hasHitMax && right, + yHit.hasHitMax && down, + ); + } + + bool _isFlingGesture(VelocityEstimate estimate, PointerDeviceKind kind, Axis axis) { + final gestureSettings = MediaQuery.gestureSettingsOf(context); + const minVelocity = kMinFlingVelocity; + final minDistance = computeHitSlop(kind, gestureSettings); + + final pps = estimate.pixelsPerSecond; + final offset = estimate.offset; + if (axis == Axis.horizontal) { + return pps.dx.abs() > minVelocity && offset.dx.abs() > minDistance; + } else { + return pps.dy.abs() > minVelocity && offset.dy.abs() > minDistance; + } + } + + Duration _getAnimationDurationForVelocity({ + required Cubic curve, + required Tween<Offset> tween, + required Offset targetPixelPerSecond, + }) { + assert(targetPixelPerSecond != Offset.zero); + // find initial animation velocity over the first 20% of the specified curve + const t = 0.2; + final animationVelocity = (tween.end! - tween.begin!).distance * curve.transform(t) / t; + final gestureVelocity = targetPixelPerSecond.distance; + return Duration(milliseconds: gestureVelocity != 0 ? (animationVelocity / gestureVelocity * 1000).round() : 0); + } + + Alignment? _getTapAlignment(Offset viewportTapPosition) { + final boundaries = scaleBoundaries; + if (boundaries == null) return null; + + final viewportSize = boundaries.viewportSize; + return Alignment(viewportTapPosition.dx / viewportSize.width, viewportTapPosition.dy / viewportSize.height); + } + + Offset? _getChildTapPosition(Offset viewportTapPosition) { + final boundaries = scaleBoundaries; + if (boundaries == null) return null; + + return boundaries.viewportToContentPosition(controller, viewportTapPosition); + } + + void _onTapUp(TapUpDetails details) { + final onTap = widget.onTap; + if (onTap == null) return; + + final viewportTapPosition = details.localPosition; + final alignment = _getTapAlignment(viewportTapPosition); + final childTapPosition = _getChildTapPosition(viewportTapPosition); + if (alignment != null && childTapPosition != null) { + onTap(context, controller.currentState, alignment, childTapPosition); + } + } + + bool _allowDoubleTap(Offset localPosition) { + final allowDoubleTap = widget.allowDoubleTap; + if (allowDoubleTap != null) { + final alignment = _getTapAlignment(localPosition); + if (alignment != null) { + return allowDoubleTap(alignment); + } + } + return true; + } + + void _onDoubleTap(TapDownDetails details) { + final onDoubleTap = widget.onDoubleTap; + if (onDoubleTap != null) { + final alignment = _getTapAlignment(details.localPosition); + if (alignment != null && onDoubleTap(alignment)) return; + } + + final childTapPosition = _getChildTapPosition(details.localPosition); + if (childTapPosition != null) { + nextScaleState(ChangeSource.gesture, childFocalPoint: childTapPosition); + } + } + + void animateScale(double? from, double? to) { + _scaleAnimation = Tween<double>( + begin: from, + end: to, + ).animate(_scaleAnimationController); + _scaleAnimationController + ..value = 0.0 + ..fling(velocity: 0.4); + } + + void animatePosition(Offset from, Offset to) { + _positionAnimation = Tween<Offset>(begin: from, end: to).animate(_positionAnimationController); + _positionAnimationController + ..value = 0.0 + ..fling(velocity: 0.4); + } + + void onAnimationStatus(AnimationStatus status) { + if (status.isCompleted) { + onAnimationStatusCompleted(); + } + } + + /// Check if scale is equal to initial after scale animation update + void onAnimationStatusCompleted() { + if (controller.scaleState.state != ScaleState.initial && controller.scale == scaleBoundaries?.initialScale) { + controller.setScaleState(ScaleState.initial, ChangeSource.animation); + } + } + + void animateOnScaleStateUpdate(double? prevScale, double? nextScale, Offset nextPosition) { + animateScale(prevScale, nextScale); + animatePosition(controller.position, nextPosition); + } + + @override + Widget build(BuildContext context) { + return StreamBuilder<MagnifierState>( + stream: controller.stateStream, + initialData: controller.previousState, + builder: (context, snapshot) { + if (!snapshot.hasData) return const SizedBox(); + + final magnifierState = snapshot.data!; + final position = magnifierState.position; + final applyScale = widget.applyScale; + + Widget child = CustomSingleChildLayout( + delegate: _CenterWithOriginalSizeDelegate( + widget.contentSize, + basePosition, + applyScale, + ), + child: widget.child, + ); + + return MagnifierGestureDetector( + hitDetector: this, + onScaleStart: onScaleStart, + onScaleUpdate: onScaleUpdate, + onScaleEnd: onScaleEnd, + onTapUp: widget.onTap == null ? null : _onTapUp, + onLongPress: widget.onLongPress, + onDoubleTap: _onDoubleTap, + allowDoubleTap: _allowDoubleTap, + child: Padding( + padding: widget.viewportPadding, + child: LayoutBuilder( + builder: (context, constraints) { + final boundaries = (controller.scaleBoundaries ?? ScaleBoundaries.zero).copyWith( + allowOriginalScaleBeyondRange: widget.allowOriginalScaleBeyondRange, + minScale: widget.minScale, + maxScale: widget.maxScale, + initialScale: widget.initialScale, + viewportSize: constraints.biggest, + contentSize: widget.contentSize.isEmpty == false ? widget.contentSize : constraints.biggest, + ); + controller.setScaleBoundaries(boundaries); + + // `Matrix4.scale` uses dynamic typing and can throw `UnimplementedError` on wrong types + final double effectiveScale = (applyScale ? controller.scale : null) ?? 1.0; + return Transform( + transform: Matrix4.identity() + ..translateByDouble(position.dx, position.dy, 0, 1) + ..scaleByDouble(effectiveScale, effectiveScale, effectiveScale, 1), + alignment: basePosition, + child: child, + ); + }, + ), + ), + ); + }, + ); + } +} + +@immutable +class _CenterWithOriginalSizeDelegate extends SingleChildLayoutDelegate with EquatableMixin { + final Size subjectSize; + final Alignment basePosition; + final bool applyScale; + + @override + List<Object?> get props => [subjectSize, basePosition, applyScale]; + + const _CenterWithOriginalSizeDelegate( + this.subjectSize, + this.basePosition, + this.applyScale, + ); + + @override + Offset getPositionForChild(Size size, Size childSize) { + final childWidth = applyScale ? subjectSize.width : childSize.width; + final childHeight = applyScale ? subjectSize.height : childSize.height; + + final halfWidth = (size.width - childWidth) / 2; + final halfHeight = (size.height - childHeight) / 2; + + final offsetX = halfWidth * (basePosition.x + 1); + final offsetY = halfHeight * (basePosition.y + 1); + return Offset(offsetX, offsetY); + } + + @override + BoxConstraints getConstraintsForChild(BoxConstraints constraints) { + return applyScale ? BoxConstraints.tight(subjectSize) : const BoxConstraints(); + } + + @override + bool shouldRelayout(_CenterWithOriginalSizeDelegate oldDelegate) { + return oldDelegate != this; + } +} + +typedef MagnifierTapCallback = Function( + BuildContext context, + MagnifierState state, + Alignment alignment, + Offset childTapPosition, +); +typedef MagnifierDoubleTapPredicate = bool Function(Offset localPosition); +typedef MagnifierDoubleTapCallback = bool Function(Alignment alignment); +typedef MagnifierGestureScaleStartCallback = void Function(ScaleStartDetails details, bool doubleTap, ScaleBoundaries boundaries); +typedef MagnifierGestureScaleUpdateCallback = bool Function(ScaleUpdateDetails details); +typedef MagnifierGestureScaleEndCallback = void Function(ScaleEndDetails details); +typedef MagnifierGestureFlingCallback = void Function(AxisDirection direction); diff --git a/plugins/aves_magnifier/lib/src/core/gesture_detector.dart b/plugins/aves_magnifier/lib/src/core/gesture_detector.dart new file mode 100644 index 0000000..f4cf1cb --- /dev/null +++ b/plugins/aves_magnifier/lib/src/core/gesture_detector.dart @@ -0,0 +1,149 @@ +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:aves_magnifier/src/pan/edge_hit_detector.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/widgets.dart'; + +class MagnifierGestureDetector extends StatefulWidget { + final EdgeHitDetector hitDetector; + + final void Function(ScaleStartDetails details, bool doubleTap)? onScaleStart; + final GestureScaleUpdateCallback? onScaleUpdate; + final GestureScaleEndCallback? onScaleEnd; + + final GestureTapDownCallback? onTapDown; + final GestureTapUpCallback? onTapUp; + final GestureLongPressCallback? onLongPress; + final GestureTapDownCallback? onDoubleTap; + + final MagnifierDoubleTapPredicate? allowDoubleTap; + final HitTestBehavior? behavior; + final Widget? child; + + const MagnifierGestureDetector({ + super.key, + required this.hitDetector, + this.onScaleStart, + this.onScaleUpdate, + this.onScaleEnd, + this.onTapDown, + this.onTapUp, + this.onLongPress, + this.onDoubleTap, + this.allowDoubleTap, + this.behavior, + this.child, + }); + + @override + State<MagnifierGestureDetector> createState() => _MagnifierGestureDetectorState(); +} + +class _MagnifierGestureDetectorState extends State<MagnifierGestureDetector> { + final ValueNotifier<TapDownDetails?> doubleTapDetails = ValueNotifier(null); + + @override + void dispose() { + doubleTapDetails.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final gestureSettings = MediaQuery.gestureSettingsOf(context); + final gestures = <Type, GestureRecognizerFactory>{}; + + if (widget.onTapDown != null || widget.onTapUp != null) { + gestures[TapGestureRecognizer] = GestureRecognizerFactoryWithHandlers<TapGestureRecognizer>( + () => TapGestureRecognizer(debugOwner: this), + (instance) { + instance + ..onTapDown = widget.onTapDown + ..onTapUp = widget.onTapUp; + }, + ); + } + + if (widget.onLongPress != null) { + gestures[LongPressGestureRecognizer] = GestureRecognizerFactoryWithHandlers<LongPressGestureRecognizer>( + () => LongPressGestureRecognizer(debugOwner: this), + (instance) { + instance.onLongPress = widget.onLongPress; + }, + ); + } + + final scope = MagnifierGestureDetectorScope.maybeOf(context); + if (scope != null) { + gestures[MagnifierGestureRecognizer] = GestureRecognizerFactoryWithHandlers<MagnifierGestureRecognizer>( + () => MagnifierGestureRecognizer( + debugOwner: this, + scope: scope, + doubleTapDetails: doubleTapDetails, + ), + (instance) { + instance + ..hitDetector = widget.hitDetector + ..onStart = widget.onScaleStart != null ? (details) => widget.onScaleStart!(details, doubleTapDetails.value != null) : null + ..onUpdate = widget.onScaleUpdate + ..onEnd = widget.onScaleEnd + ..gestureSettings = gestureSettings; + }, + ); + } + + gestures[MagnifierDoubleTapGestureRecognizer] = GestureRecognizerFactoryWithHandlers<MagnifierDoubleTapGestureRecognizer>( + () => MagnifierDoubleTapGestureRecognizer( + debugOwner: this, + allowDoubleTap: widget.allowDoubleTap ?? (_) => true, + ), + (instance) { + final onDoubleTap = widget.onDoubleTap; + instance + ..onDoubleTapCancel = _onDoubleTapCancel + ..onDoubleTapDown = _onDoubleTapDown + ..onDoubleTap = onDoubleTap != null + ? () { + final details = doubleTapDetails.value; + if (details != null) { + onDoubleTap(details); + doubleTapDetails.value = null; + } + } + : null; + }, + ); + + return RawGestureDetector( + gestures: gestures, + behavior: widget.behavior ?? HitTestBehavior.translucent, + child: widget.child, + ); + } + + void _onDoubleTapCancel() => doubleTapDetails.value = null; + + void _onDoubleTapDown(TapDownDetails details) { + if (widget.allowDoubleTap?.call(details.localPosition) ?? true) { + doubleTapDetails.value = details; + } + } +} + +class MagnifierDoubleTapGestureRecognizer extends DoubleTapGestureRecognizer { + final MagnifierDoubleTapPredicate allowDoubleTap; + + MagnifierDoubleTapGestureRecognizer({ + super.debugOwner, + super.supportedDevices, + super.allowedButtonsFilter, + required this.allowDoubleTap, + }); + + @override + bool isPointerAllowed(PointerDownEvent event) { + if (!allowDoubleTap(event.localPosition)) { + return false; + } + return super.isPointerAllowed(event); + } +} diff --git a/plugins/aves_magnifier/lib/src/core/scale_gesture_recognizer.dart b/plugins/aves_magnifier/lib/src/core/scale_gesture_recognizer.dart new file mode 100644 index 0000000..8fc3186 --- /dev/null +++ b/plugins/aves_magnifier/lib/src/core/scale_gesture_recognizer.dart @@ -0,0 +1,165 @@ +import 'dart:math'; + +import 'package:aves_magnifier/aves_magnifier.dart'; +import 'package:aves_magnifier/src/pan/edge_hit_detector.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/widgets.dart'; + +class MagnifierGestureRecognizer extends ScaleGestureRecognizer { + final MagnifierGestureDetectorScope scope; + final ValueNotifier<TapDownDetails?> doubleTapDetails; + + EdgeHitDetector? hitDetector; + + MagnifierGestureRecognizer({ + super.debugOwner, + required this.scope, + required this.doubleTapDetails, + }); + + Map<int, Offset> _pointerLocations = <int, Offset>{}; + + Offset? _initialFocalPoint; + Offset? _currentFocalPoint; + double? _initialSpan; + double? _currentSpan; + + bool ready = true; + + @override + void addAllowedPointer(PointerDownEvent event) { + if (ready) { + ready = false; + _initialSpan = 0.0; + _currentSpan = 0.0; + _pointerLocations = <int, Offset>{}; + } + super.addAllowedPointer(event); + } + + @override + void didStopTrackingLastPointer(int pointer) { + ready = true; + super.didStopTrackingLastPointer(pointer); + } + + @override + void handleEvent(PointerEvent event) { + if (scope.axis.isNotEmpty) { + var didChangeConfiguration = false; + final pointer = event.pointer; + if (event is PointerMoveEvent) { + if (!event.synthesized) { + _pointerLocations[pointer] = event.position; + } + } else if (event is PointerDownEvent) { + _pointerLocations[pointer] = event.position; + didChangeConfiguration = true; + } else if (event is PointerUpEvent || event is PointerCancelEvent) { + _pointerLocations.remove(pointer); + didChangeConfiguration = true; + } + + _updateDistances(); + + if (didChangeConfiguration) { + // cf super._reconfigure + _initialFocalPoint = _currentFocalPoint; + _initialSpan = _currentSpan; + } + + if (event is PointerMoveEvent) { + if (_areMultiPointers()) { + acceptGesture(pointer); + } else if (_isPriorityGesture() && _isOverSlop(event.kind)) { + acceptGesture(pointer); + } else { + final axis = scope.axis; + final isPriorityMove = (axis.contains(Axis.horizontal) && _canPanX()) || (axis.contains(Axis.vertical) && _canPanY()); + if (isPriorityMove && _isOverSlop(event.kind)) { + acceptGesture(pointer); + } + } + } + } + super.handleEvent(event); + } + + @override + void resolve(GestureDisposition disposition) { + switch (disposition) { + case GestureDisposition.accepted: + // do not let super `ScaleGestureRecognizer` accept gestures + // when it should yield to other recognizers + final canAccept = _areMultiPointers() || _isPriorityGesture() || _canPanX() || _canPanY(); + super.resolve(canAccept ? GestureDisposition.accepted : GestureDisposition.rejected); + case GestureDisposition.rejected: + super.resolve(disposition); + } + } + + void _updateDistances() { + // cf super._update + final count = _pointerLocations.keys.length; + + // Compute the focal point + var focalPoint = Offset.zero; + for (final pointer in _pointerLocations.keys) { + focalPoint += _pointerLocations[pointer]!; + } + _currentFocalPoint = count > 0 ? focalPoint / count.toDouble() : Offset.zero; + + // Span is the average deviation from focal point. Horizontal and vertical + // spans are the average deviations from the focal point's horizontal and + // vertical coordinates, respectively. + var totalDeviation = 0.0; + for (final pointer in _pointerLocations.keys) { + totalDeviation += (_currentFocalPoint! - _pointerLocations[pointer]!).distance; + } + _currentSpan = count > 0 ? totalDeviation / count : 0.0; + } + + Offset get move => _initialFocalPoint! - _currentFocalPoint!; + + // when there are multiple pointers, we always accept the gesture to scale + // as this is not competing with single taps or other drag gestures + bool _areMultiPointers() => _pointerLocations.keys.length >= 2; + + bool _isPriorityGesture() { + // e.g. vertical drag to adjust brightness instead of panning + if (scope.acceptPointerEvent?.call(move) ?? false) return true; + + // e.g. double tap & drag for one finger zoom + if (doubleTapDetails.value != null) return true; + + return false; + } + + bool _canPanX() => hitDetector != null && hitDetector!.shouldMoveX(move, scope.escapeByFling) && isXPan(move); + + bool _canPanY() => hitDetector != null && hitDetector!.shouldMoveY(move, scope.escapeByFling) && isYPan(move); + + bool _isOverSlop(PointerDeviceKind kind) { + final spanDelta = (_currentSpan! - _initialSpan!).abs(); + final focalPointDelta = move.distance; + // warning: do not compare `focalPointDelta` to `kPanSlop` + // `ScaleGestureRecognizer` uses `kPanSlop` (or platform settings, cf gestures/events.dart `computePanSlop`), + // but `HorizontalDragGestureRecognizer` uses `kTouchSlop` (or platform settings, cf gestures/events.dart `computeHitSlop`) + // and the magnifier recognizer may compete with the `HorizontalDragGestureRecognizer` from a containing `PageView` + // setting `touchSlopFactor` to 2 restores default `ScaleGestureRecognizer` behaviour as `kPanSlop = kTouchSlop * 2.0` + // setting `touchSlopFactor` in [0, 1] will allow this recognizer to accept the gesture before the one from `PageView` + return spanDelta > computeScaleSlop(kind) || focalPointDelta > computeHitSlop(kind, gestureSettings) * scope.touchSlopFactor; + } + + static bool isXPan(Offset move) { + // the gesture direction angle is in ]-pi, pi], cf `Offset` doc for details + final d = move.direction; + return (-pi / 4 < d && d < pi / 4) || (3 / 4 * pi < d && d <= pi) || (-pi < d && d < -3 / 4 * pi); + } + + static bool isYPan(Offset move) { + // the gesture direction angle is in ]-pi, pi], cf `Offset` doc for details + final d = move.direction; + return (pi / 4 < d && d < 3 / 4 * pi) || (-3 / 4 * pi < d && d < -pi / 4); + } +} diff --git a/plugins/aves_magnifier/lib/src/pan/edge_hit_detector.dart b/plugins/aves_magnifier/lib/src/pan/edge_hit_detector.dart new file mode 100644 index 0000000..04277a7 --- /dev/null +++ b/plugins/aves_magnifier/lib/src/pan/edge_hit_detector.dart @@ -0,0 +1,65 @@ +import 'package:aves_magnifier/src/controller/controller_delegate.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +mixin EdgeHitDetector on AvesMagnifierControllerDelegate { + // the content width/height is not accurate for some image size & scale combos + // e.g. 3580.0 * 0.1005586592178771 yields 360.0 + // but 4764.0 * 0.07556675062972293 yields 360.00000000000006 + // so be sure to compare with `precisionErrorTolerance` + + EdgeHit getXEdgeHit() { + final _boundaries = scaleBoundaries; + final _scale = controller.scale; + if (_boundaries == null || _scale == null) return const EdgeHit(false, false); + + final x = -position.dx; + final range = _boundaries.getXEdges(scale: _scale); + return EdgeHit(x <= range.min + precisionErrorTolerance, x >= range.max - precisionErrorTolerance); + } + + EdgeHit getYEdgeHit() { + final _boundaries = scaleBoundaries; + final _scale = controller.scale; + if (_boundaries == null || _scale == null) return const EdgeHit(false, false); + + final y = -position.dy; + final range = _boundaries.getYEdges(scale: _scale); + return EdgeHit(y <= range.min + precisionErrorTolerance, y >= range.max - precisionErrorTolerance); + } + + bool shouldMoveX(Offset move, bool canFling) { + final hit = getXEdgeHit(); + return _shouldMove(hit, move.dx) || (canFling && !hit.hasHitBoth); + } + + bool shouldMoveY(Offset move, bool canFling) { + final hit = getYEdgeHit(); + return _shouldMove(hit, move.dy) || (canFling && !hit.hasHitBoth); + } + + bool _shouldMove(EdgeHit hit, double move) { + if (hit.hasHitAny && move != 0) { + if (hit.hasHitBoth) return false; + if (hit.hasHitMax) return move < 0; + return move > 0; + } + return true; + } +} + +@immutable +class EdgeHit extends Equatable { + final bool hasHitMin; + final bool hasHitMax; + + @override + List<Object?> get props => [hasHitMin, hasHitMax]; + + const EdgeHit(this.hasHitMin, this.hasHitMax); + + bool get hasHitAny => hasHitMin || hasHitMax; + + bool get hasHitBoth => hasHitMin && hasHitMax; +} diff --git a/plugins/aves_magnifier/lib/src/pan/gesture_detector_scope.dart b/plugins/aves_magnifier/lib/src/pan/gesture_detector_scope.dart new file mode 100644 index 0000000..d464121 --- /dev/null +++ b/plugins/aves_magnifier/lib/src/pan/gesture_detector_scope.dart @@ -0,0 +1,55 @@ +import 'package:flutter/widgets.dart'; + +/// When a `Magnifier` is wrapped in this inherited widget, +/// it will check whether the zoomed content has hit edges, +/// and if so, will let parent gesture detectors win the gesture arena +/// +/// Useful when placing Magnifier inside a gesture sensitive context, +/// such as [PageView], [Dismissible], [BottomSheet]. +class MagnifierGestureDetectorScope extends InheritedWidget { + final List<Axis> axis; + + // in [0, 1[ + // 0: most reactive but will not let tap recognizers accept gestures + // <1: less reactive but gives the most leeway to other recognizers + // 1: will not be able to compete with a `HorizontalDragGestureRecognizer` up the widget tree + final double touchSlopFactor; + + // when zoomed in and hitting an edge, allow using a fling gesture to go to the previous/next page, + // instead of yielding to the outer scrollable right away + final bool escapeByFling; + + final bool? Function(Offset move)? acceptPointerEvent; + + const MagnifierGestureDetectorScope({ + super.key, + required this.axis, + this.touchSlopFactor = .8, + this.escapeByFling = true, + this.acceptPointerEvent, + required super.child, + }); + + static MagnifierGestureDetectorScope? maybeOf(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType<MagnifierGestureDetectorScope>(); + } + + MagnifierGestureDetectorScope copyWith({ + List<Axis>? axis, + double? touchSlopFactor, + bool? Function(Offset move)? acceptPointerEvent, + required Widget child, + }) { + return MagnifierGestureDetectorScope( + axis: axis ?? this.axis, + touchSlopFactor: touchSlopFactor ?? this.touchSlopFactor, + acceptPointerEvent: acceptPointerEvent ?? this.acceptPointerEvent, + child: child, + ); + } + + @override + bool updateShouldNotify(MagnifierGestureDetectorScope oldWidget) { + return axis != oldWidget.axis || touchSlopFactor != oldWidget.touchSlopFactor || acceptPointerEvent != oldWidget.acceptPointerEvent; + } +} diff --git a/plugins/aves_magnifier/lib/src/pan/scroll_physics.dart b/plugins/aves_magnifier/lib/src/pan/scroll_physics.dart new file mode 100644 index 0000000..30b2ce7 --- /dev/null +++ b/plugins/aves_magnifier/lib/src/pan/scroll_physics.dart @@ -0,0 +1,34 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/widgets.dart'; + +// `PageView` contains a `Scrollable` which sets up a `HorizontalDragGestureRecognizer`. +// This recognizer will win in the gesture arena when the drag distance reaches +// `kTouchSlop` (or platform settings, cf gestures/events.dart `computeHitSlop`). +// We cannot change that, but we can prevent the scrollable from panning until this threshold is reached +// and let other recognizers accept the gesture instead. +class MagnifierScrollerPhysics extends ScrollPhysics { + final DeviceGestureSettings? gestureSettings; + + // in [0, 1] + // 0: most reactive but will not let Magnifier recognizers accept gestures + // 1: less reactive but gives the most leeway to Magnifier recognizers + final double touchSlopFactor; + + const MagnifierScrollerPhysics({ + required this.gestureSettings, + this.touchSlopFactor = 1, + super.parent, + }); + + @override + MagnifierScrollerPhysics applyTo(ScrollPhysics? ancestor) { + return MagnifierScrollerPhysics( + gestureSettings: gestureSettings, + touchSlopFactor: touchSlopFactor, + parent: buildParent(ancestor), + ); + } + + @override + double get dragStartDistanceMotionThreshold => (gestureSettings?.touchSlop ?? kTouchSlop) * touchSlopFactor; +} diff --git a/plugins/aves_magnifier/lib/src/scale/scale_boundaries.dart b/plugins/aves_magnifier/lib/src/scale/scale_boundaries.dart new file mode 100644 index 0000000..d738edb --- /dev/null +++ b/plugins/aves_magnifier/lib/src/scale/scale_boundaries.dart @@ -0,0 +1,159 @@ +import 'dart:math'; + +import 'package:aves_magnifier/src/controller/controller.dart'; +import 'package:aves_magnifier/src/controller/range.dart'; +import 'package:aves_magnifier/src/scale/scale_level.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/widgets.dart'; + +/// Internal class to wrap custom scale boundaries (min, max and initial) +/// Also, stores values regarding the two sizes: the container and the content. +@immutable +class ScaleBoundaries extends Equatable { + final bool _allowOriginalScaleBeyondRange; + final ScaleLevel _minScale; + final ScaleLevel _maxScale; + final ScaleLevel _initialScale; + final Size viewportSize; + final Size contentSize; + final EdgeInsets Function(double scale)? padding; + final Matrix4? externalTransform; + + static const Alignment basePosition = Alignment.center; + + @override + List<Object?> get props => [_allowOriginalScaleBeyondRange, _minScale, _maxScale, _initialScale, viewportSize, contentSize, padding, externalTransform]; + + const ScaleBoundaries({ + required bool allowOriginalScaleBeyondRange, + required ScaleLevel minScale, + required ScaleLevel maxScale, + required ScaleLevel initialScale, + required this.viewportSize, + required this.contentSize, + this.padding, + this.externalTransform, + }) : _allowOriginalScaleBeyondRange = allowOriginalScaleBeyondRange, + _minScale = minScale, + _maxScale = maxScale, + _initialScale = initialScale; + + static const ScaleBoundaries zero = ScaleBoundaries( + allowOriginalScaleBeyondRange: true, + minScale: ScaleLevel(factor: .0), + maxScale: ScaleLevel(factor: double.infinity), + initialScale: ScaleLevel(ref: ScaleReference.contained), + viewportSize: Size.zero, + contentSize: Size.zero, + padding: null, + ); + + ScaleBoundaries copyWith({ + bool? allowOriginalScaleBeyondRange, + ScaleLevel? minScale, + ScaleLevel? maxScale, + ScaleLevel? initialScale, + Size? viewportSize, + Size? contentSize, + EdgeInsets Function(double scale)? padding, + Matrix4? externalTransform, + }) { + return ScaleBoundaries( + allowOriginalScaleBeyondRange: allowOriginalScaleBeyondRange ?? _allowOriginalScaleBeyondRange, + minScale: minScale ?? _minScale, + maxScale: maxScale ?? _maxScale, + initialScale: initialScale ?? _initialScale, + viewportSize: viewportSize ?? this.viewportSize, + contentSize: contentSize ?? this.contentSize, + padding: padding ?? this.padding, + externalTransform: externalTransform ?? this.externalTransform, + ); + } + + Size get _transformedViewportSize { + final matrix = externalTransform; + return matrix != null ? MatrixUtils.transformRect(Matrix4.inverted(matrix), Offset.zero & viewportSize).size : viewportSize; + } + + double scaleForLevel(ScaleLevel level) { + final factor = level.factor; + switch (level.ref) { + case ScaleReference.contained: + return factor * ScaleLevel.scaleForContained(viewportSize, contentSize); + case ScaleReference.covered: + return factor * ScaleLevel.scaleForCovering(viewportSize, contentSize); + case ScaleReference.absolute: + return factor; + } + } + + double get originalScale { + final view = WidgetsBinding.instance.platformDispatcher.views.firstOrNull; + return 1.0 / (view?.devicePixelRatio ?? 1.0); + } + + double get initialScale => scaleForLevel(_initialScale); + + Offset get viewportCenter => viewportSize.center(Offset.zero); + + Offset get _contentCenter => contentSize.center(Offset.zero); + + Offset viewportToContentPosition(AvesMagnifierController controller, Offset viewportPosition) { + return (viewportPosition - viewportCenter - controller.position) / controller.scale! + _contentCenter; + } + + Offset contentToStatePosition(double scale, Offset contentPosition) { + return (_contentCenter - contentPosition) * scale; + } + + EdgeRange getXEdges({required double scale}) { + final computedWidth = contentSize.width * scale; + final viewportWidth = _transformedViewportSize.width; + + final positionX = basePosition.x; + final widthDiff = max(0, computedWidth - viewportWidth); + + final minX = ((positionX - 1).abs() / 2) * widthDiff * -1; + final maxX = ((positionX + 1).abs() / 2) * widthDiff; + final _padding = padding?.call(scale) ?? EdgeInsets.zero; + return EdgeRange(minX - _padding.left, maxX + _padding.right); + } + + EdgeRange getYEdges({required double scale}) { + final computedHeight = contentSize.height * scale; + final viewportHeight = _transformedViewportSize.height; + + final positionY = basePosition.y; + final heightDiff = max(0, computedHeight - viewportHeight); + + final minY = ((positionY - 1).abs() / 2) * heightDiff * -1; + final maxY = ((positionY + 1).abs() / 2) * heightDiff; + final _padding = padding?.call(scale) ?? EdgeInsets.zero; + return EdgeRange(minY - _padding.top, maxY + _padding.bottom); + } + + double clampScale(double scale) { + final minScale = { + scaleForLevel(_minScale), + _allowOriginalScaleBeyondRange ? originalScale : double.infinity, + initialScale, + }.fold(double.infinity, min); + + final maxScale = { + scaleForLevel(_maxScale), + _allowOriginalScaleBeyondRange ? originalScale : double.negativeInfinity, + initialScale, + }.fold(.0, max); + + return scale.clamp(minScale, maxScale); + } + + Offset clampPosition({required Offset position, required double scale}) { + final rangeX = getXEdges(scale: scale); + final rangeY = getYEdges(scale: scale); + return Offset( + position.dx.clamp(rangeX.min, rangeX.max), + position.dy.clamp(rangeY.min, rangeY.max), + ); + } +} diff --git a/plugins/aves_magnifier/lib/src/scale/scale_level.dart b/plugins/aves_magnifier/lib/src/scale/scale_level.dart new file mode 100644 index 0000000..b186684 --- /dev/null +++ b/plugins/aves_magnifier/lib/src/scale/scale_level.dart @@ -0,0 +1,25 @@ +import 'dart:math'; + +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/rendering.dart'; + +@immutable +class ScaleLevel extends Equatable { + final ScaleReference ref; + final double factor; + + @override + List<Object?> get props => [ref, factor]; + + const ScaleLevel({ + this.ref = ScaleReference.absolute, + this.factor = 1.0, + }); + + static double scaleForContained(Size viewportSize, Size contentSize) => min(viewportSize.width / contentSize.width, viewportSize.height / contentSize.height); + + static double scaleForCovering(Size viewportSize, Size contentSize) => max(viewportSize.width / contentSize.width, viewportSize.height / contentSize.height); +} + +enum ScaleReference { absolute, contained, covered } diff --git a/plugins/aves_magnifier/lib/src/scale/state.dart b/plugins/aves_magnifier/lib/src/scale/state.dart new file mode 100644 index 0000000..6cf44a3 --- /dev/null +++ b/plugins/aves_magnifier/lib/src/scale/state.dart @@ -0,0 +1,42 @@ +import 'package:aves_magnifier/src/controller/state.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/widgets.dart'; + +@immutable +class ScaleStateChange extends Equatable { + final ScaleState state; + final ChangeSource source; + final Offset? childFocalPoint; + + @override + List<Object?> get props => [state, source, childFocalPoint]; + + const ScaleStateChange({ + required this.state, + required this.source, + this.childFocalPoint, + }); +} + +enum ScaleState { + initial, + covering, + originalSize, + zoomedIn, + zoomedOut, +} + +ScaleState defaultScaleStateCycle(ScaleState actual) { + switch (actual) { + case ScaleState.initial: + return ScaleState.covering; + case ScaleState.covering: + return ScaleState.originalSize; + case ScaleState.originalSize: + case ScaleState.zoomedIn: + case ScaleState.zoomedOut: + return ScaleState.initial; + } +} + +typedef ScaleStateCycle = ScaleState Function(ScaleState actual); diff --git a/plugins/aves_magnifier/pubspec.yaml b/plugins/aves_magnifier/pubspec.yaml new file mode 100644 index 0000000..ac2134b --- /dev/null +++ b/plugins/aves_magnifier/pubspec.yaml @@ -0,0 +1,21 @@ +name: aves_magnifier +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.9.0 <4.0.0" +resolution: workspace + +dependencies: + flutter: + sdk: flutter + aves_utils: + path: ../aves_utils + equatable: + leak_tracker: + provider: + +dev_dependencies: + flutter_lints: + +flutter: diff --git a/plugins/aves_map/.gitignore b/plugins/aves_map/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/plugins/aves_map/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/plugins/aves_map/.metadata b/plugins/aves_map/.metadata new file mode 100644 index 0000000..c24d00d --- /dev/null +++ b/plugins/aves_map/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 5464c5bac742001448fe4fc0597be939379f88ea + channel: stable + +project_type: package diff --git a/plugins/aves_map/analysis_options.yaml b/plugins/aves_map/analysis_options.yaml new file mode 100644 index 0000000..f04c6cf --- /dev/null +++ b/plugins/aves_map/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/plugins/aves_map/lib/aves_map.dart b/plugins/aves_map/lib/aves_map.dart new file mode 100644 index 0000000..2098916 --- /dev/null +++ b/plugins/aves_map/lib/aves_map.dart @@ -0,0 +1,13 @@ +export 'src/controller.dart'; +export 'src/geo_entry.dart'; +export 'src/geo_utils.dart'; +export 'src/interface.dart'; +export 'src/marker/dot.dart'; +export 'src/marker/generator.dart'; +export 'src/marker/image.dart'; +export 'src/marker/key.dart'; +export 'src/overlay/overlay.dart'; +export 'src/overlay/tile.dart'; +export 'src/style.dart'; +export 'src/theme.dart'; +export 'src/zoomed_bounds.dart'; diff --git a/plugins/aves_map/lib/src/controller.dart b/plugins/aves_map/lib/src/controller.dart new file mode 100644 index 0000000..ee0115a --- /dev/null +++ b/plugins/aves_map/lib/src/controller.dart @@ -0,0 +1,79 @@ +import 'dart:async'; + +import 'package:aves_map/src/zoomed_bounds.dart'; +import 'package:flutter/foundation.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +class AvesMapController { + final StreamController<AvesMapEvent> _streamController = StreamController.broadcast(); + ZoomedBounds? _idleBounds; + + ZoomedBounds? get idleBounds => _idleBounds; + + Stream<AvesMapEvent> get _events => _streamController.stream; + + Stream<MapControllerMoveEvent> get moveCommands => _events.where((event) => event is MapControllerMoveEvent).cast<MapControllerMoveEvent>(); + + Stream<MapControllerZoomEvent> get zoomCommands => _events.where((event) => event is MapControllerZoomEvent).cast<MapControllerZoomEvent>(); + + Stream<MapControllerRotationResetEvent> get rotationResetCommands => _events.where((event) => event is MapControllerRotationResetEvent).cast<MapControllerRotationResetEvent>(); + + Stream<MapIdleUpdate> get idleUpdates => _events.where((event) => event is MapIdleUpdate).cast<MapIdleUpdate>(); + + Stream<MapMarkerLocationChangeEvent> get markerLocationChanges => _events.where((event) => event is MapMarkerLocationChangeEvent).cast<MapMarkerLocationChangeEvent>(); + + AvesMapController() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$AvesMapController', + object: this, + ); + } + } + + void dispose() { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + _streamController.close(); + } + + void moveTo(LatLng latLng) => _streamController.add(MapControllerMoveEvent(latLng)); + + void zoomBy(double delta) => _streamController.add(MapControllerZoomEvent(delta)); + + void resetRotation() => _streamController.add(MapControllerRotationResetEvent()); + + void notifyIdle(ZoomedBounds bounds) { + _idleBounds = bounds; + _streamController.add(MapIdleUpdate(bounds)); + } + + void notifyMarkerLocationChange() => _streamController.add(MapMarkerLocationChangeEvent()); +} + +abstract class AvesMapEvent {} + +class MapControllerMoveEvent extends AvesMapEvent { + final LatLng latLng; + + MapControllerMoveEvent(this.latLng); +} + +class MapControllerZoomEvent extends AvesMapEvent { + final double delta; + + MapControllerZoomEvent(this.delta); +} + +class MapControllerRotationResetEvent extends AvesMapEvent {} + +class MapIdleUpdate extends AvesMapEvent { + final ZoomedBounds bounds; + + MapIdleUpdate(this.bounds); +} + +class MapMarkerLocationChangeEvent extends AvesMapEvent {} diff --git a/plugins/aves_map/lib/src/geo_entry.dart b/plugins/aves_map/lib/src/geo_entry.dart new file mode 100644 index 0000000..4699e38 --- /dev/null +++ b/plugins/aves_map/lib/src/geo_entry.dart @@ -0,0 +1,32 @@ +import 'package:fluster/fluster.dart'; +import 'package:flutter/foundation.dart'; + +class GeoEntry<T> extends Clusterable { + T? entry; + + GeoEntry({ + this.entry, + super.latitude, + super.longitude, + super.isCluster = false, + super.clusterId, + super.pointsSize, + super.markerId, + super.childMarkerId, + }); + + factory GeoEntry.createCluster(BaseCluster cluster, double longitude, double latitude) { + return GeoEntry( + latitude: latitude, + longitude: longitude, + isCluster: cluster.isCluster, + clusterId: cluster.id, + pointsSize: cluster.pointsSize, + markerId: cluster.id.toString(), + childMarkerId: cluster.childMarkerId, + ); + } + + @override + String toString() => '$runtimeType#${shortHash(this)}{isCluster=$isCluster, lat=$latitude, lng=$longitude, clusterId=$clusterId, pointsSize=$pointsSize, markerId=$markerId, childMarkerId=$childMarkerId}'; +} diff --git a/plugins/aves_map/lib/src/geo_utils.dart b/plugins/aves_map/lib/src/geo_utils.dart new file mode 100644 index 0000000..5272482 --- /dev/null +++ b/plugins/aves_map/lib/src/geo_utils.dart @@ -0,0 +1,134 @@ +import 'dart:math'; + +import 'package:latlong2/latlong.dart'; + +class GeoUtils { + static LatLng getLatLngCenter(List<LatLng> points) { + double x = 0; + double y = 0; + double z = 0; + + points.forEach((point) { + final lat = point.latitudeInRad; + final lng = point.longitudeInRad; + x += cos(lat) * cos(lng); + y += cos(lat) * sin(lng); + z += sin(lat); + }); + + final pointCount = points.length; + x /= pointCount; + y /= pointCount; + z /= pointCount; + + final lng = atan2(y, x); + final hyp = sqrt(x * x + y * y); + final lat = atan2(z, hyp); + return LatLng(radianToDeg(lat), radianToDeg(lng)); + } + + static bool contains(LatLng sw, LatLng ne, LatLng? point) { + if (point == null) return false; + final lat = point.latitude; + final lng = point.longitude; + final south = sw.latitude; + final north = ne.latitude; + final west = sw.longitude; + final east = ne.longitude; + return (south <= lat && lat <= north) && (west <= east ? (west <= lng && lng <= east) : (west <= lng || lng <= east)); + } + + // cf https://epsg.io/EPSGCODE.proj4 + // cf https://github.com/stevage/epsg + // cf https://github.com/maRci002/proj4dart/blob/master/test/data/all_proj4_defs.dart + static String? epsgToProj4(int? epsg) { + // `32767` refers to user defined values + if (epsg == null || epsg == 32767) return null; + + if (3038 <= epsg && epsg <= 3051) { + // ETRS89 / UTM (N-E) + final zone = epsg - 3012; + return '+proj=utm +zone=$zone +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs'; + } else if (26700 <= epsg && epsg <= 26799) { + // US State Plane (NAD27): 267xx/320xx + if (26703 <= epsg && epsg <= 26722) { + final zone = epsg - 26700; + return '+proj=utm +zone=$zone +datum=NAD27 +units=m +no_defs'; + } + // NAD27 datum requires loading `nadgrids` for accurate transformation: + // cf https://github.com/proj4js/proj4js/pull/363 + // cf https://github.com/maRci002/proj4dart/issues/8 + if (epsg == 26746) { + // NAD27 / California zone VI + return '+proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs'; + } else if (epsg == 26771) { + // NAD27 / Illinois East + return '+proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs'; + } + } else if ((26900 <= epsg && epsg <= 26999) || (32100 <= epsg && epsg <= 32199)) { + // US State Plane (NAD83): 269xx/321xx + if (epsg == 26966) { + // NAD83 Georgia East + return '+proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs'; + } + } else if (32200 <= epsg && epsg <= 32299) { + // WGS72 / UTM northern hemisphere: 322zz where zz is UTM zone number + final zone = epsg - 32200; + return '+proj=utm +zone=$zone +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs'; + } else if (32300 <= epsg && epsg <= 32399) { + // WGS72 / UTM southern hemisphere: 323zz where zz is UTM zone number + final zone = epsg - 32300; + return '+proj=utm +zone=$zone +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs'; + } else if (32400 <= epsg && epsg <= 32460) { + // WGS72BE / UTM northern hemisphere: 324zz where zz is UTM zone number + final zone = epsg - 32400; + return '+proj=utm +zone=$zone +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs'; + } else if (32500 <= epsg && epsg <= 32599) { + // WGS72BE / UTM southern hemisphere: 325zz where zz is UTM zone number + final zone = epsg - 32500; + return '+proj=utm +zone=$zone +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs'; + } else if (32600 <= epsg && epsg <= 32699) { + // WGS84 / UTM northern hemisphere: 326zz where zz is UTM zone number + final zone = epsg - 32600; + return '+proj=utm +zone=$zone +datum=WGS84 +units=m +no_defs'; + } else if (32700 <= epsg && epsg <= 32799) { + // WGS84 / UTM southern hemisphere: 327zz where zz is UTM zone number + final zone = epsg - 32700; + return '+proj=utm +zone=$zone +south +datum=WGS84 +units=m +no_defs'; + } + + return null; + } +} + +// cf https://www.maptiler.com/google-maps-coordinates-tile-bounds-projection/ +class MapServiceHelper { + final int tileSize; + late final double initialResolution, originShift; + + MapServiceHelper(this.tileSize) { + initialResolution = 2 * pi * 6378137 / tileSize; + originShift = 2 * pi * 6378137 / 2.0; + } + + int matrixSize(int zoomLevel) { + return 1 << zoomLevel; + } + + Point<double> pixelsToMeters(double px, double py, int zoomLevel) { + double res = resolution(zoomLevel); + double mx = px * res - originShift; + double my = -py * res + originShift; + return Point(mx, my); + } + + double resolution(int zoomLevel) { + return initialResolution / matrixSize(zoomLevel); + } + + Point<double> tileTopLeft(int tx, int ty, int zoomLevel) { + final px = tx * tileSize; + final py = ty * tileSize; + return pixelsToMeters(px.toDouble(), py.toDouble(), zoomLevel); + } +} diff --git a/plugins/aves_map/lib/src/interface.dart b/plugins/aves_map/lib/src/interface.dart new file mode 100644 index 0000000..3f2cc17 --- /dev/null +++ b/plugins/aves_map/lib/src/interface.dart @@ -0,0 +1,12 @@ +import 'package:aves_map/src/geo_entry.dart'; +import 'package:aves_map/src/marker/key.dart'; +import 'package:flutter/material.dart'; +import 'package:latlong2/latlong.dart'; + +typedef MarkerClusterBuilder<T> = Map<MarkerKey<T>, GeoEntry<T>> Function(); +typedef MarkerWidgetBuilder<T> = Widget Function(MarkerKey<T> key); +typedef MarkerImageReadyChecker<T> = bool Function(MarkerKey<T> key); +typedef UserZoomChangeCallback = void Function(double zoom); +typedef MapTapCallback = void Function(LatLng location); +typedef MarkerTapCallback<T> = void Function(GeoEntry<T> geoEntry); +typedef MarkerLongPressCallback<T> = void Function(GeoEntry<T> geoEntry, LatLng tapLocation); diff --git a/plugins/aves_map/lib/src/marker/arrow_painter.dart b/plugins/aves_map/lib/src/marker/arrow_painter.dart new file mode 100644 index 0000000..c38367f --- /dev/null +++ b/plugins/aves_map/lib/src/marker/arrow_painter.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; + +class MarkerArrowPainter extends CustomPainter { + final Color color, outlineColor; + final double outlineWidth; + final Size size; + + const MarkerArrowPainter({ + required this.color, + required this.outlineColor, + required this.outlineWidth, + required this.size, + }); + + @override + void paint(Canvas canvas, Size size) { + final triangleWidth = this.size.width; + final triangleHeight = this.size.height; + + final bottomCenter = Offset(size.width / 2, size.height); + final topLeft = bottomCenter + Offset(-triangleWidth / 2, -triangleHeight); + final topRight = bottomCenter + Offset(triangleWidth / 2, -triangleHeight); + + canvas.drawPath( + Path() + ..moveTo(bottomCenter.dx, bottomCenter.dy) + ..lineTo(topRight.dx, topRight.dy) + ..lineTo(topLeft.dx, topLeft.dy) + ..close(), + Paint()..color = outlineColor); + + canvas.translate(0, -outlineWidth.ceilToDouble()); + canvas.drawPath( + Path() + ..moveTo(bottomCenter.dx, bottomCenter.dy) + ..lineTo(topRight.dx, topRight.dy) + ..lineTo(topLeft.dx, topLeft.dy) + ..close(), + Paint()..color = color); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} diff --git a/plugins/aves_map/lib/src/marker/dot.dart b/plugins/aves_map/lib/src/marker/dot.dart new file mode 100644 index 0000000..b43b81b --- /dev/null +++ b/plugins/aves_map/lib/src/marker/dot.dart @@ -0,0 +1,18 @@ +import 'package:aves_map/src/theme.dart'; +import 'package:aves_ui/aves_ui.dart'; +import 'package:flutter/material.dart'; + +class DotMarker extends StatelessWidget { + const DotMarker({super.key}); + + @override + Widget build(BuildContext context) { + return const AvesDot( + diameter: MapThemeData.markerDotDiameter, + outerBorderWidth: MapThemeData.markerOuterBorderWidth, + innerBorderWidth: MapThemeData.markerInnerBorderWidth, + getOuterBorderColor: MapThemeData.markerThemedOuterBorderColor, + getInnerBorderColor: MapThemeData.markerThemedInnerBorderColor, + ); + } +} diff --git a/plugins/aves_map/lib/src/marker/generator.dart b/plugins/aves_map/lib/src/marker/generator.dart new file mode 100644 index 0000000..ca536b3 --- /dev/null +++ b/plugins/aves_map/lib/src/marker/generator.dart @@ -0,0 +1,138 @@ +import 'dart:ui' as ui; + +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +// generate bitmap from widget, for Google map +class MarkerGeneratorWidget<T extends Key> extends StatefulWidget { + final List<Widget> markers; + final bool Function(T markerKey) isReadyToRender; + final void Function(T markerKey, Uint8List bitmap) onRendered; + + const MarkerGeneratorWidget({ + super.key, + required this.markers, + required this.isReadyToRender, + required this.onRendered, + }); + + @override + State<MarkerGeneratorWidget<T>> createState() => _MarkerGeneratorWidgetState<T>(); +} + +class _MarkerGeneratorWidgetState<T extends Key> extends State<MarkerGeneratorWidget<T>> { + final Set<_MarkerGeneratorItem<T>> _items = {}; + + @override + void initState() { + super.initState(); + _checkNextFrame(); + } + + @override + void didUpdateWidget(covariant MarkerGeneratorWidget<T> oldWidget) { + super.didUpdateWidget(oldWidget); + final devicePixelRatio = View.of(context).devicePixelRatio; + widget.markers.forEach((markerWidget) { + final item = _getOrCreate( + markerKey: markerWidget.key as T, + devicePixelRatio: devicePixelRatio, + ); + item.globalKey = GlobalKey(); + }); + _checkNextFrame(); + } + + void _checkNextFrame() { + WidgetsBinding.instance.addPostFrameCallback((_) async { + if (!mounted) return; + final waitingItems = _items.where((v) => v.isWaiting).toSet(); + final readyItems = waitingItems.where((v) => widget.isReadyToRender(v.markerKey)).toSet(); + readyItems.forEach((v) async { + final bitmap = await v.render(); + if (bitmap != null) { + widget.onRendered(v.markerKey, bitmap); + } + }); + if (readyItems.length < waitingItems.length) { + _checkNextFrame(); + setState(() {}); + } + }); + } + + @override + Widget build(BuildContext context) { + return Transform.translate( + offset: Offset(MediaQuery.sizeOf(context).width, 0), + child: Material( + type: MaterialType.transparency, + child: Stack( + children: _items.map((item) { + return RepaintBoundary( + key: item.globalKey, + child: widget.markers.firstWhereOrNull((v) => v.key == item.markerKey) ?? const SizedBox(), + ); + }).toList(), + ), + ), + ); + } + + _MarkerGeneratorItem _getOrCreate({ + required T markerKey, + required double devicePixelRatio, + }) { + final existingItem = _items.firstWhereOrNull((v) => v.markerKey == markerKey); + if (existingItem != null) return existingItem; + + final newItem = _MarkerGeneratorItem( + markerKey: markerKey, + devicePixelRatio: devicePixelRatio, + ); + _items.add(newItem); + return newItem; + } +} + +enum MarkerGeneratorItemState { waiting, rendering, done } + +class _MarkerGeneratorItem<T extends Key> { + final T markerKey; + final double devicePixelRatio; + GlobalKey? globalKey; + MarkerGeneratorItemState state = MarkerGeneratorItemState.waiting; + + _MarkerGeneratorItem({ + required this.markerKey, + required this.devicePixelRatio, + }); + + bool get isWaiting => state == MarkerGeneratorItemState.waiting; + + Future<Uint8List?> render() async { + Uint8List? bytes; + final _globalKey = globalKey; + if (_globalKey != null) { + state = MarkerGeneratorItemState.rendering; + final boundary = _globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary; + if (boundary.hasSize && boundary.size != Size.zero) { + try { + final image = await boundary.toImage(pixelRatio: devicePixelRatio); + final byteData = await image.toByteData(format: ui.ImageByteFormat.png); + bytes = byteData?.buffer.asUint8List(); + } catch (error) { + // happens when widget is offscreen + debugPrint('failed to render image for key=$_globalKey with error=$error'); + } + } + state = bytes != null ? MarkerGeneratorItemState.done : MarkerGeneratorItemState.waiting; + } + return bytes; + } + + @override + String toString() => '$runtimeType#${shortHash(this)}{markerKey=$markerKey, globalKey=$globalKey, state=$state}'; +} diff --git a/plugins/aves_map/lib/src/marker/image.dart b/plugins/aves_map/lib/src/marker/image.dart new file mode 100644 index 0000000..58f0377 --- /dev/null +++ b/plugins/aves_map/lib/src/marker/image.dart @@ -0,0 +1,166 @@ +import 'package:aves_map/aves_map.dart'; +import 'package:aves_map/src/marker/arrow_painter.dart'; +import 'package:collection/collection.dart'; +import 'package:custom_rounded_rectangle_border/custom_rounded_rectangle_border.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:intl/intl.dart' as intl; +import 'package:latlong2/latlong.dart'; + +class ImageMarker extends StatelessWidget { + final int? count; + final intl.NumberFormat countFormatter; + final bool drawArrow; + final Widget Function(double extent) buildThumbnailImage; + + static const double outerBorderRadiusDim = 8; + static const outerBorderWidth = MapThemeData.markerOuterBorderWidth; + static const innerBorderWidth = MapThemeData.markerInnerBorderWidth; + static const extent = MapThemeData.markerImageExtent; + static const arrowSize = MapThemeData.markerArrowSize; + static const outerBorderRadius = BorderRadius.all(Radius.circular(outerBorderRadiusDim)); + static const innerRadius = Radius.circular(outerBorderRadiusDim - outerBorderWidth); + static const innerBorderRadius = BorderRadius.all(innerRadius); + + ImageMarker({ + super.key, + required this.count, + required String? locale, + this.drawArrow = true, + required this.buildThumbnailImage, + }) : countFormatter = intl.NumberFormat.decimalPattern(locale); + + @override + Widget build(BuildContext context) { + Widget child = buildThumbnailImage(extent); + + // need to be sized for the Google map marker generator + child = SizedBox( + width: extent, + height: extent, + child: child, + ); + + final theme = Theme.of(context); + final isDark = theme.brightness == Brightness.dark; + final outerBorderColor = MapThemeData.markerThemedOuterBorderColor(isDark); + final innerBorderColor = MapThemeData.markerThemedInnerBorderColor(isDark); + + final outerDecoration = BoxDecoration( + border: Border.fromBorderSide(BorderSide( + color: outerBorderColor, + width: outerBorderWidth, + )), + borderRadius: outerBorderRadius, + ); + + final innerDecoration = BoxDecoration( + border: Border.fromBorderSide(BorderSide( + color: innerBorderColor, + width: innerBorderWidth, + )), + borderRadius: innerBorderRadius, + ); + + child = DecoratedBox( + decoration: innerDecoration, + position: DecorationPosition.foreground, + child: ClipRRect( + borderRadius: innerBorderRadius, + child: child, + ), + ); + + if (count != null) { + final borderSide = BorderSide( + color: innerBorderColor, + width: innerBorderWidth, + ); + child = Stack( + children: [ + child, + Container( + padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 2), + decoration: ShapeDecoration( + color: theme.colorScheme.primary, + shape: _buildCornerDetailShape(context, borderSide), + ), + child: Text( + countFormatter.format(count), + style: TextStyle( + fontSize: 12, + color: theme.colorScheme.onPrimary, + ), + ), + ), + ], + ); + } + + child = Container( + decoration: outerDecoration, + child: child, + ); + + if (drawArrow) { + child = CustomPaint( + foregroundPainter: MarkerArrowPainter( + color: innerBorderColor, + outlineColor: outerBorderColor, + outlineWidth: outerBorderWidth, + size: arrowSize, + ), + child: Padding( + padding: EdgeInsets.only(bottom: arrowSize.height), + child: child, + ), + ); + } + + return child; + } + + ShapeBorder _buildCornerDetailShape(BuildContext context, BorderSide side) { + final isRtl = Directionality.of(context) == TextDirection.rtl; + return CustomRoundedRectangleBorder( + leftSide: side, + rightSide: side, + topSide: side, + bottomSide: side, + topLeftCornerSide: isRtl ? null : side, + topRightCornerSide: isRtl ? side : null, + bottomLeftCornerSide: isRtl ? side : null, + bottomRightCornerSide: isRtl ? null : side, + borderRadius: BorderRadius.only( + topLeft: isRtl ? Radius.zero : innerRadius, + topRight: isRtl ? innerRadius : Radius.zero, + bottomLeft: isRtl ? innerRadius : Radius.zero, + bottomRight: isRtl ? Radius.zero : innerRadius, + ), + ); + } + + static const _crs = Epsg3857(); + + static GeoEntry<T>? markerMatch<T>(LatLng position, double zoom, Set<GeoEntry<T>> markers) { + final pressOffset = _crs.latLngToOffset(position, zoom); + + const double markerWidth = extent; + const double markerHeight = extent; + + return markers.firstWhereOrNull((marker) { + final latitude = marker.latitude; + final longitude = marker.longitude; + if (latitude == null || longitude == null) return false; + + final markerAnchorPoint = _crs.latLngToOffset(LatLng(latitude, longitude), zoom); + final bottom = markerAnchorPoint.dy; + final top = bottom - markerHeight; + final left = markerAnchorPoint.dx - markerWidth / 2; + final right = left + markerWidth; + final markerRect = Rect.fromLTRB(left, top, right, bottom); + + return markerRect.contains(pressOffset); + }); + } +} diff --git a/plugins/aves_map/lib/src/marker/key.dart b/plugins/aves_map/lib/src/marker/key.dart new file mode 100644 index 0000000..188ec01 --- /dev/null +++ b/plugins/aves_map/lib/src/marker/key.dart @@ -0,0 +1,13 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; + +@immutable +class MarkerKey<T> extends LocalKey with EquatableMixin { + final T entry; + final int? count; + + @override + List<Object?> get props => [entry, count]; + + const MarkerKey(this.entry, this.count); +} diff --git a/plugins/aves_map/lib/src/overlay/overlay.dart b/plugins/aves_map/lib/src/overlay/overlay.dart new file mode 100644 index 0000000..6fafa66 --- /dev/null +++ b/plugins/aves_map/lib/src/overlay/overlay.dart @@ -0,0 +1,17 @@ +import 'package:aves_map/src/overlay/tile.dart'; +import 'package:flutter/painting.dart'; +import 'package:latlong2/latlong.dart'; + +mixin MapOverlay { + String get id; + + bool get canOverlay; + + LatLng? get topLeft; + + LatLng? get bottomRight; + + ImageProvider get imageProvider; + + Future<MapTile?> getTile(int tx, int ty, int? zoomLevel); +} diff --git a/plugins/aves_map/lib/src/overlay/tile.dart b/plugins/aves_map/lib/src/overlay/tile.dart new file mode 100644 index 0000000..cc5e5a0 --- /dev/null +++ b/plugins/aves_map/lib/src/overlay/tile.dart @@ -0,0 +1,13 @@ +import 'package:flutter/foundation.dart'; + +@immutable +class MapTile { + final int width, height; + final Uint8List data; + + const MapTile({ + required this.width, + required this.height, + required this.data, + }); +} diff --git a/plugins/aves_map/lib/src/style.dart b/plugins/aves_map/lib/src/style.dart new file mode 100644 index 0000000..32f2f1a --- /dev/null +++ b/plugins/aves_map/lib/src/style.dart @@ -0,0 +1,134 @@ +import 'dart:convert'; + +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +// OSM raster tile providers: https://wiki.openstreetmap.org/wiki/Raster_tile_providers +// OSM vector tile providers: https://wiki.openstreetmap.org/wiki/Vector_tiles#Providers +// Leaflet providers preview: https://leaflet-extras.github.io/leaflet-providers/preview/ +// OpenMapTiles styles: https://openmaptiles.org/styles/ +// Examples: https://github.com/deckerst/aves/wiki/Custom-maps +class EntryMapStyle extends Equatable { + final String key; + final String? name; + final bool isRaster; + final String? url; // not strictly a `Uri` as it may contain templates like `{x}` + final List<String> subdomains; + final String? userAgent; + final bool needMobileService; + final bool isHeavy; + + @override + List<Object?> get props => [key, name, isRaster, url]; + + const EntryMapStyle({ + required this.key, + this.name, + this.isRaster = true, + this.url, + List<String>? subdomains, + this.userAgent, + this.needMobileService = false, + this.isHeavy = false, + }) : subdomains = subdomains ?? const ['a', 'b', 'c']; + + static EntryMapStyle? fromJson(String? jsonString) { + if (jsonString == null || jsonString.isEmpty) return null; + + try { + final jsonMap = jsonDecode(jsonString); + if (jsonMap is Map<String, Object?>) { + return _fromMap(jsonMap); + } + debugPrint('failed to parse style from json=$jsonString'); + } catch (error) { + // no need for stack + debugPrint('failed to parse style from json=$jsonString error=$error'); + } + return null; + } + + String toJson() => jsonEncode(_toMap()); + + static EntryMapStyle _fromMap(Map<String, Object?> jsonMap) { + return EntryMapStyle( + key: jsonMap['key'] as String, + name: jsonMap['name'] as String?, + isRaster: jsonMap['isRaster'] as bool, + url: jsonMap['url'] as String?, + subdomains: (jsonMap['subdomains'] as List?)?.cast<String>(), + userAgent: jsonMap['userAgent'] as String?, + needMobileService: jsonMap['needMobileService'] as bool, + isHeavy: jsonMap['isHeavy'] as bool, + ); + } + + Map<String, Object?> _toMap() { + return { + 'key': key, + 'name': name, + 'isRaster': isRaster, + 'url': url, + 'subdomains': subdomains, + 'userAgent': userAgent, + 'needMobileService': needMobileService, + 'isHeavy': isHeavy, + }; + } +} + +class EntryMapStyles { + // Google + + static const googleNormal = EntryMapStyle( + key: 'googleNormal', + needMobileService: true, + isHeavy: true, + ); + + static const googleHybrid = EntryMapStyle( + key: 'googleHybrid', + needMobileService: true, + isHeavy: true, + ); + + static const googleTerrain = EntryMapStyle( + key: 'googleTerrain', + needMobileService: true, + isHeavy: true, + ); + + // Vector (OpenMapTiles) + + static const osmLiberty = EntryMapStyle( + key: 'osmLiberty', + isRaster: false, + ); + + // Raster (Leaflet) + + static const openTopoMap = EntryMapStyle( + key: 'openTopoMap', + url: 'https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png', + ); + + static const osmHot = EntryMapStyle( + key: 'osmHot', + url: 'https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png', + ); + + static const stamenWatercolor = EntryMapStyle( + key: 'stamenWatercolor', + url: 'https://watercolormaps.collection.cooperhewitt.org/tile/watercolor/{z}/{x}/{y}.jpg', + ); + + // default styles that do not need mobile services + static List<EntryMapStyle> baseStyles = [ + // Vector (OpenMapTiles) + osmLiberty, + // Raster (Leaflet) + openTopoMap, + osmHot, + stamenWatercolor, + ]; +} diff --git a/plugins/aves_map/lib/src/theme.dart b/plugins/aves_map/lib/src/theme.dart new file mode 100644 index 0000000..521d94d --- /dev/null +++ b/plugins/aves_map/lib/src/theme.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +enum MapNavigationButton { back, close, map, none } + +class MapThemeData { + final bool interactive, showCoordinateFilter; + final MapNavigationButton navigationButton; + final Animation<double> scale; + final VisualDensity visualDensity; + final double? mapHeight; + final EdgeInsets attributionPadding; + + const MapThemeData({ + required this.interactive, + required this.showCoordinateFilter, + required this.navigationButton, + required this.scale, + required this.visualDensity, + required this.mapHeight, + required this.attributionPadding, + }); + + static const double markerOuterBorderWidth = 1.5; + static const double markerInnerBorderWidth = 2; + static const double markerImageExtent = 48.0; + static const Size markerArrowSize = Size(8, 6); + static const double markerDotDiameter = 16; + static const int trackWidth = 5; + + static Color markerThemedOuterBorderColor(bool isDark) => isDark ? Colors.white30 : Colors.black26; + + static Color markerThemedInnerBorderColor(bool isDark) => isDark ? const Color(0xFF212121) : Colors.white; +} diff --git a/plugins/aves_map/lib/src/zoomed_bounds.dart b/plugins/aves_map/lib/src/zoomed_bounds.dart new file mode 100644 index 0000000..3c709bd --- /dev/null +++ b/plugins/aves_map/lib/src/zoomed_bounds.dart @@ -0,0 +1,105 @@ +import 'dart:math'; +import 'dart:ui'; + +import 'package:aves_map/src/geo_utils.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:latlong2/latlong.dart'; + +@immutable +class ZoomedBounds extends Equatable { + final LatLng sw, ne; + final double zoom, rotation; + + // returns [southwestLng, southwestLat, northeastLng, northeastLat], as expected by Fluster + List<double> get boundingBox => [sw.longitude, sw.latitude, ne.longitude, ne.latitude]; + + // Map services (Google Maps, OpenStreetMap) use the spherical Mercator projection (EPSG 3857). + static const _crs = Epsg3857(); + + // The projected center appears visually in the middle of the bounds. + LatLng get projectedCenter { + final swPoint = _crs.latLngToOffset(sw, zoom); + final nePoint = _crs.latLngToOffset(ne, zoom); + // assume no padding around bounds + return _crs.offsetToLatLng((swPoint + nePoint) / 2, zoom); + } + + @override + List<Object?> get props => [sw, ne, zoom, rotation]; + + const ZoomedBounds({ + required this.sw, + required this.ne, + required this.zoom, + required this.rotation, + }); + + static const _collocationMaxDeltaThreshold = 360 / (2 << 19); + + factory ZoomedBounds.fromPoints({ + required Set<LatLng> points, + double collocationZoom = 20, + }) { + var west = .0, south = .0, east = .0, north = .0; + var zoom = collocationZoom; + + if (points.isNotEmpty) { + final first = points.first; + west = first.longitude; + south = first.latitude; + east = first.longitude; + north = first.latitude; + + for (var point in points) { + final lng = point.longitude; + final lat = point.latitude; + if (lng < west) west = lng; + if (lat < south) south = lat; + if (lng > east) east = lng; + if (lat > north) north = lat; + } + + final boundsDelta = max(north - south, east - west); + if (boundsDelta > _collocationMaxDeltaThreshold) { + zoom = max(1, log(360) / ln2 - log(boundsDelta) / ln2); + } + } + return ZoomedBounds( + sw: LatLng(south, west), + ne: LatLng(north, east), + zoom: zoom, + rotation: 0, + ); + } + + ZoomedBounds copyWith({ + LatLng? sw, + LatLng? ne, + double? zoom, + double? rotation, + }) { + return ZoomedBounds( + sw: sw ?? this.sw, + ne: ne ?? this.ne, + zoom: zoom ?? this.zoom, + rotation: rotation ?? this.rotation, + ); + } + + bool contains(LatLng location) => GeoUtils.contains(sw, ne, location); + + Size toDisplaySize() { + final swPoint = _crs.latLngToOffset(sw, zoom); + final nePoint = _crs.latLngToOffset(ne, zoom); + return Size((swPoint.dx - nePoint.dx).abs(), (swPoint.dy - nePoint.dy).abs()); + } + + Offset offset(LatLng location) { + final swPoint = _crs.latLngToOffset(sw, zoom); + final nePoint = _crs.latLngToOffset(ne, zoom); + final point = _crs.latLngToOffset(location, zoom); + return Offset(point.dx - swPoint.dx, point.dy - nePoint.dy); + } +} diff --git a/plugins/aves_map/pubspec.yaml b/plugins/aves_map/pubspec.yaml new file mode 100644 index 0000000..226de97 --- /dev/null +++ b/plugins/aves_map/pubspec.yaml @@ -0,0 +1,27 @@ +name: aves_map +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.9.0 <4.0.0" +resolution: workspace + +dependencies: + flutter: + sdk: flutter + aves_ui: + path: ../aves_ui + collection: + custom_rounded_rectangle_border: + equatable: + fluster: + flutter_map: + intl: + latlong2: + leak_tracker: + provider: + +dev_dependencies: + flutter_lints: + +flutter: diff --git a/plugins/aves_model/.gitignore b/plugins/aves_model/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/plugins/aves_model/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/plugins/aves_model/.metadata b/plugins/aves_model/.metadata new file mode 100644 index 0000000..ad910f5 --- /dev/null +++ b/plugins/aves_model/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 2ad6cd72c040113b47ee9055e722606a490ef0da + channel: stable + +project_type: package diff --git a/plugins/aves_model/analysis_options.yaml b/plugins/aves_model/analysis_options.yaml new file mode 100644 index 0000000..f04c6cf --- /dev/null +++ b/plugins/aves_model/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/plugins/aves_model/lib/aves_model.dart b/plugins/aves_model/lib/aves_model.dart new file mode 100644 index 0000000..5ed3e68 --- /dev/null +++ b/plugins/aves_model/lib/aves_model.dart @@ -0,0 +1,29 @@ +export 'src/actions/chip.dart'; +export 'src/actions/chip_set.dart'; +export 'src/actions/entry.dart'; +export 'src/actions/entry_set.dart'; +export 'src/actions/explorer.dart'; +export 'src/actions/map.dart'; +export 'src/actions/map_cluster.dart'; +export 'src/actions/move_type.dart'; +export 'src/actions/settings.dart'; +export 'src/actions/share.dart'; +export 'src/actions/slideshow.dart'; +export 'src/editor/enums.dart'; +export 'src/entry/base.dart'; +export 'src/events/actions.dart'; +export 'src/metadata/enums.dart'; +export 'src/metadata/fields.dart'; +export 'src/settings/access.dart'; +export 'src/settings/enums.dart'; +export 'src/settings/event.dart'; +export 'src/settings/keys.dart'; +export 'src/settings/store.dart'; +export 'src/source/album.dart'; +export 'src/source/enums.dart'; +export 'src/source/vault.dart'; +export 'src/storage/relative_dir.dart'; +export 'src/storage/volume.dart'; +export 'src/video/keys.dart'; +export 'src/video/stream_types.dart'; +export 'src/wallpaper_target.dart'; diff --git a/plugins/aves_model/lib/src/actions/chip.dart b/plugins/aves_model/lib/src/actions/chip.dart new file mode 100644 index 0000000..b2b119c --- /dev/null +++ b/plugins/aves_model/lib/src/actions/chip.dart @@ -0,0 +1,13 @@ +enum ChipAction { + goToAlbumPage, + goToCountryPage, + goToPlacePage, + goToTagPage, + goToExplorerPage, + ratingOrGreater, + ratingOrLower, + decompose, + reverse, + hide, + lockVault, +} diff --git a/plugins/aves_model/lib/src/actions/chip_set.dart b/plugins/aves_model/lib/src/actions/chip_set.dart new file mode 100644 index 0000000..13db2f8 --- /dev/null +++ b/plugins/aves_model/lib/src/actions/chip_set.dart @@ -0,0 +1,74 @@ +enum ChipSetAction { + // general + configureView, + select, + selectAll, + selectNone, + // browsing + search, + toggleTitleSearch, + createGroup, + createAlbum, + createVault, + // browsing or selecting + map, + slideshow, + stats, + // selecting (single/multiple filters) + delete, + remove, + hide, + pin, + unpin, + group, + lockVault, + showCountryStates, + showCollection, + // selecting (single filter) + rename, + setCover, + configureVault, +} + +class ChipSetActions { + static const general = [ + ChipSetAction.configureView, + ChipSetAction.select, + ChipSetAction.selectAll, + ChipSetAction.selectNone, + ]; + + // `null` items are converted to dividers + static const browsing = [ + ChipSetAction.search, + ChipSetAction.toggleTitleSearch, + null, + ChipSetAction.map, + ChipSetAction.slideshow, + ChipSetAction.stats, + null, + ChipSetAction.createAlbum, + ChipSetAction.createVault, + ]; + + // `null` items are converted to dividers + static const selection = [ + ChipSetAction.setCover, + ChipSetAction.pin, + ChipSetAction.unpin, + ChipSetAction.delete, + ChipSetAction.remove, + ChipSetAction.rename, + ChipSetAction.showCountryStates, + ChipSetAction.hide, + ChipSetAction.group, + null, + ChipSetAction.showCollection, + ChipSetAction.map, + ChipSetAction.slideshow, + ChipSetAction.stats, + null, + ChipSetAction.configureVault, + ChipSetAction.lockVault, + ]; +} diff --git a/plugins/aves_model/lib/src/actions/entry.dart b/plugins/aves_model/lib/src/actions/entry.dart new file mode 100644 index 0000000..02becf1 --- /dev/null +++ b/plugins/aves_model/lib/src/actions/entry.dart @@ -0,0 +1,148 @@ +enum EntryAction { + info, + addShortcut, + copyToClipboard, + delete, + restore, + convert, + print, + rename, + copy, + move, + share, + toggleFavourite, + // raster + rotateCCW, + rotateCW, + flip, + // vector + viewSource, + // video + lockViewer, + videoCaptureFrame, + videoSelectStreams, + videoSetSpeed, + videoABRepeat, + videoToggleMute, + videoSettings, + videoTogglePlay, + videoReplay10, + videoSkip10, + videoShowPreviousFrame, + videoShowNextFrame, + // external + edit, + open, + openVideoPlayer, + openMap, + setAs, + cast, + // platform + rotateScreen, + // metadata + editDate, + editLocation, + editTitleDescription, + editRating, + editTags, + removeMetadata, + exportMetadata, + // metadata / GeoTIFF + showGeoTiffOnMap, + // metadata / motion photo + convertMotionPhotoToStillImage, + viewMotionPhotoVideo, + // debug + debug, +} + +class EntryActions { + static const topLevel = [ + EntryAction.info, + EntryAction.share, + EntryAction.edit, + EntryAction.rename, + EntryAction.delete, + EntryAction.copy, + EntryAction.move, + EntryAction.toggleFavourite, + EntryAction.rotateScreen, + EntryAction.viewSource, + ]; + + static const export = [ + ...exportInternal, + ...exportExternal, + ]; + + static const exportInternal = [ + EntryAction.convert, + EntryAction.addShortcut, + EntryAction.copyToClipboard, + EntryAction.print, + ]; + + static const exportExternal = [ + EntryAction.open, + EntryAction.openMap, + EntryAction.setAs, + EntryAction.cast, + ]; + + static const pageActions = { + EntryAction.videoCaptureFrame, + EntryAction.videoToggleMute, + EntryAction.videoSetSpeed, + EntryAction.videoABRepeat, + EntryAction.videoSelectStreams, + EntryAction.videoSettings, + ...videoPlayback, + ...orientationActions, + }; + + static const orientationActions = [ + EntryAction.rotateCCW, + EntryAction.rotateCW, + EntryAction.flip, + ]; + + static const trashed = [ + EntryAction.delete, + EntryAction.restore, + EntryAction.debug, + ]; + + static const video = [ + EntryAction.videoCaptureFrame, + EntryAction.videoToggleMute, + EntryAction.videoSetSpeed, + EntryAction.videoABRepeat, + EntryAction.videoSelectStreams, + EntryAction.videoSettings, + EntryAction.lockViewer, + ]; + + static const videoPlayback = [ + EntryAction.videoReplay10, + EntryAction.videoShowPreviousFrame, + EntryAction.videoTogglePlay, + EntryAction.videoShowNextFrame, + EntryAction.videoSkip10, + ]; + + static const commonMetadataActions = [ + EntryAction.editDate, + EntryAction.editLocation, + EntryAction.editTitleDescription, + EntryAction.editRating, + EntryAction.editTags, + EntryAction.removeMetadata, + EntryAction.exportMetadata, + ]; + + static const formatSpecificMetadataActions = [ + EntryAction.showGeoTiffOnMap, + EntryAction.convertMotionPhotoToStillImage, + EntryAction.viewMotionPhotoVideo, + ]; +} diff --git a/plugins/aves_model/lib/src/actions/entry_set.dart b/plugins/aves_model/lib/src/actions/entry_set.dart new file mode 100644 index 0000000..a8318f8 --- /dev/null +++ b/plugins/aves_model/lib/src/actions/entry_set.dart @@ -0,0 +1,136 @@ +enum EntrySetAction { + // general + configureView, + select, + selectAll, + selectNone, + + // browsing + searchCollection, + toggleTitleSearch, + addDynamicAlbum, + addShortcut, + setHome, + emptyBin, + + // browsing or selecting + map, + slideshow, + stats, + rescan, + + // selecting + share, + cast, // ✅ NEW: enter "casting mode" (no autoplay) + delete, + restore, + copy, + move, + rename, + convert, + toggleFavourite, + rotateCCW, + rotateCW, + flip, + editDate, + editLocation, + editTitleDescription, + editRating, + editTags, + removeMetadata, +} + +class EntrySetActions { + static const general = [ + EntrySetAction.configureView, + EntrySetAction.select, + EntrySetAction.selectAll, + EntrySetAction.selectNone, + ]; + + // `null` items are converted to dividers + static const pageBrowsing = [ + EntrySetAction.searchCollection, + EntrySetAction.toggleTitleSearch, + EntrySetAction.addDynamicAlbum, + EntrySetAction.addShortcut, + EntrySetAction.setHome, + null, + EntrySetAction.map, + EntrySetAction.slideshow, + EntrySetAction.stats, + null, + EntrySetAction.rescan, + EntrySetAction.emptyBin, + ]; + + // exclude bin related actions + static const collectionEditorBrowsing = [ + EntrySetAction.searchCollection, + EntrySetAction.toggleTitleSearch, + EntrySetAction.map, + EntrySetAction.slideshow, + EntrySetAction.stats, + // only available as a quick action + EntrySetAction.selectAll, + ]; + + // `null` items are converted to dividers + static const pageSelection = [ + EntrySetAction.share, + EntrySetAction.cast, // ✅ NEW (selection): arm casting, do not start playback + EntrySetAction.delete, + EntrySetAction.restore, + EntrySetAction.copy, + EntrySetAction.move, + EntrySetAction.rename, + EntrySetAction.convert, + EntrySetAction.toggleFavourite, + null, + EntrySetAction.map, + EntrySetAction.slideshow, + EntrySetAction.stats, + null, + EntrySetAction.rescan, + // editing actions are in their subsection + ]; + + // exclude bin related actions + static const collectionEditorSelectionRegular = [ + EntrySetAction.share, + EntrySetAction.cast, // ✅ NEW (editor selection) + EntrySetAction.delete, + EntrySetAction.copy, + EntrySetAction.move, + EntrySetAction.rename, + EntrySetAction.convert, + EntrySetAction.toggleFavourite, + EntrySetAction.map, + EntrySetAction.slideshow, + EntrySetAction.stats, + EntrySetAction.selectAll, + // editing actions are in their subsection + ]; + + static const collectionEditorSelectionEdit = [ + EntrySetAction.rotateCCW, + EntrySetAction.rotateCW, + EntrySetAction.flip, + EntrySetAction.editDate, + EntrySetAction.editLocation, + EntrySetAction.editTitleDescription, + EntrySetAction.editRating, + EntrySetAction.editTags, + EntrySetAction.removeMetadata, + ]; + + static const edit = [ + EntrySetAction.editDate, + EntrySetAction.editLocation, + EntrySetAction.editTitleDescription, + EntrySetAction.editRating, + EntrySetAction.editTags, + EntrySetAction.removeMetadata, + ]; +} + diff --git a/plugins/aves_model/lib/src/actions/entry_set.dart.ok b/plugins/aves_model/lib/src/actions/entry_set.dart.ok new file mode 100644 index 0000000..90bc1df --- /dev/null +++ b/plugins/aves_model/lib/src/actions/entry_set.dart.ok @@ -0,0 +1,129 @@ +enum EntrySetAction { + // general + configureView, + select, + selectAll, + selectNone, + // browsing + searchCollection, + toggleTitleSearch, + addDynamicAlbum, + addShortcut, + setHome, + emptyBin, + // browsing or selecting + map, + slideshow, + stats, + rescan, + // selecting + share, + delete, + restore, + copy, + move, + rename, + convert, + toggleFavourite, + rotateCCW, + rotateCW, + flip, + editDate, + editLocation, + editTitleDescription, + editRating, + editTags, + removeMetadata, +} + +class EntrySetActions { + static const general = [ + EntrySetAction.configureView, + EntrySetAction.select, + EntrySetAction.selectAll, + EntrySetAction.selectNone, + ]; + + // `null` items are converted to dividers + static const pageBrowsing = [ + EntrySetAction.searchCollection, + EntrySetAction.toggleTitleSearch, + EntrySetAction.addDynamicAlbum, + EntrySetAction.addShortcut, + EntrySetAction.setHome, + null, + EntrySetAction.map, + EntrySetAction.slideshow, + EntrySetAction.stats, + null, + EntrySetAction.rescan, + EntrySetAction.emptyBin, + ]; + + // exclude bin related actions + static const collectionEditorBrowsing = [ + EntrySetAction.searchCollection, + EntrySetAction.toggleTitleSearch, + EntrySetAction.map, + EntrySetAction.slideshow, + EntrySetAction.stats, + // only available as a quick action + EntrySetAction.selectAll, + ]; + + // `null` items are converted to dividers + static const pageSelection = [ + EntrySetAction.share, + EntrySetAction.delete, + EntrySetAction.restore, + EntrySetAction.copy, + EntrySetAction.move, + EntrySetAction.rename, + EntrySetAction.convert, + EntrySetAction.toggleFavourite, + null, + EntrySetAction.map, + EntrySetAction.slideshow, + EntrySetAction.stats, + null, + EntrySetAction.rescan, + // editing actions are in their subsection + ]; + + // exclude bin related actions + static const collectionEditorSelectionRegular = [ + EntrySetAction.share, + EntrySetAction.delete, + EntrySetAction.copy, + EntrySetAction.move, + EntrySetAction.rename, + EntrySetAction.convert, + EntrySetAction.toggleFavourite, + EntrySetAction.map, + EntrySetAction.slideshow, + EntrySetAction.stats, + EntrySetAction.selectAll, + // editing actions are in their subsection + ]; + + static const collectionEditorSelectionEdit = [ + EntrySetAction.rotateCCW, + EntrySetAction.rotateCW, + EntrySetAction.flip, + EntrySetAction.editDate, + EntrySetAction.editLocation, + EntrySetAction.editTitleDescription, + EntrySetAction.editRating, + EntrySetAction.editTags, + EntrySetAction.removeMetadata, + ]; + + static const edit = [ + EntrySetAction.editDate, + EntrySetAction.editLocation, + EntrySetAction.editTitleDescription, + EntrySetAction.editRating, + EntrySetAction.editTags, + EntrySetAction.removeMetadata, + ]; +} diff --git a/plugins/aves_model/lib/src/actions/explorer.dart b/plugins/aves_model/lib/src/actions/explorer.dart new file mode 100644 index 0000000..58d595b --- /dev/null +++ b/plugins/aves_model/lib/src/actions/explorer.dart @@ -0,0 +1,6 @@ +enum ExplorerAction { + addShortcut, + setHome, + hide, + stats, +} diff --git a/plugins/aves_model/lib/src/actions/map.dart b/plugins/aves_model/lib/src/actions/map.dart new file mode 100644 index 0000000..1c71363 --- /dev/null +++ b/plugins/aves_model/lib/src/actions/map.dart @@ -0,0 +1,9 @@ +enum MapAction { + // any map panel + selectStyle, + openMapApp, + zoomIn, + zoomOut, + // full page only + addShortcut, +} diff --git a/plugins/aves_model/lib/src/actions/map_cluster.dart b/plugins/aves_model/lib/src/actions/map_cluster.dart new file mode 100644 index 0000000..d022934 --- /dev/null +++ b/plugins/aves_model/lib/src/actions/map_cluster.dart @@ -0,0 +1,4 @@ +enum MapClusterAction { + editLocation, + removeLocation, +} diff --git a/plugins/aves_model/lib/src/actions/move_type.dart b/plugins/aves_model/lib/src/actions/move_type.dart new file mode 100644 index 0000000..7c362b0 --- /dev/null +++ b/plugins/aves_model/lib/src/actions/move_type.dart @@ -0,0 +1,7 @@ +enum MoveType { + copy, + move, + export, + toBin, + fromBin, +} diff --git a/plugins/aves_model/lib/src/actions/settings.dart b/plugins/aves_model/lib/src/actions/settings.dart new file mode 100644 index 0000000..77e5a55 --- /dev/null +++ b/plugins/aves_model/lib/src/actions/settings.dart @@ -0,0 +1,4 @@ +enum SettingsAction { + export, + import, +} diff --git a/plugins/aves_model/lib/src/actions/share.dart b/plugins/aves_model/lib/src/actions/share.dart new file mode 100644 index 0000000..3be6fb6 --- /dev/null +++ b/plugins/aves_model/lib/src/actions/share.dart @@ -0,0 +1,4 @@ +enum ShareAction { + imageOnly, + videoOnly, +} diff --git a/plugins/aves_model/lib/src/actions/slideshow.dart b/plugins/aves_model/lib/src/actions/slideshow.dart new file mode 100644 index 0000000..a4f7825 --- /dev/null +++ b/plugins/aves_model/lib/src/actions/slideshow.dart @@ -0,0 +1,6 @@ +enum SlideshowAction { + resume, + showInCollection, + cast, + settings, +} diff --git a/plugins/aves_model/lib/src/editor/enums.dart b/plugins/aves_model/lib/src/editor/enums.dart new file mode 100644 index 0000000..7d03820 --- /dev/null +++ b/plugins/aves_model/lib/src/editor/enums.dart @@ -0,0 +1,66 @@ +enum EditorAction { transform } + +enum CropAspectRatio { free, original, square, ar_16_9, ar_4_3 } + +enum TransformActivity { none, pan, resize, straighten } + +enum TransformOrientation { normal, rotate90, rotate180, rotate270, transverse, flipVertical, transpose, flipHorizontal } + +extension ExtraTransformOrientation on TransformOrientation { + TransformOrientation flipHorizontally() { + switch (this) { + case TransformOrientation.normal: + return TransformOrientation.flipHorizontal; + case TransformOrientation.rotate90: + return TransformOrientation.transverse; + case TransformOrientation.rotate180: + return TransformOrientation.flipVertical; + case TransformOrientation.rotate270: + return TransformOrientation.transpose; + case TransformOrientation.transverse: + return TransformOrientation.rotate90; + case TransformOrientation.flipVertical: + return TransformOrientation.rotate180; + case TransformOrientation.transpose: + return TransformOrientation.rotate270; + case TransformOrientation.flipHorizontal: + return TransformOrientation.normal; + } + } + + bool get isFlipped { + switch (this) { + case TransformOrientation.normal: + case TransformOrientation.rotate90: + case TransformOrientation.rotate180: + case TransformOrientation.rotate270: + return false; + case TransformOrientation.transverse: + case TransformOrientation.flipVertical: + case TransformOrientation.transpose: + case TransformOrientation.flipHorizontal: + return true; + } + } + + TransformOrientation rotateClockwise() { + switch (this) { + case TransformOrientation.normal: + return TransformOrientation.rotate90; + case TransformOrientation.rotate90: + return TransformOrientation.rotate180; + case TransformOrientation.rotate180: + return TransformOrientation.rotate270; + case TransformOrientation.rotate270: + return TransformOrientation.normal; + case TransformOrientation.transverse: + return TransformOrientation.flipHorizontal; + case TransformOrientation.flipVertical: + return TransformOrientation.transverse; + case TransformOrientation.transpose: + return TransformOrientation.flipVertical; + case TransformOrientation.flipHorizontal: + return TransformOrientation.transpose; + } + } +} diff --git a/plugins/aves_model/lib/src/entry/base.dart b/plugins/aves_model/lib/src/entry/base.dart new file mode 100644 index 0000000..6d97bcf --- /dev/null +++ b/plugins/aves_model/lib/src/entry/base.dart @@ -0,0 +1,31 @@ +import 'dart:ui'; + +import 'package:flutter/foundation.dart'; + +mixin AvesEntryBase { + int get id; + + String get uri; + + int? get pageId; + + String get mimeType; + + String? get path; + + String? get bestTitle; + + int? get sizeBytes; + + int? get durationMillis; + + bool get isAnimated; + + int get rotationDegrees; + + Size get displaySize; + + double get displayAspectRatio; + + Listenable get visualChangeNotifier; +} diff --git a/plugins/aves_model/lib/src/events/actions.dart b/plugins/aves_model/lib/src/events/actions.dart new file mode 100644 index 0000000..8a82b1e --- /dev/null +++ b/plugins/aves_model/lib/src/events/actions.dart @@ -0,0 +1,22 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class ActionEvent<T> extends Equatable { + final T action; + + @override + List<Object?> get props => [action]; + + const ActionEvent(this.action); +} + +@immutable +class ActionStartedEvent<T> extends ActionEvent<T> { + const ActionStartedEvent(super.action); +} + +@immutable +class ActionEndedEvent<T> extends ActionEvent<T> { + const ActionEndedEvent(super.action); +} diff --git a/plugins/aves_model/lib/src/metadata/enums.dart b/plugins/aves_model/lib/src/metadata/enums.dart new file mode 100644 index 0000000..5a28d4c --- /dev/null +++ b/plugins/aves_model/lib/src/metadata/enums.dart @@ -0,0 +1,90 @@ +enum DateEditAction { + setCustom, + copyField, + copyItem, + extractFromTitle, + shift, + remove, +} + +enum DateFieldSource { + fileModifiedDate, + exifDate, + exifDateOriginal, + exifDateDigitized, + exifGpsDate, +} + +enum EntryConvertAction { convert, convertMotionPhotoToStillImage } + +enum LengthUnit { px, percent } + +enum LocationEditAction { + chooseOnMap, + copyItem, + setCustom, + importGpx, + remove, +} + +enum MetadataType { + // JPEG COM marker or GIF comment + comment, + // Exif: https://en.wikipedia.org/wiki/Exif + exif, + // ICC profile: https://en.wikipedia.org/wiki/ICC_profile + iccProfile, + // IPTC: https://en.wikipedia.org/wiki/IPTC_Information_Interchange_Model + iptc, + // JPEG APP0 / JFIF: https://en.wikipedia.org/wiki/JPEG_File_Interchange_Format + jfif, + // JPEG APP14 / Adobe: https://www.exiftool.org/TagNames/JPEG.html#Adobe + jpegAdobe, + // JPEG APP12 / Ducky: https://www.exiftool.org/TagNames/APP12.html#Ducky + jpegDucky, + // ISO User Data box content, etc. + mp4, + // Photoshop IRB: https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ + photoshopIrb, + // XMP: https://en.wikipedia.org/wiki/Extensible_Metadata_Platform + xmp, + // others (hash, etc.) + file, +} + +class MetadataTypes { + static const main = { + MetadataType.exif, + MetadataType.xmp, + }; + + static const common = { + MetadataType.exif, + MetadataType.xmp, + MetadataType.comment, + MetadataType.iccProfile, + MetadataType.iptc, + MetadataType.photoshopIrb, + }; + + static const jpeg = { + MetadataType.jfif, + MetadataType.jpegAdobe, + MetadataType.jpegDucky, + }; +} + +enum ExportableEntryField { + uri, + path, + title, + date, + size, + resolution, + width, + height, + duration, + coordinates, + address, + tags, +} diff --git a/plugins/aves_model/lib/src/metadata/fields.dart b/plugins/aves_model/lib/src/metadata/fields.dart new file mode 100644 index 0000000..0f5c0f5 --- /dev/null +++ b/plugins/aves_model/lib/src/metadata/fields.dart @@ -0,0 +1,97 @@ +enum MetadataSyntheticField { + aperture, + description, + exposureTime, + focalLength, + iso, +} + +enum MetadataField { + // exif + exifDate, + exifDateOriginal, + exifDateDigitized, + exifGpsAltitude, + exifGpsAltitudeRef, + exifGpsAreaInformation, + exifGpsDatestamp, + exifGpsDestBearing, + exifGpsDestBearingRef, + exifGpsDestDistance, + exifGpsDestDistanceRef, + exifGpsDestLatitude, + exifGpsDestLatitudeRef, + exifGpsDestLongitude, + exifGpsDestLongitudeRef, + exifGpsDifferential, + exifGpsDOP, + exifGpsHPositioningError, + exifGpsImgDirection, + exifGpsImgDirectionRef, + exifGpsLatitude, + exifGpsLatitudeRef, + exifGpsLongitude, + exifGpsLongitudeRef, + exifGpsMapDatum, + exifGpsMeasureMode, + exifGpsProcessingMethod, + exifGpsSatellites, + exifGpsSpeed, + exifGpsSpeedRef, + exifGpsStatus, + exifGpsTimestamp, + exifGpsTrack, + exifGpsTrackRef, + exifGpsVersionId, + exifImageDescription, + exifMake, + exifModel, + exifUserComment, + // mp4 + mp4GpsCoordinates, + mp4RotationDegrees, + mp4Xmp, + // xmp + xmpXmpCreateDate, + // file + hashMd5, + hashSha1, + hashSha256, +} + +class MetadataFields { + static const Set<MetadataField> exifGpsFields = { + MetadataField.exifGpsAltitude, + MetadataField.exifGpsAltitudeRef, + MetadataField.exifGpsAreaInformation, + MetadataField.exifGpsDatestamp, + MetadataField.exifGpsDestBearing, + MetadataField.exifGpsDestBearingRef, + MetadataField.exifGpsDestDistance, + MetadataField.exifGpsDestDistanceRef, + MetadataField.exifGpsDestLatitude, + MetadataField.exifGpsDestLatitudeRef, + MetadataField.exifGpsDestLongitude, + MetadataField.exifGpsDestLongitudeRef, + MetadataField.exifGpsDifferential, + MetadataField.exifGpsDOP, + MetadataField.exifGpsHPositioningError, + MetadataField.exifGpsImgDirection, + MetadataField.exifGpsImgDirectionRef, + MetadataField.exifGpsLatitude, + MetadataField.exifGpsLatitudeRef, + MetadataField.exifGpsLongitude, + MetadataField.exifGpsLongitudeRef, + MetadataField.exifGpsMapDatum, + MetadataField.exifGpsMeasureMode, + MetadataField.exifGpsProcessingMethod, + MetadataField.exifGpsSatellites, + MetadataField.exifGpsSpeed, + MetadataField.exifGpsSpeedRef, + MetadataField.exifGpsStatus, + MetadataField.exifGpsTimestamp, + MetadataField.exifGpsTrack, + MetadataField.exifGpsTrackRef, + MetadataField.exifGpsVersionId, + }; +} diff --git a/plugins/aves_model/lib/src/settings/access.dart b/plugins/aves_model/lib/src/settings/access.dart new file mode 100644 index 0000000..9d06c95 --- /dev/null +++ b/plugins/aves_model/lib/src/settings/access.dart @@ -0,0 +1,105 @@ +import 'package:aves_model/aves_model.dart'; +import 'package:collection/collection.dart'; + +mixin SettingsAccess { + bool get initialized; + + SettingsStore get store; + + Stream<SettingsChangedEvent> get updateStream; + + void notifyKeyChange(String key, Object? oldValue, Object? newValue); + + void notifyListeners(); + + void set(String key, Object? newValue) { + var oldValue = store.get(key); + if (newValue == null) { + store.remove(key); + } else if (newValue is String) { + oldValue = getString(key); + store.setString(key, newValue); + } else if (newValue is List<String>) { + oldValue = getStringList(key); + store.setStringList(key, newValue); + } else if (newValue is int) { + oldValue = getInt(key); + store.setInt(key, newValue); + } else if (newValue is double) { + oldValue = getDouble(key); + store.setDouble(key, newValue); + } else if (newValue is bool) { + oldValue = getBool(key); + store.setBool(key, newValue); + } + if (oldValue != newValue) { + notifyKeyChange(key, oldValue, newValue); + notifyListeners(); + } + } + + // getters + + bool? getBool(String key) { + try { + return store.getBool(key); + } catch (error) { + // ignore, could be obsolete value of different type + return null; + } + } + + int? getInt(String key) { + try { + return store.getInt(key); + } catch (error) { + // ignore, could be obsolete value of different type + return null; + } + } + + double? getDouble(String key) { + try { + return store.getDouble(key); + } catch (error) { + // ignore, could be obsolete value of different type + return null; + } + } + + String? getString(String key) { + try { + return store.getString(key); + } catch (error) { + // ignore, could be obsolete value of different type + return null; + } + } + + List<String>? getStringList(String key) { + try { + return store.getStringList(key); + } catch (error) { + // ignore, could be obsolete value of different type + return null; + } + } + + T getEnumOrDefault<T>(String key, T defaultValue, Iterable<T> values) { + try { + final valueString = store.getString(key); + for (final v in values) { + if (v.toString() == valueString) { + return v; + } + } + } catch (error) { + // ignore, could be obsolete value of different type + } + return defaultValue; + } + + List<T> getEnumListOrDefault<T extends Object>(String key, List<T> defaultValue, Iterable<T> values) { + return store.getStringList(key)?.map((s) => values.firstWhereOrNull((v) => v.toString() == s)).nonNulls.toList() ?? defaultValue; + } +} diff --git a/plugins/aves_model/lib/src/settings/enums.dart b/plugins/aves_model/lib/src/settings/enums.dart new file mode 100644 index 0000000..f18ea2d --- /dev/null +++ b/plugins/aves_model/lib/src/settings/enums.dart @@ -0,0 +1,73 @@ +enum AccessibilityAnimations { system, disabled, enabled } + +enum AccessibilityTimeout { system, s1, s3, s5, s10, s30 } + +enum AvesThemeBrightness { system, light, dark, black } + +enum AvesThemeColorMode { monochrome, polychrome } + +enum ConfirmationDialog { createVault, deleteForever, moveToBin, moveUndatedItems } + +enum CoordinateFormat { dms, ddm, decimal } + +enum DisplayRefreshRateMode { auto, highest, lowest } + +enum EntryBackground { black, white, checkered } + +enum HomePageSetting { collection, albums, tags, explorer } + +enum KeepScreenOn { never, videoPlayback, viewerOnly, always } + +enum MaxBrightness { never, viewerOnly, always } + +enum OverlayHistogramStyle { none, rgb, luminance } + +enum SlideshowVideoPlayback { skip, playMuted, playWithSound } + +enum SubtitlePosition { top, bottom } + +enum ThumbnailOverlayLocationIcon { located, unlocated, none } + +enum ThumbnailOverlayTagIcon { tagged, untagged, none } + +enum UnitSystem { metric, imperial } + +enum VideoAutoPlayMode { disabled, playMuted, playWithSound } + +enum VideoBackgroundMode { disabled, pip } + +enum VideoHardwareAcceleration { disabled, enabled, forced } + +enum VideoLoopMode { never, shortOnly, always } + +enum VideoResumptionMode { never, ask, always } + +enum ViewerTransition { slide, parallax, fade, zoomIn, none, random } + +enum WidgetDisplayedItem { random, mostRecent } + +enum WidgetOpenPage { home, collection, viewer, updateWidget } + +enum WidgetOutline { + none, + black, + white, + // system brightness dependent (low contrast): + // - white on light theme + // - black on dark theme + systemBlackAndWhite, + // system brightness dependent (high contrast): + // - black on light theme + // - white on dark theme + systemBlackAndWhiteHighContrast, + // system brightness dependent (low contrast): + // light dynamic colour on light theme + // dark dynamic colour on dark theme. + systemDynamicLowContrast, + // system brightness dependent (high contrast): + // dark dynamic colour on light theme + // light dynamic colour on dark theme. + systemDynamic, +} + +enum WidgetShape { rrect, circle, heart, concaveSquare, wavyCircle16, tearRectLeft, tearRectRight, bumpyRows, bumpyColumns } diff --git a/plugins/aves_model/lib/src/settings/event.dart b/plugins/aves_model/lib/src/settings/event.dart new file mode 100644 index 0000000..1f17387 --- /dev/null +++ b/plugins/aves_model/lib/src/settings/event.dart @@ -0,0 +1,11 @@ +import 'package:meta/meta.dart'; + +@immutable +class SettingsChangedEvent { + final String key; + final Object? oldValue; + final Object? newValue; + + // old and new values as stored, e.g. `List<String>` for collections + const SettingsChangedEvent(this.key, this.oldValue, this.newValue); +} diff --git a/plugins/aves_model/lib/src/settings/keys.dart b/plugins/aves_model/lib/src/settings/keys.dart new file mode 100644 index 0000000..8025a0f --- /dev/null +++ b/plugins/aves_model/lib/src/settings/keys.dart @@ -0,0 +1,203 @@ +class SettingKeys { + static bool isInternalKey(String key) => _internalKeys.contains(key) || key.startsWith(_widgetKeyPrefix); + + static const Set<String> _internalKeys = { + hasAcceptedTermsKey, + catalogTimeZoneOffsetMillisKey, + searchHistoryKey, + platformAccelerometerRotationKey, + platformTransitionAnimationScaleKey, + topEntryIdsKey, + recentDestinationAlbumsKey, + recentTagsKey, + debugShowViewerTilesKey, + }; + + static const _widgetKeyPrefix = 'widget_'; + + // app + static const hasAcceptedTermsKey = 'has_accepted_terms'; + static const canUseAnalysisServiceKey = 'can_use_analysis_service'; + static const isInstalledAppAccessAllowedKey = 'is_installed_app_access_allowed'; + static const isErrorReportingAllowedKey = 'is_crashlytics_enabled'; + static const localeKey = 'locale'; + static const forceWesternArabicNumeralsKey = 'force_western_arabic_numerals'; + static const catalogTimeZoneOffsetMillisKey = 'catalog_time_zone_raw_offset_millis'; + static const tileExtentPrefixKey = 'tile_extent_'; + static const tileLayoutPrefixKey = 'tile_layout_'; + static const entryRenamingPatternKey = 'entry_renaming_pattern'; + static const topEntryIdsKey = 'top_entry_ids'; + static const recentDestinationAlbumsKey = 'recent_destination_albums'; + static const recentTagsKey = 'recent_tags'; + + // debug + static const debugShowViewerTilesKey = 'debug_show_viewer_tiles'; + + // display + static const displayRefreshRateModeKey = 'display_refresh_rate_mode'; + static const themeBrightnessKey = 'theme_brightness'; + static const themeColorModeKey = 'theme_color_mode'; + static const enableDynamicColorKey = 'dynamic_color'; + static const enableBlurEffectKey = 'enable_overlay_blur_effect'; + static const maxBrightnessKey = 'max_brightness'; + static const forceTvLayoutKey = 'force_tv_layout'; + + // navigation + static const mustBackTwiceToExitKey = 'must_back_twice_to_exit'; + static const keepScreenOnKey = 'keep_screen_on'; + static const homePageKey = 'home_page'; + static const homeCustomCollectionKey = 'home_custom_collection'; + static const homeCustomExplorerPathKey = 'home_custom_explorer_path'; + static const confirmCreateVaultKey = 'confirm_create_vault'; + static const confirmDeleteForeverKey = 'confirm_delete_forever'; + static const confirmMoveToBinKey = 'confirm_move_to_bin'; + static const confirmMoveUndatedItemsKey = 'confirm_move_undated_items'; + static const confirmAfterMoveToBinKey = 'confirm_after_move_to_bin'; + static const setMetadataDateBeforeFileOpKey = 'set_metadata_date_before_file_op'; + static const drawerTypeBookmarksKey = 'drawer_type_bookmarks'; + static const drawerAlbumBookmarksKey = 'drawer_album_bookmarks'; + static const drawerPageBookmarksKey = 'drawer_page_bookmarks'; + static const bottomNavigationActionsKey = 'bottom_navigation_actions'; + + // collection + static const collectionBurstPatternsKey = 'collection_burst_patterns'; + static const collectionGroupFactorKey = 'collection_group_factor'; + static const collectionSortFactorKey = 'collection_sort_factor'; + static const collectionSortReverseKey = 'collection_sort_reverse'; + static const collectionBrowsingQuickActionsKey = 'collection_browsing_quick_actions'; + static const collectionSelectionQuickActionsKey = 'collection_selection_quick_actions'; + static const showThumbnailFavouriteKey = 'show_thumbnail_favourite'; + static const showThumbnailHdrKey = 'show_thumbnail_hdr'; + static const thumbnailLocationIconKey = 'thumbnail_location_icon'; + static const thumbnailTagIconKey = 'thumbnail_tag_icon'; + static const showThumbnailMotionPhotoKey = 'show_thumbnail_motion_photo'; + static const showThumbnailRatingKey = 'show_thumbnail_rating'; + static const showThumbnailRawKey = 'show_thumbnail_raw'; + static const showThumbnailVideoDurationKey = 'show_thumbnail_video_duration'; + + // filter grids + static const albumSectionFactorKey = 'album_section_factor'; + static const albumSortFactorKey = 'album_sort_factor'; + static const countrySortFactorKey = 'country_sort_factor'; + static const stateSortFactorKey = 'state_sort_factor'; + static const placeSortFactorKey = 'place_sort_factor'; + static const tagSortFactorKey = 'tag_sort_factor'; + static const albumSortReverseKey = 'album_sort_reverse'; + static const countrySortReverseKey = 'country_sort_reverse'; + static const stateSortReverseKey = 'state_sort_reverse'; + static const placeSortReverseKey = 'place_sort_reverse'; + static const tagSortReverseKey = 'tag_sort_reverse'; + static const albumGroupsKey = 'album_groups'; + static const tagGroupsKey = 'tag_groups'; + static const pinnedFiltersKey = 'pinned_filters'; + static const hiddenFiltersKey = 'hidden_filters'; + static const deactivatedHiddenFiltersKey = 'deactivated_hidden_filters'; + static const showTitleQueryPrefixKey = 'show_title_query_'; + + // viewer + static const viewerQuickActionsKey = 'viewer_quick_actions'; + + // ✅ NEW: casting (solo per contenuti locali) + // Values are stored as enum strings (e.g. LocalCastSourceMode.automatic) + static const localCastSourceModeKey = 'local_cast_source_mode'; + + static const showOverlayOnOpeningKey = 'show_overlay_on_opening'; + static const showOverlayMinimapKey = 'show_overlay_minimap'; + static const showOverlayZoomLevelKey = 'show_overlay_zoom_level'; + static const overlayHistogramStyleKey = 'show_overlay_histogram'; + static const showOverlayInfoKey = 'show_overlay_info'; + static const showOverlayDescriptionKey = 'show_overlay_description'; + static const showOverlayRatingTagsKey = 'show_overlay_rating_tags'; + static const showOverlayShootingDetailsKey = 'show_overlay_shooting_details'; + static const showOverlayThumbnailPreviewKey = 'show_overlay_thumbnail_preview'; + static const viewerGestureSideTapNextKey = 'viewer_gesture_side_tap_next'; + static const viewerUseCutoutKey = 'viewer_use_cutout'; + static const enableMotionPhotoAutoPlayKey = 'motion_photo_auto_play'; + static const imageBackgroundKey = 'image_background'; + + // video + static const videoAutoPlayModeKey = 'video_auto_play_mode'; + static const videoBackgroundModeKey = 'video_background_mode'; + static const videoHardwareAccelerationKey = 'video_hardware_acceleration'; + static const videoLoopModeKey = 'video_loop'; + static const videoResumptionModeKey = 'video_resumption_mode'; + static const videoControlActionsKey = 'video_control_actions'; + static const videoGestureDoubleTapTogglePlayKey = 'video_gesture_double_tap_toggle_play'; + static const videoGestureSideDoubleTapSeekKey = 'video_gesture_side_double_tap_skip'; + static const videoGestureVerticalDragBrightnessVolumeKey = 'video_gesture_vertical_drag_brightness_volume'; + + // subtitles + static const subtitleFontSizeKey = 'subtitle_font_size'; + static const subtitleTextAlignmentKey = 'subtitle_text_alignment'; + static const subtitleTextPositionKey = 'subtitle_text_position'; + static const subtitleShowOutlineKey = 'subtitle_show_outline'; + static const subtitleTextColorKey = 'subtitle_text_color_string'; + static const subtitleBackgroundColorKey = 'subtitle_background_color_string'; + + // info + static const infoMapZoomKey = 'info_map_zoom'; + static const coordinateFormatKey = 'coordinates_format'; + static const unitSystemKey = 'unit_system'; + + // tag editor + static const tagEditorCurrentFilterSectionExpandedKey = 'tag_editor_current_filter_section_expanded'; + static const tagEditorExpandedSectionKey = 'tag_editor_expanded_section'; + + // converter + static const convertMimeTypeKey = 'convert_mime_type'; + static const convertQualityKey = 'convert_quality'; + static const convertWriteMetadataKey = 'convert_write_metadata'; + + // map + static const mapStyleKey = 'info_map_style'; + static const mapDefaultCenterKey = 'map_default_center'; + static const customMapStylesKey = 'custom_map_styles'; + + // search + static const saveSearchHistoryKey = 'save_search_history'; + static const searchHistoryKey = 'search_history'; + + // bin + static const enableBinKey = 'enable_bin'; + + // accessibility + static const showPinchGestureAlternativesKey = 'show_pinch_gesture_alternatives'; + static const accessibilityAnimationsKey = 'accessibility_animations'; + static const timeToTakeActionKey = 'time_to_take_action'; + + // screen saver + static const screenSaverFillScreenKey = 'screen_saver_fill_screen'; + static const screenSaverAnimatedZoomEffectKey = 'screen_saver_animated_zoom_effect'; + static const screenSaverTransitionKey = 'screen_saver_transition'; + static const screenSaverVideoPlaybackKey = 'screen_saver_video_playback'; + static const screenSaverIntervalKey = 'screen_saver_interval'; + static const screenSaverCollectionFiltersKey = 'screen_saver_collection_filters'; + + // slideshow + static const slideshowRepeatKey = 'slideshow_loop'; + static const slideshowShuffleKey = 'slideshow_shuffle'; + static const slideshowFillScreenKey = 'slideshow_fill_screen'; + static const slideshowAnimatedZoomEffectKey = 'slideshow_animated_zoom_effect'; + static const slideshowTransitionKey = 'slideshow_transition'; + static const slideshowVideoPlaybackKey = 'slideshow_video_playback'; + static const slideshowIntervalKey = 'slideshow_interval'; + + // widget + static const widgetOutlinePrefixKey = '${_widgetKeyPrefix}outline_'; + static const widgetShapePrefixKey = '${_widgetKeyPrefix}shape_'; + static const widgetCollectionFiltersPrefixKey = '${_widgetKeyPrefix}collection_filters_'; + static const widgetOpenPagePrefixKey = '${_widgetKeyPrefix}open_page_'; + static const widgetDisplayedItemPrefixKey = '${_widgetKeyPrefix}displayed_item_'; + static const widgetUriPrefixKey = '${_widgetKeyPrefix}uri_'; + + // platform settings + // cf Android `Settings.System.ACCELEROMETER_ROTATION` + static const platformAccelerometerRotationKey = 'accelerometer_rotation'; + + // cf Android `Settings.Global.TRANSITION_ANIMATION_SCALE` + static const platformTransitionAnimationScaleKey = 'transition_animation_scale'; + + // cf Android `Settings.Secure.LONG_PRESS_TIMEOUT` + static const platformLongPressTimeoutMillisKey = 'long_press_timeout'; +} + diff --git a/plugins/aves_model/lib/src/settings/keys.dart.ok b/plugins/aves_model/lib/src/settings/keys.dart.ok new file mode 100644 index 0000000..0a90791 --- /dev/null +++ b/plugins/aves_model/lib/src/settings/keys.dart.ok @@ -0,0 +1,199 @@ +class SettingKeys { + static bool isInternalKey(String key) => _internalKeys.contains(key) || key.startsWith(_widgetKeyPrefix); + + static const Set<String> _internalKeys = { + hasAcceptedTermsKey, + catalogTimeZoneOffsetMillisKey, + searchHistoryKey, + platformAccelerometerRotationKey, + platformTransitionAnimationScaleKey, + topEntryIdsKey, + recentDestinationAlbumsKey, + recentTagsKey, + debugShowViewerTilesKey, + }; + + static const _widgetKeyPrefix = 'widget_'; + + // app + static const hasAcceptedTermsKey = 'has_accepted_terms'; + static const canUseAnalysisServiceKey = 'can_use_analysis_service'; + static const isInstalledAppAccessAllowedKey = 'is_installed_app_access_allowed'; + static const isErrorReportingAllowedKey = 'is_crashlytics_enabled'; + static const localeKey = 'locale'; + static const forceWesternArabicNumeralsKey = 'force_western_arabic_numerals'; + static const catalogTimeZoneOffsetMillisKey = 'catalog_time_zone_raw_offset_millis'; + static const tileExtentPrefixKey = 'tile_extent_'; + static const tileLayoutPrefixKey = 'tile_layout_'; + static const entryRenamingPatternKey = 'entry_renaming_pattern'; + static const topEntryIdsKey = 'top_entry_ids'; + static const recentDestinationAlbumsKey = 'recent_destination_albums'; + static const recentTagsKey = 'recent_tags'; + + // debug + static const debugShowViewerTilesKey = 'debug_show_viewer_tiles'; + + // display + static const displayRefreshRateModeKey = 'display_refresh_rate_mode'; + static const themeBrightnessKey = 'theme_brightness'; + static const themeColorModeKey = 'theme_color_mode'; + static const enableDynamicColorKey = 'dynamic_color'; + static const enableBlurEffectKey = 'enable_overlay_blur_effect'; + static const maxBrightnessKey = 'max_brightness'; + static const forceTvLayoutKey = 'force_tv_layout'; + + // navigation + static const mustBackTwiceToExitKey = 'must_back_twice_to_exit'; + static const keepScreenOnKey = 'keep_screen_on'; + static const homePageKey = 'home_page'; + static const homeCustomCollectionKey = 'home_custom_collection'; + static const homeCustomExplorerPathKey = 'home_custom_explorer_path'; + static const confirmCreateVaultKey = 'confirm_create_vault'; + static const confirmDeleteForeverKey = 'confirm_delete_forever'; + static const confirmMoveToBinKey = 'confirm_move_to_bin'; + static const confirmMoveUndatedItemsKey = 'confirm_move_undated_items'; + static const confirmAfterMoveToBinKey = 'confirm_after_move_to_bin'; + static const setMetadataDateBeforeFileOpKey = 'set_metadata_date_before_file_op'; + static const drawerTypeBookmarksKey = 'drawer_type_bookmarks'; + static const drawerAlbumBookmarksKey = 'drawer_album_bookmarks'; + static const drawerPageBookmarksKey = 'drawer_page_bookmarks'; + static const bottomNavigationActionsKey = 'bottom_navigation_actions'; + + // collection + static const collectionBurstPatternsKey = 'collection_burst_patterns'; + static const collectionGroupFactorKey = 'collection_group_factor'; + static const collectionSortFactorKey = 'collection_sort_factor'; + static const collectionSortReverseKey = 'collection_sort_reverse'; + static const collectionBrowsingQuickActionsKey = 'collection_browsing_quick_actions'; + static const collectionSelectionQuickActionsKey = 'collection_selection_quick_actions'; + static const showThumbnailFavouriteKey = 'show_thumbnail_favourite'; + static const showThumbnailHdrKey = 'show_thumbnail_hdr'; + static const thumbnailLocationIconKey = 'thumbnail_location_icon'; + static const thumbnailTagIconKey = 'thumbnail_tag_icon'; + static const showThumbnailMotionPhotoKey = 'show_thumbnail_motion_photo'; + static const showThumbnailRatingKey = 'show_thumbnail_rating'; + static const showThumbnailRawKey = 'show_thumbnail_raw'; + static const showThumbnailVideoDurationKey = 'show_thumbnail_video_duration'; + + // filter grids + static const albumSectionFactorKey = 'album_section_factor'; + static const albumSortFactorKey = 'album_sort_factor'; + static const countrySortFactorKey = 'country_sort_factor'; + static const stateSortFactorKey = 'state_sort_factor'; + static const placeSortFactorKey = 'place_sort_factor'; + static const tagSortFactorKey = 'tag_sort_factor'; + static const albumSortReverseKey = 'album_sort_reverse'; + static const countrySortReverseKey = 'country_sort_reverse'; + static const stateSortReverseKey = 'state_sort_reverse'; + static const placeSortReverseKey = 'place_sort_reverse'; + static const tagSortReverseKey = 'tag_sort_reverse'; + static const albumGroupsKey = 'album_groups'; + static const tagGroupsKey = 'tag_groups'; + static const pinnedFiltersKey = 'pinned_filters'; + static const hiddenFiltersKey = 'hidden_filters'; + static const deactivatedHiddenFiltersKey = 'deactivated_hidden_filters'; + static const showTitleQueryPrefixKey = 'show_title_query_'; + + // viewer + static const viewerQuickActionsKey = 'viewer_quick_actions'; + static const showOverlayOnOpeningKey = 'show_overlay_on_opening'; + static const showOverlayMinimapKey = 'show_overlay_minimap'; + static const showOverlayZoomLevelKey = 'show_overlay_zoom_level'; + static const overlayHistogramStyleKey = 'show_overlay_histogram'; + static const showOverlayInfoKey = 'show_overlay_info'; + static const showOverlayDescriptionKey = 'show_overlay_description'; + static const showOverlayRatingTagsKey = 'show_overlay_rating_tags'; + static const showOverlayShootingDetailsKey = 'show_overlay_shooting_details'; + static const showOverlayThumbnailPreviewKey = 'show_overlay_thumbnail_preview'; + static const viewerGestureSideTapNextKey = 'viewer_gesture_side_tap_next'; + static const viewerUseCutoutKey = 'viewer_use_cutout'; + static const enableMotionPhotoAutoPlayKey = 'motion_photo_auto_play'; + static const imageBackgroundKey = 'image_background'; + + // video + static const videoAutoPlayModeKey = 'video_auto_play_mode'; + static const videoBackgroundModeKey = 'video_background_mode'; + static const videoHardwareAccelerationKey = 'video_hardware_acceleration'; + static const videoLoopModeKey = 'video_loop'; + static const videoResumptionModeKey = 'video_resumption_mode'; + static const videoControlActionsKey = 'video_control_actions'; + static const videoGestureDoubleTapTogglePlayKey = 'video_gesture_double_tap_toggle_play'; + static const videoGestureSideDoubleTapSeekKey = 'video_gesture_side_double_tap_skip'; + static const videoGestureVerticalDragBrightnessVolumeKey = 'video_gesture_vertical_drag_brightness_volume'; + + // subtitles + static const subtitleFontSizeKey = 'subtitle_font_size'; + static const subtitleTextAlignmentKey = 'subtitle_text_alignment'; + static const subtitleTextPositionKey = 'subtitle_text_position'; + static const subtitleShowOutlineKey = 'subtitle_show_outline'; + static const subtitleTextColorKey = 'subtitle_text_color_string'; + static const subtitleBackgroundColorKey = 'subtitle_background_color_string'; + + // info + static const infoMapZoomKey = 'info_map_zoom'; + static const coordinateFormatKey = 'coordinates_format'; + static const unitSystemKey = 'unit_system'; + + // tag editor + + static const tagEditorCurrentFilterSectionExpandedKey = 'tag_editor_current_filter_section_expanded'; + static const tagEditorExpandedSectionKey = 'tag_editor_expanded_section'; + + // converter + + static const convertMimeTypeKey = 'convert_mime_type'; + static const convertQualityKey = 'convert_quality'; + static const convertWriteMetadataKey = 'convert_write_metadata'; + + // map + static const mapStyleKey = 'info_map_style'; + static const mapDefaultCenterKey = 'map_default_center'; + static const customMapStylesKey = 'custom_map_styles'; + + // search + static const saveSearchHistoryKey = 'save_search_history'; + static const searchHistoryKey = 'search_history'; + + // bin + static const enableBinKey = 'enable_bin'; + + // accessibility + static const showPinchGestureAlternativesKey = 'show_pinch_gesture_alternatives'; + static const accessibilityAnimationsKey = 'accessibility_animations'; + static const timeToTakeActionKey = 'time_to_take_action'; + + // screen saver + static const screenSaverFillScreenKey = 'screen_saver_fill_screen'; + static const screenSaverAnimatedZoomEffectKey = 'screen_saver_animated_zoom_effect'; + static const screenSaverTransitionKey = 'screen_saver_transition'; + static const screenSaverVideoPlaybackKey = 'screen_saver_video_playback'; + static const screenSaverIntervalKey = 'screen_saver_interval'; + static const screenSaverCollectionFiltersKey = 'screen_saver_collection_filters'; + + // slideshow + static const slideshowRepeatKey = 'slideshow_loop'; + static const slideshowShuffleKey = 'slideshow_shuffle'; + static const slideshowFillScreenKey = 'slideshow_fill_screen'; + static const slideshowAnimatedZoomEffectKey = 'slideshow_animated_zoom_effect'; + static const slideshowTransitionKey = 'slideshow_transition'; + static const slideshowVideoPlaybackKey = 'slideshow_video_playback'; + static const slideshowIntervalKey = 'slideshow_interval'; + + // widget + static const widgetOutlinePrefixKey = '${_widgetKeyPrefix}outline_'; + static const widgetShapePrefixKey = '${_widgetKeyPrefix}shape_'; + static const widgetCollectionFiltersPrefixKey = '${_widgetKeyPrefix}collection_filters_'; + static const widgetOpenPagePrefixKey = '${_widgetKeyPrefix}open_page_'; + static const widgetDisplayedItemPrefixKey = '${_widgetKeyPrefix}displayed_item_'; + static const widgetUriPrefixKey = '${_widgetKeyPrefix}uri_'; + + // platform settings + // cf Android `Settings.System.ACCELEROMETER_ROTATION` + static const platformAccelerometerRotationKey = 'accelerometer_rotation'; + + // cf Android `Settings.Global.TRANSITION_ANIMATION_SCALE` + static const platformTransitionAnimationScaleKey = 'transition_animation_scale'; + + // cf Android `Settings.Secure.LONG_PRESS_TIMEOUT` + static const platformLongPressTimeoutMillisKey = 'long_press_timeout'; +} diff --git a/plugins/aves_model/lib/src/settings/store.dart b/plugins/aves_model/lib/src/settings/store.dart new file mode 100644 index 0000000..84a7feb --- /dev/null +++ b/plugins/aves_model/lib/src/settings/store.dart @@ -0,0 +1,39 @@ +abstract class SettingsStore { + bool get initialized; + + Future<void> init(); + + Future<void> reload(); + + Future<bool> clear(); + + Future<bool> remove(String key); + + // get + + Set<String> getKeys(); + + Object? get(String key); + + bool? getBool(String key); + + int? getInt(String key); + + double? getDouble(String key); + + String? getString(String key); + + List<String>? getStringList(String key); + + // set + + Future<bool> setBool(String key, bool value); + + Future<bool> setInt(String key, int value); + + Future<bool> setDouble(String key, double value); + + Future<bool> setString(String key, String value); + + Future<bool> setStringList(String key, List<String> value); +} diff --git a/plugins/aves_model/lib/src/source/album.dart b/plugins/aves_model/lib/src/source/album.dart new file mode 100644 index 0000000..1520e8b --- /dev/null +++ b/plugins/aves_model/lib/src/source/album.dart @@ -0,0 +1,10 @@ +enum AlbumType { + regular, + vault, + app, + camera, + download, + screenRecordings, + screenshots, + videoCaptures, +} diff --git a/plugins/aves_model/lib/src/source/enums.dart b/plugins/aves_model/lib/src/source/enums.dart new file mode 100644 index 0000000..e029534 --- /dev/null +++ b/plugins/aves_model/lib/src/source/enums.dart @@ -0,0 +1,11 @@ +enum SourceState { loading, cataloguing, locatingCountries, locatingPlaces, ready } + +enum ChipSortFactor { date, name, count, size, path } + +enum AlbumChipSectionFactor { none, importance, mimeType, volume } + +enum EntrySortFactor { date, name, rating, size, duration, path } + +enum EntrySectionFactor { none, album, month, day } + +enum TileLayout { mosaic, grid, list } diff --git a/plugins/aves_model/lib/src/source/vault.dart b/plugins/aves_model/lib/src/source/vault.dart new file mode 100644 index 0000000..b560948 --- /dev/null +++ b/plugins/aves_model/lib/src/source/vault.dart @@ -0,0 +1 @@ +enum VaultLockType { system, pattern, pin, password } diff --git a/plugins/aves_model/lib/src/storage/relative_dir.dart b/plugins/aves_model/lib/src/storage/relative_dir.dart new file mode 100644 index 0000000..a91072a --- /dev/null +++ b/plugins/aves_model/lib/src/storage/relative_dir.dart @@ -0,0 +1,44 @@ +import 'package:aves_model/aves_model.dart'; +import 'package:equatable/equatable.dart'; +import 'package:meta/meta.dart'; + +@immutable +class VolumeRelativeDirectory extends Equatable { + final String volumePath, relativeDir; + + @override + List<Object?> get props => [volumePath, relativeDir]; + + String get dirPath => '$volumePath$relativeDir'; + + const VolumeRelativeDirectory({ + required this.volumePath, + required this.relativeDir, + }); + + factory VolumeRelativeDirectory.volume(StorageVolume volume) { + return VolumeRelativeDirectory(volumePath: volume.path, relativeDir: ''); + } + + static VolumeRelativeDirectory fromMap(Map map) { + return VolumeRelativeDirectory( + volumePath: map['volumePath'] ?? '', + relativeDir: map['relativeDir'] ?? '', + ); + } + + Map<String, String> toMap() => { + 'volumePath': volumePath, + 'relativeDir': relativeDir, + }; + + VolumeRelativeDirectory copyWith({ + String? volumePath, + String? relativeDir, + }) { + return VolumeRelativeDirectory( + volumePath: volumePath ?? this.volumePath, + relativeDir: relativeDir ?? this.relativeDir, + ); + } +} diff --git a/plugins/aves_model/lib/src/storage/volume.dart b/plugins/aves_model/lib/src/storage/volume.dart new file mode 100644 index 0000000..ff6df3d --- /dev/null +++ b/plugins/aves_model/lib/src/storage/volume.dart @@ -0,0 +1,31 @@ +import 'package:equatable/equatable.dart'; +import 'package:meta/meta.dart'; + +@immutable +class StorageVolume extends Equatable { + final String? description; + final String path, state; + final bool isPrimary, isRemovable; + + @override + List<Object?> get props => [description, path, state, isPrimary, isRemovable]; + + const StorageVolume({ + required this.description, + required this.isPrimary, + required this.isRemovable, + required this.path, + required this.state, + }); + + factory StorageVolume.fromMap(Map map) { + final isPrimary = map['isPrimary'] ?? false; + return StorageVolume( + description: map['description'], + isPrimary: isPrimary, + isRemovable: map['isRemovable'] ?? false, + path: map['path'] ?? '', + state: map['state'] ?? '', + ); + } +} diff --git a/plugins/aves_model/lib/src/video/keys.dart b/plugins/aves_model/lib/src/video/keys.dart new file mode 100644 index 0000000..c27f9b2 --- /dev/null +++ b/plugins/aves_model/lib/src/video/keys.dart @@ -0,0 +1,109 @@ +// keys returned by fijkplayer when getting media and streams info +// they originate from FFmpeg, fijkplayer, and other software +// that write additional metadata to media files +class Keys { + static const alpha = 'alpha'; + static const androidCaptureFramerate = 'com.android.capture.fps'; + static const androidManufacturer = 'com.android.manufacturer'; + static const androidModel = 'com.android.model'; + static const androidVersion = 'com.android.version'; + static const audioChannels = 'audio-channels'; + static const avgFrameRate = 'avg_frame_rate'; + static const bps = 'bps'; + static const bitrate = 'bitrate'; + static const bitsPerSample = 'bits_per_sample'; + static const byteCount = 'number_of_bytes'; + static const channelLayout = 'channel_layout'; + static const chapters = 'chapters'; + static const chromaLocation = 'chroma_location'; + static const closedCaptions = 'closed_captions'; + static const codecLevel = 'codec_level'; + static const codecLongName = 'codec_long_name'; + static const codecName = 'codec_name'; + static const codecPixelFormat = 'codec_pixel_format'; + static const codecProfileId = 'codec_profile_id'; + static const codecTag = 'codec_tag'; + static const codecTagString = 'codec_tag_string'; + static const codedHeight = 'coded_height'; + static const codedWidth = 'coded_width'; + static const colorLevels = 'color_levels'; + static const colorMatrix = 'color_matrix'; + static const colorPrimaries = 'color_primaries'; + static const colorRange = 'color_range'; + static const colorSpace = 'color_space'; + static const colorTransfer = 'color_transfer'; + static const compatibleBrands = 'compatible_brands'; + static const creationTime = 'creation_time'; + static const dar = 'display_aspect_ratio'; + static const date = 'date'; + static const decoderHeight = 'dh'; + static const decoderWidth = 'dw'; + static const disposition = 'disposition'; + static const duration = 'duration'; + static const durationMicros = 'duration_us'; + static const durationTs = 'duration_ts'; + static const encoder = 'encoder'; + static const extraDataSize = 'extradata_size'; + static const filename = 'filename'; + static const filmGrain = 'film_grain'; + static const fpsDen = 'fps_den'; + static const fpsNum = 'fps_num'; + static const fps = 'fps'; + static const frameCount = 'number_of_frames'; + static const gamma = 'gamma'; + static const hasBFrames = 'has_b_frames'; + static const hearingImpaired = 'hearing_impaired'; + static const hwPixelFormat = 'hw_pixel_format'; + static const index = 'index'; + static const isAvc = 'is_avc'; + static const language = 'language'; + static const light = 'light'; + static const location = 'location'; + static const majorBrand = 'major_brand'; + static const mediaFormat = 'format'; + static const minorVersion = 'minor_version'; + static const nalLengthSize = 'nal_length_size'; + static const par = 'pixel_aspect_ratio'; + static const probeScore = 'probe_score'; + static const programCount = 'nb_programs'; + static const quicktimeCreationDate = 'com.apple.quicktime.creationdate'; + static const quicktimeLocationAccuracyHorizontal = 'com.apple.quicktime.location.accuracy.horizontal'; + static const quicktimeLocationIso6709 = 'com.apple.quicktime.location.iso6709'; + static const quicktimeMake = 'com.apple.quicktime.make'; + static const quicktimeModel = 'com.apple.quicktime.model'; + static const quicktimeSoftware = 'com.apple.quicktime.software'; + static const refs = 'refs'; + static const rFrameRate = 'r_frame_rate'; + static const rotate = 'rotate'; + static const sampleFormat = 'sample_fmt'; + static const sampleRate = 'sample_rate'; + static const sar = 'sample_aspect_ratio'; + static const sarDen = 'sar_den'; + static const sarNum = 'sar_num'; + static const selectedAudioStream = 'audio'; + static const selectedTextStream = 'timedtext'; + static const selectedVideoStream = 'video'; + static const sourceOshash = 'source_oshash'; + static const startMicros = 'start_us'; + static const startPts = 'start_pts'; + static const startTime = 'start_time'; + static const statisticsTags = '_statistics_tags'; + static const statisticsWritingApp = '_statistics_writing_app'; + static const statisticsWritingDateUtc = '_statistics_writing_date_utc'; + static const stereo3dMode = 'stereo_3d_mode'; + static const streamCount = 'nb_streams'; + static const streams = 'streams'; + static const tbrDen = 'tbr_den'; + static const tbrNum = 'tbr_num'; + static const time = 'time'; + static const segmentCount = 'segment_count'; + static const streamType = 'type'; + static const title = 'title'; + static const timeBase = 'time_base'; + static const track = 'track'; + static const vendorId = 'vendor_id'; + static const videoHeight = 'height'; + static const videoWidth = 'width'; + static const visualImpaired = 'visual_impaired'; + static const xiaomiSlowMoment = 'com.xiaomi.slow_moment'; +} diff --git a/plugins/aves_model/lib/src/video/stream_types.dart b/plugins/aves_model/lib/src/video/stream_types.dart new file mode 100644 index 0000000..d2be820 --- /dev/null +++ b/plugins/aves_model/lib/src/video/stream_types.dart @@ -0,0 +1,9 @@ +class MediaStreamTypes { + static const attachment = 'attachment'; + static const audio = 'audio'; + static const metadata = 'metadata'; + static const subtitle = 'subtitle'; + static const timedText = 'timedtext'; + static const unknown = 'unknown'; + static const video = 'video'; +} diff --git a/plugins/aves_model/lib/src/wallpaper_target.dart b/plugins/aves_model/lib/src/wallpaper_target.dart new file mode 100644 index 0000000..210a363 --- /dev/null +++ b/plugins/aves_model/lib/src/wallpaper_target.dart @@ -0,0 +1 @@ +enum WallpaperTarget { home, lock, homeLock } diff --git a/plugins/aves_model/pubspec.yaml b/plugins/aves_model/pubspec.yaml new file mode 100644 index 0000000..56aa575 --- /dev/null +++ b/plugins/aves_model/pubspec.yaml @@ -0,0 +1,19 @@ +name: aves_model +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.9.0 <4.0.0" +resolution: workspace + +dependencies: + flutter: + sdk: flutter + collection: + equatable: + meta: + +dev_dependencies: + flutter_lints: + +flutter: diff --git a/plugins/aves_report/.gitignore b/plugins/aves_report/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/plugins/aves_report/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/plugins/aves_report/.metadata b/plugins/aves_report/.metadata new file mode 100644 index 0000000..5bed526 --- /dev/null +++ b/plugins/aves_report/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 18116933e77adc82f80866c928266a5b4f1ed645 + channel: stable + +project_type: plugin diff --git a/plugins/aves_report/analysis_options.yaml b/plugins/aves_report/analysis_options.yaml new file mode 100644 index 0000000..f04c6cf --- /dev/null +++ b/plugins/aves_report/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/plugins/aves_report/lib/aves_report.dart b/plugins/aves_report/lib/aves_report.dart new file mode 100644 index 0000000..2c07004 --- /dev/null +++ b/plugins/aves_report/lib/aves_report.dart @@ -0,0 +1,40 @@ +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:stack_trace/stack_trace.dart'; + +abstract class ReportService { + Future<void> init(); + + Map<String, String> get state; + + Future<void> setCollectionEnabled(bool enabled); + + Future<void> log(String message); + + Future<void> setCustomKey(String key, Object value); + + Future<void> setCustomKeys(Map<String, Object> map); + + // `exception` may be an instance of `Exception`, `Error` or a string + Future<void> recordError(Object exception, [StackTrace? stack]); + + Future<void> recordFlutterError(FlutterErrorDetails flutterErrorDetails); + + static StackTrace? buildReportStack(StackTrace stack, {int level = 0}) { + // simply creating a trace with `Trace.current(1)` or creating a `Trace` from modified frames + // does not yield a stack trace that Crashlytics can segment, + // so we reconstruct a string stack trace instead + return StackTrace.fromString(Trace.from(stack) + .frames + .skip(level) + .toList() + .mapIndexed( + (i, f) => '#${(i++).toString().padRight(8)}${f.member} (${f.uri}:${f.line}:${f.column})', + ) + .join('\n')); + } +} + +class UnreportedStateError extends StateError { + UnreportedStateError(super.message); +} \ No newline at end of file diff --git a/plugins/aves_report/pubspec.yaml b/plugins/aves_report/pubspec.yaml new file mode 100644 index 0000000..22f0871 --- /dev/null +++ b/plugins/aves_report/pubspec.yaml @@ -0,0 +1,18 @@ +name: aves_report +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.9.0 <4.0.0" +resolution: workspace + +dependencies: + flutter: + sdk: flutter + collection: + stack_trace: + +dev_dependencies: + flutter_lints: + +flutter: diff --git a/plugins/aves_report_console/.gitignore b/plugins/aves_report_console/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/plugins/aves_report_console/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/plugins/aves_report_console/.metadata b/plugins/aves_report_console/.metadata new file mode 100644 index 0000000..db56104 --- /dev/null +++ b/plugins/aves_report_console/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 18116933e77adc82f80866c928266a5b4f1ed645 + channel: stable + +project_type: package diff --git a/plugins/aves_report_console/analysis_options.yaml b/plugins/aves_report_console/analysis_options.yaml new file mode 100644 index 0000000..f04c6cf --- /dev/null +++ b/plugins/aves_report_console/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/plugins/aves_report_console/lib/aves_report_platform.dart b/plugins/aves_report_console/lib/aves_report_platform.dart new file mode 100644 index 0000000..a3162af --- /dev/null +++ b/plugins/aves_report_console/lib/aves_report_platform.dart @@ -0,0 +1,28 @@ +import 'package:aves_report/aves_report.dart'; +import 'package:flutter/foundation.dart'; + +class PlatformReportService extends ReportService { + @override + Future<void> init() => SynchronousFuture(null); + + @override + Future<void> log(String message) async => debugPrint('Report log with message=$message'); + + @override + Future<void> recordError(Object exception, [StackTrace? stack]) async => debugPrint('Report error with exception=$exception, stack=$stack'); + + @override + Future<void> recordFlutterError(FlutterErrorDetails flutterErrorDetails) async => debugPrint('Report Flutter error with details=$flutterErrorDetails'); + + @override + Future<void> setCollectionEnabled(bool enabled) => SynchronousFuture(null); + + @override + Future<void> setCustomKey(String key, Object value) async => debugPrint('Report set key $key=$value'); + + @override + Future<void> setCustomKeys(Map<String, Object> map) async => debugPrint('Report set keys ${map.entries.map((kv) => '${kv.key}=${kv.value}').join(', ')}'); + + @override + Map<String, String> get state => {'Reporter': 'Console'}; +} diff --git a/plugins/aves_report_console/pubspec.yaml b/plugins/aves_report_console/pubspec.yaml new file mode 100644 index 0000000..e203cd5 --- /dev/null +++ b/plugins/aves_report_console/pubspec.yaml @@ -0,0 +1,18 @@ +name: aves_report_platform +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.9.0 <4.0.0" +resolution: workspace + +dependencies: + flutter: + sdk: flutter + aves_report: + path: ../aves_report + +dev_dependencies: + flutter_lints: + +flutter: diff --git a/plugins/aves_report_crashlytics/.gitignore b/plugins/aves_report_crashlytics/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/plugins/aves_report_crashlytics/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/plugins/aves_report_crashlytics/.metadata b/plugins/aves_report_crashlytics/.metadata new file mode 100644 index 0000000..db56104 --- /dev/null +++ b/plugins/aves_report_crashlytics/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 18116933e77adc82f80866c928266a5b4f1ed645 + channel: stable + +project_type: package diff --git a/plugins/aves_report_crashlytics/analysis_options.yaml b/plugins/aves_report_crashlytics/analysis_options.yaml new file mode 100644 index 0000000..f04c6cf --- /dev/null +++ b/plugins/aves_report_crashlytics/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/plugins/aves_report_crashlytics/lib/aves_report_platform.dart b/plugins/aves_report_crashlytics/lib/aves_report_platform.dart new file mode 100644 index 0000000..2bbcfdd --- /dev/null +++ b/plugins/aves_report_crashlytics/lib/aves_report_platform.dart @@ -0,0 +1,85 @@ +import 'dart:async'; + +import 'package:aves_report/aves_report.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:stack_trace/stack_trace.dart'; + +class PlatformReportService extends ReportService { + FirebaseCrashlytics? get _instance { + try { + return FirebaseCrashlytics.instance; + } catch (error, stack) { + // as of firebase_core v1.21.0 / firebase_crashlytics v2.8.8, `Firebase.app` sometimes fail with: + // `No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()` + debugPrint('failed to get Firebase Crashlytics instance with error=$error\n$stack'); + } + return null; + } + + @override + Future<void> init() => Firebase.initializeApp(); + + @override + Map<String, String> get state { + try { + return { + 'Reporter': 'Crashlytics', + 'Firebase data collection enabled': '${Firebase.app().isAutomaticDataCollectionEnabled}', + 'Crashlytics collection enabled': '${_instance?.isCrashlyticsCollectionEnabled}', + }; + } catch (error, stack) { + // as of firebase_core v1.21.0 / firebase_crashlytics v2.8.8, `Firebase.app` sometimes fail with: + // `No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()` + debugPrint('failed to access Firebase properties with error=$error\n$stack'); + } + return {}; + } + + @override + Future<void> setCollectionEnabled(bool enabled) async { + debugPrint('${enabled ? 'enable' : 'disable'} Firebase & Crashlytics collection'); + try { + await Firebase.app().setAutomaticDataCollectionEnabled(enabled); + await _instance?.setCrashlyticsCollectionEnabled(enabled); + } catch (error, stack) { + // as of firebase_core v1.21.0 / firebase_crashlytics v2.8.8, `Firebase.app` sometimes fail with: + // `No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()` + debugPrint('failed to access Firebase properties with error=$error\n$stack'); + } + } + + @override + Future<void> log(String message) async { + debugPrint('Report log=$message'); + await _instance?.log(message); + } + + @override + Future<void> setCustomKey(String key, Object value) async => _instance?.setCustomKey(key, value); + + @override + Future<void> setCustomKeys(Map<String, Object> map) { + return Future.forEach<MapEntry<String, Object>>(map.entries, (kv) => setCustomKey(kv.key, kv.value)); + } + + @override + Future<void> recordError(Object exception, [StackTrace? stack]) async { + if (exception is PlatformException && stack != null) { + stack = ReportService.buildReportStack(stack, level: 2); + } + if (exception is! UnreportedStateError) { + stack ??= ReportService.buildReportStack(Trace.current(), level: 1); + return _instance?.recordError(exception, stack); + } + } + + @override + Future<void> recordFlutterError(FlutterErrorDetails flutterErrorDetails) async { + if (!flutterErrorDetails.silent) { + return _instance?.recordFlutterError(flutterErrorDetails); + } + } +} diff --git a/plugins/aves_report_crashlytics/pubspec.yaml b/plugins/aves_report_crashlytics/pubspec.yaml new file mode 100644 index 0000000..e487166 --- /dev/null +++ b/plugins/aves_report_crashlytics/pubspec.yaml @@ -0,0 +1,21 @@ +name: aves_report_platform +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.9.0 <4.0.0" +resolution: workspace + +dependencies: + flutter: + sdk: flutter + aves_report: + path: ../aves_report + firebase_core: + firebase_crashlytics: + stack_trace: + +dev_dependencies: + flutter_lints: + +flutter: diff --git a/plugins/aves_screen_state/.gitignore b/plugins/aves_screen_state/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/plugins/aves_screen_state/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/plugins/aves_screen_state/.metadata b/plugins/aves_screen_state/.metadata new file mode 100644 index 0000000..20225b1 --- /dev/null +++ b/plugins/aves_screen_state/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled. + +version: + revision: f72efea43c3013323d1b95cff571f3c1caa37583 + channel: stable + +project_type: plugin + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: f72efea43c3013323d1b95cff571f3c1caa37583 + base_revision: f72efea43c3013323d1b95cff571f3c1caa37583 + - platform: android + create_revision: f72efea43c3013323d1b95cff571f3c1caa37583 + base_revision: f72efea43c3013323d1b95cff571f3c1caa37583 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/plugins/aves_screen_state/analysis_options.yaml b/plugins/aves_screen_state/analysis_options.yaml new file mode 100644 index 0000000..f04c6cf --- /dev/null +++ b/plugins/aves_screen_state/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/plugins/aves_screen_state/android/.gitignore b/plugins/aves_screen_state/android/.gitignore new file mode 100644 index 0000000..5343532 --- /dev/null +++ b/plugins/aves_screen_state/android/.gitignore @@ -0,0 +1,16 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +.cxx/ +.kotlin/ +/build/ + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/plugins/aves_screen_state/android/build.gradle.kts b/plugins/aves_screen_state/android/build.gradle.kts new file mode 100644 index 0000000..62106f8 --- /dev/null +++ b/plugins/aves_screen_state/android/build.gradle.kts @@ -0,0 +1,46 @@ +group = "deckers.thibault.aves.aves_screen_state" +version = "1.0-SNAPSHOT" + +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + classpath(libs.gradle) + classpath(libs.kotlin.gradlePlugin) + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +plugins { + // TODO TLAD find how to use `alias(libs.plugins.android.library)` + id("com.android.library") + id("kotlin-android") +} + +android { + namespace = "deckers.thibault.aves.aves_screen_state" + compileSdk = 36 + + kotlin { + jvmToolchain(17) + } + + sourceSets { + getByName("main") { + java.srcDirs("src/main/kotlin") + } + } + + defaultConfig { + minSdk = 24 + } +} diff --git a/plugins/aves_screen_state/android/gradle/wrapper/gradle-wrapper.properties b/plugins/aves_screen_state/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..12a959c --- /dev/null +++ b/plugins/aves_screen_state/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-all.zip \ No newline at end of file diff --git a/plugins/aves_screen_state/android/settings.gradle.kts b/plugins/aves_screen_state/android/settings.gradle.kts new file mode 100644 index 0000000..eb7497b --- /dev/null +++ b/plugins/aves_screen_state/android/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "aves_screen_state" diff --git a/plugins/aves_screen_state/android/src/main/AndroidManifest.xml b/plugins/aves_screen_state/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..cc947c5 --- /dev/null +++ b/plugins/aves_screen_state/android/src/main/AndroidManifest.xml @@ -0,0 +1 @@ +<manifest /> diff --git a/plugins/aves_screen_state/android/src/main/kotlin/deckers/thibault/aves/aves_screen_state/AvesScreenStatePlugin.kt b/plugins/aves_screen_state/android/src/main/kotlin/deckers/thibault/aves/aves_screen_state/AvesScreenStatePlugin.kt new file mode 100644 index 0000000..ec2c201 --- /dev/null +++ b/plugins/aves_screen_state/android/src/main/kotlin/deckers/thibault/aves/aves_screen_state/AvesScreenStatePlugin.kt @@ -0,0 +1,39 @@ +package deckers.thibault.aves.aves_screen_state + +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.plugin.common.EventChannel +import io.flutter.plugin.common.EventChannel.EventSink + +class AvesScreenStatePlugin : FlutterPlugin, EventChannel.StreamHandler { + private lateinit var eventChannel: EventChannel + private var context: Context? = null + private var screenReceiver: ScreenReceiver? = null + + override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { + eventChannel = EventChannel(flutterPluginBinding.binaryMessenger, "deckers.thibault/aves_screen_state/events") + context = flutterPluginBinding.applicationContext + eventChannel.setStreamHandler(this) + } + + override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + eventChannel.setStreamHandler(null) + } + + override fun onListen(arguments: Any?, events: EventSink) { + screenReceiver = ScreenReceiver(events) + + val filter = IntentFilter().apply { + addAction(Intent.ACTION_SCREEN_ON) // Turn on + addAction(Intent.ACTION_SCREEN_OFF) // Turn off + addAction(Intent.ACTION_USER_PRESENT) // Unlock + } + context!!.registerReceiver(screenReceiver, filter) + } + + override fun onCancel(arguments: Any?) { + context!!.unregisterReceiver(screenReceiver) + } +} \ No newline at end of file diff --git a/plugins/aves_screen_state/android/src/main/kotlin/deckers/thibault/aves/aves_screen_state/ScreenReceiver.kt b/plugins/aves_screen_state/android/src/main/kotlin/deckers/thibault/aves/aves_screen_state/ScreenReceiver.kt new file mode 100644 index 0000000..a03fd75 --- /dev/null +++ b/plugins/aves_screen_state/android/src/main/kotlin/deckers/thibault/aves/aves_screen_state/ScreenReceiver.kt @@ -0,0 +1,12 @@ +package deckers.thibault.aves.aves_screen_state + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import io.flutter.plugin.common.EventChannel.EventSink + +class ScreenReceiver(private val eventSink: EventSink) : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + eventSink.success(intent.action) + } +} \ No newline at end of file diff --git a/plugins/aves_screen_state/lib/aves_screen_state.dart b/plugins/aves_screen_state/lib/aves_screen_state.dart new file mode 100644 index 0000000..0e0b608 --- /dev/null +++ b/plugins/aves_screen_state/lib/aves_screen_state.dart @@ -0,0 +1,40 @@ +import 'dart:io'; + +import 'package:flutter/services.dart'; + +class AvesScreenState { + final EventChannel _eventChannel = const EventChannel('deckers.thibault/aves_screen_state/events'); + Stream<ScreenStateEvent>? _screenStateStream; + + Stream<ScreenStateEvent>? get screenStateStream { + if (Platform.isAndroid) { + _screenStateStream ??= _eventChannel.receiveBroadcastStream().map((event) => _parse(event as String)); + return _screenStateStream; + } + throw ScreenStateException('Screen State API is only available on Android.'); + } + + ScreenStateEvent _parse(String event) { + switch (event) { + case 'android.intent.action.SCREEN_OFF': + return ScreenStateEvent.off; + case 'android.intent.action.SCREEN_ON': + return ScreenStateEvent.on; + case 'android.intent.action.USER_PRESENT': + return ScreenStateEvent.unlocked; + default: + throw ArgumentError('$event was not recognized.'); + } + } +} + +enum ScreenStateEvent { unlocked, on, off } + +class ScreenStateException implements Exception { + final String _cause; + + ScreenStateException(this._cause); + + @override + String toString() => _cause; +} diff --git a/plugins/aves_screen_state/pubspec.yaml b/plugins/aves_screen_state/pubspec.yaml new file mode 100644 index 0000000..624c569 --- /dev/null +++ b/plugins/aves_screen_state/pubspec.yaml @@ -0,0 +1,22 @@ +name: aves_screen_state +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.9.0 <4.0.0" +resolution: workspace + +dependencies: + flutter: + sdk: flutter + plugin_platform_interface: + +dev_dependencies: + flutter_lints: + +flutter: + plugin: + platforms: + android: + package: deckers.thibault.aves.aves_screen_state + pluginClass: AvesScreenStatePlugin diff --git a/plugins/aves_services/.gitignore b/plugins/aves_services/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/plugins/aves_services/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/plugins/aves_services/.metadata b/plugins/aves_services/.metadata new file mode 100644 index 0000000..c24d00d --- /dev/null +++ b/plugins/aves_services/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 5464c5bac742001448fe4fc0597be939379f88ea + channel: stable + +project_type: package diff --git a/plugins/aves_services/analysis_options.yaml b/plugins/aves_services/analysis_options.yaml new file mode 100644 index 0000000..f04c6cf --- /dev/null +++ b/plugins/aves_services/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/plugins/aves_services/lib/aves_services.dart b/plugins/aves_services/lib/aves_services.dart new file mode 100644 index 0000000..99240a4 --- /dev/null +++ b/plugins/aves_services/lib/aves_services.dart @@ -0,0 +1,33 @@ +import 'package:aves_map/aves_map.dart'; +import 'package:flutter/widgets.dart'; +import 'package:latlong2/latlong.dart'; + +abstract class MobileServices { + Future<void> init(); + + bool get isServiceAvailable; + + EntryMapStyle? get defaultMapStyle; + + List<EntryMapStyle> get mapStyles; + + Widget buildMap<T>({ + required AvesMapController controller, + required Listenable clusterListenable, + required ValueNotifier<ZoomedBounds> boundsNotifier, + required EntryMapStyle style, + required TransitionBuilder decoratorBuilder, + required WidgetBuilder buttonPanelBuilder, + required MarkerClusterBuilder<T> markerClusterBuilder, + required MarkerWidgetBuilder<T> markerWidgetBuilder, + required MarkerImageReadyChecker<T> markerImageReadyChecker, + required ValueNotifier<LatLng?>? dotLocationNotifier, + required ValueNotifier<double>? overlayOpacityNotifier, + required MapOverlay? overlayEntry, + required Set<List<LatLng>>? tracks, + required UserZoomChangeCallback? onUserZoomChange, + required MapTapCallback? onMapTap, + required MarkerTapCallback<T>? onMarkerTap, + required MarkerLongPressCallback<T>? onMarkerLongPress, + }); +} diff --git a/plugins/aves_services/pubspec.yaml b/plugins/aves_services/pubspec.yaml new file mode 100644 index 0000000..8d0019d --- /dev/null +++ b/plugins/aves_services/pubspec.yaml @@ -0,0 +1,19 @@ +name: aves_services +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.9.0 <4.0.0" +resolution: workspace + +dependencies: + flutter: + sdk: flutter + aves_map: + path: ../aves_map + latlong2: + +dev_dependencies: + flutter_lints: + +flutter: diff --git a/plugins/aves_services_google/.gitignore b/plugins/aves_services_google/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/plugins/aves_services_google/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/plugins/aves_services_google/.metadata b/plugins/aves_services_google/.metadata new file mode 100644 index 0000000..c24d00d --- /dev/null +++ b/plugins/aves_services_google/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 5464c5bac742001448fe4fc0597be939379f88ea + channel: stable + +project_type: package diff --git a/plugins/aves_services_google/analysis_options.yaml b/plugins/aves_services_google/analysis_options.yaml new file mode 100644 index 0000000..f04c6cf --- /dev/null +++ b/plugins/aves_services_google/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/plugins/aves_services_google/lib/aves_services_platform.dart b/plugins/aves_services_google/lib/aves_services_platform.dart new file mode 100644 index 0000000..842f4d1 --- /dev/null +++ b/plugins/aves_services_google/lib/aves_services_platform.dart @@ -0,0 +1,89 @@ +import 'package:aves_map/aves_map.dart'; +import 'package:aves_services/aves_services.dart'; +import 'package:aves_services_platform/src/map.dart'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/widgets.dart'; +import 'package:google_api_availability/google_api_availability.dart'; +import 'package:google_maps_flutter_android/google_maps_flutter_android.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; +import 'package:latlong2/latlong.dart' as ll; + +class PlatformMobileServices extends MobileServices { + bool _isAvailable = false; + + @override + Future<void> init() async { + final result = await GoogleApiAvailability.instance.checkGooglePlayServicesAvailability(); + _isAvailable = result == GooglePlayServicesAvailability.success; + debugPrint('Device has Google Play Services=$_isAvailable'); + + final androidInfo = await DeviceInfoPlugin().androidInfo; + final mapsImplementation = GoogleMapsFlutterPlatform.instance; + if (mapsImplementation is GoogleMapsFlutterAndroid) { + // As of Flutter v3.22.2 / google_maps_flutter_android 2.12.0, + // using Texture Layer Hybrid Composition (`useAndroidViewSurface = false`) + // is the default and the best. But it fails to render on API < 23, yielding: + // "UnsupportedOperationException: Platform views cannot be displayed below API level 23" + // so we fall back to Hybrid Composition (`useAndroidViewSurface = true`) + mapsImplementation.useAndroidViewSurface = androidInfo.version.sdkInt < 23; + } + } + + @override + bool get isServiceAvailable => _isAvailable; + + @override + EntryMapStyle? get defaultMapStyle => EntryMapStyles.googleNormal; + + @override + List<EntryMapStyle> get mapStyles => isServiceAvailable + ? [ + EntryMapStyles.googleNormal, + EntryMapStyles.googleHybrid, + EntryMapStyles.googleTerrain, + ] + : []; + + @override + Widget buildMap<T>({ + required AvesMapController controller, + required Listenable clusterListenable, + required ValueNotifier<ZoomedBounds> boundsNotifier, + required EntryMapStyle style, + required TransitionBuilder decoratorBuilder, + required WidgetBuilder buttonPanelBuilder, + required MarkerClusterBuilder<T> markerClusterBuilder, + required MarkerWidgetBuilder<T> markerWidgetBuilder, + required MarkerImageReadyChecker<T> markerImageReadyChecker, + required ValueNotifier<ll.LatLng?>? dotLocationNotifier, + required ValueNotifier<double>? overlayOpacityNotifier, + required MapOverlay? overlayEntry, + required Set<List<ll.LatLng>>? tracks, + required UserZoomChangeCallback? onUserZoomChange, + required MapTapCallback? onMapTap, + required MarkerTapCallback<T>? onMarkerTap, + required MarkerLongPressCallback<T>? onMarkerLongPress, + }) { + return EntryGoogleMap<T>( + controller: controller, + clusterListenable: clusterListenable, + boundsNotifier: boundsNotifier, + minZoom: 0, + maxZoom: 20, + style: style, + decoratorBuilder: decoratorBuilder, + buttonPanelBuilder: buttonPanelBuilder, + markerClusterBuilder: markerClusterBuilder, + markerWidgetBuilder: markerWidgetBuilder, + markerImageReadyChecker: markerImageReadyChecker, + dotLocationNotifier: dotLocationNotifier, + overlayOpacityNotifier: overlayOpacityNotifier, + overlayEntry: overlayEntry, + tracks: tracks, + onUserZoomChange: onUserZoomChange, + onMapTap: onMapTap, + onMarkerTap: onMarkerTap, + onMarkerLongPress: onMarkerLongPress, + ); + } +} diff --git a/plugins/aves_services_google/lib/src/map.dart b/plugins/aves_services_google/lib/src/map.dart new file mode 100644 index 0000000..bbbbbf4 --- /dev/null +++ b/plugins/aves_services_google/lib/src/map.dart @@ -0,0 +1,434 @@ +import 'dart:async'; +import 'dart:typed_data'; + +import 'package:aves_map/aves_map.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:latlong2/latlong.dart' as ll; +import 'package:provider/provider.dart'; + +class EntryGoogleMap<T> extends StatefulWidget { + final AvesMapController controller; + final Listenable clusterListenable; + final ValueNotifier<ZoomedBounds> boundsNotifier; + final double? minZoom, maxZoom; + final EntryMapStyle style; + final TransitionBuilder decoratorBuilder; + final WidgetBuilder buttonPanelBuilder; + final MarkerClusterBuilder<T> markerClusterBuilder; + final MarkerWidgetBuilder<T> markerWidgetBuilder; + final MarkerImageReadyChecker<T> markerImageReadyChecker; + final ValueNotifier<ll.LatLng?>? dotLocationNotifier; + final ValueNotifier<double>? overlayOpacityNotifier; + final MapOverlay? overlayEntry; + final Set<List<ll.LatLng>>? tracks; + final UserZoomChangeCallback? onUserZoomChange; + final MapTapCallback? onMapTap; + final MarkerTapCallback<T>? onMarkerTap; + final MarkerLongPressCallback<T>? onMarkerLongPress; + + const EntryGoogleMap({ + super.key, + required this.controller, + required this.clusterListenable, + required this.boundsNotifier, + this.minZoom, + this.maxZoom, + required this.style, + required this.decoratorBuilder, + required this.buttonPanelBuilder, + required this.markerClusterBuilder, + required this.markerWidgetBuilder, + required this.markerImageReadyChecker, + required this.dotLocationNotifier, + this.overlayOpacityNotifier, + this.overlayEntry, + this.tracks, + this.onUserZoomChange, + this.onMapTap, + this.onMarkerTap, + this.onMarkerLongPress, + }); + + @override + State<StatefulWidget> createState() => _EntryGoogleMapState<T>(); +} + +class _EntryGoogleMapState<T> extends State<EntryGoogleMap<T>> { + GoogleMapController? _serviceMapController; + final List<StreamSubscription> _subscriptions = []; + Map<MarkerKey<T>, GeoEntry<T>> _geoEntryByMarkerKey = {}; + final Map<MarkerKey<T>, Uint8List> _markerBitmaps = {}; + final StreamController<MarkerKey<T>> _markerBitmapReadyStreamController = StreamController.broadcast(); + Uint8List? _dotMarkerBitmap; + final ValueNotifier<Size> _sizeNotifier = ValueNotifier(Size.zero); + + ValueNotifier<ZoomedBounds> get boundsNotifier => widget.boundsNotifier; + + ZoomedBounds get bounds => boundsNotifier.value; + + static const uninitializedLatLng = LatLng(0, 0); + static const boundInitDelay = Duration(milliseconds: 100); + + @override + void initState() { + super.initState(); + _sizeNotifier.addListener(_onSizeChanged); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant EntryGoogleMap<T> oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + _serviceMapController?.dispose(); + _sizeNotifier.dispose(); + super.dispose(); + } + + void _registerWidget(EntryGoogleMap<T> widget) { + final avesMapController = widget.controller; + _subscriptions.add(avesMapController.moveCommands.listen((event) => _moveTo(_toServiceLatLng(event.latLng)))); + _subscriptions.add(avesMapController.zoomCommands.listen((event) => _zoomBy(event.delta))); + _subscriptions.add(avesMapController.rotationResetCommands.listen((_) => _resetRotation())); + widget.clusterListenable.addListener(_updateMarkers); + } + + void _unregisterWidget(EntryGoogleMap<T> widget) { + widget.clusterListenable.removeListener(_updateMarkers); + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + MarkerGeneratorWidget<Key>( + markers: const [DotMarker(key: Key('dot'))], + isReadyToRender: (key) => true, + onRendered: (key, bitmap) => _dotMarkerBitmap = bitmap, + ), + MarkerGeneratorWidget<MarkerKey<T>>( + markers: _geoEntryByMarkerKey.keys.map(widget.markerWidgetBuilder).toList(), + isReadyToRender: widget.markerImageReadyChecker, + onRendered: (key, bitmap) { + _markerBitmaps[key] = bitmap; + _markerBitmapReadyStreamController.add(key); + }, + ), + widget.decoratorBuilder(context, _buildMap()), + widget.buttonPanelBuilder(context), + ], + ); + } + + Widget _buildMap() { + return StreamBuilder( + stream: _markerBitmapReadyStreamController.stream, + builder: (context, _) { + final mediaMarkers = <Marker>{}; + _geoEntryByMarkerKey.forEach((markerKey, geoEntry) { + final bytes = _markerBitmaps[markerKey]; + if (bytes != null) { + final point = LatLng(geoEntry.latitude!, geoEntry.longitude!); + mediaMarkers.add(Marker( + markerId: MarkerId(geoEntry.markerId!), + consumeTapEvents: true, + icon: BytesMapBitmap( + bytes, + bitmapScaling: MapBitmapScaling.none, + ), + position: point, + onTap: () => widget.onMarkerTap?.call(geoEntry), + // TODO TLAD [map] GoogleMap.onLongPress is not appropriate for mediaMarkers, so the call should be here when this is fixed: https://github.com/flutter/flutter/issues/107148 + // onLongPress: widget.onMarkerLongPress != null + // ? (v) { + // final pressLocation = _fromServiceLatLng(v); + // final mediaMarkers = _geoEntryByMarkerKey.values.toSet(); + // final geoEntry = ImageMarker.markerMatch(pressLocation, bounds.zoom, mediaMarkers); + // if (geoEntry != null) { + // widget.onMarkerLongPress?.call(geoEntry, pressLocation); + // } + // } + // : null, + )); + } + }); + + final interactive = context.select<MapThemeData, bool>((v) => v.interactive); + final overlayEntry = widget.overlayEntry; + final tracks = widget.tracks; + final trackColor = Theme.of(context).colorScheme.primary; + return NullableValueListenableBuilder<ll.LatLng?>( + valueListenable: widget.dotLocationNotifier, + builder: (context, dotLocation, child) { + return NullableValueListenableBuilder<double>( + valueListenable: widget.overlayOpacityNotifier, + builder: (context, value, child) { + final double overlayOpacity = value ?? 1.0; + return LayoutBuilder( + builder: (context, constraints) { + _sizeNotifier.value = constraints.biggest; + return _GoogleMap( + dotLocationNotifier: widget.dotLocationNotifier ?? ValueNotifier(null), + initialCameraPosition: CameraPosition( + bearing: -bounds.rotation, + target: _toServiceLatLng(bounds.projectedCenter), + zoom: bounds.zoom, + ), + onMapCreated: (controller) async { + _serviceMapController = controller; + final zoom = await controller.getZoomLevel(); + // the visible region is sometimes incorrect when queried right after creation, + await Future.delayed(boundInitDelay); + await _updateVisibleRegion(zoom: zoom, rotation: bounds.rotation); + // `onCameraIdle` is not always automatically triggered following map creation + _onIdle(); + }, + mapType: _toMapType(widget.style), + minMaxZoomPreference: MinMaxZoomPreference(widget.minZoom, widget.maxZoom), + interactive: interactive, + markers: { + ...mediaMarkers, + if (dotLocation != null && _dotMarkerBitmap != null) + Marker( + markerId: const MarkerId('dot'), + anchor: const Offset(.5, .5), + consumeTapEvents: true, + icon: BytesMapBitmap( + _dotMarkerBitmap!, + bitmapScaling: MapBitmapScaling.none, + ), + position: _toServiceLatLng(dotLocation), + zIndexInt: 1, + ) + }, + polylines: { + if (tracks != null) + for (final track in tracks) + Polyline( + polylineId: PolylineId(track.hashCode.toString()), + points: track.map(_toServiceLatLng).toList(), + width: MapThemeData.trackWidth, + color: trackColor, + ), + }, + // TODO TLAD [geotiff] may use ground overlay instead when this is fixed: https://github.com/flutter/flutter/issues/26479 + tileOverlays: { + if (overlayEntry != null && overlayEntry.canOverlay) + TileOverlay( + tileOverlayId: TileOverlayId(overlayEntry.id), + tileProvider: GmsGeoTiffTileProvider(overlayEntry), + transparency: 1 - overlayOpacity, + ), + }, + onCameraMove: (position) => _updateVisibleRegion(zoom: position.zoom, rotation: -position.bearing), + onCameraIdle: _onIdle, + onTap: (v) => widget.onMapTap?.call(_fromServiceLatLng(v)), + ); + }, + ); + }, + ); + }, + ); + }, + ); + } + + // sometimes the map does not properly update after changing the widget size, + // so we monitor the size and force refreshing after an arbitrary small delay + Future<void> _onSizeChanged() async { + await Future.delayed(boundInitDelay); + _onIdle(); + } + + void _onIdle() { + if (!mounted) return; + widget.controller.notifyIdle(bounds); + _updateMarkers(); + } + + void _updateMarkers() { + setState(() => _geoEntryByMarkerKey = widget.markerClusterBuilder()); + } + + Future<void> _updateVisibleRegion({required double zoom, required double rotation}) async { + if (!mounted) return; + + final bounds = await _serviceMapController?.getVisibleRegion(); + if (bounds != null && (bounds.northeast != uninitializedLatLng || bounds.southwest != uninitializedLatLng)) { + final sw = bounds.southwest; + final ne = bounds.northeast; + boundsNotifier.value = ZoomedBounds( + sw: _fromServiceLatLng(sw), + ne: _fromServiceLatLng(ne), + zoom: zoom, + rotation: rotation, + ); + } + } + + Future<void> _resetRotation() async { + final controller = _serviceMapController; + if (controller == null) return; + + await controller.animateCamera(CameraUpdate.newCameraPosition(CameraPosition( + target: _toServiceLatLng(bounds.projectedCenter), + zoom: bounds.zoom, + ))); + } + + Future<void> _zoomBy(double amount) async { + final controller = _serviceMapController; + if (controller == null) return; + + widget.onUserZoomChange?.call(await controller.getZoomLevel() + amount); + await controller.animateCamera(CameraUpdate.zoomBy(amount)); + } + + Future<void> _moveTo(LatLng point) async { + final controller = _serviceMapController; + if (controller == null) return; + + await controller.animateCamera(CameraUpdate.newLatLng(point)); + } + + // `LatLng` used by `google_maps_flutter` is not the one from `latlong2` package + LatLng _toServiceLatLng(ll.LatLng location) => LatLng(location.latitude, location.longitude); + + ll.LatLng _fromServiceLatLng(LatLng location) => ll.LatLng(location.latitude, location.longitude); + + MapType _toMapType(EntryMapStyle style) { + if (style == EntryMapStyles.googleNormal) return MapType.normal; + if (style == EntryMapStyles.googleHybrid) return MapType.hybrid; + if (style == EntryMapStyles.googleTerrain) return MapType.terrain; + return MapType.none; + } +} + +class GmsGeoTiffTileProvider extends TileProvider { + MapOverlay overlayEntry; + + GmsGeoTiffTileProvider(this.overlayEntry); + + @override + Future<Tile> getTile(int x, int y, int? zoom) async { + final tile = await overlayEntry.getTile(x, y, zoom); + if (tile != null) { + return Tile(tile.width, tile.height, tile.data); + } + return TileProvider.noTile; + } +} + +class _GoogleMap extends StatefulWidget { + final ValueNotifier<ll.LatLng?>? dotLocationNotifier; + final CameraPosition initialCameraPosition; + final MapCreatedCallback? onMapCreated; + final MapType mapType; + final MinMaxZoomPreference minMaxZoomPreference; + final bool interactive; + final Set<Marker> markers; + final Set<Polyline> polylines; + final Set<TileOverlay> tileOverlays; + final CameraPositionCallback? onCameraMove; + final VoidCallback? onCameraIdle; + final ArgumentCallback<LatLng>? onTap; + + const _GoogleMap({ + required this.dotLocationNotifier, + required this.initialCameraPosition, + required this.onMapCreated, + required this.mapType, + required this.minMaxZoomPreference, + required this.interactive, + required this.markers, + required this.polylines, + required this.tileOverlays, + required this.onCameraMove, + required this.onCameraIdle, + required this.onTap, + }); + + @override + State<_GoogleMap> createState() => _GoogleMapState(); +} + +class _GoogleMapState extends State<_GoogleMap> { + @override + void initState() { + super.initState(); + _registerWidget(widget); + } + + @override + void didUpdateWidget(covariant _GoogleMap oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + super.dispose(); + } + + void _registerWidget(_GoogleMap widget) { + widget.dotLocationNotifier?.addListener(_onDotLocationChanged); + } + + void _unregisterWidget(_GoogleMap widget) { + widget.dotLocationNotifier?.removeListener(_onDotLocationChanged); + } + + // TODO TLAD [map] remove when this is fixed: https://github.com/flutter/flutter/issues/103686 + Future<void> _onDotLocationChanged() async { + // workaround for dot location marker not always reflecting the current location, + // despite `ValueListenableBuilder` on `widget.dotLocationNotifier` + await Future.delayed(const Duration(milliseconds: 100)); + if (mounted) { + setState(() {}); + } + } + + @override + Widget build(BuildContext context) { + return GoogleMap( + initialCameraPosition: widget.initialCameraPosition, + onMapCreated: widget.onMapCreated, + // compass disabled to use provider agnostic controls + compassEnabled: false, + mapToolbarEnabled: false, + mapType: widget.mapType, + minMaxZoomPreference: widget.minMaxZoomPreference, + rotateGesturesEnabled: true, + scrollGesturesEnabled: widget.interactive, + // zoom controls disabled to use provider agnostic controls + zoomControlsEnabled: false, + zoomGesturesEnabled: widget.interactive, + // lite mode disabled because it lacks camera animation + liteModeEnabled: false, + // tilt disabled to match leaflet + tiltGesturesEnabled: false, + myLocationEnabled: false, + myLocationButtonEnabled: false, + markers: widget.markers, + polylines: widget.polylines, + tileOverlays: widget.tileOverlays, + onCameraMove: widget.onCameraMove, + onCameraIdle: widget.onCameraIdle, + onTap: widget.onTap, + ); + } +} diff --git a/plugins/aves_services_google/pubspec.yaml b/plugins/aves_services_google/pubspec.yaml new file mode 100644 index 0000000..a5b5962 --- /dev/null +++ b/plugins/aves_services_google/pubspec.yaml @@ -0,0 +1,29 @@ +name: aves_services_platform +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.9.0 <4.0.0" +resolution: workspace + +dependencies: + flutter: + sdk: flutter + aves_map: + path: ../aves_map + aves_services: + path: ../aves_services + aves_utils: + path: ../aves_utils + device_info_plus: + google_api_availability: + google_maps_flutter: + google_maps_flutter_android: + google_maps_flutter_platform_interface: + latlong2: + provider: + +dev_dependencies: + flutter_lints: + +flutter: diff --git a/plugins/aves_services_none/.gitignore b/plugins/aves_services_none/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/plugins/aves_services_none/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/plugins/aves_services_none/.metadata b/plugins/aves_services_none/.metadata new file mode 100644 index 0000000..a831254 --- /dev/null +++ b/plugins/aves_services_none/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + channel: stable + +project_type: package diff --git a/plugins/aves_services_none/analysis_options.yaml b/plugins/aves_services_none/analysis_options.yaml new file mode 100644 index 0000000..f04c6cf --- /dev/null +++ b/plugins/aves_services_none/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/plugins/aves_services_none/lib/aves_services_platform.dart b/plugins/aves_services_none/lib/aves_services_platform.dart new file mode 100644 index 0000000..c15ad78 --- /dev/null +++ b/plugins/aves_services_none/lib/aves_services_platform.dart @@ -0,0 +1,41 @@ +import 'package:aves_map/aves_map.dart'; +import 'package:aves_services/aves_services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:latlong2/latlong.dart'; + +class PlatformMobileServices extends MobileServices { + @override + Future<void> init() async {} + + @override + bool get isServiceAvailable => false; + + @override + EntryMapStyle? get defaultMapStyle => null; + + @override + List<EntryMapStyle> get mapStyles => []; + + @override + Widget buildMap<T>({ + required AvesMapController controller, + required Listenable clusterListenable, + required ValueNotifier<ZoomedBounds> boundsNotifier, + required EntryMapStyle style, + required TransitionBuilder decoratorBuilder, + required WidgetBuilder buttonPanelBuilder, + required MarkerClusterBuilder<T> markerClusterBuilder, + required MarkerWidgetBuilder<T> markerWidgetBuilder, + required MarkerImageReadyChecker<T> markerImageReadyChecker, + required ValueNotifier<LatLng?>? dotLocationNotifier, + required ValueNotifier<double>? overlayOpacityNotifier, + required MapOverlay? overlayEntry, + required Set<List<LatLng>>? tracks, + required UserZoomChangeCallback? onUserZoomChange, + required MapTapCallback? onMapTap, + required MarkerTapCallback<T>? onMarkerTap, + required MarkerLongPressCallback<T>? onMarkerLongPress, + }) { + return const SizedBox(); + } +} diff --git a/plugins/aves_services_none/pubspec.yaml b/plugins/aves_services_none/pubspec.yaml new file mode 100644 index 0000000..8adc67f --- /dev/null +++ b/plugins/aves_services_none/pubspec.yaml @@ -0,0 +1,21 @@ +name: aves_services_platform +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.9.0 <4.0.0" +resolution: workspace + +dependencies: + flutter: + sdk: flutter + aves_map: + path: ../aves_map + aves_services: + path: ../aves_services + latlong2: + +dev_dependencies: + flutter_lints: + +flutter: diff --git a/plugins/aves_ui/.gitignore b/plugins/aves_ui/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/plugins/aves_ui/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/plugins/aves_ui/.metadata b/plugins/aves_ui/.metadata new file mode 100644 index 0000000..c24d00d --- /dev/null +++ b/plugins/aves_ui/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 5464c5bac742001448fe4fc0597be939379f88ea + channel: stable + +project_type: package diff --git a/plugins/aves_ui/analysis_options.yaml b/plugins/aves_ui/analysis_options.yaml new file mode 100644 index 0000000..f04c6cf --- /dev/null +++ b/plugins/aves_ui/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/plugins/aves_ui/lib/aves_ui.dart b/plugins/aves_ui/lib/aves_ui.dart new file mode 100644 index 0000000..148314a --- /dev/null +++ b/plugins/aves_ui/lib/aves_ui.dart @@ -0,0 +1 @@ +export 'src/dot.dart'; diff --git a/plugins/aves_ui/lib/src/dot.dart b/plugins/aves_ui/lib/src/dot.dart new file mode 100644 index 0000000..5ae99af --- /dev/null +++ b/plugins/aves_ui/lib/src/dot.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +class AvesDot extends StatelessWidget { + final double diameter, outerBorderWidth, innerBorderWidth; + final Color Function(bool isDark) getOuterBorderColor, getInnerBorderColor; + + const AvesDot({ + super.key, + this.diameter = 16, + this.outerBorderWidth = 1.5, + this.innerBorderWidth = 2, + this.getOuterBorderColor = themedOuterBorderColor, + this.getInnerBorderColor = themedInnerBorderColor, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final isDark = theme.brightness == Brightness.dark; + final outerBorderColor = getOuterBorderColor(isDark); + final innerBorderColor = getInnerBorderColor(isDark); + final outerBorderRadius = BorderRadius.all(Radius.circular(diameter)); + final innerRadius = Radius.circular(diameter - outerBorderWidth); + final innerBorderRadius = BorderRadius.all(innerRadius); + + final outerDecoration = BoxDecoration( + border: Border.fromBorderSide(BorderSide( + color: outerBorderColor, + width: outerBorderWidth, + )), + borderRadius: outerBorderRadius, + ); + + final innerDecoration = BoxDecoration( + border: Border.fromBorderSide(BorderSide( + color: innerBorderColor, + width: innerBorderWidth, + )), + borderRadius: innerBorderRadius, + ); + + return Container( + decoration: outerDecoration, + child: DecoratedBox( + decoration: innerDecoration, + position: DecorationPosition.foreground, + child: ClipRRect( + borderRadius: innerBorderRadius, + child: Container( + width: diameter, + height: diameter, + color: theme.colorScheme.primary, + ), + ), + ), + ); + } + + static Color themedOuterBorderColor(bool isDark) => isDark ? Colors.white30 : Colors.black26; + + static Color themedInnerBorderColor(bool isDark) => isDark ? const Color(0xFF212121) : Colors.white; +} diff --git a/plugins/aves_ui/pubspec.yaml b/plugins/aves_ui/pubspec.yaml new file mode 100644 index 0000000..7e945c8 --- /dev/null +++ b/plugins/aves_ui/pubspec.yaml @@ -0,0 +1,16 @@ +name: aves_ui +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.9.0 <4.0.0" +resolution: workspace + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_lints: + +flutter: diff --git a/plugins/aves_utils/.gitignore b/plugins/aves_utils/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/plugins/aves_utils/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/plugins/aves_utils/.metadata b/plugins/aves_utils/.metadata new file mode 100644 index 0000000..ad910f5 --- /dev/null +++ b/plugins/aves_utils/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 2ad6cd72c040113b47ee9055e722606a490ef0da + channel: stable + +project_type: package diff --git a/plugins/aves_utils/analysis_options.yaml b/plugins/aves_utils/analysis_options.yaml new file mode 100644 index 0000000..f04c6cf --- /dev/null +++ b/plugins/aves_utils/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/plugins/aves_utils/lib/aves_utils.dart b/plugins/aves_utils/lib/aves_utils.dart new file mode 100644 index 0000000..0058969 --- /dev/null +++ b/plugins/aves_utils/lib/aves_utils.dart @@ -0,0 +1,4 @@ +export 'src/colors.dart'; +export 'src/listenable.dart'; +export 'src/optional_event_channel.dart'; +export 'src/vector_utils.dart'; diff --git a/plugins/aves_utils/lib/src/colors.dart b/plugins/aves_utils/lib/src/colors.dart new file mode 100644 index 0000000..95c9d66 --- /dev/null +++ b/plugins/aves_utils/lib/src/colors.dart @@ -0,0 +1,72 @@ +import 'dart:convert'; +import 'dart:ui'; + +import 'package:flutter/foundation.dart'; + +class ColorUtils { + // `Color(0x00FFFFFF)` is different from `Color(0x00000000)` (or `Colors.transparent`) + // when used in gradients or lerping to it + static const transparentWhite = Color(0x00FFFFFF); + static const transparentBlack = Color(0x00000000); + + static Color textColorOn(Color background) { + final l = luma( + background.intRed, + background.intGreen, + background.intBlue, + ); + return Color(l >= .5 ? 0xFF000000 : 0xFFFFFFFF); + } + + // quick computation of luma (Y component of YUV or YIQ) from RGB + // cf https://en.wikipedia.org/wiki/Y%E2%80%B2UV + // cf https://en.wikipedia.org/wiki/YIQ + // `Color.computeLuminance()` is more accurate, but slower + // r, g, b in [0, 255], luma in [0, 1] + static double luma(int r, int g, int b) { + return (r * .299 + g * .587 + b * .114) / 255; + } +} + +extension ExtraColor on Color { + int get intRed => (r * 255).round(); // sRGB red component + int get intGreen => (g * 255).round(); // sRGB green component + int get intBlue => (b * 255).round(); // sRGB blue component + + // serialization + + String toJson() => jsonEncode(_toMap()); + + static Color? fromJson(String? jsonString) { + if (jsonString == null || jsonString.isEmpty) return null; + + try { + final jsonMap = jsonDecode(jsonString); + if (jsonMap is Map<String, dynamic>) { + return _fromMap(jsonMap); + } + debugPrint('failed to parse color from json=$jsonString'); + } catch (error, stack) { + debugPrint('failed to parse color from json=$jsonString error=$error\n$stack'); + } + return null; + } + + Map<String, dynamic> _toMap() => { + 'a': a, + 'r': r, + 'g': g, + 'b': b, + 'colorSpace': colorSpace.name, + }; + + static Color _fromMap(Map<String, dynamic> map) { + return Color.from( + alpha: map['a'] as double, + red: map['r'] as double, + green: map['g'] as double, + blue: map['b'] as double, + colorSpace: ColorSpace.values.byName(map['colorSpace'] as String), + ); + } +} diff --git a/plugins/aves_utils/lib/src/listenable.dart b/plugins/aves_utils/lib/src/listenable.dart new file mode 100644 index 0000000..75701cd --- /dev/null +++ b/plugins/aves_utils/lib/src/listenable.dart @@ -0,0 +1,55 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +// `ChangeNotifier` wrapper to call `notify` without constraint +class AChangeNotifier extends ChangeNotifier { + void notify() { + // why is this protected? + super.notifyListeners(); + } +} + +// contrary to standard `ValueListenableBuilder`, this widget allows providing a null listenable +class NullableValueListenableBuilder<T> extends StatefulWidget { + final ValueListenable<T?>? valueListenable; + final ValueWidgetBuilder<T?> builder; + final Widget? child; + + const NullableValueListenableBuilder({ + super.key, + required this.valueListenable, + required this.builder, + this.child, + }); + + @override + State<NullableValueListenableBuilder> createState() => _NullableValueListenableBuilderState<T>(); +} + +class _NullableValueListenableBuilderState<T> extends State<NullableValueListenableBuilder<T>> { + ValueNotifier<T?>? _internalValueListenable; + + ValueListenable<T?> get _valueListenable { + var listenable = widget.valueListenable; + if (listenable == null) { + _internalValueListenable ??= ValueNotifier(null); + listenable = _internalValueListenable; + } + return listenable!; + } + + @override + void dispose() { + _internalValueListenable?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder<T?>( + valueListenable: _valueListenable, + builder: widget.builder, + child: widget.child, + ); + } +} diff --git a/plugins/aves_utils/lib/src/optional_event_channel.dart b/plugins/aves_utils/lib/src/optional_event_channel.dart new file mode 100644 index 0000000..4f8aff6 --- /dev/null +++ b/plugins/aves_utils/lib/src/optional_event_channel.dart @@ -0,0 +1,58 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +// adapted from Flutter `EventChannel` in `/services/platform_channel.dart` +// to use an `OptionalMethodChannel` when subscribing to events +class OptionalEventChannel extends EventChannel { + const OptionalEventChannel(super.name, [super.codec = const StandardMethodCodec(), super.binaryMessenger]); + + @override + Stream<dynamic> receiveBroadcastStream([dynamic arguments]) { + final MethodChannel methodChannel = OptionalMethodChannel(name, codec); + late StreamController<dynamic> controller; + controller = StreamController<dynamic>.broadcast(onListen: () async { + binaryMessenger.setMessageHandler(name, (reply) async { + if (reply == null) { + await controller.close(); + } else { + try { + controller.add(codec.decodeEnvelope(reply)); + } on PlatformException catch (e) { + controller.addError(e); + } + } + return null; + }); + try { + await methodChannel.invokeMethod<void>('listen', arguments); + } catch (error, stack) { + FlutterError.reportError(FlutterErrorDetails( + exception: error, + stack: stack, + library: 'services library', + context: ErrorDescription('while activating platform stream on channel $name'), + )); + } + }, onCancel: () async { + binaryMessenger.setMessageHandler(name, null); + try { + await methodChannel.invokeMethod<void>('cancel', arguments); + } catch (error, stack) { + if (error is PlatformException && error.message == 'No active stream to cancel') { + // ignore + return; + } + + FlutterError.reportError(FlutterErrorDetails( + exception: error, + stack: stack, + library: 'services library', + context: ErrorDescription('while de-activating platform stream on channel $name'), + )); + } + }); + return controller.stream; + } +} diff --git a/plugins/aves_utils/lib/src/vector_utils.dart b/plugins/aves_utils/lib/src/vector_utils.dart new file mode 100644 index 0000000..14f3207 --- /dev/null +++ b/plugins/aves_utils/lib/src/vector_utils.dart @@ -0,0 +1,15 @@ +import 'dart:ui'; + +import 'package:vector_math/vector_math_64.dart'; + +extension ExtraOffset on Offset { + Vector3 get toVector3 => Vector3(dx, dy, 0); +} + +extension ExtraVector3 on Vector3 { + Offset get toOffset => Offset(x, y); +} + +extension ExtraMatrix4 on Matrix4 { + Offset transformOffset(Offset v) => transform3(v.toVector3).toOffset; +} diff --git a/plugins/aves_utils/pubspec.yaml b/plugins/aves_utils/pubspec.yaml new file mode 100644 index 0000000..9a4af35 --- /dev/null +++ b/plugins/aves_utils/pubspec.yaml @@ -0,0 +1,17 @@ +name: aves_utils +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.9.0 <4.0.0" +resolution: workspace + +dependencies: + flutter: + sdk: flutter + vector_math: + +dev_dependencies: + flutter_lints: + +flutter: diff --git a/plugins/aves_video/.gitignore b/plugins/aves_video/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/plugins/aves_video/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/plugins/aves_video/.metadata b/plugins/aves_video/.metadata new file mode 100644 index 0000000..ad910f5 --- /dev/null +++ b/plugins/aves_video/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 2ad6cd72c040113b47ee9055e722606a490ef0da + channel: stable + +project_type: package diff --git a/plugins/aves_video/analysis_options.yaml b/plugins/aves_video/analysis_options.yaml new file mode 100644 index 0000000..f04c6cf --- /dev/null +++ b/plugins/aves_video/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/plugins/aves_video/lib/aves_video.dart b/plugins/aves_video/lib/aves_video.dart new file mode 100644 index 0000000..3dac858 --- /dev/null +++ b/plugins/aves_video/lib/aves_video.dart @@ -0,0 +1,10 @@ +export 'src/ab_repeat.dart'; +export 'src/controller.dart'; +export 'src/metadata.dart'; +export 'src/settings/subtitles.dart'; +export 'src/settings/video.dart'; +export 'src/stream.dart'; +export 'src/video_loop_mode.dart'; + +// ⬇️ NUOVO: controller per i remoti (wrappa video_player) +export 'src/remote_controller.dart'; diff --git a/plugins/aves_video/lib/src/ab_repeat.dart b/plugins/aves_video/lib/src/ab_repeat.dart new file mode 100644 index 0000000..379b62b --- /dev/null +++ b/plugins/aves_video/lib/src/ab_repeat.dart @@ -0,0 +1,33 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +class ABRepeat { + final int? start, end; + + ABRepeat({this.start, this.end}); + + ABRepeat sanitize() { + if (start != null && end != null && start! > end!) { + return ABRepeat(start: end, end: start); + } + return ABRepeat(start: start, end: end); + } + + int clamp(int position) => (start != null && end != null) ? position.clamp(start!, end!) : position; +} + +mixin ABRepeatMixin { + int get currentPosition; + + ValueNotifier<ABRepeat?> abRepeatNotifier = ValueNotifier(null); + + void toggleABRepeat() => _setAbRepeat(abRepeatNotifier.value != null ? null : ABRepeat()); + + void resetABRepeat() => _setAbRepeat(ABRepeat()); + + void setABRepeatStart() => _setAbRepeat(ABRepeat(start: currentPosition, end: abRepeatNotifier.value?.end)); + + void setABRepeatEnd() => _setAbRepeat(ABRepeat(start: abRepeatNotifier.value?.start, end: currentPosition)); + + void _setAbRepeat(ABRepeat? v) => abRepeatNotifier.value = v?.sanitize(); +} diff --git a/plugins/aves_video/lib/src/controller.dart b/plugins/aves_video/lib/src/controller.dart new file mode 100644 index 0000000..c68f3a2 --- /dev/null +++ b/plugins/aves_video/lib/src/controller.dart @@ -0,0 +1,161 @@ +import 'dart:async'; + +import 'package:aves_model/aves_model.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:leak_tracker/leak_tracker.dart'; + +abstract class AvesVideoControllerFactory { + void init(); + + AvesVideoController buildController( + AvesEntryBase entry, { + required PlaybackStateHandler playbackStateHandler, + required VideoSettings settings, + }); +} + +abstract class AvesVideoController with ABRepeatMixin { + final AvesEntryBase _entry; + final PlaybackStateHandler playbackStateHandler; + final VideoSettings settings; + bool _disposed = false; + + AvesEntryBase get entry => _entry; + + static const resumeTimeSaveMinDuration = Duration(minutes: 2); + + AvesVideoController( + AvesEntryBase entry, { + required this.playbackStateHandler, + required this.settings, + }) : _entry = entry { + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectCreated( + library: 'aves', + className: '$AvesVideoController', + object: this, + ); + } + entry.visualChangeNotifier.addListener(onVisualChanged); + } + + @mustCallSuper + Future<void> dispose() async { + assert(!_disposed); + _disposed = true; + if (kFlutterMemoryAllocationsEnabled) { + LeakTracking.dispatchObjectDisposed(object: this); + } + abRepeatNotifier.dispose(); + _entry.visualChangeNotifier.removeListener(onVisualChanged); + await _savePlaybackState(); + } + + Future<void> _savePlaybackState() async { + if (!isReady || duration < resumeTimeSaveMinDuration.inMilliseconds) return; + await playbackStateHandler.saveResumeTime(entryId: _entry.id, position: currentPosition, progress: progress); + } + + Future<int?> getResumeTime(BuildContext context) => playbackStateHandler.getResumeTime(entryId: _entry.id, context: context); + + void onVisualChanged(); + + Future<void> play(); + + Future<void> pause(); + + Future<void> seekTo(int targetMillis); + + Future<void> seekToProgress(double progress) => seekTo((duration * progress.clamp(0, 1)).toInt()); + + Future<void> skipFrames(int frameCount); + + Listenable get playCompletedListenable; + + VideoStatus get status; + + Stream<VideoStatus> get statusStream; + + Stream<double> get volumeStream; + + Stream<double> get speedStream; + + bool get isReady; + + Future<void> get untilReady { + if (isReady) return Future.value(); + + final completer = Completer(); + late StreamSubscription<VideoStatus> sub; + sub = statusStream.where((_) => isReady).listen((_) { + sub.cancel(); + completer.complete(); + }); + return completer.future; + } + + bool get isPlaying => status == VideoStatus.playing; + + int get duration; + + @override + int get currentPosition; + + double get progress { + final _duration = duration; + return _duration != 0 ? currentPosition.toDouble() / _duration : 0; + } + + Stream<int> get positionStream; + + Stream<String?> get timedTextStream; + + ValueNotifier<bool> get canCaptureFrameNotifier; + + ValueNotifier<bool> get canMuteNotifier; + + ValueNotifier<bool> get canSetSpeedNotifier; + + ValueNotifier<bool> get canSelectStreamNotifier; + + ValueNotifier<double?> get sarNotifier; + + bool get isMuted; + + double get speed; + + double get minSpeed; + + double get maxSpeed; + + set speed(double speed); + + Future<void> selectStream(MediaStreamType type, MediaStreamSummary? selected); + + Future<MediaStreamSummary?> getSelectedStream(MediaStreamType type); + + List<MediaStreamSummary> get streams; + + Future<Uint8List?> captureFrame(); + + Future<void> mute(bool muted); + + Widget buildPlayerWidget(BuildContext context); +} + +enum VideoStatus { + idle, + initialized, + paused, + playing, + completed, + error, +} + +abstract class PlaybackStateHandler { + Future<int?> getResumeTime({required int entryId, required BuildContext context}); + + Future<void> saveResumeTime({required int entryId, required int position, required double progress}); +} diff --git a/plugins/aves_video/lib/src/metadata.dart b/plugins/aves_video/lib/src/metadata.dart new file mode 100644 index 0000000..21f6990 --- /dev/null +++ b/plugins/aves_video/lib/src/metadata.dart @@ -0,0 +1,9 @@ +import 'dart:async'; + +import 'package:aves_model/aves_model.dart'; + +abstract class AvesVideoMetadataFetcher { + void init(); + + Future<Map> getMetadata(AvesEntryBase entry); +} diff --git a/plugins/aves_video/lib/src/remote_controller.dart b/plugins/aves_video/lib/src/remote_controller.dart new file mode 100644 index 0000000..499ac43 --- /dev/null +++ b/plugins/aves_video/lib/src/remote_controller.dart @@ -0,0 +1,215 @@ +import 'dart:async'; +import 'package:aves_video/aves_video.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:video_player/video_player.dart'; +import 'package:aves/remote/remote_http.dart' as remote; + +class RemoteNetworkVideoController extends AvesVideoController { + final String url; + Map<String, String>? httpHeaders; + + late final VideoPlayerController _vp; + final _statusCtr = StreamController<VideoStatus>.broadcast(); + final _positionCtr = StreamController<int>.broadcast(); + final _speedCtr = StreamController<double>.broadcast(); + final _volumeCtr = StreamController<double>.broadcast(); + final ValueNotifier<bool> _canCaptureFrame = ValueNotifier(false); + final ValueNotifier<bool> _canMute = ValueNotifier(true); + final ValueNotifier<bool> _canSetSpeed = ValueNotifier(true); + final ValueNotifier<bool> _canSelectStream = ValueNotifier(false); + final ValueNotifier<double?> _sar = ValueNotifier<double?>(null); + final _playCompleted = ValueNotifier<bool>(false); + + Timer? _posTimer; + double _speed = 1.0; + bool _muted = false; + + RemoteNetworkVideoController( + super.entry, { + required this.url, + this.httpHeaders, + required super.playbackStateHandler, + required super.settings, + }) { + _init(); + } + + Future<void> _init() async { + try { + // headers: usa cache se presente, altrimenti fetch adesso + httpHeaders ??= remote.RemoteHttp.peekHeaders() ?? await remote.RemoteHttp.headers(); + + // ✅ networkUrl con headers NON nulli + _vp = VideoPlayerController.networkUrl(Uri.parse(url), httpHeaders: httpHeaders ?? const {}); + // Se la tua versione del plugin non ha networkUrl(...), usa la riga sotto: + // _vp = VideoPlayerController.network(url, httpHeaders: httpHeaders ?? const {}); + + await _vp.initialize(); + + _statusCtr.add(VideoStatus.initialized); + _speed = _vp.value.playbackSpeed; + _speedCtr.add(_speed); + _muted = _vp.value.volume == 0; + _volumeCtr.add(_vp.value.volume); + + // Poll leggero della posizione + _posTimer = Timer.periodic(const Duration(milliseconds: 250), (_) { + final v = _vp.value; + if (!v.isInitialized) return; + _positionCtr.add(v.position.inMilliseconds); + + final d = v.duration; + if (d.inMilliseconds > 0 && + (d - v.position).inMilliseconds <= 200 && + !_playCompleted.value) { + _playCompleted.value = true; + _statusCtr.add(VideoStatus.completed); + } + }); + } catch (_) { + _statusCtr.add(VideoStatus.error); + } + } + + @override + Future<void> dispose() async { + _posTimer?.cancel(); + await _vp.dispose(); + _statusCtr.close(); + _positionCtr.close(); + _speedCtr.close(); + _volumeCtr.close(); + _canCaptureFrame.dispose(); + _canMute.dispose(); + _canSetSpeed.dispose(); + _canSelectStream.dispose(); + _sar.dispose(); + _playCompleted.dispose(); + await super.dispose(); + } + + @override + void onVisualChanged() {} + + @override + Future<void> play() async { + await _vp.play(); + _statusCtr.add(VideoStatus.playing); + } + + @override + Future<void> pause() async { + await _vp.pause(); + _statusCtr.add(VideoStatus.paused); + } + + @override + Future<void> seekTo(int targetMillis) async { + await _vp.seekTo(Duration(milliseconds: targetMillis)); + } + + @override + Future<void> skipFrames(int frameCount) async { + // stima ~30fps + final delta = Duration(milliseconds: (1000 / 30 * frameCount).round()); + await _vp.seekTo(_vp.value.position + delta); + } + + @override + Listenable get playCompletedListenable => _playCompleted; + + @override + VideoStatus get status { + final v = _vp.value; + if (!v.isInitialized) return VideoStatus.idle; + if (v.hasError) return VideoStatus.error; + return v.isPlaying ? VideoStatus.playing : VideoStatus.paused; + } + + @override + Stream<VideoStatus> get statusStream => _statusCtr.stream; + + @override + Stream<double> get volumeStream => _volumeCtr.stream; + + @override + Stream<double> get speedStream => _speedCtr.stream; + + @override + bool get isReady => _vp.value.isInitialized; + + @override + int get duration => _vp.value.isInitialized ? _vp.value.duration.inMilliseconds : 0; + + @override + int get currentPosition => _vp.value.position.inMilliseconds; + + @override + Stream<int> get positionStream => _positionCtr.stream; + + @override + Stream<String?> get timedTextStream => const Stream.empty(); + + @override + ValueNotifier<bool> get canCaptureFrameNotifier => _canCaptureFrame; + + @override + ValueNotifier<bool> get canMuteNotifier => _canMute; + + @override + ValueNotifier<bool> get canSetSpeedNotifier => _canSetSpeed; + + @override + ValueNotifier<bool> get canSelectStreamNotifier => _canSelectStream; + + @override + ValueNotifier<double?> get sarNotifier => _sar; + + @override + bool get isMuted => _muted; + + @override + double get speed => _speed; + + @override + double get minSpeed => 0.25; + + @override + double get maxSpeed => 2.0; + + @override + set speed(double s) { + _speed = s.clamp(minSpeed, maxSpeed); + _vp.setPlaybackSpeed(_speed); + _speedCtr.add(_speed); + } + + @override + Future<void> selectStream(MediaStreamType type, MediaStreamSummary? selected) async { + // non implementato in questa versione minima + } + + @override + Future<MediaStreamSummary?> getSelectedStream(MediaStreamType type) async => null; + + @override + List<MediaStreamSummary> get streams => const []; + + @override + Future<Uint8List?> captureFrame() async => null; + + @override + Future<void> mute(bool muted) async { + _muted = muted; + await _vp.setVolume(muted ? 0 : 1); + _volumeCtr.add(_vp.value.volume); + } + + @override + Widget buildPlayerWidget(BuildContext context) { + if (!isReady) return const SizedBox(); + final ar = _vp.value.aspectRatio == 0 ? 16 / 9 : _vp.value.aspectRatio; + return AspectRatio(aspectRatio: ar, child: VideoPlayer(_vp)); + } +} diff --git a/plugins/aves_video/lib/src/settings/defaults.dart b/plugins/aves_video/lib/src/settings/defaults.dart new file mode 100644 index 0000000..6873fc0 --- /dev/null +++ b/plugins/aves_video/lib/src/settings/defaults.dart @@ -0,0 +1,26 @@ +import 'dart:ui'; + +import 'package:aves_model/aves_model.dart'; +import 'package:aves_utils/aves_utils.dart'; + +class SettingsDefaults { + // video + static const videoAutoPlayMode = VideoAutoPlayMode.disabled; + static const videoBackgroundMode = VideoBackgroundMode.disabled; + static const videoHardwareAcceleration = VideoHardwareAcceleration.enabled; + static const videoLoopMode = VideoLoopMode.shortOnly; + static const videoResumptionMode = VideoResumptionMode.ask; + static const videoShowRawTimedText = false; + static const videoControlActions = [EntryAction.videoTogglePlay]; + static const videoGestureDoubleTapTogglePlay = false; + static const videoGestureSideDoubleTapSeek = true; + static const videoGestureVerticalDragBrightnessVolume = false; + + // subtitles + static const subtitleFontSize = 20.0; + static const subtitleTextAlignment = TextAlign.center; + static const subtitleTextPosition = SubtitlePosition.bottom; + static const subtitleShowOutline = true; + static const subtitleTextColor = Color(0xFFFFFFFF); + static const subtitleBackgroundColor = ColorUtils.transparentBlack; +} diff --git a/plugins/aves_video/lib/src/settings/subtitles.dart b/plugins/aves_video/lib/src/settings/subtitles.dart new file mode 100644 index 0000000..baa757a --- /dev/null +++ b/plugins/aves_video/lib/src/settings/subtitles.dart @@ -0,0 +1,31 @@ +import 'dart:ui'; + +import 'package:aves_model/aves_model.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:aves_video/src/settings/defaults.dart'; + +mixin SubtitlesSettings on SettingsAccess { + double get subtitleFontSize => getDouble(SettingKeys.subtitleFontSizeKey) ?? SettingsDefaults.subtitleFontSize; + + set subtitleFontSize(double newValue) => set(SettingKeys.subtitleFontSizeKey, newValue); + + TextAlign get subtitleTextAlignment => getEnumOrDefault(SettingKeys.subtitleTextAlignmentKey, SettingsDefaults.subtitleTextAlignment, TextAlign.values); + + set subtitleTextAlignment(TextAlign newValue) => set(SettingKeys.subtitleTextAlignmentKey, newValue.toString()); + + SubtitlePosition get subtitleTextPosition => getEnumOrDefault(SettingKeys.subtitleTextPositionKey, SettingsDefaults.subtitleTextPosition, SubtitlePosition.values); + + set subtitleTextPosition(SubtitlePosition newValue) => set(SettingKeys.subtitleTextPositionKey, newValue.toString()); + + bool get subtitleShowOutline => getBool(SettingKeys.subtitleShowOutlineKey) ?? SettingsDefaults.subtitleShowOutline; + + set subtitleShowOutline(bool newValue) => set(SettingKeys.subtitleShowOutlineKey, newValue); + + Color get subtitleTextColor => ExtraColor.fromJson(getString(SettingKeys.subtitleTextColorKey)) ?? SettingsDefaults.subtitleTextColor; + + set subtitleTextColor(Color newValue) => set(SettingKeys.subtitleTextColorKey, newValue.toJson()); + + Color get subtitleBackgroundColor => ExtraColor.fromJson(getString(SettingKeys.subtitleBackgroundColorKey)) ?? SettingsDefaults.subtitleBackgroundColor; + + set subtitleBackgroundColor(Color newValue) => set(SettingKeys.subtitleBackgroundColorKey, newValue.toJson()); +} diff --git a/plugins/aves_video/lib/src/settings/video.dart b/plugins/aves_video/lib/src/settings/video.dart new file mode 100644 index 0000000..35dd52d --- /dev/null +++ b/plugins/aves_video/lib/src/settings/video.dart @@ -0,0 +1,40 @@ +import 'package:aves_model/aves_model.dart'; +import 'package:aves_video/src/settings/defaults.dart'; + +mixin VideoSettings on SettingsAccess { + VideoHardwareAcceleration get videoHardwareAcceleration => getEnumOrDefault(SettingKeys.videoHardwareAccelerationKey, SettingsDefaults.videoHardwareAcceleration, VideoHardwareAcceleration.values); + + set videoHardwareAcceleration(VideoHardwareAcceleration newValue) => set(SettingKeys.videoHardwareAccelerationKey, newValue.toString()); + + VideoAutoPlayMode get videoAutoPlayMode => getEnumOrDefault(SettingKeys.videoAutoPlayModeKey, SettingsDefaults.videoAutoPlayMode, VideoAutoPlayMode.values); + + set videoAutoPlayMode(VideoAutoPlayMode newValue) => set(SettingKeys.videoAutoPlayModeKey, newValue.toString()); + + VideoBackgroundMode get videoBackgroundMode => getEnumOrDefault(SettingKeys.videoBackgroundModeKey, SettingsDefaults.videoBackgroundMode, VideoBackgroundMode.values); + + set videoBackgroundMode(VideoBackgroundMode newValue) => set(SettingKeys.videoBackgroundModeKey, newValue.toString()); + + VideoLoopMode get videoLoopMode => getEnumOrDefault(SettingKeys.videoLoopModeKey, SettingsDefaults.videoLoopMode, VideoLoopMode.values); + + set videoLoopMode(VideoLoopMode newValue) => set(SettingKeys.videoLoopModeKey, newValue.toString()); + + VideoResumptionMode get videoResumptionMode => getEnumOrDefault(SettingKeys.videoResumptionModeKey, SettingsDefaults.videoResumptionMode, VideoResumptionMode.values); + + set videoResumptionMode(VideoResumptionMode newValue) => set(SettingKeys.videoResumptionModeKey, newValue.toString()); + + List<EntryAction> get videoControlActions => getEnumListOrDefault(SettingKeys.videoControlActionsKey, SettingsDefaults.videoControlActions, EntryAction.values); + + set videoControlActions(List<EntryAction> newValue) => set(SettingKeys.videoControlActionsKey, newValue.map((v) => v.toString()).toList()); + + bool get videoGestureDoubleTapTogglePlay => getBool(SettingKeys.videoGestureDoubleTapTogglePlayKey) ?? SettingsDefaults.videoGestureDoubleTapTogglePlay; + + set videoGestureDoubleTapTogglePlay(bool newValue) => set(SettingKeys.videoGestureDoubleTapTogglePlayKey, newValue); + + bool get videoGestureSideDoubleTapSeek => getBool(SettingKeys.videoGestureSideDoubleTapSeekKey) ?? SettingsDefaults.videoGestureSideDoubleTapSeek; + + set videoGestureSideDoubleTapSeek(bool newValue) => set(SettingKeys.videoGestureSideDoubleTapSeekKey, newValue); + + bool get videoGestureVerticalDragBrightnessVolume => getBool(SettingKeys.videoGestureVerticalDragBrightnessVolumeKey) ?? SettingsDefaults.videoGestureVerticalDragBrightnessVolume; + + set videoGestureVerticalDragBrightnessVolume(bool newValue) => set(SettingKeys.videoGestureVerticalDragBrightnessVolumeKey, newValue); +} diff --git a/plugins/aves_video/lib/src/stream.dart b/plugins/aves_video/lib/src/stream.dart new file mode 100644 index 0000000..1d75488 --- /dev/null +++ b/plugins/aves_video/lib/src/stream.dart @@ -0,0 +1,22 @@ +import 'package:flutter/foundation.dart'; + +enum MediaStreamType { video, audio, text } + +class MediaStreamSummary { + final MediaStreamType type; + final int? index, width, height; + final String? codecName, language, title; + + const MediaStreamSummary({ + required this.type, + required this.index, + required this.codecName, + required this.language, + required this.title, + required this.width, + required this.height, + }); + + @override + String toString() => '$runtimeType#${shortHash(this)}{type: $type, index: $index, codecName: $codecName, language: $language, title: $title, width: $width, height: $height}'; +} diff --git a/plugins/aves_video/lib/src/video_loop_mode.dart b/plugins/aves_video/lib/src/video_loop_mode.dart new file mode 100644 index 0000000..196bd01 --- /dev/null +++ b/plugins/aves_video/lib/src/video_loop_mode.dart @@ -0,0 +1,19 @@ +import 'package:aves_model/aves_model.dart'; + +extension ExtraVideoLoopMode on VideoLoopMode { + static const shortVideoThreshold = Duration(seconds: 30); + + bool shouldLoop(AvesEntryBase entry) { + if (entry.isAnimated) return true; + + switch (this) { + case VideoLoopMode.never: + return false; + case VideoLoopMode.shortOnly: + final durationMillis = entry.durationMillis; + return durationMillis != null ? durationMillis < shortVideoThreshold.inMilliseconds : false; + case VideoLoopMode.always: + return true; + } + } +} diff --git a/plugins/aves_video/pubspec.yaml b/plugins/aves_video/pubspec.yaml new file mode 100644 index 0000000..fbc4f83 --- /dev/null +++ b/plugins/aves_video/pubspec.yaml @@ -0,0 +1,23 @@ +name: aves_video +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.9.0 <4.0.0" +resolution: workspace + +dependencies: + flutter: + sdk: flutter + aves_model: + path: ../aves_model + aves_utils: + path: ../aves_utils + leak_tracker: + + video_player: any + aves: any +dev_dependencies: + flutter_lints: + +flutter: diff --git a/plugins/aves_video_mpv/.gitignore b/plugins/aves_video_mpv/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/plugins/aves_video_mpv/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/plugins/aves_video_mpv/.metadata b/plugins/aves_video_mpv/.metadata new file mode 100644 index 0000000..9596fae --- /dev/null +++ b/plugins/aves_video_mpv/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 796c8ef79279f9c774545b3771238c3098dbefab + channel: stable + +project_type: package diff --git a/plugins/aves_video_mpv/analysis_options.yaml b/plugins/aves_video_mpv/analysis_options.yaml new file mode 100644 index 0000000..f04c6cf --- /dev/null +++ b/plugins/aves_video_mpv/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/plugins/aves_video_mpv/lib/aves_video_mpv.dart b/plugins/aves_video_mpv/lib/aves_video_mpv.dart new file mode 100644 index 0000000..0ec578d --- /dev/null +++ b/plugins/aves_video_mpv/lib/aves_video_mpv.dart @@ -0,0 +1,3 @@ +export 'src/controller.dart'; +export 'src/factory.dart'; +export 'src/metadata.dart'; diff --git a/plugins/aves_video_mpv/lib/src/controller.dart b/plugins/aves_video_mpv/lib/src/controller.dart new file mode 100644 index 0000000..58712fc --- /dev/null +++ b/plugins/aves_video_mpv/lib/src/controller.dart @@ -0,0 +1,447 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:aves_model/aves_model.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:aves_video_mpv/src/tracks.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:media_kit/media_kit.dart'; +import 'package:media_kit_video/media_kit_video.dart'; +import 'package:path/path.dart' as p; + +class MpvVideoController extends AvesVideoController { + late Player _instance; + late VideoStatus _status; + bool _firstFrameRendered = false, _abRepeatSeeking = false; + final ValueNotifier<VideoController?> _controllerNotifier = ValueNotifier(null); + final List<StreamSubscription> _subscriptions = []; + final StreamController<VideoStatus> _statusStreamController = StreamController.broadcast(); + final StreamController<String?> _timedTextStreamController = StreamController.broadcast(); + final AChangeNotifier _completedNotifier = AChangeNotifier(); + final List<SubtitleTrack> _externalSubtitleTracks = []; + + static final _pContext = p.Context(); + + @override + double get minSpeed => .25; + + @override + double get maxSpeed => 4; + + @override + final ValueNotifier<bool> canCaptureFrameNotifier = ValueNotifier(true); + + @override + final ValueNotifier<bool> canMuteNotifier = ValueNotifier(true); + + @override + final ValueNotifier<bool> canSetSpeedNotifier = ValueNotifier(true); + + @override + final ValueNotifier<bool> canSelectStreamNotifier = ValueNotifier(false); + + @override + final ValueNotifier<double?> sarNotifier = ValueNotifier(null); + + MpvVideoController( + super.entry, { + required super.playbackStateHandler, + required super.settings, + }) { + _status = VideoStatus.idle; + _statusStreamController.add(_status); + + _instance = Player( + configuration: PlayerConfiguration( + title: entry.bestTitle ?? entry.uri, + libass: false, + logLevel: MPVLogLevel.warn, + protocolWhitelist: [ + ...const PlayerConfiguration().protocolWhitelist, + // Android `content` URIs are considered unsafe by default, + // as they are transferred via a custom `fd` protocol + 'fd', + ], + ), + ); + _initController(); + _init(); + + _startListening(); + } + + @override + Future<void> dispose() async { + await super.dispose(); + + _stopListening(); + _stopStreamFetchTimer(); + await _statusStreamController.close(); + await _timedTextStreamController.close(); + await _instance.dispose(); + _controllerNotifier.dispose(); + + _completedNotifier.dispose(); + canCaptureFrameNotifier.dispose(); + canMuteNotifier.dispose(); + canSetSpeedNotifier.dispose(); + canSelectStreamNotifier.dispose(); + sarNotifier.dispose(); + } + + void _startListening() { + _subscriptions.add(statusStream.listen((v) => _status = v)); + + final playerStream = _instance.stream; + _subscriptions.add(playerStream.completed.listen((completed) { + if (completed) { + _statusStreamController.add(VideoStatus.completed); + _completedNotifier.notify(); + } + })); + _subscriptions.add(playerStream.playing.listen((playing) { + if (status == VideoStatus.idle) return; + _statusStreamController.add(playing ? VideoStatus.playing : VideoStatus.paused); + })); + _subscriptions.add(playerStream.position.listen((v) { + final abRepeat = abRepeatNotifier.value; + if (abRepeat != null && status == VideoStatus.playing) { + final start = abRepeat.start; + final end = abRepeat.end; + if (start != null && end != null) { + if (v.inMilliseconds < end) { + _abRepeatSeeking = false; + } else if (!_abRepeatSeeking) { + _abRepeatSeeking = true; + _instance.seek(Duration(milliseconds: start)); + } + } + } + })); + _subscriptions.add(playerStream.subtitle.listen((v) => _timedTextStreamController.add(v.isEmpty ? null : v[0]))); + _subscriptions.add(playerStream.videoParams.listen((v) => sarNotifier.value = v.par)); + _subscriptions.add(playerStream.log.listen((v) => debugPrint('libmpv log: $v'))); + _subscriptions.add(playerStream.error.listen((v) => debugPrint('libmpv error: $v'))); + + final settingsStream = settings.updateStream; + _subscriptions.add(settingsStream.where((event) => event.key == SettingKeys.videoHardwareAccelerationKey).listen((_) => _initController())); + _subscriptions.add(settingsStream.where((event) => event.key == SettingKeys.videoLoopModeKey).listen((_) => _applyLoop())); + + final path = entry.path; + if (path != null) { + final videoBasename = _pContext.basenameWithoutExtension(path); + // list subtitle files in the same directory + // some files may be visible to the app (e.g. SRT) while others may not (e.g. SUB, VTT) + _subscriptions.add(File(path).parent.list().where((v) => v is File && _isSubtitle(v.path)).listen((v) { + final subtitleBasename = _pContext.basename(v.path); + if (subtitleBasename.startsWith(videoBasename)) { + _externalSubtitleTracks.add(SubtitleTrack.uri( + v.uri.toString(), + title: 'File ${subtitleBasename.substring(videoBasename.length)}', + )); + _externalSubtitleTracks.sort((a, b) => a.title!.compareTo(b.title!)); + } + })); + } + } + + void _stopListening() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); + } + + Future<void> _applyLoop() async { + final loopEnabled = settings.videoLoopMode.shouldLoop(entry); + await _instance.setPlaylistMode(loopEnabled ? PlaylistMode.single : PlaylistMode.none); + } + + Future<void> _init({int startMillis = 0}) async { + final playing = _instance.state.playing; + + // Audio quality is better with `audiotrack` than `opensles` (the default). + // Calling `setAudioDevice` does not seem to work. + // As of 2025/01/13, directly setting audio output via property works for some files but not all, + // and switching from a supported file to an unsupported file crashes: + // cf https://github.com/media-kit/media-kit/issues/1061 + + await _applyLoop(); + await _instance.open(Media(entry.uri), play: playing); + await _instance.setSubtitleTrack(SubtitleTrack.no()); + if (startMillis > 0) { + await seekTo(startMillis); + } + + _fetchStreams(); + _statusStreamController.add(_instance.state.playing ? VideoStatus.playing : VideoStatus.paused); + } + + void _initController() { + _firstFrameRendered = false; + final hardwareAcceleration = settings.videoHardwareAcceleration; + String hwdec; + switch (settings.videoHardwareAcceleration) { + case VideoHardwareAcceleration.disabled: + hwdec = 'no'; + case VideoHardwareAcceleration.enabled: + hwdec = 'auto-safe'; + case VideoHardwareAcceleration.forced: + hwdec = 'mediacodec'; + } + _controllerNotifier.value = VideoController( + _instance, + configuration: VideoControllerConfiguration( + hwdec: hwdec, + enableHardwareAcceleration: hardwareAcceleration != VideoHardwareAcceleration.disabled, + ), + )..waitUntilFirstFrameRendered.then((v) { + _firstFrameRendered = true; + _statusStreamController.add(_status); + }); + } + + @override + void onVisualChanged() => _init(startMillis: currentPosition); + + @override + Future<void> play() async { + await untilReady; + await _instance.play(); + } + + @override + Future<void> pause() => _instance.pause(); + + @override + Future<void> seekTo(int targetMillis) async { + if (!isReady) { + await untilReady; + // When the player gets ready, it can play from the beginning right away, + // but trying to seek then just plays from the start. + // There is no state or hook identifying readiness to seek on start, + // and `PlayerConfiguration.ready` hook is useless. + await Future.delayed(const Duration(milliseconds: 500)); + } + targetMillis = abRepeatNotifier.value?.clamp(targetMillis) ?? targetMillis; + await _instance.seek(Duration(milliseconds: targetMillis)); + } + + @override + Future<void> skipFrames(int frameCount) async { + final platform = _instance.platform; + if (platform is NativePlayer) { + if (frameCount > 0) { + await platform.command(['frame-step']); + } else if (frameCount < 0) { + await platform.command(['frame-back-step']); + } + } else { + throw Exception('Platform player ${platform.runtimeType} does not support frame stepping'); + } + } + + @override + Listenable get playCompletedListenable => _completedNotifier; + + @override + VideoStatus get status => _status; + + @override + Stream<VideoStatus> get statusStream => _statusStreamController.stream; + + @override + Stream<double> get volumeStream => _instance.stream.volume; + + @override + Stream<double> get speedStream => _instance.stream.rate; + + @override + bool get isReady { + switch (_status) { + case VideoStatus.error: + case VideoStatus.idle: + case VideoStatus.initialized: + return false; + case VideoStatus.paused: + case VideoStatus.playing: + case VideoStatus.completed: + return _firstFrameRendered; + } + } + + @override + int get duration => _instance.state.duration.inMilliseconds; + + @override + int get currentPosition => _instance.state.position.inMilliseconds; + + @override + Stream<int> get positionStream => _instance.stream.position.map((pos) => pos.inMilliseconds); + + @override + Stream<String?> get timedTextStream => _timedTextStreamController.stream; + + @override + bool get isMuted => _instance.state.volume == 0; + + @override + Future<void> mute(bool muted) => _instance.setVolume(muted ? 0 : 100); + + @override + double get speed => _instance.state.rate; + + @override + set speed(double speed) => _instance.setRate(speed); + + @override + Future<Uint8List?> captureFrame() => _instance.screenshot(); + + @override + Widget buildPlayerWidget(BuildContext context) { + return ValueListenableBuilder<double?>( + valueListenable: sarNotifier, + builder: (context, sar, child) { + if (sar == null) return const SizedBox(); + + // derive DAR (Display Aspect Ratio) from SAR (Storage Aspect Ratio), if any + // e.g. 960x536 (~16:9) with SAR 4:3 should be displayed as ~2.39:1 + final dar = entry.displayAspectRatio * sar; + return ValueListenableBuilder<VideoController?>( + valueListenable: _controllerNotifier, + builder: (context, controller, child) { + if (controller == null) return const SizedBox(); + return Video( + controller: controller, + fill: Colors.transparent, + aspectRatio: dar, + controls: NoVideoControls, + wakelock: false, + subtitleViewConfiguration: const SubtitleViewConfiguration( + visible: false, + ), + ); + }); + }, + ); + } + + // streams (aka tracks) + + // `auto` and `no` are the first 2 tracks in the player state track lists + static const int fakeTrackCount = 2; + + Tracks get _tracks => _instance.state.tracks; + + List<VideoTrack> get _videoTracks => _tracks.video.skip(fakeTrackCount).toList(); + + List<AudioTrack> get _audioTracks => _tracks.audio.skip(fakeTrackCount).toList(); + + List<SubtitleTrack> get _subtitleTracks { + final externalTitles = _externalSubtitleTracks.map((v) => v.title).toSet(); + return [ + ..._tracks.subtitle.skip(fakeTrackCount).where((v) => !externalTitles.contains(v.title)), + ..._externalSubtitleTracks, + ]; + } + + @override + List<MediaStreamSummary> get streams { + return { + ..._videoTracks.mapIndexed((i, v) => v.toAves(i)), + ..._audioTracks.mapIndexed((i, v) => v.toAves(i)), + ..._subtitleTracks.mapIndexed((i, v) => v.toAves(i)), + }.toList(); + } + + Timer? _streamFetchTimer; + + void _stopStreamFetchTimer() { + _streamFetchTimer?.cancel(); + _streamFetchTimer = null; + } + + void _fetchStreams() { + _stopStreamFetchTimer(); + _streamFetchTimer = Timer.periodic(const Duration(milliseconds: 100), (_) { + if (status != VideoStatus.error) { + if (_videoTracks.isEmpty && _audioTracks.isEmpty) return; + + final videoStreamCount = _videoTracks.length; + final audioStreamCount = _audioTracks.length; + final textStreamCount = _subtitleTracks.length; + canSelectStreamNotifier.value = videoStreamCount > 1 || audioStreamCount > 1 || textStreamCount > 0; + } + _stopStreamFetchTimer(); + }); + } + + @override + Future<MediaStreamSummary?> getSelectedStream(MediaStreamType type) async { + final track = _instance.state.track; + switch (type) { + case MediaStreamType.video: + final video = track.video; + if (video != VideoTrack.no()) { + final index = video == VideoTrack.auto() ? 0 : _videoTracks.indexOf(video); + return video.toAves(index); + } + case MediaStreamType.audio: + final audio = track.audio; + if (audio != AudioTrack.no()) { + final index = audio == AudioTrack.auto() ? 0 : _audioTracks.indexOf(audio); + return audio.toAves(index); + } + case MediaStreamType.text: + final subtitle = track.subtitle; + if (subtitle != SubtitleTrack.no()) { + final index = subtitle == SubtitleTrack.auto() ? 0 : _subtitleTracks.indexOf(subtitle); + return subtitle.toAves(index); + } + } + return null; + } + + @override + Future<void> selectStream(MediaStreamType type, MediaStreamSummary? selected) async { + final current = await getSelectedStream(type); + if (current == selected) return; + + if (selected != null) { + final newIndex = selected.index; + if (newIndex != null) { + // select track + switch (type) { + case MediaStreamType.video: + await _instance.setVideoTrack(_videoTracks[selected.index ?? 0]); + break; + case MediaStreamType.audio: + await _instance.setAudioTrack(_audioTracks[selected.index ?? 0]); + break; + case MediaStreamType.text: + await _instance.setSubtitleTrack(_subtitleTracks[selected.index ?? 0]); + break; + } + } + } else if (current != null) { + // deselect track + switch (type) { + case MediaStreamType.video: + await _instance.setVideoTrack(VideoTrack.no()); + break; + case MediaStreamType.audio: + await _instance.setAudioTrack(AudioTrack.no()); + break; + case MediaStreamType.text: + await _instance.setSubtitleTrack(SubtitleTrack.no()); + break; + } + } + } + + static const Set<String> _subtitleExtensions = {'.srt', '.sub', '.vtt'}; + + static bool _isSubtitle(String path) => _subtitleExtensions.contains(_pContext.extension(path)); +} diff --git a/plugins/aves_video_mpv/lib/src/factory.dart b/plugins/aves_video_mpv/lib/src/factory.dart new file mode 100644 index 0000000..2fdbd74 --- /dev/null +++ b/plugins/aves_video_mpv/lib/src/factory.dart @@ -0,0 +1,21 @@ +import 'package:aves_model/aves_model.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:aves_video_mpv/aves_video_mpv.dart'; +import 'package:media_kit/media_kit.dart'; + +class MpvVideoControllerFactory extends AvesVideoControllerFactory { + @override + void init() => MediaKit.ensureInitialized(); + + @override + AvesVideoController buildController( + AvesEntryBase entry, { + required PlaybackStateHandler playbackStateHandler, + required VideoSettings settings, + }) => + MpvVideoController( + entry, + playbackStateHandler: playbackStateHandler, + settings: settings, + ); +} diff --git a/plugins/aves_video_mpv/lib/src/metadata.dart b/plugins/aves_video_mpv/lib/src/metadata.dart new file mode 100644 index 0000000..f488c08 --- /dev/null +++ b/plugins/aves_video_mpv/lib/src/metadata.dart @@ -0,0 +1,199 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:aves_model/aves_model.dart'; +import 'package:aves_video/aves_video.dart'; +import 'package:flutter/widgets.dart'; +import 'package:media_kit/media_kit.dart'; + +class MpvVideoMetadataFetcher extends AvesVideoMetadataFetcher { + static const mpvTypeAudio = 'audio'; + static const mpvTypeVideo = 'video'; + static const mpvTypeSub = 'sub'; + + static const probeTimeoutImage = 500; + static const probeTimeoutVideo = 5000; + + @override + void init() => MediaKit.ensureInitialized(); + + @override + Future<Map> getMetadata(AvesEntryBase entry) async { + final player = Player( + configuration: PlayerConfiguration( + logLevel: MPVLogLevel.warn, + protocolWhitelist: [ + ...const PlayerConfiguration().protocolWhitelist, + // Android `content` URIs are considered unsafe by default, + // as they are transferred via a custom `fd` protocol + 'fd', + ], + ), + ); + final platform = player.platform; + if (platform is! NativePlayer) { + throw Exception('Platform player ${platform.runtimeType} does not support property retrieval'); + } + + // We need to enable video decoding to retrieve video params, + // but it is disabled by default unless a `VideoController` is attached. + // Attaching a `VideoController` is problematic, because `player.open()` may not return + // unless a new frame is rendered, and triggering fails from a background service. + // It is simpler to enable the video track via properties. + await platform.setProperty('vid', 'auto'); + + // deselect audio track to prevent triggering Android audio sessions + await platform.setProperty('aid', 'no'); + + final videoDecodedCompleter = Completer(); + StreamSubscription? subscription; + subscription = player.stream.videoParams.listen((v) { + if (v.par != null) { + subscription?.cancel(); + videoDecodedCompleter.complete(); + } + }); + + await player.open(Media(entry.uri), play: false); + + final timeoutMillis = entry.mimeType.startsWith('image') ? probeTimeoutImage : probeTimeoutVideo; + await Future.any([videoDecodedCompleter.future, Future.delayed(Duration(milliseconds: timeoutMillis))]); + + final fields = <String, dynamic>{}; + + final videoParams = player.state.videoParams; + if (videoParams.par == null) { + debugPrint('failed to probe video metadata within $timeoutMillis ms for entry=$entry'); + } else { + // mpv properties: https://mpv.io/manual/stable/#property-list + + // mpv doc: "duration with milliseconds" + final durationMs = await platform.getProperty('duration/full'); + if (durationMs.isNotEmpty) { + fields[Keys.duration] = durationMs; + } + + // mpv doc: "metadata key/value pairs" + // note: seems to match FFprobe "format" > "tags" fields + final metadata = await platform.getProperty('metadata'); + if (metadata.isNotEmpty) { + try { + jsonDecode(metadata).forEach((key, value) { + fields[key] = value; + }); + } catch (error) { + debugPrint('failed to parse metadata=$metadata with error=$error'); + } + } + + final tracks = await platform.getProperty('track-list'); + if (tracks.isNotEmpty) { + try { + final tracksJson = jsonDecode(tracks); + if (tracksJson is List && tracksJson.isNotEmpty) { + fields[Keys.streams] = tracksJson.whereType<Map>().map((stream) { + return _normalizeStream(stream.cast<String, dynamic>(), videoParams); + }).toList(); + } + } catch (error) { + debugPrint('failed to parse tracks=$tracks with error=$error'); + } + } + + final chapters = await platform.getProperty('chapter-list'); + if (chapters.isNotEmpty) { + try { + final chaptersJson = jsonDecode(chapters); + if (chaptersJson is List && chaptersJson.isNotEmpty) { + final chapterMaps = chaptersJson.whereType<Map>().toList(); + if (chapterMaps.isNotEmpty) { + fields[Keys.chapters] = chapterMaps; + } + } + } catch (error) { + debugPrint('failed to parse chapters=$chapters with error=$error'); + } + } + } + + await player.dispose(); + return fields; + } + + Map<String, dynamic> _normalizeStream(Map<String, dynamic> stream, VideoParams videoParams) { + void replaceKey(String k1, String k2) { + final v = stream.remove(k1); + if (v != null) { + stream[k2] = v; + } + } + + void removeIfFalse(String k) { + if (stream[k] == false) { + stream.remove(k); + } + } + + stream.remove('id'); + stream.remove('decoder-desc'); + stream.remove('main-selection'); + stream.remove('selected'); + stream.remove('src-id'); + replaceKey('ff-index', Keys.index); + replaceKey('codec', Keys.codecName); + replaceKey('lang', Keys.language); + replaceKey('demux-bitrate', Keys.bitrate); + replaceKey('demux-channel-count', Keys.audioChannels); + replaceKey('demux-fps', Keys.fps); + replaceKey('demux-samplerate', Keys.sampleRate); + replaceKey('hearing-impaired', Keys.hearingImpaired); + replaceKey('visual-impaired', Keys.visualImpaired); + + stream.removeWhere((k, v) => k.startsWith('demux-')); + removeIfFalse('albumart'); + removeIfFalse('default'); + removeIfFalse('dependent'); + removeIfFalse('external'); + removeIfFalse('forced'); + removeIfFalse(Keys.hearingImpaired); + removeIfFalse(Keys.visualImpaired); + + final isImage = stream.remove('image'); + switch (stream.remove('type')) { + case mpvTypeAudio: + stream[Keys.streamType] = MediaStreamTypes.audio; + case mpvTypeVideo: + stream[Keys.streamType] = MediaStreamTypes.video; + if (isImage) { + stream.remove(Keys.fps); + } + + // Some video properties are not in the video track props but accessible via `video-params` (or `video-out-params`). + // These parameters are already stored in the player state, as `videoParams`. + // Parameters `sigPeak` and `averageBpp` are ignored. + final videoParamsTags = <String, dynamic>{ + Keys.alpha: videoParams.alpha, + Keys.chromaLocation: videoParams.chromaLocation, + Keys.codecPixelFormat: videoParams.pixelformat, + Keys.colorLevels: videoParams.colorlevels, + Keys.colorMatrix: videoParams.colormatrix, + Keys.colorPrimaries: videoParams.primaries, + Keys.dar: videoParams.aspect, + Keys.decoderHeight: videoParams.dh, + Keys.decoderWidth: videoParams.dw, + Keys.gamma: videoParams.gamma, + Keys.hwPixelFormat: videoParams.hwPixelformat, + Keys.light: videoParams.light, + Keys.par: videoParams.par, + Keys.rotate: videoParams.rotate, + Keys.stereo3dMode: videoParams.stereoIn, + Keys.videoHeight: videoParams.h, + Keys.videoWidth: videoParams.w, + }..removeWhere((k, v) => v == null); + stream.addAll(videoParamsTags); + case mpvTypeSub: + stream[Keys.streamType] = MediaStreamTypes.subtitle; + } + return stream; + } +} diff --git a/plugins/aves_video_mpv/lib/src/tracks.dart b/plugins/aves_video_mpv/lib/src/tracks.dart new file mode 100644 index 0000000..7deba54 --- /dev/null +++ b/plugins/aves_video_mpv/lib/src/tracks.dart @@ -0,0 +1,44 @@ +import 'package:aves_video/aves_video.dart'; +import 'package:media_kit/media_kit.dart'; + +extension ExtraVideoTrack on VideoTrack { + MediaStreamSummary toAves(int index) { + return MediaStreamSummary( + type: MediaStreamType.video, + index: index, + codecName: null, + language: language, + title: title, + width: null, + height: null, + ); + } +} + +extension ExtraAudioTrack on AudioTrack { + MediaStreamSummary toAves(int index) { + return MediaStreamSummary( + type: MediaStreamType.audio, + index: index, + codecName: null, + language: language, + title: title, + width: null, + height: null, + ); + } +} + +extension ExtraSubtitleTrack on SubtitleTrack { + MediaStreamSummary toAves(int index) { + return MediaStreamSummary( + type: MediaStreamType.text, + index: index, + codecName: null, + language: language, + title: title ?? '$index ($codec)', + width: null, + height: null, + ); + } +} diff --git a/plugins/aves_video_mpv/pubspec.yaml b/plugins/aves_video_mpv/pubspec.yaml new file mode 100644 index 0000000..5ea4b95 --- /dev/null +++ b/plugins/aves_video_mpv/pubspec.yaml @@ -0,0 +1,27 @@ +name: aves_video_mpv +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.9.0 <4.0.0" +resolution: workspace + +dependencies: + flutter: + sdk: flutter + aves_model: + path: ../aves_model + aves_video: + path: ../aves_video + aves_utils: + path: ../aves_utils + collection: + media_kit: + media_kit_libs_android_video: + media_kit_video: + path: + +dev_dependencies: + flutter_lints: + +flutter: diff --git a/plugins/google_cast/ARCHITETTURA_PLUGIN.md b/plugins/google_cast/ARCHITETTURA_PLUGIN.md new file mode 100644 index 0000000..3cc6e58 --- /dev/null +++ b/plugins/google_cast/ARCHITETTURA_PLUGIN.md @@ -0,0 +1,432 @@ +# Plugin `plugins/google_cast` – Come funziona + +Questo documento descrive **l’architettura** e il **flusso di funzionamento** del plugin `plugins/google_cast` del progetto, sulla base della struttura riportata e dei file analizzati durante il debug. + +--- + +## 1. Obiettivo del plugin + +Il plugin `google_cast` fa da ponte tra Flutter/Dart e il layer nativo Android per gestire: + +- **Google Cast standard** (Chromecast / Android TV con receiver standard) +- **Custom Receiver** (receiver web / CAF) +- il dialog nativo di selezione device +- comandi media (play, pause, seek, queue, volume, mute) +- eventi di ritorno verso Flutter (cast connesso, cast fermato, cambio item queue, errori, ecc.) + +In pratica: + +- **Flutter** decide *quando* connettersi e *quale media* mandare +- **il plugin Android** parla con le API Google Cast +- **il receiver** (standard o custom) riproduce davvero i contenuti sul TV/device Cast + +--- + +## 2. Struttura del plugin + +```text +plugins/google_cast +|-- android +| |-- build.gradle.kts +| |-- settings.gradle.kts +| `-- src/main/kotlin/com/aves/google_cast +| |-- CastActivityProvider.kt +| |-- CastOptionsProvider.kt +| |-- FlutterCastFrameworkPlugin.kt +| `-- cast +| |-- CastContextManager.kt +| |-- CastCustomReceiver.kt +| |-- CastDialogLauncher.kt +| |-- CastMediaClient.kt +| |-- CastQueueManager.kt +| `-- CastSessionHandler.kt +|-- lib +| `-- google_cast.dart +`-- pubspec.yaml +``` + +--- + +## 3. Ruolo dei file principali + +### `lib/google_cast.dart` +È l’entry point Dart del package/plugin. + +In molti plugin Flutter questo file fa una o più di queste cose: + +- espone API pubbliche al codice Dart +- definisce wrapper leggeri verso il `MethodChannel` +- centralizza eventuali modelli / helper lato Flutter + +Nel tuo progetto, il vero orchestratore lato app non è qui ma nei controller di app (`cast_controller.dart`, `google_cast_controller.dart`, `custom_cast_controller.dart`). + +--- + +### `android/src/main/kotlin/com/aves/google_cast/FlutterCastFrameworkPlugin.kt` +È il file **principale del plugin Flutter lato Android**. + +#### Responsabilità +- registra il `MethodChannel('google_cast')` +- riceve le chiamate da Flutter (`showCastDialog`, `loadQueue`, `play`, `pause`, `seekTo`, `getVolume`, ecc.) +- smista ogni metodo verso i componenti modulari del package `cast/` +- aggancia il plugin al ciclo di vita dell’`Activity` +- inizializza i componenti principali del Cast: + - `CastContextManager` + - `CastSessionHandler` + - `CastMediaClient` + - `CastQueueManager` + - `CastDialogLauncher` + - `CastCustomReceiver` + +È il **router centrale** del plugin. + +--- + +### `CastContextManager.kt` +Gestisce il **CastContext** e l’accesso alla sessione corrente. + +#### In pratica gestisce: +- l’`Activity` attuale +- l’inizializzazione di `CastContext` +- il recupero della sessione Cast attiva +- il recupero del `RemoteMediaClient` + +#### Metodi tipici/attesi +- `attachActivity(activity)` +- `detachActivity()` +- `ensureCastContext()` +- `getSession()` +- `getClient()` + +È il punto base da cui gli altri oggetti ottengono la sessione Cast corrente e il media client corrente. + +--- + +### `CastSessionHandler.kt` +Gestisce gli **eventi di sessione Cast**. + +#### Di solito si occupa di: +- `onSessionStarting` +- `onSessionStarted` +- `onSessionResumed` +- `onSessionEnded` +- invio eventi verso Flutter, ad esempio: + - `onCastReady` + - `onCastStopped` + +Nel tuo flusso attuale, `onCastReady` viene usato per segnalare una **sessione connessa**, ma **non necessariamente** un media già caricato. + +--- + +### `CastDialogLauncher.kt` +Si occupa di aprire il dialog nativo di scelta dispositivo Cast. + +#### Tipicamente fa: +- crea/configura un `MediaRouteButton` +- invoca il bottone o mostra il picker Cast +- consente all’utente di scegliere il device + +Quando Flutter chiama `showCastDialog`, il plugin passa il comando a `CastDialogLauncher`, che mostra il picker dispositivo. + +--- + +### `CastMediaClient.kt` +Gestisce i **comandi media** e il **callback del `RemoteMediaClient`**. + +#### Responsabilità principali +- `play()` +- `pause()` +- `seek(position)` +- `getMediaStatus()` +- `getVolume()` +- `setVolume(v)` +- `setMute(m)` +- registrazione del callback sul `RemoteMediaClient` + +#### Perché è cruciale +Fa due cose fondamentali: + +1. **Comandi verso Google Cast** + - play / pause + - seek + - volume / mute + +2. **Eventi da Google Cast verso Flutter** + - `onQueueIndexChanged` + - `onVideoFinished` + - `onCastError` + +È fondamentale per slideshow e sincronizzazione UI. + +--- + +### `CastQueueManager.kt` +Gestisce la **queue dei media** Cast. + +#### Responsabilità tipiche +- `loadQueue(items, startIndex)` +- `next()` +- `prev()` +- costruzione di `MediaQueueItem` +- associazione metadati per item (titolo, mimeType, flags foto/video, customData) + +È il file che determina come una lista Flutter di media diventa una vera queue Google Cast. + +--- + +### `CastCustomReceiver.kt` +Gestisce il **Custom Receiver CAF / Web Receiver**. + +#### Responsabilità +- avvio del receiver custom con `receiverUrl` +- invio messaggi JSON al receiver web +- ricezione/gestione del namespace custom (se implementato) + +Nel tuo progetto, Flutter costruisce un URL tipo: + +```text +https://.../cast_receiver/receiver.html?ws=... +``` + +e poi chiama `startCustomReceiver`. + +--- + +### `CastActivityProvider.kt` +Aiuta a dare accesso all’`Activity` giusta o a integrare il plugin con l’host Android. + +--- + +### `CastOptionsProvider.kt` +È il provider di configurazione Google Cast lato Android. + +#### Tipicamente definisce: +- receiver application ID di default +- eventuali opzioni del framework Cast + +--- + +## 4. Flusso end-to-end: Google Cast standard + +### A. Connessione del device +1. Flutter preme l’icona Cast +2. chiama `showCastDialog` +3. `FlutterCastFrameworkPlugin.kt` inoltra a `CastDialogLauncher.kt` +4. l’utente sceglie il device +5. `CastSessionHandler.kt` riceve `onSessionStarted` +6. il plugin manda a Flutter `onCastReady` + +### B. Caricamento media +Quando l’utente preme: +- cast manuale +- fullscreen cast +- slideshow + +Flutter costruisce una queue e chiama `loadQueue`. + +Il plugin passa il tutto a `CastQueueManager.loadQueue(...)`, che crea i `MediaQueueItem` e li carica nel `RemoteMediaClient`. + +### C. Controlli playback +Dai controller Flutter partono metodi come: +- `playCast()` +- `pauseCast()` +- `seekCast()` +- `nextManual()` +- `prevManual()` +- `setCastVolume()` +- `toggleMuteCast()` + +Questi passano dal `MethodChannel`, arrivano a `FlutterCastFrameworkPlugin.kt` e poi vengono gestiti da: +- `CastMediaClient.kt` +- `CastQueueManager.kt` + +### D. Eventi di ritorno verso Flutter +Dal native tornano eventi come: +- `onCastReady` +- `onCastStopped` +- `onQueueIndexChanged` +- `onVideoFinished` +- `onCastError` + +Questi aggiornano in Flutter: +- icona Cast +- indice corrente +- stato play/pause +- posizione/durata +- slideshow timer foto/video + +--- + +## 5. Flusso end-to-end: Custom Receiver + +### A. Connessione/sessione +Flutter chiama: +- `showCastDialog` +- `startCustomReceiver(appId, receiverUrl)` + +Il plugin passa a `CastCustomReceiver.kt`, che avvia il receiver web. + +### B. Caricamento media +Flutter non usa `loadQueue` standard, ma manda messaggi custom JSON al receiver, ad esempio: +- `LOAD_QUEUE` +- `PLAY` +- `PAUSE` +- `SEEK` +- `NEXT` +- `PREV` +- `SET_VOLUME` +- `SET_MUTE` +- `GET_VOLUME` +- `GET_MEDIA_STATUS` + +### C. Eventi verso Flutter +Il receiver web risponde con messaggi come: +- `MEDIA_STATUS` +- `VOLUME_STATUS` +- `CAST_READY` +- `CAST_STOPPED` + +che il `CustomCastController` usa per aggiornare la UI Flutter. + +--- + +## 6. Differenza tra Google Cast standard e Custom + +### Google Cast standard +- il volume è nativo via `CastSession` +- la queue è gestita dal framework Cast +- il passaggio video → next è naturale se la queue è corretta +- `RemoteMediaClient.Callback` è fondamentale + +### Custom Receiver +- il volume ha senso **solo se il receiver web lo implementa davvero** +- le foto/video vengono gestiti dalla tua logica JS/CAF +- gli eventi stato/volume dipendono dal receiver +- è più flessibile ma più facile da rompere + +--- + +## 7. Punto delicato emerso nel debug + +Durante il refactor si è visto che una distinzione è fondamentale: + +## **Connettere il device != aver già caricato un media** + +Quindi il comportamento corretto è: +- `onCastReady` = sessione pronta +- **NO polling immediato** se la queue è ancora vuota +- il polling deve partire solo dopo `loadQueue` + +Altrimenti il plugin rischia di generare: +- `Invalid Request` +- `MediaQueue error` +- `IDLE_REASON_ERROR` + +--- + +## 8. Responsabilità lato Flutter (fuori dal plugin ma essenziali) + +Anche se non sono dentro `plugins/google_cast`, lato app ci sono controller importanti: + +- `cast_controller.dart` → controller unificato backend +- `google_cast_controller.dart` → orchestrazione Google standard +- `custom_cast_controller.dart` → orchestrazione custom receiver + +Questi file decidono: +- quando aprire il dialog Cast +- quando connettere il device +- quando mandare davvero una queue +- quando mostrare controlli / slideshow / fullscreen viewer + +Il plugin Android da solo non basta: è il layer Dart che decide il flusso UX. + +--- + +## 9. Mappa rapida responsabilità + +### Flutter / UI +- pulsante Cast +- selection mode +- slideshow/manual/fullscreen +- bottom sheet controlli + +### `cast_controller.dart` +- facade unificata Google / Custom / DLNA + +### `google_cast_controller.dart` +- queue standard Cast +- slideshow foto/video lato Flutter +- polling media/volume + +### `custom_cast_controller.dart` +- invio messaggi JSON al receiver custom +- stato custom receiver + +### `FlutterCastFrameworkPlugin.kt` +- router MethodChannel lato Android + +### `CastContextManager.kt` +- CastContext + session + media client + +### `CastSessionHandler.kt` +- session lifecycle → eventi verso Flutter + +### `CastQueueManager.kt` +- queue standard Google Cast + +### `CastMediaClient.kt` +- play/pause/seek/volume + callback eventi media + +### `CastCustomReceiver.kt` +- custom receiver CAF/web + +### `CastDialogLauncher.kt` +- dialog selezione device + +--- + +## 10. Se devi debuggare il plugin in futuro + +Ordine consigliato per capire dove si rompe qualcosa: + +### Se non si connette il device +- `FlutterCastFrameworkPlugin.kt` +- `CastDialogLauncher.kt` +- `CastSessionHandler.kt` +- `CastContextManager.kt` + +### Se si connette ma non parte il media +- `CastQueueManager.kt` +- `CastMediaClient.kt` +- `google_cast_controller.dart` + +### Se slideshow si ferma o salta male foto/video +- `google_cast_controller.dart` +- `CastMediaClient.kt` (callback `onQueueIndexChanged`) +- eventualmente `CastQueueManager.kt` + +### Se il Custom receiver ha problemi UI / progress / volume +- `CastCustomReceiver.kt` +- receiver web (`receiver.html`, JS) +- `custom_cast_controller.dart` + +### Se il volume non si aggiorna +- `CastMediaClient.kt` +- `google_cast_controller.dart` +- widget controlli Flutter (`cast_controls_sheet.dart`, fullscreen viewer) + +--- + +## 11. Conclusione + +Il plugin `google_cast` del progetto è organizzato in modo modulare e separa bene le responsabilità: + +- il file principale `FlutterCastFrameworkPlugin.kt` riceve i comandi Flutter +- il package `cast/` contiene i moduli Android specializzati +- i controller Flutter coordinano UX, queue e sincronizzazione stato + +Il punto più delicato dell’architettura è la distinzione tra: +- **sessione Cast connessa** +- **media realmente caricato sulla queue** + +Capire bene questa differenza evita gran parte dei bug visti in debug. diff --git a/plugins/google_cast/android/build.gradle.kts b/plugins/google_cast/android/build.gradle.kts new file mode 100644 index 0000000..7aac39f --- /dev/null +++ b/plugins/google_cast/android/build.gradle.kts @@ -0,0 +1,28 @@ +plugins { + id("com.android.library") + id("kotlin-android") +} + +android { + namespace = "com.aves.google_cast" + compileSdk = 34 + + kotlin { + jvmToolchain(17) + } + + sourceSets { + getByName("main") { + java.srcDirs("src/main/kotlin") + } + } + + defaultConfig { + minSdk = 21 + } +} + +dependencies { + implementation("com.google.android.gms:play-services-cast-framework:21.4.0") + implementation("androidx.mediarouter:mediarouter:1.6.0") +} diff --git a/plugins/google_cast/android/gradle/wrapper/gradle-wrapper.properties b/plugins/google_cast/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..12a959c --- /dev/null +++ b/plugins/google_cast/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-all.zip \ No newline at end of file diff --git a/plugins/google_cast/android/settings.gradle.kts b/plugins/google_cast/android/settings.gradle.kts new file mode 100644 index 0000000..9bfab1f --- /dev/null +++ b/plugins/google_cast/android/settings.gradle.kts @@ -0,0 +1 @@ +// Required for Flutter plugin registration diff --git a/plugins/google_cast/android/src/main/AndroidManifest.xml b/plugins/google_cast/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..109e198 --- /dev/null +++ b/plugins/google_cast/android/src/main/AndroidManifest.xml @@ -0,0 +1,10 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.aves.google_cast"> + + <application> + <meta-data + android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME" + android:value="com.aves.google_cast.CastOptionsProvider" /> + </application> + +</manifest> diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/CastActivityProvider.kt b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/CastActivityProvider.kt new file mode 100644 index 0000000..d650574 --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/CastActivityProvider.kt @@ -0,0 +1,33 @@ +package com.aves.google_cast + + +import android.app.Activity +import android.app.Application +import android.os.Bundle + +/** + * Fornisce sempre l'Activity corrente. + * Necessario per Cast dialog. + */ +object CastActivityProvider : Application.ActivityLifecycleCallbacks { + + var currentActivity: Activity? = null + private set + + override fun onActivityResumed(activity: Activity) { + currentActivity = activity + } + + override fun onActivityPaused(activity: Activity) {} + override fun onActivityStarted(activity: Activity) {} + override fun onActivityDestroyed(activity: Activity) { + if (currentActivity === activity) { + currentActivity = null + } + } + + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} + override fun onActivityStopped(activity: Activity) {} + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {} +} + diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/CastOptionsProvider.kt b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/CastOptionsProvider.kt new file mode 100644 index 0000000..22af7bd --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/CastOptionsProvider.kt @@ -0,0 +1,29 @@ +package com.aves.google_cast + +import android.content.Context +import com.google.android.gms.cast.framework.CastOptions +import com.google.android.gms.cast.framework.OptionsProvider +import com.google.android.gms.cast.framework.SessionProvider +import com.google.android.gms.cast.framework.media.CastMediaOptions +import com.google.android.gms.cast.framework.media.NotificationOptions + +class CastOptionsProvider : OptionsProvider { + override fun getCastOptions(context: Context): CastOptions { + val notificationOptions = NotificationOptions.Builder() + .build() + + val mediaOptions = CastMediaOptions.Builder() + .setNotificationOptions(notificationOptions) + .setMediaSessionEnabled(true) + .build() + + return CastOptions.Builder() + .setReceiverApplicationId("CC1AD845") + .setCastMediaOptions(mediaOptions) + .build() + } + + override fun getAdditionalSessionProviders(context: Context): List<SessionProvider>? { + return null + } +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/FlutterCastFrameworkPlugin.kt b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/FlutterCastFrameworkPlugin.kt new file mode 100644 index 0000000..b211858 --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/FlutterCastFrameworkPlugin.kt @@ -0,0 +1,287 @@ +package com.aves.google_cast + +import android.app.Activity +import android.app.Application +import android.content.Context +import android.os.Bundle +import androidx.annotation.NonNull +import com.aves.google_cast.cast.* +import com.aves.google_cast.fast.FastCastEngine +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.embedding.engine.plugins.activity.ActivityAware +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +class FlutterCastFrameworkPlugin : FlutterPlugin, + MethodChannel.MethodCallHandler, + Application.ActivityLifecycleCallbacks, + ActivityAware { + + companion object { + @JvmStatic + var enabled: Boolean = true + } + + private lateinit var appContext: Context + private lateinit var channel: MethodChannel + private var currentActivity: Activity? = null + + private lateinit var contextManager: CastContextManager + private lateinit var sessionHandler: CastSessionHandler + private lateinit var mediaClient: CastMediaClient + private lateinit var queueManager: CastQueueManager + private lateinit var dialogLauncher: CastDialogLauncher + private lateinit var customReceiver: CastCustomReceiver + + // ⭐ FAST basato su Google Cast (CAF) + private lateinit var fastEngine: FastCastEngine + + override fun onAttachedToEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) { + appContext = binding.applicationContext + + channel = MethodChannel(binding.binaryMessenger, "google_cast") + channel.setMethodCallHandler(this) + + sessionHandler = CastSessionHandler(channel) + contextManager = CastContextManager(appContext, sessionHandler) + mediaClient = CastMediaClient(contextManager, channel) + sessionHandler.setMediaClient(mediaClient) + queueManager = CastQueueManager(contextManager, channel) + dialogLauncher = CastDialogLauncher(channel) + customReceiver = CastCustomReceiver(contextManager, channel) + + fastEngine = FastCastEngine(contextManager, mediaClient, channel) + + if (appContext is Application) { + (appContext as Application).registerActivityLifecycleCallbacks(this) + } + } + + override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + channel.setMethodCallHandler(null) + + if (appContext is Application) { + (appContext as Application).unregisterActivityLifecycleCallbacks(this) + } + } + + // ActivityAware + override fun onAttachedToActivity(binding: ActivityPluginBinding) { + currentActivity = binding.activity + if (!enabled) return + + contextManager.attachActivity(binding.activity) + contextManager.ensureCastContext() + mediaClient.attachCurrentClientIfNeeded() + } + + override fun onDetachedFromActivity() { + currentActivity = null + if (!enabled) return + contextManager.detachActivity() + } + + override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { + currentActivity = binding.activity + if (!enabled) return + + contextManager.attachActivity(binding.activity) + contextManager.ensureCastContext() + mediaClient.attachCurrentClientIfNeeded() + } + + override fun onDetachedFromActivityForConfigChanges() { + currentActivity = null + if (!enabled) return + contextManager.detachActivity() + } + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + + // ------------------------------------------------------------ + // ⭐ FAST (Google Cast / CAF) + // ------------------------------------------------------------ + when (call.method) { + "fast.loadQueue" -> { + fastEngine.loadQueue(call.arguments as Map<*, *>) + result.success(null) + return + } + "fast.next" -> { + fastEngine.next() + result.success(null) + return + } + "fast.prev" -> { + fastEngine.prev() + result.success(null) + return + } + "fast.stop" -> { + fastEngine.stop() + result.success(null) + return + } + } + + // ------------------------------------------------------------ + // Abilitazione/disabilitazione Google Cast + // ------------------------------------------------------------ + if (call.method == "setEnabled") { + val newValue = call.argument<Boolean>("value") ?: true + enabled = newValue + + if (!enabled) { + try { + mediaClient.resetClientTracking() + contextManager.ensureCastContext() + ?.sessionManager + ?.endCurrentSession(true) + } catch (_: Exception) { + } + } else { + currentActivity?.let { + contextManager.attachActivity(it) + contextManager.ensureCastContext() + mediaClient.attachCurrentClientIfNeeded() + } + } + + result.success(null) + return + } + + if (!enabled) { + result.error("DISABLED", "Google Cast backend disabled", null) + return + } + + // ------------------------------------------------------------ + // Google Cast standard + // ------------------------------------------------------------ + when (call.method) { + + "showCastDialog" -> { + currentActivity?.let { + contextManager.ensureCastContext() + mediaClient.attachCurrentClientIfNeeded() + dialogLauncher.showCastDialog(it) + } + result.success(null) + } + + "startCustomReceiver" -> { + val appId = call.argument<String>("appId") + val url = call.argument<String>("receiverUrl") + + if (appId == null || url == null) { + result.error("ARG_ERROR", "appId and receiverUrl required", null) + } else { + contextManager.ensureCastContext() + mediaClient.attachCurrentClientIfNeeded() + customReceiver.startCustomReceiver(appId, url) + result.success(null) + } + } + + "sendCustomMessage" -> { + val message = call.argument<String>("message") + if (message != null) { + customReceiver.sendCustomMessage(message) + } + result.success(null) + } + + "loadQueue" -> { + val items = call.argument<List<Map<String, Any>>>("items") + val startIndex = call.argument<Int>("startIndex") ?: 0 + + if (items == null) { + result.error("ARG_ERROR", "items required", null) + } else { + contextManager.ensureCastContext() + mediaClient.attachCurrentClientIfNeeded() + queueManager.loadQueue(items, startIndex) + result.success(null) + } + } + + "next" -> { + mediaClient.attachCurrentClientIfNeeded() + queueManager.next() + result.success(null) + } + + "prev" -> { + mediaClient.attachCurrentClientIfNeeded() + queueManager.prev() + result.success(null) + } + + "play" -> { + mediaClient.play() + result.success(null) + } + + "pause" -> { + mediaClient.pause() + result.success(null) + } + + "seekTo" -> { + val pos = call.argument<Number>("position")?.toLong() ?: 0L + mediaClient.seek(pos) + result.success(null) + } + + "setVolume" -> { + val v = call.argument<Double>("volume") ?: 0.0 + mediaClient.setVolume(v) + result.success(null) + } + + "setMute" -> { + val m = call.argument<Boolean>("mute") ?: false + mediaClient.setMute(m) + result.success(null) + } + + "stopCast" -> { + try { + mediaClient.resetClientTracking() + contextManager.ensureCastContext() + ?.sessionManager + ?.endCurrentSession(true) + } catch (_: Exception) { + } + result.success(null) + } + + else -> result.notImplemented() + } + } + + // Activity lifecycle + override fun onActivityResumed(activity: Activity) { + currentActivity = activity + if (!enabled) return + + contextManager.attachActivity(activity) + contextManager.ensureCastContext() + mediaClient.attachCurrentClientIfNeeded() + } + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { + currentActivity = activity + } + + override fun onActivityStarted(activity: Activity) { + currentActivity = activity + } + + override fun onActivityPaused(activity: Activity) {} + override fun onActivityStopped(activity: Activity) {} + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} + override fun onActivityDestroyed(activity: Activity) {} +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/FlutterCastFrameworkPlugin.kt.old b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/FlutterCastFrameworkPlugin.kt.old new file mode 100644 index 0000000..df110be --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/FlutterCastFrameworkPlugin.kt.old @@ -0,0 +1,254 @@ +package com.aves.google_cast + +import android.app.Activity +import android.app.Application +import android.content.Context +import android.os.Bundle +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.embedding.engine.plugins.activity.ActivityAware +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import com.aves.google_cast.cast.* + +class FlutterCastFrameworkPlugin : + FlutterPlugin, + MethodChannel.MethodCallHandler, + Application.ActivityLifecycleCallbacks, + ActivityAware { + + companion object { + // ⭐ FLAG DI ABILITAZIONE BACKEND GOOGLE CAST + @JvmStatic + var enabled: Boolean = true + } + + private lateinit var appContext: Context + private lateinit var channel: MethodChannel + private var currentActivity: Activity? = null + + private lateinit var contextManager: CastContextManager + private lateinit var sessionHandler: CastSessionHandler + private lateinit var mediaClient: CastMediaClient + private lateinit var queueManager: CastQueueManager + private lateinit var dialogLauncher: CastDialogLauncher + private lateinit var customReceiver: CastCustomReceiver + + override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { + appContext = binding.applicationContext + + channel = MethodChannel(binding.binaryMessenger, "google_cast") + channel.setMethodCallHandler(this) + + sessionHandler = CastSessionHandler(channel) + contextManager = CastContextManager(appContext, sessionHandler) + mediaClient = CastMediaClient(contextManager, channel) + queueManager = CastQueueManager(contextManager, channel) + dialogLauncher = CastDialogLauncher(channel) + customReceiver = CastCustomReceiver(contextManager, channel) + + if (appContext is Application) { + (appContext as Application).registerActivityLifecycleCallbacks(this) + } + } + + override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + channel.setMethodCallHandler(null) + + if (appContext is Application) { + (appContext as Application).unregisterActivityLifecycleCallbacks(this) + } + } + + // ActivityAware + override fun onAttachedToActivity(binding: ActivityPluginBinding) { + currentActivity = binding.activity + if (!enabled) return + + contextManager.attachActivity(binding.activity) + contextManager.ensureCastContext() + mediaClient.attachCurrentClientIfNeeded() + } + + override fun onDetachedFromActivity() { + currentActivity = null + if (!enabled) return + contextManager.detachActivity() + } + + override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { + currentActivity = binding.activity + if (!enabled) return + + contextManager.attachActivity(binding.activity) + contextManager.ensureCastContext() + mediaClient.attachCurrentClientIfNeeded() + } + + override fun onDetachedFromActivityForConfigChanges() { + currentActivity = null + if (!enabled) return + contextManager.detachActivity() + } + + // ⭐ ROUTER METHODCHANNEL + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + + // ⭐ PATCH: abilita/disabilita plugin da Dart + if (call.method == "setEnabled") { + val newValue = call.argument<Boolean>("value") ?: true + enabled = newValue + + if (!enabled) { + // quando disabilito, chiudo sessione e resetto il tracking + try { + mediaClient.resetClientTracking() + contextManager.ensureCastContext() + ?.sessionManager + ?.endCurrentSession(true) + } catch (_: Exception) { + } + } else { + // quando riabilito, preparo il contesto se ho già un'activity + currentActivity?.let { + contextManager.attachActivity(it) + contextManager.ensureCastContext() + mediaClient.attachCurrentClientIfNeeded() + } + } + + result.success(null) + return + } + + // ⭐ PATCH: blocca tutto se disabilitato + if (!enabled) { + result.error("DISABLED", "Google Cast backend disabled", null) + return + } + + when (call.method) { + + "showCastDialog" -> { + currentActivity?.let { + contextManager.ensureCastContext() + mediaClient.attachCurrentClientIfNeeded() + dialogLauncher.showCastDialog(it) + } + result.success(null) + } + + "startCustomReceiver" -> { + val appId = call.argument<String>("appId") + val url = call.argument<String>("receiverUrl") + + if (appId == null || url == null) { + result.error("ARG_ERROR", "appId and receiverUrl required", null) + } else { + contextManager.ensureCastContext() + mediaClient.attachCurrentClientIfNeeded() + customReceiver.startCustomReceiver(appId, url) + result.success(null) + } + } + + "sendCustomMessage" -> { + val message = call.argument<String>("message") + if (message != null) { + customReceiver.sendCustomMessage(message) + } + result.success(null) + } + + "loadQueue" -> { + val items = call.argument<List<Map<String, Any>>>("items") + val startIndex = call.argument<Int>("startIndex") ?: 0 + + if (items == null) { + result.error("ARG_ERROR", "items required", null) + } else { + contextManager.ensureCastContext() + mediaClient.attachCurrentClientIfNeeded() + queueManager.loadQueue(items, startIndex) + result.success(null) + } + } + + "next" -> { + mediaClient.attachCurrentClientIfNeeded() + queueManager.next() + result.success(null) + } + + "prev" -> { + mediaClient.attachCurrentClientIfNeeded() + queueManager.prev() + result.success(null) + } + + "play" -> { + mediaClient.play() + result.success(null) + } + + "pause" -> { + mediaClient.pause() + result.success(null) + } + + "seekTo" -> { + val pos = call.argument<Number>("position")?.toLong() ?: 0L + mediaClient.seek(pos) + result.success(null) + } + + "setVolume" -> { + val v = call.argument<Double>("volume") ?: 0.0 + mediaClient.setVolume(v) + result.success(null) + } + + "setMute" -> { + val m = call.argument<Boolean>("mute") ?: false + mediaClient.setMute(m) + result.success(null) + } + + "stopCast" -> { + try { + mediaClient.resetClientTracking() + contextManager.ensureCastContext() + ?.sessionManager + ?.endCurrentSession(true) + } catch (_: Exception) { + } + result.success(null) + } + + else -> result.notImplemented() + } + } + + // Activity lifecycle + override fun onActivityResumed(activity: Activity) { + currentActivity = activity + if (!enabled) return + + contextManager.attachActivity(activity) + contextManager.ensureCastContext() + mediaClient.attachCurrentClientIfNeeded() + } + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { + currentActivity = activity + } + + override fun onActivityStarted(activity: Activity) { + currentActivity = activity + } + + override fun onActivityPaused(activity: Activity) {} + override fun onActivityStopped(activity: Activity) {} + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} + override fun onActivityDestroyed(activity: Activity) {} +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastContextManager.kt b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastContextManager.kt new file mode 100644 index 0000000..8039fb1 --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastContextManager.kt @@ -0,0 +1,57 @@ +package com.aves.google_cast.cast + +import android.app.Activity +import android.content.Context +import com.google.android.gms.cast.framework.CastContext +import com.google.android.gms.cast.framework.CastSession +import com.google.android.gms.cast.framework.SessionManagerListener +import com.google.android.gms.cast.framework.media.RemoteMediaClient + +class CastContextManager( + private val context: Context, + private val sessionListener: SessionManagerListener<CastSession> +) { + private var castContext: CastContext? = null + private var currentActivity: Activity? = null + private var sessionListenerAdded = false + + fun attachActivity(activity: Activity) { + currentActivity = activity + ensureCastContext() + } + + fun detachActivity() { + currentActivity = null + } + + fun getSession(): CastSession? { + ensureCastContext() + return castContext?.sessionManager?.currentCastSession + } + + fun getClient(): RemoteMediaClient? { + return getSession()?.remoteMediaClient + } + + fun ensureCastContext(): CastContext? { + val activity = currentActivity ?: return null + + try { + if (castContext == null) { + castContext = CastContext.getSharedInstance(activity) + } + + if (!sessionListenerAdded) { + castContext!!.sessionManager.addSessionManagerListener( + sessionListener, + CastSession::class.java + ) + sessionListenerAdded = true + } + } catch (_: Exception) { + return null + } + + return castContext + } +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastContextManager.kt.ok b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastContextManager.kt.ok new file mode 100644 index 0000000..4d4359c --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastContextManager.kt.ok @@ -0,0 +1,52 @@ +package com.aves.google_cast.cast + +import android.app.Activity +import android.content.Context +import com.google.android.gms.cast.framework.CastContext +import com.google.android.gms.cast.framework.CastSession +import com.google.android.gms.cast.framework.SessionManagerListener +import com.google.android.gms.cast.framework.media.RemoteMediaClient + +class CastContextManager( + private val context: Context, + private val sessionListener: SessionManagerListener<CastSession> +) { + private var castContext: CastContext? = null + private var currentActivity: Activity? = null + + fun attachActivity(activity: Activity) { + currentActivity = activity + ensureCastContext() + } + + fun detachActivity() { + currentActivity = null + } + + fun getSession(): CastSession? { + ensureCastContext() + return castContext?.sessionManager?.currentCastSession + } + + fun getClient(): RemoteMediaClient? { + return getSession()?.remoteMediaClient + } + + fun ensureCastContext(): CastContext? { + val activity = currentActivity ?: return null + + if (castContext == null) { + try { + castContext = CastContext.getSharedInstance(activity) + castContext!!.sessionManager.addSessionManagerListener( + sessionListener, + CastSession::class.java + ) + } catch (_: Exception) { + return null + } + } + + return castContext + } +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastCustomReceiver.kt b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastCustomReceiver.kt new file mode 100644 index 0000000..19499d3 --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastCustomReceiver.kt @@ -0,0 +1,62 @@ +package com.aves.google_cast.cast + +import com.google.android.gms.cast.MediaInfo +import com.google.android.gms.cast.MediaMetadata +import io.flutter.plugin.common.MethodChannel + +class CastCustomReceiver( + private val ctx: CastContextManager, + private val channel: MethodChannel, +) { + + // ------------------------------------------------------------ + // AVVIO CUSTOM RECEIVER (CAF Web Receiver) + // ------------------------------------------------------------ + fun startCustomReceiver(appId: String, receiverUrl: String) { + val session = ctx.getSession() ?: return + + try { + val metadata = MediaMetadata(MediaMetadata.MEDIA_TYPE_GENERIC) + val mediaInfo = MediaInfo.Builder(receiverUrl) + .setContentType("text/html") + .setStreamType(MediaInfo.STREAM_TYPE_NONE) + .setMetadata(metadata) + .build() + + session.remoteMediaClient?.load(mediaInfo, true) + } catch (e: Exception) { + channel.invokeMethod( + "onCastError", + mapOf("message" to "Failed to start custom receiver: ${e.message}") + ) + } + } + + // ------------------------------------------------------------ + // INVIO MESSAGGI CUSTOM (compatibile con nuova Cast SDK) + // ------------------------------------------------------------ + fun sendCustomMessage(message: String) { + val session = ctx.getSession() ?: return + + try { + val client = session.remoteMediaClient ?: return + + // TRUCCO: inviamo JSON come data URL + val dataUrl = "data:application/json,$message" + + val mediaInfo = MediaInfo.Builder(dataUrl) + .setContentType("application/json") + .setStreamType(MediaInfo.STREAM_TYPE_NONE) + .build() + + // load() = invio messaggio al Web Receiver + client.load(mediaInfo, false) + + } catch (e: Exception) { + channel.invokeMethod( + "onCastError", + mapOf("message" to "sendCustomMessage exception: ${e.message}") + ) + } + } +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastCustomReceiver.kt.ok b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastCustomReceiver.kt.ok new file mode 100644 index 0000000..8c0779c --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastCustomReceiver.kt.ok @@ -0,0 +1,61 @@ +package com.aves.google_cast.cast + +import com.google.android.gms.cast.MediaInfo +import com.google.android.gms.cast.MediaMetadata +import io.flutter.plugin.common.MethodChannel + +class CastCustomReceiver( + private val ctx: CastContextManager, + private val channel: MethodChannel, +) { + + // ------------------------------------------------------------ + // AVVIO CUSTOM RECEIVER (CAF Web Receiver) + // ------------------------------------------------------------ + fun startCustomReceiver(appId: String, receiverUrl: String) { + val session = ctx.getSession() ?: return + + try { + val metadata = MediaMetadata(MediaMetadata.MEDIA_TYPE_GENERIC) + val mediaInfo = MediaInfo.Builder(receiverUrl) + .setContentType("text/html") + .setStreamType(MediaInfo.STREAM_TYPE_NONE) + .setMetadata(metadata) + .build() + + session.remoteMediaClient?.load(mediaInfo, true) + } catch (e: Exception) { + channel.invokeMethod( + "onCastError", + mapOf("message" to "Failed to start custom receiver: ${e.message}") + ) + } + } + + // ------------------------------------------------------------ + // ⭐ INVIO MESSAGGI CUSTOM (nuova SDK) + // ------------------------------------------------------------ + fun sendCustomMessage(namespace: String, message: String) { + val session = ctx.getSession() ?: return + + try { + val client = session.remoteMediaClient ?: return + + client.sendCustomData(namespace, message) + .addOnCompleteListener { task -> + if (!task.isSuccessful) { + channel.invokeMethod( + "onCastError", + mapOf("message" to "sendCustomMessage failed") + ) + } + } + + } catch (e: Exception) { + channel.invokeMethod( + "onCastError", + mapOf("message" to "sendCustomMessage exception: ${e.message}") + ) + } + } +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastDialogLauncher.kt b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastDialogLauncher.kt new file mode 100644 index 0000000..183bc84 --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastDialogLauncher.kt @@ -0,0 +1,31 @@ +package com.aves.google_cast.cast + +import android.app.Activity +import android.view.ViewGroup +import androidx.mediarouter.app.MediaRouteButton +import com.google.android.gms.cast.framework.CastButtonFactory +import io.flutter.plugin.common.MethodChannel + +class CastDialogLauncher( + private val channel: MethodChannel +) { + + fun showCastDialog(activity: Activity) { + activity.runOnUiThread { + try { + val button = MediaRouteButton(activity) + CastButtonFactory.setUpMediaRouteButton(activity, button) + + val root = activity.findViewById<ViewGroup>(android.R.id.content) + root?.addView(button, ViewGroup.LayoutParams(1, 1)) + + button.performClick() + } catch (e: Exception) { + channel.invokeMethod( + "onCastError", + mapOf("message" to (e.message ?: "unknown")) + ) + } + } + } +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastMediaClient.kt b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastMediaClient.kt new file mode 100644 index 0000000..a2fb550 --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastMediaClient.kt @@ -0,0 +1,248 @@ +package com.aves.google_cast.cast + +import android.os.Handler +import android.os.Looper +import android.util.Log +import com.google.android.gms.cast.MediaError +import com.google.android.gms.cast.MediaSeekOptions +import com.google.android.gms.cast.MediaStatus +import com.google.android.gms.cast.framework.CastSession +import com.google.android.gms.cast.framework.media.RemoteMediaClient +import io.flutter.plugin.common.MethodChannel + +class CastMediaClient( + private val ctx: CastContextManager, + private val channel: MethodChannel +) { + + private var mediaClientListenerAdded = false + private var lastClientIdentity: Int? = null + + private var lastSentIndex: Int? = null + private var lastHandledFinishedItemId: Int? = null + + private var lastPlaybackState: Int? = null + private var lastVolume: Double? = null + private var lastMuted: Boolean? = null + + private val mainHandler = Handler(Looper.getMainLooper()) + + private val mediaClientCallback = object : RemoteMediaClient.Callback() { + + override fun onStatusUpdated() { + Log.d("GCAST_NATIVE", "CastMediaClient.onStatusUpdated() CALLED") + + val client = ctx.getClient() ?: run { + Log.d("GCAST_NATIVE", "CastMediaClient.onStatusUpdated(): ctx.getClient() == null") + return + } + + val status = client.mediaStatus ?: run { + Log.d("GCAST_NATIVE", "CastMediaClient.onStatusUpdated(): client.mediaStatus == null") + return + } + + Log.d( + "GCAST_NATIVE", + "CastMediaClient.onStatusUpdated(): playerState=${status.playerState} pos=${client.approximateStreamPosition} dur=${status.mediaInfo?.streamDuration}" + ) + + // QUEUE INDEX + val custom = status.mediaInfo?.customData + if (custom != null) { + val index = custom.optInt("index", -1) + val isVideo = custom.optBoolean("isVideo", false) + + if (index >= 0 && index != lastSentIndex) { + lastSentIndex = index + + mainHandler.post { + channel.invokeMethod( + "onQueueIndexChanged", + mapOf( + "index" to index, + "isVideo" to isVideo + ) + ) + } + } + } + + // MEDIA STATUS — SEMPRE INVIATO + val playerState = status.playerState + val position = client.approximateStreamPosition + val duration = client.mediaInfo?.streamDuration ?: 0L + + lastPlaybackState = playerState + + mainHandler.post { + channel.invokeMethod( + "onMediaStatus", + mapOf( + "isPlaying" to (playerState == MediaStatus.PLAYER_STATE_PLAYING), + "isBuffering" to (playerState == MediaStatus.PLAYER_STATE_BUFFERING), + "position" to position, + "duration" to duration + ) + ) + } + + // VIDEO FINISHED + if (playerState == MediaStatus.PLAYER_STATE_IDLE && + status.idleReason == MediaStatus.IDLE_REASON_FINISHED + ) { + val finishedItemId = try { + status.currentItemId + } catch (_: Exception) { + null + } + + if (finishedItemId != null && finishedItemId == lastHandledFinishedItemId) { + return + } + + lastHandledFinishedItemId = finishedItemId + + mainHandler.post { + channel.invokeMethod("onVideoFinished", null) + } + + return + } + + // ERROR + if (playerState == MediaStatus.PLAYER_STATE_IDLE && + status.idleReason == MediaStatus.IDLE_REASON_ERROR + ) { + mainHandler.post { + channel.invokeMethod( + "onCastError", + mapOf("message" to "Playback error") + ) + } + } + + // VOLUME — SEMPRE INVIATO + sendVolumeAlways() + } + + override fun onMediaError(mediaError: MediaError) { + Log.d("GCAST_NATIVE", "CastMediaClient.onMediaError(): $mediaError") + + mainHandler.post { + channel.invokeMethod( + "onCastError", + mapOf( + "message" to "Media error: ${mediaError}", + "detailedErrorCode" to mediaError.detailedErrorCode + ) + ) + } + } + } + + // ------------------------------------------------------------ + // VOLUME SEMPRE INVIATO + // ------------------------------------------------------------ + private fun sendVolumeAlways() { + val session: CastSession = ctx.getSession() ?: run { + Log.d("GCAST_NATIVE", "sendVolumeAlways(): session == null") + return + } + + val vol = session.volume + val muted = session.isMute + + Log.d("GCAST_NATIVE", "sendVolumeAlways(): volume=$vol muted=$muted") + + lastVolume = vol + lastMuted = muted + + mainHandler.post { + channel.invokeMethod( + "onVolumeChanged", + mapOf( + "volume" to vol, + "isMuted" to muted + ) + ) + } + } + + // ------------------------------------------------------------ + // CLIENT ATTACH + // ------------------------------------------------------------ + fun attachCurrentClientIfNeeded() { + val client = ctx.getClient() ?: run { + Log.d("GCAST_NATIVE", "attachCurrentClientIfNeeded(): ctx.getClient() == null") + return + } + + val identity = System.identityHashCode(client) + + Log.d("GCAST_NATIVE", "attachCurrentClientIfNeeded(): attaching to client identity=$identity") + + if (!mediaClientListenerAdded || lastClientIdentity != identity) { + try { + client.unregisterCallback(mediaClientCallback) + } catch (_: Exception) {} + + client.registerCallback(mediaClientCallback) + + mediaClientListenerAdded = true + lastClientIdentity = identity + + lastSentIndex = null + lastHandledFinishedItemId = null + lastPlaybackState = null + lastVolume = null + lastMuted = null + } + } + + fun resetClientTracking() { + mediaClientListenerAdded = false + lastClientIdentity = null + lastSentIndex = null + lastHandledFinishedItemId = null + + lastPlaybackState = null + lastVolume = null + lastMuted = null + } + + // ------------------------------------------------------------ + // CONTROLLI + // ------------------------------------------------------------ + fun play() { + attachCurrentClientIfNeeded() + ctx.getClient()?.play() + } + + fun pause() { + attachCurrentClientIfNeeded() + ctx.getClient()?.pause() + } + + fun seek(position: Long) { + attachCurrentClientIfNeeded() + + val client = ctx.getClient() ?: return + val opts = MediaSeekOptions.Builder() + .setPosition(position) + .setResumeState(MediaSeekOptions.RESUME_STATE_UNCHANGED) + .build() + + client.seek(opts) + } + + fun setVolume(v: Double) { + attachCurrentClientIfNeeded() + ctx.getSession()?.setVolume(v.coerceIn(0.0, 1.0)) + } + + fun setMute(m: Boolean) { + attachCurrentClientIfNeeded() + ctx.getSession()?.setMute(m) + } +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastMediaClient.kt.ok b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastMediaClient.kt.ok new file mode 100644 index 0000000..a81cefa --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastMediaClient.kt.ok @@ -0,0 +1,231 @@ +package com.aves.google_cast.cast + +import android.os.Handler +import android.os.Looper +import com.google.android.gms.cast.MediaError +import com.google.android.gms.cast.MediaSeekOptions +import com.google.android.gms.cast.MediaStatus +import com.google.android.gms.cast.framework.CastSession +import com.google.android.gms.cast.framework.media.RemoteMediaClient +import io.flutter.plugin.common.MethodChannel + +class CastMediaClient( + private val ctx: CastContextManager, + private val channel: MethodChannel +) { + + private var mediaClientListenerAdded = false + private var lastClientIdentity: Int? = null + + private var lastSentIndex: Int? = null + private var lastHandledFinishedItemId: Int? = null + + private var lastPlaybackState: Int? = null + private var lastVolume: Double? = null + private var lastMuted: Boolean? = null + + private val mainHandler = Handler(Looper.getMainLooper()) + + private val mediaClientCallback = object : RemoteMediaClient.Callback() { + + override fun onStatusUpdated() { + val client = ctx.getClient() ?: return + val status = client.mediaStatus ?: return + + // QUEUE INDEX + val custom = status.mediaInfo?.customData + if (custom != null) { + val index = custom.optInt("index", -1) + val isVideo = custom.optBoolean("isVideo", false) + + if (index >= 0 && index != lastSentIndex) { + lastSentIndex = index + + mainHandler.post { + channel.invokeMethod( + "onQueueIndexChanged", + mapOf( + "index" to index, + "isVideo" to isVideo + ) + ) + } + } + } + + // MEDIA STATUS + val playerState = status.playerState + val position = client.approximateStreamPosition + val duration = client.mediaInfo?.streamDuration ?: 0L + + if (playerState != lastPlaybackState) { + lastPlaybackState = playerState + + mainHandler.post { + channel.invokeMethod( + "onMediaStatus", + mapOf( + "isPlaying" to (playerState == MediaStatus.PLAYER_STATE_PLAYING), + "isBuffering" to (playerState == MediaStatus.PLAYER_STATE_BUFFERING), + "position" to position, + "duration" to duration + ) + ) + } + } + + // VIDEO FINISHED + if (playerState == MediaStatus.PLAYER_STATE_IDLE && + status.idleReason == MediaStatus.IDLE_REASON_FINISHED + ) { + val finishedItemId = try { + status.currentItemId + } catch (_: Exception) { + null + } + + if (finishedItemId != null && finishedItemId == lastHandledFinishedItemId) { + return + } + + lastHandledFinishedItemId = finishedItemId + + mainHandler.post { + channel.invokeMethod("onVideoFinished", null) + } + + return + } + + // ERROR + if (playerState == MediaStatus.PLAYER_STATE_IDLE && + status.idleReason == MediaStatus.IDLE_REASON_ERROR + ) { + mainHandler.post { + channel.invokeMethod( + "onCastError", + mapOf("message" to "Playback error") + ) + } + } + + // VOLUME + sendVolumeIfChanged() + } + + override fun onMediaError(mediaError: MediaError) { + mainHandler.post { + channel.invokeMethod( + "onCastError", + mapOf( + "message" to "Media error: ${mediaError.toString()}", + "detailedErrorCode" to mediaError.detailedErrorCode + ) + ) + } + } + } + + // ------------------------------------------------------------ + // VOLUME EVENT-DRIVEN + // ------------------------------------------------------------ + private fun sendVolumeIfChanged() { + val session: CastSession = ctx.getSession() ?: return + + val vol = session.volume + val muted = session.isMute + + if (lastVolume != null && + lastMuted != null && + kotlin.math.abs(lastVolume!! - vol) < 0.01 && + lastMuted == muted + ) { + return + } + + lastVolume = vol + lastMuted = muted + + mainHandler.post { + channel.invokeMethod( + "onVolumeChanged", + mapOf( + "volume" to vol, + "isMuted" to muted + ) + ) + } + } + + // ------------------------------------------------------------ + // CLIENT ATTACH — VERSIONE DEFINITIVA + // ------------------------------------------------------------ + fun attachCurrentClientIfNeeded() { + val client = ctx.getClient() ?: return + + val identity = System.identityHashCode(client) + + if (!mediaClientListenerAdded || lastClientIdentity != identity) { + try { + client.unregisterCallback(mediaClientCallback) + } catch (_: Exception) {} + + client.registerCallback(mediaClientCallback) + + mediaClientListenerAdded = true + lastClientIdentity = identity + + lastSentIndex = null + lastHandledFinishedItemId = null + lastPlaybackState = null + lastVolume = null + lastMuted = null + } + } + + fun resetClientTracking() { + mediaClientListenerAdded = false + lastClientIdentity = null + lastSentIndex = null + lastHandledFinishedItemId = null + + lastPlaybackState = null + lastVolume = null + lastMuted = null + } + + // ------------------------------------------------------------ + // CONTROLLI + // ------------------------------------------------------------ + fun play() { + attachCurrentClientIfNeeded() + ctx.getClient()?.play() + } + + fun pause() { + attachCurrentClientIfNeeded() + ctx.getClient()?.pause() + } + + fun seek(position: Long) { + attachCurrentClientIfNeeded() + + val client = ctx.getClient() ?: return + val opts = MediaSeekOptions.Builder() + .setPosition(position) + .setResumeState(MediaSeekOptions.RESUME_STATE_UNCHANGED) + .build() + + client.seek(opts) + } + + fun setVolume(v: Double) { + attachCurrentClientIfNeeded() + ctx.getSession()?.setVolume(v.coerceIn(0.0, 1.0)) + } + + fun setMute(m: Boolean) { + attachCurrentClientIfNeeded() + ctx.getSession()?.setMute(m) + } +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastQueueManager.kt b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastQueueManager.kt new file mode 100644 index 0000000..7230c35 --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastQueueManager.kt @@ -0,0 +1,60 @@ +package com.aves.google_cast.cast + +import com.google.android.gms.cast.* +import io.flutter.plugin.common.MethodChannel +import org.json.JSONObject + +class CastQueueManager( + private val ctx: CastContextManager, + private val channel: MethodChannel +) { + + fun loadQueue(items: List<Map<String, Any>>, startIndex: Int) { + val client = ctx.getClient() ?: return + + val queueItems = items.mapIndexed { index, it -> + val url = it["url"] as String + val isVideo = it["isVideo"] as Boolean + val mime = it["mimeType"] as String + + val metadata = MediaMetadata( + if (isVideo) MediaMetadata.MEDIA_TYPE_MOVIE + else MediaMetadata.MEDIA_TYPE_PHOTO + ) + + val custom = JSONObject() + .put("index", index) + .put("isVideo", isVideo) + + val mediaInfo = MediaInfo.Builder(url) + .setContentType(mime) + .setStreamType( + if (isVideo) MediaInfo.STREAM_TYPE_BUFFERED + else MediaInfo.STREAM_TYPE_NONE + ) + .setMetadata(metadata) + .setCustomData(custom) + .build() + + MediaQueueItem.Builder(mediaInfo) + .setAutoplay(true) + .setPreloadTime(8.0) + .build() + } + + client.queueLoad( + queueItems.toTypedArray(), + startIndex, + MediaStatus.REPEAT_MODE_REPEAT_OFF, + null + ) + } + + fun next() { + ctx.getClient()?.queueNext(null) + } + + fun prev() { + ctx.getClient()?.queuePrev(null) + } +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastSessionHandler.kt b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastSessionHandler.kt new file mode 100644 index 0000000..6d0bd63 --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastSessionHandler.kt @@ -0,0 +1,101 @@ +package com.aves.google_cast.cast + +import android.os.Handler +import android.os.Looper +import android.util.Log +import com.google.android.gms.cast.framework.CastSession +import com.google.android.gms.cast.framework.SessionManagerListener +import io.flutter.plugin.common.MethodChannel + +class CastSessionHandler( + private val channel: MethodChannel +) : SessionManagerListener<CastSession> { + + private val mainHandler = Handler(Looper.getMainLooper()) + private var readySent = false + private var currentSession: CastSession? = null + + // ⭐ mediaClient viene assegnato DOPO la creazione + private var mediaClient: CastMediaClient? = null + + fun setMediaClient(client: CastMediaClient) { + mediaClient = client + } + + override fun onSessionStarting(session: CastSession) { + Log.d("GCAST_NATIVE", "onSessionStarting") + currentSession = session + + mediaClient?.attachCurrentClientIfNeeded() // ⭐ PATCH + trySendReadyWhenClientExists() + } + + override fun onSessionStarted(session: CastSession, sessionId: String) { + Log.d("GCAST_NATIVE", "onSessionStarted sessionId=$sessionId") + currentSession = session + + mediaClient?.attachCurrentClientIfNeeded() // ⭐ PATCH + trySendReadyWhenClientExists() + } + + override fun onSessionResuming(session: CastSession, sessionId: String) { + Log.d("GCAST_NATIVE", "onSessionResuming sessionId=$sessionId") + currentSession = session + + mediaClient?.attachCurrentClientIfNeeded() // ⭐ PATCH + trySendReadyWhenClientExists() + } + + override fun onSessionResumed(session: CastSession, wasSuspended: Boolean) { + Log.d("GCAST_NATIVE", "onSessionResumed wasSuspended=$wasSuspended") + currentSession = session + + mediaClient?.attachCurrentClientIfNeeded() // ⭐ PATCH + trySendReadyWhenClientExists() + } + + override fun onSessionSuspended(session: CastSession, reason: Int) { + Log.d("GCAST_NATIVE", "onSessionSuspended reason=$reason") + currentSession = session + + mediaClient?.attachCurrentClientIfNeeded() // ⭐ PATCH + trySendReadyWhenClientExists() + } + + override fun onSessionEnded(session: CastSession, error: Int) { + Log.d("GCAST_NATIVE", "onSessionEnded error=$error") + + currentSession = null + readySent = false + + mainHandler.post { + Log.d("GCAST_NATIVE", "invokeMethod onCastStopped") + channel.invokeMethod("onCastStopped", null) + } + } + + override fun onSessionStartFailed(session: CastSession, error: Int) { + Log.d("GCAST_NATIVE", "onSessionStartFailed error=$error") + } + + override fun onSessionResumeFailed(session: CastSession, error: Int) { + Log.d("GCAST_NATIVE", "onSessionResumeFailed error=$error") + } + + override fun onSessionEnding(session: CastSession) { + Log.d("GCAST_NATIVE", "onSessionEnding") + } + + private fun trySendReadyWhenClientExists() { + val session = currentSession ?: return + val client = session.remoteMediaClient ?: return + + if (readySent) return + readySent = true + + mainHandler.post { + Log.d("GCAST_NATIVE", "invokeMethod onCastReady") + channel.invokeMethod("onCastReady", null) + } + } +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastSessionHandler.kt.ok b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastSessionHandler.kt.ok new file mode 100644 index 0000000..3dbd300 --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastSessionHandler.kt.ok @@ -0,0 +1,95 @@ +package com.aves.google_cast.cast + +import android.os.Handler +import android.os.Looper +import android.util.Log +import com.google.android.gms.cast.framework.CastSession +import com.google.android.gms.cast.framework.SessionManagerListener +import io.flutter.plugin.common.MethodChannel + +class CastSessionHandler( + private val channel: MethodChannel +) : SessionManagerListener<CastSession> { + + private val mainHandler = Handler(Looper.getMainLooper()) + private var readySent = false + private var currentSession: CastSession? = null + + // ------------------------------------------------------------ + // SESSION EVENTS → ORA onCastReady VIENE INVIATO SOLO QUANDO + // ESISTE DAVVERO UN remoteMediaClient (TV PRONTA) + // ------------------------------------------------------------ + + override fun onSessionStarting(session: CastSession) { + Log.d("GCAST_NATIVE", "onSessionStarting") + currentSession = session + trySendReadyWhenClientExists() + } + + override fun onSessionStarted(session: CastSession, sessionId: String) { + Log.d("GCAST_NATIVE", "onSessionStarted sessionId=$sessionId") + currentSession = session + trySendReadyWhenClientExists() + } + + override fun onSessionResuming(session: CastSession, sessionId: String) { + Log.d("GCAST_NATIVE", "onSessionResuming sessionId=$sessionId") + currentSession = session + trySendReadyWhenClientExists() + } + + override fun onSessionResumed(session: CastSession, wasSuspended: Boolean) { + Log.d("GCAST_NATIVE", "onSessionResumed wasSuspended=$wasSuspended") + currentSession = session + trySendReadyWhenClientExists() + } + + override fun onSessionSuspended(session: CastSession, reason: Int) { + Log.d("GCAST_NATIVE", "onSessionSuspended reason=$reason") + currentSession = session + trySendReadyWhenClientExists() + } + + // ------------------------------------------------------------ + // SESSION END + // ------------------------------------------------------------ + override fun onSessionEnded(session: CastSession, error: Int) { + Log.d("GCAST_NATIVE", "onSessionEnded error=$error") + + currentSession = null + readySent = false + + mainHandler.post { + Log.d("GCAST_NATIVE", "invokeMethod onCastStopped") + channel.invokeMethod("onCastStopped", null) + } + } + + override fun onSessionStartFailed(session: CastSession, error: Int) { + Log.d("GCAST_NATIVE", "onSessionStartFailed error=$error") + } + + override fun onSessionResumeFailed(session: CastSession, error: Int) { + Log.d("GCAST_NATIVE", "onSessionResumeFailed error=$error") + } + + override fun onSessionEnding(session: CastSession) { + Log.d("GCAST_NATIVE", "onSessionEnding") + } + + // ------------------------------------------------------------ + // READY DISPATCHER → SOLO QUANDO remoteMediaClient ESISTE + // ------------------------------------------------------------ + private fun trySendReadyWhenClientExists() { + val session = currentSession ?: return + val client = session.remoteMediaClient ?: return + + if (readySent) return + readySent = true + + mainHandler.post { + Log.d("GCAST_NATIVE", "invokeMethod onCastReady") + channel.invokeMethod("onCastReady", null) + } + } +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastSessionHandler.kt.old b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastSessionHandler.kt.old new file mode 100644 index 0000000..24632d1 --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastSessionHandler.kt.old @@ -0,0 +1,106 @@ +package com.aves.google_cast.cast + +import android.os.Handler +import android.os.Looper +import android.util.Log +import com.google.android.gms.cast.framework.CastSession +import com.google.android.gms.cast.framework.SessionManagerListener +import io.flutter.plugin.common.MethodChannel + +class CastSessionHandler( + private val channel: MethodChannel, + private val mediaClient: CastMediaClient // ⭐ AGGIUNTO +) : SessionManagerListener<CastSession> { + + private val mainHandler = Handler(Looper.getMainLooper()) + private var readySent = false + private var currentSession: CastSession? = null + + // ------------------------------------------------------------ + // SESSION EVENTS → ORA onCastReady VIENE INVIATO SOLO QUANDO + // ESISTE DAVVERO UN remoteMediaClient (TV PRONTA) + // ------------------------------------------------------------ + + override fun onSessionStarting(session: CastSession) { + Log.d("GCAST_NATIVE", "onSessionStarting") + currentSession = session + + mediaClient.attachCurrentClientIfNeeded() // ⭐ PATCH + trySendReadyWhenClientExists() + } + + override fun onSessionStarted(session: CastSession, sessionId: String) { + Log.d("GCAST_NATIVE", "onSessionStarted sessionId=$sessionId") + currentSession = session + + mediaClient.attachCurrentClientIfNeeded() // ⭐ PATCH + trySendReadyWhenClientExists() + } + + override fun onSessionResuming(session: CastSession, sessionId: String) { + Log.d("GCAST_NATIVE", "onSessionResuming sessionId=$sessionId") + currentSession = session + + mediaClient.attachCurrentClientIfNeeded() // ⭐ PATCH + trySendReadyWhenClientExists() + } + + override fun onSessionResumed(session: CastSession, wasSuspended: Boolean) { + Log.d("GCAST_NATIVE", "onSessionResumed wasSuspended=$wasSuspended") + currentSession = session + + mediaClient.attachCurrentClientIfNeeded() // ⭐ PATCH + trySendReadyWhenClientExists() + } + + override fun onSessionSuspended(session: CastSession, reason: Int) { + Log.d("GCAST_NATIVE", "onSessionSuspended reason=$reason") + currentSession = session + + mediaClient.attachCurrentClientIfNeeded() // ⭐ PATCH + trySendReadyWhenClientExists() + } + + // ------------------------------------------------------------ + // SESSION END + // ------------------------------------------------------------ + override fun onSessionEnded(session: CastSession, error: Int) { + Log.d("GCAST_NATIVE", "onSessionEnded error=$error") + + currentSession = null + readySent = false + + mainHandler.post { + Log.d("GCAST_NATIVE", "invokeMethod onCastStopped") + channel.invokeMethod("onCastStopped", null) + } + } + + override fun onSessionStartFailed(session: CastSession, error: Int) { + Log.d("GCAST_NATIVE", "onSessionStartFailed error=$error") + } + + override fun onSessionResumeFailed(session: CastSession, error: Int) { + Log.d("GCAST_NATIVE", "onSessionResumeFailed error=$error") + } + + override fun onSessionEnding(session: CastSession) { + Log.d("GCAST_NATIVE", "onSessionEnding") + } + + // ------------------------------------------------------------ + // READY DISPATCHER → SOLO QUANDO remoteMediaClient ESISTE + // ------------------------------------------------------------ + private fun trySendReadyWhenClientExists() { + val session = currentSession ?: return + val client = session.remoteMediaClient ?: return + + if (readySent) return + readySent = true + + mainHandler.post { + Log.d("GCAST_NATIVE", "invokeMethod onCastReady") + channel.invokeMethod("onCastReady", null) + } + } +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/fast/FastCastEngine.kt b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/fast/FastCastEngine.kt new file mode 100644 index 0000000..ca093c8 --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/fast/FastCastEngine.kt @@ -0,0 +1,83 @@ +package com.aves.google_cast.fast + +import android.util.Log +import com.aves.google_cast.cast.CastContextManager +import com.aves.google_cast.cast.CastMediaClient +import com.google.android.gms.cast.MediaStatus +import com.google.android.gms.cast.framework.media.RemoteMediaClient +import io.flutter.plugin.common.MethodChannel + +class FastCastEngine( + private val contextManager: CastContextManager, + private val mediaClient: CastMediaClient, + private val channel: MethodChannel +) { + + private val tag = "FAST_CAST" + + fun loadQueue(args: Map<*, *>) { + val items = args["items"] as List<Map<*, *>> + val startIndex = args["startIndex"] as Int + + val castContext = contextManager.ensureCastContext() + val session = castContext?.sessionManager?.currentCastSession + val client = session?.remoteMediaClient + + if (client == null) { + Log.w(tag, "No RemoteMediaClient available") + return + } + + val queueItems = FastQueueBuilder.buildItems(items) + val repeatMode = FastQueueBuilder.repeatAll() + + client.queueLoad( + queueItems.toTypedArray(), + startIndex, + repeatMode, + null + ) + + client.addListener(object : RemoteMediaClient.Listener { + override fun onStatusUpdated() { + val status = client.mediaStatus ?: return + + sendEvent("currentIndex", status.currentItemId) + + val playerState = status.playerState + sendEvent("isPlaying", playerState == MediaStatus.PLAYER_STATE_PLAYING) + sendEvent("isBuffering", playerState == MediaStatus.PLAYER_STATE_BUFFERING) + } + + override fun onMetadataUpdated() {} + override fun onQueueStatusUpdated() {} + override fun onPreloadStatusUpdated() {} + override fun onSendingRemoteMediaRequest() {} + override fun onAdBreakStatusUpdated() {} + }) + + Log.d(tag, "FAST queue loaded: ${queueItems.size} items, start=$startIndex") + } + + fun next() { + currentClient()?.queueNext(null) + } + + fun prev() { + currentClient()?.queuePrev(null) + } + + fun stop() { + currentClient()?.stop() + } + + private fun currentClient(): RemoteMediaClient? { + val castContext = contextManager.ensureCastContext() + val session = castContext?.sessionManager?.currentCastSession + return session?.remoteMediaClient + } + + private fun sendEvent(event: String, value: Any) { + channel.invokeMethod("fastEvent", mapOf("event" to event, "value" to value)) + } +} diff --git a/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/fast/FastQueueBuilder.kt b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/fast/FastQueueBuilder.kt new file mode 100644 index 0000000..052d9a0 --- /dev/null +++ b/plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/fast/FastQueueBuilder.kt @@ -0,0 +1,39 @@ +package com.aves.google_cast.fast + +import com.google.android.gms.cast.MediaInfo +import com.google.android.gms.cast.MediaMetadata +import com.google.android.gms.cast.MediaQueueItem +import com.google.android.gms.cast.MediaStatus + +object FastQueueBuilder { + + fun buildItems(items: List<Map<*, *>>): List<MediaQueueItem> { + return items.map { map -> + val url = map["url"] as String + val isVideo = map["isVideo"] as Boolean + val title = map["title"] as? String ?: "" + + val metadata = MediaMetadata( + if (isVideo) + MediaMetadata.MEDIA_TYPE_MOVIE + else + MediaMetadata.MEDIA_TYPE_PHOTO + ).apply { + putString(MediaMetadata.KEY_TITLE, title) + } + + val info = MediaInfo.Builder(url) + .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) + .setContentType(if (isVideo) "video/mp4" else "image/jpeg") + .setMetadata(metadata) + .build() + + MediaQueueItem.Builder(info) + .setAutoplay(true) + .setPreloadTime(10.0) // prefetch CAF + .build() + } + } + + fun repeatAll(): Int = MediaStatus.REPEAT_MODE_REPEAT_ALL +} diff --git a/plugins/google_cast/lib/google_cast.dart b/plugins/google_cast/lib/google_cast.dart new file mode 100644 index 0000000..0efb908 --- /dev/null +++ b/plugins/google_cast/lib/google_cast.dart @@ -0,0 +1,20 @@ +import 'package:flutter/services.dart'; + +class GoogleCast { + static const _channel = MethodChannel('google_cast'); + + static Future<void> showCastDialog() async { + await _channel.invokeMethod('showCastDialog'); + } + + static Future<void> loadUrl(String url, String mimeType) async { + await _channel.invokeMethod('loadUrl', { + 'url': url, + 'mimeType': mimeType, + }); + } + + static Future<void> stop() async { + await _channel.invokeMethod('stop'); + } +} diff --git a/plugins/google_cast/pubspec.yaml b/plugins/google_cast/pubspec.yaml new file mode 100644 index 0000000..32a1191 --- /dev/null +++ b/plugins/google_cast/pubspec.yaml @@ -0,0 +1,13 @@ +name: google_cast +description: Minimal Google Cast plugin for AVES +resolution: workspace + +environment: + sdk: ">=3.5.0 <4.0.0" + +flutter: + plugin: + platforms: + android: + package: com.aves.google_cast + pluginClass: FlutterCastFrameworkPlugin diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..9e2fe7f --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,1926 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f + url: "https://pub.dev" + source: hosted + version: "85.0.0" + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: bda3b7b55958bfd867addc40d067b4b11f7b8846d57671f5b5a6e7f9a56fe3ad + url: "https://pub.dev" + source: hosted + version: "1.3.69" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" + url: "https://pub.dev" + source: hosted + version: "7.7.1" + archive: + dependency: transitive + description: + name: archive + sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff + url: "https://pub.dev" + source: hosted + version: "4.0.9" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + barcode: + dependency: transitive + description: + name: barcode + sha256: "7b6729c37e3b7f34233e2318d866e8c48ddb46c1f7ad01ff7bb2a8de1da2b9f4" + url: "https://pub.dev" + source: hosted + version: "2.2.9" + bidi: + dependency: transitive + description: + name: bidi + sha256: "77f475165e94b261745cf1032c751e2032b8ed92ccb2bf5716036db79320637d" + url: "https://pub.dev" + source: hosted + version: "2.0.13" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + charts_common: + dependency: transitive + description: + path: charts_common + ref: aves + resolved-ref: ba7833d74e17ff497d3f4fb48f362d2dfdf3c6e3 + url: "https://github.com/deckerst/flutter_google_charts.git" + source: git + version: "0.12.0" + charts_flutter: + dependency: "direct main" + description: + path: charts_flutter + ref: aves + resolved-ref: ba7833d74e17ff497d3f4fb48f362d2dfdf3c6e3 + url: "https://github.com/deckerst/flutter_google_charts.git" + source: git + version: "0.12.0" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: "direct main" + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + connectivity_plus: + dependency: "direct main" + description: + name: connectivity_plus + sha256: "62ffa266d9a23b79fb3fcbc206afc00bb979417ba57b1324c546b5aab95ba057" + url: "https://pub.dev" + source: hosted + version: "7.1.1" + connectivity_plus_platform_interface: + dependency: transitive + description: + name: connectivity_plus_platform_interface + sha256: "3c09627c536d22fd24691a905cdd8b14520de69da52c7a97499c8be5284a32ed" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + country_code: + dependency: "direct main" + description: + name: country_code + sha256: af9f06f6ccf873ff447214c7820509867ee6f791780cc3061f0e51f7f358ee2b + url: "https://pub.dev" + source: hosted + version: "1.1.0" + coverage: + dependency: transitive + description: + name: coverage + sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d" + url: "https://pub.dev" + source: hosted + version: "1.15.0" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + csv: + dependency: "direct main" + description: + name: csv + sha256: c6aa2679b2a18cb57652920f674488d89712efaf4d3fdf2e537215b35fc19d6c + url: "https://pub.dev" + source: hosted + version: "6.0.0" + custom_rounded_rectangle_border: + dependency: transitive + description: + name: custom_rounded_rectangle_border + sha256: "3e8ca0c26b8d22d5d3842bab59dfd209995f8e42af7c2eef03da70642c040819" + url: "https://pub.dev" + source: hosted + version: "0.3.0" + dart_earcut: + dependency: transitive + description: + name: dart_earcut + sha256: e485001bfc05dcbc437d7bfb666316182e3522d4c3f9668048e004d0eb2ce43b + url: "https://pub.dev" + source: hosted + version: "1.2.0" + dart_polylabel2: + dependency: transitive + description: + name: dart_polylabel2 + sha256: "7eeab15ce72894e4bdba6a8765712231fc81be0bd95247de4ad9966abc57adc6" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + dbus: + dependency: transitive + description: + name: dbus + sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270 + url: "https://pub.dev" + source: hosted + version: "0.7.12" + dchs_motion_sensors: + dependency: transitive + description: + name: dchs_motion_sensors + sha256: "2a6eec0c47fd59d0f923aa758286ded0d74ae79519dec560d003e6d0797877e2" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + decorated_icon: + dependency: "direct main" + description: + name: decorated_icon + sha256: "4e2af1906cd211905ee729960daef162cd9f0bacd1d24de99e84e37e114a3648" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + sha256: b4fed1b2835da9d670d7bed7db79ae2a94b0f5ad6312268158a9b5479abbacdd + url: "https://pub.dev" + source: hosted + version: "12.4.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f + url: "https://pub.dev" + source: hosted + version: "7.0.3" + dynamic_color: + dependency: "direct main" + description: + name: dynamic_color + sha256: "43a5a6679649a7731ab860334a5812f2067c2d9ce6452cf069c5e0c25336c17c" + url: "https://pub.dev" + source: hosted + version: "1.8.1" + equatable: + dependency: "direct main" + description: + name: equatable + sha256: "3e0141505477fd8ad55d6eb4e7776d3fe8430be8e497ccb1521370c3f21a3e2b" + url: "https://pub.dev" + source: hosted + version: "2.0.8" + event_bus: + dependency: "direct main" + description: + name: event_bus + sha256: "1a55e97923769c286d295240048fc180e7b0768902c3c2e869fe059aafa15304" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + executor_lib: + dependency: transitive + description: + name: executor_lib + sha256: "95ddf2957d9942d9702855b38dd49677f0ee6a8b77d7b16c0e509c7669d17386" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + expansion_tile_card: + dependency: "direct main" + description: + path: "." + ref: HEAD + resolved-ref: "7c4032fa0fc17b5a5d3fec1ac854afd6cd55670e" + url: "https://github.com/deckerst/expansion_tile_card.git" + source: git + version: "3.0.0" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + firebase_core: + dependency: transitive + description: + name: firebase_core + sha256: d5a94b884dcb1e6d3430298e94bfe002238094cdfd5e29202d536ee2120f9158 + url: "https://pub.dev" + source: hosted + version: "4.7.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: "0ecda14c1bfc9ed8cac303dd0f8d04a320811b479362a9a4efb14fd331a473ce" + url: "https://pub.dev" + source: hosted + version: "6.0.3" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: dc5096257cd67292d34d78ceeb90836f02a4be921b5f3934311a02bb2376118c + url: "https://pub.dev" + source: hosted + version: "3.6.0" + firebase_crashlytics: + dependency: transitive + description: + name: firebase_crashlytics + sha256: "43a311b280d9391389a690d10e1ac0d458b965154a57de5be2f0857225aa2016" + url: "https://pub.dev" + source: hosted + version: "5.2.0" + firebase_crashlytics_platform_interface: + dependency: transitive + description: + name: firebase_crashlytics_platform_interface + sha256: "1b6a921ad6f0d08203ecc1310437a88cec357bc3cad27e1138f1e2c16dd71db9" + url: "https://pub.dev" + source: hosted + version: "3.8.20" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flex_color_picker: + dependency: "direct main" + description: + name: flex_color_picker + sha256: f5b0b53d4ae0d59b1e28dfc21d5398e5028cf8e764518e491a52fd050aa23881 + url: "https://pub.dev" + source: hosted + version: "3.7.2" + flex_seed_scheme: + dependency: transitive + description: + name: flex_seed_scheme + sha256: "828291a5a4d4283590541519d8b57821946660ac61d2e07d955f81cfcab22e5d" + url: "https://pub.dev" + source: hosted + version: "3.6.1" + floating: + dependency: "direct main" + description: + name: floating + sha256: e51ce1dbcab3ea83da0ad1b07f2091b99c0e8680184c780a000567f41234d454 + url: "https://pub.dev" + source: hosted + version: "6.0.0" + fluster: + dependency: "direct main" + description: + name: fluster + sha256: "3807f5d088b7798f0416b8578498046338af98bb4fb922a70e2810b8293963f6" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_cube: + dependency: transitive + description: + name: flutter_cube + sha256: "71cf679a251166eb97f86751c56582b09abdbf859485fbf60524948813914c3b" + url: "https://pub.dev" + source: hosted + version: "0.1.1" + flutter_displaymode: + dependency: "direct main" + description: + name: flutter_displaymode + sha256: ecd44b1e902b0073b42ff5b55bf283f38e088270724cdbb7f7065ccf54aa60a8 + url: "https://pub.dev" + source: hosted + version: "0.7.0" + flutter_driver: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_highlight: + dependency: "direct main" + description: + name: flutter_highlight + sha256: "7b96333867aa07e122e245c033b8ad622e4e3a42a1a2372cbb098a2541d8782c" + url: "https://pub.dev" + source: hosted + version: "0.7.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_localizations_plus: + dependency: "direct main" + description: + path: "." + ref: HEAD + resolved-ref: "52f8101ab82719004cc0daec88318148e7229544" + url: "https://github.com/deckerst/flutter_localizations_plus.git" + source: git + version: "0.0.1" + flutter_map: + dependency: "direct main" + description: + name: flutter_map + sha256: "03b71c02806ff20c3718d108cbbb3638142ebafe368d8ce2dd22a33344bcb02b" + url: "https://pub.dev" + source: hosted + version: "8.3.0" + flutter_markdown_plus: + dependency: "direct main" + description: + name: flutter_markdown_plus + sha256: "039177906850278e8fb1cd364115ee0a46281135932fa8ecea8455522166d2de" + url: "https://pub.dev" + source: hosted + version: "1.0.7" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "38d1c268de9097ff59cf0e844ac38759fc78f76836d37edad06fa21e182055a0" + url: "https://pub.dev" + source: hosted + version: "2.0.34" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" + url: "https://pub.dev" + source: hosted + version: "9.2.4" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + flutter_staggered_animations: + dependency: "direct main" + description: + name: flutter_staggered_animations + sha256: "81d3c816c9bb0dca9e8a5d5454610e21ffb068aedb2bde49d2f8d04f75538351" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + get_it: + dependency: "direct main" + description: + name: get_it + sha256: "568d62f0e68666fb5d95519743b3c24a34c7f19d834b0658c46e26d778461f66" + url: "https://pub.dev" + source: hosted + version: "9.2.1" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + google_api_availability: + dependency: transitive + description: + name: google_api_availability + sha256: "2ffdc91e1e0cf4e7974fef6c2988a24cefa81f03526ff04b694df6dc0fcbca03" + url: "https://pub.dev" + source: hosted + version: "5.0.1" + google_api_availability_android: + dependency: transitive + description: + name: google_api_availability_android + sha256: "4794147f43a8f3eee6b514d3ae30dbe6f7b9048cae8cd2a74cb4055cd28d74a8" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + google_api_availability_platform_interface: + dependency: transitive + description: + name: google_api_availability_platform_interface + sha256: "65b7da62fe5b582bb3d508628ad827d36d890710ea274766a992a56fa5420da6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + google_maps: + dependency: transitive + description: + name: google_maps + sha256: "5d410c32112d7c6eb7858d359275b2aa04778eed3e36c745aeae905fb2fa6468" + url: "https://pub.dev" + source: hosted + version: "8.2.0" + google_maps_flutter: + dependency: transitive + description: + name: google_maps_flutter + sha256: "9b0d6dab3de6955837575dc371dd772fcb5d0a90f6a4954e8c066472f9938550" + url: "https://pub.dev" + source: hosted + version: "2.14.2" + google_maps_flutter_android: + dependency: transitive + description: + name: google_maps_flutter_android + sha256: f1eb5ffa34ba41f8591e53ce439f78af179a506e8386a1297d0ecd202e05c734 + url: "https://pub.dev" + source: hosted + version: "2.19.8" + google_maps_flutter_ios: + dependency: transitive + description: + name: google_maps_flutter_ios + sha256: a2e3c7ad2392ea65d6775704716d0aa3c3d226cb984fd0a688bca40f6be1a451 + url: "https://pub.dev" + source: hosted + version: "2.17.4" + google_maps_flutter_platform_interface: + dependency: transitive + description: + name: google_maps_flutter_platform_interface + sha256: ddbe34435dfb34e83fca295c6a8dcc53c3b51487e9eec3c737ce4ae605574347 + url: "https://pub.dev" + source: hosted + version: "2.15.0" + google_maps_flutter_web: + dependency: transitive + description: + name: google_maps_flutter_web + sha256: d416602944e1859f3cbbaa53e34785c223fa0a11eddb34a913c964c5cbb5d8cf + url: "https://pub.dev" + source: hosted + version: "0.5.14+3" + gpx: + dependency: "direct main" + description: + name: gpx + sha256: f5b12b86402c639079243600ee2b3afd85cd08d26117fc8885cf48efce471d8e + url: "https://pub.dev" + source: hosted + version: "2.3.0" + highlight: + dependency: "direct main" + description: + name: highlight + sha256: "5353a83ffe3e3eca7df0abfb72dcf3fa66cc56b953728e7113ad4ad88497cf21" + url: "https://pub.dev" + source: hosted + version: "0.7.0" + html: + dependency: transitive + description: + name: html + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" + url: "https://pub.dev" + source: hosted + version: "0.15.6" + http: + dependency: "direct main" + description: + name: http + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + idb_shim: + dependency: transitive + description: + name: idb_shim + sha256: "071f3b05032fa62e60ca15db9939f8afbaf403b37e67747ac88f858c3e999228" + url: "https://pub.dev" + source: hosted + version: "2.6.7+1" + image: + dependency: transitive + description: + name: image + sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce + url: "https://pub.dev" + source: hosted + version: "4.8.0" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + jni: + dependency: transitive + description: + name: jni + sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + url: "https://pub.dev" + source: hosted + version: "1.0.0" + jni_flutter: + dependency: transitive + description: + name: jni_flutter + sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + latlong2: + dependency: "direct main" + description: + name: latlong2 + sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" + url: "https://pub.dev" + source: hosted + version: "0.9.1" + leak_tracker: + dependency: "direct main" + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + local_auth: + dependency: "direct main" + description: + name: local_auth + sha256: ae6f382f638108c6becd134318d7c3f0a93875383a54010f61d7c97ac05d5137 + url: "https://pub.dev" + source: hosted + version: "3.0.1" + local_auth_android: + dependency: transitive + description: + name: local_auth_android + sha256: b201c006fa769c23386f89aa6837ec0eb8179fcfb212eadcf87b422b3f9a6a78 + url: "https://pub.dev" + source: hosted + version: "2.0.8" + local_auth_darwin: + dependency: transitive + description: + name: local_auth_darwin + sha256: "668ea65edaab17380956e9713f57e34f78ede505ca0cfd8d39db34e2f260bfee" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + local_auth_platform_interface: + dependency: transitive + description: + name: local_auth_platform_interface + sha256: f98b8e388588583d3f781f6806e4f4c9f9e189d898d27f0c249b93a1973dd122 + url: "https://pub.dev" + source: hosted + version: "1.1.0" + local_auth_windows: + dependency: transitive + description: + name: local_auth_windows + sha256: be12c5b8ba5e64896983123655c5f67d2484ecfcc95e367952ad6e3bff94cb16 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + markdown: + dependency: transitive + description: + name: markdown + sha256: ee85086ad7698b42522c6ad42fe195f1b9898e4d974a1af4576c1a3a176cada9 + url: "https://pub.dev" + source: hosted + version: "7.3.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + material_design_icons_flutter: + dependency: "direct main" + description: + name: material_design_icons_flutter + sha256: "6f986b7a51f3ad4c00e33c5c84e8de1bdd140489bbcdc8b66fc1283dad4dea5a" + url: "https://pub.dev" + source: hosted + version: "7.0.7296" + material_symbols_icons: + dependency: "direct main" + description: + name: material_symbols_icons + sha256: "10a74aaa9e566c92f8aa14809d2dd78156fb93743348ebffec0345c38eb35706" + url: "https://pub.dev" + source: hosted + version: "4.2928.1" + media_kit: + dependency: transitive + description: + name: media_kit + sha256: ae9e79597500c7ad6083a3c7b7b7544ddabfceacce7ae5c9709b0ec16a5d6643 + url: "https://pub.dev" + source: hosted + version: "1.2.6" + media_kit_libs_android_video: + dependency: transitive + description: + name: media_kit_libs_android_video + sha256: "3f6274e5ab2de512c286a25c327288601ee445ed8ac319e0ef0b66148bd8f76c" + url: "https://pub.dev" + source: hosted + version: "1.3.8" + media_kit_video: + dependency: transitive + description: + name: media_kit_video + sha256: afaa509e7b7e0bf247557a3a740cde903a52c34ace9810f94500e127bd7b043d + url: "https://pub.dev" + source: hosted + version: "2.0.1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + mgrs_dart: + dependency: transitive + description: + name: mgrs_dart + sha256: "385e7168ecc77eb545220223c49eef8ab249da7bf57f22781c40a04d23fb196f" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + mime: + dependency: "direct main" + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + network_info_plus: + dependency: "direct main" + description: + name: network_info_plus + sha256: "2866dadcbee2709e20d67737a1556f5675b8b0cdcf2c1659ba74bc21bffede4f" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + network_info_plus_platform_interface: + dependency: transitive + description: + name: network_info_plus_platform_interface + sha256: "7e7496a8a9d8136859b8881affc613c4a21304afeb6c324bcefc4bd0aff6b94b" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + nm: + dependency: transitive + description: + name: nm + sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + overlay_support: + dependency: "direct main" + description: + name: overlay_support + sha256: fc39389bfd94e6985e1e13b2a88a125fc4027608485d2d4e2847afe1b2bb339c + url: "https://pub.dev" + source: hosted + version: "2.1.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "468c26b4254ab01979fa5e4a98cb343ea3631b9acee6f21028997419a80e1a20" + url: "https://pub.dev" + source: hosted + version: "9.0.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + palette_generator: + dependency: "direct main" + description: + name: palette_generator + sha256: "4420f7ccc3f0a4a906144e73f8b6267cd940b64f57a7262e95cb8cec3a8ae0ed" + url: "https://pub.dev" + source: hosted + version: "0.3.3+7" + panorama_viewer: + dependency: "direct main" + description: + name: panorama_viewer + sha256: c6817bb2e202aad2d143d0bf7f95fc200b87791c2286971d7e3f29f8be916482 + url: "https://pub.dev" + source: hosted + version: "2.0.7" + path: + dependency: "direct main" + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "6d13aece7b3f5c5a9731eaf553ff9dcbc2eff41087fd2df587fd0fed9a3eb0c4" + url: "https://pub.dev" + source: hosted + version: "2.5.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + pattern_lock: + dependency: "direct main" + description: + name: pattern_lock + sha256: "7929f877bcc82744ba2c0d55aaad1ff7cf09744f516b4853363fd29a1d7f539f" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + pdf: + dependency: "direct main" + description: + name: pdf + sha256: e47a275b267873d5944ad5f5ff0dcc7ac2e36c02b3046a0ffac9b72fd362c44b + url: "https://pub.dev" + source: hosted + version: "3.12.0" + pdf_widget_wrapper: + dependency: transitive + description: + name: pdf_widget_wrapper + sha256: c930860d987213a3d58c7ec3b7ecf8085c3897f773e8dc23da9cae60a5d6d0f5 + url: "https://pub.dev" + source: hosted + version: "1.0.4" + percent_indicator: + dependency: "direct main" + description: + name: percent_indicator + sha256: "157d29133bbc6ecb11f923d36e7960a96a3f28837549a20b65e5135729f0f9fd" + url: "https://pub.dev" + source: hosted + version: "4.2.5" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1 + url: "https://pub.dev" + source: hosted + version: "12.0.1" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" + url: "https://pub.dev" + source: hosted + version: "13.0.1" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 + url: "https://pub.dev" + source: hosted + version: "9.4.7" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" + url: "https://pub.dev" + source: hosted + version: "7.0.2" + pin_code_fields: + dependency: "direct main" + description: + name: pin_code_fields + sha256: "4c0db7fbc889e622e7c71ea54b9ee624bb70c7365b532abea0271b17ea75b729" + url: "https://pub.dev" + source: hosted + version: "8.0.1" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" + url: "https://pub.dev" + source: hosted + version: "1.5.2" + posix: + dependency: transitive + description: + name: posix + sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" + url: "https://pub.dev" + source: hosted + version: "6.5.0" + printing: + dependency: "direct main" + description: + name: printing + sha256: "689170c9ddb1bda85826466ba80378aa8993486d3c959a71cd7d2d80cb606692" + url: "https://pub.dev" + source: hosted + version: "5.14.3" + process: + dependency: transitive + description: + name: process + sha256: c6248e4526673988586e8c00bb22a49210c258dc91df5227d5da9748ecf79744 + url: "https://pub.dev" + source: hosted + version: "5.0.5" + proj4dart: + dependency: "direct main" + description: + name: proj4dart + sha256: ddcedc1f7876e62717de43ab3491e2829bdad0b028261805f94aa080967e5859 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + protobuf: + dependency: transitive + description: + name: protobuf + sha256: "68645b24e0716782e58948f8467fd42a880f255096a821f9e7d0ec625b00c84d" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + provider: + dependency: "direct main" + description: + name: provider + sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" + url: "https://pub.dev" + source: hosted + version: "6.1.5+1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + qr: + dependency: transitive + description: + name: qr + sha256: "5a1d2586170e172b8a8c8470bbbffd5eb0cd38a66c0d77155ea138d3af3a4445" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + quiver: + dependency: transitive + description: + name: quiver + sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + safe_local_storage: + dependency: transitive + description: + name: safe_local_storage + sha256: "287ea1f667c0b93cdc127dccc707158e2d81ee59fba0459c31a0c7da4d09c755" + url: "https://pub.dev" + source: hosted + version: "2.0.3" + sanitize_html: + dependency: transitive + description: + name: sanitize_html + sha256: "12669c4a913688a26555323fb9cec373d8f9fbe091f2d01c40c723b33caa8989" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + screen_brightness: + dependency: "direct main" + description: + name: screen_brightness + sha256: "5f70754028f169f059fdc61112a19dcbee152f8b293c42c848317854d650cba3" + url: "https://pub.dev" + source: hosted + version: "2.1.7" + screen_brightness_android: + dependency: transitive + description: + name: screen_brightness_android + sha256: d34f5321abd03bc3474f4c381f53d189117eba0b039eac1916aa92cca5fd0a96 + url: "https://pub.dev" + source: hosted + version: "2.1.3" + screen_brightness_ios: + dependency: transitive + description: + name: screen_brightness_ios + sha256: "2493953340ecfe8f4f13f61db50ce72533a55b0bbd58ba1402893feecf3727f5" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + screen_brightness_macos: + dependency: transitive + description: + name: screen_brightness_macos + sha256: "4edf330ad21078686d8bfaf89413325fbaf571dcebe1e89254d675a3f288b5b9" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + screen_brightness_ohos: + dependency: transitive + description: + name: screen_brightness_ohos + sha256: a93a263dcd39b5c56e589eb495bcd001ce65cdd96ff12ab1350683559d5c5bb7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + screen_brightness_platform_interface: + dependency: transitive + description: + name: screen_brightness_platform_interface + sha256: "737bd47b57746bc4291cab1b8a5843ee881af499514881b0247ec77447ee769c" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + screen_brightness_windows: + dependency: transitive + description: + name: screen_brightness_windows + sha256: d3518bf0f5d7a884cee2c14449ae0b36803802866de09f7ef74077874b6b2448 + url: "https://pub.dev" + source: hosted + version: "2.1.0" + sembast: + dependency: transitive + description: + name: sembast + sha256: c8063c3146c3c8d5f5b04230de7682c768440a575fbda2634f14d22f263197c3 + url: "https://pub.dev" + source: hosted + version: "3.8.5+2" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf + url: "https://pub.dev" + source: hosted + version: "2.5.5" + shared_preferences_android: + dependency: "direct overridden" + description: + name: shared_preferences_android + sha256: "83af5c682796c0f7719c2bbf74792d113e40ae97981b8f266fa84574573556bc" + url: "https://pub.dev" + source: hosted + version: "2.4.18" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" + url: "https://pub.dev" + source: hosted + version: "2.5.6" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: "direct dev" + description: + name: shared_preferences_platform_interface + sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 + url: "https://pub.dev" + source: hosted + version: "2.4.3" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shelf: + dependency: "direct main" + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" + source: hosted + version: "1.1.3" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + simple_sparse_list: + dependency: transitive + description: + name: simple_sparse_list + sha256: aa648fd240fa39b49dcd11c19c266990006006de6699a412de485695910fbc1f + url: "https://pub.dev" + source: hosted + version: "0.1.4" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + smooth_page_indicator: + dependency: "direct main" + description: + name: smooth_page_indicator + sha256: "4b497e9898d095de40d246db943371183fa7482492a88391cfa8415ef94d57ba" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" + url: "https://pub.dev" + source: hosted + version: "0.10.13" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + sqflite: + dependency: "direct main" + description: + name: sqflite + sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: ecd684501ebc2ae9a83536e8b15731642b9570dc8623e0073d227d0ee2bfea88 + url: "https://pub.dev" + source: hosted + version: "2.4.2+2" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "6ef422a4525ecc601db6c0a2233ff448c731307906e92cabc9ba292afaae16a6" + url: "https://pub.dev" + source: hosted + version: "2.5.6" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + stack_trace: + dependency: "direct main" + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + streams_channel: + dependency: "direct main" + description: + path: "." + ref: HEAD + resolved-ref: "35a9b0fcc0e97f756756c0010fb223129c2d832c" + url: "https://github.com/deckerst/aves_streams_channel.git" + source: git + version: "0.3.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + sync_http: + dependency: transitive + description: + name: sync_http + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + synchronized: + dependency: "direct main" + description: + name: synchronized + sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 + url: "https://pub.dev" + source: hosted + version: "3.4.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test: + dependency: "direct dev" + description: + name: test + sha256: "65e29d831719be0591f7b3b1a32a3cda258ec98c58c7b25f7b84241bc31215bb" + url: "https://pub.dev" + source: hosted + version: "1.26.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + url: "https://pub.dev" + source: hosted + version: "0.7.6" + test_core: + dependency: transitive + description: + name: test_core + sha256: "80bf5a02b60af04b09e14f6fe68b921aad119493e26e490deaca5993fef1b05a" + url: "https://pub.dev" + source: hosted + version: "0.6.11" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + unicode: + dependency: transitive + description: + name: unicode + sha256: a6f7bcfc8ea1d5ce1f6c0b1c39117a9919f4953edd9fd7a64090a9796c499b57 + url: "https://pub.dev" + source: hosted + version: "1.1.9" + universal_platform: + dependency: transitive + description: + name: universal_platform + sha256: "64e16458a0ea9b99260ceb5467a214c1f298d647c659af1bff6d3bf82536b1ec" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + uri_parser: + dependency: transitive + description: + name: uri_parser + sha256: "051c62e5f693de98ca9f130ee707f8916e2266945565926be3ff20659f7853ce" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "3bb000251e55d4a209aa0e2e563309dc9bb2befea2295fd0cec1f51760aac572" + url: "https://pub.dev" + source: hosted + version: "6.3.29" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: cfde38aa257dae62ffe79c87fab20165dfdf6988c1d31b58ebf59b9106062aad + url: "https://pub.dev" + source: hosted + version: "6.3.6" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.dev" + source: hosted + version: "3.2.2" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + url: "https://pub.dev" + source: hosted + version: "3.2.5" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + uuid: + dependency: "direct main" + description: + name: uuid + sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" + url: "https://pub.dev" + source: hosted + version: "4.5.3" + vector_map_tiles: + dependency: "direct main" + description: + name: vector_map_tiles + sha256: e35f090c428f05e44dd525fa4fedaafd1dbcd28b656cb0ea908528c6ce84a87d + url: "https://pub.dev" + source: hosted + version: "9.0.0-beta.8" + vector_math: + dependency: "direct main" + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vector_tile: + dependency: transitive + description: + name: vector_tile + sha256: "7ae290246e3a8734422672dbe791d3f7b8ab631734489fc6d405f1cc2080e38c" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + vector_tile_dem: + dependency: transitive + description: + name: vector_tile_dem + sha256: "81a3568d2213817bd2698f919357e5107c0261491ae1014e821ed4fc3c2bf740" + url: "https://pub.dev" + source: hosted + version: "0.0.2" + vector_tile_renderer: + dependency: "direct main" + description: + name: vector_tile_renderer + sha256: "99530edb073c1cea3c6a4bdb5ca9a5c6779c25ddf1a645678458504708dc221c" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + video_player: + dependency: "direct main" + description: + name: video_player + sha256: "096bc28ce10d131be80dfb00c223024eb0fba301315a406728ab43dd99c45bdf" + url: "https://pub.dev" + source: hosted + version: "2.10.1" + video_player_android: + dependency: transitive + description: + name: video_player_android + sha256: "877a6c7ba772456077d7bfd71314629b3fe2b73733ce503fc77c3314d43a0ca0" + url: "https://pub.dev" + source: hosted + version: "2.9.5" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + sha256: d1eb970495a76abb35e5fa93ee3c58bd76fb6839e2ddf2fbb636674f2b971dd4 + url: "https://pub.dev" + source: hosted + version: "2.8.9" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + sha256: "16eaed5268c571c31840dc58ef8da5f0cd4db2a98490c3b8f1cf70122546c6e0" + url: "https://pub.dev" + source: hosted + version: "6.7.0" + video_player_web: + dependency: transitive + description: + name: video_player_web + sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" + url: "https://pub.dev" + source: hosted + version: "15.2.0" + volume_controller: + dependency: "direct main" + description: + name: volume_controller + sha256: ce25d4e02dd6f0b6d5d02dc1daa8de11b2d42d0f5afab8b1eda6aa0ebab3937a + url: "https://pub.dev" + source: hosted + version: "3.4.4" + wakelock_plus: + dependency: transitive + description: + name: wakelock_plus + sha256: "9296d40c9adbedaba95d1e704f4e0b434be446e2792948d0e4aa977048104228" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + wakelock_plus_platform_interface: + dependency: transitive + description: + name: wakelock_plus_platform_interface + sha256: "036deb14cd62f558ca3b73006d52ce049fabcdcb2eddfe0bf0fe4e8a943b5cf2" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: "direct main" + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + webdriver: + dependency: transitive + description: + name: webdriver + sha256: "2f3a14ca026957870cfd9c635b83507e0e51d8091568e90129fbf805aba7cade" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" + source: hosted + version: "5.15.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + wkt_parser: + dependency: transitive + description: + name: wkt_parser + sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: "direct main" + description: + name: xml + sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + url: "https://pub.dev" + source: hosted + version: "6.6.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.9.0 <4.0.0" + flutter: "3.35.7" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..368088b --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,153 @@ +name: aves +description: A visual media gallery and metadata explorer app. +repository: https://github.com/deckerst/aves +publish_to: none + +version: 1.14.0+164 + +environment: + flutter: 3.35.7 + sdk: ">=3.9.0 <4.0.0" + +workspace: + - plugins/aves_magnifier + - plugins/aves_map + - plugins/aves_model + - plugins/aves_report + - plugins/aves_report_crashlytics + - plugins/aves_screen_state + - plugins/aves_services + - plugins/aves_services_google + - plugins/aves_ui + - plugins/aves_utils + - plugins/aves_video + - plugins/aves_video_mpv + - plugins/google_cast + +dependencies: + flutter: + sdk: flutter + flutter_localizations: + sdk: flutter + + aves_magnifier: + path: plugins/aves_magnifier + aves_map: + path: plugins/aves_map + aves_model: + path: plugins/aves_model + aves_report: + path: plugins/aves_report + aves_report_platform: + path: plugins/aves_report_crashlytics + aves_screen_state: + path: plugins/aves_screen_state + aves_services: + path: plugins/aves_services + aves_services_platform: + path: plugins/aves_services_google + aves_video: + path: plugins/aves_video + aves_video_mpv: + path: plugins/aves_video_mpv + aves_ui: + path: plugins/aves_ui + aves_utils: + path: plugins/aves_utils + + google_cast: # ⭐ AGGIUNTO + path: plugins/google_cast + + charts_flutter: + git: + url: https://github.com/deckerst/flutter_google_charts.git + ref: aves + path: charts_flutter + + collection: + connectivity_plus: + country_code: + csv: + decorated_icon: + device_info_plus: + dynamic_color: + equatable: + event_bus: + expansion_tile_card: + git: + url: https://github.com/deckerst/expansion_tile_card.git + + flex_color_picker: + floating: + fluster: + flutter_displaymode: + flutter_highlight: + flutter_localizations_plus: + git: + url: https://github.com/deckerst/flutter_localizations_plus.git + flutter_map: + flutter_markdown_plus: + flutter_staggered_animations: + get_it: + gpx: + http: + intl: + latlong2: + leak_tracker: + local_auth: + material_design_icons_flutter: + material_symbols_icons: + network_info_plus: + overlay_support: + package_info_plus: + palette_generator: + panorama_viewer: ^2.0.7 + path: + pattern_lock: + pdf: + percent_indicator: + permission_handler: + pin_code_fields: ^8.0.1 + printing: + proj4dart: + provider: + screen_brightness: + shared_preferences: + shelf: + smooth_page_indicator: + sqflite: + stack_trace: + streams_channel: + git: + url: https://github.com/deckerst/aves_streams_channel.git + synchronized: + url_launcher: + vector_map_tiles: ^9.0.0-beta + vector_math: + vector_tile_renderer: + video_player: ^2.10.1 + volume_controller: + xml: + flutter_secure_storage: ^9.2.2 + web_socket_channel: ^3.0.1 + uuid: ^4.5.1 + + mime: any + highlight: any +dependency_overrides: + shared_preferences_android: 2.4.18 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_driver: + sdk: flutter + flutter_lints: + shared_preferences_platform_interface: + test: + +flutter: + assets: + - assets/ + generate: true + uses-material-design: true diff --git a/scripts/apply_flavor_izzy.sh b/scripts/apply_flavor_izzy.sh new file mode 100755 index 0000000..ac86e73 --- /dev/null +++ b/scripts/apply_flavor_izzy.sh @@ -0,0 +1,13 @@ +#!/bin/bash +if [ ! -d "scripts" ]; then + cd .. +fi + +PUBSPEC_PATH="pubspec.yaml" + +./flutterw clean + +sed -i 's|plugins/aves_services_.*|plugins/aves_services_google|g' "$PUBSPEC_PATH" +sed -i 's|plugins/aves_report_.*|plugins/aves_report_console|g' "$PUBSPEC_PATH" + +./flutterw pub get diff --git a/scripts/apply_flavor_libre.sh b/scripts/apply_flavor_libre.sh new file mode 100755 index 0000000..da614cf --- /dev/null +++ b/scripts/apply_flavor_libre.sh @@ -0,0 +1,13 @@ +#!/bin/bash +if [ ! -d "scripts" ]; then + cd .. +fi + +PUBSPEC_PATH="pubspec.yaml" + +./flutterw clean + +sed -i 's|plugins/aves_services_.*|plugins/aves_services_none|g' "$PUBSPEC_PATH" +sed -i 's|plugins/aves_report_.*|plugins/aves_report_console|g' "$PUBSPEC_PATH" + +./flutterw pub get diff --git a/scripts/apply_flavor_play.sh b/scripts/apply_flavor_play.sh new file mode 100755 index 0000000..1775ad3 --- /dev/null +++ b/scripts/apply_flavor_play.sh @@ -0,0 +1,13 @@ +#!/bin/bash +if [ ! -d "scripts" ]; then + cd .. +fi + +PUBSPEC_PATH="pubspec.yaml" + +./flutterw clean + +sed -i 's|plugins/aves_services_.*|plugins/aves_services_google|g' "$PUBSPEC_PATH" +sed -i 's|plugins/aves_report_.*|plugins/aves_report_crashlytics|g' "$PUBSPEC_PATH" + +./flutterw pub get diff --git a/scripts/extract_apks_libre.sh b/scripts/extract_apks_libre.sh new file mode 100755 index 0000000..67e97b4 --- /dev/null +++ b/scripts/extract_apks_libre.sh @@ -0,0 +1,28 @@ +#!/bin/bash +if [ ! -d "scripts" ]; then + cd .. +fi + +BUNDLE="/home/tibo/Downloads/app-libre-release.aab" +APKS_FULL="/home/tibo/Downloads/app-libre-release.apks" +APKS_STRIPPED="/home/tibo/Downloads/app-libre-release_stripped.apks" + +rm "$APKS_FULL" + +# shellcheck disable=SC2001 +OUTPUT=$(sed "s|\.aab|\.apks|" <<<"$BUNDLE") + +KEYS_PATH="android/key.properties" +STORE_PATH=$(sed -n 's|.*storeFile=\(.*\)[\r\n]|\1|p' "$KEYS_PATH") +# shellcheck disable=SC1003 +STORE_PW=$(sed -n 's|.*storePassword=\(.*\)[\r\n]|\1|p' "$KEYS_PATH" | sed 's|\\'\''|'\''|g') +KEY_ALIAS=$(sed -n 's|.*keyAlias=\(.*\)[\r\n]|\1|p' "$KEYS_PATH") +# shellcheck disable=SC1003 +KEY_PW=$(sed -n 's|.*keyPassword=\(.*\)[\r\n]|\1|p' "$KEYS_PATH" | sed 's|\\'\''|'\''|g') + +echo "$BUNDLE -> $OUTPUT" +bundletool build-apks --bundle="$BUNDLE" --output="$OUTPUT" \ + --ks="$STORE_PATH" --ks-pass="pass:$STORE_PW" \ + --ks-key-alias="$KEY_ALIAS" --key-pass="pass:$KEY_PW" + +../apkstripper "$APKS_FULL" "$APKS_STRIPPED" \ No newline at end of file diff --git a/scripts/extract_apks_play.sh b/scripts/extract_apks_play.sh new file mode 100755 index 0000000..7cec9fc --- /dev/null +++ b/scripts/extract_apks_play.sh @@ -0,0 +1,28 @@ +#!/bin/bash +if [ ! -d "scripts" ]; then + cd .. +fi + +BUNDLE="/home/tibo/Downloads/app-play-release.aab" +APKS_FULL="/home/tibo/Downloads/app-play-release.apks" +APKS_STRIPPED="/home/tibo/Downloads/app-play-release_stripped.apks" + +rm "$APKS_FULL" + +# shellcheck disable=SC2001 +OUTPUT=$(sed "s|\.aab|\.apks|" <<<"$BUNDLE") + +KEYS_PATH="android/key.properties" +STORE_PATH=$(sed -n 's|.*storeFile=\(.*\)[\r\n]|\1|p' "$KEYS_PATH") +# shellcheck disable=SC1003 +STORE_PW=$(sed -n 's|.*storePassword=\(.*\)[\r\n]|\1|p' "$KEYS_PATH" | sed 's|\\'\''|'\''|g') +KEY_ALIAS=$(sed -n 's|.*keyAlias=\(.*\)[\r\n]|\1|p' "$KEYS_PATH") +# shellcheck disable=SC1003 +KEY_PW=$(sed -n 's|.*keyPassword=\(.*\)[\r\n]|\1|p' "$KEYS_PATH" | sed 's|\\'\''|'\''|g') + +echo "$BUNDLE -> $OUTPUT" +bundletool build-apks --bundle="$BUNDLE" --output="$OUTPUT" \ + --ks="$STORE_PATH" --ks-pass="pass:$STORE_PW" \ + --ks-key-alias="$KEY_ALIAS" --key-pass="pass:$KEY_PW" + +../apkstripper "$APKS_FULL" "$APKS_STRIPPED" \ No newline at end of file diff --git a/scripts/fix_android_log_levels.bat b/scripts/fix_android_log_levels.bat new file mode 100644 index 0000000..d5a860b --- /dev/null +++ b/scripts/fix_android_log_levels.bat @@ -0,0 +1,43 @@ +@echo off +setlocal + +if defined ANDROID_SDK_ROOT (set sdk=%ANDROID_SDK_ROOT%) +if defined ANDROID_SDK (set sdk=%ANDROID_SDK%) +cd /d %sdk%\platform-tools + +@echo on + +adb.exe shell setprop persist.log.tag.ACodec WARN +adb.exe shell setprop persist.log.tag.AHierarchicalStateMachine ERROR +adb.exe shell setprop persist.log.tag.AudioCapabilities ERROR +adb.exe shell setprop persist.log.tag.AudioTrack INFO +adb.exe shell setprop persist.log.tag.BufferPoolAccessor2.0 INFO +adb.exe shell setprop persist.log.tag.CCodec INFO +adb.exe shell setprop persist.log.tag.CCodecBufferChannel INFO +adb.exe shell setprop persist.log.tag.CCodecBuffers INFO +adb.exe shell setprop persist.log.tag.CCodecConfig INFO +adb.exe shell setprop persist.log.tag.Codec2Client INFO +adb.exe shell setprop persist.log.tag.CompatibilityChangeReporter INFO +adb.exe shell setprop persist.log.tag.Counters WARN +adb.exe shell setprop persist.log.tag.CustomizedTextParser INFO +adb.exe shell setprop persist.log.tag.EGL_emulation INFO +adb.exe shell setprop persist.log.tag.HostConnection INFO +adb.exe shell setprop persist.log.tag.InputMethodManager WARN +adb.exe shell setprop persist.log.tag.InsetsSourceConsumer INFO +adb.exe shell setprop persist.log.tag.InputTransport INFO +adb.exe shell setprop persist.log.tag.J4A INFO +adb.exe shell setprop persist.log.tag.MediaCodec WARN +adb.exe shell setprop persist.log.tag.MediaMetadataRetriever INFO +adb.exe shell setprop persist.log.tag.MediaMetadataRetrieverJNI INFO +adb.exe shell setprop persist.log.tag.NativeTiffDecoder INFO +adb.exe shell setprop persist.log.tag.NuMediaExtractor INFO +adb.exe shell setprop persist.log.tag.PipelineWatcher INFO +adb.exe shell setprop persist.log.tag.ReflectedParamUpdater INFO +adb.exe shell setprop persist.log.tag.skia INFO +adb.exe shell setprop persist.log.tag.SurfaceControl WARN +adb.exe shell setprop persist.log.tag.SurfaceUtils INFO +adb.exe shell setprop persist.log.tag.SurfaceView WARN +adb.exe shell setprop persist.log.tag.VideoCapabilities ERROR + +@echo off +endlocal diff --git a/scripts/fix_android_log_levels.sh b/scripts/fix_android_log_levels.sh new file mode 100755 index 0000000..1a01224 --- /dev/null +++ b/scripts/fix_android_log_levels.sh @@ -0,0 +1,36 @@ +#!/bin/bash +adb shell setprop persist.log.tag.ACodec WARN +adb shell setprop persist.log.tag.AHierarchicalStateMachine ERROR +adb shell setprop persist.log.tag.AudioCapabilities ERROR +adb shell setprop persist.log.tag.AudioTrack INFO +adb shell setprop persist.log.tag.BufferPoolAccessor2.0 INFO +adb shell setprop persist.log.tag.CCodec INFO +adb shell setprop persist.log.tag.CCodecBufferChannel INFO +adb shell setprop persist.log.tag.CCodecBuffers INFO +adb shell setprop persist.log.tag.CCodecConfig INFO +adb shell setprop persist.log.tag.Codec2Client INFO +adb shell setprop persist.log.tag.CompatibilityChangeReporter INFO +adb shell setprop persist.log.tag.ConnectivityManager INFO +adb shell setprop persist.log.tag.Counters WARN +adb shell setprop persist.log.tag.CustomizedTextParser INFO +adb shell setprop persist.log.tag.EGL_emulation INFO +adb shell setprop persist.log.tag.ffmpeg-kit-flutter INFO +adb shell setprop persist.log.tag.HostConnection INFO +adb shell setprop persist.log.tag.InputMethodManager WARN +adb shell setprop persist.log.tag.InsetsSourceConsumer INFO +adb shell setprop persist.log.tag.InputTransport INFO +adb shell setprop persist.log.tag.J4A INFO +adb shell setprop persist.log.tag.MediaCodec WARN +adb shell setprop persist.log.tag.MediaMetadataRetriever INFO +adb shell setprop persist.log.tag.MediaMetadataRetrieverJNI INFO +adb shell setprop persist.log.tag.NativeTiffDecoder INFO +adb shell setprop persist.log.tag.NuMediaExtractor INFO +adb shell setprop persist.log.tag.OpenGLRenderer INFO +adb shell setprop persist.log.tag.PipelineWatcher INFO +adb shell setprop persist.log.tag.ReflectedParamUpdater INFO +adb shell setprop persist.log.tag.skia INFO +adb shell setprop persist.log.tag.SurfaceControl WARN +adb shell setprop persist.log.tag.SurfaceUtils INFO +adb shell setprop persist.log.tag.SurfaceView WARN +adb shell setprop persist.log.tag.VideoCapabilities ERROR + diff --git a/scripts/screenshot_post_process.sh b/scripts/screenshot_post_process.sh new file mode 100755 index 0000000..5472c34 --- /dev/null +++ b/scripts/screenshot_post_process.sh @@ -0,0 +1,87 @@ +#!/bin/bash +if [ ! -d "scripts" ]; then + cd .. +fi + +# process raw screenshots from test driver to generate: +# - scaled down versions for IzzyOnDroid +# - framed versions for Google Play +# - framed and scaled down versions for README (English only) + +# expects: +# - ImageMagick 6 +# - raw screenshots sized at 1080x2520 (21∶9) in `/screenshots/raw` + +DEVICE_OVERLAY_LTR=~/code/aves_extra/screenshots/device_overlay_ltr.png +DEVICE_OVERLAY_RTL=~/code/aves_extra/screenshots/device_overlay_rtl.png +DEVICE_FRAME=~/code/aves_extra/screenshots/device_frame_1142x2650_for_1080x2520.png +# FRAME_SIZE: dimensions of DEVICE_FRAME +FRAME_SIZE=1142x2650 +# FRAME_OFFSET: offset for content in DEVICE_FRAME +FRAME_OFFSET=31x53 +# PLAY_SIZE: contain FRAME_SIZE in 9:16 +PLAY_SIZE=1490x2650 + +cd screenshots || exit + +# add Android system overlay +for source in raw/*/*; do + if [[ -f "$source" ]]; then + target=${source/raw/overlay} + echo "$source -> $target" + mkdir -p "$(dirname "$target")" + locale="$(basename "$(dirname "$source")")" + [[ $locale = "ar" || $locale = "fa" ]] && overlay="$DEVICE_OVERLAY_RTL" || overlay="$DEVICE_OVERLAY_LTR" + convert "$source" $overlay -composite "$target" + fi +done + +# izzy: scale down + fastlane folder structure +for source in overlay/*/*; do + if [[ -f "$source" ]]; then + target=$(echo "$source" | sed -e 's/overlay\/\(.*\)\//izzy\/\1\/images\/phoneScreenshots\//g') + echo "$source -> $target" + mkdir -p "$(dirname "$target")" + convert -resize 350x "$source" "$target" + fi +done +mv izzy/en izzy/en-US +mv izzy/en_Shaw izzy/en-XW-Shaw +mv izzy/es izzy/es-MX +mv izzy/nb izzy/nb-NO +mv izzy/pt izzy/pt-BR +mv izzy/zh izzy/zh-CN +mv izzy/zh_Hant izzy/zh-Hant + +# play: add device frame +for source in overlay/*/*; do + if [[ -f "$source" ]]; then + target=${source/overlay/framed} + echo "$source -> $target" + mkdir -p "$(dirname "$target")" + convert "$source" -background transparent -splice $FRAME_OFFSET -extent $FRAME_SIZE $DEVICE_FRAME -composite "$target" + fi +done + +# play: fix aspect ratio +for source in framed/*/*; do + if [[ -f "$source" ]]; then + target=${source/framed/play} + echo "$source -> $target" + mkdir -p "$(dirname "$target")" + convert "$source" -gravity center -background transparent -extent $PLAY_SIZE "$target" + fi +done +mv play/nb play/no-NO +mv play/zh play/zh-CN +mv play/zh_Hant play/zh-TW + +# readme: scale down +for source in framed/en/*; do + if [[ -f "$source" ]]; then + target=${source/framed/readme} + echo "$source -> $target" + mkdir -p "$(dirname "$target")" + convert -resize 250x "$source" "$target" + fi +done diff --git a/test-server.js b/test-server.js new file mode 100644 index 0000000..3c86f36 --- /dev/null +++ b/test-server.js @@ -0,0 +1,30 @@ +import https from 'https'; + +const url = 'https://prova.patachina.it/photos/'; + +// 🔥 METTI QUI IL TUO TOKEN +const token = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoicHJvdmFtaSIsImlhdCI6MTc3NTg1Nzk2MCwiZXhwIjoxODA3MzkzOTYwfQ.Jysn-9bhDNREZAOfeZa7OkTtSVZYPGE0UYVRYvmajBM"; + +const options = { + method: 'GET', + headers: { + 'Authorization': token + } +}; + +console.log('Requesting:', url); +console.log('Headers:', options.headers); + +https.get(url, options, (res) => { + console.log('STATUS:', res.statusCode); + console.log('HEADERS:', res.headers); + + let data = ''; + res.on('data', chunk => data += chunk); + res.on('end', () => { + console.log('BODY (first 300 chars):'); + console.log(data.slice(0, 300)); + }); +}).on('error', (err) => { + console.error('ERROR:', err); +}); diff --git a/test/common.dart b/test/common.dart new file mode 100644 index 0000000..dd48cbb --- /dev/null +++ b/test/common.dart @@ -0,0 +1,67 @@ +import 'package:aves/model/availability.dart'; +import 'package:aves/model/db/db.dart'; +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/app_service.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/device_service.dart'; +import 'package:aves/services/media/media_fetch_service.dart'; +import 'package:aves/services/media/media_store_service.dart'; +import 'package:aves/services/metadata/metadata_fetch_service.dart'; +import 'package:aves/services/storage_service.dart'; +import 'package:aves/services/window_service.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves_report/aves_report.dart'; +import 'package:path/path.dart' as p; +import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart'; + +import 'fake/android_app_service.dart'; +import 'fake/availability.dart'; +import 'fake/db.dart'; +import 'fake/device_service.dart'; +import 'fake/media_fetch_service.dart'; +import 'fake/media_store_service.dart'; +import 'fake/metadata_fetch_service.dart'; +import 'fake/report_service.dart'; +import 'fake/storage_service.dart'; +import 'fake/window_service.dart'; + +Future<void> setUpAllServices() async { + // specify Posix style path context for consistent behaviour when running tests on Windows + getIt.registerLazySingleton<p.Context>(() => p.Context(style: p.Style.posix)); + getIt.registerLazySingleton<AvesAvailability>(FakeAvesAvailability.new); + getIt.registerLazySingleton<LocalMediaDb>(FakeAvesDb.new); + + getIt.registerLazySingleton<AppService>(FakeAppService.new); + getIt.registerLazySingleton<DeviceService>(FakeDeviceService.new); + getIt.registerLazySingleton<MediaFetchService>(FakeMediaFetchService.new); + getIt.registerLazySingleton<MediaStoreService>(FakeMediaStoreService.new); + getIt.registerLazySingleton<MetadataFetchService>(FakeMetadataFetchService.new); + getIt.registerLazySingleton<ReportService>(FakeReportService.new); + getIt.registerLazySingleton<StorageService>(FakeStorageService.new); + getIt.registerLazySingleton<WindowService>(FakeWindowService.new); + + SharedPreferencesStorePlatform.instance = InMemorySharedPreferencesStore.empty(); + await settings.init(monitorPlatformSettings: false, shouldSanitize: false); + await androidFileUtils.init(); + + albumGrouping.init(); + tagGrouping.init(); +} + +Future<void> setUpServices() async { + (getIt<MediaStoreService>() as FakeMediaStoreService).reset(); + + await settings.reset(includeInternalKeys: true); + settings.canUseAnalysisService = false; + + albumGrouping.setGroups({}); + tagGrouping.setGroups({}); + + await dynamicAlbums.clear(); +} + +Future<void> tearDownAllServices() async { + await getIt.reset(); +} diff --git a/test/fake/android_app_service.dart b/test/fake/android_app_service.dart new file mode 100644 index 0000000..f9e5052 --- /dev/null +++ b/test/fake/android_app_service.dart @@ -0,0 +1,9 @@ +import 'package:aves/model/app_inventory.dart'; +import 'package:aves/services/app_service.dart'; +import 'package:flutter/foundation.dart'; +import 'package:test/fake.dart'; + +class FakeAppService extends Fake implements AppService { + @override + Future<Set<Package>> getPackages() => SynchronousFuture({}); +} diff --git a/test/fake/availability.dart b/test/fake/availability.dart new file mode 100644 index 0000000..b92e630 --- /dev/null +++ b/test/fake/availability.dart @@ -0,0 +1,8 @@ +import 'package:aves/model/availability.dart'; +import 'package:flutter/foundation.dart'; +import 'package:test/fake.dart'; + +class FakeAvesAvailability extends Fake implements AvesAvailability { + @override + Future<bool> get canLocatePlaces => SynchronousFuture(false); +} diff --git a/test/fake/db.dart b/test/fake/db.dart new file mode 100644 index 0000000..baf8c5b --- /dev/null +++ b/test/fake/db.dart @@ -0,0 +1,135 @@ +import 'package:aves/model/covers.dart'; +import 'package:aves/model/db/db.dart'; +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/metadata/address.dart'; +import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/metadata/trash.dart'; +import 'package:aves/model/vaults/details.dart'; +import 'package:flutter/foundation.dart'; +import 'package:test/fake.dart'; + +class FakeAvesDb extends Fake implements LocalMediaDb { + static int _lastId = 0; + + @override + int get nextId => ++_lastId; + + @override + Future<void> init() => SynchronousFuture(null); + + @override + Future<void> removeIds(Set<int> ids, {Set<EntryDataType>? dataTypes}) => SynchronousFuture(null); + + // entries + + @override + Future<Set<AvesEntry>> loadEntries({int? origin, String? directory}) => SynchronousFuture({}); + + @override + Future<void> insertEntries(Set<AvesEntry> entries) => SynchronousFuture(null); + + @override + Future<void> updateEntry(int id, AvesEntry entry) => SynchronousFuture(null); + + @override + Future<Set<AvesEntry>> searchLiveDuplicates(int origin, Set<AvesEntry>? entries) => SynchronousFuture({}); + + // date taken + + @override + Future<void> clearDates() => SynchronousFuture(null); + + @override + Future<Map<int?, int?>> loadDates() => SynchronousFuture({}); + + // catalog metadata + + @override + Future<void> clearCatalogMetadata() => SynchronousFuture(null); + + @override + Future<Set<CatalogMetadata>> loadCatalogMetadata() => SynchronousFuture({}); + + @override + Future<void> saveCatalogMetadata(Set<CatalogMetadata> metadataEntries) => SynchronousFuture(null); + + @override + Future<void> updateCatalogMetadata(int id, CatalogMetadata? metadata) => SynchronousFuture(null); + + // address + + @override + Future<Set<AddressDetails>> loadAddresses() => SynchronousFuture({}); + + @override + Future<void> saveAddresses(Set<AddressDetails> addresses) => SynchronousFuture(null); + + @override + Future<void> updateAddress(int id, AddressDetails? address) => SynchronousFuture(null); + + // vaults + + @override + Future<Set<VaultDetails>> loadAllVaults() => SynchronousFuture({}); + + // trash + + @override + Future<void> clearTrashDetails() => SynchronousFuture(null); + + @override + Future<Set<TrashDetails>> loadAllTrashDetails() => SynchronousFuture({}); + + @override + Future<void> updateTrash(int id, TrashDetails? details) => SynchronousFuture(null); + + // favourites + + @override + Future<Set<FavouriteRow>> loadAllFavourites() => SynchronousFuture({}); + + @override + Future<void> addFavourites(Set<FavouriteRow> rows) => SynchronousFuture(null); + + @override + Future<void> updateFavouriteId(int id, FavouriteRow row) => SynchronousFuture(null); + + @override + Future<void> removeFavourites(Set<FavouriteRow> rows) => SynchronousFuture(null); + + // covers + + @override + Future<Set<CoverRow>> loadAllCovers() => SynchronousFuture({}); + + @override + Future<void> addCovers(Set<CoverRow> rows) => SynchronousFuture(null); + + @override + Future<void> updateCoverEntryId(int id, CoverRow row) => SynchronousFuture(null); + + @override + Future<void> removeCovers(Set<CollectionFilter> filters) => SynchronousFuture(null); + + @override + Future<Set<DynamicAlbumRow>> loadAllDynamicAlbums() => SynchronousFuture({}); + + // dynamic albums + + @override + Future<int> clearDynamicAlbums() => SynchronousFuture(0); + + @override + Future<void> addDynamicAlbums(Set<DynamicAlbumRow> rows) => SynchronousFuture(null); + + @override + Future<void> removeDynamicAlbums(Set<String> names) => SynchronousFuture(null); + + // video playback + + @override + Future<void> removeVideoPlayback(Set<int> ids) => SynchronousFuture(null); +} diff --git a/test/fake/device_service.dart b/test/fake/device_service.dart new file mode 100644 index 0000000..07705e2 --- /dev/null +++ b/test/fake/device_service.dart @@ -0,0 +1,11 @@ +import 'package:aves/services/device_service.dart'; +import 'package:flutter/foundation.dart'; +import 'package:test/fake.dart'; + +class FakeDeviceService extends Fake implements DeviceService { + @override + Future<int> getAvailableHeapSize() => SynchronousFuture(0x7fffffff); + + @override + Future<void> requestGarbageCollection() => SynchronousFuture(null); +} diff --git a/test/fake/media_fetch_service.dart b/test/fake/media_fetch_service.dart new file mode 100644 index 0000000..9b18b6e --- /dev/null +++ b/test/fake/media_fetch_service.dart @@ -0,0 +1,13 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/services/media/media_fetch_service.dart'; +import 'package:collection/collection.dart'; +import 'package:test/fake.dart'; + +class FakeMediaFetchService extends Fake implements MediaFetchService { + Set<AvesEntry> entries = {}; + + @override + Future<AvesEntry?> getEntry(String uri, String? mimeType, {bool allowUnsized = false}) async { + return entries.firstWhereOrNull((v) => v.uri == uri); + } +} diff --git a/test/fake/media_store_service.dart b/test/fake/media_store_service.dart new file mode 100644 index 0000000..0d1ecda --- /dev/null +++ b/test/fake/media_store_service.dart @@ -0,0 +1,103 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/entry/extensions/keys.dart'; +import 'package:aves/model/entry/origins.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/services/common/image_op_events.dart'; +import 'package:aves/services/media/media_store_service.dart'; +import 'package:test/fake.dart'; + +class FakeMediaStoreService extends Fake implements MediaStoreService { + late Set<AvesEntry> entries; + Duration? latency; + + void reset() { + entries = {}; + latency = null; + } + + @override + Future<List<int>> checkObsoleteContentIds(List<int?> knownContentIds) async { + if (latency != null) await Future.delayed(latency!); + return []; + } + + @override + Future<List<int>> checkObsoletePaths(Map<int?, String?> knownPathById) async { + if (latency != null) await Future.delayed(latency!); + return []; + } + + @override + Future<int?> getGeneration() async { + if (latency != null) await Future.delayed(latency!); + return 0; + } + + @override + Stream<AvesEntry> getEntries(Map<int?, int?> knownEntries, {String? directory}) => Stream.fromIterable(entries); + + static var _lastId = 1; + + static int get nextId => _lastId++; + + static int get dateMillis => DateTime.now().millisecondsSinceEpoch; + + static AvesEntry newImage(String album, String filenameWithoutExtension, {int? id, int? contentId}) { + id ??= nextId; + contentId ??= id; + final _dateMillis = dateMillis; + final _dateSecs = _dateMillis ~/ 1000; + return AvesEntry( + origin: EntryOrigins.mediaStoreContent, + id: id, + uri: 'content://media/external/images/media/$contentId', + path: '$album/$filenameWithoutExtension.jpg', + contentId: contentId, + pageId: null, + sourceMimeType: MimeTypes.jpeg, + width: 360, + height: 720, + sourceRotationDegrees: 0, + sizeBytes: 42, + sourceTitle: filenameWithoutExtension, + dateAddedSecs: _dateSecs, + dateModifiedMillis: _dateMillis, + sourceDateTakenMillis: _dateMillis, + durationMillis: null, + trashed: false, + ); + } + + static MoveOpEvent moveOpEventForMove(AvesEntry entry, String sourceAlbum, String destinationAlbum) { + final newContentId = nextId; + return MoveOpEvent( + success: true, + skipped: false, + uri: entry.uri, + newFields: { + EntryFields.uri: 'content://media/external/images/media/$newContentId', + EntryFields.contentId: newContentId, + EntryFields.path: entry.path!.replaceFirst(sourceAlbum, destinationAlbum), + EntryFields.dateModifiedMillis: FakeMediaStoreService.dateMillis, + }, + deleted: false, + ); + } + + static MoveOpEvent moveOpEventForRename(AvesEntry entry, String newName) { + final newContentId = nextId; + final oldName = entry.filenameWithoutExtension!; + return MoveOpEvent( + success: true, + skipped: false, + uri: entry.uri, + newFields: { + EntryFields.uri: 'content://media/external/images/media/$newContentId', + EntryFields.contentId: newContentId, + EntryFields.path: entry.path!.replaceFirst(oldName, newName), + EntryFields.dateModifiedMillis: FakeMediaStoreService.dateMillis, + }, + deleted: false, + ); + } +} diff --git a/test/fake/metadata_fetch_service.dart b/test/fake/metadata_fetch_service.dart new file mode 100644 index 0000000..125ac4d --- /dev/null +++ b/test/fake/metadata_fetch_service.dart @@ -0,0 +1,14 @@ +import 'package:aves/model/entry/entry.dart'; +import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/services/metadata/metadata_fetch_service.dart'; +import 'package:flutter/foundation.dart'; +import 'package:test/fake.dart'; + +class FakeMetadataFetchService extends Fake implements MetadataFetchService { + final Map<AvesEntry, CatalogMetadata> _metaMap = {}; + + void setUp(AvesEntry entry, CatalogMetadata metadata) => _metaMap[entry] = metadata; + + @override + Future<CatalogMetadata?> getCatalogMetadata(AvesEntry entry, {bool background = false}) => SynchronousFuture(_metaMap[entry]); +} diff --git a/test/fake/report_service.dart b/test/fake/report_service.dart new file mode 100644 index 0000000..a7a8f99 --- /dev/null +++ b/test/fake/report_service.dart @@ -0,0 +1,28 @@ +import 'package:aves_report/aves_report.dart'; +import 'package:flutter/foundation.dart'; + +class FakeReportService extends ReportService { + @override + Future<void> init() => SynchronousFuture(null); + + @override + Map<String, String> get state => {}; + + @override + Future<void> setCollectionEnabled(bool enabled) => SynchronousFuture(null); + + @override + Future<void> log(String message) => SynchronousFuture(null); + + @override + Future<void> setCustomKey(String key, Object value) => SynchronousFuture(null); + + @override + Future<void> setCustomKeys(Map<String, Object> map) => SynchronousFuture(null); + + @override + Future<void> recordError(dynamic exception, [StackTrace? stack]) => SynchronousFuture(null); + + @override + Future<void> recordFlutterError(FlutterErrorDetails flutterErrorDetails) => SynchronousFuture(null); +} diff --git a/test/fake/storage_service.dart b/test/fake/storage_service.dart new file mode 100644 index 0000000..2e1eed2 --- /dev/null +++ b/test/fake/storage_service.dart @@ -0,0 +1,36 @@ +import 'package:aves_model/aves_model.dart'; +import 'package:aves/services/storage_service.dart'; +import 'package:flutter/foundation.dart'; +import 'package:test/fake.dart'; + +class FakeStorageService extends Fake implements StorageService { + static const primaryRootAlbum = '/storage/emulated/0'; + static const primaryPath = '$primaryRootAlbum/'; + static const primaryDescription = 'Internal Storage'; + static const removablePath = '/storage/1234-5678/'; + static const removableDescription = 'SD Card'; + + @override + Future<Set<StorageVolume>> getStorageVolumes() => SynchronousFuture({ + const StorageVolume( + path: primaryPath, + description: primaryDescription, + isPrimary: true, + isRemovable: false, + state: 'fake', + ), + const StorageVolume( + path: removablePath, + description: removableDescription, + isPrimary: false, + isRemovable: true, + state: 'fake', + ), + }); + + @override + Future<Set<String>> getUntrackedTrashPaths(Iterable<String> knownPaths) => SynchronousFuture({}); + + @override + Future<String> getVaultRoot() => SynchronousFuture('/vault/'); +} diff --git a/test/fake/window_service.dart b/test/fake/window_service.dart new file mode 100644 index 0000000..c5da268 --- /dev/null +++ b/test/fake/window_service.dart @@ -0,0 +1,42 @@ +import 'package:aves/services/window_service.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:test/fake.dart'; + +class FakeWindowService extends Fake implements WindowService { + @override + Future<bool> isActivity() => SynchronousFuture(true); + + @override + Future<void> keepScreenOn(bool on) => SynchronousFuture(null); + + @override + Future<bool> isInMultiWindowMode() => SynchronousFuture(false); + + @override + Future<bool> isInPictureInPictureMode() => SynchronousFuture(false); + + @override + Future<bool> isRotationLocked() => SynchronousFuture(false); + + @override + Future<int> getOrientation() => SynchronousFuture(0); + + @override + Future<void> requestOrientation([Orientation? orientation]) => SynchronousFuture(null); + + @override + Future<bool> isCutoutAware() => SynchronousFuture(true); + + @override + Future<EdgeInsets> getCutoutInsets() => SynchronousFuture(EdgeInsets.zero); + + @override + Future<bool> supportsHdr() => SynchronousFuture(false); + + @override + Future<void> setColorMode({required bool wideColorGamut, required bool hdr}) => SynchronousFuture(null); + + @override + Future<bool> startGlobalDrag(String uri, String? label, Size shadowSize, Uint8List shadowBytes) => SynchronousFuture(false); +} diff --git a/test/geo/countries_test.dart b/test/geo/countries_test.dart new file mode 100644 index 0000000..c1dda96 --- /dev/null +++ b/test/geo/countries_test.dart @@ -0,0 +1,35 @@ +import 'package:aves/geo/countries.dart'; +import 'package:aves/geo/topojson.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:latlong2/latlong.dart'; + +void main() { + // [lng, lat, z] + const buenosAires = [-58.381667, -34.603333]; + const paris = [2.348777, 48.875683]; + const seoul = [126.99, 37.56, 42.0]; + const argentinaN3String = '032'; + const franceN3String = '250'; + const southKoreaN3String = '410'; + + test('Parse countries', () async { + TestWidgetsFlutterBinding.ensureInitialized(); + final topo = await countryTopology.getTopology(); + expect(topo != null, true); + if (topo == null) return; + + final countries = topo.objects['countries'] as GeometryCollection; + + final argentina = countries.geometries.firstWhere((geometry) => geometry.id == argentinaN3String); + expect(argentina.properties!['name'], 'Argentina'); + expect(argentina.containsPoint(topo, buenosAires), true); + expect(argentina.containsPoint(topo, seoul), false); + }); + + test('Get country id', () async { + TestWidgetsFlutterBinding.ensureInitialized(); + expect(await countryTopology.numericCode(LatLng(buenosAires[1], buenosAires[0])), int.parse(argentinaN3String)); + expect(await countryTopology.numericCode(LatLng(seoul[1], seoul[0])), int.parse(southKoreaN3String)); + expect(await countryTopology.numericCode(LatLng(paris[1], paris[0])), int.parse(franceN3String)); + }); +} diff --git a/test/geo/topojson_test.dart b/test/geo/topojson_test.dart new file mode 100644 index 0000000..9606a3e --- /dev/null +++ b/test/geo/topojson_test.dart @@ -0,0 +1,122 @@ +import 'package:aves/geo/topojson.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + const example1 = ''' +{ + "type": "Topology", + "objects": { + "example": { + "type": "GeometryCollection", + "geometries": [ + { + "type": "Point", + "properties": { + "prop0": "value0" + }, + "coordinates": [102, 0.5] + }, + { + "type": "LineString", + "properties": { + "prop0": "value0", + "prop1": 0 + }, + "arcs": [0] + }, + { + "type": "Polygon", + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + }, + "arcs": [[-2]] + } + ] + } + }, + "arcs": [ + [[102, 0], [103, 1], [104, 0], [105, 1]], + [[100, 0], [101, 0], [101, 1], [100, 1], [100, 0]] + ] +} +'''; + + const example1Quantized = ''' +{ + "type": "Topology", + "transform": { + "scale": [0.0005000500050005, 0.00010001000100010001], + "translate": [100, 0] + }, + "objects": { + "example": { + "type": "GeometryCollection", + "geometries": [ + { + "type": "Point", + "properties": { + "prop0": "value0" + }, + "coordinates": [4000, 5000] + }, + { + "type": "LineString", + "properties": { + "prop0": "value0", + "prop1": 0 + }, + "arcs": [0] + }, + { + "type": "Polygon", + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + }, + "arcs": [[1]] + } + ] + } + }, + "arcs": [ + [[4000, 0], [1999, 9999], [2000, -9999], [2000, 9999]], + [[0, 0], [0, 9999], [2000, 0], [0, -9999], [-2000, 0]] + ] +} +'''; + + test('parse example', () async { + final topo = await TopoJson().parse(example1); + expect(topo != null, true); + if (topo == null) return; + + expect(topo.objects.containsKey('example'), true); + + final exampleObj = topo.objects['example'] as GeometryCollection; + expect(exampleObj.geometries.length, 3); + + final point = exampleObj.geometries[0] as Point; + expect(point.coordinates, [102, 0.5]); + + final lineString = exampleObj.geometries[1] as LineString; + expect(lineString.arcs, [0]); + + final polygon = exampleObj.geometries[2] as Polygon; + expect(polygon.arcs.first, [-2]); + expect(polygon.properties!.containsKey('prop0'), true); + }); + + test('parse quantized example', () async { + final topo = await TopoJson().parse(example1Quantized); + expect(topo != null, true); + if (topo == null) return; + + expect(topo.arcs.first.first, [4000, 0]); + expect(topo.transform!.scale, [0.0005000500050005, 0.00010001000100010001]); + }); +} diff --git a/test/model/collection_source_test.dart b/test/model/collection_source_test.dart new file mode 100644 index 0000000..eb9fcc3 --- /dev/null +++ b/test/model/collection_source_test.dart @@ -0,0 +1,391 @@ +import 'dart:async'; + +import 'package:aves/l10n/l10n.dart'; +import 'package:aves/model/covers.dart'; +import 'package:aves/model/entry/extensions/favourites.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/grouping/convert.dart'; +import 'package:aves/model/metadata/address.dart'; +import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/media_store_source.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:latlong2/latlong.dart'; + +import '../common.dart'; +import '../fake/media_fetch_service.dart'; +import '../fake/media_store_service.dart'; +import '../fake/metadata_fetch_service.dart'; +import '../fake/storage_service.dart'; + +void main() { + const testAlbum = '${FakeStorageService.primaryPath}Pictures/test'; + const sourceAlbum = '${FakeStorageService.primaryPath}Pictures/source'; + const destinationAlbum = '${FakeStorageService.primaryPath}Pictures/destination'; + + const aTag = 'sometag'; + const australiaLatLng = LatLng(-26, 141); + const australiaAddress = AddressDetails( + id: 0, + countryCode: 'AU', + countryName: 'AUS', + ); + + setUpAll(() async { + await setUpAllServices(); + }); + + setUp(() async { + await setUpServices(); + }); + + tearDownAll(() async { + await tearDownAllServices(); + }); + + Future<MediaStoreSource> _initSource() async { + final source = MediaStoreSource(); + final readyCompleter = Completer(); + source.stateNotifier.addListener(() { + if (source.isReady) { + readyCompleter.complete(); + } + }); + await source.init(scope: CollectionSource.fullScope); + await readyCompleter.future; + return source; + } + + test('initial load v. refresh race condition', () async { + const latency = Duration(milliseconds: 100); + + final loadEntry = FakeMediaStoreService.newImage(testAlbum, 'image1', id: -1, contentId: 1); + final refreshEntry = FakeMediaStoreService.newImage(testAlbum, 'image1', id: -1, contentId: 1); + (mediaStoreService as FakeMediaStoreService) + ..entries = {loadEntry} + ..latency = latency; + (mediaFetchService as FakeMediaFetchService).entries = {refreshEntry}; + + final source = MediaStoreSource(); + unawaited(source.init(scope: CollectionSource.fullScope)); + await Future.delayed(const Duration(milliseconds: 10)); + expect(source.targetScope, CollectionSource.fullScope); + await source.refreshUris({refreshEntry.uri}); + + await Future.delayed(const Duration(seconds: 1)); + expect(source.allEntries.length, 1); + }); + + test('album/country/tag hidden on launch when their items are hidden by entry prop', () async { + settings.hiddenFilters = {StoredAlbumFilter(testAlbum, 'whatever')}; + + final image1 = FakeMediaStoreService.newImage(testAlbum, 'image1'); + (mediaStoreService as FakeMediaStoreService).entries = { + image1, + }; + (metadataFetchService as FakeMetadataFetchService).setUp( + image1, + CatalogMetadata( + id: image1.id, + xmpSubjects: aTag, + latitude: australiaLatLng.latitude, + longitude: australiaLatLng.longitude, + ), + ); + + final source = await _initSource(); + expect(source.rawAlbums.length, 0); + expect(source.sortedCountries.length, 0); + expect(source.sortedTags.length, 0); + }); + + test('album/country/tag hidden on launch when their items are hidden by metadata', () async { + settings.hiddenFilters = {TagFilter(aTag)}; + + final image1 = FakeMediaStoreService.newImage(testAlbum, 'image1'); + (mediaStoreService as FakeMediaStoreService).entries = { + image1, + }; + (metadataFetchService as FakeMetadataFetchService).setUp( + image1, + CatalogMetadata( + id: image1.id, + xmpSubjects: aTag, + latitude: australiaLatLng.latitude, + longitude: australiaLatLng.longitude, + ), + ); + expect(image1.tags, <String>{}); + + final source = await _initSource(); + expect(image1.tags, {aTag}); + expect(image1.addressDetails, australiaAddress.copyWith(id: image1.id)); + + expect(source.visibleEntries.length, 0); + expect(source.rawAlbums.length, 0); + expect(source.sortedCountries.length, 0); + expect(source.sortedTags.length, 0); + }); + + test('add/remove favourite entry', () async { + final image1 = FakeMediaStoreService.newImage(testAlbum, 'image1'); + (mediaStoreService as FakeMediaStoreService).entries = { + image1, + }; + + await _initSource(); + expect(favourites.count, 0); + + await image1.toggleFavourite(); + expect(favourites.count, 1); + expect(image1.isFavourite, true); + + await image1.toggleFavourite(); + expect(favourites.count, 0); + expect(image1.isFavourite, false); + }); + + test('set/unset entry as album cover', () async { + final image1 = FakeMediaStoreService.newImage(testAlbum, 'image1'); + (mediaStoreService as FakeMediaStoreService).entries = { + image1, + }; + + final source = await _initSource(); + expect(source.rawAlbums.length, 1); + expect(covers.count, 0); + + final albumFilter = StoredAlbumFilter(testAlbum, 'whatever'); + expect(albumFilter.test(image1), true); + expect(covers.count, 0); + expect(covers.of(albumFilter), null); + + await covers.set(filter: albumFilter, entryId: image1.id, packageName: null, color: null); + expect(covers.count, 1); + expect(covers.of(albumFilter)?.$1, image1.id); + + await covers.set(filter: albumFilter, entryId: null, packageName: null, color: null); + expect(covers.count, 0); + expect(covers.of(albumFilter), null); + }); + + test('favourites and covers are kept when renaming entries', () async { + final image1 = FakeMediaStoreService.newImage(testAlbum, 'image1'); + (mediaStoreService as FakeMediaStoreService).entries = { + image1, + }; + + final source = await _initSource(); + await image1.toggleFavourite(); + final albumFilter = StoredAlbumFilter(testAlbum, 'whatever'); + await covers.set(filter: albumFilter, entryId: image1.id, packageName: null, color: null); + await source.updateAfterRename( + todoEntries: {image1}, + movedOps: { + FakeMediaStoreService.moveOpEventForRename(image1, 'image1b.jpg'), + }, + persist: true, + ); + + expect(favourites.count, 1); + expect(image1.isFavourite, true); + expect(covers.count, 1); + expect(covers.of(albumFilter)?.$1, image1.id); + }); + + test('favourites and covers are cleared when removing entries', () async { + final image1 = FakeMediaStoreService.newImage(testAlbum, 'image1'); + (mediaStoreService as FakeMediaStoreService).entries = { + image1, + }; + + final source = await _initSource(); + await image1.toggleFavourite(); + final albumFilter = StoredAlbumFilter(image1.directory!, 'whatever'); + await covers.set(filter: albumFilter, entryId: image1.id, packageName: null, color: null); + await source.removeEntries({image1.uri}, includeTrash: true); + + expect(source.rawAlbums.length, 0); + expect(favourites.count, 0); + expect(covers.count, 0); + expect(covers.of(albumFilter), null); + }); + + test('albums are updated when moving entries', () async { + final image1 = FakeMediaStoreService.newImage(sourceAlbum, 'image1'); + (mediaStoreService as FakeMediaStoreService).entries = { + image1, + }; + + final source = await _initSource(); + expect(source.rawAlbums.contains(sourceAlbum), true); + expect(source.rawAlbums.contains(destinationAlbum), false); + + final sourceAlbumFilter = StoredAlbumFilter(sourceAlbum, 'whatever'); + final destinationAlbumFilter = StoredAlbumFilter(destinationAlbum, 'whatever'); + expect(sourceAlbumFilter.test(image1), true); + expect(destinationAlbumFilter.test(image1), false); + + await source.updateAfterMove( + todoEntries: {image1}, + moveType: MoveType.move, + destinationAlbums: {destinationAlbum}, + movedOps: { + FakeMediaStoreService.moveOpEventForMove(image1, sourceAlbum, destinationAlbum), + }, + ); + + expect(source.rawAlbums.contains(sourceAlbum), false); + expect(source.rawAlbums.contains(destinationAlbum), true); + expect(sourceAlbumFilter.test(image1), false); + expect(destinationAlbumFilter.test(image1), true); + }); + + test('favourites are kept when moving entries', () async { + final image1 = FakeMediaStoreService.newImage(sourceAlbum, 'image1'); + (mediaStoreService as FakeMediaStoreService).entries = { + image1, + }; + + final source = await _initSource(); + await image1.toggleFavourite(); + + await source.updateAfterMove( + todoEntries: {image1}, + moveType: MoveType.move, + destinationAlbums: {destinationAlbum}, + movedOps: { + FakeMediaStoreService.moveOpEventForMove(image1, sourceAlbum, destinationAlbum), + }, + ); + + expect(favourites.count, 1); + expect(image1.isFavourite, true); + }); + + test('album cover is reset when moving cover entry', () async { + final image1 = FakeMediaStoreService.newImage(sourceAlbum, 'image1'); + (mediaStoreService as FakeMediaStoreService).entries = { + image1, + FakeMediaStoreService.newImage(sourceAlbum, 'image2'), + }; + + final source = await _initSource(); + expect(source.rawAlbums.length, 1); + final sourceAlbumFilter = StoredAlbumFilter(sourceAlbum, 'whatever'); + await covers.set(filter: sourceAlbumFilter, entryId: image1.id, packageName: null, color: null); + + await source.updateAfterMove( + todoEntries: {image1}, + moveType: MoveType.move, + destinationAlbums: {destinationAlbum}, + movedOps: { + FakeMediaStoreService.moveOpEventForMove(image1, sourceAlbum, destinationAlbum), + }, + ); + + expect(source.rawAlbums.length, 2); + expect(covers.count, 0); + expect(covers.of(sourceAlbumFilter), null); + }); + + test('favourites and covers are kept when renaming albums', () async { + final image1 = FakeMediaStoreService.newImage(sourceAlbum, 'image1'); + (mediaStoreService as FakeMediaStoreService).entries = { + image1, + }; + + final source = await _initSource(); + await image1.toggleFavourite(); + var albumFilter = StoredAlbumFilter(sourceAlbum, 'whatever'); + await covers.set(filter: albumFilter, entryId: image1.id, packageName: null, color: null); + await source.renameStoredAlbum(sourceAlbum, destinationAlbum, { + image1 + }, { + FakeMediaStoreService.moveOpEventForMove(image1, sourceAlbum, destinationAlbum), + }); + albumFilter = StoredAlbumFilter(destinationAlbum, 'whatever'); + + expect(favourites.count, 1); + expect(image1.isFavourite, true); + expect(covers.count, 1); + expect(covers.of(albumFilter)?.$1, image1.id); + }); + + testWidgets('unique album names', (tester) async { + (mediaStoreService as FakeMediaStoreService).entries = { + FakeMediaStoreService.newImage('${FakeStorageService.primaryPath}Pictures/Elea/Zeno', '1'), + FakeMediaStoreService.newImage('${FakeStorageService.primaryPath}Pictures/Citium/Zeno', '1'), + FakeMediaStoreService.newImage('${FakeStorageService.primaryPath}Pictures/Cleanthes', '1'), + FakeMediaStoreService.newImage('${FakeStorageService.primaryPath}Pictures/Chrysippus', '1'), + FakeMediaStoreService.newImage('${FakeStorageService.removablePath}Pictures/Chrysippus', '1'), + FakeMediaStoreService.newImage(FakeStorageService.primaryPath, '1'), + FakeMediaStoreService.newImage('${FakeStorageService.primaryPath}Pictures/Seneca', '1'), + FakeMediaStoreService.newImage('${FakeStorageService.primaryPath}Seneca', '1'), + FakeMediaStoreService.newImage('${FakeStorageService.removablePath}Pictures/Cicero', '1'), + FakeMediaStoreService.newImage('${FakeStorageService.removablePath}Marcus Aurelius', '1'), + FakeMediaStoreService.newImage('${FakeStorageService.primaryPath}Pictures/Hannah Arendt', '1'), + FakeMediaStoreService.newImage('${FakeStorageService.primaryPath}Pictures/Arendt', '1'), + FakeMediaStoreService.newImage('${FakeStorageService.primaryPath}Pictures/Something', '1'), + FakeMediaStoreService.newImage('${FakeStorageService.primaryPath}Movies/SomeThing', '1'), + }; + + final source = await _initSource(); + await tester.pumpWidget( + Localizations( + locale: AppLocalizations.supportedLocales.first, + delegates: AppLocalizations.localizationsDelegates, + child: Builder( + builder: (context) { + expect(source.getStoredAlbumDisplayName(context, '${FakeStorageService.primaryPath}Pictures/Elea/Zeno'), 'Elea/Zeno'); + expect(source.getStoredAlbumDisplayName(context, '${FakeStorageService.primaryPath}Pictures/Citium/Zeno'), 'Citium/Zeno'); + expect(source.getStoredAlbumDisplayName(context, '${FakeStorageService.primaryPath}Pictures/Cleanthes'), 'Cleanthes'); + expect(source.getStoredAlbumDisplayName(context, '${FakeStorageService.primaryPath}Pictures/Chrysippus'), 'Chrysippus'); + expect(source.getStoredAlbumDisplayName(context, '${FakeStorageService.removablePath}Pictures/Chrysippus'), 'Chrysippus (${FakeStorageService.removableDescription})'); + expect(source.getStoredAlbumDisplayName(context, FakeStorageService.primaryRootAlbum), FakeStorageService.primaryDescription); + expect(source.getStoredAlbumDisplayName(context, '${FakeStorageService.primaryPath}Pictures/Seneca'), 'Pictures/Seneca'); + expect(source.getStoredAlbumDisplayName(context, '${FakeStorageService.primaryPath}Seneca'), 'Seneca'); + expect(source.getStoredAlbumDisplayName(context, '${FakeStorageService.removablePath}Pictures/Cicero'), 'Cicero'); + expect(source.getStoredAlbumDisplayName(context, '${FakeStorageService.removablePath}Marcus Aurelius'), 'Marcus Aurelius'); + expect(source.getStoredAlbumDisplayName(context, '${FakeStorageService.primaryPath}Pictures/Hannah Arendt'), 'Hannah Arendt'); + expect(source.getStoredAlbumDisplayName(context, '${FakeStorageService.primaryPath}Pictures/Arendt'), 'Arendt'); + expect(source.getStoredAlbumDisplayName(context, '${FakeStorageService.primaryPath}Pictures/Something'), 'Pictures/Something'); + expect(source.getStoredAlbumDisplayName(context, '${FakeStorageService.primaryPath}Movies/SomeThing'), 'Movies/SomeThing'); + return const Placeholder(); + }, + ), + ), + ); + }); + + test('groups are cleared when removing entries', () async { + final image1 = FakeMediaStoreService.newImage(testAlbum, 'image1'); + (mediaStoreService as FakeMediaStoreService).entries = { + image1, + }; + + final albumFilter = StoredAlbumFilter(image1.directory!, 'whatever'); + + final source = await _initSource(); + final groupUri = albumGrouping.buildGroupUri(null, 'some group name'); + final childUri = GroupingConversion.filterToUri(albumFilter); + albumGrouping.addToGroup({childUri}.nonNulls.toSet(), groupUri); + expect(source.rawAlbums.length, 1); + expect(albumGrouping.exists(groupUri), true); + + await source.removeEntries({image1.uri}, includeTrash: true); + + // waiting for microtask to make sure event bus listeners executed + await Future.microtask(() {}); + + expect(source.rawAlbums.length, 0); + expect(albumGrouping.exists(groupUri), false); + }); +} diff --git a/test/model/filters_test.dart b/test/model/filters_test.dart new file mode 100644 index 0000000..3c97ef3 --- /dev/null +++ b/test/model/filters_test.dart @@ -0,0 +1,135 @@ +import 'package:aves/model/filters/aspect_ratio.dart'; +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/container/set_and.dart'; +import 'package:aves/model/filters/container/set_or.dart'; +import 'package:aves/model/filters/coordinate.dart'; +import 'package:aves/model/filters/covered/location.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/filters/date.dart'; +import 'package:aves/model/filters/favourite.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/mime.dart'; +import 'package:aves/model/filters/missing.dart'; +import 'package:aves/model/filters/path.dart'; +import 'package:aves/model/filters/placeholder.dart'; +import 'package:aves/model/filters/query.dart'; +import 'package:aves/model/filters/rating.dart'; +import 'package:aves/model/filters/recent.dart'; +import 'package:aves/model/filters/type.dart'; +import 'package:aves/model/filters/weekday.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:test/test.dart'; + +import '../common.dart'; +import '../fake/media_store_service.dart'; +import '../fake/storage_service.dart'; + +void main() { + setUpAll(() async { + await setUpAllServices(); + }); + + setUp(() async { + await setUpServices(); + }); + + tearDownAll(() async { + await tearDownAllServices(); + }); + + test('Filter serialization', () { + CollectionFilter? jsonRoundTrip(filter) => CollectionFilter.fromJson(filter.toJson()); + + final aspectRatio = AspectRatioFilter.landscape; + expect(aspectRatio, jsonRoundTrip(aspectRatio)); + + final bounds = CoordinateFilter(const LatLng(29.979167, 28.223615), const LatLng(36.451000, 31.134167)); + expect(bounds, jsonRoundTrip(bounds)); + + final date = DateFilter(DateLevel.ym, DateTime(1969, 7)); + expect(date, jsonRoundTrip(date)); + + final onThisDay = DateFilter.onThisDay; + expect(onThisDay, jsonRoundTrip(onThisDay)); + + const fav = FavouriteFilter.instance; + expect(fav, jsonRoundTrip(fav)); + + final mime = MimeFilter.video; + expect(mime, jsonRoundTrip(mime)); + + final missing = MissingFilter.title; + expect(missing, jsonRoundTrip(missing)); + + final path = PathFilter('/some/path/'); + expect(path, jsonRoundTrip(path)); + + final placeholder = PlaceholderFilter.country; + expect(placeholder, jsonRoundTrip(placeholder)); + + final query = QueryFilter('some query'); + expect(query, jsonRoundTrip(query)); + + final rating = RatingFilter(3); + expect(rating, jsonRoundTrip(rating)); + + final recent = RecentlyAddedFilter.instance; + expect(recent, jsonRoundTrip(recent)); + + final type = TypeFilter.sphericalVideo; + expect(type, jsonRoundTrip(type)); + + final weekday = WeekDayFilter(5); + expect(weekday, jsonRoundTrip(weekday)); + + // covered + + final album = StoredAlbumFilter('path/to/album', 'album'); + expect(album, jsonRoundTrip(album)); + + final location = LocationFilter(LocationLevel.country, 'France${LocationFilter.locationSeparator}FR'); + expect(location, jsonRoundTrip(location)); + + final tag = TagFilter('some tag'); + expect(tag, jsonRoundTrip(tag)); + + // combinations + + final setAnd = SetAndFilter({album, location, tag}); + expect(setAnd, jsonRoundTrip(setAnd)); + + final setOr = SetOrFilter({album, location, tag}); + expect(setOr, jsonRoundTrip(setOr)); + + final dynamicAlbum = DynamicAlbumFilter('dynamic album', setAnd); + expect(dynamicAlbum, jsonRoundTrip(dynamicAlbum)); + + // groups + + final albumGroup = AlbumGroupFilter(albumGrouping.buildGroupUri(null, 'some group'), setOr); + expect(albumGroup, jsonRoundTrip(albumGroup)); + }); + + test('Path filter', () { + const rootAlbum = '${FakeStorageService.primaryPath}Pictures/test'; + const subAlbum = '${FakeStorageService.primaryPath}Pictures/test/sub'; + const siblingAlbum = '${FakeStorageService.primaryPath}Pictures/test sibling'; + + final rootImage = FakeMediaStoreService.newImage(rootAlbum, 'image1'); + final subImage = FakeMediaStoreService.newImage(subAlbum, 'image1'); + final siblingImage = FakeMediaStoreService.newImage(siblingAlbum, 'image1'); + + final untrailedPath = PathFilter(rootAlbum); + expect(untrailedPath.test(rootImage), true); + expect(untrailedPath.test(subImage), true); + expect(untrailedPath.test(siblingImage), false); + + final trailedPath = PathFilter('$rootAlbum/'); + expect(trailedPath.test(rootImage), true); + expect(trailedPath.test(subImage), true); + expect(trailedPath.test(siblingImage), false); + }); +} diff --git a/test/model/grouping/common_test.dart b/test/model/grouping/common_test.dart new file mode 100644 index 0000000..c734096 --- /dev/null +++ b/test/model/grouping/common_test.dart @@ -0,0 +1,201 @@ +import 'dart:async'; + +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/container/set_or.dart'; +import 'package:aves/model/filters/container/tag_group.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/filters/covered/tag.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/grouping/convert.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/model/source/media_store_source.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:test/test.dart'; + +import '../../common.dart'; +import '../../fake/media_store_service.dart'; +import '../../fake/storage_service.dart'; + +void main() { + const groupName = 'some group name'; + const storedAlbumPath = '/path/to/album'; + + setUpAll(() async { + await setUpAllServices(); + }); + + setUp(() async { + await setUpServices(); + }); + + tearDownAll(() async { + await tearDownAllServices(); + }); + + test('Filter URI round trip', () { + final storedAlbumFilter = StoredAlbumFilter(storedAlbumPath, 'display name'); + final dynamicAlbumFilter = DynamicAlbumFilter('dynamic name', storedAlbumFilter); + dynamicAlbums.add(dynamicAlbumFilter); + final albumGroupUri = albumGrouping.buildGroupUri(null, groupName); + final albumGroupFilter = AlbumGroupFilter(albumGroupUri, SetOrFilter({storedAlbumFilter, dynamicAlbumFilter})); + + expect(albumGrouping.uriToFilter(GroupingConversion.filterToUri(storedAlbumFilter)), storedAlbumFilter); + expect(albumGrouping.uriToFilter(GroupingConversion.filterToUri(dynamicAlbumFilter)), dynamicAlbumFilter); + expect(albumGrouping.uriToFilter(GroupingConversion.filterToUri(albumGroupFilter)), albumGroupFilter); + + final tagFilter = TagFilter('some tag'); + final tagGroupUri = tagGrouping.buildGroupUri(null, groupName); + final tagGroupFilter = TagGroupFilter(tagGroupUri, SetOrFilter({tagFilter})); + + expect(tagGrouping.uriToFilter(GroupingConversion.filterToUri(tagFilter)), tagFilter); + expect(tagGrouping.uriToFilter(GroupingConversion.filterToUri(tagGroupFilter)), tagGroupFilter); + }); + + test('Empty group', () { + final groupUri = albumGrouping.buildGroupUri(null, groupName); + expect(FilterGrouping.getGroupName(groupUri), groupName); + + expect(albumGrouping.exists(groupUri), false); + expect(albumGrouping.getDirectChildren(null).length, 0); + expect(albumGrouping.getDirectChildren(groupUri).length, 0); + expect(albumGrouping.countLeaves(groupUri), 0); + }); + + test('Adding album to group', () { + final groupUri = albumGrouping.buildGroupUri(null, groupName); + final childUri = GroupingConversion.filterToUri(StoredAlbumFilter(storedAlbumPath, null)); + albumGrouping.addToGroup({childUri}.nonNulls.toSet(), groupUri); + + expect(albumGrouping.exists(groupUri), true); + expect(albumGrouping.getDirectChildren(null).length, 1); + expect(albumGrouping.getDirectChildren(groupUri).length, 1); + expect(albumGrouping.countLeaves(groupUri), 1); + }); + + test('Adding subgroup to group', () { + final rootGroupUri = albumGrouping.buildGroupUri(null, 'root'); + final subGroupUri = albumGrouping.buildGroupUri(rootGroupUri, 'sub'); + final childUri = GroupingConversion.filterToUri(StoredAlbumFilter(storedAlbumPath, null)); + albumGrouping.addToGroup({childUri}.nonNulls.toSet(), subGroupUri); + albumGrouping.addToGroup({subGroupUri}, rootGroupUri); + + expect(albumGrouping.exists(rootGroupUri), true); + expect(albumGrouping.exists(subGroupUri), true); + expect(albumGrouping.getDirectChildren(null).length, 1); + expect(albumGrouping.getDirectChildren(rootGroupUri).length, 1); + expect(albumGrouping.getDirectChildren(subGroupUri).length, 1); + expect(albumGrouping.countLeaves(rootGroupUri), 1); + expect(albumGrouping.countLeaves(subGroupUri), 1); + }); + + test('Removing from group', () { + final groupUri = albumGrouping.buildGroupUri(null, groupName); + final childUri = GroupingConversion.filterToUri(StoredAlbumFilter(storedAlbumPath, null)); + albumGrouping.addToGroup({childUri}.nonNulls.toSet(), groupUri); + albumGrouping.addToGroup({childUri}.nonNulls.toSet(), null); + + expect(albumGrouping.exists(groupUri), false); + expect(albumGrouping.getDirectChildren(null).length, 0); + expect(albumGrouping.getDirectChildren(groupUri).length, 0); + expect(albumGrouping.countLeaves(groupUri), 0); + }); + + test('Reparent group', () { + const subgroupName = 'sub'; + + final rootGroupUri = albumGrouping.buildGroupUri(null, 'old root'); + final subGroupUri = albumGrouping.buildGroupUri(rootGroupUri, subgroupName); + final childUri = GroupingConversion.filterToUri(StoredAlbumFilter(storedAlbumPath, null)); + albumGrouping.addToGroup({childUri}.nonNulls.toSet(), subGroupUri); + albumGrouping.addToGroup({subGroupUri}, rootGroupUri); + + final newRootGroupUri = albumGrouping.buildGroupUri(null, 'new root'); + final newSubGroupUri = albumGrouping.buildGroupUri(newRootGroupUri, subgroupName); + albumGrouping.addToGroup({subGroupUri}, newRootGroupUri); + expect(albumGrouping.exists(rootGroupUri), false); + expect(albumGrouping.exists(subGroupUri), false); + expect(albumGrouping.exists(newRootGroupUri), true); + expect(albumGrouping.exists(newSubGroupUri), true); + expect(albumGrouping.getDirectChildren(newRootGroupUri).length, 1); + expect(albumGrouping.getDirectChildren(newSubGroupUri).length, 1); + }); + + test('Reparent content', () { + final rootGroupUri = albumGrouping.buildGroupUri(null, 'root'); + final childUriToKeep = GroupingConversion.filterToUri(StoredAlbumFilter('$storedAlbumPath 1', null)); + final childUriToMove = GroupingConversion.filterToUri(StoredAlbumFilter('$storedAlbumPath 2', null)); + albumGrouping.addToGroup({childUriToKeep, childUriToMove}.nonNulls.toSet(), rootGroupUri); + + final subGroupUri = albumGrouping.buildGroupUri(rootGroupUri, 'sub'); + albumGrouping.addToGroup({childUriToMove}.nonNulls.toSet(), subGroupUri); + + expect(albumGrouping.exists(rootGroupUri), true); + expect(albumGrouping.exists(subGroupUri), true); + expect(albumGrouping.getDirectChildren(rootGroupUri).length, 2); + expect(albumGrouping.getDirectChildren(subGroupUri).length, 1); + }); + + test('Reparent group deeper', () { + final rootGroupUri = albumGrouping.buildGroupUri(null, 'root'); + const movingGroupName = 'moving'; + final movingGroupUri = albumGrouping.buildGroupUri(null, movingGroupName); + final childUri = GroupingConversion.filterToUri(StoredAlbumFilter(storedAlbumPath, null)); + // > moving group > stored album + albumGrouping.addToGroup({childUri}.nonNulls.toSet(), movingGroupUri); + // > root group > moving group > stored album + albumGrouping.addToGroup({movingGroupUri}, rootGroupUri); + + final movedGroupUri = albumGrouping.buildGroupUri(rootGroupUri, movingGroupName); + expect(albumGrouping.exists(rootGroupUri), true); + expect(albumGrouping.exists(movingGroupUri), false); + expect(albumGrouping.exists(movedGroupUri), true); + expect(albumGrouping.getDirectChildren(rootGroupUri).length, 1); + expect(albumGrouping.getDirectChildren(movedGroupUri).length, 1); + expect(GroupingConversion.filterToUri(albumGrouping.getDirectChildren(rootGroupUri).first), movedGroupUri); + }); + + Future<MediaStoreSource> _initSource() async { + final source = MediaStoreSource(); + final readyCompleter = Completer(); + source.stateNotifier.addListener(() { + if (source.isReady) { + readyCompleter.complete(); + } + }); + await source.init(scope: CollectionSource.fullScope); + await readyCompleter.future; + return source; + } + + test('Keep group when renaming album', () async { + const sourceAlbum = '${FakeStorageService.primaryPath}Pictures/source'; + const destinationAlbum = '${FakeStorageService.primaryPath}Pictures/destination'; + + final image1 = FakeMediaStoreService.newImage(sourceAlbum, 'image1'); + (mediaStoreService as FakeMediaStoreService).entries = { + image1, + }; + + final oldFilter = StoredAlbumFilter(sourceAlbum, 'whatever'); + final newFilter = StoredAlbumFilter(destinationAlbum, 'whatever'); + + final groupUri = albumGrouping.buildGroupUri(null, groupName); + final childUri = GroupingConversion.filterToUri(oldFilter); + albumGrouping.addToGroup({childUri}.nonNulls.toSet(), groupUri); + + expect(albumGrouping.getFilterParent(oldFilter), groupUri); + expect(albumGrouping.getFilterParent(newFilter), null); + + final source = await _initSource(); + await source.renameStoredAlbum(sourceAlbum, destinationAlbum, { + image1 + }, { + FakeMediaStoreService.moveOpEventForMove(image1, sourceAlbum, destinationAlbum), + }); + + expect(albumGrouping.getFilterParent(oldFilter), null); + expect(albumGrouping.getFilterParent(newFilter), groupUri); + }); +} diff --git a/test/model/grouping/convert_test.dart b/test/model/grouping/convert_test.dart new file mode 100644 index 0000000..f028a84 --- /dev/null +++ b/test/model/grouping/convert_test.dart @@ -0,0 +1,39 @@ +import 'package:aves/model/dynamic_albums.dart'; +import 'package:aves/model/filters/container/album_group.dart'; +import 'package:aves/model/filters/container/dynamic_album.dart'; +import 'package:aves/model/filters/container/set_or.dart'; +import 'package:aves/model/filters/covered/stored_album.dart'; +import 'package:aves/model/grouping/common.dart'; +import 'package:aves/model/grouping/convert.dart'; +import 'package:test/test.dart'; + +import '../../common.dart'; + +void main() { + const groupName = 'some group name'; + const storedAlbumPath = '/path/to/album/'; + + setUpAll(() async { + await setUpAllServices(); + }); + + setUp(() async { + await setUpServices(); + }); + + tearDownAll(() async { + await tearDownAllServices(); + }); + + test('Filter URI round trip', () { + final storedAlbumFilter = StoredAlbumFilter(storedAlbumPath, 'display name'); + final dynamicAlbumFilter = DynamicAlbumFilter('dynamic name', storedAlbumFilter); + dynamicAlbums.add(dynamicAlbumFilter); + final groupUri = albumGrouping.buildGroupUri(null, groupName); + final albumGroupFilter = AlbumGroupFilter(groupUri, SetOrFilter({storedAlbumFilter, dynamicAlbumFilter})); + + expect(albumGrouping.uriToFilter(GroupingConversion.filterToUri(storedAlbumFilter)), storedAlbumFilter); + expect(albumGrouping.uriToFilter(GroupingConversion.filterToUri(dynamicAlbumFilter)), dynamicAlbumFilter); + expect(albumGrouping.uriToFilter(GroupingConversion.filterToUri(albumGroupFilter)), albumGroupFilter); + }); +} diff --git a/test/model/naming_pattern_test.dart b/test/model/naming_pattern_test.dart new file mode 100644 index 0000000..b5d0daf --- /dev/null +++ b/test/model/naming_pattern_test.dart @@ -0,0 +1,56 @@ +import 'package:aves/model/naming_pattern.dart'; +import 'package:intl/date_symbol_data_local.dart'; +import 'package:test/test.dart'; + +void main() { + setUpAll(() async { + await initializeDateFormatting(); + }); + + test('mixed processors', () { + const entryCount = 42; + const locale = 'en'; + expect( + NamingPattern.from( + userPattern: 'pure literal', + entryCount: entryCount, + locale: locale, + ).processors, + [ + const LiteralNamingProcessor('pure literal'), + ], + ); + expect( + NamingPattern.from( + userPattern: 'prefix<date,yyyy-MM-ddTHH:mm:ss>suffix', + entryCount: entryCount, + locale: locale, + ).processors, + [ + const LiteralNamingProcessor('prefix'), + DateNamingProcessor('yyyy-MM-ddTHH:mm:ss', locale), + const LiteralNamingProcessor('suffix'), + ], + ); + expect( + NamingPattern.from( + userPattern: '<date,yyyy-MM-ddTHH:mm:ss> <name>', + entryCount: entryCount, + locale: locale, + ).processors, + [ + DateNamingProcessor('yyyy-MM-ddTHH:mm:ss', locale), + const LiteralNamingProcessor(' '), + const NameNamingProcessor(), + ], + ); + }); + + test('insertion offset', () { + const userPattern = '<date,yyyy-MM-ddTHH:mm:ss> infix <name>'; + expect(NamingPattern.getInsertionOffset(userPattern, -1), 0); + expect(NamingPattern.getInsertionOffset(userPattern, 1234), userPattern.length); + expect(NamingPattern.getInsertionOffset(userPattern, 4), 26); + expect(NamingPattern.getInsertionOffset(userPattern, 30), 30); + }); +} diff --git a/test/model/video/metadata_test.dart b/test/model/video/metadata_test.dart new file mode 100644 index 0000000..68a429e --- /dev/null +++ b/test/model/video/metadata_test.dart @@ -0,0 +1,26 @@ +import 'package:aves/model/media/video/metadata.dart'; +import 'package:test/test.dart'; + +void main() { + test('Video date parsing', () { + DateTime shiftTimeZoneOffset(DateTime date) { + // local time zone offset may not be the same across time (because of DST), + // so we cannot reliably use `DateTime.now().timeZoneOffset` + return date.add(date.timeZoneOffset); + } + + expect(VideoMetadataFormatter.parseVideoDate('2011-05-08T03:46+09:00'), shiftTimeZoneOffset(DateTime(2011, 5, 7, 18, 46)).millisecondsSinceEpoch); + expect(VideoMetadataFormatter.parseVideoDate('UTC 2021-05-30 19:14:21'), DateTime(2021, 5, 30, 19, 14, 21).millisecondsSinceEpoch); + expect(VideoMetadataFormatter.parseVideoDate('2021/10/31 21:23:17'), DateTime(2021, 10, 31, 21, 23, 17).millisecondsSinceEpoch); + expect(VideoMetadataFormatter.parseVideoDate('2021-09-10T7:14:49 pmZ'), DateTime(2021, 9, 10, 19, 14, 49).millisecondsSinceEpoch); + expect(VideoMetadataFormatter.parseVideoDate('2022-01-28T5:07:46 p. m.Z'), DateTime(2022, 1, 28, 17, 7, 46).millisecondsSinceEpoch); + expect(VideoMetadataFormatter.parseVideoDate('2012-1-1T12:00:00Z'), DateTime(2012, 1, 1, 12, 0, 0).millisecondsSinceEpoch); + expect(VideoMetadataFormatter.parseVideoDate('2020.10.14'), DateTime(2020, 10, 14).millisecondsSinceEpoch); + expect(VideoMetadataFormatter.parseVideoDate('2016:11:16 18:00:00'), DateTime(2016, 11, 16, 18, 0, 0).millisecondsSinceEpoch); + }); + + test('Ambiguous date', () { + expect(VideoMetadataFormatter.isAmbiguousDate('2011-05-08T03:46+09:00'), false); + expect(VideoMetadataFormatter.isAmbiguousDate('05-08-2011'), true); + }); +} diff --git a/test/model/view_state_test.dart b/test/model/view_state_test.dart new file mode 100644 index 0000000..f582bd1 --- /dev/null +++ b/test/model/view_state_test.dart @@ -0,0 +1,90 @@ +import 'dart:ui'; + +import 'package:aves/model/viewer/view_state.dart'; +import 'package:aves_utils/aves_utils.dart'; +import 'package:test/test.dart'; +import 'package:vector_math/vector_math_64.dart'; + +void main() { + test('scene -> viewport, original scaleFit', () { + const viewport = Rect.fromLTWH(0, 0, 100, 200); + const content = Rect.fromLTWH(0, 0, 200, 400); + final state = ViewState(position: Offset.zero, scale: 1, viewportSize: viewport.size, contentSize: content.size); + + expect(_toViewportPoint(state, content.topLeft), const Offset(-50, -100)); + expect(_toViewportPoint(state, content.bottomRight), const Offset(150, 300)); + }); + + test('scene -> viewport, scaled to fit .5', () { + const viewport = Rect.fromLTWH(0, 0, 100, 200); + const content = Rect.fromLTWH(0, 0, 200, 400); + final state = ViewState(position: Offset.zero, scale: .5, viewportSize: viewport.size, contentSize: content.size); + + expect(_toViewportPoint(state, content.topLeft), viewport.topLeft); + expect(_toViewportPoint(state, content.center), viewport.center); + expect(_toViewportPoint(state, content.bottomRight), viewport.bottomRight); + }); + + test('scene -> viewport, scaled to fit .25', () { + const viewport = Rect.fromLTWH(0, 0, 50, 100); + const content = Rect.fromLTWH(0, 0, 200, 400); + final state = ViewState(position: Offset.zero, scale: .25, viewportSize: viewport.size, contentSize: content.size); + + expect(_toViewportPoint(state, content.topLeft), viewport.topLeft); + expect(_toViewportPoint(state, content.center), viewport.center); + expect(_toViewportPoint(state, content.bottomRight), viewport.bottomRight); + }); + + test('viewport -> scene, original scaleFit', () { + const viewport = Rect.fromLTWH(0, 0, 100, 200); + const content = Rect.fromLTWH(0, 0, 200, 400); + final state = ViewState(position: Offset.zero, scale: 1, viewportSize: viewport.size, contentSize: content.size); + + expect(_toContentPoint(state, viewport.topLeft), const Offset(50, 100)); + expect(_toContentPoint(state, viewport.bottomRight), const Offset(150, 300)); + }); + + test('viewport -> scene, scaled to fit', () { + const viewport = Rect.fromLTWH(0, 0, 100, 200); + const content = Rect.fromLTWH(0, 0, 200, 400); + final state = ViewState(position: Offset.zero, scale: .5, viewportSize: viewport.size, contentSize: content.size); + + expect(_toContentPoint(state, viewport.topLeft), content.topLeft); + expect(_toContentPoint(state, viewport.center), content.center); + expect(_toContentPoint(state, viewport.bottomRight), content.bottomRight); + }); + + test('viewport -> scene, translated', () { + const viewport = Rect.fromLTWH(0, 0, 100, 200); + const content = Rect.fromLTWH(0, 0, 200, 400); + final state = ViewState(position: const Offset(50, 50), scale: 1, viewportSize: viewport.size, contentSize: content.size); + + _toContentPoint(state, viewport.topLeft); + expect(_toContentPoint(state, viewport.topLeft), const Offset(0, 50)); + expect(_toContentPoint(state, viewport.bottomRight), const Offset(100, 250)); + }); + + test('scene -> viewport, scaled to fit, different ratios', () { + const viewport = Rect.fromLTWH(0, 0, 360, 521); + const content = Rect.fromLTWH(0, 0, 2268, 4032); + final scaleFit = viewport.height / content.height; + final state = ViewState(position: Offset.zero, scale: scaleFit, viewportSize: viewport.size, contentSize: content.size); + + final scaledContentLeft = (viewport.width - content.width * scaleFit) / 2; + final scaledContentRight = viewport.width - scaledContentLeft; + + expect(_toViewportPoint(state, content.topLeft), Offset(scaledContentLeft, 0)); + expect(_toViewportPoint(state, content.center), viewport.center); + expect(_toViewportPoint(state, content.bottomRight), Offset(scaledContentRight, viewport.bottom)); + }); +} + +// convenience methods + +Offset _toViewportPoint(ViewState state, Offset contentPoint) { + return state.matrix.transformOffset(contentPoint); +} + +Offset _toContentPoint(ViewState state, viewportPoint) { + return Matrix4.inverted(state.matrix).transformOffset(viewportPoint); +} diff --git a/test/ref/bursts_test.dart b/test/ref/bursts_test.dart new file mode 100644 index 0000000..6efc1df --- /dev/null +++ b/test/ref/bursts_test.dart @@ -0,0 +1,19 @@ +import 'package:aves/ref/bursts.dart'; +import 'package:test/test.dart'; + +void main() { + test('Samsung burst', () { + expect(BurstPatterns.getKeyForName('20151021_072800_006', [BurstPatterns.samsung]), '20151021_072800'); + expect(BurstPatterns.getKeyForName('20151021_072800_007', [BurstPatterns.samsung]), '20151021_072800'); + }); + + test('Sony burst', () { + expect(BurstPatterns.getKeyForName('DSC_0006_BURST20151021072800123', [BurstPatterns.sony]), '20151021072800123'); + expect(BurstPatterns.getKeyForName('DSC_0007_BURST20151021072800123', [BurstPatterns.sony]), '20151021072800123'); + }); + + test('Sony predictive capture', () { + expect(BurstPatterns.getKeyForName('DSCPDC_0002_BURST20180619163426901', [BurstPatterns.sony]), '20180619163426901'); + expect(BurstPatterns.getKeyForName('DSCPDC_0003_BURST20180619163426901_COVER', [BurstPatterns.sony]), '20180619163426901'); + }); +} diff --git a/test/utils/android_file_utils.dart b/test/utils/android_file_utils.dart new file mode 100644 index 0000000..581acb9 --- /dev/null +++ b/test/utils/android_file_utils.dart @@ -0,0 +1,27 @@ +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/storage_service.dart'; +import 'package:aves/utils/android_file_utils.dart'; +import 'package:path/path.dart' as p; +import 'package:test/test.dart'; + +import '../fake/storage_service.dart'; + +void main() { + setUp(() async { + // specify Posix style path context for consistent behaviour when running tests on Windows + getIt.registerLazySingleton<p.Context>(() => p.Context(style: p.Style.posix)); + + getIt.registerLazySingleton<StorageService>(FakeStorageService.new); + + await androidFileUtils.init(); + }); + + tearDown(() async { + await getIt.reset(); + }); + + test('camera album identification', () { + expect(androidFileUtils.isCameraPath('${FakeStorageService.primaryPath}DCIM/Camera'), true); + expect(androidFileUtils.isCameraPath('${FakeStorageService.primaryPath}DCIM/YoloCamera'), false); + }); +} diff --git a/test/utils/file_utils_test.dart b/test/utils/file_utils_test.dart new file mode 100644 index 0000000..6dea8bd --- /dev/null +++ b/test/utils/file_utils_test.dart @@ -0,0 +1,14 @@ +import 'package:aves/l10n/l10n.dart'; +import 'package:aves/utils/file_utils.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:test/test.dart'; + +void main() { + test('format file size', () { + final l10n = lookupAppLocalizations(AvesApp.supportedLocales.first); + final locale = l10n.localeName; + expect(formatFileSize(locale, 1024), '1.00 KB'); + expect(formatFileSize(locale, 1536), '1.50 KB'); + expect(formatFileSize(locale, 1073741824), '1.00 GB'); + }); +} diff --git a/test/utils/geo_utils_test.dart b/test/utils/geo_utils_test.dart new file mode 100644 index 0000000..c343813 --- /dev/null +++ b/test/utils/geo_utils_test.dart @@ -0,0 +1,37 @@ +import 'package:aves/l10n/l10n.dart'; +import 'package:aves/model/settings/enums/coordinate_format.dart'; +import 'package:aves/widgets/aves_app.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:test/test.dart'; + +void main() { + test('Decimal degrees to DMS (sexagesimal)', () { + final l10n = lookupAppLocalizations(AvesApp.supportedLocales.first); + expect(ExtraCoordinateFormat.toDMS(l10n, const LatLng(37.496667, 127.0275)), ['37° 29′ 48.00″ N', '127° 1′ 39.00″ E']); // Gangnam + expect(ExtraCoordinateFormat.toDMS(l10n, const LatLng(78.9243503, 11.9230465)), ['78° 55′ 27.66″ N', '11° 55′ 22.97″ E']); // Ny-Ålesund + expect(ExtraCoordinateFormat.toDMS(l10n, const LatLng(-38.6965891, 175.9830047)), ['38° 41′ 47.72″ S', '175° 58′ 58.82″ E']); // Taupo + expect(ExtraCoordinateFormat.toDMS(l10n, const LatLng(-64.249391, -56.6556145)), ['64° 14′ 57.81″ S', '56° 39′ 20.21″ W']); // Marambio + expect(ExtraCoordinateFormat.toDMS(l10n, const LatLng(0, 0)), ['0° 0′ 0.00″ N', '0° 0′ 0.00″ E']); + expect(ExtraCoordinateFormat.toDMS(l10n, const LatLng(0, 0), minuteSecondPadding: true), ['0° 00′ 00.00″ N', '0° 00′ 00.00″ E']); + expect(ExtraCoordinateFormat.toDMS(l10n, const LatLng(0, 0), secondDecimals: 0), ['0° 0′ 0″ N', '0° 0′ 0″ E']); + expect(ExtraCoordinateFormat.toDMS(l10n, const LatLng(0, 0), secondDecimals: 4), ['0° 0′ 0.0000″ N', '0° 0′ 0.0000″ E']); + }); + + test('Decimal degrees to DDM', () { + final l10n = lookupAppLocalizations(AvesApp.supportedLocales.first); + expect(ExtraCoordinateFormat.toDDM(l10n, const LatLng(37.496667, 127.0275)), ['37° 29.8000′ N', '127° 1.6500′ E']); // Gangnam + expect(ExtraCoordinateFormat.toDDM(l10n, const LatLng(78.9243503, 11.9230465)), ['78° 55.4610′ N', '11° 55.3828′ E']); // Ny-Ålesund + expect(ExtraCoordinateFormat.toDDM(l10n, const LatLng(-38.6965891, 175.9830047)), ['38° 41.7953′ S', '175° 58.9803′ E']); // Taupo + expect(ExtraCoordinateFormat.toDDM(l10n, const LatLng(-64.249391, -56.6556145)), ['64° 14.9635′ S', '56° 39.3369′ W']); // Marambio + expect(ExtraCoordinateFormat.toDDM(l10n, const LatLng(0, 0)), ['0° 0.0000′ N', '0° 0.0000′ E']); + expect(ExtraCoordinateFormat.toDDM(l10n, const LatLng(0, 0), minutePadding: true), ['0° 00.0000′ N', '0° 00.0000′ E']); + expect(ExtraCoordinateFormat.toDDM(l10n, const LatLng(0, 0), minuteDecimals: 0), ['0° 0′ N', '0° 0′ E']); + expect(ExtraCoordinateFormat.toDDM(l10n, const LatLng(0, 0), minuteDecimals: 6), ['0° 0.000000′ N', '0° 0.000000′ E']); + }); + + test('bounds center', () { + expect(GeoUtils.getLatLngCenter(const [LatLng(10, 30), LatLng(30, 50)]), const LatLng(20.28236664671092, 39.351653000319956)); + expect(GeoUtils.getLatLngCenter(const [LatLng(10, -179), LatLng(30, 179)]), const LatLng(20.00279344048298, -179.9358157370226)); + }); +} diff --git a/test/utils/math_utils_test.dart b/test/utils/math_utils_test.dart new file mode 100644 index 0000000..d698711 --- /dev/null +++ b/test/utils/math_utils_test.dart @@ -0,0 +1,38 @@ +import 'dart:ui'; + +import 'package:aves/utils/math_utils.dart'; +import 'package:test/test.dart'; + +void main() { + test('highest power of 2 that is smaller than or equal to the number', () { + expect(highestPowerOf2(1024), 1024); + expect(highestPowerOf2(42), 32); + expect(highestPowerOf2(0), 0); + expect(highestPowerOf2(-42), 0); + expect(highestPowerOf2(.5), 0); + expect(highestPowerOf2(1.5), 1); + }); + + test('smallest power of 2 that is larger than or equal to the number', () { + expect(smallestPowerOf2(1024), 1024); + expect(smallestPowerOf2(42), 64); + expect(smallestPowerOf2(0), 1); + expect(smallestPowerOf2(-42), 1); + expect(smallestPowerOf2(.5), 1); + expect(smallestPowerOf2(1.5), 2); + expect(smallestPowerOf2(0.5, allowNegativePower: true), 0.5); + expect(smallestPowerOf2(0.1, allowNegativePower: true), 0.125); + expect(smallestPowerOf2(0, allowNegativePower: true), 1); + }); + + test('rounding to a given precision after the decimal', () { + expect(roundToPrecision(1.2345678, decimals: 3), 1.235); + expect(roundToPrecision(0, decimals: 3), 0); + }); + + test('segment intersection', () { + const s1 = (Offset(1, 1), Offset(3, 2)); + const s2 = (Offset(1, 4), Offset(2, -1)); + expect(segmentIntersection(s1, s2), const Offset(17 / 11, 14 / 11)); + }); +} diff --git a/test/utils/string_utils_test.dart b/test/utils/string_utils_test.dart new file mode 100644 index 0000000..a7792fb --- /dev/null +++ b/test/utils/string_utils_test.dart @@ -0,0 +1,19 @@ +import 'package:aves/utils/string_utils.dart'; +import 'package:test/test.dart'; + +void main() { + test('Sentence case', () { + expect('XResolution'.toSentenceCase(), 'X Resolution'); + expect('PixelXDimension'.toSentenceCase(), 'Pixel X Dimension'); + expect('FocalPointX'.toSentenceCase(), 'Focal Point X'); + + expect('ISOSpeedRatings[1]'.toSentenceCase(), 'ISO Speed Ratings [1]'); + expect('LegacyIPTCDigest'.toSentenceCase(), 'Legacy IPTC Digest'); + expect('DocumentID'.toSentenceCase(), 'Document ID'); + + expect('H'.toSentenceCase(), 'H'); + expect('LW[1]'.toSentenceCase(), 'LW [1]'); + + expect('bits_per_raw_sample'.toSentenceCase(), 'Bits Per Raw Sample'); + }); +} diff --git a/test/utils/time_utils_test.dart b/test/utils/time_utils_test.dart new file mode 100644 index 0000000..233594f --- /dev/null +++ b/test/utils/time_utils_test.dart @@ -0,0 +1,44 @@ +import 'package:aves/utils/time_utils.dart'; +import 'package:test/test.dart'; + +void main() { + test('Comparison extension functions', () { + expect(DateTime(1593, 7, 8).isAtSameYearAs(null), false); + expect(DateTime(1903, 9, 25).isAtSameYearAs(DateTime(1970, 2, 25)), false); + expect(DateTime(1929, 3, 22).isAtSameYearAs(DateTime(1929, 3, 22)), true); + + expect(DateTime(1593, 7, 8).isAtSameMonthAs(null), false); + expect(DateTime(1903, 9, 25).isAtSameMonthAs(DateTime(1970, 2, 25)), false); + expect(DateTime(1929, 3, 22).isAtSameMonthAs(DateTime(1929, 3, 22)), true); + + expect(DateTime(1593, 7, 8).isAtSameDayAs(null), false); + expect(DateTime(1903, 9, 25).isAtSameDayAs(DateTime(1970, 2, 25)), false); + expect(DateTime(1929, 3, 22).isAtSameDayAs(DateTime(1929, 3, 22)), true); + }); + + test('Parse dates', () { + DateTime shiftTimeZoneOffset(DateTime date) { + // local time zone offset may not be the same across time (because of DST), + // so we cannot reliably use `DateTime.now().timeZoneOffset` + return date.add(date.timeZoneOffset); + } + + expect(parseUnknownDateFormat('1600995564713'), shiftTimeZoneOffset(DateTime(2020, 9, 25, 0, 59, 24, 713))); + expect(parseUnknownDateFormat('pre1600995564713suf'), shiftTimeZoneOffset(DateTime(2020, 9, 25, 0, 59, 24, 713))); + + expect(parseUnknownDateFormat('1600995564'), shiftTimeZoneOffset(DateTime(2020, 9, 25, 0, 59, 24, 0))); + expect(parseUnknownDateFormat('pre1600995564suf'), shiftTimeZoneOffset(DateTime(2020, 9, 25, 0, 59, 24, 0))); + + expect(parseUnknownDateFormat('IMG_20210901_142523_783'), DateTime(2021, 9, 1, 14, 25, 23, 783)); + expect(parseUnknownDateFormat('Screenshot_20211028-115056_Aves'), DateTime(2021, 10, 28, 11, 50, 56, 0)); + + expect(parseUnknownDateFormat('Screenshot_2022-05-14-15-40-29-164_uri'), DateTime(2022, 5, 14, 15, 40, 29, 164)); + expect(parseUnknownDateFormat('2019-02-18 16.00.12-DCM'), DateTime(2019, 2, 18, 16, 0, 12, 0)); + expect(parseUnknownDateFormat('2020-11-01 00.31.02'), DateTime(2020, 11, 1, 0, 31, 2, 0)); + expect(parseUnknownDateFormat('2019-10-31 135703'), DateTime(2019, 10, 31, 13, 57, 3, 0)); + expect(parseUnknownDateFormat('Foo_2023-03-12_01-59-23.614_1920x1080'), DateTime(2023, 3, 12, 1, 59, 23, 614)); + + expect(parseUnknownDateFormat('signal-2025-08-26-12-03-16-348'), DateTime(2025, 8, 26, 12, 3, 16, 348)); + expect(parseUnknownDateFormat('signal-2025-04-18-094154'), DateTime(2025, 4, 18, 9, 41, 54)); + }); +} diff --git a/test/utils/xmp_utils_test.dart b/test/utils/xmp_utils_test.dart new file mode 100644 index 0000000..d45e13e --- /dev/null +++ b/test/utils/xmp_utils_test.dart @@ -0,0 +1,472 @@ +import 'package:aves/model/entry/extensions/metadata_edition.dart'; +import 'package:aves/ref/metadata/xmp.dart'; +import 'package:aves/utils/xmp_utils.dart'; +import 'package:test/test.dart'; +import 'package:xml/xml.dart'; + +void main() { + const toolkit = 'test-toolkit'; + + String? _toExpect(String? xmpString) => xmpString != null + ? XmlDocument.parse(xmpString).toXmlString( + pretty: true, + sortAttributes: (a, b) => a.name.qualified.compareTo(b.name.qualified), + ) + : null; + + List<XmlNode> _getDescriptions(String xmpString) { + final xmpDoc = XmlDocument.parse(xmpString); + final root = xmpDoc.rootElement; + final rdf = root.getElement(XmpElements.rdfRoot, namespace: XmpNamespaces.rdf); + return rdf!.children.where((node) { + return node is XmlElement && node.name.local == XmpElements.rdfDescription && node.name.namespaceUri == XmpNamespaces.rdf; + }).toList(); + } + + const inMultiDescriptionRatings = ''' +<x:xmpmeta xmlns:x="adobe:ns:meta/"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description xmlns:xmp="http://ns.adobe.com/xap/1.0/" rdf:about="uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b"> + <xmp:Rating>5</xmp:Rating> + </rdf:Description> + <rdf:Description xmlns:MicrosoftPhoto="http://ns.microsoft.com/photo/1.0/" rdf:about="uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b"> + <MicrosoftPhoto:Rating>99</MicrosoftPhoto:Rating> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> +'''; + const inRatingAttribute = ''' +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core Test.SNAPSHOT"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description xmlns:xmp="http://ns.adobe.com/xap/1.0/" rdf:about="" xmp:Rating="5" /> + </rdf:RDF> +</x:xmpmeta> +'''; + const inRatingElement = ''' +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core Test.SNAPSHOT"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description xmlns:xmp="http://ns.adobe.com/xap/1.0/" rdf:about=""> + <xmp:Rating>5</xmp:Rating> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> +'''; + const inSubjects = ''' +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core Test.SNAPSHOT"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <dc:subject> + <rdf:Bag> + <rdf:li>the king</rdf:li> + </rdf:Bag> + </dc:subject> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> +'''; + const inSubjectsCreator = ''' +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core Test.SNAPSHOT"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmp:ModifyDate="2021-12-24T21:41:46+09:00" + xmp:MetadataDate="2021-12-24T21:41:46+09:00"> + <dc:creator> + <rdf:Seq> + <rdf:li>c</rdf:li> + </rdf:Seq> + </dc:creator> + <dc:subject> + <rdf:Bag> + <rdf:li>a</rdf:li> + <rdf:li>b</rdf:li> + </rdf:Bag> + </dc:subject> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> +'''; + const inMotionPhotoMicroVideo = ''' +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.1.0-jc003"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:GCamera="http://ns.google.com/photos/1.0/camera/" + GCamera:MicroVideo="1" + GCamera:MicroVideoVersion="1" + GCamera:MicroVideoOffset="1228513" + GCamera:MicroVideoPresentationTimestampUs="233246"/> + </rdf:RDF> +</x:xmpmeta> +'''; + const inMotionPhotoContainer = ''' +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.1.0-jc003"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:GCamera="http://ns.google.com/photos/1.0/camera/" + xmlns:Container="http://ns.google.com/photos/1.0/container/" + xmlns:Item="http://ns.google.com/photos/1.0/container/item/" + GCamera:MotionPhoto="1" + GCamera:MotionPhotoVersion="1" + GCamera:MotionPhotoPresentationTimestampUs="2306056"> + <Container:Directory> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <Container:Item + Item:Mime="image/jpeg" + Item:Semantic="Primary" + Item:Length="0" + Item:Padding="59"/> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <Container:Item + Item:Mime="video/mp4" + Item:Semantic="MotionPhoto" + Item:Length="3491777" + Item:Padding="0"/> + </rdf:li> + </rdf:Seq> + </Container:Directory> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> +'''; + + test('Get string', () async { + expect(XMP.getString(_getDescriptions(inRatingAttribute), XmpElements.xmpRating, namespace: XmpNamespaces.xmp), '5'); + expect(XMP.getString(_getDescriptions(inRatingElement), XmpElements.xmpRating, namespace: XmpNamespaces.xmp), '5'); + expect(XMP.getString(_getDescriptions(inSubjects), XmpElements.xmpRating, namespace: XmpNamespaces.xmp), null); + }); + + test('Set tags without existing XMP', () async { + final modifyDate = DateTime.now(); + final xmpDate = XMP.toXmpDate(modifyDate); + + expect( + _toExpect(await XMP.edit( + null, + toolkit, + (descriptions) => ExtraAvesEntryMetadataEdition.editTagsXmp(descriptions, {'one', 'two'}), + modifyDate: modifyDate, + )), + _toExpect(''' +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="$toolkit"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmp:MetadataDate="$xmpDate" + xmp:ModifyDate="$xmpDate"> + <dc:subject> + <rdf:Bag> + <rdf:li>one</rdf:li> + <rdf:li>two</rdf:li> + </rdf:Bag> + </dc:subject> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> +''')); + }); + + test('Set tags to XMP with ratings (multiple descriptions)', () async { + final modifyDate = DateTime.now(); + final xmpDate = XMP.toXmpDate(modifyDate); + + expect( + _toExpect(await XMP.edit( + inMultiDescriptionRatings, + toolkit, + (descriptions) => ExtraAvesEntryMetadataEdition.editTagsXmp(descriptions, {'one', 'two'}), + modifyDate: modifyDate, + )), + _toExpect(''' +<x:xmpmeta xmlns:x="adobe:ns:meta/"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmp:MetadataDate="$xmpDate" + xmp:ModifyDate="$xmpDate"> + <xmp:Rating>5</xmp:Rating> + <dc:subject> + <rdf:Bag> + <rdf:li>one</rdf:li> + <rdf:li>two</rdf:li> + </rdf:Bag> + </dc:subject> + </rdf:Description> + <rdf:Description xmlns:MicrosoftPhoto="http://ns.microsoft.com/photo/1.0/" rdf:about="uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b"> + <MicrosoftPhoto:Rating>99</MicrosoftPhoto:Rating> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> +''')); + }); + + test('Set tags to XMP with subjects only', () async { + final modifyDate = DateTime.now(); + final xmpDate = XMP.toXmpDate(modifyDate); + + expect( + _toExpect(await XMP.edit( + inSubjects, + toolkit, + (descriptions) => ExtraAvesEntryMetadataEdition.editTagsXmp(descriptions, {'one', 'two'}), + modifyDate: modifyDate, + )), + _toExpect(''' +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core Test.SNAPSHOT"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmp:MetadataDate="$xmpDate" + xmp:ModifyDate="$xmpDate"> + <dc:subject> + <rdf:Bag> + <rdf:li>one</rdf:li> + <rdf:li>two</rdf:li> + </rdf:Bag> + </dc:subject> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> +''')); + }); + + test('Remove tags from XMP with subjects only', () async { + expect( + _toExpect(await XMP.edit( + inSubjects, + toolkit, + (descriptions) => ExtraAvesEntryMetadataEdition.editTagsXmp(descriptions, {}), + )), + _toExpect(null)); + }); + + test('Remove tags from XMP with subjects and creator', () async { + final modifyDate = DateTime.now(); + final xmpDate = XMP.toXmpDate(modifyDate); + + expect( + _toExpect(await XMP.edit( + inSubjectsCreator, + toolkit, + (descriptions) => ExtraAvesEntryMetadataEdition.editTagsXmp(descriptions, {}), + modifyDate: modifyDate, + )), + _toExpect(''' +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core Test.SNAPSHOT"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmp:MetadataDate="$xmpDate" + xmp:ModifyDate="$xmpDate"> + <dc:creator> + <rdf:Seq> + <rdf:li>c</rdf:li> + </rdf:Seq> + </dc:creator> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> +''')); + }); + + test('Set rating without existing XMP', () async { + final modifyDate = DateTime.now(); + final xmpDate = XMP.toXmpDate(modifyDate); + + expect( + _toExpect(await XMP.edit( + null, + toolkit, + (descriptions) => ExtraAvesEntryMetadataEdition.editRatingXmp(descriptions, 3), + modifyDate: modifyDate, + )), + _toExpect(''' +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="$toolkit"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmp:Rating="3" + xmp:MetadataDate="$xmpDate" + xmp:ModifyDate="$xmpDate" /> + </rdf:RDF> +</x:xmpmeta> +''')); + }); + + test('Set rating to XMP with ratings (multiple descriptions)', () async { + final modifyDate = DateTime.now(); + final xmpDate = XMP.toXmpDate(modifyDate); + + expect( + _toExpect(await XMP.edit( + inMultiDescriptionRatings, + toolkit, + (descriptions) => ExtraAvesEntryMetadataEdition.editRatingXmp(descriptions, 3), + modifyDate: modifyDate, + )), + _toExpect(''' +<x:xmpmeta xmlns:x="adobe:ns:meta/"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b" + xmlns:MicrosoftPhoto="http://ns.microsoft.com/photo/1.0/" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + MicrosoftPhoto:Rating="50" + xmp:Rating="3" + xmp:MetadataDate="$xmpDate" + xmp:ModifyDate="$xmpDate" /> + </rdf:RDF> +</x:xmpmeta> +''')); + }); + + test('Set rating to XMP with rating attribute', () async { + final modifyDate = DateTime.now(); + final xmpDate = XMP.toXmpDate(modifyDate); + + expect( + _toExpect(await XMP.edit( + inRatingAttribute, + toolkit, + (descriptions) => ExtraAvesEntryMetadataEdition.editRatingXmp(descriptions, 3), + modifyDate: modifyDate, + )), + _toExpect(''' +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core Test.SNAPSHOT"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmp:Rating="3" + xmp:MetadataDate="$xmpDate" + xmp:ModifyDate="$xmpDate" /> + </rdf:RDF> +</x:xmpmeta> +''')); + }); + + test('Set rating to XMP with rating element', () async { + final modifyDate = DateTime.now(); + final xmpDate = XMP.toXmpDate(modifyDate); + + expect( + _toExpect(await XMP.edit( + inRatingElement, + toolkit, + (descriptions) => ExtraAvesEntryMetadataEdition.editRatingXmp(descriptions, 3), + modifyDate: modifyDate, + )), + _toExpect(''' +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core Test.SNAPSHOT"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmp:Rating="3" + xmp:MetadataDate="$xmpDate" + xmp:ModifyDate="$xmpDate" /> + </rdf:RDF> +</x:xmpmeta> +''')); + }); + + test('Set rating to XMP with subjects only', () async { + final modifyDate = DateTime.now(); + final xmpDate = XMP.toXmpDate(modifyDate); + + expect( + _toExpect(await XMP.edit( + inSubjects, + toolkit, + (descriptions) => ExtraAvesEntryMetadataEdition.editRatingXmp(descriptions, 3), + modifyDate: modifyDate, + )), + _toExpect(''' +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core Test.SNAPSHOT"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmp:Rating="3" + xmp:MetadataDate="$xmpDate" + xmp:ModifyDate="$xmpDate"> + <dc:subject> + <rdf:Bag> + <rdf:li>the king</rdf:li> + </rdf:Bag> + </dc:subject> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> +''')); + }); + + test('Remove rating from XMP with subjects only', () async { + final modifyDate = DateTime.now(); + + expect( + _toExpect(await XMP.edit( + inSubjects, + toolkit, + (descriptions) => ExtraAvesEntryMetadataEdition.editRatingXmp(descriptions, null), + modifyDate: modifyDate, + )), + _toExpect(inSubjects)); + }); + + test('Remove trailer media info from XMP with micro video', () async { + final modifyDate = DateTime.now(); + + expect( + _toExpect(await XMP.edit( + inMotionPhotoMicroVideo, + toolkit, + ExtraAvesEntryMetadataEdition.removeContainerXmp, + modifyDate: modifyDate, + )), + _toExpect(null)); + }); + + test('Remove trailer media info from XMP with container', () async { + final modifyDate = DateTime.now(); + + expect( + _toExpect(await XMP.edit( + inMotionPhotoContainer, + toolkit, + ExtraAvesEntryMetadataEdition.removeContainerXmp, + modifyDate: modifyDate, + )), + _toExpect(null)); + }); + + test('Remove trailer media info from XMP with no related metadata', () async { + final modifyDate = DateTime.now(); + + expect( + _toExpect(await XMP.edit( + inSubjects, + toolkit, + ExtraAvesEntryMetadataEdition.removeContainerXmp, + modifyDate: modifyDate, + )), + _toExpect(inSubjects)); + }); + + test('Remove rating from XMP with ratings (multiple descriptions)', () async { + final modifyDate = DateTime.now(); + + expect( + _toExpect(await XMP.edit( + inMultiDescriptionRatings, + toolkit, + (descriptions) => ExtraAvesEntryMetadataEdition.editRatingXmp(descriptions, null), + modifyDate: modifyDate, + )), + _toExpect(null)); + }); +} diff --git a/test_driver/common_test.dart b/test_driver/common_test.dart new file mode 100644 index 0000000..704c0b3 --- /dev/null +++ b/test_driver/common_test.dart @@ -0,0 +1,23 @@ +/* + This file is imported by driver test files. + It should not import, directly or indirectly, + `dart:ui`, `flutter/widgets.dart', etc. + */ + +const adbRoot = '/sdcard'; +const androidRoot = '/storage/emulated/0'; + +const shadersSourceDir = 'test_driver/assets/shaders/'; +const shadersTargetDirAdb = '$adbRoot/Pictures/Aves Test Driver/'; +const shadersTargetDirAndroid = '$androidRoot/Pictures/Aves Test Driver'; + +// Cover items should be: +// - dated in the future, +// - geotagged for each country to cover. +// Viewer items should be: +// - larger than screen, +// - located, +// - tagged (one tag only, so filter chips fit on one line). +const screenshotsSourceDir = 'test_driver/assets/screenshots/'; +const screenshotsTargetDirAdb = '$adbRoot/Pictures/TD/Aves/'; +const screenshotsTargetDirAndroid = '$androidRoot/Pictures/TD/Aves'; diff --git a/test_driver/driver_screenshots.dart b/test_driver/driver_screenshots.dart new file mode 100644 index 0000000..e815218 --- /dev/null +++ b/test_driver/driver_screenshots.dart @@ -0,0 +1,66 @@ +import 'package:aves/main_play.dart' as app; +import 'package:aves/model/filters/favourite.dart'; +import 'package:aves/model/settings/defaults.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/filter_grids/countries_page.dart'; +import 'package:aves_map/aves_map.dart'; +import 'package:aves_model/aves_model.dart'; +import 'package:flutter_driver/driver_extension.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() => configureAndLaunch(); + +Future<void> configureAndLaunch() async { + enableFlutterDriverExtension(); + await settings.init(monitorPlatformSettings: false, shouldSanitize: false); + settings + // app + ..hasAcceptedTerms = true + ..isInstalledAppAccessAllowed = true + ..isErrorReportingAllowed = false + ..setTileExtent(CollectionPage.routeName, 69) + ..setTileLayout(CollectionPage.routeName, TileLayout.mosaic) + ..setTileExtent(CountryListPage.routeName, 112) + ..setTileLayout(CountryListPage.routeName, TileLayout.grid) + // display + ..themeBrightness = AvesThemeBrightness.dark + ..themeColorMode = AvesThemeColorMode.polychrome + ..enableDynamicColor = false + ..enableBlurEffect = true + // navigation + ..keepScreenOn = KeepScreenOn.always + ..setHome(HomePageSetting.collection) + ..drawerTypeBookmarks = [null, FavouriteFilter.instance] + ..drawerAlbumBookmarks = null + ..bottomNavigationActions = SettingsDefaults.bottomNavigationActions + // collection + ..collectionSectionFactor = EntrySectionFactor.month + ..collectionSortFactor = EntrySortFactor.date + ..collectionBrowsingQuickActions = SettingsDefaults.collectionBrowsingQuickActions + ..showThumbnailFavourite = false + ..thumbnailLocationIcon = ThumbnailOverlayLocationIcon.none + ..thumbnailTagIcon = ThumbnailOverlayTagIcon.none + ..hiddenFilters = {} + // viewer + ..viewerQuickActions = SettingsDefaults.viewerQuickActions + ..showOverlayOnOpening = true + ..showOverlayMinimap = false + ..showOverlayZoomLevel = false + ..overlayHistogramStyle = OverlayHistogramStyle.none + ..showOverlayInfo = true + ..showOverlayDescription = false + ..showOverlayRatingTags = false + ..showOverlayShootingDetails = false + ..showOverlayThumbnailPreview = false + ..viewerUseCutout = true + // info + ..infoMapZoom = 13 + ..coordinateFormat = CoordinateFormat.dms + ..unitSystem = UnitSystem.metric + // map + ..mapStyle = EntryMapStyles.googleNormal + // debug + ..debugShowViewerTiles = false; + app.main(); +} diff --git a/test_driver/driver_screenshots_test.dart b/test_driver/driver_screenshots_test.dart new file mode 100644 index 0000000..a6c4e37 --- /dev/null +++ b/test_driver/driver_screenshots_test.dart @@ -0,0 +1,235 @@ +// ignore_for_file: avoid_print +import 'dart:async'; +import 'dart:io'; + +import 'package:aves/widgets/debug/app_debug_action.dart'; +import 'package:aves/widgets/settings/language/locales.dart'; +import 'package:flutter_driver/flutter_driver.dart'; +import 'package:test/test.dart'; + +import 'common_test.dart'; +import 'utils/adb_utils.dart'; +import 'utils/driver_extension.dart'; + +late FlutterDriver driver; +String _languageCode = ''; + +final languageCodes = SupportedLocales.languagesByLanguageCode.keys; +const outputDirectory = 'screenshots/raw'; + +void main() { + group('[Aves app]', () { + setUpAll(() async { + await Future.forEach(languageCodes, (languageCode) => Directory('$outputDirectory/$languageCode').create(recursive: true)); + + await copyContent(screenshotsSourceDir, screenshotsTargetDirAdb); + await Future.forEach<String>( + [ + 'deckers.thibault.aves.debug', + 'deckers.thibault.aves.profile', + ], + (package) => grantPermissions(package, [ + 'android.permission.READ_EXTERNAL_STORAGE', + 'android.permission.ACCESS_MEDIA_LOCATION', + ])); + driver = await FlutterDriver.connect(); + }); + + tearDownAll(() async { + await removeDirectory(screenshotsTargetDirAdb); + unawaited(driver.close()); + }); + + test('scan media dir', () async { + await driver.scanMediaDir(screenshotsTargetDirAndroid); + // recent heavy images may delay cataloguing because of thumbnail loading precedence + // so we wait enough to avoid cataloguing progress subtitle in app bar when taking screenshots + await Future.delayed(const Duration(seconds: 40)); + }, timeout: const Timeout(Duration(minutes: 1))); + + languageCodes.forEach((languageCode) { + setLanguage(languageCode); + configureCollectionVisibility(AppDebugAction.prepScreenshotThumbnails); + collection(); + configureCollectionVisibility(AppDebugAction.prepScreenshotStats); + viewer(); + info(); + stats(); + configureCollectionVisibility(AppDebugAction.prepScreenshotCountries); + countries(); + map(); + }); + }, timeout: const Timeout(Duration(seconds: 30))); +} + +Future<void> _search(String query, String chipKey) async { + await driver.tapKeyAndWait('menu-searchCollection'); + await driver.tap(find.byType('TextField')); + await driver.enterText(query); + await driver.tapKeyAndWait(chipKey); +} + +Future<void> _selectMapStyle(String styleKey) async { + await driver.tapKeyAndWait('map-menu-layers'); + await driver.tapKeyAndWait(styleKey); + + // tiles may take time to load + await Future.delayed(const Duration(seconds: 5)); +} + +Future<void> _takeScreenshot(FlutterDriver driver, String name) async { + final pixels = await driver.screenshot(); + final file = File('$outputDirectory/$_languageCode/$name.png'); + await file.writeAsBytes(pixels); + print('* saved screenshot to ${file.path}'); +} + +void setLanguage(String languageCode) { + test('set language', () async { + await driver.tapKeyAndWait('appbar-leading-button'); + await driver.tapKeyAndWait('drawer-settings-button'); + await driver.tapKeyAndWait('section-language'); + await driver.tapKeyAndWait('tile-language'); + + final name = SupportedLocales.languagesByLanguageCode[languageCode] ?? languageCode; + await driver.tap(find.byType('TextField')); + await driver.enterText(name); + + await driver.tapKeyAndWait(languageCode); + _languageCode = languageCode; + + await pressDeviceBackButton(); + await driver.waitUntilNoTransientCallbacks(); + }); +} + +void configureCollectionVisibility(AppDebugAction action) { + test('configure collection visibility', () async { + await driver.tapKeyAndWait('appbar-leading-button'); + final verticalPageView = find.byValueKey('drawer-scrollview'); + await driver.scrollY(verticalPageView, -600); + await driver.tapKeyAndWait('drawer-debug'); + + await driver.tapKeyAndWait('appbar-menu-button'); + await driver.tapKeyAndWait('menu-${action.name}'); + + await pressDeviceBackButton(); + await driver.waitUntilNoTransientCallbacks(); + }); +} + +void collection() { + test('1. Collection', () async { + await driver.tapKeyAndWait('appbar-leading-button'); + await driver.tapKeyAndWait('drawer-type-favourite-false'); + await _search('birds', 'tag-false-birds'); + await _search('South Korea', 'tag-false-South Korea'); + + await _takeScreenshot(driver, '1'); + }); +} + +void viewer() { + test('2. Viewer', () async { + await driver.tapKeyAndWait('appbar-leading-button'); + await driver.tapKeyAndWait('drawer-type-null'); + + await _search('viewer', 'album-false-$screenshotsTargetDirAndroid/viewer'); + + // delay to avoid flaky descendant resolution + await Future.delayed(const Duration(seconds: 2)); + await driver.tap(find.descendant( + of: find.byValueKey('collection-grid'), + matching: find.byType('MetaData'), + firstMatchOnly: true, + )); + await driver.waitUntilNoTransientCallbacks(); + await Future.delayed(const Duration(seconds: 2)); + + final imageView = find.byValueKey('image_view'); + await driver.doubleTap(imageView); + await Future.delayed(const Duration(seconds: 1)); + + await _takeScreenshot(driver, '2'); + }); +} + +void info() { + test('3. Info (basic), 4. Info (metadata)', () async { + final verticalPageView = find.byValueKey('vertical-pageview'); + + await driver.scrollY(verticalPageView, -600); + await _selectMapStyle('googleNormal'); + await Future.delayed(const Duration(seconds: 2)); + + await _takeScreenshot(driver, '3'); + + await driver.scrollY(verticalPageView, -680); + await Future.delayed(const Duration(seconds: 1)); + + final gpsTile = find.descendant( + of: find.byValueKey('tilecard-GPS'), + matching: find.byType('ListTile'), + ); + await driver.tap(gpsTile); + await driver.waitUntilNoTransientCallbacks(); + + await _takeScreenshot(driver, '4'); + + await pressDeviceBackButton(); + await driver.waitUntilNoTransientCallbacks(); + + await pressDeviceBackButton(); + await driver.waitUntilNoTransientCallbacks(); + }); +} + +void stats() { + test('5. Stats', () async { + await driver.tapKeyAndWait('appbar-leading-button'); + await driver.tapKeyAndWait('drawer-type-null'); + + final maxYear = DateTime.now().year + 1; + final maxQuery = 'year<$maxYear'; + const minQuery = 'year>2005'; + await _search(maxQuery, 'query-false-$maxQuery'); + await _search(minQuery, 'query-false-$minQuery'); + + await driver.tapKeyAndWait('appbar-menu-button'); + await driver.tapKeyAndWait('menu-stats'); + + await _takeScreenshot(driver, '5'); + + await pressDeviceBackButton(); + await driver.waitUntilNoTransientCallbacks(); + }); +} + +void countries() { + test('6. Countries', () async { + await driver.tapKeyAndWait('appbar-leading-button'); + await driver.tapKeyAndWait('drawer-page-/countries'); + + await _takeScreenshot(driver, '6'); + }); +} + +void map() { + test('7. Map', () async { + await driver.tapKeyAndWait('appbar-leading-button'); + await driver.tapKeyAndWait('drawer-type-null'); + + await _search('animals', 'tag-false-animals'); + await _search('Singapore', 'location-false-LocationLevel.country-SG-Singapore'); + + await driver.tapKeyAndWait('appbar-menu-button'); + await driver.tapKeyAndWait('menu-map'); + + await _selectMapStyle('googleTerrain'); + + await _takeScreenshot(driver, '7'); + + await pressDeviceBackButton(); + await driver.waitUntilNoTransientCallbacks(); + }); +} diff --git a/test_driver/utils/adb_utils.dart b/test_driver/utils/adb_utils.dart new file mode 100644 index 0000000..8d86ab5 --- /dev/null +++ b/test_driver/utils/adb_utils.dart @@ -0,0 +1,49 @@ +import 'dart:io'; + +import 'package:path/path.dart' as p; + +String get adb { + if (Platform.isWindows) { + final env = Platform.environment; + // e.g. C:\Users\<username>\AppData\Local\Android\Sdk + final sdkDir = env['ANDROID_SDK_ROOT'] ?? env['ANDROID_SDK']!; + return p.join(sdkDir, 'platform-tools', 'adb.exe'); + } + return 'adb'; +} + +/* + If there's only one emulator running or only one device connected, + the adb command is sent to that device by default. + If multiple emulators are running and/or multiple devices are attached, + you need to use the -d, -e, or -s option to specify the target device + to which the command should be directed. + */ +const List<String> adbDeviceParam = ['-d']; // `[]`, `['-d']`, `['-e']`, or `['-s', <serial_number>]` + +Future<void> runAdb(List<String> args) async { + await Process.run(adb, [...adbDeviceParam, ...args]); +} + +Future<void> createDirectory(String dir) async { + await runAdb(['shell', 'mkdir', '-p', dir.replaceAll(' ', '\\ ')]); +} + +Future<void> removeDirectory(String dir) async { + await runAdb(['shell', 'rm', '-r', dir.replaceAll(' ', '\\ ')]); +} + +Future<void> copyContent(String sourceDir, String targetDir) async { + // to copy the content of `source` inside `target` + // `push source/* target/` works only when the target directory exists, and fails when `target` contains spaces + // `push source/ target/` works only when the target directory does not exist + await removeDirectory(targetDir); + await runAdb(['push', sourceDir, targetDir]); +} + +// only works in debug mode +Future<void> grantPermissions(String packageName, Iterable<String> permissions) async { + await Future.forEach<String>(permissions, (permission) => runAdb(['shell', 'pm', 'grant', packageName, permission])); +} + +Future<void> pressDeviceBackButton() => runAdb(['shell', 'input', 'keyevent', 'KEYCODE_BACK']); diff --git a/test_driver/utils/driver_extension.dart b/test_driver/utils/driver_extension.dart new file mode 100644 index 0000000..87b4bfb --- /dev/null +++ b/test_driver/utils/driver_extension.dart @@ -0,0 +1,49 @@ +// ignore_for_file: avoid_print +import 'package:aves/widgets/debug/app_debug_action.dart'; +import 'package:flutter_driver/flutter_driver.dart'; + +import 'adb_utils.dart'; + +extension ExtraFlutterDriver on FlutterDriver { + static const doubleTapDelay = Duration(milliseconds: 100); // in [kDoubleTapMinTime = 40 ms, kDoubleTapTimeout = 300 ms] + + // scrolling is ineffective when duration is too short for the spatial delta + Future<void> scrollX(SerializableFinder finder, double dx) => scroll(finder, dx, 0, Duration(milliseconds: dx.toInt().abs() * 2)); + + // scrolling is ineffective when duration is too short for the spatial delta + Future<void> scrollY(SerializableFinder finder, double dy) => scroll(finder, 0, dy, Duration(milliseconds: dy.toInt().abs() * 2)); + + Future<void> doubleTap(SerializableFinder finder, {Duration? timeout}) async { + await tap(finder, timeout: timeout); + await Future.delayed(doubleTapDelay); + await tap(finder, timeout: timeout); + } + + Future<void> tapKeyAndWait(String key, {bool waitUntilNoTransient = true}) async { + print(' find key=$key'); + final finder = find.byValueKey(key); + await waitFor(finder); + await tap(finder); + if (waitUntilNoTransient) { + await waitUntilNoTransientCallbacks(); + } + } + + Future<void> scanMediaDir(String dir) async { + await tapKeyAndWait('appbar-leading-button'); + await scroll(find.byValueKey('drawer-settings-button'), 0, -500, const Duration(milliseconds: 500)); + await tapKeyAndWait('drawer-debug'); + + await tapKeyAndWait('appbar-menu-button'); + await tapKeyAndWait('menu-${AppDebugAction.mediaStoreScanDir.name}'); + + await tap(find.byType('TextField')); + await enterText(dir); + + await tap(find.byType('TextButton')); + await waitUntilNoTransientCallbacks(); + + await pressDeviceBackButton(); + await waitUntilNoTransientCallbacks(); + } +} diff --git a/whatsnew/whatsnew-en-US b/whatsnew/whatsnew-en-US new file mode 100644 index 0000000..7015092 --- /dev/null +++ b/whatsnew/whatsnew-en-US @@ -0,0 +1,5 @@ +In v1.14.0: +- stat export +- regex search +- predictive back gesture +Full changelog available on GitHub \ No newline at end of file